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PVtdO2xldCBhcHBsaWNhdGlvbkRlc2NyaXB0b3I7Y29uc3QgX2xvYWRlZFNjcmlwdHM9e307Zm9yKGNvbnN0IGsgb2ZbXSl7fQooZnVuY3Rpb24oKXtjb25zdCBiYXNlVXJsPXNlbGYubG9jYXRpb24/c2VsZi5sb2NhdGlvbi5vcmlnaW4rc2VsZi5sb2NhdGlvbi5wYXRobmFtZTonJztzZWxmLl9pbXBvcnRTY3JpcHRQYXRoUHJlZml4PWJhc2VVcmwuc3Vic3RyaW5nKDAsYmFzZVVybC5sYXN0SW5kZXhPZignLycpKzEpO30pKCk7Y29uc3QgUkVNT1RFX01PRFVMRV9GQUxMQkFDS19SRVZJU0lPTj0nQDAxMGRkY2ZkYTI0Njk3NWQxOTQ5NjRjY2YyMDAzOGViYmRlYzYwODQnO3ZhciBSdW50aW1lPWNsYXNze2NvbnN0cnVjdG9yKGRlc2NyaXB0b3JzKXt0aGlzLl9tb2R1bGVzPVtdO3RoaXMuX21vZHVsZXNNYXA9e307dGhpcy5fZXh0ZW5zaW9ucz1bXTt0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlcz17fTt0aGlzLl9kZXNjcmlwdG9yc01hcD17fTtmb3IobGV0IGk9MDtpPGRlc2NyaXB0b3JzLmxlbmd0aDsrK2kpCnRoaXMuX3JlZ2lzdGVyTW9kdWxlKGRlc2NyaXB0b3JzW2ldKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2soKTt9CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlKHVybCl7cmV0dXJuIG5ldyBQcm9taXNlKGxvYWQpO2Z1bmN0aW9uIGxvYWQoZnVsZmlsbCxyZWplY3Qpe2NvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIub3BlbignR0VUJyx1cmwsdHJ1ZSk7eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1vbnJlYWR5c3RhdGVjaGFuZ2U7ZnVuY3Rpb24gb25yZWFkeXN0YXRlY2hhbmdlKGUpe2lmKHhoci5yZWFkeVN0YXRlIT09WE1MSHR0cFJlcXVlc3QuRE9ORSkKcmV0dXJuO2NvbnN0IHN0YXR1cz0vXkhUVFBcLzEuMSA0MDQvLnRlc3QoZS50YXJnZXQucmVzcG9uc2UpPzQwNDp4aHIuc3RhdHVzO2lmKFswLDIwMCwzMDRdLmluZGV4T2Yoc3RhdHVzKT09PS0xKQpyZWplY3QobmV3IEVycm9yKCdXaGlsZSBsb2FkaW5nIGZyb20gdXJsICcrdXJsKycgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIG9mICcrc3RhdHVzKSk7ZWxzZQpmdWxmaWxsKGUudGFyZ2V0LnJlc3BvbnNlKTt9Cnhoci5zZW5kKG51bGwpO319CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHVybCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLmNhdGNoKGVycj0+e2NvbnN0IHVybFdpdGhGYWxsYmFja1ZlcnNpb249dXJsLnJlcGxhY2UoL0BbMC05YS1mXXs0MH0vLFJFTU9URV9NT0RVTEVfRkFMTEJBQ0tfUkVWSVNJT04pO2lmKHVybFdpdGhGYWxsYmFja1ZlcnNpb249PT11cmx8fCF1cmwuaW5jbHVkZXMoJ2F1ZGl0czJfd29ya2VyX21vZHVsZScpKQp0aHJvdyBlcnI7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmxXaXRoRmFsbGJhY2tWZXJzaW9uKTt9KTt9CnN0YXRpYyBub3JtYWxpemVQYXRoKHBhdGgpe2lmKHBhdGguaW5kZXhPZignLi4nKT09PS0xJiZwYXRoLmluZGV4T2YoJy4nKT09PS0xKQpyZXR1cm4gcGF0aDtjb25zdCBub3JtYWxpemVkU2VnbWVudHM9W107Y29uc3Qgc2VnbWVudHM9cGF0aC5zcGxpdCgnLycpO2ZvcihsZXQgaT0wO2k8c2VnbWVudHMubGVuZ3RoO2krKyl7Y29uc3Qgc2VnbWVudD1zZWdtZW50c1tpXTtpZihzZWdtZW50PT09Jy4nKQpjb250aW51ZTtlbHNlIGlmKHNlZ21lbnQ9PT0nLi4nKQpub3JtYWxpemVkU2VnbWVudHMucG9wKCk7ZWxzZSBpZihzZWdtZW50KQpub3JtYWxpemVkU2VnbWVudHMucHVzaChzZWdtZW50KTt9CmxldCBub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkU2VnbWVudHMuam9pbignLycpO2lmKG5vcm1hbGl6ZWRQYXRoW25vcm1hbGl6ZWRQYXRoLmxlbmd0aC0xXT09PScvJykKcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO2lmKHBhdGhbMF09PT0nLycmJm5vcm1hbGl6ZWRQYXRoKQpub3JtYWxpemVkUGF0aD0nLycrbm9ybWFsaXplZFBhdGg7aWYoKHBhdGhbcGF0aC5sZW5ndGgtMV09PT0nLycpfHwoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdPT09Jy4nKXx8KHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aC0xXT09PScuLicpKQpub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkUGF0aCsnLyc7cmV0dXJuIG5vcm1hbGl6ZWRQYXRoO30Kc3RhdGljIF9sb2FkU2NyaXB0c1Byb21pc2Uoc2NyaXB0TmFtZXMsYmFzZSl7Y29uc3QgcHJvbWlzZXM9W107Y29uc3QgdXJscz1bXTtjb25zdCBzb3VyY2VzPW5ldyBBcnJheShzY3JpcHROYW1lcy5sZW5ndGgpO2xldCBzY3JpcHRUb0V2YWw9MDtmb3IobGV0IGk9MDtpPHNjcmlwdE5hbWVzLmxlbmd0aDsrK2kpe2NvbnN0IHNjcmlwdE5hbWU9c2NyaXB0TmFtZXNbaV07bGV0IHNvdXJjZVVSTD0oYmFzZXx8c2VsZi5faW1wb3J0U2NyaXB0UGF0aFByZWZpeCkrc2NyaXB0TmFtZTtjb25zdCBzY2hlbWFJbmRleD1zb3VyY2VVUkwuaW5kZXhPZignOi8vJykrMztsZXQgcGF0aEluZGV4PXNvdXJjZVVSTC5pbmRleE9mKCcvJyxzY2hlbWFJbmRleCk7aWYocGF0aEluZGV4PT09LTEpCnBhdGhJbmRleD1zb3VyY2VVUkwubGVuZ3RoO3NvdXJjZVVSTD1zb3VyY2VVUkwuc3Vic3RyaW5nKDAscGF0aEluZGV4KStSdW50aW1lLm5vcm1hbGl6ZVBhdGgoc291cmNlVVJMLnN1YnN0cmluZyhwYXRoSW5kZXgpKTtpZihfbG9hZGVkU2NyaXB0c1tzb3VyY2VVUkxdKQpjb250aW51ZTt1cmxzLnB1c2goc291cmNlVVJMKTtjb25zdCBsb2FkUmVzb3VyY2VQcm9taXNlPWJhc2U/UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHNvdXJjZVVSTCk6UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHNvdXJjZVVSTCk7cHJvbWlzZXMucHVzaChsb2FkUmVzb3VyY2VQcm9taXNlLnRoZW4oc2NyaXB0U291cmNlTG9hZGVkLmJpbmQobnVsbCxpKSxzY3JpcHRTb3VyY2VMb2FkZWQuYmluZChudWxsLGksdW5kZWZpbmVkKSkpO30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHVuZGVmaW5lZCk7ZnVuY3Rpb24gc2NyaXB0U291cmNlTG9hZGVkKHNjcmlwdE51bWJlcixzY3JpcHRTb3VyY2Upe3NvdXJjZXNbc2NyaXB0TnVtYmVyXT1zY3JpcHRTb3VyY2V8fCcnO3doaWxlKHR5cGVvZiBzb3VyY2VzW3NjcmlwdFRvRXZhbF0hPT0ndW5kZWZpbmVkJyl7ZXZhbHVhdGVTY3JpcHQodXJsc1tzY3JpcHRUb0V2YWxdLHNvdXJjZXNbc2NyaXB0VG9FdmFsXSk7KytzY3JpcHRUb0V2YWw7fX0KZnVuY3Rpb24gZXZhbHVhdGVTY3JpcHQoc291cmNlVVJMLHNjcmlwdFNvdXJjZSl7X2xvYWRlZFNjcmlwdHNbc291cmNlVVJMXT10cnVlO2lmKCFzY3JpcHRTb3VyY2Upe2NvbnNvbGUuZXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGFycml2ZWQgZm9yIHNjcmlwdCBcJycrc291cmNlVVJMKydcJycpO3JldHVybjt9CnNlbGYuZXZhbChzY3JpcHRTb3VyY2UrJ1xuLy8jIHNvdXJjZVVSTD0nK3NvdXJjZVVSTCk7fX0Kc3RhdGljIF9sb2FkUmVzb3VyY2VJbnRvQ2FjaGUodXJsLGFwcGVuZFNvdXJjZVVSTCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLnRoZW4oY2FjaGVSZXNvdXJjZS5iaW5kKHRoaXMsdXJsKSxjYWNoZVJlc291cmNlLmJpbmQodGhpcyx1cmwsdW5kZWZpbmVkKSk7ZnVuY3Rpb24gY2FjaGVSZXNvdXJjZShwYXRoLGNvbnRlbnQpe2lmKCFjb250ZW50KXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCByZXNvdXJjZTogJytwYXRoKTtyZXR1cm47fQpjb25zdCBzb3VyY2VVUkw9YXBwZW5kU291cmNlVVJMP1J1bnRpbWUucmVzb2x2ZVNvdXJjZVVSTChwYXRoKTonJztSdW50aW1lLmNhY2hlZFJlc291cmNlc1twYXRoXT1jb250ZW50K3NvdXJjZVVSTDt9fQpzdGF0aWMgYXN5bmMgcnVudGltZVJlYWR5KCl7cmV0dXJuIFJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2U7fQpzdGF0aWMgYXN5bmMgc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKXtjb25zb2xlLnRpbWVTdGFtcCgnUnVudGltZS5zdGFydEFwcGxpY2F0aW9uJyk7Y29uc3QgYWxsRGVzY3JpcHRvcnNCeU5hbWU9e307Zm9yKGxldCBpPTA7aTxhbGxEZXNjcmlwdG9ycy5sZW5ndGg7KytpKXtjb25zdCBkPWFsbERlc2NyaXB0b3JzW2ldO2FsbERlc2NyaXB0b3JzQnlOYW1lW2RbJ25hbWUnXV09ZDt9CmlmKCFhcHBsaWNhdGlvbkRlc2NyaXB0b3Ipe2xldCBkYXRhPWF3YWl0IFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShhcHBOYW1lKycuanNvbicpO2FwcGxpY2F0aW9uRGVzY3JpcHRvcj1KU09OLnBhcnNlKGRhdGEpO2xldCBkZXNjcmlwdG9yPWFwcGxpY2F0aW9uRGVzY3JpcHRvcjt3aGlsZShkZXNjcmlwdG9yLmV4dGVuZHMpe2RhdGE9YXdhaXQgUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKGRlc2NyaXB0b3IuZXh0ZW5kcysnLmpzb24nKTtkZXNjcmlwdG9yPUpTT04ucGFyc2UoZGF0YSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXM9ZGVzY3JpcHRvci5tb2R1bGVzLmNvbmNhdChhcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcyk7fX0KY29uc3QgY29uZmlndXJhdGlvbj1hcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcztjb25zdCBtb2R1bGVKU09OUHJvbWlzZXM9W107Y29uc3QgY29yZU1vZHVsZU5hbWVzPVtdO2ZvcihsZXQgaT0wO2k8Y29uZmlndXJhdGlvbi5sZW5ndGg7KytpKXtjb25zdCBkZXNjcmlwdG9yPWNvbmZpZ3VyYXRpb25baV07Y29uc3QgbmFtZT1kZXNjcmlwdG9yWyduYW1lJ107Y29uc3QgbW9kdWxlSlNPTj1hbGxEZXNjcmlwdG9yc0J5TmFtZVtuYW1lXTtpZihtb2R1bGVKU09OKQptb2R1bGVKU09OUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUobW9kdWxlSlNPTikpO2Vsc2UKbW9kdWxlSlNPTlByb21pc2VzLnB1c2goUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKG5hbWUrJy9tb2R1bGUuanNvbicpLnRoZW4oSlNPTi5wYXJzZS5iaW5kKEpTT04pKSk7aWYoZGVzY3JpcHRvclsndHlwZSddPT09J2F1dG9zdGFydCcpCmNvcmVNb2R1bGVOYW1lcy5wdXNoKG5hbWUpO30KY29uc3QgbW9kdWxlRGVzY3JpcHRvcnM9YXdhaXQgUHJvbWlzZS5hbGwobW9kdWxlSlNPTlByb21pc2VzKTtmb3IobGV0IGk9MDtpPG1vZHVsZURlc2NyaXB0b3JzLmxlbmd0aDsrK2kpe21vZHVsZURlc2NyaXB0b3JzW2ldLm5hbWU9Y29uZmlndXJhdGlvbltpXVsnbmFtZSddO21vZHVsZURlc2NyaXB0b3JzW2ldLmNvbmRpdGlvbj1jb25maWd1cmF0aW9uW2ldWydjb25kaXRpb24nXTttb2R1bGVEZXNjcmlwdG9yc1tpXS5yZW1vdGU9Y29uZmlndXJhdGlvbltpXVsndHlwZSddPT09J3JlbW90ZSc7fQpzZWxmLnJ1bnRpbWU9bmV3IFJ1bnRpbWUobW9kdWxlRGVzY3JpcHRvcnMpO2lmKGNvcmVNb2R1bGVOYW1lcykKcmV0dXJuKHNlbGYucnVudGltZS5fbG9hZEF1dG9TdGFydE1vZHVsZXMoY29yZU1vZHVsZU5hbWVzKSk7fQpzdGF0aWMgc3RhcnRXb3JrZXIoYXBwTmFtZSl7cmV0dXJuIFJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKS50aGVuKHNlbmRXb3JrZXJSZWFkeSk7ZnVuY3Rpb24gc2VuZFdvcmtlclJlYWR5KCl7c2VsZi5wb3N0TWVzc2FnZSgnd29ya2VyUmVhZHknKTt9fQpzdGF0aWMgcXVlcnlQYXJhbShuYW1lKXtyZXR1cm4gUnVudGltZS5fcXVlcnlQYXJhbXNPYmplY3RbbmFtZV18fG51bGw7fQpzdGF0aWMgcXVlcnlQYXJhbXNTdHJpbmcoKXtyZXR1cm4gbG9jYXRpb24uc2VhcmNoO30Kc3RhdGljIF9leHBlcmltZW50c1NldHRpbmcoKXt0cnl7cmV0dXJuKEpTT04ucGFyc2Uoc2VsZi5sb2NhbFN0b3JhZ2UmJnNlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddP3NlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddOid7fScpKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIGxvY2FsU3RvcmFnZVtcJ2V4cGVyaW1lbnRzXCddJyk7cmV0dXJue307fX0Kc3RhdGljIF9hc3NlcnQodmFsdWUsbWVzc2FnZSl7aWYodmFsdWUpCnJldHVybjtSdW50aW1lLl9vcmlnaW5hbEFzc2VydC5jYWxsKFJ1bnRpbWUuX2NvbnNvbGUsdmFsdWUsbWVzc2FnZSsnICcrbmV3IEVycm9yKCkuc3RhY2spO30Kc3RhdGljIHNldFBsYXRmb3JtKHBsYXRmb3JtKXtSdW50aW1lLl9wbGF0Zm9ybT1wbGF0Zm9ybTt9CnN0YXRpYyBfaXNEZXNjcmlwdG9yRW5hYmxlZChkZXNjcmlwdG9yKXtjb25zdCBhY3RpdmF0b3JFeHBlcmltZW50PWRlc2NyaXB0b3JbJ2V4cGVyaW1lbnQnXTtpZihhY3RpdmF0b3JFeHBlcmltZW50PT09JyonKQpyZXR1cm4gUnVudGltZS5leHBlcmltZW50cy5zdXBwb3J0RW5hYmxlZCgpO2lmKGFjdGl2YXRvckV4cGVyaW1lbnQmJmFjdGl2YXRvckV4cGVyaW1lbnQuc3RhcnRzV2l0aCgnIScpJiZSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50LnN1YnN0cmluZygxKSkpCnJldHVybiBmYWxzZTtpZihhY3RpdmF0b3JFeHBlcmltZW50JiYhYWN0aXZhdG9yRXhwZXJpbWVudC5zdGFydHNXaXRoKCchJykmJiFSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50KSkKcmV0dXJuIGZhbHNlO2NvbnN0IGNvbmRpdGlvbj1kZXNjcmlwdG9yWydjb25kaXRpb24nXTtpZihjb25kaXRpb24mJiFjb25kaXRpb24uc3RhcnRzV2l0aCgnIScpJiYhUnVudGltZS5xdWVyeVBhcmFtKGNvbmRpdGlvbikpCnJldHVybiBmYWxzZTtpZihjb25kaXRpb24mJmNvbmRpdGlvbi5zdGFydHNXaXRoKCchJykmJlJ1bnRpbWUucXVlcnlQYXJhbShjb25kaXRpb24uc3Vic3RyaW5nKDEpKSkKcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO30Kc3RhdGljIHJlc29sdmVTb3VyY2VVUkwocGF0aCl7bGV0IHNvdXJjZVVSTD1zZWxmLmxvY2F0aW9uLmhyZWY7aWYoc2VsZi5sb2NhdGlvbi5zZWFyY2gpCnNvdXJjZVVSTD1zb3VyY2VVUkwucmVwbGFjZShzZWxmLmxvY2F0aW9uLnNlYXJjaCwnJyk7c291cmNlVVJMPXNvdXJjZVVSTC5zdWJzdHJpbmcoMCxzb3VyY2VVUkwubGFzdEluZGV4T2YoJy8nKSsxKStwYXRoO3JldHVybidcbi8qIyBzb3VyY2VVUkw9Jytzb3VyY2VVUkwrJyAqLyc7fQp1c2VUZXN0QmFzZSgpe1J1bnRpbWUuX3JlbW90ZUJhc2U9J2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9pbnNwZWN0b3Itc291cmNlcy8nO2lmKFJ1bnRpbWUucXVlcnlQYXJhbSgnZGVidWdGcm9udGVuZCcpKQpSdW50aW1lLl9yZW1vdGVCYXNlKz0nZGVidWcvJzt9Cl9yZWdpc3Rlck1vZHVsZShkZXNjcmlwdG9yKXtjb25zdCBtb2R1bGU9bmV3IFJ1bnRpbWUuTW9kdWxlKHRoaXMsZGVzY3JpcHRvcik7dGhpcy5fbW9kdWxlcy5wdXNoKG1vZHVsZSk7dGhpcy5fbW9kdWxlc01hcFtkZXNjcmlwdG9yWyduYW1lJ11dPW1vZHVsZTt9CmxvYWRNb2R1bGVQcm9taXNlKG1vZHVsZU5hbWUpe3JldHVybiB0aGlzLl9tb2R1bGVzTWFwW21vZHVsZU5hbWVdLl9sb2FkUHJvbWlzZSgpO30KX2xvYWRBdXRvU3RhcnRNb2R1bGVzKG1vZHVsZU5hbWVzKXtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPG1vZHVsZU5hbWVzLmxlbmd0aDsrK2kpCnByb21pc2VzLnB1c2godGhpcy5sb2FkTW9kdWxlUHJvbWlzZShtb2R1bGVOYW1lc1tpXSkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fQpfY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixwcmVkaWNhdGUpe2lmKCFwcmVkaWNhdGUpCnJldHVybiBmYWxzZTtjb25zdCBjb250ZXh0VHlwZXM9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKS5jb250ZXh0VHlwZXM7aWYoIWNvbnRleHRUeXBlcykKcmV0dXJuIHRydWU7Zm9yKGxldCBpPTA7aTxjb250ZXh0VHlwZXMubGVuZ3RoOysraSl7Y29uc3QgY29udGV4dFR5cGU9dGhpcy5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pO2NvbnN0IGlzTWF0Y2hpbmc9ISFjb250ZXh0VHlwZSYmcHJlZGljYXRlKGNvbnRleHRUeXBlKTtpZihpc01hdGNoaW5nKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dChleHRlbnNpb24sY29udGV4dCl7aWYoIWNvbnRleHQpCnJldHVybiB0cnVlO3JldHVybiB0aGlzLl9jaGVja0V4dGVuc2lvbkFwcGxpY2FiaWxpdHkoZXh0ZW5zaW9uLGlzSW5zdGFuY2VPZik7ZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHRhcmdldFR5cGUpe3JldHVybiBjb250ZXh0IGluc3RhbmNlb2YgdGFyZ2V0VHlwZTt9fQppc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHRUeXBlcyhleHRlbnNpb24sY3VycmVudENvbnRleHRUeXBlcyl7aWYoIWV4dGVuc2lvbi5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixjdXJyZW50Q29udGV4dFR5cGVzP2lzQ29udGV4dFR5cGVLbm93bjpudWxsKTtmdW5jdGlvbiBpc0NvbnRleHRUeXBlS25vd24odGFyZ2V0VHlwZSl7cmV0dXJuIGN1cnJlbnRDb250ZXh0VHlwZXMuaGFzKHRhcmdldFR5cGUpO319CmV4dGVuc2lvbnModHlwZSxjb250ZXh0LHNvcnRCeVRpdGxlKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9ucy5maWx0ZXIoZmlsdGVyKS5zb3J0KHNvcnRCeVRpdGxlP3RpdGxlQ29tcGFyYXRvcjpvcmRlckNvbXBhcmF0b3IpO2Z1bmN0aW9uIGZpbHRlcihleHRlbnNpb24pe2lmKGV4dGVuc2lvbi5fdHlwZSE9PXR5cGUmJmV4dGVuc2lvbi5fdHlwZUNsYXNzKCkhPT10eXBlKQpyZXR1cm4gZmFsc2U7aWYoIWV4dGVuc2lvbi5lbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hY29udGV4dHx8ZXh0ZW5zaW9uLmlzQXBwbGljYWJsZShjb250ZXh0KTt9CmZ1bmN0aW9uIG9yZGVyQ29tcGFyYXRvcihleHRlbnNpb24xLGV4dGVuc2lvbjIpe2NvbnN0IG9yZGVyMT1leHRlbnNpb24xLmRlc2NyaXB0b3IoKVsnb3JkZXInXXx8MDtjb25zdCBvcmRlcjI9ZXh0ZW5zaW9uMi5kZXNjcmlwdG9yKClbJ29yZGVyJ118fDA7cmV0dXJuIG9yZGVyMS1vcmRlcjI7fQpmdW5jdGlvbiB0aXRsZUNvbXBhcmF0b3IoZXh0ZW5zaW9uMSxleHRlbnNpb24yKXtjb25zdCB0aXRsZTE9ZXh0ZW5zaW9uMS50aXRsZSgpfHwnJztjb25zdCB0aXRsZTI9ZXh0ZW5zaW9uMi50aXRsZSgpfHwnJztyZXR1cm4gdGl0bGUxLmxvY2FsZUNvbXBhcmUodGl0bGUyKTt9fQpleHRlbnNpb24odHlwZSxjb250ZXh0KXtyZXR1cm4gdGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dClbMF18fG51bGw7fQphbGxJbnN0YW5jZXModHlwZSxjb250ZXh0KXtyZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dCkubWFwKGV4dGVuc2lvbj0+ZXh0ZW5zaW9uLmluc3RhbmNlKCkpKTt9Cl9yZXNvbHZlKHR5cGVOYW1lKXtpZighdGhpcy5fY2FjaGVkVHlwZUNsYXNzZXNbdHlwZU5hbWVdKXtjb25zdCBwYXRoPXR5cGVOYW1lLnNwbGl0KCcuJyk7bGV0IG9iamVjdD1zZWxmO2ZvcihsZXQgaT0wO29iamVjdCYmKGk8cGF0aC5sZW5ndGgpOysraSkKb2JqZWN0PW9iamVjdFtwYXRoW2ldXTtpZihvYmplY3QpCnRoaXMuX2NhY2hlZFR5cGVDbGFzc2VzW3R5cGVOYW1lXT0ob2JqZWN0KTt9CnJldHVybiB0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlc1t0eXBlTmFtZV18fG51bGw7fQpzaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihSdW50aW1lLl9pbnN0YW5jZVN5bWJvbCBpbiBjb25zdHJ1Y3RvckZ1bmN0aW9uJiZPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbnN0cnVjdG9yRnVuY3Rpb24pLmluY2x1ZGVzKFJ1bnRpbWUuX2luc3RhbmNlU3ltYm9sKSkKcmV0dXJuIGNvbnN0cnVjdG9yRnVuY3Rpb25bUnVudGltZS5faW5zdGFuY2VTeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltSdW50aW1lLl9pbnN0YW5jZVN5bWJvbF09aW5zdGFuY2U7cmV0dXJuIGluc3RhbmNlO319O1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0PXtfX3Byb3RvX186bnVsbH07UnVudGltZS5faW5zdGFuY2VTeW1ib2w9U3ltYm9sKCdpbnN0YW5jZScpO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzPXtfX3Byb3RvX186bnVsbH07UnVudGltZS5fY29uc29sZT1jb25zb2xlO1J1bnRpbWUuX29yaWdpbmFsQXNzZXJ0PWNvbnNvbGUuYXNzZXJ0O1J1bnRpbWUuX3BsYXRmb3JtPScnO1J1bnRpbWUuTW9kdWxlRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubmFtZTt0aGlzLmV4dGVuc2lvbnM7dGhpcy5kZXBlbmRlbmNpZXM7dGhpcy5zY3JpcHRzO3RoaXMuY29uZGl0aW9uO3RoaXMucmVtb3RlO319O1J1bnRpbWUuRXh0ZW5zaW9uRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZTt0aGlzLmNsYXNzTmFtZTt0aGlzLmZhY3RvcnlOYW1lO3RoaXMuY29udGV4dFR5cGVzO319O1J1bnRpbWUuTW9kdWxlPWNsYXNze2NvbnN0cnVjdG9yKG1hbmFnZXIsZGVzY3JpcHRvcil7dGhpcy5fbWFuYWdlcj1tYW5hZ2VyO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl9uYW1lPWRlc2NyaXB0b3IubmFtZTt0aGlzLl9leHRlbnNpb25zPVtdO3RoaXMuX2V4dGVuc2lvbnNCeUNsYXNzTmFtZT1uZXcgTWFwKCk7Y29uc3QgZXh0ZW5zaW9ucz0oZGVzY3JpcHRvci5leHRlbnNpb25zKTtmb3IobGV0IGk9MDtleHRlbnNpb25zJiZpPGV4dGVuc2lvbnMubGVuZ3RoOysraSl7Y29uc3QgZXh0ZW5zaW9uPW5ldyBSdW50aW1lLkV4dGVuc2lvbih0aGlzLGV4dGVuc2lvbnNbaV0pO3RoaXMuX21hbmFnZXIuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO3RoaXMuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO30KdGhpcy5fbG9hZGVkRm9yVGVzdD1mYWxzZTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CmVuYWJsZWQoKXtyZXR1cm4gUnVudGltZS5faXNEZXNjcmlwdG9yRW5hYmxlZCh0aGlzLl9kZXNjcmlwdG9yKTt9CnJlc291cmNlKG5hbWUpe2NvbnN0IGZ1bGxOYW1lPXRoaXMuX25hbWUrJy8nK25hbWU7Y29uc3QgY29udGVudD1SdW50aW1lLmNhY2hlZFJlc291cmNlc1tmdWxsTmFtZV07aWYoIWNvbnRlbnQpCnRocm93IG5ldyBFcnJvcihmdWxsTmFtZSsnIG5vdCBwcmVsb2FkZWQuIENoZWNrIG1vZHVsZS5qc29uJyk7cmV0dXJuIGNvbnRlbnQ7fQpfbG9hZFByb21pc2UoKXtpZighdGhpcy5lbmFibGVkKCkpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01vZHVsZSAnK3RoaXMuX25hbWUrJyBpcyBub3QgZW5hYmxlZCcpKTtpZih0aGlzLl9wZW5kaW5nTG9hZFByb21pc2UpCnJldHVybiB0aGlzLl9wZW5kaW5nTG9hZFByb21pc2U7Y29uc3QgZGVwZW5kZW5jaWVzPXRoaXMuX2Rlc2NyaXB0b3IuZGVwZW5kZW5jaWVzO2NvbnN0IGRlcGVuZGVuY3lQcm9taXNlcz1bXTtmb3IobGV0IGk9MDtkZXBlbmRlbmNpZXMmJmk8ZGVwZW5kZW5jaWVzLmxlbmd0aDsrK2kpCmRlcGVuZGVuY3lQcm9taXNlcy5wdXNoKHRoaXMuX21hbmFnZXIuX21vZHVsZXNNYXBbZGVwZW5kZW5jaWVzW2ldXS5fbG9hZFByb21pc2UoKSk7dGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlPVByb21pc2UuYWxsKGRlcGVuZGVuY3lQcm9taXNlcykudGhlbih0aGlzLl9sb2FkUmVzb3VyY2VzLmJpbmQodGhpcykpLnRoZW4odGhpcy5fbG9hZFNjcmlwdHMuYmluZCh0aGlzKSkudGhlbigoKT0+dGhpcy5fbG9hZGVkRm9yVGVzdD10cnVlKTtyZXR1cm4gdGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlO30KX2xvYWRSZXNvdXJjZXMoKXtjb25zdCByZXNvdXJjZXM9dGhpcy5fZGVzY3JpcHRvclsncmVzb3VyY2VzJ107aWYoIXJlc291cmNlc3x8IXJlc291cmNlcy5sZW5ndGgpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPHJlc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCB1cmw9dGhpcy5fbW9kdWxhcml6ZVVSTChyZXNvdXJjZXNbaV0pO3Byb21pc2VzLnB1c2goUnVudGltZS5fbG9hZFJlc291cmNlSW50b0NhY2hlKHVybCx0cnVlKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odW5kZWZpbmVkKTt9Cl9sb2FkU2NyaXB0cygpe2lmKCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHN8fCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgc3BlY2lhbENhc2VzPXsnc2RrJzonU0RLJywnanNfc2RrJzonSlNTREsnLCdicm93c2VyX3Nkayc6J0Jyb3dzZXJTREsnLCd1aSc6J1VJJywnb2JqZWN0X3VpJzonT2JqZWN0VUknLCdqYXZhc2NyaXB0X21ldGFkYXRhJzonSmF2YVNjcmlwdE1ldGFkYXRhJywncGVyZl91aSc6J1BlcmZVSScsJ2hhcl9pbXBvcnRlcic6J0hBUkltcG9ydGVyJywnc2RrX3Rlc3RfcnVubmVyJzonU0RLVGVzdFJ1bm5lcicsJ2NwdV9wcm9maWxlcl90ZXN0X3J1bm5lcic6J0NQVVByb2ZpbGVyVGVzdFJ1bm5lcid9O2NvbnN0IG5hbWVzcGFjZT1zcGVjaWFsQ2FzZXNbdGhpcy5fbmFtZV18fHRoaXMuX25hbWUuc3BsaXQoJ18nKS5tYXAoYT0+YS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpKS5qb2luKCcnKTtzZWxmW25hbWVzcGFjZV09c2VsZltuYW1lc3BhY2VdfHx7fTtyZXR1cm4gUnVudGltZS5fbG9hZFNjcmlwdHNQcm9taXNlKHRoaXMuX2Rlc2NyaXB0b3Iuc2NyaXB0cy5tYXAodGhpcy5fbW9kdWxhcml6ZVVSTCx0aGlzKSx0aGlzLl9yZW1vdGVCYXNlKCkpO30KX21vZHVsYXJpemVVUkwocmVzb3VyY2VOYW1lKXtyZXR1cm4gUnVudGltZS5ub3JtYWxpemVQYXRoKHRoaXMuX25hbWUrJy8nK3Jlc291cmNlTmFtZSk7fQpfcmVtb3RlQmFzZSgpe3JldHVybiFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKSYmdGhpcy5fZGVzY3JpcHRvci5yZW1vdGUmJlJ1bnRpbWUuX3JlbW90ZUJhc2V8fHVuZGVmaW5lZDt9CnN1YnN0aXR1dGVVUkwodmFsdWUpe2NvbnN0IGJhc2U9dGhpcy5fcmVtb3RlQmFzZSgpfHwnJztyZXR1cm4gdmFsdWUucmVwbGFjZSgvQHVybFwoKFteXCldKj8pXCkvZyxjb252ZXJ0VVJMLmJpbmQodGhpcykpO2Z1bmN0aW9uIGNvbnZlcnRVUkwobWF0Y2gsdXJsKXtyZXR1cm4gYmFzZSt0aGlzLl9tb2R1bGFyaXplVVJMKHVybCk7fX19O1J1bnRpbWUuRXh0ZW5zaW9uPWNsYXNze2NvbnN0cnVjdG9yKG1vZHVsZSxkZXNjcmlwdG9yKXt0aGlzLl9tb2R1bGU9bW9kdWxlO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl90eXBlPWRlc2NyaXB0b3IudHlwZTt0aGlzLl9oYXNUeXBlQ2xhc3M9dGhpcy5fdHlwZS5jaGFyQXQoMCk9PT0nQCc7dGhpcy5fY2xhc3NOYW1lPWRlc2NyaXB0b3IuY2xhc3NOYW1lfHxudWxsO3RoaXMuX2ZhY3RvcnlOYW1lPWRlc2NyaXB0b3IuZmFjdG9yeU5hbWV8fG51bGw7fQpkZXNjcmlwdG9yKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3I7fQptb2R1bGUoKXtyZXR1cm4gdGhpcy5fbW9kdWxlO30KZW5hYmxlZCgpe3JldHVybiB0aGlzLl9tb2R1bGUuZW5hYmxlZCgpJiZSdW50aW1lLl9pc0Rlc2NyaXB0b3JFbmFibGVkKHRoaXMuZGVzY3JpcHRvcigpKTt9Cl90eXBlQ2xhc3MoKXtpZighdGhpcy5faGFzVHlwZUNsYXNzKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLl9yZXNvbHZlKHRoaXMuX3R5cGUuc3Vic3RyaW5nKDEpKTt9CmlzQXBwbGljYWJsZShjb250ZXh0KXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dCh0aGlzLGNvbnRleHQpO30KaW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9sb2FkUHJvbWlzZSgpLnRoZW4odGhpcy5fY3JlYXRlSW5zdGFuY2UuYmluZCh0aGlzKSk7fQpjYW5JbnN0YW50aWF0ZSgpe3JldHVybiEhKHRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWUpO30KX2NyZWF0ZUluc3RhbmNlKCl7Y29uc3QgY2xhc3NOYW1lPXRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWU7aWYoIWNsYXNzTmFtZSkKdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgaW5zdGFudGlhdGUgZXh0ZW5zaW9uIHdpdGggbm8gY2xhc3MnKTtjb25zdCBjb25zdHJ1Y3RvckZ1bmN0aW9uPXNlbGYuZXZhbCgoY2xhc3NOYW1lKSk7aWYoIShjb25zdHJ1Y3RvckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pKQp0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZTogJytjbGFzc05hbWUpO2lmKHRoaXMuX2NsYXNzTmFtZSkKcmV0dXJuIHRoaXMuX21vZHVsZS5fbWFuYWdlci5zaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKTtyZXR1cm4gbmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24odGhpcyk7fQp0aXRsZSgpe3JldHVybiB0aGlzLl9kZXNjcmlwdG9yWyd0aXRsZS0nK1J1bnRpbWUuX3BsYXRmb3JtXXx8dGhpcy5fZGVzY3JpcHRvclsndGl0bGUnXTt9Cmhhc0NvbnRleHRUeXBlKGNvbnRleHRUeXBlKXtjb25zdCBjb250ZXh0VHlwZXM9dGhpcy5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzO2lmKCFjb250ZXh0VHlwZXMpCnJldHVybiBmYWxzZTtmb3IobGV0IGk9MDtpPGNvbnRleHRUeXBlcy5sZW5ndGg7KytpKXtpZihjb250ZXh0VHlwZT09PXRoaXMuX21vZHVsZS5fbWFuYWdlci5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtSdW50aW1lLkV4cGVyaW1lbnRzU3VwcG9ydD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3N1cHBvcnRFbmFibGVkPVJ1bnRpbWUucXVlcnlQYXJhbSgnZXhwZXJpbWVudHMnKSE9PW51bGw7dGhpcy5fZXhwZXJpbWVudHM9W107dGhpcy5fZXhwZXJpbWVudE5hbWVzPXt9O3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseT17fTt9CmFsbENvbmZpZ3VyYWJsZUV4cGVyaW1lbnRzKCl7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fZXhwZXJpbWVudHMubGVuZ3RoO2krKyl7Y29uc3QgZXhwZXJpbWVudD10aGlzLl9leHBlcmltZW50c1tpXTtpZighdGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnQubmFtZV0pCnJlc3VsdC5wdXNoKGV4cGVyaW1lbnQpO30KcmV0dXJuIHJlc3VsdDt9CnN1cHBvcnRFbmFibGVkKCl7cmV0dXJuIHRoaXMuX3N1cHBvcnRFbmFibGVkO30KX3NldEV4cGVyaW1lbnRzU2V0dGluZyh2YWx1ZSl7aWYoIXNlbGYubG9jYWxTdG9yYWdlKQpyZXR1cm47c2VsZi5sb2NhbFN0b3JhZ2VbJ2V4cGVyaW1lbnRzJ109SlNPTi5zdHJpbmdpZnkodmFsdWUpO30KcmVnaXN0ZXIoZXhwZXJpbWVudE5hbWUsZXhwZXJpbWVudFRpdGxlLGhpZGRlbil7UnVudGltZS5fYXNzZXJ0KCF0aGlzLl9leHBlcmltZW50TmFtZXNbZXhwZXJpbWVudE5hbWVdLCdEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIGV4cGVyaW1lbnQgJytleHBlcmltZW50TmFtZSk7dGhpcy5fZXhwZXJpbWVudE5hbWVzW2V4cGVyaW1lbnROYW1lXT10cnVlO3RoaXMuX2V4cGVyaW1lbnRzLnB1c2gobmV3IFJ1bnRpbWUuRXhwZXJpbWVudCh0aGlzLGV4cGVyaW1lbnROYW1lLGV4cGVyaW1lbnRUaXRsZSwhIWhpZGRlbikpO30KaXNFbmFibGVkKGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO2lmKHRoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV0pCnJldHVybiB0cnVlO2lmKCF0aGlzLnN1cHBvcnRFbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hIVJ1bnRpbWUuX2V4cGVyaW1lbnRzU2V0dGluZygpW2V4cGVyaW1lbnROYW1lXTt9CnNldEVuYWJsZWQoZXhwZXJpbWVudE5hbWUsZW5hYmxlZCl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKTtjb25zdCBleHBlcmltZW50c1NldHRpbmc9UnVudGltZS5fZXhwZXJpbWVudHNTZXR0aW5nKCk7ZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXT1lbmFibGVkO3RoaXMuX3NldEV4cGVyaW1lbnRzU2V0dGluZyhleHBlcmltZW50c1NldHRpbmcpO30Kc2V0RGVmYXVsdEV4cGVyaW1lbnRzKGV4cGVyaW1lbnROYW1lcyl7Zm9yKGxldCBpPTA7aTxleHBlcmltZW50TmFtZXMubGVuZ3RoOysraSl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lc1tpXSk7dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnROYW1lc1tpXV09dHJ1ZTt9fQplbmFibGVGb3JUZXN0KGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV09dHJ1ZTt9CmNsZWFyRm9yVGVzdCgpe3RoaXMuX2V4cGVyaW1lbnRzPVtdO3RoaXMuX2V4cGVyaW1lbnROYW1lcz17fTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHk9e307fQpjbGVhblVwU3RhbGVFeHBlcmltZW50cygpe2NvbnN0IGV4cGVyaW1lbnRzU2V0dGluZz1SdW50aW1lLl9leHBlcmltZW50c1NldHRpbmcoKTtjb25zdCBjbGVhbmVkVXBFeHBlcmltZW50U2V0dGluZz17fTtmb3IobGV0IGk9MDtpPHRoaXMuX2V4cGVyaW1lbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV4cGVyaW1lbnROYW1lPXRoaXMuX2V4cGVyaW1lbnRzW2ldLm5hbWU7aWYoZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXSkKY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmdbZXhwZXJpbWVudE5hbWVdPXRydWU7fQp0aGlzLl9zZXRFeHBlcmltZW50c1NldHRpbmcoY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmcpO30KX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSl7UnVudGltZS5fYXNzZXJ0KHRoaXMuX2V4cGVyaW1lbnROYW1lc1tleHBlcmltZW50TmFtZV0sJ1Vua25vd24gZXhwZXJpbWVudCAnK2V4cGVyaW1lbnROYW1lKTt9fTtSdW50aW1lLkV4cGVyaW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZXhwZXJpbWVudHMsbmFtZSx0aXRsZSxoaWRkZW4pe3RoaXMubmFtZT1uYW1lO3RoaXMudGl0bGU9dGl0bGU7dGhpcy5oaWRkZW49aGlkZGVuO3RoaXMuX2V4cGVyaW1lbnRzPWV4cGVyaW1lbnRzO30KaXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2V4cGVyaW1lbnRzLmlzRW5hYmxlZCh0aGlzLm5hbWUpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9leHBlcmltZW50cy5zZXRFbmFibGVkKHRoaXMubmFtZSxlbmFibGVkKTt9fTt7KGZ1bmN0aW9uIHBhcnNlUXVlcnlQYXJhbWV0ZXJzKCl7Y29uc3QgcXVlcnlQYXJhbXM9UnVudGltZS5xdWVyeVBhcmFtc1N0cmluZygpO2lmKCFxdWVyeVBhcmFtcykKcmV0dXJuO2NvbnN0IHBhcmFtcz1xdWVyeVBhcmFtcy5zdWJzdHJpbmcoMSkuc3BsaXQoJyYnKTtmb3IobGV0IGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXtjb25zdCBwYWlyPXBhcmFtc1tpXS5zcGxpdCgnPScpO2NvbnN0IG5hbWU9cGFpci5zaGlmdCgpO1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0W25hbWVdPXBhaXIuam9pbignPScpO319KSgpO30KUnVudGltZS5leHBlcmltZW50cz1uZXcgUnVudGltZS5FeHBlcmltZW50c1N1cHBvcnQoKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2s7UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWw9PlJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2VDYWxsYmFjaz1mdWxmaWwpO1J1bnRpbWUuX3JlbW90ZUJhc2U7KGZ1bmN0aW9uIHZhbGlkYXRlUmVtb3RlQmFzZSgpe2lmKGxvY2F0aW9uLmhyZWYuc3RhcnRzV2l0aCgnY2hyb21lLWRldnRvb2xzOi8vZGV2dG9vbHMvYnVuZGxlZC8nKSYmUnVudGltZS5xdWVyeVBhcmFtKCdyZW1vdGVCYXNlJykpe2NvbnN0IHZlcnNpb25NYXRjaD0vXC9zZXJ2ZV9maWxlXC8oQFswLTlhLXpBLVpdKylcLz8kLy5leGVjKFJ1bnRpbWUucXVlcnlQYXJhbSgncmVtb3RlQmFzZScpKTtpZih2ZXJzaW9uTWF0Y2gpClJ1bnRpbWUuX3JlbW90ZUJhc2U9YCR7bG9jYXRpb24ub3JpZ2lufS9yZW1vdGUvc2VydmVfZmlsZS8ke3ZlcnNpb25NYXRjaFsxXX0vYDt9fSkoKTtmdW5jdGlvbiBTZXJ2aWNlUG9ydCgpe30KU2VydmljZVBvcnQucHJvdG90eXBlPXtzZXRIYW5kbGVycyhtZXNzYWdlSGFuZGxlcixjbG9zZUhhbmRsZXIpe30sc2VuZChtZXNzYWdlKXt9LGNsb3NlKCl7fX07dmFyIHJ1bnRpbWU7YWxsRGVzY3JpcHRvcnMucHVzaCguLi5beyJza2lwX2NvbXBpbGF0aW9uIjpbImxpZ2h0aG91c2UvbGlnaHRob3VzZS1iYWNrZ3JvdW5kLmpzIl0sImRlcGVuZGVuY2llcyI6WyJ3b3JrZXJfc2VydmljZSJdLCJleHRlbnNpb25zIjpbeyJmYWN0b3J5TmFtZSI6IkF1ZGl0czJTZXJ2aWNlIiwidHlwZSI6IkBTZXJ2aWNlIiwibmFtZSI6IkF1ZGl0czJTZXJ2aWNlIn1dLCJuYW1lIjoiYXVkaXRzMl93b3JrZXIiLCJzY3JpcHRzIjpbImF1ZGl0czJfd29ya2VyX21vZHVsZS5qcyJdfSx7Im5hbWUiOiJ3b3JrZXJfc2VydmljZSJ9XSk7YXBwbGljYXRpb25EZXNjcmlwdG9yPXsiaGFzX2h0bWwiOmZhbHNlLCJtb2R1bGVzIjpbeyJ0eXBlIjoicmVtb3RlIiwibmFtZSI6ImF1ZGl0czJfd29ya2VyIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6Indvcmtlcl9zZXJ2aWNlIn1dfQpzZWxmWydXb3JrZXJTZXJ2aWNlJ109c2VsZlsnV29ya2VyU2VydmljZSddfHx7fTtmdW5jdGlvbiBTZXJ2aWNlKCl7fQpTZXJ2aWNlLnByb3RvdHlwZT17ZGlzcG9zZSgpe30sc2V0Tm90aWZ5KG5vdGlmeSl7fX07U2VydmljZURpc3BhdGNoZXI9Y2xhc3N7Y29uc3RydWN0b3IocG9ydCl7dGhpcy5fb2JqZWN0cz1uZXcgTWFwKCk7dGhpcy5fbGFzdE9iamVjdElkPTE7dGhpcy5fcG9ydD1wb3J0O3RoaXMuX3BvcnQuc2V0SGFuZGxlcnModGhpcy5fZGlzcGF0Y2hNZXNzYWdlV3JhcHBlZC5iaW5kKHRoaXMpLHRoaXMuX2Nvbm5lY3Rpb25DbG9zZWQuYmluZCh0aGlzKSk7fQpfZGlzcGF0Y2hNZXNzYWdlV3JhcHBlZChkYXRhKXt0cnl7Y29uc3QgbWVzc2FnZT1KU09OLnBhcnNlKGRhdGEpO2lmKCEobWVzc2FnZSBpbnN0YW5jZW9mIE9iamVjdCkpe3RoaXMuX3NlbmRFcnJvclJlc3BvbnNlKG1lc3NhZ2VbJ2lkJ10sJ01hbGZvcm1lZCBtZXNzYWdlJyk7cmV0dXJuO30KdGhpcy5fZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UpO31jYXRjaChlKXt0aGlzLl9zZW5kRXJyb3JSZXNwb25zZShtZXNzYWdlWydpZCddLGUudG9TdHJpbmcoKSsnICcrZS5zdGFjayk7fX0KX2Rpc3BhdGNoTWVzc2FnZShtZXNzYWdlKXtjb25zdCBkb21haW5BbmRNZXRob2Q9bWVzc2FnZVsnbWV0aG9kJ10uc3BsaXQoJy4nKTtjb25zdCBzZXJ2aWNlTmFtZT1kb21haW5BbmRNZXRob2RbMF07Y29uc3QgbWV0aG9kPWRvbWFpbkFuZE1ldGhvZFsxXTtpZihtZXRob2Q9PT0nY3JlYXRlJyl7Y29uc3QgZXh0ZW5zaW9ucz1zZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucyhTZXJ2aWNlKS5maWx0ZXIoZXh0ZW5zaW9uPT5leHRlbnNpb24uZGVzY3JpcHRvcigpWyduYW1lJ109PT1zZXJ2aWNlTmFtZSk7aWYoIWV4dGVuc2lvbnMubGVuZ3RoKXt0aGlzLl9zZW5kRXJyb3JSZXNwb25zZShtZXNzYWdlWydpZCddLCdDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2aWNlIFwnJytzZXJ2aWNlTmFtZSsnXCcnKTtyZXR1cm47fQpleHRlbnNpb25zWzBdLmluc3RhbmNlKCkudGhlbihvYmplY3Q9Pntjb25zdCBpZD1TdHJpbmcodGhpcy5fbGFzdE9iamVjdElkKyspO29iamVjdC5zZXROb3RpZnkodGhpcy5fbm90aWZ5LmJpbmQodGhpcyxpZCxzZXJ2aWNlTmFtZSkpO3RoaXMuX29iamVjdHMuc2V0KGlkLG9iamVjdCk7dGhpcy5fc2VuZFJlc3BvbnNlKG1lc3NhZ2VbJ2lkJ10se2lkOmlkfSk7fSk7fWVsc2UgaWYobWV0aG9kPT09J2Rpc3Bvc2UnKXtjb25zdCBvYmplY3Q9dGhpcy5fb2JqZWN0cy5nZXQobWVzc2FnZVsncGFyYW1zJ11bJ2lkJ10pO2lmKCFvYmplY3Qpe2NvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBsb29rIHVwIG9iamVjdCB3aXRoIGlkIGZvciAnK0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtyZXR1cm47fQp0aGlzLl9vYmplY3RzLmRlbGV0ZShtZXNzYWdlWydwYXJhbXMnXVsnaWQnXSk7b2JqZWN0LmRpc3Bvc2UoKS50aGVuKCgpPT50aGlzLl9zZW5kUmVzcG9uc2UobWVzc2FnZVsnaWQnXSx7fSkpO31lbHNle2lmKCFtZXNzYWdlWydwYXJhbXMnXSl7Y29uc29sZS5lcnJvcignTm8gcGFyYW1zIGluIHRoZSBtZXNzYWdlOiAnK0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtyZXR1cm47fQpjb25zdCBvYmplY3Q9dGhpcy5fb2JqZWN0cy5nZXQobWVzc2FnZVsncGFyYW1zJ11bJ2lkJ10pO2lmKCFvYmplY3Qpe2NvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBsb29rIHVwIG9iamVjdCB3aXRoIGlkIGZvciAnK0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtyZXR1cm47fQpjb25zdCBoYW5kbGVyPW9iamVjdFttZXRob2RdO2lmKCEoaGFuZGxlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl7Y29uc29sZS5lcnJvcignSGFuZGxlciBmb3IgXCcnK21ldGhvZCsnXCcgaXMgbWlzc2luZy4nKTtyZXR1cm47fQpvYmplY3RbbWV0aG9kXShtZXNzYWdlWydwYXJhbXMnXSkudGhlbihyZXN1bHQ9PnRoaXMuX3NlbmRSZXNwb25zZShtZXNzYWdlWydpZCddLHJlc3VsdCkpO319Cl9jb25uZWN0aW9uQ2xvc2VkKCl7Zm9yKGNvbnN0IG9iamVjdCBvZiB0aGlzLl9vYmplY3RzLnZhbHVlcygpKQpvYmplY3QuZGlzcG9zZSgpO3RoaXMuX29iamVjdHMuY2xlYXIoKTt9Cl9ub3RpZnkob2JqZWN0SWQsc2VydmljZU5hbWUsbWV0aG9kLHBhcmFtcyl7cGFyYW1zWydpZCddPW9iamVjdElkO2NvbnN0IG1lc3NhZ2U9e21ldGhvZDpzZXJ2aWNlTmFtZSsnLicrbWV0aG9kLHBhcmFtczpwYXJhbXN9O3RoaXMuX3BvcnQuc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7fQpfc2VuZFJlc3BvbnNlKG1lc3NhZ2VJZCxyZXN1bHQpe2NvbnN0IG1lc3NhZ2U9e2lkOm1lc3NhZ2VJZCxyZXN1bHQ6cmVzdWx0fTt0aGlzLl9wb3J0LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO30KX3NlbmRFcnJvclJlc3BvbnNlKG1lc3NhZ2VJZCxlcnJvcil7Y29uc3QgbWVzc2FnZT17aWQ6bWVzc2FnZUlkLGVycm9yOmVycm9yfTt0aGlzLl9wb3J0LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO319O1dvcmtlclNlcnZpY2VQb3J0PWNsYXNze2NvbnN0cnVjdG9yKHBvcnQpe3RoaXMuX3BvcnQ9cG9ydDt0aGlzLl9wb3J0Lm9ubWVzc2FnZT10aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTt0aGlzLl9wb3J0Lm9uZXJyb3I9Y29uc29sZS5lcnJvcjt9CnNldEhhbmRsZXJzKG1lc3NhZ2VIYW5kbGVyLGNsb3NlSGFuZGxlcil7dGhpcy5fbWVzc2FnZUhhbmRsZXI9bWVzc2FnZUhhbmRsZXI7dGhpcy5fY2xvc2VIYW5kbGVyPWNsb3NlSGFuZGxlcjt9CnNlbmQoZGF0YSl7dGhpcy5fcG9ydC5wb3N0TWVzc2FnZShkYXRhKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpjbG9zZSgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9Cl9vbk1lc3NhZ2UoZXZlbnQpe3RoaXMuX21lc3NhZ2VIYW5kbGVyKGV2ZW50LmRhdGEpO319O2NvbnN0IGRpc3BhdGNoZXJzPVtdO2NvbnN0IHdvcmtlcj0oc2VsZik7Y29uc3Qgc2VydmljZVBvcnQ9bmV3IFdvcmtlclNlcnZpY2VQb3J0KCh3b3JrZXIpKTtkaXNwYXRjaGVycy5wdXNoKG5ldyBTZXJ2aWNlRGlzcGF0Y2hlcihzZXJ2aWNlUG9ydCkpOzs7O2lmKCFzZWxmLlJ1bnRpbWUpCnNlbGYuaW1wb3J0U2NyaXB0cygnUnVudGltZS5qcycpO1J1bnRpbWUuc3RhcnRXb3JrZXIoJ2F1ZGl0czJfd29ya2VyJyk7PCEtLQogKiBDb3B5cmlnaHQgMjAxOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLT4KPCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0ib2JqZWN0LXNyYyAnbm9uZSc7IHNjcmlwdC1zcmMgJ3NlbGYnICd1bnNhZmUtZXZhbCcgJ3Vuc2FmZS1pbmxpbmUnIGh0dHBzOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tIj4KICAgIDxtZXRhIG5hbWU9InJlZmVycmVyIiBjb250ZW50PSJuby1yZWZlcnJlciI+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJzaGVsbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJkZXZ0b29sc19hcHAuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD5SdW50aW1lLnN0YXJ0QXBwbGljYXRpb24oJ2RldnRvb2xzX2FwcCcpOzwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ1bmRvY2tlZCIgaWQ9Ii1ibGluay1kZXYtdG9vbHMiPjwvYm9keT4KPC9odG1sPgphbGxEZXNjcmlwdG9ycy5wdXNoKC4uLlt7ImRlcGVuZGVuY2llcyI6WyJ1aSIsImhvc3QiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJXaGF0J3MgTmV3IiwiaWQiOiJyZWxlYXNlLW5vdGUiLCJjbGFzc05hbWUiOiJIZWxwLlJlbGVhc2VOb3RlVmlldyIsImxvY2F0aW9uIjoiZHJhd2VyLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxLCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9LHsiY2F0ZWdvcnkiOiJBcHBlYXJhbmNlIiwidGl0bGUiOiJTaG93IFdoYXQncyBOZXcgYWZ0ZXIgZWFjaCB1cGRhdGUiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiaGVscC5zaG93LXJlbGVhc2Utbm90ZSIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiU2hvdyBXaGF0J3MgTmV3IGFmdGVyIGVhY2ggdXBkYXRlIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG8gbm90IHNob3cgV2hhdCdzIE5ldyBhZnRlciBlYWNoIHVwZGF0ZSJ9XX0seyJjYXRlZ29yeSI6IkhlbHAiLCJjbGFzc05hbWUiOiJIZWxwLlJlbGVhc2VOb3Rlc0FjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiaGVscC5yZWxlYXNlLW5vdGVzIiwidGl0bGUiOiJSZWxlYXNlIG5vdGVzIn0seyJvcmRlciI6MTAsInR5cGUiOiJjb250ZXh0LW1lbnUtaXRlbSIsImxvY2F0aW9uIjoibWFpbk1lbnVIZWxwL2RlZmF1bHQiLCJhY3Rpb25JZCI6ImhlbHAucmVsZWFzZS1ub3RlcyJ9LHsiY2xhc3NOYW1lIjoiSGVscC5IZWxwTGF0ZUluaXRpYWxpemF0aW9uIiwidHlwZSI6ImxhdGUtaW5pdGlhbGl6YXRpb24ifV0sIm5hbWUiOiJoZWxwIiwic2NyaXB0cyI6WyJoZWxwX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJlbGVtZW50cyJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IkFjY2Vzc2liaWxpdHkiLCJpZCI6ImFjY2Vzc2liaWxpdHkudmlldyIsImNsYXNzTmFtZSI6IkFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVNpZGViYXJWaWV3IiwibG9jYXRpb24iOiJlbGVtZW50cy1zaWRlYmFyIiwidHlwZSI6InZpZXciLCJvcmRlciI6MTAsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In1dLCJuYW1lIjoiYWNjZXNzaWJpbGl0eSIsInNjcmlwdHMiOlsiYWNjZXNzaWJpbGl0eV9tb2R1bGUuanMiXSwic2tpcF9jb21waWxhdGlvbiI6WyJBUklBUHJvcGVydGllcy5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21wb25lbnRzIiwic2RrIiwidGltZWxpbmVfbW9kZWwiLCJ1aSIsInBlcmZfdWkiXSwibmFtZSI6ImxheWVyX3ZpZXdlciIsInNjcmlwdHMiOlsibGF5ZXJfdmlld2VyX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJ1aSIsInNkayIsImRhdGFfZ3JpZCJdLCJuYW1lIjoiY29va2llX3RhYmxlIiwic2NyaXB0cyI6WyJjb29raWVfdGFibGVfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImVtdWxhdGlvbiJdLCJleHRlbnNpb25zIjpbeyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0IjpmYWxzZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6ImlQaG9uZSA0Iiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjQ4MCwiaGVpZ2h0IjozMjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjozMjAsImhlaWdodCI6NDgwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6dHJ1ZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6ImlQaG9uZSA1L1NFIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjU2OCwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjoyNSwicmlnaHQiOjExNSwiYm90dG9tIjoyOCwibGVmdCI6MTE1fSwiaW1hZ2UiOiJAdXJsKGlQaG9uZTUtbGFuZHNjYXBlLnN2ZykifSwiaGVpZ2h0IjozMjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjozMjAsIm91dGxpbmUiOnsiaW5zZXRzIjp7InRvcCI6MTA1LCJyaWdodCI6MjUsImJvdHRvbSI6MTExLCJsZWZ0IjoyOX0sImltYWdlIjoiQHVybChpUGhvbmU1LXBvcnRyYWl0LnN2ZykifSwiaGVpZ2h0Ijo1Njh9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEwXzNfMSBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDMuMS4zMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTAuMCBNb2JpbGUvMTRFMzA0IFNhZmFyaS82MDIuMSIsInR5cGUiOiJwaG9uZSJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIiwib3JkZXIiOjMwfSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOnRydWUsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJpUGhvbmUgNi83LzgiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6NjY3LCJvdXRsaW5lIjp7Imluc2V0cyI6eyJ0b3AiOjI4LCJyaWdodCI6MTA2LCJib3R0b20iOjI4LCJsZWZ0IjoxMDZ9LCJpbWFnZSI6IkB1cmwoaVBob25lNi1sYW5kc2NhcGUuc3ZnKSJ9LCJoZWlnaHQiOjM3NX0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjM3NSwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjoxMDUsInJpZ2h0IjoyOCwiYm90dG9tIjoxMDUsImxlZnQiOjI4fSwiaW1hZ2UiOiJAdXJsKGlQaG9uZTYtcG9ydHJhaXQuc3ZnKSJ9LCJoZWlnaHQiOjY2N319LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMSIsInR5cGUiOiJwaG9uZSJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIiwib3JkZXIiOjMxfSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOnRydWUsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJpUGhvbmUgNi83LzggUGx1cyIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo3MzYsIm91dGxpbmUiOnsiaW5zZXRzIjp7InRvcCI6MjksInJpZ2h0IjoxMDksImJvdHRvbSI6MjcsImxlZnQiOjEwOX0sImltYWdlIjoiQHVybChpUGhvbmU2UGx1cy1sYW5kc2NhcGUuc3ZnKSJ9LCJoZWlnaHQiOjQxNH0sImRldmljZS1waXhlbC1yYXRpbyI6MywidmVydGljYWwiOnsid2lkdGgiOjQxNCwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjoxMDcsInJpZ2h0IjozMCwiYm90dG9tIjoxMTEsImxlZnQiOjI2fSwiaW1hZ2UiOiJAdXJsKGlQaG9uZTZQbHVzLXBvcnRyYWl0LnN2ZykifSwiaGVpZ2h0Ijo3MzZ9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSIsIm9yZGVyIjozMn0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0Ijp0cnVlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiaVBob25lIFgiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6ODEyLCJoZWlnaHQiOjM3NX0sImRldmljZS1waXhlbC1yYXRpbyI6MywidmVydGljYWwiOnsid2lkdGgiOjM3NSwiaGVpZ2h0Ijo4MTJ9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSIsIm9yZGVyIjozM30seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0IjpmYWxzZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6IkJsYWNrQmVycnkgWjMwIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjozNjAsImhlaWdodCI6NjQwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJOZXh1cyA0Iiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjY0MCwiaGVpZ2h0IjozODR9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjozODQsImhlaWdodCI6NjQwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDQuNC4yOyBOZXh1cyA0IEJ1aWxkL0tPVDQ5SCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MjUsInJpZ2h0IjowLCJib3R0b20iOjQ4LCJsZWZ0IjowfSwiaW1hZ2UiOiJAdXJsKGdvb2dsZS1uZXh1cy01LXZlcnRpY2FsLWRlZmF1bHQtMXgucG5nKSAxeCwgQHVybChnb29nbGUtbmV4dXMtNS12ZXJ0aWNhbC1kZWZhdWx0LTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjo4MCwicmlnaHQiOjAsImJvdHRvbSI6NDgsImxlZnQiOjB9LCJpbWFnZSI6IkB1cmwoZ29vZ2xlLW5leHVzLTUtdmVydGljYWwtbmF2aWdhdGlvbi0xeC5wbmcpIDF4LCBAdXJsKGdvb2dsZS1uZXh1cy01LXZlcnRpY2FsLW5hdmlnYXRpb24tMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6Im5hdmlnYXRpb24gYmFyIn0seyJpbnNldHMiOnsidG9wIjo4MCwicmlnaHQiOjAsImJvdHRvbSI6MzEyLCJsZWZ0IjowfSwiaW1hZ2UiOiJAdXJsKGdvb2dsZS1uZXh1cy01LXZlcnRpY2FsLWtleWJvYXJkLTF4LnBuZykgMXgsIEB1cmwoZ29vZ2xlLW5leHVzLTUtdmVydGljYWwta2V5Ym9hcmQtMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImtleWJvYXJkIn0seyJpbnNldHMiOnsidG9wIjoyNSwicmlnaHQiOjQyLCJib3R0b20iOjAsImxlZnQiOjB9LCJpbWFnZSI6IkB1cmwoZ29vZ2xlLW5leHVzLTUtaG9yaXpvbnRhbC1kZWZhdWx0LTF4LnBuZykgMXgsIEB1cmwoZ29vZ2xlLW5leHVzLTUtaG9yaXpvbnRhbC1kZWZhdWx0LTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjgwLCJyaWdodCI6NDIsImJvdHRvbSI6MCwibGVmdCI6MH0sImltYWdlIjoiQHVybChnb29nbGUtbmV4dXMtNS1ob3Jpem9udGFsLW5hdmlnYXRpb24tMXgucG5nKSAxeCwgQHVybChnb29nbGUtbmV4dXMtNS1ob3Jpem9udGFsLW5hdmlnYXRpb24tMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoibmF2aWdhdGlvbiBiYXIifSx7Imluc2V0cyI6eyJ0b3AiOjgwLCJyaWdodCI6NDIsImJvdHRvbSI6MjAyLCJsZWZ0IjowfSwiaW1hZ2UiOiJAdXJsKGdvb2dsZS1uZXh1cy01LWhvcml6b250YWwta2V5Ym9hcmQtMXgucG5nKSAxeCwgQHVybChnb29nbGUtbmV4dXMtNS1ob3Jpem9udGFsLWtleWJvYXJkLTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImtleWJvYXJkIn1dLCJ0aXRsZSI6Ik5leHVzIDUiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6NjQwLCJoZWlnaHQiOjM2MH0sImRldmljZS1waXhlbC1yYXRpbyI6MywidmVydGljYWwiOnsid2lkdGgiOjM2MCwiaGVpZ2h0Ijo2NDB9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MjQsInJpZ2h0IjowLCJib3R0b20iOjQ4LCJsZWZ0IjowfSwiaW1hZ2UiOiJAdXJsKGdvb2dsZS1uZXh1cy01eC12ZXJ0aWNhbC1kZWZhdWx0LTF4LnBuZykgMXgsIEB1cmwoZ29vZ2xlLW5leHVzLTV4LXZlcnRpY2FsLWRlZmF1bHQtMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjgwLCJyaWdodCI6MCwiYm90dG9tIjo0OCwibGVmdCI6MH0sImltYWdlIjoiQHVybChnb29nbGUtbmV4dXMtNXgtdmVydGljYWwtbmF2aWdhdGlvbi0xeC5wbmcpIDF4LCBAdXJsKGdvb2dsZS1uZXh1cy01eC12ZXJ0aWNhbC1uYXZpZ2F0aW9uLTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJuYXZpZ2F0aW9uIGJhciJ9LHsiaW5zZXRzIjp7InRvcCI6ODAsInJpZ2h0IjowLCJib3R0b20iOjM0MiwibGVmdCI6MH0sImltYWdlIjoiQHVybChnb29nbGUtbmV4dXMtNXgtdmVydGljYWwta2V5Ym9hcmQtMXgucG5nKSAxeCwgQHVybChnb29nbGUtbmV4dXMtNXgtdmVydGljYWwta2V5Ym9hcmQtMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImtleWJvYXJkIn0seyJpbnNldHMiOnsidG9wIjoyNCwicmlnaHQiOjQ4LCJib3R0b20iOjAsImxlZnQiOjB9LCJpbWFnZSI6IkB1cmwoZ29vZ2xlLW5leHVzLTV4LWhvcml6b250YWwtZGVmYXVsdC0xeC5wbmcpIDF4LCBAdXJsKGdvb2dsZS1uZXh1cy01eC1ob3Jpem9udGFsLWRlZmF1bHQtMngucG5nKSAyeCIsIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6ODAsInJpZ2h0Ijo0OCwiYm90dG9tIjowLCJsZWZ0IjowfSwiaW1hZ2UiOiJAdXJsKGdvb2dsZS1uZXh1cy01eC1ob3Jpem9udGFsLW5hdmlnYXRpb24tMXgucG5nKSAxeCwgQHVybChnb29nbGUtbmV4dXMtNXgtaG9yaXpvbnRhbC1uYXZpZ2F0aW9uLTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6Im5hdmlnYXRpb24gYmFyIn0seyJpbnNldHMiOnsidG9wIjo4MCwicmlnaHQiOjQ4LCJib3R0b20iOjIyMiwibGVmdCI6MH0sImltYWdlIjoiQHVybChnb29nbGUtbmV4dXMtNXgtaG9yaXpvbnRhbC1rZXlib2FyZC0xeC5wbmcpIDF4LCBAdXJsKGdvb2dsZS1uZXh1cy01eC1ob3Jpem9udGFsLWtleWJvYXJkLTJ4LnBuZykgMngiLCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImtleWJvYXJkIn1dLCJ0aXRsZSI6Ik5leHVzIDVYIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjczMiwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjoyMSwicmlnaHQiOjk4LCJib3R0b20iOjE5LCJsZWZ0Ijo4OH0sImltYWdlIjoiQHVybChOZXh1czVYLWxhbmRzY2FwZS5zdmcpIn0sImhlaWdodCI6NDEyfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoyLjYyNSwidmVydGljYWwiOnsid2lkdGgiOjQxMiwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjo4OCwicmlnaHQiOjIyLCJib3R0b20iOjk4LCJsZWZ0IjoxOH0sImltYWdlIjoiQHVybChOZXh1czVYLXBvcnRyYWl0LnN2ZykifSwiaGVpZ2h0Ijo3MzJ9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IE5leHVzIDVYIEJ1aWxkL09QUjQuMTcwNjIzLjAwNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiTmV4dXMgNiIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo3MzIsImhlaWdodCI6NDEyfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjozLjUsInZlcnRpY2FsIjp7IndpZHRoIjo0MTIsImhlaWdodCI6NzMyfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBOZXh1cyA2IEJ1aWxkL042RjI2VSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiTmV4dXMgNlAiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6NzMyLCJvdXRsaW5lIjp7Imluc2V0cyI6eyJ0b3AiOjE3LCJyaWdodCI6ODgsImJvdHRvbSI6MTcsImxlZnQiOjk0fSwiaW1hZ2UiOiJAdXJsKE5leHVzNlAtbGFuZHNjYXBlLnN2ZykifSwiaGVpZ2h0Ijo0MTJ9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjMuNSwidmVydGljYWwiOnsid2lkdGgiOjQxMiwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjo5NCwicmlnaHQiOjE2LCJib3R0b20iOjg4LCJsZWZ0IjoxNn0sImltYWdlIjoiQHVybChOZXh1czZQLXBvcnRyYWl0LnN2ZykifSwiaGVpZ2h0Ijo3MzJ9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IE5leHVzIDZQIEJ1aWxkL09QUDMuMTcwNTE4LjAwNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOnRydWUsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJQaXhlbCAyIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjczMSwiaGVpZ2h0Ijo0MTF9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIuNjI1LCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6NDExLCJoZWlnaHQiOjczMX19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjA7IFBpeGVsIDIgQnVpbGQvT1BEMy4xNzA4MTYuMDEyKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgTW9iaWxlIFNhZmFyaS81MzcuMzYiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSIsIm9yZGVyIjoyMH0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0Ijp0cnVlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiUGl4ZWwgMiBYTCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo4MjMsImhlaWdodCI6NDExfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjozLjUsInZlcnRpY2FsIjp7IndpZHRoIjo0MTEsImhlaWdodCI6ODIzfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBQaXhlbCAyIFhMIEJ1aWxkL09QRDEuMTcwODE2LjAwNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIE1vYmlsZSBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UiLCJvcmRlciI6MjF9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJMRyBPcHRpbXVzIEw3MCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo2NDAsImhlaWdodCI6Mzg0fSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoxLjI1LCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6Mzg0LCJoZWlnaHQiOjY0MH19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuMjsgZW4tdXM7IExHTVMzMjMgQnVpbGQvS09UNDlJLk1TMzIzMTBjKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvJXMgTW9iaWxlIFNhZmFyaS81MzcuMzYiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJOb2tpYSBOOSIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo4NTQsImhlaWdodCI6NDgwfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoxLCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6NDgwLCJoZWlnaHQiOjg1NH19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzIiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiTm9raWEgTHVtaWEgNTIwIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjUzMywiaGVpZ2h0IjozMjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjEuNSwidmVydGljYWwiOnsid2lkdGgiOjMyMCwiaGVpZ2h0Ijo1MzN9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIFBob25lIDguMDsgVHJpZGVudC82LjA7IElFTW9iaWxlLzEwLjA7IEFSTTsgVG91Y2g7IE5PS0lBOyBMdW1pYSA1MjApIiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiTWljcm9zb2Z0IEx1bWlhIDU1MCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo2NDAsImhlaWdodCI6MzYwfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoyLCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6NjQwLCJoZWlnaHQiOjM2MH19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgNTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MyIsInR5cGUiOiJwaG9uZSJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIn0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0IjpmYWxzZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6Ik1pY3Jvc29mdCBMdW1pYSA5NTAiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6NjQwLCJoZWlnaHQiOjM2MH0sImRldmljZS1waXhlbC1yYXRpbyI6NCwidmVydGljYWwiOnsid2lkdGgiOjM2MCwiaGVpZ2h0Ijo2NDB9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoV2luZG93cyBQaG9uZSAxMC4wOyBBbmRyb2lkIDQuMi4xOyBNaWNyb3NvZnQ7IEx1bWlhIDk1MCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ2LjAuMjQ4Ni4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTQuMTQyNjMiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJHYWxheHkgUyBJSUkiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6NjQwLCJoZWlnaHQiOjM2MH0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjM2MCwiaGVpZ2h0Ijo2NDB9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wOyBlbi11czsgR1QtSTkzMDAgQnVpbGQvSU1NNzZEKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCIsInR5cGUiOiJwaG9uZSJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIn0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0Ijp0cnVlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiR2FsYXh5IFM1Iiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjMsInZlcnRpY2FsIjp7IndpZHRoIjozNjAsImhlaWdodCI6NjQwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgTW9iaWxlIFNhZmFyaS81MzcuMzYiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSIsIm9yZGVyIjoxMH0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0IjpmYWxzZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6IktpbmRsZSBGaXJlIEhEWCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjoxMjgwLCJoZWlnaHQiOjgwMH0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjgwMCwiaGVpZ2h0IjoxMjgwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBVOyBlbi11czsgS0ZBUFdJIEJ1aWxkL0pEUTM5KSBBcHBsZVdlYktpdC81MzUuMTkgKEtIVE1MLCBsaWtlIEdlY2tvKSBTaWxrLzMuMTMgU2FmYXJpLzUzNS4xOSBTaWxrLUFjY2VsZXJhdGVkPXRydWUiLCJ0eXBlIjoidGFibGV0In0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiaVBhZCBNaW5pIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjEwMjQsImhlaWdodCI6NzY4fSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoyLCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6NzY4LCJoZWlnaHQiOjEwMjR9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMSIsInR5cGUiOiJ0YWJsZXQifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6dHJ1ZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6ImlQYWQiLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6MTAyNCwib3V0bGluZSI6eyJpbnNldHMiOnsidG9wIjo1NiwicmlnaHQiOjExNiwiYm90dG9tIjo1MiwibGVmdCI6MTEyfSwiaW1hZ2UiOiJAdXJsKGlQYWQtbGFuZHNjYXBlLnN2ZykifSwiaGVpZ2h0Ijo3Njh9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjo3NjgsIm91dGxpbmUiOnsiaW5zZXRzIjp7InRvcCI6MTE0LCJyaWdodCI6NTUsImJvdHRvbSI6MTE0LCJsZWZ0Ijo1Mn0sImltYWdlIjoiQHVybChpUGFkLXBvcnRyYWl0LnN2ZykifSwiaGVpZ2h0IjoxMDI0fX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUE1MzQxZiBTYWZhcmkvNjA0LjEiLCJ0eXBlIjoidGFibGV0In0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UiLCJvcmRlciI6NDB9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6dHJ1ZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6ImlQYWQgUHJvIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjEzNjYsImhlaWdodCI6MTAyNH0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjEwMjQsImhlaWdodCI6MTM2Nn19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xIiwidHlwZSI6InRhYmxldCJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIiwib3JkZXIiOjQxfSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoidmVydGljYWwiLCJ0aXRsZSI6ImRlZmF1bHQifSx7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6Imhvcml6b250YWwiLCJ0aXRsZSI6ImRlZmF1bHQifV0sInRpdGxlIjoiQmxhY2tiZXJyeSBQbGF5Qm9vayIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjoxMDI0LCJoZWlnaHQiOjYwMH0sImRldmljZS1waXhlbC1yYXRpbyI6MSwidmVydGljYWwiOnsid2lkdGgiOjYwMCwiaGVpZ2h0IjoxMDI0fX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCBsaWtlIEdlY2tvKSBWZXJzaW9uLzcuMi4xLjAgU2FmYXJpLzUzNi4yKyIsInR5cGUiOiJ0YWJsZXQifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJOZXh1cyAxMCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjoxMjgwLCJoZWlnaHQiOjgwMH0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjgwMCwiaGVpZ2h0IjoxMjgwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyAxMCBCdWlsZC9NT0IzMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8lcyBTYWZhcmkvNTM3LjM2IiwidHlwZSI6InRhYmxldCJ9LCJ0eXBlIjoiZW11bGF0ZWQtZGV2aWNlIn0seyJkZXZpY2UiOnsic2hvdy1ieS1kZWZhdWx0IjpmYWxzZSwibW9kZXMiOlt7Imluc2V0cyI6eyJ0b3AiOjAsInJpZ2h0IjowLCJib3R0b20iOjAsImxlZnQiOjB9LCJvcmllbnRhdGlvbiI6InZlcnRpY2FsIiwidGl0bGUiOiJkZWZhdWx0In0seyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJob3Jpem9udGFsIiwidGl0bGUiOiJkZWZhdWx0In1dLCJ0aXRsZSI6Ik5leHVzIDciLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6OTYwLCJoZWlnaHQiOjYwMH0sImRldmljZS1waXhlbC1yYXRpbyI6MiwidmVydGljYWwiOnsid2lkdGgiOjYwMCwiaGVpZ2h0Ijo5NjB9fSwiY2FwYWJpbGl0aWVzIjpbInRvdWNoIiwibW9iaWxlIl0sInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDcgQnVpbGQvTU9CMzBYKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgU2FmYXJpLzUzNy4zNiIsInR5cGUiOiJ0YWJsZXQifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJHYWxheHkgTm90ZSAzIiwic2NyZWVuIjp7Imhvcml6b250YWwiOnsid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjMsInZlcnRpY2FsIjp7IndpZHRoIjozNjAsImhlaWdodCI6NjQwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCIsIm1vYmlsZSJdLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMzsgZW4tdXM7IFNNLU45MDBUIEJ1aWxkL0pTUzE1SikgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAiLCJ0eXBlIjoicGhvbmUifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9LHsiZGV2aWNlIjp7InNob3ctYnktZGVmYXVsdCI6ZmFsc2UsIm1vZGVzIjpbeyJpbnNldHMiOnsidG9wIjowLCJyaWdodCI6MCwiYm90dG9tIjowLCJsZWZ0IjowfSwib3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCIsInRpdGxlIjoiZGVmYXVsdCJ9LHsiaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJHYWxheHkgTm90ZSBJSSIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjo2NDAsImhlaWdodCI6MzYwfSwiZGV2aWNlLXBpeGVsLXJhdGlvIjoyLCJ2ZXJ0aWNhbCI6eyJ3aWR0aCI6MzYwLCJoZWlnaHQiOjY0MH19LCJjYXBhYmlsaXRpZXMiOlsidG91Y2giLCJtb2JpbGUiXSwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjE7IGVuLXVzOyBHVC1ONzEwMCBCdWlsZC9KUk8wM0MpIEFwcGxlV2ViS2l0LzUzNC4zMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTM0LjMwIiwidHlwZSI6InBob25lIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJMYXB0b3Agd2l0aCB0b3VjaCIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjoxMjgwLCJoZWlnaHQiOjk1MH0sImRldmljZS1waXhlbC1yYXRpbyI6MSwidmVydGljYWwiOnsid2lkdGgiOjk1MCwiaGVpZ2h0IjoxMjgwfX0sImNhcGFiaWxpdGllcyI6WyJ0b3VjaCJdLCJ1c2VyLWFnZW50IjoiIiwidHlwZSI6Im5vdGVib29rIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJMYXB0b3Agd2l0aCBIaURQSSBzY3JlZW4iLCJzY3JlZW4iOnsiaG9yaXpvbnRhbCI6eyJ3aWR0aCI6MTQ0MCwiaGVpZ2h0Ijo5MDB9LCJkZXZpY2UtcGl4ZWwtcmF0aW8iOjIsInZlcnRpY2FsIjp7IndpZHRoIjo5MDAsImhlaWdodCI6MTQ0MH19LCJjYXBhYmlsaXRpZXMiOltdLCJ1c2VyLWFnZW50IjoiIiwidHlwZSI6Im5vdGVib29rIn0sInR5cGUiOiJlbXVsYXRlZC1kZXZpY2UifSx7ImRldmljZSI6eyJzaG93LWJ5LWRlZmF1bHQiOmZhbHNlLCJtb2RlcyI6W3siaW5zZXRzIjp7InRvcCI6MCwicmlnaHQiOjAsImJvdHRvbSI6MCwibGVmdCI6MH0sIm9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCIsInRpdGxlIjoiZGVmYXVsdCJ9XSwidGl0bGUiOiJMYXB0b3Agd2l0aCBNRFBJIHNjcmVlbiIsInNjcmVlbiI6eyJob3Jpem9udGFsIjp7IndpZHRoIjoxMjgwLCJoZWlnaHQiOjgwMH0sImRldmljZS1waXhlbC1yYXRpbyI6MSwidmVydGljYWwiOnsid2lkdGgiOjgwMCwiaGVpZ2h0IjoxMjgwfX0sImNhcGFiaWxpdGllcyI6W10sInVzZXItYWdlbnQiOiIiLCJ0eXBlIjoibm90ZWJvb2sifSwidHlwZSI6ImVtdWxhdGVkLWRldmljZSJ9XSwibmFtZSI6ImVtdWxhdGVkX2RldmljZXMiLCJzY3JpcHRzIjpbXX0seyJkZXBlbmRlbmNpZXMiOlsiY29tbW9uIiwicHJvZHVjdF9yZWdpc3RyeSJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJQcm9kdWN0UmVnaXN0cnlJbXBsLlJlZ2lzdHJ5IiwidHlwZSI6IkBQcm9kdWN0UmVnaXN0cnkuUmVnaXN0cnkifV0sIm5hbWUiOiJwcm9kdWN0X3JlZ2lzdHJ5X2ltcGwiLCJzY3JpcHRzIjpbInByb2R1Y3RfcmVnaXN0cnlfaW1wbF9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsibGF5ZXJfdmlld2VyIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiTGF5ZXJzIiwiaWQiOiJsYXllcnMiLCJjbGFzc05hbWUiOiJMYXllcnMuTGF5ZXJzUGFuZWwiLCJsb2NhdGlvbiI6InBhbmVsIiwidHlwZSI6InZpZXciLCJvcmRlciI6MTAwLCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9XSwibmFtZSI6ImxheWVycyIsInNjcmlwdHMiOlsibGF5ZXJzX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJicm93c2VyX3NkayJdLCJuYW1lIjoiaGFyX2ltcG9ydGVyIiwic2NyaXB0cyI6WyJoYXJfaW1wb3J0ZXJfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInNlYXJjaCIsInNvdXJjZV9mcmFtZSIsImNvbXBvbmVudHMiLCJwZXJmX3VpIiwiY29va2llX3RhYmxlIiwiZGF0YV9ncmlkIiwiYnJvd3Nlcl9zZGsiLCJwcm9kdWN0X3JlZ2lzdHJ5IiwibW9iaWxlX3Rocm90dGxpbmciLCJoYXJfaW1wb3J0ZXIiLCJwZXJzaXN0ZW5jZSJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6Ik5ldHdvcmsiLCJpZCI6Im5ldHdvcmsiLCJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo0MH0seyJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5Db250ZXh0TWVudVByb3ZpZGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5OZXR3b3JrUmVxdWVzdCIsIlNESy5SZXNvdXJjZSIsIldvcmtzcGFjZS5VSVNvdXJjZUNvZGUiXSwidHlwZSI6IkBVSS5Db250ZXh0TWVudS5Qcm92aWRlciJ9LHsiY2xhc3NOYW1lIjoiTmV0d29yay5OZXR3b3JrUGFuZWwuUmVxdWVzdFJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5OZXR3b3JrUmVxdWVzdCJdLCJkZXN0aW5hdGlvbiI6Ik5ldHdvcmsgcGFuZWwiLCJ0eXBlIjoiQENvbW1vbi5SZXZlYWxlciJ9LHsiY2xhc3NOYW1lIjoiTmV0d29yay5OZXR3b3JrUGFuZWwuUmVxdWVzdExvY2F0aW9uUmV2ZWFsZXIiLCJjb250ZXh0VHlwZXMiOlsiTmV0d29yay5VSVJlcXVlc3RMb2NhdGlvbiJdLCJ0eXBlIjoiQENvbW1vbi5SZXZlYWxlciJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGl0bGUiOiJDb2xvci1jb2RlIHJlc291cmNlIHR5cGVzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwidGFncyI6ImNvbG9yIGNvZGUsIHJlc291cmNlIHR5cGUiLCJzZXR0aW5nTmFtZSI6Im5ldHdvcmtDb2xvckNvZGVSZXNvdXJjZVR5cGVzIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJDb2xvciBjb2RlIGJ5IHJlc291cmNlIHR5cGUifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJVc2UgZGVmYXVsdCBjb2xvcnMifV19LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGl0bGUiOiJHcm91cCBuZXR3b3JrIGxvZyBieSBmcmFtZSIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInRhZ3MiOiJuZXR3b3JrLCBmcmFtZSwgZ3JvdXAiLCJzZXR0aW5nTmFtZSI6Im5ldHdvcmsuZ3JvdXAtYnktZnJhbWUiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6Ikdyb3VwIG5ldHdvcmsgbG9nIGl0ZW1zIGJ5IGZyYW1lIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG9uJ3QgZ3JvdXAgbmV0d29yayBsb2cgaXRlbXMgYnkgZnJhbWUifV19LHsiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0YXJ0LXJlY29yZGluZyIsInRvZ2dsZWRJY29uQ2xhc3MiOiJsYXJnZWljb24tc3RvcC1yZWNvcmRpbmciLCJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsInRvZ2dsZVdpdGhSZWRDb2xvciI6dHJ1ZSwiYWN0aW9uSWQiOiJuZXR3b3JrLnRvZ2dsZS1yZWNvcmRpbmciLCJjb250ZXh0VHlwZXMiOlsiTmV0d29yay5OZXR3b3JrUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtFIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStFIn1dLCJ0eXBlIjoiYWN0aW9uIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiUmVjb3JkIG5ldHdvcmsgbG9nIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiU3RvcCByZWNvcmRpbmcgbmV0d29yayBsb2cifV19LHsiY2xhc3NOYW1lIjoiTmV0d29yay5OZXR3b3JrUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiTmV0d29yay5OZXR3b3JrUGFuZWwiXSwiYmluZGluZ3MiOlt7InNob3J0Y3V0IjoiRXNjIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJuZXR3b3JrLmhpZGUtcmVxdWVzdC1kZXRhaWxzIn0seyJ0aXRsZSI6IlJlcXVlc3QgYmxvY2tpbmciLCJpZCI6Im5ldHdvcmsuYmxvY2tlZC11cmxzIiwiY2xhc3NOYW1lIjoiTmV0d29yay5CbG9ja2VkVVJMc1BhbmUiLCJsb2NhdGlvbiI6ImRyYXdlci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6NjAsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn0seyJ0aXRsZSI6Ik5ldHdvcmsgY29uZGl0aW9ucyIsInRhZ3MiOiJkaXNrIGNhY2hlLCBuZXR3b3JrIHRocm90dGxpbmcsIHVzZXJhZ2VudCwgdXNlciBhZ2VudCIsImlkIjoibmV0d29yay5jb25maWciLCJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtDb25maWdWaWV3IiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjQwLCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwiY2xhc3NOYW1lIjoiTmV0d29yay5OZXR3b3JrUGFuZWwiLCJ0eXBlIjoiQFVJLlZpZXdMb2NhdGlvblJlc29sdmVyIiwibmFtZSI6Im5ldHdvcmstc2lkZWJhciJ9LHsidGl0bGUiOiJTZWFyY2giLCJjbGFzc05hbWUiOiJOZXR3b3JrLlNlYXJjaE5ldHdvcmtWaWV3IiwibG9jYXRpb24iOiJuZXR3b3JrLXNpZGViYXIiLCJ0eXBlIjoidmlldyIsImlkIjoibmV0d29yay5zZWFyY2gtbmV0d29yay10YWIiLCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsiY2F0ZWdvcnkiOiJEZXZUb29scyIsInRpdGxlIjoiU2VhcmNoIiwiY2xhc3NOYW1lIjoiTmV0d29yay5OZXR3b3JrUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiTmV0d29yay5OZXR3b3JrUGFuZWwiXSwiYWN0aW9uSWQiOiJuZXR3b3JrLnNlYXJjaCIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStGIn0seyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrRiJ9XSwidHlwZSI6ImFjdGlvbiJ9XSwibmFtZSI6Im5ldHdvcmsiLCJzY3JpcHRzIjpbIm5ldHdvcmtfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImJyb3dzZXJfc2RrIiwiY29tcG9uZW50cyJdLCJuYW1lIjoiYnJvd3Nlcl9jb21wb25lbnRzIn0seyJkZXBlbmRlbmNpZXMiOlsiZWxlbWVudHMiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJBbmltYXRpb25zIiwiaWQiOiJhbmltYXRpb25zIiwiY2xhc3NOYW1lIjoiQW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lIiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjAsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn1dLCJuYW1lIjoiYW5pbWF0aW9uIiwic2NyaXB0cyI6WyJhbmltYXRpb25fbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInNvdXJjZV9mcmFtZSIsImNvb2tpZV90YWJsZSIsImlubGluZV9lZGl0b3IiLCJkYXRhX2dyaWQiLCJjb21wb25lbnRzIiwib2JqZWN0X3VpIiwicGVyZl91aSIsIm1vYmlsZV90aHJvdHRsaW5nIiwibmV0d29yayIsInNvdXJjZXMiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJBcHBsaWNhdGlvbiIsImlkIjoicmVzb3VyY2VzIiwiY2xhc3NOYW1lIjoiUmVzb3VyY2VzLlJlc291cmNlc1BhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcwfSx7ImNsYXNzTmFtZSI6IlJlc291cmNlcy5SZXNvdXJjZXNQYW5lbC5SZXNvdXJjZVJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5SZXNvdXJjZSJdLCJkZXN0aW5hdGlvbiI6IkFwcGxpY2F0aW9uIHBhbmVsIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifV0sIm5hbWUiOiJyZXNvdXJjZXMiLCJzY3JpcHRzIjpbInJlc291cmNlc19tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiYnJvd3Nlcl9zZGsiLCJjb25zb2xlIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IkJyb3dzZXJDb25zb2xlLkJyb3dzZXJDb25zb2xlIiwiY29udGV4dFR5cGVzIjpbIlNESy5Db25zb2xlTWVzc2FnZSJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjbGFzc05hbWUiOiJCcm93c2VyQ29uc29sZS5Ccm93c2VyQ29uc29sZSIsImNvbnRleHRUeXBlcyI6WyJTREsuQ29uc29sZU1lc3NhZ2UiXSwidHlwZSI6IkBDb21tb24uUmVuZGVyZXIiLCJzb3VyY2UiOiJuZXR3b3JrIn1dLCJuYW1lIjoiYnJvd3Nlcl9jb25zb2xlIiwic2NyaXB0cyI6WyJicm93c2VyX2NvbnNvbGVfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImJyb3dzZXJfY29tcG9uZW50cyIsImV4dGVuc2lvbnMiLCJpbmxpbmVfZWRpdG9yIiwiY29sb3JfcGlja2VyIiwiZXZlbnRfbGlzdGVuZXJzIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiRWxlbWVudHMiLCJpZCI6ImVsZW1lbnRzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxMH0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1BhbmVsLkNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLlJlbW90ZU9iamVjdCIsIlNESy5ET01Ob2RlIiwiU0RLLkRlZmVycmVkRE9NTm9kZSJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlJlbmRlcmVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5ET01Ob2RlIiwiU0RLLkRlZmVycmVkRE9NTm9kZSJdLCJ0eXBlIjoiQENvbW1vbi5SZW5kZXJlciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbC5ET01Ob2RlUmV2ZWFsZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRPTU5vZGUiLCJTREsuRGVmZXJyZWRET01Ob2RlIiwiU0RLLlJlbW90ZU9iamVjdCJdLCJkZXN0aW5hdGlvbiI6IkVsZW1lbnRzIHBhbmVsIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkRPTUxpbmtpZmllci5MaW5raWZpZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRPTU5vZGUiLCJTREsuRGVmZXJyZWRET01Ob2RlIl0sInR5cGUiOiJAQ29tbW9uLkxpbmtpZmllciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbC5DU1NQcm9wZXJ0eVJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5DU1NQcm9wZXJ0eSJdLCJkZXN0aW5hdGlvbiI6InN0eWxlcyBzaWRlYmFyIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifSx7ImNhdGVnb3J5IjoiRWxlbWVudHMiLCJ0aXRsZSI6IkNvbG9yIGZvcm1hdDoiLCJkZWZhdWx0VmFsdWUiOiJvcmlnaW5hbCIsIm9wdGlvbnMiOlt7InRleHQiOiJBcyBhdXRob3JlZCIsInZhbHVlIjoib3JpZ2luYWwiLCJ0aXRsZSI6IlNldCBjb2xvciBmb3JtYXQgYXMgYXV0aG9yZWQifSx7InJhdyI6dHJ1ZSwidGV4dCI6IkhFWDogI2RhYzBkZSIsInZhbHVlIjoiaGV4IiwidGl0bGUiOiJTZXQgY29sb3IgZm9ybWF0IHRvIEhFWCJ9LHsicmF3Ijp0cnVlLCJ0ZXh0IjoiUkdCOiByZ2IoMTI4LCAyNTUsIDI1NSkiLCJ2YWx1ZSI6InJnYiIsInRpdGxlIjoiU2V0IGNvbG9yIGZvcm1hdCB0byBSR0IifSx7InJhdyI6dHJ1ZSwidGV4dCI6IkhTTDogaHNsKDMwMCwgODAlLCA5MCUpIiwidmFsdWUiOiJoc2wiLCJ0aXRsZSI6IlNldCBjb2xvciBmb3JtYXQgdG8gSFNMIn1dLCJzZXR0aW5nTmFtZSI6ImNvbG9yRm9ybWF0Iiwic2V0dGluZ1R5cGUiOiJlbnVtIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MH0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJTaG93IHVzZXIgYWdlbnQgc2hhZG93IERPTSIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoic2hvd1VBU2hhZG93RE9NIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MX0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJXb3JkIHdyYXAiLCJkZWZhdWx0VmFsdWUiOnRydWUsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkVuYWJsZSBET00gd29yZCB3cmFwIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRGlzYWJsZSBET00gd29yZCB3cmFwIn1dLCJzZXR0aW5nTmFtZSI6ImRvbVdvcmRXcmFwIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6Mn0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJTaG93IEhUTUwgY29tbWVudHMiLCJkZWZhdWx0VmFsdWUiOnRydWUsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgSFRNTCBjb21tZW50cyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkhpZGUgSFRNTCBjb21tZW50cyJ9XSwic2V0dGluZ05hbWUiOiJzaG93SFRNTENvbW1lbnRzIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6M30seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJSZXZlYWwgRE9NIG5vZGUgb24gaG92ZXIiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiaGlnaGxpZ2h0Tm9kZU9uSG92ZXJJbk92ZXJsYXkiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9yZGVyIjo0fSx7ImRlZmF1bHRWYWx1ZSI6dHJ1ZSwidHlwZSI6InNldHRpbmciLCJzZXR0aW5nTmFtZSI6InNob3dFdmVudExpc3RlbmVyc0ZvckFuY2VzdG9ycyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudFN0YXRlUGFuZVdpZGdldC5CdXR0b25Qcm92aWRlciIsInR5cGUiOiJAVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIiLCJvcmRlciI6MSwibG9jYXRpb24iOiJzdHlsZXMtc2lkZWJhcnBhbmUtdG9vbGJhciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuQ2xhc3Nlc1BhbmVXaWRnZXQuQnV0dG9uUHJvdmlkZXIiLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwib3JkZXIiOjIsImxvY2F0aW9uIjoic3R5bGVzLXNpZGViYXJwYW5lLXRvb2xiYXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lLkJ1dHRvblByb3ZpZGVyIiwidHlwZSI6IkBVSS5Ub29sYmFySXRlbS5Qcm92aWRlciIsIm9yZGVyIjoxMDAsImxvY2F0aW9uIjoic3R5bGVzLXNpZGViYXJwYW5lLXRvb2xiYXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkVsZW1lbnRzQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiRWxlbWVudHMuRWxlbWVudHNQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJIIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy5oaWRlLWVsZW1lbnQifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkVsZW1lbnRzQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiRWxlbWVudHMuRWxlbWVudHNQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJGMiJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiZWxlbWVudHMuZWRpdC1hcy1odG1sIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIkVsZW1lbnRzLkVsZW1lbnRzUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtaIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStaIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy51bmRvIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIkVsZW1lbnRzLkVsZW1lbnRzUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtZIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStTaGlmdCtaIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy5yZWRvIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1BhbmVsLlBzZXVkb1N0YXRlTWFya2VyRGVjb3JhdG9yIiwibWFya2VyIjoicHNldWRvLXN0YXRlLW1hcmtlciIsInR5cGUiOiJARWxlbWVudHMuTWFya2VyRGVjb3JhdG9yIn0seyJtYXJrZXIiOiJoaWRkZW4tbWFya2VyIiwiZmFjdG9yeU5hbWUiOiJFbGVtZW50cy5HZW5lcmljRGVjb3JhdG9yIiwidHlwZSI6IkBFbGVtZW50cy5NYXJrZXJEZWNvcmF0b3IiLCJjb2xvciI6IiM1NTUiLCJ0aXRsZSI6IkVsZW1lbnQgaXMgaGlkZGVuIn0seyJpY29uQ2xhc3MiOiJsYXJnZWljb24tbm9kZS1zZWFyY2giLCJ0aXRsZSI6IlNlbGVjdCBhbiBlbGVtZW50IGluIHRoZSBwYWdlIHRvIGluc3BlY3QgaXQiLCJjbGFzc05hbWUiOiJFbGVtZW50cy5JbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyLlRvZ2dsZVNlYXJjaEFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2giLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK1NoaWZ0K0MifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK1NoaWZ0K0MifV0sInR5cGUiOiJhY3Rpb24ifSx7Im9yZGVyIjowLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwiYWN0aW9uSWQiOiJlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2giLCJsb2NhdGlvbiI6Im1haW4tdG9vbGJhci1sZWZ0In0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbCIsInR5cGUiOiJAVUkuVmlld0xvY2F0aW9uUmVzb2x2ZXIiLCJuYW1lIjoiZWxlbWVudHMtc2lkZWJhciJ9LHsidGl0bGUiOiJFdmVudCBMaXN0ZW5lcnMiLCJpZCI6ImVsZW1lbnRzLmV2ZW50TGlzdGVuZXJzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQiLCJsb2NhdGlvbiI6ImVsZW1lbnRzLXNpZGViYXIiLCJoYXNUb29sYmFyIjp0cnVlLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo1LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJQcm9wZXJ0aWVzIiwiaWQiOiJlbGVtZW50cy5kb21Qcm9wZXJ0aWVzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuUHJvcGVydGllc1dpZGdldCIsImxvY2F0aW9uIjoiZWxlbWVudHMtc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In1dLCJuYW1lIjoiZWxlbWVudHMiLCJzY3JpcHRzIjpbImVsZW1lbnRzX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJzZGsiLCJ1aSIsInByb3RvY29sIl0sImV4dGVuc2lvbnMiOlt7ImRlZmF1bHRWYWx1ZSI6W10sInR5cGUiOiJzZXR0aW5nIiwic2V0dGluZ05hbWUiOiJjdXN0b21OZXR3b3JrQ29uZGl0aW9ucyIsInNldHRpbmdUeXBlIjoiYXJyYXkifSx7ImNhdGVnb3J5IjoiTmV0d29yayIsInRhZ3MiOiJkZXZpY2UsIHRocm90dGxpbmciLCJ0aXRsZSI6IkdvIG9mZmxpbmUiLCJjbGFzc05hbWUiOiJNb2JpbGVUaHJvdHRsaW5nLlRocm90dGxpbmdNYW5hZ2VyLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJuZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1vZmZsaW5lIiwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGFncyI6ImRldmljZSwgdGhyb3R0bGluZyIsInRpdGxlIjoiRW5hYmxlIHNsb3cgM0cgdGhyb3R0bGluZyIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLWxvdy1lbmQtbW9iaWxlIiwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGFncyI6ImRldmljZSwgdGhyb3R0bGluZyIsInRpdGxlIjoiRW5hYmxlIGZhc3QgM0cgdGhyb3R0bGluZyIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLW1pZC10aWVyLW1vYmlsZSIsInR5cGUiOiJhY3Rpb24ifSx7ImNhdGVnb3J5IjoiTmV0d29yayIsInRhZ3MiOiJkZXZpY2UsIHRocm90dGxpbmciLCJ0aXRsZSI6IkdvIG9ubGluZSIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLW9ubGluZSIsInR5cGUiOiJhY3Rpb24ifSx7InRpdGxlIjoiVGhyb3R0bGluZyIsInNldHRpbmdzIjpbImN1c3RvbU5ldHdvcmtDb25kaXRpb25zIl0sImlkIjoidGhyb3R0bGluZy1jb25kaXRpb25zIiwiY2xhc3NOYW1lIjoiTW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nU2V0dGluZ3NUYWIiLCJsb2NhdGlvbiI6InNldHRpbmdzLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjozNX1dLCJuYW1lIjoibW9iaWxlX3Rocm90dGxpbmcifSx7ImRlcGVuZGVuY2llcyI6WyJicm93c2VyX2NvbXBvbmVudHMiLCJsYXllcl92aWV3ZXIiLCJ0aW1lbGluZV9tb2RlbCIsInBlcmZfdWkiLCJleHRlbnNpb25zIiwiZGF0YV9ncmlkIiwicHJvZHVjdF9yZWdpc3RyeSIsInByb2ZpbGVyIiwibW9iaWxlX3Rocm90dGxpbmciXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJQZXJmb3JtYW5jZSIsImlkIjoidGltZWxpbmUiLCJjbGFzc05hbWUiOiJUaW1lbGluZS5UaW1lbGluZVBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjUwfSx7ImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0aXRsZSI6IkhpZGUgY2hyb21lIGZyYW1lIGluIExheWVycyB2aWV3IiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJmcmFtZVZpZXdlckhpZGVDaHJvbWVXaW5kb3ciLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyJ9LHsiY2xhc3NOYW1lIjoiVGltZWxpbmUuTG9hZFRpbWVsaW5lSGFuZGxlciIsInR5cGUiOiJAQ29tbW9uLlF1ZXJ5UGFyYW1IYW5kbGVyIiwibmFtZSI6ImxvYWRUaW1lbGluZUZyb21VUkwifSx7Im9yZGVyIjoxMCwidHlwZSI6ImNvbnRleHQtbWVudS1pdGVtIiwibG9jYXRpb24iOiJ0aW1lbGluZU1lbnUvb3BlbiIsImFjdGlvbklkIjoidGltZWxpbmUubG9hZC1mcm9tLWZpbGUifSx7Im9yZGVyIjoxNSwidHlwZSI6ImNvbnRleHQtbWVudS1pdGVtIiwibG9jYXRpb24iOiJ0aW1lbGluZU1lbnUvb3BlbiIsImFjdGlvbklkIjoidGltZWxpbmUuc2F2ZS10by1maWxlIn0seyJpY29uQ2xhc3MiOiJsYXJnZWljb24tc3RhcnQtcmVjb3JkaW5nIiwidG9nZ2xlZEljb25DbGFzcyI6ImxhcmdlaWNvbi1zdG9wLXJlY29yZGluZyIsImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJ0b2dnbGVXaXRoUmVkQ29sb3IiOnRydWUsImFjdGlvbklkIjoidGltZWxpbmUudG9nZ2xlLXJlY29yZGluZyIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrRSJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErRSJ9XSwidHlwZSI6ImFjdGlvbiIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlJlY29yZCJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IlN0b3AifV19LHsiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXJlZnJlc2giLCJjYXRlZ29yeSI6IlBlcmZvcm1hbmNlIiwidGl0bGUiOiJTdGFydCBwcm9maWxpbmcgYW5kIHJlbG9hZCBwYWdlIiwiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImFjdGlvbklkIjoidGltZWxpbmUucmVjb3JkLXJlbG9hZCIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrRSJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErU2hpZnQrRSJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJUaW1lbGluZSIsInRpdGxlIjoiU2F2ZSBwcm9maWxlXHUyMDI2IiwiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImFjdGlvbklkIjoidGltZWxpbmUuc2F2ZS10by1maWxlIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtTIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStTIn1dLCJ0eXBlIjoiYWN0aW9uIn0seyJjYXRlZ29yeSI6IlRpbWVsaW5lIiwidGl0bGUiOiJMb2FkIHByb2ZpbGVcdTIwMjYiLCJjbGFzc05hbWUiOiJUaW1lbGluZS5UaW1lbGluZVBhbmVsLkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwiXSwiYWN0aW9uSWQiOiJ0aW1lbGluZS5sb2FkLWZyb20tZmlsZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrTyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErTyJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IlsifV0sInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6InRpbWVsaW5lLmp1bXAtdG8tcHJldmlvdXMtZnJhbWUifSx7ImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJdIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJ0aW1lbGluZS5qdW1wLXRvLW5leHQtZnJhbWUifSx7ImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0aXRsZSI6IlNob3cgcmVjZW50IHRpbWVsaW5lIHNlc3Npb25zIiwiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImFjdGlvbklkIjoidGltZWxpbmUuc2hvdy1oaXN0b3J5IiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtIIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStZIn1dLCJ0eXBlIjoiYWN0aW9uIn0seyJ0aXRsZSI6IkphdmFTY3JpcHQgUHJvZmlsZXIiLCJpZCI6ImpzX3Byb2ZpbGVyIiwiY2xhc3NOYW1lIjoiUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjY1LCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9LHsiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkFsdCtMZWZ0In0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStMZWZ0In1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJ0aW1lbGluZS5wcmV2aW91cy1yZWNvcmRpbmcifSx7ImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJBbHQrUmlnaHQifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK1JpZ2h0In1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJ0aW1lbGluZS5uZXh0LXJlY29yZGluZyJ9XSwibmFtZSI6InRpbWVsaW5lIiwic2NyaXB0cyI6WyJ0aW1lbGluZV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiZWxlbWVudHMiLCJzb3VyY2VzIiwiY29uc29sZSJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IkV2ZW50IExpc3RlbmVyIEJyZWFrcG9pbnRzIiwiaWQiOiJzb3VyY2VzLmV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyIsImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5FdmVudExpc3RlbmVyQnJlYWtwb2ludHNTaWRlYmFyUGFuZSIsImxvY2F0aW9uIjoic291cmNlcy1zaWRlYmFyIiwidHlwZSI6InZpZXciLCJvcmRlciI6OSwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7ImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5YSFJCcmVha3BvaW50c1NpZGViYXJQYW5lIiwiY29udGV4dFR5cGVzIjpbIlNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHMiXSwidHlwZSI6IkBVSS5Db250ZXh0Rmxhdm9yTGlzdGVuZXIifSx7InRpdGxlIjoiWEhSL2ZldGNoIEJyZWFrcG9pbnRzIiwiaWQiOiJzb3VyY2VzLnhockJyZWFrcG9pbnRzIiwiY2xhc3NOYW1lIjoiQnJvd3NlckRlYnVnZ2VyLlhIUkJyZWFrcG9pbnRzU2lkZWJhclBhbmUiLCJsb2NhdGlvbiI6InNvdXJjZXMtc2lkZWJhciIsImhhc1Rvb2xiYXIiOnRydWUsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjUsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJ0aXRsZSI6IkRPTSBCcmVha3BvaW50cyIsImlkIjoic291cmNlcy5kb21CcmVha3BvaW50cyIsImZhY3RvcnlOYW1lIjoiQnJvd3NlckRlYnVnZ2VyLkRPTUJyZWFrcG9pbnRzU2lkZWJhclBhbmUiLCJsb2NhdGlvbiI6InNvdXJjZXMtc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJ0aXRsZSI6IkRPTSBCcmVha3BvaW50cyIsImlkIjoiZWxlbWVudHMuZG9tQnJlYWtwb2ludHMiLCJmYWN0b3J5TmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5ET01CcmVha3BvaW50c1NpZGViYXJQYW5lIiwibG9jYXRpb24iOiJlbGVtZW50cy1zaWRlYmFyIiwidHlwZSI6InZpZXciLCJvcmRlciI6NiwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7Im1hcmtlciI6ImJyZWFrcG9pbnQtbWFya2VyIiwiZmFjdG9yeU5hbWUiOiJFbGVtZW50cy5HZW5lcmljRGVjb3JhdG9yIiwidHlwZSI6IkBFbGVtZW50cy5NYXJrZXJEZWNvcmF0b3IiLCJjb2xvciI6InJnYigxMDUsIDE0MCwgMjU0KSIsInRpdGxlIjoiRE9NIEJyZWFrcG9pbnQifSx7ImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5ET01CcmVha3BvaW50c1NpZGViYXJQYW5lLkNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRPTU5vZGUiXSwidHlwZSI6IkBVSS5Db250ZXh0TWVudS5Qcm92aWRlciJ9LHsiY2xhc3NOYW1lIjoiQnJvd3NlckRlYnVnZ2VyLkRPTUJyZWFrcG9pbnRzU2lkZWJhclBhbmUiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyJdLCJ0eXBlIjoiQFVJLkNvbnRleHRGbGF2b3JMaXN0ZW5lciJ9LHsidGl0bGUiOiJHbG9iYWwgTGlzdGVuZXJzIiwiaWQiOiJzb3VyY2VzLmdsb2JhbExpc3RlbmVycyIsImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5PYmplY3RFdmVudExpc3RlbmVyc1NpZGViYXJQYW5lIiwibG9jYXRpb24iOiJzb3VyY2VzLXNpZGViYXIiLCJoYXNUb29sYmFyIjp0cnVlLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo4LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJQYWdlIiwiaWQiOiJuYXZpZ2F0b3ItbmV0d29yayIsImNsYXNzTmFtZSI6IlNvdXJjZXMuTmV0d29ya05hdmlnYXRvclZpZXciLCJsb2NhdGlvbiI6Im5hdmlnYXRvci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6MiwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7InRpdGxlIjoiT3ZlcnJpZGVzIiwiaWQiOiJuYXZpZ2F0b3Itb3ZlcnJpZGVzIiwiY2xhc3NOYW1lIjoiU291cmNlcy5PdmVycmlkZXNOYXZpZ2F0b3JWaWV3IiwibG9jYXRpb24iOiJuYXZpZ2F0b3ItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjQsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJ0aXRsZSI6IkNvbnRlbnQgc2NyaXB0cyIsImlkIjoibmF2aWdhdG9yLWNvbnRlbnRTY3JpcHRzIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Db250ZW50U2NyaXB0c05hdmlnYXRvclZpZXciLCJsb2NhdGlvbiI6Im5hdmlnYXRvci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6NSwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuT3ZlcnJpZGVzTmF2aWdhdG9yVmlldyIsInZpZXdJZCI6Im5hdmlnYXRvci1vdmVycmlkZXMiLCJ0eXBlIjoiQFNvdXJjZXMuTmF2aWdhdG9yVmlldyJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Db250ZW50U2NyaXB0c05hdmlnYXRvclZpZXciLCJ2aWV3SWQiOiJuYXZpZ2F0b3ItY29udGVudFNjcmlwdHMiLCJ0eXBlIjoiQFNvdXJjZXMuTmF2aWdhdG9yVmlldyJ9XSwibmFtZSI6ImJyb3dzZXJfZGVidWdnZXIiLCJzY3JpcHRzIjpbImJyb3dzZXJfZGVidWdnZXJfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImJpbmRpbmdzIiwiY29tcG9uZW50cyIsInBsYXRmb3JtIiwidWkiLCJtb2JpbGVfdGhyb3R0bGluZyJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJFbXVsYXRpb24uQWR2YW5jZWRBcHBQcm92aWRlciIsInR5cGUiOiJAQ29tbW9uLkFwcFByb3ZpZGVyIiwib3JkZXIiOjAsImNvbmRpdGlvbiI6ImNhbl9kb2NrIn0seyJjYXRlZ29yeSI6Ik1vYmlsZSIsImljb25DbGFzcyI6ImxhcmdlaWNvbi1waG9uZSIsInRpdGxlIjoiVG9nZ2xlIGRldmljZSB0b29sYmFyIiwiY2xhc3NOYW1lIjoiRW11bGF0aW9uLkRldmljZU1vZGVXcmFwcGVyLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJlbXVsYXRpb24udG9nZ2xlLWRldmljZS1tb2RlIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiU2hpZnQrQ3RybCtNIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiU2hpZnQrTWV0YStNIn1dLCJ0eXBlIjoiYWN0aW9uIiwiY29uZGl0aW9uIjoiY2FuX2RvY2sifSx7ImNhdGVnb3J5IjoiTW9iaWxlIiwidGFncyI6ImRldmljZSIsInRpdGxlIjoiQ2FwdHVyZSBzY3JlZW5zaG90IiwiY2xhc3NOYW1lIjoiRW11bGF0aW9uLkRldmljZU1vZGVXcmFwcGVyLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJlbXVsYXRpb24uY2FwdHVyZS1zY3JlZW5zaG90IiwidHlwZSI6ImFjdGlvbiJ9LHsiYWN0aW9uSWQiOiJlbXVsYXRpb24uY2FwdHVyZS1zY3JlZW5zaG90IiwidHlwZSI6ImNvbnRleHQtbWVudS1pdGVtIiwibG9jYXRpb24iOiJkZXZpY2VNb2RlTWVudS9zYXZlIiwib3JkZXIiOjEyfSx7Im9yZGVyIjoxLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwiYWN0aW9uSWQiOiJlbXVsYXRpb24udG9nZ2xlLWRldmljZS1tb2RlIiwiY29uZGl0aW9uIjoiY2FuX2RvY2siLCJsb2NhdGlvbiI6Im1haW4tdG9vbGJhci1sZWZ0In0seyJjYXRlZ29yeSI6Ik1vYmlsZSIsInRhZ3MiOiJkZXZpY2UiLCJ0aXRsZSI6IkNhcHR1cmUgZnVsbCBzaXplIHNjcmVlbnNob3QiLCJjbGFzc05hbWUiOiJFbXVsYXRpb24uRGV2aWNlTW9kZVdyYXBwZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6ImVtdWxhdGlvbi5jYXB0dXJlLWZ1bGwtaGVpZ2h0LXNjcmVlbnNob3QiLCJ0eXBlIjoiYWN0aW9uIn0seyJjYXRlZ29yeSI6Ik1vYmlsZSIsInRhZ3MiOiJkZXZpY2UiLCJ0aXRsZSI6IkNhcHR1cmUgbm9kZSBzY3JlZW5zaG90IiwiY2xhc3NOYW1lIjoiRW11bGF0aW9uLkRldmljZU1vZGVXcmFwcGVyLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJlbXVsYXRpb24uY2FwdHVyZS1ub2RlLXNjcmVlbnNob3QiLCJ0eXBlIjoiYWN0aW9uIn0seyJhY3Rpb25JZCI6ImVtdWxhdGlvbi5jYXB0dXJlLWZ1bGwtaGVpZ2h0LXNjcmVlbnNob3QiLCJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6ImRldmljZU1vZGVNZW51L3NhdmUiLCJvcmRlciI6MTN9LHsiY2F0ZWdvcnkiOiJNb2JpbGUiLCJ0YWdzIjoiZGV2aWNlIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJzaG93TWVkaWFRdWVyeUluc3BlY3RvciIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiU2hvdyBtZWRpYSBxdWVyaWVzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiSGlkZSBtZWRpYSBxdWVyaWVzIn1dfSx7ImNhdGVnb3J5IjoiTW9iaWxlIiwidGFncyI6ImRldmljZSIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoiZW11bGF0aW9uLnNob3dSdWxlcnMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgcnVsZXJzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiSGlkZSBydWxlcnMifV19LHsiY2F0ZWdvcnkiOiJNb2JpbGUiLCJ0YWdzIjoiZGV2aWNlIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJlbXVsYXRpb24uc2hvd0RldmljZU91dGxpbmUiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgZGV2aWNlIGZyYW1lIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiSGlkZSBkZXZpY2UgZnJhbWUifV19LHsidGl0bGUiOiJEZXZpY2VzIiwic2V0dGluZ3MiOlsic3RhbmRhcmRFbXVsYXRlZERldmljZUxpc3QiLCJjdXN0b21FbXVsYXRlZERldmljZUxpc3QiXSwiaWQiOiJkZXZpY2VzIiwiY2xhc3NOYW1lIjoiRW11bGF0aW9uLkRldmljZXNTZXR0aW5nc1RhYiIsImxvY2F0aW9uIjoic2V0dGluZ3MtdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjMwfSx7ImNsYXNzTmFtZSI6IkVtdWxhdGlvbi5TZW5zb3JzVmlldy5TaG93QWN0aW9uRGVsZWdhdGUiLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbXVsYXRpb24uc2hvdy1zZW5zb3JzIiwidGl0bGUiOiJTZW5zb3JzIn0seyJ0aXRsZSI6IlNlbnNvcnMiLCJ0YWdzIjoiZ2VvbG9jYXRpb24sIGFjY2VsZXJvbWV0ZXIsIGRldmljZSBvcmllbnRhdGlvbiIsImlkIjoic2Vuc29ycyIsImNsYXNzTmFtZSI6IkVtdWxhdGlvbi5TZW5zb3JzVmlldyIsImxvY2F0aW9uIjoiZHJhd2VyLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxMDAsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn1dLCJuYW1lIjoiZW11bGF0aW9uIn0seyJkZXBlbmRlbmNpZXMiOlsic2RrIiwidWkiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJQZXJmb3JtYW5jZSBtb25pdG9yIiwidGFncyI6InBlcmZvcm1hbmNlLCBzeXN0ZW0gbW9uaXRvciwgbW9uaXRvciwgYWN0aXZpdHksIG1ldHJpY3MiLCJpZCI6InBlcmZvcm1hbmNlLm1vbml0b3IiLCJjbGFzc05hbWUiOiJQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yIiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjEwMCwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifV0sIm5hbWUiOiJwZXJmb3JtYW5jZV9tb25pdG9yIiwic2NyaXB0cyI6WyJwZXJmb3JtYW5jZV9tb25pdG9yX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21wb25lbnRzIiwiZW11bGF0aW9uIiwidGltZWxpbmUiLCJpbnNwZWN0b3JfbWFpbiIsInNkayIsInNlcnZpY2VzIiwidWkiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJBdWRpdHMiLCJpZCI6ImF1ZGl0czIiLCJjbGFzc05hbWUiOiJBdWRpdHMyLkF1ZGl0czJQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo5MH1dLCJuYW1lIjoiYXVkaXRzMiIsInNjcmlwdHMiOlsiYXVkaXRzMl9tb2R1bGUuanMiXSwic2tpcF9jb21waWxhdGlvbiI6WyJsaWdodGhvdXNlL3JlbmRlcmVyL3V0aWwuanMiLCJsaWdodGhvdXNlL3JlbmRlcmVyL2RvbS5qcyIsImxpZ2h0aG91c2UvcmVuZGVyZXIvY2F0ZWdvcnktcmVuZGVyZXIuanMiLCJsaWdodGhvdXNlL3JlbmRlcmVyL3BlcmZvcm1hbmNlLWNhdGVnb3J5LXJlbmRlcmVyLmpzIiwibGlnaHRob3VzZS9yZW5kZXJlci9kZXRhaWxzLXJlbmRlcmVyLmpzIiwibGlnaHRob3VzZS9yZW5kZXJlci9jcmMtZGV0YWlscy1yZW5kZXJlci5qcyIsImxpZ2h0aG91c2UvcmVuZGVyZXIvcmVwb3J0LXJlbmRlcmVyLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInBsYXRmb3JtIiwidWkiLCJob3N0IiwiY29tcG9uZW50cyJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IlJlbW90ZSBkZXZpY2VzIiwidGFncyI6InVzYiwgYW5kcm9pZCwgbW9iaWxlIiwiaWQiOiJyZW1vdGUtZGV2aWNlcyIsImNsYXNzTmFtZSI6IkRldmljZXMuRGV2aWNlc1ZpZXciLCJsb2NhdGlvbiI6ImRyYXdlci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6NTAsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn1dLCJuYW1lIjoiZGV2aWNlcyIsInNjcmlwdHMiOlsiZGV2aWNlc19tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsic2RrIl0sIm5hbWUiOiJ0aW1lbGluZV9tb2RlbCIsInNjcmlwdHMiOlsidGltZWxpbmVfbW9kZWxfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiLCJtb2JpbGVfdGhyb3R0bGluZyJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJJbnNwZWN0b3JNYWluLkluc3BlY3Rvck1haW4iLCJ0eXBlIjoiZWFybHktaW5pdGlhbGl6YXRpb24ifSx7ImNhdGVnb3J5IjoiTmF2aWdhdGlvbiIsImljb25DbGFzcyI6ImxhcmdlaWNvbi1yZWZyZXNoIiwidGl0bGUiOiJSZWxvYWQgcGFnZSIsImNsYXNzTmFtZSI6Ikluc3BlY3Rvck1haW4uUmVsb2FkQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Imluc3BlY3Rvcl9tYWluLnJlbG9hZCIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkY1IEN0cmwrUiJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErUiJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJOYXZpZ2F0aW9uIiwidGl0bGUiOiJIYXJkIHJlbG9hZCBwYWdlIiwiY2xhc3NOYW1lIjoiSW5zcGVjdG9yTWFpbi5SZWxvYWRBY3Rpb25EZWxlZ2F0ZSIsImFjdGlvbklkIjoiaW5zcGVjdG9yX21haW4uaGFyZC1yZWxvYWQiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJTaGlmdCtGNSBDdHJsK0Y1IEN0cmwrU2hpZnQrRjUgU2hpZnQrQ3RybCtSIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiU2hpZnQrTWV0YStSIn1dLCJ0eXBlIjoiYWN0aW9uIn0seyJjbGFzc05hbWUiOiJJbnNwZWN0b3JNYWluLk5vZGVJbmRpY2F0b3IiLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwib3JkZXIiOjIsImxvY2F0aW9uIjoibWFpbi10b29sYmFyLWxlZnQifSx7ImNhdGVnb3J5IjoiTmV0d29yayIsInRpdGxlIjoiRm9yY2UgYWQgYmxvY2tpbmcgb24gdGhpcyBzaXRlIiwic3RvcmFnZVR5cGUiOiJzZXNzaW9uIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJuZXR3b3JrLmFkQmxvY2tpbmdFbmFibGVkIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJCbG9jayBhZHMgb24gdGhpcyBzaXRlIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiU2hvdyBhZHMgb24gdGhpcyBzaXRlLCBpZiBhbGxvd2VkIn1dfSx7ImNhdGVnb3J5IjoiRGV2VG9vbHMiLCJ0aXRsZSI6IkF1dG8tb3BlbiBEZXZUb29scyBmb3IgcG9wdXBzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiQXV0by1vcGVuIERldlRvb2xzIGZvciBwb3B1cHMifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEbyBub3QgYXV0by1vcGVuIERldlRvb2xzIGZvciBwb3B1cHMifV0sInNldHRpbmdOYW1lIjoiYXV0b0F0dGFjaFRvQ3JlYXRlZFBhZ2VzIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6Mn0seyJjYXRlZ29yeSI6IkFwcGVhcmFuY2UiLCJ0aXRsZSI6IkRvbid0IHNob3cgQ2hyb21lIERhdGEgU2F2ZXIgd2FybmluZyIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoiZGlzYWJsZURhdGFTYXZlckluZm9iYXIiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyJ9LHsiY2F0ZWdvcnkiOiJBcHBlYXJhbmNlIiwidGl0bGUiOiJEaXNhYmxlIHBhdXNlZCBzdGF0ZSBvdmVybGF5IiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJkaXNhYmxlUGF1c2VkU3RhdGVPdmVybGF5Iiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7InRpdGxlIjoiUmVuZGVyaW5nIiwiaWQiOiJyZW5kZXJpbmciLCJjbGFzc05hbWUiOiJJbnNwZWN0b3JNYWluLlJlbmRlcmluZ09wdGlvbnNWaWV3IiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjUwLCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9LHsiY2F0ZWdvcnkiOiJNb2JpbGUiLCJjbGFzc05hbWUiOiJJbnNwZWN0b3JNYWluLlJlcXVlc3RBcHBCYW5uZXJBY3Rpb25EZWxlZ2F0ZSIsInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6ImNvbXBvbmVudHMucmVxdWVzdC1hcHAtYmFubmVyIiwidGl0bGUiOiJBZGQgdG8gaG9tZXNjcmVlbiJ9XSwibmFtZSI6Imluc3BlY3Rvcl9tYWluIn0seyJkZXBlbmRlbmNpZXMiOlsibmV0d29yayIsInBsYXRmb3JtIiwidWkiLCJzZGsiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJTZWN1cml0eSIsImlkIjoic2VjdXJpdHkiLCJjbGFzc05hbWUiOiJTZWN1cml0eS5TZWN1cml0eVBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjgwfV0sIm5hbWUiOiJzZWN1cml0eSIsInNjcmlwdHMiOlsic2VjdXJpdHlfbW9kdWxlLmpzIl19XSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXMucHVzaCguLi5beyJuYW1lIjoiaGVscCJ9LHsidHlwZSI6InJlbW90ZSIsIm5hbWUiOiJhY2Nlc3NpYmlsaXR5In0seyJuYW1lIjoibGF5ZXJfdmlld2VyIn0seyJuYW1lIjoiY29va2llX3RhYmxlIn0seyJ0eXBlIjoicmVtb3RlIiwibmFtZSI6ImVtdWxhdGVkX2RldmljZXMifSx7InR5cGUiOiJyZW1vdGUiLCJuYW1lIjoicHJvZHVjdF9yZWdpc3RyeV9pbXBsIn0seyJuYW1lIjoibGF5ZXJzIn0seyJuYW1lIjoiaGFyX2ltcG9ydGVyIn0seyJuYW1lIjoibmV0d29yayJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJicm93c2VyX2NvbXBvbmVudHMifSx7Im5hbWUiOiJhbmltYXRpb24ifSx7Im5hbWUiOiJyZXNvdXJjZXMifSx7Im5hbWUiOiJicm93c2VyX2NvbnNvbGUifSx7Im5hbWUiOiJlbGVtZW50cyJ9LHsibmFtZSI6ImF1ZGl0czIifSx7Im5hbWUiOiJ0aW1lbGluZSJ9LHsibmFtZSI6ImJyb3dzZXJfZGVidWdnZXIifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiZW11bGF0aW9uIn0seyJuYW1lIjoic2VjdXJpdHkifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoibW9iaWxlX3Rocm90dGxpbmcifSx7Im5hbWUiOiJkZXZpY2VzIn0seyJuYW1lIjoidGltZWxpbmVfbW9kZWwifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiaW5zcGVjdG9yX21haW4ifSx7Im5hbWUiOiJwZXJmb3JtYW5jZV9tb25pdG9yIn1dKQpzZWxmWydCcm93c2VyQ29tcG9uZW50cyddPXNlbGZbJ0Jyb3dzZXJDb21wb25lbnRzJ118fHt9O0Jyb3dzZXJDb21wb25lbnRzLkltYWdlUHJldmlldz1jbGFzc3tzdGF0aWMgYnVpbGQodGFyZ2V0LG9yaWdpbmFsSW1hZ2VVUkwsc2hvd0RpbWVuc2lvbnMscHJlY29tcHV0ZWRGZWF0dXJlcyl7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7aWYoIXJlc291cmNlVHJlZU1vZGVsKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7bGV0IHJlc291cmNlPXJlc291cmNlVHJlZU1vZGVsLnJlc291cmNlRm9yVVJMKG9yaWdpbmFsSW1hZ2VVUkwpO2xldCBpbWFnZVVSTD1vcmlnaW5hbEltYWdlVVJMO2lmKCFpc0ltYWdlUmVzb3VyY2UocmVzb3VyY2UpJiZwcmVjb21wdXRlZEZlYXR1cmVzJiZwcmVjb21wdXRlZEZlYXR1cmVzLmN1cnJlbnRTcmMpe2ltYWdlVVJMPXByZWNvbXB1dGVkRmVhdHVyZXMuY3VycmVudFNyYztyZXNvdXJjZT1yZXNvdXJjZVRyZWVNb2RlbC5yZXNvdXJjZUZvclVSTChpbWFnZVVSTCk7fQppZighaXNJbWFnZVJlc291cmNlKHJlc291cmNlKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO2xldCBmdWxmaWxsO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UoeD0+ZnVsZmlsbD14KTtjb25zdCBpbWFnZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnaW1nJyk7aW1hZ2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGJ1aWxkQ29udGVudCxmYWxzZSk7aW1hZ2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywoKT0+ZnVsZmlsbChudWxsKSxmYWxzZSk7cmVzb3VyY2UucG9wdWxhdGVJbWFnZVNvdXJjZShpbWFnZUVsZW1lbnQpO3JldHVybiBwcm9taXNlO2Z1bmN0aW9uIGlzSW1hZ2VSZXNvdXJjZShyZXNvdXJjZSl7cmV0dXJuISFyZXNvdXJjZSYmcmVzb3VyY2UucmVzb3VyY2VUeXBlKCk9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZTt9CmZ1bmN0aW9uIGJ1aWxkQ29udGVudCgpe2NvbnN0IGNvbnRhaW5lcj1jcmVhdGVFbGVtZW50KCd0YWJsZScpO1VJLmFwcGVuZFN0eWxlKGNvbnRhaW5lciwnYnJvd3Nlcl9jb21wb25lbnRzL2ltYWdlUHJldmlldy5jc3MnKTtjb250YWluZXIuY2xhc3NOYW1lPSdpbWFnZS1wcmV2aWV3LWNvbnRhaW5lcic7Y29uc3QgbmF0dXJhbFdpZHRoPXByZWNvbXB1dGVkRmVhdHVyZXM/cHJlY29tcHV0ZWRGZWF0dXJlcy5uYXR1cmFsV2lkdGg6aW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aDtjb25zdCBuYXR1cmFsSGVpZ2h0PXByZWNvbXB1dGVkRmVhdHVyZXM/cHJlY29tcHV0ZWRGZWF0dXJlcy5uYXR1cmFsSGVpZ2h0OmltYWdlRWxlbWVudC5uYXR1cmFsSGVpZ2h0O2NvbnN0IG9mZnNldFdpZHRoPXByZWNvbXB1dGVkRmVhdHVyZXM/cHJlY29tcHV0ZWRGZWF0dXJlcy5vZmZzZXRXaWR0aDpuYXR1cmFsV2lkdGg7Y29uc3Qgb2Zmc2V0SGVpZ2h0PXByZWNvbXB1dGVkRmVhdHVyZXM/cHJlY29tcHV0ZWRGZWF0dXJlcy5vZmZzZXRIZWlnaHQ6bmF0dXJhbEhlaWdodDtsZXQgZGVzY3JpcHRpb247aWYoc2hvd0RpbWVuc2lvbnMpe2lmKG9mZnNldEhlaWdodD09PW5hdHVyYWxIZWlnaHQmJm9mZnNldFdpZHRoPT09bmF0dXJhbFdpZHRoKXtkZXNjcmlwdGlvbj1Db21tb24uVUlTdHJpbmcoJyVkIFx4ZDcgJWQgcGl4ZWxzJyxvZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQpO31lbHNle2Rlc2NyaXB0aW9uPUNvbW1vbi5VSVN0cmluZygnJWQgXHhkNyAlZCBwaXhlbHMgKE5hdHVyYWw6ICVkIFx4ZDcgJWQgcGl4ZWxzKScsb2Zmc2V0V2lkdGgsb2Zmc2V0SGVpZ2h0LG5hdHVyYWxXaWR0aCxuYXR1cmFsSGVpZ2h0KTt9fQpjb250YWluZXIuY3JlYXRlQ2hpbGQoJ3RyJykuY3JlYXRlQ2hpbGQoJ3RkJywnaW1hZ2UtY29udGFpbmVyJykuYXBwZW5kQ2hpbGQoaW1hZ2VFbGVtZW50KTtpZihkZXNjcmlwdGlvbikKY29udGFpbmVyLmNyZWF0ZUNoaWxkKCd0cicpLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZUNoaWxkKCdzcGFuJywnZGVzY3JpcHRpb24nKS50ZXh0Q29udGVudD1kZXNjcmlwdGlvbjtpZihpbWFnZVVSTCE9PW9yaWdpbmFsSW1hZ2VVUkwpe2NvbnRhaW5lci5jcmVhdGVDaGlsZCgndHInKS5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVDaGlsZCgnc3BhbicsJ2Rlc2NyaXB0aW9uJykudGV4dENvbnRlbnQ9U3RyaW5nLnNwcmludGYoJ2N1cnJlbnRTcmM6ICVzJyxpbWFnZVVSTC50cmltTWlkZGxlKDEwMCkpO30KZnVsZmlsbChjb250YWluZXIpO319fTs7c2VsZlsnTW9iaWxlVGhyb3R0bGluZyddPXNlbGZbJ01vYmlsZVRocm90dGxpbmcnXXx8e307TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXM9e05vVGhyb3R0bGluZzoxLE1pZFRpZXJNb2JpbGU6NCxMb3dFbmRNb2JpbGU6Nix9O01vYmlsZVRocm90dGxpbmcuQ29uZGl0aW9ucztNb2JpbGVUaHJvdHRsaW5nLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnM9e3RpdGxlOlNESy5OZXR3b3JrTWFuYWdlci5Ob1Rocm90dGxpbmdDb25kaXRpb25zLnRpdGxlLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnTm8gdGhyb3R0bGluZycpLG5ldHdvcms6U0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTm9UaHJvdHRsaW5nLH07TW9iaWxlVGhyb3R0bGluZy5PZmZsaW5lQ29uZGl0aW9ucz17dGl0bGU6U0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zLnRpdGxlLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnTm8gaW50ZXJuZXQgY29ubmVjdGl2aXR5JyksbmV0d29yazpTREsuTmV0d29ya01hbmFnZXIuT2ZmbGluZUNvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTm9UaHJvdHRsaW5nLH07TW9iaWxlVGhyb3R0bGluZy5Mb3dFbmRNb2JpbGVDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0xvdy1lbmQgbW9iaWxlJyksZGVzY3JpcHRpb246Q29tbW9uLlVJU3RyaW5nKCdTbG93IDNHICYgNnggQ1BVIHNsb3dkb3duJyksbmV0d29yazpTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyxjcHVUaHJvdHRsaW5nUmF0ZTpNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Mb3dFbmRNb2JpbGUsfTtNb2JpbGVUaHJvdHRsaW5nLk1pZFRpZXJNb2JpbGVDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ01pZC10aWVyIG1vYmlsZScpLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnRmFzdCAzRyAmIDR4IENQVSBzbG93ZG93bicpLG5ldHdvcms6U0RLLk5ldHdvcmtNYW5hZ2VyLkZhc3QzR0NvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTWlkVGllck1vYmlsZSx9O01vYmlsZVRocm90dGxpbmcuUGxhY2Vob2xkZXJDb25kaXRpb25zO01vYmlsZVRocm90dGxpbmcuQ3VzdG9tQ29uZGl0aW9ucz17dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdDdXN0b20nKSxkZXNjcmlwdGlvbjpDb21tb24uVUlTdHJpbmcoJ0NoZWNrIE5ldHdvcmsgYW5kIFBlcmZvcm1hbmNlIHBhbmVscycpLH07TW9iaWxlVGhyb3R0bGluZy5OZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnNHcm91cDtNb2JpbGVUaHJvdHRsaW5nLk1vYmlsZVRocm90dGxpbmdDb25kaXRpb25zR3JvdXA7TW9iaWxlVGhyb3R0bGluZy5Db25kaXRpb25zTGlzdDtNb2JpbGVUaHJvdHRsaW5nLm1vYmlsZVByZXNldHM9W01vYmlsZVRocm90dGxpbmcuTWlkVGllck1vYmlsZUNvbmRpdGlvbnMsTW9iaWxlVGhyb3R0bGluZy5Mb3dFbmRNb2JpbGVDb25kaXRpb25zLE1vYmlsZVRocm90dGxpbmcuQ3VzdG9tQ29uZGl0aW9uc107TW9iaWxlVGhyb3R0bGluZy5hZHZhbmNlZE1vYmlsZVByZXNldHM9W01vYmlsZVRocm90dGxpbmcuT2ZmbGluZUNvbmRpdGlvbnMsXTtNb2JpbGVUaHJvdHRsaW5nLm5ldHdvcmtQcmVzZXRzPVtTREsuTmV0d29ya01hbmFnZXIuRmFzdDNHQ29uZGl0aW9ucyxTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyxTREsuTmV0d29ya01hbmFnZXIuT2ZmbGluZUNvbmRpdGlvbnMsXTtNb2JpbGVUaHJvdHRsaW5nLmNwdVRocm90dGxpbmdQcmVzZXRzPVtNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Ob1Rocm90dGxpbmcsTW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTWlkVGllck1vYmlsZSxNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Mb3dFbmRNb2JpbGUsXTs7TW9iaWxlVGhyb3R0bGluZy5Nb2JpbGVUaHJvdHRsaW5nU2VsZWN0b3I9Y2xhc3N7Y29uc3RydWN0b3IocG9wdWxhdGVDYWxsYmFjayxzZWxlY3RDYWxsYmFjayl7dGhpcy5fcG9wdWxhdGVDYWxsYmFjaz1wb3B1bGF0ZUNhbGxiYWNrO3RoaXMuX3NlbGVjdENhbGxiYWNrPXNlbGVjdENhbGxiYWNrO01vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5hZGRFdmVudExpc3RlbmVyKE1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuRXZlbnRzLlJhdGVDaGFuZ2VkLHRoaXMuX2NvbmRpdGlvbnNDaGFuZ2VkLHRoaXMpO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLHRoaXMuX2NvbmRpdGlvbnNDaGFuZ2VkLHRoaXMpO3RoaXMuX29wdGlvbnM9dGhpcy5fcG9wdWxhdGVPcHRpb25zKCk7dGhpcy5fY29uZGl0aW9uc0NoYW5nZWQoKTt9Cm9wdGlvblNlbGVjdGVkKGNvbmRpdGlvbnMpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKGNvbmRpdGlvbnMubmV0d29yayk7TW9iaWxlVGhyb3R0bGluZy50aHJvdHRsaW5nTWFuYWdlcigpLnNldENQVVRocm90dGxpbmdSYXRlKGNvbmRpdGlvbnMuY3B1VGhyb3R0bGluZ1JhdGUpO30KX3BvcHVsYXRlT3B0aW9ucygpe2NvbnN0IGRpc2FibGVkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRGlzYWJsZWQnKSxpdGVtczpbTW9iaWxlVGhyb3R0bGluZy5Ob1Rocm90dGxpbmdDb25kaXRpb25zXX07Y29uc3QgcHJlc2V0c0dyb3VwPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ByZXNldHMnKSxpdGVtczpNb2JpbGVUaHJvdHRsaW5nLm1vYmlsZVByZXNldHN9O2NvbnN0IGFkdmFuY2VkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnQWR2YW5jZWQnKSxpdGVtczpNb2JpbGVUaHJvdHRsaW5nLmFkdmFuY2VkTW9iaWxlUHJlc2V0c307cmV0dXJuIHRoaXMuX3BvcHVsYXRlQ2FsbGJhY2soW2Rpc2FibGVkR3JvdXAscHJlc2V0c0dyb3VwLGFkdmFuY2VkR3JvdXBdKTt9Cl9jb25kaXRpb25zQ2hhbmdlZCgpe2NvbnN0IG5ldHdvcmtDb25kaXRpb25zPVNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLm5ldHdvcmtDb25kaXRpb25zKCk7Y29uc3QgY3B1VGhyb3R0bGluZ1JhdGU9TW9iaWxlVGhyb3R0bGluZy50aHJvdHRsaW5nTWFuYWdlcigpLmNwdVRocm90dGxpbmdSYXRlKCk7Zm9yKGxldCBpbmRleD0wO2luZGV4PHRoaXMuX29wdGlvbnMubGVuZ3RoOysraW5kZXgpe2NvbnN0IG9wdGlvbj10aGlzLl9vcHRpb25zW2luZGV4XTtpZihvcHRpb24mJm9wdGlvbi5uZXR3b3JrPT09bmV0d29ya0NvbmRpdGlvbnMmJm9wdGlvbi5jcHVUaHJvdHRsaW5nUmF0ZT09PWNwdVRocm90dGxpbmdSYXRlKXt0aGlzLl9zZWxlY3RDYWxsYmFjayhpbmRleCk7cmV0dXJuO319CnRoaXMuX3NlbGVjdENhbGxiYWNrKHRoaXMuX29wdGlvbnMuaW5kZXhPZihNb2JpbGVUaHJvdHRsaW5nLkN1c3RvbUNvbmRpdGlvbnMpKTt9fTs7TW9iaWxlVGhyb3R0bGluZy5OZXR3b3JrUGFuZWxJbmRpY2F0b3I9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZighVUkuaW5zcGVjdG9yVmlldy5oYXNQYW5lbCgnbmV0d29yaycpKQpyZXR1cm47Y29uc3QgbWFuYWdlcj1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlcjttYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLHVwZGF0ZVZpc2liaWxpdHkpO21hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQmxvY2tlZFBhdHRlcm5zQ2hhbmdlZCx1cGRhdGVWaXNpYmlsaXR5KTttYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkludGVyY2VwdG9yc0NoYW5nZWQsdXBkYXRlVmlzaWJpbGl0eSk7dXBkYXRlVmlzaWJpbGl0eSgpO2Z1bmN0aW9uIHVwZGF0ZVZpc2liaWxpdHkoKXtsZXQgaWNvbj1udWxsO2lmKG1hbmFnZXIuaXNUaHJvdHRsaW5nKCkpe2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ05ldHdvcmsgdGhyb3R0bGluZyBpcyBlbmFibGVkJyk7fWVsc2UgaWYoU0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuaXNJbnRlcmNlcHRpbmcoKSl7aWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXdhcm5pbmcnKTtpY29uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVxdWVzdHMgbWF5IGJlIHJld3JpdHRlbiBieSBsb2NhbCBvdmVycmlkZXMnKTt9ZWxzZSBpZihtYW5hZ2VyLmlzQmxvY2tpbmcoKSl7aWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXdhcm5pbmcnKTtpY29uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVxdWVzdHMgbWF5IGJlIGJsb2NrZWQnKTt9ClVJLmluc3BlY3RvclZpZXcuc2V0UGFuZWxJY29uKCduZXR3b3JrJyxpY29uKTt9fX07O01vYmlsZVRocm90dGxpbmcuTmV0d29ya1Rocm90dGxpbmdTZWxlY3Rvcj1jbGFzc3tjb25zdHJ1Y3Rvcihwb3B1bGF0ZUNhbGxiYWNrLHNlbGVjdENhbGxiYWNrLGN1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZyl7dGhpcy5fcG9wdWxhdGVDYWxsYmFjaz1wb3B1bGF0ZUNhbGxiYWNrO3RoaXMuX3NlbGVjdENhbGxiYWNrPXNlbGVjdENhbGxiYWNrO3RoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZz1jdXN0b21OZXR3b3JrQ29uZGl0aW9uc1NldHRpbmc7dGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3BvcHVsYXRlT3B0aW9ucyx0aGlzKTtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5Db25kaXRpb25zQ2hhbmdlZCx0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQsdGhpcyk7dGhpcy5fb3B0aW9uczt0aGlzLl9wb3B1bGF0ZU9wdGlvbnMoKTt9CnJldmVhbEFuZFVwZGF0ZSgpe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nKTt0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKTt9Cm9wdGlvblNlbGVjdGVkKGNvbmRpdGlvbnMpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKGNvbmRpdGlvbnMpO30KX3BvcHVsYXRlT3B0aW9ucygpe2NvbnN0IGRpc2FibGVkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRGlzYWJsZWQnKSxpdGVtczpbU0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnNdfTtjb25zdCBwcmVzZXRzR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnUHJlc2V0cycpLGl0ZW1zOk1vYmlsZVRocm90dGxpbmcubmV0d29ya1ByZXNldHN9O2NvbnN0IGN1c3RvbUdyb3VwPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0N1c3RvbScpLGl0ZW1zOnRoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZy5nZXQoKX07dGhpcy5fb3B0aW9ucz10aGlzLl9wb3B1bGF0ZUNhbGxiYWNrKFtkaXNhYmxlZEdyb3VwLHByZXNldHNHcm91cCxjdXN0b21Hcm91cF0pO2lmKCF0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKSl7Zm9yKGxldCBpPXRoaXMuX29wdGlvbnMubGVuZ3RoLTE7aT49MDtpLS0pe2lmKHRoaXMuX29wdGlvbnNbaV0pe3RoaXMub3B0aW9uU2VsZWN0ZWQoKHRoaXMuX29wdGlvbnNbaV0pKTticmVhazt9fX19Cl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKXtjb25zdCB2YWx1ZT1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpO2ZvcihsZXQgaW5kZXg9MDtpbmRleDx0aGlzLl9vcHRpb25zLmxlbmd0aDsrK2luZGV4KXtjb25zdCBvcHRpb249dGhpcy5fb3B0aW9uc1tpbmRleF07aWYob3B0aW9uJiZvcHRpb24uZG93bmxvYWQ9PT12YWx1ZS5kb3dubG9hZCYmb3B0aW9uLnVwbG9hZD09PXZhbHVlLnVwbG9hZCYmb3B0aW9uLmxhdGVuY3k9PT12YWx1ZS5sYXRlbmN5JiZvcHRpb24udGl0bGU9PT12YWx1ZS50aXRsZSl7dGhpcy5fc2VsZWN0Q2FsbGJhY2soaW5kZXgpO3JldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9fTs7TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nU2V0dGluZ3NUYWI9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdtb2JpbGVfdGhyb3R0bGluZy90aHJvdHRsaW5nU2V0dGluZ3NUYWIuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaGVhZGVyJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdOZXR3b3JrIFRocm90dGxpbmcgUHJvZmlsZXMnKTtjb25zdCBhZGRCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0FkZCBjdXN0b20gcHJvZmlsZS4uLicpLHRoaXMuX2FkZEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSwnYWRkLWNvbmRpdGlvbnMtYnV0dG9uJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChhZGRCdXR0b24pO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbmRpdGlvbnMtbGlzdCcpO3RoaXMuX2xpc3QucmVnaXN0ZXJSZXF1aXJlZENTUygnbW9iaWxlX3Rocm90dGxpbmcvdGhyb3R0bGluZ1NldHRpbmdzVGFiLmNzcycpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9jdXN0b21TZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjdXN0b21OZXR3b3JrQ29uZGl0aW9ucycpO3RoaXMuX2N1c3RvbVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fY29uZGl0aW9uc1VwZGF0ZWQsdGhpcyk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQoYWRkQnV0dG9uKTt0aGlzLmNvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7dGhpcy5fY29uZGl0aW9uc1VwZGF0ZWQoKTt9Cl9jb25kaXRpb25zVXBkYXRlZCgpe3RoaXMuX2xpc3QuY2xlYXIoKTtjb25zdCBjb25kaXRpb25zPXRoaXMuX2N1c3RvbVNldHRpbmcuZ2V0KCk7Zm9yKGxldCBpPTA7aTxjb25kaXRpb25zLmxlbmd0aDsrK2kpCnRoaXMuX2xpc3QuYXBwZW5kSXRlbShjb25kaXRpb25zW2ldLHRydWUpO3RoaXMuX2xpc3QuYXBwZW5kU2VwYXJhdG9yKCk7fQpfYWRkQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX2xpc3QuYWRkTmV3SXRlbSh0aGlzLl9jdXN0b21TZXR0aW5nLmdldCgpLmxlbmd0aCx7dGl0bGU6JycsZG93bmxvYWQ6LTEsdXBsb2FkOi0xLGxhdGVuY3k6MH0pO30KcmVuZGVySXRlbShpdGVtLGVkaXRhYmxlKXtjb25zdCBjb25kaXRpb25zPShpdGVtKTtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1pdGVtJyk7Y29uc3QgdGl0bGU9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXRleHQgY29uZGl0aW9ucy1saXN0LXRpdGxlJyk7Y29uc3QgdGl0bGVUZXh0PXRpdGxlLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGl0bGUtdGV4dCcpO3RpdGxlVGV4dC50ZXh0Q29udGVudD1jb25kaXRpb25zLnRpdGxlO3RpdGxlVGV4dC50aXRsZT1jb25kaXRpb25zLnRpdGxlO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3InKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpLnRleHRDb250ZW50PU1vYmlsZVRocm90dGxpbmcudGhyb3VnaHB1dFRleHQoY29uZGl0aW9ucy5kb3dubG9hZCk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvcicpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9TW9iaWxlVGhyb3R0bGluZy50aHJvdWdocHV0VGV4dChjb25kaXRpb25zLnVwbG9hZCk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvcicpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclZG1zJyxjb25kaXRpb25zLmxhdGVuY3kpO3JldHVybiBlbGVtZW50O30KcmVtb3ZlSXRlbVJlcXVlc3RlZChpdGVtLGluZGV4KXtjb25zdCBsaXN0PXRoaXMuX2N1c3RvbVNldHRpbmcuZ2V0KCk7bGlzdC5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fY3VzdG9tU2V0dGluZy5zZXQobGlzdCk7fQpjb21taXRFZGl0KGl0ZW0sZWRpdG9yLGlzTmV3KXtjb25zdCBjb25kaXRpb25zPShpdGVtKTtjb25kaXRpb25zLnRpdGxlPWVkaXRvci5jb250cm9sKCd0aXRsZScpLnZhbHVlLnRyaW0oKTtjb25zdCBkb3dubG9hZD1lZGl0b3IuY29udHJvbCgnZG93bmxvYWQnKS52YWx1ZS50cmltKCk7Y29uZGl0aW9ucy5kb3dubG9hZD1kb3dubG9hZD9wYXJzZUludChkb3dubG9hZCwxMCkqKDEwMjQvOCk6LTE7Y29uc3QgdXBsb2FkPWVkaXRvci5jb250cm9sKCd1cGxvYWQnKS52YWx1ZS50cmltKCk7Y29uZGl0aW9ucy51cGxvYWQ9dXBsb2FkP3BhcnNlSW50KHVwbG9hZCwxMCkqKDEwMjQvOCk6LTE7Y29uc3QgbGF0ZW5jeT1lZGl0b3IuY29udHJvbCgnbGF0ZW5jeScpLnZhbHVlLnRyaW0oKTtjb25kaXRpb25zLmxhdGVuY3k9bGF0ZW5jeT9wYXJzZUludChsYXRlbmN5LDEwKTowO2NvbnN0IGxpc3Q9dGhpcy5fY3VzdG9tU2V0dGluZy5nZXQoKTtpZihpc05ldykKbGlzdC5wdXNoKGNvbmRpdGlvbnMpO3RoaXMuX2N1c3RvbVNldHRpbmcuc2V0KGxpc3QpO30KYmVnaW5FZGl0KGl0ZW0pe2NvbnN0IGNvbmRpdGlvbnM9KGl0ZW0pO2NvbnN0IGVkaXRvcj10aGlzLl9jcmVhdGVFZGl0b3IoKTtlZGl0b3IuY29udHJvbCgndGl0bGUnKS52YWx1ZT1jb25kaXRpb25zLnRpdGxlO2VkaXRvci5jb250cm9sKCdkb3dubG9hZCcpLnZhbHVlPWNvbmRpdGlvbnMuZG93bmxvYWQ8PTA/Jyc6U3RyaW5nKGNvbmRpdGlvbnMuZG93bmxvYWQvKDEwMjQvOCkpO2VkaXRvci5jb250cm9sKCd1cGxvYWQnKS52YWx1ZT1jb25kaXRpb25zLnVwbG9hZDw9MD8nJzpTdHJpbmcoY29uZGl0aW9ucy51cGxvYWQvKDEwMjQvOCkpO2VkaXRvci5jb250cm9sKCdsYXRlbmN5JykudmFsdWU9Y29uZGl0aW9ucy5sYXRlbmN5P1N0cmluZyhjb25kaXRpb25zLmxhdGVuY3kpOicnO3JldHVybiBlZGl0b3I7fQpfY3JlYXRlRWRpdG9yKCl7aWYodGhpcy5fZWRpdG9yKQpyZXR1cm4gdGhpcy5fZWRpdG9yO2NvbnN0IGVkaXRvcj1uZXcgVUkuTGlzdFdpZGdldC5FZGl0b3IoKTt0aGlzLl9lZGl0b3I9ZWRpdG9yO2NvbnN0IGNvbnRlbnQ9ZWRpdG9yLmNvbnRlbnRFbGVtZW50KCk7Y29uc3QgdGl0bGVzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtZWRpdC1yb3cnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0IGNvbmRpdGlvbnMtbGlzdC10aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUHJvZmlsZSBOYW1lJyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yIGNvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3ItaW52aXNpYmxlJyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRG93bmxvYWQnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3IgY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvci1pbnZpc2libGUnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdVcGxvYWQnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3IgY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvci1pbnZpc2libGUnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdMYXRlbmN5Jyk7Y29uc3QgZmllbGRzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtZWRpdC1yb3cnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0IGNvbmRpdGlvbnMtbGlzdC10aXRsZScpLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgndGl0bGUnLCd0ZXh0JywnJyx0aXRsZVZhbGlkYXRvcikpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2xldCBjZWxsPWZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXRleHQnKTtjZWxsLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgnZG93bmxvYWQnLCd0ZXh0JyxDb21tb24uVUlTdHJpbmcoJ2tiL3MnKSx0aHJvdWdocHV0VmFsaWRhdG9yKSk7Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1lZGl0LW9wdGlvbmFsJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdvcHRpb25hbCcpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2NlbGw9ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpO2NlbGwuYXBwZW5kQ2hpbGQoZWRpdG9yLmNyZWF0ZUlucHV0KCd1cGxvYWQnLCd0ZXh0JyxDb21tb24uVUlTdHJpbmcoJ2tiL3MnKSx0aHJvdWdocHV0VmFsaWRhdG9yKSk7Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1lZGl0LW9wdGlvbmFsJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdvcHRpb25hbCcpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2NlbGw9ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpO2NlbGwuYXBwZW5kQ2hpbGQoZWRpdG9yLmNyZWF0ZUlucHV0KCdsYXRlbmN5JywndGV4dCcsQ29tbW9uLlVJU3RyaW5nKCdtcycpLGxhdGVuY3lWYWxpZGF0b3IpKTtjZWxsLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWVkaXQtb3B0aW9uYWwnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ29wdGlvbmFsJyk7cmV0dXJuIGVkaXRvcjtmdW5jdGlvbiB0aXRsZVZhbGlkYXRvcihpdGVtLGluZGV4LGlucHV0KXtjb25zdCB2YWx1ZT1pbnB1dC52YWx1ZS50cmltKCk7cmV0dXJuIHZhbHVlLmxlbmd0aD4wJiZ2YWx1ZS5sZW5ndGg8NTA7fQpmdW5jdGlvbiB0aHJvdWdocHV0VmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe2NvbnN0IHZhbHVlPWlucHV0LnZhbHVlLnRyaW0oKTtyZXR1cm4hdmFsdWV8fCgvXltcZF0rKFwuXGQrKT98XC5cZCskLy50ZXN0KHZhbHVlKSYmdmFsdWU+PTAmJnZhbHVlPD0xMDAwMDAwMCk7fQpmdW5jdGlvbiBsYXRlbmN5VmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe2NvbnN0IHZhbHVlPWlucHV0LnZhbHVlLnRyaW0oKTtyZXR1cm4hdmFsdWV8fCgvXltcZF0rJC8udGVzdCh2YWx1ZSkmJnZhbHVlPj0wJiZ2YWx1ZTw9MTAwMDAwMCk7fX19O01vYmlsZVRocm90dGxpbmcudGhyb3VnaHB1dFRleHQ9ZnVuY3Rpb24odGhyb3VnaHB1dCxwbGFpblRleHQpe2lmKHRocm91Z2hwdXQ8MCkKcmV0dXJuJyc7Y29uc3QgdGhyb3VnaHB1dEluS2Jwcz10aHJvdWdocHV0LygxMDI0LzgpO2NvbnN0IGRlbGltaXRlcj1wbGFpblRleHQ/Jyc6JyAnO2lmKHRocm91Z2hwdXRJbkticHM8MTAyNCkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJWQlc2tiL3MnLHRocm91Z2hwdXRJbkticHMsZGVsaW1pdGVyKTtpZih0aHJvdWdocHV0SW5LYnBzPDEwMjQqMTApCnJldHVybiBDb21tb24uVUlTdHJpbmcoJyUuMWYlc01iL3MnLHRocm91Z2hwdXRJbkticHMvMTAyNCxkZWxpbWl0ZXIpO3JldHVybiBDb21tb24uVUlTdHJpbmcoJyVkJXNNYi9zJywodGhyb3VnaHB1dEluS2Jwcy8xMDI0KXwwLGRlbGltaXRlcik7fTs7TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlcj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2NwdVRocm90dGxpbmdSYXRlPU1vYmlsZVRocm90dGxpbmcuQ1BVVGhyb3R0bGluZ1JhdGVzLk5vVGhyb3R0bGluZzt0aGlzLl9jcHVUaHJvdHRsaW5nQ29udHJvbHM9bmV3IFNldCgpO3RoaXMuX2NwdVRocm90dGxpbmdSYXRlcz1Nb2JpbGVUaHJvdHRsaW5nLmNwdVRocm90dGxpbmdQcmVzZXRzO3RoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnY3VzdG9tTmV0d29ya0NvbmRpdGlvbnMnKTt0aGlzLl9jdXJyZW50TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zPVNESy5OZXR3b3JrTWFuYWdlci5Ob1Rocm90dGxpbmdDb25kaXRpb25zO3RoaXMuX2xhc3ROZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnM7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQ29uZGl0aW9uc0NoYW5nZWQsKCk9Pnt0aGlzLl9sYXN0TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zPXRoaXMuX2N1cnJlbnROZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnM7dGhpcy5fY3VycmVudE5ldHdvcmtUaHJvdHRsaW5nQ29uZGl0aW9ucz1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpO30pO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsLHRoaXMpO30KZGVjb3JhdGVTZWxlY3RXaXRoTmV0d29ya1Rocm90dGxpbmcoc2VsZWN0RWxlbWVudCl7bGV0IG9wdGlvbnM9W107Y29uc3Qgc2VsZWN0b3I9bmV3IE1vYmlsZVRocm90dGxpbmcuTmV0d29ya1Rocm90dGxpbmdTZWxlY3Rvcihwb3B1bGF0ZSxzZWxlY3QsdGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nKTtzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsb3B0aW9uU2VsZWN0ZWQsZmFsc2UpO3JldHVybiBzZWxlY3RvcjtmdW5jdGlvbiBwb3B1bGF0ZShncm91cHMpe3NlbGVjdEVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtvcHRpb25zPVtdO2ZvcihsZXQgaT0wO2k8Z3JvdXBzLmxlbmd0aDsrK2kpe2NvbnN0IGdyb3VwPWdyb3Vwc1tpXTtjb25zdCBncm91cEVsZW1lbnQ9c2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0Z3JvdXAnKTtncm91cEVsZW1lbnQubGFiZWw9Z3JvdXAudGl0bGU7Zm9yKGNvbnN0IGNvbmRpdGlvbnMgb2YgZ3JvdXAuaXRlbXMpe2NvbnN0IHRpdGxlPWNvbmRpdGlvbnMudGl0bGU7Y29uc3Qgb3B0aW9uPW5ldyBPcHRpb24odGl0bGUsdGl0bGUpO2dyb3VwRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb24pO29wdGlvbnMucHVzaChjb25kaXRpb25zKTt9CmlmKGk9PT1ncm91cHMubGVuZ3RoLTEpe2dyb3VwRWxlbWVudC5hcHBlbmRDaGlsZChuZXcgT3B0aW9uKENvbW1vbi5VSVN0cmluZygnQWRkXHUyMDI2JyksQ29tbW9uLlVJU3RyaW5nKCdBZGRcdTIwMjYnKSkpO29wdGlvbnMucHVzaChudWxsKTt9fQpyZXR1cm4gb3B0aW9uczt9CmZ1bmN0aW9uIG9wdGlvblNlbGVjdGVkKCl7aWYoc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4PT09c2VsZWN0RWxlbWVudC5vcHRpb25zLmxlbmd0aC0xKQpzZWxlY3Rvci5yZXZlYWxBbmRVcGRhdGUoKTtlbHNlCnNlbGVjdG9yLm9wdGlvblNlbGVjdGVkKG9wdGlvbnNbc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4XSk7fQpmdW5jdGlvbiBzZWxlY3QoaW5kZXgpe2lmKHNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleCE9PWluZGV4KQpzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9aW5kZXg7fX0KY3JlYXRlT2ZmbGluZVRvb2xiYXJDaGVja2JveCgpe2NvbnN0IGNoZWNrYm94PW5ldyBVSS5Ub29sYmFyQ2hlY2tib3goQ29tbW9uLlVJU3RyaW5nKCdPZmZsaW5lJyksQ29tbW9uLlVJU3RyaW5nKCdGb3JjZSBkaXNjb25uZWN0ZWQgZnJvbSBuZXR3b3JrJyksZm9yY2VPZmZsaW5lLmJpbmQodGhpcykpO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLG5ldHdvcmtDb25kaXRpb25zQ2hhbmdlZCk7Y2hlY2tib3guc2V0Q2hlY2tlZChTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpPT09U0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zKTtmdW5jdGlvbiBmb3JjZU9mZmxpbmUoKXtpZihjaGVja2JveC5jaGVja2VkKCkpClNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKFNESy5OZXR3b3JrTWFuYWdlci5PZmZsaW5lQ29uZGl0aW9ucyk7ZWxzZQpTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyh0aGlzLl9sYXN0TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zKTt9CmZ1bmN0aW9uIG5ldHdvcmtDb25kaXRpb25zQ2hhbmdlZCgpe2NoZWNrYm94LnNldENoZWNrZWQoU0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIubmV0d29ya0NvbmRpdGlvbnMoKT09PVNESy5OZXR3b3JrTWFuYWdlci5PZmZsaW5lQ29uZGl0aW9ucyk7fQpyZXR1cm4gY2hlY2tib3g7fQpjcmVhdGVNb2JpbGVUaHJvdHRsaW5nQnV0dG9uKCl7Y29uc3QgYnV0dG9uPW5ldyBVSS5Ub29sYmFyTWVudUJ1dHRvbihhcHBlbmRJdGVtcyk7YnV0dG9uLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnVGhyb3R0bGluZycpKTtidXR0b24uc2V0R2x5cGgoJycpO2J1dHRvbi50dXJuSW50b1NlbGVjdCgpO2J1dHRvbi5zZXREYXJrVGV4dCgpO2xldCBvcHRpb25zPVtdO2xldCBzZWxlY3RlZEluZGV4PS0xO2NvbnN0IHNlbGVjdG9yPW5ldyBNb2JpbGVUaHJvdHRsaW5nLk1vYmlsZVRocm90dGxpbmdTZWxlY3Rvcihwb3B1bGF0ZSxzZWxlY3QpO3JldHVybiBidXR0b247ZnVuY3Rpb24gYXBwZW5kSXRlbXMoY29udGV4dE1lbnUpe2ZvcihsZXQgaW5kZXg9MDtpbmRleDxvcHRpb25zLmxlbmd0aDsrK2luZGV4KXtjb25zdCBjb25kaXRpb25zPW9wdGlvbnNbaW5kZXhdO2lmKCFjb25kaXRpb25zKQpjb250aW51ZTtpZihjb25kaXRpb25zLnRpdGxlPT09TW9iaWxlVGhyb3R0bGluZy5DdXN0b21Db25kaXRpb25zLnRpdGxlJiZjb25kaXRpb25zLmRlc2NyaXB0aW9uPT09TW9iaWxlVGhyb3R0bGluZy5DdXN0b21Db25kaXRpb25zLmRlc2NyaXB0aW9uKQpjb250aW51ZTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShDb21tb24uVUlTdHJpbmcoY29uZGl0aW9ucy50aXRsZSksc2VsZWN0b3Iub3B0aW9uU2VsZWN0ZWQuYmluZChzZWxlY3RvciwoY29uZGl0aW9ucykpLHNlbGVjdGVkSW5kZXg9PT1pbmRleCk7fX0KZnVuY3Rpb24gcG9wdWxhdGUoZ3JvdXBzKXtvcHRpb25zPVtdO2Zvcihjb25zdCBncm91cCBvZiBncm91cHMpe2Zvcihjb25zdCBjb25kaXRpb25zIG9mIGdyb3VwLml0ZW1zKQpvcHRpb25zLnB1c2goY29uZGl0aW9ucyk7b3B0aW9ucy5wdXNoKG51bGwpO30KcmV0dXJuIG9wdGlvbnM7fQpmdW5jdGlvbiBzZWxlY3QoaW5kZXgpe3NlbGVjdGVkSW5kZXg9aW5kZXg7YnV0dG9uLnNldFRleHQob3B0aW9uc1tpbmRleF0udGl0bGUpO2J1dHRvbi5zZXRUaXRsZShvcHRpb25zW2luZGV4XS5kZXNjcmlwdGlvbik7fX0KY3B1VGhyb3R0bGluZ1JhdGUoKXtyZXR1cm4gdGhpcy5fY3B1VGhyb3R0bGluZ1JhdGU7fQpzZXRDUFVUaHJvdHRsaW5nUmF0ZShyYXRlKXt0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZT1yYXRlO2Zvcihjb25zdCBlbXVsYXRpb25Nb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsKSkKZW11bGF0aW9uTW9kZWwuc2V0Q1BVVGhyb3R0bGluZ1JhdGUodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUpO2xldCBpY29uPW51bGw7aWYodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUhPT1Nb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Ob1Rocm90dGxpbmcpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQ3B1VGhyb3R0bGluZ0VuYWJsZWQpO2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0NQVSB0aHJvdHRsaW5nIGlzIGVuYWJsZWQnKTt9CmNvbnN0IGluZGV4PXRoaXMuX2NwdVRocm90dGxpbmdSYXRlcy5pbmRleE9mKHRoaXMuX2NwdVRocm90dGxpbmdSYXRlKTtmb3IoY29uc3QgY29udHJvbCBvZiB0aGlzLl9jcHVUaHJvdHRsaW5nQ29udHJvbHMpCmNvbnRyb2wuc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7VUkuaW5zcGVjdG9yVmlldy5zZXRQYW5lbEljb24oJ3RpbWVsaW5lJyxpY29uKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhNb2JpbGVUaHJvdHRsaW5nLlRocm90dGxpbmdNYW5hZ2VyLkV2ZW50cy5SYXRlQ2hhbmdlZCx0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZSk7fQptb2RlbEFkZGVkKGVtdWxhdGlvbk1vZGVsKXtpZih0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZSE9PU1vYmlsZVRocm90dGxpbmcuQ1BVVGhyb3R0bGluZ1JhdGVzLk5vVGhyb3R0bGluZykKZW11bGF0aW9uTW9kZWwuc2V0Q1BVVGhyb3R0bGluZ1JhdGUodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUpO30KbW9kZWxSZW1vdmVkKGVtdWxhdGlvbk1vZGVsKXt9CmNyZWF0ZUNQVVRocm90dGxpbmdTZWxlY3Rvcigpe2NvbnN0IGNvbnRyb2w9bmV3IFVJLlRvb2xiYXJDb21ib0JveChldmVudD0+dGhpcy5zZXRDUFVUaHJvdHRsaW5nUmF0ZSh0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZXNbZXZlbnQudGFyZ2V0LnNlbGVjdGVkSW5kZXhdKSk7dGhpcy5fY3B1VGhyb3R0bGluZ0NvbnRyb2xzLmFkZChjb250cm9sKTtjb25zdCBjdXJyZW50UmF0ZT10aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZTtmb3IobGV0IGk9MDtpPHRoaXMuX2NwdVRocm90dGxpbmdSYXRlcy5sZW5ndGg7KytpKXtjb25zdCByYXRlPXRoaXMuX2NwdVRocm90dGxpbmdSYXRlc1tpXTtjb25zdCB0aXRsZT1yYXRlPT09MT9Db21tb24uVUlTdHJpbmcoJ05vIHRocm90dGxpbmcnKTpDb21tb24uVUlTdHJpbmcoJyVkXHhENyBzbG93ZG93bicscmF0ZSk7Y29uc3Qgb3B0aW9uPWNvbnRyb2wuY3JlYXRlT3B0aW9uKHRpdGxlKTtjb250cm9sLmFkZE9wdGlvbihvcHRpb24pO2lmKGN1cnJlbnRSYXRlPT09cmF0ZSkKY29udHJvbC5zZXRTZWxlY3RlZEluZGV4KGkpO30KcmV0dXJuIGNvbnRyb2w7fX07TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlci5FdmVudHM9e1JhdGVDaGFuZ2VkOlN5bWJvbCgnUmF0ZUNoYW5nZWQnKX07TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlci5BY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7aWYoYWN0aW9uSWQ9PT0nbmV0d29yay1jb25kaXRpb25zLm5ldHdvcmstb25saW5lJyl7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0TmV0d29ya0NvbmRpdGlvbnMoU0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnMpO3JldHVybiB0cnVlO30KaWYoYWN0aW9uSWQ9PT0nbmV0d29yay1jb25kaXRpb25zLm5ldHdvcmstbG93LWVuZC1tb2JpbGUnKXtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyhTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyk7cmV0dXJuIHRydWU7fQppZihhY3Rpb25JZD09PSduZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1taWQtdGllci1tb2JpbGUnKXtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyhTREsuTmV0d29ya01hbmFnZXIuRmFzdDNHQ29uZGl0aW9ucyk7cmV0dXJuIHRydWU7fQppZihhY3Rpb25JZD09PSduZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1vZmZsaW5lJyl7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0TmV0d29ya0NvbmRpdGlvbnMoU0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtNb2JpbGVUaHJvdHRsaW5nLnRocm90dGxpbmdNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHNlbGYuc2luZ2xldG9uKE1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIpO307O3NlbGZbJ0VtdWxhdGlvbiddPXNlbGZbJ0VtdWxhdGlvbiddfHx7fTtFbXVsYXRpb24uQWR2YW5jZWRBcHA9Y2xhc3N7Y29uc3RydWN0b3IoKXtDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5FdmVudHMuQmVmb3JlRG9ja1NpZGVDaGFuZ2VkLHRoaXMuX29wZW5Ub29sYm94V2luZG93LHRoaXMpO30Kc3RhdGljIF9pbnN0YW5jZSgpe2lmKCFFbXVsYXRpb24uQWR2YW5jZWRBcHAuX2FwcEluc3RhbmNlKQpFbXVsYXRpb24uQWR2YW5jZWRBcHAuX2FwcEluc3RhbmNlPW5ldyBFbXVsYXRpb24uQWR2YW5jZWRBcHAoKTtyZXR1cm4gRW11bGF0aW9uLkFkdmFuY2VkQXBwLl9hcHBJbnN0YW5jZTt9CnByZXNlbnRVSShkb2N1bWVudCl7Y29uc3Qgcm9vdFZpZXc9bmV3IFVJLlJvb3RWaWV3KCk7dGhpcy5fcm9vdFNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSx0cnVlLCdJbnNwZWN0b3JWaWV3LnNwbGl0Vmlld1N0YXRlJyw1NTUsMzAwLHRydWUpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zaG93KHJvb3RWaWV3LmVsZW1lbnQpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KFVJLmluc3BlY3RvclZpZXcpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXREZWZhdWx0Rm9jdXNlZENoaWxkKFVJLmluc3BlY3RvclZpZXcpO1VJLmluc3BlY3RvclZpZXcuc2V0T3duZXJTcGxpdCh0aGlzLl9yb290U3BsaXRXaWRnZXQpO3RoaXMuX2luc3BlY3RlZFBhZ2VQbGFjZWhvbGRlcj1FbXVsYXRpb24uSW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmluc3RhbmNlKCk7dGhpcy5faW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmFkZEV2ZW50TGlzdGVuZXIoRW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5FdmVudHMuVXBkYXRlLHRoaXMuX29uU2V0SW5zcGVjdGVkUGFnZUJvdW5kcy5iaW5kKHRoaXMpLHRoaXMpO3RoaXMuX2RldmljZU1vZGVWaWV3PW5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZVdyYXBwZXIodGhpcy5faW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyKTtDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5FdmVudHMuQmVmb3JlRG9ja1NpZGVDaGFuZ2VkLHRoaXMuX29uQmVmb3JlRG9ja1NpZGVDaGFuZ2UsdGhpcyk7Q29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKENvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuRXZlbnRzLkRvY2tTaWRlQ2hhbmdlZCx0aGlzLl9vbkRvY2tTaWRlQ2hhbmdlLHRoaXMpO0NvbXBvbmVudHMuZG9ja0NvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcihDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLkV2ZW50cy5BZnRlckRvY2tTaWRlQ2hhbmdlZCx0aGlzLl9vbkFmdGVyRG9ja1NpZGVDaGFuZ2UsdGhpcyk7dGhpcy5fb25Eb2NrU2lkZUNoYW5nZSgpO2NvbnNvbGUudGltZVN0YW1wKCdBZHZhbmNlZEFwcC5hdHRhY2hUb0JvZHknKTtyb290Vmlldy5hdHRhY2hUb0RvY3VtZW50KGRvY3VtZW50KTtyb290Vmlldy5mb2N1cygpO3RoaXMuX2luc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci51cGRhdGUoKTt9Cl9vcGVuVG9vbGJveFdpbmRvdyhldmVudCl7aWYoKGV2ZW50LmRhdGEudG8pIT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCkKcmV0dXJuO2lmKHRoaXMuX3Rvb2xib3hXaW5kb3cpCnJldHVybjtjb25zdCB1cmw9d2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnZGV2dG9vbHNfYXBwLmh0bWwnLCd0b29sYm94Lmh0bWwnKTt0aGlzLl90b29sYm94V2luZG93PXdpbmRvdy5vcGVuKHVybCx1bmRlZmluZWQpO30KdG9vbGJveExvYWRlZCh0b29sYm94RG9jdW1lbnQpe1VJLmluaXRpYWxpemVVSVV0aWxzKHRvb2xib3hEb2N1bWVudCxDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndWlUaGVtZScsJ2RlZmF1bHQnKSk7VUkuaW5zdGFsbENvbXBvbmVudFJvb3RTdHlsZXMoKHRvb2xib3hEb2N1bWVudC5ib2R5KSk7VUkuQ29udGV4dE1lbnUuaW5zdGFsbEhhbmRsZXIodG9vbGJveERvY3VtZW50KTtVSS5Ub29sdGlwLmluc3RhbGxIYW5kbGVyKHRvb2xib3hEb2N1bWVudCk7dGhpcy5fdG9vbGJveFJvb3RWaWV3PW5ldyBVSS5Sb290VmlldygpO3RoaXMuX3Rvb2xib3hSb290Vmlldy5hdHRhY2hUb0RvY3VtZW50KHRvb2xib3hEb2N1bWVudCk7dGhpcy5fdXBkYXRlRGV2aWNlTW9kZVZpZXcoKTt9Cl91cGRhdGVEZXZpY2VNb2RlVmlldygpe2lmKHRoaXMuX2lzRG9ja2VkKCkpCnRoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX2RldmljZU1vZGVWaWV3KTtlbHNlIGlmKHRoaXMuX3Rvb2xib3hSb290VmlldykKdGhpcy5fZGV2aWNlTW9kZVZpZXcuc2hvdyh0aGlzLl90b29sYm94Um9vdFZpZXcuZWxlbWVudCk7fQpfb25CZWZvcmVEb2NrU2lkZUNoYW5nZShldmVudCl7aWYoKGV2ZW50LmRhdGEudG8pPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCYmdGhpcy5fdG9vbGJveFJvb3RWaWV3KXt0aGlzLl9yb290U3BsaXRXaWRnZXQuaGlkZVNpZGViYXIoKTt0aGlzLl9pbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIudXBkYXRlKCk7fQp0aGlzLl9jaGFuZ2luZ0RvY2tTaWRlPXRydWU7fQpfb25Eb2NrU2lkZUNoYW5nZShldmVudCl7dGhpcy5fdXBkYXRlRGV2aWNlTW9kZVZpZXcoKTtjb25zdCB0b0RvY2tTaWRlPWV2ZW50PyhldmVudC5kYXRhLnRvKTpDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLmRvY2tTaWRlKCk7aWYodG9Eb2NrU2lkZT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuVW5kb2NrZWQpe3RoaXMuX3VwZGF0ZUZvclVuZG9ja2VkKCk7fWVsc2UgaWYodGhpcy5fdG9vbGJveFJvb3RWaWV3JiZldmVudCYmKGV2ZW50LmRhdGEuZnJvbSk9PT1Db21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLlVuZG9ja2VkKXt0aGlzLl9yb290U3BsaXRXaWRnZXQuaGlkZVNpZGViYXIoKTt9ZWxzZXt0aGlzLl91cGRhdGVGb3JEb2NrZWQodG9Eb2NrU2lkZSk7fX0KX29uQWZ0ZXJEb2NrU2lkZUNoYW5nZShldmVudCl7aWYoIXRoaXMuX2NoYW5naW5nRG9ja1NpZGUpCnJldHVybjtpZigoZXZlbnQuZGF0YS5mcm9tKT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuVW5kb2NrZWQpe3RoaXMuX3VwZGF0ZUZvckRvY2tlZCgoZXZlbnQuZGF0YS50bykpO30KdGhpcy5fY2hhbmdpbmdEb2NrU2lkZT1mYWxzZTt0aGlzLl9pbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIudXBkYXRlKCk7fQpfdXBkYXRlRm9yRG9ja2VkKGRvY2tTaWRlKXt0aGlzLl9yb290U3BsaXRXaWRnZXQucmVzaXplckVsZW1lbnQoKS5zdHlsZS50cmFuc2Zvcm09ZG9ja1NpZGU9PT1Db21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLkRvY2tlZFRvUmlnaHQ/J3RyYW5zbGF0ZVgoMnB4KSc6ZG9ja1NpZGU9PT1Db21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLkRvY2tlZFRvTGVmdD8ndHJhbnNsYXRlWCgtMnB4KSc6Jyc7dGhpcy5fcm9vdFNwbGl0V2lkZ2V0LnNldFZlcnRpY2FsKGRvY2tTaWRlPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb1JpZ2h0fHxkb2NrU2lkZT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9MZWZ0KTt0aGlzLl9yb290U3BsaXRXaWRnZXQuc2V0U2Vjb25kSXNTaWRlYmFyKGRvY2tTaWRlPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb1JpZ2h0fHxkb2NrU2lkZT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9Cb3R0b20pO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC50b2dnbGVSZXNpemVyKHRoaXMuX3Jvb3RTcGxpdFdpZGdldC5yZXNpemVyRWxlbWVudCgpLHRydWUpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC50b2dnbGVSZXNpemVyKFVJLmluc3BlY3RvclZpZXcudG9wUmVzaXplckVsZW1lbnQoKSxkb2NrU2lkZT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9Cb3R0b20pO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zaG93Qm90aCgpO30KX3VwZGF0ZUZvclVuZG9ja2VkKCl7dGhpcy5fcm9vdFNwbGl0V2lkZ2V0LnRvZ2dsZVJlc2l6ZXIodGhpcy5fcm9vdFNwbGl0V2lkZ2V0LnJlc2l6ZXJFbGVtZW50KCksZmFsc2UpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC50b2dnbGVSZXNpemVyKFVJLmluc3BlY3RvclZpZXcudG9wUmVzaXplckVsZW1lbnQoKSxmYWxzZSk7dGhpcy5fcm9vdFNwbGl0V2lkZ2V0LmhpZGVNYWluKCk7fQpfaXNEb2NrZWQoKXtyZXR1cm4gQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5kb2NrU2lkZSgpIT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZDt9Cl9vblNldEluc3BlY3RlZFBhZ2VCb3VuZHMoZXZlbnQpe2lmKHRoaXMuX2NoYW5naW5nRG9ja1NpZGUpCnJldHVybjtjb25zdCB3aW5kb3c9dGhpcy5faW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmVsZW1lbnQud2luZG93KCk7aWYoIXdpbmRvdy5pbm5lcldpZHRofHwhd2luZG93LmlubmVySGVpZ2h0KQpyZXR1cm47aWYoIXRoaXMuX2luc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5pc1Nob3dpbmcoKSkKcmV0dXJuO2NvbnN0IGJvdW5kcz0oZXZlbnQuZGF0YSk7Y29uc29sZS50aW1lU3RhbXAoJ0FkdmFuY2VkQXBwLnNldEluc3BlY3RlZFBhZ2VCb3VuZHMnKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0SW5zcGVjdGVkUGFnZUJvdW5kcyhib3VuZHMpO319O0VtdWxhdGlvbi5BZHZhbmNlZEFwcC5fYXBwSW5zdGFuY2U7RW11bGF0aW9uLkFkdmFuY2VkQXBwUHJvdmlkZXI9Y2xhc3N7Y3JlYXRlQXBwKCl7cmV0dXJuIEVtdWxhdGlvbi5BZHZhbmNlZEFwcC5faW5zdGFuY2UoKTt9fTs7RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy50aXRsZT0nJzt0aGlzLnR5cGU9RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLlR5cGUuVW5rbm93bjt0aGlzLnZlcnRpY2FsPXt3aWR0aDowLGhlaWdodDowLG91dGxpbmVJbnNldHM6bnVsbCxvdXRsaW5lSW1hZ2U6bnVsbH07dGhpcy5ob3Jpem9udGFsPXt3aWR0aDowLGhlaWdodDowLG91dGxpbmVJbnNldHM6bnVsbCxvdXRsaW5lSW1hZ2U6bnVsbH07dGhpcy5kZXZpY2VTY2FsZUZhY3Rvcj0xO3RoaXMuY2FwYWJpbGl0aWVzPVtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuQ2FwYWJpbGl0eS5Ub3VjaCxFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuQ2FwYWJpbGl0eS5Nb2JpbGVdO3RoaXMudXNlckFnZW50PScnO3RoaXMubW9kZXM9W107dGhpcy5fc2hvdz1FbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuX1Nob3cuRGVmYXVsdDt0aGlzLl9zaG93QnlEZWZhdWx0PXRydWU7dGhpcy5fZXh0ZW5zaW9uPW51bGw7fQpzdGF0aWMgZnJvbUpTT05WMShqc29uKXt0cnl7ZnVuY3Rpb24gcGFyc2VWYWx1ZShvYmplY3Qsa2V5LHR5cGUsZGVmYXVsdFZhbHVlKXtpZih0eXBlb2Ygb2JqZWN0IT09J29iamVjdCd8fG9iamVjdD09PW51bGx8fCFvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSl7aWYodHlwZW9mIGRlZmF1bHRWYWx1ZSE9PSd1bmRlZmluZWQnKQpyZXR1cm4gZGVmYXVsdFZhbHVlO3Rocm93IG5ldyBFcnJvcignRW11bGF0ZWQgZGV2aWNlIGlzIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCcnK2tleSsnXCcnKTt9CmNvbnN0IHZhbHVlPW9iamVjdFtrZXldO2lmKHR5cGVvZiB2YWx1ZSE9PXR5cGV8fHZhbHVlPT09bnVsbCkKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgcHJvcGVydHkgXCcnK2tleSsnXCcgaGFzIHdyb25nIHR5cGUgXCcnK3R5cGVvZiB2YWx1ZSsnXCcnKTtyZXR1cm4gdmFsdWU7fQpmdW5jdGlvbiBwYXJzZUludFZhbHVlKG9iamVjdCxrZXkpe2NvbnN0IHZhbHVlPShwYXJzZVZhbHVlKG9iamVjdCxrZXksJ251bWJlcicpKTtpZih2YWx1ZSE9PU1hdGguYWJzKHZhbHVlKSkKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgdmFsdWUgXCcnK2tleSsnXCcgbXVzdCBiZSBpbnRlZ2VyJyk7cmV0dXJuIHZhbHVlO30KZnVuY3Rpb24gcGFyc2VJbnNldHMoanNvbil7cmV0dXJuIG5ldyBVSS5JbnNldHMocGFyc2VJbnRWYWx1ZShqc29uLCdsZWZ0JykscGFyc2VJbnRWYWx1ZShqc29uLCd0b3AnKSxwYXJzZUludFZhbHVlKGpzb24sJ3JpZ2h0JykscGFyc2VJbnRWYWx1ZShqc29uLCdib3R0b20nKSk7fQpmdW5jdGlvbiBwYXJzZU9yaWVudGF0aW9uKGpzb24pe2NvbnN0IHJlc3VsdD17fTtyZXN1bHQud2lkdGg9cGFyc2VJbnRWYWx1ZShqc29uLCd3aWR0aCcpO2lmKHJlc3VsdC53aWR0aDwwfHxyZXN1bHQud2lkdGg+RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplfHxyZXN1bHQud2lkdGg8RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NaW5EZXZpY2VTaXplKQp0aHJvdyBuZXcgRXJyb3IoJ0VtdWxhdGVkIGRldmljZSBoYXMgd3Jvbmcgd2lkdGg6ICcrcmVzdWx0LndpZHRoKTtyZXN1bHQuaGVpZ2h0PXBhcnNlSW50VmFsdWUoanNvbiwnaGVpZ2h0Jyk7aWYocmVzdWx0LmhlaWdodDwwfHxyZXN1bHQuaGVpZ2h0PkVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWF4RGV2aWNlU2l6ZXx8cmVzdWx0LmhlaWdodDxFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1pbkRldmljZVNpemUpCnRocm93IG5ldyBFcnJvcignRW11bGF0ZWQgZGV2aWNlIGhhcyB3cm9uZyBoZWlnaHQ6ICcrcmVzdWx0LmhlaWdodCk7Y29uc3Qgb3V0bGluZUluc2V0cz1wYXJzZVZhbHVlKGpzb25bJ291dGxpbmUnXSwnaW5zZXRzJywnb2JqZWN0JyxudWxsKTtpZihvdXRsaW5lSW5zZXRzKXtyZXN1bHQub3V0bGluZUluc2V0cz1wYXJzZUluc2V0cyhvdXRsaW5lSW5zZXRzKTtpZihyZXN1bHQub3V0bGluZUluc2V0cy5sZWZ0PDB8fHJlc3VsdC5vdXRsaW5lSW5zZXRzLnRvcDwwKQp0aHJvdyBuZXcgRXJyb3IoJ0VtdWxhdGVkIGRldmljZSBoYXMgd3Jvbmcgb3V0bGluZSBpbnNldHMnKTtyZXN1bHQub3V0bGluZUltYWdlPShwYXJzZVZhbHVlKGpzb25bJ291dGxpbmUnXSwnaW1hZ2UnLCdzdHJpbmcnKSk7fQpyZXR1cm4ocmVzdWx0KTt9CmNvbnN0IHJlc3VsdD1uZXcgRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlKCk7cmVzdWx0LnRpdGxlPShwYXJzZVZhbHVlKGpzb24sJ3RpdGxlJywnc3RyaW5nJykpO3Jlc3VsdC50eXBlPShwYXJzZVZhbHVlKGpzb24sJ3R5cGUnLCdzdHJpbmcnKSk7Y29uc3QgcmF3VXNlckFnZW50PShwYXJzZVZhbHVlKGpzb24sJ3VzZXItYWdlbnQnLCdzdHJpbmcnKSk7cmVzdWx0LnVzZXJBZ2VudD1TREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5wYXRjaFVzZXJBZ2VudFdpdGhDaHJvbWVWZXJzaW9uKHJhd1VzZXJBZ2VudCk7Y29uc3QgY2FwYWJpbGl0aWVzPXBhcnNlVmFsdWUoanNvbiwnY2FwYWJpbGl0aWVzJywnb2JqZWN0JyxbXSk7aWYoIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSkKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgY2FwYWJpbGl0aWVzIG11c3QgYmUgYW4gYXJyYXknKTtyZXN1bHQuY2FwYWJpbGl0aWVzPVtdO2ZvcihsZXQgaT0wO2k8Y2FwYWJpbGl0aWVzLmxlbmd0aDsrK2kpe2lmKHR5cGVvZiBjYXBhYmlsaXRpZXNbaV0hPT0nc3RyaW5nJykKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgY2FwYWJpbGl0eSBtdXN0IGJlIGEgc3RyaW5nJyk7cmVzdWx0LmNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdGllc1tpXSk7fQpyZXN1bHQuZGV2aWNlU2NhbGVGYWN0b3I9KHBhcnNlVmFsdWUoanNvblsnc2NyZWVuJ10sJ2RldmljZS1waXhlbC1yYXRpbycsJ251bWJlcicpKTtpZihyZXN1bHQuZGV2aWNlU2NhbGVGYWN0b3I8MHx8cmVzdWx0LmRldmljZVNjYWxlRmFjdG9yPjEwMCkKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgaGFzIHdyb25nIGRldmljZVNjYWxlRmFjdG9yOiAnK3Jlc3VsdC5kZXZpY2VTY2FsZUZhY3Rvcik7cmVzdWx0LnZlcnRpY2FsPXBhcnNlT3JpZW50YXRpb24ocGFyc2VWYWx1ZShqc29uWydzY3JlZW4nXSwndmVydGljYWwnLCdvYmplY3QnKSk7cmVzdWx0Lmhvcml6b250YWw9cGFyc2VPcmllbnRhdGlvbihwYXJzZVZhbHVlKGpzb25bJ3NjcmVlbiddLCdob3Jpem9udGFsJywnb2JqZWN0JykpO2NvbnN0IG1vZGVzPXBhcnNlVmFsdWUoanNvbiwnbW9kZXMnLCdvYmplY3QnLFtdKTtpZighQXJyYXkuaXNBcnJheShtb2RlcykpCnRocm93IG5ldyBFcnJvcignRW11bGF0ZWQgZGV2aWNlIG1vZGVzIG11c3QgYmUgYW4gYXJyYXknKTtyZXN1bHQubW9kZXM9W107Zm9yKGxldCBpPTA7aTxtb2Rlcy5sZW5ndGg7KytpKXtjb25zdCBtb2RlPXt9O21vZGUudGl0bGU9KHBhcnNlVmFsdWUobW9kZXNbaV0sJ3RpdGxlJywnc3RyaW5nJykpO21vZGUub3JpZW50YXRpb249KHBhcnNlVmFsdWUobW9kZXNbaV0sJ29yaWVudGF0aW9uJywnc3RyaW5nJykpO2lmKG1vZGUub3JpZW50YXRpb24hPT1FbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuVmVydGljYWwmJm1vZGUub3JpZW50YXRpb24hPT1FbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuSG9yaXpvbnRhbCkKdGhyb3cgbmV3IEVycm9yKCdFbXVsYXRlZCBkZXZpY2UgbW9kZSBoYXMgd3Jvbmcgb3JpZW50YXRpb24gXCcnK21vZGUub3JpZW50YXRpb24rJ1wnJyk7Y29uc3Qgb3JpZW50YXRpb249cmVzdWx0Lm9yaWVudGF0aW9uQnlOYW1lKG1vZGUub3JpZW50YXRpb24pO21vZGUuaW5zZXRzPXBhcnNlSW5zZXRzKHBhcnNlVmFsdWUobW9kZXNbaV0sJ2luc2V0cycsJ29iamVjdCcpKTtpZihtb2RlLmluc2V0cy50b3A8MHx8bW9kZS5pbnNldHMubGVmdDwwfHxtb2RlLmluc2V0cy5yaWdodDwwfHxtb2RlLmluc2V0cy5ib3R0b208MHx8bW9kZS5pbnNldHMudG9wK21vZGUuaW5zZXRzLmJvdHRvbT5vcmllbnRhdGlvbi5oZWlnaHR8fG1vZGUuaW5zZXRzLmxlZnQrbW9kZS5pbnNldHMucmlnaHQ+b3JpZW50YXRpb24ud2lkdGgpCnRocm93IG5ldyBFcnJvcignRW11bGF0ZWQgZGV2aWNlIG1vZGUgXCcnK21vZGUudGl0bGUrJ1wnaGFzIHdyb25nIG1vZGUgaW5zZXRzJyk7bW9kZS5pbWFnZT0ocGFyc2VWYWx1ZShtb2Rlc1tpXSwnaW1hZ2UnLCdzdHJpbmcnLG51bGwpKTtyZXN1bHQubW9kZXMucHVzaChtb2RlKTt9CnJlc3VsdC5fc2hvd0J5RGVmYXVsdD0ocGFyc2VWYWx1ZShqc29uLCdzaG93LWJ5LWRlZmF1bHQnLCdib29sZWFuJyx1bmRlZmluZWQpKTtyZXN1bHQuX3Nob3c9KHBhcnNlVmFsdWUoanNvbiwnc2hvdycsJ3N0cmluZycsRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLl9TaG93LkRlZmF1bHQpKTtyZXR1cm4gcmVzdWx0O31jYXRjaChlKXtyZXR1cm4gbnVsbDt9fQpzdGF0aWMgZGV2aWNlQ29tcGFyYXRvcihkZXZpY2UxLGRldmljZTIpe2NvbnN0IG9yZGVyMT0oZGV2aWNlMS5fZXh0ZW5zaW9uJiZkZXZpY2UxLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydvcmRlciddKXx8LTE7Y29uc3Qgb3JkZXIyPShkZXZpY2UyLl9leHRlbnNpb24mJmRldmljZTIuX2V4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ29yZGVyJ10pfHwtMTtpZihvcmRlcjE+b3JkZXIyKQpyZXR1cm4gMTtpZihvcmRlcjI+b3JkZXIxKQpyZXR1cm4tMTtyZXR1cm4gZGV2aWNlMS50aXRsZTxkZXZpY2UyLnRpdGxlPy0xOihkZXZpY2UxLnRpdGxlPmRldmljZTIudGl0bGU/MTowKTt9CmV4dGVuc2lvbigpe3JldHVybiB0aGlzLl9leHRlbnNpb247fQpzZXRFeHRlbnNpb24oZXh0ZW5zaW9uKXt0aGlzLl9leHRlbnNpb249ZXh0ZW5zaW9uO30KbW9kZXNGb3JPcmllbnRhdGlvbihvcmllbnRhdGlvbil7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaW5kZXg9MDtpbmRleDx0aGlzLm1vZGVzLmxlbmd0aDtpbmRleCsrKXtpZih0aGlzLm1vZGVzW2luZGV4XS5vcmllbnRhdGlvbj09PW9yaWVudGF0aW9uKQpyZXN1bHQucHVzaCh0aGlzLm1vZGVzW2luZGV4XSk7fQpyZXR1cm4gcmVzdWx0O30KX3RvSlNPTigpe2NvbnN0IGpzb249e307anNvblsndGl0bGUnXT10aGlzLnRpdGxlO2pzb25bJ3R5cGUnXT10aGlzLnR5cGU7anNvblsndXNlci1hZ2VudCddPXRoaXMudXNlckFnZW50O2pzb25bJ2NhcGFiaWxpdGllcyddPXRoaXMuY2FwYWJpbGl0aWVzO2pzb25bJ3NjcmVlbiddPXt9O2pzb25bJ3NjcmVlbiddWydkZXZpY2UtcGl4ZWwtcmF0aW8nXT10aGlzLmRldmljZVNjYWxlRmFjdG9yO2pzb25bJ3NjcmVlbiddWyd2ZXJ0aWNhbCddPXRoaXMuX29yaWVudGF0aW9uVG9KU09OKHRoaXMudmVydGljYWwpO2pzb25bJ3NjcmVlbiddWydob3Jpem9udGFsJ109dGhpcy5fb3JpZW50YXRpb25Ub0pTT04odGhpcy5ob3Jpem9udGFsKTtqc29uWydtb2RlcyddPVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5tb2Rlcy5sZW5ndGg7KytpKXtjb25zdCBtb2RlPXt9O21vZGVbJ3RpdGxlJ109dGhpcy5tb2Rlc1tpXS50aXRsZTttb2RlWydvcmllbnRhdGlvbiddPXRoaXMubW9kZXNbaV0ub3JpZW50YXRpb247bW9kZVsnaW5zZXRzJ109e307bW9kZVsnaW5zZXRzJ11bJ2xlZnQnXT10aGlzLm1vZGVzW2ldLmluc2V0cy5sZWZ0O21vZGVbJ2luc2V0cyddWyd0b3AnXT10aGlzLm1vZGVzW2ldLmluc2V0cy50b3A7bW9kZVsnaW5zZXRzJ11bJ3JpZ2h0J109dGhpcy5tb2Rlc1tpXS5pbnNldHMucmlnaHQ7bW9kZVsnaW5zZXRzJ11bJ2JvdHRvbSddPXRoaXMubW9kZXNbaV0uaW5zZXRzLmJvdHRvbTtpZih0aGlzLm1vZGVzW2ldLmltYWdlKQptb2RlWydpbWFnZSddPXRoaXMubW9kZXNbaV0uaW1hZ2U7anNvblsnbW9kZXMnXS5wdXNoKG1vZGUpO30KanNvblsnc2hvdy1ieS1kZWZhdWx0J109dGhpcy5fc2hvd0J5RGVmYXVsdDtqc29uWydzaG93J109dGhpcy5fc2hvdztyZXR1cm4ganNvbjt9Cl9vcmllbnRhdGlvblRvSlNPTihvcmllbnRhdGlvbil7Y29uc3QganNvbj17fTtqc29uWyd3aWR0aCddPW9yaWVudGF0aW9uLndpZHRoO2pzb25bJ2hlaWdodCddPW9yaWVudGF0aW9uLmhlaWdodDtpZihvcmllbnRhdGlvbi5vdXRsaW5lSW5zZXRzKXtqc29uWydvdXRsaW5lJ109e307anNvblsnb3V0bGluZSddWydpbnNldHMnXT17fTtqc29uWydvdXRsaW5lJ11bJ2luc2V0cyddWydsZWZ0J109b3JpZW50YXRpb24ub3V0bGluZUluc2V0cy5sZWZ0O2pzb25bJ291dGxpbmUnXVsnaW5zZXRzJ11bJ3RvcCddPW9yaWVudGF0aW9uLm91dGxpbmVJbnNldHMudG9wO2pzb25bJ291dGxpbmUnXVsnaW5zZXRzJ11bJ3JpZ2h0J109b3JpZW50YXRpb24ub3V0bGluZUluc2V0cy5yaWdodDtqc29uWydvdXRsaW5lJ11bJ2luc2V0cyddWydib3R0b20nXT1vcmllbnRhdGlvbi5vdXRsaW5lSW5zZXRzLmJvdHRvbTtqc29uWydvdXRsaW5lJ11bJ2ltYWdlJ109b3JpZW50YXRpb24ub3V0bGluZUltYWdlO30KcmV0dXJuIGpzb247fQptb2RlSW1hZ2UobW9kZSl7aWYoIW1vZGUuaW1hZ2UpCnJldHVybicnO2lmKCF0aGlzLl9leHRlbnNpb24pCnJldHVybiBtb2RlLmltYWdlO3JldHVybiB0aGlzLl9leHRlbnNpb24ubW9kdWxlKCkuc3Vic3RpdHV0ZVVSTChtb2RlLmltYWdlKTt9Cm91dGxpbmVJbWFnZShtb2RlKXtjb25zdCBvcmllbnRhdGlvbj10aGlzLm9yaWVudGF0aW9uQnlOYW1lKG1vZGUub3JpZW50YXRpb24pO2lmKCFvcmllbnRhdGlvbi5vdXRsaW5lSW1hZ2UpCnJldHVybicnO2lmKCF0aGlzLl9leHRlbnNpb24pCnJldHVybiBvcmllbnRhdGlvbi5vdXRsaW5lSW1hZ2U7cmV0dXJuIHRoaXMuX2V4dGVuc2lvbi5tb2R1bGUoKS5zdWJzdGl0dXRlVVJMKG9yaWVudGF0aW9uLm91dGxpbmVJbWFnZSk7fQpvcmllbnRhdGlvbkJ5TmFtZShuYW1lKXtyZXR1cm4gbmFtZT09PUVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5WZXJ0aWNhbD90aGlzLnZlcnRpY2FsOnRoaXMuaG9yaXpvbnRhbDt9CnNob3coKXtpZih0aGlzLl9zaG93PT09RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLl9TaG93LkRlZmF1bHQpCnJldHVybiB0aGlzLl9zaG93QnlEZWZhdWx0O3JldHVybiB0aGlzLl9zaG93PT09RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLl9TaG93LkFsd2F5czt9CnNldFNob3coc2hvdyl7dGhpcy5fc2hvdz1zaG93P0VtdWxhdGlvbi5FbXVsYXRlZERldmljZS5fU2hvdy5BbHdheXM6RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLl9TaG93Lk5ldmVyO30KY29weVNob3dGcm9tKG90aGVyKXt0aGlzLl9zaG93PW90aGVyLl9zaG93O30KdG91Y2goKXtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMuaW5kZXhPZihFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuQ2FwYWJpbGl0eS5Ub3VjaCkhPT0tMTt9Cm1vYmlsZSgpe3JldHVybiB0aGlzLmNhcGFiaWxpdGllcy5pbmRleE9mKEVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5DYXBhYmlsaXR5Lk1vYmlsZSkhPT0tMTt9fTtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuTW9kZTtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuT3JpZW50YXRpb247RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLkhvcml6b250YWw9J2hvcml6b250YWwnO0VtdWxhdGlvbi5FbXVsYXRlZERldmljZS5WZXJ0aWNhbD0ndmVydGljYWwnO0VtdWxhdGlvbi5FbXVsYXRlZERldmljZS5UeXBlPXtQaG9uZToncGhvbmUnLFRhYmxldDondGFibGV0JyxOb3RlYm9vazonbm90ZWJvb2snLERlc2t0b3A6J2Rlc2t0b3AnLFVua25vd246J3Vua25vd24nfTtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuQ2FwYWJpbGl0eT17VG91Y2g6J3RvdWNoJyxNb2JpbGU6J21vYmlsZSd9O0VtdWxhdGlvbi5FbXVsYXRlZERldmljZS5fU2hvdz17QWx3YXlzOidBbHdheXMnLERlZmF1bHQ6J0RlZmF1bHQnLE5ldmVyOidOZXZlcid9O0VtdWxhdGlvbi5FbXVsYXRlZERldmljZXNMaXN0PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fc3RhbmRhcmRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzdGFuZGFyZEVtdWxhdGVkRGV2aWNlTGlzdCcsW10pO3RoaXMuX3N0YW5kYXJkPVtdO3RoaXMuX2xpc3RGcm9tSlNPTlYxKHRoaXMuX3N0YW5kYXJkU2V0dGluZy5nZXQoKSx0aGlzLl9zdGFuZGFyZCk7dGhpcy5fdXBkYXRlU3RhbmRhcmREZXZpY2VzKCk7dGhpcy5fY3VzdG9tU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnY3VzdG9tRW11bGF0ZWREZXZpY2VMaXN0JyxbXSk7dGhpcy5fY3VzdG9tPVtdO2lmKCF0aGlzLl9saXN0RnJvbUpTT05WMSh0aGlzLl9jdXN0b21TZXR0aW5nLmdldCgpLHRoaXMuX2N1c3RvbSkpCnRoaXMuc2F2ZUN1c3RvbURldmljZXMoKTt9CnN0YXRpYyBpbnN0YW5jZSgpe2lmKCFFbXVsYXRpb24uRW11bGF0ZWREZXZpY2VzTGlzdC5faW5zdGFuY2UpCkVtdWxhdGlvbi5FbXVsYXRlZERldmljZXNMaXN0Ll9pbnN0YW5jZT1uZXcgRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QoKTtyZXR1cm4oRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QuX2luc3RhbmNlKTt9Cl91cGRhdGVTdGFuZGFyZERldmljZXMoKXtjb25zdCBkZXZpY2VzPVtdO2NvbnN0IGV4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoJ2VtdWxhdGVkLWRldmljZScpO2ZvcihsZXQgaT0wO2k8ZXh0ZW5zaW9ucy5sZW5ndGg7KytpKXtjb25zdCBkZXZpY2U9RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLmZyb21KU09OVjEoZXh0ZW5zaW9uc1tpXS5kZXNjcmlwdG9yKClbJ2RldmljZSddKTtkZXZpY2Uuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pO2RldmljZXMucHVzaChkZXZpY2UpO30KdGhpcy5fY29weVNob3dWYWx1ZXModGhpcy5fc3RhbmRhcmQsZGV2aWNlcyk7dGhpcy5fc3RhbmRhcmQ9ZGV2aWNlczt0aGlzLnNhdmVTdGFuZGFyZERldmljZXMoKTt9Cl9saXN0RnJvbUpTT05WMShqc29uQXJyYXkscmVzdWx0KXtpZighQXJyYXkuaXNBcnJheShqc29uQXJyYXkpKQpyZXR1cm4gZmFsc2U7bGV0IHN1Y2Nlc3M9dHJ1ZTtmb3IobGV0IGk9MDtpPGpzb25BcnJheS5sZW5ndGg7KytpKXtjb25zdCBkZXZpY2U9RW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLmZyb21KU09OVjEoanNvbkFycmF5W2ldKTtpZihkZXZpY2Upe3Jlc3VsdC5wdXNoKGRldmljZSk7aWYoIWRldmljZS5tb2Rlcy5sZW5ndGgpe2RldmljZS5tb2Rlcy5wdXNoKHt0aXRsZTonJyxvcmllbnRhdGlvbjpFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuSG9yaXpvbnRhbCxpbnNldHM6bmV3IFVJLkluc2V0cygwLDAsMCwwKSxpbWFnZTpudWxsfSk7ZGV2aWNlLm1vZGVzLnB1c2goe3RpdGxlOicnLG9yaWVudGF0aW9uOkVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5WZXJ0aWNhbCxpbnNldHM6bmV3IFVJLkluc2V0cygwLDAsMCwwKSxpbWFnZTpudWxsfSk7fX1lbHNle3N1Y2Nlc3M9ZmFsc2U7fX0KcmV0dXJuIHN1Y2Nlc3M7fQpzdGFuZGFyZCgpe3JldHVybiB0aGlzLl9zdGFuZGFyZDt9CmN1c3RvbSgpe3JldHVybiB0aGlzLl9jdXN0b207fQpyZXZlYWxDdXN0b21TZXR0aW5nKCl7Q29tbW9uLlJldmVhbGVyLnJldmVhbCh0aGlzLl9jdXN0b21TZXR0aW5nKTt9CmFkZEN1c3RvbURldmljZShkZXZpY2Upe3RoaXMuX2N1c3RvbS5wdXNoKGRldmljZSk7dGhpcy5zYXZlQ3VzdG9tRGV2aWNlcygpO30KcmVtb3ZlQ3VzdG9tRGV2aWNlKGRldmljZSl7dGhpcy5fY3VzdG9tLnJlbW92ZShkZXZpY2UpO3RoaXMuc2F2ZUN1c3RvbURldmljZXMoKTt9CnNhdmVDdXN0b21EZXZpY2VzKCl7Y29uc3QganNvbj10aGlzLl9jdXN0b20ubWFwKGZ1bmN0aW9uKGRldmljZSl7cmV0dXJuIGRldmljZS5fdG9KU09OKCk7fSk7dGhpcy5fY3VzdG9tU2V0dGluZy5zZXQoanNvbik7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QuRXZlbnRzLkN1c3RvbURldmljZXNVcGRhdGVkKTt9CnNhdmVTdGFuZGFyZERldmljZXMoKXtjb25zdCBqc29uPXRoaXMuX3N0YW5kYXJkLm1hcChmdW5jdGlvbihkZXZpY2Upe3JldHVybiBkZXZpY2UuX3RvSlNPTigpO30pO3RoaXMuX3N0YW5kYXJkU2V0dGluZy5zZXQoanNvbik7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QuRXZlbnRzLlN0YW5kYXJkRGV2aWNlc1VwZGF0ZWQpO30KX2NvcHlTaG93VmFsdWVzKGZyb20sdG8pe2NvbnN0IGRldmljZUJ5SWQ9bmV3IE1hcCgpO2ZvcihsZXQgaT0wO2k8ZnJvbS5sZW5ndGg7KytpKQpkZXZpY2VCeUlkLnNldChmcm9tW2ldLnRpdGxlLGZyb21baV0pO2ZvcihsZXQgaT0wO2k8dG8ubGVuZ3RoOysraSl7Y29uc3QgdGl0bGU9dG9baV0udGl0bGU7aWYoZGV2aWNlQnlJZC5oYXModGl0bGUpKQp0b1tpXS5jb3B5U2hvd0Zyb20oKGRldmljZUJ5SWQuZ2V0KHRpdGxlKSkpO319fTtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2VzTGlzdC5FdmVudHM9e0N1c3RvbURldmljZXNVcGRhdGVkOlN5bWJvbCgnQ3VzdG9tRGV2aWNlc1VwZGF0ZWQnKSxTdGFuZGFyZERldmljZXNVcGRhdGVkOlN5bWJvbCgnU3RhbmRhcmREZXZpY2VzVXBkYXRlZCcpfTtFbXVsYXRpb24uRW11bGF0ZWREZXZpY2VzTGlzdC5faW5zdGFuY2U7O0VtdWxhdGlvbi5EZXZpY2VzU2V0dGluZ3NUYWI9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3MtdGFiLWNvbnRhaW5lcicpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkZXZpY2VzLXNldHRpbmdzLXRhYicpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZW11bGF0aW9uL2RldmljZXNTZXR0aW5nc1RhYi5jc3MnKTtjb25zdCBoZWFkZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdoZWFkZXInKTtoZWFkZXIuY3JlYXRlQ2hpbGQoJ2gzJykuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnRW11bGF0ZWQgRGV2aWNlcycpKTt0aGlzLmNvbnRhaW5lckVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy1jb250YWluZXItd3JhcHBlcicpLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy10YWIgc2V0dGluZ3MtY29udGVudCBzZXR0aW5ncy1jb250YWluZXInKTtjb25zdCBidXR0b25zUm93PXRoaXMuY29udGFpbmVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlcy1idXR0b24tcm93Jyk7dGhpcy5fYWRkQ3VzdG9tQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgY3VzdG9tIGRldmljZS4uLicpLHRoaXMuX2FkZEN1c3RvbURldmljZS5iaW5kKHRoaXMpKTtidXR0b25zUm93LmFwcGVuZENoaWxkKHRoaXMuX2FkZEN1c3RvbUJ1dHRvbik7dGhpcy5fbGlzdD1uZXcgVUkuTGlzdFdpZGdldCh0aGlzKTt0aGlzLl9saXN0LnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2VtdWxhdGlvbi9kZXZpY2VzU2V0dGluZ3NUYWIuY3NzJyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RldmljZXMtbGlzdCcpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmNvbnRhaW5lckVsZW1lbnQpO3RoaXMuX211dGVVcGRhdGU9ZmFsc2U7dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdD1FbXVsYXRpb24uRW11bGF0ZWREZXZpY2VzTGlzdC5pbnN0YW5jZSgpO3RoaXMuX2VtdWxhdGVkRGV2aWNlc0xpc3QuYWRkRXZlbnRMaXN0ZW5lcihFbXVsYXRpb24uRW11bGF0ZWREZXZpY2VzTGlzdC5FdmVudHMuQ3VzdG9tRGV2aWNlc1VwZGF0ZWQsdGhpcy5fZGV2aWNlc1VwZGF0ZWQsdGhpcyk7dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdC5hZGRFdmVudExpc3RlbmVyKEVtdWxhdGlvbi5FbXVsYXRlZERldmljZXNMaXN0LkV2ZW50cy5TdGFuZGFyZERldmljZXNVcGRhdGVkLHRoaXMuX2RldmljZXNVcGRhdGVkLHRoaXMpO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX2FkZEN1c3RvbUJ1dHRvbik7fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7dGhpcy5fZGV2aWNlc1VwZGF0ZWQoKTt9Cl9kZXZpY2VzVXBkYXRlZCgpe2lmKHRoaXMuX211dGVVcGRhdGUpCnJldHVybjt0aGlzLl9saXN0LmNsZWFyKCk7bGV0IGRldmljZXM9dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdC5jdXN0b20oKS5zbGljZSgpO2ZvcihsZXQgaT0wO2k8ZGV2aWNlcy5sZW5ndGg7KytpKQp0aGlzLl9saXN0LmFwcGVuZEl0ZW0oZGV2aWNlc1tpXSx0cnVlKTt0aGlzLl9saXN0LmFwcGVuZFNlcGFyYXRvcigpO2RldmljZXM9dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdC5zdGFuZGFyZCgpLnNsaWNlKCk7ZGV2aWNlcy5zb3J0KEVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5kZXZpY2VDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPGRldmljZXMubGVuZ3RoOysraSkKdGhpcy5fbGlzdC5hcHBlbmRJdGVtKGRldmljZXNbaV0sZmFsc2UpO30KX211dGVBbmRTYXZlRGV2aWNlTGlzdChjdXN0b20pe3RoaXMuX211dGVVcGRhdGU9dHJ1ZTtpZihjdXN0b20pCnRoaXMuX2VtdWxhdGVkRGV2aWNlc0xpc3Quc2F2ZUN1c3RvbURldmljZXMoKTtlbHNlCnRoaXMuX2VtdWxhdGVkRGV2aWNlc0xpc3Quc2F2ZVN0YW5kYXJkRGV2aWNlcygpO3RoaXMuX211dGVVcGRhdGU9ZmFsc2U7fQpfYWRkQ3VzdG9tRGV2aWNlKCl7Y29uc3QgZGV2aWNlPW5ldyBFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UoKTtkZXZpY2UuZGV2aWNlU2NhbGVGYWN0b3I9MDtkZXZpY2UuaG9yaXpvbnRhbC53aWR0aD03MDA7ZGV2aWNlLmhvcml6b250YWwuaGVpZ2h0PTQwMDtkZXZpY2UudmVydGljYWwud2lkdGg9NDAwO2RldmljZS52ZXJ0aWNhbC5oZWlnaHQ9NzAwO3RoaXMuX2xpc3QuYWRkTmV3SXRlbSh0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LmN1c3RvbSgpLmxlbmd0aCxkZXZpY2UpO30KX3RvTnVtZXJpY0lucHV0VmFsdWUodmFsdWUpe3JldHVybiB2YWx1ZT9TdHJpbmcodmFsdWUpOicnO30KcmVuZGVySXRlbShpdGVtLGVkaXRhYmxlKXtjb25zdCBkZXZpY2U9KGl0ZW0pO2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZGV2aWNlcy1saXN0LWl0ZW0nKTtjb25zdCBjaGVja2JveD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdpbnB1dCcsJ2RldmljZXMtbGlzdC1jaGVja2JveCcpO2NoZWNrYm94LnR5cGU9J2NoZWNrYm94JztjaGVja2JveC5jaGVja2VkPWRldmljZS5zaG93KCk7Y2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT5ldmVudC5jb25zdW1lKCksZmFsc2UpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZXMtbGlzdC10aXRsZScpLnRleHRDb250ZW50PWRldmljZS50aXRsZTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxvbkl0ZW1DbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO3JldHVybiBlbGVtZW50O2Z1bmN0aW9uIG9uSXRlbUNsaWNrZWQoZXZlbnQpe2NvbnN0IHNob3c9IWNoZWNrYm94LmNoZWNrZWQ7ZGV2aWNlLnNldFNob3coc2hvdyk7dGhpcy5fbXV0ZUFuZFNhdmVEZXZpY2VMaXN0KGVkaXRhYmxlKTtjaGVja2JveC5jaGVja2VkPXNob3c7ZXZlbnQuY29uc3VtZSgpO319CnJlbW92ZUl0ZW1SZXF1ZXN0ZWQoaXRlbSxpbmRleCl7dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdC5yZW1vdmVDdXN0b21EZXZpY2UoKGl0ZW0pKTt9CmNvbW1pdEVkaXQoaXRlbSxlZGl0b3IsaXNOZXcpe2NvbnN0IGRldmljZT0oaXRlbSk7ZGV2aWNlLnRpdGxlPWVkaXRvci5jb250cm9sKCd0aXRsZScpLnZhbHVlLnRyaW0oKTtkZXZpY2UudmVydGljYWwud2lkdGg9ZWRpdG9yLmNvbnRyb2woJ3dpZHRoJykudmFsdWU/cGFyc2VJbnQoZWRpdG9yLmNvbnRyb2woJ3dpZHRoJykudmFsdWUsMTApOjA7ZGV2aWNlLnZlcnRpY2FsLmhlaWdodD1lZGl0b3IuY29udHJvbCgnaGVpZ2h0JykudmFsdWU/cGFyc2VJbnQoZWRpdG9yLmNvbnRyb2woJ2hlaWdodCcpLnZhbHVlLDEwKTowO2RldmljZS5ob3Jpem9udGFsLndpZHRoPWRldmljZS52ZXJ0aWNhbC5oZWlnaHQ7ZGV2aWNlLmhvcml6b250YWwuaGVpZ2h0PWRldmljZS52ZXJ0aWNhbC53aWR0aDtkZXZpY2UuZGV2aWNlU2NhbGVGYWN0b3I9ZWRpdG9yLmNvbnRyb2woJ3NjYWxlJykudmFsdWU/cGFyc2VGbG9hdChlZGl0b3IuY29udHJvbCgnc2NhbGUnKS52YWx1ZSk6MDtkZXZpY2UudXNlckFnZW50PWVkaXRvci5jb250cm9sKCd1c2VyLWFnZW50JykudmFsdWU7ZGV2aWNlLm1vZGVzPVtdO2RldmljZS5tb2Rlcy5wdXNoKHt0aXRsZTonJyxvcmllbnRhdGlvbjpFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuVmVydGljYWwsaW5zZXRzOm5ldyBVSS5JbnNldHMoMCwwLDAsMCksaW1hZ2U6bnVsbH0pO2RldmljZS5tb2Rlcy5wdXNoKHt0aXRsZTonJyxvcmllbnRhdGlvbjpFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuSG9yaXpvbnRhbCxpbnNldHM6bmV3IFVJLkluc2V0cygwLDAsMCwwKSxpbWFnZTpudWxsfSk7ZGV2aWNlLmNhcGFiaWxpdGllcz1bXTtjb25zdCB1YVR5cGU9ZWRpdG9yLmNvbnRyb2woJ3VhLXR5cGUnKS52YWx1ZTtpZih1YVR5cGU9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZXx8dWFUeXBlPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGVOb1RvdWNoKQpkZXZpY2UuY2FwYWJpbGl0aWVzLnB1c2goRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLkNhcGFiaWxpdHkuTW9iaWxlKTtpZih1YVR5cGU9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZXx8dWFUeXBlPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wVG91Y2gpCmRldmljZS5jYXBhYmlsaXRpZXMucHVzaChFbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuQ2FwYWJpbGl0eS5Ub3VjaCk7aWYoaXNOZXcpCnRoaXMuX2VtdWxhdGVkRGV2aWNlc0xpc3QuYWRkQ3VzdG9tRGV2aWNlKGRldmljZSk7ZWxzZQp0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LnNhdmVDdXN0b21EZXZpY2VzKCk7dGhpcy5fYWRkQ3VzdG9tQnV0dG9uLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTt0aGlzLl9hZGRDdXN0b21CdXR0b24uZm9jdXMoKTt9CmJlZ2luRWRpdChpdGVtKXtjb25zdCBkZXZpY2U9KGl0ZW0pO2NvbnN0IGVkaXRvcj10aGlzLl9jcmVhdGVFZGl0b3IoKTtlZGl0b3IuY29udHJvbCgndGl0bGUnKS52YWx1ZT1kZXZpY2UudGl0bGU7ZWRpdG9yLmNvbnRyb2woJ3dpZHRoJykudmFsdWU9dGhpcy5fdG9OdW1lcmljSW5wdXRWYWx1ZShkZXZpY2UudmVydGljYWwud2lkdGgpO2VkaXRvci5jb250cm9sKCdoZWlnaHQnKS52YWx1ZT10aGlzLl90b051bWVyaWNJbnB1dFZhbHVlKGRldmljZS52ZXJ0aWNhbC5oZWlnaHQpO2VkaXRvci5jb250cm9sKCdzY2FsZScpLnZhbHVlPXRoaXMuX3RvTnVtZXJpY0lucHV0VmFsdWUoZGV2aWNlLmRldmljZVNjYWxlRmFjdG9yKTtlZGl0b3IuY29udHJvbCgndXNlci1hZ2VudCcpLnZhbHVlPWRldmljZS51c2VyQWdlbnQ7bGV0IHVhVHlwZTtpZihkZXZpY2UubW9iaWxlKCkpCnVhVHlwZT1kZXZpY2UudG91Y2goKT9FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZTpFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZU5vVG91Y2g7ZWxzZQp1YVR5cGU9ZGV2aWNlLnRvdWNoKCk/RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wVG91Y2g6RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wO2VkaXRvci5jb250cm9sKCd1YS10eXBlJykudmFsdWU9dWFUeXBlO3JldHVybiBlZGl0b3I7fQpfY3JlYXRlRWRpdG9yKCl7aWYodGhpcy5fZWRpdG9yKQpyZXR1cm4gdGhpcy5fZWRpdG9yO2NvbnN0IGVkaXRvcj1uZXcgVUkuTGlzdFdpZGdldC5FZGl0b3IoKTt0aGlzLl9lZGl0b3I9ZWRpdG9yO2NvbnN0IGNvbnRlbnQ9ZWRpdG9yLmNvbnRlbnRFbGVtZW50KCk7Y29uc3QgZmllbGRzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZXMtZWRpdC1maWVsZHMnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hib3gnKS5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlSW5wdXQoJ3RpdGxlJywndGV4dCcsQ29tbW9uLlVJU3RyaW5nKCdEZXZpY2UgbmFtZScpLHRpdGxlVmFsaWRhdG9yKSk7Y29uc3Qgc2NyZWVuPWZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnaGJveCcpO3NjcmVlbi5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlSW5wdXQoJ3dpZHRoJywndGV4dCcsQ29tbW9uLlVJU3RyaW5nKCdXaWR0aCcpLHNpemVWYWxpZGF0b3IpKTtzY3JlZW4uYXBwZW5kQ2hpbGQoZWRpdG9yLmNyZWF0ZUlucHV0KCdoZWlnaHQnLCd0ZXh0JyxDb21tb24uVUlTdHJpbmcoJ2hlaWdodCcpLHNpemVWYWxpZGF0b3IpKTtjb25zdCBkcHI9ZWRpdG9yLmNyZWF0ZUlucHV0KCdzY2FsZScsJ3RleHQnLENvbW1vbi5VSVN0cmluZygnRGV2aWNlIHBpeGVsIHJhdGlvJyksc2NhbGVWYWxpZGF0b3IpO2Rwci5jbGFzc0xpc3QuYWRkKCdkZXZpY2UtZWRpdC1maXhlZCcpO3NjcmVlbi5hcHBlbmRDaGlsZChkcHIpO2NvbnN0IHVhPWZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnaGJveCcpO3VhLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgndXNlci1hZ2VudCcsJ3RleHQnLENvbW1vbi5VSVN0cmluZygnVXNlciBhZ2VudCBzdHJpbmcnKSwoKT0+dHJ1ZSkpO2NvbnN0IHVhVHlwZT1lZGl0b3IuY3JlYXRlU2VsZWN0KCd1YS10eXBlJyxbRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGUsRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGVOb1RvdWNoLEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuRGVza3RvcCxFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLkRlc2t0b3BUb3VjaF0sKCk9PnRydWUpO3VhVHlwZS5jbGFzc0xpc3QuYWRkKCdkZXZpY2UtZWRpdC1maXhlZCcpO3VhLmFwcGVuZENoaWxkKHVhVHlwZSk7cmV0dXJuIGVkaXRvcjtmdW5jdGlvbiB0aXRsZVZhbGlkYXRvcihpdGVtLGluZGV4LGlucHV0KXtjb25zdCB2YWx1ZT1pbnB1dC52YWx1ZS50cmltKCk7cmV0dXJuIHZhbHVlLmxlbmd0aD4wJiZ2YWx1ZS5sZW5ndGg8NTA7fQpmdW5jdGlvbiBzaXplVmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe3JldHVybiBFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLmRldmljZVNpemVWYWxpZGF0b3IoaW5wdXQudmFsdWUpO30KZnVuY3Rpb24gc2NhbGVWYWxpZGF0b3IoaXRlbSxpbmRleCxpbnB1dCl7cmV0dXJuIEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuZGV2aWNlU2NhbGVGYWN0b3JWYWxpZGF0b3IoaW5wdXQudmFsdWUpO319fTs7RW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlcj1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZW11bGF0aW9uL2luc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5jc3MnKTtVSS56b29tTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFVJLlpvb21NYW5hZ2VyLkV2ZW50cy5ab29tQ2hhbmdlZCx0aGlzLm9uUmVzaXplLHRoaXMpO3RoaXMucmVzdG9yZU1pbmltdW1TaXplKCk7fQpvblJlc2l6ZSgpe2lmKHRoaXMuX3VwZGF0ZUlkKQp0aGlzLmVsZW1lbnQud2luZG93KCkuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdXBkYXRlSWQpO3RoaXMuX3VwZGF0ZUlkPXRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGUuYmluZCh0aGlzLGZhbHNlKSk7fQpyZXN0b3JlTWluaW11bVNpemUoKXt0aGlzLnNldE1pbmltdW1TaXplKDE1MCwxNTApO30KY2xlYXJNaW5pbXVtU2l6ZSgpe3RoaXMuc2V0TWluaW11bVNpemUoMSwxKTt9Cl9kaXBQYWdlUmVjdCgpe2NvbnN0IHpvb21GYWN0b3I9VUkuem9vbU1hbmFnZXIuem9vbUZhY3RvcigpO2NvbnN0IHJlY3Q9dGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IGJvZHlSZWN0PXRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Y29uc3QgbGVmdD1NYXRoLm1heChyZWN0LmxlZnQqem9vbUZhY3Rvcixib2R5UmVjdC5sZWZ0Knpvb21GYWN0b3IpO2NvbnN0IHRvcD1NYXRoLm1heChyZWN0LnRvcCp6b29tRmFjdG9yLGJvZHlSZWN0LnRvcCp6b29tRmFjdG9yKTtjb25zdCBib3R0b209TWF0aC5taW4ocmVjdC5ib3R0b20qem9vbUZhY3Rvcixib2R5UmVjdC5ib3R0b20qem9vbUZhY3Rvcik7Y29uc3QgcmlnaHQ9TWF0aC5taW4ocmVjdC5yaWdodCp6b29tRmFjdG9yLGJvZHlSZWN0LnJpZ2h0Knpvb21GYWN0b3IpO3JldHVybnt4OmxlZnQseTp0b3Asd2lkdGg6cmlnaHQtbGVmdCxoZWlnaHQ6Ym90dG9tLXRvcH07fQp1cGRhdGUoZm9yY2Upe2RlbGV0ZSB0aGlzLl91cGRhdGVJZDtjb25zdCByZWN0PXRoaXMuX2RpcFBhZ2VSZWN0KCk7Y29uc3QgYm91bmRzPXt4Ok1hdGgucm91bmQocmVjdC54KSx5Ok1hdGgucm91bmQocmVjdC55KSxoZWlnaHQ6TWF0aC5tYXgoMSxNYXRoLnJvdW5kKHJlY3QuaGVpZ2h0KSksd2lkdGg6TWF0aC5tYXgoMSxNYXRoLnJvdW5kKHJlY3Qud2lkdGgpKSx9O2lmKGZvcmNlKXstLWJvdW5kcy5oZWlnaHQ7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5FdmVudHMuVXBkYXRlLGJvdW5kcyk7Kytib3VuZHMuaGVpZ2h0O30KdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5FdmVudHMuVXBkYXRlLGJvdW5kcyk7fX07RW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5pbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBzZWxmLnNpbmdsZXRvbihFbXVsYXRpb24uSW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyKTt9O0VtdWxhdGlvbi5JbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIuRXZlbnRzPXtVcGRhdGU6U3ltYm9sKCdVcGRhdGUnKX07O0VtdWxhdGlvbi5NZWRpYVF1ZXJ5SW5zcGVjdG9yPWNsYXNzIGV4dGVuZHMgVUkuV2lkZ2V0e2NvbnN0cnVjdG9yKGdldFdpZHRoQ2FsbGJhY2ssc2V0V2lkdGhDYWxsYmFjayl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbXVsYXRpb24vbWVkaWFRdWVyeUluc3BlY3Rvci5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21lZGlhLWluc3BlY3Rvci12aWV3Jyk7dGhpcy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25NZWRpYVF1ZXJ5Q2xpY2tlZC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9vbkNvbnRleHRNZW51LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX21lZGlhVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDApO3RoaXMuX2dldFdpZHRoQ2FsbGJhY2s9Z2V0V2lkdGhDYWxsYmFjazt0aGlzLl9zZXRXaWR0aENhbGxiYWNrPXNldFdpZHRoQ2FsbGJhY2s7dGhpcy5fc2NhbGU9MTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5DU1NNb2RlbCx0aGlzKTtVSS56b29tTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFVJLlpvb21NYW5hZ2VyLkV2ZW50cy5ab29tQ2hhbmdlZCx0aGlzLl9yZW5kZXJNZWRpYVF1ZXJpZXMuYmluZCh0aGlzKSx0aGlzKTt9Cm1vZGVsQWRkZWQoY3NzTW9kZWwpe2lmKHRoaXMuX2Nzc01vZGVsKQpyZXR1cm47dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5fY3NzTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRBZGRlZCx0aGlzLl9zY2hlZHVsZU1lZGlhUXVlcmllc1VwZGF0ZSx0aGlzKTt0aGlzLl9jc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuU3R5bGVTaGVldFJlbW92ZWQsdGhpcy5fc2NoZWR1bGVNZWRpYVF1ZXJpZXNVcGRhdGUsdGhpcyk7dGhpcy5fY3NzTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRDaGFuZ2VkLHRoaXMuX3NjaGVkdWxlTWVkaWFRdWVyaWVzVXBkYXRlLHRoaXMpO3RoaXMuX2Nzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5NZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCx0aGlzLl9zY2hlZHVsZU1lZGlhUXVlcmllc1VwZGF0ZSx0aGlzKTt9Cm1vZGVsUmVtb3ZlZChjc3NNb2RlbCl7aWYoY3NzTW9kZWwhPT10aGlzLl9jc3NNb2RlbCkKcmV0dXJuO3RoaXMuX2Nzc01vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0QWRkZWQsdGhpcy5fc2NoZWR1bGVNZWRpYVF1ZXJpZXNVcGRhdGUsdGhpcyk7dGhpcy5fY3NzTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRSZW1vdmVkLHRoaXMuX3NjaGVkdWxlTWVkaWFRdWVyaWVzVXBkYXRlLHRoaXMpO3RoaXMuX2Nzc01vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0Q2hhbmdlZCx0aGlzLl9zY2hlZHVsZU1lZGlhUXVlcmllc1VwZGF0ZSx0aGlzKTt0aGlzLl9jc3NNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuTWVkaWFRdWVyeVJlc3VsdENoYW5nZWQsdGhpcy5fc2NoZWR1bGVNZWRpYVF1ZXJpZXNVcGRhdGUsdGhpcyk7ZGVsZXRlIHRoaXMuX2Nzc01vZGVsO30Kc2V0QXhpc1RyYW5zZm9ybShzY2FsZSl7aWYoTWF0aC5hYnModGhpcy5fc2NhbGUtc2NhbGUpPDFlLTgpCnJldHVybjt0aGlzLl9zY2FsZT1zY2FsZTt0aGlzLl9yZW5kZXJNZWRpYVF1ZXJpZXMoKTt9Cl9vbk1lZGlhUXVlcnlDbGlja2VkKGV2ZW50KXtjb25zdCBtZWRpYVF1ZXJ5TWFya2VyPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdtZWRpYS1pbnNwZWN0b3ItYmFyJyk7aWYoIW1lZGlhUXVlcnlNYXJrZXIpCnJldHVybjtjb25zdCBtb2RlbD1tZWRpYVF1ZXJ5TWFya2VyLl9tb2RlbDtpZihtb2RlbC5zZWN0aW9uKCk9PT1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1heCl7dGhpcy5fc2V0V2lkdGhDYWxsYmFjayhtb2RlbC5tYXhXaWR0aEV4cHJlc3Npb24oKS5jb21wdXRlZExlbmd0aCgpKTtyZXR1cm47fQppZihtb2RlbC5zZWN0aW9uKCk9PT1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1pbil7dGhpcy5fc2V0V2lkdGhDYWxsYmFjayhtb2RlbC5taW5XaWR0aEV4cHJlc3Npb24oKS5jb21wdXRlZExlbmd0aCgpKTtyZXR1cm47fQpjb25zdCBjdXJyZW50V2lkdGg9dGhpcy5fZ2V0V2lkdGhDYWxsYmFjaygpO2lmKGN1cnJlbnRXaWR0aCE9PW1vZGVsLm1pbldpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCkpCnRoaXMuX3NldFdpZHRoQ2FsbGJhY2sobW9kZWwubWluV2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKSk7ZWxzZQp0aGlzLl9zZXRXaWR0aENhbGxiYWNrKG1vZGVsLm1heFdpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCkpO30KX29uQ29udGV4dE1lbnUoZXZlbnQpe2lmKCF0aGlzLl9jc3NNb2RlbHx8IXRoaXMuX2Nzc01vZGVsLmlzRW5hYmxlZCgpKQpyZXR1cm47Y29uc3QgbWVkaWFRdWVyeU1hcmtlcj1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnbWVkaWEtaW5zcGVjdG9yLWJhcicpO2lmKCFtZWRpYVF1ZXJ5TWFya2VyKQpyZXR1cm47Y29uc3QgbG9jYXRpb25zPW1lZGlhUXVlcnlNYXJrZXIuX2xvY2F0aW9ucztjb25zdCB1aUxvY2F0aW9ucz1uZXcgTWFwKCk7Zm9yKGxldCBpPTA7aTxsb2NhdGlvbnMubGVuZ3RoOysraSl7Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKGxvY2F0aW9uc1tpXSk7aWYoIXVpTG9jYXRpb24pCmNvbnRpbnVlO2NvbnN0IGRlc2NyaXB0b3I9U3RyaW5nLnNwcmludGYoJyVzOiVkOiVkJyx1aUxvY2F0aW9uLnVpU291cmNlQ29kZS51cmwoKSx1aUxvY2F0aW9uLmxpbmVOdW1iZXIrMSx1aUxvY2F0aW9uLmNvbHVtbk51bWJlcisxKTt1aUxvY2F0aW9ucy5zZXQoZGVzY3JpcHRvcix1aUxvY2F0aW9uKTt9CmNvbnN0IGNvbnRleHRNZW51SXRlbXM9dWlMb2NhdGlvbnMua2V5c0FycmF5KCkuc29ydCgpO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29uc3Qgc3ViTWVudUl0ZW09Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRTdWJNZW51SXRlbShDb21tb24uVUlTdHJpbmcoJ1JldmVhbCBpbiBzb3VyY2UgY29kZScpKTtmb3IobGV0IGk9MDtpPGNvbnRleHRNZW51SXRlbXMubGVuZ3RoOysraSl7Y29uc3QgdGl0bGU9Y29udGV4dE1lbnVJdGVtc1tpXTtzdWJNZW51SXRlbS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0odGl0bGUsdGhpcy5fcmV2ZWFsU291cmNlTG9jYXRpb24uYmluZCh0aGlzLCh1aUxvY2F0aW9ucy5nZXQodGl0bGUpKSkpO30KY29udGV4dE1lbnUuc2hvdygpO30KX3JldmVhbFNvdXJjZUxvY2F0aW9uKGxvY2F0aW9uKXtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKGxvY2F0aW9uKTt9Cl9zY2hlZHVsZU1lZGlhUXVlcmllc1VwZGF0ZSgpe2lmKCF0aGlzLmlzU2hvd2luZygpKQpyZXR1cm47dGhpcy5fbWVkaWFUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fcmVmZXRjaE1lZGlhUXVlcmllcy5iaW5kKHRoaXMpKTt9Cl9yZWZldGNoTWVkaWFRdWVyaWVzKCl7aWYoIXRoaXMuaXNTaG93aW5nKCl8fCF0aGlzLl9jc3NNb2RlbCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiB0aGlzLl9jc3NNb2RlbC5tZWRpYVF1ZXJpZXNQcm9taXNlKCkudGhlbih0aGlzLl9yZWJ1aWxkTWVkaWFRdWVyaWVzLmJpbmQodGhpcykpO30KX3NxdWFzaEFkamFjZW50RXF1YWwobW9kZWxzKXtjb25zdCBmaWx0ZXJlZD1bXTtmb3IobGV0IGk9MDtpPG1vZGVscy5sZW5ndGg7KytpKXtjb25zdCBsYXN0PWZpbHRlcmVkLnBlZWtMYXN0KCk7aWYoIWxhc3R8fCFsYXN0LmVxdWFscyhtb2RlbHNbaV0pKQpmaWx0ZXJlZC5wdXNoKG1vZGVsc1tpXSk7fQpyZXR1cm4gZmlsdGVyZWQ7fQpfcmVidWlsZE1lZGlhUXVlcmllcyhjc3NNZWRpYXMpe2xldCBxdWVyeU1vZGVscz1bXTtmb3IobGV0IGk9MDtpPGNzc01lZGlhcy5sZW5ndGg7KytpKXtjb25zdCBjc3NNZWRpYT1jc3NNZWRpYXNbaV07aWYoIWNzc01lZGlhLm1lZGlhTGlzdCkKY29udGludWU7Zm9yKGxldCBqPTA7ajxjc3NNZWRpYS5tZWRpYUxpc3QubGVuZ3RoOysrail7Y29uc3QgbWVkaWFRdWVyeT1jc3NNZWRpYS5tZWRpYUxpc3Rbal07Y29uc3QgcXVlcnlNb2RlbD1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5NZWRpYVF1ZXJ5VUlNb2RlbC5jcmVhdGVGcm9tTWVkaWFRdWVyeShjc3NNZWRpYSxtZWRpYVF1ZXJ5KTtpZihxdWVyeU1vZGVsJiZxdWVyeU1vZGVsLnJhd0xvY2F0aW9uKCkpCnF1ZXJ5TW9kZWxzLnB1c2gocXVlcnlNb2RlbCk7fX0KcXVlcnlNb2RlbHMuc29ydChjb21wYXJlTW9kZWxzKTtxdWVyeU1vZGVscz10aGlzLl9zcXVhc2hBZGphY2VudEVxdWFsKHF1ZXJ5TW9kZWxzKTtsZXQgYWxsRXF1YWw9dGhpcy5fY2FjaGVkUXVlcnlNb2RlbHMmJnRoaXMuX2NhY2hlZFF1ZXJ5TW9kZWxzLmxlbmd0aD09PXF1ZXJ5TW9kZWxzLmxlbmd0aDtmb3IobGV0IGk9MDthbGxFcXVhbCYmaTxxdWVyeU1vZGVscy5sZW5ndGg7KytpKQphbGxFcXVhbD1hbGxFcXVhbCYmdGhpcy5fY2FjaGVkUXVlcnlNb2RlbHNbaV0uZXF1YWxzKHF1ZXJ5TW9kZWxzW2ldKTtpZihhbGxFcXVhbCkKcmV0dXJuO3RoaXMuX2NhY2hlZFF1ZXJ5TW9kZWxzPXF1ZXJ5TW9kZWxzO3RoaXMuX3JlbmRlck1lZGlhUXVlcmllcygpO2Z1bmN0aW9uIGNvbXBhcmVNb2RlbHMobW9kZWwxLG1vZGVsMil7cmV0dXJuIG1vZGVsMS5jb21wYXJlVG8obW9kZWwyKTt9fQpfcmVuZGVyTWVkaWFRdWVyaWVzKCl7aWYoIXRoaXMuX2NhY2hlZFF1ZXJ5TW9kZWxzfHwhdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO2NvbnN0IG1hcmtlcnM9W107bGV0IGxhc3RNYXJrZXI9bnVsbDtmb3IobGV0IGk9MDtpPHRoaXMuX2NhY2hlZFF1ZXJ5TW9kZWxzLmxlbmd0aDsrK2kpe2NvbnN0IG1vZGVsPXRoaXMuX2NhY2hlZFF1ZXJ5TW9kZWxzW2ldO2lmKGxhc3RNYXJrZXImJmxhc3RNYXJrZXIubW9kZWwuZGltZW5zaW9uc0VxdWFsKG1vZGVsKSl7bGFzdE1hcmtlci5sb2NhdGlvbnMucHVzaChtb2RlbC5yYXdMb2NhdGlvbigpKTtsYXN0TWFya2VyLmFjdGl2ZT1sYXN0TWFya2VyLmFjdGl2ZXx8bW9kZWwuYWN0aXZlKCk7fWVsc2V7bGFzdE1hcmtlcj17YWN0aXZlOm1vZGVsLmFjdGl2ZSgpLG1vZGVsOm1vZGVsLGxvY2F0aW9uczpbbW9kZWwucmF3TG9jYXRpb24oKV19O21hcmtlcnMucHVzaChsYXN0TWFya2VyKTt9fQp0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7bGV0IGNvbnRhaW5lcj1udWxsO2ZvcihsZXQgaT0wO2k8bWFya2Vycy5sZW5ndGg7KytpKXtpZighaXx8bWFya2Vyc1tpXS5tb2RlbC5zZWN0aW9uKCkhPT1tYXJrZXJzW2ktMV0ubW9kZWwuc2VjdGlvbigpKQpjb250YWluZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVkaWEtaW5zcGVjdG9yLW1hcmtlci1jb250YWluZXInKTtjb25zdCBtYXJrZXI9bWFya2Vyc1tpXTtjb25zdCBiYXI9dGhpcy5fY3JlYXRlRWxlbWVudEZyb21NZWRpYVF1ZXJ5TW9kZWwobWFya2VyLm1vZGVsKTtiYXIuX21vZGVsPW1hcmtlci5tb2RlbDtiYXIuX2xvY2F0aW9ucz1tYXJrZXIubG9jYXRpb25zO2Jhci5jbGFzc0xpc3QudG9nZ2xlKCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLWluYWN0aXZlJywhbWFya2VyLmFjdGl2ZSk7Y29udGFpbmVyLmFwcGVuZENoaWxkKGJhcik7fX0KX3pvb21GYWN0b3IoKXtyZXR1cm4gVUkuem9vbU1hbmFnZXIuem9vbUZhY3RvcigpL3RoaXMuX3NjYWxlO30Kd2FzU2hvd24oKXt0aGlzLl9zY2hlZHVsZU1lZGlhUXVlcmllc1VwZGF0ZSgpO30KX2NyZWF0ZUVsZW1lbnRGcm9tTWVkaWFRdWVyeU1vZGVsKG1vZGVsKXtjb25zdCB6b29tRmFjdG9yPXRoaXMuX3pvb21GYWN0b3IoKTtjb25zdCBtaW5XaWR0aFZhbHVlPW1vZGVsLm1pbldpZHRoRXhwcmVzc2lvbigpP21vZGVsLm1pbldpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCkvem9vbUZhY3RvcjowO2NvbnN0IG1heFdpZHRoVmFsdWU9bW9kZWwubWF4V2lkdGhFeHByZXNzaW9uKCk/bW9kZWwubWF4V2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKS96b29tRmFjdG9yOjA7Y29uc3QgcmVzdWx0PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ21lZGlhLWluc3BlY3Rvci1iYXInKTtpZihtb2RlbC5zZWN0aW9uKCk9PT1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1heCl7cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLXNwYWNlcicpO2NvbnN0IG1hcmtlckVsZW1lbnQ9cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWF4LXdpZHRoJyk7bWFya2VyRWxlbWVudC5zdHlsZS53aWR0aD1tYXhXaWR0aFZhbHVlKydweCc7bWFya2VyRWxlbWVudC50aXRsZT1tb2RlbC5tZWRpYVRleHQoKTthcHBlbmRMYWJlbChtYXJrZXJFbGVtZW50LG1vZGVsLm1heFdpZHRoRXhwcmVzc2lvbigpLGZhbHNlLGZhbHNlKTthcHBlbmRMYWJlbChtYXJrZXJFbGVtZW50LG1vZGVsLm1heFdpZHRoRXhwcmVzc2lvbigpLHRydWUsdHJ1ZSk7cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLXNwYWNlcicpO30KaWYobW9kZWwuc2VjdGlvbigpPT09RW11bGF0aW9uLk1lZGlhUXVlcnlJbnNwZWN0b3IuU2VjdGlvbi5NaW5NYXgpe3Jlc3VsdC5jcmVhdGVDaGlsZCgnZGl2JywnbWVkaWEtaW5zcGVjdG9yLW1hcmtlci1zcGFjZXInKTtjb25zdCBsZWZ0RWxlbWVudD1yZXN1bHQuY3JlYXRlQ2hpbGQoJ2RpdicsJ21lZGlhLWluc3BlY3Rvci1tYXJrZXIgbWVkaWEtaW5zcGVjdG9yLW1hcmtlci1taW4tbWF4LXdpZHRoJyk7bGVmdEVsZW1lbnQuc3R5bGUud2lkdGg9KG1heFdpZHRoVmFsdWUtbWluV2lkdGhWYWx1ZSkqMC41KydweCc7bGVmdEVsZW1lbnQudGl0bGU9bW9kZWwubWVkaWFUZXh0KCk7YXBwZW5kTGFiZWwobGVmdEVsZW1lbnQsbW9kZWwubWluV2lkdGhFeHByZXNzaW9uKCksdHJ1ZSxmYWxzZSk7YXBwZW5kTGFiZWwobGVmdEVsZW1lbnQsbW9kZWwubWF4V2lkdGhFeHByZXNzaW9uKCksZmFsc2UsdHJ1ZSk7cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLXNwYWNlcicpLnN0eWxlLmZsZXg9JzAgMCAnK21pbldpZHRoVmFsdWUrJ3B4Jztjb25zdCByaWdodEVsZW1lbnQ9cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLW1heC13aWR0aCcpO3JpZ2h0RWxlbWVudC5zdHlsZS53aWR0aD0obWF4V2lkdGhWYWx1ZS1taW5XaWR0aFZhbHVlKSowLjUrJ3B4JztyaWdodEVsZW1lbnQudGl0bGU9bW9kZWwubWVkaWFUZXh0KCk7YXBwZW5kTGFiZWwocmlnaHRFbGVtZW50LG1vZGVsLm1pbldpZHRoRXhwcmVzc2lvbigpLHRydWUsZmFsc2UpO2FwcGVuZExhYmVsKHJpZ2h0RWxlbWVudCxtb2RlbC5tYXhXaWR0aEV4cHJlc3Npb24oKSxmYWxzZSx0cnVlKTtyZXN1bHQuY3JlYXRlQ2hpbGQoJ2RpdicsJ21lZGlhLWluc3BlY3Rvci1tYXJrZXItc3BhY2VyJyk7fQppZihtb2RlbC5zZWN0aW9uKCk9PT1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1pbil7Y29uc3QgbGVmdEVsZW1lbnQ9cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLXdpZHRoIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLXdpZHRoLWxlZnQnKTtsZWZ0RWxlbWVudC50aXRsZT1tb2RlbC5tZWRpYVRleHQoKTthcHBlbmRMYWJlbChsZWZ0RWxlbWVudCxtb2RlbC5taW5XaWR0aEV4cHJlc3Npb24oKSxmYWxzZSxmYWxzZSk7cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLXNwYWNlcicpLnN0eWxlLmZsZXg9JzAgMCAnK21pbldpZHRoVmFsdWUrJ3B4Jztjb25zdCByaWdodEVsZW1lbnQ9cmVzdWx0LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLXdpZHRoIG1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLXdpZHRoLXJpZ2h0Jyk7cmlnaHRFbGVtZW50LnRpdGxlPW1vZGVsLm1lZGlhVGV4dCgpO2FwcGVuZExhYmVsKHJpZ2h0RWxlbWVudCxtb2RlbC5taW5XaWR0aEV4cHJlc3Npb24oKSx0cnVlLHRydWUpO30KZnVuY3Rpb24gYXBwZW5kTGFiZWwobWFya2VyLGV4cHJlc3Npb24sYXRMZWZ0LGxlZnRBbGlnbil7bWFya2VyLmNyZWF0ZUNoaWxkKCdkaXYnLCdtZWRpYS1pbnNwZWN0b3ItbWFya2VyLWxhYmVsLWNvbnRhaW5lciAnKyhhdExlZnQ/J21lZGlhLWluc3BlY3Rvci1tYXJrZXItbGFiZWwtY29udGFpbmVyLWxlZnQnOidtZWRpYS1pbnNwZWN0b3ItbWFya2VyLWxhYmVsLWNvbnRhaW5lci1yaWdodCcpKS5jcmVhdGVDaGlsZCgnc3BhbicsJ21lZGlhLWluc3BlY3Rvci1tYXJrZXItbGFiZWwgJysKKGxlZnRBbGlnbj8nbWVkaWEtaW5zcGVjdG9yLWxhYmVsLWxlZnQnOidtZWRpYS1pbnNwZWN0b3ItbGFiZWwtcmlnaHQnKSkudGV4dENvbnRlbnQ9ZXhwcmVzc2lvbi52YWx1ZSgpK2V4cHJlc3Npb24udW5pdCgpO30KcmV0dXJuIHJlc3VsdDt9fTtFbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uPXtNYXg6MCxNaW5NYXg6MSxNaW46Mn07RW11bGF0aW9uLk1lZGlhUXVlcnlJbnNwZWN0b3IuTWVkaWFRdWVyeVVJTW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IoY3NzTWVkaWEsbWluV2lkdGhFeHByZXNzaW9uLG1heFdpZHRoRXhwcmVzc2lvbixhY3RpdmUpe3RoaXMuX2Nzc01lZGlhPWNzc01lZGlhO3RoaXMuX21pbldpZHRoRXhwcmVzc2lvbj1taW5XaWR0aEV4cHJlc3Npb247dGhpcy5fbWF4V2lkdGhFeHByZXNzaW9uPW1heFdpZHRoRXhwcmVzc2lvbjt0aGlzLl9hY3RpdmU9YWN0aXZlO2lmKG1heFdpZHRoRXhwcmVzc2lvbiYmIW1pbldpZHRoRXhwcmVzc2lvbikKdGhpcy5fc2VjdGlvbj1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1heDtlbHNlIGlmKG1pbldpZHRoRXhwcmVzc2lvbiYmbWF4V2lkdGhFeHByZXNzaW9uKQp0aGlzLl9zZWN0aW9uPUVtdWxhdGlvbi5NZWRpYVF1ZXJ5SW5zcGVjdG9yLlNlY3Rpb24uTWluTWF4O2Vsc2UKdGhpcy5fc2VjdGlvbj1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1pbjt9CnN0YXRpYyBjcmVhdGVGcm9tTWVkaWFRdWVyeShjc3NNZWRpYSxtZWRpYVF1ZXJ5KXtsZXQgbWF4V2lkdGhFeHByZXNzaW9uPW51bGw7bGV0IG1heFdpZHRoUGl4ZWxzPU51bWJlci5NQVhfVkFMVUU7bGV0IG1pbldpZHRoRXhwcmVzc2lvbj1udWxsO2xldCBtaW5XaWR0aFBpeGVscz1OdW1iZXIuTUlOX1ZBTFVFO2NvbnN0IGV4cHJlc3Npb25zPW1lZGlhUXVlcnkuZXhwcmVzc2lvbnMoKTtmb3IobGV0IGk9MDtpPGV4cHJlc3Npb25zLmxlbmd0aDsrK2kpe2NvbnN0IGV4cHJlc3Npb249ZXhwcmVzc2lvbnNbaV07Y29uc3QgZmVhdHVyZT1leHByZXNzaW9uLmZlYXR1cmUoKTtpZihmZWF0dXJlLmluZGV4T2YoJ3dpZHRoJyk9PT0tMSkKY29udGludWU7Y29uc3QgcGl4ZWxzPWV4cHJlc3Npb24uY29tcHV0ZWRMZW5ndGgoKTtpZihmZWF0dXJlLnN0YXJ0c1dpdGgoJ21heC0nKSYmcGl4ZWxzPG1heFdpZHRoUGl4ZWxzKXttYXhXaWR0aEV4cHJlc3Npb249ZXhwcmVzc2lvbjttYXhXaWR0aFBpeGVscz1waXhlbHM7fWVsc2UgaWYoZmVhdHVyZS5zdGFydHNXaXRoKCdtaW4tJykmJnBpeGVscz5taW5XaWR0aFBpeGVscyl7bWluV2lkdGhFeHByZXNzaW9uPWV4cHJlc3Npb247bWluV2lkdGhQaXhlbHM9cGl4ZWxzO319CmlmKG1pbldpZHRoUGl4ZWxzPm1heFdpZHRoUGl4ZWxzfHwoIW1heFdpZHRoRXhwcmVzc2lvbiYmIW1pbldpZHRoRXhwcmVzc2lvbikpCnJldHVybiBudWxsO3JldHVybiBuZXcgRW11bGF0aW9uLk1lZGlhUXVlcnlJbnNwZWN0b3IuTWVkaWFRdWVyeVVJTW9kZWwoY3NzTWVkaWEsbWluV2lkdGhFeHByZXNzaW9uLG1heFdpZHRoRXhwcmVzc2lvbixtZWRpYVF1ZXJ5LmFjdGl2ZSgpKTt9CmVxdWFscyhvdGhlcil7cmV0dXJuIHRoaXMuY29tcGFyZVRvKG90aGVyKT09PTA7fQpkaW1lbnNpb25zRXF1YWwob3RoZXIpe3JldHVybiB0aGlzLnNlY3Rpb24oKT09PW90aGVyLnNlY3Rpb24oKSYmKCF0aGlzLm1pbldpZHRoRXhwcmVzc2lvbigpfHwodGhpcy5taW5XaWR0aEV4cHJlc3Npb24oKS5jb21wdXRlZExlbmd0aCgpPT09b3RoZXIubWluV2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKSkpJiYoIXRoaXMubWF4V2lkdGhFeHByZXNzaW9uKCl8fCh0aGlzLm1heFdpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCk9PT1vdGhlci5tYXhXaWR0aEV4cHJlc3Npb24oKS5jb21wdXRlZExlbmd0aCgpKSk7fQpjb21wYXJlVG8ob3RoZXIpe2lmKHRoaXMuc2VjdGlvbigpIT09b3RoZXIuc2VjdGlvbigpKQpyZXR1cm4gdGhpcy5zZWN0aW9uKCktb3RoZXIuc2VjdGlvbigpO2lmKHRoaXMuZGltZW5zaW9uc0VxdWFsKG90aGVyKSl7Y29uc3QgbXlMb2NhdGlvbj10aGlzLnJhd0xvY2F0aW9uKCk7Y29uc3Qgb3RoZXJMb2NhdGlvbj1vdGhlci5yYXdMb2NhdGlvbigpO2lmKCFteUxvY2F0aW9uJiYhb3RoZXJMb2NhdGlvbikKcmV0dXJuIHRoaXMubWVkaWFUZXh0KCkuY29tcGFyZVRvKG90aGVyLm1lZGlhVGV4dCgpKTtpZihteUxvY2F0aW9uJiYhb3RoZXJMb2NhdGlvbikKcmV0dXJuIDE7aWYoIW15TG9jYXRpb24mJm90aGVyTG9jYXRpb24pCnJldHVybi0xO2lmKHRoaXMuYWN0aXZlKCkhPT1vdGhlci5hY3RpdmUoKSkKcmV0dXJuIHRoaXMuYWN0aXZlKCk/LTE6MTtyZXR1cm4gbXlMb2NhdGlvbi51cmwuY29tcGFyZVRvKG90aGVyTG9jYXRpb24udXJsKXx8bXlMb2NhdGlvbi5saW5lTnVtYmVyLW90aGVyTG9jYXRpb24ubGluZU51bWJlcnx8bXlMb2NhdGlvbi5jb2x1bW5OdW1iZXItb3RoZXJMb2NhdGlvbi5jb2x1bW5OdW1iZXI7fQppZih0aGlzLnNlY3Rpb24oKT09PUVtdWxhdGlvbi5NZWRpYVF1ZXJ5SW5zcGVjdG9yLlNlY3Rpb24uTWF4KQpyZXR1cm4gb3RoZXIubWF4V2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKS10aGlzLm1heFdpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCk7aWYodGhpcy5zZWN0aW9uKCk9PT1FbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3Rvci5TZWN0aW9uLk1pbikKcmV0dXJuIHRoaXMubWluV2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKS1vdGhlci5taW5XaWR0aEV4cHJlc3Npb24oKS5jb21wdXRlZExlbmd0aCgpO3JldHVybiB0aGlzLm1pbldpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCktb3RoZXIubWluV2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKXx8b3RoZXIubWF4V2lkdGhFeHByZXNzaW9uKCkuY29tcHV0ZWRMZW5ndGgoKS10aGlzLm1heFdpZHRoRXhwcmVzc2lvbigpLmNvbXB1dGVkTGVuZ3RoKCk7fQpzZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlY3Rpb247fQptZWRpYVRleHQoKXtyZXR1cm4gdGhpcy5fY3NzTWVkaWEudGV4dDt9CnJhd0xvY2F0aW9uKCl7aWYoIXRoaXMuX3Jhd0xvY2F0aW9uKQp0aGlzLl9yYXdMb2NhdGlvbj10aGlzLl9jc3NNZWRpYS5yYXdMb2NhdGlvbigpO3JldHVybiB0aGlzLl9yYXdMb2NhdGlvbjt9Cm1pbldpZHRoRXhwcmVzc2lvbigpe3JldHVybiB0aGlzLl9taW5XaWR0aEV4cHJlc3Npb247fQptYXhXaWR0aEV4cHJlc3Npb24oKXtyZXR1cm4gdGhpcy5fbWF4V2lkdGhFeHByZXNzaW9uO30KYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZTt9fTs7RW11bGF0aW9uLlNlbnNvcnNWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZW11bGF0aW9uL3NlbnNvcnMuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZW5zb3JzLXZpZXcnKTt0aGlzLl9nZW9sb2NhdGlvblNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2VtdWxhdGlvbi5nZW9sb2NhdGlvbk92ZXJyaWRlJywnJyk7dGhpcy5fZ2VvbG9jYXRpb249U0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uLnBhcnNlU2V0dGluZyh0aGlzLl9nZW9sb2NhdGlvblNldHRpbmcuZ2V0KCkpO3RoaXMuX2dlb2xvY2F0aW9uT3ZlcnJpZGVFbmFibGVkPWZhbHNlO3RoaXMuX2NyZWF0ZUdlb2xvY2F0aW9uU2VjdGlvbih0aGlzLl9nZW9sb2NhdGlvbik7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JykuY2xhc3NMaXN0LmFkZCgncGFuZWwtc2VjdGlvbi1zZXBhcmF0b3InKTt0aGlzLl9kZXZpY2VPcmllbnRhdGlvblNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2VtdWxhdGlvbi5kZXZpY2VPcmllbnRhdGlvbk92ZXJyaWRlJywnJyk7dGhpcy5fZGV2aWNlT3JpZW50YXRpb249U0RLLkVtdWxhdGlvbk1vZGVsLkRldmljZU9yaWVudGF0aW9uLnBhcnNlU2V0dGluZyh0aGlzLl9kZXZpY2VPcmllbnRhdGlvblNldHRpbmcuZ2V0KCkpO3RoaXMuX2RldmljZU9yaWVudGF0aW9uT3ZlcnJpZGVFbmFibGVkPWZhbHNlO3RoaXMuX2NyZWF0ZURldmljZU9yaWVudGF0aW9uU2VjdGlvbigpO3RoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpLmNsYXNzTGlzdC5hZGQoJ3BhbmVsLXNlY3Rpb24tc2VwYXJhdG9yJyk7dGhpcy5fYXBwZW5kVG91Y2hDb250cm9sKCk7fQpzdGF0aWMgaW5zdGFuY2UoKXtpZighRW11bGF0aW9uLlNlbnNvcnNWaWV3Ll9pbnN0YW5jZU9iamVjdCkKRW11bGF0aW9uLlNlbnNvcnNWaWV3Ll9pbnN0YW5jZU9iamVjdD1uZXcgRW11bGF0aW9uLlNlbnNvcnNWaWV3KCk7cmV0dXJuIEVtdWxhdGlvbi5TZW5zb3JzVmlldy5faW5zdGFuY2VPYmplY3Q7fQpfY3JlYXRlR2VvbG9jYXRpb25TZWN0aW9uKGdlb2xvY2F0aW9uKXtjb25zdCBnZW9ncm91cD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzZWN0aW9uJywnc2Vuc29ycy1ncm91cCcpO2dlb2dyb3VwLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZW5zb3JzLWdyb3VwLXRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdHZW9sb2NhdGlvbicpO2NvbnN0IGZpZWxkcz1nZW9ncm91cC5jcmVhdGVDaGlsZCgnZGl2JywnZ2VvLWZpZWxkcycpO2NvbnN0IG5vT3ZlcnJpZGVPcHRpb249e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnTm8gb3ZlcnJpZGUnKSxsb2NhdGlvbjpFbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5Ob092ZXJyaWRlfTtjb25zdCBjdXN0b21Mb2NhdGlvbk9wdGlvbj17dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdDdXN0b20gbG9jYXRpb24uLi4nKSxsb2NhdGlvbjpFbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5DdXN0b219O3RoaXMuX2xvY2F0aW9uU2VsZWN0RWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzZWxlY3QnLCdjaHJvbWUtc2VsZWN0Jyk7dGhpcy5fbG9jYXRpb25TZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG5ldyBPcHRpb24obm9PdmVycmlkZU9wdGlvbi50aXRsZSxub092ZXJyaWRlT3B0aW9uLmxvY2F0aW9uKSk7dGhpcy5fbG9jYXRpb25TZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG5ldyBPcHRpb24oY3VzdG9tTG9jYXRpb25PcHRpb24udGl0bGUsY3VzdG9tTG9jYXRpb25PcHRpb24ubG9jYXRpb24pKTtjb25zdCBsb2NhdGlvbkdyb3Vwcz1FbXVsYXRpb24uU2Vuc29yc1ZpZXcuUHJlc2V0TG9jYXRpb25zO2ZvcihsZXQgaT0wO2k8bG9jYXRpb25Hcm91cHMubGVuZ3RoOysraSl7Y29uc3QgZ3JvdXA9bG9jYXRpb25Hcm91cHNbaV0udmFsdWU7Y29uc3QgZ3JvdXBFbGVtZW50PXRoaXMuX2xvY2F0aW9uU2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0Z3JvdXAnKTtncm91cEVsZW1lbnQubGFiZWw9bG9jYXRpb25Hcm91cHNbaV0udGl0bGU7Zm9yKGxldCBqPTA7ajxncm91cC5sZW5ndGg7KytqKQpncm91cEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IE9wdGlvbihncm91cFtqXS50aXRsZSxncm91cFtqXS5sb2NhdGlvbikpO30KdGhpcy5fbG9jYXRpb25TZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9MDtmaWVsZHMuYXBwZW5kQ2hpbGQodGhpcy5fbG9jYXRpb25TZWxlY3RFbGVtZW50KTt0aGlzLl9sb2NhdGlvblNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyx0aGlzLl9nZW9sb2NhdGlvblNlbGVjdENoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5fZmllbGRzZXRFbGVtZW50PWZpZWxkcy5jcmVhdGVDaGlsZCgnZmllbGRzZXQnKTt0aGlzLl9maWVsZHNldEVsZW1lbnQuZGlzYWJsZWQ9IXRoaXMuX2dlb2xvY2F0aW9uT3ZlcnJpZGVFbmFibGVkO3RoaXMuX2ZpZWxkc2V0RWxlbWVudC5pZD0nZ2VvbG9jYXRpb24tb3ZlcnJpZGUtc2VjdGlvbic7Y29uc3QgbGF0aXR1ZGVHcm91cD10aGlzLl9maWVsZHNldEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhdGxvbmctZ3JvdXAnKTtjb25zdCBsb25naXR1ZGVHcm91cD10aGlzLl9maWVsZHNldEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhdGxvbmctZ3JvdXAnKTt0aGlzLl9sYXRpdHVkZUlucHV0PVVJLmNyZWF0ZUlucHV0KCcnLCdudW1iZXInKTtsYXRpdHVkZUdyb3VwLmFwcGVuZENoaWxkKHRoaXMuX2xhdGl0dWRlSW5wdXQpO3RoaXMuX2xhdGl0dWRlSW5wdXQuc2V0QXR0cmlidXRlKCdzdGVwJywnYW55Jyk7dGhpcy5fbGF0aXR1ZGVJbnB1dC52YWx1ZT0wO3RoaXMuX2xhdGl0dWRlU2V0dGVyPVVJLmJpbmRJbnB1dCh0aGlzLl9sYXRpdHVkZUlucHV0LHRoaXMuX2FwcGx5R2VvbG9jYXRpb25Vc2VySW5wdXQuYmluZCh0aGlzKSxTREsuRW11bGF0aW9uTW9kZWwuR2VvbG9jYXRpb24ubGF0aXR1ZGVWYWxpZGF0b3IsdHJ1ZSwwLjEpO3RoaXMuX2xhdGl0dWRlU2V0dGVyKFN0cmluZyhnZW9sb2NhdGlvbi5sYXRpdHVkZSkpO3RoaXMuX2xvbmdpdHVkZUlucHV0PVVJLmNyZWF0ZUlucHV0KCcnLCdudW1iZXInKTtsb25naXR1ZGVHcm91cC5hcHBlbmRDaGlsZCh0aGlzLl9sb25naXR1ZGVJbnB1dCk7dGhpcy5fbG9uZ2l0dWRlSW5wdXQuc2V0QXR0cmlidXRlKCdzdGVwJywnYW55Jyk7dGhpcy5fbG9uZ2l0dWRlSW5wdXQudmFsdWU9MDt0aGlzLl9sb25naXR1ZGVTZXR0ZXI9VUkuYmluZElucHV0KHRoaXMuX2xvbmdpdHVkZUlucHV0LHRoaXMuX2FwcGx5R2VvbG9jYXRpb25Vc2VySW5wdXQuYmluZCh0aGlzKSxTREsuRW11bGF0aW9uTW9kZWwuR2VvbG9jYXRpb24ubG9uZ2l0dWRlVmFsaWRhdG9yLHRydWUsMC4xKTt0aGlzLl9sb25naXR1ZGVTZXR0ZXIoU3RyaW5nKGdlb2xvY2F0aW9uLmxvbmdpdHVkZSkpO2NvbnN0IGNtZE9yQ3RybD1Ib3N0LmlzTWFjKCk/J1x1MjMxOCc6J0N0cmwnO2NvbnN0IG1vZGlmaWVyS2V5TWVzc2FnZT1sc2BBZGp1c3Qgd2l0aCBtb3VzZXdoZWVsIG9yIHVwL2Rvd24ga2V5cy4gJHtjbWRPckN0cmx9OiDCsTEwLCBTaGlmdDogwrExLCBBbHQ6IMKxMC4wMWA7dGhpcy5fbGF0aXR1ZGVJbnB1dC50aXRsZT1tb2RpZmllcktleU1lc3NhZ2U7dGhpcy5fbG9uZ2l0dWRlSW5wdXQudGl0bGU9bW9kaWZpZXJLZXlNZXNzYWdlO2xhdGl0dWRlR3JvdXAuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhdGxvbmctdGl0bGUnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0xhdGl0dWRlJyk7bG9uZ2l0dWRlR3JvdXAuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhdGxvbmctdGl0bGUnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0xvbmdpdHVkZScpO30KX2dlb2xvY2F0aW9uU2VsZWN0Q2hhbmdlZCgpe3RoaXMuX2ZpZWxkc2V0RWxlbWVudC5kaXNhYmxlZD1mYWxzZTtjb25zdCB2YWx1ZT10aGlzLl9sb2NhdGlvblNlbGVjdEVsZW1lbnQub3B0aW9uc1t0aGlzLl9sb2NhdGlvblNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleF0udmFsdWU7aWYodmFsdWU9PT1FbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5Ob092ZXJyaWRlKXt0aGlzLl9nZW9sb2NhdGlvbk92ZXJyaWRlRW5hYmxlZD1mYWxzZTt0aGlzLl9maWVsZHNldEVsZW1lbnQuZGlzYWJsZWQ9dHJ1ZTt9ZWxzZSBpZih2YWx1ZT09PUVtdWxhdGlvbi5TZW5zb3JzVmlldy5Ob25QcmVzZXRPcHRpb25zLkN1c3RvbSl7dGhpcy5fZ2VvbG9jYXRpb25PdmVycmlkZUVuYWJsZWQ9dHJ1ZTt9ZWxzZSBpZih2YWx1ZT09PUVtdWxhdGlvbi5TZW5zb3JzVmlldy5Ob25QcmVzZXRPcHRpb25zLlVuYXZhaWxhYmxlKXt0aGlzLl9nZW9sb2NhdGlvbk92ZXJyaWRlRW5hYmxlZD10cnVlO3RoaXMuX2dlb2xvY2F0aW9uPW5ldyBTREsuRW11bGF0aW9uTW9kZWwuR2VvbG9jYXRpb24oMCwwLHRydWUpO31lbHNle3RoaXMuX2dlb2xvY2F0aW9uT3ZlcnJpZGVFbmFibGVkPXRydWU7Y29uc3QgY29vcmRpbmF0ZXM9SlNPTi5wYXJzZSh2YWx1ZSk7dGhpcy5fZ2VvbG9jYXRpb249bmV3IFNESy5FbXVsYXRpb25Nb2RlbC5HZW9sb2NhdGlvbihjb29yZGluYXRlc1swXSxjb29yZGluYXRlc1sxXSxmYWxzZSk7dGhpcy5fbGF0aXR1ZGVTZXR0ZXIoY29vcmRpbmF0ZXNbMF0pO3RoaXMuX2xvbmdpdHVkZVNldHRlcihjb29yZGluYXRlc1sxXSk7fQp0aGlzLl9hcHBseUdlb2xvY2F0aW9uKCk7aWYodmFsdWU9PT1FbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5DdXN0b20pCnRoaXMuX2xhdGl0dWRlSW5wdXQuZm9jdXMoKTt9Cl9hcHBseUdlb2xvY2F0aW9uVXNlcklucHV0KCl7Y29uc3QgZ2VvbG9jYXRpb249U0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uLnBhcnNlVXNlcklucHV0KHRoaXMuX2xhdGl0dWRlSW5wdXQudmFsdWUudHJpbSgpLHRoaXMuX2xvbmdpdHVkZUlucHV0LnZhbHVlLnRyaW0oKSwnJyk7aWYoIWdlb2xvY2F0aW9uKQpyZXR1cm47dGhpcy5fc2V0U2VsZWN0RWxlbWVudExhYmVsKHRoaXMuX2xvY2F0aW9uU2VsZWN0RWxlbWVudCxFbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5DdXN0b20pO3RoaXMuX2dlb2xvY2F0aW9uPWdlb2xvY2F0aW9uO3RoaXMuX2FwcGx5R2VvbG9jYXRpb24oKTt9Cl9hcHBseUdlb2xvY2F0aW9uKCl7aWYodGhpcy5fZ2VvbG9jYXRpb25PdmVycmlkZUVuYWJsZWQpCnRoaXMuX2dlb2xvY2F0aW9uU2V0dGluZy5zZXQodGhpcy5fZ2VvbG9jYXRpb24udG9TZXR0aW5nKCkpO2Zvcihjb25zdCBlbXVsYXRpb25Nb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsKSkKZW11bGF0aW9uTW9kZWwuZW11bGF0ZUdlb2xvY2F0aW9uKHRoaXMuX2dlb2xvY2F0aW9uT3ZlcnJpZGVFbmFibGVkP3RoaXMuX2dlb2xvY2F0aW9uOm51bGwpO30KX2NyZWF0ZURldmljZU9yaWVudGF0aW9uU2VjdGlvbigpe2NvbnN0IG9yaWVudGF0aW9uR3JvdXA9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc2VjdGlvbicsJ3NlbnNvcnMtZ3JvdXAnKTtvcmllbnRhdGlvbkdyb3VwLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZW5zb3JzLWdyb3VwLXRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdPcmllbnRhdGlvbicpO2NvbnN0IG9yaWVudGF0aW9uQ29udGVudD1vcmllbnRhdGlvbkdyb3VwLmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmllbnRhdGlvbi1jb250ZW50Jyk7Y29uc3QgZmllbGRzPW9yaWVudGF0aW9uQ29udGVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZW50YXRpb24tZmllbGRzJyk7Y29uc3Qgb3JpZW50YXRpb25PZmZPcHRpb249e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnT2ZmJyksb3JpZW50YXRpb246RW11bGF0aW9uLlNlbnNvcnNWaWV3Lk5vblByZXNldE9wdGlvbnMuTm9PdmVycmlkZX07Y29uc3QgY3VzdG9tT3JpZW50YXRpb25PcHRpb249e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnQ3VzdG9tIG9yaWVudGF0aW9uLi4uJyksb3JpZW50YXRpb246RW11bGF0aW9uLlNlbnNvcnNWaWV3Lk5vblByZXNldE9wdGlvbnMuQ3VzdG9tfTt0aGlzLl9vcmllbnRhdGlvblNlbGVjdEVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc2VsZWN0JywnY2hyb21lLXNlbGVjdCcpO3RoaXMuX29yaWVudGF0aW9uU2VsZWN0RWxlbWVudC5hcHBlbmRDaGlsZChuZXcgT3B0aW9uKG9yaWVudGF0aW9uT2ZmT3B0aW9uLnRpdGxlLG9yaWVudGF0aW9uT2ZmT3B0aW9uLm9yaWVudGF0aW9uKSk7dGhpcy5fb3JpZW50YXRpb25TZWxlY3RFbGVtZW50LmFwcGVuZENoaWxkKG5ldyBPcHRpb24oY3VzdG9tT3JpZW50YXRpb25PcHRpb24udGl0bGUsY3VzdG9tT3JpZW50YXRpb25PcHRpb24ub3JpZW50YXRpb24pKTtjb25zdCBvcmllbnRhdGlvbkdyb3Vwcz1FbXVsYXRpb24uU2Vuc29yc1ZpZXcuUHJlc2V0T3JpZW50YXRpb25zO2ZvcihsZXQgaT0wO2k8b3JpZW50YXRpb25Hcm91cHMubGVuZ3RoOysraSl7Y29uc3QgZ3JvdXBFbGVtZW50PXRoaXMuX29yaWVudGF0aW9uU2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0Z3JvdXAnKTtncm91cEVsZW1lbnQubGFiZWw9b3JpZW50YXRpb25Hcm91cHNbaV0udGl0bGU7Y29uc3QgZ3JvdXA9b3JpZW50YXRpb25Hcm91cHNbaV0udmFsdWU7Zm9yKGxldCBqPTA7ajxncm91cC5sZW5ndGg7KytqKQpncm91cEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IE9wdGlvbihncm91cFtqXS50aXRsZSxncm91cFtqXS5vcmllbnRhdGlvbikpO30KdGhpcy5fb3JpZW50YXRpb25TZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9MDtmaWVsZHMuYXBwZW5kQ2hpbGQodGhpcy5fb3JpZW50YXRpb25TZWxlY3RFbGVtZW50KTt0aGlzLl9vcmllbnRhdGlvblNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyx0aGlzLl9vcmllbnRhdGlvblNlbGVjdENoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5fZGV2aWNlT3JpZW50YXRpb25GaWVsZHNldD10aGlzLl9jcmVhdGVEZXZpY2VPcmllbnRhdGlvbk92ZXJyaWRlRWxlbWVudCh0aGlzLl9kZXZpY2VPcmllbnRhdGlvbik7dGhpcy5fc3RhZ2VFbGVtZW50PW9yaWVudGF0aW9uQ29udGVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZW50YXRpb24tc3RhZ2UnKTt0aGlzLl9zdGFnZUVsZW1lbnQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTaGlmdCtkcmFnIGhvcml6b250YWxseSB0byByb3RhdGUgYXJvdW5kIHRoZSB5LWF4aXMnKTt0aGlzLl9vcmllbnRhdGlvbkxheWVyPXRoaXMuX3N0YWdlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZW50YXRpb24tbGF5ZXInKTt0aGlzLl9ib3hFbGVtZW50PXRoaXMuX29yaWVudGF0aW9uTGF5ZXIuY3JlYXRlQ2hpbGQoJ3NlY3Rpb24nLCdvcmllbnRhdGlvbi1ib3ggb3JpZW50YXRpb24tZWxlbWVudCcpO3RoaXMuX2JveEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NlY3Rpb24nLCdvcmllbnRhdGlvbi1mcm9udCBvcmllbnRhdGlvbi1lbGVtZW50Jyk7dGhpcy5fYm94RWxlbWVudC5jcmVhdGVDaGlsZCgnc2VjdGlvbicsJ29yaWVudGF0aW9uLXRvcCBvcmllbnRhdGlvbi1lbGVtZW50Jyk7dGhpcy5fYm94RWxlbWVudC5jcmVhdGVDaGlsZCgnc2VjdGlvbicsJ29yaWVudGF0aW9uLWJhY2sgb3JpZW50YXRpb24tZWxlbWVudCcpO3RoaXMuX2JveEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NlY3Rpb24nLCdvcmllbnRhdGlvbi1sZWZ0IG9yaWVudGF0aW9uLWVsZW1lbnQnKTt0aGlzLl9ib3hFbGVtZW50LmNyZWF0ZUNoaWxkKCdzZWN0aW9uJywnb3JpZW50YXRpb24tcmlnaHQgb3JpZW50YXRpb24tZWxlbWVudCcpO3RoaXMuX2JveEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NlY3Rpb24nLCdvcmllbnRhdGlvbi1ib3R0b20gb3JpZW50YXRpb24tZWxlbWVudCcpO1VJLmluc3RhbGxEcmFnSGFuZGxlKHRoaXMuX3N0YWdlRWxlbWVudCx0aGlzLl9vbkJveERyYWdTdGFydC5iaW5kKHRoaXMpLHRoaXMuX29uQm94RHJhZy5iaW5kKHRoaXMpLG51bGwsJy13ZWJraXQtZ3JhYmJpbmcnLCctd2Via2l0LWdyYWInKTtmaWVsZHMuYXBwZW5kQ2hpbGQodGhpcy5fZGV2aWNlT3JpZW50YXRpb25GaWVsZHNldCk7dGhpcy5fZW5hYmxlT3JpZW50YXRpb25GaWVsZHModHJ1ZSk7dGhpcy5fc2V0Qm94T3JpZW50YXRpb24odGhpcy5fZGV2aWNlT3JpZW50YXRpb24sZmFsc2UpO30KX2VuYWJsZU9yaWVudGF0aW9uRmllbGRzKGRpc2FibGUpe2lmKGRpc2FibGUpe3RoaXMuX2RldmljZU9yaWVudGF0aW9uRmllbGRzZXQuZGlzYWJsZWQ9dHJ1ZTt0aGlzLl9zdGFnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTt9ZWxzZXt0aGlzLl9kZXZpY2VPcmllbnRhdGlvbkZpZWxkc2V0LmRpc2FibGVkPWZhbHNlO3RoaXMuX3N0YWdlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO319Cl9vcmllbnRhdGlvblNlbGVjdENoYW5nZWQoKXtjb25zdCB2YWx1ZT10aGlzLl9vcmllbnRhdGlvblNlbGVjdEVsZW1lbnQub3B0aW9uc1t0aGlzLl9vcmllbnRhdGlvblNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleF0udmFsdWU7dGhpcy5fZW5hYmxlT3JpZW50YXRpb25GaWVsZHMoZmFsc2UpO2lmKHZhbHVlPT09RW11bGF0aW9uLlNlbnNvcnNWaWV3Lk5vblByZXNldE9wdGlvbnMuTm9PdmVycmlkZSl7dGhpcy5fZGV2aWNlT3JpZW50YXRpb25PdmVycmlkZUVuYWJsZWQ9ZmFsc2U7dGhpcy5fZW5hYmxlT3JpZW50YXRpb25GaWVsZHModHJ1ZSk7fWVsc2UgaWYodmFsdWU9PT1FbXVsYXRpb24uU2Vuc29yc1ZpZXcuTm9uUHJlc2V0T3B0aW9ucy5DdXN0b20pe3RoaXMuX2RldmljZU9yaWVudGF0aW9uT3ZlcnJpZGVFbmFibGVkPXRydWU7dGhpcy5fYWxwaGFFbGVtZW50LmZvY3VzKCk7fWVsc2V7Y29uc3QgcGFyc2VkVmFsdWU9SlNPTi5wYXJzZSh2YWx1ZSk7dGhpcy5fZGV2aWNlT3JpZW50YXRpb25PdmVycmlkZUVuYWJsZWQ9dHJ1ZTt0aGlzLl9kZXZpY2VPcmllbnRhdGlvbj1uZXcgU0RLLkVtdWxhdGlvbk1vZGVsLkRldmljZU9yaWVudGF0aW9uKHBhcnNlZFZhbHVlWzBdLHBhcnNlZFZhbHVlWzFdLHBhcnNlZFZhbHVlWzJdKTt0aGlzLl9zZXREZXZpY2VPcmllbnRhdGlvbih0aGlzLl9kZXZpY2VPcmllbnRhdGlvbixFbXVsYXRpb24uU2Vuc29yc1ZpZXcuRGV2aWNlT3JpZW50YXRpb25Nb2RpZmljYXRpb25Tb3VyY2UuU2VsZWN0UHJlc2V0KTt9fQpfYXBwbHlEZXZpY2VPcmllbnRhdGlvbigpe2lmKHRoaXMuX2RldmljZU9yaWVudGF0aW9uT3ZlcnJpZGVFbmFibGVkKQp0aGlzLl9kZXZpY2VPcmllbnRhdGlvblNldHRpbmcuc2V0KHRoaXMuX2RldmljZU9yaWVudGF0aW9uLnRvU2V0dGluZygpKTtmb3IoY29uc3QgZW11bGF0aW9uTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5FbXVsYXRpb25Nb2RlbCkpCmVtdWxhdGlvbk1vZGVsLmVtdWxhdGVEZXZpY2VPcmllbnRhdGlvbih0aGlzLl9kZXZpY2VPcmllbnRhdGlvbk92ZXJyaWRlRW5hYmxlZD90aGlzLl9kZXZpY2VPcmllbnRhdGlvbjpudWxsKTt9Cl9zZXRTZWxlY3RFbGVtZW50TGFiZWwoc2VsZWN0RWxlbWVudCxsYWJlbFZhbHVlKXtjb25zdCBvcHRpb25WYWx1ZXM9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHNlbGVjdEVsZW1lbnQub3B0aW9ucyx4PT54LnZhbHVlKTtzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9b3B0aW9uVmFsdWVzLmluZGV4T2YobGFiZWxWYWx1ZSk7fQpfYXBwbHlEZXZpY2VPcmllbnRhdGlvblVzZXJJbnB1dCgpe3RoaXMuX3NldERldmljZU9yaWVudGF0aW9uKFNESy5FbXVsYXRpb25Nb2RlbC5EZXZpY2VPcmllbnRhdGlvbi5wYXJzZVVzZXJJbnB1dCh0aGlzLl9hbHBoYUVsZW1lbnQudmFsdWUudHJpbSgpLHRoaXMuX2JldGFFbGVtZW50LnZhbHVlLnRyaW0oKSx0aGlzLl9nYW1tYUVsZW1lbnQudmFsdWUudHJpbSgpKSxFbXVsYXRpb24uU2Vuc29yc1ZpZXcuRGV2aWNlT3JpZW50YXRpb25Nb2RpZmljYXRpb25Tb3VyY2UuVXNlcklucHV0KTt0aGlzLl9zZXRTZWxlY3RFbGVtZW50TGFiZWwodGhpcy5fb3JpZW50YXRpb25TZWxlY3RFbGVtZW50LEVtdWxhdGlvbi5TZW5zb3JzVmlldy5Ob25QcmVzZXRPcHRpb25zLkN1c3RvbSk7fQpfcmVzZXREZXZpY2VPcmllbnRhdGlvbigpe3RoaXMuX3NldERldmljZU9yaWVudGF0aW9uKG5ldyBTREsuRW11bGF0aW9uTW9kZWwuRGV2aWNlT3JpZW50YXRpb24oMCw5MCwwKSxFbXVsYXRpb24uU2Vuc29yc1ZpZXcuRGV2aWNlT3JpZW50YXRpb25Nb2RpZmljYXRpb25Tb3VyY2UuUmVzZXRCdXR0b24pO3RoaXMuX3NldFNlbGVjdEVsZW1lbnRMYWJlbCh0aGlzLl9vcmllbnRhdGlvblNlbGVjdEVsZW1lbnQsJ1swLCA5MCwgMF0nKTt9Cl9zZXREZXZpY2VPcmllbnRhdGlvbihkZXZpY2VPcmllbnRhdGlvbixtb2RpZmljYXRpb25Tb3VyY2Upe2lmKCFkZXZpY2VPcmllbnRhdGlvbikKcmV0dXJuO2Z1bmN0aW9uIHJvdW5kQW5nbGUoYW5nbGUpe3JldHVybiBNYXRoLnJvdW5kKGFuZ2xlKjEwMDAwKS8xMDAwMDt9CmlmKG1vZGlmaWNhdGlvblNvdXJjZSE9PUVtdWxhdGlvbi5TZW5zb3JzVmlldy5EZXZpY2VPcmllbnRhdGlvbk1vZGlmaWNhdGlvblNvdXJjZS5Vc2VySW5wdXQpe3RoaXMuX2FscGhhU2V0dGVyKHJvdW5kQW5nbGUoZGV2aWNlT3JpZW50YXRpb24uYWxwaGEpKTt0aGlzLl9iZXRhU2V0dGVyKHJvdW5kQW5nbGUoZGV2aWNlT3JpZW50YXRpb24uYmV0YSkpO3RoaXMuX2dhbW1hU2V0dGVyKHJvdW5kQW5nbGUoZGV2aWNlT3JpZW50YXRpb24uZ2FtbWEpKTt9CmNvbnN0IGFuaW1hdGU9bW9kaWZpY2F0aW9uU291cmNlIT09RW11bGF0aW9uLlNlbnNvcnNWaWV3LkRldmljZU9yaWVudGF0aW9uTW9kaWZpY2F0aW9uU291cmNlLlVzZXJEcmFnO3RoaXMuX3NldEJveE9yaWVudGF0aW9uKGRldmljZU9yaWVudGF0aW9uLGFuaW1hdGUpO3RoaXMuX2RldmljZU9yaWVudGF0aW9uPWRldmljZU9yaWVudGF0aW9uO3RoaXMuX2FwcGx5RGV2aWNlT3JpZW50YXRpb24oKTt9Cl9jcmVhdGVBeGlzSW5wdXQocGFyZW50RWxlbWVudCxpbnB1dCxsYWJlbCl7Y29uc3QgZGl2PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ29yaWVudGF0aW9uLWF4aXMtaW5wdXQtY29udGFpbmVyJyk7ZGl2LmFwcGVuZENoaWxkKGlucHV0KTtkaXYuY3JlYXRlVGV4dENoaWxkKGxhYmVsKTtpbnB1dC50eXBlPSdudW1iZXInO3JldHVybiBVSS5iaW5kSW5wdXQoaW5wdXQsdGhpcy5fYXBwbHlEZXZpY2VPcmllbnRhdGlvblVzZXJJbnB1dC5iaW5kKHRoaXMpLFNESy5FbXVsYXRpb25Nb2RlbC5EZXZpY2VPcmllbnRhdGlvbi52YWxpZGF0b3IsdHJ1ZSk7fQpfY3JlYXRlRGV2aWNlT3JpZW50YXRpb25PdmVycmlkZUVsZW1lbnQoZGV2aWNlT3JpZW50YXRpb24pe2NvbnN0IGZpZWxkc2V0RWxlbWVudD1jcmVhdGVFbGVtZW50KCdmaWVsZHNldCcpO2ZpZWxkc2V0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkZXZpY2Utb3JpZW50YXRpb24tb3ZlcnJpZGUtc2VjdGlvbicpO2NvbnN0IGNlbGxFbGVtZW50PWZpZWxkc2V0RWxlbWVudC5jcmVhdGVDaGlsZCgndGQnLCdvcmllbnRhdGlvbi1pbnB1dHMtY2VsbCcpO3RoaXMuX2FscGhhRWxlbWVudD1VSS5jcmVhdGVJbnB1dCgpO3RoaXMuX2FscGhhRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0ZXAnLCdhbnknKTt0aGlzLl9hbHBoYVNldHRlcj10aGlzLl9jcmVhdGVBeGlzSW5wdXQoY2VsbEVsZW1lbnQsdGhpcy5fYWxwaGFFbGVtZW50LENvbW1vbi5VSVN0cmluZygnXHUwM0IxIChhbHBoYSknKSk7dGhpcy5fYWxwaGFTZXR0ZXIoU3RyaW5nKGRldmljZU9yaWVudGF0aW9uLmFscGhhKSk7dGhpcy5fYmV0YUVsZW1lbnQ9VUkuY3JlYXRlSW5wdXQoKTt0aGlzLl9iZXRhRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0ZXAnLCdhbnknKTt0aGlzLl9iZXRhU2V0dGVyPXRoaXMuX2NyZWF0ZUF4aXNJbnB1dChjZWxsRWxlbWVudCx0aGlzLl9iZXRhRWxlbWVudCxDb21tb24uVUlTdHJpbmcoJ1x1MDNCMiAoYmV0YSknKSk7dGhpcy5fYmV0YVNldHRlcihTdHJpbmcoZGV2aWNlT3JpZW50YXRpb24uYmV0YSkpO3RoaXMuX2dhbW1hRWxlbWVudD1VSS5jcmVhdGVJbnB1dCgpO3RoaXMuX2dhbW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0ZXAnLCdhbnknKTt0aGlzLl9nYW1tYVNldHRlcj10aGlzLl9jcmVhdGVBeGlzSW5wdXQoY2VsbEVsZW1lbnQsdGhpcy5fZ2FtbWFFbGVtZW50LENvbW1vbi5VSVN0cmluZygnXHUwM0IzIChnYW1tYSknKSk7dGhpcy5fZ2FtbWFTZXR0ZXIoU3RyaW5nKGRldmljZU9yaWVudGF0aW9uLmdhbW1hKSk7Y2VsbEVsZW1lbnQuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1Jlc2V0JyksdGhpcy5fcmVzZXREZXZpY2VPcmllbnRhdGlvbi5iaW5kKHRoaXMpLCdvcmllbnRhdGlvbi1yZXNldC1idXR0b24nKSk7cmV0dXJuIGZpZWxkc2V0RWxlbWVudDt9Cl9zZXRCb3hPcmllbnRhdGlvbihkZXZpY2VPcmllbnRhdGlvbixhbmltYXRlKXtpZihhbmltYXRlKQp0aGlzLl9zdGFnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtYW5pbWF0aW5nJyk7ZWxzZQp0aGlzLl9zdGFnZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYW5pbWF0aW5nJyk7Y29uc3QgbWF0cml4PW5ldyBXZWJLaXRDU1NNYXRyaXgoKTt0aGlzLl9ib3hNYXRyaXg9bWF0cml4LnJvdGF0ZSgtZGV2aWNlT3JpZW50YXRpb24uYmV0YSxkZXZpY2VPcmllbnRhdGlvbi5nYW1tYSwtZGV2aWNlT3JpZW50YXRpb24uYWxwaGEpO2NvbnN0IGV1bGVyQW5nbGVzPW5ldyBVSS5HZW9tZXRyeS5FdWxlckFuZ2xlcyhkZXZpY2VPcmllbnRhdGlvbi5hbHBoYSxkZXZpY2VPcmllbnRhdGlvbi5iZXRhLGRldmljZU9yaWVudGF0aW9uLmdhbW1hKTt0aGlzLl9vcmllbnRhdGlvbkxheWVyLnN0eWxlLnRyYW5zZm9ybT1ldWxlckFuZ2xlcy50b1JvdGF0ZTNEU3RyaW5nKCk7fQpfb25Cb3hEcmFnKGV2ZW50KXtjb25zdCBtb3VzZU1vdmVWZWN0b3I9dGhpcy5fY2FsY3VsYXRlUmFkaXVzVmVjdG9yKGV2ZW50LngsZXZlbnQueSk7aWYoIW1vdXNlTW92ZVZlY3RvcikKcmV0dXJuIHRydWU7ZXZlbnQuY29uc3VtZSh0cnVlKTtsZXQgYXhpcyxhbmdsZTtpZihldmVudC5zaGlmdEtleSl7YXhpcz1uZXcgVUkuR2VvbWV0cnkuVmVjdG9yKDAsMCwtMSk7YW5nbGU9KHRoaXMuX21vdXNlRG93blZlY3Rvci54LW1vdXNlTW92ZVZlY3Rvci54KSpFbXVsYXRpb24uU2Vuc29yc1ZpZXcuU2hpZnREcmFnT3JpZW50YXRpb25TcGVlZDt9ZWxzZXtheGlzPVVJLkdlb21ldHJ5LmNyb3NzUHJvZHVjdCh0aGlzLl9tb3VzZURvd25WZWN0b3IsbW91c2VNb3ZlVmVjdG9yKTthbmdsZT1VSS5HZW9tZXRyeS5jYWxjdWxhdGVBbmdsZSh0aGlzLl9tb3VzZURvd25WZWN0b3IsbW91c2VNb3ZlVmVjdG9yKTt9CmxldCBjdXJyZW50TWF0cml4PW5ldyBXZWJLaXRDU1NNYXRyaXgoKTtjdXJyZW50TWF0cml4PWN1cnJlbnRNYXRyaXgucm90YXRlKC05MCwwLDApLnJvdGF0ZUF4aXNBbmdsZShheGlzLngsYXhpcy55LGF4aXMueixhbmdsZSkucm90YXRlKDkwLDAsMCkubXVsdGlwbHkodGhpcy5fb3JpZ2luYWxCb3hNYXRyaXgpO2NvbnN0IGV1bGVyQW5nbGVzPVVJLkdlb21ldHJ5LkV1bGVyQW5nbGVzLmZyb21Sb3RhdGlvbk1hdHJpeChjdXJyZW50TWF0cml4KTtjb25zdCBuZXdPcmllbnRhdGlvbj1uZXcgU0RLLkVtdWxhdGlvbk1vZGVsLkRldmljZU9yaWVudGF0aW9uKC1ldWxlckFuZ2xlcy5hbHBoYSwtZXVsZXJBbmdsZXMuYmV0YSxldWxlckFuZ2xlcy5nYW1tYSk7dGhpcy5fc2V0RGV2aWNlT3JpZW50YXRpb24obmV3T3JpZW50YXRpb24sRW11bGF0aW9uLlNlbnNvcnNWaWV3LkRldmljZU9yaWVudGF0aW9uTW9kaWZpY2F0aW9uU291cmNlLlVzZXJEcmFnKTt0aGlzLl9zZXRTZWxlY3RFbGVtZW50TGFiZWwodGhpcy5fb3JpZW50YXRpb25TZWxlY3RFbGVtZW50LEVtdWxhdGlvbi5TZW5zb3JzVmlldy5Ob25QcmVzZXRPcHRpb25zLkN1c3RvbSk7cmV0dXJuIGZhbHNlO30KX29uQm94RHJhZ1N0YXJ0KGV2ZW50KXtpZighdGhpcy5fZGV2aWNlT3JpZW50YXRpb25PdmVycmlkZUVuYWJsZWQpCnJldHVybiBmYWxzZTt0aGlzLl9tb3VzZURvd25WZWN0b3I9dGhpcy5fY2FsY3VsYXRlUmFkaXVzVmVjdG9yKGV2ZW50LngsZXZlbnQueSk7dGhpcy5fb3JpZ2luYWxCb3hNYXRyaXg9dGhpcy5fYm94TWF0cml4O2lmKCF0aGlzLl9tb3VzZURvd25WZWN0b3IpCnJldHVybiBmYWxzZTtldmVudC5jb25zdW1lKHRydWUpO3JldHVybiB0cnVlO30KX2NhbGN1bGF0ZVJhZGl1c1ZlY3Rvcih4LHkpe2NvbnN0IHJlY3Q9dGhpcy5fc3RhZ2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHJhZGl1cz1NYXRoLm1heChyZWN0LndpZHRoLHJlY3QuaGVpZ2h0KS8yO2NvbnN0IHNwaGVyZVg9KHgtcmVjdC5sZWZ0LXJlY3Qud2lkdGgvMikvcmFkaXVzO2NvbnN0IHNwaGVyZVk9KHktcmVjdC50b3AtcmVjdC5oZWlnaHQvMikvcmFkaXVzO2NvbnN0IHNxclN1bT1zcGhlcmVYKnNwaGVyZVgrc3BoZXJlWSpzcGhlcmVZO2lmKHNxclN1bT4wLjUpCnJldHVybiBuZXcgVUkuR2VvbWV0cnkuVmVjdG9yKHNwaGVyZVgsc3BoZXJlWSwwLjUvTWF0aC5zcXJ0KHNxclN1bSkpO3JldHVybiBuZXcgVUkuR2VvbWV0cnkuVmVjdG9yKHNwaGVyZVgsc3BoZXJlWSxNYXRoLnNxcnQoMS1zcXJTdW0pKTt9Cl9hcHBlbmRUb3VjaENvbnRyb2woKXtjb25zdCBncm91cEVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2Vuc29ycy1ncm91cCcpO2NvbnN0IHRpdGxlPWdyb3VwRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2Vuc29ycy1ncm91cC10aXRsZScpO2NvbnN0IGZpZWxkc0VsZW1lbnQ9Z3JvdXBFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZW5zb3JzLWdyb3VwLWZpZWxkcycpO3RpdGxlLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVG91Y2gnKTtjb25zdCBzZWxlY3Q9ZmllbGRzRWxlbWVudC5jcmVhdGVDaGlsZCgnc2VsZWN0JywnY2hyb21lLXNlbGVjdCcpO3NlbGVjdC5hcHBlbmRDaGlsZChuZXcgT3B0aW9uKENvbW1vbi5VSVN0cmluZygnRGV2aWNlLWJhc2VkJyksJ2F1dG8nKSk7c2VsZWN0LmFwcGVuZENoaWxkKG5ldyBPcHRpb24oQ29tbW9uLlVJU3RyaW5nKCdGb3JjZSBlbmFibGVkJyksJ2VuYWJsZWQnKSk7c2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsYXBwbHlUb3VjaCxmYWxzZSk7Y29uc3QgcmVsb2FkV2FybmluZz1ncm91cEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlbG9hZC13YXJuaW5nIGhpZGRlbicpO3JlbG9hZFdhcm5pbmcudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCcqUmVxdWlyZXMgcmVsb2FkJyk7ZnVuY3Rpb24gYXBwbHlUb3VjaCgpe2Zvcihjb25zdCBlbXVsYXRpb25Nb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsKSkKZW11bGF0aW9uTW9kZWwub3ZlcnJpZGVFbXVsYXRlVG91Y2goc2VsZWN0LnZhbHVlPT09J2VuYWJsZWQnKTtyZWxvYWRXYXJuaW5nLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPVNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuUmVzb3VyY2VUcmVlTW9kZWwpWzBdO2lmKHJlc291cmNlVHJlZU1vZGVsKXtyZXNvdXJjZVRyZWVNb2RlbC5vbmNlKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTWFpbkZyYW1lTmF2aWdhdGVkKS50aGVuKCgpPT5yZWxvYWRXYXJuaW5nLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpKTt9fX19O0VtdWxhdGlvbi5TZW5zb3JzVmlldy5EZXZpY2VPcmllbnRhdGlvbk1vZGlmaWNhdGlvblNvdXJjZT17VXNlcklucHV0Oid1c2VySW5wdXQnLFVzZXJEcmFnOid1c2VyRHJhZycsUmVzZXRCdXR0b246J3Jlc2V0QnV0dG9uJyxTZWxlY3RQcmVzZXQ6J3NlbGVjdFByZXNldCd9O0VtdWxhdGlvbi5TZW5zb3JzVmlldy5Ob25QcmVzZXRPcHRpb25zPXsnTm9PdmVycmlkZSc6J25vT3ZlcnJpZGUnLCdDdXN0b20nOidjdXN0b20nLCdVbmF2YWlsYWJsZSc6J3VuYXZhaWxhYmxlJ307RW11bGF0aW9uLlNlbnNvcnNWaWV3LlByZXNldExvY2F0aW9ucz1be3RpdGxlOidQcmVzZXRzJyx2YWx1ZTpbe3RpdGxlOkNvbW1vbi5VSVN0cmluZygnQmVybGluJyksbG9jYXRpb246J1s1Mi41MjAwMDcsIDEzLjQwNDk1NF0nfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdMb25kb24nKSxsb2NhdGlvbjonWzUxLjUwNzM1MSwgLTAuMTI3NzU4XSd9LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ01vc2NvdycpLGxvY2F0aW9uOidbNTUuNzU1ODI2LCAzNy42MTczMDBdJ30se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnTW91bnRhaW4gVmlldycpLGxvY2F0aW9uOidbMzcuMzg2MDUyLCAtMTIyLjA4Mzg1MV0nfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdNdW1iYWknKSxsb2NhdGlvbjonWzE5LjA3NTk4NCwgNzIuODc3NjU2XSd9LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1NhbiBGcmFuY2lzY28nKSxsb2NhdGlvbjonWzM3Ljc3NDkyOSwgLTEyMi40MTk0MTZdJ30se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnU2hhbmdoYWknKSxsb2NhdGlvbjonWzMxLjIzMDQxNiwgMTIxLjQ3MzcwMV0nfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTw6NvIFBhdWxvJyksbG9jYXRpb246J1stMjMuNTUwNTIwLCAtNDYuNjMzMzA5XSd9LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1Rva3lvJyksbG9jYXRpb246J1szNS42ODk0ODcsIDEzOS42OTE3MDZdJ30sXX0se3RpdGxlOidFcnJvcicsdmFsdWU6W3t0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0xvY2F0aW9uIHVuYXZhaWxhYmxlJyksbG9jYXRpb246RW11bGF0aW9uLlNlbnNvcnNWaWV3Lk5vblByZXNldE9wdGlvbnMuVW5hdmFpbGFibGV9XX1dO0VtdWxhdGlvbi5TZW5zb3JzVmlldy5QcmVzZXRPcmllbnRhdGlvbnM9W3t0aXRsZTonUHJlc2V0cycsdmFsdWU6W3t0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1BvcnRyYWl0Jyksb3JpZW50YXRpb246J1swLCA5MCwgMF0nfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdQb3J0cmFpdCB1cHNpZGUgZG93bicpLG9yaWVudGF0aW9uOidbMTgwLCAtOTAsIDBdJ30se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnTGFuZHNjYXBlIGxlZnQnKSxvcmllbnRhdGlvbjonWzAsIDkwLCAtOTBdJ30se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnTGFuZHNjYXBlIHJpZ2h0Jyksb3JpZW50YXRpb246J1swLCA5MCwgOTBdJ30se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRGlzcGxheSB1cCcpLG9yaWVudGF0aW9uOidbMCwgMCwgMF0nfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdEaXNwbGF5IGRvd24nKSxvcmllbnRhdGlvbjonWzAsIDE4MCwgMF0nfV19XTtFbXVsYXRpb24uU2Vuc29yc1ZpZXcuU2hvd0FjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtVSS52aWV3TWFuYWdlci5zaG93Vmlldygnc2Vuc29ycycpO3JldHVybiB0cnVlO319O0VtdWxhdGlvbi5TZW5zb3JzVmlldy5TaGlmdERyYWdPcmllbnRhdGlvblNwZWVkPTE2OztFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fc2NyZWVuUmVjdD1uZXcgVUkuUmVjdCgwLDAsMSwxKTt0aGlzLl92aXNpYmxlUGFnZVJlY3Q9bmV3IFVJLlJlY3QoMCwwLDEsMSk7dGhpcy5fYXZhaWxhYmxlU2l6ZT1uZXcgVUkuU2l6ZSgxLDEpO3RoaXMuX3ByZWZlcnJlZFNpemU9bmV3IFVJLlNpemUoMSwxKTt0aGlzLl9pbml0aWFsaXplZD1mYWxzZTt0aGlzLl9hcHBsaWVkRGV2aWNlU2l6ZT1uZXcgVUkuU2l6ZSgxLDEpO3RoaXMuX2FwcGxpZWREZXZpY2VTY2FsZUZhY3Rvcj13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9hcHBsaWVkVXNlckFnZW50VHlwZT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLkRlc2t0b3A7dGhpcy5fc2NhbGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdlbXVsYXRpb24uZGV2aWNlU2NhbGUnLDEpO2lmKCF0aGlzLl9zY2FsZVNldHRpbmcuZ2V0KCkpCnRoaXMuX3NjYWxlU2V0dGluZy5zZXQoMSk7dGhpcy5fc2NhbGVTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3NjYWxlU2V0dGluZ0NoYW5nZWQsdGhpcyk7dGhpcy5fd2lkdGhTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdlbXVsYXRpb24uZGV2aWNlV2lkdGgnLDQwMCk7aWYodGhpcy5fd2lkdGhTZXR0aW5nLmdldCgpPEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWluRGV2aWNlU2l6ZSkKdGhpcy5fd2lkdGhTZXR0aW5nLnNldChFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1pbkRldmljZVNpemUpO2lmKHRoaXMuX3dpZHRoU2V0dGluZy5nZXQoKT5FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1heERldmljZVNpemUpCnRoaXMuX3dpZHRoU2V0dGluZy5zZXQoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplKTt0aGlzLl93aWR0aFNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fd2lkdGhTZXR0aW5nQ2hhbmdlZCx0aGlzKTt0aGlzLl9oZWlnaHRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdlbXVsYXRpb24uZGV2aWNlSGVpZ2h0JywwKTtpZih0aGlzLl9oZWlnaHRTZXR0aW5nLmdldCgpJiZ0aGlzLl9oZWlnaHRTZXR0aW5nLmdldCgpPEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWluRGV2aWNlU2l6ZSkKdGhpcy5faGVpZ2h0U2V0dGluZy5zZXQoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NaW5EZXZpY2VTaXplKTtpZih0aGlzLl9oZWlnaHRTZXR0aW5nLmdldCgpPkVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWF4RGV2aWNlU2l6ZSkKdGhpcy5faGVpZ2h0U2V0dGluZy5zZXQoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplKTt0aGlzLl9oZWlnaHRTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2hlaWdodFNldHRpbmdDaGFuZ2VkLHRoaXMpO3RoaXMuX3VhU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZW11bGF0aW9uLmRldmljZVVBJyxFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZSk7dGhpcy5fdWFTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VhU2V0dGluZ0NoYW5nZWQsdGhpcyk7dGhpcy5fZGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdlbXVsYXRpb24uZGV2aWNlU2NhbGVGYWN0b3InLDApO3RoaXMuX2RldmljZVNjYWxlRmFjdG9yU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9kZXZpY2VTY2FsZUZhY3RvclNldHRpbmdDaGFuZ2VkLHRoaXMpO3RoaXMuX2RldmljZU91dGxpbmVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdlbXVsYXRpb24uc2hvd0RldmljZU91dGxpbmUnKTt0aGlzLl9kZXZpY2VPdXRsaW5lU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9kZXZpY2VPdXRsaW5lU2V0dGluZ0NoYW5nZWQsdGhpcyk7dGhpcy5fdG9vbGJhckNvbnRyb2xzRW5hYmxlZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2VtdWxhdGlvbi50b29sYmFyQ29udHJvbHNFbmFibGVkJyx0cnVlLENvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuU2Vzc2lvbik7dGhpcy5fdHlwZT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuTm9uZTt0aGlzLl9kZXZpY2U9bnVsbDt0aGlzLl9tb2RlPW51bGw7dGhpcy5fZml0U2NhbGU9MTt0aGlzLl90b3VjaEVuYWJsZWQ9ZmFsc2U7dGhpcy5fdG91Y2hNb2JpbGU9ZmFsc2U7dGhpcy5fZW11bGF0aW9uTW9kZWw9bnVsbDt0aGlzLl9vbk1vZGVsQXZhaWxhYmxlPW51bGw7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuRW11bGF0aW9uTW9kZWwsdGhpcyk7fQpzdGF0aWMgZGV2aWNlU2l6ZVZhbGlkYXRvcih2YWx1ZSl7aWYoL15bXGRdKyQvLnRlc3QodmFsdWUpJiZ2YWx1ZT49RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NaW5EZXZpY2VTaXplJiZ2YWx1ZTw9RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2U7fQpzdGF0aWMgZGV2aWNlU2NhbGVGYWN0b3JWYWxpZGF0b3IodmFsdWUpe2lmKCF2YWx1ZXx8KC9eW1xkXSsoXC5cZCspP3xcLlxkKyQvLnRlc3QodmFsdWUpJiZ2YWx1ZT49MCYmdmFsdWU8PTEwKSkKcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlO30Kc2V0QXZhaWxhYmxlU2l6ZShhdmFpbGFibGVTaXplLHByZWZlcnJlZFNpemUpe3RoaXMuX2F2YWlsYWJsZVNpemU9YXZhaWxhYmxlU2l6ZTt0aGlzLl9wcmVmZXJyZWRTaXplPXByZWZlcnJlZFNpemU7dGhpcy5faW5pdGlhbGl6ZWQ9dHJ1ZTt0aGlzLl9jYWxjdWxhdGVBbmRFbXVsYXRlKGZhbHNlKTt9CmVtdWxhdGUodHlwZSxkZXZpY2UsbW9kZSxzY2FsZSl7Y29uc3QgcmVzZXRQYWdlU2NhbGVGYWN0b3I9dGhpcy5fdHlwZSE9PXR5cGV8fHRoaXMuX2RldmljZSE9PWRldmljZXx8dGhpcy5fbW9kZSE9PW1vZGU7dGhpcy5fdHlwZT10eXBlO2lmKHR5cGU9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuRGV2aWNlKXtjb25zb2xlLmFzc2VydChkZXZpY2UmJm1vZGUsJ011c3QgcGFzcyBkZXZpY2UgYW5kIG1vZGUgZm9yIGRldmljZSBlbXVsYXRpb24nKTt0aGlzLl9tb2RlPW1vZGU7dGhpcy5fZGV2aWNlPWRldmljZTtpZih0aGlzLl9pbml0aWFsaXplZCl7Y29uc3Qgb3JpZW50YXRpb249ZGV2aWNlLm9yaWVudGF0aW9uQnlOYW1lKG1vZGUub3JpZW50YXRpb24pO3RoaXMuX3NjYWxlU2V0dGluZy5zZXQoc2NhbGV8fHRoaXMuX2NhbGN1bGF0ZUZpdFNjYWxlKG9yaWVudGF0aW9uLndpZHRoLG9yaWVudGF0aW9uLmhlaWdodCx0aGlzLl9jdXJyZW50T3V0bGluZSgpLHRoaXMuX2N1cnJlbnRJbnNldHMoKSkpO319ZWxzZXt0aGlzLl9kZXZpY2U9bnVsbDt0aGlzLl9tb2RlPW51bGw7fQppZih0eXBlIT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLk5vbmUpCkhvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uRGV2aWNlTW9kZUVuYWJsZWQpO3RoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUocmVzZXRQYWdlU2NhbGVGYWN0b3IpO30Kc2V0V2lkdGgod2lkdGgpe2NvbnN0IG1heD1NYXRoLm1pbihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1heERldmljZVNpemUsdGhpcy5fcHJlZmVycmVkU2NhbGVkV2lkdGgoKSk7d2lkdGg9TWF0aC5tYXgoTWF0aC5taW4od2lkdGgsbWF4KSwxKTt0aGlzLl93aWR0aFNldHRpbmcuc2V0KHdpZHRoKTt9CnNldFdpZHRoQW5kU2NhbGVUb0ZpdCh3aWR0aCl7d2lkdGg9TWF0aC5tYXgoTWF0aC5taW4od2lkdGgsRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplKSwxKTt0aGlzLl9zY2FsZVNldHRpbmcuc2V0KHRoaXMuX2NhbGN1bGF0ZUZpdFNjYWxlKHdpZHRoLHRoaXMuX2hlaWdodFNldHRpbmcuZ2V0KCkpKTt0aGlzLl93aWR0aFNldHRpbmcuc2V0KHdpZHRoKTt9CnNldEhlaWdodChoZWlnaHQpe2NvbnN0IG1heD1NYXRoLm1pbihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1heERldmljZVNpemUsdGhpcy5fcHJlZmVycmVkU2NhbGVkSGVpZ2h0KCkpO2hlaWdodD1NYXRoLm1heChNYXRoLm1pbihoZWlnaHQsbWF4KSwwKTtpZihoZWlnaHQ9PT10aGlzLl9wcmVmZXJyZWRTY2FsZWRIZWlnaHQoKSkKaGVpZ2h0PTA7dGhpcy5faGVpZ2h0U2V0dGluZy5zZXQoaGVpZ2h0KTt9CnNldEhlaWdodEFuZFNjYWxlVG9GaXQoaGVpZ2h0KXtoZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4oaGVpZ2h0LEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWF4RGV2aWNlU2l6ZSksMCk7dGhpcy5fc2NhbGVTZXR0aW5nLnNldCh0aGlzLl9jYWxjdWxhdGVGaXRTY2FsZSh0aGlzLl93aWR0aFNldHRpbmcuZ2V0KCksaGVpZ2h0KSk7dGhpcy5faGVpZ2h0U2V0dGluZy5zZXQoaGVpZ2h0KTt9CnNldFNjYWxlKHNjYWxlKXt0aGlzLl9zY2FsZVNldHRpbmcuc2V0KHNjYWxlKTt9CmRldmljZSgpe3JldHVybiB0aGlzLl9kZXZpY2U7fQptb2RlKCl7cmV0dXJuIHRoaXMuX21vZGU7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpzY3JlZW5JbWFnZSgpe3JldHVybih0aGlzLl9kZXZpY2UmJnRoaXMuX21vZGUpP3RoaXMuX2RldmljZS5tb2RlSW1hZ2UodGhpcy5fbW9kZSk6Jyc7fQpvdXRsaW5lSW1hZ2UoKXtyZXR1cm4odGhpcy5fZGV2aWNlJiZ0aGlzLl9tb2RlJiZ0aGlzLl9kZXZpY2VPdXRsaW5lU2V0dGluZy5nZXQoKSk/dGhpcy5fZGV2aWNlLm91dGxpbmVJbWFnZSh0aGlzLl9tb2RlKTonJzt9Cm91dGxpbmVSZWN0KCl7cmV0dXJuIHRoaXMuX291dGxpbmVSZWN0O30Kc2NyZWVuUmVjdCgpe3JldHVybiB0aGlzLl9zY3JlZW5SZWN0O30KdmlzaWJsZVBhZ2VSZWN0KCl7cmV0dXJuIHRoaXMuX3Zpc2libGVQYWdlUmVjdDt9CnNjYWxlKCl7cmV0dXJuIHRoaXMuX3NjYWxlO30KZml0U2NhbGUoKXtyZXR1cm4gdGhpcy5fZml0U2NhbGU7fQphcHBsaWVkRGV2aWNlU2l6ZSgpe3JldHVybiB0aGlzLl9hcHBsaWVkRGV2aWNlU2l6ZTt9CmFwcGxpZWREZXZpY2VTY2FsZUZhY3Rvcigpe3JldHVybiB0aGlzLl9hcHBsaWVkRGV2aWNlU2NhbGVGYWN0b3I7fQphcHBsaWVkVXNlckFnZW50VHlwZSgpe3JldHVybiB0aGlzLl9hcHBsaWVkVXNlckFnZW50VHlwZTt9CmlzRnVsbEhlaWdodCgpe3JldHVybiF0aGlzLl9oZWlnaHRTZXR0aW5nLmdldCgpO30KX2lzTW9iaWxlKCl7c3dpdGNoKHRoaXMuX3R5cGUpe2Nhc2UgRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZTpyZXR1cm4gdGhpcy5fZGV2aWNlLm1vYmlsZSgpO2Nhc2UgRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLk5vbmU6cmV0dXJuIGZhbHNlO2Nhc2UgRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLlJlc3BvbnNpdmU6cmV0dXJuIHRoaXMuX3VhU2V0dGluZy5nZXQoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuTW9iaWxlfHx0aGlzLl91YVNldHRpbmcuZ2V0KCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZU5vVG91Y2g7fQpyZXR1cm4gZmFsc2U7fQplbmFibGVkU2V0dGluZygpe3JldHVybiBDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZW11bGF0aW9uLnNob3dEZXZpY2VNb2RlJyxmYWxzZSk7fQpzY2FsZVNldHRpbmcoKXtyZXR1cm4gdGhpcy5fc2NhbGVTZXR0aW5nO30KdWFTZXR0aW5nKCl7cmV0dXJuIHRoaXMuX3VhU2V0dGluZzt9CmRldmljZVNjYWxlRmFjdG9yU2V0dGluZygpe3JldHVybiB0aGlzLl9kZXZpY2VTY2FsZUZhY3RvclNldHRpbmc7fQpkZXZpY2VPdXRsaW5lU2V0dGluZygpe3JldHVybiB0aGlzLl9kZXZpY2VPdXRsaW5lU2V0dGluZzt9CnRvb2xiYXJDb250cm9sc0VuYWJsZWRTZXR0aW5nKCl7cmV0dXJuIHRoaXMuX3Rvb2xiYXJDb250cm9sc0VuYWJsZWRTZXR0aW5nO30KcmVzZXQoKXt0aGlzLl9kZXZpY2VTY2FsZUZhY3RvclNldHRpbmcuc2V0KDApO3RoaXMuX3NjYWxlU2V0dGluZy5zZXQoMSk7dGhpcy5zZXRXaWR0aCg0MDApO3RoaXMuc2V0SGVpZ2h0KDApO3RoaXMuX3VhU2V0dGluZy5zZXQoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGUpO30KbW9kZWxBZGRlZChlbXVsYXRpb25Nb2RlbCl7aWYoIXRoaXMuX2VtdWxhdGlvbk1vZGVsJiZlbXVsYXRpb25Nb2RlbC5zdXBwb3J0c0RldmljZUVtdWxhdGlvbigpKXt0aGlzLl9lbXVsYXRpb25Nb2RlbD1lbXVsYXRpb25Nb2RlbDtpZih0aGlzLl9vbk1vZGVsQXZhaWxhYmxlKXtjb25zdCBjYWxsYmFjaz10aGlzLl9vbk1vZGVsQXZhaWxhYmxlO3RoaXMuX29uTW9kZWxBdmFpbGFibGU9bnVsbDtjYWxsYmFjaygpO319ZWxzZXtlbXVsYXRpb25Nb2RlbC5lbXVsYXRlVG91Y2godGhpcy5fdG91Y2hFbmFibGVkLHRoaXMuX3RvdWNoTW9iaWxlKTt9fQptb2RlbFJlbW92ZWQoZW11bGF0aW9uTW9kZWwpe2lmKHRoaXMuX2VtdWxhdGlvbk1vZGVsPT09ZW11bGF0aW9uTW9kZWwpCnRoaXMuX2VtdWxhdGlvbk1vZGVsPW51bGw7fQppbnNwZWN0ZWRVUkwoKXtyZXR1cm4gdGhpcy5fZW11bGF0aW9uTW9kZWw/dGhpcy5fZW11bGF0aW9uTW9kZWwudGFyZ2V0KCkuaW5zcGVjdGVkVVJMKCk6bnVsbDt9Cl9zY2FsZVNldHRpbmdDaGFuZ2VkKCl7dGhpcy5fY2FsY3VsYXRlQW5kRW11bGF0ZShmYWxzZSk7fQpfd2lkdGhTZXR0aW5nQ2hhbmdlZCgpe3RoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUoZmFsc2UpO30KX2hlaWdodFNldHRpbmdDaGFuZ2VkKCl7dGhpcy5fY2FsY3VsYXRlQW5kRW11bGF0ZShmYWxzZSk7fQpfdWFTZXR0aW5nQ2hhbmdlZCgpe3RoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUodHJ1ZSk7fQpfZGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nQ2hhbmdlZCgpe3RoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUoZmFsc2UpO30KX2RldmljZU91dGxpbmVTZXR0aW5nQ2hhbmdlZCgpe3RoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUoZmFsc2UpO30KX3ByZWZlcnJlZFNjYWxlZFdpZHRoKCl7cmV0dXJuIE1hdGguZmxvb3IodGhpcy5fcHJlZmVycmVkU2l6ZS53aWR0aC8odGhpcy5fc2NhbGVTZXR0aW5nLmdldCgpfHwxKSk7fQpfcHJlZmVycmVkU2NhbGVkSGVpZ2h0KCl7cmV0dXJuIE1hdGguZmxvb3IodGhpcy5fcHJlZmVycmVkU2l6ZS5oZWlnaHQvKHRoaXMuX3NjYWxlU2V0dGluZy5nZXQoKXx8MSkpO30KX2N1cnJlbnRPdXRsaW5lKCl7bGV0IG91dGxpbmU9bmV3IFVJLkluc2V0cygwLDAsMCwwKTtpZih0aGlzLl90eXBlIT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZSkKcmV0dXJuIG91dGxpbmU7Y29uc3Qgb3JpZW50YXRpb249dGhpcy5fZGV2aWNlLm9yaWVudGF0aW9uQnlOYW1lKHRoaXMuX21vZGUub3JpZW50YXRpb24pO2lmKHRoaXMuX2RldmljZU91dGxpbmVTZXR0aW5nLmdldCgpKQpvdXRsaW5lPW9yaWVudGF0aW9uLm91dGxpbmVJbnNldHN8fG91dGxpbmU7cmV0dXJuIG91dGxpbmU7fQpfY3VycmVudEluc2V0cygpe2lmKHRoaXMuX3R5cGUhPT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuRGV2aWNlKQpyZXR1cm4gbmV3IFVJLkluc2V0cygwLDAsMCwwKTtyZXR1cm4gdGhpcy5fbW9kZS5pbnNldHM7fQpfY2FsY3VsYXRlQW5kRW11bGF0ZShyZXNldFBhZ2VTY2FsZUZhY3Rvcil7aWYoIXRoaXMuX2VtdWxhdGlvbk1vZGVsKQp0aGlzLl9vbk1vZGVsQXZhaWxhYmxlPXRoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUuYmluZCh0aGlzLHJlc2V0UGFnZVNjYWxlRmFjdG9yKTtjb25zdCBtb2JpbGU9dGhpcy5faXNNb2JpbGUoKTtpZih0aGlzLl90eXBlPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZSl7Y29uc3Qgb3JpZW50YXRpb249dGhpcy5fZGV2aWNlLm9yaWVudGF0aW9uQnlOYW1lKHRoaXMuX21vZGUub3JpZW50YXRpb24pO2NvbnN0IG91dGxpbmU9dGhpcy5fY3VycmVudE91dGxpbmUoKTtjb25zdCBpbnNldHM9dGhpcy5fY3VycmVudEluc2V0cygpO3RoaXMuX2ZpdFNjYWxlPXRoaXMuX2NhbGN1bGF0ZUZpdFNjYWxlKG9yaWVudGF0aW9uLndpZHRoLG9yaWVudGF0aW9uLmhlaWdodCxvdXRsaW5lLGluc2V0cyk7aWYobW9iaWxlKXt0aGlzLl9hcHBsaWVkVXNlckFnZW50VHlwZT10aGlzLl9kZXZpY2UudG91Y2goKT9FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZTpFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZU5vVG91Y2g7fWVsc2V7dGhpcy5fYXBwbGllZFVzZXJBZ2VudFR5cGU9dGhpcy5fZGV2aWNlLnRvdWNoKCk/RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wVG91Y2g6RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wO30KdGhpcy5fYXBwbHlEZXZpY2VNZXRyaWNzKG5ldyBVSS5TaXplKG9yaWVudGF0aW9uLndpZHRoLG9yaWVudGF0aW9uLmhlaWdodCksaW5zZXRzLG91dGxpbmUsdGhpcy5fc2NhbGVTZXR0aW5nLmdldCgpLHRoaXMuX2RldmljZS5kZXZpY2VTY2FsZUZhY3Rvcixtb2JpbGUsdGhpcy5fbW9kZS5vcmllbnRhdGlvbj09PUVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5Ib3Jpem9udGFsP1Byb3RvY29sLkVtdWxhdGlvbi5TY3JlZW5PcmllbnRhdGlvblR5cGUuTGFuZHNjYXBlUHJpbWFyeTpQcm90b2NvbC5FbXVsYXRpb24uU2NyZWVuT3JpZW50YXRpb25UeXBlLlBvcnRyYWl0UHJpbWFyeSxyZXNldFBhZ2VTY2FsZUZhY3Rvcik7dGhpcy5fYXBwbHlVc2VyQWdlbnQodGhpcy5fZGV2aWNlLnVzZXJBZ2VudCk7dGhpcy5fYXBwbHlUb3VjaCh0aGlzLl9kZXZpY2UudG91Y2goKSxtb2JpbGUpO31lbHNlIGlmKHRoaXMuX3R5cGU9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuTm9uZSl7dGhpcy5fZml0U2NhbGU9dGhpcy5fY2FsY3VsYXRlRml0U2NhbGUodGhpcy5fYXZhaWxhYmxlU2l6ZS53aWR0aCx0aGlzLl9hdmFpbGFibGVTaXplLmhlaWdodCk7dGhpcy5fYXBwbGllZFVzZXJBZ2VudFR5cGU9RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wO3RoaXMuX2FwcGx5RGV2aWNlTWV0cmljcyh0aGlzLl9hdmFpbGFibGVTaXplLG5ldyBVSS5JbnNldHMoMCwwLDAsMCksbmV3IFVJLkluc2V0cygwLDAsMCwwKSwxLDAsbW9iaWxlLG51bGwscmVzZXRQYWdlU2NhbGVGYWN0b3IpO3RoaXMuX2FwcGx5VXNlckFnZW50KCcnKTt0aGlzLl9hcHBseVRvdWNoKGZhbHNlLGZhbHNlKTt9ZWxzZSBpZih0aGlzLl90eXBlPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLlJlc3BvbnNpdmUpe2xldCBzY3JlZW5XaWR0aD10aGlzLl93aWR0aFNldHRpbmcuZ2V0KCk7aWYoIXNjcmVlbldpZHRofHxzY3JlZW5XaWR0aD50aGlzLl9wcmVmZXJyZWRTY2FsZWRXaWR0aCgpKQpzY3JlZW5XaWR0aD10aGlzLl9wcmVmZXJyZWRTY2FsZWRXaWR0aCgpO2xldCBzY3JlZW5IZWlnaHQ9dGhpcy5faGVpZ2h0U2V0dGluZy5nZXQoKTtpZighc2NyZWVuSGVpZ2h0fHxzY3JlZW5IZWlnaHQ+dGhpcy5fcHJlZmVycmVkU2NhbGVkSGVpZ2h0KCkpCnNjcmVlbkhlaWdodD10aGlzLl9wcmVmZXJyZWRTY2FsZWRIZWlnaHQoKTtjb25zdCBkZWZhdWx0RGV2aWNlU2NhbGVGYWN0b3I9bW9iaWxlP0VtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuZGVmYXVsdE1vYmlsZVNjYWxlRmFjdG9yOjA7dGhpcy5fZml0U2NhbGU9dGhpcy5fY2FsY3VsYXRlRml0U2NhbGUodGhpcy5fd2lkdGhTZXR0aW5nLmdldCgpLHRoaXMuX2hlaWdodFNldHRpbmcuZ2V0KCkpO3RoaXMuX2FwcGxpZWRVc2VyQWdlbnRUeXBlPXRoaXMuX3VhU2V0dGluZy5nZXQoKTt0aGlzLl9hcHBseURldmljZU1ldHJpY3MobmV3IFVJLlNpemUoc2NyZWVuV2lkdGgsc2NyZWVuSGVpZ2h0KSxuZXcgVUkuSW5zZXRzKDAsMCwwLDApLG5ldyBVSS5JbnNldHMoMCwwLDAsMCksdGhpcy5fc2NhbGVTZXR0aW5nLmdldCgpLHRoaXMuX2RldmljZVNjYWxlRmFjdG9yU2V0dGluZy5nZXQoKXx8ZGVmYXVsdERldmljZVNjYWxlRmFjdG9yLG1vYmlsZSxzY3JlZW5IZWlnaHQ+PXNjcmVlbldpZHRoP1Byb3RvY29sLkVtdWxhdGlvbi5TY3JlZW5PcmllbnRhdGlvblR5cGUuUG9ydHJhaXRQcmltYXJ5OlByb3RvY29sLkVtdWxhdGlvbi5TY3JlZW5PcmllbnRhdGlvblR5cGUuTGFuZHNjYXBlUHJpbWFyeSxyZXNldFBhZ2VTY2FsZUZhY3Rvcik7dGhpcy5fYXBwbHlVc2VyQWdlbnQobW9iaWxlP0VtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuX2RlZmF1bHRNb2JpbGVVc2VyQWdlbnQ6JycpO3RoaXMuX2FwcGx5VG91Y2godGhpcy5fdWFTZXR0aW5nLmdldCgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wVG91Y2h8fHRoaXMuX3VhU2V0dGluZy5nZXQoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuTW9iaWxlLHRoaXMuX3VhU2V0dGluZy5nZXQoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuTW9iaWxlKTt9CmNvbnN0IG92ZXJsYXlNb2RlbD10aGlzLl9lbXVsYXRpb25Nb2RlbD90aGlzLl9lbXVsYXRpb25Nb2RlbC5vdmVybGF5TW9kZWwoKTpudWxsO2lmKG92ZXJsYXlNb2RlbCkKb3ZlcmxheU1vZGVsLnNldFNob3dWaWV3cG9ydFNpemVPblJlc2l6ZSh0aGlzLl90eXBlPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLk5vbmUpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuRXZlbnRzLlVwZGF0ZWQpO30KX2NhbGN1bGF0ZUZpdFNjYWxlKHNjcmVlbldpZHRoLHNjcmVlbkhlaWdodCxvdXRsaW5lLGluc2V0cyl7Y29uc3Qgb3V0bGluZVdpZHRoPW91dGxpbmU/b3V0bGluZS5sZWZ0K291dGxpbmUucmlnaHQ6MDtjb25zdCBvdXRsaW5lSGVpZ2h0PW91dGxpbmU/b3V0bGluZS50b3Arb3V0bGluZS5ib3R0b206MDtjb25zdCBpbnNldHNXaWR0aD1pbnNldHM/aW5zZXRzLmxlZnQraW5zZXRzLnJpZ2h0OjA7Y29uc3QgaW5zZXRzSGVpZ2h0PWluc2V0cz9pbnNldHMudG9wK2luc2V0cy5ib3R0b206MDtsZXQgc2NhbGU9TWF0aC5taW4oc2NyZWVuV2lkdGg/dGhpcy5fcHJlZmVycmVkU2l6ZS53aWR0aC8oc2NyZWVuV2lkdGgrb3V0bGluZVdpZHRoKToxLHNjcmVlbkhlaWdodD90aGlzLl9wcmVmZXJyZWRTaXplLmhlaWdodC8oc2NyZWVuSGVpZ2h0K291dGxpbmVIZWlnaHQpOjEpO3NjYWxlPU1hdGgubWluKE1hdGguZmxvb3Ioc2NhbGUqMTAwKSwxMDApO2xldCBzaGFycFNjYWxlPXNjYWxlO3doaWxlKHNoYXJwU2NhbGU+c2NhbGUqMC43KXtsZXQgc2hhcnA9dHJ1ZTtpZihzY3JlZW5XaWR0aCkKc2hhcnA9c2hhcnAmJk51bWJlci5pc0ludGVnZXIoKHNjcmVlbldpZHRoLWluc2V0c1dpZHRoKSpzaGFycFNjYWxlLzEwMCk7aWYoc2NyZWVuSGVpZ2h0KQpzaGFycD1zaGFycCYmTnVtYmVyLmlzSW50ZWdlcigoc2NyZWVuSGVpZ2h0LWluc2V0c0hlaWdodCkqc2hhcnBTY2FsZS8xMDApO2lmKHNoYXJwKQpyZXR1cm4gc2hhcnBTY2FsZS8xMDA7c2hhcnBTY2FsZS09MTt9CnJldHVybiBzY2FsZS8xMDA7fQpzZXRTaXplQW5kU2NhbGVUb0ZpdCh3aWR0aCxoZWlnaHQpe3RoaXMuX3NjYWxlU2V0dGluZy5zZXQodGhpcy5fY2FsY3VsYXRlRml0U2NhbGUod2lkdGgsaGVpZ2h0KSk7dGhpcy5zZXRXaWR0aCh3aWR0aCk7dGhpcy5zZXRIZWlnaHQoaGVpZ2h0KTt9Cl9hcHBseVVzZXJBZ2VudCh1c2VyQWdlbnQpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudE92ZXJyaWRlKHVzZXJBZ2VudCk7fQpfYXBwbHlEZXZpY2VNZXRyaWNzKHNjcmVlblNpemUsaW5zZXRzLG91dGxpbmUsc2NhbGUsZGV2aWNlU2NhbGVGYWN0b3IsbW9iaWxlLHNjcmVlbk9yaWVudGF0aW9uLHJlc2V0UGFnZVNjYWxlRmFjdG9yKXtzY3JlZW5TaXplLndpZHRoPU1hdGgubWF4KDEsTWF0aC5mbG9vcihzY3JlZW5TaXplLndpZHRoKSk7c2NyZWVuU2l6ZS5oZWlnaHQ9TWF0aC5tYXgoMSxNYXRoLmZsb29yKHNjcmVlblNpemUuaGVpZ2h0KSk7bGV0IHBhZ2VXaWR0aD1zY3JlZW5TaXplLndpZHRoLWluc2V0cy5sZWZ0LWluc2V0cy5yaWdodDtsZXQgcGFnZUhlaWdodD1zY3JlZW5TaXplLmhlaWdodC1pbnNldHMudG9wLWluc2V0cy5ib3R0b207dGhpcy5fZW11bGF0ZWRQYWdlU2l6ZT1uZXcgVUkuU2l6ZShwYWdlV2lkdGgscGFnZUhlaWdodCk7Y29uc3QgcG9zaXRpb25YPWluc2V0cy5sZWZ0O2NvbnN0IHBvc2l0aW9uWT1pbnNldHMudG9wO2NvbnN0IHNjcmVlbk9yaWVudGF0aW9uQW5nbGU9c2NyZWVuT3JpZW50YXRpb249PT1Qcm90b2NvbC5FbXVsYXRpb24uU2NyZWVuT3JpZW50YXRpb25UeXBlLkxhbmRzY2FwZVByaW1hcnk/OTA6MDt0aGlzLl9hcHBsaWVkRGV2aWNlU2l6ZT1zY3JlZW5TaXplO3RoaXMuX2FwcGxpZWREZXZpY2VTY2FsZUZhY3Rvcj1kZXZpY2VTY2FsZUZhY3Rvcnx8d2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fc2NyZWVuUmVjdD1uZXcgVUkuUmVjdChNYXRoLm1heCgwLCh0aGlzLl9hdmFpbGFibGVTaXplLndpZHRoLXNjcmVlblNpemUud2lkdGgqc2NhbGUpLzIpLG91dGxpbmUudG9wKnNjYWxlLHNjcmVlblNpemUud2lkdGgqc2NhbGUsc2NyZWVuU2l6ZS5oZWlnaHQqc2NhbGUpO3RoaXMuX291dGxpbmVSZWN0PW5ldyBVSS5SZWN0KHRoaXMuX3NjcmVlblJlY3QubGVmdC1vdXRsaW5lLmxlZnQqc2NhbGUsMCwob3V0bGluZS5sZWZ0K3NjcmVlblNpemUud2lkdGgrb3V0bGluZS5yaWdodCkqc2NhbGUsKG91dGxpbmUudG9wK3NjcmVlblNpemUuaGVpZ2h0K291dGxpbmUuYm90dG9tKSpzY2FsZSk7dGhpcy5fdmlzaWJsZVBhZ2VSZWN0PW5ldyBVSS5SZWN0KHBvc2l0aW9uWCpzY2FsZSxwb3NpdGlvblkqc2NhbGUsTWF0aC5taW4ocGFnZVdpZHRoKnNjYWxlLHRoaXMuX2F2YWlsYWJsZVNpemUud2lkdGgtdGhpcy5fc2NyZWVuUmVjdC5sZWZ0LXBvc2l0aW9uWCpzY2FsZSksTWF0aC5taW4ocGFnZUhlaWdodCpzY2FsZSx0aGlzLl9hdmFpbGFibGVTaXplLmhlaWdodC10aGlzLl9zY3JlZW5SZWN0LnRvcC1wb3NpdGlvblkqc2NhbGUpKTt0aGlzLl9zY2FsZT1zY2FsZTtpZihzY2FsZT09PTEmJnRoaXMuX2F2YWlsYWJsZVNpemUud2lkdGg+PXNjcmVlblNpemUud2lkdGgmJnRoaXMuX2F2YWlsYWJsZVNpemUuaGVpZ2h0Pj1zY3JlZW5TaXplLmhlaWdodCl7cGFnZVdpZHRoPTA7cGFnZUhlaWdodD0wO30KaWYodGhpcy5fdmlzaWJsZVBhZ2VSZWN0LndpZHRoPT09cGFnZVdpZHRoKnNjYWxlJiZ0aGlzLl92aXNpYmxlUGFnZVJlY3QuaGVpZ2h0PT09cGFnZUhlaWdodCpzY2FsZSYmTnVtYmVyLmlzSW50ZWdlcihwYWdlV2lkdGgqc2NhbGUpJiZOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VIZWlnaHQqc2NhbGUpKXtwYWdlV2lkdGg9MDtwYWdlSGVpZ2h0PTA7fQppZighdGhpcy5fZW11bGF0aW9uTW9kZWwpCnJldHVybjtpZihyZXNldFBhZ2VTY2FsZUZhY3RvcikKdGhpcy5fZW11bGF0aW9uTW9kZWwucmVzZXRQYWdlU2NhbGVGYWN0b3IoKTtpZihwYWdlV2lkdGh8fHBhZ2VIZWlnaHR8fG1vYmlsZXx8ZGV2aWNlU2NhbGVGYWN0b3J8fHNjYWxlIT09MXx8c2NyZWVuT3JpZW50YXRpb24pe2NvbnN0IG1ldHJpY3M9e3dpZHRoOnBhZ2VXaWR0aCxoZWlnaHQ6cGFnZUhlaWdodCxkZXZpY2VTY2FsZUZhY3RvcjpkZXZpY2VTY2FsZUZhY3Rvcixtb2JpbGU6bW9iaWxlLHNjYWxlOnNjYWxlLHNjcmVlbldpZHRoOnNjcmVlblNpemUud2lkdGgsc2NyZWVuSGVpZ2h0OnNjcmVlblNpemUuaGVpZ2h0LHBvc2l0aW9uWDpwb3NpdGlvblgscG9zaXRpb25ZOnBvc2l0aW9uWSxkb250U2V0VmlzaWJsZVNpemU6dHJ1ZX07aWYoc2NyZWVuT3JpZW50YXRpb24pCm1ldHJpY3Muc2NyZWVuT3JpZW50YXRpb249e3R5cGU6c2NyZWVuT3JpZW50YXRpb24sYW5nbGU6c2NyZWVuT3JpZW50YXRpb25BbmdsZX07dGhpcy5fZW11bGF0aW9uTW9kZWwuZW11bGF0ZURldmljZShtZXRyaWNzKTt9ZWxzZXt0aGlzLl9lbXVsYXRpb25Nb2RlbC5lbXVsYXRlRGV2aWNlKG51bGwpO319CmFzeW5jIGNhcHR1cmVTY3JlZW5zaG90KGZ1bGxTaXplLGNsaXApe2NvbnN0IHNjcmVlbkNhcHR1cmVNb2RlbD10aGlzLl9lbXVsYXRpb25Nb2RlbD90aGlzLl9lbXVsYXRpb25Nb2RlbC50YXJnZXQoKS5tb2RlbChTREsuU2NyZWVuQ2FwdHVyZU1vZGVsKTpudWxsO2lmKCFzY3JlZW5DYXB0dXJlTW9kZWwpCnJldHVybiBudWxsO2NvbnN0IG92ZXJsYXlNb2RlbD10aGlzLl9lbXVsYXRpb25Nb2RlbD90aGlzLl9lbXVsYXRpb25Nb2RlbC5vdmVybGF5TW9kZWwoKTpudWxsO2lmKG92ZXJsYXlNb2RlbCkKb3ZlcmxheU1vZGVsLnNldFNob3dWaWV3cG9ydFNpemVPblJlc2l6ZShmYWxzZSk7bGV0IGRldmljZU1ldHJpY3M7aWYoZnVsbFNpemUpe2NvbnN0IG1ldHJpY3M9YXdhaXQgc2NyZWVuQ2FwdHVyZU1vZGVsLmZldGNoTGF5b3V0TWV0cmljcygpO2lmKCFtZXRyaWNzKQpyZXR1cm4gbnVsbDtjb25zdCBjb250ZW50SGVpZ2h0PU1hdGgubWluKCgxPDwxNCkvdGhpcy5fYXBwbGllZERldmljZVNjYWxlRmFjdG9yLG1ldHJpY3MuY29udGVudEhlaWdodCk7ZGV2aWNlTWV0cmljcz17d2lkdGg6TWF0aC5mbG9vcihtZXRyaWNzLmNvbnRlbnRXaWR0aCksaGVpZ2h0Ok1hdGguZmxvb3IoY29udGVudEhlaWdodCksZGV2aWNlU2NhbGVGYWN0b3I6dGhpcy5fYXBwbGllZERldmljZVNjYWxlRmFjdG9yLG1vYmlsZTp0aGlzLl9pc01vYmlsZSgpLH07Y2xpcD17eDowLHk6MCx3aWR0aDpkZXZpY2VNZXRyaWNzLndpZHRoLGhlaWdodDpkZXZpY2VNZXRyaWNzLmhlaWdodCxzY2FsZToxfTtpZih0aGlzLl9kZXZpY2Upe2NvbnN0IHNjcmVlbk9yaWVudGF0aW9uPXRoaXMuX21vZGUub3JpZW50YXRpb249PT1FbXVsYXRpb24uRW11bGF0ZWREZXZpY2UuSG9yaXpvbnRhbD9Qcm90b2NvbC5FbXVsYXRpb24uU2NyZWVuT3JpZW50YXRpb25UeXBlLkxhbmRzY2FwZVByaW1hcnk6UHJvdG9jb2wuRW11bGF0aW9uLlNjcmVlbk9yaWVudGF0aW9uVHlwZS5Qb3J0cmFpdFByaW1hcnk7Y29uc3Qgc2NyZWVuT3JpZW50YXRpb25BbmdsZT1zY3JlZW5PcmllbnRhdGlvbj09PVByb3RvY29sLkVtdWxhdGlvbi5TY3JlZW5PcmllbnRhdGlvblR5cGUuTGFuZHNjYXBlUHJpbWFyeT85MDowO2RldmljZU1ldHJpY3Muc2NyZWVuT3JpZW50YXRpb249e3R5cGU6c2NyZWVuT3JpZW50YXRpb24sYW5nbGU6c2NyZWVuT3JpZW50YXRpb25BbmdsZX07fQphd2FpdCB0aGlzLl9lbXVsYXRpb25Nb2RlbC5yZXNldFBhZ2VTY2FsZUZhY3RvcigpO2F3YWl0IHRoaXMuX2VtdWxhdGlvbk1vZGVsLmVtdWxhdGVEZXZpY2UoZGV2aWNlTWV0cmljcyk7fQpjb25zdCBzY3JlZW5zaG90PWF3YWl0IHNjcmVlbkNhcHR1cmVNb2RlbC5jYXB0dXJlU2NyZWVuc2hvdCgncG5nJywxMDAsY2xpcCk7aWYoZnVsbFNpemUpe2lmKHRoaXMuX2RldmljZSl7Y29uc3Qgb3JpZW50YXRpb249dGhpcy5fZGV2aWNlLm9yaWVudGF0aW9uQnlOYW1lKHRoaXMuX21vZGUub3JpZW50YXRpb24pO2RldmljZU1ldHJpY3Mud2lkdGg9b3JpZW50YXRpb24ud2lkdGg7ZGV2aWNlTWV0cmljcy5oZWlnaHQ9b3JpZW50YXRpb24uaGVpZ2h0O31lbHNle2RldmljZU1ldHJpY3Mud2lkdGg9MDtkZXZpY2VNZXRyaWNzLmhlaWdodD0wO30KYXdhaXQgdGhpcy5fZW11bGF0aW9uTW9kZWwuZW11bGF0ZURldmljZShkZXZpY2VNZXRyaWNzKTt9CnRoaXMuX2NhbGN1bGF0ZUFuZEVtdWxhdGUoZmFsc2UpO3JldHVybiBzY3JlZW5zaG90O30KX2FwcGx5VG91Y2godG91Y2hFbmFibGVkLG1vYmlsZSl7dGhpcy5fdG91Y2hFbmFibGVkPXRvdWNoRW5hYmxlZDt0aGlzLl90b3VjaE1vYmlsZT1tb2JpbGU7Zm9yKGNvbnN0IGVtdWxhdGlvbk1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRW11bGF0aW9uTW9kZWwpKQplbXVsYXRpb25Nb2RlbC5lbXVsYXRlVG91Y2godG91Y2hFbmFibGVkLG1vYmlsZSk7fX07RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5FdmVudHM9e1VwZGF0ZWQ6J1VwZGF0ZWQnfTtFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGU9e05vbmU6J05vbmUnLFJlc3BvbnNpdmU6J1Jlc3BvbnNpdmUnLERldmljZTonRGV2aWNlJ307RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQT17TW9iaWxlOkNvbW1vbi5VSVN0cmluZygnTW9iaWxlJyksTW9iaWxlTm9Ub3VjaDpDb21tb24uVUlTdHJpbmcoJ01vYmlsZSAobm8gdG91Y2gpJyksRGVza3RvcDpDb21tb24uVUlTdHJpbmcoJ0Rlc2t0b3AnKSxEZXNrdG9wVG91Y2g6Q29tbW9uLlVJU3RyaW5nKCdEZXNrdG9wICh0b3VjaCknKX07RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NaW5EZXZpY2VTaXplPTUwO0VtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuTWF4RGV2aWNlU2l6ZT05OTk5O0VtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuX2RlZmF1bHRNb2JpbGVVc2VyQWdlbnQ9J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjA7IE5leHVzIDUgQnVpbGQvTVJBNThOKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgTW9iaWxlIFNhZmFyaS81MzcuMzYnO0VtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuX2RlZmF1bHRNb2JpbGVVc2VyQWdlbnQ9U0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIucGF0Y2hVc2VyQWdlbnRXaXRoQ2hyb21lVmVyc2lvbihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLl9kZWZhdWx0TW9iaWxlVXNlckFnZW50KTtFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLmRlZmF1bHRNb2JpbGVTY2FsZUZhY3Rvcj0yOztFbXVsYXRpb24uRGV2aWNlTW9kZVRvb2xiYXI9Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwsc2hvd01lZGlhSW5zcGVjdG9yU2V0dGluZyxzaG93UnVsZXJzU2V0dGluZyl7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5fc2hvd01lZGlhSW5zcGVjdG9yU2V0dGluZz1zaG93TWVkaWFJbnNwZWN0b3JTZXR0aW5nO3RoaXMuX3Nob3dSdWxlcnNTZXR0aW5nPXNob3dSdWxlcnNTZXR0aW5nO3RoaXMuX2RldmljZU91dGxpbmVTZXR0aW5nPXRoaXMuX21vZGVsLmRldmljZU91dGxpbmVTZXR0aW5nKCk7dGhpcy5fc2hvd0RldmljZVNjYWxlRmFjdG9yU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZW11bGF0aW9uLnNob3dEZXZpY2VTY2FsZUZhY3RvcicsZmFsc2UpO3RoaXMuX3Nob3dEZXZpY2VTY2FsZUZhY3RvclNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlRGV2aWNlU2NhbGVGYWN0b3JWaXNpYmlsaXR5LHRoaXMpO3RoaXMuX3Nob3dVc2VyQWdlbnRUeXBlU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZW11bGF0aW9uLnNob3dVc2VyQWdlbnRUeXBlJyxmYWxzZSk7dGhpcy5fc2hvd1VzZXJBZ2VudFR5cGVTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVVzZXJBZ2VudFR5cGVWaXNpYmlsaXR5LHRoaXMpO3RoaXMuX2F1dG9BZGp1c3RTY2FsZVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2VtdWxhdGlvbi5hdXRvQWRqdXN0U2NhbGUnLHRydWUpO3RoaXMuX2xhc3RNb2RlPW5ldyBNYXAoKTt0aGlzLl9lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RldmljZS1tb2RlLXRvb2xiYXInKTtjb25zdCBsZWZ0Q29udGFpbmVyPXRoaXMuX2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLXRvb2xiYXItc3BhY2VyJyk7bGVmdENvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtdG9vbGJhci1zcGFjZXInKTtjb25zdCBsZWZ0VG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyxsZWZ0Q29udGFpbmVyKTtsZWZ0VG9vbGJhci5tYWtlV3JhcHBhYmxlKCk7dGhpcy5fZmlsbExlZnRUb29sYmFyKGxlZnRUb29sYmFyKTtjb25zdCBtYWluVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0aGlzLl9lbGVtZW50KTttYWluVG9vbGJhci5tYWtlV3JhcHBhYmxlKCk7dGhpcy5fZmlsbE1haW5Ub29sYmFyKG1haW5Ub29sYmFyKTtjb25zdCByaWdodENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS10b29sYmFyLXNwYWNlcicpO2NvbnN0IHJpZ2h0VG9vbGJhcj1uZXcgVUkuVG9vbGJhcignZGV2aWNlLW1vZGUtdG9vbGJhci1maXhlZC1zaXplJyxyaWdodENvbnRhaW5lcik7cmlnaHRUb29sYmFyLm1ha2VXcmFwcGFibGUoKTt0aGlzLl9maWxsUmlnaHRUb29sYmFyKHJpZ2h0VG9vbGJhcik7Y29uc3QgbW9kZVRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ2RldmljZS1tb2RlLXRvb2xiYXItZml4ZWQtc2l6ZScscmlnaHRDb250YWluZXIpO21vZGVUb29sYmFyLm1ha2VXcmFwcGFibGUoKTt0aGlzLl9maWxsTW9kZVRvb2xiYXIobW9kZVRvb2xiYXIpO3JpZ2h0Q29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS10b29sYmFyLXNwYWNlcicpO2NvbnN0IG9wdGlvbnNUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCdkZXZpY2UtbW9kZS10b29sYmFyLW9wdGlvbnMnLHJpZ2h0Q29udGFpbmVyKTtvcHRpb25zVG9vbGJhci5tYWtlV3JhcHBhYmxlKCk7dGhpcy5fZmlsbE9wdGlvbnNUb29sYmFyKG9wdGlvbnNUb29sYmFyKTt0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0PUVtdWxhdGlvbi5FbXVsYXRlZERldmljZXNMaXN0Lmluc3RhbmNlKCk7dGhpcy5fZW11bGF0ZWREZXZpY2VzTGlzdC5hZGRFdmVudExpc3RlbmVyKEVtdWxhdGlvbi5FbXVsYXRlZERldmljZXNMaXN0LkV2ZW50cy5DdXN0b21EZXZpY2VzVXBkYXRlZCx0aGlzLl9kZXZpY2VMaXN0Q2hhbmdlZCx0aGlzKTt0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LmFkZEV2ZW50TGlzdGVuZXIoRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QuRXZlbnRzLlN0YW5kYXJkRGV2aWNlc1VwZGF0ZWQsdGhpcy5fZGV2aWNlTGlzdENoYW5nZWQsdGhpcyk7dGhpcy5fcGVyc2lzdGVuY2VTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdlbXVsYXRpb24uZGV2aWNlTW9kZVZhbHVlJyx7ZGV2aWNlOicnLG9yaWVudGF0aW9uOicnLG1vZGU6Jyd9KTt0aGlzLl9tb2RlbC50b29sYmFyQ29udHJvbHNFbmFibGVkU2V0dGluZygpLmFkZENoYW5nZUxpc3RlbmVyKHVwZGF0ZVRvb2xiYXJzRW5hYmxlZCk7dXBkYXRlVG9vbGJhcnNFbmFibGVkKCk7ZnVuY3Rpb24gdXBkYXRlVG9vbGJhcnNFbmFibGVkKCl7Y29uc3QgZW5hYmxlZD1tb2RlbC50b29sYmFyQ29udHJvbHNFbmFibGVkU2V0dGluZygpLmdldCgpO2xlZnRUb29sYmFyLnNldEVuYWJsZWQoZW5hYmxlZCk7bWFpblRvb2xiYXIuc2V0RW5hYmxlZChlbmFibGVkKTtyaWdodFRvb2xiYXIuc2V0RW5hYmxlZChlbmFibGVkKTttb2RlVG9vbGJhci5zZXRFbmFibGVkKGVuYWJsZWQpO29wdGlvbnNUb29sYmFyLnNldEVuYWJsZWQoZW5hYmxlZCk7fX0KX2ZpbGxMZWZ0VG9vbGJhcih0b29sYmFyKXt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3dyYXBUb29sYmFySXRlbShjcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdkZXZpY2UtbW9kZS1lbXB0eS10b29sYmFyLWVsZW1lbnQnKSkpO3RoaXMuX2RldmljZVNlbGVjdEl0ZW09bmV3IFVJLlRvb2xiYXJNZW51QnV0dG9uKHRoaXMuX2FwcGVuZERldmljZU1lbnVJdGVtcy5iaW5kKHRoaXMpKTt0aGlzLl9kZXZpY2VTZWxlY3RJdGVtLnNldEdseXBoKCcnKTt0aGlzLl9kZXZpY2VTZWxlY3RJdGVtLnR1cm5JbnRvU2VsZWN0KDk1KTt0aGlzLl9kZXZpY2VTZWxlY3RJdGVtLnNldERhcmtUZXh0KCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9kZXZpY2VTZWxlY3RJdGVtKTt9Cl9maWxsTWFpblRvb2xiYXIodG9vbGJhcil7Y29uc3Qgd2lkdGhJbnB1dD1VSS5jcmVhdGVJbnB1dCgnZGV2aWNlLW1vZGUtc2l6ZS1pbnB1dCcsJ3RleHQnKTt3aWR0aElucHV0Lm1heExlbmd0aD00O3dpZHRoSW5wdXQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdXaWR0aCcpO3RoaXMuX3VwZGF0ZVdpZHRoSW5wdXQ9VUkuYmluZElucHV0KHdpZHRoSW5wdXQsdGhpcy5fYXBwbHlXaWR0aC5iaW5kKHRoaXMpLEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuZGV2aWNlU2l6ZVZhbGlkYXRvcix0cnVlKTt0aGlzLl93aWR0aElucHV0PXdpZHRoSW5wdXQ7dGhpcy5fd2lkdGhJdGVtPXRoaXMuX3dyYXBUb29sYmFySXRlbSh3aWR0aElucHV0KTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3dpZHRoSXRlbSk7Y29uc3QgeEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZGV2aWNlLW1vZGUteCcpO3hFbGVtZW50LnRleHRDb250ZW50PSdcdTAwRDcnO3RoaXMuX3hJdGVtPXRoaXMuX3dyYXBUb29sYmFySXRlbSh4RWxlbWVudCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl94SXRlbSk7Y29uc3QgaGVpZ2h0SW5wdXQ9VUkuY3JlYXRlSW5wdXQoJ2RldmljZS1tb2RlLXNpemUtaW5wdXQnLCd0ZXh0Jyk7aGVpZ2h0SW5wdXQubWF4TGVuZ3RoPTQ7aGVpZ2h0SW5wdXQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdIZWlnaHQgKGxlYXZlIGVtcHR5IGZvciBmdWxsKScpO3RoaXMuX3VwZGF0ZUhlaWdodElucHV0PVVJLmJpbmRJbnB1dChoZWlnaHRJbnB1dCx0aGlzLl9hcHBseUhlaWdodC5iaW5kKHRoaXMpLHZhbGlkYXRlSGVpZ2h0LHRydWUpO3RoaXMuX2hlaWdodElucHV0PWhlaWdodElucHV0O3RoaXMuX2hlaWdodEl0ZW09dGhpcy5fd3JhcFRvb2xiYXJJdGVtKGhlaWdodElucHV0KTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2hlaWdodEl0ZW0pO2Z1bmN0aW9uIHZhbGlkYXRlSGVpZ2h0KHZhbHVlKXtyZXR1cm4hdmFsdWV8fEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuZGV2aWNlU2l6ZVZhbGlkYXRvcih2YWx1ZSk7fX0KX2FwcGx5V2lkdGgodmFsdWUpe2NvbnN0IHdpZHRoPXZhbHVlP051bWJlcih2YWx1ZSk6MDt0aGlzLl9tb2RlbC5zZXRXaWR0aEFuZFNjYWxlVG9GaXQod2lkdGgpO30KX2FwcGx5SGVpZ2h0KHZhbHVlKXtjb25zdCBoZWlnaHQ9dmFsdWU/TnVtYmVyKHZhbHVlKTowO3RoaXMuX21vZGVsLnNldEhlaWdodEFuZFNjYWxlVG9GaXQoaGVpZ2h0KTt9Cl9maWxsUmlnaHRUb29sYmFyKHRvb2xiYXIpe3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fd3JhcFRvb2xiYXJJdGVtKGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RldmljZS1tb2RlLWVtcHR5LXRvb2xiYXItZWxlbWVudCcpKSk7dGhpcy5fc2NhbGVJdGVtPW5ldyBVSS5Ub29sYmFyTWVudUJ1dHRvbih0aGlzLl9hcHBlbmRTY2FsZU1lbnVJdGVtcy5iaW5kKHRoaXMpKTt0aGlzLl9zY2FsZUl0ZW0uc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdab29tJykpO3RoaXMuX3NjYWxlSXRlbS5zZXRHbHlwaCgnJyk7dGhpcy5fc2NhbGVJdGVtLnR1cm5JbnRvU2VsZWN0KCk7dGhpcy5fc2NhbGVJdGVtLnNldERhcmtUZXh0KCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9zY2FsZUl0ZW0pO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fd3JhcFRvb2xiYXJJdGVtKGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RldmljZS1tb2RlLWVtcHR5LXRvb2xiYXItZWxlbWVudCcpKSk7dGhpcy5fZGV2aWNlU2NhbGVJdGVtPW5ldyBVSS5Ub29sYmFyTWVudUJ1dHRvbih0aGlzLl9hcHBlbmREZXZpY2VTY2FsZU1lbnVJdGVtcy5iaW5kKHRoaXMpKTt0aGlzLl9kZXZpY2VTY2FsZUl0ZW0uc2V0VmlzaWJsZSh0aGlzLl9zaG93RGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nLmdldCgpKTt0aGlzLl9kZXZpY2VTY2FsZUl0ZW0uc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdEZXZpY2UgcGl4ZWwgcmF0aW8nKSk7dGhpcy5fZGV2aWNlU2NhbGVJdGVtLnNldEdseXBoKCcnKTt0aGlzLl9kZXZpY2VTY2FsZUl0ZW0udHVybkludG9TZWxlY3QoKTt0aGlzLl9kZXZpY2VTY2FsZUl0ZW0uc2V0RGFya1RleHQoKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2RldmljZVNjYWxlSXRlbSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl93cmFwVG9vbGJhckl0ZW0oY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZGV2aWNlLW1vZGUtZW1wdHktdG9vbGJhci1lbGVtZW50JykpKTt0aGlzLl91YUl0ZW09bmV3IFVJLlRvb2xiYXJNZW51QnV0dG9uKHRoaXMuX2FwcGVuZFVzZXJBZ2VudE1lbnVJdGVtcy5iaW5kKHRoaXMpKTt0aGlzLl91YUl0ZW0uc2V0VmlzaWJsZSh0aGlzLl9zaG93VXNlckFnZW50VHlwZVNldHRpbmcuZ2V0KCkpO3RoaXMuX3VhSXRlbS5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ0RldmljZSB0eXBlJykpO3RoaXMuX3VhSXRlbS5zZXRHbHlwaCgnJyk7dGhpcy5fdWFJdGVtLnR1cm5JbnRvU2VsZWN0KCk7dGhpcy5fdWFJdGVtLnNldERhcmtUZXh0KCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl91YUl0ZW0pO3RoaXMuX3Rocm90dGxpbmdDb25kaXRpb25zSXRlbT1Nb2JpbGVUaHJvdHRsaW5nLnRocm90dGxpbmdNYW5hZ2VyKCkuY3JlYXRlTW9iaWxlVGhyb3R0bGluZ0J1dHRvbigpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fdGhyb3R0bGluZ0NvbmRpdGlvbnNJdGVtKTt9Cl9maWxsTW9kZVRvb2xiYXIodG9vbGJhcil7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl93cmFwVG9vbGJhckl0ZW0oY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZGV2aWNlLW1vZGUtZW1wdHktdG9vbGJhci1lbGVtZW50JykpKTt0aGlzLl9tb2RlQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKCcnLCdsYXJnZWljb24tcm90YXRlLXNjcmVlbicpO3RoaXMuX21vZGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9tb2RlTWVudUNsaWNrZWQsdGhpcyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9tb2RlQnV0dG9uKTt9Cl9maWxsT3B0aW9uc1Rvb2xiYXIodG9vbGJhcil7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl93cmFwVG9vbGJhckl0ZW0oY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZGV2aWNlLW1vZGUtZW1wdHktdG9vbGJhci1lbGVtZW50JykpKTtjb25zdCBtb3JlT3B0aW9uc0J1dHRvbj1uZXcgVUkuVG9vbGJhck1lbnVCdXR0b24odGhpcy5fYXBwZW5kT3B0aW9uc01lbnVJdGVtcy5iaW5kKHRoaXMpKTttb3JlT3B0aW9uc0J1dHRvbi5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ01vcmUgb3B0aW9ucycpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKG1vcmVPcHRpb25zQnV0dG9uKTt9Cl9hcHBlbmRTY2FsZU1lbnVJdGVtcyhjb250ZXh0TWVudSl7aWYodGhpcy5fbW9kZWwudHlwZSgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZSl7Y29udGV4dE1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdGaXQgdG8gd2luZG93ICglLjBmJSUpJyx0aGlzLl9tb2RlbC5maXRTY2FsZSgpKjEwMCksdGhpcy5fb25TY2FsZU1lbnVDaGFuZ2VkLmJpbmQodGhpcyx0aGlzLl9tb2RlbC5maXRTY2FsZSgpKSxmYWxzZSk7fQpjb250ZXh0TWVudS5mb290ZXJTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKGxzYEF1dG8tYWRqdXN0IHpvb21gLHRoaXMuX29uQXV0b0FkanVzdFNjYWxlQ2hhbmdlZC5iaW5kKHRoaXMpLHRoaXMuX2F1dG9BZGp1c3RTY2FsZVNldHRpbmcuZ2V0KCkpO2NvbnN0IGJvdW5kQXBwZW5kU2NhbGVJdGVtPWFwcGVuZFNjYWxlSXRlbS5iaW5kKHRoaXMpO2JvdW5kQXBwZW5kU2NhbGVJdGVtKENvbW1vbi5VSVN0cmluZygnNTAlJyksMC41KTtib3VuZEFwcGVuZFNjYWxlSXRlbShDb21tb24uVUlTdHJpbmcoJzc1JScpLDAuNzUpO2JvdW5kQXBwZW5kU2NhbGVJdGVtKENvbW1vbi5VSVN0cmluZygnMTAwJScpLDEpO2JvdW5kQXBwZW5kU2NhbGVJdGVtKENvbW1vbi5VSVN0cmluZygnMTI1JScpLDEuMjUpO2JvdW5kQXBwZW5kU2NhbGVJdGVtKENvbW1vbi5VSVN0cmluZygnMTUwJScpLDEuNSk7ZnVuY3Rpb24gYXBwZW5kU2NhbGVJdGVtKHRpdGxlLHZhbHVlKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbSh0aXRsZSx0aGlzLl9vblNjYWxlTWVudUNoYW5nZWQuYmluZCh0aGlzLHZhbHVlKSx0aGlzLl9tb2RlbC5zY2FsZVNldHRpbmcoKS5nZXQoKT09PXZhbHVlLGZhbHNlKTt9fQpfb25TY2FsZU1lbnVDaGFuZ2VkKHZhbHVlKXt0aGlzLl9tb2RlbC5zY2FsZVNldHRpbmcoKS5zZXQodmFsdWUpO30KX29uQXV0b0FkanVzdFNjYWxlQ2hhbmdlZCgpe3RoaXMuX2F1dG9BZGp1c3RTY2FsZVNldHRpbmcuc2V0KCF0aGlzLl9hdXRvQWRqdXN0U2NhbGVTZXR0aW5nLmdldCgpKTt9Cl9hcHBlbmREZXZpY2VTY2FsZU1lbnVJdGVtcyhjb250ZXh0TWVudSl7Y29uc3QgZGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nPXRoaXMuX21vZGVsLmRldmljZVNjYWxlRmFjdG9yU2V0dGluZygpO2NvbnN0IGRlZmF1bHRWYWx1ZT10aGlzLl9tb2RlbC51YVNldHRpbmcoKS5nZXQoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuTW9iaWxlfHx0aGlzLl9tb2RlbC51YVNldHRpbmcoKS5nZXQoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuTW9iaWxlTm9Ub3VjaD9FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLmRlZmF1bHRNb2JpbGVTY2FsZUZhY3Rvcjp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzthcHBlbmREZXZpY2VTY2FsZUZhY3Rvckl0ZW0oY29udGV4dE1lbnUuaGVhZGVyU2VjdGlvbigpLENvbW1vbi5VSVN0cmluZygnRGVmYXVsdDogJS4xZicsZGVmYXVsdFZhbHVlKSwwKTthcHBlbmREZXZpY2VTY2FsZUZhY3Rvckl0ZW0oY29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKSxDb21tb24uVUlTdHJpbmcoJzEnKSwxKTthcHBlbmREZXZpY2VTY2FsZUZhY3Rvckl0ZW0oY29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKSxDb21tb24uVUlTdHJpbmcoJzInKSwyKTthcHBlbmREZXZpY2VTY2FsZUZhY3Rvckl0ZW0oY29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKSxDb21tb24uVUlTdHJpbmcoJzMnKSwzKTtmdW5jdGlvbiBhcHBlbmREZXZpY2VTY2FsZUZhY3Rvckl0ZW0oc2VjdGlvbix0aXRsZSx2YWx1ZSl7c2VjdGlvbi5hcHBlbmRDaGVja2JveEl0ZW0odGl0bGUsZGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nLnNldC5iaW5kKGRldmljZVNjYWxlRmFjdG9yU2V0dGluZyx2YWx1ZSksZGV2aWNlU2NhbGVGYWN0b3JTZXR0aW5nLmdldCgpPT09dmFsdWUpO319Cl9hcHBlbmRVc2VyQWdlbnRNZW51SXRlbXMoY29udGV4dE1lbnUpe2NvbnN0IHVhU2V0dGluZz10aGlzLl9tb2RlbC51YVNldHRpbmcoKTthcHBlbmRVQUl0ZW0oRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGUsRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGUpO2FwcGVuZFVBSXRlbShFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlVBLk1vYmlsZU5vVG91Y2gsRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5Nb2JpbGVOb1RvdWNoKTthcHBlbmRVQUl0ZW0oRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5VQS5EZXNrdG9wLEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuRGVza3RvcCk7YXBwZW5kVUFJdGVtKEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuRGVza3RvcFRvdWNoLEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVUEuRGVza3RvcFRvdWNoKTtmdW5jdGlvbiBhcHBlbmRVQUl0ZW0odGl0bGUsdmFsdWUpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKHRpdGxlLHVhU2V0dGluZy5zZXQuYmluZCh1YVNldHRpbmcsdmFsdWUpLHVhU2V0dGluZy5nZXQoKT09PXZhbHVlKTt9fQpfYXBwZW5kT3B0aW9uc01lbnVJdGVtcyhjb250ZXh0TWVudSl7Y29uc3QgbW9kZWw9dGhpcy5fbW9kZWw7YXBwZW5kVG9nZ2xlSXRlbShjb250ZXh0TWVudS5oZWFkZXJTZWN0aW9uKCksdGhpcy5fZGV2aWNlT3V0bGluZVNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdIaWRlIGRldmljZSBmcmFtZScpLENvbW1vbi5VSVN0cmluZygnU2hvdyBkZXZpY2UgZnJhbWUnKSxtb2RlbC50eXBlKCkhPT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuRGV2aWNlKTthcHBlbmRUb2dnbGVJdGVtKGNvbnRleHRNZW51LmhlYWRlclNlY3Rpb24oKSx0aGlzLl9zaG93TWVkaWFJbnNwZWN0b3JTZXR0aW5nLENvbW1vbi5VSVN0cmluZygnSGlkZSBtZWRpYSBxdWVyaWVzJyksQ29tbW9uLlVJU3RyaW5nKCdTaG93IG1lZGlhIHF1ZXJpZXMnKSk7YXBwZW5kVG9nZ2xlSXRlbShjb250ZXh0TWVudS5oZWFkZXJTZWN0aW9uKCksdGhpcy5fc2hvd1J1bGVyc1NldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdIaWRlIHJ1bGVycycpLENvbW1vbi5VSVN0cmluZygnU2hvdyBydWxlcnMnKSk7YXBwZW5kVG9nZ2xlSXRlbShjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLHRoaXMuX3Nob3dEZXZpY2VTY2FsZUZhY3RvclNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgZGV2aWNlIHBpeGVsIHJhdGlvJyksQ29tbW9uLlVJU3RyaW5nKCdBZGQgZGV2aWNlIHBpeGVsIHJhdGlvJykpO2FwcGVuZFRvZ2dsZUl0ZW0oY29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKSx0aGlzLl9zaG93VXNlckFnZW50VHlwZVNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgZGV2aWNlIHR5cGUnKSxDb21tb24uVUlTdHJpbmcoJ0FkZCBkZXZpY2UgdHlwZScpKTtjb250ZXh0TWVudS5hcHBlbmRJdGVtc0F0TG9jYXRpb24oJ2RldmljZU1vZGVNZW51Jyk7Y29udGV4dE1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZXNldCB0byBkZWZhdWx0cycpLHRoaXMuX3Jlc2V0LmJpbmQodGhpcykpO2NvbnRleHRNZW51LmZvb3RlclNlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYENsb3NlIERldlRvb2xzYCxJbnNwZWN0b3JGcm9udGVuZEhvc3QuY2xvc2VXaW5kb3cuYmluZChJbnNwZWN0b3JGcm9udGVuZEhvc3QpKTtmdW5jdGlvbiBhcHBlbmRUb2dnbGVJdGVtKHNlY3Rpb24sc2V0dGluZyx0aXRsZTEsdGl0bGUyLGRpc2FibGVkKXtpZih0eXBlb2YgZGlzYWJsZWQ9PT0ndW5kZWZpbmVkJykKZGlzYWJsZWQ9bW9kZWwudHlwZSgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLk5vbmU7c2VjdGlvbi5hcHBlbmRJdGVtKHNldHRpbmcuZ2V0KCk/dGl0bGUxOnRpdGxlMixzZXR0aW5nLnNldC5iaW5kKHNldHRpbmcsIXNldHRpbmcuZ2V0KCkpLGRpc2FibGVkKTt9fQpfcmVzZXQoKXt0aGlzLl9kZXZpY2VPdXRsaW5lU2V0dGluZy5zZXQoZmFsc2UpO3RoaXMuX3Nob3dEZXZpY2VTY2FsZUZhY3RvclNldHRpbmcuc2V0KGZhbHNlKTt0aGlzLl9zaG93VXNlckFnZW50VHlwZVNldHRpbmcuc2V0KGZhbHNlKTt0aGlzLl9zaG93TWVkaWFJbnNwZWN0b3JTZXR0aW5nLnNldChmYWxzZSk7dGhpcy5fc2hvd1J1bGVyc1NldHRpbmcuc2V0KGZhbHNlKTt0aGlzLl9tb2RlbC5yZXNldCgpO30KX3dyYXBUb29sYmFySXRlbShlbGVtZW50KXtjb25zdCBjb250YWluZXI9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoY29udGFpbmVyLCdlbXVsYXRpb24vZGV2aWNlTW9kZVRvb2xiYXIuY3NzJyk7c2hhZG93Um9vdC5hcHBlbmRDaGlsZChlbGVtZW50KTtyZXR1cm4gbmV3IFVJLlRvb2xiYXJJdGVtKGNvbnRhaW5lcik7fQpfZW11bGF0ZURldmljZShkZXZpY2Upe2NvbnN0IHNjYWxlPXRoaXMuX2F1dG9BZGp1c3RTY2FsZVNldHRpbmcuZ2V0KCk/dW5kZWZpbmVkOnRoaXMuX21vZGVsLnNjYWxlU2V0dGluZygpLmdldCgpO3RoaXMuX21vZGVsLmVtdWxhdGUoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZSxkZXZpY2UsdGhpcy5fbGFzdE1vZGUuZ2V0KGRldmljZSl8fGRldmljZS5tb2Rlc1swXSxzY2FsZSk7fQpfc3dpdGNoVG9SZXNwb25zaXZlKCl7dGhpcy5fbW9kZWwuZW11bGF0ZShFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSxudWxsLG51bGwpO30KX2ZpbHRlckRldmljZXMoZGV2aWNlcyl7ZGV2aWNlcz1kZXZpY2VzLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC5zaG93KCk7fSk7ZGV2aWNlcy5zb3J0KEVtdWxhdGlvbi5FbXVsYXRlZERldmljZS5kZXZpY2VDb21wYXJhdG9yKTtyZXR1cm4gZGV2aWNlczt9Cl9zdGFuZGFyZERldmljZXMoKXtyZXR1cm4gdGhpcy5fZmlsdGVyRGV2aWNlcyh0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LnN0YW5kYXJkKCkpO30KX2N1c3RvbURldmljZXMoKXtyZXR1cm4gdGhpcy5fZmlsdGVyRGV2aWNlcyh0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LmN1c3RvbSgpKTt9Cl9hbGxEZXZpY2VzKCl7cmV0dXJuIHRoaXMuX3N0YW5kYXJkRGV2aWNlcygpLmNvbmNhdCh0aGlzLl9jdXN0b21EZXZpY2VzKCkpO30KX2FwcGVuZERldmljZU1lbnVJdGVtcyhjb250ZXh0TWVudSl7Y29udGV4dE1lbnUuaGVhZGVyU2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNpdmUnKSx0aGlzLl9zd2l0Y2hUb1Jlc3BvbnNpdmUuYmluZCh0aGlzKSx0aGlzLl9tb2RlbC50eXBlKCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSxmYWxzZSk7YXBwZW5kR3JvdXAuY2FsbCh0aGlzLHRoaXMuX3N0YW5kYXJkRGV2aWNlcygpKTthcHBlbmRHcm91cC5jYWxsKHRoaXMsdGhpcy5fY3VzdG9tRGV2aWNlcygpKTtjb250ZXh0TWVudS5mb290ZXJTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0VkaXRcdTIwMjYnKSx0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0LnJldmVhbEN1c3RvbVNldHRpbmcuYmluZCh0aGlzLl9lbXVsYXRlZERldmljZXNMaXN0KSxmYWxzZSk7ZnVuY3Rpb24gYXBwZW5kR3JvdXAoZGV2aWNlcyl7aWYoIWRldmljZXMubGVuZ3RoKQpyZXR1cm47Y29uc3Qgc2VjdGlvbj1jb250ZXh0TWVudS5zZWN0aW9uKCk7Zm9yKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKXtzZWN0aW9uLmFwcGVuZENoZWNrYm94SXRlbShkZXZpY2UudGl0bGUsdGhpcy5fZW11bGF0ZURldmljZS5iaW5kKHRoaXMsZGV2aWNlKSx0aGlzLl9tb2RlbC5kZXZpY2UoKT09PWRldmljZSxmYWxzZSk7fX19Cl9kZXZpY2VMaXN0Q2hhbmdlZCgpe2NvbnN0IGRldmljZT10aGlzLl9tb2RlbC5kZXZpY2UoKTtpZighZGV2aWNlKQpyZXR1cm47Y29uc3QgZGV2aWNlcz10aGlzLl9hbGxEZXZpY2VzKCk7aWYoZGV2aWNlcy5pbmRleE9mKGRldmljZSk9PT0tMSl7aWYoZGV2aWNlcy5sZW5ndGgpCnRoaXMuX2VtdWxhdGVEZXZpY2UoZGV2aWNlc1swXSk7ZWxzZQp0aGlzLl9tb2RlbC5lbXVsYXRlKEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5SZXNwb25zaXZlLG51bGwsbnVsbCk7fX0KX3VwZGF0ZURldmljZVNjYWxlRmFjdG9yVmlzaWJpbGl0eSgpe3RoaXMuX2RldmljZVNjYWxlSXRlbS5zZXRWaXNpYmxlKHRoaXMuX3Nob3dEZXZpY2VTY2FsZUZhY3RvclNldHRpbmcuZ2V0KCkpO30KX3VwZGF0ZVVzZXJBZ2VudFR5cGVWaXNpYmlsaXR5KCl7dGhpcy5fdWFJdGVtLnNldFZpc2libGUodGhpcy5fc2hvd1VzZXJBZ2VudFR5cGVTZXR0aW5nLmdldCgpKTt9Cl9tb2RlTWVudUNsaWNrZWQoZXZlbnQpe2NvbnN0IGRldmljZT10aGlzLl9tb2RlbC5kZXZpY2UoKTtjb25zdCBtb2RlbD10aGlzLl9tb2RlbDtjb25zdCBhdXRvQWRqdXN0U2NhbGVTZXR0aW5nPXRoaXMuX2F1dG9BZGp1c3RTY2FsZVNldHRpbmc7aWYobW9kZWwudHlwZSgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLlJlc3BvbnNpdmUpe2NvbnN0IGFwcGxpZWRTaXplPW1vZGVsLmFwcGxpZWREZXZpY2VTaXplKCk7aWYoYXV0b0FkanVzdFNjYWxlU2V0dGluZy5nZXQoKSl7bW9kZWwuc2V0U2l6ZUFuZFNjYWxlVG9GaXQoYXBwbGllZFNpemUuaGVpZ2h0LGFwcGxpZWRTaXplLndpZHRoKTt9ZWxzZXttb2RlbC5zZXRXaWR0aChhcHBsaWVkU2l6ZS5oZWlnaHQpO21vZGVsLnNldEhlaWdodChhcHBsaWVkU2l6ZS53aWR0aCk7fQpyZXR1cm47fQppZihkZXZpY2UubW9kZXMubGVuZ3RoPT09MiYmZGV2aWNlLm1vZGVzWzBdLm9yaWVudGF0aW9uIT09ZGV2aWNlLm1vZGVzWzFdLm9yaWVudGF0aW9uKXtjb25zdCBzY2FsZT1hdXRvQWRqdXN0U2NhbGVTZXR0aW5nLmdldCgpP3VuZGVmaW5lZDptb2RlbC5zY2FsZVNldHRpbmcoKS5nZXQoKTttb2RlbC5lbXVsYXRlKG1vZGVsLnR5cGUoKSxtb2RlbC5kZXZpY2UoKSxtb2RlbC5tb2RlKCk9PT1kZXZpY2UubW9kZXNbMF0/ZGV2aWNlLm1vZGVzWzFdOmRldmljZS5tb2Rlc1swXSxzY2FsZSk7cmV0dXJuO30KY29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KChldmVudC5kYXRhKSxmYWxzZSx0aGlzLl9tb2RlQnV0dG9uLmVsZW1lbnQudG90YWxPZmZzZXRMZWZ0KCksdGhpcy5fbW9kZUJ1dHRvbi5lbGVtZW50LnRvdGFsT2Zmc2V0VG9wKCkrdGhpcy5fbW9kZUJ1dHRvbi5lbGVtZW50Lm9mZnNldEhlaWdodCk7YWRkT3JpZW50YXRpb24oRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLlZlcnRpY2FsLENvbW1vbi5VSVN0cmluZygnUG9ydHJhaXQnKSk7YWRkT3JpZW50YXRpb24oRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlLkhvcml6b250YWwsQ29tbW9uLlVJU3RyaW5nKCdMYW5kc2NhcGUnKSk7Y29udGV4dE1lbnUuc2hvdygpO2Z1bmN0aW9uIGFkZE9yaWVudGF0aW9uKG9yaWVudGF0aW9uLHRpdGxlKXtjb25zdCBtb2Rlcz1kZXZpY2UubW9kZXNGb3JPcmllbnRhdGlvbihvcmllbnRhdGlvbik7aWYoIW1vZGVzLmxlbmd0aCkKcmV0dXJuO2lmKG1vZGVzLmxlbmd0aD09PTEpe2FkZE1vZGUobW9kZXNbMF0sdGl0bGUpO31lbHNle2ZvcihsZXQgaW5kZXg9MDtpbmRleDxtb2Rlcy5sZW5ndGg7aW5kZXgrKykKYWRkTW9kZShtb2Rlc1tpbmRleF0sdGl0bGUrJyBcdTIwMTMgJyttb2Rlc1tpbmRleF0udGl0bGUpO319CmZ1bmN0aW9uIGFkZE1vZGUobW9kZSx0aXRsZSl7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRDaGVja2JveEl0ZW0odGl0bGUsYXBwbHlNb2RlLmJpbmQobnVsbCxtb2RlKSxtb2RlbC5tb2RlKCk9PT1tb2RlLGZhbHNlKTt9CmZ1bmN0aW9uIGFwcGx5TW9kZShtb2RlKXtjb25zdCBzY2FsZT1hdXRvQWRqdXN0U2NhbGVTZXR0aW5nLmdldCgpP3VuZGVmaW5lZDptb2RlbC5zY2FsZVNldHRpbmcoKS5nZXQoKTttb2RlbC5lbXVsYXRlKG1vZGVsLnR5cGUoKSxtb2RlbC5kZXZpY2UoKSxtb2RlLHNjYWxlKTt9fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQ7fQp1cGRhdGUoKXtpZih0aGlzLl9tb2RlbC50eXBlKCkhPT10aGlzLl9jYWNoZWRNb2RlbFR5cGUpe3RoaXMuX2NhY2hlZE1vZGVsVHlwZT10aGlzLl9tb2RlbC50eXBlKCk7dGhpcy5fd2lkdGhJbnB1dC5kaXNhYmxlZD10aGlzLl9tb2RlbC50eXBlKCkhPT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZTt0aGlzLl9oZWlnaHRJbnB1dC5kaXNhYmxlZD10aGlzLl9tb2RlbC50eXBlKCkhPT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZTt0aGlzLl9kZXZpY2VTY2FsZUl0ZW0uc2V0RW5hYmxlZCh0aGlzLl9tb2RlbC50eXBlKCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSk7dGhpcy5fdWFJdGVtLnNldEVuYWJsZWQodGhpcy5fbW9kZWwudHlwZSgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLlJlc3BvbnNpdmUpO2lmKHRoaXMuX21vZGVsLnR5cGUoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5SZXNwb25zaXZlKXt0aGlzLl9tb2RlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fbW9kZUJ1dHRvbi5zZXRUaXRsZShsc2BSb3RhdGVgKTt9ZWxzZXt0aGlzLl9tb2RlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO319CmNvbnN0IHNpemU9dGhpcy5fbW9kZWwuYXBwbGllZERldmljZVNpemUoKTt0aGlzLl91cGRhdGVIZWlnaHRJbnB1dCh0aGlzLl9tb2RlbC50eXBlKCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSYmdGhpcy5fbW9kZWwuaXNGdWxsSGVpZ2h0KCk/Jyc6U3RyaW5nKHNpemUuaGVpZ2h0KSk7dGhpcy5fdXBkYXRlV2lkdGhJbnB1dChTdHJpbmcoc2l6ZS53aWR0aCkpO3RoaXMuX2hlaWdodElucHV0LnBsYWNlaG9sZGVyPXNpemUuaGVpZ2h0O2lmKHRoaXMuX21vZGVsLnNjYWxlKCkhPT10aGlzLl9jYWNoZWRTY2FsZSl7dGhpcy5fc2NhbGVJdGVtLnNldFRleHQoQ29tbW9uLlVJU3RyaW5nKCclLjBmJSUnLHRoaXMuX21vZGVsLnNjYWxlKCkqMTAwKSk7dGhpcy5fY2FjaGVkU2NhbGU9dGhpcy5fbW9kZWwuc2NhbGUoKTt9CmNvbnN0IGRldmljZVNjYWxlPXRoaXMuX21vZGVsLmFwcGxpZWREZXZpY2VTY2FsZUZhY3RvcigpO2lmKGRldmljZVNjYWxlIT09dGhpcy5fY2FjaGVkRGV2aWNlU2NhbGUpe3RoaXMuX2RldmljZVNjYWxlSXRlbS5zZXRUZXh0KENvbW1vbi5VSVN0cmluZygnRFBSOiAlLjFmJyxkZXZpY2VTY2FsZSkpO3RoaXMuX2NhY2hlZERldmljZVNjYWxlPWRldmljZVNjYWxlO30KY29uc3QgdWFUeXBlPXRoaXMuX21vZGVsLmFwcGxpZWRVc2VyQWdlbnRUeXBlKCk7aWYodWFUeXBlIT09dGhpcy5fY2FjaGVkVWFUeXBlKXt0aGlzLl91YUl0ZW0uc2V0VGV4dCh1YVR5cGUpO3RoaXMuX2NhY2hlZFVhVHlwZT11YVR5cGU7fQpsZXQgZGV2aWNlSXRlbVRpdGxlPUNvbW1vbi5VSVN0cmluZygnTm9uZScpO2lmKHRoaXMuX21vZGVsLnR5cGUoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5SZXNwb25zaXZlKQpkZXZpY2VJdGVtVGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdSZXNwb25zaXZlJyk7aWYodGhpcy5fbW9kZWwudHlwZSgpPT09RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLkRldmljZSkKZGV2aWNlSXRlbVRpdGxlPXRoaXMuX21vZGVsLmRldmljZSgpLnRpdGxlO3RoaXMuX2RldmljZVNlbGVjdEl0ZW0uc2V0VGV4dChkZXZpY2VJdGVtVGl0bGUpO2lmKHRoaXMuX21vZGVsLmRldmljZSgpIT09dGhpcy5fY2FjaGVkTW9kZWxEZXZpY2Upe2NvbnN0IGRldmljZT10aGlzLl9tb2RlbC5kZXZpY2UoKTtpZihkZXZpY2Upe2NvbnN0IG1vZGVDb3VudD1kZXZpY2U/ZGV2aWNlLm1vZGVzLmxlbmd0aDowO3RoaXMuX21vZGVCdXR0b24uc2V0RW5hYmxlZChtb2RlQ291bnQ+PTIpO3RoaXMuX21vZGVCdXR0b24uc2V0VGl0bGUobW9kZUNvdW50PT09Mj9Db21tb24uVUlTdHJpbmcoJ1JvdGF0ZScpOkNvbW1vbi5VSVN0cmluZygnU2NyZWVuIG9wdGlvbnMnKSk7fQp0aGlzLl9jYWNoZWRNb2RlbERldmljZT1kZXZpY2U7fQppZih0aGlzLl9tb2RlbC50eXBlKCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuRGV2aWNlKXt0aGlzLl9sYXN0TW9kZS5zZXQoKHRoaXMuX21vZGVsLmRldmljZSgpKSwodGhpcy5fbW9kZWwubW9kZSgpKSk7fQppZih0aGlzLl9tb2RlbC5tb2RlKCkhPT10aGlzLl9jYWNoZWRNb2RlbE1vZGUmJnRoaXMuX21vZGVsLnR5cGUoKSE9PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5Ob25lKXt0aGlzLl9jYWNoZWRNb2RlbE1vZGU9dGhpcy5fbW9kZWwubW9kZSgpO2NvbnN0IHZhbHVlPXRoaXMuX3BlcnNpc3RlbmNlU2V0dGluZy5nZXQoKTtpZih0aGlzLl9tb2RlbC5kZXZpY2UoKSl7dmFsdWUuZGV2aWNlPXRoaXMuX21vZGVsLmRldmljZSgpLnRpdGxlO3ZhbHVlLm9yaWVudGF0aW9uPXRoaXMuX21vZGVsLm1vZGUoKT90aGlzLl9tb2RlbC5tb2RlKCkub3JpZW50YXRpb246Jyc7dmFsdWUubW9kZT10aGlzLl9tb2RlbC5tb2RlKCk/dGhpcy5fbW9kZWwubW9kZSgpLnRpdGxlOicnO31lbHNle3ZhbHVlLmRldmljZT0nJzt2YWx1ZS5vcmllbnRhdGlvbj0nJzt2YWx1ZS5tb2RlPScnO30KdGhpcy5fcGVyc2lzdGVuY2VTZXR0aW5nLnNldCh2YWx1ZSk7fX0KcmVzdG9yZSgpe2Zvcihjb25zdCBkZXZpY2Ugb2YgdGhpcy5fYWxsRGV2aWNlcygpKXtpZihkZXZpY2UudGl0bGU9PT10aGlzLl9wZXJzaXN0ZW5jZVNldHRpbmcuZ2V0KCkuZGV2aWNlKXtmb3IoY29uc3QgbW9kZSBvZiBkZXZpY2UubW9kZXMpe2lmKG1vZGUub3JpZW50YXRpb249PT10aGlzLl9wZXJzaXN0ZW5jZVNldHRpbmcuZ2V0KCkub3JpZW50YXRpb24mJm1vZGUudGl0bGU9PT10aGlzLl9wZXJzaXN0ZW5jZVNldHRpbmcuZ2V0KCkubW9kZSl7dGhpcy5fbGFzdE1vZGUuc2V0KGRldmljZSxtb2RlKTt0aGlzLl9lbXVsYXRlRGV2aWNlKGRldmljZSk7cmV0dXJuO319fX0KdGhpcy5fbW9kZWwuZW11bGF0ZShFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSxudWxsLG51bGwpO319OztFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5zZXRNaW5pbXVtU2l6ZSgxNTAsMTUwKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGV2aWNlLW1vZGUtdmlldycpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZW11bGF0aW9uL2RldmljZU1vZGVWaWV3LmNzcycpO1VJLlRvb2x0aXAuYWRkTmF0aXZlT3ZlcnJpZGVDb250YWluZXIodGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5fbW9kZWw9c2VsZi5zaW5nbGV0b24oRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbCk7dGhpcy5fbW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLkV2ZW50cy5VcGRhdGVkLHRoaXMuX3VwZGF0ZVVJLHRoaXMpO3RoaXMuX21lZGlhSW5zcGVjdG9yPW5ldyBFbXVsYXRpb24uTWVkaWFRdWVyeUluc3BlY3RvcigoKT0+dGhpcy5fbW9kZWwuYXBwbGllZERldmljZVNpemUoKS53aWR0aCx0aGlzLl9tb2RlbC5zZXRXaWR0aC5iaW5kKHRoaXMuX21vZGVsKSk7dGhpcy5fc2hvd01lZGlhSW5zcGVjdG9yU2V0dGluZz1Db21tb24uc2V0dGluZ3MubW9kdWxlU2V0dGluZygnc2hvd01lZGlhUXVlcnlJbnNwZWN0b3InKTt0aGlzLl9zaG93TWVkaWFJbnNwZWN0b3JTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVVJLHRoaXMpO3RoaXMuX3Nob3dSdWxlcnNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdlbXVsYXRpb24uc2hvd1J1bGVycycpO3RoaXMuX3Nob3dSdWxlcnNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVVJLHRoaXMpO3RoaXMuX3RvcFJ1bGVyPW5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXcuUnVsZXIodHJ1ZSx0aGlzLl9tb2RlbC5zZXRXaWR0aEFuZFNjYWxlVG9GaXQuYmluZCh0aGlzLl9tb2RlbCkpO3RoaXMuX3RvcFJ1bGVyLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGV2aWNlLW1vZGUtcnVsZXItdG9wJyk7dGhpcy5fbGVmdFJ1bGVyPW5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXcuUnVsZXIoZmFsc2UsdGhpcy5fbW9kZWwuc2V0SGVpZ2h0QW5kU2NhbGVUb0ZpdC5iaW5kKHRoaXMuX21vZGVsKSk7dGhpcy5fbGVmdFJ1bGVyLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGV2aWNlLW1vZGUtcnVsZXItbGVmdCcpO3RoaXMuX2NyZWF0ZVVJKCk7VUkuem9vbU1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihVSS5ab29tTWFuYWdlci5FdmVudHMuWm9vbUNoYW5nZWQsdGhpcy5fem9vbUNoYW5nZWQsdGhpcyk7fQpfY3JlYXRlVUkoKXt0aGlzLl90b29sYmFyPW5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZVRvb2xiYXIodGhpcy5fbW9kZWwsdGhpcy5fc2hvd01lZGlhSW5zcGVjdG9yU2V0dGluZyx0aGlzLl9zaG93UnVsZXJzU2V0dGluZyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90b29sYmFyLmVsZW1lbnQoKSk7dGhpcy5fY29udGVudENsaXA9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtY29udGVudC1jbGlwIHZib3gnKTt0aGlzLl9yZXNwb25zaXZlUHJlc2V0c0NvbnRhaW5lcj10aGlzLl9jb250ZW50Q2xpcC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtcHJlc2V0cy1jb250YWluZXInKTt0aGlzLl9wb3B1bGF0ZVByZXNldHNDb250YWluZXIoKTt0aGlzLl9tZWRpYUluc3BlY3RvckNvbnRhaW5lcj10aGlzLl9jb250ZW50Q2xpcC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtbWVkaWEtY29udGFpbmVyJyk7dGhpcy5fY29udGVudEFyZWE9dGhpcy5fY29udGVudENsaXAuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLWNvbnRlbnQtYXJlYScpO3RoaXMuX291dGxpbmVJbWFnZT10aGlzLl9jb250ZW50QXJlYS5jcmVhdGVDaGlsZCgnaW1nJywnZGV2aWNlLW1vZGUtb3V0bGluZS1pbWFnZSBoaWRkZW4gZmlsbCcpO3RoaXMuX291dGxpbmVJbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyx0aGlzLl9vbkltYWdlTG9hZGVkLmJpbmQodGhpcyx0aGlzLl9vdXRsaW5lSW1hZ2UsdHJ1ZSksZmFsc2UpO3RoaXMuX291dGxpbmVJbWFnZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsdGhpcy5fb25JbWFnZUxvYWRlZC5iaW5kKHRoaXMsdGhpcy5fb3V0bGluZUltYWdlLGZhbHNlKSxmYWxzZSk7dGhpcy5fc2NyZWVuQXJlYT10aGlzLl9jb250ZW50QXJlYS5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtc2NyZWVuLWFyZWEnKTt0aGlzLl9zY3JlZW5JbWFnZT10aGlzLl9zY3JlZW5BcmVhLmNyZWF0ZUNoaWxkKCdpbWcnLCdkZXZpY2UtbW9kZS1zY3JlZW4taW1hZ2UgaGlkZGVuJyk7dGhpcy5fc2NyZWVuSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsdGhpcy5fb25JbWFnZUxvYWRlZC5iaW5kKHRoaXMsdGhpcy5fc2NyZWVuSW1hZ2UsdHJ1ZSksZmFsc2UpO3RoaXMuX3NjcmVlbkltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJyx0aGlzLl9vbkltYWdlTG9hZGVkLmJpbmQodGhpcyx0aGlzLl9zY3JlZW5JbWFnZSxmYWxzZSksZmFsc2UpO3RoaXMuX2JvdHRvbVJpZ2h0UmVzaXplckVsZW1lbnQ9dGhpcy5fc2NyZWVuQXJlYS5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtcmVzaXplciBkZXZpY2UtbW9kZS1ib3R0b20tcmlnaHQtcmVzaXplcicpO3RoaXMuX2JvdHRvbVJpZ2h0UmVzaXplckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJycpO3RoaXMuX2NyZWF0ZVJlc2l6ZXIodGhpcy5fYm90dG9tUmlnaHRSZXNpemVyRWxlbWVudCwyLDEpO3RoaXMuX2JvdHRvbUxlZnRSZXNpemVyRWxlbWVudD10aGlzLl9zY3JlZW5BcmVhLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS1yZXNpemVyIGRldmljZS1tb2RlLWJvdHRvbS1sZWZ0LXJlc2l6ZXInKTt0aGlzLl9ib3R0b21MZWZ0UmVzaXplckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJycpO3RoaXMuX2NyZWF0ZVJlc2l6ZXIodGhpcy5fYm90dG9tTGVmdFJlc2l6ZXJFbGVtZW50LC0yLDEpO3RoaXMuX3JpZ2h0UmVzaXplckVsZW1lbnQ9dGhpcy5fc2NyZWVuQXJlYS5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtcmVzaXplciBkZXZpY2UtbW9kZS1yaWdodC1yZXNpemVyJyk7dGhpcy5fcmlnaHRSZXNpemVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnJyk7dGhpcy5fY3JlYXRlUmVzaXplcih0aGlzLl9yaWdodFJlc2l6ZXJFbGVtZW50LDIsMCk7dGhpcy5fbGVmdFJlc2l6ZXJFbGVtZW50PXRoaXMuX3NjcmVlbkFyZWEuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLXJlc2l6ZXIgZGV2aWNlLW1vZGUtbGVmdC1yZXNpemVyJyk7dGhpcy5fbGVmdFJlc2l6ZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCcnKTt0aGlzLl9jcmVhdGVSZXNpemVyKHRoaXMuX2xlZnRSZXNpemVyRWxlbWVudCwtMiwwKTt0aGlzLl9ib3R0b21SZXNpemVyRWxlbWVudD10aGlzLl9zY3JlZW5BcmVhLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS1yZXNpemVyIGRldmljZS1tb2RlLWJvdHRvbS1yZXNpemVyJyk7dGhpcy5fYm90dG9tUmVzaXplckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJycpO3RoaXMuX2NyZWF0ZVJlc2l6ZXIodGhpcy5fYm90dG9tUmVzaXplckVsZW1lbnQsMCwxKTt0aGlzLl9ib3R0b21SZXNpemVyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsdGhpcy5fbW9kZWwuc2V0SGVpZ2h0LmJpbmQodGhpcy5fbW9kZWwsMCksZmFsc2UpO3RoaXMuX2JvdHRvbVJlc2l6ZXJFbGVtZW50LnRpdGxlPUNvbW1vbi5VSVN0cmluZygnRG91YmxlLWNsaWNrIGZvciBmdWxsIGhlaWdodCcpO3RoaXMuX3BhZ2VBcmVhPXRoaXMuX3NjcmVlbkFyZWEuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLXBhZ2UtYXJlYScpO3RoaXMuX3BhZ2VBcmVhLmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7fQpfcG9wdWxhdGVQcmVzZXRzQ29udGFpbmVyKCl7Y29uc3Qgc2l6ZXM9WzMyMCwzNzUsNDI1LDc2OCwxMDI0LDE0NDAsMjU2MF07Y29uc3QgdGl0bGVzPVtDb21tb24uVUlTdHJpbmcoJ01vYmlsZSBTJyksQ29tbW9uLlVJU3RyaW5nKCdNb2JpbGUgTScpLENvbW1vbi5VSVN0cmluZygnTW9iaWxlIEwnKSxDb21tb24uVUlTdHJpbmcoJ1RhYmxldCcpLENvbW1vbi5VSVN0cmluZygnTGFwdG9wJyksQ29tbW9uLlVJU3RyaW5nKCdMYXB0b3AgTCcpLENvbW1vbi5VSVN0cmluZygnNEsnKV07dGhpcy5fcHJlc2V0QmxvY2tzPVtdO2NvbnN0IGlubmVyPXRoaXMuX3Jlc3BvbnNpdmVQcmVzZXRzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS1wcmVzZXRzLWNvbnRhaW5lci1pbm5lcicpO2ZvcihsZXQgaT1zaXplcy5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3Qgb3V0ZXI9aW5uZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbGwgZGV2aWNlLW1vZGUtcHJlc2V0LWJhci1vdXRlcicpO2NvbnN0IGJsb2NrPW91dGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS1wcmVzZXQtYmFyJyk7YmxvY2suY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD10aXRsZXNbaV0rJyBcdTIwMTMgJytzaXplc1tpXSsncHgnO2Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxhcHBseVNpemUuYmluZCh0aGlzLHNpemVzW2ldKSxmYWxzZSk7YmxvY2suX193aWR0aD1zaXplc1tpXTt0aGlzLl9wcmVzZXRCbG9ja3MucHVzaChibG9jayk7fQpmdW5jdGlvbiBhcHBseVNpemUod2lkdGgsZSl7dGhpcy5fbW9kZWwuZW11bGF0ZShFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZSxudWxsLG51bGwpO3RoaXMuX21vZGVsLnNldFdpZHRoQW5kU2NhbGVUb0ZpdCh3aWR0aCk7ZS5jb25zdW1lKCk7fX0KX2NyZWF0ZVJlc2l6ZXIoZWxlbWVudCx3aWR0aEZhY3RvcixoZWlnaHRGYWN0b3Ipe2NvbnN0IHJlc2l6ZXI9bmV3IFVJLlJlc2l6ZXJXaWRnZXQoKTtyZXNpemVyLmFkZEVsZW1lbnQoZWxlbWVudCk7bGV0IGN1cnNvcj13aWR0aEZhY3Rvcj8nZXctcmVzaXplJzonbnMtcmVzaXplJztpZih3aWR0aEZhY3RvcipoZWlnaHRGYWN0b3I+MCkKY3Vyc29yPSdud3NlLXJlc2l6ZSc7aWYod2lkdGhGYWN0b3IqaGVpZ2h0RmFjdG9yPDApCmN1cnNvcj0nbmVzdy1yZXNpemUnO3Jlc2l6ZXIuc2V0Q3Vyc29yKGN1cnNvcik7cmVzaXplci5hZGRFdmVudExpc3RlbmVyKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZVN0YXJ0LHRoaXMuX29uUmVzaXplU3RhcnQsdGhpcyk7cmVzaXplci5hZGRFdmVudExpc3RlbmVyKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZVVwZGF0ZSx0aGlzLl9vblJlc2l6ZVVwZGF0ZS5iaW5kKHRoaXMsd2lkdGhGYWN0b3IsaGVpZ2h0RmFjdG9yKSk7cmVzaXplci5hZGRFdmVudExpc3RlbmVyKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZUVuZCx0aGlzLl9vblJlc2l6ZUVuZCx0aGlzKTtyZXR1cm4gcmVzaXplcjt9Cl9vblJlc2l6ZVN0YXJ0KGV2ZW50KXt0aGlzLl9zbG93UG9zaXRpb25TdGFydD1udWxsO3RoaXMuX3Jlc2l6ZVN0YXJ0PXRoaXMuX21vZGVsLnNjcmVlblJlY3QoKS5zaXplKCk7fQpfb25SZXNpemVVcGRhdGUod2lkdGhGYWN0b3IsaGVpZ2h0RmFjdG9yLGV2ZW50KXtpZihldmVudC5kYXRhLnNoaWZ0S2V5IT09ISF0aGlzLl9zbG93UG9zaXRpb25TdGFydCkKdGhpcy5fc2xvd1Bvc2l0aW9uU3RhcnQ9ZXZlbnQuZGF0YS5zaGlmdEtleT97eDpldmVudC5kYXRhLmN1cnJlbnRYLHk6ZXZlbnQuZGF0YS5jdXJyZW50WX06bnVsbDtsZXQgY3NzT2Zmc2V0WD1ldmVudC5kYXRhLmN1cnJlbnRYLWV2ZW50LmRhdGEuc3RhcnRYO2xldCBjc3NPZmZzZXRZPWV2ZW50LmRhdGEuY3VycmVudFktZXZlbnQuZGF0YS5zdGFydFk7aWYodGhpcy5fc2xvd1Bvc2l0aW9uU3RhcnQpe2Nzc09mZnNldFg9KGV2ZW50LmRhdGEuY3VycmVudFgtdGhpcy5fc2xvd1Bvc2l0aW9uU3RhcnQueCkvMTArdGhpcy5fc2xvd1Bvc2l0aW9uU3RhcnQueC1ldmVudC5kYXRhLnN0YXJ0WDtjc3NPZmZzZXRZPShldmVudC5kYXRhLmN1cnJlbnRZLXRoaXMuX3Nsb3dQb3NpdGlvblN0YXJ0LnkpLzEwK3RoaXMuX3Nsb3dQb3NpdGlvblN0YXJ0LnktZXZlbnQuZGF0YS5zdGFydFk7fQppZih3aWR0aEZhY3Rvcil7Y29uc3QgZGlwT2Zmc2V0WD1jc3NPZmZzZXRYKlVJLnpvb21NYW5hZ2VyLnpvb21GYWN0b3IoKTtsZXQgbmV3V2lkdGg9dGhpcy5fcmVzaXplU3RhcnQud2lkdGgrZGlwT2Zmc2V0WCp3aWR0aEZhY3RvcjtuZXdXaWR0aD1NYXRoLnJvdW5kKG5ld1dpZHRoL3RoaXMuX21vZGVsLnNjYWxlKCkpO2lmKG5ld1dpZHRoPj1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1pbkRldmljZVNpemUmJm5ld1dpZHRoPD1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1heERldmljZVNpemUpCnRoaXMuX21vZGVsLnNldFdpZHRoKG5ld1dpZHRoKTt9CmlmKGhlaWdodEZhY3Rvcil7Y29uc3QgZGlwT2Zmc2V0WT1jc3NPZmZzZXRZKlVJLnpvb21NYW5hZ2VyLnpvb21GYWN0b3IoKTtsZXQgbmV3SGVpZ2h0PXRoaXMuX3Jlc2l6ZVN0YXJ0LmhlaWdodCtkaXBPZmZzZXRZKmhlaWdodEZhY3RvcjtuZXdIZWlnaHQ9TWF0aC5yb3VuZChuZXdIZWlnaHQvdGhpcy5fbW9kZWwuc2NhbGUoKSk7aWYobmV3SGVpZ2h0Pj1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLk1pbkRldmljZVNpemUmJm5ld0hlaWdodDw9RW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5NYXhEZXZpY2VTaXplKQp0aGlzLl9tb2RlbC5zZXRIZWlnaHQobmV3SGVpZ2h0KTt9fQpfb25SZXNpemVFbmQoZXZlbnQpe2RlbGV0ZSB0aGlzLl9yZXNpemVTdGFydDtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlJlc2l6ZWRWaWV3SW5SZXNwb25zaXZlTW9kZSk7fQpfdXBkYXRlVUkoKXtmdW5jdGlvbiBhcHBseVJlY3QoZWxlbWVudCxyZWN0KXtlbGVtZW50LnN0eWxlLmxlZnQ9cmVjdC5sZWZ0KydweCc7ZWxlbWVudC5zdHlsZS50b3A9cmVjdC50b3ArJ3B4JztlbGVtZW50LnN0eWxlLndpZHRoPXJlY3Qud2lkdGgrJ3B4JztlbGVtZW50LnN0eWxlLmhlaWdodD1yZWN0LmhlaWdodCsncHgnO30KaWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtjb25zdCB6b29tRmFjdG9yPVVJLnpvb21NYW5hZ2VyLnpvb21GYWN0b3IoKTtsZXQgY2FsbERvUmVzaXplPWZhbHNlO2NvbnN0IHNob3dSdWxlcnM9dGhpcy5fc2hvd1J1bGVyc1NldHRpbmcuZ2V0KCkmJnRoaXMuX21vZGVsLnR5cGUoKSE9PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5Ob25lO2xldCBjb250ZW50QXJlYVJlc2l6ZWQ9ZmFsc2U7bGV0IHVwZGF0ZVJ1bGVycz1mYWxzZTtjb25zdCBjc3NTY3JlZW5SZWN0PXRoaXMuX21vZGVsLnNjcmVlblJlY3QoKS5zY2FsZSgxL3pvb21GYWN0b3IpO2lmKCFjc3NTY3JlZW5SZWN0LmlzRXF1YWwodGhpcy5fY2FjaGVkQ3NzU2NyZWVuUmVjdCkpe2FwcGx5UmVjdCh0aGlzLl9zY3JlZW5BcmVhLGNzc1NjcmVlblJlY3QpO3VwZGF0ZVJ1bGVycz10cnVlO2NhbGxEb1Jlc2l6ZT10cnVlO3RoaXMuX2NhY2hlZENzc1NjcmVlblJlY3Q9Y3NzU2NyZWVuUmVjdDt9CmNvbnN0IGNzc1Zpc2libGVQYWdlUmVjdD10aGlzLl9tb2RlbC52aXNpYmxlUGFnZVJlY3QoKS5zY2FsZSgxL3pvb21GYWN0b3IpO2lmKCFjc3NWaXNpYmxlUGFnZVJlY3QuaXNFcXVhbCh0aGlzLl9jYWNoZWRDc3NWaXNpYmxlUGFnZVJlY3QpKXthcHBseVJlY3QodGhpcy5fcGFnZUFyZWEsY3NzVmlzaWJsZVBhZ2VSZWN0KTtjYWxsRG9SZXNpemU9dHJ1ZTt0aGlzLl9jYWNoZWRDc3NWaXNpYmxlUGFnZVJlY3Q9Y3NzVmlzaWJsZVBhZ2VSZWN0O30KY29uc3Qgb3V0bGluZVJlY3Q9dGhpcy5fbW9kZWwub3V0bGluZVJlY3QoKS5zY2FsZSgxL3pvb21GYWN0b3IpO2lmKCFvdXRsaW5lUmVjdC5pc0VxdWFsKHRoaXMuX2NhY2hlZE91dGxpbmVSZWN0KSl7YXBwbHlSZWN0KHRoaXMuX291dGxpbmVJbWFnZSxvdXRsaW5lUmVjdCk7Y2FsbERvUmVzaXplPXRydWU7dGhpcy5fY2FjaGVkT3V0bGluZVJlY3Q9b3V0bGluZVJlY3Q7fQp0aGlzLl9jb250ZW50Q2xpcC5jbGFzc0xpc3QudG9nZ2xlKCdkZXZpY2UtbW9kZS1vdXRsaW5lLXZpc2libGUnLCEhdGhpcy5fbW9kZWwub3V0bGluZUltYWdlKCkpO2NvbnN0IHJlc2l6YWJsZT10aGlzLl9tb2RlbC50eXBlKCk9PT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuUmVzcG9uc2l2ZTtpZihyZXNpemFibGUhPT10aGlzLl9jYWNoZWRSZXNpemFibGUpe3RoaXMuX3JpZ2h0UmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhcmVzaXphYmxlKTt0aGlzLl9sZWZ0UmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhcmVzaXphYmxlKTt0aGlzLl9ib3R0b21SZXNpemVyRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFyZXNpemFibGUpO3RoaXMuX2JvdHRvbVJpZ2h0UmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhcmVzaXphYmxlKTt0aGlzLl9ib3R0b21MZWZ0UmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhcmVzaXphYmxlKTt0aGlzLl9jYWNoZWRSZXNpemFibGU9cmVzaXphYmxlO30KY29uc3QgbWVkaWFJbnNwZWN0b3JWaXNpYmxlPXRoaXMuX3Nob3dNZWRpYUluc3BlY3RvclNldHRpbmcuZ2V0KCkmJnRoaXMuX21vZGVsLnR5cGUoKSE9PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5Ob25lO2lmKG1lZGlhSW5zcGVjdG9yVmlzaWJsZSE9PXRoaXMuX2NhY2hlZE1lZGlhSW5zcGVjdG9yVmlzaWJsZSl7aWYobWVkaWFJbnNwZWN0b3JWaXNpYmxlKQp0aGlzLl9tZWRpYUluc3BlY3Rvci5zaG93KHRoaXMuX21lZGlhSW5zcGVjdG9yQ29udGFpbmVyKTtlbHNlCnRoaXMuX21lZGlhSW5zcGVjdG9yLmRldGFjaCgpO2NvbnRlbnRBcmVhUmVzaXplZD10cnVlO2NhbGxEb1Jlc2l6ZT10cnVlO3RoaXMuX2NhY2hlZE1lZGlhSW5zcGVjdG9yVmlzaWJsZT1tZWRpYUluc3BlY3RvclZpc2libGU7fQppZihzaG93UnVsZXJzIT09dGhpcy5fY2FjaGVkU2hvd1J1bGVycyl7dGhpcy5fY29udGVudENsaXAuY2xhc3NMaXN0LnRvZ2dsZSgnZGV2aWNlLW1vZGUtcnVsZXJzLXZpc2libGUnLHNob3dSdWxlcnMpO2lmKHNob3dSdWxlcnMpe3RoaXMuX3RvcFJ1bGVyLnNob3codGhpcy5fY29udGVudEFyZWEpO3RoaXMuX2xlZnRSdWxlci5zaG93KHRoaXMuX2NvbnRlbnRBcmVhKTt9ZWxzZXt0aGlzLl90b3BSdWxlci5kZXRhY2goKTt0aGlzLl9sZWZ0UnVsZXIuZGV0YWNoKCk7fQpjb250ZW50QXJlYVJlc2l6ZWQ9dHJ1ZTtjYWxsRG9SZXNpemU9dHJ1ZTt0aGlzLl9jYWNoZWRTaG93UnVsZXJzPXNob3dSdWxlcnM7fQppZih0aGlzLl9tb2RlbC5zY2FsZSgpIT09dGhpcy5fY2FjaGVkU2NhbGUpe3VwZGF0ZVJ1bGVycz10cnVlO2NhbGxEb1Jlc2l6ZT10cnVlO2Zvcihjb25zdCBibG9jayBvZiB0aGlzLl9wcmVzZXRCbG9ja3MpCmJsb2NrLnN0eWxlLndpZHRoPWJsb2NrLl9fd2lkdGgqdGhpcy5fbW9kZWwuc2NhbGUoKSsncHgnO3RoaXMuX2NhY2hlZFNjYWxlPXRoaXMuX21vZGVsLnNjYWxlKCk7fQp0aGlzLl90b29sYmFyLnVwZGF0ZSgpO3RoaXMuX2xvYWRJbWFnZSh0aGlzLl9zY3JlZW5JbWFnZSx0aGlzLl9tb2RlbC5zY3JlZW5JbWFnZSgpKTt0aGlzLl9sb2FkSW1hZ2UodGhpcy5fb3V0bGluZUltYWdlLHRoaXMuX21vZGVsLm91dGxpbmVJbWFnZSgpKTt0aGlzLl9tZWRpYUluc3BlY3Rvci5zZXRBeGlzVHJhbnNmb3JtKHRoaXMuX21vZGVsLnNjYWxlKCkpO2lmKGNhbGxEb1Jlc2l6ZSkKdGhpcy5kb1Jlc2l6ZSgpO2lmKHVwZGF0ZVJ1bGVycyl7dGhpcy5fdG9wUnVsZXIucmVuZGVyKHRoaXMuX21vZGVsLnNjYWxlKCkpO3RoaXMuX2xlZnRSdWxlci5yZW5kZXIodGhpcy5fbW9kZWwuc2NhbGUoKSk7dGhpcy5fdG9wUnVsZXIuZWxlbWVudC5wb3NpdGlvbkF0KHRoaXMuX2NhY2hlZENzc1NjcmVlblJlY3Q/dGhpcy5fY2FjaGVkQ3NzU2NyZWVuUmVjdC5sZWZ0OjAsdGhpcy5fY2FjaGVkQ3NzU2NyZWVuUmVjdD90aGlzLl9jYWNoZWRDc3NTY3JlZW5SZWN0LnRvcDowKTt0aGlzLl9sZWZ0UnVsZXIuZWxlbWVudC5wb3NpdGlvbkF0KHRoaXMuX2NhY2hlZENzc1NjcmVlblJlY3Q/dGhpcy5fY2FjaGVkQ3NzU2NyZWVuUmVjdC5sZWZ0OjAsdGhpcy5fY2FjaGVkQ3NzU2NyZWVuUmVjdD90aGlzLl9jYWNoZWRDc3NTY3JlZW5SZWN0LnRvcDowKTt9CmlmKGNvbnRlbnRBcmVhUmVzaXplZCkKdGhpcy5fY29udGVudEFyZWFSZXNpemVkKCk7fQpfbG9hZEltYWdlKGVsZW1lbnQsc3Jjc2V0KXtpZihlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3Jjc2V0Jyk9PT1zcmNzZXQpCnJldHVybjtlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3Jjc2V0JyxzcmNzZXQpO2lmKCFzcmNzZXQpCmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyx0cnVlKTt9Cl9vbkltYWdlTG9hZGVkKGVsZW1lbnQsc3VjY2Vzcyl7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFzdWNjZXNzKTt9CnNldE5vbkVtdWxhdGVkQXZhaWxhYmxlU2l6ZShlbGVtZW50KXtpZih0aGlzLl9tb2RlbC50eXBlKCkhPT1FbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuTm9uZSkKcmV0dXJuO2NvbnN0IHpvb21GYWN0b3I9VUkuem9vbU1hbmFnZXIuem9vbUZhY3RvcigpO2NvbnN0IHJlY3Q9ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBhdmFpbGFibGVTaXplPW5ldyBVSS5TaXplKE1hdGgubWF4KHJlY3Qud2lkdGgqem9vbUZhY3RvciwxKSxNYXRoLm1heChyZWN0LmhlaWdodCp6b29tRmFjdG9yLDEpKTt0aGlzLl9tb2RlbC5zZXRBdmFpbGFibGVTaXplKGF2YWlsYWJsZVNpemUsYXZhaWxhYmxlU2l6ZSk7fQpfY29udGVudEFyZWFSZXNpemVkKCl7Y29uc3Qgem9vbUZhY3Rvcj1VSS56b29tTWFuYWdlci56b29tRmFjdG9yKCk7Y29uc3QgcmVjdD10aGlzLl9jb250ZW50QXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBhdmFpbGFibGVTaXplPW5ldyBVSS5TaXplKE1hdGgubWF4KHJlY3Qud2lkdGgqem9vbUZhY3RvciwxKSxNYXRoLm1heChyZWN0LmhlaWdodCp6b29tRmFjdG9yLDEpKTtjb25zdCBwcmVmZXJyZWRTaXplPW5ldyBVSS5TaXplKE1hdGgubWF4KChyZWN0LndpZHRoLTIqdGhpcy5faGFuZGxlV2lkdGgpKnpvb21GYWN0b3IsMSksTWF0aC5tYXgoKHJlY3QuaGVpZ2h0LXRoaXMuX2hhbmRsZUhlaWdodCkqem9vbUZhY3RvciwxKSk7dGhpcy5fbW9kZWwuc2V0QXZhaWxhYmxlU2l6ZShhdmFpbGFibGVTaXplLHByZWZlcnJlZFNpemUpO30KX21lYXN1cmVIYW5kbGVzKCl7Y29uc3QgaGlkZGVuPXRoaXMuX3JpZ2h0UmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKTt0aGlzLl9yaWdodFJlc2l6ZXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsZmFsc2UpO3RoaXMuX2JvdHRvbVJlc2l6ZXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsZmFsc2UpO3RoaXMuX2hhbmRsZVdpZHRoPXRoaXMuX3JpZ2h0UmVzaXplckVsZW1lbnQub2Zmc2V0V2lkdGg7dGhpcy5faGFuZGxlSGVpZ2h0PXRoaXMuX2JvdHRvbVJlc2l6ZXJFbGVtZW50Lm9mZnNldEhlaWdodDt0aGlzLl9yaWdodFJlc2l6ZXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsaGlkZGVuKTt0aGlzLl9ib3R0b21SZXNpemVyRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLGhpZGRlbik7fQpfem9vbUNoYW5nZWQoKXtkZWxldGUgdGhpcy5faGFuZGxlV2lkdGg7ZGVsZXRlIHRoaXMuX2hhbmRsZUhlaWdodDtpZih0aGlzLmlzU2hvd2luZygpKXt0aGlzLl9tZWFzdXJlSGFuZGxlcygpO3RoaXMuX2NvbnRlbnRBcmVhUmVzaXplZCgpO319Cm9uUmVzaXplKCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fY29udGVudEFyZWFSZXNpemVkKCk7fQp3YXNTaG93bigpe3RoaXMuX21lYXN1cmVIYW5kbGVzKCk7dGhpcy5fdG9vbGJhci5yZXN0b3JlKCk7fQp3aWxsSGlkZSgpe3RoaXMuX21vZGVsLmVtdWxhdGUoRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbC5UeXBlLk5vbmUsbnVsbCxudWxsKTt9CmFzeW5jIGNhcHR1cmVTY3JlZW5zaG90KCl7U0RLLk92ZXJsYXlNb2RlbC5tdXRlSGlnaGxpZ2h0KCk7Y29uc3Qgc2NyZWVuc2hvdD1hd2FpdCB0aGlzLl9tb2RlbC5jYXB0dXJlU2NyZWVuc2hvdChmYWxzZSk7U0RLLk92ZXJsYXlNb2RlbC51bm11dGVIaWdobGlnaHQoKTtpZihzY3JlZW5zaG90PT09bnVsbCkKcmV0dXJuO2NvbnN0IHBhZ2VJbWFnZT1uZXcgSW1hZ2UoKTtwYWdlSW1hZ2Uuc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsJytzY3JlZW5zaG90O3BhZ2VJbWFnZS5vbmxvYWQ9YXN5bmMoKT0+e2NvbnN0IHNjYWxlPXBhZ2VJbWFnZS5uYXR1cmFsV2lkdGgvdGhpcy5fbW9kZWwuc2NyZWVuUmVjdCgpLndpZHRoO2NvbnN0IG91dGxpbmVSZWN0PXRoaXMuX21vZGVsLm91dGxpbmVSZWN0KCkuc2NhbGUoc2NhbGUpO2NvbnN0IHNjcmVlblJlY3Q9dGhpcy5fbW9kZWwuc2NyZWVuUmVjdCgpLnNjYWxlKHNjYWxlKTtjb25zdCB2aXNpYmxlUGFnZVJlY3Q9dGhpcy5fbW9kZWwudmlzaWJsZVBhZ2VSZWN0KCkuc2NhbGUoc2NhbGUpO2NvbnN0IGNvbnRlbnRMZWZ0PXNjcmVlblJlY3QubGVmdCt2aXNpYmxlUGFnZVJlY3QubGVmdC1vdXRsaW5lUmVjdC5sZWZ0O2NvbnN0IGNvbnRlbnRUb3A9c2NyZWVuUmVjdC50b3ArdmlzaWJsZVBhZ2VSZWN0LnRvcC1vdXRsaW5lUmVjdC50b3A7Y29uc3QgY2FudmFzPWNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2NhbnZhcy53aWR0aD1NYXRoLmZsb29yKG91dGxpbmVSZWN0LndpZHRoKTtjYW52YXMuaGVpZ2h0PU1hdGguZmxvb3Iob3V0bGluZVJlY3QuaGVpZ2h0KTtjb25zdCBjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7Y3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZTtpZih0aGlzLl9tb2RlbC5vdXRsaW5lSW1hZ2UoKSkKYXdhaXQgdGhpcy5fcGFpbnRJbWFnZShjdHgsdGhpcy5fbW9kZWwub3V0bGluZUltYWdlKCksb3V0bGluZVJlY3QucmVsYXRpdmVUbyhvdXRsaW5lUmVjdCkpO2lmKHRoaXMuX21vZGVsLnNjcmVlbkltYWdlKCkpCmF3YWl0IHRoaXMuX3BhaW50SW1hZ2UoY3R4LHRoaXMuX21vZGVsLnNjcmVlbkltYWdlKCksc2NyZWVuUmVjdC5yZWxhdGl2ZVRvKG91dGxpbmVSZWN0KSk7Y3R4LmRyYXdJbWFnZShwYWdlSW1hZ2UsTWF0aC5mbG9vcihjb250ZW50TGVmdCksTWF0aC5mbG9vcihjb250ZW50VG9wKSk7dGhpcy5fc2F2ZVNjcmVlbnNob3QoY2FudmFzKTt9O30KYXN5bmMgY2FwdHVyZUZ1bGxTaXplU2NyZWVuc2hvdCgpe1NESy5PdmVybGF5TW9kZWwubXV0ZUhpZ2hsaWdodCgpO2NvbnN0IHNjcmVlbnNob3Q9YXdhaXQgdGhpcy5fbW9kZWwuY2FwdHVyZVNjcmVlbnNob3QodHJ1ZSk7U0RLLk92ZXJsYXlNb2RlbC51bm11dGVIaWdobGlnaHQoKTtpZihzY3JlZW5zaG90PT09bnVsbCkKcmV0dXJuO3JldHVybiB0aGlzLl9zYXZlU2NyZWVuc2hvdEJhc2U2NChzY3JlZW5zaG90KTt9CmFzeW5jIGNhcHR1cmVBcmVhU2NyZWVuc2hvdChjbGlwKXtTREsuT3ZlcmxheU1vZGVsLm11dGVIaWdobGlnaHQoKTtjb25zdCBzY3JlZW5zaG90PWF3YWl0IHRoaXMuX21vZGVsLmNhcHR1cmVTY3JlZW5zaG90KGZhbHNlLGNsaXApO1NESy5PdmVybGF5TW9kZWwudW5tdXRlSGlnaGxpZ2h0KCk7aWYoc2NyZWVuc2hvdD09PW51bGwpCnJldHVybjtyZXR1cm4gdGhpcy5fc2F2ZVNjcmVlbnNob3RCYXNlNjQoc2NyZWVuc2hvdCk7fQpfc2F2ZVNjcmVlbnNob3RCYXNlNjQoc2NyZWVuc2hvdCl7Y29uc3QgcGFnZUltYWdlPW5ldyBJbWFnZSgpO3BhZ2VJbWFnZS5zcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnK3NjcmVlbnNob3Q7cGFnZUltYWdlLm9ubG9hZD0oKT0+e2NvbnN0IGNhbnZhcz1jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjYW52YXMud2lkdGg9cGFnZUltYWdlLm5hdHVyYWxXaWR0aDtjYW52YXMuaGVpZ2h0PXBhZ2VJbWFnZS5uYXR1cmFsSGVpZ2h0O2NvbnN0IGN0eD1jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlO2N0eC5kcmF3SW1hZ2UocGFnZUltYWdlLDAsMCk7dGhpcy5fc2F2ZVNjcmVlbnNob3QoY2FudmFzKTt9O30KX3BhaW50SW1hZ2UoY3R4LHNyYyxyZWN0KXtyZXR1cm4gbmV3IFByb21pc2UoZnVsZmlsbD0+e2NvbnN0IGltYWdlPW5ldyBJbWFnZSgpO2ltYWdlLmNyb3NzT3JpZ2luPSdBbm9ueW1vdXMnO2ltYWdlLnNyY3NldD1zcmM7aW1hZ2Uub25lcnJvcj1mdWxmaWxsO2ltYWdlLm9ubG9hZD0oKT0+e2N0eC5kcmF3SW1hZ2UoaW1hZ2UscmVjdC5sZWZ0LHJlY3QudG9wLHJlY3Qud2lkdGgscmVjdC5oZWlnaHQpO2Z1bGZpbGwoKTt9O30pO30KX3NhdmVTY3JlZW5zaG90KGNhbnZhcyl7Y29uc3QgdXJsPXRoaXMuX21vZGVsLmluc3BlY3RlZFVSTCgpO2xldCBmaWxlTmFtZT11cmw/dXJsLnRyaW1VUkwoKS5yZW1vdmVVUkxGcmFnbWVudCgpOicnO2lmKHRoaXMuX21vZGVsLnR5cGUoKT09PUVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5EZXZpY2UpCmZpbGVOYW1lKz1Db21tb24uVUlTdHJpbmcoJyglcyknLHRoaXMuX21vZGVsLmRldmljZSgpLnRpdGxlKTtjb25zdCBsaW5rPWNyZWF0ZUVsZW1lbnQoJ2EnKTtsaW5rLmRvd25sb2FkPWZpbGVOYW1lKycucG5nJztjYW52YXMudG9CbG9iKGJsb2I9PntsaW5rLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtsaW5rLmNsaWNrKCk7fSk7fX07RW11bGF0aW9uLkRldmljZU1vZGVWaWV3LlJ1bGVyPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcihob3Jpem9udGFsLGFwcGx5Q2FsbGJhY2spe3N1cGVyKCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RldmljZS1tb2RlLXJ1bGVyJyk7dGhpcy5fY29udGVudEVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtbW9kZS1ydWxlci1jb250ZW50JykuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLXJ1bGVyLWlubmVyJyk7dGhpcy5faG9yaXpvbnRhbD1ob3Jpem9udGFsO3RoaXMuX3NjYWxlPTE7dGhpcy5fY291bnQ9MDt0aGlzLl90aHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMCk7dGhpcy5fYXBwbHlDYWxsYmFjaz1hcHBseUNhbGxiYWNrO30KcmVuZGVyKHNjYWxlKXt0aGlzLl9zY2FsZT1zY2FsZTt0aGlzLl90aHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO30Kb25SZXNpemUoKXt0aGlzLl90aHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO30KX3VwZGF0ZSgpe2NvbnN0IHpvb21GYWN0b3I9VUkuem9vbU1hbmFnZXIuem9vbUZhY3RvcigpO2NvbnN0IHNpemU9dGhpcy5faG9yaXpvbnRhbD90aGlzLl9jb250ZW50RWxlbWVudC5vZmZzZXRXaWR0aDp0aGlzLl9jb250ZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7aWYodGhpcy5fc2NhbGUhPT10aGlzLl9yZW5kZXJlZFNjYWxlfHx6b29tRmFjdG9yIT09dGhpcy5fcmVuZGVyZWRab29tRmFjdG9yKXt0aGlzLl9jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2NvdW50PTA7dGhpcy5fcmVuZGVyZWRTY2FsZT10aGlzLl9zY2FsZTt0aGlzLl9yZW5kZXJlZFpvb21GYWN0b3I9em9vbUZhY3Rvcjt9CmNvbnN0IGRpcFNpemU9c2l6ZSp6b29tRmFjdG9yL3RoaXMuX3NjYWxlO2NvbnN0IGNvdW50PU1hdGguY2VpbChkaXBTaXplLzUpO2xldCBzdGVwPTE7aWYodGhpcy5fc2NhbGU8MC44KQpzdGVwPTI7aWYodGhpcy5fc2NhbGU8MC42KQpzdGVwPTQ7aWYodGhpcy5fc2NhbGU8MC40KQpzdGVwPTg7aWYodGhpcy5fc2NhbGU8MC4yKQpzdGVwPTE2O2lmKHRoaXMuX3NjYWxlPDAuMSkKc3RlcD0zMjtmb3IobGV0IGk9Y291bnQ7aTx0aGlzLl9jb3VudDtpKyspe2lmKCEoaSVzdGVwKSkKdGhpcy5fY29udGVudEVsZW1lbnQubGFzdENoaWxkLnJlbW92ZSgpO30KZm9yKGxldCBpPXRoaXMuX2NvdW50O2k8Y291bnQ7aSsrKXtpZihpJXN0ZXApCmNvbnRpbnVlO2NvbnN0IG1hcmtlcj10aGlzLl9jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyJyk7aWYoaSl7aWYodGhpcy5faG9yaXpvbnRhbCkKbWFya2VyLnN0eWxlLmxlZnQ9KDUqaSkqdGhpcy5fc2NhbGUvem9vbUZhY3RvcisncHgnO2Vsc2UKbWFya2VyLnN0eWxlLnRvcD0oNSppKSp0aGlzLl9zY2FsZS96b29tRmFjdG9yKydweCc7aWYoIShpJTIwKSl7Y29uc3QgdGV4dD1tYXJrZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1tb2RlLXJ1bGVyLXRleHQnKTt0ZXh0LnRleHRDb250ZW50PWkqNTt0ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbk1hcmtlckNsaWNrLmJpbmQodGhpcyxpKjUpLGZhbHNlKTt9fQppZighKGklMTApKQptYXJrZXIuY2xhc3NMaXN0LmFkZCgnZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyLWxhcmdlJyk7ZWxzZSBpZighKGklNSkpCm1hcmtlci5jbGFzc0xpc3QuYWRkKCdkZXZpY2UtbW9kZS1ydWxlci1tYXJrZXItbWVkaXVtJyk7fQp0aGlzLl9jb3VudD1jb3VudDtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpfb25NYXJrZXJDbGljayhzaXplKXt0aGlzLl9hcHBseUNhbGxiYWNrLmNhbGwobnVsbCxzaXplKTt9fTs7RW11bGF0aW9uLkRldmljZU1vZGVXcmFwcGVyPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihpbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIpe3N1cGVyKCk7RW11bGF0aW9uLkRldmljZU1vZGVWaWV3Ll93cmFwcGVySW5zdGFuY2U9dGhpczt0aGlzLl9pbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXI9aW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyO3RoaXMuX2RldmljZU1vZGVWaWV3PW51bGw7dGhpcy5fdG9nZ2xlRGV2aWNlTW9kZUFjdGlvbj1VSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24oJ2VtdWxhdGlvbi50b2dnbGUtZGV2aWNlLW1vZGUnKTtjb25zdCBtb2RlbD1zZWxmLnNpbmdsZXRvbihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsKTt0aGlzLl9zaG93RGV2aWNlTW9kZVNldHRpbmc9bW9kZWwuZW5hYmxlZFNldHRpbmcoKTt0aGlzLl9zaG93RGV2aWNlTW9kZVNldHRpbmcuc2V0UmVxdWlyZXNVc2VyQWN0aW9uKCEhUnVudGltZS5xdWVyeVBhcmFtKCdoYXNPdGhlckNsaWVudHMnKSk7dGhpcy5fc2hvd0RldmljZU1vZGVTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMsZmFsc2UpKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5PdmVybGF5TW9kZWwsU0RLLk92ZXJsYXlNb2RlbC5FdmVudHMuU2NyZWVuc2hvdFJlcXVlc3RlZCx0aGlzLl9zY3JlZW5zaG90UmVxdWVzdGVkRnJvbU92ZXJsYXksdGhpcyk7dGhpcy5fdXBkYXRlKHRydWUpO30KX3RvZ2dsZURldmljZU1vZGUoKXt0aGlzLl9zaG93RGV2aWNlTW9kZVNldHRpbmcuc2V0KCF0aGlzLl9zaG93RGV2aWNlTW9kZVNldHRpbmcuZ2V0KCkpO30KX2NhcHR1cmVTY3JlZW5zaG90KGZ1bGxTaXplLGNsaXApe2lmKCF0aGlzLl9kZXZpY2VNb2RlVmlldykKdGhpcy5fZGV2aWNlTW9kZVZpZXc9bmV3IEVtdWxhdGlvbi5EZXZpY2VNb2RlVmlldygpO3RoaXMuX2RldmljZU1vZGVWaWV3LnNldE5vbkVtdWxhdGVkQXZhaWxhYmxlU2l6ZSh0aGlzLl9pbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIuZWxlbWVudCk7aWYoZnVsbFNpemUpCnRoaXMuX2RldmljZU1vZGVWaWV3LmNhcHR1cmVGdWxsU2l6ZVNjcmVlbnNob3QoKTtlbHNlIGlmKGNsaXApCnRoaXMuX2RldmljZU1vZGVWaWV3LmNhcHR1cmVBcmVhU2NyZWVuc2hvdChjbGlwKTtlbHNlCnRoaXMuX2RldmljZU1vZGVWaWV3LmNhcHR1cmVTY3JlZW5zaG90KCk7cmV0dXJuIHRydWU7fQpfc2NyZWVuc2hvdFJlcXVlc3RlZEZyb21PdmVybGF5KGV2ZW50KXtjb25zdCBjbGlwPShldmVudC5kYXRhKTt0aGlzLl9jYXB0dXJlU2NyZWVuc2hvdChmYWxzZSxjbGlwKTt9Cl91cGRhdGUoZm9yY2Upe3RoaXMuX3RvZ2dsZURldmljZU1vZGVBY3Rpb24uc2V0VG9nZ2xlZCh0aGlzLl9zaG93RGV2aWNlTW9kZVNldHRpbmcuZ2V0KCkpO2lmKCFmb3JjZSl7Y29uc3Qgc2hvd2luZz10aGlzLl9kZXZpY2VNb2RlVmlldyYmdGhpcy5fZGV2aWNlTW9kZVZpZXcuaXNTaG93aW5nKCk7aWYodGhpcy5fc2hvd0RldmljZU1vZGVTZXR0aW5nLmdldCgpPT09c2hvd2luZykKcmV0dXJuO30KaWYodGhpcy5fc2hvd0RldmljZU1vZGVTZXR0aW5nLmdldCgpKXtpZighdGhpcy5fZGV2aWNlTW9kZVZpZXcpCnRoaXMuX2RldmljZU1vZGVWaWV3PW5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXcoKTt0aGlzLl9kZXZpY2VNb2RlVmlldy5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5faW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmNsZWFyTWluaW11bVNpemUoKTt0aGlzLl9pbnNwZWN0ZWRQYWdlUGxhY2Vob2xkZXIuc2hvdyh0aGlzLl9kZXZpY2VNb2RlVmlldy5lbGVtZW50KTt9ZWxzZXtpZih0aGlzLl9kZXZpY2VNb2RlVmlldykKdGhpcy5fZGV2aWNlTW9kZVZpZXcuZGV0YWNoKCk7dGhpcy5faW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLnJlc3RvcmVNaW5pbXVtU2l6ZSgpO3RoaXMuX2luc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5zaG93KHRoaXMuZWxlbWVudCk7fX19O0VtdWxhdGlvbi5EZXZpY2VNb2RlVmlldy5fd3JhcHBlckluc3RhbmNlO0VtdWxhdGlvbi5EZXZpY2VNb2RlV3JhcHBlci5BY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7aWYoRW11bGF0aW9uLkRldmljZU1vZGVWaWV3Ll93cmFwcGVySW5zdGFuY2Upe3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdlbXVsYXRpb24uY2FwdHVyZS1zY3JlZW5zaG90JzpyZXR1cm4gRW11bGF0aW9uLkRldmljZU1vZGVWaWV3Ll93cmFwcGVySW5zdGFuY2UuX2NhcHR1cmVTY3JlZW5zaG90KCk7Y2FzZSdlbXVsYXRpb24uY2FwdHVyZS1ub2RlLXNjcmVlbnNob3QnOntjb25zdCBub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTtpZighbm9kZSkKcmV0dXJuIHRydWU7YXN5bmMgZnVuY3Rpb24gY2FwdHVyZUNsaXAoKXtjb25zdCBvYmplY3Q9YXdhaXQgbm9kZS5yZXNvbHZlVG9PYmplY3QoKTtjb25zdCByZXN1bHQ9YXdhaXQgb2JqZWN0LmNhbGxGdW5jdGlvblByb21pc2UoZnVuY3Rpb24oKXtjb25zdCByZWN0PXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Y29uc3QgZG9jUmVjdD10aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBKU09OLnN0cmluZ2lmeSh7eDpyZWN0LmxlZnQtZG9jUmVjdC5sZWZ0LHk6cmVjdC50b3AtZG9jUmVjdC50b3Asd2lkdGg6cmVjdC53aWR0aCxoZWlnaHQ6cmVjdC5oZWlnaHQsc2NhbGU6MX0pO30pO2NvbnN0IGNsaXA9KEpTT04ucGFyc2UocmVzdWx0Lm9iamVjdC52YWx1ZSkpO0VtdWxhdGlvbi5EZXZpY2VNb2RlVmlldy5fd3JhcHBlckluc3RhbmNlLl9jYXB0dXJlU2NyZWVuc2hvdChmYWxzZSxjbGlwKTt9CmNhcHR1cmVDbGlwKCk7cmV0dXJuIHRydWU7fQpjYXNlJ2VtdWxhdGlvbi5jYXB0dXJlLWZ1bGwtaGVpZ2h0LXNjcmVlbnNob3QnOnJldHVybiBFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXcuX3dyYXBwZXJJbnN0YW5jZS5fY2FwdHVyZVNjcmVlbnNob3QodHJ1ZSk7Y2FzZSdlbXVsYXRpb24udG9nZ2xlLWRldmljZS1tb2RlJzpFbXVsYXRpb24uRGV2aWNlTW9kZVZpZXcuX3dyYXBwZXJJbnN0YW5jZS5fdG9nZ2xlRGV2aWNlTW9kZSgpO3JldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9fTs7c2VsZlsnSW5zcGVjdG9yTWFpbiddPXNlbGZbJ0luc3BlY3Rvck1haW4nXXx8e307SW5zcGVjdG9yTWFpbi5SZW5kZXJpbmdPcHRpb25zVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2luc3BlY3Rvcl9tYWluL3JlbmRlcmluZ09wdGlvbnMuY3NzJyk7dGhpcy5fYXBwZW5kQ2hlY2tib3goQ29tbW9uLlVJU3RyaW5nKCdQYWludCBmbGFzaGluZycpLENvbW1vbi5VSVN0cmluZygnSGlnaGxpZ2h0cyBhcmVhcyBvZiB0aGUgcGFnZSAoZ3JlZW4pIHRoYXQgbmVlZCB0byBiZSByZXBhaW50ZWQnKSxDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd1BhaW50UmVjdHMnKSk7dGhpcy5fYXBwZW5kQ2hlY2tib3goQ29tbW9uLlVJU3RyaW5nKCdMYXllciBib3JkZXJzJyksQ29tbW9uLlVJU3RyaW5nKCdTaG93cyBsYXllciBib3JkZXJzIChvcmFuZ2Uvb2xpdmUpIGFuZCB0aWxlcyAoY3lhbiknKSxDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd0RlYnVnQm9yZGVycycpKTt0aGlzLl9hcHBlbmRDaGVja2JveChDb21tb24uVUlTdHJpbmcoJ0ZQUyBtZXRlcicpLENvbW1vbi5VSVN0cmluZygnUGxvdHMgZnJhbWVzIHBlciBzZWNvbmQsIGZyYW1lIHJhdGUgZGlzdHJpYnV0aW9uLCBhbmQgR1BVIG1lbW9yeScpLENvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93RlBTQ291bnRlcicpKTt0aGlzLl9hcHBlbmRDaGVja2JveChDb21tb24uVUlTdHJpbmcoJ1Njcm9sbGluZyBwZXJmb3JtYW5jZSBpc3N1ZXMnKSxDb21tb24uVUlTdHJpbmcoJ0hpZ2hsaWdodHMgZWxlbWVudHMgKHRlYWwpIHRoYXQgY2FuIHNsb3cgZG93biBzY3JvbGxpbmcsIGluY2x1ZGluZyB0b3VjaCAmIHdoZWVsIGV2ZW50IGhhbmRsZXJzIGFuZCBvdGhlciBtYWluLXRocmVhZCBzY3JvbGxpbmcgc2l0dWF0aW9ucy4nKSxDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd1Njcm9sbEJvdHRsZW5lY2tSZWN0cycpKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKS5jbGFzc0xpc3QuYWRkKCdwYW5lbC1zZWN0aW9uLXNlcGFyYXRvcicpO2NvbnN0IG1lZGlhU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnZW11bGF0ZWRDU1NNZWRpYScpO2NvbnN0IG1lZGlhU2VsZWN0PVVJLlNldHRpbmdzVUkuY3JlYXRlQ29udHJvbEZvclNldHRpbmcobWVkaWFTZXR0aW5nKTtpZihtZWRpYVNlbGVjdCl7Y29uc3QgbWVkaWFSb3c9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ21lZGlhLXJvdycpO21lZGlhUm93LmNyZWF0ZUNoaWxkKCdsYWJlbCcpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRW11bGF0ZSBDU1MgbWVkaWEnKTttZWRpYVJvdy5jcmVhdGVDaGlsZCgncCcpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRm9yY2VzIG1lZGlhIHR5cGUgZm9yIHRlc3RpbmcgcHJpbnQgYW5kIHNjcmVlbiBzdHlsZXMnKTttZWRpYVJvdy5hcHBlbmRDaGlsZChtZWRpYVNlbGVjdCk7fX0KX2FwcGVuZENoZWNrYm94KGxhYmVsLHN1YnRpdGxlLHNldHRpbmcpe2NvbnN0IGNoZWNrYm94TGFiZWw9VUkuQ2hlY2tib3hMYWJlbC5jcmVhdGUobGFiZWwsZmFsc2Usc3VidGl0bGUpO1VJLlNldHRpbmdzVUkuYmluZENoZWNrYm94KGNoZWNrYm94TGFiZWwuY2hlY2tib3hFbGVtZW50LHNldHRpbmcpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3hMYWJlbCk7fX07O0luc3BlY3Rvck1haW4uUmVxdWVzdEFwcEJhbm5lckFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCB0YXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO2lmKHRhcmdldCYmdGFyZ2V0Lmhhc0Jyb3dzZXJDYXBhYmlsaXR5KCkpe3RhcmdldC5wYWdlQWdlbnQoKS5yZXF1ZXN0QXBwQmFubmVyKCk7Q29tbW9uLmNvbnNvbGUuc2hvdygpO30KcmV0dXJuIHRydWU7fX07O0luc3BlY3Rvck1haW4uSW5zcGVjdG9yTWFpbj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX21haW5Db25uZWN0aW9uO30KcnVuKCl7dGhpcy5fY29ubmVjdEFuZENyZWF0ZU1haW5UYXJnZXQoKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29ubmVjdGlvblJlYWR5KCk7bmV3IEluc3BlY3Rvck1haW4uSW5zcGVjdGVkTm9kZVJldmVhbGVyKCk7bmV3IEluc3BlY3Rvck1haW4uU291cmNlc1BhbmVsSW5kaWNhdG9yKCk7bmV3IEluc3BlY3Rvck1haW4uQmFja2VuZFNldHRpbmdzU3luYygpO25ldyBNb2JpbGVUaHJvdHRsaW5nLk5ldHdvcmtQYW5lbEluZGljYXRvcigpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLlJlbG9hZEluc3BlY3RlZFBhZ2UsZXZlbnQ9Pntjb25zdCBoYXJkPShldmVudC5kYXRhKTtTREsuUmVzb3VyY2VUcmVlTW9kZWwucmVsb2FkQWxsUGFnZXMoaGFyZCk7fSk7fQpfY29ubmVjdEFuZENyZWF0ZU1haW5UYXJnZXQoKXtjb25zdCBpc05vZGVKUz0hIVJ1bnRpbWUucXVlcnlQYXJhbSgndjhvbmx5Jyk7Y29uc3QgdGFyZ2V0PVNESy50YXJnZXRNYW5hZ2VyLmNyZWF0ZVRhcmdldCgnbWFpbicsQ29tbW9uLlVJU3RyaW5nKCdNYWluJyksdGhpcy5fY2FwYWJpbGl0aWVzRm9yTWFpblRhcmdldCgpLHRoaXMuX2NyZWF0ZU1haW5Db25uZWN0aW9uLmJpbmQodGhpcyksbnVsbCxpc05vZGVKUyk7dGFyZ2V0LnJ1bnRpbWVBZ2VudCgpLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7fQpfY2FwYWJpbGl0aWVzRm9yTWFpblRhcmdldCgpe2lmKFJ1bnRpbWUucXVlcnlQYXJhbSgndjhvbmx5JykpCnJldHVybiBTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSlM7cmV0dXJuIFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET018U0RLLlRhcmdldC5DYXBhYmlsaXR5LkRldmljZUVtdWxhdGlvbnxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRW11bGF0aW9ufFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5JbnB1dHxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSlN8U0RLLlRhcmdldC5DYXBhYmlsaXR5LkxvZ3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTmV0d29ya3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuU2NyZWVuQ2FwdHVyZXxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuU2VjdXJpdHl8U0RLLlRhcmdldC5DYXBhYmlsaXR5LlRhcmdldHxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVHJhY2luZ3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSW5zcGVjdG9yO30KX2NyZWF0ZU1haW5Db25uZWN0aW9uKHBhcmFtcyl7dGhpcy5fbWFpbkNvbm5lY3Rpb249U0RLLmNyZWF0ZU1haW5Db25uZWN0aW9uKHBhcmFtcywoKT0+Q29tcG9uZW50cy5UYXJnZXREZXRhY2hlZERpYWxvZy53ZWJTb2NrZXRDb25uZWN0aW9uTG9zdCgpKTtyZXR1cm4gdGhpcy5fbWFpbkNvbm5lY3Rpb247fQpfaW50ZXJjZXB0TWFpbkNvbm5lY3Rpb24ob25NZXNzYWdlKXtjb25zdCBwYXJhbXM9e29uTWVzc2FnZTpvbk1lc3NhZ2Usb25EaXNjb25uZWN0OnRoaXMuX2Nvbm5lY3RBbmRDcmVhdGVNYWluVGFyZ2V0LmJpbmQodGhpcyl9O3JldHVybiB0aGlzLl9tYWluQ29ubmVjdGlvbi5kaXNjb25uZWN0KCkudGhlbih0aGlzLl9jcmVhdGVNYWluQ29ubmVjdGlvbi5iaW5kKHRoaXMscGFyYW1zKSk7fX07SW5zcGVjdG9yTWFpbi5pbnRlcmNlcHRNYWluQ29ubmVjdGlvbj1mdW5jdGlvbihvbk1lc3NhZ2Upe3JldHVybiBzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoSW5zcGVjdG9yTWFpbi5JbnNwZWN0b3JNYWluKS5faW50ZXJjZXB0TWFpbkNvbm5lY3Rpb24ob25NZXNzYWdlKTt9O0luc3BlY3Rvck1haW4uUmVsb2FkQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdpbnNwZWN0b3JfbWFpbi5yZWxvYWQnOlNESy5SZXNvdXJjZVRyZWVNb2RlbC5yZWxvYWRBbGxQYWdlcyhmYWxzZSk7cmV0dXJuIHRydWU7Y2FzZSdpbnNwZWN0b3JfbWFpbi5oYXJkLXJlbG9hZCc6U0RLLlJlc291cmNlVHJlZU1vZGVsLnJlbG9hZEFsbFBhZ2VzKHRydWUpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319O0luc3BlY3Rvck1haW4uRm9jdXNEZWJ1Z2dlZUFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkucGFnZUFnZW50KCkuYnJpbmdUb0Zyb250KCk7cmV0dXJuIHRydWU7fX07SW5zcGVjdG9yTWFpbi5Ob2RlSW5kaWNhdG9yPWNsYXNze2NvbnN0cnVjdG9yKCl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtjb25zdCBzaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyhlbGVtZW50LCdpbnNwZWN0b3JfbWFpbi9ub2RlSWNvbi5jc3MnKTt0aGlzLl9lbGVtZW50PXNoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ25vZGUtaWNvbicpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Qub3Blbk5vZGVGcm9udGVuZCgpLGZhbHNlKTt0aGlzLl9idXR0b249bmV3IFVJLlRvb2xiYXJJdGVtKGVsZW1lbnQpO3RoaXMuX2J1dHRvbi5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ09wZW4gZGVkaWNhdGVkIERldlRvb2xzIGZvciBOb2RlLmpzJykpO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLkF2YWlsYWJsZVRhcmdldHNDaGFuZ2VkLGV2ZW50PT50aGlzLl91cGRhdGUoKGV2ZW50LmRhdGEpKSk7dGhpcy5fYnV0dG9uLnNldFZpc2libGUoZmFsc2UpO3RoaXMuX3VwZGF0ZShbXSk7fQpfdXBkYXRlKHRhcmdldEluZm9zKXtjb25zdCBoYXNOb2RlPSEhdGFyZ2V0SW5mb3MuZmluZCh0YXJnZXQ9PnRhcmdldC50eXBlPT09J25vZGUnJiYhdGFyZ2V0LmF0dGFjaGVkKTt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2luYWN0aXZlJywhaGFzTm9kZSk7aWYoaGFzTm9kZSkKdGhpcy5fYnV0dG9uLnNldFZpc2libGUodHJ1ZSk7fQppdGVtKCl7cmV0dXJuIHRoaXMuX2J1dHRvbjt9fTtJbnNwZWN0b3JNYWluLlNvdXJjZXNQYW5lbEluZGljYXRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdqYXZhU2NyaXB0RGlzYWJsZWQnKS5hZGRDaGFuZ2VMaXN0ZW5lcihqYXZhU2NyaXB0RGlzYWJsZWRDaGFuZ2VkKTtqYXZhU2NyaXB0RGlzYWJsZWRDaGFuZ2VkKCk7ZnVuY3Rpb24gamF2YVNjcmlwdERpc2FibGVkQ2hhbmdlZCgpe2xldCBpY29uPW51bGw7Y29uc3QgamF2YVNjcmlwdERpc2FibGVkPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdqYXZhU2NyaXB0RGlzYWJsZWQnKS5nZXQoKTtpZihqYXZhU2NyaXB0RGlzYWJsZWQpe2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0phdmFTY3JpcHQgaXMgZGlzYWJsZWQnKTt9ClVJLmluc3BlY3RvclZpZXcuc2V0UGFuZWxJY29uKCdzb3VyY2VzJyxpY29uKTt9fX07SW5zcGVjdG9yTWFpbi5JbnNwZWN0ZWROb2RlUmV2ZWFsZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5PdmVybGF5TW9kZWwsU0RLLk92ZXJsYXlNb2RlbC5FdmVudHMuSW5zcGVjdE5vZGVSZXF1ZXN0ZWQsdGhpcy5faW5zcGVjdE5vZGUsdGhpcyk7fQpfaW5zcGVjdE5vZGUoZXZlbnQpe2NvbnN0IGRlZmVycmVkTm9kZT0oZXZlbnQuZGF0YSk7Q29tbW9uLlJldmVhbGVyLnJldmVhbChkZWZlcnJlZE5vZGUpO319O0luc3BlY3Rvck1haW4uQmFja2VuZFNldHRpbmdzU3luYz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2F1dG9BdHRhY2hTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdhdXRvQXR0YWNoVG9DcmVhdGVkUGFnZXMnKTt0aGlzLl9hdXRvQXR0YWNoU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGVBdXRvQXR0YWNoLHRoaXMpO3RoaXMuX3VwZGF0ZUF1dG9BdHRhY2goKTt0aGlzLl9hZEJsb2NrRW5hYmxlZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ25ldHdvcmsuYWRCbG9ja2luZ0VuYWJsZWQnKTt0aGlzLl9hZEJsb2NrRW5hYmxlZFNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVUYXJnZXRzKHRoaXMsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkJyb3dzZXIpO30KX3VwZGF0ZVRhcmdldCh0YXJnZXQpe2lmKCF0YXJnZXQucGFyZW50VGFyZ2V0KCkpCnRhcmdldC5wYWdlQWdlbnQoKS5zZXRBZEJsb2NraW5nRW5hYmxlZCh0aGlzLl9hZEJsb2NrRW5hYmxlZFNldHRpbmcuZ2V0KCkpO30KX3VwZGF0ZUF1dG9BdHRhY2goKXtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0T3Blbk5ld1dpbmRvd0ZvclBvcHVwcyh0aGlzLl9hdXRvQXR0YWNoU2V0dGluZy5nZXQoKSk7fQpfdXBkYXRlKCl7U0RLLnRhcmdldE1hbmFnZXIudGFyZ2V0cyhTREsuVGFyZ2V0LkNhcGFiaWxpdHkuQnJvd3NlcikuZm9yRWFjaCh0aGlzLl91cGRhdGVUYXJnZXQsdGhpcyk7fQp0YXJnZXRBZGRlZCh0YXJnZXQpe3RoaXMuX3VwZGF0ZVRhcmdldCh0YXJnZXQpO30KdGFyZ2V0UmVtb3ZlZCh0YXJnZXQpe319O1NESy5DaGlsZFRhcmdldE1hbmFnZXIuaW5zdGFsbCgpOzs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImJyb3dzZXJfY29tcG9uZW50cy9pbWFnZVByZXZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmltYWdlLXByZXZpZXctY29udGFpbmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbi5pbWFnZS1wcmV2aWV3LWNvbnRhaW5lciBpbWcge1xuICAgIG1hcmdpbjogMnB4IGF1dG87XG4gICAgbWF4LXdpZHRoOiAxMDBweDtcbiAgICBtYXgtaGVpZ2h0OiAxMDBweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2NoZWNrZXIucG5nKTtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIC13ZWJraXQtdXNlci1kcmFnOiBhdXRvO1xufVxuXG4uaW1hZ2UtY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4vKiMgc291cmNlVVJMPWJyb3dzZXJfY29tcG9uZW50cy9pbWFnZVByZXZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibW9iaWxlX3Rocm90dGxpbmcvdGhyb3R0bGluZ1NldHRpbmdzVGFiLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBvdmVyZmxvdzpoaWRkZW47XG59XG5cbi5oZWFkZXIge1xuICAgIHBhZGRpbmc6IDAgMCA2cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFRUVFRUU7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmFkZC1jb25kaXRpb25zLWJ1dHRvbiB7XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXJnaW46IDEwcHggMnB4O1xuICAgIG1pbi13aWR0aDogMTQwcHg7XG4gICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbn1cblxuLmNvbmRpdGlvbnMtbGlzdCB7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbiAgICBtaW4td2lkdGg6IDM0MHB4O1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5jb25kaXRpb25zLWxpc3QtaXRlbSB7XG4gICAgcGFkZGluZzogM3B4IDVweCAzcHggNXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGZsZXg6IGF1dG8gMSAxO1xufVxuXG4uY29uZGl0aW9ucy1saXN0LXRleHQge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZmxleDogMCAwIDcwcHg7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBjb2xvcjogIzIyMjtcbiAgICB0ZXh0LWFsaWduOiBlbmQ7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uY29uZGl0aW9ucy1saXN0LXRpdGxlIHtcbiAgICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG59XG5cbi5jb25kaXRpb25zLWxpc3QtdGl0bGUtdGV4dCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5jb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yIHtcbiAgICBmbGV4OiAwIDAgMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzEsIDIzMSwgMjMxKTtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luOiAwIDRweDtcbn1cblxuLmNvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3ItaW52aXNpYmxlIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5jb25kaXRpb25zLWVkaXQtcm93IHtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDZweCA1cHg7XG59XG5cbi5jb25kaXRpb25zLWVkaXQtcm93IGlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxuXG4uY29uZGl0aW9ucy1lZGl0LW9wdGlvbmFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAtMjBweDtcbiAgICByaWdodDogMDtcbiAgICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpO1xufVxuXG4vKiMgc291cmNlVVJMPW1vYmlsZV90aHJvdHRsaW5nL3Rocm90dGxpbmdTZXR0aW5nc1RhYi5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJlbXVsYXRpb24vZGV2aWNlc1NldHRpbmdzVGFiLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5kZXZpY2VzLXNldHRpbmdzLXRhYiAuc2V0dGluZ3MtdGFiLnNldHRpbmdzLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4uZGV2aWNlcy1zZXR0aW5ncy10YWIgLmRldmljZXMtdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTIwJTtcbiAgICBjb2xvcjogIzIyMjtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uZGV2aWNlcy1zZXR0aW5ncy10YWIgLmRldmljZXMtYnV0dG9uLXJvdyB7XG4gICAgZmxleDogbm9uZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4uZGV2aWNlcy1zZXR0aW5ncy10YWIgLmRldmljZXMtYnV0dG9uLXJvdyBidXR0b24ge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICBtaW4td2lkdGg6IDEyMHB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5kZXZpY2VzLXNldHRpbmdzLXRhYiAuZGV2aWNlcy1saXN0IHtcbiAgICB3aWR0aDogMzUwcHg7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLmRldmljZXMtbGlzdC1pdGVtIHtcbiAgICBwYWRkaW5nOiAzcHggNXB4IDNweCA1cHg7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4OiBhdXRvIDEgMTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kZXZpY2VzLWxpc3QtY2hlY2tib3gge1xuICAgIGhlaWdodDogMTJweDtcbiAgICB3aWR0aDogMTJweDtcbiAgICBtYXJnaW46IDNweCA1cHggMnB4IDJweDtcbiAgICBmbGV4OiBub25lO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uZGV2aWNlcy1saXN0LWNoZWNrYm94OmZvY3VzIHtcbiAgICBvdXRsaW5lOiBhdXRvIDVweCAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG59XG5cbi5kZXZpY2VzLWxpc3QtdGl0bGUge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmbGV4OiBhdXRvO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgY29sb3I6ICMyMjI7XG59XG5cbi5kZXZpY2VzLWVkaXQtZmllbGRzIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5kZXZpY2VzLWVkaXQtZmllbGRzIGlucHV0IHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIG1hcmdpbjogOHB4IDVweCAwIDVweDtcbn1cblxuLmRldmljZXMtZWRpdC1maWVsZHMgLmRldmljZS1lZGl0LWZpeGVkIHtcbiAgICBmbGV4OiAwIDAgMTQwcHg7XG59XG5cbi5kZXZpY2VzLWVkaXQtZmllbGRzIHNlbGVjdCB7XG4gICAgbWFyZ2luOiA4cHggNXB4IDAgNXB4O1xufVxuXG4vKiMgc291cmNlVVJMPWVtdWxhdGlvbi9kZXZpY2VzU2V0dGluZ3NUYWIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZW11bGF0aW9uL2RldmljZU1vZGVUb29sYmFyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5kZXZpY2UtbW9kZS1zaXplLWlucHV0IHtcbiAgICB3aWR0aDogNDFweDtcbiAgICBtYXgtaGVpZ2h0OiAxOHB4O1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uZGV2aWNlLW1vZGUtc2l6ZS1pbnB1dDpmb2N1czo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4uZGV2aWNlLW1vZGUtc2l6ZS1pbnB1dDpkaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBvcGFjaXR5OiAwLjY7XG59XG5cbi5kZXZpY2UtbW9kZS14IHtcbiAgICBtYXJnaW46IDAgMXB4O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbn1cblxuLmRldmljZS1tb2RlLWVtcHR5LXRvb2xiYXItZWxlbWVudCB7XG4gICAgd2lkdGg6IDA7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZW11bGF0aW9uL2RldmljZU1vZGVUb29sYmFyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVtdWxhdGlvbi9kZXZpY2VNb2RlVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAwJSwgOTglKTtcbn1cblxuLmRldmljZS1tb2RlLXRvb2xiYXIge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA5OCUpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cblxuLmRldmljZS1tb2RlLXRvb2xiYXIgLnRvb2xiYXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleDogMCAxMDAwMDAgYXV0bztcbiAgICBwYWRkaW5nOiAwIDVweDtcbn1cblxuLmRldmljZS1tb2RlLXRvb2xiYXIgLnRvb2xiYXIuZGV2aWNlLW1vZGUtdG9vbGJhci1maXhlZC1zaXplIHtcbiAgICBmbGV4OiAwIDEgYXV0bztcbn1cblxuLmRldmljZS1tb2RlLXRvb2xiYXItb3B0aW9ucy50b29sYmFyIHtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIHJpZ2h0OiAwO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5kZXZpY2UtbW9kZS10b29sYmFyLXNwYWNlciB7XG4gICAgZmxleDogMSAxIDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kZXZpY2UtbW9kZS1jb250ZW50LWNsaXAge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleDogYXV0bztcbn1cblxuLmRldmljZS1tb2RlLW1lZGlhLWNvbnRhaW5lciB7XG4gICAgZmxleDogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAjY2NjO1xufVxuXG4uZGV2aWNlLW1vZGUtY29udGVudC1jbGlwOm5vdCguZGV2aWNlLW1vZGUtb3V0bGluZS12aXNpYmxlKSAuZGV2aWNlLW1vZGUtbWVkaWEtY29udGFpbmVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4uZGV2aWNlLW1vZGUtcHJlc2V0cy1jb250YWluZXIge1xuICAgIGZsZXg6IDAgMCAyMHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5kZXZpY2UtbW9kZS1wcmVzZXRzLWNvbnRhaW5lci1pbm5lciB7XG4gICAgZmxleDogYXV0bztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA5MCUpO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIGhzbCgwLCAwJSwgOTglKTtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgaHNsKDAsIDAlLCA5OCUpO1xuIH1cblxuLmRldmljZS1tb2RlLXByZXNldHMtY29udGFpbmVyOmhvdmVyIHtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXM7XG4gICAgdHJhbnNpdGlvbi1kZWxheTogNTBtcztcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uZGV2aWNlLW1vZGUtcHJlc2V0LWJhci1vdXRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLmRldmljZS1tb2RlLXByZXNldC1iYXIge1xuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgaHNsKDAsIDAlLCA5OCUpO1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGhzbCgwLCAwJSwgOTglKTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZmxleDogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICM1QTVBNUE7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgbWFyZ2luLWJvdHRvbTogMXB4O1xufVxuXG4uZGV2aWNlLW1vZGUtcHJlc2V0LWJhcjpob3ZlciB7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjFzO1xuICAgIHRyYW5zaXRpb24tZGVsYXk6IDUwbXM7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Q2ZDZkNjtcbn1cblxuLmRldmljZS1tb2RlLXByZXNldC1iYXIgPiBzcGFuIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi5kZXZpY2UtbW9kZS1wcmVzZXQtYmFyOmhvdmVyID4gc3BhbiB7XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzO1xuICAgIHRyYW5zaXRpb24tZGVsYXk6IDUwbXM7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbn1cblxuLmRldmljZS1tb2RlLWNvbnRlbnQtYXJlYSB7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4uZGV2aWNlLW1vZGUtc2NyZWVuLWFyZWEge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTcxNzE3O1xufVxuXG4uZGV2aWNlLW1vZGUtY29udGVudC1jbGlwOm5vdCguZGV2aWNlLW1vZGUtb3V0bGluZS12aXNpYmxlKSAuZGV2aWNlLW1vZGUtc2NyZWVuLWFyZWEge1xuICAgIGJveC1zaGFkb3c6IGhzbCgyNDAsIDMlLCA4NCUpIDAgMCAwIDAuNXB4LCBoc2xhKDAsIDAlLCA4MCUsIDAuNCkgMCAwIDIwcHg7XG59XG5cbi5kZXZpY2UtbW9kZS1zY3JlZW4taW1hZ2Uge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5kZXZpY2UtbW9kZS1yZXNpemVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjFzIGVhc2UsIG9wYWNpdHkgMC4xcyBlYXNlO1xufVxuXG4uZGV2aWNlLW1vZGUtcmVzaXplcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLCAwJSwgMCUsIDAuMSk7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLmRldmljZS1tb2RlLXJlc2l6ZXIgPiBkaXYge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uZGV2aWNlLW1vZGUtcmlnaHQtcmVzaXplciB7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogLTFweDtcbiAgICByaWdodDogLTIwcHg7XG4gICAgd2lkdGg6IDIwcHg7XG59XG5cbi5kZXZpY2UtbW9kZS1sZWZ0LXJlc2l6ZXIge1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IC0xcHg7XG4gICAgbGVmdDogLTIwcHg7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgb3BhY2l0eTogMDtcbn1cblxuLmRldmljZS1tb2RlLWJvdHRvbS1yZXNpemVyIHtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAtMXB4O1xuICAgIGJvdHRvbTogLTIwcHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xufVxuXG4uZGV2aWNlLW1vZGUtYm90dG9tLXJpZ2h0LXJlc2l6ZXIge1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAtMjBweDtcbiAgICBib3R0b206IC0yMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDAlLCAwLjAyKTtcbn1cblxuLmRldmljZS1tb2RlLWJvdHRvbS1sZWZ0LXJlc2l6ZXIge1xuICAgIGxlZnQ6IC0yMHB4O1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IC0yMHB4O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5kZXZpY2UtbW9kZS1yaWdodC1yZXNpemVyID4gZGl2IHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc2l6ZUhvcml6b250YWwucG5nKTtcbiAgICB3aWR0aDogNnB4O1xuICAgIGhlaWdodDogMjZweDtcbn1cblxuLmRldmljZS1tb2RlLWxlZnQtcmVzaXplciA+IGRpdiB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNpemVIb3Jpem9udGFsLnBuZyk7XG4gICAgd2lkdGg6IDZweDtcbiAgICBoZWlnaHQ6IDI2cHg7XG59XG5cbi5kZXZpY2UtbW9kZS1ib3R0b20tcmVzaXplciA+IGRpdiB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNpemVWZXJ0aWNhbC5wbmcpO1xuICAgIG1hcmdpbi1ib3R0b206IC0ycHg7XG4gICAgd2lkdGg6IDI2cHg7XG4gICAgaGVpZ2h0OiA2cHg7XG59XG5cbi5kZXZpY2UtbW9kZS1ib3R0b20tcmlnaHQtcmVzaXplciA+IGRpdiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogM3B4O1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgd2lkdGg6IDEzcHg7XG4gICAgaGVpZ2h0OiAxM3B4O1xuICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzaXplRGlhZ29uYWwucG5nKTtcbn1cblxuLmRldmljZS1tb2RlLWJvdHRvbS1sZWZ0LXJlc2l6ZXIgPiBkaXYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDNweDtcbiAgICBsZWZ0OiAzcHg7XG4gICAgd2lkdGg6IDEzcHg7XG4gICAgaGVpZ2h0OiAxM3B4O1xuICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzaXplRGlhZ29uYWwucG5nKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbiAgICAuZGV2aWNlLW1vZGUtcmlnaHQtcmVzaXplciA+IGRpdiB7XG4gICAgICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzaXplSG9yaXpvbnRhbF8yeC5wbmcpO1xuICAgIH1cblxuICAgIC5kZXZpY2UtbW9kZS1sZWZ0LXJlc2l6ZXIgPiBkaXYge1xuICAgICAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc2l6ZUhvcml6b250YWxfMngucG5nKTtcbiAgICB9XG5cbiAgICAuZGV2aWNlLW1vZGUtYm90dG9tLXJlc2l6ZXIgPiBkaXYge1xuICAgICAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc2l6ZVZlcnRpY2FsXzJ4LnBuZyk7XG4gICAgfVxuXG4gICAgLmRldmljZS1tb2RlLWJvdHRvbS1yaWdodC1yZXNpemVyID4gZGl2IHtcbiAgICAgICAgY29udGVudDogdXJsKEltYWdlcy9yZXNpemVEaWFnb25hbF8yeC5wbmcpO1xuICAgIH1cblxuICAgIC5kZXZpY2UtbW9kZS1ib3R0b20tbGVmdC1yZXNpemVyID4gZGl2IHtcbiAgICAgICAgY29udGVudDogdXJsKEltYWdlcy9yZXNpemVEaWFnb25hbF8yeC5wbmcpO1xuICAgIH1cbn0gLyogbWVkaWEgKi9cblxuLmRldmljZS1tb2RlLXBhZ2UtYXJlYSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNmYztcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci10b3Age1xuICAgIGhlaWdodDogMjBweDtcbiAgICByaWdodDogMDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLWxlZnQge1xuICAgIHdpZHRoOiAyMHB4O1xuICAgIGJvdHRvbTogMDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLWNvbnRlbnQge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtMjBweDtcbiAgICB0b3A6IC0yMHB4O1xufVxuXG4uZGV2aWNlLW1vZGUtcnVsZXItdG9wIC5kZXZpY2UtbW9kZS1ydWxlci1jb250ZW50IHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAyMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDk4JSwgMC45KTtcbn1cblxuLmRldmljZS1tb2RlLWNvbnRlbnQtY2xpcC5kZXZpY2UtbW9kZS1vdXRsaW5lLXZpc2libGUgLmRldmljZS1tb2RlLXJ1bGVyLXRvcCAuZGV2aWNlLW1vZGUtcnVsZXItY29udGVudCB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGhzbCgwLCAwJSwgNTAlKTtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLWxlZnQgLmRldmljZS1tb2RlLXJ1bGVyLWNvbnRlbnQge1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHJpZ2h0OiAyMHB4O1xuICAgIGJvdHRvbTogMDtcbn1cblxuLmRldmljZS1tb2RlLWNvbnRlbnQtY2xpcC5kZXZpY2UtbW9kZS1vdXRsaW5lLXZpc2libGUgLmRldmljZS1tb2RlLXJ1bGVyLWxlZnQgLmRldmljZS1tb2RlLXJ1bGVyLWNvbnRlbnQge1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgaHNsKDAsIDAlLCA1MCUpO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBoc2woMCwgMCUsIDUwJSk7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci1pbm5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uZGV2aWNlLW1vZGUtcnVsZXItdG9wIC5kZXZpY2UtbW9kZS1ydWxlci1pbm5lciB7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAyMHB4O1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBoc2woMCwgMCUsIDUwJSk7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci1sZWZ0IC5kZXZpY2UtbW9kZS1ydWxlci1pbm5lciB7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDE5cHg7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGhzbCgwLCAwJSwgNTAlKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDAsIDAlLCA5OCUsIDAuOSk7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci1tYXJrZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLXRvcCAuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyIHtcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDVweDtcbiAgICBib3R0b206IDA7XG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgaHNsKDAsIDAlLCA1MCUpO1xuICAgIG1hcmdpbi1yaWdodDogLTFweDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLXRvcCAuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyLmRldmljZS1tb2RlLXJ1bGVyLW1hcmtlci1tZWRpdW0ge1xuICAgIGhlaWdodDogMTBweDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLXRvcCAuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyLmRldmljZS1tb2RlLXJ1bGVyLW1hcmtlci1sYXJnZSB7XG4gICAgaGVpZ2h0OiAxNXB4O1xufVxuXG4uZGV2aWNlLW1vZGUtcnVsZXItbGVmdCAuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyIHtcbiAgICBoZWlnaHQ6IDA7XG4gICAgd2lkdGg6IDVweDtcbiAgICByaWdodDogMDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgaHNsKDAsIDAlLCA1MCUpO1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci1sZWZ0IC5kZXZpY2UtbW9kZS1ydWxlci1tYXJrZXIuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyLW1lZGl1bSB7XG4gICAgd2lkdGg6IDEwcHg7XG59XG5cbi5kZXZpY2UtbW9kZS1ydWxlci1sZWZ0IC5kZXZpY2UtbW9kZS1ydWxlci1tYXJrZXIuZGV2aWNlLW1vZGUtcnVsZXItbWFya2VyLWxhcmdlIHtcbiAgICB3aWR0aDogMTVweDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLXRleHQge1xuICAgIGNvbG9yOiBoc2woMCwgMCUsIDUwJSk7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uZGV2aWNlLW1vZGUtcnVsZXItdGV4dDpob3ZlciB7XG4gICAgY29sb3I6IGhzbCgwLCAwJSwgMTAlKTtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLXRvcCAuZGV2aWNlLW1vZGUtcnVsZXItdGV4dCB7XG4gICAgbGVmdDogMnB4O1xuICAgIHRvcDogLTJweDtcbn1cblxuLmRldmljZS1tb2RlLXJ1bGVyLWxlZnQgLmRldmljZS1tb2RlLXJ1bGVyLXRleHQge1xuICAgIGxlZnQ6IC00cHg7XG4gICAgdG9wOiAtMTVweDtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xufVxuXG4vKiMgc291cmNlVVJMPWVtdWxhdGlvbi9kZXZpY2VNb2RlVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJlbXVsYXRpb24vaW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLyojIHNvdXJjZVVSTD1lbXVsYXRpb24vaW5zcGVjdGVkUGFnZVBsYWNlaG9sZGVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVtdWxhdGlvbi9tZWRpYVF1ZXJ5SW5zcGVjdG9yLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi8qIE1lZGlhIHF1ZXJ5IGJhcnMgKi9cblxuLm1lZGlhLWluc3BlY3Rvci12aWV3IHtcbiAgICBoZWlnaHQ6IDUwcHg7XG59XG5cbi5tZWRpYS1pbnNwZWN0b3ItbWFya2VyLWNvbnRhaW5lciB7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIG1hcmdpbjogMnB4IDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLWJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG59XG5cbi5tZWRpYS1pbnNwZWN0b3ItbWFya2VyIHtcbiAgICBmbGV4OiBub25lO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIG1hcmdpbjogMXB4IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB6LWluZGV4OiBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItc3BhY2VyIHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlcjpob3ZlciB7XG4gICAgbWFyZ2luOiAtMXB4IDA7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWF4LXdpZHRoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjA3LCA5MCUsIDc3JSk7XG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgaHNsKDIwNywgOTAlLCA2MSUpO1xuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgaHNsKDIwNywgOTAlLCA2MSUpO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1pbmFjdGl2ZSAubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1tYXgtd2lkdGg6bm90KDpob3Zlcikge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgxOTksIDk0JSwgOTQlKTtcbn1cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItbWluLW1heC13aWR0aCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDg4LCA1MCUsIDc2JSk7XG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjNjg5RjM4O1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGhzbCg5MiwgNDglLCA0MiUpO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1pbmFjdGl2ZSAubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1taW4tbWF4LXdpZHRoOm5vdCg6aG92ZXIpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMTI1LCAzOSUsIDk0JSk7XG59XG5cbi5tZWRpYS1pbnNwZWN0b3ItbWFya2VyLW1pbi1tYXgtd2lkdGg6aG92ZXIge1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi5tZWRpYS1pbnNwZWN0b3ItbWFya2VyLW1pbi13aWR0aCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDM2LCAxMDAlLCA3NSUpO1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5tZWRpYS1pbnNwZWN0b3ItbWFya2VyLWluYWN0aXZlIC5tZWRpYS1pbnNwZWN0b3ItbWFya2VyLW1pbi13aWR0aDpub3QoOmhvdmVyKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDM3LCAxMDAlLCA5NCUpO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1taW4td2lkdGgtcmlnaHQge1xuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgaHNsKDMwLCAxMDAlLCA0OCUpO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1taW4td2lkdGgtbGVmdCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgaHNsKDMwLCAxMDAlLCA0OCUpO1xufVxuXG4vKiBNZWRpYSBxdWVyeSBsYWJlbHMgKi9cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXI6bm90KDpob3ZlcikgLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItbGFiZWwtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1sYWJlbC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLW1hcmtlci1sYWJlbC1jb250YWluZXItbGVmdCB7XG4gICAgbGVmdDogLTJweDtcbn1cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItbGFiZWwtY29udGFpbmVyLXJpZ2h0IHtcbiAgICByaWdodDogLTJweDtcbn1cblxuLm1lZGlhLWluc3BlY3Rvci1tYXJrZXItbGFiZWwge1xuICAgIGNvbG9yOiAjMjIyO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDFweDtcbiAgICBib3R0b206IDA7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLWxhYmVsLXJpZ2h0IHtcbiAgICByaWdodDogNHB4O1xufVxuXG4ubWVkaWEtaW5zcGVjdG9yLWxhYmVsLWxlZnQge1xuICAgIGxlZnQ6IDRweDtcbn1cblxuLyojIHNvdXJjZVVSTD1lbXVsYXRpb24vbWVkaWFRdWVyeUluc3BlY3Rvci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJlbXVsYXRpb24vc2Vuc29ycy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNlbnNvcnMtdmlldyB7XG4gICAgcGFkZGluZzogMTJweDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnNlbnNvcnMtdmlldyBsYWJlbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLnNlbnNvcnMtdmlldyBpbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiAxMDBweDtcbiAgICBtYXJnaW46IC01cHggMTBweCAwcHggMHB4O1xuICAgIHRleHQtYWxpZ246IGVuZDtcbn1cblxuLnNlbnNvcnMtdmlldyBpbnB1dFtyZWFkb25seV0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzUsIDIzNSwgMjI4KTtcbn1cblxuLnNlbnNvcnMtdmlldyBmaWVsZHNldCB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIHBhZGRpbmc6IDEwcHggMHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLnNlbnNvcnMtdmlldyBmaWVsZHNldFtkaXNhYmxlZF0ge1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLnNlbnNvcnMtdmlldyAuZmllbGQtZXJyb3ItbWVzc2FnZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnNlbnNvcnMtdmlldyBpbnB1dDpmb2N1czo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG59XG5cbi5zZW5zb3JzLXZpZXcgLmNocm9tZS1zZWxlY3Qge1xuICAgIHdpZHRoOiAyMDBweDtcbn1cblxuLnNlbnNvcnMtZ3JvdXAtdGl0bGUge1xuICAgIHdpZHRoOiA4MHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xufVxuXG4uc2Vuc29ycy1ncm91cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLmdlby1maWVsZHMge1xuICAgIGZsZXg6IDIgMCAyMDBweDtcbn1cblxuLmxhdGxvbmctZ3JvdXAge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLmxhdGxvbmctdGl0bGUge1xuICAgIHdpZHRoOiA3MHB4O1xufVxuXG4vKiBEZXZpY2UgT3JpZW50YXRpb24gKi9cblxuLm9yaWVudGF0aW9uLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuXG4ub3JpZW50YXRpb24tZmllbGRzIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbi5vcmllbnRhdGlvbi1zdGFnZSB7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogNzAwcHg7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW46IDUwJSA1MCU7XG4gICAgd2lkdGg6IDE2MHB4O1xuICAgIGhlaWdodDogMTUwcHg7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNFMUY1RkUgMCUsICNFMUY1RkUgNjQlLCAjYjBFYmYzIDY0JSwgI0RFRjZGOSAxMDAlKTtcbiAgICB0cmFuc2l0aW9uOiAwLjJzIGVhc2Ugb3BhY2l0eSwgMC4ycyBlYXNlIC13ZWJraXQtZmlsdGVyO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLm9yaWVudGF0aW9uLXN0YWdlLmRpc2FibGVkIHtcbiAgICAtd2Via2l0LWZpbHRlcjogZ3JheXNjYWxlKCk7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xufVxuXG4ub3JpZW50YXRpb24tZWxlbWVudCxcbi5vcmllbnRhdGlvbi1lbGVtZW50OjpiZWZvcmUsXG4ub3JpZW50YXRpb24tZWxlbWVudDo6YWZ0ZXJcbntcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIGJhY2tncm91bmQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLm9yaWVudGF0aW9uLWJveCB7XG4gICAgd2lkdGg6IDY2cHg7XG4gICAgaGVpZ2h0OiAxMjJweDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpO1xufVxuXG4ub3JpZW50YXRpb24tYm94LmlzLWFuaW1hdGluZywgLmlzLWFuaW1hdGluZyAub3JpZW50YXRpb24tbGF5ZXIge1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAzMDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIDBtcztcbn1cblxuLm9yaWVudGF0aW9uLWxheWVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbn1cblxuLm9yaWVudGF0aW9uLWZyb250LFxuLm9yaWVudGF0aW9uLWJhY2tcbntcbiAgICB3aWR0aDogNjZweDtcbiAgICBoZWlnaHQ6IDEyMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbn1cblxuLm9yaWVudGF0aW9uLWZyb250IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2FjY2VsZXJvbWV0ZXItZnJvbnQucG5nKTtcbn1cblxuLm9yaWVudGF0aW9uLWJhY2sge1xuICAgIHRyYW5zZm9ybTogcm90YXRlWSgxODBkZWcpIHRyYW5zbGF0ZVooMTJweCk7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9hY2NlbGVyb21ldGVyLWJhY2sucG5nKTtcbn1cblxuXG4ub3JpZW50YXRpb24tbGVmdCxcbi5vcmllbnRhdGlvbi1yaWdodCB7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMDZweDtcbiAgICB0b3A6IDhweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xufVxuXG4ub3JpZW50YXRpb24tbGVmdCB7XG4gICAgbGVmdDogLTEycHg7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyO1xuICAgIHRyYW5zZm9ybTogcm90YXRlWSgtOTBkZWcpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvYWNjZWxlcm9tZXRlci1sZWZ0LnBuZyk7XG59XG5cblxuLm9yaWVudGF0aW9uLXJpZ2h0IHtcbiAgICByaWdodDogLTEycHg7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7XG4gICAgdHJhbnNmb3JtOiByb3RhdGVZKDkwZGVnKTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2FjY2VsZXJvbWV0ZXItcmlnaHQucG5nKTtcbn1cblxuLm9yaWVudGF0aW9uLWxlZnQ6OmJlZm9yZSxcbi5vcmllbnRhdGlvbi1sZWZ0OjphZnRlcixcbi5vcmllbnRhdGlvbi1yaWdodDo6YmVmb3JlLFxuLm9yaWVudGF0aW9uLXJpZ2h0OjphZnRlclxue1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAxMnB4O1xuICAgIGhlaWdodDogNnB4O1xufVxuXG4ub3JpZW50YXRpb24tbGVmdDo6YmVmb3JlLFxuLm9yaWVudGF0aW9uLWxlZnQ6OmFmdGVyXG57XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9hY2NlbGVyb21ldGVyLWxlZnQucG5nKTtcbn1cblxuLm9yaWVudGF0aW9uLXJpZ2h0OjpiZWZvcmUsXG4ub3JpZW50YXRpb24tcmlnaHQ6OmFmdGVyXG57XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9hY2NlbGVyb21ldGVyLXJpZ2h0LnBuZyk7XG59XG5cbi5vcmllbnRhdGlvbi1sZWZ0OjpiZWZvcmUsXG4ub3JpZW50YXRpb24tcmlnaHQ6OmJlZm9yZSB7XG4gICAgdG9wOiAtNnB4O1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207XG4gICAgdHJhbnNmb3JtOiByb3RhdGVYKDI2ZGVnKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wO1xufVxuXG4ub3JpZW50YXRpb24tbGVmdDo6YWZ0ZXIsXG4ub3JpZW50YXRpb24tcmlnaHQ6OmFmdGVyIHtcbiAgICBib3R0b206IC02cHg7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIHRvcDtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoLTI1ZGVnKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgYm90dG9tO1xufVxuXG4ub3JpZW50YXRpb24tdG9wLFxuLm9yaWVudGF0aW9uLWJvdHRvbSB7XG4gICAgd2lkdGg6IDUwcHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGxlZnQ6IDhweDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xufVxuXG4ub3JpZW50YXRpb24tdG9wIHtcbiAgICB0b3A6IC0xMnB4O1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207XG4gICAgdHJhbnNmb3JtOiByb3RhdGVYKDkwZGVnKTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2FjY2VsZXJvbWV0ZXItdG9wLnBuZyk7XG59XG5cblxuLm9yaWVudGF0aW9uLWJvdHRvbSB7XG4gICAgYm90dG9tOiAtMTJweDtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgdG9wO1xuICAgIHRyYW5zZm9ybTogcm90YXRlWCgtOTBkZWcpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvYWNjZWxlcm9tZXRlci1ib3R0b20ucG5nKTtcbn1cblxuXG4ub3JpZW50YXRpb24tdG9wOjpiZWZvcmUsXG4ub3JpZW50YXRpb24tdG9wOjphZnRlcixcbi5vcmllbnRhdGlvbi1ib3R0b206OmJlZm9yZSxcbi5vcmllbnRhdGlvbi1ib3R0b206OmFmdGVyXG57XG4gICAgY29udGVudDogJyc7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDEycHg7XG59XG5cbi5vcmllbnRhdGlvbi10b3A6OmJlZm9yZSxcbi5vcmllbnRhdGlvbi10b3A6OmFmdGVyXG57XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9hY2NlbGVyb21ldGVyLXRvcC5wbmcpO1xufVxuXG4ub3JpZW50YXRpb24tYm90dG9tOjpiZWZvcmUsXG4ub3JpZW50YXRpb24tYm90dG9tOjphZnRlclxue1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvYWNjZWxlcm9tZXRlci1ib3R0b20ucG5nKTtcbn1cblxuLm9yaWVudGF0aW9uLXRvcDo6YmVmb3JlLFxuLm9yaWVudGF0aW9uLWJvdHRvbTo6YmVmb3JlIHtcbiAgICBsZWZ0OiAtNnB4O1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZVkoLTI2ZGVnKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlcjtcbn1cblxuLm9yaWVudGF0aW9uLXRvcDo6YWZ0ZXIsXG4ub3JpZW50YXRpb24tYm90dG9tOjphZnRlciB7XG4gICAgcmlnaHQ6IC02cHg7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7XG4gICAgdHJhbnNmb3JtOiByb3RhdGVZKDI2ZGVnKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCBjZW50ZXI7XG59XG5cbi5vcmllbnRhdGlvbi1heGlzLWlucHV0LWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cblxuLm9yaWVudGF0aW9uLWF4aXMtaW5wdXQtY29udGFpbmVyIGlucHV0IHtcbiAgICBtYXgtd2lkdGg6IDEwMHB4O1xufVxuXG4ub3JpZW50YXRpb24tcmVzZXQtYnV0dG9uIHtcbiAgICBtaW4td2lkdGg6IDgwcHg7XG59XG5cbmZpZWxkc2V0LmRldmljZS1vcmllbnRhdGlvbi1vdmVycmlkZS1zZWN0aW9uIHtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLnRvdWNoLWxhYmVsIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4udG91Y2gtbGFiZWwgc2VsZWN0IHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbn1cblxuLnBhbmVsLXNlY3Rpb24tc2VwYXJhdG9yIHtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIGJhY2tncm91bmQ6ICNmMWYxZjE7XG59XG5cbi5yZWxvYWQtd2FybmluZyB7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4vKiMgc291cmNlVVJMPWVtdWxhdGlvbi9zZW5zb3JzLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImluc3BlY3Rvcl9tYWluL25vZGVJY29uLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5ub2RlLWljb24ge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjZweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL25vZGVJY29uLnBuZyk7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxN3B4IDE3cHg7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgb3BhY2l0eTogMC44O1xufVxuXG4ubm9kZS1pY29uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxLjA7XG59XG5cbi5ub2RlLWljb24uaW5hY3RpdmUge1xuICAgIGZpbHRlcjogZ3JheXNjYWxlKDEwMCUpO1xufVxuXG4vKiMgc291cmNlVVJMPWluc3BlY3Rvcl9tYWluL25vZGVJY29uLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImluc3BlY3Rvcl9tYWluL3JlbmRlcmluZ09wdGlvbnMuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBwYWRkaW5nOiAxMnB4O1xuIH1cblxubGFiZWwge1xuICAgIG1hcmdpbjogMHB4IDBweCAxMHB4IDBweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4ubWVkaWEtcm93IHtcbiAgICBtYXJnaW4tbGVmdDogMjJweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4ubWVkaWEtcm93IHAge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi5wYW5lbC1zZWN0aW9uLXNlcGFyYXRvciB7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VVUkw9aW5zcGVjdG9yX21haW4vcmVuZGVyaW5nT3B0aW9ucy5jc3MgKi8iO2NvbnN0IGFsbERlc2NyaXB0b3JzPVtdO2xldCBhcHBsaWNhdGlvbkRlc2NyaXB0b3I7Y29uc3QgX2xvYWRlZFNjcmlwdHM9e307Zm9yKGNvbnN0IGsgb2ZbXSl7fQooZnVuY3Rpb24oKXtjb25zdCBiYXNlVXJsPXNlbGYubG9jYXRpb24/c2VsZi5sb2NhdGlvbi5vcmlnaW4rc2VsZi5sb2NhdGlvbi5wYXRobmFtZTonJztzZWxmLl9pbXBvcnRTY3JpcHRQYXRoUHJlZml4PWJhc2VVcmwuc3Vic3RyaW5nKDAsYmFzZVVybC5sYXN0SW5kZXhPZignLycpKzEpO30pKCk7Y29uc3QgUkVNT1RFX01PRFVMRV9GQUxMQkFDS19SRVZJU0lPTj0nQDAxMGRkY2ZkYTI0Njk3NWQxOTQ5NjRjY2YyMDAzOGViYmRlYzYwODQnO3ZhciBSdW50aW1lPWNsYXNze2NvbnN0cnVjdG9yKGRlc2NyaXB0b3JzKXt0aGlzLl9tb2R1bGVzPVtdO3RoaXMuX21vZHVsZXNNYXA9e307dGhpcy5fZXh0ZW5zaW9ucz1bXTt0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlcz17fTt0aGlzLl9kZXNjcmlwdG9yc01hcD17fTtmb3IobGV0IGk9MDtpPGRlc2NyaXB0b3JzLmxlbmd0aDsrK2kpCnRoaXMuX3JlZ2lzdGVyTW9kdWxlKGRlc2NyaXB0b3JzW2ldKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2soKTt9CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlKHVybCl7cmV0dXJuIG5ldyBQcm9taXNlKGxvYWQpO2Z1bmN0aW9uIGxvYWQoZnVsZmlsbCxyZWplY3Qpe2NvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIub3BlbignR0VUJyx1cmwsdHJ1ZSk7eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1vbnJlYWR5c3RhdGVjaGFuZ2U7ZnVuY3Rpb24gb25yZWFkeXN0YXRlY2hhbmdlKGUpe2lmKHhoci5yZWFkeVN0YXRlIT09WE1MSHR0cFJlcXVlc3QuRE9ORSkKcmV0dXJuO2NvbnN0IHN0YXR1cz0vXkhUVFBcLzEuMSA0MDQvLnRlc3QoZS50YXJnZXQucmVzcG9uc2UpPzQwNDp4aHIuc3RhdHVzO2lmKFswLDIwMCwzMDRdLmluZGV4T2Yoc3RhdHVzKT09PS0xKQpyZWplY3QobmV3IEVycm9yKCdXaGlsZSBsb2FkaW5nIGZyb20gdXJsICcrdXJsKycgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIG9mICcrc3RhdHVzKSk7ZWxzZQpmdWxmaWxsKGUudGFyZ2V0LnJlc3BvbnNlKTt9Cnhoci5zZW5kKG51bGwpO319CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHVybCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLmNhdGNoKGVycj0+e2NvbnN0IHVybFdpdGhGYWxsYmFja1ZlcnNpb249dXJsLnJlcGxhY2UoL0BbMC05YS1mXXs0MH0vLFJFTU9URV9NT0RVTEVfRkFMTEJBQ0tfUkVWSVNJT04pO2lmKHVybFdpdGhGYWxsYmFja1ZlcnNpb249PT11cmx8fCF1cmwuaW5jbHVkZXMoJ2F1ZGl0czJfd29ya2VyX21vZHVsZScpKQp0aHJvdyBlcnI7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmxXaXRoRmFsbGJhY2tWZXJzaW9uKTt9KTt9CnN0YXRpYyBub3JtYWxpemVQYXRoKHBhdGgpe2lmKHBhdGguaW5kZXhPZignLi4nKT09PS0xJiZwYXRoLmluZGV4T2YoJy4nKT09PS0xKQpyZXR1cm4gcGF0aDtjb25zdCBub3JtYWxpemVkU2VnbWVudHM9W107Y29uc3Qgc2VnbWVudHM9cGF0aC5zcGxpdCgnLycpO2ZvcihsZXQgaT0wO2k8c2VnbWVudHMubGVuZ3RoO2krKyl7Y29uc3Qgc2VnbWVudD1zZWdtZW50c1tpXTtpZihzZWdtZW50PT09Jy4nKQpjb250aW51ZTtlbHNlIGlmKHNlZ21lbnQ9PT0nLi4nKQpub3JtYWxpemVkU2VnbWVudHMucG9wKCk7ZWxzZSBpZihzZWdtZW50KQpub3JtYWxpemVkU2VnbWVudHMucHVzaChzZWdtZW50KTt9CmxldCBub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkU2VnbWVudHMuam9pbignLycpO2lmKG5vcm1hbGl6ZWRQYXRoW25vcm1hbGl6ZWRQYXRoLmxlbmd0aC0xXT09PScvJykKcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO2lmKHBhdGhbMF09PT0nLycmJm5vcm1hbGl6ZWRQYXRoKQpub3JtYWxpemVkUGF0aD0nLycrbm9ybWFsaXplZFBhdGg7aWYoKHBhdGhbcGF0aC5sZW5ndGgtMV09PT0nLycpfHwoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdPT09Jy4nKXx8KHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aC0xXT09PScuLicpKQpub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkUGF0aCsnLyc7cmV0dXJuIG5vcm1hbGl6ZWRQYXRoO30Kc3RhdGljIF9sb2FkU2NyaXB0c1Byb21pc2Uoc2NyaXB0TmFtZXMsYmFzZSl7Y29uc3QgcHJvbWlzZXM9W107Y29uc3QgdXJscz1bXTtjb25zdCBzb3VyY2VzPW5ldyBBcnJheShzY3JpcHROYW1lcy5sZW5ndGgpO2xldCBzY3JpcHRUb0V2YWw9MDtmb3IobGV0IGk9MDtpPHNjcmlwdE5hbWVzLmxlbmd0aDsrK2kpe2NvbnN0IHNjcmlwdE5hbWU9c2NyaXB0TmFtZXNbaV07bGV0IHNvdXJjZVVSTD0oYmFzZXx8c2VsZi5faW1wb3J0U2NyaXB0UGF0aFByZWZpeCkrc2NyaXB0TmFtZTtjb25zdCBzY2hlbWFJbmRleD1zb3VyY2VVUkwuaW5kZXhPZignOi8vJykrMztsZXQgcGF0aEluZGV4PXNvdXJjZVVSTC5pbmRleE9mKCcvJyxzY2hlbWFJbmRleCk7aWYocGF0aEluZGV4PT09LTEpCnBhdGhJbmRleD1zb3VyY2VVUkwubGVuZ3RoO3NvdXJjZVVSTD1zb3VyY2VVUkwuc3Vic3RyaW5nKDAscGF0aEluZGV4KStSdW50aW1lLm5vcm1hbGl6ZVBhdGgoc291cmNlVVJMLnN1YnN0cmluZyhwYXRoSW5kZXgpKTtpZihfbG9hZGVkU2NyaXB0c1tzb3VyY2VVUkxdKQpjb250aW51ZTt1cmxzLnB1c2goc291cmNlVVJMKTtjb25zdCBsb2FkUmVzb3VyY2VQcm9taXNlPWJhc2U/UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHNvdXJjZVVSTCk6UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHNvdXJjZVVSTCk7cHJvbWlzZXMucHVzaChsb2FkUmVzb3VyY2VQcm9taXNlLnRoZW4oc2NyaXB0U291cmNlTG9hZGVkLmJpbmQobnVsbCxpKSxzY3JpcHRTb3VyY2VMb2FkZWQuYmluZChudWxsLGksdW5kZWZpbmVkKSkpO30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHVuZGVmaW5lZCk7ZnVuY3Rpb24gc2NyaXB0U291cmNlTG9hZGVkKHNjcmlwdE51bWJlcixzY3JpcHRTb3VyY2Upe3NvdXJjZXNbc2NyaXB0TnVtYmVyXT1zY3JpcHRTb3VyY2V8fCcnO3doaWxlKHR5cGVvZiBzb3VyY2VzW3NjcmlwdFRvRXZhbF0hPT0ndW5kZWZpbmVkJyl7ZXZhbHVhdGVTY3JpcHQodXJsc1tzY3JpcHRUb0V2YWxdLHNvdXJjZXNbc2NyaXB0VG9FdmFsXSk7KytzY3JpcHRUb0V2YWw7fX0KZnVuY3Rpb24gZXZhbHVhdGVTY3JpcHQoc291cmNlVVJMLHNjcmlwdFNvdXJjZSl7X2xvYWRlZFNjcmlwdHNbc291cmNlVVJMXT10cnVlO2lmKCFzY3JpcHRTb3VyY2Upe2NvbnNvbGUuZXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGFycml2ZWQgZm9yIHNjcmlwdCBcJycrc291cmNlVVJMKydcJycpO3JldHVybjt9CnNlbGYuZXZhbChzY3JpcHRTb3VyY2UrJ1xuLy8jIHNvdXJjZVVSTD0nK3NvdXJjZVVSTCk7fX0Kc3RhdGljIF9sb2FkUmVzb3VyY2VJbnRvQ2FjaGUodXJsLGFwcGVuZFNvdXJjZVVSTCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLnRoZW4oY2FjaGVSZXNvdXJjZS5iaW5kKHRoaXMsdXJsKSxjYWNoZVJlc291cmNlLmJpbmQodGhpcyx1cmwsdW5kZWZpbmVkKSk7ZnVuY3Rpb24gY2FjaGVSZXNvdXJjZShwYXRoLGNvbnRlbnQpe2lmKCFjb250ZW50KXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCByZXNvdXJjZTogJytwYXRoKTtyZXR1cm47fQpjb25zdCBzb3VyY2VVUkw9YXBwZW5kU291cmNlVVJMP1J1bnRpbWUucmVzb2x2ZVNvdXJjZVVSTChwYXRoKTonJztSdW50aW1lLmNhY2hlZFJlc291cmNlc1twYXRoXT1jb250ZW50K3NvdXJjZVVSTDt9fQpzdGF0aWMgYXN5bmMgcnVudGltZVJlYWR5KCl7cmV0dXJuIFJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2U7fQpzdGF0aWMgYXN5bmMgc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKXtjb25zb2xlLnRpbWVTdGFtcCgnUnVudGltZS5zdGFydEFwcGxpY2F0aW9uJyk7Y29uc3QgYWxsRGVzY3JpcHRvcnNCeU5hbWU9e307Zm9yKGxldCBpPTA7aTxhbGxEZXNjcmlwdG9ycy5sZW5ndGg7KytpKXtjb25zdCBkPWFsbERlc2NyaXB0b3JzW2ldO2FsbERlc2NyaXB0b3JzQnlOYW1lW2RbJ25hbWUnXV09ZDt9CmlmKCFhcHBsaWNhdGlvbkRlc2NyaXB0b3Ipe2xldCBkYXRhPWF3YWl0IFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShhcHBOYW1lKycuanNvbicpO2FwcGxpY2F0aW9uRGVzY3JpcHRvcj1KU09OLnBhcnNlKGRhdGEpO2xldCBkZXNjcmlwdG9yPWFwcGxpY2F0aW9uRGVzY3JpcHRvcjt3aGlsZShkZXNjcmlwdG9yLmV4dGVuZHMpe2RhdGE9YXdhaXQgUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKGRlc2NyaXB0b3IuZXh0ZW5kcysnLmpzb24nKTtkZXNjcmlwdG9yPUpTT04ucGFyc2UoZGF0YSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXM9ZGVzY3JpcHRvci5tb2R1bGVzLmNvbmNhdChhcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcyk7fX0KY29uc3QgY29uZmlndXJhdGlvbj1hcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcztjb25zdCBtb2R1bGVKU09OUHJvbWlzZXM9W107Y29uc3QgY29yZU1vZHVsZU5hbWVzPVtdO2ZvcihsZXQgaT0wO2k8Y29uZmlndXJhdGlvbi5sZW5ndGg7KytpKXtjb25zdCBkZXNjcmlwdG9yPWNvbmZpZ3VyYXRpb25baV07Y29uc3QgbmFtZT1kZXNjcmlwdG9yWyduYW1lJ107Y29uc3QgbW9kdWxlSlNPTj1hbGxEZXNjcmlwdG9yc0J5TmFtZVtuYW1lXTtpZihtb2R1bGVKU09OKQptb2R1bGVKU09OUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUobW9kdWxlSlNPTikpO2Vsc2UKbW9kdWxlSlNPTlByb21pc2VzLnB1c2goUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKG5hbWUrJy9tb2R1bGUuanNvbicpLnRoZW4oSlNPTi5wYXJzZS5iaW5kKEpTT04pKSk7aWYoZGVzY3JpcHRvclsndHlwZSddPT09J2F1dG9zdGFydCcpCmNvcmVNb2R1bGVOYW1lcy5wdXNoKG5hbWUpO30KY29uc3QgbW9kdWxlRGVzY3JpcHRvcnM9YXdhaXQgUHJvbWlzZS5hbGwobW9kdWxlSlNPTlByb21pc2VzKTtmb3IobGV0IGk9MDtpPG1vZHVsZURlc2NyaXB0b3JzLmxlbmd0aDsrK2kpe21vZHVsZURlc2NyaXB0b3JzW2ldLm5hbWU9Y29uZmlndXJhdGlvbltpXVsnbmFtZSddO21vZHVsZURlc2NyaXB0b3JzW2ldLmNvbmRpdGlvbj1jb25maWd1cmF0aW9uW2ldWydjb25kaXRpb24nXTttb2R1bGVEZXNjcmlwdG9yc1tpXS5yZW1vdGU9Y29uZmlndXJhdGlvbltpXVsndHlwZSddPT09J3JlbW90ZSc7fQpzZWxmLnJ1bnRpbWU9bmV3IFJ1bnRpbWUobW9kdWxlRGVzY3JpcHRvcnMpO2lmKGNvcmVNb2R1bGVOYW1lcykKcmV0dXJuKHNlbGYucnVudGltZS5fbG9hZEF1dG9TdGFydE1vZHVsZXMoY29yZU1vZHVsZU5hbWVzKSk7fQpzdGF0aWMgc3RhcnRXb3JrZXIoYXBwTmFtZSl7cmV0dXJuIFJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKS50aGVuKHNlbmRXb3JrZXJSZWFkeSk7ZnVuY3Rpb24gc2VuZFdvcmtlclJlYWR5KCl7c2VsZi5wb3N0TWVzc2FnZSgnd29ya2VyUmVhZHknKTt9fQpzdGF0aWMgcXVlcnlQYXJhbShuYW1lKXtyZXR1cm4gUnVudGltZS5fcXVlcnlQYXJhbXNPYmplY3RbbmFtZV18fG51bGw7fQpzdGF0aWMgcXVlcnlQYXJhbXNTdHJpbmcoKXtyZXR1cm4gbG9jYXRpb24uc2VhcmNoO30Kc3RhdGljIF9leHBlcmltZW50c1NldHRpbmcoKXt0cnl7cmV0dXJuKEpTT04ucGFyc2Uoc2VsZi5sb2NhbFN0b3JhZ2UmJnNlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddP3NlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddOid7fScpKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIGxvY2FsU3RvcmFnZVtcJ2V4cGVyaW1lbnRzXCddJyk7cmV0dXJue307fX0Kc3RhdGljIF9hc3NlcnQodmFsdWUsbWVzc2FnZSl7aWYodmFsdWUpCnJldHVybjtSdW50aW1lLl9vcmlnaW5hbEFzc2VydC5jYWxsKFJ1bnRpbWUuX2NvbnNvbGUsdmFsdWUsbWVzc2FnZSsnICcrbmV3IEVycm9yKCkuc3RhY2spO30Kc3RhdGljIHNldFBsYXRmb3JtKHBsYXRmb3JtKXtSdW50aW1lLl9wbGF0Zm9ybT1wbGF0Zm9ybTt9CnN0YXRpYyBfaXNEZXNjcmlwdG9yRW5hYmxlZChkZXNjcmlwdG9yKXtjb25zdCBhY3RpdmF0b3JFeHBlcmltZW50PWRlc2NyaXB0b3JbJ2V4cGVyaW1lbnQnXTtpZihhY3RpdmF0b3JFeHBlcmltZW50PT09JyonKQpyZXR1cm4gUnVudGltZS5leHBlcmltZW50cy5zdXBwb3J0RW5hYmxlZCgpO2lmKGFjdGl2YXRvckV4cGVyaW1lbnQmJmFjdGl2YXRvckV4cGVyaW1lbnQuc3RhcnRzV2l0aCgnIScpJiZSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50LnN1YnN0cmluZygxKSkpCnJldHVybiBmYWxzZTtpZihhY3RpdmF0b3JFeHBlcmltZW50JiYhYWN0aXZhdG9yRXhwZXJpbWVudC5zdGFydHNXaXRoKCchJykmJiFSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50KSkKcmV0dXJuIGZhbHNlO2NvbnN0IGNvbmRpdGlvbj1kZXNjcmlwdG9yWydjb25kaXRpb24nXTtpZihjb25kaXRpb24mJiFjb25kaXRpb24uc3RhcnRzV2l0aCgnIScpJiYhUnVudGltZS5xdWVyeVBhcmFtKGNvbmRpdGlvbikpCnJldHVybiBmYWxzZTtpZihjb25kaXRpb24mJmNvbmRpdGlvbi5zdGFydHNXaXRoKCchJykmJlJ1bnRpbWUucXVlcnlQYXJhbShjb25kaXRpb24uc3Vic3RyaW5nKDEpKSkKcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO30Kc3RhdGljIHJlc29sdmVTb3VyY2VVUkwocGF0aCl7bGV0IHNvdXJjZVVSTD1zZWxmLmxvY2F0aW9uLmhyZWY7aWYoc2VsZi5sb2NhdGlvbi5zZWFyY2gpCnNvdXJjZVVSTD1zb3VyY2VVUkwucmVwbGFjZShzZWxmLmxvY2F0aW9uLnNlYXJjaCwnJyk7c291cmNlVVJMPXNvdXJjZVVSTC5zdWJzdHJpbmcoMCxzb3VyY2VVUkwubGFzdEluZGV4T2YoJy8nKSsxKStwYXRoO3JldHVybidcbi8qIyBzb3VyY2VVUkw9Jytzb3VyY2VVUkwrJyAqLyc7fQp1c2VUZXN0QmFzZSgpe1J1bnRpbWUuX3JlbW90ZUJhc2U9J2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9pbnNwZWN0b3Itc291cmNlcy8nO2lmKFJ1bnRpbWUucXVlcnlQYXJhbSgnZGVidWdGcm9udGVuZCcpKQpSdW50aW1lLl9yZW1vdGVCYXNlKz0nZGVidWcvJzt9Cl9yZWdpc3Rlck1vZHVsZShkZXNjcmlwdG9yKXtjb25zdCBtb2R1bGU9bmV3IFJ1bnRpbWUuTW9kdWxlKHRoaXMsZGVzY3JpcHRvcik7dGhpcy5fbW9kdWxlcy5wdXNoKG1vZHVsZSk7dGhpcy5fbW9kdWxlc01hcFtkZXNjcmlwdG9yWyduYW1lJ11dPW1vZHVsZTt9CmxvYWRNb2R1bGVQcm9taXNlKG1vZHVsZU5hbWUpe3JldHVybiB0aGlzLl9tb2R1bGVzTWFwW21vZHVsZU5hbWVdLl9sb2FkUHJvbWlzZSgpO30KX2xvYWRBdXRvU3RhcnRNb2R1bGVzKG1vZHVsZU5hbWVzKXtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPG1vZHVsZU5hbWVzLmxlbmd0aDsrK2kpCnByb21pc2VzLnB1c2godGhpcy5sb2FkTW9kdWxlUHJvbWlzZShtb2R1bGVOYW1lc1tpXSkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fQpfY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixwcmVkaWNhdGUpe2lmKCFwcmVkaWNhdGUpCnJldHVybiBmYWxzZTtjb25zdCBjb250ZXh0VHlwZXM9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKS5jb250ZXh0VHlwZXM7aWYoIWNvbnRleHRUeXBlcykKcmV0dXJuIHRydWU7Zm9yKGxldCBpPTA7aTxjb250ZXh0VHlwZXMubGVuZ3RoOysraSl7Y29uc3QgY29udGV4dFR5cGU9dGhpcy5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pO2NvbnN0IGlzTWF0Y2hpbmc9ISFjb250ZXh0VHlwZSYmcHJlZGljYXRlKGNvbnRleHRUeXBlKTtpZihpc01hdGNoaW5nKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dChleHRlbnNpb24sY29udGV4dCl7aWYoIWNvbnRleHQpCnJldHVybiB0cnVlO3JldHVybiB0aGlzLl9jaGVja0V4dGVuc2lvbkFwcGxpY2FiaWxpdHkoZXh0ZW5zaW9uLGlzSW5zdGFuY2VPZik7ZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHRhcmdldFR5cGUpe3JldHVybiBjb250ZXh0IGluc3RhbmNlb2YgdGFyZ2V0VHlwZTt9fQppc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHRUeXBlcyhleHRlbnNpb24sY3VycmVudENvbnRleHRUeXBlcyl7aWYoIWV4dGVuc2lvbi5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixjdXJyZW50Q29udGV4dFR5cGVzP2lzQ29udGV4dFR5cGVLbm93bjpudWxsKTtmdW5jdGlvbiBpc0NvbnRleHRUeXBlS25vd24odGFyZ2V0VHlwZSl7cmV0dXJuIGN1cnJlbnRDb250ZXh0VHlwZXMuaGFzKHRhcmdldFR5cGUpO319CmV4dGVuc2lvbnModHlwZSxjb250ZXh0LHNvcnRCeVRpdGxlKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9ucy5maWx0ZXIoZmlsdGVyKS5zb3J0KHNvcnRCeVRpdGxlP3RpdGxlQ29tcGFyYXRvcjpvcmRlckNvbXBhcmF0b3IpO2Z1bmN0aW9uIGZpbHRlcihleHRlbnNpb24pe2lmKGV4dGVuc2lvbi5fdHlwZSE9PXR5cGUmJmV4dGVuc2lvbi5fdHlwZUNsYXNzKCkhPT10eXBlKQpyZXR1cm4gZmFsc2U7aWYoIWV4dGVuc2lvbi5lbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hY29udGV4dHx8ZXh0ZW5zaW9uLmlzQXBwbGljYWJsZShjb250ZXh0KTt9CmZ1bmN0aW9uIG9yZGVyQ29tcGFyYXRvcihleHRlbnNpb24xLGV4dGVuc2lvbjIpe2NvbnN0IG9yZGVyMT1leHRlbnNpb24xLmRlc2NyaXB0b3IoKVsnb3JkZXInXXx8MDtjb25zdCBvcmRlcjI9ZXh0ZW5zaW9uMi5kZXNjcmlwdG9yKClbJ29yZGVyJ118fDA7cmV0dXJuIG9yZGVyMS1vcmRlcjI7fQpmdW5jdGlvbiB0aXRsZUNvbXBhcmF0b3IoZXh0ZW5zaW9uMSxleHRlbnNpb24yKXtjb25zdCB0aXRsZTE9ZXh0ZW5zaW9uMS50aXRsZSgpfHwnJztjb25zdCB0aXRsZTI9ZXh0ZW5zaW9uMi50aXRsZSgpfHwnJztyZXR1cm4gdGl0bGUxLmxvY2FsZUNvbXBhcmUodGl0bGUyKTt9fQpleHRlbnNpb24odHlwZSxjb250ZXh0KXtyZXR1cm4gdGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dClbMF18fG51bGw7fQphbGxJbnN0YW5jZXModHlwZSxjb250ZXh0KXtyZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dCkubWFwKGV4dGVuc2lvbj0+ZXh0ZW5zaW9uLmluc3RhbmNlKCkpKTt9Cl9yZXNvbHZlKHR5cGVOYW1lKXtpZighdGhpcy5fY2FjaGVkVHlwZUNsYXNzZXNbdHlwZU5hbWVdKXtjb25zdCBwYXRoPXR5cGVOYW1lLnNwbGl0KCcuJyk7bGV0IG9iamVjdD1zZWxmO2ZvcihsZXQgaT0wO29iamVjdCYmKGk8cGF0aC5sZW5ndGgpOysraSkKb2JqZWN0PW9iamVjdFtwYXRoW2ldXTtpZihvYmplY3QpCnRoaXMuX2NhY2hlZFR5cGVDbGFzc2VzW3R5cGVOYW1lXT0ob2JqZWN0KTt9CnJldHVybiB0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlc1t0eXBlTmFtZV18fG51bGw7fQpzaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihSdW50aW1lLl9pbnN0YW5jZVN5bWJvbCBpbiBjb25zdHJ1Y3RvckZ1bmN0aW9uJiZPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbnN0cnVjdG9yRnVuY3Rpb24pLmluY2x1ZGVzKFJ1bnRpbWUuX2luc3RhbmNlU3ltYm9sKSkKcmV0dXJuIGNvbnN0cnVjdG9yRnVuY3Rpb25bUnVudGltZS5faW5zdGFuY2VTeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltSdW50aW1lLl9pbnN0YW5jZVN5bWJvbF09aW5zdGFuY2U7cmV0dXJuIGluc3RhbmNlO319O1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0PXtfX3Byb3RvX186bnVsbH07UnVudGltZS5faW5zdGFuY2VTeW1ib2w9U3ltYm9sKCdpbnN0YW5jZScpO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzPXtfX3Byb3RvX186bnVsbH07UnVudGltZS5fY29uc29sZT1jb25zb2xlO1J1bnRpbWUuX29yaWdpbmFsQXNzZXJ0PWNvbnNvbGUuYXNzZXJ0O1J1bnRpbWUuX3BsYXRmb3JtPScnO1J1bnRpbWUuTW9kdWxlRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubmFtZTt0aGlzLmV4dGVuc2lvbnM7dGhpcy5kZXBlbmRlbmNpZXM7dGhpcy5zY3JpcHRzO3RoaXMuY29uZGl0aW9uO3RoaXMucmVtb3RlO319O1J1bnRpbWUuRXh0ZW5zaW9uRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZTt0aGlzLmNsYXNzTmFtZTt0aGlzLmZhY3RvcnlOYW1lO3RoaXMuY29udGV4dFR5cGVzO319O1J1bnRpbWUuTW9kdWxlPWNsYXNze2NvbnN0cnVjdG9yKG1hbmFnZXIsZGVzY3JpcHRvcil7dGhpcy5fbWFuYWdlcj1tYW5hZ2VyO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl9uYW1lPWRlc2NyaXB0b3IubmFtZTt0aGlzLl9leHRlbnNpb25zPVtdO3RoaXMuX2V4dGVuc2lvbnNCeUNsYXNzTmFtZT1uZXcgTWFwKCk7Y29uc3QgZXh0ZW5zaW9ucz0oZGVzY3JpcHRvci5leHRlbnNpb25zKTtmb3IobGV0IGk9MDtleHRlbnNpb25zJiZpPGV4dGVuc2lvbnMubGVuZ3RoOysraSl7Y29uc3QgZXh0ZW5zaW9uPW5ldyBSdW50aW1lLkV4dGVuc2lvbih0aGlzLGV4dGVuc2lvbnNbaV0pO3RoaXMuX21hbmFnZXIuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO3RoaXMuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO30KdGhpcy5fbG9hZGVkRm9yVGVzdD1mYWxzZTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CmVuYWJsZWQoKXtyZXR1cm4gUnVudGltZS5faXNEZXNjcmlwdG9yRW5hYmxlZCh0aGlzLl9kZXNjcmlwdG9yKTt9CnJlc291cmNlKG5hbWUpe2NvbnN0IGZ1bGxOYW1lPXRoaXMuX25hbWUrJy8nK25hbWU7Y29uc3QgY29udGVudD1SdW50aW1lLmNhY2hlZFJlc291cmNlc1tmdWxsTmFtZV07aWYoIWNvbnRlbnQpCnRocm93IG5ldyBFcnJvcihmdWxsTmFtZSsnIG5vdCBwcmVsb2FkZWQuIENoZWNrIG1vZHVsZS5qc29uJyk7cmV0dXJuIGNvbnRlbnQ7fQpfbG9hZFByb21pc2UoKXtpZighdGhpcy5lbmFibGVkKCkpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01vZHVsZSAnK3RoaXMuX25hbWUrJyBpcyBub3QgZW5hYmxlZCcpKTtpZih0aGlzLl9wZW5kaW5nTG9hZFByb21pc2UpCnJldHVybiB0aGlzLl9wZW5kaW5nTG9hZFByb21pc2U7Y29uc3QgZGVwZW5kZW5jaWVzPXRoaXMuX2Rlc2NyaXB0b3IuZGVwZW5kZW5jaWVzO2NvbnN0IGRlcGVuZGVuY3lQcm9taXNlcz1bXTtmb3IobGV0IGk9MDtkZXBlbmRlbmNpZXMmJmk8ZGVwZW5kZW5jaWVzLmxlbmd0aDsrK2kpCmRlcGVuZGVuY3lQcm9taXNlcy5wdXNoKHRoaXMuX21hbmFnZXIuX21vZHVsZXNNYXBbZGVwZW5kZW5jaWVzW2ldXS5fbG9hZFByb21pc2UoKSk7dGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlPVByb21pc2UuYWxsKGRlcGVuZGVuY3lQcm9taXNlcykudGhlbih0aGlzLl9sb2FkUmVzb3VyY2VzLmJpbmQodGhpcykpLnRoZW4odGhpcy5fbG9hZFNjcmlwdHMuYmluZCh0aGlzKSkudGhlbigoKT0+dGhpcy5fbG9hZGVkRm9yVGVzdD10cnVlKTtyZXR1cm4gdGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlO30KX2xvYWRSZXNvdXJjZXMoKXtjb25zdCByZXNvdXJjZXM9dGhpcy5fZGVzY3JpcHRvclsncmVzb3VyY2VzJ107aWYoIXJlc291cmNlc3x8IXJlc291cmNlcy5sZW5ndGgpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPHJlc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCB1cmw9dGhpcy5fbW9kdWxhcml6ZVVSTChyZXNvdXJjZXNbaV0pO3Byb21pc2VzLnB1c2goUnVudGltZS5fbG9hZFJlc291cmNlSW50b0NhY2hlKHVybCx0cnVlKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odW5kZWZpbmVkKTt9Cl9sb2FkU2NyaXB0cygpe2lmKCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHN8fCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgc3BlY2lhbENhc2VzPXsnc2RrJzonU0RLJywnanNfc2RrJzonSlNTREsnLCdicm93c2VyX3Nkayc6J0Jyb3dzZXJTREsnLCd1aSc6J1VJJywnb2JqZWN0X3VpJzonT2JqZWN0VUknLCdqYXZhc2NyaXB0X21ldGFkYXRhJzonSmF2YVNjcmlwdE1ldGFkYXRhJywncGVyZl91aSc6J1BlcmZVSScsJ2hhcl9pbXBvcnRlcic6J0hBUkltcG9ydGVyJywnc2RrX3Rlc3RfcnVubmVyJzonU0RLVGVzdFJ1bm5lcicsJ2NwdV9wcm9maWxlcl90ZXN0X3J1bm5lcic6J0NQVVByb2ZpbGVyVGVzdFJ1bm5lcid9O2NvbnN0IG5hbWVzcGFjZT1zcGVjaWFsQ2FzZXNbdGhpcy5fbmFtZV18fHRoaXMuX25hbWUuc3BsaXQoJ18nKS5tYXAoYT0+YS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpKS5qb2luKCcnKTtzZWxmW25hbWVzcGFjZV09c2VsZltuYW1lc3BhY2VdfHx7fTtyZXR1cm4gUnVudGltZS5fbG9hZFNjcmlwdHNQcm9taXNlKHRoaXMuX2Rlc2NyaXB0b3Iuc2NyaXB0cy5tYXAodGhpcy5fbW9kdWxhcml6ZVVSTCx0aGlzKSx0aGlzLl9yZW1vdGVCYXNlKCkpO30KX21vZHVsYXJpemVVUkwocmVzb3VyY2VOYW1lKXtyZXR1cm4gUnVudGltZS5ub3JtYWxpemVQYXRoKHRoaXMuX25hbWUrJy8nK3Jlc291cmNlTmFtZSk7fQpfcmVtb3RlQmFzZSgpe3JldHVybiFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKSYmdGhpcy5fZGVzY3JpcHRvci5yZW1vdGUmJlJ1bnRpbWUuX3JlbW90ZUJhc2V8fHVuZGVmaW5lZDt9CnN1YnN0aXR1dGVVUkwodmFsdWUpe2NvbnN0IGJhc2U9dGhpcy5fcmVtb3RlQmFzZSgpfHwnJztyZXR1cm4gdmFsdWUucmVwbGFjZSgvQHVybFwoKFteXCldKj8pXCkvZyxjb252ZXJ0VVJMLmJpbmQodGhpcykpO2Z1bmN0aW9uIGNvbnZlcnRVUkwobWF0Y2gsdXJsKXtyZXR1cm4gYmFzZSt0aGlzLl9tb2R1bGFyaXplVVJMKHVybCk7fX19O1J1bnRpbWUuRXh0ZW5zaW9uPWNsYXNze2NvbnN0cnVjdG9yKG1vZHVsZSxkZXNjcmlwdG9yKXt0aGlzLl9tb2R1bGU9bW9kdWxlO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl90eXBlPWRlc2NyaXB0b3IudHlwZTt0aGlzLl9oYXNUeXBlQ2xhc3M9dGhpcy5fdHlwZS5jaGFyQXQoMCk9PT0nQCc7dGhpcy5fY2xhc3NOYW1lPWRlc2NyaXB0b3IuY2xhc3NOYW1lfHxudWxsO3RoaXMuX2ZhY3RvcnlOYW1lPWRlc2NyaXB0b3IuZmFjdG9yeU5hbWV8fG51bGw7fQpkZXNjcmlwdG9yKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3I7fQptb2R1bGUoKXtyZXR1cm4gdGhpcy5fbW9kdWxlO30KZW5hYmxlZCgpe3JldHVybiB0aGlzLl9tb2R1bGUuZW5hYmxlZCgpJiZSdW50aW1lLl9pc0Rlc2NyaXB0b3JFbmFibGVkKHRoaXMuZGVzY3JpcHRvcigpKTt9Cl90eXBlQ2xhc3MoKXtpZighdGhpcy5faGFzVHlwZUNsYXNzKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLl9yZXNvbHZlKHRoaXMuX3R5cGUuc3Vic3RyaW5nKDEpKTt9CmlzQXBwbGljYWJsZShjb250ZXh0KXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dCh0aGlzLGNvbnRleHQpO30KaW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9sb2FkUHJvbWlzZSgpLnRoZW4odGhpcy5fY3JlYXRlSW5zdGFuY2UuYmluZCh0aGlzKSk7fQpjYW5JbnN0YW50aWF0ZSgpe3JldHVybiEhKHRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWUpO30KX2NyZWF0ZUluc3RhbmNlKCl7Y29uc3QgY2xhc3NOYW1lPXRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWU7aWYoIWNsYXNzTmFtZSkKdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgaW5zdGFudGlhdGUgZXh0ZW5zaW9uIHdpdGggbm8gY2xhc3MnKTtjb25zdCBjb25zdHJ1Y3RvckZ1bmN0aW9uPXNlbGYuZXZhbCgoY2xhc3NOYW1lKSk7aWYoIShjb25zdHJ1Y3RvckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pKQp0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZTogJytjbGFzc05hbWUpO2lmKHRoaXMuX2NsYXNzTmFtZSkKcmV0dXJuIHRoaXMuX21vZHVsZS5fbWFuYWdlci5zaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKTtyZXR1cm4gbmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24odGhpcyk7fQp0aXRsZSgpe3JldHVybiB0aGlzLl9kZXNjcmlwdG9yWyd0aXRsZS0nK1J1bnRpbWUuX3BsYXRmb3JtXXx8dGhpcy5fZGVzY3JpcHRvclsndGl0bGUnXTt9Cmhhc0NvbnRleHRUeXBlKGNvbnRleHRUeXBlKXtjb25zdCBjb250ZXh0VHlwZXM9dGhpcy5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzO2lmKCFjb250ZXh0VHlwZXMpCnJldHVybiBmYWxzZTtmb3IobGV0IGk9MDtpPGNvbnRleHRUeXBlcy5sZW5ndGg7KytpKXtpZihjb250ZXh0VHlwZT09PXRoaXMuX21vZHVsZS5fbWFuYWdlci5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtSdW50aW1lLkV4cGVyaW1lbnRzU3VwcG9ydD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3N1cHBvcnRFbmFibGVkPVJ1bnRpbWUucXVlcnlQYXJhbSgnZXhwZXJpbWVudHMnKSE9PW51bGw7dGhpcy5fZXhwZXJpbWVudHM9W107dGhpcy5fZXhwZXJpbWVudE5hbWVzPXt9O3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseT17fTt9CmFsbENvbmZpZ3VyYWJsZUV4cGVyaW1lbnRzKCl7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fZXhwZXJpbWVudHMubGVuZ3RoO2krKyl7Y29uc3QgZXhwZXJpbWVudD10aGlzLl9leHBlcmltZW50c1tpXTtpZighdGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnQubmFtZV0pCnJlc3VsdC5wdXNoKGV4cGVyaW1lbnQpO30KcmV0dXJuIHJlc3VsdDt9CnN1cHBvcnRFbmFibGVkKCl7cmV0dXJuIHRoaXMuX3N1cHBvcnRFbmFibGVkO30KX3NldEV4cGVyaW1lbnRzU2V0dGluZyh2YWx1ZSl7aWYoIXNlbGYubG9jYWxTdG9yYWdlKQpyZXR1cm47c2VsZi5sb2NhbFN0b3JhZ2VbJ2V4cGVyaW1lbnRzJ109SlNPTi5zdHJpbmdpZnkodmFsdWUpO30KcmVnaXN0ZXIoZXhwZXJpbWVudE5hbWUsZXhwZXJpbWVudFRpdGxlLGhpZGRlbil7UnVudGltZS5fYXNzZXJ0KCF0aGlzLl9leHBlcmltZW50TmFtZXNbZXhwZXJpbWVudE5hbWVdLCdEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIGV4cGVyaW1lbnQgJytleHBlcmltZW50TmFtZSk7dGhpcy5fZXhwZXJpbWVudE5hbWVzW2V4cGVyaW1lbnROYW1lXT10cnVlO3RoaXMuX2V4cGVyaW1lbnRzLnB1c2gobmV3IFJ1bnRpbWUuRXhwZXJpbWVudCh0aGlzLGV4cGVyaW1lbnROYW1lLGV4cGVyaW1lbnRUaXRsZSwhIWhpZGRlbikpO30KaXNFbmFibGVkKGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO2lmKHRoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV0pCnJldHVybiB0cnVlO2lmKCF0aGlzLnN1cHBvcnRFbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hIVJ1bnRpbWUuX2V4cGVyaW1lbnRzU2V0dGluZygpW2V4cGVyaW1lbnROYW1lXTt9CnNldEVuYWJsZWQoZXhwZXJpbWVudE5hbWUsZW5hYmxlZCl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKTtjb25zdCBleHBlcmltZW50c1NldHRpbmc9UnVudGltZS5fZXhwZXJpbWVudHNTZXR0aW5nKCk7ZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXT1lbmFibGVkO3RoaXMuX3NldEV4cGVyaW1lbnRzU2V0dGluZyhleHBlcmltZW50c1NldHRpbmcpO30Kc2V0RGVmYXVsdEV4cGVyaW1lbnRzKGV4cGVyaW1lbnROYW1lcyl7Zm9yKGxldCBpPTA7aTxleHBlcmltZW50TmFtZXMubGVuZ3RoOysraSl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lc1tpXSk7dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnROYW1lc1tpXV09dHJ1ZTt9fQplbmFibGVGb3JUZXN0KGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV09dHJ1ZTt9CmNsZWFyRm9yVGVzdCgpe3RoaXMuX2V4cGVyaW1lbnRzPVtdO3RoaXMuX2V4cGVyaW1lbnROYW1lcz17fTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHk9e307fQpjbGVhblVwU3RhbGVFeHBlcmltZW50cygpe2NvbnN0IGV4cGVyaW1lbnRzU2V0dGluZz1SdW50aW1lLl9leHBlcmltZW50c1NldHRpbmcoKTtjb25zdCBjbGVhbmVkVXBFeHBlcmltZW50U2V0dGluZz17fTtmb3IobGV0IGk9MDtpPHRoaXMuX2V4cGVyaW1lbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV4cGVyaW1lbnROYW1lPXRoaXMuX2V4cGVyaW1lbnRzW2ldLm5hbWU7aWYoZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXSkKY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmdbZXhwZXJpbWVudE5hbWVdPXRydWU7fQp0aGlzLl9zZXRFeHBlcmltZW50c1NldHRpbmcoY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmcpO30KX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSl7UnVudGltZS5fYXNzZXJ0KHRoaXMuX2V4cGVyaW1lbnROYW1lc1tleHBlcmltZW50TmFtZV0sJ1Vua25vd24gZXhwZXJpbWVudCAnK2V4cGVyaW1lbnROYW1lKTt9fTtSdW50aW1lLkV4cGVyaW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZXhwZXJpbWVudHMsbmFtZSx0aXRsZSxoaWRkZW4pe3RoaXMubmFtZT1uYW1lO3RoaXMudGl0bGU9dGl0bGU7dGhpcy5oaWRkZW49aGlkZGVuO3RoaXMuX2V4cGVyaW1lbnRzPWV4cGVyaW1lbnRzO30KaXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2V4cGVyaW1lbnRzLmlzRW5hYmxlZCh0aGlzLm5hbWUpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9leHBlcmltZW50cy5zZXRFbmFibGVkKHRoaXMubmFtZSxlbmFibGVkKTt9fTt7KGZ1bmN0aW9uIHBhcnNlUXVlcnlQYXJhbWV0ZXJzKCl7Y29uc3QgcXVlcnlQYXJhbXM9UnVudGltZS5xdWVyeVBhcmFtc1N0cmluZygpO2lmKCFxdWVyeVBhcmFtcykKcmV0dXJuO2NvbnN0IHBhcmFtcz1xdWVyeVBhcmFtcy5zdWJzdHJpbmcoMSkuc3BsaXQoJyYnKTtmb3IobGV0IGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXtjb25zdCBwYWlyPXBhcmFtc1tpXS5zcGxpdCgnPScpO2NvbnN0IG5hbWU9cGFpci5zaGlmdCgpO1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0W25hbWVdPXBhaXIuam9pbignPScpO319KSgpO30KUnVudGltZS5leHBlcmltZW50cz1uZXcgUnVudGltZS5FeHBlcmltZW50c1N1cHBvcnQoKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2s7UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWw9PlJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2VDYWxsYmFjaz1mdWxmaWwpO1J1bnRpbWUuX3JlbW90ZUJhc2U7KGZ1bmN0aW9uIHZhbGlkYXRlUmVtb3RlQmFzZSgpe2lmKGxvY2F0aW9uLmhyZWYuc3RhcnRzV2l0aCgnY2hyb21lLWRldnRvb2xzOi8vZGV2dG9vbHMvYnVuZGxlZC8nKSYmUnVudGltZS5xdWVyeVBhcmFtKCdyZW1vdGVCYXNlJykpe2NvbnN0IHZlcnNpb25NYXRjaD0vXC9zZXJ2ZV9maWxlXC8oQFswLTlhLXpBLVpdKylcLz8kLy5leGVjKFJ1bnRpbWUucXVlcnlQYXJhbSgncmVtb3RlQmFzZScpKTtpZih2ZXJzaW9uTWF0Y2gpClJ1bnRpbWUuX3JlbW90ZUJhc2U9YCR7bG9jYXRpb24ub3JpZ2lufS9yZW1vdGUvc2VydmVfZmlsZS8ke3ZlcnNpb25NYXRjaFsxXX0vYDt9fSkoKTtmdW5jdGlvbiBTZXJ2aWNlUG9ydCgpe30KU2VydmljZVBvcnQucHJvdG90eXBlPXtzZXRIYW5kbGVycyhtZXNzYWdlSGFuZGxlcixjbG9zZUhhbmRsZXIpe30sc2VuZChtZXNzYWdlKXt9LGNsb3NlKCl7fX07dmFyIHJ1bnRpbWU7YWxsRGVzY3JpcHRvcnMucHVzaCguLi5beyJkZXBlbmRlbmNpZXMiOltdLCJuYW1lIjoicGxhdGZvcm0ifSx7InNraXBfY29tcGlsYXRpb24iOlsiYWNvcm4vYWNvcm4uanMiLCJhY29ybi9hY29ybl9sb29zZS5qcyIsIi4uL2NtX3dlYl9tb2Rlcy9jc3MuanMiLCIuLi9jbV93ZWJfbW9kZXMveG1sLmpzIl0sImRlcGVuZGVuY2llcyI6WyJwbGF0Zm9ybSIsInRleHRfdXRpbHMiLCJjbV9oZWFkbGVzcyJdLCJuYW1lIjoiZm9ybWF0dGVyX3dvcmtlciJ9LHsiZGVwZW5kZW5jaWVzIjpbInBsYXRmb3JtIl0sIm5hbWUiOiJ0ZXh0X3V0aWxzIn0seyJza2lwX2NvbXBpbGF0aW9uIjpbImhlYWRsZXNzY29kZW1pcnJvci5qcyJdLCJuYW1lIjoiY21faGVhZGxlc3MifV0pO2FwcGxpY2F0aW9uRGVzY3JpcHRvcj17Imhhc19odG1sIjpmYWxzZSwibW9kdWxlcyI6W3sidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJwbGF0Zm9ybSJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJmb3JtYXR0ZXJfd29ya2VyIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6InRleHRfdXRpbHMifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiY21faGVhZGxlc3MifV19CnNlbGZbJ1BsYXRmb3JtJ109c2VsZlsnUGxhdGZvcm0nXXx8e307bGV0IEFycmF5TGlrZTtmdW5jdGlvbiBtb2QobSxuKXtyZXR1cm4oKG0lbikrbiklbjt9ClN0cmluZy5wcm90b3R5cGUuZmluZEFsbD1mdW5jdGlvbihzdHJpbmcpe2NvbnN0IG1hdGNoZXM9W107bGV0IGk9dGhpcy5pbmRleE9mKHN0cmluZyk7d2hpbGUoaSE9PS0xKXttYXRjaGVzLnB1c2goaSk7aT10aGlzLmluZGV4T2Yoc3RyaW5nLGkrc3RyaW5nLmxlbmd0aCk7fQpyZXR1cm4gbWF0Y2hlczt9O1N0cmluZy5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7fTtTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VDb250cm9sQ2hhcmFjdGVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL1tcdTAwMDAtXHUwMDA4XHUwMDBiXHUwMDBjXHUwMDBlLVx1MDAxZlx1MDA4MC1cdTAwOWZdL2csJ++/vScpO307U3RyaW5nLnByb3RvdHlwZS5pc1doaXRlc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4vXlxzKiQvLnRlc3QodGhpcyk7fTtTdHJpbmcucHJvdG90eXBlLmNvbXB1dGVMaW5lRW5kaW5ncz1mdW5jdGlvbigpe2NvbnN0IGVuZGluZ3M9dGhpcy5maW5kQWxsKCdcbicpO2VuZGluZ3MucHVzaCh0aGlzLmxlbmd0aCk7cmV0dXJuIGVuZGluZ3M7fTtTdHJpbmcucHJvdG90eXBlLmVzY2FwZUNoYXJhY3RlcnM9ZnVuY3Rpb24oY2hhcnMpe2xldCBmb3VuZENoYXI9ZmFsc2U7Zm9yKGxldCBpPTA7aTxjaGFycy5sZW5ndGg7KytpKXtpZih0aGlzLmluZGV4T2YoY2hhcnMuY2hhckF0KGkpKSE9PS0xKXtmb3VuZENoYXI9dHJ1ZTticmVhazt9fQppZighZm91bmRDaGFyKQpyZXR1cm4gU3RyaW5nKHRoaXMpO2xldCByZXN1bHQ9Jyc7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpe2lmKGNoYXJzLmluZGV4T2YodGhpcy5jaGFyQXQoaSkpIT09LTEpCnJlc3VsdCs9J1xcJztyZXN1bHQrPXRoaXMuY2hhckF0KGkpO30KcmV0dXJuIHJlc3VsdDt9O1N0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuJ15bXXt9KClcXC5eJCorP3wtLCc7fTtTdHJpbmcucHJvdG90eXBlLmVzY2FwZUZvclJlZ0V4cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVzY2FwZUNoYXJhY3RlcnMoU3RyaW5nLnJlZ2V4U3BlY2lhbENoYXJhY3RlcnMoKSk7fTtTdHJpbmcuZmlsdGVyUmVnZXg9ZnVuY3Rpb24ocXVlcnkpe2NvbnN0IHRvRXNjYXBlPVN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCk7bGV0IHJlZ2V4U3RyaW5nPScnO2ZvcihsZXQgaT0wO2k8cXVlcnkubGVuZ3RoOysraSl7bGV0IGM9cXVlcnkuY2hhckF0KGkpO2lmKHRvRXNjYXBlLmluZGV4T2YoYykhPT0tMSkKYz0nXFwnK2M7aWYoaSkKcmVnZXhTdHJpbmcrPSdbXlxcMCcrYysnXSonO3JlZ2V4U3RyaW5nKz1jO30KcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhTdHJpbmcsJ2knKTt9O1N0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoLyYvZywnJmFtcDsnKS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNlKC8+L2csJyZndDsnKS5yZXBsYWNlKC8iL2csJyZxdW90OycpO307U3RyaW5nLnByb3RvdHlwZS51bmVzY2FwZUhUTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8mbHQ7L2csJzwnKS5yZXBsYWNlKC8mZ3Q7L2csJz4nKS5yZXBsYWNlKC8mIzU4Oy9nLCc6JykucmVwbGFjZSgvJnF1b3Q7L2csJyInKS5yZXBsYWNlKC8mIzYwOy9nLCc8JykucmVwbGFjZSgvJiM2MjsvZywnPicpLnJlcGxhY2UoLyZhbXA7L2csJyYnKTt9O1N0cmluZy5wcm90b3R5cGUuY29sbGFwc2VXaGl0ZXNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvW1xzXHhBMF0rL2csJyAnKTt9O1N0cmluZy5wcm90b3R5cGUudHJpbU1pZGRsZT1mdW5jdGlvbihtYXhMZW5ndGgpe2lmKHRoaXMubGVuZ3RoPD1tYXhMZW5ndGgpCnJldHVybiBTdHJpbmcodGhpcyk7bGV0IGxlZnRIYWxmPW1heExlbmd0aD4+MTtsZXQgcmlnaHRIYWxmPW1heExlbmd0aC1sZWZ0SGFsZi0xO2lmKHRoaXMuY29kZVBvaW50QXQodGhpcy5sZW5ndGgtcmlnaHRIYWxmLTEpPj0weDEwMDAwKXstLXJpZ2h0SGFsZjsrK2xlZnRIYWxmO30KaWYobGVmdEhhbGY+MCYmdGhpcy5jb2RlUG9pbnRBdChsZWZ0SGFsZi0xKT49MHgxMDAwMCkKLS1sZWZ0SGFsZjtyZXR1cm4gdGhpcy5zdWJzdHIoMCxsZWZ0SGFsZikrJ1x1MjAyNicrdGhpcy5zdWJzdHIodGhpcy5sZW5ndGgtcmlnaHRIYWxmLHJpZ2h0SGFsZik7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1FbmQ9ZnVuY3Rpb24obWF4TGVuZ3RoKXtpZih0aGlzLmxlbmd0aDw9bWF4TGVuZ3RoKQpyZXR1cm4gU3RyaW5nKHRoaXMpO3JldHVybiB0aGlzLnN1YnN0cigwLG1heExlbmd0aC0xKSsnXHUyMDI2Jzt9O1N0cmluZy5wcm90b3R5cGUudHJpbVVSTD1mdW5jdGlvbihiYXNlVVJMRG9tYWluKXtsZXQgcmVzdWx0PXRoaXMucmVwbGFjZSgvXihodHRwc3xodHRwfGZpbGUpOlwvXC8vaSwnJyk7aWYoYmFzZVVSTERvbWFpbil7aWYocmVzdWx0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChiYXNlVVJMRG9tYWluLnRvTG93ZXJDYXNlKCkpKQpyZXN1bHQ9cmVzdWx0LnN1YnN0cihiYXNlVVJMRG9tYWluLmxlbmd0aCk7fQpyZXR1cm4gcmVzdWx0O307U3RyaW5nLnByb3RvdHlwZS50b1RpdGxlQ2FzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrdGhpcy5zdWJzdHJpbmcoMSk7fTtTdHJpbmcucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbihvdGhlcil7aWYodGhpcz5vdGhlcikKcmV0dXJuIDE7aWYodGhpczxvdGhlcikKcmV0dXJuLTE7cmV0dXJuIDA7fTtTdHJpbmcucHJvdG90eXBlLnJlbW92ZVVSTEZyYWdtZW50PWZ1bmN0aW9uKCl7bGV0IGZyYWdtZW50SW5kZXg9dGhpcy5pbmRleE9mKCcjJyk7aWYoZnJhZ21lbnRJbmRleD09PS0xKQpmcmFnbWVudEluZGV4PXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnN1YnN0cmluZygwLGZyYWdtZW50SW5kZXgpO307U3RyaW5nLmhhc2hDb2RlPWZ1bmN0aW9uKHN0cmluZyl7aWYoIXN0cmluZykKcmV0dXJuIDA7Y29uc3QgcD0oKDE8PDMwKSo0LTUpO2NvbnN0IHo9MHg1MDMzZDk2Nztjb25zdCB6Mj0weDU5ZDJmMTVkO2xldCBzPTA7bGV0IHppPTE7Zm9yKGxldCBpPTA7aTxzdHJpbmcubGVuZ3RoO2krKyl7Y29uc3QgeGk9c3RyaW5nLmNoYXJDb2RlQXQoaSkqejI7cz0ocyt6aSp4aSklcDt6aT0oemkqeiklcDt9CnM9KHMremkqKHAtMSkpJXA7cmV0dXJuIE1hdGguYWJzKHN8MCk7fTtTdHJpbmcuaXNEaWdpdEF0PWZ1bmN0aW9uKHN0cmluZyxpbmRleCl7Y29uc3QgYz1zdHJpbmcuY2hhckNvZGVBdChpbmRleCk7cmV0dXJuKDQ4PD1jJiZjPD01Nyk7fTtTdHJpbmcucHJvdG90eXBlLnRvQmFzZTY0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZW5jb2RlQml0cyhiKXtyZXR1cm4gYjwyNj9iKzY1OmI8NTI/Yis3MTpiPDYyP2ItNDpiPT09NjI/NDM6Yj09PTYzPzQ3OjY1O30KY29uc3QgZW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtjb25zdCBkYXRhPWVuY29kZXIuZW5jb2RlKHRoaXMudG9TdHJpbmcoKSk7Y29uc3Qgbj1kYXRhLmxlbmd0aDtsZXQgZW5jb2RlZD0nJztpZihuPT09MCkKcmV0dXJuIGVuY29kZWQ7bGV0IHNoaWZ0O2xldCB2PTA7Zm9yKGxldCBpPTA7aTxuO2krKyl7c2hpZnQ9aSUzO3Z8PWRhdGFbaV08PCgxNj4+PnNoaWZ0JjI0KTtpZihzaGlmdD09PTIpe2VuY29kZWQrPVN0cmluZy5mcm9tQ2hhckNvZGUoZW5jb2RlQml0cyh2Pj4+MTgmNjMpLGVuY29kZUJpdHModj4+PjEyJjYzKSxlbmNvZGVCaXRzKHY+Pj42JjYzKSxlbmNvZGVCaXRzKHYmNjMpKTt2PTA7fX0KaWYoc2hpZnQ9PT0wKQplbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksNjEsNjEpO2Vsc2UgaWYoc2hpZnQ9PT0xKQplbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksZW5jb2RlQml0cyh2Pj4+NiY2MyksNjEpO3JldHVybiBlbmNvZGVkO307U3RyaW5nLm5hdHVyYWxPcmRlckNvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXtjb25zdCBjaHVuaz0vXlxkK3xeXEQrLztsZXQgY2h1bmthLGNodW5rYixhbnVtLGJudW07d2hpbGUoMSl7aWYoYSl7aWYoIWIpCnJldHVybiAxO31lbHNle2lmKGIpCnJldHVybi0xO2Vsc2UKcmV0dXJuIDA7fQpjaHVua2E9YS5tYXRjaChjaHVuaylbMF07Y2h1bmtiPWIubWF0Y2goY2h1bmspWzBdO2FudW09IWlzTmFOKGNodW5rYSk7Ym51bT0haXNOYU4oY2h1bmtiKTtpZihhbnVtJiYhYm51bSkKcmV0dXJuLTE7aWYoYm51bSYmIWFudW0pCnJldHVybiAxO2lmKGFudW0mJmJudW0pe2NvbnN0IGRpZmY9Y2h1bmthLWNodW5rYjtpZihkaWZmKQpyZXR1cm4gZGlmZjtpZihjaHVua2EubGVuZ3RoIT09Y2h1bmtiLmxlbmd0aCl7aWYoIStjaHVua2EmJiErY2h1bmtiKQpyZXR1cm4gY2h1bmthLmxlbmd0aC1jaHVua2IubGVuZ3RoO2Vsc2UKcmV0dXJuIGNodW5rYi5sZW5ndGgtY2h1bmthLmxlbmd0aDt9fWVsc2UgaWYoY2h1bmthIT09Y2h1bmtiKXtyZXR1cm4oY2h1bmthPGNodW5rYik/LTE6MTt9CmE9YS5zdWJzdHJpbmcoY2h1bmthLmxlbmd0aCk7Yj1iLnN1YnN0cmluZyhjaHVua2IubGVuZ3RoKTt9fTtTdHJpbmcuY2FzZUluc2Vuc2V0aXZlQ29tcGFyYXRvcj1mdW5jdGlvbihhLGIpe2E9YS50b1VwcGVyQ2FzZSgpO2I9Yi50b1VwcGVyQ2FzZSgpO2lmKGE9PT1iKQpyZXR1cm4gMDtyZXR1cm4gYT5iPzE6LTE7fTtOdW1iZXIuY29uc3RyYWluPWZ1bmN0aW9uKG51bSxtaW4sbWF4KXtpZihudW08bWluKQpudW09bWluO2Vsc2UgaWYobnVtPm1heCkKbnVtPW1heDtyZXR1cm4gbnVtO307TnVtYmVyLmdjZD1mdW5jdGlvbihhLGIpe2lmKGI9PT0wKQpyZXR1cm4gYTtlbHNlCnJldHVybiBOdW1iZXIuZ2NkKGIsYSViKTt9O051bWJlci50b0ZpeGVkSWZGbG9hdGluZz1mdW5jdGlvbih2YWx1ZSl7aWYoIXZhbHVlfHxpc05hTih2YWx1ZSkpCnJldHVybiB2YWx1ZTtjb25zdCBudW1iZXI9TnVtYmVyKHZhbHVlKTtyZXR1cm4gbnVtYmVyJTE/bnVtYmVyLnRvRml4ZWQoMyk6U3RyaW5nKG51bWJlcik7fTtEYXRlLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIWlzTmFOKHRoaXMuZ2V0VGltZSgpKTt9O0RhdGUucHJvdG90eXBlLnRvSVNPODYwMUNvbXBhY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsZWFkWmVybyh4KXtyZXR1cm4oeD45PycnOicwJykreDt9CnJldHVybiB0aGlzLmdldEZ1bGxZZWFyKCkrbGVhZFplcm8odGhpcy5nZXRNb250aCgpKzEpK2xlYWRaZXJvKHRoaXMuZ2V0RGF0ZSgpKSsnVCcrCmxlYWRaZXJvKHRoaXMuZ2V0SG91cnMoKSkrbGVhZFplcm8odGhpcy5nZXRNaW51dGVzKCkpK2xlYWRaZXJvKHRoaXMuZ2V0U2Vjb25kcygpKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3JlbW92ZScse3ZhbHVlOmZ1bmN0aW9uKHZhbHVlLGZpcnN0T25seSl7bGV0IGluZGV4PXRoaXMuaW5kZXhPZih2YWx1ZSk7aWYoaW5kZXg9PT0tMSkKcmV0dXJuIGZhbHNlO2lmKGZpcnN0T25seSl7dGhpcy5zcGxpY2UoaW5kZXgsMSk7cmV0dXJuIHRydWU7fQpmb3IobGV0IGk9aW5kZXgrMSxuPXRoaXMubGVuZ3RoO2k8bjsrK2kpe2lmKHRoaXNbaV0hPT12YWx1ZSkKdGhpc1tpbmRleCsrXT10aGlzW2ldO30KdGhpcy5sZW5ndGg9aW5kZXg7cmV0dXJuIHRydWU7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3B1c2hBbGwnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSl7Zm9yKGxldCBpPTA7aTxhcnJheS5sZW5ndGg7KytpKQp0aGlzLnB1c2goYXJyYXlbaV0pO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdyb3RhdGUnLHt2YWx1ZTpmdW5jdGlvbihpbmRleCl7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT1pbmRleDtpPGluZGV4K3RoaXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2godGhpc1tpJXRoaXMubGVuZ3RoXSk7cmV0dXJuIHJlc3VsdDt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnc29ydE51bWJlcnMnLHt2YWx1ZTpmdW5jdGlvbigpe2Z1bmN0aW9uIG51bWVyaWNDb21wYXJhdG9yKGEsYil7cmV0dXJuIGEtYjt9CnRoaXMuc29ydChudW1lcmljQ29tcGFyYXRvcik7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsJ3NvcnQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUuc29ydH0pOyhmdW5jdGlvbigpe2NvbnN0IHBhcnRpdGlvbj17dmFsdWU6ZnVuY3Rpb24oY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHBpdm90SW5kZXgpe2Z1bmN0aW9uIHN3YXAoYXJyYXksaTEsaTIpe2NvbnN0IHRlbXA9YXJyYXlbaTFdO2FycmF5W2kxXT1hcnJheVtpMl07YXJyYXlbaTJdPXRlbXA7fQpjb25zdCBwaXZvdFZhbHVlPXRoaXNbcGl2b3RJbmRleF07c3dhcCh0aGlzLHJpZ2h0LHBpdm90SW5kZXgpO2xldCBzdG9yZUluZGV4PWxlZnQ7Zm9yKGxldCBpPWxlZnQ7aTxyaWdodDsrK2kpe2lmKGNvbXBhcmF0b3IodGhpc1tpXSxwaXZvdFZhbHVlKTwwKXtzd2FwKHRoaXMsc3RvcmVJbmRleCxpKTsrK3N0b3JlSW5kZXg7fX0Kc3dhcCh0aGlzLHJpZ2h0LHN0b3JlSW5kZXgpO3JldHVybiBzdG9yZUluZGV4O319O09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3BhcnRpdGlvbicscGFydGl0aW9uKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCdwYXJ0aXRpb24nLHBhcnRpdGlvbik7Y29uc3Qgc29ydFJhbmdlPXt2YWx1ZTpmdW5jdGlvbihjb21wYXJhdG9yLGxlZnRCb3VuZCxyaWdodEJvdW5kLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCl7ZnVuY3Rpb24gcXVpY2tTb3J0UmFuZ2UoYXJyYXksY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCl7aWYocmlnaHQ8PWxlZnQpCnJldHVybjtjb25zdCBwaXZvdEluZGV4PU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoocmlnaHQtbGVmdCkpK2xlZnQ7Y29uc3QgcGl2b3ROZXdJbmRleD1hcnJheS5wYXJ0aXRpb24oY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHBpdm90SW5kZXgpO2lmKHNvcnRXaW5kb3dMZWZ0PHBpdm90TmV3SW5kZXgpCnF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IsbGVmdCxwaXZvdE5ld0luZGV4LTEsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KTtpZihwaXZvdE5ld0luZGV4PHNvcnRXaW5kb3dSaWdodCkKcXVpY2tTb3J0UmFuZ2UoYXJyYXksY29tcGFyYXRvcixwaXZvdE5ld0luZGV4KzEscmlnaHQsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KTt9CmlmKGxlZnRCb3VuZD09PTAmJnJpZ2h0Qm91bmQ9PT0odGhpcy5sZW5ndGgtMSkmJnNvcnRXaW5kb3dMZWZ0PT09MCYmc29ydFdpbmRvd1JpZ2h0Pj1yaWdodEJvdW5kKQp0aGlzLnNvcnQoY29tcGFyYXRvcik7ZWxzZQpxdWlja1NvcnRSYW5nZSh0aGlzLGNvbXBhcmF0b3IsbGVmdEJvdW5kLHJpZ2h0Qm91bmQsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KTtyZXR1cm4gdGhpczt9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdzb3J0UmFuZ2UnLHNvcnRSYW5nZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwnc29ydFJhbmdlJyxzb3J0UmFuZ2UpO30pKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnc3RhYmxlU29ydCcse3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmF0b3Ipe2Z1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsYil7cmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO2NvbnN0IGluZGljZXM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IobGV0IGk9MDtpPHRoaXMubGVuZ3RoOysraSkKaW5kaWNlc1tpXT1pO2NvbnN0IHNlbGY9dGhpcztmdW5jdGlvbiBpbmRleENvbXBhcmF0b3IoYSxiKXtjb25zdCByZXN1bHQ9Y29tcGFyYXRvcihzZWxmW2FdLHNlbGZbYl0pO3JldHVybiByZXN1bHQ/cmVzdWx0OmEtYjt9CmluZGljZXMuc29ydChpbmRleENvbXBhcmF0b3IpO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGg7KytpKXtpZihpbmRpY2VzW2ldPDB8fGk9PT1pbmRpY2VzW2ldKQpjb250aW51ZTtsZXQgY3ljbGljYWw9aTtjb25zdCBzYXZlZD10aGlzW2ldO3doaWxlKHRydWUpe2NvbnN0IG5leHQ9aW5kaWNlc1tjeWNsaWNhbF07aW5kaWNlc1tjeWNsaWNhbF09LTE7aWYobmV4dD09PWkpe3RoaXNbY3ljbGljYWxdPXNhdmVkO2JyZWFrO31lbHNle3RoaXNbY3ljbGljYWxdPXRoaXNbbmV4dF07Y3ljbGljYWw9bmV4dDt9fX0KcmV0dXJuIHRoaXM7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3FzZWxlY3QnLHt2YWx1ZTpmdW5jdGlvbihrLGNvbXBhcmF0b3Ipe2lmKGs8MHx8az49dGhpcy5sZW5ndGgpCnJldHVybjtpZighY29tcGFyYXRvcil7Y29tcGFyYXRvcj1mdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fTt9CmxldCBsb3c9MDtsZXQgaGlnaD10aGlzLmxlbmd0aC0xO2Zvcig7Oyl7Y29uc3QgcGl2b3RQb3NpdGlvbj10aGlzLnBhcnRpdGlvbihjb21wYXJhdG9yLGxvdyxoaWdoLE1hdGguZmxvb3IoKGhpZ2grbG93KS8yKSk7aWYocGl2b3RQb3NpdGlvbj09PWspCnJldHVybiB0aGlzW2tdO2Vsc2UgaWYocGl2b3RQb3NpdGlvbj5rKQpoaWdoPXBpdm90UG9zaXRpb24tMTtlbHNlCmxvdz1waXZvdFBvc2l0aW9uKzE7fX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6ZnVuY3Rpb24ob2JqZWN0LGNvbXBhcmF0b3IsbGVmdCxyaWdodCl7ZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSxiKXtyZXR1cm4gYTxiPy0xOihhPmI/MTowKTt9CmNvbXBhcmF0b3I9Y29tcGFyYXRvcnx8ZGVmYXVsdENvbXBhcmF0b3I7bGV0IGw9bGVmdHx8MDtsZXQgcj1yaWdodCE9PXVuZGVmaW5lZD9yaWdodDp0aGlzLmxlbmd0aDt3aGlsZShsPHIpe2NvbnN0IG09KGwrcik+PjE7aWYoY29tcGFyYXRvcihvYmplY3QsdGhpc1ttXSk+MCkKbD1tKzE7ZWxzZQpyPW07fQpyZXR1cm4gcjt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwndXBwZXJCb3VuZCcse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpe2Z1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsYil7cmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO2xldCBsPWxlZnR8fDA7bGV0IHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXtjb25zdCBtPShsK3IpPj4xO2lmKGNvbXBhcmF0b3Iob2JqZWN0LHRoaXNbbV0pPj0wKQpsPW0rMTtlbHNlCnI9bTt9CnJldHVybiByO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCd1cHBlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLnVwcGVyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzJBcnJheS5wcm90b3R5cGUsJ2xvd2VyQm91bmQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUubG93ZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnQzMkFycmF5LnByb3RvdHlwZSwndXBwZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS51cHBlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEZsb2F0NjRBcnJheS5wcm90b3R5cGUsJ2xvd2VyQm91bmQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUubG93ZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ2JpbmFyeUluZGV4T2YnLHt2YWx1ZTpmdW5jdGlvbih2YWx1ZSxjb21wYXJhdG9yKXtjb25zdCBpbmRleD10aGlzLmxvd2VyQm91bmQodmFsdWUsY29tcGFyYXRvcik7cmV0dXJuIGluZGV4PHRoaXMubGVuZ3RoJiZjb21wYXJhdG9yKHZhbHVlLHRoaXNbaW5kZXhdKT09PTA/aW5kZXg6LTE7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3NlbGVjdCcse3ZhbHVlOmZ1bmN0aW9uKGZpZWxkKXtjb25zdCByZXN1bHQ9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IobGV0IGk9MDtpPHRoaXMubGVuZ3RoOysraSkKcmVzdWx0W2ldPXRoaXNbaV1bZmllbGRdO3JldHVybiByZXN1bHQ7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3BlZWtMYXN0Jyx7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXTt9fSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbWVyZ2VPckludGVyc2VjdChhcnJheTEsYXJyYXkyLGNvbXBhcmF0b3IsbWVyZ2VOb3RJbnRlcnNlY3Qpe2NvbnN0IHJlc3VsdD1bXTtsZXQgaT0wO2xldCBqPTA7d2hpbGUoaTxhcnJheTEubGVuZ3RoJiZqPGFycmF5Mi5sZW5ndGgpe2NvbnN0IGNvbXBhcmVWYWx1ZT1jb21wYXJhdG9yKGFycmF5MVtpXSxhcnJheTJbal0pO2lmKG1lcmdlTm90SW50ZXJzZWN0fHwhY29tcGFyZVZhbHVlKQpyZXN1bHQucHVzaChjb21wYXJlVmFsdWU8PTA/YXJyYXkxW2ldOmFycmF5MltqXSk7aWYoY29tcGFyZVZhbHVlPD0wKQppKys7aWYoY29tcGFyZVZhbHVlPj0wKQpqKys7fQppZihtZXJnZU5vdEludGVyc2VjdCl7d2hpbGUoaTxhcnJheTEubGVuZ3RoKQpyZXN1bHQucHVzaChhcnJheTFbaSsrXSk7d2hpbGUoajxhcnJheTIubGVuZ3RoKQpyZXN1bHQucHVzaChhcnJheTJbaisrXSk7fQpyZXR1cm4gcmVzdWx0O30KT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnaW50ZXJzZWN0T3JkZXJlZCcse3ZhbHVlOmZ1bmN0aW9uKGFycmF5LGNvbXBhcmF0b3Ipe3JldHVybiBtZXJnZU9ySW50ZXJzZWN0KHRoaXMsYXJyYXksY29tcGFyYXRvcixmYWxzZSk7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ21lcmdlT3JkZXJlZCcse3ZhbHVlOmZ1bmN0aW9uKGFycmF5LGNvbXBhcmF0b3Ipe3JldHVybiBtZXJnZU9ySW50ZXJzZWN0KHRoaXMsYXJyYXksY29tcGFyYXRvcix0cnVlKTt9fSk7fSkoKTtTdHJpbmcuc3ByaW50Zj1mdW5jdGlvbihmb3JtYXQsdmFyX2FyZyl7cmV0dXJuIFN0cmluZy52c3ByaW50Zihmb3JtYXQsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTt9O1N0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZz1mdW5jdGlvbihmb3JtYXQsZm9ybWF0dGVycyl7Y29uc3QgdG9rZW5zPVtdO2Z1bmN0aW9uIGFkZFN0cmluZ1Rva2VuKHN0cil7aWYoIXN0cikKcmV0dXJuO2lmKHRva2Vucy5sZW5ndGgmJnRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnR5cGU9PT0nc3RyaW5nJykKdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udmFsdWUrPXN0cjtlbHNlCnRva2Vucy5wdXNoKHt0eXBlOidzdHJpbmcnLHZhbHVlOnN0cn0pO30KZnVuY3Rpb24gYWRkU3BlY2lmaWVyVG9rZW4oc3BlY2lmaWVyLHByZWNpc2lvbixzdWJzdGl0dXRpb25JbmRleCl7dG9rZW5zLnB1c2goe3R5cGU6J3NwZWNpZmllcicsc3BlY2lmaWVyOnNwZWNpZmllcixwcmVjaXNpb246cHJlY2lzaW9uLHN1YnN0aXR1dGlvbkluZGV4OnN1YnN0aXR1dGlvbkluZGV4fSk7fQpmdW5jdGlvbiBhZGRBbnNpQ29sb3IoY29kZSl7Y29uc3QgdHlwZXM9ezM6J2NvbG9yJyw5Oidjb2xvckxpZ2h0Jyw0OidiZ0NvbG9yJywxMDonYmdDb2xvckxpZ2h0J307Y29uc3QgY29sb3JDb2Rlcz1bJ2JsYWNrJywncmVkJywnZ3JlZW4nLCd5ZWxsb3cnLCdibHVlJywnbWFnZW50YScsJ2N5YW4nLCdsaWdodEdyYXknLCcnLCdkZWZhdWx0J107Y29uc3QgY29sb3JDb2Rlc0xpZ2h0PVsnZGFya0dyYXknLCdsaWdodFJlZCcsJ2xpZ2h0R3JlZW4nLCdsaWdodFllbGxvdycsJ2xpZ2h0Qmx1ZScsJ2xpZ2h0TWFnZW50YScsJ2xpZ2h0Q3lhbicsJ3doaXRlJywnJ107Y29uc3QgY29sb3JzPXtjb2xvcjpjb2xvckNvZGVzLGNvbG9yTGlnaHQ6Y29sb3JDb2Rlc0xpZ2h0LGJnQ29sb3I6Y29sb3JDb2RlcyxiZ0NvbG9yTGlnaHQ6Y29sb3JDb2Rlc0xpZ2h0fTtjb25zdCB0eXBlPXR5cGVzW01hdGguZmxvb3IoY29kZS8xMCldO2lmKCF0eXBlKQpyZXR1cm47Y29uc3QgY29sb3I9Y29sb3JzW3R5cGVdW2NvZGUlMTBdO2lmKCFjb2xvcikKcmV0dXJuO3Rva2Vucy5wdXNoKHt0eXBlOidzcGVjaWZpZXInLHNwZWNpZmllcjonYycsdmFsdWU6e2Rlc2NyaXB0aW9uOih0eXBlLnN0YXJ0c1dpdGgoJ2JnJyk/J2JhY2tncm91bmQgOiAnOidjb2xvcjogJykrY29sb3J9fSk7fQpsZXQgdGV4dFN0YXJ0PTA7bGV0IHN1YnN0aXR1dGlvbkluZGV4PTA7Y29uc3QgcmU9bmV3IFJlZ0V4cChgJSV8JSg/OihcXGQrKVxcJCk/KD86XFwuKFxcZCopKT8oWyR7T2JqZWN0LmtleXMoZm9ybWF0dGVycykuam9pbignJyl9XSl8XFx1MDAxYlxcWyhcXGQrKW1gLCdnJyk7Zm9yKGxldCBtYXRjaD1yZS5leGVjKGZvcm1hdCk7ISFtYXRjaDttYXRjaD1yZS5leGVjKGZvcm1hdCkpe2NvbnN0IG1hdGNoU3RhcnQ9bWF0Y2guaW5kZXg7aWYobWF0Y2hTdGFydD50ZXh0U3RhcnQpCmFkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcodGV4dFN0YXJ0LG1hdGNoU3RhcnQpKTtpZihtYXRjaFswXT09PSclJScpe2FkZFN0cmluZ1Rva2VuKCclJyk7fWVsc2UgaWYobWF0Y2hbMF0uc3RhcnRzV2l0aCgnJScpKXtjb25zdFtfLHN1YnN0aXRpb25TdHJpbmcscHJlY2lzaW9uU3RyaW5nLHNwZWNpZmllclN0cmluZ109bWF0Y2g7aWYoc3Vic3RpdGlvblN0cmluZyYmTnVtYmVyKHN1YnN0aXRpb25TdHJpbmcpPjApCnN1YnN0aXR1dGlvbkluZGV4PU51bWJlcihzdWJzdGl0aW9uU3RyaW5nKS0xO2NvbnN0IHByZWNpc2lvbj1wcmVjaXNpb25TdHJpbmc/TnVtYmVyKHByZWNpc2lvblN0cmluZyk6LTE7YWRkU3BlY2lmaWVyVG9rZW4oc3BlY2lmaWVyU3RyaW5nLHByZWNpc2lvbixzdWJzdGl0dXRpb25JbmRleCk7KytzdWJzdGl0dXRpb25JbmRleDt9ZWxzZXtjb25zdCBjb2RlPU51bWJlcihtYXRjaFs0XSk7YWRkQW5zaUNvbG9yKGNvZGUpO30KdGV4dFN0YXJ0PW1hdGNoU3RhcnQrbWF0Y2hbMF0ubGVuZ3RoO30KYWRkU3RyaW5nVG9rZW4oZm9ybWF0LnN1YnN0cmluZyh0ZXh0U3RhcnQpKTtyZXR1cm4gdG9rZW5zO307U3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycz17ZDpmdW5jdGlvbihzdWJzdGl0dXRpb24pe3JldHVybiFpc05hTihzdWJzdGl0dXRpb24pP3N1YnN0aXR1dGlvbjowO30sZjpmdW5jdGlvbihzdWJzdGl0dXRpb24sdG9rZW4pe2lmKHN1YnN0aXR1dGlvbiYmdG9rZW4ucHJlY2lzaW9uPi0xKQpzdWJzdGl0dXRpb249c3Vic3RpdHV0aW9uLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTtyZXR1cm4haXNOYU4oc3Vic3RpdHV0aW9uKT9zdWJzdGl0dXRpb246KHRva2VuLnByZWNpc2lvbj4tMT9OdW1iZXIoMCkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOjApO30sczpmdW5jdGlvbihzdWJzdGl0dXRpb24pe3JldHVybiBzdWJzdGl0dXRpb247fX07U3RyaW5nLnZzcHJpbnRmPWZ1bmN0aW9uKGZvcm1hdCxzdWJzdGl0dXRpb25zKXtyZXR1cm4gU3RyaW5nLmZvcm1hdChmb3JtYXQsc3Vic3RpdHV0aW9ucyxTdHJpbmcuc3RhbmRhcmRGb3JtYXR0ZXJzLCcnLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGErYjt9KS5mb3JtYXR0ZWRSZXN1bHQ7fTtTdHJpbmcuZm9ybWF0PWZ1bmN0aW9uKGZvcm1hdCxzdWJzdGl0dXRpb25zLGZvcm1hdHRlcnMsaW5pdGlhbFZhbHVlLGFwcGVuZCx0b2tlbml6ZWRGb3JtYXQpe2lmKCFmb3JtYXR8fCgoIXN1YnN0aXR1dGlvbnN8fCFzdWJzdGl0dXRpb25zLmxlbmd0aCkmJmZvcm1hdC5zZWFyY2goL1x1MDAxYlxbKFxkKyltLyk9PT0tMSkpCnJldHVybntmb3JtYXR0ZWRSZXN1bHQ6YXBwZW5kKGluaXRpYWxWYWx1ZSxmb3JtYXQpLHVudXNlZFN1YnN0aXR1dGlvbnM6c3Vic3RpdHV0aW9uc307ZnVuY3Rpb24gcHJldHR5RnVuY3Rpb25OYW1lKCl7cmV0dXJuJ1N0cmluZy5mb3JtYXQoIicrZm9ybWF0KyciLCAiJytBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHN1YnN0aXR1dGlvbnMsJyIsICInKSsnIiknO30KZnVuY3Rpb24gd2Fybihtc2cpe2NvbnNvbGUud2FybihwcmV0dHlGdW5jdGlvbk5hbWUoKSsnOiAnK21zZyk7fQpmdW5jdGlvbiBlcnJvcihtc2cpe2NvbnNvbGUuZXJyb3IocHJldHR5RnVuY3Rpb25OYW1lKCkrJzogJyttc2cpO30KbGV0IHJlc3VsdD1pbml0aWFsVmFsdWU7Y29uc3QgdG9rZW5zPXRva2VuaXplZEZvcm1hdHx8U3RyaW5nLnRva2VuaXplRm9ybWF0U3RyaW5nKGZvcm1hdCxmb3JtYXR0ZXJzKTtjb25zdCB1c2VkU3Vic3RpdHV0aW9uSW5kZXhlcz17fTtmb3IobGV0IGk9MDtpPHRva2Vucy5sZW5ndGg7KytpKXtjb25zdCB0b2tlbj10b2tlbnNbaV07aWYodG9rZW4udHlwZT09PSdzdHJpbmcnKXtyZXN1bHQ9YXBwZW5kKHJlc3VsdCx0b2tlbi52YWx1ZSk7Y29udGludWU7fQppZih0b2tlbi50eXBlIT09J3NwZWNpZmllcicpe2Vycm9yKCdVbmtub3duIHRva2VuIHR5cGUgIicrdG9rZW4udHlwZSsnIiBmb3VuZC4nKTtjb250aW51ZTt9CmlmKCF0b2tlbi52YWx1ZSYmdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXg+PXN1YnN0aXR1dGlvbnMubGVuZ3RoKXtlcnJvcignbm90IGVub3VnaCBzdWJzdGl0dXRpb24gYXJndW1lbnRzLiBIYWQgJytzdWJzdGl0dXRpb25zLmxlbmd0aCsnIGJ1dCBuZWVkZWQgJysKKHRva2VuLnN1YnN0aXR1dGlvbkluZGV4KzEpKycsIHNvIHN1YnN0aXR1dGlvbiB3YXMgc2tpcHBlZC4nKTtyZXN1bHQ9YXBwZW5kKHJlc3VsdCwnJScrKHRva2VuLnByZWNpc2lvbj4tMT90b2tlbi5wcmVjaXNpb246JycpK3Rva2VuLnNwZWNpZmllcik7Y29udGludWU7fQppZighdG9rZW4udmFsdWUpCnVzZWRTdWJzdGl0dXRpb25JbmRleGVzW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XT10cnVlO2lmKCEodG9rZW4uc3BlY2lmaWVyIGluIGZvcm1hdHRlcnMpKXt3YXJuKCd1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyIFx1MjAxQycrdG9rZW4uc3BlY2lmaWVyKydcdTIwMUQuIFRyZWF0aW5nIGFzIGEgc3RyaW5nLicpO3Jlc3VsdD1hcHBlbmQocmVzdWx0LHRva2VuLnZhbHVlPycnOnN1YnN0aXR1dGlvbnNbdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXhdKTtjb250aW51ZTt9CnJlc3VsdD1hcHBlbmQocmVzdWx0LGZvcm1hdHRlcnNbdG9rZW4uc3BlY2lmaWVyXSh0b2tlbi52YWx1ZXx8c3Vic3RpdHV0aW9uc1t0b2tlbi5zdWJzdGl0dXRpb25JbmRleF0sdG9rZW4pKTt9CmNvbnN0IHVudXNlZFN1YnN0aXR1dGlvbnM9W107Zm9yKGxldCBpPTA7aTxzdWJzdGl0dXRpb25zLmxlbmd0aDsrK2kpe2lmKGkgaW4gdXNlZFN1YnN0aXR1dGlvbkluZGV4ZXMpCmNvbnRpbnVlO3VudXNlZFN1YnN0aXR1dGlvbnMucHVzaChzdWJzdGl0dXRpb25zW2ldKTt9CnJldHVybntmb3JtYXR0ZWRSZXN1bHQ6cmVzdWx0LHVudXNlZFN1YnN0aXR1dGlvbnM6dW51c2VkU3Vic3RpdHV0aW9uc307fTtmdW5jdGlvbiBjcmVhdGVTZWFyY2hSZWdleChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2NvbnN0IHJlZ2V4RmxhZ3M9Y2FzZVNlbnNpdGl2ZT8nZyc6J2dpJztsZXQgcmVnZXhPYmplY3Q7aWYoaXNSZWdleCl7dHJ5e3JlZ2V4T2JqZWN0PW5ldyBSZWdFeHAocXVlcnkscmVnZXhGbGFncyk7fWNhdGNoKGUpe319CmlmKCFyZWdleE9iamVjdCkKcmVnZXhPYmplY3Q9Y3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgocXVlcnkscmVnZXhGbGFncyk7cmV0dXJuIHJlZ2V4T2JqZWN0O30KZnVuY3Rpb24gY3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgocXVlcnksZmxhZ3Mpe2NvbnN0IHJlZ2V4U3BlY2lhbENoYXJhY3RlcnM9U3RyaW5nLnJlZ2V4U3BlY2lhbENoYXJhY3RlcnMoKTtsZXQgcmVnZXg9Jyc7Zm9yKGxldCBpPTA7aTxxdWVyeS5sZW5ndGg7KytpKXtjb25zdCBjPXF1ZXJ5LmNoYXJBdChpKTtpZihyZWdleFNwZWNpYWxDaGFyYWN0ZXJzLmluZGV4T2YoYykhPT0tMSkKcmVnZXgrPSdcXCc7cmVnZXgrPWM7fQpyZXR1cm4gbmV3IFJlZ0V4cChyZWdleCxmbGFnc3x8JycpO30KZnVuY3Rpb24gY291bnRSZWdleE1hdGNoZXMocmVnZXgsY29udGVudCl7bGV0IHRleHQ9Y29udGVudDtsZXQgcmVzdWx0PTA7bGV0IG1hdGNoO3doaWxlKHRleHQmJihtYXRjaD1yZWdleC5leGVjKHRleHQpKSl7aWYobWF0Y2hbMF0ubGVuZ3RoPjApCisrcmVzdWx0O3RleHQ9dGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXgrMSk7fQpyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gc3BhY2VzUGFkZGluZyhzcGFjZXNDb3VudCl7cmV0dXJuJ1x1MDBhMCcucmVwZWF0KHNwYWNlc0NvdW50KTt9CmZ1bmN0aW9uIG51bWJlclRvU3RyaW5nV2l0aFNwYWNlc1BhZGRpbmcodmFsdWUsc3ltYm9sc0NvdW50KXtjb25zdCBudW1iZXJTdHJpbmc9dmFsdWUudG9TdHJpbmcoKTtjb25zdCBwYWRkaW5nTGVuZ3RoPU1hdGgubWF4KDAsc3ltYm9sc0NvdW50LW51bWJlclN0cmluZy5sZW5ndGgpO3JldHVybiBzcGFjZXNQYWRkaW5nKHBhZGRpbmdMZW5ndGgpK251bWJlclN0cmluZzt9ClNldC5wcm90b3R5cGUudmFsdWVzQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnZhbHVlcygpKTt9O1NldC5wcm90b3R5cGUuZmlyc3RWYWx1ZT1mdW5jdGlvbigpe2lmKCF0aGlzLnNpemUpCnJldHVybiBudWxsO3JldHVybiB0aGlzLnZhbHVlcygpLm5leHQoKS52YWx1ZTt9O1NldC5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKGl0ZXJhYmxlKXtmb3IoY29uc3QgZSBvZiBpdGVyYWJsZSkKdGhpcy5hZGQoZSk7fTtTZXQucHJvdG90eXBlLmNvbnRhaW5zQWxsPWZ1bmN0aW9uKGl0ZXJhYmxlKXtmb3IoY29uc3QgZSBvZiBpdGVyYWJsZSl7aWYoIXRoaXMuaGFzKGUpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9O01hcC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGtleSl7Y29uc3QgdmFsdWU9dGhpcy5nZXQoa2V5KTt0aGlzLmRlbGV0ZShrZXkpO3JldHVybiB2YWx1ZTt9O01hcC5wcm90b3R5cGUudmFsdWVzQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnZhbHVlcygpKTt9O01hcC5wcm90b3R5cGUua2V5c0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5rZXlzKCkpO307TWFwLnByb3RvdHlwZS5pbnZlcnNlPWZ1bmN0aW9uKCl7Y29uc3QgcmVzdWx0PW5ldyBNdWx0aW1hcCgpO2Zvcihjb25zdCBrZXkgb2YgdGhpcy5rZXlzKCkpe2NvbnN0IHZhbHVlPXRoaXMuZ2V0KGtleSk7cmVzdWx0LnNldCh2YWx1ZSxrZXkpO30KcmV0dXJuIHJlc3VsdDt9O3ZhciBNdWx0aW1hcD1mdW5jdGlvbigpe3RoaXMuX21hcD1uZXcgTWFwKCk7fTtNdWx0aW1hcC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihrZXksdmFsdWUpe2xldCBzZXQ9dGhpcy5fbWFwLmdldChrZXkpO2lmKCFzZXQpe3NldD1uZXcgU2V0KCk7dGhpcy5fbWFwLnNldChrZXksc2V0KTt9CnNldC5hZGQodmFsdWUpO30sZ2V0OmZ1bmN0aW9uKGtleSl7cmV0dXJuIHRoaXMuX21hcC5nZXQoa2V5KXx8bmV3IFNldCgpO30saGFzOmZ1bmN0aW9uKGtleSl7cmV0dXJuIHRoaXMuX21hcC5oYXMoa2V5KTt9LGhhc1ZhbHVlOmZ1bmN0aW9uKGtleSx2YWx1ZSl7Y29uc3Qgc2V0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighc2V0KQpyZXR1cm4gZmFsc2U7cmV0dXJuIHNldC5oYXModmFsdWUpO30sZ2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fbWFwLnNpemU7fSxkZWxldGU6ZnVuY3Rpb24oa2V5LHZhbHVlKXtjb25zdCB2YWx1ZXM9dGhpcy5nZXQoa2V5KTtpZighdmFsdWVzKQpyZXR1cm4gZmFsc2U7Y29uc3QgcmVzdWx0PXZhbHVlcy5kZWxldGUodmFsdWUpO2lmKCF2YWx1ZXMuc2l6ZSkKdGhpcy5fbWFwLmRlbGV0ZShrZXkpO3JldHVybiByZXN1bHQ7fSxkZWxldGVBbGw6ZnVuY3Rpb24oa2V5KXt0aGlzLl9tYXAuZGVsZXRlKGtleSk7fSxrZXlzQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLmtleXNBcnJheSgpO30sdmFsdWVzQXJyYXk6ZnVuY3Rpb24oKXtjb25zdCByZXN1bHQ9W107Y29uc3Qga2V5cz10aGlzLmtleXNBcnJheSgpO2ZvcihsZXQgaT0wO2k8a2V5cy5sZW5ndGg7KytpKQpyZXN1bHQucHVzaEFsbCh0aGlzLmdldChrZXlzW2ldKS52YWx1ZXNBcnJheSgpKTtyZXR1cm4gcmVzdWx0O30sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLl9tYXAuY2xlYXIoKTt9fTtmdW5jdGlvbiBsb2FkWEhSKHVybCl7cmV0dXJuIG5ldyBQcm9taXNlKGxvYWQpO2Z1bmN0aW9uIGxvYWQoc3VjY2Vzc0NhbGxiYWNrLGZhaWx1cmVDYWxsYmFjayl7ZnVuY3Rpb24gb25SZWFkeVN0YXRlQ2hhbmdlZCgpe2lmKHhoci5yZWFkeVN0YXRlIT09WE1MSHR0cFJlcXVlc3QuRE9ORSkKcmV0dXJuO2lmKHhoci5zdGF0dXMhPT0yMDApe3hoci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtmYWlsdXJlQ2FsbGJhY2sobmV3IEVycm9yKHhoci5zdGF0dXMpKTtyZXR1cm47fQp4aHIub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7c3VjY2Vzc0NhbGxiYWNrKHhoci5yZXNwb25zZVRleHQpO30KY29uc3QgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdCgpO3hoci53aXRoQ3JlZGVudGlhbHM9ZmFsc2U7eGhyLm9wZW4oJ0dFVCcsdXJsLHRydWUpO3hoci5vbnJlYWR5c3RhdGVjaGFuZ2U9b25SZWFkeVN0YXRlQ2hhbmdlZDt4aHIuc2VuZChudWxsKTt9fQpmdW5jdGlvbiBzdXBwcmVzc1VudXNlZCh2YWx1ZSl7fQpzZWxmLnNldEltbWVkaWF0ZT1mdW5jdGlvbihjYWxsYmFjayl7Y29uc3QgYXJncz1bLi4uYXJndW1lbnRzXS5zbGljZSgxKTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5jYWxsYmFjayguLi5hcmdzKSk7cmV0dXJuIDA7fTtQcm9taXNlLnByb3RvdHlwZS5zcHJlYWQ9ZnVuY3Rpb24oY2FsbGJhY2spe3JldHVybiB0aGlzLnRoZW4oc3ByZWFkUHJvbWlzZSk7ZnVuY3Rpb24gc3ByZWFkUHJvbWlzZShhcmcpe3JldHVybiBjYWxsYmFjay5hcHBseShudWxsLGFyZyk7fX07UHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hFeGNlcHRpb249ZnVuY3Rpb24oZGVmYXVsdFZhbHVlKXtyZXR1cm4gdGhpcy5jYXRjaChmdW5jdGlvbihlcnJvcil7Y29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJuIGRlZmF1bHRWYWx1ZTt9KTt9O01hcC5wcm90b3R5cGUuZGlmZj1mdW5jdGlvbihvdGhlcixpc0VxdWFsKXtjb25zdCBsZWZ0S2V5cz10aGlzLmtleXNBcnJheSgpO2NvbnN0IHJpZ2h0S2V5cz1vdGhlci5rZXlzQXJyYXkoKTtsZWZ0S2V5cy5zb3J0KChhLGIpPT5hLWIpO3JpZ2h0S2V5cy5zb3J0KChhLGIpPT5hLWIpO2NvbnN0IHJlbW92ZWQ9W107Y29uc3QgYWRkZWQ9W107Y29uc3QgZXF1YWw9W107bGV0IGxlZnRJbmRleD0wO2xldCByaWdodEluZGV4PTA7d2hpbGUobGVmdEluZGV4PGxlZnRLZXlzLmxlbmd0aCYmcmlnaHRJbmRleDxyaWdodEtleXMubGVuZ3RoKXtjb25zdCBsZWZ0S2V5PWxlZnRLZXlzW2xlZnRJbmRleF07Y29uc3QgcmlnaHRLZXk9cmlnaHRLZXlzW3JpZ2h0SW5kZXhdO2lmKGxlZnRLZXk9PT1yaWdodEtleSYmaXNFcXVhbCh0aGlzLmdldChsZWZ0S2V5KSxvdGhlci5nZXQocmlnaHRLZXkpKSl7ZXF1YWwucHVzaCh0aGlzLmdldChsZWZ0S2V5KSk7KytsZWZ0SW5kZXg7KytyaWdodEluZGV4O2NvbnRpbnVlO30KaWYobGVmdEtleTw9cmlnaHRLZXkpe3JlbW92ZWQucHVzaCh0aGlzLmdldChsZWZ0S2V5KSk7KytsZWZ0SW5kZXg7Y29udGludWU7fQphZGRlZC5wdXNoKG90aGVyLmdldChyaWdodEtleSkpOysrcmlnaHRJbmRleDt9CndoaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgpe2NvbnN0IGxlZnRLZXk9bGVmdEtleXNbbGVmdEluZGV4KytdO3JlbW92ZWQucHVzaCh0aGlzLmdldChsZWZ0S2V5KSk7fQp3aGlsZShyaWdodEluZGV4PHJpZ2h0S2V5cy5sZW5ndGgpe2NvbnN0IHJpZ2h0S2V5PXJpZ2h0S2V5c1tyaWdodEluZGV4KytdO2FkZGVkLnB1c2gob3RoZXIuZ2V0KHJpZ2h0S2V5KSk7fQpyZXR1cm57YWRkZWQ6YWRkZWQscmVtb3ZlZDpyZW1vdmVkLGVxdWFsOmVxdWFsfTt9O2Z1bmN0aW9uIHJ1bk9uV2luZG93TG9hZChjYWxsYmFjayl7ZnVuY3Rpb24gd2luZG93TG9hZGVkKCl7c2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJyx3aW5kb3dMb2FkZWQsZmFsc2UpO2NhbGxiYWNrKCk7fQppZihkb2N1bWVudC5yZWFkeVN0YXRlPT09J2NvbXBsZXRlJ3x8ZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdpbnRlcmFjdGl2ZScpCmNhbGxiYWNrKCk7ZWxzZQpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLHdpbmRvd0xvYWRlZCxmYWxzZSk7fQpjb25zdCBfc2luZ2xldG9uU3ltYm9sPVN5bWJvbCgnc2luZ2xldG9uJyk7ZnVuY3Rpb24gc2luZ2xldG9uKGNvbnN0cnVjdG9yRnVuY3Rpb24pe2lmKF9zaW5nbGV0b25TeW1ib2wgaW4gY29uc3RydWN0b3JGdW5jdGlvbikKcmV0dXJuIGNvbnN0cnVjdG9yRnVuY3Rpb25bX3NpbmdsZXRvblN5bWJvbF07Y29uc3QgaW5zdGFuY2U9bmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24oKTtjb25zdHJ1Y3RvckZ1bmN0aW9uW19zaW5nbGV0b25TeW1ib2xdPWluc3RhbmNlO3JldHVybiBpbnN0YW5jZTt9O3NlbGZbJ1RleHRVdGlscyddPXNlbGZbJ1RleHRVdGlscyddfHx7fTtUZXh0VXRpbHMuVGV4dD1jbGFzc3tjb25zdHJ1Y3Rvcih2YWx1ZSl7dGhpcy5fdmFsdWU9dmFsdWU7fQpsaW5lRW5kaW5ncygpe2lmKCF0aGlzLl9saW5lRW5kaW5ncykKdGhpcy5fbGluZUVuZGluZ3M9dGhpcy5fdmFsdWUuY29tcHV0ZUxpbmVFbmRpbmdzKCk7cmV0dXJuIHRoaXMuX2xpbmVFbmRpbmdzO30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWU7fQpsaW5lQ291bnQoKXtjb25zdCBsaW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzKCk7cmV0dXJuIGxpbmVFbmRpbmdzLmxlbmd0aDt9Cm9mZnNldEZyb21Qb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7cmV0dXJuKGxpbmVOdW1iZXI/dGhpcy5saW5lRW5kaW5ncygpW2xpbmVOdW1iZXItMV0rMTowKStjb2x1bW5OdW1iZXI7fQpwb3NpdGlvbkZyb21PZmZzZXQob2Zmc2V0KXtjb25zdCBsaW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzKCk7Y29uc3QgbGluZU51bWJlcj1saW5lRW5kaW5ncy5sb3dlckJvdW5kKG9mZnNldCk7cmV0dXJue2xpbmVOdW1iZXI6bGluZU51bWJlcixjb2x1bW5OdW1iZXI6b2Zmc2V0LShsaW5lTnVtYmVyJiYobGluZUVuZGluZ3NbbGluZU51bWJlci0xXSsxKSl9O30KbGluZUF0KGxpbmVOdW1iZXIpe2NvbnN0IGxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MoKTtjb25zdCBsaW5lU3RhcnQ9bGluZU51bWJlcj4wP2xpbmVFbmRpbmdzW2xpbmVOdW1iZXItMV0rMTowO2NvbnN0IGxpbmVFbmQ9bGluZUVuZGluZ3NbbGluZU51bWJlcl07bGV0IGxpbmVDb250ZW50PXRoaXMuX3ZhbHVlLnN1YnN0cmluZyhsaW5lU3RhcnQsbGluZUVuZCk7aWYobGluZUNvbnRlbnQubGVuZ3RoPjAmJmxpbmVDb250ZW50LmNoYXJBdChsaW5lQ29udGVudC5sZW5ndGgtMSk9PT0nXHInKQpsaW5lQ29udGVudD1saW5lQ29udGVudC5zdWJzdHJpbmcoMCxsaW5lQ29udGVudC5sZW5ndGgtMSk7cmV0dXJuIGxpbmVDb250ZW50O30KdG9Tb3VyY2VSYW5nZShyYW5nZSl7Y29uc3Qgc3RhcnQ9dGhpcy5vZmZzZXRGcm9tUG9zaXRpb24ocmFuZ2Uuc3RhcnRMaW5lLHJhbmdlLnN0YXJ0Q29sdW1uKTtjb25zdCBlbmQ9dGhpcy5vZmZzZXRGcm9tUG9zaXRpb24ocmFuZ2UuZW5kTGluZSxyYW5nZS5lbmRDb2x1bW4pO3JldHVybiBuZXcgVGV4dFV0aWxzLlNvdXJjZVJhbmdlKHN0YXJ0LGVuZC1zdGFydCk7fQp0b1RleHRSYW5nZShzb3VyY2VSYW5nZSl7Y29uc3QgY3Vyc29yPW5ldyBUZXh0VXRpbHMuVGV4dEN1cnNvcih0aGlzLmxpbmVFbmRpbmdzKCkpO2NvbnN0IHJlc3VsdD1UZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbigwLDApO2N1cnNvci5yZXNldFRvKHNvdXJjZVJhbmdlLm9mZnNldCk7cmVzdWx0LnN0YXJ0TGluZT1jdXJzb3IubGluZU51bWJlcigpO3Jlc3VsdC5zdGFydENvbHVtbj1jdXJzb3IuY29sdW1uTnVtYmVyKCk7Y3Vyc29yLmFkdmFuY2Uoc291cmNlUmFuZ2Uub2Zmc2V0K3NvdXJjZVJhbmdlLmxlbmd0aCk7cmVzdWx0LmVuZExpbmU9Y3Vyc29yLmxpbmVOdW1iZXIoKTtyZXN1bHQuZW5kQ29sdW1uPWN1cnNvci5jb2x1bW5OdW1iZXIoKTtyZXR1cm4gcmVzdWx0O30KcmVwbGFjZVJhbmdlKHJhbmdlLHJlcGxhY2VtZW50KXtjb25zdCBzb3VyY2VSYW5nZT10aGlzLnRvU291cmNlUmFuZ2UocmFuZ2UpO3JldHVybiB0aGlzLl92YWx1ZS5zdWJzdHJpbmcoMCxzb3VyY2VSYW5nZS5vZmZzZXQpK3JlcGxhY2VtZW50Kwp0aGlzLl92YWx1ZS5zdWJzdHJpbmcoc291cmNlUmFuZ2Uub2Zmc2V0K3NvdXJjZVJhbmdlLmxlbmd0aCk7fQpleHRyYWN0KHJhbmdlKXtjb25zdCBzb3VyY2VSYW5nZT10aGlzLnRvU291cmNlUmFuZ2UocmFuZ2UpO3JldHVybiB0aGlzLl92YWx1ZS5zdWJzdHIoc291cmNlUmFuZ2Uub2Zmc2V0LHNvdXJjZVJhbmdlLmxlbmd0aCk7fX07VGV4dFV0aWxzLlRleHQuUG9zaXRpb247VGV4dFV0aWxzLlRleHRDdXJzb3I9Y2xhc3N7Y29uc3RydWN0b3IobGluZUVuZGluZ3Mpe3RoaXMuX2xpbmVFbmRpbmdzPWxpbmVFbmRpbmdzO3RoaXMuX29mZnNldD0wO3RoaXMuX2xpbmVOdW1iZXI9MDt0aGlzLl9jb2x1bW5OdW1iZXI9MDt9CmFkdmFuY2Uob2Zmc2V0KXt0aGlzLl9vZmZzZXQ9b2Zmc2V0O3doaWxlKHRoaXMuX2xpbmVOdW1iZXI8dGhpcy5fbGluZUVuZGluZ3MubGVuZ3RoJiZ0aGlzLl9saW5lRW5kaW5nc1t0aGlzLl9saW5lTnVtYmVyXTx0aGlzLl9vZmZzZXQpCisrdGhpcy5fbGluZU51bWJlcjt0aGlzLl9jb2x1bW5OdW1iZXI9dGhpcy5fbGluZU51bWJlcj90aGlzLl9vZmZzZXQtdGhpcy5fbGluZUVuZGluZ3NbdGhpcy5fbGluZU51bWJlci0xXS0xOnRoaXMuX29mZnNldDt9Cm9mZnNldCgpe3JldHVybiB0aGlzLl9vZmZzZXQ7fQpyZXNldFRvKG9mZnNldCl7dGhpcy5fb2Zmc2V0PW9mZnNldDt0aGlzLl9saW5lTnVtYmVyPXRoaXMuX2xpbmVFbmRpbmdzLmxvd2VyQm91bmQob2Zmc2V0KTt0aGlzLl9jb2x1bW5OdW1iZXI9dGhpcy5fbGluZU51bWJlcj90aGlzLl9vZmZzZXQtdGhpcy5fbGluZUVuZGluZ3NbdGhpcy5fbGluZU51bWJlci0xXS0xOnRoaXMuX29mZnNldDt9CmxpbmVOdW1iZXIoKXtyZXR1cm4gdGhpcy5fbGluZU51bWJlcjt9CmNvbHVtbk51bWJlcigpe3JldHVybiB0aGlzLl9jb2x1bW5OdW1iZXI7fX07O1RleHRVdGlscy5UZXh0VXRpbHM9e2lzU3RvcENoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuKGNoYXI+JyAnJiZjaGFyPCcwJyl8fChjaGFyPic5JyYmY2hhcjwnQScpfHwoY2hhcj4nWicmJmNoYXI8J18nKXx8KGNoYXI+J18nJiZjaGFyPCdhJyl8fChjaGFyPid6JyYmY2hhcjw9J34nKTt9LGlzV29yZENoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuIVRleHRVdGlscy5UZXh0VXRpbHMuaXNTdG9wQ2hhcihjaGFyKSYmIVRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIoY2hhcik7fSxpc1NwYWNlQ2hhcjpmdW5jdGlvbihjaGFyKXtyZXR1cm4gVGV4dFV0aWxzLlRleHRVdGlscy5fU3BhY2VDaGFyUmVnZXgudGVzdChjaGFyKTt9LGlzV29yZDpmdW5jdGlvbih3b3JkKXtmb3IobGV0IGk9MDtpPHdvcmQubGVuZ3RoOysraSl7aWYoIVRleHRVdGlscy5UZXh0VXRpbHMuaXNXb3JkQ2hhcih3b3JkLmNoYXJBdChpKSkpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30saXNPcGVuaW5nQnJhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiBjaGFyPT09JygnfHxjaGFyPT09J3snO30saXNDbG9zaW5nQnJhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiBjaGFyPT09JyknfHxjaGFyPT09J30nO30saXNCcmFjZUNoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuIFRleHRVdGlscy5UZXh0VXRpbHMuaXNPcGVuaW5nQnJhY2VDaGFyKGNoYXIpfHxUZXh0VXRpbHMuVGV4dFV0aWxzLmlzQ2xvc2luZ0JyYWNlQ2hhcihjaGFyKTt9LHRleHRUb1dvcmRzOmZ1bmN0aW9uKHRleHQsaXNXb3JkQ2hhcix3b3JkQ2FsbGJhY2spe2xldCBzdGFydFdvcmQ9LTE7Zm9yKGxldCBpPTA7aTx0ZXh0Lmxlbmd0aDsrK2kpe2lmKCFpc1dvcmRDaGFyKHRleHQuY2hhckF0KGkpKSl7aWYoc3RhcnRXb3JkIT09LTEpCndvcmRDYWxsYmFjayh0ZXh0LnN1YnN0cmluZyhzdGFydFdvcmQsaSkpO3N0YXJ0V29yZD0tMTt9ZWxzZSBpZihzdGFydFdvcmQ9PT0tMSl7c3RhcnRXb3JkPWk7fX0KaWYoc3RhcnRXb3JkIT09LTEpCndvcmRDYWxsYmFjayh0ZXh0LnN1YnN0cmluZyhzdGFydFdvcmQpKTt9LGxpbmVJbmRlbnQ6ZnVuY3Rpb24obGluZSl7bGV0IGluZGVudGF0aW9uPTA7d2hpbGUoaW5kZW50YXRpb248bGluZS5sZW5ndGgmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIobGluZS5jaGFyQXQoaW5kZW50YXRpb24pKSkKKytpbmRlbnRhdGlvbjtyZXR1cm4gbGluZS5zdWJzdHIoMCxpbmRlbnRhdGlvbik7fSxpc1VwcGVyQ2FzZTpmdW5jdGlvbih0ZXh0KXtyZXR1cm4gdGV4dD09PXRleHQudG9VcHBlckNhc2UoKTt9LGlzTG93ZXJDYXNlOmZ1bmN0aW9uKHRleHQpe3JldHVybiB0ZXh0PT09dGV4dC50b0xvd2VyQ2FzZSgpO30sc3BsaXRTdHJpbmdCeVJlZ2V4ZXModGV4dCxyZWdleGVzKXtjb25zdCBtYXRjaGVzPVtdO2NvbnN0IGdsb2JhbFJlZ2V4ZXM9W107Zm9yKGxldCBpPTA7aTxyZWdleGVzLmxlbmd0aDtpKyspe2NvbnN0IHJlZ2V4PXJlZ2V4ZXNbaV07aWYoIXJlZ2V4Lmdsb2JhbCkKZ2xvYmFsUmVnZXhlcy5wdXNoKG5ldyBSZWdFeHAocmVnZXguc291cmNlLHJlZ2V4LmZsYWdzP3JlZ2V4LmZsYWdzKydnJzonZycpKTtlbHNlCmdsb2JhbFJlZ2V4ZXMucHVzaChyZWdleCk7fQpkb1NwbGl0KHRleHQsMCwwKTtyZXR1cm4gbWF0Y2hlcztmdW5jdGlvbiBkb1NwbGl0KHRleHQscmVnZXhJbmRleCxzdGFydEluZGV4KXtpZihyZWdleEluZGV4Pj1nbG9iYWxSZWdleGVzLmxlbmd0aCl7bWF0Y2hlcy5wdXNoKHt2YWx1ZTp0ZXh0LHBvc2l0aW9uOnN0YXJ0SW5kZXgscmVnZXhJbmRleDotMSxjYXB0dXJlR3JvdXBzOltdfSk7cmV0dXJuO30KY29uc3QgcmVnZXg9Z2xvYmFsUmVnZXhlc1tyZWdleEluZGV4XTtsZXQgY3VycmVudEluZGV4PTA7bGV0IHJlc3VsdDtyZWdleC5sYXN0SW5kZXg9MDt3aGlsZSgocmVzdWx0PXJlZ2V4LmV4ZWModGV4dCkpIT09bnVsbCl7Y29uc3Qgc3RyaW5nQmVmb3JlTWF0Y2g9dGV4dC5zdWJzdHJpbmcoY3VycmVudEluZGV4LHJlc3VsdC5pbmRleCk7aWYoc3RyaW5nQmVmb3JlTWF0Y2gpCmRvU3BsaXQoc3RyaW5nQmVmb3JlTWF0Y2gscmVnZXhJbmRleCsxLHN0YXJ0SW5kZXgrY3VycmVudEluZGV4KTtjb25zdCBtYXRjaD1yZXN1bHRbMF07bWF0Y2hlcy5wdXNoKHt2YWx1ZTptYXRjaCxwb3NpdGlvbjpzdGFydEluZGV4K3Jlc3VsdC5pbmRleCxyZWdleEluZGV4OnJlZ2V4SW5kZXgsY2FwdHVyZUdyb3VwczpyZXN1bHQuc2xpY2UoMSl9KTtjdXJyZW50SW5kZXg9cmVzdWx0LmluZGV4K21hdGNoLmxlbmd0aDt9CmNvbnN0IHN0cmluZ0FmdGVyTWF0Y2hlcz10ZXh0LnN1YnN0cmluZyhjdXJyZW50SW5kZXgpO2lmKHN0cmluZ0FmdGVyTWF0Y2hlcykKZG9TcGxpdChzdHJpbmdBZnRlck1hdGNoZXMscmVnZXhJbmRleCsxLHN0YXJ0SW5kZXgrY3VycmVudEluZGV4KTt9fX07VGV4dFV0aWxzLkZpbHRlclBhcnNlcj1jbGFzc3tjb25zdHJ1Y3RvcihrZXlzKXt0aGlzLl9rZXlzPWtleXM7fQpzdGF0aWMgY2xvbmVGaWx0ZXIoZmlsdGVyKXtyZXR1cm57a2V5OmZpbHRlci5rZXksdGV4dDpmaWx0ZXIudGV4dCxyZWdleDpmaWx0ZXIucmVnZXgsbmVnYXRpdmU6ZmlsdGVyLm5lZ2F0aXZlfTt9CnBhcnNlKHF1ZXJ5KXtjb25zdCBzcGxpdFJlc3VsdD1UZXh0VXRpbHMuVGV4dFV0aWxzLnNwbGl0U3RyaW5nQnlSZWdleGVzKHF1ZXJ5LFtUZXh0VXRpbHMuVGV4dFV0aWxzLl9rZXlWYWx1ZUZpbHRlclJlZ2V4LFRleHRVdGlscy5UZXh0VXRpbHMuX3JlZ2V4RmlsdGVyUmVnZXgsVGV4dFV0aWxzLlRleHRVdGlscy5fdGV4dEZpbHRlclJlZ2V4XSk7Y29uc3QgZmlsdGVycz1bXTtmb3IobGV0IGk9MDtpPHNwbGl0UmVzdWx0Lmxlbmd0aDtpKyspe2NvbnN0IHJlZ2V4SW5kZXg9c3BsaXRSZXN1bHRbaV0ucmVnZXhJbmRleDtpZihyZWdleEluZGV4PT09LTEpCmNvbnRpbnVlO2NvbnN0IHJlc3VsdD1zcGxpdFJlc3VsdFtpXS5jYXB0dXJlR3JvdXBzO2lmKHJlZ2V4SW5kZXg9PT0wKXtpZih0aGlzLl9rZXlzLmluZGV4T2YoKHJlc3VsdFsxXSkpIT09LTEpCmZpbHRlcnMucHVzaCh7a2V5OnJlc3VsdFsxXSx0ZXh0OnJlc3VsdFsyXSxuZWdhdGl2ZTohIXJlc3VsdFswXX0pO2Vsc2UKZmlsdGVycy5wdXNoKHt0ZXh0OnJlc3VsdFsxXSsnOicrcmVzdWx0WzJdLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fWVsc2UgaWYocmVnZXhJbmRleD09PTEpe3RyeXtmaWx0ZXJzLnB1c2goe3JlZ2V4Om5ldyBSZWdFeHAocmVzdWx0WzFdLCdpJyksbmVnYXRpdmU6ISFyZXN1bHRbMF19KTt9Y2F0Y2goZSl7ZmlsdGVycy5wdXNoKHt0ZXh0OicvJytyZXN1bHRbMV0rJy8nLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fX1lbHNlIGlmKHJlZ2V4SW5kZXg9PT0yKXtmaWx0ZXJzLnB1c2goe3RleHQ6cmVzdWx0WzFdLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fX0KcmV0dXJuIGZpbHRlcnM7fX07VGV4dFV0aWxzLkZpbHRlclBhcnNlci5QYXJzZWRGaWx0ZXI7VGV4dFV0aWxzLlRleHRVdGlscy5fa2V5VmFsdWVGaWx0ZXJSZWdleD0vKD86XnxccykoXC0pPyhbXHdcLV0rKTooW15cc10rKS87VGV4dFV0aWxzLlRleHRVdGlscy5fcmVnZXhGaWx0ZXJSZWdleD0vKD86XnxccykoXC0pP1wvKFteXHNdKylcLy87VGV4dFV0aWxzLlRleHRVdGlscy5fdGV4dEZpbHRlclJlZ2V4PS8oPzpefFxzKShcLSk/KFteXHNdKykvO1RleHRVdGlscy5UZXh0VXRpbHMuX1NwYWNlQ2hhclJlZ2V4PS9ccy87VGV4dFV0aWxzLlRleHRVdGlscy5JbmRlbnQ9e1R3b1NwYWNlczonICAnLEZvdXJTcGFjZXM6JyAgICAnLEVpZ2h0U3BhY2VzOicgICAgICAgICcsVGFiQ2hhcmFjdGVyOidcdCd9O1RleHRVdGlscy5UZXh0VXRpbHMuQmFsYW5jZWRKU09OVG9rZW5pemVyPWNsYXNze2NvbnN0cnVjdG9yKGNhbGxiYWNrLGZpbmRNdWx0aXBsZSl7dGhpcy5fY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5faW5kZXg9MDt0aGlzLl9iYWxhbmNlPTA7dGhpcy5fYnVmZmVyPScnO3RoaXMuX2ZpbmRNdWx0aXBsZT1maW5kTXVsdGlwbGV8fGZhbHNlO3RoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4PS9bXlxcXSg/OlxcXFwpKiIvZzt9CndyaXRlKGNodW5rKXt0aGlzLl9idWZmZXIrPWNodW5rO2NvbnN0IGxhc3RJbmRleD10aGlzLl9idWZmZXIubGVuZ3RoO2NvbnN0IGJ1ZmZlcj10aGlzLl9idWZmZXI7bGV0IGluZGV4O2ZvcihpbmRleD10aGlzLl9pbmRleDtpbmRleDxsYXN0SW5kZXg7KytpbmRleCl7Y29uc3QgY2hhcmFjdGVyPWJ1ZmZlcltpbmRleF07aWYoY2hhcmFjdGVyPT09JyInKXt0aGlzLl9jbG9zaW5nRG91YmxlUXVvdGVSZWdleC5sYXN0SW5kZXg9aW5kZXg7aWYoIXRoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4LnRlc3QoYnVmZmVyKSkKYnJlYWs7aW5kZXg9dGhpcy5fY2xvc2luZ0RvdWJsZVF1b3RlUmVnZXgubGFzdEluZGV4LTE7fWVsc2UgaWYoY2hhcmFjdGVyPT09J3snKXsrK3RoaXMuX2JhbGFuY2U7fWVsc2UgaWYoY2hhcmFjdGVyPT09J30nKXstLXRoaXMuX2JhbGFuY2U7aWYodGhpcy5fYmFsYW5jZTwwKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9CmlmKCF0aGlzLl9iYWxhbmNlKXt0aGlzLl9sYXN0QmFsYW5jZWRJbmRleD1pbmRleCsxO2lmKCF0aGlzLl9maW5kTXVsdGlwbGUpCmJyZWFrO319ZWxzZSBpZihjaGFyYWN0ZXI9PT0nXScmJiF0aGlzLl9iYWxhbmNlKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9fQp0aGlzLl9pbmRleD1pbmRleDt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiB0cnVlO30KX3JlcG9ydEJhbGFuY2VkKCl7aWYoIXRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KQpyZXR1cm47dGhpcy5fY2FsbGJhY2sodGhpcy5fYnVmZmVyLnNsaWNlKDAsdGhpcy5fbGFzdEJhbGFuY2VkSW5kZXgpKTt0aGlzLl9idWZmZXI9dGhpcy5fYnVmZmVyLnNsaWNlKHRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KTt0aGlzLl9pbmRleC09dGhpcy5fbGFzdEJhbGFuY2VkSW5kZXg7dGhpcy5fbGFzdEJhbGFuY2VkSW5kZXg9MDt9CnJlbWFpbmRlcigpe3JldHVybiB0aGlzLl9idWZmZXI7fX07VGV4dFV0aWxzLlRva2VuaXplckZhY3Rvcnk9ZnVuY3Rpb24oKXt9O1RleHRVdGlscy5Ub2tlbml6ZXJGYWN0b3J5LnByb3RvdHlwZT17Y3JlYXRlVG9rZW5pemVyKG1pbWVUeXBlKXt9fTtUZXh0VXRpbHMuaXNNaW5pZmllZD1mdW5jdGlvbih0ZXh0KXtjb25zdCBrTWF4Tm9uTWluaWZpZWRMZW5ndGg9NTAwO2xldCBsaW5lc1RvQ2hlY2s9MTA7bGV0IGxhc3RQb3NpdGlvbj0wO2Rve2xldCBlb2xJbmRleD10ZXh0LmluZGV4T2YoJ1xuJyxsYXN0UG9zaXRpb24pO2lmKGVvbEluZGV4PDApCmVvbEluZGV4PXRleHQubGVuZ3RoO2lmKGVvbEluZGV4LWxhc3RQb3NpdGlvbj5rTWF4Tm9uTWluaWZpZWRMZW5ndGgmJnRleHQuc3Vic3RyKGxhc3RQb3NpdGlvbiwzKSE9PScvLyMnKQpyZXR1cm4gdHJ1ZTtsYXN0UG9zaXRpb249ZW9sSW5kZXgrMTt9d2hpbGUoLS1saW5lc1RvQ2hlY2s+PTAmJmxhc3RQb3NpdGlvbjx0ZXh0Lmxlbmd0aCk7bGluZXNUb0NoZWNrPTEwO2xhc3RQb3NpdGlvbj10ZXh0Lmxlbmd0aDtkb3tsZXQgZW9sSW5kZXg9dGV4dC5sYXN0SW5kZXhPZignXG4nLGxhc3RQb3NpdGlvbik7aWYoZW9sSW5kZXg8MCkKZW9sSW5kZXg9MDtpZihsYXN0UG9zaXRpb24tZW9sSW5kZXg+a01heE5vbk1pbmlmaWVkTGVuZ3RoJiZ0ZXh0LnN1YnN0cihsYXN0UG9zaXRpb24sMykhPT0nLy8jJykKcmV0dXJuIHRydWU7bGFzdFBvc2l0aW9uPWVvbEluZGV4LTE7fXdoaWxlKC0tbGluZXNUb0NoZWNrPj0wJiZsYXN0UG9zaXRpb24+MCk7cmV0dXJuIGZhbHNlO307O1RleHRVdGlscy5UZXh0UmFuZ2U9Y2xhc3N7Y29uc3RydWN0b3Ioc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uKXt0aGlzLnN0YXJ0TGluZT1zdGFydExpbmU7dGhpcy5zdGFydENvbHVtbj1zdGFydENvbHVtbjt0aGlzLmVuZExpbmU9ZW5kTGluZTt0aGlzLmVuZENvbHVtbj1lbmRDb2x1bW47fQpzdGF0aWMgY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmUsY29sdW1uKXtyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UobGluZSxjb2x1bW4sbGluZSxjb2x1bW4pO30Kc3RhdGljIGZyb21PYmplY3Qoc2VyaWFsaXplZFRleHRSYW5nZSl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHNlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRMaW5lLHNlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRDb2x1bW4sc2VyaWFsaXplZFRleHRSYW5nZS5lbmRMaW5lLHNlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kQ29sdW1uKTt9CnN0YXRpYyBjb21wYXJhdG9yKHJhbmdlMSxyYW5nZTIpe3JldHVybiByYW5nZTEuY29tcGFyZVRvKHJhbmdlMik7fQpzdGF0aWMgZnJvbUVkaXQob2xkUmFuZ2UsbmV3VGV4dCl7bGV0IGVuZExpbmU9b2xkUmFuZ2Uuc3RhcnRMaW5lO2xldCBlbmRDb2x1bW49b2xkUmFuZ2Uuc3RhcnRDb2x1bW4rbmV3VGV4dC5sZW5ndGg7Y29uc3QgbGluZUVuZGluZ3M9bmV3VGV4dC5jb21wdXRlTGluZUVuZGluZ3MoKTtpZihsaW5lRW5kaW5ncy5sZW5ndGg+MSl7ZW5kTGluZT1vbGRSYW5nZS5zdGFydExpbmUrbGluZUVuZGluZ3MubGVuZ3RoLTE7Y29uc3QgbGVuPWxpbmVFbmRpbmdzLmxlbmd0aDtlbmRDb2x1bW49bGluZUVuZGluZ3NbbGVuLTFdLWxpbmVFbmRpbmdzW2xlbi0yXS0xO30KcmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKG9sZFJhbmdlLnN0YXJ0TGluZSxvbGRSYW5nZS5zdGFydENvbHVtbixlbmRMaW5lLGVuZENvbHVtbik7fQppc0VtcHR5KCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09dGhpcy5lbmRMaW5lJiZ0aGlzLnN0YXJ0Q29sdW1uPT09dGhpcy5lbmRDb2x1bW47fQppbW1lZGlhdGVseVByZWNlZGVzKHJhbmdlKXtpZighcmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gdGhpcy5lbmRMaW5lPT09cmFuZ2Uuc3RhcnRMaW5lJiZ0aGlzLmVuZENvbHVtbj09PXJhbmdlLnN0YXJ0Q29sdW1uO30KaW1tZWRpYXRlbHlGb2xsb3dzKHJhbmdlKXtpZighcmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gcmFuZ2UuaW1tZWRpYXRlbHlQcmVjZWRlcyh0aGlzKTt9CmZvbGxvd3MocmFuZ2Upe3JldHVybihyYW5nZS5lbmRMaW5lPT09dGhpcy5zdGFydExpbmUmJnJhbmdlLmVuZENvbHVtbjw9dGhpcy5zdGFydENvbHVtbil8fHJhbmdlLmVuZExpbmU8dGhpcy5zdGFydExpbmU7fQpnZXQgbGluZXNDb3VudCgpe3JldHVybiB0aGlzLmVuZExpbmUtdGhpcy5zdGFydExpbmU7fQpjb2xsYXBzZVRvRW5kKCl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHRoaXMuZW5kTGluZSx0aGlzLmVuZENvbHVtbix0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4pO30KY29sbGFwc2VUb1N0YXJ0KCl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4sdGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbik7fQpub3JtYWxpemUoKXtpZih0aGlzLnN0YXJ0TGluZT50aGlzLmVuZExpbmV8fCh0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSYmdGhpcy5zdGFydENvbHVtbj50aGlzLmVuZENvbHVtbikpCnJldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZSh0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4sdGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbik7ZWxzZQpyZXR1cm4gdGhpcy5jbG9uZSgpO30KY2xvbmUoKXtyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UodGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbix0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4pO30Kc2VyaWFsaXplVG9PYmplY3QoKXtjb25zdCBzZXJpYWxpemVkVGV4dFJhbmdlPXt9O3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRMaW5lPXRoaXMuc3RhcnRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRDb2x1bW49dGhpcy5zdGFydENvbHVtbjtzZXJpYWxpemVkVGV4dFJhbmdlLmVuZExpbmU9dGhpcy5lbmRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kQ29sdW1uPXRoaXMuZW5kQ29sdW1uO3JldHVybiBzZXJpYWxpemVkVGV4dFJhbmdlO30KY29tcGFyZVRvKG90aGVyKXtpZih0aGlzLnN0YXJ0TGluZT5vdGhlci5zdGFydExpbmUpCnJldHVybiAxO2lmKHRoaXMuc3RhcnRMaW5lPG90aGVyLnN0YXJ0TGluZSkKcmV0dXJuLTE7aWYodGhpcy5zdGFydENvbHVtbj5vdGhlci5zdGFydENvbHVtbikKcmV0dXJuIDE7aWYodGhpcy5zdGFydENvbHVtbjxvdGhlci5zdGFydENvbHVtbikKcmV0dXJuLTE7cmV0dXJuIDA7fQpjb21wYXJlVG9Qb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYobGluZU51bWJlcjx0aGlzLnN0YXJ0TGluZXx8KGxpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZSYmY29sdW1uTnVtYmVyPHRoaXMuc3RhcnRDb2x1bW4pKQpyZXR1cm4tMTtpZihsaW5lTnVtYmVyPnRoaXMuZW5kTGluZXx8KGxpbmVOdW1iZXI9PT10aGlzLmVuZExpbmUmJmNvbHVtbk51bWJlcj50aGlzLmVuZENvbHVtbikpCnJldHVybiAxO3JldHVybiAwO30KZXF1YWwob3RoZXIpe3JldHVybiB0aGlzLnN0YXJ0TGluZT09PW90aGVyLnN0YXJ0TGluZSYmdGhpcy5lbmRMaW5lPT09b3RoZXIuZW5kTGluZSYmdGhpcy5zdGFydENvbHVtbj09PW90aGVyLnN0YXJ0Q29sdW1uJiZ0aGlzLmVuZENvbHVtbj09PW90aGVyLmVuZENvbHVtbjt9CnJlbGF0aXZlVG8obGluZSxjb2x1bW4pe2NvbnN0IHJlbGF0aXZlPXRoaXMuY2xvbmUoKTtpZih0aGlzLnN0YXJ0TGluZT09PWxpbmUpCnJlbGF0aXZlLnN0YXJ0Q29sdW1uLT1jb2x1bW47aWYodGhpcy5lbmRMaW5lPT09bGluZSkKcmVsYXRpdmUuZW5kQ29sdW1uLT1jb2x1bW47cmVsYXRpdmUuc3RhcnRMaW5lLT1saW5lO3JlbGF0aXZlLmVuZExpbmUtPWxpbmU7cmV0dXJuIHJlbGF0aXZlO30KcmVsYXRpdmVGcm9tKGxpbmUsY29sdW1uKXtjb25zdCByZWxhdGl2ZT10aGlzLmNsb25lKCk7aWYodGhpcy5zdGFydExpbmU9PT0wKQpyZWxhdGl2ZS5zdGFydENvbHVtbis9Y29sdW1uO2lmKHRoaXMuZW5kTGluZT09PTApCnJlbGF0aXZlLmVuZENvbHVtbis9Y29sdW1uO3JlbGF0aXZlLnN0YXJ0TGluZSs9bGluZTtyZWxhdGl2ZS5lbmRMaW5lKz1saW5lO3JldHVybiByZWxhdGl2ZTt9CnJlYmFzZUFmdGVyVGV4dEVkaXQob3JpZ2luYWxSYW5nZSxlZGl0ZWRSYW5nZSl7Y29uc29sZS5hc3NlcnQob3JpZ2luYWxSYW5nZS5zdGFydExpbmU9PT1lZGl0ZWRSYW5nZS5zdGFydExpbmUpO2NvbnNvbGUuYXNzZXJ0KG9yaWdpbmFsUmFuZ2Uuc3RhcnRDb2x1bW49PT1lZGl0ZWRSYW5nZS5zdGFydENvbHVtbik7Y29uc3QgcmViYXNlPXRoaXMuY2xvbmUoKTtpZighdGhpcy5mb2xsb3dzKG9yaWdpbmFsUmFuZ2UpKQpyZXR1cm4gcmViYXNlO2NvbnN0IGxpbmVEZWx0YT1lZGl0ZWRSYW5nZS5lbmRMaW5lLW9yaWdpbmFsUmFuZ2UuZW5kTGluZTtjb25zdCBjb2x1bW5EZWx0YT1lZGl0ZWRSYW5nZS5lbmRDb2x1bW4tb3JpZ2luYWxSYW5nZS5lbmRDb2x1bW47cmViYXNlLnN0YXJ0TGluZSs9bGluZURlbHRhO3JlYmFzZS5lbmRMaW5lKz1saW5lRGVsdGE7aWYocmViYXNlLnN0YXJ0TGluZT09PWVkaXRlZFJhbmdlLmVuZExpbmUpCnJlYmFzZS5zdGFydENvbHVtbis9Y29sdW1uRGVsdGE7aWYocmViYXNlLmVuZExpbmU9PT1lZGl0ZWRSYW5nZS5lbmRMaW5lKQpyZWJhc2UuZW5kQ29sdW1uKz1jb2x1bW5EZWx0YTtyZXR1cm4gcmViYXNlO30KdG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7fQpjb250YWluc0xvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtpZih0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSkKcmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlciYmdGhpcy5zdGFydENvbHVtbjw9Y29sdW1uTnVtYmVyJiZjb2x1bW5OdW1iZXI8PXRoaXMuZW5kQ29sdW1uO2lmKHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlcikKcmV0dXJuIHRoaXMuc3RhcnRDb2x1bW48PWNvbHVtbk51bWJlcjtpZih0aGlzLmVuZExpbmU9PT1saW5lTnVtYmVyKQpyZXR1cm4gY29sdW1uTnVtYmVyPD10aGlzLmVuZENvbHVtbjtyZXR1cm4gdGhpcy5zdGFydExpbmU8bGluZU51bWJlciYmbGluZU51bWJlcjx0aGlzLmVuZExpbmU7fX07VGV4dFV0aWxzLlNvdXJjZVJhbmdlPWNsYXNze2NvbnN0cnVjdG9yKG9mZnNldCxsZW5ndGgpe3RoaXMub2Zmc2V0PW9mZnNldDt0aGlzLmxlbmd0aD1sZW5ndGg7fX07VGV4dFV0aWxzLlNvdXJjZUVkaXQ9Y2xhc3N7Y29uc3RydWN0b3Ioc291cmNlVVJMLG9sZFJhbmdlLG5ld1RleHQpe3RoaXMuc291cmNlVVJMPXNvdXJjZVVSTDt0aGlzLm9sZFJhbmdlPW9sZFJhbmdlO3RoaXMubmV3VGV4dD1uZXdUZXh0O30Kc3RhdGljIGNvbXBhcmF0b3IoZWRpdDEsZWRpdDIpe3JldHVybiBUZXh0VXRpbHMuVGV4dFJhbmdlLmNvbXBhcmF0b3IoZWRpdDEub2xkUmFuZ2UsZWRpdDIub2xkUmFuZ2UpO30KbmV3UmFuZ2UoKXtyZXR1cm4gVGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tRWRpdCh0aGlzLm9sZFJhbmdlLHRoaXMubmV3VGV4dCk7fX07O3NlbGZbJ0NtSGVhZGxlc3MnXT1zZWxmWydDbUhlYWRsZXNzJ118fHt9OyhmdW5jdGlvbih3aW5kb3cpe3dpbmRvdy5Db2RlTWlycm9yPXt9OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzcGxpdExpbmVzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgvXHI/XG58XHIvKTt9O2Z1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHJpbmcpe3RoaXMucG9zPXRoaXMuc3RhcnQ9MDt0aGlzLnN0cmluZz1zdHJpbmc7dGhpcy5saW5lU3RhcnQ9MDt9ClN0cmluZ1N0cmVhbS5wcm90b3R5cGU9e2VvbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvcz49dGhpcy5zdHJpbmcubGVuZ3RoO30sc29sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zPT0wO30scGVlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpfHxudWxsO30sbmV4dDpmdW5jdGlvbigpe2lmKHRoaXMucG9zPHRoaXMuc3RyaW5nLmxlbmd0aCkKcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKTt9LGVhdDpmdW5jdGlvbihtYXRjaCl7dmFyIGNoPXRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcyk7aWYodHlwZW9mIG1hdGNoPT0ic3RyaW5nIil2YXIgb2s9Y2g9PW1hdGNoO2Vsc2UgdmFyIG9rPWNoJiYobWF0Y2gudGVzdD9tYXRjaC50ZXN0KGNoKTptYXRjaChjaCkpO2lmKG9rKXsrK3RoaXMucG9zO3JldHVybiBjaDt9fSxlYXRXaGlsZTpmdW5jdGlvbihtYXRjaCl7dmFyIHN0YXJ0PXRoaXMucG9zO3doaWxlKHRoaXMuZWF0KG1hdGNoKSl7fQpyZXR1cm4gdGhpcy5wb3M+c3RhcnQ7fSxlYXRTcGFjZTpmdW5jdGlvbigpe3ZhciBzdGFydD10aGlzLnBvczt3aGlsZSgvW1xzXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkrK3RoaXMucG9zO3JldHVybiB0aGlzLnBvcz5zdGFydDt9LHNraXBUb0VuZDpmdW5jdGlvbigpe3RoaXMucG9zPXRoaXMuc3RyaW5nLmxlbmd0aDt9LHNraXBUbzpmdW5jdGlvbihjaCl7dmFyIGZvdW5kPXRoaXMuc3RyaW5nLmluZGV4T2YoY2gsdGhpcy5wb3MpO2lmKGZvdW5kPi0xKXt0aGlzLnBvcz1mb3VuZDtyZXR1cm4gdHJ1ZTt9fSxiYWNrVXA6ZnVuY3Rpb24obil7dGhpcy5wb3MtPW47fSxjb2x1bW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC10aGlzLmxpbmVTdGFydDt9LGluZGVudGF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDA7fSxtYXRjaDpmdW5jdGlvbihwYXR0ZXJuLGNvbnN1bWUsY2FzZUluc2Vuc2l0aXZlKXtpZih0eXBlb2YgcGF0dGVybj09InN0cmluZyIpe3ZhciBjYXNlZD1mdW5jdGlvbihzdHIpe3JldHVybiBjYXNlSW5zZW5zaXRpdmU/c3RyLnRvTG93ZXJDYXNlKCk6c3RyO307dmFyIHN1YnN0cj10aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MscGF0dGVybi5sZW5ndGgpO2lmKGNhc2VkKHN1YnN0cik9PWNhc2VkKHBhdHRlcm4pKXtpZihjb25zdW1lIT09ZmFsc2UpdGhpcy5wb3MrPXBhdHRlcm4ubGVuZ3RoO3JldHVybiB0cnVlO319ZWxzZXt2YXIgbWF0Y2g9dGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pO2lmKG1hdGNoJiZtYXRjaC5pbmRleD4wKXJldHVybiBudWxsO2lmKG1hdGNoJiZjb25zdW1lIT09ZmFsc2UpdGhpcy5wb3MrPW1hdGNoWzBdLmxlbmd0aDtyZXR1cm4gbWF0Y2g7fX0sY3VycmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LHRoaXMucG9zKTt9LGhpZGVGaXJzdENoYXJzOmZ1bmN0aW9uKG4saW5uZXIpe3RoaXMubGluZVN0YXJ0Kz1uO3RyeXtyZXR1cm4gaW5uZXIoKTt9CmZpbmFsbHl7dGhpcy5saW5lU3RhcnQtPW47fX0sbG9va0FoZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fTtDb2RlTWlycm9yLlN0cmluZ1N0cmVhbT1TdHJpbmdTdHJlYW07Q29kZU1pcnJvci5zdGFydFN0YXRlPWZ1bmN0aW9uKG1vZGUsYTEsYTIpe3JldHVybiBtb2RlLnN0YXJ0U3RhdGU/bW9kZS5zdGFydFN0YXRlKGExLGEyKTp0cnVlO307dmFyIG1vZGVzPUNvZGVNaXJyb3IubW9kZXM9e30sbWltZU1vZGVzPUNvZGVNaXJyb3IubWltZU1vZGVzPXt9O0NvZGVNaXJyb3IuZGVmaW5lTW9kZT1mdW5jdGlvbihuYW1lLG1vZGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MikKbW9kZS5kZXBlbmRlbmNpZXM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO21vZGVzW25hbWVdPW1vZGU7fTtDb2RlTWlycm9yLmRlZmluZU1JTUU9ZnVuY3Rpb24obWltZSxzcGVjKXttaW1lTW9kZXNbbWltZV09c3BlYzt9O0NvZGVNaXJyb3IucmVzb2x2ZU1vZGU9ZnVuY3Rpb24oc3BlYyl7aWYodHlwZW9mIHNwZWM9PSJzdHJpbmciJiZtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYykpe3NwZWM9bWltZU1vZGVzW3NwZWNdO31lbHNlIGlmKHNwZWMmJnR5cGVvZiBzcGVjLm5hbWU9PSJzdHJpbmciJiZtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSl7c3BlYz1taW1lTW9kZXNbc3BlYy5uYW1lXTt9CmlmKHR5cGVvZiBzcGVjPT0ic3RyaW5nIilyZXR1cm57bmFtZTpzcGVjfTtlbHNlIHJldHVybiBzcGVjfHx7bmFtZToibnVsbCJ9O307Q29kZU1pcnJvci5nZXRNb2RlPWZ1bmN0aW9uKG9wdGlvbnMsc3BlYyl7c3BlYz1Db2RlTWlycm9yLnJlc29sdmVNb2RlKHNwZWMpO3ZhciBtZmFjdG9yeT1tb2Rlc1tzcGVjLm5hbWVdO2lmKCFtZmFjdG9yeSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbW9kZTogIitzcGVjKTtyZXR1cm4gbWZhY3Rvcnkob3B0aW9ucyxzcGVjKTt9O0NvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXI9Q29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlcj1NYXRoLm1pbjtDb2RlTWlycm9yLmRlZmluZU1vZGUoIm51bGwiLGZ1bmN0aW9uKCl7cmV0dXJue3Rva2VuOmZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnNraXBUb0VuZCgpO319O30pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9wbGFpbiIsIm51bGwiKTtDb2RlTWlycm9yLnJ1bk1vZGU9ZnVuY3Rpb24oc3RyaW5nLG1vZGVzcGVjLGNhbGxiYWNrLG9wdGlvbnMpe3ZhciBtb2RlPUNvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDoyfSxtb2Rlc3BlYyk7aWYoY2FsbGJhY2subm9kZVR5cGU9PTEpe3ZhciB0YWJTaXplPShvcHRpb25zJiZvcHRpb25zLnRhYlNpemUpfHw0O3ZhciBub2RlPWNhbGxiYWNrLGNvbD0wO25vZGUuaW5uZXJIVE1MPSIiO2NhbGxiYWNrPWZ1bmN0aW9uKHRleHQsc3R5bGUpe2lmKHRleHQ9PSJcbiIpe25vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7Y29sPTA7cmV0dXJuO30KdmFyIGNvbnRlbnQ9IiI7Zm9yKHZhciBwb3M9MDs7KXt2YXIgaWR4PXRleHQuaW5kZXhPZigiXHQiLHBvcyk7aWYoaWR4PT0tMSl7Y29udGVudCs9dGV4dC5zbGljZShwb3MpO2NvbCs9dGV4dC5sZW5ndGgtcG9zO2JyZWFrO31lbHNle2NvbCs9aWR4LXBvcztjb250ZW50Kz10ZXh0LnNsaWNlKHBvcyxpZHgpO3ZhciBzaXplPXRhYlNpemUtY29sJXRhYlNpemU7Y29sKz1zaXplO2Zvcih2YXIgaT0wO2k8c2l6ZTsrK2kpY29udGVudCs9IiAiO3Bvcz1pZHgrMTt9fQppZihzdHlsZSl7dmFyIHNwPW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKTtzcC5jbGFzc05hbWU9ImNtLSIrc3R5bGUucmVwbGFjZSgvICsvZywiIGNtLSIpO3NwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTt9ZWxzZXtub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTt9fTt9CnZhciBsaW5lcz1zcGxpdExpbmVzKHN0cmluZyksc3RhdGU9KG9wdGlvbnMmJm9wdGlvbnMuc3RhdGUpfHxDb2RlTWlycm9yLnN0YXJ0U3RhdGUobW9kZSk7Zm9yKHZhciBpPTAsZT1saW5lcy5sZW5ndGg7aTxlOysraSl7aWYoaSljYWxsYmFjaygiXG4iKTt2YXIgc3RyZWFtPW5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShsaW5lc1tpXSk7aWYoIXN0cmVhbS5zdHJpbmcmJm1vZGUuYmxhbmtMaW5lKW1vZGUuYmxhbmtMaW5lKHN0YXRlKTt3aGlsZSghc3RyZWFtLmVvbCgpKXt2YXIgc3R5bGU9bW9kZS50b2tlbihzdHJlYW0sc3RhdGUpO2NhbGxiYWNrKHN0cmVhbS5jdXJyZW50KCksc3R5bGUsaSxzdHJlYW0uc3RhcnQsc3RhdGUpO3N0cmVhbS5zdGFydD1zdHJlYW0ucG9zO319fTt9KSgpO30odGhpcykpO3NlbGZbJ0Zvcm1hdHRlcldvcmtlciddPXNlbGZbJ0Zvcm1hdHRlcldvcmtlciddfHx7fTsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO0NvZGVNaXJyb3IuZGVmaW5lTW9kZSgiY3NzIixmdW5jdGlvbihjb25maWcscGFyc2VyQ29uZmlnKXt2YXIgaW5saW5lPXBhcnNlckNvbmZpZy5pbmxpbmUKaWYoIXBhcnNlckNvbmZpZy5wcm9wZXJ0eUtleXdvcmRzKXBhcnNlckNvbmZpZz1Db2RlTWlycm9yLnJlc29sdmVNb2RlKCJ0ZXh0L2NzcyIpO3ZhciBpbmRlbnRVbml0PWNvbmZpZy5pbmRlbnRVbml0LHRva2VuSG9va3M9cGFyc2VyQ29uZmlnLnRva2VuSG9va3MsZG9jdW1lbnRUeXBlcz1wYXJzZXJDb25maWcuZG9jdW1lbnRUeXBlc3x8e30sbWVkaWFUeXBlcz1wYXJzZXJDb25maWcubWVkaWFUeXBlc3x8e30sbWVkaWFGZWF0dXJlcz1wYXJzZXJDb25maWcubWVkaWFGZWF0dXJlc3x8e30sbWVkaWFWYWx1ZUtleXdvcmRzPXBhcnNlckNvbmZpZy5tZWRpYVZhbHVlS2V5d29yZHN8fHt9LHByb3BlcnR5S2V5d29yZHM9cGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHN8fHt9LG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcz1wYXJzZXJDb25maWcubm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzfHx7fSxmb250UHJvcGVydGllcz1wYXJzZXJDb25maWcuZm9udFByb3BlcnRpZXN8fHt9LGNvdW50ZXJEZXNjcmlwdG9ycz1wYXJzZXJDb25maWcuY291bnRlckRlc2NyaXB0b3JzfHx7fSxjb2xvcktleXdvcmRzPXBhcnNlckNvbmZpZy5jb2xvcktleXdvcmRzfHx7fSx2YWx1ZUtleXdvcmRzPXBhcnNlckNvbmZpZy52YWx1ZUtleXdvcmRzfHx7fSxhbGxvd05lc3RlZD1wYXJzZXJDb25maWcuYWxsb3dOZXN0ZWQsbGluZUNvbW1lbnQ9cGFyc2VyQ29uZmlnLmxpbmVDb21tZW50LHN1cHBvcnRzQXRDb21wb25lbnQ9cGFyc2VyQ29uZmlnLnN1cHBvcnRzQXRDb21wb25lbnQ9PT10cnVlO3ZhciB0eXBlLG92ZXJyaWRlO2Z1bmN0aW9uIHJldChzdHlsZSx0cCl7dHlwZT10cDtyZXR1cm4gc3R5bGU7fQpmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLHN0YXRlKXt2YXIgY2g9c3RyZWFtLm5leHQoKTtpZih0b2tlbkhvb2tzW2NoXSl7dmFyIHJlc3VsdD10b2tlbkhvb2tzW2NoXShzdHJlYW0sc3RhdGUpO2lmKHJlc3VsdCE9PWZhbHNlKXJldHVybiByZXN1bHQ7fQppZihjaD09IkAiKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7cmV0dXJuIHJldCgiZGVmIixzdHJlYW0uY3VycmVudCgpKTt9ZWxzZSBpZihjaD09Ij0ifHwoY2g9PSJ+Inx8Y2g9PSJ8IikmJnN0cmVhbS5lYXQoIj0iKSl7cmV0dXJuIHJldChudWxsLCJjb21wYXJlIik7fWVsc2UgaWYoY2g9PSJcIiJ8fGNoPT0iJyIpe3N0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKGNoKTtyZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTt9ZWxzZSBpZihjaD09IiMiKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7cmV0dXJuIHJldCgiYXRvbSIsImhhc2giKTt9ZWxzZSBpZihjaD09IiEiKXtzdHJlYW0ubWF0Y2goL15ccypcdyovKTtyZXR1cm4gcmV0KCJrZXl3b3JkIiwiaW1wb3J0YW50Iik7fWVsc2UgaWYoL1xkLy50ZXN0KGNoKXx8Y2g9PSIuIiYmc3RyZWFtLmVhdCgvXGQvKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJ1bml0Iik7fWVsc2UgaWYoY2g9PT0iLSIpe2lmKC9bXGQuXS8udGVzdChzdHJlYW0ucGVlaygpKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJ1bml0Iik7fWVsc2UgaWYoc3RyZWFtLm1hdGNoKC9eLVtcd1xcXC1dKy8pKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7aWYoc3RyZWFtLm1hdGNoKC9eXHMqOi8sZmFsc2UpKQpyZXR1cm4gcmV0KCJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiIpO3JldHVybiByZXQoInZhcmlhYmxlLTIiLCJ2YXJpYWJsZSIpO31lbHNlIGlmKHN0cmVhbS5tYXRjaCgvXlx3Ky0vKSl7cmV0dXJuIHJldCgibWV0YSIsIm1ldGEiKTt9fWVsc2UgaWYoL1ssKz4qXC9dLy50ZXN0KGNoKSl7cmV0dXJuIHJldChudWxsLCJzZWxlY3Qtb3AiKTt9ZWxzZSBpZihjaD09Ii4iJiZzdHJlYW0ubWF0Y2goL14tP1tfYS16XVtfYS16MC05LV0qL2kpKXtyZXR1cm4gcmV0KCJxdWFsaWZpZXIiLCJxdWFsaWZpZXIiKTt9ZWxzZSBpZigvWzo7e31cW1xdXChcKV0vLnRlc3QoY2gpKXtyZXR1cm4gcmV0KG51bGwsY2gpO31lbHNlIGlmKChjaD09InUiJiZzdHJlYW0ubWF0Y2goL3JsKC1wcmVmaXgpP1woLykpfHwoY2g9PSJkIiYmc3RyZWFtLm1hdGNoKCJvbWFpbigiKSl8fChjaD09InIiJiZzdHJlYW0ubWF0Y2goImVnZXhwKCIpKSl7c3RyZWFtLmJhY2tVcCgxKTtzdGF0ZS50b2tlbml6ZT10b2tlblBhcmVudGhlc2l6ZWQ7cmV0dXJuIHJldCgicHJvcGVydHkiLCJ3b3JkIik7fWVsc2UgaWYoL1tcd1xcXC1dLy50ZXN0KGNoKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pO3JldHVybiByZXQoInByb3BlcnR5Iiwid29yZCIpO31lbHNle3JldHVybiByZXQobnVsbCxudWxsKTt9fQpmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7dmFyIGVzY2FwZWQ9ZmFsc2UsY2g7d2hpbGUoKGNoPXN0cmVhbS5uZXh0KCkpIT1udWxsKXtpZihjaD09cXVvdGUmJiFlc2NhcGVkKXtpZihxdW90ZT09IikiKXN0cmVhbS5iYWNrVXAoMSk7YnJlYWs7fQplc2NhcGVkPSFlc2NhcGVkJiZjaD09IlxcIjt9CmlmKGNoPT1xdW90ZXx8IWVzY2FwZWQmJnF1b3RlIT0iKSIpc3RhdGUudG9rZW5pemU9bnVsbDtyZXR1cm4gcmV0KCJzdHJpbmciLCJzdHJpbmciKTt9O30KZnVuY3Rpb24gdG9rZW5QYXJlbnRoZXNpemVkKHN0cmVhbSxzdGF0ZSl7c3RyZWFtLm5leHQoKTtpZighc3RyZWFtLm1hdGNoKC9ccypbXCJcJyldLyxmYWxzZSkpCnN0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKCIpIik7ZWxzZQpzdGF0ZS50b2tlbml6ZT1udWxsO3JldHVybiByZXQobnVsbCwiKCIpO30KZnVuY3Rpb24gQ29udGV4dCh0eXBlLGluZGVudCxwcmV2KXt0aGlzLnR5cGU9dHlwZTt0aGlzLmluZGVudD1pbmRlbnQ7dGhpcy5wcmV2PXByZXY7fQpmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sdHlwZSxpbmRlbnQpe3N0YXRlLmNvbnRleHQ9bmV3IENvbnRleHQodHlwZSxzdHJlYW0uaW5kZW50YXRpb24oKSsoaW5kZW50PT09ZmFsc2U/MDppbmRlbnRVbml0KSxzdGF0ZS5jb250ZXh0KTtyZXR1cm4gdHlwZTt9CmZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpe2lmKHN0YXRlLmNvbnRleHQucHJldikKc3RhdGUuY29udGV4dD1zdGF0ZS5jb250ZXh0LnByZXY7cmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9CmZ1bmN0aW9uIHBhc3ModHlwZSxzdHJlYW0sc3RhdGUpe3JldHVybiBzdGF0ZXNbc3RhdGUuY29udGV4dC50eXBlXSh0eXBlLHN0cmVhbSxzdGF0ZSk7fQpmdW5jdGlvbiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlLG4pe2Zvcih2YXIgaT1ufHwxO2k+MDtpLS0pCnN0YXRlLmNvbnRleHQ9c3RhdGUuY29udGV4dC5wcmV2O3JldHVybiBwYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTt9CmZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHN0cmVhbSl7dmFyIHdvcmQ9c3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO2lmKHZhbHVlS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpCm92ZXJyaWRlPSJhdG9tIjtlbHNlIGlmKGNvbG9yS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpCm92ZXJyaWRlPSJrZXl3b3JkIjtlbHNlCm92ZXJyaWRlPSJ2YXJpYWJsZSI7fQp2YXIgc3RhdGVzPXt9O3N0YXRlcy50b3A9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7Iil7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiYmxvY2siKTt9ZWxzZSBpZih0eXBlPT0ifSImJnN0YXRlLmNvbnRleHQucHJldil7cmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO31lbHNlIGlmKHN1cHBvcnRzQXRDb21wb25lbnQmJi9AY29tcG9uZW50Ly50ZXN0KHR5cGUpKXtyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdENvbXBvbmVudEJsb2NrIik7fWVsc2UgaWYoL15AKC1tb3otKT9kb2N1bWVudCQvLnRlc3QodHlwZSkpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImRvY3VtZW50VHlwZXMiKTt9ZWxzZSBpZigvXkAobWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudHxpbXBvcnQpJC8udGVzdCh0eXBlKSl7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiYXRCbG9jayIpO31lbHNlIGlmKC9eQChmb250LWZhY2V8Y291bnRlci1zdHlsZSkvLnRlc3QodHlwZSkpe3N0YXRlLnN0YXRlQXJnPXR5cGU7cmV0dXJuInJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmUiO31lbHNlIGlmKC9eQCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXMkLy50ZXN0KHR5cGUpKXtyZXR1cm4ia2V5ZnJhbWVzIjt9ZWxzZSBpZih0eXBlJiZ0eXBlLmNoYXJBdCgwKT09IkAiKXtyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdCIpO31lbHNlIGlmKHR5cGU9PSJoYXNoIil7b3ZlcnJpZGU9ImJ1aWx0aW4iO31lbHNlIGlmKHR5cGU9PSJ3b3JkIil7b3ZlcnJpZGU9InRhZyI7fWVsc2UgaWYodHlwZT09InZhcmlhYmxlLWRlZmluaXRpb24iKXtyZXR1cm4ibWF5YmVwcm9wIjt9ZWxzZSBpZih0eXBlPT0iaW50ZXJwb2xhdGlvbiIpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImludGVycG9sYXRpb24iKTt9ZWxzZSBpZih0eXBlPT0iOiIpe3JldHVybiJwc2V1ZG8iO31lbHNlIGlmKGFsbG93TmVzdGVkJiZ0eXBlPT0iKCIpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sInBhcmVucyIpO30KcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5ibG9jaz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IndvcmQiKXt2YXIgd29yZD1zdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7aWYocHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSl7b3ZlcnJpZGU9InByb3BlcnR5IjtyZXR1cm4ibWF5YmVwcm9wIjt9ZWxzZSBpZihub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpe292ZXJyaWRlPSJzdHJpbmctMiI7cmV0dXJuIm1heWJlcHJvcCI7fWVsc2UgaWYoYWxsb3dOZXN0ZWQpe292ZXJyaWRlPXN0cmVhbS5tYXRjaCgvXlxzKjooPzpcc3wkKS8sZmFsc2UpPyJwcm9wZXJ0eSI6InRhZyI7cmV0dXJuImJsb2NrIjt9ZWxzZXtvdmVycmlkZSs9IiBlcnJvciI7cmV0dXJuIm1heWJlcHJvcCI7fX1lbHNlIGlmKHR5cGU9PSJtZXRhIil7cmV0dXJuImJsb2NrIjt9ZWxzZSBpZighYWxsb3dOZXN0ZWQmJih0eXBlPT0iaGFzaCJ8fHR5cGU9PSJxdWFsaWZpZXIiKSl7b3ZlcnJpZGU9ImVycm9yIjtyZXR1cm4iYmxvY2siO31lbHNle3JldHVybiBzdGF0ZXMudG9wKHR5cGUsc3RyZWFtLHN0YXRlKTt9fTtzdGF0ZXMubWF5YmVwcm9wPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOiIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicHJvcCIpO3JldHVybiBwYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTt9O3N0YXRlcy5wcm9wPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSJ7IiYmYWxsb3dOZXN0ZWQpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicHJvcEJsb2NrIik7aWYodHlwZT09In0ifHx0eXBlPT0ieyIpcmV0dXJuIHBvcEFuZFBhc3ModHlwZSxzdHJlYW0sc3RhdGUpO2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJwYXJlbnMiKTtpZih0eXBlPT0iaGFzaCImJiEvXiMoWzAtOWEtZkEtZl17Myw0fXxbMC05YS1mQS1mXXs2fXxbMC05YS1mQS1mXXs4fSkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKXtvdmVycmlkZSs9IiBlcnJvciI7fWVsc2UgaWYodHlwZT09IndvcmQiKXt3b3JkQXNWYWx1ZShzdHJlYW0pO31lbHNlIGlmKHR5cGU9PSJpbnRlcnBvbGF0aW9uIil7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiaW50ZXJwb2xhdGlvbiIpO30KcmV0dXJuInByb3AiO307c3RhdGVzLnByb3BCbG9jaz1mdW5jdGlvbih0eXBlLF9zdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ9IilyZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7aWYodHlwZT09IndvcmQiKXtvdmVycmlkZT0icHJvcGVydHkiO3JldHVybiJtYXliZXByb3AiO30KcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5wYXJlbnM9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7Inx8dHlwZT09In0iKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0iKSIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJwYXJlbnMiKTtpZih0eXBlPT0iaW50ZXJwb2xhdGlvbiIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiaW50ZXJwb2xhdGlvbiIpO2lmKHR5cGU9PSJ3b3JkIil3b3JkQXNWYWx1ZShzdHJlYW0pO3JldHVybiJwYXJlbnMiO307c3RhdGVzLnBzZXVkbz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09Im1ldGEiKXJldHVybiJwc2V1ZG8iO2lmKHR5cGU9PSJ3b3JkIil7b3ZlcnJpZGU9InZhcmlhYmxlLTMiO3JldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7fQpyZXR1cm4gcGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7fTtzdGF0ZXMuZG9jdW1lbnRUeXBlcz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IndvcmQiJiZkb2N1bWVudFR5cGVzLmhhc093blByb3BlcnR5KHN0cmVhbS5jdXJyZW50KCkpKXtvdmVycmlkZT0idGFnIjtyZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO31lbHNle3JldHVybiBzdGF0ZXMuYXRCbG9jayh0eXBlLHN0cmVhbSxzdGF0ZSk7fX07c3RhdGVzLmF0QmxvY2s9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdEJsb2NrX3BhcmVucyIpO2lmKHR5cGU9PSJ9Inx8dHlwZT09IjsiKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0ieyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpJiZwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sYWxsb3dOZXN0ZWQ/ImJsb2NrIjoidG9wIik7aWYodHlwZT09ImludGVycG9sYXRpb24iKXJldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImludGVycG9sYXRpb24iKTtpZih0eXBlPT0id29yZCIpe3ZhciB3b3JkPXN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtpZih3b3JkPT0ib25seSJ8fHdvcmQ9PSJub3QifHx3b3JkPT0iYW5kInx8d29yZD09Im9yIikKb3ZlcnJpZGU9ImtleXdvcmQiO2Vsc2UgaWYobWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImF0dHJpYnV0ZSI7ZWxzZSBpZihtZWRpYUZlYXR1cmVzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0icHJvcGVydHkiO2Vsc2UgaWYobWVkaWFWYWx1ZUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0ia2V5d29yZCI7ZWxzZSBpZihwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0icHJvcGVydHkiO2Vsc2UgaWYobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0ic3RyaW5nLTIiO2Vsc2UgaWYodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImF0b20iO2Vsc2UgaWYoY29sb3JLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImtleXdvcmQiO2Vsc2UKb3ZlcnJpZGU9ImVycm9yIjt9CnJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7fTtzdGF0ZXMuYXRDb21wb25lbnRCbG9jaz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09In0iKQpyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7aWYodHlwZT09InsiKQpyZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkmJnB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSxhbGxvd05lc3RlZD8iYmxvY2siOiJ0b3AiLGZhbHNlKTtpZih0eXBlPT0id29yZCIpCm92ZXJyaWRlPSJlcnJvciI7cmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5hdEJsb2NrX3BhcmVucz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IikiKXJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtpZih0eXBlPT0ieyJ8fHR5cGU9PSJ9IilyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSwyKTtyZXR1cm4gc3RhdGVzLmF0QmxvY2sodHlwZSxzdHJlYW0sc3RhdGUpO307c3RhdGVzLnJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmU9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7IikKcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicmVzdHJpY3RlZF9hdEJsb2NrIik7aWYodHlwZT09IndvcmQiJiZzdGF0ZS5zdGF0ZUFyZz09IkBjb3VudGVyLXN0eWxlIil7b3ZlcnJpZGU9InZhcmlhYmxlIjtyZXR1cm4icmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZSI7fQpyZXR1cm4gcGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7fTtzdGF0ZXMucmVzdHJpY3RlZF9hdEJsb2NrPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ifSIpe3N0YXRlLnN0YXRlQXJnPW51bGw7cmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO30KaWYodHlwZT09IndvcmQiKXtpZigoc3RhdGUuc3RhdGVBcmc9PSJAZm9udC1mYWNlIiYmIWZvbnRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpfHwoc3RhdGUuc3RhdGVBcmc9PSJAY291bnRlci1zdHlsZSImJiFjb3VudGVyRGVzY3JpcHRvcnMuaGFzT3duUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpKSkpCm92ZXJyaWRlPSJlcnJvciI7ZWxzZQpvdmVycmlkZT0icHJvcGVydHkiO3JldHVybiJtYXliZXByb3AiO30KcmV0dXJuInJlc3RyaWN0ZWRfYXRCbG9jayI7fTtzdGF0ZXMua2V5ZnJhbWVzPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe292ZXJyaWRlPSJ2YXJpYWJsZSI7cmV0dXJuImtleWZyYW1lcyI7fQppZih0eXBlPT0ieyIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwidG9wIik7cmV0dXJuIHBhc3ModHlwZSxzdHJlYW0sc3RhdGUpO307c3RhdGVzLmF0PWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSJ7Inx8dHlwZT09In0iKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0id29yZCIpb3ZlcnJpZGU9InRhZyI7ZWxzZSBpZih0eXBlPT0iaGFzaCIpb3ZlcnJpZGU9ImJ1aWx0aW4iO3JldHVybiJhdCI7fTtzdGF0ZXMuaW50ZXJwb2xhdGlvbj1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09In0iKXJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtpZih0eXBlPT0ieyJ8fHR5cGU9PSI7IilyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7aWYodHlwZT09IndvcmQiKW92ZXJyaWRlPSJ2YXJpYWJsZSI7ZWxzZSBpZih0eXBlIT0idmFyaWFibGUiJiZ0eXBlIT0iKCImJnR5cGUhPSIpIilvdmVycmlkZT0iZXJyb3IiO3JldHVybiJpbnRlcnBvbGF0aW9uIjt9O3JldHVybntzdGFydFN0YXRlOmZ1bmN0aW9uKGJhc2Upe3JldHVybnt0b2tlbml6ZTpudWxsLHN0YXRlOmlubGluZT8iYmxvY2siOiJ0b3AiLHN0YXRlQXJnOm51bGwsY29udGV4dDpuZXcgQ29udGV4dChpbmxpbmU/ImJsb2NrIjoidG9wIixiYXNlfHwwLG51bGwpfTt9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnRva2VuaXplJiZzdHJlYW0uZWF0U3BhY2UoKSlyZXR1cm4gbnVsbDt2YXIgc3R5bGU9KHN0YXRlLnRva2VuaXplfHx0b2tlbkJhc2UpKHN0cmVhbSxzdGF0ZSk7aWYoc3R5bGUmJnR5cGVvZiBzdHlsZT09Im9iamVjdCIpe3R5cGU9c3R5bGVbMV07c3R5bGU9c3R5bGVbMF07fQpvdmVycmlkZT1zdHlsZTtpZih0eXBlIT0iY29tbWVudCIpCnN0YXRlLnN0YXRlPXN0YXRlc1tzdGF0ZS5zdGF0ZV0odHlwZSxzdHJlYW0sc3RhdGUpO3JldHVybiBvdmVycmlkZTt9LGluZGVudDpmdW5jdGlvbihzdGF0ZSx0ZXh0QWZ0ZXIpe3ZhciBjeD1zdGF0ZS5jb250ZXh0LGNoPXRleHRBZnRlciYmdGV4dEFmdGVyLmNoYXJBdCgwKTt2YXIgaW5kZW50PWN4LmluZGVudDtpZihjeC50eXBlPT0icHJvcCImJihjaD09In0ifHxjaD09IikiKSljeD1jeC5wcmV2O2lmKGN4LnByZXYpe2lmKGNoPT0ifSImJihjeC50eXBlPT0iYmxvY2sifHxjeC50eXBlPT0idG9wInx8Y3gudHlwZT09ImludGVycG9sYXRpb24ifHxjeC50eXBlPT0icmVzdHJpY3RlZF9hdEJsb2NrIikpe2N4PWN4LnByZXY7aW5kZW50PWN4LmluZGVudDt9ZWxzZSBpZihjaD09IikiJiYoY3gudHlwZT09InBhcmVucyJ8fGN4LnR5cGU9PSJhdEJsb2NrX3BhcmVucyIpfHxjaD09InsiJiYoY3gudHlwZT09ImF0Inx8Y3gudHlwZT09ImF0QmxvY2siKSl7aW5kZW50PU1hdGgubWF4KDAsY3guaW5kZW50LWluZGVudFVuaXQpO319CnJldHVybiBpbmRlbnQ7fSxlbGVjdHJpY0NoYXJzOiJ9IixibG9ja0NvbW1lbnRTdGFydDoiLyoiLGJsb2NrQ29tbWVudEVuZDoiKi8iLGJsb2NrQ29tbWVudENvbnRpbnVlOiIgKiAiLGxpbmVDb21tZW50OmxpbmVDb21tZW50LGZvbGQ6ImJyYWNlIn07fSk7ZnVuY3Rpb24ga2V5U2V0KGFycmF5KXt2YXIga2V5cz17fTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDsrK2kpe2tleXNbYXJyYXlbaV0udG9Mb3dlckNhc2UoKV09dHJ1ZTt9CnJldHVybiBrZXlzO30KdmFyIGRvY3VtZW50VHlwZXNfPVsiZG9tYWluIiwicmVnZXhwIiwidXJsIiwidXJsLXByZWZpeCJdLGRvY3VtZW50VHlwZXM9a2V5U2V0KGRvY3VtZW50VHlwZXNfKTt2YXIgbWVkaWFUeXBlc189WyJhbGwiLCJhdXJhbCIsImJyYWlsbGUiLCJoYW5kaGVsZCIsInByaW50IiwicHJvamVjdGlvbiIsInNjcmVlbiIsInR0eSIsInR2IiwiZW1ib3NzZWQiXSxtZWRpYVR5cGVzPWtleVNldChtZWRpYVR5cGVzXyk7dmFyIG1lZGlhRmVhdHVyZXNfPVsid2lkdGgiLCJtaW4td2lkdGgiLCJtYXgtd2lkdGgiLCJoZWlnaHQiLCJtaW4taGVpZ2h0IiwibWF4LWhlaWdodCIsImRldmljZS13aWR0aCIsIm1pbi1kZXZpY2Utd2lkdGgiLCJtYXgtZGV2aWNlLXdpZHRoIiwiZGV2aWNlLWhlaWdodCIsIm1pbi1kZXZpY2UtaGVpZ2h0IiwibWF4LWRldmljZS1oZWlnaHQiLCJhc3BlY3QtcmF0aW8iLCJtaW4tYXNwZWN0LXJhdGlvIiwibWF4LWFzcGVjdC1yYXRpbyIsImRldmljZS1hc3BlY3QtcmF0aW8iLCJtaW4tZGV2aWNlLWFzcGVjdC1yYXRpbyIsIm1heC1kZXZpY2UtYXNwZWN0LXJhdGlvIiwiY29sb3IiLCJtaW4tY29sb3IiLCJtYXgtY29sb3IiLCJjb2xvci1pbmRleCIsIm1pbi1jb2xvci1pbmRleCIsIm1heC1jb2xvci1pbmRleCIsIm1vbm9jaHJvbWUiLCJtaW4tbW9ub2Nocm9tZSIsIm1heC1tb25vY2hyb21lIiwicmVzb2x1dGlvbiIsIm1pbi1yZXNvbHV0aW9uIiwibWF4LXJlc29sdXRpb24iLCJzY2FuIiwiZ3JpZCIsIm9yaWVudGF0aW9uIiwiZGV2aWNlLXBpeGVsLXJhdGlvIiwibWluLWRldmljZS1waXhlbC1yYXRpbyIsIm1heC1kZXZpY2UtcGl4ZWwtcmF0aW8iLCJwb2ludGVyIiwiYW55LXBvaW50ZXIiLCJob3ZlciIsImFueS1ob3ZlciJdLG1lZGlhRmVhdHVyZXM9a2V5U2V0KG1lZGlhRmVhdHVyZXNfKTt2YXIgbWVkaWFWYWx1ZUtleXdvcmRzXz1bImxhbmRzY2FwZSIsInBvcnRyYWl0Iiwibm9uZSIsImNvYXJzZSIsImZpbmUiLCJvbi1kZW1hbmQiLCJob3ZlciIsImludGVybGFjZSIsInByb2dyZXNzaXZlIl0sbWVkaWFWYWx1ZUtleXdvcmRzPWtleVNldChtZWRpYVZhbHVlS2V5d29yZHNfKTt2YXIgcHJvcGVydHlLZXl3b3Jkc189WyJhbGlnbi1jb250ZW50IiwiYWxpZ24taXRlbXMiLCJhbGlnbi1zZWxmIiwiYWxpZ25tZW50LWFkanVzdCIsImFsaWdubWVudC1iYXNlbGluZSIsImFuY2hvci1wb2ludCIsImFuaW1hdGlvbiIsImFuaW1hdGlvbi1kZWxheSIsImFuaW1hdGlvbi1kaXJlY3Rpb24iLCJhbmltYXRpb24tZHVyYXRpb24iLCJhbmltYXRpb24tZmlsbC1tb2RlIiwiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIsImFuaW1hdGlvbi1uYW1lIiwiYW5pbWF0aW9uLXBsYXktc3RhdGUiLCJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIiwiYXBwZWFyYW5jZSIsImF6aW11dGgiLCJiYWNrZmFjZS12aXNpYmlsaXR5IiwiYmFja2dyb3VuZCIsImJhY2tncm91bmQtYXR0YWNobWVudCIsImJhY2tncm91bmQtYmxlbmQtbW9kZSIsImJhY2tncm91bmQtY2xpcCIsImJhY2tncm91bmQtY29sb3IiLCJiYWNrZ3JvdW5kLWltYWdlIiwiYmFja2dyb3VuZC1vcmlnaW4iLCJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwiYmFja2dyb3VuZC1yZXBlYXQiLCJiYWNrZ3JvdW5kLXNpemUiLCJiYXNlbGluZS1zaGlmdCIsImJpbmRpbmciLCJibGVlZCIsImJvb2ttYXJrLWxhYmVsIiwiYm9va21hcmstbGV2ZWwiLCJib29rbWFyay1zdGF0ZSIsImJvb2ttYXJrLXRhcmdldCIsImJvcmRlciIsImJvcmRlci1ib3R0b20iLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItY29sbGFwc2UiLCJib3JkZXItY29sb3IiLCJib3JkZXItaW1hZ2UiLCJib3JkZXItaW1hZ2Utb3V0c2V0IiwiYm9yZGVyLWltYWdlLXJlcGVhdCIsImJvcmRlci1pbWFnZS1zbGljZSIsImJvcmRlci1pbWFnZS1zb3VyY2UiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdCIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLWxlZnQtc3R5bGUiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yYWRpdXMiLCJib3JkZXItcmlnaHQiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItcmlnaHQtc3R5bGUiLCJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItc3BhY2luZyIsImJvcmRlci1zdHlsZSIsImJvcmRlci10b3AiLCJib3JkZXItdG9wLWNvbG9yIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1zdHlsZSIsImJvcmRlci10b3Atd2lkdGgiLCJib3JkZXItd2lkdGgiLCJib3R0b20iLCJib3gtZGVjb3JhdGlvbi1icmVhayIsImJveC1zaGFkb3ciLCJib3gtc2l6aW5nIiwiYnJlYWstYWZ0ZXIiLCJicmVhay1iZWZvcmUiLCJicmVhay1pbnNpZGUiLCJjYXB0aW9uLXNpZGUiLCJjYXJldC1jb2xvciIsImNsZWFyIiwiY2xpcCIsImNvbG9yIiwiY29sb3ItcHJvZmlsZSIsImNvbHVtbi1jb3VudCIsImNvbHVtbi1maWxsIiwiY29sdW1uLWdhcCIsImNvbHVtbi1ydWxlIiwiY29sdW1uLXJ1bGUtY29sb3IiLCJjb2x1bW4tcnVsZS1zdHlsZSIsImNvbHVtbi1ydWxlLXdpZHRoIiwiY29sdW1uLXNwYW4iLCJjb2x1bW4td2lkdGgiLCJjb2x1bW5zIiwiY29udGVudCIsImNvdW50ZXItaW5jcmVtZW50IiwiY291bnRlci1yZXNldCIsImNyb3AiLCJjdWUiLCJjdWUtYWZ0ZXIiLCJjdWUtYmVmb3JlIiwiY3Vyc29yIiwiZGlyZWN0aW9uIiwiZGlzcGxheSIsImRvbWluYW50LWJhc2VsaW5lIiwiZHJvcC1pbml0aWFsLWFmdGVyLWFkanVzdCIsImRyb3AtaW5pdGlhbC1hZnRlci1hbGlnbiIsImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0IiwiZHJvcC1pbml0aWFsLWJlZm9yZS1hbGlnbiIsImRyb3AtaW5pdGlhbC1zaXplIiwiZHJvcC1pbml0aWFsLXZhbHVlIiwiZWxldmF0aW9uIiwiZW1wdHktY2VsbHMiLCJmaXQiLCJmaXQtcG9zaXRpb24iLCJmbGV4IiwiZmxleC1iYXNpcyIsImZsZXgtZGlyZWN0aW9uIiwiZmxleC1mbG93IiwiZmxleC1ncm93IiwiZmxleC1zaHJpbmsiLCJmbGV4LXdyYXAiLCJmbG9hdCIsImZsb2F0LW9mZnNldCIsImZsb3ctZnJvbSIsImZsb3ctaW50byIsImZvbnQiLCJmb250LWZlYXR1cmUtc2V0dGluZ3MiLCJmb250LWZhbWlseSIsImZvbnQta2VybmluZyIsImZvbnQtbGFuZ3VhZ2Utb3ZlcnJpZGUiLCJmb250LXNpemUiLCJmb250LXNpemUtYWRqdXN0IiwiZm9udC1zdHJldGNoIiwiZm9udC1zdHlsZSIsImZvbnQtc3ludGhlc2lzIiwiZm9udC12YXJpYW50IiwiZm9udC12YXJpYW50LWFsdGVybmF0ZXMiLCJmb250LXZhcmlhbnQtY2FwcyIsImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIiwiZm9udC12YXJpYW50LWxpZ2F0dXJlcyIsImZvbnQtdmFyaWFudC1udW1lcmljIiwiZm9udC12YXJpYW50LXBvc2l0aW9uIiwiZm9udC13ZWlnaHQiLCJncmlkIiwiZ3JpZC1hcmVhIiwiZ3JpZC1hdXRvLWNvbHVtbnMiLCJncmlkLWF1dG8tZmxvdyIsImdyaWQtYXV0by1yb3dzIiwiZ3JpZC1jb2x1bW4iLCJncmlkLWNvbHVtbi1lbmQiLCJncmlkLWNvbHVtbi1nYXAiLCJncmlkLWNvbHVtbi1zdGFydCIsImdyaWQtZ2FwIiwiZ3JpZC1yb3ciLCJncmlkLXJvdy1lbmQiLCJncmlkLXJvdy1nYXAiLCJncmlkLXJvdy1zdGFydCIsImdyaWQtdGVtcGxhdGUiLCJncmlkLXRlbXBsYXRlLWFyZWFzIiwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIiwiZ3JpZC10ZW1wbGF0ZS1yb3dzIiwiaGFuZ2luZy1wdW5jdHVhdGlvbiIsImhlaWdodCIsImh5cGhlbnMiLCJpY29uIiwiaW1hZ2Utb3JpZW50YXRpb24iLCJpbWFnZS1yZW5kZXJpbmciLCJpbWFnZS1yZXNvbHV0aW9uIiwiaW5saW5lLWJveC1hbGlnbiIsImp1c3RpZnktY29udGVudCIsImp1c3RpZnktaXRlbXMiLCJqdXN0aWZ5LXNlbGYiLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJsaW5lLWJyZWFrIiwibGluZS1oZWlnaHQiLCJsaW5lLXN0YWNraW5nIiwibGluZS1zdGFja2luZy1ydWJ5IiwibGluZS1zdGFja2luZy1zaGlmdCIsImxpbmUtc3RhY2tpbmctc3RyYXRlZ3kiLCJsaXN0LXN0eWxlIiwibGlzdC1zdHlsZS1pbWFnZSIsImxpc3Qtc3R5bGUtcG9zaXRpb24iLCJsaXN0LXN0eWxlLXR5cGUiLCJtYXJnaW4iLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWFya3MiLCJtYXJxdWVlLWRpcmVjdGlvbiIsIm1hcnF1ZWUtbG9vcCIsIm1hcnF1ZWUtcGxheS1jb3VudCIsIm1hcnF1ZWUtc3BlZWQiLCJtYXJxdWVlLXN0eWxlIiwibWF4LWhlaWdodCIsIm1heC13aWR0aCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJtb3ZlLXRvIiwibmF2LWRvd24iLCJuYXYtaW5kZXgiLCJuYXYtbGVmdCIsIm5hdi1yaWdodCIsIm5hdi11cCIsIm9iamVjdC1maXQiLCJvYmplY3QtcG9zaXRpb24iLCJvcGFjaXR5Iiwib3JkZXIiLCJvcnBoYW5zIiwib3V0bGluZSIsIm91dGxpbmUtY29sb3IiLCJvdXRsaW5lLW9mZnNldCIsIm91dGxpbmUtc3R5bGUiLCJvdXRsaW5lLXdpZHRoIiwib3ZlcmZsb3ciLCJvdmVyZmxvdy1zdHlsZSIsIm92ZXJmbG93LXdyYXAiLCJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSIsInBhZGRpbmciLCJwYWRkaW5nLWJvdHRvbSIsInBhZGRpbmctbGVmdCIsInBhZGRpbmctcmlnaHQiLCJwYWRkaW5nLXRvcCIsInBhZ2UiLCJwYWdlLWJyZWFrLWFmdGVyIiwicGFnZS1icmVhay1iZWZvcmUiLCJwYWdlLWJyZWFrLWluc2lkZSIsInBhZ2UtcG9saWN5IiwicGF1c2UiLCJwYXVzZS1hZnRlciIsInBhdXNlLWJlZm9yZSIsInBlcnNwZWN0aXZlIiwicGVyc3BlY3RpdmUtb3JpZ2luIiwicGl0Y2giLCJwaXRjaC1yYW5nZSIsInBsYWNlLWNvbnRlbnQiLCJwbGFjZS1pdGVtcyIsInBsYWNlLXNlbGYiLCJwbGF5LWR1cmluZyIsInBvc2l0aW9uIiwicHJlc2VudGF0aW9uLWxldmVsIiwicHVuY3R1YXRpb24tdHJpbSIsInF1b3RlcyIsInJlZ2lvbi1icmVhay1hZnRlciIsInJlZ2lvbi1icmVhay1iZWZvcmUiLCJyZWdpb24tYnJlYWstaW5zaWRlIiwicmVnaW9uLWZyYWdtZW50IiwicmVuZGVyaW5nLWludGVudCIsInJlc2l6ZSIsInJlc3QiLCJyZXN0LWFmdGVyIiwicmVzdC1iZWZvcmUiLCJyaWNobmVzcyIsInJpZ2h0Iiwicm90YXRpb24iLCJyb3RhdGlvbi1wb2ludCIsInJ1YnktYWxpZ24iLCJydWJ5LW92ZXJoYW5nIiwicnVieS1wb3NpdGlvbiIsInJ1Ynktc3BhbiIsInNoYXBlLWltYWdlLXRocmVzaG9sZCIsInNoYXBlLWluc2lkZSIsInNoYXBlLW1hcmdpbiIsInNoYXBlLW91dHNpZGUiLCJzaXplIiwic3BlYWsiLCJzcGVhay1hcyIsInNwZWFrLWhlYWRlciIsInNwZWFrLW51bWVyYWwiLCJzcGVhay1wdW5jdHVhdGlvbiIsInNwZWVjaC1yYXRlIiwic3RyZXNzIiwic3RyaW5nLXNldCIsInRhYi1zaXplIiwidGFibGUtbGF5b3V0IiwidGFyZ2V0IiwidGFyZ2V0LW5hbWUiLCJ0YXJnZXQtbmV3IiwidGFyZ2V0LXBvc2l0aW9uIiwidGV4dC1hbGlnbiIsInRleHQtYWxpZ24tbGFzdCIsInRleHQtZGVjb3JhdGlvbiIsInRleHQtZGVjb3JhdGlvbi1jb2xvciIsInRleHQtZGVjb3JhdGlvbi1saW5lIiwidGV4dC1kZWNvcmF0aW9uLXNraXAiLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiLCJ0ZXh0LWVtcGhhc2lzIiwidGV4dC1lbXBoYXNpcy1jb2xvciIsInRleHQtZW1waGFzaXMtcG9zaXRpb24iLCJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwidGV4dC1oZWlnaHQiLCJ0ZXh0LWluZGVudCIsInRleHQtanVzdGlmeSIsInRleHQtb3V0bGluZSIsInRleHQtb3ZlcmZsb3ciLCJ0ZXh0LXNoYWRvdyIsInRleHQtc2l6ZS1hZGp1c3QiLCJ0ZXh0LXNwYWNlLWNvbGxhcHNlIiwidGV4dC10cmFuc2Zvcm0iLCJ0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiIsInRleHQtd3JhcCIsInRvcCIsInRyYW5zZm9ybSIsInRyYW5zZm9ybS1vcmlnaW4iLCJ0cmFuc2Zvcm0tc3R5bGUiLCJ0cmFuc2l0aW9uIiwidHJhbnNpdGlvbi1kZWxheSIsInRyYW5zaXRpb24tZHVyYXRpb24iLCJ0cmFuc2l0aW9uLXByb3BlcnR5IiwidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24iLCJ1bmljb2RlLWJpZGkiLCJ1c2VyLXNlbGVjdCIsInZlcnRpY2FsLWFsaWduIiwidmlzaWJpbGl0eSIsInZvaWNlLWJhbGFuY2UiLCJ2b2ljZS1kdXJhdGlvbiIsInZvaWNlLWZhbWlseSIsInZvaWNlLXBpdGNoIiwidm9pY2UtcmFuZ2UiLCJ2b2ljZS1yYXRlIiwidm9pY2Utc3RyZXNzIiwidm9pY2Utdm9sdW1lIiwidm9sdW1lIiwid2hpdGUtc3BhY2UiLCJ3aWRvd3MiLCJ3aWR0aCIsIndpbGwtY2hhbmdlIiwid29yZC1icmVhayIsIndvcmQtc3BhY2luZyIsIndvcmQtd3JhcCIsInotaW5kZXgiLCJjbGlwLXBhdGgiLCJjbGlwLXJ1bGUiLCJtYXNrIiwiZW5hYmxlLWJhY2tncm91bmQiLCJmaWx0ZXIiLCJmbG9vZC1jb2xvciIsImZsb29kLW9wYWNpdHkiLCJsaWdodGluZy1jb2xvciIsInN0b3AtY29sb3IiLCJzdG9wLW9wYWNpdHkiLCJwb2ludGVyLWV2ZW50cyIsImNvbG9yLWludGVycG9sYXRpb24iLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJjb2xvci1yZW5kZXJpbmciLCJmaWxsIiwiZmlsbC1vcGFjaXR5IiwiZmlsbC1ydWxlIiwiaW1hZ2UtcmVuZGVyaW5nIiwibWFya2VyIiwibWFya2VyLWVuZCIsIm1hcmtlci1taWQiLCJtYXJrZXItc3RhcnQiLCJzaGFwZS1yZW5kZXJpbmciLCJzdHJva2UiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtbGluZWNhcCIsInN0cm9rZS1saW5lam9pbiIsInN0cm9rZS1taXRlcmxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJ0ZXh0LXJlbmRlcmluZyIsImJhc2VsaW5lLXNoaWZ0IiwiZG9taW5hbnQtYmFzZWxpbmUiLCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIiwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLCJ0ZXh0LWFuY2hvciIsIndyaXRpbmctbW9kZSJdLHByb3BlcnR5S2V5d29yZHM9a2V5U2V0KHByb3BlcnR5S2V5d29yZHNfKTt2YXIgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXz1bInNjcm9sbGJhci1hcnJvdy1jb2xvciIsInNjcm9sbGJhci1iYXNlLWNvbG9yIiwic2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yIiwic2Nyb2xsYmFyLWZhY2UtY29sb3IiLCJzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yIiwic2Nyb2xsYmFyLXNoYWRvdy1jb2xvciIsInNjcm9sbGJhci0zZC1saWdodC1jb2xvciIsInNjcm9sbGJhci10cmFjay1jb2xvciIsInNoYXBlLWluc2lkZSIsInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b24iLCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCJ6b29tIl0sbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzPWtleVNldChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfKTt2YXIgZm9udFByb3BlcnRpZXNfPVsiZm9udC1mYW1pbHkiLCJzcmMiLCJ1bmljb2RlLXJhbmdlIiwiZm9udC12YXJpYW50IiwiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwiZm9udC1zdHJldGNoIiwiZm9udC13ZWlnaHQiLCJmb250LXN0eWxlIl0sZm9udFByb3BlcnRpZXM9a2V5U2V0KGZvbnRQcm9wZXJ0aWVzXyk7dmFyIGNvdW50ZXJEZXNjcmlwdG9yc189WyJhZGRpdGl2ZS1zeW1ib2xzIiwiZmFsbGJhY2siLCJuZWdhdGl2ZSIsInBhZCIsInByZWZpeCIsInJhbmdlIiwic3BlYWstYXMiLCJzdWZmaXgiLCJzeW1ib2xzIiwic3lzdGVtIl0sY291bnRlckRlc2NyaXB0b3JzPWtleVNldChjb3VudGVyRGVzY3JpcHRvcnNfKTt2YXIgY29sb3JLZXl3b3Jkc189WyJhbGljZWJsdWUiLCJhbnRpcXVld2hpdGUiLCJhcXVhIiwiYXF1YW1hcmluZSIsImF6dXJlIiwiYmVpZ2UiLCJiaXNxdWUiLCJibGFjayIsImJsYW5jaGVkYWxtb25kIiwiYmx1ZSIsImJsdWV2aW9sZXQiLCJicm93biIsImJ1cmx5d29vZCIsImNhZGV0Ymx1ZSIsImNoYXJ0cmV1c2UiLCJjaG9jb2xhdGUiLCJjb3JhbCIsImNvcm5mbG93ZXJibHVlIiwiY29ybnNpbGsiLCJjcmltc29uIiwiY3lhbiIsImRhcmtibHVlIiwiZGFya2N5YW4iLCJkYXJrZ29sZGVucm9kIiwiZGFya2dyYXkiLCJkYXJrZ3JlZW4iLCJkYXJra2hha2kiLCJkYXJrbWFnZW50YSIsImRhcmtvbGl2ZWdyZWVuIiwiZGFya29yYW5nZSIsImRhcmtvcmNoaWQiLCJkYXJrcmVkIiwiZGFya3NhbG1vbiIsImRhcmtzZWFncmVlbiIsImRhcmtzbGF0ZWJsdWUiLCJkYXJrc2xhdGVncmF5IiwiZGFya3R1cnF1b2lzZSIsImRhcmt2aW9sZXQiLCJkZWVwcGluayIsImRlZXBza3libHVlIiwiZGltZ3JheSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZXkiLCJncmVlbiIsImdyZWVueWVsbG93IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c3RlZWxibHVlIiwibGlnaHR5ZWxsb3ciLCJsaW1lIiwibGltZWdyZWVuIiwibGluZW4iLCJtYWdlbnRhIiwibWFyb29uIiwibWVkaXVtYXF1YW1hcmluZSIsIm1lZGl1bWJsdWUiLCJtZWRpdW1vcmNoaWQiLCJtZWRpdW1wdXJwbGUiLCJtZWRpdW1zZWFncmVlbiIsIm1lZGl1bXNsYXRlYmx1ZSIsIm1lZGl1bXNwcmluZ2dyZWVuIiwibWVkaXVtdHVycXVvaXNlIiwibWVkaXVtdmlvbGV0cmVkIiwibWlkbmlnaHRibHVlIiwibWludGNyZWFtIiwibWlzdHlyb3NlIiwibW9jY2FzaW4iLCJuYXZham93aGl0ZSIsIm5hdnkiLCJvbGRsYWNlIiwib2xpdmUiLCJvbGl2ZWRyYWIiLCJvcmFuZ2UiLCJvcmFuZ2VyZWQiLCJvcmNoaWQiLCJwYWxlZ29sZGVucm9kIiwicGFsZWdyZWVuIiwicGFsZXR1cnF1b2lzZSIsInBhbGV2aW9sZXRyZWQiLCJwYXBheWF3aGlwIiwicGVhY2hwdWZmIiwicGVydSIsInBpbmsiLCJwbHVtIiwicG93ZGVyYmx1ZSIsInB1cnBsZSIsInJlYmVjY2FwdXJwbGUiLCJyZWQiLCJyb3N5YnJvd24iLCJyb3lhbGJsdWUiLCJzYWRkbGVicm93biIsInNhbG1vbiIsInNhbmR5YnJvd24iLCJzZWFncmVlbiIsInNlYXNoZWxsIiwic2llbm5hIiwic2lsdmVyIiwic2t5Ymx1ZSIsInNsYXRlYmx1ZSIsInNsYXRlZ3JheSIsInNub3ciLCJzcHJpbmdncmVlbiIsInN0ZWVsYmx1ZSIsInRhbiIsInRlYWwiLCJ0aGlzdGxlIiwidG9tYXRvIiwidHVycXVvaXNlIiwidmlvbGV0Iiwid2hlYXQiLCJ3aGl0ZSIsIndoaXRlc21va2UiLCJ5ZWxsb3ciLCJ5ZWxsb3dncmVlbiJdLGNvbG9yS2V5d29yZHM9a2V5U2V0KGNvbG9yS2V5d29yZHNfKTt2YXIgdmFsdWVLZXl3b3Jkc189WyJhYm92ZSIsImFic29sdXRlIiwiYWN0aXZlYm9yZGVyIiwiYWRkaXRpdmUiLCJhY3RpdmVjYXB0aW9uIiwiYWZhciIsImFmdGVyLXdoaXRlLXNwYWNlIiwiYWhlYWQiLCJhbGlhcyIsImFsbCIsImFsbC1zY3JvbGwiLCJhbHBoYWJldGljIiwiYWx0ZXJuYXRlIiwiYWx3YXlzIiwiYW1oYXJpYyIsImFtaGFyaWMtYWJlZ2VkZSIsImFudGlhbGlhc2VkIiwiYXBwd29ya3NwYWNlIiwiYXJhYmljLWluZGljIiwiYXJtZW5pYW4iLCJhc3Rlcmlza3MiLCJhdHRyIiwiYXV0byIsImF1dG8tZmxvdyIsImF2b2lkIiwiYXZvaWQtY29sdW1uIiwiYXZvaWQtcGFnZSIsImF2b2lkLXJlZ2lvbiIsImJhY2tncm91bmQiLCJiYWNrd2FyZHMiLCJiYXNlbGluZSIsImJlbG93IiwiYmlkaS1vdmVycmlkZSIsImJpbmFyeSIsImJlbmdhbGkiLCJibGluayIsImJsb2NrIiwiYmxvY2stYXhpcyIsImJvbGQiLCJib2xkZXIiLCJib3JkZXIiLCJib3JkZXItYm94IiwiYm90aCIsImJvdHRvbSIsImJyZWFrIiwiYnJlYWstYWxsIiwiYnJlYWstd29yZCIsImJ1bGxldHMiLCJidXR0b24iLCJidXR0b24tYmV2ZWwiLCJidXR0b25mYWNlIiwiYnV0dG9uaGlnaGxpZ2h0IiwiYnV0dG9uc2hhZG93IiwiYnV0dG9udGV4dCIsImNhbGMiLCJjYW1ib2RpYW4iLCJjYXBpdGFsaXplIiwiY2Fwcy1sb2NrLWluZGljYXRvciIsImNhcHRpb24iLCJjYXB0aW9udGV4dCIsImNhcmV0IiwiY2VsbCIsImNlbnRlciIsImNoZWNrYm94IiwiY2lyY2xlIiwiY2prLWRlY2ltYWwiLCJjamstZWFydGhseS1icmFuY2giLCJjamstaGVhdmVubHktc3RlbSIsImNqay1pZGVvZ3JhcGhpYyIsImNsZWFyIiwiY2xpcCIsImNsb3NlLXF1b3RlIiwiY29sLXJlc2l6ZSIsImNvbGxhcHNlIiwiY29sb3IiLCJjb2xvci1idXJuIiwiY29sb3ItZG9kZ2UiLCJjb2x1bW4iLCJjb2x1bW4tcmV2ZXJzZSIsImNvbXBhY3QiLCJjb25kZW5zZWQiLCJjb250YWluIiwiY29udGVudCIsImNvbnRlbnRzIiwiY29udGVudC1ib3giLCJjb250ZXh0LW1lbnUiLCJjb250aW51b3VzIiwiY29weSIsImNvdW50ZXIiLCJjb3VudGVycyIsImNvdmVyIiwiY3JvcCIsImNyb3NzIiwiY3Jvc3NoYWlyIiwiY3VycmVudGNvbG9yIiwiY3Vyc2l2ZSIsImN5Y2xpYyIsImRhcmtlbiIsImRhc2hlZCIsImRlY2ltYWwiLCJkZWNpbWFsLWxlYWRpbmctemVybyIsImRlZmF1bHQiLCJkZWZhdWx0LWJ1dHRvbiIsImRlbnNlIiwiZGVzdGluYXRpb24tYXRvcCIsImRlc3RpbmF0aW9uLWluIiwiZGVzdGluYXRpb24tb3V0IiwiZGVzdGluYXRpb24tb3ZlciIsImRldmFuYWdhcmkiLCJkaWZmZXJlbmNlIiwiZGlzYyIsImRpc2NhcmQiLCJkaXNjbG9zdXJlLWNsb3NlZCIsImRpc2Nsb3N1cmUtb3BlbiIsImRvY3VtZW50IiwiZG90LWRhc2giLCJkb3QtZG90LWRhc2giLCJkb3R0ZWQiLCJkb3VibGUiLCJkb3duIiwiZS1yZXNpemUiLCJlYXNlIiwiZWFzZS1pbiIsImVhc2UtaW4tb3V0IiwiZWFzZS1vdXQiLCJlbGVtZW50IiwiZWxsaXBzZSIsImVsbGlwc2lzIiwiZW1iZWQiLCJlbmQiLCJldGhpb3BpYyIsImV0aGlvcGljLWFiZWdlZGUiLCJldGhpb3BpYy1hYmVnZWRlLWFtLWV0IiwiZXRoaW9waWMtYWJlZ2VkZS1nZXoiLCJldGhpb3BpYy1hYmVnZWRlLXRpLWVyIiwiZXRoaW9waWMtYWJlZ2VkZS10aS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLWFhLWVyIiwiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXQiLCJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLWdleiIsImV0aGlvcGljLWhhbGVoYW1lLW9tLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtc2lkLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtc28tZXQiLCJldGhpb3BpYy1oYWxlaGFtZS10aS1lciIsImV0aGlvcGljLWhhbGVoYW1lLXRpLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtdGlnIiwiZXRoaW9waWMtbnVtZXJpYyIsImV3LXJlc2l6ZSIsImV4Y2x1c2lvbiIsImV4cGFuZGVkIiwiZXh0ZW5kcyIsImV4dHJhLWNvbmRlbnNlZCIsImV4dHJhLWV4cGFuZGVkIiwiZmFudGFzeSIsImZhc3QiLCJmaWxsIiwiZml4ZWQiLCJmbGF0IiwiZmxleCIsImZsZXgtZW5kIiwiZmxleC1zdGFydCIsImZvb3Rub3RlcyIsImZvcndhcmRzIiwiZnJvbSIsImdlb21ldHJpY1ByZWNpc2lvbiIsImdlb3JnaWFuIiwiZ3JheXRleHQiLCJncmlkIiwiZ3Jvb3ZlIiwiZ3VqYXJhdGkiLCJndXJtdWtoaSIsImhhbmQiLCJoYW5ndWwiLCJoYW5ndWwtY29uc29uYW50IiwiaGFyZC1saWdodCIsImhlYnJldyIsImhlbHAiLCJoaWRkZW4iLCJoaWRlIiwiaGlnaGVyIiwiaGlnaGxpZ2h0IiwiaGlnaGxpZ2h0dGV4dCIsImhpcmFnYW5hIiwiaGlyYWdhbmEtaXJvaGEiLCJob3Jpem9udGFsIiwiaHNsIiwiaHNsYSIsImh1ZSIsImljb24iLCJpZ25vcmUiLCJpbmFjdGl2ZWJvcmRlciIsImluYWN0aXZlY2FwdGlvbiIsImluYWN0aXZlY2FwdGlvbnRleHQiLCJpbmZpbml0ZSIsImluZm9iYWNrZ3JvdW5kIiwiaW5mb3RleHQiLCJpbmhlcml0IiwiaW5pdGlhbCIsImlubGluZSIsImlubGluZS1heGlzIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lLWZsZXgiLCJpbmxpbmUtZ3JpZCIsImlubGluZS10YWJsZSIsImluc2V0IiwiaW5zaWRlIiwiaW50cmluc2ljIiwiaW52ZXJ0IiwiaXRhbGljIiwiamFwYW5lc2UtZm9ybWFsIiwiamFwYW5lc2UtaW5mb3JtYWwiLCJqdXN0aWZ5Iiwia2FubmFkYSIsImthdGFrYW5hIiwia2F0YWthbmEtaXJvaGEiLCJrZWVwLWFsbCIsImtobWVyIiwia29yZWFuLWhhbmd1bC1mb3JtYWwiLCJrb3JlYW4taGFuamEtZm9ybWFsIiwia29yZWFuLWhhbmphLWluZm9ybWFsIiwibGFuZHNjYXBlIiwibGFvIiwibGFyZ2UiLCJsYXJnZXIiLCJsZWZ0IiwibGV2ZWwiLCJsaWdodGVyIiwibGlnaHRlbiIsImxpbmUtdGhyb3VnaCIsImxpbmVhciIsImxpbmVhci1ncmFkaWVudCIsImxpbmVzIiwibGlzdC1pdGVtIiwibGlzdGJveCIsImxpc3RpdGVtIiwibG9jYWwiLCJsb2dpY2FsIiwibG91ZCIsImxvd2VyIiwibG93ZXItYWxwaGEiLCJsb3dlci1hcm1lbmlhbiIsImxvd2VyLWdyZWVrIiwibG93ZXItaGV4YWRlY2ltYWwiLCJsb3dlci1sYXRpbiIsImxvd2VyLW5vcndlZ2lhbiIsImxvd2VyLXJvbWFuIiwibG93ZXJjYXNlIiwibHRyIiwibHVtaW5vc2l0eSIsIm1hbGF5YWxhbSIsIm1hdGNoIiwibWF0cml4IiwibWF0cml4M2QiLCJtZWRpYS1jb250cm9scy1iYWNrZ3JvdW5kIiwibWVkaWEtY3VycmVudC10aW1lLWRpc3BsYXkiLCJtZWRpYS1mdWxsc2NyZWVuLWJ1dHRvbiIsIm1lZGlhLW11dGUtYnV0dG9uIiwibWVkaWEtcGxheS1idXR0b24iLCJtZWRpYS1yZXR1cm4tdG8tcmVhbHRpbWUtYnV0dG9uIiwibWVkaWEtcmV3aW5kLWJ1dHRvbiIsIm1lZGlhLXNlZWstYmFjay1idXR0b24iLCJtZWRpYS1zZWVrLWZvcndhcmQtYnV0dG9uIiwibWVkaWEtc2xpZGVyIiwibWVkaWEtc2xpZGVydGh1bWIiLCJtZWRpYS10aW1lLXJlbWFpbmluZy1kaXNwbGF5IiwibWVkaWEtdm9sdW1lLXNsaWRlciIsIm1lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyIiwibWVkaWEtdm9sdW1lLXNsaWRlcnRodW1iIiwibWVkaXVtIiwibWVudSIsIm1lbnVsaXN0IiwibWVudWxpc3QtYnV0dG9uIiwibWVudWxpc3QtdGV4dCIsIm1lbnVsaXN0LXRleHRmaWVsZCIsIm1lbnV0ZXh0IiwibWVzc2FnZS1ib3giLCJtaWRkbGUiLCJtaW4taW50cmluc2ljIiwibWl4IiwibW9uZ29saWFuIiwibW9ub3NwYWNlIiwibW92ZSIsIm11bHRpcGxlIiwibXVsdGlwbHkiLCJteWFubWFyIiwibi1yZXNpemUiLCJuYXJyb3dlciIsIm5lLXJlc2l6ZSIsIm5lc3ctcmVzaXplIiwibm8tY2xvc2UtcXVvdGUiLCJuby1kcm9wIiwibm8tb3Blbi1xdW90ZSIsIm5vLXJlcGVhdCIsIm5vbmUiLCJub3JtYWwiLCJub3QtYWxsb3dlZCIsIm5vd3JhcCIsIm5zLXJlc2l6ZSIsIm51bWJlcnMiLCJudW1lcmljIiwibnctcmVzaXplIiwibndzZS1yZXNpemUiLCJvYmxpcXVlIiwib2N0YWwiLCJvcGFjaXR5Iiwib3Blbi1xdW90ZSIsIm9wdGltaXplTGVnaWJpbGl0eSIsIm9wdGltaXplU3BlZWQiLCJvcml5YSIsIm9yb21vIiwib3V0c2V0Iiwib3V0c2lkZSIsIm91dHNpZGUtc2hhcGUiLCJvdmVybGF5Iiwib3ZlcmxpbmUiLCJwYWRkaW5nIiwicGFkZGluZy1ib3giLCJwYWludGVkIiwicGFnZSIsInBhdXNlZCIsInBlcnNpYW4iLCJwZXJzcGVjdGl2ZSIsInBsdXMtZGFya2VyIiwicGx1cy1saWdodGVyIiwicG9pbnRlciIsInBvbHlnb24iLCJwb3J0cmFpdCIsInByZSIsInByZS1saW5lIiwicHJlLXdyYXAiLCJwcmVzZXJ2ZS0zZCIsInByb2dyZXNzIiwicHVzaC1idXR0b24iLCJyYWRpYWwtZ3JhZGllbnQiLCJyYWRpbyIsInJlYWQtb25seSIsInJlYWQtd3JpdGUiLCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5IiwicmVjdGFuZ2xlIiwicmVnaW9uIiwicmVsYXRpdmUiLCJyZXBlYXQiLCJyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50IiwicmVwZWF0aW5nLXJhZGlhbC1ncmFkaWVudCIsInJlcGVhdC14IiwicmVwZWF0LXkiLCJyZXNldCIsInJldmVyc2UiLCJyZ2IiLCJyZ2JhIiwicmlkZ2UiLCJyaWdodCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwicm91bmQiLCJyb3ciLCJyb3ctcmVzaXplIiwicm93LXJldmVyc2UiLCJydGwiLCJydW4taW4iLCJydW5uaW5nIiwicy1yZXNpemUiLCJzYW5zLXNlcmlmIiwic2F0dXJhdGlvbiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNjcmVlbiIsInNjcm9sbCIsInNjcm9sbGJhciIsInNjcm9sbC1wb3NpdGlvbiIsInNlLXJlc2l6ZSIsInNlYXJjaGZpZWxkIiwic2VhcmNoZmllbGQtY2FuY2VsLWJ1dHRvbiIsInNlYXJjaGZpZWxkLWRlY29yYXRpb24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWJ1dHRvbiIsInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvbiIsInNlbGYtc3RhcnQiLCJzZWxmLWVuZCIsInNlbWktY29uZGVuc2VkIiwic2VtaS1leHBhbmRlZCIsInNlcGFyYXRlIiwic2VyaWYiLCJzaG93Iiwic2lkYW1hIiwic2ltcC1jaGluZXNlLWZvcm1hbCIsInNpbXAtY2hpbmVzZS1pbmZvcm1hbCIsInNpbmdsZSIsInNrZXciLCJza2V3WCIsInNrZXdZIiwic2tpcC13aGl0ZS1zcGFjZSIsInNsaWRlIiwic2xpZGVyLWhvcml6b250YWwiLCJzbGlkZXItdmVydGljYWwiLCJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsIiwic2xpZGVydGh1bWItdmVydGljYWwiLCJzbG93Iiwic21hbGwiLCJzbWFsbC1jYXBzIiwic21hbGwtY2FwdGlvbiIsInNtYWxsZXIiLCJzb2Z0LWxpZ2h0Iiwic29saWQiLCJzb21hbGkiLCJzb3VyY2UtYXRvcCIsInNvdXJjZS1pbiIsInNvdXJjZS1vdXQiLCJzb3VyY2Utb3ZlciIsInNwYWNlIiwic3BhY2UtYXJvdW5kIiwic3BhY2UtYmV0d2VlbiIsInNwYWNlLWV2ZW5seSIsInNwZWxsLW91dCIsInNxdWFyZSIsInNxdWFyZS1idXR0b24iLCJzdGFydCIsInN0YXRpYyIsInN0YXR1cy1iYXIiLCJzdHJldGNoIiwic3Ryb2tlIiwic3ViIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiLCJzdXBlciIsInN3LXJlc2l6ZSIsInN5bWJvbGljIiwic3ltYm9scyIsInN5c3RlbS11aSIsInRhYmxlIiwidGFibGUtY2FwdGlvbiIsInRhYmxlLWNlbGwiLCJ0YWJsZS1jb2x1bW4iLCJ0YWJsZS1jb2x1bW4tZ3JvdXAiLCJ0YWJsZS1mb290ZXItZ3JvdXAiLCJ0YWJsZS1oZWFkZXItZ3JvdXAiLCJ0YWJsZS1yb3ciLCJ0YWJsZS1yb3ctZ3JvdXAiLCJ0YW1pbCIsInRlbHVndSIsInRleHQiLCJ0ZXh0LWJvdHRvbSIsInRleHQtdG9wIiwidGV4dGFyZWEiLCJ0ZXh0ZmllbGQiLCJ0aGFpIiwidGhpY2siLCJ0aGluIiwidGhyZWVkZGFya3NoYWRvdyIsInRocmVlZGZhY2UiLCJ0aHJlZWRoaWdobGlnaHQiLCJ0aHJlZWRsaWdodHNoYWRvdyIsInRocmVlZHNoYWRvdyIsInRpYmV0YW4iLCJ0aWdyZSIsInRpZ3JpbnlhLWVyIiwidGlncmlueWEtZXItYWJlZ2VkZSIsInRpZ3JpbnlhLWV0IiwidGlncmlueWEtZXQtYWJlZ2VkZSIsInRvIiwidG9wIiwidHJhZC1jaGluZXNlLWZvcm1hbCIsInRyYWQtY2hpbmVzZS1pbmZvcm1hbCIsInRyYW5zZm9ybSIsInRyYW5zbGF0ZSIsInRyYW5zbGF0ZTNkIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIiwidHJhbnNwYXJlbnQiLCJ1bHRyYS1jb25kZW5zZWQiLCJ1bHRyYS1leHBhbmRlZCIsInVuZGVybGluZSIsInVuc2V0IiwidXAiLCJ1cHBlci1hbHBoYSIsInVwcGVyLWFybWVuaWFuIiwidXBwZXItZ3JlZWsiLCJ1cHBlci1oZXhhZGVjaW1hbCIsInVwcGVyLWxhdGluIiwidXBwZXItbm9yd2VnaWFuIiwidXBwZXItcm9tYW4iLCJ1cHBlcmNhc2UiLCJ1cmR1IiwidXJsIiwidmFyIiwidmVydGljYWwiLCJ2ZXJ0aWNhbC10ZXh0IiwidmlzaWJsZSIsInZpc2libGVGaWxsIiwidmlzaWJsZVBhaW50ZWQiLCJ2aXNpYmxlU3Ryb2tlIiwidmlzdWFsIiwidy1yZXNpemUiLCJ3YWl0Iiwid2F2ZSIsIndpZGVyIiwid2luZG93Iiwid2luZG93ZnJhbWUiLCJ3aW5kb3d0ZXh0Iiwid29yZHMiLCJ3cmFwIiwid3JhcC1yZXZlcnNlIiwieC1sYXJnZSIsIngtc21hbGwiLCJ4b3IiLCJ4eC1sYXJnZSIsInh4LXNtYWxsIl0sdmFsdWVLZXl3b3Jkcz1rZXlTZXQodmFsdWVLZXl3b3Jkc18pO3ZhciBhbGxXb3Jkcz1kb2N1bWVudFR5cGVzXy5jb25jYXQobWVkaWFUeXBlc18pLmNvbmNhdChtZWRpYUZlYXR1cmVzXykuY29uY2F0KG1lZGlhVmFsdWVLZXl3b3Jkc18pLmNvbmNhdChwcm9wZXJ0eUtleXdvcmRzXykuY29uY2F0KG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18pLmNvbmNhdChjb2xvcktleXdvcmRzXykuY29uY2F0KHZhbHVlS2V5d29yZHNfKTtDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCJjc3MiLGFsbFdvcmRzKTtmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSxzdGF0ZSl7dmFyIG1heWJlRW5kPWZhbHNlLGNoO3doaWxlKChjaD1zdHJlYW0ubmV4dCgpKSE9bnVsbCl7aWYobWF5YmVFbmQmJmNoPT0iLyIpe3N0YXRlLnRva2VuaXplPW51bGw7YnJlYWs7fQptYXliZUVuZD0oY2g9PSIqIik7fQpyZXR1cm5bImNvbW1lbnQiLCJjb21tZW50Il07fQpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvY3NzIix7ZG9jdW1lbnRUeXBlczpkb2N1bWVudFR5cGVzLG1lZGlhVHlwZXM6bWVkaWFUeXBlcyxtZWRpYUZlYXR1cmVzOm1lZGlhRmVhdHVyZXMsbWVkaWFWYWx1ZUtleXdvcmRzOm1lZGlhVmFsdWVLZXl3b3Jkcyxwcm9wZXJ0eUtleXdvcmRzOnByb3BlcnR5S2V5d29yZHMsbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOm5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcyxmb250UHJvcGVydGllczpmb250UHJvcGVydGllcyxjb3VudGVyRGVzY3JpcHRvcnM6Y291bnRlckRlc2NyaXB0b3JzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsdG9rZW5Ib29rczp7Ii8iOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0cmVhbS5lYXQoIioiKSlyZXR1cm4gZmFsc2U7c3RhdGUudG9rZW5pemU9dG9rZW5DQ29tbWVudDtyZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sc3RhdGUpO319LG5hbWU6ImNzcyJ9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zY3NzIix7bWVkaWFUeXBlczptZWRpYVR5cGVzLG1lZGlhRmVhdHVyZXM6bWVkaWFGZWF0dXJlcyxtZWRpYVZhbHVlS2V5d29yZHM6bWVkaWFWYWx1ZUtleXdvcmRzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsZm9udFByb3BlcnRpZXM6Zm9udFByb3BlcnRpZXMsYWxsb3dOZXN0ZWQ6dHJ1ZSxsaW5lQ29tbWVudDoiLy8iLHRva2VuSG9va3M6eyIvIjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpe2lmKHN0cmVhbS5lYXQoIi8iKSl7c3RyZWFtLnNraXBUb0VuZCgpO3JldHVyblsiY29tbWVudCIsImNvbW1lbnQiXTt9ZWxzZSBpZihzdHJlYW0uZWF0KCIqIikpe3N0YXRlLnRva2VuaXplPXRva2VuQ0NvbW1lbnQ7cmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLHN0YXRlKTt9ZWxzZXtyZXR1cm5bIm9wZXJhdG9yIiwib3BlcmF0b3IiXTt9fSwiOiI6ZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0ubWF0Y2goL1xzKlx7LyxmYWxzZSkpCnJldHVybltudWxsLG51bGxdCnJldHVybiBmYWxzZTt9LCIkIjpmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS5tYXRjaCgvXltcdy1dKy8pO2lmKHN0cmVhbS5tYXRjaCgvXlxzKjovLGZhbHNlKSkKcmV0dXJuWyJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiJdO3JldHVyblsidmFyaWFibGUtMiIsInZhcmlhYmxlIl07fSwiIyI6ZnVuY3Rpb24oc3RyZWFtKXtpZighc3RyZWFtLmVhdCgieyIpKXJldHVybiBmYWxzZTtyZXR1cm5bbnVsbCwiaW50ZXJwb2xhdGlvbiJdO319LG5hbWU6ImNzcyIsaGVscGVyVHlwZToic2NzcyJ9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1sZXNzIix7bWVkaWFUeXBlczptZWRpYVR5cGVzLG1lZGlhRmVhdHVyZXM6bWVkaWFGZWF0dXJlcyxtZWRpYVZhbHVlS2V5d29yZHM6bWVkaWFWYWx1ZUtleXdvcmRzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsZm9udFByb3BlcnRpZXM6Zm9udFByb3BlcnRpZXMsYWxsb3dOZXN0ZWQ6dHJ1ZSxsaW5lQ29tbWVudDoiLy8iLHRva2VuSG9va3M6eyIvIjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpe2lmKHN0cmVhbS5lYXQoIi8iKSl7c3RyZWFtLnNraXBUb0VuZCgpO3JldHVyblsiY29tbWVudCIsImNvbW1lbnQiXTt9ZWxzZSBpZihzdHJlYW0uZWF0KCIqIikpe3N0YXRlLnRva2VuaXplPXRva2VuQ0NvbW1lbnQ7cmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLHN0YXRlKTt9ZWxzZXtyZXR1cm5bIm9wZXJhdG9yIiwib3BlcmF0b3IiXTt9fSwiQCI6ZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0uZWF0KCJ7IikpcmV0dXJuW251bGwsImludGVycG9sYXRpb24iXTtpZihzdHJlYW0ubWF0Y2goL14oY2hhcnNldHxkb2N1bWVudHxmb250LWZhY2V8aW1wb3J0fCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXN8bWVkaWF8bmFtZXNwYWNlfHBhZ2V8c3VwcG9ydHMpXGIvLGZhbHNlKSlyZXR1cm4gZmFsc2U7c3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pO2lmKHN0cmVhbS5tYXRjaCgvXlxzKjovLGZhbHNlKSkKcmV0dXJuWyJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiJdO3JldHVyblsidmFyaWFibGUtMiIsInZhcmlhYmxlIl07fSwiJiI6ZnVuY3Rpb24oKXtyZXR1cm5bImF0b20iLCJhdG9tIl07fX0sbmFtZToiY3NzIixoZWxwZXJUeXBlOiJsZXNzIn0pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdzcyIse2RvY3VtZW50VHlwZXM6ZG9jdW1lbnRUeXBlcyxtZWRpYVR5cGVzOm1lZGlhVHlwZXMsbWVkaWFGZWF0dXJlczptZWRpYUZlYXR1cmVzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGZvbnRQcm9wZXJ0aWVzOmZvbnRQcm9wZXJ0aWVzLGNvdW50ZXJEZXNjcmlwdG9yczpjb3VudGVyRGVzY3JpcHRvcnMsY29sb3JLZXl3b3Jkczpjb2xvcktleXdvcmRzLHZhbHVlS2V5d29yZHM6dmFsdWVLZXl3b3JkcyxzdXBwb3J0c0F0Q29tcG9uZW50OnRydWUsdG9rZW5Ib29rczp7Ii8iOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0cmVhbS5lYXQoIioiKSlyZXR1cm4gZmFsc2U7c3RhdGUudG9rZW5pemU9dG9rZW5DQ29tbWVudDtyZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sc3RhdGUpO319LG5hbWU6ImNzcyIsaGVscGVyVHlwZToiZ3NzIn0pO30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO3ZhciBodG1sQ29uZmlnPXthdXRvU2VsZkNsb3NlcnM6eydhcmVhJzp0cnVlLCdiYXNlJzp0cnVlLCdicic6dHJ1ZSwnY29sJzp0cnVlLCdjb21tYW5kJzp0cnVlLCdlbWJlZCc6dHJ1ZSwnZnJhbWUnOnRydWUsJ2hyJzp0cnVlLCdpbWcnOnRydWUsJ2lucHV0Jzp0cnVlLCdrZXlnZW4nOnRydWUsJ2xpbmsnOnRydWUsJ21ldGEnOnRydWUsJ3BhcmFtJzp0cnVlLCdzb3VyY2UnOnRydWUsJ3RyYWNrJzp0cnVlLCd3YnInOnRydWUsJ21lbnVpdGVtJzp0cnVlfSxpbXBsaWNpdGx5Q2xvc2VkOnsnZGQnOnRydWUsJ2xpJzp0cnVlLCdvcHRncm91cCc6dHJ1ZSwnb3B0aW9uJzp0cnVlLCdwJzp0cnVlLCdycCc6dHJ1ZSwncnQnOnRydWUsJ3Rib2R5Jzp0cnVlLCd0ZCc6dHJ1ZSwndGZvb3QnOnRydWUsJ3RoJzp0cnVlLCd0cic6dHJ1ZX0sY29udGV4dEdyYWJiZXJzOnsnZGQnOnsnZGQnOnRydWUsJ2R0Jzp0cnVlfSwnZHQnOnsnZGQnOnRydWUsJ2R0Jzp0cnVlfSwnbGknOnsnbGknOnRydWV9LCdvcHRpb24nOnsnb3B0aW9uJzp0cnVlLCdvcHRncm91cCc6dHJ1ZX0sJ29wdGdyb3VwJzp7J29wdGdyb3VwJzp0cnVlfSwncCc6eydhZGRyZXNzJzp0cnVlLCdhcnRpY2xlJzp0cnVlLCdhc2lkZSc6dHJ1ZSwnYmxvY2txdW90ZSc6dHJ1ZSwnZGlyJzp0cnVlLCdkaXYnOnRydWUsJ2RsJzp0cnVlLCdmaWVsZHNldCc6dHJ1ZSwnZm9vdGVyJzp0cnVlLCdmb3JtJzp0cnVlLCdoMSc6dHJ1ZSwnaDInOnRydWUsJ2gzJzp0cnVlLCdoNCc6dHJ1ZSwnaDUnOnRydWUsJ2g2Jzp0cnVlLCdoZWFkZXInOnRydWUsJ2hncm91cCc6dHJ1ZSwnaHInOnRydWUsJ21lbnUnOnRydWUsJ25hdic6dHJ1ZSwnb2wnOnRydWUsJ3AnOnRydWUsJ3ByZSc6dHJ1ZSwnc2VjdGlvbic6dHJ1ZSwndGFibGUnOnRydWUsJ3VsJzp0cnVlfSwncnAnOnsncnAnOnRydWUsJ3J0Jzp0cnVlfSwncnQnOnsncnAnOnRydWUsJ3J0Jzp0cnVlfSwndGJvZHknOnsndGJvZHknOnRydWUsJ3Rmb290Jzp0cnVlfSwndGQnOnsndGQnOnRydWUsJ3RoJzp0cnVlfSwndGZvb3QnOnsndGJvZHknOnRydWV9LCd0aCc6eyd0ZCc6dHJ1ZSwndGgnOnRydWV9LCd0aGVhZCc6eyd0Ym9keSc6dHJ1ZSwndGZvb3QnOnRydWV9LCd0cic6eyd0cic6dHJ1ZX19LGRvTm90SW5kZW50OnsicHJlIjp0cnVlfSxhbGxvd1VucXVvdGVkOnRydWUsYWxsb3dNaXNzaW5nOnRydWUsY2FzZUZvbGQ6dHJ1ZX0KdmFyIHhtbENvbmZpZz17YXV0b1NlbGZDbG9zZXJzOnt9LGltcGxpY2l0bHlDbG9zZWQ6e30sY29udGV4dEdyYWJiZXJzOnt9LGRvTm90SW5kZW50Ont9LGFsbG93VW5xdW90ZWQ6ZmFsc2UsYWxsb3dNaXNzaW5nOmZhbHNlLGNhc2VGb2xkOmZhbHNlfQpDb2RlTWlycm9yLmRlZmluZU1vZGUoInhtbCIsZnVuY3Rpb24oZWRpdG9yQ29uZixjb25maWdfKXt2YXIgaW5kZW50VW5pdD1lZGl0b3JDb25mLmluZGVudFVuaXQKdmFyIGNvbmZpZz17fQp2YXIgZGVmYXVsdHM9Y29uZmlnXy5odG1sTW9kZT9odG1sQ29uZmlnOnhtbENvbmZpZwpmb3IodmFyIHByb3AgaW4gZGVmYXVsdHMpY29uZmlnW3Byb3BdPWRlZmF1bHRzW3Byb3BdCmZvcih2YXIgcHJvcCBpbiBjb25maWdfKWNvbmZpZ1twcm9wXT1jb25maWdfW3Byb3BdCnZhciB0eXBlLHNldFN0eWxlO2Z1bmN0aW9uIGluVGV4dChzdHJlYW0sc3RhdGUpe2Z1bmN0aW9uIGNoYWluKHBhcnNlcil7c3RhdGUudG9rZW5pemU9cGFyc2VyO3JldHVybiBwYXJzZXIoc3RyZWFtLHN0YXRlKTt9CnZhciBjaD1zdHJlYW0ubmV4dCgpO2lmKGNoPT0iPCIpe2lmKHN0cmVhbS5lYXQoIiEiKSl7aWYoc3RyZWFtLmVhdCgiWyIpKXtpZihzdHJlYW0ubWF0Y2goIkNEQVRBWyIpKXJldHVybiBjaGFpbihpbkJsb2NrKCJhdG9tIiwiXV0+IikpO2Vsc2UgcmV0dXJuIG51bGw7fWVsc2UgaWYoc3RyZWFtLm1hdGNoKCItLSIpKXtyZXR1cm4gY2hhaW4oaW5CbG9jaygiY29tbWVudCIsIi0tPiIpKTt9ZWxzZSBpZihzdHJlYW0ubWF0Y2goIkRPQ1RZUEUiLHRydWUsdHJ1ZSkpe3N0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7cmV0dXJuIGNoYWluKGRvY3R5cGUoMSkpO31lbHNle3JldHVybiBudWxsO319ZWxzZSBpZihzdHJlYW0uZWF0KCI/Iikpe3N0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7c3RhdGUudG9rZW5pemU9aW5CbG9jaygibWV0YSIsIj8+Iik7cmV0dXJuIm1ldGEiO31lbHNle3R5cGU9c3RyZWFtLmVhdCgiLyIpPyJjbG9zZVRhZyI6Im9wZW5UYWciO3N0YXRlLnRva2VuaXplPWluVGFnO3JldHVybiJ0YWcgYnJhY2tldCI7fX1lbHNlIGlmKGNoPT0iJiIpe3ZhciBvaztpZihzdHJlYW0uZWF0KCIjIikpe2lmKHN0cmVhbS5lYXQoIngiKSl7b2s9c3RyZWFtLmVhdFdoaWxlKC9bYS1mQS1GXGRdLykmJnN0cmVhbS5lYXQoIjsiKTt9ZWxzZXtvaz1zdHJlYW0uZWF0V2hpbGUoL1tcZF0vKSYmc3RyZWFtLmVhdCgiOyIpO319ZWxzZXtvaz1zdHJlYW0uZWF0V2hpbGUoL1tcd1wuXC06XS8pJiZzdHJlYW0uZWF0KCI7Iik7fQpyZXR1cm4gb2s/ImF0b20iOiJlcnJvciI7fWVsc2V7c3RyZWFtLmVhdFdoaWxlKC9bXiY8XS8pO3JldHVybiBudWxsO319CmluVGV4dC5pc0luVGV4dD10cnVlO2Z1bmN0aW9uIGluVGFnKHN0cmVhbSxzdGF0ZSl7dmFyIGNoPXN0cmVhbS5uZXh0KCk7aWYoY2g9PSI+Inx8KGNoPT0iLyImJnN0cmVhbS5lYXQoIj4iKSkpe3N0YXRlLnRva2VuaXplPWluVGV4dDt0eXBlPWNoPT0iPiI/ImVuZFRhZyI6InNlbGZjbG9zZVRhZyI7cmV0dXJuInRhZyBicmFja2V0Ijt9ZWxzZSBpZihjaD09Ij0iKXt0eXBlPSJlcXVhbHMiO3JldHVybiBudWxsO31lbHNlIGlmKGNoPT0iPCIpe3N0YXRlLnRva2VuaXplPWluVGV4dDtzdGF0ZS5zdGF0ZT1iYXNlU3RhdGU7c3RhdGUudGFnTmFtZT1zdGF0ZS50YWdTdGFydD1udWxsO3ZhciBuZXh0PXN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7cmV0dXJuIG5leHQ/bmV4dCsiIHRhZyBlcnJvciI6InRhZyBlcnJvciI7fWVsc2UgaWYoL1tcJ1wiXS8udGVzdChjaCkpe3N0YXRlLnRva2VuaXplPWluQXR0cmlidXRlKGNoKTtzdGF0ZS5zdHJpbmdTdGFydENvbD1zdHJlYW0uY29sdW1uKCk7cmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fWVsc2V7c3RyZWFtLm1hdGNoKC9eW15cc1x1MDBhMD08PlwiXCddKlteXHNcdTAwYTA9PD5cIlwnXC9dLyk7cmV0dXJuIndvcmQiO319CmZ1bmN0aW9uIGluQXR0cmlidXRlKHF1b3RlKXt2YXIgY2xvc3VyZT1mdW5jdGlvbihzdHJlYW0sc3RhdGUpe3doaWxlKCFzdHJlYW0uZW9sKCkpe2lmKHN0cmVhbS5uZXh0KCk9PXF1b3RlKXtzdGF0ZS50b2tlbml6ZT1pblRhZzticmVhazt9fQpyZXR1cm4ic3RyaW5nIjt9O2Nsb3N1cmUuaXNJbkF0dHJpYnV0ZT10cnVlO3JldHVybiBjbG9zdXJlO30KZnVuY3Rpb24gaW5CbG9jayhzdHlsZSx0ZXJtaW5hdG9yKXtyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXt3aGlsZSghc3RyZWFtLmVvbCgpKXtpZihzdHJlYW0ubWF0Y2godGVybWluYXRvcikpe3N0YXRlLnRva2VuaXplPWluVGV4dDticmVhazt9CnN0cmVhbS5uZXh0KCk7fQpyZXR1cm4gc3R5bGU7fTt9CmZ1bmN0aW9uIGRvY3R5cGUoZGVwdGgpe3JldHVybiBmdW5jdGlvbihzdHJlYW0sc3RhdGUpe3ZhciBjaDt3aGlsZSgoY2g9c3RyZWFtLm5leHQoKSkhPW51bGwpe2lmKGNoPT0iPCIpe3N0YXRlLnRva2VuaXplPWRvY3R5cGUoZGVwdGgrMSk7cmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fWVsc2UgaWYoY2g9PSI+Iil7aWYoZGVwdGg9PTEpe3N0YXRlLnRva2VuaXplPWluVGV4dDticmVhazt9ZWxzZXtzdGF0ZS50b2tlbml6ZT1kb2N0eXBlKGRlcHRoLTEpO3JldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO319fQpyZXR1cm4ibWV0YSI7fTt9CmZ1bmN0aW9uIENvbnRleHQoc3RhdGUsdGFnTmFtZSxzdGFydE9mTGluZSl7dGhpcy5wcmV2PXN0YXRlLmNvbnRleHQ7dGhpcy50YWdOYW1lPXRhZ05hbWU7dGhpcy5pbmRlbnQ9c3RhdGUuaW5kZW50ZWQ7dGhpcy5zdGFydE9mTGluZT1zdGFydE9mTGluZTtpZihjb25maWcuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodGFnTmFtZSl8fChzdGF0ZS5jb250ZXh0JiZzdGF0ZS5jb250ZXh0Lm5vSW5kZW50KSkKdGhpcy5ub0luZGVudD10cnVlO30KZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSl7aWYoc3RhdGUuY29udGV4dClzdGF0ZS5jb250ZXh0PXN0YXRlLmNvbnRleHQucHJldjt9CmZ1bmN0aW9uIG1heWJlUG9wQ29udGV4dChzdGF0ZSxuZXh0VGFnTmFtZSl7dmFyIHBhcmVudFRhZ05hbWU7d2hpbGUodHJ1ZSl7aWYoIXN0YXRlLmNvbnRleHQpe3JldHVybjt9CnBhcmVudFRhZ05hbWU9c3RhdGUuY29udGV4dC50YWdOYW1lO2lmKCFjb25maWcuY29udGV4dEdyYWJiZXJzLmhhc093blByb3BlcnR5KHBhcmVudFRhZ05hbWUpfHwhY29uZmlnLmNvbnRleHRHcmFiYmVyc1twYXJlbnRUYWdOYW1lXS5oYXNPd25Qcm9wZXJ0eShuZXh0VGFnTmFtZSkpe3JldHVybjt9CnBvcENvbnRleHQoc3RhdGUpO319CmZ1bmN0aW9uIGJhc2VTdGF0ZSh0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09Im9wZW5UYWciKXtzdGF0ZS50YWdTdGFydD1zdHJlYW0uY29sdW1uKCk7cmV0dXJuIHRhZ05hbWVTdGF0ZTt9ZWxzZSBpZih0eXBlPT0iY2xvc2VUYWciKXtyZXR1cm4gY2xvc2VUYWdOYW1lU3RhdGU7fWVsc2V7cmV0dXJuIGJhc2VTdGF0ZTt9fQpmdW5jdGlvbiB0YWdOYW1lU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ3b3JkIil7c3RhdGUudGFnTmFtZT1zdHJlYW0uY3VycmVudCgpO3NldFN0eWxlPSJ0YWciO3JldHVybiBhdHRyU3RhdGU7fWVsc2V7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gdGFnTmFtZVN0YXRlO319CmZ1bmN0aW9uIGNsb3NlVGFnTmFtZVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe3ZhciB0YWdOYW1lPXN0cmVhbS5jdXJyZW50KCk7aWYoc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50YWdOYW1lIT10YWdOYW1lJiZjb25maWcuaW1wbGljaXRseUNsb3NlZC5oYXNPd25Qcm9wZXJ0eShzdGF0ZS5jb250ZXh0LnRhZ05hbWUpKQpwb3BDb250ZXh0KHN0YXRlKTtpZigoc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50YWdOYW1lPT10YWdOYW1lKXx8Y29uZmlnLm1hdGNoQ2xvc2luZz09PWZhbHNlKXtzZXRTdHlsZT0idGFnIjtyZXR1cm4gY2xvc2VTdGF0ZTt9ZWxzZXtzZXRTdHlsZT0idGFnIGVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZUVycjt9fWVsc2V7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZUVycjt9fQpmdW5jdGlvbiBjbG9zZVN0YXRlKHR5cGUsX3N0cmVhbSxzdGF0ZSl7aWYodHlwZSE9ImVuZFRhZyIpe3NldFN0eWxlPSJlcnJvciI7cmV0dXJuIGNsb3NlU3RhdGU7fQpwb3BDb250ZXh0KHN0YXRlKTtyZXR1cm4gYmFzZVN0YXRlO30KZnVuY3Rpb24gY2xvc2VTdGF0ZUVycih0eXBlLHN0cmVhbSxzdGF0ZSl7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZSh0eXBlLHN0cmVhbSxzdGF0ZSk7fQpmdW5jdGlvbiBhdHRyU3RhdGUodHlwZSxfc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe3NldFN0eWxlPSJhdHRyaWJ1dGUiO3JldHVybiBhdHRyRXFTdGF0ZTt9ZWxzZSBpZih0eXBlPT0iZW5kVGFnInx8dHlwZT09InNlbGZjbG9zZVRhZyIpe3ZhciB0YWdOYW1lPXN0YXRlLnRhZ05hbWUsdGFnU3RhcnQ9c3RhdGUudGFnU3RhcnQ7c3RhdGUudGFnTmFtZT1zdGF0ZS50YWdTdGFydD1udWxsO2lmKHR5cGU9PSJzZWxmY2xvc2VUYWcifHxjb25maWcuYXV0b1NlbGZDbG9zZXJzLmhhc093blByb3BlcnR5KHRhZ05hbWUpKXttYXliZVBvcENvbnRleHQoc3RhdGUsdGFnTmFtZSk7fWVsc2V7bWF5YmVQb3BDb250ZXh0KHN0YXRlLHRhZ05hbWUpO3N0YXRlLmNvbnRleHQ9bmV3IENvbnRleHQoc3RhdGUsdGFnTmFtZSx0YWdTdGFydD09c3RhdGUuaW5kZW50ZWQpO30KcmV0dXJuIGJhc2VTdGF0ZTt9CnNldFN0eWxlPSJlcnJvciI7cmV0dXJuIGF0dHJTdGF0ZTt9CmZ1bmN0aW9uIGF0dHJFcVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iZXF1YWxzIilyZXR1cm4gYXR0clZhbHVlU3RhdGU7aWYoIWNvbmZpZy5hbGxvd01pc3Npbmcpc2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gYXR0clN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKTt9CmZ1bmN0aW9uIGF0dHJWYWx1ZVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ic3RyaW5nIilyZXR1cm4gYXR0ckNvbnRpbnVlZFN0YXRlO2lmKHR5cGU9PSJ3b3JkIiYmY29uZmlnLmFsbG93VW5xdW90ZWQpe3NldFN0eWxlPSJzdHJpbmciO3JldHVybiBhdHRyU3RhdGU7fQpzZXRTdHlsZT0iZXJyb3IiO3JldHVybiBhdHRyU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpO30KZnVuY3Rpb24gYXR0ckNvbnRpbnVlZFN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ic3RyaW5nIilyZXR1cm4gYXR0ckNvbnRpbnVlZFN0YXRlO3JldHVybiBhdHRyU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpO30KcmV0dXJue3N0YXJ0U3RhdGU6ZnVuY3Rpb24oYmFzZUluZGVudCl7dmFyIHN0YXRlPXt0b2tlbml6ZTppblRleHQsc3RhdGU6YmFzZVN0YXRlLGluZGVudGVkOmJhc2VJbmRlbnR8fDAsdGFnTmFtZTpudWxsLHRhZ1N0YXJ0Om51bGwsY29udGV4dDpudWxsfQppZihiYXNlSW5kZW50IT1udWxsKXN0YXRlLmJhc2VJbmRlbnQ9YmFzZUluZGVudApyZXR1cm4gc3RhdGV9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnRhZ05hbWUmJnN0cmVhbS5zb2woKSkKc3RhdGUuaW5kZW50ZWQ9c3RyZWFtLmluZGVudGF0aW9uKCk7aWYoc3RyZWFtLmVhdFNwYWNlKCkpcmV0dXJuIG51bGw7dHlwZT1udWxsO3ZhciBzdHlsZT1zdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO2lmKChzdHlsZXx8dHlwZSkmJnN0eWxlIT0iY29tbWVudCIpe3NldFN0eWxlPW51bGw7c3RhdGUuc3RhdGU9c3RhdGUuc3RhdGUodHlwZXx8c3R5bGUsc3RyZWFtLHN0YXRlKTtpZihzZXRTdHlsZSkKc3R5bGU9c2V0U3R5bGU9PSJlcnJvciI/c3R5bGUrIiBlcnJvciI6c2V0U3R5bGU7fQpyZXR1cm4gc3R5bGU7fSxpbmRlbnQ6ZnVuY3Rpb24oc3RhdGUsdGV4dEFmdGVyLGZ1bGxMaW5lKXt2YXIgY29udGV4dD1zdGF0ZS5jb250ZXh0O2lmKHN0YXRlLnRva2VuaXplLmlzSW5BdHRyaWJ1dGUpe2lmKHN0YXRlLnRhZ1N0YXJ0PT1zdGF0ZS5pbmRlbnRlZCkKcmV0dXJuIHN0YXRlLnN0cmluZ1N0YXJ0Q29sKzE7ZWxzZQpyZXR1cm4gc3RhdGUuaW5kZW50ZWQraW5kZW50VW5pdDt9CmlmKGNvbnRleHQmJmNvbnRleHQubm9JbmRlbnQpcmV0dXJuIENvZGVNaXJyb3IuUGFzcztpZihzdGF0ZS50b2tlbml6ZSE9aW5UYWcmJnN0YXRlLnRva2VuaXplIT1pblRleHQpCnJldHVybiBmdWxsTGluZT9mdWxsTGluZS5tYXRjaCgvXihccyopLylbMF0ubGVuZ3RoOjA7aWYoc3RhdGUudGFnTmFtZSl7aWYoY29uZmlnLm11bHRpbGluZVRhZ0luZGVudFBhc3RUYWchPT1mYWxzZSkKcmV0dXJuIHN0YXRlLnRhZ1N0YXJ0K3N0YXRlLnRhZ05hbWUubGVuZ3RoKzI7ZWxzZQpyZXR1cm4gc3RhdGUudGFnU3RhcnQraW5kZW50VW5pdCooY29uZmlnLm11bHRpbGluZVRhZ0luZGVudEZhY3Rvcnx8MSk7fQppZihjb25maWcuYWxpZ25DREFUQSYmLzwhXFtDREFUQVxbLy50ZXN0KHRleHRBZnRlcikpcmV0dXJuIDA7dmFyIHRhZ0FmdGVyPXRleHRBZnRlciYmL148KFwvKT8oW1x3XzpcLi1dKikvLmV4ZWModGV4dEFmdGVyKTtpZih0YWdBZnRlciYmdGFnQWZ0ZXJbMV0pe3doaWxlKGNvbnRleHQpe2lmKGNvbnRleHQudGFnTmFtZT09dGFnQWZ0ZXJbMl0pe2NvbnRleHQ9Y29udGV4dC5wcmV2O2JyZWFrO31lbHNlIGlmKGNvbmZpZy5pbXBsaWNpdGx5Q2xvc2VkLmhhc093blByb3BlcnR5KGNvbnRleHQudGFnTmFtZSkpe2NvbnRleHQ9Y29udGV4dC5wcmV2O31lbHNle2JyZWFrO319fWVsc2UgaWYodGFnQWZ0ZXIpe3doaWxlKGNvbnRleHQpe3ZhciBncmFiYmVycz1jb25maWcuY29udGV4dEdyYWJiZXJzW2NvbnRleHQudGFnTmFtZV07aWYoZ3JhYmJlcnMmJmdyYWJiZXJzLmhhc093blByb3BlcnR5KHRhZ0FmdGVyWzJdKSkKY29udGV4dD1jb250ZXh0LnByZXY7ZWxzZQpicmVhazt9fQp3aGlsZShjb250ZXh0JiZjb250ZXh0LnByZXYmJiFjb250ZXh0LnN0YXJ0T2ZMaW5lKQpjb250ZXh0PWNvbnRleHQucHJldjtpZihjb250ZXh0KXJldHVybiBjb250ZXh0LmluZGVudCtpbmRlbnRVbml0O2Vsc2UgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnR8fDA7fSxlbGVjdHJpY0lucHV0Oi88XC9bXHNcdzpdKz4kLyxibG9ja0NvbW1lbnRTdGFydDoiPCEtLSIsYmxvY2tDb21tZW50RW5kOiItLT4iLGNvbmZpZ3VyYXRpb246Y29uZmlnLmh0bWxNb2RlPyJodG1sIjoieG1sIixoZWxwZXJUeXBlOmNvbmZpZy5odG1sTW9kZT8iaHRtbCI6InhtbCIsc2tpcEF0dHJpYnV0ZTpmdW5jdGlvbihzdGF0ZSl7aWYoc3RhdGUuc3RhdGU9PWF0dHJWYWx1ZVN0YXRlKQpzdGF0ZS5zdGF0ZT1hdHRyU3RhdGV9fTt9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveG1sIiwieG1sIik7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94bWwiLCJ4bWwiKTtpZighQ29kZU1pcnJvci5taW1lTW9kZXMuaGFzT3duUHJvcGVydHkoInRleHQvaHRtbCIpKQpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIse25hbWU6InhtbCIsaHRtbE1vZGU6dHJ1ZX0pO30pOztGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyPWNsYXNze2NvbnN0cnVjdG9yKGJlZm9yZVZpc2l0LGFmdGVyVmlzaXQpe3RoaXMuX2JlZm9yZVZpc2l0PWJlZm9yZVZpc2l0O3RoaXMuX2FmdGVyVmlzaXQ9YWZ0ZXJWaXNpdHx8bmV3IEZ1bmN0aW9uKCk7dGhpcy5fd2Fsa051bGxzPWZhbHNlO30Kc2V0V2Fsa051bGxzKHZhbHVlKXt0aGlzLl93YWxrTnVsbHM9dmFsdWU7fQp3YWxrKGFzdCl7dGhpcy5faW5uZXJXYWxrKGFzdCxudWxsKTt9Cl9pbm5lcldhbGsobm9kZSxwYXJlbnQpe2lmKCFub2RlJiZwYXJlbnQmJnRoaXMuX3dhbGtOdWxscyl7Y29uc3QgcmVzdWx0PSh7cmF3OidudWxsJyx2YWx1ZTpudWxsfSk7cmVzdWx0LnR5cGU9J0xpdGVyYWwnO25vZGU9KHJlc3VsdCk7fQppZighbm9kZSkKcmV0dXJuO25vZGUucGFyZW50PXBhcmVudDtpZih0aGlzLl9iZWZvcmVWaXNpdC5jYWxsKG51bGwsbm9kZSk9PT1Gb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyLlNraXBTdWJ0cmVlKXt0aGlzLl9hZnRlclZpc2l0LmNhbGwobnVsbCxub2RlKTtyZXR1cm47fQpjb25zdCB3YWxrT3JkZXI9Rm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlci5fd2Fsa09yZGVyW25vZGUudHlwZV07aWYoIXdhbGtPcmRlcil7Y29uc29sZS5lcnJvcignV2FsayBvcmRlciBub3QgZGVmaW5lZCBmb3IgJytub2RlLnR5cGUpO3JldHVybjt9CmlmKG5vZGUudHlwZT09PSdUZW1wbGF0ZUxpdGVyYWwnKXtjb25zdCB0ZW1wbGF0ZUxpdGVyYWw9KG5vZGUpO2NvbnN0IGV4cHJlc3Npb25zTGVuZ3RoPXRlbXBsYXRlTGl0ZXJhbC5leHByZXNzaW9ucy5sZW5ndGg7Zm9yKGxldCBpPTA7aTxleHByZXNzaW9uc0xlbmd0aDsrK2kpe3RoaXMuX2lubmVyV2Fsayh0ZW1wbGF0ZUxpdGVyYWwucXVhc2lzW2ldLHRlbXBsYXRlTGl0ZXJhbCk7dGhpcy5faW5uZXJXYWxrKHRlbXBsYXRlTGl0ZXJhbC5leHByZXNzaW9uc1tpXSx0ZW1wbGF0ZUxpdGVyYWwpO30KdGhpcy5faW5uZXJXYWxrKHRlbXBsYXRlTGl0ZXJhbC5xdWFzaXNbZXhwcmVzc2lvbnNMZW5ndGhdLHRlbXBsYXRlTGl0ZXJhbCk7fWVsc2V7Zm9yKGxldCBpPTA7aTx3YWxrT3JkZXIubGVuZ3RoOysraSl7Y29uc3QgZW50aXR5PW5vZGVbd2Fsa09yZGVyW2ldXTtpZihBcnJheS5pc0FycmF5KGVudGl0eSkpCnRoaXMuX3dhbGtBcnJheShlbnRpdHksbm9kZSk7ZWxzZQp0aGlzLl9pbm5lcldhbGsoZW50aXR5LG5vZGUpO319CnRoaXMuX2FmdGVyVmlzaXQuY2FsbChudWxsLG5vZGUpO30KX3dhbGtBcnJheShub2RlQXJyYXkscGFyZW50Tm9kZSl7Zm9yKGxldCBpPTA7aTxub2RlQXJyYXkubGVuZ3RoOysraSkKdGhpcy5faW5uZXJXYWxrKG5vZGVBcnJheVtpXSxwYXJlbnROb2RlKTt9fTtGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyLlNraXBTdWJ0cmVlPXt9O0Zvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuX3dhbGtPcmRlcj17J0F3YWl0RXhwcmVzc2lvbic6Wydhcmd1bWVudHMnXSwnQXJyYXlFeHByZXNzaW9uJzpbJ2VsZW1lbnRzJ10sJ0FycmF5UGF0dGVybic6WydlbGVtZW50cyddLCdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic6WydwYXJhbXMnLCdib2R5J10sJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJzpbJ2xlZnQnLCdyaWdodCddLCdCaW5hcnlFeHByZXNzaW9uJzpbJ2xlZnQnLCdyaWdodCddLCdCbG9ja1N0YXRlbWVudCc6Wydib2R5J10sJ0JyZWFrU3RhdGVtZW50JzpbJ2xhYmVsJ10sJ0NhbGxFeHByZXNzaW9uJzpbJ2NhbGxlZScsJ2FyZ3VtZW50cyddLCdDYXRjaENsYXVzZSc6WydwYXJhbScsJ2JvZHknXSwnQ2xhc3NCb2R5JzpbJ2JvZHknXSwnQ2xhc3NEZWNsYXJhdGlvbic6WydpZCcsJ3N1cGVyQ2xhc3MnLCdib2R5J10sJ0NsYXNzRXhwcmVzc2lvbic6WydpZCcsJ3N1cGVyQ2xhc3MnLCdib2R5J10sJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6Wyd0ZXN0JywnY29uc2VxdWVudCcsJ2FsdGVybmF0ZSddLCdDb250aW51ZVN0YXRlbWVudCc6WydsYWJlbCddLCdEZWJ1Z2dlclN0YXRlbWVudCc6W10sJ0RvV2hpbGVTdGF0ZW1lbnQnOlsnYm9keScsJ3Rlc3QnXSwnRW1wdHlTdGF0ZW1lbnQnOltdLCdFeHByZXNzaW9uU3RhdGVtZW50JzpbJ2V4cHJlc3Npb24nXSwnRm9ySW5TdGF0ZW1lbnQnOlsnbGVmdCcsJ3JpZ2h0JywnYm9keSddLCdGb3JPZlN0YXRlbWVudCc6WydsZWZ0JywncmlnaHQnLCdib2R5J10sJ0ZvclN0YXRlbWVudCc6Wydpbml0JywndGVzdCcsJ3VwZGF0ZScsJ2JvZHknXSwnRnVuY3Rpb25EZWNsYXJhdGlvbic6WydpZCcsJ3BhcmFtcycsJ2JvZHknXSwnRnVuY3Rpb25FeHByZXNzaW9uJzpbJ2lkJywncGFyYW1zJywnYm9keSddLCdJZGVudGlmaWVyJzpbXSwnSWZTdGF0ZW1lbnQnOlsndGVzdCcsJ2NvbnNlcXVlbnQnLCdhbHRlcm5hdGUnXSwnTGFiZWxlZFN0YXRlbWVudCc6WydsYWJlbCcsJ2JvZHknXSwnTGl0ZXJhbCc6W10sJ0xvZ2ljYWxFeHByZXNzaW9uJzpbJ2xlZnQnLCdyaWdodCddLCdNZW1iZXJFeHByZXNzaW9uJzpbJ29iamVjdCcsJ3Byb3BlcnR5J10sJ01ldGhvZERlZmluaXRpb24nOlsna2V5JywndmFsdWUnXSwnTmV3RXhwcmVzc2lvbic6WydjYWxsZWUnLCdhcmd1bWVudHMnXSwnT2JqZWN0RXhwcmVzc2lvbic6Wydwcm9wZXJ0aWVzJ10sJ09iamVjdFBhdHRlcm4nOlsncHJvcGVydGllcyddLCdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbic6WydleHByZXNzaW9uJ10sJ1Byb2dyYW0nOlsnYm9keSddLCdQcm9wZXJ0eSc6WydrZXknLCd2YWx1ZSddLCdSZXR1cm5TdGF0ZW1lbnQnOlsnYXJndW1lbnQnXSwnU2VxdWVuY2VFeHByZXNzaW9uJzpbJ2V4cHJlc3Npb25zJ10sJ1N1cGVyJzpbXSwnU3dpdGNoQ2FzZSc6Wyd0ZXN0JywnY29uc2VxdWVudCddLCdTd2l0Y2hTdGF0ZW1lbnQnOlsnZGlzY3JpbWluYW50JywnY2FzZXMnXSwnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJzpbJ3RhZycsJ3F1YXNpJ10sJ1RlbXBsYXRlRWxlbWVudCc6W10sJ1RlbXBsYXRlTGl0ZXJhbCc6WydxdWFzaXMnLCdleHByZXNzaW9ucyddLCdUaGlzRXhwcmVzc2lvbic6W10sJ1Rocm93U3RhdGVtZW50JzpbJ2FyZ3VtZW50J10sJ1RyeVN0YXRlbWVudCc6WydibG9jaycsJ2hhbmRsZXInLCdmaW5hbGl6ZXInXSwnVW5hcnlFeHByZXNzaW9uJzpbJ2FyZ3VtZW50J10sJ1VwZGF0ZUV4cHJlc3Npb24nOlsnYXJndW1lbnQnXSwnVmFyaWFibGVEZWNsYXJhdGlvbic6WydkZWNsYXJhdGlvbnMnXSwnVmFyaWFibGVEZWNsYXJhdG9yJzpbJ2lkJywnaW5pdCddLCdXaGlsZVN0YXRlbWVudCc6Wyd0ZXN0JywnYm9keSddLCdXaXRoU3RhdGVtZW50JzpbJ29iamVjdCcsJ2JvZHknXSwnWWllbGRFeHByZXNzaW9uJzpbJ2FyZ3VtZW50J119OztGb3JtYXR0ZXJXb3JrZXIuY3JlYXRlVG9rZW5pemVyPWZ1bmN0aW9uKG1pbWVUeXBlKXtjb25zdCBtb2RlPUNvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDoyfSxtaW1lVHlwZSk7Y29uc3Qgc3RhdGU9Q29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGUpO2Z1bmN0aW9uIHRva2VuaXplKGxpbmUsY2FsbGJhY2spe2NvbnN0IHN0cmVhbT1uZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZSk7d2hpbGUoIXN0cmVhbS5lb2woKSl7Y29uc3Qgc3R5bGU9bW9kZS50b2tlbihzdHJlYW0sc3RhdGUpO2NvbnN0IHZhbHVlPXN0cmVhbS5jdXJyZW50KCk7aWYoY2FsbGJhY2sodmFsdWUsc3R5bGUsc3RyZWFtLnN0YXJ0LHN0cmVhbS5zdGFydCt2YWx1ZS5sZW5ndGgpPT09Rm9ybWF0dGVyV29ya2VyLkFib3J0VG9rZW5pemF0aW9uKQpyZXR1cm47c3RyZWFtLnN0YXJ0PXN0cmVhbS5wb3M7fX0KcmV0dXJuIHRva2VuaXplO307Rm9ybWF0dGVyV29ya2VyLkFib3J0VG9rZW5pemF0aW9uPXt9O3NlbGYub25tZXNzYWdlPWZ1bmN0aW9uKGV2ZW50KXtjb25zdCBtZXRob2Q9KGV2ZW50LmRhdGEubWV0aG9kKTtjb25zdCBwYXJhbXM9KGV2ZW50LmRhdGEucGFyYW1zKTtpZighbWV0aG9kKQpyZXR1cm47c3dpdGNoKG1ldGhvZCl7Y2FzZSdmb3JtYXQnOkZvcm1hdHRlcldvcmtlci5mb3JtYXQocGFyYW1zLm1pbWVUeXBlLHBhcmFtcy5jb250ZW50LHBhcmFtcy5pbmRlbnRTdHJpbmcpO2JyZWFrO2Nhc2UncGFyc2VDU1MnOkZvcm1hdHRlcldvcmtlci5wYXJzZUNTUyhwYXJhbXMuY29udGVudCk7YnJlYWs7Y2FzZSdwYXJzZVNDU1MnOkZvcm1hdHRlcldvcmtlci5Gb3JtYXR0ZXJXb3JrZXJDb250ZW50UGFyc2VyLnBhcnNlKHBhcmFtcy5jb250ZW50LCd0ZXh0L3gtc2NzcycpO2JyZWFrO2Nhc2UnamF2YVNjcmlwdE91dGxpbmUnOkZvcm1hdHRlcldvcmtlci5qYXZhU2NyaXB0T3V0bGluZShwYXJhbXMuY29udGVudCk7YnJlYWs7Y2FzZSdqYXZhU2NyaXB0SWRlbnRpZmllcnMnOkZvcm1hdHRlcldvcmtlci5qYXZhU2NyaXB0SWRlbnRpZmllcnMocGFyYW1zLmNvbnRlbnQpO2JyZWFrO2Nhc2UnZXZhbHVhdGFibGVKYXZhU2NyaXB0U3Vic3RyaW5nJzpGb3JtYXR0ZXJXb3JrZXIuZXZhbHVhdGFibGVKYXZhU2NyaXB0U3Vic3RyaW5nKHBhcmFtcy5jb250ZW50KTticmVhaztjYXNlJ3BhcnNlSlNPTlJlbGF4ZWQnOkZvcm1hdHRlcldvcmtlci5wYXJzZUpTT05SZWxheGVkKHBhcmFtcy5jb250ZW50KTticmVhaztjYXNlJ3ByZXByb2Nlc3NUb3BMZXZlbEF3YWl0RXhwcmVzc2lvbnMnOkZvcm1hdHRlcldvcmtlci5wcmVwcm9jZXNzVG9wTGV2ZWxBd2FpdEV4cHJlc3Npb25zKHBhcmFtcy5jb250ZW50KTticmVhaztjYXNlJ2ZpbmRMYXN0RXhwcmVzc2lvbic6cG9zdE1lc3NhZ2UoRm9ybWF0dGVyV29ya2VyLmZpbmRMYXN0RXhwcmVzc2lvbihwYXJhbXMuY29udGVudCkpO2JyZWFrO2Nhc2UnZmluZExhc3RGdW5jdGlvbkNhbGwnOnBvc3RNZXNzYWdlKEZvcm1hdHRlcldvcmtlci5maW5kTGFzdEZ1bmN0aW9uQ2FsbChwYXJhbXMuY29udGVudCkpO2JyZWFrO2Nhc2UnYXJndW1lbnRzTGlzdCc6cG9zdE1lc3NhZ2UoRm9ybWF0dGVyV29ya2VyLmFyZ3VtZW50c0xpc3QocGFyYW1zLmNvbnRlbnQpKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydCBtZXRob2QgbmFtZTogJyttZXRob2QpO319O0Zvcm1hdHRlcldvcmtlci5wYXJzZUpTT05SZWxheGVkPWZ1bmN0aW9uKGNvbnRlbnQpe3Bvc3RNZXNzYWdlKEZvcm1hdHRlcldvcmtlci5SZWxheGVkSlNPTlBhcnNlci5wYXJzZShjb250ZW50KSk7fTtGb3JtYXR0ZXJXb3JrZXIuZXZhbHVhdGFibGVKYXZhU2NyaXB0U3Vic3RyaW5nPWZ1bmN0aW9uKGNvbnRlbnQpe2NvbnN0IHRva2VuaXplcj1hY29ybi50b2tlbml6ZXIoY29udGVudCx7ZWNtYVZlcnNpb246OX0pO2xldCByZXN1bHQ9Jyc7dHJ5e2xldCB0b2tlbj10b2tlbml6ZXIuZ2V0VG9rZW4oKTt3aGlsZSh0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXMuZW9mJiZGb3JtYXR0ZXJXb3JrZXIuQWNvcm5Ub2tlbml6ZXIucHVuY3R1YXRvcih0b2tlbikpCnRva2VuPXRva2VuaXplci5nZXRUb2tlbigpO2NvbnN0IHN0YXJ0SW5kZXg9dG9rZW4uc3RhcnQ7bGV0IGVuZEluZGV4PXRva2VuLmVuZDtsZXQgb3BlbkJyYWNrZXRzQ291bnRlcj0wO3doaWxlKHRva2VuLnR5cGUhPT1hY29ybi50b2tUeXBlcy5lb2Ype2NvbnN0IGlzSWRlbnRpZmllcj1Gb3JtYXR0ZXJXb3JrZXIuQWNvcm5Ub2tlbml6ZXIuaWRlbnRpZmllcih0b2tlbik7Y29uc3QgaXNUaGlzPUZvcm1hdHRlcldvcmtlci5BY29yblRva2VuaXplci5rZXl3b3JkKHRva2VuLCd0aGlzJyk7Y29uc3QgaXNTdHJpbmc9dG9rZW4udHlwZT09PWFjb3JuLnRva1R5cGVzLnN0cmluZztpZighaXNUaGlzJiYhaXNJZGVudGlmaWVyJiYhaXNTdHJpbmcpCmJyZWFrO2VuZEluZGV4PXRva2VuLmVuZDt0b2tlbj10b2tlbml6ZXIuZ2V0VG9rZW4oKTt3aGlsZShGb3JtYXR0ZXJXb3JrZXIuQWNvcm5Ub2tlbml6ZXIucHVuY3R1YXRvcih0b2tlbiwnLltdJykpe2lmKEZvcm1hdHRlcldvcmtlci5BY29yblRva2VuaXplci5wdW5jdHVhdG9yKHRva2VuLCdbJykpCm9wZW5CcmFja2V0c0NvdW50ZXIrKztpZihGb3JtYXR0ZXJXb3JrZXIuQWNvcm5Ub2tlbml6ZXIucHVuY3R1YXRvcih0b2tlbiwnXScpKXtlbmRJbmRleD1vcGVuQnJhY2tldHNDb3VudGVyPjA/dG9rZW4uZW5kOmVuZEluZGV4O29wZW5CcmFja2V0c0NvdW50ZXItLTt9CnRva2VuPXRva2VuaXplci5nZXRUb2tlbigpO319CnJlc3VsdD1jb250ZW50LnN1YnN0cmluZyhzdGFydEluZGV4LGVuZEluZGV4KTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKTt9CnBvc3RNZXNzYWdlKHJlc3VsdCk7fTtGb3JtYXR0ZXJXb3JrZXIucHJlcHJvY2Vzc1RvcExldmVsQXdhaXRFeHByZXNzaW9ucz1mdW5jdGlvbihjb250ZW50KXtsZXQgd3JhcHBlZD0nKGFzeW5jICgpID0+IHsnK2NvbnRlbnQrJ30pKCknO2NvbnN0IHJvb3Q9YWNvcm4ucGFyc2Uod3JhcHBlZCx7ZWNtYVZlcnNpb246OX0pO2NvbnN0IGJvZHk9cm9vdC5ib2R5WzBdLmV4cHJlc3Npb24uY2FsbGVlLmJvZHk7Y29uc3QgY2hhbmdlcz1bXTtsZXQgY29udGFpbnNBd2FpdD1mYWxzZTtsZXQgY29udGFpbnNSZXR1cm49ZmFsc2U7Y2xhc3MgVmlzaXRvcntDbGFzc0RlY2xhcmF0aW9uKG5vZGUpe2lmKG5vZGUucGFyZW50PT09Ym9keSkKY2hhbmdlcy5wdXNoKHt0ZXh0Om5vZGUuaWQubmFtZSsnPScsc3RhcnQ6bm9kZS5zdGFydCxlbmQ6bm9kZS5zdGFydH0pO30KRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKXtjaGFuZ2VzLnB1c2goe3RleHQ6bm9kZS5pZC5uYW1lKyc9JyxzdGFydDpub2RlLnN0YXJ0LGVuZDpub2RlLnN0YXJ0fSk7cmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fQpGdW5jdGlvbkV4cHJlc3Npb24obm9kZSl7cmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fQpBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihub2RlKXtyZXR1cm4gRm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlci5Ta2lwU3VidHJlZTt9Ck1ldGhvZERlZmluaXRpb24obm9kZSl7cmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fQpBd2FpdEV4cHJlc3Npb24obm9kZSl7Y29udGFpbnNBd2FpdD10cnVlO30KUmV0dXJuU3RhdGVtZW50KG5vZGUpe2NvbnRhaW5zUmV0dXJuPXRydWU7fQpWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpe2lmKG5vZGUua2luZCE9PSd2YXInJiZub2RlLnBhcmVudCE9PWJvZHkpCnJldHVybjtjb25zdCBvbmx5T25lRGVjbGFyYXRpb249bm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoPT09MTtjaGFuZ2VzLnB1c2goe3RleHQ6b25seU9uZURlY2xhcmF0aW9uPyd2b2lkJzondm9pZCAoJyxzdGFydDpub2RlLnN0YXJ0LGVuZDpub2RlLnN0YXJ0K25vZGUua2luZC5sZW5ndGh9KTtmb3IoY29uc3QgZGVjbGFyYXRpb24gb2Ygbm9kZS5kZWNsYXJhdGlvbnMpe2lmKCFkZWNsYXJhdGlvbi5pbml0KXtjaGFuZ2VzLnB1c2goe3RleHQ6JygnLHN0YXJ0OmRlY2xhcmF0aW9uLnN0YXJ0LGVuZDpkZWNsYXJhdGlvbi5zdGFydH0pO2NoYW5nZXMucHVzaCh7dGV4dDonPXVuZGVmaW5lZCknLHN0YXJ0OmRlY2xhcmF0aW9uLmVuZCxlbmQ6ZGVjbGFyYXRpb24uZW5kfSk7Y29udGludWU7fQpjaGFuZ2VzLnB1c2goe3RleHQ6JygnLHN0YXJ0OmRlY2xhcmF0aW9uLnN0YXJ0LGVuZDpkZWNsYXJhdGlvbi5zdGFydH0pO2NoYW5nZXMucHVzaCh7dGV4dDonKScsc3RhcnQ6ZGVjbGFyYXRpb24uZW5kLGVuZDpkZWNsYXJhdGlvbi5lbmR9KTt9CmlmKCFvbmx5T25lRGVjbGFyYXRpb24pe2NvbnN0IGxhc3Q9bm9kZS5kZWNsYXJhdGlvbnMucGVla0xhc3QoKTtjaGFuZ2VzLnB1c2goe3RleHQ6JyknLHN0YXJ0Omxhc3QuZW5kLGVuZDpsYXN0LmVuZH0pO319fQpjb25zdCB3YWxrZXI9bmV3IEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIodmlzaXQuYmluZChuZXcgVmlzaXRvcigpKSk7d2Fsa2VyLndhbGsoYm9keSk7ZnVuY3Rpb24gdmlzaXQobm9kZSl7aWYobm9kZS50eXBlIGluIHRoaXMpCnJldHVybiB0aGlzW25vZGUudHlwZV0obm9kZSk7fQppZighY29udGFpbnNBd2FpdHx8Y29udGFpbnNSZXR1cm4pe3Bvc3RNZXNzYWdlKCcnKTtyZXR1cm47fQpjb25zdCBsYXN0PWJvZHkuYm9keVtib2R5LmJvZHkubGVuZ3RoLTFdO2lmKGxhc3QudHlwZT09PSdFeHByZXNzaW9uU3RhdGVtZW50Jyl7Y2hhbmdlcy5wdXNoKHt0ZXh0OidyZXR1cm4gKCcsc3RhcnQ6bGFzdC5zdGFydCxlbmQ6bGFzdC5zdGFydH0pO2lmKHdyYXBwZWRbbGFzdC5lbmQtMV0hPT0nOycpCmNoYW5nZXMucHVzaCh7dGV4dDonKScsc3RhcnQ6bGFzdC5lbmQsZW5kOmxhc3QuZW5kfSk7ZWxzZQpjaGFuZ2VzLnB1c2goe3RleHQ6JyknLHN0YXJ0Omxhc3QuZW5kLTEsZW5kOmxhc3QuZW5kLTF9KTt9CndoaWxlKGNoYW5nZXMubGVuZ3RoKXtjb25zdCBjaGFuZ2U9Y2hhbmdlcy5wb3AoKTt3cmFwcGVkPXdyYXBwZWQuc3Vic3RyKDAsY2hhbmdlLnN0YXJ0KStjaGFuZ2UudGV4dCt3cmFwcGVkLnN1YnN0cihjaGFuZ2UuZW5kKTt9CnBvc3RNZXNzYWdlKHdyYXBwZWQpO307Rm9ybWF0dGVyV29ya2VyLmphdmFTY3JpcHRJZGVudGlmaWVycz1mdW5jdGlvbihjb250ZW50KXtjb25zdCByb290PWFjb3JuLnBhcnNlKGNvbnRlbnQse3JhbmdlczpmYWxzZSxlY21hVmVyc2lvbjo5fSk7Y29uc3QgaWRlbnRpZmllcnM9W107Y29uc3Qgd2Fsa2VyPW5ldyBGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyKGJlZm9yZVZpc2l0KTtmdW5jdGlvbiBpc0Z1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLnR5cGU9PT0nRnVuY3Rpb25EZWNsYXJhdGlvbid8fG5vZGUudHlwZT09PSdGdW5jdGlvbkV4cHJlc3Npb24nfHxub2RlLnR5cGU9PT0nQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nO30KZnVuY3Rpb24gYmVmb3JlVmlzaXQobm9kZSl7aWYoaXNGdW5jdGlvbihub2RlKSl7aWYobm9kZS5pZCkKaWRlbnRpZmllcnMucHVzaChub2RlLmlkKTtyZXR1cm4gRm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlci5Ta2lwU3VidHJlZTt9CmlmKG5vZGUudHlwZSE9PSdJZGVudGlmaWVyJykKcmV0dXJuO2lmKG5vZGUucGFyZW50JiZub2RlLnBhcmVudC50eXBlPT09J01lbWJlckV4cHJlc3Npb24nJiZub2RlLnBhcmVudC5wcm9wZXJ0eT09PW5vZGUmJiFub2RlLnBhcmVudC5jb21wdXRlZCkKcmV0dXJuO2lkZW50aWZpZXJzLnB1c2gobm9kZSk7fQppZighcm9vdHx8cm9vdC50eXBlIT09J1Byb2dyYW0nfHxyb290LmJvZHkubGVuZ3RoIT09MXx8IWlzRnVuY3Rpb24ocm9vdC5ib2R5WzBdKSl7cG9zdE1lc3NhZ2UoW10pO3JldHVybjt9CmNvbnN0IGZ1bmN0aW9uTm9kZT1yb290LmJvZHlbMF07Zm9yKGNvbnN0IHBhcmFtIG9mIGZ1bmN0aW9uTm9kZS5wYXJhbXMpCndhbGtlci53YWxrKHBhcmFtKTt3YWxrZXIud2FsayhmdW5jdGlvbk5vZGUuYm9keSk7Y29uc3QgcmVkdWNlZD1pZGVudGlmaWVycy5tYXAoaWQ9Pih7bmFtZTppZC5uYW1lLG9mZnNldDppZC5zdGFydH0pKTtwb3N0TWVzc2FnZShyZWR1Y2VkKTt9O0Zvcm1hdHRlcldvcmtlci5mb3JtYXQ9ZnVuY3Rpb24obWltZVR5cGUsdGV4dCxpbmRlbnRTdHJpbmcpe2luZGVudFN0cmluZz1pbmRlbnRTdHJpbmd8fCcgICAgJztjb25zdCByZXN1bHQ9e307Y29uc3QgYnVpbGRlcj1uZXcgRm9ybWF0dGVyV29ya2VyLkZvcm1hdHRlZENvbnRlbnRCdWlsZGVyKGluZGVudFN0cmluZyk7Y29uc3QgbGluZUVuZGluZ3M9dGV4dC5jb21wdXRlTGluZUVuZGluZ3MoKTt0cnl7c3dpdGNoKG1pbWVUeXBlKXtjYXNlJ3RleHQvaHRtbCc6e2NvbnN0IGZvcm1hdHRlcj1uZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxGb3JtYXR0ZXIoYnVpbGRlcik7Zm9ybWF0dGVyLmZvcm1hdCh0ZXh0LGxpbmVFbmRpbmdzKTticmVhazt9CmNhc2UndGV4dC9jc3MnOntjb25zdCBmb3JtYXR0ZXI9bmV3IEZvcm1hdHRlcldvcmtlci5DU1NGb3JtYXR0ZXIoYnVpbGRlcik7Zm9ybWF0dGVyLmZvcm1hdCh0ZXh0LGxpbmVFbmRpbmdzLDAsdGV4dC5sZW5ndGgpO2JyZWFrO30KY2FzZSd0ZXh0L2phdmFzY3JpcHQnOntjb25zdCBmb3JtYXR0ZXI9bmV3IEZvcm1hdHRlcldvcmtlci5KYXZhU2NyaXB0Rm9ybWF0dGVyKGJ1aWxkZXIpO2Zvcm1hdHRlci5mb3JtYXQodGV4dCxsaW5lRW5kaW5ncywwLHRleHQubGVuZ3RoKTticmVhazt9CmRlZmF1bHQ6e2NvbnN0IGZvcm1hdHRlcj1uZXcgRm9ybWF0dGVyV29ya2VyLklkZW50aXR5Rm9ybWF0dGVyKGJ1aWxkZXIpO2Zvcm1hdHRlci5mb3JtYXQodGV4dCxsaW5lRW5kaW5ncywwLHRleHQubGVuZ3RoKTt9fQpyZXN1bHQubWFwcGluZz1idWlsZGVyLm1hcHBpbmcoKTtyZXN1bHQuY29udGVudD1idWlsZGVyLmNvbnRlbnQoKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKTtyZXN1bHQubWFwcGluZz17b3JpZ2luYWw6WzBdLGZvcm1hdHRlZDpbMF19O3Jlc3VsdC5jb250ZW50PXRleHQ7fQpwb3N0TWVzc2FnZShyZXN1bHQpO307Rm9ybWF0dGVyV29ya2VyLmZpbmRMYXN0RnVuY3Rpb25DYWxsPWZ1bmN0aW9uKGNvbnRlbnQpe2lmKGNvbnRlbnQubGVuZ3RoPjEwMDAwKQpyZXR1cm4gbnVsbDt0cnl7Y29uc3QgdG9rZW5pemVyPWFjb3JuLnRva2VuaXplcihjb250ZW50LHtlY21hVmVyc2lvbjo5fSk7d2hpbGUodG9rZW5pemVyLmdldFRva2VuKCkudHlwZSE9PWFjb3JuLnRva1R5cGVzLmVvZil7fX1jYXRjaChlKXtyZXR1cm4gbnVsbDt9CmNvbnN0IHN1ZmZpeD0nMDAwKSc7Y29uc3QgYmFzZT1Gb3JtYXR0ZXJXb3JrZXIuX2xhc3RDb21wbGV0ZUV4cHJlc3Npb24oY29udGVudCxzdWZmaXgsbmV3IFNldChbJ0NhbGxFeHByZXNzaW9uJywnTmV3RXhwcmVzc2lvbiddKSk7aWYoIWJhc2UpCnJldHVybiBudWxsO2NvbnN0IGNhbGxlZT1iYXNlLmJhc2VOb2RlWydjYWxsZWUnXTtsZXQgZnVuY3Rpb25OYW1lPScnO2NvbnN0IGZ1bmN0aW9uUHJvcGVydHk9Y2FsbGVlLnR5cGU9PT0nSWRlbnRpZmllcic/Y2FsbGVlOmNhbGxlZS5wcm9wZXJ0eTtpZihmdW5jdGlvblByb3BlcnR5KXtpZihmdW5jdGlvblByb3BlcnR5LnR5cGU9PT0nSWRlbnRpZmllcicpCmZ1bmN0aW9uTmFtZT1mdW5jdGlvblByb3BlcnR5Lm5hbWU7ZWxzZSBpZihmdW5jdGlvblByb3BlcnR5LnR5cGU9PT0nTGl0ZXJhbCcpCmZ1bmN0aW9uTmFtZT1mdW5jdGlvblByb3BlcnR5LnZhbHVlO30KY29uc3QgYXJndW1lbnRJbmRleD1iYXNlLmJhc2VOb2RlWydhcmd1bWVudHMnXS5sZW5ndGgtMTtjb25zdCBiYXNlRXhwcmVzc2lvbj1gKCR7YmFzZS5iYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoY2FsbGVlLnN0YXJ0IC0gYmFzZS5iYXNlTm9kZS5zdGFydCwgY2FsbGVlLmVuZCAtIGJhc2UuYmFzZU5vZGUuc3RhcnQpfSlgO2NvbnN0IHBvc3NpYmxlU2lkZUVmZmVjdHM9Rm9ybWF0dGVyV29ya2VyLl9ub2RlSGFzUG9zc2libGVTaWRlRWZmZWN0cyhjYWxsZWUpO2xldCByZWNlaXZlcj0nKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSgpJztpZihjYWxsZWUudHlwZT09PSdNZW1iZXJFeHByZXNzaW9uJyl7Y29uc3QgcmVjZWl2ZXJCYXNlPWNhbGxlZVsnb2JqZWN0J107cmVjZWl2ZXI9YmFzZS5iYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcocmVjZWl2ZXJCYXNlLnN0YXJ0LWJhc2UuYmFzZU5vZGUuc3RhcnQscmVjZWl2ZXJCYXNlLmVuZC1iYXNlLmJhc2VOb2RlLnN0YXJ0KTt9CnJldHVybntiYXNlRXhwcmVzc2lvbixyZWNlaXZlcixwb3NzaWJsZVNpZGVFZmZlY3RzLGFyZ3VtZW50SW5kZXgsZnVuY3Rpb25OYW1lfTt9O0Zvcm1hdHRlcldvcmtlci5hcmd1bWVudHNMaXN0PWZ1bmN0aW9uKGNvbnRlbnQpe2lmKGNvbnRlbnQubGVuZ3RoPjEwMDAwKQpyZXR1cm5bXTtsZXQgcGFyc2VkPW51bGw7dHJ5e3BhcnNlZD1hY29ybi5wYXJzZShgKCR7Y29udGVudH0pYCx7ZWNtYVZlcnNpb246OX0pO31jYXRjaChlKXt9CmlmKCFwYXJzZWQpe3RyeXtwYXJzZWQ9YWNvcm4ucGFyc2UoYCh7JHtjb250ZW50fX0pYCx7ZWNtYVZlcnNpb246OX0pO31jYXRjaChlKXt9fQppZighcGFyc2VkfHwhcGFyc2VkLmJvZHl8fCFwYXJzZWQuYm9keVswXXx8IXBhcnNlZC5ib2R5WzBdLmV4cHJlc3Npb24pCnJldHVybltdO2NvbnN0IGV4cHJlc3Npb249cGFyc2VkLmJvZHlbMF0uZXhwcmVzc2lvbjtsZXQgcGFyYW1zPW51bGw7c3dpdGNoKGV4cHJlc3Npb24udHlwZSl7Y2FzZSdDbGFzc0V4cHJlc3Npb24nOmlmKCFleHByZXNzaW9uLmJvZHkuYm9keSkKYnJlYWs7Y29uc3QgY29uc3RydWN0b3I9ZXhwcmVzc2lvbi5ib2R5LmJvZHkuZmluZChtZXRob2Q9Pm1ldGhvZC5raW5kPT09J2NvbnN0cnVjdG9yJyk7aWYoY29uc3RydWN0b3IpCnBhcmFtcz1jb25zdHJ1Y3Rvci52YWx1ZS5wYXJhbXM7YnJlYWs7Y2FzZSdPYmplY3RFeHByZXNzaW9uJzppZighZXhwcmVzc2lvbi5wcm9wZXJ0aWVzWzBdfHwhZXhwcmVzc2lvbi5wcm9wZXJ0aWVzWzBdLnZhbHVlKQpicmVhaztwYXJhbXM9ZXhwcmVzc2lvbi5wcm9wZXJ0aWVzWzBdLnZhbHVlLnBhcmFtczticmVhaztjYXNlJ0Z1bmN0aW9uRXhwcmVzc2lvbic6Y2FzZSdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic6cGFyYW1zPWV4cHJlc3Npb24ucGFyYW1zO2JyZWFrO30KaWYoIXBhcmFtcykKcmV0dXJuW107cmV0dXJuIHBhcmFtcy5tYXAocGFyYW1OYW1lKTtmdW5jdGlvbiBwYXJhbU5hbWUocGFyYW0pe3N3aXRjaChwYXJhbS50eXBlKXtjYXNlJ0lkZW50aWZpZXInOnJldHVybiBwYXJhbS5uYW1lO2Nhc2UnQXNzaWdubWVudFBhdHRlcm4nOnJldHVybic/JytwYXJhbU5hbWUocGFyYW0ubGVmdCk7Y2FzZSdPYmplY3RQYXR0ZXJuJzpyZXR1cm4nb2JqJztjYXNlJ0FycmF5UGF0dGVybic6cmV0dXJuJ2Fycic7Y2FzZSdSZXN0RWxlbWVudCc6cmV0dXJuJy4uLicrcGFyYW1OYW1lKHBhcmFtLmFyZ3VtZW50KTt9CnJldHVybic/Jzt9fTtGb3JtYXR0ZXJXb3JrZXIuZmluZExhc3RFeHByZXNzaW9uPWZ1bmN0aW9uKGNvbnRlbnQpe2lmKGNvbnRlbnQubGVuZ3RoPjEwMDAwKQpyZXR1cm4gbnVsbDt0cnl7Y29uc3QgdG9rZW5pemVyPWFjb3JuLnRva2VuaXplcihjb250ZW50LHtlY21hVmVyc2lvbjo5fSk7d2hpbGUodG9rZW5pemVyLmdldFRva2VuKCkudHlwZSE9PWFjb3JuLnRva1R5cGVzLmVvZil7fX1jYXRjaChlKXtyZXR1cm4gbnVsbDt9CmNvbnN0IHN1ZmZpeD0nLkRFVlRPT0xTJzt0cnl7YWNvcm4ucGFyc2UoY29udGVudCtzdWZmaXgse2VjbWFWZXJzaW9uOjl9KTt9Y2F0Y2gocGFyc2VFcnJvcil7aWYocGFyc2VFcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoJ1VuZXhwZWN0ZWQgdG9rZW4nKSYmcGFyc2VFcnJvci5wb3M9PT1jb250ZW50Lmxlbmd0aCkKcmV0dXJuIG51bGw7fQpjb25zdCBiYXNlPUZvcm1hdHRlcldvcmtlci5fbGFzdENvbXBsZXRlRXhwcmVzc2lvbihjb250ZW50LHN1ZmZpeCxuZXcgU2V0KFsnTWVtYmVyRXhwcmVzc2lvbicsJ0lkZW50aWZpZXInXSkpO2lmKCFiYXNlKQpyZXR1cm4gbnVsbDtjb25zdHtiYXNlRXhwcmVzc2lvbixiYXNlTm9kZX09YmFzZTtjb25zdCBwb3NzaWJsZVNpZGVFZmZlY3RzPUZvcm1hdHRlcldvcmtlci5fbm9kZUhhc1Bvc3NpYmxlU2lkZUVmZmVjdHMoYmFzZU5vZGUpO3JldHVybntiYXNlRXhwcmVzc2lvbixwb3NzaWJsZVNpZGVFZmZlY3RzfTt9O0Zvcm1hdHRlcldvcmtlci5fbGFzdENvbXBsZXRlRXhwcmVzc2lvbj1mdW5jdGlvbihjb250ZW50LHN1ZmZpeCx0eXBlcyl7bGV0IGFzdDtsZXQgcGFyc2VkQ29udGVudD0nJztmb3IobGV0IGk9MDtpPGNvbnRlbnQubGVuZ3RoO2krKyl7dHJ5e3BhcnNlZENvbnRlbnQ9Y29udGVudFtpXT09PSd7Jz9gKCR7Y29udGVudC5zdWJzdHJpbmcoaSl9KSR7c3VmZml4fWA6YCR7Y29udGVudC5zdWJzdHJpbmcoaSl9JHtzdWZmaXh9YDthc3Q9YWNvcm4ucGFyc2UocGFyc2VkQ29udGVudCx7ZWNtYVZlcnNpb246OX0pO2JyZWFrO31jYXRjaChlKXt9fQppZighYXN0KQpyZXR1cm4gbnVsbDtsZXQgYmFzZU5vZGU9bnVsbDtjb25zdCB3YWxrZXI9bmV3IEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIobm9kZT0+e2lmKGJhc2VOb2RlfHxub2RlLmVuZDxhc3QuZW5kKQpyZXR1cm4gRm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlci5Ta2lwU3VidHJlZTtpZih0eXBlcy5oYXMobm9kZS50eXBlKSkKYmFzZU5vZGU9bm9kZTt9KTt3YWxrZXIud2Fsayhhc3QpO2lmKCFiYXNlTm9kZSkKcmV0dXJuIG51bGw7bGV0IGJhc2VFeHByZXNzaW9uPXBhcnNlZENvbnRlbnQuc3Vic3RyaW5nKGJhc2VOb2RlLnN0YXJ0LHBhcnNlZENvbnRlbnQubGVuZ3RoLXN1ZmZpeC5sZW5ndGgpO2lmKGJhc2VFeHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3snKSkKYmFzZUV4cHJlc3Npb249YCgke2Jhc2VFeHByZXNzaW9ufSlgO3JldHVybntiYXNlTm9kZSxiYXNlRXhwcmVzc2lvbn07fTtGb3JtYXR0ZXJXb3JrZXIuX25vZGVIYXNQb3NzaWJsZVNpZGVFZmZlY3RzPWZ1bmN0aW9uKGJhc2VOb2RlKXtjb25zdCBzaWRlRWZmZWN0RnJlZVR5cGVzPW5ldyBTZXQoWydNZW1iZXJFeHByZXNzaW9uJywnSWRlbnRpZmllcicsJ0JpbmFyeUV4cHJlc3Npb24nLCdMaXRlcmFsJywnVGVtcGxhdGVMaXRlcmFsJywnVGVtcGxhdGVFbGVtZW50JywnT2JqZWN0RXhwcmVzc2lvbicsJ0FycmF5RXhwcmVzc2lvbicsJ1Byb3BlcnR5JywnVGhpc0V4cHJlc3Npb24nXSk7bGV0IHBvc3NpYmxlU2lkZUVmZmVjdHM9ZmFsc2U7Y29uc3Qgc2lkZUVmZmVjdHdhbGtlcj1uZXcgRm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlcihub2RlPT57aWYoIXBvc3NpYmxlU2lkZUVmZmVjdHMmJiFzaWRlRWZmZWN0RnJlZVR5cGVzLmhhcyhub2RlLnR5cGUpKQpwb3NzaWJsZVNpZGVFZmZlY3RzPXRydWU7aWYocG9zc2libGVTaWRlRWZmZWN0cykKcmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fSk7c2lkZUVmZmVjdHdhbGtlci53YWxrKChiYXNlTm9kZSkpO3JldHVybiBwb3NzaWJsZVNpZGVFZmZlY3RzO307Rm9ybWF0dGVyV29ya2VyLkZvcm1hdHRlcldvcmtlckNvbnRlbnRQYXJzZXI9ZnVuY3Rpb24oKXt9O0Zvcm1hdHRlcldvcmtlci5Gb3JtYXR0ZXJXb3JrZXJDb250ZW50UGFyc2VyLnByb3RvdHlwZT17cGFyc2UoY29udGVudCl7fX07Rm9ybWF0dGVyV29ya2VyLkZvcm1hdHRlcldvcmtlckNvbnRlbnRQYXJzZXIucGFyc2U9ZnVuY3Rpb24oY29udGVudCxtaW1lVHlwZSl7Y29uc3QgZXh0ZW5zaW9uPXNlbGYucnVudGltZS5leHRlbnNpb25zKEZvcm1hdHRlcldvcmtlci5Gb3JtYXR0ZXJXb3JrZXJDb250ZW50UGFyc2VyKS5maW5kKGZpbmRFeHRlbnNpb24pO2NvbnNvbGUuYXNzZXJ0KGV4dGVuc2lvbik7ZXh0ZW5zaW9uLmluc3RhbmNlKCkudGhlbihpbnN0YW5jZT0+aW5zdGFuY2UucGFyc2UoY29udGVudCkpLmNhdGNoRXhjZXB0aW9uKG51bGwpLnRoZW4ocG9zdE1lc3NhZ2UpO2Z1bmN0aW9uIGZpbmRFeHRlbnNpb24oZXh0ZW5zaW9uKXtyZXR1cm4gZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnbWltZVR5cGUnXT09PW1pbWVUeXBlO319OyhmdW5jdGlvbiBkaXNhYmxlTG9nZ2luZ0ZvclRlc3QoKXtpZihSdW50aW1lLnF1ZXJ5UGFyYW0oJ3Rlc3QnKSkKY29uc29sZS5lcnJvcj0oKT0+dW5kZWZpbmVkO30pKCk7OyhmdW5jdGlvbihnbG9iYWwsZmFjdG9yeSl7dHlwZW9mIGV4cG9ydHM9PT0nb2JqZWN0JyYmdHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnP2ZhY3RvcnkoZXhwb3J0cyk6dHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicmJmRlZmluZS5hbWQ/ZGVmaW5lKFsnZXhwb3J0cyddLGZhY3RvcnkpOihmYWN0b3J5KChnbG9iYWwuYWNvcm49e30pKSk7fSh0aGlzLChmdW5jdGlvbihleHBvcnRzKXsndXNlIHN0cmljdCc7dmFyIHJlc2VydmVkV29yZHM9ezM6ImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBjaGFyIGNsYXNzIGRvdWJsZSBlbnVtIGV4cG9ydCBleHRlbmRzIGZpbmFsIGZsb2F0IGdvdG8gaW1wbGVtZW50cyBpbXBvcnQgaW50IGludGVyZmFjZSBsb25nIG5hdGl2ZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzaG9ydCBzdGF0aWMgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgdm9sYXRpbGUiLDU6ImNsYXNzIGVudW0gZXh0ZW5kcyBzdXBlciBjb25zdCBleHBvcnQgaW1wb3J0Iiw2OiJlbnVtIixzdHJpY3Q6ImltcGxlbWVudHMgaW50ZXJmYWNlIGxldCBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzdGF0aWMgeWllbGQiLHN0cmljdEJpbmQ6ImV2YWwgYXJndW1lbnRzIn07dmFyIGVjbWE1QW5kTGVzc0tleXdvcmRzPSJicmVhayBjYXNlIGNhdGNoIGNvbnRpbnVlIGRlYnVnZ2VyIGRlZmF1bHQgZG8gZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiByZXR1cm4gc3dpdGNoIHRocm93IHRyeSB2YXIgd2hpbGUgd2l0aCBudWxsIHRydWUgZmFsc2UgaW5zdGFuY2VvZiB0eXBlb2Ygdm9pZCBkZWxldGUgbmV3IGluIHRoaXMiO3ZhciBrZXl3b3Jkcz17NTplY21hNUFuZExlc3NLZXl3b3Jkcyw2OmVjbWE1QW5kTGVzc0tleXdvcmRzKyIgY29uc3QgY2xhc3MgZXh0ZW5kcyBleHBvcnQgaW1wb3J0IHN1cGVyIn07dmFyIGtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3I9L15pbihzdGFuY2VvZik/JC87dmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnM9Ilx4YWFceGI1XHhiYVx4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHUwMmMxXHUwMmM2LVx1MDJkMVx1MDJlMC1cdTAyZTRcdTAyZWNcdTAyZWVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdhLVx1MDM3ZFx1MDM3Zlx1MDM4Nlx1MDM4OC1cdTAzOGFcdTAzOGNcdTAzOGUtXHUwM2ExXHUwM2EzLVx1MDNmNVx1MDNmNy1cdTA0ODFcdTA0OGEtXHUwNTJmXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1ZDAtXHUwNWVhXHUwNWYwLVx1MDVmMlx1MDYyMC1cdTA2NGFcdTA2NmVcdTA2NmZcdTA2NzEtXHUwNmQzXHUwNmQ1XHUwNmU1XHUwNmU2XHUwNmVlXHUwNmVmXHUwNmZhLVx1MDZmY1x1MDZmZlx1MDcxMFx1MDcxMi1cdTA3MmZcdTA3NGQtXHUwN2E1XHUwN2IxXHUwN2NhLVx1MDdlYVx1MDdmNFx1MDdmNVx1MDdmYVx1MDgwMC1cdTA4MTVcdTA4MWFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2YVx1MDhhMC1cdTA4YjRcdTA4YjYtXHUwOGJkXHUwOTA0LVx1MDkzOVx1MDkzZFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Y1x1MDk4Zlx1MDk5MFx1MDk5My1cdTA5YThcdTA5YWEtXHUwOWIwXHUwOWIyXHUwOWI2LVx1MDliOVx1MDliZFx1MDljZVx1MDlkY1x1MDlkZFx1MDlkZi1cdTA5ZTFcdTA5ZjBcdTA5ZjFcdTA5ZmNcdTBhMDUtXHUwYTBhXHUwYTBmXHUwYTEwXHUwYTEzLVx1MGEyOFx1MGEyYS1cdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzZcdTBhMzhcdTBhMzlcdTBhNTktXHUwYTVjXHUwYTVlXHUwYTcyLVx1MGE3NFx1MGE4NS1cdTBhOGRcdTBhOGYtXHUwYTkxXHUwYTkzLVx1MGFhOFx1MGFhYS1cdTBhYjBcdTBhYjJcdTBhYjNcdTBhYjUtXHUwYWI5XHUwYWJkXHUwYWQwXHUwYWUwXHUwYWUxXHUwYWY5XHUwYjA1LVx1MGIwY1x1MGIwZlx1MGIxMFx1MGIxMy1cdTBiMjhcdTBiMmEtXHUwYjMwXHUwYjMyXHUwYjMzXHUwYjM1LVx1MGIzOVx1MGIzZFx1MGI1Y1x1MGI1ZFx1MGI1Zi1cdTBiNjFcdTBiNzFcdTBiODNcdTBiODUtXHUwYjhhXHUwYjhlLVx1MGI5MFx1MGI5Mi1cdTBiOTVcdTBiOTlcdTBiOWFcdTBiOWNcdTBiOWVcdTBiOWZcdTBiYTNcdTBiYTRcdTBiYTgtXHUwYmFhXHUwYmFlLVx1MGJiOVx1MGJkMFx1MGMwNS1cdTBjMGNcdTBjMGUtXHUwYzEwXHUwYzEyLVx1MGMyOFx1MGMyYS1cdTBjMzlcdTBjM2RcdTBjNTgtXHUwYzVhXHUwYzYwXHUwYzYxXHUwYzgwXHUwYzg1LVx1MGM4Y1x1MGM4ZS1cdTBjOTBcdTBjOTItXHUwY2E4XHUwY2FhLVx1MGNiM1x1MGNiNS1cdTBjYjlcdTBjYmRcdTBjZGVcdTBjZTBcdTBjZTFcdTBjZjFcdTBjZjJcdTBkMDUtXHUwZDBjXHUwZDBlLVx1MGQxMFx1MGQxMi1cdTBkM2FcdTBkM2RcdTBkNGVcdTBkNTQtXHUwZDU2XHUwZDVmLVx1MGQ2MVx1MGQ3YS1cdTBkN2ZcdTBkODUtXHUwZDk2XHUwZDlhLVx1MGRiMVx1MGRiMy1cdTBkYmJcdTBkYmRcdTBkYzAtXHUwZGM2XHUwZTAxLVx1MGUzMFx1MGUzMlx1MGUzM1x1MGU0MC1cdTBlNDZcdTBlODFcdTBlODJcdTBlODRcdTBlODdcdTBlODhcdTBlOGFcdTBlOGRcdTBlOTQtXHUwZTk3XHUwZTk5LVx1MGU5Zlx1MGVhMS1cdTBlYTNcdTBlYTVcdTBlYTdcdTBlYWFcdTBlYWJcdTBlYWQtXHUwZWIwXHUwZWIyXHUwZWIzXHUwZWJkXHUwZWMwLVx1MGVjNFx1MGVjNlx1MGVkYy1cdTBlZGZcdTBmMDBcdTBmNDAtXHUwZjQ3XHUwZjQ5LVx1MGY2Y1x1MGY4OC1cdTBmOGNcdTEwMDAtXHUxMDJhXHUxMDNmXHUxMDUwLVx1MTA1NVx1MTA1YS1cdTEwNWRcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNmUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4ZVx1MTBhMC1cdTEwYzVcdTEwYzdcdTEwY2RcdTEwZDAtXHUxMGZhXHUxMGZjLVx1MTI0OFx1MTI0YS1cdTEyNGRcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVhLVx1MTI1ZFx1MTI2MC1cdTEyODhcdTEyOGEtXHUxMjhkXHUxMjkwLVx1MTJiMFx1MTJiMi1cdTEyYjVcdTEyYjgtXHUxMmJlXHUxMmMwXHUxMmMyLVx1MTJjNVx1MTJjOC1cdTEyZDZcdTEyZDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNWFcdTEzODAtXHUxMzhmXHUxM2EwLVx1MTNmNVx1MTNmOC1cdTEzZmRcdTE0MDEtXHUxNjZjXHUxNjZmLVx1MTY3Zlx1MTY4MS1cdTE2OWFcdTE2YTAtXHUxNmVhXHUxNmVlLVx1MTZmOFx1MTcwMC1cdTE3MGNcdTE3MGUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZjXHUxNzZlLVx1MTc3MFx1MTc4MC1cdTE3YjNcdTE3ZDdcdTE3ZGNcdTE4MjAtXHUxODc3XHUxODgwLVx1MThhOFx1MThhYVx1MThiMC1cdTE4ZjVcdTE5MDAtXHUxOTFlXHUxOTUwLVx1MTk2ZFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOWFiXHUxOWIwLVx1MTljOVx1MWEwMC1cdTFhMTZcdTFhMjAtXHUxYTU0XHUxYWE3XHUxYjA1LVx1MWIzM1x1MWI0NS1cdTFiNGJcdTFiODMtXHUxYmEwXHUxYmFlXHUxYmFmXHUxYmJhLVx1MWJlNVx1MWMwMC1cdTFjMjNcdTFjNGQtXHUxYzRmXHUxYzVhLVx1MWM3ZFx1MWM4MC1cdTFjODhcdTFjZTktXHUxY2VjXHUxY2VlLVx1MWNmMVx1MWNmNVx1MWNmNlx1MWQwMC1cdTFkYmZcdTFlMDAtXHUxZjE1XHUxZjE4LVx1MWYxZFx1MWYyMC1cdTFmNDVcdTFmNDgtXHUxZjRkXHUxZjUwLVx1MWY1N1x1MWY1OVx1MWY1Ylx1MWY1ZFx1MWY1Zi1cdTFmN2RcdTFmODAtXHUxZmI0XHUxZmI2LVx1MWZiY1x1MWZiZVx1MWZjMi1cdTFmYzRcdTFmYzYtXHUxZmNjXHUxZmQwLVx1MWZkM1x1MWZkNi1cdTFmZGJcdTFmZTAtXHUxZmVjXHUxZmYyLVx1MWZmNFx1MWZmNi1cdTFmZmNcdTIwNzFcdTIwN2ZcdTIwOTAtXHUyMDljXHUyMTAyXHUyMTA3XHUyMTBhLVx1MjExM1x1MjExNVx1MjExOC1cdTIxMWRcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMmEtXHUyMTM5XHUyMTNjLVx1MjEzZlx1MjE0NS1cdTIxNDlcdTIxNGVcdTIxNjAtXHUyMTg4XHUyYzAwLVx1MmMyZVx1MmMzMC1cdTJjNWVcdTJjNjAtXHUyY2U0XHUyY2ViLVx1MmNlZVx1MmNmMlx1MmNmM1x1MmQwMC1cdTJkMjVcdTJkMjdcdTJkMmRcdTJkMzAtXHUyZDY3XHUyZDZmXHUyZDgwLVx1MmQ5Nlx1MmRhMC1cdTJkYTZcdTJkYTgtXHUyZGFlXHUyZGIwLVx1MmRiNlx1MmRiOC1cdTJkYmVcdTJkYzAtXHUyZGM2XHUyZGM4LVx1MmRjZVx1MmRkMC1cdTJkZDZcdTJkZDgtXHUyZGRlXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMjlcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzY1x1MzA0MS1cdTMwOTZcdTMwOWItXHUzMDlmXHUzMGExLVx1MzBmYVx1MzBmYy1cdTMwZmZcdTMxMDUtXHUzMTJlXHUzMTMxLVx1MzE4ZVx1MzFhMC1cdTMxYmFcdTMxZjAtXHUzMWZmXHUzNDAwLVx1NGRiNVx1NGUwMC1cdTlmZWFcdWEwMDAtXHVhNDhjXHVhNGQwLVx1YTRmZFx1YTUwMC1cdWE2MGNcdWE2MTAtXHVhNjFmXHVhNjJhXHVhNjJiXHVhNjQwLVx1YTY2ZVx1YTY3Zi1cdWE2OWRcdWE2YTAtXHVhNmVmXHVhNzE3LVx1YTcxZlx1YTcyMi1cdWE3ODhcdWE3OGItXHVhN2FlXHVhN2IwLVx1YTdiN1x1YTdmNy1cdWE4MDFcdWE4MDMtXHVhODA1XHVhODA3LVx1YTgwYVx1YTgwYy1cdWE4MjJcdWE4NDAtXHVhODczXHVhODgyLVx1YThiM1x1YThmMi1cdWE4ZjdcdWE4ZmJcdWE4ZmRcdWE5MGEtXHVhOTI1XHVhOTMwLVx1YTk0Nlx1YTk2MC1cdWE5N2NcdWE5ODQtXHVhOWIyXHVhOWNmXHVhOWUwLVx1YTllNFx1YTllNi1cdWE5ZWZcdWE5ZmEtXHVhOWZlXHVhYTAwLVx1YWEyOFx1YWE0MC1cdWFhNDJcdWFhNDQtXHVhYTRiXHVhYTYwLVx1YWE3Nlx1YWE3YVx1YWE3ZS1cdWFhYWZcdWFhYjFcdWFhYjVcdWFhYjZcdWFhYjktXHVhYWJkXHVhYWMwXHVhYWMyXHVhYWRiLVx1YWFkZFx1YWFlMC1cdWFhZWFcdWFhZjItXHVhYWY0XHVhYjAxLVx1YWIwNlx1YWIwOS1cdWFiMGVcdWFiMTEtXHVhYjE2XHVhYjIwLVx1YWIyNlx1YWIyOC1cdWFiMmVcdWFiMzAtXHVhYjVhXHVhYjVjLVx1YWI2NVx1YWI3MC1cdWFiZTJcdWFjMDAtXHVkN2EzXHVkN2IwLVx1ZDdjNlx1ZDdjYi1cdWQ3ZmJcdWY5MDAtXHVmYTZkXHVmYTcwLVx1ZmFkOVx1ZmIwMC1cdWZiMDZcdWZiMTMtXHVmYjE3XHVmYjFkXHVmYjFmLVx1ZmIyOFx1ZmIyYS1cdWZiMzZcdWZiMzgtXHVmYjNjXHVmYjNlXHVmYjQwXHVmYjQxXHVmYjQzXHVmYjQ0XHVmYjQ2LVx1ZmJiMVx1ZmJkMy1cdWZkM2RcdWZkNTAtXHVmZDhmXHVmZDkyLVx1ZmRjN1x1ZmRmMC1cdWZkZmJcdWZlNzAtXHVmZTc0XHVmZTc2LVx1ZmVmY1x1ZmYyMS1cdWZmM2FcdWZmNDEtXHVmZjVhXHVmZjY2LVx1ZmZiZVx1ZmZjMi1cdWZmYzdcdWZmY2EtXHVmZmNmXHVmZmQyLVx1ZmZkN1x1ZmZkYS1cdWZmZGMiO3ZhciBub25BU0NJSWlkZW50aWZpZXJDaGFycz0iXHUyMDBjXHUyMDBkXHhiN1x1MDMwMC1cdTAzNmZcdTAzODdcdTA0ODMtXHUwNDg3XHUwNTkxLVx1MDViZFx1MDViZlx1MDVjMVx1MDVjMlx1MDVjNFx1MDVjNVx1MDVjN1x1MDYxMC1cdTA2MWFcdTA2NGItXHUwNjY5XHUwNjcwXHUwNmQ2LVx1MDZkY1x1MDZkZi1cdTA2ZTRcdTA2ZTdcdTA2ZThcdTA2ZWEtXHUwNmVkXHUwNmYwLVx1MDZmOVx1MDcxMVx1MDczMC1cdTA3NGFcdTA3YTYtXHUwN2IwXHUwN2MwLVx1MDdjOVx1MDdlYi1cdTA3ZjNcdTA4MTYtXHUwODE5XHUwODFiLVx1MDgyM1x1MDgyNS1cdTA4MjdcdTA4MjktXHUwODJkXHUwODU5LVx1MDg1Ylx1MDhkNC1cdTA4ZTFcdTA4ZTMtXHUwOTAzXHUwOTNhLVx1MDkzY1x1MDkzZS1cdTA5NGZcdTA5NTEtXHUwOTU3XHUwOTYyXHUwOTYzXHUwOTY2LVx1MDk2Zlx1MDk4MS1cdTA5ODNcdTA5YmNcdTA5YmUtXHUwOWM0XHUwOWM3XHUwOWM4XHUwOWNiLVx1MDljZFx1MDlkN1x1MDllMlx1MDllM1x1MDllNi1cdTA5ZWZcdTBhMDEtXHUwYTAzXHUwYTNjXHUwYTNlLVx1MGE0Mlx1MGE0N1x1MGE0OFx1MGE0Yi1cdTBhNGRcdTBhNTFcdTBhNjYtXHUwYTcxXHUwYTc1XHUwYTgxLVx1MGE4M1x1MGFiY1x1MGFiZS1cdTBhYzVcdTBhYzctXHUwYWM5XHUwYWNiLVx1MGFjZFx1MGFlMlx1MGFlM1x1MGFlNi1cdTBhZWZcdTBhZmEtXHUwYWZmXHUwYjAxLVx1MGIwM1x1MGIzY1x1MGIzZS1cdTBiNDRcdTBiNDdcdTBiNDhcdTBiNGItXHUwYjRkXHUwYjU2XHUwYjU3XHUwYjYyXHUwYjYzXHUwYjY2LVx1MGI2Zlx1MGI4Mlx1MGJiZS1cdTBiYzJcdTBiYzYtXHUwYmM4XHUwYmNhLVx1MGJjZFx1MGJkN1x1MGJlNi1cdTBiZWZcdTBjMDAtXHUwYzAzXHUwYzNlLVx1MGM0NFx1MGM0Ni1cdTBjNDhcdTBjNGEtXHUwYzRkXHUwYzU1XHUwYzU2XHUwYzYyXHUwYzYzXHUwYzY2LVx1MGM2Zlx1MGM4MS1cdTBjODNcdTBjYmNcdTBjYmUtXHUwY2M0XHUwY2M2LVx1MGNjOFx1MGNjYS1cdTBjY2RcdTBjZDVcdTBjZDZcdTBjZTJcdTBjZTNcdTBjZTYtXHUwY2VmXHUwZDAwLVx1MGQwM1x1MGQzYlx1MGQzY1x1MGQzZS1cdTBkNDRcdTBkNDYtXHUwZDQ4XHUwZDRhLVx1MGQ0ZFx1MGQ1N1x1MGQ2Mlx1MGQ2M1x1MGQ2Ni1cdTBkNmZcdTBkODJcdTBkODNcdTBkY2FcdTBkY2YtXHUwZGQ0XHUwZGQ2XHUwZGQ4LVx1MGRkZlx1MGRlNi1cdTBkZWZcdTBkZjJcdTBkZjNcdTBlMzFcdTBlMzQtXHUwZTNhXHUwZTQ3LVx1MGU0ZVx1MGU1MC1cdTBlNTlcdTBlYjFcdTBlYjQtXHUwZWI5XHUwZWJiXHUwZWJjXHUwZWM4LVx1MGVjZFx1MGVkMC1cdTBlZDlcdTBmMThcdTBmMTlcdTBmMjAtXHUwZjI5XHUwZjM1XHUwZjM3XHUwZjM5XHUwZjNlXHUwZjNmXHUwZjcxLVx1MGY4NFx1MGY4Nlx1MGY4N1x1MGY4ZC1cdTBmOTdcdTBmOTktXHUwZmJjXHUwZmM2XHUxMDJiLVx1MTAzZVx1MTA0MC1cdTEwNDlcdTEwNTYtXHUxMDU5XHUxMDVlLVx1MTA2MFx1MTA2Mi1cdTEwNjRcdTEwNjctXHUxMDZkXHUxMDcxLVx1MTA3NFx1MTA4Mi1cdTEwOGRcdTEwOGYtXHUxMDlkXHUxMzVkLVx1MTM1Zlx1MTM2OS1cdTEzNzFcdTE3MTItXHUxNzE0XHUxNzMyLVx1MTczNFx1MTc1Mlx1MTc1M1x1MTc3Mlx1MTc3M1x1MTdiNC1cdTE3ZDNcdTE3ZGRcdTE3ZTAtXHUxN2U5XHUxODBiLVx1MTgwZFx1MTgxMC1cdTE4MTlcdTE4YTlcdTE5MjAtXHUxOTJiXHUxOTMwLVx1MTkzYlx1MTk0Ni1cdTE5NGZcdTE5ZDAtXHUxOWRhXHUxYTE3LVx1MWExYlx1MWE1NS1cdTFhNWVcdTFhNjAtXHUxYTdjXHUxYTdmLVx1MWE4OVx1MWE5MC1cdTFhOTlcdTFhYjAtXHUxYWJkXHUxYjAwLVx1MWIwNFx1MWIzNC1cdTFiNDRcdTFiNTAtXHUxYjU5XHUxYjZiLVx1MWI3M1x1MWI4MC1cdTFiODJcdTFiYTEtXHUxYmFkXHUxYmIwLVx1MWJiOVx1MWJlNi1cdTFiZjNcdTFjMjQtXHUxYzM3XHUxYzQwLVx1MWM0OVx1MWM1MC1cdTFjNTlcdTFjZDAtXHUxY2QyXHUxY2Q0LVx1MWNlOFx1MWNlZFx1MWNmMi1cdTFjZjRcdTFjZjctXHUxY2Y5XHUxZGMwLVx1MWRmOVx1MWRmYi1cdTFkZmZcdTIwM2ZcdTIwNDBcdTIwNTRcdTIwZDAtXHUyMGRjXHUyMGUxXHUyMGU1LVx1MjBmMFx1MmNlZi1cdTJjZjFcdTJkN2ZcdTJkZTAtXHUyZGZmXHUzMDJhLVx1MzAyZlx1MzA5OVx1MzA5YVx1YTYyMC1cdWE2MjlcdWE2NmZcdWE2NzQtXHVhNjdkXHVhNjllXHVhNjlmXHVhNmYwXHVhNmYxXHVhODAyXHVhODA2XHVhODBiXHVhODIzLVx1YTgyN1x1YTg4MFx1YTg4MVx1YThiNC1cdWE4YzVcdWE4ZDAtXHVhOGQ5XHVhOGUwLVx1YThmMVx1YTkwMC1cdWE5MDlcdWE5MjYtXHVhOTJkXHVhOTQ3LVx1YTk1M1x1YTk4MC1cdWE5ODNcdWE5YjMtXHVhOWMwXHVhOWQwLVx1YTlkOVx1YTllNVx1YTlmMC1cdWE5ZjlcdWFhMjktXHVhYTM2XHVhYTQzXHVhYTRjXHVhYTRkXHVhYTUwLVx1YWE1OVx1YWE3Yi1cdWFhN2RcdWFhYjBcdWFhYjItXHVhYWI0XHVhYWI3XHVhYWI4XHVhYWJlXHVhYWJmXHVhYWMxXHVhYWViLVx1YWFlZlx1YWFmNVx1YWFmNlx1YWJlMy1cdWFiZWFcdWFiZWNcdWFiZWRcdWFiZjAtXHVhYmY5XHVmYjFlXHVmZTAwLVx1ZmUwZlx1ZmUyMC1cdWZlMmZcdWZlMzNcdWZlMzRcdWZlNGQtXHVmZTRmXHVmZjEwLVx1ZmYxOVx1ZmYzZiI7dmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0PW5ldyBSZWdFeHAoIlsiK25vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMrIl0iKTt2YXIgbm9uQVNDSUlpZGVudGlmaWVyPW5ldyBSZWdFeHAoIlsiK25vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMrbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMrIl0iKTtub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzPW5vbkFTQ0lJaWRlbnRpZmllckNoYXJzPW51bGw7dmFyIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzPVswLDExLDIsMjUsMiwxOCwyLDEsMiwxNCwzLDEzLDM1LDEyMiw3MCw1MiwyNjgsMjgsNCw0OCw0OCwzMSwxNCwyOSw2LDM3LDExLDI5LDMsMzUsNSw3LDIsNCw0MywxNTcsMTksMzUsNSwzNSw1LDM5LDksNTEsMTU3LDMxMCwxMCwyMSwxMSw3LDE1Myw1LDMsMCwyLDQzLDIsMSw0LDAsMywyMiwxMSwyMiwxMCwzMCw2NiwxOCwyLDEsMTEsMjEsMTEsMjUsNzEsNTUsNywxLDY1LDAsMTYsMywyLDIsMiwyNiw0NSwyOCw0LDI4LDM2LDcsMiwyNywyOCw1MywxMSwyMSwxMSwxOCwxNCwxNywxMTEsNzIsNTYsNTAsMTQsNTAsNzg1LDUyLDc2LDQ0LDMzLDI0LDI3LDM1LDQyLDM0LDQsMCwxMyw0NywxNSwzLDIyLDAsMiwwLDM2LDE3LDIsMjQsODUsNiwyLDAsMiwzLDIsMTQsMiw5LDgsNDYsMzksNywzLDEsMywyMSwyLDYsMiwxLDIsNCw0LDAsMTksMCwxMyw0LDE1OSw1MiwxOSwzLDU0LDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsODYsMjUsMzkxLDYzLDMyLDAsMjU3LDAsMTEsMzksOCwwLDIyLDAsMTIsMzksMywzLDU1LDU2LDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDY5OCw5MjEsMTAzLDExMCwxOCwxOTUsMjc0OSwxMDcwLDQwNTAsNTgyLDg2MzQsNTY4LDgsMzAsMTE0LDI5LDE5LDQ3LDE3LDMsMzIsMjAsNiwxOCw4ODEsNjgsMTIsMCw2NywxMiw2NSwxLDMxLDYxMjQsMjAsNzU0LDk0ODYsMjg2LDgyLDM5NSwyMzA5LDEwNiw2LDEyLDQsOCw4LDksNTk5MSw4NCwyLDcwLDIsMSwzLDAsMywxLDMsMywyLDExLDIsMCwyLDYsMiw2NCwyLDMsMyw3LDIsNiwyLDI3LDIsMywyLDQsMiwwLDQsNiwyLDMzOSwzLDI0LDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsNyw0MTQ5LDE5Niw2MCw2NywxMjEzLDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzEwLDQyLDQxNDgsMTIsMjIxLDMsNTc2MSwxNSw3NDcyLDMxMDQsNTQxXTt2YXIgYXN0cmFsSWRlbnRpZmllckNvZGVzPVs1MDksMCwyMjcsMCwxNTAsNCwyOTQsOSwxMzY4LDIsMiwxLDYsMyw0MSwyLDUsMCwxNjYsMSwxMzA2LDIsNTQsMTQsMzIsOSwxNiwzLDQ2LDEwLDU0LDksNywyLDM3LDEzLDIsOSw1MiwwLDEzLDIsNDksMTMsMTAsMiw0LDksODMsMTEsNywwLDE2MSwxMSw2LDksNywzLDU3LDAsMiw2LDMsMSwzLDIsMTAsMCwxMSwxLDMsNiw0LDQsMTkzLDE3LDEwLDksODcsMTksMTMsOSwyMTQsNiwzLDgsMjgsMSw4MywxNiwxNiw5LDgyLDEyLDksOSw4NCwxNCw1LDksNDIzLDksMjgwLDksNDEsNiwyLDMsOSwwLDEwLDEwLDQ3LDE1LDQwNiw3LDIsNywxNyw5LDU3LDIxLDIsMTMsMTIzLDUsNCwwLDIsMSwyLDYsMiwwLDksOSwxOTcxOSw5LDEzNSw0LDYwLDYsMjYsOSwxMDE2LDQ1LDE3LDMsMTk3MjMsMSw1MzE5LDQsNCw1LDksNywzLDYsMzEsMywxNDksMiwxNDE4LDQ5LDUxMyw1NCw1LDQ5LDksMCwxNSwwLDIzLDQsMiwxNCwxMzYxLDYsMiwxNiwzLDYsMiwxLDIsNCwyMjE0LDYsMTEwLDYsNiw5LDc5MjQ4NywyMzldO2Z1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZSxzZXQpe3ZhciBwb3M9MHgxMDAwMDtmb3IodmFyIGk9MDtpPHNldC5sZW5ndGg7aSs9Mil7cG9zKz1zZXRbaV07aWYocG9zPmNvZGUpe3JldHVybiBmYWxzZX0KcG9zKz1zZXRbaSsxXTtpZihwb3M+PWNvZGUpe3JldHVybiB0cnVlfX19CmZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsYXN0cmFsKXtpZihjb2RlPDY1KXtyZXR1cm4gY29kZT09PTM2fQppZihjb2RlPDkxKXtyZXR1cm4gdHJ1ZX0KaWYoY29kZTw5Nyl7cmV0dXJuIGNvZGU9PT05NX0KaWYoY29kZTwxMjMpe3JldHVybiB0cnVlfQppZihjb2RlPD0weGZmZmYpe3JldHVybiBjb2RlPj0weGFhJiZub25BU0NJSWlkZW50aWZpZXJTdGFydC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpfQppZihhc3RyYWw9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfQpyZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzKX0KZnVuY3Rpb24gaXNJZGVudGlmaWVyQ2hhcihjb2RlLGFzdHJhbCl7aWYoY29kZTw0OCl7cmV0dXJuIGNvZGU9PT0zNn0KaWYoY29kZTw1OCl7cmV0dXJuIHRydWV9CmlmKGNvZGU8NjUpe3JldHVybiBmYWxzZX0KaWYoY29kZTw5MSl7cmV0dXJuIHRydWV9CmlmKGNvZGU8OTcpe3JldHVybiBjb2RlPT09OTV9CmlmKGNvZGU8MTIzKXtyZXR1cm4gdHJ1ZX0KaWYoY29kZTw9MHhmZmZmKXtyZXR1cm4gY29kZT49MHhhYSYmbm9uQVNDSUlpZGVudGlmaWVyLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSl9CmlmKGFzdHJhbD09PWZhbHNlKXtyZXR1cm4gZmFsc2V9CnJldHVybiBpc0luQXN0cmFsU2V0KGNvZGUsYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpfHxpc0luQXN0cmFsU2V0KGNvZGUsYXN0cmFsSWRlbnRpZmllckNvZGVzKX0KdmFyIFRva2VuVHlwZT1mdW5jdGlvbiBUb2tlblR5cGUobGFiZWwsY29uZil7aWYoY29uZj09PXZvaWQgMCljb25mPXt9O3RoaXMubGFiZWw9bGFiZWw7dGhpcy5rZXl3b3JkPWNvbmYua2V5d29yZDt0aGlzLmJlZm9yZUV4cHI9ISFjb25mLmJlZm9yZUV4cHI7dGhpcy5zdGFydHNFeHByPSEhY29uZi5zdGFydHNFeHByO3RoaXMuaXNMb29wPSEhY29uZi5pc0xvb3A7dGhpcy5pc0Fzc2lnbj0hIWNvbmYuaXNBc3NpZ247dGhpcy5wcmVmaXg9ISFjb25mLnByZWZpeDt0aGlzLnBvc3RmaXg9ISFjb25mLnBvc3RmaXg7dGhpcy5iaW5vcD1jb25mLmJpbm9wfHxudWxsO3RoaXMudXBkYXRlQ29udGV4dD1udWxsO307ZnVuY3Rpb24gYmlub3AobmFtZSxwcmVjKXtyZXR1cm4gbmV3IFRva2VuVHlwZShuYW1lLHtiZWZvcmVFeHByOnRydWUsYmlub3A6cHJlY30pfQp2YXIgYmVmb3JlRXhwcj17YmVmb3JlRXhwcjp0cnVlfTt2YXIgc3RhcnRzRXhwcj17c3RhcnRzRXhwcjp0cnVlfTt2YXIga2V5d29yZHMkMT17fTtmdW5jdGlvbiBrdyhuYW1lLG9wdGlvbnMpe2lmKG9wdGlvbnM9PT12b2lkIDApb3B0aW9ucz17fTtvcHRpb25zLmtleXdvcmQ9bmFtZTtyZXR1cm4ga2V5d29yZHMkMVtuYW1lXT1uZXcgVG9rZW5UeXBlKG5hbWUsb3B0aW9ucyl9CnZhciB0eXBlcz17bnVtOm5ldyBUb2tlblR5cGUoIm51bSIsc3RhcnRzRXhwcikscmVnZXhwOm5ldyBUb2tlblR5cGUoInJlZ2V4cCIsc3RhcnRzRXhwciksc3RyaW5nOm5ldyBUb2tlblR5cGUoInN0cmluZyIsc3RhcnRzRXhwciksbmFtZTpuZXcgVG9rZW5UeXBlKCJuYW1lIixzdGFydHNFeHByKSxlb2Y6bmV3IFRva2VuVHlwZSgiZW9mIiksYnJhY2tldEw6bmV3IFRva2VuVHlwZSgiWyIse2JlZm9yZUV4cHI6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxicmFja2V0UjpuZXcgVG9rZW5UeXBlKCJdIiksYnJhY2VMOm5ldyBUb2tlblR5cGUoInsiLHtiZWZvcmVFeHByOnRydWUsc3RhcnRzRXhwcjp0cnVlfSksYnJhY2VSOm5ldyBUb2tlblR5cGUoIn0iKSxwYXJlbkw6bmV3IFRva2VuVHlwZSgiKCIse2JlZm9yZUV4cHI6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxwYXJlblI6bmV3IFRva2VuVHlwZSgiKSIpLGNvbW1hOm5ldyBUb2tlblR5cGUoIiwiLGJlZm9yZUV4cHIpLHNlbWk6bmV3IFRva2VuVHlwZSgiOyIsYmVmb3JlRXhwciksY29sb246bmV3IFRva2VuVHlwZSgiOiIsYmVmb3JlRXhwciksZG90Om5ldyBUb2tlblR5cGUoIi4iKSxxdWVzdGlvbjpuZXcgVG9rZW5UeXBlKCI/IixiZWZvcmVFeHByKSxhcnJvdzpuZXcgVG9rZW5UeXBlKCI9PiIsYmVmb3JlRXhwciksdGVtcGxhdGU6bmV3IFRva2VuVHlwZSgidGVtcGxhdGUiKSxpbnZhbGlkVGVtcGxhdGU6bmV3IFRva2VuVHlwZSgiaW52YWxpZFRlbXBsYXRlIiksZWxsaXBzaXM6bmV3IFRva2VuVHlwZSgiLi4uIixiZWZvcmVFeHByKSxiYWNrUXVvdGU6bmV3IFRva2VuVHlwZSgiYCIsc3RhcnRzRXhwciksZG9sbGFyQnJhY2VMOm5ldyBUb2tlblR5cGUoIiR7Iix7YmVmb3JlRXhwcjp0cnVlLHN0YXJ0c0V4cHI6dHJ1ZX0pLGVxOm5ldyBUb2tlblR5cGUoIj0iLHtiZWZvcmVFeHByOnRydWUsaXNBc3NpZ246dHJ1ZX0pLGFzc2lnbjpuZXcgVG9rZW5UeXBlKCJfPSIse2JlZm9yZUV4cHI6dHJ1ZSxpc0Fzc2lnbjp0cnVlfSksaW5jRGVjOm5ldyBUb2tlblR5cGUoIisrLy0tIix7cHJlZml4OnRydWUscG9zdGZpeDp0cnVlLHN0YXJ0c0V4cHI6dHJ1ZX0pLHByZWZpeDpuZXcgVG9rZW5UeXBlKCIhL34iLHtiZWZvcmVFeHByOnRydWUscHJlZml4OnRydWUsc3RhcnRzRXhwcjp0cnVlfSksbG9naWNhbE9SOmJpbm9wKCJ8fCIsMSksbG9naWNhbEFORDpiaW5vcCgiJiYiLDIpLGJpdHdpc2VPUjpiaW5vcCgifCIsMyksYml0d2lzZVhPUjpiaW5vcCgiXiIsNCksYml0d2lzZUFORDpiaW5vcCgiJiIsNSksZXF1YWxpdHk6Ymlub3AoIj09LyE9Lz09PS8hPT0iLDYpLHJlbGF0aW9uYWw6Ymlub3AoIjwvPi88PS8+PSIsNyksYml0U2hpZnQ6Ymlub3AoIjw8Lz4+Lz4+PiIsOCkscGx1c01pbjpuZXcgVG9rZW5UeXBlKCIrLy0iLHtiZWZvcmVFeHByOnRydWUsYmlub3A6OSxwcmVmaXg6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxtb2R1bG86Ymlub3AoIiUiLDEwKSxzdGFyOmJpbm9wKCIqIiwxMCksc2xhc2g6Ymlub3AoIi8iLDEwKSxzdGFyc3RhcjpuZXcgVG9rZW5UeXBlKCIqKiIse2JlZm9yZUV4cHI6dHJ1ZX0pLF9icmVhazprdygiYnJlYWsiKSxfY2FzZTprdygiY2FzZSIsYmVmb3JlRXhwciksX2NhdGNoOmt3KCJjYXRjaCIpLF9jb250aW51ZTprdygiY29udGludWUiKSxfZGVidWdnZXI6a3coImRlYnVnZ2VyIiksX2RlZmF1bHQ6a3coImRlZmF1bHQiLGJlZm9yZUV4cHIpLF9kbzprdygiZG8iLHtpc0xvb3A6dHJ1ZSxiZWZvcmVFeHByOnRydWV9KSxfZWxzZTprdygiZWxzZSIsYmVmb3JlRXhwciksX2ZpbmFsbHk6a3coImZpbmFsbHkiKSxfZm9yOmt3KCJmb3IiLHtpc0xvb3A6dHJ1ZX0pLF9mdW5jdGlvbjprdygiZnVuY3Rpb24iLHN0YXJ0c0V4cHIpLF9pZjprdygiaWYiKSxfcmV0dXJuOmt3KCJyZXR1cm4iLGJlZm9yZUV4cHIpLF9zd2l0Y2g6a3coInN3aXRjaCIpLF90aHJvdzprdygidGhyb3ciLGJlZm9yZUV4cHIpLF90cnk6a3coInRyeSIpLF92YXI6a3coInZhciIpLF9jb25zdDprdygiY29uc3QiKSxfd2hpbGU6a3coIndoaWxlIix7aXNMb29wOnRydWV9KSxfd2l0aDprdygid2l0aCIpLF9uZXc6a3coIm5ldyIse2JlZm9yZUV4cHI6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxfdGhpczprdygidGhpcyIsc3RhcnRzRXhwciksX3N1cGVyOmt3KCJzdXBlciIsc3RhcnRzRXhwciksX2NsYXNzOmt3KCJjbGFzcyIsc3RhcnRzRXhwciksX2V4dGVuZHM6a3coImV4dGVuZHMiLGJlZm9yZUV4cHIpLF9leHBvcnQ6a3coImV4cG9ydCIpLF9pbXBvcnQ6a3coImltcG9ydCIpLF9udWxsOmt3KCJudWxsIixzdGFydHNFeHByKSxfdHJ1ZTprdygidHJ1ZSIsc3RhcnRzRXhwciksX2ZhbHNlOmt3KCJmYWxzZSIsc3RhcnRzRXhwciksX2luOmt3KCJpbiIse2JlZm9yZUV4cHI6dHJ1ZSxiaW5vcDo3fSksX2luc3RhbmNlb2Y6a3coImluc3RhbmNlb2YiLHtiZWZvcmVFeHByOnRydWUsYmlub3A6N30pLF90eXBlb2Y6a3coInR5cGVvZiIse2JlZm9yZUV4cHI6dHJ1ZSxwcmVmaXg6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxfdm9pZDprdygidm9pZCIse2JlZm9yZUV4cHI6dHJ1ZSxwcmVmaXg6dHJ1ZSxzdGFydHNFeHByOnRydWV9KSxfZGVsZXRlOmt3KCJkZWxldGUiLHtiZWZvcmVFeHByOnRydWUscHJlZml4OnRydWUsc3RhcnRzRXhwcjp0cnVlfSl9O3ZhciBsaW5lQnJlYWs9L1xyXG4/fFxufFx1MjAyOHxcdTIwMjkvO3ZhciBsaW5lQnJlYWtHPW5ldyBSZWdFeHAobGluZUJyZWFrLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGlzTmV3TGluZShjb2RlKXtyZXR1cm4gY29kZT09PTEwfHxjb2RlPT09MTN8fGNvZGU9PT0weDIwMjh8fGNvZGU9PT0weDIwMjl9CnZhciBub25BU0NJSXdoaXRlc3BhY2U9L1tcdTE2ODBcdTE4MGVcdTIwMDAtXHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHVmZWZmXS87dmFyIHNraXBXaGl0ZVNwYWNlPS8oPzpcc3xcL1wvLip8XC9cKlteXSo/XCpcLykqL2c7dmFyIHJlZj1PYmplY3QucHJvdG90eXBlO3ZhciBoYXNPd25Qcm9wZXJ0eT1yZWYuaGFzT3duUHJvcGVydHk7dmFyIHRvU3RyaW5nPXJlZi50b1N0cmluZztmdW5jdGlvbiBoYXMob2JqLHByb3BOYW1lKXtyZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmoscHJvcE5hbWUpfQp2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5fHwoZnVuY3Rpb24ob2JqKXtyZXR1cm4odG9TdHJpbmcuY2FsbChvYmopPT09IltvYmplY3QgQXJyYXldIik7fSk7dmFyIFBvc2l0aW9uPWZ1bmN0aW9uIFBvc2l0aW9uKGxpbmUsY29sKXt0aGlzLmxpbmU9bGluZTt0aGlzLmNvbHVtbj1jb2w7fTtQb3NpdGlvbi5wcm90b3R5cGUub2Zmc2V0PWZ1bmN0aW9uIG9mZnNldChuKXtyZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZSx0aGlzLmNvbHVtbituKX07dmFyIFNvdXJjZUxvY2F0aW9uPWZ1bmN0aW9uIFNvdXJjZUxvY2F0aW9uKHAsc3RhcnQsZW5kKXt0aGlzLnN0YXJ0PXN0YXJ0O3RoaXMuZW5kPWVuZDtpZihwLnNvdXJjZUZpbGUhPT1udWxsKXt0aGlzLnNvdXJjZT1wLnNvdXJjZUZpbGU7fX07ZnVuY3Rpb24gZ2V0TGluZUluZm8oaW5wdXQsb2Zmc2V0KXtmb3IodmFyIGxpbmU9MSxjdXI9MDs7KXtsaW5lQnJlYWtHLmxhc3RJbmRleD1jdXI7dmFyIG1hdGNoPWxpbmVCcmVha0cuZXhlYyhpbnB1dCk7aWYobWF0Y2gmJm1hdGNoLmluZGV4PG9mZnNldCl7KytsaW5lO2N1cj1tYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGg7fWVsc2V7cmV0dXJuIG5ldyBQb3NpdGlvbihsaW5lLG9mZnNldC1jdXIpfX19CnZhciBkZWZhdWx0T3B0aW9ucz17ZWNtYVZlcnNpb246Nyxzb3VyY2VUeXBlOiJzY3JpcHQiLG9uSW5zZXJ0ZWRTZW1pY29sb246bnVsbCxvblRyYWlsaW5nQ29tbWE6bnVsbCxhbGxvd1Jlc2VydmVkOm51bGwsYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246ZmFsc2UsYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlOmZhbHNlLGFsbG93SGFzaEJhbmc6ZmFsc2UsbG9jYXRpb25zOmZhbHNlLG9uVG9rZW46bnVsbCxvbkNvbW1lbnQ6bnVsbCxyYW5nZXM6ZmFsc2UscHJvZ3JhbTpudWxsLHNvdXJjZUZpbGU6bnVsbCxkaXJlY3RTb3VyY2VGaWxlOm51bGwscHJlc2VydmVQYXJlbnM6ZmFsc2UscGx1Z2luczp7fX07ZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRzKXt2YXIgb3B0aW9ucz17fTtmb3IodmFyIG9wdCBpbiBkZWZhdWx0T3B0aW9ucykKe29wdGlvbnNbb3B0XT1vcHRzJiZoYXMob3B0cyxvcHQpP29wdHNbb3B0XTpkZWZhdWx0T3B0aW9uc1tvcHRdO30KaWYob3B0aW9ucy5lY21hVmVyc2lvbj49MjAxNSkKe29wdGlvbnMuZWNtYVZlcnNpb24tPTIwMDk7fQppZihvcHRpb25zLmFsbG93UmVzZXJ2ZWQ9PW51bGwpCntvcHRpb25zLmFsbG93UmVzZXJ2ZWQ9b3B0aW9ucy5lY21hVmVyc2lvbjw1O30KaWYoaXNBcnJheShvcHRpb25zLm9uVG9rZW4pKXt2YXIgdG9rZW5zPW9wdGlvbnMub25Ub2tlbjtvcHRpb25zLm9uVG9rZW49ZnVuY3Rpb24odG9rZW4pe3JldHVybiB0b2tlbnMucHVzaCh0b2tlbik7fTt9CmlmKGlzQXJyYXkob3B0aW9ucy5vbkNvbW1lbnQpKQp7b3B0aW9ucy5vbkNvbW1lbnQ9cHVzaENvbW1lbnQob3B0aW9ucyxvcHRpb25zLm9uQ29tbWVudCk7fQpyZXR1cm4gb3B0aW9uc30KZnVuY3Rpb24gcHVzaENvbW1lbnQob3B0aW9ucyxhcnJheSl7cmV0dXJuIGZ1bmN0aW9uKGJsb2NrLHRleHQsc3RhcnQsZW5kLHN0YXJ0TG9jLGVuZExvYyl7dmFyIGNvbW1lbnQ9e3R5cGU6YmxvY2s/IkJsb2NrIjoiTGluZSIsdmFsdWU6dGV4dCxzdGFydDpzdGFydCxlbmQ6ZW5kfTtpZihvcHRpb25zLmxvY2F0aW9ucykKe2NvbW1lbnQubG9jPW5ldyBTb3VyY2VMb2NhdGlvbih0aGlzLHN0YXJ0TG9jLGVuZExvYyk7fQppZihvcHRpb25zLnJhbmdlcykKe2NvbW1lbnQucmFuZ2U9W3N0YXJ0LGVuZF07fQphcnJheS5wdXNoKGNvbW1lbnQpO319CnZhciBwbHVnaW5zPXt9O2Z1bmN0aW9uIGtleXdvcmRSZWdleHAod29yZHMpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit3b3Jkcy5yZXBsYWNlKC8gL2csInwiKSsiKSQiKX0KdmFyIFBhcnNlcj1mdW5jdGlvbiBQYXJzZXIob3B0aW9ucyxpbnB1dCxzdGFydFBvcyl7dGhpcy5vcHRpb25zPW9wdGlvbnM9Z2V0T3B0aW9ucyhvcHRpb25zKTt0aGlzLnNvdXJjZUZpbGU9b3B0aW9ucy5zb3VyY2VGaWxlO3RoaXMua2V5d29yZHM9a2V5d29yZFJlZ2V4cChrZXl3b3Jkc1tvcHRpb25zLmVjbWFWZXJzaW9uPj02PzY6NV0pO3ZhciByZXNlcnZlZD0iIjtpZighb3B0aW9ucy5hbGxvd1Jlc2VydmVkKXtmb3IodmFyIHY9b3B0aW9ucy5lY21hVmVyc2lvbjs7di0tKQp7aWYocmVzZXJ2ZWQ9cmVzZXJ2ZWRXb3Jkc1t2XSl7YnJlYWt9fQppZihvcHRpb25zLnNvdXJjZVR5cGU9PSJtb2R1bGUiKXtyZXNlcnZlZCs9IiBhd2FpdCI7fX0KdGhpcy5yZXNlcnZlZFdvcmRzPWtleXdvcmRSZWdleHAocmVzZXJ2ZWQpO3ZhciByZXNlcnZlZFN0cmljdD0ocmVzZXJ2ZWQ/cmVzZXJ2ZWQrIiAiOiIiKStyZXNlcnZlZFdvcmRzLnN0cmljdDt0aGlzLnJlc2VydmVkV29yZHNTdHJpY3Q9a2V5d29yZFJlZ2V4cChyZXNlcnZlZFN0cmljdCk7dGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0QmluZD1rZXl3b3JkUmVnZXhwKHJlc2VydmVkU3RyaWN0KyIgIityZXNlcnZlZFdvcmRzLnN0cmljdEJpbmQpO3RoaXMuaW5wdXQ9U3RyaW5nKGlucHV0KTt0aGlzLmNvbnRhaW5zRXNjPWZhbHNlO3RoaXMubG9hZFBsdWdpbnMob3B0aW9ucy5wbHVnaW5zKTtpZihzdGFydFBvcyl7dGhpcy5wb3M9c3RhcnRQb3M7dGhpcy5saW5lU3RhcnQ9dGhpcy5pbnB1dC5sYXN0SW5kZXhPZigiXG4iLHN0YXJ0UG9zLTEpKzE7dGhpcy5jdXJMaW5lPXRoaXMuaW5wdXQuc2xpY2UoMCx0aGlzLmxpbmVTdGFydCkuc3BsaXQobGluZUJyZWFrKS5sZW5ndGg7fWVsc2V7dGhpcy5wb3M9dGhpcy5saW5lU3RhcnQ9MDt0aGlzLmN1ckxpbmU9MTt9CnRoaXMudHlwZT10eXBlcy5lb2Y7dGhpcy52YWx1ZT1udWxsO3RoaXMuc3RhcnQ9dGhpcy5lbmQ9dGhpcy5wb3M7dGhpcy5zdGFydExvYz10aGlzLmVuZExvYz10aGlzLmN1clBvc2l0aW9uKCk7dGhpcy5sYXN0VG9rRW5kTG9jPXRoaXMubGFzdFRva1N0YXJ0TG9jPW51bGw7dGhpcy5sYXN0VG9rU3RhcnQ9dGhpcy5sYXN0VG9rRW5kPXRoaXMucG9zO3RoaXMuY29udGV4dD10aGlzLmluaXRpYWxDb250ZXh0KCk7dGhpcy5leHByQWxsb3dlZD10cnVlO3RoaXMuaW5Nb2R1bGU9b3B0aW9ucy5zb3VyY2VUeXBlPT09Im1vZHVsZSI7dGhpcy5zdHJpY3Q9dGhpcy5pbk1vZHVsZXx8dGhpcy5zdHJpY3REaXJlY3RpdmUodGhpcy5wb3MpO3RoaXMucG90ZW50aWFsQXJyb3dBdD0tMTt0aGlzLmluRnVuY3Rpb249dGhpcy5pbkdlbmVyYXRvcj10aGlzLmluQXN5bmM9ZmFsc2U7dGhpcy55aWVsZFBvcz10aGlzLmF3YWl0UG9zPTA7dGhpcy5sYWJlbHM9W107aWYodGhpcy5wb3M9PT0wJiZvcHRpb25zLmFsbG93SGFzaEJhbmcmJnRoaXMuaW5wdXQuc2xpY2UoMCwyKT09PSIjISIpCnt0aGlzLnNraXBMaW5lQ29tbWVudCgyKTt9CnRoaXMuc2NvcGVTdGFjaz1bXTt0aGlzLmVudGVyRnVuY3Rpb25TY29wZSgpO3RoaXMucmVnZXhwU3RhdGU9bnVsbDt9O1BhcnNlci5wcm90b3R5cGUuaXNLZXl3b3JkPWZ1bmN0aW9uIGlzS2V5d29yZCh3b3JkKXtyZXR1cm4gdGhpcy5rZXl3b3Jkcy50ZXN0KHdvcmQpfTtQYXJzZXIucHJvdG90eXBlLmlzUmVzZXJ2ZWRXb3JkPWZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkKHdvcmQpe3JldHVybiB0aGlzLnJlc2VydmVkV29yZHMudGVzdCh3b3JkKX07UGFyc2VyLnByb3RvdHlwZS5leHRlbmQ9ZnVuY3Rpb24gZXh0ZW5kKG5hbWUsZil7dGhpc1tuYW1lXT1mKHRoaXNbbmFtZV0pO307UGFyc2VyLnByb3RvdHlwZS5sb2FkUGx1Z2lucz1mdW5jdGlvbiBsb2FkUGx1Z2lucyhwbHVnaW5Db25maWdzKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBuYW1lIGluIHBsdWdpbkNvbmZpZ3Mpe3ZhciBwbHVnaW49cGx1Z2luc1tuYW1lXTtpZighcGx1Z2luKXt0aHJvdyBuZXcgRXJyb3IoIlBsdWdpbiAnIituYW1lKyInIG5vdCBmb3VuZCIpfQpwbHVnaW4odGhpcyQxLHBsdWdpbkNvbmZpZ3NbbmFtZV0pO319O1BhcnNlci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24gcGFyc2UoKXt2YXIgbm9kZT10aGlzLm9wdGlvbnMucHJvZ3JhbXx8dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHRUb2tlbigpO3JldHVybiB0aGlzLnBhcnNlVG9wTGV2ZWwobm9kZSl9O3ZhciBwcD1QYXJzZXIucHJvdG90eXBlO3ZhciBsaXRlcmFsPS9eKD86JygoPzpcXC58W14nXSkqPyknfCIoKD86XFwufFteIl0pKj8pInw7KS87cHAuc3RyaWN0RGlyZWN0aXZlPWZ1bmN0aW9uKHN0YXJ0KXt2YXIgdGhpcyQxPXRoaXM7Zm9yKDs7KXtza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXg9c3RhcnQ7c3RhcnQrPXNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcyQxLmlucHV0KVswXS5sZW5ndGg7dmFyIG1hdGNoPWxpdGVyYWwuZXhlYyh0aGlzJDEuaW5wdXQuc2xpY2Uoc3RhcnQpKTtpZighbWF0Y2gpe3JldHVybiBmYWxzZX0KaWYoKG1hdGNoWzFdfHxtYXRjaFsyXSk9PSJ1c2Ugc3RyaWN0Iil7cmV0dXJuIHRydWV9CnN0YXJ0Kz1tYXRjaFswXS5sZW5ndGg7fX07cHAuZWF0PWZ1bmN0aW9uKHR5cGUpe2lmKHRoaXMudHlwZT09PXR5cGUpe3RoaXMubmV4dCgpO3JldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07cHAuaXNDb250ZXh0dWFsPWZ1bmN0aW9uKG5hbWUpe3JldHVybiB0aGlzLnR5cGU9PT10eXBlcy5uYW1lJiZ0aGlzLnZhbHVlPT09bmFtZSYmIXRoaXMuY29udGFpbnNFc2N9O3BwLmVhdENvbnRleHR1YWw9ZnVuY3Rpb24obmFtZSl7aWYoIXRoaXMuaXNDb250ZXh0dWFsKG5hbWUpKXtyZXR1cm4gZmFsc2V9CnRoaXMubmV4dCgpO3JldHVybiB0cnVlfTtwcC5leHBlY3RDb250ZXh0dWFsPWZ1bmN0aW9uKG5hbWUpe2lmKCF0aGlzLmVhdENvbnRleHR1YWwobmFtZSkpe3RoaXMudW5leHBlY3RlZCgpO319O3BwLmNhbkluc2VydFNlbWljb2xvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGU9PT10eXBlcy5lb2Z8fHRoaXMudHlwZT09PXR5cGVzLmJyYWNlUnx8bGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsdGhpcy5zdGFydCkpfTtwcC5pbnNlcnRTZW1pY29sb249ZnVuY3Rpb24oKXtpZih0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKXtpZih0aGlzLm9wdGlvbnMub25JbnNlcnRlZFNlbWljb2xvbikKe3RoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKHRoaXMubGFzdFRva0VuZCx0aGlzLmxhc3RUb2tFbmRMb2MpO30KcmV0dXJuIHRydWV9fTtwcC5zZW1pY29sb249ZnVuY3Rpb24oKXtpZighdGhpcy5lYXQodHlwZXMuc2VtaSkmJiF0aGlzLmluc2VydFNlbWljb2xvbigpKXt0aGlzLnVuZXhwZWN0ZWQoKTt9fTtwcC5hZnRlclRyYWlsaW5nQ29tbWE9ZnVuY3Rpb24odG9rVHlwZSxub3ROZXh0KXtpZih0aGlzLnR5cGU9PXRva1R5cGUpe2lmKHRoaXMub3B0aW9ucy5vblRyYWlsaW5nQ29tbWEpCnt0aGlzLm9wdGlvbnMub25UcmFpbGluZ0NvbW1hKHRoaXMubGFzdFRva1N0YXJ0LHRoaXMubGFzdFRva1N0YXJ0TG9jKTt9CmlmKCFub3ROZXh0KQp7dGhpcy5uZXh0KCk7fQpyZXR1cm4gdHJ1ZX19O3BwLmV4cGVjdD1mdW5jdGlvbih0eXBlKXt0aGlzLmVhdCh0eXBlKXx8dGhpcy51bmV4cGVjdGVkKCk7fTtwcC51bmV4cGVjdGVkPWZ1bmN0aW9uKHBvcyl7dGhpcy5yYWlzZShwb3MhPW51bGw/cG9zOnRoaXMuc3RhcnQsIlVuZXhwZWN0ZWQgdG9rZW4iKTt9O2Z1bmN0aW9uIERlc3RydWN0dXJpbmdFcnJvcnMoKXt0aGlzLnNob3J0aGFuZEFzc2lnbj10aGlzLnRyYWlsaW5nQ29tbWE9dGhpcy5wYXJlbnRoZXNpemVkQXNzaWduPXRoaXMucGFyZW50aGVzaXplZEJpbmQ9dGhpcy5kb3VibGVQcm90bz0tMTt9CnBwLmNoZWNrUGF0dGVybkVycm9ycz1mdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLGlzQXNzaWduKXtpZighcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl7cmV0dXJufQppZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWE+LTEpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hLCJDb21tYSBpcyBub3QgcGVybWl0dGVkIGFmdGVyIHRoZSByZXN0IGVsZW1lbnQiKTt9CnZhciBwYXJlbnM9aXNBc3NpZ24/cmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduOnJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQ7aWYocGFyZW5zPi0xKXt0aGlzLnJhaXNlUmVjb3ZlcmFibGUocGFyZW5zLCJQYXJlbnRoZXNpemVkIHBhdHRlcm4iKTt9fTtwcC5jaGVja0V4cHJlc3Npb25FcnJvcnM9ZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyxhbmRUaHJvdyl7aWYoIXJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe3JldHVybiBmYWxzZX0KdmFyIHNob3J0aGFuZEFzc2lnbj1yZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbjt2YXIgZG91YmxlUHJvdG89cmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90bztpZighYW5kVGhyb3cpe3JldHVybiBzaG9ydGhhbmRBc3NpZ24+PTB8fGRvdWJsZVByb3RvPj0wfQppZihzaG9ydGhhbmRBc3NpZ24+PTApCnt0aGlzLnJhaXNlKHNob3J0aGFuZEFzc2lnbiwiU2hvcnRoYW5kIHByb3BlcnR5IGFzc2lnbm1lbnRzIGFyZSB2YWxpZCBvbmx5IGluIGRlc3RydWN0dXJpbmcgcGF0dGVybnMiKTt9CmlmKGRvdWJsZVByb3RvPj0wKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKGRvdWJsZVByb3RvLCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5Iik7fX07cHAuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zPWZ1bmN0aW9uKCl7aWYodGhpcy55aWVsZFBvcyYmKCF0aGlzLmF3YWl0UG9zfHx0aGlzLnlpZWxkUG9zPHRoaXMuYXdhaXRQb3MpKQp7dGhpcy5yYWlzZSh0aGlzLnlpZWxkUG9zLCJZaWVsZCBleHByZXNzaW9uIGNhbm5vdCBiZSBhIGRlZmF1bHQgdmFsdWUiKTt9CmlmKHRoaXMuYXdhaXRQb3MpCnt0aGlzLnJhaXNlKHRoaXMuYXdhaXRQb3MsIkF3YWl0IGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZSIpO319O3BwLmlzU2ltcGxlQXNzaWduVGFyZ2V0PWZ1bmN0aW9uKGV4cHIpe2lmKGV4cHIudHlwZT09PSJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpCntyZXR1cm4gdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByLmV4cHJlc3Npb24pfQpyZXR1cm4gZXhwci50eXBlPT09IklkZW50aWZpZXIifHxleHByLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiJ9O3ZhciBwcCQxPVBhcnNlci5wcm90b3R5cGU7cHAkMS5wYXJzZVRvcExldmVsPWZ1bmN0aW9uKG5vZGUpe3ZhciB0aGlzJDE9dGhpczt2YXIgZXhwb3J0cz17fTtpZighbm9kZS5ib2R5KXtub2RlLmJvZHk9W107fQp3aGlsZSh0aGlzLnR5cGUhPT10eXBlcy5lb2Ype3ZhciBzdG10PXRoaXMkMS5wYXJzZVN0YXRlbWVudCh0cnVlLHRydWUsZXhwb3J0cyk7bm9kZS5ib2R5LnB1c2goc3RtdCk7fQp0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5KTt0aGlzLm5leHQoKTtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYpe25vZGUuc291cmNlVHlwZT10aGlzLm9wdGlvbnMuc291cmNlVHlwZTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiUHJvZ3JhbSIpfTt2YXIgbG9vcExhYmVsPXtraW5kOiJsb29wIn07dmFyIHN3aXRjaExhYmVsPXtraW5kOiJzd2l0Y2gifTtwcCQxLmlzTGV0PWZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPDZ8fCF0aGlzLmlzQ29udGV4dHVhbCgibGV0Iikpe3JldHVybiBmYWxzZX0Kc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4PXRoaXMucG9zO3ZhciBza2lwPXNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7dmFyIG5leHQ9dGhpcy5wb3Mrc2tpcFswXS5sZW5ndGgsbmV4dENoPXRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtpZihuZXh0Q2g9PT05MXx8bmV4dENoPT0xMjMpe3JldHVybiB0cnVlfQppZihpc0lkZW50aWZpZXJTdGFydChuZXh0Q2gsdHJ1ZSkpe3ZhciBwb3M9bmV4dCsxO3doaWxlKGlzSWRlbnRpZmllckNoYXIodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyksdHJ1ZSkpeysrcG9zO30KdmFyIGlkZW50PXRoaXMuaW5wdXQuc2xpY2UobmV4dCxwb3MpO2lmKCFrZXl3b3JkUmVsYXRpb25hbE9wZXJhdG9yLnRlc3QoaWRlbnQpKXtyZXR1cm4gdHJ1ZX19CnJldHVybiBmYWxzZX07cHAkMS5pc0FzeW5jRnVuY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb248OHx8IXRoaXMuaXNDb250ZXh0dWFsKCJhc3luYyIpKQp7cmV0dXJuIGZhbHNlfQpza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXg9dGhpcy5wb3M7dmFyIHNraXA9c2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KTt2YXIgbmV4dD10aGlzLnBvcytza2lwWzBdLmxlbmd0aDtyZXR1cm4hbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcyxuZXh0KSkmJnRoaXMuaW5wdXQuc2xpY2UobmV4dCxuZXh0KzgpPT09ImZ1bmN0aW9uIiYmKG5leHQrOD09dGhpcy5pbnB1dC5sZW5ndGh8fCFpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckF0KG5leHQrOCkpKX07cHAkMS5wYXJzZVN0YXRlbWVudD1mdW5jdGlvbihkZWNsYXJhdGlvbix0b3BMZXZlbCxleHBvcnRzKXt2YXIgc3RhcnR0eXBlPXRoaXMudHlwZSxub2RlPXRoaXMuc3RhcnROb2RlKCksa2luZDtpZih0aGlzLmlzTGV0KCkpe3N0YXJ0dHlwZT10eXBlcy5fdmFyO2tpbmQ9ImxldCI7fQpzd2l0Y2goc3RhcnR0eXBlKXtjYXNlIHR5cGVzLl9icmVhazpjYXNlIHR5cGVzLl9jb250aW51ZTpyZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSxzdGFydHR5cGUua2V5d29yZCkKY2FzZSB0eXBlcy5fZGVidWdnZXI6cmV0dXJuIHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudChub2RlKQpjYXNlIHR5cGVzLl9kbzpyZXR1cm4gdGhpcy5wYXJzZURvU3RhdGVtZW50KG5vZGUpCmNhc2UgdHlwZXMuX2ZvcjpyZXR1cm4gdGhpcy5wYXJzZUZvclN0YXRlbWVudChub2RlKQpjYXNlIHR5cGVzLl9mdW5jdGlvbjppZighZGVjbGFyYXRpb24mJnRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7dGhpcy51bmV4cGVjdGVkKCk7fQpyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KG5vZGUsZmFsc2UpCmNhc2UgdHlwZXMuX2NsYXNzOmlmKCFkZWNsYXJhdGlvbil7dGhpcy51bmV4cGVjdGVkKCk7fQpyZXR1cm4gdGhpcy5wYXJzZUNsYXNzKG5vZGUsdHJ1ZSkKY2FzZSB0eXBlcy5faWY6cmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlKQpjYXNlIHR5cGVzLl9yZXR1cm46cmV0dXJuIHRoaXMucGFyc2VSZXR1cm5TdGF0ZW1lbnQobm9kZSkKY2FzZSB0eXBlcy5fc3dpdGNoOnJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUpCmNhc2UgdHlwZXMuX3Rocm93OnJldHVybiB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQobm9kZSkKY2FzZSB0eXBlcy5fdHJ5OnJldHVybiB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KG5vZGUpCmNhc2UgdHlwZXMuX2NvbnN0OmNhc2UgdHlwZXMuX3ZhcjpraW5kPWtpbmR8fHRoaXMudmFsdWU7aWYoIWRlY2xhcmF0aW9uJiZraW5kIT0idmFyIil7dGhpcy51bmV4cGVjdGVkKCk7fQpyZXR1cm4gdGhpcy5wYXJzZVZhclN0YXRlbWVudChub2RlLGtpbmQpCmNhc2UgdHlwZXMuX3doaWxlOnJldHVybiB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQobm9kZSkKY2FzZSB0eXBlcy5fd2l0aDpyZXR1cm4gdGhpcy5wYXJzZVdpdGhTdGF0ZW1lbnQobm9kZSkKY2FzZSB0eXBlcy5icmFjZUw6cmV0dXJuIHRoaXMucGFyc2VCbG9jaygpCmNhc2UgdHlwZXMuc2VtaTpyZXR1cm4gdGhpcy5wYXJzZUVtcHR5U3RhdGVtZW50KG5vZGUpCmNhc2UgdHlwZXMuX2V4cG9ydDpjYXNlIHR5cGVzLl9pbXBvcnQ6aWYoIXRoaXMub3B0aW9ucy5hbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmUpe2lmKCF0b3BMZXZlbCkKe3RoaXMucmFpc2UodGhpcy5zdGFydCwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBvbmx5IGFwcGVhciBhdCB0aGUgdG9wIGxldmVsIik7fQppZighdGhpcy5pbk1vZHVsZSkKe3RoaXMucmFpc2UodGhpcy5zdGFydCwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBhcHBlYXIgb25seSB3aXRoICdzb3VyY2VUeXBlOiBtb2R1bGUnIik7fX0KcmV0dXJuIHN0YXJ0dHlwZT09PXR5cGVzLl9pbXBvcnQ/dGhpcy5wYXJzZUltcG9ydChub2RlKTp0aGlzLnBhcnNlRXhwb3J0KG5vZGUsZXhwb3J0cykKZGVmYXVsdDppZih0aGlzLmlzQXN5bmNGdW5jdGlvbigpKXtpZighZGVjbGFyYXRpb24pe3RoaXMudW5leHBlY3RlZCgpO30KdGhpcy5uZXh0KCk7cmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChub2RlLHRydWUpfQp2YXIgbWF5YmVOYW1lPXRoaXMudmFsdWUsZXhwcj10aGlzLnBhcnNlRXhwcmVzc2lvbigpO2lmKHN0YXJ0dHlwZT09PXR5cGVzLm5hbWUmJmV4cHIudHlwZT09PSJJZGVudGlmaWVyIiYmdGhpcy5lYXQodHlwZXMuY29sb24pKQp7cmV0dXJuIHRoaXMucGFyc2VMYWJlbGVkU3RhdGVtZW50KG5vZGUsbWF5YmVOYW1lLGV4cHIpfQplbHNle3JldHVybiB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLGV4cHIpfX19O3BwJDEucGFyc2VCcmVha0NvbnRpbnVlU3RhdGVtZW50PWZ1bmN0aW9uKG5vZGUsa2V5d29yZCl7dmFyIHRoaXMkMT10aGlzO3ZhciBpc0JyZWFrPWtleXdvcmQ9PSJicmVhayI7dGhpcy5uZXh0KCk7aWYodGhpcy5lYXQodHlwZXMuc2VtaSl8fHRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpe25vZGUubGFiZWw9bnVsbDt9CmVsc2UgaWYodGhpcy50eXBlIT09dHlwZXMubmFtZSl7dGhpcy51bmV4cGVjdGVkKCk7fQplbHNle25vZGUubGFiZWw9dGhpcy5wYXJzZUlkZW50KCk7dGhpcy5zZW1pY29sb24oKTt9CnZhciBpPTA7Zm9yKDtpPHRoaXMubGFiZWxzLmxlbmd0aDsrK2kpe3ZhciBsYWI9dGhpcyQxLmxhYmVsc1tpXTtpZihub2RlLmxhYmVsPT1udWxsfHxsYWIubmFtZT09PW5vZGUubGFiZWwubmFtZSl7aWYobGFiLmtpbmQhPW51bGwmJihpc0JyZWFrfHxsYWIua2luZD09PSJsb29wIikpe2JyZWFrfQppZihub2RlLmxhYmVsJiZpc0JyZWFrKXticmVha319fQppZihpPT09dGhpcy5sYWJlbHMubGVuZ3RoKXt0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIlVuc3ludGFjdGljICIra2V5d29yZCk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsaXNCcmVhaz8iQnJlYWtTdGF0ZW1lbnQiOiJDb250aW51ZVN0YXRlbWVudCIpfTtwcCQxLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQ9ZnVuY3Rpb24obm9kZSl7dGhpcy5uZXh0KCk7dGhpcy5zZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkRlYnVnZ2VyU3RhdGVtZW50Iil9O3BwJDEucGFyc2VEb1N0YXRlbWVudD1mdW5jdGlvbihub2RlKXt0aGlzLm5leHQoKTt0aGlzLmxhYmVscy5wdXNoKGxvb3BMYWJlbCk7bm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoZmFsc2UpO3RoaXMubGFiZWxzLnBvcCgpO3RoaXMuZXhwZWN0KHR5cGVzLl93aGlsZSk7bm9kZS50ZXN0PXRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYpCnt0aGlzLmVhdCh0eXBlcy5zZW1pKTt9CmVsc2UKe3RoaXMuc2VtaWNvbG9uKCk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkRvV2hpbGVTdGF0ZW1lbnQiKX07cHAkMS5wYXJzZUZvclN0YXRlbWVudD1mdW5jdGlvbihub2RlKXt0aGlzLm5leHQoKTt2YXIgYXdhaXRBdD0odGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZ0aGlzLmluQXN5bmMmJnRoaXMuZWF0Q29udGV4dHVhbCgiYXdhaXQiKSk/dGhpcy5sYXN0VG9rU3RhcnQ6LTE7dGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO3RoaXMuZW50ZXJMZXhpY2FsU2NvcGUoKTt0aGlzLmV4cGVjdCh0eXBlcy5wYXJlbkwpO2lmKHRoaXMudHlwZT09PXR5cGVzLnNlbWkpe2lmKGF3YWl0QXQ+LTEpe3RoaXMudW5leHBlY3RlZChhd2FpdEF0KTt9CnJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsbnVsbCl9CnZhciBpc0xldD10aGlzLmlzTGV0KCk7aWYodGhpcy50eXBlPT09dHlwZXMuX3Zhcnx8dGhpcy50eXBlPT09dHlwZXMuX2NvbnN0fHxpc0xldCl7dmFyIGluaXQkMT10aGlzLnN0YXJ0Tm9kZSgpLGtpbmQ9aXNMZXQ/ImxldCI6dGhpcy52YWx1ZTt0aGlzLm5leHQoKTt0aGlzLnBhcnNlVmFyKGluaXQkMSx0cnVlLGtpbmQpO3RoaXMuZmluaXNoTm9kZShpbml0JDEsIlZhcmlhYmxlRGVjbGFyYXRpb24iKTtpZigodGhpcy50eXBlPT09dHlwZXMuX2lufHwodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02JiZ0aGlzLmlzQ29udGV4dHVhbCgib2YiKSkpJiZpbml0JDEuZGVjbGFyYXRpb25zLmxlbmd0aD09PTEmJiEoa2luZCE9PSJ2YXIiJiZpbml0JDEuZGVjbGFyYXRpb25zWzBdLmluaXQpKXtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTkpe2lmKHRoaXMudHlwZT09PXR5cGVzLl9pbil7aWYoYXdhaXRBdD4tMSl7dGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpO319ZWxzZXtub2RlLmF3YWl0PWF3YWl0QXQ+LTE7fX0KcmV0dXJuIHRoaXMucGFyc2VGb3JJbihub2RlLGluaXQkMSl9CmlmKGF3YWl0QXQ+LTEpe3RoaXMudW5leHBlY3RlZChhd2FpdEF0KTt9CnJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsaW5pdCQxKX0KdmFyIHJlZkRlc3RydWN0dXJpbmdFcnJvcnM9bmV3IERlc3RydWN0dXJpbmdFcnJvcnM7dmFyIGluaXQ9dGhpcy5wYXJzZUV4cHJlc3Npb24odHJ1ZSxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtpZih0aGlzLnR5cGU9PT10eXBlcy5faW58fCh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJnRoaXMuaXNDb250ZXh0dWFsKCJvZiIpKSl7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05KXtpZih0aGlzLnR5cGU9PT10eXBlcy5faW4pe2lmKGF3YWl0QXQ+LTEpe3RoaXMudW5leHBlY3RlZChhd2FpdEF0KTt9fWVsc2V7bm9kZS5hd2FpdD1hd2FpdEF0Pi0xO319CnRoaXMudG9Bc3NpZ25hYmxlKGluaXQsZmFsc2UscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7dGhpcy5jaGVja0xWYWwoaW5pdCk7cmV0dXJuIHRoaXMucGFyc2VGb3JJbihub2RlLGluaXQpfWVsc2V7dGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyx0cnVlKTt9CmlmKGF3YWl0QXQ+LTEpe3RoaXMudW5leHBlY3RlZChhd2FpdEF0KTt9CnJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsaW5pdCl9O3BwJDEucGFyc2VGdW5jdGlvblN0YXRlbWVudD1mdW5jdGlvbihub2RlLGlzQXN5bmMpe3RoaXMubmV4dCgpO3JldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSx0cnVlLGZhbHNlLGlzQXN5bmMpfTtwcCQxLnBhcnNlSWZTdGF0ZW1lbnQ9ZnVuY3Rpb24obm9kZSl7dGhpcy5uZXh0KCk7bm9kZS50ZXN0PXRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtub2RlLmNvbnNlcXVlbnQ9dGhpcy5wYXJzZVN0YXRlbWVudCghdGhpcy5zdHJpY3QmJnRoaXMudHlwZT09dHlwZXMuX2Z1bmN0aW9uKTtub2RlLmFsdGVybmF0ZT10aGlzLmVhdCh0eXBlcy5fZWxzZSk/dGhpcy5wYXJzZVN0YXRlbWVudCghdGhpcy5zdHJpY3QmJnRoaXMudHlwZT09dHlwZXMuX2Z1bmN0aW9uKTpudWxsO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiSWZTdGF0ZW1lbnQiKX07cHAkMS5wYXJzZVJldHVyblN0YXRlbWVudD1mdW5jdGlvbihub2RlKXtpZighdGhpcy5pbkZ1bmN0aW9uJiYhdGhpcy5vcHRpb25zLmFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uKQp7dGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCIncmV0dXJuJyBvdXRzaWRlIG9mIGZ1bmN0aW9uIik7fQp0aGlzLm5leHQoKTtpZih0aGlzLmVhdCh0eXBlcy5zZW1pKXx8dGhpcy5pbnNlcnRTZW1pY29sb24oKSl7bm9kZS5hcmd1bWVudD1udWxsO30KZWxzZXtub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7dGhpcy5zZW1pY29sb24oKTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiUmV0dXJuU3RhdGVtZW50Iil9O3BwJDEucGFyc2VTd2l0Y2hTdGF0ZW1lbnQ9ZnVuY3Rpb24obm9kZSl7dmFyIHRoaXMkMT10aGlzO3RoaXMubmV4dCgpO25vZGUuZGlzY3JpbWluYW50PXRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtub2RlLmNhc2VzPVtdO3RoaXMuZXhwZWN0KHR5cGVzLmJyYWNlTCk7dGhpcy5sYWJlbHMucHVzaChzd2l0Y2hMYWJlbCk7dGhpcy5lbnRlckxleGljYWxTY29wZSgpO3ZhciBjdXI7Zm9yKHZhciBzYXdEZWZhdWx0PWZhbHNlO3RoaXMudHlwZSE9dHlwZXMuYnJhY2VSOyl7aWYodGhpcyQxLnR5cGU9PT10eXBlcy5fY2FzZXx8dGhpcyQxLnR5cGU9PT10eXBlcy5fZGVmYXVsdCl7dmFyIGlzQ2FzZT10aGlzJDEudHlwZT09PXR5cGVzLl9jYXNlO2lmKGN1cil7dGhpcyQxLmZpbmlzaE5vZGUoY3VyLCJTd2l0Y2hDYXNlIik7fQpub2RlLmNhc2VzLnB1c2goY3VyPXRoaXMkMS5zdGFydE5vZGUoKSk7Y3VyLmNvbnNlcXVlbnQ9W107dGhpcyQxLm5leHQoKTtpZihpc0Nhc2Upe2N1ci50ZXN0PXRoaXMkMS5wYXJzZUV4cHJlc3Npb24oKTt9ZWxzZXtpZihzYXdEZWZhdWx0KXt0aGlzJDEucmFpc2VSZWNvdmVyYWJsZSh0aGlzJDEubGFzdFRva1N0YXJ0LCJNdWx0aXBsZSBkZWZhdWx0IGNsYXVzZXMiKTt9CnNhd0RlZmF1bHQ9dHJ1ZTtjdXIudGVzdD1udWxsO30KdGhpcyQxLmV4cGVjdCh0eXBlcy5jb2xvbik7fWVsc2V7aWYoIWN1cil7dGhpcyQxLnVuZXhwZWN0ZWQoKTt9CmN1ci5jb25zZXF1ZW50LnB1c2godGhpcyQxLnBhcnNlU3RhdGVtZW50KHRydWUpKTt9fQp0aGlzLmV4aXRMZXhpY2FsU2NvcGUoKTtpZihjdXIpe3RoaXMuZmluaXNoTm9kZShjdXIsIlN3aXRjaENhc2UiKTt9CnRoaXMubmV4dCgpO3RoaXMubGFiZWxzLnBvcCgpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiU3dpdGNoU3RhdGVtZW50Iil9O3BwJDEucGFyc2VUaHJvd1N0YXRlbWVudD1mdW5jdGlvbihub2RlKXt0aGlzLm5leHQoKTtpZihsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCx0aGlzLnN0YXJ0KSkpCnt0aGlzLnJhaXNlKHRoaXMubGFzdFRva0VuZCwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93Iik7fQpub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7dGhpcy5zZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIlRocm93U3RhdGVtZW50Iil9O3ZhciBlbXB0eT1bXTtwcCQxLnBhcnNlVHJ5U3RhdGVtZW50PWZ1bmN0aW9uKG5vZGUpe3RoaXMubmV4dCgpO25vZGUuYmxvY2s9dGhpcy5wYXJzZUJsb2NrKCk7bm9kZS5oYW5kbGVyPW51bGw7aWYodGhpcy50eXBlPT09dHlwZXMuX2NhdGNoKXt2YXIgY2xhdXNlPXRoaXMuc3RhcnROb2RlKCk7dGhpcy5uZXh0KCk7dGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTtjbGF1c2UucGFyYW09dGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7dGhpcy5lbnRlckxleGljYWxTY29wZSgpO3RoaXMuY2hlY2tMVmFsKGNsYXVzZS5wYXJhbSwibGV0Iik7dGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtjbGF1c2UuYm9keT10aGlzLnBhcnNlQmxvY2soZmFsc2UpO3RoaXMuZXhpdExleGljYWxTY29wZSgpO25vZGUuaGFuZGxlcj10aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCJDYXRjaENsYXVzZSIpO30Kbm9kZS5maW5hbGl6ZXI9dGhpcy5lYXQodHlwZXMuX2ZpbmFsbHkpP3RoaXMucGFyc2VCbG9jaygpOm51bGw7aWYoIW5vZGUuaGFuZGxlciYmIW5vZGUuZmluYWxpemVyKQp7dGhpcy5yYWlzZShub2RlLnN0YXJ0LCJNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlIik7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIlRyeVN0YXRlbWVudCIpfTtwcCQxLnBhcnNlVmFyU3RhdGVtZW50PWZ1bmN0aW9uKG5vZGUsa2luZCl7dGhpcy5uZXh0KCk7dGhpcy5wYXJzZVZhcihub2RlLGZhbHNlLGtpbmQpO3RoaXMuc2VtaWNvbG9uKCk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJWYXJpYWJsZURlY2xhcmF0aW9uIil9O3BwJDEucGFyc2VXaGlsZVN0YXRlbWVudD1mdW5jdGlvbihub2RlKXt0aGlzLm5leHQoKTtub2RlLnRlc3Q9dGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO3RoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtub2RlLmJvZHk9dGhpcy5wYXJzZVN0YXRlbWVudChmYWxzZSk7dGhpcy5sYWJlbHMucG9wKCk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJXaGlsZVN0YXRlbWVudCIpfTtwcCQxLnBhcnNlV2l0aFN0YXRlbWVudD1mdW5jdGlvbihub2RlKXtpZih0aGlzLnN0cmljdCl7dGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCInd2l0aCcgaW4gc3RyaWN0IG1vZGUiKTt9CnRoaXMubmV4dCgpO25vZGUub2JqZWN0PXRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtub2RlLmJvZHk9dGhpcy5wYXJzZVN0YXRlbWVudChmYWxzZSk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJXaXRoU3RhdGVtZW50Iil9O3BwJDEucGFyc2VFbXB0eVN0YXRlbWVudD1mdW5jdGlvbihub2RlKXt0aGlzLm5leHQoKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkVtcHR5U3RhdGVtZW50Iil9O3BwJDEucGFyc2VMYWJlbGVkU3RhdGVtZW50PWZ1bmN0aW9uKG5vZGUsbWF5YmVOYW1lLGV4cHIpe3ZhciB0aGlzJDE9dGhpcztmb3IodmFyIGkkMT0wLGxpc3Q9dGhpcyQxLmxhYmVscztpJDE8bGlzdC5sZW5ndGg7aSQxKz0xKQp7dmFyIGxhYmVsPWxpc3RbaSQxXTtpZihsYWJlbC5uYW1lPT09bWF5YmVOYW1lKQp7dGhpcyQxLnJhaXNlKGV4cHIuc3RhcnQsIkxhYmVsICciK21heWJlTmFtZSsiJyBpcyBhbHJlYWR5IGRlY2xhcmVkIik7fX0KdmFyIGtpbmQ9dGhpcy50eXBlLmlzTG9vcD8ibG9vcCI6dGhpcy50eXBlPT09dHlwZXMuX3N3aXRjaD8ic3dpdGNoIjpudWxsO2Zvcih2YXIgaT10aGlzLmxhYmVscy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhYmVsJDE9dGhpcyQxLmxhYmVsc1tpXTtpZihsYWJlbCQxLnN0YXRlbWVudFN0YXJ0PT1ub2RlLnN0YXJ0KXtsYWJlbCQxLnN0YXRlbWVudFN0YXJ0PXRoaXMkMS5zdGFydDtsYWJlbCQxLmtpbmQ9a2luZDt9ZWxzZXticmVha319CnRoaXMubGFiZWxzLnB1c2goe25hbWU6bWF5YmVOYW1lLGtpbmQ6a2luZCxzdGF0ZW1lbnRTdGFydDp0aGlzLnN0YXJ0fSk7bm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQodHJ1ZSk7aWYobm9kZS5ib2R5LnR5cGU9PSJDbGFzc0RlY2xhcmF0aW9uInx8bm9kZS5ib2R5LnR5cGU9PSJWYXJpYWJsZURlY2xhcmF0aW9uIiYmbm9kZS5ib2R5LmtpbmQhPSJ2YXIifHxub2RlLmJvZHkudHlwZT09IkZ1bmN0aW9uRGVjbGFyYXRpb24iJiYodGhpcy5zdHJpY3R8fG5vZGUuYm9keS5nZW5lcmF0b3IpKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuYm9keS5zdGFydCwiSW52YWxpZCBsYWJlbGVkIGRlY2xhcmF0aW9uIik7fQp0aGlzLmxhYmVscy5wb3AoKTtub2RlLmxhYmVsPWV4cHI7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJMYWJlbGVkU3RhdGVtZW50Iil9O3BwJDEucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50PWZ1bmN0aW9uKG5vZGUsZXhwcil7bm9kZS5leHByZXNzaW9uPWV4cHI7dGhpcy5zZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cHJlc3Npb25TdGF0ZW1lbnQiKX07cHAkMS5wYXJzZUJsb2NrPWZ1bmN0aW9uKGNyZWF0ZU5ld0xleGljYWxTY29wZSl7dmFyIHRoaXMkMT10aGlzO2lmKGNyZWF0ZU5ld0xleGljYWxTY29wZT09PXZvaWQgMCljcmVhdGVOZXdMZXhpY2FsU2NvcGU9dHJ1ZTt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpO25vZGUuYm9keT1bXTt0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO2lmKGNyZWF0ZU5ld0xleGljYWxTY29wZSl7dGhpcy5lbnRlckxleGljYWxTY29wZSgpO30Kd2hpbGUoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpe3ZhciBzdG10PXRoaXMkMS5wYXJzZVN0YXRlbWVudCh0cnVlKTtub2RlLmJvZHkucHVzaChzdG10KTt9CmlmKGNyZWF0ZU5ld0xleGljYWxTY29wZSl7dGhpcy5leGl0TGV4aWNhbFNjb3BlKCk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkJsb2NrU3RhdGVtZW50Iil9O3BwJDEucGFyc2VGb3I9ZnVuY3Rpb24obm9kZSxpbml0KXtub2RlLmluaXQ9aW5pdDt0aGlzLmV4cGVjdCh0eXBlcy5zZW1pKTtub2RlLnRlc3Q9dGhpcy50eXBlPT09dHlwZXMuc2VtaT9udWxsOnRoaXMucGFyc2VFeHByZXNzaW9uKCk7dGhpcy5leHBlY3QodHlwZXMuc2VtaSk7bm9kZS51cGRhdGU9dGhpcy50eXBlPT09dHlwZXMucGFyZW5SP251bGw6dGhpcy5wYXJzZUV4cHJlc3Npb24oKTt0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO3RoaXMuZXhpdExleGljYWxTY29wZSgpO25vZGUuYm9keT10aGlzLnBhcnNlU3RhdGVtZW50KGZhbHNlKTt0aGlzLmxhYmVscy5wb3AoKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkZvclN0YXRlbWVudCIpfTtwcCQxLnBhcnNlRm9ySW49ZnVuY3Rpb24obm9kZSxpbml0KXt2YXIgdHlwZT10aGlzLnR5cGU9PT10eXBlcy5faW4/IkZvckluU3RhdGVtZW50IjoiRm9yT2ZTdGF0ZW1lbnQiO3RoaXMubmV4dCgpO2lmKHR5cGU9PSJGb3JJblN0YXRlbWVudCIpe2lmKGluaXQudHlwZT09PSJBc3NpZ25tZW50UGF0dGVybiJ8fChpbml0LnR5cGU9PT0iVmFyaWFibGVEZWNsYXJhdGlvbiImJmluaXQuZGVjbGFyYXRpb25zWzBdLmluaXQhPW51bGwmJih0aGlzLnN0cmljdHx8aW5pdC5kZWNsYXJhdGlvbnNbMF0uaWQudHlwZSE9PSJJZGVudGlmaWVyIikpKQp7dGhpcy5yYWlzZShpbml0LnN0YXJ0LCJJbnZhbGlkIGFzc2lnbm1lbnQgaW4gZm9yLWluIGxvb3AgaGVhZCIpO319Cm5vZGUubGVmdD1pbml0O25vZGUucmlnaHQ9dHlwZT09IkZvckluU3RhdGVtZW50Ij90aGlzLnBhcnNlRXhwcmVzc2lvbigpOnRoaXMucGFyc2VNYXliZUFzc2lnbigpO3RoaXMuZXhwZWN0KHR5cGVzLnBhcmVuUik7dGhpcy5leGl0TGV4aWNhbFNjb3BlKCk7bm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoZmFsc2UpO3RoaXMubGFiZWxzLnBvcCgpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSx0eXBlKX07cHAkMS5wYXJzZVZhcj1mdW5jdGlvbihub2RlLGlzRm9yLGtpbmQpe3ZhciB0aGlzJDE9dGhpcztub2RlLmRlY2xhcmF0aW9ucz1bXTtub2RlLmtpbmQ9a2luZDtmb3IoOzspe3ZhciBkZWNsPXRoaXMkMS5zdGFydE5vZGUoKTt0aGlzJDEucGFyc2VWYXJJZChkZWNsLGtpbmQpO2lmKHRoaXMkMS5lYXQodHlwZXMuZXEpKXtkZWNsLmluaXQ9dGhpcyQxLnBhcnNlTWF5YmVBc3NpZ24oaXNGb3IpO31lbHNlIGlmKGtpbmQ9PT0iY29uc3QiJiYhKHRoaXMkMS50eXBlPT09dHlwZXMuX2lufHwodGhpcyQxLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJnRoaXMkMS5pc0NvbnRleHR1YWwoIm9mIikpKSl7dGhpcyQxLnVuZXhwZWN0ZWQoKTt9ZWxzZSBpZihkZWNsLmlkLnR5cGUhPSJJZGVudGlmaWVyIiYmIShpc0ZvciYmKHRoaXMkMS50eXBlPT09dHlwZXMuX2lufHx0aGlzJDEuaXNDb250ZXh0dWFsKCJvZiIpKSkpe3RoaXMkMS5yYWlzZSh0aGlzJDEubGFzdFRva0VuZCwiQ29tcGxleCBiaW5kaW5nIHBhdHRlcm5zIHJlcXVpcmUgYW4gaW5pdGlhbGl6YXRpb24gdmFsdWUiKTt9ZWxzZXtkZWNsLmluaXQ9bnVsbDt9Cm5vZGUuZGVjbGFyYXRpb25zLnB1c2godGhpcyQxLmZpbmlzaE5vZGUoZGVjbCwiVmFyaWFibGVEZWNsYXJhdG9yIikpO2lmKCF0aGlzJDEuZWF0KHR5cGVzLmNvbW1hKSl7YnJlYWt9fQpyZXR1cm4gbm9kZX07cHAkMS5wYXJzZVZhcklkPWZ1bmN0aW9uKGRlY2wsa2luZCl7ZGVjbC5pZD10aGlzLnBhcnNlQmluZGluZ0F0b20oa2luZCk7dGhpcy5jaGVja0xWYWwoZGVjbC5pZCxraW5kLGZhbHNlKTt9O3BwJDEucGFyc2VGdW5jdGlvbj1mdW5jdGlvbihub2RlLGlzU3RhdGVtZW50LGFsbG93RXhwcmVzc2lvbkJvZHksaXNBc3luYyl7dGhpcy5pbml0RnVuY3Rpb24obm9kZSk7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05fHx0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJiFpc0FzeW5jKQp7bm9kZS5nZW5lcmF0b3I9dGhpcy5lYXQodHlwZXMuc3Rhcik7fQppZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgpCntub2RlLmFzeW5jPSEhaXNBc3luYzt9CmlmKGlzU3RhdGVtZW50KXtub2RlLmlkPWlzU3RhdGVtZW50PT09Im51bGxhYmxlSUQiJiZ0aGlzLnR5cGUhPXR5cGVzLm5hbWU/bnVsbDp0aGlzLnBhcnNlSWRlbnQoKTtpZihub2RlLmlkKXt0aGlzLmNoZWNrTFZhbChub2RlLmlkLCJ2YXIiKTt9fQp2YXIgb2xkSW5HZW49dGhpcy5pbkdlbmVyYXRvcixvbGRJbkFzeW5jPXRoaXMuaW5Bc3luYyxvbGRZaWVsZFBvcz10aGlzLnlpZWxkUG9zLG9sZEF3YWl0UG9zPXRoaXMuYXdhaXRQb3Msb2xkSW5GdW5jPXRoaXMuaW5GdW5jdGlvbjt0aGlzLmluR2VuZXJhdG9yPW5vZGUuZ2VuZXJhdG9yO3RoaXMuaW5Bc3luYz1ub2RlLmFzeW5jO3RoaXMueWllbGRQb3M9MDt0aGlzLmF3YWl0UG9zPTA7dGhpcy5pbkZ1bmN0aW9uPXRydWU7dGhpcy5lbnRlckZ1bmN0aW9uU2NvcGUoKTtpZighaXNTdGF0ZW1lbnQpCntub2RlLmlkPXRoaXMudHlwZT09dHlwZXMubmFtZT90aGlzLnBhcnNlSWRlbnQoKTpudWxsO30KdGhpcy5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO3RoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSxhbGxvd0V4cHJlc3Npb25Cb2R5KTt0aGlzLmluR2VuZXJhdG9yPW9sZEluR2VuO3RoaXMuaW5Bc3luYz1vbGRJbkFzeW5jO3RoaXMueWllbGRQb3M9b2xkWWllbGRQb3M7dGhpcy5hd2FpdFBvcz1vbGRBd2FpdFBvczt0aGlzLmluRnVuY3Rpb249b2xkSW5GdW5jO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSxpc1N0YXRlbWVudD8iRnVuY3Rpb25EZWNsYXJhdGlvbiI6IkZ1bmN0aW9uRXhwcmVzc2lvbiIpfTtwcCQxLnBhcnNlRnVuY3Rpb25QYXJhbXM9ZnVuY3Rpb24obm9kZSl7dGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTtub2RlLnBhcmFtcz10aGlzLnBhcnNlQmluZGluZ0xpc3QodHlwZXMucGFyZW5SLGZhbHNlLHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCk7dGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTt9O3BwJDEucGFyc2VDbGFzcz1mdW5jdGlvbihub2RlLGlzU3RhdGVtZW50KXt2YXIgdGhpcyQxPXRoaXM7dGhpcy5uZXh0KCk7dGhpcy5wYXJzZUNsYXNzSWQobm9kZSxpc1N0YXRlbWVudCk7dGhpcy5wYXJzZUNsYXNzU3VwZXIobm9kZSk7dmFyIGNsYXNzQm9keT10aGlzLnN0YXJ0Tm9kZSgpO3ZhciBoYWRDb25zdHJ1Y3Rvcj1mYWxzZTtjbGFzc0JvZHkuYm9keT1bXTt0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO3doaWxlKCF0aGlzLmVhdCh0eXBlcy5icmFjZVIpKXt2YXIgbWVtYmVyPXRoaXMkMS5wYXJzZUNsYXNzTWVtYmVyKGNsYXNzQm9keSk7aWYobWVtYmVyJiZtZW1iZXIudHlwZT09PSJNZXRob2REZWZpbml0aW9uIiYmbWVtYmVyLmtpbmQ9PT0iY29uc3RydWN0b3IiKXtpZihoYWRDb25zdHJ1Y3Rvcil7dGhpcyQxLnJhaXNlKG1lbWJlci5zdGFydCwiRHVwbGljYXRlIGNvbnN0cnVjdG9yIGluIHRoZSBzYW1lIGNsYXNzIik7fQpoYWRDb25zdHJ1Y3Rvcj10cnVlO319Cm5vZGUuYm9keT10aGlzLmZpbmlzaE5vZGUoY2xhc3NCb2R5LCJDbGFzc0JvZHkiKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsaXNTdGF0ZW1lbnQ/IkNsYXNzRGVjbGFyYXRpb24iOiJDbGFzc0V4cHJlc3Npb24iKX07cHAkMS5wYXJzZUNsYXNzTWVtYmVyPWZ1bmN0aW9uKGNsYXNzQm9keSl7dmFyIHRoaXMkMT10aGlzO2lmKHRoaXMuZWF0KHR5cGVzLnNlbWkpKXtyZXR1cm4gbnVsbH0KdmFyIG1ldGhvZD10aGlzLnN0YXJ0Tm9kZSgpO3ZhciB0cnlDb250ZXh0dWFsPWZ1bmN0aW9uKGssbm9MaW5lQnJlYWspe2lmKG5vTGluZUJyZWFrPT09dm9pZCAwKW5vTGluZUJyZWFrPWZhbHNlO3ZhciBzdGFydD10aGlzJDEuc3RhcnQsc3RhcnRMb2M9dGhpcyQxLnN0YXJ0TG9jO2lmKCF0aGlzJDEuZWF0Q29udGV4dHVhbChrKSl7cmV0dXJuIGZhbHNlfQppZih0aGlzJDEudHlwZSE9PXR5cGVzLnBhcmVuTCYmKCFub0xpbmVCcmVha3x8IXRoaXMkMS5jYW5JbnNlcnRTZW1pY29sb24oKSkpe3JldHVybiB0cnVlfQppZihtZXRob2Qua2V5KXt0aGlzJDEudW5leHBlY3RlZCgpO30KbWV0aG9kLmNvbXB1dGVkPWZhbHNlO21ldGhvZC5rZXk9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0LHN0YXJ0TG9jKTttZXRob2Qua2V5Lm5hbWU9azt0aGlzJDEuZmluaXNoTm9kZShtZXRob2Qua2V5LCJJZGVudGlmaWVyIik7cmV0dXJuIGZhbHNlfTttZXRob2Qua2luZD0ibWV0aG9kIjttZXRob2Quc3RhdGljPXRyeUNvbnRleHR1YWwoInN0YXRpYyIpO3ZhciBpc0dlbmVyYXRvcj10aGlzLmVhdCh0eXBlcy5zdGFyKTt2YXIgaXNBc3luYz1mYWxzZTtpZighaXNHZW5lcmF0b3Ipe2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCYmdHJ5Q29udGV4dHVhbCgiYXN5bmMiLHRydWUpKXtpc0FzeW5jPXRydWU7aXNHZW5lcmF0b3I9dGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZ0aGlzLmVhdCh0eXBlcy5zdGFyKTt9ZWxzZSBpZih0cnlDb250ZXh0dWFsKCJnZXQiKSl7bWV0aG9kLmtpbmQ9ImdldCI7fWVsc2UgaWYodHJ5Q29udGV4dHVhbCgic2V0Iikpe21ldGhvZC5raW5kPSJzZXQiO319CmlmKCFtZXRob2Qua2V5KXt0aGlzLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCk7fQp2YXIga2V5PW1ldGhvZC5rZXk7aWYoIW1ldGhvZC5jb21wdXRlZCYmIW1ldGhvZC5zdGF0aWMmJihrZXkudHlwZT09PSJJZGVudGlmaWVyIiYma2V5Lm5hbWU9PT0iY29uc3RydWN0b3IifHxrZXkudHlwZT09PSJMaXRlcmFsIiYma2V5LnZhbHVlPT09ImNvbnN0cnVjdG9yIikpe2lmKG1ldGhvZC5raW5kIT09Im1ldGhvZCIpe3RoaXMucmFpc2Uoa2V5LnN0YXJ0LCJDb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGdldC9zZXQgbW9kaWZpZXIiKTt9CmlmKGlzR2VuZXJhdG9yKXt0aGlzLnJhaXNlKGtleS5zdGFydCwiQ29uc3RydWN0b3IgY2FuJ3QgYmUgYSBnZW5lcmF0b3IiKTt9CmlmKGlzQXN5bmMpe3RoaXMucmFpc2Uoa2V5LnN0YXJ0LCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBtZXRob2QiKTt9Cm1ldGhvZC5raW5kPSJjb25zdHJ1Y3RvciI7fWVsc2UgaWYobWV0aG9kLnN0YXRpYyYma2V5LnR5cGU9PT0iSWRlbnRpZmllciImJmtleS5uYW1lPT09InByb3RvdHlwZSIpe3RoaXMucmFpc2Uoa2V5LnN0YXJ0LCJDbGFzc2VzIG1heSBub3QgaGF2ZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBwcm90b3R5cGUiKTt9CnRoaXMucGFyc2VDbGFzc01ldGhvZChjbGFzc0JvZHksbWV0aG9kLGlzR2VuZXJhdG9yLGlzQXN5bmMpO2lmKG1ldGhvZC5raW5kPT09ImdldCImJm1ldGhvZC52YWx1ZS5wYXJhbXMubGVuZ3RoIT09MCkKe3RoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUuc3RhcnQsImdldHRlciBzaG91bGQgaGF2ZSBubyBwYXJhbXMiKTt9CmlmKG1ldGhvZC5raW5kPT09InNldCImJm1ldGhvZC52YWx1ZS5wYXJhbXMubGVuZ3RoIT09MSkKe3RoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUuc3RhcnQsInNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbSIpO30KaWYobWV0aG9kLmtpbmQ9PT0ic2V0IiYmbWV0aG9kLnZhbHVlLnBhcmFtc1swXS50eXBlPT09IlJlc3RFbGVtZW50IikKe3RoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUucGFyYW1zWzBdLnN0YXJ0LCJTZXR0ZXIgY2Fubm90IHVzZSByZXN0IHBhcmFtcyIpO30KcmV0dXJuIG1ldGhvZH07cHAkMS5wYXJzZUNsYXNzTWV0aG9kPWZ1bmN0aW9uKGNsYXNzQm9keSxtZXRob2QsaXNHZW5lcmF0b3IsaXNBc3luYyl7bWV0aG9kLnZhbHVlPXRoaXMucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsaXNBc3luYyk7Y2xhc3NCb2R5LmJvZHkucHVzaCh0aGlzLmZpbmlzaE5vZGUobWV0aG9kLCJNZXRob2REZWZpbml0aW9uIikpO307cHAkMS5wYXJzZUNsYXNzSWQ9ZnVuY3Rpb24obm9kZSxpc1N0YXRlbWVudCl7bm9kZS5pZD10aGlzLnR5cGU9PT10eXBlcy5uYW1lP3RoaXMucGFyc2VJZGVudCgpOmlzU3RhdGVtZW50PT09dHJ1ZT90aGlzLnVuZXhwZWN0ZWQoKTpudWxsO307cHAkMS5wYXJzZUNsYXNzU3VwZXI9ZnVuY3Rpb24obm9kZSl7bm9kZS5zdXBlckNsYXNzPXRoaXMuZWF0KHR5cGVzLl9leHRlbmRzKT90aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKTpudWxsO307cHAkMS5wYXJzZUV4cG9ydD1mdW5jdGlvbihub2RlLGV4cG9ydHMpe3ZhciB0aGlzJDE9dGhpczt0aGlzLm5leHQoKTtpZih0aGlzLmVhdCh0eXBlcy5zdGFyKSl7dGhpcy5leHBlY3RDb250ZXh0dWFsKCJmcm9tIik7aWYodGhpcy50eXBlIT09dHlwZXMuc3RyaW5nKXt0aGlzLnVuZXhwZWN0ZWQoKTt9Cm5vZGUuc291cmNlPXRoaXMucGFyc2VFeHByQXRvbSgpO3RoaXMuc2VtaWNvbG9uKCk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIpfQppZih0aGlzLmVhdCh0eXBlcy5fZGVmYXVsdCkpe3RoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywiZGVmYXVsdCIsdGhpcy5sYXN0VG9rU3RhcnQpO3ZhciBpc0FzeW5jO2lmKHRoaXMudHlwZT09PXR5cGVzLl9mdW5jdGlvbnx8KGlzQXN5bmM9dGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkpe3ZhciBmTm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO2lmKGlzQXN5bmMpe3RoaXMubmV4dCgpO30Kbm9kZS5kZWNsYXJhdGlvbj10aGlzLnBhcnNlRnVuY3Rpb24oZk5vZGUsIm51bGxhYmxlSUQiLGZhbHNlLGlzQXN5bmMpO31lbHNlIGlmKHRoaXMudHlwZT09PXR5cGVzLl9jbGFzcyl7dmFyIGNOb2RlPXRoaXMuc3RhcnROb2RlKCk7bm9kZS5kZWNsYXJhdGlvbj10aGlzLnBhcnNlQ2xhc3MoY05vZGUsIm51bGxhYmxlSUQiKTt9ZWxzZXtub2RlLmRlY2xhcmF0aW9uPXRoaXMucGFyc2VNYXliZUFzc2lnbigpO3RoaXMuc2VtaWNvbG9uKCk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIpfQppZih0aGlzLnNob3VsZFBhcnNlRXhwb3J0U3RhdGVtZW50KCkpe25vZGUuZGVjbGFyYXRpb249dGhpcy5wYXJzZVN0YXRlbWVudCh0cnVlKTtpZihub2RlLmRlY2xhcmF0aW9uLnR5cGU9PT0iVmFyaWFibGVEZWNsYXJhdGlvbiIpCnt0aGlzLmNoZWNrVmFyaWFibGVFeHBvcnQoZXhwb3J0cyxub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucyk7fQplbHNlCnt0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMsbm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lLG5vZGUuZGVjbGFyYXRpb24uaWQuc3RhcnQpO30Kbm9kZS5zcGVjaWZpZXJzPVtdO25vZGUuc291cmNlPW51bGw7fWVsc2V7bm9kZS5kZWNsYXJhdGlvbj1udWxsO25vZGUuc3BlY2lmaWVycz10aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhleHBvcnRzKTtpZih0aGlzLmVhdENvbnRleHR1YWwoImZyb20iKSl7aWYodGhpcy50eXBlIT09dHlwZXMuc3RyaW5nKXt0aGlzLnVuZXhwZWN0ZWQoKTt9Cm5vZGUuc291cmNlPXRoaXMucGFyc2VFeHByQXRvbSgpO31lbHNle2Zvcih2YXIgaT0wLGxpc3Q9bm9kZS5zcGVjaWZpZXJzO2k8bGlzdC5sZW5ndGg7aSs9MSl7dmFyIHNwZWM9bGlzdFtpXTt0aGlzJDEuY2hlY2tVbnJlc2VydmVkKHNwZWMubG9jYWwpO30Kbm9kZS5zb3VyY2U9bnVsbDt9CnRoaXMuc2VtaWNvbG9uKCk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iKX07cHAkMS5jaGVja0V4cG9ydD1mdW5jdGlvbihleHBvcnRzLG5hbWUscG9zKXtpZighZXhwb3J0cyl7cmV0dXJufQppZihoYXMoZXhwb3J0cyxuYW1lKSkKe3RoaXMucmFpc2VSZWNvdmVyYWJsZShwb3MsIkR1cGxpY2F0ZSBleHBvcnQgJyIrbmFtZSsiJyIpO30KZXhwb3J0c1tuYW1lXT10cnVlO307cHAkMS5jaGVja1BhdHRlcm5FeHBvcnQ9ZnVuY3Rpb24oZXhwb3J0cyxwYXQpe3ZhciB0aGlzJDE9dGhpczt2YXIgdHlwZT1wYXQudHlwZTtpZih0eXBlPT0iSWRlbnRpZmllciIpCnt0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMscGF0Lm5hbWUscGF0LnN0YXJ0KTt9CmVsc2UgaWYodHlwZT09Ik9iamVjdFBhdHRlcm4iKQp7Zm9yKHZhciBpPTAsbGlzdD1wYXQucHJvcGVydGllcztpPGxpc3QubGVuZ3RoO2krPTEpCnt2YXIgcHJvcD1saXN0W2ldO3RoaXMkMS5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cyxwcm9wKTt9fQplbHNlIGlmKHR5cGU9PSJBcnJheVBhdHRlcm4iKQp7Zm9yKHZhciBpJDE9MCxsaXN0JDE9cGF0LmVsZW1lbnRzO2kkMTxsaXN0JDEubGVuZ3RoO2kkMSs9MSl7dmFyIGVsdD1saXN0JDFbaSQxXTtpZihlbHQpe3RoaXMkMS5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cyxlbHQpO319fQplbHNlIGlmKHR5cGU9PSJQcm9wZXJ0eSIpCnt0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLHBhdC52YWx1ZSk7fQplbHNlIGlmKHR5cGU9PSJBc3NpZ25tZW50UGF0dGVybiIpCnt0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLHBhdC5sZWZ0KTt9CmVsc2UgaWYodHlwZT09IlJlc3RFbGVtZW50IikKe3RoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMscGF0LmFyZ3VtZW50KTt9CmVsc2UgaWYodHlwZT09IlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIikKe3RoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMscGF0LmV4cHJlc3Npb24pO319O3BwJDEuY2hlY2tWYXJpYWJsZUV4cG9ydD1mdW5jdGlvbihleHBvcnRzLGRlY2xzKXt2YXIgdGhpcyQxPXRoaXM7aWYoIWV4cG9ydHMpe3JldHVybn0KZm9yKHZhciBpPTAsbGlzdD1kZWNscztpPGxpc3QubGVuZ3RoO2krPTEpCnt2YXIgZGVjbD1saXN0W2ldO3RoaXMkMS5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cyxkZWNsLmlkKTt9fTtwcCQxLnNob3VsZFBhcnNlRXhwb3J0U3RhdGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZS5rZXl3b3JkPT09InZhciJ8fHRoaXMudHlwZS5rZXl3b3JkPT09ImNvbnN0Inx8dGhpcy50eXBlLmtleXdvcmQ9PT0iY2xhc3MifHx0aGlzLnR5cGUua2V5d29yZD09PSJmdW5jdGlvbiJ8fHRoaXMuaXNMZXQoKXx8dGhpcy5pc0FzeW5jRnVuY3Rpb24oKX07cHAkMS5wYXJzZUV4cG9ydFNwZWNpZmllcnM9ZnVuY3Rpb24oZXhwb3J0cyl7dmFyIHRoaXMkMT10aGlzO3ZhciBub2Rlcz1bXSxmaXJzdD10cnVlO3RoaXMuZXhwZWN0KHR5cGVzLmJyYWNlTCk7d2hpbGUoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpe2lmKCFmaXJzdCl7dGhpcyQxLmV4cGVjdCh0eXBlcy5jb21tYSk7aWYodGhpcyQxLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5icmFjZVIpKXticmVha319ZWxzZXtmaXJzdD1mYWxzZTt9CnZhciBub2RlPXRoaXMkMS5zdGFydE5vZGUoKTtub2RlLmxvY2FsPXRoaXMkMS5wYXJzZUlkZW50KHRydWUpO25vZGUuZXhwb3J0ZWQ9dGhpcyQxLmVhdENvbnRleHR1YWwoImFzIik/dGhpcyQxLnBhcnNlSWRlbnQodHJ1ZSk6bm9kZS5sb2NhbDt0aGlzJDEuY2hlY2tFeHBvcnQoZXhwb3J0cyxub2RlLmV4cG9ydGVkLm5hbWUsbm9kZS5leHBvcnRlZC5zdGFydCk7bm9kZXMucHVzaCh0aGlzJDEuZmluaXNoTm9kZShub2RlLCJFeHBvcnRTcGVjaWZpZXIiKSk7fQpyZXR1cm4gbm9kZXN9O3BwJDEucGFyc2VJbXBvcnQ9ZnVuY3Rpb24obm9kZSl7dGhpcy5uZXh0KCk7aWYodGhpcy50eXBlPT09dHlwZXMuc3RyaW5nKXtub2RlLnNwZWNpZmllcnM9ZW1wdHk7bm9kZS5zb3VyY2U9dGhpcy5wYXJzZUV4cHJBdG9tKCk7fWVsc2V7bm9kZS5zcGVjaWZpZXJzPXRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJzKCk7dGhpcy5leHBlY3RDb250ZXh0dWFsKCJmcm9tIik7bm9kZS5zb3VyY2U9dGhpcy50eXBlPT09dHlwZXMuc3RyaW5nP3RoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMudW5leHBlY3RlZCgpO30KdGhpcy5zZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkltcG9ydERlY2xhcmF0aW9uIil9O3BwJDEucGFyc2VJbXBvcnRTcGVjaWZpZXJzPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBub2Rlcz1bXSxmaXJzdD10cnVlO2lmKHRoaXMudHlwZT09PXR5cGVzLm5hbWUpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCk7bm9kZS5sb2NhbD10aGlzLnBhcnNlSWRlbnQoKTt0aGlzLmNoZWNrTFZhbChub2RlLmxvY2FsLCJsZXQiKTtub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyIikpO2lmKCF0aGlzLmVhdCh0eXBlcy5jb21tYSkpe3JldHVybiBub2Rlc319CmlmKHRoaXMudHlwZT09PXR5cGVzLnN0YXIpe3ZhciBub2RlJDE9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKTt0aGlzLmV4cGVjdENvbnRleHR1YWwoImFzIik7bm9kZSQxLmxvY2FsPXRoaXMucGFyc2VJZGVudCgpO3RoaXMuY2hlY2tMVmFsKG5vZGUkMS5sb2NhbCwibGV0Iik7bm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSQxLCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIiKSk7cmV0dXJuIG5vZGVzfQp0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO3doaWxlKCF0aGlzLmVhdCh0eXBlcy5icmFjZVIpKXtpZighZmlyc3Qpe3RoaXMkMS5leHBlY3QodHlwZXMuY29tbWEpO2lmKHRoaXMkMS5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSl7YnJlYWt9fWVsc2V7Zmlyc3Q9ZmFsc2U7fQp2YXIgbm9kZSQyPXRoaXMkMS5zdGFydE5vZGUoKTtub2RlJDIuaW1wb3J0ZWQ9dGhpcyQxLnBhcnNlSWRlbnQodHJ1ZSk7aWYodGhpcyQxLmVhdENvbnRleHR1YWwoImFzIikpe25vZGUkMi5sb2NhbD10aGlzJDEucGFyc2VJZGVudCgpO31lbHNle3RoaXMkMS5jaGVja1VucmVzZXJ2ZWQobm9kZSQyLmltcG9ydGVkKTtub2RlJDIubG9jYWw9bm9kZSQyLmltcG9ydGVkO30KdGhpcyQxLmNoZWNrTFZhbChub2RlJDIubG9jYWwsImxldCIpO25vZGVzLnB1c2godGhpcyQxLmZpbmlzaE5vZGUobm9kZSQyLCJJbXBvcnRTcGVjaWZpZXIiKSk7fQpyZXR1cm4gbm9kZXN9O3BwJDEuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZT1mdW5jdGlvbihzdGF0ZW1lbnRzKXtmb3IodmFyIGk9MDtpPHN0YXRlbWVudHMubGVuZ3RoJiZ0aGlzLmlzRGlyZWN0aXZlQ2FuZGlkYXRlKHN0YXRlbWVudHNbaV0pOysraSl7c3RhdGVtZW50c1tpXS5kaXJlY3RpdmU9c3RhdGVtZW50c1tpXS5leHByZXNzaW9uLnJhdy5zbGljZSgxLC0xKTt9fTtwcCQxLmlzRGlyZWN0aXZlQ2FuZGlkYXRlPWZ1bmN0aW9uKHN0YXRlbWVudCl7cmV0dXJuKHN0YXRlbWVudC50eXBlPT09IkV4cHJlc3Npb25TdGF0ZW1lbnQiJiZzdGF0ZW1lbnQuZXhwcmVzc2lvbi50eXBlPT09IkxpdGVyYWwiJiZ0eXBlb2Ygc3RhdGVtZW50LmV4cHJlc3Npb24udmFsdWU9PT0ic3RyaW5nIiYmKHRoaXMuaW5wdXRbc3RhdGVtZW50LnN0YXJ0XT09PSJcIiJ8fHRoaXMuaW5wdXRbc3RhdGVtZW50LnN0YXJ0XT09PSInIikpfTt2YXIgcHAkMj1QYXJzZXIucHJvdG90eXBlO3BwJDIudG9Bc3NpZ25hYmxlPWZ1bmN0aW9uKG5vZGUsaXNCaW5kaW5nLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe3ZhciB0aGlzJDE9dGhpcztpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJm5vZGUpe3N3aXRjaChub2RlLnR5cGUpe2Nhc2UiSWRlbnRpZmllciI6aWYodGhpcy5pbkFzeW5jJiZub2RlLm5hbWU9PT0iYXdhaXQiKQp7dGhpcy5yYWlzZShub2RlLnN0YXJ0LCJDYW4gbm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uIik7fQpicmVhawpjYXNlIk9iamVjdFBhdHRlcm4iOmNhc2UiQXJyYXlQYXR0ZXJuIjpjYXNlIlJlc3RFbGVtZW50IjpicmVhawpjYXNlIk9iamVjdEV4cHJlc3Npb24iOm5vZGUudHlwZT0iT2JqZWN0UGF0dGVybiI7aWYocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl7dGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyx0cnVlKTt9CmZvcih2YXIgaT0wLGxpc3Q9bm9kZS5wcm9wZXJ0aWVzO2k8bGlzdC5sZW5ndGg7aSs9MSl7dmFyIHByb3A9bGlzdFtpXTt0aGlzJDEudG9Bc3NpZ25hYmxlKHByb3AsaXNCaW5kaW5nKTtpZihwcm9wLnR5cGU9PT0iUmVzdEVsZW1lbnQiJiYocHJvcC5hcmd1bWVudC50eXBlPT09IkFycmF5UGF0dGVybiJ8fHByb3AuYXJndW1lbnQudHlwZT09PSJPYmplY3RQYXR0ZXJuIikpe3RoaXMkMS5yYWlzZShwcm9wLmFyZ3VtZW50LnN0YXJ0LCJVbmV4cGVjdGVkIHRva2VuIik7fX0KYnJlYWsKY2FzZSJQcm9wZXJ0eSI6aWYobm9kZS5raW5kIT09ImluaXQiKXt0aGlzLnJhaXNlKG5vZGUua2V5LnN0YXJ0LCJPYmplY3QgcGF0dGVybiBjYW4ndCBjb250YWluIGdldHRlciBvciBzZXR0ZXIiKTt9CnRoaXMudG9Bc3NpZ25hYmxlKG5vZGUudmFsdWUsaXNCaW5kaW5nKTticmVhawpjYXNlIkFycmF5RXhwcmVzc2lvbiI6bm9kZS50eXBlPSJBcnJheVBhdHRlcm4iO2lmKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe3RoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsdHJ1ZSk7fQp0aGlzLnRvQXNzaWduYWJsZUxpc3Qobm9kZS5lbGVtZW50cyxpc0JpbmRpbmcpO2JyZWFrCmNhc2UiU3ByZWFkRWxlbWVudCI6bm9kZS50eXBlPSJSZXN0RWxlbWVudCI7dGhpcy50b0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCxpc0JpbmRpbmcpO2lmKG5vZGUuYXJndW1lbnQudHlwZT09PSJBc3NpZ25tZW50UGF0dGVybiIpCnt0aGlzLnJhaXNlKG5vZGUuYXJndW1lbnQuc3RhcnQsIlJlc3QgZWxlbWVudHMgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlIik7fQpicmVhawpjYXNlIkFzc2lnbm1lbnRFeHByZXNzaW9uIjppZihub2RlLm9wZXJhdG9yIT09Ij0iKXt0aGlzLnJhaXNlKG5vZGUubGVmdC5lbmQsIk9ubHkgJz0nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWUuIik7fQpub2RlLnR5cGU9IkFzc2lnbm1lbnRQYXR0ZXJuIjtkZWxldGUgbm9kZS5vcGVyYXRvcjt0aGlzLnRvQXNzaWduYWJsZShub2RlLmxlZnQsaXNCaW5kaW5nKTtjYXNlIkFzc2lnbm1lbnRQYXR0ZXJuIjpicmVhawpjYXNlIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIjp0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24saXNCaW5kaW5nKTticmVhawpjYXNlIk1lbWJlckV4cHJlc3Npb24iOmlmKCFpc0JpbmRpbmcpe2JyZWFrfQpkZWZhdWx0OnRoaXMucmFpc2Uobm9kZS5zdGFydCwiQXNzaWduaW5nIHRvIHJ2YWx1ZSIpO319ZWxzZSBpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt0aGlzLmNoZWNrUGF0dGVybkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLHRydWUpO30KcmV0dXJuIG5vZGV9O3BwJDIudG9Bc3NpZ25hYmxlTGlzdD1mdW5jdGlvbihleHByTGlzdCxpc0JpbmRpbmcpe3ZhciB0aGlzJDE9dGhpczt2YXIgZW5kPWV4cHJMaXN0Lmxlbmd0aDtmb3IodmFyIGk9MDtpPGVuZDtpKyspe3ZhciBlbHQ9ZXhwckxpc3RbaV07aWYoZWx0KXt0aGlzJDEudG9Bc3NpZ25hYmxlKGVsdCxpc0JpbmRpbmcpO319CmlmKGVuZCl7dmFyIGxhc3Q9ZXhwckxpc3RbZW5kLTFdO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj09PTYmJmlzQmluZGluZyYmbGFzdCYmbGFzdC50eXBlPT09IlJlc3RFbGVtZW50IiYmbGFzdC5hcmd1bWVudC50eXBlIT09IklkZW50aWZpZXIiKQp7dGhpcy51bmV4cGVjdGVkKGxhc3QuYXJndW1lbnQuc3RhcnQpO319CnJldHVybiBleHByTGlzdH07cHAkMi5wYXJzZVNwcmVhZD1mdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO25vZGUuYXJndW1lbnQ9dGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiU3ByZWFkRWxlbWVudCIpfTtwcCQyLnBhcnNlUmVzdEJpbmRpbmc9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj09PTYmJnRoaXMudHlwZSE9PXR5cGVzLm5hbWUpCnt0aGlzLnVuZXhwZWN0ZWQoKTt9Cm5vZGUuYXJndW1lbnQ9dGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJSZXN0RWxlbWVudCIpfTtwcCQyLnBhcnNlQmluZGluZ0F0b209ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgdHlwZXMuYnJhY2tldEw6dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKTtub2RlLmVsZW1lbnRzPXRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5icmFja2V0Uix0cnVlLHRydWUpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiQXJyYXlQYXR0ZXJuIikKY2FzZSB0eXBlcy5icmFjZUw6cmV0dXJuIHRoaXMucGFyc2VPYmoodHJ1ZSl9fQpyZXR1cm4gdGhpcy5wYXJzZUlkZW50KCl9O3BwJDIucGFyc2VCaW5kaW5nTGlzdD1mdW5jdGlvbihjbG9zZSxhbGxvd0VtcHR5LGFsbG93VHJhaWxpbmdDb21tYSl7dmFyIHRoaXMkMT10aGlzO3ZhciBlbHRzPVtdLGZpcnN0PXRydWU7d2hpbGUoIXRoaXMuZWF0KGNsb3NlKSl7aWYoZmlyc3Qpe2ZpcnN0PWZhbHNlO30KZWxzZXt0aGlzJDEuZXhwZWN0KHR5cGVzLmNvbW1hKTt9CmlmKGFsbG93RW1wdHkmJnRoaXMkMS50eXBlPT09dHlwZXMuY29tbWEpe2VsdHMucHVzaChudWxsKTt9ZWxzZSBpZihhbGxvd1RyYWlsaW5nQ29tbWEmJnRoaXMkMS5hZnRlclRyYWlsaW5nQ29tbWEoY2xvc2UpKXticmVha31lbHNlIGlmKHRoaXMkMS50eXBlPT09dHlwZXMuZWxsaXBzaXMpe3ZhciByZXN0PXRoaXMkMS5wYXJzZVJlc3RCaW5kaW5nKCk7dGhpcyQxLnBhcnNlQmluZGluZ0xpc3RJdGVtKHJlc3QpO2VsdHMucHVzaChyZXN0KTtpZih0aGlzJDEudHlwZT09PXR5cGVzLmNvbW1hKXt0aGlzJDEucmFpc2UodGhpcyQxLnN0YXJ0LCJDb21tYSBpcyBub3QgcGVybWl0dGVkIGFmdGVyIHRoZSByZXN0IGVsZW1lbnQiKTt9CnRoaXMkMS5leHBlY3QoY2xvc2UpO2JyZWFrfWVsc2V7dmFyIGVsZW09dGhpcyQxLnBhcnNlTWF5YmVEZWZhdWx0KHRoaXMkMS5zdGFydCx0aGlzJDEuc3RhcnRMb2MpO3RoaXMkMS5wYXJzZUJpbmRpbmdMaXN0SXRlbShlbGVtKTtlbHRzLnB1c2goZWxlbSk7fX0KcmV0dXJuIGVsdHN9O3BwJDIucGFyc2VCaW5kaW5nTGlzdEl0ZW09ZnVuY3Rpb24ocGFyYW0pe3JldHVybiBwYXJhbX07cHAkMi5wYXJzZU1heWJlRGVmYXVsdD1mdW5jdGlvbihzdGFydFBvcyxzdGFydExvYyxsZWZ0KXtsZWZ0PWxlZnR8fHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjw2fHwhdGhpcy5lYXQodHlwZXMuZXEpKXtyZXR1cm4gbGVmdH0KdmFyIG5vZGU9dGhpcy5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyk7bm9kZS5sZWZ0PWxlZnQ7bm9kZS5yaWdodD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkFzc2lnbm1lbnRQYXR0ZXJuIil9O3BwJDIuY2hlY2tMVmFsPWZ1bmN0aW9uKGV4cHIsYmluZGluZ1R5cGUsY2hlY2tDbGFzaGVzKXt2YXIgdGhpcyQxPXRoaXM7c3dpdGNoKGV4cHIudHlwZSl7Y2FzZSJJZGVudGlmaWVyIjppZih0aGlzLnN0cmljdCYmdGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0QmluZC50ZXN0KGV4cHIubmFtZSkpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoZXhwci5zdGFydCwoYmluZGluZ1R5cGU/IkJpbmRpbmcgIjoiQXNzaWduaW5nIHRvICIpK2V4cHIubmFtZSsiIGluIHN0cmljdCBtb2RlIik7fQppZihjaGVja0NsYXNoZXMpe2lmKGhhcyhjaGVja0NsYXNoZXMsZXhwci5uYW1lKSkKe3RoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCJBcmd1bWVudCBuYW1lIGNsYXNoIik7fQpjaGVja0NsYXNoZXNbZXhwci5uYW1lXT10cnVlO30KaWYoYmluZGluZ1R5cGUmJmJpbmRpbmdUeXBlIT09Im5vbmUiKXtpZihiaW5kaW5nVHlwZT09PSJ2YXIiJiYhdGhpcy5jYW5EZWNsYXJlVmFyTmFtZShleHByLm5hbWUpfHxiaW5kaW5nVHlwZSE9PSJ2YXIiJiYhdGhpcy5jYW5EZWNsYXJlTGV4aWNhbE5hbWUoZXhwci5uYW1lKSl7dGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsKCJJZGVudGlmaWVyICciKyhleHByLm5hbWUpKyInIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQiKSk7fQppZihiaW5kaW5nVHlwZT09PSJ2YXIiKXt0aGlzLmRlY2xhcmVWYXJOYW1lKGV4cHIubmFtZSk7fWVsc2V7dGhpcy5kZWNsYXJlTGV4aWNhbE5hbWUoZXhwci5uYW1lKTt9fQpicmVhawpjYXNlIk1lbWJlckV4cHJlc3Npb24iOmlmKGJpbmRpbmdUeXBlKXt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoZXhwci5zdGFydCwiQmluZGluZyBtZW1iZXIgZXhwcmVzc2lvbiIpO30KYnJlYWsKY2FzZSJPYmplY3RQYXR0ZXJuIjpmb3IodmFyIGk9MCxsaXN0PWV4cHIucHJvcGVydGllcztpPGxpc3QubGVuZ3RoO2krPTEpCnt2YXIgcHJvcD1saXN0W2ldO3RoaXMkMS5jaGVja0xWYWwocHJvcCxiaW5kaW5nVHlwZSxjaGVja0NsYXNoZXMpO30KYnJlYWsKY2FzZSJQcm9wZXJ0eSI6dGhpcy5jaGVja0xWYWwoZXhwci52YWx1ZSxiaW5kaW5nVHlwZSxjaGVja0NsYXNoZXMpO2JyZWFrCmNhc2UiQXJyYXlQYXR0ZXJuIjpmb3IodmFyIGkkMT0wLGxpc3QkMT1leHByLmVsZW1lbnRzO2kkMTxsaXN0JDEubGVuZ3RoO2kkMSs9MSl7dmFyIGVsZW09bGlzdCQxW2kkMV07aWYoZWxlbSl7dGhpcyQxLmNoZWNrTFZhbChlbGVtLGJpbmRpbmdUeXBlLGNoZWNrQ2xhc2hlcyk7fX0KYnJlYWsKY2FzZSJBc3NpZ25tZW50UGF0dGVybiI6dGhpcy5jaGVja0xWYWwoZXhwci5sZWZ0LGJpbmRpbmdUeXBlLGNoZWNrQ2xhc2hlcyk7YnJlYWsKY2FzZSJSZXN0RWxlbWVudCI6dGhpcy5jaGVja0xWYWwoZXhwci5hcmd1bWVudCxiaW5kaW5nVHlwZSxjaGVja0NsYXNoZXMpO2JyZWFrCmNhc2UiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iOnRoaXMuY2hlY2tMVmFsKGV4cHIuZXhwcmVzc2lvbixiaW5kaW5nVHlwZSxjaGVja0NsYXNoZXMpO2JyZWFrCmRlZmF1bHQ6dGhpcy5yYWlzZShleHByLnN0YXJ0LChiaW5kaW5nVHlwZT8iQmluZGluZyI6IkFzc2lnbmluZyB0byIpKyIgcnZhbHVlIik7fX07dmFyIHBwJDM9UGFyc2VyLnByb3RvdHlwZTtwcCQzLmNoZWNrUHJvcENsYXNoPWZ1bmN0aW9uKHByb3AscHJvcEhhc2gscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZwcm9wLnR5cGU9PT0iU3ByZWFkRWxlbWVudCIpCntyZXR1cm59CmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49NiYmKHByb3AuY29tcHV0ZWR8fHByb3AubWV0aG9kfHxwcm9wLnNob3J0aGFuZCkpCntyZXR1cm59CnZhciBrZXk9cHJvcC5rZXk7dmFyIG5hbWU7c3dpdGNoKGtleS50eXBlKXtjYXNlIklkZW50aWZpZXIiOm5hbWU9a2V5Lm5hbWU7YnJlYWsKY2FzZSJMaXRlcmFsIjpuYW1lPVN0cmluZyhrZXkudmFsdWUpO2JyZWFrCmRlZmF1bHQ6cmV0dXJufQp2YXIga2luZD1wcm9wLmtpbmQ7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXtpZihuYW1lPT09Il9fcHJvdG9fXyImJmtpbmQ9PT0iaW5pdCIpe2lmKHByb3BIYXNoLnByb3RvKXtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzJiZyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvPDApe3JlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG89a2V5LnN0YXJ0O30KZWxzZXt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5Iik7fX0KcHJvcEhhc2gucHJvdG89dHJ1ZTt9CnJldHVybn0KbmFtZT0iJCIrbmFtZTt2YXIgb3RoZXI9cHJvcEhhc2hbbmFtZV07aWYob3RoZXIpe3ZhciByZWRlZmluaXRpb247aWYoa2luZD09PSJpbml0Iil7cmVkZWZpbml0aW9uPXRoaXMuc3RyaWN0JiZvdGhlci5pbml0fHxvdGhlci5nZXR8fG90aGVyLnNldDt9ZWxzZXtyZWRlZmluaXRpb249b3RoZXIuaW5pdHx8b3RoZXJba2luZF07fQppZihyZWRlZmluaXRpb24pCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCJSZWRlZmluaXRpb24gb2YgcHJvcGVydHkiKTt9fWVsc2V7b3RoZXI9cHJvcEhhc2hbbmFtZV09e2luaXQ6ZmFsc2UsZ2V0OmZhbHNlLHNldDpmYWxzZX07fQpvdGhlcltraW5kXT10cnVlO307cHAkMy5wYXJzZUV4cHJlc3Npb249ZnVuY3Rpb24obm9JbixyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt2YXIgdGhpcyQxPXRoaXM7dmFyIHN0YXJ0UG9zPXRoaXMuc3RhcnQsc3RhcnRMb2M9dGhpcy5zdGFydExvYzt2YXIgZXhwcj10aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9JbixyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtpZih0aGlzLnR5cGU9PT10eXBlcy5jb21tYSl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyk7bm9kZS5leHByZXNzaW9ucz1bZXhwcl07d2hpbGUodGhpcy5lYXQodHlwZXMuY29tbWEpKXtub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcyQxLnBhcnNlTWF5YmVBc3NpZ24obm9JbixyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSk7fQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIlNlcXVlbmNlRXhwcmVzc2lvbiIpfQpyZXR1cm4gZXhwcn07cHAkMy5wYXJzZU1heWJlQXNzaWduPWZ1bmN0aW9uKG5vSW4scmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyxhZnRlckxlZnRQYXJzZSl7aWYodGhpcy5pbkdlbmVyYXRvciYmdGhpcy5pc0NvbnRleHR1YWwoInlpZWxkIikpe3JldHVybiB0aGlzLnBhcnNlWWllbGQoKX0KdmFyIG93bkRlc3RydWN0dXJpbmdFcnJvcnM9ZmFsc2Usb2xkUGFyZW5Bc3NpZ249LTEsb2xkVHJhaWxpbmdDb21tYT0tMTtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXtvbGRQYXJlbkFzc2lnbj1yZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ247b2xkVHJhaWxpbmdDb21tYT1yZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWE7cmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduPXJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYT0tMTt9ZWxzZXtyZWZEZXN0cnVjdHVyaW5nRXJyb3JzPW5ldyBEZXN0cnVjdHVyaW5nRXJyb3JzO293bkRlc3RydWN0dXJpbmdFcnJvcnM9dHJ1ZTt9CnZhciBzdGFydFBvcz10aGlzLnN0YXJ0LHN0YXJ0TG9jPXRoaXMuc3RhcnRMb2M7aWYodGhpcy50eXBlPT10eXBlcy5wYXJlbkx8fHRoaXMudHlwZT09dHlwZXMubmFtZSkKe3RoaXMucG90ZW50aWFsQXJyb3dBdD10aGlzLnN0YXJ0O30KdmFyIGxlZnQ9dGhpcy5wYXJzZU1heWJlQ29uZGl0aW9uYWwobm9JbixyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtpZihhZnRlckxlZnRQYXJzZSl7bGVmdD1hZnRlckxlZnRQYXJzZS5jYWxsKHRoaXMsbGVmdCxzdGFydFBvcyxzdGFydExvYyk7fQppZih0aGlzLnR5cGUuaXNBc3NpZ24pe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3Msc3RhcnRMb2MpO25vZGUub3BlcmF0b3I9dGhpcy52YWx1ZTtub2RlLmxlZnQ9dGhpcy50eXBlPT09dHlwZXMuZXE/dGhpcy50b0Fzc2lnbmFibGUobGVmdCxmYWxzZSxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTpsZWZ0O2lmKCFvd25EZXN0cnVjdHVyaW5nRXJyb3JzKXtEZXN0cnVjdHVyaW5nRXJyb3JzLmNhbGwocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7fQpyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbj0tMTt0aGlzLmNoZWNrTFZhbChsZWZ0KTt0aGlzLm5leHQoKTtub2RlLnJpZ2h0PXRoaXMucGFyc2VNYXliZUFzc2lnbihub0luKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkFzc2lnbm1lbnRFeHByZXNzaW9uIil9ZWxzZXtpZihvd25EZXN0cnVjdHVyaW5nRXJyb3JzKXt0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLHRydWUpO319CmlmKG9sZFBhcmVuQXNzaWduPi0xKXtyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ249b2xkUGFyZW5Bc3NpZ247fQppZihvbGRUcmFpbGluZ0NvbW1hPi0xKXtyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWE9b2xkVHJhaWxpbmdDb21tYTt9CnJldHVybiBsZWZ0fTtwcCQzLnBhcnNlTWF5YmVDb25kaXRpb25hbD1mdW5jdGlvbihub0luLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe3ZhciBzdGFydFBvcz10aGlzLnN0YXJ0LHN0YXJ0TG9jPXRoaXMuc3RhcnRMb2M7dmFyIGV4cHI9dGhpcy5wYXJzZUV4cHJPcHMobm9JbixyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtpZih0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSl7cmV0dXJuIGV4cHJ9CmlmKHRoaXMuZWF0KHR5cGVzLnF1ZXN0aW9uKSl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyk7bm9kZS50ZXN0PWV4cHI7bm9kZS5jb25zZXF1ZW50PXRoaXMucGFyc2VNYXliZUFzc2lnbigpO3RoaXMuZXhwZWN0KHR5cGVzLmNvbG9uKTtub2RlLmFsdGVybmF0ZT10aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9Jbik7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJDb25kaXRpb25hbEV4cHJlc3Npb24iKX0KcmV0dXJuIGV4cHJ9O3BwJDMucGFyc2VFeHByT3BzPWZ1bmN0aW9uKG5vSW4scmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl7dmFyIHN0YXJ0UG9zPXRoaXMuc3RhcnQsc3RhcnRMb2M9dGhpcy5zdGFydExvYzt2YXIgZXhwcj10aGlzLnBhcnNlTWF5YmVVbmFyeShyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLGZhbHNlKTtpZih0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSl7cmV0dXJuIGV4cHJ9CnJldHVybiBleHByLnN0YXJ0PT1zdGFydFBvcyYmZXhwci50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIj9leHByOnRoaXMucGFyc2VFeHByT3AoZXhwcixzdGFydFBvcyxzdGFydExvYywtMSxub0luKX07cHAkMy5wYXJzZUV4cHJPcD1mdW5jdGlvbihsZWZ0LGxlZnRTdGFydFBvcyxsZWZ0U3RhcnRMb2MsbWluUHJlYyxub0luKXt2YXIgcHJlYz10aGlzLnR5cGUuYmlub3A7aWYocHJlYyE9bnVsbCYmKCFub0lufHx0aGlzLnR5cGUhPT10eXBlcy5faW4pKXtpZihwcmVjPm1pblByZWMpe3ZhciBsb2dpY2FsPXRoaXMudHlwZT09PXR5cGVzLmxvZ2ljYWxPUnx8dGhpcy50eXBlPT09dHlwZXMubG9naWNhbEFORDt2YXIgb3A9dGhpcy52YWx1ZTt0aGlzLm5leHQoKTt2YXIgc3RhcnRQb3M9dGhpcy5zdGFydCxzdGFydExvYz10aGlzLnN0YXJ0TG9jO3ZhciByaWdodD10aGlzLnBhcnNlRXhwck9wKHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsZmFsc2UpLHN0YXJ0UG9zLHN0YXJ0TG9jLHByZWMsbm9Jbik7dmFyIG5vZGU9dGhpcy5idWlsZEJpbmFyeShsZWZ0U3RhcnRQb3MsbGVmdFN0YXJ0TG9jLGxlZnQscmlnaHQsb3AsbG9naWNhbCk7cmV0dXJuIHRoaXMucGFyc2VFeHByT3Aobm9kZSxsZWZ0U3RhcnRQb3MsbGVmdFN0YXJ0TG9jLG1pblByZWMsbm9Jbil9fQpyZXR1cm4gbGVmdH07cHAkMy5idWlsZEJpbmFyeT1mdW5jdGlvbihzdGFydFBvcyxzdGFydExvYyxsZWZ0LHJpZ2h0LG9wLGxvZ2ljYWwpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3Msc3RhcnRMb2MpO25vZGUubGVmdD1sZWZ0O25vZGUub3BlcmF0b3I9b3A7bm9kZS5yaWdodD1yaWdodDtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsbG9naWNhbD8iTG9naWNhbEV4cHJlc3Npb24iOiJCaW5hcnlFeHByZXNzaW9uIil9O3BwJDMucGFyc2VNYXliZVVuYXJ5PWZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsc2F3VW5hcnkpe3ZhciB0aGlzJDE9dGhpczt2YXIgc3RhcnRQb3M9dGhpcy5zdGFydCxzdGFydExvYz10aGlzLnN0YXJ0TG9jLGV4cHI7aWYodGhpcy5pbkFzeW5jJiZ0aGlzLmlzQ29udGV4dHVhbCgiYXdhaXQiKSl7ZXhwcj10aGlzLnBhcnNlQXdhaXQoKTtzYXdVbmFyeT10cnVlO31lbHNlIGlmKHRoaXMudHlwZS5wcmVmaXgpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCksdXBkYXRlPXRoaXMudHlwZT09PXR5cGVzLmluY0RlYztub2RlLm9wZXJhdG9yPXRoaXMudmFsdWU7bm9kZS5wcmVmaXg9dHJ1ZTt0aGlzLm5leHQoKTtub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsdHJ1ZSk7dGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyx0cnVlKTtpZih1cGRhdGUpe3RoaXMuY2hlY2tMVmFsKG5vZGUuYXJndW1lbnQpO30KZWxzZSBpZih0aGlzLnN0cmljdCYmbm9kZS5vcGVyYXRvcj09PSJkZWxldGUiJiZub2RlLmFyZ3VtZW50LnR5cGU9PT0iSWRlbnRpZmllciIpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGUiKTt9CmVsc2V7c2F3VW5hcnk9dHJ1ZTt9CmV4cHI9dGhpcy5maW5pc2hOb2RlKG5vZGUsdXBkYXRlPyJVcGRhdGVFeHByZXNzaW9uIjoiVW5hcnlFeHByZXNzaW9uIik7fWVsc2V7ZXhwcj10aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7aWYodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpe3JldHVybiBleHByfQp3aGlsZSh0aGlzLnR5cGUucG9zdGZpeCYmIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpe3ZhciBub2RlJDE9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLHN0YXJ0TG9jKTtub2RlJDEub3BlcmF0b3I9dGhpcyQxLnZhbHVlO25vZGUkMS5wcmVmaXg9ZmFsc2U7bm9kZSQxLmFyZ3VtZW50PWV4cHI7dGhpcyQxLmNoZWNrTFZhbChleHByKTt0aGlzJDEubmV4dCgpO2V4cHI9dGhpcyQxLmZpbmlzaE5vZGUobm9kZSQxLCJVcGRhdGVFeHByZXNzaW9uIik7fX0KaWYoIXNhd1VuYXJ5JiZ0aGlzLmVhdCh0eXBlcy5zdGFyc3RhcikpCntyZXR1cm4gdGhpcy5idWlsZEJpbmFyeShzdGFydFBvcyxzdGFydExvYyxleHByLHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsZmFsc2UpLCIqKiIsZmFsc2UpfQplbHNlCntyZXR1cm4gZXhwcn19O3BwJDMucGFyc2VFeHByU3Vic2NyaXB0cz1mdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt2YXIgc3RhcnRQb3M9dGhpcy5zdGFydCxzdGFydExvYz10aGlzLnN0YXJ0TG9jO3ZhciBleHByPXRoaXMucGFyc2VFeHByQXRvbShyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTt2YXIgc2tpcEFycm93U3Vic2NyaXB0cz1leHByLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iJiZ0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva1N0YXJ0LHRoaXMubGFzdFRva0VuZCkhPT0iKSI7aWYodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl8fHNraXBBcnJvd1N1YnNjcmlwdHMpe3JldHVybiBleHByfQp2YXIgcmVzdWx0PXRoaXMucGFyc2VTdWJzY3JpcHRzKGV4cHIsc3RhcnRQb3Msc3RhcnRMb2MpO2lmKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMmJnJlc3VsdC50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iKXtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24+PXJlc3VsdC5zdGFydCl7cmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduPS0xO30KaWYocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQmluZD49cmVzdWx0LnN0YXJ0KXtyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kPS0xO319CnJldHVybiByZXN1bHR9O3BwJDMucGFyc2VTdWJzY3JpcHRzPWZ1bmN0aW9uKGJhc2Usc3RhcnRQb3Msc3RhcnRMb2Msbm9DYWxscyl7dmFyIHRoaXMkMT10aGlzO3ZhciBtYXliZUFzeW5jQXJyb3c9dGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj04JiZiYXNlLnR5cGU9PT0iSWRlbnRpZmllciImJmJhc2UubmFtZT09PSJhc3luYyImJnRoaXMubGFzdFRva0VuZD09YmFzZS5lbmQmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpJiZ0aGlzLmlucHV0LnNsaWNlKGJhc2Uuc3RhcnQsYmFzZS5lbmQpPT09ImFzeW5jIjtmb3IodmFyIGNvbXB1dGVkPSh2b2lkIDApOzspe2lmKChjb21wdXRlZD10aGlzJDEuZWF0KHR5cGVzLmJyYWNrZXRMKSl8fHRoaXMkMS5lYXQodHlwZXMuZG90KSl7dmFyIG5vZGU9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLHN0YXJ0TG9jKTtub2RlLm9iamVjdD1iYXNlO25vZGUucHJvcGVydHk9Y29tcHV0ZWQ/dGhpcyQxLnBhcnNlRXhwcmVzc2lvbigpOnRoaXMkMS5wYXJzZUlkZW50KHRydWUpO25vZGUuY29tcHV0ZWQ9ISFjb21wdXRlZDtpZihjb21wdXRlZCl7dGhpcyQxLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7fQpiYXNlPXRoaXMkMS5maW5pc2hOb2RlKG5vZGUsIk1lbWJlckV4cHJlc3Npb24iKTt9ZWxzZSBpZighbm9DYWxscyYmdGhpcyQxLmVhdCh0eXBlcy5wYXJlbkwpKXt2YXIgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycz1uZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycyxvbGRZaWVsZFBvcz10aGlzJDEueWllbGRQb3Msb2xkQXdhaXRQb3M9dGhpcyQxLmF3YWl0UG9zO3RoaXMkMS55aWVsZFBvcz0wO3RoaXMkMS5hd2FpdFBvcz0wO3ZhciBleHByTGlzdD10aGlzJDEucGFyc2VFeHByTGlzdCh0eXBlcy5wYXJlblIsdGhpcyQxLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgsZmFsc2UscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7aWYobWF5YmVBc3luY0Fycm93JiYhdGhpcyQxLmNhbkluc2VydFNlbWljb2xvbigpJiZ0aGlzJDEuZWF0KHR5cGVzLmFycm93KSl7dGhpcyQxLmNoZWNrUGF0dGVybkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLGZhbHNlKTt0aGlzJDEuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7dGhpcyQxLnlpZWxkUG9zPW9sZFlpZWxkUG9zO3RoaXMkMS5hd2FpdFBvcz1vbGRBd2FpdFBvcztyZXR1cm4gdGhpcyQxLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMkMS5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyksZXhwckxpc3QsdHJ1ZSl9CnRoaXMkMS5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyx0cnVlKTt0aGlzJDEueWllbGRQb3M9b2xkWWllbGRQb3N8fHRoaXMkMS55aWVsZFBvczt0aGlzJDEuYXdhaXRQb3M9b2xkQXdhaXRQb3N8fHRoaXMkMS5hd2FpdFBvczt2YXIgbm9kZSQxPXRoaXMkMS5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyk7bm9kZSQxLmNhbGxlZT1iYXNlO25vZGUkMS5hcmd1bWVudHM9ZXhwckxpc3Q7YmFzZT10aGlzJDEuZmluaXNoTm9kZShub2RlJDEsIkNhbGxFeHByZXNzaW9uIik7fWVsc2UgaWYodGhpcyQxLnR5cGU9PT10eXBlcy5iYWNrUXVvdGUpe3ZhciBub2RlJDI9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLHN0YXJ0TG9jKTtub2RlJDIudGFnPWJhc2U7bm9kZSQyLnF1YXNpPXRoaXMkMS5wYXJzZVRlbXBsYXRlKHtpc1RhZ2dlZDp0cnVlfSk7YmFzZT10aGlzJDEuZmluaXNoTm9kZShub2RlJDIsIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiIpO31lbHNle3JldHVybiBiYXNlfX19O3BwJDMucGFyc2VFeHByQXRvbT1mdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt2YXIgbm9kZSxjYW5CZUFycm93PXRoaXMucG90ZW50aWFsQXJyb3dBdD09dGhpcy5zdGFydDtzd2l0Y2godGhpcy50eXBlKXtjYXNlIHR5cGVzLl9zdXBlcjppZighdGhpcy5pbkZ1bmN0aW9uKQp7dGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCInc3VwZXInIG91dHNpZGUgb2YgZnVuY3Rpb24gb3IgY2xhc3MiKTt9Cm5vZGU9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKTtpZih0aGlzLnR5cGUhPT10eXBlcy5kb3QmJnRoaXMudHlwZSE9PXR5cGVzLmJyYWNrZXRMJiZ0aGlzLnR5cGUhPT10eXBlcy5wYXJlbkwpCnt0aGlzLnVuZXhwZWN0ZWQoKTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiU3VwZXIiKQpjYXNlIHR5cGVzLl90aGlzOm5vZGU9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIlRoaXNFeHByZXNzaW9uIikKY2FzZSB0eXBlcy5uYW1lOnZhciBzdGFydFBvcz10aGlzLnN0YXJ0LHN0YXJ0TG9jPXRoaXMuc3RhcnRMb2MsY29udGFpbnNFc2M9dGhpcy5jb250YWluc0VzYzt2YXIgaWQ9dGhpcy5wYXJzZUlkZW50KHRoaXMudHlwZSE9PXR5cGVzLm5hbWUpO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCYmIWNvbnRhaW5zRXNjJiZpZC5uYW1lPT09ImFzeW5jIiYmIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkmJnRoaXMuZWF0KHR5cGVzLl9mdW5jdGlvbikpCntyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3Msc3RhcnRMb2MpLGZhbHNlLGZhbHNlLHRydWUpfQppZihjYW5CZUFycm93JiYhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSl7aWYodGhpcy5lYXQodHlwZXMuYXJyb3cpKQp7cmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyksW2lkXSxmYWxzZSl9CmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCYmaWQubmFtZT09PSJhc3luYyImJnRoaXMudHlwZT09PXR5cGVzLm5hbWUmJiFjb250YWluc0VzYyl7aWQ9dGhpcy5wYXJzZUlkZW50KCk7aWYodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKXx8IXRoaXMuZWF0KHR5cGVzLmFycm93KSkKe3RoaXMudW5leHBlY3RlZCgpO30KcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcyxzdGFydExvYyksW2lkXSx0cnVlKX19CnJldHVybiBpZApjYXNlIHR5cGVzLnJlZ2V4cDp2YXIgdmFsdWU9dGhpcy52YWx1ZTtub2RlPXRoaXMucGFyc2VMaXRlcmFsKHZhbHVlLnZhbHVlKTtub2RlLnJlZ2V4PXtwYXR0ZXJuOnZhbHVlLnBhdHRlcm4sZmxhZ3M6dmFsdWUuZmxhZ3N9O3JldHVybiBub2RlCmNhc2UgdHlwZXMubnVtOmNhc2UgdHlwZXMuc3RyaW5nOnJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbCh0aGlzLnZhbHVlKQpjYXNlIHR5cGVzLl9udWxsOmNhc2UgdHlwZXMuX3RydWU6Y2FzZSB0eXBlcy5fZmFsc2U6bm9kZT10aGlzLnN0YXJ0Tm9kZSgpO25vZGUudmFsdWU9dGhpcy50eXBlPT09dHlwZXMuX251bGw/bnVsbDp0aGlzLnR5cGU9PT10eXBlcy5fdHJ1ZTtub2RlLnJhdz10aGlzLnR5cGUua2V5d29yZDt0aGlzLm5leHQoKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkxpdGVyYWwiKQpjYXNlIHR5cGVzLnBhcmVuTDp2YXIgc3RhcnQ9dGhpcy5zdGFydCxleHByPXRoaXMucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93KTtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ248MCYmIXRoaXMuaXNTaW1wbGVBc3NpZ25UYXJnZXQoZXhwcikpCntyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ249c3RhcnQ7fQppZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kPDApCntyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kPXN0YXJ0O319CnJldHVybiBleHByCmNhc2UgdHlwZXMuYnJhY2tldEw6bm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO25vZGUuZWxlbWVudHM9dGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzLmJyYWNrZXRSLHRydWUsdHJ1ZSxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkFycmF5RXhwcmVzc2lvbiIpCmNhc2UgdHlwZXMuYnJhY2VMOnJldHVybiB0aGlzLnBhcnNlT2JqKGZhbHNlLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpCmNhc2UgdHlwZXMuX2Z1bmN0aW9uOm5vZGU9dGhpcy5zdGFydE5vZGUoKTt0aGlzLm5leHQoKTtyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKG5vZGUsZmFsc2UpCmNhc2UgdHlwZXMuX2NsYXNzOnJldHVybiB0aGlzLnBhcnNlQ2xhc3ModGhpcy5zdGFydE5vZGUoKSxmYWxzZSkKY2FzZSB0eXBlcy5fbmV3OnJldHVybiB0aGlzLnBhcnNlTmV3KCkKY2FzZSB0eXBlcy5iYWNrUXVvdGU6cmV0dXJuIHRoaXMucGFyc2VUZW1wbGF0ZSgpCmRlZmF1bHQ6dGhpcy51bmV4cGVjdGVkKCk7fX07cHAkMy5wYXJzZUxpdGVyYWw9ZnVuY3Rpb24odmFsdWUpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCk7bm9kZS52YWx1ZT12YWx1ZTtub2RlLnJhdz10aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhcnQsdGhpcy5lbmQpO3RoaXMubmV4dCgpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiTGl0ZXJhbCIpfTtwcCQzLnBhcnNlUGFyZW5FeHByZXNzaW9uPWZ1bmN0aW9uKCl7dGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTt2YXIgdmFsPXRoaXMucGFyc2VFeHByZXNzaW9uKCk7dGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtyZXR1cm4gdmFsfTtwcCQzLnBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb249ZnVuY3Rpb24oY2FuQmVBcnJvdyl7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydFBvcz10aGlzLnN0YXJ0LHN0YXJ0TG9jPXRoaXMuc3RhcnRMb2MsdmFsLGFsbG93VHJhaWxpbmdDb21tYT10aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTg7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXt0aGlzLm5leHQoKTt2YXIgaW5uZXJTdGFydFBvcz10aGlzLnN0YXJ0LGlubmVyU3RhcnRMb2M9dGhpcy5zdGFydExvYzt2YXIgZXhwckxpc3Q9W10sZmlyc3Q9dHJ1ZSxsYXN0SXNDb21tYT1mYWxzZTt2YXIgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycz1uZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycyxvbGRZaWVsZFBvcz10aGlzLnlpZWxkUG9zLG9sZEF3YWl0UG9zPXRoaXMuYXdhaXRQb3Msc3ByZWFkU3RhcnQ7dGhpcy55aWVsZFBvcz0wO3RoaXMuYXdhaXRQb3M9MDt3aGlsZSh0aGlzLnR5cGUhPT10eXBlcy5wYXJlblIpe2ZpcnN0P2ZpcnN0PWZhbHNlOnRoaXMkMS5leHBlY3QodHlwZXMuY29tbWEpO2lmKGFsbG93VHJhaWxpbmdDb21tYSYmdGhpcyQxLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5wYXJlblIsdHJ1ZSkpe2xhc3RJc0NvbW1hPXRydWU7YnJlYWt9ZWxzZSBpZih0aGlzJDEudHlwZT09PXR5cGVzLmVsbGlwc2lzKXtzcHJlYWRTdGFydD10aGlzJDEuc3RhcnQ7ZXhwckxpc3QucHVzaCh0aGlzJDEucGFyc2VQYXJlbkl0ZW0odGhpcyQxLnBhcnNlUmVzdEJpbmRpbmcoKSkpO2lmKHRoaXMkMS50eXBlPT09dHlwZXMuY29tbWEpe3RoaXMkMS5yYWlzZSh0aGlzJDEuc3RhcnQsIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudCIpO30KYnJlYWt9ZWxzZXtleHByTGlzdC5wdXNoKHRoaXMkMS5wYXJzZU1heWJlQXNzaWduKGZhbHNlLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsdGhpcyQxLnBhcnNlUGFyZW5JdGVtKSk7fX0KdmFyIGlubmVyRW5kUG9zPXRoaXMuc3RhcnQsaW5uZXJFbmRMb2M9dGhpcy5zdGFydExvYzt0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO2lmKGNhbkJlQXJyb3cmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpJiZ0aGlzLmVhdCh0eXBlcy5hcnJvdykpe3RoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsZmFsc2UpO3RoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7dGhpcy55aWVsZFBvcz1vbGRZaWVsZFBvczt0aGlzLmF3YWl0UG9zPW9sZEF3YWl0UG9zO3JldHVybiB0aGlzLnBhcnNlUGFyZW5BcnJvd0xpc3Qoc3RhcnRQb3Msc3RhcnRMb2MsZXhwckxpc3QpfQppZighZXhwckxpc3QubGVuZ3RofHxsYXN0SXNDb21tYSl7dGhpcy51bmV4cGVjdGVkKHRoaXMubGFzdFRva1N0YXJ0KTt9CmlmKHNwcmVhZFN0YXJ0KXt0aGlzLnVuZXhwZWN0ZWQoc3ByZWFkU3RhcnQpO30KdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyx0cnVlKTt0aGlzLnlpZWxkUG9zPW9sZFlpZWxkUG9zfHx0aGlzLnlpZWxkUG9zO3RoaXMuYXdhaXRQb3M9b2xkQXdhaXRQb3N8fHRoaXMuYXdhaXRQb3M7aWYoZXhwckxpc3QubGVuZ3RoPjEpe3ZhbD10aGlzLnN0YXJ0Tm9kZUF0KGlubmVyU3RhcnRQb3MsaW5uZXJTdGFydExvYyk7dmFsLmV4cHJlc3Npb25zPWV4cHJMaXN0O3RoaXMuZmluaXNoTm9kZUF0KHZhbCwiU2VxdWVuY2VFeHByZXNzaW9uIixpbm5lckVuZFBvcyxpbm5lckVuZExvYyk7fWVsc2V7dmFsPWV4cHJMaXN0WzBdO319ZWxzZXt2YWw9dGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO30KaWYodGhpcy5vcHRpb25zLnByZXNlcnZlUGFyZW5zKXt2YXIgcGFyPXRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3Msc3RhcnRMb2MpO3Bhci5leHByZXNzaW9uPXZhbDtyZXR1cm4gdGhpcy5maW5pc2hOb2RlKHBhciwiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iKX1lbHNle3JldHVybiB2YWx9fTtwcCQzLnBhcnNlUGFyZW5JdGVtPWZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtfTtwcCQzLnBhcnNlUGFyZW5BcnJvd0xpc3Q9ZnVuY3Rpb24oc3RhcnRQb3Msc3RhcnRMb2MsZXhwckxpc3Qpe3JldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3Msc3RhcnRMb2MpLGV4cHJMaXN0KX07dmFyIGVtcHR5JDE9W107cHAkMy5wYXJzZU5ldz1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCk7dmFyIG1ldGE9dGhpcy5wYXJzZUlkZW50KHRydWUpO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49NiYmdGhpcy5lYXQodHlwZXMuZG90KSl7bm9kZS5tZXRhPW1ldGE7dmFyIGNvbnRhaW5zRXNjPXRoaXMuY29udGFpbnNFc2M7bm9kZS5wcm9wZXJ0eT10aGlzLnBhcnNlSWRlbnQodHJ1ZSk7aWYobm9kZS5wcm9wZXJ0eS5uYW1lIT09InRhcmdldCJ8fGNvbnRhaW5zRXNjKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUucHJvcGVydHkuc3RhcnQsIlRoZSBvbmx5IHZhbGlkIG1ldGEgcHJvcGVydHkgZm9yIG5ldyBpcyBuZXcudGFyZ2V0Iik7fQppZighdGhpcy5pbkZ1bmN0aW9uKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIm5ldy50YXJnZXQgY2FuIG9ubHkgYmUgdXNlZCBpbiBmdW5jdGlvbnMiKTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiTWV0YVByb3BlcnR5Iil9CnZhciBzdGFydFBvcz10aGlzLnN0YXJ0LHN0YXJ0TG9jPXRoaXMuc3RhcnRMb2M7bm9kZS5jYWxsZWU9dGhpcy5wYXJzZVN1YnNjcmlwdHModGhpcy5wYXJzZUV4cHJBdG9tKCksc3RhcnRQb3Msc3RhcnRMb2MsdHJ1ZSk7aWYodGhpcy5lYXQodHlwZXMucGFyZW5MKSl7bm9kZS5hcmd1bWVudHM9dGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzLnBhcmVuUix0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgsZmFsc2UpO30KZWxzZXtub2RlLmFyZ3VtZW50cz1lbXB0eSQxO30KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJOZXdFeHByZXNzaW9uIil9O3BwJDMucGFyc2VUZW1wbGF0ZUVsZW1lbnQ9ZnVuY3Rpb24ocmVmKXt2YXIgaXNUYWdnZWQ9cmVmLmlzVGFnZ2VkO3ZhciBlbGVtPXRoaXMuc3RhcnROb2RlKCk7aWYodGhpcy50eXBlPT09dHlwZXMuaW52YWxpZFRlbXBsYXRlKXtpZighaXNUYWdnZWQpe3RoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCJCYWQgZXNjYXBlIHNlcXVlbmNlIGluIHVudGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwiKTt9CmVsZW0udmFsdWU9e3Jhdzp0aGlzLnZhbHVlLGNvb2tlZDpudWxsfTt9ZWxzZXtlbGVtLnZhbHVlPXtyYXc6dGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5yZXBsYWNlKC9cclxuPy9nLCJcbiIpLGNvb2tlZDp0aGlzLnZhbHVlfTt9CnRoaXMubmV4dCgpO2VsZW0udGFpbD10aGlzLnR5cGU9PT10eXBlcy5iYWNrUXVvdGU7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShlbGVtLCJUZW1wbGF0ZUVsZW1lbnQiKX07cHAkMy5wYXJzZVRlbXBsYXRlPWZ1bmN0aW9uKHJlZil7dmFyIHRoaXMkMT10aGlzO2lmKHJlZj09PXZvaWQgMClyZWY9e307dmFyIGlzVGFnZ2VkPXJlZi5pc1RhZ2dlZDtpZihpc1RhZ2dlZD09PXZvaWQgMClpc1RhZ2dlZD1mYWxzZTt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO25vZGUuZXhwcmVzc2lvbnM9W107dmFyIGN1ckVsdD10aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KHtpc1RhZ2dlZDppc1RhZ2dlZH0pO25vZGUucXVhc2lzPVtjdXJFbHRdO3doaWxlKCFjdXJFbHQudGFpbCl7dGhpcyQxLmV4cGVjdCh0eXBlcy5kb2xsYXJCcmFjZUwpO25vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzJDEucGFyc2VFeHByZXNzaW9uKCkpO3RoaXMkMS5leHBlY3QodHlwZXMuYnJhY2VSKTtub2RlLnF1YXNpcy5wdXNoKGN1ckVsdD10aGlzJDEucGFyc2VUZW1wbGF0ZUVsZW1lbnQoe2lzVGFnZ2VkOmlzVGFnZ2VkfSkpO30KdGhpcy5uZXh0KCk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJUZW1wbGF0ZUxpdGVyYWwiKX07cHAkMy5pc0FzeW5jUHJvcD1mdW5jdGlvbihwcm9wKXtyZXR1cm4hcHJvcC5jb21wdXRlZCYmcHJvcC5rZXkudHlwZT09PSJJZGVudGlmaWVyIiYmcHJvcC5rZXkubmFtZT09PSJhc3luYyImJih0aGlzLnR5cGU9PT10eXBlcy5uYW1lfHx0aGlzLnR5cGU9PT10eXBlcy5udW18fHRoaXMudHlwZT09PXR5cGVzLnN0cmluZ3x8dGhpcy50eXBlPT09dHlwZXMuYnJhY2tldEx8fHRoaXMudHlwZS5rZXl3b3JkfHwodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZ0aGlzLnR5cGU9PT10eXBlcy5zdGFyKSkmJiFsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCx0aGlzLnN0YXJ0KSl9O3BwJDMucGFyc2VPYmo9ZnVuY3Rpb24oaXNQYXR0ZXJuLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe3ZhciB0aGlzJDE9dGhpczt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpLGZpcnN0PXRydWUscHJvcEhhc2g9e307bm9kZS5wcm9wZXJ0aWVzPVtdO3RoaXMubmV4dCgpO3doaWxlKCF0aGlzLmVhdCh0eXBlcy5icmFjZVIpKXtpZighZmlyc3Qpe3RoaXMkMS5leHBlY3QodHlwZXMuY29tbWEpO2lmKHRoaXMkMS5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSl7YnJlYWt9fWVsc2V7Zmlyc3Q9ZmFsc2U7fQp2YXIgcHJvcD10aGlzJDEucGFyc2VQcm9wZXJ0eShpc1BhdHRlcm4scmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7aWYoIWlzUGF0dGVybil7dGhpcyQxLmNoZWNrUHJvcENsYXNoKHByb3AscHJvcEhhc2gscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7fQpub2RlLnByb3BlcnRpZXMucHVzaChwcm9wKTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSxpc1BhdHRlcm4/Ik9iamVjdFBhdHRlcm4iOiJPYmplY3RFeHByZXNzaW9uIil9O3BwJDMucGFyc2VQcm9wZXJ0eT1mdW5jdGlvbihpc1BhdHRlcm4scmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyl7dmFyIHByb3A9dGhpcy5zdGFydE5vZGUoKSxpc0dlbmVyYXRvcixpc0FzeW5jLHN0YXJ0UG9zLHN0YXJ0TG9jO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OSYmdGhpcy5lYXQodHlwZXMuZWxsaXBzaXMpKXtpZihpc1BhdHRlcm4pe3Byb3AuYXJndW1lbnQ9dGhpcy5wYXJzZUlkZW50KGZhbHNlKTtpZih0aGlzLnR5cGU9PT10eXBlcy5jb21tYSl7dGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCJDb21tYSBpcyBub3QgcGVybWl0dGVkIGFmdGVyIHRoZSByZXN0IGVsZW1lbnQiKTt9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwiUmVzdEVsZW1lbnQiKX0KaWYodGhpcy50eXBlPT09dHlwZXMucGFyZW5MJiZyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXtpZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ248MCl7cmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduPXRoaXMuc3RhcnQ7fQppZihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kPDApe3JlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQ9dGhpcy5zdGFydDt9fQpwcm9wLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtpZih0aGlzLnR5cGU9PT10eXBlcy5jb21tYSYmcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyYmcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hPDApe3JlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYT10aGlzLnN0YXJ0O30KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwcm9wLCJTcHJlYWRFbGVtZW50Iil9CmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7cHJvcC5tZXRob2Q9ZmFsc2U7cHJvcC5zaG9ydGhhbmQ9ZmFsc2U7aWYoaXNQYXR0ZXJufHxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXtzdGFydFBvcz10aGlzLnN0YXJ0O3N0YXJ0TG9jPXRoaXMuc3RhcnRMb2M7fQppZighaXNQYXR0ZXJuKQp7aXNHZW5lcmF0b3I9dGhpcy5lYXQodHlwZXMuc3Rhcik7fX0KdmFyIGNvbnRhaW5zRXNjPXRoaXMuY29udGFpbnNFc2M7dGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtpZighaXNQYXR0ZXJuJiYhY29udGFpbnNFc2MmJnRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCYmIWlzR2VuZXJhdG9yJiZ0aGlzLmlzQXN5bmNQcm9wKHByb3ApKXtpc0FzeW5jPXRydWU7aXNHZW5lcmF0b3I9dGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZ0aGlzLmVhdCh0eXBlcy5zdGFyKTt0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3AscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7fWVsc2V7aXNBc3luYz1mYWxzZTt9CnRoaXMucGFyc2VQcm9wZXJ0eVZhbHVlKHByb3AsaXNQYXR0ZXJuLGlzR2VuZXJhdG9yLGlzQXN5bmMsc3RhcnRQb3Msc3RhcnRMb2MscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyxjb250YWluc0VzYyk7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShwcm9wLCJQcm9wZXJ0eSIpfTtwcCQzLnBhcnNlUHJvcGVydHlWYWx1ZT1mdW5jdGlvbihwcm9wLGlzUGF0dGVybixpc0dlbmVyYXRvcixpc0FzeW5jLHN0YXJ0UG9zLHN0YXJ0TG9jLHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsY29udGFpbnNFc2Mpe2lmKChpc0dlbmVyYXRvcnx8aXNBc3luYykmJnRoaXMudHlwZT09PXR5cGVzLmNvbG9uKQp7dGhpcy51bmV4cGVjdGVkKCk7fQppZih0aGlzLmVhdCh0eXBlcy5jb2xvbikpe3Byb3AudmFsdWU9aXNQYXR0ZXJuP3RoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCx0aGlzLnN0YXJ0TG9jKTp0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7cHJvcC5raW5kPSJpbml0Ijt9ZWxzZSBpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJnRoaXMudHlwZT09PXR5cGVzLnBhcmVuTCl7aWYoaXNQYXR0ZXJuKXt0aGlzLnVuZXhwZWN0ZWQoKTt9CnByb3Aua2luZD0iaW5pdCI7cHJvcC5tZXRob2Q9dHJ1ZTtwcm9wLnZhbHVlPXRoaXMucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsaXNBc3luYyk7fWVsc2UgaWYoIWlzUGF0dGVybiYmIWNvbnRhaW5zRXNjJiZ0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTUmJiFwcm9wLmNvbXB1dGVkJiZwcm9wLmtleS50eXBlPT09IklkZW50aWZpZXIiJiYocHJvcC5rZXkubmFtZT09PSJnZXQifHxwcm9wLmtleS5uYW1lPT09InNldCIpJiYodGhpcy50eXBlIT10eXBlcy5jb21tYSYmdGhpcy50eXBlIT10eXBlcy5icmFjZVIpKXtpZihpc0dlbmVyYXRvcnx8aXNBc3luYyl7dGhpcy51bmV4cGVjdGVkKCk7fQpwcm9wLmtpbmQ9cHJvcC5rZXkubmFtZTt0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO3Byb3AudmFsdWU9dGhpcy5wYXJzZU1ldGhvZChmYWxzZSk7dmFyIHBhcmFtQ291bnQ9cHJvcC5raW5kPT09ImdldCI/MDoxO2lmKHByb3AudmFsdWUucGFyYW1zLmxlbmd0aCE9PXBhcmFtQ291bnQpe3ZhciBzdGFydD1wcm9wLnZhbHVlLnN0YXJ0O2lmKHByb3Aua2luZD09PSJnZXQiKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCJnZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcGFyYW1zIik7fQplbHNlCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsInNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbSIpO319ZWxzZXtpZihwcm9wLmtpbmQ9PT0ic2V0IiYmcHJvcC52YWx1ZS5wYXJhbXNbMF0udHlwZT09PSJSZXN0RWxlbWVudCIpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUocHJvcC52YWx1ZS5wYXJhbXNbMF0uc3RhcnQsIlNldHRlciBjYW5ub3QgdXNlIHJlc3QgcGFyYW1zIik7fX19ZWxzZSBpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJiFwcm9wLmNvbXB1dGVkJiZwcm9wLmtleS50eXBlPT09IklkZW50aWZpZXIiKXt0aGlzLmNoZWNrVW5yZXNlcnZlZChwcm9wLmtleSk7cHJvcC5raW5kPSJpbml0IjtpZihpc1BhdHRlcm4pe3Byb3AudmFsdWU9dGhpcy5wYXJzZU1heWJlRGVmYXVsdChzdGFydFBvcyxzdGFydExvYyxwcm9wLmtleSk7fWVsc2UgaWYodGhpcy50eXBlPT09dHlwZXMuZXEmJnJlZkRlc3RydWN0dXJpbmdFcnJvcnMpe2lmKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduPDApCntyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbj10aGlzLnN0YXJ0O30KcHJvcC52YWx1ZT10aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLHN0YXJ0TG9jLHByb3Aua2V5KTt9ZWxzZXtwcm9wLnZhbHVlPXByb3Aua2V5O30KcHJvcC5zaG9ydGhhbmQ9dHJ1ZTt9ZWxzZXt0aGlzLnVuZXhwZWN0ZWQoKTt9fTtwcCQzLnBhcnNlUHJvcGVydHlOYW1lPWZ1bmN0aW9uKHByb3Ape2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7aWYodGhpcy5lYXQodHlwZXMuYnJhY2tldEwpKXtwcm9wLmNvbXB1dGVkPXRydWU7cHJvcC5rZXk9dGhpcy5wYXJzZU1heWJlQXNzaWduKCk7dGhpcy5leHBlY3QodHlwZXMuYnJhY2tldFIpO3JldHVybiBwcm9wLmtleX1lbHNle3Byb3AuY29tcHV0ZWQ9ZmFsc2U7fX0KcmV0dXJuIHByb3Aua2V5PXRoaXMudHlwZT09PXR5cGVzLm51bXx8dGhpcy50eXBlPT09dHlwZXMuc3RyaW5nP3RoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMucGFyc2VJZGVudCh0cnVlKX07cHAkMy5pbml0RnVuY3Rpb249ZnVuY3Rpb24obm9kZSl7bm9kZS5pZD1udWxsO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7bm9kZS5nZW5lcmF0b3I9ZmFsc2U7bm9kZS5leHByZXNzaW9uPWZhbHNlO30KaWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj04KQp7bm9kZS5hc3luYz1mYWxzZTt9fTtwcCQzLnBhcnNlTWV0aG9kPWZ1bmN0aW9uKGlzR2VuZXJhdG9yLGlzQXN5bmMpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCksb2xkSW5HZW49dGhpcy5pbkdlbmVyYXRvcixvbGRJbkFzeW5jPXRoaXMuaW5Bc3luYyxvbGRZaWVsZFBvcz10aGlzLnlpZWxkUG9zLG9sZEF3YWl0UG9zPXRoaXMuYXdhaXRQb3Msb2xkSW5GdW5jPXRoaXMuaW5GdW5jdGlvbjt0aGlzLmluaXRGdW5jdGlvbihub2RlKTtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYpCntub2RlLmdlbmVyYXRvcj1pc0dlbmVyYXRvcjt9CmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCkKe25vZGUuYXN5bmM9ISFpc0FzeW5jO30KdGhpcy5pbkdlbmVyYXRvcj1ub2RlLmdlbmVyYXRvcjt0aGlzLmluQXN5bmM9bm9kZS5hc3luYzt0aGlzLnlpZWxkUG9zPTA7dGhpcy5hd2FpdFBvcz0wO3RoaXMuaW5GdW5jdGlvbj10cnVlO3RoaXMuZW50ZXJGdW5jdGlvblNjb3BlKCk7dGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTtub2RlLnBhcmFtcz10aGlzLnBhcnNlQmluZGluZ0xpc3QodHlwZXMucGFyZW5SLGZhbHNlLHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCk7dGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTt0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsZmFsc2UpO3RoaXMuaW5HZW5lcmF0b3I9b2xkSW5HZW47dGhpcy5pbkFzeW5jPW9sZEluQXN5bmM7dGhpcy55aWVsZFBvcz1vbGRZaWVsZFBvczt0aGlzLmF3YWl0UG9zPW9sZEF3YWl0UG9zO3RoaXMuaW5GdW5jdGlvbj1vbGRJbkZ1bmM7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJGdW5jdGlvbkV4cHJlc3Npb24iKX07cHAkMy5wYXJzZUFycm93RXhwcmVzc2lvbj1mdW5jdGlvbihub2RlLHBhcmFtcyxpc0FzeW5jKXt2YXIgb2xkSW5HZW49dGhpcy5pbkdlbmVyYXRvcixvbGRJbkFzeW5jPXRoaXMuaW5Bc3luYyxvbGRZaWVsZFBvcz10aGlzLnlpZWxkUG9zLG9sZEF3YWl0UG9zPXRoaXMuYXdhaXRQb3Msb2xkSW5GdW5jPXRoaXMuaW5GdW5jdGlvbjt0aGlzLmVudGVyRnVuY3Rpb25TY29wZSgpO3RoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCkKe25vZGUuYXN5bmM9ISFpc0FzeW5jO30KdGhpcy5pbkdlbmVyYXRvcj1mYWxzZTt0aGlzLmluQXN5bmM9bm9kZS5hc3luYzt0aGlzLnlpZWxkUG9zPTA7dGhpcy5hd2FpdFBvcz0wO3RoaXMuaW5GdW5jdGlvbj10cnVlO25vZGUucGFyYW1zPXRoaXMudG9Bc3NpZ25hYmxlTGlzdChwYXJhbXMsdHJ1ZSk7dGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLHRydWUpO3RoaXMuaW5HZW5lcmF0b3I9b2xkSW5HZW47dGhpcy5pbkFzeW5jPW9sZEluQXN5bmM7dGhpcy55aWVsZFBvcz1vbGRZaWVsZFBvczt0aGlzLmF3YWl0UG9zPW9sZEF3YWl0UG9zO3RoaXMuaW5GdW5jdGlvbj1vbGRJbkZ1bmM7cmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIpfTtwcCQzLnBhcnNlRnVuY3Rpb25Cb2R5PWZ1bmN0aW9uKG5vZGUsaXNBcnJvd0Z1bmN0aW9uKXt2YXIgaXNFeHByZXNzaW9uPWlzQXJyb3dGdW5jdGlvbiYmdGhpcy50eXBlIT09dHlwZXMuYnJhY2VMO3ZhciBvbGRTdHJpY3Q9dGhpcy5zdHJpY3QsdXNlU3RyaWN0PWZhbHNlO2lmKGlzRXhwcmVzc2lvbil7bm9kZS5ib2R5PXRoaXMucGFyc2VNYXliZUFzc2lnbigpO25vZGUuZXhwcmVzc2lvbj10cnVlO3RoaXMuY2hlY2tQYXJhbXMobm9kZSxmYWxzZSk7fWVsc2V7dmFyIG5vblNpbXBsZT10aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTcmJiF0aGlzLmlzU2ltcGxlUGFyYW1MaXN0KG5vZGUucGFyYW1zKTtpZighb2xkU3RyaWN0fHxub25TaW1wbGUpe3VzZVN0cmljdD10aGlzLnN0cmljdERpcmVjdGl2ZSh0aGlzLmVuZCk7aWYodXNlU3RyaWN0JiZub25TaW1wbGUpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwiSWxsZWdhbCAndXNlIHN0cmljdCcgZGlyZWN0aXZlIGluIGZ1bmN0aW9uIHdpdGggbm9uLXNpbXBsZSBwYXJhbWV0ZXIgbGlzdCIpO319CnZhciBvbGRMYWJlbHM9dGhpcy5sYWJlbHM7dGhpcy5sYWJlbHM9W107aWYodXNlU3RyaWN0KXt0aGlzLnN0cmljdD10cnVlO30KdGhpcy5jaGVja1BhcmFtcyhub2RlLCFvbGRTdHJpY3QmJiF1c2VTdHJpY3QmJiFpc0Fycm93RnVuY3Rpb24mJnRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpKTtub2RlLmJvZHk9dGhpcy5wYXJzZUJsb2NrKGZhbHNlKTtub2RlLmV4cHJlc3Npb249ZmFsc2U7dGhpcy5hZGFwdERpcmVjdGl2ZVByb2xvZ3VlKG5vZGUuYm9keS5ib2R5KTt0aGlzLmxhYmVscz1vbGRMYWJlbHM7fQp0aGlzLmV4aXRGdW5jdGlvblNjb3BlKCk7aWYodGhpcy5zdHJpY3QmJm5vZGUuaWQpe3RoaXMuY2hlY2tMVmFsKG5vZGUuaWQsIm5vbmUiKTt9CnRoaXMuc3RyaWN0PW9sZFN0cmljdDt9O3BwJDMuaXNTaW1wbGVQYXJhbUxpc3Q9ZnVuY3Rpb24ocGFyYW1zKXtmb3IodmFyIGk9MCxsaXN0PXBhcmFtcztpPGxpc3QubGVuZ3RoO2krPTEpCnt2YXIgcGFyYW09bGlzdFtpXTtpZihwYXJhbS50eXBlIT09IklkZW50aWZpZXIiKXtyZXR1cm4gZmFsc2V9fQpyZXR1cm4gdHJ1ZX07cHAkMy5jaGVja1BhcmFtcz1mdW5jdGlvbihub2RlLGFsbG93RHVwbGljYXRlcyl7dmFyIHRoaXMkMT10aGlzO3ZhciBuYW1lSGFzaD17fTtmb3IodmFyIGk9MCxsaXN0PW5vZGUucGFyYW1zO2k8bGlzdC5sZW5ndGg7aSs9MSkKe3ZhciBwYXJhbT1saXN0W2ldO3RoaXMkMS5jaGVja0xWYWwocGFyYW0sInZhciIsYWxsb3dEdXBsaWNhdGVzP251bGw6bmFtZUhhc2gpO319O3BwJDMucGFyc2VFeHByTGlzdD1mdW5jdGlvbihjbG9zZSxhbGxvd1RyYWlsaW5nQ29tbWEsYWxsb3dFbXB0eSxyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKXt2YXIgdGhpcyQxPXRoaXM7dmFyIGVsdHM9W10sZmlyc3Q9dHJ1ZTt3aGlsZSghdGhpcy5lYXQoY2xvc2UpKXtpZighZmlyc3Qpe3RoaXMkMS5leHBlY3QodHlwZXMuY29tbWEpO2lmKGFsbG93VHJhaWxpbmdDb21tYSYmdGhpcyQxLmFmdGVyVHJhaWxpbmdDb21tYShjbG9zZSkpe2JyZWFrfX1lbHNle2ZpcnN0PWZhbHNlO30KdmFyIGVsdD0odm9pZCAwKTtpZihhbGxvd0VtcHR5JiZ0aGlzJDEudHlwZT09PXR5cGVzLmNvbW1hKQp7ZWx0PW51bGw7fQplbHNlIGlmKHRoaXMkMS50eXBlPT09dHlwZXMuZWxsaXBzaXMpe2VsdD10aGlzJDEucGFyc2VTcHJlYWQocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7aWYocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyYmdGhpcyQxLnR5cGU9PT10eXBlcy5jb21tYSYmcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hPDApCntyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWE9dGhpcyQxLnN0YXJ0O319ZWxzZXtlbHQ9dGhpcyQxLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UscmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7fQplbHRzLnB1c2goZWx0KTt9CnJldHVybiBlbHRzfTtwcCQzLmNoZWNrVW5yZXNlcnZlZD1mdW5jdGlvbihyZWYpe3ZhciBzdGFydD1yZWYuc3RhcnQ7dmFyIGVuZD1yZWYuZW5kO3ZhciBuYW1lPXJlZi5uYW1lO2lmKHRoaXMuaW5HZW5lcmF0b3ImJm5hbWU9PT0ieWllbGQiKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCJDYW4gbm90IHVzZSAneWllbGQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGEgZ2VuZXJhdG9yIik7fQppZih0aGlzLmluQXN5bmMmJm5hbWU9PT0iYXdhaXQiKQp7dGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCJDYW4gbm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uIik7fQppZih0aGlzLmlzS2V5d29yZChuYW1lKSkKe3RoaXMucmFpc2Uoc3RhcnQsKCJVbmV4cGVjdGVkIGtleXdvcmQgJyIrbmFtZSsiJyIpKTt9CmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjw2JiZ0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LGVuZCkuaW5kZXhPZigiXFwiKSE9LTEpe3JldHVybn0KdmFyIHJlPXRoaXMuc3RyaWN0P3RoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdDp0aGlzLnJlc2VydmVkV29yZHM7aWYocmUudGVzdChuYW1lKSl7aWYoIXRoaXMuaW5Bc3luYyYmbmFtZT09PSJhd2FpdCIpCnt0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIkNhbiBub3QgdXNlIGtleXdvcmQgJ2F3YWl0JyBvdXRzaWRlIGFuIGFzeW5jIGZ1bmN0aW9uIik7fQp0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsKCJUaGUga2V5d29yZCAnIituYW1lKyInIGlzIHJlc2VydmVkIikpO319O3BwJDMucGFyc2VJZGVudD1mdW5jdGlvbihsaWJlcmFsLGlzQmluZGluZyl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKTtpZihsaWJlcmFsJiZ0aGlzLm9wdGlvbnMuYWxsb3dSZXNlcnZlZD09Im5ldmVyIil7bGliZXJhbD1mYWxzZTt9CmlmKHRoaXMudHlwZT09PXR5cGVzLm5hbWUpe25vZGUubmFtZT10aGlzLnZhbHVlO31lbHNlIGlmKHRoaXMudHlwZS5rZXl3b3JkKXtub2RlLm5hbWU9dGhpcy50eXBlLmtleXdvcmQ7aWYoKG5vZGUubmFtZT09PSJjbGFzcyJ8fG5vZGUubmFtZT09PSJmdW5jdGlvbiIpJiYodGhpcy5sYXN0VG9rRW5kIT09dGhpcy5sYXN0VG9rU3RhcnQrMXx8dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMubGFzdFRva1N0YXJ0KSE9PTQ2KSl7dGhpcy5jb250ZXh0LnBvcCgpO319ZWxzZXt0aGlzLnVuZXhwZWN0ZWQoKTt9CnRoaXMubmV4dCgpO3RoaXMuZmluaXNoTm9kZShub2RlLCJJZGVudGlmaWVyIik7aWYoIWxpYmVyYWwpe3RoaXMuY2hlY2tVbnJlc2VydmVkKG5vZGUpO30KcmV0dXJuIG5vZGV9O3BwJDMucGFyc2VZaWVsZD1mdW5jdGlvbigpe2lmKCF0aGlzLnlpZWxkUG9zKXt0aGlzLnlpZWxkUG9zPXRoaXMuc3RhcnQ7fQp2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpO3RoaXMubmV4dCgpO2lmKHRoaXMudHlwZT09dHlwZXMuc2VtaXx8dGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKXx8KHRoaXMudHlwZSE9dHlwZXMuc3RhciYmIXRoaXMudHlwZS5zdGFydHNFeHByKSl7bm9kZS5kZWxlZ2F0ZT1mYWxzZTtub2RlLmFyZ3VtZW50PW51bGw7fWVsc2V7bm9kZS5kZWxlZ2F0ZT10aGlzLmVhdCh0eXBlcy5zdGFyKTtub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZUFzc2lnbigpO30KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJZaWVsZEV4cHJlc3Npb24iKX07cHAkMy5wYXJzZUF3YWl0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuYXdhaXRQb3Mpe3RoaXMuYXdhaXRQb3M9dGhpcy5zdGFydDt9CnZhciBub2RlPXRoaXMuc3RhcnROb2RlKCk7dGhpcy5uZXh0KCk7bm9kZS5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLHRydWUpO3JldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiQXdhaXRFeHByZXNzaW9uIil9O3ZhciBwcCQ0PVBhcnNlci5wcm90b3R5cGU7cHAkNC5yYWlzZT1mdW5jdGlvbihwb3MsbWVzc2FnZSl7dmFyIGxvYz1nZXRMaW5lSW5mbyh0aGlzLmlucHV0LHBvcyk7bWVzc2FnZSs9IiAoIitsb2MubGluZSsiOiIrbG9jLmNvbHVtbisiKSI7dmFyIGVycj1uZXcgU3ludGF4RXJyb3IobWVzc2FnZSk7ZXJyLnBvcz1wb3M7ZXJyLmxvYz1sb2M7ZXJyLnJhaXNlZEF0PXRoaXMucG9zO3Rocm93IGVycn07cHAkNC5yYWlzZVJlY292ZXJhYmxlPXBwJDQucmFpc2U7cHAkNC5jdXJQb3NpdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpe3JldHVybiBuZXcgUG9zaXRpb24odGhpcy5jdXJMaW5lLHRoaXMucG9zLXRoaXMubGluZVN0YXJ0KX19O3ZhciBwcCQ1PVBhcnNlci5wcm90b3R5cGU7dmFyIGFzc2lnbj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe3ZhciBzb3VyY2VzPVtdLGxlbj1hcmd1bWVudHMubGVuZ3RoLTE7d2hpbGUobGVuLS0+MClzb3VyY2VzW2xlbl09YXJndW1lbnRzW2xlbisxXTtmb3IodmFyIGk9MCxsaXN0PXNvdXJjZXM7aTxsaXN0Lmxlbmd0aDtpKz0xKXt2YXIgc291cmNlPWxpc3RbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihoYXMoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fQpyZXR1cm4gdGFyZ2V0fTtwcCQ1LmVudGVyRnVuY3Rpb25TY29wZT1mdW5jdGlvbigpe3RoaXMuc2NvcGVTdGFjay5wdXNoKHt2YXI6e30sbGV4aWNhbDp7fSxjaGlsZFZhcjp7fSxwYXJlbnRMZXhpY2FsOnt9fSk7fTtwcCQ1LmV4aXRGdW5jdGlvblNjb3BlPWZ1bmN0aW9uKCl7dGhpcy5zY29wZVN0YWNrLnBvcCgpO307cHAkNS5lbnRlckxleGljYWxTY29wZT1mdW5jdGlvbigpe3ZhciBwYXJlbnRTY29wZT10aGlzLnNjb3BlU3RhY2tbdGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xXTt2YXIgY2hpbGRTY29wZT17dmFyOnt9LGxleGljYWw6e30sY2hpbGRWYXI6e30scGFyZW50TGV4aWNhbDp7fX07dGhpcy5zY29wZVN0YWNrLnB1c2goY2hpbGRTY29wZSk7YXNzaWduKGNoaWxkU2NvcGUucGFyZW50TGV4aWNhbCxwYXJlbnRTY29wZS5sZXhpY2FsLHBhcmVudFNjb3BlLnBhcmVudExleGljYWwpO307cHAkNS5leGl0TGV4aWNhbFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGNoaWxkU2NvcGU9dGhpcy5zY29wZVN0YWNrLnBvcCgpO3ZhciBwYXJlbnRTY29wZT10aGlzLnNjb3BlU3RhY2tbdGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xXTthc3NpZ24ocGFyZW50U2NvcGUuY2hpbGRWYXIsY2hpbGRTY29wZS52YXIsY2hpbGRTY29wZS5jaGlsZFZhcik7fTtwcCQ1LmNhbkRlY2xhcmVWYXJOYW1lPWZ1bmN0aW9uKG5hbWUpe3ZhciBjdXJyZW50U2NvcGU9dGhpcy5zY29wZVN0YWNrW3RoaXMuc2NvcGVTdGFjay5sZW5ndGgtMV07cmV0dXJuIWhhcyhjdXJyZW50U2NvcGUubGV4aWNhbCxuYW1lKSYmIWhhcyhjdXJyZW50U2NvcGUucGFyZW50TGV4aWNhbCxuYW1lKX07cHAkNS5jYW5EZWNsYXJlTGV4aWNhbE5hbWU9ZnVuY3Rpb24obmFtZSl7dmFyIGN1cnJlbnRTY29wZT10aGlzLnNjb3BlU3RhY2tbdGhpcy5zY29wZVN0YWNrLmxlbmd0aC0xXTtyZXR1cm4haGFzKGN1cnJlbnRTY29wZS5sZXhpY2FsLG5hbWUpJiYhaGFzKGN1cnJlbnRTY29wZS52YXIsbmFtZSkmJiFoYXMoY3VycmVudFNjb3BlLmNoaWxkVmFyLG5hbWUpfTtwcCQ1LmRlY2xhcmVWYXJOYW1lPWZ1bmN0aW9uKG5hbWUpe3RoaXMuc2NvcGVTdGFja1t0aGlzLnNjb3BlU3RhY2subGVuZ3RoLTFdLnZhcltuYW1lXT10cnVlO307cHAkNS5kZWNsYXJlTGV4aWNhbE5hbWU9ZnVuY3Rpb24obmFtZSl7dGhpcy5zY29wZVN0YWNrW3RoaXMuc2NvcGVTdGFjay5sZW5ndGgtMV0ubGV4aWNhbFtuYW1lXT10cnVlO307dmFyIE5vZGU9ZnVuY3Rpb24gTm9kZShwYXJzZXIscG9zLGxvYyl7dGhpcy50eXBlPSIiO3RoaXMuc3RhcnQ9cG9zO3RoaXMuZW5kPTA7aWYocGFyc2VyLm9wdGlvbnMubG9jYXRpb25zKQp7dGhpcy5sb2M9bmV3IFNvdXJjZUxvY2F0aW9uKHBhcnNlcixsb2MpO30KaWYocGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZSkKe3RoaXMuc291cmNlRmlsZT1wYXJzZXIub3B0aW9ucy5kaXJlY3RTb3VyY2VGaWxlO30KaWYocGFyc2VyLm9wdGlvbnMucmFuZ2VzKQp7dGhpcy5yYW5nZT1bcG9zLDBdO319O3ZhciBwcCQ2PVBhcnNlci5wcm90b3R5cGU7cHAkNi5zdGFydE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE5vZGUodGhpcyx0aGlzLnN0YXJ0LHRoaXMuc3RhcnRMb2MpfTtwcCQ2LnN0YXJ0Tm9kZUF0PWZ1bmN0aW9uKHBvcyxsb2Mpe3JldHVybiBuZXcgTm9kZSh0aGlzLHBvcyxsb2MpfTtmdW5jdGlvbiBmaW5pc2hOb2RlQXQobm9kZSx0eXBlLHBvcyxsb2Mpe25vZGUudHlwZT10eXBlO25vZGUuZW5kPXBvcztpZih0aGlzLm9wdGlvbnMubG9jYXRpb25zKQp7bm9kZS5sb2MuZW5kPWxvYzt9CmlmKHRoaXMub3B0aW9ucy5yYW5nZXMpCntub2RlLnJhbmdlWzFdPXBvczt9CnJldHVybiBub2RlfQpwcCQ2LmZpbmlzaE5vZGU9ZnVuY3Rpb24obm9kZSx0eXBlKXtyZXR1cm4gZmluaXNoTm9kZUF0LmNhbGwodGhpcyxub2RlLHR5cGUsdGhpcy5sYXN0VG9rRW5kLHRoaXMubGFzdFRva0VuZExvYyl9O3BwJDYuZmluaXNoTm9kZUF0PWZ1bmN0aW9uKG5vZGUsdHlwZSxwb3MsbG9jKXtyZXR1cm4gZmluaXNoTm9kZUF0LmNhbGwodGhpcyxub2RlLHR5cGUscG9zLGxvYyl9O3ZhciBUb2tDb250ZXh0PWZ1bmN0aW9uIFRva0NvbnRleHQodG9rZW4saXNFeHByLHByZXNlcnZlU3BhY2Usb3ZlcnJpZGUsZ2VuZXJhdG9yKXt0aGlzLnRva2VuPXRva2VuO3RoaXMuaXNFeHByPSEhaXNFeHByO3RoaXMucHJlc2VydmVTcGFjZT0hIXByZXNlcnZlU3BhY2U7dGhpcy5vdmVycmlkZT1vdmVycmlkZTt0aGlzLmdlbmVyYXRvcj0hIWdlbmVyYXRvcjt9O3ZhciB0eXBlcyQxPXtiX3N0YXQ6bmV3IFRva0NvbnRleHQoInsiLGZhbHNlKSxiX2V4cHI6bmV3IFRva0NvbnRleHQoInsiLHRydWUpLGJfdG1wbDpuZXcgVG9rQ29udGV4dCgiJHsiLGZhbHNlKSxwX3N0YXQ6bmV3IFRva0NvbnRleHQoIigiLGZhbHNlKSxwX2V4cHI6bmV3IFRva0NvbnRleHQoIigiLHRydWUpLHFfdG1wbDpuZXcgVG9rQ29udGV4dCgiYCIsdHJ1ZSx0cnVlLGZ1bmN0aW9uKHApe3JldHVybiBwLnRyeVJlYWRUZW1wbGF0ZVRva2VuKCk7fSksZl9zdGF0Om5ldyBUb2tDb250ZXh0KCJmdW5jdGlvbiIsZmFsc2UpLGZfZXhwcjpuZXcgVG9rQ29udGV4dCgiZnVuY3Rpb24iLHRydWUpLGZfZXhwcl9nZW46bmV3IFRva0NvbnRleHQoImZ1bmN0aW9uIix0cnVlLGZhbHNlLG51bGwsdHJ1ZSksZl9nZW46bmV3IFRva0NvbnRleHQoImZ1bmN0aW9uIixmYWxzZSxmYWxzZSxudWxsLHRydWUpfTt2YXIgcHAkNz1QYXJzZXIucHJvdG90eXBlO3BwJDcuaW5pdGlhbENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm5bdHlwZXMkMS5iX3N0YXRdfTtwcCQ3LmJyYWNlSXNCbG9jaz1mdW5jdGlvbihwcmV2VHlwZSl7dmFyIHBhcmVudD10aGlzLmN1ckNvbnRleHQoKTtpZihwYXJlbnQ9PT10eXBlcyQxLmZfZXhwcnx8cGFyZW50PT09dHlwZXMkMS5mX3N0YXQpCntyZXR1cm4gdHJ1ZX0KaWYocHJldlR5cGU9PT10eXBlcy5jb2xvbiYmKHBhcmVudD09PXR5cGVzJDEuYl9zdGF0fHxwYXJlbnQ9PT10eXBlcyQxLmJfZXhwcikpCntyZXR1cm4hcGFyZW50LmlzRXhwcn0KaWYocHJldlR5cGU9PT10eXBlcy5fcmV0dXJufHxwcmV2VHlwZT09dHlwZXMubmFtZSYmdGhpcy5leHByQWxsb3dlZCkKe3JldHVybiBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCx0aGlzLnN0YXJ0KSl9CmlmKHByZXZUeXBlPT09dHlwZXMuX2Vsc2V8fHByZXZUeXBlPT09dHlwZXMuc2VtaXx8cHJldlR5cGU9PT10eXBlcy5lb2Z8fHByZXZUeXBlPT09dHlwZXMucGFyZW5SfHxwcmV2VHlwZT09dHlwZXMuYXJyb3cpCntyZXR1cm4gdHJ1ZX0KaWYocHJldlR5cGU9PXR5cGVzLmJyYWNlTCkKe3JldHVybiBwYXJlbnQ9PT10eXBlcyQxLmJfc3RhdH0KaWYocHJldlR5cGU9PXR5cGVzLl92YXJ8fHByZXZUeXBlPT10eXBlcy5uYW1lKQp7cmV0dXJuIGZhbHNlfQpyZXR1cm4hdGhpcy5leHByQWxsb3dlZH07cHAkNy5pbkdlbmVyYXRvckNvbnRleHQ9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBpPXRoaXMuY29udGV4dC5sZW5ndGgtMTtpPj0xO2ktLSl7dmFyIGNvbnRleHQ9dGhpcyQxLmNvbnRleHRbaV07aWYoY29udGV4dC50b2tlbj09PSJmdW5jdGlvbiIpCntyZXR1cm4gY29udGV4dC5nZW5lcmF0b3J9fQpyZXR1cm4gZmFsc2V9O3BwJDcudXBkYXRlQ29udGV4dD1mdW5jdGlvbihwcmV2VHlwZSl7dmFyIHVwZGF0ZSx0eXBlPXRoaXMudHlwZTtpZih0eXBlLmtleXdvcmQmJnByZXZUeXBlPT10eXBlcy5kb3QpCnt0aGlzLmV4cHJBbGxvd2VkPWZhbHNlO30KZWxzZSBpZih1cGRhdGU9dHlwZS51cGRhdGVDb250ZXh0KQp7dXBkYXRlLmNhbGwodGhpcyxwcmV2VHlwZSk7fQplbHNlCnt0aGlzLmV4cHJBbGxvd2VkPXR5cGUuYmVmb3JlRXhwcjt9fTt0eXBlcy5wYXJlblIudXBkYXRlQ29udGV4dD10eXBlcy5icmFjZVIudXBkYXRlQ29udGV4dD1mdW5jdGlvbigpe2lmKHRoaXMuY29udGV4dC5sZW5ndGg9PTEpe3RoaXMuZXhwckFsbG93ZWQ9dHJ1ZTtyZXR1cm59CnZhciBvdXQ9dGhpcy5jb250ZXh0LnBvcCgpO2lmKG91dD09PXR5cGVzJDEuYl9zdGF0JiZ0aGlzLmN1ckNvbnRleHQoKS50b2tlbj09PSJmdW5jdGlvbiIpe291dD10aGlzLmNvbnRleHQucG9wKCk7fQp0aGlzLmV4cHJBbGxvd2VkPSFvdXQuaXNFeHByO307dHlwZXMuYnJhY2VMLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24ocHJldlR5cGUpe3RoaXMuY29udGV4dC5wdXNoKHRoaXMuYnJhY2VJc0Jsb2NrKHByZXZUeXBlKT90eXBlcyQxLmJfc3RhdDp0eXBlcyQxLmJfZXhwcik7dGhpcy5leHByQWxsb3dlZD10cnVlO307dHlwZXMuZG9sbGFyQnJhY2VMLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLmJfdG1wbCk7dGhpcy5leHByQWxsb3dlZD10cnVlO307dHlwZXMucGFyZW5MLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24ocHJldlR5cGUpe3ZhciBzdGF0ZW1lbnRQYXJlbnM9cHJldlR5cGU9PT10eXBlcy5faWZ8fHByZXZUeXBlPT09dHlwZXMuX2Zvcnx8cHJldlR5cGU9PT10eXBlcy5fd2l0aHx8cHJldlR5cGU9PT10eXBlcy5fd2hpbGU7dGhpcy5jb250ZXh0LnB1c2goc3RhdGVtZW50UGFyZW5zP3R5cGVzJDEucF9zdGF0OnR5cGVzJDEucF9leHByKTt0aGlzLmV4cHJBbGxvd2VkPXRydWU7fTt0eXBlcy5pbmNEZWMudXBkYXRlQ29udGV4dD1mdW5jdGlvbigpe307dHlwZXMuX2Z1bmN0aW9uLnVwZGF0ZUNvbnRleHQ9dHlwZXMuX2NsYXNzLnVwZGF0ZUNvbnRleHQ9ZnVuY3Rpb24ocHJldlR5cGUpe2lmKHByZXZUeXBlLmJlZm9yZUV4cHImJnByZXZUeXBlIT09dHlwZXMuc2VtaSYmcHJldlR5cGUhPT10eXBlcy5fZWxzZSYmISgocHJldlR5cGU9PT10eXBlcy5jb2xvbnx8cHJldlR5cGU9PT10eXBlcy5icmFjZUwpJiZ0aGlzLmN1ckNvbnRleHQoKT09PXR5cGVzJDEuYl9zdGF0KSkKe3RoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEuZl9leHByKTt9CmVsc2UKe3RoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEuZl9zdGF0KTt9CnRoaXMuZXhwckFsbG93ZWQ9ZmFsc2U7fTt0eXBlcy5iYWNrUXVvdGUudXBkYXRlQ29udGV4dD1mdW5jdGlvbigpe2lmKHRoaXMuY3VyQ29udGV4dCgpPT09dHlwZXMkMS5xX3RtcGwpCnt0aGlzLmNvbnRleHQucG9wKCk7fQplbHNlCnt0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLnFfdG1wbCk7fQp0aGlzLmV4cHJBbGxvd2VkPWZhbHNlO307dHlwZXMuc3Rhci51cGRhdGVDb250ZXh0PWZ1bmN0aW9uKHByZXZUeXBlKXtpZihwcmV2VHlwZT09dHlwZXMuX2Z1bmN0aW9uKXt2YXIgaW5kZXg9dGhpcy5jb250ZXh0Lmxlbmd0aC0xO2lmKHRoaXMuY29udGV4dFtpbmRleF09PT10eXBlcyQxLmZfZXhwcikKe3RoaXMuY29udGV4dFtpbmRleF09dHlwZXMkMS5mX2V4cHJfZ2VuO30KZWxzZQp7dGhpcy5jb250ZXh0W2luZGV4XT10eXBlcyQxLmZfZ2VuO319CnRoaXMuZXhwckFsbG93ZWQ9dHJ1ZTt9O3R5cGVzLm5hbWUudXBkYXRlQ29udGV4dD1mdW5jdGlvbihwcmV2VHlwZSl7dmFyIGFsbG93ZWQ9ZmFsc2U7aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXtpZih0aGlzLnZhbHVlPT0ib2YiJiYhdGhpcy5leHByQWxsb3dlZHx8dGhpcy52YWx1ZT09InlpZWxkIiYmdGhpcy5pbkdlbmVyYXRvckNvbnRleHQoKSkKe2FsbG93ZWQ9dHJ1ZTt9fQp0aGlzLmV4cHJBbGxvd2VkPWFsbG93ZWQ7fTt2YXIgZGF0YT17IiRMT05FIjpbIkFTQ0lJIiwiQVNDSUlfSGV4X0RpZ2l0IiwiQUhleCIsIkFscGhhYmV0aWMiLCJBbHBoYSIsIkFueSIsIkFzc2lnbmVkIiwiQmlkaV9Db250cm9sIiwiQmlkaV9DIiwiQmlkaV9NaXJyb3JlZCIsIkJpZGlfTSIsIkNhc2VfSWdub3JhYmxlIiwiQ0kiLCJDYXNlZCIsIkNoYW5nZXNfV2hlbl9DYXNlZm9sZGVkIiwiQ1dDRiIsIkNoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIiwiQ1dDTSIsIkNoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkIiwiQ1dMIiwiQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZCIsIkNXS0NGIiwiQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQiLCJDV1QiLCJDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZCIsIkNXVSIsIkRhc2giLCJEZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50IiwiREkiLCJEZXByZWNhdGVkIiwiRGVwIiwiRGlhY3JpdGljIiwiRGlhIiwiRW1vamkiLCJFbW9qaV9Db21wb25lbnQiLCJFbW9qaV9Nb2RpZmllciIsIkVtb2ppX01vZGlmaWVyX0Jhc2UiLCJFbW9qaV9QcmVzZW50YXRpb24iLCJFeHRlbmRlciIsIkV4dCIsIkdyYXBoZW1lX0Jhc2UiLCJHcl9CYXNlIiwiR3JhcGhlbWVfRXh0ZW5kIiwiR3JfRXh0IiwiSGV4X0RpZ2l0IiwiSGV4IiwiSURTX0JpbmFyeV9PcGVyYXRvciIsIklEU0IiLCJJRFNfVHJpbmFyeV9PcGVyYXRvciIsIklEU1QiLCJJRF9Db250aW51ZSIsIklEQyIsIklEX1N0YXJ0IiwiSURTIiwiSWRlb2dyYXBoaWMiLCJJZGVvIiwiSm9pbl9Db250cm9sIiwiSm9pbl9DIiwiTG9naWNhbF9PcmRlcl9FeGNlcHRpb24iLCJMT0UiLCJMb3dlcmNhc2UiLCJMb3dlciIsIk1hdGgiLCJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludCIsIk5DaGFyIiwiUGF0dGVybl9TeW50YXgiLCJQYXRfU3luIiwiUGF0dGVybl9XaGl0ZV9TcGFjZSIsIlBhdF9XUyIsIlF1b3RhdGlvbl9NYXJrIiwiUU1hcmsiLCJSYWRpY2FsIiwiUmVnaW9uYWxfSW5kaWNhdG9yIiwiUkkiLCJTZW50ZW5jZV9UZXJtaW5hbCIsIlNUZXJtIiwiU29mdF9Eb3R0ZWQiLCJTRCIsIlRlcm1pbmFsX1B1bmN0dWF0aW9uIiwiVGVybSIsIlVuaWZpZWRfSWRlb2dyYXBoIiwiVUlkZW8iLCJVcHBlcmNhc2UiLCJVcHBlciIsIlZhcmlhdGlvbl9TZWxlY3RvciIsIlZTIiwiV2hpdGVfU3BhY2UiLCJzcGFjZSIsIlhJRF9Db250aW51ZSIsIlhJREMiLCJYSURfU3RhcnQiLCJYSURTIl0sIkdlbmVyYWxfQ2F0ZWdvcnkiOlsiQ2FzZWRfTGV0dGVyIiwiTEMiLCJDbG9zZV9QdW5jdHVhdGlvbiIsIlBlIiwiQ29ubmVjdG9yX1B1bmN0dWF0aW9uIiwiUGMiLCJDb250cm9sIiwiQ2MiLCJjbnRybCIsIkN1cnJlbmN5X1N5bWJvbCIsIlNjIiwiRGFzaF9QdW5jdHVhdGlvbiIsIlBkIiwiRGVjaW1hbF9OdW1iZXIiLCJOZCIsImRpZ2l0IiwiRW5jbG9zaW5nX01hcmsiLCJNZSIsIkZpbmFsX1B1bmN0dWF0aW9uIiwiUGYiLCJGb3JtYXQiLCJDZiIsIkluaXRpYWxfUHVuY3R1YXRpb24iLCJQaSIsIkxldHRlciIsIkwiLCJMZXR0ZXJfTnVtYmVyIiwiTmwiLCJMaW5lX1NlcGFyYXRvciIsIlpsIiwiTG93ZXJjYXNlX0xldHRlciIsIkxsIiwiTWFyayIsIk0iLCJDb21iaW5pbmdfTWFyayIsIk1hdGhfU3ltYm9sIiwiU20iLCJNb2RpZmllcl9MZXR0ZXIiLCJMbSIsIk1vZGlmaWVyX1N5bWJvbCIsIlNrIiwiTm9uc3BhY2luZ19NYXJrIiwiTW4iLCJOdW1iZXIiLCJOIiwiT3Blbl9QdW5jdHVhdGlvbiIsIlBzIiwiT3RoZXIiLCJDIiwiT3RoZXJfTGV0dGVyIiwiTG8iLCJPdGhlcl9OdW1iZXIiLCJObyIsIk90aGVyX1B1bmN0dWF0aW9uIiwiUG8iLCJPdGhlcl9TeW1ib2wiLCJTbyIsIlBhcmFncmFwaF9TZXBhcmF0b3IiLCJacCIsIlByaXZhdGVfVXNlIiwiQ28iLCJQdW5jdHVhdGlvbiIsIlAiLCJwdW5jdCIsIlNlcGFyYXRvciIsIloiLCJTcGFjZV9TZXBhcmF0b3IiLCJacyIsIlNwYWNpbmdfTWFyayIsIk1jIiwiU3Vycm9nYXRlIiwiQ3MiLCJTeW1ib2wiLCJTIiwiVGl0bGVjYXNlX0xldHRlciIsIkx0IiwiVW5hc3NpZ25lZCIsIkNuIiwiVXBwZXJjYXNlX0xldHRlciIsIkx1Il0sIlNjcmlwdCI6WyJBZGxhbSIsIkFkbG0iLCJBaG9tIiwiQW5hdG9saWFuX0hpZXJvZ2x5cGhzIiwiSGx1dyIsIkFyYWJpYyIsIkFyYWIiLCJBcm1lbmlhbiIsIkFybW4iLCJBdmVzdGFuIiwiQXZzdCIsIkJhbGluZXNlIiwiQmFsaSIsIkJhbXVtIiwiQmFtdSIsIkJhc3NhX1ZhaCIsIkJhc3MiLCJCYXRhayIsIkJhdGsiLCJCZW5nYWxpIiwiQmVuZyIsIkJoYWlrc3VraSIsIkJoa3MiLCJCb3BvbW9mbyIsIkJvcG8iLCJCcmFobWkiLCJCcmFoIiwiQnJhaWxsZSIsIkJyYWkiLCJCdWdpbmVzZSIsIkJ1Z2kiLCJCdWhpZCIsIkJ1aGQiLCJDYW5hZGlhbl9BYm9yaWdpbmFsIiwiQ2FucyIsIkNhcmlhbiIsIkNhcmkiLCJDYXVjYXNpYW5fQWxiYW5pYW4iLCJBZ2hiIiwiQ2hha21hIiwiQ2FrbSIsIkNoYW0iLCJDaGVyb2tlZSIsIkNoZXIiLCJDb21tb24iLCJaeXl5IiwiQ29wdGljIiwiQ29wdCIsIlFhYWMiLCJDdW5laWZvcm0iLCJYc3V4IiwiQ3lwcmlvdCIsIkNwcnQiLCJDeXJpbGxpYyIsIkN5cmwiLCJEZXNlcmV0IiwiRHNydCIsIkRldmFuYWdhcmkiLCJEZXZhIiwiRHVwbG95YW4iLCJEdXBsIiwiRWd5cHRpYW5fSGllcm9nbHlwaHMiLCJFZ3lwIiwiRWxiYXNhbiIsIkVsYmEiLCJFdGhpb3BpYyIsIkV0aGkiLCJHZW9yZ2lhbiIsIkdlb3IiLCJHbGFnb2xpdGljIiwiR2xhZyIsIkdvdGhpYyIsIkdvdGgiLCJHcmFudGhhIiwiR3JhbiIsIkdyZWVrIiwiR3JlayIsIkd1amFyYXRpIiwiR3VqciIsIkd1cm11a2hpIiwiR3VydSIsIkhhbiIsIkhhbmkiLCJIYW5ndWwiLCJIYW5nIiwiSGFudW5vbyIsIkhhbm8iLCJIYXRyYW4iLCJIYXRyIiwiSGVicmV3IiwiSGViciIsIkhpcmFnYW5hIiwiSGlyYSIsIkltcGVyaWFsX0FyYW1haWMiLCJBcm1pIiwiSW5oZXJpdGVkIiwiWmluaCIsIlFhYWkiLCJJbnNjcmlwdGlvbmFsX1BhaGxhdmkiLCJQaGxpIiwiSW5zY3JpcHRpb25hbF9QYXJ0aGlhbiIsIlBydGkiLCJKYXZhbmVzZSIsIkphdmEiLCJLYWl0aGkiLCJLdGhpIiwiS2FubmFkYSIsIktuZGEiLCJLYXRha2FuYSIsIkthbmEiLCJLYXlhaF9MaSIsIkthbGkiLCJLaGFyb3NodGhpIiwiS2hhciIsIktobWVyIiwiS2htciIsIktob2praSIsIktob2oiLCJLaHVkYXdhZGkiLCJTaW5kIiwiTGFvIiwiTGFvbyIsIkxhdGluIiwiTGF0biIsIkxlcGNoYSIsIkxlcGMiLCJMaW1idSIsIkxpbWIiLCJMaW5lYXJfQSIsIkxpbmEiLCJMaW5lYXJfQiIsIkxpbmIiLCJMaXN1IiwiTHljaWFuIiwiTHljaSIsIkx5ZGlhbiIsIkx5ZGkiLCJNYWhhamFuaSIsIk1haGoiLCJNYWxheWFsYW0iLCJNbHltIiwiTWFuZGFpYyIsIk1hbmQiLCJNYW5pY2hhZWFuIiwiTWFuaSIsIk1hcmNoZW4iLCJNYXJjIiwiTWFzYXJhbV9Hb25kaSIsIkdvbm0iLCJNZWV0ZWlfTWF5ZWsiLCJNdGVpIiwiTWVuZGVfS2lrYWt1aSIsIk1lbmQiLCJNZXJvaXRpY19DdXJzaXZlIiwiTWVyYyIsIk1lcm9pdGljX0hpZXJvZ2x5cGhzIiwiTWVybyIsIk1pYW8iLCJQbHJkIiwiTW9kaSIsIk1vbmdvbGlhbiIsIk1vbmciLCJNcm8iLCJNcm9vIiwiTXVsdGFuaSIsIk11bHQiLCJNeWFubWFyIiwiTXltciIsIk5hYmF0YWVhbiIsIk5iYXQiLCJOZXdfVGFpX0x1ZSIsIlRhbHUiLCJOZXdhIiwiTmtvIiwiTmtvbyIsIk51c2h1IiwiTnNodSIsIk9naGFtIiwiT2dhbSIsIk9sX0NoaWtpIiwiT2xjayIsIk9sZF9IdW5nYXJpYW4iLCJIdW5nIiwiT2xkX0l0YWxpYyIsIkl0YWwiLCJPbGRfTm9ydGhfQXJhYmlhbiIsIk5hcmIiLCJPbGRfUGVybWljIiwiUGVybSIsIk9sZF9QZXJzaWFuIiwiWHBlbyIsIk9sZF9Tb3V0aF9BcmFiaWFuIiwiU2FyYiIsIk9sZF9UdXJraWMiLCJPcmtoIiwiT3JpeWEiLCJPcnlhIiwiT3NhZ2UiLCJPc2dlIiwiT3NtYW55YSIsIk9zbWEiLCJQYWhhd2hfSG1vbmciLCJIbW5nIiwiUGFsbXlyZW5lIiwiUGFsbSIsIlBhdV9DaW5fSGF1IiwiUGF1YyIsIlBoYWdzX1BhIiwiUGhhZyIsIlBob2VuaWNpYW4iLCJQaG54IiwiUHNhbHRlcl9QYWhsYXZpIiwiUGhscCIsIlJlamFuZyIsIlJqbmciLCJSdW5pYyIsIlJ1bnIiLCJTYW1hcml0YW4iLCJTYW1yIiwiU2F1cmFzaHRyYSIsIlNhdXIiLCJTaGFyYWRhIiwiU2hyZCIsIlNoYXZpYW4iLCJTaGF3IiwiU2lkZGhhbSIsIlNpZGQiLCJTaWduV3JpdGluZyIsIlNnbnciLCJTaW5oYWxhIiwiU2luaCIsIlNvcmFfU29tcGVuZyIsIlNvcmEiLCJTb3lvbWJvIiwiU295byIsIlN1bmRhbmVzZSIsIlN1bmQiLCJTeWxvdGlfTmFncmkiLCJTeWxvIiwiU3lyaWFjIiwiU3lyYyIsIlRhZ2Fsb2ciLCJUZ2xnIiwiVGFnYmFud2EiLCJUYWdiIiwiVGFpX0xlIiwiVGFsZSIsIlRhaV9UaGFtIiwiTGFuYSIsIlRhaV9WaWV0IiwiVGF2dCIsIlRha3JpIiwiVGFrciIsIlRhbWlsIiwiVGFtbCIsIlRhbmd1dCIsIlRhbmciLCJUZWx1Z3UiLCJUZWx1IiwiVGhhYW5hIiwiVGhhYSIsIlRoYWkiLCJUaWJldGFuIiwiVGlidCIsIlRpZmluYWdoIiwiVGZuZyIsIlRpcmh1dGEiLCJUaXJoIiwiVWdhcml0aWMiLCJVZ2FyIiwiVmFpIiwiVmFpaSIsIldhcmFuZ19DaXRpIiwiV2FyYSIsIllpIiwiWWlpaSIsIlphbmFiYXphcl9TcXVhcmUiLCJaYW5iIl19O0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhdGEuJExPTkUsZGF0YS5HZW5lcmFsX0NhdGVnb3J5KTtkYXRhLmdjPWRhdGEuR2VuZXJhbF9DYXRlZ29yeTtkYXRhLnNjPWRhdGEuU2NyaXB0X0V4dGVuc2lvbnM9ZGF0YS5zY3g9ZGF0YS5TY3JpcHQ7dmFyIHBwJDk9UGFyc2VyLnByb3RvdHlwZTt2YXIgUmVnRXhwVmFsaWRhdGlvblN0YXRlPWZ1bmN0aW9uIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZShwYXJzZXIpe3RoaXMucGFyc2VyPXBhcnNlcjt0aGlzLnZhbGlkRmxhZ3M9ImdpbSIrKHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uPj02PyJ1eSI6IiIpKyhwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbj49OT8icyI6IiIpO3RoaXMuc291cmNlPSIiO3RoaXMuZmxhZ3M9IiI7dGhpcy5zdGFydD0wO3RoaXMuc3dpdGNoVT1mYWxzZTt0aGlzLnN3aXRjaE49ZmFsc2U7dGhpcy5wb3M9MDt0aGlzLmxhc3RJbnRWYWx1ZT0wO3RoaXMubGFzdFN0cmluZ1ZhbHVlPSIiO3RoaXMubGFzdEFzc2VydGlvbklzUXVhbnRpZmlhYmxlPWZhbHNlO3RoaXMubnVtQ2FwdHVyaW5nUGFyZW5zPTA7dGhpcy5tYXhCYWNrUmVmZXJlbmNlPTA7dGhpcy5ncm91cE5hbWVzPVtdO3RoaXMuYmFja1JlZmVyZW5jZU5hbWVzPVtdO307UmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbiByZXNldChzdGFydCxwYXR0ZXJuLGZsYWdzKXt2YXIgdW5pY29kZT1mbGFncy5pbmRleE9mKCJ1IikhPT0tMTt0aGlzLnN0YXJ0PXN0YXJ0fDA7dGhpcy5zb3VyY2U9cGF0dGVybisiIjt0aGlzLmZsYWdzPWZsYWdzO3RoaXMuc3dpdGNoVT11bmljb2RlJiZ0aGlzLnBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uPj02O3RoaXMuc3dpdGNoTj11bmljb2RlJiZ0aGlzLnBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uPj05O307UmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5yYWlzZT1mdW5jdGlvbiByYWlzZShtZXNzYWdlKXt0aGlzLnBhcnNlci5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsKCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjogLyIrKHRoaXMuc291cmNlKSsiLzogIittZXNzYWdlKSk7fTtSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmF0PWZ1bmN0aW9uIGF0KGkpe3ZhciBzPXRoaXMuc291cmNlO3ZhciBsPXMubGVuZ3RoO2lmKGk+PWwpe3JldHVybi0xfQp2YXIgYz1zLmNoYXJDb2RlQXQoaSk7aWYoIXRoaXMuc3dpdGNoVXx8Yzw9MHhEN0ZGfHxjPj0weEUwMDB8fGkrMT49bCl7cmV0dXJuIGN9CnJldHVybihjPDwxMCkrcy5jaGFyQ29kZUF0KGkrMSktMHgzNUZEQzAwfTtSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLm5leHRJbmRleD1mdW5jdGlvbiBuZXh0SW5kZXgoaSl7dmFyIHM9dGhpcy5zb3VyY2U7dmFyIGw9cy5sZW5ndGg7aWYoaT49bCl7cmV0dXJuIGx9CnZhciBjPXMuY2hhckNvZGVBdChpKTtpZighdGhpcy5zd2l0Y2hVfHxjPD0weEQ3RkZ8fGM+PTB4RTAwMHx8aSsxPj1sKXtyZXR1cm4gaSsxfQpyZXR1cm4gaSsyfTtSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmN1cnJlbnQ9ZnVuY3Rpb24gY3VycmVudCgpe3JldHVybiB0aGlzLmF0KHRoaXMucG9zKX07UmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5sb29rYWhlYWQ9ZnVuY3Rpb24gbG9va2FoZWFkKCl7cmV0dXJuIHRoaXMuYXQodGhpcy5uZXh0SW5kZXgodGhpcy5wb3MpKX07UmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5hZHZhbmNlPWZ1bmN0aW9uIGFkdmFuY2UoKXt0aGlzLnBvcz10aGlzLm5leHRJbmRleCh0aGlzLnBvcyk7fTtSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmVhdD1mdW5jdGlvbiBlYXQoY2gpe2lmKHRoaXMuY3VycmVudCgpPT09Y2gpe3RoaXMuYWR2YW5jZSgpO3JldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O2Z1bmN0aW9uIGNvZGVQb2ludFRvU3RyaW5nJDEoY2gpe2lmKGNoPD0weEZGRkYpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0KY2gtPTB4MTAwMDA7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNoPj4xMCkrMHhEODAwLChjaCYweDAzRkYpKzB4REMwMCl9CnBwJDkudmFsaWRhdGVSZWdFeHBGbGFncz1mdW5jdGlvbihzdGF0ZSl7dmFyIHRoaXMkMT10aGlzO3ZhciB2YWxpZEZsYWdzPXN0YXRlLnZhbGlkRmxhZ3M7dmFyIGZsYWdzPXN0YXRlLmZsYWdzO2Zvcih2YXIgaT0wO2k8ZmxhZ3MubGVuZ3RoO2krKyl7dmFyIGZsYWc9ZmxhZ3MuY2hhckF0KGkpO2lmKHZhbGlkRmxhZ3MuaW5kZXhPZihmbGFnKT09LTEpe3RoaXMkMS5yYWlzZShzdGF0ZS5zdGFydCwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZyIpO30KaWYoZmxhZ3MuaW5kZXhPZihmbGFnLGkrMSk+LTEpe3RoaXMkMS5yYWlzZShzdGF0ZS5zdGFydCwiRHVwbGljYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnIik7fX19O3BwJDkudmFsaWRhdGVSZWdFeHBQYXR0ZXJuPWZ1bmN0aW9uKHN0YXRlKXt0aGlzLnJlZ2V4cF9wYXR0ZXJuKHN0YXRlKTtpZighc3RhdGUuc3dpdGNoTiYmdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05JiZzdGF0ZS5ncm91cE5hbWVzLmxlbmd0aD4wKXtzdGF0ZS5zd2l0Y2hOPXRydWU7dGhpcy5yZWdleHBfcGF0dGVybihzdGF0ZSk7fX07cHAkOS5yZWdleHBfcGF0dGVybj1mdW5jdGlvbihzdGF0ZSl7c3RhdGUucG9zPTA7c3RhdGUubGFzdEludFZhbHVlPTA7c3RhdGUubGFzdFN0cmluZ1ZhbHVlPSIiO3N0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZT1mYWxzZTtzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnM9MDtzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlPTA7c3RhdGUuZ3JvdXBOYW1lcy5sZW5ndGg9MDtzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXMubGVuZ3RoPTA7dGhpcy5yZWdleHBfZGlzanVuY3Rpb24oc3RhdGUpO2lmKHN0YXRlLnBvcyE9PXN0YXRlLnNvdXJjZS5sZW5ndGgpe2lmKHN0YXRlLmVhdCgweDI5KSl7c3RhdGUucmFpc2UoIlVubWF0Y2hlZCAnKSciKTt9CmlmKHN0YXRlLmVhdCgweDVEKXx8c3RhdGUuZWF0KDB4N0QpKXtzdGF0ZS5yYWlzZSgiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzIik7fX0KaWYoc3RhdGUubWF4QmFja1JlZmVyZW5jZT5zdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMpe3N0YXRlLnJhaXNlKCJJbnZhbGlkIGVzY2FwZSIpO30KZm9yKHZhciBpPTAsbGlzdD1zdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXM7aTxsaXN0Lmxlbmd0aDtpKz0xKXt2YXIgbmFtZT1saXN0W2ldO2lmKHN0YXRlLmdyb3VwTmFtZXMuaW5kZXhPZihuYW1lKT09PS0xKXtzdGF0ZS5yYWlzZSgiSW52YWxpZCBuYW1lZCBjYXB0dXJlIHJlZmVyZW5jZWQiKTt9fX07cHAkOS5yZWdleHBfZGlzanVuY3Rpb249ZnVuY3Rpb24oc3RhdGUpe3ZhciB0aGlzJDE9dGhpczt0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7d2hpbGUoc3RhdGUuZWF0KDB4N0MpKXt0aGlzJDEucmVnZXhwX2FsdGVybmF0aXZlKHN0YXRlKTt9CmlmKHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXIoc3RhdGUsdHJ1ZSkpe3N0YXRlLnJhaXNlKCJOb3RoaW5nIHRvIHJlcGVhdCIpO30KaWYoc3RhdGUuZWF0KDB4N0IpKXtzdGF0ZS5yYWlzZSgiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzIik7fX07cHAkOS5yZWdleHBfYWx0ZXJuYXRpdmU9ZnVuY3Rpb24oc3RhdGUpe3doaWxlKHN0YXRlLnBvczxzdGF0ZS5zb3VyY2UubGVuZ3RoJiZ0aGlzLnJlZ2V4cF9lYXRUZXJtKHN0YXRlKSkKe319O3BwJDkucmVnZXhwX2VhdFRlcm09ZnVuY3Rpb24oc3RhdGUpe2lmKHRoaXMucmVnZXhwX2VhdEFzc2VydGlvbihzdGF0ZSkpe2lmKHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSYmdGhpcy5yZWdleHBfZWF0UXVhbnRpZmllcihzdGF0ZSkpe2lmKHN0YXRlLnN3aXRjaFUpe3N0YXRlLnJhaXNlKCJJbnZhbGlkIHF1YW50aWZpZXIiKTt9fQpyZXR1cm4gdHJ1ZX0KaWYoc3RhdGUuc3dpdGNoVT90aGlzLnJlZ2V4cF9lYXRBdG9tKHN0YXRlKTp0aGlzLnJlZ2V4cF9lYXRFeHRlbmRlZEF0b20oc3RhdGUpKXt0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlKTtyZXR1cm4gdHJ1ZX0KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRBc3NlcnRpb249ZnVuY3Rpb24oc3RhdGUpe3ZhciBzdGFydD1zdGF0ZS5wb3M7c3RhdGUubGFzdEFzc2VydGlvbklzUXVhbnRpZmlhYmxlPWZhbHNlO2lmKHN0YXRlLmVhdCgweDVFKXx8c3RhdGUuZWF0KDB4MjQpKXtyZXR1cm4gdHJ1ZX0KaWYoc3RhdGUuZWF0KDB4NUMpKXtpZihzdGF0ZS5lYXQoMHg0Mil8fHN0YXRlLmVhdCgweDYyKSl7cmV0dXJuIHRydWV9CnN0YXRlLnBvcz1zdGFydDt9CmlmKHN0YXRlLmVhdCgweDI4KSYmc3RhdGUuZWF0KDB4M0YpKXt2YXIgbG9va2JlaGluZD1mYWxzZTtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTkpe2xvb2tiZWhpbmQ9c3RhdGUuZWF0KDB4M0MpO30KaWYoc3RhdGUuZWF0KDB4M0QpfHxzdGF0ZS5lYXQoMHgyMSkpe3RoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtpZighc3RhdGUuZWF0KDB4MjkpKXtzdGF0ZS5yYWlzZSgiVW50ZXJtaW5hdGVkIGdyb3VwIik7fQpzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGU9IWxvb2tiZWhpbmQ7cmV0dXJuIHRydWV9fQpzdGF0ZS5wb3M9c3RhcnQ7cmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRRdWFudGlmaWVyPWZ1bmN0aW9uKHN0YXRlLG5vRXJyb3Ipe2lmKG5vRXJyb3I9PT12b2lkIDApbm9FcnJvcj1mYWxzZTtpZih0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyUHJlZml4KHN0YXRlLG5vRXJyb3IpKXtzdGF0ZS5lYXQoMHgzRik7cmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0UXVhbnRpZmllclByZWZpeD1mdW5jdGlvbihzdGF0ZSxub0Vycm9yKXtyZXR1cm4oc3RhdGUuZWF0KDB4MkEpfHxzdGF0ZS5lYXQoMHgyQil8fHN0YXRlLmVhdCgweDNGKXx8dGhpcy5yZWdleHBfZWF0QnJhY2VkUXVhbnRpZmllcihzdGF0ZSxub0Vycm9yKSl9O3BwJDkucmVnZXhwX2VhdEJyYWNlZFF1YW50aWZpZXI9ZnVuY3Rpb24oc3RhdGUsbm9FcnJvcil7dmFyIHN0YXJ0PXN0YXRlLnBvcztpZihzdGF0ZS5lYXQoMHg3Qikpe3ZhciBtaW49MCxtYXg9LTE7aWYodGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpe21pbj1zdGF0ZS5sYXN0SW50VmFsdWU7aWYoc3RhdGUuZWF0KDB4MkMpJiZ0aGlzLnJlZ2V4cF9lYXREZWNpbWFsRGlnaXRzKHN0YXRlKSl7bWF4PXN0YXRlLmxhc3RJbnRWYWx1ZTt9CmlmKHN0YXRlLmVhdCgweDdEKSl7aWYobWF4IT09LTEmJm1heDxtaW4mJiFub0Vycm9yKXtzdGF0ZS5yYWlzZSgibnVtYmVycyBvdXQgb2Ygb3JkZXIgaW4ge30gcXVhbnRpZmllciIpO30KcmV0dXJuIHRydWV9fQppZihzdGF0ZS5zd2l0Y2hVJiYhbm9FcnJvcil7c3RhdGUucmFpc2UoIkluY29tcGxldGUgcXVhbnRpZmllciIpO30Kc3RhdGUucG9zPXN0YXJ0O30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRBdG9tPWZ1bmN0aW9uKHN0YXRlKXtyZXR1cm4odGhpcy5yZWdleHBfZWF0UGF0dGVybkNoYXJhY3RlcnMoc3RhdGUpfHxzdGF0ZS5lYXQoMHgyRSl8fHRoaXMucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZShzdGF0ZSl8fHRoaXMucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzKHN0YXRlKXx8dGhpcy5yZWdleHBfZWF0VW5jYXB0dXJpbmdHcm91cChzdGF0ZSl8fHRoaXMucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwKHN0YXRlKSl9O3BwJDkucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZT1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXJ0PXN0YXRlLnBvcztpZihzdGF0ZS5lYXQoMHg1Qykpe2lmKHRoaXMucmVnZXhwX2VhdEF0b21Fc2NhcGUoc3RhdGUpKXtyZXR1cm4gdHJ1ZX0Kc3RhdGUucG9zPXN0YXJ0O30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRVbmNhcHR1cmluZ0dyb3VwPWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO2lmKHN0YXRlLmVhdCgweDI4KSl7aWYoc3RhdGUuZWF0KDB4M0YpJiZzdGF0ZS5lYXQoMHgzQSkpe3RoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtpZihzdGF0ZS5lYXQoMHgyOSkpe3JldHVybiB0cnVlfQpzdGF0ZS5yYWlzZSgiVW50ZXJtaW5hdGVkIGdyb3VwIik7fQpzdGF0ZS5wb3M9c3RhcnQ7fQpyZXR1cm4gZmFsc2V9O3BwJDkucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwPWZ1bmN0aW9uKHN0YXRlKXtpZihzdGF0ZS5lYXQoMHgyOCkpe2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OSl7dGhpcy5yZWdleHBfZ3JvdXBTcGVjaWZpZXIoc3RhdGUpO31lbHNlIGlmKHN0YXRlLmN1cnJlbnQoKT09PTB4M0Ype3N0YXRlLnJhaXNlKCJJbnZhbGlkIGdyb3VwIik7fQp0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7aWYoc3RhdGUuZWF0KDB4MjkpKXtzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMrPTE7cmV0dXJuIHRydWV9CnN0YXRlLnJhaXNlKCJVbnRlcm1pbmF0ZWQgZ3JvdXAiKTt9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0RXh0ZW5kZWRBdG9tPWZ1bmN0aW9uKHN0YXRlKXtyZXR1cm4oc3RhdGUuZWF0KDB4MkUpfHx0aGlzLnJlZ2V4cF9lYXRSZXZlcnNlU29saWR1c0F0b21Fc2NhcGUoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyhzdGF0ZSl8fHRoaXMucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRDYXB0dXJpbmdHcm91cChzdGF0ZSl8fHRoaXMucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyKHN0YXRlKXx8dGhpcy5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyKHN0YXRlKSl9O3BwJDkucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyPWZ1bmN0aW9uKHN0YXRlKXtpZih0aGlzLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyKHN0YXRlLHRydWUpKXtzdGF0ZS5yYWlzZSgiTm90aGluZyB0byByZXBlYXQiKTt9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyPWZ1bmN0aW9uKHN0YXRlKXt2YXIgY2g9c3RhdGUuY3VycmVudCgpO2lmKGlzU3ludGF4Q2hhcmFjdGVyKGNoKSl7c3RhdGUubGFzdEludFZhbHVlPWNoO3N0YXRlLmFkdmFuY2UoKTtyZXR1cm4gdHJ1ZX0KcmV0dXJuIGZhbHNlfTtmdW5jdGlvbiBpc1N5bnRheENoYXJhY3RlcihjaCl7cmV0dXJuKGNoPT09MHgyNHx8Y2g+PTB4MjgmJmNoPD0weDJCfHxjaD09PTB4MkV8fGNoPT09MHgzRnx8Y2g+PTB4NUImJmNoPD0weDVFfHxjaD49MHg3QiYmY2g8PTB4N0QpfQpwcCQ5LnJlZ2V4cF9lYXRQYXR0ZXJuQ2hhcmFjdGVycz1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXJ0PXN0YXRlLnBvczt2YXIgY2g9MDt3aGlsZSgoY2g9c3RhdGUuY3VycmVudCgpKSE9PS0xJiYhaXNTeW50YXhDaGFyYWN0ZXIoY2gpKXtzdGF0ZS5hZHZhbmNlKCk7fQpyZXR1cm4gc3RhdGUucG9zIT09c3RhcnR9O3BwJDkucmVnZXhwX2VhdEV4dGVuZGVkUGF0dGVybkNoYXJhY3Rlcj1mdW5jdGlvbihzdGF0ZSl7dmFyIGNoPXN0YXRlLmN1cnJlbnQoKTtpZihjaCE9PS0xJiZjaCE9PTB4MjQmJiEoY2g+PTB4MjgmJmNoPD0weDJCKSYmY2ghPT0weDJFJiZjaCE9PTB4M0YmJmNoIT09MHg1QiYmY2ghPT0weDVFJiZjaCE9PTB4N0Mpe3N0YXRlLmFkdmFuY2UoKTtyZXR1cm4gdHJ1ZX0KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9ncm91cFNwZWNpZmllcj1mdW5jdGlvbihzdGF0ZSl7aWYoc3RhdGUuZWF0KDB4M0YpKXtpZih0aGlzLnJlZ2V4cF9lYXRHcm91cE5hbWUoc3RhdGUpKXtpZihzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2Yoc3RhdGUubGFzdFN0cmluZ1ZhbHVlKSE9PS0xKXtzdGF0ZS5yYWlzZSgiRHVwbGljYXRlIGNhcHR1cmUgZ3JvdXAgbmFtZSIpO30Kc3RhdGUuZ3JvdXBOYW1lcy5wdXNoKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSk7cmV0dXJufQpzdGF0ZS5yYWlzZSgiSW52YWxpZCBncm91cCIpO319O3BwJDkucmVnZXhwX2VhdEdyb3VwTmFtZT1mdW5jdGlvbihzdGF0ZSl7c3RhdGUubGFzdFN0cmluZ1ZhbHVlPSIiO2lmKHN0YXRlLmVhdCgweDNDKSl7aWYodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllck5hbWUoc3RhdGUpJiZzdGF0ZS5lYXQoMHgzRSkpe3JldHVybiB0cnVlfQpzdGF0ZS5yYWlzZSgiSW52YWxpZCBjYXB0dXJlIGdyb3VwIG5hbWUiKTt9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllck5hbWU9ZnVuY3Rpb24oc3RhdGUpe3N0YXRlLmxhc3RTdHJpbmdWYWx1ZT0iIjtpZih0aGlzLnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyU3RhcnQoc3RhdGUpKXtzdGF0ZS5sYXN0U3RyaW5nVmFsdWUrPWNvZGVQb2ludFRvU3RyaW5nJDEoc3RhdGUubGFzdEludFZhbHVlKTt3aGlsZSh0aGlzLnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyUGFydChzdGF0ZSkpe3N0YXRlLmxhc3RTdHJpbmdWYWx1ZSs9Y29kZVBvaW50VG9TdHJpbmckMShzdGF0ZS5sYXN0SW50VmFsdWUpO30KcmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclN0YXJ0PWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO3ZhciBjaD1zdGF0ZS5jdXJyZW50KCk7c3RhdGUuYWR2YW5jZSgpO2lmKGNoPT09MHg1QyYmdGhpcy5yZWdleHBfZWF0UmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlKHN0YXRlKSl7Y2g9c3RhdGUubGFzdEludFZhbHVlO30KaWYoaXNSZWdFeHBJZGVudGlmaWVyU3RhcnQoY2gpKXtzdGF0ZS5sYXN0SW50VmFsdWU9Y2g7cmV0dXJuIHRydWV9CnN0YXRlLnBvcz1zdGFydDtyZXR1cm4gZmFsc2V9O2Z1bmN0aW9uIGlzUmVnRXhwSWRlbnRpZmllclN0YXJ0KGNoKXtyZXR1cm4gaXNJZGVudGlmaWVyU3RhcnQoY2gsdHJ1ZSl8fGNoPT09MHgyNHx8Y2g9PT0weDVGfQpwcCQ5LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyUGFydD1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXJ0PXN0YXRlLnBvczt2YXIgY2g9c3RhdGUuY3VycmVudCgpO3N0YXRlLmFkdmFuY2UoKTtpZihjaD09PTB4NUMmJnRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSkpe2NoPXN0YXRlLmxhc3RJbnRWYWx1ZTt9CmlmKGlzUmVnRXhwSWRlbnRpZmllclBhcnQoY2gpKXtzdGF0ZS5sYXN0SW50VmFsdWU9Y2g7cmV0dXJuIHRydWV9CnN0YXRlLnBvcz1zdGFydDtyZXR1cm4gZmFsc2V9O2Z1bmN0aW9uIGlzUmVnRXhwSWRlbnRpZmllclBhcnQoY2gpe3JldHVybiBpc0lkZW50aWZpZXJDaGFyKGNoLHRydWUpfHxjaD09PTB4MjR8fGNoPT09MHg1Rnx8Y2g9PT0weDIwMEN8fGNoPT09MHgyMDBEfQpwcCQ5LnJlZ2V4cF9lYXRBdG9tRXNjYXBlPWZ1bmN0aW9uKHN0YXRlKXtpZih0aGlzLnJlZ2V4cF9lYXRCYWNrUmVmZXJlbmNlKHN0YXRlKXx8dGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpfHwoc3RhdGUuc3dpdGNoTiYmdGhpcy5yZWdleHBfZWF0S0dyb3VwTmFtZShzdGF0ZSkpKXtyZXR1cm4gdHJ1ZX0KaWYoc3RhdGUuc3dpdGNoVSl7aWYoc3RhdGUuY3VycmVudCgpPT09MHg2Myl7c3RhdGUucmFpc2UoIkludmFsaWQgdW5pY29kZSBlc2NhcGUiKTt9CnN0YXRlLnJhaXNlKCJJbnZhbGlkIGVzY2FwZSIpO30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRCYWNrUmVmZXJlbmNlPWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO2lmKHRoaXMucmVnZXhwX2VhdERlY2ltYWxFc2NhcGUoc3RhdGUpKXt2YXIgbj1zdGF0ZS5sYXN0SW50VmFsdWU7aWYoc3RhdGUuc3dpdGNoVSl7aWYobj5zdGF0ZS5tYXhCYWNrUmVmZXJlbmNlKXtzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlPW47fQpyZXR1cm4gdHJ1ZX0KaWYobjw9c3RhdGUubnVtQ2FwdHVyaW5nUGFyZW5zKXtyZXR1cm4gdHJ1ZX0Kc3RhdGUucG9zPXN0YXJ0O30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRLR3JvdXBOYW1lPWZ1bmN0aW9uKHN0YXRlKXtpZihzdGF0ZS5lYXQoMHg2Qikpe2lmKHRoaXMucmVnZXhwX2VhdEdyb3VwTmFtZShzdGF0ZSkpe3N0YXRlLmJhY2tSZWZlcmVuY2VOYW1lcy5wdXNoKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSk7cmV0dXJuIHRydWV9CnN0YXRlLnJhaXNlKCJJbnZhbGlkIG5hbWVkIHJlZmVyZW5jZSIpO30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGU9ZnVuY3Rpb24oc3RhdGUpe3JldHVybih0aGlzLnJlZ2V4cF9lYXRDb250cm9sRXNjYXBlKHN0YXRlKXx8dGhpcy5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRaZXJvKHN0YXRlKXx8dGhpcy5yZWdleHBfZWF0SGV4RXNjYXBlU2VxdWVuY2Uoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2Uoc3RhdGUpfHwoIXN0YXRlLnN3aXRjaFUmJnRoaXMucmVnZXhwX2VhdExlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2Uoc3RhdGUpKXx8dGhpcy5yZWdleHBfZWF0SWRlbnRpdHlFc2NhcGUoc3RhdGUpKX07cHAkOS5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXI9ZnVuY3Rpb24oc3RhdGUpe3ZhciBzdGFydD1zdGF0ZS5wb3M7aWYoc3RhdGUuZWF0KDB4NjMpKXtpZih0aGlzLnJlZ2V4cF9lYXRDb250cm9sTGV0dGVyKHN0YXRlKSl7cmV0dXJuIHRydWV9CnN0YXRlLnBvcz1zdGFydDt9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0WmVybz1mdW5jdGlvbihzdGF0ZSl7aWYoc3RhdGUuY3VycmVudCgpPT09MHgzMCYmIWlzRGVjaW1hbERpZ2l0KHN0YXRlLmxvb2thaGVhZCgpKSl7c3RhdGUubGFzdEludFZhbHVlPTA7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O3BwJDkucmVnZXhwX2VhdENvbnRyb2xFc2NhcGU9ZnVuY3Rpb24oc3RhdGUpe3ZhciBjaD1zdGF0ZS5jdXJyZW50KCk7aWYoY2g9PT0weDc0KXtzdGF0ZS5sYXN0SW50VmFsdWU9MHgwOTtzdGF0ZS5hZHZhbmNlKCk7cmV0dXJuIHRydWV9CmlmKGNoPT09MHg2RSl7c3RhdGUubGFzdEludFZhbHVlPTB4MEE7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQppZihjaD09PTB4NzYpe3N0YXRlLmxhc3RJbnRWYWx1ZT0weDBCO3N0YXRlLmFkdmFuY2UoKTtyZXR1cm4gdHJ1ZX0KaWYoY2g9PT0weDY2KXtzdGF0ZS5sYXN0SW50VmFsdWU9MHgwQztzdGF0ZS5hZHZhbmNlKCk7cmV0dXJuIHRydWV9CmlmKGNoPT09MHg3Mil7c3RhdGUubGFzdEludFZhbHVlPTB4MEQ7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O3BwJDkucmVnZXhwX2VhdENvbnRyb2xMZXR0ZXI9ZnVuY3Rpb24oc3RhdGUpe3ZhciBjaD1zdGF0ZS5jdXJyZW50KCk7aWYoaXNDb250cm9sTGV0dGVyKGNoKSl7c3RhdGUubGFzdEludFZhbHVlPWNoJTB4MjA7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O2Z1bmN0aW9uIGlzQ29udHJvbExldHRlcihjaCl7cmV0dXJuKChjaD49MHg0MSYmY2g8PTB4NUEpfHwoY2g+PTB4NjEmJmNoPD0weDdBKSl9CnBwJDkucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZT1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXJ0PXN0YXRlLnBvcztpZihzdGF0ZS5lYXQoMHg3NSkpe2lmKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLDQpKXt2YXIgbGVhZD1zdGF0ZS5sYXN0SW50VmFsdWU7aWYoc3RhdGUuc3dpdGNoVSYmbGVhZD49MHhEODAwJiZsZWFkPD0weERCRkYpe3ZhciBsZWFkU3Vycm9nYXRlRW5kPXN0YXRlLnBvcztpZihzdGF0ZS5lYXQoMHg1QykmJnN0YXRlLmVhdCgweDc1KSYmdGhpcy5yZWdleHBfZWF0Rml4ZWRIZXhEaWdpdHMoc3RhdGUsNCkpe3ZhciB0cmFpbD1zdGF0ZS5sYXN0SW50VmFsdWU7aWYodHJhaWw+PTB4REMwMCYmdHJhaWw8PTB4REZGRil7c3RhdGUubGFzdEludFZhbHVlPShsZWFkLTB4RDgwMCkqMHg0MDArKHRyYWlsLTB4REMwMCkrMHgxMDAwMDtyZXR1cm4gdHJ1ZX19CnN0YXRlLnBvcz1sZWFkU3Vycm9nYXRlRW5kO3N0YXRlLmxhc3RJbnRWYWx1ZT1sZWFkO30KcmV0dXJuIHRydWV9CmlmKHN0YXRlLnN3aXRjaFUmJnN0YXRlLmVhdCgweDdCKSYmdGhpcy5yZWdleHBfZWF0SGV4RGlnaXRzKHN0YXRlKSYmc3RhdGUuZWF0KDB4N0QpJiZpc1ZhbGlkVW5pY29kZShzdGF0ZS5sYXN0SW50VmFsdWUpKXtyZXR1cm4gdHJ1ZX0KaWYoc3RhdGUuc3dpdGNoVSl7c3RhdGUucmFpc2UoIkludmFsaWQgdW5pY29kZSBlc2NhcGUiKTt9CnN0YXRlLnBvcz1zdGFydDt9CnJldHVybiBmYWxzZX07ZnVuY3Rpb24gaXNWYWxpZFVuaWNvZGUoY2gpe3JldHVybiBjaD49MCYmY2g8PTB4MTBGRkZGfQpwcCQ5LnJlZ2V4cF9lYXRJZGVudGl0eUVzY2FwZT1mdW5jdGlvbihzdGF0ZSl7aWYoc3RhdGUuc3dpdGNoVSl7aWYodGhpcy5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyKHN0YXRlKSl7cmV0dXJuIHRydWV9CmlmKHN0YXRlLmVhdCgweDJGKSl7c3RhdGUubGFzdEludFZhbHVlPTB4MkY7cmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX0KdmFyIGNoPXN0YXRlLmN1cnJlbnQoKTtpZihjaCE9PTB4NjMmJighc3RhdGUuc3dpdGNoTnx8Y2ghPT0weDZCKSl7c3RhdGUubGFzdEludFZhbHVlPWNoO3N0YXRlLmFkdmFuY2UoKTtyZXR1cm4gdHJ1ZX0KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXREZWNpbWFsRXNjYXBlPWZ1bmN0aW9uKHN0YXRlKXtzdGF0ZS5sYXN0SW50VmFsdWU9MDt2YXIgY2g9c3RhdGUuY3VycmVudCgpO2lmKGNoPj0weDMxJiZjaDw9MHgzOSl7ZG97c3RhdGUubGFzdEludFZhbHVlPTEwKnN0YXRlLmxhc3RJbnRWYWx1ZSsoY2gtMHgzMCk7c3RhdGUuYWR2YW5jZSgpO313aGlsZSgoY2g9c3RhdGUuY3VycmVudCgpKT49MHgzMCYmY2g8PTB4MzkpCnJldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O3BwJDkucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzRXNjYXBlPWZ1bmN0aW9uKHN0YXRlKXt2YXIgY2g9c3RhdGUuY3VycmVudCgpO2lmKGlzQ2hhcmFjdGVyQ2xhc3NFc2NhcGUoY2gpKXtzdGF0ZS5sYXN0SW50VmFsdWU9LTE7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQppZihzdGF0ZS5zd2l0Y2hVJiZ0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTkmJihjaD09PTB4NTB8fGNoPT09MHg3MCkpe3N0YXRlLmxhc3RJbnRWYWx1ZT0tMTtzdGF0ZS5hZHZhbmNlKCk7aWYoc3RhdGUuZWF0KDB4N0IpJiZ0aGlzLnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZUV4cHJlc3Npb24oc3RhdGUpJiZzdGF0ZS5lYXQoMHg3RCkpe3JldHVybiB0cnVlfQpzdGF0ZS5yYWlzZSgiSW52YWxpZCBwcm9wZXJ0eSBuYW1lIik7fQpyZXR1cm4gZmFsc2V9O2Z1bmN0aW9uIGlzQ2hhcmFjdGVyQ2xhc3NFc2NhcGUoY2gpe3JldHVybihjaD09PTB4NjR8fGNoPT09MHg0NHx8Y2g9PT0weDczfHxjaD09PTB4NTN8fGNoPT09MHg3N3x8Y2g9PT0weDU3KX0KcHAkOS5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5VmFsdWVFeHByZXNzaW9uPWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO2lmKHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eU5hbWUoc3RhdGUpJiZzdGF0ZS5lYXQoMHgzRCkpe3ZhciBuYW1lPXN0YXRlLmxhc3RTdHJpbmdWYWx1ZTtpZih0aGlzLnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZShzdGF0ZSkpe3ZhciB2YWx1ZT1zdGF0ZS5sYXN0U3RyaW5nVmFsdWU7dGhpcy5yZWdleHBfdmFsaWRhdGVVbmljb2RlUHJvcGVydHlOYW1lQW5kVmFsdWUoc3RhdGUsbmFtZSx2YWx1ZSk7cmV0dXJuIHRydWV9fQpzdGF0ZS5wb3M9c3RhcnQ7aWYodGhpcy5yZWdleHBfZWF0TG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlKHN0YXRlKSl7dmFyIG5hbWVPclZhbHVlPXN0YXRlLmxhc3RTdHJpbmdWYWx1ZTt0aGlzLnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlKHN0YXRlLG5hbWVPclZhbHVlKTtyZXR1cm4gdHJ1ZX0KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVBbmRWYWx1ZT1mdW5jdGlvbihzdGF0ZSxuYW1lLHZhbHVlKXtpZighZGF0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKXx8ZGF0YVtuYW1lXS5pbmRleE9mKHZhbHVlKT09PS0xKXtzdGF0ZS5yYWlzZSgiSW52YWxpZCBwcm9wZXJ0eSBuYW1lIik7fX07cHAkOS5yZWdleHBfdmFsaWRhdGVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZT1mdW5jdGlvbihzdGF0ZSxuYW1lT3JWYWx1ZSl7aWYoZGF0YS4kTE9ORS5pbmRleE9mKG5hbWVPclZhbHVlKT09PS0xKXtzdGF0ZS5yYWlzZSgiSW52YWxpZCBwcm9wZXJ0eSBuYW1lIik7fX07cHAkOS5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5TmFtZT1mdW5jdGlvbihzdGF0ZSl7dmFyIGNoPTA7c3RhdGUubGFzdFN0cmluZ1ZhbHVlPSIiO3doaWxlKGlzVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcihjaD1zdGF0ZS5jdXJyZW50KCkpKXtzdGF0ZS5sYXN0U3RyaW5nVmFsdWUrPWNvZGVQb2ludFRvU3RyaW5nJDEoY2gpO3N0YXRlLmFkdmFuY2UoKTt9CnJldHVybiBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUhPT0iIn07ZnVuY3Rpb24gaXNVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyKGNoKXtyZXR1cm4gaXNDb250cm9sTGV0dGVyKGNoKXx8Y2g9PT0weDVGfQpwcCQ5LnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZT1mdW5jdGlvbihzdGF0ZSl7dmFyIGNoPTA7c3RhdGUubGFzdFN0cmluZ1ZhbHVlPSIiO3doaWxlKGlzVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXIoY2g9c3RhdGUuY3VycmVudCgpKSl7c3RhdGUubGFzdFN0cmluZ1ZhbHVlKz1jb2RlUG9pbnRUb1N0cmluZyQxKGNoKTtzdGF0ZS5hZHZhbmNlKCk7fQpyZXR1cm4gc3RhdGUubGFzdFN0cmluZ1ZhbHVlIT09IiJ9O2Z1bmN0aW9uIGlzVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXIoY2gpe3JldHVybiBpc1VuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXIoY2gpfHxpc0RlY2ltYWxEaWdpdChjaCl9CnBwJDkucmVnZXhwX2VhdExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZT1mdW5jdGlvbihzdGF0ZSl7cmV0dXJuIHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlKHN0YXRlKX07cHAkOS5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3M9ZnVuY3Rpb24oc3RhdGUpe2lmKHN0YXRlLmVhdCgweDVCKSl7c3RhdGUuZWF0KDB4NUUpO3RoaXMucmVnZXhwX2NsYXNzUmFuZ2VzKHN0YXRlKTtpZihzdGF0ZS5lYXQoMHg1RCkpe3JldHVybiB0cnVlfQpzdGF0ZS5yYWlzZSgiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyIpO30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9jbGFzc1Jhbmdlcz1mdW5jdGlvbihzdGF0ZSl7dmFyIHRoaXMkMT10aGlzO3doaWxlKHRoaXMucmVnZXhwX2VhdENsYXNzQXRvbShzdGF0ZSkpe3ZhciBsZWZ0PXN0YXRlLmxhc3RJbnRWYWx1ZTtpZihzdGF0ZS5lYXQoMHgyRCkmJnRoaXMkMS5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSl7dmFyIHJpZ2h0PXN0YXRlLmxhc3RJbnRWYWx1ZTtpZihzdGF0ZS5zd2l0Y2hVJiYobGVmdD09PS0xfHxyaWdodD09PS0xKSl7c3RhdGUucmFpc2UoIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzIik7fQppZihsZWZ0IT09LTEmJnJpZ2h0IT09LTEmJmxlZnQ+cmlnaHQpe3N0YXRlLnJhaXNlKCJSYW5nZSBvdXQgb2Ygb3JkZXIgaW4gY2hhcmFjdGVyIGNsYXNzIik7fX19fTtwcCQ5LnJlZ2V4cF9lYXRDbGFzc0F0b209ZnVuY3Rpb24oc3RhdGUpe3ZhciBzdGFydD1zdGF0ZS5wb3M7aWYoc3RhdGUuZWF0KDB4NUMpKXtpZih0aGlzLnJlZ2V4cF9lYXRDbGFzc0VzY2FwZShzdGF0ZSkpe3JldHVybiB0cnVlfQppZihzdGF0ZS5zd2l0Y2hVKXt2YXIgY2gkMT1zdGF0ZS5jdXJyZW50KCk7aWYoY2gkMT09PTB4NjN8fGlzT2N0YWxEaWdpdChjaCQxKSl7c3RhdGUucmFpc2UoIkludmFsaWQgY2xhc3MgZXNjYXBlIik7fQpzdGF0ZS5yYWlzZSgiSW52YWxpZCBlc2NhcGUiKTt9CnN0YXRlLnBvcz1zdGFydDt9CnZhciBjaD1zdGF0ZS5jdXJyZW50KCk7aWYoY2ghPT0weDVEKXtzdGF0ZS5sYXN0SW50VmFsdWU9Y2g7c3RhdGUuYWR2YW5jZSgpO3JldHVybiB0cnVlfQpyZXR1cm4gZmFsc2V9O3BwJDkucmVnZXhwX2VhdENsYXNzRXNjYXBlPWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO2lmKHN0YXRlLmVhdCgweDYyKSl7c3RhdGUubGFzdEludFZhbHVlPTB4MDg7cmV0dXJuIHRydWV9CmlmKHN0YXRlLnN3aXRjaFUmJnN0YXRlLmVhdCgweDJEKSl7c3RhdGUubGFzdEludFZhbHVlPTB4MkQ7cmV0dXJuIHRydWV9CmlmKCFzdGF0ZS5zd2l0Y2hVJiZzdGF0ZS5lYXQoMHg2Mykpe2lmKHRoaXMucmVnZXhwX2VhdENsYXNzQ29udHJvbExldHRlcihzdGF0ZSkpe3JldHVybiB0cnVlfQpzdGF0ZS5wb3M9c3RhcnQ7fQpyZXR1cm4odGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpfHx0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpKX07cHAkOS5yZWdleHBfZWF0Q2xhc3NDb250cm9sTGV0dGVyPWZ1bmN0aW9uKHN0YXRlKXt2YXIgY2g9c3RhdGUuY3VycmVudCgpO2lmKGlzRGVjaW1hbERpZ2l0KGNoKXx8Y2g9PT0weDVGKXtzdGF0ZS5sYXN0SW50VmFsdWU9Y2glMHgyMDtzdGF0ZS5hZHZhbmNlKCk7cmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0SGV4RXNjYXBlU2VxdWVuY2U9ZnVuY3Rpb24oc3RhdGUpe3ZhciBzdGFydD1zdGF0ZS5wb3M7aWYoc3RhdGUuZWF0KDB4NzgpKXtpZih0aGlzLnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cyhzdGF0ZSwyKSl7cmV0dXJuIHRydWV9CmlmKHN0YXRlLnN3aXRjaFUpe3N0YXRlLnJhaXNlKCJJbnZhbGlkIGVzY2FwZSIpO30Kc3RhdGUucG9zPXN0YXJ0O30KcmV0dXJuIGZhbHNlfTtwcCQ5LnJlZ2V4cF9lYXREZWNpbWFsRGlnaXRzPWZ1bmN0aW9uKHN0YXRlKXt2YXIgc3RhcnQ9c3RhdGUucG9zO3ZhciBjaD0wO3N0YXRlLmxhc3RJbnRWYWx1ZT0wO3doaWxlKGlzRGVjaW1hbERpZ2l0KGNoPXN0YXRlLmN1cnJlbnQoKSkpe3N0YXRlLmxhc3RJbnRWYWx1ZT0xMCpzdGF0ZS5sYXN0SW50VmFsdWUrKGNoLTB4MzApO3N0YXRlLmFkdmFuY2UoKTt9CnJldHVybiBzdGF0ZS5wb3MhPT1zdGFydH07ZnVuY3Rpb24gaXNEZWNpbWFsRGlnaXQoY2gpe3JldHVybiBjaD49MHgzMCYmY2g8PTB4Mzl9CnBwJDkucmVnZXhwX2VhdEhleERpZ2l0cz1mdW5jdGlvbihzdGF0ZSl7dmFyIHN0YXJ0PXN0YXRlLnBvczt2YXIgY2g9MDtzdGF0ZS5sYXN0SW50VmFsdWU9MDt3aGlsZShpc0hleERpZ2l0KGNoPXN0YXRlLmN1cnJlbnQoKSkpe3N0YXRlLmxhc3RJbnRWYWx1ZT0xNipzdGF0ZS5sYXN0SW50VmFsdWUraGV4VG9JbnQoY2gpO3N0YXRlLmFkdmFuY2UoKTt9CnJldHVybiBzdGF0ZS5wb3MhPT1zdGFydH07ZnVuY3Rpb24gaXNIZXhEaWdpdChjaCl7cmV0dXJuKChjaD49MHgzMCYmY2g8PTB4MzkpfHwoY2g+PTB4NDEmJmNoPD0weDQ2KXx8KGNoPj0weDYxJiZjaDw9MHg2NikpfQpmdW5jdGlvbiBoZXhUb0ludChjaCl7aWYoY2g+PTB4NDEmJmNoPD0weDQ2KXtyZXR1cm4gMTArKGNoLTB4NDEpfQppZihjaD49MHg2MSYmY2g8PTB4NjYpe3JldHVybiAxMCsoY2gtMHg2MSl9CnJldHVybiBjaC0weDMwfQpwcCQ5LnJlZ2V4cF9lYXRMZWdhY3lPY3RhbEVzY2FwZVNlcXVlbmNlPWZ1bmN0aW9uKHN0YXRlKXtpZih0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSl7dmFyIG4xPXN0YXRlLmxhc3RJbnRWYWx1ZTtpZih0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSl7dmFyIG4yPXN0YXRlLmxhc3RJbnRWYWx1ZTtpZihuMTw9MyYmdGhpcy5yZWdleHBfZWF0T2N0YWxEaWdpdChzdGF0ZSkpe3N0YXRlLmxhc3RJbnRWYWx1ZT1uMSo2NCtuMio4K3N0YXRlLmxhc3RJbnRWYWx1ZTt9ZWxzZXtzdGF0ZS5sYXN0SW50VmFsdWU9bjEqOCtuMjt9fWVsc2V7c3RhdGUubGFzdEludFZhbHVlPW4xO30KcmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX07cHAkOS5yZWdleHBfZWF0T2N0YWxEaWdpdD1mdW5jdGlvbihzdGF0ZSl7dmFyIGNoPXN0YXRlLmN1cnJlbnQoKTtpZihpc09jdGFsRGlnaXQoY2gpKXtzdGF0ZS5sYXN0SW50VmFsdWU9Y2gtMHgzMDtzdGF0ZS5hZHZhbmNlKCk7cmV0dXJuIHRydWV9CnN0YXRlLmxhc3RJbnRWYWx1ZT0wO3JldHVybiBmYWxzZX07ZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKXtyZXR1cm4gY2g+PTB4MzAmJmNoPD0weDM3fQpwcCQ5LnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cz1mdW5jdGlvbihzdGF0ZSxsZW5ndGgpe3ZhciBzdGFydD1zdGF0ZS5wb3M7c3RhdGUubGFzdEludFZhbHVlPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXt2YXIgY2g9c3RhdGUuY3VycmVudCgpO2lmKCFpc0hleERpZ2l0KGNoKSl7c3RhdGUucG9zPXN0YXJ0O3JldHVybiBmYWxzZX0Kc3RhdGUubGFzdEludFZhbHVlPTE2KnN0YXRlLmxhc3RJbnRWYWx1ZStoZXhUb0ludChjaCk7c3RhdGUuYWR2YW5jZSgpO30KcmV0dXJuIHRydWV9O3ZhciBUb2tlbj1mdW5jdGlvbiBUb2tlbihwKXt0aGlzLnR5cGU9cC50eXBlO3RoaXMudmFsdWU9cC52YWx1ZTt0aGlzLnN0YXJ0PXAuc3RhcnQ7dGhpcy5lbmQ9cC5lbmQ7aWYocC5vcHRpb25zLmxvY2F0aW9ucykKe3RoaXMubG9jPW5ldyBTb3VyY2VMb2NhdGlvbihwLHAuc3RhcnRMb2MscC5lbmRMb2MpO30KaWYocC5vcHRpb25zLnJhbmdlcykKe3RoaXMucmFuZ2U9W3Auc3RhcnQscC5lbmRdO319O3ZhciBwcCQ4PVBhcnNlci5wcm90b3R5cGU7cHAkOC5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLm9uVG9rZW4pCnt0aGlzLm9wdGlvbnMub25Ub2tlbihuZXcgVG9rZW4odGhpcykpO30KdGhpcy5sYXN0VG9rRW5kPXRoaXMuZW5kO3RoaXMubGFzdFRva1N0YXJ0PXRoaXMuc3RhcnQ7dGhpcy5sYXN0VG9rRW5kTG9jPXRoaXMuZW5kTG9jO3RoaXMubGFzdFRva1N0YXJ0TG9jPXRoaXMuc3RhcnRMb2M7dGhpcy5uZXh0VG9rZW4oKTt9O3BwJDguZ2V0VG9rZW49ZnVuY3Rpb24oKXt0aGlzLm5leHQoKTtyZXR1cm4gbmV3IFRva2VuKHRoaXMpfTtpZih0eXBlb2YgU3ltYm9sIT09InVuZGVmaW5lZCIpCntwcCQ4W1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXt2YXIgdG9rZW49dGhpcyQxLmdldFRva2VuKCk7cmV0dXJue2RvbmU6dG9rZW4udHlwZT09PXR5cGVzLmVvZix2YWx1ZTp0b2tlbn19fX07fQpwcCQ4LmN1ckNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0W3RoaXMuY29udGV4dC5sZW5ndGgtMV19O3BwJDgubmV4dFRva2VuPWZ1bmN0aW9uKCl7dmFyIGN1ckNvbnRleHQ9dGhpcy5jdXJDb250ZXh0KCk7aWYoIWN1ckNvbnRleHR8fCFjdXJDb250ZXh0LnByZXNlcnZlU3BhY2Upe3RoaXMuc2tpcFNwYWNlKCk7fQp0aGlzLnN0YXJ0PXRoaXMucG9zO2lmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpe3RoaXMuc3RhcnRMb2M9dGhpcy5jdXJQb3NpdGlvbigpO30KaWYodGhpcy5wb3M+PXRoaXMuaW5wdXQubGVuZ3RoKXtyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5lb2YpfQppZihjdXJDb250ZXh0Lm92ZXJyaWRlKXtyZXR1cm4gY3VyQ29udGV4dC5vdmVycmlkZSh0aGlzKX0KZWxzZXt0aGlzLnJlYWRUb2tlbih0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpO319O3BwJDgucmVhZFRva2VuPWZ1bmN0aW9uKGNvZGUpe2lmKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXx8Y29kZT09PTkyKQp7cmV0dXJuIHRoaXMucmVhZFdvcmQoKX0KcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKX07cHAkOC5mdWxsQ2hhckNvZGVBdFBvcz1mdW5jdGlvbigpe3ZhciBjb2RlPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7aWYoY29kZTw9MHhkN2ZmfHxjb2RlPj0weGUwMDApe3JldHVybiBjb2RlfQp2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMSk7cmV0dXJuKGNvZGU8PDEwKStuZXh0LTB4MzVmZGMwMH07cHAkOC5za2lwQmxvY2tDb21tZW50PWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydExvYz10aGlzLm9wdGlvbnMub25Db21tZW50JiZ0aGlzLmN1clBvc2l0aW9uKCk7dmFyIHN0YXJ0PXRoaXMucG9zLGVuZD10aGlzLmlucHV0LmluZGV4T2YoIiovIix0aGlzLnBvcys9Mik7aWYoZW5kPT09LTEpe3RoaXMucmFpc2UodGhpcy5wb3MtMiwiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTt9CnRoaXMucG9zPWVuZCsyO2lmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpe2xpbmVCcmVha0cubGFzdEluZGV4PXN0YXJ0O3ZhciBtYXRjaDt3aGlsZSgobWF0Y2g9bGluZUJyZWFrRy5leGVjKHRoaXMuaW5wdXQpKSYmbWF0Y2guaW5kZXg8dGhpcy5wb3MpeysrdGhpcyQxLmN1ckxpbmU7dGhpcyQxLmxpbmVTdGFydD1tYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGg7fX0KaWYodGhpcy5vcHRpb25zLm9uQ29tbWVudCkKe3RoaXMub3B0aW9ucy5vbkNvbW1lbnQodHJ1ZSx0aGlzLmlucHV0LnNsaWNlKHN0YXJ0KzIsZW5kKSxzdGFydCx0aGlzLnBvcyxzdGFydExvYyx0aGlzLmN1clBvc2l0aW9uKCkpO319O3BwJDguc2tpcExpbmVDb21tZW50PWZ1bmN0aW9uKHN0YXJ0U2tpcCl7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydD10aGlzLnBvczt2YXIgc3RhcnRMb2M9dGhpcy5vcHRpb25zLm9uQ29tbWVudCYmdGhpcy5jdXJQb3NpdGlvbigpO3ZhciBjaD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrPXN0YXJ0U2tpcCk7d2hpbGUodGhpcy5wb3M8dGhpcy5pbnB1dC5sZW5ndGgmJiFpc05ld0xpbmUoY2gpKXtjaD10aGlzJDEuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMkMS5wb3MpO30KaWYodGhpcy5vcHRpb25zLm9uQ29tbWVudCkKe3RoaXMub3B0aW9ucy5vbkNvbW1lbnQoZmFsc2UsdGhpcy5pbnB1dC5zbGljZShzdGFydCtzdGFydFNraXAsdGhpcy5wb3MpLHN0YXJ0LHRoaXMucG9zLHN0YXJ0TG9jLHRoaXMuY3VyUG9zaXRpb24oKSk7fX07cHAkOC5za2lwU3BhY2U9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7bG9vcDp3aGlsZSh0aGlzLnBvczx0aGlzLmlucHV0Lmxlbmd0aCl7dmFyIGNoPXRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MpO3N3aXRjaChjaCl7Y2FzZSAzMjpjYXNlIDE2MDorK3RoaXMkMS5wb3M7YnJlYWsKY2FzZSAxMzppZih0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKzEpPT09MTApeysrdGhpcyQxLnBvczt9CmNhc2UgMTA6Y2FzZSA4MjMyOmNhc2UgODIzMzorK3RoaXMkMS5wb3M7aWYodGhpcyQxLm9wdGlvbnMubG9jYXRpb25zKXsrK3RoaXMkMS5jdXJMaW5lO3RoaXMkMS5saW5lU3RhcnQ9dGhpcyQxLnBvczt9CmJyZWFrCmNhc2UgNDc6c3dpdGNoKHRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MrMSkpe2Nhc2UgNDI6dGhpcyQxLnNraXBCbG9ja0NvbW1lbnQoKTticmVhawpjYXNlIDQ3OnRoaXMkMS5za2lwTGluZUNvbW1lbnQoMik7YnJlYWsKZGVmYXVsdDpicmVhayBsb29wfQpicmVhawpkZWZhdWx0OmlmKGNoPjgmJmNoPDE0fHxjaD49NTc2MCYmbm9uQVNDSUl3aGl0ZXNwYWNlLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpKXsrK3RoaXMkMS5wb3M7fWVsc2V7YnJlYWsgbG9vcH19fX07cHAkOC5maW5pc2hUb2tlbj1mdW5jdGlvbih0eXBlLHZhbCl7dGhpcy5lbmQ9dGhpcy5wb3M7aWYodGhpcy5vcHRpb25zLmxvY2F0aW9ucyl7dGhpcy5lbmRMb2M9dGhpcy5jdXJQb3NpdGlvbigpO30KdmFyIHByZXZUeXBlPXRoaXMudHlwZTt0aGlzLnR5cGU9dHlwZTt0aGlzLnZhbHVlPXZhbDt0aGlzLnVwZGF0ZUNvbnRleHQocHJldlR5cGUpO307cHAkOC5yZWFkVG9rZW5fZG90PWZ1bmN0aW9uKCl7dmFyIG5leHQ9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKzEpO2lmKG5leHQ+PTQ4JiZuZXh0PD01Nyl7cmV0dXJuIHRoaXMucmVhZE51bWJlcih0cnVlKX0KdmFyIG5leHQyPXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysyKTtpZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJm5leHQ9PT00NiYmbmV4dDI9PT00Nil7dGhpcy5wb3MrPTM7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuZWxsaXBzaXMpfWVsc2V7Kyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5kb3QpfX07cHAkOC5yZWFkVG9rZW5fc2xhc2g9ZnVuY3Rpb24oKXt2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMSk7aWYodGhpcy5leHByQWxsb3dlZCl7Kyt0aGlzLnBvcztyZXR1cm4gdGhpcy5yZWFkUmVnZXhwKCl9CmlmKG5leHQ9PT02MSl7cmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLDIpfQpyZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5zbGFzaCwxKX07cHAkOC5yZWFkVG9rZW5fbXVsdF9tb2R1bG9fZXhwPWZ1bmN0aW9uKGNvZGUpe3ZhciBuZXh0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysxKTt2YXIgc2l6ZT0xO3ZhciB0b2tlbnR5cGU9Y29kZT09PTQyP3R5cGVzLnN0YXI6dHlwZXMubW9kdWxvO2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49NyYmY29kZT09NDImJm5leHQ9PT00Mil7KytzaXplO3Rva2VudHlwZT10eXBlcy5zdGFyc3RhcjtuZXh0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysyKTt9CmlmKG5leHQ9PT02MSl7cmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLHNpemUrMSl9CnJldHVybiB0aGlzLmZpbmlzaE9wKHRva2VudHlwZSxzaXplKX07cHAkOC5yZWFkVG9rZW5fcGlwZV9hbXA9ZnVuY3Rpb24oY29kZSl7dmFyIG5leHQ9dGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKzEpO2lmKG5leHQ9PT1jb2RlKXtyZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlPT09MTI0P3R5cGVzLmxvZ2ljYWxPUjp0eXBlcy5sb2dpY2FsQU5ELDIpfQppZihuZXh0PT09NjEpe3JldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwyKX0KcmV0dXJuIHRoaXMuZmluaXNoT3AoY29kZT09PTEyND90eXBlcy5iaXR3aXNlT1I6dHlwZXMuYml0d2lzZUFORCwxKX07cHAkOC5yZWFkVG9rZW5fY2FyZXQ9ZnVuY3Rpb24oKXt2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMSk7aWYobmV4dD09PTYxKXtyZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sMil9CnJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmJpdHdpc2VYT1IsMSl9O3BwJDgucmVhZFRva2VuX3BsdXNfbWluPWZ1bmN0aW9uKGNvZGUpe3ZhciBuZXh0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysxKTtpZihuZXh0PT09Y29kZSl7aWYobmV4dD09NDUmJiF0aGlzLmluTW9kdWxlJiZ0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMik9PTYyJiYodGhpcy5sYXN0VG9rRW5kPT09MHx8bGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsdGhpcy5wb3MpKSkpe3RoaXMuc2tpcExpbmVDb21tZW50KDMpO3RoaXMuc2tpcFNwYWNlKCk7cmV0dXJuIHRoaXMubmV4dFRva2VuKCl9CnJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmluY0RlYywyKX0KaWYobmV4dD09PTYxKXtyZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sMil9CnJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLnBsdXNNaW4sMSl9O3BwJDgucmVhZFRva2VuX2x0X2d0PWZ1bmN0aW9uKGNvZGUpe3ZhciBuZXh0PXRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysxKTt2YXIgc2l6ZT0xO2lmKG5leHQ9PT1jb2RlKXtzaXplPWNvZGU9PT02MiYmdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKzIpPT09NjI/MzoyO2lmKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcytzaXplKT09PTYxKXtyZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sc2l6ZSsxKX0KcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYml0U2hpZnQsc2l6ZSl9CmlmKG5leHQ9PTMzJiZjb2RlPT02MCYmIXRoaXMuaW5Nb2R1bGUmJnRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcysyKT09NDUmJnRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyszKT09NDUpe3RoaXMuc2tpcExpbmVDb21tZW50KDQpO3RoaXMuc2tpcFNwYWNlKCk7cmV0dXJuIHRoaXMubmV4dFRva2VuKCl9CmlmKG5leHQ9PT02MSl7c2l6ZT0yO30KcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucmVsYXRpb25hbCxzaXplKX07cHAkOC5yZWFkVG9rZW5fZXFfZXhjbD1mdW5jdGlvbihjb2RlKXt2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMSk7aWYobmV4dD09PTYxKXtyZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5lcXVhbGl0eSx0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMik9PT02MT8zOjIpfQppZihjb2RlPT09NjEmJm5leHQ9PT02MiYmdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXt0aGlzLnBvcys9MjtyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5hcnJvdyl9CnJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGU9PT02MT90eXBlcy5lcTp0eXBlcy5wcmVmaXgsMSl9O3BwJDguZ2V0VG9rZW5Gcm9tQ29kZT1mdW5jdGlvbihjb2RlKXtzd2l0Y2goY29kZSl7Y2FzZSA0NjpyZXR1cm4gdGhpcy5yZWFkVG9rZW5fZG90KCkKY2FzZSA0MDorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnBhcmVuTCkKY2FzZSA0MTorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnBhcmVuUikKY2FzZSA1OTorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnNlbWkpCmNhc2UgNDQ6Kyt0aGlzLnBvcztyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5jb21tYSkKY2FzZSA5MTorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJyYWNrZXRMKQpjYXNlIDkzOisrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldFIpCmNhc2UgMTIzOisrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2VMKQpjYXNlIDEyNTorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJyYWNlUikKY2FzZSA1ODorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmNvbG9uKQpjYXNlIDYzOisrdGhpcy5wb3M7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucXVlc3Rpb24pCmNhc2UgOTY6aWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPDYpe2JyZWFrfQorK3RoaXMucG9zO3JldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJhY2tRdW90ZSkKY2FzZSA0ODp2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MrMSk7aWYobmV4dD09PTEyMHx8bmV4dD09PTg4KXtyZXR1cm4gdGhpcy5yZWFkUmFkaXhOdW1iZXIoMTYpfQppZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYpe2lmKG5leHQ9PT0xMTF8fG5leHQ9PT03OSl7cmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDgpfQppZihuZXh0PT09OTh8fG5leHQ9PT02Nil7cmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDIpfX0KY2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6cmV0dXJuIHRoaXMucmVhZE51bWJlcihmYWxzZSkKY2FzZSAzNDpjYXNlIDM5OnJldHVybiB0aGlzLnJlYWRTdHJpbmcoY29kZSkKY2FzZSA0NzpyZXR1cm4gdGhpcy5yZWFkVG9rZW5fc2xhc2goKQpjYXNlIDM3OmNhc2UgNDI6cmV0dXJuIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvX2V4cChjb2RlKQpjYXNlIDEyNDpjYXNlIDM4OnJldHVybiB0aGlzLnJlYWRUb2tlbl9waXBlX2FtcChjb2RlKQpjYXNlIDk0OnJldHVybiB0aGlzLnJlYWRUb2tlbl9jYXJldCgpCmNhc2UgNDM6Y2FzZSA0NTpyZXR1cm4gdGhpcy5yZWFkVG9rZW5fcGx1c19taW4oY29kZSkKY2FzZSA2MDpjYXNlIDYyOnJldHVybiB0aGlzLnJlYWRUb2tlbl9sdF9ndChjb2RlKQpjYXNlIDYxOmNhc2UgMzM6cmV0dXJuIHRoaXMucmVhZFRva2VuX2VxX2V4Y2woY29kZSkKY2FzZSAxMjY6cmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucHJlZml4LDEpfQp0aGlzLnJhaXNlKHRoaXMucG9zLCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnIitjb2RlUG9pbnRUb1N0cmluZyhjb2RlKSsiJyIpO307cHAkOC5maW5pc2hPcD1mdW5jdGlvbih0eXBlLHNpemUpe3ZhciBzdHI9dGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcyx0aGlzLnBvcytzaXplKTt0aGlzLnBvcys9c2l6ZTtyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlLHN0cil9O3BwJDgucmVhZFJlZ2V4cD1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpczt2YXIgZXNjYXBlZCxpbkNsYXNzLHN0YXJ0PXRoaXMucG9zO2Zvcig7Oyl7aWYodGhpcyQxLnBvcz49dGhpcyQxLmlucHV0Lmxlbmd0aCl7dGhpcyQxLnJhaXNlKHN0YXJ0LCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uIik7fQp2YXIgY2g9dGhpcyQxLmlucHV0LmNoYXJBdCh0aGlzJDEucG9zKTtpZihsaW5lQnJlYWsudGVzdChjaCkpe3RoaXMkMS5yYWlzZShzdGFydCwiVW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpO30KaWYoIWVzY2FwZWQpe2lmKGNoPT09IlsiKXtpbkNsYXNzPXRydWU7fQplbHNlIGlmKGNoPT09Il0iJiZpbkNsYXNzKXtpbkNsYXNzPWZhbHNlO30KZWxzZSBpZihjaD09PSIvIiYmIWluQ2xhc3Mpe2JyZWFrfQplc2NhcGVkPWNoPT09IlxcIjt9ZWxzZXtlc2NhcGVkPWZhbHNlO30KKyt0aGlzJDEucG9zO30KdmFyIHBhdHRlcm49dGhpcy5pbnB1dC5zbGljZShzdGFydCx0aGlzLnBvcyk7Kyt0aGlzLnBvczt2YXIgZmxhZ3NTdGFydD10aGlzLnBvczt2YXIgZmxhZ3M9dGhpcy5yZWFkV29yZDEoKTtpZih0aGlzLmNvbnRhaW5zRXNjKXt0aGlzLnVuZXhwZWN0ZWQoZmxhZ3NTdGFydCk7fQp2YXIgc3RhdGU9dGhpcy5yZWdleHBTdGF0ZXx8KHRoaXMucmVnZXhwU3RhdGU9bmV3IFJlZ0V4cFZhbGlkYXRpb25TdGF0ZSh0aGlzKSk7c3RhdGUucmVzZXQoc3RhcnQscGF0dGVybixmbGFncyk7dGhpcy52YWxpZGF0ZVJlZ0V4cEZsYWdzKHN0YXRlKTt0aGlzLnZhbGlkYXRlUmVnRXhwUGF0dGVybihzdGF0ZSk7dmFyIHZhbHVlPW51bGw7dHJ5e3ZhbHVlPW5ldyBSZWdFeHAocGF0dGVybixmbGFncyk7fWNhdGNoKGUpe30KcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucmVnZXhwLHtwYXR0ZXJuOnBhdHRlcm4sZmxhZ3M6ZmxhZ3MsdmFsdWU6dmFsdWV9KX07cHAkOC5yZWFkSW50PWZ1bmN0aW9uKHJhZGl4LGxlbil7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydD10aGlzLnBvcyx0b3RhbD0wO2Zvcih2YXIgaT0wLGU9bGVuPT1udWxsP0luZmluaXR5OmxlbjtpPGU7KytpKXt2YXIgY29kZT10aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKSx2YWw9KHZvaWQgMCk7aWYoY29kZT49OTcpe3ZhbD1jb2RlLTk3KzEwO30KZWxzZSBpZihjb2RlPj02NSl7dmFsPWNvZGUtNjUrMTA7fQplbHNlIGlmKGNvZGU+PTQ4JiZjb2RlPD01Nyl7dmFsPWNvZGUtNDg7fQplbHNle3ZhbD1JbmZpbml0eTt9CmlmKHZhbD49cmFkaXgpe2JyZWFrfQorK3RoaXMkMS5wb3M7dG90YWw9dG90YWwqcmFkaXgrdmFsO30KaWYodGhpcy5wb3M9PT1zdGFydHx8bGVuIT1udWxsJiZ0aGlzLnBvcy1zdGFydCE9PWxlbil7cmV0dXJuIG51bGx9CnJldHVybiB0b3RhbH07cHAkOC5yZWFkUmFkaXhOdW1iZXI9ZnVuY3Rpb24ocmFkaXgpe3RoaXMucG9zKz0yO3ZhciB2YWw9dGhpcy5yZWFkSW50KHJhZGl4KTtpZih2YWw9PW51bGwpe3RoaXMucmFpc2UodGhpcy5zdGFydCsyLCJFeHBlY3RlZCBudW1iZXIgaW4gcmFkaXggIityYWRpeCk7fQppZihpc0lkZW50aWZpZXJTdGFydCh0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpKXt0aGlzLnJhaXNlKHRoaXMucG9zLCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlciIpO30KcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMubnVtLHZhbCl9O3BwJDgucmVhZE51bWJlcj1mdW5jdGlvbihzdGFydHNXaXRoRG90KXt2YXIgc3RhcnQ9dGhpcy5wb3M7aWYoIXN0YXJ0c1dpdGhEb3QmJnRoaXMucmVhZEludCgxMCk9PT1udWxsKXt0aGlzLnJhaXNlKHN0YXJ0LCJJbnZhbGlkIG51bWJlciIpO30KdmFyIG9jdGFsPXRoaXMucG9zLXN0YXJ0Pj0yJiZ0aGlzLmlucHV0LmNoYXJDb2RlQXQoc3RhcnQpPT09NDg7aWYob2N0YWwmJnRoaXMuc3RyaWN0KXt0aGlzLnJhaXNlKHN0YXJ0LCJJbnZhbGlkIG51bWJlciIpO30KaWYob2N0YWwmJi9bODldLy50ZXN0KHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsdGhpcy5wb3MpKSl7b2N0YWw9ZmFsc2U7fQp2YXIgbmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO2lmKG5leHQ9PT00NiYmIW9jdGFsKXsrK3RoaXMucG9zO3RoaXMucmVhZEludCgxMCk7bmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO30KaWYoKG5leHQ9PT02OXx8bmV4dD09PTEwMSkmJiFvY3RhbCl7bmV4dD10aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7aWYobmV4dD09PTQzfHxuZXh0PT09NDUpeysrdGhpcy5wb3M7fQppZih0aGlzLnJlYWRJbnQoMTApPT09bnVsbCl7dGhpcy5yYWlzZShzdGFydCwiSW52YWxpZCBudW1iZXIiKTt9fQppZihpc0lkZW50aWZpZXJTdGFydCh0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpKXt0aGlzLnJhaXNlKHRoaXMucG9zLCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlciIpO30KdmFyIHN0cj10aGlzLmlucHV0LnNsaWNlKHN0YXJ0LHRoaXMucG9zKTt2YXIgdmFsPW9jdGFsP3BhcnNlSW50KHN0ciw4KTpwYXJzZUZsb2F0KHN0cik7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMubnVtLHZhbCl9O3BwJDgucmVhZENvZGVQb2ludD1mdW5jdGlvbigpe3ZhciBjaD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpLGNvZGU7aWYoY2g9PT0xMjMpe2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjw2KXt0aGlzLnVuZXhwZWN0ZWQoKTt9CnZhciBjb2RlUG9zPSsrdGhpcy5wb3M7Y29kZT10aGlzLnJlYWRIZXhDaGFyKHRoaXMuaW5wdXQuaW5kZXhPZigifSIsdGhpcy5wb3MpLXRoaXMucG9zKTsrK3RoaXMucG9zO2lmKGNvZGU+MHgxMEZGRkYpe3RoaXMuaW52YWxpZFN0cmluZ1Rva2VuKGNvZGVQb3MsIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kcyIpO319ZWxzZXtjb2RlPXRoaXMucmVhZEhleENoYXIoNCk7fQpyZXR1cm4gY29kZX07ZnVuY3Rpb24gY29kZVBvaW50VG9TdHJpbmcoY29kZSl7aWYoY29kZTw9MHhGRkZGKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKX0KY29kZS09MHgxMDAwMDtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZT4+MTApKzB4RDgwMCwoY29kZSYxMDIzKSsweERDMDApfQpwcCQ4LnJlYWRTdHJpbmc9ZnVuY3Rpb24ocXVvdGUpe3ZhciB0aGlzJDE9dGhpczt2YXIgb3V0PSIiLGNodW5rU3RhcnQ9Kyt0aGlzLnBvcztmb3IoOzspe2lmKHRoaXMkMS5wb3M+PXRoaXMkMS5pbnB1dC5sZW5ndGgpe3RoaXMkMS5yYWlzZSh0aGlzJDEuc3RhcnQsIlVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnQiKTt9CnZhciBjaD10aGlzJDEuaW5wdXQuY2hhckNvZGVBdCh0aGlzJDEucG9zKTtpZihjaD09PXF1b3RlKXticmVha30KaWYoY2g9PT05Mil7b3V0Kz10aGlzJDEuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCx0aGlzJDEucG9zKTtvdXQrPXRoaXMkMS5yZWFkRXNjYXBlZENoYXIoZmFsc2UpO2NodW5rU3RhcnQ9dGhpcyQxLnBvczt9ZWxzZXtpZihpc05ld0xpbmUoY2gpKXt0aGlzJDEucmFpc2UodGhpcyQxLnN0YXJ0LCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50Iik7fQorK3RoaXMkMS5wb3M7fX0Kb3V0Kz10aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsdGhpcy5wb3MrKyk7cmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuc3RyaW5nLG91dCl9O3ZhciBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUj17fTtwcCQ4LnRyeVJlYWRUZW1wbGF0ZVRva2VuPWZ1bmN0aW9uKCl7dGhpcy5pblRlbXBsYXRlRWxlbWVudD10cnVlO3RyeXt0aGlzLnJlYWRUbXBsVG9rZW4oKTt9Y2F0Y2goZXJyKXtpZihlcnI9PT1JTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUil7dGhpcy5yZWFkSW52YWxpZFRlbXBsYXRlVG9rZW4oKTt9ZWxzZXt0aHJvdyBlcnJ9fQp0aGlzLmluVGVtcGxhdGVFbGVtZW50PWZhbHNlO307cHAkOC5pbnZhbGlkU3RyaW5nVG9rZW49ZnVuY3Rpb24ocG9zaXRpb24sbWVzc2FnZSl7aWYodGhpcy5pblRlbXBsYXRlRWxlbWVudCYmdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj05KXt0aHJvdyBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUn1lbHNle3RoaXMucmFpc2UocG9zaXRpb24sbWVzc2FnZSk7fX07cHAkOC5yZWFkVG1wbFRva2VuPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBvdXQ9IiIsY2h1bmtTdGFydD10aGlzLnBvcztmb3IoOzspe2lmKHRoaXMkMS5wb3M+PXRoaXMkMS5pbnB1dC5sZW5ndGgpe3RoaXMkMS5yYWlzZSh0aGlzJDEuc3RhcnQsIlVudGVybWluYXRlZCB0ZW1wbGF0ZSIpO30KdmFyIGNoPXRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MpO2lmKGNoPT09OTZ8fGNoPT09MzYmJnRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MrMSk9PT0xMjMpe2lmKHRoaXMkMS5wb3M9PT10aGlzJDEuc3RhcnQmJih0aGlzJDEudHlwZT09PXR5cGVzLnRlbXBsYXRlfHx0aGlzJDEudHlwZT09PXR5cGVzLmludmFsaWRUZW1wbGF0ZSkpe2lmKGNoPT09MzYpe3RoaXMkMS5wb3MrPTI7cmV0dXJuIHRoaXMkMS5maW5pc2hUb2tlbih0eXBlcy5kb2xsYXJCcmFjZUwpfWVsc2V7Kyt0aGlzJDEucG9zO3JldHVybiB0aGlzJDEuZmluaXNoVG9rZW4odHlwZXMuYmFja1F1b3RlKX19Cm91dCs9dGhpcyQxLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsdGhpcyQxLnBvcyk7cmV0dXJuIHRoaXMkMS5maW5pc2hUb2tlbih0eXBlcy50ZW1wbGF0ZSxvdXQpfQppZihjaD09PTkyKXtvdXQrPXRoaXMkMS5pbnB1dC5zbGljZShjaHVua1N0YXJ0LHRoaXMkMS5wb3MpO291dCs9dGhpcyQxLnJlYWRFc2NhcGVkQ2hhcih0cnVlKTtjaHVua1N0YXJ0PXRoaXMkMS5wb3M7fWVsc2UgaWYoaXNOZXdMaW5lKGNoKSl7b3V0Kz10aGlzJDEuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCx0aGlzJDEucG9zKTsrK3RoaXMkMS5wb3M7c3dpdGNoKGNoKXtjYXNlIDEzOmlmKHRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHRoaXMkMS5wb3MpPT09MTApeysrdGhpcyQxLnBvczt9CmNhc2UgMTA6b3V0Kz0iXG4iO2JyZWFrCmRlZmF1bHQ6b3V0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTticmVha30KaWYodGhpcyQxLm9wdGlvbnMubG9jYXRpb25zKXsrK3RoaXMkMS5jdXJMaW5lO3RoaXMkMS5saW5lU3RhcnQ9dGhpcyQxLnBvczt9CmNodW5rU3RhcnQ9dGhpcyQxLnBvczt9ZWxzZXsrK3RoaXMkMS5wb3M7fX19O3BwJDgucmVhZEludmFsaWRUZW1wbGF0ZVRva2VuPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO2Zvcig7dGhpcy5wb3M8dGhpcy5pbnB1dC5sZW5ndGg7dGhpcy5wb3MrKyl7c3dpdGNoKHRoaXMkMS5pbnB1dFt0aGlzJDEucG9zXSl7Y2FzZSJcXCI6Kyt0aGlzJDEucG9zO2JyZWFrCmNhc2UiJCI6aWYodGhpcyQxLmlucHV0W3RoaXMkMS5wb3MrMV0hPT0ieyIpe2JyZWFrfQpjYXNlImAiOnJldHVybiB0aGlzJDEuZmluaXNoVG9rZW4odHlwZXMuaW52YWxpZFRlbXBsYXRlLHRoaXMkMS5pbnB1dC5zbGljZSh0aGlzJDEuc3RhcnQsdGhpcyQxLnBvcykpfX0KdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGUiKTt9O3BwJDgucmVhZEVzY2FwZWRDaGFyPWZ1bmN0aW9uKGluVGVtcGxhdGUpe3ZhciBjaD10aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7Kyt0aGlzLnBvcztzd2l0Y2goY2gpe2Nhc2UgMTEwOnJldHVybiJcbiIKY2FzZSAxMTQ6cmV0dXJuIlxyIgpjYXNlIDEyMDpyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRIZXhDaGFyKDIpKQpjYXNlIDExNzpyZXR1cm4gY29kZVBvaW50VG9TdHJpbmcodGhpcy5yZWFkQ29kZVBvaW50KCkpCmNhc2UgMTE2OnJldHVybiJcdCIKY2FzZSA5ODpyZXR1cm4iXGIiCmNhc2UgMTE4OnJldHVybiJcdTAwMGIiCmNhc2UgMTAyOnJldHVybiJcZiIKY2FzZSAxMzppZih0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpPT09MTApeysrdGhpcy5wb3M7fQpjYXNlIDEwOmlmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpe3RoaXMubGluZVN0YXJ0PXRoaXMucG9zOysrdGhpcy5jdXJMaW5lO30KcmV0dXJuIiIKZGVmYXVsdDppZihjaD49NDgmJmNoPD01NSl7dmFyIG9jdGFsU3RyPXRoaXMuaW5wdXQuc3Vic3RyKHRoaXMucG9zLTEsMykubWF0Y2goL15bMC03XSsvKVswXTt2YXIgb2N0YWw9cGFyc2VJbnQob2N0YWxTdHIsOCk7aWYob2N0YWw+MjU1KXtvY3RhbFN0cj1vY3RhbFN0ci5zbGljZSgwLC0xKTtvY3RhbD1wYXJzZUludChvY3RhbFN0ciw4KTt9CnRoaXMucG9zKz1vY3RhbFN0ci5sZW5ndGgtMTtjaD10aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO2lmKChvY3RhbFN0ciE9PSIwInx8Y2g9PTU2fHxjaD09NTcpJiYodGhpcy5zdHJpY3R8fGluVGVtcGxhdGUpKXt0aGlzLmludmFsaWRTdHJpbmdUb2tlbih0aGlzLnBvcy0xLW9jdGFsU3RyLmxlbmd0aCxpblRlbXBsYXRlPyJPY3RhbCBsaXRlcmFsIGluIHRlbXBsYXRlIHN0cmluZyI6Ik9jdGFsIGxpdGVyYWwgaW4gc3RyaWN0IG1vZGUiKTt9CnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG9jdGFsKX0KcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpfX07cHAkOC5yZWFkSGV4Q2hhcj1mdW5jdGlvbihsZW4pe3ZhciBjb2RlUG9zPXRoaXMucG9zO3ZhciBuPXRoaXMucmVhZEludCgxNixsZW4pO2lmKG49PT1udWxsKXt0aGlzLmludmFsaWRTdHJpbmdUb2tlbihjb2RlUG9zLCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZSIpO30KcmV0dXJuIG59O3BwJDgucmVhZFdvcmQxPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3RoaXMuY29udGFpbnNFc2M9ZmFsc2U7dmFyIHdvcmQ9IiIsZmlyc3Q9dHJ1ZSxjaHVua1N0YXJ0PXRoaXMucG9zO3ZhciBhc3RyYWw9dGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02O3doaWxlKHRoaXMucG9zPHRoaXMuaW5wdXQubGVuZ3RoKXt2YXIgY2g9dGhpcyQxLmZ1bGxDaGFyQ29kZUF0UG9zKCk7aWYoaXNJZGVudGlmaWVyQ2hhcihjaCxhc3RyYWwpKXt0aGlzJDEucG9zKz1jaDw9MHhmZmZmPzE6Mjt9ZWxzZSBpZihjaD09PTkyKXt0aGlzJDEuY29udGFpbnNFc2M9dHJ1ZTt3b3JkKz10aGlzJDEuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCx0aGlzJDEucG9zKTt2YXIgZXNjU3RhcnQ9dGhpcyQxLnBvcztpZih0aGlzJDEuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMkMS5wb3MpIT0xMTcpCnt0aGlzJDEuaW52YWxpZFN0cmluZ1Rva2VuKHRoaXMkMS5wb3MsIkV4cGVjdGluZyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSBcXHVYWFhYIik7fQorK3RoaXMkMS5wb3M7dmFyIGVzYz10aGlzJDEucmVhZENvZGVQb2ludCgpO2lmKCEoZmlyc3Q/aXNJZGVudGlmaWVyU3RhcnQ6aXNJZGVudGlmaWVyQ2hhcikoZXNjLGFzdHJhbCkpCnt0aGlzJDEuaW52YWxpZFN0cmluZ1Rva2VuKGVzY1N0YXJ0LCJJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIik7fQp3b3JkKz1jb2RlUG9pbnRUb1N0cmluZyhlc2MpO2NodW5rU3RhcnQ9dGhpcyQxLnBvczt9ZWxzZXticmVha30KZmlyc3Q9ZmFsc2U7fQpyZXR1cm4gd29yZCt0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsdGhpcy5wb3MpfTtwcCQ4LnJlYWRXb3JkPWZ1bmN0aW9uKCl7dmFyIHdvcmQ9dGhpcy5yZWFkV29yZDEoKTt2YXIgdHlwZT10eXBlcy5uYW1lO2lmKHRoaXMua2V5d29yZHMudGVzdCh3b3JkKSl7aWYodGhpcy5jb250YWluc0VzYyl7dGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIkVzY2FwZSBzZXF1ZW5jZSBpbiBrZXl3b3JkICIrd29yZCk7fQp0eXBlPWtleXdvcmRzJDFbd29yZF07fQpyZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlLHdvcmQpfTt2YXIgdmVyc2lvbj0iNS41LjMiO2Z1bmN0aW9uIHBhcnNlKGlucHV0LG9wdGlvbnMpe3JldHVybiBuZXcgUGFyc2VyKG9wdGlvbnMsaW5wdXQpLnBhcnNlKCl9CmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbkF0KGlucHV0LHBvcyxvcHRpb25zKXt2YXIgcD1uZXcgUGFyc2VyKG9wdGlvbnMsaW5wdXQscG9zKTtwLm5leHRUb2tlbigpO3JldHVybiBwLnBhcnNlRXhwcmVzc2lvbigpfQpmdW5jdGlvbiB0b2tlbml6ZXIoaW5wdXQsb3B0aW9ucyl7cmV0dXJuIG5ldyBQYXJzZXIob3B0aW9ucyxpbnB1dCl9CmZ1bmN0aW9uIGFkZExvb3NlRXhwb3J0cyhwYXJzZSxQYXJzZXIkJDEscGx1Z2lucyQkMSl7ZXhwb3J0cy5wYXJzZV9kYW1taXQ9cGFyc2U7ZXhwb3J0cy5Mb29zZVBhcnNlcj1QYXJzZXIkJDE7ZXhwb3J0cy5wbHVnaW5zTG9vc2U9cGx1Z2lucyQkMTt9CmV4cG9ydHMudmVyc2lvbj12ZXJzaW9uO2V4cG9ydHMucGFyc2U9cGFyc2U7ZXhwb3J0cy5wYXJzZUV4cHJlc3Npb25BdD1wYXJzZUV4cHJlc3Npb25BdDtleHBvcnRzLnRva2VuaXplcj10b2tlbml6ZXI7ZXhwb3J0cy5hZGRMb29zZUV4cG9ydHM9YWRkTG9vc2VFeHBvcnRzO2V4cG9ydHMuUGFyc2VyPVBhcnNlcjtleHBvcnRzLnBsdWdpbnM9cGx1Z2lucztleHBvcnRzLmRlZmF1bHRPcHRpb25zPWRlZmF1bHRPcHRpb25zO2V4cG9ydHMuUG9zaXRpb249UG9zaXRpb247ZXhwb3J0cy5Tb3VyY2VMb2NhdGlvbj1Tb3VyY2VMb2NhdGlvbjtleHBvcnRzLmdldExpbmVJbmZvPWdldExpbmVJbmZvO2V4cG9ydHMuTm9kZT1Ob2RlO2V4cG9ydHMuVG9rZW5UeXBlPVRva2VuVHlwZTtleHBvcnRzLnRva1R5cGVzPXR5cGVzO2V4cG9ydHMua2V5d29yZFR5cGVzPWtleXdvcmRzJDE7ZXhwb3J0cy5Ub2tDb250ZXh0PVRva0NvbnRleHQ7ZXhwb3J0cy50b2tDb250ZXh0cz10eXBlcyQxO2V4cG9ydHMuaXNJZGVudGlmaWVyQ2hhcj1pc0lkZW50aWZpZXJDaGFyO2V4cG9ydHMuaXNJZGVudGlmaWVyU3RhcnQ9aXNJZGVudGlmaWVyU3RhcnQ7ZXhwb3J0cy5Ub2tlbj1Ub2tlbjtleHBvcnRzLmlzTmV3TGluZT1pc05ld0xpbmU7ZXhwb3J0cy5saW5lQnJlYWs9bGluZUJyZWFrO2V4cG9ydHMubGluZUJyZWFrRz1saW5lQnJlYWtHO2V4cG9ydHMubm9uQVNDSUl3aGl0ZXNwYWNlPW5vbkFTQ0lJd2hpdGVzcGFjZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywnX19lc01vZHVsZScse3ZhbHVlOnRydWV9KTt9KSkpOzsoZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe3R5cGVvZiBleHBvcnRzPT09J29iamVjdCcmJnR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJz9mYWN0b3J5KGV4cG9ydHMscmVxdWlyZSgnLi9hY29ybicpKTp0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJyYmZGVmaW5lLmFtZD9kZWZpbmUoWydleHBvcnRzJywnLi9hY29ybiddLGZhY3RvcnkpOihmYWN0b3J5KChnbG9iYWwuYWNvcm49Z2xvYmFsLmFjb3JufHx7fSxnbG9iYWwuYWNvcm4ubG9vc2U9Z2xvYmFsLmFjb3JuLmxvb3NlfHx7fSksZ2xvYmFsLmFjb3JuKSk7fSh0aGlzLChmdW5jdGlvbihleHBvcnRzLF9fYWNvcm4peyd1c2Ugc3RyaWN0Jzt2YXIgcGx1Z2luc0xvb3NlPXt9CnZhciBMb29zZVBhcnNlcj1mdW5jdGlvbiBMb29zZVBhcnNlcihpbnB1dCxvcHRpb25zKXtpZihvcHRpb25zPT09dm9pZCAwKW9wdGlvbnM9e307dGhpcy50b2tzPV9fYWNvcm4udG9rZW5pemVyKGlucHV0LG9wdGlvbnMpCnRoaXMub3B0aW9ucz10aGlzLnRva3Mub3B0aW9ucwp0aGlzLmlucHV0PXRoaXMudG9rcy5pbnB1dAp0aGlzLnRvaz10aGlzLmxhc3Q9e3R5cGU6X19hY29ybi50b2tUeXBlcy5lb2Ysc3RhcnQ6MCxlbmQ6MH0KaWYodGhpcy5vcHRpb25zLmxvY2F0aW9ucyl7dmFyIGhlcmU9dGhpcy50b2tzLmN1clBvc2l0aW9uKCkKdGhpcy50b2subG9jPW5ldyBfX2Fjb3JuLlNvdXJjZUxvY2F0aW9uKHRoaXMudG9rcyxoZXJlLGhlcmUpfQp0aGlzLmFoZWFkPVtdCnRoaXMuY29udGV4dD1bXQp0aGlzLmN1ckluZGVudD0wCnRoaXMuY3VyTGluZVN0YXJ0PTAKdGhpcy5uZXh0TGluZVN0YXJ0PXRoaXMubGluZUVuZCh0aGlzLmN1ckxpbmVTdGFydCkrMQp0aGlzLmluQXN5bmM9ZmFsc2UKdGhpcy5vcHRpb25zLnBsdWdpbnNMb29zZT1vcHRpb25zLnBsdWdpbnNMb29zZXx8e30KdGhpcy5sb2FkUGx1Z2lucyh0aGlzLm9wdGlvbnMucGx1Z2luc0xvb3NlKX07TG9vc2VQYXJzZXIucHJvdG90eXBlLnN0YXJ0Tm9kZT1mdW5jdGlvbiBzdGFydE5vZGUoKXtyZXR1cm4gbmV3IF9fYWNvcm4uTm9kZSh0aGlzLnRva3MsdGhpcy50b2suc3RhcnQsdGhpcy5vcHRpb25zLmxvY2F0aW9ucz90aGlzLnRvay5sb2Muc3RhcnQ6bnVsbCl9O0xvb3NlUGFyc2VyLnByb3RvdHlwZS5zdG9yZUN1cnJlbnRQb3M9ZnVuY3Rpb24gc3RvcmVDdXJyZW50UG9zKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5sb2NhdGlvbnM/W3RoaXMudG9rLnN0YXJ0LHRoaXMudG9rLmxvYy5zdGFydF06dGhpcy50b2suc3RhcnR9O0xvb3NlUGFyc2VyLnByb3RvdHlwZS5zdGFydE5vZGVBdD1mdW5jdGlvbiBzdGFydE5vZGVBdChwb3Mpe2lmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpe3JldHVybiBuZXcgX19hY29ybi5Ob2RlKHRoaXMudG9rcyxwb3NbMF0scG9zWzFdKX1lbHNle3JldHVybiBuZXcgX19hY29ybi5Ob2RlKHRoaXMudG9rcyxwb3MpfX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmZpbmlzaE5vZGU9ZnVuY3Rpb24gZmluaXNoTm9kZShub2RlLHR5cGUpe25vZGUudHlwZT10eXBlCm5vZGUuZW5kPXRoaXMubGFzdC5lbmQKaWYodGhpcy5vcHRpb25zLmxvY2F0aW9ucykKbm9kZS5sb2MuZW5kPXRoaXMubGFzdC5sb2MuZW5kCmlmKHRoaXMub3B0aW9ucy5yYW5nZXMpCm5vZGUucmFuZ2VbMV09dGhpcy5sYXN0LmVuZApyZXR1cm4gbm9kZX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmR1bW15Tm9kZT1mdW5jdGlvbiBkdW1teU5vZGUodHlwZSl7dmFyIGR1bW15PXRoaXMuc3RhcnROb2RlKCkKZHVtbXkudHlwZT10eXBlCmR1bW15LmVuZD1kdW1teS5zdGFydAppZih0aGlzLm9wdGlvbnMubG9jYXRpb25zKQpkdW1teS5sb2MuZW5kPWR1bW15LmxvYy5zdGFydAppZih0aGlzLm9wdGlvbnMucmFuZ2VzKQpkdW1teS5yYW5nZVsxXT1kdW1teS5zdGFydAp0aGlzLmxhc3Q9e3R5cGU6X19hY29ybi50b2tUeXBlcy5uYW1lLHN0YXJ0OmR1bW15LnN0YXJ0LGVuZDpkdW1teS5zdGFydCxsb2M6ZHVtbXkubG9jfQpyZXR1cm4gZHVtbXl9O0xvb3NlUGFyc2VyLnByb3RvdHlwZS5kdW1teUlkZW50PWZ1bmN0aW9uIGR1bW15SWRlbnQoKXt2YXIgZHVtbXk9dGhpcy5kdW1teU5vZGUoIklkZW50aWZpZXIiKQpkdW1teS5uYW1lPSLinJYiCnJldHVybiBkdW1teX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmR1bW15U3RyaW5nPWZ1bmN0aW9uIGR1bW15U3RyaW5nKCl7dmFyIGR1bW15PXRoaXMuZHVtbXlOb2RlKCJMaXRlcmFsIikKZHVtbXkudmFsdWU9ZHVtbXkucmF3PSLinJYiCnJldHVybiBkdW1teX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmVhdD1mdW5jdGlvbiBlYXQodHlwZSl7aWYodGhpcy50b2sudHlwZT09PXR5cGUpe3RoaXMubmV4dCgpCnJldHVybiB0cnVlfWVsc2V7cmV0dXJuIGZhbHNlfX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmlzQ29udGV4dHVhbD1mdW5jdGlvbiBpc0NvbnRleHR1YWwobmFtZSl7cmV0dXJuIHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLm5hbWUmJnRoaXMudG9rLnZhbHVlPT09bmFtZX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmVhdENvbnRleHR1YWw9ZnVuY3Rpb24gZWF0Q29udGV4dHVhbChuYW1lKXtyZXR1cm4gdGhpcy50b2sudmFsdWU9PT1uYW1lJiZ0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLm5hbWUpfTtMb29zZVBhcnNlci5wcm90b3R5cGUuY2FuSW5zZXJ0U2VtaWNvbG9uPWZ1bmN0aW9uIGNhbkluc2VydFNlbWljb2xvbigpe3JldHVybiB0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5lb2Z8fHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLmJyYWNlUnx8X19hY29ybi5saW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdC5lbmQsdGhpcy50b2suc3RhcnQpKX07TG9vc2VQYXJzZXIucHJvdG90eXBlLnNlbWljb2xvbj1mdW5jdGlvbiBzZW1pY29sb24oKXtyZXR1cm4gdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5zZW1pKX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmV4cGVjdD1mdW5jdGlvbiBleHBlY3QodHlwZSl7dmFyIHRoaXMkMT10aGlzO2lmKHRoaXMuZWF0KHR5cGUpKXJldHVybiB0cnVlCmZvcih2YXIgaT0xO2k8PTI7aSsrKXtpZih0aGlzJDEubG9va0FoZWFkKGkpLnR5cGU9PXR5cGUpe2Zvcih2YXIgaj0wO2o8aTtqKyspdGhpcyQxLm5leHQoKQpyZXR1cm4gdHJ1ZX19fTtMb29zZVBhcnNlci5wcm90b3R5cGUucHVzaEN4PWZ1bmN0aW9uIHB1c2hDeCgpe3RoaXMuY29udGV4dC5wdXNoKHRoaXMuY3VySW5kZW50KX07TG9vc2VQYXJzZXIucHJvdG90eXBlLnBvcEN4PWZ1bmN0aW9uIHBvcEN4KCl7dGhpcy5jdXJJbmRlbnQ9dGhpcy5jb250ZXh0LnBvcCgpfTtMb29zZVBhcnNlci5wcm90b3R5cGUubGluZUVuZD1mdW5jdGlvbiBsaW5lRW5kKHBvcyl7d2hpbGUocG9zPHRoaXMuaW5wdXQubGVuZ3RoJiYhX19hY29ybi5pc05ld0xpbmUodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcykpKSsrcG9zCnJldHVybiBwb3N9O0xvb3NlUGFyc2VyLnByb3RvdHlwZS5pbmRlbnRhdGlvbkFmdGVyPWZ1bmN0aW9uIGluZGVudGF0aW9uQWZ0ZXIocG9zKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBjb3VudD0wOzsrK3Bvcyl7dmFyIGNoPXRoaXMkMS5pbnB1dC5jaGFyQ29kZUF0KHBvcykKaWYoY2g9PT0zMikrK2NvdW50CmVsc2UgaWYoY2g9PT05KWNvdW50Kz10aGlzJDEub3B0aW9ucy50YWJTaXplCmVsc2UgcmV0dXJuIGNvdW50fX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmNsb3Nlcz1mdW5jdGlvbiBjbG9zZXMoY2xvc2VUb2ssaW5kZW50LGxpbmUsYmxvY2tIZXVyaXN0aWMpe2lmKHRoaXMudG9rLnR5cGU9PT1jbG9zZVRva3x8dGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuZW9mKXJldHVybiB0cnVlCnJldHVybiBsaW5lIT10aGlzLmN1ckxpbmVTdGFydCYmdGhpcy5jdXJJbmRlbnQ8aW5kZW50JiZ0aGlzLnRva2VuU3RhcnRzTGluZSgpJiYoIWJsb2NrSGV1cmlzdGljfHx0aGlzLm5leHRMaW5lU3RhcnQ+PXRoaXMuaW5wdXQubGVuZ3RofHx0aGlzLmluZGVudGF0aW9uQWZ0ZXIodGhpcy5uZXh0TGluZVN0YXJ0KTxpbmRlbnQpfTtMb29zZVBhcnNlci5wcm90b3R5cGUudG9rZW5TdGFydHNMaW5lPWZ1bmN0aW9uIHRva2VuU3RhcnRzTGluZSgpe3ZhciB0aGlzJDE9dGhpcztmb3IodmFyIHA9dGhpcy50b2suc3RhcnQtMTtwPj10aGlzLmN1ckxpbmVTdGFydDstLXApe3ZhciBjaD10aGlzJDEuaW5wdXQuY2hhckNvZGVBdChwKQppZihjaCE9PTkmJmNoIT09MzIpcmV0dXJuIGZhbHNlfQpyZXR1cm4gdHJ1ZX07TG9vc2VQYXJzZXIucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbiBleHRlbmQobmFtZSxmKXt0aGlzW25hbWVdPWYodGhpc1tuYW1lXSl9O0xvb3NlUGFyc2VyLnByb3RvdHlwZS5sb2FkUGx1Z2lucz1mdW5jdGlvbiBsb2FkUGx1Z2lucyhwbHVnaW5Db25maWdzKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBuYW1lIGluIHBsdWdpbkNvbmZpZ3Mpe3ZhciBwbHVnaW49cGx1Z2luc0xvb3NlW25hbWVdCmlmKCFwbHVnaW4pdGhyb3cgbmV3IEVycm9yKCJQbHVnaW4gJyIrbmFtZSsiJyBub3QgZm91bmQiKQpwbHVnaW4odGhpcyQxLHBsdWdpbkNvbmZpZ3NbbmFtZV0pfX07dmFyIGxwPUxvb3NlUGFyc2VyLnByb3RvdHlwZQpmdW5jdGlvbiBpc1NwYWNlKGNoKXtyZXR1cm4oY2g8MTQmJmNoPjgpfHxjaD09PTMyfHxjaD09PTE2MHx8X19hY29ybi5pc05ld0xpbmUoY2gpfQpscC5uZXh0PWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3RoaXMubGFzdD10aGlzLnRvawppZih0aGlzLmFoZWFkLmxlbmd0aCkKdGhpcy50b2s9dGhpcy5haGVhZC5zaGlmdCgpCmVsc2UKdGhpcy50b2s9dGhpcy5yZWFkVG9rZW4oKQppZih0aGlzLnRvay5zdGFydD49dGhpcy5uZXh0TGluZVN0YXJ0KXt3aGlsZSh0aGlzLnRvay5zdGFydD49dGhpcy5uZXh0TGluZVN0YXJ0KXt0aGlzJDEuY3VyTGluZVN0YXJ0PXRoaXMkMS5uZXh0TGluZVN0YXJ0CnRoaXMkMS5uZXh0TGluZVN0YXJ0PXRoaXMkMS5saW5lRW5kKHRoaXMkMS5jdXJMaW5lU3RhcnQpKzF9CnRoaXMuY3VySW5kZW50PXRoaXMuaW5kZW50YXRpb25BZnRlcih0aGlzLmN1ckxpbmVTdGFydCl9fQpscC5yZWFkVG9rZW49ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKDs7KXt0cnl7dGhpcyQxLnRva3MubmV4dCgpCmlmKHRoaXMkMS50b2tzLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLmRvdCYmdGhpcyQxLmlucHV0LnN1YnN0cih0aGlzJDEudG9rcy5lbmQsMSk9PT0iLiImJnRoaXMkMS5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXt0aGlzJDEudG9rcy5lbmQrKwp0aGlzJDEudG9rcy50eXBlPV9fYWNvcm4udG9rVHlwZXMuZWxsaXBzaXN9CnJldHVybiBuZXcgX19hY29ybi5Ub2tlbih0aGlzJDEudG9rcyl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpKXRocm93IGUKdmFyIG1zZz1lLm1lc3NhZ2UscG9zPWUucmFpc2VkQXQscmVwbGFjZT10cnVlCmlmKC91bnRlcm1pbmF0ZWQvaS50ZXN0KG1zZykpe3Bvcz10aGlzJDEubGluZUVuZChlLnBvcysxKQppZigvc3RyaW5nLy50ZXN0KG1zZykpe3JlcGxhY2U9e3N0YXJ0OmUucG9zLGVuZDpwb3MsdHlwZTpfX2Fjb3JuLnRva1R5cGVzLnN0cmluZyx2YWx1ZTp0aGlzJDEuaW5wdXQuc2xpY2UoZS5wb3MrMSxwb3MpfX1lbHNlIGlmKC9yZWd1bGFyIGV4cHIvaS50ZXN0KG1zZykpe3ZhciByZT10aGlzJDEuaW5wdXQuc2xpY2UoZS5wb3MscG9zKQp0cnl7cmU9bmV3IFJlZ0V4cChyZSl9Y2F0Y2goZSl7fQpyZXBsYWNlPXtzdGFydDplLnBvcyxlbmQ6cG9zLHR5cGU6X19hY29ybi50b2tUeXBlcy5yZWdleHAsdmFsdWU6cmV9fWVsc2UgaWYoL3RlbXBsYXRlLy50ZXN0KG1zZykpe3JlcGxhY2U9e3N0YXJ0OmUucG9zLGVuZDpwb3MsdHlwZTpfX2Fjb3JuLnRva1R5cGVzLnRlbXBsYXRlLHZhbHVlOnRoaXMkMS5pbnB1dC5zbGljZShlLnBvcyxwb3MpfX1lbHNle3JlcGxhY2U9ZmFsc2V9fWVsc2UgaWYoL2ludmFsaWQgKHVuaWNvZGV8cmVnZXhwfG51bWJlcil8ZXhwZWN0aW5nIHVuaWNvZGV8b2N0YWwgbGl0ZXJhbHxpcyByZXNlcnZlZHxkaXJlY3RseSBhZnRlciBudW1iZXJ8ZXhwZWN0ZWQgbnVtYmVyIGluIHJhZGl4L2kudGVzdChtc2cpKXt3aGlsZShwb3M8dGhpcy5pbnB1dC5sZW5ndGgmJiFpc1NwYWNlKHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MpKSkrK3Bvc31lbHNlIGlmKC9jaGFyYWN0ZXIgZXNjYXBlfGV4cGVjdGVkIGhleGFkZWNpbWFsL2kudGVzdChtc2cpKXt3aGlsZShwb3M8dGhpcy5pbnB1dC5sZW5ndGgpe3ZhciBjaD10aGlzJDEuaW5wdXQuY2hhckNvZGVBdChwb3MrKykKaWYoY2g9PT0zNHx8Y2g9PT0zOXx8X19hY29ybi5pc05ld0xpbmUoY2gpKWJyZWFrfX1lbHNlIGlmKC91bmV4cGVjdGVkIGNoYXJhY3Rlci9pLnRlc3QobXNnKSl7cG9zKysKcmVwbGFjZT1mYWxzZX1lbHNlIGlmKC9yZWd1bGFyIGV4cHJlc3Npb24vaS50ZXN0KG1zZykpe3JlcGxhY2U9dHJ1ZX1lbHNle3Rocm93IGV9CnRoaXMkMS5yZXNldFRvKHBvcykKaWYocmVwbGFjZT09PXRydWUpcmVwbGFjZT17c3RhcnQ6cG9zLGVuZDpwb3MsdHlwZTpfX2Fjb3JuLnRva1R5cGVzLm5hbWUsdmFsdWU6IuKcliJ9CmlmKHJlcGxhY2Upe2lmKHRoaXMkMS5vcHRpb25zLmxvY2F0aW9ucykKcmVwbGFjZS5sb2M9bmV3IF9fYWNvcm4uU291cmNlTG9jYXRpb24odGhpcyQxLnRva3MsX19hY29ybi5nZXRMaW5lSW5mbyh0aGlzJDEuaW5wdXQscmVwbGFjZS5zdGFydCksX19hY29ybi5nZXRMaW5lSW5mbyh0aGlzJDEuaW5wdXQscmVwbGFjZS5lbmQpKQpyZXR1cm4gcmVwbGFjZX19fX0KbHAucmVzZXRUbz1mdW5jdGlvbihwb3Mpe3ZhciB0aGlzJDE9dGhpczt0aGlzLnRva3MucG9zPXBvcwp2YXIgY2g9dGhpcy5pbnB1dC5jaGFyQXQocG9zLTEpCnRoaXMudG9rcy5leHByQWxsb3dlZD0hY2h8fC9bW3soLDs6Py8qPStcLX4hfCYlXjw+XS8udGVzdChjaCl8fC9bZW53ZmRdLy50ZXN0KGNoKSYmL1xiKGtleXdvcmRzfGNhc2V8ZWxzZXxyZXR1cm58dGhyb3d8bmV3fGlufChpbnN0YW5jZXx0eXBlKW9mfGRlbGV0ZXx2b2lkKSQvLnRlc3QodGhpcy5pbnB1dC5zbGljZShwb3MtMTAscG9zKSkKaWYodGhpcy5vcHRpb25zLmxvY2F0aW9ucyl7dGhpcy50b2tzLmN1ckxpbmU9MQp0aGlzLnRva3MubGluZVN0YXJ0PV9fYWNvcm4ubGluZUJyZWFrRy5sYXN0SW5kZXg9MAp2YXIgbWF0Y2gKd2hpbGUoKG1hdGNoPV9fYWNvcm4ubGluZUJyZWFrRy5leGVjKHRoaXMuaW5wdXQpKSYmbWF0Y2guaW5kZXg8cG9zKXsrK3RoaXMkMS50b2tzLmN1ckxpbmUKdGhpcyQxLnRva3MubGluZVN0YXJ0PW1hdGNoLmluZGV4K21hdGNoWzBdLmxlbmd0aH19fQpscC5sb29rQWhlYWQ9ZnVuY3Rpb24obil7dmFyIHRoaXMkMT10aGlzO3doaWxlKG4+dGhpcy5haGVhZC5sZW5ndGgpCnRoaXMkMS5haGVhZC5wdXNoKHRoaXMkMS5yZWFkVG9rZW4oKSkKcmV0dXJuIHRoaXMuYWhlYWRbbi0xXX0KZnVuY3Rpb24gaXNEdW1teShub2RlKXtyZXR1cm4gbm9kZS5uYW1lPT0i4pyWIn0KdmFyIGxwJDE9TG9vc2VQYXJzZXIucHJvdG90eXBlCmxwJDEucGFyc2VUb3BMZXZlbD1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpczt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZUF0KHRoaXMub3B0aW9ucy5sb2NhdGlvbnM/WzAsX19hY29ybi5nZXRMaW5lSW5mbyh0aGlzLmlucHV0LDApXTowKQpub2RlLmJvZHk9W10Kd2hpbGUodGhpcy50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMuZW9mKW5vZGUuYm9keS5wdXNoKHRoaXMkMS5wYXJzZVN0YXRlbWVudCgpKQp0aGlzLmxhc3Q9dGhpcy50b2sKaWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXtub2RlLnNvdXJjZVR5cGU9dGhpcy5vcHRpb25zLnNvdXJjZVR5cGV9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiUHJvZ3JhbSIpfQpscCQxLnBhcnNlU3RhdGVtZW50PWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydHR5cGU9dGhpcy50b2sudHlwZSxub2RlPXRoaXMuc3RhcnROb2RlKCksa2luZAppZih0aGlzLnRva3MuaXNMZXQoKSl7c3RhcnR0eXBlPV9fYWNvcm4udG9rVHlwZXMuX3ZhcgpraW5kPSJsZXQifQpzd2l0Y2goc3RhcnR0eXBlKXtjYXNlIF9fYWNvcm4udG9rVHlwZXMuX2JyZWFrOmNhc2UgX19hY29ybi50b2tUeXBlcy5fY29udGludWU6dGhpcy5uZXh0KCkKdmFyIGlzQnJlYWs9c3RhcnR0eXBlPT09X19hY29ybi50b2tUeXBlcy5fYnJlYWsKaWYodGhpcy5zZW1pY29sb24oKXx8dGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSl7bm9kZS5sYWJlbD1udWxsfWVsc2V7bm9kZS5sYWJlbD10aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5uYW1lP3RoaXMucGFyc2VJZGVudCgpOm51bGwKdGhpcy5zZW1pY29sb24oKX0KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLGlzQnJlYWs/IkJyZWFrU3RhdGVtZW50IjoiQ29udGludWVTdGF0ZW1lbnQiKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX2RlYnVnZ2VyOnRoaXMubmV4dCgpCnRoaXMuc2VtaWNvbG9uKCkKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJEZWJ1Z2dlclN0YXRlbWVudCIpCmNhc2UgX19hY29ybi50b2tUeXBlcy5fZG86dGhpcy5uZXh0KCkKbm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoKQpub2RlLnRlc3Q9dGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5fd2hpbGUpP3RoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTp0aGlzLmR1bW15SWRlbnQoKQp0aGlzLnNlbWljb2xvbigpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiRG9XaGlsZVN0YXRlbWVudCIpCmNhc2UgX19hY29ybi50b2tUeXBlcy5fZm9yOnRoaXMubmV4dCgpCnRoaXMucHVzaEN4KCkKdGhpcy5leHBlY3QoX19hY29ybi50b2tUeXBlcy5wYXJlbkwpCmlmKHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLnNlbWkpcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSxudWxsKQp2YXIgaXNMZXQ9dGhpcy50b2tzLmlzTGV0KCkKaWYoaXNMZXR8fHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl92YXJ8fHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl9jb25zdCl7dmFyIGluaXQkMT10aGlzLnBhcnNlVmFyKHRydWUsaXNMZXQ/ImxldCI6dGhpcy50b2sudmFsdWUpCmlmKGluaXQkMS5kZWNsYXJhdGlvbnMubGVuZ3RoPT09MSYmKHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl9pbnx8dGhpcy5pc0NvbnRleHR1YWwoIm9mIikpKXtyZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUsaW5pdCQxKX0KcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSxpbml0JDEpfQp2YXIgaW5pdD10aGlzLnBhcnNlRXhwcmVzc2lvbih0cnVlKQppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5faW58fHRoaXMuaXNDb250ZXh0dWFsKCJvZiIpKQpyZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUsdGhpcy50b0Fzc2lnbmFibGUoaW5pdCkpCnJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsaW5pdCkKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9mdW5jdGlvbjp0aGlzLm5leHQoKQpyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKG5vZGUsdHJ1ZSkKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9pZjp0aGlzLm5leHQoKQpub2RlLnRlc3Q9dGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpCm5vZGUuY29uc2VxdWVudD10aGlzLnBhcnNlU3RhdGVtZW50KCkKbm9kZS5hbHRlcm5hdGU9dGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5fZWxzZSk/dGhpcy5wYXJzZVN0YXRlbWVudCgpOm51bGwKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJJZlN0YXRlbWVudCIpCmNhc2UgX19hY29ybi50b2tUeXBlcy5fcmV0dXJuOnRoaXMubmV4dCgpCmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuc2VtaSl8fHRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpbm9kZS5hcmd1bWVudD1udWxsCmVsc2V7bm9kZS5hcmd1bWVudD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO3RoaXMuc2VtaWNvbG9uKCl9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiUmV0dXJuU3RhdGVtZW50IikKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9zd2l0Y2g6dmFyIGJsb2NrSW5kZW50PXRoaXMuY3VySW5kZW50LGxpbmU9dGhpcy5jdXJMaW5lU3RhcnQKdGhpcy5uZXh0KCkKbm9kZS5kaXNjcmltaW5hbnQ9dGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpCm5vZGUuY2FzZXM9W10KdGhpcy5wdXNoQ3goKQp0aGlzLmV4cGVjdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlTCkKdmFyIGN1cgp3aGlsZSghdGhpcy5jbG9zZXMoX19hY29ybi50b2tUeXBlcy5icmFjZVIsYmxvY2tJbmRlbnQsbGluZSx0cnVlKSl7aWYodGhpcyQxLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5fY2FzZXx8dGhpcyQxLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5fZGVmYXVsdCl7dmFyIGlzQ2FzZT10aGlzJDEudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl9jYXNlCmlmKGN1cil0aGlzJDEuZmluaXNoTm9kZShjdXIsIlN3aXRjaENhc2UiKQpub2RlLmNhc2VzLnB1c2goY3VyPXRoaXMkMS5zdGFydE5vZGUoKSkKY3VyLmNvbnNlcXVlbnQ9W10KdGhpcyQxLm5leHQoKQppZihpc0Nhc2UpY3VyLnRlc3Q9dGhpcyQxLnBhcnNlRXhwcmVzc2lvbigpCmVsc2UgY3VyLnRlc3Q9bnVsbAp0aGlzJDEuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMuY29sb24pfWVsc2V7aWYoIWN1cil7bm9kZS5jYXNlcy5wdXNoKGN1cj10aGlzJDEuc3RhcnROb2RlKCkpCmN1ci5jb25zZXF1ZW50PVtdCmN1ci50ZXN0PW51bGx9CmN1ci5jb25zZXF1ZW50LnB1c2godGhpcyQxLnBhcnNlU3RhdGVtZW50KCkpfX0KaWYoY3VyKXRoaXMuZmluaXNoTm9kZShjdXIsIlN3aXRjaENhc2UiKQp0aGlzLnBvcEN4KCkKdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFjZVIpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiU3dpdGNoU3RhdGVtZW50IikKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl90aHJvdzp0aGlzLm5leHQoKQpub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VFeHByZXNzaW9uKCkKdGhpcy5zZW1pY29sb24oKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIlRocm93U3RhdGVtZW50IikKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl90cnk6dGhpcy5uZXh0KCkKbm9kZS5ibG9jaz10aGlzLnBhcnNlQmxvY2soKQpub2RlLmhhbmRsZXI9bnVsbAppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5fY2F0Y2gpe3ZhciBjbGF1c2U9dGhpcy5zdGFydE5vZGUoKQp0aGlzLm5leHQoKQp0aGlzLmV4cGVjdChfX2Fjb3JuLnRva1R5cGVzLnBhcmVuTCkKY2xhdXNlLnBhcmFtPXRoaXMudG9Bc3NpZ25hYmxlKHRoaXMucGFyc2VFeHByQXRvbSgpLHRydWUpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMucGFyZW5SKQpjbGF1c2UuYm9keT10aGlzLnBhcnNlQmxvY2soKQpub2RlLmhhbmRsZXI9dGhpcy5maW5pc2hOb2RlKGNsYXVzZSwiQ2F0Y2hDbGF1c2UiKX0Kbm9kZS5maW5hbGl6ZXI9dGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5fZmluYWxseSk/dGhpcy5wYXJzZUJsb2NrKCk6bnVsbAppZighbm9kZS5oYW5kbGVyJiYhbm9kZS5maW5hbGl6ZXIpcmV0dXJuIG5vZGUuYmxvY2sKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJUcnlTdGF0ZW1lbnQiKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX3ZhcjpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX2NvbnN0OnJldHVybiB0aGlzLnBhcnNlVmFyKGZhbHNlLGtpbmR8fHRoaXMudG9rLnZhbHVlKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX3doaWxlOnRoaXMubmV4dCgpCm5vZGUudGVzdD10aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCkKbm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIldoaWxlU3RhdGVtZW50IikKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl93aXRoOnRoaXMubmV4dCgpCm5vZGUub2JqZWN0PXRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKQpub2RlLmJvZHk9dGhpcy5wYXJzZVN0YXRlbWVudCgpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiV2l0aFN0YXRlbWVudCIpCmNhc2UgX19hY29ybi50b2tUeXBlcy5icmFjZUw6cmV0dXJuIHRoaXMucGFyc2VCbG9jaygpCmNhc2UgX19hY29ybi50b2tUeXBlcy5zZW1pOnRoaXMubmV4dCgpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiRW1wdHlTdGF0ZW1lbnQiKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX2NsYXNzOnJldHVybiB0aGlzLnBhcnNlQ2xhc3ModHJ1ZSkKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9pbXBvcnQ6cmV0dXJuIHRoaXMucGFyc2VJbXBvcnQoKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX2V4cG9ydDpyZXR1cm4gdGhpcy5wYXJzZUV4cG9ydCgpCmRlZmF1bHQ6aWYodGhpcy50b2tzLmlzQXN5bmNGdW5jdGlvbigpKXt0aGlzLm5leHQoKQp0aGlzLm5leHQoKQpyZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKG5vZGUsdHJ1ZSx0cnVlKX0KdmFyIGV4cHI9dGhpcy5wYXJzZUV4cHJlc3Npb24oKQppZihpc0R1bW15KGV4cHIpKXt0aGlzLm5leHQoKQppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5lb2YpcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJFbXB0eVN0YXRlbWVudCIpCnJldHVybiB0aGlzLnBhcnNlU3RhdGVtZW50KCl9ZWxzZSBpZihzdGFydHR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLm5hbWUmJmV4cHIudHlwZT09PSJJZGVudGlmaWVyIiYmdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5jb2xvbikpe25vZGUuYm9keT10aGlzLnBhcnNlU3RhdGVtZW50KCkKbm9kZS5sYWJlbD1leHByCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiTGFiZWxlZFN0YXRlbWVudCIpfWVsc2V7bm9kZS5leHByZXNzaW9uPWV4cHIKdGhpcy5zZW1pY29sb24oKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cHJlc3Npb25TdGF0ZW1lbnQiKX19fQpscCQxLnBhcnNlQmxvY2s9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQp0aGlzLnB1c2hDeCgpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMuYnJhY2VMKQp2YXIgYmxvY2tJbmRlbnQ9dGhpcy5jdXJJbmRlbnQsbGluZT10aGlzLmN1ckxpbmVTdGFydApub2RlLmJvZHk9W10Kd2hpbGUoIXRoaXMuY2xvc2VzKF9fYWNvcm4udG9rVHlwZXMuYnJhY2VSLGJsb2NrSW5kZW50LGxpbmUsdHJ1ZSkpCm5vZGUuYm9keS5wdXNoKHRoaXMkMS5wYXJzZVN0YXRlbWVudCgpKQp0aGlzLnBvcEN4KCkKdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFjZVIpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiQmxvY2tTdGF0ZW1lbnQiKX0KbHAkMS5wYXJzZUZvcj1mdW5jdGlvbihub2RlLGluaXQpe25vZGUuaW5pdD1pbml0Cm5vZGUudGVzdD1ub2RlLnVwZGF0ZT1udWxsCmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuc2VtaSkmJnRoaXMudG9rLnR5cGUhPT1fX2Fjb3JuLnRva1R5cGVzLnNlbWkpbm9kZS50ZXN0PXRoaXMucGFyc2VFeHByZXNzaW9uKCkKaWYodGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5zZW1pKSYmdGhpcy50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMucGFyZW5SKW5vZGUudXBkYXRlPXRoaXMucGFyc2VFeHByZXNzaW9uKCkKdGhpcy5wb3BDeCgpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMucGFyZW5SKQpub2RlLmJvZHk9dGhpcy5wYXJzZVN0YXRlbWVudCgpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiRm9yU3RhdGVtZW50Iil9CmxwJDEucGFyc2VGb3JJbj1mdW5jdGlvbihub2RlLGluaXQpe3ZhciB0eXBlPXRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl9pbj8iRm9ySW5TdGF0ZW1lbnQiOiJGb3JPZlN0YXRlbWVudCIKdGhpcy5uZXh0KCkKbm9kZS5sZWZ0PWluaXQKbm9kZS5yaWdodD10aGlzLnBhcnNlRXhwcmVzc2lvbigpCnRoaXMucG9wQ3goKQp0aGlzLmV4cGVjdChfX2Fjb3JuLnRva1R5cGVzLnBhcmVuUikKbm9kZS5ib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsdHlwZSl9CmxwJDEucGFyc2VWYXI9ZnVuY3Rpb24obm9JbixraW5kKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQpub2RlLmtpbmQ9a2luZAp0aGlzLm5leHQoKQpub2RlLmRlY2xhcmF0aW9ucz1bXQpkb3t2YXIgZGVjbD10aGlzJDEuc3RhcnROb2RlKCkKZGVjbC5pZD10aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49Nj90aGlzJDEudG9Bc3NpZ25hYmxlKHRoaXMkMS5wYXJzZUV4cHJBdG9tKCksdHJ1ZSk6dGhpcyQxLnBhcnNlSWRlbnQoKQpkZWNsLmluaXQ9dGhpcyQxLmVhdChfX2Fjb3JuLnRva1R5cGVzLmVxKT90aGlzJDEucGFyc2VNYXliZUFzc2lnbihub0luKTpudWxsCm5vZGUuZGVjbGFyYXRpb25zLnB1c2godGhpcyQxLmZpbmlzaE5vZGUoZGVjbCwiVmFyaWFibGVEZWNsYXJhdG9yIikpfXdoaWxlKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuY29tbWEpKQppZighbm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoKXt2YXIgZGVjbCQxPXRoaXMuc3RhcnROb2RlKCkKZGVjbCQxLmlkPXRoaXMuZHVtbXlJZGVudCgpCm5vZGUuZGVjbGFyYXRpb25zLnB1c2godGhpcy5maW5pc2hOb2RlKGRlY2wkMSwiVmFyaWFibGVEZWNsYXJhdG9yIikpfQppZighbm9Jbil0aGlzLnNlbWljb2xvbigpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiVmFyaWFibGVEZWNsYXJhdGlvbiIpfQpscCQxLnBhcnNlQ2xhc3M9ZnVuY3Rpb24oaXNTdGF0ZW1lbnQpe3ZhciB0aGlzJDE9dGhpczt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpCnRoaXMubmV4dCgpCmlmKHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLm5hbWUpbm9kZS5pZD10aGlzLnBhcnNlSWRlbnQoKQplbHNlIGlmKGlzU3RhdGVtZW50PT09dHJ1ZSlub2RlLmlkPXRoaXMuZHVtbXlJZGVudCgpCmVsc2Ugbm9kZS5pZD1udWxsCm5vZGUuc3VwZXJDbGFzcz10aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLl9leHRlbmRzKT90aGlzLnBhcnNlRXhwcmVzc2lvbigpOm51bGwKbm9kZS5ib2R5PXRoaXMuc3RhcnROb2RlKCkKbm9kZS5ib2R5LmJvZHk9W10KdGhpcy5wdXNoQ3goKQp2YXIgaW5kZW50PXRoaXMuY3VySW5kZW50KzEsbGluZT10aGlzLmN1ckxpbmVTdGFydAp0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlTCkKaWYodGhpcy5jdXJJbmRlbnQrMTxpbmRlbnQpe2luZGVudD10aGlzLmN1ckluZGVudDtsaW5lPXRoaXMuY3VyTGluZVN0YXJ0fQp3aGlsZSghdGhpcy5jbG9zZXMoX19hY29ybi50b2tUeXBlcy5icmFjZVIsaW5kZW50LGxpbmUpKXtpZih0aGlzJDEuc2VtaWNvbG9uKCkpY29udGludWUKdmFyIG1ldGhvZD10aGlzJDEuc3RhcnROb2RlKCksaXNHZW5lcmF0b3IsaXNBc3luYwppZih0aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7bWV0aG9kLnN0YXRpYz1mYWxzZQppc0dlbmVyYXRvcj10aGlzJDEuZWF0KF9fYWNvcm4udG9rVHlwZXMuc3Rhcil9CnRoaXMkMS5wYXJzZVByb3BlcnR5TmFtZShtZXRob2QpCmlmKGlzRHVtbXkobWV0aG9kLmtleSkpe2lmKGlzRHVtbXkodGhpcyQxLnBhcnNlTWF5YmVBc3NpZ24oKSkpdGhpcyQxLm5leHQoKTt0aGlzJDEuZWF0KF9fYWNvcm4udG9rVHlwZXMuY29tbWEpO2NvbnRpbnVlfQppZihtZXRob2Qua2V5LnR5cGU9PT0iSWRlbnRpZmllciImJiFtZXRob2QuY29tcHV0ZWQmJm1ldGhvZC5rZXkubmFtZT09PSJzdGF0aWMiJiYodGhpcyQxLnRvay50eXBlIT1fX2Fjb3JuLnRva1R5cGVzLnBhcmVuTCYmdGhpcyQxLnRvay50eXBlIT1fX2Fjb3JuLnRva1R5cGVzLmJyYWNlTCkpe21ldGhvZC5zdGF0aWM9dHJ1ZQppc0dlbmVyYXRvcj10aGlzJDEuZWF0KF9fYWNvcm4udG9rVHlwZXMuc3RhcikKdGhpcyQxLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCl9ZWxzZXttZXRob2Quc3RhdGljPWZhbHNlfQppZighbWV0aG9kLmNvbXB1dGVkJiZtZXRob2Qua2V5LnR5cGU9PT0iSWRlbnRpZmllciImJm1ldGhvZC5rZXkubmFtZT09PSJhc3luYyImJnRoaXMkMS50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMucGFyZW5MJiYhdGhpcyQxLmNhbkluc2VydFNlbWljb2xvbigpKXt0aGlzJDEucGFyc2VQcm9wZXJ0eU5hbWUobWV0aG9kKQppc0FzeW5jPXRydWV9ZWxzZXtpc0FzeW5jPWZhbHNlfQppZih0aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49NSYmbWV0aG9kLmtleS50eXBlPT09IklkZW50aWZpZXIiJiYhbWV0aG9kLmNvbXB1dGVkJiYobWV0aG9kLmtleS5uYW1lPT09ImdldCJ8fG1ldGhvZC5rZXkubmFtZT09PSJzZXQiKSYmdGhpcyQxLnRvay50eXBlIT09X19hY29ybi50b2tUeXBlcy5wYXJlbkwmJnRoaXMkMS50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMuYnJhY2VMKXttZXRob2Qua2luZD1tZXRob2Qua2V5Lm5hbWUKdGhpcyQxLnBhcnNlUHJvcGVydHlOYW1lKG1ldGhvZCkKbWV0aG9kLnZhbHVlPXRoaXMkMS5wYXJzZU1ldGhvZChmYWxzZSl9ZWxzZXtpZighbWV0aG9kLmNvbXB1dGVkJiYhbWV0aG9kLnN0YXRpYyYmIWlzR2VuZXJhdG9yJiYhaXNBc3luYyYmKG1ldGhvZC5rZXkudHlwZT09PSJJZGVudGlmaWVyIiYmbWV0aG9kLmtleS5uYW1lPT09ImNvbnN0cnVjdG9yInx8bWV0aG9kLmtleS50eXBlPT09IkxpdGVyYWwiJiZtZXRob2Qua2V5LnZhbHVlPT09ImNvbnN0cnVjdG9yIikpe21ldGhvZC5raW5kPSJjb25zdHJ1Y3RvciJ9ZWxzZXttZXRob2Qua2luZD0ibWV0aG9kIn0KbWV0aG9kLnZhbHVlPXRoaXMkMS5wYXJzZU1ldGhvZChpc0dlbmVyYXRvcixpc0FzeW5jKX0Kbm9kZS5ib2R5LmJvZHkucHVzaCh0aGlzJDEuZmluaXNoTm9kZShtZXRob2QsIk1ldGhvZERlZmluaXRpb24iKSl9CnRoaXMucG9wQ3goKQppZighdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFjZVIpKXt0aGlzLmxhc3QuZW5kPXRoaXMudG9rLnN0YXJ0CmlmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpdGhpcy5sYXN0LmxvYy5lbmQ9dGhpcy50b2subG9jLnN0YXJ0fQp0aGlzLnNlbWljb2xvbigpCnRoaXMuZmluaXNoTm9kZShub2RlLmJvZHksIkNsYXNzQm9keSIpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSxpc1N0YXRlbWVudD8iQ2xhc3NEZWNsYXJhdGlvbiI6IkNsYXNzRXhwcmVzc2lvbiIpfQpscCQxLnBhcnNlRnVuY3Rpb249ZnVuY3Rpb24obm9kZSxpc1N0YXRlbWVudCxpc0FzeW5jKXt2YXIgb2xkSW5Bc3luYz10aGlzLmluQXN5bmMKdGhpcy5pbml0RnVuY3Rpb24obm9kZSkKaWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02KXtub2RlLmdlbmVyYXRvcj10aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLnN0YXIpfQppZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgpe25vZGUuYXN5bmM9ISFpc0FzeW5jfQppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5uYW1lKW5vZGUuaWQ9dGhpcy5wYXJzZUlkZW50KCkKZWxzZSBpZihpc1N0YXRlbWVudD09PXRydWUpbm9kZS5pZD10aGlzLmR1bW15SWRlbnQoKQp0aGlzLmluQXN5bmM9bm9kZS5hc3luYwpub2RlLnBhcmFtcz10aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMoKQpub2RlLmJvZHk9dGhpcy5wYXJzZUJsb2NrKCkKdGhpcy5pbkFzeW5jPW9sZEluQXN5bmMKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLGlzU3RhdGVtZW50PyJGdW5jdGlvbkRlY2xhcmF0aW9uIjoiRnVuY3Rpb25FeHByZXNzaW9uIil9CmxwJDEucGFyc2VFeHBvcnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpCnRoaXMubmV4dCgpCmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuc3Rhcikpe25vZGUuc291cmNlPXRoaXMuZWF0Q29udGV4dHVhbCgiZnJvbSIpP3RoaXMucGFyc2VFeHByQXRvbSgpOnRoaXMuZHVtbXlTdHJpbmcoKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cG9ydEFsbERlY2xhcmF0aW9uIil9CmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuX2RlZmF1bHQpKXt2YXIgaXNBc3luYwppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5fZnVuY3Rpb258fChpc0FzeW5jPXRoaXMudG9rcy5pc0FzeW5jRnVuY3Rpb24oKSkpe3ZhciBmTm9kZT10aGlzLnN0YXJ0Tm9kZSgpCnRoaXMubmV4dCgpCmlmKGlzQXN5bmMpdGhpcy5uZXh0KCkKbm9kZS5kZWNsYXJhdGlvbj10aGlzLnBhcnNlRnVuY3Rpb24oZk5vZGUsIm51bGxhYmxlSUQiLGlzQXN5bmMpfWVsc2UgaWYodGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuX2NsYXNzKXtub2RlLmRlY2xhcmF0aW9uPXRoaXMucGFyc2VDbGFzcygibnVsbGFibGVJRCIpfWVsc2V7bm9kZS5kZWNsYXJhdGlvbj10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKQp0aGlzLnNlbWljb2xvbigpfQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIpfQppZih0aGlzLnRvay50eXBlLmtleXdvcmR8fHRoaXMudG9rcy5pc0xldCgpfHx0aGlzLnRva3MuaXNBc3luY0Z1bmN0aW9uKCkpe25vZGUuZGVjbGFyYXRpb249dGhpcy5wYXJzZVN0YXRlbWVudCgpCm5vZGUuc3BlY2lmaWVycz1bXQpub2RlLnNvdXJjZT1udWxsfWVsc2V7bm9kZS5kZWNsYXJhdGlvbj1udWxsCm5vZGUuc3BlY2lmaWVycz10aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVyTGlzdCgpCm5vZGUuc291cmNlPXRoaXMuZWF0Q29udGV4dHVhbCgiZnJvbSIpP3RoaXMucGFyc2VFeHByQXRvbSgpOm51bGwKdGhpcy5zZW1pY29sb24oKX0KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIil9CmxwJDEucGFyc2VJbXBvcnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpCnRoaXMubmV4dCgpCmlmKHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLnN0cmluZyl7bm9kZS5zcGVjaWZpZXJzPVtdCm5vZGUuc291cmNlPXRoaXMucGFyc2VFeHByQXRvbSgpCm5vZGUua2luZD0iIn1lbHNle3ZhciBlbHQKaWYodGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMubmFtZSYmdGhpcy50b2sudmFsdWUhPT0iZnJvbSIpe2VsdD10aGlzLnN0YXJ0Tm9kZSgpCmVsdC5sb2NhbD10aGlzLnBhcnNlSWRlbnQoKQp0aGlzLmZpbmlzaE5vZGUoZWx0LCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyIikKdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5jb21tYSl9Cm5vZGUuc3BlY2lmaWVycz10aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyTGlzdCgpCm5vZGUuc291cmNlPXRoaXMuZWF0Q29udGV4dHVhbCgiZnJvbSIpJiZ0aGlzLnRvay50eXBlPT1fX2Fjb3JuLnRva1R5cGVzLnN0cmluZz90aGlzLnBhcnNlRXhwckF0b20oKTp0aGlzLmR1bW15U3RyaW5nKCkKaWYoZWx0KW5vZGUuc3BlY2lmaWVycy51bnNoaWZ0KGVsdCl9CnRoaXMuc2VtaWNvbG9uKCkKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJJbXBvcnREZWNsYXJhdGlvbiIpfQpscCQxLnBhcnNlSW1wb3J0U3BlY2lmaWVyTGlzdD1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpczt2YXIgZWx0cz1bXQppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5zdGFyKXt2YXIgZWx0PXRoaXMuc3RhcnROb2RlKCkKdGhpcy5uZXh0KCkKZWx0LmxvY2FsPXRoaXMuZWF0Q29udGV4dHVhbCgiYXMiKT90aGlzLnBhcnNlSWRlbnQoKTp0aGlzLmR1bW15SWRlbnQoKQplbHRzLnB1c2godGhpcy5maW5pc2hOb2RlKGVsdCwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIikpfWVsc2V7dmFyIGluZGVudD10aGlzLmN1ckluZGVudCxsaW5lPXRoaXMuY3VyTGluZVN0YXJ0LGNvbnRpbnVlZExpbmU9dGhpcy5uZXh0TGluZVN0YXJ0CnRoaXMucHVzaEN4KCkKdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFjZUwpCmlmKHRoaXMuY3VyTGluZVN0YXJ0PmNvbnRpbnVlZExpbmUpY29udGludWVkTGluZT10aGlzLmN1ckxpbmVTdGFydAp3aGlsZSghdGhpcy5jbG9zZXMoX19hY29ybi50b2tUeXBlcy5icmFjZVIsaW5kZW50Kyh0aGlzLmN1ckxpbmVTdGFydDw9Y29udGludWVkTGluZT8xOjApLGxpbmUpKXt2YXIgZWx0JDE9dGhpcyQxLnN0YXJ0Tm9kZSgpCmlmKHRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5zdGFyKSl7ZWx0JDEubG9jYWw9dGhpcyQxLmVhdENvbnRleHR1YWwoImFzIik/dGhpcyQxLnBhcnNlSWRlbnQoKTp0aGlzJDEuZHVtbXlJZGVudCgpCnRoaXMkMS5maW5pc2hOb2RlKGVsdCQxLCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIiKX1lbHNle2lmKHRoaXMkMS5pc0NvbnRleHR1YWwoImZyb20iKSlicmVhawplbHQkMS5pbXBvcnRlZD10aGlzJDEucGFyc2VJZGVudCgpCmlmKGlzRHVtbXkoZWx0JDEuaW1wb3J0ZWQpKWJyZWFrCmVsdCQxLmxvY2FsPXRoaXMkMS5lYXRDb250ZXh0dWFsKCJhcyIpP3RoaXMkMS5wYXJzZUlkZW50KCk6ZWx0JDEuaW1wb3J0ZWQKdGhpcyQxLmZpbmlzaE5vZGUoZWx0JDEsIkltcG9ydFNwZWNpZmllciIpfQplbHRzLnB1c2goZWx0JDEpCnRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5jb21tYSl9CnRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuYnJhY2VSKQp0aGlzLnBvcEN4KCl9CnJldHVybiBlbHRzfQpscCQxLnBhcnNlRXhwb3J0U3BlY2lmaWVyTGlzdD1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpczt2YXIgZWx0cz1bXQp2YXIgaW5kZW50PXRoaXMuY3VySW5kZW50LGxpbmU9dGhpcy5jdXJMaW5lU3RhcnQsY29udGludWVkTGluZT10aGlzLm5leHRMaW5lU3RhcnQKdGhpcy5wdXNoQ3goKQp0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlTCkKaWYodGhpcy5jdXJMaW5lU3RhcnQ+Y29udGludWVkTGluZSljb250aW51ZWRMaW5lPXRoaXMuY3VyTGluZVN0YXJ0CndoaWxlKCF0aGlzLmNsb3NlcyhfX2Fjb3JuLnRva1R5cGVzLmJyYWNlUixpbmRlbnQrKHRoaXMuY3VyTGluZVN0YXJ0PD1jb250aW51ZWRMaW5lPzE6MCksbGluZSkpe2lmKHRoaXMkMS5pc0NvbnRleHR1YWwoImZyb20iKSlicmVhawp2YXIgZWx0PXRoaXMkMS5zdGFydE5vZGUoKQplbHQubG9jYWw9dGhpcyQxLnBhcnNlSWRlbnQoKQppZihpc0R1bW15KGVsdC5sb2NhbCkpYnJlYWsKZWx0LmV4cG9ydGVkPXRoaXMkMS5lYXRDb250ZXh0dWFsKCJhcyIpP3RoaXMkMS5wYXJzZUlkZW50KCk6ZWx0LmxvY2FsCnRoaXMkMS5maW5pc2hOb2RlKGVsdCwiRXhwb3J0U3BlY2lmaWVyIikKZWx0cy5wdXNoKGVsdCkKdGhpcyQxLmVhdChfX2Fjb3JuLnRva1R5cGVzLmNvbW1hKX0KdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFjZVIpCnRoaXMucG9wQ3goKQpyZXR1cm4gZWx0c30KdmFyIGxwJDI9TG9vc2VQYXJzZXIucHJvdG90eXBlCmxwJDIuY2hlY2tMVmFsPWZ1bmN0aW9uKGV4cHIpe2lmKCFleHByKXJldHVybiBleHByCnN3aXRjaChleHByLnR5cGUpe2Nhc2UiSWRlbnRpZmllciI6Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpyZXR1cm4gZXhwcgpjYXNlIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIjpleHByLmV4cHJlc3Npb249dGhpcy5jaGVja0xWYWwoZXhwci5leHByZXNzaW9uKQpyZXR1cm4gZXhwcgpkZWZhdWx0OnJldHVybiB0aGlzLmR1bW15SWRlbnQoKX19CmxwJDIucGFyc2VFeHByZXNzaW9uPWZ1bmN0aW9uKG5vSW4pe3ZhciB0aGlzJDE9dGhpczt2YXIgc3RhcnQ9dGhpcy5zdG9yZUN1cnJlbnRQb3MoKQp2YXIgZXhwcj10aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9JbikKaWYodGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuY29tbWEpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlQXQoc3RhcnQpCm5vZGUuZXhwcmVzc2lvbnM9W2V4cHJdCndoaWxlKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuY29tbWEpKW5vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzJDEucGFyc2VNYXliZUFzc2lnbihub0luKSkKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJTZXF1ZW5jZUV4cHJlc3Npb24iKX0KcmV0dXJuIGV4cHJ9CmxwJDIucGFyc2VQYXJlbkV4cHJlc3Npb249ZnVuY3Rpb24oKXt0aGlzLnB1c2hDeCgpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMucGFyZW5MKQp2YXIgdmFsPXRoaXMucGFyc2VFeHByZXNzaW9uKCkKdGhpcy5wb3BDeCgpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMucGFyZW5SKQpyZXR1cm4gdmFsfQpscCQyLnBhcnNlTWF5YmVBc3NpZ249ZnVuY3Rpb24obm9Jbil7aWYodGhpcy50b2tzLmlzQ29udGV4dHVhbCgieWllbGQiKSl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQp0aGlzLm5leHQoKQppZih0aGlzLnNlbWljb2xvbigpfHx0aGlzLmNhbkluc2VydFNlbWljb2xvbigpfHwodGhpcy50b2sudHlwZSE9X19hY29ybi50b2tUeXBlcy5zdGFyJiYhdGhpcy50b2sudHlwZS5zdGFydHNFeHByKSl7bm9kZS5kZWxlZ2F0ZT1mYWxzZQpub2RlLmFyZ3VtZW50PW51bGx9ZWxzZXtub2RlLmRlbGVnYXRlPXRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuc3RhcikKbm9kZS5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVBc3NpZ24oKX0KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJZaWVsZEV4cHJlc3Npb24iKX0KdmFyIHN0YXJ0PXRoaXMuc3RvcmVDdXJyZW50UG9zKCkKdmFyIGxlZnQ9dGhpcy5wYXJzZU1heWJlQ29uZGl0aW9uYWwobm9JbikKaWYodGhpcy50b2sudHlwZS5pc0Fzc2lnbil7dmFyIG5vZGUkMT10aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0KQpub2RlJDEub3BlcmF0b3I9dGhpcy50b2sudmFsdWUKbm9kZSQxLmxlZnQ9dGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuZXE/dGhpcy50b0Fzc2lnbmFibGUobGVmdCk6dGhpcy5jaGVja0xWYWwobGVmdCkKdGhpcy5uZXh0KCkKbm9kZSQxLnJpZ2h0PXRoaXMucGFyc2VNYXliZUFzc2lnbihub0luKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUkMSwiQXNzaWdubWVudEV4cHJlc3Npb24iKX0KcmV0dXJuIGxlZnR9CmxwJDIucGFyc2VNYXliZUNvbmRpdGlvbmFsPWZ1bmN0aW9uKG5vSW4pe3ZhciBzdGFydD10aGlzLnN0b3JlQ3VycmVudFBvcygpCnZhciBleHByPXRoaXMucGFyc2VFeHByT3BzKG5vSW4pCmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMucXVlc3Rpb24pKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0KQpub2RlLnRlc3Q9ZXhwcgpub2RlLmNvbnNlcXVlbnQ9dGhpcy5wYXJzZU1heWJlQXNzaWduKCkKbm9kZS5hbHRlcm5hdGU9dGhpcy5leHBlY3QoX19hY29ybi50b2tUeXBlcy5jb2xvbik/dGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pOnRoaXMuZHVtbXlJZGVudCgpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIil9CnJldHVybiBleHByfQpscCQyLnBhcnNlRXhwck9wcz1mdW5jdGlvbihub0luKXt2YXIgc3RhcnQ9dGhpcy5zdG9yZUN1cnJlbnRQb3MoKQp2YXIgaW5kZW50PXRoaXMuY3VySW5kZW50LGxpbmU9dGhpcy5jdXJMaW5lU3RhcnQKcmV0dXJuIHRoaXMucGFyc2VFeHByT3AodGhpcy5wYXJzZU1heWJlVW5hcnkoZmFsc2UpLHN0YXJ0LC0xLG5vSW4saW5kZW50LGxpbmUpfQpscCQyLnBhcnNlRXhwck9wPWZ1bmN0aW9uKGxlZnQsc3RhcnQsbWluUHJlYyxub0luLGluZGVudCxsaW5lKXtpZih0aGlzLmN1ckxpbmVTdGFydCE9bGluZSYmdGhpcy5jdXJJbmRlbnQ8aW5kZW50JiZ0aGlzLnRva2VuU3RhcnRzTGluZSgpKXJldHVybiBsZWZ0CnZhciBwcmVjPXRoaXMudG9rLnR5cGUuYmlub3AKaWYocHJlYyE9bnVsbCYmKCFub0lufHx0aGlzLnRvay50eXBlIT09X19hY29ybi50b2tUeXBlcy5faW4pKXtpZihwcmVjPm1pblByZWMpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlQXQoc3RhcnQpCm5vZGUubGVmdD1sZWZ0Cm5vZGUub3BlcmF0b3I9dGhpcy50b2sudmFsdWUKdGhpcy5uZXh0KCkKaWYodGhpcy5jdXJMaW5lU3RhcnQhPWxpbmUmJnRoaXMuY3VySW5kZW50PGluZGVudCYmdGhpcy50b2tlblN0YXJ0c0xpbmUoKSl7bm9kZS5yaWdodD10aGlzLmR1bW15SWRlbnQoKX1lbHNle3ZhciByaWdodFN0YXJ0PXRoaXMuc3RvcmVDdXJyZW50UG9zKCkKbm9kZS5yaWdodD10aGlzLnBhcnNlRXhwck9wKHRoaXMucGFyc2VNYXliZVVuYXJ5KGZhbHNlKSxyaWdodFN0YXJ0LHByZWMsbm9JbixpbmRlbnQsbGluZSl9CnRoaXMuZmluaXNoTm9kZShub2RlLC8mJnxcfFx8Ly50ZXN0KG5vZGUub3BlcmF0b3IpPyJMb2dpY2FsRXhwcmVzc2lvbiI6IkJpbmFyeUV4cHJlc3Npb24iKQpyZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChub2RlLHN0YXJ0LG1pblByZWMsbm9JbixpbmRlbnQsbGluZSl9fQpyZXR1cm4gbGVmdH0KbHAkMi5wYXJzZU1heWJlVW5hcnk9ZnVuY3Rpb24oc2F3VW5hcnkpe3ZhciB0aGlzJDE9dGhpczt2YXIgc3RhcnQ9dGhpcy5zdG9yZUN1cnJlbnRQb3MoKSxleHByCmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCYmdGhpcy5pbkFzeW5jJiZ0aGlzLnRva3MuaXNDb250ZXh0dWFsKCJhd2FpdCIpKXtleHByPXRoaXMucGFyc2VBd2FpdCgpCnNhd1VuYXJ5PXRydWV9ZWxzZSBpZih0aGlzLnRvay50eXBlLnByZWZpeCl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKSx1cGRhdGU9dGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuaW5jRGVjCmlmKCF1cGRhdGUpc2F3VW5hcnk9dHJ1ZQpub2RlLm9wZXJhdG9yPXRoaXMudG9rLnZhbHVlCm5vZGUucHJlZml4PXRydWUKdGhpcy5uZXh0KCkKbm9kZS5hcmd1bWVudD10aGlzLnBhcnNlTWF5YmVVbmFyeSh0cnVlKQppZih1cGRhdGUpbm9kZS5hcmd1bWVudD10aGlzLmNoZWNrTFZhbChub2RlLmFyZ3VtZW50KQpleHByPXRoaXMuZmluaXNoTm9kZShub2RlLHVwZGF0ZT8iVXBkYXRlRXhwcmVzc2lvbiI6IlVuYXJ5RXhwcmVzc2lvbiIpfWVsc2UgaWYodGhpcy50b2sudHlwZT09PV9fYWNvcm4udG9rVHlwZXMuZWxsaXBzaXMpe3ZhciBub2RlJDE9dGhpcy5zdGFydE5vZGUoKQp0aGlzLm5leHQoKQpub2RlJDEuYXJndW1lbnQ9dGhpcy5wYXJzZU1heWJlVW5hcnkoc2F3VW5hcnkpCmV4cHI9dGhpcy5maW5pc2hOb2RlKG5vZGUkMSwiU3ByZWFkRWxlbWVudCIpfWVsc2V7ZXhwcj10aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKQp3aGlsZSh0aGlzLnRvay50eXBlLnBvc3RmaXgmJiF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKXt2YXIgbm9kZSQyPXRoaXMkMS5zdGFydE5vZGVBdChzdGFydCkKbm9kZSQyLm9wZXJhdG9yPXRoaXMkMS50b2sudmFsdWUKbm9kZSQyLnByZWZpeD1mYWxzZQpub2RlJDIuYXJndW1lbnQ9dGhpcyQxLmNoZWNrTFZhbChleHByKQp0aGlzJDEubmV4dCgpCmV4cHI9dGhpcyQxLmZpbmlzaE5vZGUobm9kZSQyLCJVcGRhdGVFeHByZXNzaW9uIil9fQppZighc2F3VW5hcnkmJnRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuc3RhcnN0YXIpKXt2YXIgbm9kZSQzPXRoaXMuc3RhcnROb2RlQXQoc3RhcnQpCm5vZGUkMy5vcGVyYXRvcj0iKioiCm5vZGUkMy5sZWZ0PWV4cHIKbm9kZSQzLnJpZ2h0PXRoaXMucGFyc2VNYXliZVVuYXJ5KGZhbHNlKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUkMywiQmluYXJ5RXhwcmVzc2lvbiIpfQpyZXR1cm4gZXhwcn0KbHAkMi5wYXJzZUV4cHJTdWJzY3JpcHRzPWZ1bmN0aW9uKCl7dmFyIHN0YXJ0PXRoaXMuc3RvcmVDdXJyZW50UG9zKCkKcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMucGFyc2VFeHByQXRvbSgpLHN0YXJ0LGZhbHNlLHRoaXMuY3VySW5kZW50LHRoaXMuY3VyTGluZVN0YXJ0KX0KbHAkMi5wYXJzZVN1YnNjcmlwdHM9ZnVuY3Rpb24oYmFzZSxzdGFydCxub0NhbGxzLHN0YXJ0SW5kZW50LGxpbmUpe3ZhciB0aGlzJDE9dGhpcztmb3IoOzspe2lmKHRoaXMkMS5jdXJMaW5lU3RhcnQhPWxpbmUmJnRoaXMkMS5jdXJJbmRlbnQ8PXN0YXJ0SW5kZW50JiZ0aGlzJDEudG9rZW5TdGFydHNMaW5lKCkpe2lmKHRoaXMkMS50b2sudHlwZT09X19hY29ybi50b2tUeXBlcy5kb3QmJnRoaXMkMS5jdXJJbmRlbnQ9PXN0YXJ0SW5kZW50KQotLXN0YXJ0SW5kZW50CmVsc2UKcmV0dXJuIGJhc2V9CnZhciBtYXliZUFzeW5jQXJyb3c9YmFzZS50eXBlPT09IklkZW50aWZpZXIiJiZiYXNlLm5hbWU9PT0iYXN5bmMiJiYhdGhpcyQxLmNhbkluc2VydFNlbWljb2xvbigpCmlmKHRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5kb3QpKXt2YXIgbm9kZT10aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQpCm5vZGUub2JqZWN0PWJhc2UKaWYodGhpcyQxLmN1ckxpbmVTdGFydCE9bGluZSYmdGhpcyQxLmN1ckluZGVudDw9c3RhcnRJbmRlbnQmJnRoaXMkMS50b2tlblN0YXJ0c0xpbmUoKSkKbm9kZS5wcm9wZXJ0eT10aGlzJDEuZHVtbXlJZGVudCgpCmVsc2UKbm9kZS5wcm9wZXJ0eT10aGlzJDEucGFyc2VQcm9wZXJ0eUFjY2Vzc29yKCl8fHRoaXMkMS5kdW1teUlkZW50KCkKbm9kZS5jb21wdXRlZD1mYWxzZQpiYXNlPXRoaXMkMS5maW5pc2hOb2RlKG5vZGUsIk1lbWJlckV4cHJlc3Npb24iKX1lbHNlIGlmKHRoaXMkMS50b2sudHlwZT09X19hY29ybi50b2tUeXBlcy5icmFja2V0TCl7dGhpcyQxLnB1c2hDeCgpCnRoaXMkMS5uZXh0KCkKdmFyIG5vZGUkMT10aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQpCm5vZGUkMS5vYmplY3Q9YmFzZQpub2RlJDEucHJvcGVydHk9dGhpcyQxLnBhcnNlRXhwcmVzc2lvbigpCm5vZGUkMS5jb21wdXRlZD10cnVlCnRoaXMkMS5wb3BDeCgpCnRoaXMkMS5leHBlY3QoX19hY29ybi50b2tUeXBlcy5icmFja2V0UikKYmFzZT10aGlzJDEuZmluaXNoTm9kZShub2RlJDEsIk1lbWJlckV4cHJlc3Npb24iKX1lbHNlIGlmKCFub0NhbGxzJiZ0aGlzJDEudG9rLnR5cGU9PV9fYWNvcm4udG9rVHlwZXMucGFyZW5MKXt2YXIgZXhwckxpc3Q9dGhpcyQxLnBhcnNlRXhwckxpc3QoX19hY29ybi50b2tUeXBlcy5wYXJlblIpCmlmKG1heWJlQXN5bmNBcnJvdyYmdGhpcyQxLmVhdChfX2Fjb3JuLnRva1R5cGVzLmFycm93KSkKcmV0dXJuIHRoaXMkMS5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQpLGV4cHJMaXN0LHRydWUpCnZhciBub2RlJDI9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0KQpub2RlJDIuY2FsbGVlPWJhc2UKbm9kZSQyLmFyZ3VtZW50cz1leHByTGlzdApiYXNlPXRoaXMkMS5maW5pc2hOb2RlKG5vZGUkMiwiQ2FsbEV4cHJlc3Npb24iKX1lbHNlIGlmKHRoaXMkMS50b2sudHlwZT09X19hY29ybi50b2tUeXBlcy5iYWNrUXVvdGUpe3ZhciBub2RlJDM9dGhpcyQxLnN0YXJ0Tm9kZUF0KHN0YXJ0KQpub2RlJDMudGFnPWJhc2UKbm9kZSQzLnF1YXNpPXRoaXMkMS5wYXJzZVRlbXBsYXRlKCkKYmFzZT10aGlzJDEuZmluaXNoTm9kZShub2RlJDMsIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiIpfWVsc2V7cmV0dXJuIGJhc2V9fX0KbHAkMi5wYXJzZUV4cHJBdG9tPWZ1bmN0aW9uKCl7dmFyIG5vZGUKc3dpdGNoKHRoaXMudG9rLnR5cGUpe2Nhc2UgX19hY29ybi50b2tUeXBlcy5fdGhpczpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX3N1cGVyOnZhciB0eXBlPXRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl90aGlzPyJUaGlzRXhwcmVzc2lvbiI6IlN1cGVyIgpub2RlPXRoaXMuc3RhcnROb2RlKCkKdGhpcy5uZXh0KCkKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLHR5cGUpCmNhc2UgX19hY29ybi50b2tUeXBlcy5uYW1lOnZhciBzdGFydD10aGlzLnN0b3JlQ3VycmVudFBvcygpCnZhciBpZD10aGlzLnBhcnNlSWRlbnQoKQp2YXIgaXNBc3luYz1mYWxzZQppZihpZC5uYW1lPT09ImFzeW5jIiYmIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpe2lmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuX2Z1bmN0aW9uKSkKcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0KSxmYWxzZSx0cnVlKQppZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5uYW1lKXtpZD10aGlzLnBhcnNlSWRlbnQoKQppc0FzeW5jPXRydWV9fQpyZXR1cm4gdGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5hcnJvdyk/dGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0KSxbaWRdLGlzQXN5bmMpOmlkCmNhc2UgX19hY29ybi50b2tUeXBlcy5yZWdleHA6bm9kZT10aGlzLnN0YXJ0Tm9kZSgpCnZhciB2YWw9dGhpcy50b2sudmFsdWUKbm9kZS5yZWdleD17cGF0dGVybjp2YWwucGF0dGVybixmbGFnczp2YWwuZmxhZ3N9Cm5vZGUudmFsdWU9dmFsLnZhbHVlCm5vZGUucmF3PXRoaXMuaW5wdXQuc2xpY2UodGhpcy50b2suc3RhcnQsdGhpcy50b2suZW5kKQp0aGlzLm5leHQoKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkxpdGVyYWwiKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMubnVtOmNhc2UgX19hY29ybi50b2tUeXBlcy5zdHJpbmc6bm9kZT10aGlzLnN0YXJ0Tm9kZSgpCm5vZGUudmFsdWU9dGhpcy50b2sudmFsdWUKbm9kZS5yYXc9dGhpcy5pbnB1dC5zbGljZSh0aGlzLnRvay5zdGFydCx0aGlzLnRvay5lbmQpCnRoaXMubmV4dCgpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiTGl0ZXJhbCIpCmNhc2UgX19hY29ybi50b2tUeXBlcy5fbnVsbDpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX3RydWU6Y2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9mYWxzZTpub2RlPXRoaXMuc3RhcnROb2RlKCkKbm9kZS52YWx1ZT10aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5fbnVsbD9udWxsOnRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLl90cnVlCm5vZGUucmF3PXRoaXMudG9rLnR5cGUua2V5d29yZAp0aGlzLm5leHQoKQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIkxpdGVyYWwiKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMucGFyZW5MOnZhciBwYXJlblN0YXJ0PXRoaXMuc3RvcmVDdXJyZW50UG9zKCkKdGhpcy5uZXh0KCkKdmFyIGlubmVyPXRoaXMucGFyc2VFeHByZXNzaW9uKCkKdGhpcy5leHBlY3QoX19hY29ybi50b2tUeXBlcy5wYXJlblIpCmlmKHRoaXMuZWF0KF9fYWNvcm4udG9rVHlwZXMuYXJyb3cpKXt2YXIgcGFyYW1zPWlubmVyLmV4cHJlc3Npb25zfHxbaW5uZXJdCmlmKHBhcmFtcy5sZW5ndGgmJmlzRHVtbXkocGFyYW1zW3BhcmFtcy5sZW5ndGgtMV0pKQpwYXJhbXMucG9wKCkKcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChwYXJlblN0YXJ0KSxwYXJhbXMpfQppZih0aGlzLm9wdGlvbnMucHJlc2VydmVQYXJlbnMpe3ZhciBwYXI9dGhpcy5zdGFydE5vZGVBdChwYXJlblN0YXJ0KQpwYXIuZXhwcmVzc2lvbj1pbm5lcgppbm5lcj10aGlzLmZpbmlzaE5vZGUocGFyLCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpfQpyZXR1cm4gaW5uZXIKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLmJyYWNrZXRMOm5vZGU9dGhpcy5zdGFydE5vZGUoKQpub2RlLmVsZW1lbnRzPXRoaXMucGFyc2VFeHByTGlzdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNrZXRSLHRydWUpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiQXJyYXlFeHByZXNzaW9uIikKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLmJyYWNlTDpyZXR1cm4gdGhpcy5wYXJzZU9iaigpCmNhc2UgX19hY29ybi50b2tUeXBlcy5fY2xhc3M6cmV0dXJuIHRoaXMucGFyc2VDbGFzcyhmYWxzZSkKY2FzZSBfX2Fjb3JuLnRva1R5cGVzLl9mdW5jdGlvbjpub2RlPXRoaXMuc3RhcnROb2RlKCkKdGhpcy5uZXh0KCkKcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLGZhbHNlKQpjYXNlIF9fYWNvcm4udG9rVHlwZXMuX25ldzpyZXR1cm4gdGhpcy5wYXJzZU5ldygpCmNhc2UgX19hY29ybi50b2tUeXBlcy5iYWNrUXVvdGU6cmV0dXJuIHRoaXMucGFyc2VUZW1wbGF0ZSgpCmRlZmF1bHQ6cmV0dXJuIHRoaXMuZHVtbXlJZGVudCgpfX0KbHAkMi5wYXJzZU5ldz1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCksc3RhcnRJbmRlbnQ9dGhpcy5jdXJJbmRlbnQsbGluZT10aGlzLmN1ckxpbmVTdGFydAp2YXIgbWV0YT10aGlzLnBhcnNlSWRlbnQodHJ1ZSkKaWYodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uPj02JiZ0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLmRvdCkpe25vZGUubWV0YT1tZXRhCm5vZGUucHJvcGVydHk9dGhpcy5wYXJzZUlkZW50KHRydWUpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiTWV0YVByb3BlcnR5Iil9CnZhciBzdGFydD10aGlzLnN0b3JlQ3VycmVudFBvcygpCm5vZGUuY2FsbGVlPXRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMucGFyc2VFeHByQXRvbSgpLHN0YXJ0LHRydWUsc3RhcnRJbmRlbnQsbGluZSkKaWYodGhpcy50b2sudHlwZT09X19hY29ybi50b2tUeXBlcy5wYXJlbkwpe25vZGUuYXJndW1lbnRzPXRoaXMucGFyc2VFeHByTGlzdChfX2Fjb3JuLnRva1R5cGVzLnBhcmVuUil9ZWxzZXtub2RlLmFyZ3VtZW50cz1bXX0KcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJOZXdFeHByZXNzaW9uIil9CmxwJDIucGFyc2VUZW1wbGF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZWxlbT10aGlzLnN0YXJ0Tm9kZSgpCmVsZW0udmFsdWU9e3Jhdzp0aGlzLmlucHV0LnNsaWNlKHRoaXMudG9rLnN0YXJ0LHRoaXMudG9rLmVuZCkucmVwbGFjZSgvXHJcbj8vZywiXG4iKSxjb29rZWQ6dGhpcy50b2sudmFsdWV9CnRoaXMubmV4dCgpCmVsZW0udGFpbD10aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5iYWNrUXVvdGUKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShlbGVtLCJUZW1wbGF0ZUVsZW1lbnQiKX0KbHAkMi5wYXJzZVRlbXBsYXRlPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBub2RlPXRoaXMuc3RhcnROb2RlKCkKdGhpcy5uZXh0KCkKbm9kZS5leHByZXNzaW9ucz1bXQp2YXIgY3VyRWx0PXRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoKQpub2RlLnF1YXNpcz1bY3VyRWx0XQp3aGlsZSghY3VyRWx0LnRhaWwpe3RoaXMkMS5uZXh0KCkKbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMkMS5wYXJzZUV4cHJlc3Npb24oKSkKaWYodGhpcyQxLmV4cGVjdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlUikpe2N1ckVsdD10aGlzJDEucGFyc2VUZW1wbGF0ZUVsZW1lbnQoKX1lbHNle2N1ckVsdD10aGlzJDEuc3RhcnROb2RlKCkKY3VyRWx0LnZhbHVlPXtjb29rZWQ6IiIscmF3OiIifQpjdXJFbHQudGFpbD10cnVlCnRoaXMkMS5maW5pc2hOb2RlKGN1ckVsdCwiVGVtcGxhdGVFbGVtZW50Iil9Cm5vZGUucXVhc2lzLnB1c2goY3VyRWx0KX0KdGhpcy5leHBlY3QoX19hY29ybi50b2tUeXBlcy5iYWNrUXVvdGUpCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiVGVtcGxhdGVMaXRlcmFsIil9CmxwJDIucGFyc2VPYmo9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQpub2RlLnByb3BlcnRpZXM9W10KdGhpcy5wdXNoQ3goKQp2YXIgaW5kZW50PXRoaXMuY3VySW5kZW50KzEsbGluZT10aGlzLmN1ckxpbmVTdGFydAp0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlTCkKaWYodGhpcy5jdXJJbmRlbnQrMTxpbmRlbnQpe2luZGVudD10aGlzLmN1ckluZGVudDtsaW5lPXRoaXMuY3VyTGluZVN0YXJ0fQp3aGlsZSghdGhpcy5jbG9zZXMoX19hY29ybi50b2tUeXBlcy5icmFjZVIsaW5kZW50LGxpbmUpKXt2YXIgcHJvcD10aGlzJDEuc3RhcnROb2RlKCksaXNHZW5lcmF0b3IsaXNBc3luYyxzdGFydAppZih0aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7c3RhcnQ9dGhpcyQxLnN0b3JlQ3VycmVudFBvcygpCnByb3AubWV0aG9kPWZhbHNlCnByb3Auc2hvcnRoYW5kPWZhbHNlCmlzR2VuZXJhdG9yPXRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5zdGFyKX0KdGhpcyQxLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApCmlmKCFwcm9wLmNvbXB1dGVkJiZwcm9wLmtleS50eXBlPT09IklkZW50aWZpZXIiJiZwcm9wLmtleS5uYW1lPT09ImFzeW5jIiYmdGhpcyQxLnRvay50eXBlIT09X19hY29ybi50b2tUeXBlcy5wYXJlbkwmJnRoaXMkMS50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMuY29sb24mJiF0aGlzJDEuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpe3RoaXMkMS5wYXJzZVByb3BlcnR5TmFtZShwcm9wKQppc0FzeW5jPXRydWV9ZWxzZXtpc0FzeW5jPWZhbHNlfQppZihpc0R1bW15KHByb3Aua2V5KSl7aWYoaXNEdW1teSh0aGlzJDEucGFyc2VNYXliZUFzc2lnbigpKSl0aGlzJDEubmV4dCgpO3RoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5jb21tYSk7Y29udGludWV9CmlmKHRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5jb2xvbikpe3Byb3Aua2luZD0iaW5pdCIKcHJvcC52YWx1ZT10aGlzJDEucGFyc2VNYXliZUFzc2lnbigpfWVsc2UgaWYodGhpcyQxLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJih0aGlzJDEudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLnBhcmVuTHx8dGhpcyQxLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5icmFjZUwpKXtwcm9wLmtpbmQ9ImluaXQiCnByb3AubWV0aG9kPXRydWUKcHJvcC52YWx1ZT10aGlzJDEucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsaXNBc3luYyl9ZWxzZSBpZih0aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49NSYmcHJvcC5rZXkudHlwZT09PSJJZGVudGlmaWVyIiYmIXByb3AuY29tcHV0ZWQmJihwcm9wLmtleS5uYW1lPT09ImdldCJ8fHByb3Aua2V5Lm5hbWU9PT0ic2V0IikmJih0aGlzJDEudG9rLnR5cGUhPV9fYWNvcm4udG9rVHlwZXMuY29tbWEmJnRoaXMkMS50b2sudHlwZSE9X19hY29ybi50b2tUeXBlcy5icmFjZVIpKXtwcm9wLmtpbmQ9cHJvcC5rZXkubmFtZQp0aGlzJDEucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCkKcHJvcC52YWx1ZT10aGlzJDEucGFyc2VNZXRob2QoZmFsc2UpfWVsc2V7cHJvcC5raW5kPSJpbml0IgppZih0aGlzJDEub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7aWYodGhpcyQxLmVhdChfX2Fjb3JuLnRva1R5cGVzLmVxKSl7dmFyIGFzc2lnbj10aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQpCmFzc2lnbi5vcGVyYXRvcj0iPSIKYXNzaWduLmxlZnQ9cHJvcC5rZXkKYXNzaWduLnJpZ2h0PXRoaXMkMS5wYXJzZU1heWJlQXNzaWduKCkKcHJvcC52YWx1ZT10aGlzJDEuZmluaXNoTm9kZShhc3NpZ24sIkFzc2lnbm1lbnRFeHByZXNzaW9uIil9ZWxzZXtwcm9wLnZhbHVlPXByb3Aua2V5fX1lbHNle3Byb3AudmFsdWU9dGhpcyQxLmR1bW15SWRlbnQoKX0KcHJvcC5zaG9ydGhhbmQ9dHJ1ZX0Kbm9kZS5wcm9wZXJ0aWVzLnB1c2godGhpcyQxLmZpbmlzaE5vZGUocHJvcCwiUHJvcGVydHkiKSkKdGhpcyQxLmVhdChfX2Fjb3JuLnRva1R5cGVzLmNvbW1hKX0KdGhpcy5wb3BDeCgpCmlmKCF0aGlzLmVhdChfX2Fjb3JuLnRva1R5cGVzLmJyYWNlUikpe3RoaXMubGFzdC5lbmQ9dGhpcy50b2suc3RhcnQKaWYodGhpcy5vcHRpb25zLmxvY2F0aW9ucyl0aGlzLmxhc3QubG9jLmVuZD10aGlzLnRvay5sb2Muc3RhcnR9CnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiT2JqZWN0RXhwcmVzc2lvbiIpfQpscCQyLnBhcnNlUHJvcGVydHlOYW1lPWZ1bmN0aW9uKHByb3Ape2lmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7aWYodGhpcy5lYXQoX19hY29ybi50b2tUeXBlcy5icmFja2V0TCkpe3Byb3AuY29tcHV0ZWQ9dHJ1ZQpwcm9wLmtleT10aGlzLnBhcnNlRXhwcmVzc2lvbigpCnRoaXMuZXhwZWN0KF9fYWNvcm4udG9rVHlwZXMuYnJhY2tldFIpCnJldHVybn1lbHNle3Byb3AuY29tcHV0ZWQ9ZmFsc2V9fQp2YXIga2V5PSh0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5udW18fHRoaXMudG9rLnR5cGU9PT1fX2Fjb3JuLnRva1R5cGVzLnN0cmluZyk/dGhpcy5wYXJzZUV4cHJBdG9tKCk6dGhpcy5wYXJzZUlkZW50KCkKcHJvcC5rZXk9a2V5fHx0aGlzLmR1bW15SWRlbnQoKX0KbHAkMi5wYXJzZVByb3BlcnR5QWNjZXNzb3I9ZnVuY3Rpb24oKXtpZih0aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5uYW1lfHx0aGlzLnRvay50eXBlLmtleXdvcmQpcmV0dXJuIHRoaXMucGFyc2VJZGVudCgpfQpscCQyLnBhcnNlSWRlbnQ9ZnVuY3Rpb24oKXt2YXIgbmFtZT10aGlzLnRvay50eXBlPT09X19hY29ybi50b2tUeXBlcy5uYW1lP3RoaXMudG9rLnZhbHVlOnRoaXMudG9rLnR5cGUua2V5d29yZAppZighbmFtZSlyZXR1cm4gdGhpcy5kdW1teUlkZW50KCkKdmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQp0aGlzLm5leHQoKQpub2RlLm5hbWU9bmFtZQpyZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIklkZW50aWZpZXIiKX0KbHAkMi5pbml0RnVuY3Rpb249ZnVuY3Rpb24obm9kZSl7bm9kZS5pZD1udWxsCm5vZGUucGFyYW1zPVtdCmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49Nil7bm9kZS5nZW5lcmF0b3I9ZmFsc2UKbm9kZS5leHByZXNzaW9uPWZhbHNlfQppZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgpCm5vZGUuYXN5bmM9ZmFsc2V9CmxwJDIudG9Bc3NpZ25hYmxlPWZ1bmN0aW9uKG5vZGUsYmluZGluZyl7dmFyIHRoaXMkMT10aGlzO2lmKCFub2RlfHxub2RlLnR5cGU9PSJJZGVudGlmaWVyInx8KG5vZGUudHlwZT09Ik1lbWJlckV4cHJlc3Npb24iJiYhYmluZGluZykpe31lbHNlIGlmKG5vZGUudHlwZT09IlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIil7bm9kZS5leHByZXNzaW9uPXRoaXMudG9Bc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbixiaW5kaW5nKX1lbHNlIGlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjw2KXtyZXR1cm4gdGhpcy5kdW1teUlkZW50KCl9ZWxzZSBpZihub2RlLnR5cGU9PSJPYmplY3RFeHByZXNzaW9uIil7bm9kZS50eXBlPSJPYmplY3RQYXR0ZXJuIgp2YXIgcHJvcHM9bm9kZS5wcm9wZXJ0aWVzCmZvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKykKcHJvcHNbaV0udmFsdWU9dGhpcyQxLnRvQXNzaWduYWJsZShwcm9wc1tpXS52YWx1ZSxiaW5kaW5nKX1lbHNlIGlmKG5vZGUudHlwZT09IkFycmF5RXhwcmVzc2lvbiIpe25vZGUudHlwZT0iQXJyYXlQYXR0ZXJuIgp0aGlzLnRvQXNzaWduYWJsZUxpc3Qobm9kZS5lbGVtZW50cyxiaW5kaW5nKX1lbHNlIGlmKG5vZGUudHlwZT09IlNwcmVhZEVsZW1lbnQiKXtub2RlLnR5cGU9IlJlc3RFbGVtZW50Igpub2RlLmFyZ3VtZW50PXRoaXMudG9Bc3NpZ25hYmxlKG5vZGUuYXJndW1lbnQsYmluZGluZyl9ZWxzZSBpZihub2RlLnR5cGU9PSJBc3NpZ25tZW50RXhwcmVzc2lvbiIpe25vZGUudHlwZT0iQXNzaWdubWVudFBhdHRlcm4iCmRlbGV0ZSBub2RlLm9wZXJhdG9yfWVsc2V7cmV0dXJuIHRoaXMuZHVtbXlJZGVudCgpfQpyZXR1cm4gbm9kZX0KbHAkMi50b0Fzc2lnbmFibGVMaXN0PWZ1bmN0aW9uKGV4cHJMaXN0LGJpbmRpbmcpe3ZhciB0aGlzJDE9dGhpcztmb3IodmFyIGk9MDtpPGV4cHJMaXN0Lmxlbmd0aDtpKyspCmV4cHJMaXN0W2ldPXRoaXMkMS50b0Fzc2lnbmFibGUoZXhwckxpc3RbaV0sYmluZGluZykKcmV0dXJuIGV4cHJMaXN0fQpscCQyLnBhcnNlRnVuY3Rpb25QYXJhbXM9ZnVuY3Rpb24ocGFyYW1zKXtwYXJhbXM9dGhpcy5wYXJzZUV4cHJMaXN0KF9fYWNvcm4udG9rVHlwZXMucGFyZW5SKQpyZXR1cm4gdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcyx0cnVlKX0KbHAkMi5wYXJzZU1ldGhvZD1mdW5jdGlvbihpc0dlbmVyYXRvcixpc0FzeW5jKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSgpLG9sZEluQXN5bmM9dGhpcy5pbkFzeW5jCnRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpCmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49NikKbm9kZS5nZW5lcmF0b3I9ISFpc0dlbmVyYXRvcgppZih0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTgpCm5vZGUuYXN5bmM9ISFpc0FzeW5jCnRoaXMuaW5Bc3luYz1ub2RlLmFzeW5jCm5vZGUucGFyYW1zPXRoaXMucGFyc2VGdW5jdGlvblBhcmFtcygpCm5vZGUuZXhwcmVzc2lvbj10aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24+PTYmJnRoaXMudG9rLnR5cGUhPT1fX2Fjb3JuLnRva1R5cGVzLmJyYWNlTApub2RlLmJvZHk9bm9kZS5leHByZXNzaW9uP3RoaXMucGFyc2VNYXliZUFzc2lnbigpOnRoaXMucGFyc2VCbG9jaygpCnRoaXMuaW5Bc3luYz1vbGRJbkFzeW5jCnJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwiRnVuY3Rpb25FeHByZXNzaW9uIil9CmxwJDIucGFyc2VBcnJvd0V4cHJlc3Npb249ZnVuY3Rpb24obm9kZSxwYXJhbXMsaXNBc3luYyl7dmFyIG9sZEluQXN5bmM9dGhpcy5pbkFzeW5jCnRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpCmlmKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbj49OCkKbm9kZS5hc3luYz0hIWlzQXN5bmMKdGhpcy5pbkFzeW5jPW5vZGUuYXN5bmMKbm9kZS5wYXJhbXM9dGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcyx0cnVlKQpub2RlLmV4cHJlc3Npb249dGhpcy50b2sudHlwZSE9PV9fYWNvcm4udG9rVHlwZXMuYnJhY2VMCm5vZGUuYm9keT1ub2RlLmV4cHJlc3Npb24/dGhpcy5wYXJzZU1heWJlQXNzaWduKCk6dGhpcy5wYXJzZUJsb2NrKCkKdGhpcy5pbkFzeW5jPW9sZEluQXN5bmMKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIpfQpscCQyLnBhcnNlRXhwckxpc3Q9ZnVuY3Rpb24oY2xvc2UsYWxsb3dFbXB0eSl7dmFyIHRoaXMkMT10aGlzO3RoaXMucHVzaEN4KCkKdmFyIGluZGVudD10aGlzLmN1ckluZGVudCxsaW5lPXRoaXMuY3VyTGluZVN0YXJ0LGVsdHM9W10KdGhpcy5uZXh0KCkKd2hpbGUoIXRoaXMuY2xvc2VzKGNsb3NlLGluZGVudCsxLGxpbmUpKXtpZih0aGlzJDEuZWF0KF9fYWNvcm4udG9rVHlwZXMuY29tbWEpKXtlbHRzLnB1c2goYWxsb3dFbXB0eT9udWxsOnRoaXMkMS5kdW1teUlkZW50KCkpCmNvbnRpbnVlfQp2YXIgZWx0PXRoaXMkMS5wYXJzZU1heWJlQXNzaWduKCkKaWYoaXNEdW1teShlbHQpKXtpZih0aGlzJDEuY2xvc2VzKGNsb3NlLGluZGVudCxsaW5lKSlicmVhawp0aGlzJDEubmV4dCgpfWVsc2V7ZWx0cy5wdXNoKGVsdCl9CnRoaXMkMS5lYXQoX19hY29ybi50b2tUeXBlcy5jb21tYSl9CnRoaXMucG9wQ3goKQppZighdGhpcy5lYXQoY2xvc2UpKXt0aGlzLmxhc3QuZW5kPXRoaXMudG9rLnN0YXJ0CmlmKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpdGhpcy5sYXN0LmxvYy5lbmQ9dGhpcy50b2subG9jLnN0YXJ0fQpyZXR1cm4gZWx0c30KbHAkMi5wYXJzZUF3YWl0PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoKQp0aGlzLm5leHQoKQpub2RlLmFyZ3VtZW50PXRoaXMucGFyc2VNYXliZVVuYXJ5KCkKcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCJBd2FpdEV4cHJlc3Npb24iKX0KX19hY29ybi5kZWZhdWx0T3B0aW9ucy50YWJTaXplPTQKZnVuY3Rpb24gcGFyc2VfZGFtbWl0KGlucHV0LG9wdGlvbnMpe3ZhciBwPW5ldyBMb29zZVBhcnNlcihpbnB1dCxvcHRpb25zKQpwLm5leHQoKQpyZXR1cm4gcC5wYXJzZVRvcExldmVsKCl9Cl9fYWNvcm4uYWRkTG9vc2VFeHBvcnRzKHBhcnNlX2RhbW1pdCxMb29zZVBhcnNlcixwbHVnaW5zTG9vc2UpCmV4cG9ydHMucGFyc2VfZGFtbWl0PXBhcnNlX2RhbW1pdDtleHBvcnRzLkxvb3NlUGFyc2VyPUxvb3NlUGFyc2VyO2V4cG9ydHMucGx1Z2luc0xvb3NlPXBsdWdpbnNMb29zZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywnX19lc01vZHVsZScse3ZhbHVlOnRydWV9KTt9KSkpOztGb3JtYXR0ZXJXb3JrZXIuQ1NTRm9ybWF0dGVyPWNsYXNze2NvbnN0cnVjdG9yKGJ1aWxkZXIpe3RoaXMuX2J1aWxkZXI9YnVpbGRlcjt9CmZvcm1hdCh0ZXh0LGxpbmVFbmRpbmdzLGZyb21PZmZzZXQsdG9PZmZzZXQpe3RoaXMuX2xpbmVFbmRpbmdzPWxpbmVFbmRpbmdzO3RoaXMuX2Zyb21PZmZzZXQ9ZnJvbU9mZnNldDt0aGlzLl90b09mZnNldD10b09mZnNldDt0aGlzLl9sYXN0TGluZT0tMTt0aGlzLl9zdGF0ZT17fTtjb25zdCB0b2tlbml6ZT1Gb3JtYXR0ZXJXb3JrZXIuY3JlYXRlVG9rZW5pemVyKCd0ZXh0L2NzcycpO2NvbnN0IG9sZEVuZm9yY2U9dGhpcy5fYnVpbGRlci5zZXRFbmZvcmNlU3BhY2VCZXR3ZWVuV29yZHMoZmFsc2UpO3Rva2VuaXplKHRleHQuc3Vic3RyaW5nKHRoaXMuX2Zyb21PZmZzZXQsdGhpcy5fdG9PZmZzZXQpLHRoaXMuX3Rva2VuQ2FsbGJhY2suYmluZCh0aGlzKSk7dGhpcy5fYnVpbGRlci5zZXRFbmZvcmNlU3BhY2VCZXR3ZWVuV29yZHMob2xkRW5mb3JjZSk7fQpfdG9rZW5DYWxsYmFjayh0b2tlbix0eXBlLHN0YXJ0UG9zaXRpb24pe3N0YXJ0UG9zaXRpb24rPXRoaXMuX2Zyb21PZmZzZXQ7Y29uc3Qgc3RhcnRMaW5lPXRoaXMuX2xpbmVFbmRpbmdzLmxvd2VyQm91bmQoc3RhcnRQb3NpdGlvbik7aWYoc3RhcnRMaW5lIT09dGhpcy5fbGFzdExpbmUpCnRoaXMuX3N0YXRlLmVhdFdoaXRlc3BhY2U9dHJ1ZTtpZigvXnByb3BlcnR5Ly50ZXN0KHR5cGUpJiYhdGhpcy5fc3RhdGUuaW5Qcm9wZXJ0eVZhbHVlKQp0aGlzLl9zdGF0ZS5zZWVuUHJvcGVydHk9dHJ1ZTt0aGlzLl9sYXN0TGluZT1zdGFydExpbmU7Y29uc3QgaXNXaGl0ZXNwYWNlPS9eXHMrJC8udGVzdCh0b2tlbik7aWYoaXNXaGl0ZXNwYWNlKXtpZighdGhpcy5fc3RhdGUuZWF0V2hpdGVzcGFjZSkKdGhpcy5fYnVpbGRlci5hZGRTb2Z0U3BhY2UoKTtyZXR1cm47fQp0aGlzLl9zdGF0ZS5lYXRXaGl0ZXNwYWNlPWZhbHNlO2lmKHRva2VuPT09J1xuJykKcmV0dXJuO2lmKHRva2VuIT09J30nKXtpZih0aGlzLl9zdGF0ZS5hZnRlckNsb3NpbmdCcmFjZSkKdGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKHRydWUpO3RoaXMuX3N0YXRlLmFmdGVyQ2xvc2luZ0JyYWNlPWZhbHNlO30KaWYodG9rZW49PT0nfScpe2lmKHRoaXMuX3N0YXRlLmluUHJvcGVydHlWYWx1ZSkKdGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7dGhpcy5fYnVpbGRlci5kZWNyZWFzZU5lc3RpbmdMZXZlbCgpO3RoaXMuX3N0YXRlLmFmdGVyQ2xvc2luZ0JyYWNlPXRydWU7dGhpcy5fc3RhdGUuaW5Qcm9wZXJ0eVZhbHVlPWZhbHNlO31lbHNlIGlmKHRva2VuPT09JzonJiYhdGhpcy5fc3RhdGUuaW5Qcm9wZXJ0eVZhbHVlJiZ0aGlzLl9zdGF0ZS5zZWVuUHJvcGVydHkpe3RoaXMuX2J1aWxkZXIuYWRkVG9rZW4odG9rZW4sc3RhcnRQb3NpdGlvbik7dGhpcy5fYnVpbGRlci5hZGRTb2Z0U3BhY2UoKTt0aGlzLl9zdGF0ZS5lYXRXaGl0ZXNwYWNlPXRydWU7dGhpcy5fc3RhdGUuaW5Qcm9wZXJ0eVZhbHVlPXRydWU7dGhpcy5fc3RhdGUuc2VlblByb3BlcnR5PWZhbHNlO3JldHVybjt9ZWxzZSBpZih0b2tlbj09PSd7Jyl7dGhpcy5fYnVpbGRlci5hZGRTb2Z0U3BhY2UoKTt0aGlzLl9idWlsZGVyLmFkZFRva2VuKHRva2VuLHN0YXJ0UG9zaXRpb24pO3RoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO3RoaXMuX2J1aWxkZXIuaW5jcmVhc2VOZXN0aW5nTGV2ZWwoKTtyZXR1cm47fQp0aGlzLl9idWlsZGVyLmFkZFRva2VuKHRva2VuLHN0YXJ0UG9zaXRpb24pO2lmKHR5cGU9PT0nY29tbWVudCcmJiF0aGlzLl9zdGF0ZS5pblByb3BlcnR5VmFsdWUmJiF0aGlzLl9zdGF0ZS5zZWVuUHJvcGVydHkpCnRoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO2lmKHRva2VuPT09JzsnJiZ0aGlzLl9zdGF0ZS5pblByb3BlcnR5VmFsdWUpe3RoaXMuX3N0YXRlLmluUHJvcGVydHlWYWx1ZT1mYWxzZTt0aGlzLl9idWlsZGVyLmFkZE5ld0xpbmUoKTt9ZWxzZSBpZih0b2tlbj09PSd9Jyl7dGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7fX19OztGb3JtYXR0ZXJXb3JrZXIuQWNvcm5Ub2tlbml6ZXI9Y2xhc3N7Y29uc3RydWN0b3IoY29udGVudCl7dGhpcy5fY29udGVudD1jb250ZW50O3RoaXMuX2NvbW1lbnRzPVtdO3RoaXMuX3Rva2VuaXplcj1hY29ybi50b2tlbml6ZXIodGhpcy5fY29udGVudCx7ZWNtYVZlcnNpb246OCxvbkNvbW1lbnQ6dGhpcy5fY29tbWVudHN9KTt0aGlzLl90ZXh0Q3Vyc29yPW5ldyBUZXh0VXRpbHMuVGV4dEN1cnNvcih0aGlzLl9jb250ZW50LmNvbXB1dGVMaW5lRW5kaW5ncygpKTt0aGlzLl90b2tlbkxpbmVTdGFydD0wO3RoaXMuX3Rva2VuTGluZUVuZD0wO3RoaXMuX25leHRUb2tlbkludGVybmFsKCk7fQpzdGF0aWMgcHVuY3R1YXRvcih0b2tlbix2YWx1ZXMpe3JldHVybiB0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXMubnVtJiZ0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXMucmVnZXhwJiZ0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXMuc3RyaW5nJiZ0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXMubmFtZSYmIXRva2VuLnR5cGUua2V5d29yZCYmKCF2YWx1ZXN8fCh0b2tlbi50eXBlLmxhYmVsLmxlbmd0aD09PTEmJnZhbHVlcy5pbmRleE9mKHRva2VuLnR5cGUubGFiZWwpIT09LTEpKTt9CnN0YXRpYyBrZXl3b3JkKHRva2VuLGtleXdvcmQpe3JldHVybiEhdG9rZW4udHlwZS5rZXl3b3JkJiZ0b2tlbi50eXBlIT09YWNvcm4udG9rVHlwZXNbJ190cnVlJ10mJnRva2VuLnR5cGUhPT1hY29ybi50b2tUeXBlc1snX2ZhbHNlJ10mJnRva2VuLnR5cGUhPT1hY29ybi50b2tUeXBlc1snX251bGwnXSYmKCFrZXl3b3JkfHx0b2tlbi50eXBlLmtleXdvcmQ9PT1rZXl3b3JkKTt9CnN0YXRpYyBpZGVudGlmaWVyKHRva2VuLGlkZW50aWZpZXIpe3JldHVybiB0b2tlbi50eXBlPT09YWNvcm4udG9rVHlwZXMubmFtZSYmKCFpZGVudGlmaWVyfHx0b2tlbi52YWx1ZT09PWlkZW50aWZpZXIpO30Kc3RhdGljIGxpbmVDb21tZW50KHRva2VuKXtyZXR1cm4gdG9rZW4udHlwZT09PSdMaW5lJzt9CnN0YXRpYyBibG9ja0NvbW1lbnQodG9rZW4pe3JldHVybiB0b2tlbi50eXBlPT09J0Jsb2NrJzt9Cl9uZXh0VG9rZW5JbnRlcm5hbCgpe2lmKHRoaXMuX2NvbW1lbnRzLmxlbmd0aCkKcmV0dXJuIHRoaXMuX2NvbW1lbnRzLnNoaWZ0KCk7Y29uc3QgdG9rZW49dGhpcy5fYnVmZmVyZWRUb2tlbjt0aGlzLl9idWZmZXJlZFRva2VuPXRoaXMuX3Rva2VuaXplci5nZXRUb2tlbigpO3JldHVybiB0b2tlbjt9Cm5leHRUb2tlbigpe2NvbnN0IHRva2VuPXRoaXMuX25leHRUb2tlbkludGVybmFsKCk7aWYodG9rZW4udHlwZT09PWFjb3JuLnRva1R5cGVzLmVvZikKcmV0dXJuIG51bGw7dGhpcy5fdGV4dEN1cnNvci5hZHZhbmNlKHRva2VuLnN0YXJ0KTt0aGlzLl90b2tlbkxpbmVTdGFydD10aGlzLl90ZXh0Q3Vyc29yLmxpbmVOdW1iZXIoKTt0aGlzLl90b2tlbkNvbHVtblN0YXJ0PXRoaXMuX3RleHRDdXJzb3IuY29sdW1uTnVtYmVyKCk7dGhpcy5fdGV4dEN1cnNvci5hZHZhbmNlKHRva2VuLmVuZCk7dGhpcy5fdG9rZW5MaW5lRW5kPXRoaXMuX3RleHRDdXJzb3IubGluZU51bWJlcigpO3JldHVybiB0b2tlbjt9CnBlZWtUb2tlbigpe2lmKHRoaXMuX2NvbW1lbnRzLmxlbmd0aCkKcmV0dXJuIHRoaXMuX2NvbW1lbnRzWzBdO3JldHVybiB0aGlzLl9idWZmZXJlZFRva2VuLnR5cGUhPT1hY29ybi50b2tUeXBlcy5lb2Y/dGhpcy5fYnVmZmVyZWRUb2tlbjpudWxsO30KdG9rZW5MaW5lU3RhcnQoKXtyZXR1cm4gdGhpcy5fdG9rZW5MaW5lU3RhcnQ7fQp0b2tlbkxpbmVFbmQoKXtyZXR1cm4gdGhpcy5fdG9rZW5MaW5lRW5kO30KdG9rZW5Db2x1bW5TdGFydCgpe3JldHVybiB0aGlzLl90b2tlbkNvbHVtblN0YXJ0O319OztGb3JtYXR0ZXJXb3JrZXIuSmF2YVNjcmlwdEZvcm1hdHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihidWlsZGVyKXt0aGlzLl9idWlsZGVyPWJ1aWxkZXI7fQpmb3JtYXQodGV4dCxsaW5lRW5kaW5ncyxmcm9tT2Zmc2V0LHRvT2Zmc2V0KXt0aGlzLl9mcm9tT2Zmc2V0PWZyb21PZmZzZXQ7dGhpcy5fdG9PZmZzZXQ9dG9PZmZzZXQ7dGhpcy5fY29udGVudD10ZXh0LnN1YnN0cmluZyh0aGlzLl9mcm9tT2Zmc2V0LHRoaXMuX3RvT2Zmc2V0KTt0aGlzLl9sYXN0TGluZU51bWJlcj0wO3RoaXMuX3Rva2VuaXplcj1uZXcgRm9ybWF0dGVyV29ya2VyLkFjb3JuVG9rZW5pemVyKHRoaXMuX2NvbnRlbnQpO2NvbnN0IGFzdD1hY29ybi5wYXJzZSh0aGlzLl9jb250ZW50LHtyYW5nZXM6ZmFsc2UsZWNtYVZlcnNpb246OCxwcmVzZXJ2ZVBhcmVuczp0cnVlfSk7Y29uc3Qgd2Fsa2VyPW5ldyBGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyKHRoaXMuX2JlZm9yZVZpc2l0LmJpbmQodGhpcyksdGhpcy5fYWZ0ZXJWaXNpdC5iaW5kKHRoaXMpKTt3YWxrZXIud2Fsayhhc3QpO30KX3B1c2godG9rZW4sZm9ybWF0KXtmb3IobGV0IGk9MDtpPGZvcm1hdC5sZW5ndGg7KytpKXtpZihmb3JtYXRbaV09PT0ncycpe3RoaXMuX2J1aWxkZXIuYWRkU29mdFNwYWNlKCk7fWVsc2UgaWYoZm9ybWF0W2ldPT09J1MnKXt0aGlzLl9idWlsZGVyLmFkZEhhcmRTcGFjZSgpO31lbHNlIGlmKGZvcm1hdFtpXT09PSduJyl7dGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7fWVsc2UgaWYoZm9ybWF0W2ldPT09Jz4nKXt0aGlzLl9idWlsZGVyLmluY3JlYXNlTmVzdGluZ0xldmVsKCk7fWVsc2UgaWYoZm9ybWF0W2ldPT09JzwnKXt0aGlzLl9idWlsZGVyLmRlY3JlYXNlTmVzdGluZ0xldmVsKCk7fWVsc2UgaWYoZm9ybWF0W2ldPT09J3QnKXtpZih0aGlzLl90b2tlbml6ZXIudG9rZW5MaW5lU3RhcnQoKS10aGlzLl9sYXN0TGluZU51bWJlcj4xKQp0aGlzLl9idWlsZGVyLmFkZE5ld0xpbmUodHJ1ZSk7dGhpcy5fbGFzdExpbmVOdW1iZXI9dGhpcy5fdG9rZW5pemVyLnRva2VuTGluZUVuZCgpO3RoaXMuX2J1aWxkZXIuYWRkVG9rZW4odGhpcy5fY29udGVudC5zdWJzdHJpbmcodG9rZW4uc3RhcnQsdG9rZW4uZW5kKSx0aGlzLl9mcm9tT2Zmc2V0K3Rva2VuLnN0YXJ0KTt9fX0KX2JlZm9yZVZpc2l0KG5vZGUpe2lmKCFub2RlLnBhcmVudCkKcmV0dXJuO3doaWxlKHRoaXMuX3Rva2VuaXplci5wZWVrVG9rZW4oKSYmdGhpcy5fdG9rZW5pemVyLnBlZWtUb2tlbigpLnN0YXJ0PG5vZGUuc3RhcnQpe2NvbnN0IHRva2VuPSh0aGlzLl90b2tlbml6ZXIubmV4dFRva2VuKCkpO2NvbnN0IGZvcm1hdD10aGlzLl9mb3JtYXRUb2tlbihub2RlLnBhcmVudCx0b2tlbik7dGhpcy5fcHVzaCh0b2tlbixmb3JtYXQpO319Cl9hZnRlclZpc2l0KG5vZGUpe3doaWxlKHRoaXMuX3Rva2VuaXplci5wZWVrVG9rZW4oKSYmdGhpcy5fdG9rZW5pemVyLnBlZWtUb2tlbigpLnN0YXJ0PG5vZGUuZW5kKXtjb25zdCB0b2tlbj0odGhpcy5fdG9rZW5pemVyLm5leHRUb2tlbigpKTtjb25zdCBmb3JtYXQ9dGhpcy5fZm9ybWF0VG9rZW4obm9kZSx0b2tlbik7dGhpcy5fcHVzaCh0b2tlbixmb3JtYXQpO30KdGhpcy5fcHVzaChudWxsLHRoaXMuX2ZpbmlzaE5vZGUobm9kZSkpO30KX2luRm9yTG9vcEhlYWRlcihub2RlKXtjb25zdCBwYXJlbnQ9bm9kZS5wYXJlbnQ7aWYoIXBhcmVudCkKcmV0dXJuIGZhbHNlO2lmKHBhcmVudC50eXBlPT09J0ZvclN0YXRlbWVudCcpCnJldHVybiBub2RlPT09cGFyZW50LmluaXR8fG5vZGU9PT1wYXJlbnQudGVzdHx8bm9kZT09PXBhcmVudC51cGRhdGU7aWYocGFyZW50LnR5cGU9PT0nRm9ySW5TdGF0ZW1lbnQnfHxwYXJlbnQudHlwZT09PSdGb3JPZlN0YXRlbWVudCcpCnJldHVybiBub2RlPT09cGFyZW50LmxlZnR8fHBhcmVudC5yaWdodDtyZXR1cm4gZmFsc2U7fQpfZm9ybWF0VG9rZW4obm9kZSx0b2tlbil7Y29uc3QgQVQ9Rm9ybWF0dGVyV29ya2VyLkFjb3JuVG9rZW5pemVyO2lmKEFULmxpbmVDb21tZW50KHRva2VuKSkKcmV0dXJuJ3RuJztpZihBVC5ibG9ja0NvbW1lbnQodG9rZW4pKQpyZXR1cm4ndG4nO2lmKG5vZGUudHlwZT09PSdDb250aW51ZVN0YXRlbWVudCd8fG5vZGUudHlwZT09PSdCcmVha1N0YXRlbWVudCcpe3JldHVybiBub2RlLmxhYmVsJiZBVC5rZXl3b3JkKHRva2VuKT8ndHMnOid0Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nSWRlbnRpZmllcicpe3JldHVybid0Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nUmV0dXJuU3RhdGVtZW50Jyl7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnOycpKQpyZXR1cm4ndCc7cmV0dXJuIG5vZGUuYXJndW1lbnQ/J3RzJzondCc7fWVsc2UgaWYobm9kZS50eXBlPT09J1Byb3BlcnR5Jyl7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnOicpKQpyZXR1cm4ndHMnO3JldHVybid0Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nQXJyYXlFeHByZXNzaW9uJyl7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnLCcpKQpyZXR1cm4ndHMnO3JldHVybid0Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nTGFiZWxlZFN0YXRlbWVudCcpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJzonKSkKcmV0dXJuJ3RzJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nTG9naWNhbEV4cHJlc3Npb24nfHxub2RlLnR5cGU9PT0nQXNzaWdubWVudEV4cHJlc3Npb24nfHxub2RlLnR5cGU9PT0nQmluYXJ5RXhwcmVzc2lvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4pJiYhQVQucHVuY3R1YXRvcih0b2tlbiwnKCknKSkKcmV0dXJuJ3N0cyc7fWVsc2UgaWYobm9kZS50eXBlPT09J0NvbmRpdGlvbmFsRXhwcmVzc2lvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJz86JykpCnJldHVybidzdHMnO31lbHNlIGlmKG5vZGUudHlwZT09PSdWYXJpYWJsZURlY2xhcmF0b3InKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCc9JykpCnJldHVybidzdHMnO31lbHNlIGlmKG5vZGUudHlwZT09PSdPYmplY3RQYXR0ZXJuJyl7aWYobm9kZS5wYXJlbnQmJm5vZGUucGFyZW50LnR5cGU9PT0nVmFyaWFibGVEZWNsYXJhdG9yJyYmQVQucHVuY3R1YXRvcih0b2tlbiwneycpKQpyZXR1cm4nc3QnO2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJywnKSkKcmV0dXJuJ3RzJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nRnVuY3Rpb25EZWNsYXJhdGlvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJywpJykpCnJldHVybid0cyc7fWVsc2UgaWYobm9kZS50eXBlPT09J0Z1bmN0aW9uRXhwcmVzc2lvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJywpJykpCnJldHVybid0cyc7aWYoQVQua2V5d29yZCh0b2tlbiwnZnVuY3Rpb24nKSkKcmV0dXJuIG5vZGUuaWQ/J3RzJzondCc7fWVsc2UgaWYobm9kZS50eXBlPT09J1dpdGhTdGF0ZW1lbnQnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCcpJykpCnJldHVybiBub2RlLmJvZHkmJm5vZGUuYm9keS50eXBlPT09J0Jsb2NrU3RhdGVtZW50Jz8ndHMnOid0bj4nO31lbHNlIGlmKG5vZGUudHlwZT09PSdTd2l0Y2hTdGF0ZW1lbnQnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCd7JykpCnJldHVybid0bj4nO2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJ30nKSkKcmV0dXJuJ248dG4nO2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJyknKSkKcmV0dXJuJ3RzJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nU3dpdGNoQ2FzZScpe2lmKEFULmtleXdvcmQodG9rZW4sJ2Nhc2UnKSkKcmV0dXJuJ248dHMnO2lmKEFULmtleXdvcmQodG9rZW4sJ2RlZmF1bHQnKSkKcmV0dXJuJ248dCc7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnOicpKQpyZXR1cm4ndG4+Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nVmFyaWFibGVEZWNsYXJhdGlvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJywnKSl7bGV0IGFsbFZhcmlhYmxlc0luaXRpYWxpemVkPXRydWU7Y29uc3QgZGVjbGFyYXRpb25zPShub2RlLmRlY2xhcmF0aW9ucyk7Zm9yKGxldCBpPTA7aTxkZWNsYXJhdGlvbnMubGVuZ3RoOysraSkKYWxsVmFyaWFibGVzSW5pdGlhbGl6ZWQ9YWxsVmFyaWFibGVzSW5pdGlhbGl6ZWQmJiEhZGVjbGFyYXRpb25zW2ldLmluaXQ7cmV0dXJuIXRoaXMuX2luRm9yTG9vcEhlYWRlcihub2RlKSYmYWxsVmFyaWFibGVzSW5pdGlhbGl6ZWQ/J25TU3RzJzondHMnO319ZWxzZSBpZihub2RlLnR5cGU9PT0nQmxvY2tTdGF0ZW1lbnQnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCd7JykpCnJldHVybiBub2RlLmJvZHkubGVuZ3RoPyd0bj4nOid0JztpZihBVC5wdW5jdHVhdG9yKHRva2VuLCd9JykpCnJldHVybiBub2RlLmJvZHkubGVuZ3RoPyduPHQnOid0Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nQ2F0Y2hDbGF1c2UnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCcpJykpCnJldHVybid0cyc7fWVsc2UgaWYobm9kZS50eXBlPT09J09iamVjdEV4cHJlc3Npb24nKXtpZighbm9kZS5wcm9wZXJ0aWVzLmxlbmd0aCkKcmV0dXJuJ3QnO2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJ3snKSkKcmV0dXJuJ3RuPic7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnfScpKQpyZXR1cm4nbjx0JztpZihBVC5wdW5jdHVhdG9yKHRva2VuLCcsJykpCnJldHVybid0bic7fWVsc2UgaWYobm9kZS50eXBlPT09J0lmU3RhdGVtZW50Jyl7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnKScpKQpyZXR1cm4gbm9kZS5jb25zZXF1ZW50JiZub2RlLmNvbnNlcXVlbnQudHlwZT09PSdCbG9ja1N0YXRlbWVudCc/J3RzJzondG4+JztpZihBVC5rZXl3b3JkKHRva2VuLCdlbHNlJykpe2NvbnN0IHByZUZvcm1hdD1ub2RlLmNvbnNlcXVlbnQmJm5vZGUuY29uc2VxdWVudC50eXBlPT09J0Jsb2NrU3RhdGVtZW50Jz8nc3QnOiduPHQnO2xldCBwb3N0Rm9ybWF0PSduPic7aWYobm9kZS5hbHRlcm5hdGUmJihub2RlLmFsdGVybmF0ZS50eXBlPT09J0Jsb2NrU3RhdGVtZW50J3x8bm9kZS5hbHRlcm5hdGUudHlwZT09PSdJZlN0YXRlbWVudCcpKQpwb3N0Rm9ybWF0PSdzJztyZXR1cm4gcHJlRm9ybWF0K3Bvc3RGb3JtYXQ7fX1lbHNlIGlmKG5vZGUudHlwZT09PSdDYWxsRXhwcmVzc2lvbicpe2lmKEFULnB1bmN0dWF0b3IodG9rZW4sJywnKSkKcmV0dXJuJ3RzJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nU2VxdWVuY2VFeHByZXNzaW9uJyYmQVQucHVuY3R1YXRvcih0b2tlbiwnLCcpKXtyZXR1cm4gbm9kZS5wYXJlbnQmJm5vZGUucGFyZW50LnR5cGU9PT0nU3dpdGNoQ2FzZSc/J3RzJzondG4nO31lbHNlIGlmKG5vZGUudHlwZT09PSdGb3JTdGF0ZW1lbnQnfHxub2RlLnR5cGU9PT0nRm9yT2ZTdGF0ZW1lbnQnfHxub2RlLnR5cGU9PT0nRm9ySW5TdGF0ZW1lbnQnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCc7JykpCnJldHVybid0cyc7aWYoQVQua2V5d29yZCh0b2tlbiwnaW4nKXx8QVQuaWRlbnRpZmllcih0b2tlbiwnb2YnKSkKcmV0dXJuJ3N0cyc7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnKScpKQpyZXR1cm4gbm9kZS5ib2R5JiZub2RlLmJvZHkudHlwZT09PSdCbG9ja1N0YXRlbWVudCc/J3RzJzondG4+Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nV2hpbGVTdGF0ZW1lbnQnKXtpZihBVC5wdW5jdHVhdG9yKHRva2VuLCcpJykpCnJldHVybiBub2RlLmJvZHkmJm5vZGUuYm9keS50eXBlPT09J0Jsb2NrU3RhdGVtZW50Jz8ndHMnOid0bj4nO31lbHNlIGlmKG5vZGUudHlwZT09PSdEb1doaWxlU3RhdGVtZW50Jyl7Y29uc3QgYmxvY2tCb2R5PW5vZGUuYm9keSYmbm9kZS5ib2R5LnR5cGU9PT0nQmxvY2tTdGF0ZW1lbnQnO2lmKEFULmtleXdvcmQodG9rZW4sJ2RvJykpCnJldHVybiBibG9ja0JvZHk/J3RzJzondG4+JztpZihBVC5rZXl3b3JkKHRva2VuLCd3aGlsZScpKQpyZXR1cm4gYmxvY2tCb2R5PydzdHMnOiduPHRzJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nQ2xhc3NCb2R5Jyl7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwneycpKQpyZXR1cm4nc3RuPic7aWYoQVQucHVuY3R1YXRvcih0b2tlbiwnfScpKQpyZXR1cm4nPG50bic7cmV0dXJuJ3QnO31lbHNlIGlmKG5vZGUudHlwZT09PSdZaWVsZEV4cHJlc3Npb24nKXtyZXR1cm4ndCc7fWVsc2UgaWYobm9kZS50eXBlPT09J1N1cGVyJyl7cmV0dXJuJ3QnO30KcmV0dXJuIEFULmtleXdvcmQodG9rZW4pJiYhQVQua2V5d29yZCh0b2tlbiwndGhpcycpPyd0cyc6J3QnO30KX2ZpbmlzaE5vZGUobm9kZSl7aWYobm9kZS50eXBlPT09J1dpdGhTdGF0ZW1lbnQnKXtpZihub2RlLmJvZHkmJm5vZGUuYm9keS50eXBlIT09J0Jsb2NrU3RhdGVtZW50JykKcmV0dXJuJ248Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nVmFyaWFibGVEZWNsYXJhdGlvbicpe2lmKCF0aGlzLl9pbkZvckxvb3BIZWFkZXIobm9kZSkpCnJldHVybiduJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nRm9yU3RhdGVtZW50J3x8bm9kZS50eXBlPT09J0Zvck9mU3RhdGVtZW50J3x8bm9kZS50eXBlPT09J0ZvckluU3RhdGVtZW50Jyl7aWYobm9kZS5ib2R5JiZub2RlLmJvZHkudHlwZSE9PSdCbG9ja1N0YXRlbWVudCcpCnJldHVybiduPCc7fWVsc2UgaWYobm9kZS50eXBlPT09J0Jsb2NrU3RhdGVtZW50Jyl7aWYobm9kZS5wYXJlbnQmJm5vZGUucGFyZW50LnR5cGU9PT0nSWZTdGF0ZW1lbnQnJiZub2RlLnBhcmVudC5hbHRlcm5hdGUmJm5vZGUucGFyZW50LmNvbnNlcXVlbnQ9PT1ub2RlKQpyZXR1cm4nJztpZihub2RlLnBhcmVudCYmbm9kZS5wYXJlbnQudHlwZT09PSdGdW5jdGlvbkV4cHJlc3Npb24nJiZub2RlLnBhcmVudC5wYXJlbnQmJm5vZGUucGFyZW50LnBhcmVudC50eXBlPT09J1Byb3BlcnR5JykKcmV0dXJuJyc7aWYobm9kZS5wYXJlbnQmJm5vZGUucGFyZW50LnR5cGU9PT0nRnVuY3Rpb25FeHByZXNzaW9uJyYmbm9kZS5wYXJlbnQucGFyZW50JiZub2RlLnBhcmVudC5wYXJlbnQudHlwZT09PSdWYXJpYWJsZURlY2xhcmF0b3InKQpyZXR1cm4nJztpZihub2RlLnBhcmVudCYmbm9kZS5wYXJlbnQudHlwZT09PSdGdW5jdGlvbkV4cHJlc3Npb24nJiZub2RlLnBhcmVudC5wYXJlbnQmJm5vZGUucGFyZW50LnBhcmVudC50eXBlPT09J0NhbGxFeHByZXNzaW9uJykKcmV0dXJuJyc7aWYobm9kZS5wYXJlbnQmJm5vZGUucGFyZW50LnR5cGU9PT0nRG9XaGlsZVN0YXRlbWVudCcpCnJldHVybicnO2lmKG5vZGUucGFyZW50JiZub2RlLnBhcmVudC50eXBlPT09J1RyeVN0YXRlbWVudCcmJm5vZGUucGFyZW50LmJsb2NrPT09bm9kZSkKcmV0dXJuJ3MnO2lmKG5vZGUucGFyZW50JiZub2RlLnBhcmVudC50eXBlPT09J0NhdGNoQ2xhdXNlJyYmbm9kZS5wYXJlbnQucGFyZW50LmZpbmFsaXplcikKcmV0dXJuJ3MnO3JldHVybiduJzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nV2hpbGVTdGF0ZW1lbnQnKXtpZihub2RlLmJvZHkmJm5vZGUuYm9keS50eXBlIT09J0Jsb2NrU3RhdGVtZW50JykKcmV0dXJuJ248Jzt9ZWxzZSBpZihub2RlLnR5cGU9PT0nSWZTdGF0ZW1lbnQnKXtpZihub2RlLmFsdGVybmF0ZSl7aWYobm9kZS5hbHRlcm5hdGUudHlwZSE9PSdCbG9ja1N0YXRlbWVudCcmJm5vZGUuYWx0ZXJuYXRlLnR5cGUhPT0nSWZTdGF0ZW1lbnQnKQpyZXR1cm4nPCc7fWVsc2UgaWYobm9kZS5jb25zZXF1ZW50KXtpZihub2RlLmNvbnNlcXVlbnQudHlwZSE9PSdCbG9ja1N0YXRlbWVudCcpCnJldHVybic8Jzt9fWVsc2UgaWYobm9kZS50eXBlPT09J0JyZWFrU3RhdGVtZW50J3x8bm9kZS50eXBlPT09J0NvbnRpbnVlU3RhdGVtZW50J3x8bm9kZS50eXBlPT09J1Rocm93U3RhdGVtZW50J3x8bm9kZS50eXBlPT09J1JldHVyblN0YXRlbWVudCd8fG5vZGUudHlwZT09PSdFeHByZXNzaW9uU3RhdGVtZW50Jyl7cmV0dXJuJ24nO30KcmV0dXJuJyc7fX07O0Zvcm1hdHRlcldvcmtlci5Gb3JtYXR0ZWRDb250ZW50QnVpbGRlcj1jbGFzc3tjb25zdHJ1Y3RvcihpbmRlbnRTdHJpbmcpe3RoaXMuX2xhc3RPcmlnaW5hbFBvc2l0aW9uPTA7dGhpcy5fZm9ybWF0dGVkQ29udGVudD1bXTt0aGlzLl9mb3JtYXR0ZWRDb250ZW50TGVuZ3RoPTA7dGhpcy5fbGFzdEZvcm1hdHRlZFBvc2l0aW9uPTA7dGhpcy5fbWFwcGluZz17b3JpZ2luYWw6WzBdLGZvcm1hdHRlZDpbMF19O3RoaXMuX25lc3RpbmdMZXZlbD0wO3RoaXMuX2luZGVudFN0cmluZz1pbmRlbnRTdHJpbmc7dGhpcy5fY2FjaGVkSW5kZW50cz1uZXcgTWFwKCk7dGhpcy5fbmV3TGluZXM9MDt0aGlzLl9zb2Z0U3BhY2U9ZmFsc2U7dGhpcy5faGFyZFNwYWNlcz0wO3RoaXMuX2VuZm9yY2VTcGFjZUJldHdlZW5Xb3Jkcz10cnVlO30Kc2V0RW5mb3JjZVNwYWNlQmV0d2VlbldvcmRzKHZhbHVlKXtjb25zdCBvbGRWYWx1ZT10aGlzLl9lbmZvcmNlU3BhY2VCZXR3ZWVuV29yZHM7dGhpcy5fZW5mb3JjZVNwYWNlQmV0d2VlbldvcmRzPXZhbHVlO3JldHVybiBvbGRWYWx1ZTt9CmFkZFRva2VuKHRva2VuLG9mZnNldCl7Y29uc3QgbGFzdD10aGlzLl9mb3JtYXR0ZWRDb250ZW50LnBlZWtMYXN0KCk7aWYodGhpcy5fZW5mb3JjZVNwYWNlQmV0d2VlbldvcmRzJiZsYXN0JiYvXHcvLnRlc3QobGFzdFtsYXN0Lmxlbmd0aC0xXSkmJi9cdy8udGVzdCh0b2tlbikpCnRoaXMuYWRkU29mdFNwYWNlKCk7dGhpcy5fYXBwZW5kRm9ybWF0dGluZygpO3RoaXMuX2FkZE1hcHBpbmdJZk5lZWRlZChvZmZzZXQpO3RoaXMuX2FkZFRleHQodG9rZW4pO30KYWRkU29mdFNwYWNlKCl7aWYoIXRoaXMuX2hhcmRTcGFjZXMpCnRoaXMuX3NvZnRTcGFjZT10cnVlO30KYWRkSGFyZFNwYWNlKCl7dGhpcy5fc29mdFNwYWNlPWZhbHNlOysrdGhpcy5faGFyZFNwYWNlczt9CmFkZE5ld0xpbmUobm9TcXVhc2gpe2lmKCF0aGlzLl9mb3JtYXR0ZWRDb250ZW50TGVuZ3RoKQpyZXR1cm47aWYobm9TcXVhc2gpCisrdGhpcy5fbmV3TGluZXM7ZWxzZQp0aGlzLl9uZXdMaW5lcz10aGlzLl9uZXdMaW5lc3x8MTt9CmluY3JlYXNlTmVzdGluZ0xldmVsKCl7dGhpcy5fbmVzdGluZ0xldmVsKz0xO30KZGVjcmVhc2VOZXN0aW5nTGV2ZWwoKXtpZih0aGlzLl9uZXN0aW5nTGV2ZWw+MCkKdGhpcy5fbmVzdGluZ0xldmVsLT0xO30KX2FwcGVuZEZvcm1hdHRpbmcoKXtpZih0aGlzLl9uZXdMaW5lcyl7Zm9yKGxldCBpPTA7aTx0aGlzLl9uZXdMaW5lczsrK2kpCnRoaXMuX2FkZFRleHQoJ1xuJyk7dGhpcy5fYWRkVGV4dCh0aGlzLl9pbmRlbnQoKSk7fWVsc2UgaWYodGhpcy5fc29mdFNwYWNlKXt0aGlzLl9hZGRUZXh0KCcgJyk7fQppZih0aGlzLl9oYXJkU3BhY2VzKXtmb3IobGV0IGk9MDtpPHRoaXMuX2hhcmRTcGFjZXM7KytpKQp0aGlzLl9hZGRUZXh0KCcgJyk7fQp0aGlzLl9uZXdMaW5lcz0wO3RoaXMuX3NvZnRTcGFjZT1mYWxzZTt0aGlzLl9oYXJkU3BhY2VzPTA7fQpjb250ZW50KCl7cmV0dXJuIHRoaXMuX2Zvcm1hdHRlZENvbnRlbnQuam9pbignJykrKHRoaXMuX25ld0xpbmVzPydcbic6JycpO30KbWFwcGluZygpe3JldHVybiB0aGlzLl9tYXBwaW5nO30KX2luZGVudCgpe2NvbnN0IGNhY2hlZFZhbHVlPXRoaXMuX2NhY2hlZEluZGVudHMuZ2V0KHRoaXMuX25lc3RpbmdMZXZlbCk7aWYoY2FjaGVkVmFsdWUpCnJldHVybiBjYWNoZWRWYWx1ZTtsZXQgZnVsbEluZGVudD0nJztmb3IobGV0IGk9MDtpPHRoaXMuX25lc3RpbmdMZXZlbDsrK2kpCmZ1bGxJbmRlbnQrPXRoaXMuX2luZGVudFN0cmluZztpZih0aGlzLl9uZXN0aW5nTGV2ZWw8PTIwKQp0aGlzLl9jYWNoZWRJbmRlbnRzLnNldCh0aGlzLl9uZXN0aW5nTGV2ZWwsZnVsbEluZGVudCk7cmV0dXJuIGZ1bGxJbmRlbnQ7fQpfYWRkVGV4dCh0ZXh0KXt0aGlzLl9mb3JtYXR0ZWRDb250ZW50LnB1c2godGV4dCk7dGhpcy5fZm9ybWF0dGVkQ29udGVudExlbmd0aCs9dGV4dC5sZW5ndGg7fQpfYWRkTWFwcGluZ0lmTmVlZGVkKG9yaWdpbmFsUG9zaXRpb24pe2lmKG9yaWdpbmFsUG9zaXRpb24tdGhpcy5fbGFzdE9yaWdpbmFsUG9zaXRpb249PT10aGlzLl9mb3JtYXR0ZWRDb250ZW50TGVuZ3RoLXRoaXMuX2xhc3RGb3JtYXR0ZWRQb3NpdGlvbikKcmV0dXJuO3RoaXMuX21hcHBpbmcub3JpZ2luYWwucHVzaChvcmlnaW5hbFBvc2l0aW9uKTt0aGlzLl9sYXN0T3JpZ2luYWxQb3NpdGlvbj1vcmlnaW5hbFBvc2l0aW9uO3RoaXMuX21hcHBpbmcuZm9ybWF0dGVkLnB1c2godGhpcy5fZm9ybWF0dGVkQ29udGVudExlbmd0aCk7dGhpcy5fbGFzdEZvcm1hdHRlZFBvc2l0aW9uPXRoaXMuX2Zvcm1hdHRlZENvbnRlbnRMZW5ndGg7fX07O0Zvcm1hdHRlcldvcmtlci5DU1NQYXJzZXJTdGF0ZXM9e0luaXRpYWw6J0luaXRpYWwnLFNlbGVjdG9yOidTZWxlY3RvcicsU3R5bGU6J1N0eWxlJyxQcm9wZXJ0eU5hbWU6J1Byb3BlcnR5TmFtZScsUHJvcGVydHlWYWx1ZTonUHJvcGVydHlWYWx1ZScsQXRSdWxlOidBdFJ1bGUnfTtGb3JtYXR0ZXJXb3JrZXIucGFyc2VDU1M9ZnVuY3Rpb24odGV4dCl7Rm9ybWF0dGVyV29ya2VyLl9pbm5lclBhcnNlQ1NTKHRleHQscG9zdE1lc3NhZ2UpO307Rm9ybWF0dGVyV29ya2VyLl9pbm5lclBhcnNlQ1NTPWZ1bmN0aW9uKHRleHQsY2h1bmtDYWxsYmFjayl7Y29uc3QgY2h1bmtTaXplPTEwMDAwMDtjb25zdCBsaW5lcz10ZXh0LnNwbGl0KCdcbicpO2xldCBydWxlcz1bXTtsZXQgcHJvY2Vzc2VkQ2h1bmtDaGFyYWN0ZXJzPTA7bGV0IHN0YXRlPUZvcm1hdHRlcldvcmtlci5DU1NQYXJzZXJTdGF0ZXMuSW5pdGlhbDtsZXQgcnVsZTtsZXQgcHJvcGVydHk7Y29uc3QgVW5kZWZUb2tlblR5cGU9bmV3IFNldCgpO2xldCBkaXNhYmxlZFJ1bGVzPVtdO2Z1bmN0aW9uIGRpc2FibGVkUnVsZXNDYWxsYmFjayhjaHVuayl7ZGlzYWJsZWRSdWxlcz1kaXNhYmxlZFJ1bGVzLmNvbmNhdChjaHVuay5jaHVuayk7fQpmdW5jdGlvbiBwcm9jZXNzVG9rZW4odG9rZW5WYWx1ZSx0b2tlblR5cGVzLGNvbHVtbixuZXdDb2x1bW4pe2NvbnN0IHRva2VuVHlwZT10b2tlblR5cGVzP25ldyBTZXQodG9rZW5UeXBlcy5zcGxpdCgnICcpKTpVbmRlZlRva2VuVHlwZTtzd2l0Y2goc3RhdGUpe2Nhc2UgRm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5Jbml0aWFsOmlmKHRva2VuVHlwZS5oYXMoJ3F1YWxpZmllcicpfHx0b2tlblR5cGUuaGFzKCdidWlsdGluJyl8fHRva2VuVHlwZS5oYXMoJ3RhZycpKXtydWxlPXtzZWxlY3RvclRleHQ6dG9rZW5WYWx1ZSxsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNvbHVtbixwcm9wZXJ0aWVzOltdLH07c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5TZWxlY3Rvcjt9ZWxzZSBpZih0b2tlblR5cGUuaGFzKCdkZWYnKSl7cnVsZT17YXRSdWxlOnRva2VuVmFsdWUsbGluZU51bWJlcjpsaW5lTnVtYmVyLGNvbHVtbk51bWJlcjpjb2x1bW4sfTtzdGF0ZT1Gb3JtYXR0ZXJXb3JrZXIuQ1NTUGFyc2VyU3RhdGVzLkF0UnVsZTt9CmJyZWFrO2Nhc2UgRm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5TZWxlY3RvcjppZih0b2tlblZhbHVlPT09J3snJiZ0b2tlblR5cGU9PT1VbmRlZlRva2VuVHlwZSl7cnVsZS5zZWxlY3RvclRleHQ9cnVsZS5zZWxlY3RvclRleHQudHJpbSgpO3J1bGUuc3R5bGVSYW5nZT1jcmVhdGVSYW5nZShsaW5lTnVtYmVyLG5ld0NvbHVtbik7c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5TdHlsZTt9ZWxzZXtydWxlLnNlbGVjdG9yVGV4dCs9dG9rZW5WYWx1ZTt9CmJyZWFrO2Nhc2UgRm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5BdFJ1bGU6aWYoKHRva2VuVmFsdWU9PT0nOyd8fHRva2VuVmFsdWU9PT0neycpJiZ0b2tlblR5cGU9PT1VbmRlZlRva2VuVHlwZSl7cnVsZS5hdFJ1bGU9cnVsZS5hdFJ1bGUudHJpbSgpO3J1bGVzLnB1c2gocnVsZSk7c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5Jbml0aWFsO31lbHNle3J1bGUuYXRSdWxlKz10b2tlblZhbHVlO30KYnJlYWs7Y2FzZSBGb3JtYXR0ZXJXb3JrZXIuQ1NTUGFyc2VyU3RhdGVzLlN0eWxlOmlmKHRva2VuVHlwZS5oYXMoJ21ldGEnKXx8dG9rZW5UeXBlLmhhcygncHJvcGVydHknKSl7cHJvcGVydHk9e25hbWU6dG9rZW5WYWx1ZSx2YWx1ZTonJyxyYW5nZTpjcmVhdGVSYW5nZShsaW5lTnVtYmVyLGNvbHVtbiksbmFtZVJhbmdlOmNyZWF0ZVJhbmdlKGxpbmVOdW1iZXIsY29sdW1uKX07c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5Qcm9wZXJ0eU5hbWU7fWVsc2UgaWYodG9rZW5WYWx1ZT09PSd9JyYmdG9rZW5UeXBlPT09VW5kZWZUb2tlblR5cGUpe3J1bGUuc3R5bGVSYW5nZS5lbmRMaW5lPWxpbmVOdW1iZXI7cnVsZS5zdHlsZVJhbmdlLmVuZENvbHVtbj1jb2x1bW47cnVsZXMucHVzaChydWxlKTtzdGF0ZT1Gb3JtYXR0ZXJXb3JrZXIuQ1NTUGFyc2VyU3RhdGVzLkluaXRpYWw7fWVsc2UgaWYodG9rZW5UeXBlLmhhcygnY29tbWVudCcpKXtpZih0b2tlblZhbHVlLnN1YnN0cmluZygwLDIpIT09Jy8qJ3x8dG9rZW5WYWx1ZS5zdWJzdHJpbmcodG9rZW5WYWx1ZS5sZW5ndGgtMikhPT0nKi8nKQpicmVhaztjb25zdCB1bmNvbW1lbnRlZFRleHQ9dG9rZW5WYWx1ZS5zdWJzdHJpbmcoMix0b2tlblZhbHVlLmxlbmd0aC0yKTtjb25zdCBmYWtlUnVsZT0nYXtcbicrdW5jb21tZW50ZWRUZXh0Kyd9JztkaXNhYmxlZFJ1bGVzPVtdO0Zvcm1hdHRlcldvcmtlci5faW5uZXJQYXJzZUNTUyhmYWtlUnVsZSxkaXNhYmxlZFJ1bGVzQ2FsbGJhY2spO2lmKGRpc2FibGVkUnVsZXMubGVuZ3RoPT09MSYmZGlzYWJsZWRSdWxlc1swXS5wcm9wZXJ0aWVzLmxlbmd0aD09PTEpe2NvbnN0IGRpc2FibGVkUHJvcGVydHk9ZGlzYWJsZWRSdWxlc1swXS5wcm9wZXJ0aWVzWzBdO2Rpc2FibGVkUHJvcGVydHkuZGlzYWJsZWQ9dHJ1ZTtkaXNhYmxlZFByb3BlcnR5LnJhbmdlPWNyZWF0ZVJhbmdlKGxpbmVOdW1iZXIsY29sdW1uKTtkaXNhYmxlZFByb3BlcnR5LnJhbmdlLmVuZENvbHVtbj1uZXdDb2x1bW47Y29uc3QgbGluZU9mZnNldD1saW5lTnVtYmVyLTE7Y29uc3QgY29sdW1uT2Zmc2V0PWNvbHVtbisyO2Rpc2FibGVkUHJvcGVydHkubmFtZVJhbmdlLnN0YXJ0TGluZSs9bGluZU9mZnNldDtkaXNhYmxlZFByb3BlcnR5Lm5hbWVSYW5nZS5zdGFydENvbHVtbis9Y29sdW1uT2Zmc2V0O2Rpc2FibGVkUHJvcGVydHkubmFtZVJhbmdlLmVuZExpbmUrPWxpbmVPZmZzZXQ7ZGlzYWJsZWRQcm9wZXJ0eS5uYW1lUmFuZ2UuZW5kQ29sdW1uKz1jb2x1bW5PZmZzZXQ7ZGlzYWJsZWRQcm9wZXJ0eS52YWx1ZVJhbmdlLnN0YXJ0TGluZSs9bGluZU9mZnNldDtkaXNhYmxlZFByb3BlcnR5LnZhbHVlUmFuZ2Uuc3RhcnRDb2x1bW4rPWNvbHVtbk9mZnNldDtkaXNhYmxlZFByb3BlcnR5LnZhbHVlUmFuZ2UuZW5kTGluZSs9bGluZU9mZnNldDtkaXNhYmxlZFByb3BlcnR5LnZhbHVlUmFuZ2UuZW5kQ29sdW1uKz1jb2x1bW5PZmZzZXQ7cnVsZS5wcm9wZXJ0aWVzLnB1c2goZGlzYWJsZWRQcm9wZXJ0eSk7fX0KYnJlYWs7Y2FzZSBGb3JtYXR0ZXJXb3JrZXIuQ1NTUGFyc2VyU3RhdGVzLlByb3BlcnR5TmFtZTppZih0b2tlblZhbHVlPT09JzonJiZ0b2tlblR5cGU9PT1VbmRlZlRva2VuVHlwZSl7cHJvcGVydHkubmFtZT1wcm9wZXJ0eS5uYW1lO3Byb3BlcnR5Lm5hbWVSYW5nZS5lbmRMaW5lPWxpbmVOdW1iZXI7cHJvcGVydHkubmFtZVJhbmdlLmVuZENvbHVtbj1jb2x1bW47cHJvcGVydHkudmFsdWVSYW5nZT1jcmVhdGVSYW5nZShsaW5lTnVtYmVyLG5ld0NvbHVtbik7c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5Qcm9wZXJ0eVZhbHVlO31lbHNlIGlmKHRva2VuVHlwZS5oYXMoJ3Byb3BlcnR5Jykpe3Byb3BlcnR5Lm5hbWUrPXRva2VuVmFsdWU7fQpicmVhaztjYXNlIEZvcm1hdHRlcldvcmtlci5DU1NQYXJzZXJTdGF0ZXMuUHJvcGVydHlWYWx1ZTppZigodG9rZW5WYWx1ZT09PSc7J3x8dG9rZW5WYWx1ZT09PSd9JykmJnRva2VuVHlwZT09PVVuZGVmVG9rZW5UeXBlKXtwcm9wZXJ0eS52YWx1ZT1wcm9wZXJ0eS52YWx1ZTtwcm9wZXJ0eS52YWx1ZVJhbmdlLmVuZExpbmU9bGluZU51bWJlcjtwcm9wZXJ0eS52YWx1ZVJhbmdlLmVuZENvbHVtbj1jb2x1bW47cHJvcGVydHkucmFuZ2UuZW5kTGluZT1saW5lTnVtYmVyO3Byb3BlcnR5LnJhbmdlLmVuZENvbHVtbj10b2tlblZhbHVlPT09JzsnP25ld0NvbHVtbjpjb2x1bW47cnVsZS5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO2lmKHRva2VuVmFsdWU9PT0nfScpe3J1bGUuc3R5bGVSYW5nZS5lbmRMaW5lPWxpbmVOdW1iZXI7cnVsZS5zdHlsZVJhbmdlLmVuZENvbHVtbj1jb2x1bW47cnVsZXMucHVzaChydWxlKTtzdGF0ZT1Gb3JtYXR0ZXJXb3JrZXIuQ1NTUGFyc2VyU3RhdGVzLkluaXRpYWw7fWVsc2V7c3RhdGU9Rm9ybWF0dGVyV29ya2VyLkNTU1BhcnNlclN0YXRlcy5TdHlsZTt9fWVsc2UgaWYoIXRva2VuVHlwZS5oYXMoJ2NvbW1lbnQnKSl7cHJvcGVydHkudmFsdWUrPXRva2VuVmFsdWU7fQpicmVhaztkZWZhdWx0OmNvbnNvbGUuYXNzZXJ0KGZhbHNlLCdVbmtub3duIENTUyBwYXJzZXIgc3RhdGUuJyk7fQpwcm9jZXNzZWRDaHVua0NoYXJhY3RlcnMrPW5ld0NvbHVtbi1jb2x1bW47aWYocHJvY2Vzc2VkQ2h1bmtDaGFyYWN0ZXJzPmNodW5rU2l6ZSl7Y2h1bmtDYWxsYmFjayh7Y2h1bms6cnVsZXMsaXNMYXN0Q2h1bms6ZmFsc2V9KTtydWxlcz1bXTtwcm9jZXNzZWRDaHVua0NoYXJhY3RlcnM9MDt9fQpjb25zdCB0b2tlbml6ZXI9Rm9ybWF0dGVyV29ya2VyLmNyZWF0ZVRva2VuaXplcigndGV4dC9jc3MnKTtsZXQgbGluZU51bWJlcjtmb3IobGluZU51bWJlcj0wO2xpbmVOdW1iZXI8bGluZXMubGVuZ3RoOysrbGluZU51bWJlcil7Y29uc3QgbGluZT1saW5lc1tsaW5lTnVtYmVyXTt0b2tlbml6ZXIobGluZSxwcm9jZXNzVG9rZW4pO3Byb2Nlc3NUb2tlbignXG4nLG51bGwsbGluZS5sZW5ndGgsbGluZS5sZW5ndGgrMSk7fQpjaHVua0NhbGxiYWNrKHtjaHVuazpydWxlcyxpc0xhc3RDaHVuazp0cnVlfSk7ZnVuY3Rpb24gY3JlYXRlUmFuZ2UobGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybntzdGFydExpbmU6bGluZU51bWJlcixzdGFydENvbHVtbjpjb2x1bW5OdW1iZXIsZW5kTGluZTpsaW5lTnVtYmVyLGVuZENvbHVtbjpjb2x1bW5OdW1iZXJ9O319OztGb3JtYXR0ZXJXb3JrZXIuSFRNTEZvcm1hdHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihidWlsZGVyKXt0aGlzLl9idWlsZGVyPWJ1aWxkZXI7dGhpcy5fanNGb3JtYXR0ZXI9bmV3IEZvcm1hdHRlcldvcmtlci5KYXZhU2NyaXB0Rm9ybWF0dGVyKGJ1aWxkZXIpO3RoaXMuX2Nzc0Zvcm1hdHRlcj1uZXcgRm9ybWF0dGVyV29ya2VyLkNTU0Zvcm1hdHRlcihidWlsZGVyKTt9CmZvcm1hdCh0ZXh0LGxpbmVFbmRpbmdzKXt0aGlzLl90ZXh0PXRleHQ7dGhpcy5fbGluZUVuZGluZ3M9bGluZUVuZGluZ3M7dGhpcy5fbW9kZWw9bmV3IEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwodGV4dCk7dGhpcy5fd2Fsayh0aGlzLl9tb2RlbC5kb2N1bWVudCgpKTt9Cl9mb3JtYXRUb2tlbnNUaWxsKGVsZW1lbnQsb2Zmc2V0KXt3aGlsZSh0aGlzLl9tb2RlbC5wZWVrVG9rZW4oKSYmdGhpcy5fbW9kZWwucGVla1Rva2VuKCkuc3RhcnRPZmZzZXQ8b2Zmc2V0KXtjb25zdCB0b2tlbj10aGlzLl9tb2RlbC5uZXh0VG9rZW4oKTt0aGlzLl9mb3JtYXRUb2tlbihlbGVtZW50LHRva2VuKTt9fQpfd2FsayhlbGVtZW50KXtpZihlbGVtZW50LnBhcmVudCkKdGhpcy5fZm9ybWF0VG9rZW5zVGlsbChlbGVtZW50LnBhcmVudCxlbGVtZW50Lm9wZW5UYWcuc3RhcnRPZmZzZXQpO3RoaXMuX2JlZm9yZU9wZW5UYWcoZWxlbWVudCk7dGhpcy5fZm9ybWF0VG9rZW5zVGlsbChlbGVtZW50LGVsZW1lbnQub3BlblRhZy5lbmRPZmZzZXQpO3RoaXMuX2FmdGVyT3BlblRhZyhlbGVtZW50KTtmb3IobGV0IGk9MDtpPGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5fd2FsayhlbGVtZW50LmNoaWxkcmVuW2ldKTt0aGlzLl9mb3JtYXRUb2tlbnNUaWxsKGVsZW1lbnQsZWxlbWVudC5jbG9zZVRhZy5zdGFydE9mZnNldCk7dGhpcy5fYmVmb3JlQ2xvc2VUYWcoZWxlbWVudCk7dGhpcy5fZm9ybWF0VG9rZW5zVGlsbChlbGVtZW50LGVsZW1lbnQuY2xvc2VUYWcuZW5kT2Zmc2V0KTt0aGlzLl9hZnRlckNsb3NlVGFnKGVsZW1lbnQpO30KX2JlZm9yZU9wZW5UYWcoZWxlbWVudCl7aWYoIWVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RofHxlbGVtZW50PT09dGhpcy5fbW9kZWwuZG9jdW1lbnQoKSkKcmV0dXJuO3RoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO30KX2FmdGVyT3BlblRhZyhlbGVtZW50KXtpZighZWxlbWVudC5jaGlsZHJlbi5sZW5ndGh8fGVsZW1lbnQ9PT10aGlzLl9tb2RlbC5kb2N1bWVudCgpKQpyZXR1cm47dGhpcy5fYnVpbGRlci5pbmNyZWFzZU5lc3RpbmdMZXZlbCgpO3RoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO30KX2JlZm9yZUNsb3NlVGFnKGVsZW1lbnQpe2lmKCFlbGVtZW50LmNoaWxkcmVuLmxlbmd0aHx8ZWxlbWVudD09PXRoaXMuX21vZGVsLmRvY3VtZW50KCkpCnJldHVybjt0aGlzLl9idWlsZGVyLmRlY3JlYXNlTmVzdGluZ0xldmVsKCk7dGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7fQpfYWZ0ZXJDbG9zZVRhZyhlbGVtZW50KXt0aGlzLl9idWlsZGVyLmFkZE5ld0xpbmUoKTt9Cl9mb3JtYXRUb2tlbihlbGVtZW50LHRva2VuKXtpZih0b2tlbi52YWx1ZS5pc1doaXRlc3BhY2UoKSkKcmV0dXJuO2lmKHRva2VuLnR5cGUuaGFzKCdjb21tZW50Jyl8fHRva2VuLnR5cGUuaGFzKCdtZXRhJykpe3RoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO3RoaXMuX2J1aWxkZXIuYWRkVG9rZW4odG9rZW4udmFsdWUudHJpbSgpLHRva2VuLnN0YXJ0T2Zmc2V0KTt0aGlzLl9idWlsZGVyLmFkZE5ld0xpbmUoKTtyZXR1cm47fQpjb25zdCBpc0JvZHlUb2tlbj1lbGVtZW50Lm9wZW5UYWcuZW5kT2Zmc2V0PD10b2tlbi5zdGFydE9mZnNldCYmdG9rZW4uc3RhcnRPZmZzZXQ8ZWxlbWVudC5jbG9zZVRhZy5zdGFydE9mZnNldDtpZihpc0JvZHlUb2tlbiYmZWxlbWVudC5uYW1lPT09J3N0eWxlJyl7dGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7dGhpcy5fYnVpbGRlci5pbmNyZWFzZU5lc3RpbmdMZXZlbCgpO3RoaXMuX2Nzc0Zvcm1hdHRlci5mb3JtYXQodGhpcy5fdGV4dCx0aGlzLl9saW5lRW5kaW5ncyx0b2tlbi5zdGFydE9mZnNldCx0b2tlbi5lbmRPZmZzZXQpO3RoaXMuX2J1aWxkZXIuZGVjcmVhc2VOZXN0aW5nTGV2ZWwoKTtyZXR1cm47fQppZihpc0JvZHlUb2tlbiYmZWxlbWVudC5uYW1lPT09J3NjcmlwdCcpe3RoaXMuX2J1aWxkZXIuYWRkTmV3TGluZSgpO3RoaXMuX2J1aWxkZXIuaW5jcmVhc2VOZXN0aW5nTGV2ZWwoKTtpZih0aGlzLl9zY3JpcHRUYWdJc0phdmFTY3JpcHQoZWxlbWVudCkpe3RoaXMuX2pzRm9ybWF0dGVyLmZvcm1hdCh0aGlzLl90ZXh0LHRoaXMuX2xpbmVFbmRpbmdzLHRva2VuLnN0YXJ0T2Zmc2V0LHRva2VuLmVuZE9mZnNldCk7fWVsc2V7dGhpcy5fYnVpbGRlci5hZGRUb2tlbih0b2tlbi52YWx1ZSx0b2tlbi5zdGFydE9mZnNldCk7dGhpcy5fYnVpbGRlci5hZGROZXdMaW5lKCk7fQp0aGlzLl9idWlsZGVyLmRlY3JlYXNlTmVzdGluZ0xldmVsKCk7cmV0dXJuO30KaWYoIWlzQm9keVRva2VuJiZ0b2tlbi50eXBlLmhhcygnYXR0cmlidXRlJykpCnRoaXMuX2J1aWxkZXIuYWRkU29mdFNwYWNlKCk7dGhpcy5fYnVpbGRlci5hZGRUb2tlbih0b2tlbi52YWx1ZSx0b2tlbi5zdGFydE9mZnNldCk7fQpfc2NyaXB0VGFnSXNKYXZhU2NyaXB0KGVsZW1lbnQpe2lmKCFlbGVtZW50Lm9wZW5UYWcuYXR0cmlidXRlcy5oYXMoJ3R5cGUnKSkKcmV0dXJuIHRydWU7bGV0IHR5cGU9ZWxlbWVudC5vcGVuVGFnLmF0dHJpYnV0ZXMuZ2V0KCd0eXBlJykudG9Mb3dlckNhc2UoKTtpZighdHlwZSkKcmV0dXJuIHRydWU7Y29uc3QgaXNXcmFwcGVkSW5RdW90ZXM9L14oWyJcJ10pKC4qKVwxJC8uZXhlYyh0eXBlLnRyaW0oKSk7aWYoaXNXcmFwcGVkSW5RdW90ZXMpCnR5cGU9aXNXcmFwcGVkSW5RdW90ZXNbMl07cmV0dXJuIEZvcm1hdHRlcldvcmtlci5IVE1MRm9ybWF0dGVyLlN1cHBvcnRlZEphdmFTY3JpcHRNaW1lVHlwZXMuaGFzKHR5cGUudHJpbSgpKTt9fTtGb3JtYXR0ZXJXb3JrZXIuSFRNTEZvcm1hdHRlci5TdXBwb3J0ZWRKYXZhU2NyaXB0TWltZVR5cGVzPW5ldyBTZXQoWydhcHBsaWNhdGlvbi9lY21hc2NyaXB0JywnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsJ2FwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCcsJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcsJ3RleHQvZWNtYXNjcmlwdCcsJ3RleHQvamF2YXNjcmlwdCcsJ3RleHQvamF2YXNjcmlwdDEuMCcsJ3RleHQvamF2YXNjcmlwdDEuMScsJ3RleHQvamF2YXNjcmlwdDEuMicsJ3RleHQvamF2YXNjcmlwdDEuMycsJ3RleHQvamF2YXNjcmlwdDEuNCcsJ3RleHQvamF2YXNjcmlwdDEuNScsJ3RleHQvanNjcmlwdCcsJ3RleHQvbGl2ZXNjcmlwdCcsJ3RleHQveC1lY21hc2NyaXB0JywndGV4dC94LWphdmFzY3JpcHQnXSk7Rm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbD1jbGFzc3tjb25zdHJ1Y3Rvcih0ZXh0KXt0aGlzLl9zdGF0ZT1Gb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLlBhcnNlU3RhdGUuSW5pdGlhbDt0aGlzLl9kb2N1bWVudD1uZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5FbGVtZW50KCdkb2N1bWVudCcpO3RoaXMuX2RvY3VtZW50Lm9wZW5UYWc9bmV3IEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuVGFnKCdkb2N1bWVudCcsMCwwLG5ldyBNYXAoKSx0cnVlLGZhbHNlKTt0aGlzLl9kb2N1bWVudC5jbG9zZVRhZz1uZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5UYWcoJ2RvY3VtZW50Jyx0ZXh0Lmxlbmd0aCx0ZXh0Lmxlbmd0aCxuZXcgTWFwKCksZmFsc2UsZmFsc2UpO3RoaXMuX3N0YWNrPVt0aGlzLl9kb2N1bWVudF07dGhpcy5fdG9rZW5zPVtdO3RoaXMuX3Rva2VuSW5kZXg9MDt0aGlzLl9idWlsZCh0ZXh0KTt9Cl9idWlsZCh0ZXh0KXtjb25zdCB0b2tlbml6ZXI9Rm9ybWF0dGVyV29ya2VyLmNyZWF0ZVRva2VuaXplcigndGV4dC9odG1sJyk7bGV0IGxhc3RPZmZzZXQ9MDtjb25zdCBsb3dlckNhc2VUZXh0PXRleHQudG9Mb3dlckNhc2UoKTt3aGlsZSh0cnVlKXt0b2tlbml6ZXIodGV4dC5zdWJzdHJpbmcobGFzdE9mZnNldCkscHJvY2Vzc1Rva2VuLmJpbmQodGhpcyxsYXN0T2Zmc2V0KSk7aWYobGFzdE9mZnNldD49dGV4dC5sZW5ndGgpCmJyZWFrO2NvbnN0IGVsZW1lbnQ9dGhpcy5fc3RhY2sucGVla0xhc3QoKTtsYXN0T2Zmc2V0PWxvd2VyQ2FzZVRleHQuaW5kZXhPZignPC8nK2VsZW1lbnQubmFtZSxsYXN0T2Zmc2V0KTtpZihsYXN0T2Zmc2V0PT09LTEpCmxhc3RPZmZzZXQ9dGV4dC5sZW5ndGg7Y29uc3QgdG9rZW5TdGFydD1lbGVtZW50Lm9wZW5UYWcuZW5kT2Zmc2V0O2NvbnN0IHRva2VuRW5kPWxhc3RPZmZzZXQ7Y29uc3QgdG9rZW5WYWx1ZT10ZXh0LnN1YnN0cmluZyh0b2tlblN0YXJ0LHRva2VuRW5kKTt0aGlzLl90b2tlbnMucHVzaChuZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5Ub2tlbih0b2tlblZhbHVlLG5ldyBTZXQoKSx0b2tlblN0YXJ0LHRva2VuRW5kKSk7fQp3aGlsZSh0aGlzLl9zdGFjay5sZW5ndGg+MSl7Y29uc3QgZWxlbWVudD10aGlzLl9zdGFjay5wZWVrTGFzdCgpO3RoaXMuX3BvcEVsZW1lbnQobmV3IEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuVGFnKGVsZW1lbnQubmFtZSx0ZXh0Lmxlbmd0aCx0ZXh0Lmxlbmd0aCxuZXcgTWFwKCksZmFsc2UsZmFsc2UpKTt9CmZ1bmN0aW9uIHByb2Nlc3NUb2tlbihiYXNlT2Zmc2V0LHRva2VuVmFsdWUsdHlwZSx0b2tlblN0YXJ0LHRva2VuRW5kKXt0b2tlblN0YXJ0Kz1iYXNlT2Zmc2V0O3Rva2VuRW5kKz1iYXNlT2Zmc2V0O2xhc3RPZmZzZXQ9dG9rZW5FbmQ7Y29uc3QgdG9rZW5UeXBlPXR5cGU/bmV3IFNldCh0eXBlLnNwbGl0KCcgJykpOm5ldyBTZXQoKTtjb25zdCB0b2tlbj1uZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5Ub2tlbih0b2tlblZhbHVlLHRva2VuVHlwZSx0b2tlblN0YXJ0LHRva2VuRW5kKTt0aGlzLl90b2tlbnMucHVzaCh0b2tlbik7dGhpcy5fdXBkYXRlRE9NKHRva2VuKTtjb25zdCBlbGVtZW50PXRoaXMuX3N0YWNrLnBlZWtMYXN0KCk7aWYoZWxlbWVudCYmKGVsZW1lbnQubmFtZT09PSdzY3JpcHQnfHxlbGVtZW50Lm5hbWU9PT0nc3R5bGUnKSYmZWxlbWVudC5vcGVuVGFnLmVuZE9mZnNldD09PWxhc3RPZmZzZXQpCnJldHVybiBGb3JtYXR0ZXJXb3JrZXIuQWJvcnRUb2tlbml6YXRpb247fX0KX3VwZGF0ZURPTSh0b2tlbil7Y29uc3QgUz1Gb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLlBhcnNlU3RhdGU7Y29uc3QgdmFsdWU9dG9rZW4udmFsdWU7Y29uc3QgdHlwZT10b2tlbi50eXBlO3N3aXRjaCh0aGlzLl9zdGF0ZSl7Y2FzZSBTLkluaXRpYWw6aWYodHlwZS5oYXMoJ2JyYWNrZXQnKSYmKHZhbHVlPT09JzwnfHx2YWx1ZT09PSc8LycpKXt0aGlzLl9vblN0YXJ0VGFnKHRva2VuKTt0aGlzLl9zdGF0ZT1TLlRhZzt9CnJldHVybjtjYXNlIFMuVGFnOmlmKHR5cGUuaGFzKCd0YWcnKSYmIXR5cGUuaGFzKCdicmFja2V0Jykpe3RoaXMuX3RhZ05hbWU9dmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7fWVsc2UgaWYodHlwZS5oYXMoJ2F0dHJpYnV0ZScpKXt0aGlzLl9hdHRyaWJ1dGVOYW1lPXZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHRoaXMuX2F0dHJpYnV0ZU5hbWUsJycpO3RoaXMuX3N0YXRlPVMuQXR0cmlidXRlTmFtZTt9ZWxzZSBpZih0eXBlLmhhcygnYnJhY2tldCcpJiYodmFsdWU9PT0nPid8fHZhbHVlPT09Jy8+Jykpe3RoaXMuX29uRW5kVGFnKHRva2VuKTt0aGlzLl9zdGF0ZT1TLkluaXRpYWw7fQpyZXR1cm47Y2FzZSBTLkF0dHJpYnV0ZU5hbWU6aWYoIXR5cGUuc2l6ZSYmdmFsdWU9PT0nPScpe3RoaXMuX3N0YXRlPVMuQXR0cmlidXRlVmFsdWU7fWVsc2UgaWYodHlwZS5oYXMoJ2JyYWNrZXQnKSYmKHZhbHVlPT09Jz4nfHx2YWx1ZT09PScvPicpKXt0aGlzLl9vbkVuZFRhZyh0b2tlbik7dGhpcy5fc3RhdGU9Uy5Jbml0aWFsO30KcmV0dXJuO2Nhc2UgUy5BdHRyaWJ1dGVWYWx1ZTppZih0eXBlLmhhcygnc3RyaW5nJykpe3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHRoaXMuX2F0dHJpYnV0ZU5hbWUsdmFsdWUpO3RoaXMuX3N0YXRlPVMuVGFnO31lbHNlIGlmKHR5cGUuaGFzKCdicmFja2V0JykmJih2YWx1ZT09PSc+J3x8dmFsdWU9PT0nLz4nKSl7dGhpcy5fb25FbmRUYWcodG9rZW4pO3RoaXMuX3N0YXRlPVMuSW5pdGlhbDt9CnJldHVybjt9fQpfb25TdGFydFRhZyh0b2tlbil7dGhpcy5fdGFnTmFtZT0nJzt0aGlzLl90YWdTdGFydE9mZnNldD10b2tlbi5zdGFydE9mZnNldDt0aGlzLl90YWdFbmRPZmZzZXQ9bnVsbDt0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAoKTt0aGlzLl9hdHRyaWJ1dGVOYW1lPScnO3RoaXMuX2lzT3BlblRhZz10b2tlbi52YWx1ZT09PSc8Jzt9Cl9vbkVuZFRhZyh0b2tlbil7dGhpcy5fdGFnRW5kT2Zmc2V0PXRva2VuLmVuZE9mZnNldDtjb25zdCBzZWxmQ2xvc2luZ1RhZz10b2tlbi52YWx1ZT09PScvPid8fEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuU2VsZkNsb3NpbmdUYWdzLmhhcyh0aGlzLl90YWdOYW1lKTtjb25zdCB0YWc9bmV3IEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuVGFnKHRoaXMuX3RhZ05hbWUsdGhpcy5fdGFnU3RhcnRPZmZzZXQsdGhpcy5fdGFnRW5kT2Zmc2V0LHRoaXMuX2F0dHJpYnV0ZXMsdGhpcy5faXNPcGVuVGFnLHNlbGZDbG9zaW5nVGFnKTt0aGlzLl9vblRhZ0NvbXBsZXRlKHRhZyk7fQpfb25UYWdDb21wbGV0ZSh0YWcpe2lmKHRhZy5pc09wZW5UYWcpe2NvbnN0IHRvcEVsZW1lbnQ9dGhpcy5fc3RhY2sucGVla0xhc3QoKTtpZih0b3BFbGVtZW50IT09dGhpcy5fZG9jdW1lbnQmJnRvcEVsZW1lbnQub3BlblRhZy5zZWxmQ2xvc2luZ1RhZykKdGhpcy5fcG9wRWxlbWVudChhdXRvY2xvc2VUYWcodG9wRWxlbWVudCx0b3BFbGVtZW50Lm9wZW5UYWcuZW5kT2Zmc2V0KSk7ZWxzZSBpZigodG9wRWxlbWVudC5uYW1lIGluIEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuQXV0b0Nsb3NpbmdUYWdzKSYmRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5BdXRvQ2xvc2luZ1RhZ3NbdG9wRWxlbWVudC5uYW1lXS5oYXModGFnLm5hbWUpKQp0aGlzLl9wb3BFbGVtZW50KGF1dG9jbG9zZVRhZyh0b3BFbGVtZW50LHRhZy5zdGFydE9mZnNldCkpO3RoaXMuX3B1c2hFbGVtZW50KHRhZyk7cmV0dXJuO30Kd2hpbGUodGhpcy5fc3RhY2subGVuZ3RoPjEmJnRoaXMuX3N0YWNrLnBlZWtMYXN0KCkubmFtZSE9PXRhZy5uYW1lKQp0aGlzLl9wb3BFbGVtZW50KGF1dG9jbG9zZVRhZyh0aGlzLl9zdGFjay5wZWVrTGFzdCgpLHRhZy5zdGFydE9mZnNldCkpO2lmKHRoaXMuX3N0YWNrLmxlbmd0aD09PTEpCnJldHVybjt0aGlzLl9wb3BFbGVtZW50KHRhZyk7ZnVuY3Rpb24gYXV0b2Nsb3NlVGFnKGVsZW1lbnQsb2Zmc2V0KXtyZXR1cm4gbmV3IEZvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuVGFnKGVsZW1lbnQubmFtZSxvZmZzZXQsb2Zmc2V0LG5ldyBNYXAoKSxmYWxzZSxmYWxzZSk7fX0KX3BvcEVsZW1lbnQoY2xvc2VUYWcpe2NvbnN0IGVsZW1lbnQ9dGhpcy5fc3RhY2sucG9wKCk7ZWxlbWVudC5jbG9zZVRhZz1jbG9zZVRhZzt9Cl9wdXNoRWxlbWVudChvcGVuVGFnKXtjb25zdCB0b3BFbGVtZW50PXRoaXMuX3N0YWNrLnBlZWtMYXN0KCk7Y29uc3QgbmV3RWxlbWVudD1uZXcgRm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5FbGVtZW50KG9wZW5UYWcubmFtZSk7bmV3RWxlbWVudC5wYXJlbnQ9dG9wRWxlbWVudDt0b3BFbGVtZW50LmNoaWxkcmVuLnB1c2gobmV3RWxlbWVudCk7bmV3RWxlbWVudC5vcGVuVGFnPW9wZW5UYWc7dGhpcy5fc3RhY2sucHVzaChuZXdFbGVtZW50KTt9CnBlZWtUb2tlbigpe3JldHVybiB0aGlzLl90b2tlbkluZGV4PHRoaXMuX3Rva2Vucy5sZW5ndGg/dGhpcy5fdG9rZW5zW3RoaXMuX3Rva2VuSW5kZXhdOm51bGw7fQpuZXh0VG9rZW4oKXtyZXR1cm4gdGhpcy5fdG9rZW5zW3RoaXMuX3Rva2VuSW5kZXgrK107fQpkb2N1bWVudCgpe3JldHVybiB0aGlzLl9kb2N1bWVudDt9fTtGb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLlNlbGZDbG9zaW5nVGFncz1uZXcgU2V0KFsnYXJlYScsJ2Jhc2UnLCdicicsJ2NvbCcsJ2NvbW1hbmQnLCdlbWJlZCcsJ2hyJywnaW1nJywnaW5wdXQnLCdrZXlnZW4nLCdsaW5rJywnbWV0YScsJ3BhcmFtJywnc291cmNlJywndHJhY2snLCd3YnInXSk7Rm9ybWF0dGVyV29ya2VyLkhUTUxNb2RlbC5BdXRvQ2xvc2luZ1RhZ3M9eydoZWFkJzpuZXcgU2V0KFsnYm9keSddKSwnbGknOm5ldyBTZXQoWydsaSddKSwnZHQnOm5ldyBTZXQoWydkdCcsJ2RkJ10pLCdkZCc6bmV3IFNldChbJ2R0JywnZGQnXSksJ3AnOm5ldyBTZXQoWydhZGRyZXNzJywnYXJ0aWNsZScsJ2FzaWRlJywnYmxvY2txdW90ZScsJ2RpdicsJ2RsJywnZmllbGRzZXQnLCdmb290ZXInLCdmb3JtJywnaDEnLCdoMicsJ2gzJywnaDQnLCdoNScsJ2g2JywnaGVhZGVyJywnaGdyb3VwJywnaHInLCdtYWluJywnbmF2Jywnb2wnLCdwJywncHJlJywnc2VjdGlvbicsJ3RhYmxlJywndWwnXSksJ3JiJzpuZXcgU2V0KFsncmInLCdydCcsJ3J0YycsJ3JwJ10pLCdydCc6bmV3IFNldChbJ3JiJywncnQnLCdydGMnLCdycCddKSwncnRjJzpuZXcgU2V0KFsncmInLCdydGMnLCdycCddKSwncnAnOm5ldyBTZXQoWydyYicsJ3J0JywncnRjJywncnAnXSksJ29wdGdyb3VwJzpuZXcgU2V0KFsnb3B0Z3JvdXAnXSksJ29wdGlvbic6bmV3IFNldChbJ29wdGlvbicsJ29wdGdyb3VwJ10pLCdjb2xncm91cCc6bmV3IFNldChbJ2NvbGdyb3VwJ10pLCd0aGVhZCc6bmV3IFNldChbJ3Rib2R5JywndGZvb3QnXSksJ3Rib2R5JzpuZXcgU2V0KFsndGJvZHknLCd0Zm9vdCddKSwndGZvb3QnOm5ldyBTZXQoWyd0Ym9keSddKSwndHInOm5ldyBTZXQoWyd0ciddKSwndGQnOm5ldyBTZXQoWyd0ZCcsJ3RoJ10pLCd0aCc6bmV3IFNldChbJ3RkJywndGgnXSksfTtGb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLlBhcnNlU3RhdGU9e0luaXRpYWw6J0luaXRpYWwnLFRhZzonVGFnJyxBdHRyaWJ1dGVOYW1lOidBdHRyaWJ1dGVOYW1lJyxBdHRyaWJ1dGVWYWx1ZTonQXR0cmlidXRlVmFsdWUnfTtGb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLlRva2VuPWNsYXNze2NvbnN0cnVjdG9yKHZhbHVlLHR5cGUsc3RhcnRPZmZzZXQsZW5kT2Zmc2V0KXt0aGlzLnZhbHVlPXZhbHVlO3RoaXMudHlwZT10eXBlO3RoaXMuc3RhcnRPZmZzZXQ9c3RhcnRPZmZzZXQ7dGhpcy5lbmRPZmZzZXQ9ZW5kT2Zmc2V0O319O0Zvcm1hdHRlcldvcmtlci5IVE1MTW9kZWwuVGFnPWNsYXNze2NvbnN0cnVjdG9yKG5hbWUsc3RhcnRPZmZzZXQsZW5kT2Zmc2V0LGF0dHJpYnV0ZXMsaXNPcGVuVGFnLHNlbGZDbG9zaW5nVGFnKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnN0YXJ0T2Zmc2V0PXN0YXJ0T2Zmc2V0O3RoaXMuZW5kT2Zmc2V0PWVuZE9mZnNldDt0aGlzLmF0dHJpYnV0ZXM9YXR0cmlidXRlczt0aGlzLmlzT3BlblRhZz1pc09wZW5UYWc7dGhpcy5zZWxmQ2xvc2luZ1RhZz1zZWxmQ2xvc2luZ1RhZzt9fTtGb3JtYXR0ZXJXb3JrZXIuSFRNTE1vZGVsLkVsZW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSl7dGhpcy5uYW1lPW5hbWU7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnBhcmVudD1udWxsO3RoaXMub3BlblRhZz1udWxsO3RoaXMuY2xvc2VUYWc9bnVsbDt9fTs7Rm9ybWF0dGVyV29ya2VyLklkZW50aXR5Rm9ybWF0dGVyPWNsYXNze2NvbnN0cnVjdG9yKGJ1aWxkZXIpe3RoaXMuX2J1aWxkZXI9YnVpbGRlcjt9CmZvcm1hdCh0ZXh0LGxpbmVFbmRpbmdzLGZyb21PZmZzZXQsdG9PZmZzZXQpe2NvbnN0IGNvbnRlbnQ9dGV4dC5zdWJzdHJpbmcoZnJvbU9mZnNldCx0b09mZnNldCk7dGhpcy5fYnVpbGRlci5hZGRUb2tlbihjb250ZW50LGZyb21PZmZzZXQpO319OztGb3JtYXR0ZXJXb3JrZXIuamF2YVNjcmlwdE91dGxpbmU9ZnVuY3Rpb24oY29udGVudCl7Y29uc3QgY2h1bmtTaXplPTEwMDAwMDtsZXQgb3V0bGluZUNodW5rPVtdO2xldCBsYXN0UmVwb3J0ZWRPZmZzZXQ9MDtsZXQgYXN0O3RyeXthc3Q9YWNvcm4ucGFyc2UoY29udGVudCx7cmFuZ2VzOmZhbHNlLGVjbWFWZXJzaW9uOjh9KTt9Y2F0Y2goZSl7YXN0PWFjb3JuLnBhcnNlX2RhbW1pdChjb250ZW50LHtyYW5nZXM6ZmFsc2UsZWNtYVZlcnNpb246OH0pO30KY29uc3QgdGV4dEN1cnNvcj1uZXcgVGV4dFV0aWxzLlRleHRDdXJzb3IoY29udGVudC5jb21wdXRlTGluZUVuZGluZ3MoKSk7Y29uc3Qgd2Fsa2VyPW5ldyBGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyKGJlZm9yZVZpc2l0KTt3YWxrZXIud2Fsayhhc3QpO3Bvc3RNZXNzYWdlKHtjaHVuazpvdXRsaW5lQ2h1bmssaXNMYXN0Q2h1bms6dHJ1ZX0pO2Z1bmN0aW9uIGJlZm9yZVZpc2l0KG5vZGUpe2lmKG5vZGUudHlwZT09PSdDbGFzc0RlY2xhcmF0aW9uJyl7cmVwb3J0Q2xhc3MoKG5vZGUuaWQpKTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nVmFyaWFibGVEZWNsYXJhdG9yJyYmaXNDbGFzc05vZGUobm9kZS5pbml0KSl7cmVwb3J0Q2xhc3MoKG5vZGUuaWQpKTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nQXNzaWdubWVudEV4cHJlc3Npb24nJiZpc05hbWVOb2RlKG5vZGUubGVmdCkmJmlzQ2xhc3NOb2RlKG5vZGUucmlnaHQpKXtyZXBvcnRDbGFzcygobm9kZS5sZWZ0KSk7fWVsc2UgaWYobm9kZS50eXBlPT09J1Byb3BlcnR5JyYmaXNOYW1lTm9kZShub2RlLmtleSkmJmlzQ2xhc3NOb2RlKG5vZGUudmFsdWUpKXtyZXBvcnRDbGFzcygobm9kZS5rZXkpKTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nRnVuY3Rpb25EZWNsYXJhdGlvbicpe3JlcG9ydEZ1bmN0aW9uKChub2RlLmlkKSxub2RlKTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nVmFyaWFibGVEZWNsYXJhdG9yJyYmaXNGdW5jdGlvbk5vZGUobm9kZS5pbml0KSl7cmVwb3J0RnVuY3Rpb24oKG5vZGUuaWQpLChub2RlLmluaXQpKTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nQXNzaWdubWVudEV4cHJlc3Npb24nJiZpc05hbWVOb2RlKG5vZGUubGVmdCkmJmlzRnVuY3Rpb25Ob2RlKG5vZGUucmlnaHQpKXtyZXBvcnRGdW5jdGlvbigobm9kZS5sZWZ0KSwobm9kZS5yaWdodCkpO31lbHNlIGlmKChub2RlLnR5cGU9PT0nTWV0aG9kRGVmaW5pdGlvbid8fG5vZGUudHlwZT09PSdQcm9wZXJ0eScpJiZpc05hbWVOb2RlKG5vZGUua2V5KSYmaXNGdW5jdGlvbk5vZGUobm9kZS52YWx1ZSkpe2NvbnN0IG5hbWVQcmVmaXg9W107aWYobm9kZS5raW5kPT09J2dldCd8fG5vZGUua2luZD09PSdzZXQnKQpuYW1lUHJlZml4LnB1c2gobm9kZS5raW5kKTtpZihub2RlLnN0YXRpYykKbmFtZVByZWZpeC5wdXNoKCdzdGF0aWMnKTtyZXBvcnRGdW5jdGlvbihub2RlLmtleSxub2RlLnZhbHVlLG5hbWVQcmVmaXguam9pbignICcpKTt9fQpmdW5jdGlvbiByZXBvcnRDbGFzcyhuYW1lTm9kZSl7Y29uc3QgbmFtZT0nY2xhc3MgJytzdHJpbmdpZnlOYW1lTm9kZShuYW1lTm9kZSk7dGV4dEN1cnNvci5hZHZhbmNlKG5hbWVOb2RlLnN0YXJ0KTthZGRPdXRsaW5lSXRlbSh7bmFtZTpuYW1lLGxpbmU6dGV4dEN1cnNvci5saW5lTnVtYmVyKCksY29sdW1uOnRleHRDdXJzb3IuY29sdW1uTnVtYmVyKCksfSk7fQpmdW5jdGlvbiByZXBvcnRGdW5jdGlvbihuYW1lTm9kZSxmdW5jdGlvbk5vZGUsbmFtZVByZWZpeCl7bGV0IG5hbWU9c3RyaW5naWZ5TmFtZU5vZGUobmFtZU5vZGUpO2lmKGZ1bmN0aW9uTm9kZS5nZW5lcmF0b3IpCm5hbWU9JyonK25hbWU7aWYobmFtZVByZWZpeCkKbmFtZT1uYW1lUHJlZml4KycgJytuYW1lO2lmKGZ1bmN0aW9uTm9kZS5hc3luYykKbmFtZT0nYXN5bmMgJytuYW1lO3RleHRDdXJzb3IuYWR2YW5jZShuYW1lTm9kZS5zdGFydCk7YWRkT3V0bGluZUl0ZW0oe25hbWU6bmFtZSxsaW5lOnRleHRDdXJzb3IubGluZU51bWJlcigpLGNvbHVtbjp0ZXh0Q3Vyc29yLmNvbHVtbk51bWJlcigpLGFyZ3VtZW50czpzdHJpbmdpZnlBcmd1bWVudHMoKGZ1bmN0aW9uTm9kZS5wYXJhbXMpKX0pO30KZnVuY3Rpb24gaXNOYW1lTm9kZShub2RlKXtpZighbm9kZSkKcmV0dXJuIGZhbHNlO2lmKG5vZGUudHlwZT09PSdNZW1iZXJFeHByZXNzaW9uJykKcmV0dXJuIW5vZGUuY29tcHV0ZWQmJm5vZGUucHJvcGVydHkudHlwZT09PSdJZGVudGlmaWVyJztyZXR1cm4gbm9kZS50eXBlPT09J0lkZW50aWZpZXInO30KZnVuY3Rpb24gaXNGdW5jdGlvbk5vZGUobm9kZSl7aWYoIW5vZGUpCnJldHVybiBmYWxzZTtyZXR1cm4gbm9kZS50eXBlPT09J0Z1bmN0aW9uRXhwcmVzc2lvbid8fG5vZGUudHlwZT09PSdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic7fQpmdW5jdGlvbiBpc0NsYXNzTm9kZShub2RlKXtyZXR1cm4hIW5vZGUmJm5vZGUudHlwZT09PSdDbGFzc0V4cHJlc3Npb24nO30KZnVuY3Rpb24gc3RyaW5naWZ5TmFtZU5vZGUobm9kZSl7aWYobm9kZS50eXBlPT09J01lbWJlckV4cHJlc3Npb24nKQpub2RlPShub2RlLnByb3BlcnR5KTtjb25zb2xlLmFzc2VydChub2RlLnR5cGU9PT0nSWRlbnRpZmllcicsJ0Nhbm5vdCBleHRyYWN0IGlkZW50aWZpZXIgZnJvbSB1bmtub3duIHR5cGU6ICcrbm9kZS50eXBlKTtyZXR1cm4obm9kZS5uYW1lKTt9CmZ1bmN0aW9uIHN0cmluZ2lmeUFyZ3VtZW50cyhwYXJhbXMpe2NvbnN0IHJlc3VsdD1bXTtmb3IoY29uc3QgcGFyYW0gb2YgcGFyYW1zKXtpZihwYXJhbS50eXBlPT09J0lkZW50aWZpZXInKQpyZXN1bHQucHVzaChwYXJhbS5uYW1lKTtlbHNlIGlmKHBhcmFtLnR5cGU9PT0nUmVzdEVsZW1lbnQnJiZwYXJhbS5hcmd1bWVudC50eXBlPT09J0lkZW50aWZpZXInKQpyZXN1bHQucHVzaCgnLi4uJytwYXJhbS5hcmd1bWVudC5uYW1lKTtlbHNlCmNvbnNvbGUuZXJyb3IoJ0Vycm9yOiB1bmV4cGVjdGVkIGZ1bmN0aW9uIHBhcmFtZXRlciB0eXBlOiAnK3BhcmFtLnR5cGUpO30KcmV0dXJuJygnK3Jlc3VsdC5qb2luKCcsICcpKycpJzt9CmZ1bmN0aW9uIGFkZE91dGxpbmVJdGVtKGl0ZW0pe291dGxpbmVDaHVuay5wdXNoKGl0ZW0pO2lmKHRleHRDdXJzb3Iub2Zmc2V0KCktbGFzdFJlcG9ydGVkT2Zmc2V0PGNodW5rU2l6ZSkKcmV0dXJuO3Bvc3RNZXNzYWdlKHtjaHVuazpvdXRsaW5lQ2h1bmssaXNMYXN0Q2h1bms6ZmFsc2V9KTtvdXRsaW5lQ2h1bms9W107bGFzdFJlcG9ydGVkT2Zmc2V0PXRleHRDdXJzb3Iub2Zmc2V0KCk7fX07O0Zvcm1hdHRlcldvcmtlci5SZWxheGVkSlNPTlBhcnNlcj17fTtGb3JtYXR0ZXJXb3JrZXIuUmVsYXhlZEpTT05QYXJzZXIuU3RhdGVzPXtFeHBlY3RLZXk6J0V4cGVjdEtleScsRXhwZWN0VmFsdWU6J0V4cGVjdFZhbHVlJ307Rm9ybWF0dGVyV29ya2VyLlJlbGF4ZWRKU09OUGFyc2VyLktleXdvcmRzPXsnTmFOJzpOYU4sJ3RydWUnOnRydWUsJ2ZhbHNlJzpmYWxzZSwnSW5maW5pdHknOkluZmluaXR5LCd1bmRlZmluZWQnOnVuZGVmaW5lZCwnbnVsbCc6bnVsbH07Rm9ybWF0dGVyV29ya2VyLlJlbGF4ZWRKU09OUGFyc2VyLnBhcnNlPWZ1bmN0aW9uKGNvbnRlbnQpe2NvbnN0IEtleXdvcmRzPUZvcm1hdHRlcldvcmtlci5SZWxheGVkSlNPTlBhcnNlci5LZXl3b3Jkcztjb25zdCBTdGF0ZXM9Rm9ybWF0dGVyV29ya2VyLlJlbGF4ZWRKU09OUGFyc2VyLlN0YXRlcztjb250ZW50PScoJytjb250ZW50KycpJztsZXQgcm9vdDt0cnl7cm9vdD1hY29ybi5wYXJzZShjb250ZW50LHt9KTt9Y2F0Y2goZSl7cmV0dXJuIG51bGw7fQpjb25zdCB3YWxrZXI9bmV3IEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIoYmVmb3JlVmlzaXQsYWZ0ZXJWaXNpdCk7Y29uc3Qgcm9vdFRpcD1bXTtjb25zdCBzdGFjaz1bXTtsZXQgc3RhY2tEYXRhPSh7a2V5OjAsdGlwOnJvb3RUaXAsc3RhdGU6U3RhdGVzLkV4cGVjdFZhbHVlLHBhcmVudElzQXJyYXk6dHJ1ZX0pO3dhbGtlci5zZXRXYWxrTnVsbHModHJ1ZSk7bGV0IGhhc0V4cHJlc3Npb249ZmFsc2U7d2Fsa2VyLndhbGsocm9vdCk7aWYoaGFzRXhwcmVzc2lvbikKcmV0dXJuIG51bGw7cmV0dXJuIHJvb3RUaXAubGVuZ3RoP3Jvb3RUaXBbMF06bnVsbDtmdW5jdGlvbiBwdXNoU3RhY2sobmV3U3RhY2spe3N0YWNrLnB1c2goc3RhY2tEYXRhKTtzdGFja0RhdGE9bmV3U3RhY2s7fQpmdW5jdGlvbiBwb3BTdGFjaygpe3N0YWNrRGF0YT1zdGFjay5wb3AoKTt9CmZ1bmN0aW9uIGFwcGx5VmFsdWUodmFsdWUpe3N0YWNrRGF0YS50aXBbc3RhY2tEYXRhLmtleV09dmFsdWU7aWYoc3RhY2tEYXRhLnBhcmVudElzQXJyYXkpCnN0YWNrRGF0YS5rZXkrKztlbHNlCnN0YWNrRGF0YS5zdGF0ZT1udWxsO30KZnVuY3Rpb24gYmVmb3JlVmlzaXQobm9kZSl7c3dpdGNoKG5vZGUudHlwZSl7Y2FzZSdPYmplY3RFeHByZXNzaW9uJzp7Y29uc3QgbmV3VGlwPXt9O2FwcGx5VmFsdWUobmV3VGlwKTtwdXNoU3RhY2soKHtrZXk6bnVsbCx0aXA6bmV3VGlwLHN0YXRlOm51bGwscGFyZW50SXNBcnJheTpmYWxzZX0pKTticmVhazt9CmNhc2UnQXJyYXlFeHByZXNzaW9uJzp7Y29uc3QgbmV3VGlwPVtdO2FwcGx5VmFsdWUobmV3VGlwKTtwdXNoU3RhY2soKHtrZXk6MCx0aXA6bmV3VGlwLHN0YXRlOlN0YXRlcy5FeHBlY3RWYWx1ZSxwYXJlbnRJc0FycmF5OnRydWV9KSk7YnJlYWs7fQpjYXNlJ1Byb3BlcnR5JzpzdGFja0RhdGEuc3RhdGU9U3RhdGVzLkV4cGVjdEtleTticmVhaztjYXNlJ0xpdGVyYWwnOmlmKHN0YWNrRGF0YS5zdGF0ZT09PVN0YXRlcy5FeHBlY3RLZXkpe3N0YWNrRGF0YS5rZXk9bm9kZS52YWx1ZTtzdGFja0RhdGEuc3RhdGU9U3RhdGVzLkV4cGVjdFZhbHVlO31lbHNlIGlmKHN0YWNrRGF0YS5zdGF0ZT09PVN0YXRlcy5FeHBlY3RWYWx1ZSl7YXBwbHlWYWx1ZShleHRyYWN0VmFsdWUobm9kZSkpO3JldHVybiBGb3JtYXR0ZXJXb3JrZXIuRVNUcmVlV2Fsa2VyLlNraXBTdWJ0cmVlO30KYnJlYWs7Y2FzZSdJZGVudGlmaWVyJzppZihzdGFja0RhdGEuc3RhdGU9PT1TdGF0ZXMuRXhwZWN0S2V5KXtzdGFja0RhdGEua2V5PShub2RlLm5hbWUpO3N0YWNrRGF0YS5zdGF0ZT1TdGF0ZXMuRXhwZWN0VmFsdWU7fWVsc2UgaWYoc3RhY2tEYXRhLnN0YXRlPT09U3RhdGVzLkV4cGVjdFZhbHVlKXthcHBseVZhbHVlKGV4dHJhY3RWYWx1ZShub2RlKSk7cmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fQpicmVhaztjYXNlJ1VuYXJ5RXhwcmVzc2lvbic6aWYoc3RhY2tEYXRhLnN0YXRlPT09U3RhdGVzLkV4cGVjdFZhbHVlKXthcHBseVZhbHVlKGV4dHJhY3RWYWx1ZShub2RlKSk7cmV0dXJuIEZvcm1hdHRlcldvcmtlci5FU1RyZWVXYWxrZXIuU2tpcFN1YnRyZWU7fQpicmVhaztjYXNlJ1Byb2dyYW0nOmNhc2UnRXhwcmVzc2lvblN0YXRlbWVudCc6YnJlYWs7ZGVmYXVsdDppZihzdGFja0RhdGEuc3RhdGU9PT1TdGF0ZXMuRXhwZWN0VmFsdWUpCmFwcGx5VmFsdWUoZXh0cmFjdFZhbHVlKG5vZGUpKTtyZXR1cm4gRm9ybWF0dGVyV29ya2VyLkVTVHJlZVdhbGtlci5Ta2lwU3VidHJlZTt9fQpmdW5jdGlvbiBhZnRlclZpc2l0KG5vZGUpe2lmKG5vZGUudHlwZT09PSdPYmplY3RFeHByZXNzaW9uJ3x8bm9kZS50eXBlPT09J0FycmF5RXhwcmVzc2lvbicpCnBvcFN0YWNrKCk7fQpmdW5jdGlvbiBleHRyYWN0VmFsdWUobm9kZSl7bGV0IGlzTmVnYXRpdmU9ZmFsc2U7Y29uc3Qgb3JpZ2luYWxOb2RlPW5vZGU7bGV0IHZhbHVlO2lmKG5vZGUudHlwZT09PSdVbmFyeUV4cHJlc3Npb24nJiYobm9kZS5vcGVyYXRvcj09PSctJ3x8bm9kZS5vcGVyYXRvcj09PScrJykpe2lmKG5vZGUub3BlcmF0b3I9PT0nLScpCmlzTmVnYXRpdmU9dHJ1ZTtub2RlPShub2RlLmFyZ3VtZW50KTt9CmlmKG5vZGUudHlwZT09PSdMaXRlcmFsJyl7dmFsdWU9bm9kZS52YWx1ZTt9ZWxzZSBpZihub2RlLnR5cGU9PT0nSWRlbnRpZmllcicmJktleXdvcmRzLmhhc093blByb3BlcnR5KG5vZGUubmFtZSkpe3ZhbHVlPUtleXdvcmRzW25vZGUubmFtZV07fWVsc2V7aGFzRXhwcmVzc2lvbj10cnVlO3JldHVybiBjb250ZW50LnN1YnN0cmluZyhvcmlnaW5hbE5vZGUuc3RhcnQsb3JpZ2luYWxOb2RlLmVuZCk7fQppZihpc05lZ2F0aXZlKXtpZih0eXBlb2YgdmFsdWUhPT0nbnVtYmVyJyl7aGFzRXhwcmVzc2lvbj10cnVlO3JldHVybiBjb250ZW50LnN1YnN0cmluZyhvcmlnaW5hbE5vZGUuc3RhcnQsb3JpZ2luYWxOb2RlLmVuZCk7fQp2YWx1ZT0tKHZhbHVlKTt9CnJldHVybiB2YWx1ZTt9fTtGb3JtYXR0ZXJXb3JrZXIuUmVsYXhlZEpTT05QYXJzZXIuQ29udGV4dDs7OztpZighc2VsZi5SdW50aW1lKQpzZWxmLmltcG9ydFNjcmlwdHMoJ1J1bnRpbWUuanMnKTtSdW50aW1lLnN0YXJ0V29ya2VyKCdmb3JtYXR0ZXJfd29ya2VyJyk7Y29uc3QgYWxsRGVzY3JpcHRvcnM9W107bGV0IGFwcGxpY2F0aW9uRGVzY3JpcHRvcjtjb25zdCBfbG9hZGVkU2NyaXB0cz17fTtmb3IoY29uc3QgayBvZltdKXt9CihmdW5jdGlvbigpe2NvbnN0IGJhc2VVcmw9c2VsZi5sb2NhdGlvbj9zZWxmLmxvY2F0aW9uLm9yaWdpbitzZWxmLmxvY2F0aW9uLnBhdGhuYW1lOicnO3NlbGYuX2ltcG9ydFNjcmlwdFBhdGhQcmVmaXg9YmFzZVVybC5zdWJzdHJpbmcoMCxiYXNlVXJsLmxhc3RJbmRleE9mKCcvJykrMSk7fSkoKTtjb25zdCBSRU1PVEVfTU9EVUxFX0ZBTExCQUNLX1JFVklTSU9OPSdAMDEwZGRjZmRhMjQ2OTc1ZDE5NDk2NGNjZjIwMDM4ZWJiZGVjNjA4NCc7dmFyIFJ1bnRpbWU9Y2xhc3N7Y29uc3RydWN0b3IoZGVzY3JpcHRvcnMpe3RoaXMuX21vZHVsZXM9W107dGhpcy5fbW9kdWxlc01hcD17fTt0aGlzLl9leHRlbnNpb25zPVtdO3RoaXMuX2NhY2hlZFR5cGVDbGFzc2VzPXt9O3RoaXMuX2Rlc2NyaXB0b3JzTWFwPXt9O2ZvcihsZXQgaT0wO2k8ZGVzY3JpcHRvcnMubGVuZ3RoOysraSkKdGhpcy5fcmVnaXN0ZXJNb2R1bGUoZGVzY3JpcHRvcnNbaV0pO1J1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2VDYWxsYmFjaygpO30Kc3RhdGljIGxvYWRSZXNvdXJjZVByb21pc2UodXJsKXtyZXR1cm4gbmV3IFByb21pc2UobG9hZCk7ZnVuY3Rpb24gbG9hZChmdWxmaWxsLHJlamVjdCl7Y29uc3QgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdCgpO3hoci5vcGVuKCdHRVQnLHVybCx0cnVlKTt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW9ucmVhZHlzdGF0ZWNoYW5nZTtmdW5jdGlvbiBvbnJlYWR5c3RhdGVjaGFuZ2UoZSl7aWYoeGhyLnJlYWR5U3RhdGUhPT1YTUxIdHRwUmVxdWVzdC5ET05FKQpyZXR1cm47Y29uc3Qgc3RhdHVzPS9eSFRUUFwvMS4xIDQwNC8udGVzdChlLnRhcmdldC5yZXNwb25zZSk/NDA0Onhoci5zdGF0dXM7aWYoWzAsMjAwLDMwNF0uaW5kZXhPZihzdGF0dXMpPT09LTEpCnJlamVjdChuZXcgRXJyb3IoJ1doaWxlIGxvYWRpbmcgZnJvbSB1cmwgJyt1cmwrJyBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSBzdGF0dXMgb2YgJytzdGF0dXMpKTtlbHNlCmZ1bGZpbGwoZS50YXJnZXQucmVzcG9uc2UpO30KeGhyLnNlbmQobnVsbCk7fX0Kc3RhdGljIGxvYWRSZXNvdXJjZVByb21pc2VXaXRoRmFsbGJhY2sodXJsKXtyZXR1cm4gUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHVybCkuY2F0Y2goZXJyPT57Y29uc3QgdXJsV2l0aEZhbGxiYWNrVmVyc2lvbj11cmwucmVwbGFjZSgvQFswLTlhLWZdezQwfS8sUkVNT1RFX01PRFVMRV9GQUxMQkFDS19SRVZJU0lPTik7aWYodXJsV2l0aEZhbGxiYWNrVmVyc2lvbj09PXVybHx8IXVybC5pbmNsdWRlcygnYXVkaXRzMl93b3JrZXJfbW9kdWxlJykpCnRocm93IGVycjtyZXR1cm4gUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHVybFdpdGhGYWxsYmFja1ZlcnNpb24pO30pO30Kc3RhdGljIG5vcm1hbGl6ZVBhdGgocGF0aCl7aWYocGF0aC5pbmRleE9mKCcuLicpPT09LTEmJnBhdGguaW5kZXhPZignLicpPT09LTEpCnJldHVybiBwYXRoO2NvbnN0IG5vcm1hbGl6ZWRTZWdtZW50cz1bXTtjb25zdCBzZWdtZW50cz1wYXRoLnNwbGl0KCcvJyk7Zm9yKGxldCBpPTA7aTxzZWdtZW50cy5sZW5ndGg7aSsrKXtjb25zdCBzZWdtZW50PXNlZ21lbnRzW2ldO2lmKHNlZ21lbnQ9PT0nLicpCmNvbnRpbnVlO2Vsc2UgaWYoc2VnbWVudD09PScuLicpCm5vcm1hbGl6ZWRTZWdtZW50cy5wb3AoKTtlbHNlIGlmKHNlZ21lbnQpCm5vcm1hbGl6ZWRTZWdtZW50cy5wdXNoKHNlZ21lbnQpO30KbGV0IG5vcm1hbGl6ZWRQYXRoPW5vcm1hbGl6ZWRTZWdtZW50cy5qb2luKCcvJyk7aWYobm9ybWFsaXplZFBhdGhbbm9ybWFsaXplZFBhdGgubGVuZ3RoLTFdPT09Jy8nKQpyZXR1cm4gbm9ybWFsaXplZFBhdGg7aWYocGF0aFswXT09PScvJyYmbm9ybWFsaXplZFBhdGgpCm5vcm1hbGl6ZWRQYXRoPScvJytub3JtYWxpemVkUGF0aDtpZigocGF0aFtwYXRoLmxlbmd0aC0xXT09PScvJyl8fChzZWdtZW50c1tzZWdtZW50cy5sZW5ndGgtMV09PT0nLicpfHwoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdPT09Jy4uJykpCm5vcm1hbGl6ZWRQYXRoPW5vcm1hbGl6ZWRQYXRoKycvJztyZXR1cm4gbm9ybWFsaXplZFBhdGg7fQpzdGF0aWMgX2xvYWRTY3JpcHRzUHJvbWlzZShzY3JpcHROYW1lcyxiYXNlKXtjb25zdCBwcm9taXNlcz1bXTtjb25zdCB1cmxzPVtdO2NvbnN0IHNvdXJjZXM9bmV3IEFycmF5KHNjcmlwdE5hbWVzLmxlbmd0aCk7bGV0IHNjcmlwdFRvRXZhbD0wO2ZvcihsZXQgaT0wO2k8c2NyaXB0TmFtZXMubGVuZ3RoOysraSl7Y29uc3Qgc2NyaXB0TmFtZT1zY3JpcHROYW1lc1tpXTtsZXQgc291cmNlVVJMPShiYXNlfHxzZWxmLl9pbXBvcnRTY3JpcHRQYXRoUHJlZml4KStzY3JpcHROYW1lO2NvbnN0IHNjaGVtYUluZGV4PXNvdXJjZVVSTC5pbmRleE9mKCc6Ly8nKSszO2xldCBwYXRoSW5kZXg9c291cmNlVVJMLmluZGV4T2YoJy8nLHNjaGVtYUluZGV4KTtpZihwYXRoSW5kZXg9PT0tMSkKcGF0aEluZGV4PXNvdXJjZVVSTC5sZW5ndGg7c291cmNlVVJMPXNvdXJjZVVSTC5zdWJzdHJpbmcoMCxwYXRoSW5kZXgpK1J1bnRpbWUubm9ybWFsaXplUGF0aChzb3VyY2VVUkwuc3Vic3RyaW5nKHBhdGhJbmRleCkpO2lmKF9sb2FkZWRTY3JpcHRzW3NvdXJjZVVSTF0pCmNvbnRpbnVlO3VybHMucHVzaChzb3VyY2VVUkwpO2NvbnN0IGxvYWRSZXNvdXJjZVByb21pc2U9YmFzZT9SdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2VXaXRoRmFsbGJhY2soc291cmNlVVJMKTpSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2Uoc291cmNlVVJMKTtwcm9taXNlcy5wdXNoKGxvYWRSZXNvdXJjZVByb21pc2UudGhlbihzY3JpcHRTb3VyY2VMb2FkZWQuYmluZChudWxsLGkpLHNjcmlwdFNvdXJjZUxvYWRlZC5iaW5kKG51bGwsaSx1bmRlZmluZWQpKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odW5kZWZpbmVkKTtmdW5jdGlvbiBzY3JpcHRTb3VyY2VMb2FkZWQoc2NyaXB0TnVtYmVyLHNjcmlwdFNvdXJjZSl7c291cmNlc1tzY3JpcHROdW1iZXJdPXNjcmlwdFNvdXJjZXx8Jyc7d2hpbGUodHlwZW9mIHNvdXJjZXNbc2NyaXB0VG9FdmFsXSE9PSd1bmRlZmluZWQnKXtldmFsdWF0ZVNjcmlwdCh1cmxzW3NjcmlwdFRvRXZhbF0sc291cmNlc1tzY3JpcHRUb0V2YWxdKTsrK3NjcmlwdFRvRXZhbDt9fQpmdW5jdGlvbiBldmFsdWF0ZVNjcmlwdChzb3VyY2VVUkwsc2NyaXB0U291cmNlKXtfbG9hZGVkU2NyaXB0c1tzb3VyY2VVUkxdPXRydWU7aWYoIXNjcmlwdFNvdXJjZSl7Y29uc29sZS5lcnJvcignRW1wdHkgcmVzcG9uc2UgYXJyaXZlZCBmb3Igc2NyaXB0IFwnJytzb3VyY2VVUkwrJ1wnJyk7cmV0dXJuO30Kc2VsZi5ldmFsKHNjcmlwdFNvdXJjZSsnXG4vLyMgc291cmNlVVJMPScrc291cmNlVVJMKTt9fQpzdGF0aWMgX2xvYWRSZXNvdXJjZUludG9DYWNoZSh1cmwsYXBwZW5kU291cmNlVVJMKXtyZXR1cm4gUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHVybCkudGhlbihjYWNoZVJlc291cmNlLmJpbmQodGhpcyx1cmwpLGNhY2hlUmVzb3VyY2UuYmluZCh0aGlzLHVybCx1bmRlZmluZWQpKTtmdW5jdGlvbiBjYWNoZVJlc291cmNlKHBhdGgsY29udGVudCl7aWYoIWNvbnRlbnQpe2NvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHJlc291cmNlOiAnK3BhdGgpO3JldHVybjt9CmNvbnN0IHNvdXJjZVVSTD1hcHBlbmRTb3VyY2VVUkw/UnVudGltZS5yZXNvbHZlU291cmNlVVJMKHBhdGgpOicnO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzW3BhdGhdPWNvbnRlbnQrc291cmNlVVJMO319CnN0YXRpYyBhc3luYyBydW50aW1lUmVhZHkoKXtyZXR1cm4gUnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZTt9CnN0YXRpYyBhc3luYyBzdGFydEFwcGxpY2F0aW9uKGFwcE5hbWUpe2NvbnNvbGUudGltZVN0YW1wKCdSdW50aW1lLnN0YXJ0QXBwbGljYXRpb24nKTtjb25zdCBhbGxEZXNjcmlwdG9yc0J5TmFtZT17fTtmb3IobGV0IGk9MDtpPGFsbERlc2NyaXB0b3JzLmxlbmd0aDsrK2kpe2NvbnN0IGQ9YWxsRGVzY3JpcHRvcnNbaV07YWxsRGVzY3JpcHRvcnNCeU5hbWVbZFsnbmFtZSddXT1kO30KaWYoIWFwcGxpY2F0aW9uRGVzY3JpcHRvcil7bGV0IGRhdGE9YXdhaXQgUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKGFwcE5hbWUrJy5qc29uJyk7YXBwbGljYXRpb25EZXNjcmlwdG9yPUpTT04ucGFyc2UoZGF0YSk7bGV0IGRlc2NyaXB0b3I9YXBwbGljYXRpb25EZXNjcmlwdG9yO3doaWxlKGRlc2NyaXB0b3IuZXh0ZW5kcyl7ZGF0YT1hd2FpdCBSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UoZGVzY3JpcHRvci5leHRlbmRzKycuanNvbicpO2Rlc2NyaXB0b3I9SlNPTi5wYXJzZShkYXRhKTthcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcz1kZXNjcmlwdG9yLm1vZHVsZXMuY29uY2F0KGFwcGxpY2F0aW9uRGVzY3JpcHRvci5tb2R1bGVzKTt9fQpjb25zdCBjb25maWd1cmF0aW9uPWFwcGxpY2F0aW9uRGVzY3JpcHRvci5tb2R1bGVzO2NvbnN0IG1vZHVsZUpTT05Qcm9taXNlcz1bXTtjb25zdCBjb3JlTW9kdWxlTmFtZXM9W107Zm9yKGxldCBpPTA7aTxjb25maWd1cmF0aW9uLmxlbmd0aDsrK2kpe2NvbnN0IGRlc2NyaXB0b3I9Y29uZmlndXJhdGlvbltpXTtjb25zdCBuYW1lPWRlc2NyaXB0b3JbJ25hbWUnXTtjb25zdCBtb2R1bGVKU09OPWFsbERlc2NyaXB0b3JzQnlOYW1lW25hbWVdO2lmKG1vZHVsZUpTT04pCm1vZHVsZUpTT05Qcm9taXNlcy5wdXNoKFByb21pc2UucmVzb2x2ZShtb2R1bGVKU09OKSk7ZWxzZQptb2R1bGVKU09OUHJvbWlzZXMucHVzaChSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UobmFtZSsnL21vZHVsZS5qc29uJykudGhlbihKU09OLnBhcnNlLmJpbmQoSlNPTikpKTtpZihkZXNjcmlwdG9yWyd0eXBlJ109PT0nYXV0b3N0YXJ0JykKY29yZU1vZHVsZU5hbWVzLnB1c2gobmFtZSk7fQpjb25zdCBtb2R1bGVEZXNjcmlwdG9ycz1hd2FpdCBQcm9taXNlLmFsbChtb2R1bGVKU09OUHJvbWlzZXMpO2ZvcihsZXQgaT0wO2k8bW9kdWxlRGVzY3JpcHRvcnMubGVuZ3RoOysraSl7bW9kdWxlRGVzY3JpcHRvcnNbaV0ubmFtZT1jb25maWd1cmF0aW9uW2ldWyduYW1lJ107bW9kdWxlRGVzY3JpcHRvcnNbaV0uY29uZGl0aW9uPWNvbmZpZ3VyYXRpb25baV1bJ2NvbmRpdGlvbiddO21vZHVsZURlc2NyaXB0b3JzW2ldLnJlbW90ZT1jb25maWd1cmF0aW9uW2ldWyd0eXBlJ109PT0ncmVtb3RlJzt9CnNlbGYucnVudGltZT1uZXcgUnVudGltZShtb2R1bGVEZXNjcmlwdG9ycyk7aWYoY29yZU1vZHVsZU5hbWVzKQpyZXR1cm4oc2VsZi5ydW50aW1lLl9sb2FkQXV0b1N0YXJ0TW9kdWxlcyhjb3JlTW9kdWxlTmFtZXMpKTt9CnN0YXRpYyBzdGFydFdvcmtlcihhcHBOYW1lKXtyZXR1cm4gUnVudGltZS5zdGFydEFwcGxpY2F0aW9uKGFwcE5hbWUpLnRoZW4oc2VuZFdvcmtlclJlYWR5KTtmdW5jdGlvbiBzZW5kV29ya2VyUmVhZHkoKXtzZWxmLnBvc3RNZXNzYWdlKCd3b3JrZXJSZWFkeScpO319CnN0YXRpYyBxdWVyeVBhcmFtKG5hbWUpe3JldHVybiBSdW50aW1lLl9xdWVyeVBhcmFtc09iamVjdFtuYW1lXXx8bnVsbDt9CnN0YXRpYyBxdWVyeVBhcmFtc1N0cmluZygpe3JldHVybiBsb2NhdGlvbi5zZWFyY2g7fQpzdGF0aWMgX2V4cGVyaW1lbnRzU2V0dGluZygpe3RyeXtyZXR1cm4oSlNPTi5wYXJzZShzZWxmLmxvY2FsU3RvcmFnZSYmc2VsZi5sb2NhbFN0b3JhZ2VbJ2V4cGVyaW1lbnRzJ10/c2VsZi5sb2NhbFN0b3JhZ2VbJ2V4cGVyaW1lbnRzJ106J3t9JykpO31jYXRjaChlKXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgbG9jYWxTdG9yYWdlW1wnZXhwZXJpbWVudHNcJ10nKTtyZXR1cm57fTt9fQpzdGF0aWMgX2Fzc2VydCh2YWx1ZSxtZXNzYWdlKXtpZih2YWx1ZSkKcmV0dXJuO1J1bnRpbWUuX29yaWdpbmFsQXNzZXJ0LmNhbGwoUnVudGltZS5fY29uc29sZSx2YWx1ZSxtZXNzYWdlKycgJytuZXcgRXJyb3IoKS5zdGFjayk7fQpzdGF0aWMgc2V0UGxhdGZvcm0ocGxhdGZvcm0pe1J1bnRpbWUuX3BsYXRmb3JtPXBsYXRmb3JtO30Kc3RhdGljIF9pc0Rlc2NyaXB0b3JFbmFibGVkKGRlc2NyaXB0b3Ipe2NvbnN0IGFjdGl2YXRvckV4cGVyaW1lbnQ9ZGVzY3JpcHRvclsnZXhwZXJpbWVudCddO2lmKGFjdGl2YXRvckV4cGVyaW1lbnQ9PT0nKicpCnJldHVybiBSdW50aW1lLmV4cGVyaW1lbnRzLnN1cHBvcnRFbmFibGVkKCk7aWYoYWN0aXZhdG9yRXhwZXJpbWVudCYmYWN0aXZhdG9yRXhwZXJpbWVudC5zdGFydHNXaXRoKCchJykmJlJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKGFjdGl2YXRvckV4cGVyaW1lbnQuc3Vic3RyaW5nKDEpKSkKcmV0dXJuIGZhbHNlO2lmKGFjdGl2YXRvckV4cGVyaW1lbnQmJiFhY3RpdmF0b3JFeHBlcmltZW50LnN0YXJ0c1dpdGgoJyEnKSYmIVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKGFjdGl2YXRvckV4cGVyaW1lbnQpKQpyZXR1cm4gZmFsc2U7Y29uc3QgY29uZGl0aW9uPWRlc2NyaXB0b3JbJ2NvbmRpdGlvbiddO2lmKGNvbmRpdGlvbiYmIWNvbmRpdGlvbi5zdGFydHNXaXRoKCchJykmJiFSdW50aW1lLnF1ZXJ5UGFyYW0oY29uZGl0aW9uKSkKcmV0dXJuIGZhbHNlO2lmKGNvbmRpdGlvbiYmY29uZGl0aW9uLnN0YXJ0c1dpdGgoJyEnKSYmUnVudGltZS5xdWVyeVBhcmFtKGNvbmRpdGlvbi5zdWJzdHJpbmcoMSkpKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWU7fQpzdGF0aWMgcmVzb2x2ZVNvdXJjZVVSTChwYXRoKXtsZXQgc291cmNlVVJMPXNlbGYubG9jYXRpb24uaHJlZjtpZihzZWxmLmxvY2F0aW9uLnNlYXJjaCkKc291cmNlVVJMPXNvdXJjZVVSTC5yZXBsYWNlKHNlbGYubG9jYXRpb24uc2VhcmNoLCcnKTtzb3VyY2VVUkw9c291cmNlVVJMLnN1YnN0cmluZygwLHNvdXJjZVVSTC5sYXN0SW5kZXhPZignLycpKzEpK3BhdGg7cmV0dXJuJ1xuLyojIHNvdXJjZVVSTD0nK3NvdXJjZVVSTCsnICovJzt9CnVzZVRlc3RCYXNlKCl7UnVudGltZS5fcmVtb3RlQmFzZT0naHR0cDovL2xvY2FsaG9zdDo4MDAwL2luc3BlY3Rvci1zb3VyY2VzLyc7aWYoUnVudGltZS5xdWVyeVBhcmFtKCdkZWJ1Z0Zyb250ZW5kJykpClJ1bnRpbWUuX3JlbW90ZUJhc2UrPSdkZWJ1Zy8nO30KX3JlZ2lzdGVyTW9kdWxlKGRlc2NyaXB0b3Ipe2NvbnN0IG1vZHVsZT1uZXcgUnVudGltZS5Nb2R1bGUodGhpcyxkZXNjcmlwdG9yKTt0aGlzLl9tb2R1bGVzLnB1c2gobW9kdWxlKTt0aGlzLl9tb2R1bGVzTWFwW2Rlc2NyaXB0b3JbJ25hbWUnXV09bW9kdWxlO30KbG9hZE1vZHVsZVByb21pc2UobW9kdWxlTmFtZSl7cmV0dXJuIHRoaXMuX21vZHVsZXNNYXBbbW9kdWxlTmFtZV0uX2xvYWRQcm9taXNlKCk7fQpfbG9hZEF1dG9TdGFydE1vZHVsZXMobW9kdWxlTmFtZXMpe2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8bW9kdWxlTmFtZXMubGVuZ3RoOysraSkKcHJvbWlzZXMucHVzaCh0aGlzLmxvYWRNb2R1bGVQcm9taXNlKG1vZHVsZU5hbWVzW2ldKSk7cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTt9Cl9jaGVja0V4dGVuc2lvbkFwcGxpY2FiaWxpdHkoZXh0ZW5zaW9uLHByZWRpY2F0ZSl7aWYoIXByZWRpY2F0ZSkKcmV0dXJuIGZhbHNlO2NvbnN0IGNvbnRleHRUeXBlcz1leHRlbnNpb24uZGVzY3JpcHRvcigpLmNvbnRleHRUeXBlcztpZighY29udGV4dFR5cGVzKQpyZXR1cm4gdHJ1ZTtmb3IobGV0IGk9MDtpPGNvbnRleHRUeXBlcy5sZW5ndGg7KytpKXtjb25zdCBjb250ZXh0VHlwZT10aGlzLl9yZXNvbHZlKGNvbnRleHRUeXBlc1tpXSk7Y29uc3QgaXNNYXRjaGluZz0hIWNvbnRleHRUeXBlJiZwcmVkaWNhdGUoY29udGV4dFR5cGUpO2lmKGlzTWF0Y2hpbmcpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30KaXNFeHRlbnNpb25BcHBsaWNhYmxlVG9Db250ZXh0KGV4dGVuc2lvbixjb250ZXh0KXtpZighY29udGV4dCkKcmV0dXJuIHRydWU7cmV0dXJuIHRoaXMuX2NoZWNrRXh0ZW5zaW9uQXBwbGljYWJpbGl0eShleHRlbnNpb24saXNJbnN0YW5jZU9mKTtmdW5jdGlvbiBpc0luc3RhbmNlT2YodGFyZ2V0VHlwZSl7cmV0dXJuIGNvbnRleHQgaW5zdGFuY2VvZiB0YXJnZXRUeXBlO319CmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dFR5cGVzKGV4dGVuc2lvbixjdXJyZW50Q29udGV4dFR5cGVzKXtpZighZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKS5jb250ZXh0VHlwZXMpCnJldHVybiB0cnVlO3JldHVybiB0aGlzLl9jaGVja0V4dGVuc2lvbkFwcGxpY2FiaWxpdHkoZXh0ZW5zaW9uLGN1cnJlbnRDb250ZXh0VHlwZXM/aXNDb250ZXh0VHlwZUtub3duOm51bGwpO2Z1bmN0aW9uIGlzQ29udGV4dFR5cGVLbm93bih0YXJnZXRUeXBlKXtyZXR1cm4gY3VycmVudENvbnRleHRUeXBlcy5oYXModGFyZ2V0VHlwZSk7fX0KZXh0ZW5zaW9ucyh0eXBlLGNvbnRleHQsc29ydEJ5VGl0bGUpe3JldHVybiB0aGlzLl9leHRlbnNpb25zLmZpbHRlcihmaWx0ZXIpLnNvcnQoc29ydEJ5VGl0bGU/dGl0bGVDb21wYXJhdG9yOm9yZGVyQ29tcGFyYXRvcik7ZnVuY3Rpb24gZmlsdGVyKGV4dGVuc2lvbil7aWYoZXh0ZW5zaW9uLl90eXBlIT09dHlwZSYmZXh0ZW5zaW9uLl90eXBlQ2xhc3MoKSE9PXR5cGUpCnJldHVybiBmYWxzZTtpZighZXh0ZW5zaW9uLmVuYWJsZWQoKSkKcmV0dXJuIGZhbHNlO3JldHVybiFjb250ZXh0fHxleHRlbnNpb24uaXNBcHBsaWNhYmxlKGNvbnRleHQpO30KZnVuY3Rpb24gb3JkZXJDb21wYXJhdG9yKGV4dGVuc2lvbjEsZXh0ZW5zaW9uMil7Y29uc3Qgb3JkZXIxPWV4dGVuc2lvbjEuZGVzY3JpcHRvcigpWydvcmRlciddfHwwO2NvbnN0IG9yZGVyMj1leHRlbnNpb24yLmRlc2NyaXB0b3IoKVsnb3JkZXInXXx8MDtyZXR1cm4gb3JkZXIxLW9yZGVyMjt9CmZ1bmN0aW9uIHRpdGxlQ29tcGFyYXRvcihleHRlbnNpb24xLGV4dGVuc2lvbjIpe2NvbnN0IHRpdGxlMT1leHRlbnNpb24xLnRpdGxlKCl8fCcnO2NvbnN0IHRpdGxlMj1leHRlbnNpb24yLnRpdGxlKCl8fCcnO3JldHVybiB0aXRsZTEubG9jYWxlQ29tcGFyZSh0aXRsZTIpO319CmV4dGVuc2lvbih0eXBlLGNvbnRleHQpe3JldHVybiB0aGlzLmV4dGVuc2lvbnModHlwZSxjb250ZXh0KVswXXx8bnVsbDt9CmFsbEluc3RhbmNlcyh0eXBlLGNvbnRleHQpe3JldHVybiBQcm9taXNlLmFsbCh0aGlzLmV4dGVuc2lvbnModHlwZSxjb250ZXh0KS5tYXAoZXh0ZW5zaW9uPT5leHRlbnNpb24uaW5zdGFuY2UoKSkpO30KX3Jlc29sdmUodHlwZU5hbWUpe2lmKCF0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlc1t0eXBlTmFtZV0pe2NvbnN0IHBhdGg9dHlwZU5hbWUuc3BsaXQoJy4nKTtsZXQgb2JqZWN0PXNlbGY7Zm9yKGxldCBpPTA7b2JqZWN0JiYoaTxwYXRoLmxlbmd0aCk7KytpKQpvYmplY3Q9b2JqZWN0W3BhdGhbaV1dO2lmKG9iamVjdCkKdGhpcy5fY2FjaGVkVHlwZUNsYXNzZXNbdHlwZU5hbWVdPShvYmplY3QpO30KcmV0dXJuIHRoaXMuX2NhY2hlZFR5cGVDbGFzc2VzW3R5cGVOYW1lXXx8bnVsbDt9CnNoYXJlZEluc3RhbmNlKGNvbnN0cnVjdG9yRnVuY3Rpb24pe2lmKFJ1bnRpbWUuX2luc3RhbmNlU3ltYm9sIGluIGNvbnN0cnVjdG9yRnVuY3Rpb24mJk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoY29uc3RydWN0b3JGdW5jdGlvbikuaW5jbHVkZXMoUnVudGltZS5faW5zdGFuY2VTeW1ib2wpKQpyZXR1cm4gY29uc3RydWN0b3JGdW5jdGlvbltSdW50aW1lLl9pbnN0YW5jZVN5bWJvbF07Y29uc3QgaW5zdGFuY2U9bmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24oKTtjb25zdHJ1Y3RvckZ1bmN0aW9uW1J1bnRpbWUuX2luc3RhbmNlU3ltYm9sXT1pbnN0YW5jZTtyZXR1cm4gaW5zdGFuY2U7fX07UnVudGltZS5fcXVlcnlQYXJhbXNPYmplY3Q9e19fcHJvdG9fXzpudWxsfTtSdW50aW1lLl9pbnN0YW5jZVN5bWJvbD1TeW1ib2woJ2luc3RhbmNlJyk7UnVudGltZS5jYWNoZWRSZXNvdXJjZXM9e19fcHJvdG9fXzpudWxsfTtSdW50aW1lLl9jb25zb2xlPWNvbnNvbGU7UnVudGltZS5fb3JpZ2luYWxBc3NlcnQ9Y29uc29sZS5hc3NlcnQ7UnVudGltZS5fcGxhdGZvcm09Jyc7UnVudGltZS5Nb2R1bGVEZXNjcmlwdG9yPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5uYW1lO3RoaXMuZXh0ZW5zaW9uczt0aGlzLmRlcGVuZGVuY2llczt0aGlzLnNjcmlwdHM7dGhpcy5jb25kaXRpb247dGhpcy5yZW1vdGU7fX07UnVudGltZS5FeHRlbnNpb25EZXNjcmlwdG9yPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlO3RoaXMuY2xhc3NOYW1lO3RoaXMuZmFjdG9yeU5hbWU7dGhpcy5jb250ZXh0VHlwZXM7fX07UnVudGltZS5Nb2R1bGU9Y2xhc3N7Y29uc3RydWN0b3IobWFuYWdlcixkZXNjcmlwdG9yKXt0aGlzLl9tYW5hZ2VyPW1hbmFnZXI7dGhpcy5fZGVzY3JpcHRvcj1kZXNjcmlwdG9yO3RoaXMuX25hbWU9ZGVzY3JpcHRvci5uYW1lO3RoaXMuX2V4dGVuc2lvbnM9W107dGhpcy5fZXh0ZW5zaW9uc0J5Q2xhc3NOYW1lPW5ldyBNYXAoKTtjb25zdCBleHRlbnNpb25zPShkZXNjcmlwdG9yLmV4dGVuc2lvbnMpO2ZvcihsZXQgaT0wO2V4dGVuc2lvbnMmJmk8ZXh0ZW5zaW9ucy5sZW5ndGg7KytpKXtjb25zdCBleHRlbnNpb249bmV3IFJ1bnRpbWUuRXh0ZW5zaW9uKHRoaXMsZXh0ZW5zaW9uc1tpXSk7dGhpcy5fbWFuYWdlci5fZXh0ZW5zaW9ucy5wdXNoKGV4dGVuc2lvbik7dGhpcy5fZXh0ZW5zaW9ucy5wdXNoKGV4dGVuc2lvbik7fQp0aGlzLl9sb2FkZWRGb3JUZXN0PWZhbHNlO30KbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lO30KZW5hYmxlZCgpe3JldHVybiBSdW50aW1lLl9pc0Rlc2NyaXB0b3JFbmFibGVkKHRoaXMuX2Rlc2NyaXB0b3IpO30KcmVzb3VyY2UobmFtZSl7Y29uc3QgZnVsbE5hbWU9dGhpcy5fbmFtZSsnLycrbmFtZTtjb25zdCBjb250ZW50PVJ1bnRpbWUuY2FjaGVkUmVzb3VyY2VzW2Z1bGxOYW1lXTtpZighY29udGVudCkKdGhyb3cgbmV3IEVycm9yKGZ1bGxOYW1lKycgbm90IHByZWxvYWRlZC4gQ2hlY2sgbW9kdWxlLmpzb24nKTtyZXR1cm4gY29udGVudDt9Cl9sb2FkUHJvbWlzZSgpe2lmKCF0aGlzLmVuYWJsZWQoKSkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTW9kdWxlICcrdGhpcy5fbmFtZSsnIGlzIG5vdCBlbmFibGVkJykpO2lmKHRoaXMuX3BlbmRpbmdMb2FkUHJvbWlzZSkKcmV0dXJuIHRoaXMuX3BlbmRpbmdMb2FkUHJvbWlzZTtjb25zdCBkZXBlbmRlbmNpZXM9dGhpcy5fZGVzY3JpcHRvci5kZXBlbmRlbmNpZXM7Y29uc3QgZGVwZW5kZW5jeVByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2RlcGVuZGVuY2llcyYmaTxkZXBlbmRlbmNpZXMubGVuZ3RoOysraSkKZGVwZW5kZW5jeVByb21pc2VzLnB1c2godGhpcy5fbWFuYWdlci5fbW9kdWxlc01hcFtkZXBlbmRlbmNpZXNbaV1dLl9sb2FkUHJvbWlzZSgpKTt0aGlzLl9wZW5kaW5nTG9hZFByb21pc2U9UHJvbWlzZS5hbGwoZGVwZW5kZW5jeVByb21pc2VzKS50aGVuKHRoaXMuX2xvYWRSZXNvdXJjZXMuYmluZCh0aGlzKSkudGhlbih0aGlzLl9sb2FkU2NyaXB0cy5iaW5kKHRoaXMpKS50aGVuKCgpPT50aGlzLl9sb2FkZWRGb3JUZXN0PXRydWUpO3JldHVybiB0aGlzLl9wZW5kaW5nTG9hZFByb21pc2U7fQpfbG9hZFJlc291cmNlcygpe2NvbnN0IHJlc291cmNlcz10aGlzLl9kZXNjcmlwdG9yWydyZXNvdXJjZXMnXTtpZighcmVzb3VyY2VzfHwhcmVzb3VyY2VzLmxlbmd0aCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8cmVzb3VyY2VzLmxlbmd0aDsrK2kpe2NvbnN0IHVybD10aGlzLl9tb2R1bGFyaXplVVJMKHJlc291cmNlc1tpXSk7cHJvbWlzZXMucHVzaChSdW50aW1lLl9sb2FkUmVzb3VyY2VJbnRvQ2FjaGUodXJsLHRydWUpKTt9CnJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih1bmRlZmluZWQpO30KX2xvYWRTY3JpcHRzKCl7aWYoIXRoaXMuX2Rlc2NyaXB0b3Iuc2NyaXB0c3x8IXRoaXMuX2Rlc2NyaXB0b3Iuc2NyaXB0cy5sZW5ndGgpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBzcGVjaWFsQ2FzZXM9eydzZGsnOidTREsnLCdqc19zZGsnOidKU1NESycsJ2Jyb3dzZXJfc2RrJzonQnJvd3NlclNESycsJ3VpJzonVUknLCdvYmplY3RfdWknOidPYmplY3RVSScsJ2phdmFzY3JpcHRfbWV0YWRhdGEnOidKYXZhU2NyaXB0TWV0YWRhdGEnLCdwZXJmX3VpJzonUGVyZlVJJywnaGFyX2ltcG9ydGVyJzonSEFSSW1wb3J0ZXInLCdzZGtfdGVzdF9ydW5uZXInOidTREtUZXN0UnVubmVyJywnY3B1X3Byb2ZpbGVyX3Rlc3RfcnVubmVyJzonQ1BVUHJvZmlsZXJUZXN0UnVubmVyJ307Y29uc3QgbmFtZXNwYWNlPXNwZWNpYWxDYXNlc1t0aGlzLl9uYW1lXXx8dGhpcy5fbmFtZS5zcGxpdCgnXycpLm1hcChhPT5hLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSkpLmpvaW4oJycpO3NlbGZbbmFtZXNwYWNlXT1zZWxmW25hbWVzcGFjZV18fHt9O3JldHVybiBSdW50aW1lLl9sb2FkU2NyaXB0c1Byb21pc2UodGhpcy5fZGVzY3JpcHRvci5zY3JpcHRzLm1hcCh0aGlzLl9tb2R1bGFyaXplVVJMLHRoaXMpLHRoaXMuX3JlbW90ZUJhc2UoKSk7fQpfbW9kdWxhcml6ZVVSTChyZXNvdXJjZU5hbWUpe3JldHVybiBSdW50aW1lLm5vcm1hbGl6ZVBhdGgodGhpcy5fbmFtZSsnLycrcmVzb3VyY2VOYW1lKTt9Cl9yZW1vdGVCYXNlKCl7cmV0dXJuIVJ1bnRpbWUucXVlcnlQYXJhbSgnZGVidWdGcm9udGVuZCcpJiZ0aGlzLl9kZXNjcmlwdG9yLnJlbW90ZSYmUnVudGltZS5fcmVtb3RlQmFzZXx8dW5kZWZpbmVkO30Kc3Vic3RpdHV0ZVVSTCh2YWx1ZSl7Y29uc3QgYmFzZT10aGlzLl9yZW1vdGVCYXNlKCl8fCcnO3JldHVybiB2YWx1ZS5yZXBsYWNlKC9AdXJsXCgoW15cKV0qPylcKS9nLGNvbnZlcnRVUkwuYmluZCh0aGlzKSk7ZnVuY3Rpb24gY29udmVydFVSTChtYXRjaCx1cmwpe3JldHVybiBiYXNlK3RoaXMuX21vZHVsYXJpemVVUkwodXJsKTt9fX07UnVudGltZS5FeHRlbnNpb249Y2xhc3N7Y29uc3RydWN0b3IobW9kdWxlLGRlc2NyaXB0b3Ipe3RoaXMuX21vZHVsZT1tb2R1bGU7dGhpcy5fZGVzY3JpcHRvcj1kZXNjcmlwdG9yO3RoaXMuX3R5cGU9ZGVzY3JpcHRvci50eXBlO3RoaXMuX2hhc1R5cGVDbGFzcz10aGlzLl90eXBlLmNoYXJBdCgwKT09PSdAJzt0aGlzLl9jbGFzc05hbWU9ZGVzY3JpcHRvci5jbGFzc05hbWV8fG51bGw7dGhpcy5fZmFjdG9yeU5hbWU9ZGVzY3JpcHRvci5mYWN0b3J5TmFtZXx8bnVsbDt9CmRlc2NyaXB0b3IoKXtyZXR1cm4gdGhpcy5fZGVzY3JpcHRvcjt9Cm1vZHVsZSgpe3JldHVybiB0aGlzLl9tb2R1bGU7fQplbmFibGVkKCl7cmV0dXJuIHRoaXMuX21vZHVsZS5lbmFibGVkKCkmJlJ1bnRpbWUuX2lzRGVzY3JpcHRvckVuYWJsZWQodGhpcy5kZXNjcmlwdG9yKCkpO30KX3R5cGVDbGFzcygpe2lmKCF0aGlzLl9oYXNUeXBlQ2xhc3MpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9tb2R1bGUuX21hbmFnZXIuX3Jlc29sdmUodGhpcy5fdHlwZS5zdWJzdHJpbmcoMSkpO30KaXNBcHBsaWNhYmxlKGNvbnRleHQpe3JldHVybiB0aGlzLl9tb2R1bGUuX21hbmFnZXIuaXNFeHRlbnNpb25BcHBsaWNhYmxlVG9Db250ZXh0KHRoaXMsY29udGV4dCk7fQppbnN0YW5jZSgpe3JldHVybiB0aGlzLl9tb2R1bGUuX2xvYWRQcm9taXNlKCkudGhlbih0aGlzLl9jcmVhdGVJbnN0YW5jZS5iaW5kKHRoaXMpKTt9CmNhbkluc3RhbnRpYXRlKCl7cmV0dXJuISEodGhpcy5fY2xhc3NOYW1lfHx0aGlzLl9mYWN0b3J5TmFtZSk7fQpfY3JlYXRlSW5zdGFuY2UoKXtjb25zdCBjbGFzc05hbWU9dGhpcy5fY2xhc3NOYW1lfHx0aGlzLl9mYWN0b3J5TmFtZTtpZighY2xhc3NOYW1lKQp0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZSBleHRlbnNpb24gd2l0aCBubyBjbGFzcycpO2NvbnN0IGNvbnN0cnVjdG9yRnVuY3Rpb249c2VsZi5ldmFsKChjbGFzc05hbWUpKTtpZighKGNvbnN0cnVjdG9yRnVuY3Rpb24gaW5zdGFuY2VvZiBGdW5jdGlvbikpCnRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGluc3RhbnRpYXRlOiAnK2NsYXNzTmFtZSk7aWYodGhpcy5fY2xhc3NOYW1lKQpyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLnNoYXJlZEluc3RhbmNlKGNvbnN0cnVjdG9yRnVuY3Rpb24pO3JldHVybiBuZXcgY29uc3RydWN0b3JGdW5jdGlvbih0aGlzKTt9CnRpdGxlKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3JbJ3RpdGxlLScrUnVudGltZS5fcGxhdGZvcm1dfHx0aGlzLl9kZXNjcmlwdG9yWyd0aXRsZSddO30KaGFzQ29udGV4dFR5cGUoY29udGV4dFR5cGUpe2NvbnN0IGNvbnRleHRUeXBlcz10aGlzLmRlc2NyaXB0b3IoKS5jb250ZXh0VHlwZXM7aWYoIWNvbnRleHRUeXBlcykKcmV0dXJuIGZhbHNlO2ZvcihsZXQgaT0wO2k8Y29udGV4dFR5cGVzLmxlbmd0aDsrK2kpe2lmKGNvbnRleHRUeXBlPT09dGhpcy5fbW9kdWxlLl9tYW5hZ2VyLl9yZXNvbHZlKGNvbnRleHRUeXBlc1tpXSkpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319O1J1bnRpbWUuRXhwZXJpbWVudHNTdXBwb3J0PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fc3VwcG9ydEVuYWJsZWQ9UnVudGltZS5xdWVyeVBhcmFtKCdleHBlcmltZW50cycpIT09bnVsbDt0aGlzLl9leHBlcmltZW50cz1bXTt0aGlzLl9leHBlcmltZW50TmFtZXM9e307dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5PXt9O30KYWxsQ29uZmlndXJhYmxlRXhwZXJpbWVudHMoKXtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPTA7aTx0aGlzLl9leHBlcmltZW50cy5sZW5ndGg7aSsrKXtjb25zdCBleHBlcmltZW50PXRoaXMuX2V4cGVyaW1lbnRzW2ldO2lmKCF0aGlzLl9lbmFibGVkVHJhbnNpZW50bHlbZXhwZXJpbWVudC5uYW1lXSkKcmVzdWx0LnB1c2goZXhwZXJpbWVudCk7fQpyZXR1cm4gcmVzdWx0O30Kc3VwcG9ydEVuYWJsZWQoKXtyZXR1cm4gdGhpcy5fc3VwcG9ydEVuYWJsZWQ7fQpfc2V0RXhwZXJpbWVudHNTZXR0aW5nKHZhbHVlKXtpZighc2VsZi5sb2NhbFN0b3JhZ2UpCnJldHVybjtzZWxmLmxvY2FsU3RvcmFnZVsnZXhwZXJpbWVudHMnXT1KU09OLnN0cmluZ2lmeSh2YWx1ZSk7fQpyZWdpc3RlcihleHBlcmltZW50TmFtZSxleHBlcmltZW50VGl0bGUsaGlkZGVuKXtSdW50aW1lLl9hc3NlcnQoIXRoaXMuX2V4cGVyaW1lbnROYW1lc1tleHBlcmltZW50TmFtZV0sJ0R1cGxpY2F0ZSByZWdpc3RyYXRpb24gb2YgZXhwZXJpbWVudCAnK2V4cGVyaW1lbnROYW1lKTt0aGlzLl9leHBlcmltZW50TmFtZXNbZXhwZXJpbWVudE5hbWVdPXRydWU7dGhpcy5fZXhwZXJpbWVudHMucHVzaChuZXcgUnVudGltZS5FeHBlcmltZW50KHRoaXMsZXhwZXJpbWVudE5hbWUsZXhwZXJpbWVudFRpdGxlLCEhaGlkZGVuKSk7fQppc0VuYWJsZWQoZXhwZXJpbWVudE5hbWUpe3RoaXMuX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSk7aWYodGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnROYW1lXSkKcmV0dXJuIHRydWU7aWYoIXRoaXMuc3VwcG9ydEVuYWJsZWQoKSkKcmV0dXJuIGZhbHNlO3JldHVybiEhUnVudGltZS5fZXhwZXJpbWVudHNTZXR0aW5nKClbZXhwZXJpbWVudE5hbWVdO30Kc2V0RW5hYmxlZChleHBlcmltZW50TmFtZSxlbmFibGVkKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO2NvbnN0IGV4cGVyaW1lbnRzU2V0dGluZz1SdW50aW1lLl9leHBlcmltZW50c1NldHRpbmcoKTtleHBlcmltZW50c1NldHRpbmdbZXhwZXJpbWVudE5hbWVdPWVuYWJsZWQ7dGhpcy5fc2V0RXhwZXJpbWVudHNTZXR0aW5nKGV4cGVyaW1lbnRzU2V0dGluZyk7fQpzZXREZWZhdWx0RXhwZXJpbWVudHMoZXhwZXJpbWVudE5hbWVzKXtmb3IobGV0IGk9MDtpPGV4cGVyaW1lbnROYW1lcy5sZW5ndGg7KytpKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWVzW2ldKTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHlbZXhwZXJpbWVudE5hbWVzW2ldXT10cnVlO319CmVuYWJsZUZvclRlc3QoZXhwZXJpbWVudE5hbWUpe3RoaXMuX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSk7dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnROYW1lXT10cnVlO30KY2xlYXJGb3JUZXN0KCl7dGhpcy5fZXhwZXJpbWVudHM9W107dGhpcy5fZXhwZXJpbWVudE5hbWVzPXt9O3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseT17fTt9CmNsZWFuVXBTdGFsZUV4cGVyaW1lbnRzKCl7Y29uc3QgZXhwZXJpbWVudHNTZXR0aW5nPVJ1bnRpbWUuX2V4cGVyaW1lbnRzU2V0dGluZygpO2NvbnN0IGNsZWFuZWRVcEV4cGVyaW1lbnRTZXR0aW5nPXt9O2ZvcihsZXQgaT0wO2k8dGhpcy5fZXhwZXJpbWVudHMubGVuZ3RoOysraSl7Y29uc3QgZXhwZXJpbWVudE5hbWU9dGhpcy5fZXhwZXJpbWVudHNbaV0ubmFtZTtpZihleHBlcmltZW50c1NldHRpbmdbZXhwZXJpbWVudE5hbWVdKQpjbGVhbmVkVXBFeHBlcmltZW50U2V0dGluZ1tleHBlcmltZW50TmFtZV09dHJ1ZTt9CnRoaXMuX3NldEV4cGVyaW1lbnRzU2V0dGluZyhjbGVhbmVkVXBFeHBlcmltZW50U2V0dGluZyk7fQpfY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKXtSdW50aW1lLl9hc3NlcnQodGhpcy5fZXhwZXJpbWVudE5hbWVzW2V4cGVyaW1lbnROYW1lXSwnVW5rbm93biBleHBlcmltZW50ICcrZXhwZXJpbWVudE5hbWUpO319O1J1bnRpbWUuRXhwZXJpbWVudD1jbGFzc3tjb25zdHJ1Y3RvcihleHBlcmltZW50cyxuYW1lLHRpdGxlLGhpZGRlbil7dGhpcy5uYW1lPW5hbWU7dGhpcy50aXRsZT10aXRsZTt0aGlzLmhpZGRlbj1oaWRkZW47dGhpcy5fZXhwZXJpbWVudHM9ZXhwZXJpbWVudHM7fQppc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuaXNFbmFibGVkKHRoaXMubmFtZSk7fQpzZXRFbmFibGVkKGVuYWJsZWQpe3RoaXMuX2V4cGVyaW1lbnRzLnNldEVuYWJsZWQodGhpcy5uYW1lLGVuYWJsZWQpO319O3soZnVuY3Rpb24gcGFyc2VRdWVyeVBhcmFtZXRlcnMoKXtjb25zdCBxdWVyeVBhcmFtcz1SdW50aW1lLnF1ZXJ5UGFyYW1zU3RyaW5nKCk7aWYoIXF1ZXJ5UGFyYW1zKQpyZXR1cm47Y29uc3QgcGFyYW1zPXF1ZXJ5UGFyYW1zLnN1YnN0cmluZygxKS5zcGxpdCgnJicpO2ZvcihsZXQgaT0wO2k8cGFyYW1zLmxlbmd0aDsrK2kpe2NvbnN0IHBhaXI9cGFyYW1zW2ldLnNwbGl0KCc9Jyk7Y29uc3QgbmFtZT1wYWlyLnNoaWZ0KCk7UnVudGltZS5fcXVlcnlQYXJhbXNPYmplY3RbbmFtZV09cGFpci5qb2luKCc9Jyk7fX0pKCk7fQpSdW50aW1lLmV4cGVyaW1lbnRzPW5ldyBSdW50aW1lLkV4cGVyaW1lbnRzU3VwcG9ydCgpO1J1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2VDYWxsYmFjaztSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbD0+UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZUNhbGxiYWNrPWZ1bGZpbCk7UnVudGltZS5fcmVtb3RlQmFzZTsoZnVuY3Rpb24gdmFsaWRhdGVSZW1vdGVCYXNlKCl7aWYobG9jYXRpb24uaHJlZi5zdGFydHNXaXRoKCdjaHJvbWUtZGV2dG9vbHM6Ly9kZXZ0b29scy9idW5kbGVkLycpJiZSdW50aW1lLnF1ZXJ5UGFyYW0oJ3JlbW90ZUJhc2UnKSl7Y29uc3QgdmVyc2lvbk1hdGNoPS9cL3NlcnZlX2ZpbGVcLyhAWzAtOWEtekEtWl0rKVwvPyQvLmV4ZWMoUnVudGltZS5xdWVyeVBhcmFtKCdyZW1vdGVCYXNlJykpO2lmKHZlcnNpb25NYXRjaCkKUnVudGltZS5fcmVtb3RlQmFzZT1gJHtsb2NhdGlvbi5vcmlnaW59L3JlbW90ZS9zZXJ2ZV9maWxlLyR7dmVyc2lvbk1hdGNoWzFdfS9gO319KSgpO2Z1bmN0aW9uIFNlcnZpY2VQb3J0KCl7fQpTZXJ2aWNlUG9ydC5wcm90b3R5cGU9e3NldEhhbmRsZXJzKG1lc3NhZ2VIYW5kbGVyLGNsb3NlSGFuZGxlcil7fSxzZW5kKG1lc3NhZ2Upe30sY2xvc2UoKXt9fTt2YXIgcnVudGltZTthbGxEZXNjcmlwdG9ycy5wdXNoKC4uLlt7ImRlcGVuZGVuY2llcyI6W10sIm5hbWUiOiJoZWFwX3NuYXBzaG90X21vZGVsIn0seyJkZXBlbmRlbmNpZXMiOltdLCJuYW1lIjoicGxhdGZvcm0ifSx7ImRlcGVuZGVuY2llcyI6WyJoZWFwX3NuYXBzaG90X21vZGVsIiwicGxhdGZvcm0iLCJjb21tb24iXSwibmFtZSI6ImhlYXBfc25hcHNob3Rfd29ya2VyIn0seyJkZXBlbmRlbmNpZXMiOlsicGxhdGZvcm0iXSwibmFtZSI6InRleHRfdXRpbHMifSx7ImRlcGVuZGVuY2llcyI6WyJ0ZXh0X3V0aWxzIiwicGxhdGZvcm0iXSwibmFtZSI6ImNvbW1vbiJ9XSk7YXBwbGljYXRpb25EZXNjcmlwdG9yPXsiaGFzX2h0bWwiOmZhbHNlLCJtb2R1bGVzIjpbeyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImhlYXBfc25hcHNob3RfbW9kZWwifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoicGxhdGZvcm0ifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiaGVhcF9zbmFwc2hvdF93b3JrZXIifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoidGV4dF91dGlscyJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJjb21tb24ifV19CnNlbGZbJ0hlYXBTbmFwc2hvdE1vZGVsJ109c2VsZlsnSGVhcFNuYXBzaG90TW9kZWwnXXx8e307SGVhcFNuYXBzaG90TW9kZWwuSGVhcFNuYXBzaG90UHJvZ3Jlc3NFdmVudD17VXBkYXRlOidQcm9ncmVzc1VwZGF0ZScsQnJva2VuU25hcHNob3Q6J0Jyb2tlblNuYXBzaG90J307SGVhcFNuYXBzaG90TW9kZWwuYmFzZVN5c3RlbURpc3RhbmNlPTEwMDAwMDAwMDtIZWFwU25hcHNob3RNb2RlbC5BbGxvY2F0aW9uTm9kZUNhbGxlcnM9Y2xhc3N7Y29uc3RydWN0b3Iobm9kZXNXaXRoU2luZ2xlQ2FsbGVyLGJyYW5jaGluZ0NhbGxlcnMpe3RoaXMubm9kZXNXaXRoU2luZ2xlQ2FsbGVyPW5vZGVzV2l0aFNpbmdsZUNhbGxlcjt0aGlzLmJyYW5jaGluZ0NhbGxlcnM9YnJhbmNoaW5nQ2FsbGVyczt9fTtIZWFwU25hcHNob3RNb2RlbC5TZXJpYWxpemVkQWxsb2NhdGlvbk5vZGU9Y2xhc3N7Y29uc3RydWN0b3Iobm9kZUlkLGZ1bmN0aW9uTmFtZSxzY3JpcHROYW1lLHNjcmlwdElkLGxpbmUsY29sdW1uLGNvdW50LHNpemUsbGl2ZUNvdW50LGxpdmVTaXplLGhhc0NoaWxkcmVuKXt0aGlzLmlkPW5vZGVJZDt0aGlzLm5hbWU9ZnVuY3Rpb25OYW1lO3RoaXMuc2NyaXB0TmFtZT1zY3JpcHROYW1lO3RoaXMuc2NyaXB0SWQ9c2NyaXB0SWQ7dGhpcy5saW5lPWxpbmU7dGhpcy5jb2x1bW49Y29sdW1uO3RoaXMuY291bnQ9Y291bnQ7dGhpcy5zaXplPXNpemU7dGhpcy5saXZlQ291bnQ9bGl2ZUNvdW50O3RoaXMubGl2ZVNpemU9bGl2ZVNpemU7dGhpcy5oYXNDaGlsZHJlbj1oYXNDaGlsZHJlbjt9fTtIZWFwU25hcHNob3RNb2RlbC5BbGxvY2F0aW9uU3RhY2tGcmFtZT1jbGFzc3tjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWUsc2NyaXB0TmFtZSxzY3JpcHRJZCxsaW5lLGNvbHVtbil7dGhpcy5mdW5jdGlvbk5hbWU9ZnVuY3Rpb25OYW1lO3RoaXMuc2NyaXB0TmFtZT1zY3JpcHROYW1lO3RoaXMuc2NyaXB0SWQ9c2NyaXB0SWQ7dGhpcy5saW5lPWxpbmU7dGhpcy5jb2x1bW49Y29sdW1uO319O0hlYXBTbmFwc2hvdE1vZGVsLk5vZGU9Y2xhc3N7Y29uc3RydWN0b3IoaWQsbmFtZSxkaXN0YW5jZSxub2RlSW5kZXgscmV0YWluZWRTaXplLHNlbGZTaXplLHR5cGUpe3RoaXMuaWQ9aWQ7dGhpcy5uYW1lPW5hbWU7dGhpcy5kaXN0YW5jZT1kaXN0YW5jZTt0aGlzLm5vZGVJbmRleD1ub2RlSW5kZXg7dGhpcy5yZXRhaW5lZFNpemU9cmV0YWluZWRTaXplO3RoaXMuc2VsZlNpemU9c2VsZlNpemU7dGhpcy50eXBlPXR5cGU7dGhpcy5jYW5CZVF1ZXJpZWQ9ZmFsc2U7dGhpcy5kZXRhY2hlZERPTVRyZWVOb2RlPWZhbHNlO319O0hlYXBTbmFwc2hvdE1vZGVsLkVkZ2U9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSxub2RlLHR5cGUsZWRnZUluZGV4KXt0aGlzLm5hbWU9bmFtZTt0aGlzLm5vZGU9bm9kZTt0aGlzLnR5cGU9dHlwZTt0aGlzLmVkZ2VJbmRleD1lZGdlSW5kZXg7fX07SGVhcFNuYXBzaG90TW9kZWwuQWdncmVnYXRlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jb3VudDt0aGlzLmRpc3RhbmNlO3RoaXMuc2VsZjt0aGlzLm1heFJldDt0aGlzLnR5cGU7dGhpcy5uYW1lO3RoaXMuaWR4czt9fTtIZWFwU25hcHNob3RNb2RlbC5BZ2dyZWdhdGVGb3JEaWZmPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5pbmRleGVzPVtdO3RoaXMuaWRzPVtdO3RoaXMuc2VsZlNpemVzPVtdO319O0hlYXBTbmFwc2hvdE1vZGVsLkRpZmY9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmFkZGVkQ291bnQ9MDt0aGlzLnJlbW92ZWRDb3VudD0wO3RoaXMuYWRkZWRTaXplPTA7dGhpcy5yZW1vdmVkU2l6ZT0wO3RoaXMuZGVsZXRlZEluZGV4ZXM9W107dGhpcy5hZGRlZEluZGV4ZXM9W107fX07SGVhcFNuYXBzaG90TW9kZWwuRGlmZkZvckNsYXNzPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5hZGRlZENvdW50O3RoaXMucmVtb3ZlZENvdW50O3RoaXMuYWRkZWRTaXplO3RoaXMucmVtb3ZlZFNpemU7dGhpcy5kZWxldGVkSW5kZXhlczt0aGlzLmFkZGVkSW5kZXhlczt0aGlzLmNvdW50RGVsdGE7dGhpcy5zaXplRGVsdGE7fX07SGVhcFNuYXBzaG90TW9kZWwuQ29tcGFyYXRvckNvbmZpZz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZmllbGROYW1lMTt0aGlzLmFzY2VuZGluZzE7dGhpcy5maWVsZE5hbWUyO3RoaXMuYXNjZW5kaW5nMjt9fTtIZWFwU25hcHNob3RNb2RlbC5Xb3JrZXJDb21tYW5kPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5jYWxsSWQ7dGhpcy5kaXNwb3NpdGlvbjt0aGlzLm9iamVjdElkO3RoaXMubmV3T2JqZWN0SWQ7dGhpcy5tZXRob2ROYW1lO3RoaXMubWV0aG9kQXJndW1lbnRzO3RoaXMuc291cmNlO319O0hlYXBTbmFwc2hvdE1vZGVsLkl0ZW1zUmFuZ2U9Y2xhc3N7Y29uc3RydWN0b3Ioc3RhcnRQb3NpdGlvbixlbmRQb3NpdGlvbix0b3RhbExlbmd0aCxpdGVtcyl7dGhpcy5zdGFydFBvc2l0aW9uPXN0YXJ0UG9zaXRpb247dGhpcy5lbmRQb3NpdGlvbj1lbmRQb3NpdGlvbjt0aGlzLnRvdGFsTGVuZ3RoPXRvdGFsTGVuZ3RoO3RoaXMuaXRlbXM9aXRlbXM7fX07SGVhcFNuYXBzaG90TW9kZWwuU3RhdGljRGF0YT1jbGFzc3tjb25zdHJ1Y3Rvcihub2RlQ291bnQscm9vdE5vZGVJbmRleCx0b3RhbFNpemUsbWF4SlNPYmplY3RJZCl7dGhpcy5ub2RlQ291bnQ9bm9kZUNvdW50O3RoaXMucm9vdE5vZGVJbmRleD1yb290Tm9kZUluZGV4O3RoaXMudG90YWxTaXplPXRvdGFsU2l6ZTt0aGlzLm1heEpTT2JqZWN0SWQ9bWF4SlNPYmplY3RJZDt9fTtIZWFwU25hcHNob3RNb2RlbC5TdGF0aXN0aWNzPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy50b3RhbDt0aGlzLnY4aGVhcDt0aGlzLm5hdGl2ZTt0aGlzLmNvZGU7dGhpcy5qc0FycmF5czt0aGlzLnN0cmluZ3M7dGhpcy5zeXN0ZW07fX07SGVhcFNuYXBzaG90TW9kZWwuTm9kZUZpbHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihtaW5Ob2RlSWQsbWF4Tm9kZUlkKXt0aGlzLm1pbk5vZGVJZD1taW5Ob2RlSWQ7dGhpcy5tYXhOb2RlSWQ9bWF4Tm9kZUlkO3RoaXMuYWxsb2NhdGlvbk5vZGVJZDt9CmVxdWFscyhvKXtyZXR1cm4gdGhpcy5taW5Ob2RlSWQ9PT1vLm1pbk5vZGVJZCYmdGhpcy5tYXhOb2RlSWQ9PT1vLm1heE5vZGVJZCYmdGhpcy5hbGxvY2F0aW9uTm9kZUlkPT09by5hbGxvY2F0aW9uTm9kZUlkO319O0hlYXBTbmFwc2hvdE1vZGVsLlNlYXJjaENvbmZpZz1jbGFzc3tjb25zdHJ1Y3RvcihxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmQpe3RoaXMucXVlcnk9cXVlcnk7dGhpcy5jYXNlU2Vuc2l0aXZlPWNhc2VTZW5zaXRpdmU7dGhpcy5pc1JlZ2V4PWlzUmVnZXg7dGhpcy5zaG91bGRKdW1wPXNob3VsZEp1bXA7dGhpcy5qdW1wQmFja3dhcmQ9anVtcEJhY2t3YXJkO319O0hlYXBTbmFwc2hvdE1vZGVsLlNhbXBsZXM9Y2xhc3N7Y29uc3RydWN0b3IodGltZXN0YW1wcyxsYXN0QXNzaWduZWRJZHMsc2l6ZXMpe3RoaXMudGltZXN0YW1wcz10aW1lc3RhbXBzO3RoaXMubGFzdEFzc2lnbmVkSWRzPWxhc3RBc3NpZ25lZElkczt0aGlzLnNpemVzPXNpemVzO319OztzZWxmWydQbGF0Zm9ybSddPXNlbGZbJ1BsYXRmb3JtJ118fHt9O2xldCBBcnJheUxpa2U7ZnVuY3Rpb24gbW9kKG0sbil7cmV0dXJuKChtJW4pK24pJW47fQpTdHJpbmcucHJvdG90eXBlLmZpbmRBbGw9ZnVuY3Rpb24oc3RyaW5nKXtjb25zdCBtYXRjaGVzPVtdO2xldCBpPXRoaXMuaW5kZXhPZihzdHJpbmcpO3doaWxlKGkhPT0tMSl7bWF0Y2hlcy5wdXNoKGkpO2k9dGhpcy5pbmRleE9mKHN0cmluZyxpK3N0cmluZy5sZW5ndGgpO30KcmV0dXJuIG1hdGNoZXM7fTtTdHJpbmcucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO307U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQ29udHJvbENoYXJhY3RlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC9bXHUwMDAwLVx1MDAwOFx1MDAwYlx1MDAwY1x1MDAwZS1cdTAwMWZcdTAwODAtXHUwMDlmXS9nLCfvv70nKTt9O1N0cmluZy5wcm90b3R5cGUuaXNXaGl0ZXNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuL15ccyokLy50ZXN0KHRoaXMpO307U3RyaW5nLnByb3RvdHlwZS5jb21wdXRlTGluZUVuZGluZ3M9ZnVuY3Rpb24oKXtjb25zdCBlbmRpbmdzPXRoaXMuZmluZEFsbCgnXG4nKTtlbmRpbmdzLnB1c2godGhpcy5sZW5ndGgpO3JldHVybiBlbmRpbmdzO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVDaGFyYWN0ZXJzPWZ1bmN0aW9uKGNoYXJzKXtsZXQgZm91bmRDaGFyPWZhbHNlO2ZvcihsZXQgaT0wO2k8Y2hhcnMubGVuZ3RoOysraSl7aWYodGhpcy5pbmRleE9mKGNoYXJzLmNoYXJBdChpKSkhPT0tMSl7Zm91bmRDaGFyPXRydWU7YnJlYWs7fX0KaWYoIWZvdW5kQ2hhcikKcmV0dXJuIFN0cmluZyh0aGlzKTtsZXQgcmVzdWx0PScnO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGg7KytpKXtpZihjaGFycy5pbmRleE9mKHRoaXMuY2hhckF0KGkpKSE9PS0xKQpyZXN1bHQrPSdcXCc7cmVzdWx0Kz10aGlzLmNoYXJBdChpKTt9CnJldHVybiByZXN1bHQ7fTtTdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycz1mdW5jdGlvbigpe3JldHVybideW117fSgpXFwuXiQqKz98LSwnO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVGb3JSZWdFeHA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lc2NhcGVDaGFyYWN0ZXJzKFN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCkpO307U3RyaW5nLmZpbHRlclJlZ2V4PWZ1bmN0aW9uKHF1ZXJ5KXtjb25zdCB0b0VzY2FwZT1TdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycygpO2xldCByZWdleFN0cmluZz0nJztmb3IobGV0IGk9MDtpPHF1ZXJ5Lmxlbmd0aDsrK2kpe2xldCBjPXF1ZXJ5LmNoYXJBdChpKTtpZih0b0VzY2FwZS5pbmRleE9mKGMpIT09LTEpCmM9J1xcJytjO2lmKGkpCnJlZ2V4U3RyaW5nKz0nW15cXDAnK2MrJ10qJztyZWdleFN0cmluZys9Yzt9CnJldHVybiBuZXcgUmVnRXhwKHJlZ2V4U3RyaW5nLCdpJyk7fTtTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7JykucmVwbGFjZSgvIi9nLCcmcXVvdDsnKTt9O1N0cmluZy5wcm90b3R5cGUudW5lc2NhcGVIVE1MPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+JykucmVwbGFjZSgvJiM1ODsvZywnOicpLnJlcGxhY2UoLyZxdW90Oy9nLCciJykucmVwbGFjZSgvJiM2MDsvZywnPCcpLnJlcGxhY2UoLyYjNjI7L2csJz4nKS5yZXBsYWNlKC8mYW1wOy9nLCcmJyk7fTtTdHJpbmcucHJvdG90eXBlLmNvbGxhcHNlV2hpdGVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL1tcc1x4QTBdKy9nLCcgJyk7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1NaWRkbGU9ZnVuY3Rpb24obWF4TGVuZ3RoKXtpZih0aGlzLmxlbmd0aDw9bWF4TGVuZ3RoKQpyZXR1cm4gU3RyaW5nKHRoaXMpO2xldCBsZWZ0SGFsZj1tYXhMZW5ndGg+PjE7bGV0IHJpZ2h0SGFsZj1tYXhMZW5ndGgtbGVmdEhhbGYtMTtpZih0aGlzLmNvZGVQb2ludEF0KHRoaXMubGVuZ3RoLXJpZ2h0SGFsZi0xKT49MHgxMDAwMCl7LS1yaWdodEhhbGY7KytsZWZ0SGFsZjt9CmlmKGxlZnRIYWxmPjAmJnRoaXMuY29kZVBvaW50QXQobGVmdEhhbGYtMSk+PTB4MTAwMDApCi0tbGVmdEhhbGY7cmV0dXJuIHRoaXMuc3Vic3RyKDAsbGVmdEhhbGYpKydcdTIwMjYnK3RoaXMuc3Vic3RyKHRoaXMubGVuZ3RoLXJpZ2h0SGFsZixyaWdodEhhbGYpO307U3RyaW5nLnByb3RvdHlwZS50cmltRW5kPWZ1bmN0aW9uKG1heExlbmd0aCl7aWYodGhpcy5sZW5ndGg8PW1heExlbmd0aCkKcmV0dXJuIFN0cmluZyh0aGlzKTtyZXR1cm4gdGhpcy5zdWJzdHIoMCxtYXhMZW5ndGgtMSkrJ1x1MjAyNic7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1VUkw9ZnVuY3Rpb24oYmFzZVVSTERvbWFpbil7bGV0IHJlc3VsdD10aGlzLnJlcGxhY2UoL14oaHR0cHN8aHR0cHxmaWxlKTpcL1wvL2ksJycpO2lmKGJhc2VVUkxEb21haW4pe2lmKHJlc3VsdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYmFzZVVSTERvbWFpbi50b0xvd2VyQ2FzZSgpKSkKcmVzdWx0PXJlc3VsdC5zdWJzdHIoYmFzZVVSTERvbWFpbi5sZW5ndGgpO30KcmV0dXJuIHJlc3VsdDt9O1N0cmluZy5wcm90b3R5cGUudG9UaXRsZUNhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3RoaXMuc3Vic3RyaW5nKDEpO307U3RyaW5nLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24ob3RoZXIpe2lmKHRoaXM+b3RoZXIpCnJldHVybiAxO2lmKHRoaXM8b3RoZXIpCnJldHVybi0xO3JldHVybiAwO307U3RyaW5nLnByb3RvdHlwZS5yZW1vdmVVUkxGcmFnbWVudD1mdW5jdGlvbigpe2xldCBmcmFnbWVudEluZGV4PXRoaXMuaW5kZXhPZignIycpO2lmKGZyYWdtZW50SW5kZXg9PT0tMSkKZnJhZ21lbnRJbmRleD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCxmcmFnbWVudEluZGV4KTt9O1N0cmluZy5oYXNoQ29kZT1mdW5jdGlvbihzdHJpbmcpe2lmKCFzdHJpbmcpCnJldHVybiAwO2NvbnN0IHA9KCgxPDwzMCkqNC01KTtjb25zdCB6PTB4NTAzM2Q5Njc7Y29uc3QgejI9MHg1OWQyZjE1ZDtsZXQgcz0wO2xldCB6aT0xO2ZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKyspe2NvbnN0IHhpPXN0cmluZy5jaGFyQ29kZUF0KGkpKnoyO3M9KHMremkqeGkpJXA7emk9KHppKnopJXA7fQpzPShzK3ppKihwLTEpKSVwO3JldHVybiBNYXRoLmFicyhzfDApO307U3RyaW5nLmlzRGlnaXRBdD1mdW5jdGlvbihzdHJpbmcsaW5kZXgpe2NvbnN0IGM9c3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO3JldHVybig0ODw9YyYmYzw9NTcpO307U3RyaW5nLnByb3RvdHlwZS50b0Jhc2U2ND1mdW5jdGlvbigpe2Z1bmN0aW9uIGVuY29kZUJpdHMoYil7cmV0dXJuIGI8MjY/Yis2NTpiPDUyP2IrNzE6Yjw2Mj9iLTQ6Yj09PTYyPzQzOmI9PT02Mz80Nzo2NTt9CmNvbnN0IGVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7Y29uc3QgZGF0YT1lbmNvZGVyLmVuY29kZSh0aGlzLnRvU3RyaW5nKCkpO2NvbnN0IG49ZGF0YS5sZW5ndGg7bGV0IGVuY29kZWQ9Jyc7aWYobj09PTApCnJldHVybiBlbmNvZGVkO2xldCBzaGlmdDtsZXQgdj0wO2ZvcihsZXQgaT0wO2k8bjtpKyspe3NoaWZ0PWklMzt2fD1kYXRhW2ldPDwoMTY+Pj5zaGlmdCYyNCk7aWYoc2hpZnQ9PT0yKXtlbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksZW5jb2RlQml0cyh2Pj4+NiY2MyksZW5jb2RlQml0cyh2JjYzKSk7dj0wO319CmlmKHNoaWZ0PT09MCkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLDYxLDYxKTtlbHNlIGlmKHNoaWZ0PT09MSkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLGVuY29kZUJpdHModj4+PjYmNjMpLDYxKTtyZXR1cm4gZW5jb2RlZDt9O1N0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yPWZ1bmN0aW9uKGEsYil7Y29uc3QgY2h1bms9L15cZCt8XlxEKy87bGV0IGNodW5rYSxjaHVua2IsYW51bSxibnVtO3doaWxlKDEpe2lmKGEpe2lmKCFiKQpyZXR1cm4gMTt9ZWxzZXtpZihiKQpyZXR1cm4tMTtlbHNlCnJldHVybiAwO30KY2h1bmthPWEubWF0Y2goY2h1bmspWzBdO2NodW5rYj1iLm1hdGNoKGNodW5rKVswXTthbnVtPSFpc05hTihjaHVua2EpO2JudW09IWlzTmFOKGNodW5rYik7aWYoYW51bSYmIWJudW0pCnJldHVybi0xO2lmKGJudW0mJiFhbnVtKQpyZXR1cm4gMTtpZihhbnVtJiZibnVtKXtjb25zdCBkaWZmPWNodW5rYS1jaHVua2I7aWYoZGlmZikKcmV0dXJuIGRpZmY7aWYoY2h1bmthLmxlbmd0aCE9PWNodW5rYi5sZW5ndGgpe2lmKCErY2h1bmthJiYhK2NodW5rYikKcmV0dXJuIGNodW5rYS5sZW5ndGgtY2h1bmtiLmxlbmd0aDtlbHNlCnJldHVybiBjaHVua2IubGVuZ3RoLWNodW5rYS5sZW5ndGg7fX1lbHNlIGlmKGNodW5rYSE9PWNodW5rYil7cmV0dXJuKGNodW5rYTxjaHVua2IpPy0xOjE7fQphPWEuc3Vic3RyaW5nKGNodW5rYS5sZW5ndGgpO2I9Yi5zdWJzdHJpbmcoY2h1bmtiLmxlbmd0aCk7fX07U3RyaW5nLmNhc2VJbnNlbnNldGl2ZUNvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXthPWEudG9VcHBlckNhc2UoKTtiPWIudG9VcHBlckNhc2UoKTtpZihhPT09YikKcmV0dXJuIDA7cmV0dXJuIGE+Yj8xOi0xO307TnVtYmVyLmNvbnN0cmFpbj1mdW5jdGlvbihudW0sbWluLG1heCl7aWYobnVtPG1pbikKbnVtPW1pbjtlbHNlIGlmKG51bT5tYXgpCm51bT1tYXg7cmV0dXJuIG51bTt9O051bWJlci5nY2Q9ZnVuY3Rpb24oYSxiKXtpZihiPT09MCkKcmV0dXJuIGE7ZWxzZQpyZXR1cm4gTnVtYmVyLmdjZChiLGElYik7fTtOdW1iZXIudG9GaXhlZElmRmxvYXRpbmc9ZnVuY3Rpb24odmFsdWUpe2lmKCF2YWx1ZXx8aXNOYU4odmFsdWUpKQpyZXR1cm4gdmFsdWU7Y29uc3QgbnVtYmVyPU51bWJlcih2YWx1ZSk7cmV0dXJuIG51bWJlciUxP251bWJlci50b0ZpeGVkKDMpOlN0cmluZyhudW1iZXIpO307RGF0ZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiFpc05hTih0aGlzLmdldFRpbWUoKSk7fTtEYXRlLnByb3RvdHlwZS50b0lTTzg2MDFDb21wYWN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbGVhZFplcm8oeCl7cmV0dXJuKHg+OT8nJzonMCcpK3g7fQpyZXR1cm4gdGhpcy5nZXRGdWxsWWVhcigpK2xlYWRaZXJvKHRoaXMuZ2V0TW9udGgoKSsxKStsZWFkWmVybyh0aGlzLmdldERhdGUoKSkrJ1QnKwpsZWFkWmVybyh0aGlzLmdldEhvdXJzKCkpK2xlYWRaZXJvKHRoaXMuZ2V0TWludXRlcygpKStsZWFkWmVybyh0aGlzLmdldFNlY29uZHMoKSk7fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdyZW1vdmUnLHt2YWx1ZTpmdW5jdGlvbih2YWx1ZSxmaXJzdE9ubHkpe2xldCBpbmRleD10aGlzLmluZGV4T2YodmFsdWUpO2lmKGluZGV4PT09LTEpCnJldHVybiBmYWxzZTtpZihmaXJzdE9ubHkpe3RoaXMuc3BsaWNlKGluZGV4LDEpO3JldHVybiB0cnVlO30KZm9yKGxldCBpPWluZGV4KzEsbj10aGlzLmxlbmd0aDtpPG47KytpKXtpZih0aGlzW2ldIT09dmFsdWUpCnRoaXNbaW5kZXgrK109dGhpc1tpXTt9CnRoaXMubGVuZ3RoPWluZGV4O3JldHVybiB0cnVlO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwdXNoQWxsJyx7dmFsdWU6ZnVuY3Rpb24oYXJyYXkpe2ZvcihsZXQgaT0wO2k8YXJyYXkubGVuZ3RoOysraSkKdGhpcy5wdXNoKGFycmF5W2ldKTt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwncm90YXRlJyx7dmFsdWU6ZnVuY3Rpb24oaW5kZXgpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9aW5kZXg7aTxpbmRleCt0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdC5wdXNoKHRoaXNbaSV0aGlzLmxlbmd0aF0pO3JldHVybiByZXN1bHQ7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3NvcnROdW1iZXJzJyx7dmFsdWU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBudW1lcmljQ29tcGFyYXRvcihhLGIpe3JldHVybiBhLWI7fQp0aGlzLnNvcnQobnVtZXJpY0NvbXBhcmF0b3IpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCdzb3J0Jyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLnNvcnR9KTsoZnVuY3Rpb24oKXtjb25zdCBwYXJ0aXRpb249e3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KXtmdW5jdGlvbiBzd2FwKGFycmF5LGkxLGkyKXtjb25zdCB0ZW1wPWFycmF5W2kxXTthcnJheVtpMV09YXJyYXlbaTJdO2FycmF5W2kyXT10ZW1wO30KY29uc3QgcGl2b3RWYWx1ZT10aGlzW3Bpdm90SW5kZXhdO3N3YXAodGhpcyxyaWdodCxwaXZvdEluZGV4KTtsZXQgc3RvcmVJbmRleD1sZWZ0O2ZvcihsZXQgaT1sZWZ0O2k8cmlnaHQ7KytpKXtpZihjb21wYXJhdG9yKHRoaXNbaV0scGl2b3RWYWx1ZSk8MCl7c3dhcCh0aGlzLHN0b3JlSW5kZXgsaSk7KytzdG9yZUluZGV4O319CnN3YXAodGhpcyxyaWdodCxzdG9yZUluZGV4KTtyZXR1cm4gc3RvcmVJbmRleDt9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwYXJ0aXRpb24nLHBhcnRpdGlvbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwncGFydGl0aW9uJyxwYXJ0aXRpb24pO2NvbnN0IHNvcnRSYW5nZT17dmFsdWU6ZnVuY3Rpb24oY29tcGFyYXRvcixsZWZ0Qm91bmQscmlnaHRCb3VuZCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2Z1bmN0aW9uIHF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IsbGVmdCxyaWdodCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2lmKHJpZ2h0PD1sZWZ0KQpyZXR1cm47Y29uc3QgcGl2b3RJbmRleD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHJpZ2h0LWxlZnQpKStsZWZ0O2NvbnN0IHBpdm90TmV3SW5kZXg9YXJyYXkucGFydGl0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KTtpZihzb3J0V2luZG93TGVmdDxwaXZvdE5ld0luZGV4KQpxdWlja1NvcnRSYW5nZShhcnJheSxjb21wYXJhdG9yLGxlZnQscGl2b3ROZXdJbmRleC0xLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7aWYocGl2b3ROZXdJbmRleDxzb3J0V2luZG93UmlnaHQpCnF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IscGl2b3ROZXdJbmRleCsxLHJpZ2h0LHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7fQppZihsZWZ0Qm91bmQ9PT0wJiZyaWdodEJvdW5kPT09KHRoaXMubGVuZ3RoLTEpJiZzb3J0V2luZG93TGVmdD09PTAmJnNvcnRXaW5kb3dSaWdodD49cmlnaHRCb3VuZCkKdGhpcy5zb3J0KGNvbXBhcmF0b3IpO2Vsc2UKcXVpY2tTb3J0UmFuZ2UodGhpcyxjb21wYXJhdG9yLGxlZnRCb3VuZCxyaWdodEJvdW5kLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7cmV0dXJuIHRoaXM7fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnc29ydFJhbmdlJyxzb3J0UmFuZ2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsJ3NvcnRSYW5nZScsc29ydFJhbmdlKTt9KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3N0YWJsZVNvcnQnLHt2YWx1ZTpmdW5jdGlvbihjb21wYXJhdG9yKXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtjb25zdCBpbmRpY2VzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCmluZGljZXNbaV09aTtjb25zdCBzZWxmPXRoaXM7ZnVuY3Rpb24gaW5kZXhDb21wYXJhdG9yKGEsYil7Y29uc3QgcmVzdWx0PWNvbXBhcmF0b3Ioc2VsZlthXSxzZWxmW2JdKTtyZXR1cm4gcmVzdWx0P3Jlc3VsdDphLWI7fQppbmRpY2VzLnNvcnQoaW5kZXhDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPHRoaXMubGVuZ3RoOysraSl7aWYoaW5kaWNlc1tpXTwwfHxpPT09aW5kaWNlc1tpXSkKY29udGludWU7bGV0IGN5Y2xpY2FsPWk7Y29uc3Qgc2F2ZWQ9dGhpc1tpXTt3aGlsZSh0cnVlKXtjb25zdCBuZXh0PWluZGljZXNbY3ljbGljYWxdO2luZGljZXNbY3ljbGljYWxdPS0xO2lmKG5leHQ9PT1pKXt0aGlzW2N5Y2xpY2FsXT1zYXZlZDticmVhazt9ZWxzZXt0aGlzW2N5Y2xpY2FsXT10aGlzW25leHRdO2N5Y2xpY2FsPW5leHQ7fX19CnJldHVybiB0aGlzO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdxc2VsZWN0Jyx7dmFsdWU6ZnVuY3Rpb24oayxjb21wYXJhdG9yKXtpZihrPDB8fGs+PXRoaXMubGVuZ3RoKQpyZXR1cm47aWYoIWNvbXBhcmF0b3Ipe2NvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO307fQpsZXQgbG93PTA7bGV0IGhpZ2g9dGhpcy5sZW5ndGgtMTtmb3IoOzspe2NvbnN0IHBpdm90UG9zaXRpb249dGhpcy5wYXJ0aXRpb24oY29tcGFyYXRvcixsb3csaGlnaCxNYXRoLmZsb29yKChoaWdoK2xvdykvMikpO2lmKHBpdm90UG9zaXRpb249PT1rKQpyZXR1cm4gdGhpc1trXTtlbHNlIGlmKHBpdm90UG9zaXRpb24+aykKaGlnaD1waXZvdFBvc2l0aW9uLTE7ZWxzZQpsb3c9cGl2b3RQb3NpdGlvbisxO319fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpe2Z1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsYil7cmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO2xldCBsPWxlZnR8fDA7bGV0IHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXtjb25zdCBtPShsK3IpPj4xO2lmKGNvbXBhcmF0b3Iob2JqZWN0LHRoaXNbbV0pPjApCmw9bSsxO2Vsc2UKcj1tO30KcmV0dXJuIHI7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpmdW5jdGlvbihvYmplY3QsY29tcGFyYXRvcixsZWZ0LHJpZ2h0KXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtsZXQgbD1sZWZ0fHwwO2xldCByPXJpZ2h0IT09dW5kZWZpbmVkP3JpZ2h0OnRoaXMubGVuZ3RoO3doaWxlKGw8cil7Y29uc3QgbT0obCtyKT4+MTtpZihjb21wYXJhdG9yKG9iamVjdCx0aGlzW21dKT49MCkKbD1tKzE7ZWxzZQpyPW07fQpyZXR1cm4gcjt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS5sb3dlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwndXBwZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS51cHBlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEludDMyQXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzJBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUudXBwZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDY0QXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdiaW5hcnlJbmRleE9mJyx7dmFsdWU6ZnVuY3Rpb24odmFsdWUsY29tcGFyYXRvcil7Y29uc3QgaW5kZXg9dGhpcy5sb3dlckJvdW5kKHZhbHVlLGNvbXBhcmF0b3IpO3JldHVybiBpbmRleDx0aGlzLmxlbmd0aCYmY29tcGFyYXRvcih2YWx1ZSx0aGlzW2luZGV4XSk9PT0wP2luZGV4Oi0xO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdzZWxlY3QnLHt2YWx1ZTpmdW5jdGlvbihmaWVsZCl7Y29uc3QgcmVzdWx0PW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdFtpXT10aGlzW2ldW2ZpZWxkXTtyZXR1cm4gcmVzdWx0O319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwZWVrTGFzdCcse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV07fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIG1lcmdlT3JJbnRlcnNlY3QoYXJyYXkxLGFycmF5Mixjb21wYXJhdG9yLG1lcmdlTm90SW50ZXJzZWN0KXtjb25zdCByZXN1bHQ9W107bGV0IGk9MDtsZXQgaj0wO3doaWxlKGk8YXJyYXkxLmxlbmd0aCYmajxhcnJheTIubGVuZ3RoKXtjb25zdCBjb21wYXJlVmFsdWU9Y29tcGFyYXRvcihhcnJheTFbaV0sYXJyYXkyW2pdKTtpZihtZXJnZU5vdEludGVyc2VjdHx8IWNvbXBhcmVWYWx1ZSkKcmVzdWx0LnB1c2goY29tcGFyZVZhbHVlPD0wP2FycmF5MVtpXTphcnJheTJbal0pO2lmKGNvbXBhcmVWYWx1ZTw9MCkKaSsrO2lmKGNvbXBhcmVWYWx1ZT49MCkKaisrO30KaWYobWVyZ2VOb3RJbnRlcnNlY3Qpe3doaWxlKGk8YXJyYXkxLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkxW2krK10pO3doaWxlKGo8YXJyYXkyLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkyW2orK10pO30KcmV0dXJuIHJlc3VsdDt9Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ2ludGVyc2VjdE9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsZmFsc2UpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdtZXJnZU9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsdHJ1ZSk7fX0pO30pKCk7U3RyaW5nLnNwcmludGY9ZnVuY3Rpb24oZm9ybWF0LHZhcl9hcmcpe3JldHVybiBTdHJpbmcudnNwcmludGYoZm9ybWF0LEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7fTtTdHJpbmcudG9rZW5pemVGb3JtYXRTdHJpbmc9ZnVuY3Rpb24oZm9ybWF0LGZvcm1hdHRlcnMpe2NvbnN0IHRva2Vucz1bXTtmdW5jdGlvbiBhZGRTdHJpbmdUb2tlbihzdHIpe2lmKCFzdHIpCnJldHVybjtpZih0b2tlbnMubGVuZ3RoJiZ0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlPT09J3N0cmluZycpCnRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnZhbHVlKz1zdHI7ZWxzZQp0b2tlbnMucHVzaCh7dHlwZTonc3RyaW5nJyx2YWx1ZTpzdHJ9KTt9CmZ1bmN0aW9uIGFkZFNwZWNpZmllclRva2VuKHNwZWNpZmllcixwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpe3Rva2Vucy5wdXNoKHt0eXBlOidzcGVjaWZpZXInLHNwZWNpZmllcjpzcGVjaWZpZXIscHJlY2lzaW9uOnByZWNpc2lvbixzdWJzdGl0dXRpb25JbmRleDpzdWJzdGl0dXRpb25JbmRleH0pO30KZnVuY3Rpb24gYWRkQW5zaUNvbG9yKGNvZGUpe2NvbnN0IHR5cGVzPXszOidjb2xvcicsOTonY29sb3JMaWdodCcsNDonYmdDb2xvcicsMTA6J2JnQ29sb3JMaWdodCd9O2NvbnN0IGNvbG9yQ29kZXM9WydibGFjaycsJ3JlZCcsJ2dyZWVuJywneWVsbG93JywnYmx1ZScsJ21hZ2VudGEnLCdjeWFuJywnbGlnaHRHcmF5JywnJywnZGVmYXVsdCddO2NvbnN0IGNvbG9yQ29kZXNMaWdodD1bJ2RhcmtHcmF5JywnbGlnaHRSZWQnLCdsaWdodEdyZWVuJywnbGlnaHRZZWxsb3cnLCdsaWdodEJsdWUnLCdsaWdodE1hZ2VudGEnLCdsaWdodEN5YW4nLCd3aGl0ZScsJyddO2NvbnN0IGNvbG9ycz17Y29sb3I6Y29sb3JDb2Rlcyxjb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodCxiZ0NvbG9yOmNvbG9yQ29kZXMsYmdDb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodH07Y29uc3QgdHlwZT10eXBlc1tNYXRoLmZsb29yKGNvZGUvMTApXTtpZighdHlwZSkKcmV0dXJuO2NvbnN0IGNvbG9yPWNvbG9yc1t0eXBlXVtjb2RlJTEwXTtpZighY29sb3IpCnJldHVybjt0b2tlbnMucHVzaCh7dHlwZTonc3BlY2lmaWVyJyxzcGVjaWZpZXI6J2MnLHZhbHVlOntkZXNjcmlwdGlvbjoodHlwZS5zdGFydHNXaXRoKCdiZycpPydiYWNrZ3JvdW5kIDogJzonY29sb3I6ICcpK2NvbG9yfX0pO30KbGV0IHRleHRTdGFydD0wO2xldCBzdWJzdGl0dXRpb25JbmRleD0wO2NvbnN0IHJlPW5ldyBSZWdFeHAoYCUlfCUoPzooXFxkKylcXCQpPyg/OlxcLihcXGQqKSk/KFske09iamVjdC5rZXlzKGZvcm1hdHRlcnMpLmpvaW4oJycpfV0pfFxcdTAwMWJcXFsoXFxkKyltYCwnZycpO2ZvcihsZXQgbWF0Y2g9cmUuZXhlYyhmb3JtYXQpOyEhbWF0Y2g7bWF0Y2g9cmUuZXhlYyhmb3JtYXQpKXtjb25zdCBtYXRjaFN0YXJ0PW1hdGNoLmluZGV4O2lmKG1hdGNoU3RhcnQ+dGV4dFN0YXJ0KQphZGRTdHJpbmdUb2tlbihmb3JtYXQuc3Vic3RyaW5nKHRleHRTdGFydCxtYXRjaFN0YXJ0KSk7aWYobWF0Y2hbMF09PT0nJSUnKXthZGRTdHJpbmdUb2tlbignJScpO31lbHNlIGlmKG1hdGNoWzBdLnN0YXJ0c1dpdGgoJyUnKSl7Y29uc3RbXyxzdWJzdGl0aW9uU3RyaW5nLHByZWNpc2lvblN0cmluZyxzcGVjaWZpZXJTdHJpbmddPW1hdGNoO2lmKHN1YnN0aXRpb25TdHJpbmcmJk51bWJlcihzdWJzdGl0aW9uU3RyaW5nKT4wKQpzdWJzdGl0dXRpb25JbmRleD1OdW1iZXIoc3Vic3RpdGlvblN0cmluZyktMTtjb25zdCBwcmVjaXNpb249cHJlY2lzaW9uU3RyaW5nP051bWJlcihwcmVjaXNpb25TdHJpbmcpOi0xO2FkZFNwZWNpZmllclRva2VuKHNwZWNpZmllclN0cmluZyxwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpOysrc3Vic3RpdHV0aW9uSW5kZXg7fWVsc2V7Y29uc3QgY29kZT1OdW1iZXIobWF0Y2hbNF0pO2FkZEFuc2lDb2xvcihjb2RlKTt9CnRleHRTdGFydD1tYXRjaFN0YXJ0K21hdGNoWzBdLmxlbmd0aDt9CmFkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcodGV4dFN0YXJ0KSk7cmV0dXJuIHRva2Vuczt9O1N0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnM9e2Q6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4haXNOYU4oc3Vic3RpdHV0aW9uKT9zdWJzdGl0dXRpb246MDt9LGY6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uLHRva2VuKXtpZihzdWJzdGl0dXRpb24mJnRva2VuLnByZWNpc2lvbj4tMSkKc3Vic3RpdHV0aW9uPXN1YnN0aXR1dGlvbi50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7cmV0dXJuIWlzTmFOKHN1YnN0aXR1dGlvbik/c3Vic3RpdHV0aW9uOih0b2tlbi5wcmVjaXNpb24+LTE/TnVtYmVyKDApLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTowKTt9LHM6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4gc3Vic3RpdHV0aW9uO319O1N0cmluZy52c3ByaW50Zj1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyl7cmV0dXJuIFN0cmluZy5mb3JtYXQoZm9ybWF0LHN1YnN0aXR1dGlvbnMsU3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycywnJyxmdW5jdGlvbihhLGIpe3JldHVybiBhK2I7fSkuZm9ybWF0dGVkUmVzdWx0O307U3RyaW5nLmZvcm1hdD1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyxmb3JtYXR0ZXJzLGluaXRpYWxWYWx1ZSxhcHBlbmQsdG9rZW5pemVkRm9ybWF0KXtpZighZm9ybWF0fHwoKCFzdWJzdGl0dXRpb25zfHwhc3Vic3RpdHV0aW9ucy5sZW5ndGgpJiZmb3JtYXQuc2VhcmNoKC9cdTAwMWJcWyhcZCspbS8pPT09LTEpKQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OmFwcGVuZChpbml0aWFsVmFsdWUsZm9ybWF0KSx1bnVzZWRTdWJzdGl0dXRpb25zOnN1YnN0aXR1dGlvbnN9O2Z1bmN0aW9uIHByZXR0eUZ1bmN0aW9uTmFtZSgpe3JldHVybidTdHJpbmcuZm9ybWF0KCInK2Zvcm1hdCsnIiwgIicrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChzdWJzdGl0dXRpb25zLCciLCAiJykrJyIpJzt9CmZ1bmN0aW9uIHdhcm4obXNnKXtjb25zb2xlLndhcm4ocHJldHR5RnVuY3Rpb25OYW1lKCkrJzogJyttc2cpO30KZnVuY3Rpb24gZXJyb3IobXNnKXtjb25zb2xlLmVycm9yKHByZXR0eUZ1bmN0aW9uTmFtZSgpKyc6ICcrbXNnKTt9CmxldCByZXN1bHQ9aW5pdGlhbFZhbHVlO2NvbnN0IHRva2Vucz10b2tlbml6ZWRGb3JtYXR8fFN0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZyhmb3JtYXQsZm9ybWF0dGVycyk7Y29uc3QgdXNlZFN1YnN0aXR1dGlvbkluZGV4ZXM9e307Zm9yKGxldCBpPTA7aTx0b2tlbnMubGVuZ3RoOysraSl7Y29uc3QgdG9rZW49dG9rZW5zW2ldO2lmKHRva2VuLnR5cGU9PT0nc3RyaW5nJyl7cmVzdWx0PWFwcGVuZChyZXN1bHQsdG9rZW4udmFsdWUpO2NvbnRpbnVlO30KaWYodG9rZW4udHlwZSE9PSdzcGVjaWZpZXInKXtlcnJvcignVW5rbm93biB0b2tlbiB0eXBlICInK3Rva2VuLnR5cGUrJyIgZm91bmQuJyk7Y29udGludWU7fQppZighdG9rZW4udmFsdWUmJnRva2VuLnN1YnN0aXR1dGlvbkluZGV4Pj1zdWJzdGl0dXRpb25zLmxlbmd0aCl7ZXJyb3IoJ25vdCBlbm91Z2ggc3Vic3RpdHV0aW9uIGFyZ3VtZW50cy4gSGFkICcrc3Vic3RpdHV0aW9ucy5sZW5ndGgrJyBidXQgbmVlZGVkICcrCih0b2tlbi5zdWJzdGl0dXRpb25JbmRleCsxKSsnLCBzbyBzdWJzdGl0dXRpb24gd2FzIHNraXBwZWQuJyk7cmVzdWx0PWFwcGVuZChyZXN1bHQsJyUnKyh0b2tlbi5wcmVjaXNpb24+LTE/dG9rZW4ucHJlY2lzaW9uOicnKSt0b2tlbi5zcGVjaWZpZXIpO2NvbnRpbnVlO30KaWYoIXRva2VuLnZhbHVlKQp1c2VkU3Vic3RpdHV0aW9uSW5kZXhlc1t0b2tlbi5zdWJzdGl0dXRpb25JbmRleF09dHJ1ZTtpZighKHRva2VuLnNwZWNpZmllciBpbiBmb3JtYXR0ZXJzKSl7d2FybigndW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciBcdTIwMUMnK3Rva2VuLnNwZWNpZmllcisnXHUyMDFELiBUcmVhdGluZyBhcyBhIHN0cmluZy4nKTtyZXN1bHQ9YXBwZW5kKHJlc3VsdCx0b2tlbi52YWx1ZT8nJzpzdWJzdGl0dXRpb25zW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XSk7Y29udGludWU7fQpyZXN1bHQ9YXBwZW5kKHJlc3VsdCxmb3JtYXR0ZXJzW3Rva2VuLnNwZWNpZmllcl0odG9rZW4udmFsdWV8fHN1YnN0aXR1dGlvbnNbdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXhdLHRva2VuKSk7fQpjb25zdCB1bnVzZWRTdWJzdGl0dXRpb25zPVtdO2ZvcihsZXQgaT0wO2k8c3Vic3RpdHV0aW9ucy5sZW5ndGg7KytpKXtpZihpIGluIHVzZWRTdWJzdGl0dXRpb25JbmRleGVzKQpjb250aW51ZTt1bnVzZWRTdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uc1tpXSk7fQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OnJlc3VsdCx1bnVzZWRTdWJzdGl0dXRpb25zOnVudXNlZFN1YnN0aXR1dGlvbnN9O307ZnVuY3Rpb24gY3JlYXRlU2VhcmNoUmVnZXgocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCByZWdleEZsYWdzPWNhc2VTZW5zaXRpdmU/J2cnOidnaSc7bGV0IHJlZ2V4T2JqZWN0O2lmKGlzUmVnZXgpe3RyeXtyZWdleE9iamVjdD1uZXcgUmVnRXhwKHF1ZXJ5LHJlZ2V4RmxhZ3MpO31jYXRjaChlKXt9fQppZighcmVnZXhPYmplY3QpCnJlZ2V4T2JqZWN0PWNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LHJlZ2V4RmxhZ3MpO3JldHVybiByZWdleE9iamVjdDt9CmZ1bmN0aW9uIGNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LGZsYWdzKXtjb25zdCByZWdleFNwZWNpYWxDaGFyYWN0ZXJzPVN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCk7bGV0IHJlZ2V4PScnO2ZvcihsZXQgaT0wO2k8cXVlcnkubGVuZ3RoOysraSl7Y29uc3QgYz1xdWVyeS5jaGFyQXQoaSk7aWYocmVnZXhTcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGMpIT09LTEpCnJlZ2V4Kz0nXFwnO3JlZ2V4Kz1jO30KcmV0dXJuIG5ldyBSZWdFeHAocmVnZXgsZmxhZ3N8fCcnKTt9CmZ1bmN0aW9uIGNvdW50UmVnZXhNYXRjaGVzKHJlZ2V4LGNvbnRlbnQpe2xldCB0ZXh0PWNvbnRlbnQ7bGV0IHJlc3VsdD0wO2xldCBtYXRjaDt3aGlsZSh0ZXh0JiYobWF0Y2g9cmVnZXguZXhlYyh0ZXh0KSkpe2lmKG1hdGNoWzBdLmxlbmd0aD4wKQorK3Jlc3VsdDt0ZXh0PXRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KzEpO30KcmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIHNwYWNlc1BhZGRpbmcoc3BhY2VzQ291bnQpe3JldHVybidcdTAwYTAnLnJlcGVhdChzcGFjZXNDb3VudCk7fQpmdW5jdGlvbiBudW1iZXJUb1N0cmluZ1dpdGhTcGFjZXNQYWRkaW5nKHZhbHVlLHN5bWJvbHNDb3VudCl7Y29uc3QgbnVtYmVyU3RyaW5nPXZhbHVlLnRvU3RyaW5nKCk7Y29uc3QgcGFkZGluZ0xlbmd0aD1NYXRoLm1heCgwLHN5bWJvbHNDb3VudC1udW1iZXJTdHJpbmcubGVuZ3RoKTtyZXR1cm4gc3BhY2VzUGFkZGluZyhwYWRkaW5nTGVuZ3RoKStudW1iZXJTdHJpbmc7fQpTZXQucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtTZXQucHJvdG90eXBlLmZpcnN0VmFsdWU9ZnVuY3Rpb24oKXtpZighdGhpcy5zaXplKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7fTtTZXQucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpCnRoaXMuYWRkKGUpO307U2V0LnByb3RvdHlwZS5jb250YWluc0FsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpe2lmKCF0aGlzLmhhcyhlKSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fTtNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihrZXkpe2NvbnN0IHZhbHVlPXRoaXMuZ2V0KGtleSk7dGhpcy5kZWxldGUoa2V5KTtyZXR1cm4gdmFsdWU7fTtNYXAucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtNYXAucHJvdG90eXBlLmtleXNBcnJheT1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cygpKTt9O01hcC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpe2NvbnN0IHJlc3VsdD1uZXcgTXVsdGltYXAoKTtmb3IoY29uc3Qga2V5IG9mIHRoaXMua2V5cygpKXtjb25zdCB2YWx1ZT10aGlzLmdldChrZXkpO3Jlc3VsdC5zZXQodmFsdWUsa2V5KTt9CnJldHVybiByZXN1bHQ7fTt2YXIgTXVsdGltYXA9ZnVuY3Rpb24oKXt0aGlzLl9tYXA9bmV3IE1hcCgpO307TXVsdGltYXAucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXtsZXQgc2V0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighc2V0KXtzZXQ9bmV3IFNldCgpO3RoaXMuX21hcC5zZXQoa2V5LHNldCk7fQpzZXQuYWRkKHZhbHVlKTt9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGtleSl8fG5ldyBTZXQoKTt9LGhhczpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7fSxoYXNWYWx1ZTpmdW5jdGlvbihrZXksdmFsdWUpe2NvbnN0IHNldD10aGlzLl9tYXAuZ2V0KGtleSk7aWYoIXNldCkKcmV0dXJuIGZhbHNlO3JldHVybiBzZXQuaGFzKHZhbHVlKTt9LGdldCBzaXplKCl7cmV0dXJuIHRoaXMuX21hcC5zaXplO30sZGVsZXRlOmZ1bmN0aW9uKGtleSx2YWx1ZSl7Y29uc3QgdmFsdWVzPXRoaXMuZ2V0KGtleSk7aWYoIXZhbHVlcykKcmV0dXJuIGZhbHNlO2NvbnN0IHJlc3VsdD12YWx1ZXMuZGVsZXRlKHZhbHVlKTtpZighdmFsdWVzLnNpemUpCnRoaXMuX21hcC5kZWxldGUoa2V5KTtyZXR1cm4gcmVzdWx0O30sZGVsZXRlQWxsOmZ1bmN0aW9uKGtleSl7dGhpcy5fbWFwLmRlbGV0ZShrZXkpO30sa2V5c0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5rZXlzQXJyYXkoKTt9LHZhbHVlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGtleXM9dGhpcy5rZXlzQXJyYXkoKTtmb3IobGV0IGk9MDtpPGtleXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2hBbGwodGhpcy5nZXQoa2V5c1tpXSkudmFsdWVzQXJyYXkoKSk7cmV0dXJuIHJlc3VsdDt9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLmNsZWFyKCk7fX07ZnVuY3Rpb24gbG9hZFhIUih1cmwpe3JldHVybiBuZXcgUHJvbWlzZShsb2FkKTtmdW5jdGlvbiBsb2FkKHN1Y2Nlc3NDYWxsYmFjayxmYWlsdXJlQ2FsbGJhY2spe2Z1bmN0aW9uIG9uUmVhZHlTdGF0ZUNoYW5nZWQoKXtpZih4aHIucmVhZHlTdGF0ZSE9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpCnJldHVybjtpZih4aHIuc3RhdHVzIT09MjAwKXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7ZmFpbHVyZUNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzKSk7cmV0dXJuO30KeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3N1Y2Nlc3NDYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTt9CmNvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIud2l0aENyZWRlbnRpYWxzPWZhbHNlO3hoci5vcGVuKCdHRVQnLHVybCx0cnVlKTt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW9uUmVhZHlTdGF0ZUNoYW5nZWQ7eGhyLnNlbmQobnVsbCk7fX0KZnVuY3Rpb24gc3VwcHJlc3NVbnVzZWQodmFsdWUpe30Kc2VsZi5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oY2FsbGJhY2spe2NvbnN0IGFyZ3M9Wy4uLmFyZ3VtZW50c10uc2xpY2UoMSk7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Y2FsbGJhY2soLi4uYXJncykpO3JldHVybiAwO307UHJvbWlzZS5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKGNhbGxiYWNrKXtyZXR1cm4gdGhpcy50aGVuKHNwcmVhZFByb21pc2UpO2Z1bmN0aW9uIHNwcmVhZFByb21pc2UoYXJnKXtyZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCxhcmcpO319O1Byb21pc2UucHJvdG90eXBlLmNhdGNoRXhjZXB0aW9uPWZ1bmN0aW9uKGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHRoaXMuY2F0Y2goZnVuY3Rpb24oZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybiBkZWZhdWx0VmFsdWU7fSk7fTtNYXAucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24ob3RoZXIsaXNFcXVhbCl7Y29uc3QgbGVmdEtleXM9dGhpcy5rZXlzQXJyYXkoKTtjb25zdCByaWdodEtleXM9b3RoZXIua2V5c0FycmF5KCk7bGVmdEtleXMuc29ydCgoYSxiKT0+YS1iKTtyaWdodEtleXMuc29ydCgoYSxiKT0+YS1iKTtjb25zdCByZW1vdmVkPVtdO2NvbnN0IGFkZGVkPVtdO2NvbnN0IGVxdWFsPVtdO2xldCBsZWZ0SW5kZXg9MDtsZXQgcmlnaHRJbmRleD0wO3doaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgmJnJpZ2h0SW5kZXg8cmlnaHRLZXlzLmxlbmd0aCl7Y29uc3QgbGVmdEtleT1sZWZ0S2V5c1tsZWZ0SW5kZXhdO2NvbnN0IHJpZ2h0S2V5PXJpZ2h0S2V5c1tyaWdodEluZGV4XTtpZihsZWZ0S2V5PT09cmlnaHRLZXkmJmlzRXF1YWwodGhpcy5nZXQobGVmdEtleSksb3RoZXIuZ2V0KHJpZ2h0S2V5KSkpe2VxdWFsLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4OysrcmlnaHRJbmRleDtjb250aW51ZTt9CmlmKGxlZnRLZXk8PXJpZ2h0S2V5KXtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4O2NvbnRpbnVlO30KYWRkZWQucHVzaChvdGhlci5nZXQocmlnaHRLZXkpKTsrK3JpZ2h0SW5kZXg7fQp3aGlsZShsZWZ0SW5kZXg8bGVmdEtleXMubGVuZ3RoKXtjb25zdCBsZWZ0S2V5PWxlZnRLZXlzW2xlZnRJbmRleCsrXTtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpO30Kd2hpbGUocmlnaHRJbmRleDxyaWdodEtleXMubGVuZ3RoKXtjb25zdCByaWdodEtleT1yaWdodEtleXNbcmlnaHRJbmRleCsrXTthZGRlZC5wdXNoKG90aGVyLmdldChyaWdodEtleSkpO30KcmV0dXJue2FkZGVkOmFkZGVkLHJlbW92ZWQ6cmVtb3ZlZCxlcXVhbDplcXVhbH07fTtmdW5jdGlvbiBydW5PbldpbmRvd0xvYWQoY2FsbGJhY2spe2Z1bmN0aW9uIHdpbmRvd0xvYWRlZCgpe3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsd2luZG93TG9hZGVkLGZhbHNlKTtjYWxsYmFjaygpO30KaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdjb21wbGV0ZSd8fGRvY3VtZW50LnJlYWR5U3RhdGU9PT0naW50ZXJhY3RpdmUnKQpjYWxsYmFjaygpO2Vsc2UKc2VsZi5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJyx3aW5kb3dMb2FkZWQsZmFsc2UpO30KY29uc3QgX3NpbmdsZXRvblN5bWJvbD1TeW1ib2woJ3NpbmdsZXRvbicpO2Z1bmN0aW9uIHNpbmdsZXRvbihjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihfc2luZ2xldG9uU3ltYm9sIGluIGNvbnN0cnVjdG9yRnVuY3Rpb24pCnJldHVybiBjb25zdHJ1Y3RvckZ1bmN0aW9uW19zaW5nbGV0b25TeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltfc2luZ2xldG9uU3ltYm9sXT1pbnN0YW5jZTtyZXR1cm4gaW5zdGFuY2U7fTtzZWxmWydUZXh0VXRpbHMnXT1zZWxmWydUZXh0VXRpbHMnXXx8e307VGV4dFV0aWxzLlRleHQ9Y2xhc3N7Y29uc3RydWN0b3IodmFsdWUpe3RoaXMuX3ZhbHVlPXZhbHVlO30KbGluZUVuZGluZ3MoKXtpZighdGhpcy5fbGluZUVuZGluZ3MpCnRoaXMuX2xpbmVFbmRpbmdzPXRoaXMuX3ZhbHVlLmNvbXB1dGVMaW5lRW5kaW5ncygpO3JldHVybiB0aGlzLl9saW5lRW5kaW5nczt9CnZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlO30KbGluZUNvdW50KCl7Y29uc3QgbGluZUVuZGluZ3M9dGhpcy5saW5lRW5kaW5ncygpO3JldHVybiBsaW5lRW5kaW5ncy5sZW5ndGg7fQpvZmZzZXRGcm9tUG9zaXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybihsaW5lTnVtYmVyP3RoaXMubGluZUVuZGluZ3MoKVtsaW5lTnVtYmVyLTFdKzE6MCkrY29sdW1uTnVtYmVyO30KcG9zaXRpb25Gcm9tT2Zmc2V0KG9mZnNldCl7Y29uc3QgbGluZUVuZGluZ3M9dGhpcy5saW5lRW5kaW5ncygpO2NvbnN0IGxpbmVOdW1iZXI9bGluZUVuZGluZ3MubG93ZXJCb3VuZChvZmZzZXQpO3JldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOm9mZnNldC0obGluZU51bWJlciYmKGxpbmVFbmRpbmdzW2xpbmVOdW1iZXItMV0rMSkpfTt9CmxpbmVBdChsaW5lTnVtYmVyKXtjb25zdCBsaW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzKCk7Y29uc3QgbGluZVN0YXJ0PWxpbmVOdW1iZXI+MD9saW5lRW5kaW5nc1tsaW5lTnVtYmVyLTFdKzE6MDtjb25zdCBsaW5lRW5kPWxpbmVFbmRpbmdzW2xpbmVOdW1iZXJdO2xldCBsaW5lQ29udGVudD10aGlzLl92YWx1ZS5zdWJzdHJpbmcobGluZVN0YXJ0LGxpbmVFbmQpO2lmKGxpbmVDb250ZW50Lmxlbmd0aD4wJiZsaW5lQ29udGVudC5jaGFyQXQobGluZUNvbnRlbnQubGVuZ3RoLTEpPT09J1xyJykKbGluZUNvbnRlbnQ9bGluZUNvbnRlbnQuc3Vic3RyaW5nKDAsbGluZUNvbnRlbnQubGVuZ3RoLTEpO3JldHVybiBsaW5lQ29udGVudDt9CnRvU291cmNlUmFuZ2UocmFuZ2Upe2NvbnN0IHN0YXJ0PXRoaXMub2Zmc2V0RnJvbVBvc2l0aW9uKHJhbmdlLnN0YXJ0TGluZSxyYW5nZS5zdGFydENvbHVtbik7Y29uc3QgZW5kPXRoaXMub2Zmc2V0RnJvbVBvc2l0aW9uKHJhbmdlLmVuZExpbmUscmFuZ2UuZW5kQ29sdW1uKTtyZXR1cm4gbmV3IFRleHRVdGlscy5Tb3VyY2VSYW5nZShzdGFydCxlbmQtc3RhcnQpO30KdG9UZXh0UmFuZ2Uoc291cmNlUmFuZ2Upe2NvbnN0IGN1cnNvcj1uZXcgVGV4dFV0aWxzLlRleHRDdXJzb3IodGhpcy5saW5lRW5kaW5ncygpKTtjb25zdCByZXN1bHQ9VGV4dFV0aWxzLlRleHRSYW5nZS5jcmVhdGVGcm9tTG9jYXRpb24oMCwwKTtjdXJzb3IucmVzZXRUbyhzb3VyY2VSYW5nZS5vZmZzZXQpO3Jlc3VsdC5zdGFydExpbmU9Y3Vyc29yLmxpbmVOdW1iZXIoKTtyZXN1bHQuc3RhcnRDb2x1bW49Y3Vyc29yLmNvbHVtbk51bWJlcigpO2N1cnNvci5hZHZhbmNlKHNvdXJjZVJhbmdlLm9mZnNldCtzb3VyY2VSYW5nZS5sZW5ndGgpO3Jlc3VsdC5lbmRMaW5lPWN1cnNvci5saW5lTnVtYmVyKCk7cmVzdWx0LmVuZENvbHVtbj1jdXJzb3IuY29sdW1uTnVtYmVyKCk7cmV0dXJuIHJlc3VsdDt9CnJlcGxhY2VSYW5nZShyYW5nZSxyZXBsYWNlbWVudCl7Y29uc3Qgc291cmNlUmFuZ2U9dGhpcy50b1NvdXJjZVJhbmdlKHJhbmdlKTtyZXR1cm4gdGhpcy5fdmFsdWUuc3Vic3RyaW5nKDAsc291cmNlUmFuZ2Uub2Zmc2V0KStyZXBsYWNlbWVudCsKdGhpcy5fdmFsdWUuc3Vic3RyaW5nKHNvdXJjZVJhbmdlLm9mZnNldCtzb3VyY2VSYW5nZS5sZW5ndGgpO30KZXh0cmFjdChyYW5nZSl7Y29uc3Qgc291cmNlUmFuZ2U9dGhpcy50b1NvdXJjZVJhbmdlKHJhbmdlKTtyZXR1cm4gdGhpcy5fdmFsdWUuc3Vic3RyKHNvdXJjZVJhbmdlLm9mZnNldCxzb3VyY2VSYW5nZS5sZW5ndGgpO319O1RleHRVdGlscy5UZXh0LlBvc2l0aW9uO1RleHRVdGlscy5UZXh0Q3Vyc29yPWNsYXNze2NvbnN0cnVjdG9yKGxpbmVFbmRpbmdzKXt0aGlzLl9saW5lRW5kaW5ncz1saW5lRW5kaW5nczt0aGlzLl9vZmZzZXQ9MDt0aGlzLl9saW5lTnVtYmVyPTA7dGhpcy5fY29sdW1uTnVtYmVyPTA7fQphZHZhbmNlKG9mZnNldCl7dGhpcy5fb2Zmc2V0PW9mZnNldDt3aGlsZSh0aGlzLl9saW5lTnVtYmVyPHRoaXMuX2xpbmVFbmRpbmdzLmxlbmd0aCYmdGhpcy5fbGluZUVuZGluZ3NbdGhpcy5fbGluZU51bWJlcl08dGhpcy5fb2Zmc2V0KQorK3RoaXMuX2xpbmVOdW1iZXI7dGhpcy5fY29sdW1uTnVtYmVyPXRoaXMuX2xpbmVOdW1iZXI/dGhpcy5fb2Zmc2V0LXRoaXMuX2xpbmVFbmRpbmdzW3RoaXMuX2xpbmVOdW1iZXItMV0tMTp0aGlzLl9vZmZzZXQ7fQpvZmZzZXQoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0O30KcmVzZXRUbyhvZmZzZXQpe3RoaXMuX29mZnNldD1vZmZzZXQ7dGhpcy5fbGluZU51bWJlcj10aGlzLl9saW5lRW5kaW5ncy5sb3dlckJvdW5kKG9mZnNldCk7dGhpcy5fY29sdW1uTnVtYmVyPXRoaXMuX2xpbmVOdW1iZXI/dGhpcy5fb2Zmc2V0LXRoaXMuX2xpbmVFbmRpbmdzW3RoaXMuX2xpbmVOdW1iZXItMV0tMTp0aGlzLl9vZmZzZXQ7fQpsaW5lTnVtYmVyKCl7cmV0dXJuIHRoaXMuX2xpbmVOdW1iZXI7fQpjb2x1bW5OdW1iZXIoKXtyZXR1cm4gdGhpcy5fY29sdW1uTnVtYmVyO319OztUZXh0VXRpbHMuVGV4dFV0aWxzPXtpc1N0b3BDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybihjaGFyPicgJyYmY2hhcjwnMCcpfHwoY2hhcj4nOScmJmNoYXI8J0EnKXx8KGNoYXI+J1onJiZjaGFyPCdfJyl8fChjaGFyPidfJyYmY2hhcjwnYScpfHwoY2hhcj4neicmJmNoYXI8PSd+Jyk7fSxpc1dvcmRDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiFUZXh0VXRpbHMuVGV4dFV0aWxzLmlzU3RvcENoYXIoY2hhcikmJiFUZXh0VXRpbHMuVGV4dFV0aWxzLmlzU3BhY2VDaGFyKGNoYXIpO30saXNTcGFjZUNoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuIFRleHRVdGlscy5UZXh0VXRpbHMuX1NwYWNlQ2hhclJlZ2V4LnRlc3QoY2hhcik7fSxpc1dvcmQ6ZnVuY3Rpb24od29yZCl7Zm9yKGxldCBpPTA7aTx3b3JkLmxlbmd0aDsrK2kpe2lmKCFUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIod29yZC5jaGFyQXQoaSkpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9LGlzT3BlbmluZ0JyYWNlQ2hhcjpmdW5jdGlvbihjaGFyKXtyZXR1cm4gY2hhcj09PScoJ3x8Y2hhcj09PSd7Jzt9LGlzQ2xvc2luZ0JyYWNlQ2hhcjpmdW5jdGlvbihjaGFyKXtyZXR1cm4gY2hhcj09PScpJ3x8Y2hhcj09PSd9Jzt9LGlzQnJhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiBUZXh0VXRpbHMuVGV4dFV0aWxzLmlzT3BlbmluZ0JyYWNlQ2hhcihjaGFyKXx8VGV4dFV0aWxzLlRleHRVdGlscy5pc0Nsb3NpbmdCcmFjZUNoYXIoY2hhcik7fSx0ZXh0VG9Xb3JkczpmdW5jdGlvbih0ZXh0LGlzV29yZENoYXIsd29yZENhbGxiYWNrKXtsZXQgc3RhcnRXb3JkPS0xO2ZvcihsZXQgaT0wO2k8dGV4dC5sZW5ndGg7KytpKXtpZighaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpKSkpe2lmKHN0YXJ0V29yZCE9PS0xKQp3b3JkQ2FsbGJhY2sodGV4dC5zdWJzdHJpbmcoc3RhcnRXb3JkLGkpKTtzdGFydFdvcmQ9LTE7fWVsc2UgaWYoc3RhcnRXb3JkPT09LTEpe3N0YXJ0V29yZD1pO319CmlmKHN0YXJ0V29yZCE9PS0xKQp3b3JkQ2FsbGJhY2sodGV4dC5zdWJzdHJpbmcoc3RhcnRXb3JkKSk7fSxsaW5lSW5kZW50OmZ1bmN0aW9uKGxpbmUpe2xldCBpbmRlbnRhdGlvbj0wO3doaWxlKGluZGVudGF0aW9uPGxpbmUubGVuZ3RoJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzU3BhY2VDaGFyKGxpbmUuY2hhckF0KGluZGVudGF0aW9uKSkpCisraW5kZW50YXRpb247cmV0dXJuIGxpbmUuc3Vic3RyKDAsaW5kZW50YXRpb24pO30saXNVcHBlckNhc2U6ZnVuY3Rpb24odGV4dCl7cmV0dXJuIHRleHQ9PT10ZXh0LnRvVXBwZXJDYXNlKCk7fSxpc0xvd2VyQ2FzZTpmdW5jdGlvbih0ZXh0KXtyZXR1cm4gdGV4dD09PXRleHQudG9Mb3dlckNhc2UoKTt9LHNwbGl0U3RyaW5nQnlSZWdleGVzKHRleHQscmVnZXhlcyl7Y29uc3QgbWF0Y2hlcz1bXTtjb25zdCBnbG9iYWxSZWdleGVzPVtdO2ZvcihsZXQgaT0wO2k8cmVnZXhlcy5sZW5ndGg7aSsrKXtjb25zdCByZWdleD1yZWdleGVzW2ldO2lmKCFyZWdleC5nbG9iYWwpCmdsb2JhbFJlZ2V4ZXMucHVzaChuZXcgUmVnRXhwKHJlZ2V4LnNvdXJjZSxyZWdleC5mbGFncz9yZWdleC5mbGFncysnZyc6J2cnKSk7ZWxzZQpnbG9iYWxSZWdleGVzLnB1c2gocmVnZXgpO30KZG9TcGxpdCh0ZXh0LDAsMCk7cmV0dXJuIG1hdGNoZXM7ZnVuY3Rpb24gZG9TcGxpdCh0ZXh0LHJlZ2V4SW5kZXgsc3RhcnRJbmRleCl7aWYocmVnZXhJbmRleD49Z2xvYmFsUmVnZXhlcy5sZW5ndGgpe21hdGNoZXMucHVzaCh7dmFsdWU6dGV4dCxwb3NpdGlvbjpzdGFydEluZGV4LHJlZ2V4SW5kZXg6LTEsY2FwdHVyZUdyb3VwczpbXX0pO3JldHVybjt9CmNvbnN0IHJlZ2V4PWdsb2JhbFJlZ2V4ZXNbcmVnZXhJbmRleF07bGV0IGN1cnJlbnRJbmRleD0wO2xldCByZXN1bHQ7cmVnZXgubGFzdEluZGV4PTA7d2hpbGUoKHJlc3VsdD1yZWdleC5leGVjKHRleHQpKSE9PW51bGwpe2NvbnN0IHN0cmluZ0JlZm9yZU1hdGNoPXRleHQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCxyZXN1bHQuaW5kZXgpO2lmKHN0cmluZ0JlZm9yZU1hdGNoKQpkb1NwbGl0KHN0cmluZ0JlZm9yZU1hdGNoLHJlZ2V4SW5kZXgrMSxzdGFydEluZGV4K2N1cnJlbnRJbmRleCk7Y29uc3QgbWF0Y2g9cmVzdWx0WzBdO21hdGNoZXMucHVzaCh7dmFsdWU6bWF0Y2gscG9zaXRpb246c3RhcnRJbmRleCtyZXN1bHQuaW5kZXgscmVnZXhJbmRleDpyZWdleEluZGV4LGNhcHR1cmVHcm91cHM6cmVzdWx0LnNsaWNlKDEpfSk7Y3VycmVudEluZGV4PXJlc3VsdC5pbmRleCttYXRjaC5sZW5ndGg7fQpjb25zdCBzdHJpbmdBZnRlck1hdGNoZXM9dGV4dC5zdWJzdHJpbmcoY3VycmVudEluZGV4KTtpZihzdHJpbmdBZnRlck1hdGNoZXMpCmRvU3BsaXQoc3RyaW5nQWZ0ZXJNYXRjaGVzLHJlZ2V4SW5kZXgrMSxzdGFydEluZGV4K2N1cnJlbnRJbmRleCk7fX19O1RleHRVdGlscy5GaWx0ZXJQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3Ioa2V5cyl7dGhpcy5fa2V5cz1rZXlzO30Kc3RhdGljIGNsb25lRmlsdGVyKGZpbHRlcil7cmV0dXJue2tleTpmaWx0ZXIua2V5LHRleHQ6ZmlsdGVyLnRleHQscmVnZXg6ZmlsdGVyLnJlZ2V4LG5lZ2F0aXZlOmZpbHRlci5uZWdhdGl2ZX07fQpwYXJzZShxdWVyeSl7Y29uc3Qgc3BsaXRSZXN1bHQ9VGV4dFV0aWxzLlRleHRVdGlscy5zcGxpdFN0cmluZ0J5UmVnZXhlcyhxdWVyeSxbVGV4dFV0aWxzLlRleHRVdGlscy5fa2V5VmFsdWVGaWx0ZXJSZWdleCxUZXh0VXRpbHMuVGV4dFV0aWxzLl9yZWdleEZpbHRlclJlZ2V4LFRleHRVdGlscy5UZXh0VXRpbHMuX3RleHRGaWx0ZXJSZWdleF0pO2NvbnN0IGZpbHRlcnM9W107Zm9yKGxldCBpPTA7aTxzcGxpdFJlc3VsdC5sZW5ndGg7aSsrKXtjb25zdCByZWdleEluZGV4PXNwbGl0UmVzdWx0W2ldLnJlZ2V4SW5kZXg7aWYocmVnZXhJbmRleD09PS0xKQpjb250aW51ZTtjb25zdCByZXN1bHQ9c3BsaXRSZXN1bHRbaV0uY2FwdHVyZUdyb3VwcztpZihyZWdleEluZGV4PT09MCl7aWYodGhpcy5fa2V5cy5pbmRleE9mKChyZXN1bHRbMV0pKSE9PS0xKQpmaWx0ZXJzLnB1c2goe2tleTpyZXN1bHRbMV0sdGV4dDpyZXN1bHRbMl0sbmVnYXRpdmU6ISFyZXN1bHRbMF19KTtlbHNlCmZpbHRlcnMucHVzaCh7dGV4dDpyZXN1bHRbMV0rJzonK3Jlc3VsdFsyXSxuZWdhdGl2ZTohIXJlc3VsdFswXX0pO31lbHNlIGlmKHJlZ2V4SW5kZXg9PT0xKXt0cnl7ZmlsdGVycy5wdXNoKHtyZWdleDpuZXcgUmVnRXhwKHJlc3VsdFsxXSwnaScpLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fWNhdGNoKGUpe2ZpbHRlcnMucHVzaCh7dGV4dDonLycrcmVzdWx0WzFdKycvJyxuZWdhdGl2ZTohIXJlc3VsdFswXX0pO319ZWxzZSBpZihyZWdleEluZGV4PT09Mil7ZmlsdGVycy5wdXNoKHt0ZXh0OnJlc3VsdFsxXSxuZWdhdGl2ZTohIXJlc3VsdFswXX0pO319CnJldHVybiBmaWx0ZXJzO319O1RleHRVdGlscy5GaWx0ZXJQYXJzZXIuUGFyc2VkRmlsdGVyO1RleHRVdGlscy5UZXh0VXRpbHMuX2tleVZhbHVlRmlsdGVyUmVnZXg9Lyg/Ol58XHMpKFwtKT8oW1x3XC1dKyk6KFteXHNdKykvO1RleHRVdGlscy5UZXh0VXRpbHMuX3JlZ2V4RmlsdGVyUmVnZXg9Lyg/Ol58XHMpKFwtKT9cLyhbXlxzXSspXC8vO1RleHRVdGlscy5UZXh0VXRpbHMuX3RleHRGaWx0ZXJSZWdleD0vKD86XnxccykoXC0pPyhbXlxzXSspLztUZXh0VXRpbHMuVGV4dFV0aWxzLl9TcGFjZUNoYXJSZWdleD0vXHMvO1RleHRVdGlscy5UZXh0VXRpbHMuSW5kZW50PXtUd29TcGFjZXM6JyAgJyxGb3VyU3BhY2VzOicgICAgJyxFaWdodFNwYWNlczonICAgICAgICAnLFRhYkNoYXJhY3RlcjonXHQnfTtUZXh0VXRpbHMuVGV4dFV0aWxzLkJhbGFuY2VkSlNPTlRva2VuaXplcj1jbGFzc3tjb25zdHJ1Y3RvcihjYWxsYmFjayxmaW5kTXVsdGlwbGUpe3RoaXMuX2NhbGxiYWNrPWNhbGxiYWNrO3RoaXMuX2luZGV4PTA7dGhpcy5fYmFsYW5jZT0wO3RoaXMuX2J1ZmZlcj0nJzt0aGlzLl9maW5kTXVsdGlwbGU9ZmluZE11bHRpcGxlfHxmYWxzZTt0aGlzLl9jbG9zaW5nRG91YmxlUXVvdGVSZWdleD0vW15cXF0oPzpcXFxcKSoiL2c7fQp3cml0ZShjaHVuayl7dGhpcy5fYnVmZmVyKz1jaHVuaztjb25zdCBsYXN0SW5kZXg9dGhpcy5fYnVmZmVyLmxlbmd0aDtjb25zdCBidWZmZXI9dGhpcy5fYnVmZmVyO2xldCBpbmRleDtmb3IoaW5kZXg9dGhpcy5faW5kZXg7aW5kZXg8bGFzdEluZGV4OysraW5kZXgpe2NvbnN0IGNoYXJhY3Rlcj1idWZmZXJbaW5kZXhdO2lmKGNoYXJhY3Rlcj09PSciJyl7dGhpcy5fY2xvc2luZ0RvdWJsZVF1b3RlUmVnZXgubGFzdEluZGV4PWluZGV4O2lmKCF0aGlzLl9jbG9zaW5nRG91YmxlUXVvdGVSZWdleC50ZXN0KGJ1ZmZlcikpCmJyZWFrO2luZGV4PXRoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4Lmxhc3RJbmRleC0xO31lbHNlIGlmKGNoYXJhY3Rlcj09PSd7Jyl7Kyt0aGlzLl9iYWxhbmNlO31lbHNlIGlmKGNoYXJhY3Rlcj09PSd9Jyl7LS10aGlzLl9iYWxhbmNlO2lmKHRoaXMuX2JhbGFuY2U8MCl7dGhpcy5fcmVwb3J0QmFsYW5jZWQoKTtyZXR1cm4gZmFsc2U7fQppZighdGhpcy5fYmFsYW5jZSl7dGhpcy5fbGFzdEJhbGFuY2VkSW5kZXg9aW5kZXgrMTtpZighdGhpcy5fZmluZE11bHRpcGxlKQpicmVhazt9fWVsc2UgaWYoY2hhcmFjdGVyPT09J10nJiYhdGhpcy5fYmFsYW5jZSl7dGhpcy5fcmVwb3J0QmFsYW5jZWQoKTtyZXR1cm4gZmFsc2U7fX0KdGhpcy5faW5kZXg9aW5kZXg7dGhpcy5fcmVwb3J0QmFsYW5jZWQoKTtyZXR1cm4gdHJ1ZTt9Cl9yZXBvcnRCYWxhbmNlZCgpe2lmKCF0aGlzLl9sYXN0QmFsYW5jZWRJbmRleCkKcmV0dXJuO3RoaXMuX2NhbGxiYWNrKHRoaXMuX2J1ZmZlci5zbGljZSgwLHRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KSk7dGhpcy5fYnVmZmVyPXRoaXMuX2J1ZmZlci5zbGljZSh0aGlzLl9sYXN0QmFsYW5jZWRJbmRleCk7dGhpcy5faW5kZXgtPXRoaXMuX2xhc3RCYWxhbmNlZEluZGV4O3RoaXMuX2xhc3RCYWxhbmNlZEluZGV4PTA7fQpyZW1haW5kZXIoKXtyZXR1cm4gdGhpcy5fYnVmZmVyO319O1RleHRVdGlscy5Ub2tlbml6ZXJGYWN0b3J5PWZ1bmN0aW9uKCl7fTtUZXh0VXRpbHMuVG9rZW5pemVyRmFjdG9yeS5wcm90b3R5cGU9e2NyZWF0ZVRva2VuaXplcihtaW1lVHlwZSl7fX07VGV4dFV0aWxzLmlzTWluaWZpZWQ9ZnVuY3Rpb24odGV4dCl7Y29uc3Qga01heE5vbk1pbmlmaWVkTGVuZ3RoPTUwMDtsZXQgbGluZXNUb0NoZWNrPTEwO2xldCBsYXN0UG9zaXRpb249MDtkb3tsZXQgZW9sSW5kZXg9dGV4dC5pbmRleE9mKCdcbicsbGFzdFBvc2l0aW9uKTtpZihlb2xJbmRleDwwKQplb2xJbmRleD10ZXh0Lmxlbmd0aDtpZihlb2xJbmRleC1sYXN0UG9zaXRpb24+a01heE5vbk1pbmlmaWVkTGVuZ3RoJiZ0ZXh0LnN1YnN0cihsYXN0UG9zaXRpb24sMykhPT0nLy8jJykKcmV0dXJuIHRydWU7bGFzdFBvc2l0aW9uPWVvbEluZGV4KzE7fXdoaWxlKC0tbGluZXNUb0NoZWNrPj0wJiZsYXN0UG9zaXRpb248dGV4dC5sZW5ndGgpO2xpbmVzVG9DaGVjaz0xMDtsYXN0UG9zaXRpb249dGV4dC5sZW5ndGg7ZG97bGV0IGVvbEluZGV4PXRleHQubGFzdEluZGV4T2YoJ1xuJyxsYXN0UG9zaXRpb24pO2lmKGVvbEluZGV4PDApCmVvbEluZGV4PTA7aWYobGFzdFBvc2l0aW9uLWVvbEluZGV4PmtNYXhOb25NaW5pZmllZExlbmd0aCYmdGV4dC5zdWJzdHIobGFzdFBvc2l0aW9uLDMpIT09Jy8vIycpCnJldHVybiB0cnVlO2xhc3RQb3NpdGlvbj1lb2xJbmRleC0xO313aGlsZSgtLWxpbmVzVG9DaGVjaz49MCYmbGFzdFBvc2l0aW9uPjApO3JldHVybiBmYWxzZTt9OztUZXh0VXRpbHMuVGV4dFJhbmdlPWNsYXNze2NvbnN0cnVjdG9yKHN0YXJ0TGluZSxzdGFydENvbHVtbixlbmRMaW5lLGVuZENvbHVtbil7dGhpcy5zdGFydExpbmU9c3RhcnRMaW5lO3RoaXMuc3RhcnRDb2x1bW49c3RhcnRDb2x1bW47dGhpcy5lbmRMaW5lPWVuZExpbmU7dGhpcy5lbmRDb2x1bW49ZW5kQ29sdW1uO30Kc3RhdGljIGNyZWF0ZUZyb21Mb2NhdGlvbihsaW5lLGNvbHVtbil7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGxpbmUsY29sdW1uLGxpbmUsY29sdW1uKTt9CnN0YXRpYyBmcm9tT2JqZWN0KHNlcmlhbGl6ZWRUZXh0UmFuZ2Upe3JldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0TGluZSxzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0Q29sdW1uLHNlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kTGluZSxzZXJpYWxpemVkVGV4dFJhbmdlLmVuZENvbHVtbik7fQpzdGF0aWMgY29tcGFyYXRvcihyYW5nZTEscmFuZ2UyKXtyZXR1cm4gcmFuZ2UxLmNvbXBhcmVUbyhyYW5nZTIpO30Kc3RhdGljIGZyb21FZGl0KG9sZFJhbmdlLG5ld1RleHQpe2xldCBlbmRMaW5lPW9sZFJhbmdlLnN0YXJ0TGluZTtsZXQgZW5kQ29sdW1uPW9sZFJhbmdlLnN0YXJ0Q29sdW1uK25ld1RleHQubGVuZ3RoO2NvbnN0IGxpbmVFbmRpbmdzPW5ld1RleHQuY29tcHV0ZUxpbmVFbmRpbmdzKCk7aWYobGluZUVuZGluZ3MubGVuZ3RoPjEpe2VuZExpbmU9b2xkUmFuZ2Uuc3RhcnRMaW5lK2xpbmVFbmRpbmdzLmxlbmd0aC0xO2NvbnN0IGxlbj1saW5lRW5kaW5ncy5sZW5ndGg7ZW5kQ29sdW1uPWxpbmVFbmRpbmdzW2xlbi0xXS1saW5lRW5kaW5nc1tsZW4tMl0tMTt9CnJldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShvbGRSYW5nZS5zdGFydExpbmUsb2xkUmFuZ2Uuc3RhcnRDb2x1bW4sZW5kTGluZSxlbmRDb2x1bW4pO30KaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSYmdGhpcy5zdGFydENvbHVtbj09PXRoaXMuZW5kQ29sdW1uO30KaW1tZWRpYXRlbHlQcmVjZWRlcyhyYW5nZSl7aWYoIXJhbmdlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRoaXMuZW5kTGluZT09PXJhbmdlLnN0YXJ0TGluZSYmdGhpcy5lbmRDb2x1bW49PT1yYW5nZS5zdGFydENvbHVtbjt9CmltbWVkaWF0ZWx5Rm9sbG93cyhyYW5nZSl7aWYoIXJhbmdlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHJhbmdlLmltbWVkaWF0ZWx5UHJlY2VkZXModGhpcyk7fQpmb2xsb3dzKHJhbmdlKXtyZXR1cm4ocmFuZ2UuZW5kTGluZT09PXRoaXMuc3RhcnRMaW5lJiZyYW5nZS5lbmRDb2x1bW48PXRoaXMuc3RhcnRDb2x1bW4pfHxyYW5nZS5lbmRMaW5lPHRoaXMuc3RhcnRMaW5lO30KZ2V0IGxpbmVzQ291bnQoKXtyZXR1cm4gdGhpcy5lbmRMaW5lLXRoaXMuc3RhcnRMaW5lO30KY29sbGFwc2VUb0VuZCgpe3JldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZSh0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4sdGhpcy5lbmRMaW5lLHRoaXMuZW5kQ29sdW1uKTt9CmNvbGxhcHNlVG9TdGFydCgpe3JldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZSh0aGlzLnN0YXJ0TGluZSx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4pO30Kbm9ybWFsaXplKCl7aWYodGhpcy5zdGFydExpbmU+dGhpcy5lbmRMaW5lfHwodGhpcy5zdGFydExpbmU9PT10aGlzLmVuZExpbmUmJnRoaXMuc3RhcnRDb2x1bW4+dGhpcy5lbmRDb2x1bW4pKQpyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UodGhpcy5lbmRMaW5lLHRoaXMuZW5kQ29sdW1uLHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4pO2Vsc2UKcmV0dXJuIHRoaXMuY2xvbmUoKTt9CmNsb25lKCl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4sdGhpcy5lbmRMaW5lLHRoaXMuZW5kQ29sdW1uKTt9CnNlcmlhbGl6ZVRvT2JqZWN0KCl7Y29uc3Qgc2VyaWFsaXplZFRleHRSYW5nZT17fTtzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0TGluZT10aGlzLnN0YXJ0TGluZTtzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0Q29sdW1uPXRoaXMuc3RhcnRDb2x1bW47c2VyaWFsaXplZFRleHRSYW5nZS5lbmRMaW5lPXRoaXMuZW5kTGluZTtzZXJpYWxpemVkVGV4dFJhbmdlLmVuZENvbHVtbj10aGlzLmVuZENvbHVtbjtyZXR1cm4gc2VyaWFsaXplZFRleHRSYW5nZTt9CmNvbXBhcmVUbyhvdGhlcil7aWYodGhpcy5zdGFydExpbmU+b3RoZXIuc3RhcnRMaW5lKQpyZXR1cm4gMTtpZih0aGlzLnN0YXJ0TGluZTxvdGhlci5zdGFydExpbmUpCnJldHVybi0xO2lmKHRoaXMuc3RhcnRDb2x1bW4+b3RoZXIuc3RhcnRDb2x1bW4pCnJldHVybiAxO2lmKHRoaXMuc3RhcnRDb2x1bW48b3RoZXIuc3RhcnRDb2x1bW4pCnJldHVybi0xO3JldHVybiAwO30KY29tcGFyZVRvUG9zaXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2lmKGxpbmVOdW1iZXI8dGhpcy5zdGFydExpbmV8fChsaW5lTnVtYmVyPT09dGhpcy5zdGFydExpbmUmJmNvbHVtbk51bWJlcjx0aGlzLnN0YXJ0Q29sdW1uKSkKcmV0dXJuLTE7aWYobGluZU51bWJlcj50aGlzLmVuZExpbmV8fChsaW5lTnVtYmVyPT09dGhpcy5lbmRMaW5lJiZjb2x1bW5OdW1iZXI+dGhpcy5lbmRDb2x1bW4pKQpyZXR1cm4gMTtyZXR1cm4gMDt9CmVxdWFsKG90aGVyKXtyZXR1cm4gdGhpcy5zdGFydExpbmU9PT1vdGhlci5zdGFydExpbmUmJnRoaXMuZW5kTGluZT09PW90aGVyLmVuZExpbmUmJnRoaXMuc3RhcnRDb2x1bW49PT1vdGhlci5zdGFydENvbHVtbiYmdGhpcy5lbmRDb2x1bW49PT1vdGhlci5lbmRDb2x1bW47fQpyZWxhdGl2ZVRvKGxpbmUsY29sdW1uKXtjb25zdCByZWxhdGl2ZT10aGlzLmNsb25lKCk7aWYodGhpcy5zdGFydExpbmU9PT1saW5lKQpyZWxhdGl2ZS5zdGFydENvbHVtbi09Y29sdW1uO2lmKHRoaXMuZW5kTGluZT09PWxpbmUpCnJlbGF0aXZlLmVuZENvbHVtbi09Y29sdW1uO3JlbGF0aXZlLnN0YXJ0TGluZS09bGluZTtyZWxhdGl2ZS5lbmRMaW5lLT1saW5lO3JldHVybiByZWxhdGl2ZTt9CnJlbGF0aXZlRnJvbShsaW5lLGNvbHVtbil7Y29uc3QgcmVsYXRpdmU9dGhpcy5jbG9uZSgpO2lmKHRoaXMuc3RhcnRMaW5lPT09MCkKcmVsYXRpdmUuc3RhcnRDb2x1bW4rPWNvbHVtbjtpZih0aGlzLmVuZExpbmU9PT0wKQpyZWxhdGl2ZS5lbmRDb2x1bW4rPWNvbHVtbjtyZWxhdGl2ZS5zdGFydExpbmUrPWxpbmU7cmVsYXRpdmUuZW5kTGluZSs9bGluZTtyZXR1cm4gcmVsYXRpdmU7fQpyZWJhc2VBZnRlclRleHRFZGl0KG9yaWdpbmFsUmFuZ2UsZWRpdGVkUmFuZ2Upe2NvbnNvbGUuYXNzZXJ0KG9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lPT09ZWRpdGVkUmFuZ2Uuc3RhcnRMaW5lKTtjb25zb2xlLmFzc2VydChvcmlnaW5hbFJhbmdlLnN0YXJ0Q29sdW1uPT09ZWRpdGVkUmFuZ2Uuc3RhcnRDb2x1bW4pO2NvbnN0IHJlYmFzZT10aGlzLmNsb25lKCk7aWYoIXRoaXMuZm9sbG93cyhvcmlnaW5hbFJhbmdlKSkKcmV0dXJuIHJlYmFzZTtjb25zdCBsaW5lRGVsdGE9ZWRpdGVkUmFuZ2UuZW5kTGluZS1vcmlnaW5hbFJhbmdlLmVuZExpbmU7Y29uc3QgY29sdW1uRGVsdGE9ZWRpdGVkUmFuZ2UuZW5kQ29sdW1uLW9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uO3JlYmFzZS5zdGFydExpbmUrPWxpbmVEZWx0YTtyZWJhc2UuZW5kTGluZSs9bGluZURlbHRhO2lmKHJlYmFzZS5zdGFydExpbmU9PT1lZGl0ZWRSYW5nZS5lbmRMaW5lKQpyZWJhc2Uuc3RhcnRDb2x1bW4rPWNvbHVtbkRlbHRhO2lmKHJlYmFzZS5lbmRMaW5lPT09ZWRpdGVkUmFuZ2UuZW5kTGluZSkKcmViYXNlLmVuZENvbHVtbis9Y29sdW1uRGVsdGE7cmV0dXJuIHJlYmFzZTt9CnRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO30KY29udGFpbnNMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYodGhpcy5zdGFydExpbmU9PT10aGlzLmVuZExpbmUpCnJldHVybiB0aGlzLnN0YXJ0TGluZT09PWxpbmVOdW1iZXImJnRoaXMuc3RhcnRDb2x1bW48PWNvbHVtbk51bWJlciYmY29sdW1uTnVtYmVyPD10aGlzLmVuZENvbHVtbjtpZih0aGlzLnN0YXJ0TGluZT09PWxpbmVOdW1iZXIpCnJldHVybiB0aGlzLnN0YXJ0Q29sdW1uPD1jb2x1bW5OdW1iZXI7aWYodGhpcy5lbmRMaW5lPT09bGluZU51bWJlcikKcmV0dXJuIGNvbHVtbk51bWJlcjw9dGhpcy5lbmRDb2x1bW47cmV0dXJuIHRoaXMuc3RhcnRMaW5lPGxpbmVOdW1iZXImJmxpbmVOdW1iZXI8dGhpcy5lbmRMaW5lO319O1RleHRVdGlscy5Tb3VyY2VSYW5nZT1jbGFzc3tjb25zdHJ1Y3RvcihvZmZzZXQsbGVuZ3RoKXt0aGlzLm9mZnNldD1vZmZzZXQ7dGhpcy5sZW5ndGg9bGVuZ3RoO319O1RleHRVdGlscy5Tb3VyY2VFZGl0PWNsYXNze2NvbnN0cnVjdG9yKHNvdXJjZVVSTCxvbGRSYW5nZSxuZXdUZXh0KXt0aGlzLnNvdXJjZVVSTD1zb3VyY2VVUkw7dGhpcy5vbGRSYW5nZT1vbGRSYW5nZTt0aGlzLm5ld1RleHQ9bmV3VGV4dDt9CnN0YXRpYyBjb21wYXJhdG9yKGVkaXQxLGVkaXQyKXtyZXR1cm4gVGV4dFV0aWxzLlRleHRSYW5nZS5jb21wYXJhdG9yKGVkaXQxLm9sZFJhbmdlLGVkaXQyLm9sZFJhbmdlKTt9Cm5ld1JhbmdlKCl7cmV0dXJuIFRleHRVdGlscy5UZXh0UmFuZ2UuZnJvbUVkaXQodGhpcy5vbGRSYW5nZSx0aGlzLm5ld1RleHQpO319OztzZWxmWydDb21tb24nXT1zZWxmWydDb21tb24nXXx8e307Q29tbW9uLldvcmtlcj1jbGFzc3tjb25zdHJ1Y3RvcihhcHBOYW1lKXtsZXQgdXJsPWFwcE5hbWUrJy5qcyc7dXJsKz1SdW50aW1lLnF1ZXJ5UGFyYW1zU3RyaW5nKCk7dGhpcy5fd29ya2VyUHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT57dGhpcy5fd29ya2VyPW5ldyBXb3JrZXIodXJsKTt0aGlzLl93b3JrZXIub25tZXNzYWdlPW9uTWVzc2FnZS5iaW5kKHRoaXMpO2Z1bmN0aW9uIG9uTWVzc2FnZShldmVudCl7Y29uc29sZS5hc3NlcnQoZXZlbnQuZGF0YT09PSd3b3JrZXJSZWFkeScpO3RoaXMuX3dvcmtlci5vbm1lc3NhZ2U9bnVsbDtmdWxmaWxsKHRoaXMuX3dvcmtlcik7dGhpcy5fd29ya2VyPW51bGw7fX0pO30KcG9zdE1lc3NhZ2UobWVzc2FnZSl7dGhpcy5fd29ya2VyUHJvbWlzZS50aGVuKHdvcmtlcj0+e2lmKCF0aGlzLl9kaXNwb3NlZCkKd29ya2VyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO30pO30KZGlzcG9zZSgpe3RoaXMuX2Rpc3Bvc2VkPXRydWU7dGhpcy5fd29ya2VyUHJvbWlzZS50aGVuKHdvcmtlcj0+d29ya2VyLnRlcm1pbmF0ZSgpKTt9CnRlcm1pbmF0ZSgpe3RoaXMuZGlzcG9zZSgpO30Kc2V0IG9ubWVzc2FnZShsaXN0ZW5lcil7dGhpcy5fd29ya2VyUHJvbWlzZS50aGVuKHdvcmtlcj0+d29ya2VyLm9ubWVzc2FnZT1saXN0ZW5lcik7fQpzZXQgb25lcnJvcihsaXN0ZW5lcil7dGhpcy5fd29ya2VyUHJvbWlzZS50aGVuKHdvcmtlcj0+d29ya2VyLm9uZXJyb3I9bGlzdGVuZXIpO319OztDb21tb24uVGV4dERpY3Rpb25hcnk9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl93b3Jkcz1uZXcgTWFwKCk7dGhpcy5faW5kZXg9bmV3IENvbW1vbi5UcmllKCk7fQphZGRXb3JkKHdvcmQpe2xldCBjb3VudD10aGlzLl93b3Jkcy5nZXQod29yZCl8fDA7Kytjb3VudDt0aGlzLl93b3Jkcy5zZXQod29yZCxjb3VudCk7dGhpcy5faW5kZXguYWRkKHdvcmQpO30KcmVtb3ZlV29yZCh3b3JkKXtsZXQgY291bnQ9dGhpcy5fd29yZHMuZ2V0KHdvcmQpfHwwO2lmKCFjb3VudCkKcmV0dXJuO2lmKGNvdW50PT09MSl7dGhpcy5fd29yZHMuZGVsZXRlKHdvcmQpO3RoaXMuX2luZGV4LnJlbW92ZSh3b3JkKTtyZXR1cm47fQotLWNvdW50O3RoaXMuX3dvcmRzLnNldCh3b3JkLGNvdW50KTt9CndvcmRzV2l0aFByZWZpeChwcmVmaXgpe3JldHVybiB0aGlzLl9pbmRleC53b3JkcyhwcmVmaXgpO30KaGFzV29yZCh3b3JkKXtyZXR1cm4gdGhpcy5fd29yZHMuaGFzKHdvcmQpO30Kd29yZENvdW50KHdvcmQpe3JldHVybiB0aGlzLl93b3Jkcy5nZXQod29yZCl8fDA7fQpyZXNldCgpe3RoaXMuX3dvcmRzLmNsZWFyKCk7dGhpcy5faW5kZXguY2xlYXIoKTt9fTs7Q29tbW9uLk9iamVjdD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2xpc3RlbmVyczt9CmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3Qpe2lmKCFsaXN0ZW5lcikKY29uc29sZS5hc3NlcnQoZmFsc2UpO2lmKCF0aGlzLl9saXN0ZW5lcnMpCnRoaXMuX2xpc3RlbmVycz1uZXcgTWFwKCk7aWYoIXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKdGhpcy5fbGlzdGVuZXJzLnNldChldmVudFR5cGUsW10pO3RoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnRUeXBlKS5wdXNoKHt0aGlzT2JqZWN0OnRoaXNPYmplY3QsbGlzdGVuZXI6bGlzdGVuZXJ9KTtyZXR1cm57ZXZlbnRUYXJnZXQ6dGhpcyxldmVudFR5cGU6ZXZlbnRUeXBlLHRoaXNPYmplY3Q6dGhpc09iamVjdCxsaXN0ZW5lcjpsaXN0ZW5lcn07fQpvbmNlKGV2ZW50VHlwZSl7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pntjb25zdCBkZXNjcmlwdG9yPXRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsZXZlbnQ9Pnt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGRlc2NyaXB0b3IubGlzdGVuZXIpO3Jlc29sdmUoZXZlbnQuZGF0YSk7fSk7fSk7fQpyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXtjb25zb2xlLmFzc2VydChsaXN0ZW5lcik7aWYoIXRoaXMuX2xpc3RlbmVyc3x8IXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKcmV0dXJuO2NvbnN0IGxpc3RlbmVycz10aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk7Zm9yKGxldCBpPTA7aTxsaXN0ZW5lcnMubGVuZ3RoOysraSl7aWYobGlzdGVuZXJzW2ldLmxpc3RlbmVyPT09bGlzdGVuZXImJmxpc3RlbmVyc1tpXS50aGlzT2JqZWN0PT09dGhpc09iamVjdCl7bGlzdGVuZXJzW2ldLmRpc3Bvc2VkPXRydWU7bGlzdGVuZXJzLnNwbGljZShpLS0sMSk7fX0KaWYoIWxpc3RlbmVycy5sZW5ndGgpCnRoaXMuX2xpc3RlbmVycy5kZWxldGUoZXZlbnRUeXBlKTt9Cmhhc0V2ZW50TGlzdGVuZXJzKGV2ZW50VHlwZSl7cmV0dXJuISEodGhpcy5fbGlzdGVuZXJzJiZ0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50VHlwZSkpO30KZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKGV2ZW50VHlwZSxldmVudERhdGEpe2lmKCF0aGlzLl9saXN0ZW5lcnN8fCF0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50VHlwZSkpCnJldHVybjtjb25zdCBldmVudD0oe2RhdGE6ZXZlbnREYXRhfSk7Y29uc3QgbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnRUeXBlKS5zbGljZSgwKTtmb3IobGV0IGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7KytpKXtpZighbGlzdGVuZXJzW2ldLmRpc3Bvc2VkKQpsaXN0ZW5lcnNbaV0ubGlzdGVuZXIuY2FsbChsaXN0ZW5lcnNbaV0udGhpc09iamVjdCxldmVudCk7fX19O0NvbW1vbi5FdmVudDtDb21tb24uT2JqZWN0Ll9saXN0ZW5lckNhbGxiYWNrVHVwbGU7Q29tbW9uLkV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7fTtDb21tb24uRXZlbnRUYXJnZXQuRXZlbnREZXNjcmlwdG9yO0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycz1mdW5jdGlvbihldmVudExpc3Qpe2Zvcihjb25zdCBldmVudEluZm8gb2YgZXZlbnRMaXN0KQpldmVudEluZm8uZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEluZm8uZXZlbnRUeXBlLGV2ZW50SW5mby5saXN0ZW5lcixldmVudEluZm8udGhpc09iamVjdCk7ZXZlbnRMaXN0LnNwbGljZSgwKTt9O0NvbW1vbi5FdmVudFRhcmdldC5wcm90b3R5cGU9e2FkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3Qpe30sb25jZShldmVudFR5cGUpe30scmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCl7fSxoYXNFdmVudExpc3RlbmVycyhldmVudFR5cGUpe30sZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKGV2ZW50VHlwZSxldmVudERhdGEpe30sfTs7Q29tbW9uLkNvbG9yPWNsYXNze2NvbnN0cnVjdG9yKHJnYmEsZm9ybWF0LG9yaWdpbmFsVGV4dCl7dGhpcy5fcmdiYT1yZ2JhO3RoaXMuX29yaWdpbmFsVGV4dD1vcmlnaW5hbFRleHR8fG51bGw7dGhpcy5fb3JpZ2luYWxUZXh0SXNWYWxpZD0hIXRoaXMuX29yaWdpbmFsVGV4dDt0aGlzLl9mb3JtYXQ9Zm9ybWF0O2lmKHR5cGVvZiB0aGlzLl9yZ2JhWzNdPT09J3VuZGVmaW5lZCcpCnRoaXMuX3JnYmFbM109MTtmb3IobGV0IGk9MDtpPDQ7KytpKXtpZih0aGlzLl9yZ2JhW2ldPDApe3RoaXMuX3JnYmFbaV09MDt0aGlzLl9vcmlnaW5hbFRleHRJc1ZhbGlkPWZhbHNlO30KaWYodGhpcy5fcmdiYVtpXT4xKXt0aGlzLl9yZ2JhW2ldPTE7dGhpcy5fb3JpZ2luYWxUZXh0SXNWYWxpZD1mYWxzZTt9fX0Kc3RhdGljIHBhcnNlKHRleHQpe2NvbnN0IHZhbHVlPXRleHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywnJyk7Y29uc3Qgc2ltcGxlPS9eKD86IyhbMC05YS1mXXszLDR9fFswLTlhLWZdezZ9fFswLTlhLWZdezh9KXwoXHcrKSkkL2k7bGV0IG1hdGNoPXZhbHVlLm1hdGNoKHNpbXBsZSk7aWYobWF0Y2gpe2lmKG1hdGNoWzFdKXtsZXQgaGV4PW1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7bGV0IGZvcm1hdDtpZihoZXgubGVuZ3RoPT09Myl7Zm9ybWF0PUNvbW1vbi5Db2xvci5Gb3JtYXQuU2hvcnRIRVg7aGV4PWhleC5jaGFyQXQoMCkraGV4LmNoYXJBdCgwKStoZXguY2hhckF0KDEpK2hleC5jaGFyQXQoMSkraGV4LmNoYXJBdCgyKStoZXguY2hhckF0KDIpO31lbHNlIGlmKGhleC5sZW5ndGg9PT00KXtmb3JtYXQ9Q29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWEE7aGV4PWhleC5jaGFyQXQoMCkraGV4LmNoYXJBdCgwKStoZXguY2hhckF0KDEpK2hleC5jaGFyQXQoMSkraGV4LmNoYXJBdCgyKStoZXguY2hhckF0KDIpKwpoZXguY2hhckF0KDMpK2hleC5jaGFyQXQoMyk7fWVsc2UgaWYoaGV4Lmxlbmd0aD09PTYpe2Zvcm1hdD1Db21tb24uQ29sb3IuRm9ybWF0LkhFWDt9ZWxzZXtmb3JtYXQ9Q29tbW9uLkNvbG9yLkZvcm1hdC5IRVhBO30KY29uc3Qgcj1wYXJzZUludChoZXguc3Vic3RyaW5nKDAsMiksMTYpO2NvbnN0IGc9cGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLDQpLDE2KTtjb25zdCBiPXBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCw2KSwxNik7bGV0IGE9MTtpZihoZXgubGVuZ3RoPT09OCkKYT1wYXJzZUludChoZXguc3Vic3RyaW5nKDYsOCksMTYpLzI1NTtyZXR1cm4gbmV3IENvbW1vbi5Db2xvcihbci8yNTUsZy8yNTUsYi8yNTUsYV0sZm9ybWF0LHRleHQpO30KaWYobWF0Y2hbMl0pe2NvbnN0IG5pY2tuYW1lPW1hdGNoWzJdLnRvTG93ZXJDYXNlKCk7aWYobmlja25hbWUgaW4gQ29tbW9uLkNvbG9yLk5pY2tuYW1lcyl7Y29uc3QgcmdiYT1Db21tb24uQ29sb3IuTmlja25hbWVzW25pY2tuYW1lXTtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IuZnJvbVJHQkEocmdiYSk7Y29sb3IuX2Zvcm1hdD1Db21tb24uQ29sb3IuRm9ybWF0Lk5pY2tuYW1lO2NvbG9yLl9vcmlnaW5hbFRleHQ9dGV4dDtyZXR1cm4gY29sb3I7fQpyZXR1cm4gbnVsbDt9CnJldHVybiBudWxsO30KbWF0Y2g9dGV4dC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eXHMqKD86KHJnYmE/KXwoaHNsYT8pKVwoKC4qKVwpXHMqJC8pO2lmKG1hdGNoKXtjb25zdCBjb21wb25lbnRzPW1hdGNoWzNdLnRyaW0oKTtsZXQgdmFsdWVzPWNvbXBvbmVudHMuc3BsaXQoL1xzKixccyovKTtpZih2YWx1ZXMubGVuZ3RoPT09MSl7dmFsdWVzPWNvbXBvbmVudHMuc3BsaXQoL1xzKy8pO2lmKHZhbHVlc1szXT09PScvJyl7dmFsdWVzLnNwbGljZSgzLDEpO2lmKHZhbHVlcy5sZW5ndGghPT00KQpyZXR1cm4gbnVsbDt9ZWxzZSBpZigodmFsdWVzLmxlbmd0aD4yJiZ2YWx1ZXNbMl0uaW5kZXhPZignLycpIT09LTEpfHwodmFsdWVzLmxlbmd0aD4zJiZ2YWx1ZXNbM10uaW5kZXhPZignLycpIT09LTEpKXtjb25zdCBhbHBoYT12YWx1ZXMuc2xpY2UoMiw0KS5qb2luKCcnKTt2YWx1ZXM9dmFsdWVzLnNsaWNlKDAsMikuY29uY2F0KGFscGhhLnNwbGl0KC9cLy8pKS5jb25jYXQodmFsdWVzLnNsaWNlKDQpKTt9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj00KXtyZXR1cm4gbnVsbDt9fQppZih2YWx1ZXMubGVuZ3RoIT09MyYmdmFsdWVzLmxlbmd0aCE9PTR8fHZhbHVlcy5pbmRleE9mKCcnKT4tMSkKcmV0dXJuIG51bGw7Y29uc3QgaGFzQWxwaGE9KHZhbHVlc1szXSE9PXVuZGVmaW5lZCk7aWYobWF0Y2hbMV0pe2NvbnN0IHJnYmE9W0NvbW1vbi5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHZhbHVlc1swXSksQ29tbW9uLkNvbG9yLl9wYXJzZVJnYk51bWVyaWModmFsdWVzWzFdKSxDb21tb24uQ29sb3IuX3BhcnNlUmdiTnVtZXJpYyh2YWx1ZXNbMl0pLGhhc0FscGhhP0NvbW1vbi5Db2xvci5fcGFyc2VBbHBoYU51bWVyaWModmFsdWVzWzNdKToxXTtpZihyZ2JhLmluZGV4T2YobnVsbCk+LTEpCnJldHVybiBudWxsO3JldHVybiBuZXcgQ29tbW9uLkNvbG9yKHJnYmEsaGFzQWxwaGE/Q29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBOkNvbW1vbi5Db2xvci5Gb3JtYXQuUkdCLHRleHQpO30KaWYobWF0Y2hbMl0pe2NvbnN0IGhzbGE9W0NvbW1vbi5Db2xvci5fcGFyc2VIdWVOdW1lcmljKHZhbHVlc1swXSksQ29tbW9uLkNvbG9yLl9wYXJzZVNhdExpZ2h0TnVtZXJpYyh2YWx1ZXNbMV0pLENvbW1vbi5Db2xvci5fcGFyc2VTYXRMaWdodE51bWVyaWModmFsdWVzWzJdKSxoYXNBbHBoYT9Db21tb24uQ29sb3IuX3BhcnNlQWxwaGFOdW1lcmljKHZhbHVlc1szXSk6MV07aWYoaHNsYS5pbmRleE9mKG51bGwpPi0xKQpyZXR1cm4gbnVsbDtjb25zdCByZ2JhPVtdO0NvbW1vbi5Db2xvci5oc2wycmdiKGhzbGEscmdiYSk7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxoYXNBbHBoYT9Db21tb24uQ29sb3IuRm9ybWF0LkhTTEE6Q29tbW9uLkNvbG9yLkZvcm1hdC5IU0wsdGV4dCk7fX0KcmV0dXJuIG51bGw7fQpzdGF0aWMgZnJvbVJHQkEocmdiYSl7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IoW3JnYmFbMF0vMjU1LHJnYmFbMV0vMjU1LHJnYmFbMl0vMjU1LHJnYmFbM11dLENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCQSk7fQpzdGF0aWMgZnJvbUhTVkEoaHN2YSl7Y29uc3QgcmdiYT1bXTtDb21tb24uQ29sb3IuaHN2YTJyZ2JhKGhzdmEscmdiYSk7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxDb21tb24uQ29sb3IuRm9ybWF0LkhTTEEpO30Kc3RhdGljIF9wYXJzZVBlcmNlbnRPck51bWJlcih2YWx1ZSl7aWYoaXNOYU4odmFsdWUucmVwbGFjZSgnJScsJycpKSkKcmV0dXJuIG51bGw7Y29uc3QgcGFyc2VkPXBhcnNlRmxvYXQodmFsdWUpO2lmKHZhbHVlLmluZGV4T2YoJyUnKSE9PS0xKXtpZih2YWx1ZS5pbmRleE9mKCclJykhPT12YWx1ZS5sZW5ndGgtMSkKcmV0dXJuIG51bGw7cmV0dXJuIHBhcnNlZC8xMDA7fQpyZXR1cm4gcGFyc2VkO30Kc3RhdGljIF9wYXJzZVJnYk51bWVyaWModmFsdWUpe2NvbnN0IHBhcnNlZD1Db21tb24uQ29sb3IuX3BhcnNlUGVyY2VudE9yTnVtYmVyKHZhbHVlKTtpZihwYXJzZWQ9PT1udWxsKQpyZXR1cm4gbnVsbDtpZih2YWx1ZS5pbmRleE9mKCclJykhPT0tMSkKcmV0dXJuIHBhcnNlZDtyZXR1cm4gcGFyc2VkLzI1NTt9CnN0YXRpYyBfcGFyc2VIdWVOdW1lcmljKHZhbHVlKXtjb25zdCBhbmdsZT12YWx1ZS5yZXBsYWNlKC8oZGVnfGc/cmFkfHR1cm4pJC8sJycpO2lmKGlzTmFOKGFuZ2xlKXx8dmFsdWUubWF0Y2goL1xzKyhkZWd8Zz9yYWR8dHVybikvKSkKcmV0dXJuIG51bGw7Y29uc3QgbnVtYmVyPXBhcnNlRmxvYXQoYW5nbGUpO2lmKHZhbHVlLmluZGV4T2YoJ3R1cm4nKSE9PS0xKQpyZXR1cm4gbnVtYmVyJTE7ZWxzZSBpZih2YWx1ZS5pbmRleE9mKCdncmFkJykhPT0tMSkKcmV0dXJuKG51bWJlci80MDApJTE7ZWxzZSBpZih2YWx1ZS5pbmRleE9mKCdyYWQnKSE9PS0xKQpyZXR1cm4obnVtYmVyLygyKk1hdGguUEkpKSUxO3JldHVybihudW1iZXIvMzYwKSUxO30Kc3RhdGljIF9wYXJzZVNhdExpZ2h0TnVtZXJpYyh2YWx1ZSl7aWYodmFsdWUuaW5kZXhPZignJScpIT09dmFsdWUubGVuZ3RoLTF8fGlzTmFOKHZhbHVlLnJlcGxhY2UoJyUnLCcnKSkpCnJldHVybiBudWxsO2NvbnN0IHBhcnNlZD1wYXJzZUZsb2F0KHZhbHVlKTtyZXR1cm4gTWF0aC5taW4oMSxwYXJzZWQvMTAwKTt9CnN0YXRpYyBfcGFyc2VBbHBoYU51bWVyaWModmFsdWUpe3JldHVybiBDb21tb24uQ29sb3IuX3BhcnNlUGVyY2VudE9yTnVtYmVyKHZhbHVlKTt9CnN0YXRpYyBfaHN2YTJoc2xhKGhzdmEsb3V0X2hzbGEpe2NvbnN0IGg9aHN2YVswXTtsZXQgcz1oc3ZhWzFdO2NvbnN0IHY9aHN2YVsyXTtjb25zdCB0PSgyLXMpKnY7aWYodj09PTB8fHM9PT0wKQpzPTA7ZWxzZQpzKj12Lyh0PDE/dDoyLXQpO291dF9oc2xhWzBdPWg7b3V0X2hzbGFbMV09cztvdXRfaHNsYVsyXT10LzI7b3V0X2hzbGFbM109aHN2YVszXTt9CnN0YXRpYyBoc2wycmdiKGhzbCxvdXRfcmdiKXtjb25zdCBoPWhzbFswXTtsZXQgcz1oc2xbMV07Y29uc3QgbD1oc2xbMl07ZnVuY3Rpb24gaHVlMnJnYihwLHEsaCl7aWYoaDwwKQpoKz0xO2Vsc2UgaWYoaD4xKQpoLT0xO2lmKChoKjYpPDEpCnJldHVybiBwKyhxLXApKmgqNjtlbHNlIGlmKChoKjIpPDEpCnJldHVybiBxO2Vsc2UgaWYoKGgqMyk8MikKcmV0dXJuIHArKHEtcCkqKCgyLzMpLWgpKjY7ZWxzZQpyZXR1cm4gcDt9CmlmKHM8MCkKcz0wO2xldCBxO2lmKGw8PTAuNSkKcT1sKigxK3MpO2Vsc2UKcT1sK3MtKGwqcyk7Y29uc3QgcD0yKmwtcTtjb25zdCB0cj1oKygxLzMpO2NvbnN0IHRnPWg7Y29uc3QgdGI9aC0oMS8zKTtvdXRfcmdiWzBdPWh1ZTJyZ2IocCxxLHRyKTtvdXRfcmdiWzFdPWh1ZTJyZ2IocCxxLHRnKTtvdXRfcmdiWzJdPWh1ZTJyZ2IocCxxLHRiKTtvdXRfcmdiWzNdPWhzbFszXTt9CnN0YXRpYyBoc3ZhMnJnYmEoaHN2YSxvdXRfcmdiYSl7Q29tbW9uLkNvbG9yLl9oc3ZhMmhzbGEoaHN2YSxDb21tb24uQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBKTtDb21tb24uQ29sb3IuaHNsMnJnYihDb21tb24uQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBLG91dF9yZ2JhKTtmb3IobGV0IGk9MDtpPENvbW1vbi5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEEubGVuZ3RoO2krKykKQ29tbW9uLkNvbG9yLmhzdmEycmdiYS5fdG1wSFNMQVtpXT0wO30Kc3RhdGljIGx1bWluYW5jZShyZ2JhKXtjb25zdCByU1JHQj1yZ2JhWzBdO2NvbnN0IGdTUkdCPXJnYmFbMV07Y29uc3QgYlNSR0I9cmdiYVsyXTtjb25zdCByPXJTUkdCPD0wLjAzOTI4P3JTUkdCLzEyLjkyOk1hdGgucG93KCgoclNSR0IrMC4wNTUpLzEuMDU1KSwyLjQpO2NvbnN0IGc9Z1NSR0I8PTAuMDM5Mjg/Z1NSR0IvMTIuOTI6TWF0aC5wb3coKChnU1JHQiswLjA1NSkvMS4wNTUpLDIuNCk7Y29uc3QgYj1iU1JHQjw9MC4wMzkyOD9iU1JHQi8xMi45MjpNYXRoLnBvdygoKGJTUkdCKzAuMDU1KS8xLjA1NSksMi40KTtyZXR1cm4gMC4yMTI2KnIrMC43MTUyKmcrMC4wNzIyKmI7fQpzdGF0aWMgYmxlbmRDb2xvcnMoZmdSR0JBLGJnUkdCQSxvdXRfYmxlbmRlZCl7Y29uc3QgYWxwaGE9ZmdSR0JBWzNdO291dF9ibGVuZGVkWzBdPSgoMS1hbHBoYSkqYmdSR0JBWzBdKSsoYWxwaGEqZmdSR0JBWzBdKTtvdXRfYmxlbmRlZFsxXT0oKDEtYWxwaGEpKmJnUkdCQVsxXSkrKGFscGhhKmZnUkdCQVsxXSk7b3V0X2JsZW5kZWRbMl09KCgxLWFscGhhKSpiZ1JHQkFbMl0pKyhhbHBoYSpmZ1JHQkFbMl0pO291dF9ibGVuZGVkWzNdPWFscGhhKyhiZ1JHQkFbM10qKDEtYWxwaGEpKTt9CnN0YXRpYyBjYWxjdWxhdGVDb250cmFzdFJhdGlvKGZnUkdCQSxiZ1JHQkEpe0NvbW1vbi5Db2xvci5ibGVuZENvbG9ycyhmZ1JHQkEsYmdSR0JBLENvbW1vbi5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvLl9ibGVuZGVkRmcpO2NvbnN0IGZnTHVtaW5hbmNlPUNvbW1vbi5Db2xvci5sdW1pbmFuY2UoQ29tbW9uLkNvbG9yLmNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8uX2JsZW5kZWRGZyk7Y29uc3QgYmdMdW1pbmFuY2U9Q29tbW9uLkNvbG9yLmx1bWluYW5jZShiZ1JHQkEpO2NvbnN0IGNvbnRyYXN0UmF0aW89KE1hdGgubWF4KGZnTHVtaW5hbmNlLGJnTHVtaW5hbmNlKSswLjA1KS8oTWF0aC5taW4oZmdMdW1pbmFuY2UsYmdMdW1pbmFuY2UpKzAuMDUpO2ZvcihsZXQgaT0wO2k8Q29tbW9uLkNvbG9yLmNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8uX2JsZW5kZWRGZy5sZW5ndGg7aSsrKQpDb21tb24uQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnW2ldPTA7cmV0dXJuIGNvbnRyYXN0UmF0aW87fQpzdGF0aWMgZGVzaXJlZEx1bWluYW5jZShsdW1pbmFuY2UsY29udHJhc3QsbGlnaHRlcil7ZnVuY3Rpb24gY29tcHV0ZUx1bWluYW5jZSgpe2lmKGxpZ2h0ZXIpCnJldHVybihsdW1pbmFuY2UrMC4wNSkqY29udHJhc3QtMC4wNTtlbHNlCnJldHVybihsdW1pbmFuY2UrMC4wNSkvY29udHJhc3QtMC4wNTt9CmxldCBkZXNpcmVkTHVtaW5hbmNlPWNvbXB1dGVMdW1pbmFuY2UoKTtpZihkZXNpcmVkTHVtaW5hbmNlPDB8fGRlc2lyZWRMdW1pbmFuY2U+MSl7bGlnaHRlcj0hbGlnaHRlcjtkZXNpcmVkTHVtaW5hbmNlPWNvbXB1dGVMdW1pbmFuY2UoKTt9CnJldHVybiBkZXNpcmVkTHVtaW5hbmNlO30Kc3RhdGljIGRldGVjdENvbG9yRm9ybWF0KGNvbG9yKXtjb25zdCBjZj1Db21tb24uQ29sb3IuRm9ybWF0O2xldCBmb3JtYXQ7Y29uc3QgZm9ybWF0U2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnY29sb3JGb3JtYXQnKS5nZXQoKTtpZihmb3JtYXRTZXR0aW5nPT09Y2YuT3JpZ2luYWwpCmZvcm1hdD1jZi5PcmlnaW5hbDtlbHNlIGlmKGZvcm1hdFNldHRpbmc9PT1jZi5SR0IpCmZvcm1hdD0oY29sb3IuaGFzQWxwaGEoKT9jZi5SR0JBOmNmLlJHQik7ZWxzZSBpZihmb3JtYXRTZXR0aW5nPT09Y2YuSFNMKQpmb3JtYXQ9KGNvbG9yLmhhc0FscGhhKCk/Y2YuSFNMQTpjZi5IU0wpO2Vsc2UgaWYoZm9ybWF0U2V0dGluZz09PWNmLkhFWCkKZm9ybWF0PWNvbG9yLmRldGVjdEhFWEZvcm1hdCgpO2Vsc2UKZm9ybWF0PWNmLlJHQkE7cmV0dXJuIGZvcm1hdDt9CmZvcm1hdCgpe3JldHVybiB0aGlzLl9mb3JtYXQ7fQpoc2xhKCl7aWYodGhpcy5faHNsYSkKcmV0dXJuIHRoaXMuX2hzbGE7Y29uc3Qgcj10aGlzLl9yZ2JhWzBdO2NvbnN0IGc9dGhpcy5fcmdiYVsxXTtjb25zdCBiPXRoaXMuX3JnYmFbMl07Y29uc3QgbWF4PU1hdGgubWF4KHIsZyxiKTtjb25zdCBtaW49TWF0aC5taW4ocixnLGIpO2NvbnN0IGRpZmY9bWF4LW1pbjtjb25zdCBhZGQ9bWF4K21pbjtsZXQgaDtpZihtaW49PT1tYXgpCmg9MDtlbHNlIGlmKHI9PT1tYXgpCmg9KCgxLzYqKGctYikvZGlmZikrMSklMTtlbHNlIGlmKGc9PT1tYXgpCmg9KDEvNiooYi1yKS9kaWZmKSsxLzM7ZWxzZQpoPSgxLzYqKHItZykvZGlmZikrMi8zO2NvbnN0IGw9MC41KmFkZDtsZXQgcztpZihsPT09MCkKcz0wO2Vsc2UgaWYobD09PTEpCnM9MDtlbHNlIGlmKGw8PTAuNSkKcz1kaWZmL2FkZDtlbHNlCnM9ZGlmZi8oMi1hZGQpO3RoaXMuX2hzbGE9W2gscyxsLHRoaXMuX3JnYmFbM11dO3JldHVybiB0aGlzLl9oc2xhO30KY2Fub25pY2FsSFNMQSgpe2NvbnN0IGhzbGE9dGhpcy5oc2xhKCk7cmV0dXJuW01hdGgucm91bmQoaHNsYVswXSozNjApLE1hdGgucm91bmQoaHNsYVsxXSoxMDApLE1hdGgucm91bmQoaHNsYVsyXSoxMDApLGhzbGFbM11dO30KaHN2YSgpe2NvbnN0IGhzbGE9dGhpcy5oc2xhKCk7Y29uc3QgaD1oc2xhWzBdO2xldCBzPWhzbGFbMV07Y29uc3QgbD1oc2xhWzJdO3MqPWw8MC41P2w6MS1sO3JldHVybltoLHMhPT0wPzIqcy8obCtzKTowLChsK3MpLGhzbGFbM11dO30KaGFzQWxwaGEoKXtyZXR1cm4gdGhpcy5fcmdiYVszXSE9PTE7fQpkZXRlY3RIRVhGb3JtYXQoKXtsZXQgY2FuQmVTaG9ydD10cnVlO2ZvcihsZXQgaT0wO2k8NDsrK2kpe2NvbnN0IGM9TWF0aC5yb3VuZCh0aGlzLl9yZ2JhW2ldKjI1NSk7aWYoYyUxNyl7Y2FuQmVTaG9ydD1mYWxzZTticmVhazt9fQpjb25zdCBoYXNBbHBoYT10aGlzLmhhc0FscGhhKCk7Y29uc3QgY2Y9Q29tbW9uLkNvbG9yLkZvcm1hdDtpZihjYW5CZVNob3J0KQpyZXR1cm4gaGFzQWxwaGE/Y2YuU2hvcnRIRVhBOmNmLlNob3J0SEVYO3JldHVybiBoYXNBbHBoYT9jZi5IRVhBOmNmLkhFWDt9CmFzU3RyaW5nKGZvcm1hdCl7aWYoZm9ybWF0PT09dGhpcy5fZm9ybWF0JiZ0aGlzLl9vcmlnaW5hbFRleHRJc1ZhbGlkKQpyZXR1cm4gdGhpcy5fb3JpZ2luYWxUZXh0O2lmKCFmb3JtYXQpCmZvcm1hdD10aGlzLl9mb3JtYXQ7ZnVuY3Rpb24gdG9SZ2JWYWx1ZSh2YWx1ZSl7cmV0dXJuIE1hdGgucm91bmQodmFsdWUqMjU1KTt9CmZ1bmN0aW9uIHRvSGV4VmFsdWUodmFsdWUpe2NvbnN0IGhleD1NYXRoLnJvdW5kKHZhbHVlKjI1NSkudG9TdHJpbmcoMTYpO3JldHVybiBoZXgubGVuZ3RoPT09MT8nMCcraGV4OmhleDt9CmZ1bmN0aW9uIHRvU2hvcnRIZXhWYWx1ZSh2YWx1ZSl7cmV0dXJuKE1hdGgucm91bmQodmFsdWUqMjU1KS8xNykudG9TdHJpbmcoMTYpO30Kc3dpdGNoKGZvcm1hdCl7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0Lk9yaWdpbmFsOnJldHVybiB0aGlzLl9vcmlnaW5hbFRleHQ7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LlJHQjppZih0aGlzLmhhc0FscGhhKCkpCnJldHVybiBudWxsO3JldHVybiBTdHJpbmcuc3ByaW50ZigncmdiKCVkLCAlZCwgJWQpJyx0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvUmdiVmFsdWUodGhpcy5fcmdiYVsxXSksdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzJdKSk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LlJHQkE6cmV0dXJuIFN0cmluZy5zcHJpbnRmKCdyZ2JhKCVkLCAlZCwgJWQsICVmKScsdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzBdKSx0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMV0pLHRvUmdiVmFsdWUodGhpcy5fcmdiYVsyXSksdGhpcy5fcmdiYVszXSk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LkhTTDppZih0aGlzLmhhc0FscGhhKCkpCnJldHVybiBudWxsO2NvbnN0IGhzbD10aGlzLmhzbGEoKTtyZXR1cm4gU3RyaW5nLnNwcmludGYoJ2hzbCglZCwgJWQlLCAlZCUpJyxNYXRoLnJvdW5kKGhzbFswXSozNjApLE1hdGgucm91bmQoaHNsWzFdKjEwMCksTWF0aC5yb3VuZChoc2xbMl0qMTAwKSk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LkhTTEE6Y29uc3QgaHNsYT10aGlzLmhzbGEoKTtyZXR1cm4gU3RyaW5nLnNwcmludGYoJ2hzbGEoJWQsICVkJSwgJWQlLCAlZiknLE1hdGgucm91bmQoaHNsYVswXSozNjApLE1hdGgucm91bmQoaHNsYVsxXSoxMDApLE1hdGgucm91bmQoaHNsYVsyXSoxMDApLGhzbGFbM10pO2Nhc2UgQ29tbW9uLkNvbG9yLkZvcm1hdC5IRVhBOnJldHVybiBTdHJpbmcuc3ByaW50ZignIyVzJXMlcyVzJyx0b0hleFZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvSGV4VmFsdWUodGhpcy5fcmdiYVsxXSksdG9IZXhWYWx1ZSh0aGlzLl9yZ2JhWzJdKSx0b0hleFZhbHVlKHRoaXMuX3JnYmFbM10pKS50b0xvd2VyQ2FzZSgpO2Nhc2UgQ29tbW9uLkNvbG9yLkZvcm1hdC5IRVg6aWYodGhpcy5oYXNBbHBoYSgpKQpyZXR1cm4gbnVsbDtyZXR1cm4gU3RyaW5nLnNwcmludGYoJyMlcyVzJXMnLHRvSGV4VmFsdWUodGhpcy5fcmdiYVswXSksdG9IZXhWYWx1ZSh0aGlzLl9yZ2JhWzFdKSx0b0hleFZhbHVlKHRoaXMuX3JnYmFbMl0pKS50b0xvd2VyQ2FzZSgpO2Nhc2UgQ29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWEE6Y29uc3QgaGV4Rm9ybWF0PXRoaXMuZGV0ZWN0SEVYRm9ybWF0KCk7aWYoaGV4Rm9ybWF0IT09Q29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWEEmJmhleEZvcm1hdCE9PUNvbW1vbi5Db2xvci5Gb3JtYXQuU2hvcnRIRVgpCnJldHVybiBudWxsO3JldHVybiBTdHJpbmcuc3ByaW50ZignIyVzJXMlcyVzJyx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVswXSksdG9TaG9ydEhleFZhbHVlKHRoaXMuX3JnYmFbMV0pLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzJdKSx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVszXSkpLnRvTG93ZXJDYXNlKCk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LlNob3J0SEVYOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7aWYodGhpcy5kZXRlY3RIRVhGb3JtYXQoKSE9PUNvbW1vbi5Db2xvci5Gb3JtYXQuU2hvcnRIRVgpCnJldHVybiBudWxsO3JldHVybiBTdHJpbmcuc3ByaW50ZignIyVzJXMlcycsdG9TaG9ydEhleFZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzFdKSx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVsyXSkpLnRvTG93ZXJDYXNlKCk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0Lk5pY2tuYW1lOnJldHVybiB0aGlzLm5pY2tuYW1lKCk7fQpyZXR1cm4gdGhpcy5fb3JpZ2luYWxUZXh0O30KcmdiYSgpe3JldHVybiB0aGlzLl9yZ2JhLnNsaWNlKCk7fQpjYW5vbmljYWxSR0JBKCl7Y29uc3QgcmdiYT1uZXcgQXJyYXkoNCk7Zm9yKGxldCBpPTA7aTwzOysraSkKcmdiYVtpXT1NYXRoLnJvdW5kKHRoaXMuX3JnYmFbaV0qMjU1KTtyZ2JhWzNdPXRoaXMuX3JnYmFbM107cmV0dXJuIHJnYmE7fQpuaWNrbmFtZSgpe2lmKCFDb21tb24uQ29sb3IuX3JnYmFUb05pY2tuYW1lKXtDb21tb24uQ29sb3IuX3JnYmFUb05pY2tuYW1lPXt9O2Zvcihjb25zdCBuaWNrbmFtZSBpbiBDb21tb24uQ29sb3IuTmlja25hbWVzKXtsZXQgcmdiYT1Db21tb24uQ29sb3IuTmlja25hbWVzW25pY2tuYW1lXTtpZihyZ2JhLmxlbmd0aCE9PTQpCnJnYmE9cmdiYS5jb25jYXQoMSk7Q29tbW9uLkNvbG9yLl9yZ2JhVG9OaWNrbmFtZVtyZ2JhXT1uaWNrbmFtZTt9fQpyZXR1cm4gQ29tbW9uLkNvbG9yLl9yZ2JhVG9OaWNrbmFtZVt0aGlzLmNhbm9uaWNhbFJHQkEoKV18fG51bGw7fQp0b1Byb3RvY29sUkdCQSgpe2NvbnN0IHJnYmE9dGhpcy5jYW5vbmljYWxSR0JBKCk7Y29uc3QgcmVzdWx0PXtyOnJnYmFbMF0sZzpyZ2JhWzFdLGI6cmdiYVsyXX07aWYocmdiYVszXSE9PTEpCnJlc3VsdC5hPXJnYmFbM107cmV0dXJuIHJlc3VsdDt9CmludmVydCgpe2NvbnN0IHJnYmE9W107cmdiYVswXT0xLXRoaXMuX3JnYmFbMF07cmdiYVsxXT0xLXRoaXMuX3JnYmFbMV07cmdiYVsyXT0xLXRoaXMuX3JnYmFbMl07cmdiYVszXT10aGlzLl9yZ2JhWzNdO3JldHVybiBuZXcgQ29tbW9uLkNvbG9yKHJnYmEsQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTt9CnNldEFscGhhKGFscGhhKXtjb25zdCByZ2JhPXRoaXMuX3JnYmEuc2xpY2UoKTtyZ2JhWzNdPWFscGhhO3JldHVybiBuZXcgQ29tbW9uLkNvbG9yKHJnYmEsQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTt9CmJsZW5kV2l0aChmZ0NvbG9yKXtjb25zdCByZ2JhPVtdO0NvbW1vbi5Db2xvci5ibGVuZENvbG9ycyhmZ0NvbG9yLl9yZ2JhLHRoaXMuX3JnYmEscmdiYSk7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxDb21tb24uQ29sb3IuRm9ybWF0LlJHQkEpO319O0NvbW1vbi5Db2xvci5SZWdleD0vKCg/OnJnYnxoc2wpYT9cKFteKV0rXCl8I1swLTlhLWZBLUZdezh9fCNbMC05YS1mQS1GXXs2fXwjWzAtOWEtZkEtRl17Myw0fXxcYlthLXpBLVpdK1xiKD8hLSkpL2c7Q29tbW9uLkNvbG9yLkZvcm1hdD17T3JpZ2luYWw6J29yaWdpbmFsJyxOaWNrbmFtZTonbmlja25hbWUnLEhFWDonaGV4JyxTaG9ydEhFWDonc2hvcnRoZXgnLEhFWEE6J2hleGEnLFNob3J0SEVYQTonc2hvcnRoZXhhJyxSR0I6J3JnYicsUkdCQToncmdiYScsSFNMOidoc2wnLEhTTEE6J2hzbGEnfTtDb21tb24uQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBPVswLDAsMCwwXTtDb21tb24uQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnPVswLDAsMCwwXTtDb21tb24uQ29sb3IuTmlja25hbWVzPXsnYWxpY2VibHVlJzpbMjQwLDI0OCwyNTVdLCdhbnRpcXVld2hpdGUnOlsyNTAsMjM1LDIxNV0sJ2FxdWEnOlswLDI1NSwyNTVdLCdhcXVhbWFyaW5lJzpbMTI3LDI1NSwyMTJdLCdhenVyZSc6WzI0MCwyNTUsMjU1XSwnYmVpZ2UnOlsyNDUsMjQ1LDIyMF0sJ2Jpc3F1ZSc6WzI1NSwyMjgsMTk2XSwnYmxhY2snOlswLDAsMF0sJ2JsYW5jaGVkYWxtb25kJzpbMjU1LDIzNSwyMDVdLCdibHVlJzpbMCwwLDI1NV0sJ2JsdWV2aW9sZXQnOlsxMzgsNDMsMjI2XSwnYnJvd24nOlsxNjUsNDIsNDJdLCdidXJseXdvb2QnOlsyMjIsMTg0LDEzNV0sJ2NhZGV0Ymx1ZSc6Wzk1LDE1OCwxNjBdLCdjaGFydHJldXNlJzpbMTI3LDI1NSwwXSwnY2hvY29sYXRlJzpbMjEwLDEwNSwzMF0sJ2NvcmFsJzpbMjU1LDEyNyw4MF0sJ2Nvcm5mbG93ZXJibHVlJzpbMTAwLDE0OSwyMzddLCdjb3Juc2lsayc6WzI1NSwyNDgsMjIwXSwnY3JpbXNvbic6WzIzNywyMCw2MV0sJ2N5YW4nOlswLDI1NSwyNTVdLCdkYXJrYmx1ZSc6WzAsMCwxMzldLCdkYXJrY3lhbic6WzAsMTM5LDEzOV0sJ2Rhcmtnb2xkZW5yb2QnOlsxODQsMTM0LDExXSwnZGFya2dyYXknOlsxNjksMTY5LDE2OV0sJ2RhcmtncmV5JzpbMTY5LDE2OSwxNjldLCdkYXJrZ3JlZW4nOlswLDEwMCwwXSwnZGFya2toYWtpJzpbMTg5LDE4MywxMDddLCdkYXJrbWFnZW50YSc6WzEzOSwwLDEzOV0sJ2RhcmtvbGl2ZWdyZWVuJzpbODUsMTA3LDQ3XSwnZGFya29yYW5nZSc6WzI1NSwxNDAsMF0sJ2RhcmtvcmNoaWQnOlsxNTMsNTAsMjA0XSwnZGFya3JlZCc6WzEzOSwwLDBdLCdkYXJrc2FsbW9uJzpbMjMzLDE1MCwxMjJdLCdkYXJrc2VhZ3JlZW4nOlsxNDMsMTg4LDE0M10sJ2RhcmtzbGF0ZWJsdWUnOls3Miw2MSwxMzldLCdkYXJrc2xhdGVncmF5JzpbNDcsNzksNzldLCdkYXJrc2xhdGVncmV5JzpbNDcsNzksNzldLCdkYXJrdHVycXVvaXNlJzpbMCwyMDYsMjA5XSwnZGFya3Zpb2xldCc6WzE0OCwwLDIxMV0sJ2RlZXBwaW5rJzpbMjU1LDIwLDE0N10sJ2RlZXBza3libHVlJzpbMCwxOTEsMjU1XSwnZGltZ3JheSc6WzEwNSwxMDUsMTA1XSwnZGltZ3JleSc6WzEwNSwxMDUsMTA1XSwnZG9kZ2VyYmx1ZSc6WzMwLDE0NCwyNTVdLCdmaXJlYnJpY2snOlsxNzgsMzQsMzRdLCdmbG9yYWx3aGl0ZSc6WzI1NSwyNTAsMjQwXSwnZm9yZXN0Z3JlZW4nOlszNCwxMzksMzRdLCdmdWNoc2lhJzpbMjU1LDAsMjU1XSwnZ2FpbnNib3JvJzpbMjIwLDIyMCwyMjBdLCdnaG9zdHdoaXRlJzpbMjQ4LDI0OCwyNTVdLCdnb2xkJzpbMjU1LDIxNSwwXSwnZ29sZGVucm9kJzpbMjE4LDE2NSwzMl0sJ2dyYXknOlsxMjgsMTI4LDEyOF0sJ2dyZXknOlsxMjgsMTI4LDEyOF0sJ2dyZWVuJzpbMCwxMjgsMF0sJ2dyZWVueWVsbG93JzpbMTczLDI1NSw0N10sJ2hvbmV5ZGV3JzpbMjQwLDI1NSwyNDBdLCdob3RwaW5rJzpbMjU1LDEwNSwxODBdLCdpbmRpYW5yZWQnOlsyMDUsOTIsOTJdLCdpbmRpZ28nOls3NSwwLDEzMF0sJ2l2b3J5JzpbMjU1LDI1NSwyNDBdLCdraGFraSc6WzI0MCwyMzAsMTQwXSwnbGF2ZW5kZXInOlsyMzAsMjMwLDI1MF0sJ2xhdmVuZGVyYmx1c2gnOlsyNTUsMjQwLDI0NV0sJ2xhd25ncmVlbic6WzEyNCwyNTIsMF0sJ2xlbW9uY2hpZmZvbic6WzI1NSwyNTAsMjA1XSwnbGlnaHRibHVlJzpbMTczLDIxNiwyMzBdLCdsaWdodGNvcmFsJzpbMjQwLDEyOCwxMjhdLCdsaWdodGN5YW4nOlsyMjQsMjU1LDI1NV0sJ2xpZ2h0Z29sZGVucm9keWVsbG93JzpbMjUwLDI1MCwyMTBdLCdsaWdodGdyZWVuJzpbMTQ0LDIzOCwxNDRdLCdsaWdodGdyYXknOlsyMTEsMjExLDIxMV0sJ2xpZ2h0Z3JleSc6WzIxMSwyMTEsMjExXSwnbGlnaHRwaW5rJzpbMjU1LDE4MiwxOTNdLCdsaWdodHNhbG1vbic6WzI1NSwxNjAsMTIyXSwnbGlnaHRzZWFncmVlbic6WzMyLDE3OCwxNzBdLCdsaWdodHNreWJsdWUnOlsxMzUsMjA2LDI1MF0sJ2xpZ2h0c2xhdGVncmF5JzpbMTE5LDEzNiwxNTNdLCdsaWdodHNsYXRlZ3JleSc6WzExOSwxMzYsMTUzXSwnbGlnaHRzdGVlbGJsdWUnOlsxNzYsMTk2LDIyMl0sJ2xpZ2h0eWVsbG93JzpbMjU1LDI1NSwyMjRdLCdsaW1lJzpbMCwyNTUsMF0sJ2xpbWVncmVlbic6WzUwLDIwNSw1MF0sJ2xpbmVuJzpbMjUwLDI0MCwyMzBdLCdtYWdlbnRhJzpbMjU1LDAsMjU1XSwnbWFyb29uJzpbMTI4LDAsMF0sJ21lZGl1bWFxdWFtYXJpbmUnOlsxMDIsMjA1LDE3MF0sJ21lZGl1bWJsdWUnOlswLDAsMjA1XSwnbWVkaXVtb3JjaGlkJzpbMTg2LDg1LDIxMV0sJ21lZGl1bXB1cnBsZSc6WzE0NywxMTIsMjE5XSwnbWVkaXVtc2VhZ3JlZW4nOls2MCwxNzksMTEzXSwnbWVkaXVtc2xhdGVibHVlJzpbMTIzLDEwNCwyMzhdLCdtZWRpdW1zcHJpbmdncmVlbic6WzAsMjUwLDE1NF0sJ21lZGl1bXR1cnF1b2lzZSc6WzcyLDIwOSwyMDRdLCdtZWRpdW12aW9sZXRyZWQnOlsxOTksMjEsMTMzXSwnbWlkbmlnaHRibHVlJzpbMjUsMjUsMTEyXSwnbWludGNyZWFtJzpbMjQ1LDI1NSwyNTBdLCdtaXN0eXJvc2UnOlsyNTUsMjI4LDIyNV0sJ21vY2Nhc2luJzpbMjU1LDIyOCwxODFdLCduYXZham93aGl0ZSc6WzI1NSwyMjIsMTczXSwnbmF2eSc6WzAsMCwxMjhdLCdvbGRsYWNlJzpbMjUzLDI0NSwyMzBdLCdvbGl2ZSc6WzEyOCwxMjgsMF0sJ29saXZlZHJhYic6WzEwNywxNDIsMzVdLCdvcmFuZ2UnOlsyNTUsMTY1LDBdLCdvcmFuZ2VyZWQnOlsyNTUsNjksMF0sJ29yY2hpZCc6WzIxOCwxMTIsMjE0XSwncGFsZWdvbGRlbnJvZCc6WzIzOCwyMzIsMTcwXSwncGFsZWdyZWVuJzpbMTUyLDI1MSwxNTJdLCdwYWxldHVycXVvaXNlJzpbMTc1LDIzOCwyMzhdLCdwYWxldmlvbGV0cmVkJzpbMjE5LDExMiwxNDddLCdwYXBheWF3aGlwJzpbMjU1LDIzOSwyMTNdLCdwZWFjaHB1ZmYnOlsyNTUsMjE4LDE4NV0sJ3BlcnUnOlsyMDUsMTMzLDYzXSwncGluayc6WzI1NSwxOTIsMjAzXSwncGx1bSc6WzIyMSwxNjAsMjIxXSwncG93ZGVyYmx1ZSc6WzE3NiwyMjQsMjMwXSwncHVycGxlJzpbMTI4LDAsMTI4XSwncmViZWNjYXB1cnBsZSc6WzEwMiw1MSwxNTNdLCdyZWQnOlsyNTUsMCwwXSwncm9zeWJyb3duJzpbMTg4LDE0MywxNDNdLCdyb3lhbGJsdWUnOls2NSwxMDUsMjI1XSwnc2FkZGxlYnJvd24nOlsxMzksNjksMTldLCdzYWxtb24nOlsyNTAsMTI4LDExNF0sJ3NhbmR5YnJvd24nOlsyNDQsMTY0LDk2XSwnc2VhZ3JlZW4nOls0NiwxMzksODddLCdzZWFzaGVsbCc6WzI1NSwyNDUsMjM4XSwnc2llbm5hJzpbMTYwLDgyLDQ1XSwnc2lsdmVyJzpbMTkyLDE5MiwxOTJdLCdza3libHVlJzpbMTM1LDIwNiwyMzVdLCdzbGF0ZWJsdWUnOlsxMDYsOTAsMjA1XSwnc2xhdGVncmF5JzpbMTEyLDEyOCwxNDRdLCdzbGF0ZWdyZXknOlsxMTIsMTI4LDE0NF0sJ3Nub3cnOlsyNTUsMjUwLDI1MF0sJ3NwcmluZ2dyZWVuJzpbMCwyNTUsMTI3XSwnc3RlZWxibHVlJzpbNzAsMTMwLDE4MF0sJ3Rhbic6WzIxMCwxODAsMTQwXSwndGVhbCc6WzAsMTI4LDEyOF0sJ3RoaXN0bGUnOlsyMTYsMTkxLDIxNl0sJ3RvbWF0byc6WzI1NSw5OSw3MV0sJ3R1cnF1b2lzZSc6WzY0LDIyNCwyMDhdLCd2aW9sZXQnOlsyMzgsMTMwLDIzOF0sJ3doZWF0JzpbMjQ1LDIyMiwxNzldLCd3aGl0ZSc6WzI1NSwyNTUsMjU1XSwnd2hpdGVzbW9rZSc6WzI0NSwyNDUsMjQ1XSwneWVsbG93JzpbMjU1LDI1NSwwXSwneWVsbG93Z3JlZW4nOlsxNTQsMjA1LDUwXSwndHJhbnNwYXJlbnQnOlswLDAsMCwwXSx9O0NvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0PXtDb250ZW50OkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMTExLDE2OCwyMjAsLjY2XSksQ29udGVudExpZ2h0OkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMTExLDE2OCwyMjAsLjVdKSxDb250ZW50T3V0bGluZTpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzksODMsMTQ4XSksUGFkZGluZzpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzE0NywxOTYsMTI1LC41NV0pLFBhZGRpbmdMaWdodDpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzE0NywxOTYsMTI1LC40XSksQm9yZGVyOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMjU1LDIyOSwxNTMsLjY2XSksQm9yZGVyTGlnaHQ6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFsyNTUsMjI5LDE1MywuNV0pLE1hcmdpbjpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzI0NiwxNzgsMTA3LC42Nl0pLE1hcmdpbkxpZ2h0OkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMjQ2LDE3OCwxMDcsLjVdKSxFdmVudFRhcmdldDpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzI1NSwxOTYsMTk2LC42Nl0pLFNoYXBlOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbOTYsODIsMTc3LDAuOF0pLFNoYXBlTWFyZ2luOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbOTYsODIsMTI3LC42XSksQ3NzR3JpZDpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzB4NGIsMCwweDgyLDFdKX07Q29tbW9uLkNvbG9yLkdlbmVyYXRvcj1jbGFzc3tjb25zdHJ1Y3RvcihodWVTcGFjZSxzYXRTcGFjZSxsaWdodG5lc3NTcGFjZSxhbHBoYVNwYWNlKXt0aGlzLl9odWVTcGFjZT1odWVTcGFjZXx8e21pbjowLG1heDozNjB9O3RoaXMuX3NhdFNwYWNlPXNhdFNwYWNlfHw2Nzt0aGlzLl9saWdodG5lc3NTcGFjZT1saWdodG5lc3NTcGFjZXx8ODA7dGhpcy5fYWxwaGFTcGFjZT1hbHBoYVNwYWNlfHwxO3RoaXMuX2NvbG9ycz1uZXcgTWFwKCk7fQpzZXRDb2xvckZvcklEKGlkLGNvbG9yKXt0aGlzLl9jb2xvcnMuc2V0KGlkLGNvbG9yKTt9CmNvbG9yRm9ySUQoaWQpe2xldCBjb2xvcj10aGlzLl9jb2xvcnMuZ2V0KGlkKTtpZighY29sb3Ipe2NvbG9yPXRoaXMuX2dlbmVyYXRlQ29sb3JGb3JJRChpZCk7dGhpcy5fY29sb3JzLnNldChpZCxjb2xvcik7fQpyZXR1cm4gY29sb3I7fQpfZ2VuZXJhdGVDb2xvckZvcklEKGlkKXtjb25zdCBoYXNoPVN0cmluZy5oYXNoQ29kZShpZCk7Y29uc3QgaD10aGlzLl9pbmRleFRvVmFsdWVJblNwYWNlKGhhc2gsdGhpcy5faHVlU3BhY2UpO2NvbnN0IHM9dGhpcy5faW5kZXhUb1ZhbHVlSW5TcGFjZShoYXNoPj44LHRoaXMuX3NhdFNwYWNlKTtjb25zdCBsPXRoaXMuX2luZGV4VG9WYWx1ZUluU3BhY2UoaGFzaD4+MTYsdGhpcy5fbGlnaHRuZXNzU3BhY2UpO2NvbnN0IGE9dGhpcy5faW5kZXhUb1ZhbHVlSW5TcGFjZShoYXNoPj4yNCx0aGlzLl9hbHBoYVNwYWNlKTtyZXR1cm5gaHNsYSgke2h9LCAke3N9JSwgJHtsfSUsICR7YX0pYDt9Cl9pbmRleFRvVmFsdWVJblNwYWNlKGluZGV4LHNwYWNlKXtpZih0eXBlb2Ygc3BhY2U9PT0nbnVtYmVyJykKcmV0dXJuIHNwYWNlO2NvbnN0IGNvdW50PXNwYWNlLmNvdW50fHxzcGFjZS5tYXgtc3BhY2UubWluO2luZGV4JT1jb3VudDtyZXR1cm4gc3BhY2UubWluK01hdGguZmxvb3IoaW5kZXgvKGNvdW50LTEpKihzcGFjZS5tYXgtc3BhY2UubWluKSk7fX07O0NvbW1vbi5Db25zb2xlPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fbWVzc2FnZXM9W107fQphZGRNZXNzYWdlKHRleHQsbGV2ZWwsc2hvdyl7Y29uc3QgbWVzc2FnZT1uZXcgQ29tbW9uLkNvbnNvbGUuTWVzc2FnZSh0ZXh0LGxldmVsfHxDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuSW5mbyxEYXRlLm5vdygpLHNob3d8fGZhbHNlKTt0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKENvbW1vbi5Db25zb2xlLkV2ZW50cy5NZXNzYWdlQWRkZWQsbWVzc2FnZSk7fQpsb2codGV4dCl7dGhpcy5hZGRNZXNzYWdlKHRleHQsQ29tbW9uLkNvbnNvbGUuTWVzc2FnZUxldmVsLkluZm8pO30Kd2Fybih0ZXh0KXt0aGlzLmFkZE1lc3NhZ2UodGV4dCxDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuV2FybmluZyk7fQplcnJvcih0ZXh0KXt0aGlzLmFkZE1lc3NhZ2UodGV4dCxDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuRXJyb3IsdHJ1ZSk7fQptZXNzYWdlcygpe3JldHVybiB0aGlzLl9tZXNzYWdlczt9CnNob3coKXt0aGlzLnNob3dQcm9taXNlKCk7fQpzaG93UHJvbWlzZSgpe3JldHVybiBDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHRoaXMpO319O0NvbW1vbi5Db25zb2xlLkV2ZW50cz17TWVzc2FnZUFkZGVkOlN5bWJvbCgnbWVzc2FnZUFkZGVkJyl9O0NvbW1vbi5Db25zb2xlLk1lc3NhZ2VMZXZlbD17SW5mbzonaW5mbycsV2FybmluZzond2FybmluZycsRXJyb3I6J2Vycm9yJ307Q29tbW9uLkNvbnNvbGUuTWVzc2FnZT1jbGFzc3tjb25zdHJ1Y3Rvcih0ZXh0LGxldmVsLHRpbWVzdGFtcCxzaG93KXt0aGlzLnRleHQ9dGV4dDt0aGlzLmxldmVsPWxldmVsO3RoaXMudGltZXN0YW1wPSh0eXBlb2YgdGltZXN0YW1wPT09J251bWJlcicpP3RpbWVzdGFtcDpEYXRlLm5vdygpO3RoaXMuc2hvdz1zaG93O319O0NvbW1vbi5jb25zb2xlPW5ldyBDb21tb24uQ29uc29sZSgpOztDb21tb24uQ29udGVudFByb3ZpZGVyPWZ1bmN0aW9uKCl7fTtDb21tb24uQ29udGVudFByb3ZpZGVyLnByb3RvdHlwZT17Y29udGVudFVSTCgpe30sY29udGVudFR5cGUoKXt9LGNvbnRlbnRFbmNvZGVkKCl7fSxyZXF1ZXN0Q29udGVudCgpe30sc2VhcmNoSW5Db250ZW50KHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCl7fX07Q29tbW9uLkNvbnRlbnRQcm92aWRlci5TZWFyY2hNYXRjaD1jbGFzc3tjb25zdHJ1Y3RvcihsaW5lTnVtYmVyLGxpbmVDb250ZW50KXt0aGlzLmxpbmVOdW1iZXI9bGluZU51bWJlcjt0aGlzLmxpbmVDb250ZW50PWxpbmVDb250ZW50O319O0NvbW1vbi5Db250ZW50UHJvdmlkZXIucGVyZm9ybVNlYXJjaEluQ29udGVudD1mdW5jdGlvbihjb250ZW50LHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCl7Y29uc3QgcmVnZXg9Y3JlYXRlU2VhcmNoUmVnZXgocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtjb25zdCB0ZXh0PW5ldyBUZXh0VXRpbHMuVGV4dChjb250ZW50KTtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPTA7aTx0ZXh0LmxpbmVDb3VudCgpOysraSl7Y29uc3QgbGluZUNvbnRlbnQ9dGV4dC5saW5lQXQoaSk7cmVnZXgubGFzdEluZGV4PTA7aWYocmVnZXguZXhlYyhsaW5lQ29udGVudCkpCnJlc3VsdC5wdXNoKG5ldyBDb21tb24uQ29udGVudFByb3ZpZGVyLlNlYXJjaE1hdGNoKGksbGluZUNvbnRlbnQpKTt9CnJldHVybiByZXN1bHQ7fTtDb21tb24uQ29udGVudFByb3ZpZGVyLmNvbnRlbnRBc0RhdGFVUkw9ZnVuY3Rpb24oY29udGVudCxtaW1lVHlwZSxjb250ZW50RW5jb2RlZCxjaGFyc2V0KXtjb25zdCBtYXhEYXRhVXJsU2l6ZT0xMDI0KjEwMjQ7aWYoY29udGVudD09PW51bGx8fGNvbnRlbnQubGVuZ3RoPm1heERhdGFVcmxTaXplKQpyZXR1cm4gbnVsbDtyZXR1cm4nZGF0YTonK21pbWVUeXBlKyhjaGFyc2V0Pyc7Y2hhcnNldD0nK2NoYXJzZXQ6JycpKyhjb250ZW50RW5jb2RlZD8nO2Jhc2U2NCc6JycpKycsJysKY29udGVudDt9OztDb21tb24uUGFyc2VkVVJMPWNsYXNze2NvbnN0cnVjdG9yKHVybCl7dGhpcy5pc1ZhbGlkPWZhbHNlO3RoaXMudXJsPXVybDt0aGlzLnNjaGVtZT0nJzt0aGlzLnVzZXI9Jyc7dGhpcy5ob3N0PScnO3RoaXMucG9ydD0nJzt0aGlzLnBhdGg9Jyc7dGhpcy5xdWVyeVBhcmFtcz0nJzt0aGlzLmZyYWdtZW50PScnO3RoaXMuZm9sZGVyUGF0aENvbXBvbmVudHM9Jyc7dGhpcy5sYXN0UGF0aENvbXBvbmVudD0nJztjb25zdCBtYXRjaD11cmwubWF0Y2goQ29tbW9uLlBhcnNlZFVSTC5fdXJsUmVnZXgoKSk7aWYobWF0Y2gpe3RoaXMuaXNWYWxpZD10cnVlO3RoaXMuc2NoZW1lPW1hdGNoWzJdLnRvTG93ZXJDYXNlKCk7dGhpcy51c2VyPW1hdGNoWzNdO3RoaXMuaG9zdD1tYXRjaFs0XTt0aGlzLnBvcnQ9bWF0Y2hbNV07dGhpcy5wYXRoPW1hdGNoWzZdfHwnLyc7dGhpcy5xdWVyeVBhcmFtcz1tYXRjaFs3XXx8Jyc7dGhpcy5mcmFnbWVudD1tYXRjaFs4XTt9ZWxzZXtpZih0aGlzLnVybC5zdGFydHNXaXRoKCdkYXRhOicpKXt0aGlzLnNjaGVtZT0nZGF0YSc7cmV0dXJuO30KaWYodGhpcy51cmw9PT0nYWJvdXQ6YmxhbmsnKXt0aGlzLnNjaGVtZT0nYWJvdXQnO3JldHVybjt9CnRoaXMucGF0aD10aGlzLnVybDt9CmNvbnN0IGxhc3RTbGFzaEluZGV4PXRoaXMucGF0aC5sYXN0SW5kZXhPZignLycpO2lmKGxhc3RTbGFzaEluZGV4IT09LTEpe3RoaXMuZm9sZGVyUGF0aENvbXBvbmVudHM9dGhpcy5wYXRoLnN1YnN0cmluZygwLGxhc3RTbGFzaEluZGV4KTt0aGlzLmxhc3RQYXRoQ29tcG9uZW50PXRoaXMucGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoSW5kZXgrMSk7fWVsc2V7dGhpcy5sYXN0UGF0aENvbXBvbmVudD10aGlzLnBhdGg7fX0Kc3RhdGljIHBsYXRmb3JtUGF0aFRvVVJMKGZpbGVTeXN0ZW1QYXRoKXtmaWxlU3lzdGVtUGF0aD1maWxlU3lzdGVtUGF0aC5yZXBsYWNlKC9cXC9nLCcvJyk7aWYoIWZpbGVTeXN0ZW1QYXRoLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSl7aWYoZmlsZVN5c3RlbVBhdGguc3RhcnRzV2l0aCgnLycpKQpmaWxlU3lzdGVtUGF0aD0nZmlsZTovLycrZmlsZVN5c3RlbVBhdGg7ZWxzZQpmaWxlU3lzdGVtUGF0aD0nZmlsZTovLy8nK2ZpbGVTeXN0ZW1QYXRoO30KcmV0dXJuIGZpbGVTeXN0ZW1QYXRoO30Kc3RhdGljIHVybFRvUGxhdGZvcm1QYXRoKGZpbGVVUkwsaXNXaW5kb3dzKXtjb25zb2xlLmFzc2VydChmaWxlVVJMLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSwnVGhpcyBtdXN0IGJlIGEgZmlsZSBVUkwuJyk7aWYoaXNXaW5kb3dzKQpyZXR1cm4gZmlsZVVSTC5zdWJzdHIoJ2ZpbGU6Ly8vJy5sZW5ndGgpLnJlcGxhY2UoL1wvL2csJ1xcJyk7cmV0dXJuIGZpbGVVUkwuc3Vic3RyKCdmaWxlOi8vJy5sZW5ndGgpO30Kc3RhdGljIHVybFdpdGhvdXRIYXNoKHVybCl7Y29uc3QgaGFzaEluZGV4PXVybC5pbmRleE9mKCcjJyk7aWYoaGFzaEluZGV4IT09LTEpCnJldHVybiB1cmwuc3Vic3RyKDAsaGFzaEluZGV4KTtyZXR1cm4gdXJsO30Kc3RhdGljIF91cmxSZWdleCgpe2lmKENvbW1vbi5QYXJzZWRVUkwuX3VybFJlZ2V4SW5zdGFuY2UpCnJldHVybiBDb21tb24uUGFyc2VkVVJMLl91cmxSZWdleEluc3RhbmNlO2NvbnN0IHNjaGVtZVJlZ2V4PS8oW0EtWmEtel1bQS1aYS16MC05Ky4tXSopOlwvXC8vO2NvbnN0IHVzZXJSZWdleD0vKD86KFtBLVphLXowLTlcLS5ffiUhJCYnKCkqKyw7PTpdKilAKT8vO2NvbnN0IGhvc3RSZWdleD0vKCg/OlxbOjpcZD9cXSl8KD86W15cc1wvOl0qKSkvO2NvbnN0IHBvcnRSZWdleD0vKD86OihbXGRdKykpPy87Y29uc3QgcGF0aFJlZ2V4PS8oXC9bXiM/XSopPy87Y29uc3QgcXVlcnlSZWdleD0vKD86XD8oW14jXSopKT8vO2NvbnN0IGZyYWdtZW50UmVnZXg9Lyg/OiMoLiopKT8vO0NvbW1vbi5QYXJzZWRVUkwuX3VybFJlZ2V4SW5zdGFuY2U9bmV3IFJlZ0V4cCgnXignK3NjaGVtZVJlZ2V4LnNvdXJjZSt1c2VyUmVnZXguc291cmNlK2hvc3RSZWdleC5zb3VyY2UrcG9ydFJlZ2V4LnNvdXJjZSsnKScrcGF0aFJlZ2V4LnNvdXJjZSsKcXVlcnlSZWdleC5zb3VyY2UrZnJhZ21lbnRSZWdleC5zb3VyY2UrJyQnKTtyZXR1cm4gQ29tbW9uLlBhcnNlZFVSTC5fdXJsUmVnZXhJbnN0YW5jZTt9CnN0YXRpYyBleHRyYWN0UGF0aCh1cmwpe2NvbnN0IHBhcnNlZFVSTD11cmwuYXNQYXJzZWRVUkwoKTtyZXR1cm4gcGFyc2VkVVJMP3BhcnNlZFVSTC5wYXRoOicnO30Kc3RhdGljIGV4dHJhY3RPcmlnaW4odXJsKXtjb25zdCBwYXJzZWRVUkw9dXJsLmFzUGFyc2VkVVJMKCk7cmV0dXJuIHBhcnNlZFVSTD9wYXJzZWRVUkwuc2VjdXJpdHlPcmlnaW4oKTonJzt9CnN0YXRpYyBleHRyYWN0RXh0ZW5zaW9uKHVybCl7dXJsPUNvbW1vbi5QYXJzZWRVUkwudXJsV2l0aG91dEhhc2godXJsKTtjb25zdCBpbmRleE9mUXVlc3Rpb25NYXJrPXVybC5pbmRleE9mKCc/Jyk7aWYoaW5kZXhPZlF1ZXN0aW9uTWFyayE9PS0xKQp1cmw9dXJsLnN1YnN0cigwLGluZGV4T2ZRdWVzdGlvbk1hcmspO2NvbnN0IGxhc3RJbmRleE9mU2xhc2g9dXJsLmxhc3RJbmRleE9mKCcvJyk7aWYobGFzdEluZGV4T2ZTbGFzaCE9PS0xKQp1cmw9dXJsLnN1YnN0cihsYXN0SW5kZXhPZlNsYXNoKzEpO2NvbnN0IGxhc3RJbmRleE9mRG90PXVybC5sYXN0SW5kZXhPZignLicpO2lmKGxhc3RJbmRleE9mRG90IT09LTEpe3VybD11cmwuc3Vic3RyKGxhc3RJbmRleE9mRG90KzEpO2NvbnN0IGxhc3RJbmRleE9mUGVyY2VudD11cmwuaW5kZXhPZignJScpO2lmKGxhc3RJbmRleE9mUGVyY2VudCE9PS0xKQpyZXR1cm4gdXJsLnN1YnN0cigwLGxhc3RJbmRleE9mUGVyY2VudCk7cmV0dXJuIHVybDt9CnJldHVybicnO30Kc3RhdGljIGV4dHJhY3ROYW1lKHVybCl7bGV0IGluZGV4PXVybC5sYXN0SW5kZXhPZignLycpO2NvbnN0IHBhdGhBbmRRdWVyeT1pbmRleCE9PS0xP3VybC5zdWJzdHIoaW5kZXgrMSk6dXJsO2luZGV4PXBhdGhBbmRRdWVyeS5pbmRleE9mKCc/Jyk7cmV0dXJuIGluZGV4PDA/cGF0aEFuZFF1ZXJ5OnBhdGhBbmRRdWVyeS5zdWJzdHIoMCxpbmRleCk7fQpzdGF0aWMgY29tcGxldGVVUkwoYmFzZVVSTCxocmVmKXtjb25zdCB0cmltbWVkSHJlZj1ocmVmLnRyaW0oKTtpZih0cmltbWVkSHJlZi5zdGFydHNXaXRoKCdkYXRhOicpfHx0cmltbWVkSHJlZi5zdGFydHNXaXRoKCdibG9iOicpfHx0cmltbWVkSHJlZi5zdGFydHNXaXRoKCdqYXZhc2NyaXB0OicpKQpyZXR1cm4gaHJlZjtjb25zdCBwYXJzZWRIcmVmPXRyaW1tZWRIcmVmLmFzUGFyc2VkVVJMKCk7aWYocGFyc2VkSHJlZiYmcGFyc2VkSHJlZi5zY2hlbWUpCnJldHVybiB0cmltbWVkSHJlZjtjb25zdCBwYXJzZWRVUkw9YmFzZVVSTC5hc1BhcnNlZFVSTCgpO2lmKCFwYXJzZWRVUkwpCnJldHVybiBudWxsO2lmKHBhcnNlZFVSTC5pc0RhdGFVUkwoKSkKcmV0dXJuIGhyZWY7aWYoaHJlZi5sZW5ndGg+MSYmaHJlZi5jaGFyQXQoMCk9PT0nLycmJmhyZWYuY2hhckF0KDEpPT09Jy8nKXtyZXR1cm4gcGFyc2VkVVJMLnNjaGVtZSsnOicraHJlZjt9CmNvbnN0IHNlY3VyaXR5T3JpZ2luPXBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbigpO2NvbnN0IHBhdGhUZXh0PXBhcnNlZFVSTC5wYXRoO2NvbnN0IHF1ZXJ5VGV4dD1wYXJzZWRVUkwucXVlcnlQYXJhbXM/Jz8nK3BhcnNlZFVSTC5xdWVyeVBhcmFtczonJztpZighaHJlZi5sZW5ndGgpCnJldHVybiBzZWN1cml0eU9yaWdpbitwYXRoVGV4dCtxdWVyeVRleHQ7aWYoaHJlZi5jaGFyQXQoMCk9PT0nIycpCnJldHVybiBzZWN1cml0eU9yaWdpbitwYXRoVGV4dCtxdWVyeVRleHQraHJlZjtpZihocmVmLmNoYXJBdCgwKT09PSc/JykKcmV0dXJuIHNlY3VyaXR5T3JpZ2luK3BhdGhUZXh0K2hyZWY7bGV0IGhyZWZQYXRoPWhyZWYubWF0Y2goL15bXiM/XSovKVswXTtjb25zdCBocmVmU3VmZml4PWhyZWYuc3Vic3RyaW5nKGhyZWZQYXRoLmxlbmd0aCk7aWYoaHJlZlBhdGguY2hhckF0KDApIT09Jy8nKQpocmVmUGF0aD1wYXJzZWRVUkwuZm9sZGVyUGF0aENvbXBvbmVudHMrJy8nK2hyZWZQYXRoO3JldHVybiBzZWN1cml0eU9yaWdpbitSdW50aW1lLm5vcm1hbGl6ZVBhdGgoaHJlZlBhdGgpK2hyZWZTdWZmaXg7fQpzdGF0aWMgc3BsaXRMaW5lQW5kQ29sdW1uKHN0cmluZyl7Y29uc3QgYmVmb3JlUGF0aE1hdGNoPXN0cmluZy5tYXRjaChDb21tb24uUGFyc2VkVVJMLl91cmxSZWdleCgpKTtsZXQgYmVmb3JlUGF0aD0nJztsZXQgcGF0aEFuZEFmdGVyPXN0cmluZztpZihiZWZvcmVQYXRoTWF0Y2gpe2JlZm9yZVBhdGg9YmVmb3JlUGF0aE1hdGNoWzFdO3BhdGhBbmRBZnRlcj1zdHJpbmcuc3Vic3RyaW5nKGJlZm9yZVBhdGhNYXRjaFsxXS5sZW5ndGgpO30KY29uc3QgbGluZUNvbHVtblJlZ0V4PS8oPzo6KFxkKykpPyg/OjooXGQrKSk/JC87Y29uc3QgbGluZUNvbHVtbk1hdGNoPWxpbmVDb2x1bW5SZWdFeC5leGVjKHBhdGhBbmRBZnRlcik7bGV0IGxpbmVOdW1iZXI7bGV0IGNvbHVtbk51bWJlcjtjb25zb2xlLmFzc2VydChsaW5lQ29sdW1uTWF0Y2gpO2lmKHR5cGVvZihsaW5lQ29sdW1uTWF0Y2hbMV0pPT09J3N0cmluZycpe2xpbmVOdW1iZXI9cGFyc2VJbnQobGluZUNvbHVtbk1hdGNoWzFdLDEwKTtsaW5lTnVtYmVyPWlzTmFOKGxpbmVOdW1iZXIpP3VuZGVmaW5lZDpsaW5lTnVtYmVyLTE7fQppZih0eXBlb2YobGluZUNvbHVtbk1hdGNoWzJdKT09PSdzdHJpbmcnKXtjb2x1bW5OdW1iZXI9cGFyc2VJbnQobGluZUNvbHVtbk1hdGNoWzJdLDEwKTtjb2x1bW5OdW1iZXI9aXNOYU4oY29sdW1uTnVtYmVyKT91bmRlZmluZWQ6Y29sdW1uTnVtYmVyLTE7fQpyZXR1cm57dXJsOmJlZm9yZVBhdGgrcGF0aEFuZEFmdGVyLnN1YnN0cmluZygwLHBhdGhBbmRBZnRlci5sZW5ndGgtbGluZUNvbHVtbk1hdGNoWzBdLmxlbmd0aCksbGluZU51bWJlcjpsaW5lTnVtYmVyLGNvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXJ9O30Kc3RhdGljIGlzUmVsYXRpdmVVUkwodXJsKXtyZXR1cm4hKC9eW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6Ly50ZXN0KHVybCkpO30KZ2V0IGRpc3BsYXlOYW1lKCl7aWYodGhpcy5fZGlzcGxheU5hbWUpCnJldHVybiB0aGlzLl9kaXNwbGF5TmFtZTtpZih0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4gdGhpcy5kYXRhVVJMRGlzcGxheU5hbWUoKTtpZih0aGlzLmlzQWJvdXRCbGFuaygpKQpyZXR1cm4gdGhpcy51cmw7dGhpcy5fZGlzcGxheU5hbWU9dGhpcy5sYXN0UGF0aENvbXBvbmVudDtpZighdGhpcy5fZGlzcGxheU5hbWUpCnRoaXMuX2Rpc3BsYXlOYW1lPSh0aGlzLmhvc3R8fCcnKSsnLyc7aWYodGhpcy5fZGlzcGxheU5hbWU9PT0nLycpCnRoaXMuX2Rpc3BsYXlOYW1lPXRoaXMudXJsO3JldHVybiB0aGlzLl9kaXNwbGF5TmFtZTt9CmRhdGFVUkxEaXNwbGF5TmFtZSgpe2lmKHRoaXMuX2RhdGFVUkxEaXNwbGF5TmFtZSkKcmV0dXJuIHRoaXMuX2RhdGFVUkxEaXNwbGF5TmFtZTtpZighdGhpcy5pc0RhdGFVUkwoKSkKcmV0dXJuJyc7dGhpcy5fZGF0YVVSTERpc3BsYXlOYW1lPXRoaXMudXJsLnRyaW1FbmQoMjApO3JldHVybiB0aGlzLl9kYXRhVVJMRGlzcGxheU5hbWU7fQppc0Fib3V0QmxhbmsoKXtyZXR1cm4gdGhpcy51cmw9PT0nYWJvdXQ6YmxhbmsnO30KaXNEYXRhVVJMKCl7cmV0dXJuIHRoaXMuc2NoZW1lPT09J2RhdGEnO30KbGFzdFBhdGhDb21wb25lbnRXaXRoRnJhZ21lbnQoKXtyZXR1cm4gdGhpcy5sYXN0UGF0aENvbXBvbmVudCsodGhpcy5mcmFnbWVudD8nIycrdGhpcy5mcmFnbWVudDonJyk7fQpkb21haW4oKXtpZih0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4nZGF0YTonO3JldHVybiB0aGlzLmhvc3QrKHRoaXMucG9ydD8nOicrdGhpcy5wb3J0OicnKTt9CnNlY3VyaXR5T3JpZ2luKCl7aWYodGhpcy5pc0RhdGFVUkwoKSkKcmV0dXJuJ2RhdGE6JztyZXR1cm4gdGhpcy5zY2hlbWUrJzovLycrdGhpcy5kb21haW4oKTt9CnVybFdpdGhvdXRTY2hlbWUoKXtpZih0aGlzLnNjaGVtZSYmdGhpcy51cmwuc3RhcnRzV2l0aCh0aGlzLnNjaGVtZSsnOi8vJykpCnJldHVybiB0aGlzLnVybC5zdWJzdHJpbmcodGhpcy5zY2hlbWUubGVuZ3RoKzMpO3JldHVybiB0aGlzLnVybDt9fTtTdHJpbmcucHJvdG90eXBlLmFzUGFyc2VkVVJMPWZ1bmN0aW9uKCl7Y29uc3QgcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKHRoaXMudG9TdHJpbmcoKSk7aWYocGFyc2VkVVJMLmlzVmFsaWQpCnJldHVybiBwYXJzZWRVUkw7cmV0dXJuIG51bGw7fTs7Q29tbW9uLlByb2dyZXNzPWZ1bmN0aW9uKCl7fTtDb21tb24uUHJvZ3Jlc3MucHJvdG90eXBlPXtzZXRUb3RhbFdvcmsodG90YWxXb3JrKXt9LHNldFRpdGxlKHRpdGxlKXt9LHNldFdvcmtlZCh3b3JrZWQsdGl0bGUpe30sd29ya2VkKHdvcmtlZCl7fSxkb25lKCl7fSxpc0NhbmNlbGVkKCl7cmV0dXJuIGZhbHNlO30sfTtDb21tb24uQ29tcG9zaXRlUHJvZ3Jlc3M9Y2xhc3N7Y29uc3RydWN0b3IocGFyZW50KXt0aGlzLl9wYXJlbnQ9cGFyZW50O3RoaXMuX2NoaWxkcmVuPVtdO3RoaXMuX2NoaWxkcmVuRG9uZT0wO3RoaXMuX3BhcmVudC5zZXRUb3RhbFdvcmsoMSk7dGhpcy5fcGFyZW50LnNldFdvcmtlZCgwKTt9Cl9jaGlsZERvbmUoKXtpZigrK3RoaXMuX2NoaWxkcmVuRG9uZSE9PXRoaXMuX2NoaWxkcmVuLmxlbmd0aCkKcmV0dXJuO3RoaXMuX3BhcmVudC5kb25lKCk7fQpjcmVhdGVTdWJQcm9ncmVzcyh3ZWlnaHQpe2NvbnN0IGNoaWxkPW5ldyBDb21tb24uU3ViUHJvZ3Jlc3ModGhpcyx3ZWlnaHQpO3RoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO3JldHVybiBjaGlsZDt9Cl91cGRhdGUoKXtsZXQgdG90YWxXZWlnaHRzPTA7bGV0IGRvbmU9MDtmb3IobGV0IGk9MDtpPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDsrK2kpe2NvbnN0IGNoaWxkPXRoaXMuX2NoaWxkcmVuW2ldO2lmKGNoaWxkLl90b3RhbFdvcmspCmRvbmUrPWNoaWxkLl93ZWlnaHQqY2hpbGQuX3dvcmtlZC9jaGlsZC5fdG90YWxXb3JrO3RvdGFsV2VpZ2h0cys9Y2hpbGQuX3dlaWdodDt9CnRoaXMuX3BhcmVudC5zZXRXb3JrZWQoZG9uZS90b3RhbFdlaWdodHMpO319O0NvbW1vbi5TdWJQcm9ncmVzcz1jbGFzc3tjb25zdHJ1Y3Rvcihjb21wb3NpdGUsd2VpZ2h0KXt0aGlzLl9jb21wb3NpdGU9Y29tcG9zaXRlO3RoaXMuX3dlaWdodD13ZWlnaHR8fDE7dGhpcy5fd29ya2VkPTA7fQppc0NhbmNlbGVkKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2l0ZS5fcGFyZW50LmlzQ2FuY2VsZWQoKTt9CnNldFRpdGxlKHRpdGxlKXt0aGlzLl9jb21wb3NpdGUuX3BhcmVudC5zZXRUaXRsZSh0aXRsZSk7fQpkb25lKCl7dGhpcy5zZXRXb3JrZWQodGhpcy5fdG90YWxXb3JrKTt0aGlzLl9jb21wb3NpdGUuX2NoaWxkRG9uZSgpO30Kc2V0VG90YWxXb3JrKHRvdGFsV29yayl7dGhpcy5fdG90YWxXb3JrPXRvdGFsV29yazt0aGlzLl9jb21wb3NpdGUuX3VwZGF0ZSgpO30Kc2V0V29ya2VkKHdvcmtlZCx0aXRsZSl7dGhpcy5fd29ya2VkPXdvcmtlZDtpZih0eXBlb2YgdGl0bGUhPT0ndW5kZWZpbmVkJykKdGhpcy5zZXRUaXRsZSh0aXRsZSk7dGhpcy5fY29tcG9zaXRlLl91cGRhdGUoKTt9CndvcmtlZCh3b3JrZWQpe3RoaXMuc2V0V29ya2VkKHRoaXMuX3dvcmtlZCsod29ya2VkfHwxKSk7fX07Q29tbW9uLlByb2dyZXNzUHJveHk9Y2xhc3N7Y29uc3RydWN0b3IoZGVsZWdhdGUsZG9uZUNhbGxiYWNrKXt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl9kb25lQ2FsbGJhY2s9ZG9uZUNhbGxiYWNrO30KaXNDYW5jZWxlZCgpe3JldHVybiB0aGlzLl9kZWxlZ2F0ZT90aGlzLl9kZWxlZ2F0ZS5pc0NhbmNlbGVkKCk6ZmFsc2U7fQpzZXRUaXRsZSh0aXRsZSl7aWYodGhpcy5fZGVsZWdhdGUpCnRoaXMuX2RlbGVnYXRlLnNldFRpdGxlKHRpdGxlKTt9CmRvbmUoKXtpZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUuZG9uZSgpO2lmKHRoaXMuX2RvbmVDYWxsYmFjaykKdGhpcy5fZG9uZUNhbGxiYWNrKCk7fQpzZXRUb3RhbFdvcmsodG90YWxXb3JrKXtpZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUuc2V0VG90YWxXb3JrKHRvdGFsV29yayk7fQpzZXRXb3JrZWQod29ya2VkLHRpdGxlKXtpZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUuc2V0V29ya2VkKHdvcmtlZCx0aXRsZSk7fQp3b3JrZWQod29ya2VkKXtpZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUud29ya2VkKHdvcmtlZCk7fX07O0NvbW1vbi5SZXNvdXJjZVR5cGU9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSx0aXRsZSxjYXRlZ29yeSxpc1RleHRUeXBlKXt0aGlzLl9uYW1lPW5hbWU7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5fY2F0ZWdvcnk9Y2F0ZWdvcnk7dGhpcy5faXNUZXh0VHlwZT1pc1RleHRUeXBlO30Kc3RhdGljIGZyb21NaW1lVHlwZShtaW1lVHlwZSl7aWYobWltZVR5cGUuc3RhcnRzV2l0aCgndGV4dC9odG1sJykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5Eb2N1bWVudDtpZihtaW1lVHlwZS5zdGFydHNXaXRoKCd0ZXh0L2NzcycpKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuU3R5bGVzaGVldDtpZihtaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlO2lmKG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ3RleHQvJykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5TY3JpcHQ7aWYobWltZVR5cGUuaW5jbHVkZXMoJ2ZvbnQnKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLkZvbnQ7aWYobWltZVR5cGUuaW5jbHVkZXMoJ3NjcmlwdCcpKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0O2lmKG1pbWVUeXBlLmluY2x1ZGVzKCdvY3RldCcpKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXI7aWYobWltZVR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uJykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5TY3JpcHQ7cmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLk90aGVyO30Kc3RhdGljIGZyb21VUkwodXJsKXtyZXR1cm4gQ29tbW9uLlJlc291cmNlVHlwZS5fcmVzb3VyY2VUeXBlQnlFeHRlbnNpb24uZ2V0KENvbW1vbi5QYXJzZWRVUkwuZXh0cmFjdEV4dGVuc2lvbih1cmwpKXx8bnVsbDt9CnN0YXRpYyBtaW1lRnJvbVVSTCh1cmwpe2NvbnN0IG5hbWU9Q29tbW9uLlBhcnNlZFVSTC5leHRyYWN0TmFtZSh1cmwpO2lmKENvbW1vbi5SZXNvdXJjZVR5cGUuX21pbWVUeXBlQnlOYW1lLmhhcyhuYW1lKSkKcmV0dXJuIENvbW1vbi5SZXNvdXJjZVR5cGUuX21pbWVUeXBlQnlOYW1lLmdldChuYW1lKTtjb25zdCBleHQ9Q29tbW9uLlBhcnNlZFVSTC5leHRyYWN0RXh0ZW5zaW9uKHVybCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gQ29tbW9uLlJlc291cmNlVHlwZS5fbWltZVR5cGVCeUV4dGVuc2lvbi5nZXQoZXh0KTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CnRpdGxlKCl7cmV0dXJuIHRoaXMuX3RpdGxlO30KY2F0ZWdvcnkoKXtyZXR1cm4gdGhpcy5fY2F0ZWdvcnk7fQppc1RleHRUeXBlKCl7cmV0dXJuIHRoaXMuX2lzVGV4dFR5cGU7fQppc1NjcmlwdCgpe3JldHVybiB0aGlzLl9uYW1lPT09J3NjcmlwdCd8fHRoaXMuX25hbWU9PT0nc20tc2NyaXB0J3x8dGhpcy5fbmFtZT09PSdzbmlwcGV0Jzt9Cmhhc1NjcmlwdHMoKXtyZXR1cm4gdGhpcy5pc1NjcmlwdCgpfHx0aGlzLmlzRG9jdW1lbnQoKTt9CmlzU3R5bGVTaGVldCgpe3JldHVybiB0aGlzLl9uYW1lPT09J3N0eWxlc2hlZXQnfHx0aGlzLl9uYW1lPT09J3NtLXN0eWxlc2hlZXQnO30KaXNEb2N1bWVudCgpe3JldHVybiB0aGlzLl9uYW1lPT09J2RvY3VtZW50Jzt9CmlzRG9jdW1lbnRPclNjcmlwdE9yU3R5bGVTaGVldCgpe3JldHVybiB0aGlzLmlzRG9jdW1lbnQoKXx8dGhpcy5pc1NjcmlwdCgpfHx0aGlzLmlzU3R5bGVTaGVldCgpO30KaXNGcm9tU291cmNlTWFwKCl7cmV0dXJuIHRoaXMuX25hbWUuc3RhcnRzV2l0aCgnc20tJyk7fQp0b1N0cmluZygpe3JldHVybiB0aGlzLl9uYW1lO30KY2Fub25pY2FsTWltZVR5cGUoKXtpZih0aGlzLmlzRG9jdW1lbnQoKSkKcmV0dXJuJ3RleHQvaHRtbCc7aWYodGhpcy5pc1NjcmlwdCgpKQpyZXR1cm4ndGV4dC9qYXZhc2NyaXB0JztpZih0aGlzLmlzU3R5bGVTaGVldCgpKQpyZXR1cm4ndGV4dC9jc3MnO3JldHVybicnO319O0NvbW1vbi5SZXNvdXJjZUNhdGVnb3J5PWNsYXNze2NvbnN0cnVjdG9yKHRpdGxlLHNob3J0VGl0bGUpe3RoaXMudGl0bGU9dGl0bGU7dGhpcy5zaG9ydFRpdGxlPXNob3J0VGl0bGU7fX07Q29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcz17WEhSOm5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnWEhSIGFuZCBGZXRjaCcsJ1hIUicpLFNjcmlwdDpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ1NjcmlwdHMnLCdKUycpLFN0eWxlc2hlZXQ6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdTdHlsZXNoZWV0cycsJ0NTUycpLEltYWdlOm5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnSW1hZ2VzJywnSW1nJyksTWVkaWE6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdNZWRpYScsJ01lZGlhJyksRm9udDpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ0ZvbnRzJywnRm9udCcpLERvY3VtZW50Om5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnRG9jdW1lbnRzJywnRG9jJyksV2ViU29ja2V0Om5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnV2ViU29ja2V0cycsJ1dTJyksTWFuaWZlc3Q6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdNYW5pZmVzdCcsJ01hbmlmZXN0JyksT3RoZXI6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdPdGhlcicsJ090aGVyJyl9O0NvbW1vbi5yZXNvdXJjZVR5cGVzPXtYSFI6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3hocicsJ1hIUicsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5YSFIsdHJ1ZSksRmV0Y2g6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ2ZldGNoJywnRmV0Y2gnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuWEhSLHRydWUpLEV2ZW50U291cmNlOm5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdldmVudHNvdXJjZScsJ0V2ZW50U291cmNlJyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLlhIUix0cnVlKSxTY3JpcHQ6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3NjcmlwdCcsJ1NjcmlwdCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5TY3JpcHQsdHJ1ZSksU25pcHBldDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc25pcHBldCcsJ1NuaXBwZXQnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuU2NyaXB0LHRydWUpLFN0eWxlc2hlZXQ6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3N0eWxlc2hlZXQnLCdTdHlsZXNoZWV0JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLlN0eWxlc2hlZXQsdHJ1ZSksSW1hZ2U6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ2ltYWdlJywnSW1hZ2UnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuSW1hZ2UsZmFsc2UpLE1lZGlhOm5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdtZWRpYScsJ01lZGlhJyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLk1lZGlhLGZhbHNlKSxGb250Om5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdmb250JywnRm9udCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5Gb250LGZhbHNlKSxEb2N1bWVudDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnZG9jdW1lbnQnLCdEb2N1bWVudCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5Eb2N1bWVudCx0cnVlKSxUZXh0VHJhY2s6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3RleHR0cmFjaycsJ1RleHRUcmFjaycsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5PdGhlcix0cnVlKSxXZWJTb2NrZXQ6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3dlYnNvY2tldCcsJ1dlYlNvY2tldCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5XZWJTb2NrZXQsZmFsc2UpLE90aGVyOm5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdvdGhlcicsJ090aGVyJyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLk90aGVyLGZhbHNlKSxTb3VyY2VNYXBTY3JpcHQ6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ3NtLXNjcmlwdCcsJ1NjcmlwdCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5TY3JpcHQsdHJ1ZSksU291cmNlTWFwU3R5bGVTaGVldDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc20tc3R5bGVzaGVldCcsJ1N0eWxlc2hlZXQnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuU3R5bGVzaGVldCx0cnVlKSxNYW5pZmVzdDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnbWFuaWZlc3QnLCdNYW5pZmVzdCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5NYW5pZmVzdCx0cnVlKSxTaWduZWRFeGNoYW5nZTpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc2lnbmVkLWV4Y2hhbmdlJywnU2lnbmVkRXhjaGFuZ2UnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuT3RoZXIsZmFsc2UpLH07Q29tbW9uLlJlc291cmNlVHlwZS5fbWltZVR5cGVCeU5hbWU9bmV3IE1hcChbWydDYWtlZmlsZScsJ3RleHQveC1jb2ZmZWVzY3JpcHQnXV0pO0NvbW1vbi5SZXNvdXJjZVR5cGUuX3Jlc291cmNlVHlwZUJ5RXh0ZW5zaW9uPW5ldyBNYXAoW1snanMnLENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdF0sWydtanMnLENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdF0sWydjc3MnLENvbW1vbi5yZXNvdXJjZVR5cGVzLlN0eWxlc2hlZXRdLFsneHNsJyxDb21tb24ucmVzb3VyY2VUeXBlcy5TdHlsZXNoZWV0XSxbJ2pwZWcnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ2pwZycsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsnc3ZnJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWydnaWYnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ3BuZycsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsnaWNvJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWyd0aWZmJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWyd0aWYnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ2JtcCcsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsnd2VicCcsQ29tbW9uLnJlc291cmNlVHlwZXMuTWVkaWFdLFsndHRmJyxDb21tb24ucmVzb3VyY2VUeXBlcy5Gb250XSxbJ290ZicsQ29tbW9uLnJlc291cmNlVHlwZXMuRm9udF0sWyd0dGMnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkZvbnRdLFsnd29mZicsQ29tbW9uLnJlc291cmNlVHlwZXMuRm9udF1dKTtDb21tb24uUmVzb3VyY2VUeXBlLl9taW1lVHlwZUJ5RXh0ZW5zaW9uPW5ldyBNYXAoW1snanMnLCd0ZXh0L2phdmFzY3JpcHQnXSxbJ21qcycsJ3RleHQvamF2YXNjcmlwdCddLFsnY3NzJywndGV4dC9jc3MnXSxbJ2h0bWwnLCd0ZXh0L2h0bWwnXSxbJ2h0bScsJ3RleHQvaHRtbCddLFsneG1sJywnYXBwbGljYXRpb24veG1sJ10sWyd4c2wnLCdhcHBsaWNhdGlvbi94bWwnXSxbJ2FzcCcsJ2FwcGxpY2F0aW9uL3gtYXNweCddLFsnYXNweCcsJ2FwcGxpY2F0aW9uL3gtYXNweCddLFsnanNwJywnYXBwbGljYXRpb24veC1qc3AnXSxbJ2MnLCd0ZXh0L3gtYysrc3JjJ10sWydjYycsJ3RleHQveC1jKytzcmMnXSxbJ2NwcCcsJ3RleHQveC1jKytzcmMnXSxbJ2gnLCd0ZXh0L3gtYysrc3JjJ10sWydtJywndGV4dC94LWMrK3NyYyddLFsnbW0nLCd0ZXh0L3gtYysrc3JjJ10sWydjb2ZmZWUnLCd0ZXh0L3gtY29mZmVlc2NyaXB0J10sWydkYXJ0JywndGV4dC9qYXZhc2NyaXB0J10sWyd0cycsJ3RleHQvdHlwZXNjcmlwdCddLFsndHN4JywndGV4dC90eXBlc2NyaXB0LWpzeCddLFsnanNvbicsJ2FwcGxpY2F0aW9uL2pzb24nXSxbJ2d5cCcsJ2FwcGxpY2F0aW9uL2pzb24nXSxbJ2d5cGknLCdhcHBsaWNhdGlvbi9qc29uJ10sWydjcycsJ3RleHQveC1jc2hhcnAnXSxbJ2phdmEnLCd0ZXh0L3gtamF2YSddLFsnbGVzcycsJ3RleHQveC1sZXNzJ10sWydwaHAnLCd0ZXh0L3gtcGhwJ10sWydwaHRtbCcsJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJ10sWydweScsJ3RleHQveC1weXRob24nXSxbJ3NoJywndGV4dC94LXNoJ10sWydzY3NzJywndGV4dC94LXNjc3MnXSxbJ3Z0dCcsJ3RleHQvdnR0J10sWydscycsJ3RleHQveC1saXZlc2NyaXB0J10sWydtZCcsJ3RleHQvbWFya2Rvd24nXSxbJ2NsanMnLCd0ZXh0L3gtY2xvanVyZSddLFsnY2xqYycsJ3RleHQveC1jbG9qdXJlJ10sWydjbGp4JywndGV4dC94LWNsb2p1cmUnXSxbJ3N0eWwnLCd0ZXh0L3gtc3R5bCddLFsnanN4JywndGV4dC9qc3gnXSxbJ2pwZWcnLCdpbWFnZS9qcGVnJ10sWydqcGcnLCdpbWFnZS9qcGVnJ10sWydzdmcnLCdpbWFnZS9zdmcreG1sJ10sWydnaWYnLCdpbWFnZS9naWYnXSxbJ3dlYnAnLCdpbWFnZS93ZWJwJ10sWydwbmcnLCdpbWFnZS9wbmcnXSxbJ2ljbycsJ2ltYWdlL2ljbyddLFsndGlmZicsJ2ltYWdlL3RpZmYnXSxbJ3RpZicsJ2ltYWdlL3RpZiddLFsnYm1wJywnaW1hZ2UvYm1wJ10sWyd0dGYnLCdmb250L29wZW50eXBlJ10sWydvdGYnLCdmb250L29wZW50eXBlJ10sWyd0dGMnLCdmb250L29wZW50eXBlJ10sWyd3b2ZmJywnYXBwbGljYXRpb24vZm9udC13b2ZmJ11dKTs7Q29tbW9uLlNldHRpbmdzPWNsYXNze2NvbnN0cnVjdG9yKGdsb2JhbFN0b3JhZ2UsbG9jYWxTdG9yYWdlKXt0aGlzLl9nbG9iYWxTdG9yYWdlPWdsb2JhbFN0b3JhZ2U7dGhpcy5fbG9jYWxTdG9yYWdlPWxvY2FsU3RvcmFnZTt0aGlzLl9zZXNzaW9uU3RvcmFnZT1uZXcgQ29tbW9uLlNldHRpbmdzU3RvcmFnZSh7fSk7dGhpcy5fZXZlbnRTdXBwb3J0PW5ldyBDb21tb24uT2JqZWN0KCk7dGhpcy5fcmVnaXN0cnk9bmV3IE1hcCgpO3RoaXMuX21vZHVsZVNldHRpbmdzPW5ldyBNYXAoKTtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygnc2V0dGluZycpLmZvckVhY2godGhpcy5fcmVnaXN0ZXJNb2R1bGVTZXR0aW5nLmJpbmQodGhpcykpO30KX3JlZ2lzdGVyTW9kdWxlU2V0dGluZyhleHRlbnNpb24pe2NvbnN0IGRlc2NyaXB0b3I9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKTtjb25zdCBzZXR0aW5nTmFtZT1kZXNjcmlwdG9yWydzZXR0aW5nTmFtZSddO2NvbnN0IGlzUmVnZXg9ZGVzY3JpcHRvclsnc2V0dGluZ1R5cGUnXT09PSdyZWdleCc7Y29uc3QgZGVmYXVsdFZhbHVlPWRlc2NyaXB0b3JbJ2RlZmF1bHRWYWx1ZSddO2xldCBzdG9yYWdlVHlwZTtzd2l0Y2goZGVzY3JpcHRvclsnc3RvcmFnZVR5cGUnXSl7Y2FzZSgnbG9jYWwnKTpzdG9yYWdlVHlwZT1Db21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlLkxvY2FsO2JyZWFrO2Nhc2UoJ3Nlc3Npb24nKTpzdG9yYWdlVHlwZT1Db21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlLlNlc3Npb247YnJlYWs7Y2FzZSgnZ2xvYmFsJyk6c3RvcmFnZVR5cGU9Q29tbW9uLlNldHRpbmdTdG9yYWdlVHlwZS5HbG9iYWw7YnJlYWs7ZGVmYXVsdDpzdG9yYWdlVHlwZT1Db21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlLkdsb2JhbDt9CmNvbnN0IHNldHRpbmc9aXNSZWdleD90aGlzLmNyZWF0ZVJlZ0V4cFNldHRpbmcoc2V0dGluZ05hbWUsZGVmYXVsdFZhbHVlLHVuZGVmaW5lZCxzdG9yYWdlVHlwZSk6dGhpcy5jcmVhdGVTZXR0aW5nKHNldHRpbmdOYW1lLGRlZmF1bHRWYWx1ZSxzdG9yYWdlVHlwZSk7aWYoZGVzY3JpcHRvclsndGl0bGUnXSkKc2V0dGluZy5zZXRUaXRsZShkZXNjcmlwdG9yWyd0aXRsZSddKTtpZihkZXNjcmlwdG9yWyd1c2VyQWN0aW9uQ29uZGl0aW9uJ10pCnNldHRpbmcuc2V0UmVxdWlyZXNVc2VyQWN0aW9uKCEhUnVudGltZS5xdWVyeVBhcmFtKGRlc2NyaXB0b3JbJ3VzZXJBY3Rpb25Db25kaXRpb24nXSkpO3NldHRpbmcuX2V4dGVuc2lvbj1leHRlbnNpb247dGhpcy5fbW9kdWxlU2V0dGluZ3Muc2V0KHNldHRpbmdOYW1lLHNldHRpbmcpO30KbW9kdWxlU2V0dGluZyhzZXR0aW5nTmFtZSl7Y29uc3Qgc2V0dGluZz10aGlzLl9tb2R1bGVTZXR0aW5ncy5nZXQoc2V0dGluZ05hbWUpO2lmKCFzZXR0aW5nKQp0aHJvdyBuZXcgRXJyb3IoJ05vIHNldHRpbmcgcmVnaXN0ZXJlZDogJytzZXR0aW5nTmFtZSk7cmV0dXJuIHNldHRpbmc7fQpzZXR0aW5nRm9yVGVzdChzZXR0aW5nTmFtZSl7Y29uc3Qgc2V0dGluZz10aGlzLl9yZWdpc3RyeS5nZXQoc2V0dGluZ05hbWUpO2lmKCFzZXR0aW5nKQp0aHJvdyBuZXcgRXJyb3IoJ05vIHNldHRpbmcgcmVnaXN0ZXJlZDogJytzZXR0aW5nTmFtZSk7cmV0dXJuIHNldHRpbmc7fQpjcmVhdGVTZXR0aW5nKGtleSxkZWZhdWx0VmFsdWUsc3RvcmFnZVR5cGUpe2NvbnN0IHN0b3JhZ2U9dGhpcy5fc3RvcmFnZUZyb21UeXBlKHN0b3JhZ2VUeXBlKTtpZighdGhpcy5fcmVnaXN0cnkuZ2V0KGtleSkpCnRoaXMuX3JlZ2lzdHJ5LnNldChrZXksbmV3IENvbW1vbi5TZXR0aW5nKHRoaXMsa2V5LGRlZmF1bHRWYWx1ZSx0aGlzLl9ldmVudFN1cHBvcnQsc3RvcmFnZSkpO3JldHVybih0aGlzLl9yZWdpc3RyeS5nZXQoa2V5KSk7fQpjcmVhdGVMb2NhbFNldHRpbmcoa2V5LGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHRoaXMuY3JlYXRlU2V0dGluZyhrZXksZGVmYXVsdFZhbHVlLENvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuTG9jYWwpO30KY3JlYXRlUmVnRXhwU2V0dGluZyhrZXksZGVmYXVsdFZhbHVlLHJlZ2V4RmxhZ3Msc3RvcmFnZVR5cGUpe2lmKCF0aGlzLl9yZWdpc3RyeS5nZXQoa2V5KSl7dGhpcy5fcmVnaXN0cnkuc2V0KGtleSxuZXcgQ29tbW9uLlJlZ0V4cFNldHRpbmcodGhpcyxrZXksZGVmYXVsdFZhbHVlLHRoaXMuX2V2ZW50U3VwcG9ydCx0aGlzLl9zdG9yYWdlRnJvbVR5cGUoc3RvcmFnZVR5cGUpLHJlZ2V4RmxhZ3MpKTt9CnJldHVybih0aGlzLl9yZWdpc3RyeS5nZXQoa2V5KSk7fQpjbGVhckFsbCgpe3RoaXMuX2dsb2JhbFN0b3JhZ2UucmVtb3ZlQWxsKCk7dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUFsbCgpO2NvbnN0IHZlcnNpb25TZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKENvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5fY3VycmVudFZlcnNpb25OYW1lLDApO3ZlcnNpb25TZXR0aW5nLnNldChDb21tb24uVmVyc2lvbkNvbnRyb2xsZXIuY3VycmVudFZlcnNpb24pO30KX3N0b3JhZ2VGcm9tVHlwZShzdG9yYWdlVHlwZSl7c3dpdGNoKHN0b3JhZ2VUeXBlKXtjYXNlKENvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuTG9jYWwpOnJldHVybiB0aGlzLl9sb2NhbFN0b3JhZ2U7Y2FzZShDb21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlLlNlc3Npb24pOnJldHVybiB0aGlzLl9zZXNzaW9uU3RvcmFnZTtjYXNlKENvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuR2xvYmFsKTpyZXR1cm4gdGhpcy5fZ2xvYmFsU3RvcmFnZTt9CnJldHVybiB0aGlzLl9nbG9iYWxTdG9yYWdlO319O0NvbW1vbi5TZXR0aW5nc1N0b3JhZ2U9Y2xhc3N7Y29uc3RydWN0b3Iob2JqZWN0LHNldENhbGxiYWNrLHJlbW92ZUNhbGxiYWNrLHJlbW92ZUFsbENhbGxiYWNrLHN0b3JhZ2VQcmVmaXgpe3RoaXMuX29iamVjdD1vYmplY3Q7dGhpcy5fc2V0Q2FsbGJhY2s9c2V0Q2FsbGJhY2t8fGZ1bmN0aW9uKCl7fTt0aGlzLl9yZW1vdmVDYWxsYmFjaz1yZW1vdmVDYWxsYmFja3x8ZnVuY3Rpb24oKXt9O3RoaXMuX3JlbW92ZUFsbENhbGxiYWNrPXJlbW92ZUFsbENhbGxiYWNrfHxmdW5jdGlvbigpe307dGhpcy5fc3RvcmFnZVByZWZpeD1zdG9yYWdlUHJlZml4fHwnJzt9CnNldChuYW1lLHZhbHVlKXtuYW1lPXRoaXMuX3N0b3JhZ2VQcmVmaXgrbmFtZTt0aGlzLl9vYmplY3RbbmFtZV09dmFsdWU7dGhpcy5fc2V0Q2FsbGJhY2sobmFtZSx2YWx1ZSk7fQpoYXMobmFtZSl7bmFtZT10aGlzLl9zdG9yYWdlUHJlZml4K25hbWU7cmV0dXJuIG5hbWUgaW4gdGhpcy5fb2JqZWN0O30KZ2V0KG5hbWUpe25hbWU9dGhpcy5fc3RvcmFnZVByZWZpeCtuYW1lO3JldHVybiB0aGlzLl9vYmplY3RbbmFtZV07fQpyZW1vdmUobmFtZSl7bmFtZT10aGlzLl9zdG9yYWdlUHJlZml4K25hbWU7ZGVsZXRlIHRoaXMuX29iamVjdFtuYW1lXTt0aGlzLl9yZW1vdmVDYWxsYmFjayhuYW1lKTt9CnJlbW92ZUFsbCgpe3RoaXMuX29iamVjdD17fTt0aGlzLl9yZW1vdmVBbGxDYWxsYmFjaygpO30KX2R1bXBTaXplcygpe0NvbW1vbi5jb25zb2xlLmxvZygnVGVuIGxhcmdlc3Qgc2V0dGluZ3M6ICcpO2NvbnN0IHNpemVzPXtfX3Byb3RvX186bnVsbH07Zm9yKGNvbnN0IGtleSBpbiB0aGlzLl9vYmplY3QpCnNpemVzW2tleV09dGhpcy5fb2JqZWN0W2tleV0ubGVuZ3RoO2NvbnN0IGtleXM9T2JqZWN0LmtleXMoc2l6ZXMpO2Z1bmN0aW9uIGNvbXBhcmF0b3Ioa2V5MSxrZXkyKXtyZXR1cm4gc2l6ZXNba2V5Ml0tc2l6ZXNba2V5MV07fQprZXlzLnNvcnQoY29tcGFyYXRvcik7Zm9yKGxldCBpPTA7aTwxMCYmaTxrZXlzLmxlbmd0aDsrK2kpCkNvbW1vbi5jb25zb2xlLmxvZygnU2V0dGluZzogXCcnK2tleXNbaV0rJ1wnLCBzaXplOiAnK3NpemVzW2tleXNbaV1dKTt9fTtDb21tb24uU2V0dGluZz1jbGFzc3tjb25zdHJ1Y3RvcihzZXR0aW5ncyxuYW1lLGRlZmF1bHRWYWx1ZSxldmVudFN1cHBvcnQsc3RvcmFnZSl7dGhpcy5fc2V0dGluZ3M9c2V0dGluZ3M7dGhpcy5fbmFtZT1uYW1lO3RoaXMuX2RlZmF1bHRWYWx1ZT1kZWZhdWx0VmFsdWU7dGhpcy5fZXZlbnRTdXBwb3J0PWV2ZW50U3VwcG9ydDt0aGlzLl9zdG9yYWdlPXN0b3JhZ2U7dGhpcy5fdGl0bGU9Jyc7dGhpcy5fZXh0ZW5zaW9uPW51bGw7fQphZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcix0aGlzT2JqZWN0KXt0aGlzLl9ldmVudFN1cHBvcnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9uYW1lLGxpc3RlbmVyLHRoaXNPYmplY3QpO30KcmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsdGhpc09iamVjdCl7dGhpcy5fZXZlbnRTdXBwb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fbmFtZSxsaXN0ZW5lcix0aGlzT2JqZWN0KTt9CmdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQp0aXRsZSgpe3JldHVybiB0aGlzLl90aXRsZTt9CnNldFRpdGxlKHRpdGxlKXt0aGlzLl90aXRsZT10aXRsZTt9CnNldFJlcXVpcmVzVXNlckFjdGlvbihyZXF1aXJlc1VzZXJBY3Rpb24pe3RoaXMuX3JlcXVpcmVzVXNlckFjdGlvbj1yZXF1aXJlc1VzZXJBY3Rpb247fQpnZXQoKXtpZih0aGlzLl9yZXF1aXJlc1VzZXJBY3Rpb24mJiF0aGlzLl9oYWRVc2VyQWN0aW9uKQpyZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO2lmKHR5cGVvZiB0aGlzLl92YWx1ZSE9PSd1bmRlZmluZWQnKQpyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9dGhpcy5fZGVmYXVsdFZhbHVlO2lmKHRoaXMuX3N0b3JhZ2UuaGFzKHRoaXMuX25hbWUpKXt0cnl7dGhpcy5fdmFsdWU9SlNPTi5wYXJzZSh0aGlzLl9zdG9yYWdlLmdldCh0aGlzLl9uYW1lKSk7fWNhdGNoKGUpe3RoaXMuX3N0b3JhZ2UucmVtb3ZlKHRoaXMuX25hbWUpO319CnJldHVybiB0aGlzLl92YWx1ZTt9CnNldCh2YWx1ZSl7dGhpcy5faGFkVXNlckFjdGlvbj10cnVlO3RoaXMuX3ZhbHVlPXZhbHVlO3RyeXtjb25zdCBzZXR0aW5nU3RyaW5nPUpTT04uc3RyaW5naWZ5KHZhbHVlKTt0cnl7dGhpcy5fc3RvcmFnZS5zZXQodGhpcy5fbmFtZSxzZXR0aW5nU3RyaW5nKTt9Y2F0Y2goZSl7dGhpcy5fcHJpbnRTZXR0aW5nc1NhdmluZ0Vycm9yKGUubWVzc2FnZSx0aGlzLl9uYW1lLHNldHRpbmdTdHJpbmcpO319Y2F0Y2goZSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBzdHJpbmdpZnkgc2V0dGluZyB3aXRoIG5hbWU6ICcrdGhpcy5fbmFtZSsnLCBlcnJvcjogJytlLm1lc3NhZ2UpO30KdGhpcy5fZXZlbnRTdXBwb3J0LmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyh0aGlzLl9uYW1lLHZhbHVlKTt9CnJlbW92ZSgpe3RoaXMuX3NldHRpbmdzLl9yZWdpc3RyeS5kZWxldGUodGhpcy5fbmFtZSk7dGhpcy5fc2V0dGluZ3MuX21vZHVsZVNldHRpbmdzLmRlbGV0ZSh0aGlzLl9uYW1lKTt0aGlzLl9zdG9yYWdlLnJlbW92ZSh0aGlzLl9uYW1lKTt9CmV4dGVuc2lvbigpe3JldHVybiB0aGlzLl9leHRlbnNpb247fQpfcHJpbnRTZXR0aW5nc1NhdmluZ0Vycm9yKG1lc3NhZ2UsbmFtZSx2YWx1ZSl7Y29uc3QgZXJyb3JNZXNzYWdlPSdFcnJvciBzYXZpbmcgc2V0dGluZyB3aXRoIG5hbWU6ICcrdGhpcy5fbmFtZSsnLCB2YWx1ZSBsZW5ndGg6ICcrdmFsdWUubGVuZ3RoKycuIEVycm9yOiAnK21lc3NhZ2U7Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpO0NvbW1vbi5jb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7dGhpcy5fc3RvcmFnZS5fZHVtcFNpemVzKCk7fX07Q29tbW9uLlJlZ0V4cFNldHRpbmc9Y2xhc3MgZXh0ZW5kcyBDb21tb24uU2V0dGluZ3tjb25zdHJ1Y3RvcihzZXR0aW5ncyxuYW1lLGRlZmF1bHRWYWx1ZSxldmVudFN1cHBvcnQsc3RvcmFnZSxyZWdleEZsYWdzKXtzdXBlcihzZXR0aW5ncyxuYW1lLGRlZmF1bHRWYWx1ZT9be3BhdHRlcm46ZGVmYXVsdFZhbHVlfV06W10sZXZlbnRTdXBwb3J0LHN0b3JhZ2UpO3RoaXMuX3JlZ2V4RmxhZ3M9cmVnZXhGbGFnczt9CmdldCgpe2NvbnN0IHJlc3VsdD1bXTtjb25zdCBpdGVtcz10aGlzLmdldEFzQXJyYXkoKTtmb3IobGV0IGk9MDtpPGl0ZW1zLmxlbmd0aDsrK2kpe2NvbnN0IGl0ZW09aXRlbXNbaV07aWYoaXRlbS5wYXR0ZXJuJiYhaXRlbS5kaXNhYmxlZCkKcmVzdWx0LnB1c2goaXRlbS5wYXR0ZXJuKTt9CnJldHVybiByZXN1bHQuam9pbignfCcpO30KZ2V0QXNBcnJheSgpe3JldHVybiBzdXBlci5nZXQoKTt9CnNldCh2YWx1ZSl7dGhpcy5zZXRBc0FycmF5KFt7cGF0dGVybjp2YWx1ZX1dKTt9CnNldEFzQXJyYXkodmFsdWUpe2RlbGV0ZSB0aGlzLl9yZWdleDtzdXBlci5zZXQodmFsdWUpO30KYXNSZWdFeHAoKXtpZih0eXBlb2YgdGhpcy5fcmVnZXghPT0ndW5kZWZpbmVkJykKcmV0dXJuIHRoaXMuX3JlZ2V4O3RoaXMuX3JlZ2V4PW51bGw7dHJ5e2NvbnN0IHBhdHRlcm49dGhpcy5nZXQoKTtpZihwYXR0ZXJuKQp0aGlzLl9yZWdleD1uZXcgUmVnRXhwKHBhdHRlcm4sdGhpcy5fcmVnZXhGbGFnc3x8JycpO31jYXRjaChlKXt9CnJldHVybiB0aGlzLl9yZWdleDt9fTtDb21tb24uVmVyc2lvbkNvbnRyb2xsZXI9Y2xhc3N7dXBkYXRlVmVyc2lvbigpe2NvbnN0IGxvY2FsU3RvcmFnZVZlcnNpb249d2luZG93LmxvY2FsU3RvcmFnZT93aW5kb3cubG9jYWxTdG9yYWdlW0NvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5fY3VycmVudFZlcnNpb25OYW1lXTowO2NvbnN0IHZlcnNpb25TZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKENvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5fY3VycmVudFZlcnNpb25OYW1lLDApO2NvbnN0IGN1cnJlbnRWZXJzaW9uPUNvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5jdXJyZW50VmVyc2lvbjtjb25zdCBvbGRWZXJzaW9uPXZlcnNpb25TZXR0aW5nLmdldCgpfHxwYXJzZUludChsb2NhbFN0b3JhZ2VWZXJzaW9ufHwnMCcsMTApO2lmKG9sZFZlcnNpb249PT0wKXt2ZXJzaW9uU2V0dGluZy5zZXQoY3VycmVudFZlcnNpb24pO3JldHVybjt9CmNvbnN0IG1ldGhvZHNUb1J1bj10aGlzLl9tZXRob2RzVG9SdW5Ub1VwZGF0ZVZlcnNpb24ob2xkVmVyc2lvbixjdXJyZW50VmVyc2lvbik7Zm9yKGxldCBpPTA7aTxtZXRob2RzVG9SdW4ubGVuZ3RoOysraSkKdGhpc1ttZXRob2RzVG9SdW5baV1dLmNhbGwodGhpcyk7dmVyc2lvblNldHRpbmcuc2V0KGN1cnJlbnRWZXJzaW9uKTt9Cl9tZXRob2RzVG9SdW5Ub1VwZGF0ZVZlcnNpb24ob2xkVmVyc2lvbixjdXJyZW50VmVyc2lvbil7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT1vbGRWZXJzaW9uO2k8Y3VycmVudFZlcnNpb247KytpKQpyZXN1bHQucHVzaCgnX3VwZGF0ZVZlcnNpb25Gcm9tJytpKydUbycrKGkrMSkpO3JldHVybiByZXN1bHQ7fQpfdXBkYXRlVmVyc2lvbkZyb20wVG8xKCl7dGhpcy5fY2xlYXJCcmVha3BvaW50c1doZW5Ub29NYW55KENvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ2JyZWFrcG9pbnRzJyxbXSksNTAwMDAwKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTFUbzIoKXtDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygncHJldmlvdXNseVZpZXdlZEZpbGVzJyxbXSkuc2V0KFtdKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTJUbzMoKXtDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZmlsZVN5c3RlbU1hcHBpbmcnLHt9KS5zZXQoe30pO0NvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdmaWxlTWFwcGluZ0VudHJpZXMnLFtdKS5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTNUbzQoKXtjb25zdCBhZHZhbmNlZE1vZGU9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3Nob3dIZWFTbmFwc2hvdE9iamVjdHNIaWRkZW5Qcm9wZXJ0aWVzJyxmYWxzZSk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dBZHZhbmNlZEhlYXBTbmFwc2hvdFByb3BlcnRpZXMnKS5zZXQoYWR2YW5jZWRNb2RlLmdldCgpKTthZHZhbmNlZE1vZGUucmVtb3ZlKCk7fQpfdXBkYXRlVmVyc2lvbkZyb200VG81KCl7Y29uc3Qgc2V0dGluZ05hbWVzPXsnRmlsZVN5c3RlbVZpZXdTaWRlYmFyV2lkdGgnOidmaWxlU3lzdGVtVmlld1NwbGl0Vmlld1N0YXRlJywnZWxlbWVudHNTaWRlYmFyV2lkdGgnOidlbGVtZW50c1BhbmVsU3BsaXRWaWV3U3RhdGUnLCdTdHlsZXNQYW5lU3BsaXRSYXRpbyc6J3N0eWxlc1BhbmVTcGxpdFZpZXdTdGF0ZScsJ2hlYXBTbmFwc2hvdFJldGFpbmVyc1ZpZXdTaXplJzonaGVhcFNuYXBzaG90U3BsaXRWaWV3U3RhdGUnLCdJbnNwZWN0b3JWaWV3LnNwbGl0Vmlldyc6J0luc3BlY3RvclZpZXcuc3BsaXRWaWV3U3RhdGUnLCdJbnNwZWN0b3JWaWV3LnNjcmVlbmNhc3RTcGxpdFZpZXcnOidJbnNwZWN0b3JWaWV3LnNjcmVlbmNhc3RTcGxpdFZpZXdTdGF0ZScsJ0luc3BlY3Rvci5kcmF3ZXJTcGxpdFZpZXcnOidJbnNwZWN0b3IuZHJhd2VyU3BsaXRWaWV3U3RhdGUnLCdsYXllckRldGFpbHNTcGxpdFZpZXcnOidsYXllckRldGFpbHNTcGxpdFZpZXdTdGF0ZScsJ25ldHdvcmtTaWRlYmFyV2lkdGgnOiduZXR3b3JrUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ3NvdXJjZXNTaWRlYmFyV2lkdGgnOidzb3VyY2VzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ3NjcmlwdHNQYW5lbE5hdmlnYXRvclNpZGViYXJXaWR0aCc6J3NvdXJjZXNQYW5lbE5hdmlnYXRvclNwbGl0Vmlld1N0YXRlJywnc291cmNlc1BhbmVsU3BsaXRTaWRlYmFyUmF0aW8nOidzb3VyY2VzUGFuZWxEZWJ1Z2dlclNpZGViYXJTcGxpdFZpZXdTdGF0ZScsJ3RpbWVsaW5lLWRldGFpbHMnOid0aW1lbGluZVBhbmVsRGV0YWlsc1NwbGl0Vmlld1N0YXRlJywndGltZWxpbmUtc3BsaXQnOid0aW1lbGluZVBhbmVsUmVjb3JzU3BsaXRWaWV3U3RhdGUnLCd0aW1lbGluZS12aWV3JzondGltZWxpbmVQYW5lbFRpbWVsaW5lU3RhY2tTcGxpdFZpZXdTdGF0ZScsJ2F1ZGl0c1NpZGViYXJXaWR0aCc6J2F1ZGl0c1BhbmVsU3BsaXRWaWV3U3RhdGUnLCdsYXllcnNTaWRlYmFyV2lkdGgnOidsYXllcnNQYW5lbFNwbGl0Vmlld1N0YXRlJywncHJvZmlsZXNTaWRlYmFyV2lkdGgnOidwcm9maWxlc1BhbmVsU3BsaXRWaWV3U3RhdGUnLCdyZXNvdXJjZXNTaWRlYmFyV2lkdGgnOidyZXNvdXJjZXNQYW5lbFNwbGl0Vmlld1N0YXRlJ307Y29uc3QgZW1wdHk9e307Zm9yKGNvbnN0IG9sZE5hbWUgaW4gc2V0dGluZ05hbWVzKXtjb25zdCBuZXdOYW1lPXNldHRpbmdOYW1lc1tvbGROYW1lXTtjb25zdCBvbGROYW1lSD1vbGROYW1lKydIJztsZXQgbmV3VmFsdWU9bnVsbDtjb25zdCBvbGRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG9sZE5hbWUsZW1wdHkpO2lmKG9sZFNldHRpbmcuZ2V0KCkhPT1lbXB0eSl7bmV3VmFsdWU9bmV3VmFsdWV8fHt9O25ld1ZhbHVlLnZlcnRpY2FsPXt9O25ld1ZhbHVlLnZlcnRpY2FsLnNpemU9b2xkU2V0dGluZy5nZXQoKTtvbGRTZXR0aW5nLnJlbW92ZSgpO30KY29uc3Qgb2xkU2V0dGluZ0g9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcob2xkTmFtZUgsZW1wdHkpO2lmKG9sZFNldHRpbmdILmdldCgpIT09ZW1wdHkpe25ld1ZhbHVlPW5ld1ZhbHVlfHx7fTtuZXdWYWx1ZS5ob3Jpem9udGFsPXt9O25ld1ZhbHVlLmhvcml6b250YWwuc2l6ZT1vbGRTZXR0aW5nSC5nZXQoKTtvbGRTZXR0aW5nSC5yZW1vdmUoKTt9CmlmKG5ld1ZhbHVlKQpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhuZXdOYW1lLHt9KS5zZXQobmV3VmFsdWUpO319Cl91cGRhdGVWZXJzaW9uRnJvbTVUbzYoKXtjb25zdCBzZXR0aW5nTmFtZXM9eydkZWJ1Z2dlclNpZGViYXJIaWRkZW4nOidzb3VyY2VzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ25hdmlnYXRvckhpZGRlbic6J3NvdXJjZXNQYW5lbE5hdmlnYXRvclNwbGl0Vmlld1N0YXRlJywnV2ViSW5zcGVjdG9yLkRyYXdlci5zaG93T25Mb2FkJzonSW5zcGVjdG9yLmRyYXdlclNwbGl0Vmlld1N0YXRlJ307Zm9yKGNvbnN0IG9sZE5hbWUgaW4gc2V0dGluZ05hbWVzKXtjb25zdCBvbGRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG9sZE5hbWUsbnVsbCk7aWYob2xkU2V0dGluZy5nZXQoKT09PW51bGwpe29sZFNldHRpbmcucmVtb3ZlKCk7Y29udGludWU7fQpjb25zdCBuZXdOYW1lPXNldHRpbmdOYW1lc1tvbGROYW1lXTtjb25zdCBpbnZlcnQ9b2xkTmFtZT09PSdXZWJJbnNwZWN0b3IuRHJhd2VyLnNob3dPbkxvYWQnO2NvbnN0IGhpZGRlbj1vbGRTZXR0aW5nLmdldCgpIT09aW52ZXJ0O29sZFNldHRpbmcucmVtb3ZlKCk7Y29uc3Qgc2hvd01vZGU9aGlkZGVuPydPbmx5TWFpbic6J0JvdGgnO2NvbnN0IG5ld1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcobmV3TmFtZSx7fSk7Y29uc3QgbmV3VmFsdWU9bmV3U2V0dGluZy5nZXQoKXx8e307bmV3VmFsdWUudmVydGljYWw9bmV3VmFsdWUudmVydGljYWx8fHt9O25ld1ZhbHVlLnZlcnRpY2FsLnNob3dNb2RlPXNob3dNb2RlO25ld1ZhbHVlLmhvcml6b250YWw9bmV3VmFsdWUuaG9yaXpvbnRhbHx8e307bmV3VmFsdWUuaG9yaXpvbnRhbC5zaG93TW9kZT1zaG93TW9kZTtuZXdTZXR0aW5nLnNldChuZXdWYWx1ZSk7fX0KX3VwZGF0ZVZlcnNpb25Gcm9tNlRvNygpe2NvbnN0IHNldHRpbmdOYW1lcz17J3NvdXJjZXNQYW5lbE5hdmlnYXRvclNwbGl0Vmlld1N0YXRlJzonc291cmNlc1BhbmVsTmF2aWdhdG9yU3BsaXRWaWV3U3RhdGUnLCdlbGVtZW50c1BhbmVsU3BsaXRWaWV3U3RhdGUnOidlbGVtZW50c1BhbmVsU3BsaXRWaWV3U3RhdGUnLCdzdHlsZXNQYW5lU3BsaXRWaWV3U3RhdGUnOidzdHlsZXNQYW5lU3BsaXRWaWV3U3RhdGUnLCdzb3VyY2VzUGFuZWxEZWJ1Z2dlclNpZGViYXJTcGxpdFZpZXdTdGF0ZSc6J3NvdXJjZXNQYW5lbERlYnVnZ2VyU2lkZWJhclNwbGl0Vmlld1N0YXRlJ307Y29uc3QgZW1wdHk9e307Zm9yKGNvbnN0IG5hbWUgaW4gc2V0dGluZ05hbWVzKXtjb25zdCBzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG5hbWUsZW1wdHkpO2NvbnN0IHZhbHVlPXNldHRpbmcuZ2V0KCk7aWYodmFsdWU9PT1lbXB0eSkKY29udGludWU7aWYodmFsdWUudmVydGljYWwmJnZhbHVlLnZlcnRpY2FsLnNpemUmJnZhbHVlLnZlcnRpY2FsLnNpemU8MSkKdmFsdWUudmVydGljYWwuc2l6ZT0wO2lmKHZhbHVlLmhvcml6b250YWwmJnZhbHVlLmhvcml6b250YWwuc2l6ZSYmdmFsdWUuaG9yaXpvbnRhbC5zaXplPDEpCnZhbHVlLmhvcml6b250YWwuc2l6ZT0wO3NldHRpbmcuc2V0KHZhbHVlKTt9fQpfdXBkYXRlVmVyc2lvbkZyb203VG84KCl7fQpfdXBkYXRlVmVyc2lvbkZyb204VG85KCl7Y29uc3Qgc2V0dGluZ05hbWVzPVsnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicsJ3dvcmtzcGFjZUZvbGRlckV4Y2x1ZGVQYXR0ZXJuJ107Zm9yKGxldCBpPTA7aTxzZXR0aW5nTmFtZXMubGVuZ3RoOysraSl7Y29uc3Qgc2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhzZXR0aW5nTmFtZXNbaV0sJycpO2xldCB2YWx1ZT1zZXR0aW5nLmdldCgpO2lmKCF2YWx1ZSkKcmV0dXJuO2lmKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnKQp2YWx1ZT1bdmFsdWVdO2ZvcihsZXQgaj0wO2o8dmFsdWUubGVuZ3RoOysrail7aWYodHlwZW9mIHZhbHVlW2pdPT09J3N0cmluZycpCnZhbHVlW2pdPXtwYXR0ZXJuOnZhbHVlW2pdfTt9CnNldHRpbmcuc2V0KHZhbHVlKTt9fQpfdXBkYXRlVmVyc2lvbkZyb205VG8xMCgpe2lmKCF3aW5kb3cubG9jYWxTdG9yYWdlKQpyZXR1cm47Zm9yKGNvbnN0IGtleSBpbiB3aW5kb3cubG9jYWxTdG9yYWdlKXtpZihrZXkuc3RhcnRzV2l0aCgncmV2aXNpb24taGlzdG9yeScpKQp3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTt9fQpfdXBkYXRlVmVyc2lvbkZyb20xMFRvMTEoKXtjb25zdCBvbGRTZXR0aW5nTmFtZT0nY3VzdG9tRGV2aWNlUHJlc2V0cyc7Y29uc3QgbmV3U2V0dGluZ05hbWU9J2N1c3RvbUVtdWxhdGVkRGV2aWNlTGlzdCc7Y29uc3Qgb2xkU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhvbGRTZXR0aW5nTmFtZSx1bmRlZmluZWQpO2NvbnN0IGxpc3Q9b2xkU2V0dGluZy5nZXQoKTtpZighQXJyYXkuaXNBcnJheShsaXN0KSkKcmV0dXJuO2NvbnN0IG5ld0xpc3Q9W107Zm9yKGxldCBpPTA7aTxsaXN0Lmxlbmd0aDsrK2kpe2NvbnN0IHZhbHVlPWxpc3RbaV07Y29uc3QgZGV2aWNlPXt9O2RldmljZVsndGl0bGUnXT12YWx1ZVsndGl0bGUnXTtkZXZpY2VbJ3R5cGUnXT0ndW5rbm93bic7ZGV2aWNlWyd1c2VyLWFnZW50J109dmFsdWVbJ3VzZXJBZ2VudCddO2RldmljZVsnY2FwYWJpbGl0aWVzJ109W107aWYodmFsdWVbJ3RvdWNoJ10pCmRldmljZVsnY2FwYWJpbGl0aWVzJ10ucHVzaCgndG91Y2gnKTtpZih2YWx1ZVsnbW9iaWxlJ10pCmRldmljZVsnY2FwYWJpbGl0aWVzJ10ucHVzaCgnbW9iaWxlJyk7ZGV2aWNlWydzY3JlZW4nXT17fTtkZXZpY2VbJ3NjcmVlbiddWyd2ZXJ0aWNhbCddPXt3aWR0aDp2YWx1ZVsnd2lkdGgnXSxoZWlnaHQ6dmFsdWVbJ2hlaWdodCddfTtkZXZpY2VbJ3NjcmVlbiddWydob3Jpem9udGFsJ109e3dpZHRoOnZhbHVlWydoZWlnaHQnXSxoZWlnaHQ6dmFsdWVbJ3dpZHRoJ119O2RldmljZVsnc2NyZWVuJ11bJ2RldmljZS1waXhlbC1yYXRpbyddPXZhbHVlWydkZXZpY2VTY2FsZUZhY3RvciddO2RldmljZVsnbW9kZXMnXT1bXTtkZXZpY2VbJ3Nob3ctYnktZGVmYXVsdCddPXRydWU7ZGV2aWNlWydzaG93J109J0RlZmF1bHQnO25ld0xpc3QucHVzaChkZXZpY2UpO30KaWYobmV3TGlzdC5sZW5ndGgpCkNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG5ld1NldHRpbmdOYW1lLFtdKS5zZXQobmV3TGlzdCk7b2xkU2V0dGluZy5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTExVG8xMigpe3RoaXMuX21pZ3JhdGVTZXR0aW5nc0Zyb21Mb2NhbFN0b3JhZ2UoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTEyVG8xMygpe3RoaXMuX21pZ3JhdGVTZXR0aW5nc0Zyb21Mb2NhbFN0b3JhZ2UoKTtDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVPdmVydmlld01vZGUnLCcnKS5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTEzVG8xNCgpe2NvbnN0IGRlZmF1bHRWYWx1ZT17J3Rocm91Z2hwdXQnOi0xLCdsYXRlbmN5JzowfTtDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0NvbmRpdGlvbnMnLGRlZmF1bHRWYWx1ZSkuc2V0KGRlZmF1bHRWYWx1ZSk7fQpfdXBkYXRlVmVyc2lvbkZyb20xNFRvMTUoKXtjb25zdCBzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ3dvcmtzcGFjZUV4Y2x1ZGVkRm9sZGVycycse30pO2NvbnN0IG9sZFZhbHVlPXNldHRpbmcuZ2V0KCk7Y29uc3QgbmV3VmFsdWU9e307Zm9yKGNvbnN0IGZpbGVTeXN0ZW1QYXRoIGluIG9sZFZhbHVlKXtuZXdWYWx1ZVtmaWxlU3lzdGVtUGF0aF09W107Zm9yKGNvbnN0IGVudHJ5IG9mIG9sZFZhbHVlW2ZpbGVTeXN0ZW1QYXRoXSkKbmV3VmFsdWVbZmlsZVN5c3RlbVBhdGhdLnB1c2goZW50cnkucGF0aCk7fQpzZXR0aW5nLnNldChuZXdWYWx1ZSk7fQpfdXBkYXRlVmVyc2lvbkZyb20xNVRvMTYoKXtjb25zdCBzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdJbnNwZWN0b3JWaWV3LnBhbmVsT3JkZXInLHt9KTtjb25zdCB0YWJPcmRlcnM9c2V0dGluZy5nZXQoKTtmb3IoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRhYk9yZGVycykpCnRhYk9yZGVyc1trZXldPSh0YWJPcmRlcnNba2V5XSsxKSoxMDtzZXR0aW5nLnNldCh0YWJPcmRlcnMpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMTZUbzE3KCl7Y29uc3Qgc2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0NvbmRpdGlvbnNDdXN0b21Qcm9maWxlcycsW10pO2NvbnN0IG9sZFZhbHVlPXNldHRpbmcuZ2V0KCk7Y29uc3QgbmV3VmFsdWU9W107aWYoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpe2Zvcihjb25zdCBwcmVzZXQgb2Ygb2xkVmFsdWUpe2lmKHR5cGVvZiBwcmVzZXQudGl0bGU9PT0nc3RyaW5nJyYmdHlwZW9mIHByZXNldC52YWx1ZT09PSdvYmplY3QnJiZ0eXBlb2YgcHJlc2V0LnZhbHVlLnRocm91Z2hwdXQ9PT0nbnVtYmVyJyYmdHlwZW9mIHByZXNldC52YWx1ZS5sYXRlbmN5PT09J251bWJlcicpe25ld1ZhbHVlLnB1c2goe3RpdGxlOnByZXNldC50aXRsZSx2YWx1ZTp7ZG93bmxvYWQ6cHJlc2V0LnZhbHVlLnRocm91Z2hwdXQsdXBsb2FkOnByZXNldC52YWx1ZS50aHJvdWdocHV0LGxhdGVuY3k6cHJlc2V0LnZhbHVlLmxhdGVuY3l9fSk7fX19CnNldHRpbmcuc2V0KG5ld1ZhbHVlKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTE3VG8xOCgpe2NvbnN0IHNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnd29ya3NwYWNlRXhjbHVkZWRGb2xkZXJzJyx7fSk7Y29uc3Qgb2xkVmFsdWU9c2V0dGluZy5nZXQoKTtjb25zdCBuZXdWYWx1ZT17fTtmb3IoY29uc3Qgb2xkS2V5IGluIG9sZFZhbHVlKXtsZXQgbmV3S2V5PW9sZEtleS5yZXBsYWNlKC9cXC9nLCcvJyk7aWYoIW5ld0tleS5zdGFydHNXaXRoKCdmaWxlOi8vJykpe2lmKG5ld0tleS5zdGFydHNXaXRoKCcvJykpCm5ld0tleT0nZmlsZTovLycrbmV3S2V5O2Vsc2UKbmV3S2V5PSdmaWxlOi8vLycrbmV3S2V5O30KbmV3VmFsdWVbbmV3S2V5XT1vbGRWYWx1ZVtvbGRLZXldO30Kc2V0dGluZy5zZXQobmV3VmFsdWUpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMThUbzE5KCl7Y29uc3QgZGVmYXVsdENvbHVtbnM9e3N0YXR1czp0cnVlLHR5cGU6dHJ1ZSxpbml0aWF0b3I6dHJ1ZSxzaXplOnRydWUsdGltZTp0cnVlfTtjb25zdCB2aXNpYmxlQ29sdW1uU2V0dGluZ3M9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ25ldHdvcmtMb2dDb2x1bW5zVmlzaWJpbGl0eScsZGVmYXVsdENvbHVtbnMpO2NvbnN0IHZpc2libGVDb2x1bW5zPXZpc2libGVDb2x1bW5TZXR0aW5ncy5nZXQoKTt2aXNpYmxlQ29sdW1ucy5uYW1lPXRydWU7dmlzaWJsZUNvbHVtbnMudGltZWxpbmU9dHJ1ZTtjb25zdCBjb25maWdzPXt9O2Zvcihjb25zdCBjb2x1bW5JZCBpbiB2aXNpYmxlQ29sdW1ucyl7aWYoIXZpc2libGVDb2x1bW5zLmhhc093blByb3BlcnR5KGNvbHVtbklkKSkKY29udGludWU7Y29uZmlnc1tjb2x1bW5JZC50b0xvd2VyQ2FzZSgpXT17dmlzaWJsZTp2aXNpYmxlQ29sdW1uc1tjb2x1bW5JZF19O30KY29uc3QgbmV3U2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0xvZ0NvbHVtbnMnLHt9KTtuZXdTZXR0aW5nLnNldChjb25maWdzKTt2aXNpYmxlQ29sdW1uU2V0dGluZ3MucmVtb3ZlKCk7fQpfdXBkYXRlVmVyc2lvbkZyb20xOVRvMjAoKXtjb25zdCBvbGRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdJbnNwZWN0b3JWaWV3LnBhbmVsT3JkZXInLHt9KTtjb25zdCBuZXdTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdwYW5lbC10YWJPcmRlcicse30pO25ld1NldHRpbmcuc2V0KG9sZFNldHRpbmcuZ2V0KCkpO29sZFNldHRpbmcucmVtb3ZlKCk7fQpfdXBkYXRlVmVyc2lvbkZyb20yMFRvMjEoKXtjb25zdCBuZXR3b3JrQ29sdW1ucz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0xvZ0NvbHVtbnMnLHt9KTtjb25zdCBjb2x1bW5zPShuZXR3b3JrQ29sdW1ucy5nZXQoKSk7ZGVsZXRlIGNvbHVtbnNbJ3RpbWVsaW5lJ107ZGVsZXRlIGNvbHVtbnNbJ3dhdGVyZmFsbCddO25ldHdvcmtDb2x1bW5zLnNldChjb2x1bW5zKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTIxVG8yMigpe2NvbnN0IGJyZWFrcG9pbnRzU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlTG9jYWxTZXR0aW5nKCdicmVha3BvaW50cycsW10pO2NvbnN0IGJyZWFrcG9pbnRzPWJyZWFrcG9pbnRzU2V0dGluZy5nZXQoKTtmb3IoY29uc3QgYnJlYWtwb2ludCBvZiBicmVha3BvaW50cyl7YnJlYWtwb2ludFsndXJsJ109YnJlYWtwb2ludFsnc291cmNlRmlsZUlkJ107ZGVsZXRlIGJyZWFrcG9pbnRbJ3NvdXJjZUZpbGVJZCddO30KYnJlYWtwb2ludHNTZXR0aW5nLnNldChicmVha3BvaW50cyk7fQpfdXBkYXRlVmVyc2lvbkZyb20yMlRvMjMoKXt9Cl91cGRhdGVWZXJzaW9uRnJvbTIzVG8yNCgpe2NvbnN0IG9sZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3NlYXJjaEluQ29udGVudFNjcmlwdHMnLGZhbHNlKTtjb25zdCBuZXdTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzZWFyY2hJbkFub255bW91c0FuZENvbnRlbnRTY3JpcHRzJyxmYWxzZSk7bmV3U2V0dGluZy5zZXQob2xkU2V0dGluZy5nZXQoKSk7b2xkU2V0dGluZy5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTI0VG8yNSgpe2NvbnN0IGRlZmF1bHRDb2x1bW5zPXtzdGF0dXM6dHJ1ZSx0eXBlOnRydWUsaW5pdGlhdG9yOnRydWUsc2l6ZTp0cnVlLHRpbWU6dHJ1ZX07Y29uc3QgbmV0d29ya0xvZ0NvbHVtbnNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrTG9nQ29sdW1ucycsZGVmYXVsdENvbHVtbnMpO2NvbnN0IGNvbHVtbnM9bmV0d29ya0xvZ0NvbHVtbnNTZXR0aW5nLmdldCgpO2RlbGV0ZSBjb2x1bW5zLnByb2R1Y3Q7bmV0d29ya0xvZ0NvbHVtbnNTZXR0aW5nLnNldChjb2x1bW5zKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTI1VG8yNigpe2NvbnN0IG9sZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ21lc3NhZ2VVUkxGaWx0ZXJzJyx7fSk7Y29uc3QgdXJscz1PYmplY3Qua2V5cyhvbGRTZXR0aW5nLmdldCgpKTtjb25zdCB0ZXh0RmlsdGVyPXVybHMubWFwKHVybD0+YC11cmw6JHt1cmx9YCkuam9pbignICcpO2lmKHRleHRGaWx0ZXIpe2NvbnN0IHRleHRGaWx0ZXJTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdjb25zb2xlLnRleHRGaWx0ZXInLCcnKTtjb25zdCBzdWZmaXg9dGV4dEZpbHRlclNldHRpbmcuZ2V0KCk/YCAke3RleHRGaWx0ZXJTZXR0aW5nLmdldCgpfWA6Jyc7dGV4dEZpbHRlclNldHRpbmcuc2V0KGAke3RleHRGaWx0ZXJ9JHtzdWZmaXh9YCk7fQpvbGRTZXR0aW5nLnJlbW92ZSgpO30KX21pZ3JhdGVTZXR0aW5nc0Zyb21Mb2NhbFN0b3JhZ2UoKXtjb25zdCBsb2NhbFNldHRpbmdzPW5ldyBTZXQoWydhZHZhbmNlZFNlYXJjaENvbmZpZycsJ2JyZWFrcG9pbnRzJywnY29uc29sZUhpc3RvcnknLCdkb21CcmVha3BvaW50cycsJ2V2ZW50TGlzdGVuZXJCcmVha3BvaW50cycsJ2ZpbGVTeXN0ZW1NYXBwaW5nJywnbGFzdFNlbGVjdGVkU291cmNlc1NpZGViYXJQYW5lVGFiJywncHJldmlvdXNseVZpZXdlZEZpbGVzJywnc2F2ZWRVUkxzJywnd2F0Y2hFeHByZXNzaW9ucycsJ3dvcmtzcGFjZUV4Y2x1ZGVkRm9sZGVycycsJ3hockJyZWFrcG9pbnRzJ10pO2lmKCF3aW5kb3cubG9jYWxTdG9yYWdlKQpyZXR1cm47Zm9yKGNvbnN0IGtleSBpbiB3aW5kb3cubG9jYWxTdG9yYWdlKXtpZihsb2NhbFNldHRpbmdzLmhhcyhrZXkpKQpjb250aW51ZTtjb25zdCB2YWx1ZT13aW5kb3cubG9jYWxTdG9yYWdlW2tleV07d2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7Q29tbW9uLnNldHRpbmdzLl9nbG9iYWxTdG9yYWdlW2tleV09dmFsdWU7fX0KX2NsZWFyQnJlYWtwb2ludHNXaGVuVG9vTWFueShicmVha3BvaW50c1NldHRpbmcsbWF4QnJlYWtwb2ludHNDb3VudCl7aWYoYnJlYWtwb2ludHNTZXR0aW5nLmdldCgpLmxlbmd0aD5tYXhCcmVha3BvaW50c0NvdW50KQpicmVha3BvaW50c1NldHRpbmcuc2V0KFtdKTt9fTtDb21tb24uVmVyc2lvbkNvbnRyb2xsZXIuX2N1cnJlbnRWZXJzaW9uTmFtZT0naW5zcGVjdG9yVmVyc2lvbic7Q29tbW9uLlZlcnNpb25Db250cm9sbGVyLmN1cnJlbnRWZXJzaW9uPTI2O0NvbW1vbi5zZXR0aW5ncztDb21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlPXtHbG9iYWw6U3ltYm9sKCdHbG9iYWwnKSxMb2NhbDpTeW1ib2woJ0xvY2FsJyksU2Vzc2lvbjpTeW1ib2woJ1Nlc3Npb24nKX07Q29tbW9uLm1vZHVsZVNldHRpbmc9ZnVuY3Rpb24oc2V0dGluZ05hbWUpe3JldHVybiBDb21tb24uc2V0dGluZ3MubW9kdWxlU2V0dGluZyhzZXR0aW5nTmFtZSk7fTtDb21tb24uc2V0dGluZ0ZvclRlc3Q9ZnVuY3Rpb24oc2V0dGluZ05hbWUpe3JldHVybiBDb21tb24uc2V0dGluZ3Muc2V0dGluZ0ZvclRlc3Qoc2V0dGluZ05hbWUpO307O0NvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXI9Y2xhc3N7Y29uc3RydWN0b3IoY29udGVudFVSTCxjb250ZW50VHlwZSxsYXp5Q29udGVudCl7dGhpcy5fY29udGVudFVSTD1jb250ZW50VVJMO3RoaXMuX2NvbnRlbnRUeXBlPWNvbnRlbnRUeXBlO3RoaXMuX2xhenlDb250ZW50PWxhenlDb250ZW50O30Kc3RhdGljIGZyb21TdHJpbmcoY29udGVudFVSTCxjb250ZW50VHlwZSxjb250ZW50KXtjb25zdCBsYXp5Q29udGVudD0oKT0+UHJvbWlzZS5yZXNvbHZlKGNvbnRlbnQpO3JldHVybiBuZXcgQ29tbW9uLlN0YXRpY0NvbnRlbnRQcm92aWRlcihjb250ZW50VVJMLGNvbnRlbnRUeXBlLGxhenlDb250ZW50KTt9CmNvbnRlbnRVUkwoKXtyZXR1cm4gdGhpcy5fY29udGVudFVSTDt9CmNvbnRlbnRUeXBlKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRUeXBlO30KY29udGVudEVuY29kZWQoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTt9CnJlcXVlc3RDb250ZW50KCl7cmV0dXJuIHRoaXMuX2xhenlDb250ZW50KCk7fQphc3luYyBzZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCBjb250ZW50PWF3YWl0IHRoaXMuX2xhenlDb250ZW50KCk7cmV0dXJuIGNvbnRlbnQ/Q29tbW9uLkNvbnRlbnRQcm92aWRlci5wZXJmb3JtU2VhcmNoSW5Db250ZW50KGNvbnRlbnQscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTpbXTt9fTs7Q29tbW9uLk91dHB1dFN0cmVhbT1mdW5jdGlvbigpe307Q29tbW9uLk91dHB1dFN0cmVhbS5wcm90b3R5cGU9e3dyaXRlKGRhdGEpe30sY2xvc2UoKXt9fTtDb21tb24uU3RyaW5nT3V0cHV0U3RyZWFtPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT0nJzt9CmFzeW5jIHdyaXRlKGNodW5rKXt0aGlzLl9kYXRhKz1jaHVuazt9CmNsb3NlKCl7fQpkYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGE7fX07O0NvbW1vbi5TZWdtZW50PWNsYXNze2NvbnN0cnVjdG9yKGJlZ2luLGVuZCxkYXRhKXtpZihiZWdpbj5lbmQpCmNvbnNvbGUuYXNzZXJ0KGZhbHNlLCdJbnZhbGlkIHNlZ21lbnQnKTt0aGlzLmJlZ2luPWJlZ2luO3RoaXMuZW5kPWVuZDt0aGlzLmRhdGE9ZGF0YTt9CmludGVyc2VjdHModGhhdCl7cmV0dXJuIHRoaXMuYmVnaW48dGhhdC5lbmQmJnRoYXQuYmVnaW48dGhpcy5lbmQ7fX07Q29tbW9uLlNlZ21lbnRlZFJhbmdlPWNsYXNze2NvbnN0cnVjdG9yKG1lcmdlQ2FsbGJhY2spe3RoaXMuX3NlZ21lbnRzPVtdO3RoaXMuX21lcmdlQ2FsbGJhY2s9bWVyZ2VDYWxsYmFjazt9CmFwcGVuZChuZXdTZWdtZW50KXtsZXQgc3RhcnRJbmRleD10aGlzLl9zZWdtZW50cy5sb3dlckJvdW5kKG5ld1NlZ21lbnQsKGEsYik9PmEuYmVnaW4tYi5iZWdpbik7bGV0IGVuZEluZGV4PXN0YXJ0SW5kZXg7bGV0IG1lcmdlZD1udWxsO2lmKHN0YXJ0SW5kZXg+MCl7Y29uc3QgcHJlY2VkaW5nU2VnbWVudD10aGlzLl9zZWdtZW50c1tzdGFydEluZGV4LTFdO21lcmdlZD10aGlzLl90cnlNZXJnZShwcmVjZWRpbmdTZWdtZW50LG5ld1NlZ21lbnQpO2lmKG1lcmdlZCl7LS1zdGFydEluZGV4O25ld1NlZ21lbnQ9bWVyZ2VkO31lbHNlIGlmKHRoaXMuX3NlZ21lbnRzW3N0YXJ0SW5kZXgtMV0uZW5kPj1uZXdTZWdtZW50LmJlZ2luKXtpZihuZXdTZWdtZW50LmVuZDxwcmVjZWRpbmdTZWdtZW50LmVuZCl7dGhpcy5fc2VnbWVudHMuc3BsaWNlKHN0YXJ0SW5kZXgsMCxuZXcgQ29tbW9uLlNlZ21lbnQobmV3U2VnbWVudC5lbmQscHJlY2VkaW5nU2VnbWVudC5lbmQscHJlY2VkaW5nU2VnbWVudC5kYXRhKSk7fQpwcmVjZWRpbmdTZWdtZW50LmVuZD1uZXdTZWdtZW50LmJlZ2luO319CndoaWxlKGVuZEluZGV4PHRoaXMuX3NlZ21lbnRzLmxlbmd0aCYmdGhpcy5fc2VnbWVudHNbZW5kSW5kZXhdLmVuZDw9bmV3U2VnbWVudC5lbmQpCisrZW5kSW5kZXg7aWYoZW5kSW5kZXg8dGhpcy5fc2VnbWVudHMubGVuZ3RoKXttZXJnZWQ9dGhpcy5fdHJ5TWVyZ2UobmV3U2VnbWVudCx0aGlzLl9zZWdtZW50c1tlbmRJbmRleF0pO2lmKG1lcmdlZCl7ZW5kSW5kZXgrKztuZXdTZWdtZW50PW1lcmdlZDt9ZWxzZSBpZihuZXdTZWdtZW50LmludGVyc2VjdHModGhpcy5fc2VnbWVudHNbZW5kSW5kZXhdKSl7dGhpcy5fc2VnbWVudHNbZW5kSW5kZXhdLmJlZ2luPW5ld1NlZ21lbnQuZW5kO319CnRoaXMuX3NlZ21lbnRzLnNwbGljZShzdGFydEluZGV4LGVuZEluZGV4LXN0YXJ0SW5kZXgsbmV3U2VnbWVudCk7fQphcHBlbmRSYW5nZSh0aGF0KXt0aGF0LnNlZ21lbnRzKCkuZm9yRWFjaChzZWdtZW50PT50aGlzLmFwcGVuZChzZWdtZW50KSk7fQpzZWdtZW50cygpe3JldHVybiB0aGlzLl9zZWdtZW50czt9Cl90cnlNZXJnZShmaXJzdCxzZWNvbmQpe2NvbnN0IG1lcmdlZD10aGlzLl9tZXJnZUNhbGxiYWNrJiZ0aGlzLl9tZXJnZUNhbGxiYWNrKGZpcnN0LHNlY29uZCk7aWYoIW1lcmdlZCkKcmV0dXJuIG51bGw7bWVyZ2VkLmJlZ2luPWZpcnN0LmJlZ2luO21lcmdlZC5lbmQ9TWF0aC5tYXgoZmlyc3QuZW5kLHNlY29uZC5lbmQpO3JldHVybiBtZXJnZWQ7fX07O0NvbW1vbi5UaHJvdHRsZXI9Y2xhc3N7Y29uc3RydWN0b3IodGltZW91dCl7dGhpcy5fdGltZW91dD10aW1lb3V0O3RoaXMuX2lzUnVubmluZ1Byb2Nlc3M9ZmFsc2U7dGhpcy5fYXNTb29uQXNQb3NzaWJsZT1mYWxzZTt0aGlzLl9wcm9jZXNzPW51bGw7dGhpcy5fbGFzdENvbXBsZXRlVGltZT0wO3RoaXMuX3NjaGVkdWxlUHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT57dGhpcy5fc2NoZWR1bGVSZXNvbHZlPWZ1bGZpbGw7fSk7fQpfcHJvY2Vzc0NvbXBsZXRlZCgpe3RoaXMuX2xhc3RDb21wbGV0ZVRpbWU9dGhpcy5fZ2V0VGltZSgpO3RoaXMuX2lzUnVubmluZ1Byb2Nlc3M9ZmFsc2U7aWYodGhpcy5fcHJvY2VzcykKdGhpcy5faW5uZXJTY2hlZHVsZShmYWxzZSk7dGhpcy5fcHJvY2Vzc0NvbXBsZXRlZEZvclRlc3RzKCk7fQpfcHJvY2Vzc0NvbXBsZXRlZEZvclRlc3RzKCl7fQpfb25UaW1lb3V0KCl7ZGVsZXRlIHRoaXMuX3Byb2Nlc3NUaW1lb3V0O3RoaXMuX2FzU29vbkFzUG9zc2libGU9ZmFsc2U7dGhpcy5faXNSdW5uaW5nUHJvY2Vzcz10cnVlO1Byb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fcHJvY2VzcykuY2F0Y2goY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpKS50aGVuKHRoaXMuX3Byb2Nlc3NDb21wbGV0ZWQuYmluZCh0aGlzKSkudGhlbih0aGlzLl9zY2hlZHVsZVJlc29sdmUpO3RoaXMuX3NjaGVkdWxlUHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT57dGhpcy5fc2NoZWR1bGVSZXNvbHZlPWZ1bGZpbGw7fSk7dGhpcy5fcHJvY2Vzcz1udWxsO30Kc2NoZWR1bGUocHJvY2Vzcyxhc1Nvb25Bc1Bvc3NpYmxlKXt0aGlzLl9wcm9jZXNzPXByb2Nlc3M7Y29uc3QgaGFzU2NoZWR1bGVkVGFza3M9ISF0aGlzLl9wcm9jZXNzVGltZW91dHx8dGhpcy5faXNSdW5uaW5nUHJvY2Vzcztjb25zdCBva1RvRmlyZT10aGlzLl9nZXRUaW1lKCktdGhpcy5fbGFzdENvbXBsZXRlVGltZT50aGlzLl90aW1lb3V0O2FzU29vbkFzUG9zc2libGU9ISFhc1Nvb25Bc1Bvc3NpYmxlfHwoIWhhc1NjaGVkdWxlZFRhc2tzJiZva1RvRmlyZSk7Y29uc3QgZm9yY2VUaW1lclVwZGF0ZT1hc1Nvb25Bc1Bvc3NpYmxlJiYhdGhpcy5fYXNTb29uQXNQb3NzaWJsZTt0aGlzLl9hc1Nvb25Bc1Bvc3NpYmxlPXRoaXMuX2FzU29vbkFzUG9zc2libGV8fGFzU29vbkFzUG9zc2libGU7dGhpcy5faW5uZXJTY2hlZHVsZShmb3JjZVRpbWVyVXBkYXRlKTtyZXR1cm4gdGhpcy5fc2NoZWR1bGVQcm9taXNlO30KX2lubmVyU2NoZWR1bGUoZm9yY2VUaW1lclVwZGF0ZSl7aWYodGhpcy5faXNSdW5uaW5nUHJvY2VzcykKcmV0dXJuO2lmKHRoaXMuX3Byb2Nlc3NUaW1lb3V0JiYhZm9yY2VUaW1lclVwZGF0ZSkKcmV0dXJuO2lmKHRoaXMuX3Byb2Nlc3NUaW1lb3V0KQp0aGlzLl9jbGVhclRpbWVvdXQodGhpcy5fcHJvY2Vzc1RpbWVvdXQpO2NvbnN0IHRpbWVvdXQ9dGhpcy5fYXNTb29uQXNQb3NzaWJsZT8wOnRoaXMuX3RpbWVvdXQ7dGhpcy5fcHJvY2Vzc1RpbWVvdXQ9dGhpcy5fc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQuYmluZCh0aGlzKSx0aW1lb3V0KTt9Cl9jbGVhclRpbWVvdXQodGltZW91dElkKXtjbGVhclRpbWVvdXQodGltZW91dElkKTt9Cl9zZXRUaW1lb3V0KG9wZXJhdGlvbix0aW1lb3V0KXtyZXR1cm4gc2V0VGltZW91dChvcGVyYXRpb24sdGltZW91dCk7fQpfZ2V0VGltZSgpe3JldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7fX07Q29tbW9uLlRocm90dGxlci5GaW5pc2hDYWxsYmFjazs7Q29tbW9uLlRyaWU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmNsZWFyKCk7fQphZGQod29yZCl7bGV0IG5vZGU9dGhpcy5fcm9vdDsrK3RoaXMuX3dvcmRzSW5TdWJ0cmVlW3RoaXMuX3Jvb3RdO2ZvcihsZXQgaT0wO2k8d29yZC5sZW5ndGg7KytpKXtjb25zdCBlZGdlPXdvcmRbaV07bGV0IG5leHQ9dGhpcy5fZWRnZXNbbm9kZV1bZWRnZV07aWYoIW5leHQpe2lmKHRoaXMuX2ZyZWVOb2Rlcy5sZW5ndGgpe25leHQ9dGhpcy5fZnJlZU5vZGVzLnBvcCgpO31lbHNle25leHQ9dGhpcy5fc2l6ZSsrO3RoaXMuX2lzV29yZC5wdXNoKGZhbHNlKTt0aGlzLl93b3Jkc0luU3VidHJlZS5wdXNoKDApO3RoaXMuX2VkZ2VzLnB1c2goe19fcHJvdG9fXzpudWxsfSk7fQp0aGlzLl9lZGdlc1tub2RlXVtlZGdlXT1uZXh0O30KKyt0aGlzLl93b3Jkc0luU3VidHJlZVtuZXh0XTtub2RlPW5leHQ7fQp0aGlzLl9pc1dvcmRbbm9kZV09dHJ1ZTt9CnJlbW92ZSh3b3JkKXtpZighdGhpcy5oYXMod29yZCkpCnJldHVybiBmYWxzZTtsZXQgbm9kZT10aGlzLl9yb290Oy0tdGhpcy5fd29yZHNJblN1YnRyZWVbdGhpcy5fcm9vdF07Zm9yKGxldCBpPTA7aTx3b3JkLmxlbmd0aDsrK2kpe2NvbnN0IGVkZ2U9d29yZFtpXTtjb25zdCBuZXh0PXRoaXMuX2VkZ2VzW25vZGVdW2VkZ2VdO2lmKCEtLXRoaXMuX3dvcmRzSW5TdWJ0cmVlW25leHRdKXtkZWxldGUgdGhpcy5fZWRnZXNbbm9kZV1bZWRnZV07dGhpcy5fZnJlZU5vZGVzLnB1c2gobmV4dCk7fQpub2RlPW5leHQ7fQp0aGlzLl9pc1dvcmRbbm9kZV09ZmFsc2U7cmV0dXJuIHRydWU7fQpoYXMod29yZCl7bGV0IG5vZGU9dGhpcy5fcm9vdDtmb3IobGV0IGk9MDtpPHdvcmQubGVuZ3RoOysraSl7bm9kZT10aGlzLl9lZGdlc1tub2RlXVt3b3JkW2ldXTtpZighbm9kZSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRoaXMuX2lzV29yZFtub2RlXTt9CndvcmRzKHByZWZpeCl7cHJlZml4PXByZWZpeHx8Jyc7bGV0IG5vZGU9dGhpcy5fcm9vdDtmb3IobGV0IGk9MDtpPHByZWZpeC5sZW5ndGg7KytpKXtub2RlPXRoaXMuX2VkZ2VzW25vZGVdW3ByZWZpeFtpXV07aWYoIW5vZGUpCnJldHVybltdO30KY29uc3QgcmVzdWx0cz1bXTt0aGlzLl9kZnMobm9kZSxwcmVmaXgscmVzdWx0cyk7cmV0dXJuIHJlc3VsdHM7fQpfZGZzKG5vZGUscHJlZml4LHJlc3VsdHMpe2lmKHRoaXMuX2lzV29yZFtub2RlXSkKcmVzdWx0cy5wdXNoKHByZWZpeCk7Y29uc3QgZWRnZXM9dGhpcy5fZWRnZXNbbm9kZV07Zm9yKGNvbnN0IGVkZ2UgaW4gZWRnZXMpCnRoaXMuX2RmcyhlZGdlc1tlZGdlXSxwcmVmaXgrZWRnZSxyZXN1bHRzKTt9Cmxvbmdlc3RQcmVmaXgod29yZCxmdWxsV29yZE9ubHkpe2xldCBub2RlPXRoaXMuX3Jvb3Q7bGV0IHdvcmRJbmRleD0wO2ZvcihsZXQgaT0wO2k8d29yZC5sZW5ndGg7KytpKXtub2RlPXRoaXMuX2VkZ2VzW25vZGVdW3dvcmRbaV1dO2lmKCFub2RlKQpicmVhaztpZighZnVsbFdvcmRPbmx5fHx0aGlzLl9pc1dvcmRbbm9kZV0pCndvcmRJbmRleD1pKzE7fQpyZXR1cm4gd29yZC5zdWJzdHJpbmcoMCx3b3JkSW5kZXgpO30KY2xlYXIoKXt0aGlzLl9zaXplPTE7dGhpcy5fcm9vdD0wO3RoaXMuX2VkZ2VzPVt7X19wcm90b19fOm51bGx9XTt0aGlzLl9pc1dvcmQ9W2ZhbHNlXTt0aGlzLl93b3Jkc0luU3VidHJlZT1bMF07dGhpcy5fZnJlZU5vZGVzPVtdO319OztzZWxmWydDb21tb24nXT1zZWxmWydDb21tb24nXXx8e307Q29tbW9uLlVJU3RyaW5nPWZ1bmN0aW9uKHN0cmluZyx2YXJhcmcpe3JldHVybiBTdHJpbmcudnNwcmludGYoQ29tbW9uLmxvY2FsaXplKHN0cmluZyksQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTt9O0NvbW1vbi5sb2NhbGl6ZT1mdW5jdGlvbihzdHJpbmcpe3JldHVybiBzdHJpbmc7fTtDb21tb24uVUlTdHJpbmdGb3JtYXQ9Y2xhc3N7Y29uc3RydWN0b3IoZm9ybWF0KXt0aGlzLl9sb2NhbGl6ZWRGb3JtYXQ9Q29tbW9uLmxvY2FsaXplKGZvcm1hdCk7dGhpcy5fdG9rZW5pemVkRm9ybWF0PVN0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZyh0aGlzLl9sb2NhbGl6ZWRGb3JtYXQsU3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycyk7fQpzdGF0aWMgX2FwcGVuZChhLGIpe3JldHVybiBhK2I7fQpmb3JtYXQodmFyYXJnKXtyZXR1cm4gU3RyaW5nLmZvcm1hdCh0aGlzLl9sb2NhbGl6ZWRGb3JtYXQsYXJndW1lbnRzLFN0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnMsJycsQ29tbW9uLlVJU3RyaW5nRm9ybWF0Ll9hcHBlbmQsdGhpcy5fdG9rZW5pemVkRm9ybWF0KS5mb3JtYXR0ZWRSZXN1bHQ7fX07c2VsZi5scz1mdW5jdGlvbihzdHJpbmdzLHZhcmFyZyl7aWYodHlwZW9mIHN0cmluZ3M9PT0nc3RyaW5nJykKcmV0dXJuIHN0cmluZ3M7Y29uc3QgdmFsdWVzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtpZighdmFsdWVzLmxlbmd0aCkKcmV0dXJuIHN0cmluZ3NbMF07bGV0IHJlc3VsdD0nJztmb3IobGV0IGk9MDtpPHZhbHVlcy5sZW5ndGg7aSsrKXtyZXN1bHQrPXN0cmluZ3NbaV07cmVzdWx0Kz0nJyt2YWx1ZXNbaV07fQpyZXR1cm4gcmVzdWx0K3N0cmluZ3NbdmFsdWVzLmxlbmd0aF07fTs7Q29tbW9uLlJlbmRlcmVyPWZ1bmN0aW9uKCl7fTtDb21tb24uUmVuZGVyZXIucHJvdG90eXBlPXtyZW5kZXIob2JqZWN0LG9wdGlvbnMpe319O0NvbW1vbi5SZW5kZXJlci5yZW5kZXI9ZnVuY3Rpb24ob2JqZWN0LG9wdGlvbnMpe2lmKCFvYmplY3QpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NhblwndCByZW5kZXIgJytvYmplY3QpKTtyZXR1cm4gc2VsZi5ydW50aW1lLmV4dGVuc2lvbihDb21tb24uUmVuZGVyZXIsb2JqZWN0KS5pbnN0YW5jZSgpLnRoZW4ocmVuZGVyZXI9PnJlbmRlcmVyLnJlbmRlcihvYmplY3Qsb3B0aW9uc3x8e30pKTt9O0NvbW1vbi5SZW5kZXJlci5PcHRpb25zO0NvbW1vbi5SZXZlYWxlcj1mdW5jdGlvbigpe307Q29tbW9uLlJldmVhbGVyLnJldmVhbD1mdW5jdGlvbihyZXZlYWxhYmxlLG9taXRGb2N1cyl7aWYoIXJldmVhbGFibGUpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NhblwndCByZXZlYWwgJytyZXZlYWxhYmxlKSk7cmV0dXJuIHNlbGYucnVudGltZS5hbGxJbnN0YW5jZXMoQ29tbW9uLlJldmVhbGVyLHJldmVhbGFibGUpLnRoZW4ocmV2ZWFsKTtmdW5jdGlvbiByZXZlYWwocmV2ZWFsZXJzKXtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPHJldmVhbGVycy5sZW5ndGg7KytpKQpwcm9taXNlcy5wdXNoKHJldmVhbGVyc1tpXS5yZXZlYWwoKHJldmVhbGFibGUpLG9taXRGb2N1cykpO3JldHVybiBQcm9taXNlLnJhY2UocHJvbWlzZXMpO319O0NvbW1vbi5SZXZlYWxlci5yZXZlYWxEZXN0aW5hdGlvbj1mdW5jdGlvbihyZXZlYWxhYmxlKXtjb25zdCBleHRlbnNpb249c2VsZi5ydW50aW1lLmV4dGVuc2lvbihDb21tb24uUmV2ZWFsZXIscmV2ZWFsYWJsZSk7aWYoIWV4dGVuc2lvbikKcmV0dXJuIG51bGw7cmV0dXJuIGV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2Rlc3RpbmF0aW9uJ107fTtDb21tb24uUmV2ZWFsZXIucHJvdG90eXBlPXtyZXZlYWwob2JqZWN0LG9taXRGb2N1cyl7fX07Q29tbW9uLkFwcD1mdW5jdGlvbigpe307Q29tbW9uLkFwcC5wcm90b3R5cGU9e3ByZXNlbnRVSShkb2N1bWVudCl7fX07Q29tbW9uLkFwcFByb3ZpZGVyPWZ1bmN0aW9uKCl7fTtDb21tb24uQXBwUHJvdmlkZXIucHJvdG90eXBlPXtjcmVhdGVBcHAoKXt9fTtDb21tb24uUXVlcnlQYXJhbUhhbmRsZXI9ZnVuY3Rpb24oKXt9O0NvbW1vbi5RdWVyeVBhcmFtSGFuZGxlci5wcm90b3R5cGU9e2hhbmRsZVF1ZXJ5UGFyYW0odmFsdWUpe319O0NvbW1vbi5SdW5uYWJsZT1mdW5jdGlvbigpe307Q29tbW9uLlJ1bm5hYmxlLnByb3RvdHlwZT17cnVuKCl7fX07Q29tbW9uLkxpbmtpZmllcj1mdW5jdGlvbigpe307Q29tbW9uLkxpbmtpZmllci5wcm90b3R5cGU9e2xpbmtpZnkob2JqZWN0LG9wdGlvbnMpe319O0NvbW1vbi5MaW5raWZpZXIubGlua2lmeT1mdW5jdGlvbihvYmplY3Qsb3B0aW9ucyl7aWYoIW9iamVjdCkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ2FuXCd0IGxpbmtpZnkgJytvYmplY3QpKTtyZXR1cm4gc2VsZi5ydW50aW1lLmV4dGVuc2lvbihDb21tb24uTGlua2lmaWVyLG9iamVjdCkuaW5zdGFuY2UoKS50aGVuKGxpbmtpZmllcj0+bGlua2lmaWVyLmxpbmtpZnkob2JqZWN0LG9wdGlvbnMpKTt9O0NvbW1vbi5MaW5raWZpZXIuT3B0aW9ucztDb21tb24uSmF2YVNjcmlwdE1ldGFkYXRhPWZ1bmN0aW9uKCl7fTtDb21tb24uSmF2YVNjcmlwdE1ldGFkYXRhLnByb3RvdHlwZT17c2lnbmF0dXJlc0Zvck5hdGl2ZUZ1bmN0aW9uKG5hbWUpe30sc2lnbmF0dXJlc0Zvckluc3RhbmNlTWV0aG9kKG5hbWUscmVjZWl2ZXJDbGFzc05hbWUpe30sc2lnbmF0dXJlc0ZvclN0YXRpY01ldGhvZChuYW1lLHJlY2VpdmVyQ29uc3RydWN0b3JOYW1lKXt9fTs7Q29tbW9uLkNoYXJhY3RlcklkTWFwPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZWxlbWVudFRvQ2hhcmFjdGVyPW5ldyBNYXAoKTt0aGlzLl9jaGFyYWN0ZXJUb0VsZW1lbnQ9bmV3IE1hcCgpO3RoaXMuX2NoYXJDb2RlPTMzO30KdG9DaGFyKG9iamVjdCl7bGV0IGNoYXJhY3Rlcj10aGlzLl9lbGVtZW50VG9DaGFyYWN0ZXIuZ2V0KG9iamVjdCk7aWYoIWNoYXJhY3Rlcil7aWYodGhpcy5fY2hhckNvZGU+PTB4RkZGRikKdGhyb3cgbmV3IEVycm9yKCdDaGFyYWN0ZXJJZE1hcCByYW4gb3V0IG9mIGNhcGFjaXR5IScpO2NoYXJhY3Rlcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX2NoYXJDb2RlKyspO3RoaXMuX2VsZW1lbnRUb0NoYXJhY3Rlci5zZXQob2JqZWN0LGNoYXJhY3Rlcik7dGhpcy5fY2hhcmFjdGVyVG9FbGVtZW50LnNldChjaGFyYWN0ZXIsb2JqZWN0KTt9CnJldHVybiBjaGFyYWN0ZXI7fQpmcm9tQ2hhcihjaGFyYWN0ZXIpe2NvbnN0IG9iamVjdD10aGlzLl9jaGFyYWN0ZXJUb0VsZW1lbnQuZ2V0KGNoYXJhY3Rlcik7aWYob2JqZWN0PT09dW5kZWZpbmVkKQpyZXR1cm4gbnVsbDtyZXR1cm4gb2JqZWN0O319OztzZWxmWydIZWFwU25hcHNob3RXb3JrZXInXT1zZWxmWydIZWFwU25hcHNob3RXb3JrZXInXXx8e307SGVhcFNuYXBzaG90V29ya2VyLkFsbG9jYXRpb25Qcm9maWxlPWNsYXNze2NvbnN0cnVjdG9yKHByb2ZpbGUsbGl2ZU9iamVjdFN0YXRzKXt0aGlzLl9zdHJpbmdzPXByb2ZpbGUuc3RyaW5nczt0aGlzLl9saXZlT2JqZWN0U3RhdHM9bGl2ZU9iamVjdFN0YXRzO3RoaXMuX25leHROb2RlSWQ9MTt0aGlzLl9mdW5jdGlvbkluZm9zPVtdO3RoaXMuX2lkVG9Ob2RlPXt9O3RoaXMuX2lkVG9Ub3BEb3duTm9kZT17fTt0aGlzLl9jb2xsYXBzZWRUb3BOb2RlSWRUb0Z1bmN0aW9uSW5mbz17fTt0aGlzLl90cmFjZVRvcHM9bnVsbDt0aGlzLl9idWlsZEZ1bmN0aW9uQWxsb2NhdGlvbkluZm9zKHByb2ZpbGUpO3RoaXMuX3RyYWNlVHJlZT10aGlzLl9idWlsZEFsbG9jYXRpb25UcmVlKHByb2ZpbGUsbGl2ZU9iamVjdFN0YXRzKTt9Cl9idWlsZEZ1bmN0aW9uQWxsb2NhdGlvbkluZm9zKHByb2ZpbGUpe2NvbnN0IHN0cmluZ3M9dGhpcy5fc3RyaW5ncztjb25zdCBmdW5jdGlvbkluZm9GaWVsZHM9cHJvZmlsZS5zbmFwc2hvdC5tZXRhLnRyYWNlX2Z1bmN0aW9uX2luZm9fZmllbGRzO2NvbnN0IGZ1bmN0aW9uTmFtZU9mZnNldD1mdW5jdGlvbkluZm9GaWVsZHMuaW5kZXhPZignbmFtZScpO2NvbnN0IHNjcmlwdE5hbWVPZmZzZXQ9ZnVuY3Rpb25JbmZvRmllbGRzLmluZGV4T2YoJ3NjcmlwdF9uYW1lJyk7Y29uc3Qgc2NyaXB0SWRPZmZzZXQ9ZnVuY3Rpb25JbmZvRmllbGRzLmluZGV4T2YoJ3NjcmlwdF9pZCcpO2NvbnN0IGxpbmVPZmZzZXQ9ZnVuY3Rpb25JbmZvRmllbGRzLmluZGV4T2YoJ2xpbmUnKTtjb25zdCBjb2x1bW5PZmZzZXQ9ZnVuY3Rpb25JbmZvRmllbGRzLmluZGV4T2YoJ2NvbHVtbicpO2NvbnN0IGZ1bmN0aW9uSW5mb0ZpZWxkQ291bnQ9ZnVuY3Rpb25JbmZvRmllbGRzLmxlbmd0aDtjb25zdCByYXdJbmZvcz1wcm9maWxlLnRyYWNlX2Z1bmN0aW9uX2luZm9zO2NvbnN0IGluZm9MZW5ndGg9cmF3SW5mb3MubGVuZ3RoO2NvbnN0IGZ1bmN0aW9uSW5mb3M9dGhpcy5fZnVuY3Rpb25JbmZvcz1uZXcgQXJyYXkoaW5mb0xlbmd0aC9mdW5jdGlvbkluZm9GaWVsZENvdW50KTtsZXQgaW5kZXg9MDtmb3IobGV0IGk9MDtpPGluZm9MZW5ndGg7aSs9ZnVuY3Rpb25JbmZvRmllbGRDb3VudCl7ZnVuY3Rpb25JbmZvc1tpbmRleCsrXT1uZXcgSGVhcFNuYXBzaG90V29ya2VyLkZ1bmN0aW9uQWxsb2NhdGlvbkluZm8oc3RyaW5nc1tyYXdJbmZvc1tpK2Z1bmN0aW9uTmFtZU9mZnNldF1dLHN0cmluZ3NbcmF3SW5mb3NbaStzY3JpcHROYW1lT2Zmc2V0XV0scmF3SW5mb3NbaStzY3JpcHRJZE9mZnNldF0scmF3SW5mb3NbaStsaW5lT2Zmc2V0XSxyYXdJbmZvc1tpK2NvbHVtbk9mZnNldF0pO319Cl9idWlsZEFsbG9jYXRpb25UcmVlKHByb2ZpbGUsbGl2ZU9iamVjdFN0YXRzKXtjb25zdCB0cmFjZVRyZWVSYXc9cHJvZmlsZS50cmFjZV90cmVlO2NvbnN0IGZ1bmN0aW9uSW5mb3M9dGhpcy5fZnVuY3Rpb25JbmZvcztjb25zdCBpZFRvVG9wRG93bk5vZGU9dGhpcy5faWRUb1RvcERvd25Ob2RlO2NvbnN0IHRyYWNlTm9kZUZpZWxkcz1wcm9maWxlLnNuYXBzaG90Lm1ldGEudHJhY2Vfbm9kZV9maWVsZHM7Y29uc3Qgbm9kZUlkT2Zmc2V0PXRyYWNlTm9kZUZpZWxkcy5pbmRleE9mKCdpZCcpO2NvbnN0IGZ1bmN0aW9uSW5mb0luZGV4T2Zmc2V0PXRyYWNlTm9kZUZpZWxkcy5pbmRleE9mKCdmdW5jdGlvbl9pbmZvX2luZGV4Jyk7Y29uc3QgYWxsb2NhdGlvbkNvdW50T2Zmc2V0PXRyYWNlTm9kZUZpZWxkcy5pbmRleE9mKCdjb3VudCcpO2NvbnN0IGFsbG9jYXRpb25TaXplT2Zmc2V0PXRyYWNlTm9kZUZpZWxkcy5pbmRleE9mKCdzaXplJyk7Y29uc3QgY2hpbGRyZW5PZmZzZXQ9dHJhY2VOb2RlRmllbGRzLmluZGV4T2YoJ2NoaWxkcmVuJyk7Y29uc3Qgbm9kZUZpZWxkQ291bnQ9dHJhY2VOb2RlRmllbGRzLmxlbmd0aDtmdW5jdGlvbiB0cmF2ZXJzZU5vZGUocmF3Tm9kZUFycmF5LG5vZGVPZmZzZXQscGFyZW50KXtjb25zdCBmdW5jdGlvbkluZm89ZnVuY3Rpb25JbmZvc1tyYXdOb2RlQXJyYXlbbm9kZU9mZnNldCtmdW5jdGlvbkluZm9JbmRleE9mZnNldF1dO2NvbnN0IGlkPXJhd05vZGVBcnJheVtub2RlT2Zmc2V0K25vZGVJZE9mZnNldF07Y29uc3Qgc3RhdHM9bGl2ZU9iamVjdFN0YXRzW2lkXTtjb25zdCBsaXZlQ291bnQ9c3RhdHM/c3RhdHMuY291bnQ6MDtjb25zdCBsaXZlU2l6ZT1zdGF0cz9zdGF0cy5zaXplOjA7Y29uc3QgcmVzdWx0PW5ldyBIZWFwU25hcHNob3RXb3JrZXIuVG9wRG93bkFsbG9jYXRpb25Ob2RlKGlkLGZ1bmN0aW9uSW5mbyxyYXdOb2RlQXJyYXlbbm9kZU9mZnNldCthbGxvY2F0aW9uQ291bnRPZmZzZXRdLHJhd05vZGVBcnJheVtub2RlT2Zmc2V0K2FsbG9jYXRpb25TaXplT2Zmc2V0XSxsaXZlQ291bnQsbGl2ZVNpemUscGFyZW50KTtpZFRvVG9wRG93bk5vZGVbaWRdPXJlc3VsdDtmdW5jdGlvbkluZm8uYWRkVHJhY2VUb3BOb2RlKHJlc3VsdCk7Y29uc3QgcmF3Q2hpbGRyZW49cmF3Tm9kZUFycmF5W25vZGVPZmZzZXQrY2hpbGRyZW5PZmZzZXRdO2ZvcihsZXQgaT0wO2k8cmF3Q2hpbGRyZW4ubGVuZ3RoO2krPW5vZGVGaWVsZENvdW50KQpyZXN1bHQuY2hpbGRyZW4ucHVzaCh0cmF2ZXJzZU5vZGUocmF3Q2hpbGRyZW4saSxyZXN1bHQpKTtyZXR1cm4gcmVzdWx0O30KcmV0dXJuIHRyYXZlcnNlTm9kZSh0cmFjZVRyZWVSYXcsMCxudWxsKTt9CnNlcmlhbGl6ZVRyYWNlVG9wcygpe2lmKHRoaXMuX3RyYWNlVG9wcykKcmV0dXJuIHRoaXMuX3RyYWNlVG9wcztjb25zdCByZXN1bHQ9dGhpcy5fdHJhY2VUb3BzPVtdO2NvbnN0IGZ1bmN0aW9uSW5mb3M9dGhpcy5fZnVuY3Rpb25JbmZvcztmb3IobGV0IGk9MDtpPGZ1bmN0aW9uSW5mb3MubGVuZ3RoO2krKyl7Y29uc3QgaW5mbz1mdW5jdGlvbkluZm9zW2ldO2lmKGluZm8udG90YWxDb3VudD09PTApCmNvbnRpbnVlO2NvbnN0IG5vZGVJZD10aGlzLl9uZXh0Tm9kZUlkKys7Y29uc3QgaXNSb290PWk9PT0wO3Jlc3VsdC5wdXNoKHRoaXMuX3NlcmlhbGl6ZU5vZGUobm9kZUlkLGluZm8saW5mby50b3RhbENvdW50LGluZm8udG90YWxTaXplLGluZm8udG90YWxMaXZlQ291bnQsaW5mby50b3RhbExpdmVTaXplLCFpc1Jvb3QpKTt0aGlzLl9jb2xsYXBzZWRUb3BOb2RlSWRUb0Z1bmN0aW9uSW5mb1tub2RlSWRdPWluZm87fQpyZXN1bHQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiLnNpemUtYS5zaXplO30pO3JldHVybiByZXN1bHQ7fQpzZXJpYWxpemVDYWxsZXJzKG5vZGVJZCl7bGV0IG5vZGU9dGhpcy5fZW5zdXJlQm90dG9tVXBOb2RlKG5vZGVJZCk7Y29uc3Qgbm9kZXNXaXRoU2luZ2xlQ2FsbGVyPVtdO3doaWxlKG5vZGUuY2FsbGVycygpLmxlbmd0aD09PTEpe25vZGU9bm9kZS5jYWxsZXJzKClbMF07bm9kZXNXaXRoU2luZ2xlQ2FsbGVyLnB1c2godGhpcy5fc2VyaWFsaXplQ2FsbGVyKG5vZGUpKTt9CmNvbnN0IGJyYW5jaGluZ0NhbGxlcnM9W107Y29uc3QgY2FsbGVycz1ub2RlLmNhbGxlcnMoKTtmb3IobGV0IGk9MDtpPGNhbGxlcnMubGVuZ3RoO2krKykKYnJhbmNoaW5nQ2FsbGVycy5wdXNoKHRoaXMuX3NlcmlhbGl6ZUNhbGxlcihjYWxsZXJzW2ldKSk7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RNb2RlbC5BbGxvY2F0aW9uTm9kZUNhbGxlcnMobm9kZXNXaXRoU2luZ2xlQ2FsbGVyLGJyYW5jaGluZ0NhbGxlcnMpO30Kc2VyaWFsaXplQWxsb2NhdGlvblN0YWNrKHRyYWNlTm9kZUlkKXtsZXQgbm9kZT10aGlzLl9pZFRvVG9wRG93bk5vZGVbdHJhY2VOb2RlSWRdO2NvbnN0IHJlc3VsdD1bXTt3aGlsZShub2RlKXtjb25zdCBmdW5jdGlvbkluZm89bm9kZS5mdW5jdGlvbkluZm87cmVzdWx0LnB1c2gobmV3IEhlYXBTbmFwc2hvdE1vZGVsLkFsbG9jYXRpb25TdGFja0ZyYW1lKGZ1bmN0aW9uSW5mby5mdW5jdGlvbk5hbWUsZnVuY3Rpb25JbmZvLnNjcmlwdE5hbWUsZnVuY3Rpb25JbmZvLnNjcmlwdElkLGZ1bmN0aW9uSW5mby5saW5lLGZ1bmN0aW9uSW5mby5jb2x1bW4pKTtub2RlPW5vZGUucGFyZW50O30KcmV0dXJuIHJlc3VsdDt9CnRyYWNlSWRzKGFsbG9jYXRpb25Ob2RlSWQpe3JldHVybiB0aGlzLl9lbnN1cmVCb3R0b21VcE5vZGUoYWxsb2NhdGlvbk5vZGVJZCkudHJhY2VUb3BJZHM7fQpfZW5zdXJlQm90dG9tVXBOb2RlKG5vZGVJZCl7bGV0IG5vZGU9dGhpcy5faWRUb05vZGVbbm9kZUlkXTtpZighbm9kZSl7Y29uc3QgZnVuY3Rpb25JbmZvPXRoaXMuX2NvbGxhcHNlZFRvcE5vZGVJZFRvRnVuY3Rpb25JbmZvW25vZGVJZF07bm9kZT1mdW5jdGlvbkluZm8uYm90dG9tVXBSb290KCk7ZGVsZXRlIHRoaXMuX2NvbGxhcHNlZFRvcE5vZGVJZFRvRnVuY3Rpb25JbmZvW25vZGVJZF07dGhpcy5faWRUb05vZGVbbm9kZUlkXT1ub2RlO30KcmV0dXJuIG5vZGU7fQpfc2VyaWFsaXplQ2FsbGVyKG5vZGUpe2NvbnN0IGNhbGxlcklkPXRoaXMuX25leHROb2RlSWQrKzt0aGlzLl9pZFRvTm9kZVtjYWxsZXJJZF09bm9kZTtyZXR1cm4gdGhpcy5fc2VyaWFsaXplTm9kZShjYWxsZXJJZCxub2RlLmZ1bmN0aW9uSW5mbyxub2RlLmFsbG9jYXRpb25Db3VudCxub2RlLmFsbG9jYXRpb25TaXplLG5vZGUubGl2ZUNvdW50LG5vZGUubGl2ZVNpemUsbm9kZS5oYXNDYWxsZXJzKCkpO30KX3NlcmlhbGl6ZU5vZGUobm9kZUlkLGZ1bmN0aW9uSW5mbyxjb3VudCxzaXplLGxpdmVDb3VudCxsaXZlU2l6ZSxoYXNDaGlsZHJlbil7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RNb2RlbC5TZXJpYWxpemVkQWxsb2NhdGlvbk5vZGUobm9kZUlkLGZ1bmN0aW9uSW5mby5mdW5jdGlvbk5hbWUsZnVuY3Rpb25JbmZvLnNjcmlwdE5hbWUsZnVuY3Rpb25JbmZvLnNjcmlwdElkLGZ1bmN0aW9uSW5mby5saW5lLGZ1bmN0aW9uSW5mby5jb2x1bW4sY291bnQsc2l6ZSxsaXZlQ291bnQsbGl2ZVNpemUsaGFzQ2hpbGRyZW4pO319O0hlYXBTbmFwc2hvdFdvcmtlci5Ub3BEb3duQWxsb2NhdGlvbk5vZGU9Y2xhc3N7Y29uc3RydWN0b3IoaWQsZnVuY3Rpb25JbmZvLGNvdW50LHNpemUsbGl2ZUNvdW50LGxpdmVTaXplLHBhcmVudCl7dGhpcy5pZD1pZDt0aGlzLmZ1bmN0aW9uSW5mbz1mdW5jdGlvbkluZm87dGhpcy5hbGxvY2F0aW9uQ291bnQ9Y291bnQ7dGhpcy5hbGxvY2F0aW9uU2l6ZT1zaXplO3RoaXMubGl2ZUNvdW50PWxpdmVDb3VudDt0aGlzLmxpdmVTaXplPWxpdmVTaXplO3RoaXMucGFyZW50PXBhcmVudDt0aGlzLmNoaWxkcmVuPVtdO319O0hlYXBTbmFwc2hvdFdvcmtlci5Cb3R0b21VcEFsbG9jYXRpb25Ob2RlPWNsYXNze2NvbnN0cnVjdG9yKGZ1bmN0aW9uSW5mbyl7dGhpcy5mdW5jdGlvbkluZm89ZnVuY3Rpb25JbmZvO3RoaXMuYWxsb2NhdGlvbkNvdW50PTA7dGhpcy5hbGxvY2F0aW9uU2l6ZT0wO3RoaXMubGl2ZUNvdW50PTA7dGhpcy5saXZlU2l6ZT0wO3RoaXMudHJhY2VUb3BJZHM9W107dGhpcy5fY2FsbGVycz1bXTt9CmFkZENhbGxlcih0cmFjZU5vZGUpe2NvbnN0IGZ1bmN0aW9uSW5mbz10cmFjZU5vZGUuZnVuY3Rpb25JbmZvO2xldCByZXN1bHQ7Zm9yKGxldCBpPTA7aTx0aGlzLl9jYWxsZXJzLmxlbmd0aDtpKyspe2NvbnN0IGNhbGxlcj10aGlzLl9jYWxsZXJzW2ldO2lmKGNhbGxlci5mdW5jdGlvbkluZm89PT1mdW5jdGlvbkluZm8pe3Jlc3VsdD1jYWxsZXI7YnJlYWs7fX0KaWYoIXJlc3VsdCl7cmVzdWx0PW5ldyBIZWFwU25hcHNob3RXb3JrZXIuQm90dG9tVXBBbGxvY2F0aW9uTm9kZShmdW5jdGlvbkluZm8pO3RoaXMuX2NhbGxlcnMucHVzaChyZXN1bHQpO30KcmV0dXJuIHJlc3VsdDt9CmNhbGxlcnMoKXtyZXR1cm4gdGhpcy5fY2FsbGVyczt9Cmhhc0NhbGxlcnMoKXtyZXR1cm4gdGhpcy5fY2FsbGVycy5sZW5ndGg+MDt9fTtIZWFwU25hcHNob3RXb3JrZXIuRnVuY3Rpb25BbGxvY2F0aW9uSW5mbz1jbGFzc3tjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWUsc2NyaXB0TmFtZSxzY3JpcHRJZCxsaW5lLGNvbHVtbil7dGhpcy5mdW5jdGlvbk5hbWU9ZnVuY3Rpb25OYW1lO3RoaXMuc2NyaXB0TmFtZT1zY3JpcHROYW1lO3RoaXMuc2NyaXB0SWQ9c2NyaXB0SWQ7dGhpcy5saW5lPWxpbmU7dGhpcy5jb2x1bW49Y29sdW1uO3RoaXMudG90YWxDb3VudD0wO3RoaXMudG90YWxTaXplPTA7dGhpcy50b3RhbExpdmVDb3VudD0wO3RoaXMudG90YWxMaXZlU2l6ZT0wO3RoaXMuX3RyYWNlVG9wcz1bXTt9CmFkZFRyYWNlVG9wTm9kZShub2RlKXtpZihub2RlLmFsbG9jYXRpb25Db3VudD09PTApCnJldHVybjt0aGlzLl90cmFjZVRvcHMucHVzaChub2RlKTt0aGlzLnRvdGFsQ291bnQrPW5vZGUuYWxsb2NhdGlvbkNvdW50O3RoaXMudG90YWxTaXplKz1ub2RlLmFsbG9jYXRpb25TaXplO3RoaXMudG90YWxMaXZlQ291bnQrPW5vZGUubGl2ZUNvdW50O3RoaXMudG90YWxMaXZlU2l6ZSs9bm9kZS5saXZlU2l6ZTt9CmJvdHRvbVVwUm9vdCgpe2lmKCF0aGlzLl90cmFjZVRvcHMubGVuZ3RoKQpyZXR1cm4gbnVsbDtpZighdGhpcy5fYm90dG9tVXBUcmVlKQp0aGlzLl9idWlsZEFsbG9jYXRpb25UcmFjZVRyZWUoKTtyZXR1cm4gdGhpcy5fYm90dG9tVXBUcmVlO30KX2J1aWxkQWxsb2NhdGlvblRyYWNlVHJlZSgpe3RoaXMuX2JvdHRvbVVwVHJlZT1uZXcgSGVhcFNuYXBzaG90V29ya2VyLkJvdHRvbVVwQWxsb2NhdGlvbk5vZGUodGhpcyk7Zm9yKGxldCBpPTA7aTx0aGlzLl90cmFjZVRvcHMubGVuZ3RoO2krKyl7bGV0IG5vZGU9dGhpcy5fdHJhY2VUb3BzW2ldO2xldCBib3R0b21VcE5vZGU9dGhpcy5fYm90dG9tVXBUcmVlO2NvbnN0IGNvdW50PW5vZGUuYWxsb2NhdGlvbkNvdW50O2NvbnN0IHNpemU9bm9kZS5hbGxvY2F0aW9uU2l6ZTtjb25zdCBsaXZlQ291bnQ9bm9kZS5saXZlQ291bnQ7Y29uc3QgbGl2ZVNpemU9bm9kZS5saXZlU2l6ZTtjb25zdCB0cmFjZUlkPW5vZGUuaWQ7d2hpbGUodHJ1ZSl7Ym90dG9tVXBOb2RlLmFsbG9jYXRpb25Db3VudCs9Y291bnQ7Ym90dG9tVXBOb2RlLmFsbG9jYXRpb25TaXplKz1zaXplO2JvdHRvbVVwTm9kZS5saXZlQ291bnQrPWxpdmVDb3VudDtib3R0b21VcE5vZGUubGl2ZVNpemUrPWxpdmVTaXplO2JvdHRvbVVwTm9kZS50cmFjZVRvcElkcy5wdXNoKHRyYWNlSWQpO25vZGU9bm9kZS5wYXJlbnQ7aWYobm9kZT09PW51bGwpCmJyZWFrO2JvdHRvbVVwTm9kZT1ib3R0b21VcE5vZGUuYWRkQ2FsbGVyKG5vZGUpO319fX07O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RJdGVtPWZ1bmN0aW9uKCl7fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbS5wcm90b3R5cGU9e2l0ZW1JbmRleCgpe30sc2VyaWFsaXplKCl7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2U9Y2xhc3N7Y29uc3RydWN0b3Ioc25hcHNob3QsZWRnZUluZGV4KXt0aGlzLl9zbmFwc2hvdD1zbmFwc2hvdDt0aGlzLl9lZGdlcz1zbmFwc2hvdC5jb250YWlubWVudEVkZ2VzO3RoaXMuZWRnZUluZGV4PWVkZ2VJbmRleHx8MDt9CmNsb25lKCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90RWRnZSh0aGlzLl9zbmFwc2hvdCx0aGlzLmVkZ2VJbmRleCk7fQpoYXNTdHJpbmdOYW1lKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9Cm5hbWUoKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30Kbm9kZSgpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5jcmVhdGVOb2RlKHRoaXMubm9kZUluZGV4KCkpO30Kbm9kZUluZGV4KCl7cmV0dXJuIHRoaXMuX2VkZ2VzW3RoaXMuZWRnZUluZGV4K3RoaXMuX3NuYXBzaG90Ll9lZGdlVG9Ob2RlT2Zmc2V0XTt9CnRvU3RyaW5nKCl7cmV0dXJuJ0hlYXBTbmFwc2hvdEVkZ2U6ICcrdGhpcy5uYW1lKCk7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3NuYXBzaG90Ll9lZGdlVHlwZXNbdGhpcy5yYXdUeXBlKCldO30KaXRlbUluZGV4KCl7cmV0dXJuIHRoaXMuZWRnZUluZGV4O30Kc2VyaWFsaXplKCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RNb2RlbC5FZGdlKHRoaXMubmFtZSgpLHRoaXMubm9kZSgpLnNlcmlhbGl6ZSgpLHRoaXMudHlwZSgpLHRoaXMuZWRnZUluZGV4KTt9CnJhd1R5cGUoKXtyZXR1cm4gdGhpcy5fZWRnZXNbdGhpcy5lZGdlSW5kZXgrdGhpcy5fc25hcHNob3QuX2VkZ2VUeXBlT2Zmc2V0XTt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbUl0ZXJhdG9yPWZ1bmN0aW9uKCl7fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbUl0ZXJhdG9yLnByb3RvdHlwZT17aGFzTmV4dCgpe30saXRlbSgpe30sbmV4dCgpe319O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RJdGVtSW5kZXhQcm92aWRlcj1mdW5jdGlvbigpe307SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEl0ZW1JbmRleFByb3ZpZGVyLnByb3RvdHlwZT17aXRlbUZvckluZGV4KG5ld0luZGV4KXt9LH07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdE5vZGVJbmRleFByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKHNuYXBzaG90KXt0aGlzLl9ub2RlPXNuYXBzaG90LmNyZWF0ZU5vZGUoKTt9Cml0ZW1Gb3JJbmRleChpbmRleCl7dGhpcy5fbm9kZS5ub2RlSW5kZXg9aW5kZXg7cmV0dXJuIHRoaXMuX25vZGU7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2VJbmRleFByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKHNuYXBzaG90KXt0aGlzLl9lZGdlPXNuYXBzaG90LmNyZWF0ZUVkZ2UoMCk7fQppdGVtRm9ySW5kZXgoaW5kZXgpe3RoaXMuX2VkZ2UuZWRnZUluZGV4PWluZGV4O3JldHVybiB0aGlzLl9lZGdlO319O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RSZXRhaW5lckVkZ2VJbmRleFByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKHNuYXBzaG90KXt0aGlzLl9yZXRhaW5lckVkZ2U9c25hcHNob3QuY3JlYXRlUmV0YWluaW5nRWRnZSgwKTt9Cml0ZW1Gb3JJbmRleChpbmRleCl7dGhpcy5fcmV0YWluZXJFZGdlLnNldFJldGFpbmVySW5kZXgoaW5kZXgpO3JldHVybiB0aGlzLl9yZXRhaW5lckVkZ2U7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2VJdGVyYXRvcj1jbGFzc3tjb25zdHJ1Y3Rvcihub2RlKXt0aGlzLl9zb3VyY2VOb2RlPW5vZGU7dGhpcy5lZGdlPW5vZGUuX3NuYXBzaG90LmNyZWF0ZUVkZ2Uobm9kZS5lZGdlSW5kZXhlc1N0YXJ0KCkpO30KaGFzTmV4dCgpe3JldHVybiB0aGlzLmVkZ2UuZWRnZUluZGV4PHRoaXMuX3NvdXJjZU5vZGUuZWRnZUluZGV4ZXNFbmQoKTt9Cml0ZW0oKXtyZXR1cm4gdGhpcy5lZGdlO30KbmV4dCgpe3RoaXMuZWRnZS5lZGdlSW5kZXgrPXRoaXMuZWRnZS5fc25hcHNob3QuX2VkZ2VGaWVsZHNDb3VudDt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlPWNsYXNze2NvbnN0cnVjdG9yKHNuYXBzaG90LHJldGFpbmVySW5kZXgpe3RoaXMuX3NuYXBzaG90PXNuYXBzaG90O3RoaXMuc2V0UmV0YWluZXJJbmRleChyZXRhaW5lckluZGV4KTt9CmNsb25lKCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlKHRoaXMuX3NuYXBzaG90LHRoaXMucmV0YWluZXJJbmRleCgpKTt9Cmhhc1N0cmluZ05hbWUoKXtyZXR1cm4gdGhpcy5fZWRnZSgpLmhhc1N0cmluZ05hbWUoKTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fZWRnZSgpLm5hbWUoKTt9Cm5vZGUoKXtyZXR1cm4gdGhpcy5fbm9kZSgpO30Kbm9kZUluZGV4KCl7cmV0dXJuIHRoaXMuX3JldGFpbmluZ05vZGVJbmRleDt9CnJldGFpbmVySW5kZXgoKXtyZXR1cm4gdGhpcy5fcmV0YWluZXJJbmRleDt9CnNldFJldGFpbmVySW5kZXgocmV0YWluZXJJbmRleCl7aWYocmV0YWluZXJJbmRleD09PXRoaXMuX3JldGFpbmVySW5kZXgpCnJldHVybjt0aGlzLl9yZXRhaW5lckluZGV4PXJldGFpbmVySW5kZXg7dGhpcy5fZ2xvYmFsRWRnZUluZGV4PXRoaXMuX3NuYXBzaG90Ll9yZXRhaW5pbmdFZGdlc1tyZXRhaW5lckluZGV4XTt0aGlzLl9yZXRhaW5pbmdOb2RlSW5kZXg9dGhpcy5fc25hcHNob3QuX3JldGFpbmluZ05vZGVzW3JldGFpbmVySW5kZXhdO3RoaXMuX2VkZ2VJbnN0YW5jZT1udWxsO3RoaXMuX25vZGVJbnN0YW5jZT1udWxsO30Kc2V0IGVkZ2VJbmRleChlZGdlSW5kZXgpe3RoaXMuc2V0UmV0YWluZXJJbmRleChlZGdlSW5kZXgpO30KX25vZGUoKXtpZighdGhpcy5fbm9kZUluc3RhbmNlKQp0aGlzLl9ub2RlSW5zdGFuY2U9dGhpcy5fc25hcHNob3QuY3JlYXRlTm9kZSh0aGlzLl9yZXRhaW5pbmdOb2RlSW5kZXgpO3JldHVybiB0aGlzLl9ub2RlSW5zdGFuY2U7fQpfZWRnZSgpe2lmKCF0aGlzLl9lZGdlSW5zdGFuY2UpCnRoaXMuX2VkZ2VJbnN0YW5jZT10aGlzLl9zbmFwc2hvdC5jcmVhdGVFZGdlKHRoaXMuX2dsb2JhbEVkZ2VJbmRleCk7cmV0dXJuIHRoaXMuX2VkZ2VJbnN0YW5jZTt9CnRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX2VkZ2UoKS50b1N0cmluZygpO30KaXRlbUluZGV4KCl7cmV0dXJuIHRoaXMuX3JldGFpbmVySW5kZXg7fQpzZXJpYWxpemUoKXtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdE1vZGVsLkVkZ2UodGhpcy5uYW1lKCksdGhpcy5ub2RlKCkuc2VyaWFsaXplKCksdGhpcy50eXBlKCksdGhpcy5fZ2xvYmFsRWRnZUluZGV4KTt9CnR5cGUoKXtyZXR1cm4gdGhpcy5fZWRnZSgpLnR5cGUoKTt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlSXRlcmF0b3I9Y2xhc3N7Y29uc3RydWN0b3IocmV0YWluZWROb2RlKXtjb25zdCBzbmFwc2hvdD1yZXRhaW5lZE5vZGUuX3NuYXBzaG90O2NvbnN0IHJldGFpbmVkTm9kZU9yZGluYWw9cmV0YWluZWROb2RlLm9yZGluYWwoKTtjb25zdCByZXRhaW5lckluZGV4PXNuYXBzaG90Ll9maXJzdFJldGFpbmVySW5kZXhbcmV0YWluZWROb2RlT3JkaW5hbF07dGhpcy5fcmV0YWluZXJzRW5kPXNuYXBzaG90Ll9maXJzdFJldGFpbmVySW5kZXhbcmV0YWluZWROb2RlT3JkaW5hbCsxXTt0aGlzLnJldGFpbmVyPXNuYXBzaG90LmNyZWF0ZVJldGFpbmluZ0VkZ2UocmV0YWluZXJJbmRleCk7fQpoYXNOZXh0KCl7cmV0dXJuIHRoaXMucmV0YWluZXIucmV0YWluZXJJbmRleCgpPHRoaXMuX3JldGFpbmVyc0VuZDt9Cml0ZW0oKXtyZXR1cm4gdGhpcy5yZXRhaW5lcjt9Cm5leHQoKXt0aGlzLnJldGFpbmVyLnNldFJldGFpbmVySW5kZXgodGhpcy5yZXRhaW5lci5yZXRhaW5lckluZGV4KCkrMSk7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdE5vZGU9Y2xhc3N7Y29uc3RydWN0b3Ioc25hcHNob3Qsbm9kZUluZGV4KXt0aGlzLl9zbmFwc2hvdD1zbmFwc2hvdDt0aGlzLm5vZGVJbmRleD1ub2RlSW5kZXh8fDA7fQpkaXN0YW5jZSgpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5fbm9kZURpc3RhbmNlc1t0aGlzLm5vZGVJbmRleC90aGlzLl9zbmFwc2hvdC5fbm9kZUZpZWxkQ291bnRdO30KY2xhc3NOYW1lKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9CmNsYXNzSW5kZXgoKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KZG9taW5hdG9ySW5kZXgoKXtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9zbmFwc2hvdC5fbm9kZUZpZWxkQ291bnQ7cmV0dXJuIHRoaXMuX3NuYXBzaG90Ll9kb21pbmF0b3JzVHJlZVt0aGlzLm5vZGVJbmRleC90aGlzLl9zbmFwc2hvdC5fbm9kZUZpZWxkQ291bnRdKm5vZGVGaWVsZENvdW50O30KZWRnZXMoKXtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RFZGdlSXRlcmF0b3IodGhpcyk7fQplZGdlc0NvdW50KCl7cmV0dXJuKHRoaXMuZWRnZUluZGV4ZXNFbmQoKS10aGlzLmVkZ2VJbmRleGVzU3RhcnQoKSkvdGhpcy5fc25hcHNob3QuX2VkZ2VGaWVsZHNDb3VudDt9CmlkKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9CmlzUm9vdCgpe3JldHVybiB0aGlzLm5vZGVJbmRleD09PXRoaXMuX3NuYXBzaG90Ll9yb290Tm9kZUluZGV4O30KbmFtZSgpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5zdHJpbmdzW3RoaXMuX25hbWUoKV07fQpyZXRhaW5lZFNpemUoKXtyZXR1cm4gdGhpcy5fc25hcHNob3QuX3JldGFpbmVkU2l6ZXNbdGhpcy5vcmRpbmFsKCldO30KcmV0YWluZXJzKCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlSXRlcmF0b3IodGhpcyk7fQpyZXRhaW5lcnNDb3VudCgpe2NvbnN0IHNuYXBzaG90PXRoaXMuX3NuYXBzaG90O2NvbnN0IG9yZGluYWw9dGhpcy5vcmRpbmFsKCk7cmV0dXJuIHNuYXBzaG90Ll9maXJzdFJldGFpbmVySW5kZXhbb3JkaW5hbCsxXS1zbmFwc2hvdC5fZmlyc3RSZXRhaW5lckluZGV4W29yZGluYWxdO30Kc2VsZlNpemUoKXtjb25zdCBzbmFwc2hvdD10aGlzLl9zbmFwc2hvdDtyZXR1cm4gc25hcHNob3Qubm9kZXNbdGhpcy5ub2RlSW5kZXgrc25hcHNob3QuX25vZGVTZWxmU2l6ZU9mZnNldF07fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3NuYXBzaG90Ll9ub2RlVHlwZXNbdGhpcy5yYXdUeXBlKCldO30KdHJhY2VOb2RlSWQoKXtjb25zdCBzbmFwc2hvdD10aGlzLl9zbmFwc2hvdDtyZXR1cm4gc25hcHNob3Qubm9kZXNbdGhpcy5ub2RlSW5kZXgrc25hcHNob3QuX25vZGVUcmFjZU5vZGVJZE9mZnNldF07fQppdGVtSW5kZXgoKXtyZXR1cm4gdGhpcy5ub2RlSW5kZXg7fQpzZXJpYWxpemUoKXtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdE1vZGVsLk5vZGUodGhpcy5pZCgpLHRoaXMubmFtZSgpLHRoaXMuZGlzdGFuY2UoKSx0aGlzLm5vZGVJbmRleCx0aGlzLnJldGFpbmVkU2l6ZSgpLHRoaXMuc2VsZlNpemUoKSx0aGlzLnR5cGUoKSk7fQpfbmFtZSgpe2NvbnN0IHNuYXBzaG90PXRoaXMuX3NuYXBzaG90O3JldHVybiBzbmFwc2hvdC5ub2Rlc1t0aGlzLm5vZGVJbmRleCtzbmFwc2hvdC5fbm9kZU5hbWVPZmZzZXRdO30KZWRnZUluZGV4ZXNTdGFydCgpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5fZmlyc3RFZGdlSW5kZXhlc1t0aGlzLm9yZGluYWwoKV07fQplZGdlSW5kZXhlc0VuZCgpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5fZmlyc3RFZGdlSW5kZXhlc1t0aGlzLm9yZGluYWwoKSsxXTt9Cm9yZGluYWwoKXtyZXR1cm4gdGhpcy5ub2RlSW5kZXgvdGhpcy5fc25hcHNob3QuX25vZGVGaWVsZENvdW50O30KX25leHROb2RlSW5kZXgoKXtyZXR1cm4gdGhpcy5ub2RlSW5kZXgrdGhpcy5fc25hcHNob3QuX25vZGVGaWVsZENvdW50O30KcmF3VHlwZSgpe2NvbnN0IHNuYXBzaG90PXRoaXMuX3NuYXBzaG90O3JldHVybiBzbmFwc2hvdC5ub2Rlc1t0aGlzLm5vZGVJbmRleCtzbmFwc2hvdC5fbm9kZVR5cGVPZmZzZXRdO319O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3ROb2RlSXRlcmF0b3I9Y2xhc3N7Y29uc3RydWN0b3Iobm9kZSl7dGhpcy5ub2RlPW5vZGU7dGhpcy5fbm9kZXNMZW5ndGg9bm9kZS5fc25hcHNob3Qubm9kZXMubGVuZ3RoO30KaGFzTmV4dCgpe3JldHVybiB0aGlzLm5vZGUubm9kZUluZGV4PHRoaXMuX25vZGVzTGVuZ3RoO30KaXRlbSgpe3JldHVybiB0aGlzLm5vZGU7fQpuZXh0KCl7dGhpcy5ub2RlLm5vZGVJbmRleD10aGlzLm5vZGUuX25leHROb2RlSW5kZXgoKTt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SW5kZXhSYW5nZUl0ZXJhdG9yPWNsYXNze2NvbnN0cnVjdG9yKGl0ZW1Qcm92aWRlcixpbmRleGVzKXt0aGlzLl9pdGVtUHJvdmlkZXI9aXRlbVByb3ZpZGVyO3RoaXMuX2luZGV4ZXM9aW5kZXhlczt0aGlzLl9wb3NpdGlvbj0wO30KaGFzTmV4dCgpe3JldHVybiB0aGlzLl9wb3NpdGlvbjx0aGlzLl9pbmRleGVzLmxlbmd0aDt9Cml0ZW0oKXtjb25zdCBpbmRleD10aGlzLl9pbmRleGVzW3RoaXMuX3Bvc2l0aW9uXTtyZXR1cm4gdGhpcy5faXRlbVByb3ZpZGVyLml0ZW1Gb3JJbmRleChpbmRleCk7fQpuZXh0KCl7Kyt0aGlzLl9wb3NpdGlvbjt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90RmlsdGVyZWRJdGVyYXRvcj1jbGFzc3tjb25zdHJ1Y3RvcihpdGVyYXRvcixmaWx0ZXIpe3RoaXMuX2l0ZXJhdG9yPWl0ZXJhdG9yO3RoaXMuX2ZpbHRlcj1maWx0ZXI7dGhpcy5fc2tpcEZpbHRlcmVkSXRlbXMoKTt9Cmhhc05leHQoKXtyZXR1cm4gdGhpcy5faXRlcmF0b3IuaGFzTmV4dCgpO30KaXRlbSgpe3JldHVybiB0aGlzLl9pdGVyYXRvci5pdGVtKCk7fQpuZXh0KCl7dGhpcy5faXRlcmF0b3IubmV4dCgpO3RoaXMuX3NraXBGaWx0ZXJlZEl0ZW1zKCk7fQpfc2tpcEZpbHRlcmVkSXRlbXMoKXt3aGlsZSh0aGlzLl9pdGVyYXRvci5oYXNOZXh0KCkmJiF0aGlzLl9maWx0ZXIodGhpcy5faXRlcmF0b3IuaXRlbSgpKSkKdGhpcy5faXRlcmF0b3IubmV4dCgpO319O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RQcm9ncmVzcz1jbGFzc3tjb25zdHJ1Y3RvcihkaXNwYXRjaGVyKXt0aGlzLl9kaXNwYXRjaGVyPWRpc3BhdGNoZXI7fQp1cGRhdGVTdGF0dXMoc3RhdHVzKXt0aGlzLl9zZW5kVXBkYXRlRXZlbnQoQ29tbW9uLlVJU3RyaW5nKHN0YXR1cykpO30KdXBkYXRlUHJvZ3Jlc3ModGl0bGUsdmFsdWUsdG90YWwpe2NvbnN0IHBlcmNlbnRWYWx1ZT0oKHRvdGFsPyh2YWx1ZS90b3RhbCk6MCkqMTAwKS50b0ZpeGVkKDApO3RoaXMuX3NlbmRVcGRhdGVFdmVudChDb21tb24uVUlTdHJpbmcodGl0bGUscGVyY2VudFZhbHVlKSk7fQpyZXBvcnRQcm9ibGVtKGVycm9yKXtpZih0aGlzLl9kaXNwYXRjaGVyKQp0aGlzLl9kaXNwYXRjaGVyLnNlbmRFdmVudChIZWFwU25hcHNob3RNb2RlbC5IZWFwU25hcHNob3RQcm9ncmVzc0V2ZW50LkJyb2tlblNuYXBzaG90LGVycm9yKTt9Cl9zZW5kVXBkYXRlRXZlbnQodGV4dCl7aWYodGhpcy5fZGlzcGF0Y2hlcikKdGhpcy5fZGlzcGF0Y2hlci5zZW5kRXZlbnQoSGVhcFNuYXBzaG90TW9kZWwuSGVhcFNuYXBzaG90UHJvZ3Jlc3NFdmVudC5VcGRhdGUsdGV4dCk7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdFByb2JsZW1SZXBvcnQ9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGUpe3RoaXMuX2Vycm9ycz1bdGl0bGVdO30KYWRkRXJyb3IoZXJyb3Ipe2lmKHRoaXMuX2Vycm9ycy5sZW5ndGg+MTAwKQpyZXR1cm47dGhpcy5fZXJyb3JzLnB1c2goZXJyb3IpO30KdG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5fZXJyb3JzLmpvaW4oJ1xuICAnKTt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90PWNsYXNze2NvbnN0cnVjdG9yKHByb2ZpbGUscHJvZ3Jlc3Mpe3RoaXMubm9kZXM9cHJvZmlsZS5ub2Rlczt0aGlzLmNvbnRhaW5tZW50RWRnZXM9cHJvZmlsZS5lZGdlczt0aGlzLl9tZXRhTm9kZT1wcm9maWxlLnNuYXBzaG90Lm1ldGE7dGhpcy5fcmF3U2FtcGxlcz1wcm9maWxlLnNhbXBsZXM7dGhpcy5fc2FtcGxlcz1udWxsO3RoaXMuc3RyaW5ncz1wcm9maWxlLnN0cmluZ3M7dGhpcy5fcHJvZ3Jlc3M9cHJvZ3Jlc3M7dGhpcy5fbm9EaXN0YW5jZT0tNTt0aGlzLl9yb290Tm9kZUluZGV4PTA7aWYocHJvZmlsZS5zbmFwc2hvdC5yb290X2luZGV4KQp0aGlzLl9yb290Tm9kZUluZGV4PXByb2ZpbGUuc25hcHNob3Qucm9vdF9pbmRleDt0aGlzLl9zbmFwc2hvdERpZmZzPXt9O3RoaXMuX2FnZ3JlZ2F0ZXNGb3JEaWZmPW51bGw7dGhpcy5fYWdncmVnYXRlcz17fTt0aGlzLl9hZ2dyZWdhdGVzU29ydGVkRmxhZ3M9e307dGhpcy5fcHJvZmlsZT1wcm9maWxlO30KaW5pdGlhbGl6ZSgpe2NvbnN0IG1ldGE9dGhpcy5fbWV0YU5vZGU7dGhpcy5fbm9kZVR5cGVPZmZzZXQ9bWV0YS5ub2RlX2ZpZWxkcy5pbmRleE9mKCd0eXBlJyk7dGhpcy5fbm9kZU5hbWVPZmZzZXQ9bWV0YS5ub2RlX2ZpZWxkcy5pbmRleE9mKCduYW1lJyk7dGhpcy5fbm9kZUlkT2Zmc2V0PW1ldGEubm9kZV9maWVsZHMuaW5kZXhPZignaWQnKTt0aGlzLl9ub2RlU2VsZlNpemVPZmZzZXQ9bWV0YS5ub2RlX2ZpZWxkcy5pbmRleE9mKCdzZWxmX3NpemUnKTt0aGlzLl9ub2RlRWRnZUNvdW50T2Zmc2V0PW1ldGEubm9kZV9maWVsZHMuaW5kZXhPZignZWRnZV9jb3VudCcpO3RoaXMuX25vZGVUcmFjZU5vZGVJZE9mZnNldD1tZXRhLm5vZGVfZmllbGRzLmluZGV4T2YoJ3RyYWNlX25vZGVfaWQnKTt0aGlzLl9ub2RlRmllbGRDb3VudD1tZXRhLm5vZGVfZmllbGRzLmxlbmd0aDt0aGlzLl9ub2RlVHlwZXM9bWV0YS5ub2RlX3R5cGVzW3RoaXMuX25vZGVUeXBlT2Zmc2V0XTt0aGlzLl9ub2RlQXJyYXlUeXBlPXRoaXMuX25vZGVUeXBlcy5pbmRleE9mKCdhcnJheScpO3RoaXMuX25vZGVIaWRkZW5UeXBlPXRoaXMuX25vZGVUeXBlcy5pbmRleE9mKCdoaWRkZW4nKTt0aGlzLl9ub2RlT2JqZWN0VHlwZT10aGlzLl9ub2RlVHlwZXMuaW5kZXhPZignb2JqZWN0Jyk7dGhpcy5fbm9kZU5hdGl2ZVR5cGU9dGhpcy5fbm9kZVR5cGVzLmluZGV4T2YoJ25hdGl2ZScpO3RoaXMuX25vZGVDb25zU3RyaW5nVHlwZT10aGlzLl9ub2RlVHlwZXMuaW5kZXhPZignY29uY2F0ZW5hdGVkIHN0cmluZycpO3RoaXMuX25vZGVTbGljZWRTdHJpbmdUeXBlPXRoaXMuX25vZGVUeXBlcy5pbmRleE9mKCdzbGljZWQgc3RyaW5nJyk7dGhpcy5fbm9kZUNvZGVUeXBlPXRoaXMuX25vZGVUeXBlcy5pbmRleE9mKCdjb2RlJyk7dGhpcy5fbm9kZVN5bnRoZXRpY1R5cGU9dGhpcy5fbm9kZVR5cGVzLmluZGV4T2YoJ3N5bnRoZXRpYycpO3RoaXMuX2VkZ2VGaWVsZHNDb3VudD1tZXRhLmVkZ2VfZmllbGRzLmxlbmd0aDt0aGlzLl9lZGdlVHlwZU9mZnNldD1tZXRhLmVkZ2VfZmllbGRzLmluZGV4T2YoJ3R5cGUnKTt0aGlzLl9lZGdlTmFtZU9mZnNldD1tZXRhLmVkZ2VfZmllbGRzLmluZGV4T2YoJ25hbWVfb3JfaW5kZXgnKTt0aGlzLl9lZGdlVG9Ob2RlT2Zmc2V0PW1ldGEuZWRnZV9maWVsZHMuaW5kZXhPZigndG9fbm9kZScpO3RoaXMuX2VkZ2VUeXBlcz1tZXRhLmVkZ2VfdHlwZXNbdGhpcy5fZWRnZVR5cGVPZmZzZXRdO3RoaXMuX2VkZ2VUeXBlcy5wdXNoKCdpbnZpc2libGUnKTt0aGlzLl9lZGdlRWxlbWVudFR5cGU9dGhpcy5fZWRnZVR5cGVzLmluZGV4T2YoJ2VsZW1lbnQnKTt0aGlzLl9lZGdlSGlkZGVuVHlwZT10aGlzLl9lZGdlVHlwZXMuaW5kZXhPZignaGlkZGVuJyk7dGhpcy5fZWRnZUludGVybmFsVHlwZT10aGlzLl9lZGdlVHlwZXMuaW5kZXhPZignaW50ZXJuYWwnKTt0aGlzLl9lZGdlU2hvcnRjdXRUeXBlPXRoaXMuX2VkZ2VUeXBlcy5pbmRleE9mKCdzaG9ydGN1dCcpO3RoaXMuX2VkZ2VXZWFrVHlwZT10aGlzLl9lZGdlVHlwZXMuaW5kZXhPZignd2VhaycpO3RoaXMuX2VkZ2VJbnZpc2libGVUeXBlPXRoaXMuX2VkZ2VUeXBlcy5pbmRleE9mKCdpbnZpc2libGUnKTt0aGlzLm5vZGVDb3VudD10aGlzLm5vZGVzLmxlbmd0aC90aGlzLl9ub2RlRmllbGRDb3VudDt0aGlzLl9lZGdlQ291bnQ9dGhpcy5jb250YWlubWVudEVkZ2VzLmxlbmd0aC90aGlzLl9lZGdlRmllbGRzQ291bnQ7dGhpcy5fcmV0YWluZWRTaXplcz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMubm9kZUNvdW50KTt0aGlzLl9maXJzdEVkZ2VJbmRleGVzPW5ldyBVaW50MzJBcnJheSh0aGlzLm5vZGVDb3VudCsxKTt0aGlzLl9yZXRhaW5pbmdOb2Rlcz1uZXcgVWludDMyQXJyYXkodGhpcy5fZWRnZUNvdW50KTt0aGlzLl9yZXRhaW5pbmdFZGdlcz1uZXcgVWludDMyQXJyYXkodGhpcy5fZWRnZUNvdW50KTt0aGlzLl9maXJzdFJldGFpbmVySW5kZXg9bmV3IFVpbnQzMkFycmF5KHRoaXMubm9kZUNvdW50KzEpO3RoaXMuX25vZGVEaXN0YW5jZXM9bmV3IEludDMyQXJyYXkodGhpcy5ub2RlQ291bnQpO3RoaXMuX2ZpcnN0RG9taW5hdGVkTm9kZUluZGV4PW5ldyBVaW50MzJBcnJheSh0aGlzLm5vZGVDb3VudCsxKTt0aGlzLl9kb21pbmF0ZWROb2Rlcz1uZXcgVWludDMyQXJyYXkodGhpcy5ub2RlQ291bnQtMSk7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdCdWlsZGluZyBlZGdlIGluZGV4ZXNcdTIwMjYnKTt0aGlzLl9idWlsZEVkZ2VJbmRleGVzKCk7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdCdWlsZGluZyByZXRhaW5lcnNcdTIwMjYnKTt0aGlzLl9idWlsZFJldGFpbmVycygpO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVN0YXR1cygnQ2FsY3VsYXRpbmcgbm9kZSBmbGFnc1x1MjAyNicpO3RoaXMuY2FsY3VsYXRlRmxhZ3MoKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0NhbGN1bGF0aW5nIGRpc3RhbmNlc1x1MjAyNicpO3RoaXMuY2FsY3VsYXRlRGlzdGFuY2VzKCk7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdCdWlsZGluZyBwb3N0b3JkZXIgaW5kZXhcdTIwMjYnKTtjb25zdCByZXN1bHQ9dGhpcy5fYnVpbGRQb3N0T3JkZXJJbmRleCgpO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVN0YXR1cygnQnVpbGRpbmcgZG9taW5hdG9yIHRyZWVcdTIwMjYnKTt0aGlzLl9kb21pbmF0b3JzVHJlZT10aGlzLl9idWlsZERvbWluYXRvclRyZWUocmVzdWx0LnBvc3RPcmRlckluZGV4Mk5vZGVPcmRpbmFsLHJlc3VsdC5ub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleCk7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdDYWxjdWxhdGluZyByZXRhaW5lZCBzaXplc1x1MjAyNicpO3RoaXMuX2NhbGN1bGF0ZVJldGFpbmVkU2l6ZXMocmVzdWx0LnBvc3RPcmRlckluZGV4Mk5vZGVPcmRpbmFsKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0J1aWxkaW5nIGRvbWluYXRlZCBub2Rlc1x1MjAyNicpO3RoaXMuX2J1aWxkRG9taW5hdGVkTm9kZXMoKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0NhbGN1bGF0aW5nIHN0YXRpc3RpY3NcdTIwMjYnKTt0aGlzLmNhbGN1bGF0ZVN0YXRpc3RpY3MoKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0NhbGN1bGF0aW5nIHNhbXBsZXNcdTIwMjYnKTt0aGlzLl9idWlsZFNhbXBsZXMoKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0ZpbmlzaGVkIHByb2Nlc3NpbmcuJyk7aWYodGhpcy5fcHJvZmlsZS5zbmFwc2hvdC50cmFjZV9mdW5jdGlvbl9jb3VudCl7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdCdWlsZGluZyBhbGxvY2F0aW9uIHN0YXRpc3RpY3NcdTIwMjYnKTtjb25zdCBub2Rlcz10aGlzLm5vZGVzO2NvbnN0IG5vZGVzTGVuZ3RoPW5vZGVzLmxlbmd0aDtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBub2RlPXRoaXMucm9vdE5vZGUoKTtjb25zdCBsaXZlT2JqZWN0cz17fTtmb3IobGV0IG5vZGVJbmRleD0wO25vZGVJbmRleDxub2Rlc0xlbmd0aDtub2RlSW5kZXgrPW5vZGVGaWVsZENvdW50KXtub2RlLm5vZGVJbmRleD1ub2RlSW5kZXg7Y29uc3QgdHJhY2VOb2RlSWQ9bm9kZS50cmFjZU5vZGVJZCgpO2xldCBzdGF0cz1saXZlT2JqZWN0c1t0cmFjZU5vZGVJZF07aWYoIXN0YXRzKQpsaXZlT2JqZWN0c1t0cmFjZU5vZGVJZF09c3RhdHM9e2NvdW50OjAsc2l6ZTowLGlkczpbXX07c3RhdHMuY291bnQrKztzdGF0cy5zaXplKz1ub2RlLnNlbGZTaXplKCk7c3RhdHMuaWRzLnB1c2gobm9kZS5pZCgpKTt9CnRoaXMuX2FsbG9jYXRpb25Qcm9maWxlPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuQWxsb2NhdGlvblByb2ZpbGUodGhpcy5fcHJvZmlsZSxsaXZlT2JqZWN0cyk7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdEb25lJyk7fX0KX2J1aWxkRWRnZUluZGV4ZXMoKXtjb25zdCBub2Rlcz10aGlzLm5vZGVzO2NvbnN0IG5vZGVDb3VudD10aGlzLm5vZGVDb3VudDtjb25zdCBmaXJzdEVkZ2VJbmRleGVzPXRoaXMuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3Qgbm9kZUZpZWxkQ291bnQ9dGhpcy5fbm9kZUZpZWxkQ291bnQ7Y29uc3QgZWRnZUZpZWxkc0NvdW50PXRoaXMuX2VkZ2VGaWVsZHNDb3VudDtjb25zdCBub2RlRWRnZUNvdW50T2Zmc2V0PXRoaXMuX25vZGVFZGdlQ291bnRPZmZzZXQ7Zmlyc3RFZGdlSW5kZXhlc1tub2RlQ291bnRdPXRoaXMuY29udGFpbm1lbnRFZGdlcy5sZW5ndGg7Zm9yKGxldCBub2RlT3JkaW5hbD0wLGVkZ2VJbmRleD0wO25vZGVPcmRpbmFsPG5vZGVDb3VudDsrK25vZGVPcmRpbmFsKXtmaXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsXT1lZGdlSW5kZXg7ZWRnZUluZGV4Kz1ub2Rlc1tub2RlT3JkaW5hbCpub2RlRmllbGRDb3VudCtub2RlRWRnZUNvdW50T2Zmc2V0XSplZGdlRmllbGRzQ291bnQ7fX0KX2J1aWxkUmV0YWluZXJzKCl7Y29uc3QgcmV0YWluaW5nTm9kZXM9dGhpcy5fcmV0YWluaW5nTm9kZXM7Y29uc3QgcmV0YWluaW5nRWRnZXM9dGhpcy5fcmV0YWluaW5nRWRnZXM7Y29uc3QgZmlyc3RSZXRhaW5lckluZGV4PXRoaXMuX2ZpcnN0UmV0YWluZXJJbmRleDtjb25zdCBjb250YWlubWVudEVkZ2VzPXRoaXMuY29udGFpbm1lbnRFZGdlcztjb25zdCBlZGdlRmllbGRzQ291bnQ9dGhpcy5fZWRnZUZpZWxkc0NvdW50O2NvbnN0IG5vZGVGaWVsZENvdW50PXRoaXMuX25vZGVGaWVsZENvdW50O2NvbnN0IGVkZ2VUb05vZGVPZmZzZXQ9dGhpcy5fZWRnZVRvTm9kZU9mZnNldDtjb25zdCBmaXJzdEVkZ2VJbmRleGVzPXRoaXMuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3Qgbm9kZUNvdW50PXRoaXMubm9kZUNvdW50O2ZvcihsZXQgdG9Ob2RlRmllbGRJbmRleD1lZGdlVG9Ob2RlT2Zmc2V0LGw9Y29udGFpbm1lbnRFZGdlcy5sZW5ndGg7dG9Ob2RlRmllbGRJbmRleDxsO3RvTm9kZUZpZWxkSW5kZXgrPWVkZ2VGaWVsZHNDb3VudCl7Y29uc3QgdG9Ob2RlSW5kZXg9Y29udGFpbm1lbnRFZGdlc1t0b05vZGVGaWVsZEluZGV4XTtpZih0b05vZGVJbmRleCVub2RlRmllbGRDb3VudCkKdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRvTm9kZUluZGV4ICcrdG9Ob2RlSW5kZXgpOysrZmlyc3RSZXRhaW5lckluZGV4W3RvTm9kZUluZGV4L25vZGVGaWVsZENvdW50XTt9CmZvcihsZXQgaT0wLGZpcnN0VW51c2VkUmV0YWluZXJTbG90PTA7aTxub2RlQ291bnQ7aSsrKXtjb25zdCByZXRhaW5lcnNDb3VudD1maXJzdFJldGFpbmVySW5kZXhbaV07Zmlyc3RSZXRhaW5lckluZGV4W2ldPWZpcnN0VW51c2VkUmV0YWluZXJTbG90O3JldGFpbmluZ05vZGVzW2ZpcnN0VW51c2VkUmV0YWluZXJTbG90XT1yZXRhaW5lcnNDb3VudDtmaXJzdFVudXNlZFJldGFpbmVyU2xvdCs9cmV0YWluZXJzQ291bnQ7fQpmaXJzdFJldGFpbmVySW5kZXhbbm9kZUNvdW50XT1yZXRhaW5pbmdOb2Rlcy5sZW5ndGg7bGV0IG5leHROb2RlRmlyc3RFZGdlSW5kZXg9Zmlyc3RFZGdlSW5kZXhlc1swXTtmb3IobGV0IHNyY05vZGVPcmRpbmFsPTA7c3JjTm9kZU9yZGluYWw8bm9kZUNvdW50Oysrc3JjTm9kZU9yZGluYWwpe2NvbnN0IGZpcnN0RWRnZUluZGV4PW5leHROb2RlRmlyc3RFZGdlSW5kZXg7bmV4dE5vZGVGaXJzdEVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW3NyY05vZGVPcmRpbmFsKzFdO2NvbnN0IHNyY05vZGVJbmRleD1zcmNOb2RlT3JkaW5hbCpub2RlRmllbGRDb3VudDtmb3IobGV0IGVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleDtlZGdlSW5kZXg8bmV4dE5vZGVGaXJzdEVkZ2VJbmRleDtlZGdlSW5kZXgrPWVkZ2VGaWVsZHNDb3VudCl7Y29uc3QgdG9Ob2RlSW5kZXg9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVRvTm9kZU9mZnNldF07aWYodG9Ob2RlSW5kZXglbm9kZUZpZWxkQ291bnQpCnRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b05vZGVJbmRleCAnK3RvTm9kZUluZGV4KTtjb25zdCBmaXJzdFJldGFpbmVyU2xvdEluZGV4PWZpcnN0UmV0YWluZXJJbmRleFt0b05vZGVJbmRleC9ub2RlRmllbGRDb3VudF07Y29uc3QgbmV4dFVudXNlZFJldGFpbmVyU2xvdEluZGV4PWZpcnN0UmV0YWluZXJTbG90SW5kZXgrKC0tcmV0YWluaW5nTm9kZXNbZmlyc3RSZXRhaW5lclNsb3RJbmRleF0pO3JldGFpbmluZ05vZGVzW25leHRVbnVzZWRSZXRhaW5lclNsb3RJbmRleF09c3JjTm9kZUluZGV4O3JldGFpbmluZ0VkZ2VzW25leHRVbnVzZWRSZXRhaW5lclNsb3RJbmRleF09ZWRnZUluZGV4O319fQpjcmVhdGVOb2RlKG5vZGVJbmRleCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9CmNyZWF0ZUVkZ2UoZWRnZUluZGV4KXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KY3JlYXRlUmV0YWluaW5nRWRnZShyZXRhaW5lckluZGV4KXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KX2FsbE5vZGVzKCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90Tm9kZUl0ZXJhdG9yKHRoaXMucm9vdE5vZGUoKSk7fQpyb290Tm9kZSgpe3JldHVybiB0aGlzLmNyZWF0ZU5vZGUodGhpcy5fcm9vdE5vZGVJbmRleCk7fQpnZXQgcm9vdE5vZGVJbmRleCgpe3JldHVybiB0aGlzLl9yb290Tm9kZUluZGV4O30KZ2V0IHRvdGFsU2l6ZSgpe3JldHVybiB0aGlzLnJvb3ROb2RlKCkucmV0YWluZWRTaXplKCk7fQpfZ2V0RG9taW5hdGVkSW5kZXgobm9kZUluZGV4KXtpZihub2RlSW5kZXgldGhpcy5fbm9kZUZpZWxkQ291bnQpCnRocm93IG5ldyBFcnJvcignSW52YWxpZCBub2RlSW5kZXg6ICcrbm9kZUluZGV4KTtyZXR1cm4gdGhpcy5fZmlyc3REb21pbmF0ZWROb2RlSW5kZXhbbm9kZUluZGV4L3RoaXMuX25vZGVGaWVsZENvdW50XTt9Cl9jcmVhdGVGaWx0ZXIobm9kZUZpbHRlcil7Y29uc3QgbWluTm9kZUlkPW5vZGVGaWx0ZXIubWluTm9kZUlkO2NvbnN0IG1heE5vZGVJZD1ub2RlRmlsdGVyLm1heE5vZGVJZDtjb25zdCBhbGxvY2F0aW9uTm9kZUlkPW5vZGVGaWx0ZXIuYWxsb2NhdGlvbk5vZGVJZDtsZXQgZmlsdGVyO2lmKHR5cGVvZiBhbGxvY2F0aW9uTm9kZUlkPT09J251bWJlcicpe2ZpbHRlcj10aGlzLl9jcmVhdGVBbGxvY2F0aW9uU3RhY2tGaWx0ZXIoYWxsb2NhdGlvbk5vZGVJZCk7ZmlsdGVyLmtleT0nQWxsb2NhdGlvbk5vZGVJZDogJythbGxvY2F0aW9uTm9kZUlkO31lbHNlIGlmKHR5cGVvZiBtaW5Ob2RlSWQ9PT0nbnVtYmVyJyYmdHlwZW9mIG1heE5vZGVJZD09PSdudW1iZXInKXtmaWx0ZXI9dGhpcy5fY3JlYXRlTm9kZUlkRmlsdGVyKG1pbk5vZGVJZCxtYXhOb2RlSWQpO2ZpbHRlci5rZXk9J05vZGVJZFJhbmdlOiAnK21pbk5vZGVJZCsnLi4nK21heE5vZGVJZDt9CnJldHVybiBmaWx0ZXI7fQpzZWFyY2goc2VhcmNoQ29uZmlnLG5vZGVGaWx0ZXIpe2NvbnN0IHF1ZXJ5PXNlYXJjaENvbmZpZy5xdWVyeTtmdW5jdGlvbiBmaWx0ZXJTdHJpbmcobWF0Y2hlZFN0cmluZ0luZGV4ZXMsc3RyaW5nLGluZGV4KXtpZihzdHJpbmcuaW5kZXhPZihxdWVyeSkhPT0tMSkKbWF0Y2hlZFN0cmluZ0luZGV4ZXMuYWRkKGluZGV4KTtyZXR1cm4gbWF0Y2hlZFN0cmluZ0luZGV4ZXM7fQpjb25zdCByZWdleHA9c2VhcmNoQ29uZmlnLmlzUmVnZXg/bmV3IFJlZ0V4cChxdWVyeSk6Y3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgocXVlcnksJ2knKTtmdW5jdGlvbiBmaWx0ZXJSZWdleHAobWF0Y2hlZFN0cmluZ0luZGV4ZXMsc3RyaW5nLGluZGV4KXtpZihyZWdleHAudGVzdChzdHJpbmcpKQptYXRjaGVkU3RyaW5nSW5kZXhlcy5hZGQoaW5kZXgpO3JldHVybiBtYXRjaGVkU3RyaW5nSW5kZXhlczt9CmNvbnN0IHN0cmluZ0ZpbHRlcj0oc2VhcmNoQ29uZmlnLmlzUmVnZXh8fCFzZWFyY2hDb25maWcuY2FzZVNlbnNpdGl2ZSk/ZmlsdGVyUmVnZXhwOmZpbHRlclN0cmluZztjb25zdCBzdHJpbmdJbmRleGVzPXRoaXMuc3RyaW5ncy5yZWR1Y2Uoc3RyaW5nRmlsdGVyLG5ldyBTZXQoKSk7aWYoIXN0cmluZ0luZGV4ZXMuc2l6ZSkKcmV0dXJuW107Y29uc3QgZmlsdGVyPXRoaXMuX2NyZWF0ZUZpbHRlcihub2RlRmlsdGVyKTtjb25zdCBub2RlSWRzPVtdO2NvbnN0IG5vZGVzTGVuZ3RoPXRoaXMubm9kZXMubGVuZ3RoO2NvbnN0IG5vZGVzPXRoaXMubm9kZXM7Y29uc3Qgbm9kZU5hbWVPZmZzZXQ9dGhpcy5fbm9kZU5hbWVPZmZzZXQ7Y29uc3Qgbm9kZUlkT2Zmc2V0PXRoaXMuX25vZGVJZE9mZnNldDtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBub2RlPXRoaXMucm9vdE5vZGUoKTtmb3IobGV0IG5vZGVJbmRleD0wO25vZGVJbmRleDxub2Rlc0xlbmd0aDtub2RlSW5kZXgrPW5vZGVGaWVsZENvdW50KXtub2RlLm5vZGVJbmRleD1ub2RlSW5kZXg7aWYoZmlsdGVyJiYhZmlsdGVyKG5vZGUpKQpjb250aW51ZTtpZihzdHJpbmdJbmRleGVzLmhhcyhub2Rlc1tub2RlSW5kZXgrbm9kZU5hbWVPZmZzZXRdKSkKbm9kZUlkcy5wdXNoKG5vZGVzW25vZGVJbmRleCtub2RlSWRPZmZzZXRdKTt9CnJldHVybiBub2RlSWRzO30KYWdncmVnYXRlc1dpdGhGaWx0ZXIobm9kZUZpbHRlcil7Y29uc3QgZmlsdGVyPXRoaXMuX2NyZWF0ZUZpbHRlcihub2RlRmlsdGVyKTtjb25zdCBrZXk9ZmlsdGVyP2ZpbHRlci5rZXk6J2FsbE9iamVjdHMnO3JldHVybiB0aGlzLmFnZ3JlZ2F0ZXMoZmFsc2Usa2V5LGZpbHRlcik7fQpfY3JlYXRlTm9kZUlkRmlsdGVyKG1pbk5vZGVJZCxtYXhOb2RlSWQpe2Z1bmN0aW9uIG5vZGVJZEZpbHRlcihub2RlKXtjb25zdCBpZD1ub2RlLmlkKCk7cmV0dXJuIGlkPm1pbk5vZGVJZCYmaWQ8PW1heE5vZGVJZDt9CnJldHVybiBub2RlSWRGaWx0ZXI7fQpfY3JlYXRlQWxsb2NhdGlvblN0YWNrRmlsdGVyKGJvdHRvbVVwQWxsb2NhdGlvbk5vZGVJZCl7Y29uc3QgdHJhY2VJZHM9dGhpcy5fYWxsb2NhdGlvblByb2ZpbGUudHJhY2VJZHMoYm90dG9tVXBBbGxvY2F0aW9uTm9kZUlkKTtpZighdHJhY2VJZHMubGVuZ3RoKQpyZXR1cm4gdW5kZWZpbmVkO2NvbnN0IHNldD17fTtmb3IobGV0IGk9MDtpPHRyYWNlSWRzLmxlbmd0aDtpKyspCnNldFt0cmFjZUlkc1tpXV09dHJ1ZTtmdW5jdGlvbiB0cmFjZUlkRmlsdGVyKG5vZGUpe3JldHVybiEhc2V0W25vZGUudHJhY2VOb2RlSWQoKV07fQpyZXR1cm4gdHJhY2VJZEZpbHRlcjt9CmFnZ3JlZ2F0ZXMoc29ydGVkSW5kZXhlcyxrZXksZmlsdGVyKXtsZXQgYWdncmVnYXRlc0J5Q2xhc3NOYW1lPWtleSYmdGhpcy5fYWdncmVnYXRlc1trZXldO2lmKCFhZ2dyZWdhdGVzQnlDbGFzc05hbWUpe2NvbnN0IGFnZ3JlZ2F0ZXM9dGhpcy5fYnVpbGRBZ2dyZWdhdGVzKGZpbHRlcik7dGhpcy5fY2FsY3VsYXRlQ2xhc3Nlc1JldGFpbmVkU2l6ZShhZ2dyZWdhdGVzLmFnZ3JlZ2F0ZXNCeUNsYXNzSW5kZXgsZmlsdGVyKTthZ2dyZWdhdGVzQnlDbGFzc05hbWU9YWdncmVnYXRlcy5hZ2dyZWdhdGVzQnlDbGFzc05hbWU7aWYoa2V5KQp0aGlzLl9hZ2dyZWdhdGVzW2tleV09YWdncmVnYXRlc0J5Q2xhc3NOYW1lO30KaWYoc29ydGVkSW5kZXhlcyYmKCFrZXl8fCF0aGlzLl9hZ2dyZWdhdGVzU29ydGVkRmxhZ3Nba2V5XSkpe3RoaXMuX3NvcnRBZ2dyZWdhdGVJbmRleGVzKGFnZ3JlZ2F0ZXNCeUNsYXNzTmFtZSk7aWYoa2V5KQp0aGlzLl9hZ2dyZWdhdGVzU29ydGVkRmxhZ3Nba2V5XT1zb3J0ZWRJbmRleGVzO30KcmV0dXJuIGFnZ3JlZ2F0ZXNCeUNsYXNzTmFtZTt9CmFsbG9jYXRpb25UcmFjZXNUb3BzKCl7cmV0dXJuIHRoaXMuX2FsbG9jYXRpb25Qcm9maWxlLnNlcmlhbGl6ZVRyYWNlVG9wcygpO30KYWxsb2NhdGlvbk5vZGVDYWxsZXJzKG5vZGVJZCl7cmV0dXJuIHRoaXMuX2FsbG9jYXRpb25Qcm9maWxlLnNlcmlhbGl6ZUNhbGxlcnMobm9kZUlkKTt9CmFsbG9jYXRpb25TdGFjayhub2RlSW5kZXgpe2NvbnN0IG5vZGU9dGhpcy5jcmVhdGVOb2RlKG5vZGVJbmRleCk7Y29uc3QgYWxsb2NhdGlvbk5vZGVJZD1ub2RlLnRyYWNlTm9kZUlkKCk7aWYoIWFsbG9jYXRpb25Ob2RlSWQpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9hbGxvY2F0aW9uUHJvZmlsZS5zZXJpYWxpemVBbGxvY2F0aW9uU3RhY2soYWxsb2NhdGlvbk5vZGVJZCk7fQphZ2dyZWdhdGVzRm9yRGlmZigpe2lmKHRoaXMuX2FnZ3JlZ2F0ZXNGb3JEaWZmKQpyZXR1cm4gdGhpcy5fYWdncmVnYXRlc0ZvckRpZmY7Y29uc3QgYWdncmVnYXRlc0J5Q2xhc3NOYW1lPXRoaXMuYWdncmVnYXRlcyh0cnVlLCdhbGxPYmplY3RzJyk7dGhpcy5fYWdncmVnYXRlc0ZvckRpZmY9e307Y29uc3Qgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTtmb3IoY29uc3QgY2xhc3NOYW1lIGluIGFnZ3JlZ2F0ZXNCeUNsYXNzTmFtZSl7Y29uc3QgYWdncmVnYXRlPWFnZ3JlZ2F0ZXNCeUNsYXNzTmFtZVtjbGFzc05hbWVdO2NvbnN0IGluZGV4ZXM9YWdncmVnYXRlLmlkeHM7Y29uc3QgaWRzPW5ldyBBcnJheShpbmRleGVzLmxlbmd0aCk7Y29uc3Qgc2VsZlNpemVzPW5ldyBBcnJheShpbmRleGVzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxpbmRleGVzLmxlbmd0aDtpKyspe25vZGUubm9kZUluZGV4PWluZGV4ZXNbaV07aWRzW2ldPW5vZGUuaWQoKTtzZWxmU2l6ZXNbaV09bm9kZS5zZWxmU2l6ZSgpO30KdGhpcy5fYWdncmVnYXRlc0ZvckRpZmZbY2xhc3NOYW1lXT17aW5kZXhlczppbmRleGVzLGlkczppZHMsc2VsZlNpemVzOnNlbGZTaXplc307fQpyZXR1cm4gdGhpcy5fYWdncmVnYXRlc0ZvckRpZmY7fQppc1VzZXJSb290KG5vZGUpe3JldHVybiB0cnVlO30KZm9yRWFjaFJvb3QoYWN0aW9uLHVzZXJSb290c09ubHkpe2ZvcihsZXQgaXRlcj10aGlzLnJvb3ROb2RlKCkuZWRnZXMoKTtpdGVyLmhhc05leHQoKTtpdGVyLm5leHQoKSl7Y29uc3Qgbm9kZT1pdGVyLmVkZ2Uubm9kZSgpO2lmKCF1c2VyUm9vdHNPbmx5fHx0aGlzLmlzVXNlclJvb3Qobm9kZSkpCmFjdGlvbihub2RlKTt9fQpjYWxjdWxhdGVEaXN0YW5jZXMoZmlsdGVyKXtjb25zdCBub2RlQ291bnQ9dGhpcy5ub2RlQ291bnQ7Y29uc3QgZGlzdGFuY2VzPXRoaXMuX25vZGVEaXN0YW5jZXM7Y29uc3Qgbm9EaXN0YW5jZT10aGlzLl9ub0Rpc3RhbmNlO2ZvcihsZXQgaT0wO2k8bm9kZUNvdW50OysraSkKZGlzdGFuY2VzW2ldPW5vRGlzdGFuY2U7Y29uc3Qgbm9kZXNUb1Zpc2l0PW5ldyBVaW50MzJBcnJheSh0aGlzLm5vZGVDb3VudCk7bGV0IG5vZGVzVG9WaXNpdExlbmd0aD0wO2Z1bmN0aW9uIGVucXVldWVOb2RlKGRpc3RhbmNlLG5vZGUpe2NvbnN0IG9yZGluYWw9bm9kZS5vcmRpbmFsKCk7aWYoZGlzdGFuY2VzW29yZGluYWxdIT09bm9EaXN0YW5jZSkKcmV0dXJuO2Rpc3RhbmNlc1tvcmRpbmFsXT1kaXN0YW5jZTtub2Rlc1RvVmlzaXRbbm9kZXNUb1Zpc2l0TGVuZ3RoKytdPW5vZGUubm9kZUluZGV4O30KdGhpcy5mb3JFYWNoUm9vdChlbnF1ZXVlTm9kZS5iaW5kKG51bGwsMSksdHJ1ZSk7dGhpcy5fYmZzKG5vZGVzVG9WaXNpdCxub2Rlc1RvVmlzaXRMZW5ndGgsZGlzdGFuY2VzLGZpbHRlcik7bm9kZXNUb1Zpc2l0TGVuZ3RoPTA7dGhpcy5mb3JFYWNoUm9vdChlbnF1ZXVlTm9kZS5iaW5kKG51bGwsSGVhcFNuYXBzaG90TW9kZWwuYmFzZVN5c3RlbURpc3RhbmNlKSxmYWxzZSk7dGhpcy5fYmZzKG5vZGVzVG9WaXNpdCxub2Rlc1RvVmlzaXRMZW5ndGgsZGlzdGFuY2VzLGZpbHRlcik7fQpfYmZzKG5vZGVzVG9WaXNpdCxub2Rlc1RvVmlzaXRMZW5ndGgsZGlzdGFuY2VzLGZpbHRlcil7Y29uc3QgZWRnZUZpZWxkc0NvdW50PXRoaXMuX2VkZ2VGaWVsZHNDb3VudDtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBjb250YWlubWVudEVkZ2VzPXRoaXMuY29udGFpbm1lbnRFZGdlcztjb25zdCBmaXJzdEVkZ2VJbmRleGVzPXRoaXMuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3QgZWRnZVRvTm9kZU9mZnNldD10aGlzLl9lZGdlVG9Ob2RlT2Zmc2V0O2NvbnN0IGVkZ2VUeXBlT2Zmc2V0PXRoaXMuX2VkZ2VUeXBlT2Zmc2V0O2NvbnN0IG5vZGVDb3VudD10aGlzLm5vZGVDb3VudDtjb25zdCBlZGdlV2Vha1R5cGU9dGhpcy5fZWRnZVdlYWtUeXBlO2NvbnN0IG5vRGlzdGFuY2U9dGhpcy5fbm9EaXN0YW5jZTtsZXQgaW5kZXg9MDtjb25zdCBlZGdlPXRoaXMuY3JlYXRlRWRnZSgwKTtjb25zdCBub2RlPXRoaXMuY3JlYXRlTm9kZSgwKTt3aGlsZShpbmRleDxub2Rlc1RvVmlzaXRMZW5ndGgpe2NvbnN0IG5vZGVJbmRleD1ub2Rlc1RvVmlzaXRbaW5kZXgrK107Y29uc3Qgbm9kZU9yZGluYWw9bm9kZUluZGV4L25vZGVGaWVsZENvdW50O2NvbnN0IGRpc3RhbmNlPWRpc3RhbmNlc1tub2RlT3JkaW5hbF0rMTtjb25zdCBmaXJzdEVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsXTtjb25zdCBlZGdlc0VuZD1maXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsKzFdO25vZGUubm9kZUluZGV4PW5vZGVJbmRleDtmb3IobGV0IGVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleDtlZGdlSW5kZXg8ZWRnZXNFbmQ7ZWRnZUluZGV4Kz1lZGdlRmllbGRzQ291bnQpe2NvbnN0IGVkZ2VUeXBlPWNvbnRhaW5tZW50RWRnZXNbZWRnZUluZGV4K2VkZ2VUeXBlT2Zmc2V0XTtpZihlZGdlVHlwZT09PWVkZ2VXZWFrVHlwZSkKY29udGludWU7Y29uc3QgY2hpbGROb2RlSW5kZXg9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVRvTm9kZU9mZnNldF07Y29uc3QgY2hpbGROb2RlT3JkaW5hbD1jaGlsZE5vZGVJbmRleC9ub2RlRmllbGRDb3VudDtpZihkaXN0YW5jZXNbY2hpbGROb2RlT3JkaW5hbF0hPT1ub0Rpc3RhbmNlKQpjb250aW51ZTtlZGdlLmVkZ2VJbmRleD1lZGdlSW5kZXg7aWYoZmlsdGVyJiYhZmlsdGVyKG5vZGUsZWRnZSkpCmNvbnRpbnVlO2Rpc3RhbmNlc1tjaGlsZE5vZGVPcmRpbmFsXT1kaXN0YW5jZTtub2Rlc1RvVmlzaXRbbm9kZXNUb1Zpc2l0TGVuZ3RoKytdPWNoaWxkTm9kZUluZGV4O319CmlmKG5vZGVzVG9WaXNpdExlbmd0aD5ub2RlQ291bnQpe3Rocm93IG5ldyBFcnJvcignQkZTIGZhaWxlZC4gTm9kZXMgdG8gdmlzaXQgKCcrbm9kZXNUb1Zpc2l0TGVuZ3RoKycpIGlzIG1vcmUgdGhhbiBub2RlcyBjb3VudCAoJytub2RlQ291bnQrJyknKTt9fQpfYnVpbGRBZ2dyZWdhdGVzKGZpbHRlcil7Y29uc3QgYWdncmVnYXRlcz17fTtjb25zdCBhZ2dyZWdhdGVzQnlDbGFzc05hbWU9e307Y29uc3QgY2xhc3NJbmRleGVzPVtdO2NvbnN0IG5vZGVzPXRoaXMubm9kZXM7Y29uc3Qgbm9kZXNMZW5ndGg9bm9kZXMubGVuZ3RoO2NvbnN0IG5vZGVOYXRpdmVUeXBlPXRoaXMuX25vZGVOYXRpdmVUeXBlO2NvbnN0IG5vZGVGaWVsZENvdW50PXRoaXMuX25vZGVGaWVsZENvdW50O2NvbnN0IHNlbGZTaXplT2Zmc2V0PXRoaXMuX25vZGVTZWxmU2l6ZU9mZnNldDtjb25zdCBub2RlVHlwZU9mZnNldD10aGlzLl9ub2RlVHlwZU9mZnNldDtjb25zdCBub2RlPXRoaXMucm9vdE5vZGUoKTtjb25zdCBub2RlRGlzdGFuY2VzPXRoaXMuX25vZGVEaXN0YW5jZXM7Zm9yKGxldCBub2RlSW5kZXg9MDtub2RlSW5kZXg8bm9kZXNMZW5ndGg7bm9kZUluZGV4Kz1ub2RlRmllbGRDb3VudCl7bm9kZS5ub2RlSW5kZXg9bm9kZUluZGV4O2lmKGZpbHRlciYmIWZpbHRlcihub2RlKSkKY29udGludWU7Y29uc3Qgc2VsZlNpemU9bm9kZXNbbm9kZUluZGV4K3NlbGZTaXplT2Zmc2V0XTtpZighc2VsZlNpemUmJm5vZGVzW25vZGVJbmRleCtub2RlVHlwZU9mZnNldF0hPT1ub2RlTmF0aXZlVHlwZSkKY29udGludWU7Y29uc3QgY2xhc3NJbmRleD1ub2RlLmNsYXNzSW5kZXgoKTtjb25zdCBub2RlT3JkaW5hbD1ub2RlSW5kZXgvbm9kZUZpZWxkQ291bnQ7Y29uc3QgZGlzdGFuY2U9bm9kZURpc3RhbmNlc1tub2RlT3JkaW5hbF07aWYoIShjbGFzc0luZGV4IGluIGFnZ3JlZ2F0ZXMpKXtjb25zdCBub2RlVHlwZT1ub2RlLnR5cGUoKTtjb25zdCBuYW1lTWF0dGVycz1ub2RlVHlwZT09PSdvYmplY3QnfHxub2RlVHlwZT09PSduYXRpdmUnO2NvbnN0IHZhbHVlPXtjb3VudDoxLGRpc3RhbmNlOmRpc3RhbmNlLHNlbGY6c2VsZlNpemUsbWF4UmV0OjAsdHlwZTpub2RlVHlwZSxuYW1lOm5hbWVNYXR0ZXJzP25vZGUubmFtZSgpOm51bGwsaWR4czpbbm9kZUluZGV4XX07YWdncmVnYXRlc1tjbGFzc0luZGV4XT12YWx1ZTtjbGFzc0luZGV4ZXMucHVzaChjbGFzc0luZGV4KTthZ2dyZWdhdGVzQnlDbGFzc05hbWVbbm9kZS5jbGFzc05hbWUoKV09dmFsdWU7fWVsc2V7Y29uc3QgY2xzcz1hZ2dyZWdhdGVzW2NsYXNzSW5kZXhdO2Nsc3MuZGlzdGFuY2U9TWF0aC5taW4oY2xzcy5kaXN0YW5jZSxkaXN0YW5jZSk7KytjbHNzLmNvdW50O2Nsc3Muc2VsZis9c2VsZlNpemU7Y2xzcy5pZHhzLnB1c2gobm9kZUluZGV4KTt9fQpmb3IobGV0IGk9MCxsPWNsYXNzSW5kZXhlcy5sZW5ndGg7aTxsOysraSl7Y29uc3QgY2xhc3NJbmRleD1jbGFzc0luZGV4ZXNbaV07YWdncmVnYXRlc1tjbGFzc0luZGV4XS5pZHhzPWFnZ3JlZ2F0ZXNbY2xhc3NJbmRleF0uaWR4cy5zbGljZSgpO30KcmV0dXJue2FnZ3JlZ2F0ZXNCeUNsYXNzTmFtZTphZ2dyZWdhdGVzQnlDbGFzc05hbWUsYWdncmVnYXRlc0J5Q2xhc3NJbmRleDphZ2dyZWdhdGVzfTt9Cl9jYWxjdWxhdGVDbGFzc2VzUmV0YWluZWRTaXplKGFnZ3JlZ2F0ZXMsZmlsdGVyKXtjb25zdCByb290Tm9kZUluZGV4PXRoaXMuX3Jvb3ROb2RlSW5kZXg7Y29uc3Qgbm9kZT10aGlzLmNyZWF0ZU5vZGUocm9vdE5vZGVJbmRleCk7Y29uc3QgbGlzdD1bcm9vdE5vZGVJbmRleF07Y29uc3Qgc2l6ZXM9Wy0xXTtjb25zdCBjbGFzc2VzPVtdO2NvbnN0IHNlZW5DbGFzc05hbWVJbmRleGVzPXt9O2NvbnN0IG5vZGVGaWVsZENvdW50PXRoaXMuX25vZGVGaWVsZENvdW50O2NvbnN0IG5vZGVUeXBlT2Zmc2V0PXRoaXMuX25vZGVUeXBlT2Zmc2V0O2NvbnN0IG5vZGVOYXRpdmVUeXBlPXRoaXMuX25vZGVOYXRpdmVUeXBlO2NvbnN0IGRvbWluYXRlZE5vZGVzPXRoaXMuX2RvbWluYXRlZE5vZGVzO2NvbnN0IG5vZGVzPXRoaXMubm9kZXM7Y29uc3QgZmlyc3REb21pbmF0ZWROb2RlSW5kZXg9dGhpcy5fZmlyc3REb21pbmF0ZWROb2RlSW5kZXg7d2hpbGUobGlzdC5sZW5ndGgpe2NvbnN0IG5vZGVJbmRleD1saXN0LnBvcCgpO25vZGUubm9kZUluZGV4PW5vZGVJbmRleDtsZXQgY2xhc3NJbmRleD1ub2RlLmNsYXNzSW5kZXgoKTtjb25zdCBzZWVuPSEhc2VlbkNsYXNzTmFtZUluZGV4ZXNbY2xhc3NJbmRleF07Y29uc3Qgbm9kZU9yZGluYWw9bm9kZUluZGV4L25vZGVGaWVsZENvdW50O2NvbnN0IGRvbWluYXRlZEluZGV4RnJvbT1maXJzdERvbWluYXRlZE5vZGVJbmRleFtub2RlT3JkaW5hbF07Y29uc3QgZG9taW5hdGVkSW5kZXhUbz1maXJzdERvbWluYXRlZE5vZGVJbmRleFtub2RlT3JkaW5hbCsxXTtpZighc2VlbiYmKCFmaWx0ZXJ8fGZpbHRlcihub2RlKSkmJihub2RlLnNlbGZTaXplKCl8fG5vZGVzW25vZGVJbmRleCtub2RlVHlwZU9mZnNldF09PT1ub2RlTmF0aXZlVHlwZSkpe2FnZ3JlZ2F0ZXNbY2xhc3NJbmRleF0ubWF4UmV0Kz1ub2RlLnJldGFpbmVkU2l6ZSgpO2lmKGRvbWluYXRlZEluZGV4RnJvbSE9PWRvbWluYXRlZEluZGV4VG8pe3NlZW5DbGFzc05hbWVJbmRleGVzW2NsYXNzSW5kZXhdPXRydWU7c2l6ZXMucHVzaChsaXN0Lmxlbmd0aCk7Y2xhc3Nlcy5wdXNoKGNsYXNzSW5kZXgpO319CmZvcihsZXQgaT1kb21pbmF0ZWRJbmRleEZyb207aTxkb21pbmF0ZWRJbmRleFRvO2krKykKbGlzdC5wdXNoKGRvbWluYXRlZE5vZGVzW2ldKTtjb25zdCBsPWxpc3QubGVuZ3RoO3doaWxlKHNpemVzW3NpemVzLmxlbmd0aC0xXT09PWwpe3NpemVzLnBvcCgpO2NsYXNzSW5kZXg9Y2xhc3Nlcy5wb3AoKTtzZWVuQ2xhc3NOYW1lSW5kZXhlc1tjbGFzc0luZGV4XT1mYWxzZTt9fX0KX3NvcnRBZ2dyZWdhdGVJbmRleGVzKGFnZ3JlZ2F0ZXMpe2NvbnN0IG5vZGVBPXRoaXMuY3JlYXRlTm9kZSgpO2NvbnN0IG5vZGVCPXRoaXMuY3JlYXRlTm9kZSgpO2Zvcihjb25zdCBjbHNzIGluIGFnZ3JlZ2F0ZXMpe2FnZ3JlZ2F0ZXNbY2xzc10uaWR4cy5zb3J0KChpZHhBLGlkeEIpPT57bm9kZUEubm9kZUluZGV4PWlkeEE7bm9kZUIubm9kZUluZGV4PWlkeEI7cmV0dXJuIG5vZGVBLmlkKCk8bm9kZUIuaWQoKT8tMToxO30pO319Cl9pc0Vzc2VudGlhbEVkZ2Uobm9kZUluZGV4LGVkZ2VUeXBlKXtyZXR1cm4gZWRnZVR5cGUhPT10aGlzLl9lZGdlV2Vha1R5cGUmJihlZGdlVHlwZSE9PXRoaXMuX2VkZ2VTaG9ydGN1dFR5cGV8fG5vZGVJbmRleD09PXRoaXMuX3Jvb3ROb2RlSW5kZXgpO30KX2J1aWxkUG9zdE9yZGVySW5kZXgoKXtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBub2RlQ291bnQ9dGhpcy5ub2RlQ291bnQ7Y29uc3Qgcm9vdE5vZGVPcmRpbmFsPXRoaXMuX3Jvb3ROb2RlSW5kZXgvbm9kZUZpZWxkQ291bnQ7Y29uc3QgZWRnZUZpZWxkc0NvdW50PXRoaXMuX2VkZ2VGaWVsZHNDb3VudDtjb25zdCBlZGdlVHlwZU9mZnNldD10aGlzLl9lZGdlVHlwZU9mZnNldDtjb25zdCBlZGdlVG9Ob2RlT2Zmc2V0PXRoaXMuX2VkZ2VUb05vZGVPZmZzZXQ7Y29uc3QgZmlyc3RFZGdlSW5kZXhlcz10aGlzLl9maXJzdEVkZ2VJbmRleGVzO2NvbnN0IGNvbnRhaW5tZW50RWRnZXM9dGhpcy5jb250YWlubWVudEVkZ2VzO2NvbnN0IG1hcEFuZEZsYWc9dGhpcy51c2VyT2JqZWN0c01hcEFuZEZsYWcoKTtjb25zdCBmbGFncz1tYXBBbmRGbGFnP21hcEFuZEZsYWcubWFwOm51bGw7Y29uc3QgZmxhZz1tYXBBbmRGbGFnP21hcEFuZEZsYWcuZmxhZzowO2NvbnN0IHN0YWNrTm9kZXM9bmV3IFVpbnQzMkFycmF5KG5vZGVDb3VudCk7Y29uc3Qgc3RhY2tDdXJyZW50RWRnZT1uZXcgVWludDMyQXJyYXkobm9kZUNvdW50KTtjb25zdCBwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbD1uZXcgVWludDMyQXJyYXkobm9kZUNvdW50KTtjb25zdCBub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleD1uZXcgVWludDMyQXJyYXkobm9kZUNvdW50KTtjb25zdCB2aXNpdGVkPW5ldyBVaW50OEFycmF5KG5vZGVDb3VudCk7bGV0IHBvc3RPcmRlckluZGV4PTA7bGV0IHN0YWNrVG9wPTA7c3RhY2tOb2Rlc1swXT1yb290Tm9kZU9yZGluYWw7c3RhY2tDdXJyZW50RWRnZVswXT1maXJzdEVkZ2VJbmRleGVzW3Jvb3ROb2RlT3JkaW5hbF07dmlzaXRlZFtyb290Tm9kZU9yZGluYWxdPTE7bGV0IGl0ZXJhdGlvbj0wO3doaWxlKHRydWUpeysraXRlcmF0aW9uO3doaWxlKHN0YWNrVG9wPj0wKXtjb25zdCBub2RlT3JkaW5hbD1zdGFja05vZGVzW3N0YWNrVG9wXTtjb25zdCBlZGdlSW5kZXg9c3RhY2tDdXJyZW50RWRnZVtzdGFja1RvcF07Y29uc3QgZWRnZXNFbmQ9Zmlyc3RFZGdlSW5kZXhlc1tub2RlT3JkaW5hbCsxXTtpZihlZGdlSW5kZXg8ZWRnZXNFbmQpe3N0YWNrQ3VycmVudEVkZ2Vbc3RhY2tUb3BdKz1lZGdlRmllbGRzQ291bnQ7Y29uc3QgZWRnZVR5cGU9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVR5cGVPZmZzZXRdO2lmKCF0aGlzLl9pc0Vzc2VudGlhbEVkZ2Uobm9kZU9yZGluYWwqbm9kZUZpZWxkQ291bnQsZWRnZVR5cGUpKQpjb250aW51ZTtjb25zdCBjaGlsZE5vZGVJbmRleD1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVG9Ob2RlT2Zmc2V0XTtjb25zdCBjaGlsZE5vZGVPcmRpbmFsPWNoaWxkTm9kZUluZGV4L25vZGVGaWVsZENvdW50O2lmKHZpc2l0ZWRbY2hpbGROb2RlT3JkaW5hbF0pCmNvbnRpbnVlO2NvbnN0IG5vZGVGbGFnPSFmbGFnc3x8KGZsYWdzW25vZGVPcmRpbmFsXSZmbGFnKTtjb25zdCBjaGlsZE5vZGVGbGFnPSFmbGFnc3x8KGZsYWdzW2NoaWxkTm9kZU9yZGluYWxdJmZsYWcpO2lmKG5vZGVPcmRpbmFsIT09cm9vdE5vZGVPcmRpbmFsJiZjaGlsZE5vZGVGbGFnJiYhbm9kZUZsYWcpCmNvbnRpbnVlOysrc3RhY2tUb3A7c3RhY2tOb2Rlc1tzdGFja1RvcF09Y2hpbGROb2RlT3JkaW5hbDtzdGFja0N1cnJlbnRFZGdlW3N0YWNrVG9wXT1maXJzdEVkZ2VJbmRleGVzW2NoaWxkTm9kZU9yZGluYWxdO3Zpc2l0ZWRbY2hpbGROb2RlT3JkaW5hbF09MTt9ZWxzZXtub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleFtub2RlT3JkaW5hbF09cG9zdE9yZGVySW5kZXg7cG9zdE9yZGVySW5kZXgyTm9kZU9yZGluYWxbcG9zdE9yZGVySW5kZXgrK109bm9kZU9yZGluYWw7LS1zdGFja1RvcDt9fQppZihwb3N0T3JkZXJJbmRleD09PW5vZGVDb3VudHx8aXRlcmF0aW9uPjEpCmJyZWFrO2NvbnN0IGVycm9ycz1uZXcgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdFByb2JsZW1SZXBvcnQoYEhlYXAgc25hcHNob3Q6ICR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlQ291bnQgLSBwb3N0T3JkZXJJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgIH0gbm9kZXMgYXJlIHVucmVhY2hhYmxlIGZyb20gdGhlIHJvb3QuIEZvbGxvd2luZyBub2RlcyBoYXZlIG9ubHkgd2VhayByZXRhaW5lcnM6YCk7Y29uc3QgZHVtcE5vZGU9dGhpcy5yb290Tm9kZSgpOy0tcG9zdE9yZGVySW5kZXg7c3RhY2tUb3A9MDtzdGFja05vZGVzWzBdPXJvb3ROb2RlT3JkaW5hbDtzdGFja0N1cnJlbnRFZGdlWzBdPWZpcnN0RWRnZUluZGV4ZXNbcm9vdE5vZGVPcmRpbmFsKzFdO2ZvcihsZXQgaT0wO2k8bm9kZUNvdW50OysraSl7aWYodmlzaXRlZFtpXXx8IXRoaXMuX2hhc09ubHlXZWFrUmV0YWluZXJzKGkpKQpjb250aW51ZTtzdGFja05vZGVzWysrc3RhY2tUb3BdPWk7c3RhY2tDdXJyZW50RWRnZVtzdGFja1RvcF09Zmlyc3RFZGdlSW5kZXhlc1tpXTt2aXNpdGVkW2ldPTE7ZHVtcE5vZGUubm9kZUluZGV4PWkqbm9kZUZpZWxkQ291bnQ7Y29uc3QgcmV0YWluZXJzPVtdO2ZvcihsZXQgaXQ9ZHVtcE5vZGUucmV0YWluZXJzKCk7aXQuaGFzTmV4dCgpO2l0Lm5leHQoKSkKcmV0YWluZXJzLnB1c2goYCR7aXQuaXRlbSgpLm5vZGUoKS5uYW1lKCl9QCR7aXQuaXRlbSgpLm5vZGUoKS5pZCgpfS4ke2l0Lml0ZW0oKS5uYW1lKCl9YCk7ZXJyb3JzLmFkZEVycm9yKGAke2R1bXBOb2RlLm5hbWUoKX0gQCR7ZHVtcE5vZGUuaWQoKX0gIHdlYWsgcmV0YWluZXJzOiAke3JldGFpbmVycy5qb2luKCcsICcpfWApO30KY29uc29sZS53YXJuKGVycm9ycy50b1N0cmluZygpKTt9CmlmKHBvc3RPcmRlckluZGV4IT09bm9kZUNvdW50KXtjb25zdCBlcnJvcnM9bmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RQcm9ibGVtUmVwb3J0KCdTdGlsbCBmb3VuZCAnKyhub2RlQ291bnQtcG9zdE9yZGVySW5kZXgpKycgdW5yZWFjaGFibGUgbm9kZXMgaW4gaGVhcCBzbmFwc2hvdDonKTtjb25zdCBkdW1wTm9kZT10aGlzLnJvb3ROb2RlKCk7LS1wb3N0T3JkZXJJbmRleDtmb3IobGV0IGk9MDtpPG5vZGVDb3VudDsrK2kpe2lmKHZpc2l0ZWRbaV0pCmNvbnRpbnVlO2R1bXBOb2RlLm5vZGVJbmRleD1pKm5vZGVGaWVsZENvdW50O2Vycm9ycy5hZGRFcnJvcihkdW1wTm9kZS5uYW1lKCkrJyBAJytkdW1wTm9kZS5pZCgpKTtub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleFtpXT1wb3N0T3JkZXJJbmRleDtwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbFtwb3N0T3JkZXJJbmRleCsrXT1pO30Kbm9kZU9yZGluYWwyUG9zdE9yZGVySW5kZXhbcm9vdE5vZGVPcmRpbmFsXT1wb3N0T3JkZXJJbmRleDtwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbFtwb3N0T3JkZXJJbmRleCsrXT1yb290Tm9kZU9yZGluYWw7Y29uc29sZS53YXJuKGVycm9ycy50b1N0cmluZygpKTt9CnJldHVybntwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbDpwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbCxub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleDpub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleH07fQpfaGFzT25seVdlYWtSZXRhaW5lcnMobm9kZU9yZGluYWwpe2NvbnN0IGVkZ2VUeXBlT2Zmc2V0PXRoaXMuX2VkZ2VUeXBlT2Zmc2V0O2NvbnN0IGVkZ2VXZWFrVHlwZT10aGlzLl9lZGdlV2Vha1R5cGU7Y29uc3QgZWRnZVNob3J0Y3V0VHlwZT10aGlzLl9lZGdlU2hvcnRjdXRUeXBlO2NvbnN0IGNvbnRhaW5tZW50RWRnZXM9dGhpcy5jb250YWlubWVudEVkZ2VzO2NvbnN0IHJldGFpbmluZ0VkZ2VzPXRoaXMuX3JldGFpbmluZ0VkZ2VzO2NvbnN0IGJlZ2luUmV0YWluZXJJbmRleD10aGlzLl9maXJzdFJldGFpbmVySW5kZXhbbm9kZU9yZGluYWxdO2NvbnN0IGVuZFJldGFpbmVySW5kZXg9dGhpcy5fZmlyc3RSZXRhaW5lckluZGV4W25vZGVPcmRpbmFsKzFdO2ZvcihsZXQgcmV0YWluZXJJbmRleD1iZWdpblJldGFpbmVySW5kZXg7cmV0YWluZXJJbmRleDxlbmRSZXRhaW5lckluZGV4OysrcmV0YWluZXJJbmRleCl7Y29uc3QgcmV0YWluZXJFZGdlSW5kZXg9cmV0YWluaW5nRWRnZXNbcmV0YWluZXJJbmRleF07Y29uc3QgcmV0YWluZXJFZGdlVHlwZT1jb250YWlubWVudEVkZ2VzW3JldGFpbmVyRWRnZUluZGV4K2VkZ2VUeXBlT2Zmc2V0XTtpZihyZXRhaW5lckVkZ2VUeXBlIT09ZWRnZVdlYWtUeXBlJiZyZXRhaW5lckVkZ2VUeXBlIT09ZWRnZVNob3J0Y3V0VHlwZSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fQpfYnVpbGREb21pbmF0b3JUcmVlKHBvc3RPcmRlckluZGV4Mk5vZGVPcmRpbmFsLG5vZGVPcmRpbmFsMlBvc3RPcmRlckluZGV4KXtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBmaXJzdFJldGFpbmVySW5kZXg9dGhpcy5fZmlyc3RSZXRhaW5lckluZGV4O2NvbnN0IHJldGFpbmluZ05vZGVzPXRoaXMuX3JldGFpbmluZ05vZGVzO2NvbnN0IHJldGFpbmluZ0VkZ2VzPXRoaXMuX3JldGFpbmluZ0VkZ2VzO2NvbnN0IGVkZ2VGaWVsZHNDb3VudD10aGlzLl9lZGdlRmllbGRzQ291bnQ7Y29uc3QgZWRnZVR5cGVPZmZzZXQ9dGhpcy5fZWRnZVR5cGVPZmZzZXQ7Y29uc3QgZWRnZVRvTm9kZU9mZnNldD10aGlzLl9lZGdlVG9Ob2RlT2Zmc2V0O2NvbnN0IGZpcnN0RWRnZUluZGV4ZXM9dGhpcy5fZmlyc3RFZGdlSW5kZXhlcztjb25zdCBjb250YWlubWVudEVkZ2VzPXRoaXMuY29udGFpbm1lbnRFZGdlcztjb25zdCByb290Tm9kZUluZGV4PXRoaXMuX3Jvb3ROb2RlSW5kZXg7Y29uc3QgbWFwQW5kRmxhZz10aGlzLnVzZXJPYmplY3RzTWFwQW5kRmxhZygpO2NvbnN0IGZsYWdzPW1hcEFuZEZsYWc/bWFwQW5kRmxhZy5tYXA6bnVsbDtjb25zdCBmbGFnPW1hcEFuZEZsYWc/bWFwQW5kRmxhZy5mbGFnOjA7Y29uc3Qgbm9kZXNDb3VudD1wb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbC5sZW5ndGg7Y29uc3Qgcm9vdFBvc3RPcmRlcmVkSW5kZXg9bm9kZXNDb3VudC0xO2NvbnN0IG5vRW50cnk9bm9kZXNDb3VudDtjb25zdCBkb21pbmF0b3JzPW5ldyBVaW50MzJBcnJheShub2Rlc0NvdW50KTtmb3IobGV0IGk9MDtpPHJvb3RQb3N0T3JkZXJlZEluZGV4OysraSkKZG9taW5hdG9yc1tpXT1ub0VudHJ5O2RvbWluYXRvcnNbcm9vdFBvc3RPcmRlcmVkSW5kZXhdPXJvb3RQb3N0T3JkZXJlZEluZGV4O2NvbnN0IGFmZmVjdGVkPW5ldyBVaW50OEFycmF5KG5vZGVzQ291bnQpO2xldCBub2RlT3JkaW5hbDt7bm9kZU9yZGluYWw9dGhpcy5fcm9vdE5vZGVJbmRleC9ub2RlRmllbGRDb3VudDtjb25zdCBlbmRFZGdlSW5kZXg9Zmlyc3RFZGdlSW5kZXhlc1tub2RlT3JkaW5hbCsxXTtmb3IobGV0IGVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsXTtlZGdlSW5kZXg8ZW5kRWRnZUluZGV4O2VkZ2VJbmRleCs9ZWRnZUZpZWxkc0NvdW50KXtjb25zdCBlZGdlVHlwZT1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVHlwZU9mZnNldF07aWYoIXRoaXMuX2lzRXNzZW50aWFsRWRnZSh0aGlzLl9yb290Tm9kZUluZGV4LGVkZ2VUeXBlKSkKY29udGludWU7Y29uc3QgY2hpbGROb2RlT3JkaW5hbD1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVG9Ob2RlT2Zmc2V0XS9ub2RlRmllbGRDb3VudDthZmZlY3RlZFtub2RlT3JkaW5hbDJQb3N0T3JkZXJJbmRleFtjaGlsZE5vZGVPcmRpbmFsXV09MTt9fQpsZXQgY2hhbmdlZD10cnVlO3doaWxlKGNoYW5nZWQpe2NoYW5nZWQ9ZmFsc2U7Zm9yKGxldCBwb3N0T3JkZXJJbmRleD1yb290UG9zdE9yZGVyZWRJbmRleC0xO3Bvc3RPcmRlckluZGV4Pj0wOy0tcG9zdE9yZGVySW5kZXgpe2lmKGFmZmVjdGVkW3Bvc3RPcmRlckluZGV4XT09PTApCmNvbnRpbnVlO2FmZmVjdGVkW3Bvc3RPcmRlckluZGV4XT0wO2lmKGRvbWluYXRvcnNbcG9zdE9yZGVySW5kZXhdPT09cm9vdFBvc3RPcmRlcmVkSW5kZXgpCmNvbnRpbnVlO25vZGVPcmRpbmFsPXBvc3RPcmRlckluZGV4Mk5vZGVPcmRpbmFsW3Bvc3RPcmRlckluZGV4XTtjb25zdCBub2RlRmxhZz0hZmxhZ3N8fChmbGFnc1tub2RlT3JkaW5hbF0mZmxhZyk7bGV0IG5ld0RvbWluYXRvckluZGV4PW5vRW50cnk7Y29uc3QgYmVnaW5SZXRhaW5lckluZGV4PWZpcnN0UmV0YWluZXJJbmRleFtub2RlT3JkaW5hbF07Y29uc3QgZW5kUmV0YWluZXJJbmRleD1maXJzdFJldGFpbmVySW5kZXhbbm9kZU9yZGluYWwrMV07bGV0IG9ycGhhbk5vZGU9dHJ1ZTtmb3IobGV0IHJldGFpbmVySW5kZXg9YmVnaW5SZXRhaW5lckluZGV4O3JldGFpbmVySW5kZXg8ZW5kUmV0YWluZXJJbmRleDsrK3JldGFpbmVySW5kZXgpe2NvbnN0IHJldGFpbmVyRWRnZUluZGV4PXJldGFpbmluZ0VkZ2VzW3JldGFpbmVySW5kZXhdO2NvbnN0IHJldGFpbmVyRWRnZVR5cGU9Y29udGFpbm1lbnRFZGdlc1tyZXRhaW5lckVkZ2VJbmRleCtlZGdlVHlwZU9mZnNldF07Y29uc3QgcmV0YWluZXJOb2RlSW5kZXg9cmV0YWluaW5nTm9kZXNbcmV0YWluZXJJbmRleF07aWYoIXRoaXMuX2lzRXNzZW50aWFsRWRnZShyZXRhaW5lck5vZGVJbmRleCxyZXRhaW5lckVkZ2VUeXBlKSkKY29udGludWU7b3JwaGFuTm9kZT1mYWxzZTtjb25zdCByZXRhaW5lck5vZGVPcmRpbmFsPXJldGFpbmVyTm9kZUluZGV4L25vZGVGaWVsZENvdW50O2NvbnN0IHJldGFpbmVyTm9kZUZsYWc9IWZsYWdzfHwoZmxhZ3NbcmV0YWluZXJOb2RlT3JkaW5hbF0mZmxhZyk7aWYocmV0YWluZXJOb2RlSW5kZXghPT1yb290Tm9kZUluZGV4JiZub2RlRmxhZyYmIXJldGFpbmVyTm9kZUZsYWcpCmNvbnRpbnVlO2xldCByZXRhbmVyUG9zdE9yZGVySW5kZXg9bm9kZU9yZGluYWwyUG9zdE9yZGVySW5kZXhbcmV0YWluZXJOb2RlT3JkaW5hbF07aWYoZG9taW5hdG9yc1tyZXRhbmVyUG9zdE9yZGVySW5kZXhdIT09bm9FbnRyeSl7aWYobmV3RG9taW5hdG9ySW5kZXg9PT1ub0VudHJ5KXtuZXdEb21pbmF0b3JJbmRleD1yZXRhbmVyUG9zdE9yZGVySW5kZXg7fWVsc2V7d2hpbGUocmV0YW5lclBvc3RPcmRlckluZGV4IT09bmV3RG9taW5hdG9ySW5kZXgpe3doaWxlKHJldGFuZXJQb3N0T3JkZXJJbmRleDxuZXdEb21pbmF0b3JJbmRleCkKcmV0YW5lclBvc3RPcmRlckluZGV4PWRvbWluYXRvcnNbcmV0YW5lclBvc3RPcmRlckluZGV4XTt3aGlsZShuZXdEb21pbmF0b3JJbmRleDxyZXRhbmVyUG9zdE9yZGVySW5kZXgpCm5ld0RvbWluYXRvckluZGV4PWRvbWluYXRvcnNbbmV3RG9taW5hdG9ySW5kZXhdO319CmlmKG5ld0RvbWluYXRvckluZGV4PT09cm9vdFBvc3RPcmRlcmVkSW5kZXgpCmJyZWFrO319CmlmKG9ycGhhbk5vZGUpCm5ld0RvbWluYXRvckluZGV4PXJvb3RQb3N0T3JkZXJlZEluZGV4O2lmKG5ld0RvbWluYXRvckluZGV4IT09bm9FbnRyeSYmZG9taW5hdG9yc1twb3N0T3JkZXJJbmRleF0hPT1uZXdEb21pbmF0b3JJbmRleCl7ZG9taW5hdG9yc1twb3N0T3JkZXJJbmRleF09bmV3RG9taW5hdG9ySW5kZXg7Y2hhbmdlZD10cnVlO25vZGVPcmRpbmFsPXBvc3RPcmRlckluZGV4Mk5vZGVPcmRpbmFsW3Bvc3RPcmRlckluZGV4XTtjb25zdCBiZWdpbkVkZ2VUb05vZGVGaWVsZEluZGV4PWZpcnN0RWRnZUluZGV4ZXNbbm9kZU9yZGluYWxdK2VkZ2VUb05vZGVPZmZzZXQ7Y29uc3QgZW5kRWRnZVRvTm9kZUZpZWxkSW5kZXg9Zmlyc3RFZGdlSW5kZXhlc1tub2RlT3JkaW5hbCsxXTtmb3IobGV0IHRvTm9kZUZpZWxkSW5kZXg9YmVnaW5FZGdlVG9Ob2RlRmllbGRJbmRleDt0b05vZGVGaWVsZEluZGV4PGVuZEVkZ2VUb05vZGVGaWVsZEluZGV4O3RvTm9kZUZpZWxkSW5kZXgrPWVkZ2VGaWVsZHNDb3VudCl7Y29uc3QgY2hpbGROb2RlT3JkaW5hbD1jb250YWlubWVudEVkZ2VzW3RvTm9kZUZpZWxkSW5kZXhdL25vZGVGaWVsZENvdW50O2FmZmVjdGVkW25vZGVPcmRpbmFsMlBvc3RPcmRlckluZGV4W2NoaWxkTm9kZU9yZGluYWxdXT0xO319fX0KY29uc3QgZG9taW5hdG9yc1RyZWU9bmV3IFVpbnQzMkFycmF5KG5vZGVzQ291bnQpO2ZvcihsZXQgcG9zdE9yZGVySW5kZXg9MCxsPWRvbWluYXRvcnMubGVuZ3RoO3Bvc3RPcmRlckluZGV4PGw7Kytwb3N0T3JkZXJJbmRleCl7bm9kZU9yZGluYWw9cG9zdE9yZGVySW5kZXgyTm9kZU9yZGluYWxbcG9zdE9yZGVySW5kZXhdO2RvbWluYXRvcnNUcmVlW25vZGVPcmRpbmFsXT1wb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbFtkb21pbmF0b3JzW3Bvc3RPcmRlckluZGV4XV07fQpyZXR1cm4gZG9taW5hdG9yc1RyZWU7fQpfY2FsY3VsYXRlUmV0YWluZWRTaXplcyhwb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbCl7Y29uc3Qgbm9kZUNvdW50PXRoaXMubm9kZUNvdW50O2NvbnN0IG5vZGVzPXRoaXMubm9kZXM7Y29uc3Qgbm9kZVNlbGZTaXplT2Zmc2V0PXRoaXMuX25vZGVTZWxmU2l6ZU9mZnNldDtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBkb21pbmF0b3JzVHJlZT10aGlzLl9kb21pbmF0b3JzVHJlZTtjb25zdCByZXRhaW5lZFNpemVzPXRoaXMuX3JldGFpbmVkU2l6ZXM7Zm9yKGxldCBub2RlT3JkaW5hbD0wO25vZGVPcmRpbmFsPG5vZGVDb3VudDsrK25vZGVPcmRpbmFsKQpyZXRhaW5lZFNpemVzW25vZGVPcmRpbmFsXT1ub2Rlc1tub2RlT3JkaW5hbCpub2RlRmllbGRDb3VudCtub2RlU2VsZlNpemVPZmZzZXRdO2ZvcihsZXQgcG9zdE9yZGVySW5kZXg9MDtwb3N0T3JkZXJJbmRleDxub2RlQ291bnQtMTsrK3Bvc3RPcmRlckluZGV4KXtjb25zdCBub2RlT3JkaW5hbD1wb3N0T3JkZXJJbmRleDJOb2RlT3JkaW5hbFtwb3N0T3JkZXJJbmRleF07Y29uc3QgZG9taW5hdG9yT3JkaW5hbD1kb21pbmF0b3JzVHJlZVtub2RlT3JkaW5hbF07cmV0YWluZWRTaXplc1tkb21pbmF0b3JPcmRpbmFsXSs9cmV0YWluZWRTaXplc1tub2RlT3JkaW5hbF07fX0KX2J1aWxkRG9taW5hdGVkTm9kZXMoKXtjb25zdCBpbmRleEFycmF5PXRoaXMuX2ZpcnN0RG9taW5hdGVkTm9kZUluZGV4O2NvbnN0IGRvbWluYXRlZE5vZGVzPXRoaXMuX2RvbWluYXRlZE5vZGVzO2NvbnN0IG5vZGVGaWVsZENvdW50PXRoaXMuX25vZGVGaWVsZENvdW50O2NvbnN0IGRvbWluYXRvcnNUcmVlPXRoaXMuX2RvbWluYXRvcnNUcmVlO2xldCBmcm9tTm9kZU9yZGluYWw9MDtsZXQgdG9Ob2RlT3JkaW5hbD10aGlzLm5vZGVDb3VudDtjb25zdCByb290Tm9kZU9yZGluYWw9dGhpcy5fcm9vdE5vZGVJbmRleC9ub2RlRmllbGRDb3VudDtpZihyb290Tm9kZU9yZGluYWw9PT1mcm9tTm9kZU9yZGluYWwpCmZyb21Ob2RlT3JkaW5hbD0xO2Vsc2UgaWYocm9vdE5vZGVPcmRpbmFsPT09dG9Ob2RlT3JkaW5hbC0xKQp0b05vZGVPcmRpbmFsPXRvTm9kZU9yZGluYWwtMTtlbHNlCnRocm93IG5ldyBFcnJvcignUm9vdCBub2RlIGlzIGV4cGVjdGVkIHRvIGJlIGVpdGhlciBmaXJzdCBvciBsYXN0Jyk7Zm9yKGxldCBub2RlT3JkaW5hbD1mcm9tTm9kZU9yZGluYWw7bm9kZU9yZGluYWw8dG9Ob2RlT3JkaW5hbDsrK25vZGVPcmRpbmFsKQorK2luZGV4QXJyYXlbZG9taW5hdG9yc1RyZWVbbm9kZU9yZGluYWxdXTtsZXQgZmlyc3REb21pbmF0ZWROb2RlSW5kZXg9MDtmb3IobGV0IGk9MCxsPXRoaXMubm9kZUNvdW50O2k8bDsrK2kpe2NvbnN0IGRvbWluYXRlZENvdW50PWRvbWluYXRlZE5vZGVzW2ZpcnN0RG9taW5hdGVkTm9kZUluZGV4XT1pbmRleEFycmF5W2ldO2luZGV4QXJyYXlbaV09Zmlyc3REb21pbmF0ZWROb2RlSW5kZXg7Zmlyc3REb21pbmF0ZWROb2RlSW5kZXgrPWRvbWluYXRlZENvdW50O30KaW5kZXhBcnJheVt0aGlzLm5vZGVDb3VudF09ZG9taW5hdGVkTm9kZXMubGVuZ3RoO2ZvcihsZXQgbm9kZU9yZGluYWw9ZnJvbU5vZGVPcmRpbmFsO25vZGVPcmRpbmFsPHRvTm9kZU9yZGluYWw7Kytub2RlT3JkaW5hbCl7Y29uc3QgZG9taW5hdG9yT3JkaW5hbD1kb21pbmF0b3JzVHJlZVtub2RlT3JkaW5hbF07bGV0IGRvbWluYXRlZFJlZkluZGV4PWluZGV4QXJyYXlbZG9taW5hdG9yT3JkaW5hbF07ZG9taW5hdGVkUmVmSW5kZXgrPSgtLWRvbWluYXRlZE5vZGVzW2RvbWluYXRlZFJlZkluZGV4XSk7ZG9taW5hdGVkTm9kZXNbZG9taW5hdGVkUmVmSW5kZXhdPW5vZGVPcmRpbmFsKm5vZGVGaWVsZENvdW50O319Cl9idWlsZFNhbXBsZXMoKXtjb25zdCBzYW1wbGVzPXRoaXMuX3Jhd1NhbXBsZXM7aWYoIXNhbXBsZXN8fCFzYW1wbGVzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IHNhbXBsZUNvdW50PXNhbXBsZXMubGVuZ3RoLzI7Y29uc3Qgc2l6ZUZvclJhbmdlPW5ldyBBcnJheShzYW1wbGVDb3VudCk7Y29uc3QgdGltZXN0YW1wcz1uZXcgQXJyYXkoc2FtcGxlQ291bnQpO2NvbnN0IGxhc3RBc3NpZ25lZElkcz1uZXcgQXJyYXkoc2FtcGxlQ291bnQpO2NvbnN0IHRpbWVzdGFtcE9mZnNldD10aGlzLl9tZXRhTm9kZS5zYW1wbGVfZmllbGRzLmluZGV4T2YoJ3RpbWVzdGFtcF91cycpO2NvbnN0IGxhc3RBc3NpZ25lZElkT2Zmc2V0PXRoaXMuX21ldGFOb2RlLnNhbXBsZV9maWVsZHMuaW5kZXhPZignbGFzdF9hc3NpZ25lZF9pZCcpO2ZvcihsZXQgaT0wO2k8c2FtcGxlQ291bnQ7aSsrKXtzaXplRm9yUmFuZ2VbaV09MDt0aW1lc3RhbXBzW2ldPShzYW1wbGVzWzIqaSt0aW1lc3RhbXBPZmZzZXRdKS8xMDAwO2xhc3RBc3NpZ25lZElkc1tpXT1zYW1wbGVzWzIqaStsYXN0QXNzaWduZWRJZE9mZnNldF07fQpjb25zdCBub2Rlcz10aGlzLm5vZGVzO2NvbnN0IG5vZGVzTGVuZ3RoPW5vZGVzLmxlbmd0aDtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBub2RlPXRoaXMucm9vdE5vZGUoKTtmb3IobGV0IG5vZGVJbmRleD0wO25vZGVJbmRleDxub2Rlc0xlbmd0aDtub2RlSW5kZXgrPW5vZGVGaWVsZENvdW50KXtub2RlLm5vZGVJbmRleD1ub2RlSW5kZXg7Y29uc3Qgbm9kZUlkPW5vZGUuaWQoKTtpZihub2RlSWQlMj09PTApCmNvbnRpbnVlO2NvbnN0IHJhbmdlSW5kZXg9bGFzdEFzc2lnbmVkSWRzLmxvd2VyQm91bmQobm9kZUlkKTtpZihyYW5nZUluZGV4PT09c2FtcGxlQ291bnQpe2NvbnRpbnVlO30Kc2l6ZUZvclJhbmdlW3JhbmdlSW5kZXhdKz1ub2RlLnNlbGZTaXplKCk7fQp0aGlzLl9zYW1wbGVzPW5ldyBIZWFwU25hcHNob3RNb2RlbC5TYW1wbGVzKHRpbWVzdGFtcHMsbGFzdEFzc2lnbmVkSWRzLHNpemVGb3JSYW5nZSk7fQpnZXRTYW1wbGVzKCl7cmV0dXJuIHRoaXMuX3NhbXBsZXM7fQpjYWxjdWxhdGVGbGFncygpe3Rocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7fQpjYWxjdWxhdGVTdGF0aXN0aWNzKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9CnVzZXJPYmplY3RzTWFwQW5kRmxhZygpe3Rocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7fQpjYWxjdWxhdGVTbmFwc2hvdERpZmYoYmFzZVNuYXBzaG90SWQsYmFzZVNuYXBzaG90QWdncmVnYXRlcyl7bGV0IHNuYXBzaG90RGlmZj10aGlzLl9zbmFwc2hvdERpZmZzW2Jhc2VTbmFwc2hvdElkXTtpZihzbmFwc2hvdERpZmYpCnJldHVybiBzbmFwc2hvdERpZmY7c25hcHNob3REaWZmPXt9O2NvbnN0IGFnZ3JlZ2F0ZXM9dGhpcy5hZ2dyZWdhdGVzKHRydWUsJ2FsbE9iamVjdHMnKTtmb3IoY29uc3QgY2xhc3NOYW1lIGluIGJhc2VTbmFwc2hvdEFnZ3JlZ2F0ZXMpe2NvbnN0IGJhc2VBZ2dyZWdhdGU9YmFzZVNuYXBzaG90QWdncmVnYXRlc1tjbGFzc05hbWVdO2NvbnN0IGRpZmY9dGhpcy5fY2FsY3VsYXRlRGlmZkZvckNsYXNzKGJhc2VBZ2dyZWdhdGUsYWdncmVnYXRlc1tjbGFzc05hbWVdKTtpZihkaWZmKQpzbmFwc2hvdERpZmZbY2xhc3NOYW1lXT1kaWZmO30KY29uc3QgZW1wdHlCYXNlQWdncmVnYXRlPW5ldyBIZWFwU25hcHNob3RNb2RlbC5BZ2dyZWdhdGVGb3JEaWZmKCk7Zm9yKGNvbnN0IGNsYXNzTmFtZSBpbiBhZ2dyZWdhdGVzKXtpZihjbGFzc05hbWUgaW4gYmFzZVNuYXBzaG90QWdncmVnYXRlcykKY29udGludWU7c25hcHNob3REaWZmW2NsYXNzTmFtZV09dGhpcy5fY2FsY3VsYXRlRGlmZkZvckNsYXNzKGVtcHR5QmFzZUFnZ3JlZ2F0ZSxhZ2dyZWdhdGVzW2NsYXNzTmFtZV0pO30KdGhpcy5fc25hcHNob3REaWZmc1tiYXNlU25hcHNob3RJZF09c25hcHNob3REaWZmO3JldHVybiBzbmFwc2hvdERpZmY7fQpfY2FsY3VsYXRlRGlmZkZvckNsYXNzKGJhc2VBZ2dyZWdhdGUsYWdncmVnYXRlKXtjb25zdCBiYXNlSWRzPWJhc2VBZ2dyZWdhdGUuaWRzO2NvbnN0IGJhc2VJbmRleGVzPWJhc2VBZ2dyZWdhdGUuaW5kZXhlcztjb25zdCBiYXNlU2VsZlNpemVzPWJhc2VBZ2dyZWdhdGUuc2VsZlNpemVzO2NvbnN0IGluZGV4ZXM9YWdncmVnYXRlP2FnZ3JlZ2F0ZS5pZHhzOltdO2xldCBpPTA7bGV0IGo9MDtjb25zdCBsPWJhc2VJZHMubGVuZ3RoO2NvbnN0IG09aW5kZXhlcy5sZW5ndGg7Y29uc3QgZGlmZj1uZXcgSGVhcFNuYXBzaG90TW9kZWwuRGlmZigpO2NvbnN0IG5vZGVCPXRoaXMuY3JlYXRlTm9kZShpbmRleGVzW2pdKTt3aGlsZShpPGwmJmo8bSl7Y29uc3Qgbm9kZUFJZD1iYXNlSWRzW2ldO2lmKG5vZGVBSWQ8bm9kZUIuaWQoKSl7ZGlmZi5kZWxldGVkSW5kZXhlcy5wdXNoKGJhc2VJbmRleGVzW2ldKTtkaWZmLnJlbW92ZWRDb3VudCsrO2RpZmYucmVtb3ZlZFNpemUrPWJhc2VTZWxmU2l6ZXNbaV07KytpO31lbHNlIGlmKG5vZGVBSWQ+bm9kZUIuaWQoKSl7ZGlmZi5hZGRlZEluZGV4ZXMucHVzaChpbmRleGVzW2pdKTtkaWZmLmFkZGVkQ291bnQrKztkaWZmLmFkZGVkU2l6ZSs9bm9kZUIuc2VsZlNpemUoKTtub2RlQi5ub2RlSW5kZXg9aW5kZXhlc1srK2pdO31lbHNleysraTtub2RlQi5ub2RlSW5kZXg9aW5kZXhlc1srK2pdO319CndoaWxlKGk8bCl7ZGlmZi5kZWxldGVkSW5kZXhlcy5wdXNoKGJhc2VJbmRleGVzW2ldKTtkaWZmLnJlbW92ZWRDb3VudCsrO2RpZmYucmVtb3ZlZFNpemUrPWJhc2VTZWxmU2l6ZXNbaV07KytpO30Kd2hpbGUoajxtKXtkaWZmLmFkZGVkSW5kZXhlcy5wdXNoKGluZGV4ZXNbal0pO2RpZmYuYWRkZWRDb3VudCsrO2RpZmYuYWRkZWRTaXplKz1ub2RlQi5zZWxmU2l6ZSgpO25vZGVCLm5vZGVJbmRleD1pbmRleGVzWysral07fQpkaWZmLmNvdW50RGVsdGE9ZGlmZi5hZGRlZENvdW50LWRpZmYucmVtb3ZlZENvdW50O2RpZmYuc2l6ZURlbHRhPWRpZmYuYWRkZWRTaXplLWRpZmYucmVtb3ZlZFNpemU7aWYoIWRpZmYuYWRkZWRDb3VudCYmIWRpZmYucmVtb3ZlZENvdW50KQpyZXR1cm4gbnVsbDtyZXR1cm4gZGlmZjt9Cl9ub2RlRm9yU25hcHNob3RPYmplY3RJZChzbmFwc2hvdE9iamVjdElkKXtmb3IobGV0IGl0PXRoaXMuX2FsbE5vZGVzKCk7aXQuaGFzTmV4dCgpO2l0Lm5leHQoKSl7aWYoaXQubm9kZS5pZCgpPT09c25hcHNob3RPYmplY3RJZCkKcmV0dXJuIGl0Lm5vZGU7fQpyZXR1cm4gbnVsbDt9Cm5vZGVDbGFzc05hbWUoc25hcHNob3RPYmplY3RJZCl7Y29uc3Qgbm9kZT10aGlzLl9ub2RlRm9yU25hcHNob3RPYmplY3RJZChzbmFwc2hvdE9iamVjdElkKTtpZihub2RlKQpyZXR1cm4gbm9kZS5jbGFzc05hbWUoKTtyZXR1cm4gbnVsbDt9Cmlkc09mT2JqZWN0c1dpdGhOYW1lKG5hbWUpe2NvbnN0IGlkcz1bXTtmb3IobGV0IGl0PXRoaXMuX2FsbE5vZGVzKCk7aXQuaGFzTmV4dCgpO2l0Lm5leHQoKSl7aWYoaXQuaXRlbSgpLm5hbWUoKT09PW5hbWUpCmlkcy5wdXNoKGl0Lml0ZW0oKS5pZCgpKTt9CnJldHVybiBpZHM7fQpjcmVhdGVFZGdlc1Byb3ZpZGVyKG5vZGVJbmRleCl7Y29uc3Qgbm9kZT10aGlzLmNyZWF0ZU5vZGUobm9kZUluZGV4KTtjb25zdCBmaWx0ZXI9dGhpcy5jb250YWlubWVudEVkZ2VzRmlsdGVyKCk7Y29uc3QgaW5kZXhQcm92aWRlcj1uZXcgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2VJbmRleFByb3ZpZGVyKHRoaXMpO3JldHVybiBuZXcgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2VzUHJvdmlkZXIodGhpcyxmaWx0ZXIsbm9kZS5lZGdlcygpLGluZGV4UHJvdmlkZXIpO30KY3JlYXRlRWRnZXNQcm92aWRlckZvclRlc3Qobm9kZUluZGV4LGZpbHRlcil7Y29uc3Qgbm9kZT10aGlzLmNyZWF0ZU5vZGUobm9kZUluZGV4KTtjb25zdCBpbmRleFByb3ZpZGVyPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90RWRnZUluZGV4UHJvdmlkZXIodGhpcyk7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90RWRnZXNQcm92aWRlcih0aGlzLGZpbHRlcixub2RlLmVkZ2VzKCksaW5kZXhQcm92aWRlcik7fQpyZXRhaW5pbmdFZGdlc0ZpbHRlcigpe3JldHVybiBudWxsO30KY29udGFpbm1lbnRFZGdlc0ZpbHRlcigpe3JldHVybiBudWxsO30KY3JlYXRlUmV0YWluaW5nRWRnZXNQcm92aWRlcihub2RlSW5kZXgpe2NvbnN0IG5vZGU9dGhpcy5jcmVhdGVOb2RlKG5vZGVJbmRleCk7Y29uc3QgZmlsdGVyPXRoaXMucmV0YWluaW5nRWRnZXNGaWx0ZXIoKTtjb25zdCBpbmRleFByb3ZpZGVyPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlSW5kZXhQcm92aWRlcih0aGlzKTtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RFZGdlc1Byb3ZpZGVyKHRoaXMsZmlsdGVyLG5vZGUucmV0YWluZXJzKCksaW5kZXhQcm92aWRlcik7fQpjcmVhdGVBZGRlZE5vZGVzUHJvdmlkZXIoYmFzZVNuYXBzaG90SWQsY2xhc3NOYW1lKXtjb25zdCBzbmFwc2hvdERpZmY9dGhpcy5fc25hcHNob3REaWZmc1tiYXNlU25hcHNob3RJZF07Y29uc3QgZGlmZkZvckNsYXNzPXNuYXBzaG90RGlmZltjbGFzc05hbWVdO3JldHVybiBuZXcgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdE5vZGVzUHJvdmlkZXIodGhpcyxkaWZmRm9yQ2xhc3MuYWRkZWRJbmRleGVzKTt9CmNyZWF0ZURlbGV0ZWROb2Rlc1Byb3ZpZGVyKG5vZGVJbmRleGVzKXtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3ROb2Rlc1Byb3ZpZGVyKHRoaXMsbm9kZUluZGV4ZXMpO30KY3JlYXRlTm9kZXNQcm92aWRlckZvckNsYXNzKGNsYXNzTmFtZSxub2RlRmlsdGVyKXtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3ROb2Rlc1Byb3ZpZGVyKHRoaXMsdGhpcy5hZ2dyZWdhdGVzV2l0aEZpbHRlcihub2RlRmlsdGVyKVtjbGFzc05hbWVdLmlkeHMpO30KX21heEpzTm9kZUlkKCl7Y29uc3Qgbm9kZUZpZWxkQ291bnQ9dGhpcy5fbm9kZUZpZWxkQ291bnQ7Y29uc3Qgbm9kZXM9dGhpcy5ub2Rlcztjb25zdCBub2Rlc0xlbmd0aD1ub2Rlcy5sZW5ndGg7bGV0IGlkPTA7Zm9yKGxldCBub2RlSW5kZXg9dGhpcy5fbm9kZUlkT2Zmc2V0O25vZGVJbmRleDxub2Rlc0xlbmd0aDtub2RlSW5kZXgrPW5vZGVGaWVsZENvdW50KXtjb25zdCBuZXh0SWQ9bm9kZXNbbm9kZUluZGV4XTtpZihuZXh0SWQlMj09PTApCmNvbnRpbnVlO2lmKGlkPG5leHRJZCkKaWQ9bmV4dElkO30KcmV0dXJuIGlkO30KdXBkYXRlU3RhdGljRGF0YSgpe3JldHVybiBuZXcgSGVhcFNuYXBzaG90TW9kZWwuU3RhdGljRGF0YSh0aGlzLm5vZGVDb3VudCx0aGlzLl9yb290Tm9kZUluZGV4LHRoaXMudG90YWxTaXplLHRoaXMuX21heEpzTm9kZUlkKCkpO319O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3QuQWdncmVnYXRlZEluZm87Y29uc3QgSGVhcFNuYXBzaG90TWV0YWluZm89Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVfZmllbGRzPVtdO3RoaXMubm9kZV90eXBlcz1bXTt0aGlzLmVkZ2VfZmllbGRzPVtdO3RoaXMuZWRnZV90eXBlcz1bXTt0aGlzLnRyYWNlX2Z1bmN0aW9uX2luZm9fZmllbGRzPVtdO3RoaXMudHJhY2Vfbm9kZV9maWVsZHM9W107dGhpcy5zYW1wbGVfZmllbGRzPVtdO3RoaXMudHlwZV9zdHJpbmdzPXt9O319O2NvbnN0IEhlYXBTbmFwc2hvdEhlYWRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudGl0bGU9Jyc7dGhpcy5tZXRhPW5ldyBIZWFwU25hcHNob3RNZXRhaW5mbygpO3RoaXMubm9kZV9jb3VudD0wO3RoaXMuZWRnZV9jb3VudD0wO3RoaXMudHJhY2VfZnVuY3Rpb25fY291bnQ9MDt9fTtIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbVByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKGl0ZXJhdG9yLGluZGV4UHJvdmlkZXIpe3RoaXMuX2l0ZXJhdG9yPWl0ZXJhdG9yO3RoaXMuX2luZGV4UHJvdmlkZXI9aW5kZXhQcm92aWRlcjt0aGlzLl9pc0VtcHR5PSFpdGVyYXRvci5oYXNOZXh0KCk7dGhpcy5faXRlcmF0aW9uT3JkZXI9bnVsbDt0aGlzLl9jdXJyZW50Q29tcGFyYXRvcj1udWxsO3RoaXMuX3NvcnRlZFByZWZpeExlbmd0aD0wO3RoaXMuX3NvcnRlZFN1ZmZpeExlbmd0aD0wO30KX2NyZWF0ZUl0ZXJhdGlvbk9yZGVyKCl7aWYodGhpcy5faXRlcmF0aW9uT3JkZXIpCnJldHVybjt0aGlzLl9pdGVyYXRpb25PcmRlcj1bXTtmb3IobGV0IGl0ZXJhdG9yPXRoaXMuX2l0ZXJhdG9yO2l0ZXJhdG9yLmhhc05leHQoKTtpdGVyYXRvci5uZXh0KCkpCnRoaXMuX2l0ZXJhdGlvbk9yZGVyLnB1c2goaXRlcmF0b3IuaXRlbSgpLml0ZW1JbmRleCgpKTt9CmlzRW1wdHkoKXtyZXR1cm4gdGhpcy5faXNFbXB0eTt9CnNlcmlhbGl6ZUl0ZW1zUmFuZ2UoYmVnaW4sZW5kKXt0aGlzLl9jcmVhdGVJdGVyYXRpb25PcmRlcigpO2lmKGJlZ2luPmVuZCkKdGhyb3cgbmV3IEVycm9yKCdTdGFydCBwb3NpdGlvbiA+IGVuZCBwb3NpdGlvbjogJytiZWdpbisnID4gJytlbmQpO2lmKGVuZD50aGlzLl9pdGVyYXRpb25PcmRlci5sZW5ndGgpCmVuZD10aGlzLl9pdGVyYXRpb25PcmRlci5sZW5ndGg7aWYodGhpcy5fc29ydGVkUHJlZml4TGVuZ3RoPGVuZCYmYmVnaW48dGhpcy5faXRlcmF0aW9uT3JkZXIubGVuZ3RoLXRoaXMuX3NvcnRlZFN1ZmZpeExlbmd0aCl7dGhpcy5zb3J0KHRoaXMuX2N1cnJlbnRDb21wYXJhdG9yLHRoaXMuX3NvcnRlZFByZWZpeExlbmd0aCx0aGlzLl9pdGVyYXRpb25PcmRlci5sZW5ndGgtMS10aGlzLl9zb3J0ZWRTdWZmaXhMZW5ndGgsYmVnaW4sZW5kLTEpO2lmKGJlZ2luPD10aGlzLl9zb3J0ZWRQcmVmaXhMZW5ndGgpCnRoaXMuX3NvcnRlZFByZWZpeExlbmd0aD1lbmQ7aWYoZW5kPj10aGlzLl9pdGVyYXRpb25PcmRlci5sZW5ndGgtdGhpcy5fc29ydGVkU3VmZml4TGVuZ3RoKQp0aGlzLl9zb3J0ZWRTdWZmaXhMZW5ndGg9dGhpcy5faXRlcmF0aW9uT3JkZXIubGVuZ3RoLWJlZ2luO30KbGV0IHBvc2l0aW9uPWJlZ2luO2NvbnN0IGNvdW50PWVuZC1iZWdpbjtjb25zdCByZXN1bHQ9bmV3IEFycmF5KGNvdW50KTtmb3IobGV0IGk9MDtpPGNvdW50OysraSl7Y29uc3QgaXRlbUluZGV4PXRoaXMuX2l0ZXJhdGlvbk9yZGVyW3Bvc2l0aW9uKytdO2NvbnN0IGl0ZW09dGhpcy5faW5kZXhQcm92aWRlci5pdGVtRm9ySW5kZXgoaXRlbUluZGV4KTtyZXN1bHRbaV09aXRlbS5zZXJpYWxpemUoKTt9CnJldHVybiBuZXcgSGVhcFNuYXBzaG90TW9kZWwuSXRlbXNSYW5nZShiZWdpbixlbmQsdGhpcy5faXRlcmF0aW9uT3JkZXIubGVuZ3RoLHJlc3VsdCk7fQpzb3J0QW5kUmV3aW5kKGNvbXBhcmF0b3Ipe3RoaXMuX2N1cnJlbnRDb21wYXJhdG9yPWNvbXBhcmF0b3I7dGhpcy5fc29ydGVkUHJlZml4TGVuZ3RoPTA7dGhpcy5fc29ydGVkU3VmZml4TGVuZ3RoPTA7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdEVkZ2VzUHJvdmlkZXI9Y2xhc3MgZXh0ZW5kcyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbVByb3ZpZGVye2NvbnN0cnVjdG9yKHNuYXBzaG90LGZpbHRlcixlZGdlc0l0ZXIsaW5kZXhQcm92aWRlcil7Y29uc3QgaXRlcj1maWx0ZXI/bmV3IEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RGaWx0ZXJlZEl0ZXJhdG9yKGVkZ2VzSXRlciwoZmlsdGVyKSk6ZWRnZXNJdGVyO3N1cGVyKGl0ZXIsaW5kZXhQcm92aWRlcik7dGhpcy5zbmFwc2hvdD1zbmFwc2hvdDt9CnNvcnQoY29tcGFyYXRvcixsZWZ0Qm91bmQscmlnaHRCb3VuZCx3aW5kb3dMZWZ0LHdpbmRvd1JpZ2h0KXtjb25zdCBmaWVsZE5hbWUxPWNvbXBhcmF0b3IuZmllbGROYW1lMTtjb25zdCBmaWVsZE5hbWUyPWNvbXBhcmF0b3IuZmllbGROYW1lMjtjb25zdCBhc2NlbmRpbmcxPWNvbXBhcmF0b3IuYXNjZW5kaW5nMTtjb25zdCBhc2NlbmRpbmcyPWNvbXBhcmF0b3IuYXNjZW5kaW5nMjtjb25zdCBlZGdlQT10aGlzLl9pdGVyYXRvci5pdGVtKCkuY2xvbmUoKTtjb25zdCBlZGdlQj1lZGdlQS5jbG9uZSgpO2NvbnN0IG5vZGVBPXRoaXMuc25hcHNob3QuY3JlYXRlTm9kZSgpO2NvbnN0IG5vZGVCPXRoaXMuc25hcHNob3QuY3JlYXRlTm9kZSgpO2Z1bmN0aW9uIGNvbXBhcmVFZGdlRmllbGROYW1lKGFzY2VuZGluZyxpbmRleEEsaW5kZXhCKXtlZGdlQS5lZGdlSW5kZXg9aW5kZXhBO2VkZ2VCLmVkZ2VJbmRleD1pbmRleEI7aWYoZWRnZUIubmFtZSgpPT09J19fcHJvdG9fXycpCnJldHVybi0xO2lmKGVkZ2VBLm5hbWUoKT09PSdfX3Byb3RvX18nKQpyZXR1cm4gMTtjb25zdCByZXN1bHQ9ZWRnZUEuaGFzU3RyaW5nTmFtZSgpPT09ZWRnZUIuaGFzU3RyaW5nTmFtZSgpPyhlZGdlQS5uYW1lKCk8ZWRnZUIubmFtZSgpPy0xOihlZGdlQS5uYW1lKCk+ZWRnZUIubmFtZSgpPzE6MCkpOihlZGdlQS5oYXNTdHJpbmdOYW1lKCk/LTE6MSk7cmV0dXJuIGFzY2VuZGluZz9yZXN1bHQ6LXJlc3VsdDt9CmZ1bmN0aW9uIGNvbXBhcmVOb2RlRmllbGQoZmllbGROYW1lLGFzY2VuZGluZyxpbmRleEEsaW5kZXhCKXtlZGdlQS5lZGdlSW5kZXg9aW5kZXhBO25vZGVBLm5vZGVJbmRleD1lZGdlQS5ub2RlSW5kZXgoKTtjb25zdCB2YWx1ZUE9bm9kZUFbZmllbGROYW1lXSgpO2VkZ2VCLmVkZ2VJbmRleD1pbmRleEI7bm9kZUIubm9kZUluZGV4PWVkZ2VCLm5vZGVJbmRleCgpO2NvbnN0IHZhbHVlQj1ub2RlQltmaWVsZE5hbWVdKCk7Y29uc3QgcmVzdWx0PXZhbHVlQTx2YWx1ZUI/LTE6KHZhbHVlQT52YWx1ZUI/MTowKTtyZXR1cm4gYXNjZW5kaW5nP3Jlc3VsdDotcmVzdWx0O30KZnVuY3Rpb24gY29tcGFyZUVkZ2VBbmROb2RlKGluZGV4QSxpbmRleEIpe2xldCByZXN1bHQ9Y29tcGFyZUVkZ2VGaWVsZE5hbWUoYXNjZW5kaW5nMSxpbmRleEEsaW5kZXhCKTtpZihyZXN1bHQ9PT0wKQpyZXN1bHQ9Y29tcGFyZU5vZGVGaWVsZChmaWVsZE5hbWUyLGFzY2VuZGluZzIsaW5kZXhBLGluZGV4Qik7aWYocmVzdWx0PT09MCkKcmV0dXJuIGluZGV4QS1pbmRleEI7cmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIGNvbXBhcmVOb2RlQW5kRWRnZShpbmRleEEsaW5kZXhCKXtsZXQgcmVzdWx0PWNvbXBhcmVOb2RlRmllbGQoZmllbGROYW1lMSxhc2NlbmRpbmcxLGluZGV4QSxpbmRleEIpO2lmKHJlc3VsdD09PTApCnJlc3VsdD1jb21wYXJlRWRnZUZpZWxkTmFtZShhc2NlbmRpbmcyLGluZGV4QSxpbmRleEIpO2lmKHJlc3VsdD09PTApCnJldHVybiBpbmRleEEtaW5kZXhCO3JldHVybiByZXN1bHQ7fQpmdW5jdGlvbiBjb21wYXJlTm9kZUFuZE5vZGUoaW5kZXhBLGluZGV4Qil7bGV0IHJlc3VsdD1jb21wYXJlTm9kZUZpZWxkKGZpZWxkTmFtZTEsYXNjZW5kaW5nMSxpbmRleEEsaW5kZXhCKTtpZihyZXN1bHQ9PT0wKQpyZXN1bHQ9Y29tcGFyZU5vZGVGaWVsZChmaWVsZE5hbWUyLGFzY2VuZGluZzIsaW5kZXhBLGluZGV4Qik7aWYocmVzdWx0PT09MCkKcmV0dXJuIGluZGV4QS1pbmRleEI7cmV0dXJuIHJlc3VsdDt9CmlmKGZpZWxkTmFtZTE9PT0nIWVkZ2VOYW1lJykKdGhpcy5faXRlcmF0aW9uT3JkZXIuc29ydFJhbmdlKGNvbXBhcmVFZGdlQW5kTm9kZSxsZWZ0Qm91bmQscmlnaHRCb3VuZCx3aW5kb3dMZWZ0LHdpbmRvd1JpZ2h0KTtlbHNlIGlmKGZpZWxkTmFtZTI9PT0nIWVkZ2VOYW1lJykKdGhpcy5faXRlcmF0aW9uT3JkZXIuc29ydFJhbmdlKGNvbXBhcmVOb2RlQW5kRWRnZSxsZWZ0Qm91bmQscmlnaHRCb3VuZCx3aW5kb3dMZWZ0LHdpbmRvd1JpZ2h0KTtlbHNlCnRoaXMuX2l0ZXJhdGlvbk9yZGVyLnNvcnRSYW5nZShjb21wYXJlTm9kZUFuZE5vZGUsbGVmdEJvdW5kLHJpZ2h0Qm91bmQsd2luZG93TGVmdCx3aW5kb3dSaWdodCk7fX07SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdE5vZGVzUHJvdmlkZXI9Y2xhc3MgZXh0ZW5kcyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SXRlbVByb3ZpZGVye2NvbnN0cnVjdG9yKHNuYXBzaG90LG5vZGVJbmRleGVzKXtjb25zdCBpbmRleFByb3ZpZGVyPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90Tm9kZUluZGV4UHJvdmlkZXIoc25hcHNob3QpO2NvbnN0IGl0PW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90SW5kZXhSYW5nZUl0ZXJhdG9yKGluZGV4UHJvdmlkZXIsbm9kZUluZGV4ZXMpO3N1cGVyKGl0LGluZGV4UHJvdmlkZXIpO3RoaXMuc25hcHNob3Q9c25hcHNob3Q7fQpub2RlUG9zaXRpb24oc25hcHNob3RPYmplY3RJZCl7dGhpcy5fY3JlYXRlSXRlcmF0aW9uT3JkZXIoKTtjb25zdCBub2RlPXRoaXMuc25hcHNob3QuY3JlYXRlTm9kZSgpO2xldCBpPTA7Zm9yKDtpPHRoaXMuX2l0ZXJhdGlvbk9yZGVyLmxlbmd0aDtpKyspe25vZGUubm9kZUluZGV4PXRoaXMuX2l0ZXJhdGlvbk9yZGVyW2ldO2lmKG5vZGUuaWQoKT09PXNuYXBzaG90T2JqZWN0SWQpCmJyZWFrO30KaWYoaT09PXRoaXMuX2l0ZXJhdGlvbk9yZGVyLmxlbmd0aCkKcmV0dXJuLTE7Y29uc3QgdGFyZ2V0Tm9kZUluZGV4PXRoaXMuX2l0ZXJhdGlvbk9yZGVyW2ldO2xldCBzbWFsbGVyQ291bnQ9MDtjb25zdCBjb21wYXJlPXRoaXMuX2J1aWxkQ29tcGFyZUZ1bmN0aW9uKHRoaXMuX2N1cnJlbnRDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPHRoaXMuX2l0ZXJhdGlvbk9yZGVyLmxlbmd0aDtpKyspe2lmKGNvbXBhcmUodGhpcy5faXRlcmF0aW9uT3JkZXJbaV0sdGFyZ2V0Tm9kZUluZGV4KTwwKQorK3NtYWxsZXJDb3VudDt9CnJldHVybiBzbWFsbGVyQ291bnQ7fQpfYnVpbGRDb21wYXJlRnVuY3Rpb24oY29tcGFyYXRvcil7Y29uc3Qgbm9kZUE9dGhpcy5zbmFwc2hvdC5jcmVhdGVOb2RlKCk7Y29uc3Qgbm9kZUI9dGhpcy5zbmFwc2hvdC5jcmVhdGVOb2RlKCk7Y29uc3QgZmllbGRBY2Nlc3NvcjE9bm9kZUFbY29tcGFyYXRvci5maWVsZE5hbWUxXTtjb25zdCBmaWVsZEFjY2Vzc29yMj1ub2RlQVtjb21wYXJhdG9yLmZpZWxkTmFtZTJdO2NvbnN0IGFzY2VuZGluZzE9Y29tcGFyYXRvci5hc2NlbmRpbmcxPzE6LTE7Y29uc3QgYXNjZW5kaW5nMj1jb21wYXJhdG9yLmFzY2VuZGluZzI/MTotMTtmdW5jdGlvbiBzb3J0QnlOb2RlRmllbGQoZmllbGRBY2Nlc3Nvcixhc2NlbmRpbmcpe2NvbnN0IHZhbHVlQT1maWVsZEFjY2Vzc29yLmNhbGwobm9kZUEpO2NvbnN0IHZhbHVlQj1maWVsZEFjY2Vzc29yLmNhbGwobm9kZUIpO3JldHVybiB2YWx1ZUE8dmFsdWVCPy1hc2NlbmRpbmc6KHZhbHVlQT52YWx1ZUI/YXNjZW5kaW5nOjApO30KZnVuY3Rpb24gc29ydEJ5Q29tcGFyYXRvcihpbmRleEEsaW5kZXhCKXtub2RlQS5ub2RlSW5kZXg9aW5kZXhBO25vZGVCLm5vZGVJbmRleD1pbmRleEI7bGV0IHJlc3VsdD1zb3J0QnlOb2RlRmllbGQoZmllbGRBY2Nlc3NvcjEsYXNjZW5kaW5nMSk7aWYocmVzdWx0PT09MCkKcmVzdWx0PXNvcnRCeU5vZGVGaWVsZChmaWVsZEFjY2Vzc29yMixhc2NlbmRpbmcyKTtyZXR1cm4gcmVzdWx0fHxpbmRleEEtaW5kZXhCO30KcmV0dXJuIHNvcnRCeUNvbXBhcmF0b3I7fQpzb3J0KGNvbXBhcmF0b3IsbGVmdEJvdW5kLHJpZ2h0Qm91bmQsd2luZG93TGVmdCx3aW5kb3dSaWdodCl7dGhpcy5faXRlcmF0aW9uT3JkZXIuc29ydFJhbmdlKHRoaXMuX2J1aWxkQ29tcGFyZUZ1bmN0aW9uKGNvbXBhcmF0b3IpLGxlZnRCb3VuZCxyaWdodEJvdW5kLHdpbmRvd0xlZnQsd2luZG93UmlnaHQpO319O0hlYXBTbmFwc2hvdFdvcmtlci5KU0hlYXBTbmFwc2hvdD1jbGFzcyBleHRlbmRzIEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3R7Y29uc3RydWN0b3IocHJvZmlsZSxwcm9ncmVzcyl7c3VwZXIocHJvZmlsZSxwcm9ncmVzcyk7dGhpcy5fbm9kZUZsYWdzPXtjYW5CZVF1ZXJpZWQ6MSxkZXRhY2hlZERPTVRyZWVOb2RlOjIscGFnZU9iamVjdDo0fTt0aGlzLl9sYXp5U3RyaW5nQ2FjaGU9e307dGhpcy5pbml0aWFsaXplKCk7fQpjcmVhdGVOb2RlKG5vZGVJbmRleCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSlNIZWFwU25hcHNob3ROb2RlKHRoaXMsbm9kZUluZGV4PT09dW5kZWZpbmVkPy0xOm5vZGVJbmRleCk7fQpjcmVhdGVFZGdlKGVkZ2VJbmRleCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSlNIZWFwU25hcHNob3RFZGdlKHRoaXMsZWRnZUluZGV4KTt9CmNyZWF0ZVJldGFpbmluZ0VkZ2UocmV0YWluZXJJbmRleCl7cmV0dXJuIG5ldyBIZWFwU25hcHNob3RXb3JrZXIuSlNIZWFwU25hcHNob3RSZXRhaW5lckVkZ2UodGhpcyxyZXRhaW5lckluZGV4KTt9CmNvbnRhaW5tZW50RWRnZXNGaWx0ZXIoKXtyZXR1cm4gZWRnZT0+IWVkZ2UuaXNJbnZpc2libGUoKTt9CnJldGFpbmluZ0VkZ2VzRmlsdGVyKCl7Y29uc3QgY29udGFpbm1lbnRFZGdlc0ZpbHRlcj10aGlzLmNvbnRhaW5tZW50RWRnZXNGaWx0ZXIoKTtmdW5jdGlvbiBmaWx0ZXIoZWRnZSl7cmV0dXJuIGNvbnRhaW5tZW50RWRnZXNGaWx0ZXIoZWRnZSkmJiFlZGdlLm5vZGUoKS5pc1Jvb3QoKSYmIWVkZ2UuaXNXZWFrKCk7fQpyZXR1cm4gZmlsdGVyO30KY2FsY3VsYXRlRmxhZ3MoKXt0aGlzLl9mbGFncz1uZXcgVWludDMyQXJyYXkodGhpcy5ub2RlQ291bnQpO3RoaXMuX21hcmtEZXRhY2hlZERPTVRyZWVOb2RlcygpO3RoaXMuX21hcmtRdWVyaWFibGVIZWFwT2JqZWN0cygpO3RoaXMuX21hcmtQYWdlT3duZWROb2RlcygpO30KY2FsY3VsYXRlRGlzdGFuY2VzKCl7ZnVuY3Rpb24gZmlsdGVyKG5vZGUsZWRnZSl7aWYobm9kZS5pc0hpZGRlbigpKQpyZXR1cm4gZWRnZS5uYW1lKCkhPT0nc2xvcHB5X2Z1bmN0aW9uX21hcCd8fG5vZGUucmF3TmFtZSgpIT09J3N5c3RlbSAvIE5hdGl2ZUNvbnRleHQnO2lmKG5vZGUuaXNBcnJheSgpKXtpZihub2RlLnJhd05hbWUoKSE9PScobWFwIGRlc2NyaXB0b3JzKScpCnJldHVybiB0cnVlO2NvbnN0IGluZGV4PWVkZ2UubmFtZSgpO3JldHVybiBpbmRleDwyfHwoaW5kZXglMykhPT0xO30KcmV0dXJuIHRydWU7fQpzdXBlci5jYWxjdWxhdGVEaXN0YW5jZXMoZmlsdGVyKTt9CmlzVXNlclJvb3Qobm9kZSl7cmV0dXJuIG5vZGUuaXNVc2VyUm9vdCgpfHxub2RlLmlzRG9jdW1lbnRET01UcmVlc1Jvb3QoKTt9CmZvckVhY2hSb290KGFjdGlvbix1c2VyUm9vdHNPbmx5KXtmdW5jdGlvbiBnZXRDaGlsZE5vZGVCeU5hbWUobm9kZSxuYW1lKXtmb3IobGV0IGl0ZXI9bm9kZS5lZGdlcygpO2l0ZXIuaGFzTmV4dCgpO2l0ZXIubmV4dCgpKXtjb25zdCBjaGlsZD1pdGVyLmVkZ2Uubm9kZSgpO2lmKGNoaWxkLm5hbWUoKT09PW5hbWUpCnJldHVybiBjaGlsZDt9CnJldHVybiBudWxsO30KY29uc3QgdmlzaXRlZE5vZGVzPXt9O2Z1bmN0aW9uIGRvQWN0aW9uKG5vZGUpe2NvbnN0IG9yZGluYWw9bm9kZS5vcmRpbmFsKCk7aWYoIXZpc2l0ZWROb2Rlc1tvcmRpbmFsXSl7YWN0aW9uKG5vZGUpO3Zpc2l0ZWROb2Rlc1tvcmRpbmFsXT10cnVlO319CmNvbnN0IGdjUm9vdHM9Z2V0Q2hpbGROb2RlQnlOYW1lKHRoaXMucm9vdE5vZGUoKSwnKEdDIHJvb3RzKScpO2lmKCFnY1Jvb3RzKQpyZXR1cm47aWYodXNlclJvb3RzT25seSl7Zm9yKGxldCBpdGVyPXRoaXMucm9vdE5vZGUoKS5lZGdlcygpO2l0ZXIuaGFzTmV4dCgpO2l0ZXIubmV4dCgpKXtjb25zdCBub2RlPWl0ZXIuZWRnZS5ub2RlKCk7aWYodGhpcy5pc1VzZXJSb290KG5vZGUpKQpkb0FjdGlvbihub2RlKTt9fWVsc2V7Zm9yKGxldCBpdGVyPWdjUm9vdHMuZWRnZXMoKTtpdGVyLmhhc05leHQoKTtpdGVyLm5leHQoKSl7Y29uc3Qgc3ViUm9vdD1pdGVyLmVkZ2Uubm9kZSgpO2ZvcihsZXQgaXRlcjI9c3ViUm9vdC5lZGdlcygpO2l0ZXIyLmhhc05leHQoKTtpdGVyMi5uZXh0KCkpCmRvQWN0aW9uKGl0ZXIyLmVkZ2Uubm9kZSgpKTtkb0FjdGlvbihzdWJSb290KTt9CmZvcihsZXQgaXRlcj10aGlzLnJvb3ROb2RlKCkuZWRnZXMoKTtpdGVyLmhhc05leHQoKTtpdGVyLm5leHQoKSkKZG9BY3Rpb24oaXRlci5lZGdlLm5vZGUoKSk7fX0KdXNlck9iamVjdHNNYXBBbmRGbGFnKCl7cmV0dXJue21hcDp0aGlzLl9mbGFncyxmbGFnOnRoaXMuX25vZGVGbGFncy5wYWdlT2JqZWN0fTt9Cl9mbGFnc09mTm9kZShub2RlKXtyZXR1cm4gdGhpcy5fZmxhZ3Nbbm9kZS5ub2RlSW5kZXgvdGhpcy5fbm9kZUZpZWxkQ291bnRdO30KX21hcmtEZXRhY2hlZERPTVRyZWVOb2Rlcygpe2NvbnN0IG5vZGVzPXRoaXMubm9kZXM7Y29uc3Qgbm9kZXNMZW5ndGg9bm9kZXMubGVuZ3RoO2NvbnN0IG5vZGVGaWVsZENvdW50PXRoaXMuX25vZGVGaWVsZENvdW50O2NvbnN0IG5vZGVOYXRpdmVUeXBlPXRoaXMuX25vZGVOYXRpdmVUeXBlO2NvbnN0IG5vZGVUeXBlT2Zmc2V0PXRoaXMuX25vZGVUeXBlT2Zmc2V0O2NvbnN0IGZsYWc9dGhpcy5fbm9kZUZsYWdzLmRldGFjaGVkRE9NVHJlZU5vZGU7Y29uc3Qgbm9kZT10aGlzLnJvb3ROb2RlKCk7Zm9yKGxldCBub2RlSW5kZXg9MCxvcmRpbmFsPTA7bm9kZUluZGV4PG5vZGVzTGVuZ3RoO25vZGVJbmRleCs9bm9kZUZpZWxkQ291bnQsb3JkaW5hbCsrKXtjb25zdCBub2RlVHlwZT1ub2Rlc1tub2RlSW5kZXgrbm9kZVR5cGVPZmZzZXRdO2lmKG5vZGVUeXBlIT09bm9kZU5hdGl2ZVR5cGUpCmNvbnRpbnVlO25vZGUubm9kZUluZGV4PW5vZGVJbmRleDtpZihub2RlLm5hbWUoKS5zdGFydHNXaXRoKCdEZXRhY2hlZCAnKSkKdGhpcy5fZmxhZ3Nbb3JkaW5hbF18PWZsYWc7fX0KX21hcmtRdWVyaWFibGVIZWFwT2JqZWN0cygpe2NvbnN0IGZsYWc9dGhpcy5fbm9kZUZsYWdzLmNhbkJlUXVlcmllZDtjb25zdCBoaWRkZW5FZGdlVHlwZT10aGlzLl9lZGdlSGlkZGVuVHlwZTtjb25zdCBpbnRlcm5hbEVkZ2VUeXBlPXRoaXMuX2VkZ2VJbnRlcm5hbFR5cGU7Y29uc3QgaW52aXNpYmxlRWRnZVR5cGU9dGhpcy5fZWRnZUludmlzaWJsZVR5cGU7Y29uc3Qgd2Vha0VkZ2VUeXBlPXRoaXMuX2VkZ2VXZWFrVHlwZTtjb25zdCBlZGdlVG9Ob2RlT2Zmc2V0PXRoaXMuX2VkZ2VUb05vZGVPZmZzZXQ7Y29uc3QgZWRnZVR5cGVPZmZzZXQ9dGhpcy5fZWRnZVR5cGVPZmZzZXQ7Y29uc3QgZWRnZUZpZWxkc0NvdW50PXRoaXMuX2VkZ2VGaWVsZHNDb3VudDtjb25zdCBjb250YWlubWVudEVkZ2VzPXRoaXMuY29udGFpbm1lbnRFZGdlcztjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBmaXJzdEVkZ2VJbmRleGVzPXRoaXMuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3QgZmxhZ3M9dGhpcy5fZmxhZ3M7Y29uc3QgbGlzdD1bXTtmb3IobGV0IGl0ZXI9dGhpcy5yb290Tm9kZSgpLmVkZ2VzKCk7aXRlci5oYXNOZXh0KCk7aXRlci5uZXh0KCkpe2lmKGl0ZXIuZWRnZS5ub2RlKCkuaXNVc2VyUm9vdCgpKQpsaXN0LnB1c2goaXRlci5lZGdlLm5vZGUoKS5ub2RlSW5kZXgvbm9kZUZpZWxkQ291bnQpO30Kd2hpbGUobGlzdC5sZW5ndGgpe2NvbnN0IG5vZGVPcmRpbmFsPWxpc3QucG9wKCk7aWYoZmxhZ3Nbbm9kZU9yZGluYWxdJmZsYWcpCmNvbnRpbnVlO2ZsYWdzW25vZGVPcmRpbmFsXXw9ZmxhZztjb25zdCBiZWdpbkVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsXTtjb25zdCBlbmRFZGdlSW5kZXg9Zmlyc3RFZGdlSW5kZXhlc1tub2RlT3JkaW5hbCsxXTtmb3IobGV0IGVkZ2VJbmRleD1iZWdpbkVkZ2VJbmRleDtlZGdlSW5kZXg8ZW5kRWRnZUluZGV4O2VkZ2VJbmRleCs9ZWRnZUZpZWxkc0NvdW50KXtjb25zdCBjaGlsZE5vZGVJbmRleD1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVG9Ob2RlT2Zmc2V0XTtjb25zdCBjaGlsZE5vZGVPcmRpbmFsPWNoaWxkTm9kZUluZGV4L25vZGVGaWVsZENvdW50O2lmKGZsYWdzW2NoaWxkTm9kZU9yZGluYWxdJmZsYWcpCmNvbnRpbnVlO2NvbnN0IHR5cGU9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVR5cGVPZmZzZXRdO2lmKHR5cGU9PT1oaWRkZW5FZGdlVHlwZXx8dHlwZT09PWludmlzaWJsZUVkZ2VUeXBlfHx0eXBlPT09aW50ZXJuYWxFZGdlVHlwZXx8dHlwZT09PXdlYWtFZGdlVHlwZSkKY29udGludWU7bGlzdC5wdXNoKGNoaWxkTm9kZU9yZGluYWwpO319fQpfbWFya1BhZ2VPd25lZE5vZGVzKCl7Y29uc3QgZWRnZVNob3J0Y3V0VHlwZT10aGlzLl9lZGdlU2hvcnRjdXRUeXBlO2NvbnN0IGVkZ2VFbGVtZW50VHlwZT10aGlzLl9lZGdlRWxlbWVudFR5cGU7Y29uc3QgZWRnZVRvTm9kZU9mZnNldD10aGlzLl9lZGdlVG9Ob2RlT2Zmc2V0O2NvbnN0IGVkZ2VUeXBlT2Zmc2V0PXRoaXMuX2VkZ2VUeXBlT2Zmc2V0O2NvbnN0IGVkZ2VGaWVsZHNDb3VudD10aGlzLl9lZGdlRmllbGRzQ291bnQ7Y29uc3QgZWRnZVdlYWtUeXBlPXRoaXMuX2VkZ2VXZWFrVHlwZTtjb25zdCBmaXJzdEVkZ2VJbmRleGVzPXRoaXMuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3QgY29udGFpbm1lbnRFZGdlcz10aGlzLmNvbnRhaW5tZW50RWRnZXM7Y29uc3Qgbm9kZUZpZWxkQ291bnQ9dGhpcy5fbm9kZUZpZWxkQ291bnQ7Y29uc3Qgbm9kZXNDb3VudD10aGlzLm5vZGVDb3VudDtjb25zdCBmbGFncz10aGlzLl9mbGFncztjb25zdCBwYWdlT2JqZWN0RmxhZz10aGlzLl9ub2RlRmxhZ3MucGFnZU9iamVjdDtjb25zdCBub2Rlc1RvVmlzaXQ9bmV3IFVpbnQzMkFycmF5KG5vZGVzQ291bnQpO2xldCBub2Rlc1RvVmlzaXRMZW5ndGg9MDtjb25zdCByb290Tm9kZU9yZGluYWw9dGhpcy5fcm9vdE5vZGVJbmRleC9ub2RlRmllbGRDb3VudDtjb25zdCBub2RlPXRoaXMucm9vdE5vZGUoKTtmb3IobGV0IGVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW3Jvb3ROb2RlT3JkaW5hbF0sZW5kRWRnZUluZGV4PWZpcnN0RWRnZUluZGV4ZXNbcm9vdE5vZGVPcmRpbmFsKzFdO2VkZ2VJbmRleDxlbmRFZGdlSW5kZXg7ZWRnZUluZGV4Kz1lZGdlRmllbGRzQ291bnQpe2NvbnN0IGVkZ2VUeXBlPWNvbnRhaW5tZW50RWRnZXNbZWRnZUluZGV4K2VkZ2VUeXBlT2Zmc2V0XTtjb25zdCBub2RlSW5kZXg9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVRvTm9kZU9mZnNldF07aWYoZWRnZVR5cGU9PT1lZGdlRWxlbWVudFR5cGUpe25vZGUubm9kZUluZGV4PW5vZGVJbmRleDtpZighbm9kZS5pc0RvY3VtZW50RE9NVHJlZXNSb290KCkpCmNvbnRpbnVlO31lbHNlIGlmKGVkZ2VUeXBlIT09ZWRnZVNob3J0Y3V0VHlwZSl7Y29udGludWU7fQpjb25zdCBub2RlT3JkaW5hbD1ub2RlSW5kZXgvbm9kZUZpZWxkQ291bnQ7bm9kZXNUb1Zpc2l0W25vZGVzVG9WaXNpdExlbmd0aCsrXT1ub2RlT3JkaW5hbDtmbGFnc1tub2RlT3JkaW5hbF18PXBhZ2VPYmplY3RGbGFnO30Kd2hpbGUobm9kZXNUb1Zpc2l0TGVuZ3RoKXtjb25zdCBub2RlT3JkaW5hbD1ub2Rlc1RvVmlzaXRbLS1ub2Rlc1RvVmlzaXRMZW5ndGhdO2NvbnN0IGJlZ2luRWRnZUluZGV4PWZpcnN0RWRnZUluZGV4ZXNbbm9kZU9yZGluYWxdO2NvbnN0IGVuZEVkZ2VJbmRleD1maXJzdEVkZ2VJbmRleGVzW25vZGVPcmRpbmFsKzFdO2ZvcihsZXQgZWRnZUluZGV4PWJlZ2luRWRnZUluZGV4O2VkZ2VJbmRleDxlbmRFZGdlSW5kZXg7ZWRnZUluZGV4Kz1lZGdlRmllbGRzQ291bnQpe2NvbnN0IGNoaWxkTm9kZUluZGV4PWNvbnRhaW5tZW50RWRnZXNbZWRnZUluZGV4K2VkZ2VUb05vZGVPZmZzZXRdO2NvbnN0IGNoaWxkTm9kZU9yZGluYWw9Y2hpbGROb2RlSW5kZXgvbm9kZUZpZWxkQ291bnQ7aWYoZmxhZ3NbY2hpbGROb2RlT3JkaW5hbF0mcGFnZU9iamVjdEZsYWcpCmNvbnRpbnVlO2NvbnN0IHR5cGU9Y29udGFpbm1lbnRFZGdlc1tlZGdlSW5kZXgrZWRnZVR5cGVPZmZzZXRdO2lmKHR5cGU9PT1lZGdlV2Vha1R5cGUpCmNvbnRpbnVlO25vZGVzVG9WaXNpdFtub2Rlc1RvVmlzaXRMZW5ndGgrK109Y2hpbGROb2RlT3JkaW5hbDtmbGFnc1tjaGlsZE5vZGVPcmRpbmFsXXw9cGFnZU9iamVjdEZsYWc7fX19CmNhbGN1bGF0ZVN0YXRpc3RpY3MoKXtjb25zdCBub2RlRmllbGRDb3VudD10aGlzLl9ub2RlRmllbGRDb3VudDtjb25zdCBub2Rlcz10aGlzLm5vZGVzO2NvbnN0IG5vZGVzTGVuZ3RoPW5vZGVzLmxlbmd0aDtjb25zdCBub2RlVHlwZU9mZnNldD10aGlzLl9ub2RlVHlwZU9mZnNldDtjb25zdCBub2RlU2l6ZU9mZnNldD10aGlzLl9ub2RlU2VsZlNpemVPZmZzZXQ7Y29uc3Qgbm9kZU5hdGl2ZVR5cGU9dGhpcy5fbm9kZU5hdGl2ZVR5cGU7Y29uc3Qgbm9kZUNvZGVUeXBlPXRoaXMuX25vZGVDb2RlVHlwZTtjb25zdCBub2RlQ29uc1N0cmluZ1R5cGU9dGhpcy5fbm9kZUNvbnNTdHJpbmdUeXBlO2NvbnN0IG5vZGVTbGljZWRTdHJpbmdUeXBlPXRoaXMuX25vZGVTbGljZWRTdHJpbmdUeXBlO2NvbnN0IGRpc3RhbmNlcz10aGlzLl9ub2RlRGlzdGFuY2VzO2xldCBzaXplTmF0aXZlPTA7bGV0IHNpemVDb2RlPTA7bGV0IHNpemVTdHJpbmdzPTA7bGV0IHNpemVKU0FycmF5cz0wO2xldCBzaXplU3lzdGVtPTA7Y29uc3Qgbm9kZT10aGlzLnJvb3ROb2RlKCk7Zm9yKGxldCBub2RlSW5kZXg9MDtub2RlSW5kZXg8bm9kZXNMZW5ndGg7bm9kZUluZGV4Kz1ub2RlRmllbGRDb3VudCl7Y29uc3Qgbm9kZVNpemU9bm9kZXNbbm9kZUluZGV4K25vZGVTaXplT2Zmc2V0XTtjb25zdCBvcmRpbmFsPW5vZGVJbmRleC9ub2RlRmllbGRDb3VudDtpZihkaXN0YW5jZXNbb3JkaW5hbF0+PUhlYXBTbmFwc2hvdE1vZGVsLmJhc2VTeXN0ZW1EaXN0YW5jZSl7c2l6ZVN5c3RlbSs9bm9kZVNpemU7Y29udGludWU7fQpjb25zdCBub2RlVHlwZT1ub2Rlc1tub2RlSW5kZXgrbm9kZVR5cGVPZmZzZXRdO25vZGUubm9kZUluZGV4PW5vZGVJbmRleDtpZihub2RlVHlwZT09PW5vZGVOYXRpdmVUeXBlKQpzaXplTmF0aXZlKz1ub2RlU2l6ZTtlbHNlIGlmKG5vZGVUeXBlPT09bm9kZUNvZGVUeXBlKQpzaXplQ29kZSs9bm9kZVNpemU7ZWxzZSBpZihub2RlVHlwZT09PW5vZGVDb25zU3RyaW5nVHlwZXx8bm9kZVR5cGU9PT1ub2RlU2xpY2VkU3RyaW5nVHlwZXx8bm9kZS50eXBlKCk9PT0nc3RyaW5nJykKc2l6ZVN0cmluZ3MrPW5vZGVTaXplO2Vsc2UgaWYobm9kZS5uYW1lKCk9PT0nQXJyYXknKQpzaXplSlNBcnJheXMrPXRoaXMuX2NhbGN1bGF0ZUFycmF5U2l6ZShub2RlKTt9CnRoaXMuX3N0YXRpc3RpY3M9bmV3IEhlYXBTbmFwc2hvdE1vZGVsLlN0YXRpc3RpY3MoKTt0aGlzLl9zdGF0aXN0aWNzLnRvdGFsPXRoaXMudG90YWxTaXplO3RoaXMuX3N0YXRpc3RpY3MudjhoZWFwPXRoaXMudG90YWxTaXplLXNpemVOYXRpdmU7dGhpcy5fc3RhdGlzdGljcy5uYXRpdmU9c2l6ZU5hdGl2ZTt0aGlzLl9zdGF0aXN0aWNzLmNvZGU9c2l6ZUNvZGU7dGhpcy5fc3RhdGlzdGljcy5qc0FycmF5cz1zaXplSlNBcnJheXM7dGhpcy5fc3RhdGlzdGljcy5zdHJpbmdzPXNpemVTdHJpbmdzO3RoaXMuX3N0YXRpc3RpY3Muc3lzdGVtPXNpemVTeXN0ZW07fQpfY2FsY3VsYXRlQXJyYXlTaXplKG5vZGUpe2xldCBzaXplPW5vZGUuc2VsZlNpemUoKTtjb25zdCBiZWdpbkVkZ2VJbmRleD1ub2RlLmVkZ2VJbmRleGVzU3RhcnQoKTtjb25zdCBlbmRFZGdlSW5kZXg9bm9kZS5lZGdlSW5kZXhlc0VuZCgpO2NvbnN0IGNvbnRhaW5tZW50RWRnZXM9dGhpcy5jb250YWlubWVudEVkZ2VzO2NvbnN0IHN0cmluZ3M9dGhpcy5zdHJpbmdzO2NvbnN0IGVkZ2VUb05vZGVPZmZzZXQ9dGhpcy5fZWRnZVRvTm9kZU9mZnNldDtjb25zdCBlZGdlVHlwZU9mZnNldD10aGlzLl9lZGdlVHlwZU9mZnNldDtjb25zdCBlZGdlTmFtZU9mZnNldD10aGlzLl9lZGdlTmFtZU9mZnNldDtjb25zdCBlZGdlRmllbGRzQ291bnQ9dGhpcy5fZWRnZUZpZWxkc0NvdW50O2NvbnN0IGVkZ2VJbnRlcm5hbFR5cGU9dGhpcy5fZWRnZUludGVybmFsVHlwZTtmb3IobGV0IGVkZ2VJbmRleD1iZWdpbkVkZ2VJbmRleDtlZGdlSW5kZXg8ZW5kRWRnZUluZGV4O2VkZ2VJbmRleCs9ZWRnZUZpZWxkc0NvdW50KXtjb25zdCBlZGdlVHlwZT1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVHlwZU9mZnNldF07aWYoZWRnZVR5cGUhPT1lZGdlSW50ZXJuYWxUeXBlKQpjb250aW51ZTtjb25zdCBlZGdlTmFtZT1zdHJpbmdzW2NvbnRhaW5tZW50RWRnZXNbZWRnZUluZGV4K2VkZ2VOYW1lT2Zmc2V0XV07aWYoZWRnZU5hbWUhPT0nZWxlbWVudHMnKQpjb250aW51ZTtjb25zdCBlbGVtZW50c05vZGVJbmRleD1jb250YWlubWVudEVkZ2VzW2VkZ2VJbmRleCtlZGdlVG9Ob2RlT2Zmc2V0XTtub2RlLm5vZGVJbmRleD1lbGVtZW50c05vZGVJbmRleDtpZihub2RlLnJldGFpbmVyc0NvdW50KCk9PT0xKQpzaXplKz1ub2RlLnNlbGZTaXplKCk7YnJlYWs7fQpyZXR1cm4gc2l6ZTt9CmdldFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5fc3RhdGlzdGljczt9fTtIZWFwU25hcHNob3RXb3JrZXIuSlNIZWFwU25hcHNob3ROb2RlPWNsYXNzIGV4dGVuZHMgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdE5vZGV7Y29uc3RydWN0b3Ioc25hcHNob3Qsbm9kZUluZGV4KXtzdXBlcihzbmFwc2hvdCxub2RlSW5kZXgpO30KY2FuQmVRdWVyaWVkKCl7Y29uc3QgZmxhZ3M9dGhpcy5fc25hcHNob3QuX2ZsYWdzT2ZOb2RlKHRoaXMpO3JldHVybiEhKGZsYWdzJnRoaXMuX3NuYXBzaG90Ll9ub2RlRmxhZ3MuY2FuQmVRdWVyaWVkKTt9CnJhd05hbWUoKXtyZXR1cm4gc3VwZXIubmFtZSgpO30KbmFtZSgpe2NvbnN0IHNuYXBzaG90PXRoaXMuX3NuYXBzaG90O2lmKHRoaXMucmF3VHlwZSgpPT09c25hcHNob3QuX25vZGVDb25zU3RyaW5nVHlwZSl7bGV0IHN0cmluZz1zbmFwc2hvdC5fbGF6eVN0cmluZ0NhY2hlW3RoaXMubm9kZUluZGV4XTtpZih0eXBlb2Ygc3RyaW5nPT09J3VuZGVmaW5lZCcpe3N0cmluZz10aGlzLl9jb25zU3RyaW5nTmFtZSgpO3NuYXBzaG90Ll9sYXp5U3RyaW5nQ2FjaGVbdGhpcy5ub2RlSW5kZXhdPXN0cmluZzt9CnJldHVybiBzdHJpbmc7fQpyZXR1cm4gdGhpcy5yYXdOYW1lKCk7fQpfY29uc1N0cmluZ05hbWUoKXtjb25zdCBzbmFwc2hvdD10aGlzLl9zbmFwc2hvdDtjb25zdCBjb25zU3RyaW5nVHlwZT1zbmFwc2hvdC5fbm9kZUNvbnNTdHJpbmdUeXBlO2NvbnN0IGVkZ2VJbnRlcm5hbFR5cGU9c25hcHNob3QuX2VkZ2VJbnRlcm5hbFR5cGU7Y29uc3QgZWRnZUZpZWxkc0NvdW50PXNuYXBzaG90Ll9lZGdlRmllbGRzQ291bnQ7Y29uc3QgZWRnZVRvTm9kZU9mZnNldD1zbmFwc2hvdC5fZWRnZVRvTm9kZU9mZnNldDtjb25zdCBlZGdlVHlwZU9mZnNldD1zbmFwc2hvdC5fZWRnZVR5cGVPZmZzZXQ7Y29uc3QgZWRnZU5hbWVPZmZzZXQ9c25hcHNob3QuX2VkZ2VOYW1lT2Zmc2V0O2NvbnN0IHN0cmluZ3M9c25hcHNob3Quc3RyaW5ncztjb25zdCBlZGdlcz1zbmFwc2hvdC5jb250YWlubWVudEVkZ2VzO2NvbnN0IGZpcnN0RWRnZUluZGV4ZXM9c25hcHNob3QuX2ZpcnN0RWRnZUluZGV4ZXM7Y29uc3Qgbm9kZUZpZWxkQ291bnQ9c25hcHNob3QuX25vZGVGaWVsZENvdW50O2NvbnN0IG5vZGVUeXBlT2Zmc2V0PXNuYXBzaG90Ll9ub2RlVHlwZU9mZnNldDtjb25zdCBub2RlTmFtZU9mZnNldD1zbmFwc2hvdC5fbm9kZU5hbWVPZmZzZXQ7Y29uc3Qgbm9kZXM9c25hcHNob3Qubm9kZXM7Y29uc3Qgbm9kZXNTdGFjaz1bXTtub2Rlc1N0YWNrLnB1c2godGhpcy5ub2RlSW5kZXgpO2xldCBuYW1lPScnO3doaWxlKG5vZGVzU3RhY2subGVuZ3RoJiZuYW1lLmxlbmd0aDwxMDI0KXtjb25zdCBub2RlSW5kZXg9bm9kZXNTdGFjay5wb3AoKTtpZihub2Rlc1tub2RlSW5kZXgrbm9kZVR5cGVPZmZzZXRdIT09Y29uc1N0cmluZ1R5cGUpe25hbWUrPXN0cmluZ3Nbbm9kZXNbbm9kZUluZGV4K25vZGVOYW1lT2Zmc2V0XV07Y29udGludWU7fQpjb25zdCBub2RlT3JkaW5hbD1ub2RlSW5kZXgvbm9kZUZpZWxkQ291bnQ7Y29uc3QgYmVnaW5FZGdlSW5kZXg9Zmlyc3RFZGdlSW5kZXhlc1tub2RlT3JkaW5hbF07Y29uc3QgZW5kRWRnZUluZGV4PWZpcnN0RWRnZUluZGV4ZXNbbm9kZU9yZGluYWwrMV07bGV0IGZpcnN0Tm9kZUluZGV4PTA7bGV0IHNlY29uZE5vZGVJbmRleD0wO2ZvcihsZXQgZWRnZUluZGV4PWJlZ2luRWRnZUluZGV4O2VkZ2VJbmRleDxlbmRFZGdlSW5kZXgmJighZmlyc3ROb2RlSW5kZXh8fCFzZWNvbmROb2RlSW5kZXgpO2VkZ2VJbmRleCs9ZWRnZUZpZWxkc0NvdW50KXtjb25zdCBlZGdlVHlwZT1lZGdlc1tlZGdlSW5kZXgrZWRnZVR5cGVPZmZzZXRdO2lmKGVkZ2VUeXBlPT09ZWRnZUludGVybmFsVHlwZSl7Y29uc3QgZWRnZU5hbWU9c3RyaW5nc1tlZGdlc1tlZGdlSW5kZXgrZWRnZU5hbWVPZmZzZXRdXTtpZihlZGdlTmFtZT09PSdmaXJzdCcpCmZpcnN0Tm9kZUluZGV4PWVkZ2VzW2VkZ2VJbmRleCtlZGdlVG9Ob2RlT2Zmc2V0XTtlbHNlIGlmKGVkZ2VOYW1lPT09J3NlY29uZCcpCnNlY29uZE5vZGVJbmRleD1lZGdlc1tlZGdlSW5kZXgrZWRnZVRvTm9kZU9mZnNldF07fX0Kbm9kZXNTdGFjay5wdXNoKHNlY29uZE5vZGVJbmRleCk7bm9kZXNTdGFjay5wdXNoKGZpcnN0Tm9kZUluZGV4KTt9CnJldHVybiBuYW1lO30KY2xhc3NOYW1lKCl7Y29uc3QgdHlwZT10aGlzLnR5cGUoKTtzd2l0Y2godHlwZSl7Y2FzZSdoaWRkZW4nOnJldHVybicoc3lzdGVtKSc7Y2FzZSdvYmplY3QnOmNhc2UnbmF0aXZlJzpyZXR1cm4gdGhpcy5uYW1lKCk7Y2FzZSdjb2RlJzpyZXR1cm4nKGNvbXBpbGVkIGNvZGUpJztkZWZhdWx0OnJldHVybicoJyt0eXBlKycpJzt9fQpjbGFzc0luZGV4KCl7Y29uc3Qgc25hcHNob3Q9dGhpcy5fc25hcHNob3Q7Y29uc3Qgbm9kZXM9c25hcHNob3Qubm9kZXM7Y29uc3QgdHlwZT1ub2Rlc1t0aGlzLm5vZGVJbmRleCtzbmFwc2hvdC5fbm9kZVR5cGVPZmZzZXRdO2lmKHR5cGU9PT1zbmFwc2hvdC5fbm9kZU9iamVjdFR5cGV8fHR5cGU9PT1zbmFwc2hvdC5fbm9kZU5hdGl2ZVR5cGUpCnJldHVybiBub2Rlc1t0aGlzLm5vZGVJbmRleCtzbmFwc2hvdC5fbm9kZU5hbWVPZmZzZXRdO3JldHVybi0xLXR5cGU7fQppZCgpe2NvbnN0IHNuYXBzaG90PXRoaXMuX3NuYXBzaG90O3JldHVybiBzbmFwc2hvdC5ub2Rlc1t0aGlzLm5vZGVJbmRleCtzbmFwc2hvdC5fbm9kZUlkT2Zmc2V0XTt9CmlzSGlkZGVuKCl7cmV0dXJuIHRoaXMucmF3VHlwZSgpPT09dGhpcy5fc25hcHNob3QuX25vZGVIaWRkZW5UeXBlO30KaXNBcnJheSgpe3JldHVybiB0aGlzLnJhd1R5cGUoKT09PXRoaXMuX3NuYXBzaG90Ll9ub2RlQXJyYXlUeXBlO30KaXNTeW50aGV0aWMoKXtyZXR1cm4gdGhpcy5yYXdUeXBlKCk9PT10aGlzLl9zbmFwc2hvdC5fbm9kZVN5bnRoZXRpY1R5cGU7fQppc1VzZXJSb290KCl7cmV0dXJuIXRoaXMuaXNTeW50aGV0aWMoKTt9CmlzRG9jdW1lbnRET01UcmVlc1Jvb3QoKXtyZXR1cm4gdGhpcy5pc1N5bnRoZXRpYygpJiZ0aGlzLm5hbWUoKT09PScoRG9jdW1lbnQgRE9NIHRyZWVzKSc7fQpzZXJpYWxpemUoKXtjb25zdCByZXN1bHQ9c3VwZXIuc2VyaWFsaXplKCk7Y29uc3QgZmxhZ3M9dGhpcy5fc25hcHNob3QuX2ZsYWdzT2ZOb2RlKHRoaXMpO2lmKGZsYWdzJnRoaXMuX3NuYXBzaG90Ll9ub2RlRmxhZ3MuY2FuQmVRdWVyaWVkKQpyZXN1bHQuY2FuQmVRdWVyaWVkPXRydWU7aWYoZmxhZ3MmdGhpcy5fc25hcHNob3QuX25vZGVGbGFncy5kZXRhY2hlZERPTVRyZWVOb2RlKQpyZXN1bHQuZGV0YWNoZWRET01UcmVlTm9kZT10cnVlO3JldHVybiByZXN1bHQ7fX07SGVhcFNuYXBzaG90V29ya2VyLkpTSGVhcFNuYXBzaG90RWRnZT1jbGFzcyBleHRlbmRzIEhlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RFZGdle2NvbnN0cnVjdG9yKHNuYXBzaG90LGVkZ2VJbmRleCl7c3VwZXIoc25hcHNob3QsZWRnZUluZGV4KTt9CmNsb25lKCl7Y29uc3Qgc25hcHNob3Q9KHRoaXMuX3NuYXBzaG90KTtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5KU0hlYXBTbmFwc2hvdEVkZ2Uoc25hcHNob3QsdGhpcy5lZGdlSW5kZXgpO30KaGFzU3RyaW5nTmFtZSgpe2lmKCF0aGlzLmlzU2hvcnRjdXQoKSkKcmV0dXJuIHRoaXMuX2hhc1N0cmluZ05hbWUoKTtyZXR1cm4gaXNOYU4ocGFyc2VJbnQodGhpcy5fbmFtZSgpLDEwKSk7fQppc0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5yYXdUeXBlKCk9PT10aGlzLl9zbmFwc2hvdC5fZWRnZUVsZW1lbnRUeXBlO30KaXNIaWRkZW4oKXtyZXR1cm4gdGhpcy5yYXdUeXBlKCk9PT10aGlzLl9zbmFwc2hvdC5fZWRnZUhpZGRlblR5cGU7fQppc1dlYWsoKXtyZXR1cm4gdGhpcy5yYXdUeXBlKCk9PT10aGlzLl9zbmFwc2hvdC5fZWRnZVdlYWtUeXBlO30KaXNJbnRlcm5hbCgpe3JldHVybiB0aGlzLnJhd1R5cGUoKT09PXRoaXMuX3NuYXBzaG90Ll9lZGdlSW50ZXJuYWxUeXBlO30KaXNJbnZpc2libGUoKXtyZXR1cm4gdGhpcy5yYXdUeXBlKCk9PT10aGlzLl9zbmFwc2hvdC5fZWRnZUludmlzaWJsZVR5cGU7fQppc1Nob3J0Y3V0KCl7cmV0dXJuIHRoaXMucmF3VHlwZSgpPT09dGhpcy5fc25hcHNob3QuX2VkZ2VTaG9ydGN1dFR5cGU7fQpuYW1lKCl7Y29uc3QgbmFtZT10aGlzLl9uYW1lKCk7aWYoIXRoaXMuaXNTaG9ydGN1dCgpKQpyZXR1cm4gU3RyaW5nKG5hbWUpO2NvbnN0IG51bU5hbWU9cGFyc2VJbnQobmFtZSwxMCk7cmV0dXJuIFN0cmluZyhpc05hTihudW1OYW1lKT9uYW1lOm51bU5hbWUpO30KdG9TdHJpbmcoKXtjb25zdCBuYW1lPXRoaXMubmFtZSgpO3N3aXRjaCh0aGlzLnR5cGUoKSl7Y2FzZSdjb250ZXh0JzpyZXR1cm4nLT4nK25hbWU7Y2FzZSdlbGVtZW50JzpyZXR1cm4nWycrbmFtZSsnXSc7Y2FzZSd3ZWFrJzpyZXR1cm4nW1snK25hbWUrJ11dJztjYXNlJ3Byb3BlcnR5JzpyZXR1cm4gbmFtZS5pbmRleE9mKCcgJyk9PT0tMT8nLicrbmFtZTonWyInK25hbWUrJyJdJztjYXNlJ3Nob3J0Y3V0JzppZih0eXBlb2YgbmFtZT09PSdzdHJpbmcnKQpyZXR1cm4gbmFtZS5pbmRleE9mKCcgJyk9PT0tMT8nLicrbmFtZTonWyInK25hbWUrJyJdJztlbHNlCnJldHVybidbJytuYW1lKyddJztjYXNlJ2ludGVybmFsJzpjYXNlJ2hpZGRlbic6Y2FzZSdpbnZpc2libGUnOnJldHVybid7JytuYW1lKyd9Jzt9CnJldHVybic/JytuYW1lKyc/Jzt9Cl9oYXNTdHJpbmdOYW1lKCl7Y29uc3QgdHlwZT10aGlzLnJhd1R5cGUoKTtjb25zdCBzbmFwc2hvdD10aGlzLl9zbmFwc2hvdDtyZXR1cm4gdHlwZSE9PXNuYXBzaG90Ll9lZGdlRWxlbWVudFR5cGUmJnR5cGUhPT1zbmFwc2hvdC5fZWRnZUhpZGRlblR5cGU7fQpfbmFtZSgpe3JldHVybiB0aGlzLl9oYXNTdHJpbmdOYW1lKCk/dGhpcy5fc25hcHNob3Quc3RyaW5nc1t0aGlzLl9uYW1lT3JJbmRleCgpXTp0aGlzLl9uYW1lT3JJbmRleCgpO30KX25hbWVPckluZGV4KCl7cmV0dXJuIHRoaXMuX2VkZ2VzW3RoaXMuZWRnZUluZGV4K3RoaXMuX3NuYXBzaG90Ll9lZGdlTmFtZU9mZnNldF07fQpyYXdUeXBlKCl7cmV0dXJuIHRoaXMuX2VkZ2VzW3RoaXMuZWRnZUluZGV4K3RoaXMuX3NuYXBzaG90Ll9lZGdlVHlwZU9mZnNldF07fX07SGVhcFNuYXBzaG90V29ya2VyLkpTSGVhcFNuYXBzaG90UmV0YWluZXJFZGdlPWNsYXNzIGV4dGVuZHMgSGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdFJldGFpbmVyRWRnZXtjb25zdHJ1Y3RvcihzbmFwc2hvdCxyZXRhaW5lckluZGV4KXtzdXBlcihzbmFwc2hvdCxyZXRhaW5lckluZGV4KTt9CmNsb25lKCl7Y29uc3Qgc25hcHNob3Q9KHRoaXMuX3NuYXBzaG90KTtyZXR1cm4gbmV3IEhlYXBTbmFwc2hvdFdvcmtlci5KU0hlYXBTbmFwc2hvdFJldGFpbmVyRWRnZShzbmFwc2hvdCx0aGlzLnJldGFpbmVySW5kZXgoKSk7fQppc0hpZGRlbigpe3JldHVybiB0aGlzLl9lZGdlKCkuaXNIaWRkZW4oKTt9CmlzSW50ZXJuYWwoKXtyZXR1cm4gdGhpcy5fZWRnZSgpLmlzSW50ZXJuYWwoKTt9CmlzSW52aXNpYmxlKCl7cmV0dXJuIHRoaXMuX2VkZ2UoKS5pc0ludmlzaWJsZSgpO30KaXNTaG9ydGN1dCgpe3JldHVybiB0aGlzLl9lZGdlKCkuaXNTaG9ydGN1dCgpO30KaXNXZWFrKCl7cmV0dXJuIHRoaXMuX2VkZ2UoKS5pc1dlYWsoKTt9fTsoZnVuY3Rpb24gZGlzYWJsZUxvZ2dpbmdGb3JUZXN0KCl7aWYoc2VsZi5SdW50aW1lJiZSdW50aW1lLnF1ZXJ5UGFyYW0oJ3Rlc3QnKSkKY29uc29sZS53YXJuPSgpPT51bmRlZmluZWQ7fSkoKTs7SGVhcFNuYXBzaG90V29ya2VyLkhlYXBTbmFwc2hvdExvYWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihkaXNwYXRjaGVyKXt0aGlzLl9yZXNldCgpO3RoaXMuX3Byb2dyZXNzPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90UHJvZ3Jlc3MoZGlzcGF0Y2hlcik7fQpkaXNwb3NlKCl7dGhpcy5fcmVzZXQoKTt9Cl9yZXNldCgpe3RoaXMuX2pzb249Jyc7dGhpcy5fc3RhdGU9J2ZpbmQtc25hcHNob3QtaW5mbyc7dGhpcy5fc25hcHNob3Q9e307fQpjbG9zZSgpe2lmKHRoaXMuX2pzb24pCnRoaXMuX3BhcnNlU3RyaW5nc0FycmF5KCk7fQpidWlsZFNuYXBzaG90KCl7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdQcm9jZXNzaW5nIHNuYXBzaG90XHUyMDI2Jyk7Y29uc3QgcmVzdWx0PW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSlNIZWFwU25hcHNob3QodGhpcy5fc25hcHNob3QsdGhpcy5fcHJvZ3Jlc3MpO3RoaXMuX3Jlc2V0KCk7cmV0dXJuIHJlc3VsdDt9Cl9wYXJzZVVpbnRBcnJheSgpe2xldCBpbmRleD0wO2NvbnN0IGNoYXIwPScwJy5jaGFyQ29kZUF0KDApO2NvbnN0IGNoYXI5PSc5Jy5jaGFyQ29kZUF0KDApO2NvbnN0IGNsb3NpbmdCcmFja2V0PSddJy5jaGFyQ29kZUF0KDApO2NvbnN0IGxlbmd0aD10aGlzLl9qc29uLmxlbmd0aDt3aGlsZSh0cnVlKXt3aGlsZShpbmRleDxsZW5ndGgpe2NvbnN0IGNvZGU9dGhpcy5fanNvbi5jaGFyQ29kZUF0KGluZGV4KTtpZihjaGFyMDw9Y29kZSYmY29kZTw9Y2hhcjkpe2JyZWFrO31lbHNlIGlmKGNvZGU9PT1jbG9zaW5nQnJhY2tldCl7dGhpcy5fanNvbj10aGlzLl9qc29uLnNsaWNlKGluZGV4KzEpO3JldHVybiBmYWxzZTt9CisraW5kZXg7fQppZihpbmRleD09PWxlbmd0aCl7dGhpcy5fanNvbj0nJztyZXR1cm4gdHJ1ZTt9CmxldCBuZXh0TnVtYmVyPTA7Y29uc3Qgc3RhcnRJbmRleD1pbmRleDt3aGlsZShpbmRleDxsZW5ndGgpe2NvbnN0IGNvZGU9dGhpcy5fanNvbi5jaGFyQ29kZUF0KGluZGV4KTtpZihjaGFyMD5jb2RlfHxjb2RlPmNoYXI5KQpicmVhaztuZXh0TnVtYmVyKj0xMDtuZXh0TnVtYmVyKz0oY29kZS1jaGFyMCk7KytpbmRleDt9CmlmKGluZGV4PT09bGVuZ3RoKXt0aGlzLl9qc29uPXRoaXMuX2pzb24uc2xpY2Uoc3RhcnRJbmRleCk7cmV0dXJuIHRydWU7fQp0aGlzLl9hcnJheVt0aGlzLl9hcnJheUluZGV4KytdPW5leHROdW1iZXI7fX0KX3BhcnNlU3RyaW5nc0FycmF5KCl7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdQYXJzaW5nIHN0cmluZ3NcdTIwMjYnKTtjb25zdCBjbG9zaW5nQnJhY2tldEluZGV4PXRoaXMuX2pzb24ubGFzdEluZGV4T2YoJ10nKTtpZihjbG9zaW5nQnJhY2tldEluZGV4PT09LTEpCnRocm93IG5ldyBFcnJvcignSW5jb21wbGV0ZSBKU09OJyk7dGhpcy5fanNvbj10aGlzLl9qc29uLnNsaWNlKDAsY2xvc2luZ0JyYWNrZXRJbmRleCsxKTt0aGlzLl9zbmFwc2hvdC5zdHJpbmdzPUpTT04ucGFyc2UodGhpcy5fanNvbik7fQp3cml0ZShjaHVuayl7aWYodGhpcy5fanNvbiE9PW51bGwpCnRoaXMuX2pzb24rPWNodW5rO3doaWxlKHRydWUpe3N3aXRjaCh0aGlzLl9zdGF0ZSl7Y2FzZSdmaW5kLXNuYXBzaG90LWluZm8nOntjb25zdCBzbmFwc2hvdFRva2VuPScic25hcHNob3QiJztjb25zdCBzbmFwc2hvdFRva2VuSW5kZXg9dGhpcy5fanNvbi5pbmRleE9mKHNuYXBzaG90VG9rZW4pO2lmKHNuYXBzaG90VG9rZW5JbmRleD09PS0xKQp0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IHRva2VuIG5vdCBmb3VuZCcpO2NvbnN0IGpzb249dGhpcy5fanNvbi5zbGljZShzbmFwc2hvdFRva2VuSW5kZXgrc25hcHNob3RUb2tlbi5sZW5ndGgrMSk7dGhpcy5fc3RhdGU9J3BhcnNlLXNuYXBzaG90LWluZm8nO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVN0YXR1cygnTG9hZGluZyBzbmFwc2hvdCBpbmZvXHUyMDI2Jyk7dGhpcy5fanNvbj1udWxsO3RoaXMuX2pzb25Ub2tlbml6ZXI9bmV3IFRleHRVdGlscy5UZXh0VXRpbHMuQmFsYW5jZWRKU09OVG9rZW5pemVyKHRoaXMuX3dyaXRlQmFsYW5jZWRKU09OLmJpbmQodGhpcykpO2NodW5rPWpzb247fQpjYXNlJ3BhcnNlLXNuYXBzaG90LWluZm8nOnt0aGlzLl9qc29uVG9rZW5pemVyLndyaXRlKGNodW5rKTtpZih0aGlzLl9qc29uVG9rZW5pemVyKQpyZXR1cm47YnJlYWs7fQpjYXNlJ2ZpbmQtbm9kZXMnOntjb25zdCBub2Rlc1Rva2VuPScibm9kZXMiJztjb25zdCBub2Rlc1Rva2VuSW5kZXg9dGhpcy5fanNvbi5pbmRleE9mKG5vZGVzVG9rZW4pO2lmKG5vZGVzVG9rZW5JbmRleD09PS0xKQpyZXR1cm47Y29uc3QgYnJhY2tldEluZGV4PXRoaXMuX2pzb24uaW5kZXhPZignWycsbm9kZXNUb2tlbkluZGV4KTtpZihicmFja2V0SW5kZXg9PT0tMSkKcmV0dXJuO3RoaXMuX2pzb249dGhpcy5fanNvbi5zbGljZShicmFja2V0SW5kZXgrMSk7Y29uc3Qgbm9kZV9maWVsZHNfY291bnQ9dGhpcy5fc25hcHNob3Quc25hcHNob3QubWV0YS5ub2RlX2ZpZWxkcy5sZW5ndGg7Y29uc3Qgbm9kZXNfbGVuZ3RoPXRoaXMuX3NuYXBzaG90LnNuYXBzaG90Lm5vZGVfY291bnQqbm9kZV9maWVsZHNfY291bnQ7dGhpcy5fYXJyYXk9bmV3IFVpbnQzMkFycmF5KG5vZGVzX2xlbmd0aCk7dGhpcy5fYXJyYXlJbmRleD0wO3RoaXMuX3N0YXRlPSdwYXJzZS1ub2Rlcyc7YnJlYWs7fQpjYXNlJ3BhcnNlLW5vZGVzJzp7Y29uc3QgaGFzTW9yZURhdGE9dGhpcy5fcGFyc2VVaW50QXJyYXkoKTt0aGlzLl9wcm9ncmVzcy51cGRhdGVQcm9ncmVzcygnTG9hZGluZyBub2Rlc1x1MjAyNiAlZCUlJyx0aGlzLl9hcnJheUluZGV4LHRoaXMuX2FycmF5Lmxlbmd0aCk7aWYoaGFzTW9yZURhdGEpCnJldHVybjt0aGlzLl9zbmFwc2hvdC5ub2Rlcz10aGlzLl9hcnJheTt0aGlzLl9zdGF0ZT0nZmluZC1lZGdlcyc7dGhpcy5fYXJyYXk9bnVsbDticmVhazt9CmNhc2UnZmluZC1lZGdlcyc6e2NvbnN0IGVkZ2VzVG9rZW49JyJlZGdlcyInO2NvbnN0IGVkZ2VzVG9rZW5JbmRleD10aGlzLl9qc29uLmluZGV4T2YoZWRnZXNUb2tlbik7aWYoZWRnZXNUb2tlbkluZGV4PT09LTEpCnJldHVybjtjb25zdCBicmFja2V0SW5kZXg9dGhpcy5fanNvbi5pbmRleE9mKCdbJyxlZGdlc1Rva2VuSW5kZXgpO2lmKGJyYWNrZXRJbmRleD09PS0xKQpyZXR1cm47dGhpcy5fanNvbj10aGlzLl9qc29uLnNsaWNlKGJyYWNrZXRJbmRleCsxKTtjb25zdCBlZGdlX2ZpZWxkc19jb3VudD10aGlzLl9zbmFwc2hvdC5zbmFwc2hvdC5tZXRhLmVkZ2VfZmllbGRzLmxlbmd0aDtjb25zdCBlZGdlc19sZW5ndGg9dGhpcy5fc25hcHNob3Quc25hcHNob3QuZWRnZV9jb3VudCplZGdlX2ZpZWxkc19jb3VudDt0aGlzLl9hcnJheT1uZXcgVWludDMyQXJyYXkoZWRnZXNfbGVuZ3RoKTt0aGlzLl9hcnJheUluZGV4PTA7dGhpcy5fc3RhdGU9J3BhcnNlLWVkZ2VzJzticmVhazt9CmNhc2UncGFyc2UtZWRnZXMnOntjb25zdCBoYXNNb3JlRGF0YT10aGlzLl9wYXJzZVVpbnRBcnJheSgpO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVByb2dyZXNzKCdMb2FkaW5nIGVkZ2VzXHUyMDI2ICVkJSUnLHRoaXMuX2FycmF5SW5kZXgsdGhpcy5fYXJyYXkubGVuZ3RoKTtpZihoYXNNb3JlRGF0YSkKcmV0dXJuO3RoaXMuX3NuYXBzaG90LmVkZ2VzPXRoaXMuX2FycmF5O3RoaXMuX2FycmF5PW51bGw7aWYodGhpcy5fc25hcHNob3Quc25hcHNob3QudHJhY2VfZnVuY3Rpb25fY291bnQpe3RoaXMuX3N0YXRlPSdmaW5kLXRyYWNlLWZ1bmN0aW9uLWluZm9zJzt0aGlzLl9wcm9ncmVzcy51cGRhdGVTdGF0dXMoJ0xvYWRpbmcgYWxsb2NhdGlvbiB0cmFjZXNcdTIwMjYnKTt9ZWxzZSBpZih0aGlzLl9zbmFwc2hvdC5zbmFwc2hvdC5tZXRhLnNhbXBsZV9maWVsZHMpe3RoaXMuX3N0YXRlPSdmaW5kLXNhbXBsZXMnO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVN0YXR1cygnTG9hZGluZyBzYW1wbGVzXHUyMDI2Jyk7fWVsc2V7dGhpcy5fc3RhdGU9J2ZpbmQtc3RyaW5ncyc7fQpicmVhazt9CmNhc2UnZmluZC10cmFjZS1mdW5jdGlvbi1pbmZvcyc6e2NvbnN0IHRyYWNlc1Rva2VuPScidHJhY2VfZnVuY3Rpb25faW5mb3MiJztjb25zdCB0cmFjZXNUb2tlbkluZGV4PXRoaXMuX2pzb24uaW5kZXhPZih0cmFjZXNUb2tlbik7aWYodHJhY2VzVG9rZW5JbmRleD09PS0xKQpyZXR1cm47Y29uc3QgYnJhY2tldEluZGV4PXRoaXMuX2pzb24uaW5kZXhPZignWycsdHJhY2VzVG9rZW5JbmRleCk7aWYoYnJhY2tldEluZGV4PT09LTEpCnJldHVybjt0aGlzLl9qc29uPXRoaXMuX2pzb24uc2xpY2UoYnJhY2tldEluZGV4KzEpO2NvbnN0IHRyYWNlX2Z1bmN0aW9uX2luZm9fZmllbGRfY291bnQ9dGhpcy5fc25hcHNob3Quc25hcHNob3QubWV0YS50cmFjZV9mdW5jdGlvbl9pbmZvX2ZpZWxkcy5sZW5ndGg7Y29uc3QgdHJhY2VfZnVuY3Rpb25faW5mb19sZW5ndGg9dGhpcy5fc25hcHNob3Quc25hcHNob3QudHJhY2VfZnVuY3Rpb25fY291bnQqdHJhY2VfZnVuY3Rpb25faW5mb19maWVsZF9jb3VudDt0aGlzLl9hcnJheT1uZXcgVWludDMyQXJyYXkodHJhY2VfZnVuY3Rpb25faW5mb19sZW5ndGgpO3RoaXMuX2FycmF5SW5kZXg9MDt0aGlzLl9zdGF0ZT0ncGFyc2UtdHJhY2UtZnVuY3Rpb24taW5mb3MnO2JyZWFrO30KY2FzZSdwYXJzZS10cmFjZS1mdW5jdGlvbi1pbmZvcyc6e2lmKHRoaXMuX3BhcnNlVWludEFycmF5KCkpCnJldHVybjt0aGlzLl9zbmFwc2hvdC50cmFjZV9mdW5jdGlvbl9pbmZvcz10aGlzLl9hcnJheTt0aGlzLl9hcnJheT1udWxsO3RoaXMuX3N0YXRlPSdmaW5kLXRyYWNlLXRyZWUnO2JyZWFrO30KY2FzZSdmaW5kLXRyYWNlLXRyZWUnOntjb25zdCB0cmFjZXNUb2tlbj0nInRyYWNlX3RyZWUiJztjb25zdCB0cmFjZXNUb2tlbkluZGV4PXRoaXMuX2pzb24uaW5kZXhPZih0cmFjZXNUb2tlbik7aWYodHJhY2VzVG9rZW5JbmRleD09PS0xKQpyZXR1cm47Y29uc3QgYnJhY2tldEluZGV4PXRoaXMuX2pzb24uaW5kZXhPZignWycsdHJhY2VzVG9rZW5JbmRleCk7aWYoYnJhY2tldEluZGV4PT09LTEpCnJldHVybjt0aGlzLl9qc29uPXRoaXMuX2pzb24uc2xpY2UoYnJhY2tldEluZGV4KTt0aGlzLl9zdGF0ZT0ncGFyc2UtdHJhY2UtdHJlZSc7YnJlYWs7fQpjYXNlJ3BhcnNlLXRyYWNlLXRyZWUnOntjb25zdCBuZXh0VG9rZW49dGhpcy5fc25hcHNob3Quc25hcHNob3QubWV0YS5zYW1wbGVfZmllbGRzPycic2FtcGxlcyInOicic3RyaW5ncyInO2NvbnN0IG5leHRUb2tlbkluZGV4PXRoaXMuX2pzb24uaW5kZXhPZihuZXh0VG9rZW4pO2lmKG5leHRUb2tlbkluZGV4PT09LTEpCnJldHVybjtjb25zdCBicmFja2V0SW5kZXg9dGhpcy5fanNvbi5sYXN0SW5kZXhPZignXScsbmV4dFRva2VuSW5kZXgpO3RoaXMuX3NuYXBzaG90LnRyYWNlX3RyZWU9SlNPTi5wYXJzZSh0aGlzLl9qc29uLnN1YnN0cmluZygwLGJyYWNrZXRJbmRleCsxKSk7dGhpcy5fanNvbj10aGlzLl9qc29uLnNsaWNlKGJyYWNrZXRJbmRleCsxKTtpZih0aGlzLl9zbmFwc2hvdC5zbmFwc2hvdC5tZXRhLnNhbXBsZV9maWVsZHMpe3RoaXMuX3N0YXRlPSdmaW5kLXNhbXBsZXMnO3RoaXMuX3Byb2dyZXNzLnVwZGF0ZVN0YXR1cygnTG9hZGluZyBzYW1wbGVzXHUyMDI2Jyk7fWVsc2V7dGhpcy5fc3RhdGU9J2ZpbmQtc3RyaW5ncyc7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdMb2FkaW5nIHN0cmluZ3NcdTIwMjYnKTt9CmJyZWFrO30KY2FzZSdmaW5kLXNhbXBsZXMnOntjb25zdCBzYW1wbGVzVG9rZW49JyJzYW1wbGVzIic7Y29uc3Qgc2FtcGxlc1Rva2VuSW5kZXg9dGhpcy5fanNvbi5pbmRleE9mKHNhbXBsZXNUb2tlbik7aWYoc2FtcGxlc1Rva2VuSW5kZXg9PT0tMSkKcmV0dXJuO2NvbnN0IGJyYWNrZXRJbmRleD10aGlzLl9qc29uLmluZGV4T2YoJ1snLHNhbXBsZXNUb2tlbkluZGV4KTtpZihicmFja2V0SW5kZXg9PT0tMSkKcmV0dXJuO3RoaXMuX2pzb249dGhpcy5fanNvbi5zbGljZShicmFja2V0SW5kZXgrMSk7dGhpcy5fYXJyYXk9W107dGhpcy5fYXJyYXlJbmRleD0wO3RoaXMuX3N0YXRlPSdwYXJzZS1zYW1wbGVzJzticmVhazt9CmNhc2UncGFyc2Utc2FtcGxlcyc6e2lmKHRoaXMuX3BhcnNlVWludEFycmF5KCkpCnJldHVybjt0aGlzLl9zbmFwc2hvdC5zYW1wbGVzPXRoaXMuX2FycmF5O3RoaXMuX2FycmF5PW51bGw7dGhpcy5fc3RhdGU9J2ZpbmQtc3RyaW5ncyc7dGhpcy5fcHJvZ3Jlc3MudXBkYXRlU3RhdHVzKCdMb2FkaW5nIHN0cmluZ3NcdTIwMjYnKTticmVhazt9CmNhc2UnZmluZC1zdHJpbmdzJzp7Y29uc3Qgc3RyaW5nc1Rva2VuPScic3RyaW5ncyInO2NvbnN0IHN0cmluZ3NUb2tlbkluZGV4PXRoaXMuX2pzb24uaW5kZXhPZihzdHJpbmdzVG9rZW4pO2lmKHN0cmluZ3NUb2tlbkluZGV4PT09LTEpCnJldHVybjtjb25zdCBicmFja2V0SW5kZXg9dGhpcy5fanNvbi5pbmRleE9mKCdbJyxzdHJpbmdzVG9rZW5JbmRleCk7aWYoYnJhY2tldEluZGV4PT09LTEpCnJldHVybjt0aGlzLl9qc29uPXRoaXMuX2pzb24uc2xpY2UoYnJhY2tldEluZGV4KTt0aGlzLl9zdGF0ZT0nYWNjdW11bGF0ZS1zdHJpbmdzJzticmVhazt9CmNhc2UnYWNjdW11bGF0ZS1zdHJpbmdzJzpyZXR1cm47fX19Cl93cml0ZUJhbGFuY2VkSlNPTihkYXRhKXt0aGlzLl9qc29uPXRoaXMuX2pzb25Ub2tlbml6ZXIucmVtYWluZGVyKCk7dGhpcy5fanNvblRva2VuaXplcj1udWxsO3RoaXMuX3N0YXRlPSdmaW5kLW5vZGVzJzt0aGlzLl9zbmFwc2hvdC5zbmFwc2hvdD0oSlNPTi5wYXJzZShkYXRhKSk7fX07O0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RXb3JrZXJEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKGdsb2JhbE9iamVjdCxwb3N0TWVzc2FnZSl7dGhpcy5fb2JqZWN0cz1bXTt0aGlzLl9nbG9iYWw9Z2xvYmFsT2JqZWN0O3RoaXMuX3Bvc3RNZXNzYWdlPXBvc3RNZXNzYWdlO30KX2ZpbmRGdW5jdGlvbihuYW1lKXtjb25zdCBwYXRoPW5hbWUuc3BsaXQoJy4nKTtsZXQgcmVzdWx0PXRoaXMuX2dsb2JhbDtmb3IobGV0IGk9MDtpPHBhdGgubGVuZ3RoOysraSkKcmVzdWx0PXJlc3VsdFtwYXRoW2ldXTtyZXR1cm4gcmVzdWx0O30Kc2VuZEV2ZW50KG5hbWUsZGF0YSl7dGhpcy5fcG9zdE1lc3NhZ2Uoe2V2ZW50TmFtZTpuYW1lLGRhdGE6ZGF0YX0pO30KZGlzcGF0Y2hNZXNzYWdlKGV2ZW50KXtjb25zdCBkYXRhPShldmVudC5kYXRhKTtjb25zdCByZXNwb25zZT17Y2FsbElkOmRhdGEuY2FsbElkfTt0cnl7c3dpdGNoKGRhdGEuZGlzcG9zaXRpb24pe2Nhc2UnY3JlYXRlJzpjb25zdCBjb25zdHJ1Y3RvckZ1bmN0aW9uPXRoaXMuX2ZpbmRGdW5jdGlvbihkYXRhLm1ldGhvZE5hbWUpO3RoaXMuX29iamVjdHNbZGF0YS5vYmplY3RJZF09bmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24odGhpcyk7YnJlYWs7Y2FzZSdkaXNwb3NlJzpkZWxldGUgdGhpcy5fb2JqZWN0c1tkYXRhLm9iamVjdElkXTticmVhaztjYXNlJ2dldHRlcic6e2NvbnN0IG9iamVjdD10aGlzLl9vYmplY3RzW2RhdGEub2JqZWN0SWRdO2NvbnN0IHJlc3VsdD1vYmplY3RbZGF0YS5tZXRob2ROYW1lXTtyZXNwb25zZS5yZXN1bHQ9cmVzdWx0O2JyZWFrO30KY2FzZSdmYWN0b3J5Jzp7Y29uc3Qgb2JqZWN0PXRoaXMuX29iamVjdHNbZGF0YS5vYmplY3RJZF07Y29uc3QgcmVzdWx0PW9iamVjdFtkYXRhLm1ldGhvZE5hbWVdLmFwcGx5KG9iamVjdCxkYXRhLm1ldGhvZEFyZ3VtZW50cyk7aWYocmVzdWx0KQp0aGlzLl9vYmplY3RzW2RhdGEubmV3T2JqZWN0SWRdPXJlc3VsdDtyZXNwb25zZS5yZXN1bHQ9ISFyZXN1bHQ7YnJlYWs7fQpjYXNlJ21ldGhvZCc6e2NvbnN0IG9iamVjdD10aGlzLl9vYmplY3RzW2RhdGEub2JqZWN0SWRdO3Jlc3BvbnNlLnJlc3VsdD1vYmplY3RbZGF0YS5tZXRob2ROYW1lXS5hcHBseShvYmplY3QsZGF0YS5tZXRob2RBcmd1bWVudHMpO2JyZWFrO30KY2FzZSdldmFsdWF0ZUZvclRlc3QnOnRyeXtyZXNwb25zZS5yZXN1bHQ9c2VsZi5ldmFsKGRhdGEuc291cmNlKTt9Y2F0Y2goZSl7cmVzcG9uc2UucmVzdWx0PWUudG9TdHJpbmcoKTt9CmJyZWFrO319Y2F0Y2goZSl7cmVzcG9uc2UuZXJyb3I9ZS50b1N0cmluZygpO3Jlc3BvbnNlLmVycm9yQ2FsbFN0YWNrPWUuc3RhY2s7aWYoZGF0YS5tZXRob2ROYW1lKQpyZXNwb25zZS5lcnJvck1ldGhvZE5hbWU9ZGF0YS5tZXRob2ROYW1lO30KdGhpcy5fcG9zdE1lc3NhZ2UocmVzcG9uc2UpO319OztmdW5jdGlvbiBwb3N0TWVzc2FnZVdyYXBwZXIobWVzc2FnZSl7cG9zdE1lc3NhZ2UobWVzc2FnZSk7fQpjb25zdCBkaXNwYXRjaGVyPW5ldyBIZWFwU25hcHNob3RXb3JrZXIuSGVhcFNuYXBzaG90V29ya2VyRGlzcGF0Y2hlcih0aGlzLHBvc3RNZXNzYWdlV3JhcHBlcik7ZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VFdmVudExpc3RlbmVyKGxpc3RlbmVyKXtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLGxpc3RlbmVyLGZhbHNlKTt9Cmluc3RhbGxNZXNzYWdlRXZlbnRMaXN0ZW5lcihkaXNwYXRjaGVyLmRpc3BhdGNoTWVzc2FnZS5iaW5kKGRpc3BhdGNoZXIpKTs7OztpZighc2VsZi5SdW50aW1lKQpzZWxmLmltcG9ydFNjcmlwdHMoJ1J1bnRpbWUuanMnKTtSdW50aW1lLnN0YXJ0V29ya2VyKCdoZWFwX3NuYXBzaG90X3dvcmtlcicpOzwhLS0KICogQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+CjwhZG9jdHlwZSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9Im9iamVjdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICdzZWxmJyAndW5zYWZlLWV2YWwnICd1bnNhZmUtaW5saW5lJyBodHRwczovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbSI+CiAgICA8bWV0YSBuYW1lPSJyZWZlcnJlciIgY29udGVudD0ibm8tcmVmZXJyZXIiPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ic2hlbGwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZGV2dG9vbHNfYXBwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imluc3BlY3Rvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PlJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbignaW5zcGVjdG9yJyk7PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgY2xhc3M9InVuZG9ja2VkIiBpZD0iLWJsaW5rLWRldi10b29scyI+PC9ib2R5Pgo8L2h0bWw+CmFsbERlc2NyaXB0b3JzLnB1c2goLi4uW3siZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiLCJlbXVsYXRpb24iXSwiZXh0ZW5zaW9ucyI6W3siY2xhc3NOYW1lIjoiU2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwUHJvdmlkZXIiLCJ0eXBlIjoiQENvbW1vbi5BcHBQcm92aWRlciIsIm9yZGVyIjoxfSx7ImNsYXNzTmFtZSI6IlNjcmVlbmNhc3QuU2NyZWVuY2FzdEFwcC5Ub29sYmFyQnV0dG9uUHJvdmlkZXIiLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwib3JkZXIiOjEsImxvY2F0aW9uIjoibWFpbi10b29sYmFyLWxlZnQifSx7ImFjdGlvbklkIjoiY29tcG9uZW50cy5yZXF1ZXN0LWFwcC1iYW5uZXIiLCJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6Im1haW5NZW51Iiwib3JkZXIiOjEwfV0sIm5hbWUiOiJzY3JlZW5jYXN0In1dKTthcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcy5wdXNoKC4uLlt7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoic2NyZWVuY2FzdCJ9XSkKc2VsZlsnU2NyZWVuY2FzdCddPXNlbGZbJ1NjcmVlbmNhc3QnXXx8e307U2NyZWVuY2FzdC5JbnB1dE1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9pbnB1dEFnZW50PXRhcmdldC5pbnB1dEFnZW50KCk7dGhpcy5fYWN0aXZlVG91Y2hPZmZzZXRUb3A9bnVsbDt0aGlzLl9hY3RpdmVUb3VjaFBhcmFtcz1udWxsO30KZW1pdEtleUV2ZW50KGV2ZW50KXtsZXQgdHlwZTtzd2l0Y2goZXZlbnQudHlwZSl7Y2FzZSdrZXlkb3duJzp0eXBlPSdrZXlEb3duJzticmVhaztjYXNlJ2tleXVwJzp0eXBlPSdrZXlVcCc7YnJlYWs7Y2FzZSdrZXlwcmVzcyc6dHlwZT0nY2hhcic7YnJlYWs7ZGVmYXVsdDpyZXR1cm47fQpjb25zdCB0ZXh0PWV2ZW50LnR5cGU9PT0na2V5cHJlc3MnP1N0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpOnVuZGVmaW5lZDt0aGlzLl9pbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaEtleUV2ZW50KHt0eXBlOnR5cGUsbW9kaWZpZXJzOnRoaXMuX21vZGlmaWVyc0ZvckV2ZW50KGV2ZW50KSx0ZXh0OnRleHQsdW5tb2RpZmllZFRleHQ6dGV4dD90ZXh0LnRvTG93ZXJDYXNlKCk6dW5kZWZpbmVkLGtleUlkZW50aWZpZXI6ZXZlbnQua2V5SWRlbnRpZmllcixjb2RlOmV2ZW50LmNvZGUsa2V5OmV2ZW50LmtleSx3aW5kb3dzVmlydHVhbEtleUNvZGU6ZXZlbnQua2V5Q29kZSxuYXRpdmVWaXJ0dWFsS2V5Q29kZTpldmVudC5rZXlDb2RlLGF1dG9SZXBlYXQ6ZmFsc2UsaXNLZXlwYWQ6ZmFsc2UsaXNTeXN0ZW1LZXk6ZmFsc2V9KTt9CmVtaXRUb3VjaEZyb21Nb3VzZUV2ZW50KGV2ZW50LG9mZnNldFRvcCx6b29tKXtjb25zdCBidXR0b25zPXswOidub25lJywxOidsZWZ0JywyOidtaWRkbGUnLDM6J3JpZ2h0J307Y29uc3QgdHlwZXM9eydtb3VzZWRvd24nOidtb3VzZVByZXNzZWQnLCdtb3VzZXVwJzonbW91c2VSZWxlYXNlZCcsJ21vdXNlbW92ZSc6J21vdXNlTW92ZWQnLCdtb3VzZXdoZWVsJzonbW91c2VXaGVlbCd9O2lmKCEoZXZlbnQudHlwZSBpbiB0eXBlcyl8fCEoZXZlbnQud2hpY2ggaW4gYnV0dG9ucykpCnJldHVybjtpZihldmVudC50eXBlIT09J21vdXNld2hlZWwnJiZidXR0b25zW2V2ZW50LndoaWNoXT09PSdub25lJykKcmV0dXJuO2lmKGV2ZW50LnR5cGU9PT0nbW91c2Vkb3duJ3x8dGhpcy5fYWN0aXZlVG91Y2hPZmZzZXRUb3A9PT1udWxsKQp0aGlzLl9hY3RpdmVUb3VjaE9mZnNldFRvcD1vZmZzZXRUb3A7Y29uc3QgeD1NYXRoLnJvdW5kKGV2ZW50Lm9mZnNldFgvem9vbSk7bGV0IHk9TWF0aC5yb3VuZChldmVudC5vZmZzZXRZL3pvb20pO3k9TWF0aC5yb3VuZCh5LXRoaXMuX2FjdGl2ZVRvdWNoT2Zmc2V0VG9wKTtjb25zdCBwYXJhbXM9e3R5cGU6dHlwZXNbZXZlbnQudHlwZV0seDp4LHk6eSxtb2RpZmllcnM6dGhpcy5fbW9kaWZpZXJzRm9yRXZlbnQoZXZlbnQpLGJ1dHRvbjpidXR0b25zW2V2ZW50LndoaWNoXSxjbGlja0NvdW50OjB9O2lmKGV2ZW50LnR5cGU9PT0nbW91c2V3aGVlbCcpe3BhcmFtcy5kZWx0YVg9ZXZlbnQud2hlZWxEZWx0YVgvem9vbTtwYXJhbXMuZGVsdGFZPWV2ZW50LndoZWVsRGVsdGFZL3pvb207fWVsc2V7dGhpcy5fYWN0aXZlVG91Y2hQYXJhbXM9cGFyYW1zO30KaWYoZXZlbnQudHlwZT09PSdtb3VzZXVwJykKdGhpcy5fYWN0aXZlVG91Y2hPZmZzZXRUb3A9bnVsbDt0aGlzLl9pbnB1dEFnZW50Lmludm9rZV9lbXVsYXRlVG91Y2hGcm9tTW91c2VFdmVudChwYXJhbXMpO30KY2FuY2VsVG91Y2goKXtpZih0aGlzLl9hY3RpdmVUb3VjaE9mZnNldFRvcCE9PW51bGwpe2NvbnN0IHBhcmFtcz10aGlzLl9hY3RpdmVUb3VjaFBhcmFtczt0aGlzLl9hY3RpdmVUb3VjaFBhcmFtcz1udWxsO3BhcmFtcy50eXBlPSdtb3VzZVJlbGVhc2VkJzt0aGlzLl9pbnB1dEFnZW50Lmludm9rZV9lbXVsYXRlVG91Y2hGcm9tTW91c2VFdmVudChwYXJhbXMpO319Cl9tb2RpZmllcnNGb3JFdmVudChldmVudCl7cmV0dXJuKGV2ZW50LmFsdEtleT8xOjApfChldmVudC5jdHJsS2V5PzI6MCl8KGV2ZW50Lm1ldGFLZXk/NDowKXwoZXZlbnQuc2hpZnRLZXk/ODowKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU2NyZWVuY2FzdC5JbnB1dE1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5JbnB1dCxmYWxzZSk7O1NjcmVlbmNhc3QuU2NyZWVuY2FzdEFwcD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2VuYWJsZWRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzY3JlZW5jYXN0RW5hYmxlZCcsdHJ1ZSk7dGhpcy5fdG9nZ2xlQnV0dG9uPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIHNjcmVlbmNhc3QnKSwnbGFyZ2VpY29uLXBob25lJyk7dGhpcy5fdG9nZ2xlQnV0dG9uLnNldFRvZ2dsZWQodGhpcy5fZW5hYmxlZFNldHRpbmcuZ2V0KCkpO3RoaXMuX3RvZ2dsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl90b2dnbGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl90b2dnbGVCdXR0b25DbGlja2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLlNjcmVlbkNhcHR1cmVNb2RlbCx0aGlzKTt9CnN0YXRpYyBfaW5zdGFuY2UoKXtpZighU2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwLl9hcHBJbnN0YW5jZSkKU2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwLl9hcHBJbnN0YW5jZT1uZXcgU2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwKCk7cmV0dXJuIFNjcmVlbmNhc3QuU2NyZWVuY2FzdEFwcC5fYXBwSW5zdGFuY2U7fQpwcmVzZW50VUkoZG9jdW1lbnQpe2NvbnN0IHJvb3RWaWV3PW5ldyBVSS5Sb290VmlldygpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldD1uZXcgVUkuU3BsaXRXaWRnZXQoZmFsc2UsdHJ1ZSwnSW5zcGVjdG9yVmlldy5zY3JlZW5jYXN0U3BsaXRWaWV3U3RhdGUnLDMwMCwzMDApO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXRWZXJ0aWNhbCh0cnVlKTt0aGlzLl9yb290U3BsaXRXaWRnZXQuc2V0U2Vjb25kSXNTaWRlYmFyKHRydWUpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zaG93KHJvb3RWaWV3LmVsZW1lbnQpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5oaWRlTWFpbigpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KFVJLmluc3BlY3RvclZpZXcpO3Jvb3RWaWV3LmF0dGFjaFRvRG9jdW1lbnQoZG9jdW1lbnQpO3Jvb3RWaWV3LmZvY3VzKCk7fQptb2RlbEFkZGVkKHNjcmVlbkNhcHR1cmVNb2RlbCl7aWYodGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsKQpyZXR1cm47dGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsPXNjcmVlbkNhcHR1cmVNb2RlbDt0aGlzLl90b2dnbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9zY3JlZW5jYXN0Vmlldz1uZXcgU2NyZWVuY2FzdC5TY3JlZW5jYXN0VmlldyhzY3JlZW5DYXB0dXJlTW9kZWwpO3RoaXMuX3Jvb3RTcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX3NjcmVlbmNhc3RWaWV3KTt0aGlzLl9zY3JlZW5jYXN0Vmlldy5pbml0aWFsaXplKCk7dGhpcy5fb25TY3JlZW5jYXN0RW5hYmxlZENoYW5nZWQoKTt9Cm1vZGVsUmVtb3ZlZChzY3JlZW5DYXB0dXJlTW9kZWwpe2lmKHRoaXMuX3NjcmVlbkNhcHR1cmVNb2RlbCE9PXNjcmVlbkNhcHR1cmVNb2RlbCkKcmV0dXJuO2RlbGV0ZSB0aGlzLl9zY3JlZW5DYXB0dXJlTW9kZWw7dGhpcy5fdG9nZ2xlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX3NjcmVlbmNhc3RWaWV3LmRldGFjaCgpO2RlbGV0ZSB0aGlzLl9zY3JlZW5jYXN0Vmlldzt0aGlzLl9vblNjcmVlbmNhc3RFbmFibGVkQ2hhbmdlZCgpO30KX3RvZ2dsZUJ1dHRvbkNsaWNrZWQoKXtjb25zdCBlbmFibGVkPSF0aGlzLl90b2dnbGVCdXR0b24udG9nZ2xlZCgpO3RoaXMuX2VuYWJsZWRTZXR0aW5nLnNldChlbmFibGVkKTt0aGlzLl9vblNjcmVlbmNhc3RFbmFibGVkQ2hhbmdlZCgpO30KX29uU2NyZWVuY2FzdEVuYWJsZWRDaGFuZ2VkKCl7aWYoIXRoaXMuX3Jvb3RTcGxpdFdpZGdldCkKcmV0dXJuO2NvbnN0IGVuYWJsZWQ9dGhpcy5fZW5hYmxlZFNldHRpbmcuZ2V0KCkmJnRoaXMuX3NjcmVlbmNhc3RWaWV3O3RoaXMuX3RvZ2dsZUJ1dHRvbi5zZXRUb2dnbGVkKGVuYWJsZWQpO2lmKGVuYWJsZWQpCnRoaXMuX3Jvb3RTcGxpdFdpZGdldC5zaG93Qm90aCgpO2Vsc2UKdGhpcy5fcm9vdFNwbGl0V2lkZ2V0LmhpZGVNYWluKCk7fX07U2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwLl9hcHBJbnN0YW5jZTtTY3JlZW5jYXN0LlNjcmVlbmNhc3RBcHAuVG9vbGJhckJ1dHRvblByb3ZpZGVyPWNsYXNze2l0ZW0oKXtyZXR1cm4gU2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwLl9pbnN0YW5jZSgpLl90b2dnbGVCdXR0b247fX07U2NyZWVuY2FzdC5TY3JlZW5jYXN0QXBwUHJvdmlkZXI9Y2xhc3N7Y3JlYXRlQXBwKCl7cmV0dXJuIFNjcmVlbmNhc3QuU2NyZWVuY2FzdEFwcC5faW5zdGFuY2UoKTt9fTs7U2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3Ioc2NyZWVuQ2FwdHVyZU1vZGVsKXtzdXBlcigpO3RoaXMuX3NjcmVlbkNhcHR1cmVNb2RlbD1zY3JlZW5DYXB0dXJlTW9kZWw7dGhpcy5fZG9tTW9kZWw9c2NyZWVuQ2FwdHVyZU1vZGVsLnRhcmdldCgpLm1vZGVsKFNESy5ET01Nb2RlbCk7dGhpcy5fb3ZlcmxheU1vZGVsPXNjcmVlbkNhcHR1cmVNb2RlbC50YXJnZXQoKS5tb2RlbChTREsuT3ZlcmxheU1vZGVsKTt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1zY3JlZW5DYXB0dXJlTW9kZWwudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTt0aGlzLl9uZXR3b3JrTWFuYWdlcj1zY3JlZW5DYXB0dXJlTW9kZWwudGFyZ2V0KCkubW9kZWwoU0RLLk5ldHdvcmtNYW5hZ2VyKTt0aGlzLl9pbnB1dE1vZGVsPXNjcmVlbkNhcHR1cmVNb2RlbC50YXJnZXQoKS5tb2RlbChTY3JlZW5jYXN0LklucHV0TW9kZWwpO3RoaXMuc2V0TWluaW11bVNpemUoMTUwLDE1MCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzY3JlZW5jYXN0L3NjcmVlbmNhc3RWaWV3LmNzcycpO30KaW5pdGlhbGl6ZSgpe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzY3JlZW5jYXN0Jyk7dGhpcy5fY3JlYXRlTmF2aWdhdGlvbkJhcigpO3RoaXMuX3ZpZXdwb3J0RWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NjcmVlbmNhc3Qtdmlld3BvcnQgaGlkZGVuJyk7dGhpcy5fY2FudmFzQ29udGFpbmVyRWxlbWVudD10aGlzLl92aWV3cG9ydEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NjcmVlbmNhc3QtY2FudmFzLWNvbnRhaW5lcicpO3RoaXMuX2dsYXNzUGFuZUVsZW1lbnQ9dGhpcy5fY2FudmFzQ29udGFpbmVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2NyZWVuY2FzdC1nbGFzc3BhbmUgZmlsbCBoaWRkZW4nKTt0aGlzLl9jYW52YXNFbGVtZW50PXRoaXMuX2NhbnZhc0NvbnRhaW5lckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NhbnZhcycpO3RoaXMuX2NhbnZhc0VsZW1lbnQudGFiSW5kZXg9MDt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5faGFuZGxlTW91c2VFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMuX2hhbmRsZU1vdXNlRXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY2FudmFzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX2hhbmRsZU1vdXNlRXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY2FudmFzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJyx0aGlzLl9oYW5kbGVNb3VzZUV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2hhbmRsZU1vdXNlRXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY2FudmFzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2hhbmRsZUtleUV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLHRoaXMuX2hhbmRsZUtleUV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLHRoaXMuX2hhbmRsZUtleUV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsdGhpcy5faGFuZGxlQmx1ckV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3RpdGxlRWxlbWVudD10aGlzLl9jYW52YXNDb250YWluZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzY3JlZW5jYXN0LWVsZW1lbnQtdGl0bGUgbW9ub3NwYWNlIGhpZGRlbicpO3RoaXMuX3RhZ05hbWVFbGVtZW50PXRoaXMuX3RpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3NjcmVlbmNhc3QtdGFnLW5hbWUnKTt0aGlzLl9ub2RlSWRFbGVtZW50PXRoaXMuX3RpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3NjcmVlbmNhc3Qtbm9kZS1pZCcpO3RoaXMuX2NsYXNzTmFtZUVsZW1lbnQ9dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc2NyZWVuY2FzdC1jbGFzcy1uYW1lJyk7dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnICcpO3RoaXMuX25vZGVXaWR0aEVsZW1lbnQ9dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyk7dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc2NyZWVuY2FzdC1weCcpLnRleHRDb250ZW50PSdweCc7dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnIFx1MDBENyAnKTt0aGlzLl9ub2RlSGVpZ2h0RWxlbWVudD10aGlzLl90aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKTt0aGlzLl90aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdzY3JlZW5jYXN0LXB4JykudGV4dENvbnRlbnQ9J3B4Jzt0aGlzLl90aXRsZUVsZW1lbnQuc3R5bGUudG9wPScwJzt0aGlzLl90aXRsZUVsZW1lbnQuc3R5bGUubGVmdD0nMCc7dGhpcy5faW1hZ2VFbGVtZW50PW5ldyBJbWFnZSgpO3RoaXMuX2lzQ2FzdGluZz1mYWxzZTt0aGlzLl9jb250ZXh0PXRoaXMuX2NhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTt0aGlzLl9jaGVja2VyYm9hcmRQYXR0ZXJuPXRoaXMuX2NyZWF0ZUNoZWNrZXJib2FyZFBhdHRlcm4odGhpcy5fY29udGV4dCk7dGhpcy5fc2hvcnRjdXRzPSh7fSk7dGhpcy5fc2hvcnRjdXRzW1VJLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgnbCcsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybCldPXRoaXMuX2ZvY3VzTmF2aWdhdGlvbkJhci5iaW5kKHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcy5fb25TdXNwZW5kU3RhdGVDaGFuZ2UsdGhpcyk7dGhpcy5fdXBkYXRlR2xhc3NwYW5lKCk7fQp3YXNTaG93bigpe3RoaXMuX3N0YXJ0Q2FzdGluZygpO30Kd2lsbEhpZGUoKXt0aGlzLl9zdG9wQ2FzdGluZygpO30KX3N0YXJ0Q2FzdGluZygpe2lmKFNESy50YXJnZXRNYW5hZ2VyLmFsbFRhcmdldHNTdXNwZW5kZWQoKSkKcmV0dXJuO2lmKHRoaXMuX2lzQ2FzdGluZykKcmV0dXJuO3RoaXMuX2lzQ2FzdGluZz10cnVlO2NvbnN0IG1heEltYWdlRGltZW5zaW9uPTIwNDg7Y29uc3QgZGltZW5zaW9ucz10aGlzLl92aWV3cG9ydERpbWVuc2lvbnMoKTtpZihkaW1lbnNpb25zLndpZHRoPDB8fGRpbWVuc2lvbnMuaGVpZ2h0PDApe3RoaXMuX2lzQ2FzdGluZz1mYWxzZTtyZXR1cm47fQpkaW1lbnNpb25zLndpZHRoKj13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztkaW1lbnNpb25zLmhlaWdodCo9d2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsLnN0YXJ0U2NyZWVuY2FzdCgnanBlZycsODAsTWF0aC5mbG9vcihNYXRoLm1pbihtYXhJbWFnZURpbWVuc2lvbixkaW1lbnNpb25zLndpZHRoKSksTWF0aC5mbG9vcihNYXRoLm1pbihtYXhJbWFnZURpbWVuc2lvbixkaW1lbnNpb25zLmhlaWdodCkpLHVuZGVmaW5lZCx0aGlzLl9zY3JlZW5jYXN0RnJhbWUuYmluZCh0aGlzKSx0aGlzLl9zY3JlZW5jYXN0VmlzaWJpbGl0eUNoYW5nZWQuYmluZCh0aGlzKSk7Zm9yKGNvbnN0IGVtdWxhdGlvbk1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRW11bGF0aW9uTW9kZWwpKQplbXVsYXRpb25Nb2RlbC5vdmVycmlkZUVtdWxhdGVUb3VjaCh0cnVlKTtpZih0aGlzLl9vdmVybGF5TW9kZWwpCnRoaXMuX292ZXJsYXlNb2RlbC5zZXRIaWdobGlnaHRlcih0aGlzKTt9Cl9zdG9wQ2FzdGluZygpe2lmKCF0aGlzLl9pc0Nhc3RpbmcpCnJldHVybjt0aGlzLl9pc0Nhc3Rpbmc9ZmFsc2U7dGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsLnN0b3BTY3JlZW5jYXN0KCk7Zm9yKGNvbnN0IGVtdWxhdGlvbk1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRW11bGF0aW9uTW9kZWwpKQplbXVsYXRpb25Nb2RlbC5vdmVycmlkZUVtdWxhdGVUb3VjaChmYWxzZSk7aWYodGhpcy5fb3ZlcmxheU1vZGVsKQp0aGlzLl9vdmVybGF5TW9kZWwuc2V0SGlnaGxpZ2h0ZXIobnVsbCk7fQpfc2NyZWVuY2FzdEZyYW1lKGJhc2U2NERhdGEsbWV0YWRhdGEpe3RoaXMuX2ltYWdlRWxlbWVudC5vbmxvYWQ9KCk9Pnt0aGlzLl9wYWdlU2NhbGVGYWN0b3I9bWV0YWRhdGEucGFnZVNjYWxlRmFjdG9yO3RoaXMuX3NjcmVlbk9mZnNldFRvcD1tZXRhZGF0YS5vZmZzZXRUb3A7dGhpcy5fc2Nyb2xsT2Zmc2V0WD1tZXRhZGF0YS5zY3JvbGxPZmZzZXRYO3RoaXMuX3Njcm9sbE9mZnNldFk9bWV0YWRhdGEuc2Nyb2xsT2Zmc2V0WTtjb25zdCBkZXZpY2VTaXplUmF0aW89bWV0YWRhdGEuZGV2aWNlSGVpZ2h0L21ldGFkYXRhLmRldmljZVdpZHRoO2NvbnN0IGRpbWVuc2lvbnNDU1M9dGhpcy5fdmlld3BvcnREaW1lbnNpb25zKCk7dGhpcy5faW1hZ2Vab29tPU1hdGgubWluKGRpbWVuc2lvbnNDU1Mud2lkdGgvdGhpcy5faW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aCxkaW1lbnNpb25zQ1NTLmhlaWdodC8odGhpcy5faW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aCpkZXZpY2VTaXplUmF0aW8pKTt0aGlzLl92aWV3cG9ydEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7Y29uc3QgYm9yZGVyc1NpemU9U2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5fYm9yZGVyc1NpemU7aWYodGhpcy5faW1hZ2Vab29tPDEuMDEvd2luZG93LmRldmljZVBpeGVsUmF0aW8pCnRoaXMuX2ltYWdlWm9vbT0xL3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX3NjcmVlblpvb209dGhpcy5faW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aCp0aGlzLl9pbWFnZVpvb20vbWV0YWRhdGEuZGV2aWNlV2lkdGg7dGhpcy5fdmlld3BvcnRFbGVtZW50LnN0eWxlLndpZHRoPW1ldGFkYXRhLmRldmljZVdpZHRoKnRoaXMuX3NjcmVlblpvb20rYm9yZGVyc1NpemUrJ3B4Jzt0aGlzLl92aWV3cG9ydEVsZW1lbnQuc3R5bGUuaGVpZ2h0PW1ldGFkYXRhLmRldmljZUhlaWdodCp0aGlzLl9zY3JlZW5ab29tK2JvcmRlcnNTaXplKydweCc7dGhpcy5oaWdobGlnaHRET01Ob2RlKHRoaXMuX2hpZ2hsaWdodE5vZGUsdGhpcy5faGlnaGxpZ2h0Q29uZmlnKTt9O3RoaXMuX2ltYWdlRWxlbWVudC5zcmM9J2RhdGE6aW1hZ2UvanBnO2Jhc2U2NCwnK2Jhc2U2NERhdGE7fQpfaXNHbGFzc1BhbmVBY3RpdmUoKXtyZXR1cm4hdGhpcy5fZ2xhc3NQYW5lRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpO30KX3NjcmVlbmNhc3RWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKXt0aGlzLl90YXJnZXRJbmFjdGl2ZT0hdmlzaWJsZTt0aGlzLl91cGRhdGVHbGFzc3BhbmUoKTt9Cl9vblN1c3BlbmRTdGF0ZUNoYW5nZShldmVudCl7aWYoU0RLLnRhcmdldE1hbmFnZXIuYWxsVGFyZ2V0c1N1c3BlbmRlZCgpKQp0aGlzLl9zdG9wQ2FzdGluZygpO2Vsc2UKdGhpcy5fc3RhcnRDYXN0aW5nKCk7dGhpcy5fdXBkYXRlR2xhc3NwYW5lKCk7fQpfdXBkYXRlR2xhc3NwYW5lKCl7aWYodGhpcy5fdGFyZ2V0SW5hY3RpdmUpe3RoaXMuX2dsYXNzUGFuZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdUaGUgdGFiIGlzIGluYWN0aXZlJyk7dGhpcy5fZ2xhc3NQYW5lRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt9ZWxzZSBpZihTREsudGFyZ2V0TWFuYWdlci5hbGxUYXJnZXRzU3VzcGVuZGVkKCkpe3RoaXMuX2dsYXNzUGFuZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdQcm9maWxpbmcgaW4gcHJvZ3Jlc3MnKTt0aGlzLl9nbGFzc1BhbmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO31lbHNle3RoaXMuX2dsYXNzUGFuZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fX0KYXN5bmMgX2hhbmRsZU1vdXNlRXZlbnQoZXZlbnQpe2lmKHRoaXMuX2lzR2xhc3NQYW5lQWN0aXZlKCkpe2V2ZW50LmNvbnN1bWUoKTtyZXR1cm47fQppZighdGhpcy5fcGFnZVNjYWxlRmFjdG9yfHwhdGhpcy5fZG9tTW9kZWwpCnJldHVybjtpZighdGhpcy5faW5zcGVjdE1vZGVDb25maWd8fGV2ZW50LnR5cGU9PT0nbW91c2V3aGVlbCcpe2lmKHRoaXMuX2lucHV0TW9kZWwpCnRoaXMuX2lucHV0TW9kZWwuZW1pdFRvdWNoRnJvbU1vdXNlRXZlbnQoZXZlbnQsdGhpcy5fc2NyZWVuT2Zmc2V0VG9wLHRoaXMuX3NjcmVlblpvb20pO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aWYoZXZlbnQudHlwZT09PSdtb3VzZWRvd24nKQp0aGlzLl9jYW52YXNFbGVtZW50LmZvY3VzKCk7cmV0dXJuO30KY29uc3QgcG9zaXRpb249dGhpcy5fY29udmVydEludG9TY3JlZW5TcGFjZShldmVudCk7Y29uc3Qgbm9kZT1hd2FpdCB0aGlzLl9kb21Nb2RlbC5ub2RlRm9yTG9jYXRpb24oTWF0aC5mbG9vcihwb3NpdGlvbi54L3RoaXMuX3BhZ2VTY2FsZUZhY3Rvcit0aGlzLl9zY3JvbGxPZmZzZXRYKSxNYXRoLmZsb29yKHBvc2l0aW9uLnkvdGhpcy5fcGFnZVNjYWxlRmFjdG9yK3RoaXMuX3Njcm9sbE9mZnNldFkpLENvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93VUFTaGFkb3dET00nKS5nZXQoKSk7aWYoIW5vZGUpCnJldHVybjtpZihldmVudC50eXBlPT09J21vdXNlbW92ZScpe3RoaXMuaGlnaGxpZ2h0RE9NTm9kZShub2RlLHRoaXMuX2luc3BlY3RNb2RlQ29uZmlnKTt0aGlzLl9kb21Nb2RlbC5vdmVybGF5TW9kZWwoKS5ub2RlSGlnaGxpZ2h0UmVxdWVzdGVkKG5vZGUuaWQpO31lbHNlIGlmKGV2ZW50LnR5cGU9PT0nY2xpY2snKXtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKG5vZGUpO319Cl9oYW5kbGVLZXlFdmVudChldmVudCl7aWYodGhpcy5faXNHbGFzc1BhbmVBY3RpdmUoKSl7ZXZlbnQuY29uc3VtZSgpO3JldHVybjt9CmNvbnN0IHNob3J0Y3V0S2V5PVVJLktleWJvYXJkU2hvcnRjdXQubWFrZUtleUZyb21FdmVudCgoZXZlbnQpKTtjb25zdCBoYW5kbGVyPXRoaXMuX3Nob3J0Y3V0c1tzaG9ydGN1dEtleV07aWYoaGFuZGxlciYmaGFuZGxlcihldmVudCkpe2V2ZW50LmNvbnN1bWUoKTtyZXR1cm47fQppZih0aGlzLl9pbnB1dE1vZGVsKQp0aGlzLl9pbnB1dE1vZGVsLmVtaXRLZXlFdmVudChldmVudCk7ZXZlbnQuY29uc3VtZSgpO3RoaXMuX2NhbnZhc0VsZW1lbnQuZm9jdXMoKTt9Cl9oYW5kbGVDb250ZXh0TWVudUV2ZW50KGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO30KX2hhbmRsZUJsdXJFdmVudChldmVudCl7aWYodGhpcy5faW5wdXRNb2RlbCkKdGhpcy5faW5wdXRNb2RlbC5jYW5jZWxUb3VjaCgpO30KX2NvbnZlcnRJbnRvU2NyZWVuU3BhY2UoZXZlbnQpe2NvbnN0IHBvc2l0aW9uPXt9O3Bvc2l0aW9uLng9TWF0aC5yb3VuZChldmVudC5vZmZzZXRYL3RoaXMuX3NjcmVlblpvb20pO3Bvc2l0aW9uLnk9TWF0aC5yb3VuZChldmVudC5vZmZzZXRZL3RoaXMuX3NjcmVlblpvb20tdGhpcy5fc2NyZWVuT2Zmc2V0VG9wKTtyZXR1cm4gcG9zaXRpb247fQpvblJlc2l6ZSgpe2lmKHRoaXMuX2RlZmVycmVkQ2FzdGluZyl7Y2xlYXJUaW1lb3V0KHRoaXMuX2RlZmVycmVkQ2FzdGluZyk7ZGVsZXRlIHRoaXMuX2RlZmVycmVkQ2FzdGluZzt9CnRoaXMuX3N0b3BDYXN0aW5nKCk7dGhpcy5fZGVmZXJyZWRDYXN0aW5nPXNldFRpbWVvdXQodGhpcy5fc3RhcnRDYXN0aW5nLmJpbmQodGhpcyksMTAwKTt9CmhpZ2hsaWdodERPTU5vZGUobm9kZSxjb25maWcsYmFja2VuZE5vZGVJZCxvYmplY3RJZCl7dGhpcy5faGlnaGxpZ2h0Tm9kZT1ub2RlO3RoaXMuX2hpZ2hsaWdodENvbmZpZz1jb25maWc7aWYoIW5vZGUpe3RoaXMuX21vZGVsPW51bGw7dGhpcy5fY29uZmlnPW51bGw7dGhpcy5fbm9kZT1udWxsO3RoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0aGlzLl9yZXBhaW50KCk7cmV0dXJuO30KdGhpcy5fbm9kZT1ub2RlO25vZGUuYm94TW9kZWwoKS50aGVuKG1vZGVsPT57aWYoIW1vZGVsfHwhdGhpcy5fcGFnZVNjYWxlRmFjdG9yKXt0aGlzLl9yZXBhaW50KCk7cmV0dXJuO30KdGhpcy5fbW9kZWw9dGhpcy5fc2NhbGVNb2RlbChtb2RlbCk7dGhpcy5fY29uZmlnPWNvbmZpZzt0aGlzLl9yZXBhaW50KCk7fSk7fQpfc2NhbGVNb2RlbChtb2RlbCl7ZnVuY3Rpb24gc2NhbGVRdWFkKHF1YWQpe2ZvcihsZXQgaT0wO2k8cXVhZC5sZW5ndGg7aSs9Mil7cXVhZFtpXT1xdWFkW2ldKnRoaXMuX3BhZ2VTY2FsZUZhY3Rvcip0aGlzLl9zY3JlZW5ab29tO3F1YWRbaSsxXT0ocXVhZFtpKzFdKnRoaXMuX3BhZ2VTY2FsZUZhY3Rvcit0aGlzLl9zY3JlZW5PZmZzZXRUb3ApKnRoaXMuX3NjcmVlblpvb207fX0Kc2NhbGVRdWFkLmNhbGwodGhpcyxtb2RlbC5jb250ZW50KTtzY2FsZVF1YWQuY2FsbCh0aGlzLG1vZGVsLnBhZGRpbmcpO3NjYWxlUXVhZC5jYWxsKHRoaXMsbW9kZWwuYm9yZGVyKTtzY2FsZVF1YWQuY2FsbCh0aGlzLG1vZGVsLm1hcmdpbik7cmV0dXJuIG1vZGVsO30KX3JlcGFpbnQoKXtjb25zdCBtb2RlbD10aGlzLl9tb2RlbDtjb25zdCBjb25maWc9dGhpcy5fY29uZmlnO2NvbnN0IGNhbnZhc1dpZHRoPXRoaXMuX2NhbnZhc0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7Y29uc3QgY2FudmFzSGVpZ2h0PXRoaXMuX2NhbnZhc0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuX2NhbnZhc0VsZW1lbnQud2lkdGg9d2luZG93LmRldmljZVBpeGVsUmF0aW8qY2FudmFzV2lkdGg7dGhpcy5fY2FudmFzRWxlbWVudC5oZWlnaHQ9d2luZG93LmRldmljZVBpeGVsUmF0aW8qY2FudmFzSGVpZ2h0O3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2NvbnRleHQuc2NhbGUod2luZG93LmRldmljZVBpeGVsUmF0aW8sd2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2NvbnRleHQuZmlsbFN0eWxlPXRoaXMuX2NoZWNrZXJib2FyZFBhdHRlcm47dGhpcy5fY29udGV4dC5maWxsUmVjdCgwLDAsY2FudmFzV2lkdGgsdGhpcy5fc2NyZWVuT2Zmc2V0VG9wKnRoaXMuX3NjcmVlblpvb20pO3RoaXMuX2NvbnRleHQuZmlsbFJlY3QoMCx0aGlzLl9zY3JlZW5PZmZzZXRUb3AqdGhpcy5fc2NyZWVuWm9vbSt0aGlzLl9pbWFnZUVsZW1lbnQubmF0dXJhbEhlaWdodCp0aGlzLl9pbWFnZVpvb20sY2FudmFzV2lkdGgsY2FudmFzSGVpZ2h0KTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKTtpZihtb2RlbCYmY29uZmlnKXt0aGlzLl9jb250ZXh0LnNhdmUoKTtjb25zdCB0cmFuc3BhcmVudENvbG9yPSdyZ2JhKDAsIDAsIDAsIDApJztjb25zdCBxdWFkcz1bXTtpZihtb2RlbC5jb250ZW50JiZjb25maWcuY29udGVudENvbG9yIT09dHJhbnNwYXJlbnRDb2xvcikKcXVhZHMucHVzaCh7cXVhZDptb2RlbC5jb250ZW50LGNvbG9yOmNvbmZpZy5jb250ZW50Q29sb3J9KTtpZihtb2RlbC5wYWRkaW5nJiZjb25maWcucGFkZGluZ0NvbG9yIT09dHJhbnNwYXJlbnRDb2xvcikKcXVhZHMucHVzaCh7cXVhZDptb2RlbC5wYWRkaW5nLGNvbG9yOmNvbmZpZy5wYWRkaW5nQ29sb3J9KTtpZihtb2RlbC5ib3JkZXImJmNvbmZpZy5ib3JkZXJDb2xvciE9PXRyYW5zcGFyZW50Q29sb3IpCnF1YWRzLnB1c2goe3F1YWQ6bW9kZWwuYm9yZGVyLGNvbG9yOmNvbmZpZy5ib3JkZXJDb2xvcn0pO2lmKG1vZGVsLm1hcmdpbiYmY29uZmlnLm1hcmdpbkNvbG9yIT09dHJhbnNwYXJlbnRDb2xvcikKcXVhZHMucHVzaCh7cXVhZDptb2RlbC5tYXJnaW4sY29sb3I6Y29uZmlnLm1hcmdpbkNvbG9yfSk7Zm9yKGxldCBpPXF1YWRzLmxlbmd0aC0xO2k+MDstLWkpCnRoaXMuX2RyYXdPdXRsaW5lZFF1YWRXaXRoQ2xpcChxdWFkc1tpXS5xdWFkLHF1YWRzW2ktMV0ucXVhZCxxdWFkc1tpXS5jb2xvcik7aWYocXVhZHMubGVuZ3RoPjApCnRoaXMuX2RyYXdPdXRsaW5lZFF1YWQocXVhZHNbMF0ucXVhZCxxdWFkc1swXS5jb2xvcik7dGhpcy5fY29udGV4dC5yZXN0b3JlKCk7dGhpcy5fZHJhd0VsZW1lbnRUaXRsZSgpO3RoaXMuX2NvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSdkZXN0aW5hdGlvbi1vdmVyJzt9CnRoaXMuX2NvbnRleHQuZHJhd0ltYWdlKHRoaXMuX2ltYWdlRWxlbWVudCwwLHRoaXMuX3NjcmVlbk9mZnNldFRvcCp0aGlzLl9zY3JlZW5ab29tLHRoaXMuX2ltYWdlRWxlbWVudC5uYXR1cmFsV2lkdGgqdGhpcy5faW1hZ2Vab29tLHRoaXMuX2ltYWdlRWxlbWVudC5uYXR1cmFsSGVpZ2h0KnRoaXMuX2ltYWdlWm9vbSk7dGhpcy5fY29udGV4dC5yZXN0b3JlKCk7fQpfY3NzQ29sb3IoY29sb3Ipe2lmKCFjb2xvcikKcmV0dXJuJ3RyYW5zcGFyZW50JztyZXR1cm4gQ29tbW9uLkNvbG9yLmZyb21SR0JBKFtjb2xvci5yLGNvbG9yLmcsY29sb3IuYixjb2xvci5hXSkuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKXx8Jyc7fQpfcXVhZFRvUGF0aChxdWFkKXt0aGlzLl9jb250ZXh0LmJlZ2luUGF0aCgpO3RoaXMuX2NvbnRleHQubW92ZVRvKHF1YWRbMF0scXVhZFsxXSk7dGhpcy5fY29udGV4dC5saW5lVG8ocXVhZFsyXSxxdWFkWzNdKTt0aGlzLl9jb250ZXh0LmxpbmVUbyhxdWFkWzRdLHF1YWRbNV0pO3RoaXMuX2NvbnRleHQubGluZVRvKHF1YWRbNl0scXVhZFs3XSk7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtyZXR1cm4gdGhpcy5fY29udGV4dDt9Cl9kcmF3T3V0bGluZWRRdWFkKHF1YWQsZmlsbENvbG9yKXt0aGlzLl9jb250ZXh0LnNhdmUoKTt0aGlzLl9jb250ZXh0LmxpbmVXaWR0aD0yO3RoaXMuX3F1YWRUb1BhdGgocXVhZCkuY2xpcCgpO3RoaXMuX2NvbnRleHQuZmlsbFN0eWxlPXRoaXMuX2Nzc0NvbG9yKGZpbGxDb2xvcik7dGhpcy5fY29udGV4dC5maWxsKCk7dGhpcy5fY29udGV4dC5yZXN0b3JlKCk7fQpfZHJhd091dGxpbmVkUXVhZFdpdGhDbGlwKHF1YWQsY2xpcFF1YWQsZmlsbENvbG9yKXt0aGlzLl9jb250ZXh0LmZpbGxTdHlsZT10aGlzLl9jc3NDb2xvcihmaWxsQ29sb3IpO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2NvbnRleHQubGluZVdpZHRoPTA7dGhpcy5fcXVhZFRvUGF0aChxdWFkKS5maWxsKCk7dGhpcy5fY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249J2Rlc3RpbmF0aW9uLW91dCc7dGhpcy5fY29udGV4dC5maWxsU3R5bGU9J3JlZCc7dGhpcy5fcXVhZFRvUGF0aChjbGlwUXVhZCkuZmlsbCgpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpO30KX2RyYXdFbGVtZW50VGl0bGUoKXtpZighdGhpcy5fbm9kZSkKcmV0dXJuO2NvbnN0IGNhbnZhc1dpZHRoPXRoaXMuX2NhbnZhc0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7Y29uc3QgY2FudmFzSGVpZ2h0PXRoaXMuX2NhbnZhc0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O2NvbnN0IGxvd2VyQ2FzZU5hbWU9dGhpcy5fbm9kZS5sb2NhbE5hbWUoKXx8dGhpcy5fbm9kZS5ub2RlTmFtZSgpLnRvTG93ZXJDYXNlKCk7dGhpcy5fdGFnTmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bG93ZXJDYXNlTmFtZTt0aGlzLl9ub2RlSWRFbGVtZW50LnRleHRDb250ZW50PXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKCdpZCcpPycjJyt0aGlzLl9ub2RlLmdldEF0dHJpYnV0ZSgnaWQnKTonJzt0aGlzLl9ub2RlSWRFbGVtZW50LnRleHRDb250ZW50PXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKCdpZCcpPycjJyt0aGlzLl9ub2RlLmdldEF0dHJpYnV0ZSgnaWQnKTonJztsZXQgY2xhc3NOYW1lPXRoaXMuX25vZGUuZ2V0QXR0cmlidXRlKCdjbGFzcycpO2lmKGNsYXNzTmFtZSYmY2xhc3NOYW1lLmxlbmd0aD41MCkKY2xhc3NOYW1lPWNsYXNzTmFtZS5zdWJzdHJpbmcoMCw1MCkrJ1x1MjAyNic7dGhpcy5fY2xhc3NOYW1lRWxlbWVudC50ZXh0Q29udGVudD1jbGFzc05hbWV8fCcnO3RoaXMuX25vZGVXaWR0aEVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5fbW9kZWwud2lkdGg7dGhpcy5fbm9kZUhlaWdodEVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5fbW9kZWwuaGVpZ2h0O3RoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtjb25zdCB0aXRsZVdpZHRoPXRoaXMuX3RpdGxlRWxlbWVudC5vZmZzZXRXaWR0aCs2O2NvbnN0IHRpdGxlSGVpZ2h0PXRoaXMuX3RpdGxlRWxlbWVudC5vZmZzZXRIZWlnaHQrNDtjb25zdCBhbmNob3JUb3A9dGhpcy5fbW9kZWwubWFyZ2luWzFdO2NvbnN0IGFuY2hvckJvdHRvbT10aGlzLl9tb2RlbC5tYXJnaW5bN107Y29uc3QgYXJyb3dIZWlnaHQ9NztsZXQgcmVuZGVyQXJyb3dVcD1mYWxzZTtsZXQgcmVuZGVyQXJyb3dEb3duPWZhbHNlO2xldCBib3hYPU1hdGgubWF4KDIsdGhpcy5fbW9kZWwubWFyZ2luWzBdKTtpZihib3hYK3RpdGxlV2lkdGg+Y2FudmFzV2lkdGgpCmJveFg9Y2FudmFzV2lkdGgtdGl0bGVXaWR0aC0yO2xldCBib3hZO2lmKGFuY2hvclRvcD5jYW52YXNIZWlnaHQpe2JveFk9Y2FudmFzSGVpZ2h0LXRpdGxlSGVpZ2h0LWFycm93SGVpZ2h0O3JlbmRlckFycm93RG93bj10cnVlO31lbHNlIGlmKGFuY2hvckJvdHRvbTwwKXtib3hZPWFycm93SGVpZ2h0O3JlbmRlckFycm93VXA9dHJ1ZTt9ZWxzZSBpZihhbmNob3JCb3R0b20rdGl0bGVIZWlnaHQrYXJyb3dIZWlnaHQ8Y2FudmFzSGVpZ2h0KXtib3hZPWFuY2hvckJvdHRvbSthcnJvd0hlaWdodC00O3JlbmRlckFycm93VXA9dHJ1ZTt9ZWxzZSBpZihhbmNob3JUb3AtdGl0bGVIZWlnaHQtYXJyb3dIZWlnaHQ+MCl7Ym94WT1hbmNob3JUb3AtdGl0bGVIZWlnaHQtYXJyb3dIZWlnaHQrMztyZW5kZXJBcnJvd0Rvd249dHJ1ZTt9ZWxzZXtib3hZPWFycm93SGVpZ2h0O30KdGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fY29udGV4dC50cmFuc2xhdGUoMC41LDAuNSk7dGhpcy5fY29udGV4dC5iZWdpblBhdGgoKTt0aGlzLl9jb250ZXh0Lm1vdmVUbyhib3hYLGJveFkpO2lmKHJlbmRlckFycm93VXApe3RoaXMuX2NvbnRleHQubGluZVRvKGJveFgrMiphcnJvd0hlaWdodCxib3hZKTt0aGlzLl9jb250ZXh0LmxpbmVUbyhib3hYKzMqYXJyb3dIZWlnaHQsYm94WS1hcnJvd0hlaWdodCk7dGhpcy5fY29udGV4dC5saW5lVG8oYm94WCs0KmFycm93SGVpZ2h0LGJveFkpO30KdGhpcy5fY29udGV4dC5saW5lVG8oYm94WCt0aXRsZVdpZHRoLGJveFkpO3RoaXMuX2NvbnRleHQubGluZVRvKGJveFgrdGl0bGVXaWR0aCxib3hZK3RpdGxlSGVpZ2h0KTtpZihyZW5kZXJBcnJvd0Rvd24pe3RoaXMuX2NvbnRleHQubGluZVRvKGJveFgrNCphcnJvd0hlaWdodCxib3hZK3RpdGxlSGVpZ2h0KTt0aGlzLl9jb250ZXh0LmxpbmVUbyhib3hYKzMqYXJyb3dIZWlnaHQsYm94WSt0aXRsZUhlaWdodCthcnJvd0hlaWdodCk7dGhpcy5fY29udGV4dC5saW5lVG8oYm94WCsyKmFycm93SGVpZ2h0LGJveFkrdGl0bGVIZWlnaHQpO30KdGhpcy5fY29udGV4dC5saW5lVG8oYm94WCxib3hZK3RpdGxlSGVpZ2h0KTt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2NvbnRleHQuZmlsbFN0eWxlPSdyZ2IoMjU1LCAyNTUsIDE5NCknO3RoaXMuX2NvbnRleHQuZmlsbCgpO3RoaXMuX2NvbnRleHQuc3Ryb2tlU3R5bGU9J3JnYigxMjgsIDEyOCwgMTI4KSc7dGhpcy5fY29udGV4dC5zdHJva2UoKTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKTt0aGlzLl90aXRsZUVsZW1lbnQuc3R5bGUudG9wPShib3hZKzMpKydweCc7dGhpcy5fdGl0bGVFbGVtZW50LnN0eWxlLmxlZnQ9KGJveFgrMykrJ3B4Jzt9Cl92aWV3cG9ydERpbWVuc2lvbnMoKXtjb25zdCBndXR0ZXJTaXplPTMwO2NvbnN0IGJvcmRlcnNTaXplPVNjcmVlbmNhc3QuU2NyZWVuY2FzdFZpZXcuX2JvcmRlcnNTaXplO2NvbnN0IHdpZHRoPXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aC1ib3JkZXJzU2l6ZS1ndXR0ZXJTaXplO2NvbnN0IGhlaWdodD10aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0LWJvcmRlcnNTaXplLWd1dHRlclNpemUtU2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5fbmF2QmFySGVpZ2h0O3JldHVybnt3aWR0aDp3aWR0aCxoZWlnaHQ6aGVpZ2h0fTt9CnNldEluc3BlY3RNb2RlKG1vZGUsY29uZmlnKXt0aGlzLl9pbnNwZWN0TW9kZUNvbmZpZz1tb2RlIT09UHJvdG9jb2wuT3ZlcmxheS5JbnNwZWN0TW9kZS5Ob25lP2NvbmZpZzpudWxsO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmhpZ2hsaWdodEZyYW1lKGZyYW1lSWQpe30KX2NyZWF0ZUNoZWNrZXJib2FyZFBhdHRlcm4oY29udGV4dCl7Y29uc3QgcGF0dGVybj0oY3JlYXRlRWxlbWVudCgnY2FudmFzJykpO2NvbnN0IHNpemU9MzI7cGF0dGVybi53aWR0aD1zaXplKjI7cGF0dGVybi5oZWlnaHQ9c2l6ZSoyO2NvbnN0IHBjdHg9cGF0dGVybi5nZXRDb250ZXh0KCcyZCcpO3BjdHguZmlsbFN0eWxlPSdyZ2IoMTk1LCAxOTUsIDE5NSknO3BjdHguZmlsbFJlY3QoMCwwLHNpemUqMixzaXplKjIpO3BjdHguZmlsbFN0eWxlPSdyZ2IoMjI1LCAyMjUsIDIyNSknO3BjdHguZmlsbFJlY3QoMCwwLHNpemUsc2l6ZSk7cGN0eC5maWxsUmVjdChzaXplLHNpemUsc2l6ZSxzaXplKTtyZXR1cm4gY29udGV4dC5jcmVhdGVQYXR0ZXJuKHBhdHRlcm4sJ3JlcGVhdCcpO30KX2NyZWF0ZU5hdmlnYXRpb25CYXIoKXt0aGlzLl9uYXZpZ2F0aW9uQmFyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2NyZWVuY2FzdC1uYXZpZ2F0aW9uJyk7dGhpcy5fbmF2aWdhdGlvbkJhY2s9dGhpcy5fbmF2aWdhdGlvbkJhci5jcmVhdGVDaGlsZCgnYnV0dG9uJywnYmFjaycpO3RoaXMuX25hdmlnYXRpb25CYWNrLmRpc2FibGVkPXRydWU7dGhpcy5fbmF2aWdhdGlvbkZvcndhcmQ9dGhpcy5fbmF2aWdhdGlvbkJhci5jcmVhdGVDaGlsZCgnYnV0dG9uJywnZm9yd2FyZCcpO3RoaXMuX25hdmlnYXRpb25Gb3J3YXJkLmRpc2FibGVkPXRydWU7dGhpcy5fbmF2aWdhdGlvblJlbG9hZD10aGlzLl9uYXZpZ2F0aW9uQmFyLmNyZWF0ZUNoaWxkKCdidXR0b24nLCdyZWxvYWQnKTt0aGlzLl9uYXZpZ2F0aW9uVXJsPVVJLmNyZWF0ZUlucHV0KCk7dGhpcy5fbmF2aWdhdGlvbkJhci5hcHBlbmRDaGlsZCh0aGlzLl9uYXZpZ2F0aW9uVXJsKTt0aGlzLl9uYXZpZ2F0aW9uVXJsLnR5cGU9J3RleHQnO3RoaXMuX25hdmlnYXRpb25Qcm9ncmVzc0Jhcj1uZXcgU2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5Qcm9ncmVzc1RyYWNrZXIodGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwsdGhpcy5fbmV0d29ya01hbmFnZXIsdGhpcy5fbmF2aWdhdGlvbkJhci5jcmVhdGVDaGlsZCgnZGl2JywncHJvZ3Jlc3MnKSk7aWYodGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwpe3RoaXMuX25hdmlnYXRpb25CYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9uYXZpZ2F0ZVRvSGlzdG9yeUVudHJ5LmJpbmQodGhpcywtMSksZmFsc2UpO3RoaXMuX25hdmlnYXRpb25Gb3J3YXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9uYXZpZ2F0ZVRvSGlzdG9yeUVudHJ5LmJpbmQodGhpcywxKSxmYWxzZSk7dGhpcy5fbmF2aWdhdGlvblJlbG9hZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fbmF2aWdhdGVSZWxvYWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbmF2aWdhdGlvblVybC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsdGhpcy5fbmF2aWdhdGlvblVybEtleVVwLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fcmVxdWVzdE5hdmlnYXRpb25IaXN0b3J5KCk7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLk1haW5GcmFtZU5hdmlnYXRlZCx0aGlzLl9yZXF1ZXN0TmF2aWdhdGlvbkhpc3RvcnksdGhpcyk7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkNhY2hlZFJlc291cmNlc0xvYWRlZCx0aGlzLl9yZXF1ZXN0TmF2aWdhdGlvbkhpc3RvcnksdGhpcyk7fX0KX25hdmlnYXRlVG9IaXN0b3J5RW50cnkob2Zmc2V0KXtjb25zdCBuZXdJbmRleD10aGlzLl9oaXN0b3J5SW5kZXgrb2Zmc2V0O2lmKG5ld0luZGV4PDB8fG5ld0luZGV4Pj10aGlzLl9oaXN0b3J5RW50cmllcy5sZW5ndGgpCnJldHVybjt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5uYXZpZ2F0ZVRvSGlzdG9yeUVudHJ5KHRoaXMuX2hpc3RvcnlFbnRyaWVzW25ld0luZGV4XSk7dGhpcy5fcmVxdWVzdE5hdmlnYXRpb25IaXN0b3J5KCk7fQpfbmF2aWdhdGVSZWxvYWQoKXt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5yZWxvYWRQYWdlKCk7fQpfbmF2aWdhdGlvblVybEtleVVwKGV2ZW50KXtpZihldmVudC5rZXkhPT0nRW50ZXInKQpyZXR1cm47bGV0IHVybD10aGlzLl9uYXZpZ2F0aW9uVXJsLnZhbHVlO2lmKCF1cmwpCnJldHVybjtpZighdXJsLm1hdGNoKFNjcmVlbmNhc3QuU2NyZWVuY2FzdFZpZXcuX1NjaGVtZVJlZ2V4KSkKdXJsPSdodHRwOi8vJyt1cmw7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwubmF2aWdhdGUodXJsKTt0aGlzLl9jYW52YXNFbGVtZW50LmZvY3VzKCk7fQphc3luYyBfcmVxdWVzdE5hdmlnYXRpb25IaXN0b3J5KCl7Y29uc3QgaGlzdG9yeT1hd2FpdCB0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5uYXZpZ2F0aW9uSGlzdG9yeSgpO2lmKCFoaXN0b3J5KQpyZXR1cm47dGhpcy5faGlzdG9yeUluZGV4PWhpc3RvcnkuY3VycmVudEluZGV4O3RoaXMuX2hpc3RvcnlFbnRyaWVzPWhpc3RvcnkuZW50cmllczt0aGlzLl9uYXZpZ2F0aW9uQmFjay5kaXNhYmxlZD10aGlzLl9oaXN0b3J5SW5kZXg9PT0wO3RoaXMuX25hdmlnYXRpb25Gb3J3YXJkLmRpc2FibGVkPXRoaXMuX2hpc3RvcnlJbmRleD09PSh0aGlzLl9oaXN0b3J5RW50cmllcy5sZW5ndGgtMSk7bGV0IHVybD10aGlzLl9oaXN0b3J5RW50cmllc1t0aGlzLl9oaXN0b3J5SW5kZXhdLnVybDtjb25zdCBtYXRjaD11cmwubWF0Y2goU2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5fSHR0cFJlZ2V4KTtpZihtYXRjaCkKdXJsPW1hdGNoWzFdO0luc3BlY3RvckZyb250ZW5kSG9zdC5pbnNwZWN0ZWRVUkxDaGFuZ2VkKHVybCk7dGhpcy5fbmF2aWdhdGlvblVybC52YWx1ZT11cmw7fQpfZm9jdXNOYXZpZ2F0aW9uQmFyKCl7dGhpcy5fbmF2aWdhdGlvblVybC5mb2N1cygpO3RoaXMuX25hdmlnYXRpb25Vcmwuc2VsZWN0KCk7cmV0dXJuIHRydWU7fX07U2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5fYm9yZGVyc1NpemU9NDQ7U2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5fbmF2QmFySGVpZ2h0PTI5O1NjcmVlbmNhc3QuU2NyZWVuY2FzdFZpZXcuX0h0dHBSZWdleD0vXmh0dHA6XC9cLyguKykvO1NjcmVlbmNhc3QuU2NyZWVuY2FzdFZpZXcuX1NjaGVtZVJlZ2V4PS9eKGh0dHBzP3xhYm91dHxjaHJvbWUpOi87U2NyZWVuY2FzdC5TY3JlZW5jYXN0Vmlldy5Qcm9ncmVzc1RyYWNrZXI9Y2xhc3N7Y29uc3RydWN0b3IocmVzb3VyY2VUcmVlTW9kZWwsbmV0d29ya01hbmFnZXIsZWxlbWVudCl7dGhpcy5fZWxlbWVudD1lbGVtZW50O2lmKHJlc291cmNlVHJlZU1vZGVsKXtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMuX29uTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMpO3Jlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5Mb2FkLHRoaXMuX29uTG9hZCx0aGlzKTt9CmlmKG5ldHdvcmtNYW5hZ2VyKXtuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdFN0YXJ0ZWQsdGhpcy5fb25SZXF1ZXN0U3RhcnRlZCx0aGlzKTtuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdEZpbmlzaGVkLHRoaXMuX29uUmVxdWVzdEZpbmlzaGVkLHRoaXMpO319Cl9vbk1haW5GcmFtZU5hdmlnYXRlZCgpe3RoaXMuX3JlcXVlc3RJZHM9e307dGhpcy5fc3RhcnRlZFJlcXVlc3RzPTA7dGhpcy5fZmluaXNoZWRSZXF1ZXN0cz0wO3RoaXMuX21heERpc3BsYXllZFByb2dyZXNzPTA7dGhpcy5fdXBkYXRlUHJvZ3Jlc3MoMC4xKTt9Cl9vbkxvYWQoKXtkZWxldGUgdGhpcy5fcmVxdWVzdElkczt0aGlzLl91cGRhdGVQcm9ncmVzcygxKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXRoaXMuX25hdmlnYXRpb25Qcm9ncmVzc1Zpc2libGUoKSkKdGhpcy5fZGlzcGxheVByb2dyZXNzKDApO30uYmluZCh0aGlzKSw1MDApO30KX25hdmlnYXRpb25Qcm9ncmVzc1Zpc2libGUoKXtyZXR1cm4hIXRoaXMuX3JlcXVlc3RJZHM7fQpfb25SZXF1ZXN0U3RhcnRlZChldmVudCl7aWYoIXRoaXMuX25hdmlnYXRpb25Qcm9ncmVzc1Zpc2libGUoKSkKcmV0dXJuO2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO2lmKHJlcXVlc3QudHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLldlYlNvY2tldCkKcmV0dXJuO3RoaXMuX3JlcXVlc3RJZHNbcmVxdWVzdC5yZXF1ZXN0SWQoKV09cmVxdWVzdDsrK3RoaXMuX3N0YXJ0ZWRSZXF1ZXN0czt9Cl9vblJlcXVlc3RGaW5pc2hlZChldmVudCl7aWYoIXRoaXMuX25hdmlnYXRpb25Qcm9ncmVzc1Zpc2libGUoKSkKcmV0dXJuO2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO2lmKCEocmVxdWVzdC5yZXF1ZXN0SWQoKWluIHRoaXMuX3JlcXVlc3RJZHMpKQpyZXR1cm47Kyt0aGlzLl9maW5pc2hlZFJlcXVlc3RzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9ncmVzcyh0aGlzLl9maW5pc2hlZFJlcXVlc3RzL3RoaXMuX3N0YXJ0ZWRSZXF1ZXN0cyowLjkpO30uYmluZCh0aGlzKSw1MDApO30KX3VwZGF0ZVByb2dyZXNzKHByb2dyZXNzKXtpZighdGhpcy5fbmF2aWdhdGlvblByb2dyZXNzVmlzaWJsZSgpKQpyZXR1cm47aWYodGhpcy5fbWF4RGlzcGxheWVkUHJvZ3Jlc3M+PXByb2dyZXNzKQpyZXR1cm47dGhpcy5fbWF4RGlzcGxheWVkUHJvZ3Jlc3M9cHJvZ3Jlc3M7dGhpcy5fZGlzcGxheVByb2dyZXNzKHByb2dyZXNzKTt9Cl9kaXNwbGF5UHJvZ3Jlc3MocHJvZ3Jlc3Mpe3RoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGg9KDEwMCpwcm9ncmVzcykrJyUnO319Ozs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNjcmVlbmNhc3Qvc2NyZWVuY2FzdFZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuICogZGlzdHJpYnV0aW9uLlxuICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5zY3JlZW5jYXN0IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uc2NyZWVuY2FzdC1uYXZpZ2F0aW9uIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogMjRweCAwIDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctbGVmdDogMXB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoNjQlLCA2NCUsIDY0JSk7XG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94O1xuICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG59XG5cbi5zY3JlZW5jYXN0LW5hdmlnYXRpb24gYnV0dG9uIHtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1pbWFnZS1zZXQoXG4gICAgICAgIHVybChJbWFnZXMvbmF2aWdhdGlvbkNvbnRyb2xzLnBuZykgMXgsXG4gICAgICAgIHVybChJbWFnZXMvbmF2aWdhdGlvbkNvbnRyb2xzXzJ4LnBuZykgMngpO1xuICAgIGJhY2tncm91bmQtY2xpcDogY29udGVudC1ib3g7XG4gICAgYmFja2dyb3VuZC1vcmlnaW46IGNvbnRlbnQtYm94O1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgaGVpZ2h0OiAyM3B4O1xuICAgIHBhZGRpbmc6IDJweDtcbiAgICB3aWR0aDogMjNweDtcbn1cblxuLnNjcmVlbmNhc3QtbmF2aWdhdGlvbiBidXR0b246aG92ZXIge1xuICAgIGJvcmRlci1jb2xvcjogI2NjYztcbn1cblxuLnNjcmVlbmNhc3QtbmF2aWdhdGlvbiBidXR0b246YWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICNhYWE7XG59XG5cbi5zY3JlZW5jYXN0LW5hdmlnYXRpb24gYnV0dG9uW2Rpc2FibGVkXSB7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4uc2NyZWVuY2FzdC1uYXZpZ2F0aW9uIGJ1dHRvbi5iYWNrIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6IC0xcHg7XG59XG5cbi5zY3JlZW5jYXN0LW5hdmlnYXRpb24gYnV0dG9uLmZvcndhcmQge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teDogLTE4cHg7XG59XG5cbi5zY3JlZW5jYXN0LW5hdmlnYXRpb24gYnV0dG9uLnJlbG9hZCB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi14OiAtMzdweDtcbn1cblxuLnNjcmVlbmNhc3QtbmF2aWdhdGlvbiBpbnB1dCB7XG4gICAgLXdlYmtpdC1mbGV4OiAxO1xuICAgIG1hcmdpbjogMnB4O1xuICAgIG1heC1oZWlnaHQ6IDE5cHg7XG59XG5cbi5zY3JlZW5jYXN0LW5hdmlnYXRpb24gLnByb2dyZXNzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNjYsIDEyOSwgMjM1KTtcbiAgICBoZWlnaHQ6IDNweDtcbiAgICBsZWZ0OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7ICAvKiBBbGlnbiB3aXRoIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgcGFyZW50LiAqL1xuICAgIHdpZHRoOiAwO1xuICAgIHotaW5kZXg6IDI7ICAvKiBBYm92ZSAuc2NyZWVuY2FzdC1nbGFzc3BhbmUuICovXG59XG5cbi5zY3JlZW5jYXN0LXZpZXdwb3J0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7XG4gICAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgICBmbGV4OiBub25lO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi5zY3JlZW5jYXN0LWNhbnZhcy1jb250YWluZXIge1xuICAgIGZsZXg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBjdXJzb3I6IC13ZWJraXQtaW1hZ2Utc2V0KHVybChJbWFnZXMvdG91Y2hDdXJzb3IucG5nKSAxeCwgdXJsKEltYWdlcy90b3VjaEN1cnNvcl8yeC5wbmcpIDJ4KSwgZGVmYXVsdDtcbn1cblxuLnNjcmVlbmNhc3QgY2FudmFzIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNjcmVlbmNhc3QtcHgge1xuICAgIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7XG59XG5cbi5zY3JlZW5jYXN0LWVsZW1lbnQtdGl0bGUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxMDtcbn1cblxuLnNjcmVlbmNhc3QtdGFnLW5hbWUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtdGFnKSAqL1xuICAgIGNvbG9yOiByZ2IoMTM2LCAxOCwgMTI4KTtcbn1cblxuLnNjcmVlbmNhc3Qtbm9kZS1pZCB7XG4gICAgLyogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB2aWV3LXNvdXJjZS5jc3MgKC53ZWJraXQtaHRtbC1hdHRyaWJ1dGUtdmFsdWUpICovXG4gICAgY29sb3I6IHJnYigyNiwgMjYsIDE2Nik7XG59XG5cbi5zY3JlZW5jYXN0LWNsYXNzLW5hbWUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtYXR0cmlidXRlLW5hbWUpICovXG4gICAgY29sb3I6IHJnYigxNTMsIDY5LCAwKTtcbn1cblxuLnNjcmVlbmNhc3QtZ2xhc3NwYW5lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2NyZWVuY2FzdC9zY3JlZW5jYXN0Vmlldy5jc3MgKi8iOzwhLS0KICogQ29weXJpZ2h0IDIwMTggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+CjwhZG9jdHlwZSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9Im9iamVjdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICdzZWxmJyAndW5zYWZlLWV2YWwnICd1bnNhZmUtaW5saW5lJyBodHRwczovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbSI+CiAgICA8bWV0YSBuYW1lPSJyZWZlcnJlciIgY29udGVudD0ibm8tcmVmZXJyZXIiPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ic2hlbGwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianNfYXBwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+UnVudGltZS5zdGFydEFwcGxpY2F0aW9uKCdqc19hcHAnKTs8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBjbGFzcz0idW5kb2NrZWQiIGlkPSItYmxpbmstZGV2LXRvb2xzIj48L2JvZHk+CjwvaHRtbD4KYWxsRGVzY3JpcHRvcnMucHVzaCguLi5beyJkZXBlbmRlbmNpZXMiOlsiY29tcG9uZW50cyJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJKc01haW4uSnNNYWluIiwidHlwZSI6ImVhcmx5LWluaXRpYWxpemF0aW9uIn1dLCJuYW1lIjoianNfbWFpbiJ9LHsiZGVwZW5kZW5jaWVzIjpbInByb2ZpbGVyIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiUHJvZmlsZXIiLCJpZCI6ImpzX3Byb2ZpbGVyIiwiY2xhc3NOYW1lIjoiUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjY1fV0sIm5hbWUiOiJqc19wcm9maWxlciJ9XSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXMucHVzaCguLi5beyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImpzX21haW4ifSx7Im5hbWUiOiJqc19wcm9maWxlciJ9XSkKc2VsZlsnSnNNYWluJ109c2VsZlsnSnNNYWluJ118fHt9O0pzTWFpbi5Kc01haW49Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e3J1bigpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQ29ubmVjdFRvTm9kZUpTRGlyZWN0bHkpO2NvbnN0IHRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5jcmVhdGVUYXJnZXQoJ21haW4nLENvbW1vbi5VSVN0cmluZygnTWFpbicpLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5KUyx0aGlzLl9jcmVhdGVNYWluQ29ubmVjdGlvbi5iaW5kKHRoaXMpLG51bGwsdHJ1ZSk7dGFyZ2V0LnJ1bnRpbWVBZ2VudCgpLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvbm5lY3Rpb25SZWFkeSgpO30KX2NyZWF0ZU1haW5Db25uZWN0aW9uKHBhcmFtcyl7cmV0dXJuIFNESy5jcmVhdGVNYWluQ29ubmVjdGlvbihwYXJhbXMsKCk9PkNvbXBvbmVudHMuVGFyZ2V0RGV0YWNoZWREaWFsb2cud2ViU29ja2V0Q29ubmVjdGlvbkxvc3QoKSk7fX07Ozs8IS0tCiAqIENvcHlyaWdodCAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0tPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWwgbGFuZz0iZW4iPgo8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2VjdXJpdHktUG9saWN5IiBjb250ZW50PSJvYmplY3Qtc3JjICdub25lJzsgc2NyaXB0LXNyYyAnc2VsZicgJ3Vuc2FmZS1ldmFsJyAndW5zYWZlLWlubGluZScgaHR0cHM6Ly9jaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQuYXBwc3BvdC5jb20iPgogICAgPG1ldGEgbmFtZT0icmVmZXJyZXIiIGNvbnRlbnQ9Im5vLXJlZmVycmVyIj4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InNoZWxsLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Im5vZGVfYXBwLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+UnVudGltZS5zdGFydEFwcGxpY2F0aW9uKCdub2RlX2FwcCcpOzwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ1bmRvY2tlZCIgaWQ9Ii1ibGluay1kZXYtdG9vbHMiPjwvYm9keT4KPC9odG1sPgphbGxEZXNjcmlwdG9ycy5wdXNoKC4uLlt7ImRlcGVuZGVuY2llcyI6WyJzb3VyY2VzIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiTm9kZSIsImlkIjoibmF2aWdhdG9yLW5ldHdvcmsiLCJjbGFzc05hbWUiOiJTb3VyY2VzLk5ldHdvcmtOYXZpZ2F0b3JWaWV3IiwibG9jYXRpb24iOiJuYXZpZ2F0b3ItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjIsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In1dLCJuYW1lIjoibm9kZV9kZWJ1Z2dlciJ9LHsiZGVwZW5kZW5jaWVzIjpbInByb2ZpbGVyIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiUHJvZmlsZXIiLCJpZCI6ImpzX3Byb2ZpbGVyIiwiY2xhc3NOYW1lIjoiUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjY1fV0sIm5hbWUiOiJqc19wcm9maWxlciJ9LHsiZGVwZW5kZW5jaWVzIjpbInBsYXRmb3JtIiwidWkiLCJob3N0IiwiY29tcG9uZW50cyJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJOb2RlTWFpbi5Ob2RlTWFpbiIsInR5cGUiOiJlYXJseS1pbml0aWFsaXphdGlvbiJ9LHsidGl0bGUiOiJDb25uZWN0aW9uIiwidGFncyI6Im5vZGUiLCJpZCI6Im5vZGUtY29ubmVjdGlvbiIsImNsYXNzTmFtZSI6Ik5vZGVNYWluLk5vZGVDb25uZWN0aW9uc1BhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjB9XSwibmFtZSI6Im5vZGVfbWFpbiJ9XSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXMucHVzaCguLi5beyJuYW1lIjoibm9kZV9kZWJ1Z2dlciJ9LHsibmFtZSI6ImpzX3Byb2ZpbGVyIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6Im5vZGVfbWFpbiJ9XSkKc2VsZlsnTm9kZU1haW4nXT1zZWxmWydOb2RlTWFpbiddfHx7fTtOb2RlTWFpbi5Ob2RlQ29ubmVjdGlvbnNQYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKCl7c3VwZXIoJ25vZGUtY29ubmVjdGlvbicpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbm9kZV9tYWluL25vZGVDb25uZWN0aW9uc1BhbmVsLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbm9kZS1wYW5lbCcpO2NvbnN0IGNvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdub2RlLXBhbmVsLWNlbnRlcicpO2NvbnN0IGltYWdlPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnaW1nJywnbm9kZS1wYW5lbC1sb2dvJyk7aW1hZ2Uuc3JjPSdodHRwczovL25vZGVqcy5vcmcvc3RhdGljL2ltYWdlcy9sb2dvcy9ub2RlanMtbmV3LXBhbnRvbmUtYmxhY2sucG5nJztJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5EZXZpY2VzRGlzY292ZXJ5Q29uZmlnQ2hhbmdlZCx0aGlzLl9kZXZpY2VzRGlzY292ZXJ5Q29uZmlnQ2hhbmdlZCx0aGlzKTt0aGlzLl9jb25maWc7dGhpcy5jb250ZW50RWxlbWVudC50YWJJbmRleD0wO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuY29udGVudEVsZW1lbnQpO0luc3BlY3RvckZyb250ZW5kSG9zdC5zZXREZXZpY2VzVXBkYXRlc0VuYWJsZWQoZmFsc2UpO0luc3BlY3RvckZyb250ZW5kSG9zdC5zZXREZXZpY2VzVXBkYXRlc0VuYWJsZWQodHJ1ZSk7dGhpcy5fbmV0d29ya0Rpc2NvdmVyeVZpZXc9bmV3IE5vZGVNYWluLk5vZGVDb25uZWN0aW9uc1ZpZXcoY29uZmlnPT57dGhpcy5fY29uZmlnLm5ldHdvcmtEaXNjb3ZlcnlDb25maWc9Y29uZmlnO0luc3BlY3RvckZyb250ZW5kSG9zdC5zZXREZXZpY2VzRGlzY292ZXJ5Q29uZmlnKHRoaXMuX2NvbmZpZyk7fSk7dGhpcy5fbmV0d29ya0Rpc2NvdmVyeVZpZXcuc2hvdyhjb250YWluZXIpO30KX2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkKGV2ZW50KXt0aGlzLl9jb25maWc9KGV2ZW50LmRhdGEpO3RoaXMuX25ldHdvcmtEaXNjb3ZlcnlWaWV3LmRpc2NvdmVyeUNvbmZpZ0NoYW5nZWQodGhpcy5fY29uZmlnLm5ldHdvcmtEaXNjb3ZlcnlDb25maWcpO319O05vZGVNYWluLk5vZGVDb25uZWN0aW9uc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGNhbGxiYWNrKXtzdXBlcigpO3RoaXMuX2NhbGxiYWNrPWNhbGxiYWNrO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWRpc2NvdmVyeS12aWV3Jyk7Y29uc3QgbmV0d29ya0Rpc2NvdmVyeUZvb3Rlcj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstZGlzY292ZXJ5LWZvb3RlcicpO25ldHdvcmtEaXNjb3ZlcnlGb290ZXIuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1NwZWNpZnkgbmV0d29yayBlbmRwb2ludCBhbmQgRGV2VG9vbHMgd2lsbCBjb25uZWN0IHRvIGl0IGF1dG9tYXRpY2FsbHkuICcpO2NvbnN0IGxpbms9bmV0d29ya0Rpc2NvdmVyeUZvb3Rlci5jcmVhdGVDaGlsZCgnc3BhbicsJ2xpbmsnKTtsaW5rLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTGVhcm4gbW9yZScpO2xpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKCdodHRwczovL25vZGVqcy5vcmcvZW4vZG9jcy9pbnNwZWN0b3IvJykpO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5yZWdpc3RlclJlcXVpcmVkQ1NTKCdub2RlX21haW4vbm9kZUNvbm5lY3Rpb25zUGFuZWwuY3NzJyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstZGlzY292ZXJ5LWxpc3QnKTtjb25zdCBwbGFjZWhvbGRlcj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCduZXR3b3JrLWRpc2NvdmVyeS1saXN0LWVtcHR5Jyk7cGxhY2Vob2xkZXIudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdObyBjb25uZWN0aW9ucyBzcGVjaWZpZWQnKTt0aGlzLl9saXN0LnNldEVtcHR5UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX2VkaXRvcj1udWxsO2NvbnN0IGFkZEJ1dHRvbj1VSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnQWRkIGNvbm5lY3Rpb24nKSx0aGlzLl9hZGROZXR3b3JrVGFyZ2V0QnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpLCdhZGQtbmV0d29yay10YXJnZXQtYnV0dG9uJyx0cnVlKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYWRkQnV0dG9uKTt0aGlzLl9uZXR3b3JrRGlzY292ZXJ5Q29uZmlnPVtdO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdub2RlLWZyb250ZW5kJyk7fQpfdXBkYXRlKCl7Y29uc3QgY29uZmlnPXRoaXMuX25ldHdvcmtEaXNjb3ZlcnlDb25maWcubWFwKGl0ZW09Pml0ZW0uYWRkcmVzcyk7dGhpcy5fY2FsbGJhY2suY2FsbChudWxsLGNvbmZpZyk7fQpfYWRkTmV0d29ya1RhcmdldEJ1dHRvbkNsaWNrZWQoKXt0aGlzLl9saXN0LmFkZE5ld0l0ZW0odGhpcy5fbmV0d29ya0Rpc2NvdmVyeUNvbmZpZy5sZW5ndGgse2FkZHJlc3M6JycscG9ydDonJ30pO30KZGlzY292ZXJ5Q29uZmlnQ2hhbmdlZChuZXR3b3JrRGlzY292ZXJ5Q29uZmlnKXt0aGlzLl9uZXR3b3JrRGlzY292ZXJ5Q29uZmlnPVtdO3RoaXMuX2xpc3QuY2xlYXIoKTtmb3IoY29uc3QgYWRkcmVzcyBvZiBuZXR3b3JrRGlzY292ZXJ5Q29uZmlnKXtjb25zdCBpdGVtPXthZGRyZXNzOmFkZHJlc3MscG9ydDonJ307dGhpcy5fbmV0d29ya0Rpc2NvdmVyeUNvbmZpZy5wdXNoKGl0ZW0pO3RoaXMuX2xpc3QuYXBwZW5kSXRlbShpdGVtLHRydWUpO319CnJlbmRlckl0ZW0ocnVsZSxlZGl0YWJsZSl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCduZXR3b3JrLWRpc2NvdmVyeS1saXN0LWl0ZW0nKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCduZXR3b3JrLWRpc2NvdmVyeS12YWx1ZSBuZXR3b3JrLWRpc2NvdmVyeS1hZGRyZXNzJykudGV4dENvbnRlbnQ9cnVsZS5hZGRyZXNzO3JldHVybiBlbGVtZW50O30KcmVtb3ZlSXRlbVJlcXVlc3RlZChydWxlLGluZGV4KXt0aGlzLl9uZXR3b3JrRGlzY292ZXJ5Q29uZmlnLnNwbGljZShpbmRleCwxKTt0aGlzLl9saXN0LnJlbW92ZUl0ZW0oaW5kZXgpO3RoaXMuX3VwZGF0ZSgpO30KY29tbWl0RWRpdChydWxlLGVkaXRvcixpc05ldyl7cnVsZS5hZGRyZXNzPWVkaXRvci5jb250cm9sKCdhZGRyZXNzJykudmFsdWUudHJpbSgpO2lmKGlzTmV3KQp0aGlzLl9uZXR3b3JrRGlzY292ZXJ5Q29uZmlnLnB1c2gocnVsZSk7dGhpcy5fdXBkYXRlKCk7fQpiZWdpbkVkaXQocnVsZSl7Y29uc3QgZWRpdG9yPXRoaXMuX2NyZWF0ZUVkaXRvcigpO2VkaXRvci5jb250cm9sKCdhZGRyZXNzJykudmFsdWU9cnVsZS5hZGRyZXNzO3JldHVybiBlZGl0b3I7fQpfY3JlYXRlRWRpdG9yKCl7aWYodGhpcy5fZWRpdG9yKQpyZXR1cm4gdGhpcy5fZWRpdG9yO2NvbnN0IGVkaXRvcj1uZXcgVUkuTGlzdFdpZGdldC5FZGl0b3IoKTt0aGlzLl9lZGl0b3I9ZWRpdG9yO2NvbnN0IGNvbnRlbnQ9ZWRpdG9yLmNvbnRlbnRFbGVtZW50KCk7Y29uc3QgZmllbGRzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstZGlzY292ZXJ5LWVkaXQtcm93Jyk7Y29uc3QgaW5wdXQ9ZWRpdG9yLmNyZWF0ZUlucHV0KCdhZGRyZXNzJywndGV4dCcsJ05ldHdvcmsgYWRkcmVzcyAoZS5nLiBsb2NhbGhvc3Q6OTIyOSknLGFkZHJlc3NWYWxpZGF0b3IpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay1kaXNjb3ZlcnktdmFsdWUgbmV0d29yay1kaXNjb3ZlcnktYWRkcmVzcycpLmFwcGVuZENoaWxkKGlucHV0KTtyZXR1cm4gZWRpdG9yO2Z1bmN0aW9uIGFkZHJlc3NWYWxpZGF0b3IocnVsZSxpbmRleCxpbnB1dCl7Y29uc3QgbWF0Y2g9aW5wdXQudmFsdWUudHJpbSgpLm1hdGNoKC9eKFthLXpBLVowLTlcLlwtX10rKTooXGQrKSQvKTtpZighbWF0Y2gpCnJldHVybiBmYWxzZTtjb25zdCBwb3J0PXBhcnNlSW50KG1hdGNoWzJdLDEwKTtyZXR1cm4gcG9ydDw9NjU1MzU7fX19OztOb2RlTWFpbi5Ob2RlTWFpbj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7cnVuKCl7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5Db25uZWN0VG9Ob2RlSlNGcm9tRnJvbnRlbmQpO2NvbnN0IHRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5jcmVhdGVUYXJnZXQoJ21haW4nLENvbW1vbi5VSVN0cmluZygnTWFpbicpLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5UYXJnZXQscGFyYW1zPT5uZXcgU0RLLk1haW5Db25uZWN0aW9uKHBhcmFtcyksbnVsbCxmYWxzZSk7dGFyZ2V0LnNldEluc3BlY3RlZFVSTCgnTm9kZS5qcycpO0luc3BlY3RvckZyb250ZW5kSG9zdC5jb25uZWN0aW9uUmVhZHkoKTt9fTtOb2RlTWFpbi5Ob2RlQ2hpbGRUYXJnZXRNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHBhcmVudFRhcmdldCl7c3VwZXIocGFyZW50VGFyZ2V0KTt0aGlzLl90YXJnZXRNYW5hZ2VyPXBhcmVudFRhcmdldC50YXJnZXRNYW5hZ2VyKCk7dGhpcy5fcGFyZW50VGFyZ2V0PXBhcmVudFRhcmdldDt0aGlzLl90YXJnZXRBZ2VudD1wYXJlbnRUYXJnZXQudGFyZ2V0QWdlbnQoKTt0aGlzLl9jaGlsZENvbm5lY3Rpb25zPW5ldyBNYXAoKTtwYXJlbnRUYXJnZXQucmVnaXN0ZXJUYXJnZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX3RhcmdldEFnZW50LnNldERpc2NvdmVyVGFyZ2V0cyh0cnVlKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RGV2aWNlc1VwZGF0ZXNFbmFibGVkKHRydWUpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMuX2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMpO30KX2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkKGV2ZW50KXtjb25zdCBjb25maWc9KGV2ZW50LmRhdGEpO2NvbnN0IGxvY2F0aW9ucz1bXTtmb3IoY29uc3QgYWRkcmVzcyBvZiBjb25maWcubmV0d29ya0Rpc2NvdmVyeUNvbmZpZyl7Y29uc3QgcGFydHM9YWRkcmVzcy5zcGxpdCgnOicpO2NvbnN0IHBvcnQ9cGFyc2VJbnQocGFydHNbMV0sMTApO2lmKHBhcnRzWzBdJiZwb3J0KQpsb2NhdGlvbnMucHVzaCh7aG9zdDpwYXJ0c1swXSxwb3J0OnBvcnR9KTt9CnRoaXMuX3RhcmdldEFnZW50LnNldFJlbW90ZUxvY2F0aW9ucyhsb2NhdGlvbnMpO30KZGlzcG9zZSgpe0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMuX2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMpO2Zvcihjb25zdCBzZXNzaW9uSWQgb2YgdGhpcy5fY2hpbGRDb25uZWN0aW9ucy5rZXlzKCkpCnRoaXMuZGV0YWNoZWRGcm9tVGFyZ2V0KHNlc3Npb25JZCx1bmRlZmluZWQpO30KdGFyZ2V0Q3JlYXRlZCh0YXJnZXRJbmZvKXtpZih0YXJnZXRJbmZvLnR5cGU9PT0nbm9kZScmJiF0YXJnZXRJbmZvLmF0dGFjaGVkKQp0aGlzLl90YXJnZXRBZ2VudC5hdHRhY2hUb1RhcmdldCh0YXJnZXRJbmZvLnRhcmdldElkKTt9CnRhcmdldEluZm9DaGFuZ2VkKHRhcmdldEluZm8pe30KdGFyZ2V0RGVzdHJveWVkKHRhcmdldElkKXt9CmF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbklkLHRhcmdldEluZm8sd2FpdGluZ0ZvckRlYnVnZ2VyKXtjb25zdCB0YXJnZXQ9dGhpcy5fdGFyZ2V0TWFuYWdlci5jcmVhdGVUYXJnZXQodGFyZ2V0SW5mby50YXJnZXRJZCxDb21tb24uVUlTdHJpbmcoJ05vZGUuanM6ICVzJyx0YXJnZXRJbmZvLnVybCksU0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTLHRoaXMuX2NyZWF0ZUNoaWxkQ29ubmVjdGlvbi5iaW5kKHRoaXMsdGhpcy5fdGFyZ2V0QWdlbnQsc2Vzc2lvbklkKSx0aGlzLl9wYXJlbnRUYXJnZXQsdHJ1ZSk7dGFyZ2V0LnJ1bnRpbWVBZ2VudCgpLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7fQpkZXRhY2hlZEZyb21UYXJnZXQoc2Vzc2lvbklkLGNoaWxkVGFyZ2V0SWQpe3RoaXMuX2NoaWxkQ29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCkub25EaXNjb25uZWN0LmNhbGwobnVsbCwndGFyZ2V0IHRlcm1pbmF0ZWQnKTt0aGlzLl9jaGlsZENvbm5lY3Rpb25zLmRlbGV0ZShzZXNzaW9uSWQpO30KcmVjZWl2ZWRNZXNzYWdlRnJvbVRhcmdldChzZXNzaW9uSWQsbWVzc2FnZSxjaGlsZFRhcmdldElkKXtjb25zdCBjb25uZWN0aW9uPXRoaXMuX2NoaWxkQ29ubmVjdGlvbnMuZ2V0KHNlc3Npb25JZCk7aWYoY29ubmVjdGlvbikKY29ubmVjdGlvbi5vbk1lc3NhZ2UuY2FsbChudWxsLG1lc3NhZ2UpO30KX2NyZWF0ZUNoaWxkQ29ubmVjdGlvbihhZ2VudCxzZXNzaW9uSWQscGFyYW1zKXtjb25zdCBjb25uZWN0aW9uPW5ldyBTREsuQ2hpbGRDb25uZWN0aW9uKGFnZW50LHNlc3Npb25JZCxwYXJhbXMpO3RoaXMuX2NoaWxkQ29ubmVjdGlvbnMuc2V0KHNlc3Npb25JZCxjb25uZWN0aW9uKTtyZXR1cm4gY29ubmVjdGlvbjt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoTm9kZU1haW4uTm9kZUNoaWxkVGFyZ2V0TWFuYWdlcixTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVGFyZ2V0LHRydWUpOzs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm5vZGVfbWFpbi9ub2RlQ29ubmVjdGlvbnNQYW5lbC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLm5ldHdvcmstZGlzY292ZXJ5LWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4uYWRkLW5ldHdvcmstdGFyZ2V0LWJ1dHRvbiB7XG4gICAgbWFyZ2luOiAxMHB4IDI1cHg7XG4gICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LWxpc3Qge1xuICAgIG1hcmdpbjogMTBweCAwIDAgMjVweDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1saXN0LWVtcHR5IHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1saXN0LWl0ZW0ge1xuICAgIHBhZGRpbmc6IDNweCA1cHggM3B4IDVweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBmbGV4OiBhdXRvIDEgMTtcbn1cblxuLmxpc3QtaXRlbSAubmV0d29yay1kaXNjb3ZlcnktdmFsdWUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBjb2xvcjogIzIyMjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktdmFsdWUge1xuICAgIGZsZXg6IDMgMSAwO1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktZWRpdC1yb3cge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbjogNnB4IDVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktZWRpdC1yb3cgaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1mb290ZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiAxNXB4IDAgMCAyNXB4O1xuICAgIG1heC13aWR0aDogNTAwcHg7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1mb290ZXIgPiAqIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1oZWFkZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5ub2RlLXBhbmVsIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LXZpZXcge1xuICAgIG1pbi13aWR0aDogNDAwcHg7XG4gICAgZmxleDogYXV0bztcbn1cblxuLmFkZC1uZXR3b3JrLXRhcmdldC1idXR0b24ge1xuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuOmhvc3QtY29udGV4dCgubm9kZS1mcm9udGVuZCkgLm5ldHdvcmstZGlzY292ZXJ5LWxpc3QtZW1wdHkge1xuICAgIGhlaWdodDogNDBweDtcbn1cblxuOmhvc3QtY29udGV4dCgubm9kZS1mcm9udGVuZCkgLm5ldHdvcmstZGlzY292ZXJ5LWxpc3QtaXRlbSB7XG4gICAgcGFkZGluZzogM3B4IDE1cHg7XG4gICAgaGVpZ2h0OiA0MHB4O1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktbGlzdCB7XG4gICAgbWFyZ2luOiAyMHB4IDAgNXB4IDA7XG4gICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICBtYXgtaGVpZ2h0OiAyMDJweDtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LWZvb3RlciB7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4ubm9kZS1wYW5lbC1jZW50ZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBhZGRpbmctdG9wOiA1MHB4O1xufVxuXG4ubm9kZS1wYW5lbC1sb2dvIHtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgd2lkdGg6IDQwMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDUwcHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuOmhvc3QtY29udGV4dCgubm9kZS1mcm9udGVuZCkgLm5ldHdvcmstZGlzY292ZXJ5LWVkaXQtcm93IGlucHV0IHtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XG5cbjpob3N0LWNvbnRleHQoLm5vZGUtZnJvbnRlbmQpIC5uZXR3b3JrLWRpc2NvdmVyeS1lZGl0LXJvdyB7XG4gICAgbWFyZ2luOiA2cHggOXB4O1xufVxuXG4vKiMgc291cmNlVVJMPW5vZGVfbWFpbi9ub2RlQ29ubmVjdGlvbnNQYW5lbC5jc3MgKi8iO2NvbnN0IGFsbERlc2NyaXB0b3JzPVtdO2xldCBhcHBsaWNhdGlvbkRlc2NyaXB0b3I7Y29uc3QgX2xvYWRlZFNjcmlwdHM9e307Zm9yKGNvbnN0IGsgb2ZbXSl7fQooZnVuY3Rpb24oKXtjb25zdCBiYXNlVXJsPXNlbGYubG9jYXRpb24/c2VsZi5sb2NhdGlvbi5vcmlnaW4rc2VsZi5sb2NhdGlvbi5wYXRobmFtZTonJztzZWxmLl9pbXBvcnRTY3JpcHRQYXRoUHJlZml4PWJhc2VVcmwuc3Vic3RyaW5nKDAsYmFzZVVybC5sYXN0SW5kZXhPZignLycpKzEpO30pKCk7Y29uc3QgUkVNT1RFX01PRFVMRV9GQUxMQkFDS19SRVZJU0lPTj0nQDAxMGRkY2ZkYTI0Njk3NWQxOTQ5NjRjY2YyMDAzOGViYmRlYzYwODQnO3ZhciBSdW50aW1lPWNsYXNze2NvbnN0cnVjdG9yKGRlc2NyaXB0b3JzKXt0aGlzLl9tb2R1bGVzPVtdO3RoaXMuX21vZHVsZXNNYXA9e307dGhpcy5fZXh0ZW5zaW9ucz1bXTt0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlcz17fTt0aGlzLl9kZXNjcmlwdG9yc01hcD17fTtmb3IobGV0IGk9MDtpPGRlc2NyaXB0b3JzLmxlbmd0aDsrK2kpCnRoaXMuX3JlZ2lzdGVyTW9kdWxlKGRlc2NyaXB0b3JzW2ldKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2soKTt9CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlKHVybCl7cmV0dXJuIG5ldyBQcm9taXNlKGxvYWQpO2Z1bmN0aW9uIGxvYWQoZnVsZmlsbCxyZWplY3Qpe2NvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIub3BlbignR0VUJyx1cmwsdHJ1ZSk7eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1vbnJlYWR5c3RhdGVjaGFuZ2U7ZnVuY3Rpb24gb25yZWFkeXN0YXRlY2hhbmdlKGUpe2lmKHhoci5yZWFkeVN0YXRlIT09WE1MSHR0cFJlcXVlc3QuRE9ORSkKcmV0dXJuO2NvbnN0IHN0YXR1cz0vXkhUVFBcLzEuMSA0MDQvLnRlc3QoZS50YXJnZXQucmVzcG9uc2UpPzQwNDp4aHIuc3RhdHVzO2lmKFswLDIwMCwzMDRdLmluZGV4T2Yoc3RhdHVzKT09PS0xKQpyZWplY3QobmV3IEVycm9yKCdXaGlsZSBsb2FkaW5nIGZyb20gdXJsICcrdXJsKycgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgc3RhdHVzIG9mICcrc3RhdHVzKSk7ZWxzZQpmdWxmaWxsKGUudGFyZ2V0LnJlc3BvbnNlKTt9Cnhoci5zZW5kKG51bGwpO319CnN0YXRpYyBsb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHVybCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLmNhdGNoKGVycj0+e2NvbnN0IHVybFdpdGhGYWxsYmFja1ZlcnNpb249dXJsLnJlcGxhY2UoL0BbMC05YS1mXXs0MH0vLFJFTU9URV9NT0RVTEVfRkFMTEJBQ0tfUkVWSVNJT04pO2lmKHVybFdpdGhGYWxsYmFja1ZlcnNpb249PT11cmx8fCF1cmwuaW5jbHVkZXMoJ2F1ZGl0czJfd29ya2VyX21vZHVsZScpKQp0aHJvdyBlcnI7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmxXaXRoRmFsbGJhY2tWZXJzaW9uKTt9KTt9CnN0YXRpYyBub3JtYWxpemVQYXRoKHBhdGgpe2lmKHBhdGguaW5kZXhPZignLi4nKT09PS0xJiZwYXRoLmluZGV4T2YoJy4nKT09PS0xKQpyZXR1cm4gcGF0aDtjb25zdCBub3JtYWxpemVkU2VnbWVudHM9W107Y29uc3Qgc2VnbWVudHM9cGF0aC5zcGxpdCgnLycpO2ZvcihsZXQgaT0wO2k8c2VnbWVudHMubGVuZ3RoO2krKyl7Y29uc3Qgc2VnbWVudD1zZWdtZW50c1tpXTtpZihzZWdtZW50PT09Jy4nKQpjb250aW51ZTtlbHNlIGlmKHNlZ21lbnQ9PT0nLi4nKQpub3JtYWxpemVkU2VnbWVudHMucG9wKCk7ZWxzZSBpZihzZWdtZW50KQpub3JtYWxpemVkU2VnbWVudHMucHVzaChzZWdtZW50KTt9CmxldCBub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkU2VnbWVudHMuam9pbignLycpO2lmKG5vcm1hbGl6ZWRQYXRoW25vcm1hbGl6ZWRQYXRoLmxlbmd0aC0xXT09PScvJykKcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO2lmKHBhdGhbMF09PT0nLycmJm5vcm1hbGl6ZWRQYXRoKQpub3JtYWxpemVkUGF0aD0nLycrbm9ybWFsaXplZFBhdGg7aWYoKHBhdGhbcGF0aC5sZW5ndGgtMV09PT0nLycpfHwoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoLTFdPT09Jy4nKXx8KHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aC0xXT09PScuLicpKQpub3JtYWxpemVkUGF0aD1ub3JtYWxpemVkUGF0aCsnLyc7cmV0dXJuIG5vcm1hbGl6ZWRQYXRoO30Kc3RhdGljIF9sb2FkU2NyaXB0c1Byb21pc2Uoc2NyaXB0TmFtZXMsYmFzZSl7Y29uc3QgcHJvbWlzZXM9W107Y29uc3QgdXJscz1bXTtjb25zdCBzb3VyY2VzPW5ldyBBcnJheShzY3JpcHROYW1lcy5sZW5ndGgpO2xldCBzY3JpcHRUb0V2YWw9MDtmb3IobGV0IGk9MDtpPHNjcmlwdE5hbWVzLmxlbmd0aDsrK2kpe2NvbnN0IHNjcmlwdE5hbWU9c2NyaXB0TmFtZXNbaV07bGV0IHNvdXJjZVVSTD0oYmFzZXx8c2VsZi5faW1wb3J0U2NyaXB0UGF0aFByZWZpeCkrc2NyaXB0TmFtZTtjb25zdCBzY2hlbWFJbmRleD1zb3VyY2VVUkwuaW5kZXhPZignOi8vJykrMztsZXQgcGF0aEluZGV4PXNvdXJjZVVSTC5pbmRleE9mKCcvJyxzY2hlbWFJbmRleCk7aWYocGF0aEluZGV4PT09LTEpCnBhdGhJbmRleD1zb3VyY2VVUkwubGVuZ3RoO3NvdXJjZVVSTD1zb3VyY2VVUkwuc3Vic3RyaW5nKDAscGF0aEluZGV4KStSdW50aW1lLm5vcm1hbGl6ZVBhdGgoc291cmNlVVJMLnN1YnN0cmluZyhwYXRoSW5kZXgpKTtpZihfbG9hZGVkU2NyaXB0c1tzb3VyY2VVUkxdKQpjb250aW51ZTt1cmxzLnB1c2goc291cmNlVVJMKTtjb25zdCBsb2FkUmVzb3VyY2VQcm9taXNlPWJhc2U/UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlV2l0aEZhbGxiYWNrKHNvdXJjZVVSTCk6UnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKHNvdXJjZVVSTCk7cHJvbWlzZXMucHVzaChsb2FkUmVzb3VyY2VQcm9taXNlLnRoZW4oc2NyaXB0U291cmNlTG9hZGVkLmJpbmQobnVsbCxpKSxzY3JpcHRTb3VyY2VMb2FkZWQuYmluZChudWxsLGksdW5kZWZpbmVkKSkpO30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHVuZGVmaW5lZCk7ZnVuY3Rpb24gc2NyaXB0U291cmNlTG9hZGVkKHNjcmlwdE51bWJlcixzY3JpcHRTb3VyY2Upe3NvdXJjZXNbc2NyaXB0TnVtYmVyXT1zY3JpcHRTb3VyY2V8fCcnO3doaWxlKHR5cGVvZiBzb3VyY2VzW3NjcmlwdFRvRXZhbF0hPT0ndW5kZWZpbmVkJyl7ZXZhbHVhdGVTY3JpcHQodXJsc1tzY3JpcHRUb0V2YWxdLHNvdXJjZXNbc2NyaXB0VG9FdmFsXSk7KytzY3JpcHRUb0V2YWw7fX0KZnVuY3Rpb24gZXZhbHVhdGVTY3JpcHQoc291cmNlVVJMLHNjcmlwdFNvdXJjZSl7X2xvYWRlZFNjcmlwdHNbc291cmNlVVJMXT10cnVlO2lmKCFzY3JpcHRTb3VyY2Upe2NvbnNvbGUuZXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGFycml2ZWQgZm9yIHNjcmlwdCBcJycrc291cmNlVVJMKydcJycpO3JldHVybjt9CnNlbGYuZXZhbChzY3JpcHRTb3VyY2UrJ1xuLy8jIHNvdXJjZVVSTD0nK3NvdXJjZVVSTCk7fX0Kc3RhdGljIF9sb2FkUmVzb3VyY2VJbnRvQ2FjaGUodXJsLGFwcGVuZFNvdXJjZVVSTCl7cmV0dXJuIFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZSh1cmwpLnRoZW4oY2FjaGVSZXNvdXJjZS5iaW5kKHRoaXMsdXJsKSxjYWNoZVJlc291cmNlLmJpbmQodGhpcyx1cmwsdW5kZWZpbmVkKSk7ZnVuY3Rpb24gY2FjaGVSZXNvdXJjZShwYXRoLGNvbnRlbnQpe2lmKCFjb250ZW50KXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCByZXNvdXJjZTogJytwYXRoKTtyZXR1cm47fQpjb25zdCBzb3VyY2VVUkw9YXBwZW5kU291cmNlVVJMP1J1bnRpbWUucmVzb2x2ZVNvdXJjZVVSTChwYXRoKTonJztSdW50aW1lLmNhY2hlZFJlc291cmNlc1twYXRoXT1jb250ZW50K3NvdXJjZVVSTDt9fQpzdGF0aWMgYXN5bmMgcnVudGltZVJlYWR5KCl7cmV0dXJuIFJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2U7fQpzdGF0aWMgYXN5bmMgc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKXtjb25zb2xlLnRpbWVTdGFtcCgnUnVudGltZS5zdGFydEFwcGxpY2F0aW9uJyk7Y29uc3QgYWxsRGVzY3JpcHRvcnNCeU5hbWU9e307Zm9yKGxldCBpPTA7aTxhbGxEZXNjcmlwdG9ycy5sZW5ndGg7KytpKXtjb25zdCBkPWFsbERlc2NyaXB0b3JzW2ldO2FsbERlc2NyaXB0b3JzQnlOYW1lW2RbJ25hbWUnXV09ZDt9CmlmKCFhcHBsaWNhdGlvbkRlc2NyaXB0b3Ipe2xldCBkYXRhPWF3YWl0IFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShhcHBOYW1lKycuanNvbicpO2FwcGxpY2F0aW9uRGVzY3JpcHRvcj1KU09OLnBhcnNlKGRhdGEpO2xldCBkZXNjcmlwdG9yPWFwcGxpY2F0aW9uRGVzY3JpcHRvcjt3aGlsZShkZXNjcmlwdG9yLmV4dGVuZHMpe2RhdGE9YXdhaXQgUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKGRlc2NyaXB0b3IuZXh0ZW5kcysnLmpzb24nKTtkZXNjcmlwdG9yPUpTT04ucGFyc2UoZGF0YSk7YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXM9ZGVzY3JpcHRvci5tb2R1bGVzLmNvbmNhdChhcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcyk7fX0KY29uc3QgY29uZmlndXJhdGlvbj1hcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcztjb25zdCBtb2R1bGVKU09OUHJvbWlzZXM9W107Y29uc3QgY29yZU1vZHVsZU5hbWVzPVtdO2ZvcihsZXQgaT0wO2k8Y29uZmlndXJhdGlvbi5sZW5ndGg7KytpKXtjb25zdCBkZXNjcmlwdG9yPWNvbmZpZ3VyYXRpb25baV07Y29uc3QgbmFtZT1kZXNjcmlwdG9yWyduYW1lJ107Y29uc3QgbW9kdWxlSlNPTj1hbGxEZXNjcmlwdG9yc0J5TmFtZVtuYW1lXTtpZihtb2R1bGVKU09OKQptb2R1bGVKU09OUHJvbWlzZXMucHVzaChQcm9taXNlLnJlc29sdmUobW9kdWxlSlNPTikpO2Vsc2UKbW9kdWxlSlNPTlByb21pc2VzLnB1c2goUnVudGltZS5sb2FkUmVzb3VyY2VQcm9taXNlKG5hbWUrJy9tb2R1bGUuanNvbicpLnRoZW4oSlNPTi5wYXJzZS5iaW5kKEpTT04pKSk7aWYoZGVzY3JpcHRvclsndHlwZSddPT09J2F1dG9zdGFydCcpCmNvcmVNb2R1bGVOYW1lcy5wdXNoKG5hbWUpO30KY29uc3QgbW9kdWxlRGVzY3JpcHRvcnM9YXdhaXQgUHJvbWlzZS5hbGwobW9kdWxlSlNPTlByb21pc2VzKTtmb3IobGV0IGk9MDtpPG1vZHVsZURlc2NyaXB0b3JzLmxlbmd0aDsrK2kpe21vZHVsZURlc2NyaXB0b3JzW2ldLm5hbWU9Y29uZmlndXJhdGlvbltpXVsnbmFtZSddO21vZHVsZURlc2NyaXB0b3JzW2ldLmNvbmRpdGlvbj1jb25maWd1cmF0aW9uW2ldWydjb25kaXRpb24nXTttb2R1bGVEZXNjcmlwdG9yc1tpXS5yZW1vdGU9Y29uZmlndXJhdGlvbltpXVsndHlwZSddPT09J3JlbW90ZSc7fQpzZWxmLnJ1bnRpbWU9bmV3IFJ1bnRpbWUobW9kdWxlRGVzY3JpcHRvcnMpO2lmKGNvcmVNb2R1bGVOYW1lcykKcmV0dXJuKHNlbGYucnVudGltZS5fbG9hZEF1dG9TdGFydE1vZHVsZXMoY29yZU1vZHVsZU5hbWVzKSk7fQpzdGF0aWMgc3RhcnRXb3JrZXIoYXBwTmFtZSl7cmV0dXJuIFJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbihhcHBOYW1lKS50aGVuKHNlbmRXb3JrZXJSZWFkeSk7ZnVuY3Rpb24gc2VuZFdvcmtlclJlYWR5KCl7c2VsZi5wb3N0TWVzc2FnZSgnd29ya2VyUmVhZHknKTt9fQpzdGF0aWMgcXVlcnlQYXJhbShuYW1lKXtyZXR1cm4gUnVudGltZS5fcXVlcnlQYXJhbXNPYmplY3RbbmFtZV18fG51bGw7fQpzdGF0aWMgcXVlcnlQYXJhbXNTdHJpbmcoKXtyZXR1cm4gbG9jYXRpb24uc2VhcmNoO30Kc3RhdGljIF9leHBlcmltZW50c1NldHRpbmcoKXt0cnl7cmV0dXJuKEpTT04ucGFyc2Uoc2VsZi5sb2NhbFN0b3JhZ2UmJnNlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddP3NlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddOid7fScpKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIGxvY2FsU3RvcmFnZVtcJ2V4cGVyaW1lbnRzXCddJyk7cmV0dXJue307fX0Kc3RhdGljIF9hc3NlcnQodmFsdWUsbWVzc2FnZSl7aWYodmFsdWUpCnJldHVybjtSdW50aW1lLl9vcmlnaW5hbEFzc2VydC5jYWxsKFJ1bnRpbWUuX2NvbnNvbGUsdmFsdWUsbWVzc2FnZSsnICcrbmV3IEVycm9yKCkuc3RhY2spO30Kc3RhdGljIHNldFBsYXRmb3JtKHBsYXRmb3JtKXtSdW50aW1lLl9wbGF0Zm9ybT1wbGF0Zm9ybTt9CnN0YXRpYyBfaXNEZXNjcmlwdG9yRW5hYmxlZChkZXNjcmlwdG9yKXtjb25zdCBhY3RpdmF0b3JFeHBlcmltZW50PWRlc2NyaXB0b3JbJ2V4cGVyaW1lbnQnXTtpZihhY3RpdmF0b3JFeHBlcmltZW50PT09JyonKQpyZXR1cm4gUnVudGltZS5leHBlcmltZW50cy5zdXBwb3J0RW5hYmxlZCgpO2lmKGFjdGl2YXRvckV4cGVyaW1lbnQmJmFjdGl2YXRvckV4cGVyaW1lbnQuc3RhcnRzV2l0aCgnIScpJiZSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50LnN1YnN0cmluZygxKSkpCnJldHVybiBmYWxzZTtpZihhY3RpdmF0b3JFeHBlcmltZW50JiYhYWN0aXZhdG9yRXhwZXJpbWVudC5zdGFydHNXaXRoKCchJykmJiFSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZChhY3RpdmF0b3JFeHBlcmltZW50KSkKcmV0dXJuIGZhbHNlO2NvbnN0IGNvbmRpdGlvbj1kZXNjcmlwdG9yWydjb25kaXRpb24nXTtpZihjb25kaXRpb24mJiFjb25kaXRpb24uc3RhcnRzV2l0aCgnIScpJiYhUnVudGltZS5xdWVyeVBhcmFtKGNvbmRpdGlvbikpCnJldHVybiBmYWxzZTtpZihjb25kaXRpb24mJmNvbmRpdGlvbi5zdGFydHNXaXRoKCchJykmJlJ1bnRpbWUucXVlcnlQYXJhbShjb25kaXRpb24uc3Vic3RyaW5nKDEpKSkKcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO30Kc3RhdGljIHJlc29sdmVTb3VyY2VVUkwocGF0aCl7bGV0IHNvdXJjZVVSTD1zZWxmLmxvY2F0aW9uLmhyZWY7aWYoc2VsZi5sb2NhdGlvbi5zZWFyY2gpCnNvdXJjZVVSTD1zb3VyY2VVUkwucmVwbGFjZShzZWxmLmxvY2F0aW9uLnNlYXJjaCwnJyk7c291cmNlVVJMPXNvdXJjZVVSTC5zdWJzdHJpbmcoMCxzb3VyY2VVUkwubGFzdEluZGV4T2YoJy8nKSsxKStwYXRoO3JldHVybidcbi8qIyBzb3VyY2VVUkw9Jytzb3VyY2VVUkwrJyAqLyc7fQp1c2VUZXN0QmFzZSgpe1J1bnRpbWUuX3JlbW90ZUJhc2U9J2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9pbnNwZWN0b3Itc291cmNlcy8nO2lmKFJ1bnRpbWUucXVlcnlQYXJhbSgnZGVidWdGcm9udGVuZCcpKQpSdW50aW1lLl9yZW1vdGVCYXNlKz0nZGVidWcvJzt9Cl9yZWdpc3Rlck1vZHVsZShkZXNjcmlwdG9yKXtjb25zdCBtb2R1bGU9bmV3IFJ1bnRpbWUuTW9kdWxlKHRoaXMsZGVzY3JpcHRvcik7dGhpcy5fbW9kdWxlcy5wdXNoKG1vZHVsZSk7dGhpcy5fbW9kdWxlc01hcFtkZXNjcmlwdG9yWyduYW1lJ11dPW1vZHVsZTt9CmxvYWRNb2R1bGVQcm9taXNlKG1vZHVsZU5hbWUpe3JldHVybiB0aGlzLl9tb2R1bGVzTWFwW21vZHVsZU5hbWVdLl9sb2FkUHJvbWlzZSgpO30KX2xvYWRBdXRvU3RhcnRNb2R1bGVzKG1vZHVsZU5hbWVzKXtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPG1vZHVsZU5hbWVzLmxlbmd0aDsrK2kpCnByb21pc2VzLnB1c2godGhpcy5sb2FkTW9kdWxlUHJvbWlzZShtb2R1bGVOYW1lc1tpXSkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fQpfY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixwcmVkaWNhdGUpe2lmKCFwcmVkaWNhdGUpCnJldHVybiBmYWxzZTtjb25zdCBjb250ZXh0VHlwZXM9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKS5jb250ZXh0VHlwZXM7aWYoIWNvbnRleHRUeXBlcykKcmV0dXJuIHRydWU7Zm9yKGxldCBpPTA7aTxjb250ZXh0VHlwZXMubGVuZ3RoOysraSl7Y29uc3QgY29udGV4dFR5cGU9dGhpcy5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pO2NvbnN0IGlzTWF0Y2hpbmc9ISFjb250ZXh0VHlwZSYmcHJlZGljYXRlKGNvbnRleHRUeXBlKTtpZihpc01hdGNoaW5nKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dChleHRlbnNpb24sY29udGV4dCl7aWYoIWNvbnRleHQpCnJldHVybiB0cnVlO3JldHVybiB0aGlzLl9jaGVja0V4dGVuc2lvbkFwcGxpY2FiaWxpdHkoZXh0ZW5zaW9uLGlzSW5zdGFuY2VPZik7ZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHRhcmdldFR5cGUpe3JldHVybiBjb250ZXh0IGluc3RhbmNlb2YgdGFyZ2V0VHlwZTt9fQppc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHRUeXBlcyhleHRlbnNpb24sY3VycmVudENvbnRleHRUeXBlcyl7aWYoIWV4dGVuc2lvbi5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixjdXJyZW50Q29udGV4dFR5cGVzP2lzQ29udGV4dFR5cGVLbm93bjpudWxsKTtmdW5jdGlvbiBpc0NvbnRleHRUeXBlS25vd24odGFyZ2V0VHlwZSl7cmV0dXJuIGN1cnJlbnRDb250ZXh0VHlwZXMuaGFzKHRhcmdldFR5cGUpO319CmV4dGVuc2lvbnModHlwZSxjb250ZXh0LHNvcnRCeVRpdGxlKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9ucy5maWx0ZXIoZmlsdGVyKS5zb3J0KHNvcnRCeVRpdGxlP3RpdGxlQ29tcGFyYXRvcjpvcmRlckNvbXBhcmF0b3IpO2Z1bmN0aW9uIGZpbHRlcihleHRlbnNpb24pe2lmKGV4dGVuc2lvbi5fdHlwZSE9PXR5cGUmJmV4dGVuc2lvbi5fdHlwZUNsYXNzKCkhPT10eXBlKQpyZXR1cm4gZmFsc2U7aWYoIWV4dGVuc2lvbi5lbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hY29udGV4dHx8ZXh0ZW5zaW9uLmlzQXBwbGljYWJsZShjb250ZXh0KTt9CmZ1bmN0aW9uIG9yZGVyQ29tcGFyYXRvcihleHRlbnNpb24xLGV4dGVuc2lvbjIpe2NvbnN0IG9yZGVyMT1leHRlbnNpb24xLmRlc2NyaXB0b3IoKVsnb3JkZXInXXx8MDtjb25zdCBvcmRlcjI9ZXh0ZW5zaW9uMi5kZXNjcmlwdG9yKClbJ29yZGVyJ118fDA7cmV0dXJuIG9yZGVyMS1vcmRlcjI7fQpmdW5jdGlvbiB0aXRsZUNvbXBhcmF0b3IoZXh0ZW5zaW9uMSxleHRlbnNpb24yKXtjb25zdCB0aXRsZTE9ZXh0ZW5zaW9uMS50aXRsZSgpfHwnJztjb25zdCB0aXRsZTI9ZXh0ZW5zaW9uMi50aXRsZSgpfHwnJztyZXR1cm4gdGl0bGUxLmxvY2FsZUNvbXBhcmUodGl0bGUyKTt9fQpleHRlbnNpb24odHlwZSxjb250ZXh0KXtyZXR1cm4gdGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dClbMF18fG51bGw7fQphbGxJbnN0YW5jZXModHlwZSxjb250ZXh0KXtyZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5leHRlbnNpb25zKHR5cGUsY29udGV4dCkubWFwKGV4dGVuc2lvbj0+ZXh0ZW5zaW9uLmluc3RhbmNlKCkpKTt9Cl9yZXNvbHZlKHR5cGVOYW1lKXtpZighdGhpcy5fY2FjaGVkVHlwZUNsYXNzZXNbdHlwZU5hbWVdKXtjb25zdCBwYXRoPXR5cGVOYW1lLnNwbGl0KCcuJyk7bGV0IG9iamVjdD1zZWxmO2ZvcihsZXQgaT0wO29iamVjdCYmKGk8cGF0aC5sZW5ndGgpOysraSkKb2JqZWN0PW9iamVjdFtwYXRoW2ldXTtpZihvYmplY3QpCnRoaXMuX2NhY2hlZFR5cGVDbGFzc2VzW3R5cGVOYW1lXT0ob2JqZWN0KTt9CnJldHVybiB0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlc1t0eXBlTmFtZV18fG51bGw7fQpzaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihSdW50aW1lLl9pbnN0YW5jZVN5bWJvbCBpbiBjb25zdHJ1Y3RvckZ1bmN0aW9uJiZPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbnN0cnVjdG9yRnVuY3Rpb24pLmluY2x1ZGVzKFJ1bnRpbWUuX2luc3RhbmNlU3ltYm9sKSkKcmV0dXJuIGNvbnN0cnVjdG9yRnVuY3Rpb25bUnVudGltZS5faW5zdGFuY2VTeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltSdW50aW1lLl9pbnN0YW5jZVN5bWJvbF09aW5zdGFuY2U7cmV0dXJuIGluc3RhbmNlO319O1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0PXtfX3Byb3RvX186bnVsbH07UnVudGltZS5faW5zdGFuY2VTeW1ib2w9U3ltYm9sKCdpbnN0YW5jZScpO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzPXtfX3Byb3RvX186bnVsbH07UnVudGltZS5fY29uc29sZT1jb25zb2xlO1J1bnRpbWUuX29yaWdpbmFsQXNzZXJ0PWNvbnNvbGUuYXNzZXJ0O1J1bnRpbWUuX3BsYXRmb3JtPScnO1J1bnRpbWUuTW9kdWxlRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubmFtZTt0aGlzLmV4dGVuc2lvbnM7dGhpcy5kZXBlbmRlbmNpZXM7dGhpcy5zY3JpcHRzO3RoaXMuY29uZGl0aW9uO3RoaXMucmVtb3RlO319O1J1bnRpbWUuRXh0ZW5zaW9uRGVzY3JpcHRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZTt0aGlzLmNsYXNzTmFtZTt0aGlzLmZhY3RvcnlOYW1lO3RoaXMuY29udGV4dFR5cGVzO319O1J1bnRpbWUuTW9kdWxlPWNsYXNze2NvbnN0cnVjdG9yKG1hbmFnZXIsZGVzY3JpcHRvcil7dGhpcy5fbWFuYWdlcj1tYW5hZ2VyO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl9uYW1lPWRlc2NyaXB0b3IubmFtZTt0aGlzLl9leHRlbnNpb25zPVtdO3RoaXMuX2V4dGVuc2lvbnNCeUNsYXNzTmFtZT1uZXcgTWFwKCk7Y29uc3QgZXh0ZW5zaW9ucz0oZGVzY3JpcHRvci5leHRlbnNpb25zKTtmb3IobGV0IGk9MDtleHRlbnNpb25zJiZpPGV4dGVuc2lvbnMubGVuZ3RoOysraSl7Y29uc3QgZXh0ZW5zaW9uPW5ldyBSdW50aW1lLkV4dGVuc2lvbih0aGlzLGV4dGVuc2lvbnNbaV0pO3RoaXMuX21hbmFnZXIuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO3RoaXMuX2V4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO30KdGhpcy5fbG9hZGVkRm9yVGVzdD1mYWxzZTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CmVuYWJsZWQoKXtyZXR1cm4gUnVudGltZS5faXNEZXNjcmlwdG9yRW5hYmxlZCh0aGlzLl9kZXNjcmlwdG9yKTt9CnJlc291cmNlKG5hbWUpe2NvbnN0IGZ1bGxOYW1lPXRoaXMuX25hbWUrJy8nK25hbWU7Y29uc3QgY29udGVudD1SdW50aW1lLmNhY2hlZFJlc291cmNlc1tmdWxsTmFtZV07aWYoIWNvbnRlbnQpCnRocm93IG5ldyBFcnJvcihmdWxsTmFtZSsnIG5vdCBwcmVsb2FkZWQuIENoZWNrIG1vZHVsZS5qc29uJyk7cmV0dXJuIGNvbnRlbnQ7fQpfbG9hZFByb21pc2UoKXtpZighdGhpcy5lbmFibGVkKCkpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01vZHVsZSAnK3RoaXMuX25hbWUrJyBpcyBub3QgZW5hYmxlZCcpKTtpZih0aGlzLl9wZW5kaW5nTG9hZFByb21pc2UpCnJldHVybiB0aGlzLl9wZW5kaW5nTG9hZFByb21pc2U7Y29uc3QgZGVwZW5kZW5jaWVzPXRoaXMuX2Rlc2NyaXB0b3IuZGVwZW5kZW5jaWVzO2NvbnN0IGRlcGVuZGVuY3lQcm9taXNlcz1bXTtmb3IobGV0IGk9MDtkZXBlbmRlbmNpZXMmJmk8ZGVwZW5kZW5jaWVzLmxlbmd0aDsrK2kpCmRlcGVuZGVuY3lQcm9taXNlcy5wdXNoKHRoaXMuX21hbmFnZXIuX21vZHVsZXNNYXBbZGVwZW5kZW5jaWVzW2ldXS5fbG9hZFByb21pc2UoKSk7dGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlPVByb21pc2UuYWxsKGRlcGVuZGVuY3lQcm9taXNlcykudGhlbih0aGlzLl9sb2FkUmVzb3VyY2VzLmJpbmQodGhpcykpLnRoZW4odGhpcy5fbG9hZFNjcmlwdHMuYmluZCh0aGlzKSkudGhlbigoKT0+dGhpcy5fbG9hZGVkRm9yVGVzdD10cnVlKTtyZXR1cm4gdGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlO30KX2xvYWRSZXNvdXJjZXMoKXtjb25zdCByZXNvdXJjZXM9dGhpcy5fZGVzY3JpcHRvclsncmVzb3VyY2VzJ107aWYoIXJlc291cmNlc3x8IXJlc291cmNlcy5sZW5ndGgpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPHJlc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCB1cmw9dGhpcy5fbW9kdWxhcml6ZVVSTChyZXNvdXJjZXNbaV0pO3Byb21pc2VzLnB1c2goUnVudGltZS5fbG9hZFJlc291cmNlSW50b0NhY2hlKHVybCx0cnVlKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odW5kZWZpbmVkKTt9Cl9sb2FkU2NyaXB0cygpe2lmKCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHN8fCF0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgc3BlY2lhbENhc2VzPXsnc2RrJzonU0RLJywnanNfc2RrJzonSlNTREsnLCdicm93c2VyX3Nkayc6J0Jyb3dzZXJTREsnLCd1aSc6J1VJJywnb2JqZWN0X3VpJzonT2JqZWN0VUknLCdqYXZhc2NyaXB0X21ldGFkYXRhJzonSmF2YVNjcmlwdE1ldGFkYXRhJywncGVyZl91aSc6J1BlcmZVSScsJ2hhcl9pbXBvcnRlcic6J0hBUkltcG9ydGVyJywnc2RrX3Rlc3RfcnVubmVyJzonU0RLVGVzdFJ1bm5lcicsJ2NwdV9wcm9maWxlcl90ZXN0X3J1bm5lcic6J0NQVVByb2ZpbGVyVGVzdFJ1bm5lcid9O2NvbnN0IG5hbWVzcGFjZT1zcGVjaWFsQ2FzZXNbdGhpcy5fbmFtZV18fHRoaXMuX25hbWUuc3BsaXQoJ18nKS5tYXAoYT0+YS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpKS5qb2luKCcnKTtzZWxmW25hbWVzcGFjZV09c2VsZltuYW1lc3BhY2VdfHx7fTtyZXR1cm4gUnVudGltZS5fbG9hZFNjcmlwdHNQcm9taXNlKHRoaXMuX2Rlc2NyaXB0b3Iuc2NyaXB0cy5tYXAodGhpcy5fbW9kdWxhcml6ZVVSTCx0aGlzKSx0aGlzLl9yZW1vdGVCYXNlKCkpO30KX21vZHVsYXJpemVVUkwocmVzb3VyY2VOYW1lKXtyZXR1cm4gUnVudGltZS5ub3JtYWxpemVQYXRoKHRoaXMuX25hbWUrJy8nK3Jlc291cmNlTmFtZSk7fQpfcmVtb3RlQmFzZSgpe3JldHVybiFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKSYmdGhpcy5fZGVzY3JpcHRvci5yZW1vdGUmJlJ1bnRpbWUuX3JlbW90ZUJhc2V8fHVuZGVmaW5lZDt9CnN1YnN0aXR1dGVVUkwodmFsdWUpe2NvbnN0IGJhc2U9dGhpcy5fcmVtb3RlQmFzZSgpfHwnJztyZXR1cm4gdmFsdWUucmVwbGFjZSgvQHVybFwoKFteXCldKj8pXCkvZyxjb252ZXJ0VVJMLmJpbmQodGhpcykpO2Z1bmN0aW9uIGNvbnZlcnRVUkwobWF0Y2gsdXJsKXtyZXR1cm4gYmFzZSt0aGlzLl9tb2R1bGFyaXplVVJMKHVybCk7fX19O1J1bnRpbWUuRXh0ZW5zaW9uPWNsYXNze2NvbnN0cnVjdG9yKG1vZHVsZSxkZXNjcmlwdG9yKXt0aGlzLl9tb2R1bGU9bW9kdWxlO3RoaXMuX2Rlc2NyaXB0b3I9ZGVzY3JpcHRvcjt0aGlzLl90eXBlPWRlc2NyaXB0b3IudHlwZTt0aGlzLl9oYXNUeXBlQ2xhc3M9dGhpcy5fdHlwZS5jaGFyQXQoMCk9PT0nQCc7dGhpcy5fY2xhc3NOYW1lPWRlc2NyaXB0b3IuY2xhc3NOYW1lfHxudWxsO3RoaXMuX2ZhY3RvcnlOYW1lPWRlc2NyaXB0b3IuZmFjdG9yeU5hbWV8fG51bGw7fQpkZXNjcmlwdG9yKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3I7fQptb2R1bGUoKXtyZXR1cm4gdGhpcy5fbW9kdWxlO30KZW5hYmxlZCgpe3JldHVybiB0aGlzLl9tb2R1bGUuZW5hYmxlZCgpJiZSdW50aW1lLl9pc0Rlc2NyaXB0b3JFbmFibGVkKHRoaXMuZGVzY3JpcHRvcigpKTt9Cl90eXBlQ2xhc3MoKXtpZighdGhpcy5faGFzVHlwZUNsYXNzKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLl9yZXNvbHZlKHRoaXMuX3R5cGUuc3Vic3RyaW5nKDEpKTt9CmlzQXBwbGljYWJsZShjb250ZXh0KXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9tYW5hZ2VyLmlzRXh0ZW5zaW9uQXBwbGljYWJsZVRvQ29udGV4dCh0aGlzLGNvbnRleHQpO30KaW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5fbW9kdWxlLl9sb2FkUHJvbWlzZSgpLnRoZW4odGhpcy5fY3JlYXRlSW5zdGFuY2UuYmluZCh0aGlzKSk7fQpjYW5JbnN0YW50aWF0ZSgpe3JldHVybiEhKHRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWUpO30KX2NyZWF0ZUluc3RhbmNlKCl7Y29uc3QgY2xhc3NOYW1lPXRoaXMuX2NsYXNzTmFtZXx8dGhpcy5fZmFjdG9yeU5hbWU7aWYoIWNsYXNzTmFtZSkKdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgaW5zdGFudGlhdGUgZXh0ZW5zaW9uIHdpdGggbm8gY2xhc3MnKTtjb25zdCBjb25zdHJ1Y3RvckZ1bmN0aW9uPXNlbGYuZXZhbCgoY2xhc3NOYW1lKSk7aWYoIShjb25zdHJ1Y3RvckZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pKQp0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZTogJytjbGFzc05hbWUpO2lmKHRoaXMuX2NsYXNzTmFtZSkKcmV0dXJuIHRoaXMuX21vZHVsZS5fbWFuYWdlci5zaGFyZWRJbnN0YW5jZShjb25zdHJ1Y3RvckZ1bmN0aW9uKTtyZXR1cm4gbmV3IGNvbnN0cnVjdG9yRnVuY3Rpb24odGhpcyk7fQp0aXRsZSgpe3JldHVybiB0aGlzLl9kZXNjcmlwdG9yWyd0aXRsZS0nK1J1bnRpbWUuX3BsYXRmb3JtXXx8dGhpcy5fZGVzY3JpcHRvclsndGl0bGUnXTt9Cmhhc0NvbnRleHRUeXBlKGNvbnRleHRUeXBlKXtjb25zdCBjb250ZXh0VHlwZXM9dGhpcy5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzO2lmKCFjb250ZXh0VHlwZXMpCnJldHVybiBmYWxzZTtmb3IobGV0IGk9MDtpPGNvbnRleHRUeXBlcy5sZW5ndGg7KytpKXtpZihjb250ZXh0VHlwZT09PXRoaXMuX21vZHVsZS5fbWFuYWdlci5fcmVzb2x2ZShjb250ZXh0VHlwZXNbaV0pKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtSdW50aW1lLkV4cGVyaW1lbnRzU3VwcG9ydD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3N1cHBvcnRFbmFibGVkPVJ1bnRpbWUucXVlcnlQYXJhbSgnZXhwZXJpbWVudHMnKSE9PW51bGw7dGhpcy5fZXhwZXJpbWVudHM9W107dGhpcy5fZXhwZXJpbWVudE5hbWVzPXt9O3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseT17fTt9CmFsbENvbmZpZ3VyYWJsZUV4cGVyaW1lbnRzKCl7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fZXhwZXJpbWVudHMubGVuZ3RoO2krKyl7Y29uc3QgZXhwZXJpbWVudD10aGlzLl9leHBlcmltZW50c1tpXTtpZighdGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnQubmFtZV0pCnJlc3VsdC5wdXNoKGV4cGVyaW1lbnQpO30KcmV0dXJuIHJlc3VsdDt9CnN1cHBvcnRFbmFibGVkKCl7cmV0dXJuIHRoaXMuX3N1cHBvcnRFbmFibGVkO30KX3NldEV4cGVyaW1lbnRzU2V0dGluZyh2YWx1ZSl7aWYoIXNlbGYubG9jYWxTdG9yYWdlKQpyZXR1cm47c2VsZi5sb2NhbFN0b3JhZ2VbJ2V4cGVyaW1lbnRzJ109SlNPTi5zdHJpbmdpZnkodmFsdWUpO30KcmVnaXN0ZXIoZXhwZXJpbWVudE5hbWUsZXhwZXJpbWVudFRpdGxlLGhpZGRlbil7UnVudGltZS5fYXNzZXJ0KCF0aGlzLl9leHBlcmltZW50TmFtZXNbZXhwZXJpbWVudE5hbWVdLCdEdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIGV4cGVyaW1lbnQgJytleHBlcmltZW50TmFtZSk7dGhpcy5fZXhwZXJpbWVudE5hbWVzW2V4cGVyaW1lbnROYW1lXT10cnVlO3RoaXMuX2V4cGVyaW1lbnRzLnB1c2gobmV3IFJ1bnRpbWUuRXhwZXJpbWVudCh0aGlzLGV4cGVyaW1lbnROYW1lLGV4cGVyaW1lbnRUaXRsZSwhIWhpZGRlbikpO30KaXNFbmFibGVkKGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO2lmKHRoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV0pCnJldHVybiB0cnVlO2lmKCF0aGlzLnN1cHBvcnRFbmFibGVkKCkpCnJldHVybiBmYWxzZTtyZXR1cm4hIVJ1bnRpbWUuX2V4cGVyaW1lbnRzU2V0dGluZygpW2V4cGVyaW1lbnROYW1lXTt9CnNldEVuYWJsZWQoZXhwZXJpbWVudE5hbWUsZW5hYmxlZCl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKTtjb25zdCBleHBlcmltZW50c1NldHRpbmc9UnVudGltZS5fZXhwZXJpbWVudHNTZXR0aW5nKCk7ZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXT1lbmFibGVkO3RoaXMuX3NldEV4cGVyaW1lbnRzU2V0dGluZyhleHBlcmltZW50c1NldHRpbmcpO30Kc2V0RGVmYXVsdEV4cGVyaW1lbnRzKGV4cGVyaW1lbnROYW1lcyl7Zm9yKGxldCBpPTA7aTxleHBlcmltZW50TmFtZXMubGVuZ3RoOysraSl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lc1tpXSk7dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5W2V4cGVyaW1lbnROYW1lc1tpXV09dHJ1ZTt9fQplbmFibGVGb3JUZXN0KGV4cGVyaW1lbnROYW1lKXt0aGlzLl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpO3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZV09dHJ1ZTt9CmNsZWFyRm9yVGVzdCgpe3RoaXMuX2V4cGVyaW1lbnRzPVtdO3RoaXMuX2V4cGVyaW1lbnROYW1lcz17fTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHk9e307fQpjbGVhblVwU3RhbGVFeHBlcmltZW50cygpe2NvbnN0IGV4cGVyaW1lbnRzU2V0dGluZz1SdW50aW1lLl9leHBlcmltZW50c1NldHRpbmcoKTtjb25zdCBjbGVhbmVkVXBFeHBlcmltZW50U2V0dGluZz17fTtmb3IobGV0IGk9MDtpPHRoaXMuX2V4cGVyaW1lbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV4cGVyaW1lbnROYW1lPXRoaXMuX2V4cGVyaW1lbnRzW2ldLm5hbWU7aWYoZXhwZXJpbWVudHNTZXR0aW5nW2V4cGVyaW1lbnROYW1lXSkKY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmdbZXhwZXJpbWVudE5hbWVdPXRydWU7fQp0aGlzLl9zZXRFeHBlcmltZW50c1NldHRpbmcoY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmcpO30KX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSl7UnVudGltZS5fYXNzZXJ0KHRoaXMuX2V4cGVyaW1lbnROYW1lc1tleHBlcmltZW50TmFtZV0sJ1Vua25vd24gZXhwZXJpbWVudCAnK2V4cGVyaW1lbnROYW1lKTt9fTtSdW50aW1lLkV4cGVyaW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZXhwZXJpbWVudHMsbmFtZSx0aXRsZSxoaWRkZW4pe3RoaXMubmFtZT1uYW1lO3RoaXMudGl0bGU9dGl0bGU7dGhpcy5oaWRkZW49aGlkZGVuO3RoaXMuX2V4cGVyaW1lbnRzPWV4cGVyaW1lbnRzO30KaXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2V4cGVyaW1lbnRzLmlzRW5hYmxlZCh0aGlzLm5hbWUpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9leHBlcmltZW50cy5zZXRFbmFibGVkKHRoaXMubmFtZSxlbmFibGVkKTt9fTt7KGZ1bmN0aW9uIHBhcnNlUXVlcnlQYXJhbWV0ZXJzKCl7Y29uc3QgcXVlcnlQYXJhbXM9UnVudGltZS5xdWVyeVBhcmFtc1N0cmluZygpO2lmKCFxdWVyeVBhcmFtcykKcmV0dXJuO2NvbnN0IHBhcmFtcz1xdWVyeVBhcmFtcy5zdWJzdHJpbmcoMSkuc3BsaXQoJyYnKTtmb3IobGV0IGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXtjb25zdCBwYWlyPXBhcmFtc1tpXS5zcGxpdCgnPScpO2NvbnN0IG5hbWU9cGFpci5zaGlmdCgpO1J1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0W25hbWVdPXBhaXIuam9pbignPScpO319KSgpO30KUnVudGltZS5leHBlcmltZW50cz1uZXcgUnVudGltZS5FeHBlcmltZW50c1N1cHBvcnQoKTtSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2s7UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWw9PlJ1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2VDYWxsYmFjaz1mdWxmaWwpO1J1bnRpbWUuX3JlbW90ZUJhc2U7KGZ1bmN0aW9uIHZhbGlkYXRlUmVtb3RlQmFzZSgpe2lmKGxvY2F0aW9uLmhyZWYuc3RhcnRzV2l0aCgnY2hyb21lLWRldnRvb2xzOi8vZGV2dG9vbHMvYnVuZGxlZC8nKSYmUnVudGltZS5xdWVyeVBhcmFtKCdyZW1vdGVCYXNlJykpe2NvbnN0IHZlcnNpb25NYXRjaD0vXC9zZXJ2ZV9maWxlXC8oQFswLTlhLXpBLVpdKylcLz8kLy5leGVjKFJ1bnRpbWUucXVlcnlQYXJhbSgncmVtb3RlQmFzZScpKTtpZih2ZXJzaW9uTWF0Y2gpClJ1bnRpbWUuX3JlbW90ZUJhc2U9YCR7bG9jYXRpb24ub3JpZ2lufS9yZW1vdGUvc2VydmVfZmlsZS8ke3ZlcnNpb25NYXRjaFsxXX0vYDt9fSkoKTtmdW5jdGlvbiBTZXJ2aWNlUG9ydCgpe30KU2VydmljZVBvcnQucHJvdG90eXBlPXtzZXRIYW5kbGVycyhtZXNzYWdlSGFuZGxlcixjbG9zZUhhbmRsZXIpe30sc2VuZChtZXNzYWdlKXt9LGNsb3NlKCl7fX07dmFyIHJ1bnRpbWU7YWxsRGVzY3JpcHRvcnMucHVzaCguLi5beyJkZXBlbmRlbmNpZXMiOlsidWkiLCJwbGF0Zm9ybSIsImNvbW1vbiIsImNtIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IlRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLlRva2VuaXplckZhY3RvcnkiLCJ0eXBlIjoiQFRleHRVdGlscy5Ub2tlbml6ZXJGYWN0b3J5In0seyJjbGFzc05hbWUiOiJUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yRmFjdG9yeSIsInR5cGUiOiJAVUkuVGV4dEVkaXRvckZhY3RvcnkifV0sIm5hbWUiOiJ0ZXh0X2VkaXRvciIsInNjcmlwdHMiOlsidGV4dF9lZGl0b3JfbW9kdWxlLmpzIl0sInNraXBfY29tcGlsYXRpb24iOlsiYWNvcm4vYWNvcm4uanMiLCIuLi9jbV93ZWJfbW9kZXMvY3NzLmpzIiwiLi4vY21fd2ViX21vZGVzL2phdmFzY3JpcHQuanMiLCIuLi9jbV93ZWJfbW9kZXMveG1sLmpzIiwiLi4vY21fd2ViX21vZGVzL2h0bWxtaXhlZC5qcyIsIi4uL2NtX3dlYl9tb2Rlcy9odG1sZW1iZWRkZWQuanMiXX0seyJza2lwX2NvbXBpbGF0aW9uIjpbIi4uL0luc3BlY3RvckJhY2tlbmRDb21tYW5kcy5qcyJdLCJkZXBlbmRlbmNpZXMiOlsiY29tbW9uIl0sIm5hbWUiOiJwcm90b2NvbCJ9LHsic2tpcF9jb21waWxhdGlvbiI6WyJjb2RlbWlycm9yLmpzIiwibXVsdGlwbGV4LmpzIiwibWF0Y2hicmFja2V0cy5qcyIsImNsb3NlYnJhY2tldHMuanMiLCJtYXJrc2VsZWN0aW9uLmpzIiwiY29tbWVudC5qcyIsIm92ZXJsYXkuanMiLCJhY3RpdmVsaW5lLmpzIl0sIm5hbWUiOiJjbSIsInNjcmlwdHMiOlsiY21fbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInRleHRfZWRpdG9yIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IkNtTW9kZXMuRGVmYXVsdENvZGVNaXJyb3JNaW1lTW9kZSIsIm1pbWVUeXBlcyI6WyJ0ZXh0L3gtY3NyYyIsInRleHQveC1jIiwidGV4dC94LWNoZHIiLCJ0ZXh0L3gtYysrc3JjIiwidGV4dC94LWMrK2hkciIsInRleHQveC1qYXZhIiwidGV4dC94LWNzaGFycCIsInRleHQveC1zY2FsYSIsIngtc2hhZGVyL3gtdmVydGV4IiwieC1zaGFkZXIveC1mcmFnbWVudCJdLCJ0eXBlIjoiQFRleHRFZGl0b3IuQ29kZU1pcnJvck1pbWVNb2RlIiwiZmlsZU5hbWUiOiJjbGlrZS5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbInRleHQveC1jb2ZmZWVzY3JpcHQiXSwidHlwZSI6IkBUZXh0RWRpdG9yLkNvZGVNaXJyb3JNaW1lTW9kZSIsImZpbGVOYW1lIjoiY29mZmVlc2NyaXB0LmpzIn0seyJjbGFzc05hbWUiOiJDbU1vZGVzLkRlZmF1bHRDb2RlTWlycm9yTWltZU1vZGUiLCJtaW1lVHlwZXMiOlsidGV4dC9tYXJrZG93biIsInRleHQveC1tYXJrZG93biJdLCJ0eXBlIjoiQFRleHRFZGl0b3IuQ29kZU1pcnJvck1pbWVNb2RlIiwiZmlsZU5hbWUiOiJtYXJrZG93bi5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwIiwiYXBwbGljYXRpb24veC1odHRwZC1waHAtb3BlbiIsInRleHQveC1waHAiXSwiZGVwZW5kZW5jaWVzIjpbImNsaWtlLmpzIl0sInR5cGUiOiJAVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUiLCJmaWxlTmFtZSI6InBocC5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbInRleHQveC1weXRob24iLCJ0ZXh0L3gtY3l0aG9uIl0sInR5cGUiOiJAVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUiLCJmaWxlTmFtZSI6InB5dGhvbi5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbInRleHQveC1zaCJdLCJ0eXBlIjoiQFRleHRFZGl0b3IuQ29kZU1pcnJvck1pbWVNb2RlIiwiZmlsZU5hbWUiOiJzaGVsbC5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbInRleHQveC1saXZlc2NyaXB0Il0sInR5cGUiOiJAVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUiLCJmaWxlTmFtZSI6ImxpdmVzY3JpcHQuanMifSx7ImNsYXNzTmFtZSI6IkNtTW9kZXMuRGVmYXVsdENvZGVNaXJyb3JNaW1lTW9kZSIsIm1pbWVUeXBlcyI6WyJ0ZXh0L3gtY2xvanVyZSJdLCJ0eXBlIjoiQFRleHRFZGl0b3IuQ29kZU1pcnJvck1pbWVNb2RlIiwiZmlsZU5hbWUiOiJjbG9qdXJlLmpzIn0seyJjbGFzc05hbWUiOiJDbU1vZGVzLkRlZmF1bHRDb2RlTWlycm9yTWltZU1vZGUiLCJtaW1lVHlwZXMiOlsidGV4dC9qc3giLCJ0ZXh0L3R5cGVzY3JpcHQtanN4Il0sInR5cGUiOiJAVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUiLCJmaWxlTmFtZSI6ImpzeC5qcyJ9LHsiY2xhc3NOYW1lIjoiQ21Nb2Rlcy5EZWZhdWx0Q29kZU1pcnJvck1pbWVNb2RlIiwibWltZVR5cGVzIjpbInRleHQveC1zdHlsIl0sInR5cGUiOiJAVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUiLCJmaWxlTmFtZSI6InN0eWx1cy5qcyJ9XSwibmFtZSI6ImNtX21vZGVzIiwic2NyaXB0cyI6WyJjbV9tb2Rlc19tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiY29tcG9uZW50cyIsInNlYXJjaCIsInNvdXJjZV9mcmFtZSIsInNuaXBwZXRzIiwiZXh0ZW5zaW9ucyIsInBlcnNpc3RlbmNlIiwicXVpY2tfb3BlbiIsImlubGluZV9lZGl0b3IiLCJjb2xvcl9waWNrZXIiLCJldmVudF9saXN0ZW5lcnMiLCJvYmplY3RfdWkiLCJmb3JtYXR0ZXIiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJTb3VyY2VzIiwiaWQiOiJzb3VyY2VzIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwiLCJsb2NhdGlvbiI6InBhbmVsIiwidHlwZSI6InZpZXciLCJvcmRlciI6MzB9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwiLCJjb250ZXh0VHlwZXMiOlsiV29ya3NwYWNlLlVJU291cmNlQ29kZSIsIldvcmtzcGFjZS5VSUxvY2F0aW9uIiwiU0RLLlJlbW90ZU9iamVjdCIsIlNESy5OZXR3b3JrUmVxdWVzdCIsIlNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUiXSwidHlwZSI6IkBVSS5Db250ZXh0TWVudS5Qcm92aWRlciJ9LHsiY2F0ZWdvcnkiOiJEZWJ1Z2dlciIsImljb25DbGFzcyI6ImxhcmdlaWNvbi1wYXVzZSIsInRvZ2dsZWRJY29uQ2xhc3MiOiJsYXJnZWljb24tcmVzdW1lIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuUmV2ZWFsaW5nQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiU291cmNlcy5Tb3VyY2VzUGFuZWwiLCJVSS5TaG9ydGN1dFJlZ2lzdHJ5LkZvcndhcmRlZFNob3J0Y3V0Il0sImFjdGlvbklkIjoiZGVidWdnZXIudG9nZ2xlLXBhdXNlIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiRjggQ3RybCtcXCJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6IkY4IE1ldGErXFwifV0sInR5cGUiOiJhY3Rpb24iLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJQYXVzZSBzY3JpcHQgZXhlY3V0aW9uIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiUmVzdW1lIHNjcmlwdCBleGVjdXRpb24ifV19LHsiY2F0ZWdvcnkiOiJEZWJ1Z2dlciIsImljb25DbGFzcyI6ImxhcmdlaWNvbi1zdGVwLW92ZXIiLCJ0aXRsZSI6IlN0ZXAgb3ZlciBuZXh0IGZ1bmN0aW9uIGNhbGwiLCJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNQYW5lbC5EZWJ1Z2dpbmdBY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzIl0sImFjdGlvbklkIjoiZGVidWdnZXIuc3RlcC1vdmVyIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiRjEwIEN0cmwrJyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6IkYxMCBNZXRhKycifV0sInR5cGUiOiJhY3Rpb24ifSx7ImNhdGVnb3J5IjoiRGVidWdnZXIiLCJpY29uQ2xhc3MiOiJsYXJnZWljb24tc3RlcC1pbnRvIiwidGl0bGUiOiJTdGVwIGludG8gbmV4dCBmdW5jdGlvbiBjYWxsIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuRGVidWdnaW5nQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyJdLCJhY3Rpb25JZCI6ImRlYnVnZ2VyLnN0ZXAtaW50byIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkYxMSBDdHJsKzsifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJGMTEgTWV0YSs7In1dLCJ0eXBlIjoiYWN0aW9uIn0seyJjYXRlZ29yeSI6IkRlYnVnZ2VyIiwiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0ZXAiLCJ0aXRsZSI6IlN0ZXAiLCJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNQYW5lbC5EZWJ1Z2dpbmdBY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzIl0sImFjdGlvbklkIjoiZGVidWdnZXIuc3RlcCIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkY5In1dLCJ0eXBlIjoiYWN0aW9uIn0seyJjYXRlZ29yeSI6IkRlYnVnZ2VyIiwiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0ZXAtb3V0IiwidGl0bGUiOiJTdGVwIG91dCBvZiBjdXJyZW50IGZ1bmN0aW9uIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuRGVidWdnaW5nQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyJdLCJhY3Rpb25JZCI6ImRlYnVnZ2VyLnN0ZXAtb3V0IiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiU2hpZnQrRjExIFNoaWZ0K0N0cmwrOyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6IlNoaWZ0K0YxMSBTaGlmdCtNZXRhKzsifV0sInR5cGUiOiJhY3Rpb24ifSx7Imljb25DbGFzcyI6ImxhcmdlaWNvbi1wbGF5IiwidGl0bGUiOiJSdW4gc25pcHBldCIsImNsYXNzTmFtZSI6IlNvdXJjZXMuU291cmNlc1BhbmVsLkRlYnVnZ2luZ0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImFjdGlvbklkIjoiZGVidWdnZXIucnVuLXNuaXBwZXQiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK0VudGVyIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStFbnRlciJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJEZWJ1Z2dlciIsImljb25DbGFzcyI6ImxhcmdlaWNvbi1kZWFjdGl2YXRlLWJyZWFrcG9pbnRzIiwidG9nZ2xlZEljb25DbGFzcyI6ImxhcmdlaWNvbi1hY3RpdmF0ZS1icmVha3BvaW50cyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuU291cmNlc1BhbmVsLkRlYnVnZ2luZ0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImFjdGlvbklkIjoiZGVidWdnZXIudG9nZ2xlLWJyZWFrcG9pbnRzLWFjdGl2ZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrRjgifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0Y4In1dLCJ0eXBlIjoiYWN0aW9uIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRGVhY3RpdmF0ZSBicmVha3BvaW50cyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkFjdGl2YXRlIGJyZWFrcG9pbnRzIn1dfSx7InRpdGxlIjoiQWRkIHNlbGVjdGVkIHRleHQgdG8gd2F0Y2hlcyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuV2F0Y2hFeHByZXNzaW9uc1NpZGViYXJQYW5lIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUiXSwiYWN0aW9uSWQiOiJzb3VyY2VzLmFkZC10by13YXRjaCIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrQSJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5XYXRjaEV4cHJlc3Npb25zU2lkZWJhclBhbmUiLCJjb250ZXh0VHlwZXMiOlsiT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudCJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIiwiYWN0aW9uSWQiOiJzb3VyY2VzLmFkZC10by13YXRjaCIsInRpdGxlIjoiQWRkIHRvIHdhdGNoIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLldhdGNoRXhwcmVzc2lvbnNTaWRlYmFyUGFuZSIsImNvbnRleHRUeXBlcyI6WyJUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yIl0sInR5cGUiOiJAVUkuQ29udGV4dE1lbnUuUHJvdmlkZXIifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuR3V0dGVyRGlmZlBsdWdpbi5Db250ZXh0TWVudVByb3ZpZGVyIiwiY29udGV4dFR5cGVzIjpbIldvcmtzcGFjZS5VSVNvdXJjZUNvZGUiXSwidHlwZSI6IkBVSS5Db250ZXh0TWVudS5Qcm92aWRlciJ9LHsidGl0bGUiOiJFdmFsdWF0ZSBpbiBjb25zb2xlIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuRGVidWdnaW5nQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiU291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZSJdLCJhY3Rpb25JZCI6ImRlYnVnZ2VyLmV2YWx1YXRlLXNlbGVjdGlvbiIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrRSJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5PcGVuRmlsZVF1aWNrT3BlbiIsInByZWZpeCI6IiIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciIsInRpdGxlIjoiT3BlbiBmaWxlIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLkdvVG9MaW5lUXVpY2tPcGVuIiwicHJlZml4IjoiOiIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciIsInRpdGxlIjoiR28gdG8gbGluZSJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5PdXRsaW5lUXVpY2tPcGVuIiwicHJlZml4IjoiQCIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciIsInRpdGxlIjoiR28gdG8gc3ltYm9sIn0seyJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6Im5hdmlnYXRvck1lbnUvZGVmYXVsdCIsImFjdGlvbklkIjoicXVpY2tPcGVuLnNob3cifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuU291cmNlc1BhbmVsLlVJTG9jYXRpb25SZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJXb3Jrc3BhY2UuVUlMb2NhdGlvbiJdLCJkZXN0aW5hdGlvbiI6IlNvdXJjZXMgcGFuZWwiLCJ0eXBlIjoiQENvbW1vbi5SZXZlYWxlciJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuRGVidWdnZXJMb2NhdGlvblJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uIl0sImRlc3RpbmF0aW9uIjoiU291cmNlcyBwYW5lbCIsInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNQYW5lbC5VSVNvdXJjZUNvZGVSZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlIl0sImRlc3RpbmF0aW9uIjoiU291cmNlcyBwYW5lbCIsInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNQYW5lbC5EZWJ1Z2dlclBhdXNlZERldGFpbHNSZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzIl0sImRlc3RpbmF0aW9uIjoiU291cmNlcyBwYW5lbCIsInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLklucGxhY2VGb3JtYXR0ZXJFZGl0b3JBY3Rpb24iLCJ0eXBlIjoiQFNvdXJjZXMuU291cmNlc1ZpZXcuRWRpdG9yQWN0aW9uIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNjcmlwdEZvcm1hdHRlckVkaXRvckFjdGlvbiIsInR5cGUiOiJAU291cmNlcy5Tb3VyY2VzVmlldy5FZGl0b3JBY3Rpb24ifSx7InRpdGxlIjoiRmlsZXN5c3RlbSIsImlkIjoibmF2aWdhdG9yLWZpbGVzIiwiY2xhc3NOYW1lIjoiU291cmNlcy5GaWxlc05hdmlnYXRvclZpZXciLCJsb2NhdGlvbiI6Im5hdmlnYXRvci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6MywicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7InRpdGxlIjoiU25pcHBldHMiLCJpZCI6Im5hdmlnYXRvci1zbmlwcGV0cyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuU25pcHBldHNOYXZpZ2F0b3JWaWV3IiwibG9jYXRpb24iOiJuYXZpZ2F0b3ItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjYsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJ0aXRsZSI6IlNlYXJjaCIsImlkIjoic291cmNlcy5zZWFyY2gtc291cmNlcy10YWIiLCJjbGFzc05hbWUiOiJTb3VyY2VzLlNlYXJjaFNvdXJjZXNWaWV3IiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLk5ldHdvcmtOYXZpZ2F0b3JWaWV3Iiwidmlld0lkIjoibmF2aWdhdG9yLW5ldHdvcmsiLCJ0eXBlIjoiQFNvdXJjZXMuTmF2aWdhdG9yVmlldyJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5GaWxlc05hdmlnYXRvclZpZXciLCJ2aWV3SWQiOiJuYXZpZ2F0b3ItZmlsZXMiLCJ0eXBlIjoiQFNvdXJjZXMuTmF2aWdhdG9yVmlldyJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5TbmlwcGV0c05hdmlnYXRvclZpZXciLCJ2aWV3SWQiOiJuYXZpZ2F0b3Itc25pcHBldHMiLCJ0eXBlIjoiQFNvdXJjZXMuTmF2aWdhdG9yVmlldyJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzVmlldy5Td2l0Y2hGaWxlQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiU291cmNlcy5Tb3VyY2VzVmlldyJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJBbHQrTyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5zd2l0Y2gtZmlsZSJ9LHsiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiRjIifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJFbnRlciJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5yZW5hbWUifSx7ImRlZmF1bHRWYWx1ZSI6InRydWUiLCJ0eXBlIjoic2V0dGluZyIsInNldHRpbmdOYW1lIjoibmF2aWdhdG9yR3JvdXBCeUZvbGRlciIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiJ9LHsiY2F0ZWdvcnkiOiJTb3VyY2VzIiwidGl0bGUiOiJTZWFyY2ggaW4gYW5vbnltb3VzIGFuZCBjb250ZW50IHNjcmlwdHMiLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJzZXR0aW5nTmFtZSI6InNlYXJjaEluQW5vbnltb3VzQW5kQ29udGVudFNjcmlwdHMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNlYXJjaCBpbiBhbm9ueW1vdXMgYW5kIGNvbnRlbnQgc2NyaXB0cyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkRvIG5vdCBzZWFyY2ggaW4gYW5vbnltb3VzIGFuZCBjb250ZW50IHNjcmlwdHMifV19LHsiY2F0ZWdvcnkiOiJTb3VyY2VzIiwidGl0bGUiOiJBdXRvbWF0aWNhbGx5IHJldmVhbCBmaWxlcyBpbiBzaWRlYmFyIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJhdXRvUmV2ZWFsSW5OYXZpZ2F0b3IiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkF1dG9tYXRpY2FsbHkgcmV2ZWFsIGZpbGVzIGluIHNpZGViYXIifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEbyBub3QgYXV0b21hdGljYWxseSByZXZlYWwgZmlsZXMgaW4gc2lkZWJhciJ9XX0seyJjYXRlZ29yeSI6IlNvdXJjZXMiLCJ0aXRsZSI6IkVuYWJsZSBKYXZhU2NyaXB0IHNvdXJjZSBtYXBzIiwiZGVmYXVsdFZhbHVlIjp0cnVlLCJzZXR0aW5nTmFtZSI6ImpzU291cmNlTWFwc0VuYWJsZWQiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkVuYWJsZSBKYXZhU2NyaXB0IHNvdXJjZSBtYXBzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRGlzYWJsZSBKYXZhU2NyaXB0IHNvdXJjZSBtYXBzIn1dfSx7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiRGV0ZWN0IGluZGVudGF0aW9uIiwiZGVmYXVsdFZhbHVlIjp0cnVlLCJzZXR0aW5nTmFtZSI6InRleHRFZGl0b3JBdXRvRGV0ZWN0SW5kZW50Iiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJEZXRlY3QgaW5kZW50YXRpb24ifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEbyBub3QgZGV0ZWN0IGluZGVudGF0aW9uIn1dfSx7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiQXV0b2NvbXBsZXRpb24iLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoidGV4dEVkaXRvckF1dG9jb21wbGV0aW9uIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJFbmFibGUgYXV0b2NvbXBsZXRpb24ifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEaXNhYmxlIGF1dG9jb21wbGV0aW9uIn1dfSx7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiQnJhY2tldCBtYXRjaGluZyIsImRlZmF1bHRWYWx1ZSI6dHJ1ZSwic2V0dGluZ05hbWUiOiJ0ZXh0RWRpdG9yQnJhY2tldE1hdGNoaW5nIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJFbmFibGUgYnJhY2tldCBtYXRjaGluZyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkRpc2FibGUgYnJhY2tldCBtYXRjaGluZyJ9XX0seyJjYXRlZ29yeSI6IlNvdXJjZXMiLCJ0aXRsZSI6IlNob3cgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzOiIsImRlZmF1bHRWYWx1ZSI6Im9yaWdpbmFsIiwic2V0dGluZ05hbWUiOiJzaG93V2hpdGVzcGFjZXNJbkVkaXRvciIsInNldHRpbmdUeXBlIjoiZW51bSIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidGV4dCI6Ik5vbmUiLCJ2YWx1ZSI6Im5vbmUiLCJ0aXRsZSI6IkRvIG5vdCBzaG93IHdoaXRlc3BhY2UgY2hhcmFjdGVycyJ9LHsidGV4dCI6IkFsbCIsInZhbHVlIjoiYWxsIiwidGl0bGUiOiJTaG93IGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMifSx7InRleHQiOiJUcmFpbGluZyIsInZhbHVlIjoidHJhaWxpbmciLCJ0aXRsZSI6IlNob3cgdHJhaWxpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIn1dfSx7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiRGlzcGxheSB2YXJpYWJsZSB2YWx1ZXMgaW5saW5lIHdoaWxlIGRlYnVnZ2luZyIsImRlZmF1bHRWYWx1ZSI6dHJ1ZSwic2V0dGluZ05hbWUiOiJpbmxpbmVWYXJpYWJsZVZhbHVlcyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRGlzcGxheSB2YXJpYWJsZSB2YWx1ZXMgaW5saW5lIHdoaWxlIGRlYnVnZ2luZyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkRvIG5vdCBkaXNwbGF5IHZhcmlhYmxlIHZhbHVlcyBpbmxpbmUgd2hpbGUgZGVidWdnaW5nIn1dfSx7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiRW5hYmxlIENTUyBzb3VyY2UgbWFwcyIsImRlZmF1bHRWYWx1ZSI6dHJ1ZSwic2V0dGluZ05hbWUiOiJjc3NTb3VyY2VNYXBzRW5hYmxlZCIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRW5hYmxlIENTUyBzb3VyY2UgbWFwcyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkRpc2FibGUgQ1NTIHNvdXJjZSBtYXBzIn1dfSx7InRpdGxlIjoiUXVpY2sgc291cmNlIiwiaWQiOiJzb3VyY2VzLnF1aWNrIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwuV3JhcHBlclZpZXciLCJsb2NhdGlvbiI6ImRyYXdlci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6MTAwMCwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifSx7ImNhdGVnb3J5IjoiU291cmNlcyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuU291cmNlc1ZpZXcuQWN0aW9uRGVsZWdhdGUiLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJzb3VyY2VzLmNsb3NlLWFsbCIsInRpdGxlIjoiQ2xvc2UgQWxsIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNWaWV3LkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkFsdCtNaW51cyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5qdW1wLXRvLXByZXZpb3VzLWxvY2F0aW9uIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNWaWV3LkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkFsdCtQbHVzIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJzb3VyY2VzLmp1bXAtdG8tbmV4dC1sb2NhdGlvbiJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzVmlldy5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJTb3VyY2VzLlNvdXJjZXNQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJBbHQrdyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5jbG9zZS1lZGl0b3ItdGFiIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNWaWV3LkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkN0cmwrZyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5nby10by1saW5lIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNvdXJjZXNWaWV3LkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNvdXJjZXMuU291cmNlc1BhbmVsIl0sImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrbyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErU2hpZnQrbyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5nby10by1tZW1iZXIifSx7ImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrYiJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErYiJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiZGVidWdnZXIudG9nZ2xlLWJyZWFrcG9pbnQifSx7ImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrYiJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErU2hpZnQrYiJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiZGVidWdnZXIudG9nZ2xlLWJyZWFrcG9pbnQtZW5hYmxlZCJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzVmlldy5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJTb3VyY2VzLlNvdXJjZXNQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK3MifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK3MifV0sInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6InNvdXJjZXMuc2F2ZSJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzVmlldy5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJTb3VyY2VzLlNvdXJjZXNQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK1NoaWZ0K3MifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0FsdCtzIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJzb3VyY2VzLnNhdmUtYWxsIn0seyJjYXRlZ29yeSI6IlNvdXJjZXMiLCJjbGFzc05hbWUiOiJTb3VyY2VzLlNuaXBwZXRzTmF2aWdhdG9yVmlldy5DcmVhdGluZ0FjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5jcmVhdGUtc25pcHBldCIsInRpdGxlIjoiQ3JlYXRlIG5ldyBzbmlwcGV0In0seyJjYXRlZ29yeSI6IlNvdXJjZXMiLCJjbGFzc05hbWUiOiJTb3VyY2VzLlNuaXBwZXRzTmF2aWdhdG9yVmlldy5DcmVhdGluZ0FjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic291cmNlcy5hZGQtZm9sZGVyLXRvLXdvcmtzcGFjZSIsInRpdGxlIjoiQWRkIGZvbGRlciB0byB3b3Jrc3BhY2UifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuU291cmNlc1BhbmVsIiwidHlwZSI6IkBVSS5WaWV3TG9jYXRpb25SZXNvbHZlciIsIm5hbWUiOiJuYXZpZ2F0b3ItdmlldyJ9LHsiY2F0ZWdvcnkiOiJTb3VyY2VzIiwiY2xhc3NOYW1lIjoiU291cmNlcy5Tb3VyY2VzUGFuZWwiLCJ0eXBlIjoiQFVJLlZpZXdMb2NhdGlvblJlc29sdmVyIiwibmFtZSI6InNvdXJjZXMtc2lkZWJhciJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5UaHJlYWRzU2lkZWJhclBhbmUiLCJ0eXBlIjoidmlldyIsImlkIjoic291cmNlcy50aHJlYWRzIiwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQiLCJ0aXRsZSI6IlRocmVhZHMifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuU2NvcGVDaGFpblNpZGViYXJQYW5lIiwidHlwZSI6InZpZXciLCJpZCI6InNvdXJjZXMuc2NvcGVDaGFpbiIsInBlcnNpc3RlbmNlIjoicGVybWFuZW50IiwidGl0bGUiOiJTY29wZSJ9LHsidGl0bGUiOiJXYXRjaCIsImNsYXNzTmFtZSI6IlNvdXJjZXMuV2F0Y2hFeHByZXNzaW9uc1NpZGViYXJQYW5lIiwiaGFzVG9vbGJhciI6dHJ1ZSwidHlwZSI6InZpZXciLCJpZCI6InNvdXJjZXMud2F0Y2giLCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5KYXZhU2NyaXB0QnJlYWtwb2ludHNTaWRlYmFyUGFuZSIsInR5cGUiOiJ2aWV3IiwiaWQiOiJzb3VyY2VzLmpzQnJlYWtwb2ludHMiLCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCIsInRpdGxlIjoiQnJlYWtwb2ludHMifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyJdLCJ0eXBlIjoiQFVJLkNvbnRleHRGbGF2b3JMaXN0ZW5lciJ9LHsiY2xhc3NOYW1lIjoiU291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZSIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzIl0sInR5cGUiOiJAVUkuQ29udGV4dEZsYXZvckxpc3RlbmVyIn0seyJjbGFzc05hbWUiOiJTb3VyY2VzLlNjb3BlQ2hhaW5TaWRlYmFyUGFuZSIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUiXSwidHlwZSI6IkBVSS5Db250ZXh0Rmxhdm9yTGlzdGVuZXIifSx7ImNhdGVnb3J5IjoiRGVidWdnZXIiLCJ0aXRsZSI6IlByZXZpb3VzIGNhbGwgZnJhbWUiLCJjbGFzc05hbWUiOiJTb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lLkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHMiXSwiYWN0aW9uSWQiOiJkZWJ1Z2dlci5wcmV2aW91cy1jYWxsLWZyYW1lIiwiYmluZGluZ3MiOlt7InNob3J0Y3V0IjoiQ3RybCssIn1dLCJ0eXBlIjoiYWN0aW9uIn0seyJjYXRlZ29yeSI6IkRlYnVnZ2VyIiwidGl0bGUiOiJOZXh0IGNhbGwgZnJhbWUiLCJjbGFzc05hbWUiOiJTb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lLkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHMiXSwiYWN0aW9uSWQiOiJkZWJ1Z2dlci5uZXh0LWNhbGwtZnJhbWUiLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJDdHJsKy4ifV0sInR5cGUiOiJhY3Rpb24ifSx7ImNhdGVnb3J5IjoiRGV2VG9vbHMiLCJ0aXRsZSI6IlNlYXJjaCIsImNsYXNzTmFtZSI6IlNvdXJjZXMuU2VhcmNoU291cmNlc1ZpZXcuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6InNvdXJjZXMuc2VhcmNoIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0FsdCtGIn0seyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrRiJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsidHlwZSI6ImNvbnRleHQtbWVudS1pdGVtIiwibG9jYXRpb24iOiJtYWluTWVudS9kZWZhdWx0IiwiYWN0aW9uSWQiOiJzb3VyY2VzLnNlYXJjaCJ9XSwibmFtZSI6InNvdXJjZXMiLCJzY3JpcHRzIjpbInNvdXJjZXNfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInNkayJdLCJleHRlbnNpb25zIjpbeyJjYXRlZ29yeSI6Ik5ldHdvcmsiLCJ0aXRsZSI6IlByZXNlcnZlIGxvZyIsInN0b3JhZ2VUeXBlIjoic2Vzc2lvbiIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInRhZ3MiOiJwcmVzZXJ2ZSwgY2xlYXIsIHJlc2V0Iiwic2V0dGluZ05hbWUiOiJuZXR3b3JrX2xvZy5wcmVzZXJ2ZS1sb2ciLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkRvIG5vdCBwcmVzZXJ2ZSBsb2cgb24gcGFnZSByZWxvYWQgLyBuYXZpZ2F0aW9uIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiUHJlc2VydmUgbG9nIG9uIHBhZ2UgcmVsb2FkIC8gbmF2aWdhdGlvbiJ9XX1dLCJuYW1lIjoiYnJvd3Nlcl9zZGsifSx7ImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJwbGF0Zm9ybSJdLCJuYW1lIjoiaG9zdCJ9LHsic2tpcF9jb21waWxhdGlvbiI6WyJkaWZmX21hdGNoX3BhdGNoLmpzIl0sImRlcGVuZGVuY2llcyI6WyJjb21tb24iXSwibmFtZSI6ImRpZmYiLCJzY3JpcHRzIjpbImRpZmZfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInNkayIsInBsYXRmb3JtIiwic2VydmljZXMiLCJ3b3Jrc3BhY2UiXSwibmFtZSI6ImJpbmRpbmdzIn0seyJkZXBlbmRlbmNpZXMiOlsiYmluZGluZ3MiLCJxdWlja19vcGVuIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IlNuaXBwZXRzLlNuaXBwZXRzUXVpY2tPcGVuIiwicHJlZml4IjoiISIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciIsInRpdGxlIjoiUnVuIHNuaXBwZXQifV0sIm5hbWUiOiJzbmlwcGV0cyIsInNjcmlwdHMiOlsic25pcHBldHNfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbXSwibmFtZSI6ImhlYXBfc25hcHNob3RfbW9kZWwiLCJzY3JpcHRzIjpbImhlYXBfc25hcHNob3RfbW9kZWxfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiLCJkYXRhX2dyaWQiLCJvYmplY3RfdWkiLCJzZGsiLCJwcm9kdWN0X3JlZ2lzdHJ5IiwiZm9ybWF0dGVyIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiQ29uc29sZSIsImlkIjoiY29uc29sZSIsImNsYXNzTmFtZSI6IkNvbnNvbGUuQ29uc29sZVBhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjIwfSx7InRpdGxlIjoiQ29uc29sZSIsImlkIjoiY29uc29sZS12aWV3IiwiY2xhc3NOYW1lIjoiQ29uc29sZS5Db25zb2xlUGFuZWwuV3JhcHBlclZpZXciLCJsb2NhdGlvbiI6ImRyYXdlci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6MCwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7ImNsYXNzTmFtZSI6IkNvbnNvbGUuQ29uc29sZVBhbmVsLkNvbnNvbGVSZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJDb21tb24uQ29uc29sZSJdLCJ0eXBlIjoiQENvbW1vbi5SZXZlYWxlciJ9LHsiY2xhc3NOYW1lIjoiQ29uc29sZS5Db25zb2xlVmlldy5BY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkN0cmwrYCJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiY29uc29sZS5zaG93In0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJpY29uQ2xhc3MiOiJsYXJnZWljb24tY2xlYXIiLCJ0aXRsZSI6IkNsZWFyIGNvbnNvbGUiLCJjbGFzc05hbWUiOiJDb25zb2xlLkNvbnNvbGVWaWV3LkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJjb25zb2xlLmNsZWFyIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtMIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiQ3RybCtMIE1ldGErSyJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJDb25zb2xlIiwiY2xhc3NOYW1lIjoiQ29uc29sZS5Db25zb2xlVmlldy5BY3Rpb25EZWxlZ2F0ZSIsInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6ImNvbnNvbGUuY2xlYXIuaGlzdG9yeSIsInRpdGxlIjoiQ2xlYXIgY29uc29sZSBoaXN0b3J5In0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJ0aXRsZSI6IkhpZGUgbmV0d29yayBtZXNzYWdlcyIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoiaGlkZU5ldHdvcmtNZXNzYWdlcyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiSGlkZSBuZXR3b3JrIG1lc3NhZ2VzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiU2hvdyBuZXR3b3JrIG1lc3NhZ2VzIn1dfSx7ImNhdGVnb3J5IjoiQ29uc29sZSIsInRpdGxlIjoiU2VsZWN0ZWQgY29udGV4dCBvbmx5Iiwic3RvcmFnZVR5cGUiOiJzZXNzaW9uIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJzZWxlY3RlZENvbnRleHRGaWx0ZXJFbmFibGVkIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJPbmx5IHNob3cgbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0ICh0b3AsIGlmcmFtZSwgd29ya2VyLCBleHRlbnNpb24pIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiU2hvdyBtZXNzYWdlcyBmcm9tIGFsbCBjb250ZXh0cyJ9XX0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJ0aXRsZSI6IkxvZyBYTUxIdHRwUmVxdWVzdHMiLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJzZXR0aW5nTmFtZSI6Im1vbml0b3JpbmdYSFJFbmFibGVkIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7ImNhdGVnb3J5IjoiQ29uc29sZSIsInRpdGxlIjoiU2hvdyB0aW1lc3RhbXBzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJjb25zb2xlVGltZXN0YW1wc0VuYWJsZWQiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgdGltZXN0YW1wcyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkhpZGUgdGltZXN0YW1wcyJ9XX0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJ0aXRsZSI6IkF1dG9jb21wbGV0ZSBmcm9tIGhpc3RvcnkiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiY29uc29sZUhpc3RvcnlBdXRvY29tcGxldGUiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkF1dG9jb21wbGV0ZSBmcm9tIGhpc3RvcnkifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEbyBub3QgYXV0b2NvbXBsZXRlIGZyb20gaGlzdG9yeSJ9XX0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJ0aXRsZSI6Ikdyb3VwIHNpbWlsYXIiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiY29uc29sZUdyb3VwU2ltaWxhciIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiR3JvdXAgc2ltaWxhciBtZXNzYWdlcyBpbiBjb25zb2xlIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG8gbm90IGdyb3VwIHNpbWlsYXIgbWVzc2FnZXMgaW4gY29uc29sZSJ9XX0seyJjYXRlZ29yeSI6IkNvbnNvbGUiLCJ0aXRsZSI6IkVhZ2VyIGV2YWx1YXRpb24iLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiY29uc29sZUVhZ2VyRXZhbCIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRWFnZXJseSBldmFsdWF0ZSBjb25zb2xlIHByb21wdCB0ZXh0In0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG8gbm90IGVhZ2VybHkgZXZhbHVhdGUgY29uc29sZSBwcm9tcHQgdGV4dCJ9XX1dLCJuYW1lIjoiY29uc29sZSIsInNjcmlwdHMiOlsiY29uc29sZV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsicGxhdGZvcm0iLCJ1aSIsImhvc3QiLCJjb21wb25lbnRzIiwiZGF0YV9ncmlkIiwic291cmNlX2ZyYW1lIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiUHJvdG9jb2wgbW9uaXRvciIsImlkIjoicHJvdG9jb2wtbW9uaXRvciIsImNsYXNzTmFtZSI6IlByb3RvY29sTW9uaXRvci5Qcm90b2NvbE1vbml0b3IiLCJleHBlcmltZW50IjoicHJvdG9jb2xNb25pdG9yIiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjEwMCwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifV0sIm5hbWUiOiJwcm90b2NvbF9tb25pdG9yIiwic2NyaXB0cyI6WyJwcm90b2NvbF9tb25pdG9yX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJ3b3Jrc3BhY2UiLCJkaWZmIiwicGVyc2lzdGVuY2UiXSwibmFtZSI6IndvcmtzcGFjZV9kaWZmIiwic2NyaXB0cyI6WyJ3b3Jrc3BhY2VfZGlmZl9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsidWkiLCJzZGsiLCJiaW5kaW5ncyIsInNvdXJjZV9mcmFtZSIsInRleHRfZWRpdG9yIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IlBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLkxpbmVEZWNvcmF0b3IiLCJkZWNvcmF0b3JUeXBlIjoicGVyZm9ybWFuY2UiLCJ0eXBlIjoiQFNvdXJjZUZyYW1lLkxpbmVEZWNvcmF0b3IifSx7ImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0aXRsZSI6IkZsYW1lY2hhcnQgbW91c2Ugd2hlZWwgYWN0aW9uOiIsImRlZmF1bHRWYWx1ZSI6Inpvb20iLCJzZXR0aW5nTmFtZSI6ImZsYW1lY2hhcnRNb3VzZVdoZWVsQWN0aW9uIiwic2V0dGluZ1R5cGUiOiJlbnVtIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ0ZXh0IjoiU2Nyb2xsIiwidmFsdWUiOiJzY3JvbGwiLCJ0aXRsZSI6IlNjcm9sbCJ9LHsidGV4dCI6Ilpvb20iLCJ2YWx1ZSI6Inpvb20iLCJ0aXRsZSI6Ilpvb20ifV19LHsiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXRyYXNoLWJpbiIsImNsYXNzTmFtZSI6IlBlcmZVSS5HQ0FjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiY29tcG9uZW50cy5jb2xsZWN0LWdhcmJhZ2UiLCJ0aXRsZSI6IkNvbGxlY3QgZ2FyYmFnZSJ9XSwibmFtZSI6InBlcmZfdWkiLCJzY3JpcHRzIjpbInBlcmZfdWlfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbW1vbiIsInNkayIsInVpIl0sImV4dGVuc2lvbnMiOlt7ImNhdGVnb3J5IjoiQXBwZWFyYW5jZSIsInRpdGxlIjoiU2hvdyB0aGlyZCBwYXJ0eSBVUkwgYmFkZ2VzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJwcm9kdWN0X3JlZ2lzdHJ5LmJhZGdlcy12aXNpYmxlIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJTaG93IHRoaXJkIHBhcnR5IGJhZGdlcyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkRvIG5vdCBzaG93IHRoaXJkIHBhcnR5IGJhZGdlcyJ9XX1dLCJuYW1lIjoicHJvZHVjdF9yZWdpc3RyeSJ9LHsiZXhwZXJpbWVudCI6InRlcm1pbmFsSW5EcmF3ZXIiLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IlRlcm1pbmFsIiwiaWQiOiJkcmF3ZXIueHRlcm0iLCJmYWN0b3J5TmFtZSI6IlRlcm1pbmFsLlRlcm1pbmFsV2lkZ2V0IiwibG9jYXRpb24iOiJkcmF3ZXItc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjEwfV0sIm5hbWUiOiJ0ZXJtaW5hbCIsImRlcGVuZGVuY2llcyI6WyJjb21wb25lbnRzIiwidWkiLCJzZXJ2aWNlcyJdLCJzY3JpcHRzIjpbInRlcm1pbmFsX21vZHVsZS5qcyJdLCJza2lwX2NvbXBpbGF0aW9uIjpbInh0ZXJtLmpzL2J1aWxkL3h0ZXJtLmpzIiwieHRlcm0uanMvYWRkb25zL2ZpdC9maXQuanMiXX0seyJkZXBlbmRlbmNpZXMiOltdLCJuYW1lIjoicGxhdGZvcm0ifSx7ImRlcGVuZGVuY2llcyI6WyJ0ZXh0X2VkaXRvciIsInVpIiwicGxhdGZvcm0iLCJwZXJzaXN0ZW5jZSIsImZvcm1hdHRlciIsIm9iamVjdF91aSIsIndvcmtzcGFjZV9kaWZmIl0sImV4dGVuc2lvbnMiOlt7ImNhdGVnb3J5IjoiU291cmNlcyIsInRpdGxlIjoiRGVmYXVsdCBpbmRlbnRhdGlvbjoiLCJkZWZhdWx0VmFsdWUiOiIgICAgIiwic2V0dGluZ05hbWUiOiJ0ZXh0RWRpdG9ySW5kZW50Iiwic2V0dGluZ1R5cGUiOiJlbnVtIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ0ZXh0IjoiMiBzcGFjZXMiLCJ2YWx1ZSI6IiAgIiwidGl0bGUiOiJTZXQgaW5kZW50YXRpb24gdG8gMiBzcGFjZXMifSx7InRleHQiOiI0IHNwYWNlcyIsInZhbHVlIjoiICAgICIsInRpdGxlIjoiU2V0IGluZGVudGF0aW9uIHRvIDQgc3BhY2VzIn0seyJ0ZXh0IjoiOCBzcGFjZXMiLCJ2YWx1ZSI6IiAgICAgICAgIiwidGl0bGUiOiJTZXQgaW5kZW50YXRpb24gdG8gOCBzcGFjZXMifSx7InRleHQiOiJUYWIgY2hhcmFjdGVyIiwidmFsdWUiOiJcdCIsInRpdGxlIjoiU2V0IGluZGVudGF0aW9uIHRvIHRhYiBjaGFyYWN0ZXIifV19XSwibmFtZSI6InNvdXJjZV9mcmFtZSIsInNjcmlwdHMiOlsic291cmNlX2ZyYW1lX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJleHRlbnNpb25zIiwiaG9zdCIsInBsYXRmb3JtIiwic2RrIiwicGVyc2lzdGVuY2UiXSwiZXh0ZW5zaW9ucyI6W3siY2xhc3NOYW1lIjoiTWFpbi5TaW1wbGVBcHBQcm92aWRlciIsInR5cGUiOiJAQ29tbW9uLkFwcFByb3ZpZGVyIiwib3JkZXIiOjEwfSx7ImNsYXNzTmFtZSI6IkNvbXBvbmVudHMuTGlua2lmaWVyLkNvbnRlbnRQcm92aWRlckNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiV29ya3NwYWNlLlVJU291cmNlQ29kZSIsIlNESy5SZXNvdXJjZSIsIlNESy5OZXR3b3JrUmVxdWVzdCJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjbGFzc05hbWUiOiJVSS5YTGluay5Db250ZXh0TWVudVByb3ZpZGVyIiwiY29udGV4dFR5cGVzIjpbIk5vZGUiXSwidHlwZSI6IkBVSS5Db250ZXh0TWVudS5Qcm92aWRlciJ9LHsiY2xhc3NOYW1lIjoiQ29tcG9uZW50cy5MaW5raWZpZXIuTGlua0NvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiTm9kZSJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjYXRlZ29yeSI6IkRyYXdlciIsInRpdGxlIjoiRm9jdXMgZGVidWdnZWUiLCJjbGFzc05hbWUiOiJJbnNwZWN0b3JNYWluLkZvY3VzRGVidWdnZWVBY3Rpb25EZWxlZ2F0ZSIsImFjdGlvbklkIjoiaW5zcGVjdG9yX21haW4uZm9jdXMtZGVidWdnZWUiLCJ0eXBlIjoiYWN0aW9uIiwib3JkZXIiOjEwMH0seyJjYXRlZ29yeSI6IkRyYXdlciIsInRpdGxlIjoiVG9nZ2xlIGRyYXdlciIsImNsYXNzTmFtZSI6IlVJLkluc3BlY3RvclZpZXcuRHJhd2VyVG9nZ2xlQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im1haW4udG9nZ2xlLWRyYXdlciIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkVzYyJ9XSwidHlwZSI6ImFjdGlvbiIsIm9yZGVyIjoxMDF9LHsiY2xhc3NOYW1lIjoiTWFpbi5SZWxvYWRBY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkFsdCtSIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJtYWluLmRlYnVnLXJlbG9hZCJ9LHsiY2F0ZWdvcnkiOiJEZXZUb29scyIsInRpdGxlIjoiUmVzdG9yZSBsYXN0IGRvY2sgcG9zaXRpb24iLCJjbGFzc05hbWUiOiJDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLlRvZ2dsZURvY2tBY3Rpb25EZWxlZ2F0ZSIsImFjdGlvbklkIjoibWFpbi50b2dnbGUtZG9jayIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrRCJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErU2hpZnQrRCJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2xhc3NOYW1lIjoiTWFpbi5NYWluLlpvb21BY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrUGx1cyBDdHJsK1NoaWZ0K1BsdXMgQ3RybCtOdW1wYWRQbHVzIEN0cmwrU2hpZnQrTnVtcGFkUGx1cyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErUGx1cyBNZXRhK1NoaWZ0K1BsdXMgTWV0YStOdW1wYWRQbHVzIE1ldGErU2hpZnQrTnVtcGFkUGx1cyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoibWFpbi56b29tLWluIn0seyJjbGFzc05hbWUiOiJNYWluLk1haW4uWm9vbUFjdGlvbkRlbGVnYXRlIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtNaW51cyBDdHJsK1NoaWZ0K01pbnVzIEN0cmwrTnVtcGFkTWludXMgQ3RybCtTaGlmdCtOdW1wYWRNaW51cyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErTWludXMgTWV0YStTaGlmdCtNaW51cyBNZXRhK051bXBhZE1pbnVzIE1ldGErU2hpZnQrTnVtcGFkTWludXMifV0sInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6Im1haW4uem9vbS1vdXQifSx7ImNsYXNzTmFtZSI6Ik1haW4uTWFpbi5ab29tQWN0aW9uRGVsZWdhdGUiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsKzAgQ3RybCtOdW1wYWQwIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YSswIE1ldGErTnVtcGFkMCJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoibWFpbi56b29tLXJlc2V0In0seyJjbGFzc05hbWUiOiJNYWluLk1haW4uU2VhcmNoQWN0aW9uRGVsZWdhdGUiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK0YifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0YgRjMifV0sInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6Im1haW4uc2VhcmNoLWluLXBhbmVsLmZpbmQifSx7ImNsYXNzTmFtZSI6Ik1haW4uTWFpbi5TZWFyY2hBY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJzaG9ydGN1dCI6IkVzYyJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoibWFpbi5zZWFyY2gtaW4tcGFuZWwuY2FuY2VsIiwib3JkZXIiOjEwfSx7ImNsYXNzTmFtZSI6Ik1haW4uTWFpbi5TZWFyY2hBY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStHIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJtYWluLnNlYXJjaC1pbi1wYW5lbC5maW5kLW5leHQifSx7ImNsYXNzTmFtZSI6Ik1haW4uTWFpbi5TZWFyY2hBY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStTaGlmdCtHIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJtYWluLnNlYXJjaC1pbi1wYW5lbC5maW5kLXByZXZpb3VzIn0seyJzZXBhcmF0b3IiOnRydWUsInR5cGUiOiJAVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIiLCJsb2NhdGlvbiI6Im1haW4tdG9vbGJhci1sZWZ0Iiwib3JkZXIiOjEwMH0seyJzZXBhcmF0b3IiOnRydWUsInR5cGUiOiJAVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIiLCJvcmRlciI6OTgsImxvY2F0aW9uIjoibWFpbi10b29sYmFyLXJpZ2h0In0seyJjbGFzc05hbWUiOiJNYWluLk1haW4uTWFpbk1lbnVJdGVtIiwidHlwZSI6IkBVSS5Ub29sYmFySXRlbS5Qcm92aWRlciIsIm9yZGVyIjo5OSwibG9jYXRpb24iOiJtYWluLXRvb2xiYXItcmlnaHQifSx7ImNsYXNzTmFtZSI6IkNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuQ2xvc2VCdXR0b25Qcm92aWRlciIsInR5cGUiOiJAVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIiLCJvcmRlciI6MTAwLCJsb2NhdGlvbiI6Im1haW4tdG9vbGJhci1yaWdodCJ9LHsiY2F0ZWdvcnkiOiJBcHBlYXJhbmNlIiwidGl0bGUiOiJUaGVtZToiLCJkZWZhdWx0VmFsdWUiOiJkZWZhdWx0IiwidGFncyI6ImRhcmssIGxpZ2h0Iiwic2V0dGluZ05hbWUiOiJ1aVRoZW1lIiwic2V0dGluZ1R5cGUiOiJlbnVtIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ0ZXh0IjoiTGlnaHQiLCJ2YWx1ZSI6ImRlZmF1bHQiLCJ0aXRsZSI6IlN3aXRjaCB0byBsaWdodCB0aGVtZSJ9LHsidGV4dCI6IkRhcmsiLCJ2YWx1ZSI6ImRhcmsiLCJ0aXRsZSI6IlN3aXRjaCB0byBkYXJrIHRoZW1lIn1dfSx7ImNhdGVnb3J5IjoiQXBwZWFyYW5jZSIsInRpdGxlIjoiUGFuZWwgbGF5b3V0OiIsImRlZmF1bHRWYWx1ZSI6ImF1dG8iLCJzZXR0aW5nTmFtZSI6InNpZGViYXJQb3NpdGlvbiIsInNldHRpbmdUeXBlIjoiZW51bSIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidGV4dCI6Imhvcml6b250YWwiLCJ2YWx1ZSI6ImJvdHRvbSIsInRpdGxlIjoiVXNlIGhvcml6b250YWwgcGFuZWwgbGF5b3V0In0seyJ0ZXh0IjoidmVydGljYWwiLCJ2YWx1ZSI6InJpZ2h0IiwidGl0bGUiOiJVc2UgdmVydGljYWwgcGFuZWwgbGF5b3V0In0seyJ0ZXh0IjoiYXV0byIsInZhbHVlIjoiYXV0byIsInRpdGxlIjoiVXNlIGF1dG9tYXRpYyBwYW5lbCBsYXlvdXQifV19LHsiY2F0ZWdvcnkiOiJBcHBlYXJhbmNlIiwidGl0bGUtbWFjIjoiRW5hYmxlIFx1MjMxOCArIDEtOSBzaG9ydGN1dCB0byBzd2l0Y2ggcGFuZWxzIiwidGl0bGUiOiJFbmFibGUgQ3RybCArIDEtOSBzaG9ydGN1dCB0byBzd2l0Y2ggcGFuZWxzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJzaG9ydGN1dFBhbmVsU3dpdGNoIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7ImNhdGVnb3J5IjoiRXh0ZW5zaW9ucyIsImNsYXNzTmFtZSI6IkNvbXBvbmVudHMuTGlua2lmaWVyLkxpbmtIYW5kbGVyU2V0dGluZ1VJIiwidHlwZSI6IkBVSS5TZXR0aW5nVUkifSx7ImNhdGVnb3J5IjoiRGV2VG9vbHMiLCJkZWZhdWx0VmFsdWUiOiJyaWdodCIsInNldHRpbmdOYW1lIjoiY3VycmVudERvY2tTdGF0ZSIsInNldHRpbmdUeXBlIjoiZW51bSIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidGV4dCI6IlJpZ2h0IiwidmFsdWUiOiJyaWdodCIsInRpdGxlIjoiRG9jayB0byByaWdodCJ9LHsidGV4dCI6IkJvdHRvbSIsInZhbHVlIjoiYm90dG9tIiwidGl0bGUiOiJEb2NrIHRvIGJvdHRvbSJ9LHsidGV4dCI6IlVuZG9ja2VkIiwidmFsdWUiOiJ1bmRvY2tlZCIsInRpdGxlIjoiVW5kb2NrIGludG8gc2VwYXJhdGUgd2luZG93In1dfSx7ImNhdGVnb3J5IjoiRHJhd2VyIiwiY2xhc3NOYW1lIjoiVUkuSW5zcGVjdG9yVmlldyIsInR5cGUiOiJAVUkuVmlld0xvY2F0aW9uUmVzb2x2ZXIiLCJuYW1lIjoiZHJhd2VyLXZpZXcifSx7ImNhdGVnb3J5IjoiRHJhd2VyIHNpZGViYXIiLCJjbGFzc05hbWUiOiJVSS5JbnNwZWN0b3JWaWV3IiwidHlwZSI6IkBVSS5WaWV3TG9jYXRpb25SZXNvbHZlciIsIm5hbWUiOiJkcmF3ZXItc2lkZWJhciJ9LHsiY2F0ZWdvcnkiOiJQYW5lbCIsImNsYXNzTmFtZSI6IlVJLkluc3BlY3RvclZpZXciLCJ0eXBlIjoiQFVJLlZpZXdMb2NhdGlvblJlc29sdmVyIiwibmFtZSI6InBhbmVsIn1dLCJuYW1lIjoibWFpbiJ9LHsiZGVwZW5kZW5jaWVzIjpbImJpbmRpbmdzIiwid29ya3NwYWNlIiwiY29tcG9uZW50cyIsInNkayJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IldvcmtzcGFjZSIsImlkIjoid29ya3NwYWNlIiwiY2xhc3NOYW1lIjoiUGVyc2lzdGVuY2UuV29ya3NwYWNlU2V0dGluZ3NUYWIiLCJsb2NhdGlvbiI6InNldHRpbmdzLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxfSx7ImNhdGVnb3J5IjoiUGVyc2lzdGVuY2UiLCJ0aXRsZSI6IkVuYWJsZSBMb2NhbCBPdmVycmlkZXMiLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJ0YWdzIjoiaW50ZXJjZXB0aW9uLCBvdmVycmlkZSwgbmV0d29yaywgcmV3cml0ZSwgcmVxdWVzdCIsInNldHRpbmdOYW1lIjoicGVyc2lzdGVuY2VOZXR3b3JrT3ZlcnJpZGVzRW5hYmxlZCIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRW5hYmxlIG92ZXJyaWRlIG5ldHdvcmsgcmVxdWVzdHMifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEaXNhYmxlIG92ZXJyaWRlIG5ldHdvcmsgcmVxdWVzdHMifV19LHsiY2xhc3NOYW1lIjoiUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBY3Rpb25zLkNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiV29ya3NwYWNlLlVJU291cmNlQ29kZSIsIlNESy5SZXNvdXJjZSIsIlNESy5OZXR3b3JrUmVxdWVzdCJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn1dLCJuYW1lIjoicGVyc2lzdGVuY2UifSx7ImRlcGVuZGVuY2llcyI6WyJ1aSJdLCJuYW1lIjoiaW5saW5lX2VkaXRvciIsInNjcmlwdHMiOlsiaW5saW5lX2VkaXRvcl9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiY29tbW9uIiwidWkiLCJzZGsiXSwiZXh0ZW5zaW9ucyI6W3siY2xhc3NOYW1lIjoiQ29uc29sZUNvdW50ZXJzLldhcm5pbmdFcnJvckNvdW50ZXIiLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwib3JkZXIiOjEsImxvY2F0aW9uIjoibWFpbi10b29sYmFyLXJpZ2h0In1dLCJuYW1lIjoiY29uc29sZV9jb3VudGVycyJ9LHsiZGVwZW5kZW5jaWVzIjpbImNvbW1vbiIsImhvc3QiLCJwbGF0Zm9ybSJdLCJuYW1lIjoid29ya3NwYWNlIn0seyJkZXBlbmRlbmNpZXMiOlsidWkiLCJkaWZmIl0sImV4dGVuc2lvbnMiOlt7ImNsYXNzTmFtZSI6IlF1aWNrT3Blbi5Db21tYW5kTWVudVByb3ZpZGVyIiwicHJlZml4IjoiPiIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciIsInRpdGxlIjoiUnVuIGNvbW1hbmQifSx7ImNsYXNzTmFtZSI6IlF1aWNrT3Blbi5IZWxwUXVpY2tPcGVuIiwicHJlZml4IjoiPyIsInR5cGUiOiJAUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlciJ9LHsiY2xhc3NOYW1lIjoiUXVpY2tPcGVuLkNvbW1hbmRNZW51LlNob3dBY3Rpb25EZWxlZ2F0ZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrU2hpZnQrUCJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErU2hpZnQrUCJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiY29tbWFuZE1lbnUuc2hvdyJ9LHsidGl0bGUiOiJPcGVuIGZpbGUiLCJjbGFzc05hbWUiOiJRdWlja09wZW4uUXVpY2tPcGVuLlNob3dBY3Rpb25EZWxlZ2F0ZSIsImFjdGlvbklkIjoicXVpY2tPcGVuLnNob3ciLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErUCBNZXRhK08ifSx7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtQIEN0cmwrTyJ9XSwidHlwZSI6ImFjdGlvbiIsIm9yZGVyIjoxMDB9LHsidHlwZSI6ImNvbnRleHQtbWVudS1pdGVtIiwibG9jYXRpb24iOiJtYWluTWVudS9kZWZhdWx0IiwiYWN0aW9uSWQiOiJxdWlja09wZW4uc2hvdyJ9XSwibmFtZSI6InF1aWNrX29wZW4iLCJzY3JpcHRzIjpbInF1aWNrX29wZW5fbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiXSwibmFtZSI6InNlYXJjaCIsInNjcmlwdHMiOlsic2VhcmNoX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJ1aSJdLCJuYW1lIjoiZGF0YV9ncmlkIiwic2NyaXB0cyI6WyJkYXRhX2dyaWRfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiLCJicm93c2VyX3NkayIsImNvbW1vbiJdLCJuYW1lIjoiZXh0ZW5zaW9ucyJ9LHsiZGVwZW5kZW5jaWVzIjpbInNkayIsInVpIiwic291cmNlX2ZyYW1lIiwic291cmNlcyIsImRhdGFfZ3JpZCJdLCJleHRlbnNpb25zIjpbeyJ0aXRsZSI6IkNvdmVyYWdlIiwib3JkZXIiOjEwMCwiY2xhc3NOYW1lIjoiQ292ZXJhZ2UuQ292ZXJhZ2VWaWV3IiwibG9jYXRpb24iOiJkcmF3ZXItdmlldyIsInR5cGUiOiJ2aWV3IiwiaWQiOiJjb3ZlcmFnZSIsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn0seyJjbGFzc05hbWUiOiJDb3ZlcmFnZS5Db3ZlcmFnZVZpZXcuTGluZURlY29yYXRvciIsImRlY29yYXRvclR5cGUiOiJjb3ZlcmFnZSIsInR5cGUiOiJAU291cmNlRnJhbWUuTGluZURlY29yYXRvciJ9LHsiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0YXJ0LXJlY29yZGluZyIsInRvZ2dsZWRJY29uQ2xhc3MiOiJsYXJnZWljb24tc3RvcC1yZWNvcmRpbmciLCJjbGFzc05hbWUiOiJDb3ZlcmFnZS5Db3ZlcmFnZVZpZXcuQWN0aW9uRGVsZWdhdGUiLCJ0b2dnbGVXaXRoUmVkQ29sb3IiOnRydWUsImFjdGlvbklkIjoiY292ZXJhZ2UudG9nZ2xlLXJlY29yZGluZyIsImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0eXBlIjoiYWN0aW9uIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiSW5zdHJ1bWVudCBjb3ZlcmFnZSJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IlN0b3AgaW5zdHJ1bWVudGluZyBjb3ZlcmFnZSBhbmQgc2hvdyByZXN1bHRzIn1dfSx7Imljb25DbGFzcyI6ImxhcmdlaWNvbi1yZWZyZXNoIiwiY2F0ZWdvcnkiOiJQZXJmb3JtYW5jZSIsInRpdGxlIjoiU3RhcnQgaW5zdHJ1bWVudGluZyBjb3ZlcmFnZSBhbmQgcmVsb2FkIHBhZ2UiLCJjbGFzc05hbWUiOiJDb3ZlcmFnZS5Db3ZlcmFnZVZpZXcuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6ImNvdmVyYWdlLnN0YXJ0LXdpdGgtcmVsb2FkIiwidHlwZSI6ImFjdGlvbiJ9XSwibmFtZSI6ImNvdmVyYWdlIiwic2NyaXB0cyI6WyJjb3ZlcmFnZV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiY29tbW9uIiwiaG9zdCJdLCJuYW1lIjoic2VydmljZXMifSx7ImRlcGVuZGVuY2llcyI6WyJ1aSIsImNvbW1vbiIsImNvbXBvbmVudHMiLCJzZGsiLCJvYmplY3RfdWkiXSwibmFtZSI6ImV2ZW50X2xpc3RlbmVycyIsInNjcmlwdHMiOlsiZXZlbnRfbGlzdGVuZXJzX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJwbGF0Zm9ybSJdLCJuYW1lIjoiZG9tX2V4dGVuc2lvbiJ9LHsic2tpcF9jb21waWxhdGlvbiI6WyIuLi9TdXBwb3J0ZWRDU1NQcm9wZXJ0aWVzLmpzIl0sImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJob3N0IiwicGxhdGZvcm0iLCJwcm90b2NvbCJdLCJleHRlbnNpb25zIjpbeyJkZWZhdWx0VmFsdWUiOiIiLCJ0eXBlIjoic2V0dGluZyIsInNldHRpbmdOYW1lIjoic2tpcFN0YWNrRnJhbWVzUGF0dGVybiIsInNldHRpbmdUeXBlIjoicmVnZXgifSx7ImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInR5cGUiOiJzZXR0aW5nIiwic2V0dGluZ05hbWUiOiJza2lwQ29udGVudFNjcmlwdHMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4ifSx7ImNhdGVnb3J5IjoiQ29uc29sZSIsInRpdGxlIjoiUHJlc2VydmUgbG9nIHVwb24gbmF2aWdhdGlvbiIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoicHJlc2VydmVDb25zb2xlTG9nIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJQcmVzZXJ2ZSBsb2cgdXBvbiBuYXZpZ2F0aW9uIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG8gbm90IHByZXNlcnZlIGxvZyB1cG9uIG5hdmlnYXRpb24ifV19LHsiY2F0ZWdvcnkiOiJEZWJ1Z2dlciIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoicGF1c2VPbkV4Y2VwdGlvbkVuYWJsZWQiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlBhdXNlIG9uIGV4Y2VwdGlvbnMifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEbyBub3QgcGF1c2Ugb24gZXhjZXB0aW9ucyJ9XX0seyJkZWZhdWx0VmFsdWUiOmZhbHNlLCJ0eXBlIjoic2V0dGluZyIsInNldHRpbmdOYW1lIjoicGF1c2VPbkNhdWdodEV4Y2VwdGlvbiIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiJ9LHsiY2F0ZWdvcnkiOiJEZWJ1Z2dlciIsInRpdGxlIjoiRGlzYWJsZSBKYXZhU2NyaXB0Iiwic3RvcmFnZVR5cGUiOiJzZXNzaW9uIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRGlzYWJsZSBKYXZhU2NyaXB0In0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRW5hYmxlIEphdmFTY3JpcHQifV0sInNldHRpbmdOYW1lIjoiamF2YVNjcmlwdERpc2FibGVkIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MX0seyJjYXRlZ29yeSI6IkRlYnVnZ2VyIiwidGl0bGUiOiJEaXNhYmxlIGFzeW5jIHN0YWNrIHRyYWNlcyIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkRvIG5vdCBjYXB0dXJlIGFzeW5jIHN0YWNrIHRyYWNlcyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkNhcHR1cmUgYXN5bmMgc3RhY2sgdHJhY2VzIn1dLCJzZXR0aW5nTmFtZSI6ImRpc2FibGVBc3luY1N0YWNrVHJhY2VzIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6Mn0seyJjYXRlZ29yeSI6IkRlYnVnZ2VyIiwic3RvcmFnZVR5cGUiOiJzZXNzaW9uIiwiZGVmYXVsdFZhbHVlIjp0cnVlLCJzZXR0aW5nTmFtZSI6ImJyZWFrcG9pbnRzQWN0aXZlIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7ImNhdGVnb3J5IjoiRWxlbWVudHMiLCJ0aXRsZSI6IlNob3cgcnVsZXJzIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJzaG93TWV0cmljc1J1bGVycyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIn0seyJjYXRlZ29yeSI6IlJlbmRlcmluZyIsInN0b3JhZ2VUeXBlIjoic2Vzc2lvbiIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoic2hvd1BhaW50UmVjdHMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgcGFpbnQgZmxhc2hpbmcgcmVjdGFuZ2xlcyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkhpZGUgcGFpbnQgZmxhc2hpbmcgcmVjdGFuZ2xlcyJ9XX0seyJjYXRlZ29yeSI6IlJlbmRlcmluZyIsInN0b3JhZ2VUeXBlIjoic2Vzc2lvbiIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoic2hvd0RlYnVnQm9yZGVycyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiU2hvdyBsYXllciBib3JkZXJzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiSGlkZSBsYXllciBib3JkZXJzIn1dfSx7ImNhdGVnb3J5IjoiUmVuZGVyaW5nIiwic3RvcmFnZVR5cGUiOiJzZXNzaW9uIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwic2V0dGluZ05hbWUiOiJzaG93RlBTQ291bnRlciIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiU2hvdyBmcmFtZXMgcGVyIHNlY29uZCAoRlBTKSBtZXRlciJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkhpZGUgZnJhbWVzIHBlciBzZWNvbmQgKEZQUykgbWV0ZXIifV19LHsiY2F0ZWdvcnkiOiJSZW5kZXJpbmciLCJzdG9yYWdlVHlwZSI6InNlc3Npb24iLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJzZXR0aW5nTmFtZSI6InNob3dTY3JvbGxCb3R0bGVuZWNrUmVjdHMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgc2Nyb2xsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiSGlkZSBzY3JvbGwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MifV19LHsiY2F0ZWdvcnkiOiJSZW5kZXJpbmciLCJ0YWdzIjoicXVlcnkiLCJzdG9yYWdlVHlwZSI6InNlc3Npb24iLCJkZWZhdWx0VmFsdWUiOiIiLCJzZXR0aW5nTmFtZSI6ImVtdWxhdGVkQ1NTTWVkaWEiLCJzZXR0aW5nVHlwZSI6ImVudW0iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InRleHQiOiJObyBlbXVsYXRpb24iLCJ2YWx1ZSI6IiIsInRpdGxlIjoiRG8gbm90IGVtdWxhdGUgQ1NTIG1lZGlhIHR5cGUifSx7InRleHQiOiJwcmludCIsInZhbHVlIjoicHJpbnQiLCJ0aXRsZSI6IkVtdWxhdGUgQ1NTIHByaW50IG1lZGlhIHR5cGUifSx7InRleHQiOiJzY3JlZW4iLCJ2YWx1ZSI6InNjcmVlbiIsInRpdGxlIjoiRW11bGF0ZSBDU1Mgc2NyZWVuIG1lZGlhIHR5cGUifV19LHsiY2F0ZWdvcnkiOiJDb25zb2xlIiwidGl0bGUiOiJFbmFibGUgY3VzdG9tIGZvcm1hdHRlcnMiLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJzZXR0aW5nTmFtZSI6ImN1c3RvbUZvcm1hdHRlcnMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGl0bGUiOiJFbmFibGUgcmVxdWVzdCBibG9ja2luZyIsInN0b3JhZ2VUeXBlIjoic2Vzc2lvbiIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoicmVxdWVzdEJsb2NraW5nRW5hYmxlZCIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiRW5hYmxlIHJlcXVlc3QgYmxvY2tpbmcifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEaXNhYmxlIHJlcXVlc3QgYmxvY2tpbmcifV19LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGl0bGUiOiJEaXNhYmxlIGNhY2hlICh3aGlsZSBEZXZUb29scyBpcyBvcGVuKSIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkRpc2FibGUgY2FjaGUgKHdoaWxlIERldlRvb2xzIGlzIG9wZW4pIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRW5hYmxlIGNhY2hlIn1dLCJ1c2VyQWN0aW9uQ29uZGl0aW9uIjoiaGFzT3RoZXJDbGllbnRzIiwic2V0dGluZ05hbWUiOiJjYWNoZURpc2FibGVkIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MH1dLCJuYW1lIjoic2RrIn0seyJkZXBlbmRlbmNpZXMiOlsiY29tbW9uIl0sIm5hbWUiOiJmb3JtYXR0ZXIiLCJzY3JpcHRzIjpbImZvcm1hdHRlcl9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiY29tcG9uZW50cyJdLCJleHRlbnNpb25zIjpbeyJjYXRlZ29yeSI6IlNldHRpbmdzIiwidGl0bGUiOiJTZXR0aW5ncyIsImNsYXNzTmFtZSI6IlNldHRpbmdzLlNldHRpbmdzU2NyZWVuLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJzZXR0aW5ncy5zaG93IiwiYmluZGluZ3MiOlt7InNob3J0Y3V0IjoiRjEgU2hpZnQrPyJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJTZXR0aW5ncyIsImNsYXNzTmFtZSI6IlNldHRpbmdzLlNldHRpbmdzU2NyZWVuLkFjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic2V0dGluZ3MuZG9jdW1lbnRhdGlvbiIsInRpdGxlIjoiRG9jdW1lbnRhdGlvbiJ9LHsiY2F0ZWdvcnkiOiJTZXR0aW5ncyIsImNsYXNzTmFtZSI6IlNldHRpbmdzLlNldHRpbmdzU2NyZWVuLkFjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoic2V0dGluZ3Muc2hvcnRjdXRzIiwidGl0bGUiOiJTaG9ydGN1dHMifSx7ImNsYXNzTmFtZSI6IlNldHRpbmdzLlNldHRpbmdzU2NyZWVuLlJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIkNvbW1vbi5TZXR0aW5nIl0sInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6Im1haW5NZW51L2Zvb3RlciIsImFjdGlvbklkIjoic2V0dGluZ3Muc2hvcnRjdXRzIn0seyJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6Im1haW5NZW51SGVscC9kZWZhdWx0IiwiYWN0aW9uSWQiOiJzZXR0aW5ncy5kb2N1bWVudGF0aW9uIn0seyJ0eXBlIjoiY29udGV4dC1tZW51LWl0ZW0iLCJsb2NhdGlvbiI6Im1haW5NZW51L2Zvb3RlciIsImFjdGlvbklkIjoic2V0dGluZ3Muc2hvdyJ9LHsidGl0bGUiOiJQcmVmZXJlbmNlcyIsImlkIjoicHJlZmVyZW5jZXMiLCJjbGFzc05hbWUiOiJTZXR0aW5ncy5HZW5lcmljU2V0dGluZ3NUYWIiLCJsb2NhdGlvbiI6InNldHRpbmdzLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjowfSx7InRpdGxlIjoiRXhwZXJpbWVudHMiLCJpZCI6ImV4cGVyaW1lbnRzIiwiY2xhc3NOYW1lIjoiU2V0dGluZ3MuRXhwZXJpbWVudHNTZXR0aW5nc1RhYiIsImV4cGVyaW1lbnQiOiIqIiwibG9jYXRpb24iOiJzZXR0aW5ncy12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6M30seyJ0aXRsZSI6IkJsYWNrYm94aW5nIiwiaWQiOiJibGFja2JveCIsImNsYXNzTmFtZSI6IlNldHRpbmdzLkZyYW1ld29ya0JsYWNrYm94U2V0dGluZ3NUYWIiLCJsb2NhdGlvbiI6InNldHRpbmdzLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo0fSx7ImNhdGVnb3J5IjoiU2V0dGluZ3MiLCJjbGFzc05hbWUiOiJTZXR0aW5ncy5TZXR0aW5nc1NjcmVlbiIsInR5cGUiOiJAVUkuVmlld0xvY2F0aW9uUmVzb2x2ZXIiLCJuYW1lIjoic2V0dGluZ3MtdmlldyJ9XSwibmFtZSI6InNldHRpbmdzIiwic2NyaXB0cyI6WyJzZXR0aW5nc19tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsidWkiLCJzZGsiXSwibmFtZSI6ImNvbG9yX3BpY2tlciIsInNjcmlwdHMiOlsiY29sb3JfcGlja2VyX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21wb25lbnRzIiwicGVyZl91aSIsImRhdGFfZ3JpZCIsImhlYXBfc25hcHNob3RfbW9kZWwiLCJvYmplY3RfdWkiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJNZW1vcnkiLCJpZCI6ImhlYXBfcHJvZmlsZXIiLCJjbGFzc05hbWUiOiJQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo2MH0seyJjbGFzc05hbWUiOiJQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbCIsImNvbnRleHRUeXBlcyI6WyJTREsuUmVtb3RlT2JqZWN0Il0sInR5cGUiOiJAVUkuQ29udGV4dE1lbnUuUHJvdmlkZXIifSx7ImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0aXRsZSI6IkhpZ2ggcmVzb2x1dGlvbiBDUFUgcHJvZmlsaW5nIiwiZGVmYXVsdFZhbHVlIjp0cnVlLCJzZXR0aW5nTmFtZSI6ImhpZ2hSZXNvbHV0aW9uQ3B1UHJvZmlsaW5nIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7ImNhdGVnb3J5IjoiUGVyZm9ybWFuY2UiLCJ0aXRsZSI6IlNob3cgbmF0aXZlIGZ1bmN0aW9ucyBpbiBKUyBQcm9maWxlIiwiZGVmYXVsdFZhbHVlIjp0cnVlLCJzZXR0aW5nTmFtZSI6InNob3dOYXRpdmVGdW5jdGlvbnNJbkpTUHJvZmlsZSIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIn0seyJpY29uQ2xhc3MiOiJsYXJnZWljb24tc3RhcnQtcmVjb3JkaW5nIiwidG9nZ2xlZEljb25DbGFzcyI6ImxhcmdlaWNvbi1zdG9wLXJlY29yZGluZyIsImNsYXNzTmFtZSI6IlByb2ZpbGVyLkhlYXBQcm9maWxlclBhbmVsIiwidG9nZ2xlV2l0aFJlZENvbG9yIjp0cnVlLCJhY3Rpb25JZCI6InByb2ZpbGVyLmhlYXAtdG9nZ2xlLXJlY29yZGluZyIsImNvbnRleHRUeXBlcyI6WyJQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK0UifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0UifV0sInR5cGUiOiJhY3Rpb24ifSx7Imljb25DbGFzcyI6ImxhcmdlaWNvbi1zdGFydC1yZWNvcmRpbmciLCJ0b2dnbGVkSWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0b3AtcmVjb3JkaW5nIiwiY2xhc3NOYW1lIjoiUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsIiwidG9nZ2xlV2l0aFJlZENvbG9yIjp0cnVlLCJhY3Rpb25JZCI6InByb2ZpbGVyLmpzLXRvZ2dsZS1yZWNvcmRpbmciLCJjb250ZXh0VHlwZXMiOlsiUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsIl0sImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrRSJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErRSJ9XSwidHlwZSI6ImFjdGlvbiJ9XSwibmFtZSI6InByb2ZpbGVyIiwic2NyaXB0cyI6WyJwcm9maWxlcl9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsicGxhdGZvcm0iLCJkb21fZXh0ZW5zaW9uIiwiY29tbW9uIiwiaG9zdCJdLCJuYW1lIjoidWkifSx7ImRlcGVuZGVuY2llcyI6WyJ0ZXh0X3V0aWxzIiwicGxhdGZvcm0iXSwibmFtZSI6ImNvbW1vbiJ9LHsiZGVwZW5kZW5jaWVzIjpbImJpbmRpbmdzIiwicGxhdGZvcm0iLCJ1aSJdLCJuYW1lIjoiY29tcG9uZW50cyJ9LHsiZGVwZW5kZW5jaWVzIjpbInVpIiwic2RrIiwiY29tcG9uZW50cyIsImZvcm1hdHRlciJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5SZW5kZXJlciIsImNvbnRleHRUeXBlcyI6WyJTREsuUmVtb3RlT2JqZWN0Il0sInR5cGUiOiJAQ29tbW9uLlJlbmRlcmVyIn1dLCJuYW1lIjoib2JqZWN0X3VpIiwic2NyaXB0cyI6WyJvYmplY3RfdWlfbW9kdWxlLmpzIl19LHsic2tpcF9jb21waWxhdGlvbiI6WyJOYXRpdmVGdW5jdGlvbnMuanMiXSwiZGVwZW5kZW5jaWVzIjpbImNvbW1vbiJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJKYXZhU2NyaXB0TWV0YWRhdGEuSmF2YVNjcmlwdE1ldGFkYXRhIiwidHlwZSI6IkBDb21tb24uSmF2YVNjcmlwdE1ldGFkYXRhIn1dLCJuYW1lIjoiamF2YXNjcmlwdF9tZXRhZGF0YSIsInNjcmlwdHMiOlsiamF2YXNjcmlwdF9tZXRhZGF0YV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsid29ya3NwYWNlX2RpZmYiLCJ0ZXh0X2VkaXRvciIsIndvcmtzcGFjZSIsImRpZmYiLCJiaW5kaW5ncyIsInBlcnNpc3RlbmNlIiwidWkiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJDaGFuZ2VzIiwiY2xhc3NOYW1lIjoiQ2hhbmdlcy5DaGFuZ2VzVmlldyIsImxvY2F0aW9uIjoiZHJhd2VyLXZpZXciLCJ0eXBlIjoidmlldyIsImlkIjoiY2hhbmdlcy5jaGFuZ2VzIiwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifSx7ImNsYXNzTmFtZSI6IkNoYW5nZXMuQ2hhbmdlc1ZpZXcuRGlmZlVJTG9jYXRpb25SZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJXb3Jrc3BhY2VEaWZmLkRpZmZVSUxvY2F0aW9uIl0sImRlc3RpbmF0aW9uIjoiQ2hhbmdlcyBkcmF3ZXIiLCJ0eXBlIjoiQENvbW1vbi5SZXZlYWxlciJ9XSwibmFtZSI6ImNoYW5nZXMiLCJzY3JpcHRzIjpbImNoYW5nZXNfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbInBsYXRmb3JtIl0sIm5hbWUiOiJ0ZXh0X3V0aWxzIn1dKTthcHBsaWNhdGlvbkRlc2NyaXB0b3I9eyJoYXNfaHRtbCI6ZmFsc2UsIm1vZHVsZXMiOlt7Im5hbWUiOiJ0ZXh0X2VkaXRvciJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJwcm90b2NvbCJ9LHsibmFtZSI6ImNtIn0seyJuYW1lIjoiZGF0YV9ncmlkIn0seyJuYW1lIjoicGVyZl91aSJ9LHsibmFtZSI6InNvdXJjZXMifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiYnJvd3Nlcl9zZGsifSx7Im5hbWUiOiJkaWZmIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImJpbmRpbmdzIn0seyJuYW1lIjoic25pcHBldHMifSx7Im5hbWUiOiJoZWFwX3NuYXBzaG90X21vZGVsIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImRvbV9leHRlbnNpb24ifSx7Im5hbWUiOiJjb25zb2xlIn0seyJuYW1lIjoicHJvdG9jb2xfbW9uaXRvciJ9LHsibmFtZSI6IndvcmtzcGFjZV9kaWZmIn0seyJ0eXBlIjoicmVtb3RlIiwibmFtZSI6ImNtX21vZGVzIn0seyJuYW1lIjoiZXZlbnRfbGlzdGVuZXJzIn0seyJ0eXBlIjoicmVtb3RlIiwibmFtZSI6InRlcm1pbmFsIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6InBsYXRmb3JtIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6InVpIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6Im1haW4ifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoicGVyc2lzdGVuY2UifSx7Im5hbWUiOiJpbmxpbmVfZWRpdG9yIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImNvbnNvbGVfY291bnRlcnMifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiY29tcG9uZW50cyJ9LHsibmFtZSI6InF1aWNrX29wZW4ifSx7Im5hbWUiOiJjb2xvcl9waWNrZXIifSx7Im5hbWUiOiJjb3ZlcmFnZSJ9LHsibmFtZSI6InNvdXJjZV9mcmFtZSJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJzZXJ2aWNlcyJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJwcm9kdWN0X3JlZ2lzdHJ5In0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6InNkayJ9LHsibmFtZSI6InNlYXJjaCJ9LHsibmFtZSI6ImZvcm1hdHRlciJ9LHsibmFtZSI6InNldHRpbmdzIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6Imhvc3QifSx7Im5hbWUiOiJwcm9maWxlciJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJleHRlbnNpb25zIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6ImNvbW1vbiJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJ3b3Jrc3BhY2UifSx7Im5hbWUiOiJvYmplY3RfdWkifSx7Im5hbWUiOiJqYXZhc2NyaXB0X21ldGFkYXRhIn0seyJuYW1lIjoiY2hhbmdlcyJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJ0ZXh0X3V0aWxzIn1dfQpzZWxmWydQbGF0Zm9ybSddPXNlbGZbJ1BsYXRmb3JtJ118fHt9O2xldCBBcnJheUxpa2U7ZnVuY3Rpb24gbW9kKG0sbil7cmV0dXJuKChtJW4pK24pJW47fQpTdHJpbmcucHJvdG90eXBlLmZpbmRBbGw9ZnVuY3Rpb24oc3RyaW5nKXtjb25zdCBtYXRjaGVzPVtdO2xldCBpPXRoaXMuaW5kZXhPZihzdHJpbmcpO3doaWxlKGkhPT0tMSl7bWF0Y2hlcy5wdXNoKGkpO2k9dGhpcy5pbmRleE9mKHN0cmluZyxpK3N0cmluZy5sZW5ndGgpO30KcmV0dXJuIG1hdGNoZXM7fTtTdHJpbmcucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO307U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQ29udHJvbENoYXJhY3RlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC9bXHUwMDAwLVx1MDAwOFx1MDAwYlx1MDAwY1x1MDAwZS1cdTAwMWZcdTAwODAtXHUwMDlmXS9nLCfvv70nKTt9O1N0cmluZy5wcm90b3R5cGUuaXNXaGl0ZXNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuL15ccyokLy50ZXN0KHRoaXMpO307U3RyaW5nLnByb3RvdHlwZS5jb21wdXRlTGluZUVuZGluZ3M9ZnVuY3Rpb24oKXtjb25zdCBlbmRpbmdzPXRoaXMuZmluZEFsbCgnXG4nKTtlbmRpbmdzLnB1c2godGhpcy5sZW5ndGgpO3JldHVybiBlbmRpbmdzO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVDaGFyYWN0ZXJzPWZ1bmN0aW9uKGNoYXJzKXtsZXQgZm91bmRDaGFyPWZhbHNlO2ZvcihsZXQgaT0wO2k8Y2hhcnMubGVuZ3RoOysraSl7aWYodGhpcy5pbmRleE9mKGNoYXJzLmNoYXJBdChpKSkhPT0tMSl7Zm91bmRDaGFyPXRydWU7YnJlYWs7fX0KaWYoIWZvdW5kQ2hhcikKcmV0dXJuIFN0cmluZyh0aGlzKTtsZXQgcmVzdWx0PScnO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGg7KytpKXtpZihjaGFycy5pbmRleE9mKHRoaXMuY2hhckF0KGkpKSE9PS0xKQpyZXN1bHQrPSdcXCc7cmVzdWx0Kz10aGlzLmNoYXJBdChpKTt9CnJldHVybiByZXN1bHQ7fTtTdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycz1mdW5jdGlvbigpe3JldHVybideW117fSgpXFwuXiQqKz98LSwnO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVGb3JSZWdFeHA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lc2NhcGVDaGFyYWN0ZXJzKFN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCkpO307U3RyaW5nLmZpbHRlclJlZ2V4PWZ1bmN0aW9uKHF1ZXJ5KXtjb25zdCB0b0VzY2FwZT1TdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycygpO2xldCByZWdleFN0cmluZz0nJztmb3IobGV0IGk9MDtpPHF1ZXJ5Lmxlbmd0aDsrK2kpe2xldCBjPXF1ZXJ5LmNoYXJBdChpKTtpZih0b0VzY2FwZS5pbmRleE9mKGMpIT09LTEpCmM9J1xcJytjO2lmKGkpCnJlZ2V4U3RyaW5nKz0nW15cXDAnK2MrJ10qJztyZWdleFN0cmluZys9Yzt9CnJldHVybiBuZXcgUmVnRXhwKHJlZ2V4U3RyaW5nLCdpJyk7fTtTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7JykucmVwbGFjZSgvIi9nLCcmcXVvdDsnKTt9O1N0cmluZy5wcm90b3R5cGUudW5lc2NhcGVIVE1MPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+JykucmVwbGFjZSgvJiM1ODsvZywnOicpLnJlcGxhY2UoLyZxdW90Oy9nLCciJykucmVwbGFjZSgvJiM2MDsvZywnPCcpLnJlcGxhY2UoLyYjNjI7L2csJz4nKS5yZXBsYWNlKC8mYW1wOy9nLCcmJyk7fTtTdHJpbmcucHJvdG90eXBlLmNvbGxhcHNlV2hpdGVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL1tcc1x4QTBdKy9nLCcgJyk7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1NaWRkbGU9ZnVuY3Rpb24obWF4TGVuZ3RoKXtpZih0aGlzLmxlbmd0aDw9bWF4TGVuZ3RoKQpyZXR1cm4gU3RyaW5nKHRoaXMpO2xldCBsZWZ0SGFsZj1tYXhMZW5ndGg+PjE7bGV0IHJpZ2h0SGFsZj1tYXhMZW5ndGgtbGVmdEhhbGYtMTtpZih0aGlzLmNvZGVQb2ludEF0KHRoaXMubGVuZ3RoLXJpZ2h0SGFsZi0xKT49MHgxMDAwMCl7LS1yaWdodEhhbGY7KytsZWZ0SGFsZjt9CmlmKGxlZnRIYWxmPjAmJnRoaXMuY29kZVBvaW50QXQobGVmdEhhbGYtMSk+PTB4MTAwMDApCi0tbGVmdEhhbGY7cmV0dXJuIHRoaXMuc3Vic3RyKDAsbGVmdEhhbGYpKydcdTIwMjYnK3RoaXMuc3Vic3RyKHRoaXMubGVuZ3RoLXJpZ2h0SGFsZixyaWdodEhhbGYpO307U3RyaW5nLnByb3RvdHlwZS50cmltRW5kPWZ1bmN0aW9uKG1heExlbmd0aCl7aWYodGhpcy5sZW5ndGg8PW1heExlbmd0aCkKcmV0dXJuIFN0cmluZyh0aGlzKTtyZXR1cm4gdGhpcy5zdWJzdHIoMCxtYXhMZW5ndGgtMSkrJ1x1MjAyNic7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1VUkw9ZnVuY3Rpb24oYmFzZVVSTERvbWFpbil7bGV0IHJlc3VsdD10aGlzLnJlcGxhY2UoL14oaHR0cHN8aHR0cHxmaWxlKTpcL1wvL2ksJycpO2lmKGJhc2VVUkxEb21haW4pe2lmKHJlc3VsdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYmFzZVVSTERvbWFpbi50b0xvd2VyQ2FzZSgpKSkKcmVzdWx0PXJlc3VsdC5zdWJzdHIoYmFzZVVSTERvbWFpbi5sZW5ndGgpO30KcmV0dXJuIHJlc3VsdDt9O1N0cmluZy5wcm90b3R5cGUudG9UaXRsZUNhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3RoaXMuc3Vic3RyaW5nKDEpO307U3RyaW5nLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24ob3RoZXIpe2lmKHRoaXM+b3RoZXIpCnJldHVybiAxO2lmKHRoaXM8b3RoZXIpCnJldHVybi0xO3JldHVybiAwO307U3RyaW5nLnByb3RvdHlwZS5yZW1vdmVVUkxGcmFnbWVudD1mdW5jdGlvbigpe2xldCBmcmFnbWVudEluZGV4PXRoaXMuaW5kZXhPZignIycpO2lmKGZyYWdtZW50SW5kZXg9PT0tMSkKZnJhZ21lbnRJbmRleD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCxmcmFnbWVudEluZGV4KTt9O1N0cmluZy5oYXNoQ29kZT1mdW5jdGlvbihzdHJpbmcpe2lmKCFzdHJpbmcpCnJldHVybiAwO2NvbnN0IHA9KCgxPDwzMCkqNC01KTtjb25zdCB6PTB4NTAzM2Q5Njc7Y29uc3QgejI9MHg1OWQyZjE1ZDtsZXQgcz0wO2xldCB6aT0xO2ZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKyspe2NvbnN0IHhpPXN0cmluZy5jaGFyQ29kZUF0KGkpKnoyO3M9KHMremkqeGkpJXA7emk9KHppKnopJXA7fQpzPShzK3ppKihwLTEpKSVwO3JldHVybiBNYXRoLmFicyhzfDApO307U3RyaW5nLmlzRGlnaXRBdD1mdW5jdGlvbihzdHJpbmcsaW5kZXgpe2NvbnN0IGM9c3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO3JldHVybig0ODw9YyYmYzw9NTcpO307U3RyaW5nLnByb3RvdHlwZS50b0Jhc2U2ND1mdW5jdGlvbigpe2Z1bmN0aW9uIGVuY29kZUJpdHMoYil7cmV0dXJuIGI8MjY/Yis2NTpiPDUyP2IrNzE6Yjw2Mj9iLTQ6Yj09PTYyPzQzOmI9PT02Mz80Nzo2NTt9CmNvbnN0IGVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7Y29uc3QgZGF0YT1lbmNvZGVyLmVuY29kZSh0aGlzLnRvU3RyaW5nKCkpO2NvbnN0IG49ZGF0YS5sZW5ndGg7bGV0IGVuY29kZWQ9Jyc7aWYobj09PTApCnJldHVybiBlbmNvZGVkO2xldCBzaGlmdDtsZXQgdj0wO2ZvcihsZXQgaT0wO2k8bjtpKyspe3NoaWZ0PWklMzt2fD1kYXRhW2ldPDwoMTY+Pj5zaGlmdCYyNCk7aWYoc2hpZnQ9PT0yKXtlbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksZW5jb2RlQml0cyh2Pj4+NiY2MyksZW5jb2RlQml0cyh2JjYzKSk7dj0wO319CmlmKHNoaWZ0PT09MCkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLDYxLDYxKTtlbHNlIGlmKHNoaWZ0PT09MSkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLGVuY29kZUJpdHModj4+PjYmNjMpLDYxKTtyZXR1cm4gZW5jb2RlZDt9O1N0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yPWZ1bmN0aW9uKGEsYil7Y29uc3QgY2h1bms9L15cZCt8XlxEKy87bGV0IGNodW5rYSxjaHVua2IsYW51bSxibnVtO3doaWxlKDEpe2lmKGEpe2lmKCFiKQpyZXR1cm4gMTt9ZWxzZXtpZihiKQpyZXR1cm4tMTtlbHNlCnJldHVybiAwO30KY2h1bmthPWEubWF0Y2goY2h1bmspWzBdO2NodW5rYj1iLm1hdGNoKGNodW5rKVswXTthbnVtPSFpc05hTihjaHVua2EpO2JudW09IWlzTmFOKGNodW5rYik7aWYoYW51bSYmIWJudW0pCnJldHVybi0xO2lmKGJudW0mJiFhbnVtKQpyZXR1cm4gMTtpZihhbnVtJiZibnVtKXtjb25zdCBkaWZmPWNodW5rYS1jaHVua2I7aWYoZGlmZikKcmV0dXJuIGRpZmY7aWYoY2h1bmthLmxlbmd0aCE9PWNodW5rYi5sZW5ndGgpe2lmKCErY2h1bmthJiYhK2NodW5rYikKcmV0dXJuIGNodW5rYS5sZW5ndGgtY2h1bmtiLmxlbmd0aDtlbHNlCnJldHVybiBjaHVua2IubGVuZ3RoLWNodW5rYS5sZW5ndGg7fX1lbHNlIGlmKGNodW5rYSE9PWNodW5rYil7cmV0dXJuKGNodW5rYTxjaHVua2IpPy0xOjE7fQphPWEuc3Vic3RyaW5nKGNodW5rYS5sZW5ndGgpO2I9Yi5zdWJzdHJpbmcoY2h1bmtiLmxlbmd0aCk7fX07U3RyaW5nLmNhc2VJbnNlbnNldGl2ZUNvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXthPWEudG9VcHBlckNhc2UoKTtiPWIudG9VcHBlckNhc2UoKTtpZihhPT09YikKcmV0dXJuIDA7cmV0dXJuIGE+Yj8xOi0xO307TnVtYmVyLmNvbnN0cmFpbj1mdW5jdGlvbihudW0sbWluLG1heCl7aWYobnVtPG1pbikKbnVtPW1pbjtlbHNlIGlmKG51bT5tYXgpCm51bT1tYXg7cmV0dXJuIG51bTt9O051bWJlci5nY2Q9ZnVuY3Rpb24oYSxiKXtpZihiPT09MCkKcmV0dXJuIGE7ZWxzZQpyZXR1cm4gTnVtYmVyLmdjZChiLGElYik7fTtOdW1iZXIudG9GaXhlZElmRmxvYXRpbmc9ZnVuY3Rpb24odmFsdWUpe2lmKCF2YWx1ZXx8aXNOYU4odmFsdWUpKQpyZXR1cm4gdmFsdWU7Y29uc3QgbnVtYmVyPU51bWJlcih2YWx1ZSk7cmV0dXJuIG51bWJlciUxP251bWJlci50b0ZpeGVkKDMpOlN0cmluZyhudW1iZXIpO307RGF0ZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiFpc05hTih0aGlzLmdldFRpbWUoKSk7fTtEYXRlLnByb3RvdHlwZS50b0lTTzg2MDFDb21wYWN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbGVhZFplcm8oeCl7cmV0dXJuKHg+OT8nJzonMCcpK3g7fQpyZXR1cm4gdGhpcy5nZXRGdWxsWWVhcigpK2xlYWRaZXJvKHRoaXMuZ2V0TW9udGgoKSsxKStsZWFkWmVybyh0aGlzLmdldERhdGUoKSkrJ1QnKwpsZWFkWmVybyh0aGlzLmdldEhvdXJzKCkpK2xlYWRaZXJvKHRoaXMuZ2V0TWludXRlcygpKStsZWFkWmVybyh0aGlzLmdldFNlY29uZHMoKSk7fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdyZW1vdmUnLHt2YWx1ZTpmdW5jdGlvbih2YWx1ZSxmaXJzdE9ubHkpe2xldCBpbmRleD10aGlzLmluZGV4T2YodmFsdWUpO2lmKGluZGV4PT09LTEpCnJldHVybiBmYWxzZTtpZihmaXJzdE9ubHkpe3RoaXMuc3BsaWNlKGluZGV4LDEpO3JldHVybiB0cnVlO30KZm9yKGxldCBpPWluZGV4KzEsbj10aGlzLmxlbmd0aDtpPG47KytpKXtpZih0aGlzW2ldIT09dmFsdWUpCnRoaXNbaW5kZXgrK109dGhpc1tpXTt9CnRoaXMubGVuZ3RoPWluZGV4O3JldHVybiB0cnVlO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwdXNoQWxsJyx7dmFsdWU6ZnVuY3Rpb24oYXJyYXkpe2ZvcihsZXQgaT0wO2k8YXJyYXkubGVuZ3RoOysraSkKdGhpcy5wdXNoKGFycmF5W2ldKTt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwncm90YXRlJyx7dmFsdWU6ZnVuY3Rpb24oaW5kZXgpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9aW5kZXg7aTxpbmRleCt0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdC5wdXNoKHRoaXNbaSV0aGlzLmxlbmd0aF0pO3JldHVybiByZXN1bHQ7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3NvcnROdW1iZXJzJyx7dmFsdWU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBudW1lcmljQ29tcGFyYXRvcihhLGIpe3JldHVybiBhLWI7fQp0aGlzLnNvcnQobnVtZXJpY0NvbXBhcmF0b3IpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCdzb3J0Jyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLnNvcnR9KTsoZnVuY3Rpb24oKXtjb25zdCBwYXJ0aXRpb249e3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KXtmdW5jdGlvbiBzd2FwKGFycmF5LGkxLGkyKXtjb25zdCB0ZW1wPWFycmF5W2kxXTthcnJheVtpMV09YXJyYXlbaTJdO2FycmF5W2kyXT10ZW1wO30KY29uc3QgcGl2b3RWYWx1ZT10aGlzW3Bpdm90SW5kZXhdO3N3YXAodGhpcyxyaWdodCxwaXZvdEluZGV4KTtsZXQgc3RvcmVJbmRleD1sZWZ0O2ZvcihsZXQgaT1sZWZ0O2k8cmlnaHQ7KytpKXtpZihjb21wYXJhdG9yKHRoaXNbaV0scGl2b3RWYWx1ZSk8MCl7c3dhcCh0aGlzLHN0b3JlSW5kZXgsaSk7KytzdG9yZUluZGV4O319CnN3YXAodGhpcyxyaWdodCxzdG9yZUluZGV4KTtyZXR1cm4gc3RvcmVJbmRleDt9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwYXJ0aXRpb24nLHBhcnRpdGlvbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwncGFydGl0aW9uJyxwYXJ0aXRpb24pO2NvbnN0IHNvcnRSYW5nZT17dmFsdWU6ZnVuY3Rpb24oY29tcGFyYXRvcixsZWZ0Qm91bmQscmlnaHRCb3VuZCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2Z1bmN0aW9uIHF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IsbGVmdCxyaWdodCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2lmKHJpZ2h0PD1sZWZ0KQpyZXR1cm47Y29uc3QgcGl2b3RJbmRleD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHJpZ2h0LWxlZnQpKStsZWZ0O2NvbnN0IHBpdm90TmV3SW5kZXg9YXJyYXkucGFydGl0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KTtpZihzb3J0V2luZG93TGVmdDxwaXZvdE5ld0luZGV4KQpxdWlja1NvcnRSYW5nZShhcnJheSxjb21wYXJhdG9yLGxlZnQscGl2b3ROZXdJbmRleC0xLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7aWYocGl2b3ROZXdJbmRleDxzb3J0V2luZG93UmlnaHQpCnF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IscGl2b3ROZXdJbmRleCsxLHJpZ2h0LHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7fQppZihsZWZ0Qm91bmQ9PT0wJiZyaWdodEJvdW5kPT09KHRoaXMubGVuZ3RoLTEpJiZzb3J0V2luZG93TGVmdD09PTAmJnNvcnRXaW5kb3dSaWdodD49cmlnaHRCb3VuZCkKdGhpcy5zb3J0KGNvbXBhcmF0b3IpO2Vsc2UKcXVpY2tTb3J0UmFuZ2UodGhpcyxjb21wYXJhdG9yLGxlZnRCb3VuZCxyaWdodEJvdW5kLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7cmV0dXJuIHRoaXM7fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnc29ydFJhbmdlJyxzb3J0UmFuZ2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsJ3NvcnRSYW5nZScsc29ydFJhbmdlKTt9KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3N0YWJsZVNvcnQnLHt2YWx1ZTpmdW5jdGlvbihjb21wYXJhdG9yKXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtjb25zdCBpbmRpY2VzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCmluZGljZXNbaV09aTtjb25zdCBzZWxmPXRoaXM7ZnVuY3Rpb24gaW5kZXhDb21wYXJhdG9yKGEsYil7Y29uc3QgcmVzdWx0PWNvbXBhcmF0b3Ioc2VsZlthXSxzZWxmW2JdKTtyZXR1cm4gcmVzdWx0P3Jlc3VsdDphLWI7fQppbmRpY2VzLnNvcnQoaW5kZXhDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPHRoaXMubGVuZ3RoOysraSl7aWYoaW5kaWNlc1tpXTwwfHxpPT09aW5kaWNlc1tpXSkKY29udGludWU7bGV0IGN5Y2xpY2FsPWk7Y29uc3Qgc2F2ZWQ9dGhpc1tpXTt3aGlsZSh0cnVlKXtjb25zdCBuZXh0PWluZGljZXNbY3ljbGljYWxdO2luZGljZXNbY3ljbGljYWxdPS0xO2lmKG5leHQ9PT1pKXt0aGlzW2N5Y2xpY2FsXT1zYXZlZDticmVhazt9ZWxzZXt0aGlzW2N5Y2xpY2FsXT10aGlzW25leHRdO2N5Y2xpY2FsPW5leHQ7fX19CnJldHVybiB0aGlzO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdxc2VsZWN0Jyx7dmFsdWU6ZnVuY3Rpb24oayxjb21wYXJhdG9yKXtpZihrPDB8fGs+PXRoaXMubGVuZ3RoKQpyZXR1cm47aWYoIWNvbXBhcmF0b3Ipe2NvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO307fQpsZXQgbG93PTA7bGV0IGhpZ2g9dGhpcy5sZW5ndGgtMTtmb3IoOzspe2NvbnN0IHBpdm90UG9zaXRpb249dGhpcy5wYXJ0aXRpb24oY29tcGFyYXRvcixsb3csaGlnaCxNYXRoLmZsb29yKChoaWdoK2xvdykvMikpO2lmKHBpdm90UG9zaXRpb249PT1rKQpyZXR1cm4gdGhpc1trXTtlbHNlIGlmKHBpdm90UG9zaXRpb24+aykKaGlnaD1waXZvdFBvc2l0aW9uLTE7ZWxzZQpsb3c9cGl2b3RQb3NpdGlvbisxO319fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpe2Z1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsYil7cmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO2xldCBsPWxlZnR8fDA7bGV0IHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXtjb25zdCBtPShsK3IpPj4xO2lmKGNvbXBhcmF0b3Iob2JqZWN0LHRoaXNbbV0pPjApCmw9bSsxO2Vsc2UKcj1tO30KcmV0dXJuIHI7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpmdW5jdGlvbihvYmplY3QsY29tcGFyYXRvcixsZWZ0LHJpZ2h0KXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtsZXQgbD1sZWZ0fHwwO2xldCByPXJpZ2h0IT09dW5kZWZpbmVkP3JpZ2h0OnRoaXMubGVuZ3RoO3doaWxlKGw8cil7Y29uc3QgbT0obCtyKT4+MTtpZihjb21wYXJhdG9yKG9iamVjdCx0aGlzW21dKT49MCkKbD1tKzE7ZWxzZQpyPW07fQpyZXR1cm4gcjt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS5sb3dlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwndXBwZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS51cHBlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEludDMyQXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzJBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUudXBwZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDY0QXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdiaW5hcnlJbmRleE9mJyx7dmFsdWU6ZnVuY3Rpb24odmFsdWUsY29tcGFyYXRvcil7Y29uc3QgaW5kZXg9dGhpcy5sb3dlckJvdW5kKHZhbHVlLGNvbXBhcmF0b3IpO3JldHVybiBpbmRleDx0aGlzLmxlbmd0aCYmY29tcGFyYXRvcih2YWx1ZSx0aGlzW2luZGV4XSk9PT0wP2luZGV4Oi0xO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdzZWxlY3QnLHt2YWx1ZTpmdW5jdGlvbihmaWVsZCl7Y29uc3QgcmVzdWx0PW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdFtpXT10aGlzW2ldW2ZpZWxkXTtyZXR1cm4gcmVzdWx0O319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwZWVrTGFzdCcse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV07fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIG1lcmdlT3JJbnRlcnNlY3QoYXJyYXkxLGFycmF5Mixjb21wYXJhdG9yLG1lcmdlTm90SW50ZXJzZWN0KXtjb25zdCByZXN1bHQ9W107bGV0IGk9MDtsZXQgaj0wO3doaWxlKGk8YXJyYXkxLmxlbmd0aCYmajxhcnJheTIubGVuZ3RoKXtjb25zdCBjb21wYXJlVmFsdWU9Y29tcGFyYXRvcihhcnJheTFbaV0sYXJyYXkyW2pdKTtpZihtZXJnZU5vdEludGVyc2VjdHx8IWNvbXBhcmVWYWx1ZSkKcmVzdWx0LnB1c2goY29tcGFyZVZhbHVlPD0wP2FycmF5MVtpXTphcnJheTJbal0pO2lmKGNvbXBhcmVWYWx1ZTw9MCkKaSsrO2lmKGNvbXBhcmVWYWx1ZT49MCkKaisrO30KaWYobWVyZ2VOb3RJbnRlcnNlY3Qpe3doaWxlKGk8YXJyYXkxLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkxW2krK10pO3doaWxlKGo8YXJyYXkyLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkyW2orK10pO30KcmV0dXJuIHJlc3VsdDt9Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ2ludGVyc2VjdE9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsZmFsc2UpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdtZXJnZU9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsdHJ1ZSk7fX0pO30pKCk7U3RyaW5nLnNwcmludGY9ZnVuY3Rpb24oZm9ybWF0LHZhcl9hcmcpe3JldHVybiBTdHJpbmcudnNwcmludGYoZm9ybWF0LEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7fTtTdHJpbmcudG9rZW5pemVGb3JtYXRTdHJpbmc9ZnVuY3Rpb24oZm9ybWF0LGZvcm1hdHRlcnMpe2NvbnN0IHRva2Vucz1bXTtmdW5jdGlvbiBhZGRTdHJpbmdUb2tlbihzdHIpe2lmKCFzdHIpCnJldHVybjtpZih0b2tlbnMubGVuZ3RoJiZ0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlPT09J3N0cmluZycpCnRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnZhbHVlKz1zdHI7ZWxzZQp0b2tlbnMucHVzaCh7dHlwZTonc3RyaW5nJyx2YWx1ZTpzdHJ9KTt9CmZ1bmN0aW9uIGFkZFNwZWNpZmllclRva2VuKHNwZWNpZmllcixwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpe3Rva2Vucy5wdXNoKHt0eXBlOidzcGVjaWZpZXInLHNwZWNpZmllcjpzcGVjaWZpZXIscHJlY2lzaW9uOnByZWNpc2lvbixzdWJzdGl0dXRpb25JbmRleDpzdWJzdGl0dXRpb25JbmRleH0pO30KZnVuY3Rpb24gYWRkQW5zaUNvbG9yKGNvZGUpe2NvbnN0IHR5cGVzPXszOidjb2xvcicsOTonY29sb3JMaWdodCcsNDonYmdDb2xvcicsMTA6J2JnQ29sb3JMaWdodCd9O2NvbnN0IGNvbG9yQ29kZXM9WydibGFjaycsJ3JlZCcsJ2dyZWVuJywneWVsbG93JywnYmx1ZScsJ21hZ2VudGEnLCdjeWFuJywnbGlnaHRHcmF5JywnJywnZGVmYXVsdCddO2NvbnN0IGNvbG9yQ29kZXNMaWdodD1bJ2RhcmtHcmF5JywnbGlnaHRSZWQnLCdsaWdodEdyZWVuJywnbGlnaHRZZWxsb3cnLCdsaWdodEJsdWUnLCdsaWdodE1hZ2VudGEnLCdsaWdodEN5YW4nLCd3aGl0ZScsJyddO2NvbnN0IGNvbG9ycz17Y29sb3I6Y29sb3JDb2Rlcyxjb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodCxiZ0NvbG9yOmNvbG9yQ29kZXMsYmdDb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodH07Y29uc3QgdHlwZT10eXBlc1tNYXRoLmZsb29yKGNvZGUvMTApXTtpZighdHlwZSkKcmV0dXJuO2NvbnN0IGNvbG9yPWNvbG9yc1t0eXBlXVtjb2RlJTEwXTtpZighY29sb3IpCnJldHVybjt0b2tlbnMucHVzaCh7dHlwZTonc3BlY2lmaWVyJyxzcGVjaWZpZXI6J2MnLHZhbHVlOntkZXNjcmlwdGlvbjoodHlwZS5zdGFydHNXaXRoKCdiZycpPydiYWNrZ3JvdW5kIDogJzonY29sb3I6ICcpK2NvbG9yfX0pO30KbGV0IHRleHRTdGFydD0wO2xldCBzdWJzdGl0dXRpb25JbmRleD0wO2NvbnN0IHJlPW5ldyBSZWdFeHAoYCUlfCUoPzooXFxkKylcXCQpPyg/OlxcLihcXGQqKSk/KFske09iamVjdC5rZXlzKGZvcm1hdHRlcnMpLmpvaW4oJycpfV0pfFxcdTAwMWJcXFsoXFxkKyltYCwnZycpO2ZvcihsZXQgbWF0Y2g9cmUuZXhlYyhmb3JtYXQpOyEhbWF0Y2g7bWF0Y2g9cmUuZXhlYyhmb3JtYXQpKXtjb25zdCBtYXRjaFN0YXJ0PW1hdGNoLmluZGV4O2lmKG1hdGNoU3RhcnQ+dGV4dFN0YXJ0KQphZGRTdHJpbmdUb2tlbihmb3JtYXQuc3Vic3RyaW5nKHRleHRTdGFydCxtYXRjaFN0YXJ0KSk7aWYobWF0Y2hbMF09PT0nJSUnKXthZGRTdHJpbmdUb2tlbignJScpO31lbHNlIGlmKG1hdGNoWzBdLnN0YXJ0c1dpdGgoJyUnKSl7Y29uc3RbXyxzdWJzdGl0aW9uU3RyaW5nLHByZWNpc2lvblN0cmluZyxzcGVjaWZpZXJTdHJpbmddPW1hdGNoO2lmKHN1YnN0aXRpb25TdHJpbmcmJk51bWJlcihzdWJzdGl0aW9uU3RyaW5nKT4wKQpzdWJzdGl0dXRpb25JbmRleD1OdW1iZXIoc3Vic3RpdGlvblN0cmluZyktMTtjb25zdCBwcmVjaXNpb249cHJlY2lzaW9uU3RyaW5nP051bWJlcihwcmVjaXNpb25TdHJpbmcpOi0xO2FkZFNwZWNpZmllclRva2VuKHNwZWNpZmllclN0cmluZyxwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpOysrc3Vic3RpdHV0aW9uSW5kZXg7fWVsc2V7Y29uc3QgY29kZT1OdW1iZXIobWF0Y2hbNF0pO2FkZEFuc2lDb2xvcihjb2RlKTt9CnRleHRTdGFydD1tYXRjaFN0YXJ0K21hdGNoWzBdLmxlbmd0aDt9CmFkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcodGV4dFN0YXJ0KSk7cmV0dXJuIHRva2Vuczt9O1N0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnM9e2Q6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4haXNOYU4oc3Vic3RpdHV0aW9uKT9zdWJzdGl0dXRpb246MDt9LGY6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uLHRva2VuKXtpZihzdWJzdGl0dXRpb24mJnRva2VuLnByZWNpc2lvbj4tMSkKc3Vic3RpdHV0aW9uPXN1YnN0aXR1dGlvbi50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7cmV0dXJuIWlzTmFOKHN1YnN0aXR1dGlvbik/c3Vic3RpdHV0aW9uOih0b2tlbi5wcmVjaXNpb24+LTE/TnVtYmVyKDApLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTowKTt9LHM6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4gc3Vic3RpdHV0aW9uO319O1N0cmluZy52c3ByaW50Zj1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyl7cmV0dXJuIFN0cmluZy5mb3JtYXQoZm9ybWF0LHN1YnN0aXR1dGlvbnMsU3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycywnJyxmdW5jdGlvbihhLGIpe3JldHVybiBhK2I7fSkuZm9ybWF0dGVkUmVzdWx0O307U3RyaW5nLmZvcm1hdD1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyxmb3JtYXR0ZXJzLGluaXRpYWxWYWx1ZSxhcHBlbmQsdG9rZW5pemVkRm9ybWF0KXtpZighZm9ybWF0fHwoKCFzdWJzdGl0dXRpb25zfHwhc3Vic3RpdHV0aW9ucy5sZW5ndGgpJiZmb3JtYXQuc2VhcmNoKC9cdTAwMWJcWyhcZCspbS8pPT09LTEpKQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OmFwcGVuZChpbml0aWFsVmFsdWUsZm9ybWF0KSx1bnVzZWRTdWJzdGl0dXRpb25zOnN1YnN0aXR1dGlvbnN9O2Z1bmN0aW9uIHByZXR0eUZ1bmN0aW9uTmFtZSgpe3JldHVybidTdHJpbmcuZm9ybWF0KCInK2Zvcm1hdCsnIiwgIicrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChzdWJzdGl0dXRpb25zLCciLCAiJykrJyIpJzt9CmZ1bmN0aW9uIHdhcm4obXNnKXtjb25zb2xlLndhcm4ocHJldHR5RnVuY3Rpb25OYW1lKCkrJzogJyttc2cpO30KZnVuY3Rpb24gZXJyb3IobXNnKXtjb25zb2xlLmVycm9yKHByZXR0eUZ1bmN0aW9uTmFtZSgpKyc6ICcrbXNnKTt9CmxldCByZXN1bHQ9aW5pdGlhbFZhbHVlO2NvbnN0IHRva2Vucz10b2tlbml6ZWRGb3JtYXR8fFN0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZyhmb3JtYXQsZm9ybWF0dGVycyk7Y29uc3QgdXNlZFN1YnN0aXR1dGlvbkluZGV4ZXM9e307Zm9yKGxldCBpPTA7aTx0b2tlbnMubGVuZ3RoOysraSl7Y29uc3QgdG9rZW49dG9rZW5zW2ldO2lmKHRva2VuLnR5cGU9PT0nc3RyaW5nJyl7cmVzdWx0PWFwcGVuZChyZXN1bHQsdG9rZW4udmFsdWUpO2NvbnRpbnVlO30KaWYodG9rZW4udHlwZSE9PSdzcGVjaWZpZXInKXtlcnJvcignVW5rbm93biB0b2tlbiB0eXBlICInK3Rva2VuLnR5cGUrJyIgZm91bmQuJyk7Y29udGludWU7fQppZighdG9rZW4udmFsdWUmJnRva2VuLnN1YnN0aXR1dGlvbkluZGV4Pj1zdWJzdGl0dXRpb25zLmxlbmd0aCl7ZXJyb3IoJ25vdCBlbm91Z2ggc3Vic3RpdHV0aW9uIGFyZ3VtZW50cy4gSGFkICcrc3Vic3RpdHV0aW9ucy5sZW5ndGgrJyBidXQgbmVlZGVkICcrCih0b2tlbi5zdWJzdGl0dXRpb25JbmRleCsxKSsnLCBzbyBzdWJzdGl0dXRpb24gd2FzIHNraXBwZWQuJyk7cmVzdWx0PWFwcGVuZChyZXN1bHQsJyUnKyh0b2tlbi5wcmVjaXNpb24+LTE/dG9rZW4ucHJlY2lzaW9uOicnKSt0b2tlbi5zcGVjaWZpZXIpO2NvbnRpbnVlO30KaWYoIXRva2VuLnZhbHVlKQp1c2VkU3Vic3RpdHV0aW9uSW5kZXhlc1t0b2tlbi5zdWJzdGl0dXRpb25JbmRleF09dHJ1ZTtpZighKHRva2VuLnNwZWNpZmllciBpbiBmb3JtYXR0ZXJzKSl7d2FybigndW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciBcdTIwMUMnK3Rva2VuLnNwZWNpZmllcisnXHUyMDFELiBUcmVhdGluZyBhcyBhIHN0cmluZy4nKTtyZXN1bHQ9YXBwZW5kKHJlc3VsdCx0b2tlbi52YWx1ZT8nJzpzdWJzdGl0dXRpb25zW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XSk7Y29udGludWU7fQpyZXN1bHQ9YXBwZW5kKHJlc3VsdCxmb3JtYXR0ZXJzW3Rva2VuLnNwZWNpZmllcl0odG9rZW4udmFsdWV8fHN1YnN0aXR1dGlvbnNbdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXhdLHRva2VuKSk7fQpjb25zdCB1bnVzZWRTdWJzdGl0dXRpb25zPVtdO2ZvcihsZXQgaT0wO2k8c3Vic3RpdHV0aW9ucy5sZW5ndGg7KytpKXtpZihpIGluIHVzZWRTdWJzdGl0dXRpb25JbmRleGVzKQpjb250aW51ZTt1bnVzZWRTdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uc1tpXSk7fQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OnJlc3VsdCx1bnVzZWRTdWJzdGl0dXRpb25zOnVudXNlZFN1YnN0aXR1dGlvbnN9O307ZnVuY3Rpb24gY3JlYXRlU2VhcmNoUmVnZXgocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCByZWdleEZsYWdzPWNhc2VTZW5zaXRpdmU/J2cnOidnaSc7bGV0IHJlZ2V4T2JqZWN0O2lmKGlzUmVnZXgpe3RyeXtyZWdleE9iamVjdD1uZXcgUmVnRXhwKHF1ZXJ5LHJlZ2V4RmxhZ3MpO31jYXRjaChlKXt9fQppZighcmVnZXhPYmplY3QpCnJlZ2V4T2JqZWN0PWNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LHJlZ2V4RmxhZ3MpO3JldHVybiByZWdleE9iamVjdDt9CmZ1bmN0aW9uIGNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LGZsYWdzKXtjb25zdCByZWdleFNwZWNpYWxDaGFyYWN0ZXJzPVN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCk7bGV0IHJlZ2V4PScnO2ZvcihsZXQgaT0wO2k8cXVlcnkubGVuZ3RoOysraSl7Y29uc3QgYz1xdWVyeS5jaGFyQXQoaSk7aWYocmVnZXhTcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGMpIT09LTEpCnJlZ2V4Kz0nXFwnO3JlZ2V4Kz1jO30KcmV0dXJuIG5ldyBSZWdFeHAocmVnZXgsZmxhZ3N8fCcnKTt9CmZ1bmN0aW9uIGNvdW50UmVnZXhNYXRjaGVzKHJlZ2V4LGNvbnRlbnQpe2xldCB0ZXh0PWNvbnRlbnQ7bGV0IHJlc3VsdD0wO2xldCBtYXRjaDt3aGlsZSh0ZXh0JiYobWF0Y2g9cmVnZXguZXhlYyh0ZXh0KSkpe2lmKG1hdGNoWzBdLmxlbmd0aD4wKQorK3Jlc3VsdDt0ZXh0PXRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KzEpO30KcmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIHNwYWNlc1BhZGRpbmcoc3BhY2VzQ291bnQpe3JldHVybidcdTAwYTAnLnJlcGVhdChzcGFjZXNDb3VudCk7fQpmdW5jdGlvbiBudW1iZXJUb1N0cmluZ1dpdGhTcGFjZXNQYWRkaW5nKHZhbHVlLHN5bWJvbHNDb3VudCl7Y29uc3QgbnVtYmVyU3RyaW5nPXZhbHVlLnRvU3RyaW5nKCk7Y29uc3QgcGFkZGluZ0xlbmd0aD1NYXRoLm1heCgwLHN5bWJvbHNDb3VudC1udW1iZXJTdHJpbmcubGVuZ3RoKTtyZXR1cm4gc3BhY2VzUGFkZGluZyhwYWRkaW5nTGVuZ3RoKStudW1iZXJTdHJpbmc7fQpTZXQucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtTZXQucHJvdG90eXBlLmZpcnN0VmFsdWU9ZnVuY3Rpb24oKXtpZighdGhpcy5zaXplKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7fTtTZXQucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpCnRoaXMuYWRkKGUpO307U2V0LnByb3RvdHlwZS5jb250YWluc0FsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpe2lmKCF0aGlzLmhhcyhlKSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fTtNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihrZXkpe2NvbnN0IHZhbHVlPXRoaXMuZ2V0KGtleSk7dGhpcy5kZWxldGUoa2V5KTtyZXR1cm4gdmFsdWU7fTtNYXAucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtNYXAucHJvdG90eXBlLmtleXNBcnJheT1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cygpKTt9O01hcC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpe2NvbnN0IHJlc3VsdD1uZXcgTXVsdGltYXAoKTtmb3IoY29uc3Qga2V5IG9mIHRoaXMua2V5cygpKXtjb25zdCB2YWx1ZT10aGlzLmdldChrZXkpO3Jlc3VsdC5zZXQodmFsdWUsa2V5KTt9CnJldHVybiByZXN1bHQ7fTt2YXIgTXVsdGltYXA9ZnVuY3Rpb24oKXt0aGlzLl9tYXA9bmV3IE1hcCgpO307TXVsdGltYXAucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXtsZXQgc2V0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighc2V0KXtzZXQ9bmV3IFNldCgpO3RoaXMuX21hcC5zZXQoa2V5LHNldCk7fQpzZXQuYWRkKHZhbHVlKTt9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGtleSl8fG5ldyBTZXQoKTt9LGhhczpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7fSxoYXNWYWx1ZTpmdW5jdGlvbihrZXksdmFsdWUpe2NvbnN0IHNldD10aGlzLl9tYXAuZ2V0KGtleSk7aWYoIXNldCkKcmV0dXJuIGZhbHNlO3JldHVybiBzZXQuaGFzKHZhbHVlKTt9LGdldCBzaXplKCl7cmV0dXJuIHRoaXMuX21hcC5zaXplO30sZGVsZXRlOmZ1bmN0aW9uKGtleSx2YWx1ZSl7Y29uc3QgdmFsdWVzPXRoaXMuZ2V0KGtleSk7aWYoIXZhbHVlcykKcmV0dXJuIGZhbHNlO2NvbnN0IHJlc3VsdD12YWx1ZXMuZGVsZXRlKHZhbHVlKTtpZighdmFsdWVzLnNpemUpCnRoaXMuX21hcC5kZWxldGUoa2V5KTtyZXR1cm4gcmVzdWx0O30sZGVsZXRlQWxsOmZ1bmN0aW9uKGtleSl7dGhpcy5fbWFwLmRlbGV0ZShrZXkpO30sa2V5c0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5rZXlzQXJyYXkoKTt9LHZhbHVlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGtleXM9dGhpcy5rZXlzQXJyYXkoKTtmb3IobGV0IGk9MDtpPGtleXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2hBbGwodGhpcy5nZXQoa2V5c1tpXSkudmFsdWVzQXJyYXkoKSk7cmV0dXJuIHJlc3VsdDt9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLmNsZWFyKCk7fX07ZnVuY3Rpb24gbG9hZFhIUih1cmwpe3JldHVybiBuZXcgUHJvbWlzZShsb2FkKTtmdW5jdGlvbiBsb2FkKHN1Y2Nlc3NDYWxsYmFjayxmYWlsdXJlQ2FsbGJhY2spe2Z1bmN0aW9uIG9uUmVhZHlTdGF0ZUNoYW5nZWQoKXtpZih4aHIucmVhZHlTdGF0ZSE9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpCnJldHVybjtpZih4aHIuc3RhdHVzIT09MjAwKXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7ZmFpbHVyZUNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzKSk7cmV0dXJuO30KeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3N1Y2Nlc3NDYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTt9CmNvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIud2l0aENyZWRlbnRpYWxzPWZhbHNlO3hoci5vcGVuKCdHRVQnLHVybCx0cnVlKTt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW9uUmVhZHlTdGF0ZUNoYW5nZWQ7eGhyLnNlbmQobnVsbCk7fX0KZnVuY3Rpb24gc3VwcHJlc3NVbnVzZWQodmFsdWUpe30Kc2VsZi5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oY2FsbGJhY2spe2NvbnN0IGFyZ3M9Wy4uLmFyZ3VtZW50c10uc2xpY2UoMSk7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Y2FsbGJhY2soLi4uYXJncykpO3JldHVybiAwO307UHJvbWlzZS5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKGNhbGxiYWNrKXtyZXR1cm4gdGhpcy50aGVuKHNwcmVhZFByb21pc2UpO2Z1bmN0aW9uIHNwcmVhZFByb21pc2UoYXJnKXtyZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCxhcmcpO319O1Byb21pc2UucHJvdG90eXBlLmNhdGNoRXhjZXB0aW9uPWZ1bmN0aW9uKGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHRoaXMuY2F0Y2goZnVuY3Rpb24oZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybiBkZWZhdWx0VmFsdWU7fSk7fTtNYXAucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24ob3RoZXIsaXNFcXVhbCl7Y29uc3QgbGVmdEtleXM9dGhpcy5rZXlzQXJyYXkoKTtjb25zdCByaWdodEtleXM9b3RoZXIua2V5c0FycmF5KCk7bGVmdEtleXMuc29ydCgoYSxiKT0+YS1iKTtyaWdodEtleXMuc29ydCgoYSxiKT0+YS1iKTtjb25zdCByZW1vdmVkPVtdO2NvbnN0IGFkZGVkPVtdO2NvbnN0IGVxdWFsPVtdO2xldCBsZWZ0SW5kZXg9MDtsZXQgcmlnaHRJbmRleD0wO3doaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgmJnJpZ2h0SW5kZXg8cmlnaHRLZXlzLmxlbmd0aCl7Y29uc3QgbGVmdEtleT1sZWZ0S2V5c1tsZWZ0SW5kZXhdO2NvbnN0IHJpZ2h0S2V5PXJpZ2h0S2V5c1tyaWdodEluZGV4XTtpZihsZWZ0S2V5PT09cmlnaHRLZXkmJmlzRXF1YWwodGhpcy5nZXQobGVmdEtleSksb3RoZXIuZ2V0KHJpZ2h0S2V5KSkpe2VxdWFsLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4OysrcmlnaHRJbmRleDtjb250aW51ZTt9CmlmKGxlZnRLZXk8PXJpZ2h0S2V5KXtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4O2NvbnRpbnVlO30KYWRkZWQucHVzaChvdGhlci5nZXQocmlnaHRLZXkpKTsrK3JpZ2h0SW5kZXg7fQp3aGlsZShsZWZ0SW5kZXg8bGVmdEtleXMubGVuZ3RoKXtjb25zdCBsZWZ0S2V5PWxlZnRLZXlzW2xlZnRJbmRleCsrXTtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpO30Kd2hpbGUocmlnaHRJbmRleDxyaWdodEtleXMubGVuZ3RoKXtjb25zdCByaWdodEtleT1yaWdodEtleXNbcmlnaHRJbmRleCsrXTthZGRlZC5wdXNoKG90aGVyLmdldChyaWdodEtleSkpO30KcmV0dXJue2FkZGVkOmFkZGVkLHJlbW92ZWQ6cmVtb3ZlZCxlcXVhbDplcXVhbH07fTtmdW5jdGlvbiBydW5PbldpbmRvd0xvYWQoY2FsbGJhY2spe2Z1bmN0aW9uIHdpbmRvd0xvYWRlZCgpe3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsd2luZG93TG9hZGVkLGZhbHNlKTtjYWxsYmFjaygpO30KaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdjb21wbGV0ZSd8fGRvY3VtZW50LnJlYWR5U3RhdGU9PT0naW50ZXJhY3RpdmUnKQpjYWxsYmFjaygpO2Vsc2UKc2VsZi5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJyx3aW5kb3dMb2FkZWQsZmFsc2UpO30KY29uc3QgX3NpbmdsZXRvblN5bWJvbD1TeW1ib2woJ3NpbmdsZXRvbicpO2Z1bmN0aW9uIHNpbmdsZXRvbihjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihfc2luZ2xldG9uU3ltYm9sIGluIGNvbnN0cnVjdG9yRnVuY3Rpb24pCnJldHVybiBjb25zdHJ1Y3RvckZ1bmN0aW9uW19zaW5nbGV0b25TeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltfc2luZ2xldG9uU3ltYm9sXT1pbnN0YW5jZTtyZXR1cm4gaW5zdGFuY2U7fTtzZWxmWydEb21FeHRlbnNpb24nXT1zZWxmWydEb21FeHRlbnNpb24nXXx8e307Tm9kZS5wcm90b3R5cGUucmFuZ2VPZldvcmQ9ZnVuY3Rpb24ob2Zmc2V0LHN0b3BDaGFyYWN0ZXJzLHN0YXlXaXRoaW5Ob2RlLGRpcmVjdGlvbil7bGV0IHN0YXJ0Tm9kZTtsZXQgc3RhcnRPZmZzZXQ9MDtsZXQgZW5kTm9kZTtsZXQgZW5kT2Zmc2V0PTA7aWYoIXN0YXlXaXRoaW5Ob2RlKQpzdGF5V2l0aGluTm9kZT10aGlzO2lmKCFkaXJlY3Rpb258fGRpcmVjdGlvbj09PSdiYWNrd2FyZCd8fGRpcmVjdGlvbj09PSdib3RoJyl7bGV0IG5vZGU9dGhpczt3aGlsZShub2RlKXtpZihub2RlPT09c3RheVdpdGhpbk5vZGUpe2lmKCFzdGFydE5vZGUpCnN0YXJ0Tm9kZT1zdGF5V2l0aGluTm9kZTticmVhazt9CmlmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSl7Y29uc3Qgc3RhcnQ9KG5vZGU9PT10aGlzPyhvZmZzZXQtMSk6KG5vZGUubm9kZVZhbHVlLmxlbmd0aC0xKSk7Zm9yKGxldCBpPXN0YXJ0O2k+PTA7LS1pKXtpZihzdG9wQ2hhcmFjdGVycy5pbmRleE9mKG5vZGUubm9kZVZhbHVlW2ldKSE9PS0xKXtzdGFydE5vZGU9bm9kZTtzdGFydE9mZnNldD1pKzE7YnJlYWs7fX19CmlmKHN0YXJ0Tm9kZSkKYnJlYWs7bm9kZT1ub2RlLnRyYXZlcnNlUHJldmlvdXNOb2RlKHN0YXlXaXRoaW5Ob2RlKTt9CmlmKCFzdGFydE5vZGUpe3N0YXJ0Tm9kZT1zdGF5V2l0aGluTm9kZTtzdGFydE9mZnNldD0wO319ZWxzZXtzdGFydE5vZGU9dGhpcztzdGFydE9mZnNldD1vZmZzZXQ7fQppZighZGlyZWN0aW9ufHxkaXJlY3Rpb249PT0nZm9yd2FyZCd8fGRpcmVjdGlvbj09PSdib3RoJyl7bGV0IG5vZGU9dGhpczt3aGlsZShub2RlKXtpZihub2RlPT09c3RheVdpdGhpbk5vZGUpe2lmKCFlbmROb2RlKQplbmROb2RlPXN0YXlXaXRoaW5Ob2RlO2JyZWFrO30KaWYobm9kZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtjb25zdCBzdGFydD0obm9kZT09PXRoaXM/b2Zmc2V0OjApO2ZvcihsZXQgaT1zdGFydDtpPG5vZGUubm9kZVZhbHVlLmxlbmd0aDsrK2kpe2lmKHN0b3BDaGFyYWN0ZXJzLmluZGV4T2Yobm9kZS5ub2RlVmFsdWVbaV0pIT09LTEpe2VuZE5vZGU9bm9kZTtlbmRPZmZzZXQ9aTticmVhazt9fX0KaWYoZW5kTm9kZSkKYnJlYWs7bm9kZT1ub2RlLnRyYXZlcnNlTmV4dE5vZGUoc3RheVdpdGhpbk5vZGUpO30KaWYoIWVuZE5vZGUpe2VuZE5vZGU9c3RheVdpdGhpbk5vZGU7ZW5kT2Zmc2V0PXN0YXlXaXRoaW5Ob2RlLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREU/c3RheVdpdGhpbk5vZGUubm9kZVZhbHVlLmxlbmd0aDpzdGF5V2l0aGluTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDt9fWVsc2V7ZW5kTm9kZT10aGlzO2VuZE9mZnNldD1vZmZzZXQ7fQpjb25zdCByZXN1bHQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmVzdWx0LnNldFN0YXJ0KHN0YXJ0Tm9kZSxzdGFydE9mZnNldCk7cmVzdWx0LnNldEVuZChlbmROb2RlLGVuZE9mZnNldCk7cmV0dXJuIHJlc3VsdDt9O05vZGUucHJvdG90eXBlLnRyYXZlcnNlTmV4dFRleHROb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2xldCBub2RlPXRoaXMudHJhdmVyc2VOZXh0Tm9kZShzdGF5V2l0aGluKTtpZighbm9kZSkKcmV0dXJuIG51bGw7Y29uc3Qgbm9uVGV4dFRhZ3M9eydTVFlMRSc6MSwnU0NSSVBUJzoxfTt3aGlsZShub2RlJiYobm9kZS5ub2RlVHlwZSE9PU5vZGUuVEVYVF9OT0RFfHxub25UZXh0VGFnc1tub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWVdKSkKbm9kZT1ub2RlLnRyYXZlcnNlTmV4dE5vZGUoc3RheVdpdGhpbik7cmV0dXJuIG5vZGU7fTtFbGVtZW50LnByb3RvdHlwZS5wb3NpdGlvbkF0PWZ1bmN0aW9uKHgseSxyZWxhdGl2ZVRvKXtsZXQgc2hpZnQ9e3g6MCx5OjB9O2lmKHJlbGF0aXZlVG8pCnNoaWZ0PXJlbGF0aXZlVG8uYm94SW5XaW5kb3codGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0eXBlb2YgeD09PSdudW1iZXInKQp0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdsZWZ0Jywoc2hpZnQueCt4KSsncHgnKTtlbHNlCnRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtpZih0eXBlb2YgeT09PSdudW1iZXInKQp0aGlzLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLChzaGlmdC55K3kpKydweCcpO2Vsc2UKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7aWYodHlwZW9mIHg9PT0nbnVtYmVyJ3x8dHlwZW9mIHk9PT0nbnVtYmVyJykKdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgncG9zaXRpb24nLCdhYnNvbHV0ZScpO2Vsc2UKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncG9zaXRpb24nKTt9O0VsZW1lbnQucHJvdG90eXBlLmlzU2Nyb2xsZWRUb0JvdHRvbT1mdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLnNjcm9sbFRvcCt0aGlzLmNsaWVudEhlaWdodC10aGlzLnNjcm9sbEhlaWdodCk8PTI7fTtOb2RlLnByb3RvdHlwZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aE5vZGVOYW1lSW5BcnJheT1mdW5jdGlvbihuYW1lQXJyYXkpe2ZvcihsZXQgbm9kZT10aGlzO25vZGUmJm5vZGUhPT10aGlzLm93bmVyRG9jdW1lbnQ7bm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKSl7Zm9yKGxldCBpPTA7aTxuYW1lQXJyYXkubGVuZ3RoOysraSl7aWYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09bmFtZUFycmF5W2ldLnRvTG93ZXJDYXNlKCkpCnJldHVybiBub2RlO319CnJldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZT1mdW5jdGlvbihub2RlTmFtZSl7cmV0dXJuIHRoaXMuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZUluQXJyYXkoW25vZGVOYW1lXSk7fTtOb2RlLnByb3RvdHlwZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzPWZ1bmN0aW9uKGNsYXNzTmFtZSxzdGF5V2l0aGluKXtyZXR1cm4gdGhpcy5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzTGlzdChbY2xhc3NOYW1lXSxzdGF5V2l0aGluKTt9O05vZGUucHJvdG90eXBlLmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3NMaXN0PWZ1bmN0aW9uKGNsYXNzTmFtZXMsc3RheVdpdGhpbil7Zm9yKGxldCBub2RlPXRoaXM7bm9kZSYmbm9kZSE9PXN0YXlXaXRoaW4mJm5vZGUhPT10aGlzLm93bmVyRG9jdW1lbnQ7bm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKSl7aWYobm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXtsZXQgY29udGFpbnNBbGw9dHJ1ZTtmb3IobGV0IGk9MDtpPGNsYXNzTmFtZXMubGVuZ3RoJiZjb250YWluc0FsbDsrK2kpe2lmKCFub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVzW2ldKSkKY29udGFpbnNBbGw9ZmFsc2U7fQppZihjb250YWluc0FsbCkKcmV0dXJuKG5vZGUpO319CnJldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUucGFyZW50RWxlbWVudE9yU2hhZG93SG9zdD1mdW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJnRoaXMuaG9zdCkKcmV0dXJuKHRoaXMuaG9zdCk7Y29uc3Qgbm9kZT10aGlzLnBhcmVudE5vZGU7aWYoIW5vZGUpCnJldHVybiBudWxsO2lmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkKcmV0dXJuKG5vZGUpO2lmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpCnJldHVybihub2RlLmhvc3QpO3JldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUucGFyZW50Tm9kZU9yU2hhZG93SG9zdD1mdW5jdGlvbigpe2lmKHRoaXMucGFyZW50Tm9kZSkKcmV0dXJuIHRoaXMucGFyZW50Tm9kZTtpZih0aGlzLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZ0aGlzLmhvc3QpCnJldHVybiB0aGlzLmhvc3Q7cmV0dXJuIG51bGw7fTtOb2RlLnByb3RvdHlwZS5nZXRDb21wb25lbnRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgcGFyZW50PXRoaXMucGFyZW50Tm9kZTt3aGlsZShwYXJlbnQmJnBhcmVudC5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKcGFyZW50PXBhcmVudC5wYXJlbnROb2RlO3JldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290P3BhcmVudC5nZXRTZWxlY3Rpb24oKTp0aGlzLndpbmRvdygpLmdldFNlbGVjdGlvbigpO307Tm9kZS5wcm90b3R5cGUuaGFzU2VsZWN0aW9uPWZ1bmN0aW9uKCl7Y29uc3QgY29udGVudHM9dGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdjb250ZW50Jyk7Zm9yKGNvbnN0IGNvbnRlbnQgb2YgY29udGVudHMpe2lmKEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoY29udGVudC5nZXREaXN0cmlidXRlZE5vZGVzKCksbm9kZT0+bm9kZS5oYXNTZWxlY3Rpb24oKSkpCnJldHVybiB0cnVlO30KY29uc3Qgc2VsZWN0aW9uPXRoaXMuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7aWYoc2VsZWN0aW9uLnR5cGUhPT0nUmFuZ2UnKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHNlbGVjdGlvbi5jb250YWluc05vZGUodGhpcyx0cnVlKXx8c2VsZWN0aW9uLmFuY2hvck5vZGUuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMpfHxzZWxlY3Rpb24uZm9jdXNOb2RlLmlzU2VsZk9yRGVzY2VuZGFudCh0aGlzKTt9O05vZGUucHJvdG90eXBlLndpbmRvdz1mdW5jdGlvbigpe3JldHVybih0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO307RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXtpZih0aGlzLmZpcnN0Q2hpbGQpCnRoaXMudGV4dENvbnRlbnQ9Jyc7fTtmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZ05hbWUsY3VzdG9tRWxlbWVudFR5cGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUsY3VzdG9tRWxlbWVudFR5cGV8fCcnKTt9CmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKGRhdGEpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTt9CkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50V2l0aENsYXNzPWZ1bmN0aW9uKGVsZW1lbnROYW1lLGNsYXNzTmFtZSxjdXN0b21FbGVtZW50VHlwZSl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUsY3VzdG9tRWxlbWVudFR5cGV8fCcnKTtpZihjbGFzc05hbWUpCmVsZW1lbnQuY2xhc3NOYW1lPWNsYXNzTmFtZTtyZXR1cm4gZWxlbWVudDt9O2Z1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoZWxlbWVudE5hbWUsY2xhc3NOYW1lLGN1c3RvbUVsZW1lbnRUeXBlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudFdpdGhDbGFzcyhlbGVtZW50TmFtZSxjbGFzc05hbWUsY3VzdG9tRWxlbWVudFR5cGUpO30KRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR0VsZW1lbnQ9ZnVuY3Rpb24oY2hpbGRUeXBlLGNsYXNzTmFtZSl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLGNoaWxkVHlwZSk7aWYoY2xhc3NOYW1lKQplbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLGNsYXNzTmFtZSk7cmV0dXJuIGVsZW1lbnQ7fTtmdW5jdGlvbiBjcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpO30KZnVuY3Rpb24gY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7fQpFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVDaGlsZD1mdW5jdGlvbihlbGVtZW50TmFtZSxjbGFzc05hbWUsY3VzdG9tRWxlbWVudFR5cGUpe2NvbnN0IGVsZW1lbnQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoZWxlbWVudE5hbWUsY2xhc3NOYW1lLGN1c3RvbUVsZW1lbnRUeXBlKTt0aGlzLmFwcGVuZENoaWxkKGVsZW1lbnQpO3JldHVybiBlbGVtZW50O307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuY3JlYXRlQ2hpbGQ9RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlQ2hpbGQ7RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkPWZ1bmN0aW9uKHRleHQpe2NvbnN0IGVsZW1lbnQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO3RoaXMuYXBwZW5kQ2hpbGQoZWxlbWVudCk7cmV0dXJuIGVsZW1lbnQ7fTtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5jcmVhdGVUZXh0Q2hpbGQ9RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkO0VsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVRleHRDaGlsZHJlbj1mdW5jdGlvbih2YXJfYXJncyl7Zm9yKGxldCBpPTAsbj1hcmd1bWVudHMubGVuZ3RoO2k8bjsrK2kpCnRoaXMuY3JlYXRlVGV4dENoaWxkKGFyZ3VtZW50c1tpXSk7fTtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5jcmVhdGVUZXh0Q2hpbGRyZW49RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkcmVuO0VsZW1lbnQucHJvdG90eXBlLnRvdGFsT2Zmc2V0TGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvdGFsT2Zmc2V0KCkubGVmdDt9O0VsZW1lbnQucHJvdG90eXBlLnRvdGFsT2Zmc2V0VG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG90YWxPZmZzZXQoKS50b3A7fTtFbGVtZW50LnByb3RvdHlwZS50b3RhbE9mZnNldD1mdW5jdGlvbigpe2NvbnN0IHJlY3Q9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDpyZWN0LmxlZnQsdG9wOnJlY3QudG9wfTt9O0VsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR0NoaWxkPWZ1bmN0aW9uKGNoaWxkVHlwZSxjbGFzc05hbWUpe2NvbnN0IGNoaWxkPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpO3RoaXMuYXBwZW5kQ2hpbGQoY2hpbGQpO3JldHVybiBjaGlsZDt9O3ZhciBBbmNob3JCb3g9Y2xhc3N7Y29uc3RydWN0b3IoeCx5LHdpZHRoLGhlaWdodCl7dGhpcy54PXh8fDA7dGhpcy55PXl8fDA7dGhpcy53aWR0aD13aWR0aHx8MDt0aGlzLmhlaWdodD1oZWlnaHR8fDA7fQpjb250YWlucyh4LHkpe3JldHVybiB4Pj10aGlzLngmJng8PXRoaXMueCt0aGlzLndpZHRoJiZ5Pj10aGlzLnkmJnk8PXRoaXMueSt0aGlzLmhlaWdodDt9fTtBbmNob3JCb3gucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oYm94KXtyZXR1cm4gbmV3IEFuY2hvckJveCh0aGlzLngtYm94LngsdGhpcy55LWJveC55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO307QW5jaG9yQm94LnByb3RvdHlwZS5yZWxhdGl2ZVRvRWxlbWVudD1mdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gdGhpcy5yZWxhdGl2ZVRvKGVsZW1lbnQuYm94SW5XaW5kb3coZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSk7fTtBbmNob3JCb3gucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihhbmNob3JCb3gpe3JldHVybiEhYW5jaG9yQm94JiZ0aGlzLng9PT1hbmNob3JCb3gueCYmdGhpcy55PT09YW5jaG9yQm94LnkmJnRoaXMud2lkdGg9PT1hbmNob3JCb3gud2lkdGgmJnRoaXMuaGVpZ2h0PT09YW5jaG9yQm94LmhlaWdodDt9O0VsZW1lbnQucHJvdG90eXBlLmJveEluV2luZG93PWZ1bmN0aW9uKHRhcmdldFdpbmRvdyl7dGFyZ2V0V2luZG93PXRhcmdldFdpbmRvd3x8dGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O2NvbnN0IGFuY2hvckJveD1uZXcgQW5jaG9yQm94KCk7bGV0IGN1ckVsZW1lbnQ9dGhpcztsZXQgY3VyV2luZG93PXRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldzt3aGlsZShjdXJXaW5kb3cmJmN1ckVsZW1lbnQpe2FuY2hvckJveC54Kz1jdXJFbGVtZW50LnRvdGFsT2Zmc2V0TGVmdCgpO2FuY2hvckJveC55Kz1jdXJFbGVtZW50LnRvdGFsT2Zmc2V0VG9wKCk7aWYoY3VyV2luZG93PT09dGFyZ2V0V2luZG93KQpicmVhaztjdXJFbGVtZW50PWN1cldpbmRvdy5mcmFtZUVsZW1lbnQ7Y3VyV2luZG93PWN1cldpbmRvdy5wYXJlbnQ7fQphbmNob3JCb3gud2lkdGg9TWF0aC5taW4odGhpcy5vZmZzZXRXaWR0aCx0YXJnZXRXaW5kb3cuaW5uZXJXaWR0aC1hbmNob3JCb3gueCk7YW5jaG9yQm94LmhlaWdodD1NYXRoLm1pbih0aGlzLm9mZnNldEhlaWdodCx0YXJnZXRXaW5kb3cuaW5uZXJIZWlnaHQtYW5jaG9yQm94LnkpO3JldHVybiBhbmNob3JCb3g7fTtFdmVudC5wcm90b3R5cGUuY29uc3VtZT1mdW5jdGlvbihwcmV2ZW50RGVmYXVsdCl7dGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtpZihwcmV2ZW50RGVmYXVsdCkKdGhpcy5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGFuZGxlZD10cnVlO307VGV4dC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9c3RhcnR8fDA7ZW5kPWVuZHx8dGhpcy50ZXh0Q29udGVudC5sZW5ndGg7aWYoc3RhcnQ8MCkKc3RhcnQ9ZW5kK3N0YXJ0O2NvbnN0IHNlbGVjdGlvbj10aGlzLmdldENvbXBvbmVudFNlbGVjdGlvbigpO3NlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtjb25zdCByYW5nZT10aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtyYW5nZS5zZXRTdGFydCh0aGlzLHN0YXJ0KTtyYW5nZS5zZXRFbmQodGhpcyxlbmQpO3NlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7cmV0dXJuIHRoaXM7fTtFbGVtZW50LnByb3RvdHlwZS5zZWxlY3Rpb25MZWZ0T2Zmc2V0PWZ1bmN0aW9uKCl7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7aWYoIXNlbGVjdGlvbi5jb250YWluc05vZGUodGhpcyx0cnVlKSkKcmV0dXJuIG51bGw7bGV0IGxlZnRPZmZzZXQ9c2VsZWN0aW9uLmFuY2hvck9mZnNldDtsZXQgbm9kZT1zZWxlY3Rpb24uYW5jaG9yTm9kZTt3aGlsZShub2RlIT09dGhpcyl7d2hpbGUobm9kZS5wcmV2aW91c1NpYmxpbmcpe25vZGU9bm9kZS5wcmV2aW91c1NpYmxpbmc7bGVmdE9mZnNldCs9bm9kZS50ZXh0Q29udGVudC5sZW5ndGg7fQpub2RlPW5vZGUucGFyZW50Tm9kZU9yU2hhZG93SG9zdCgpO30KcmV0dXJuIGxlZnRPZmZzZXQ7fTtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZHJlbj1mdW5jdGlvbih2YXJfYXJncyl7Zm9yKGxldCBpPTAsbj1hcmd1bWVudHMubGVuZ3RoO2k8bjsrK2kpCnRoaXMuYXBwZW5kQ2hpbGQoYXJndW1lbnRzW2ldKTt9O05vZGUucHJvdG90eXBlLmRlZXBUZXh0Q29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkVGV4dE5vZGVzKCkubWFwKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLnRleHRDb250ZW50O30pLmpvaW4oJycpO307Tm9kZS5wcm90b3R5cGUuY2hpbGRUZXh0Tm9kZXM9ZnVuY3Rpb24oKXtsZXQgbm9kZT10aGlzLnRyYXZlcnNlTmV4dFRleHROb2RlKHRoaXMpO2NvbnN0IHJlc3VsdD1bXTtjb25zdCBub25UZXh0VGFncz17J1NUWUxFJzoxLCdTQ1JJUFQnOjF9O3doaWxlKG5vZGUpe2lmKCFub25UZXh0VGFnc1tub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWVdKQpyZXN1bHQucHVzaChub2RlKTtub2RlPW5vZGUudHJhdmVyc2VOZXh0VGV4dE5vZGUodGhpcyk7fQpyZXR1cm4gcmVzdWx0O307Tm9kZS5wcm90b3R5cGUuaXNBbmNlc3Rvcj1mdW5jdGlvbihub2RlKXtpZighbm9kZSkKcmV0dXJuIGZhbHNlO2xldCBjdXJyZW50Tm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKTt3aGlsZShjdXJyZW50Tm9kZSl7aWYodGhpcz09PWN1cnJlbnROb2RlKQpyZXR1cm4gdHJ1ZTtjdXJyZW50Tm9kZT1jdXJyZW50Tm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fQpyZXR1cm4gZmFsc2U7fTtOb2RlLnByb3RvdHlwZS5pc0Rlc2NlbmRhbnQ9ZnVuY3Rpb24oZGVzY2VuZGFudCl7cmV0dXJuISFkZXNjZW5kYW50JiZkZXNjZW5kYW50LmlzQW5jZXN0b3IodGhpcyk7fTtOb2RlLnByb3RvdHlwZS5pc1NlbGZPckFuY2VzdG9yPWZ1bmN0aW9uKG5vZGUpe3JldHVybiEhbm9kZSYmKG5vZGU9PT10aGlzfHx0aGlzLmlzQW5jZXN0b3Iobm9kZSkpO307Tm9kZS5wcm90b3R5cGUuaXNTZWxmT3JEZXNjZW5kYW50PWZ1bmN0aW9uKG5vZGUpe3JldHVybiEhbm9kZSYmKG5vZGU9PT10aGlzfHx0aGlzLmlzRGVzY2VuZGFudChub2RlKSk7fTtOb2RlLnByb3RvdHlwZS50cmF2ZXJzZU5leHROb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2lmKHRoaXMuc2hhZG93Um9vdCkKcmV0dXJuIHRoaXMuc2hhZG93Um9vdDtjb25zdCBkaXN0cmlidXRlZE5vZGVzPXRoaXMuZ2V0RGlzdHJpYnV0ZWROb2Rlcz90aGlzLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpbXTtpZihkaXN0cmlidXRlZE5vZGVzLmxlbmd0aCkKcmV0dXJuIGRpc3RyaWJ1dGVkTm9kZXNbMF07aWYodGhpcy5maXJzdENoaWxkKQpyZXR1cm4gdGhpcy5maXJzdENoaWxkO2xldCBub2RlPXRoaXM7d2hpbGUobm9kZSl7aWYoc3RheVdpdGhpbiYmbm9kZT09PXN0YXlXaXRoaW4pCnJldHVybiBudWxsO2NvbnN0IHNpYmxpbmc9bmV4dFNpYmxpbmcobm9kZSk7aWYoc2libGluZykKcmV0dXJuIHNpYmxpbmc7bm9kZT1pbnNlcnRpb25Qb2ludChub2RlKXx8bm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fQpmdW5jdGlvbiBuZXh0U2libGluZyhub2RlKXtjb25zdCBwYXJlbnQ9aW5zZXJ0aW9uUG9pbnQobm9kZSk7aWYoIXBhcmVudCkKcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7Y29uc3QgZGlzdHJpYnV0ZWROb2Rlcz1wYXJlbnQuZ2V0RGlzdHJpYnV0ZWROb2Rlcz9wYXJlbnQuZ2V0RGlzdHJpYnV0ZWROb2RlcygpOltdO2NvbnN0IHBvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZGlzdHJpYnV0ZWROb2Rlcyxub2RlKTtpZihwb3NpdGlvbisxPGRpc3RyaWJ1dGVkTm9kZXMubGVuZ3RoKQpyZXR1cm4gZGlzdHJpYnV0ZWROb2Rlc1twb3NpdGlvbisxXTtyZXR1cm4gbnVsbDt9CmZ1bmN0aW9uIGluc2VydGlvblBvaW50KG5vZGUpe2NvbnN0IGluc2VydGlvblBvaW50cz1ub2RlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzP25vZGUuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKTpbXTtyZXR1cm4gaW5zZXJ0aW9uUG9pbnRzLmxlbmd0aD4wP2luc2VydGlvblBvaW50c1tpbnNlcnRpb25Qb2ludHMubGVuZ3RoLTFdOm51bGw7fQpyZXR1cm4gbnVsbDt9O05vZGUucHJvdG90eXBlLnRyYXZlcnNlUHJldmlvdXNOb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2lmKHN0YXlXaXRoaW4mJnRoaXM9PT1zdGF5V2l0aGluKQpyZXR1cm4gbnVsbDtsZXQgbm9kZT10aGlzLnByZXZpb3VzU2libGluZzt3aGlsZShub2RlJiZub2RlLmxhc3RDaGlsZCkKbm9kZT1ub2RlLmxhc3RDaGlsZDtpZihub2RlKQpyZXR1cm4gbm9kZTtyZXR1cm4gdGhpcy5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fTtOb2RlLnByb3RvdHlwZS5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkPWZ1bmN0aW9uKHRleHQscGxhY2Vob2xkZXIpe2NvbnN0IG1heFRleHRDb250ZW50TGVuZ3RoPTEwMDAwO2lmKHR5cGVvZiB0ZXh0PT09J3N0cmluZycmJnRleHQubGVuZ3RoPm1heFRleHRDb250ZW50TGVuZ3RoKXt0aGlzLnRleHRDb250ZW50PXR5cGVvZiBwbGFjZWhvbGRlcj09PSdzdHJpbmcnP3BsYWNlaG9sZGVyOnRleHQudHJpbU1pZGRsZShtYXhUZXh0Q29udGVudExlbmd0aCk7cmV0dXJuIHRydWU7fQp0aGlzLnRleHRDb250ZW50PXRleHQ7cmV0dXJuIGZhbHNlO307RXZlbnQucHJvdG90eXBlLmRlZXBFbGVtZW50RnJvbVBvaW50PWZ1bmN0aW9uKCl7aWYoIXRoaXMud2hpY2gmJiF0aGlzLnBhZ2VYJiYhdGhpcy5wYWdlWSYmIXRoaXMuY2xpZW50WCYmIXRoaXMuY2xpZW50WSYmIXRoaXMubW92ZW1lbnRYJiYhdGhpcy5tb3ZlbWVudFkpCnJldHVybiBudWxsO2NvbnN0IHJvb3Q9dGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LmdldENvbXBvbmVudFJvb3QoKTtyZXR1cm4gcm9vdD9yb290LmRlZXBFbGVtZW50RnJvbVBvaW50KHRoaXMucGFnZVgsdGhpcy5wYWdlWSk6bnVsbDt9O0RvY3VtZW50LnByb3RvdHlwZS5kZWVwRWxlbWVudEZyb21Qb2ludD1mdW5jdGlvbih4LHkpe2xldCBjb250YWluZXI9dGhpcztsZXQgbm9kZT1udWxsO3doaWxlKGNvbnRhaW5lcil7Y29uc3QgaW5uZXJOb2RlPWNvbnRhaW5lci5lbGVtZW50RnJvbVBvaW50KHgseSk7aWYoIWlubmVyTm9kZXx8bm9kZT09PWlubmVyTm9kZSkKYnJlYWs7bm9kZT1pbm5lck5vZGU7Y29udGFpbmVyPW5vZGUuc2hhZG93Um9vdDt9CnJldHVybiBub2RlO307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuZGVlcEVsZW1lbnRGcm9tUG9pbnQ9RG9jdW1lbnQucHJvdG90eXBlLmRlZXBFbGVtZW50RnJvbVBvaW50O0RvY3VtZW50LnByb3RvdHlwZS5kZWVwQWN0aXZlRWxlbWVudD1mdW5jdGlvbigpe2xldCBhY3RpdmVFbGVtZW50PXRoaXMuYWN0aXZlRWxlbWVudDt3aGlsZShhY3RpdmVFbGVtZW50JiZhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QmJmFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KQphY3RpdmVFbGVtZW50PWFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBhY3RpdmVFbGVtZW50O307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuZGVlcEFjdGl2ZUVsZW1lbnQ9RG9jdW1lbnQucHJvdG90eXBlLmRlZXBBY3RpdmVFbGVtZW50O0VsZW1lbnQucHJvdG90eXBlLmhhc0ZvY3VzPWZ1bmN0aW9uKCl7Y29uc3Qgcm9vdD10aGlzLmdldENvbXBvbmVudFJvb3QoKTtyZXR1cm4hIXJvb3QmJnRoaXMuaXNTZWxmT3JBbmNlc3Rvcihyb290LmFjdGl2ZUVsZW1lbnQpO307Tm9kZS5wcm90b3R5cGUuZ2V0Q29tcG9uZW50Um9vdD1mdW5jdGlvbigpe2xldCBub2RlPXRoaXM7d2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmbm9kZS5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfTk9ERSkKbm9kZT1ub2RlLnBhcmVudE5vZGU7cmV0dXJuKG5vZGUpO307ZnVuY3Rpb24gaXNFbnRlcktleShldmVudCl7cmV0dXJuIGV2ZW50LmtleUNvZGUhPT0yMjkmJmV2ZW50LmtleT09PSdFbnRlcic7fQpmdW5jdGlvbiBpc0VzY0tleShldmVudCl7cmV0dXJuIGV2ZW50LmtleUNvZGU9PT0yNzt9O3NlbGZbJ1RleHRVdGlscyddPXNlbGZbJ1RleHRVdGlscyddfHx7fTtUZXh0VXRpbHMuVGV4dD1jbGFzc3tjb25zdHJ1Y3Rvcih2YWx1ZSl7dGhpcy5fdmFsdWU9dmFsdWU7fQpsaW5lRW5kaW5ncygpe2lmKCF0aGlzLl9saW5lRW5kaW5ncykKdGhpcy5fbGluZUVuZGluZ3M9dGhpcy5fdmFsdWUuY29tcHV0ZUxpbmVFbmRpbmdzKCk7cmV0dXJuIHRoaXMuX2xpbmVFbmRpbmdzO30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWU7fQpsaW5lQ291bnQoKXtjb25zdCBsaW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzKCk7cmV0dXJuIGxpbmVFbmRpbmdzLmxlbmd0aDt9Cm9mZnNldEZyb21Qb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7cmV0dXJuKGxpbmVOdW1iZXI/dGhpcy5saW5lRW5kaW5ncygpW2xpbmVOdW1iZXItMV0rMTowKStjb2x1bW5OdW1iZXI7fQpwb3NpdGlvbkZyb21PZmZzZXQob2Zmc2V0KXtjb25zdCBsaW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzKCk7Y29uc3QgbGluZU51bWJlcj1saW5lRW5kaW5ncy5sb3dlckJvdW5kKG9mZnNldCk7cmV0dXJue2xpbmVOdW1iZXI6bGluZU51bWJlcixjb2x1bW5OdW1iZXI6b2Zmc2V0LShsaW5lTnVtYmVyJiYobGluZUVuZGluZ3NbbGluZU51bWJlci0xXSsxKSl9O30KbGluZUF0KGxpbmVOdW1iZXIpe2NvbnN0IGxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MoKTtjb25zdCBsaW5lU3RhcnQ9bGluZU51bWJlcj4wP2xpbmVFbmRpbmdzW2xpbmVOdW1iZXItMV0rMTowO2NvbnN0IGxpbmVFbmQ9bGluZUVuZGluZ3NbbGluZU51bWJlcl07bGV0IGxpbmVDb250ZW50PXRoaXMuX3ZhbHVlLnN1YnN0cmluZyhsaW5lU3RhcnQsbGluZUVuZCk7aWYobGluZUNvbnRlbnQubGVuZ3RoPjAmJmxpbmVDb250ZW50LmNoYXJBdChsaW5lQ29udGVudC5sZW5ndGgtMSk9PT0nXHInKQpsaW5lQ29udGVudD1saW5lQ29udGVudC5zdWJzdHJpbmcoMCxsaW5lQ29udGVudC5sZW5ndGgtMSk7cmV0dXJuIGxpbmVDb250ZW50O30KdG9Tb3VyY2VSYW5nZShyYW5nZSl7Y29uc3Qgc3RhcnQ9dGhpcy5vZmZzZXRGcm9tUG9zaXRpb24ocmFuZ2Uuc3RhcnRMaW5lLHJhbmdlLnN0YXJ0Q29sdW1uKTtjb25zdCBlbmQ9dGhpcy5vZmZzZXRGcm9tUG9zaXRpb24ocmFuZ2UuZW5kTGluZSxyYW5nZS5lbmRDb2x1bW4pO3JldHVybiBuZXcgVGV4dFV0aWxzLlNvdXJjZVJhbmdlKHN0YXJ0LGVuZC1zdGFydCk7fQp0b1RleHRSYW5nZShzb3VyY2VSYW5nZSl7Y29uc3QgY3Vyc29yPW5ldyBUZXh0VXRpbHMuVGV4dEN1cnNvcih0aGlzLmxpbmVFbmRpbmdzKCkpO2NvbnN0IHJlc3VsdD1UZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbigwLDApO2N1cnNvci5yZXNldFRvKHNvdXJjZVJhbmdlLm9mZnNldCk7cmVzdWx0LnN0YXJ0TGluZT1jdXJzb3IubGluZU51bWJlcigpO3Jlc3VsdC5zdGFydENvbHVtbj1jdXJzb3IuY29sdW1uTnVtYmVyKCk7Y3Vyc29yLmFkdmFuY2Uoc291cmNlUmFuZ2Uub2Zmc2V0K3NvdXJjZVJhbmdlLmxlbmd0aCk7cmVzdWx0LmVuZExpbmU9Y3Vyc29yLmxpbmVOdW1iZXIoKTtyZXN1bHQuZW5kQ29sdW1uPWN1cnNvci5jb2x1bW5OdW1iZXIoKTtyZXR1cm4gcmVzdWx0O30KcmVwbGFjZVJhbmdlKHJhbmdlLHJlcGxhY2VtZW50KXtjb25zdCBzb3VyY2VSYW5nZT10aGlzLnRvU291cmNlUmFuZ2UocmFuZ2UpO3JldHVybiB0aGlzLl92YWx1ZS5zdWJzdHJpbmcoMCxzb3VyY2VSYW5nZS5vZmZzZXQpK3JlcGxhY2VtZW50Kwp0aGlzLl92YWx1ZS5zdWJzdHJpbmcoc291cmNlUmFuZ2Uub2Zmc2V0K3NvdXJjZVJhbmdlLmxlbmd0aCk7fQpleHRyYWN0KHJhbmdlKXtjb25zdCBzb3VyY2VSYW5nZT10aGlzLnRvU291cmNlUmFuZ2UocmFuZ2UpO3JldHVybiB0aGlzLl92YWx1ZS5zdWJzdHIoc291cmNlUmFuZ2Uub2Zmc2V0LHNvdXJjZVJhbmdlLmxlbmd0aCk7fX07VGV4dFV0aWxzLlRleHQuUG9zaXRpb247VGV4dFV0aWxzLlRleHRDdXJzb3I9Y2xhc3N7Y29uc3RydWN0b3IobGluZUVuZGluZ3Mpe3RoaXMuX2xpbmVFbmRpbmdzPWxpbmVFbmRpbmdzO3RoaXMuX29mZnNldD0wO3RoaXMuX2xpbmVOdW1iZXI9MDt0aGlzLl9jb2x1bW5OdW1iZXI9MDt9CmFkdmFuY2Uob2Zmc2V0KXt0aGlzLl9vZmZzZXQ9b2Zmc2V0O3doaWxlKHRoaXMuX2xpbmVOdW1iZXI8dGhpcy5fbGluZUVuZGluZ3MubGVuZ3RoJiZ0aGlzLl9saW5lRW5kaW5nc1t0aGlzLl9saW5lTnVtYmVyXTx0aGlzLl9vZmZzZXQpCisrdGhpcy5fbGluZU51bWJlcjt0aGlzLl9jb2x1bW5OdW1iZXI9dGhpcy5fbGluZU51bWJlcj90aGlzLl9vZmZzZXQtdGhpcy5fbGluZUVuZGluZ3NbdGhpcy5fbGluZU51bWJlci0xXS0xOnRoaXMuX29mZnNldDt9Cm9mZnNldCgpe3JldHVybiB0aGlzLl9vZmZzZXQ7fQpyZXNldFRvKG9mZnNldCl7dGhpcy5fb2Zmc2V0PW9mZnNldDt0aGlzLl9saW5lTnVtYmVyPXRoaXMuX2xpbmVFbmRpbmdzLmxvd2VyQm91bmQob2Zmc2V0KTt0aGlzLl9jb2x1bW5OdW1iZXI9dGhpcy5fbGluZU51bWJlcj90aGlzLl9vZmZzZXQtdGhpcy5fbGluZUVuZGluZ3NbdGhpcy5fbGluZU51bWJlci0xXS0xOnRoaXMuX29mZnNldDt9CmxpbmVOdW1iZXIoKXtyZXR1cm4gdGhpcy5fbGluZU51bWJlcjt9CmNvbHVtbk51bWJlcigpe3JldHVybiB0aGlzLl9jb2x1bW5OdW1iZXI7fX07O1RleHRVdGlscy5UZXh0VXRpbHM9e2lzU3RvcENoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuKGNoYXI+JyAnJiZjaGFyPCcwJyl8fChjaGFyPic5JyYmY2hhcjwnQScpfHwoY2hhcj4nWicmJmNoYXI8J18nKXx8KGNoYXI+J18nJiZjaGFyPCdhJyl8fChjaGFyPid6JyYmY2hhcjw9J34nKTt9LGlzV29yZENoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuIVRleHRVdGlscy5UZXh0VXRpbHMuaXNTdG9wQ2hhcihjaGFyKSYmIVRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIoY2hhcik7fSxpc1NwYWNlQ2hhcjpmdW5jdGlvbihjaGFyKXtyZXR1cm4gVGV4dFV0aWxzLlRleHRVdGlscy5fU3BhY2VDaGFyUmVnZXgudGVzdChjaGFyKTt9LGlzV29yZDpmdW5jdGlvbih3b3JkKXtmb3IobGV0IGk9MDtpPHdvcmQubGVuZ3RoOysraSl7aWYoIVRleHRVdGlscy5UZXh0VXRpbHMuaXNXb3JkQ2hhcih3b3JkLmNoYXJBdChpKSkpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30saXNPcGVuaW5nQnJhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiBjaGFyPT09JygnfHxjaGFyPT09J3snO30saXNDbG9zaW5nQnJhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpe3JldHVybiBjaGFyPT09JyknfHxjaGFyPT09J30nO30saXNCcmFjZUNoYXI6ZnVuY3Rpb24oY2hhcil7cmV0dXJuIFRleHRVdGlscy5UZXh0VXRpbHMuaXNPcGVuaW5nQnJhY2VDaGFyKGNoYXIpfHxUZXh0VXRpbHMuVGV4dFV0aWxzLmlzQ2xvc2luZ0JyYWNlQ2hhcihjaGFyKTt9LHRleHRUb1dvcmRzOmZ1bmN0aW9uKHRleHQsaXNXb3JkQ2hhcix3b3JkQ2FsbGJhY2spe2xldCBzdGFydFdvcmQ9LTE7Zm9yKGxldCBpPTA7aTx0ZXh0Lmxlbmd0aDsrK2kpe2lmKCFpc1dvcmRDaGFyKHRleHQuY2hhckF0KGkpKSl7aWYoc3RhcnRXb3JkIT09LTEpCndvcmRDYWxsYmFjayh0ZXh0LnN1YnN0cmluZyhzdGFydFdvcmQsaSkpO3N0YXJ0V29yZD0tMTt9ZWxzZSBpZihzdGFydFdvcmQ9PT0tMSl7c3RhcnRXb3JkPWk7fX0KaWYoc3RhcnRXb3JkIT09LTEpCndvcmRDYWxsYmFjayh0ZXh0LnN1YnN0cmluZyhzdGFydFdvcmQpKTt9LGxpbmVJbmRlbnQ6ZnVuY3Rpb24obGluZSl7bGV0IGluZGVudGF0aW9uPTA7d2hpbGUoaW5kZW50YXRpb248bGluZS5sZW5ndGgmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIobGluZS5jaGFyQXQoaW5kZW50YXRpb24pKSkKKytpbmRlbnRhdGlvbjtyZXR1cm4gbGluZS5zdWJzdHIoMCxpbmRlbnRhdGlvbik7fSxpc1VwcGVyQ2FzZTpmdW5jdGlvbih0ZXh0KXtyZXR1cm4gdGV4dD09PXRleHQudG9VcHBlckNhc2UoKTt9LGlzTG93ZXJDYXNlOmZ1bmN0aW9uKHRleHQpe3JldHVybiB0ZXh0PT09dGV4dC50b0xvd2VyQ2FzZSgpO30sc3BsaXRTdHJpbmdCeVJlZ2V4ZXModGV4dCxyZWdleGVzKXtjb25zdCBtYXRjaGVzPVtdO2NvbnN0IGdsb2JhbFJlZ2V4ZXM9W107Zm9yKGxldCBpPTA7aTxyZWdleGVzLmxlbmd0aDtpKyspe2NvbnN0IHJlZ2V4PXJlZ2V4ZXNbaV07aWYoIXJlZ2V4Lmdsb2JhbCkKZ2xvYmFsUmVnZXhlcy5wdXNoKG5ldyBSZWdFeHAocmVnZXguc291cmNlLHJlZ2V4LmZsYWdzP3JlZ2V4LmZsYWdzKydnJzonZycpKTtlbHNlCmdsb2JhbFJlZ2V4ZXMucHVzaChyZWdleCk7fQpkb1NwbGl0KHRleHQsMCwwKTtyZXR1cm4gbWF0Y2hlcztmdW5jdGlvbiBkb1NwbGl0KHRleHQscmVnZXhJbmRleCxzdGFydEluZGV4KXtpZihyZWdleEluZGV4Pj1nbG9iYWxSZWdleGVzLmxlbmd0aCl7bWF0Y2hlcy5wdXNoKHt2YWx1ZTp0ZXh0LHBvc2l0aW9uOnN0YXJ0SW5kZXgscmVnZXhJbmRleDotMSxjYXB0dXJlR3JvdXBzOltdfSk7cmV0dXJuO30KY29uc3QgcmVnZXg9Z2xvYmFsUmVnZXhlc1tyZWdleEluZGV4XTtsZXQgY3VycmVudEluZGV4PTA7bGV0IHJlc3VsdDtyZWdleC5sYXN0SW5kZXg9MDt3aGlsZSgocmVzdWx0PXJlZ2V4LmV4ZWModGV4dCkpIT09bnVsbCl7Y29uc3Qgc3RyaW5nQmVmb3JlTWF0Y2g9dGV4dC5zdWJzdHJpbmcoY3VycmVudEluZGV4LHJlc3VsdC5pbmRleCk7aWYoc3RyaW5nQmVmb3JlTWF0Y2gpCmRvU3BsaXQoc3RyaW5nQmVmb3JlTWF0Y2gscmVnZXhJbmRleCsxLHN0YXJ0SW5kZXgrY3VycmVudEluZGV4KTtjb25zdCBtYXRjaD1yZXN1bHRbMF07bWF0Y2hlcy5wdXNoKHt2YWx1ZTptYXRjaCxwb3NpdGlvbjpzdGFydEluZGV4K3Jlc3VsdC5pbmRleCxyZWdleEluZGV4OnJlZ2V4SW5kZXgsY2FwdHVyZUdyb3VwczpyZXN1bHQuc2xpY2UoMSl9KTtjdXJyZW50SW5kZXg9cmVzdWx0LmluZGV4K21hdGNoLmxlbmd0aDt9CmNvbnN0IHN0cmluZ0FmdGVyTWF0Y2hlcz10ZXh0LnN1YnN0cmluZyhjdXJyZW50SW5kZXgpO2lmKHN0cmluZ0FmdGVyTWF0Y2hlcykKZG9TcGxpdChzdHJpbmdBZnRlck1hdGNoZXMscmVnZXhJbmRleCsxLHN0YXJ0SW5kZXgrY3VycmVudEluZGV4KTt9fX07VGV4dFV0aWxzLkZpbHRlclBhcnNlcj1jbGFzc3tjb25zdHJ1Y3RvcihrZXlzKXt0aGlzLl9rZXlzPWtleXM7fQpzdGF0aWMgY2xvbmVGaWx0ZXIoZmlsdGVyKXtyZXR1cm57a2V5OmZpbHRlci5rZXksdGV4dDpmaWx0ZXIudGV4dCxyZWdleDpmaWx0ZXIucmVnZXgsbmVnYXRpdmU6ZmlsdGVyLm5lZ2F0aXZlfTt9CnBhcnNlKHF1ZXJ5KXtjb25zdCBzcGxpdFJlc3VsdD1UZXh0VXRpbHMuVGV4dFV0aWxzLnNwbGl0U3RyaW5nQnlSZWdleGVzKHF1ZXJ5LFtUZXh0VXRpbHMuVGV4dFV0aWxzLl9rZXlWYWx1ZUZpbHRlclJlZ2V4LFRleHRVdGlscy5UZXh0VXRpbHMuX3JlZ2V4RmlsdGVyUmVnZXgsVGV4dFV0aWxzLlRleHRVdGlscy5fdGV4dEZpbHRlclJlZ2V4XSk7Y29uc3QgZmlsdGVycz1bXTtmb3IobGV0IGk9MDtpPHNwbGl0UmVzdWx0Lmxlbmd0aDtpKyspe2NvbnN0IHJlZ2V4SW5kZXg9c3BsaXRSZXN1bHRbaV0ucmVnZXhJbmRleDtpZihyZWdleEluZGV4PT09LTEpCmNvbnRpbnVlO2NvbnN0IHJlc3VsdD1zcGxpdFJlc3VsdFtpXS5jYXB0dXJlR3JvdXBzO2lmKHJlZ2V4SW5kZXg9PT0wKXtpZih0aGlzLl9rZXlzLmluZGV4T2YoKHJlc3VsdFsxXSkpIT09LTEpCmZpbHRlcnMucHVzaCh7a2V5OnJlc3VsdFsxXSx0ZXh0OnJlc3VsdFsyXSxuZWdhdGl2ZTohIXJlc3VsdFswXX0pO2Vsc2UKZmlsdGVycy5wdXNoKHt0ZXh0OnJlc3VsdFsxXSsnOicrcmVzdWx0WzJdLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fWVsc2UgaWYocmVnZXhJbmRleD09PTEpe3RyeXtmaWx0ZXJzLnB1c2goe3JlZ2V4Om5ldyBSZWdFeHAocmVzdWx0WzFdLCdpJyksbmVnYXRpdmU6ISFyZXN1bHRbMF19KTt9Y2F0Y2goZSl7ZmlsdGVycy5wdXNoKHt0ZXh0OicvJytyZXN1bHRbMV0rJy8nLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fX1lbHNlIGlmKHJlZ2V4SW5kZXg9PT0yKXtmaWx0ZXJzLnB1c2goe3RleHQ6cmVzdWx0WzFdLG5lZ2F0aXZlOiEhcmVzdWx0WzBdfSk7fX0KcmV0dXJuIGZpbHRlcnM7fX07VGV4dFV0aWxzLkZpbHRlclBhcnNlci5QYXJzZWRGaWx0ZXI7VGV4dFV0aWxzLlRleHRVdGlscy5fa2V5VmFsdWVGaWx0ZXJSZWdleD0vKD86XnxccykoXC0pPyhbXHdcLV0rKTooW15cc10rKS87VGV4dFV0aWxzLlRleHRVdGlscy5fcmVnZXhGaWx0ZXJSZWdleD0vKD86XnxccykoXC0pP1wvKFteXHNdKylcLy87VGV4dFV0aWxzLlRleHRVdGlscy5fdGV4dEZpbHRlclJlZ2V4PS8oPzpefFxzKShcLSk/KFteXHNdKykvO1RleHRVdGlscy5UZXh0VXRpbHMuX1NwYWNlQ2hhclJlZ2V4PS9ccy87VGV4dFV0aWxzLlRleHRVdGlscy5JbmRlbnQ9e1R3b1NwYWNlczonICAnLEZvdXJTcGFjZXM6JyAgICAnLEVpZ2h0U3BhY2VzOicgICAgICAgICcsVGFiQ2hhcmFjdGVyOidcdCd9O1RleHRVdGlscy5UZXh0VXRpbHMuQmFsYW5jZWRKU09OVG9rZW5pemVyPWNsYXNze2NvbnN0cnVjdG9yKGNhbGxiYWNrLGZpbmRNdWx0aXBsZSl7dGhpcy5fY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5faW5kZXg9MDt0aGlzLl9iYWxhbmNlPTA7dGhpcy5fYnVmZmVyPScnO3RoaXMuX2ZpbmRNdWx0aXBsZT1maW5kTXVsdGlwbGV8fGZhbHNlO3RoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4PS9bXlxcXSg/OlxcXFwpKiIvZzt9CndyaXRlKGNodW5rKXt0aGlzLl9idWZmZXIrPWNodW5rO2NvbnN0IGxhc3RJbmRleD10aGlzLl9idWZmZXIubGVuZ3RoO2NvbnN0IGJ1ZmZlcj10aGlzLl9idWZmZXI7bGV0IGluZGV4O2ZvcihpbmRleD10aGlzLl9pbmRleDtpbmRleDxsYXN0SW5kZXg7KytpbmRleCl7Y29uc3QgY2hhcmFjdGVyPWJ1ZmZlcltpbmRleF07aWYoY2hhcmFjdGVyPT09JyInKXt0aGlzLl9jbG9zaW5nRG91YmxlUXVvdGVSZWdleC5sYXN0SW5kZXg9aW5kZXg7aWYoIXRoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4LnRlc3QoYnVmZmVyKSkKYnJlYWs7aW5kZXg9dGhpcy5fY2xvc2luZ0RvdWJsZVF1b3RlUmVnZXgubGFzdEluZGV4LTE7fWVsc2UgaWYoY2hhcmFjdGVyPT09J3snKXsrK3RoaXMuX2JhbGFuY2U7fWVsc2UgaWYoY2hhcmFjdGVyPT09J30nKXstLXRoaXMuX2JhbGFuY2U7aWYodGhpcy5fYmFsYW5jZTwwKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9CmlmKCF0aGlzLl9iYWxhbmNlKXt0aGlzLl9sYXN0QmFsYW5jZWRJbmRleD1pbmRleCsxO2lmKCF0aGlzLl9maW5kTXVsdGlwbGUpCmJyZWFrO319ZWxzZSBpZihjaGFyYWN0ZXI9PT0nXScmJiF0aGlzLl9iYWxhbmNlKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9fQp0aGlzLl9pbmRleD1pbmRleDt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiB0cnVlO30KX3JlcG9ydEJhbGFuY2VkKCl7aWYoIXRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KQpyZXR1cm47dGhpcy5fY2FsbGJhY2sodGhpcy5fYnVmZmVyLnNsaWNlKDAsdGhpcy5fbGFzdEJhbGFuY2VkSW5kZXgpKTt0aGlzLl9idWZmZXI9dGhpcy5fYnVmZmVyLnNsaWNlKHRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KTt0aGlzLl9pbmRleC09dGhpcy5fbGFzdEJhbGFuY2VkSW5kZXg7dGhpcy5fbGFzdEJhbGFuY2VkSW5kZXg9MDt9CnJlbWFpbmRlcigpe3JldHVybiB0aGlzLl9idWZmZXI7fX07VGV4dFV0aWxzLlRva2VuaXplckZhY3Rvcnk9ZnVuY3Rpb24oKXt9O1RleHRVdGlscy5Ub2tlbml6ZXJGYWN0b3J5LnByb3RvdHlwZT17Y3JlYXRlVG9rZW5pemVyKG1pbWVUeXBlKXt9fTtUZXh0VXRpbHMuaXNNaW5pZmllZD1mdW5jdGlvbih0ZXh0KXtjb25zdCBrTWF4Tm9uTWluaWZpZWRMZW5ndGg9NTAwO2xldCBsaW5lc1RvQ2hlY2s9MTA7bGV0IGxhc3RQb3NpdGlvbj0wO2Rve2xldCBlb2xJbmRleD10ZXh0LmluZGV4T2YoJ1xuJyxsYXN0UG9zaXRpb24pO2lmKGVvbEluZGV4PDApCmVvbEluZGV4PXRleHQubGVuZ3RoO2lmKGVvbEluZGV4LWxhc3RQb3NpdGlvbj5rTWF4Tm9uTWluaWZpZWRMZW5ndGgmJnRleHQuc3Vic3RyKGxhc3RQb3NpdGlvbiwzKSE9PScvLyMnKQpyZXR1cm4gdHJ1ZTtsYXN0UG9zaXRpb249ZW9sSW5kZXgrMTt9d2hpbGUoLS1saW5lc1RvQ2hlY2s+PTAmJmxhc3RQb3NpdGlvbjx0ZXh0Lmxlbmd0aCk7bGluZXNUb0NoZWNrPTEwO2xhc3RQb3NpdGlvbj10ZXh0Lmxlbmd0aDtkb3tsZXQgZW9sSW5kZXg9dGV4dC5sYXN0SW5kZXhPZignXG4nLGxhc3RQb3NpdGlvbik7aWYoZW9sSW5kZXg8MCkKZW9sSW5kZXg9MDtpZihsYXN0UG9zaXRpb24tZW9sSW5kZXg+a01heE5vbk1pbmlmaWVkTGVuZ3RoJiZ0ZXh0LnN1YnN0cihsYXN0UG9zaXRpb24sMykhPT0nLy8jJykKcmV0dXJuIHRydWU7bGFzdFBvc2l0aW9uPWVvbEluZGV4LTE7fXdoaWxlKC0tbGluZXNUb0NoZWNrPj0wJiZsYXN0UG9zaXRpb24+MCk7cmV0dXJuIGZhbHNlO307O1RleHRVdGlscy5UZXh0UmFuZ2U9Y2xhc3N7Y29uc3RydWN0b3Ioc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uKXt0aGlzLnN0YXJ0TGluZT1zdGFydExpbmU7dGhpcy5zdGFydENvbHVtbj1zdGFydENvbHVtbjt0aGlzLmVuZExpbmU9ZW5kTGluZTt0aGlzLmVuZENvbHVtbj1lbmRDb2x1bW47fQpzdGF0aWMgY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmUsY29sdW1uKXtyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UobGluZSxjb2x1bW4sbGluZSxjb2x1bW4pO30Kc3RhdGljIGZyb21PYmplY3Qoc2VyaWFsaXplZFRleHRSYW5nZSl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHNlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRMaW5lLHNlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRDb2x1bW4sc2VyaWFsaXplZFRleHRSYW5nZS5lbmRMaW5lLHNlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kQ29sdW1uKTt9CnN0YXRpYyBjb21wYXJhdG9yKHJhbmdlMSxyYW5nZTIpe3JldHVybiByYW5nZTEuY29tcGFyZVRvKHJhbmdlMik7fQpzdGF0aWMgZnJvbUVkaXQob2xkUmFuZ2UsbmV3VGV4dCl7bGV0IGVuZExpbmU9b2xkUmFuZ2Uuc3RhcnRMaW5lO2xldCBlbmRDb2x1bW49b2xkUmFuZ2Uuc3RhcnRDb2x1bW4rbmV3VGV4dC5sZW5ndGg7Y29uc3QgbGluZUVuZGluZ3M9bmV3VGV4dC5jb21wdXRlTGluZUVuZGluZ3MoKTtpZihsaW5lRW5kaW5ncy5sZW5ndGg+MSl7ZW5kTGluZT1vbGRSYW5nZS5zdGFydExpbmUrbGluZUVuZGluZ3MubGVuZ3RoLTE7Y29uc3QgbGVuPWxpbmVFbmRpbmdzLmxlbmd0aDtlbmRDb2x1bW49bGluZUVuZGluZ3NbbGVuLTFdLWxpbmVFbmRpbmdzW2xlbi0yXS0xO30KcmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKG9sZFJhbmdlLnN0YXJ0TGluZSxvbGRSYW5nZS5zdGFydENvbHVtbixlbmRMaW5lLGVuZENvbHVtbik7fQppc0VtcHR5KCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09dGhpcy5lbmRMaW5lJiZ0aGlzLnN0YXJ0Q29sdW1uPT09dGhpcy5lbmRDb2x1bW47fQppbW1lZGlhdGVseVByZWNlZGVzKHJhbmdlKXtpZighcmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gdGhpcy5lbmRMaW5lPT09cmFuZ2Uuc3RhcnRMaW5lJiZ0aGlzLmVuZENvbHVtbj09PXJhbmdlLnN0YXJ0Q29sdW1uO30KaW1tZWRpYXRlbHlGb2xsb3dzKHJhbmdlKXtpZighcmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gcmFuZ2UuaW1tZWRpYXRlbHlQcmVjZWRlcyh0aGlzKTt9CmZvbGxvd3MocmFuZ2Upe3JldHVybihyYW5nZS5lbmRMaW5lPT09dGhpcy5zdGFydExpbmUmJnJhbmdlLmVuZENvbHVtbjw9dGhpcy5zdGFydENvbHVtbil8fHJhbmdlLmVuZExpbmU8dGhpcy5zdGFydExpbmU7fQpnZXQgbGluZXNDb3VudCgpe3JldHVybiB0aGlzLmVuZExpbmUtdGhpcy5zdGFydExpbmU7fQpjb2xsYXBzZVRvRW5kKCl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHRoaXMuZW5kTGluZSx0aGlzLmVuZENvbHVtbix0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4pO30KY29sbGFwc2VUb1N0YXJ0KCl7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4sdGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbik7fQpub3JtYWxpemUoKXtpZih0aGlzLnN0YXJ0TGluZT50aGlzLmVuZExpbmV8fCh0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSYmdGhpcy5zdGFydENvbHVtbj50aGlzLmVuZENvbHVtbikpCnJldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZSh0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4sdGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbik7ZWxzZQpyZXR1cm4gdGhpcy5jbG9uZSgpO30KY2xvbmUoKXtyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UodGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbix0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4pO30Kc2VyaWFsaXplVG9PYmplY3QoKXtjb25zdCBzZXJpYWxpemVkVGV4dFJhbmdlPXt9O3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRMaW5lPXRoaXMuc3RhcnRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRDb2x1bW49dGhpcy5zdGFydENvbHVtbjtzZXJpYWxpemVkVGV4dFJhbmdlLmVuZExpbmU9dGhpcy5lbmRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kQ29sdW1uPXRoaXMuZW5kQ29sdW1uO3JldHVybiBzZXJpYWxpemVkVGV4dFJhbmdlO30KY29tcGFyZVRvKG90aGVyKXtpZih0aGlzLnN0YXJ0TGluZT5vdGhlci5zdGFydExpbmUpCnJldHVybiAxO2lmKHRoaXMuc3RhcnRMaW5lPG90aGVyLnN0YXJ0TGluZSkKcmV0dXJuLTE7aWYodGhpcy5zdGFydENvbHVtbj5vdGhlci5zdGFydENvbHVtbikKcmV0dXJuIDE7aWYodGhpcy5zdGFydENvbHVtbjxvdGhlci5zdGFydENvbHVtbikKcmV0dXJuLTE7cmV0dXJuIDA7fQpjb21wYXJlVG9Qb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYobGluZU51bWJlcjx0aGlzLnN0YXJ0TGluZXx8KGxpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZSYmY29sdW1uTnVtYmVyPHRoaXMuc3RhcnRDb2x1bW4pKQpyZXR1cm4tMTtpZihsaW5lTnVtYmVyPnRoaXMuZW5kTGluZXx8KGxpbmVOdW1iZXI9PT10aGlzLmVuZExpbmUmJmNvbHVtbk51bWJlcj50aGlzLmVuZENvbHVtbikpCnJldHVybiAxO3JldHVybiAwO30KZXF1YWwob3RoZXIpe3JldHVybiB0aGlzLnN0YXJ0TGluZT09PW90aGVyLnN0YXJ0TGluZSYmdGhpcy5lbmRMaW5lPT09b3RoZXIuZW5kTGluZSYmdGhpcy5zdGFydENvbHVtbj09PW90aGVyLnN0YXJ0Q29sdW1uJiZ0aGlzLmVuZENvbHVtbj09PW90aGVyLmVuZENvbHVtbjt9CnJlbGF0aXZlVG8obGluZSxjb2x1bW4pe2NvbnN0IHJlbGF0aXZlPXRoaXMuY2xvbmUoKTtpZih0aGlzLnN0YXJ0TGluZT09PWxpbmUpCnJlbGF0aXZlLnN0YXJ0Q29sdW1uLT1jb2x1bW47aWYodGhpcy5lbmRMaW5lPT09bGluZSkKcmVsYXRpdmUuZW5kQ29sdW1uLT1jb2x1bW47cmVsYXRpdmUuc3RhcnRMaW5lLT1saW5lO3JlbGF0aXZlLmVuZExpbmUtPWxpbmU7cmV0dXJuIHJlbGF0aXZlO30KcmVsYXRpdmVGcm9tKGxpbmUsY29sdW1uKXtjb25zdCByZWxhdGl2ZT10aGlzLmNsb25lKCk7aWYodGhpcy5zdGFydExpbmU9PT0wKQpyZWxhdGl2ZS5zdGFydENvbHVtbis9Y29sdW1uO2lmKHRoaXMuZW5kTGluZT09PTApCnJlbGF0aXZlLmVuZENvbHVtbis9Y29sdW1uO3JlbGF0aXZlLnN0YXJ0TGluZSs9bGluZTtyZWxhdGl2ZS5lbmRMaW5lKz1saW5lO3JldHVybiByZWxhdGl2ZTt9CnJlYmFzZUFmdGVyVGV4dEVkaXQob3JpZ2luYWxSYW5nZSxlZGl0ZWRSYW5nZSl7Y29uc29sZS5hc3NlcnQob3JpZ2luYWxSYW5nZS5zdGFydExpbmU9PT1lZGl0ZWRSYW5nZS5zdGFydExpbmUpO2NvbnNvbGUuYXNzZXJ0KG9yaWdpbmFsUmFuZ2Uuc3RhcnRDb2x1bW49PT1lZGl0ZWRSYW5nZS5zdGFydENvbHVtbik7Y29uc3QgcmViYXNlPXRoaXMuY2xvbmUoKTtpZighdGhpcy5mb2xsb3dzKG9yaWdpbmFsUmFuZ2UpKQpyZXR1cm4gcmViYXNlO2NvbnN0IGxpbmVEZWx0YT1lZGl0ZWRSYW5nZS5lbmRMaW5lLW9yaWdpbmFsUmFuZ2UuZW5kTGluZTtjb25zdCBjb2x1bW5EZWx0YT1lZGl0ZWRSYW5nZS5lbmRDb2x1bW4tb3JpZ2luYWxSYW5nZS5lbmRDb2x1bW47cmViYXNlLnN0YXJ0TGluZSs9bGluZURlbHRhO3JlYmFzZS5lbmRMaW5lKz1saW5lRGVsdGE7aWYocmViYXNlLnN0YXJ0TGluZT09PWVkaXRlZFJhbmdlLmVuZExpbmUpCnJlYmFzZS5zdGFydENvbHVtbis9Y29sdW1uRGVsdGE7aWYocmViYXNlLmVuZExpbmU9PT1lZGl0ZWRSYW5nZS5lbmRMaW5lKQpyZWJhc2UuZW5kQ29sdW1uKz1jb2x1bW5EZWx0YTtyZXR1cm4gcmViYXNlO30KdG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7fQpjb250YWluc0xvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtpZih0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSkKcmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlciYmdGhpcy5zdGFydENvbHVtbjw9Y29sdW1uTnVtYmVyJiZjb2x1bW5OdW1iZXI8PXRoaXMuZW5kQ29sdW1uO2lmKHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlcikKcmV0dXJuIHRoaXMuc3RhcnRDb2x1bW48PWNvbHVtbk51bWJlcjtpZih0aGlzLmVuZExpbmU9PT1saW5lTnVtYmVyKQpyZXR1cm4gY29sdW1uTnVtYmVyPD10aGlzLmVuZENvbHVtbjtyZXR1cm4gdGhpcy5zdGFydExpbmU8bGluZU51bWJlciYmbGluZU51bWJlcjx0aGlzLmVuZExpbmU7fX07VGV4dFV0aWxzLlNvdXJjZVJhbmdlPWNsYXNze2NvbnN0cnVjdG9yKG9mZnNldCxsZW5ndGgpe3RoaXMub2Zmc2V0PW9mZnNldDt0aGlzLmxlbmd0aD1sZW5ndGg7fX07VGV4dFV0aWxzLlNvdXJjZUVkaXQ9Y2xhc3N7Y29uc3RydWN0b3Ioc291cmNlVVJMLG9sZFJhbmdlLG5ld1RleHQpe3RoaXMuc291cmNlVVJMPXNvdXJjZVVSTDt0aGlzLm9sZFJhbmdlPW9sZFJhbmdlO3RoaXMubmV3VGV4dD1uZXdUZXh0O30Kc3RhdGljIGNvbXBhcmF0b3IoZWRpdDEsZWRpdDIpe3JldHVybiBUZXh0VXRpbHMuVGV4dFJhbmdlLmNvbXBhcmF0b3IoZWRpdDEub2xkUmFuZ2UsZWRpdDIub2xkUmFuZ2UpO30KbmV3UmFuZ2UoKXtyZXR1cm4gVGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tRWRpdCh0aGlzLm9sZFJhbmdlLHRoaXMubmV3VGV4dCk7fX07O3NlbGZbJ0NvbW1vbiddPXNlbGZbJ0NvbW1vbiddfHx7fTtDb21tb24uV29ya2VyPWNsYXNze2NvbnN0cnVjdG9yKGFwcE5hbWUpe2xldCB1cmw9YXBwTmFtZSsnLmpzJzt1cmwrPVJ1bnRpbWUucXVlcnlQYXJhbXNTdHJpbmcoKTt0aGlzLl93b3JrZXJQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9Pnt0aGlzLl93b3JrZXI9bmV3IFdvcmtlcih1cmwpO3RoaXMuX3dvcmtlci5vbm1lc3NhZ2U9b25NZXNzYWdlLmJpbmQodGhpcyk7ZnVuY3Rpb24gb25NZXNzYWdlKGV2ZW50KXtjb25zb2xlLmFzc2VydChldmVudC5kYXRhPT09J3dvcmtlclJlYWR5Jyk7dGhpcy5fd29ya2VyLm9ubWVzc2FnZT1udWxsO2Z1bGZpbGwodGhpcy5fd29ya2VyKTt0aGlzLl93b3JrZXI9bnVsbDt9fSk7fQpwb3N0TWVzc2FnZShtZXNzYWdlKXt0aGlzLl93b3JrZXJQcm9taXNlLnRoZW4od29ya2VyPT57aWYoIXRoaXMuX2Rpc3Bvc2VkKQp3b3JrZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7fSk7fQpkaXNwb3NlKCl7dGhpcy5fZGlzcG9zZWQ9dHJ1ZTt0aGlzLl93b3JrZXJQcm9taXNlLnRoZW4od29ya2VyPT53b3JrZXIudGVybWluYXRlKCkpO30KdGVybWluYXRlKCl7dGhpcy5kaXNwb3NlKCk7fQpzZXQgb25tZXNzYWdlKGxpc3RlbmVyKXt0aGlzLl93b3JrZXJQcm9taXNlLnRoZW4od29ya2VyPT53b3JrZXIub25tZXNzYWdlPWxpc3RlbmVyKTt9CnNldCBvbmVycm9yKGxpc3RlbmVyKXt0aGlzLl93b3JrZXJQcm9taXNlLnRoZW4od29ya2VyPT53b3JrZXIub25lcnJvcj1saXN0ZW5lcik7fX07O0NvbW1vbi5UZXh0RGljdGlvbmFyeT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3dvcmRzPW5ldyBNYXAoKTt0aGlzLl9pbmRleD1uZXcgQ29tbW9uLlRyaWUoKTt9CmFkZFdvcmQod29yZCl7bGV0IGNvdW50PXRoaXMuX3dvcmRzLmdldCh3b3JkKXx8MDsrK2NvdW50O3RoaXMuX3dvcmRzLnNldCh3b3JkLGNvdW50KTt0aGlzLl9pbmRleC5hZGQod29yZCk7fQpyZW1vdmVXb3JkKHdvcmQpe2xldCBjb3VudD10aGlzLl93b3Jkcy5nZXQod29yZCl8fDA7aWYoIWNvdW50KQpyZXR1cm47aWYoY291bnQ9PT0xKXt0aGlzLl93b3Jkcy5kZWxldGUod29yZCk7dGhpcy5faW5kZXgucmVtb3ZlKHdvcmQpO3JldHVybjt9Ci0tY291bnQ7dGhpcy5fd29yZHMuc2V0KHdvcmQsY291bnQpO30Kd29yZHNXaXRoUHJlZml4KHByZWZpeCl7cmV0dXJuIHRoaXMuX2luZGV4LndvcmRzKHByZWZpeCk7fQpoYXNXb3JkKHdvcmQpe3JldHVybiB0aGlzLl93b3Jkcy5oYXMod29yZCk7fQp3b3JkQ291bnQod29yZCl7cmV0dXJuIHRoaXMuX3dvcmRzLmdldCh3b3JkKXx8MDt9CnJlc2V0KCl7dGhpcy5fd29yZHMuY2xlYXIoKTt0aGlzLl9pbmRleC5jbGVhcigpO319OztDb21tb24uT2JqZWN0PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fbGlzdGVuZXJzO30KYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCl7aWYoIWxpc3RlbmVyKQpjb25zb2xlLmFzc2VydChmYWxzZSk7aWYoIXRoaXMuX2xpc3RlbmVycykKdGhpcy5fbGlzdGVuZXJzPW5ldyBNYXAoKTtpZighdGhpcy5fbGlzdGVuZXJzLmhhcyhldmVudFR5cGUpKQp0aGlzLl9saXN0ZW5lcnMuc2V0KGV2ZW50VHlwZSxbXSk7dGhpcy5fbGlzdGVuZXJzLmdldChldmVudFR5cGUpLnB1c2goe3RoaXNPYmplY3Q6dGhpc09iamVjdCxsaXN0ZW5lcjpsaXN0ZW5lcn0pO3JldHVybntldmVudFRhcmdldDp0aGlzLGV2ZW50VHlwZTpldmVudFR5cGUsdGhpc09iamVjdDp0aGlzT2JqZWN0LGxpc3RlbmVyOmxpc3RlbmVyfTt9Cm9uY2UoZXZlbnRUeXBlKXtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IGRlc2NyaXB0b3I9dGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSxldmVudD0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsZGVzY3JpcHRvci5saXN0ZW5lcik7cmVzb2x2ZShldmVudC5kYXRhKTt9KTt9KTt9CnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3Qpe2NvbnNvbGUuYXNzZXJ0KGxpc3RlbmVyKTtpZighdGhpcy5fbGlzdGVuZXJzfHwhdGhpcy5fbGlzdGVuZXJzLmhhcyhldmVudFR5cGUpKQpyZXR1cm47Y29uc3QgbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnRUeXBlKTtmb3IobGV0IGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7KytpKXtpZihsaXN0ZW5lcnNbaV0ubGlzdGVuZXI9PT1saXN0ZW5lciYmbGlzdGVuZXJzW2ldLnRoaXNPYmplY3Q9PT10aGlzT2JqZWN0KXtsaXN0ZW5lcnNbaV0uZGlzcG9zZWQ9dHJ1ZTtsaXN0ZW5lcnMuc3BsaWNlKGktLSwxKTt9fQppZighbGlzdGVuZXJzLmxlbmd0aCkKdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShldmVudFR5cGUpO30KaGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnRUeXBlKXtyZXR1cm4hISh0aGlzLl9saXN0ZW5lcnMmJnRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSk7fQpkaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoZXZlbnRUeXBlLGV2ZW50RGF0YSl7aWYoIXRoaXMuX2xpc3RlbmVyc3x8IXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKcmV0dXJuO2NvbnN0IGV2ZW50PSh7ZGF0YTpldmVudERhdGF9KTtjb25zdCBsaXN0ZW5lcnM9dGhpcy5fbGlzdGVuZXJzLmdldChldmVudFR5cGUpLnNsaWNlKDApO2ZvcihsZXQgaT0wO2k8bGlzdGVuZXJzLmxlbmd0aDsrK2kpe2lmKCFsaXN0ZW5lcnNbaV0uZGlzcG9zZWQpCmxpc3RlbmVyc1tpXS5saXN0ZW5lci5jYWxsKGxpc3RlbmVyc1tpXS50aGlzT2JqZWN0LGV2ZW50KTt9fX07Q29tbW9uLkV2ZW50O0NvbW1vbi5PYmplY3QuX2xpc3RlbmVyQ2FsbGJhY2tUdXBsZTtDb21tb24uRXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXt9O0NvbW1vbi5FdmVudFRhcmdldC5FdmVudERlc2NyaXB0b3I7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKGV2ZW50TGlzdCl7Zm9yKGNvbnN0IGV2ZW50SW5mbyBvZiBldmVudExpc3QpCmV2ZW50SW5mby5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50SW5mby5ldmVudFR5cGUsZXZlbnRJbmZvLmxpc3RlbmVyLGV2ZW50SW5mby50aGlzT2JqZWN0KTtldmVudExpc3Quc3BsaWNlKDApO307Q29tbW9uLkV2ZW50VGFyZ2V0LnByb3RvdHlwZT17YWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCl7fSxvbmNlKGV2ZW50VHlwZSl7fSxyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXt9LGhhc0V2ZW50TGlzdGVuZXJzKGV2ZW50VHlwZSl7fSxkaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoZXZlbnRUeXBlLGV2ZW50RGF0YSl7fSx9OztDb21tb24uQ29sb3I9Y2xhc3N7Y29uc3RydWN0b3IocmdiYSxmb3JtYXQsb3JpZ2luYWxUZXh0KXt0aGlzLl9yZ2JhPXJnYmE7dGhpcy5fb3JpZ2luYWxUZXh0PW9yaWdpbmFsVGV4dHx8bnVsbDt0aGlzLl9vcmlnaW5hbFRleHRJc1ZhbGlkPSEhdGhpcy5fb3JpZ2luYWxUZXh0O3RoaXMuX2Zvcm1hdD1mb3JtYXQ7aWYodHlwZW9mIHRoaXMuX3JnYmFbM109PT0ndW5kZWZpbmVkJykKdGhpcy5fcmdiYVszXT0xO2ZvcihsZXQgaT0wO2k8NDsrK2kpe2lmKHRoaXMuX3JnYmFbaV08MCl7dGhpcy5fcmdiYVtpXT0wO3RoaXMuX29yaWdpbmFsVGV4dElzVmFsaWQ9ZmFsc2U7fQppZih0aGlzLl9yZ2JhW2ldPjEpe3RoaXMuX3JnYmFbaV09MTt0aGlzLl9vcmlnaW5hbFRleHRJc1ZhbGlkPWZhbHNlO319fQpzdGF0aWMgcGFyc2UodGV4dCl7Y29uc3QgdmFsdWU9dGV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCcnKTtjb25zdCBzaW1wbGU9L14oPzojKFswLTlhLWZdezMsNH18WzAtOWEtZl17Nn18WzAtOWEtZl17OH0pfChcdyspKSQvaTtsZXQgbWF0Y2g9dmFsdWUubWF0Y2goc2ltcGxlKTtpZihtYXRjaCl7aWYobWF0Y2hbMV0pe2xldCBoZXg9bWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtsZXQgZm9ybWF0O2lmKGhleC5sZW5ndGg9PT0zKXtmb3JtYXQ9Q29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWDtoZXg9aGV4LmNoYXJBdCgwKStoZXguY2hhckF0KDApK2hleC5jaGFyQXQoMSkraGV4LmNoYXJBdCgxKStoZXguY2hhckF0KDIpK2hleC5jaGFyQXQoMik7fWVsc2UgaWYoaGV4Lmxlbmd0aD09PTQpe2Zvcm1hdD1Db21tb24uQ29sb3IuRm9ybWF0LlNob3J0SEVYQTtoZXg9aGV4LmNoYXJBdCgwKStoZXguY2hhckF0KDApK2hleC5jaGFyQXQoMSkraGV4LmNoYXJBdCgxKStoZXguY2hhckF0KDIpK2hleC5jaGFyQXQoMikrCmhleC5jaGFyQXQoMykraGV4LmNoYXJBdCgzKTt9ZWxzZSBpZihoZXgubGVuZ3RoPT09Nil7Zm9ybWF0PUNvbW1vbi5Db2xvci5Gb3JtYXQuSEVYO31lbHNle2Zvcm1hdD1Db21tb24uQ29sb3IuRm9ybWF0LkhFWEE7fQpjb25zdCByPXBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwyKSwxNik7Y29uc3QgZz1wYXJzZUludChoZXguc3Vic3RyaW5nKDIsNCksMTYpO2NvbnN0IGI9cGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LDYpLDE2KTtsZXQgYT0xO2lmKGhleC5sZW5ndGg9PT04KQphPXBhcnNlSW50KGhleC5zdWJzdHJpbmcoNiw4KSwxNikvMjU1O3JldHVybiBuZXcgQ29tbW9uLkNvbG9yKFtyLzI1NSxnLzI1NSxiLzI1NSxhXSxmb3JtYXQsdGV4dCk7fQppZihtYXRjaFsyXSl7Y29uc3Qgbmlja25hbWU9bWF0Y2hbMl0udG9Mb3dlckNhc2UoKTtpZihuaWNrbmFtZSBpbiBDb21tb24uQ29sb3IuTmlja25hbWVzKXtjb25zdCByZ2JhPUNvbW1vbi5Db2xvci5OaWNrbmFtZXNbbmlja25hbWVdO2NvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5mcm9tUkdCQShyZ2JhKTtjb2xvci5fZm9ybWF0PUNvbW1vbi5Db2xvci5Gb3JtYXQuTmlja25hbWU7Y29sb3IuX29yaWdpbmFsVGV4dD10ZXh0O3JldHVybiBjb2xvcjt9CnJldHVybiBudWxsO30KcmV0dXJuIG51bGw7fQptYXRjaD10ZXh0LnRvTG93ZXJDYXNlKCkubWF0Y2goL15ccyooPzoocmdiYT8pfChoc2xhPykpXCgoLiopXClccyokLyk7aWYobWF0Y2gpe2NvbnN0IGNvbXBvbmVudHM9bWF0Y2hbM10udHJpbSgpO2xldCB2YWx1ZXM9Y29tcG9uZW50cy5zcGxpdCgvXHMqLFxzKi8pO2lmKHZhbHVlcy5sZW5ndGg9PT0xKXt2YWx1ZXM9Y29tcG9uZW50cy5zcGxpdCgvXHMrLyk7aWYodmFsdWVzWzNdPT09Jy8nKXt2YWx1ZXMuc3BsaWNlKDMsMSk7aWYodmFsdWVzLmxlbmd0aCE9PTQpCnJldHVybiBudWxsO31lbHNlIGlmKCh2YWx1ZXMubGVuZ3RoPjImJnZhbHVlc1syXS5pbmRleE9mKCcvJykhPT0tMSl8fCh2YWx1ZXMubGVuZ3RoPjMmJnZhbHVlc1szXS5pbmRleE9mKCcvJykhPT0tMSkpe2NvbnN0IGFscGhhPXZhbHVlcy5zbGljZSgyLDQpLmpvaW4oJycpO3ZhbHVlcz12YWx1ZXMuc2xpY2UoMCwyKS5jb25jYXQoYWxwaGEuc3BsaXQoL1wvLykpLmNvbmNhdCh2YWx1ZXMuc2xpY2UoNCkpO31lbHNlIGlmKHZhbHVlcy5sZW5ndGg+PTQpe3JldHVybiBudWxsO319CmlmKHZhbHVlcy5sZW5ndGghPT0zJiZ2YWx1ZXMubGVuZ3RoIT09NHx8dmFsdWVzLmluZGV4T2YoJycpPi0xKQpyZXR1cm4gbnVsbDtjb25zdCBoYXNBbHBoYT0odmFsdWVzWzNdIT09dW5kZWZpbmVkKTtpZihtYXRjaFsxXSl7Y29uc3QgcmdiYT1bQ29tbW9uLkNvbG9yLl9wYXJzZVJnYk51bWVyaWModmFsdWVzWzBdKSxDb21tb24uQ29sb3IuX3BhcnNlUmdiTnVtZXJpYyh2YWx1ZXNbMV0pLENvbW1vbi5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHZhbHVlc1syXSksaGFzQWxwaGE/Q29tbW9uLkNvbG9yLl9wYXJzZUFscGhhTnVtZXJpYyh2YWx1ZXNbM10pOjFdO2lmKHJnYmEuaW5kZXhPZihudWxsKT4tMSkKcmV0dXJuIG51bGw7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxoYXNBbHBoYT9Db21tb24uQ29sb3IuRm9ybWF0LlJHQkE6Q29tbW9uLkNvbG9yLkZvcm1hdC5SR0IsdGV4dCk7fQppZihtYXRjaFsyXSl7Y29uc3QgaHNsYT1bQ29tbW9uLkNvbG9yLl9wYXJzZUh1ZU51bWVyaWModmFsdWVzWzBdKSxDb21tb24uQ29sb3IuX3BhcnNlU2F0TGlnaHROdW1lcmljKHZhbHVlc1sxXSksQ29tbW9uLkNvbG9yLl9wYXJzZVNhdExpZ2h0TnVtZXJpYyh2YWx1ZXNbMl0pLGhhc0FscGhhP0NvbW1vbi5Db2xvci5fcGFyc2VBbHBoYU51bWVyaWModmFsdWVzWzNdKToxXTtpZihoc2xhLmluZGV4T2YobnVsbCk+LTEpCnJldHVybiBudWxsO2NvbnN0IHJnYmE9W107Q29tbW9uLkNvbG9yLmhzbDJyZ2IoaHNsYSxyZ2JhKTtyZXR1cm4gbmV3IENvbW1vbi5Db2xvcihyZ2JhLGhhc0FscGhhP0NvbW1vbi5Db2xvci5Gb3JtYXQuSFNMQTpDb21tb24uQ29sb3IuRm9ybWF0LkhTTCx0ZXh0KTt9fQpyZXR1cm4gbnVsbDt9CnN0YXRpYyBmcm9tUkdCQShyZ2JhKXtyZXR1cm4gbmV3IENvbW1vbi5Db2xvcihbcmdiYVswXS8yNTUscmdiYVsxXS8yNTUscmdiYVsyXS8yNTUscmdiYVszXV0sQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTt9CnN0YXRpYyBmcm9tSFNWQShoc3ZhKXtjb25zdCByZ2JhPVtdO0NvbW1vbi5Db2xvci5oc3ZhMnJnYmEoaHN2YSxyZ2JhKTtyZXR1cm4gbmV3IENvbW1vbi5Db2xvcihyZ2JhLENvbW1vbi5Db2xvci5Gb3JtYXQuSFNMQSk7fQpzdGF0aWMgX3BhcnNlUGVyY2VudE9yTnVtYmVyKHZhbHVlKXtpZihpc05hTih2YWx1ZS5yZXBsYWNlKCclJywnJykpKQpyZXR1cm4gbnVsbDtjb25zdCBwYXJzZWQ9cGFyc2VGbG9hdCh2YWx1ZSk7aWYodmFsdWUuaW5kZXhPZignJScpIT09LTEpe2lmKHZhbHVlLmluZGV4T2YoJyUnKSE9PXZhbHVlLmxlbmd0aC0xKQpyZXR1cm4gbnVsbDtyZXR1cm4gcGFyc2VkLzEwMDt9CnJldHVybiBwYXJzZWQ7fQpzdGF0aWMgX3BhcnNlUmdiTnVtZXJpYyh2YWx1ZSl7Y29uc3QgcGFyc2VkPUNvbW1vbi5Db2xvci5fcGFyc2VQZXJjZW50T3JOdW1iZXIodmFsdWUpO2lmKHBhcnNlZD09PW51bGwpCnJldHVybiBudWxsO2lmKHZhbHVlLmluZGV4T2YoJyUnKSE9PS0xKQpyZXR1cm4gcGFyc2VkO3JldHVybiBwYXJzZWQvMjU1O30Kc3RhdGljIF9wYXJzZUh1ZU51bWVyaWModmFsdWUpe2NvbnN0IGFuZ2xlPXZhbHVlLnJlcGxhY2UoLyhkZWd8Zz9yYWR8dHVybikkLywnJyk7aWYoaXNOYU4oYW5nbGUpfHx2YWx1ZS5tYXRjaCgvXHMrKGRlZ3xnP3JhZHx0dXJuKS8pKQpyZXR1cm4gbnVsbDtjb25zdCBudW1iZXI9cGFyc2VGbG9hdChhbmdsZSk7aWYodmFsdWUuaW5kZXhPZigndHVybicpIT09LTEpCnJldHVybiBudW1iZXIlMTtlbHNlIGlmKHZhbHVlLmluZGV4T2YoJ2dyYWQnKSE9PS0xKQpyZXR1cm4obnVtYmVyLzQwMCklMTtlbHNlIGlmKHZhbHVlLmluZGV4T2YoJ3JhZCcpIT09LTEpCnJldHVybihudW1iZXIvKDIqTWF0aC5QSSkpJTE7cmV0dXJuKG51bWJlci8zNjApJTE7fQpzdGF0aWMgX3BhcnNlU2F0TGlnaHROdW1lcmljKHZhbHVlKXtpZih2YWx1ZS5pbmRleE9mKCclJykhPT12YWx1ZS5sZW5ndGgtMXx8aXNOYU4odmFsdWUucmVwbGFjZSgnJScsJycpKSkKcmV0dXJuIG51bGw7Y29uc3QgcGFyc2VkPXBhcnNlRmxvYXQodmFsdWUpO3JldHVybiBNYXRoLm1pbigxLHBhcnNlZC8xMDApO30Kc3RhdGljIF9wYXJzZUFscGhhTnVtZXJpYyh2YWx1ZSl7cmV0dXJuIENvbW1vbi5Db2xvci5fcGFyc2VQZXJjZW50T3JOdW1iZXIodmFsdWUpO30Kc3RhdGljIF9oc3ZhMmhzbGEoaHN2YSxvdXRfaHNsYSl7Y29uc3QgaD1oc3ZhWzBdO2xldCBzPWhzdmFbMV07Y29uc3Qgdj1oc3ZhWzJdO2NvbnN0IHQ9KDItcykqdjtpZih2PT09MHx8cz09PTApCnM9MDtlbHNlCnMqPXYvKHQ8MT90OjItdCk7b3V0X2hzbGFbMF09aDtvdXRfaHNsYVsxXT1zO291dF9oc2xhWzJdPXQvMjtvdXRfaHNsYVszXT1oc3ZhWzNdO30Kc3RhdGljIGhzbDJyZ2IoaHNsLG91dF9yZ2Ipe2NvbnN0IGg9aHNsWzBdO2xldCBzPWhzbFsxXTtjb25zdCBsPWhzbFsyXTtmdW5jdGlvbiBodWUycmdiKHAscSxoKXtpZihoPDApCmgrPTE7ZWxzZSBpZihoPjEpCmgtPTE7aWYoKGgqNik8MSkKcmV0dXJuIHArKHEtcCkqaCo2O2Vsc2UgaWYoKGgqMik8MSkKcmV0dXJuIHE7ZWxzZSBpZigoaCozKTwyKQpyZXR1cm4gcCsocS1wKSooKDIvMyktaCkqNjtlbHNlCnJldHVybiBwO30KaWYoczwwKQpzPTA7bGV0IHE7aWYobDw9MC41KQpxPWwqKDErcyk7ZWxzZQpxPWwrcy0obCpzKTtjb25zdCBwPTIqbC1xO2NvbnN0IHRyPWgrKDEvMyk7Y29uc3QgdGc9aDtjb25zdCB0Yj1oLSgxLzMpO291dF9yZ2JbMF09aHVlMnJnYihwLHEsdHIpO291dF9yZ2JbMV09aHVlMnJnYihwLHEsdGcpO291dF9yZ2JbMl09aHVlMnJnYihwLHEsdGIpO291dF9yZ2JbM109aHNsWzNdO30Kc3RhdGljIGhzdmEycmdiYShoc3ZhLG91dF9yZ2JhKXtDb21tb24uQ29sb3IuX2hzdmEyaHNsYShoc3ZhLENvbW1vbi5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEEpO0NvbW1vbi5Db2xvci5oc2wycmdiKENvbW1vbi5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEEsb3V0X3JnYmEpO2ZvcihsZXQgaT0wO2k8Q29tbW9uLkNvbG9yLmhzdmEycmdiYS5fdG1wSFNMQS5sZW5ndGg7aSsrKQpDb21tb24uQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBW2ldPTA7fQpzdGF0aWMgbHVtaW5hbmNlKHJnYmEpe2NvbnN0IHJTUkdCPXJnYmFbMF07Y29uc3QgZ1NSR0I9cmdiYVsxXTtjb25zdCBiU1JHQj1yZ2JhWzJdO2NvbnN0IHI9clNSR0I8PTAuMDM5Mjg/clNSR0IvMTIuOTI6TWF0aC5wb3coKChyU1JHQiswLjA1NSkvMS4wNTUpLDIuNCk7Y29uc3QgZz1nU1JHQjw9MC4wMzkyOD9nU1JHQi8xMi45MjpNYXRoLnBvdygoKGdTUkdCKzAuMDU1KS8xLjA1NSksMi40KTtjb25zdCBiPWJTUkdCPD0wLjAzOTI4P2JTUkdCLzEyLjkyOk1hdGgucG93KCgoYlNSR0IrMC4wNTUpLzEuMDU1KSwyLjQpO3JldHVybiAwLjIxMjYqciswLjcxNTIqZyswLjA3MjIqYjt9CnN0YXRpYyBibGVuZENvbG9ycyhmZ1JHQkEsYmdSR0JBLG91dF9ibGVuZGVkKXtjb25zdCBhbHBoYT1mZ1JHQkFbM107b3V0X2JsZW5kZWRbMF09KCgxLWFscGhhKSpiZ1JHQkFbMF0pKyhhbHBoYSpmZ1JHQkFbMF0pO291dF9ibGVuZGVkWzFdPSgoMS1hbHBoYSkqYmdSR0JBWzFdKSsoYWxwaGEqZmdSR0JBWzFdKTtvdXRfYmxlbmRlZFsyXT0oKDEtYWxwaGEpKmJnUkdCQVsyXSkrKGFscGhhKmZnUkdCQVsyXSk7b3V0X2JsZW5kZWRbM109YWxwaGErKGJnUkdCQVszXSooMS1hbHBoYSkpO30Kc3RhdGljIGNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8oZmdSR0JBLGJnUkdCQSl7Q29tbW9uLkNvbG9yLmJsZW5kQ29sb3JzKGZnUkdCQSxiZ1JHQkEsQ29tbW9uLkNvbG9yLmNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8uX2JsZW5kZWRGZyk7Y29uc3QgZmdMdW1pbmFuY2U9Q29tbW9uLkNvbG9yLmx1bWluYW5jZShDb21tb24uQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnKTtjb25zdCBiZ0x1bWluYW5jZT1Db21tb24uQ29sb3IubHVtaW5hbmNlKGJnUkdCQSk7Y29uc3QgY29udHJhc3RSYXRpbz0oTWF0aC5tYXgoZmdMdW1pbmFuY2UsYmdMdW1pbmFuY2UpKzAuMDUpLyhNYXRoLm1pbihmZ0x1bWluYW5jZSxiZ0x1bWluYW5jZSkrMC4wNSk7Zm9yKGxldCBpPTA7aTxDb21tb24uQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnLmxlbmd0aDtpKyspCkNvbW1vbi5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvLl9ibGVuZGVkRmdbaV09MDtyZXR1cm4gY29udHJhc3RSYXRpbzt9CnN0YXRpYyBkZXNpcmVkTHVtaW5hbmNlKGx1bWluYW5jZSxjb250cmFzdCxsaWdodGVyKXtmdW5jdGlvbiBjb21wdXRlTHVtaW5hbmNlKCl7aWYobGlnaHRlcikKcmV0dXJuKGx1bWluYW5jZSswLjA1KSpjb250cmFzdC0wLjA1O2Vsc2UKcmV0dXJuKGx1bWluYW5jZSswLjA1KS9jb250cmFzdC0wLjA1O30KbGV0IGRlc2lyZWRMdW1pbmFuY2U9Y29tcHV0ZUx1bWluYW5jZSgpO2lmKGRlc2lyZWRMdW1pbmFuY2U8MHx8ZGVzaXJlZEx1bWluYW5jZT4xKXtsaWdodGVyPSFsaWdodGVyO2Rlc2lyZWRMdW1pbmFuY2U9Y29tcHV0ZUx1bWluYW5jZSgpO30KcmV0dXJuIGRlc2lyZWRMdW1pbmFuY2U7fQpzdGF0aWMgZGV0ZWN0Q29sb3JGb3JtYXQoY29sb3Ipe2NvbnN0IGNmPUNvbW1vbi5Db2xvci5Gb3JtYXQ7bGV0IGZvcm1hdDtjb25zdCBmb3JtYXRTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjb2xvckZvcm1hdCcpLmdldCgpO2lmKGZvcm1hdFNldHRpbmc9PT1jZi5PcmlnaW5hbCkKZm9ybWF0PWNmLk9yaWdpbmFsO2Vsc2UgaWYoZm9ybWF0U2V0dGluZz09PWNmLlJHQikKZm9ybWF0PShjb2xvci5oYXNBbHBoYSgpP2NmLlJHQkE6Y2YuUkdCKTtlbHNlIGlmKGZvcm1hdFNldHRpbmc9PT1jZi5IU0wpCmZvcm1hdD0oY29sb3IuaGFzQWxwaGEoKT9jZi5IU0xBOmNmLkhTTCk7ZWxzZSBpZihmb3JtYXRTZXR0aW5nPT09Y2YuSEVYKQpmb3JtYXQ9Y29sb3IuZGV0ZWN0SEVYRm9ybWF0KCk7ZWxzZQpmb3JtYXQ9Y2YuUkdCQTtyZXR1cm4gZm9ybWF0O30KZm9ybWF0KCl7cmV0dXJuIHRoaXMuX2Zvcm1hdDt9CmhzbGEoKXtpZih0aGlzLl9oc2xhKQpyZXR1cm4gdGhpcy5faHNsYTtjb25zdCByPXRoaXMuX3JnYmFbMF07Y29uc3QgZz10aGlzLl9yZ2JhWzFdO2NvbnN0IGI9dGhpcy5fcmdiYVsyXTtjb25zdCBtYXg9TWF0aC5tYXgocixnLGIpO2NvbnN0IG1pbj1NYXRoLm1pbihyLGcsYik7Y29uc3QgZGlmZj1tYXgtbWluO2NvbnN0IGFkZD1tYXgrbWluO2xldCBoO2lmKG1pbj09PW1heCkKaD0wO2Vsc2UgaWYocj09PW1heCkKaD0oKDEvNiooZy1iKS9kaWZmKSsxKSUxO2Vsc2UgaWYoZz09PW1heCkKaD0oMS82KihiLXIpL2RpZmYpKzEvMztlbHNlCmg9KDEvNiooci1nKS9kaWZmKSsyLzM7Y29uc3QgbD0wLjUqYWRkO2xldCBzO2lmKGw9PT0wKQpzPTA7ZWxzZSBpZihsPT09MSkKcz0wO2Vsc2UgaWYobDw9MC41KQpzPWRpZmYvYWRkO2Vsc2UKcz1kaWZmLygyLWFkZCk7dGhpcy5faHNsYT1baCxzLGwsdGhpcy5fcmdiYVszXV07cmV0dXJuIHRoaXMuX2hzbGE7fQpjYW5vbmljYWxIU0xBKCl7Y29uc3QgaHNsYT10aGlzLmhzbGEoKTtyZXR1cm5bTWF0aC5yb3VuZChoc2xhWzBdKjM2MCksTWF0aC5yb3VuZChoc2xhWzFdKjEwMCksTWF0aC5yb3VuZChoc2xhWzJdKjEwMCksaHNsYVszXV07fQpoc3ZhKCl7Y29uc3QgaHNsYT10aGlzLmhzbGEoKTtjb25zdCBoPWhzbGFbMF07bGV0IHM9aHNsYVsxXTtjb25zdCBsPWhzbGFbMl07cyo9bDwwLjU/bDoxLWw7cmV0dXJuW2gscyE9PTA/MipzLyhsK3MpOjAsKGwrcyksaHNsYVszXV07fQpoYXNBbHBoYSgpe3JldHVybiB0aGlzLl9yZ2JhWzNdIT09MTt9CmRldGVjdEhFWEZvcm1hdCgpe2xldCBjYW5CZVNob3J0PXRydWU7Zm9yKGxldCBpPTA7aTw0OysraSl7Y29uc3QgYz1NYXRoLnJvdW5kKHRoaXMuX3JnYmFbaV0qMjU1KTtpZihjJTE3KXtjYW5CZVNob3J0PWZhbHNlO2JyZWFrO319CmNvbnN0IGhhc0FscGhhPXRoaXMuaGFzQWxwaGEoKTtjb25zdCBjZj1Db21tb24uQ29sb3IuRm9ybWF0O2lmKGNhbkJlU2hvcnQpCnJldHVybiBoYXNBbHBoYT9jZi5TaG9ydEhFWEE6Y2YuU2hvcnRIRVg7cmV0dXJuIGhhc0FscGhhP2NmLkhFWEE6Y2YuSEVYO30KYXNTdHJpbmcoZm9ybWF0KXtpZihmb3JtYXQ9PT10aGlzLl9mb3JtYXQmJnRoaXMuX29yaWdpbmFsVGV4dElzVmFsaWQpCnJldHVybiB0aGlzLl9vcmlnaW5hbFRleHQ7aWYoIWZvcm1hdCkKZm9ybWF0PXRoaXMuX2Zvcm1hdDtmdW5jdGlvbiB0b1JnYlZhbHVlKHZhbHVlKXtyZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSoyNTUpO30KZnVuY3Rpb24gdG9IZXhWYWx1ZSh2YWx1ZSl7Y29uc3QgaGV4PU1hdGgucm91bmQodmFsdWUqMjU1KS50b1N0cmluZygxNik7cmV0dXJuIGhleC5sZW5ndGg9PT0xPycwJytoZXg6aGV4O30KZnVuY3Rpb24gdG9TaG9ydEhleFZhbHVlKHZhbHVlKXtyZXR1cm4oTWF0aC5yb3VuZCh2YWx1ZSoyNTUpLzE3KS50b1N0cmluZygxNik7fQpzd2l0Y2goZm9ybWF0KXtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuT3JpZ2luYWw6cmV0dXJuIHRoaXMuX29yaWdpbmFsVGV4dDtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCdyZ2IoJWQsICVkLCAlZCknLHRvUmdiVmFsdWUodGhpcy5fcmdiYVswXSksdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzFdKSx0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMl0pKTtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCQTpyZXR1cm4gU3RyaW5nLnNwcmludGYoJ3JnYmEoJWQsICVkLCAlZCwgJWYpJyx0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvUmdiVmFsdWUodGhpcy5fcmdiYVsxXSksdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzJdKSx0aGlzLl9yZ2JhWzNdKTtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuSFNMOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7Y29uc3QgaHNsPXRoaXMuaHNsYSgpO3JldHVybiBTdHJpbmcuc3ByaW50ZignaHNsKCVkLCAlZCUsICVkJSknLE1hdGgucm91bmQoaHNsWzBdKjM2MCksTWF0aC5yb3VuZChoc2xbMV0qMTAwKSxNYXRoLnJvdW5kKGhzbFsyXSoxMDApKTtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuSFNMQTpjb25zdCBoc2xhPXRoaXMuaHNsYSgpO3JldHVybiBTdHJpbmcuc3ByaW50ZignaHNsYSglZCwgJWQlLCAlZCUsICVmKScsTWF0aC5yb3VuZChoc2xhWzBdKjM2MCksTWF0aC5yb3VuZChoc2xhWzFdKjEwMCksTWF0aC5yb3VuZChoc2xhWzJdKjEwMCksaHNsYVszXSk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LkhFWEE6cmV0dXJuIFN0cmluZy5zcHJpbnRmKCcjJXMlcyVzJXMnLHRvSGV4VmFsdWUodGhpcy5fcmdiYVswXSksdG9IZXhWYWx1ZSh0aGlzLl9yZ2JhWzFdKSx0b0hleFZhbHVlKHRoaXMuX3JnYmFbMl0pLHRvSGV4VmFsdWUodGhpcy5fcmdiYVszXSkpLnRvTG93ZXJDYXNlKCk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LkhFWDppZih0aGlzLmhhc0FscGhhKCkpCnJldHVybiBudWxsO3JldHVybiBTdHJpbmcuc3ByaW50ZignIyVzJXMlcycsdG9IZXhWYWx1ZSh0aGlzLl9yZ2JhWzBdKSx0b0hleFZhbHVlKHRoaXMuX3JnYmFbMV0pLHRvSGV4VmFsdWUodGhpcy5fcmdiYVsyXSkpLnRvTG93ZXJDYXNlKCk7Y2FzZSBDb21tb24uQ29sb3IuRm9ybWF0LlNob3J0SEVYQTpjb25zdCBoZXhGb3JtYXQ9dGhpcy5kZXRlY3RIRVhGb3JtYXQoKTtpZihoZXhGb3JtYXQhPT1Db21tb24uQ29sb3IuRm9ybWF0LlNob3J0SEVYQSYmaGV4Rm9ybWF0IT09Q29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWCkKcmV0dXJuIG51bGw7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCcjJXMlcyVzJXMnLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzBdKSx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVsxXSksdG9TaG9ydEhleFZhbHVlKHRoaXMuX3JnYmFbMl0pLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzNdKSkudG9Mb3dlckNhc2UoKTtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuU2hvcnRIRVg6aWYodGhpcy5oYXNBbHBoYSgpKQpyZXR1cm4gbnVsbDtpZih0aGlzLmRldGVjdEhFWEZvcm1hdCgpIT09Q29tbW9uLkNvbG9yLkZvcm1hdC5TaG9ydEhFWCkKcmV0dXJuIG51bGw7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCcjJXMlcyVzJyx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVswXSksdG9TaG9ydEhleFZhbHVlKHRoaXMuX3JnYmFbMV0pLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzJdKSkudG9Mb3dlckNhc2UoKTtjYXNlIENvbW1vbi5Db2xvci5Gb3JtYXQuTmlja25hbWU6cmV0dXJuIHRoaXMubmlja25hbWUoKTt9CnJldHVybiB0aGlzLl9vcmlnaW5hbFRleHQ7fQpyZ2JhKCl7cmV0dXJuIHRoaXMuX3JnYmEuc2xpY2UoKTt9CmNhbm9uaWNhbFJHQkEoKXtjb25zdCByZ2JhPW5ldyBBcnJheSg0KTtmb3IobGV0IGk9MDtpPDM7KytpKQpyZ2JhW2ldPU1hdGgucm91bmQodGhpcy5fcmdiYVtpXSoyNTUpO3JnYmFbM109dGhpcy5fcmdiYVszXTtyZXR1cm4gcmdiYTt9Cm5pY2tuYW1lKCl7aWYoIUNvbW1vbi5Db2xvci5fcmdiYVRvTmlja25hbWUpe0NvbW1vbi5Db2xvci5fcmdiYVRvTmlja25hbWU9e307Zm9yKGNvbnN0IG5pY2tuYW1lIGluIENvbW1vbi5Db2xvci5OaWNrbmFtZXMpe2xldCByZ2JhPUNvbW1vbi5Db2xvci5OaWNrbmFtZXNbbmlja25hbWVdO2lmKHJnYmEubGVuZ3RoIT09NCkKcmdiYT1yZ2JhLmNvbmNhdCgxKTtDb21tb24uQ29sb3IuX3JnYmFUb05pY2tuYW1lW3JnYmFdPW5pY2tuYW1lO319CnJldHVybiBDb21tb24uQ29sb3IuX3JnYmFUb05pY2tuYW1lW3RoaXMuY2Fub25pY2FsUkdCQSgpXXx8bnVsbDt9CnRvUHJvdG9jb2xSR0JBKCl7Y29uc3QgcmdiYT10aGlzLmNhbm9uaWNhbFJHQkEoKTtjb25zdCByZXN1bHQ9e3I6cmdiYVswXSxnOnJnYmFbMV0sYjpyZ2JhWzJdfTtpZihyZ2JhWzNdIT09MSkKcmVzdWx0LmE9cmdiYVszXTtyZXR1cm4gcmVzdWx0O30KaW52ZXJ0KCl7Y29uc3QgcmdiYT1bXTtyZ2JhWzBdPTEtdGhpcy5fcmdiYVswXTtyZ2JhWzFdPTEtdGhpcy5fcmdiYVsxXTtyZ2JhWzJdPTEtdGhpcy5fcmdiYVsyXTtyZ2JhWzNdPXRoaXMuX3JnYmFbM107cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxDb21tb24uQ29sb3IuRm9ybWF0LlJHQkEpO30Kc2V0QWxwaGEoYWxwaGEpe2NvbnN0IHJnYmE9dGhpcy5fcmdiYS5zbGljZSgpO3JnYmFbM109YWxwaGE7cmV0dXJuIG5ldyBDb21tb24uQ29sb3IocmdiYSxDb21tb24uQ29sb3IuRm9ybWF0LlJHQkEpO30KYmxlbmRXaXRoKGZnQ29sb3Ipe2NvbnN0IHJnYmE9W107Q29tbW9uLkNvbG9yLmJsZW5kQ29sb3JzKGZnQ29sb3IuX3JnYmEsdGhpcy5fcmdiYSxyZ2JhKTtyZXR1cm4gbmV3IENvbW1vbi5Db2xvcihyZ2JhLENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCQSk7fX07Q29tbW9uLkNvbG9yLlJlZ2V4PS8oKD86cmdifGhzbClhP1woW14pXStcKXwjWzAtOWEtZkEtRl17OH18I1swLTlhLWZBLUZdezZ9fCNbMC05YS1mQS1GXXszLDR9fFxiW2EtekEtWl0rXGIoPyEtKSkvZztDb21tb24uQ29sb3IuRm9ybWF0PXtPcmlnaW5hbDonb3JpZ2luYWwnLE5pY2tuYW1lOiduaWNrbmFtZScsSEVYOidoZXgnLFNob3J0SEVYOidzaG9ydGhleCcsSEVYQTonaGV4YScsU2hvcnRIRVhBOidzaG9ydGhleGEnLFJHQjoncmdiJyxSR0JBOidyZ2JhJyxIU0w6J2hzbCcsSFNMQTonaHNsYSd9O0NvbW1vbi5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEE9WzAsMCwwLDBdO0NvbW1vbi5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvLl9ibGVuZGVkRmc9WzAsMCwwLDBdO0NvbW1vbi5Db2xvci5OaWNrbmFtZXM9eydhbGljZWJsdWUnOlsyNDAsMjQ4LDI1NV0sJ2FudGlxdWV3aGl0ZSc6WzI1MCwyMzUsMjE1XSwnYXF1YSc6WzAsMjU1LDI1NV0sJ2FxdWFtYXJpbmUnOlsxMjcsMjU1LDIxMl0sJ2F6dXJlJzpbMjQwLDI1NSwyNTVdLCdiZWlnZSc6WzI0NSwyNDUsMjIwXSwnYmlzcXVlJzpbMjU1LDIyOCwxOTZdLCdibGFjayc6WzAsMCwwXSwnYmxhbmNoZWRhbG1vbmQnOlsyNTUsMjM1LDIwNV0sJ2JsdWUnOlswLDAsMjU1XSwnYmx1ZXZpb2xldCc6WzEzOCw0MywyMjZdLCdicm93bic6WzE2NSw0Miw0Ml0sJ2J1cmx5d29vZCc6WzIyMiwxODQsMTM1XSwnY2FkZXRibHVlJzpbOTUsMTU4LDE2MF0sJ2NoYXJ0cmV1c2UnOlsxMjcsMjU1LDBdLCdjaG9jb2xhdGUnOlsyMTAsMTA1LDMwXSwnY29yYWwnOlsyNTUsMTI3LDgwXSwnY29ybmZsb3dlcmJsdWUnOlsxMDAsMTQ5LDIzN10sJ2Nvcm5zaWxrJzpbMjU1LDI0OCwyMjBdLCdjcmltc29uJzpbMjM3LDIwLDYxXSwnY3lhbic6WzAsMjU1LDI1NV0sJ2RhcmtibHVlJzpbMCwwLDEzOV0sJ2RhcmtjeWFuJzpbMCwxMzksMTM5XSwnZGFya2dvbGRlbnJvZCc6WzE4NCwxMzQsMTFdLCdkYXJrZ3JheSc6WzE2OSwxNjksMTY5XSwnZGFya2dyZXknOlsxNjksMTY5LDE2OV0sJ2RhcmtncmVlbic6WzAsMTAwLDBdLCdkYXJra2hha2knOlsxODksMTgzLDEwN10sJ2RhcmttYWdlbnRhJzpbMTM5LDAsMTM5XSwnZGFya29saXZlZ3JlZW4nOls4NSwxMDcsNDddLCdkYXJrb3JhbmdlJzpbMjU1LDE0MCwwXSwnZGFya29yY2hpZCc6WzE1Myw1MCwyMDRdLCdkYXJrcmVkJzpbMTM5LDAsMF0sJ2RhcmtzYWxtb24nOlsyMzMsMTUwLDEyMl0sJ2RhcmtzZWFncmVlbic6WzE0MywxODgsMTQzXSwnZGFya3NsYXRlYmx1ZSc6WzcyLDYxLDEzOV0sJ2RhcmtzbGF0ZWdyYXknOls0Nyw3OSw3OV0sJ2RhcmtzbGF0ZWdyZXknOls0Nyw3OSw3OV0sJ2Rhcmt0dXJxdW9pc2UnOlswLDIwNiwyMDldLCdkYXJrdmlvbGV0JzpbMTQ4LDAsMjExXSwnZGVlcHBpbmsnOlsyNTUsMjAsMTQ3XSwnZGVlcHNreWJsdWUnOlswLDE5MSwyNTVdLCdkaW1ncmF5JzpbMTA1LDEwNSwxMDVdLCdkaW1ncmV5JzpbMTA1LDEwNSwxMDVdLCdkb2RnZXJibHVlJzpbMzAsMTQ0LDI1NV0sJ2ZpcmVicmljayc6WzE3OCwzNCwzNF0sJ2Zsb3JhbHdoaXRlJzpbMjU1LDI1MCwyNDBdLCdmb3Jlc3RncmVlbic6WzM0LDEzOSwzNF0sJ2Z1Y2hzaWEnOlsyNTUsMCwyNTVdLCdnYWluc2Jvcm8nOlsyMjAsMjIwLDIyMF0sJ2dob3N0d2hpdGUnOlsyNDgsMjQ4LDI1NV0sJ2dvbGQnOlsyNTUsMjE1LDBdLCdnb2xkZW5yb2QnOlsyMTgsMTY1LDMyXSwnZ3JheSc6WzEyOCwxMjgsMTI4XSwnZ3JleSc6WzEyOCwxMjgsMTI4XSwnZ3JlZW4nOlswLDEyOCwwXSwnZ3JlZW55ZWxsb3cnOlsxNzMsMjU1LDQ3XSwnaG9uZXlkZXcnOlsyNDAsMjU1LDI0MF0sJ2hvdHBpbmsnOlsyNTUsMTA1LDE4MF0sJ2luZGlhbnJlZCc6WzIwNSw5Miw5Ml0sJ2luZGlnbyc6Wzc1LDAsMTMwXSwnaXZvcnknOlsyNTUsMjU1LDI0MF0sJ2toYWtpJzpbMjQwLDIzMCwxNDBdLCdsYXZlbmRlcic6WzIzMCwyMzAsMjUwXSwnbGF2ZW5kZXJibHVzaCc6WzI1NSwyNDAsMjQ1XSwnbGF3bmdyZWVuJzpbMTI0LDI1MiwwXSwnbGVtb25jaGlmZm9uJzpbMjU1LDI1MCwyMDVdLCdsaWdodGJsdWUnOlsxNzMsMjE2LDIzMF0sJ2xpZ2h0Y29yYWwnOlsyNDAsMTI4LDEyOF0sJ2xpZ2h0Y3lhbic6WzIyNCwyNTUsMjU1XSwnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOlsyNTAsMjUwLDIxMF0sJ2xpZ2h0Z3JlZW4nOlsxNDQsMjM4LDE0NF0sJ2xpZ2h0Z3JheSc6WzIxMSwyMTEsMjExXSwnbGlnaHRncmV5JzpbMjExLDIxMSwyMTFdLCdsaWdodHBpbmsnOlsyNTUsMTgyLDE5M10sJ2xpZ2h0c2FsbW9uJzpbMjU1LDE2MCwxMjJdLCdsaWdodHNlYWdyZWVuJzpbMzIsMTc4LDE3MF0sJ2xpZ2h0c2t5Ymx1ZSc6WzEzNSwyMDYsMjUwXSwnbGlnaHRzbGF0ZWdyYXknOlsxMTksMTM2LDE1M10sJ2xpZ2h0c2xhdGVncmV5JzpbMTE5LDEzNiwxNTNdLCdsaWdodHN0ZWVsYmx1ZSc6WzE3NiwxOTYsMjIyXSwnbGlnaHR5ZWxsb3cnOlsyNTUsMjU1LDIyNF0sJ2xpbWUnOlswLDI1NSwwXSwnbGltZWdyZWVuJzpbNTAsMjA1LDUwXSwnbGluZW4nOlsyNTAsMjQwLDIzMF0sJ21hZ2VudGEnOlsyNTUsMCwyNTVdLCdtYXJvb24nOlsxMjgsMCwwXSwnbWVkaXVtYXF1YW1hcmluZSc6WzEwMiwyMDUsMTcwXSwnbWVkaXVtYmx1ZSc6WzAsMCwyMDVdLCdtZWRpdW1vcmNoaWQnOlsxODYsODUsMjExXSwnbWVkaXVtcHVycGxlJzpbMTQ3LDExMiwyMTldLCdtZWRpdW1zZWFncmVlbic6WzYwLDE3OSwxMTNdLCdtZWRpdW1zbGF0ZWJsdWUnOlsxMjMsMTA0LDIzOF0sJ21lZGl1bXNwcmluZ2dyZWVuJzpbMCwyNTAsMTU0XSwnbWVkaXVtdHVycXVvaXNlJzpbNzIsMjA5LDIwNF0sJ21lZGl1bXZpb2xldHJlZCc6WzE5OSwyMSwxMzNdLCdtaWRuaWdodGJsdWUnOlsyNSwyNSwxMTJdLCdtaW50Y3JlYW0nOlsyNDUsMjU1LDI1MF0sJ21pc3R5cm9zZSc6WzI1NSwyMjgsMjI1XSwnbW9jY2FzaW4nOlsyNTUsMjI4LDE4MV0sJ25hdmFqb3doaXRlJzpbMjU1LDIyMiwxNzNdLCduYXZ5JzpbMCwwLDEyOF0sJ29sZGxhY2UnOlsyNTMsMjQ1LDIzMF0sJ29saXZlJzpbMTI4LDEyOCwwXSwnb2xpdmVkcmFiJzpbMTA3LDE0MiwzNV0sJ29yYW5nZSc6WzI1NSwxNjUsMF0sJ29yYW5nZXJlZCc6WzI1NSw2OSwwXSwnb3JjaGlkJzpbMjE4LDExMiwyMTRdLCdwYWxlZ29sZGVucm9kJzpbMjM4LDIzMiwxNzBdLCdwYWxlZ3JlZW4nOlsxNTIsMjUxLDE1Ml0sJ3BhbGV0dXJxdW9pc2UnOlsxNzUsMjM4LDIzOF0sJ3BhbGV2aW9sZXRyZWQnOlsyMTksMTEyLDE0N10sJ3BhcGF5YXdoaXAnOlsyNTUsMjM5LDIxM10sJ3BlYWNocHVmZic6WzI1NSwyMTgsMTg1XSwncGVydSc6WzIwNSwxMzMsNjNdLCdwaW5rJzpbMjU1LDE5MiwyMDNdLCdwbHVtJzpbMjIxLDE2MCwyMjFdLCdwb3dkZXJibHVlJzpbMTc2LDIyNCwyMzBdLCdwdXJwbGUnOlsxMjgsMCwxMjhdLCdyZWJlY2NhcHVycGxlJzpbMTAyLDUxLDE1M10sJ3JlZCc6WzI1NSwwLDBdLCdyb3N5YnJvd24nOlsxODgsMTQzLDE0M10sJ3JveWFsYmx1ZSc6WzY1LDEwNSwyMjVdLCdzYWRkbGVicm93bic6WzEzOSw2OSwxOV0sJ3NhbG1vbic6WzI1MCwxMjgsMTE0XSwnc2FuZHlicm93bic6WzI0NCwxNjQsOTZdLCdzZWFncmVlbic6WzQ2LDEzOSw4N10sJ3NlYXNoZWxsJzpbMjU1LDI0NSwyMzhdLCdzaWVubmEnOlsxNjAsODIsNDVdLCdzaWx2ZXInOlsxOTIsMTkyLDE5Ml0sJ3NreWJsdWUnOlsxMzUsMjA2LDIzNV0sJ3NsYXRlYmx1ZSc6WzEwNiw5MCwyMDVdLCdzbGF0ZWdyYXknOlsxMTIsMTI4LDE0NF0sJ3NsYXRlZ3JleSc6WzExMiwxMjgsMTQ0XSwnc25vdyc6WzI1NSwyNTAsMjUwXSwnc3ByaW5nZ3JlZW4nOlswLDI1NSwxMjddLCdzdGVlbGJsdWUnOls3MCwxMzAsMTgwXSwndGFuJzpbMjEwLDE4MCwxNDBdLCd0ZWFsJzpbMCwxMjgsMTI4XSwndGhpc3RsZSc6WzIxNiwxOTEsMjE2XSwndG9tYXRvJzpbMjU1LDk5LDcxXSwndHVycXVvaXNlJzpbNjQsMjI0LDIwOF0sJ3Zpb2xldCc6WzIzOCwxMzAsMjM4XSwnd2hlYXQnOlsyNDUsMjIyLDE3OV0sJ3doaXRlJzpbMjU1LDI1NSwyNTVdLCd3aGl0ZXNtb2tlJzpbMjQ1LDI0NSwyNDVdLCd5ZWxsb3cnOlsyNTUsMjU1LDBdLCd5ZWxsb3dncmVlbic6WzE1NCwyMDUsNTBdLCd0cmFuc3BhcmVudCc6WzAsMCwwLDBdLH07Q29tbW9uLkNvbG9yLlBhZ2VIaWdobGlnaHQ9e0NvbnRlbnQ6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFsxMTEsMTY4LDIyMCwuNjZdKSxDb250ZW50TGlnaHQ6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFsxMTEsMTY4LDIyMCwuNV0pLENvbnRlbnRPdXRsaW5lOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbOSw4MywxNDhdKSxQYWRkaW5nOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMTQ3LDE5NiwxMjUsLjU1XSksUGFkZGluZ0xpZ2h0OkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMTQ3LDE5NiwxMjUsLjRdKSxCb3JkZXI6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFsyNTUsMjI5LDE1MywuNjZdKSxCb3JkZXJMaWdodDpDb21tb24uQ29sb3IuZnJvbVJHQkEoWzI1NSwyMjksMTUzLC41XSksTWFyZ2luOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMjQ2LDE3OCwxMDcsLjY2XSksTWFyZ2luTGlnaHQ6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFsyNDYsMTc4LDEwNywuNV0pLEV2ZW50VGFyZ2V0OkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMjU1LDE5NiwxOTYsLjY2XSksU2hhcGU6Q29tbW9uLkNvbG9yLmZyb21SR0JBKFs5Niw4MiwxNzcsMC44XSksU2hhcGVNYXJnaW46Q29tbW9uLkNvbG9yLmZyb21SR0JBKFs5Niw4MiwxMjcsLjZdKSxDc3NHcmlkOkNvbW1vbi5Db2xvci5mcm9tUkdCQShbMHg0YiwwLDB4ODIsMV0pfTtDb21tb24uQ29sb3IuR2VuZXJhdG9yPWNsYXNze2NvbnN0cnVjdG9yKGh1ZVNwYWNlLHNhdFNwYWNlLGxpZ2h0bmVzc1NwYWNlLGFscGhhU3BhY2Upe3RoaXMuX2h1ZVNwYWNlPWh1ZVNwYWNlfHx7bWluOjAsbWF4OjM2MH07dGhpcy5fc2F0U3BhY2U9c2F0U3BhY2V8fDY3O3RoaXMuX2xpZ2h0bmVzc1NwYWNlPWxpZ2h0bmVzc1NwYWNlfHw4MDt0aGlzLl9hbHBoYVNwYWNlPWFscGhhU3BhY2V8fDE7dGhpcy5fY29sb3JzPW5ldyBNYXAoKTt9CnNldENvbG9yRm9ySUQoaWQsY29sb3Ipe3RoaXMuX2NvbG9ycy5zZXQoaWQsY29sb3IpO30KY29sb3JGb3JJRChpZCl7bGV0IGNvbG9yPXRoaXMuX2NvbG9ycy5nZXQoaWQpO2lmKCFjb2xvcil7Y29sb3I9dGhpcy5fZ2VuZXJhdGVDb2xvckZvcklEKGlkKTt0aGlzLl9jb2xvcnMuc2V0KGlkLGNvbG9yKTt9CnJldHVybiBjb2xvcjt9Cl9nZW5lcmF0ZUNvbG9yRm9ySUQoaWQpe2NvbnN0IGhhc2g9U3RyaW5nLmhhc2hDb2RlKGlkKTtjb25zdCBoPXRoaXMuX2luZGV4VG9WYWx1ZUluU3BhY2UoaGFzaCx0aGlzLl9odWVTcGFjZSk7Y29uc3Qgcz10aGlzLl9pbmRleFRvVmFsdWVJblNwYWNlKGhhc2g+PjgsdGhpcy5fc2F0U3BhY2UpO2NvbnN0IGw9dGhpcy5faW5kZXhUb1ZhbHVlSW5TcGFjZShoYXNoPj4xNix0aGlzLl9saWdodG5lc3NTcGFjZSk7Y29uc3QgYT10aGlzLl9pbmRleFRvVmFsdWVJblNwYWNlKGhhc2g+PjI0LHRoaXMuX2FscGhhU3BhY2UpO3JldHVybmBoc2xhKCR7aH0sICR7c30lLCAke2x9JSwgJHthfSlgO30KX2luZGV4VG9WYWx1ZUluU3BhY2UoaW5kZXgsc3BhY2Upe2lmKHR5cGVvZiBzcGFjZT09PSdudW1iZXInKQpyZXR1cm4gc3BhY2U7Y29uc3QgY291bnQ9c3BhY2UuY291bnR8fHNwYWNlLm1heC1zcGFjZS5taW47aW5kZXglPWNvdW50O3JldHVybiBzcGFjZS5taW4rTWF0aC5mbG9vcihpbmRleC8oY291bnQtMSkqKHNwYWNlLm1heC1zcGFjZS5taW4pKTt9fTs7Q29tbW9uLkNvbnNvbGU9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9tZXNzYWdlcz1bXTt9CmFkZE1lc3NhZ2UodGV4dCxsZXZlbCxzaG93KXtjb25zdCBtZXNzYWdlPW5ldyBDb21tb24uQ29uc29sZS5NZXNzYWdlKHRleHQsbGV2ZWx8fENvbW1vbi5Db25zb2xlLk1lc3NhZ2VMZXZlbC5JbmZvLERhdGUubm93KCksc2hvd3x8ZmFsc2UpO3RoaXMuX21lc3NhZ2VzLnB1c2gobWVzc2FnZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29tbW9uLkNvbnNvbGUuRXZlbnRzLk1lc3NhZ2VBZGRlZCxtZXNzYWdlKTt9CmxvZyh0ZXh0KXt0aGlzLmFkZE1lc3NhZ2UodGV4dCxDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuSW5mbyk7fQp3YXJuKHRleHQpe3RoaXMuYWRkTWVzc2FnZSh0ZXh0LENvbW1vbi5Db25zb2xlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nKTt9CmVycm9yKHRleHQpe3RoaXMuYWRkTWVzc2FnZSh0ZXh0LENvbW1vbi5Db25zb2xlLk1lc3NhZ2VMZXZlbC5FcnJvcix0cnVlKTt9Cm1lc3NhZ2VzKCl7cmV0dXJuIHRoaXMuX21lc3NhZ2VzO30Kc2hvdygpe3RoaXMuc2hvd1Byb21pc2UoKTt9CnNob3dQcm9taXNlKCl7cmV0dXJuIENvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcyk7fX07Q29tbW9uLkNvbnNvbGUuRXZlbnRzPXtNZXNzYWdlQWRkZWQ6U3ltYm9sKCdtZXNzYWdlQWRkZWQnKX07Q29tbW9uLkNvbnNvbGUuTWVzc2FnZUxldmVsPXtJbmZvOidpbmZvJyxXYXJuaW5nOid3YXJuaW5nJyxFcnJvcjonZXJyb3InfTtDb21tb24uQ29uc29sZS5NZXNzYWdlPWNsYXNze2NvbnN0cnVjdG9yKHRleHQsbGV2ZWwsdGltZXN0YW1wLHNob3cpe3RoaXMudGV4dD10ZXh0O3RoaXMubGV2ZWw9bGV2ZWw7dGhpcy50aW1lc3RhbXA9KHR5cGVvZiB0aW1lc3RhbXA9PT0nbnVtYmVyJyk/dGltZXN0YW1wOkRhdGUubm93KCk7dGhpcy5zaG93PXNob3c7fX07Q29tbW9uLmNvbnNvbGU9bmV3IENvbW1vbi5Db25zb2xlKCk7O0NvbW1vbi5Db250ZW50UHJvdmlkZXI9ZnVuY3Rpb24oKXt9O0NvbW1vbi5Db250ZW50UHJvdmlkZXIucHJvdG90eXBlPXtjb250ZW50VVJMKCl7fSxjb250ZW50VHlwZSgpe30sY29udGVudEVuY29kZWQoKXt9LHJlcXVlc3RDb250ZW50KCl7fSxzZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXt9fTtDb21tb24uQ29udGVudFByb3ZpZGVyLlNlYXJjaE1hdGNoPWNsYXNze2NvbnN0cnVjdG9yKGxpbmVOdW1iZXIsbGluZUNvbnRlbnQpe3RoaXMubGluZU51bWJlcj1saW5lTnVtYmVyO3RoaXMubGluZUNvbnRlbnQ9bGluZUNvbnRlbnQ7fX07Q29tbW9uLkNvbnRlbnRQcm92aWRlci5wZXJmb3JtU2VhcmNoSW5Db250ZW50PWZ1bmN0aW9uKGNvbnRlbnQscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCByZWdleD1jcmVhdGVTZWFyY2hSZWdleChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpO2NvbnN0IHRleHQ9bmV3IFRleHRVdGlscy5UZXh0KGNvbnRlbnQpO2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHRleHQubGluZUNvdW50KCk7KytpKXtjb25zdCBsaW5lQ29udGVudD10ZXh0LmxpbmVBdChpKTtyZWdleC5sYXN0SW5kZXg9MDtpZihyZWdleC5leGVjKGxpbmVDb250ZW50KSkKcmVzdWx0LnB1c2gobmV3IENvbW1vbi5Db250ZW50UHJvdmlkZXIuU2VhcmNoTWF0Y2goaSxsaW5lQ29udGVudCkpO30KcmV0dXJuIHJlc3VsdDt9O0NvbW1vbi5Db250ZW50UHJvdmlkZXIuY29udGVudEFzRGF0YVVSTD1mdW5jdGlvbihjb250ZW50LG1pbWVUeXBlLGNvbnRlbnRFbmNvZGVkLGNoYXJzZXQpe2NvbnN0IG1heERhdGFVcmxTaXplPTEwMjQqMTAyNDtpZihjb250ZW50PT09bnVsbHx8Y29udGVudC5sZW5ndGg+bWF4RGF0YVVybFNpemUpCnJldHVybiBudWxsO3JldHVybidkYXRhOicrbWltZVR5cGUrKGNoYXJzZXQ/JztjaGFyc2V0PScrY2hhcnNldDonJykrKGNvbnRlbnRFbmNvZGVkPyc7YmFzZTY0JzonJykrJywnKwpjb250ZW50O307O0NvbW1vbi5QYXJzZWRVUkw9Y2xhc3N7Y29uc3RydWN0b3IodXJsKXt0aGlzLmlzVmFsaWQ9ZmFsc2U7dGhpcy51cmw9dXJsO3RoaXMuc2NoZW1lPScnO3RoaXMudXNlcj0nJzt0aGlzLmhvc3Q9Jyc7dGhpcy5wb3J0PScnO3RoaXMucGF0aD0nJzt0aGlzLnF1ZXJ5UGFyYW1zPScnO3RoaXMuZnJhZ21lbnQ9Jyc7dGhpcy5mb2xkZXJQYXRoQ29tcG9uZW50cz0nJzt0aGlzLmxhc3RQYXRoQ29tcG9uZW50PScnO2NvbnN0IG1hdGNoPXVybC5tYXRjaChDb21tb24uUGFyc2VkVVJMLl91cmxSZWdleCgpKTtpZihtYXRjaCl7dGhpcy5pc1ZhbGlkPXRydWU7dGhpcy5zY2hlbWU9bWF0Y2hbMl0udG9Mb3dlckNhc2UoKTt0aGlzLnVzZXI9bWF0Y2hbM107dGhpcy5ob3N0PW1hdGNoWzRdO3RoaXMucG9ydD1tYXRjaFs1XTt0aGlzLnBhdGg9bWF0Y2hbNl18fCcvJzt0aGlzLnF1ZXJ5UGFyYW1zPW1hdGNoWzddfHwnJzt0aGlzLmZyYWdtZW50PW1hdGNoWzhdO31lbHNle2lmKHRoaXMudXJsLnN0YXJ0c1dpdGgoJ2RhdGE6Jykpe3RoaXMuc2NoZW1lPSdkYXRhJztyZXR1cm47fQppZih0aGlzLnVybD09PSdhYm91dDpibGFuaycpe3RoaXMuc2NoZW1lPSdhYm91dCc7cmV0dXJuO30KdGhpcy5wYXRoPXRoaXMudXJsO30KY29uc3QgbGFzdFNsYXNoSW5kZXg9dGhpcy5wYXRoLmxhc3RJbmRleE9mKCcvJyk7aWYobGFzdFNsYXNoSW5kZXghPT0tMSl7dGhpcy5mb2xkZXJQYXRoQ29tcG9uZW50cz10aGlzLnBhdGguc3Vic3RyaW5nKDAsbGFzdFNsYXNoSW5kZXgpO3RoaXMubGFzdFBhdGhDb21wb25lbnQ9dGhpcy5wYXRoLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCsxKTt9ZWxzZXt0aGlzLmxhc3RQYXRoQ29tcG9uZW50PXRoaXMucGF0aDt9fQpzdGF0aWMgcGxhdGZvcm1QYXRoVG9VUkwoZmlsZVN5c3RlbVBhdGgpe2ZpbGVTeXN0ZW1QYXRoPWZpbGVTeXN0ZW1QYXRoLnJlcGxhY2UoL1xcL2csJy8nKTtpZighZmlsZVN5c3RlbVBhdGguc3RhcnRzV2l0aCgnZmlsZTovLycpKXtpZihmaWxlU3lzdGVtUGF0aC5zdGFydHNXaXRoKCcvJykpCmZpbGVTeXN0ZW1QYXRoPSdmaWxlOi8vJytmaWxlU3lzdGVtUGF0aDtlbHNlCmZpbGVTeXN0ZW1QYXRoPSdmaWxlOi8vLycrZmlsZVN5c3RlbVBhdGg7fQpyZXR1cm4gZmlsZVN5c3RlbVBhdGg7fQpzdGF0aWMgdXJsVG9QbGF0Zm9ybVBhdGgoZmlsZVVSTCxpc1dpbmRvd3Mpe2NvbnNvbGUuYXNzZXJ0KGZpbGVVUkwuc3RhcnRzV2l0aCgnZmlsZTovLycpLCdUaGlzIG11c3QgYmUgYSBmaWxlIFVSTC4nKTtpZihpc1dpbmRvd3MpCnJldHVybiBmaWxlVVJMLnN1YnN0cignZmlsZTovLy8nLmxlbmd0aCkucmVwbGFjZSgvXC8vZywnXFwnKTtyZXR1cm4gZmlsZVVSTC5zdWJzdHIoJ2ZpbGU6Ly8nLmxlbmd0aCk7fQpzdGF0aWMgdXJsV2l0aG91dEhhc2godXJsKXtjb25zdCBoYXNoSW5kZXg9dXJsLmluZGV4T2YoJyMnKTtpZihoYXNoSW5kZXghPT0tMSkKcmV0dXJuIHVybC5zdWJzdHIoMCxoYXNoSW5kZXgpO3JldHVybiB1cmw7fQpzdGF0aWMgX3VybFJlZ2V4KCl7aWYoQ29tbW9uLlBhcnNlZFVSTC5fdXJsUmVnZXhJbnN0YW5jZSkKcmV0dXJuIENvbW1vbi5QYXJzZWRVUkwuX3VybFJlZ2V4SW5zdGFuY2U7Y29uc3Qgc2NoZW1lUmVnZXg9LyhbQS1aYS16XVtBLVphLXowLTkrLi1dKik6XC9cLy87Y29uc3QgdXNlclJlZ2V4PS8oPzooW0EtWmEtejAtOVwtLl9+JSEkJicoKSorLDs9Ol0qKUApPy87Y29uc3QgaG9zdFJlZ2V4PS8oKD86XFs6OlxkP1xdKXwoPzpbXlxzXC86XSopKS87Y29uc3QgcG9ydFJlZ2V4PS8oPzo6KFtcZF0rKSk/Lztjb25zdCBwYXRoUmVnZXg9LyhcL1teIz9dKik/Lztjb25zdCBxdWVyeVJlZ2V4PS8oPzpcPyhbXiNdKikpPy87Y29uc3QgZnJhZ21lbnRSZWdleD0vKD86IyguKikpPy87Q29tbW9uLlBhcnNlZFVSTC5fdXJsUmVnZXhJbnN0YW5jZT1uZXcgUmVnRXhwKCdeKCcrc2NoZW1lUmVnZXguc291cmNlK3VzZXJSZWdleC5zb3VyY2UraG9zdFJlZ2V4LnNvdXJjZStwb3J0UmVnZXguc291cmNlKycpJytwYXRoUmVnZXguc291cmNlKwpxdWVyeVJlZ2V4LnNvdXJjZStmcmFnbWVudFJlZ2V4LnNvdXJjZSsnJCcpO3JldHVybiBDb21tb24uUGFyc2VkVVJMLl91cmxSZWdleEluc3RhbmNlO30Kc3RhdGljIGV4dHJhY3RQYXRoKHVybCl7Y29uc3QgcGFyc2VkVVJMPXVybC5hc1BhcnNlZFVSTCgpO3JldHVybiBwYXJzZWRVUkw/cGFyc2VkVVJMLnBhdGg6Jyc7fQpzdGF0aWMgZXh0cmFjdE9yaWdpbih1cmwpe2NvbnN0IHBhcnNlZFVSTD11cmwuYXNQYXJzZWRVUkwoKTtyZXR1cm4gcGFyc2VkVVJMP3BhcnNlZFVSTC5zZWN1cml0eU9yaWdpbigpOicnO30Kc3RhdGljIGV4dHJhY3RFeHRlbnNpb24odXJsKXt1cmw9Q29tbW9uLlBhcnNlZFVSTC51cmxXaXRob3V0SGFzaCh1cmwpO2NvbnN0IGluZGV4T2ZRdWVzdGlvbk1hcms9dXJsLmluZGV4T2YoJz8nKTtpZihpbmRleE9mUXVlc3Rpb25NYXJrIT09LTEpCnVybD11cmwuc3Vic3RyKDAsaW5kZXhPZlF1ZXN0aW9uTWFyayk7Y29uc3QgbGFzdEluZGV4T2ZTbGFzaD11cmwubGFzdEluZGV4T2YoJy8nKTtpZihsYXN0SW5kZXhPZlNsYXNoIT09LTEpCnVybD11cmwuc3Vic3RyKGxhc3RJbmRleE9mU2xhc2grMSk7Y29uc3QgbGFzdEluZGV4T2ZEb3Q9dXJsLmxhc3RJbmRleE9mKCcuJyk7aWYobGFzdEluZGV4T2ZEb3QhPT0tMSl7dXJsPXVybC5zdWJzdHIobGFzdEluZGV4T2ZEb3QrMSk7Y29uc3QgbGFzdEluZGV4T2ZQZXJjZW50PXVybC5pbmRleE9mKCclJyk7aWYobGFzdEluZGV4T2ZQZXJjZW50IT09LTEpCnJldHVybiB1cmwuc3Vic3RyKDAsbGFzdEluZGV4T2ZQZXJjZW50KTtyZXR1cm4gdXJsO30KcmV0dXJuJyc7fQpzdGF0aWMgZXh0cmFjdE5hbWUodXJsKXtsZXQgaW5kZXg9dXJsLmxhc3RJbmRleE9mKCcvJyk7Y29uc3QgcGF0aEFuZFF1ZXJ5PWluZGV4IT09LTE/dXJsLnN1YnN0cihpbmRleCsxKTp1cmw7aW5kZXg9cGF0aEFuZFF1ZXJ5LmluZGV4T2YoJz8nKTtyZXR1cm4gaW5kZXg8MD9wYXRoQW5kUXVlcnk6cGF0aEFuZFF1ZXJ5LnN1YnN0cigwLGluZGV4KTt9CnN0YXRpYyBjb21wbGV0ZVVSTChiYXNlVVJMLGhyZWYpe2NvbnN0IHRyaW1tZWRIcmVmPWhyZWYudHJpbSgpO2lmKHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoJ2RhdGE6Jyl8fHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoJ2Jsb2I6Jyl8fHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykpCnJldHVybiBocmVmO2NvbnN0IHBhcnNlZEhyZWY9dHJpbW1lZEhyZWYuYXNQYXJzZWRVUkwoKTtpZihwYXJzZWRIcmVmJiZwYXJzZWRIcmVmLnNjaGVtZSkKcmV0dXJuIHRyaW1tZWRIcmVmO2NvbnN0IHBhcnNlZFVSTD1iYXNlVVJMLmFzUGFyc2VkVVJMKCk7aWYoIXBhcnNlZFVSTCkKcmV0dXJuIG51bGw7aWYocGFyc2VkVVJMLmlzRGF0YVVSTCgpKQpyZXR1cm4gaHJlZjtpZihocmVmLmxlbmd0aD4xJiZocmVmLmNoYXJBdCgwKT09PScvJyYmaHJlZi5jaGFyQXQoMSk9PT0nLycpe3JldHVybiBwYXJzZWRVUkwuc2NoZW1lKyc6JytocmVmO30KY29uc3Qgc2VjdXJpdHlPcmlnaW49cGFyc2VkVVJMLnNlY3VyaXR5T3JpZ2luKCk7Y29uc3QgcGF0aFRleHQ9cGFyc2VkVVJMLnBhdGg7Y29uc3QgcXVlcnlUZXh0PXBhcnNlZFVSTC5xdWVyeVBhcmFtcz8nPycrcGFyc2VkVVJMLnF1ZXJ5UGFyYW1zOicnO2lmKCFocmVmLmxlbmd0aCkKcmV0dXJuIHNlY3VyaXR5T3JpZ2luK3BhdGhUZXh0K3F1ZXJ5VGV4dDtpZihocmVmLmNoYXJBdCgwKT09PScjJykKcmV0dXJuIHNlY3VyaXR5T3JpZ2luK3BhdGhUZXh0K3F1ZXJ5VGV4dCtocmVmO2lmKGhyZWYuY2hhckF0KDApPT09Jz8nKQpyZXR1cm4gc2VjdXJpdHlPcmlnaW4rcGF0aFRleHQraHJlZjtsZXQgaHJlZlBhdGg9aHJlZi5tYXRjaCgvXlteIz9dKi8pWzBdO2NvbnN0IGhyZWZTdWZmaXg9aHJlZi5zdWJzdHJpbmcoaHJlZlBhdGgubGVuZ3RoKTtpZihocmVmUGF0aC5jaGFyQXQoMCkhPT0nLycpCmhyZWZQYXRoPXBhcnNlZFVSTC5mb2xkZXJQYXRoQ29tcG9uZW50cysnLycraHJlZlBhdGg7cmV0dXJuIHNlY3VyaXR5T3JpZ2luK1J1bnRpbWUubm9ybWFsaXplUGF0aChocmVmUGF0aCkraHJlZlN1ZmZpeDt9CnN0YXRpYyBzcGxpdExpbmVBbmRDb2x1bW4oc3RyaW5nKXtjb25zdCBiZWZvcmVQYXRoTWF0Y2g9c3RyaW5nLm1hdGNoKENvbW1vbi5QYXJzZWRVUkwuX3VybFJlZ2V4KCkpO2xldCBiZWZvcmVQYXRoPScnO2xldCBwYXRoQW5kQWZ0ZXI9c3RyaW5nO2lmKGJlZm9yZVBhdGhNYXRjaCl7YmVmb3JlUGF0aD1iZWZvcmVQYXRoTWF0Y2hbMV07cGF0aEFuZEFmdGVyPXN0cmluZy5zdWJzdHJpbmcoYmVmb3JlUGF0aE1hdGNoWzFdLmxlbmd0aCk7fQpjb25zdCBsaW5lQ29sdW1uUmVnRXg9Lyg/OjooXGQrKSk/KD86OihcZCspKT8kLztjb25zdCBsaW5lQ29sdW1uTWF0Y2g9bGluZUNvbHVtblJlZ0V4LmV4ZWMocGF0aEFuZEFmdGVyKTtsZXQgbGluZU51bWJlcjtsZXQgY29sdW1uTnVtYmVyO2NvbnNvbGUuYXNzZXJ0KGxpbmVDb2x1bW5NYXRjaCk7aWYodHlwZW9mKGxpbmVDb2x1bW5NYXRjaFsxXSk9PT0nc3RyaW5nJyl7bGluZU51bWJlcj1wYXJzZUludChsaW5lQ29sdW1uTWF0Y2hbMV0sMTApO2xpbmVOdW1iZXI9aXNOYU4obGluZU51bWJlcik/dW5kZWZpbmVkOmxpbmVOdW1iZXItMTt9CmlmKHR5cGVvZihsaW5lQ29sdW1uTWF0Y2hbMl0pPT09J3N0cmluZycpe2NvbHVtbk51bWJlcj1wYXJzZUludChsaW5lQ29sdW1uTWF0Y2hbMl0sMTApO2NvbHVtbk51bWJlcj1pc05hTihjb2x1bW5OdW1iZXIpP3VuZGVmaW5lZDpjb2x1bW5OdW1iZXItMTt9CnJldHVybnt1cmw6YmVmb3JlUGF0aCtwYXRoQW5kQWZ0ZXIuc3Vic3RyaW5nKDAscGF0aEFuZEFmdGVyLmxlbmd0aC1saW5lQ29sdW1uTWF0Y2hbMF0ubGVuZ3RoKSxsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNvbHVtbk51bWJlcn07fQpzdGF0aWMgaXNSZWxhdGl2ZVVSTCh1cmwpe3JldHVybiEoL15bQS1aYS16XVtBLVphLXowLTkrLi1dKjovLnRlc3QodXJsKSk7fQpnZXQgZGlzcGxheU5hbWUoKXtpZih0aGlzLl9kaXNwbGF5TmFtZSkKcmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lO2lmKHRoaXMuaXNEYXRhVVJMKCkpCnJldHVybiB0aGlzLmRhdGFVUkxEaXNwbGF5TmFtZSgpO2lmKHRoaXMuaXNBYm91dEJsYW5rKCkpCnJldHVybiB0aGlzLnVybDt0aGlzLl9kaXNwbGF5TmFtZT10aGlzLmxhc3RQYXRoQ29tcG9uZW50O2lmKCF0aGlzLl9kaXNwbGF5TmFtZSkKdGhpcy5fZGlzcGxheU5hbWU9KHRoaXMuaG9zdHx8JycpKycvJztpZih0aGlzLl9kaXNwbGF5TmFtZT09PScvJykKdGhpcy5fZGlzcGxheU5hbWU9dGhpcy51cmw7cmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lO30KZGF0YVVSTERpc3BsYXlOYW1lKCl7aWYodGhpcy5fZGF0YVVSTERpc3BsYXlOYW1lKQpyZXR1cm4gdGhpcy5fZGF0YVVSTERpc3BsYXlOYW1lO2lmKCF0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4nJzt0aGlzLl9kYXRhVVJMRGlzcGxheU5hbWU9dGhpcy51cmwudHJpbUVuZCgyMCk7cmV0dXJuIHRoaXMuX2RhdGFVUkxEaXNwbGF5TmFtZTt9CmlzQWJvdXRCbGFuaygpe3JldHVybiB0aGlzLnVybD09PSdhYm91dDpibGFuayc7fQppc0RhdGFVUkwoKXtyZXR1cm4gdGhpcy5zY2hlbWU9PT0nZGF0YSc7fQpsYXN0UGF0aENvbXBvbmVudFdpdGhGcmFnbWVudCgpe3JldHVybiB0aGlzLmxhc3RQYXRoQ29tcG9uZW50Kyh0aGlzLmZyYWdtZW50PycjJyt0aGlzLmZyYWdtZW50OicnKTt9CmRvbWFpbigpe2lmKHRoaXMuaXNEYXRhVVJMKCkpCnJldHVybidkYXRhOic7cmV0dXJuIHRoaXMuaG9zdCsodGhpcy5wb3J0Pyc6Jyt0aGlzLnBvcnQ6JycpO30Kc2VjdXJpdHlPcmlnaW4oKXtpZih0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4nZGF0YTonO3JldHVybiB0aGlzLnNjaGVtZSsnOi8vJyt0aGlzLmRvbWFpbigpO30KdXJsV2l0aG91dFNjaGVtZSgpe2lmKHRoaXMuc2NoZW1lJiZ0aGlzLnVybC5zdGFydHNXaXRoKHRoaXMuc2NoZW1lKyc6Ly8nKSkKcmV0dXJuIHRoaXMudXJsLnN1YnN0cmluZyh0aGlzLnNjaGVtZS5sZW5ndGgrMyk7cmV0dXJuIHRoaXMudXJsO319O1N0cmluZy5wcm90b3R5cGUuYXNQYXJzZWRVUkw9ZnVuY3Rpb24oKXtjb25zdCBwYXJzZWRVUkw9bmV3IENvbW1vbi5QYXJzZWRVUkwodGhpcy50b1N0cmluZygpKTtpZihwYXJzZWRVUkwuaXNWYWxpZCkKcmV0dXJuIHBhcnNlZFVSTDtyZXR1cm4gbnVsbDt9OztDb21tb24uUHJvZ3Jlc3M9ZnVuY3Rpb24oKXt9O0NvbW1vbi5Qcm9ncmVzcy5wcm90b3R5cGU9e3NldFRvdGFsV29yayh0b3RhbFdvcmspe30sc2V0VGl0bGUodGl0bGUpe30sc2V0V29ya2VkKHdvcmtlZCx0aXRsZSl7fSx3b3JrZWQod29ya2VkKXt9LGRvbmUoKXt9LGlzQ2FuY2VsZWQoKXtyZXR1cm4gZmFsc2U7fSx9O0NvbW1vbi5Db21wb3NpdGVQcm9ncmVzcz1jbGFzc3tjb25zdHJ1Y3RvcihwYXJlbnQpe3RoaXMuX3BhcmVudD1wYXJlbnQ7dGhpcy5fY2hpbGRyZW49W107dGhpcy5fY2hpbGRyZW5Eb25lPTA7dGhpcy5fcGFyZW50LnNldFRvdGFsV29yaygxKTt0aGlzLl9wYXJlbnQuc2V0V29ya2VkKDApO30KX2NoaWxkRG9uZSgpe2lmKCsrdGhpcy5fY2hpbGRyZW5Eb25lIT09dGhpcy5fY2hpbGRyZW4ubGVuZ3RoKQpyZXR1cm47dGhpcy5fcGFyZW50LmRvbmUoKTt9CmNyZWF0ZVN1YlByb2dyZXNzKHdlaWdodCl7Y29uc3QgY2hpbGQ9bmV3IENvbW1vbi5TdWJQcm9ncmVzcyh0aGlzLHdlaWdodCk7dGhpcy5fY2hpbGRyZW4ucHVzaChjaGlsZCk7cmV0dXJuIGNoaWxkO30KX3VwZGF0ZSgpe2xldCB0b3RhbFdlaWdodHM9MDtsZXQgZG9uZT0wO2ZvcihsZXQgaT0wO2k8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoOysraSl7Y29uc3QgY2hpbGQ9dGhpcy5fY2hpbGRyZW5baV07aWYoY2hpbGQuX3RvdGFsV29yaykKZG9uZSs9Y2hpbGQuX3dlaWdodCpjaGlsZC5fd29ya2VkL2NoaWxkLl90b3RhbFdvcms7dG90YWxXZWlnaHRzKz1jaGlsZC5fd2VpZ2h0O30KdGhpcy5fcGFyZW50LnNldFdvcmtlZChkb25lL3RvdGFsV2VpZ2h0cyk7fX07Q29tbW9uLlN1YlByb2dyZXNzPWNsYXNze2NvbnN0cnVjdG9yKGNvbXBvc2l0ZSx3ZWlnaHQpe3RoaXMuX2NvbXBvc2l0ZT1jb21wb3NpdGU7dGhpcy5fd2VpZ2h0PXdlaWdodHx8MTt0aGlzLl93b3JrZWQ9MDt9CmlzQ2FuY2VsZWQoKXtyZXR1cm4gdGhpcy5fY29tcG9zaXRlLl9wYXJlbnQuaXNDYW5jZWxlZCgpO30Kc2V0VGl0bGUodGl0bGUpe3RoaXMuX2NvbXBvc2l0ZS5fcGFyZW50LnNldFRpdGxlKHRpdGxlKTt9CmRvbmUoKXt0aGlzLnNldFdvcmtlZCh0aGlzLl90b3RhbFdvcmspO3RoaXMuX2NvbXBvc2l0ZS5fY2hpbGREb25lKCk7fQpzZXRUb3RhbFdvcmsodG90YWxXb3JrKXt0aGlzLl90b3RhbFdvcms9dG90YWxXb3JrO3RoaXMuX2NvbXBvc2l0ZS5fdXBkYXRlKCk7fQpzZXRXb3JrZWQod29ya2VkLHRpdGxlKXt0aGlzLl93b3JrZWQ9d29ya2VkO2lmKHR5cGVvZiB0aXRsZSE9PSd1bmRlZmluZWQnKQp0aGlzLnNldFRpdGxlKHRpdGxlKTt0aGlzLl9jb21wb3NpdGUuX3VwZGF0ZSgpO30Kd29ya2VkKHdvcmtlZCl7dGhpcy5zZXRXb3JrZWQodGhpcy5fd29ya2VkKyh3b3JrZWR8fDEpKTt9fTtDb21tb24uUHJvZ3Jlc3NQcm94eT1jbGFzc3tjb25zdHJ1Y3RvcihkZWxlZ2F0ZSxkb25lQ2FsbGJhY2spe3RoaXMuX2RlbGVnYXRlPWRlbGVnYXRlO3RoaXMuX2RvbmVDYWxsYmFjaz1kb25lQ2FsbGJhY2s7fQppc0NhbmNlbGVkKCl7cmV0dXJuIHRoaXMuX2RlbGVnYXRlP3RoaXMuX2RlbGVnYXRlLmlzQ2FuY2VsZWQoKTpmYWxzZTt9CnNldFRpdGxlKHRpdGxlKXtpZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUuc2V0VGl0bGUodGl0bGUpO30KZG9uZSgpe2lmKHRoaXMuX2RlbGVnYXRlKQp0aGlzLl9kZWxlZ2F0ZS5kb25lKCk7aWYodGhpcy5fZG9uZUNhbGxiYWNrKQp0aGlzLl9kb25lQ2FsbGJhY2soKTt9CnNldFRvdGFsV29yayh0b3RhbFdvcmspe2lmKHRoaXMuX2RlbGVnYXRlKQp0aGlzLl9kZWxlZ2F0ZS5zZXRUb3RhbFdvcmsodG90YWxXb3JrKTt9CnNldFdvcmtlZCh3b3JrZWQsdGl0bGUpe2lmKHRoaXMuX2RlbGVnYXRlKQp0aGlzLl9kZWxlZ2F0ZS5zZXRXb3JrZWQod29ya2VkLHRpdGxlKTt9CndvcmtlZCh3b3JrZWQpe2lmKHRoaXMuX2RlbGVnYXRlKQp0aGlzLl9kZWxlZ2F0ZS53b3JrZWQod29ya2VkKTt9fTs7Q29tbW9uLlJlc291cmNlVHlwZT1jbGFzc3tjb25zdHJ1Y3RvcihuYW1lLHRpdGxlLGNhdGVnb3J5LGlzVGV4dFR5cGUpe3RoaXMuX25hbWU9bmFtZTt0aGlzLl90aXRsZT10aXRsZTt0aGlzLl9jYXRlZ29yeT1jYXRlZ29yeTt0aGlzLl9pc1RleHRUeXBlPWlzVGV4dFR5cGU7fQpzdGF0aWMgZnJvbU1pbWVUeXBlKG1pbWVUeXBlKXtpZihtaW1lVHlwZS5zdGFydHNXaXRoKCd0ZXh0L2h0bWwnKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50O2lmKG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ3RleHQvY3NzJykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5TdHlsZXNoZWV0O2lmKG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2U7aWYobWltZVR5cGUuc3RhcnRzV2l0aCgndGV4dC8nKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdDtpZihtaW1lVHlwZS5pbmNsdWRlcygnZm9udCcpKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuRm9udDtpZihtaW1lVHlwZS5pbmNsdWRlcygnc2NyaXB0JykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5TY3JpcHQ7aWYobWltZVR5cGUuaW5jbHVkZXMoJ29jdGV0JykpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5PdGhlcjtpZihtaW1lVHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24nKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdDtyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXI7fQpzdGF0aWMgZnJvbVVSTCh1cmwpe3JldHVybiBDb21tb24uUmVzb3VyY2VUeXBlLl9yZXNvdXJjZVR5cGVCeUV4dGVuc2lvbi5nZXQoQ29tbW9uLlBhcnNlZFVSTC5leHRyYWN0RXh0ZW5zaW9uKHVybCkpfHxudWxsO30Kc3RhdGljIG1pbWVGcm9tVVJMKHVybCl7Y29uc3QgbmFtZT1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3ROYW1lKHVybCk7aWYoQ29tbW9uLlJlc291cmNlVHlwZS5fbWltZVR5cGVCeU5hbWUuaGFzKG5hbWUpKQpyZXR1cm4gQ29tbW9uLlJlc291cmNlVHlwZS5fbWltZVR5cGVCeU5hbWUuZ2V0KG5hbWUpO2NvbnN0IGV4dD1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpO3JldHVybiBDb21tb24uUmVzb3VyY2VUeXBlLl9taW1lVHlwZUJ5RXh0ZW5zaW9uLmdldChleHQpO30KbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lO30KdGl0bGUoKXtyZXR1cm4gdGhpcy5fdGl0bGU7fQpjYXRlZ29yeSgpe3JldHVybiB0aGlzLl9jYXRlZ29yeTt9CmlzVGV4dFR5cGUoKXtyZXR1cm4gdGhpcy5faXNUZXh0VHlwZTt9CmlzU2NyaXB0KCl7cmV0dXJuIHRoaXMuX25hbWU9PT0nc2NyaXB0J3x8dGhpcy5fbmFtZT09PSdzbS1zY3JpcHQnfHx0aGlzLl9uYW1lPT09J3NuaXBwZXQnO30KaGFzU2NyaXB0cygpe3JldHVybiB0aGlzLmlzU2NyaXB0KCl8fHRoaXMuaXNEb2N1bWVudCgpO30KaXNTdHlsZVNoZWV0KCl7cmV0dXJuIHRoaXMuX25hbWU9PT0nc3R5bGVzaGVldCd8fHRoaXMuX25hbWU9PT0nc20tc3R5bGVzaGVldCc7fQppc0RvY3VtZW50KCl7cmV0dXJuIHRoaXMuX25hbWU9PT0nZG9jdW1lbnQnO30KaXNEb2N1bWVudE9yU2NyaXB0T3JTdHlsZVNoZWV0KCl7cmV0dXJuIHRoaXMuaXNEb2N1bWVudCgpfHx0aGlzLmlzU2NyaXB0KCl8fHRoaXMuaXNTdHlsZVNoZWV0KCk7fQppc0Zyb21Tb3VyY2VNYXAoKXtyZXR1cm4gdGhpcy5fbmFtZS5zdGFydHNXaXRoKCdzbS0nKTt9CnRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX25hbWU7fQpjYW5vbmljYWxNaW1lVHlwZSgpe2lmKHRoaXMuaXNEb2N1bWVudCgpKQpyZXR1cm4ndGV4dC9odG1sJztpZih0aGlzLmlzU2NyaXB0KCkpCnJldHVybid0ZXh0L2phdmFzY3JpcHQnO2lmKHRoaXMuaXNTdHlsZVNoZWV0KCkpCnJldHVybid0ZXh0L2Nzcyc7cmV0dXJuJyc7fX07Q29tbW9uLlJlc291cmNlQ2F0ZWdvcnk9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGUsc2hvcnRUaXRsZSl7dGhpcy50aXRsZT10aXRsZTt0aGlzLnNob3J0VGl0bGU9c2hvcnRUaXRsZTt9fTtDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzPXtYSFI6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdYSFIgYW5kIEZldGNoJywnWEhSJyksU2NyaXB0Om5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnU2NyaXB0cycsJ0pTJyksU3R5bGVzaGVldDpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ1N0eWxlc2hlZXRzJywnQ1NTJyksSW1hZ2U6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdJbWFnZXMnLCdJbWcnKSxNZWRpYTpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ01lZGlhJywnTWVkaWEnKSxGb250Om5ldyBDb21tb24uUmVzb3VyY2VDYXRlZ29yeSgnRm9udHMnLCdGb250JyksRG9jdW1lbnQ6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdEb2N1bWVudHMnLCdEb2MnKSxXZWJTb2NrZXQ6bmV3IENvbW1vbi5SZXNvdXJjZUNhdGVnb3J5KCdXZWJTb2NrZXRzJywnV1MnKSxNYW5pZmVzdDpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ01hbmlmZXN0JywnTWFuaWZlc3QnKSxPdGhlcjpuZXcgQ29tbW9uLlJlc291cmNlQ2F0ZWdvcnkoJ090aGVyJywnT3RoZXInKX07Q29tbW9uLnJlc291cmNlVHlwZXM9e1hIUjpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgneGhyJywnWEhSJyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLlhIUix0cnVlKSxGZXRjaDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnZmV0Y2gnLCdGZXRjaCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5YSFIsdHJ1ZSksRXZlbnRTb3VyY2U6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ2V2ZW50c291cmNlJywnRXZlbnRTb3VyY2UnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuWEhSLHRydWUpLFNjcmlwdDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc2NyaXB0JywnU2NyaXB0JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLlNjcmlwdCx0cnVlKSxTbmlwcGV0Om5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdzbmlwcGV0JywnU25pcHBldCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5TY3JpcHQsdHJ1ZSksU3R5bGVzaGVldDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc3R5bGVzaGVldCcsJ1N0eWxlc2hlZXQnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuU3R5bGVzaGVldCx0cnVlKSxJbWFnZTpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnaW1hZ2UnLCdJbWFnZScsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5JbWFnZSxmYWxzZSksTWVkaWE6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ21lZGlhJywnTWVkaWEnLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuTWVkaWEsZmFsc2UpLEZvbnQ6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ2ZvbnQnLCdGb250JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLkZvbnQsZmFsc2UpLERvY3VtZW50Om5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdkb2N1bWVudCcsJ0RvY3VtZW50JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLkRvY3VtZW50LHRydWUpLFRleHRUcmFjazpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgndGV4dHRyYWNrJywnVGV4dFRyYWNrJyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLk90aGVyLHRydWUpLFdlYlNvY2tldDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnd2Vic29ja2V0JywnV2ViU29ja2V0JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLldlYlNvY2tldCxmYWxzZSksT3RoZXI6bmV3IENvbW1vbi5SZXNvdXJjZVR5cGUoJ290aGVyJywnT3RoZXInLENvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuT3RoZXIsZmFsc2UpLFNvdXJjZU1hcFNjcmlwdDpuZXcgQ29tbW9uLlJlc291cmNlVHlwZSgnc20tc2NyaXB0JywnU2NyaXB0JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLlNjcmlwdCx0cnVlKSxTb3VyY2VNYXBTdHlsZVNoZWV0Om5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdzbS1zdHlsZXNoZWV0JywnU3R5bGVzaGVldCcsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5TdHlsZXNoZWV0LHRydWUpLE1hbmlmZXN0Om5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdtYW5pZmVzdCcsJ01hbmlmZXN0JyxDb21tb24ucmVzb3VyY2VDYXRlZ29yaWVzLk1hbmlmZXN0LHRydWUpLFNpZ25lZEV4Y2hhbmdlOm5ldyBDb21tb24uUmVzb3VyY2VUeXBlKCdzaWduZWQtZXhjaGFuZ2UnLCdTaWduZWRFeGNoYW5nZScsQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcy5PdGhlcixmYWxzZSksfTtDb21tb24uUmVzb3VyY2VUeXBlLl9taW1lVHlwZUJ5TmFtZT1uZXcgTWFwKFtbJ0Nha2VmaWxlJywndGV4dC94LWNvZmZlZXNjcmlwdCddXSk7Q29tbW9uLlJlc291cmNlVHlwZS5fcmVzb3VyY2VUeXBlQnlFeHRlbnNpb249bmV3IE1hcChbWydqcycsQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0XSxbJ21qcycsQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0XSxbJ2NzcycsQ29tbW9uLnJlc291cmNlVHlwZXMuU3R5bGVzaGVldF0sWyd4c2wnLENvbW1vbi5yZXNvdXJjZVR5cGVzLlN0eWxlc2hlZXRdLFsnanBlZycsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsnanBnJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWydzdmcnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ2dpZicsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsncG5nJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWydpY28nLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ3RpZmYnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlXSxbJ3RpZicsQ29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2VdLFsnYm1wJyxDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZV0sWyd3ZWJwJyxDb21tb24ucmVzb3VyY2VUeXBlcy5NZWRpYV0sWyd0dGYnLENvbW1vbi5yZXNvdXJjZVR5cGVzLkZvbnRdLFsnb3RmJyxDb21tb24ucmVzb3VyY2VUeXBlcy5Gb250XSxbJ3R0YycsQ29tbW9uLnJlc291cmNlVHlwZXMuRm9udF0sWyd3b2ZmJyxDb21tb24ucmVzb3VyY2VUeXBlcy5Gb250XV0pO0NvbW1vbi5SZXNvdXJjZVR5cGUuX21pbWVUeXBlQnlFeHRlbnNpb249bmV3IE1hcChbWydqcycsJ3RleHQvamF2YXNjcmlwdCddLFsnbWpzJywndGV4dC9qYXZhc2NyaXB0J10sWydjc3MnLCd0ZXh0L2NzcyddLFsnaHRtbCcsJ3RleHQvaHRtbCddLFsnaHRtJywndGV4dC9odG1sJ10sWyd4bWwnLCdhcHBsaWNhdGlvbi94bWwnXSxbJ3hzbCcsJ2FwcGxpY2F0aW9uL3htbCddLFsnYXNwJywnYXBwbGljYXRpb24veC1hc3B4J10sWydhc3B4JywnYXBwbGljYXRpb24veC1hc3B4J10sWydqc3AnLCdhcHBsaWNhdGlvbi94LWpzcCddLFsnYycsJ3RleHQveC1jKytzcmMnXSxbJ2NjJywndGV4dC94LWMrK3NyYyddLFsnY3BwJywndGV4dC94LWMrK3NyYyddLFsnaCcsJ3RleHQveC1jKytzcmMnXSxbJ20nLCd0ZXh0L3gtYysrc3JjJ10sWydtbScsJ3RleHQveC1jKytzcmMnXSxbJ2NvZmZlZScsJ3RleHQveC1jb2ZmZWVzY3JpcHQnXSxbJ2RhcnQnLCd0ZXh0L2phdmFzY3JpcHQnXSxbJ3RzJywndGV4dC90eXBlc2NyaXB0J10sWyd0c3gnLCd0ZXh0L3R5cGVzY3JpcHQtanN4J10sWydqc29uJywnYXBwbGljYXRpb24vanNvbiddLFsnZ3lwJywnYXBwbGljYXRpb24vanNvbiddLFsnZ3lwaScsJ2FwcGxpY2F0aW9uL2pzb24nXSxbJ2NzJywndGV4dC94LWNzaGFycCddLFsnamF2YScsJ3RleHQveC1qYXZhJ10sWydsZXNzJywndGV4dC94LWxlc3MnXSxbJ3BocCcsJ3RleHQveC1waHAnXSxbJ3BodG1sJywnYXBwbGljYXRpb24veC1odHRwZC1waHAnXSxbJ3B5JywndGV4dC94LXB5dGhvbiddLFsnc2gnLCd0ZXh0L3gtc2gnXSxbJ3Njc3MnLCd0ZXh0L3gtc2NzcyddLFsndnR0JywndGV4dC92dHQnXSxbJ2xzJywndGV4dC94LWxpdmVzY3JpcHQnXSxbJ21kJywndGV4dC9tYXJrZG93biddLFsnY2xqcycsJ3RleHQveC1jbG9qdXJlJ10sWydjbGpjJywndGV4dC94LWNsb2p1cmUnXSxbJ2NsangnLCd0ZXh0L3gtY2xvanVyZSddLFsnc3R5bCcsJ3RleHQveC1zdHlsJ10sWydqc3gnLCd0ZXh0L2pzeCddLFsnanBlZycsJ2ltYWdlL2pwZWcnXSxbJ2pwZycsJ2ltYWdlL2pwZWcnXSxbJ3N2ZycsJ2ltYWdlL3N2Zyt4bWwnXSxbJ2dpZicsJ2ltYWdlL2dpZiddLFsnd2VicCcsJ2ltYWdlL3dlYnAnXSxbJ3BuZycsJ2ltYWdlL3BuZyddLFsnaWNvJywnaW1hZ2UvaWNvJ10sWyd0aWZmJywnaW1hZ2UvdGlmZiddLFsndGlmJywnaW1hZ2UvdGlmJ10sWydibXAnLCdpbWFnZS9ibXAnXSxbJ3R0ZicsJ2ZvbnQvb3BlbnR5cGUnXSxbJ290ZicsJ2ZvbnQvb3BlbnR5cGUnXSxbJ3R0YycsJ2ZvbnQvb3BlbnR5cGUnXSxbJ3dvZmYnLCdhcHBsaWNhdGlvbi9mb250LXdvZmYnXV0pOztDb21tb24uU2V0dGluZ3M9Y2xhc3N7Y29uc3RydWN0b3IoZ2xvYmFsU3RvcmFnZSxsb2NhbFN0b3JhZ2Upe3RoaXMuX2dsb2JhbFN0b3JhZ2U9Z2xvYmFsU3RvcmFnZTt0aGlzLl9sb2NhbFN0b3JhZ2U9bG9jYWxTdG9yYWdlO3RoaXMuX3Nlc3Npb25TdG9yYWdlPW5ldyBDb21tb24uU2V0dGluZ3NTdG9yYWdlKHt9KTt0aGlzLl9ldmVudFN1cHBvcnQ9bmV3IENvbW1vbi5PYmplY3QoKTt0aGlzLl9yZWdpc3RyeT1uZXcgTWFwKCk7dGhpcy5fbW9kdWxlU2V0dGluZ3M9bmV3IE1hcCgpO3NlbGYucnVudGltZS5leHRlbnNpb25zKCdzZXR0aW5nJykuZm9yRWFjaCh0aGlzLl9yZWdpc3Rlck1vZHVsZVNldHRpbmcuYmluZCh0aGlzKSk7fQpfcmVnaXN0ZXJNb2R1bGVTZXR0aW5nKGV4dGVuc2lvbil7Y29uc3QgZGVzY3JpcHRvcj1leHRlbnNpb24uZGVzY3JpcHRvcigpO2NvbnN0IHNldHRpbmdOYW1lPWRlc2NyaXB0b3JbJ3NldHRpbmdOYW1lJ107Y29uc3QgaXNSZWdleD1kZXNjcmlwdG9yWydzZXR0aW5nVHlwZSddPT09J3JlZ2V4Jztjb25zdCBkZWZhdWx0VmFsdWU9ZGVzY3JpcHRvclsnZGVmYXVsdFZhbHVlJ107bGV0IHN0b3JhZ2VUeXBlO3N3aXRjaChkZXNjcmlwdG9yWydzdG9yYWdlVHlwZSddKXtjYXNlKCdsb2NhbCcpOnN0b3JhZ2VUeXBlPUNvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuTG9jYWw7YnJlYWs7Y2FzZSgnc2Vzc2lvbicpOnN0b3JhZ2VUeXBlPUNvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuU2Vzc2lvbjticmVhaztjYXNlKCdnbG9iYWwnKTpzdG9yYWdlVHlwZT1Db21tb24uU2V0dGluZ1N0b3JhZ2VUeXBlLkdsb2JhbDticmVhaztkZWZhdWx0OnN0b3JhZ2VUeXBlPUNvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuR2xvYmFsO30KY29uc3Qgc2V0dGluZz1pc1JlZ2V4P3RoaXMuY3JlYXRlUmVnRXhwU2V0dGluZyhzZXR0aW5nTmFtZSxkZWZhdWx0VmFsdWUsdW5kZWZpbmVkLHN0b3JhZ2VUeXBlKTp0aGlzLmNyZWF0ZVNldHRpbmcoc2V0dGluZ05hbWUsZGVmYXVsdFZhbHVlLHN0b3JhZ2VUeXBlKTtpZihkZXNjcmlwdG9yWyd0aXRsZSddKQpzZXR0aW5nLnNldFRpdGxlKGRlc2NyaXB0b3JbJ3RpdGxlJ10pO2lmKGRlc2NyaXB0b3JbJ3VzZXJBY3Rpb25Db25kaXRpb24nXSkKc2V0dGluZy5zZXRSZXF1aXJlc1VzZXJBY3Rpb24oISFSdW50aW1lLnF1ZXJ5UGFyYW0oZGVzY3JpcHRvclsndXNlckFjdGlvbkNvbmRpdGlvbiddKSk7c2V0dGluZy5fZXh0ZW5zaW9uPWV4dGVuc2lvbjt0aGlzLl9tb2R1bGVTZXR0aW5ncy5zZXQoc2V0dGluZ05hbWUsc2V0dGluZyk7fQptb2R1bGVTZXR0aW5nKHNldHRpbmdOYW1lKXtjb25zdCBzZXR0aW5nPXRoaXMuX21vZHVsZVNldHRpbmdzLmdldChzZXR0aW5nTmFtZSk7aWYoIXNldHRpbmcpCnRocm93IG5ldyBFcnJvcignTm8gc2V0dGluZyByZWdpc3RlcmVkOiAnK3NldHRpbmdOYW1lKTtyZXR1cm4gc2V0dGluZzt9CnNldHRpbmdGb3JUZXN0KHNldHRpbmdOYW1lKXtjb25zdCBzZXR0aW5nPXRoaXMuX3JlZ2lzdHJ5LmdldChzZXR0aW5nTmFtZSk7aWYoIXNldHRpbmcpCnRocm93IG5ldyBFcnJvcignTm8gc2V0dGluZyByZWdpc3RlcmVkOiAnK3NldHRpbmdOYW1lKTtyZXR1cm4gc2V0dGluZzt9CmNyZWF0ZVNldHRpbmcoa2V5LGRlZmF1bHRWYWx1ZSxzdG9yYWdlVHlwZSl7Y29uc3Qgc3RvcmFnZT10aGlzLl9zdG9yYWdlRnJvbVR5cGUoc3RvcmFnZVR5cGUpO2lmKCF0aGlzLl9yZWdpc3RyeS5nZXQoa2V5KSkKdGhpcy5fcmVnaXN0cnkuc2V0KGtleSxuZXcgQ29tbW9uLlNldHRpbmcodGhpcyxrZXksZGVmYXVsdFZhbHVlLHRoaXMuX2V2ZW50U3VwcG9ydCxzdG9yYWdlKSk7cmV0dXJuKHRoaXMuX3JlZ2lzdHJ5LmdldChrZXkpKTt9CmNyZWF0ZUxvY2FsU2V0dGluZyhrZXksZGVmYXVsdFZhbHVlKXtyZXR1cm4gdGhpcy5jcmVhdGVTZXR0aW5nKGtleSxkZWZhdWx0VmFsdWUsQ29tbW9uLlNldHRpbmdTdG9yYWdlVHlwZS5Mb2NhbCk7fQpjcmVhdGVSZWdFeHBTZXR0aW5nKGtleSxkZWZhdWx0VmFsdWUscmVnZXhGbGFncyxzdG9yYWdlVHlwZSl7aWYoIXRoaXMuX3JlZ2lzdHJ5LmdldChrZXkpKXt0aGlzLl9yZWdpc3RyeS5zZXQoa2V5LG5ldyBDb21tb24uUmVnRXhwU2V0dGluZyh0aGlzLGtleSxkZWZhdWx0VmFsdWUsdGhpcy5fZXZlbnRTdXBwb3J0LHRoaXMuX3N0b3JhZ2VGcm9tVHlwZShzdG9yYWdlVHlwZSkscmVnZXhGbGFncykpO30KcmV0dXJuKHRoaXMuX3JlZ2lzdHJ5LmdldChrZXkpKTt9CmNsZWFyQWxsKCl7dGhpcy5fZ2xvYmFsU3RvcmFnZS5yZW1vdmVBbGwoKTt0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlQWxsKCk7Y29uc3QgdmVyc2lvblNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoQ29tbW9uLlZlcnNpb25Db250cm9sbGVyLl9jdXJyZW50VmVyc2lvbk5hbWUsMCk7dmVyc2lvblNldHRpbmcuc2V0KENvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5jdXJyZW50VmVyc2lvbik7fQpfc3RvcmFnZUZyb21UeXBlKHN0b3JhZ2VUeXBlKXtzd2l0Y2goc3RvcmFnZVR5cGUpe2Nhc2UoQ29tbW9uLlNldHRpbmdTdG9yYWdlVHlwZS5Mb2NhbCk6cmV0dXJuIHRoaXMuX2xvY2FsU3RvcmFnZTtjYXNlKENvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGUuU2Vzc2lvbik6cmV0dXJuIHRoaXMuX3Nlc3Npb25TdG9yYWdlO2Nhc2UoQ29tbW9uLlNldHRpbmdTdG9yYWdlVHlwZS5HbG9iYWwpOnJldHVybiB0aGlzLl9nbG9iYWxTdG9yYWdlO30KcmV0dXJuIHRoaXMuX2dsb2JhbFN0b3JhZ2U7fX07Q29tbW9uLlNldHRpbmdzU3RvcmFnZT1jbGFzc3tjb25zdHJ1Y3RvcihvYmplY3Qsc2V0Q2FsbGJhY2sscmVtb3ZlQ2FsbGJhY2sscmVtb3ZlQWxsQ2FsbGJhY2ssc3RvcmFnZVByZWZpeCl7dGhpcy5fb2JqZWN0PW9iamVjdDt0aGlzLl9zZXRDYWxsYmFjaz1zZXRDYWxsYmFja3x8ZnVuY3Rpb24oKXt9O3RoaXMuX3JlbW92ZUNhbGxiYWNrPXJlbW92ZUNhbGxiYWNrfHxmdW5jdGlvbigpe307dGhpcy5fcmVtb3ZlQWxsQ2FsbGJhY2s9cmVtb3ZlQWxsQ2FsbGJhY2t8fGZ1bmN0aW9uKCl7fTt0aGlzLl9zdG9yYWdlUHJlZml4PXN0b3JhZ2VQcmVmaXh8fCcnO30Kc2V0KG5hbWUsdmFsdWUpe25hbWU9dGhpcy5fc3RvcmFnZVByZWZpeCtuYW1lO3RoaXMuX29iamVjdFtuYW1lXT12YWx1ZTt0aGlzLl9zZXRDYWxsYmFjayhuYW1lLHZhbHVlKTt9CmhhcyhuYW1lKXtuYW1lPXRoaXMuX3N0b3JhZ2VQcmVmaXgrbmFtZTtyZXR1cm4gbmFtZSBpbiB0aGlzLl9vYmplY3Q7fQpnZXQobmFtZSl7bmFtZT10aGlzLl9zdG9yYWdlUHJlZml4K25hbWU7cmV0dXJuIHRoaXMuX29iamVjdFtuYW1lXTt9CnJlbW92ZShuYW1lKXtuYW1lPXRoaXMuX3N0b3JhZ2VQcmVmaXgrbmFtZTtkZWxldGUgdGhpcy5fb2JqZWN0W25hbWVdO3RoaXMuX3JlbW92ZUNhbGxiYWNrKG5hbWUpO30KcmVtb3ZlQWxsKCl7dGhpcy5fb2JqZWN0PXt9O3RoaXMuX3JlbW92ZUFsbENhbGxiYWNrKCk7fQpfZHVtcFNpemVzKCl7Q29tbW9uLmNvbnNvbGUubG9nKCdUZW4gbGFyZ2VzdCBzZXR0aW5nczogJyk7Y29uc3Qgc2l6ZXM9e19fcHJvdG9fXzpudWxsfTtmb3IoY29uc3Qga2V5IGluIHRoaXMuX29iamVjdCkKc2l6ZXNba2V5XT10aGlzLl9vYmplY3Rba2V5XS5sZW5ndGg7Y29uc3Qga2V5cz1PYmplY3Qua2V5cyhzaXplcyk7ZnVuY3Rpb24gY29tcGFyYXRvcihrZXkxLGtleTIpe3JldHVybiBzaXplc1trZXkyXS1zaXplc1trZXkxXTt9CmtleXMuc29ydChjb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPDEwJiZpPGtleXMubGVuZ3RoOysraSkKQ29tbW9uLmNvbnNvbGUubG9nKCdTZXR0aW5nOiBcJycra2V5c1tpXSsnXCcsIHNpemU6ICcrc2l6ZXNba2V5c1tpXV0pO319O0NvbW1vbi5TZXR0aW5nPWNsYXNze2NvbnN0cnVjdG9yKHNldHRpbmdzLG5hbWUsZGVmYXVsdFZhbHVlLGV2ZW50U3VwcG9ydCxzdG9yYWdlKXt0aGlzLl9zZXR0aW5ncz1zZXR0aW5nczt0aGlzLl9uYW1lPW5hbWU7dGhpcy5fZGVmYXVsdFZhbHVlPWRlZmF1bHRWYWx1ZTt0aGlzLl9ldmVudFN1cHBvcnQ9ZXZlbnRTdXBwb3J0O3RoaXMuX3N0b3JhZ2U9c3RvcmFnZTt0aGlzLl90aXRsZT0nJzt0aGlzLl9leHRlbnNpb249bnVsbDt9CmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLHRoaXNPYmplY3Qpe3RoaXMuX2V2ZW50U3VwcG9ydC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX25hbWUsbGlzdGVuZXIsdGhpc09iamVjdCk7fQpyZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcix0aGlzT2JqZWN0KXt0aGlzLl9ldmVudFN1cHBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9uYW1lLGxpc3RlbmVyLHRoaXNPYmplY3QpO30KZ2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CnRpdGxlKCl7cmV0dXJuIHRoaXMuX3RpdGxlO30Kc2V0VGl0bGUodGl0bGUpe3RoaXMuX3RpdGxlPXRpdGxlO30Kc2V0UmVxdWlyZXNVc2VyQWN0aW9uKHJlcXVpcmVzVXNlckFjdGlvbil7dGhpcy5fcmVxdWlyZXNVc2VyQWN0aW9uPXJlcXVpcmVzVXNlckFjdGlvbjt9CmdldCgpe2lmKHRoaXMuX3JlcXVpcmVzVXNlckFjdGlvbiYmIXRoaXMuX2hhZFVzZXJBY3Rpb24pCnJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7aWYodHlwZW9mIHRoaXMuX3ZhbHVlIT09J3VuZGVmaW5lZCcpCnJldHVybiB0aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT10aGlzLl9kZWZhdWx0VmFsdWU7aWYodGhpcy5fc3RvcmFnZS5oYXModGhpcy5fbmFtZSkpe3RyeXt0aGlzLl92YWx1ZT1KU09OLnBhcnNlKHRoaXMuX3N0b3JhZ2UuZ2V0KHRoaXMuX25hbWUpKTt9Y2F0Y2goZSl7dGhpcy5fc3RvcmFnZS5yZW1vdmUodGhpcy5fbmFtZSk7fX0KcmV0dXJuIHRoaXMuX3ZhbHVlO30Kc2V0KHZhbHVlKXt0aGlzLl9oYWRVc2VyQWN0aW9uPXRydWU7dGhpcy5fdmFsdWU9dmFsdWU7dHJ5e2NvbnN0IHNldHRpbmdTdHJpbmc9SlNPTi5zdHJpbmdpZnkodmFsdWUpO3RyeXt0aGlzLl9zdG9yYWdlLnNldCh0aGlzLl9uYW1lLHNldHRpbmdTdHJpbmcpO31jYXRjaChlKXt0aGlzLl9wcmludFNldHRpbmdzU2F2aW5nRXJyb3IoZS5tZXNzYWdlLHRoaXMuX25hbWUsc2V0dGluZ1N0cmluZyk7fX1jYXRjaChlKXtDb21tb24uY29uc29sZS5lcnJvcignQ2Fubm90IHN0cmluZ2lmeSBzZXR0aW5nIHdpdGggbmFtZTogJyt0aGlzLl9uYW1lKycsIGVycm9yOiAnK2UubWVzc2FnZSk7fQp0aGlzLl9ldmVudFN1cHBvcnQuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKHRoaXMuX25hbWUsdmFsdWUpO30KcmVtb3ZlKCl7dGhpcy5fc2V0dGluZ3MuX3JlZ2lzdHJ5LmRlbGV0ZSh0aGlzLl9uYW1lKTt0aGlzLl9zZXR0aW5ncy5fbW9kdWxlU2V0dGluZ3MuZGVsZXRlKHRoaXMuX25hbWUpO3RoaXMuX3N0b3JhZ2UucmVtb3ZlKHRoaXMuX25hbWUpO30KZXh0ZW5zaW9uKCl7cmV0dXJuIHRoaXMuX2V4dGVuc2lvbjt9Cl9wcmludFNldHRpbmdzU2F2aW5nRXJyb3IobWVzc2FnZSxuYW1lLHZhbHVlKXtjb25zdCBlcnJvck1lc3NhZ2U9J0Vycm9yIHNhdmluZyBzZXR0aW5nIHdpdGggbmFtZTogJyt0aGlzLl9uYW1lKycsIHZhbHVlIGxlbmd0aDogJyt2YWx1ZS5sZW5ndGgrJy4gRXJyb3I6ICcrbWVzc2FnZTtjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7Q29tbW9uLmNvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKTt0aGlzLl9zdG9yYWdlLl9kdW1wU2l6ZXMoKTt9fTtDb21tb24uUmVnRXhwU2V0dGluZz1jbGFzcyBleHRlbmRzIENvbW1vbi5TZXR0aW5ne2NvbnN0cnVjdG9yKHNldHRpbmdzLG5hbWUsZGVmYXVsdFZhbHVlLGV2ZW50U3VwcG9ydCxzdG9yYWdlLHJlZ2V4RmxhZ3Mpe3N1cGVyKHNldHRpbmdzLG5hbWUsZGVmYXVsdFZhbHVlP1t7cGF0dGVybjpkZWZhdWx0VmFsdWV9XTpbXSxldmVudFN1cHBvcnQsc3RvcmFnZSk7dGhpcy5fcmVnZXhGbGFncz1yZWdleEZsYWdzO30KZ2V0KCl7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGl0ZW1zPXRoaXMuZ2V0QXNBcnJheSgpO2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSl7Y29uc3QgaXRlbT1pdGVtc1tpXTtpZihpdGVtLnBhdHRlcm4mJiFpdGVtLmRpc2FibGVkKQpyZXN1bHQucHVzaChpdGVtLnBhdHRlcm4pO30KcmV0dXJuIHJlc3VsdC5qb2luKCd8Jyk7fQpnZXRBc0FycmF5KCl7cmV0dXJuIHN1cGVyLmdldCgpO30Kc2V0KHZhbHVlKXt0aGlzLnNldEFzQXJyYXkoW3twYXR0ZXJuOnZhbHVlfV0pO30Kc2V0QXNBcnJheSh2YWx1ZSl7ZGVsZXRlIHRoaXMuX3JlZ2V4O3N1cGVyLnNldCh2YWx1ZSk7fQphc1JlZ0V4cCgpe2lmKHR5cGVvZiB0aGlzLl9yZWdleCE9PSd1bmRlZmluZWQnKQpyZXR1cm4gdGhpcy5fcmVnZXg7dGhpcy5fcmVnZXg9bnVsbDt0cnl7Y29uc3QgcGF0dGVybj10aGlzLmdldCgpO2lmKHBhdHRlcm4pCnRoaXMuX3JlZ2V4PW5ldyBSZWdFeHAocGF0dGVybix0aGlzLl9yZWdleEZsYWdzfHwnJyk7fWNhdGNoKGUpe30KcmV0dXJuIHRoaXMuX3JlZ2V4O319O0NvbW1vbi5WZXJzaW9uQ29udHJvbGxlcj1jbGFzc3t1cGRhdGVWZXJzaW9uKCl7Y29uc3QgbG9jYWxTdG9yYWdlVmVyc2lvbj13aW5kb3cubG9jYWxTdG9yYWdlP3dpbmRvdy5sb2NhbFN0b3JhZ2VbQ29tbW9uLlZlcnNpb25Db250cm9sbGVyLl9jdXJyZW50VmVyc2lvbk5hbWVdOjA7Y29uc3QgdmVyc2lvblNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoQ29tbW9uLlZlcnNpb25Db250cm9sbGVyLl9jdXJyZW50VmVyc2lvbk5hbWUsMCk7Y29uc3QgY3VycmVudFZlcnNpb249Q29tbW9uLlZlcnNpb25Db250cm9sbGVyLmN1cnJlbnRWZXJzaW9uO2NvbnN0IG9sZFZlcnNpb249dmVyc2lvblNldHRpbmcuZ2V0KCl8fHBhcnNlSW50KGxvY2FsU3RvcmFnZVZlcnNpb258fCcwJywxMCk7aWYob2xkVmVyc2lvbj09PTApe3ZlcnNpb25TZXR0aW5nLnNldChjdXJyZW50VmVyc2lvbik7cmV0dXJuO30KY29uc3QgbWV0aG9kc1RvUnVuPXRoaXMuX21ldGhvZHNUb1J1blRvVXBkYXRlVmVyc2lvbihvbGRWZXJzaW9uLGN1cnJlbnRWZXJzaW9uKTtmb3IobGV0IGk9MDtpPG1ldGhvZHNUb1J1bi5sZW5ndGg7KytpKQp0aGlzW21ldGhvZHNUb1J1bltpXV0uY2FsbCh0aGlzKTt2ZXJzaW9uU2V0dGluZy5zZXQoY3VycmVudFZlcnNpb24pO30KX21ldGhvZHNUb1J1blRvVXBkYXRlVmVyc2lvbihvbGRWZXJzaW9uLGN1cnJlbnRWZXJzaW9uKXtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPW9sZFZlcnNpb247aTxjdXJyZW50VmVyc2lvbjsrK2kpCnJlc3VsdC5wdXNoKCdfdXBkYXRlVmVyc2lvbkZyb20nK2krJ1RvJysoaSsxKSk7cmV0dXJuIHJlc3VsdDt9Cl91cGRhdGVWZXJzaW9uRnJvbTBUbzEoKXt0aGlzLl9jbGVhckJyZWFrcG9pbnRzV2hlblRvb01hbnkoQ29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnYnJlYWtwb2ludHMnLFtdKSw1MDAwMDApO30KX3VwZGF0ZVZlcnNpb25Gcm9tMVRvMigpe0NvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdwcmV2aW91c2x5Vmlld2VkRmlsZXMnLFtdKS5zZXQoW10pO30KX3VwZGF0ZVZlcnNpb25Gcm9tMlRvMygpe0NvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdmaWxlU3lzdGVtTWFwcGluZycse30pLnNldCh7fSk7Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2ZpbGVNYXBwaW5nRW50cmllcycsW10pLnJlbW92ZSgpO30KX3VwZGF0ZVZlcnNpb25Gcm9tM1RvNCgpe2NvbnN0IGFkdmFuY2VkTW9kZT1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnc2hvd0hlYVNuYXBzaG90T2JqZWN0c0hpZGRlblByb3BlcnRpZXMnLGZhbHNlKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd0FkdmFuY2VkSGVhcFNuYXBzaG90UHJvcGVydGllcycpLnNldChhZHZhbmNlZE1vZGUuZ2V0KCkpO2FkdmFuY2VkTW9kZS5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTRUbzUoKXtjb25zdCBzZXR0aW5nTmFtZXM9eydGaWxlU3lzdGVtVmlld1NpZGViYXJXaWR0aCc6J2ZpbGVTeXN0ZW1WaWV3U3BsaXRWaWV3U3RhdGUnLCdlbGVtZW50c1NpZGViYXJXaWR0aCc6J2VsZW1lbnRzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ1N0eWxlc1BhbmVTcGxpdFJhdGlvJzonc3R5bGVzUGFuZVNwbGl0Vmlld1N0YXRlJywnaGVhcFNuYXBzaG90UmV0YWluZXJzVmlld1NpemUnOidoZWFwU25hcHNob3RTcGxpdFZpZXdTdGF0ZScsJ0luc3BlY3RvclZpZXcuc3BsaXRWaWV3JzonSW5zcGVjdG9yVmlldy5zcGxpdFZpZXdTdGF0ZScsJ0luc3BlY3RvclZpZXcuc2NyZWVuY2FzdFNwbGl0Vmlldyc6J0luc3BlY3RvclZpZXcuc2NyZWVuY2FzdFNwbGl0Vmlld1N0YXRlJywnSW5zcGVjdG9yLmRyYXdlclNwbGl0Vmlldyc6J0luc3BlY3Rvci5kcmF3ZXJTcGxpdFZpZXdTdGF0ZScsJ2xheWVyRGV0YWlsc1NwbGl0Vmlldyc6J2xheWVyRGV0YWlsc1NwbGl0Vmlld1N0YXRlJywnbmV0d29ya1NpZGViYXJXaWR0aCc6J25ldHdvcmtQYW5lbFNwbGl0Vmlld1N0YXRlJywnc291cmNlc1NpZGViYXJXaWR0aCc6J3NvdXJjZXNQYW5lbFNwbGl0Vmlld1N0YXRlJywnc2NyaXB0c1BhbmVsTmF2aWdhdG9yU2lkZWJhcldpZHRoJzonc291cmNlc1BhbmVsTmF2aWdhdG9yU3BsaXRWaWV3U3RhdGUnLCdzb3VyY2VzUGFuZWxTcGxpdFNpZGViYXJSYXRpbyc6J3NvdXJjZXNQYW5lbERlYnVnZ2VyU2lkZWJhclNwbGl0Vmlld1N0YXRlJywndGltZWxpbmUtZGV0YWlscyc6J3RpbWVsaW5lUGFuZWxEZXRhaWxzU3BsaXRWaWV3U3RhdGUnLCd0aW1lbGluZS1zcGxpdCc6J3RpbWVsaW5lUGFuZWxSZWNvcnNTcGxpdFZpZXdTdGF0ZScsJ3RpbWVsaW5lLXZpZXcnOid0aW1lbGluZVBhbmVsVGltZWxpbmVTdGFja1NwbGl0Vmlld1N0YXRlJywnYXVkaXRzU2lkZWJhcldpZHRoJzonYXVkaXRzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ2xheWVyc1NpZGViYXJXaWR0aCc6J2xheWVyc1BhbmVsU3BsaXRWaWV3U3RhdGUnLCdwcm9maWxlc1NpZGViYXJXaWR0aCc6J3Byb2ZpbGVzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ3Jlc291cmNlc1NpZGViYXJXaWR0aCc6J3Jlc291cmNlc1BhbmVsU3BsaXRWaWV3U3RhdGUnfTtjb25zdCBlbXB0eT17fTtmb3IoY29uc3Qgb2xkTmFtZSBpbiBzZXR0aW5nTmFtZXMpe2NvbnN0IG5ld05hbWU9c2V0dGluZ05hbWVzW29sZE5hbWVdO2NvbnN0IG9sZE5hbWVIPW9sZE5hbWUrJ0gnO2xldCBuZXdWYWx1ZT1udWxsO2NvbnN0IG9sZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcob2xkTmFtZSxlbXB0eSk7aWYob2xkU2V0dGluZy5nZXQoKSE9PWVtcHR5KXtuZXdWYWx1ZT1uZXdWYWx1ZXx8e307bmV3VmFsdWUudmVydGljYWw9e307bmV3VmFsdWUudmVydGljYWwuc2l6ZT1vbGRTZXR0aW5nLmdldCgpO29sZFNldHRpbmcucmVtb3ZlKCk7fQpjb25zdCBvbGRTZXR0aW5nSD1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhvbGROYW1lSCxlbXB0eSk7aWYob2xkU2V0dGluZ0guZ2V0KCkhPT1lbXB0eSl7bmV3VmFsdWU9bmV3VmFsdWV8fHt9O25ld1ZhbHVlLmhvcml6b250YWw9e307bmV3VmFsdWUuaG9yaXpvbnRhbC5zaXplPW9sZFNldHRpbmdILmdldCgpO29sZFNldHRpbmdILnJlbW92ZSgpO30KaWYobmV3VmFsdWUpCkNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG5ld05hbWUse30pLnNldChuZXdWYWx1ZSk7fX0KX3VwZGF0ZVZlcnNpb25Gcm9tNVRvNigpe2NvbnN0IHNldHRpbmdOYW1lcz17J2RlYnVnZ2VyU2lkZWJhckhpZGRlbic6J3NvdXJjZXNQYW5lbFNwbGl0Vmlld1N0YXRlJywnbmF2aWdhdG9ySGlkZGVuJzonc291cmNlc1BhbmVsTmF2aWdhdG9yU3BsaXRWaWV3U3RhdGUnLCdXZWJJbnNwZWN0b3IuRHJhd2VyLnNob3dPbkxvYWQnOidJbnNwZWN0b3IuZHJhd2VyU3BsaXRWaWV3U3RhdGUnfTtmb3IoY29uc3Qgb2xkTmFtZSBpbiBzZXR0aW5nTmFtZXMpe2NvbnN0IG9sZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcob2xkTmFtZSxudWxsKTtpZihvbGRTZXR0aW5nLmdldCgpPT09bnVsbCl7b2xkU2V0dGluZy5yZW1vdmUoKTtjb250aW51ZTt9CmNvbnN0IG5ld05hbWU9c2V0dGluZ05hbWVzW29sZE5hbWVdO2NvbnN0IGludmVydD1vbGROYW1lPT09J1dlYkluc3BlY3Rvci5EcmF3ZXIuc2hvd09uTG9hZCc7Y29uc3QgaGlkZGVuPW9sZFNldHRpbmcuZ2V0KCkhPT1pbnZlcnQ7b2xkU2V0dGluZy5yZW1vdmUoKTtjb25zdCBzaG93TW9kZT1oaWRkZW4/J09ubHlNYWluJzonQm90aCc7Y29uc3QgbmV3U2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhuZXdOYW1lLHt9KTtjb25zdCBuZXdWYWx1ZT1uZXdTZXR0aW5nLmdldCgpfHx7fTtuZXdWYWx1ZS52ZXJ0aWNhbD1uZXdWYWx1ZS52ZXJ0aWNhbHx8e307bmV3VmFsdWUudmVydGljYWwuc2hvd01vZGU9c2hvd01vZGU7bmV3VmFsdWUuaG9yaXpvbnRhbD1uZXdWYWx1ZS5ob3Jpem9udGFsfHx7fTtuZXdWYWx1ZS5ob3Jpem9udGFsLnNob3dNb2RlPXNob3dNb2RlO25ld1NldHRpbmcuc2V0KG5ld1ZhbHVlKTt9fQpfdXBkYXRlVmVyc2lvbkZyb202VG83KCl7Y29uc3Qgc2V0dGluZ05hbWVzPXsnc291cmNlc1BhbmVsTmF2aWdhdG9yU3BsaXRWaWV3U3RhdGUnOidzb3VyY2VzUGFuZWxOYXZpZ2F0b3JTcGxpdFZpZXdTdGF0ZScsJ2VsZW1lbnRzUGFuZWxTcGxpdFZpZXdTdGF0ZSc6J2VsZW1lbnRzUGFuZWxTcGxpdFZpZXdTdGF0ZScsJ3N0eWxlc1BhbmVTcGxpdFZpZXdTdGF0ZSc6J3N0eWxlc1BhbmVTcGxpdFZpZXdTdGF0ZScsJ3NvdXJjZXNQYW5lbERlYnVnZ2VyU2lkZWJhclNwbGl0Vmlld1N0YXRlJzonc291cmNlc1BhbmVsRGVidWdnZXJTaWRlYmFyU3BsaXRWaWV3U3RhdGUnfTtjb25zdCBlbXB0eT17fTtmb3IoY29uc3QgbmFtZSBpbiBzZXR0aW5nTmFtZXMpe2NvbnN0IHNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcobmFtZSxlbXB0eSk7Y29uc3QgdmFsdWU9c2V0dGluZy5nZXQoKTtpZih2YWx1ZT09PWVtcHR5KQpjb250aW51ZTtpZih2YWx1ZS52ZXJ0aWNhbCYmdmFsdWUudmVydGljYWwuc2l6ZSYmdmFsdWUudmVydGljYWwuc2l6ZTwxKQp2YWx1ZS52ZXJ0aWNhbC5zaXplPTA7aWYodmFsdWUuaG9yaXpvbnRhbCYmdmFsdWUuaG9yaXpvbnRhbC5zaXplJiZ2YWx1ZS5ob3Jpem9udGFsLnNpemU8MSkKdmFsdWUuaG9yaXpvbnRhbC5zaXplPTA7c2V0dGluZy5zZXQodmFsdWUpO319Cl91cGRhdGVWZXJzaW9uRnJvbTdUbzgoKXt9Cl91cGRhdGVWZXJzaW9uRnJvbThUbzkoKXtjb25zdCBzZXR0aW5nTmFtZXM9Wydza2lwU3RhY2tGcmFtZXNQYXR0ZXJuJywnd29ya3NwYWNlRm9sZGVyRXhjbHVkZVBhdHRlcm4nXTtmb3IobGV0IGk9MDtpPHNldHRpbmdOYW1lcy5sZW5ndGg7KytpKXtjb25zdCBzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKHNldHRpbmdOYW1lc1tpXSwnJyk7bGV0IHZhbHVlPXNldHRpbmcuZ2V0KCk7aWYoIXZhbHVlKQpyZXR1cm47aWYodHlwZW9mIHZhbHVlPT09J3N0cmluZycpCnZhbHVlPVt2YWx1ZV07Zm9yKGxldCBqPTA7ajx2YWx1ZS5sZW5ndGg7KytqKXtpZih0eXBlb2YgdmFsdWVbal09PT0nc3RyaW5nJykKdmFsdWVbal09e3BhdHRlcm46dmFsdWVbal19O30Kc2V0dGluZy5zZXQodmFsdWUpO319Cl91cGRhdGVWZXJzaW9uRnJvbTlUbzEwKCl7aWYoIXdpbmRvdy5sb2NhbFN0b3JhZ2UpCnJldHVybjtmb3IoY29uc3Qga2V5IGluIHdpbmRvdy5sb2NhbFN0b3JhZ2Upe2lmKGtleS5zdGFydHNXaXRoKCdyZXZpc2lvbi1oaXN0b3J5JykpCndpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO319Cl91cGRhdGVWZXJzaW9uRnJvbTEwVG8xMSgpe2NvbnN0IG9sZFNldHRpbmdOYW1lPSdjdXN0b21EZXZpY2VQcmVzZXRzJztjb25zdCBuZXdTZXR0aW5nTmFtZT0nY3VzdG9tRW11bGF0ZWREZXZpY2VMaXN0Jztjb25zdCBvbGRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKG9sZFNldHRpbmdOYW1lLHVuZGVmaW5lZCk7Y29uc3QgbGlzdD1vbGRTZXR0aW5nLmdldCgpO2lmKCFBcnJheS5pc0FycmF5KGxpc3QpKQpyZXR1cm47Y29uc3QgbmV3TGlzdD1bXTtmb3IobGV0IGk9MDtpPGxpc3QubGVuZ3RoOysraSl7Y29uc3QgdmFsdWU9bGlzdFtpXTtjb25zdCBkZXZpY2U9e307ZGV2aWNlWyd0aXRsZSddPXZhbHVlWyd0aXRsZSddO2RldmljZVsndHlwZSddPSd1bmtub3duJztkZXZpY2VbJ3VzZXItYWdlbnQnXT12YWx1ZVsndXNlckFnZW50J107ZGV2aWNlWydjYXBhYmlsaXRpZXMnXT1bXTtpZih2YWx1ZVsndG91Y2gnXSkKZGV2aWNlWydjYXBhYmlsaXRpZXMnXS5wdXNoKCd0b3VjaCcpO2lmKHZhbHVlWydtb2JpbGUnXSkKZGV2aWNlWydjYXBhYmlsaXRpZXMnXS5wdXNoKCdtb2JpbGUnKTtkZXZpY2VbJ3NjcmVlbiddPXt9O2RldmljZVsnc2NyZWVuJ11bJ3ZlcnRpY2FsJ109e3dpZHRoOnZhbHVlWyd3aWR0aCddLGhlaWdodDp2YWx1ZVsnaGVpZ2h0J119O2RldmljZVsnc2NyZWVuJ11bJ2hvcml6b250YWwnXT17d2lkdGg6dmFsdWVbJ2hlaWdodCddLGhlaWdodDp2YWx1ZVsnd2lkdGgnXX07ZGV2aWNlWydzY3JlZW4nXVsnZGV2aWNlLXBpeGVsLXJhdGlvJ109dmFsdWVbJ2RldmljZVNjYWxlRmFjdG9yJ107ZGV2aWNlWydtb2RlcyddPVtdO2RldmljZVsnc2hvdy1ieS1kZWZhdWx0J109dHJ1ZTtkZXZpY2VbJ3Nob3cnXT0nRGVmYXVsdCc7bmV3TGlzdC5wdXNoKGRldmljZSk7fQppZihuZXdMaXN0Lmxlbmd0aCkKQ29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcobmV3U2V0dGluZ05hbWUsW10pLnNldChuZXdMaXN0KTtvbGRTZXR0aW5nLnJlbW92ZSgpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMTFUbzEyKCl7dGhpcy5fbWlncmF0ZVNldHRpbmdzRnJvbUxvY2FsU3RvcmFnZSgpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMTJUbzEzKCl7dGhpcy5fbWlncmF0ZVNldHRpbmdzRnJvbUxvY2FsU3RvcmFnZSgpO0NvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZU92ZXJ2aWV3TW9kZScsJycpLnJlbW92ZSgpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMTNUbzE0KCl7Y29uc3QgZGVmYXVsdFZhbHVlPXsndGhyb3VnaHB1dCc6LTEsJ2xhdGVuY3knOjB9O0NvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrQ29uZGl0aW9ucycsZGVmYXVsdFZhbHVlKS5zZXQoZGVmYXVsdFZhbHVlKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTE0VG8xNSgpe2NvbnN0IHNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnd29ya3NwYWNlRXhjbHVkZWRGb2xkZXJzJyx7fSk7Y29uc3Qgb2xkVmFsdWU9c2V0dGluZy5nZXQoKTtjb25zdCBuZXdWYWx1ZT17fTtmb3IoY29uc3QgZmlsZVN5c3RlbVBhdGggaW4gb2xkVmFsdWUpe25ld1ZhbHVlW2ZpbGVTeXN0ZW1QYXRoXT1bXTtmb3IoY29uc3QgZW50cnkgb2Ygb2xkVmFsdWVbZmlsZVN5c3RlbVBhdGhdKQpuZXdWYWx1ZVtmaWxlU3lzdGVtUGF0aF0ucHVzaChlbnRyeS5wYXRoKTt9CnNldHRpbmcuc2V0KG5ld1ZhbHVlKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTE1VG8xNigpe2NvbnN0IHNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ0luc3BlY3RvclZpZXcucGFuZWxPcmRlcicse30pO2NvbnN0IHRhYk9yZGVycz1zZXR0aW5nLmdldCgpO2Zvcihjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGFiT3JkZXJzKSkKdGFiT3JkZXJzW2tleV09KHRhYk9yZGVyc1trZXldKzEpKjEwO3NldHRpbmcuc2V0KHRhYk9yZGVycyk7fQpfdXBkYXRlVmVyc2lvbkZyb20xNlRvMTcoKXtjb25zdCBzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrQ29uZGl0aW9uc0N1c3RvbVByb2ZpbGVzJyxbXSk7Y29uc3Qgb2xkVmFsdWU9c2V0dGluZy5nZXQoKTtjb25zdCBuZXdWYWx1ZT1bXTtpZihBcnJheS5pc0FycmF5KG9sZFZhbHVlKSl7Zm9yKGNvbnN0IHByZXNldCBvZiBvbGRWYWx1ZSl7aWYodHlwZW9mIHByZXNldC50aXRsZT09PSdzdHJpbmcnJiZ0eXBlb2YgcHJlc2V0LnZhbHVlPT09J29iamVjdCcmJnR5cGVvZiBwcmVzZXQudmFsdWUudGhyb3VnaHB1dD09PSdudW1iZXInJiZ0eXBlb2YgcHJlc2V0LnZhbHVlLmxhdGVuY3k9PT0nbnVtYmVyJyl7bmV3VmFsdWUucHVzaCh7dGl0bGU6cHJlc2V0LnRpdGxlLHZhbHVlOntkb3dubG9hZDpwcmVzZXQudmFsdWUudGhyb3VnaHB1dCx1cGxvYWQ6cHJlc2V0LnZhbHVlLnRocm91Z2hwdXQsbGF0ZW5jeTpwcmVzZXQudmFsdWUubGF0ZW5jeX19KTt9fX0Kc2V0dGluZy5zZXQobmV3VmFsdWUpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMTdUbzE4KCl7Y29uc3Qgc2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlTG9jYWxTZXR0aW5nKCd3b3Jrc3BhY2VFeGNsdWRlZEZvbGRlcnMnLHt9KTtjb25zdCBvbGRWYWx1ZT1zZXR0aW5nLmdldCgpO2NvbnN0IG5ld1ZhbHVlPXt9O2Zvcihjb25zdCBvbGRLZXkgaW4gb2xkVmFsdWUpe2xldCBuZXdLZXk9b2xkS2V5LnJlcGxhY2UoL1xcL2csJy8nKTtpZighbmV3S2V5LnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSl7aWYobmV3S2V5LnN0YXJ0c1dpdGgoJy8nKSkKbmV3S2V5PSdmaWxlOi8vJytuZXdLZXk7ZWxzZQpuZXdLZXk9J2ZpbGU6Ly8vJytuZXdLZXk7fQpuZXdWYWx1ZVtuZXdLZXldPW9sZFZhbHVlW29sZEtleV07fQpzZXR0aW5nLnNldChuZXdWYWx1ZSk7fQpfdXBkYXRlVmVyc2lvbkZyb20xOFRvMTkoKXtjb25zdCBkZWZhdWx0Q29sdW1ucz17c3RhdHVzOnRydWUsdHlwZTp0cnVlLGluaXRpYXRvcjp0cnVlLHNpemU6dHJ1ZSx0aW1lOnRydWV9O2NvbnN0IHZpc2libGVDb2x1bW5TZXR0aW5ncz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0xvZ0NvbHVtbnNWaXNpYmlsaXR5JyxkZWZhdWx0Q29sdW1ucyk7Y29uc3QgdmlzaWJsZUNvbHVtbnM9dmlzaWJsZUNvbHVtblNldHRpbmdzLmdldCgpO3Zpc2libGVDb2x1bW5zLm5hbWU9dHJ1ZTt2aXNpYmxlQ29sdW1ucy50aW1lbGluZT10cnVlO2NvbnN0IGNvbmZpZ3M9e307Zm9yKGNvbnN0IGNvbHVtbklkIGluIHZpc2libGVDb2x1bW5zKXtpZighdmlzaWJsZUNvbHVtbnMuaGFzT3duUHJvcGVydHkoY29sdW1uSWQpKQpjb250aW51ZTtjb25maWdzW2NvbHVtbklkLnRvTG93ZXJDYXNlKCldPXt2aXNpYmxlOnZpc2libGVDb2x1bW5zW2NvbHVtbklkXX07fQpjb25zdCBuZXdTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrTG9nQ29sdW1ucycse30pO25ld1NldHRpbmcuc2V0KGNvbmZpZ3MpO3Zpc2libGVDb2x1bW5TZXR0aW5ncy5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTE5VG8yMCgpe2NvbnN0IG9sZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ0luc3BlY3RvclZpZXcucGFuZWxPcmRlcicse30pO2NvbnN0IG5ld1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3BhbmVsLXRhYk9yZGVyJyx7fSk7bmV3U2V0dGluZy5zZXQob2xkU2V0dGluZy5nZXQoKSk7b2xkU2V0dGluZy5yZW1vdmUoKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTIwVG8yMSgpe2NvbnN0IG5ldHdvcmtDb2x1bW5zPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrTG9nQ29sdW1ucycse30pO2NvbnN0IGNvbHVtbnM9KG5ldHdvcmtDb2x1bW5zLmdldCgpKTtkZWxldGUgY29sdW1uc1sndGltZWxpbmUnXTtkZWxldGUgY29sdW1uc1snd2F0ZXJmYWxsJ107bmV0d29ya0NvbHVtbnMuc2V0KGNvbHVtbnMpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMjFUbzIyKCl7Y29uc3QgYnJlYWtwb2ludHNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ2JyZWFrcG9pbnRzJyxbXSk7Y29uc3QgYnJlYWtwb2ludHM9YnJlYWtwb2ludHNTZXR0aW5nLmdldCgpO2Zvcihjb25zdCBicmVha3BvaW50IG9mIGJyZWFrcG9pbnRzKXticmVha3BvaW50Wyd1cmwnXT1icmVha3BvaW50Wydzb3VyY2VGaWxlSWQnXTtkZWxldGUgYnJlYWtwb2ludFsnc291cmNlRmlsZUlkJ107fQpicmVha3BvaW50c1NldHRpbmcuc2V0KGJyZWFrcG9pbnRzKTt9Cl91cGRhdGVWZXJzaW9uRnJvbTIyVG8yMygpe30KX3VwZGF0ZVZlcnNpb25Gcm9tMjNUbzI0KCl7Y29uc3Qgb2xkU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnc2VhcmNoSW5Db250ZW50U2NyaXB0cycsZmFsc2UpO2NvbnN0IG5ld1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3NlYXJjaEluQW5vbnltb3VzQW5kQ29udGVudFNjcmlwdHMnLGZhbHNlKTtuZXdTZXR0aW5nLnNldChvbGRTZXR0aW5nLmdldCgpKTtvbGRTZXR0aW5nLnJlbW92ZSgpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMjRUbzI1KCl7Y29uc3QgZGVmYXVsdENvbHVtbnM9e3N0YXR1czp0cnVlLHR5cGU6dHJ1ZSxpbml0aWF0b3I6dHJ1ZSxzaXplOnRydWUsdGltZTp0cnVlfTtjb25zdCBuZXR3b3JrTG9nQ29sdW1uc1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ25ldHdvcmtMb2dDb2x1bW5zJyxkZWZhdWx0Q29sdW1ucyk7Y29uc3QgY29sdW1ucz1uZXR3b3JrTG9nQ29sdW1uc1NldHRpbmcuZ2V0KCk7ZGVsZXRlIGNvbHVtbnMucHJvZHVjdDtuZXR3b3JrTG9nQ29sdW1uc1NldHRpbmcuc2V0KGNvbHVtbnMpO30KX3VwZGF0ZVZlcnNpb25Gcm9tMjVUbzI2KCl7Y29uc3Qgb2xkU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbWVzc2FnZVVSTEZpbHRlcnMnLHt9KTtjb25zdCB1cmxzPU9iamVjdC5rZXlzKG9sZFNldHRpbmcuZ2V0KCkpO2NvbnN0IHRleHRGaWx0ZXI9dXJscy5tYXAodXJsPT5gLXVybDoke3VybH1gKS5qb2luKCcgJyk7aWYodGV4dEZpbHRlcil7Y29uc3QgdGV4dEZpbHRlclNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2NvbnNvbGUudGV4dEZpbHRlcicsJycpO2NvbnN0IHN1ZmZpeD10ZXh0RmlsdGVyU2V0dGluZy5nZXQoKT9gICR7dGV4dEZpbHRlclNldHRpbmcuZ2V0KCl9YDonJzt0ZXh0RmlsdGVyU2V0dGluZy5zZXQoYCR7dGV4dEZpbHRlcn0ke3N1ZmZpeH1gKTt9Cm9sZFNldHRpbmcucmVtb3ZlKCk7fQpfbWlncmF0ZVNldHRpbmdzRnJvbUxvY2FsU3RvcmFnZSgpe2NvbnN0IGxvY2FsU2V0dGluZ3M9bmV3IFNldChbJ2FkdmFuY2VkU2VhcmNoQ29uZmlnJywnYnJlYWtwb2ludHMnLCdjb25zb2xlSGlzdG9yeScsJ2RvbUJyZWFrcG9pbnRzJywnZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzJywnZmlsZVN5c3RlbU1hcHBpbmcnLCdsYXN0U2VsZWN0ZWRTb3VyY2VzU2lkZWJhclBhbmVUYWInLCdwcmV2aW91c2x5Vmlld2VkRmlsZXMnLCdzYXZlZFVSTHMnLCd3YXRjaEV4cHJlc3Npb25zJywnd29ya3NwYWNlRXhjbHVkZWRGb2xkZXJzJywneGhyQnJlYWtwb2ludHMnXSk7aWYoIXdpbmRvdy5sb2NhbFN0b3JhZ2UpCnJldHVybjtmb3IoY29uc3Qga2V5IGluIHdpbmRvdy5sb2NhbFN0b3JhZ2Upe2lmKGxvY2FsU2V0dGluZ3MuaGFzKGtleSkpCmNvbnRpbnVlO2NvbnN0IHZhbHVlPXdpbmRvdy5sb2NhbFN0b3JhZ2Vba2V5XTt3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtDb21tb24uc2V0dGluZ3MuX2dsb2JhbFN0b3JhZ2Vba2V5XT12YWx1ZTt9fQpfY2xlYXJCcmVha3BvaW50c1doZW5Ub29NYW55KGJyZWFrcG9pbnRzU2V0dGluZyxtYXhCcmVha3BvaW50c0NvdW50KXtpZihicmVha3BvaW50c1NldHRpbmcuZ2V0KCkubGVuZ3RoPm1heEJyZWFrcG9pbnRzQ291bnQpCmJyZWFrcG9pbnRzU2V0dGluZy5zZXQoW10pO319O0NvbW1vbi5WZXJzaW9uQ29udHJvbGxlci5fY3VycmVudFZlcnNpb25OYW1lPSdpbnNwZWN0b3JWZXJzaW9uJztDb21tb24uVmVyc2lvbkNvbnRyb2xsZXIuY3VycmVudFZlcnNpb249MjY7Q29tbW9uLnNldHRpbmdzO0NvbW1vbi5TZXR0aW5nU3RvcmFnZVR5cGU9e0dsb2JhbDpTeW1ib2woJ0dsb2JhbCcpLExvY2FsOlN5bWJvbCgnTG9jYWwnKSxTZXNzaW9uOlN5bWJvbCgnU2Vzc2lvbicpfTtDb21tb24ubW9kdWxlU2V0dGluZz1mdW5jdGlvbihzZXR0aW5nTmFtZSl7cmV0dXJuIENvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKHNldHRpbmdOYW1lKTt9O0NvbW1vbi5zZXR0aW5nRm9yVGVzdD1mdW5jdGlvbihzZXR0aW5nTmFtZSl7cmV0dXJuIENvbW1vbi5zZXR0aW5ncy5zZXR0aW5nRm9yVGVzdChzZXR0aW5nTmFtZSk7fTs7Q29tbW9uLlN0YXRpY0NvbnRlbnRQcm92aWRlcj1jbGFzc3tjb25zdHJ1Y3Rvcihjb250ZW50VVJMLGNvbnRlbnRUeXBlLGxhenlDb250ZW50KXt0aGlzLl9jb250ZW50VVJMPWNvbnRlbnRVUkw7dGhpcy5fY29udGVudFR5cGU9Y29udGVudFR5cGU7dGhpcy5fbGF6eUNvbnRlbnQ9bGF6eUNvbnRlbnQ7fQpzdGF0aWMgZnJvbVN0cmluZyhjb250ZW50VVJMLGNvbnRlbnRUeXBlLGNvbnRlbnQpe2NvbnN0IGxhenlDb250ZW50PSgpPT5Qcm9taXNlLnJlc29sdmUoY29udGVudCk7cmV0dXJuIG5ldyBDb21tb24uU3RhdGljQ29udGVudFByb3ZpZGVyKGNvbnRlbnRVUkwsY29udGVudFR5cGUsbGF6eUNvbnRlbnQpO30KY29udGVudFVSTCgpe3JldHVybiB0aGlzLl9jb250ZW50VVJMO30KY29udGVudFR5cGUoKXtyZXR1cm4gdGhpcy5fY29udGVudFR5cGU7fQpjb250ZW50RW5jb2RlZCgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO30KcmVxdWVzdENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fbGF6eUNvbnRlbnQoKTt9CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgdGhpcy5fbGF6eUNvbnRlbnQoKTtyZXR1cm4gY29udGVudD9Db21tb24uQ29udGVudFByb3ZpZGVyLnBlcmZvcm1TZWFyY2hJbkNvbnRlbnQoY29udGVudCxxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpOltdO319OztDb21tb24uT3V0cHV0U3RyZWFtPWZ1bmN0aW9uKCl7fTtDb21tb24uT3V0cHV0U3RyZWFtLnByb3RvdHlwZT17d3JpdGUoZGF0YSl7fSxjbG9zZSgpe319O0NvbW1vbi5TdHJpbmdPdXRwdXRTdHJlYW09Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9kYXRhPScnO30KYXN5bmMgd3JpdGUoY2h1bmspe3RoaXMuX2RhdGErPWNodW5rO30KY2xvc2UoKXt9CmRhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YTt9fTs7Q29tbW9uLlNlZ21lbnQ9Y2xhc3N7Y29uc3RydWN0b3IoYmVnaW4sZW5kLGRhdGEpe2lmKGJlZ2luPmVuZCkKY29uc29sZS5hc3NlcnQoZmFsc2UsJ0ludmFsaWQgc2VnbWVudCcpO3RoaXMuYmVnaW49YmVnaW47dGhpcy5lbmQ9ZW5kO3RoaXMuZGF0YT1kYXRhO30KaW50ZXJzZWN0cyh0aGF0KXtyZXR1cm4gdGhpcy5iZWdpbjx0aGF0LmVuZCYmdGhhdC5iZWdpbjx0aGlzLmVuZDt9fTtDb21tb24uU2VnbWVudGVkUmFuZ2U9Y2xhc3N7Y29uc3RydWN0b3IobWVyZ2VDYWxsYmFjayl7dGhpcy5fc2VnbWVudHM9W107dGhpcy5fbWVyZ2VDYWxsYmFjaz1tZXJnZUNhbGxiYWNrO30KYXBwZW5kKG5ld1NlZ21lbnQpe2xldCBzdGFydEluZGV4PXRoaXMuX3NlZ21lbnRzLmxvd2VyQm91bmQobmV3U2VnbWVudCwoYSxiKT0+YS5iZWdpbi1iLmJlZ2luKTtsZXQgZW5kSW5kZXg9c3RhcnRJbmRleDtsZXQgbWVyZ2VkPW51bGw7aWYoc3RhcnRJbmRleD4wKXtjb25zdCBwcmVjZWRpbmdTZWdtZW50PXRoaXMuX3NlZ21lbnRzW3N0YXJ0SW5kZXgtMV07bWVyZ2VkPXRoaXMuX3RyeU1lcmdlKHByZWNlZGluZ1NlZ21lbnQsbmV3U2VnbWVudCk7aWYobWVyZ2VkKXstLXN0YXJ0SW5kZXg7bmV3U2VnbWVudD1tZXJnZWQ7fWVsc2UgaWYodGhpcy5fc2VnbWVudHNbc3RhcnRJbmRleC0xXS5lbmQ+PW5ld1NlZ21lbnQuYmVnaW4pe2lmKG5ld1NlZ21lbnQuZW5kPHByZWNlZGluZ1NlZ21lbnQuZW5kKXt0aGlzLl9zZWdtZW50cy5zcGxpY2Uoc3RhcnRJbmRleCwwLG5ldyBDb21tb24uU2VnbWVudChuZXdTZWdtZW50LmVuZCxwcmVjZWRpbmdTZWdtZW50LmVuZCxwcmVjZWRpbmdTZWdtZW50LmRhdGEpKTt9CnByZWNlZGluZ1NlZ21lbnQuZW5kPW5ld1NlZ21lbnQuYmVnaW47fX0Kd2hpbGUoZW5kSW5kZXg8dGhpcy5fc2VnbWVudHMubGVuZ3RoJiZ0aGlzLl9zZWdtZW50c1tlbmRJbmRleF0uZW5kPD1uZXdTZWdtZW50LmVuZCkKKytlbmRJbmRleDtpZihlbmRJbmRleDx0aGlzLl9zZWdtZW50cy5sZW5ndGgpe21lcmdlZD10aGlzLl90cnlNZXJnZShuZXdTZWdtZW50LHRoaXMuX3NlZ21lbnRzW2VuZEluZGV4XSk7aWYobWVyZ2VkKXtlbmRJbmRleCsrO25ld1NlZ21lbnQ9bWVyZ2VkO31lbHNlIGlmKG5ld1NlZ21lbnQuaW50ZXJzZWN0cyh0aGlzLl9zZWdtZW50c1tlbmRJbmRleF0pKXt0aGlzLl9zZWdtZW50c1tlbmRJbmRleF0uYmVnaW49bmV3U2VnbWVudC5lbmQ7fX0KdGhpcy5fc2VnbWVudHMuc3BsaWNlKHN0YXJ0SW5kZXgsZW5kSW5kZXgtc3RhcnRJbmRleCxuZXdTZWdtZW50KTt9CmFwcGVuZFJhbmdlKHRoYXQpe3RoYXQuc2VnbWVudHMoKS5mb3JFYWNoKHNlZ21lbnQ9PnRoaXMuYXBwZW5kKHNlZ21lbnQpKTt9CnNlZ21lbnRzKCl7cmV0dXJuIHRoaXMuX3NlZ21lbnRzO30KX3RyeU1lcmdlKGZpcnN0LHNlY29uZCl7Y29uc3QgbWVyZ2VkPXRoaXMuX21lcmdlQ2FsbGJhY2smJnRoaXMuX21lcmdlQ2FsbGJhY2soZmlyc3Qsc2Vjb25kKTtpZighbWVyZ2VkKQpyZXR1cm4gbnVsbDttZXJnZWQuYmVnaW49Zmlyc3QuYmVnaW47bWVyZ2VkLmVuZD1NYXRoLm1heChmaXJzdC5lbmQsc2Vjb25kLmVuZCk7cmV0dXJuIG1lcmdlZDt9fTs7Q29tbW9uLlRocm90dGxlcj1jbGFzc3tjb25zdHJ1Y3Rvcih0aW1lb3V0KXt0aGlzLl90aW1lb3V0PXRpbWVvdXQ7dGhpcy5faXNSdW5uaW5nUHJvY2Vzcz1mYWxzZTt0aGlzLl9hc1Nvb25Bc1Bvc3NpYmxlPWZhbHNlO3RoaXMuX3Byb2Nlc3M9bnVsbDt0aGlzLl9sYXN0Q29tcGxldGVUaW1lPTA7dGhpcy5fc2NoZWR1bGVQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9Pnt0aGlzLl9zY2hlZHVsZVJlc29sdmU9ZnVsZmlsbDt9KTt9Cl9wcm9jZXNzQ29tcGxldGVkKCl7dGhpcy5fbGFzdENvbXBsZXRlVGltZT10aGlzLl9nZXRUaW1lKCk7dGhpcy5faXNSdW5uaW5nUHJvY2Vzcz1mYWxzZTtpZih0aGlzLl9wcm9jZXNzKQp0aGlzLl9pbm5lclNjaGVkdWxlKGZhbHNlKTt0aGlzLl9wcm9jZXNzQ29tcGxldGVkRm9yVGVzdHMoKTt9Cl9wcm9jZXNzQ29tcGxldGVkRm9yVGVzdHMoKXt9Cl9vblRpbWVvdXQoKXtkZWxldGUgdGhpcy5fcHJvY2Vzc1RpbWVvdXQ7dGhpcy5fYXNTb29uQXNQb3NzaWJsZT1mYWxzZTt0aGlzLl9pc1J1bm5pbmdQcm9jZXNzPXRydWU7UHJvbWlzZS5yZXNvbHZlKCkudGhlbih0aGlzLl9wcm9jZXNzKS5jYXRjaChjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSkpLnRoZW4odGhpcy5fcHJvY2Vzc0NvbXBsZXRlZC5iaW5kKHRoaXMpKS50aGVuKHRoaXMuX3NjaGVkdWxlUmVzb2x2ZSk7dGhpcy5fc2NoZWR1bGVQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9Pnt0aGlzLl9zY2hlZHVsZVJlc29sdmU9ZnVsZmlsbDt9KTt0aGlzLl9wcm9jZXNzPW51bGw7fQpzY2hlZHVsZShwcm9jZXNzLGFzU29vbkFzUG9zc2libGUpe3RoaXMuX3Byb2Nlc3M9cHJvY2Vzcztjb25zdCBoYXNTY2hlZHVsZWRUYXNrcz0hIXRoaXMuX3Byb2Nlc3NUaW1lb3V0fHx0aGlzLl9pc1J1bm5pbmdQcm9jZXNzO2NvbnN0IG9rVG9GaXJlPXRoaXMuX2dldFRpbWUoKS10aGlzLl9sYXN0Q29tcGxldGVUaW1lPnRoaXMuX3RpbWVvdXQ7YXNTb29uQXNQb3NzaWJsZT0hIWFzU29vbkFzUG9zc2libGV8fCghaGFzU2NoZWR1bGVkVGFza3MmJm9rVG9GaXJlKTtjb25zdCBmb3JjZVRpbWVyVXBkYXRlPWFzU29vbkFzUG9zc2libGUmJiF0aGlzLl9hc1Nvb25Bc1Bvc3NpYmxlO3RoaXMuX2FzU29vbkFzUG9zc2libGU9dGhpcy5fYXNTb29uQXNQb3NzaWJsZXx8YXNTb29uQXNQb3NzaWJsZTt0aGlzLl9pbm5lclNjaGVkdWxlKGZvcmNlVGltZXJVcGRhdGUpO3JldHVybiB0aGlzLl9zY2hlZHVsZVByb21pc2U7fQpfaW5uZXJTY2hlZHVsZShmb3JjZVRpbWVyVXBkYXRlKXtpZih0aGlzLl9pc1J1bm5pbmdQcm9jZXNzKQpyZXR1cm47aWYodGhpcy5fcHJvY2Vzc1RpbWVvdXQmJiFmb3JjZVRpbWVyVXBkYXRlKQpyZXR1cm47aWYodGhpcy5fcHJvY2Vzc1RpbWVvdXQpCnRoaXMuX2NsZWFyVGltZW91dCh0aGlzLl9wcm9jZXNzVGltZW91dCk7Y29uc3QgdGltZW91dD10aGlzLl9hc1Nvb25Bc1Bvc3NpYmxlPzA6dGhpcy5fdGltZW91dDt0aGlzLl9wcm9jZXNzVGltZW91dD10aGlzLl9zZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dC5iaW5kKHRoaXMpLHRpbWVvdXQpO30KX2NsZWFyVGltZW91dCh0aW1lb3V0SWQpe2NsZWFyVGltZW91dCh0aW1lb3V0SWQpO30KX3NldFRpbWVvdXQob3BlcmF0aW9uLHRpbWVvdXQpe3JldHVybiBzZXRUaW1lb3V0KG9wZXJhdGlvbix0aW1lb3V0KTt9Cl9nZXRUaW1lKCl7cmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTt9fTtDb21tb24uVGhyb3R0bGVyLkZpbmlzaENhbGxiYWNrOztDb21tb24uVHJpZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuY2xlYXIoKTt9CmFkZCh3b3JkKXtsZXQgbm9kZT10aGlzLl9yb290OysrdGhpcy5fd29yZHNJblN1YnRyZWVbdGhpcy5fcm9vdF07Zm9yKGxldCBpPTA7aTx3b3JkLmxlbmd0aDsrK2kpe2NvbnN0IGVkZ2U9d29yZFtpXTtsZXQgbmV4dD10aGlzLl9lZGdlc1tub2RlXVtlZGdlXTtpZighbmV4dCl7aWYodGhpcy5fZnJlZU5vZGVzLmxlbmd0aCl7bmV4dD10aGlzLl9mcmVlTm9kZXMucG9wKCk7fWVsc2V7bmV4dD10aGlzLl9zaXplKys7dGhpcy5faXNXb3JkLnB1c2goZmFsc2UpO3RoaXMuX3dvcmRzSW5TdWJ0cmVlLnB1c2goMCk7dGhpcy5fZWRnZXMucHVzaCh7X19wcm90b19fOm51bGx9KTt9CnRoaXMuX2VkZ2VzW25vZGVdW2VkZ2VdPW5leHQ7fQorK3RoaXMuX3dvcmRzSW5TdWJ0cmVlW25leHRdO25vZGU9bmV4dDt9CnRoaXMuX2lzV29yZFtub2RlXT10cnVlO30KcmVtb3ZlKHdvcmQpe2lmKCF0aGlzLmhhcyh3b3JkKSkKcmV0dXJuIGZhbHNlO2xldCBub2RlPXRoaXMuX3Jvb3Q7LS10aGlzLl93b3Jkc0luU3VidHJlZVt0aGlzLl9yb290XTtmb3IobGV0IGk9MDtpPHdvcmQubGVuZ3RoOysraSl7Y29uc3QgZWRnZT13b3JkW2ldO2NvbnN0IG5leHQ9dGhpcy5fZWRnZXNbbm9kZV1bZWRnZV07aWYoIS0tdGhpcy5fd29yZHNJblN1YnRyZWVbbmV4dF0pe2RlbGV0ZSB0aGlzLl9lZGdlc1tub2RlXVtlZGdlXTt0aGlzLl9mcmVlTm9kZXMucHVzaChuZXh0KTt9Cm5vZGU9bmV4dDt9CnRoaXMuX2lzV29yZFtub2RlXT1mYWxzZTtyZXR1cm4gdHJ1ZTt9Cmhhcyh3b3JkKXtsZXQgbm9kZT10aGlzLl9yb290O2ZvcihsZXQgaT0wO2k8d29yZC5sZW5ndGg7KytpKXtub2RlPXRoaXMuX2VkZ2VzW25vZGVdW3dvcmRbaV1dO2lmKCFub2RlKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdGhpcy5faXNXb3JkW25vZGVdO30Kd29yZHMocHJlZml4KXtwcmVmaXg9cHJlZml4fHwnJztsZXQgbm9kZT10aGlzLl9yb290O2ZvcihsZXQgaT0wO2k8cHJlZml4Lmxlbmd0aDsrK2kpe25vZGU9dGhpcy5fZWRnZXNbbm9kZV1bcHJlZml4W2ldXTtpZighbm9kZSkKcmV0dXJuW107fQpjb25zdCByZXN1bHRzPVtdO3RoaXMuX2Rmcyhub2RlLHByZWZpeCxyZXN1bHRzKTtyZXR1cm4gcmVzdWx0czt9Cl9kZnMobm9kZSxwcmVmaXgscmVzdWx0cyl7aWYodGhpcy5faXNXb3JkW25vZGVdKQpyZXN1bHRzLnB1c2gocHJlZml4KTtjb25zdCBlZGdlcz10aGlzLl9lZGdlc1tub2RlXTtmb3IoY29uc3QgZWRnZSBpbiBlZGdlcykKdGhpcy5fZGZzKGVkZ2VzW2VkZ2VdLHByZWZpeCtlZGdlLHJlc3VsdHMpO30KbG9uZ2VzdFByZWZpeCh3b3JkLGZ1bGxXb3JkT25seSl7bGV0IG5vZGU9dGhpcy5fcm9vdDtsZXQgd29yZEluZGV4PTA7Zm9yKGxldCBpPTA7aTx3b3JkLmxlbmd0aDsrK2kpe25vZGU9dGhpcy5fZWRnZXNbbm9kZV1bd29yZFtpXV07aWYoIW5vZGUpCmJyZWFrO2lmKCFmdWxsV29yZE9ubHl8fHRoaXMuX2lzV29yZFtub2RlXSkKd29yZEluZGV4PWkrMTt9CnJldHVybiB3b3JkLnN1YnN0cmluZygwLHdvcmRJbmRleCk7fQpjbGVhcigpe3RoaXMuX3NpemU9MTt0aGlzLl9yb290PTA7dGhpcy5fZWRnZXM9W3tfX3Byb3RvX186bnVsbH1dO3RoaXMuX2lzV29yZD1bZmFsc2VdO3RoaXMuX3dvcmRzSW5TdWJ0cmVlPVswXTt0aGlzLl9mcmVlTm9kZXM9W107fX07O3NlbGZbJ0NvbW1vbiddPXNlbGZbJ0NvbW1vbiddfHx7fTtDb21tb24uVUlTdHJpbmc9ZnVuY3Rpb24oc3RyaW5nLHZhcmFyZyl7cmV0dXJuIFN0cmluZy52c3ByaW50ZihDb21tb24ubG9jYWxpemUoc3RyaW5nKSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpO307Q29tbW9uLmxvY2FsaXplPWZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHN0cmluZzt9O0NvbW1vbi5VSVN0cmluZ0Zvcm1hdD1jbGFzc3tjb25zdHJ1Y3Rvcihmb3JtYXQpe3RoaXMuX2xvY2FsaXplZEZvcm1hdD1Db21tb24ubG9jYWxpemUoZm9ybWF0KTt0aGlzLl90b2tlbml6ZWRGb3JtYXQ9U3RyaW5nLnRva2VuaXplRm9ybWF0U3RyaW5nKHRoaXMuX2xvY2FsaXplZEZvcm1hdCxTdHJpbmcuc3RhbmRhcmRGb3JtYXR0ZXJzKTt9CnN0YXRpYyBfYXBwZW5kKGEsYil7cmV0dXJuIGErYjt9CmZvcm1hdCh2YXJhcmcpe3JldHVybiBTdHJpbmcuZm9ybWF0KHRoaXMuX2xvY2FsaXplZEZvcm1hdCxhcmd1bWVudHMsU3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycywnJyxDb21tb24uVUlTdHJpbmdGb3JtYXQuX2FwcGVuZCx0aGlzLl90b2tlbml6ZWRGb3JtYXQpLmZvcm1hdHRlZFJlc3VsdDt9fTtzZWxmLmxzPWZ1bmN0aW9uKHN0cmluZ3MsdmFyYXJnKXtpZih0eXBlb2Ygc3RyaW5ncz09PSdzdHJpbmcnKQpyZXR1cm4gc3RyaW5ncztjb25zdCB2YWx1ZXM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2lmKCF2YWx1ZXMubGVuZ3RoKQpyZXR1cm4gc3RyaW5nc1swXTtsZXQgcmVzdWx0PScnO2ZvcihsZXQgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe3Jlc3VsdCs9c3RyaW5nc1tpXTtyZXN1bHQrPScnK3ZhbHVlc1tpXTt9CnJldHVybiByZXN1bHQrc3RyaW5nc1t2YWx1ZXMubGVuZ3RoXTt9OztDb21tb24uUmVuZGVyZXI9ZnVuY3Rpb24oKXt9O0NvbW1vbi5SZW5kZXJlci5wcm90b3R5cGU9e3JlbmRlcihvYmplY3Qsb3B0aW9ucyl7fX07Q29tbW9uLlJlbmRlcmVyLnJlbmRlcj1mdW5jdGlvbihvYmplY3Qsb3B0aW9ucyl7aWYoIW9iamVjdCkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ2FuXCd0IHJlbmRlciAnK29iamVjdCkpO3JldHVybiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9uKENvbW1vbi5SZW5kZXJlcixvYmplY3QpLmluc3RhbmNlKCkudGhlbihyZW5kZXJlcj0+cmVuZGVyZXIucmVuZGVyKG9iamVjdCxvcHRpb25zfHx7fSkpO307Q29tbW9uLlJlbmRlcmVyLk9wdGlvbnM7Q29tbW9uLlJldmVhbGVyPWZ1bmN0aW9uKCl7fTtDb21tb24uUmV2ZWFsZXIucmV2ZWFsPWZ1bmN0aW9uKHJldmVhbGFibGUsb21pdEZvY3VzKXtpZighcmV2ZWFsYWJsZSkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ2FuXCd0IHJldmVhbCAnK3JldmVhbGFibGUpKTtyZXR1cm4gc2VsZi5ydW50aW1lLmFsbEluc3RhbmNlcyhDb21tb24uUmV2ZWFsZXIscmV2ZWFsYWJsZSkudGhlbihyZXZlYWwpO2Z1bmN0aW9uIHJldmVhbChyZXZlYWxlcnMpe2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8cmV2ZWFsZXJzLmxlbmd0aDsrK2kpCnByb21pc2VzLnB1c2gocmV2ZWFsZXJzW2ldLnJldmVhbCgocmV2ZWFsYWJsZSksb21pdEZvY3VzKSk7cmV0dXJuIFByb21pc2UucmFjZShwcm9taXNlcyk7fX07Q29tbW9uLlJldmVhbGVyLnJldmVhbERlc3RpbmF0aW9uPWZ1bmN0aW9uKHJldmVhbGFibGUpe2NvbnN0IGV4dGVuc2lvbj1zZWxmLnJ1bnRpbWUuZXh0ZW5zaW9uKENvbW1vbi5SZXZlYWxlcixyZXZlYWxhYmxlKTtpZighZXh0ZW5zaW9uKQpyZXR1cm4gbnVsbDtyZXR1cm4gZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnZGVzdGluYXRpb24nXTt9O0NvbW1vbi5SZXZlYWxlci5wcm90b3R5cGU9e3JldmVhbChvYmplY3Qsb21pdEZvY3VzKXt9fTtDb21tb24uQXBwPWZ1bmN0aW9uKCl7fTtDb21tb24uQXBwLnByb3RvdHlwZT17cHJlc2VudFVJKGRvY3VtZW50KXt9fTtDb21tb24uQXBwUHJvdmlkZXI9ZnVuY3Rpb24oKXt9O0NvbW1vbi5BcHBQcm92aWRlci5wcm90b3R5cGU9e2NyZWF0ZUFwcCgpe319O0NvbW1vbi5RdWVyeVBhcmFtSGFuZGxlcj1mdW5jdGlvbigpe307Q29tbW9uLlF1ZXJ5UGFyYW1IYW5kbGVyLnByb3RvdHlwZT17aGFuZGxlUXVlcnlQYXJhbSh2YWx1ZSl7fX07Q29tbW9uLlJ1bm5hYmxlPWZ1bmN0aW9uKCl7fTtDb21tb24uUnVubmFibGUucHJvdG90eXBlPXtydW4oKXt9fTtDb21tb24uTGlua2lmaWVyPWZ1bmN0aW9uKCl7fTtDb21tb24uTGlua2lmaWVyLnByb3RvdHlwZT17bGlua2lmeShvYmplY3Qsb3B0aW9ucyl7fX07Q29tbW9uLkxpbmtpZmllci5saW5raWZ5PWZ1bmN0aW9uKG9iamVjdCxvcHRpb25zKXtpZighb2JqZWN0KQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdDYW5cJ3QgbGlua2lmeSAnK29iamVjdCkpO3JldHVybiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9uKENvbW1vbi5MaW5raWZpZXIsb2JqZWN0KS5pbnN0YW5jZSgpLnRoZW4obGlua2lmaWVyPT5saW5raWZpZXIubGlua2lmeShvYmplY3Qsb3B0aW9ucykpO307Q29tbW9uLkxpbmtpZmllci5PcHRpb25zO0NvbW1vbi5KYXZhU2NyaXB0TWV0YWRhdGE9ZnVuY3Rpb24oKXt9O0NvbW1vbi5KYXZhU2NyaXB0TWV0YWRhdGEucHJvdG90eXBlPXtzaWduYXR1cmVzRm9yTmF0aXZlRnVuY3Rpb24obmFtZSl7fSxzaWduYXR1cmVzRm9ySW5zdGFuY2VNZXRob2QobmFtZSxyZWNlaXZlckNsYXNzTmFtZSl7fSxzaWduYXR1cmVzRm9yU3RhdGljTWV0aG9kKG5hbWUscmVjZWl2ZXJDb25zdHJ1Y3Rvck5hbWUpe319OztDb21tb24uQ2hhcmFjdGVySWRNYXA9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9lbGVtZW50VG9DaGFyYWN0ZXI9bmV3IE1hcCgpO3RoaXMuX2NoYXJhY3RlclRvRWxlbWVudD1uZXcgTWFwKCk7dGhpcy5fY2hhckNvZGU9MzM7fQp0b0NoYXIob2JqZWN0KXtsZXQgY2hhcmFjdGVyPXRoaXMuX2VsZW1lbnRUb0NoYXJhY3Rlci5nZXQob2JqZWN0KTtpZighY2hhcmFjdGVyKXtpZih0aGlzLl9jaGFyQ29kZT49MHhGRkZGKQp0aHJvdyBuZXcgRXJyb3IoJ0NoYXJhY3RlcklkTWFwIHJhbiBvdXQgb2YgY2FwYWNpdHkhJyk7Y2hhcmFjdGVyPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5fY2hhckNvZGUrKyk7dGhpcy5fZWxlbWVudFRvQ2hhcmFjdGVyLnNldChvYmplY3QsY2hhcmFjdGVyKTt0aGlzLl9jaGFyYWN0ZXJUb0VsZW1lbnQuc2V0KGNoYXJhY3RlcixvYmplY3QpO30KcmV0dXJuIGNoYXJhY3Rlcjt9CmZyb21DaGFyKGNoYXJhY3Rlcil7Y29uc3Qgb2JqZWN0PXRoaXMuX2NoYXJhY3RlclRvRWxlbWVudC5nZXQoY2hhcmFjdGVyKTtpZihvYmplY3Q9PT11bmRlZmluZWQpCnJldHVybiBudWxsO3JldHVybiBvYmplY3Q7fX07O3NlbGZbJ0hvc3QnXT1zZWxmWydIb3N0J118fHt9O2Z1bmN0aW9uIEluc3BlY3RvckZyb250ZW5kSG9zdEFQSSgpe30Kd2luZG93Lkluc3BlY3RvckZyb250ZW5kSG9zdEFQST1JbnNwZWN0b3JGcm9udGVuZEhvc3RBUEk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkNvbnRleHRNZW51RGVzY3JpcHRvcjtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuTG9hZE5ldHdvcmtSZXNvdXJjZVJlc3VsdDtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzPXtBZGRFeHRlbnNpb25zOlN5bWJvbCgnYWRkRXh0ZW5zaW9ucycpLEFwcGVuZGVkVG9VUkw6U3ltYm9sKCdhcHBlbmRlZFRvVVJMJyksQ2FuY2VsZWRTYXZlVVJMOlN5bWJvbCgnY2FuY2VsZWRTYXZlVVJMJyksQ29udGV4dE1lbnVDbGVhcmVkOlN5bWJvbCgnY29udGV4dE1lbnVDbGVhcmVkJyksQ29udGV4dE1lbnVJdGVtU2VsZWN0ZWQ6U3ltYm9sKCdjb250ZXh0TWVudUl0ZW1TZWxlY3RlZCcpLERldmljZUNvdW50VXBkYXRlZDpTeW1ib2woJ2RldmljZUNvdW50VXBkYXRlZCcpLERldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkOlN5bWJvbCgnZGV2aWNlc0Rpc2NvdmVyeUNvbmZpZ0NoYW5nZWQnKSxEZXZpY2VzUG9ydEZvcndhcmRpbmdTdGF0dXNDaGFuZ2VkOlN5bWJvbCgnZGV2aWNlc1BvcnRGb3J3YXJkaW5nU3RhdHVzQ2hhbmdlZCcpLERldmljZXNVcGRhdGVkOlN5bWJvbCgnZGV2aWNlc1VwZGF0ZWQnKSxEaXNwYXRjaE1lc3NhZ2U6U3ltYm9sKCdkaXNwYXRjaE1lc3NhZ2UnKSxEaXNwYXRjaE1lc3NhZ2VDaHVuazpTeW1ib2woJ2Rpc3BhdGNoTWVzc2FnZUNodW5rJyksRW50ZXJJbnNwZWN0RWxlbWVudE1vZGU6U3ltYm9sKCdlbnRlckluc3BlY3RFbGVtZW50TW9kZScpLEV5ZURyb3BwZXJQaWNrZWRDb2xvcjpTeW1ib2woJ2V5ZURyb3BwZXJQaWNrZWRDb2xvcicpLEZpbGVTeXN0ZW1zTG9hZGVkOlN5bWJvbCgnZmlsZVN5c3RlbXNMb2FkZWQnKSxGaWxlU3lzdGVtUmVtb3ZlZDpTeW1ib2woJ2ZpbGVTeXN0ZW1SZW1vdmVkJyksRmlsZVN5c3RlbUFkZGVkOlN5bWJvbCgnZmlsZVN5c3RlbUFkZGVkJyksRmlsZVN5c3RlbUZpbGVzQ2hhbmdlZEFkZGVkUmVtb3ZlZDpTeW1ib2woJ0ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWRBZGRlZFJlbW92ZWQnKSxJbmRleGluZ1RvdGFsV29ya0NhbGN1bGF0ZWQ6U3ltYm9sKCdpbmRleGluZ1RvdGFsV29ya0NhbGN1bGF0ZWQnKSxJbmRleGluZ1dvcmtlZDpTeW1ib2woJ2luZGV4aW5nV29ya2VkJyksSW5kZXhpbmdEb25lOlN5bWJvbCgnaW5kZXhpbmdEb25lJyksS2V5RXZlbnRVbmhhbmRsZWQ6U3ltYm9sKCdrZXlFdmVudFVuaGFuZGxlZCcpLFJlbG9hZEluc3BlY3RlZFBhZ2U6U3ltYm9sKCdyZWxvYWRJbnNwZWN0ZWRQYWdlJyksUmV2ZWFsU291cmNlTGluZTpTeW1ib2woJ3JldmVhbFNvdXJjZUxpbmUnKSxTYXZlZFVSTDpTeW1ib2woJ3NhdmVkVVJMJyksU2VhcmNoQ29tcGxldGVkOlN5bWJvbCgnc2VhcmNoQ29tcGxldGVkJyksU2V0SW5zcGVjdGVkVGFiSWQ6U3ltYm9sKCdzZXRJbnNwZWN0ZWRUYWJJZCcpLFNldFVzZVNvZnRNZW51OlN5bWJvbCgnc2V0VXNlU29mdE1lbnUnKSxTaG93UGFuZWw6U3ltYm9sKCdzaG93UGFuZWwnKX07SW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50RGVzY3JpcHRvcnM9W1tJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkFkZEV4dGVuc2lvbnMsJ2FkZEV4dGVuc2lvbnMnLFsnZXh0ZW5zaW9ucyddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5BcHBlbmRlZFRvVVJMLCdhcHBlbmRlZFRvVVJMJyxbJ3VybCddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5DYW5jZWxlZFNhdmVVUkwsJ2NhbmNlbGVkU2F2ZVVSTCcsWyd1cmwnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuQ29udGV4dE1lbnVDbGVhcmVkLCdjb250ZXh0TWVudUNsZWFyZWQnLFtdXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5Db250ZXh0TWVudUl0ZW1TZWxlY3RlZCwnY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQnLFsnaWQnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRGV2aWNlQ291bnRVcGRhdGVkLCdkZXZpY2VDb3VudFVwZGF0ZWQnLFsnY291bnQnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRGV2aWNlc0Rpc2NvdmVyeUNvbmZpZ0NoYW5nZWQsJ2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkJyxbJ2NvbmZpZyddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5EZXZpY2VzUG9ydEZvcndhcmRpbmdTdGF0dXNDaGFuZ2VkLCdkZXZpY2VzUG9ydEZvcndhcmRpbmdTdGF0dXNDaGFuZ2VkJyxbJ3N0YXR1cyddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5EZXZpY2VzVXBkYXRlZCwnZGV2aWNlc1VwZGF0ZWQnLFsnZGV2aWNlcyddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5EaXNwYXRjaE1lc3NhZ2UsJ2Rpc3BhdGNoTWVzc2FnZScsWydtZXNzYWdlT2JqZWN0J11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRpc3BhdGNoTWVzc2FnZUNodW5rLCdkaXNwYXRjaE1lc3NhZ2VDaHVuaycsWydtZXNzYWdlQ2h1bmsnLCdtZXNzYWdlU2l6ZSddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5FbnRlckluc3BlY3RFbGVtZW50TW9kZSwnZW50ZXJJbnNwZWN0RWxlbWVudE1vZGUnLFtdXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5FeWVEcm9wcGVyUGlja2VkQ29sb3IsJ2V5ZURyb3BwZXJQaWNrZWRDb2xvcicsWydjb2xvciddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5GaWxlU3lzdGVtc0xvYWRlZCwnZmlsZVN5c3RlbXNMb2FkZWQnLFsnZmlsZVN5c3RlbXMnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRmlsZVN5c3RlbVJlbW92ZWQsJ2ZpbGVTeXN0ZW1SZW1vdmVkJyxbJ2ZpbGVTeXN0ZW1QYXRoJ11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkZpbGVTeXN0ZW1BZGRlZCwnZmlsZVN5c3RlbUFkZGVkJyxbJ2Vycm9yTWVzc2FnZScsJ2ZpbGVTeXN0ZW0nXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRmlsZVN5c3RlbUZpbGVzQ2hhbmdlZEFkZGVkUmVtb3ZlZCwnZmlsZVN5c3RlbUZpbGVzQ2hhbmdlZEFkZGVkUmVtb3ZlZCcsWydjaGFuZ2VkJywnYWRkZWQnLCdyZW1vdmVkJ11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkluZGV4aW5nVG90YWxXb3JrQ2FsY3VsYXRlZCwnaW5kZXhpbmdUb3RhbFdvcmtDYWxjdWxhdGVkJyxbJ3JlcXVlc3RJZCcsJ2ZpbGVTeXN0ZW1QYXRoJywndG90YWxXb3JrJ11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkluZGV4aW5nV29ya2VkLCdpbmRleGluZ1dvcmtlZCcsWydyZXF1ZXN0SWQnLCdmaWxlU3lzdGVtUGF0aCcsJ3dvcmtlZCddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5JbmRleGluZ0RvbmUsJ2luZGV4aW5nRG9uZScsWydyZXF1ZXN0SWQnLCdmaWxlU3lzdGVtUGF0aCddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5LZXlFdmVudFVuaGFuZGxlZCwna2V5RXZlbnRVbmhhbmRsZWQnLFsnZXZlbnQnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuUmVsb2FkSW5zcGVjdGVkUGFnZSwncmVsb2FkSW5zcGVjdGVkUGFnZScsWydoYXJkJ11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLlJldmVhbFNvdXJjZUxpbmUsJ3JldmVhbFNvdXJjZUxpbmUnLFsndXJsJywnbGluZU51bWJlcicsJ2NvbHVtbk51bWJlciddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5TYXZlZFVSTCwnc2F2ZWRVUkwnLFsndXJsJywnZmlsZVN5c3RlbVBhdGgnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuU2VhcmNoQ29tcGxldGVkLCdzZWFyY2hDb21wbGV0ZWQnLFsncmVxdWVzdElkJywnZmlsZVN5c3RlbVBhdGgnLCdmaWxlcyddXSxbSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5TZXRJbnNwZWN0ZWRUYWJJZCwnc2V0SW5zcGVjdGVkVGFiSWQnLFsndGFiSWQnXV0sW0luc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuU2V0VXNlU29mdE1lbnUsJ3NldFVzZVNvZnRNZW51JyxbJ3VzZVNvZnRNZW51J11dLFtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLlNob3dQYW5lbCwnc2hvd1BhbmVsJyxbJ3BhbmVsTmFtZSddXV07SW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLnByb3RvdHlwZT17YWRkRmlsZVN5c3RlbSh0eXBlKXt9LGFwcGVuZCh1cmwsY29udGVudCl7fSxsb2FkQ29tcGxldGVkKCl7fSxpbmRleFBhdGgocmVxdWVzdElkLGZpbGVTeXN0ZW1QYXRoLGV4Y2x1ZGVkRm9sZGVycyl7fSxnZXRTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKXt9LGdldFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpe30sZ2V0SW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKXt9LGdldEluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCl7fSxzZXRJbnNwZWN0ZWRQYWdlQm91bmRzKGJvdW5kcyl7fSxzaG93Q2VydGlmaWNhdGVWaWV3ZXIoY2VydENoYWluKXt9LHNldFdoaXRlbGlzdGVkU2hvcnRjdXRzKHNob3J0Y3V0cyl7fSxzZXRFeWVEcm9wcGVyQWN0aXZlKGFjdGl2ZSl7fSxpbnNwZWN0RWxlbWVudENvbXBsZXRlZCgpe30sb3BlbkluTmV3VGFiKHVybCl7fSxzaG93SXRlbUluRm9sZGVyKGZpbGVTeXN0ZW1QYXRoKXt9LHJlbW92ZUZpbGVTeXN0ZW0oZmlsZVN5c3RlbVBhdGgpe30scmVxdWVzdEZpbGVTeXN0ZW1zKCl7fSxzYXZlKHVybCxjb250ZW50LGZvcmNlU2F2ZUFzKXt9LHNlYXJjaEluUGF0aChyZXF1ZXN0SWQsZmlsZVN5c3RlbVBhdGgscXVlcnkpe30sc3RvcEluZGV4aW5nKHJlcXVlc3RJZCl7fSxicmluZ1RvRnJvbnQoKXt9LGNsb3NlV2luZG93KCl7fSxjb3B5VGV4dCh0ZXh0KXt9LGluc3BlY3RlZFVSTENoYW5nZWQodXJsKXt9LGlzb2xhdGVkRmlsZVN5c3RlbShmaWxlU3lzdGVtSWQscmVnaXN0ZXJlZE5hbWUpe30sbG9hZE5ldHdvcmtSZXNvdXJjZSh1cmwsaGVhZGVycyxzdHJlYW1JZCxjYWxsYmFjayl7fSxnZXRQcmVmZXJlbmNlcyhjYWxsYmFjayl7fSxzZXRQcmVmZXJlbmNlKG5hbWUsdmFsdWUpe30scmVtb3ZlUHJlZmVyZW5jZShuYW1lKXt9LGNsZWFyUHJlZmVyZW5jZXMoKXt9LHVwZ3JhZGVEcmFnZ2VkRmlsZVN5c3RlbVBlcm1pc3Npb25zKGZpbGVTeXN0ZW0pe30scGxhdGZvcm0oKXt9LHJlY29yZEVudW1lcmF0ZWRIaXN0b2dyYW0oYWN0aW9uTmFtZSxhY3Rpb25Db2RlLGJ1Y2tldFNpemUpe30sc2VuZE1lc3NhZ2VUb0JhY2tlbmQobWVzc2FnZSl7fSxzZXREZXZpY2VzRGlzY292ZXJ5Q29uZmlnKGNvbmZpZyl7fSxzZXREZXZpY2VzVXBkYXRlc0VuYWJsZWQoZW5hYmxlZCl7fSxwZXJmb3JtQWN0aW9uT25SZW1vdGVQYWdlKHBhZ2VJZCxhY3Rpb24pe30sb3BlblJlbW90ZVBhZ2UoYnJvd3NlcklkLHVybCl7fSxvcGVuTm9kZUZyb250ZW5kKCl7fSxzZXRJbmplY3RlZFNjcmlwdEZvck9yaWdpbihvcmlnaW4sc2NyaXB0KXt9LHNldElzRG9ja2VkKGlzRG9ja2VkLGNhbGxiYWNrKXt9LHpvb21GYWN0b3IoKXt9LHpvb21Jbigpe30sem9vbU91dCgpe30scmVzZXRab29tKCl7fSxzaG93Q29udGV4dE1lbnVBdFBvaW50KHgseSxpdGVtcyxkb2N1bWVudCl7fSxyZWF0dGFjaChjYWxsYmFjayl7fSxyZWFkeUZvclRlc3QoKXt9LGNvbm5lY3Rpb25SZWFkeSgpe30sc2V0T3Blbk5ld1dpbmRvd0ZvclBvcHVwcyh2YWx1ZSl7fSxpc0hvc3RlZE1vZGUoKXt9fTs7SG9zdC5JbnNwZWN0b3JGcm9udGVuZEhvc3RTdHViPWNsYXNze2NvbnN0cnVjdG9yKCl7ZnVuY3Rpb24gc3RvcEV2ZW50UHJvcGFnYXRpb24oZXZlbnQpe2NvbnN0IHpvb21Nb2RpZmllcj1Ib3N0LmlzTWFjKCk/ZXZlbnQubWV0YUtleTpldmVudC5jdHJsS2V5O2lmKHpvb21Nb2RpZmllciYmKGV2ZW50LmtleUNvZGU9PT0xODd8fGV2ZW50LmtleUNvZGU9PT0xODkpKQpldmVudC5zdG9wUHJvcGFnYXRpb24oKTt9CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHN0b3BFdmVudFByb3BhZ2F0aW9uLHRydWUpO30KZ2V0U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCl7cmV0dXJuJyM2ZTg2ZmYnO30KZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCl7cmV0dXJuJyNmZmZmZmYnO30KZ2V0SW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKXtyZXR1cm4nI2M5YzhjOCc7fQpnZXRJbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpe3JldHVybicjMzIzMjMyJzt9CnBsYXRmb3JtKCl7bGV0IG1hdGNoPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MgTlQvKTtpZihtYXRjaCkKcmV0dXJuJ3dpbmRvd3MnO21hdGNoPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01hYyBPUyBYLyk7aWYobWF0Y2gpCnJldHVybidtYWMnO3JldHVybidsaW51eCc7fQpsb2FkQ29tcGxldGVkKCl7fQpicmluZ1RvRnJvbnQoKXt0aGlzLl93aW5kb3dWaXNpYmxlPXRydWU7fQpjbG9zZVdpbmRvdygpe3RoaXMuX3dpbmRvd1Zpc2libGU9ZmFsc2U7fQpzZXRJc0RvY2tlZChpc0RvY2tlZCxjYWxsYmFjayl7c2V0VGltZW91dChjYWxsYmFjaywwKTt9CnNldEluc3BlY3RlZFBhZ2VCb3VuZHMoYm91bmRzKXt9Cmluc3BlY3RFbGVtZW50Q29tcGxldGVkKCl7fQpzZXRJbmplY3RlZFNjcmlwdEZvck9yaWdpbihvcmlnaW4sc2NyaXB0KXt9Cmluc3BlY3RlZFVSTENoYW5nZWQodXJsKXtkb2N1bWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0RldlRvb2xzIC0gJXMnLHVybC5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCcnKSk7fQpjb3B5VGV4dCh0ZXh0KXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkKXtuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTt9ZWxzZSBpZihkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQoJ2NvcHknKSl7Y29uc3QgaW5wdXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtpbnB1dC52YWx1ZT10ZXh0O2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wdXQpO2lucHV0LnNlbGVjdCgpO2RvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbnB1dCk7fWVsc2V7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0NsaXBib2FyZCBpcyBub3QgZW5hYmxlZCBpbiBob3N0ZWQgbW9kZS4gUGxlYXNlIGluc3BlY3QgdXNpbmcgY2hyb21lOi8vaW5zcGVjdCcpO319Cm9wZW5Jbk5ld1RhYih1cmwpe3dpbmRvdy5vcGVuKHVybCwnX2JsYW5rJyk7fQpzaG93SXRlbUluRm9sZGVyKGZpbGVTeXN0ZW1QYXRoKXtDb21tb24uY29uc29sZS5lcnJvcignU2hvdyBpdGVtIGluIGZvbGRlciBpcyBub3QgZW5hYmxlZCBpbiBob3N0ZWQgbW9kZS4gUGxlYXNlIGluc3BlY3QgdXNpbmcgY2hyb21lOi8vaW5zcGVjdCcpO30Kc2F2ZSh1cmwsY29udGVudCxmb3JjZVNhdmVBcyl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ1NhdmluZyBmaWxlcyBpcyBub3QgZW5hYmxlZCBpbiBob3N0ZWQgbW9kZS4gUGxlYXNlIGluc3BlY3QgdXNpbmcgY2hyb21lOi8vaW5zcGVjdCcpO3RoaXMuZXZlbnRzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkNhbmNlbGVkU2F2ZVVSTCx1cmwpO30KYXBwZW5kKHVybCxjb250ZW50KXtDb21tb24uY29uc29sZS5lcnJvcignU2F2aW5nIGZpbGVzIGlzIG5vdCBlbmFibGVkIGluIGhvc3RlZCBtb2RlLiBQbGVhc2UgaW5zcGVjdCB1c2luZyBjaHJvbWU6Ly9pbnNwZWN0Jyk7fQpzZW5kTWVzc2FnZVRvQmFja2VuZChtZXNzYWdlKXt9CnJlY29yZEVudW1lcmF0ZWRIaXN0b2dyYW0oYWN0aW9uTmFtZSxhY3Rpb25Db2RlLGJ1Y2tldFNpemUpe30KcmVxdWVzdEZpbGVTeXN0ZW1zKCl7dGhpcy5ldmVudHMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRmlsZVN5c3RlbXNMb2FkZWQsW10pO30KYWRkRmlsZVN5c3RlbSh0eXBlKXt9CnJlbW92ZUZpbGVTeXN0ZW0oZmlsZVN5c3RlbVBhdGgpe30KaXNvbGF0ZWRGaWxlU3lzdGVtKGZpbGVTeXN0ZW1JZCxyZWdpc3RlcmVkTmFtZSl7cmV0dXJuIG51bGw7fQpsb2FkTmV0d29ya1Jlc291cmNlKHVybCxoZWFkZXJzLHN0cmVhbUlkLGNhbGxiYWNrKXtSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UodXJsKS50aGVuKGZ1bmN0aW9uKHRleHQpe0hvc3QuUmVzb3VyY2VMb2FkZXIuc3RyZWFtV3JpdGUoc3RyZWFtSWQsdGV4dCk7Y2FsbGJhY2soe3N0YXR1c0NvZGU6MjAwfSk7fSkuY2F0Y2goZnVuY3Rpb24oKXtjYWxsYmFjayh7c3RhdHVzQ29kZTo0MDR9KTt9KTt9CmdldFByZWZlcmVuY2VzKGNhbGxiYWNrKXtjb25zdCBwcmVmcz17fTtmb3IoY29uc3QgbmFtZSBpbiB3aW5kb3cubG9jYWxTdG9yYWdlKQpwcmVmc1tuYW1lXT13aW5kb3cubG9jYWxTdG9yYWdlW25hbWVdO2NhbGxiYWNrKHByZWZzKTt9CnNldFByZWZlcmVuY2UobmFtZSx2YWx1ZSl7d2luZG93LmxvY2FsU3RvcmFnZVtuYW1lXT12YWx1ZTt9CnJlbW92ZVByZWZlcmVuY2UobmFtZSl7ZGVsZXRlIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbmFtZV07fQpjbGVhclByZWZlcmVuY2VzKCl7d2luZG93LmxvY2FsU3RvcmFnZS5jbGVhcigpO30KdXBncmFkZURyYWdnZWRGaWxlU3lzdGVtUGVybWlzc2lvbnMoZmlsZVN5c3RlbSl7fQppbmRleFBhdGgocmVxdWVzdElkLGZpbGVTeXN0ZW1QYXRoLGV4Y2x1ZGVkRm9sZGVycyl7fQpzdG9wSW5kZXhpbmcocmVxdWVzdElkKXt9CnNlYXJjaEluUGF0aChyZXF1ZXN0SWQsZmlsZVN5c3RlbVBhdGgscXVlcnkpe30Kem9vbUZhY3Rvcigpe3JldHVybiAxO30Kem9vbUluKCl7fQp6b29tT3V0KCl7fQpyZXNldFpvb20oKXt9CnNldFdoaXRlbGlzdGVkU2hvcnRjdXRzKHNob3J0Y3V0cyl7fQpzZXRFeWVEcm9wcGVyQWN0aXZlKGFjdGl2ZSl7fQpzaG93Q2VydGlmaWNhdGVWaWV3ZXIoY2VydENoYWluKXt9CnJlYXR0YWNoKGNhbGxiYWNrKXt9CnJlYWR5Rm9yVGVzdCgpe30KY29ubmVjdGlvblJlYWR5KCl7fQpzZXRPcGVuTmV3V2luZG93Rm9yUG9wdXBzKHZhbHVlKXt9CnNldERldmljZXNEaXNjb3ZlcnlDb25maWcoY29uZmlnKXt9CnNldERldmljZXNVcGRhdGVzRW5hYmxlZChlbmFibGVkKXt9CnBlcmZvcm1BY3Rpb25PblJlbW90ZVBhZ2UocGFnZUlkLGFjdGlvbil7fQpvcGVuUmVtb3RlUGFnZShicm93c2VySWQsdXJsKXt9Cm9wZW5Ob2RlRnJvbnRlbmQoKXt9CnNob3dDb250ZXh0TWVudUF0UG9pbnQoeCx5LGl0ZW1zLGRvY3VtZW50KXt0aHJvdydTb2Z0IGNvbnRleHQgbWVudSBzaG91bGQgYmUgdXNlZCc7fQppc0hvc3RlZE1vZGUoKXtyZXR1cm4gdHJ1ZTt9fTtIb3N0Lkluc3BlY3RvckZyb250ZW5kQVBJSW1wbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlYnVnRnJvbnRlbmQ9ISFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKXx8KHdpbmRvd1snSW5zcGVjdG9yVGVzdCddJiZ3aW5kb3dbJ0luc3BlY3RvclRlc3QnXVsnZGVidWdUZXN0J10pO2NvbnN0IGRlc2NyaXB0b3JzPUluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudERlc2NyaXB0b3JzO2ZvcihsZXQgaT0wO2k8ZGVzY3JpcHRvcnMubGVuZ3RoOysraSkKdGhpc1tkZXNjcmlwdG9yc1tpXVsxXV09dGhpcy5fZGlzcGF0Y2guYmluZCh0aGlzLGRlc2NyaXB0b3JzW2ldWzBdLGRlc2NyaXB0b3JzW2ldWzJdLGRlc2NyaXB0b3JzW2ldWzNdKTt9Cl9kaXNwYXRjaChuYW1lLHNpZ25hdHVyZSxydW5PbmNlTG9hZGVkKXtjb25zdCBwYXJhbXM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO2lmKHRoaXMuX2RlYnVnRnJvbnRlbmQpCnNldEltbWVkaWF0ZShpbm5lckRpc3BhdGNoKTtlbHNlCmlubmVyRGlzcGF0Y2goKTtmdW5jdGlvbiBpbm5lckRpc3BhdGNoKCl7aWYoc2lnbmF0dXJlLmxlbmd0aDwyKXt0cnl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMobmFtZSxwYXJhbXNbMF0pO31jYXRjaChlKXtjb25zb2xlLmVycm9yKGUrJyAnK2Uuc3RhY2spO30KcmV0dXJuO30KY29uc3QgZGF0YT17fTtmb3IobGV0IGk9MDtpPHNpZ25hdHVyZS5sZW5ndGg7KytpKQpkYXRhW3NpZ25hdHVyZVtpXV09cGFyYW1zW2ldO3RyeXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhuYW1lLGRhdGEpO31jYXRjaChlKXtjb25zb2xlLmVycm9yKGUrJyAnK2Uuc3RhY2spO319fQpzdHJlYW1Xcml0ZShpZCxjaHVuayl7SG9zdC5SZXNvdXJjZUxvYWRlci5zdHJlYW1Xcml0ZShpZCxjaHVuayk7fX07bGV0IEluc3BlY3RvckZyb250ZW5kSG9zdD13aW5kb3cuSW5zcGVjdG9yRnJvbnRlbmRIb3N0fHxudWxsO3dpbmRvdy5JbnNwZWN0b3JGcm9udGVuZEhvc3Q9SW5zcGVjdG9yRnJvbnRlbmRIb3N0OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGluaXRpYWxpemVJbnNwZWN0b3JGcm9udGVuZEhvc3QoKXtsZXQgcHJvdG87aWYoIUluc3BlY3RvckZyb250ZW5kSG9zdCl7d2luZG93Lkluc3BlY3RvckZyb250ZW5kSG9zdD1JbnNwZWN0b3JGcm9udGVuZEhvc3Q9bmV3IEhvc3QuSW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1YigpO31lbHNle3Byb3RvPUhvc3QuSW5zcGVjdG9yRnJvbnRlbmRIb3N0U3R1Yi5wcm90b3R5cGU7Zm9yKGNvbnN0IG5hbWUgaW4gcHJvdG8pe2NvbnN0IHZhbHVlPXByb3RvW25hbWVdO2lmKHR5cGVvZiB2YWx1ZSE9PSdmdW5jdGlvbid8fEluc3BlY3RvckZyb250ZW5kSG9zdFtuYW1lXSkKY29udGludWU7SW5zcGVjdG9yRnJvbnRlbmRIb3N0W25hbWVdPXN0dWIuYmluZChudWxsLG5hbWUpO319CmZ1bmN0aW9uIHN0dWIobmFtZSl7Y29uc29sZS5lcnJvcignSW5jb21wYXRpYmxlIGVtYmVkZGVyOiBtZXRob2QgSW5zcGVjdG9yRnJvbnRlbmRIb3N0LicrbmFtZSsnIGlzIG1pc3NpbmcuIFVzaW5nIHN0dWIgaW5zdGVhZC4nKTtjb25zdCBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gcHJvdG9bbmFtZV0uYXBwbHkoSW5zcGVjdG9yRnJvbnRlbmRIb3N0LGFyZ3MpO30KSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cz1uZXcgQ29tbW9uLk9iamVjdCgpO30KaW5pdGlhbGl6ZUluc3BlY3RvckZyb250ZW5kSG9zdCgpO3dpbmRvdy5JbnNwZWN0b3JGcm9udGVuZEFQST1uZXcgSG9zdC5JbnNwZWN0b3JGcm9udGVuZEFQSUltcGwoKTt9KSgpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHM7SG9zdC5pc1VuZGVyVGVzdD1mdW5jdGlvbihwcmVmcyl7aWYoUnVudGltZS5xdWVyeVBhcmFtKCd0ZXN0JykpCnJldHVybiB0cnVlO2lmKHByZWZzKQpyZXR1cm4gcHJlZnNbJ2lzVW5kZXJUZXN0J109PT0ndHJ1ZSc7cmV0dXJuIENvbW1vbi5zZXR0aW5ncyYmQ29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2lzVW5kZXJUZXN0JyxmYWxzZSkuZ2V0KCk7fTs7SG9zdC5wbGF0Zm9ybT1mdW5jdGlvbigpe2lmKCFIb3N0Ll9wbGF0Zm9ybSkKSG9zdC5fcGxhdGZvcm09SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnBsYXRmb3JtKCk7cmV0dXJuIEhvc3QuX3BsYXRmb3JtO307SG9zdC5pc01hYz1mdW5jdGlvbigpe2lmKHR5cGVvZiBIb3N0Ll9pc01hYz09PSd1bmRlZmluZWQnKQpIb3N0Ll9pc01hYz1Ib3N0LnBsYXRmb3JtKCk9PT0nbWFjJztyZXR1cm4gSG9zdC5faXNNYWM7fTtIb3N0LmlzV2luPWZ1bmN0aW9uKCl7aWYodHlwZW9mIEhvc3QuX2lzV2luPT09J3VuZGVmaW5lZCcpCkhvc3QuX2lzV2luPUhvc3QucGxhdGZvcm0oKT09PSd3aW5kb3dzJztyZXR1cm4gSG9zdC5faXNXaW47fTtIb3N0LmlzQ3VzdG9tRGV2dG9vbHNGcm9udGVuZD1mdW5jdGlvbigpe2lmKHR5cGVvZiBIb3N0Ll9pc0N1c3RvbURldnRvb2xzRnJvbmVuZD09PSd1bmRlZmluZWQnKQpIb3N0Ll9pc0N1c3RvbURldnRvb2xzRnJvbmVuZD13aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKS5zdGFydHNXaXRoKCdjaHJvbWUtZGV2dG9vbHM6Ly9kZXZ0b29scy9jdXN0b20vJyk7cmV0dXJuIEhvc3QuX2lzQ3VzdG9tRGV2dG9vbHNGcm9uZW5kO307SG9zdC5mb250RmFtaWx5PWZ1bmN0aW9uKCl7aWYoSG9zdC5fZm9udEZhbWlseSkKcmV0dXJuIEhvc3QuX2ZvbnRGYW1pbHk7c3dpdGNoKEhvc3QucGxhdGZvcm0oKSl7Y2FzZSdsaW51eCc6SG9zdC5fZm9udEZhbWlseT0nUm9ib3RvLCBVYnVudHUsIEFyaWFsLCBzYW5zLXNlcmlmJzticmVhaztjYXNlJ21hYyc6SG9zdC5fZm9udEZhbWlseT0nXCdMdWNpZGEgR3JhbmRlXCcsIHNhbnMtc2VyaWYnO2JyZWFrO2Nhc2Und2luZG93cyc6SG9zdC5fZm9udEZhbWlseT0nXCdTZWdvZSBVSVwnLCBUYWhvbWEsIHNhbnMtc2VyaWYnO2JyZWFrO30KcmV0dXJuIEhvc3QuX2ZvbnRGYW1pbHk7fTs7SG9zdC5SZXNvdXJjZUxvYWRlcj17fTtIb3N0LlJlc291cmNlTG9hZGVyLl9sYXN0U3RyZWFtSWQ9MDtIb3N0LlJlc291cmNlTG9hZGVyLl9ib3VuZFN0cmVhbXM9e307SG9zdC5SZXNvdXJjZUxvYWRlci5fYmluZE91dHB1dFN0cmVhbT1mdW5jdGlvbihzdHJlYW0pe0hvc3QuUmVzb3VyY2VMb2FkZXIuX2JvdW5kU3RyZWFtc1srK0hvc3QuUmVzb3VyY2VMb2FkZXIuX2xhc3RTdHJlYW1JZF09c3RyZWFtO3JldHVybiBIb3N0LlJlc291cmNlTG9hZGVyLl9sYXN0U3RyZWFtSWQ7fTtIb3N0LlJlc291cmNlTG9hZGVyLl9kaXNjYXJkT3V0cHV0U3RyZWFtPWZ1bmN0aW9uKGlkKXtIb3N0LlJlc291cmNlTG9hZGVyLl9ib3VuZFN0cmVhbXNbaWRdLmNsb3NlKCk7ZGVsZXRlIEhvc3QuUmVzb3VyY2VMb2FkZXIuX2JvdW5kU3RyZWFtc1tpZF07fTtIb3N0LlJlc291cmNlTG9hZGVyLnN0cmVhbVdyaXRlPWZ1bmN0aW9uKGlkLGNodW5rKXtIb3N0LlJlc291cmNlTG9hZGVyLl9ib3VuZFN0cmVhbXNbaWRdLndyaXRlKGNodW5rKTt9O0hvc3QuUmVzb3VyY2VMb2FkZXIubG9hZD1mdW5jdGlvbih1cmwsaGVhZGVycyxjYWxsYmFjayl7Y29uc3Qgc3RyZWFtPW5ldyBDb21tb24uU3RyaW5nT3V0cHV0U3RyZWFtKCk7SG9zdC5SZXNvdXJjZUxvYWRlci5sb2FkQXNTdHJlYW0odXJsLGhlYWRlcnMsc3RyZWFtLG15Y2FsbGJhY2spO2Z1bmN0aW9uIG15Y2FsbGJhY2soc3RhdHVzQ29kZSxoZWFkZXJzKXtjYWxsYmFjayhzdGF0dXNDb2RlLGhlYWRlcnMsc3RyZWFtLmRhdGEoKSk7fX07SG9zdC5SZXNvdXJjZUxvYWRlci5sb2FkQXNTdHJlYW09ZnVuY3Rpb24odXJsLGhlYWRlcnMsc3RyZWFtLGNhbGxiYWNrKXtjb25zdCBzdHJlYW1JZD1Ib3N0LlJlc291cmNlTG9hZGVyLl9iaW5kT3V0cHV0U3RyZWFtKHN0cmVhbSk7Y29uc3QgcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKHVybCk7aWYocGFyc2VkVVJMLmlzRGF0YVVSTCgpKXtsb2FkWEhSKHVybCkudGhlbihkYXRhVVJMRGVjb2RlU3VjY2Vzc2Z1bCkuY2F0Y2goZGF0YVVSTERlY29kZUZhaWxlZCk7cmV0dXJuO30KY29uc3QgcmF3SGVhZGVycz1bXTtpZihoZWFkZXJzKXtmb3IoY29uc3Qga2V5IGluIGhlYWRlcnMpCnJhd0hlYWRlcnMucHVzaChrZXkrJzogJytoZWFkZXJzW2tleV0pO30KSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmxvYWROZXR3b3JrUmVzb3VyY2UodXJsLHJhd0hlYWRlcnMuam9pbignXHJcbicpLHN0cmVhbUlkLGZpbmlzaGVkQ2FsbGJhY2spO2Z1bmN0aW9uIGZpbmlzaGVkQ2FsbGJhY2socmVzcG9uc2Upe2lmKGNhbGxiYWNrKQpjYWxsYmFjayhyZXNwb25zZS5zdGF0dXNDb2RlLHJlc3BvbnNlLmhlYWRlcnN8fHt9KTtIb3N0LlJlc291cmNlTG9hZGVyLl9kaXNjYXJkT3V0cHV0U3RyZWFtKHN0cmVhbUlkKTt9CmZ1bmN0aW9uIGRhdGFVUkxEZWNvZGVTdWNjZXNzZnVsKHRleHQpe0hvc3QuUmVzb3VyY2VMb2FkZXIuc3RyZWFtV3JpdGUoc3RyZWFtSWQsdGV4dCk7ZmluaXNoZWRDYWxsYmFjaygoe3N0YXR1c0NvZGU6MjAwfSkpO30KZnVuY3Rpb24gZGF0YVVSTERlY29kZUZhaWxlZCgpe2ZpbmlzaGVkQ2FsbGJhY2soKHtzdGF0dXNDb2RlOjQwNH0pKTt9fTs7SG9zdC5Vc2VyTWV0cmljcz1jbGFzc3twYW5lbFNob3duKHBhbmVsTmFtZSl7Y29uc3QgY29kZT1Ib3N0LlVzZXJNZXRyaWNzLl9QYW5lbENvZGVzW3BhbmVsTmFtZV18fDA7Y29uc3Qgc2l6ZT1PYmplY3Qua2V5cyhIb3N0LlVzZXJNZXRyaWNzLl9QYW5lbENvZGVzKS5sZW5ndGgrMTtJbnNwZWN0b3JGcm9udGVuZEhvc3QucmVjb3JkRW51bWVyYXRlZEhpc3RvZ3JhbSgnRGV2VG9vbHMuUGFuZWxTaG93bicsY29kZSxzaXplKTt9CmRyYXdlclNob3duKGRyYXdlcklkKXt0aGlzLnBhbmVsU2hvd24oJ2RyYXdlci0nK2RyYXdlcklkKTt9CmFjdGlvblRha2VuKGFjdGlvbil7Y29uc3Qgc2l6ZT1PYmplY3Qua2V5cyhIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbikubGVuZ3RoKzE7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnJlY29yZEVudW1lcmF0ZWRIaXN0b2dyYW0oJ0RldlRvb2xzLkFjdGlvblRha2VuJyxhY3Rpb24sc2l6ZSk7fX07SG9zdC5Vc2VyTWV0cmljcy5BY3Rpb249e1dpbmRvd0RvY2tlZDoxLFdpbmRvd1VuZG9ja2VkOjIsU2NyaXB0c0JyZWFrcG9pbnRTZXQ6MyxUaW1lbGluZVN0YXJ0ZWQ6NCxQcm9maWxlc0NQVVByb2ZpbGVUYWtlbjo1LFByb2ZpbGVzSGVhcFByb2ZpbGVUYWtlbjo2LEF1ZGl0c1N0YXJ0ZWQ6NyxDb25zb2xlRXZhbHVhdGVkOjgsRmlsZVNhdmVkSW5Xb3Jrc3BhY2U6OSxEZXZpY2VNb2RlRW5hYmxlZDoxMCxBbmltYXRpb25zUGxheWJhY2tSYXRlQ2hhbmdlZDoxMSxSZXZpc2lvbkFwcGxpZWQ6MTIsRmlsZVN5c3RlbURpcmVjdG9yeUNvbnRlbnRSZWNlaXZlZDoxMyxTdHlsZVJ1bGVFZGl0ZWQ6MTQsQ29tbWFuZEV2YWx1YXRlZEluQ29uc29sZVBhbmVsOjE1LERPTVByb3BlcnRpZXNFeHBhbmRlZDoxNixSZXNpemVkVmlld0luUmVzcG9uc2l2ZU1vZGU6MTcsVGltZWxpbmVQYWdlUmVsb2FkU3RhcnRlZDoxOCxDb25uZWN0VG9Ob2RlSlNGcm9tRnJvbnRlbmQ6MTksQ29ubmVjdFRvTm9kZUpTRGlyZWN0bHk6MjAsQ3B1VGhyb3R0bGluZ0VuYWJsZWQ6MjEsQ3B1UHJvZmlsZU5vZGVGb2N1c2VkOjIyLENwdVByb2ZpbGVOb2RlRXhjbHVkZWQ6MjMsU2VsZWN0RmlsZUZyb21GaWxlUGlja2VyOjI0LFNlbGVjdENvbW1hbmRGcm9tQ29tbWFuZE1lbnU6MjUsQ2hhbmdlSW5zcGVjdGVkTm9kZUluRWxlbWVudHNQYW5lbDoyNixTdHlsZVJ1bGVDb3BpZWQ6MjcsQ292ZXJhZ2VTdGFydGVkOjI4LEF1ZGl0czJTdGFydGVkOjI5LEF1ZGl0czJGaW5pc2hlZDozMCxTaG93ZWRUaGlyZFBhcnR5QmFkZ2VzOjMxLH07SG9zdC5Vc2VyTWV0cmljcy5fUGFuZWxDb2Rlcz17ZWxlbWVudHM6MSxyZXNvdXJjZXM6MixuZXR3b3JrOjMsc291cmNlczo0LHRpbWVsaW5lOjUsaGVhcF9wcm9maWxlcjo2LGF1ZGl0czo3LGNvbnNvbGU6OCxsYXllcnM6OSwnZHJhd2VyLWNvbnNvbGUtdmlldyc6MTAsJ2RyYXdlci1hbmltYXRpb25zJzoxMSwnZHJhd2VyLW5ldHdvcmsuY29uZmlnJzoxMiwnZHJhd2VyLXJlbmRlcmluZyc6MTMsJ2RyYXdlci1zZW5zb3JzJzoxNCwnZHJhd2VyLXNvdXJjZXMuc2VhcmNoJzoxNSxzZWN1cml0eToxNixqc19wcm9maWxlcjoxNyxhdWRpdHMyOjE4LH07SG9zdC51c2VyTWV0cmljcz1uZXcgSG9zdC5Vc2VyTWV0cmljcygpOztzZWxmWydVSSddPXNlbGZbJ1VJJ118fHt9O1VJLlhFbGVtZW50PWNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bJ2ZsZXgnLCdwYWRkaW5nJywncGFkZGluZy10b3AnLCdwYWRkaW5nLWJvdHRvbScsJ3BhZGRpbmctbGVmdCcsJ3BhZGRpbmctcmlnaHQnLCdtYXJnaW4nLCdtYXJnaW4tdG9wJywnbWFyZ2luLWJvdHRvbScsJ21hcmdpbi1sZWZ0JywnbWFyZ2luLXJpZ2h0Jywnb3ZlcmZsb3cnLCdvdmVyZmxvdy14Jywnb3ZlcmZsb3cteScsJ2ZvbnQtc2l6ZScsJ2NvbG9yJywnYmFja2dyb3VuZCcsJ2JhY2tncm91bmQtY29sb3InLCdib3JkZXInLCdib3JkZXItdG9wJywnYm9yZGVyLWJvdHRvbScsJ2JvcmRlci1sZWZ0JywnYm9yZGVyLXJpZ2h0JywnbWF4LXdpZHRoJywnbWF4LWhlaWdodCddO30KYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsb2xkVmFsdWUsbmV3VmFsdWUpe2lmKGF0dHI9PT0nZmxleCcpe2lmKG5ld1ZhbHVlPT09bnVsbCkKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZmxleCcpO2Vsc2UgaWYobmV3VmFsdWU9PT0naW5pdGlhbCd8fG5ld1ZhbHVlPT09J2F1dG8nfHxuZXdWYWx1ZT09PSdub25lJ3x8bmV3VmFsdWUuaW5kZXhPZignICcpIT09LTEpCnRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2ZsZXgnLG5ld1ZhbHVlKTtlbHNlCnRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2ZsZXgnLCcwIDAgJytuZXdWYWx1ZSk7cmV0dXJuO30KaWYobmV3VmFsdWU9PT1udWxsKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KGF0dHIpO2lmKGF0dHIuc3RhcnRzV2l0aCgncGFkZGluZy0nKXx8YXR0ci5zdGFydHNXaXRoKCdtYXJnaW4tJyl8fGF0dHIuc3RhcnRzV2l0aCgnYm9yZGVyLScpfHxhdHRyLnN0YXJ0c1dpdGgoJ2JhY2tncm91bmQtJyl8fGF0dHIuc3RhcnRzV2l0aCgnb3ZlcmZsb3ctJykpe2NvbnN0IHNob3J0aGFuZD1hdHRyLnN1YnN0cmluZygwLGF0dHIuaW5kZXhPZignLScpKTtjb25zdCBzaG9ydGhhbmRWYWx1ZT10aGlzLmdldEF0dHJpYnV0ZShzaG9ydGhhbmQpO2lmKHNob3J0aGFuZFZhbHVlIT09bnVsbCkKdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShzaG9ydGhhbmQsc2hvcnRoYW5kVmFsdWUpO319ZWxzZXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KGF0dHIsbmV3VmFsdWUpO319fTtVSS5fWEJveD1jbGFzcyBleHRlbmRzIFVJLlhFbGVtZW50e2NvbnN0cnVjdG9yKGRpcmVjdGlvbil7c3VwZXIoKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2ZsZXgtZGlyZWN0aW9uJyxkaXJlY3Rpb24pO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2p1c3RpZnktY29udGVudCcsJ2ZsZXgtc3RhcnQnKTt9CnN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuIFVJLlhFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcy5jb25jYXQoWyd4LXN0YXJ0JywneC1jZW50ZXInLCd4LXN0cmV0Y2gnLCd4LWJhc2VsaW5lJywnanVzdGlmeS1jb250ZW50J10pO30KYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsb2xkVmFsdWUsbmV3VmFsdWUpe2lmKGF0dHI9PT0neC1zdGFydCd8fGF0dHI9PT0neC1jZW50ZXInfHxhdHRyPT09J3gtc3RyZXRjaCd8fGF0dHI9PT0neC1iYXNlbGluZScpe2lmKG5ld1ZhbHVlPT09bnVsbCkKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnYWxpZ24taXRlbXMnKTtlbHNlCnRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2FsaWduLWl0ZW1zJyxhdHRyPT09J3gtc3RhcnQnPydmbGV4LXN0YXJ0JzphdHRyLnN1YnN0cigyKSk7cmV0dXJuO30Kc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsb2xkVmFsdWUsbmV3VmFsdWUpO319O1VJLlhWQm94PWNsYXNzIGV4dGVuZHMgVUkuX1hCb3h7Y29uc3RydWN0b3IoKXtzdXBlcignY29sdW1uJyk7fX07VUkuWEhCb3g9Y2xhc3MgZXh0ZW5kcyBVSS5fWEJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCdyb3cnKTt9fTtVSS5YQ0JveD1jbGFzcyBleHRlbmRzIFVJLlhFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnZmxleCcpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2ZsZXgtZGlyZWN0aW9uJywnY29sdW1uJyk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnanVzdGlmeS1jb250ZW50JywnY2VudGVyJyk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnYWxpZ24taXRlbXMnLCdjZW50ZXInKTt9fTtVSS5YRGl2PWNsYXNzIGV4dGVuZHMgVUkuWEVsZW1lbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdibG9jaycpO319O1VJLlhTcGFuPWNsYXNzIGV4dGVuZHMgVUkuWEVsZW1lbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdpbmxpbmUnKTt9fTtVSS5YVGV4dD1jbGFzcyBleHRlbmRzIFVJLlhFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnaW5saW5lJyk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnd2hpdGUtc3BhY2UnLCdwcmUnKTt9fTtzZWxmLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgneC12Ym94JyxVSS5YVkJveCk7c2VsZi5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3gtaGJveCcsVUkuWEhCb3gpO3NlbGYuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd4LWNib3gnLFVJLlhDQm94KTtzZWxmLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgneC1kaXYnLFVJLlhEaXYpO3NlbGYuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd4LXNwYW4nLFVJLlhTcGFuKTtzZWxmLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgneC10ZXh0JyxVSS5YVGV4dCk7O1VJLldpZGdldD1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoaXNXZWJDb21wb25lbnQpe3N1cGVyKCk7dGhpcy5jb250ZW50RWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd3aWRnZXQnKTtpZihpc1dlYkNvbXBvbmVudCl7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Zib3ggZmxleC1hdXRvJyk7dGhpcy5fc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcy5lbGVtZW50KTt0aGlzLl9zaGFkb3dSb290LmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsZW1lbnQpO31lbHNle3RoaXMuZWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50O30KdGhpcy5faXNXZWJDb21wb25lbnQ9aXNXZWJDb21wb25lbnQ7dGhpcy5lbGVtZW50Ll9fd2lkZ2V0PXRoaXM7dGhpcy5fdmlzaWJsZT1mYWxzZTt0aGlzLl9pc1Jvb3Q9ZmFsc2U7dGhpcy5faXNTaG93aW5nPWZhbHNlO3RoaXMuX2NoaWxkcmVuPVtdO3RoaXMuX2hpZGVPbkRldGFjaD1mYWxzZTt0aGlzLl9ub3RpZmljYXRpb25EZXB0aD0wO3RoaXMuX2ludmFsaWRhdGlvbnNTdXNwZW5kZWQ9MDt0aGlzLl9kZWZhdWx0Rm9jdXNlZENoaWxkPW51bGw7fQpzdGF0aWMgX2luY3JlbWVudFdpZGdldENvdW50ZXIocGFyZW50RWxlbWVudCxjaGlsZEVsZW1lbnQpe2NvbnN0IGNvdW50PShjaGlsZEVsZW1lbnQuX193aWRnZXRDb3VudGVyfHwwKSsoY2hpbGRFbGVtZW50Ll9fd2lkZ2V0PzE6MCk7aWYoIWNvdW50KQpyZXR1cm47d2hpbGUocGFyZW50RWxlbWVudCl7cGFyZW50RWxlbWVudC5fX3dpZGdldENvdW50ZXI9KHBhcmVudEVsZW1lbnQuX193aWRnZXRDb3VudGVyfHwwKStjb3VudDtwYXJlbnRFbGVtZW50PXBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudE9yU2hhZG93SG9zdCgpO319CnN0YXRpYyBfZGVjcmVtZW50V2lkZ2V0Q291bnRlcihwYXJlbnRFbGVtZW50LGNoaWxkRWxlbWVudCl7Y29uc3QgY291bnQ9KGNoaWxkRWxlbWVudC5fX3dpZGdldENvdW50ZXJ8fDApKyhjaGlsZEVsZW1lbnQuX193aWRnZXQ/MTowKTtpZighY291bnQpCnJldHVybjt3aGlsZShwYXJlbnRFbGVtZW50KXtwYXJlbnRFbGVtZW50Ll9fd2lkZ2V0Q291bnRlci09Y291bnQ7cGFyZW50RWxlbWVudD1wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnRPclNoYWRvd0hvc3QoKTt9fQpzdGF0aWMgX19hc3NlcnQoY29uZGl0aW9uLG1lc3NhZ2Upe2lmKCFjb25kaXRpb24pCnRocm93IG5ldyBFcnJvcihtZXNzYWdlKTt9CnN0YXRpYyBmb2N1c1dpZGdldEZvck5vZGUobm9kZSl7d2hpbGUobm9kZSl7aWYobm9kZS5fX3dpZGdldCkKYnJlYWs7bm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKTt9CmlmKCFub2RlKQpyZXR1cm47bGV0IHdpZGdldD1ub2RlLl9fd2lkZ2V0O3doaWxlKHdpZGdldC5fcGFyZW50V2lkZ2V0KXt3aWRnZXQuX3BhcmVudFdpZGdldC5fZGVmYXVsdEZvY3VzZWRDaGlsZD13aWRnZXQ7d2lkZ2V0PXdpZGdldC5fcGFyZW50V2lkZ2V0O319Cm1hcmtBc1Jvb3QoKXtVSS5XaWRnZXQuX19hc3NlcnQoIXRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50LCdBdHRlbXB0IHRvIG1hcmsgYXMgcm9vdCBhdHRhY2hlZCBub2RlJyk7dGhpcy5faXNSb290PXRydWU7fQpwYXJlbnRXaWRnZXQoKXtyZXR1cm4gdGhpcy5fcGFyZW50V2lkZ2V0O30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW47fQpjaGlsZFdhc0RldGFjaGVkKHdpZGdldCl7fQppc1Nob3dpbmcoKXtyZXR1cm4gdGhpcy5faXNTaG93aW5nO30Kc2hvdWxkSGlkZU9uRGV0YWNoKCl7aWYoIXRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50KQpyZXR1cm4gZmFsc2U7aWYodGhpcy5faGlkZU9uRGV0YWNoKQpyZXR1cm4gdHJ1ZTtmb3IoY29uc3QgY2hpbGQgb2YgdGhpcy5fY2hpbGRyZW4pe2lmKGNoaWxkLnNob3VsZEhpZGVPbkRldGFjaCgpKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CnNldEhpZGVPbkRldGFjaCgpe3RoaXMuX2hpZGVPbkRldGFjaD10cnVlO30KX2luTm90aWZpY2F0aW9uKCl7cmV0dXJuISF0aGlzLl9ub3RpZmljYXRpb25EZXB0aHx8KHRoaXMuX3BhcmVudFdpZGdldCYmdGhpcy5fcGFyZW50V2lkZ2V0Ll9pbk5vdGlmaWNhdGlvbigpKTt9Cl9wYXJlbnRJc1Nob3dpbmcoKXtpZih0aGlzLl9pc1Jvb3QpCnJldHVybiB0cnVlO3JldHVybiEhdGhpcy5fcGFyZW50V2lkZ2V0JiZ0aGlzLl9wYXJlbnRXaWRnZXQuaXNTaG93aW5nKCk7fQpfY2FsbE9uVmlzaWJsZUNoaWxkcmVuKG1ldGhvZCl7Y29uc3QgY29weT10aGlzLl9jaGlsZHJlbi5zbGljZSgpO2ZvcihsZXQgaT0wO2k8Y29weS5sZW5ndGg7KytpKXtpZihjb3B5W2ldLl9wYXJlbnRXaWRnZXQ9PT10aGlzJiZjb3B5W2ldLl92aXNpYmxlKQptZXRob2QuY2FsbChjb3B5W2ldKTt9fQpfcHJvY2Vzc1dpbGxTaG93KCl7dGhpcy5fY2FsbE9uVmlzaWJsZUNoaWxkcmVuKHRoaXMuX3Byb2Nlc3NXaWxsU2hvdyk7dGhpcy5faXNTaG93aW5nPXRydWU7fQpfcHJvY2Vzc1dhc1Nob3duKCl7aWYodGhpcy5faW5Ob3RpZmljYXRpb24oKSkKcmV0dXJuO3RoaXMucmVzdG9yZVNjcm9sbFBvc2l0aW9ucygpO3RoaXMuX25vdGlmeSh0aGlzLndhc1Nob3duKTt0aGlzLl9jYWxsT25WaXNpYmxlQ2hpbGRyZW4odGhpcy5fcHJvY2Vzc1dhc1Nob3duKTt9Cl9wcm9jZXNzV2lsbEhpZGUoKXtpZih0aGlzLl9pbk5vdGlmaWNhdGlvbigpKQpyZXR1cm47dGhpcy5zdG9yZVNjcm9sbFBvc2l0aW9ucygpO3RoaXMuX2NhbGxPblZpc2libGVDaGlsZHJlbih0aGlzLl9wcm9jZXNzV2lsbEhpZGUpO3RoaXMuX25vdGlmeSh0aGlzLndpbGxIaWRlKTt0aGlzLl9pc1Nob3dpbmc9ZmFsc2U7fQpfcHJvY2Vzc1dhc0hpZGRlbigpe3RoaXMuX2NhbGxPblZpc2libGVDaGlsZHJlbih0aGlzLl9wcm9jZXNzV2FzSGlkZGVuKTt9Cl9wcm9jZXNzT25SZXNpemUoKXtpZih0aGlzLl9pbk5vdGlmaWNhdGlvbigpKQpyZXR1cm47aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjt0aGlzLl9ub3RpZnkodGhpcy5vblJlc2l6ZSk7dGhpcy5fY2FsbE9uVmlzaWJsZUNoaWxkcmVuKHRoaXMuX3Byb2Nlc3NPblJlc2l6ZSk7fQpfbm90aWZ5KG5vdGlmaWNhdGlvbil7Kyt0aGlzLl9ub3RpZmljYXRpb25EZXB0aDt0cnl7bm90aWZpY2F0aW9uLmNhbGwodGhpcyk7fWZpbmFsbHl7LS10aGlzLl9ub3RpZmljYXRpb25EZXB0aDt9fQp3YXNTaG93bigpe30Kd2lsbEhpZGUoKXt9Cm9uUmVzaXplKCl7fQpvbkxheW91dCgpe30Kb3duZXJWaWV3RGlzcG9zZWQoKXt9CnNob3cocGFyZW50RWxlbWVudCxpbnNlcnRCZWZvcmUpe1VJLldpZGdldC5fX2Fzc2VydChwYXJlbnRFbGVtZW50LCdBdHRlbXB0IHRvIGF0dGFjaCB3aWRnZXQgd2l0aCBubyBwYXJlbnQgZWxlbWVudCcpO2lmKCF0aGlzLl9pc1Jvb3Qpe2xldCBjdXJyZW50UGFyZW50PXBhcmVudEVsZW1lbnQ7d2hpbGUoY3VycmVudFBhcmVudCYmIWN1cnJlbnRQYXJlbnQuX193aWRnZXQpCmN1cnJlbnRQYXJlbnQ9Y3VycmVudFBhcmVudC5wYXJlbnRFbGVtZW50T3JTaGFkb3dIb3N0KCk7VUkuV2lkZ2V0Ll9fYXNzZXJ0KGN1cnJlbnRQYXJlbnQsJ0F0dGVtcHQgdG8gYXR0YWNoIHdpZGdldCB0byBvcnBoYW4gbm9kZScpO3RoaXMuX2F0dGFjaChjdXJyZW50UGFyZW50Ll9fd2lkZ2V0KTt9CnRoaXMuX3Nob3dXaWRnZXQocGFyZW50RWxlbWVudCxpbnNlcnRCZWZvcmUpO30KX2F0dGFjaChwYXJlbnRXaWRnZXQpe2lmKHBhcmVudFdpZGdldD09PXRoaXMuX3BhcmVudFdpZGdldCkKcmV0dXJuO2lmKHRoaXMuX3BhcmVudFdpZGdldCkKdGhpcy5kZXRhY2goKTt0aGlzLl9wYXJlbnRXaWRnZXQ9cGFyZW50V2lkZ2V0O3RoaXMuX3BhcmVudFdpZGdldC5fY2hpbGRyZW4ucHVzaCh0aGlzKTt0aGlzLl9pc1Jvb3Q9ZmFsc2U7fQpzaG93V2lkZ2V0KCl7aWYodGhpcy5fdmlzaWJsZSkKcmV0dXJuO1VJLldpZGdldC5fX2Fzc2VydCh0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudCwnQXR0ZW1wdCB0byBzaG93IHdpZGdldCB0aGF0IGlzIG5vdCBoaWRkZW4gdXNpbmcgaGlkZVdpZGdldCgpLicpO3RoaXMuX3Nob3dXaWRnZXQoKHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50KSx0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmcpO30KX3Nob3dXaWRnZXQocGFyZW50RWxlbWVudCxpbnNlcnRCZWZvcmUpe2xldCBjdXJyZW50UGFyZW50PXBhcmVudEVsZW1lbnQ7d2hpbGUoY3VycmVudFBhcmVudCYmIWN1cnJlbnRQYXJlbnQuX193aWRnZXQpCmN1cnJlbnRQYXJlbnQ9Y3VycmVudFBhcmVudC5wYXJlbnRFbGVtZW50T3JTaGFkb3dIb3N0KCk7aWYodGhpcy5faXNSb290KXtVSS5XaWRnZXQuX19hc3NlcnQoIWN1cnJlbnRQYXJlbnQsJ0F0dGVtcHQgdG8gc2hvdyByb290IHdpZGdldCB1bmRlciBhbm90aGVyIHdpZGdldCcpO31lbHNle1VJLldpZGdldC5fX2Fzc2VydChjdXJyZW50UGFyZW50JiZjdXJyZW50UGFyZW50Ll9fd2lkZ2V0PT09dGhpcy5fcGFyZW50V2lkZ2V0LCdBdHRlbXB0IHRvIHNob3cgdW5kZXIgbm9kZSBiZWxvbmdpbmcgdG8gYWxpZW4gd2lkZ2V0Jyk7fQpjb25zdCB3YXNWaXNpYmxlPXRoaXMuX3Zpc2libGU7aWYod2FzVmlzaWJsZSYmdGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQ9PT1wYXJlbnRFbGVtZW50KQpyZXR1cm47dGhpcy5fdmlzaWJsZT10cnVlO2lmKCF3YXNWaXNpYmxlJiZ0aGlzLl9wYXJlbnRJc1Nob3dpbmcoKSkKdGhpcy5fcHJvY2Vzc1dpbGxTaG93KCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2lmKHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50IT09cGFyZW50RWxlbWVudCl7VUkuV2lkZ2V0Ll9pbmNyZW1lbnRXaWRnZXRDb3VudGVyKHBhcmVudEVsZW1lbnQsdGhpcy5lbGVtZW50KTtpZihpbnNlcnRCZWZvcmUpClVJLldpZGdldC5fb3JpZ2luYWxJbnNlcnRCZWZvcmUuY2FsbChwYXJlbnRFbGVtZW50LHRoaXMuZWxlbWVudCxpbnNlcnRCZWZvcmUpO2Vsc2UKVUkuV2lkZ2V0Ll9vcmlnaW5hbEFwcGVuZENoaWxkLmNhbGwocGFyZW50RWxlbWVudCx0aGlzLmVsZW1lbnQpO30KaWYoIXdhc1Zpc2libGUmJnRoaXMuX3BhcmVudElzU2hvd2luZygpKQp0aGlzLl9wcm9jZXNzV2FzU2hvd24oKTtpZih0aGlzLl9wYXJlbnRXaWRnZXQmJnRoaXMuX2hhc05vblplcm9Db25zdHJhaW50cygpKQp0aGlzLl9wYXJlbnRXaWRnZXQuaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCk7ZWxzZQp0aGlzLl9wcm9jZXNzT25SZXNpemUoKTt9CmhpZGVXaWRnZXQoKXtpZighdGhpcy5fdmlzaWJsZSkKcmV0dXJuO3RoaXMuX2hpZGVXaWRnZXQoZmFsc2UpO30KX2hpZGVXaWRnZXQocmVtb3ZlRnJvbURPTSl7dGhpcy5fdmlzaWJsZT1mYWxzZTtjb25zdCBwYXJlbnRFbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50O2lmKHRoaXMuX3BhcmVudElzU2hvd2luZygpKQp0aGlzLl9wcm9jZXNzV2lsbEhpZGUoKTtpZihyZW1vdmVGcm9tRE9NKXtVSS5XaWRnZXQuX2RlY3JlbWVudFdpZGdldENvdW50ZXIocGFyZW50RWxlbWVudCx0aGlzLmVsZW1lbnQpO1VJLldpZGdldC5fb3JpZ2luYWxSZW1vdmVDaGlsZC5jYWxsKHBhcmVudEVsZW1lbnQsdGhpcy5lbGVtZW50KTt9ZWxzZXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fQppZih0aGlzLl9wYXJlbnRJc1Nob3dpbmcoKSkKdGhpcy5fcHJvY2Vzc1dhc0hpZGRlbigpO2lmKHRoaXMuX3BhcmVudFdpZGdldCYmdGhpcy5faGFzTm9uWmVyb0NvbnN0cmFpbnRzKCkpCnRoaXMuX3BhcmVudFdpZGdldC5pbnZhbGlkYXRlQ29uc3RyYWludHMoKTt9CmRldGFjaChvdmVycmlkZUhpZGVPbkRldGFjaCl7aWYoIXRoaXMuX3BhcmVudFdpZGdldCYmIXRoaXMuX2lzUm9vdCkKcmV0dXJuO2NvbnN0IHJlbW92ZUZyb21ET009b3ZlcnJpZGVIaWRlT25EZXRhY2h8fCF0aGlzLnNob3VsZEhpZGVPbkRldGFjaCgpO2lmKHRoaXMuX3Zpc2libGUpe3RoaXMuX2hpZGVXaWRnZXQocmVtb3ZlRnJvbURPTSk7fWVsc2UgaWYocmVtb3ZlRnJvbURPTSYmdGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQpe2NvbnN0IHBhcmVudEVsZW1lbnQ9dGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQ7VUkuV2lkZ2V0Ll9kZWNyZW1lbnRXaWRnZXRDb3VudGVyKHBhcmVudEVsZW1lbnQsdGhpcy5lbGVtZW50KTtVSS5XaWRnZXQuX29yaWdpbmFsUmVtb3ZlQ2hpbGQuY2FsbChwYXJlbnRFbGVtZW50LHRoaXMuZWxlbWVudCk7fQppZih0aGlzLl9wYXJlbnRXaWRnZXQpe2NvbnN0IGNoaWxkSW5kZXg9dGhpcy5fcGFyZW50V2lkZ2V0Ll9jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1VJLldpZGdldC5fX2Fzc2VydChjaGlsZEluZGV4Pj0wLCdBdHRlbXB0IHRvIHJlbW92ZSBub24tY2hpbGQgd2lkZ2V0Jyk7dGhpcy5fcGFyZW50V2lkZ2V0Ll9jaGlsZHJlbi5zcGxpY2UoY2hpbGRJbmRleCwxKTtpZih0aGlzLl9wYXJlbnRXaWRnZXQuX2RlZmF1bHRGb2N1c2VkQ2hpbGQ9PT10aGlzKQp0aGlzLl9wYXJlbnRXaWRnZXQuX2RlZmF1bHRGb2N1c2VkQ2hpbGQ9bnVsbDt0aGlzLl9wYXJlbnRXaWRnZXQuY2hpbGRXYXNEZXRhY2hlZCh0aGlzKTt0aGlzLl9wYXJlbnRXaWRnZXQ9bnVsbDt9ZWxzZXtVSS5XaWRnZXQuX19hc3NlcnQodGhpcy5faXNSb290LCdSZW1vdmluZyBub24tcm9vdCB3aWRnZXQgZnJvbSBET00nKTt9fQpkZXRhY2hDaGlsZFdpZGdldHMoKXtjb25zdCBjaGlsZHJlbj10aGlzLl9jaGlsZHJlbi5zbGljZSgpO2ZvcihsZXQgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSkKY2hpbGRyZW5baV0uZGV0YWNoKCk7fQplbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0Zvcigpe3JldHVyblt0aGlzLmVsZW1lbnRdO30Kc3RvcmVTY3JvbGxQb3NpdGlvbnMoKXtjb25zdCBlbGVtZW50cz10aGlzLmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCk7Zm9yKGxldCBpPTA7aTxlbGVtZW50cy5sZW5ndGg7KytpKXtjb25zdCBjb250YWluZXI9ZWxlbWVudHNbaV07Y29udGFpbmVyLl9zY3JvbGxUb3A9Y29udGFpbmVyLnNjcm9sbFRvcDtjb250YWluZXIuX3Njcm9sbExlZnQ9Y29udGFpbmVyLnNjcm9sbExlZnQ7fX0KcmVzdG9yZVNjcm9sbFBvc2l0aW9ucygpe2NvbnN0IGVsZW1lbnRzPXRoaXMuZWxlbWVudHNUb1Jlc3RvcmVTY3JvbGxQb3NpdGlvbnNGb3IoKTtmb3IobGV0IGk9MDtpPGVsZW1lbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGNvbnRhaW5lcj1lbGVtZW50c1tpXTtpZihjb250YWluZXIuX3Njcm9sbFRvcCkKY29udGFpbmVyLnNjcm9sbFRvcD1jb250YWluZXIuX3Njcm9sbFRvcDtpZihjb250YWluZXIuX3Njcm9sbExlZnQpCmNvbnRhaW5lci5zY3JvbGxMZWZ0PWNvbnRhaW5lci5fc2Nyb2xsTGVmdDt9fQpkb1Jlc2l6ZSgpe2lmKCF0aGlzLmlzU2hvd2luZygpKQpyZXR1cm47aWYoIXRoaXMuX2luTm90aWZpY2F0aW9uKCkpCnRoaXMuX2NhbGxPblZpc2libGVDaGlsZHJlbih0aGlzLl9wcm9jZXNzT25SZXNpemUpO30KZG9MYXlvdXQoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX25vdGlmeSh0aGlzLm9uTGF5b3V0KTt0aGlzLmRvUmVzaXplKCk7fQpyZWdpc3RlclJlcXVpcmVkQ1NTKGNzc0ZpbGUpe1VJLmFwcGVuZFN0eWxlKHRoaXMuX2lzV2ViQ29tcG9uZW50P3RoaXMuX3NoYWRvd1Jvb3Q6dGhpcy5lbGVtZW50LGNzc0ZpbGUpO30KcHJpbnRXaWRnZXRIaWVyYXJjaHkoKXtjb25zdCBsaW5lcz1bXTt0aGlzLl9jb2xsZWN0V2lkZ2V0SGllcmFyY2h5KCcnLGxpbmVzKTtjb25zb2xlLmxvZyhsaW5lcy5qb2luKCdcbicpKTt9Cl9jb2xsZWN0V2lkZ2V0SGllcmFyY2h5KHByZWZpeCxsaW5lcyl7bGluZXMucHVzaChwcmVmaXgrJ1snK3RoaXMuZWxlbWVudC5jbGFzc05hbWUrJ10nKyh0aGlzLl9jaGlsZHJlbi5sZW5ndGg/JyB7JzonJykpO2ZvcihsZXQgaT0wO2k8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5fY2hpbGRyZW5baV0uX2NvbGxlY3RXaWRnZXRIaWVyYXJjaHkocHJlZml4KycgICAgJyxsaW5lcyk7aWYodGhpcy5fY2hpbGRyZW4ubGVuZ3RoKQpsaW5lcy5wdXNoKHByZWZpeCsnfScpO30Kc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KGVsZW1lbnQpe3RoaXMuX2RlZmF1bHRGb2N1c2VkRWxlbWVudD1lbGVtZW50O30Kc2V0RGVmYXVsdEZvY3VzZWRDaGlsZChjaGlsZCl7VUkuV2lkZ2V0Ll9fYXNzZXJ0KGNoaWxkLl9wYXJlbnRXaWRnZXQ9PT10aGlzLCdBdHRlbXB0IHRvIHNldCBub24tY2hpbGQgd2lkZ2V0IGFzIGRlZmF1bHQgZm9jdXNlZC4nKTt0aGlzLl9kZWZhdWx0Rm9jdXNlZENoaWxkPWNoaWxkO30KZm9jdXMoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO2NvbnN0IGVsZW1lbnQ9dGhpcy5fZGVmYXVsdEZvY3VzZWRFbGVtZW50O2lmKGVsZW1lbnQpe2lmKCFlbGVtZW50Lmhhc0ZvY3VzKCkpCmVsZW1lbnQuZm9jdXMoKTtyZXR1cm47fQppZih0aGlzLl9kZWZhdWx0Rm9jdXNlZENoaWxkJiZ0aGlzLl9kZWZhdWx0Rm9jdXNlZENoaWxkLl92aXNpYmxlKXt0aGlzLl9kZWZhdWx0Rm9jdXNlZENoaWxkLmZvY3VzKCk7fWVsc2V7Zm9yKGNvbnN0IGNoaWxkIG9mIHRoaXMuX2NoaWxkcmVuKXtpZihjaGlsZC5fdmlzaWJsZSl7Y2hpbGQuZm9jdXMoKTtyZXR1cm47fX0KbGV0IGNoaWxkPXRoaXMuY29udGVudEVsZW1lbnQudHJhdmVyc2VOZXh0Tm9kZSh0aGlzLmNvbnRlbnRFbGVtZW50KTt3aGlsZShjaGlsZCl7aWYoY2hpbGQgaW5zdGFuY2VvZiBVSS5YV2lkZ2V0KXtjaGlsZC5mb2N1cygpO3JldHVybjt9CmNoaWxkPWNoaWxkLnRyYXZlcnNlTmV4dE5vZGUodGhpcy5jb250ZW50RWxlbWVudCk7fX19Cmhhc0ZvY3VzKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5oYXNGb2N1cygpO30KY2FsY3VsYXRlQ29uc3RyYWludHMoKXtyZXR1cm4gbmV3IFVJLkNvbnN0cmFpbnRzKCk7fQpjb25zdHJhaW50cygpe2lmKHR5cGVvZiB0aGlzLl9jb25zdHJhaW50cyE9PSd1bmRlZmluZWQnKQpyZXR1cm4gdGhpcy5fY29uc3RyYWludHM7aWYodHlwZW9mIHRoaXMuX2NhY2hlZENvbnN0cmFpbnRzPT09J3VuZGVmaW5lZCcpCnRoaXMuX2NhY2hlZENvbnN0cmFpbnRzPXRoaXMuY2FsY3VsYXRlQ29uc3RyYWludHMoKTtyZXR1cm4gdGhpcy5fY2FjaGVkQ29uc3RyYWludHM7fQpzZXRNaW5pbXVtQW5kUHJlZmVycmVkU2l6ZXMod2lkdGgsaGVpZ2h0LHByZWZlcnJlZFdpZHRoLHByZWZlcnJlZEhlaWdodCl7dGhpcy5fY29uc3RyYWludHM9bmV3IFVJLkNvbnN0cmFpbnRzKG5ldyBVSS5TaXplKHdpZHRoLGhlaWdodCksbmV3IFVJLlNpemUocHJlZmVycmVkV2lkdGgscHJlZmVycmVkSGVpZ2h0KSk7dGhpcy5pbnZhbGlkYXRlQ29uc3RyYWludHMoKTt9CnNldE1pbmltdW1TaXplKHdpZHRoLGhlaWdodCl7dGhpcy5fY29uc3RyYWludHM9bmV3IFVJLkNvbnN0cmFpbnRzKG5ldyBVSS5TaXplKHdpZHRoLGhlaWdodCkpO3RoaXMuaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCk7fQpfaGFzTm9uWmVyb0NvbnN0cmFpbnRzKCl7Y29uc3QgY29uc3RyYWludHM9dGhpcy5jb25zdHJhaW50cygpO3JldHVybiEhKGNvbnN0cmFpbnRzLm1pbmltdW0ud2lkdGh8fGNvbnN0cmFpbnRzLm1pbmltdW0uaGVpZ2h0fHxjb25zdHJhaW50cy5wcmVmZXJyZWQud2lkdGh8fGNvbnN0cmFpbnRzLnByZWZlcnJlZC5oZWlnaHQpO30Kc3VzcGVuZEludmFsaWRhdGlvbnMoKXsrK3RoaXMuX2ludmFsaWRhdGlvbnNTdXNwZW5kZWQ7fQpyZXN1bWVJbnZhbGlkYXRpb25zKCl7LS10aGlzLl9pbnZhbGlkYXRpb25zU3VzcGVuZGVkO2lmKCF0aGlzLl9pbnZhbGlkYXRpb25zU3VzcGVuZGVkJiZ0aGlzLl9pbnZhbGlkYXRpb25zUmVxdWVzdGVkKQp0aGlzLmludmFsaWRhdGVDb25zdHJhaW50cygpO30KaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCl7aWYodGhpcy5faW52YWxpZGF0aW9uc1N1c3BlbmRlZCl7dGhpcy5faW52YWxpZGF0aW9uc1JlcXVlc3RlZD10cnVlO3JldHVybjt9CnRoaXMuX2ludmFsaWRhdGlvbnNSZXF1ZXN0ZWQ9ZmFsc2U7Y29uc3QgY2FjaGVkPXRoaXMuX2NhY2hlZENvbnN0cmFpbnRzO2RlbGV0ZSB0aGlzLl9jYWNoZWRDb25zdHJhaW50cztjb25zdCBhY3R1YWw9dGhpcy5jb25zdHJhaW50cygpO2lmKCFhY3R1YWwuaXNFcXVhbChjYWNoZWQpJiZ0aGlzLl9wYXJlbnRXaWRnZXQpCnRoaXMuX3BhcmVudFdpZGdldC5pbnZhbGlkYXRlQ29uc3RyYWludHMoKTtlbHNlCnRoaXMuZG9MYXlvdXQoKTt9fTtVSS5XaWRnZXQuX29yaWdpbmFsQXBwZW5kQ2hpbGQ9RWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7VUkuV2lkZ2V0Ll9vcmlnaW5hbEluc2VydEJlZm9yZT1FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRCZWZvcmU7VUkuV2lkZ2V0Ll9vcmlnaW5hbFJlbW92ZUNoaWxkPUVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUNoaWxkO1VJLldpZGdldC5fb3JpZ2luYWxSZW1vdmVDaGlsZHJlbj1FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbjtVSS5WQm94PWNsYXNzIGV4dGVuZHMgVUkuV2lkZ2V0e2NvbnN0cnVjdG9yKGlzV2ViQ29tcG9uZW50KXtzdXBlcihpc1dlYkNvbXBvbmVudCk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2Ym94Jyk7fQpjYWxjdWxhdGVDb25zdHJhaW50cygpe2xldCBjb25zdHJhaW50cz1uZXcgVUkuQ29uc3RyYWludHMoKTtmdW5jdGlvbiB1cGRhdGVGb3JDaGlsZCgpe2NvbnN0IGNoaWxkPXRoaXMuY29uc3RyYWludHMoKTtjb25zdHJhaW50cz1jb25zdHJhaW50cy53aWR0aFRvTWF4KGNoaWxkKTtjb25zdHJhaW50cz1jb25zdHJhaW50cy5hZGRIZWlnaHQoY2hpbGQpO30KdGhpcy5fY2FsbE9uVmlzaWJsZUNoaWxkcmVuKHVwZGF0ZUZvckNoaWxkKTtyZXR1cm4gY29uc3RyYWludHM7fX07VUkuSEJveD1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcihpc1dlYkNvbXBvbmVudCl7c3VwZXIoaXNXZWJDb21wb25lbnQpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGJveCcpO30KY2FsY3VsYXRlQ29uc3RyYWludHMoKXtsZXQgY29uc3RyYWludHM9bmV3IFVJLkNvbnN0cmFpbnRzKCk7ZnVuY3Rpb24gdXBkYXRlRm9yQ2hpbGQoKXtjb25zdCBjaGlsZD10aGlzLmNvbnN0cmFpbnRzKCk7Y29uc3RyYWludHM9Y29uc3RyYWludHMuYWRkV2lkdGgoY2hpbGQpO2NvbnN0cmFpbnRzPWNvbnN0cmFpbnRzLmhlaWdodFRvTWF4KGNoaWxkKTt9CnRoaXMuX2NhbGxPblZpc2libGVDaGlsZHJlbih1cGRhdGVGb3JDaGlsZCk7cmV0dXJuIGNvbnN0cmFpbnRzO319O1VJLlZCb3hXaXRoUmVzaXplQ2FsbGJhY2s9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHJlc2l6ZUNhbGxiYWNrKXtzdXBlcigpO3RoaXMuX3Jlc2l6ZUNhbGxiYWNrPXJlc2l6ZUNhbGxiYWNrO30Kb25SZXNpemUoKXt0aGlzLl9yZXNpemVDYWxsYmFjaygpO319O1VJLldpZGdldEZvY3VzUmVzdG9yZXI9Y2xhc3N7Y29uc3RydWN0b3Iod2lkZ2V0KXt0aGlzLl93aWRnZXQ9d2lkZ2V0O3RoaXMuX3ByZXZpb3VzPXdpZGdldC5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTt3aWRnZXQuZm9jdXMoKTt9CnJlc3RvcmUoKXtpZighdGhpcy5fd2lkZ2V0KQpyZXR1cm47aWYodGhpcy5fd2lkZ2V0Lmhhc0ZvY3VzKCkmJnRoaXMuX3ByZXZpb3VzKQp0aGlzLl9wcmV2aW91cy5mb2N1cygpO3RoaXMuX3ByZXZpb3VzPW51bGw7dGhpcy5fd2lkZ2V0PW51bGw7fX07RWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oY2hpbGQpe1VJLldpZGdldC5fX2Fzc2VydCghY2hpbGQuX193aWRnZXR8fGNoaWxkLnBhcmVudEVsZW1lbnQ9PT10aGlzLCdBdHRlbXB0IHRvIGFkZCB3aWRnZXQgdmlhIHJlZ3VsYXIgRE9NIG9wZXJhdGlvbi4nKTtyZXR1cm4gVUkuV2lkZ2V0Ll9vcmlnaW5hbEFwcGVuZENoaWxkLmNhbGwodGhpcyxjaGlsZCk7fTtFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oY2hpbGQsYW5jaG9yKXtVSS5XaWRnZXQuX19hc3NlcnQoIWNoaWxkLl9fd2lkZ2V0fHxjaGlsZC5wYXJlbnRFbGVtZW50PT09dGhpcywnQXR0ZW1wdCB0byBhZGQgd2lkZ2V0IHZpYSByZWd1bGFyIERPTSBvcGVyYXRpb24uJyk7cmV0dXJuIFVJLldpZGdldC5fb3JpZ2luYWxJbnNlcnRCZWZvcmUuY2FsbCh0aGlzLGNoaWxkLGFuY2hvcik7fTtFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihjaGlsZCl7VUkuV2lkZ2V0Ll9fYXNzZXJ0KCFjaGlsZC5fX3dpZGdldENvdW50ZXImJiFjaGlsZC5fX3dpZGdldCwnQXR0ZW1wdCB0byByZW1vdmUgZWxlbWVudCBjb250YWluaW5nIHdpZGdldCB2aWEgcmVndWxhciBET00gb3BlcmF0aW9uJyk7cmV0dXJuIFVJLldpZGdldC5fb3JpZ2luYWxSZW1vdmVDaGlsZC5jYWxsKHRoaXMsY2hpbGQpO307RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXtVSS5XaWRnZXQuX19hc3NlcnQoIXRoaXMuX193aWRnZXRDb3VudGVyLCdBdHRlbXB0IHRvIHJlbW92ZSBlbGVtZW50IGNvbnRhaW5pbmcgd2lkZ2V0IHZpYSByZWd1bGFyIERPTSBvcGVyYXRpb24nKTtVSS5XaWRnZXQuX29yaWdpbmFsUmVtb3ZlQ2hpbGRyZW4uY2FsbCh0aGlzKTt9OztVSS5WaWV3PWZ1bmN0aW9uKCl7fTtVSS5WaWV3LnByb3RvdHlwZT17dmlld0lkKCl7fSx0aXRsZSgpe30saXNDbG9zZWFibGUoKXt9LGlzVHJhbnNpZW50KCl7fSx0b29sYmFySXRlbXMoKXt9LHdpZGdldCgpe30sZGlzcG9zZVZpZXcoKXt9fTtVSS5WaWV3Ll9zeW1ib2w9U3ltYm9sKCd2aWV3Jyk7VUkuVmlldy5fd2lkZ2V0U3ltYm9sPVN5bWJvbCgnd2lkZ2V0Jyk7VUkuU2ltcGxlVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IodGl0bGUsaXNXZWJDb21wb25lbnQpe3N1cGVyKGlzV2ViQ29tcG9uZW50KTt0aGlzLl90aXRsZT10aXRsZTt0aGlzLl90b29sYmFySXRlbXM9W107dGhpc1tVSS5WaWV3Ll9zeW1ib2xdPXRoaXM7fQp2aWV3SWQoKXtyZXR1cm4gdGhpcy5fdGl0bGU7fQp0aXRsZSgpe3JldHVybiB0aGlzLl90aXRsZTt9CmlzQ2xvc2VhYmxlKCl7cmV0dXJuIGZhbHNlO30KaXNUcmFuc2llbnQoKXtyZXR1cm4gZmFsc2U7fQp0b29sYmFySXRlbXMoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc3luY1Rvb2xiYXJJdGVtcygpKTt9CnN5bmNUb29sYmFySXRlbXMoKXtyZXR1cm4gdGhpcy5fdG9vbGJhckl0ZW1zO30Kd2lkZ2V0KCl7cmV0dXJuKFByb21pc2UucmVzb2x2ZSh0aGlzKSk7fQphZGRUb29sYmFySXRlbShpdGVtKXt0aGlzLl90b29sYmFySXRlbXMucHVzaChpdGVtKTt9CnJldmVhbFZpZXcoKXtyZXR1cm4gVUkudmlld01hbmFnZXIucmV2ZWFsVmlldyh0aGlzKTt9CmRpc3Bvc2VWaWV3KCl7fX07VUkuUHJvdmlkZWRWaWV3PWNsYXNze2NvbnN0cnVjdG9yKGV4dGVuc2lvbil7dGhpcy5fZXh0ZW5zaW9uPWV4dGVuc2lvbjt9CnZpZXdJZCgpe3JldHVybiB0aGlzLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydpZCddO30KdGl0bGUoKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9uLnRpdGxlKCk7fQppc0Nsb3NlYWJsZSgpe3JldHVybiB0aGlzLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydwZXJzaXN0ZW5jZSddPT09J2Nsb3NlYWJsZSc7fQppc1RyYW5zaWVudCgpe3JldHVybiB0aGlzLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydwZXJzaXN0ZW5jZSddPT09J3RyYW5zaWVudCc7fQp0b29sYmFySXRlbXMoKXtjb25zdCBhY3Rpb25JZHM9dGhpcy5fZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnYWN0aW9uSWRzJ107aWYoYWN0aW9uSWRzKXtjb25zdCByZXN1bHQ9YWN0aW9uSWRzLnNwbGl0KCcsJykubWFwKGlkPT5VSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbkZvcklkKGlkLnRyaW0oKSkpO3JldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTt9CmlmKHRoaXMuX2V4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2hhc1Rvb2xiYXInXSkKcmV0dXJuIHRoaXMud2lkZ2V0KCkudGhlbih3aWRnZXQ9Pih3aWRnZXQpLnRvb2xiYXJJdGVtcygpKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTt9CmFzeW5jIHdpZGdldCgpe3RoaXMuX3dpZGdldFJlcXVlc3RlZD10cnVlO2NvbnN0IHdpZGdldD1hd2FpdCB0aGlzLl9leHRlbnNpb24uaW5zdGFuY2UoKTtpZighKHdpZGdldCBpbnN0YW5jZW9mIFVJLldpZGdldCkpCnRocm93IG5ldyBFcnJvcigndmlldyBjbGFzc05hbWUgc2hvdWxkIHBvaW50IHRvIGEgVUkuV2lkZ2V0Jyk7d2lkZ2V0W1VJLlZpZXcuX3N5bWJvbF09dGhpcztyZXR1cm4od2lkZ2V0KTt9CmFzeW5jIGRpc3Bvc2VWaWV3KCl7aWYoIXRoaXMuX3dpZGdldFJlcXVlc3RlZCkKcmV0dXJuO2NvbnN0IHdpZGdldD1hd2FpdCB0aGlzLndpZGdldCgpO3dpZGdldC5vd25lclZpZXdEaXNwb3NlZCgpO319O1VJLlZpZXdMb2NhdGlvbj1mdW5jdGlvbigpe307VUkuVmlld0xvY2F0aW9uLnByb3RvdHlwZT17YXBwZW5kQXBwbGljYWJsZUl0ZW1zKGxvY2F0aW9uTmFtZSl7fSxhcHBlbmRWaWV3KHZpZXcsaW5zZXJ0QmVmb3JlKXt9LHNob3dWaWV3KHZpZXcsaW5zZXJ0QmVmb3JlLHVzZXJHZXN0dXJlKXt9LHJlbW92ZVZpZXcodmlldyl7fSx3aWRnZXQoKXt9fTtVSS5UYWJiZWRWaWV3TG9jYXRpb249ZnVuY3Rpb24oKXt9O1VJLlRhYmJlZFZpZXdMb2NhdGlvbi5wcm90b3R5cGU9e3RhYmJlZFBhbmUoKXt9LGVuYWJsZU1vcmVUYWJzQnV0dG9uKCl7fX07VUkuVmlld0xvY2F0aW9uUmVzb2x2ZXI9ZnVuY3Rpb24oKXt9O1VJLlZpZXdMb2NhdGlvblJlc29sdmVyLnByb3RvdHlwZT17cmVzb2x2ZUxvY2F0aW9uKGxvY2F0aW9uKXt9fTtVSS5WaWV3TWFuYWdlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3ZpZXdzPW5ldyBNYXAoKTt0aGlzLl9sb2NhdGlvbk5hbWVCeVZpZXdJZD1uZXcgTWFwKCk7Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygndmlldycpKXtjb25zdCBkZXNjcmlwdG9yPWV4dGVuc2lvbi5kZXNjcmlwdG9yKCk7dGhpcy5fdmlld3Muc2V0KGRlc2NyaXB0b3JbJ2lkJ10sbmV3IFVJLlByb3ZpZGVkVmlldyhleHRlbnNpb24pKTt0aGlzLl9sb2NhdGlvbk5hbWVCeVZpZXdJZC5zZXQoZGVzY3JpcHRvclsnaWQnXSxkZXNjcmlwdG9yWydsb2NhdGlvbiddKTt9fQpzdGF0aWMgX3BvcHVsYXRlVG9vbGJhcihlbGVtZW50LHRvb2xiYXJJdGVtcyl7aWYoIXRvb2xiYXJJdGVtcy5sZW5ndGgpCnJldHVybjtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnKTtlbGVtZW50Lmluc2VydEJlZm9yZSh0b29sYmFyLmVsZW1lbnQsZWxlbWVudC5maXJzdENoaWxkKTtmb3IoY29uc3QgaXRlbSBvZiB0b29sYmFySXRlbXMpCnRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oaXRlbSk7fQpyZXZlYWxWaWV3KHZpZXcpe2NvbnN0IGxvY2F0aW9uPSh2aWV3W1VJLlZpZXdNYW5hZ2VyLl9Mb2NhdGlvbi5zeW1ib2xdKTtpZighbG9jYXRpb24pCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtsb2NhdGlvbi5fcmV2ZWFsKCk7cmV0dXJuIGxvY2F0aW9uLnNob3dWaWV3KHZpZXcpO30Kdmlldyh2aWV3SWQpe3JldHVybiB0aGlzLl92aWV3cy5nZXQodmlld0lkKTt9Cm1hdGVyaWFsaXplZFdpZGdldCh2aWV3SWQpe2NvbnN0IHZpZXc9dGhpcy52aWV3KHZpZXdJZCk7cmV0dXJuIHZpZXc/dmlld1tVSS5WaWV3Ll93aWRnZXRTeW1ib2xdOm51bGw7fQpzaG93Vmlldyh2aWV3SWQsdXNlckdlc3R1cmUsb21pdEZvY3VzKXtjb25zdCB2aWV3PXRoaXMuX3ZpZXdzLmdldCh2aWV3SWQpO2lmKCF2aWV3KXtjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgZmluZCB2aWV3IGZvciBpZDogXCcnK3ZpZXdJZCsnXCcgJytuZXcgRXJyb3IoKS5zdGFjayk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KY29uc3QgbG9jYXRpb25OYW1lPXRoaXMuX2xvY2F0aW9uTmFtZUJ5Vmlld0lkLmdldCh2aWV3SWQpO2NvbnN0IGxvY2F0aW9uPXZpZXdbVUkuVmlld01hbmFnZXIuX0xvY2F0aW9uLnN5bWJvbF07aWYobG9jYXRpb24pe2xvY2F0aW9uLl9yZXZlYWwoKTtyZXR1cm4gbG9jYXRpb24uc2hvd1ZpZXcodmlldyx1bmRlZmluZWQsdXNlckdlc3R1cmUsb21pdEZvY3VzKTt9CnJldHVybiB0aGlzLnJlc29sdmVMb2NhdGlvbihsb2NhdGlvbk5hbWUpLnRoZW4obG9jYXRpb249PntpZighbG9jYXRpb24pCnRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgbG9jYXRpb24gZm9yIHZpZXc6ICcrdmlld0lkKTtsb2NhdGlvbi5fcmV2ZWFsKCk7cmV0dXJuIGxvY2F0aW9uLnNob3dWaWV3KHZpZXcsdW5kZWZpbmVkLHVzZXJHZXN0dXJlLG9taXRGb2N1cyk7fSk7fQpyZXNvbHZlTG9jYXRpb24obG9jYXRpb24pe2lmKCFsb2NhdGlvbikKcmV0dXJuKFByb21pc2UucmVzb2x2ZShudWxsKSk7Y29uc3QgcmVzb2x2ZXJFeHRlbnNpb25zPXNlbGYucnVudGltZS5leHRlbnNpb25zKFVJLlZpZXdMb2NhdGlvblJlc29sdmVyKS5maWx0ZXIoZXh0ZW5zaW9uPT5leHRlbnNpb24uZGVzY3JpcHRvcigpWyduYW1lJ109PT1sb2NhdGlvbik7aWYoIXJlc29sdmVyRXh0ZW5zaW9ucy5sZW5ndGgpCnRocm93IG5ldyBFcnJvcignVW5yZXNvbHZlZCBsb2NhdGlvbjogJytsb2NhdGlvbik7Y29uc3QgcmVzb2x2ZXJFeHRlbnNpb249cmVzb2x2ZXJFeHRlbnNpb25zWzBdO3JldHVybiByZXNvbHZlckV4dGVuc2lvbi5pbnN0YW5jZSgpLnRoZW4ocmVzb2x2ZXI9PihyZXNvbHZlci5yZXNvbHZlTG9jYXRpb24obG9jYXRpb24pKSk7fQpjcmVhdGVUYWJiZWRMb2NhdGlvbihyZXZlYWxDYWxsYmFjayxsb2NhdGlvbixyZXN0b3JlU2VsZWN0aW9uLGFsbG93UmVvcmRlcixkZWZhdWx0VGFiKXtyZXR1cm4gbmV3IFVJLlZpZXdNYW5hZ2VyLl9UYWJiZWRMb2NhdGlvbih0aGlzLHJldmVhbENhbGxiYWNrLGxvY2F0aW9uLHJlc3RvcmVTZWxlY3Rpb24sYWxsb3dSZW9yZGVyLGRlZmF1bHRUYWIpO30KY3JlYXRlU3RhY2tMb2NhdGlvbihyZXZlYWxDYWxsYmFjayxsb2NhdGlvbil7cmV0dXJuIG5ldyBVSS5WaWV3TWFuYWdlci5fU3RhY2tMb2NhdGlvbih0aGlzLHJldmVhbENhbGxiYWNrLGxvY2F0aW9uKTt9Cmhhc1ZpZXdzRm9yTG9jYXRpb24obG9jYXRpb24pe3JldHVybiEhdGhpcy5fdmlld3NGb3JMb2NhdGlvbihsb2NhdGlvbikubGVuZ3RoO30KX3ZpZXdzRm9yTG9jYXRpb24obG9jYXRpb24pe2NvbnN0IHJlc3VsdD1bXTtmb3IoY29uc3QgaWQgb2YgdGhpcy5fdmlld3Mua2V5cygpKXtpZih0aGlzLl9sb2NhdGlvbk5hbWVCeVZpZXdJZC5nZXQoaWQpPT09bG9jYXRpb24pCnJlc3VsdC5wdXNoKHRoaXMuX3ZpZXdzLmdldChpZCkpO30KcmV0dXJuIHJlc3VsdDt9fTtVSS5WaWV3TWFuYWdlci5fQ29udGFpbmVyV2lkZ2V0PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcih2aWV3KXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGV4LWF1dG8nLCd2aWV3LWNvbnRhaW5lcicsJ292ZXJmbG93LWF1dG8nKTt0aGlzLl92aWV3PXZpZXc7dGhpcy5lbGVtZW50LnRhYkluZGV4PS0xO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuZWxlbWVudCk7fQpfbWF0ZXJpYWxpemUoKXtpZih0aGlzLl9tYXRlcmlhbGl6ZVByb21pc2UpCnJldHVybiB0aGlzLl9tYXRlcmlhbGl6ZVByb21pc2U7Y29uc3QgcHJvbWlzZXM9W107cHJvbWlzZXMucHVzaCh0aGlzLl92aWV3LnRvb2xiYXJJdGVtcygpLnRoZW4oVUkuVmlld01hbmFnZXIuX3BvcHVsYXRlVG9vbGJhci5iaW5kKFVJLlZpZXdNYW5hZ2VyLHRoaXMuZWxlbWVudCkpKTtwcm9taXNlcy5wdXNoKHRoaXMuX3ZpZXcud2lkZ2V0KCkudGhlbih3aWRnZXQ9Pntjb25zdCBzaG91bGRGb2N1cz10aGlzLmVsZW1lbnQuaGFzRm9jdXMoKTt0aGlzLnNldERlZmF1bHRGb2N1c2VkRWxlbWVudChudWxsKTt0aGlzLl92aWV3W1VJLlZpZXcuX3dpZGdldFN5bWJvbF09d2lkZ2V0O3dpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7aWYoc2hvdWxkRm9jdXMpCndpZGdldC5mb2N1cygpO30pKTt0aGlzLl9tYXRlcmlhbGl6ZVByb21pc2U9UHJvbWlzZS5hbGwocHJvbWlzZXMpO3JldHVybiB0aGlzLl9tYXRlcmlhbGl6ZVByb21pc2U7fQp3YXNTaG93bigpe3RoaXMuX21hdGVyaWFsaXplKCkudGhlbigoKT0+e3RoaXMuX3dhc1Nob3duRm9yVGVzdCgpO30pO30KX3dhc1Nob3duRm9yVGVzdCgpe319O1VJLlZpZXdNYW5hZ2VyLl9FeHBhbmRhYmxlQ29udGFpbmVyV2lkZ2V0PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcih2aWV3KXtzdXBlcih0cnVlKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxleC1ub25lJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS92aWV3Q29udGFpbmVycy5jc3MnKTt0aGlzLl90aXRsZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZXhwYW5kYWJsZS12aWV3LXRpdGxlJyk7VUkuQVJJQVV0aWxzLm1hcmtBc0xpbmsodGhpcy5fdGl0bGVFbGVtZW50KTt0aGlzLl90aXRsZUV4cGFuZEljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1yaWdodCcsJ3RpdGxlLWV4cGFuZC1pY29uJyk7dGhpcy5fdGl0bGVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRXhwYW5kSWNvbik7dGhpcy5fdGl0bGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCh2aWV3LnRpdGxlKCkpO3RoaXMuX3RpdGxlRWxlbWVudC50YWJJbmRleD0wO3RoaXMuX3RpdGxlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fdG9nZ2xlRXhwYW5kZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fdGl0bGVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uVGl0bGVLZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuY29udGVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX3RpdGxlRWxlbWVudCx0aGlzLmNvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpO3RoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt0aGlzLl92aWV3PXZpZXc7dmlld1tVSS5WaWV3TWFuYWdlci5fRXhwYW5kYWJsZUNvbnRhaW5lcldpZGdldC5fc3ltYm9sXT10aGlzO30KX21hdGVyaWFsaXplKCl7aWYodGhpcy5fbWF0ZXJpYWxpemVQcm9taXNlKQpyZXR1cm4gdGhpcy5fbWF0ZXJpYWxpemVQcm9taXNlO2NvbnN0IHByb21pc2VzPVtdO3Byb21pc2VzLnB1c2godGhpcy5fdmlldy50b29sYmFySXRlbXMoKS50aGVuKFVJLlZpZXdNYW5hZ2VyLl9wb3B1bGF0ZVRvb2xiYXIuYmluZChVSS5WaWV3TWFuYWdlcix0aGlzLl90aXRsZUVsZW1lbnQpKSk7cHJvbWlzZXMucHVzaCh0aGlzLl92aWV3LndpZGdldCgpLnRoZW4od2lkZ2V0PT57dGhpcy5fd2lkZ2V0PXdpZGdldDt0aGlzLl92aWV3W1VJLlZpZXcuX3dpZGdldFN5bWJvbF09d2lkZ2V0O3dpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7fSkpO3RoaXMuX21hdGVyaWFsaXplUHJvbWlzZT1Qcm9taXNlLmFsbChwcm9taXNlcyk7cmV0dXJuIHRoaXMuX21hdGVyaWFsaXplUHJvbWlzZTt9Cl9leHBhbmQoKXtpZih0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdleHBhbmRlZCcpKQpyZXR1cm4gdGhpcy5fbWF0ZXJpYWxpemUoKTt0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZXhwYW5kZWQnKTtVSS5BUklBVXRpbHMuc2V0RXhwYW5kZWQodGhpcy5fdGl0bGVFbGVtZW50LHRydWUpO3RoaXMuX3RpdGxlRXhwYW5kSWNvbi5zZXRJY29uVHlwZSgnc21hbGxpY29uLXRyaWFuZ2xlLWRvd24nKTtyZXR1cm4gdGhpcy5fbWF0ZXJpYWxpemUoKS50aGVuKCgpPT50aGlzLl93aWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpKTt9Cl9jb2xsYXBzZSgpe2lmKCF0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdleHBhbmRlZCcpKQpyZXR1cm47dGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7VUkuQVJJQVV0aWxzLnNldEV4cGFuZGVkKHRoaXMuX3RpdGxlRWxlbWVudCxmYWxzZSk7dGhpcy5fdGl0bGVFeHBhbmRJY29uLnNldEljb25UeXBlKCdzbWFsbGljb24tdHJpYW5nbGUtcmlnaHQnKTt0aGlzLl9tYXRlcmlhbGl6ZSgpLnRoZW4oKCk9PnRoaXMuX3dpZGdldC5kZXRhY2goKSk7fQpfdG9nZ2xlRXhwYW5kZWQoKXtpZih0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdleHBhbmRlZCcpKQp0aGlzLl9jb2xsYXBzZSgpO2Vsc2UKdGhpcy5fZXhwYW5kKCk7fQpfb25UaXRsZUtleURvd24oZXZlbnQpe2lmKGlzRW50ZXJLZXkoZXZlbnQpfHxldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlNwYWNlLmNvZGUpe3RoaXMuX3RvZ2dsZUV4cGFuZGVkKCk7fWVsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93TGVmdCcpe3RoaXMuX2NvbGxhcHNlKCk7fWVsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93UmlnaHQnKXtpZighdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZXhwYW5kZWQnKSkKdGhpcy5fZXhwYW5kKCk7ZWxzZSBpZih0aGlzLl93aWRnZXQpCnRoaXMuX3dpZGdldC5mb2N1cygpO319fTtVSS5WaWV3TWFuYWdlci5fRXhwYW5kYWJsZUNvbnRhaW5lcldpZGdldC5fc3ltYm9sPVN5bWJvbCgnY29udGFpbmVyJyk7VUkuVmlld01hbmFnZXIuX0xvY2F0aW9uPWNsYXNze2NvbnN0cnVjdG9yKG1hbmFnZXIsd2lkZ2V0LHJldmVhbENhbGxiYWNrKXt0aGlzLl9tYW5hZ2VyPW1hbmFnZXI7dGhpcy5fcmV2ZWFsQ2FsbGJhY2s9cmV2ZWFsQ2FsbGJhY2s7dGhpcy5fd2lkZ2V0PXdpZGdldDt9CndpZGdldCgpe3JldHVybiB0aGlzLl93aWRnZXQ7fQpfcmV2ZWFsKCl7aWYodGhpcy5fcmV2ZWFsQ2FsbGJhY2spCnRoaXMuX3JldmVhbENhbGxiYWNrKCk7fX07VUkuVmlld01hbmFnZXIuX0xvY2F0aW9uLnN5bWJvbD1TeW1ib2woJ2xvY2F0aW9uJyk7VUkuVmlld01hbmFnZXIuX1RhYmJlZExvY2F0aW9uPWNsYXNzIGV4dGVuZHMgVUkuVmlld01hbmFnZXIuX0xvY2F0aW9ue2NvbnN0cnVjdG9yKG1hbmFnZXIscmV2ZWFsQ2FsbGJhY2ssbG9jYXRpb24scmVzdG9yZVNlbGVjdGlvbixhbGxvd1Jlb3JkZXIsZGVmYXVsdFRhYil7Y29uc3QgdGFiYmVkUGFuZT1uZXcgVUkuVGFiYmVkUGFuZSgpO2lmKGFsbG93UmVvcmRlcikKdGFiYmVkUGFuZS5zZXRBbGxvd1RhYlJlb3JkZXIodHJ1ZSk7c3VwZXIobWFuYWdlcix0YWJiZWRQYW5lLHJldmVhbENhbGxiYWNrKTt0aGlzLl90YWJiZWRQYW5lPXRhYmJlZFBhbmU7dGhpcy5fYWxsb3dSZW9yZGVyPWFsbG93UmVvcmRlcjt0aGlzLl90YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiU2VsZWN0ZWQsdGhpcy5fdGFiU2VsZWN0ZWQsdGhpcyk7dGhpcy5fdGFiYmVkUGFuZS5hZGRFdmVudExpc3RlbmVyKFVJLlRhYmJlZFBhbmUuRXZlbnRzLlRhYkNsb3NlZCx0aGlzLl90YWJDbG9zZWQsdGhpcyk7dGhpcy5fY2xvc2VhYmxlVGFiU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhsb2NhdGlvbisnLWNsb3NlYWJsZVRhYnMnLHt9KTt0aGlzLl90YWJPcmRlclNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcobG9jYXRpb24rJy10YWJPcmRlcicse30pO3RoaXMuX3RhYmJlZFBhbmUuYWRkRXZlbnRMaXN0ZW5lcihVSS5UYWJiZWRQYW5lLkV2ZW50cy5UYWJPcmRlckNoYW5nZWQsdGhpcy5fcGVyc2lzdFRhYk9yZGVyLHRoaXMpO2lmKHJlc3RvcmVTZWxlY3Rpb24pCnRoaXMuX2xhc3RTZWxlY3RlZFRhYlNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcobG9jYXRpb24rJy1zZWxlY3RlZFRhYicsJycpO3RoaXMuX2RlZmF1bHRUYWI9ZGVmYXVsdFRhYjt0aGlzLl92aWV3cz1uZXcgTWFwKCk7aWYobG9jYXRpb24pCnRoaXMuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKGxvY2F0aW9uKTt9CndpZGdldCgpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lO30KdGFiYmVkUGFuZSgpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lO30KZW5hYmxlTW9yZVRhYnNCdXR0b24oKXt0aGlzLl90YWJiZWRQYW5lLmxlZnRUb29sYmFyKCkuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJNZW51QnV0dG9uKHRoaXMuX2FwcGVuZFRhYnNUb01lbnUuYmluZCh0aGlzKSkpO3RoaXMuX3RhYmJlZFBhbmUuZGlzYWJsZU92ZXJmbG93TWVudSgpO30KYXBwZW5kQXBwbGljYWJsZUl0ZW1zKGxvY2F0aW9uTmFtZSl7Y29uc3Qgdmlld3M9dGhpcy5fbWFuYWdlci5fdmlld3NGb3JMb2NhdGlvbihsb2NhdGlvbk5hbWUpO2lmKHRoaXMuX2FsbG93UmVvcmRlcil7bGV0IGk9MDtjb25zdCBwZXJzaXN0ZWRPcmRlcnM9dGhpcy5fdGFiT3JkZXJTZXR0aW5nLmdldCgpO2NvbnN0IG9yZGVycz1uZXcgTWFwKCk7Zm9yKGNvbnN0IHZpZXcgb2Ygdmlld3MpCm9yZGVycy5zZXQodmlldy52aWV3SWQoKSxwZXJzaXN0ZWRPcmRlcnNbdmlldy52aWV3SWQoKV18fCgrK2kpKlVJLlZpZXdNYW5hZ2VyLl9UYWJiZWRMb2NhdGlvbi5vcmRlclN0ZXApO3ZpZXdzLnNvcnQoKGEsYik9Pm9yZGVycy5nZXQoYS52aWV3SWQoKSktb3JkZXJzLmdldChiLnZpZXdJZCgpKSk7fQpmb3IoY29uc3QgdmlldyBvZiB2aWV3cyl7Y29uc3QgaWQ9dmlldy52aWV3SWQoKTt0aGlzLl92aWV3cy5zZXQoaWQsdmlldyk7dmlld1tVSS5WaWV3TWFuYWdlci5fTG9jYXRpb24uc3ltYm9sXT10aGlzO2lmKHZpZXcuaXNUcmFuc2llbnQoKSkKY29udGludWU7aWYoIXZpZXcuaXNDbG9zZWFibGUoKSkKdGhpcy5fYXBwZW5kVGFiKHZpZXcpO2Vsc2UgaWYodGhpcy5fY2xvc2VhYmxlVGFiU2V0dGluZy5nZXQoKVtpZF0pCnRoaXMuX2FwcGVuZFRhYih2aWV3KTt9CmlmKHRoaXMuX2RlZmF1bHRUYWImJnRoaXMuX3RhYmJlZFBhbmUuaGFzVGFiKHRoaXMuX2RlZmF1bHRUYWIpKQp0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYih0aGlzLl9kZWZhdWx0VGFiKTtlbHNlIGlmKHRoaXMuX2xhc3RTZWxlY3RlZFRhYlNldHRpbmcmJnRoaXMuX3RhYmJlZFBhbmUuaGFzVGFiKHRoaXMuX2xhc3RTZWxlY3RlZFRhYlNldHRpbmcuZ2V0KCkpKQp0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYih0aGlzLl9sYXN0U2VsZWN0ZWRUYWJTZXR0aW5nLmdldCgpKTt9Cl9hcHBlbmRUYWJzVG9NZW51KGNvbnRleHRNZW51KXtjb25zdCB2aWV3cz1BcnJheS5mcm9tKHRoaXMuX3ZpZXdzLnZhbHVlcygpKTt2aWV3cy5zb3J0KCh2aWV3YSx2aWV3Yik9PnZpZXdhLnRpdGxlKCkubG9jYWxlQ29tcGFyZSh2aWV3Yi50aXRsZSgpKSk7Zm9yKGNvbnN0IHZpZXcgb2Ygdmlld3Mpe2NvbnN0IHRpdGxlPUNvbW1vbi5VSVN0cmluZyh2aWV3LnRpdGxlKCkpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbSh0aXRsZSx0aGlzLnNob3dWaWV3LmJpbmQodGhpcyx2aWV3LHVuZGVmaW5lZCx0cnVlKSk7fX0KX2FwcGVuZFRhYih2aWV3LGluZGV4KXt0aGlzLl90YWJiZWRQYW5lLmFwcGVuZFRhYih2aWV3LnZpZXdJZCgpLHZpZXcudGl0bGUoKSxuZXcgVUkuVmlld01hbmFnZXIuX0NvbnRhaW5lcldpZGdldCh2aWV3KSx1bmRlZmluZWQsZmFsc2Usdmlldy5pc0Nsb3NlYWJsZSgpfHx2aWV3LmlzVHJhbnNpZW50KCksaW5kZXgpO30KYXBwZW5kVmlldyh2aWV3LGluc2VydEJlZm9yZSl7aWYodGhpcy5fdGFiYmVkUGFuZS5oYXNUYWIodmlldy52aWV3SWQoKSkpCnJldHVybjtjb25zdCBvbGRMb2NhdGlvbj12aWV3W1VJLlZpZXdNYW5hZ2VyLl9Mb2NhdGlvbi5zeW1ib2xdO2lmKG9sZExvY2F0aW9uJiZvbGRMb2NhdGlvbiE9PXRoaXMpCm9sZExvY2F0aW9uLnJlbW92ZVZpZXcodmlldyk7dmlld1tVSS5WaWV3TWFuYWdlci5fTG9jYXRpb24uc3ltYm9sXT10aGlzO3RoaXMuX21hbmFnZXIuX3ZpZXdzLnNldCh2aWV3LnZpZXdJZCgpLHZpZXcpO3RoaXMuX3ZpZXdzLnNldCh2aWV3LnZpZXdJZCgpLHZpZXcpO2xldCBpbmRleD11bmRlZmluZWQ7Y29uc3QgdGFiSWRzPXRoaXMuX3RhYmJlZFBhbmUudGFiSWRzKCk7aWYodGhpcy5fYWxsb3dSZW9yZGVyKXtjb25zdCBvcmRlclNldHRpbmc9dGhpcy5fdGFiT3JkZXJTZXR0aW5nLmdldCgpO2NvbnN0IG9yZGVyPW9yZGVyU2V0dGluZ1t2aWV3LnZpZXdJZCgpXTtmb3IobGV0IGk9MDtvcmRlciYmaTx0YWJJZHMubGVuZ3RoOysraSl7aWYob3JkZXJTZXR0aW5nW3RhYklkc1tpXV0mJm9yZGVyU2V0dGluZ1t0YWJJZHNbaV1dPm9yZGVyKXtpbmRleD1pO2JyZWFrO319fWVsc2UgaWYoaW5zZXJ0QmVmb3JlKXtmb3IobGV0IGk9MDtpPHRhYklkcy5sZW5ndGg7KytpKXtpZih0YWJJZHNbaV09PT1pbnNlcnRCZWZvcmUudmlld0lkKCkpe2luZGV4PWk7YnJlYWs7fX19CnRoaXMuX2FwcGVuZFRhYih2aWV3LGluZGV4KTtpZih2aWV3LmlzQ2xvc2VhYmxlKCkpe2NvbnN0IHRhYnM9dGhpcy5fY2xvc2VhYmxlVGFiU2V0dGluZy5nZXQoKTtjb25zdCB0YWJJZD12aWV3LnZpZXdJZCgpO2lmKCF0YWJzW3RhYklkXSl7dGFic1t0YWJJZF09dHJ1ZTt0aGlzLl9jbG9zZWFibGVUYWJTZXR0aW5nLnNldCh0YWJzKTt9fQp0aGlzLl9wZXJzaXN0VGFiT3JkZXIoKTt9CnNob3dWaWV3KHZpZXcsaW5zZXJ0QmVmb3JlLHVzZXJHZXN0dXJlLG9taXRGb2N1cyl7dGhpcy5hcHBlbmRWaWV3KHZpZXcsaW5zZXJ0QmVmb3JlKTt0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYih2aWV3LnZpZXdJZCgpLHVzZXJHZXN0dXJlKTtpZighb21pdEZvY3VzKQp0aGlzLl90YWJiZWRQYW5lLmZvY3VzKCk7Y29uc3Qgd2lkZ2V0PSh0aGlzLl90YWJiZWRQYW5lLnRhYlZpZXcodmlldy52aWV3SWQoKSkpO3JldHVybiB3aWRnZXQuX21hdGVyaWFsaXplKCk7fQpyZW1vdmVWaWV3KHZpZXcpe2lmKCF0aGlzLl90YWJiZWRQYW5lLmhhc1RhYih2aWV3LnZpZXdJZCgpKSkKcmV0dXJuO2RlbGV0ZSB2aWV3W1VJLlZpZXdNYW5hZ2VyLl9Mb2NhdGlvbi5zeW1ib2xdO3RoaXMuX21hbmFnZXIuX3ZpZXdzLmRlbGV0ZSh2aWV3LnZpZXdJZCgpKTt0aGlzLl90YWJiZWRQYW5lLmNsb3NlVGFiKHZpZXcudmlld0lkKCkpO3RoaXMuX3ZpZXdzLmRlbGV0ZSh2aWV3LnZpZXdJZCgpKTt9Cl90YWJTZWxlY3RlZChldmVudCl7Y29uc3QgdGFiSWQ9KGV2ZW50LmRhdGEudGFiSWQpO2lmKHRoaXMuX2xhc3RTZWxlY3RlZFRhYlNldHRpbmcmJmV2ZW50LmRhdGFbJ2lzVXNlckdlc3R1cmUnXSkKdGhpcy5fbGFzdFNlbGVjdGVkVGFiU2V0dGluZy5zZXQodGFiSWQpO30KX3RhYkNsb3NlZChldmVudCl7Y29uc3QgaWQ9KGV2ZW50LmRhdGFbJ3RhYklkJ10pO2NvbnN0IHRhYnM9dGhpcy5fY2xvc2VhYmxlVGFiU2V0dGluZy5nZXQoKTtpZih0YWJzW2lkXSl7ZGVsZXRlIHRhYnNbaWRdO3RoaXMuX2Nsb3NlYWJsZVRhYlNldHRpbmcuc2V0KHRhYnMpO30KdGhpcy5fdmlld3MuZ2V0KGlkKS5kaXNwb3NlVmlldygpO30KX3BlcnNpc3RUYWJPcmRlcigpe2NvbnN0IHRhYklkcz10aGlzLl90YWJiZWRQYW5lLnRhYklkcygpO2NvbnN0IHRhYk9yZGVycz17fTtmb3IobGV0IGk9MDtpPHRhYklkcy5sZW5ndGg7aSsrKQp0YWJPcmRlcnNbdGFiSWRzW2ldXT0oaSsxKSpVSS5WaWV3TWFuYWdlci5fVGFiYmVkTG9jYXRpb24ub3JkZXJTdGVwO3RoaXMuX3RhYk9yZGVyU2V0dGluZy5zZXQodGFiT3JkZXJzKTt9fTtVSS5WaWV3TWFuYWdlci5fVGFiYmVkTG9jYXRpb24ub3JkZXJTdGVwPTEwO1VJLlZpZXdNYW5hZ2VyLl9TdGFja0xvY2F0aW9uPWNsYXNzIGV4dGVuZHMgVUkuVmlld01hbmFnZXIuX0xvY2F0aW9ue2NvbnN0cnVjdG9yKG1hbmFnZXIscmV2ZWFsQ2FsbGJhY2ssbG9jYXRpb24pe2NvbnN0IHZib3g9bmV3IFVJLlZCb3goKTtzdXBlcihtYW5hZ2VyLHZib3gscmV2ZWFsQ2FsbGJhY2spO3RoaXMuX3Zib3g9dmJveDt0aGlzLl9leHBhbmRhYmxlQ29udGFpbmVycz1uZXcgTWFwKCk7aWYobG9jYXRpb24pCnRoaXMuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKGxvY2F0aW9uKTt9CmFwcGVuZFZpZXcodmlldyxpbnNlcnRCZWZvcmUpe2NvbnN0IG9sZExvY2F0aW9uPXZpZXdbVUkuVmlld01hbmFnZXIuX0xvY2F0aW9uLnN5bWJvbF07aWYob2xkTG9jYXRpb24mJm9sZExvY2F0aW9uIT09dGhpcykKb2xkTG9jYXRpb24ucmVtb3ZlVmlldyh2aWV3KTtsZXQgY29udGFpbmVyPXRoaXMuX2V4cGFuZGFibGVDb250YWluZXJzLmdldCh2aWV3LnZpZXdJZCgpKTtpZighY29udGFpbmVyKXt2aWV3W1VJLlZpZXdNYW5hZ2VyLl9Mb2NhdGlvbi5zeW1ib2xdPXRoaXM7dGhpcy5fbWFuYWdlci5fdmlld3Muc2V0KHZpZXcudmlld0lkKCksdmlldyk7Y29udGFpbmVyPW5ldyBVSS5WaWV3TWFuYWdlci5fRXhwYW5kYWJsZUNvbnRhaW5lcldpZGdldCh2aWV3KTtsZXQgYmVmb3JlRWxlbWVudD1udWxsO2lmKGluc2VydEJlZm9yZSl7Y29uc3QgYmVmb3JlQ29udGFpbmVyPWluc2VydEJlZm9yZVtVSS5WaWV3TWFuYWdlci5fRXhwYW5kYWJsZUNvbnRhaW5lcldpZGdldC5fc3ltYm9sXTtiZWZvcmVFbGVtZW50PWJlZm9yZUNvbnRhaW5lcj9iZWZvcmVDb250YWluZXIuZWxlbWVudDpudWxsO30KY29udGFpbmVyLnNob3codGhpcy5fdmJveC5jb250ZW50RWxlbWVudCxiZWZvcmVFbGVtZW50KTt0aGlzLl9leHBhbmRhYmxlQ29udGFpbmVycy5zZXQodmlldy52aWV3SWQoKSxjb250YWluZXIpO319CnNob3dWaWV3KHZpZXcsaW5zZXJ0QmVmb3JlKXt0aGlzLmFwcGVuZFZpZXcodmlldyxpbnNlcnRCZWZvcmUpO2NvbnN0IGNvbnRhaW5lcj10aGlzLl9leHBhbmRhYmxlQ29udGFpbmVycy5nZXQodmlldy52aWV3SWQoKSk7cmV0dXJuIGNvbnRhaW5lci5fZXhwYW5kKCk7fQpyZW1vdmVWaWV3KHZpZXcpe2NvbnN0IGNvbnRhaW5lcj10aGlzLl9leHBhbmRhYmxlQ29udGFpbmVycy5nZXQodmlldy52aWV3SWQoKSk7aWYoIWNvbnRhaW5lcikKcmV0dXJuO2NvbnRhaW5lci5kZXRhY2goKTt0aGlzLl9leHBhbmRhYmxlQ29udGFpbmVycy5kZWxldGUodmlldy52aWV3SWQoKSk7ZGVsZXRlIHZpZXdbVUkuVmlld01hbmFnZXIuX0xvY2F0aW9uLnN5bWJvbF07dGhpcy5fbWFuYWdlci5fdmlld3MuZGVsZXRlKHZpZXcudmlld0lkKCkpO30KYXBwZW5kQXBwbGljYWJsZUl0ZW1zKGxvY2F0aW9uTmFtZSl7Zm9yKGNvbnN0IHZpZXcgb2YgdGhpcy5fbWFuYWdlci5fdmlld3NGb3JMb2NhdGlvbihsb2NhdGlvbk5hbWUpKQp0aGlzLmFwcGVuZFZpZXcodmlldyk7fX07VUkudmlld01hbmFnZXI7O1VJLlRyZWVPdXRsaW5lPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fY3JlYXRlUm9vdEVsZW1lbnQoKTt0aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQ9bnVsbDt0aGlzLmV4cGFuZFRyZWVFbGVtZW50c1doZW5BcnJvd2luZz1mYWxzZTt0aGlzLl9jb21wYXJhdG9yPW51bGw7dGhpcy5jb250ZW50RWxlbWVudD10aGlzLl9yb290RWxlbWVudC5fY2hpbGRyZW5MaXN0Tm9kZTt0aGlzLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX3RyZWVLZXlEb3duLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fZm9jdXNhYmxlPXRydWU7dGhpcy5zZXRGb2N1c2FibGUodGhpcy5fZm9jdXNhYmxlKTtpZih0aGlzLl9mb2N1c2FibGUpCnRoaXMuY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsLTEpO3RoaXMuZWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50O1VJLkFSSUFVdGlscy5tYXJrQXNUcmVlKHRoaXMuZWxlbWVudCk7fQpfY3JlYXRlUm9vdEVsZW1lbnQoKXt0aGlzLl9yb290RWxlbWVudD1uZXcgVUkuVHJlZUVsZW1lbnQoKTt0aGlzLl9yb290RWxlbWVudC50cmVlT3V0bGluZT10aGlzO3RoaXMuX3Jvb3RFbGVtZW50LnJvb3Q9dHJ1ZTt0aGlzLl9yb290RWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO3RoaXMuX3Jvb3RFbGVtZW50LmV4cGFuZGVkPXRydWU7dGhpcy5fcm9vdEVsZW1lbnQuX2NoaWxkcmVuTGlzdE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnY2hpbGRyZW4nKTt9CnJvb3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O30KZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLl9yb290RWxlbWVudC5maXJzdENoaWxkKCk7fQpfbGFzdERlc2NlbmRlbnQoKXtsZXQgbGFzdD10aGlzLl9yb290RWxlbWVudC5sYXN0Q2hpbGQoKTt3aGlsZShsYXN0LmV4cGFuZGVkJiZsYXN0LmNoaWxkQ291bnQoKSkKbGFzdD1sYXN0Lmxhc3RDaGlsZCgpO3JldHVybiBsYXN0O30KYXBwZW5kQ2hpbGQoY2hpbGQpe3RoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTt9Cmluc2VydENoaWxkKGNoaWxkLGluZGV4KXt0aGlzLl9yb290RWxlbWVudC5pbnNlcnRDaGlsZChjaGlsZCxpbmRleCk7fQpyZW1vdmVDaGlsZChjaGlsZCl7dGhpcy5fcm9vdEVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpO30KcmVtb3ZlQ2hpbGRyZW4oKXt0aGlzLl9yb290RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO30KdHJlZUVsZW1lbnRGcm9tUG9pbnQoeCx5KXtjb25zdCBub2RlPXRoaXMuY29udGVudEVsZW1lbnQub3duZXJEb2N1bWVudC5kZWVwRWxlbWVudEZyb21Qb2ludCh4LHkpO2lmKCFub2RlKQpyZXR1cm4gbnVsbDtjb25zdCBsaXN0Tm9kZT1ub2RlLmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWVJbkFycmF5KFsnb2wnLCdsaSddKTtpZihsaXN0Tm9kZSkKcmV0dXJuIGxpc3ROb2RlLnBhcmVudFRyZWVFbGVtZW50fHxsaXN0Tm9kZS50cmVlRWxlbWVudDtyZXR1cm4gbnVsbDt9CnRyZWVFbGVtZW50RnJvbUV2ZW50KGV2ZW50KXtyZXR1cm4gZXZlbnQ/dGhpcy50cmVlRWxlbWVudEZyb21Qb2ludChldmVudC5wYWdlWCxldmVudC5wYWdlWSk6bnVsbDt9CnNldENvbXBhcmF0b3IoY29tcGFyYXRvcil7dGhpcy5fY29tcGFyYXRvcj1jb21wYXJhdG9yO30Kc2V0Rm9jdXNhYmxlKGZvY3VzYWJsZSl7aWYoZm9jdXNhYmxlKXt0aGlzLl9mb2N1c2FibGU9dHJ1ZTt0aGlzLmNvbnRlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLC0xKTtpZih0aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQpCnRoaXMuc2VsZWN0ZWRUcmVlRWxlbWVudC5fc2V0Rm9jdXNhYmxlKHRydWUpO31lbHNle3RoaXMuX2ZvY3VzYWJsZT1mYWxzZTt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiSW5kZXgnKTtpZih0aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQpCnRoaXMuc2VsZWN0ZWRUcmVlRWxlbWVudC5fc2V0Rm9jdXNhYmxlKGZhbHNlKTt9fQpmb2N1cygpe2lmKHRoaXMuc2VsZWN0ZWRUcmVlRWxlbWVudCkKdGhpcy5zZWxlY3RlZFRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5mb2N1cygpO2Vsc2UKdGhpcy5jb250ZW50RWxlbWVudC5mb2N1cygpO30KX2JpbmRUcmVlRWxlbWVudChlbGVtZW50KXtpZihlbGVtZW50LnRyZWVPdXRsaW5lKQpjb25zb2xlLmVycm9yKCdCaW5kaW5nIGVsZW1lbnQgZm9yIHRoZSBzZWNvbmQgdGltZTogJytuZXcgRXJyb3IoKS5zdGFjayk7ZWxlbWVudC50cmVlT3V0bGluZT10aGlzO2VsZW1lbnQub25iaW5kKCk7fQpfdW5iaW5kVHJlZUVsZW1lbnQoZWxlbWVudCl7aWYoIWVsZW1lbnQudHJlZU91dGxpbmUpCmNvbnNvbGUuZXJyb3IoJ1VuYmluZGluZyBlbGVtZW50IHRoYXQgd2FzIG5vdCBib3VuZDogJytuZXcgRXJyb3IoKS5zdGFjayk7ZWxlbWVudC5kZXNlbGVjdCgpO2VsZW1lbnQub251bmJpbmQoKTtlbGVtZW50LnRyZWVPdXRsaW5lPW51bGw7fQpzZWxlY3RQcmV2aW91cygpe2xldCBuZXh0U2VsZWN0ZWRFbGVtZW50PXRoaXMuc2VsZWN0ZWRUcmVlRWxlbWVudC50cmF2ZXJzZVByZXZpb3VzVHJlZUVsZW1lbnQodHJ1ZSk7d2hpbGUobmV4dFNlbGVjdGVkRWxlbWVudCYmIW5leHRTZWxlY3RlZEVsZW1lbnQuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkRWxlbWVudD1uZXh0U2VsZWN0ZWRFbGVtZW50LnRyYXZlcnNlUHJldmlvdXNUcmVlRWxlbWVudCghdGhpcy5leHBhbmRUcmVlRWxlbWVudHNXaGVuQXJyb3dpbmcpO2lmKCFuZXh0U2VsZWN0ZWRFbGVtZW50KQpyZXR1cm4gZmFsc2U7bmV4dFNlbGVjdGVkRWxlbWVudC5zZWxlY3QoZmFsc2UsdHJ1ZSk7cmV0dXJuIHRydWU7fQpzZWxlY3ROZXh0KCl7bGV0IG5leHRTZWxlY3RlZEVsZW1lbnQ9dGhpcy5zZWxlY3RlZFRyZWVFbGVtZW50LnRyYXZlcnNlTmV4dFRyZWVFbGVtZW50KHRydWUpO3doaWxlKG5leHRTZWxlY3RlZEVsZW1lbnQmJiFuZXh0U2VsZWN0ZWRFbGVtZW50LnNlbGVjdGFibGUpCm5leHRTZWxlY3RlZEVsZW1lbnQ9bmV4dFNlbGVjdGVkRWxlbWVudC50cmF2ZXJzZU5leHRUcmVlRWxlbWVudCghdGhpcy5leHBhbmRUcmVlRWxlbWVudHNXaGVuQXJyb3dpbmcpO2lmKCFuZXh0U2VsZWN0ZWRFbGVtZW50KQpyZXR1cm4gZmFsc2U7bmV4dFNlbGVjdGVkRWxlbWVudC5zZWxlY3QoZmFsc2UsdHJ1ZSk7cmV0dXJuIHRydWU7fQpfc2VsZWN0Rmlyc3QoKXtsZXQgZmlyc3Q9dGhpcy5maXJzdENoaWxkKCk7d2hpbGUoZmlyc3QmJiFmaXJzdC5zZWxlY3RhYmxlKQpmaXJzdD1maXJzdC50cmF2ZXJzZU5leHRUcmVlRWxlbWVudCh0cnVlKTtpZighZmlyc3QpCnJldHVybiBmYWxzZTtmaXJzdC5zZWxlY3QoZmFsc2UsdHJ1ZSk7cmV0dXJuIHRydWU7fQpfc2VsZWN0TGFzdCgpe2xldCBsYXN0PXRoaXMuX2xhc3REZXNjZW5kZW50KCk7d2hpbGUobGFzdCYmIWxhc3Quc2VsZWN0YWJsZSkKbGFzdD1sYXN0LnRyYXZlcnNlUHJldmlvdXNUcmVlRWxlbWVudCh0cnVlKTtpZighbGFzdCkKcmV0dXJuIGZhbHNlO2xhc3Quc2VsZWN0KGZhbHNlLHRydWUpO3JldHVybiB0cnVlO30KX3RyZWVLZXlEb3duKGV2ZW50KXtpZighdGhpcy5zZWxlY3RlZFRyZWVFbGVtZW50fHxldmVudC50YXJnZXQhPT10aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50fHxldmVudC5zaGlmdEtleXx8ZXZlbnQubWV0YUtleXx8ZXZlbnQuY3RybEtleSkKcmV0dXJuO2xldCBoYW5kbGVkPWZhbHNlO2lmKGV2ZW50LmtleT09PSdBcnJvd1VwJyYmIWV2ZW50LmFsdEtleSl7aGFuZGxlZD10aGlzLnNlbGVjdFByZXZpb3VzKCk7fWVsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93RG93bicmJiFldmVudC5hbHRLZXkpe2hhbmRsZWQ9dGhpcy5zZWxlY3ROZXh0KCk7fWVsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93TGVmdCcpe2hhbmRsZWQ9dGhpcy5zZWxlY3RlZFRyZWVFbGVtZW50LmNvbGxhcHNlT3JBc2NlbmQoZXZlbnQuYWx0S2V5KTt9ZWxzZSBpZihldmVudC5rZXk9PT0nQXJyb3dSaWdodCcpe2lmKCF0aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQucmV2ZWFsZWQoKSl7dGhpcy5zZWxlY3RlZFRyZWVFbGVtZW50LnJldmVhbCgpO2hhbmRsZWQ9dHJ1ZTt9ZWxzZXtoYW5kbGVkPXRoaXMuc2VsZWN0ZWRUcmVlRWxlbWVudC5kZXNjZW5kT3JFeHBhbmQoZXZlbnQuYWx0S2V5KTt9fWVsc2UgaWYoZXZlbnQua2V5Q29kZT09PTh8fGV2ZW50LmtleUNvZGU9PT00Nil7aGFuZGxlZD10aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQub25kZWxldGUoKTt9ZWxzZSBpZihpc0VudGVyS2V5KGV2ZW50KSl7aGFuZGxlZD10aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQub25lbnRlcigpO31lbHNlIGlmKGV2ZW50LmtleUNvZGU9PT1VSS5LZXlib2FyZFNob3J0Y3V0LktleXMuU3BhY2UuY29kZSl7aGFuZGxlZD10aGlzLnNlbGVjdGVkVHJlZUVsZW1lbnQub25zcGFjZSgpO31lbHNlIGlmKGV2ZW50LmtleT09PSdIb21lJyl7aGFuZGxlZD10aGlzLl9zZWxlY3RGaXJzdCgpO31lbHNlIGlmKGV2ZW50LmtleT09PSdFbmQnKXtoYW5kbGVkPXRoaXMuX3NlbGVjdExhc3QoKTt9CmlmKGhhbmRsZWQpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfZGVmZXJyZWRTY3JvbGxJbnRvVmlldyh0cmVlRWxlbWVudCxjZW50ZXIpe2lmKCF0aGlzLl90cmVlRWxlbWVudFRvU2Nyb2xsSW50b1ZpZXcpCnRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZGVmZXJyZWRTY3JvbGxJbnRvVmlldy5iaW5kKHRoaXMpKTt0aGlzLl90cmVlRWxlbWVudFRvU2Nyb2xsSW50b1ZpZXc9dHJlZUVsZW1lbnQ7dGhpcy5fY2VudGVyVXBvblNjcm9sbEludG9WaWV3PWNlbnRlcjtmdW5jdGlvbiBkZWZlcnJlZFNjcm9sbEludG9WaWV3KCl7dGhpcy5fdHJlZUVsZW1lbnRUb1Njcm9sbEludG9WaWV3Lmxpc3RJdGVtRWxlbWVudC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKHRoaXMuX2NlbnRlclVwb25TY3JvbGxJbnRvVmlldyk7ZGVsZXRlIHRoaXMuX3RyZWVFbGVtZW50VG9TY3JvbGxJbnRvVmlldztkZWxldGUgdGhpcy5fY2VudGVyVXBvblNjcm9sbEludG9WaWV3O319fTtVSS5UcmVlT3V0bGluZS5FdmVudHM9e0VsZW1lbnRBdHRhY2hlZDpTeW1ib2woJ0VsZW1lbnRBdHRhY2hlZCcpLEVsZW1lbnRFeHBhbmRlZDpTeW1ib2woJ0VsZW1lbnRFeHBhbmRlZCcpLEVsZW1lbnRDb2xsYXBzZWQ6U3ltYm9sKCdFbGVtZW50Q29sbGFwc2VkJyksRWxlbWVudFNlbGVjdGVkOlN5bWJvbCgnRWxlbWVudFNlbGVjdGVkJyl9O1VJLlRyZWVPdXRsaW5lSW5TaGFkb3c9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlT3V0bGluZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0cmVlLW91dGxpbmUnKTt0aGlzLmVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5fc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcy5lbGVtZW50LCd1aS90cmVlb3V0bGluZS5jc3MnKTt0aGlzLl9kaXNjbG9zdXJlRWxlbWVudD10aGlzLl9zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCd0cmVlLW91dGxpbmUtZGlzY2xvc3VyZScpO3RoaXMuX2Rpc2Nsb3N1cmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX3JlbmRlclNlbGVjdGlvbj10cnVlO30KcmVnaXN0ZXJSZXF1aXJlZENTUyhjc3NGaWxlKXtVSS5hcHBlbmRTdHlsZSh0aGlzLl9zaGFkb3dSb290LGNzc0ZpbGUpO30KaGlkZU92ZXJmbG93KCl7dGhpcy5fZGlzY2xvc3VyZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUtaGlkZS1vdmVyZmxvdycpO30KbWFrZURlbnNlKCl7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0cmVlLW91dGxpbmUtZGVuc2UnKTt9fTtVSS5UcmVlRWxlbWVudD1jbGFzc3tjb25zdHJ1Y3Rvcih0aXRsZSxleHBhbmRhYmxlKXt0aGlzLnRyZWVPdXRsaW5lPW51bGw7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLnByZXZpb3VzU2libGluZz1udWxsO3RoaXMubmV4dFNpYmxpbmc9bnVsbDt0aGlzLl9ib3VuZE9uRm9jdXM9dGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpO3RoaXMuX2JvdW5kT25CbHVyPXRoaXMuX29uQmx1ci5iaW5kKHRoaXMpO3RoaXMuX2xpc3RJdGVtTm9kZT1jcmVhdGVFbGVtZW50KCdsaScpO3RoaXMuX3RpdGxlRWxlbWVudD10aGlzLl9saXN0SXRlbU5vZGUuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd0cmVlLWVsZW1lbnQtdGl0bGUnKTt0aGlzLl9saXN0SXRlbU5vZGUudHJlZUVsZW1lbnQ9dGhpcztpZih0aXRsZSkKdGhpcy50aXRsZT10aXRsZTt0aGlzLl9saXN0SXRlbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbGlzdEl0ZW1Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl90cmVlRWxlbWVudFRvZ2dsZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbGlzdEl0ZW1Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyx0aGlzLl9oYW5kbGVEb3VibGVDbGljay5iaW5kKHRoaXMpLGZhbHNlKTtVSS5BUklBVXRpbHMubWFya0FzVHJlZWl0ZW0odGhpcy5fbGlzdEl0ZW1Ob2RlKTt0aGlzLl9jaGlsZHJlbkxpc3ROb2RlPWNyZWF0ZUVsZW1lbnQoJ29sJyk7dGhpcy5fY2hpbGRyZW5MaXN0Tm9kZS5wYXJlbnRUcmVlRWxlbWVudD10aGlzO3RoaXMuX2NoaWxkcmVuTGlzdE5vZGUuY2xhc3NMaXN0LmFkZCgnY2hpbGRyZW4nKTtVSS5BUklBVXRpbHMubWFya0FzR3JvdXAodGhpcy5fY2hpbGRyZW5MaXN0Tm9kZSk7dGhpcy5faGlkZGVuPWZhbHNlO3RoaXMuX3NlbGVjdGFibGU9dHJ1ZTt0aGlzLmV4cGFuZGVkPWZhbHNlO3RoaXMuc2VsZWN0ZWQ9ZmFsc2U7dGhpcy5zZXRFeHBhbmRhYmxlKGV4cGFuZGFibGV8fGZhbHNlKTt0aGlzLl9jb2xsYXBzaWJsZT10cnVlO30KaGFzQW5jZXN0b3IoYW5jZXN0b3Ipe2lmKCFhbmNlc3RvcikKcmV0dXJuIGZhbHNlO2xldCBjdXJyZW50Tm9kZT10aGlzLnBhcmVudDt3aGlsZShjdXJyZW50Tm9kZSl7aWYoYW5jZXN0b3I9PT1jdXJyZW50Tm9kZSkKcmV0dXJuIHRydWU7Y3VycmVudE5vZGU9Y3VycmVudE5vZGUucGFyZW50O30KcmV0dXJuIGZhbHNlO30KaGFzQW5jZXN0b3JPclNlbGYoYW5jZXN0b3Ipe3JldHVybiB0aGlzPT09YW5jZXN0b3J8fHRoaXMuaGFzQW5jZXN0b3IoYW5jZXN0b3IpO30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW58fFtdO30KY2hpbGRDb3VudCgpe3JldHVybiB0aGlzLl9jaGlsZHJlbj90aGlzLl9jaGlsZHJlbi5sZW5ndGg6MDt9CmZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4/dGhpcy5fY2hpbGRyZW5bMF06bnVsbDt9Cmxhc3RDaGlsZCgpe3JldHVybiB0aGlzLl9jaGlsZHJlbj90aGlzLl9jaGlsZHJlblt0aGlzLl9jaGlsZHJlbi5sZW5ndGgtMV06bnVsbDt9CmNoaWxkQXQoaW5kZXgpe3JldHVybiB0aGlzLl9jaGlsZHJlbj90aGlzLl9jaGlsZHJlbltpbmRleF06bnVsbDt9CmluZGV4T2ZDaGlsZChjaGlsZCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuP3RoaXMuX2NoaWxkcmVuLmluZGV4T2YoY2hpbGQpOi0xO30KYXBwZW5kQ2hpbGQoY2hpbGQpe2lmKCF0aGlzLl9jaGlsZHJlbikKdGhpcy5fY2hpbGRyZW49W107bGV0IGluc2VydGlvbkluZGV4O2lmKHRoaXMudHJlZU91dGxpbmUmJnRoaXMudHJlZU91dGxpbmUuX2NvbXBhcmF0b3IpCmluc2VydGlvbkluZGV4PXRoaXMuX2NoaWxkcmVuLmxvd2VyQm91bmQoY2hpbGQsdGhpcy50cmVlT3V0bGluZS5fY29tcGFyYXRvcik7ZWxzZQppbnNlcnRpb25JbmRleD10aGlzLl9jaGlsZHJlbi5sZW5ndGg7dGhpcy5pbnNlcnRDaGlsZChjaGlsZCxpbnNlcnRpb25JbmRleCk7fQppbnNlcnRDaGlsZChjaGlsZCxpbmRleCl7aWYoIXRoaXMuX2NoaWxkcmVuKQp0aGlzLl9jaGlsZHJlbj1bXTtpZighY2hpbGQpCnRocm93J2NoaWxkIGNhblwndCBiZSB1bmRlZmluZWQgb3IgbnVsbCc7Y29uc29sZS5hc3NlcnQoIWNoaWxkLnBhcmVudCwnQXR0ZW1wdGluZyB0byBpbnNlcnQgYSBjaGlsZCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUsIHJlcGFyZW50aW5nIGlzIG5vdCBzdXBwb3J0ZWQuJyk7Y29uc3QgcHJldmlvdXNDaGlsZD0oaW5kZXg+MD90aGlzLl9jaGlsZHJlbltpbmRleC0xXTpudWxsKTtpZihwcmV2aW91c0NoaWxkKXtwcmV2aW91c0NoaWxkLm5leHRTaWJsaW5nPWNoaWxkO2NoaWxkLnByZXZpb3VzU2libGluZz1wcmV2aW91c0NoaWxkO31lbHNle2NoaWxkLnByZXZpb3VzU2libGluZz1udWxsO30KY29uc3QgbmV4dENoaWxkPXRoaXMuX2NoaWxkcmVuW2luZGV4XTtpZihuZXh0Q2hpbGQpe25leHRDaGlsZC5wcmV2aW91c1NpYmxpbmc9Y2hpbGQ7Y2hpbGQubmV4dFNpYmxpbmc9bmV4dENoaWxkO31lbHNle2NoaWxkLm5leHRTaWJsaW5nPW51bGw7fQp0aGlzLl9jaGlsZHJlbi5zcGxpY2UoaW5kZXgsMCxjaGlsZCk7dGhpcy5zZXRFeHBhbmRhYmxlKHRydWUpO2NoaWxkLnBhcmVudD10aGlzO2lmKHRoaXMudHJlZU91dGxpbmUpCnRoaXMudHJlZU91dGxpbmUuX2JpbmRUcmVlRWxlbWVudChjaGlsZCk7Zm9yKGxldCBjdXJyZW50PWNoaWxkLmZpcnN0Q2hpbGQoKTt0aGlzLnRyZWVPdXRsaW5lJiZjdXJyZW50O2N1cnJlbnQ9Y3VycmVudC50cmF2ZXJzZU5leHRUcmVlRWxlbWVudChmYWxzZSxjaGlsZCx0cnVlKSkKdGhpcy50cmVlT3V0bGluZS5fYmluZFRyZWVFbGVtZW50KGN1cnJlbnQpO2NoaWxkLm9uYXR0YWNoKCk7Y2hpbGQuX2Vuc3VyZVNlbGVjdGlvbigpO2lmKHRoaXMudHJlZU91dGxpbmUpCnRoaXMudHJlZU91dGxpbmUuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50QXR0YWNoZWQsY2hpbGQpO2NvbnN0IG5leHRTaWJsaW5nPWNoaWxkLm5leHRTaWJsaW5nP2NoaWxkLm5leHRTaWJsaW5nLl9saXN0SXRlbU5vZGU6bnVsbDt0aGlzLl9jaGlsZHJlbkxpc3ROb2RlLmluc2VydEJlZm9yZShjaGlsZC5fbGlzdEl0ZW1Ob2RlLG5leHRTaWJsaW5nKTt0aGlzLl9jaGlsZHJlbkxpc3ROb2RlLmluc2VydEJlZm9yZShjaGlsZC5fY2hpbGRyZW5MaXN0Tm9kZSxuZXh0U2libGluZyk7aWYoY2hpbGQuc2VsZWN0ZWQpCmNoaWxkLnNlbGVjdCgpO2lmKGNoaWxkLmV4cGFuZGVkKQpjaGlsZC5leHBhbmQoKTt9CnJlbW92ZUNoaWxkQXRJbmRleChjaGlsZEluZGV4KXtpZihjaGlsZEluZGV4PDB8fGNoaWxkSW5kZXg+PXRoaXMuX2NoaWxkcmVuLmxlbmd0aCkKdGhyb3cnY2hpbGRJbmRleCBvdXQgb2YgcmFuZ2UnO2NvbnN0IGNoaWxkPXRoaXMuX2NoaWxkcmVuW2NoaWxkSW5kZXhdO3RoaXMuX2NoaWxkcmVuLnNwbGljZShjaGlsZEluZGV4LDEpO2NvbnN0IHBhcmVudD1jaGlsZC5wYXJlbnQ7aWYodGhpcy50cmVlT3V0bGluZSYmdGhpcy50cmVlT3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50JiZ0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQuaGFzQW5jZXN0b3JPclNlbGYoY2hpbGQpKXtpZihjaGlsZC5uZXh0U2libGluZykKY2hpbGQubmV4dFNpYmxpbmcuc2VsZWN0KHRydWUpO2Vsc2UgaWYoY2hpbGQucHJldmlvdXNTaWJsaW5nKQpjaGlsZC5wcmV2aW91c1NpYmxpbmcuc2VsZWN0KHRydWUpO2Vsc2UgaWYocGFyZW50KQpwYXJlbnQuc2VsZWN0KHRydWUpO30KaWYoY2hpbGQucHJldmlvdXNTaWJsaW5nKQpjaGlsZC5wcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmc9Y2hpbGQubmV4dFNpYmxpbmc7aWYoY2hpbGQubmV4dFNpYmxpbmcpCmNoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZz1jaGlsZC5wcmV2aW91c1NpYmxpbmc7Y2hpbGQucGFyZW50PW51bGw7aWYodGhpcy50cmVlT3V0bGluZSkKdGhpcy50cmVlT3V0bGluZS5fdW5iaW5kVHJlZUVsZW1lbnQoY2hpbGQpO2ZvcihsZXQgY3VycmVudD1jaGlsZC5maXJzdENoaWxkKCk7dGhpcy50cmVlT3V0bGluZSYmY3VycmVudDtjdXJyZW50PWN1cnJlbnQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UsY2hpbGQsdHJ1ZSkpCnRoaXMudHJlZU91dGxpbmUuX3VuYmluZFRyZWVFbGVtZW50KGN1cnJlbnQpO2NoaWxkLl9kZXRhY2goKTt9CnJlbW92ZUNoaWxkKGNoaWxkKXtpZighY2hpbGQpCnRocm93J2NoaWxkIGNhblwndCBiZSB1bmRlZmluZWQgb3IgbnVsbCc7aWYoY2hpbGQucGFyZW50IT09dGhpcykKcmV0dXJuO2NvbnN0IGNoaWxkSW5kZXg9dGhpcy5fY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7aWYoY2hpbGRJbmRleD09PS0xKQp0aHJvdydjaGlsZCBub3QgZm91bmQgaW4gdGhpcyBub2RlXCdzIGNoaWxkcmVuJzt0aGlzLnJlbW92ZUNoaWxkQXRJbmRleChjaGlsZEluZGV4KTt9CnJlbW92ZUNoaWxkcmVuKCl7aWYoIXRoaXMucm9vdCYmdGhpcy50cmVlT3V0bGluZSYmdGhpcy50cmVlT3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50JiZ0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQuaGFzQW5jZXN0b3JPclNlbGYodGhpcykpCnRoaXMuc2VsZWN0KHRydWUpO2ZvcihsZXQgaT0wO3RoaXMuX2NoaWxkcmVuJiZpPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDsrK2kpe2NvbnN0IGNoaWxkPXRoaXMuX2NoaWxkcmVuW2ldO2NoaWxkLnByZXZpb3VzU2libGluZz1udWxsO2NoaWxkLm5leHRTaWJsaW5nPW51bGw7Y2hpbGQucGFyZW50PW51bGw7aWYodGhpcy50cmVlT3V0bGluZSkKdGhpcy50cmVlT3V0bGluZS5fdW5iaW5kVHJlZUVsZW1lbnQoY2hpbGQpO2ZvcihsZXQgY3VycmVudD1jaGlsZC5maXJzdENoaWxkKCk7dGhpcy50cmVlT3V0bGluZSYmY3VycmVudDtjdXJyZW50PWN1cnJlbnQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UsY2hpbGQsdHJ1ZSkpCnRoaXMudHJlZU91dGxpbmUuX3VuYmluZFRyZWVFbGVtZW50KGN1cnJlbnQpO2NoaWxkLl9kZXRhY2goKTt9CnRoaXMuX2NoaWxkcmVuPVtdO30KZ2V0IHNlbGVjdGFibGUoKXtpZih0aGlzLl9oaWRkZW4pCnJldHVybiBmYWxzZTtyZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTt9CnNldCBzZWxlY3RhYmxlKHgpe3RoaXMuX3NlbGVjdGFibGU9eDt9CmdldCBsaXN0SXRlbUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbGlzdEl0ZW1Ob2RlO30KdGl0bGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDt9CmdldCBjaGlsZHJlbkxpc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuTGlzdE5vZGU7fQpnZXQgdGl0bGUoKXtyZXR1cm4gdGhpcy5fdGl0bGU7fQpzZXQgdGl0bGUoeCl7aWYodGhpcy5fdGl0bGU9PT14KQpyZXR1cm47dGhpcy5fdGl0bGU9eDtpZih0eXBlb2YgeD09PSdzdHJpbmcnKXt0aGlzLl90aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9eDt0aGlzLnRvb2x0aXA9eDt9ZWxzZXt0aGlzLl90aXRsZUVsZW1lbnQ9eDt0aGlzLnRvb2x0aXA9Jyc7fQp0aGlzLl9saXN0SXRlbU5vZGUucmVtb3ZlQ2hpbGRyZW4oKTtpZih0aGlzLl9sZWFkaW5nSWNvbnNFbGVtZW50KQp0aGlzLl9saXN0SXRlbU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5fbGVhZGluZ0ljb25zRWxlbWVudCk7dGhpcy5fbGlzdEl0ZW1Ob2RlLmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7aWYodGhpcy5fdHJhaWxpbmdJY29uc0VsZW1lbnQpCnRoaXMuX2xpc3RJdGVtTm9kZS5hcHBlbmRDaGlsZCh0aGlzLl90cmFpbGluZ0ljb25zRWxlbWVudCk7dGhpcy5fZW5zdXJlU2VsZWN0aW9uKCk7fQp0aXRsZUFzVGV4dCgpe2lmKCF0aGlzLl90aXRsZSkKcmV0dXJuJyc7aWYodHlwZW9mIHRoaXMuX3RpdGxlPT09J3N0cmluZycpCnJldHVybiB0aGlzLl90aXRsZTtyZXR1cm4gdGhpcy5fdGl0bGUudGV4dENvbnRlbnQ7fQpzdGFydEVkaXRpbmdUaXRsZShlZGl0aW5nQ29uZmlnKXtVSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyh0aGlzLl90aXRsZUVsZW1lbnQsZWRpdGluZ0NvbmZpZyk7dGhpcy50cmVlT3V0bGluZS5fc2hhZG93Um9vdC5nZXRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbih0aGlzLl90aXRsZUVsZW1lbnQpO30Kc2V0TGVhZGluZ0ljb25zKGljb25zKXtpZighdGhpcy5fbGVhZGluZ0ljb25zRWxlbWVudCYmIWljb25zLmxlbmd0aCkKcmV0dXJuO2lmKCF0aGlzLl9sZWFkaW5nSWNvbnNFbGVtZW50KXt0aGlzLl9sZWFkaW5nSWNvbnNFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2xlYWRpbmctaWNvbnMnKTt0aGlzLl9sZWFkaW5nSWNvbnNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ljb25zLWNvbnRhaW5lcicpO3RoaXMuX2xpc3RJdGVtTm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fbGVhZGluZ0ljb25zRWxlbWVudCx0aGlzLl90aXRsZUVsZW1lbnQpO3RoaXMuX2Vuc3VyZVNlbGVjdGlvbigpO30KdGhpcy5fbGVhZGluZ0ljb25zRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2Zvcihjb25zdCBpY29uIG9mIGljb25zKQp0aGlzLl9sZWFkaW5nSWNvbnNFbGVtZW50LmFwcGVuZENoaWxkKGljb24pO30Kc2V0VHJhaWxpbmdJY29ucyhpY29ucyl7aWYoIXRoaXMuX3RyYWlsaW5nSWNvbnNFbGVtZW50JiYhaWNvbnMubGVuZ3RoKQpyZXR1cm47aWYoIXRoaXMuX3RyYWlsaW5nSWNvbnNFbGVtZW50KXt0aGlzLl90cmFpbGluZ0ljb25zRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0cmFpbGluZy1pY29ucycpO3RoaXMuX3RyYWlsaW5nSWNvbnNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ljb25zLWNvbnRhaW5lcicpO3RoaXMuX2xpc3RJdGVtTm9kZS5hcHBlbmRDaGlsZCh0aGlzLl90cmFpbGluZ0ljb25zRWxlbWVudCk7dGhpcy5fZW5zdXJlU2VsZWN0aW9uKCk7fQp0aGlzLl90cmFpbGluZ0ljb25zRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2Zvcihjb25zdCBpY29uIG9mIGljb25zKQp0aGlzLl90cmFpbGluZ0ljb25zRWxlbWVudC5hcHBlbmRDaGlsZChpY29uKTt9CmdldCB0b29sdGlwKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXB8fCcnO30Kc2V0IHRvb2x0aXAoeCl7aWYodGhpcy5fdG9vbHRpcD09PXgpCnJldHVybjt0aGlzLl90b29sdGlwPXg7dGhpcy5fbGlzdEl0ZW1Ob2RlLnRpdGxlPXg7fQppc0V4cGFuZGFibGUoKXtyZXR1cm4gdGhpcy5fZXhwYW5kYWJsZTt9CnNldEV4cGFuZGFibGUoZXhwYW5kYWJsZSl7aWYodGhpcy5fZXhwYW5kYWJsZT09PWV4cGFuZGFibGUpCnJldHVybjt0aGlzLl9leHBhbmRhYmxlPWV4cGFuZGFibGU7dGhpcy5fbGlzdEl0ZW1Ob2RlLmNsYXNzTGlzdC50b2dnbGUoJ3BhcmVudCcsZXhwYW5kYWJsZSk7aWYoIWV4cGFuZGFibGUpe3RoaXMuY29sbGFwc2UoKTtVSS5BUklBVXRpbHMudW5zZXRFeHBhbmRlZCh0aGlzLl9saXN0SXRlbU5vZGUpO31lbHNle1VJLkFSSUFVdGlscy5zZXRFeHBhbmRlZCh0aGlzLl9saXN0SXRlbU5vZGUsZmFsc2UpO319CnNldENvbGxhcHNpYmxlKGNvbGxhcHNpYmxlKXtpZih0aGlzLl9jb2xsYXBzaWJsZT09PWNvbGxhcHNpYmxlKQpyZXR1cm47dGhpcy5fY29sbGFwc2libGU9Y29sbGFwc2libGU7dGhpcy5fbGlzdEl0ZW1Ob2RlLmNsYXNzTGlzdC50b2dnbGUoJ2Fsd2F5cy1wYXJlbnQnLCFjb2xsYXBzaWJsZSk7aWYoIWNvbGxhcHNpYmxlKQp0aGlzLmV4cGFuZCgpO30KZ2V0IGhpZGRlbigpe3JldHVybiB0aGlzLl9oaWRkZW47fQpzZXQgaGlkZGVuKHgpe2lmKHRoaXMuX2hpZGRlbj09PXgpCnJldHVybjt0aGlzLl9oaWRkZW49eDt0aGlzLl9saXN0SXRlbU5vZGUuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyx4KTt0aGlzLl9jaGlsZHJlbkxpc3ROb2RlLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicseCk7fQppbnZhbGlkYXRlQ2hpbGRyZW4oKXtpZih0aGlzLl9jaGlsZHJlbil7dGhpcy5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2NoaWxkcmVuPW51bGw7fX0KX2Vuc3VyZVNlbGVjdGlvbigpe2lmKCF0aGlzLnRyZWVPdXRsaW5lfHwhdGhpcy50cmVlT3V0bGluZS5fcmVuZGVyU2VsZWN0aW9uKQpyZXR1cm47aWYoIXRoaXMuX3NlbGVjdGlvbkVsZW1lbnQpCnRoaXMuX3NlbGVjdGlvbkVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnc2VsZWN0aW9uIGZpbGwnKTt0aGlzLl9saXN0SXRlbU5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuX3NlbGVjdGlvbkVsZW1lbnQsdGhpcy5saXN0SXRlbUVsZW1lbnQuZmlyc3RDaGlsZCk7fQpfdHJlZUVsZW1lbnRUb2dnbGVkKGV2ZW50KXtjb25zdCBlbGVtZW50PWV2ZW50LmN1cnJlbnRUYXJnZXQ7aWYoZWxlbWVudC50cmVlRWxlbWVudCE9PXRoaXN8fGVsZW1lbnQuaGFzU2VsZWN0aW9uKCkpCnJldHVybjtjb25zdCB0b2dnbGVPbkNsaWNrPXRoaXMudG9nZ2xlT25DbGljayYmIXRoaXMuc2VsZWN0YWJsZTtjb25zdCBpc0luVHJpYW5nbGU9dGhpcy5pc0V2ZW50V2l0aGluRGlzY2xvc3VyZVRyaWFuZ2xlKGV2ZW50KTtpZighdG9nZ2xlT25DbGljayYmIWlzSW5UcmlhbmdsZSkKcmV0dXJuO2lmKHRoaXMuZXhwYW5kZWQpe2lmKGV2ZW50LmFsdEtleSkKdGhpcy5jb2xsYXBzZVJlY3Vyc2l2ZWx5KCk7ZWxzZQp0aGlzLmNvbGxhcHNlKCk7fWVsc2V7aWYoZXZlbnQuYWx0S2V5KQp0aGlzLmV4cGFuZFJlY3Vyc2l2ZWx5KCk7ZWxzZQp0aGlzLmV4cGFuZCgpO30KZXZlbnQuY29uc3VtZSgpO30KX2hhbmRsZU1vdXNlRG93bihldmVudCl7Y29uc3QgZWxlbWVudD1ldmVudC5jdXJyZW50VGFyZ2V0O2lmKCFlbGVtZW50KQpyZXR1cm47aWYoIXRoaXMuc2VsZWN0YWJsZSkKcmV0dXJuO2lmKGVsZW1lbnQudHJlZUVsZW1lbnQhPT10aGlzKQpyZXR1cm47aWYodGhpcy5pc0V2ZW50V2l0aGluRGlzY2xvc3VyZVRyaWFuZ2xlKGV2ZW50KSkKcmV0dXJuO3RoaXMuc2VsZWN0T25Nb3VzZURvd24oZXZlbnQpO30KX2hhbmRsZURvdWJsZUNsaWNrKGV2ZW50KXtjb25zdCBlbGVtZW50PWV2ZW50LmN1cnJlbnRUYXJnZXQ7aWYoIWVsZW1lbnR8fGVsZW1lbnQudHJlZUVsZW1lbnQhPT10aGlzKQpyZXR1cm47Y29uc3QgaGFuZGxlZD10aGlzLm9uZGJsY2xpY2soZXZlbnQpO2lmKGhhbmRsZWQpCnJldHVybjtpZih0aGlzLl9leHBhbmRhYmxlJiYhdGhpcy5leHBhbmRlZCkKdGhpcy5leHBhbmQoKTt9Cl9kZXRhY2goKXt0aGlzLl9saXN0SXRlbU5vZGUucmVtb3ZlKCk7dGhpcy5fY2hpbGRyZW5MaXN0Tm9kZS5yZW1vdmUoKTt9CmNvbGxhcHNlKCl7aWYoIXRoaXMuZXhwYW5kZWR8fCF0aGlzLl9jb2xsYXBzaWJsZSkKcmV0dXJuO3RoaXMuX2xpc3RJdGVtTm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO3RoaXMuX2NoaWxkcmVuTGlzdE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTtVSS5BUklBVXRpbHMuc2V0RXhwYW5kZWQodGhpcy5fbGlzdEl0ZW1Ob2RlLGZhbHNlKTt0aGlzLmV4cGFuZGVkPWZhbHNlO3RoaXMub25jb2xsYXBzZSgpO2lmKHRoaXMudHJlZU91dGxpbmUpCnRoaXMudHJlZU91dGxpbmUuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50Q29sbGFwc2VkLHRoaXMpO30KY29sbGFwc2VSZWN1cnNpdmVseSgpe2xldCBpdGVtPXRoaXM7d2hpbGUoaXRlbSl7aWYoaXRlbS5leHBhbmRlZCkKaXRlbS5jb2xsYXBzZSgpO2l0ZW09aXRlbS50cmF2ZXJzZU5leHRUcmVlRWxlbWVudChmYWxzZSx0aGlzLHRydWUpO319CmNvbGxhcHNlQ2hpbGRyZW4oKXtpZighdGhpcy5fY2hpbGRyZW4pCnJldHVybjtmb3IoY29uc3QgY2hpbGQgb2YgdGhpcy5fY2hpbGRyZW4pCmNoaWxkLmNvbGxhcHNlUmVjdXJzaXZlbHkoKTt9CmV4cGFuZCgpe2lmKCF0aGlzLl9leHBhbmRhYmxlfHwodGhpcy5leHBhbmRlZCYmdGhpcy5fY2hpbGRyZW4pKQpyZXR1cm47dGhpcy5leHBhbmRlZD10cnVlO3RoaXMuX3BvcHVsYXRlSWZOZWVkZWQoKTt0aGlzLl9saXN0SXRlbU5vZGUuY2xhc3NMaXN0LmFkZCgnZXhwYW5kZWQnKTt0aGlzLl9jaGlsZHJlbkxpc3ROb2RlLmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7VUkuQVJJQVV0aWxzLnNldEV4cGFuZGVkKHRoaXMuX2xpc3RJdGVtTm9kZSx0cnVlKTtpZih0aGlzLnRyZWVPdXRsaW5lKXt0aGlzLm9uZXhwYW5kKCk7dGhpcy50cmVlT3V0bGluZS5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRFeHBhbmRlZCx0aGlzKTt9fQpleHBhbmRSZWN1cnNpdmVseShtYXhEZXB0aCl7bGV0IGl0ZW09dGhpcztjb25zdCBpbmZvPXt9O2xldCBkZXB0aD0wO2lmKGlzTmFOKG1heERlcHRoKSkKbWF4RGVwdGg9Mzt3aGlsZShpdGVtKXtpZihkZXB0aDxtYXhEZXB0aCkKaXRlbS5leHBhbmQoKTtpdGVtPWl0ZW0udHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UsdGhpcywoZGVwdGg+PW1heERlcHRoKSxpbmZvKTtkZXB0aCs9aW5mby5kZXB0aENoYW5nZTt9fQpjb2xsYXBzZU9yQXNjZW5kKGFsdEtleSl7aWYodGhpcy5leHBhbmRlZCl7aWYoYWx0S2V5KQp0aGlzLmNvbGxhcHNlUmVjdXJzaXZlbHkoKTtlbHNlCnRoaXMuY29sbGFwc2UoKTtyZXR1cm4gdHJ1ZTt9CmlmKCF0aGlzLnBhcmVudHx8dGhpcy5wYXJlbnQucm9vdCkKcmV0dXJuIGZhbHNlO2lmKCF0aGlzLnBhcmVudC5zZWxlY3RhYmxlKXt0aGlzLnBhcmVudC5jb2xsYXBzZSgpO3JldHVybiB0cnVlO30KbGV0IG5leHRTZWxlY3RlZEVsZW1lbnQ9dGhpcy5wYXJlbnQ7d2hpbGUobmV4dFNlbGVjdGVkRWxlbWVudCYmIW5leHRTZWxlY3RlZEVsZW1lbnQuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkRWxlbWVudD1uZXh0U2VsZWN0ZWRFbGVtZW50LnBhcmVudDtpZighbmV4dFNlbGVjdGVkRWxlbWVudCkKcmV0dXJuIGZhbHNlO25leHRTZWxlY3RlZEVsZW1lbnQuc2VsZWN0KGZhbHNlLHRydWUpO3JldHVybiB0cnVlO30KZGVzY2VuZE9yRXhwYW5kKGFsdEtleSl7aWYoIXRoaXMuX2V4cGFuZGFibGUpCnJldHVybiBmYWxzZTtpZighdGhpcy5leHBhbmRlZCl7aWYoYWx0S2V5KQp0aGlzLmV4cGFuZFJlY3Vyc2l2ZWx5KCk7ZWxzZQp0aGlzLmV4cGFuZCgpO3JldHVybiB0cnVlO30KbGV0IG5leHRTZWxlY3RlZEVsZW1lbnQ9dGhpcy5maXJzdENoaWxkKCk7d2hpbGUobmV4dFNlbGVjdGVkRWxlbWVudCYmIW5leHRTZWxlY3RlZEVsZW1lbnQuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkRWxlbWVudD1uZXh0U2VsZWN0ZWRFbGVtZW50Lm5leHRTaWJsaW5nO2lmKCFuZXh0U2VsZWN0ZWRFbGVtZW50KQpyZXR1cm4gZmFsc2U7bmV4dFNlbGVjdGVkRWxlbWVudC5zZWxlY3QoZmFsc2UsdHJ1ZSk7cmV0dXJuIHRydWU7fQpyZXZlYWwoY2VudGVyKXtsZXQgY3VycmVudEFuY2VzdG9yPXRoaXMucGFyZW50O3doaWxlKGN1cnJlbnRBbmNlc3RvciYmIWN1cnJlbnRBbmNlc3Rvci5yb290KXtpZighY3VycmVudEFuY2VzdG9yLmV4cGFuZGVkKQpjdXJyZW50QW5jZXN0b3IuZXhwYW5kKCk7Y3VycmVudEFuY2VzdG9yPWN1cnJlbnRBbmNlc3Rvci5wYXJlbnQ7fQp0aGlzLnRyZWVPdXRsaW5lLl9kZWZlcnJlZFNjcm9sbEludG9WaWV3KHRoaXMsISFjZW50ZXIpO30KcmV2ZWFsZWQoKXtsZXQgY3VycmVudEFuY2VzdG9yPXRoaXMucGFyZW50O3doaWxlKGN1cnJlbnRBbmNlc3RvciYmIWN1cnJlbnRBbmNlc3Rvci5yb290KXtpZighY3VycmVudEFuY2VzdG9yLmV4cGFuZGVkKQpyZXR1cm4gZmFsc2U7Y3VycmVudEFuY2VzdG9yPWN1cnJlbnRBbmNlc3Rvci5wYXJlbnQ7fQpyZXR1cm4gdHJ1ZTt9CnNlbGVjdE9uTW91c2VEb3duKGV2ZW50KXtpZih0aGlzLnNlbGVjdChmYWxzZSx0cnVlKSkKZXZlbnQuY29uc3VtZSh0cnVlKTtpZih0aGlzLl9saXN0SXRlbU5vZGUuZHJhZ2dhYmxlJiZ0aGlzLl9zZWxlY3Rpb25FbGVtZW50KXtjb25zdCBtYXJnaW5MZWZ0PXRoaXMudHJlZU91dGxpbmUuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LXRoaXMuX2xpc3RJdGVtTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O3RoaXMuX3NlbGVjdGlvbkVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi1sZWZ0JyxtYXJnaW5MZWZ0KydweCcpO319CnNlbGVjdChvbWl0Rm9jdXMsc2VsZWN0ZWRCeVVzZXIpe2lmKCF0aGlzLnRyZWVPdXRsaW5lfHwhdGhpcy5zZWxlY3RhYmxlfHx0aGlzLnNlbGVjdGVkKQpyZXR1cm4gZmFsc2U7Y29uc3QgbGFzdFNlbGVjdGVkPXRoaXMudHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudDt0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQ9bnVsbDtpZih0aGlzLnRyZWVPdXRsaW5lLl9yb290RWxlbWVudD09PXRoaXMpe2lmKGxhc3RTZWxlY3RlZCkKbGFzdFNlbGVjdGVkLmRlc2VsZWN0KCk7cmV0dXJuIGZhbHNlO30KdGhpcy5zZWxlY3RlZD10cnVlO3RoaXMudHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudD10aGlzO2lmKHRoaXMudHJlZU91dGxpbmUuX2ZvY3VzYWJsZSkKdGhpcy5fc2V0Rm9jdXNhYmxlKHRydWUpO2lmKCFvbWl0Rm9jdXN8fHRoaXMudHJlZU91dGxpbmUuY29udGVudEVsZW1lbnQuaGFzRm9jdXMoKSkKdGhpcy5saXN0SXRlbUVsZW1lbnQuZm9jdXMoKTt0aGlzLl9saXN0SXRlbU5vZGUuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTt0aGlzLnRyZWVPdXRsaW5lLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5UcmVlT3V0bGluZS5FdmVudHMuRWxlbWVudFNlbGVjdGVkLHRoaXMpO2lmKGxhc3RTZWxlY3RlZCkKbGFzdFNlbGVjdGVkLmRlc2VsZWN0KCk7cmV0dXJuIHRoaXMub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO30KX3NldEZvY3VzYWJsZShmb2N1c2FibGUpe2lmKGZvY3VzYWJsZSl7dGhpcy5fbGlzdEl0ZW1Ob2RlLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLDApO3RoaXMuX2xpc3RJdGVtTm9kZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsdGhpcy5fYm91bmRPbkZvY3VzLGZhbHNlKTt0aGlzLl9saXN0SXRlbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsdGhpcy5fYm91bmRPbkJsdXIsZmFsc2UpO31lbHNle3RoaXMuX2xpc3RJdGVtTm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7dGhpcy5fbGlzdEl0ZW1Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyx0aGlzLl9ib3VuZE9uRm9jdXMsZmFsc2UpO3RoaXMuX2xpc3RJdGVtTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLl9ib3VuZE9uQmx1cixmYWxzZSk7fX0KX29uRm9jdXMoKXt0aGlzLl9saXN0SXRlbU5vZGUuY2xhc3NMaXN0LmFkZCgnZm9yY2Utd2hpdGUtaWNvbnMnKTt9Cl9vbkJsdXIoKXt0aGlzLl9saXN0SXRlbU5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnZm9yY2Utd2hpdGUtaWNvbnMnKTt9CnJldmVhbEFuZFNlbGVjdChvbWl0Rm9jdXMpe3RoaXMucmV2ZWFsKHRydWUpO3RoaXMuc2VsZWN0KG9taXRGb2N1cyk7fQpkZXNlbGVjdCgpe2NvbnN0IGhhZEZvY3VzPXRoaXMuX2xpc3RJdGVtTm9kZS5oYXNGb2N1cygpO3RoaXMuc2VsZWN0ZWQ9ZmFsc2U7dGhpcy5fbGlzdEl0ZW1Ob2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7dGhpcy5fc2V0Rm9jdXNhYmxlKGZhbHNlKTtpZih0aGlzLnRyZWVPdXRsaW5lJiZ0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQ9PT10aGlzKXt0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQ9bnVsbDtpZihoYWRGb2N1cykKdGhpcy50cmVlT3V0bGluZS5mb2N1cygpO319Cl9wb3B1bGF0ZUlmTmVlZGVkKCl7aWYodGhpcy50cmVlT3V0bGluZSYmdGhpcy5fZXhwYW5kYWJsZSYmIXRoaXMuX2NoaWxkcmVuKXt0aGlzLl9jaGlsZHJlbj1bXTt0aGlzLm9ucG9wdWxhdGUoKTt9fQpvbnBvcHVsYXRlKCl7fQpvbmVudGVyKCl7cmV0dXJuIGZhbHNlO30Kb25kZWxldGUoKXtyZXR1cm4gZmFsc2U7fQpvbnNwYWNlKCl7cmV0dXJuIGZhbHNlO30Kb25iaW5kKCl7fQpvbnVuYmluZCgpe30Kb25hdHRhY2goKXt9Cm9uZXhwYW5kKCl7fQpvbmNvbGxhcHNlKCl7fQpvbmRibGNsaWNrKGUpe3JldHVybiBmYWxzZTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtyZXR1cm4gZmFsc2U7fQp0cmF2ZXJzZU5leHRUcmVlRWxlbWVudChza2lwVW5yZXZlYWxlZCxzdGF5V2l0aGluLGRvbnRQb3B1bGF0ZSxpbmZvKXtpZighZG9udFBvcHVsYXRlKQp0aGlzLl9wb3B1bGF0ZUlmTmVlZGVkKCk7aWYoaW5mbykKaW5mby5kZXB0aENoYW5nZT0wO2xldCBlbGVtZW50PXNraXBVbnJldmVhbGVkPyh0aGlzLnJldmVhbGVkKCk/dGhpcy5maXJzdENoaWxkKCk6bnVsbCk6dGhpcy5maXJzdENoaWxkKCk7aWYoZWxlbWVudCYmKCFza2lwVW5yZXZlYWxlZHx8KHNraXBVbnJldmVhbGVkJiZ0aGlzLmV4cGFuZGVkKSkpe2lmKGluZm8pCmluZm8uZGVwdGhDaGFuZ2U9MTtyZXR1cm4gZWxlbWVudDt9CmlmKHRoaXM9PT1zdGF5V2l0aGluKQpyZXR1cm4gbnVsbDtlbGVtZW50PXNraXBVbnJldmVhbGVkPyh0aGlzLnJldmVhbGVkKCk/dGhpcy5uZXh0U2libGluZzpudWxsKTp0aGlzLm5leHRTaWJsaW5nO2lmKGVsZW1lbnQpCnJldHVybiBlbGVtZW50O2VsZW1lbnQ9dGhpczt3aGlsZShlbGVtZW50JiYhZWxlbWVudC5yb290JiYhKHNraXBVbnJldmVhbGVkPyhlbGVtZW50LnJldmVhbGVkKCk/ZWxlbWVudC5uZXh0U2libGluZzpudWxsKTplbGVtZW50Lm5leHRTaWJsaW5nKSYmZWxlbWVudC5wYXJlbnQhPT1zdGF5V2l0aGluKXtpZihpbmZvKQppbmZvLmRlcHRoQ2hhbmdlLT0xO2VsZW1lbnQ9ZWxlbWVudC5wYXJlbnQ7fQppZighZWxlbWVudHx8ZWxlbWVudC5yb290KQpyZXR1cm4gbnVsbDtyZXR1cm4oc2tpcFVucmV2ZWFsZWQ/KGVsZW1lbnQucmV2ZWFsZWQoKT9lbGVtZW50Lm5leHRTaWJsaW5nOm51bGwpOmVsZW1lbnQubmV4dFNpYmxpbmcpO30KdHJhdmVyc2VQcmV2aW91c1RyZWVFbGVtZW50KHNraXBVbnJldmVhbGVkLGRvbnRQb3B1bGF0ZSl7bGV0IGVsZW1lbnQ9c2tpcFVucmV2ZWFsZWQ/KHRoaXMucmV2ZWFsZWQoKT90aGlzLnByZXZpb3VzU2libGluZzpudWxsKTp0aGlzLnByZXZpb3VzU2libGluZztpZighZG9udFBvcHVsYXRlJiZlbGVtZW50KQplbGVtZW50Ll9wb3B1bGF0ZUlmTmVlZGVkKCk7d2hpbGUoZWxlbWVudCYmKHNraXBVbnJldmVhbGVkPyhlbGVtZW50LnJldmVhbGVkKCkmJmVsZW1lbnQuZXhwYW5kZWQ/ZWxlbWVudC5sYXN0Q2hpbGQoKTpudWxsKTplbGVtZW50Lmxhc3RDaGlsZCgpKSl7aWYoIWRvbnRQb3B1bGF0ZSkKZWxlbWVudC5fcG9wdWxhdGVJZk5lZWRlZCgpO2VsZW1lbnQ9KHNraXBVbnJldmVhbGVkPyhlbGVtZW50LnJldmVhbGVkKCkmJmVsZW1lbnQuZXhwYW5kZWQ/ZWxlbWVudC5sYXN0Q2hpbGQoKTpudWxsKTplbGVtZW50Lmxhc3RDaGlsZCgpKTt9CmlmKGVsZW1lbnQpCnJldHVybiBlbGVtZW50O2lmKCF0aGlzLnBhcmVudHx8dGhpcy5wYXJlbnQucm9vdCkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMucGFyZW50O30KaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCl7Y29uc3QgcGFkZGluZ0xlZnRWYWx1ZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9saXN0SXRlbU5vZGUpLnBhZGRpbmdMZWZ0O2NvbnNvbGUuYXNzZXJ0KHBhZGRpbmdMZWZ0VmFsdWUuZW5kc1dpdGgoJ3B4JykpO2NvbnN0IGNvbXB1dGVkTGVmdFBhZGRpbmc9cGFyc2VGbG9hdChwYWRkaW5nTGVmdFZhbHVlKTtjb25zdCBsZWZ0PXRoaXMuX2xpc3RJdGVtTm9kZS50b3RhbE9mZnNldExlZnQoKStjb21wdXRlZExlZnRQYWRkaW5nO3JldHVybiBldmVudC5wYWdlWD49bGVmdCYmZXZlbnQucGFnZVg8PWxlZnQrVUkuVHJlZUVsZW1lbnQuX0Fycm93VG9nZ2xlV2lkdGgmJnRoaXMuX2V4cGFuZGFibGU7fX07VUkuVHJlZUVsZW1lbnQuX0Fycm93VG9nZ2xlV2lkdGg9MTA7KGZ1bmN0aW9uKCl7Y29uc3QgaW1nPW5ldyBJbWFnZSgpO2lmKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjEpCmltZy5zcmM9J0ltYWdlcy90cmVlb3V0bGluZVRyaWFuZ2xlc18yeC5wbmcnO2Vsc2UKaW1nLnNyYz0nSW1hZ2VzL3RyZWVvdXRsaW5lVHJpYW5nbGVzLnBuZyc7VUkuVHJlZUVsZW1lbnQuX2ltYWdlUHJlbG9hZD1pbWc7fSkoKTs7VUkuSW5zcGVjdG9yVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO1VJLkdsYXNzUGFuZS5zZXRDb250YWluZXIodGhpcy5lbGVtZW50KTt0aGlzLnNldE1pbmltdW1TaXplKDI0MCw3Mik7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KGZhbHNlLHRydWUsJ0luc3BlY3Rvci5kcmF3ZXJTcGxpdFZpZXdTdGF0ZScsMjAwLDIwMCk7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuaGlkZVNpZGViYXIoKTt0aGlzLl9kcmF3ZXJTcGxpdFdpZGdldC5oaWRlRGVmYXVsdFJlc2l6ZXIoKTt0aGlzLl9kcmF3ZXJTcGxpdFdpZGdldC5lbmFibGVTaG93TW9kZVNhdmluZygpO3RoaXMuX2RyYXdlclNwbGl0V2lkZ2V0LnNob3codGhpcy5lbGVtZW50KTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgnc3BsaXRJbkRyYXdlcicpKXt0aGlzLl9pbm5lckRyYXdlclNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLHRydWUsJ0luc3BlY3Rvci5kcmF3ZXJTaWRlYmFyU3BsaXRWaWV3U3RhdGUnLDIwMCwyMDApO3RoaXMuX2RyYXdlclNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQodGhpcy5faW5uZXJEcmF3ZXJTcGxpdFdpZGdldCk7dGhpcy5fZHJhd2VyU2lkZWJhclRhYmJlZExvY2F0aW9uPVVJLnZpZXdNYW5hZ2VyLmNyZWF0ZVRhYmJlZExvY2F0aW9uKHRoaXMuX3Nob3dEcmF3ZXIuYmluZCh0aGlzLGZhbHNlKSwnZHJhd2VyLXNpZGViYXInLHRydWUsdHJ1ZSk7dGhpcy5fZHJhd2VyU2lkZWJhclRhYmJlZFBhbmU9dGhpcy5fZHJhd2VyU2lkZWJhclRhYmJlZExvY2F0aW9uLnRhYmJlZFBhbmUoKTt0aGlzLl9kcmF3ZXJTaWRlYmFyVGFiYmVkUGFuZS5hZGRFdmVudExpc3RlbmVyKFVJLlRhYmJlZFBhbmUuRXZlbnRzLlRhYlNlbGVjdGVkLHRoaXMuX2RyYXdlclRhYlNlbGVjdGVkLHRoaXMpO3RoaXMuX2lubmVyRHJhd2VyU3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9kcmF3ZXJTaWRlYmFyVGFiYmVkUGFuZSk7fQp0aGlzLl9kcmF3ZXJUYWJiZWRMb2NhdGlvbj1VSS52aWV3TWFuYWdlci5jcmVhdGVUYWJiZWRMb2NhdGlvbih0aGlzLl9zaG93RHJhd2VyLmJpbmQodGhpcyxmYWxzZSksJ2RyYXdlci12aWV3Jyx0cnVlLHRydWUpO3RoaXMuX2RyYXdlclRhYmJlZExvY2F0aW9uLmVuYWJsZU1vcmVUYWJzQnV0dG9uKCk7dGhpcy5fZHJhd2VyVGFiYmVkUGFuZT10aGlzLl9kcmF3ZXJUYWJiZWRMb2NhdGlvbi50YWJiZWRQYW5lKCk7dGhpcy5fZHJhd2VyVGFiYmVkUGFuZS5zZXRNaW5pbXVtU2l6ZSgwLDI3KTtjb25zdCBjbG9zZURyYXdlckJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0Nsb3NlIGRyYXdlcicpLCdsYXJnZWljb24tZGVsZXRlJyk7Y2xvc2VEcmF3ZXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9jbG9zZURyYXdlcix0aGlzKTt0aGlzLl9kcmF3ZXJTcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcih0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lLmhlYWRlckVsZW1lbnQoKSk7dGhpcy5fZHJhd2VyVGFiYmVkUGFuZS5hZGRFdmVudExpc3RlbmVyKFVJLlRhYmJlZFBhbmUuRXZlbnRzLlRhYlNlbGVjdGVkLHRoaXMuX2RyYXdlclRhYlNlbGVjdGVkLHRoaXMpO2lmKHRoaXMuX2RyYXdlclNpZGViYXJUYWJiZWRQYW5lKXt0aGlzLl9pbm5lckRyYXdlclNwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fZHJhd2VyVGFiYmVkUGFuZSk7dGhpcy5fZHJhd2VyU2lkZWJhclRhYmJlZFBhbmUucmlnaHRUb29sYmFyKCkuYXBwZW5kVG9vbGJhckl0ZW0oY2xvc2VEcmF3ZXJCdXR0b24pO3RoaXMuX2RyYXdlclNwbGl0V2lkZ2V0Lmluc3RhbGxSZXNpemVyKHRoaXMuX2RyYXdlclNpZGViYXJUYWJiZWRQYW5lLmhlYWRlckVsZW1lbnQoKSk7fWVsc2V7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lKTt0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lLnJpZ2h0VG9vbGJhcigpLmFwcGVuZFRvb2xiYXJJdGVtKGNsb3NlRHJhd2VyQnV0dG9uKTt9CnRoaXMuX3RhYmJlZExvY2F0aW9uPVVJLnZpZXdNYW5hZ2VyLmNyZWF0ZVRhYmJlZExvY2F0aW9uKEluc3BlY3RvckZyb250ZW5kSG9zdC5icmluZ1RvRnJvbnQuYmluZChJbnNwZWN0b3JGcm9udGVuZEhvc3QpLCdwYW5lbCcsdHJ1ZSx0cnVlLFJ1bnRpbWUucXVlcnlQYXJhbSgncGFuZWwnKSk7dGhpcy5fdGFiYmVkUGFuZT10aGlzLl90YWJiZWRMb2NhdGlvbi50YWJiZWRQYW5lKCk7dGhpcy5fdGFiYmVkUGFuZS5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9pbnNwZWN0b3JWaWV3VGFiYmVkUGFuZS5jc3MnKTt0aGlzLl90YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiU2VsZWN0ZWQsdGhpcy5fdGFiU2VsZWN0ZWQsdGhpcyk7dGhpcy5fdGFiYmVkUGFuZS5zZXRBY2Nlc3NpYmxlTmFtZShDb21tb24uVUlTdHJpbmcoJ1BhbmVscycpKTtpZihIb3N0LmlzVW5kZXJUZXN0KCkpCnRoaXMuX3RhYmJlZFBhbmUuc2V0QXV0b1NlbGVjdEZpcnN0SXRlbU9uU2hvdyhmYWxzZSk7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuc2V0TWFpbldpZGdldCh0aGlzLl90YWJiZWRQYW5lKTt0aGlzLl9rZXlEb3duQm91bmQ9dGhpcy5fa2V5RG93bi5iaW5kKHRoaXMpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLlNob3dQYW5lbCxzaG93UGFuZWwuYmluZCh0aGlzKSk7ZnVuY3Rpb24gc2hvd1BhbmVsKGV2ZW50KXtjb25zdCBwYW5lbE5hbWU9KGV2ZW50LmRhdGEpO3RoaXMuc2hvd1BhbmVsKHBhbmVsTmFtZSk7fX0Kc3RhdGljIGluc3RhbmNlKCl7cmV0dXJuKHNlbGYucnVudGltZS5zaGFyZWRJbnN0YW5jZShVSS5JbnNwZWN0b3JWaWV3KSk7fQp3YXNTaG93bigpe3RoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2tleURvd25Cb3VuZCxmYWxzZSk7fQp3aWxsSGlkZSgpe3RoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2tleURvd25Cb3VuZCxmYWxzZSk7fQpyZXNvbHZlTG9jYXRpb24obG9jYXRpb25OYW1lKXtpZihsb2NhdGlvbk5hbWU9PT0nZHJhd2VyLXZpZXcnKQpyZXR1cm4gdGhpcy5fZHJhd2VyVGFiYmVkTG9jYXRpb247aWYobG9jYXRpb25OYW1lPT09J3BhbmVsJykKcmV0dXJuIHRoaXMuX3RhYmJlZExvY2F0aW9uO2lmKGxvY2F0aW9uTmFtZT09PSdkcmF3ZXItc2lkZWJhcicpCnJldHVybiB0aGlzLl9kcmF3ZXJTaWRlYmFyVGFiYmVkTG9jYXRpb247cmV0dXJuIG51bGw7fQpjcmVhdGVUb29sYmFycygpe3RoaXMuX3RhYmJlZFBhbmUubGVmdFRvb2xiYXIoKS5hcHBlbmRMb2NhdGlvbkl0ZW1zKCdtYWluLXRvb2xiYXItbGVmdCcpO3RoaXMuX3RhYmJlZFBhbmUucmlnaHRUb29sYmFyKCkuYXBwZW5kTG9jYXRpb25JdGVtcygnbWFpbi10b29sYmFyLXJpZ2h0Jyk7fQphZGRQYW5lbCh2aWV3KXt0aGlzLl90YWJiZWRMb2NhdGlvbi5hcHBlbmRWaWV3KHZpZXcpO30KaGFzUGFuZWwocGFuZWxOYW1lKXtyZXR1cm4gdGhpcy5fdGFiYmVkUGFuZS5oYXNUYWIocGFuZWxOYW1lKTt9CnBhbmVsKHBhbmVsTmFtZSl7cmV0dXJuKFVJLnZpZXdNYW5hZ2VyLnZpZXcocGFuZWxOYW1lKS53aWRnZXQoKSk7fQpvblN1c3BlbmRTdGF0ZUNoYW5nZWQoYWxsVGFyZ2V0c1N1c3BlbmRlZCl7dGhpcy5fY3VycmVudFBhbmVsTG9ja2VkPWFsbFRhcmdldHNTdXNwZW5kZWQ7dGhpcy5fdGFiYmVkUGFuZS5zZXRDdXJyZW50VGFiTG9ja2VkKHRoaXMuX2N1cnJlbnRQYW5lbExvY2tlZCk7dGhpcy5fdGFiYmVkUGFuZS5sZWZ0VG9vbGJhcigpLnNldEVuYWJsZWQoIXRoaXMuX2N1cnJlbnRQYW5lbExvY2tlZCk7dGhpcy5fdGFiYmVkUGFuZS5yaWdodFRvb2xiYXIoKS5zZXRFbmFibGVkKCF0aGlzLl9jdXJyZW50UGFuZWxMb2NrZWQpO30KY2FuU2VsZWN0UGFuZWwocGFuZWxOYW1lKXtyZXR1cm4hdGhpcy5fY3VycmVudFBhbmVsTG9ja2VkfHx0aGlzLl90YWJiZWRQYW5lLnNlbGVjdGVkVGFiSWQ9PT1wYW5lbE5hbWU7fQpzaG93UGFuZWwocGFuZWxOYW1lKXtyZXR1cm4gVUkudmlld01hbmFnZXIuc2hvd1ZpZXcocGFuZWxOYW1lKTt9CnNldFBhbmVsSWNvbihwYW5lbE5hbWUsaWNvbil7dGhpcy5fdGFiYmVkUGFuZS5zZXRUYWJJY29uKHBhbmVsTmFtZSxpY29uKTt9CmN1cnJlbnRQYW5lbERlcHJlY2F0ZWQoKXtyZXR1cm4oVUkudmlld01hbmFnZXIubWF0ZXJpYWxpemVkV2lkZ2V0KHRoaXMuX3RhYmJlZFBhbmUuc2VsZWN0ZWRUYWJJZHx8JycpKTt9Cl9zaG93RHJhd2VyKGZvY3VzKXtpZih0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lLmlzU2hvd2luZygpKQpyZXR1cm47dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuc2hvd0JvdGgoKTtpZihmb2N1cykKdGhpcy5fZm9jdXNSZXN0b3Jlcj1uZXcgVUkuV2lkZ2V0Rm9jdXNSZXN0b3Jlcih0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lKTtlbHNlCnRoaXMuX2ZvY3VzUmVzdG9yZXI9bnVsbDt9CmRyYXdlclZpc2libGUoKXtyZXR1cm4gdGhpcy5fZHJhd2VyVGFiYmVkUGFuZS5pc1Nob3dpbmcoKTt9Cl9jbG9zZURyYXdlcigpe2lmKCF0aGlzLl9kcmF3ZXJUYWJiZWRQYW5lLmlzU2hvd2luZygpKQpyZXR1cm47aWYodGhpcy5fZm9jdXNSZXN0b3JlcikKdGhpcy5fZm9jdXNSZXN0b3Jlci5yZXN0b3JlKCk7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuaGlkZVNpZGViYXIodHJ1ZSk7fQpzZXREcmF3ZXJNaW5pbWl6ZWQobWluaW1pemVkKXt0aGlzLl9kcmF3ZXJTcGxpdFdpZGdldC5zZXRTaWRlYmFyTWluaW1pemVkKG1pbmltaXplZCk7dGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuc2V0UmVzaXphYmxlKCFtaW5pbWl6ZWQpO30KaXNEcmF3ZXJNaW5pbWl6ZWQoKXtyZXR1cm4gdGhpcy5fZHJhd2VyU3BsaXRXaWRnZXQuaXNTaWRlYmFyTWluaW1pemVkKCk7fQpjbG9zZURyYXdlclRhYihpZCx1c2VyR2VzdHVyZSl7dGhpcy5fZHJhd2VyVGFiYmVkUGFuZS5jbG9zZVRhYihpZCx1c2VyR2VzdHVyZSk7fQpfa2V5RG93bihldmVudCl7Y29uc3Qga2V5Ym9hcmRFdmVudD0oZXZlbnQpO2lmKCFVSS5LZXlib2FyZFNob3J0Y3V0LmV2ZW50SGFzQ3RybE9yTWV0YShrZXlib2FyZEV2ZW50KXx8ZXZlbnQuYWx0S2V5fHxldmVudC5zaGlmdEtleSkKcmV0dXJuO2NvbnN0IHBhbmVsU2hvcnRjdXRFbmFibGVkPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG9ydGN1dFBhbmVsU3dpdGNoJykuZ2V0KCk7aWYocGFuZWxTaG9ydGN1dEVuYWJsZWQpe2xldCBwYW5lbEluZGV4PS0xO2lmKGV2ZW50LmtleUNvZGU+MHgzMCYmZXZlbnQua2V5Q29kZTwweDNBKQpwYW5lbEluZGV4PWV2ZW50LmtleUNvZGUtMHgzMTtlbHNlIGlmKGV2ZW50LmtleUNvZGU+MHg2MCYmZXZlbnQua2V5Q29kZTwweDZBJiZrZXlib2FyZEV2ZW50LmxvY2F0aW9uPT09S2V5Ym9hcmRFdmVudC5ET01fS0VZX0xPQ0FUSU9OX05VTVBBRCkKcGFuZWxJbmRleD1ldmVudC5rZXlDb2RlLTB4NjE7aWYocGFuZWxJbmRleCE9PS0xKXtjb25zdCBwYW5lbE5hbWU9dGhpcy5fdGFiYmVkUGFuZS5hbGxUYWJzKClbcGFuZWxJbmRleF07aWYocGFuZWxOYW1lKXtpZighVUkuRGlhbG9nLmhhc0luc3RhbmNlKCkmJiF0aGlzLl9jdXJyZW50UGFuZWxMb2NrZWQpCnRoaXMuc2hvd1BhbmVsKHBhbmVsTmFtZSk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9fX0KaWYoZXZlbnQua2V5PT09J1snKXt0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFByZXZUYWIoKTtldmVudC5jb25zdW1lKHRydWUpO30KaWYoZXZlbnQua2V5PT09J10nKXt0aGlzLl90YWJiZWRQYW5lLnNlbGVjdE5leHRUYWIoKTtldmVudC5jb25zdW1lKHRydWUpO319Cm9uUmVzaXplKCl7VUkuR2xhc3NQYW5lLmNvbnRhaW5lck1vdmVkKHRoaXMuZWxlbWVudCk7fQp0b3BSZXNpemVyRWxlbWVudCgpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lLmhlYWRlckVsZW1lbnQoKTt9CnRvb2xiYXJJdGVtUmVzaXplZCgpe3RoaXMuX3RhYmJlZFBhbmUuaGVhZGVyUmVzaXplZCgpO30KX3RhYlNlbGVjdGVkKGV2ZW50KXtjb25zdCB0YWJJZD0oZXZlbnQuZGF0YVsndGFiSWQnXSk7SG9zdC51c2VyTWV0cmljcy5wYW5lbFNob3duKHRhYklkKTt9Cl9kcmF3ZXJUYWJTZWxlY3RlZChldmVudCl7Y29uc3QgdGFiSWQ9KGV2ZW50LmRhdGFbJ3RhYklkJ10pO0hvc3QudXNlck1ldHJpY3MuZHJhd2VyU2hvd24odGFiSWQpO30Kc2V0T3duZXJTcGxpdChzcGxpdFdpZGdldCl7dGhpcy5fb3duZXJTcGxpdFdpZGdldD1zcGxpdFdpZGdldDt9Cm1pbmltaXplKCl7aWYodGhpcy5fb3duZXJTcGxpdFdpZGdldCkKdGhpcy5fb3duZXJTcGxpdFdpZGdldC5zZXRTaWRlYmFyTWluaW1pemVkKHRydWUpO30KcmVzdG9yZSgpe2lmKHRoaXMuX293bmVyU3BsaXRXaWRnZXQpCnRoaXMuX293bmVyU3BsaXRXaWRnZXQuc2V0U2lkZWJhck1pbmltaXplZChmYWxzZSk7fX07VUkuaW5zcGVjdG9yVmlldztVSS5JbnNwZWN0b3JWaWV3LkRyYXdlclRvZ2dsZUFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtpZihVSS5pbnNwZWN0b3JWaWV3LmRyYXdlclZpc2libGUoKSkKVUkuaW5zcGVjdG9yVmlldy5fY2xvc2VEcmF3ZXIoKTtlbHNlClVJLmluc3BlY3RvclZpZXcuX3Nob3dEcmF3ZXIodHJ1ZSk7cmV0dXJuIHRydWU7fX07O1VJLkFjdGlvblJlZ2lzdHJ5PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fYWN0aW9uc0J5SWQ9bmV3IE1hcCgpO3RoaXMuX3JlZ2lzdGVyQWN0aW9ucygpO30KX3JlZ2lzdGVyQWN0aW9ucygpe3NlbGYucnVudGltZS5leHRlbnNpb25zKCdhY3Rpb24nKS5mb3JFYWNoKHJlZ2lzdGVyRXh0ZW5zaW9uLHRoaXMpO2Z1bmN0aW9uIHJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbil7aWYoIWV4dGVuc2lvbi5jYW5JbnN0YW50aWF0ZSgpKQpyZXR1cm47Y29uc3QgYWN0aW9uSWQ9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnYWN0aW9uSWQnXTtjb25zb2xlLmFzc2VydChhY3Rpb25JZCk7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2FjdGlvbnNCeUlkLmdldChhY3Rpb25JZCkpO2NvbnN0IGFjdGlvbj1uZXcgVUkuQWN0aW9uKGV4dGVuc2lvbik7aWYoIWFjdGlvbi5jYXRlZ29yeSgpfHxhY3Rpb24udGl0bGUoKSkKdGhpcy5fYWN0aW9uc0J5SWQuc2V0KGFjdGlvbklkLGFjdGlvbik7ZWxzZQpjb25zb2xlLmVycm9yKGBDYXRlZ29yeSBhY3Rpb25zIHJlcXVpcmUgYSB0aXRsZSBmb3IgY29tbWFuZCBtZW51OiAke2FjdGlvbklkfWApO319CmF2YWlsYWJsZUFjdGlvbnMoKXtyZXR1cm4gdGhpcy5hcHBsaWNhYmxlQWN0aW9ucyh0aGlzLl9hY3Rpb25zQnlJZC5rZXlzQXJyYXkoKSxVSS5jb250ZXh0KTt9CmFwcGxpY2FibGVBY3Rpb25zKGFjdGlvbklkcyxjb250ZXh0KXtjb25zdCBleHRlbnNpb25zPVtdO2FjdGlvbklkcy5mb3JFYWNoKGZ1bmN0aW9uKGFjdGlvbklkKXtjb25zdCBhY3Rpb249dGhpcy5fYWN0aW9uc0J5SWQuZ2V0KGFjdGlvbklkKTtpZihhY3Rpb24pCmV4dGVuc2lvbnMucHVzaChhY3Rpb24uX2V4dGVuc2lvbik7fSx0aGlzKTtyZXR1cm4gY29udGV4dC5hcHBsaWNhYmxlRXh0ZW5zaW9ucyhleHRlbnNpb25zKS52YWx1ZXNBcnJheSgpLm1hcChleHRlbnNpb25Ub0FjdGlvbi5iaW5kKHRoaXMpKTtmdW5jdGlvbiBleHRlbnNpb25Ub0FjdGlvbihleHRlbnNpb24pe3JldHVybih0aGlzLmFjdGlvbihleHRlbnNpb24uZGVzY3JpcHRvcigpWydhY3Rpb25JZCddKSk7fX0KYWN0aW9uKGFjdGlvbklkKXtyZXR1cm4gdGhpcy5fYWN0aW9uc0J5SWQuZ2V0KGFjdGlvbklkKXx8bnVsbDt9fTtVSS5BY3Rpb249Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGV4dGVuc2lvbil7c3VwZXIoKTt0aGlzLl9leHRlbnNpb249ZXh0ZW5zaW9uO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt0aGlzLl90b2dnbGVkPWZhbHNlO30KaWQoKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnYWN0aW9uSWQnXTt9CmV4ZWN1dGUoKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9uLmluc3RhbmNlKCkudGhlbihoYW5kbGVBY3Rpb24uYmluZCh0aGlzKSk7ZnVuY3Rpb24gaGFuZGxlQWN0aW9uKGFjdGlvbkRlbGVnYXRlKXtjb25zdCBhY3Rpb25JZD10aGlzLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydhY3Rpb25JZCddO2NvbnN0IGRlbGVnYXRlPShhY3Rpb25EZWxlZ2F0ZSk7cmV0dXJuIGRlbGVnYXRlLmhhbmRsZUFjdGlvbihVSS5jb250ZXh0LGFjdGlvbklkKTt9fQppY29uKCl7cmV0dXJuIHRoaXMuX2V4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2ljb25DbGFzcyddfHwnJzt9CnRvZ2dsZWRJY29uKCl7cmV0dXJuIHRoaXMuX2V4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3RvZ2dsZWRJY29uQ2xhc3MnXXx8Jyc7fQp0b2dnbGVXaXRoUmVkQ29sb3IoKXtyZXR1cm4hIXRoaXMuX2V4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3RvZ2dsZVdpdGhSZWRDb2xvciddO30Kc2V0RW5hYmxlZChlbmFibGVkKXtpZih0aGlzLl9lbmFibGVkPT09ZW5hYmxlZCkKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9ZW5hYmxlZDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5BY3Rpb24uRXZlbnRzLkVuYWJsZWQsZW5hYmxlZCk7fQplbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ7fQpjYXRlZ29yeSgpe3JldHVybiB0aGlzLl9leHRlbnNpb24uZGVzY3JpcHRvcigpWydjYXRlZ29yeSddfHwnJzt9CnRhZ3MoKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsndGFncyddfHwnJzt9CnRpdGxlKCl7bGV0IHRpdGxlPXRoaXMuX2V4dGVuc2lvbi50aXRsZSgpO2NvbnN0IG9wdGlvbnM9dGhpcy5fZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnb3B0aW9ucyddO2lmKG9wdGlvbnMpe2Zvcihjb25zdCBwYWlyIG9mIG9wdGlvbnMpe2lmKHBhaXJbJ3ZhbHVlJ10hPT10aGlzLl90b2dnbGVkKQp0aXRsZT1wYWlyWyd0aXRsZSddO319CnJldHVybiB0aXRsZTt9CnRvZ2dsZWQoKXtyZXR1cm4gdGhpcy5fdG9nZ2xlZDt9CnNldFRvZ2dsZWQodG9nZ2xlZCl7aWYodGhpcy5fdG9nZ2xlZD09PXRvZ2dsZWQpCnJldHVybjt0aGlzLl90b2dnbGVkPXRvZ2dsZWQ7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuQWN0aW9uLkV2ZW50cy5Ub2dnbGVkLHRvZ2dsZWQpO319O1VJLkFjdGlvbi5FdmVudHM9e0VuYWJsZWQ6U3ltYm9sKCdFbmFibGVkJyksVG9nZ2xlZDpTeW1ib2woJ1RvZ2dsZWQnKX07VUkuQWN0aW9uRGVsZWdhdGU9ZnVuY3Rpb24oKXt9O1VJLkFjdGlvbkRlbGVnYXRlLnByb3RvdHlwZT17aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe319O1VJLmFjdGlvblJlZ2lzdHJ5OztVSS5TaG9ydGN1dFJlZ2lzdHJ5PWNsYXNze2NvbnN0cnVjdG9yKGFjdGlvblJlZ2lzdHJ5LGRvY3VtZW50KXt0aGlzLl9hY3Rpb25SZWdpc3RyeT1hY3Rpb25SZWdpc3RyeTt0aGlzLl9kZWZhdWx0S2V5VG9BY3Rpb25zPW5ldyBNdWx0aW1hcCgpO3RoaXMuX2RlZmF1bHRBY3Rpb25Ub1Nob3J0Y3V0PW5ldyBNdWx0aW1hcCgpO3RoaXMuX3JlZ2lzdGVyQmluZGluZ3MoZG9jdW1lbnQpO30KX2FwcGxpY2FibGVBY3Rpb25zKGtleSl7cmV0dXJuIHRoaXMuX2FjdGlvblJlZ2lzdHJ5LmFwcGxpY2FibGVBY3Rpb25zKHRoaXMuX2RlZmF1bHRBY3Rpb25zRm9yS2V5KGtleSkudmFsdWVzQXJyYXkoKSxVSS5jb250ZXh0KTt9Cl9kZWZhdWx0QWN0aW9uc0ZvcktleShrZXkpe3JldHVybiB0aGlzLl9kZWZhdWx0S2V5VG9BY3Rpb25zLmdldChTdHJpbmcoa2V5KSk7fQpzaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKGFjdGlvbklkKXtyZXR1cm4gdGhpcy5fZGVmYXVsdEFjdGlvblRvU2hvcnRjdXQuZ2V0KGFjdGlvbklkKS52YWx1ZXNBcnJheSgpO30Ka2V5c0ZvckFjdGlvbnMoYWN0aW9uSWRzKXtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPTA7aTxhY3Rpb25JZHMubGVuZ3RoOysraSl7Y29uc3QgZGVzY3JpcHRvcnM9dGhpcy5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKGFjdGlvbklkc1tpXSk7Zm9yKGxldCBqPTA7ajxkZXNjcmlwdG9ycy5sZW5ndGg7KytqKQpyZXN1bHQucHVzaChkZXNjcmlwdG9yc1tqXS5rZXkpO30KcmV0dXJuIHJlc3VsdDt9CnNob3J0Y3V0VGl0bGVGb3JBY3Rpb24oYWN0aW9uSWQpe2NvbnN0IGRlc2NyaXB0b3JzPXRoaXMuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbihhY3Rpb25JZCk7aWYoZGVzY3JpcHRvcnMubGVuZ3RoKQpyZXR1cm4gZGVzY3JpcHRvcnNbMF0ubmFtZTt9CmhhbmRsZVNob3J0Y3V0KGV2ZW50KXt0aGlzLmhhbmRsZUtleShVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXlGcm9tRXZlbnQoZXZlbnQpLGV2ZW50LmtleSxldmVudCk7fQpldmVudE1hdGNoZXNBY3Rpb24oZXZlbnQsYWN0aW9uSWQpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2RlZmF1bHRBY3Rpb25Ub1Nob3J0Y3V0LmhhcyhhY3Rpb25JZCksJ1Vua25vd24gYWN0aW9uICcrYWN0aW9uSWQpO2NvbnN0IGtleT1VSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXlGcm9tRXZlbnQoZXZlbnQpO3JldHVybiB0aGlzLl9kZWZhdWx0QWN0aW9uVG9TaG9ydGN1dC5nZXQoYWN0aW9uSWQpLnZhbHVlc0FycmF5KCkuc29tZShkZXNjcmlwdG9yPT5kZXNjcmlwdG9yLmtleT09PWtleSk7fQphZGRTaG9ydGN1dExpc3RlbmVyKGVsZW1lbnQsYWN0aW9uSWQsbGlzdGVuZXIsY2FwdHVyZSl7Y29uc29sZS5hc3NlcnQodGhpcy5fZGVmYXVsdEFjdGlvblRvU2hvcnRjdXQuaGFzKGFjdGlvbklkKSwnVW5rbm93biBhY3Rpb24gJythY3Rpb25JZCk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxldmVudD0+e2lmKCF0aGlzLmV2ZW50TWF0Y2hlc0FjdGlvbigoZXZlbnQpLGFjdGlvbklkKXx8IWxpc3RlbmVyLmNhbGwobnVsbCkpCnJldHVybjtldmVudC5jb25zdW1lKHRydWUpO30sY2FwdHVyZSk7fQpoYW5kbGVLZXkoa2V5LGRvbUtleSxldmVudCl7Y29uc3Qga2V5TW9kaWZpZXJzPWtleT4+ODtjb25zdCBhY3Rpb25zPXRoaXMuX2FwcGxpY2FibGVBY3Rpb25zKGtleSk7aWYoIWFjdGlvbnMubGVuZ3RoKQpyZXR1cm47aWYoVUkuRGlhbG9nLmhhc0luc3RhbmNlKCkpe2lmKGV2ZW50JiYhaXNQb3NzaWJseUlucHV0S2V5KCkpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7cmV0dXJuO30KaWYoIWlzUG9zc2libHlJbnB1dEtleSgpKXtpZihldmVudCkKZXZlbnQuY29uc3VtZSh0cnVlKTtwcm9jZXNzTmV4dEFjdGlvbi5jYWxsKHRoaXMsZmFsc2UpO31lbHNle3RoaXMuX3BlbmRpbmdBY3Rpb25UaW1lcj1zZXRUaW1lb3V0KHByb2Nlc3NOZXh0QWN0aW9uLmJpbmQodGhpcyxmYWxzZSksMCk7fQpmdW5jdGlvbiBwcm9jZXNzTmV4dEFjdGlvbihoYW5kbGVkKXtkZWxldGUgdGhpcy5fcGVuZGluZ0FjdGlvblRpbWVyO2NvbnN0IGFjdGlvbj1hY3Rpb25zLnNoaWZ0KCk7aWYoIWFjdGlvbnx8aGFuZGxlZCkKcmV0dXJuO2FjdGlvbi5leGVjdXRlKCkudGhlbihwcm9jZXNzTmV4dEFjdGlvbi5iaW5kKHRoaXMpKTt9CmZ1bmN0aW9uIGlzUG9zc2libHlJbnB1dEtleSgpe2lmKCFldmVudHx8IVVJLmlzRWRpdGluZygpfHwvXkZcZCt8Q29udHJvbHxTaGlmdHxBbHR8TWV0YXxFc2NhcGV8V2lufFVcKzAwMUIkLy50ZXN0KGRvbUtleSkpCnJldHVybiBmYWxzZTtpZigha2V5TW9kaWZpZXJzKQpyZXR1cm4gdHJ1ZTtjb25zdCBtb2RpZmllcnM9VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnM7aWYoSG9zdC5pc01hYygpKXtpZihVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoJ3onLG1vZGlmaWVycy5NZXRhKT09PWtleSkKcmV0dXJuIHRydWU7aWYoVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCd6Jyxtb2RpZmllcnMuTWV0YXxtb2RpZmllcnMuU2hpZnQpPT09a2V5KQpyZXR1cm4gdHJ1ZTt9ZWxzZXtpZihVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoJ3onLG1vZGlmaWVycy5DdHJsKT09PWtleSkKcmV0dXJuIHRydWU7aWYoVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5KCd5Jyxtb2RpZmllcnMuQ3RybCk9PT1rZXkpCnJldHVybiB0cnVlO2lmKCFIb3N0LmlzV2luKCkmJlVJLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSgneicsbW9kaWZpZXJzLkN0cmx8bW9kaWZpZXJzLlNoaWZ0KT09PWtleSkKcmV0dXJuIHRydWU7fQppZigoa2V5TW9kaWZpZXJzJihtb2RpZmllcnMuQ3RybHxtb2RpZmllcnMuQWx0KSk9PT0obW9kaWZpZXJzLkN0cmx8bW9kaWZpZXJzLkFsdCkpCnJldHVybiBIb3N0LmlzV2luKCk7cmV0dXJuIWhhc01vZGlmaWVyKG1vZGlmaWVycy5DdHJsKSYmIWhhc01vZGlmaWVyKG1vZGlmaWVycy5BbHQpJiYhaGFzTW9kaWZpZXIobW9kaWZpZXJzLk1ldGEpO30KZnVuY3Rpb24gaGFzTW9kaWZpZXIobW9kKXtyZXR1cm4hIShrZXlNb2RpZmllcnMmbW9kKTt9fQpyZWdpc3RlclNob3J0Y3V0KGFjdGlvbklkLHNob3J0Y3V0KXtjb25zdCBkZXNjcmlwdG9yPVVJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3JGcm9tQmluZGluZ1Nob3J0Y3V0KHNob3J0Y3V0KTtpZighZGVzY3JpcHRvcikKcmV0dXJuO3RoaXMuX2RlZmF1bHRBY3Rpb25Ub1Nob3J0Y3V0LnNldChhY3Rpb25JZCxkZXNjcmlwdG9yKTt0aGlzLl9kZWZhdWx0S2V5VG9BY3Rpb25zLnNldChTdHJpbmcoZGVzY3JpcHRvci5rZXkpLGFjdGlvbklkKTt9CmRpc21pc3NQZW5kaW5nU2hvcnRjdXRBY3Rpb24oKXtpZih0aGlzLl9wZW5kaW5nQWN0aW9uVGltZXIpe2NsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nQWN0aW9uVGltZXIpO2RlbGV0ZSB0aGlzLl9wZW5kaW5nQWN0aW9uVGltZXI7fX0KX3JlZ2lzdGVyQmluZGluZ3MoZG9jdW1lbnQpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jyx0aGlzLmRpc21pc3NQZW5kaW5nU2hvcnRjdXRBY3Rpb24uYmluZCh0aGlzKSx0cnVlKTtjb25zdCBleHRlbnNpb25zPXNlbGYucnVudGltZS5leHRlbnNpb25zKCdhY3Rpb24nKTtleHRlbnNpb25zLmZvckVhY2gocmVnaXN0ZXJFeHRlbnNpb24sdGhpcyk7ZnVuY3Rpb24gcmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uKXtjb25zdCBkZXNjcmlwdG9yPWV4dGVuc2lvbi5kZXNjcmlwdG9yKCk7Y29uc3QgYmluZGluZ3M9ZGVzY3JpcHRvclsnYmluZGluZ3MnXTtmb3IobGV0IGk9MDtiaW5kaW5ncyYmaTxiaW5kaW5ncy5sZW5ndGg7KytpKXtpZighcGxhdGZvcm1NYXRjaGVzKGJpbmRpbmdzW2ldLnBsYXRmb3JtKSkKY29udGludWU7Y29uc3Qgc2hvcnRjdXRzPWJpbmRpbmdzW2ldWydzaG9ydGN1dCddLnNwbGl0KC9ccysvKTtzaG9ydGN1dHMuZm9yRWFjaCh0aGlzLnJlZ2lzdGVyU2hvcnRjdXQuYmluZCh0aGlzLGRlc2NyaXB0b3JbJ2FjdGlvbklkJ10pKTt9fQpmdW5jdGlvbiBwbGF0Zm9ybU1hdGNoZXMocGxhdGZvcm1zU3RyaW5nKXtpZighcGxhdGZvcm1zU3RyaW5nKQpyZXR1cm4gdHJ1ZTtjb25zdCBwbGF0Zm9ybXM9cGxhdGZvcm1zU3RyaW5nLnNwbGl0KCcsJyk7bGV0IGlzTWF0Y2g9ZmFsc2U7Y29uc3QgY3VycmVudFBsYXRmb3JtPUhvc3QucGxhdGZvcm0oKTtmb3IobGV0IGk9MDshaXNNYXRjaCYmaTxwbGF0Zm9ybXMubGVuZ3RoOysraSkKaXNNYXRjaD1wbGF0Zm9ybXNbaV09PT1jdXJyZW50UGxhdGZvcm07cmV0dXJuIGlzTWF0Y2g7fX19O1VJLlNob3J0Y3V0UmVnaXN0cnkuRm9yd2FyZGVkU2hvcnRjdXQ9Y2xhc3N7fTtVSS5TaG9ydGN1dFJlZ2lzdHJ5LkZvcndhcmRlZFNob3J0Y3V0Lmluc3RhbmNlPW5ldyBVSS5TaG9ydGN1dFJlZ2lzdHJ5LkZvcndhcmRlZFNob3J0Y3V0KCk7VUkuc2hvcnRjdXRSZWdpc3RyeTs7VUkuQ29udGV4dD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZsYXZvcnM9bmV3IE1hcCgpO3RoaXMuX2V2ZW50RGlzcGF0Y2hlcnM9bmV3IE1hcCgpO30Kc2V0Rmxhdm9yKGZsYXZvclR5cGUsZmxhdm9yVmFsdWUpe2NvbnN0IHZhbHVlPXRoaXMuX2ZsYXZvcnMuZ2V0KGZsYXZvclR5cGUpfHxudWxsO2lmKHZhbHVlPT09Zmxhdm9yVmFsdWUpCnJldHVybjtpZihmbGF2b3JWYWx1ZSkKdGhpcy5fZmxhdm9ycy5zZXQoZmxhdm9yVHlwZSxmbGF2b3JWYWx1ZSk7ZWxzZQp0aGlzLl9mbGF2b3JzLnJlbW92ZShmbGF2b3JUeXBlKTt0aGlzLl9kaXNwYXRjaEZsYXZvckNoYW5nZShmbGF2b3JUeXBlLGZsYXZvclZhbHVlKTt9Cl9kaXNwYXRjaEZsYXZvckNoYW5nZShmbGF2b3JUeXBlLGZsYXZvclZhbHVlKXtmb3IoY29uc3QgZXh0ZW5zaW9uIG9mIHNlbGYucnVudGltZS5leHRlbnNpb25zKFVJLkNvbnRleHRGbGF2b3JMaXN0ZW5lcikpe2lmKGV4dGVuc2lvbi5oYXNDb250ZXh0VHlwZShmbGF2b3JUeXBlKSl7ZXh0ZW5zaW9uLmluc3RhbmNlKCkudGhlbihpbnN0YW5jZT0+KGluc3RhbmNlKS5mbGF2b3JDaGFuZ2VkKGZsYXZvclZhbHVlKSk7fX0KY29uc3QgZGlzcGF0Y2hlcj10aGlzLl9ldmVudERpc3BhdGNoZXJzLmdldChmbGF2b3JUeXBlKTtpZighZGlzcGF0Y2hlcikKcmV0dXJuO2Rpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLkNvbnRleHQuRXZlbnRzLkZsYXZvckNoYW5nZWQsZmxhdm9yVmFsdWUpO30KYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoZmxhdm9yVHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXtsZXQgZGlzcGF0Y2hlcj10aGlzLl9ldmVudERpc3BhdGNoZXJzLmdldChmbGF2b3JUeXBlKTtpZighZGlzcGF0Y2hlcil7ZGlzcGF0Y2hlcj1uZXcgQ29tbW9uLk9iamVjdCgpO3RoaXMuX2V2ZW50RGlzcGF0Y2hlcnMuc2V0KGZsYXZvclR5cGUsZGlzcGF0Y2hlcik7fQpkaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIoVUkuQ29udGV4dC5FdmVudHMuRmxhdm9yQ2hhbmdlZCxsaXN0ZW5lcix0aGlzT2JqZWN0KTt9CnJlbW92ZUZsYXZvckNoYW5nZUxpc3RlbmVyKGZsYXZvclR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCl7Y29uc3QgZGlzcGF0Y2hlcj10aGlzLl9ldmVudERpc3BhdGNoZXJzLmdldChmbGF2b3JUeXBlKTtpZighZGlzcGF0Y2hlcikKcmV0dXJuO2Rpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihVSS5Db250ZXh0LkV2ZW50cy5GbGF2b3JDaGFuZ2VkLGxpc3RlbmVyLHRoaXNPYmplY3QpO2lmKCFkaXNwYXRjaGVyLmhhc0V2ZW50TGlzdGVuZXJzKFVJLkNvbnRleHQuRXZlbnRzLkZsYXZvckNoYW5nZWQpKQp0aGlzLl9ldmVudERpc3BhdGNoZXJzLnJlbW92ZShmbGF2b3JUeXBlKTt9CmZsYXZvcihmbGF2b3JUeXBlKXtyZXR1cm4gdGhpcy5fZmxhdm9ycy5nZXQoZmxhdm9yVHlwZSl8fG51bGw7fQpmbGF2b3JzKCl7cmV0dXJuIG5ldyBTZXQodGhpcy5fZmxhdm9ycy5rZXlzKCkpO30KYXBwbGljYWJsZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucyl7Y29uc3QgdGFyZ2V0RXh0ZW5zaW9uU2V0PW5ldyBTZXQoKTtjb25zdCBhdmFpbGFibGVGbGF2b3JzPXRoaXMuZmxhdm9ycygpO2V4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihleHRlbnNpb24pe2lmKHNlbGYucnVudGltZS5pc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHRUeXBlcyhleHRlbnNpb24sYXZhaWxhYmxlRmxhdm9ycykpCnRhcmdldEV4dGVuc2lvblNldC5hZGQoZXh0ZW5zaW9uKTt9KTtyZXR1cm4gdGFyZ2V0RXh0ZW5zaW9uU2V0O319O1VJLkNvbnRleHQuRXZlbnRzPXtGbGF2b3JDaGFuZ2VkOlN5bWJvbCgnRmxhdm9yQ2hhbmdlZCcpfTtVSS5Db250ZXh0Rmxhdm9yTGlzdGVuZXI9ZnVuY3Rpb24oKXt9O1VJLkNvbnRleHRGbGF2b3JMaXN0ZW5lci5wcm90b3R5cGU9e2ZsYXZvckNoYW5nZWQob2JqZWN0KXt9fTtVSS5jb250ZXh0PW5ldyBVSS5Db250ZXh0KCk7O1VJLkNvbnRleHRNZW51SXRlbT1jbGFzc3tjb25zdHJ1Y3Rvcihjb250ZXh0TWVudSx0eXBlLGxhYmVsLGRpc2FibGVkLGNoZWNrZWQpe3RoaXMuX3R5cGU9dHlwZTt0aGlzLl9sYWJlbD1sYWJlbDt0aGlzLl9kaXNhYmxlZD1kaXNhYmxlZDt0aGlzLl9jaGVja2VkPWNoZWNrZWQ7dGhpcy5fY29udGV4dE1lbnU9Y29udGV4dE1lbnU7aWYodHlwZT09PSdpdGVtJ3x8dHlwZT09PSdjaGVja2JveCcpCnRoaXMuX2lkPWNvbnRleHRNZW51P2NvbnRleHRNZW51Ll9uZXh0SWQoKTowO30KaWQoKXtyZXR1cm4gdGhpcy5faWQ7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQppc0VuYWJsZWQoKXtyZXR1cm4hdGhpcy5fZGlzYWJsZWQ7fQpzZXRFbmFibGVkKGVuYWJsZWQpe3RoaXMuX2Rpc2FibGVkPSFlbmFibGVkO30KX2J1aWxkRGVzY3JpcHRvcigpe3N3aXRjaCh0aGlzLl90eXBlKXtjYXNlJ2l0ZW0nOmNvbnN0IHJlc3VsdD17dHlwZTonaXRlbScsaWQ6dGhpcy5faWQsbGFiZWw6dGhpcy5fbGFiZWwsZW5hYmxlZDohdGhpcy5fZGlzYWJsZWR9O2lmKHRoaXMuX2N1c3RvbUVsZW1lbnQpCnJlc3VsdC5lbGVtZW50PXRoaXMuX2N1c3RvbUVsZW1lbnQ7aWYodGhpcy5fc2hvcnRjdXQpCnJlc3VsdC5zaG9ydGN1dD10aGlzLl9zaG9ydGN1dDtyZXR1cm4gcmVzdWx0O2Nhc2Unc2VwYXJhdG9yJzpyZXR1cm57dHlwZTonc2VwYXJhdG9yJ307Y2FzZSdjaGVja2JveCc6cmV0dXJue3R5cGU6J2NoZWNrYm94JyxpZDp0aGlzLl9pZCxsYWJlbDp0aGlzLl9sYWJlbCxjaGVja2VkOiEhdGhpcy5fY2hlY2tlZCxlbmFibGVkOiF0aGlzLl9kaXNhYmxlZH07fQp0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaXRlbSB0eXBlOicrdGhpcy5fdHlwZSk7fQpzZXRTaG9ydGN1dChzaG9ydGN1dCl7dGhpcy5fc2hvcnRjdXQ9c2hvcnRjdXQ7fX07VUkuQ29udGV4dE1lbnVTZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKGNvbnRleHRNZW51KXt0aGlzLl9jb250ZXh0TWVudT1jb250ZXh0TWVudTt0aGlzLl9pdGVtcz1bXTt9CmFwcGVuZEl0ZW0obGFiZWwsaGFuZGxlcixkaXNhYmxlZCl7Y29uc3QgaXRlbT1uZXcgVUkuQ29udGV4dE1lbnVJdGVtKHRoaXMuX2NvbnRleHRNZW51LCdpdGVtJyxsYWJlbCxkaXNhYmxlZCk7dGhpcy5faXRlbXMucHVzaChpdGVtKTt0aGlzLl9jb250ZXh0TWVudS5fc2V0SGFuZGxlcihpdGVtLmlkKCksaGFuZGxlcik7cmV0dXJuIGl0ZW07fQphcHBlbmRDdXN0b21JdGVtKGVsZW1lbnQpe2NvbnN0IGl0ZW09bmV3IFVJLkNvbnRleHRNZW51SXRlbSh0aGlzLl9jb250ZXh0TWVudSwnaXRlbScsJzxjdXN0b20+Jyk7aXRlbS5fY3VzdG9tRWxlbWVudD1lbGVtZW50O3RoaXMuX2l0ZW1zLnB1c2goaXRlbSk7cmV0dXJuIGl0ZW07fQphcHBlbmRBY3Rpb24oYWN0aW9uSWQsbGFiZWwpe2NvbnN0IGFjdGlvbj1VSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24oYWN0aW9uSWQpO2lmKCFhY3Rpb24pe2NvbnNvbGUuZXJyb3IoYEFjdGlvbiAke2FjdGlvbklkfSB3YXMgbm90IGRlZmluZWRgKTtyZXR1cm47fQppZighbGFiZWwpCmxhYmVsPWFjdGlvbi50aXRsZSgpO2NvbnN0IHJlc3VsdD10aGlzLmFwcGVuZEl0ZW0obGFiZWwsYWN0aW9uLmV4ZWN1dGUuYmluZChhY3Rpb24pKTtjb25zdCBzaG9ydGN1dD1VSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0VGl0bGVGb3JBY3Rpb24oYWN0aW9uSWQpO2lmKHNob3J0Y3V0KQpyZXN1bHQuc2V0U2hvcnRjdXQoc2hvcnRjdXQpO30KYXBwZW5kU3ViTWVudUl0ZW0obGFiZWwsZGlzYWJsZWQpe2NvbnN0IGl0ZW09bmV3IFVJLkNvbnRleHRTdWJNZW51KHRoaXMuX2NvbnRleHRNZW51LGxhYmVsLGRpc2FibGVkKTtpdGVtLl9pbml0KCk7dGhpcy5faXRlbXMucHVzaChpdGVtKTtyZXR1cm4gaXRlbTt9CmFwcGVuZENoZWNrYm94SXRlbShsYWJlbCxoYW5kbGVyLGNoZWNrZWQsZGlzYWJsZWQpe2NvbnN0IGl0ZW09bmV3IFVJLkNvbnRleHRNZW51SXRlbSh0aGlzLl9jb250ZXh0TWVudSwnY2hlY2tib3gnLGxhYmVsLGRpc2FibGVkLGNoZWNrZWQpO3RoaXMuX2l0ZW1zLnB1c2goaXRlbSk7dGhpcy5fY29udGV4dE1lbnUuX3NldEhhbmRsZXIoaXRlbS5pZCgpLGhhbmRsZXIpO3JldHVybiBpdGVtO319O1VJLkNvbnRleHRTdWJNZW51PWNsYXNzIGV4dGVuZHMgVUkuQ29udGV4dE1lbnVJdGVte2NvbnN0cnVjdG9yKGNvbnRleHRNZW51LGxhYmVsLGRpc2FibGVkKXtzdXBlcihjb250ZXh0TWVudSwnc3ViTWVudScsbGFiZWwsZGlzYWJsZWQpO3RoaXMuX3NlY3Rpb25zPW5ldyBNYXAoKTt0aGlzLl9zZWN0aW9uTGlzdD1bXTt9Cl9pbml0KCl7VUkuQ29udGV4dE1lbnUuX2dyb3VwV2VpZ2h0cy5mb3JFYWNoKG5hbWU9PnRoaXMuc2VjdGlvbihuYW1lKSk7fQpzZWN0aW9uKG5hbWUpe2xldCBzZWN0aW9uPW5hbWU/dGhpcy5fc2VjdGlvbnMuZ2V0KG5hbWUpOm51bGw7aWYoIXNlY3Rpb24pe3NlY3Rpb249bmV3IFVJLkNvbnRleHRNZW51U2VjdGlvbih0aGlzLl9jb250ZXh0TWVudSk7aWYobmFtZSl7dGhpcy5fc2VjdGlvbnMuc2V0KG5hbWUsc2VjdGlvbik7dGhpcy5fc2VjdGlvbkxpc3QucHVzaChzZWN0aW9uKTt9ZWxzZXt0aGlzLl9zZWN0aW9uTGlzdC5zcGxpY2UoVUkuQ29udGV4dE1lbnUuX2dyb3VwV2VpZ2h0cy5pbmRleE9mKCdkZWZhdWx0JyksMCxzZWN0aW9uKTt9fQpyZXR1cm4gc2VjdGlvbjt9CmhlYWRlclNlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCdoZWFkZXInKTt9Cm5ld1NlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCduZXcnKTt9CnJldmVhbFNlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCdyZXZlYWwnKTt9CmNsaXBib2FyZFNlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCdjbGlwYm9hcmQnKTt9CmVkaXRTZWN0aW9uKCl7cmV0dXJuIHRoaXMuc2VjdGlvbignZWRpdCcpO30KZGVidWdTZWN0aW9uKCl7cmV0dXJuIHRoaXMuc2VjdGlvbignZGVidWcnKTt9CnZpZXdTZWN0aW9uKCl7cmV0dXJuIHRoaXMuc2VjdGlvbigndmlldycpO30KZGVmYXVsdFNlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCdkZWZhdWx0Jyk7fQpzYXZlU2VjdGlvbigpe3JldHVybiB0aGlzLnNlY3Rpb24oJ3NhdmUnKTt9CmZvb3RlclNlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWN0aW9uKCdmb290ZXInKTt9Cl9idWlsZERlc2NyaXB0b3IoKXtjb25zdCByZXN1bHQ9e3R5cGU6J3N1Yk1lbnUnLGxhYmVsOnRoaXMuX2xhYmVsLGVuYWJsZWQ6IXRoaXMuX2Rpc2FibGVkLHN1Ykl0ZW1zOltdfTtjb25zdCBub25FbXB0eVNlY3Rpb25zPXRoaXMuX3NlY3Rpb25MaXN0LmZpbHRlcihzZWN0aW9uPT4hIXNlY3Rpb24uX2l0ZW1zLmxlbmd0aCk7Zm9yKGNvbnN0IHNlY3Rpb24gb2Ygbm9uRW1wdHlTZWN0aW9ucyl7Zm9yKGNvbnN0IGl0ZW0gb2Ygc2VjdGlvbi5faXRlbXMpCnJlc3VsdC5zdWJJdGVtcy5wdXNoKGl0ZW0uX2J1aWxkRGVzY3JpcHRvcigpKTtpZihzZWN0aW9uIT09bm9uRW1wdHlTZWN0aW9ucy5wZWVrTGFzdCgpKQpyZXN1bHQuc3ViSXRlbXMucHVzaCh7dHlwZTonc2VwYXJhdG9yJ30pO30KcmV0dXJuIHJlc3VsdDt9CmFwcGVuZEl0ZW1zQXRMb2NhdGlvbihsb2NhdGlvbil7Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygnY29udGV4dC1tZW51LWl0ZW0nKSl7Y29uc3QgaXRlbUxvY2F0aW9uPWV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2xvY2F0aW9uJ118fCcnO2lmKCFpdGVtTG9jYXRpb24uc3RhcnRzV2l0aChsb2NhdGlvbisnLycpKQpjb250aW51ZTtjb25zdCBzZWN0aW9uPWl0ZW1Mb2NhdGlvbi5zdWJzdHIobG9jYXRpb24ubGVuZ3RoKzEpO2lmKCFzZWN0aW9ufHxzZWN0aW9uLmluY2x1ZGVzKCcvJykpCmNvbnRpbnVlO3RoaXMuc2VjdGlvbihzZWN0aW9uKS5hcHBlbmRBY3Rpb24oZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnYWN0aW9uSWQnXSk7fX19O1VJLkNvbnRleHRNZW51SXRlbS5fdW5pcXVlU2VjdGlvbk5hbWU9MDtVSS5Db250ZXh0TWVudT1jbGFzcyBleHRlbmRzIFVJLkNvbnRleHRTdWJNZW51e2NvbnN0cnVjdG9yKGV2ZW50LHVzZVNvZnRNZW51LHgseSl7c3VwZXIobnVsbCk7dGhpcy5fY29udGV4dE1lbnU9dGhpcztzdXBlci5faW5pdCgpO3RoaXMuX2RlZmF1bHRTZWN0aW9uPXRoaXMuZGVmYXVsdFNlY3Rpb24oKTt0aGlzLl9wZW5kaW5nUHJvbWlzZXM9W107dGhpcy5fcGVuZGluZ1RhcmdldHM9W107dGhpcy5fZXZlbnQ9ZXZlbnQ7dGhpcy5fdXNlU29mdE1lbnU9ISF1c2VTb2Z0TWVudTt0aGlzLl94PXg9PT11bmRlZmluZWQ/ZXZlbnQueDp4O3RoaXMuX3k9eT09PXVuZGVmaW5lZD9ldmVudC55Onk7dGhpcy5faGFuZGxlcnM9e307dGhpcy5faWQ9MDtjb25zdCB0YXJnZXQ9ZXZlbnQuZGVlcEVsZW1lbnRGcm9tUG9pbnQoKTtpZih0YXJnZXQpCnRoaXMuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKCh0YXJnZXQpKTt9CnN0YXRpYyBpbml0aWFsaXplKCl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuU2V0VXNlU29mdE1lbnUsc2V0VXNlU29mdE1lbnUpO2Z1bmN0aW9uIHNldFVzZVNvZnRNZW51KGV2ZW50KXtVSS5Db250ZXh0TWVudS5fdXNlU29mdE1lbnU9KGV2ZW50LmRhdGEpO319CnN0YXRpYyBpbnN0YWxsSGFuZGxlcihkb2Mpe2RvYy5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JyxoYW5kbGVyLGZhbHNlKTtmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnRleHRNZW51LnNob3coKTt9fQpfbmV4dElkKCl7cmV0dXJuIHRoaXMuX2lkKys7fQpzaG93KCl7UHJvbWlzZS5hbGwodGhpcy5fcGVuZGluZ1Byb21pc2VzKS50aGVuKHBvcHVsYXRlLmJpbmQodGhpcykpLnRoZW4odGhpcy5faW5uZXJTaG93LmJpbmQodGhpcykpO1VJLkNvbnRleHRNZW51Ll9wZW5kaW5nTWVudT10aGlzO2Z1bmN0aW9uIHBvcHVsYXRlKGFwcGVuZENhbGxSZXN1bHRzKXtpZihVSS5Db250ZXh0TWVudS5fcGVuZGluZ01lbnUhPT10aGlzKQpyZXR1cm47ZGVsZXRlIFVJLkNvbnRleHRNZW51Ll9wZW5kaW5nTWVudTtmb3IobGV0IGk9MDtpPGFwcGVuZENhbGxSZXN1bHRzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3ZpZGVycz1hcHBlbmRDYWxsUmVzdWx0c1tpXTtjb25zdCB0YXJnZXQ9dGhpcy5fcGVuZGluZ1RhcmdldHNbaV07Zm9yKGxldCBqPTA7ajxwcm92aWRlcnMubGVuZ3RoOysrail7Y29uc3QgcHJvdmlkZXI9KHByb3ZpZGVyc1tqXSk7cHJvdmlkZXIuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHRoaXMuX2V2ZW50LHRoaXMsdGFyZ2V0KTt9fQp0aGlzLl9wZW5kaW5nUHJvbWlzZXM9W107dGhpcy5fcGVuZGluZ1RhcmdldHM9W107fQp0aGlzLl9ldmVudC5jb25zdW1lKHRydWUpO30KZGlzY2FyZCgpe2lmKHRoaXMuX3NvZnRNZW51KQp0aGlzLl9zb2Z0TWVudS5kaXNjYXJkKCk7fQpfaW5uZXJTaG93KCl7Y29uc3QgbWVudU9iamVjdD10aGlzLl9idWlsZE1lbnVEZXNjcmlwdG9ycygpO2lmKHRoaXMuX3VzZVNvZnRNZW51fHxVSS5Db250ZXh0TWVudS5fdXNlU29mdE1lbnV8fEluc3BlY3RvckZyb250ZW5kSG9zdC5pc0hvc3RlZE1vZGUoKSl7dGhpcy5fc29mdE1lbnU9bmV3IFVJLlNvZnRDb250ZXh0TWVudShtZW51T2JqZWN0LHRoaXMuX2l0ZW1TZWxlY3RlZC5iaW5kKHRoaXMpKTt0aGlzLl9zb2Z0TWVudS5zaG93KHRoaXMuX2V2ZW50LnRhcmdldC5vd25lckRvY3VtZW50LG5ldyBBbmNob3JCb3godGhpcy5feCx0aGlzLl95LDAsMCkpO31lbHNle0luc3BlY3RvckZyb250ZW5kSG9zdC5zaG93Q29udGV4dE1lbnVBdFBvaW50KHRoaXMuX3gsdGhpcy5feSxtZW51T2JqZWN0LHRoaXMuX2V2ZW50LnRhcmdldC5vd25lckRvY3VtZW50KTtmdW5jdGlvbiBsaXN0ZW5Ub0V2ZW50cygpe0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkNvbnRleHRNZW51Q2xlYXJlZCx0aGlzLl9tZW51Q2xlYXJlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5Db250ZXh0TWVudUl0ZW1TZWxlY3RlZCx0aGlzLl9vbkl0ZW1TZWxlY3RlZCx0aGlzKTt9CnNldEltbWVkaWF0ZShsaXN0ZW5Ub0V2ZW50cy5iaW5kKHRoaXMpKTt9fQpfc2V0SGFuZGxlcihpZCxoYW5kbGVyKXtpZihoYW5kbGVyKQp0aGlzLl9oYW5kbGVyc1tpZF09aGFuZGxlcjt9Cl9idWlsZE1lbnVEZXNjcmlwdG9ycygpe3JldHVybihzdXBlci5fYnVpbGREZXNjcmlwdG9yKCkuc3ViSXRlbXMpO30KX29uSXRlbVNlbGVjdGVkKGV2ZW50KXt0aGlzLl9pdGVtU2VsZWN0ZWQoKGV2ZW50LmRhdGEpKTt9Cl9pdGVtU2VsZWN0ZWQoaWQpe2lmKHRoaXMuX2hhbmRsZXJzW2lkXSkKdGhpcy5faGFuZGxlcnNbaWRdLmNhbGwodGhpcyk7dGhpcy5fbWVudUNsZWFyZWQoKTt9Cl9tZW51Q2xlYXJlZCgpe0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkNvbnRleHRNZW51Q2xlYXJlZCx0aGlzLl9tZW51Q2xlYXJlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5Db250ZXh0TWVudUl0ZW1TZWxlY3RlZCx0aGlzLl9vbkl0ZW1TZWxlY3RlZCx0aGlzKTt9CmFwcGVuZEFwcGxpY2FibGVJdGVtcyh0YXJnZXQpe3RoaXMuX3BlbmRpbmdQcm9taXNlcy5wdXNoKHNlbGYucnVudGltZS5hbGxJbnN0YW5jZXMoVUkuQ29udGV4dE1lbnUuUHJvdmlkZXIsdGFyZ2V0KSk7dGhpcy5fcGVuZGluZ1RhcmdldHMucHVzaCh0YXJnZXQpO319O1VJLkNvbnRleHRNZW51Ll9ncm91cFdlaWdodHM9WydoZWFkZXInLCduZXcnLCdyZXZlYWwnLCdlZGl0JywnY2xpcGJvYXJkJywnZGVidWcnLCd2aWV3JywnZGVmYXVsdCcsJ3NhdmUnLCdmb290ZXInXTtVSS5Db250ZXh0TWVudS5Qcm92aWRlcj1mdW5jdGlvbigpe307VUkuQ29udGV4dE1lbnUuUHJvdmlkZXIucHJvdG90eXBlPXthcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsdGFyZ2V0KXt9fTs7VUkuR2xhc3NQYW5lPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fd2lkZ2V0PW5ldyBVSS5XaWRnZXQodHJ1ZSk7dGhpcy5fd2lkZ2V0Lm1hcmtBc1Jvb3QoKTt0aGlzLmVsZW1lbnQ9dGhpcy5fd2lkZ2V0LmVsZW1lbnQ7dGhpcy5jb250ZW50RWxlbWVudD10aGlzLl93aWRnZXQuY29udGVudEVsZW1lbnQ7dGhpcy5fYXJyb3dFbGVtZW50PVVJLkljb24uY3JlYXRlKCcnLCdhcnJvdyBoaWRkZW4nKTt0aGlzLmVsZW1lbnQuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLl9hcnJvd0VsZW1lbnQpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvZ2xhc3NQYW5lLmNzcycpO3RoaXMuc2V0UG9pbnRlckV2ZW50c0JlaGF2aW9yKFVJLkdsYXNzUGFuZS5Qb2ludGVyRXZlbnRzQmVoYXZpb3IuUGllcmNlR2xhc3NQYW5lKTt0aGlzLl9vbk1vdXNlRG93bkJvdW5kPXRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcyk7dGhpcy5fb25DbGlja091dHNpZGVDYWxsYmFjaz1udWxsO3RoaXMuX21heFNpemU9bnVsbDt0aGlzLl9wb3NpdGlvblg9bnVsbDt0aGlzLl9wb3NpdGlvblk9bnVsbDt0aGlzLl9hbmNob3JCb3g9bnVsbDt0aGlzLl9hbmNob3JCZWhhdmlvcj1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyVG9wO3RoaXMuX3NpemVCZWhhdmlvcj1VSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLlNldEV4YWN0U2l6ZTt0aGlzLl9tYXJnaW5CZWhhdmlvcj1VSS5HbGFzc1BhbmUuTWFyZ2luQmVoYXZpb3IuRGVmYXVsdE1hcmdpbjt9CmlzU2hvd2luZygpe3JldHVybiB0aGlzLl93aWRnZXQuaXNTaG93aW5nKCk7fQpyZWdpc3RlclJlcXVpcmVkQ1NTKGNzc0ZpbGUpe3RoaXMuX3dpZGdldC5yZWdpc3RlclJlcXVpcmVkQ1NTKGNzc0ZpbGUpO30Kc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KGVsZW1lbnQpe3RoaXMuX3dpZGdldC5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQoZWxlbWVudCk7fQpzZXREaW1tZWQoZGltbWVkKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGltbWVkLXBhbmUnLGRpbW1lZCk7fQpzZXRQb2ludGVyRXZlbnRzQmVoYXZpb3IocG9pbnRlckV2ZW50c0JlaGF2aW9yKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbm8tcG9pbnRlci1ldmVudHMnLHBvaW50ZXJFdmVudHNCZWhhdmlvciE9PVVJLkdsYXNzUGFuZS5Qb2ludGVyRXZlbnRzQmVoYXZpb3IuQmxvY2tlZEJ5R2xhc3NQYW5lKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ25vLXBvaW50ZXItZXZlbnRzJyxwb2ludGVyRXZlbnRzQmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLlBpZXJjZUNvbnRlbnRzKTt9CnNldE91dHNpZGVDbGlja0NhbGxiYWNrKGNhbGxiYWNrKXt0aGlzLl9vbkNsaWNrT3V0c2lkZUNhbGxiYWNrPWNhbGxiYWNrO30Kc2V0TWF4Q29udGVudFNpemUoc2l6ZSl7dGhpcy5fbWF4U2l6ZT1zaXplO3RoaXMuX3Bvc2l0aW9uQ29udGVudCgpO30Kc2V0U2l6ZUJlaGF2aW9yKHNpemVCZWhhdmlvcil7dGhpcy5fc2l6ZUJlaGF2aW9yPXNpemVCZWhhdmlvcjt0aGlzLl9wb3NpdGlvbkNvbnRlbnQoKTt9CnNldENvbnRlbnRQb3NpdGlvbih4LHkpe3RoaXMuX3Bvc2l0aW9uWD14O3RoaXMuX3Bvc2l0aW9uWT15O3RoaXMuX3Bvc2l0aW9uQ29udGVudCgpO30Kc2V0Q29udGVudEFuY2hvckJveChhbmNob3JCb3gpe3RoaXMuX2FuY2hvckJveD1hbmNob3JCb3g7dGhpcy5fcG9zaXRpb25Db250ZW50KCk7fQpzZXRBbmNob3JCZWhhdmlvcihiZWhhdmlvcil7dGhpcy5fYW5jaG9yQmVoYXZpb3I9YmVoYXZpb3I7fQpzZXRNYXJnaW5CZWhhdmlvcihiZWhhdmlvcil7dGhpcy5fbWFyZ2luQmVoYXZpb3I9YmVoYXZpb3I7dGhpcy5fYXJyb3dFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsYmVoYXZpb3IhPT1VSS5HbGFzc1BhbmUuTWFyZ2luQmVoYXZpb3IuQXJyb3cpO30Kc2hvdyhkb2N1bWVudCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuZWxlbWVudC5zdHlsZS56SW5kZXg9MzAwMCsxMDAwKlVJLkdsYXNzUGFuZS5fcGFuZXMuc2l6ZTtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fb25Nb3VzZURvd25Cb3VuZCx0cnVlKTt0aGlzLl93aWRnZXQuc2hvdyhkb2N1bWVudC5ib2R5KTtVSS5HbGFzc1BhbmUuX3BhbmVzLmFkZCh0aGlzKTt0aGlzLl9wb3NpdGlvbkNvbnRlbnQoKTt9CmhpZGUoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO1VJLkdsYXNzUGFuZS5fcGFuZXMuZGVsZXRlKHRoaXMpO3RoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9vbk1vdXNlRG93bkJvdW5kLHRydWUpO3RoaXMuX3dpZGdldC5kZXRhY2goKTt9Cl9vbk1vdXNlRG93bihldmVudCl7aWYoIXRoaXMuX29uQ2xpY2tPdXRzaWRlQ2FsbGJhY2spCnJldHVybjtjb25zdCBub2RlPWV2ZW50LmRlZXBFbGVtZW50RnJvbVBvaW50KCk7aWYoIW5vZGV8fHRoaXMuY29udGVudEVsZW1lbnQuaXNTZWxmT3JBbmNlc3Rvcihub2RlKSkKcmV0dXJuO3RoaXMuX29uQ2xpY2tPdXRzaWRlQ2FsbGJhY2suY2FsbChudWxsLGV2ZW50KTt9Cl9wb3NpdGlvbkNvbnRlbnQoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO2NvbnN0IHNob3dBcnJvdz10aGlzLl9tYXJnaW5CZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5NYXJnaW5CZWhhdmlvci5BcnJvdztjb25zdCBndXR0ZXJTaXplPXNob3dBcnJvdz84Oih0aGlzLl9tYXJnaW5CZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5NYXJnaW5CZWhhdmlvci5Ob01hcmdpbj8wOjMpO2NvbnN0IHNjcm9sbGJhclNpemU9VUkubWVhc3VyZWRTY3JvbGxiYXJXaWR0aCh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudCk7Y29uc3QgYXJyb3dTaXplPTEwO2NvbnN0IGNvbnRhaW5lcj1VSS5HbGFzc1BhbmUuX2NvbnRhaW5lcnMuZ2V0KCh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudCkpO2lmKHRoaXMuX3NpemVCZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpe3RoaXMuY29udGVudEVsZW1lbnQucG9zaXRpb25BdCgwLDApO3RoaXMuY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGg9Jyc7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5tYXhXaWR0aD0nJzt0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLmhlaWdodD0nJzt0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLm1heEhlaWdodD0nJzt9CmNvbnN0IGNvbnRhaW5lcldpZHRoPWNvbnRhaW5lci5vZmZzZXRXaWR0aDtjb25zdCBjb250YWluZXJIZWlnaHQ9Y29udGFpbmVyLm9mZnNldEhlaWdodDtsZXQgd2lkdGg9Y29udGFpbmVyV2lkdGgtZ3V0dGVyU2l6ZSoyO2xldCBoZWlnaHQ9Y29udGFpbmVySGVpZ2h0LWd1dHRlclNpemUqMjtsZXQgcG9zaXRpb25YPWd1dHRlclNpemU7bGV0IHBvc2l0aW9uWT1ndXR0ZXJTaXplO2lmKHRoaXMuX21heFNpemUpe3dpZHRoPU1hdGgubWluKHdpZHRoLHRoaXMuX21heFNpemUud2lkdGgpO2hlaWdodD1NYXRoLm1pbihoZWlnaHQsdGhpcy5fbWF4U2l6ZS5oZWlnaHQpO30KaWYodGhpcy5fc2l6ZUJlaGF2aW9yPT09VUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCl7Y29uc3QgbWVhc3VyZWRXaWR0aD10aGlzLmNvbnRlbnRFbGVtZW50Lm9mZnNldFdpZHRoO2NvbnN0IG1lYXN1cmVkSGVpZ2h0PXRoaXMuY29udGVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O2NvbnN0IHdpZHRoT3ZlcmZsb3c9aGVpZ2h0PG1lYXN1cmVkSGVpZ2h0P3Njcm9sbGJhclNpemU6MDtjb25zdCBoZWlnaHRPdmVyZmxvdz13aWR0aDxtZWFzdXJlZFdpZHRoP3Njcm9sbGJhclNpemU6MDt3aWR0aD1NYXRoLm1pbih3aWR0aCxtZWFzdXJlZFdpZHRoK3dpZHRoT3ZlcmZsb3cpO2hlaWdodD1NYXRoLm1pbihoZWlnaHQsbWVhc3VyZWRIZWlnaHQraGVpZ2h0T3ZlcmZsb3cpO30KaWYodGhpcy5fYW5jaG9yQm94KXtjb25zdCBhbmNob3JCb3g9dGhpcy5fYW5jaG9yQm94LnJlbGF0aXZlVG9FbGVtZW50KGNvbnRhaW5lcik7bGV0IGJlaGF2aW9yPXRoaXMuX2FuY2hvckJlaGF2aW9yO3RoaXMuX2Fycm93RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdhcnJvdy1ub25lJywnYXJyb3ctdG9wJywnYXJyb3ctYm90dG9tJywnYXJyb3ctbGVmdCcsJ2Fycm93LXJpZ2h0Jyk7aWYoYmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyVG9wfHxiZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJCb3R0b20pe2NvbnN0IHRvcD1hbmNob3JCb3gueS0yKmd1dHRlclNpemU7Y29uc3QgYm90dG9tPWNvbnRhaW5lckhlaWdodC1hbmNob3JCb3gueS1hbmNob3JCb3guaGVpZ2h0LTIqZ3V0dGVyU2l6ZTtpZihiZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJUb3AmJnRvcDxoZWlnaHQmJmJvdHRvbT50b3ApCmJlaGF2aW9yPVVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJCb3R0b207aWYoYmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyQm90dG9tJiZib3R0b208aGVpZ2h0JiZ0b3A+Ym90dG9tKQpiZWhhdmlvcj1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyVG9wO2xldCBhcnJvd1k7bGV0IGVub3VnaEhlaWdodD10cnVlO2lmKGJlaGF2aW9yPT09VUkuR2xhc3NQYW5lLkFuY2hvckJlaGF2aW9yLlByZWZlclRvcCl7cG9zaXRpb25ZPU1hdGgubWF4KGd1dHRlclNpemUsYW5jaG9yQm94LnktaGVpZ2h0LWd1dHRlclNpemUpO2NvbnN0IHNwYWNlVG9wPWFuY2hvckJveC55LXBvc2l0aW9uWS1ndXR0ZXJTaXplO2lmKHRoaXMuX3NpemVCZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpe2lmKGhlaWdodD5zcGFjZVRvcCl7dGhpcy5fYXJyb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Fycm93LW5vbmUnKTtlbm91Z2hIZWlnaHQ9ZmFsc2U7fX1lbHNle2hlaWdodD1NYXRoLm1pbihoZWlnaHQsc3BhY2VUb3ApO30KdGhpcy5fYXJyb3dFbGVtZW50LnNldEljb25UeXBlKCdtZWRpdW1pY29uLWFycm93LWJvdHRvbScpO3RoaXMuX2Fycm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy1ib3R0b20nKTthcnJvd1k9YW5jaG9yQm94LnktZ3V0dGVyU2l6ZTt9ZWxzZXtwb3NpdGlvblk9YW5jaG9yQm94LnkrYW5jaG9yQm94LmhlaWdodCtndXR0ZXJTaXplO2NvbnN0IHNwYWNlQm90dG9tPWNvbnRhaW5lckhlaWdodC1wb3NpdGlvblktZ3V0dGVyU2l6ZTtpZih0aGlzLl9zaXplQmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLk1lYXN1cmVDb250ZW50KXtpZihoZWlnaHQ+c3BhY2VCb3R0b20pe3RoaXMuX2Fycm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy1ub25lJyk7cG9zaXRpb25ZPWNvbnRhaW5lckhlaWdodC1ndXR0ZXJTaXplLWhlaWdodDtlbm91Z2hIZWlnaHQ9ZmFsc2U7fX1lbHNle2hlaWdodD1NYXRoLm1pbihoZWlnaHQsc3BhY2VCb3R0b20pO30KdGhpcy5fYXJyb3dFbGVtZW50LnNldEljb25UeXBlKCdtZWRpdW1pY29uLWFycm93LXRvcCcpO3RoaXMuX2Fycm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy10b3AnKTthcnJvd1k9YW5jaG9yQm94LnkrYW5jaG9yQm94LmhlaWdodCtndXR0ZXJTaXplO30KcG9zaXRpb25YPU1hdGgubWF4KGd1dHRlclNpemUsTWF0aC5taW4oYW5jaG9yQm94LngsY29udGFpbmVyV2lkdGgtd2lkdGgtZ3V0dGVyU2l6ZSkpO2lmKCFlbm91Z2hIZWlnaHQpCnBvc2l0aW9uWD1NYXRoLm1pbihwb3NpdGlvblgrYXJyb3dTaXplLGNvbnRhaW5lcldpZHRoLXdpZHRoLWd1dHRlclNpemUpO2Vsc2UgaWYoc2hvd0Fycm93JiZwb3NpdGlvblgtYXJyb3dTaXplPj1ndXR0ZXJTaXplKQpwb3NpdGlvblgtPWFycm93U2l6ZTt3aWR0aD1NYXRoLm1pbih3aWR0aCxjb250YWluZXJXaWR0aC1wb3NpdGlvblgtZ3V0dGVyU2l6ZSk7aWYoMiphcnJvd1NpemU+PXdpZHRoKXt0aGlzLl9hcnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXJyb3ctbm9uZScpO31lbHNle2xldCBhcnJvd1g9YW5jaG9yQm94LngrTWF0aC5taW4oNTAsTWF0aC5mbG9vcihhbmNob3JCb3gud2lkdGgvMikpO2Fycm93WD1OdW1iZXIuY29uc3RyYWluKGFycm93WCxwb3NpdGlvblgrYXJyb3dTaXplLHBvc2l0aW9uWCt3aWR0aC1hcnJvd1NpemUpO3RoaXMuX2Fycm93RWxlbWVudC5wb3NpdGlvbkF0KGFycm93WCxhcnJvd1ksY29udGFpbmVyKTt9fWVsc2V7Y29uc3QgbGVmdD1hbmNob3JCb3gueC0yKmd1dHRlclNpemU7Y29uc3QgcmlnaHQ9Y29udGFpbmVyV2lkdGgtYW5jaG9yQm94LngtYW5jaG9yQm94LndpZHRoLTIqZ3V0dGVyU2l6ZTtpZihiZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJMZWZ0JiZsZWZ0PHdpZHRoJiZyaWdodD5sZWZ0KQpiZWhhdmlvcj1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyUmlnaHQ7aWYoYmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyUmlnaHQmJnJpZ2h0PHdpZHRoJiZsZWZ0PnJpZ2h0KQpiZWhhdmlvcj1VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyTGVmdDtsZXQgYXJyb3dYO2xldCBlbm91Z2hXaWR0aD10cnVlO2lmKGJlaGF2aW9yPT09VUkuR2xhc3NQYW5lLkFuY2hvckJlaGF2aW9yLlByZWZlckxlZnQpe3Bvc2l0aW9uWD1NYXRoLm1heChndXR0ZXJTaXplLGFuY2hvckJveC54LXdpZHRoLWd1dHRlclNpemUpO2NvbnN0IHNwYWNlTGVmdD1hbmNob3JCb3gueC1wb3NpdGlvblgtZ3V0dGVyU2l6ZTtpZih0aGlzLl9zaXplQmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLk1lYXN1cmVDb250ZW50KXtpZih3aWR0aD5zcGFjZUxlZnQpe3RoaXMuX2Fycm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy1ub25lJyk7ZW5vdWdoV2lkdGg9ZmFsc2U7fX1lbHNle3dpZHRoPU1hdGgubWluKHdpZHRoLHNwYWNlTGVmdCk7fQp0aGlzLl9hcnJvd0VsZW1lbnQuc2V0SWNvblR5cGUoJ21lZGl1bWljb24tYXJyb3ctcmlnaHQnKTt0aGlzLl9hcnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXJyb3ctcmlnaHQnKTthcnJvd1g9YW5jaG9yQm94LngtZ3V0dGVyU2l6ZTt9ZWxzZXtwb3NpdGlvblg9YW5jaG9yQm94LngrYW5jaG9yQm94LndpZHRoK2d1dHRlclNpemU7Y29uc3Qgc3BhY2VSaWdodD1jb250YWluZXJXaWR0aC1wb3NpdGlvblgtZ3V0dGVyU2l6ZTtpZih0aGlzLl9zaXplQmVoYXZpb3I9PT1VSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLk1lYXN1cmVDb250ZW50KXtpZih3aWR0aD5zcGFjZVJpZ2h0KXt0aGlzLl9hcnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXJyb3ctbm9uZScpO3Bvc2l0aW9uWD1jb250YWluZXJXaWR0aC1ndXR0ZXJTaXplLXdpZHRoO2Vub3VnaFdpZHRoPWZhbHNlO319ZWxzZXt3aWR0aD1NYXRoLm1pbih3aWR0aCxzcGFjZVJpZ2h0KTt9CnRoaXMuX2Fycm93RWxlbWVudC5zZXRJY29uVHlwZSgnbWVkaXVtaWNvbi1hcnJvdy1sZWZ0Jyk7dGhpcy5fYXJyb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Fycm93LWxlZnQnKTthcnJvd1g9YW5jaG9yQm94LngrYW5jaG9yQm94LndpZHRoK2d1dHRlclNpemU7fQpwb3NpdGlvblk9TWF0aC5tYXgoZ3V0dGVyU2l6ZSxNYXRoLm1pbihhbmNob3JCb3gueSxjb250YWluZXJIZWlnaHQtaGVpZ2h0LWd1dHRlclNpemUpKTtpZighZW5vdWdoV2lkdGgpCnBvc2l0aW9uWT1NYXRoLm1pbihwb3NpdGlvblkrYXJyb3dTaXplLGNvbnRhaW5lckhlaWdodC1oZWlnaHQtZ3V0dGVyU2l6ZSk7ZWxzZSBpZihzaG93QXJyb3cmJnBvc2l0aW9uWS1hcnJvd1NpemU+PWd1dHRlclNpemUpCnBvc2l0aW9uWS09YXJyb3dTaXplO2hlaWdodD1NYXRoLm1pbihoZWlnaHQsY29udGFpbmVySGVpZ2h0LXBvc2l0aW9uWS1ndXR0ZXJTaXplKTtpZigyKmFycm93U2l6ZT49aGVpZ2h0KXt0aGlzLl9hcnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXJyb3ctbm9uZScpO31lbHNle2xldCBhcnJvd1k9YW5jaG9yQm94LnkrTWF0aC5taW4oNTAsTWF0aC5mbG9vcihhbmNob3JCb3guaGVpZ2h0LzIpKTthcnJvd1k9TnVtYmVyLmNvbnN0cmFpbihhcnJvd1kscG9zaXRpb25ZK2Fycm93U2l6ZSxwb3NpdGlvblkraGVpZ2h0LWFycm93U2l6ZSk7dGhpcy5fYXJyb3dFbGVtZW50LnBvc2l0aW9uQXQoYXJyb3dYLGFycm93WSxjb250YWluZXIpO319fWVsc2V7cG9zaXRpb25YPXRoaXMuX3Bvc2l0aW9uWCE9PW51bGw/dGhpcy5fcG9zaXRpb25YOihjb250YWluZXJXaWR0aC13aWR0aCkvMjtwb3NpdGlvblk9dGhpcy5fcG9zaXRpb25ZIT09bnVsbD90aGlzLl9wb3NpdGlvblk6KGNvbnRhaW5lckhlaWdodC1oZWlnaHQpLzI7d2lkdGg9TWF0aC5taW4od2lkdGgsY29udGFpbmVyV2lkdGgtcG9zaXRpb25YLWd1dHRlclNpemUpO2hlaWdodD1NYXRoLm1pbihoZWlnaHQsY29udGFpbmVySGVpZ2h0LXBvc2l0aW9uWS1ndXR0ZXJTaXplKTt0aGlzLl9hcnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXJyb3ctbm9uZScpO30KdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS53aWR0aD13aWR0aCsncHgnO2lmKHRoaXMuX3NpemVCZWhhdmlvcj09PVVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuU2V0RXhhY3RXaWR0aE1heEhlaWdodCkKdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5tYXhIZWlnaHQ9aGVpZ2h0KydweCc7ZWxzZQp0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLmhlaWdodD1oZWlnaHQrJ3B4Jzt0aGlzLmNvbnRlbnRFbGVtZW50LnBvc2l0aW9uQXQocG9zaXRpb25YLHBvc2l0aW9uWSxjb250YWluZXIpO3RoaXMuX3dpZGdldC5kb1Jlc2l6ZSgpO30Kd2lkZ2V0KCl7cmV0dXJuIHRoaXMuX3dpZGdldDt9CnN0YXRpYyBzZXRDb250YWluZXIoZWxlbWVudCl7VUkuR2xhc3NQYW5lLl9jb250YWluZXJzLnNldCgoZWxlbWVudC5vd25lckRvY3VtZW50KSxlbGVtZW50KTtVSS5HbGFzc1BhbmUuY29udGFpbmVyTW92ZWQoZWxlbWVudCk7fQpzdGF0aWMgY29udGFpbmVyKGRvY3VtZW50KXtyZXR1cm4gVUkuR2xhc3NQYW5lLl9jb250YWluZXJzLmdldChkb2N1bWVudCk7fQpzdGF0aWMgY29udGFpbmVyTW92ZWQoZWxlbWVudCl7Zm9yKGNvbnN0IHBhbmUgb2YgVUkuR2xhc3NQYW5lLl9wYW5lcyl7aWYocGFuZS5pc1Nob3dpbmcoKSYmcGFuZS5lbGVtZW50Lm93bmVyRG9jdW1lbnQ9PT1lbGVtZW50Lm93bmVyRG9jdW1lbnQpCnBhbmUuX3Bvc2l0aW9uQ29udGVudCgpO319fTtVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yPXtCbG9ja2VkQnlHbGFzc1BhbmU6U3ltYm9sKCdCbG9ja2VkQnlHbGFzc1BhbmUnKSxQaWVyY2VHbGFzc1BhbmU6U3ltYm9sKCdQaWVyY2VHbGFzc1BhbmUnKSxQaWVyY2VDb250ZW50czpTeW1ib2woJ1BpZXJjZUNvbnRlbnRzJyl9O1VJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvcj17UHJlZmVyVG9wOlN5bWJvbCgnUHJlZmVyVG9wJyksUHJlZmVyQm90dG9tOlN5bWJvbCgnUHJlZmVyQm90dG9tJyksUHJlZmVyTGVmdDpTeW1ib2woJ1ByZWZlckxlZnQnKSxQcmVmZXJSaWdodDpTeW1ib2woJ1ByZWZlclJpZ2h0JyksfTtVSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yPXtTZXRFeGFjdFNpemU6U3ltYm9sKCdTZXRFeGFjdFNpemUnKSxTZXRFeGFjdFdpZHRoTWF4SGVpZ2h0OlN5bWJvbCgnU2V0RXhhY3RXaWR0aE1heEhlaWdodCcpLE1lYXN1cmVDb250ZW50OlN5bWJvbCgnTWVhc3VyZUNvbnRlbnQnKX07VUkuR2xhc3NQYW5lLk1hcmdpbkJlaGF2aW9yPXtBcnJvdzpTeW1ib2woJ0Fycm93JyksRGVmYXVsdE1hcmdpbjpTeW1ib2woJ0RlZmF1bHRNYXJnaW4nKSxOb01hcmdpbjpTeW1ib2woJ05vTWFyZ2luJyl9O1VJLkdsYXNzUGFuZS5fY29udGFpbmVycz1uZXcgTWFwKCk7VUkuR2xhc3NQYW5lLl9wYW5lcz1uZXcgU2V0KCk7O1VJLkRpYWxvZz1jbGFzcyBleHRlbmRzIFVJLkdsYXNzUGFuZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9kaWFsb2cuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC50YWJJbmRleD0wO3RoaXMuY29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCgpPT50aGlzLndpZGdldCgpLmZvY3VzKCksZmFsc2UpO3RoaXMuY29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMud2lkZ2V0KCkuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuc2V0UG9pbnRlckV2ZW50c0JlaGF2aW9yKFVJLkdsYXNzUGFuZS5Qb2ludGVyRXZlbnRzQmVoYXZpb3IuQmxvY2tlZEJ5R2xhc3NQYW5lKTt0aGlzLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKGV2ZW50PT57dGhpcy5oaWRlKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9KTt0aGlzLl90YWJJbmRleE1hcD1uZXcgTWFwKCk7dGhpcy5fZm9jdXNSZXN0b3Jlcj1udWxsO3RoaXMuX2Nsb3NlT25Fc2NhcGU9dHJ1ZTt9CnN0YXRpYyBoYXNJbnN0YW5jZSgpe3JldHVybiEhVUkuRGlhbG9nLl9pbnN0YW5jZTt9CnNob3cod2hlcmUpe2NvbnN0IGRvY3VtZW50PSh3aGVyZSBpbnN0YW5jZW9mIERvY3VtZW50P3doZXJlOih3aGVyZXx8VUkuaW5zcGVjdG9yVmlldy5lbGVtZW50KS5vd25lckRvY3VtZW50KTtpZihVSS5EaWFsb2cuX2luc3RhbmNlKQpVSS5EaWFsb2cuX2luc3RhbmNlLmhpZGUoKTtVSS5EaWFsb2cuX2luc3RhbmNlPXRoaXM7dGhpcy5fZGlzYWJsZVRhYkluZGV4T25FbGVtZW50cyhkb2N1bWVudCk7c3VwZXIuc2hvdyhkb2N1bWVudCk7dGhpcy5fZm9jdXNSZXN0b3Jlcj1uZXcgVUkuV2lkZ2V0Rm9jdXNSZXN0b3Jlcih0aGlzLndpZGdldCgpKTt9CmhpZGUoKXt0aGlzLl9mb2N1c1Jlc3RvcmVyLnJlc3RvcmUoKTtzdXBlci5oaWRlKCk7dGhpcy5fcmVzdG9yZVRhYkluZGV4T25FbGVtZW50cygpO2RlbGV0ZSBVSS5EaWFsb2cuX2luc3RhbmNlO30Kc2V0Q2xvc2VPbkVzY2FwZShjbG9zZSl7dGhpcy5fY2xvc2VPbkVzY2FwZT1jbG9zZTt9CmFkZENsb3NlQnV0dG9uKCl7Y29uc3QgY2xvc2VCdXR0b249dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGlhbG9nLWNsb3NlLWJ1dHRvbicsJ2R0LWNsb3NlLWJ1dHRvbicpO2Nsb3NlQnV0dG9uLmdyYXk9dHJ1ZTtjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnRoaXMuaGlkZSgpLGZhbHNlKTt9Cl9kaXNhYmxlVGFiSW5kZXhPbkVsZW1lbnRzKGRvY3VtZW50KXt0aGlzLl90YWJJbmRleE1hcC5jbGVhcigpO2ZvcihsZXQgbm9kZT1kb2N1bWVudDtub2RlO25vZGU9bm9kZS50cmF2ZXJzZU5leHROb2RlKGRvY3VtZW50KSl7aWYobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXtjb25zdCBlbGVtZW50PShub2RlKTtjb25zdCB0YWJJbmRleD1lbGVtZW50LnRhYkluZGV4O2lmKHRhYkluZGV4Pj0wKXt0aGlzLl90YWJJbmRleE1hcC5zZXQoZWxlbWVudCx0YWJJbmRleCk7ZWxlbWVudC50YWJJbmRleD0tMTt9fX19Cl9yZXN0b3JlVGFiSW5kZXhPbkVsZW1lbnRzKCl7Zm9yKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fdGFiSW5kZXhNYXAua2V5cygpKQplbGVtZW50LnRhYkluZGV4PSh0aGlzLl90YWJJbmRleE1hcC5nZXQoZWxlbWVudCkpO3RoaXMuX3RhYkluZGV4TWFwLmNsZWFyKCk7fQpfb25LZXlEb3duKGV2ZW50KXtpZih0aGlzLl9jbG9zZU9uRXNjYXBlJiZldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVzYy5jb2RlKXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuaGlkZSgpO319fTs7VUkuU3ludGF4SGlnaGxpZ2h0ZXI9Y2xhc3N7Y29uc3RydWN0b3IobWltZVR5cGUsc3RyaXBFeHRyYVdoaXRlc3BhY2Upe3RoaXMuX21pbWVUeXBlPW1pbWVUeXBlO3RoaXMuX3N0cmlwRXh0cmFXaGl0ZXNwYWNlPXN0cmlwRXh0cmFXaGl0ZXNwYWNlO30KY3JlYXRlU3Bhbihjb250ZW50LGNsYXNzTmFtZSl7Y29uc3Qgc3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7c3Bhbi5jbGFzc05hbWU9J2NtLScrY2xhc3NOYW1lO2lmKHRoaXMuX3N0cmlwRXh0cmFXaGl0ZXNwYWNlJiZjbGFzc05hbWUhPT0nd2hpdGVzcGFjZScpCmNvbnRlbnQ9Y29udGVudC5yZXBsYWNlKC9eW1xuXHJdKi8sJycpLnJlcGxhY2UoL1xzKiQvLCcnKTtzcGFuLmNyZWF0ZVRleHRDaGlsZChjb250ZW50KTtyZXR1cm4gc3Bhbjt9CnN5bnRheEhpZ2hsaWdodE5vZGUobm9kZSl7Y29uc3QgbGluZXM9bm9kZS50ZXh0Q29udGVudC5zcGxpdCgnXG4nKTtsZXQgcGxhaW5UZXh0U3RhcnQ7bGV0IGxpbmU7cmV0dXJuIHNlbGYucnVudGltZS5leHRlbnNpb24oVGV4dFV0aWxzLlRva2VuaXplckZhY3RvcnkpLmluc3RhbmNlKCkudGhlbihwcm9jZXNzVG9rZW5zLmJpbmQodGhpcykpO2Z1bmN0aW9uIHByb2Nlc3NUb2tlbnModG9rZW5pemVyRmFjdG9yeSl7bm9kZS5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHRva2VuaXplPXRva2VuaXplckZhY3RvcnkuY3JlYXRlVG9rZW5pemVyKHRoaXMuX21pbWVUeXBlKTtmb3IobGV0IGk9MDtpPGxpbmVzLmxlbmd0aDsrK2kpe2xpbmU9bGluZXNbaV07cGxhaW5UZXh0U3RhcnQ9MDt0b2tlbml6ZShsaW5lLHByb2Nlc3NUb2tlbi5iaW5kKHRoaXMpKTtpZihwbGFpblRleHRTdGFydDxsaW5lLmxlbmd0aCl7Y29uc3QgcGxhaW5UZXh0PWxpbmUuc3Vic3RyaW5nKHBsYWluVGV4dFN0YXJ0LGxpbmUubGVuZ3RoKTtub2RlLmNyZWF0ZVRleHRDaGlsZChwbGFpblRleHQpO30KaWYoaTxsaW5lcy5sZW5ndGgtMSkKbm9kZS5jcmVhdGVUZXh0Q2hpbGQoJ1xuJyk7fX0KZnVuY3Rpb24gcHJvY2Vzc1Rva2VuKHRva2VuLHRva2VuVHlwZSxjb2x1bW4sbmV3Q29sdW1uKXtpZighdG9rZW5UeXBlKQpyZXR1cm47aWYoY29sdW1uPnBsYWluVGV4dFN0YXJ0KXtjb25zdCBwbGFpblRleHQ9bGluZS5zdWJzdHJpbmcocGxhaW5UZXh0U3RhcnQsY29sdW1uKTtub2RlLmNyZWF0ZVRleHRDaGlsZChwbGFpblRleHQpO30Kbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVNwYW4odG9rZW4sdG9rZW5UeXBlKSk7cGxhaW5UZXh0U3RhcnQ9bmV3Q29sdW1uO319fTs7VUkuRHJvcFRhcmdldD1jbGFzc3tjb25zdHJ1Y3RvcihlbGVtZW50LHRyYW5zZmVyVHlwZXMsbWVzc2FnZVRleHQsaGFuZGxlRHJvcCl7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLHRoaXMuX29uRHJhZ0VudGVyLmJpbmQodGhpcyksdHJ1ZSk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsdGhpcy5fb25EcmFnT3Zlci5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2VsZW1lbnQ9ZWxlbWVudDt0aGlzLl90cmFuc2ZlclR5cGVzPXRyYW5zZmVyVHlwZXM7dGhpcy5fbWVzc2FnZVRleHQ9bWVzc2FnZVRleHQ7dGhpcy5faGFuZGxlRHJvcD1oYW5kbGVEcm9wO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt9CnNldEVuYWJsZWQoZW5hYmxlZCl7dGhpcy5fZW5hYmxlZD1lbmFibGVkO30KX29uRHJhZ0VudGVyKGV2ZW50KXtpZih0aGlzLl9lbmFibGVkJiZ0aGlzLl9oYXNNYXRjaGluZ1R5cGUoZXZlbnQpKQpldmVudC5jb25zdW1lKHRydWUpO30KX2hhc01hdGNoaW5nVHlwZShldmVudCl7Zm9yKGNvbnN0IHRyYW5zZmVyVHlwZSBvZiB0aGlzLl90cmFuc2ZlclR5cGVzKXtjb25zdCBmb3VuZD1BcnJheS5mcm9tKGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcykuZmluZChpdGVtPT57cmV0dXJuIHRyYW5zZmVyVHlwZS5raW5kPT09aXRlbS5raW5kJiYhIXRyYW5zZmVyVHlwZS50eXBlLmV4ZWMoaXRlbS50eXBlKTt9KTtpZihmb3VuZCkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpfb25EcmFnT3ZlcihldmVudCl7aWYoIXRoaXMuX2VuYWJsZWR8fCF0aGlzLl9oYXNNYXRjaGluZ1R5cGUoZXZlbnQpKQpyZXR1cm47ZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9J2NvcHknO2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYodGhpcy5fZHJhZ01hc2tFbGVtZW50KQpyZXR1cm47dGhpcy5fZHJhZ01hc2tFbGVtZW50PXRoaXMuX2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJycpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuX2RyYWdNYXNrRWxlbWVudCwndWkvZHJvcFRhcmdldC5jc3MnKTtzaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdkcm9wLXRhcmdldC1tZXNzYWdlJykudGV4dENvbnRlbnQ9dGhpcy5fbWVzc2FnZVRleHQ7dGhpcy5fZHJhZ01hc2tFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLHRoaXMuX29uRHJvcC5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2RyYWdNYXNrRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLHRoaXMuX29uRHJhZ0xlYXZlLmJpbmQodGhpcyksdHJ1ZSk7fQpfb25Ecm9wKGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX3JlbW92ZU1hc2soKTtpZih0aGlzLl9lbmFibGVkKQp0aGlzLl9oYW5kbGVEcm9wKGV2ZW50LmRhdGFUcmFuc2Zlcik7fQpfb25EcmFnTGVhdmUoZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7dGhpcy5fcmVtb3ZlTWFzaygpO30KX3JlbW92ZU1hc2soKXt0aGlzLl9kcmFnTWFza0VsZW1lbnQucmVtb3ZlKCk7ZGVsZXRlIHRoaXMuX2RyYWdNYXNrRWxlbWVudDt9fTtVSS5Ecm9wVGFyZ2V0LlR5cGU9e1VSSTp7a2luZDonc3RyaW5nJyx0eXBlOi90ZXh0XC91cmktbGlzdC99LEZvbGRlcjp7a2luZDonZmlsZScsdHlwZTovJF4vfSxGaWxlOntraW5kOidmaWxlJyx0eXBlOi8uKi99LFdlYkZpbGU6e2tpbmQ6J2ZpbGUnLHR5cGU6L1tcd10rL30sSW1hZ2VGaWxlOntraW5kOidmaWxlJyx0eXBlOi9pbWFnZVwvLiovfSx9OztVSS5FbXB0eVdpZGdldD1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IodGV4dCl7c3VwZXIoKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3VpL2VtcHR5V2lkZ2V0LmNzcycpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlbXB0eS12aWV3LXNjcm9sbGVyJyk7dGhpcy5fY29udGVudEVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdlbXB0eS12aWV3Jyk7dGhpcy5fdGV4dEVsZW1lbnQ9dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2gyJyk7dGhpcy5fdGV4dEVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDt9CmFwcGVuZFBhcmFncmFwaCgpe3JldHVybiB0aGlzLl9jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgncCcpO30Kc2V0IHRleHQodGV4dCl7dGhpcy5fdGV4dEVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDt9fTs7VUkuRmlsdGVyQmFyPWNsYXNzIGV4dGVuZHMgVUkuSEJveHtjb25zdHJ1Y3RvcihuYW1lLHZpc2libGVCeURlZmF1bHQpe3N1cGVyKCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9maWx0ZXIuY3NzJyk7dGhpcy5fZW5hYmxlZD10cnVlO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWx0ZXItYmFyJyk7dGhpcy5fc3RhdGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdmaWx0ZXJCYXItJytuYW1lKyctdG9nZ2xlZCcsISF2aXNpYmxlQnlEZWZhdWx0KTt0aGlzLl9maWx0ZXJCdXR0b249bmV3IFVJLlRvb2xiYXJTZXR0aW5nVG9nZ2xlKHRoaXMuX3N0YXRlU2V0dGluZywnbGFyZ2VpY29uLWZpbHRlcicsQ29tbW9uLlVJU3RyaW5nKCdGaWx0ZXInKSk7dGhpcy5fZmlsdGVycz1bXTt0aGlzLl91cGRhdGVGaWx0ZXJCYXIoKTt0aGlzLl9zdGF0ZVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlRmlsdGVyQmFyLmJpbmQodGhpcykpO30KZmlsdGVyQnV0dG9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlckJ1dHRvbjt9CmFkZEZpbHRlcihmaWx0ZXIpe3RoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChmaWx0ZXIuZWxlbWVudCgpKTtmaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcihVSS5GaWx0ZXJVSS5FdmVudHMuRmlsdGVyQ2hhbmdlZCx0aGlzLl9maWx0ZXJDaGFuZ2VkLHRoaXMpO3RoaXMuX3VwZGF0ZUZpbHRlckJ1dHRvbigpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9lbmFibGVkPWVuYWJsZWQ7dGhpcy5fZmlsdGVyQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7dGhpcy5fdXBkYXRlRmlsdGVyQmFyKCk7fQpmb3JjZVNob3dGaWx0ZXJCYXIoKXt0aGlzLl9hbHdheXNTaG93RmlsdGVycz10cnVlO3RoaXMuX3VwZGF0ZUZpbHRlckJhcigpO30Kc2hvd09uY2UoKXt0aGlzLl9zdGF0ZVNldHRpbmcuc2V0KHRydWUpO30KX2ZpbHRlckNoYW5nZWQoZXZlbnQpe3RoaXMuX3VwZGF0ZUZpbHRlckJ1dHRvbigpO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO3RoaXMuX3VwZGF0ZUZpbHRlckJhcigpO30KX3VwZGF0ZUZpbHRlckJhcigpe2lmKCF0aGlzLnBhcmVudFdpZGdldCgpfHx0aGlzLl9zaG93aW5nV2lkZ2V0KQpyZXR1cm47aWYodGhpcy52aXNpYmxlKCkpe3RoaXMuX3Nob3dpbmdXaWRnZXQ9dHJ1ZTt0aGlzLnNob3dXaWRnZXQoKTt0aGlzLl9zaG93aW5nV2lkZ2V0PWZhbHNlO31lbHNle3RoaXMuaGlkZVdpZGdldCgpO319CmZvY3VzKCl7Zm9yKGxldCBpPTA7aTx0aGlzLl9maWx0ZXJzLmxlbmd0aDsrK2kpe2lmKHRoaXMuX2ZpbHRlcnNbaV1pbnN0YW5jZW9mIFVJLlRleHRGaWx0ZXJVSSl7Y29uc3QgdGV4dEZpbHRlclVJPSh0aGlzLl9maWx0ZXJzW2ldKTt0ZXh0RmlsdGVyVUkuZm9jdXMoKTticmVhazt9fX0KX3VwZGF0ZUZpbHRlckJ1dHRvbigpe2xldCBpc0FjdGl2ZT1mYWxzZTtmb3IoY29uc3QgZmlsdGVyIG9mIHRoaXMuX2ZpbHRlcnMpCmlzQWN0aXZlPWlzQWN0aXZlfHxmaWx0ZXIuaXNBY3RpdmUoKTt0aGlzLl9maWx0ZXJCdXR0b24uc2V0RGVmYXVsdFdpdGhSZWRDb2xvcihpc0FjdGl2ZSk7dGhpcy5fZmlsdGVyQnV0dG9uLnNldFRvZ2dsZVdpdGhSZWRDb2xvcihpc0FjdGl2ZSk7fQpjbGVhcigpe3RoaXMuZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2ZpbHRlcnM9W107dGhpcy5fdXBkYXRlRmlsdGVyQnV0dG9uKCk7fQpzZXR0aW5nKCl7cmV0dXJuIHRoaXMuX3N0YXRlU2V0dGluZzt9CnZpc2libGUoKXtyZXR1cm4gdGhpcy5fYWx3YXlzU2hvd0ZpbHRlcnN8fCh0aGlzLl9zdGF0ZVNldHRpbmcuZ2V0KCkmJnRoaXMuX2VuYWJsZWQpO319O1VJLkZpbHRlclVJPWZ1bmN0aW9uKCl7fTtVSS5GaWx0ZXJVSS5FdmVudHM9e0ZpbHRlckNoYW5nZWQ6U3ltYm9sKCdGaWx0ZXJDaGFuZ2VkJyl9O1VJLkZpbHRlclVJLnByb3RvdHlwZT17aXNBY3RpdmUoKXt9LGVsZW1lbnQoKXt9fTtVSS5UZXh0RmlsdGVyVUk9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9maWx0ZXJFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuX2ZpbHRlckVsZW1lbnQuY2xhc3NOYW1lPSdmaWx0ZXItdGV4dC1maWx0ZXInO3RoaXMuX2ZpbHRlcklucHV0RWxlbWVudD10aGlzLl9maWx0ZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnZmlsdGVyLWlucHV0LWZpZWxkJyk7dGhpcy5fcHJvbXB0PW5ldyBVSS5UZXh0UHJvbXB0KCk7dGhpcy5fcHJvbXB0LmluaXRpYWxpemUodGhpcy5fY29tcGxldGlvbnMuYmluZCh0aGlzKSwnICcpO3RoaXMuX3Byb3h5RWxlbWVudD10aGlzLl9wcm9tcHQuYXR0YWNoKHRoaXMuX2ZpbHRlcklucHV0RWxlbWVudCk7dGhpcy5fcHJveHlFbGVtZW50LnRpdGxlPUNvbW1vbi5VSVN0cmluZygnZS5nLiAvc21hbGxbXFxkXSsvIHVybDphLmNvbS9iJyk7dGhpcy5fcHJvbXB0LnNldFBsYWNlaG9sZGVyKENvbW1vbi5VSVN0cmluZygnRmlsdGVyJykpO3RoaXMuX3Byb21wdC5hZGRFdmVudExpc3RlbmVyKFVJLlRleHRQcm9tcHQuRXZlbnRzLlRleHRDaGFuZ2VkLHRoaXMuX3ZhbHVlQ2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl9zdWdnZXN0aW9uUHJvdmlkZXI9bnVsbDt9Cl9jb21wbGV0aW9ucyhleHByZXNzaW9uLHByZWZpeCxmb3JjZSl7aWYodGhpcy5fc3VnZ2VzdGlvblByb3ZpZGVyKQpyZXR1cm4gdGhpcy5fc3VnZ2VzdGlvblByb3ZpZGVyKGV4cHJlc3Npb24scHJlZml4LGZvcmNlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTt9CmlzQWN0aXZlKCl7cmV0dXJuISF0aGlzLl9wcm9tcHQudGV4dCgpO30KZWxlbWVudCgpe3JldHVybiB0aGlzLl9maWx0ZXJFbGVtZW50O30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fcHJvbXB0LnRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKTt9CnNldFZhbHVlKHZhbHVlKXt0aGlzLl9wcm9tcHQuc2V0VGV4dCh2YWx1ZSk7dGhpcy5fdmFsdWVDaGFuZ2VkKCk7fQpmb2N1cygpe3RoaXMuX2ZpbHRlcklucHV0RWxlbWVudC5mb2N1cygpO30Kc2V0U3VnZ2VzdGlvblByb3ZpZGVyKHN1Z2dlc3Rpb25Qcm92aWRlcil7dGhpcy5fcHJvbXB0LmNsZWFyQXV0b2NvbXBsZXRlKCk7dGhpcy5fc3VnZ2VzdGlvblByb3ZpZGVyPXN1Z2dlc3Rpb25Qcm92aWRlcjt9Cl92YWx1ZUNoYW5nZWQoKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5GaWx0ZXJVSS5FdmVudHMuRmlsdGVyQ2hhbmdlZCxudWxsKTt9fTtVSS5OYW1lZEJpdFNldEZpbHRlclVJPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihpdGVtcyxzZXR0aW5nKXtzdXBlcigpO3RoaXMuX2ZpbHRlcnNFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2ZpbHRlci1iaXRzZXQtZmlsdGVyJyk7dGhpcy5fZmlsdGVyc0VsZW1lbnQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCclc0NsaWNrIHRvIHNlbGVjdCBtdWx0aXBsZSB0eXBlcycsVUkuS2V5Ym9hcmRTaG9ydGN1dC5zaG9ydGN1dFRvU3RyaW5nKCcnLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkN0cmxPck1ldGEpKTt0aGlzLl9hbGxvd2VkVHlwZXM9e307dGhpcy5fdHlwZUZpbHRlckVsZW1lbnRzPXt9O3RoaXMuX2FkZEJpdChVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFUyxDb21tb24uVUlTdHJpbmcoJ0FsbCcpKTt0aGlzLl9maWx0ZXJzRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmlsdGVyLWJpdHNldC1maWx0ZXItZGl2aWRlcicpO2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSkKdGhpcy5fYWRkQml0KGl0ZW1zW2ldLm5hbWUsaXRlbXNbaV0ubGFiZWwsaXRlbXNbaV0udGl0bGUpO2lmKHNldHRpbmcpe3RoaXMuX3NldHRpbmc9c2V0dGluZztzZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3NldHRpbmdDaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuX3NldHRpbmdDaGFuZ2VkKCk7fWVsc2V7dGhpcy5fdG9nZ2xlVHlwZUZpbHRlcihVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFUyxmYWxzZSk7fX0KcmVzZXQoKXt0aGlzLl90b2dnbGVUeXBlRmlsdGVyKFVJLk5hbWVkQml0U2V0RmlsdGVyVUkuQUxMX1RZUEVTLGZhbHNlKTt9CmlzQWN0aXZlKCl7cmV0dXJuIXRoaXMuX2FsbG93ZWRUeXBlc1tVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFU107fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX2ZpbHRlcnNFbGVtZW50O30KYWNjZXB0KHR5cGVOYW1lKXtyZXR1cm4hIXRoaXMuX2FsbG93ZWRUeXBlc1tVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFU118fCEhdGhpcy5fYWxsb3dlZFR5cGVzW3R5cGVOYW1lXTt9Cl9zZXR0aW5nQ2hhbmdlZCgpe2NvbnN0IGFsbG93ZWRUeXBlcz10aGlzLl9zZXR0aW5nLmdldCgpO3RoaXMuX2FsbG93ZWRUeXBlcz17fTtmb3IoY29uc3QgdHlwZU5hbWUgaW4gdGhpcy5fdHlwZUZpbHRlckVsZW1lbnRzKXtpZihhbGxvd2VkVHlwZXNbdHlwZU5hbWVdKQp0aGlzLl9hbGxvd2VkVHlwZXNbdHlwZU5hbWVdPXRydWU7fQp0aGlzLl91cGRhdGUoKTt9Cl91cGRhdGUoKXtpZigoT2JqZWN0LmtleXModGhpcy5fYWxsb3dlZFR5cGVzKS5sZW5ndGg9PT0wKXx8dGhpcy5fYWxsb3dlZFR5cGVzW1VJLk5hbWVkQml0U2V0RmlsdGVyVUkuQUxMX1RZUEVTXSl7dGhpcy5fYWxsb3dlZFR5cGVzPXt9O3RoaXMuX2FsbG93ZWRUeXBlc1tVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFU109dHJ1ZTt9CmZvcihjb25zdCB0eXBlTmFtZSBpbiB0aGlzLl90eXBlRmlsdGVyRWxlbWVudHMpCnRoaXMuX3R5cGVGaWx0ZXJFbGVtZW50c1t0eXBlTmFtZV0uY2xhc3NMaXN0LnRvZ2dsZSgnc2VsZWN0ZWQnLCEhdGhpcy5fYWxsb3dlZFR5cGVzW3R5cGVOYW1lXSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuRmlsdGVyVUkuRXZlbnRzLkZpbHRlckNoYW5nZWQsbnVsbCk7fQpfYWRkQml0KG5hbWUsbGFiZWwsdGl0bGUpe2NvbnN0IHR5cGVGaWx0ZXJFbGVtZW50PXRoaXMuX2ZpbHRlcnNFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyxuYW1lKTt0eXBlRmlsdGVyRWxlbWVudC50eXBlTmFtZT1uYW1lO3R5cGVGaWx0ZXJFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChsYWJlbCk7aWYodGl0bGUpCnR5cGVGaWx0ZXJFbGVtZW50LnRpdGxlPXRpdGxlO3R5cGVGaWx0ZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vblR5cGVGaWx0ZXJDbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3R5cGVGaWx0ZXJFbGVtZW50c1tuYW1lXT10eXBlRmlsdGVyRWxlbWVudDt9Cl9vblR5cGVGaWx0ZXJDbGlja2VkKGUpe2xldCB0b2dnbGU7aWYoSG9zdC5pc01hYygpKQp0b2dnbGU9ZS5tZXRhS2V5JiYhZS5jdHJsS2V5JiYhZS5hbHRLZXkmJiFlLnNoaWZ0S2V5O2Vsc2UKdG9nZ2xlPWUuY3RybEtleSYmIWUubWV0YUtleSYmIWUuYWx0S2V5JiYhZS5zaGlmdEtleTt0aGlzLl90b2dnbGVUeXBlRmlsdGVyKGUudGFyZ2V0LnR5cGVOYW1lLHRvZ2dsZSk7fQpfdG9nZ2xlVHlwZUZpbHRlcih0eXBlTmFtZSxhbGxvd011bHRpU2VsZWN0KXtpZihhbGxvd011bHRpU2VsZWN0JiZ0eXBlTmFtZSE9PVVJLk5hbWVkQml0U2V0RmlsdGVyVUkuQUxMX1RZUEVTKQp0aGlzLl9hbGxvd2VkVHlwZXNbVUkuTmFtZWRCaXRTZXRGaWx0ZXJVSS5BTExfVFlQRVNdPWZhbHNlO2Vsc2UKdGhpcy5fYWxsb3dlZFR5cGVzPXt9O3RoaXMuX2FsbG93ZWRUeXBlc1t0eXBlTmFtZV09IXRoaXMuX2FsbG93ZWRUeXBlc1t0eXBlTmFtZV07aWYodGhpcy5fc2V0dGluZykKdGhpcy5fc2V0dGluZy5zZXQodGhpcy5fYWxsb3dlZFR5cGVzKTtlbHNlCnRoaXMuX3VwZGF0ZSgpO319O1VJLk5hbWVkQml0U2V0RmlsdGVyVUkuSXRlbTtVSS5OYW1lZEJpdFNldEZpbHRlclVJLkFMTF9UWVBFUz0nYWxsJztVSS5DaGVja2JveEZpbHRlclVJPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihjbGFzc05hbWUsdGl0bGUsYWN0aXZlV2hlbkNoZWNrZWQsc2V0dGluZyl7c3VwZXIoKTt0aGlzLl9maWx0ZXJFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2ZpbHRlci1jaGVja2JveC1maWx0ZXInKTt0aGlzLl9hY3RpdmVXaGVuQ2hlY2tlZD0hIWFjdGl2ZVdoZW5DaGVja2VkO3RoaXMuX2xhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKHRpdGxlKTt0aGlzLl9maWx0ZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2xhYmVsKTt0aGlzLl9jaGVja2JveEVsZW1lbnQ9dGhpcy5fbGFiZWwuY2hlY2tib3hFbGVtZW50O2lmKHNldHRpbmcpClVJLlNldHRpbmdzVUkuYmluZENoZWNrYm94KHRoaXMuX2NoZWNrYm94RWxlbWVudCxzZXR0aW5nKTtlbHNlCnRoaXMuX2NoZWNrYm94RWxlbWVudC5jaGVja2VkPXRydWU7dGhpcy5fY2hlY2tib3hFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsdGhpcy5fZmlyZVVwZGF0ZWQuYmluZCh0aGlzKSxmYWxzZSk7fQppc0FjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmVXaGVuQ2hlY2tlZD09PXRoaXMuX2NoZWNrYm94RWxlbWVudC5jaGVja2VkO30KY2hlY2tlZCgpe3JldHVybiB0aGlzLl9jaGVja2JveEVsZW1lbnQuY2hlY2tlZDt9CnNldENoZWNrZWQoY2hlY2tlZCl7dGhpcy5fY2hlY2tib3hFbGVtZW50LmNoZWNrZWQ9Y2hlY2tlZDt9CmVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZmlsdGVyRWxlbWVudDt9CmxhYmVsRWxlbWVudCgpe3JldHVybiB0aGlzLl9sYWJlbDt9Cl9maXJlVXBkYXRlZCgpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLkZpbHRlclVJLkV2ZW50cy5GaWx0ZXJDaGFuZ2VkLG51bGwpO30Kc2V0Q29sb3IoYmFja2dyb3VuZENvbG9yLGJvcmRlckNvbG9yKXt0aGlzLl9sYWJlbC5iYWNrZ3JvdW5kQ29sb3I9YmFja2dyb3VuZENvbG9yO3RoaXMuX2xhYmVsLmJvcmRlckNvbG9yPWJvcmRlckNvbG9yO319OztVSS5GaWx0ZXJTdWdnZXN0aW9uQnVpbGRlcj1jbGFzc3tjb25zdHJ1Y3RvcihrZXlzLHZhbHVlU29ydGVyKXt0aGlzLl9rZXlzPWtleXM7dGhpcy5fdmFsdWVTb3J0ZXI9dmFsdWVTb3J0ZXJ8fCgoa2V5LHJlc3VsdCk9PnJlc3VsdC5zb3J0KCkpO3RoaXMuX3ZhbHVlc01hcD1uZXcgTWFwKCk7fQpjb21wbGV0aW9ucyhleHByZXNzaW9uLHByZWZpeCxmb3JjZSl7aWYoIXByZWZpeCYmIWZvcmNlKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtjb25zdCBuZWdhdGl2ZT1wcmVmaXguc3RhcnRzV2l0aCgnLScpO2lmKG5lZ2F0aXZlKQpwcmVmaXg9cHJlZml4LnN1YnN0cmluZygxKTtjb25zdCBtb2RpZmllcj1uZWdhdGl2ZT8nLSc6Jyc7Y29uc3QgdmFsdWVEZWxpbWl0ZXJJbmRleD1wcmVmaXguaW5kZXhPZignOicpO2NvbnN0IHN1Z2dlc3Rpb25zPVtdO2lmKHZhbHVlRGVsaW1pdGVySW5kZXg9PT0tMSl7Y29uc3QgbWF0Y2hlcj1uZXcgUmVnRXhwKCdeJytwcmVmaXguZXNjYXBlRm9yUmVnRXhwKCksJ2knKTtmb3IoY29uc3Qga2V5IG9mIHRoaXMuX2tleXMpe2lmKG1hdGNoZXIudGVzdChrZXkpKQpzdWdnZXN0aW9ucy5wdXNoKHt0ZXh0Om1vZGlmaWVyK2tleSsnOid9KTt9fWVsc2V7Y29uc3Qga2V5PXByZWZpeC5zdWJzdHJpbmcoMCx2YWx1ZURlbGltaXRlckluZGV4KS50b0xvd2VyQ2FzZSgpO2NvbnN0IHZhbHVlPXByZWZpeC5zdWJzdHJpbmcodmFsdWVEZWxpbWl0ZXJJbmRleCsxKTtjb25zdCBtYXRjaGVyPW5ldyBSZWdFeHAoJ14nK3ZhbHVlLmVzY2FwZUZvclJlZ0V4cCgpLCdpJyk7Y29uc3QgdmFsdWVzPUFycmF5LmZyb20odGhpcy5fdmFsdWVzTWFwLmdldChrZXkpfHxuZXcgU2V0KCkpO3RoaXMuX3ZhbHVlU29ydGVyKGtleSx2YWx1ZXMpO2Zvcihjb25zdCBpdGVtIG9mIHZhbHVlcyl7aWYobWF0Y2hlci50ZXN0KGl0ZW0pJiYoaXRlbSE9PXZhbHVlKSkKc3VnZ2VzdGlvbnMucHVzaCh7dGV4dDptb2RpZmllcitrZXkrJzonK2l0ZW19KTt9fQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN1Z2dlc3Rpb25zKTt9CmFkZEl0ZW0oa2V5LHZhbHVlKXtpZighdmFsdWUpCnJldHVybjtpZighdGhpcy5fdmFsdWVzTWFwLmdldChrZXkpKQp0aGlzLl92YWx1ZXNNYXAuc2V0KGtleSwobmV3IFNldCgpKSk7dGhpcy5fdmFsdWVzTWFwLmdldChrZXkpLmFkZCh2YWx1ZSk7fQpjbGVhcigpe3RoaXMuX3ZhbHVlc01hcC5jbGVhcigpO319OztVSS5Gb3J3YXJkZWRJbnB1dEV2ZW50SGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLktleUV2ZW50VW5oYW5kbGVkLHRoaXMuX29uS2V5RXZlbnRVbmhhbmRsZWQsdGhpcyk7fQpfb25LZXlFdmVudFVuaGFuZGxlZChldmVudCl7Y29uc3QgZGF0YT1ldmVudC5kYXRhO2NvbnN0IHR5cGU9KGRhdGEudHlwZSk7Y29uc3Qga2V5PShkYXRhLmtleSk7Y29uc3Qga2V5Q29kZT0oZGF0YS5rZXlDb2RlKTtjb25zdCBtb2RpZmllcnM9KGRhdGEubW9kaWZpZXJzKTtpZih0eXBlIT09J2tleWRvd24nKQpyZXR1cm47VUkuY29udGV4dC5zZXRGbGF2b3IoVUkuU2hvcnRjdXRSZWdpc3RyeS5Gb3J3YXJkZWRTaG9ydGN1dCxVSS5TaG9ydGN1dFJlZ2lzdHJ5LkZvcndhcmRlZFNob3J0Y3V0Lmluc3RhbmNlKTtVSS5zaG9ydGN1dFJlZ2lzdHJ5LmhhbmRsZUtleShVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXkoa2V5Q29kZSxtb2RpZmllcnMpLGtleSk7VUkuY29udGV4dC5zZXRGbGF2b3IoVUkuU2hvcnRjdXRSZWdpc3RyeS5Gb3J3YXJkZWRTaG9ydGN1dCxudWxsKTt9fTtVSS5mb3J3YXJkZWRFdmVudEhhbmRsZXI9bmV3IFVJLkZvcndhcmRlZElucHV0RXZlbnRIYW5kbGVyKCk7O1VJLkZyYWdtZW50PWNsYXNze2NvbnN0cnVjdG9yKGVsZW1lbnQpe3RoaXMuX2VsZW1lbnQ9ZWxlbWVudDt0aGlzLl9lbGVtZW50c0J5SWQ9bmV3IE1hcCgpO30KZWxlbWVudCgpe3JldHVybiB0aGlzLl9lbGVtZW50O30KJChlbGVtZW50SWQpe3JldHVybiB0aGlzLl9lbGVtZW50c0J5SWQuZ2V0KGVsZW1lbnRJZCk7fQpzdGF0aWMgYnVpbGQoc3RyaW5ncywuLi52YWx1ZXMpe3JldHVybiBVSS5GcmFnbWVudC5fcmVuZGVyKFVJLkZyYWdtZW50Ll90ZW1wbGF0ZShzdHJpbmdzKSx2YWx1ZXMpO30Kc3RhdGljIGNhY2hlZChzdHJpbmdzLC4uLnZhbHVlcyl7bGV0IHRlbXBsYXRlPVVJLkZyYWdtZW50Ll90ZW1wbGF0ZUNhY2hlLmdldChzdHJpbmdzKTtpZighdGVtcGxhdGUpe3RlbXBsYXRlPVVJLkZyYWdtZW50Ll90ZW1wbGF0ZShzdHJpbmdzKTtVSS5GcmFnbWVudC5fdGVtcGxhdGVDYWNoZS5zZXQoc3RyaW5ncyx0ZW1wbGF0ZSk7fQpyZXR1cm4gVUkuRnJhZ21lbnQuX3JlbmRlcih0ZW1wbGF0ZSx2YWx1ZXMpO30Kc3RhdGljIF90ZW1wbGF0ZShzdHJpbmdzKXtsZXQgaHRtbD0nJztsZXQgaW5zaWRlVGV4dD10cnVlO2ZvcihsZXQgaT0wO2k8c3RyaW5ncy5sZW5ndGgtMTtpKyspe2h0bWwrPXN0cmluZ3NbaV07Y29uc3QgY2xvc2U9c3RyaW5nc1tpXS5sYXN0SW5kZXhPZignPicpO2NvbnN0IG9wZW49c3RyaW5nc1tpXS5pbmRleE9mKCc8JyxjbG9zZSsxKTtpZihjbG9zZSE9PS0xJiZvcGVuPT09LTEpCmluc2lkZVRleHQ9dHJ1ZTtlbHNlIGlmKG9wZW4hPT0tMSkKaW5zaWRlVGV4dD1mYWxzZTtodG1sKz1pbnNpZGVUZXh0P1VJLkZyYWdtZW50Ll90ZXh0TWFya2VyOlVJLkZyYWdtZW50Ll9hdHRyaWJ1dGVNYXJrZXIoaSk7fQpodG1sKz1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO2NvbnN0IHRlbXBsYXRlPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO3RlbXBsYXRlLmlubmVySFRNTD1odG1sO2NvbnN0IHdhbGtlcj10ZW1wbGF0ZS5vd25lckRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodGVtcGxhdGUuY29udGVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVHxOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLGZhbHNlKTtsZXQgdmFsdWVJbmRleD0wO2NvbnN0IGVtcHR5VGV4dE5vZGVzPVtdO2NvbnN0IGJpbmRzPVtdO2NvbnN0IG5vZGVzVG9NYXJrPVtdO3doaWxlKHdhbGtlci5uZXh0Tm9kZSgpKXtjb25zdCBub2RlPXdhbGtlci5jdXJyZW50Tm9kZTtpZihub2RlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJm5vZGUuaGFzQXR0cmlidXRlcygpKXtpZihub2RlLmhhc0F0dHJpYnV0ZSgnJCcpKXtub2Rlc1RvTWFyay5wdXNoKG5vZGUpO2JpbmRzLnB1c2goe2VsZW1lbnRJZDpub2RlLmdldEF0dHJpYnV0ZSgnJCcpfSk7bm9kZS5yZW1vdmVBdHRyaWJ1dGUoJyQnKTt9CmNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZT1bXTtmb3IobGV0IGk9MDtpPG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXtjb25zdCBuYW1lPW5vZGUuYXR0cmlidXRlc1tpXS5uYW1lO2lmKCFVSS5GcmFnbWVudC5fYXR0cmlidXRlTWFya2VyUmVnZXgudGVzdChuYW1lKSYmIVVJLkZyYWdtZW50Ll9hdHRyaWJ1dGVNYXJrZXJSZWdleC50ZXN0KG5vZGUuYXR0cmlidXRlc1tpXS52YWx1ZSkpCmNvbnRpbnVlO2F0dHJpYnV0ZXNUb1JlbW92ZS5wdXNoKG5hbWUpO25vZGVzVG9NYXJrLnB1c2gobm9kZSk7Y29uc3QgYmluZD17YXR0cjp7aW5kZXg6dmFsdWVJbmRleH19O2JpbmQuYXR0ci5uYW1lcz1uYW1lLnNwbGl0KFVJLkZyYWdtZW50Ll9hdHRyaWJ1dGVNYXJrZXJSZWdleCk7dmFsdWVJbmRleCs9YmluZC5hdHRyLm5hbWVzLmxlbmd0aC0xO2JpbmQuYXR0ci52YWx1ZXM9bm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlLnNwbGl0KFVJLkZyYWdtZW50Ll9hdHRyaWJ1dGVNYXJrZXJSZWdleCk7dmFsdWVJbmRleCs9YmluZC5hdHRyLnZhbHVlcy5sZW5ndGgtMTtiaW5kcy5wdXNoKGJpbmQpO30KZm9yKGxldCBpPTA7aTxhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoO2krKykKbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlc1RvUmVtb3ZlW2ldKTt9CmlmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmbm9kZS5kYXRhLmluZGV4T2YoVUkuRnJhZ21lbnQuX3RleHRNYXJrZXIpIT09LTEpe2NvbnN0IHRleHRzPW5vZGUuZGF0YS5zcGxpdChVSS5GcmFnbWVudC5fdGV4dE1hcmtlclJlZ2V4KTtub2RlLmRhdGE9dGV4dHNbdGV4dHMubGVuZ3RoLTFdO2ZvcihsZXQgaT0wO2k8dGV4dHMubGVuZ3RoLTE7aSsrKXtpZih0ZXh0c1tpXSkKbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjcmVhdGVUZXh0Tm9kZSh0ZXh0c1tpXSksbm9kZSk7Y29uc3Qgbm9kZVRvUmVwbGFjZT1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bm9kZXNUb01hcmsucHVzaChub2RlVG9SZXBsYWNlKTtiaW5kcy5wdXNoKHtyZXBsYWNlTm9kZUluZGV4OnZhbHVlSW5kZXgrK30pO25vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZVRvUmVwbGFjZSxub2RlKTt9fQppZihub2RlLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUmJighbm9kZS5wcmV2aW91c1NpYmxpbmd8fG5vZGUucHJldmlvdXNTaWJsaW5nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpJiYoIW5vZGUubmV4dFNpYmxpbmd8fG5vZGUubmV4dFNpYmxpbmcubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJi9eXHMqJC8udGVzdChub2RlLmRhdGEpKQplbXB0eVRleHROb2Rlcy5wdXNoKG5vZGUpO30KZm9yKGxldCBpPTA7aTxub2Rlc1RvTWFyay5sZW5ndGg7aSsrKQpub2Rlc1RvTWFya1tpXS5jbGFzc0xpc3QuYWRkKFVJLkZyYWdtZW50Ll9jbGFzcyhpKSk7Zm9yKGNvbnN0IGVtcHR5VGV4dE5vZGUgb2YgZW1wdHlUZXh0Tm9kZXMpCmVtcHR5VGV4dE5vZGUucmVtb3ZlKCk7cmV0dXJue3RlbXBsYXRlOnRlbXBsYXRlLGJpbmRzOmJpbmRzfTt9CnN0YXRpYyBfcmVuZGVyKHRlbXBsYXRlLHZhbHVlcyl7Y29uc3QgY29udGVudD10ZW1wbGF0ZS50ZW1wbGF0ZS5vd25lckRvY3VtZW50LmltcG9ydE5vZGUodGVtcGxhdGUudGVtcGxhdGUuY29udGVudCx0cnVlKTtjb25zdCByZXN1bHRFbGVtZW50PShjb250ZW50LmZpcnN0Q2hpbGQ9PT1jb250ZW50Lmxhc3RDaGlsZD9jb250ZW50LmZpcnN0Q2hpbGQ6Y29udGVudCk7Y29uc3QgcmVzdWx0PW5ldyBVSS5GcmFnbWVudChyZXN1bHRFbGVtZW50KTtjb25zdCBib3VuZEVsZW1lbnRzPVtdO2ZvcihsZXQgaT0wO2k8dGVtcGxhdGUuYmluZHMubGVuZ3RoO2krKyl7Y29uc3QgY2xhc3NOYW1lPVVJLkZyYWdtZW50Ll9jbGFzcyhpKTtjb25zdCBlbGVtZW50PShjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2NsYXNzTmFtZSkpO2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO2JvdW5kRWxlbWVudHMucHVzaChlbGVtZW50KTt9CmZvcihsZXQgYmluZEluZGV4PTA7YmluZEluZGV4PHRlbXBsYXRlLmJpbmRzLmxlbmd0aDtiaW5kSW5kZXgrKyl7Y29uc3QgYmluZD10ZW1wbGF0ZS5iaW5kc1tiaW5kSW5kZXhdO2NvbnN0IGVsZW1lbnQ9Ym91bmRFbGVtZW50c1tiaW5kSW5kZXhdO2lmKCdlbGVtZW50SWQnaW4gYmluZCl7cmVzdWx0Ll9lbGVtZW50c0J5SWQuc2V0KChiaW5kLmVsZW1lbnRJZCksZWxlbWVudCk7fWVsc2UgaWYoJ3JlcGxhY2VOb2RlSW5kZXgnaW4gYmluZCl7Y29uc3QgdmFsdWU9dmFsdWVzWyhiaW5kLnJlcGxhY2VOb2RlSW5kZXgpXTtlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuX25vZGVGb3JWYWx1ZSh2YWx1ZSksZWxlbWVudCk7fWVsc2UgaWYoJ2F0dHInaW4gYmluZCl7aWYoYmluZC5hdHRyLm5hbWVzLmxlbmd0aD09PTImJmJpbmQuYXR0ci52YWx1ZXMubGVuZ3RoPT09MSYmdHlwZW9mIHZhbHVlc1tiaW5kLmF0dHIuaW5kZXhdPT09J2Z1bmN0aW9uJyl7dmFsdWVzW2JpbmQuYXR0ci5pbmRleF0uY2FsbChudWxsLGVsZW1lbnQpO31lbHNle2xldCBuYW1lPWJpbmQuYXR0ci5uYW1lc1swXTtmb3IobGV0IGk9MTtpPGJpbmQuYXR0ci5uYW1lcy5sZW5ndGg7aSsrKXtuYW1lKz12YWx1ZXNbYmluZC5hdHRyLmluZGV4K2ktMV07bmFtZSs9YmluZC5hdHRyLm5hbWVzW2ldO30KaWYobmFtZSl7bGV0IHZhbHVlPWJpbmQuYXR0ci52YWx1ZXNbMF07Zm9yKGxldCBpPTE7aTxiaW5kLmF0dHIudmFsdWVzLmxlbmd0aDtpKyspe3ZhbHVlKz12YWx1ZXNbYmluZC5hdHRyLmluZGV4K2JpbmQuYXR0ci5uYW1lcy5sZW5ndGgtMStpLTFdO3ZhbHVlKz1iaW5kLmF0dHIudmFsdWVzW2ldO30KZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSk7fX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgYmluZCcpO319CnJldHVybiByZXN1bHQ7fQpzdGF0aWMgX25vZGVGb3JWYWx1ZSh2YWx1ZSl7aWYodmFsdWUgaW5zdGFuY2VvZiBOb2RlKQpyZXR1cm4gdmFsdWU7aWYodmFsdWUgaW5zdGFuY2VvZiBVSS5GcmFnbWVudCkKcmV0dXJuIHZhbHVlLl9lbGVtZW50O2lmKEFycmF5LmlzQXJyYXkodmFsdWUpKXtjb25zdCBub2RlPWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IoY29uc3QgdiBvZiB2YWx1ZSkKbm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9ub2RlRm9yVmFsdWUodikpO3JldHVybiBub2RlO30KcmV0dXJuIGNyZWF0ZVRleHROb2RlKCcnK3ZhbHVlKTt9fTtVSS5GcmFnbWVudC5fVGVtcGxhdGU7VUkuRnJhZ21lbnQuX0JpbmQ7VUkuRnJhZ21lbnQuX3RleHRNYXJrZXI9J3t7dGVtcGxhdGUtdGV4dH19JztVSS5GcmFnbWVudC5fdGV4dE1hcmtlclJlZ2V4PS97e3RlbXBsYXRlLXRleHR9fS87VUkuRnJhZ21lbnQuX2F0dHJpYnV0ZU1hcmtlcj1pbmRleD0+J3RlbXBsYXRlLWF0dHJpYnV0ZScraW5kZXg7VUkuRnJhZ21lbnQuX2F0dHJpYnV0ZU1hcmtlclJlZ2V4PS90ZW1wbGF0ZS1hdHRyaWJ1dGVcZCsvO1VJLkZyYWdtZW50Ll9jbGFzcz1pbmRleD0+J3RlbXBsYXRlLWNsYXNzLScraW5kZXg7VUkuRnJhZ21lbnQuX3RlbXBsYXRlQ2FjaGU9bmV3IE1hcCgpO1VJLmh0bWw9KHN0cmluZ3MsLi4udmFyYXJnKT0+e3JldHVybiBVSS5GcmFnbWVudC5jYWNoZWQoc3RyaW5ncywuLi52YXJhcmcpLmVsZW1lbnQoKTt9OztVSS5IaXN0b3J5SW5wdXQ9Y2xhc3MgZXh0ZW5kcyBIVE1MSW5wdXRFbGVtZW50e3N0YXRpYyBjcmVhdGUoKXtpZighVUkuSGlzdG9yeUlucHV0Ll9jb25zdHJ1Y3RvcikKVUkuSGlzdG9yeUlucHV0Ll9jb25zdHJ1Y3Rvcj1VSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2lucHV0JywnaGlzdG9yeS1pbnB1dCcsVUkuSGlzdG9yeUlucHV0LnByb3RvdHlwZSk7cmV0dXJuKG5ldyBVSS5IaXN0b3J5SW5wdXQuX2NvbnN0cnVjdG9yKCkpO30KY3JlYXRlZENhbGxiYWNrKCl7dGhpcy5faGlzdG9yeT1bJyddO3RoaXMuX2hpc3RvcnlQb3NpdGlvbj0wO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKSxmYWxzZSk7fQpfb25JbnB1dChldmVudCl7aWYodGhpcy5faGlzdG9yeS5sZW5ndGg9PT10aGlzLl9oaXN0b3J5UG9zaXRpb24rMSkKdGhpcy5faGlzdG9yeVt0aGlzLl9oaXN0b3J5Lmxlbmd0aC0xXT10aGlzLnZhbHVlO30KX29uS2V5RG93bihldmVudCl7aWYoZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5VcC5jb2RlKXt0aGlzLl9oaXN0b3J5UG9zaXRpb249TWF0aC5tYXgodGhpcy5faGlzdG9yeVBvc2l0aW9uLTEsMCk7dGhpcy52YWx1ZT10aGlzLl9oaXN0b3J5W3RoaXMuX2hpc3RvcnlQb3NpdGlvbl07dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLHsnYnViYmxlcyc6dHJ1ZSwnY2FuY2VsYWJsZSc6dHJ1ZX0pKTtldmVudC5jb25zdW1lKHRydWUpO31lbHNlIGlmKGV2ZW50LmtleUNvZGU9PT1VSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRG93bi5jb2RlKXt0aGlzLl9oaXN0b3J5UG9zaXRpb249TWF0aC5taW4odGhpcy5faGlzdG9yeVBvc2l0aW9uKzEsdGhpcy5faGlzdG9yeS5sZW5ndGgtMSk7dGhpcy52YWx1ZT10aGlzLl9oaXN0b3J5W3RoaXMuX2hpc3RvcnlQb3NpdGlvbl07dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLHsnYnViYmxlcyc6dHJ1ZSwnY2FuY2VsYWJsZSc6dHJ1ZX0pKTtldmVudC5jb25zdW1lKHRydWUpO31lbHNlIGlmKGV2ZW50LmtleUNvZGU9PT1VSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRW50ZXIuY29kZSl7dGhpcy5fc2F2ZVRvSGlzdG9yeSgpO319Cl9zYXZlVG9IaXN0b3J5KCl7aWYodGhpcy5faGlzdG9yeS5sZW5ndGg+MSYmdGhpcy5faGlzdG9yeVt0aGlzLl9oaXN0b3J5Lmxlbmd0aC0yXT09PXRoaXMudmFsdWUpCnJldHVybjt0aGlzLl9oaXN0b3J5W3RoaXMuX2hpc3RvcnkubGVuZ3RoLTFdPXRoaXMudmFsdWU7dGhpcy5faGlzdG9yeVBvc2l0aW9uPXRoaXMuX2hpc3RvcnkubGVuZ3RoLTE7dGhpcy5faGlzdG9yeS5wdXNoKCcnKTt9fTs7VUkuSWNvbj1jbGFzcyBleHRlbmRzIEhUTUxTcGFuRWxlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhyb3cgbmV3IEVycm9yKCdpY29uIG11c3QgYmUgY3JlYXRlZCB2aWEgZmFjdG9yeSBtZXRob2QuJyk7fQpzdGF0aWMgY3JlYXRlKGljb25UeXBlLGNsYXNzTmFtZSl7aWYoIVVJLkljb24uX2NvbnN0cnVjdG9yKQpVSS5JY29uLl9jb25zdHJ1Y3Rvcj1VSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ3NwYW4nLCd1aS1pY29uJyxVSS5JY29uLnByb3RvdHlwZSk7Y29uc3QgaWNvbj0obmV3IFVJLkljb24uX2NvbnN0cnVjdG9yKCkpO2lmKGNsYXNzTmFtZSkKaWNvbi5jbGFzc05hbWU9Y2xhc3NOYW1lO2lmKGljb25UeXBlKQppY29uLnNldEljb25UeXBlKGljb25UeXBlKTtyZXR1cm4gaWNvbjt9CmNyZWF0ZWRDYWxsYmFjaygpe3RoaXMuX2Rlc2NyaXB0b3I9bnVsbDt0aGlzLl9zcHJpdGVTaGVldD1udWxsO3RoaXMuX2ljb25UeXBlPScnO30Kc2V0SWNvblR5cGUoaWNvblR5cGUpe2lmKHRoaXMuX2Rlc2NyaXB0b3Ipe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tc3ByaXRlc2hlZXQtcG9zaXRpb24nKTt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO3RoaXMuX3RvZ2dsZUNsYXNzZXMoZmFsc2UpO3RoaXMuX2ljb25UeXBlPScnO3RoaXMuX2Rlc2NyaXB0b3I9bnVsbDt0aGlzLl9zcHJpdGVTaGVldD1udWxsO30KY29uc3QgZGVzY3JpcHRvcj1VSS5JY29uLkRlc2NyaXB0b3JzW2ljb25UeXBlXXx8bnVsbDtpZihkZXNjcmlwdG9yKXt0aGlzLl9pY29uVHlwZT1pY29uVHlwZTt0aGlzLl9kZXNjcmlwdG9yPWRlc2NyaXB0b3I7dGhpcy5fc3ByaXRlU2hlZXQ9VUkuSWNvbi5TcHJpdGVTaGVldHNbdGhpcy5fZGVzY3JpcHRvci5zcHJpdGVzaGVldF07Y29uc29sZS5hc3NlcnQodGhpcy5fc3ByaXRlU2hlZXQsYEVSUk9SOiBpY29uICR7dGhpcy5faWNvblR5cGV9IGhhcyB1bmtub3duIHNwcml0ZXNoZWV0OiAke3RoaXMuX2Rlc2NyaXB0b3Iuc3ByaXRlc2hlZXR9YCk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zcHJpdGVzaGVldC1wb3NpdGlvbicsdGhpcy5fcHJvcGVydHlWYWx1ZSgpKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsdGhpcy5fc3ByaXRlU2hlZXQuY2VsbFdpZHRoKydweCcpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsdGhpcy5fc3ByaXRlU2hlZXQuY2VsbEhlaWdodCsncHgnKTt0aGlzLl90b2dnbGVDbGFzc2VzKHRydWUpO31lbHNlIGlmKGljb25UeXBlKXt0aHJvdyBuZXcgRXJyb3IoYEVSUk9SOiBmYWlsZWQgdG8gZmluZCBpY29uIGRlc2NyaXB0b3IgZm9yIHR5cGU6ICR7aWNvblR5cGV9YCk7fX0KX3RvZ2dsZUNsYXNzZXModmFsdWUpe3RoaXMuY2xhc3NMaXN0LnRvZ2dsZSgnc3ByaXRlc2hlZXQtJyt0aGlzLl9kZXNjcmlwdG9yLnNwcml0ZXNoZWV0LHZhbHVlKTt0aGlzLmNsYXNzTGlzdC50b2dnbGUodGhpcy5faWNvblR5cGUsdmFsdWUpO3RoaXMuY2xhc3NMaXN0LnRvZ2dsZSgnaWNvbi1tYXNrJyx2YWx1ZSYmISF0aGlzLl9kZXNjcmlwdG9yLmlzTWFzayk7dGhpcy5jbGFzc0xpc3QudG9nZ2xlKCdpY29uLWludmVydCcsdmFsdWUmJiEhdGhpcy5fZGVzY3JpcHRvci5pbnZlcnQpO30KX3Byb3BlcnR5VmFsdWUoKXtpZighdGhpcy5fZGVzY3JpcHRvci5jb29yZGluYXRlcyl7aWYoIXRoaXMuX2Rlc2NyaXB0b3IucG9zaXRpb258fCFVSS5JY29uLl9wb3NpdGlvblJlZ2V4LnRlc3QodGhpcy5fZGVzY3JpcHRvci5wb3NpdGlvbikpCnRocm93IG5ldyBFcnJvcihgRVJST1I6IGljb24gJyR7dGhpcy5faWNvblR5cGV9JyBoYXMgbWFsZm9ybWVkIHBvc2l0aW9uOiAnJHt0aGlzLl9kZXNjcmlwdG9yLnBvc2l0aW9ufSdgKTtjb25zdCBjb2x1bW49dGhpcy5fZGVzY3JpcHRvci5wb3NpdGlvblswXS50b0xvd2VyQ2FzZSgpLmNoYXJDb2RlQXQoMCktOTc7Y29uc3Qgcm93PXBhcnNlSW50KHRoaXMuX2Rlc2NyaXB0b3IucG9zaXRpb24uc3Vic3RyaW5nKDEpLDEwKS0xO3RoaXMuX2Rlc2NyaXB0b3IuY29vcmRpbmF0ZXM9e3g6LSh0aGlzLl9zcHJpdGVTaGVldC5jZWxsV2lkdGgrdGhpcy5fc3ByaXRlU2hlZXQucGFkZGluZykqY29sdW1uLHk6KHRoaXMuX3Nwcml0ZVNoZWV0LmNlbGxIZWlnaHQrdGhpcy5fc3ByaXRlU2hlZXQucGFkZGluZykqKHJvdysxKS10aGlzLl9zcHJpdGVTaGVldC5wYWRkaW5nfTt9CnJldHVybmAke3RoaXMuX2Rlc2NyaXB0b3IuY29vcmRpbmF0ZXMueH1weCAke3RoaXMuX2Rlc2NyaXB0b3IuY29vcmRpbmF0ZXMueX1weGA7fX07VUkuSWNvbi5fcG9zaXRpb25SZWdleD0vXlthLXpdWzEtOV1bMC05XSokLztVSS5JY29uLkRlc2NyaXB0b3I7VUkuSWNvbi5TcHJpdGVTaGVldDtVSS5JY29uLlNwcml0ZVNoZWV0cz17J3NtYWxsaWNvbnMnOntjZWxsV2lkdGg6MTAsY2VsbEhlaWdodDoxMCxwYWRkaW5nOjEwfSwnbWVkaXVtaWNvbnMnOntjZWxsV2lkdGg6MTYsY2VsbEhlaWdodDoxNixwYWRkaW5nOjB9LCdsYXJnZWljb25zJzp7Y2VsbFdpZHRoOjI4LGNlbGxIZWlnaHQ6MjQscGFkZGluZzowfSwnYXJyb3dpY29ucyc6e2NlbGxXaWR0aDoxOSxjZWxsSGVpZ2h0OjE5LHBhZGRpbmc6MH19O1VJLkljb24uRGVzY3JpcHRvcnM9eydzbWFsbGljb24tYmV6aWVyJzp7cG9zaXRpb246J2E1JyxzcHJpdGVzaGVldDonc21hbGxpY29ucycsaXNNYXNrOnRydWV9LCdzbWFsbGljb24tY2hlY2ttYXJrJzp7cG9zaXRpb246J2I1JyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24tY2hlY2ttYXJrLXNxdWFyZSc6e3Bvc2l0aW9uOidiNicsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnLGlzTWFzazp0cnVlfSwnc21hbGxpY29uLWNoZWNrbWFyay1iZWhpbmQnOntwb3NpdGlvbjonZDYnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJyxpc01hc2s6dHJ1ZX0sJ3NtYWxsaWNvbi1jb21tYW5kLXJlc3VsdCc6e3Bvc2l0aW9uOidhNCcsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLWNvbnRyYXN0LXJhdGlvJzp7cG9zaXRpb246J2E2JyxzcHJpdGVzaGVldDonc21hbGxpY29ucycsaXNNYXNrOnRydWV9LCdzbWFsbGljb24tY3Jvc3MnOntwb3NpdGlvbjonYjQnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1kZXZpY2UnOntwb3NpdGlvbjonYzUnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1lcnJvcic6e3Bvc2l0aW9uOidjNCcsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLWV4cGFuZC1sZXNzJzp7cG9zaXRpb246J2Y1JyxzcHJpdGVzaGVldDonc21hbGxpY29ucycsaXNNYXNrOnRydWV9LCdzbWFsbGljb24tZXhwYW5kLW1vcmUnOntwb3NpdGlvbjonZTYnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJyxpc01hc2s6dHJ1ZX0sJ3NtYWxsaWNvbi1ncmVlbi1hcnJvdyc6e3Bvc2l0aW9uOidhMycsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLWdyZWVuLWJhbGwnOntwb3NpdGlvbjonYjMnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1pbmZvJzp7cG9zaXRpb246J2MzJyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24taW5saW5lLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwnOntwb3NpdGlvbjonZDQnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1pbmxpbmUtYnJlYWtwb2ludCc6e3Bvc2l0aW9uOidkNScsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLW5vJzp7cG9zaXRpb246J2M2JyxzcHJpdGVzaGVldDonc21hbGxpY29ucycsaXNNYXNrOnRydWV9LCdzbWFsbGljb24tb3JhbmdlLWJhbGwnOntwb3NpdGlvbjonZDMnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1yZWQtYmFsbCc6e3Bvc2l0aW9uOidhMicsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLXNoYWRvdyc6e3Bvc2l0aW9uOidiMicsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnLGlzTWFzazp0cnVlfSwnc21hbGxpY29uLXN0ZXAtaW4nOntwb3NpdGlvbjonYzInLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1zdGVwLW91dCc6e3Bvc2l0aW9uOidkMicsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLXRleHQtcHJvbXB0Jzp7cG9zaXRpb246J2U1JyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24tdGhpY2stbGVmdC1hcnJvdyc6e3Bvc2l0aW9uOidlNCcsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLXRoaWNrLXJpZ2h0LWFycm93Jzp7cG9zaXRpb246J2UzJyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24tdHJpYW5nbGUtZG93bic6e3Bvc2l0aW9uOidlMicsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnLGlzTWFzazp0cnVlfSwnc21hbGxpY29uLXRyaWFuZ2xlLXJpZ2h0Jzp7cG9zaXRpb246J2ExJyxzcHJpdGVzaGVldDonc21hbGxpY29ucycsaXNNYXNrOnRydWV9LCdzbWFsbGljb24tdHJpYW5nbGUtdXAnOntwb3NpdGlvbjonYjEnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJyxpc01hc2s6dHJ1ZX0sJ3NtYWxsaWNvbi11c2VyLWNvbW1hbmQnOntwb3NpdGlvbjonYzEnLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi13YXJuaW5nJzp7cG9zaXRpb246J2QxJyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24tbmV0d29yay1wcm9kdWN0Jzp7cG9zaXRpb246J2UxJyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdzbWFsbGljb24tY2xlYXItd2FybmluZyc6e3Bvc2l0aW9uOidmMScsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnLGlzTWFzazp0cnVlfSwnc21hbGxpY29uLWNsZWFyLWluZm8nOntwb3NpdGlvbjonZjInLHNwcml0ZXNoZWV0OidzbWFsbGljb25zJ30sJ3NtYWxsaWNvbi1jbGVhci1lcnJvcic6e3Bvc2l0aW9uOidmMycsc3ByaXRlc2hlZXQ6J3NtYWxsaWNvbnMnfSwnc21hbGxpY29uLWFjY291bnQtY2lyY2xlJzp7cG9zaXRpb246J2Y0JyxzcHJpdGVzaGVldDonc21hbGxpY29ucyd9LCdtZWRpdW1pY29uLWNsZWFyLXN0b3JhZ2UnOntwb3NpdGlvbjonYTQnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdtZWRpdW1pY29uLWNvb2tpZSc6e3Bvc2l0aW9uOidiNCcsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJyxpc01hc2s6dHJ1ZX0sJ21lZGl1bWljb24tZGF0YWJhc2UnOntwb3NpdGlvbjonYzQnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdtZWRpdW1pY29uLWluZm8nOntwb3NpdGlvbjonYzEnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdtZWRpdW1pY29uLW1hbmlmZXN0Jzp7cG9zaXRpb246J2Q0JyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnLGlzTWFzazp0cnVlfSwnbWVkaXVtaWNvbi1zZXJ2aWNlLXdvcmtlcic6e3Bvc2l0aW9uOidhMycsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJyxpc01hc2s6dHJ1ZX0sJ21lZGl1bWljb24tdGFibGUnOntwb3NpdGlvbjonYjMnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdtZWRpdW1pY29uLWFycm93LWluLWNpcmNsZSc6e3Bvc2l0aW9uOidjMycsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJyxpc01hc2s6dHJ1ZX0sJ21lZGl1bWljb24tZmlsZS1zeW5jJzp7cG9zaXRpb246J2QzJyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnLGludmVydDp0cnVlfSwnbWVkaXVtaWNvbi1maWxlJzp7cG9zaXRpb246J2EyJyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnLGludmVydDp0cnVlfSwnbWVkaXVtaWNvbi1ncmF5LWNyb3NzLWFjdGl2ZSc6e3Bvc2l0aW9uOidiMicsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJ30sJ21lZGl1bWljb24tZ3JheS1jcm9zcy1ob3Zlcic6e3Bvc2l0aW9uOidjMicsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJ30sJ21lZGl1bWljb24tcmVkLWNyb3NzLWFjdGl2ZSc6e3Bvc2l0aW9uOidkMicsc3ByaXRlc2hlZXQ6J21lZGl1bWljb25zJ30sJ21lZGl1bWljb24tcmVkLWNyb3NzLWhvdmVyJzp7cG9zaXRpb246J2ExJyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnfSwnbWVkaXVtaWNvbi1zZWFyY2gnOntwb3NpdGlvbjonYjEnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucyd9LCdtZWRpdW1pY29uLXJlcGxhY2UnOntwb3NpdGlvbjonYzUnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdtZWRpdW1pY29uLWFjY291bnQtY2lyY2xlJzp7cG9zaXRpb246J2U0JyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnfSwnbWVkaXVtaWNvbi13YXJuaW5nLXRyaWFuZ2xlJzp7cG9zaXRpb246J2UxJyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnfSwnbWVkaXVtaWNvbi1lcnJvci1jaXJjbGUnOntwb3NpdGlvbjonZTMnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucyd9LCdtZWRpdW1pY29uLWluZm8tY2lyY2xlJzp7cG9zaXRpb246J2UyJyxzcHJpdGVzaGVldDonbWVkaXVtaWNvbnMnfSwnbWVkaXVtaWNvbi1idWcnOntwb3NpdGlvbjonZDEnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucyd9LCdtZWRpdW1pY29uLWxpc3QnOntwb3NpdGlvbjonZTUnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucyd9LCdtZWRpdW1pY29uLXdhcm5pbmcnOntwb3NpdGlvbjonZDUnLHNwcml0ZXNoZWV0OidtZWRpdW1pY29ucycsaXNNYXNrOnRydWV9LCdiYWRnZS1uYXZpZ2F0b3ItZmlsZS1zeW5jJzp7cG9zaXRpb246J2E5JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucyd9LCdsYXJnZWljb24tYWN0aXZhdGUtYnJlYWtwb2ludHMnOntwb3NpdGlvbjonYjknLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1hZGQnOntwb3NpdGlvbjonYTgnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1iYWNrZ3JvdW5kLWNvbG9yJzp7cG9zaXRpb246J2I4JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tYm94LXNoYWRvdyc6e3Bvc2l0aW9uOidhNycsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWNhbWVyYSc6e3Bvc2l0aW9uOidiNycsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWNlbnRlcic6e3Bvc2l0aW9uOidjOScsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWNoZWNrbWFyayc6e3Bvc2l0aW9uOidjOCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWNoZXZyb24nOntwb3NpdGlvbjonYzcnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1jbGVhcic6e3Bvc2l0aW9uOidhNicsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWNvcHknOntwb3NpdGlvbjonYjYnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1kZWFjdGl2YXRlLWJyZWFrcG9pbnRzJzp7cG9zaXRpb246J2M2JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tZGVsZXRlJzp7cG9zaXRpb246J2Q5JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tZG9jay10by1ib3R0b20nOntwb3NpdGlvbjonZDgnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1kb2NrLXRvLWxlZnQnOntwb3NpdGlvbjonZDcnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1kb2NrLXRvLXJpZ2h0Jzp7cG9zaXRpb246J2Q2JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tZG93bmxvYWQnOntwb3NpdGlvbjonaDYnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1lZGl0Jzp7cG9zaXRpb246J2E1JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tZXllZHJvcHBlcic6e3Bvc2l0aW9uOidiNScsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWZpbHRlcic6e3Bvc2l0aW9uOidjNScsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWZvcmVncm91bmQtY29sb3InOntwb3NpdGlvbjonZDUnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1oaWRlLWJvdHRvbS1zaWRlYmFyJzp7cG9zaXRpb246J2U5JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24taGlkZS1sZWZ0LXNpZGViYXInOntwb3NpdGlvbjonZTgnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1oaWRlLXJpZ2h0LXNpZGViYXInOntwb3NpdGlvbjonZTcnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1oaWRlLXRvcC1zaWRlYmFyJzp7cG9zaXRpb246J2U2JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbGFyZ2UtbGlzdCc6e3Bvc2l0aW9uOidlNScsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLWxheW91dC1lZGl0b3InOntwb3NpdGlvbjonYTQnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1sb2FkJzp7cG9zaXRpb246J2g1JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbG9uZ2NsaWNrLXRyaWFuZ2xlJzp7cG9zaXRpb246J2I0JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbWVudSc6e3Bvc2l0aW9uOidjNCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLW5hdmlnYXRvci1kb21haW4nOntwb3NpdGlvbjonZDQnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1uYXZpZ2F0b3ItZmlsZSc6e3Bvc2l0aW9uOidlNCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLW5hdmlnYXRvci1maWxlLXN5bmMnOntwb3NpdGlvbjonZjknLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1uYXZpZ2F0b3ItZm9sZGVyJzp7cG9zaXRpb246J2Y4JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbmF2aWdhdG9yLWZyYW1lJzp7cG9zaXRpb246J2Y3JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbmF2aWdhdG9yLXNuaXBwZXQnOntwb3NpdGlvbjonZjYnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1uYXZpZ2F0b3Itd29ya2VyJzp7cG9zaXRpb246J2Y1JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tbm9kZS1zZWFyY2gnOntwb3NpdGlvbjonZjQnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1wYW4nOntwb3NpdGlvbjonYTMnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1wYXVzZS1hbmltYXRpb24nOntwb3NpdGlvbjonYjMnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1wYXVzZSc6e3Bvc2l0aW9uOidjMycsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXBhdXNlLW9uLWV4Y2VwdGlvbnMnOntwb3NpdGlvbjonZDMnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1waG9uZSc6e3Bvc2l0aW9uOidlMycsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXBsYXktYW5pbWF0aW9uJzp7cG9zaXRpb246J2YzJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tcGxheS1iYWNrJzp7cG9zaXRpb246J2EyJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tcGxheSc6e3Bvc2l0aW9uOidiMicsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXByZXR0eS1wcmludCc6e3Bvc2l0aW9uOidjMicsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXJlZnJlc2gnOntwb3NpdGlvbjonZDInLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1yZXBsYXktYW5pbWF0aW9uJzp7cG9zaXRpb246J2UyJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tcmVzdW1lJzp7cG9zaXRpb246J2YyJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tcm90YXRlJzp7cG9zaXRpb246J2c5JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tcm90YXRlLXNjcmVlbic6e3Bvc2l0aW9uOidnOCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXNlYXJjaCc6e3Bvc2l0aW9uOidoNCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXNldHRpbmdzLWdlYXInOntwb3NpdGlvbjonZzcnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1zaG93LWJvdHRvbS1zaWRlYmFyJzp7cG9zaXRpb246J2c2JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tc2hvdy1sZWZ0LXNpZGViYXInOntwb3NpdGlvbjonZzUnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1zaG93LXJpZ2h0LXNpZGViYXInOntwb3NpdGlvbjonZzQnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1zaG93LXRvcC1zaWRlYmFyJzp7cG9zaXRpb246J2czJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tc3RhcnQtcmVjb3JkaW5nJzp7cG9zaXRpb246J2cyJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tc3RlcC1pbnRvJzp7cG9zaXRpb246J2ExJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tc3RlcC1vdXQnOntwb3NpdGlvbjonYjEnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1zdGVwLW92ZXInOntwb3NpdGlvbjonYzEnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi1zdGVwJzp7cG9zaXRpb246J2gxJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tc3RvcC1yZWNvcmRpbmcnOntwb3NpdGlvbjonZDEnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi10ZXJtaW5hdGUtZXhlY3V0aW9uJzp7cG9zaXRpb246J2gyJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tdGV4dC1zaGFkb3cnOntwb3NpdGlvbjonZTEnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi10cmFzaC1iaW4nOntwb3NpdGlvbjonZjEnLHNwcml0ZXNoZWV0OidsYXJnZWljb25zJyxpc01hc2s6dHJ1ZX0sJ2xhcmdlaWNvbi11bmRvJzp7cG9zaXRpb246J2g3JyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tdW5kb2NrJzp7cG9zaXRpb246J2cxJyxzcHJpdGVzaGVldDonbGFyZ2VpY29ucycsaXNNYXNrOnRydWV9LCdsYXJnZWljb24tdmlzaWJpbGl0eSc6e3Bvc2l0aW9uOidoOScsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbGFyZ2VpY29uLXdhdGVyZmFsbCc6e3Bvc2l0aW9uOidoOCcsc3ByaXRlc2hlZXQ6J2xhcmdlaWNvbnMnLGlzTWFzazp0cnVlfSwnbWVkaXVtaWNvbi1hcnJvdy10b3AnOntwb3NpdGlvbjonYTQnLHNwcml0ZXNoZWV0OidhcnJvd2ljb25zJ30sJ21lZGl1bWljb24tYXJyb3ctYm90dG9tJzp7cG9zaXRpb246J2EzJyxzcHJpdGVzaGVldDonYXJyb3dpY29ucyd9LCdtZWRpdW1pY29uLWFycm93LWxlZnQnOntwb3NpdGlvbjonYTInLHNwcml0ZXNoZWV0OidhcnJvd2ljb25zJ30sJ21lZGl1bWljb24tYXJyb3ctcmlnaHQnOntwb3NpdGlvbjonYTEnLHNwcml0ZXNoZWV0OidhcnJvd2ljb25zJ319OztVSS5JbmZvYmFyPWNsYXNze2NvbnN0cnVjdG9yKHR5cGUsdGV4dCxkaXNhYmxlU2V0dGluZyl7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2ZsZXgtbm9uZScpO3RoaXMuX3NoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuZWxlbWVudCwndWkvaW5mb2Jhci5jc3MnKTt0aGlzLl9jb250ZW50RWxlbWVudD10aGlzLl9zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdpbmZvYmFyIGluZm9iYXItJyt0eXBlKTt0aGlzLl9tYWluUm93PXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdpbmZvYmFyLW1haW4tcm93Jyk7dGhpcy5fbWFpblJvdy5jcmVhdGVDaGlsZCgnZGl2Jyx0eXBlKyctaWNvbiBpY29uJyk7dGhpcy5fbWFpblJvd1RleHQ9dGhpcy5fbWFpblJvdy5jcmVhdGVDaGlsZCgnZGl2JywnaW5mb2Jhci1tYWluLXRpdGxlJyk7dGhpcy5fbWFpblJvd1RleHQudGV4dENvbnRlbnQ9dGV4dDt0aGlzLl9kZXRhaWxzUm93cz10aGlzLl9jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaW5mb2Jhci1kZXRhaWxzLXJvd3MgaGlkZGVuJyk7dGhpcy5fdG9nZ2xlRWxlbWVudD10aGlzLl9tYWluUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCdpbmZvYmFyLXRvZ2dsZSBoaWRkZW4nKTt0aGlzLl90b2dnbGVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vblRvZ2dsZURldGFpbHMuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fdG9nZ2xlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ21vcmUnKTt0aGlzLl9kaXNhYmxlU2V0dGluZz1kaXNhYmxlU2V0dGluZ3x8bnVsbDtpZihkaXNhYmxlU2V0dGluZyl7Y29uc3QgZGlzYWJsZUJ1dHRvbj10aGlzLl9tYWluUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCdpbmZvYmFyLXRvZ2dsZScpO2Rpc2FibGVCdXR0b24udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCduZXZlciBzaG93Jyk7ZGlzYWJsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25EaXNhYmxlLmJpbmQodGhpcyksZmFsc2UpO30KdGhpcy5fY2xvc2VCdXR0b249dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Nsb3NlLWJ1dHRvbicsJ2R0LWNsb3NlLWJ1dHRvbicpO3RoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmRpc3Bvc2UuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY2xvc2VDYWxsYmFjaz1udWxsO30Kc3RhdGljIGNyZWF0ZSh0eXBlLHRleHQsZGlzYWJsZVNldHRpbmcpe2lmKGRpc2FibGVTZXR0aW5nJiZkaXNhYmxlU2V0dGluZy5nZXQoKSkKcmV0dXJuIG51bGw7cmV0dXJuIG5ldyBVSS5JbmZvYmFyKHR5cGUsdGV4dCxkaXNhYmxlU2V0dGluZyk7fQpkaXNwb3NlKCl7dGhpcy5lbGVtZW50LnJlbW92ZSgpO3RoaXMuX29uUmVzaXplKCk7aWYodGhpcy5fY2xvc2VDYWxsYmFjaykKdGhpcy5fY2xvc2VDYWxsYmFjay5jYWxsKG51bGwpO30Kc2V0VGV4dCh0ZXh0KXt0aGlzLl9tYWluUm93VGV4dC50ZXh0Q29udGVudD10ZXh0O3RoaXMuX29uUmVzaXplKCk7fQpzZXRDbG9zZUNhbGxiYWNrKGNhbGxiYWNrKXt0aGlzLl9jbG9zZUNhbGxiYWNrPWNhbGxiYWNrO30Kc2V0UGFyZW50VmlldyhwYXJlbnRWaWV3KXt0aGlzLl9wYXJlbnRWaWV3PXBhcmVudFZpZXc7fQpfb25SZXNpemUoKXtpZih0aGlzLl9wYXJlbnRWaWV3KQp0aGlzLl9wYXJlbnRWaWV3LmRvUmVzaXplKCk7fQpfb25EaXNhYmxlKCl7dGhpcy5fZGlzYWJsZVNldHRpbmcuc2V0KHRydWUpO3RoaXMuZGlzcG9zZSgpO30KX29uVG9nZ2xlRGV0YWlscygpe3RoaXMuX2RldGFpbHNSb3dzLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO3RoaXMuX3RvZ2dsZUVsZW1lbnQucmVtb3ZlKCk7dGhpcy5fb25SZXNpemUoKTt9CmNyZWF0ZURldGFpbHNSb3dNZXNzYWdlKG1lc3NhZ2Upe3RoaXMuX3RvZ2dsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7Y29uc3QgaW5mb2JhckRldGFpbHNSb3c9dGhpcy5fZGV0YWlsc1Jvd3MuY3JlYXRlQ2hpbGQoJ2RpdicsJ2luZm9iYXItZGV0YWlscy1yb3cnKTtjb25zdCBkZXRhaWxzUm93TWVzc2FnZT1pbmZvYmFyRGV0YWlsc1Jvdy5jcmVhdGVDaGlsZCgnc3BhbicsJ2luZm9iYXItcm93LW1lc3NhZ2UnKTtkZXRhaWxzUm93TWVzc2FnZS50ZXh0Q29udGVudD1tZXNzYWdlfHwnJztyZXR1cm4gZGV0YWlsc1Jvd01lc3NhZ2U7fX07VUkuSW5mb2Jhci5UeXBlPXtXYXJuaW5nOid3YXJuaW5nJyxJbmZvOidpbmZvJ307O1VJLklucGxhY2VFZGl0b3I9Y2xhc3N7c3RhdGljIHN0YXJ0RWRpdGluZyhlbGVtZW50LGNvbmZpZyl7aWYoIVVJLklucGxhY2VFZGl0b3IuX2RlZmF1bHRJbnN0YW5jZSkKVUkuSW5wbGFjZUVkaXRvci5fZGVmYXVsdEluc3RhbmNlPW5ldyBVSS5JbnBsYWNlRWRpdG9yKCk7cmV0dXJuIFVJLklucGxhY2VFZGl0b3IuX2RlZmF1bHRJbnN0YW5jZS5zdGFydEVkaXRpbmcoZWxlbWVudCxjb25maWcpO30KZWRpdG9yQ29udGVudChlZGl0aW5nQ29udGV4dCl7Y29uc3QgZWxlbWVudD1lZGl0aW5nQ29udGV4dC5lbGVtZW50O2lmKGVsZW1lbnQudGFnTmFtZT09PSdJTlBVVCcmJmVsZW1lbnQudHlwZT09PSd0ZXh0JykKcmV0dXJuIGVsZW1lbnQudmFsdWU7cmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7fQpzZXRVcEVkaXRvcihlZGl0aW5nQ29udGV4dCl7Y29uc3QgZWxlbWVudD1lZGl0aW5nQ29udGV4dC5lbGVtZW50O2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZWRpdGluZycpO2VsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCdwbGFpbnRleHQtb25seScpO2NvbnN0IG9sZFRhYkluZGV4PWVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJJbmRleCcpO2lmKHR5cGVvZiBvbGRUYWJJbmRleCE9PSdudW1iZXInfHxvbGRUYWJJbmRleDwwKQplbGVtZW50LnRhYkluZGV4PTA7dGhpcy5fZm9jdXNSZXN0b3Jlcj1uZXcgVUkuRWxlbWVudEZvY3VzUmVzdG9yZXIoZWxlbWVudCk7ZWRpdGluZ0NvbnRleHQub2xkVGFiSW5kZXg9b2xkVGFiSW5kZXg7fQpjbG9zZUVkaXRvcihlZGl0aW5nQ29udGV4dCl7Y29uc3QgZWxlbWVudD1lZGl0aW5nQ29udGV4dC5lbGVtZW50O2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZWRpdGluZycpO2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtpZih0eXBlb2YgZWRpdGluZ0NvbnRleHQub2xkVGFiSW5kZXghPT0nbnVtYmVyJykKZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7ZWxzZQplbGVtZW50LnRhYkluZGV4PWVkaXRpbmdDb250ZXh0Lm9sZFRhYkluZGV4O2VsZW1lbnQuc2Nyb2xsVG9wPTA7ZWxlbWVudC5zY3JvbGxMZWZ0PTA7fQpjYW5jZWxFZGl0aW5nKGVkaXRpbmdDb250ZXh0KXtjb25zdCBlbGVtZW50PWVkaXRpbmdDb250ZXh0LmVsZW1lbnQ7aWYoZWxlbWVudC50YWdOYW1lPT09J0lOUFVUJyYmZWxlbWVudC50eXBlPT09J3RleHQnKQplbGVtZW50LnZhbHVlPWVkaXRpbmdDb250ZXh0Lm9sZFRleHQ7ZWxzZQplbGVtZW50LnRleHRDb250ZW50PWVkaXRpbmdDb250ZXh0Lm9sZFRleHQ7fQphdWdtZW50RWRpdGluZ0hhbmRsZShlZGl0aW5nQ29udGV4dCxoYW5kbGUpe30Kc3RhcnRFZGl0aW5nKGVsZW1lbnQsY29uZmlnKXtpZighVUkubWFya0JlaW5nRWRpdGVkKGVsZW1lbnQsdHJ1ZSkpCnJldHVybiBudWxsO2NvbmZpZz1jb25maWd8fG5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyhmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9KTtjb25zdCBlZGl0aW5nQ29udGV4dD17ZWxlbWVudDplbGVtZW50LGNvbmZpZzpjb25maWd9O2NvbnN0IGNvbW1pdHRlZENhbGxiYWNrPWNvbmZpZy5jb21taXRIYW5kbGVyO2NvbnN0IGNhbmNlbGxlZENhbGxiYWNrPWNvbmZpZy5jYW5jZWxIYW5kbGVyO2NvbnN0IHBhc3RlQ2FsbGJhY2s9Y29uZmlnLnBhc3RlSGFuZGxlcjtjb25zdCBjb250ZXh0PWNvbmZpZy5jb250ZXh0O2xldCBtb3ZlRGlyZWN0aW9uPScnO2NvbnN0IHNlbGY9dGhpczt0aGlzLnNldFVwRWRpdG9yKGVkaXRpbmdDb250ZXh0KTtlZGl0aW5nQ29udGV4dC5vbGRUZXh0PXRoaXMuZWRpdG9yQ29udGVudChlZGl0aW5nQ29udGV4dCk7ZnVuY3Rpb24gYmx1ckV2ZW50TGlzdGVuZXIoZSl7aWYoY29uZmlnLmJsdXJIYW5kbGVyJiYhY29uZmlnLmJsdXJIYW5kbGVyKGVsZW1lbnQsZSkpCnJldHVybjtlZGl0aW5nQ29tbWl0dGVkLmNhbGwoZWxlbWVudCk7fQpmdW5jdGlvbiBjbGVhblVwQWZ0ZXJFZGl0aW5nKCl7VUkubWFya0JlaW5nRWRpdGVkKGVsZW1lbnQsZmFsc2UpO2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsYmx1ckV2ZW50TGlzdGVuZXIsZmFsc2UpO2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsa2V5RG93bkV2ZW50TGlzdGVuZXIsdHJ1ZSk7aWYocGFzdGVDYWxsYmFjaykKZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScscGFzdGVFdmVudExpc3RlbmVyLHRydWUpO2lmKHNlbGYuX2ZvY3VzUmVzdG9yZXIpCnNlbGYuX2ZvY3VzUmVzdG9yZXIucmVzdG9yZSgpO3NlbGYuY2xvc2VFZGl0b3IoZWRpdGluZ0NvbnRleHQpO30KZnVuY3Rpb24gZWRpdGluZ0NhbmNlbGxlZCgpe3NlbGYuY2FuY2VsRWRpdGluZyhlZGl0aW5nQ29udGV4dCk7Y2xlYW5VcEFmdGVyRWRpdGluZygpO2NhbmNlbGxlZENhbGxiYWNrKHRoaXMsY29udGV4dCk7fQpmdW5jdGlvbiBlZGl0aW5nQ29tbWl0dGVkKCl7Y2xlYW5VcEFmdGVyRWRpdGluZygpO2NvbW1pdHRlZENhbGxiYWNrKHRoaXMsc2VsZi5lZGl0b3JDb250ZW50KGVkaXRpbmdDb250ZXh0KSxlZGl0aW5nQ29udGV4dC5vbGRUZXh0LGNvbnRleHQsbW92ZURpcmVjdGlvbik7fQpmdW5jdGlvbiBkZWZhdWx0RmluaXNoSGFuZGxlcihldmVudCl7aWYoaXNFbnRlcktleShldmVudCkpCnJldHVybidjb21taXQnO2Vsc2UgaWYoZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Fc2MuY29kZXx8ZXZlbnQua2V5PT09J0VzY2FwZScpCnJldHVybidjYW5jZWwnO2Vsc2UgaWYoZXZlbnQua2V5PT09J1RhYicpCnJldHVybidtb3ZlLScrKGV2ZW50LnNoaWZ0S2V5PydiYWNrd2FyZCc6J2ZvcndhcmQnKTtyZXR1cm4nJzt9CmZ1bmN0aW9uIGhhbmRsZUVkaXRpbmdSZXN1bHQocmVzdWx0LGV2ZW50KXtpZihyZXN1bHQ9PT0nY29tbWl0Jyl7ZWRpdGluZ0NvbW1pdHRlZC5jYWxsKGVsZW1lbnQpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fWVsc2UgaWYocmVzdWx0PT09J2NhbmNlbCcpe2VkaXRpbmdDYW5jZWxsZWQuY2FsbChlbGVtZW50KTtldmVudC5jb25zdW1lKHRydWUpO31lbHNlIGlmKHJlc3VsdCYmcmVzdWx0LnN0YXJ0c1dpdGgoJ21vdmUtJykpe21vdmVEaXJlY3Rpb249cmVzdWx0LnN1YnN0cmluZyg1KTtpZihldmVudC5rZXk9PT0nVGFiJykKZXZlbnQuY29uc3VtZSh0cnVlKTtibHVyRXZlbnRMaXN0ZW5lcigpO319CmZ1bmN0aW9uIHBhc3RlRXZlbnRMaXN0ZW5lcihldmVudCl7Y29uc3QgcmVzdWx0PXBhc3RlQ2FsbGJhY2soZXZlbnQpO2hhbmRsZUVkaXRpbmdSZXN1bHQocmVzdWx0LGV2ZW50KTt9CmZ1bmN0aW9uIGtleURvd25FdmVudExpc3RlbmVyKGV2ZW50KXtsZXQgcmVzdWx0PWRlZmF1bHRGaW5pc2hIYW5kbGVyKGV2ZW50KTtpZighcmVzdWx0JiZjb25maWcucG9zdEtleWRvd25GaW5pc2hIYW5kbGVyKQpyZXN1bHQ9Y29uZmlnLnBvc3RLZXlkb3duRmluaXNoSGFuZGxlcihldmVudCk7aGFuZGxlRWRpdGluZ1Jlc3VsdChyZXN1bHQsZXZlbnQpO30KZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJyxibHVyRXZlbnRMaXN0ZW5lcixmYWxzZSk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxrZXlEb3duRXZlbnRMaXN0ZW5lcix0cnVlKTtpZihwYXN0ZUNhbGxiYWNrKQplbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJyxwYXN0ZUV2ZW50TGlzdGVuZXIsdHJ1ZSk7Y29uc3QgaGFuZGxlPXtjYW5jZWw6ZWRpdGluZ0NhbmNlbGxlZC5iaW5kKGVsZW1lbnQpLGNvbW1pdDplZGl0aW5nQ29tbWl0dGVkLmJpbmQoZWxlbWVudCl9O3RoaXMuYXVnbWVudEVkaXRpbmdIYW5kbGUoZWRpdGluZ0NvbnRleHQsaGFuZGxlKTtyZXR1cm4gaGFuZGxlO319O1VJLklucGxhY2VFZGl0b3IuQ29udHJvbGxlcjtVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZz1jbGFzc3tjb25zdHJ1Y3Rvcihjb21taXRIYW5kbGVyLGNhbmNlbEhhbmRsZXIsY29udGV4dCxibHVySGFuZGxlcil7dGhpcy5jb21taXRIYW5kbGVyPWNvbW1pdEhhbmRsZXI7dGhpcy5jYW5jZWxIYW5kbGVyPWNhbmNlbEhhbmRsZXI7dGhpcy5jb250ZXh0PWNvbnRleHQ7dGhpcy5ibHVySGFuZGxlcj1ibHVySGFuZGxlcjt0aGlzLnBhc3RlSGFuZGxlcjt0aGlzLnBvc3RLZXlkb3duRmluaXNoSGFuZGxlcjt9CnNldFBhc3RlSGFuZGxlcihwYXN0ZUhhbmRsZXIpe3RoaXMucGFzdGVIYW5kbGVyPXBhc3RlSGFuZGxlcjt9CnNldFBvc3RLZXlkb3duRmluaXNoSGFuZGxlcihwb3N0S2V5ZG93bkZpbmlzaEhhbmRsZXIpe3RoaXMucG9zdEtleWRvd25GaW5pc2hIYW5kbGVyPXBvc3RLZXlkb3duRmluaXNoSGFuZGxlcjt9fTs7VUkuVGV4dEVkaXRvckZhY3Rvcnk9ZnVuY3Rpb24oKXt9O1VJLlRleHRFZGl0b3JGYWN0b3J5LnByb3RvdHlwZT17Y3JlYXRlRWRpdG9yKG9wdGlvbnMpe319O1VJLlRleHRFZGl0b3I9ZnVuY3Rpb24oKXt9O1VJLlRleHRFZGl0b3IucHJvdG90eXBlPXt3aWRnZXQoKXt9LGZ1bGxSYW5nZSgpe30sc2VsZWN0aW9uKCl7fSxzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKXt9LHRleHQodGV4dFJhbmdlKXt9LHRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKXt9LHNldFRleHQodGV4dCl7fSxsaW5lKGxpbmVOdW1iZXIpe30sbmV3bGluZUFuZEluZGVudCgpe30sYWRkS2V5RG93bkhhbmRsZXIoaGFuZGxlcil7fSxjb25maWd1cmVBdXRvY29tcGxldGUoY29uZmlnKXt9LGNsZWFyQXV0b2NvbXBsZXRlKCl7fSx2aXN1YWxDb29yZGluYXRlcyhsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7fSx0b2tlbkF0VGV4dFBvc2l0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt9fTtVSS5UZXh0RWRpdG9yLkV2ZW50cz17VGV4dENoYW5nZWQ6U3ltYm9sKCdUZXh0Q2hhbmdlZCcpLFN1Z2dlc3Rpb25DaGFuZ2VkOlN5bWJvbCgnU3VnZ2VzdGlvbkNoYW5nZWQnKX07VUkuVGV4dEVkaXRvci5PcHRpb25zO1VJLkF1dG9jb21wbGV0ZUNvbmZpZzs7VUkuS2V5Ym9hcmRTaG9ydGN1dD1jbGFzc3tzdGF0aWMgbWFrZUtleShrZXlDb2RlLG1vZGlmaWVycyl7aWYodHlwZW9mIGtleUNvZGU9PT0nc3RyaW5nJykKa2V5Q29kZT1rZXlDb2RlLmNoYXJDb2RlQXQoMCktKC9eW2Etel0vLnRlc3Qoa2V5Q29kZSk/MzI6MCk7bW9kaWZpZXJzPW1vZGlmaWVyc3x8VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZTtyZXR1cm4gVUkuS2V5Ym9hcmRTaG9ydGN1dC5fbWFrZUtleUZyb21Db2RlQW5kTW9kaWZpZXJzKGtleUNvZGUsbW9kaWZpZXJzKTt9CnN0YXRpYyBtYWtlS2V5RnJvbUV2ZW50KGtleWJvYXJkRXZlbnQpe2xldCBtb2RpZmllcnM9VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZTtpZihrZXlib2FyZEV2ZW50LnNoaWZ0S2V5KQptb2RpZmllcnN8PVVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLlNoaWZ0O2lmKGtleWJvYXJkRXZlbnQuY3RybEtleSkKbW9kaWZpZXJzfD1VSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsO2lmKGtleWJvYXJkRXZlbnQuYWx0S2V5KQptb2RpZmllcnN8PVVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkFsdDtpZihrZXlib2FyZEV2ZW50Lm1ldGFLZXkpCm1vZGlmaWVyc3w9VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTWV0YTtjb25zdCBrZXlDb2RlPWtleWJvYXJkRXZlbnQua2V5Q29kZXx8a2V5Ym9hcmRFdmVudFsnX19rZXlDb2RlJ107cmV0dXJuIFVJLktleWJvYXJkU2hvcnRjdXQuX21ha2VLZXlGcm9tQ29kZUFuZE1vZGlmaWVycyhrZXlDb2RlLG1vZGlmaWVycyk7fQpzdGF0aWMgbWFrZUtleUZyb21FdmVudElnbm9yaW5nTW9kaWZpZXJzKGtleWJvYXJkRXZlbnQpe2NvbnN0IGtleUNvZGU9a2V5Ym9hcmRFdmVudC5rZXlDb2RlfHxrZXlib2FyZEV2ZW50WydfX2tleUNvZGUnXTtyZXR1cm4gVUkuS2V5Ym9hcmRTaG9ydGN1dC5fbWFrZUtleUZyb21Db2RlQW5kTW9kaWZpZXJzKGtleUNvZGUsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuTm9uZSk7fQpzdGF0aWMgZXZlbnRIYXNDdHJsT3JNZXRhKGV2ZW50KXtyZXR1cm4gSG9zdC5pc01hYygpP2V2ZW50Lm1ldGFLZXkmJiFldmVudC5jdHJsS2V5OmV2ZW50LmN0cmxLZXkmJiFldmVudC5tZXRhS2V5O30Kc3RhdGljIGhhc05vTW9kaWZpZXJzKGV2ZW50KXtyZXR1cm4hZXZlbnQuY3RybEtleSYmIWV2ZW50LnNoaWZ0S2V5JiYhZXZlbnQuYWx0S2V5JiYhZXZlbnQubWV0YUtleTt9CnN0YXRpYyBtYWtlRGVzY3JpcHRvcihrZXksbW9kaWZpZXJzKXtyZXR1cm57a2V5OlVJLktleWJvYXJkU2hvcnRjdXQubWFrZUtleSh0eXBlb2Yga2V5PT09J3N0cmluZyc/a2V5OmtleS5jb2RlLG1vZGlmaWVycyksbmFtZTpVSS5LZXlib2FyZFNob3J0Y3V0LnNob3J0Y3V0VG9TdHJpbmcoa2V5LG1vZGlmaWVycyl9O30Kc3RhdGljIG1ha2VEZXNjcmlwdG9yRnJvbUJpbmRpbmdTaG9ydGN1dChzaG9ydGN1dCl7Y29uc3QgcGFydHM9c2hvcnRjdXQuc3BsaXQoL1wrKD8hJCkvKTtsZXQgbW9kaWZpZXJzPTA7bGV0IGtleVN0cmluZztmb3IobGV0IGk9MDtpPHBhcnRzLmxlbmd0aDsrK2kpe2lmKHR5cGVvZiBVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVyc1twYXJ0c1tpXV0hPT0ndW5kZWZpbmVkJyl7bW9kaWZpZXJzfD1VSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVyc1twYXJ0c1tpXV07Y29udGludWU7fQpjb25zb2xlLmFzc2VydChpPT09cGFydHMubGVuZ3RoLTEsJ09ubHkgb25lIGtleSBvdGhlciB0aGFuIG1vZGlmaWVyIGlzIGFsbG93ZWQgaW4gc2hvcnRjdXQgPCcrc2hvcnRjdXQrJz4nKTtrZXlTdHJpbmc9cGFydHNbaV07YnJlYWs7fQpjb25zb2xlLmFzc2VydChrZXlTdHJpbmcsJ01vZGlmaWVycy1vbmx5IHNob3J0Y3V0cyBhcmUgbm90IGFsbG93ZWQgKGVuY291bnRlcmVkIDwnK3Nob3J0Y3V0Kyc+KScpO2lmKCFrZXlTdHJpbmcpCnJldHVybiBudWxsO2NvbnN0IGtleT1VSS5LZXlib2FyZFNob3J0Y3V0LktleXNba2V5U3RyaW5nXXx8VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlCaW5kaW5nc1trZXlTdHJpbmddO2lmKGtleSYma2V5LnNoaWZ0S2V5KQptb2RpZmllcnN8PVVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLlNoaWZ0O3JldHVybiBVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKGtleT9rZXk6a2V5U3RyaW5nLG1vZGlmaWVycyk7fQpzdGF0aWMgc2hvcnRjdXRUb1N0cmluZyhrZXksbW9kaWZpZXJzKXtyZXR1cm4gVUkuS2V5Ym9hcmRTaG9ydGN1dC5fbW9kaWZpZXJzVG9TdHJpbmcobW9kaWZpZXJzKStVSS5LZXlib2FyZFNob3J0Y3V0Ll9rZXlOYW1lKGtleSk7fQpzdGF0aWMgX2tleU5hbWUoa2V5KXtpZih0eXBlb2Yga2V5PT09J3N0cmluZycpCnJldHVybiBrZXkudG9VcHBlckNhc2UoKTtpZih0eXBlb2Yga2V5Lm5hbWU9PT0nc3RyaW5nJykKcmV0dXJuIGtleS5uYW1lO3JldHVybiBrZXkubmFtZVtIb3N0LnBsYXRmb3JtKCldfHxrZXkubmFtZS5vdGhlcnx8Jyc7fQpzdGF0aWMgX21ha2VLZXlGcm9tQ29kZUFuZE1vZGlmaWVycyhrZXlDb2RlLG1vZGlmaWVycyl7cmV0dXJuKGtleUNvZGUmMjU1KXwobW9kaWZpZXJzPDw4KTt9CnN0YXRpYyBrZXlDb2RlQW5kTW9kaWZpZXJzRnJvbUtleShrZXkpe3JldHVybntrZXlDb2RlOmtleSYyNTUsbW9kaWZpZXJzOmtleT4+OH07fQpzdGF0aWMgX21vZGlmaWVyc1RvU3RyaW5nKG1vZGlmaWVycyl7Y29uc3QgaXNNYWM9SG9zdC5pc01hYygpO2NvbnN0IG09VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnM7Y29uc3QgbW9kaWZpZXJOYW1lcz1uZXcgTWFwKFtbbS5DdHJsLGlzTWFjPydDdHJsXHUyMDA0JzonQ3RybFx1MjAwQStcdTIwMEEnXSxbbS5BbHQsaXNNYWM/J1x1MjMyNVx1MjAwNCc6J0FsdFx1MjAwQStcdTIwMEEnXSxbbS5TaGlmdCxpc01hYz8nXHUyMWU3XHUyMDA0JzonU2hpZnRcdTIwMEErXHUyMDBBJ10sW20uTWV0YSxpc01hYz8nXHUyMzE4XHUyMDA0JzonV2luXHUyMDBBK1x1MjAwQSddXSk7cmV0dXJuW20uTWV0YSxtLkN0cmwsbS5BbHQsbS5TaGlmdF0ubWFwKG1hcE1vZGlmaWVycykuam9pbignJyk7ZnVuY3Rpb24gbWFwTW9kaWZpZXJzKG0pe3JldHVybiBtb2RpZmllcnMmbT8obW9kaWZpZXJOYW1lcy5nZXQobSkpOicnO319fTtVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycz17Tm9uZTowLFNoaWZ0OjEsQ3RybDoyLEFsdDo0LE1ldGE6OCxnZXQgQ3RybE9yTWV0YSgpe3JldHVybiBIb3N0LmlzTWFjKCk/dGhpcy5NZXRhOnRoaXMuQ3RybDt9LGdldCBTaGlmdE9yT3B0aW9uKCl7cmV0dXJuIEhvc3QuaXNNYWMoKT90aGlzLkFsdDp0aGlzLlNoaWZ0O319O1VJLktleWJvYXJkU2hvcnRjdXQuS2V5O1VJLktleWJvYXJkU2hvcnRjdXQuS2V5cz17QmFja3NwYWNlOntjb2RlOjgsbmFtZTonXHUyMWE0J30sVGFiOntjb2RlOjksbmFtZTp7bWFjOidcdTIxZTUnLG90aGVyOidUYWInfX0sRW50ZXI6e2NvZGU6MTMsbmFtZTp7bWFjOidcdTIxYTknLG90aGVyOidFbnRlcid9fSxTaGlmdDp7Y29kZToxNixuYW1lOnttYWM6J1x1MjFlNycsb3RoZXI6J1NoaWZ0J319LEN0cmw6e2NvZGU6MTcsbmFtZTonQ3RybCd9LEVzYzp7Y29kZToyNyxuYW1lOidFc2MnfSxTcGFjZTp7Y29kZTozMixuYW1lOidTcGFjZSd9LFBhZ2VVcDp7Y29kZTozMyxuYW1lOnttYWM6J1x1MjFkZScsb3RoZXI6J1BhZ2VVcCd9fSxQYWdlRG93bjp7Y29kZTozNCxuYW1lOnttYWM6J1x1MjFkZicsb3RoZXI6J1BhZ2VEb3duJ319LEVuZDp7Y29kZTozNSxuYW1lOnttYWM6J1x1MjE5Nycsb3RoZXI6J0VuZCd9fSxIb21lOntjb2RlOjM2LG5hbWU6e21hYzonXHUyMTk2JyxvdGhlcjonSG9tZSd9fSxMZWZ0Ontjb2RlOjM3LG5hbWU6J1x1MjE5MCd9LFVwOntjb2RlOjM4LG5hbWU6J1x1MjE5MSd9LFJpZ2h0Ontjb2RlOjM5LG5hbWU6J1x1MjE5Mid9LERvd246e2NvZGU6NDAsbmFtZTonXHUyMTkzJ30sRGVsZXRlOntjb2RlOjQ2LG5hbWU6J0RlbCd9LFplcm86e2NvZGU6NDgsbmFtZTonMCd9LEg6e2NvZGU6NzIsbmFtZTonSCd9LE46e2NvZGU6NzgsbmFtZTonTid9LFA6e2NvZGU6ODAsbmFtZTonUCd9LE1ldGE6e2NvZGU6OTEsbmFtZTonTWV0YSd9LEYxOntjb2RlOjExMixuYW1lOidGMSd9LEYyOntjb2RlOjExMyxuYW1lOidGMid9LEYzOntjb2RlOjExNCxuYW1lOidGMyd9LEY0Ontjb2RlOjExNSxuYW1lOidGNCd9LEY1Ontjb2RlOjExNixuYW1lOidGNSd9LEY2Ontjb2RlOjExNyxuYW1lOidGNid9LEY3Ontjb2RlOjExOCxuYW1lOidGNyd9LEY4Ontjb2RlOjExOSxuYW1lOidGOCd9LEY5Ontjb2RlOjEyMCxuYW1lOidGOSd9LEYxMDp7Y29kZToxMjEsbmFtZTonRjEwJ30sRjExOntjb2RlOjEyMixuYW1lOidGMTEnfSxGMTI6e2NvZGU6MTIzLG5hbWU6J0YxMid9LFNlbWljb2xvbjp7Y29kZToxODYsbmFtZTonOyd9LE51bXBhZFBsdXM6e2NvZGU6MTA3LG5hbWU6J051bXBhZCArJ30sTnVtcGFkTWludXM6e2NvZGU6MTA5LG5hbWU6J051bXBhZCAtJ30sTnVtcGFkMDp7Y29kZTo5NixuYW1lOidOdW1wYWQgMCd9LFBsdXM6e2NvZGU6MTg3LG5hbWU6JysnfSxDb21tYTp7Y29kZToxODgsbmFtZTonLCd9LE1pbnVzOntjb2RlOjE4OSxuYW1lOictJ30sUGVyaW9kOntjb2RlOjE5MCxuYW1lOicuJ30sU2xhc2g6e2NvZGU6MTkxLG5hbWU6Jy8nfSxRdWVzdGlvbk1hcms6e2NvZGU6MTkxLG5hbWU6Jz8nfSxBcG9zdHJvcGhlOntjb2RlOjE5MixuYW1lOidgJ30sVGlsZGU6e2NvZGU6MTkyLG5hbWU6J1RpbGRlJ30sTGVmdFNxdWFyZUJyYWNrZXQ6e2NvZGU6MjE5LG5hbWU6J1snfSxSaWdodFNxdWFyZUJyYWNrZXQ6e2NvZGU6MjIxLG5hbWU6J10nfSxCYWNrc2xhc2g6e2NvZGU6MjIwLG5hbWU6J1xcJ30sU2luZ2xlUXVvdGU6e2NvZGU6MjIyLG5hbWU6J1wnJ30sZ2V0IEN0cmxPck1ldGEoKXtyZXR1cm4gSG9zdC5pc01hYygpP3RoaXMuTWV0YTp0aGlzLkN0cmw7fSx9O1VJLktleWJvYXJkU2hvcnRjdXQuS2V5QmluZGluZ3M9e307KGZ1bmN0aW9uKCl7Zm9yKGNvbnN0IGtleSBpbiBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMpe2NvbnN0IGRlc2NyaXB0b3I9VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzW2tleV07aWYodHlwZW9mIGRlc2NyaXB0b3I9PT0nb2JqZWN0JyYmZGVzY3JpcHRvclsnY29kZSddKXtjb25zdCBuYW1lPXR5cGVvZiBkZXNjcmlwdG9yWyduYW1lJ109PT0nc3RyaW5nJz9kZXNjcmlwdG9yWyduYW1lJ106a2V5O1VJLktleWJvYXJkU2hvcnRjdXQuS2V5QmluZGluZ3NbbmFtZV09ZGVzY3JpcHRvcjt9fX0pKCk7VUkuS2V5Ym9hcmRTaG9ydGN1dC5EZXNjcmlwdG9yOztVSS5MaXN0RGVsZWdhdGU9ZnVuY3Rpb24oKXt9O1VJLkxpc3REZWxlZ2F0ZS5wcm90b3R5cGU9e2NyZWF0ZUVsZW1lbnRGb3JJdGVtKGl0ZW0pe30saGVpZ2h0Rm9ySXRlbShpdGVtKXt9LGlzSXRlbVNlbGVjdGFibGUoaXRlbSl7fSxzZWxlY3RlZEl0ZW1DaGFuZ2VkKGZyb20sdG8sZnJvbUVsZW1lbnQsdG9FbGVtZW50KXt9LH07VUkuTGlzdE1vZGU9e05vblZpZXdwb3J0OlN5bWJvbCgnVUkuTGlzdE1vZGUuTm9uVmlld3BvcnQnKSxFcXVhbEhlaWdodEl0ZW1zOlN5bWJvbCgnVUkuTGlzdE1vZGUuRXF1YWxIZWlnaHRJdGVtcycpLFZhcmlvdXNIZWlnaHRJdGVtczpTeW1ib2woJ1VJLkxpc3RNb2RlLlZhcmlvdXNIZWlnaHRJdGVtcycpfTtVSS5MaXN0Q29udHJvbD1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCxkZWxlZ2F0ZSxtb2RlKXt0aGlzLmVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5lbGVtZW50LnN0eWxlLm92ZXJmbG93WT0nYXV0byc7dGhpcy5fdG9wRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuX2JvdHRvbUVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTt0aGlzLl9maXJzdEluZGV4PTA7dGhpcy5fbGFzdEluZGV4PTA7dGhpcy5fcmVuZGVyZWRIZWlnaHQ9MDt0aGlzLl90b3BIZWlnaHQ9MDt0aGlzLl9ib3R0b21IZWlnaHQ9MDt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9tb2RlbC5hZGRFdmVudExpc3RlbmVyKFVJLkxpc3RNb2RlbC5FdmVudHMuSXRlbXNSZXBsYWNlZCx0aGlzLl9yZXBsYWNlZEl0ZW1zSW5SYW5nZSx0aGlzKTt0aGlzLl9pdGVtVG9FbGVtZW50PW5ldyBNYXAoKTt0aGlzLl9zZWxlY3RlZEluZGV4PS0xO3RoaXMuX3NlbGVjdGVkSXRlbT1udWxsO3RoaXMuZWxlbWVudC50YWJJbmRleD0tMTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl9tb2RlPW1vZGV8fFVJLkxpc3RNb2RlLkVxdWFsSGVpZ2h0SXRlbXM7dGhpcy5fZml4ZWRIZWlnaHQ9MDt0aGlzLl92YXJpYWJsZU9mZnNldHM9bmV3IEludDMyQXJyYXkoMCk7dGhpcy5fY2xlYXJDb250ZW50cygpO2lmKHRoaXMuX21vZGUhPT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCl7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsKCk9Pnt0aGlzLl91cGRhdGVWaWV3cG9ydCh0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQpO30sZmFsc2UpO319CnNldE1vZGVsKG1vZGVsKXt0aGlzLl9pdGVtVG9FbGVtZW50LmNsZWFyKCk7Y29uc3QgbGVuZ3RoPXRoaXMuX21vZGVsLmxlbmd0aDt0aGlzLl9tb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFVJLkxpc3RNb2RlbC5FdmVudHMuSXRlbXNSZXBsYWNlZCx0aGlzLl9yZXBsYWNlZEl0ZW1zSW5SYW5nZSx0aGlzKTt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9tb2RlbC5hZGRFdmVudExpc3RlbmVyKFVJLkxpc3RNb2RlbC5FdmVudHMuSXRlbXNSZXBsYWNlZCx0aGlzLl9yZXBsYWNlZEl0ZW1zSW5SYW5nZSx0aGlzKTt0aGlzLmludmFsaWRhdGVSYW5nZSgwLGxlbmd0aCk7fQpfcmVwbGFjZWRJdGVtc0luUmFuZ2UoZXZlbnQpe2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO2NvbnN0IGZyb209ZGF0YS5pbmRleDtjb25zdCB0bz1mcm9tK2RhdGEucmVtb3ZlZC5sZW5ndGg7Y29uc3Qgb2xkU2VsZWN0ZWRJdGVtPXRoaXMuX3NlbGVjdGVkSXRlbTtjb25zdCBvbGRTZWxlY3RlZEVsZW1lbnQ9b2xkU2VsZWN0ZWRJdGVtPyh0aGlzLl9pdGVtVG9FbGVtZW50LmdldChvbGRTZWxlY3RlZEl0ZW0pfHxudWxsKTpudWxsO2ZvcihsZXQgaT0wO2k8ZGF0YS5yZW1vdmVkLmxlbmd0aDtpKyspCnRoaXMuX2l0ZW1Ub0VsZW1lbnQuZGVsZXRlKGRhdGEucmVtb3ZlZFtpXSk7dGhpcy5faW52YWxpZGF0ZShmcm9tLHRvLGRhdGEuaW5zZXJ0ZWQpO2lmKHRoaXMuX3NlbGVjdGVkSW5kZXg+PXRvKXt0aGlzLl9zZWxlY3RlZEluZGV4Kz1kYXRhLmluc2VydGVkLSh0by1mcm9tKTt0aGlzLl9zZWxlY3RlZEl0ZW09dGhpcy5fbW9kZWwuYXQodGhpcy5fc2VsZWN0ZWRJbmRleCk7fWVsc2UgaWYodGhpcy5fc2VsZWN0ZWRJbmRleD49ZnJvbSl7bGV0IGluZGV4PXRoaXMuX2ZpbmRGaXJzdFNlbGVjdGFibGUoZnJvbStkYXRhLmluc2VydGVkLCsxLGZhbHNlKTtpZihpbmRleD09PS0xKQppbmRleD10aGlzLl9maW5kRmlyc3RTZWxlY3RhYmxlKGZyb20tMSwtMSxmYWxzZSk7dGhpcy5fc2VsZWN0KGluZGV4LG9sZFNlbGVjdGVkSXRlbSxvbGRTZWxlY3RlZEVsZW1lbnQpO319CnJlZnJlc2hJdGVtKGl0ZW0pe2NvbnN0IGluZGV4PXRoaXMuX21vZGVsLmluZGV4T2YoaXRlbSk7aWYoaW5kZXg9PT0tMSl7Y29uc29sZS5lcnJvcignSXRlbSB0byByZWZyZXNoIGlzIG5vdCBwcmVzZW50Jyk7cmV0dXJuO30KdGhpcy5faXRlbVRvRWxlbWVudC5kZWxldGUoaXRlbSk7dGhpcy5pbnZhbGlkYXRlUmFuZ2UoaW5kZXgsaW5kZXgrMSk7aWYodGhpcy5fc2VsZWN0ZWRJbmRleCE9PS0xKQp0aGlzLl9zZWxlY3QodGhpcy5fc2VsZWN0ZWRJbmRleCxudWxsLG51bGwpO30KaW52YWxpZGF0ZVJhbmdlKGZyb20sdG8pe3RoaXMuX2ludmFsaWRhdGUoZnJvbSx0byx0by1mcm9tKTt9CnZpZXdwb3J0UmVzaXplZCgpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCkKcmV0dXJuO2NvbnN0IHNjcm9sbFRvcD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO2NvbnN0IHZpZXdwb3J0SGVpZ2h0PXRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7dGhpcy5fY2xlYXJWaWV3cG9ydCgpO3RoaXMuX3VwZGF0ZVZpZXdwb3J0KE51bWJlci5jb25zdHJhaW4oc2Nyb2xsVG9wLDAsdGhpcy5fdG90YWxIZWlnaHQoKS12aWV3cG9ydEhlaWdodCksdmlld3BvcnRIZWlnaHQpO30KaW52YWxpZGF0ZUl0ZW1IZWlnaHQoKXtpZih0aGlzLl9tb2RlIT09VUkuTGlzdE1vZGUuRXF1YWxIZWlnaHRJdGVtcyl7Y29uc29sZS5lcnJvcignT25seSBzdXBwb3J0ZWQgaW4gZXF1YWwgaGVpZ2h0IGl0ZW1zIG1vZGUnKTtyZXR1cm47fQp0aGlzLl9maXhlZEhlaWdodD0wO2lmKHRoaXMuX21vZGVsLmxlbmd0aCl7dGhpcy5faXRlbVRvRWxlbWVudC5jbGVhcigpO3RoaXMuX2ludmFsaWRhdGUoMCx0aGlzLl9tb2RlbC5sZW5ndGgsdGhpcy5fbW9kZWwubGVuZ3RoKTt9fQppdGVtRm9yTm9kZShub2RlKXt3aGlsZShub2RlJiZub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKSE9PXRoaXMuZWxlbWVudCkKbm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKTtpZighbm9kZSkKcmV0dXJuIG51bGw7Y29uc3QgZWxlbWVudD0obm9kZSk7Y29uc3QgaW5kZXg9dGhpcy5fbW9kZWwuZmluZEluZGV4KGl0ZW09PnRoaXMuX2l0ZW1Ub0VsZW1lbnQuZ2V0KGl0ZW0pPT09ZWxlbWVudCk7cmV0dXJuIGluZGV4IT09LTE/dGhpcy5fbW9kZWwuYXQoaW5kZXgpOm51bGw7fQpzY3JvbGxJdGVtSW50b1ZpZXcoaXRlbSxjZW50ZXIpe2NvbnN0IGluZGV4PXRoaXMuX21vZGVsLmluZGV4T2YoaXRlbSk7aWYoaW5kZXg9PT0tMSl7Y29uc29sZS5lcnJvcignQXR0ZW1wdCB0byBzY3JvbGwgb250byBtaXNzaW5nIGl0ZW0nKTtyZXR1cm47fQp0aGlzLl9zY3JvbGxJbnRvVmlldyhpbmRleCxjZW50ZXIpO30Kc2VsZWN0ZWRJdGVtKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbTt9CnNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleDt9CnNlbGVjdEl0ZW0oaXRlbSxjZW50ZXIsZG9udFNjcm9sbCl7bGV0IGluZGV4PS0xO2lmKGl0ZW0hPT1udWxsKXtpbmRleD10aGlzLl9tb2RlbC5pbmRleE9mKGl0ZW0pO2lmKGluZGV4PT09LTEpe2NvbnNvbGUuZXJyb3IoJ0F0dGVtcHQgdG8gc2VsZWN0IG1pc3NpbmcgaXRlbScpO3JldHVybjt9CmlmKCF0aGlzLl9kZWxlZ2F0ZS5pc0l0ZW1TZWxlY3RhYmxlKGl0ZW0pKXtjb25zb2xlLmVycm9yKCdBdHRlbXB0IHRvIHNlbGVjdCBub24tc2VsZWN0YWJsZSBpdGVtJyk7cmV0dXJuO319CmlmKHRoaXMuX3NlbGVjdGVkSW5kZXghPT1pbmRleCkKdGhpcy5fc2VsZWN0KGluZGV4KTtpZihpbmRleCE9PS0xJiYhZG9udFNjcm9sbCkKdGhpcy5fc2Nyb2xsSW50b1ZpZXcoaW5kZXgsY2VudGVyKTt9CnNlbGVjdFByZXZpb3VzSXRlbShjYW5XcmFwLGNlbnRlcil7aWYodGhpcy5fc2VsZWN0ZWRJbmRleD09PS0xJiYhY2FuV3JhcCkKcmV0dXJuIGZhbHNlO2xldCBpbmRleD10aGlzLl9zZWxlY3RlZEluZGV4PT09LTE/dGhpcy5fbW9kZWwubGVuZ3RoLTE6dGhpcy5fc2VsZWN0ZWRJbmRleC0xO2luZGV4PXRoaXMuX2ZpbmRGaXJzdFNlbGVjdGFibGUoaW5kZXgsLTEsISFjYW5XcmFwKTtpZihpbmRleCE9PS0xKXt0aGlzLl9zY3JvbGxJbnRvVmlldyhpbmRleCxjZW50ZXIpO3RoaXMuX3NlbGVjdChpbmRleCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpzZWxlY3ROZXh0SXRlbShjYW5XcmFwLGNlbnRlcil7aWYodGhpcy5fc2VsZWN0ZWRJbmRleD09PS0xJiYhY2FuV3JhcCkKcmV0dXJuIGZhbHNlO2xldCBpbmRleD10aGlzLl9zZWxlY3RlZEluZGV4PT09LTE/MDp0aGlzLl9zZWxlY3RlZEluZGV4KzE7aW5kZXg9dGhpcy5fZmluZEZpcnN0U2VsZWN0YWJsZShpbmRleCwrMSwhIWNhbldyYXApO2lmKGluZGV4IT09LTEpe3RoaXMuX3Njcm9sbEludG9WaWV3KGluZGV4LGNlbnRlcik7dGhpcy5fc2VsZWN0KGluZGV4KTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CnNlbGVjdEl0ZW1QcmV2aW91c1BhZ2UoY2VudGVyKXtpZih0aGlzLl9tb2RlPT09VUkuTGlzdE1vZGUuTm9uVmlld3BvcnQpCnJldHVybiBmYWxzZTtsZXQgaW5kZXg9dGhpcy5fc2VsZWN0ZWRJbmRleD09PS0xP3RoaXMuX21vZGVsLmxlbmd0aC0xOnRoaXMuX3NlbGVjdGVkSW5kZXg7aW5kZXg9dGhpcy5fZmluZFBhZ2VTZWxlY3RhYmxlKGluZGV4LC0xKTtpZihpbmRleCE9PS0xKXt0aGlzLl9zY3JvbGxJbnRvVmlldyhpbmRleCxjZW50ZXIpO3RoaXMuX3NlbGVjdChpbmRleCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpzZWxlY3RJdGVtTmV4dFBhZ2UoY2VudGVyKXtpZih0aGlzLl9tb2RlPT09VUkuTGlzdE1vZGUuTm9uVmlld3BvcnQpCnJldHVybiBmYWxzZTtsZXQgaW5kZXg9dGhpcy5fc2VsZWN0ZWRJbmRleD09PS0xPzA6dGhpcy5fc2VsZWN0ZWRJbmRleDtpbmRleD10aGlzLl9maW5kUGFnZVNlbGVjdGFibGUoaW5kZXgsKzEpO2lmKGluZGV4IT09LTEpe3RoaXMuX3Njcm9sbEludG9WaWV3KGluZGV4LGNlbnRlcik7dGhpcy5fc2VsZWN0KGluZGV4KTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9Cl9zY3JvbGxJbnRvVmlldyhpbmRleCxjZW50ZXIpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCl7dGhpcy5fZWxlbWVudEF0SW5kZXgoaW5kZXgpLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoISFjZW50ZXIpO3JldHVybjt9CmNvbnN0IHRvcD10aGlzLl9vZmZzZXRBdEluZGV4KGluZGV4KTtjb25zdCBib3R0b209dGhpcy5fb2Zmc2V0QXRJbmRleChpbmRleCsxKTtjb25zdCB2aWV3cG9ydEhlaWdodD10aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O2lmKGNlbnRlcil7Y29uc3Qgc2Nyb2xsVG89KHRvcCtib3R0b20pLzItdmlld3BvcnRIZWlnaHQvMjt0aGlzLl91cGRhdGVWaWV3cG9ydChOdW1iZXIuY29uc3RyYWluKHNjcm9sbFRvLDAsdGhpcy5fdG90YWxIZWlnaHQoKS12aWV3cG9ydEhlaWdodCksdmlld3BvcnRIZWlnaHQpO3JldHVybjt9CmNvbnN0IHNjcm9sbFRvcD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO2lmKHRvcDxzY3JvbGxUb3ApCnRoaXMuX3VwZGF0ZVZpZXdwb3J0KHRvcCx2aWV3cG9ydEhlaWdodCk7ZWxzZSBpZihib3R0b20+c2Nyb2xsVG9wK3ZpZXdwb3J0SGVpZ2h0KQp0aGlzLl91cGRhdGVWaWV3cG9ydChib3R0b20tdmlld3BvcnRIZWlnaHQsdmlld3BvcnRIZWlnaHQpO30KX29uQ2xpY2soZXZlbnQpe2NvbnN0IGl0ZW09dGhpcy5pdGVtRm9yTm9kZSgoZXZlbnQudGFyZ2V0KSk7aWYoaXRlbSYmdGhpcy5fZGVsZWdhdGUuaXNJdGVtU2VsZWN0YWJsZShpdGVtKSkKdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO30KX29uS2V5RG93bihldmVudCl7bGV0IHNlbGVjdGVkPWZhbHNlO3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6c2VsZWN0ZWQ9dGhpcy5zZWxlY3RQcmV2aW91c0l0ZW0odHJ1ZSxmYWxzZSk7YnJlYWs7Y2FzZSdBcnJvd0Rvd24nOnNlbGVjdGVkPXRoaXMuc2VsZWN0TmV4dEl0ZW0odHJ1ZSxmYWxzZSk7YnJlYWs7Y2FzZSdQYWdlVXAnOnNlbGVjdGVkPXRoaXMuc2VsZWN0SXRlbVByZXZpb3VzUGFnZShmYWxzZSk7YnJlYWs7Y2FzZSdQYWdlRG93bic6c2VsZWN0ZWQ9dGhpcy5zZWxlY3RJdGVtTmV4dFBhZ2UoZmFsc2UpO2JyZWFrO30KaWYoc2VsZWN0ZWQpCmV2ZW50LmNvbnN1bWUoKTt9Cl90b3RhbEhlaWdodCgpe3JldHVybiB0aGlzLl9vZmZzZXRBdEluZGV4KHRoaXMuX21vZGVsLmxlbmd0aCk7fQpfaW5kZXhBdE9mZnNldChvZmZzZXQpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCkKdGhyb3cnVGhlcmUgc2hvdWxkIGJlIG5vIG9mZnNldCBjb252ZXJzaW9ucyBpbiBub24tdmlld3BvcnQgbW9kZSc7aWYoIXRoaXMuX21vZGVsLmxlbmd0aHx8b2Zmc2V0PDApCnJldHVybiAwO2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5WYXJpb3VzSGVpZ2h0SXRlbXMpe3JldHVybiBNYXRoLm1pbih0aGlzLl9tb2RlbC5sZW5ndGgtMSx0aGlzLl92YXJpYWJsZU9mZnNldHMubG93ZXJCb3VuZChvZmZzZXQsdW5kZWZpbmVkLDAsdGhpcy5fbW9kZWwubGVuZ3RoKSk7fQppZighdGhpcy5fZml4ZWRIZWlnaHQpCnRoaXMuX21lYXN1cmVIZWlnaHQoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fbW9kZWwubGVuZ3RoLTEsTWF0aC5mbG9vcihvZmZzZXQvdGhpcy5fZml4ZWRIZWlnaHQpKTt9Cl9lbGVtZW50QXRJbmRleChpbmRleCl7Y29uc3QgaXRlbT10aGlzLl9tb2RlbC5hdChpbmRleCk7bGV0IGVsZW1lbnQ9dGhpcy5faXRlbVRvRWxlbWVudC5nZXQoaXRlbSk7aWYoIWVsZW1lbnQpe2VsZW1lbnQ9dGhpcy5fZGVsZWdhdGUuY3JlYXRlRWxlbWVudEZvckl0ZW0oaXRlbSk7dGhpcy5faXRlbVRvRWxlbWVudC5zZXQoaXRlbSxlbGVtZW50KTt9CnJldHVybiBlbGVtZW50O30KX29mZnNldEF0SW5kZXgoaW5kZXgpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCkKdGhyb3cnVGhlcmUgc2hvdWxkIGJlIG5vIG9mZnNldCBjb252ZXJzaW9ucyBpbiBub24tdmlld3BvcnQgbW9kZSc7aWYoIXRoaXMuX21vZGVsLmxlbmd0aCkKcmV0dXJuIDA7aWYodGhpcy5fbW9kZT09PVVJLkxpc3RNb2RlLlZhcmlvdXNIZWlnaHRJdGVtcykKcmV0dXJuIHRoaXMuX3ZhcmlhYmxlT2Zmc2V0c1tpbmRleF07aWYoIXRoaXMuX2ZpeGVkSGVpZ2h0KQp0aGlzLl9tZWFzdXJlSGVpZ2h0KCk7cmV0dXJuIGluZGV4KnRoaXMuX2ZpeGVkSGVpZ2h0O30KX21lYXN1cmVIZWlnaHQoKXt0aGlzLl9maXhlZEhlaWdodD10aGlzLl9kZWxlZ2F0ZS5oZWlnaHRGb3JJdGVtKHRoaXMuX21vZGVsLmF0KDApKTtpZighdGhpcy5fZml4ZWRIZWlnaHQpCnRoaXMuX2ZpeGVkSGVpZ2h0PVVJLm1lYXN1cmVQcmVmZXJyZWRTaXplKHRoaXMuX2VsZW1lbnRBdEluZGV4KDApLHRoaXMuZWxlbWVudCkuaGVpZ2h0O30KX3NlbGVjdChpbmRleCxvbGRJdGVtLG9sZEVsZW1lbnQpe2lmKG9sZEl0ZW09PT11bmRlZmluZWQpCm9sZEl0ZW09dGhpcy5fc2VsZWN0ZWRJdGVtO2lmKG9sZEVsZW1lbnQ9PT11bmRlZmluZWQpCm9sZEVsZW1lbnQ9dGhpcy5faXRlbVRvRWxlbWVudC5nZXQob2xkSXRlbSl8fG51bGw7dGhpcy5fc2VsZWN0ZWRJbmRleD1pbmRleDt0aGlzLl9zZWxlY3RlZEl0ZW09aW5kZXg9PT0tMT9udWxsOnRoaXMuX21vZGVsLmF0KGluZGV4KTtjb25zdCBuZXdJdGVtPXRoaXMuX3NlbGVjdGVkSXRlbTtjb25zdCBuZXdFbGVtZW50PXRoaXMuX3NlbGVjdGVkSW5kZXghPT0tMT90aGlzLl9lbGVtZW50QXRJbmRleChpbmRleCk6bnVsbDt0aGlzLl9kZWxlZ2F0ZS5zZWxlY3RlZEl0ZW1DaGFuZ2VkKG9sZEl0ZW0sbmV3SXRlbSwob2xkRWxlbWVudCksbmV3RWxlbWVudCk7fQpfZmluZEZpcnN0U2VsZWN0YWJsZShpbmRleCxkaXJlY3Rpb24sY2FuV3JhcCl7Y29uc3QgbGVuZ3RoPXRoaXMuX21vZGVsLmxlbmd0aDtpZighbGVuZ3RoKQpyZXR1cm4tMTtmb3IobGV0IHN0ZXA9MDtzdGVwPD1sZW5ndGg7c3RlcCsrKXtpZihpbmRleDwwfHxpbmRleD49bGVuZ3RoKXtpZighY2FuV3JhcCkKcmV0dXJuLTE7aW5kZXg9KGluZGV4K2xlbmd0aCklbGVuZ3RoO30KaWYodGhpcy5fZGVsZWdhdGUuaXNJdGVtU2VsZWN0YWJsZSh0aGlzLl9tb2RlbC5hdChpbmRleCkpKQpyZXR1cm4gaW5kZXg7aW5kZXgrPWRpcmVjdGlvbjt9CnJldHVybi0xO30KX2ZpbmRQYWdlU2VsZWN0YWJsZShpbmRleCxkaXJlY3Rpb24pe2xldCBsYXN0U2VsZWN0YWJsZT0tMTtjb25zdCBzdGFydE9mZnNldD10aGlzLl9vZmZzZXRBdEluZGV4KGluZGV4KTtjb25zdCB2aWV3cG9ydEhlaWdodD10aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0LTE7d2hpbGUoaW5kZXg+PTAmJmluZGV4PHRoaXMuX21vZGVsLmxlbmd0aCl7aWYodGhpcy5fZGVsZWdhdGUuaXNJdGVtU2VsZWN0YWJsZSh0aGlzLl9tb2RlbC5hdChpbmRleCkpKXtpZihNYXRoLmFicyh0aGlzLl9vZmZzZXRBdEluZGV4KGluZGV4KS1zdGFydE9mZnNldCk+PXZpZXdwb3J0SGVpZ2h0KQpyZXR1cm4gaW5kZXg7bGFzdFNlbGVjdGFibGU9aW5kZXg7fQppbmRleCs9ZGlyZWN0aW9uO30KcmV0dXJuIGxhc3RTZWxlY3RhYmxlO30KX3JlYWxsb2NhdGVWYXJpYWJsZU9mZnNldHMobGVuZ3RoLGNvcHlUbyl7aWYodGhpcy5fdmFyaWFibGVPZmZzZXRzLmxlbmd0aDxsZW5ndGgpe2NvbnN0IHZhcmlhYmxlT2Zmc2V0cz1uZXcgSW50MzJBcnJheShNYXRoLm1heChsZW5ndGgsdGhpcy5fdmFyaWFibGVPZmZzZXRzLmxlbmd0aCoyKSk7dmFyaWFibGVPZmZzZXRzLnNldCh0aGlzLl92YXJpYWJsZU9mZnNldHMuc2xpY2UoMCxjb3B5VG8pLDApO3RoaXMuX3ZhcmlhYmxlT2Zmc2V0cz12YXJpYWJsZU9mZnNldHM7fWVsc2UgaWYodGhpcy5fdmFyaWFibGVPZmZzZXRzLmxlbmd0aD49MipsZW5ndGgpe2NvbnN0IHZhcmlhYmxlT2Zmc2V0cz1uZXcgSW50MzJBcnJheShsZW5ndGgpO3ZhcmlhYmxlT2Zmc2V0cy5zZXQodGhpcy5fdmFyaWFibGVPZmZzZXRzLnNsaWNlKDAsY29weVRvKSwwKTt0aGlzLl92YXJpYWJsZU9mZnNldHM9dmFyaWFibGVPZmZzZXRzO319Cl9pbnZhbGlkYXRlKGZyb20sdG8saW5zZXJ0ZWQpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCl7dGhpcy5faW52YWxpZGF0ZU5vblZpZXdwb3J0TW9kZShmcm9tLHRvLWZyb20saW5zZXJ0ZWQpO3JldHVybjt9CmlmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5WYXJpb3VzSGVpZ2h0SXRlbXMpe3RoaXMuX3JlYWxsb2NhdGVWYXJpYWJsZU9mZnNldHModGhpcy5fbW9kZWwubGVuZ3RoKzEsZnJvbSsxKTtmb3IobGV0IGk9ZnJvbSsxO2k8PXRoaXMuX21vZGVsLmxlbmd0aDtpKyspCnRoaXMuX3ZhcmlhYmxlT2Zmc2V0c1tpXT10aGlzLl92YXJpYWJsZU9mZnNldHNbaS0xXSt0aGlzLl9kZWxlZ2F0ZS5oZWlnaHRGb3JJdGVtKHRoaXMuX21vZGVsLmF0KGktMSkpO30KY29uc3Qgdmlld3BvcnRIZWlnaHQ9dGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodDtjb25zdCB0b3RhbEhlaWdodD10aGlzLl90b3RhbEhlaWdodCgpO2NvbnN0IHNjcm9sbFRvcD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO2lmKHRoaXMuX3JlbmRlcmVkSGVpZ2h0PHZpZXdwb3J0SGVpZ2h0fHx0b3RhbEhlaWdodDx2aWV3cG9ydEhlaWdodCl7dGhpcy5fY2xlYXJWaWV3cG9ydCgpO3RoaXMuX3VwZGF0ZVZpZXdwb3J0KE51bWJlci5jb25zdHJhaW4oc2Nyb2xsVG9wLDAsdG90YWxIZWlnaHQtdmlld3BvcnRIZWlnaHQpLHZpZXdwb3J0SGVpZ2h0KTtyZXR1cm47fQpjb25zdCBoZWlnaHREZWx0YT10b3RhbEhlaWdodC10aGlzLl9yZW5kZXJlZEhlaWdodDtpZih0bzw9dGhpcy5fZmlyc3RJbmRleCl7Y29uc3QgdG9wSGVpZ2h0PXRoaXMuX3RvcEhlaWdodCtoZWlnaHREZWx0YTt0aGlzLl90b3BFbGVtZW50LnN0eWxlLmhlaWdodD10b3BIZWlnaHQrJ3B4Jzt0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wPXNjcm9sbFRvcCtoZWlnaHREZWx0YTt0aGlzLl90b3BIZWlnaHQ9dG9wSGVpZ2h0O3RoaXMuX3JlbmRlcmVkSGVpZ2h0PXRvdGFsSGVpZ2h0O2NvbnN0IGluZGV4RGVsdGE9aW5zZXJ0ZWQtKHRvLWZyb20pO3RoaXMuX2ZpcnN0SW5kZXgrPWluZGV4RGVsdGE7dGhpcy5fbGFzdEluZGV4Kz1pbmRleERlbHRhO3JldHVybjt9CmlmKGZyb20+PXRoaXMuX2xhc3RJbmRleCl7Y29uc3QgYm90dG9tSGVpZ2h0PXRoaXMuX2JvdHRvbUhlaWdodCtoZWlnaHREZWx0YTt0aGlzLl9ib3R0b21FbGVtZW50LnN0eWxlLmhlaWdodD1ib3R0b21IZWlnaHQrJ3B4Jzt0aGlzLl9ib3R0b21IZWlnaHQ9Ym90dG9tSGVpZ2h0O3RoaXMuX3JlbmRlcmVkSGVpZ2h0PXRvdGFsSGVpZ2h0O3JldHVybjt9CnRoaXMuX2NsZWFyVmlld3BvcnQoKTt0aGlzLl91cGRhdGVWaWV3cG9ydChOdW1iZXIuY29uc3RyYWluKHNjcm9sbFRvcCwwLHRvdGFsSGVpZ2h0LXZpZXdwb3J0SGVpZ2h0KSx2aWV3cG9ydEhlaWdodCk7fQpfaW52YWxpZGF0ZU5vblZpZXdwb3J0TW9kZShzdGFydCxyZW1vdmUsYWRkKXtsZXQgc3RhcnRFbGVtZW50PXRoaXMuX3RvcEVsZW1lbnQ7Zm9yKGxldCBpbmRleD0wO2luZGV4PHN0YXJ0O2luZGV4KyspCnN0YXJ0RWxlbWVudD1zdGFydEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO3doaWxlKHJlbW92ZS0tKQpzdGFydEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO3doaWxlKGFkZC0tKQp0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2VsZW1lbnRBdEluZGV4KHN0YXJ0K2FkZCksc3RhcnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7fQpfY2xlYXJWaWV3cG9ydCgpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCl7Y29uc29sZS5lcnJvcignVGhlcmUgc2hvdWxkIGJlIG5vIHZpZXdwb3J0IHVwZGF0ZXMgaW4gbm9uLXZpZXdwb3J0IG1vZGUnKTtyZXR1cm47fQp0aGlzLl9maXJzdEluZGV4PTA7dGhpcy5fbGFzdEluZGV4PTA7dGhpcy5fcmVuZGVyZWRIZWlnaHQ9MDt0aGlzLl90b3BIZWlnaHQ9MDt0aGlzLl9ib3R0b21IZWlnaHQ9MDt0aGlzLl9jbGVhckNvbnRlbnRzKCk7fQpfY2xlYXJDb250ZW50cygpe3RoaXMuX3RvcEVsZW1lbnQuc3R5bGUuaGVpZ2h0PScwJzt0aGlzLl9ib3R0b21FbGVtZW50LnN0eWxlLmhlaWdodD0nMCc7dGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RvcEVsZW1lbnQpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9ib3R0b21FbGVtZW50KTt9Cl91cGRhdGVWaWV3cG9ydChzY3JvbGxUb3Asdmlld3BvcnRIZWlnaHQpe2lmKHRoaXMuX21vZGU9PT1VSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCl7Y29uc29sZS5lcnJvcignVGhlcmUgc2hvdWxkIGJlIG5vIHZpZXdwb3J0IHVwZGF0ZXMgaW4gbm9uLXZpZXdwb3J0IG1vZGUnKTtyZXR1cm47fQpjb25zdCB0b3RhbEhlaWdodD10aGlzLl90b3RhbEhlaWdodCgpO2lmKCF0b3RhbEhlaWdodCl7dGhpcy5fZmlyc3RJbmRleD0wO3RoaXMuX2xhc3RJbmRleD0wO3RoaXMuX3RvcEhlaWdodD0wO3RoaXMuX2JvdHRvbUhlaWdodD0wO3RoaXMuX3JlbmRlcmVkSGVpZ2h0PTA7dGhpcy5fdG9wRWxlbWVudC5zdHlsZS5oZWlnaHQ9JzAnO3RoaXMuX2JvdHRvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0PScwJztyZXR1cm47fQpjb25zdCBmaXJzdEluZGV4PXRoaXMuX2luZGV4QXRPZmZzZXQoc2Nyb2xsVG9wLXZpZXdwb3J0SGVpZ2h0KTtjb25zdCBsYXN0SW5kZXg9dGhpcy5faW5kZXhBdE9mZnNldChzY3JvbGxUb3ArMip2aWV3cG9ydEhlaWdodCkrMTt3aGlsZSh0aGlzLl9maXJzdEluZGV4PE1hdGgubWluKGZpcnN0SW5kZXgsdGhpcy5fbGFzdEluZGV4KSl7dGhpcy5fZWxlbWVudEF0SW5kZXgodGhpcy5fZmlyc3RJbmRleCkucmVtb3ZlKCk7dGhpcy5fZmlyc3RJbmRleCsrO30Kd2hpbGUodGhpcy5fbGFzdEluZGV4Pk1hdGgubWF4KGxhc3RJbmRleCx0aGlzLl9maXJzdEluZGV4KSl7dGhpcy5fZWxlbWVudEF0SW5kZXgodGhpcy5fbGFzdEluZGV4LTEpLnJlbW92ZSgpO3RoaXMuX2xhc3RJbmRleC0tO30KdGhpcy5fZmlyc3RJbmRleD1NYXRoLm1pbih0aGlzLl9maXJzdEluZGV4LGxhc3RJbmRleCk7dGhpcy5fbGFzdEluZGV4PU1hdGgubWF4KHRoaXMuX2xhc3RJbmRleCxmaXJzdEluZGV4KTtmb3IobGV0IGluZGV4PXRoaXMuX2ZpcnN0SW5kZXgtMTtpbmRleD49Zmlyc3RJbmRleDtpbmRleC0tKXtjb25zdCBlbGVtZW50PXRoaXMuX2VsZW1lbnRBdEluZGV4KGluZGV4KTt0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsdGhpcy5fdG9wRWxlbWVudC5uZXh0U2libGluZyk7fQpmb3IobGV0IGluZGV4PXRoaXMuX2xhc3RJbmRleDtpbmRleDxsYXN0SW5kZXg7aW5kZXgrKyl7Y29uc3QgZWxlbWVudD10aGlzLl9lbGVtZW50QXRJbmRleChpbmRleCk7dGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShlbGVtZW50LHRoaXMuX2JvdHRvbUVsZW1lbnQpO30KdGhpcy5fZmlyc3RJbmRleD1maXJzdEluZGV4O3RoaXMuX2xhc3RJbmRleD1sYXN0SW5kZXg7dGhpcy5fdG9wSGVpZ2h0PXRoaXMuX29mZnNldEF0SW5kZXgoZmlyc3RJbmRleCk7dGhpcy5fdG9wRWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5fdG9wSGVpZ2h0KydweCc7dGhpcy5fYm90dG9tSGVpZ2h0PXRvdGFsSGVpZ2h0LXRoaXMuX29mZnNldEF0SW5kZXgobGFzdEluZGV4KTt0aGlzLl9ib3R0b21FbGVtZW50LnN0eWxlLmhlaWdodD10aGlzLl9ib3R0b21IZWlnaHQrJ3B4Jzt0aGlzLl9yZW5kZXJlZEhlaWdodD10b3RhbEhlaWdodDt0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wPXNjcm9sbFRvcDt9fTs7VUkuTGlzdE1vZGVsPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihpdGVtcyl7c3VwZXIoKTt0aGlzLl9pdGVtcz1pdGVtc3x8W107fQpbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9pdGVtc1tTeW1ib2wuaXRlcmF0b3JdKCk7fQpnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aDt9CmF0KGluZGV4KXtyZXR1cm4gdGhpcy5faXRlbXNbaW5kZXhdO30KZXZlcnkoY2FsbGJhY2spe3JldHVybiB0aGlzLl9pdGVtcy5ldmVyeShjYWxsYmFjayk7fQpmaWx0ZXIoY2FsbGJhY2spe3JldHVybiB0aGlzLl9pdGVtcy5maWx0ZXIoY2FsbGJhY2spO30KZmluZChjYWxsYmFjayl7cmV0dXJuIHRoaXMuX2l0ZW1zLmZpbmQoY2FsbGJhY2spO30KZmluZEluZGV4KGNhbGxiYWNrKXtyZXR1cm4gdGhpcy5faXRlbXMuZmluZEluZGV4KGNhbGxiYWNrKTt9CmluZGV4T2YodmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdGhpcy5faXRlbXMuaW5kZXhPZih2YWx1ZSxmcm9tSW5kZXgpO30KaW5zZXJ0KGluZGV4LHZhbHVlKXt0aGlzLl9pdGVtcy5zcGxpY2UoaW5kZXgsMCx2YWx1ZSk7dGhpcy5fcmVwbGFjZWQoaW5kZXgsW10sMSk7fQppbnNlcnRXaXRoQ29tcGFyYXRvcih2YWx1ZSxjb21wYXJhdG9yKXt0aGlzLmluc2VydCh0aGlzLl9pdGVtcy5sb3dlckJvdW5kKHZhbHVlLGNvbXBhcmF0b3IpLHZhbHVlKTt9CmpvaW4oc2VwYXJhdG9yKXtyZXR1cm4gdGhpcy5faXRlbXMuam9pbihzZXBhcmF0b3IpO30KcmVtb3ZlKGluZGV4KXtjb25zdCByZXN1bHQ9dGhpcy5faXRlbXNbaW5kZXhdO3RoaXMuX2l0ZW1zLnNwbGljZShpbmRleCwxKTt0aGlzLl9yZXBsYWNlZChpbmRleCxbcmVzdWx0XSwwKTtyZXR1cm4gcmVzdWx0O30KcmVwbGFjZShpbmRleCx2YWx1ZSl7Y29uc3Qgb2xkVmFsdWU9dGhpcy5faXRlbXNbaW5kZXhdO3RoaXMuX2l0ZW1zW2luZGV4XT12YWx1ZTt0aGlzLl9yZXBsYWNlZChpbmRleCxbb2xkVmFsdWVdLDEpO3JldHVybiBvbGRWYWx1ZTt9CnJlcGxhY2VSYW5nZShmcm9tLHRvLGl0ZW1zKXtsZXQgcmVtb3ZlZDtpZihpdGVtcy5sZW5ndGg8MTAwMDApe3JlbW92ZWQ9dGhpcy5faXRlbXMuc3BsaWNlKGZyb20sdG8tZnJvbSwuLi5pdGVtcyk7fWVsc2V7cmVtb3ZlZD10aGlzLl9pdGVtcy5zbGljZShmcm9tLHRvKTtjb25zdCBiZWZvcmU9dGhpcy5faXRlbXMuc2xpY2UoMCxmcm9tKTtjb25zdCBhZnRlcj10aGlzLl9pdGVtcy5zbGljZSh0byk7dGhpcy5faXRlbXM9W10uY29uY2F0KGJlZm9yZSxpdGVtcyxhZnRlcik7fQp0aGlzLl9yZXBsYWNlZChmcm9tLHJlbW92ZWQsaXRlbXMubGVuZ3RoKTtyZXR1cm4gcmVtb3ZlZDt9CnJlcGxhY2VBbGwoaXRlbXMpe2NvbnN0IG9sZEl0ZW1zPXRoaXMuX2l0ZW1zLnNsaWNlKCk7dGhpcy5faXRlbXM9aXRlbXM7dGhpcy5fcmVwbGFjZWQoMCxvbGRJdGVtcyxpdGVtcy5sZW5ndGgpO3JldHVybiBvbGRJdGVtczt9CnNsaWNlKGZyb20sdG8pe3JldHVybiB0aGlzLl9pdGVtcy5zbGljZShmcm9tLHRvKTt9CnNvbWUoY2FsbGJhY2spe3JldHVybiB0aGlzLl9pdGVtcy5zb21lKGNhbGxiYWNrKTt9Cl9yZXBsYWNlZChpbmRleCxyZW1vdmVkLGluc2VydGVkKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5MaXN0TW9kZWwuRXZlbnRzLkl0ZW1zUmVwbGFjZWQse2luZGV4OmluZGV4LHJlbW92ZWQ6cmVtb3ZlZCxpbnNlcnRlZDppbnNlcnRlZH0pO319O1VJLkxpc3RNb2RlbC5FdmVudHM9e0l0ZW1zUmVwbGFjZWQ6U3ltYm9sKCdJdGVtc1JlcGxhY2VkJyksfTs7VUkuTGlzdFdpZGdldD1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoZGVsZWdhdGUpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvbGlzdFdpZGdldC5jc3MnKTt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl9saXN0PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xpc3QnKTt0aGlzLmVsZW1lbnQudGFiSW5kZXg9LTE7dGhpcy5fbGFzdFNlcGFyYXRvcj1mYWxzZTt0aGlzLl9mb2N1c1Jlc3RvcmVyPW51bGw7dGhpcy5faXRlbXM9W107dGhpcy5fZWRpdGFibGU9W107dGhpcy5fZWxlbWVudHM9W107dGhpcy5fZWRpdG9yPW51bGw7dGhpcy5fZWRpdEl0ZW09bnVsbDt0aGlzLl9lZGl0RWxlbWVudD1udWxsO3RoaXMuX2VtcHR5UGxhY2Vob2xkZXI9bnVsbDt0aGlzLl91cGRhdGVQbGFjZWhvbGRlcigpO30KY2xlYXIoKXt0aGlzLl9pdGVtcz1bXTt0aGlzLl9lZGl0YWJsZT1bXTt0aGlzLl9lbGVtZW50cz1bXTt0aGlzLl9sYXN0U2VwYXJhdG9yPWZhbHNlO3RoaXMuX2xpc3QucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl91cGRhdGVQbGFjZWhvbGRlcigpO3RoaXMuX3N0b3BFZGl0aW5nKCk7fQphcHBlbmRJdGVtKGl0ZW0sZWRpdGFibGUpe2lmKHRoaXMuX2xhc3RTZXBhcmF0b3ImJnRoaXMuX2l0ZW1zLmxlbmd0aCkKdGhpcy5fbGlzdC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdsaXN0LXNlcGFyYXRvcicpKTt0aGlzLl9sYXN0U2VwYXJhdG9yPWZhbHNlO3RoaXMuX2l0ZW1zLnB1c2goaXRlbSk7dGhpcy5fZWRpdGFibGUucHVzaChlZGl0YWJsZSk7Y29uc3QgZWxlbWVudD10aGlzLl9saXN0LmNyZWF0ZUNoaWxkKCdkaXYnLCdsaXN0LWl0ZW0nKTtlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2RlbGVnYXRlLnJlbmRlckl0ZW0oaXRlbSxlZGl0YWJsZSkpO2lmKGVkaXRhYmxlKXtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlJyk7ZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVDb250cm9scyhpdGVtLGVsZW1lbnQpKTt9CnRoaXMuX2VsZW1lbnRzLnB1c2goZWxlbWVudCk7dGhpcy5fdXBkYXRlUGxhY2Vob2xkZXIoKTt9CmFwcGVuZFNlcGFyYXRvcigpe3RoaXMuX2xhc3RTZXBhcmF0b3I9dHJ1ZTt9CnJlbW92ZUl0ZW0oaW5kZXgpe2lmKHRoaXMuX2VkaXRJdGVtPT09dGhpcy5faXRlbXNbaW5kZXhdKQp0aGlzLl9zdG9wRWRpdGluZygpO2NvbnN0IGVsZW1lbnQ9dGhpcy5fZWxlbWVudHNbaW5kZXhdO2NvbnN0IHByZXZpb3VzPWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztjb25zdCBwcmV2aW91c0lzU2VwYXJhdG9yPXByZXZpb3VzJiZwcmV2aW91cy5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3Qtc2VwYXJhdG9yJyk7Y29uc3QgbmV4dD1lbGVtZW50Lm5leHRFbGVtZW50U2libGluZztjb25zdCBuZXh0SXNTZXBhcmF0b3I9bmV4dCYmbmV4dC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3Qtc2VwYXJhdG9yJyk7aWYocHJldmlvdXNJc1NlcGFyYXRvciYmKG5leHRJc1NlcGFyYXRvcnx8IW5leHQpKQpwcmV2aW91cy5yZW1vdmUoKTtpZihuZXh0SXNTZXBhcmF0b3ImJiFwcmV2aW91cykKbmV4dC5yZW1vdmUoKTtlbGVtZW50LnJlbW92ZSgpO3RoaXMuX2VsZW1lbnRzLnNwbGljZShpbmRleCwxKTt0aGlzLl9pdGVtcy5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fZWRpdGFibGUuc3BsaWNlKGluZGV4LDEpO3RoaXMuX3VwZGF0ZVBsYWNlaG9sZGVyKCk7fQphZGROZXdJdGVtKGluZGV4LGl0ZW0pe3RoaXMuX3N0YXJ0RWRpdGluZyhpdGVtLG51bGwsdGhpcy5fZWxlbWVudHNbaW5kZXhdfHxudWxsKTt9CnNldEVtcHR5UGxhY2Vob2xkZXIoZWxlbWVudCl7dGhpcy5fZW1wdHlQbGFjZWhvbGRlcj1lbGVtZW50O3RoaXMuX3VwZGF0ZVBsYWNlaG9sZGVyKCk7fQpfY3JlYXRlQ29udHJvbHMoaXRlbSxlbGVtZW50KXtjb25zdCBjb250cm9scz1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdjb250cm9scy1jb250YWluZXIgZmlsbCcpO2NvbnRyb2xzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb250cm9scy1ncmFkaWVudCcpO2NvbnN0IGJ1dHRvbnM9Y29udHJvbHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbnRyb2xzLWJ1dHRvbnMnKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLGJ1dHRvbnMpO2NvbnN0IGVkaXRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdFZGl0JyksJ2xhcmdlaWNvbi1lZGl0Jyk7ZWRpdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLG9uRWRpdENsaWNrZWQuYmluZCh0aGlzKSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShlZGl0QnV0dG9uKTtjb25zdCByZW1vdmVCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUnKSwnbGFyZ2VpY29uLXRyYXNoLWJpbicpO3JlbW92ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLG9uUmVtb3ZlQ2xpY2tlZC5iaW5kKHRoaXMpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHJlbW92ZUJ1dHRvbik7cmV0dXJuIGNvbnRyb2xzO2Z1bmN0aW9uIG9uRWRpdENsaWNrZWQoKXtjb25zdCBpbmRleD10aGlzLl9lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO2NvbnN0IGluc2VydGlvblBvaW50PXRoaXMuX2VsZW1lbnRzW2luZGV4KzFdfHxudWxsO3RoaXMuX3N0YXJ0RWRpdGluZyhpdGVtLGVsZW1lbnQsaW5zZXJ0aW9uUG9pbnQpO30KZnVuY3Rpb24gb25SZW1vdmVDbGlja2VkKCl7Y29uc3QgaW5kZXg9dGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTt0aGlzLmVsZW1lbnQuZm9jdXMoKTt0aGlzLl9kZWxlZ2F0ZS5yZW1vdmVJdGVtUmVxdWVzdGVkKHRoaXMuX2l0ZW1zW2luZGV4XSxpbmRleCk7fX0Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO3RoaXMuX3N0b3BFZGl0aW5nKCk7fQpfdXBkYXRlUGxhY2Vob2xkZXIoKXtpZighdGhpcy5fZW1wdHlQbGFjZWhvbGRlcikKcmV0dXJuO2lmKCF0aGlzLl9lbGVtZW50cy5sZW5ndGgmJiF0aGlzLl9lZGl0b3IpCnRoaXMuX2xpc3QuYXBwZW5kQ2hpbGQodGhpcy5fZW1wdHlQbGFjZWhvbGRlcik7ZWxzZQp0aGlzLl9lbXB0eVBsYWNlaG9sZGVyLnJlbW92ZSgpO30KX3N0YXJ0RWRpdGluZyhpdGVtLGVsZW1lbnQsaW5zZXJ0aW9uUG9pbnQpe2lmKGVsZW1lbnQmJnRoaXMuX2VkaXRFbGVtZW50PT09ZWxlbWVudCkKcmV0dXJuO3RoaXMuX3N0b3BFZGl0aW5nKCk7dGhpcy5fZm9jdXNSZXN0b3Jlcj1uZXcgVUkuRWxlbWVudEZvY3VzUmVzdG9yZXIodGhpcy5lbGVtZW50KTt0aGlzLl9saXN0LmNsYXNzTGlzdC5hZGQoJ2xpc3QtZWRpdGluZycpO3RoaXMuX2VkaXRJdGVtPWl0ZW07dGhpcy5fZWRpdEVsZW1lbnQ9ZWxlbWVudDtpZihlbGVtZW50KQplbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO2NvbnN0IGluZGV4PWVsZW1lbnQ/dGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTotMTt0aGlzLl9lZGl0b3I9dGhpcy5fZGVsZWdhdGUuYmVnaW5FZGl0KGl0ZW0pO3RoaXMuX3VwZGF0ZVBsYWNlaG9sZGVyKCk7dGhpcy5fbGlzdC5pbnNlcnRCZWZvcmUodGhpcy5fZWRpdG9yLmVsZW1lbnQsaW5zZXJ0aW9uUG9pbnQpO3RoaXMuX2VkaXRvci5iZWdpbkVkaXQoaXRlbSxpbmRleCxlbGVtZW50P0NvbW1vbi5VSVN0cmluZygnU2F2ZScpOkNvbW1vbi5VSVN0cmluZygnQWRkJyksdGhpcy5fY29tbWl0RWRpdGluZy5iaW5kKHRoaXMpLHRoaXMuX3N0b3BFZGl0aW5nLmJpbmQodGhpcykpO30KX2NvbW1pdEVkaXRpbmcoKXtjb25zdCBlZGl0SXRlbT10aGlzLl9lZGl0SXRlbTtjb25zdCBpc05ldz0hdGhpcy5fZWRpdEVsZW1lbnQ7Y29uc3QgZWRpdG9yPSh0aGlzLl9lZGl0b3IpO3RoaXMuX3N0b3BFZGl0aW5nKCk7dGhpcy5fZGVsZWdhdGUuY29tbWl0RWRpdChlZGl0SXRlbSxlZGl0b3IsaXNOZXcpO30KX3N0b3BFZGl0aW5nKCl7dGhpcy5fbGlzdC5jbGFzc0xpc3QucmVtb3ZlKCdsaXN0LWVkaXRpbmcnKTtpZih0aGlzLl9mb2N1c1Jlc3RvcmVyKQp0aGlzLl9mb2N1c1Jlc3RvcmVyLnJlc3RvcmUoKTtpZih0aGlzLl9lZGl0RWxlbWVudCkKdGhpcy5fZWRpdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7aWYodGhpcy5fZWRpdG9yJiZ0aGlzLl9lZGl0b3IuZWxlbWVudC5wYXJlbnRFbGVtZW50KQp0aGlzLl9lZGl0b3IuZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9lZGl0b3I9bnVsbDt0aGlzLl9lZGl0SXRlbT1udWxsO3RoaXMuX2VkaXRFbGVtZW50PW51bGw7dGhpcy5fdXBkYXRlUGxhY2Vob2xkZXIoKTt9fTtVSS5MaXN0V2lkZ2V0LkRlbGVnYXRlPWZ1bmN0aW9uKCl7fTtVSS5MaXN0V2lkZ2V0LkRlbGVnYXRlLnByb3RvdHlwZT17cmVuZGVySXRlbShpdGVtLGVkaXRhYmxlKXt9LHJlbW92ZUl0ZW1SZXF1ZXN0ZWQoaXRlbSxpbmRleCl7fSxiZWdpbkVkaXQoaXRlbSl7fSxjb21taXRFZGl0KGl0ZW0sZWRpdG9yLGlzTmV3KXt9fTtVSS5MaXN0V2lkZ2V0LkVkaXRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdlZGl0b3ItY29udGFpbmVyJyk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLG9uS2V5RG93bi5iaW5kKG51bGwsaXNFc2NLZXksdGhpcy5fY2FuY2VsQ2xpY2tlZC5iaW5kKHRoaXMpKSxmYWxzZSk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLG9uS2V5RG93bi5iaW5kKG51bGwsaXNFbnRlcktleSx0aGlzLl9jb21taXRDbGlja2VkLmJpbmQodGhpcykpLGZhbHNlKTt0aGlzLl9jb250ZW50RWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2VkaXRvci1jb250ZW50Jyk7Y29uc3QgYnV0dG9uc1Jvdz10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2VkaXRvci1idXR0b25zJyk7dGhpcy5fY29tbWl0QnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oJycsdGhpcy5fY29tbWl0Q2xpY2tlZC5iaW5kKHRoaXMpLCcnLHRydWUpO2J1dHRvbnNSb3cuYXBwZW5kQ2hpbGQodGhpcy5fY29tbWl0QnV0dG9uKTt0aGlzLl9jYW5jZWxCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0NhbmNlbCcpLHRoaXMuX2NhbmNlbENsaWNrZWQuYmluZCh0aGlzKSk7dGhpcy5fY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLG9uS2V5RG93bi5iaW5kKG51bGwsaXNFbnRlcktleSx0aGlzLl9jYW5jZWxDbGlja2VkLmJpbmQodGhpcykpLGZhbHNlKTtidXR0b25zUm93LmFwcGVuZENoaWxkKHRoaXMuX2NhbmNlbEJ1dHRvbik7ZnVuY3Rpb24gb25LZXlEb3duKHByZWRpY2F0ZSxjYWxsYmFjayxldmVudCl7aWYocHJlZGljYXRlKGV2ZW50KSl7ZXZlbnQuY29uc3VtZSh0cnVlKTtjYWxsYmFjaygpO319CnRoaXMuX2NvbnRyb2xzPVtdO3RoaXMuX2NvbnRyb2xCeU5hbWU9bmV3IE1hcCgpO3RoaXMuX3ZhbGlkYXRvcnM9W107dGhpcy5fY29tbWl0PW51bGw7dGhpcy5fY2FuY2VsPW51bGw7dGhpcy5faXRlbT1udWxsO3RoaXMuX2luZGV4PS0xO30KY29udGVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fY29udGVudEVsZW1lbnQ7fQpjcmVhdGVJbnB1dChuYW1lLHR5cGUsdGl0bGUsdmFsaWRhdG9yKXtjb25zdCBpbnB1dD0oVUkuY3JlYXRlSW5wdXQoJycsdHlwZSkpO2lucHV0LnBsYWNlaG9sZGVyPXRpdGxlO2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jyx0aGlzLl92YWxpZGF0ZUNvbnRyb2xzLmJpbmQodGhpcyxmYWxzZSksZmFsc2UpO2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLHRoaXMuX3ZhbGlkYXRlQ29udHJvbHMuYmluZCh0aGlzLGZhbHNlKSxmYWxzZSk7dGhpcy5fY29udHJvbEJ5TmFtZS5zZXQobmFtZSxpbnB1dCk7dGhpcy5fY29udHJvbHMucHVzaChpbnB1dCk7dGhpcy5fdmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvcik7cmV0dXJuIGlucHV0O30KY3JlYXRlU2VsZWN0KG5hbWUsb3B0aW9ucyx2YWxpZGF0b3Ipe2NvbnN0IHNlbGVjdD0oY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc2VsZWN0JywnY2hyb21lLXNlbGVjdCcpKTtmb3IobGV0IGluZGV4PTA7aW5kZXg8b3B0aW9ucy5sZW5ndGg7KytpbmRleCl7Y29uc3Qgb3B0aW9uPXNlbGVjdC5jcmVhdGVDaGlsZCgnb3B0aW9uJyk7b3B0aW9uLnZhbHVlPW9wdGlvbnNbaW5kZXhdO29wdGlvbi50ZXh0Q29udGVudD1vcHRpb25zW2luZGV4XTt9CnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsdGhpcy5fdmFsaWRhdGVDb250cm9scy5iaW5kKHRoaXMsZmFsc2UpLGZhbHNlKTtzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsdGhpcy5fdmFsaWRhdGVDb250cm9scy5iaW5kKHRoaXMsZmFsc2UpLGZhbHNlKTt0aGlzLl9jb250cm9sQnlOYW1lLnNldChuYW1lLHNlbGVjdCk7dGhpcy5fY29udHJvbHMucHVzaChzZWxlY3QpO3RoaXMuX3ZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO3JldHVybiBzZWxlY3Q7fQpjb250cm9sKG5hbWUpe3JldHVybih0aGlzLl9jb250cm9sQnlOYW1lLmdldChuYW1lKSk7fQpfdmFsaWRhdGVDb250cm9scyhmb3JjZVZhbGlkKXtsZXQgYWxsVmFsaWQ9dHJ1ZTtmb3IobGV0IGluZGV4PTA7aW5kZXg8dGhpcy5fY29udHJvbHMubGVuZ3RoOysraW5kZXgpe2NvbnN0IGlucHV0PXRoaXMuX2NvbnRyb2xzW2luZGV4XTtjb25zdCB2YWxpZD10aGlzLl92YWxpZGF0b3JzW2luZGV4XS5jYWxsKG51bGwsdGhpcy5faXRlbSx0aGlzLl9pbmRleCxpbnB1dCk7aW5wdXQuY2xhc3NMaXN0LnRvZ2dsZSgnZXJyb3ItaW5wdXQnLCF2YWxpZCYmIWZvcmNlVmFsaWQpO2FsbFZhbGlkJj12YWxpZDt9CnRoaXMuX2NvbW1pdEJ1dHRvbi5kaXNhYmxlZD0hYWxsVmFsaWQ7fQpiZWdpbkVkaXQoaXRlbSxpbmRleCxjb21taXRCdXR0b25UaXRsZSxjb21taXQsY2FuY2VsKXt0aGlzLl9jb21taXQ9Y29tbWl0O3RoaXMuX2NhbmNlbD1jYW5jZWw7dGhpcy5faXRlbT1pdGVtO3RoaXMuX2luZGV4PWluZGV4O3RoaXMuX2NvbW1pdEJ1dHRvbi50ZXh0Q29udGVudD1jb21taXRCdXR0b25UaXRsZTt0aGlzLmVsZW1lbnQuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZChmYWxzZSk7aWYodGhpcy5fY29udHJvbHMubGVuZ3RoKQp0aGlzLl9jb250cm9sc1swXS5mb2N1cygpO3RoaXMuX3ZhbGlkYXRlQ29udHJvbHModHJ1ZSk7fQpfY29tbWl0Q2xpY2tlZCgpe2lmKHRoaXMuX2NvbW1pdEJ1dHRvbi5kaXNhYmxlZCkKcmV0dXJuO2NvbnN0IGNvbW1pdD10aGlzLl9jb21taXQ7dGhpcy5fY29tbWl0PW51bGw7dGhpcy5fY2FuY2VsPW51bGw7dGhpcy5faXRlbT1udWxsO3RoaXMuX2luZGV4PS0xO2NvbW1pdCgpO30KX2NhbmNlbENsaWNrZWQoKXtjb25zdCBjYW5jZWw9dGhpcy5fY2FuY2VsO3RoaXMuX2NvbW1pdD1udWxsO3RoaXMuX2NhbmNlbD1udWxsO3RoaXMuX2l0ZW09bnVsbDt0aGlzLl9pbmRleD0tMTtjYW5jZWwoKTt9fTs7VUkucGFuZWxzPXt9O1VJLlBhbmVsPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihuYW1lKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYW5lbCcpO3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLG5hbWUpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKG5hbWUpO3RoaXMuX3BhbmVsTmFtZT1uYW1lO1VJLnBhbmVsc1tuYW1lXT10aGlzO30KZ2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fcGFuZWxOYW1lO30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gbnVsbDt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7cmV0dXJuW107fQpzaG93SW5mb2JhcihpbmZvYmFyKXtpbmZvYmFyLnNldENsb3NlQ2FsbGJhY2sodGhpcy5fb25JbmZvYmFyQ2xvc2VkLmJpbmQodGhpcyxpbmZvYmFyKSk7aWYodGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpCnRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUoaW5mb2Jhci5lbGVtZW50LHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtlbHNlCnRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChpbmZvYmFyLmVsZW1lbnQpO2luZm9iYXIuc2V0UGFyZW50Vmlldyh0aGlzKTt0aGlzLmRvUmVzaXplKCk7fQpfb25JbmZvYmFyQ2xvc2VkKGluZm9iYXIpe2luZm9iYXIuZWxlbWVudC5yZW1vdmUoKTt0aGlzLmRvUmVzaXplKCk7fX07VUkuUGFuZWxXaXRoU2lkZWJhcj1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKG5hbWUsZGVmYXVsdFdpZHRoKXtzdXBlcihuYW1lKTt0aGlzLl9wYW5lbFNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLGZhbHNlLHRoaXMuX3BhbmVsTmFtZSsnUGFuZWxTcGxpdFZpZXdTdGF0ZScsZGVmYXVsdFdpZHRofHwyMDApO3RoaXMuX3BhbmVsU3BsaXRXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX21haW5XaWRnZXQ9bmV3IFVJLlZCb3goKTt0aGlzLl9wYW5lbFNwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fbWFpbldpZGdldCk7dGhpcy5fc2lkZWJhcldpZGdldD1uZXcgVUkuVkJveCgpO3RoaXMuX3NpZGViYXJXaWRnZXQuc2V0TWluaW11bVNpemUoMTAwLDI1KTt0aGlzLl9wYW5lbFNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQodGhpcy5fc2lkZWJhcldpZGdldCk7dGhpcy5fc2lkZWJhcldpZGdldC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BhbmVsLXNpZGViYXInKTt9CnBhbmVsU2lkZWJhckVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fc2lkZWJhcldpZGdldC5lbGVtZW50O30KbWFpbkVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbWFpbldpZGdldC5lbGVtZW50O30Kc3BsaXRXaWRnZXQoKXtyZXR1cm4gdGhpcy5fcGFuZWxTcGxpdFdpZGdldDt9fTs7VUkuUG9wb3ZlckhlbHBlcj1jbGFzc3tjb25zdHJ1Y3Rvcihjb250YWluZXIsZ2V0UmVxdWVzdCl7dGhpcy5fZGlzYWJsZU9uQ2xpY2s9ZmFsc2U7dGhpcy5faGFzUGFkZGluZz1mYWxzZTt0aGlzLl9nZXRSZXF1ZXN0PWdldFJlcXVlc3Q7dGhpcy5fc2NoZWR1bGVkUmVxdWVzdD1udWxsO3RoaXMuX2hpZGVQb3BvdmVyQ2FsbGJhY2s9bnVsbDt0aGlzLl9jb250YWluZXI9Y29udGFpbmVyO3RoaXMuX3Nob3dUaW1lb3V0PTA7dGhpcy5faGlkZVRpbWVvdXQ9MDt0aGlzLl9oaWRlUG9wb3ZlclRpbWVyPW51bGw7dGhpcy5fc2hvd1BvcG92ZXJUaW1lcj1udWxsO3RoaXMuX2JvdW5kTW91c2VEb3duPXRoaXMuX21vdXNlRG93bi5iaW5kKHRoaXMpO3RoaXMuX2JvdW5kTW91c2VNb3ZlPXRoaXMuX21vdXNlTW92ZS5iaW5kKHRoaXMpO3RoaXMuX2JvdW5kTW91c2VPdXQ9dGhpcy5fbW91c2VPdXQuYmluZCh0aGlzKTt0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9ib3VuZE1vdXNlRG93bixmYWxzZSk7dGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fYm91bmRNb3VzZU1vdmUsZmFsc2UpO3RoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsdGhpcy5fYm91bmRNb3VzZU91dCxmYWxzZSk7dGhpcy5zZXRUaW1lb3V0KDEwMDApO30Kc2V0VGltZW91dChzaG93VGltZW91dCxoaWRlVGltZW91dCl7dGhpcy5fc2hvd1RpbWVvdXQ9c2hvd1RpbWVvdXQ7dGhpcy5faGlkZVRpbWVvdXQ9dHlwZW9mIGhpZGVUaW1lb3V0PT09J251bWJlcic/aGlkZVRpbWVvdXQ6c2hvd1RpbWVvdXQvMjt9CnNldEhhc1BhZGRpbmcoaGFzUGFkZGluZyl7dGhpcy5faGFzUGFkZGluZz1oYXNQYWRkaW5nO30Kc2V0RGlzYWJsZU9uQ2xpY2soZGlzYWJsZU9uQ2xpY2spe3RoaXMuX2Rpc2FibGVPbkNsaWNrPWRpc2FibGVPbkNsaWNrO30KX2V2ZW50SW5TY2hlZHVsZWRDb250ZW50KGV2ZW50KXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVkUmVxdWVzdD90aGlzLl9zY2hlZHVsZWRSZXF1ZXN0LmJveC5jb250YWlucyhldmVudC5jbGllbnRYLGV2ZW50LmNsaWVudFkpOmZhbHNlO30KX21vdXNlRG93bihldmVudCl7aWYodGhpcy5fZGlzYWJsZU9uQ2xpY2spe3RoaXMuaGlkZVBvcG92ZXIoKTtyZXR1cm47fQppZih0aGlzLl9ldmVudEluU2NoZWR1bGVkQ29udGVudChldmVudCkpCnJldHVybjt0aGlzLl9zdGFydEhpZGVQb3BvdmVyVGltZXIoMCk7dGhpcy5fc3RvcFNob3dQb3BvdmVyVGltZXIoKTt0aGlzLl9zdGFydFNob3dQb3BvdmVyVGltZXIoKGV2ZW50KSwwKTt9Cl9tb3VzZU1vdmUoZXZlbnQpe2lmKHRoaXMuX2V2ZW50SW5TY2hlZHVsZWRDb250ZW50KGV2ZW50KSkKcmV0dXJuO3RoaXMuX3N0YXJ0SGlkZVBvcG92ZXJUaW1lcih0aGlzLl9oaWRlVGltZW91dCk7dGhpcy5fc3RvcFNob3dQb3BvdmVyVGltZXIoKTtpZihldmVudC53aGljaCYmdGhpcy5fZGlzYWJsZU9uQ2xpY2spCnJldHVybjt0aGlzLl9zdGFydFNob3dQb3BvdmVyVGltZXIoKGV2ZW50KSx0aGlzLmlzUG9wb3ZlclZpc2libGUoKT90aGlzLl9zaG93VGltZW91dCowLjY6dGhpcy5fc2hvd1RpbWVvdXQpO30KX3BvcG92ZXJNb3VzZU1vdmUoZXZlbnQpe3RoaXMuX3N0b3BIaWRlUG9wb3ZlclRpbWVyKCk7fQpfcG9wb3Zlck1vdXNlT3V0KHBvcG92ZXIsZXZlbnQpe2lmKCFwb3BvdmVyLmlzU2hvd2luZygpKQpyZXR1cm47aWYoZXZlbnQucmVsYXRlZFRhcmdldCYmIWV2ZW50LnJlbGF0ZWRUYXJnZXQuaXNTZWxmT3JEZXNjZW5kYW50KHBvcG92ZXIuY29udGVudEVsZW1lbnQpKQp0aGlzLl9zdGFydEhpZGVQb3BvdmVyVGltZXIodGhpcy5faGlkZVRpbWVvdXQpO30KX21vdXNlT3V0KGV2ZW50KXtpZighdGhpcy5pc1BvcG92ZXJWaXNpYmxlKCkpCnJldHVybjtpZighdGhpcy5fZXZlbnRJblNjaGVkdWxlZENvbnRlbnQoZXZlbnQpKQp0aGlzLl9zdGFydEhpZGVQb3BvdmVyVGltZXIodGhpcy5faGlkZVRpbWVvdXQpO30KX3N0YXJ0SGlkZVBvcG92ZXJUaW1lcih0aW1lb3V0KXtpZighdGhpcy5faGlkZVBvcG92ZXJDYWxsYmFja3x8dGhpcy5faGlkZVBvcG92ZXJUaW1lcikKcmV0dXJuO3RoaXMuX2hpZGVQb3BvdmVyVGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMuX2hpZGVQb3BvdmVyKCk7dGhpcy5faGlkZVBvcG92ZXJUaW1lcj1udWxsO30sdGltZW91dCk7fQpfc3RhcnRTaG93UG9wb3ZlclRpbWVyKGV2ZW50LHRpbWVvdXQpe3RoaXMuX3NjaGVkdWxlZFJlcXVlc3Q9dGhpcy5fZ2V0UmVxdWVzdC5jYWxsKG51bGwsZXZlbnQpO2lmKCF0aGlzLl9zY2hlZHVsZWRSZXF1ZXN0KQpyZXR1cm47dGhpcy5fc2hvd1BvcG92ZXJUaW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy5fc2hvd1BvcG92ZXJUaW1lcj1udWxsO3RoaXMuX3N0b3BIaWRlUG9wb3ZlclRpbWVyKCk7dGhpcy5faGlkZVBvcG92ZXIoKTt0aGlzLl9zaG93UG9wb3ZlcihldmVudC50YXJnZXQub3duZXJEb2N1bWVudCk7fSx0aW1lb3V0KTt9Cl9zdG9wU2hvd1BvcG92ZXJUaW1lcigpe2lmKCF0aGlzLl9zaG93UG9wb3ZlclRpbWVyKQpyZXR1cm47Y2xlYXJUaW1lb3V0KHRoaXMuX3Nob3dQb3BvdmVyVGltZXIpO3RoaXMuX3Nob3dQb3BvdmVyVGltZXI9bnVsbDt9CmlzUG9wb3ZlclZpc2libGUoKXtyZXR1cm4hIXRoaXMuX2hpZGVQb3BvdmVyQ2FsbGJhY2s7fQpoaWRlUG9wb3Zlcigpe3RoaXMuX3N0b3BTaG93UG9wb3ZlclRpbWVyKCk7dGhpcy5faGlkZVBvcG92ZXIoKTt9Cl9oaWRlUG9wb3Zlcigpe2lmKCF0aGlzLl9oaWRlUG9wb3ZlckNhbGxiYWNrKQpyZXR1cm47dGhpcy5faGlkZVBvcG92ZXJDYWxsYmFjay5jYWxsKG51bGwpO3RoaXMuX2hpZGVQb3BvdmVyQ2FsbGJhY2s9bnVsbDt9Cl9zaG93UG9wb3Zlcihkb2N1bWVudCl7Y29uc3QgcG9wb3Zlcj1uZXcgVUkuR2xhc3NQYW5lKCk7cG9wb3Zlci5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9wb3BvdmVyLmNzcycpO3BvcG92ZXIuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO3BvcG92ZXIuc2V0TWFyZ2luQmVoYXZpb3IoVUkuR2xhc3NQYW5lLk1hcmdpbkJlaGF2aW9yLkFycm93KTtjb25zdCByZXF1ZXN0PXRoaXMuX3NjaGVkdWxlZFJlcXVlc3Q7cmVxdWVzdC5zaG93LmNhbGwobnVsbCxwb3BvdmVyKS50aGVuKHN1Y2Nlc3M9PntpZighc3VjY2VzcykKcmV0dXJuO2lmKHRoaXMuX3NjaGVkdWxlZFJlcXVlc3QhPT1yZXF1ZXN0KXtpZihyZXF1ZXN0LmhpZGUpCnJlcXVlc3QuaGlkZS5jYWxsKG51bGwpO3JldHVybjt9CmlmKFVJLlBvcG92ZXJIZWxwZXIuX3BvcG92ZXJIZWxwZXIpe2NvbnNvbGUuZXJyb3IoJ09uZSBwb3BvdmVyIGlzIGFscmVhZHkgdmlzaWJsZScpO1VJLlBvcG92ZXJIZWxwZXIuX3BvcG92ZXJIZWxwZXIuaGlkZVBvcG92ZXIoKTt9ClVJLlBvcG92ZXJIZWxwZXIuX3BvcG92ZXJIZWxwZXI9dGhpcztwb3BvdmVyLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hhcy1wYWRkaW5nJyx0aGlzLl9oYXNQYWRkaW5nKTtwb3BvdmVyLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fcG9wb3Zlck1vdXNlTW92ZS5iaW5kKHRoaXMpLHRydWUpO3BvcG92ZXIuY29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLHRoaXMuX3BvcG92ZXJNb3VzZU91dC5iaW5kKHRoaXMscG9wb3ZlciksdHJ1ZSk7cG9wb3Zlci5zZXRDb250ZW50QW5jaG9yQm94KHJlcXVlc3QuYm94KTtwb3BvdmVyLnNob3coZG9jdW1lbnQpO3RoaXMuX2hpZGVQb3BvdmVyQ2FsbGJhY2s9KCk9PntpZihyZXF1ZXN0LmhpZGUpCnJlcXVlc3QuaGlkZS5jYWxsKG51bGwpO3BvcG92ZXIuaGlkZSgpO2RlbGV0ZSBVSS5Qb3BvdmVySGVscGVyLl9wb3BvdmVySGVscGVyO307fSk7fQpfc3RvcEhpZGVQb3BvdmVyVGltZXIoKXtpZighdGhpcy5faGlkZVBvcG92ZXJUaW1lcikKcmV0dXJuO2NsZWFyVGltZW91dCh0aGlzLl9oaWRlUG9wb3ZlclRpbWVyKTt0aGlzLl9oaWRlUG9wb3ZlclRpbWVyPW51bGw7dGhpcy5fc3RvcFNob3dQb3BvdmVyVGltZXIoKTt9CmRpc3Bvc2UoKXt0aGlzLl9jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9ib3VuZE1vdXNlRG93bixmYWxzZSk7dGhpcy5fY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fYm91bmRNb3VzZU1vdmUsZmFsc2UpO3RoaXMuX2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsdGhpcy5fYm91bmRNb3VzZU91dCxmYWxzZSk7fX07VUkuUG9wb3ZlclJlcXVlc3Q7O1VJLlByb2dyZXNzSW5kaWNhdG9yPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Byb2dyZXNzLWluZGljYXRvcicpO3RoaXMuX3NoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuZWxlbWVudCwndWkvcHJvZ3Jlc3NJbmRpY2F0b3IuY3NzJyk7dGhpcy5fY29udGVudEVsZW1lbnQ9dGhpcy5fc2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2JywncHJvZ3Jlc3MtaW5kaWNhdG9yLXNoYWRvdy1jb250YWluZXInKTt0aGlzLl9sYWJlbEVsZW1lbnQ9dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpdGxlJyk7dGhpcy5fcHJvZ3Jlc3NFbGVtZW50PXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdwcm9ncmVzcycpO3RoaXMuX3Byb2dyZXNzRWxlbWVudC52YWx1ZT0wO3RoaXMuX3N0b3BCdXR0b249dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2J1dHRvbicsJ3Byb2dyZXNzLWluZGljYXRvci1zaGFkb3ctc3RvcC1idXR0b24nKTt0aGlzLl9zdG9wQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmNhbmNlbC5iaW5kKHRoaXMpKTt0aGlzLl9pc0NhbmNlbGVkPWZhbHNlO3RoaXMuX3dvcmtlZD0wO30Kc2hvdyhwYXJlbnQpe3BhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO30KZG9uZSgpe2lmKHRoaXMuX2lzRG9uZSkKcmV0dXJuO3RoaXMuX2lzRG9uZT10cnVlO3RoaXMuZWxlbWVudC5yZW1vdmUoKTt9CmNhbmNlbCgpe3RoaXMuX2lzQ2FuY2VsZWQ9dHJ1ZTt9CmlzQ2FuY2VsZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxlZDt9CnNldFRpdGxlKHRpdGxlKXt0aGlzLl9sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQ9dGl0bGU7fQpzZXRUb3RhbFdvcmsodG90YWxXb3JrKXt0aGlzLl9wcm9ncmVzc0VsZW1lbnQubWF4PXRvdGFsV29yazt9CnNldFdvcmtlZCh3b3JrZWQsdGl0bGUpe3RoaXMuX3dvcmtlZD13b3JrZWQ7dGhpcy5fcHJvZ3Jlc3NFbGVtZW50LnZhbHVlPXdvcmtlZDtpZih0aXRsZSkKdGhpcy5zZXRUaXRsZSh0aXRsZSk7fQp3b3JrZWQod29ya2VkKXt0aGlzLnNldFdvcmtlZCh0aGlzLl93b3JrZWQrKHdvcmtlZHx8MSkpO319OztVSS5SZXNpemVyV2lkZ2V0PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5faXNFbmFibGVkPXRydWU7dGhpcy5fZWxlbWVudHM9W107dGhpcy5faW5zdGFsbERyYWdPbk1vdXNlRG93bkJvdW5kPXRoaXMuX2luc3RhbGxEcmFnT25Nb3VzZURvd24uYmluZCh0aGlzKTt0aGlzLl9jdXJzb3I9J253c2UtcmVzaXplJzt9CmlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl9pc0VuYWJsZWQ7fQpzZXRFbmFibGVkKGVuYWJsZWQpe3RoaXMuX2lzRW5hYmxlZD1lbmFibGVkO3RoaXMudXBkYXRlRWxlbWVudEN1cnNvcnMoKTt9CmVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRzLnNsaWNlKCk7fQphZGRFbGVtZW50KGVsZW1lbnQpe2lmKHRoaXMuX2VsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkhPT0tMSkKcmV0dXJuO3RoaXMuX2VsZW1lbnRzLnB1c2goZWxlbWVudCk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX2luc3RhbGxEcmFnT25Nb3VzZURvd25Cb3VuZCxmYWxzZSk7dGhpcy5fdXBkYXRlRWxlbWVudEN1cnNvcihlbGVtZW50KTt9CnJlbW92ZUVsZW1lbnQoZWxlbWVudCl7aWYodGhpcy5fZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KT09PS0xKQpyZXR1cm47dGhpcy5fZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpO2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9pbnN0YWxsRHJhZ09uTW91c2VEb3duQm91bmQsZmFsc2UpO2VsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2N1cnNvcicpO30KdXBkYXRlRWxlbWVudEN1cnNvcnMoKXt0aGlzLl9lbGVtZW50cy5mb3JFYWNoKHRoaXMuX3VwZGF0ZUVsZW1lbnRDdXJzb3IuYmluZCh0aGlzKSk7fQpfdXBkYXRlRWxlbWVudEN1cnNvcihlbGVtZW50KXtpZih0aGlzLl9pc0VuYWJsZWQpCmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2N1cnNvcicsdGhpcy5jdXJzb3IoKSk7ZWxzZQplbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdjdXJzb3InKTt9CmN1cnNvcigpe3JldHVybiB0aGlzLl9jdXJzb3I7fQpzZXRDdXJzb3IoY3Vyc29yKXt0aGlzLl9jdXJzb3I9Y3Vyc29yO3RoaXMudXBkYXRlRWxlbWVudEN1cnNvcnMoKTt9Cl9pbnN0YWxsRHJhZ09uTW91c2VEb3duKGV2ZW50KXtpZih0aGlzLl9lbGVtZW50cy5pbmRleE9mKGV2ZW50LnRhcmdldCk9PT0tMSkKcmV0dXJuIGZhbHNlO1VJLmVsZW1lbnREcmFnU3RhcnQoKGV2ZW50LnRhcmdldCksdGhpcy5fZHJhZ1N0YXJ0LmJpbmQodGhpcyksdGhpcy5fZHJhZy5iaW5kKHRoaXMpLHRoaXMuX2RyYWdFbmQuYmluZCh0aGlzKSx0aGlzLmN1cnNvcigpLGV2ZW50KTt9Cl9kcmFnU3RhcnQoZXZlbnQpe2lmKCF0aGlzLl9pc0VuYWJsZWQpCnJldHVybiBmYWxzZTt0aGlzLl9zdGFydFg9ZXZlbnQucGFnZVg7dGhpcy5fc3RhcnRZPWV2ZW50LnBhZ2VZO3RoaXMuc2VuZERyYWdTdGFydCh0aGlzLl9zdGFydFgsdGhpcy5fc3RhcnRZKTtyZXR1cm4gdHJ1ZTt9CnNlbmREcmFnU3RhcnQoeCx5KXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5SZXNpemVyV2lkZ2V0LkV2ZW50cy5SZXNpemVTdGFydCx7c3RhcnRYOngsY3VycmVudFg6eCxzdGFydFk6eSxjdXJyZW50WTp5fSk7fQpfZHJhZyhldmVudCl7aWYoIXRoaXMuX2lzRW5hYmxlZCl7dGhpcy5fZHJhZ0VuZChldmVudCk7cmV0dXJuIHRydWU7fQp0aGlzLnNlbmREcmFnTW92ZSh0aGlzLl9zdGFydFgsZXZlbnQucGFnZVgsdGhpcy5fc3RhcnRZLGV2ZW50LnBhZ2VZLGV2ZW50LnNoaWZ0S2V5KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBmYWxzZTt9CnNlbmREcmFnTW92ZShzdGFydFgsY3VycmVudFgsc3RhcnRZLGN1cnJlbnRZLHNoaWZ0S2V5KXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5SZXNpemVyV2lkZ2V0LkV2ZW50cy5SZXNpemVVcGRhdGUse3N0YXJ0WDpzdGFydFgsY3VycmVudFg6Y3VycmVudFgsc3RhcnRZOnN0YXJ0WSxjdXJyZW50WTpjdXJyZW50WSxzaGlmdEtleTpzaGlmdEtleX0pO30KX2RyYWdFbmQoZXZlbnQpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZUVuZCk7ZGVsZXRlIHRoaXMuX3N0YXJ0WDtkZWxldGUgdGhpcy5fc3RhcnRZO319O1VJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzPXtSZXNpemVTdGFydDpTeW1ib2woJ1Jlc2l6ZVN0YXJ0JyksUmVzaXplVXBkYXRlOlN5bWJvbCgnUmVzaXplVXBkYXRlJyksUmVzaXplRW5kOlN5bWJvbCgnUmVzaXplRW5kJyl9O1VJLlNpbXBsZVJlc2l6ZXJXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5SZXNpemVyV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9pc1ZlcnRpY2FsPXRydWU7fQppc1ZlcnRpY2FsKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw7fQpzZXRWZXJ0aWNhbCh2ZXJ0aWNhbCl7dGhpcy5faXNWZXJ0aWNhbD12ZXJ0aWNhbDt0aGlzLnVwZGF0ZUVsZW1lbnRDdXJzb3JzKCk7fQpjdXJzb3IoKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD8nbnMtcmVzaXplJzonZXctcmVzaXplJzt9CnNlbmREcmFnU3RhcnQoeCx5KXtjb25zdCBwb3NpdGlvbj10aGlzLl9pc1ZlcnRpY2FsP3k6eDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5SZXNpemVyV2lkZ2V0LkV2ZW50cy5SZXNpemVTdGFydCx7c3RhcnRQb3NpdGlvbjpwb3NpdGlvbixjdXJyZW50UG9zaXRpb246cG9zaXRpb259KTt9CnNlbmREcmFnTW92ZShzdGFydFgsY3VycmVudFgsc3RhcnRZLGN1cnJlbnRZLHNoaWZ0S2V5KXtpZih0aGlzLl9pc1ZlcnRpY2FsKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5SZXNpemVyV2lkZ2V0LkV2ZW50cy5SZXNpemVVcGRhdGUse3N0YXJ0UG9zaXRpb246c3RhcnRZLGN1cnJlbnRQb3NpdGlvbjpjdXJyZW50WSxzaGlmdEtleTpzaGlmdEtleX0pO31lbHNle3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZVVwZGF0ZSx7c3RhcnRQb3NpdGlvbjpzdGFydFgsY3VycmVudFBvc2l0aW9uOmN1cnJlbnRYLHNoaWZ0S2V5OnNoaWZ0S2V5fSk7fX19OztVSS5SZW1vdGVEZWJ1Z2dpbmdUZXJtaW5hdGVkU2NyZWVuPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihyZWFzb24pe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvcmVtb3RlRGVidWdnaW5nVGVybWluYXRlZFNjcmVlbi5jc3MnKTtjb25zdCBtZXNzYWdlPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ21lc3NhZ2UnKTttZXNzYWdlLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdEZWJ1Z2dpbmcgY29ubmVjdGlvbiB3YXMgY2xvc2VkLiBSZWFzb246ICcpO21lc3NhZ2UuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdyZWFzb24nKS50ZXh0Q29udGVudD1yZWFzb247dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVzc2FnZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUmVjb25uZWN0IHdoZW4gcmVhZHkgYnkgcmVvcGVuaW5nIERldlRvb2xzLicpO2NvbnN0IGJ1dHRvbj1VSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVjb25uZWN0IERldlRvb2xzJyksKCk9PndpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYnV0dG9uJykuYXBwZW5kQ2hpbGQoYnV0dG9uKTt9CnN0YXRpYyBzaG93KHJlYXNvbil7Y29uc3QgZGlhbG9nPW5ldyBVSS5EaWFsb2coKTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5hZGRDbG9zZUJ1dHRvbigpO2RpYWxvZy5zZXREaW1tZWQodHJ1ZSk7bmV3IFVJLlJlbW90ZURlYnVnZ2luZ1Rlcm1pbmF0ZWRTY3JlZW4ocmVhc29uKS5zaG93KGRpYWxvZy5jb250ZW50RWxlbWVudCk7ZGlhbG9nLnNob3coKTt9fTs7VUkuUmVwb3J0Vmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IodGl0bGUpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvcmVwb3J0Vmlldy5jc3MnKTt0aGlzLl9jb250ZW50Qm94PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlcG9ydC1jb250ZW50LWJveCcpO3RoaXMuX2hlYWRlckVsZW1lbnQ9dGhpcy5fY29udGVudEJveC5jcmVhdGVDaGlsZCgnZGl2JywncmVwb3J0LWhlYWRlciB2Ym94Jyk7dGhpcy5fdGl0bGVFbGVtZW50PXRoaXMuX2hlYWRlckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlcG9ydC10aXRsZScpO3RoaXMuX3RpdGxlRWxlbWVudC50ZXh0Q29udGVudD10aXRsZTt0aGlzLl9zZWN0aW9uTGlzdD10aGlzLl9jb250ZW50Qm94LmNyZWF0ZUNoaWxkKCdkaXYnLCd2Ym94Jyk7fQpzZXRUaXRsZSh0aXRsZSl7aWYodGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50PT09dGl0bGUpCnJldHVybjt0aGlzLl90aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9dGl0bGU7fQpzZXRTdWJ0aXRsZShzdWJ0aXRsZSl7aWYodGhpcy5fc3VidGl0bGVFbGVtZW50JiZ0aGlzLl9zdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9PT1zdWJ0aXRsZSkKcmV0dXJuO2lmKCF0aGlzLl9zdWJ0aXRsZUVsZW1lbnQpCnRoaXMuX3N1YnRpdGxlRWxlbWVudD10aGlzLl9oZWFkZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZXBvcnQtc3VidGl0bGUnKTt0aGlzLl9zdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9c3VidGl0bGU7fQpzZXRVUkwobGluayl7aWYoIXRoaXMuX3VybEVsZW1lbnQpCnRoaXMuX3VybEVsZW1lbnQ9dGhpcy5faGVhZGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncmVwb3J0LXVybCBsaW5rJyk7dGhpcy5fdXJsRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2lmKGxpbmspCnRoaXMuX3VybEVsZW1lbnQuYXBwZW5kQ2hpbGQobGluayk7fQpjcmVhdGVUb29sYmFyKCl7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyk7dGhpcy5faGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZCh0b29sYmFyLmVsZW1lbnQpO3JldHVybiB0b29sYmFyO30KYXBwZW5kU2VjdGlvbih0aXRsZSxjbGFzc05hbWUpe2NvbnN0IHNlY3Rpb249bmV3IFVJLlJlcG9ydFZpZXcuU2VjdGlvbih0aXRsZSxjbGFzc05hbWUpO3NlY3Rpb24uc2hvdyh0aGlzLl9zZWN0aW9uTGlzdCk7cmV0dXJuIHNlY3Rpb247fQpzb3J0U2VjdGlvbnMoY29tcGFyYXRvcil7Y29uc3Qgc2VjdGlvbnM9KHRoaXMuY2hpbGRyZW4oKS5zbGljZSgpKTtjb25zdCBzb3J0ZWQ9c2VjdGlvbnMuZXZlcnkoKGUsaSxhKT0+IWl8fGNvbXBhcmF0b3IoYVtpLTFdLGFbaV0pPD0wKTtpZihzb3J0ZWQpCnJldHVybjt0aGlzLmRldGFjaENoaWxkV2lkZ2V0cygpO3NlY3Rpb25zLnNvcnQoY29tcGFyYXRvcik7Zm9yKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpCnNlY3Rpb24uc2hvdyh0aGlzLl9zZWN0aW9uTGlzdCk7fQpzZXRIZWFkZXJWaXNpYmxlKHZpc2libGUpe3RoaXMuX2hlYWRlckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdmlzaWJsZSk7fQpzZXRCb2R5U2Nyb2xsYWJsZShzY3JvbGxhYmxlKXt0aGlzLl9jb250ZW50Qm94LmNsYXNzTGlzdC50b2dnbGUoJ25vLXNjcm9sbCcsIXNjcm9sbGFibGUpO319O1VJLlJlcG9ydFZpZXcuU2VjdGlvbj1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IodGl0bGUsY2xhc3NOYW1lKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXBvcnQtc2VjdGlvbicpO2lmKGNsYXNzTmFtZSkKdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTt0aGlzLl9oZWFkZXJFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncmVwb3J0LXNlY3Rpb24taGVhZGVyJyk7dGhpcy5fdGl0bGVFbGVtZW50PXRoaXMuX2hlYWRlckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlcG9ydC1zZWN0aW9uLXRpdGxlJyk7dGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50PXRpdGxlO3RoaXMuX2ZpZWxkTGlzdD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Zib3gnKTt0aGlzLl9maWVsZE1hcD1uZXcgTWFwKCk7fQp0aXRsZSgpe3JldHVybiB0aGlzLl90aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ7fQpzZXRUaXRsZSh0aXRsZSl7aWYodGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50IT09dGl0bGUpCnRoaXMuX3RpdGxlRWxlbWVudC50ZXh0Q29udGVudD10aXRsZTt9CmNyZWF0ZVRvb2xiYXIoKXtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnKTt0aGlzLl9oZWFkZXJFbGVtZW50LmFwcGVuZENoaWxkKHRvb2xiYXIuZWxlbWVudCk7cmV0dXJuIHRvb2xiYXI7fQphcHBlbmRGaWVsZCh0aXRsZSx0ZXh0VmFsdWUpe2xldCByb3c9dGhpcy5fZmllbGRNYXAuZ2V0KHRpdGxlKTtpZighcm93KXtyb3c9dGhpcy5fZmllbGRMaXN0LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZXBvcnQtZmllbGQnKTtyb3cuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlcG9ydC1maWVsZC1uYW1lJykudGV4dENvbnRlbnQ9dGl0bGU7dGhpcy5fZmllbGRNYXAuc2V0KHRpdGxlLHJvdyk7cm93LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZXBvcnQtZmllbGQtdmFsdWUnKTt9CmlmKHRleHRWYWx1ZSkKcm93Lmxhc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQ9dGV4dFZhbHVlO3JldHVybihyb3cubGFzdEVsZW1lbnRDaGlsZCk7fQpyZW1vdmVGaWVsZCh0aXRsZSl7Y29uc3Qgcm93PXRoaXMuX2ZpZWxkTWFwLmdldCh0aXRsZSk7aWYocm93KQpyb3cucmVtb3ZlKCk7dGhpcy5fZmllbGRNYXAuZGVsZXRlKHRpdGxlKTt9CnNldEZpZWxkVmlzaWJsZSh0aXRsZSx2aXNpYmxlKXtjb25zdCByb3c9dGhpcy5fZmllbGRNYXAuZ2V0KHRpdGxlKTtpZihyb3cpCnJvdy5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCF2aXNpYmxlKTt9CmZpZWxkVmFsdWUodGl0bGUpe2NvbnN0IHJvdz10aGlzLl9maWVsZE1hcC5nZXQodGl0bGUpO3JldHVybiByb3c/cm93Lmxhc3RFbGVtZW50Q2hpbGQ6bnVsbDt9CmFwcGVuZFJvdygpe3JldHVybiB0aGlzLl9maWVsZExpc3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlcG9ydC1yb3cnKTt9CmNsZWFyQ29udGVudCgpe3RoaXMuX2ZpZWxkTGlzdC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2ZpZWxkTWFwLmNsZWFyKCk7fX07O1VJLlJvb3RWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5tYXJrQXNSb290KCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jvb3QtdmlldycpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvcm9vdFZpZXcuY3NzJyk7dGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsZmFsc2UpO30KYXR0YWNoVG9Eb2N1bWVudChkb2N1bWVudCl7ZG9jdW1lbnQuZGVmYXVsdFZpZXcuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0aGlzLmRvUmVzaXplLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3dpbmRvdz1kb2N1bWVudC5kZWZhdWx0Vmlldzt0aGlzLmRvUmVzaXplKCk7dGhpcy5zaG93KChkb2N1bWVudC5ib2R5KSk7fQpkb1Jlc2l6ZSgpe2lmKHRoaXMuX3dpbmRvdyl7Y29uc3Qgc2l6ZT10aGlzLmNvbnN0cmFpbnRzKCkubWluaW11bTtjb25zdCB6b29tPVVJLnpvb21NYW5hZ2VyLnpvb21GYWN0b3IoKTtjb25zdCByaWdodD1NYXRoLm1pbigwLHRoaXMuX3dpbmRvdy5pbm5lcldpZHRoLXNpemUud2lkdGgvem9vbSk7dGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0PXJpZ2h0KydweCc7Y29uc3QgYm90dG9tPU1hdGgubWluKDAsdGhpcy5fd2luZG93LmlubmVySGVpZ2h0LXNpemUuaGVpZ2h0L3pvb20pO3RoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b209Ym90dG9tKydweCc7fQpzdXBlci5kb1Jlc2l6ZSgpO319OztVSS5TZWFyY2hhYmxlVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3Ioc2VhcmNoYWJsZSxzZXR0aW5nTmFtZSl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9zZWFyY2hhYmxlVmlldy5jc3MnKTt0aGlzLmVsZW1lbnRbVUkuU2VhcmNoYWJsZVZpZXcuX3N5bWJvbF09dGhpczt0aGlzLl9zZWFyY2hQcm92aWRlcj1zZWFyY2hhYmxlO3RoaXMuX3NldHRpbmc9c2V0dGluZ05hbWU/Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoc2V0dGluZ05hbWUse30pOm51bGw7dGhpcy5fcmVwbGFjZWFibGU9ZmFsc2U7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnY29udGVudCcpO3RoaXMuX2Zvb3RlckVsZW1lbnRDb250YWluZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VhcmNoLWJhciBoaWRkZW4nKTt0aGlzLl9mb290ZXJFbGVtZW50Q29udGFpbmVyLnN0eWxlLm9yZGVyPTEwMDt0aGlzLl9mb290ZXJFbGVtZW50PXRoaXMuX2Zvb3RlckVsZW1lbnRDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Rvb2xiYXItc2VhcmNoJyk7Y29uc3QgcmVwbGFjZVRvZ2dsZVRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3JlcGxhY2UtdG9nZ2xlLXRvb2xiYXInLHRoaXMuX2Zvb3RlckVsZW1lbnQpO3RoaXMuX3JlcGxhY2VUb2dnbGVCdXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUoQ29tbW9uLlVJU3RyaW5nKCdSZXBsYWNlJyksJ21lZGl1bWljb24tcmVwbGFjZScpO3RoaXMuX3JlcGxhY2VUb2dnbGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl90b2dnbGVSZXBsYWNlLHRoaXMpO3JlcGxhY2VUb2dnbGVUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3JlcGxhY2VUb2dnbGVCdXR0b24pO2NvbnN0IHNlYXJjaElucHV0RWxlbWVudHM9dGhpcy5fZm9vdGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndG9vbGJhci1zZWFyY2gtaW5wdXRzJyk7Y29uc3Qgc2VhcmNoQ29udHJvbEVsZW1lbnQ9c2VhcmNoSW5wdXRFbGVtZW50cy5jcmVhdGVDaGlsZCgnZGl2JywndG9vbGJhci1zZWFyY2gtY29udHJvbCcpO3RoaXMuX3NlYXJjaElucHV0RWxlbWVudD1VSS5IaXN0b3J5SW5wdXQuY3JlYXRlKCk7dGhpcy5fc2VhcmNoSW5wdXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1yZXBsYWNlJyk7dGhpcy5fc2VhcmNoSW5wdXRFbGVtZW50LmlkPSdzZWFyY2gtaW5wdXQtZmllbGQnO3RoaXMuX3NlYXJjaElucHV0RWxlbWVudC5wbGFjZWhvbGRlcj1Db21tb24uVUlTdHJpbmcoJ0ZpbmQnKTtzZWFyY2hDb250cm9sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQpO3RoaXMuX21hdGNoZXNFbGVtZW50PXNlYXJjaENvbnRyb2xFbGVtZW50LmNyZWF0ZUNoaWxkKCdsYWJlbCcsJ3NlYXJjaC1yZXN1bHRzLW1hdGNoZXMnKTt0aGlzLl9tYXRjaGVzRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZvcicsJ3NlYXJjaC1pbnB1dC1maWVsZCcpO2NvbnN0IHNlYXJjaE5hdmlnYXRpb25FbGVtZW50PXNlYXJjaENvbnRyb2xFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uLWNvbnRyb2xzJyk7dGhpcy5fc2VhcmNoTmF2aWdhdGlvblByZXZFbGVtZW50PXNlYXJjaE5hdmlnYXRpb25FbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uIHRvb2xiYXItc2VhcmNoLW5hdmlnYXRpb24tcHJldicpO3RoaXMuX3NlYXJjaE5hdmlnYXRpb25QcmV2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25QcmV2QnV0dG9uU2VhcmNoLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3NlYXJjaE5hdmlnYXRpb25QcmV2RWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ1NlYXJjaCBwcmV2aW91cycpO3RoaXMuX3NlYXJjaE5hdmlnYXRpb25OZXh0RWxlbWVudD1zZWFyY2hOYXZpZ2F0aW9uRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbiB0b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uLW5leHQnKTt0aGlzLl9zZWFyY2hOYXZpZ2F0aW9uTmV4dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uTmV4dEJ1dHRvblNlYXJjaC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9zZWFyY2hOYXZpZ2F0aW9uTmV4dEVsZW1lbnQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTZWFyY2ggbmV4dCcpO3RoaXMuX3NlYXJjaElucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vblNlYXJjaEtleURvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fcmVwbGFjZUlucHV0RWxlbWVudD1zZWFyY2hJbnB1dEVsZW1lbnRzLmNyZWF0ZUNoaWxkKCdpbnB1dCcsJ3NlYXJjaC1yZXBsYWNlIHRvb2xiYXItcmVwbGFjZS1jb250cm9sIGhpZGRlbicpO3RoaXMuX3JlcGxhY2VJbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25SZXBsYWNlS2V5RG93bi5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX3JlcGxhY2VJbnB1dEVsZW1lbnQucGxhY2Vob2xkZXI9Q29tbW9uLlVJU3RyaW5nKCdSZXBsYWNlJyk7dGhpcy5fYnV0dG9uc0NvbnRhaW5lcj10aGlzLl9mb290ZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLXNlYXJjaC1idXR0b25zJyk7Y29uc3QgZmlyc3RSb3dCdXR0b25zPXRoaXMuX2J1dHRvbnNDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpcnN0LXJvdy1idXR0b25zJyk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcigndG9vbGJhci1zZWFyY2gtb3B0aW9ucycsZmlyc3RSb3dCdXR0b25zKTtpZih0aGlzLl9zZWFyY2hQcm92aWRlci5zdXBwb3J0c0Nhc2VTZW5zaXRpdmVTZWFyY2goKSl7dGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbj1uZXcgVUkuVG9vbGJhclRvZ2dsZShDb21tb24uVUlTdHJpbmcoJ01hdGNoIENhc2UnKSk7dGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbi5zZXRUZXh0KCdBYScpO3RoaXMuX2Nhc2VTZW5zaXRpdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl90b2dnbGVDYXNlU2Vuc2l0aXZlU2VhcmNoLHRoaXMpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbik7fQppZih0aGlzLl9zZWFyY2hQcm92aWRlci5zdXBwb3J0c1JlZ2V4U2VhcmNoKCkpe3RoaXMuX3JlZ2V4QnV0dG9uPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKENvbW1vbi5VSVN0cmluZygnVXNlIFJlZ3VsYXIgRXhwcmVzc2lvbicpKTt0aGlzLl9yZWdleEJ1dHRvbi5zZXRUZXh0KCcuKicpO3RoaXMuX3JlZ2V4QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fdG9nZ2xlUmVnZXhTZWFyY2gsdGhpcyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9yZWdleEJ1dHRvbik7fQpjb25zdCBjYW5jZWxCdXR0b25FbGVtZW50PVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDYW5jZWwnKSx0aGlzLmNsb3NlU2VhcmNoLmJpbmQodGhpcyksJ3NlYXJjaC1hY3Rpb24tYnV0dG9uJyk7Zmlyc3RSb3dCdXR0b25zLmFwcGVuZENoaWxkKGNhbmNlbEJ1dHRvbkVsZW1lbnQpO3RoaXMuX3NlY29uZFJvd0J1dHRvbnM9dGhpcy5fYnV0dG9uc0NvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc2Vjb25kLXJvdy1idXR0b25zIGhpZGRlbicpO3RoaXMuX3JlcGxhY2VCdXR0b25FbGVtZW50PVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZXBsYWNlJyksdGhpcy5fcmVwbGFjZS5iaW5kKHRoaXMpLCdzZWFyY2gtYWN0aW9uLWJ1dHRvbicpO3RoaXMuX3JlcGxhY2VCdXR0b25FbGVtZW50LmRpc2FibGVkPXRydWU7dGhpcy5fc2Vjb25kUm93QnV0dG9ucy5hcHBlbmRDaGlsZCh0aGlzLl9yZXBsYWNlQnV0dG9uRWxlbWVudCk7dGhpcy5fcmVwbGFjZUFsbEJ1dHRvbkVsZW1lbnQ9VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1JlcGxhY2UgYWxsJyksdGhpcy5fcmVwbGFjZUFsbC5iaW5kKHRoaXMpLCdzZWFyY2gtYWN0aW9uLWJ1dHRvbicpO3RoaXMuX3NlY29uZFJvd0J1dHRvbnMuYXBwZW5kQ2hpbGQodGhpcy5fcmVwbGFjZUFsbEJ1dHRvbkVsZW1lbnQpO3RoaXMuX3JlcGxhY2VBbGxCdXR0b25FbGVtZW50LmRpc2FibGVkPXRydWU7dGhpcy5fbWluaW1hbFNlYXJjaFF1ZXJ5U2l6ZT0zO3RoaXMuX2xvYWRTZXR0aW5nKCk7fQpzdGF0aWMgZnJvbUVsZW1lbnQoZWxlbWVudCl7bGV0IHZpZXc9bnVsbDt3aGlsZShlbGVtZW50JiYhdmlldyl7dmlldz1lbGVtZW50W1VJLlNlYXJjaGFibGVWaWV3Ll9zeW1ib2xdO2VsZW1lbnQ9ZWxlbWVudC5wYXJlbnRFbGVtZW50T3JTaGFkb3dIb3N0KCk7fQpyZXR1cm4gdmlldzt9Cl90b2dnbGVDYXNlU2Vuc2l0aXZlU2VhcmNoKCl7dGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbi5zZXRUb2dnbGVkKCF0aGlzLl9jYXNlU2Vuc2l0aXZlQnV0dG9uLnRvZ2dsZWQoKSk7dGhpcy5fc2F2ZVNldHRpbmcoKTt0aGlzLl9wZXJmb3JtU2VhcmNoKGZhbHNlLHRydWUpO30KX3RvZ2dsZVJlZ2V4U2VhcmNoKCl7dGhpcy5fcmVnZXhCdXR0b24uc2V0VG9nZ2xlZCghdGhpcy5fcmVnZXhCdXR0b24udG9nZ2xlZCgpKTt0aGlzLl9zYXZlU2V0dGluZygpO3RoaXMuX3BlcmZvcm1TZWFyY2goZmFsc2UsdHJ1ZSk7fQpfdG9nZ2xlUmVwbGFjZSgpe3RoaXMuX3JlcGxhY2VUb2dnbGVCdXR0b24uc2V0VG9nZ2xlZCghdGhpcy5fcmVwbGFjZVRvZ2dsZUJ1dHRvbi50b2dnbGVkKCkpO3RoaXMuX3VwZGF0ZVNlY29uZFJvd1Zpc2liaWxpdHkoKTt9Cl9zYXZlU2V0dGluZygpe2lmKCF0aGlzLl9zZXR0aW5nKQpyZXR1cm47Y29uc3Qgc2V0dGluZ1ZhbHVlPXRoaXMuX3NldHRpbmcuZ2V0KCl8fHt9O3NldHRpbmdWYWx1ZS5jYXNlU2Vuc2l0aXZlPXRoaXMuX2Nhc2VTZW5zaXRpdmVCdXR0b24udG9nZ2xlZCgpO3NldHRpbmdWYWx1ZS5pc1JlZ2V4PXRoaXMuX3JlZ2V4QnV0dG9uLnRvZ2dsZWQoKTt0aGlzLl9zZXR0aW5nLnNldChzZXR0aW5nVmFsdWUpO30KX2xvYWRTZXR0aW5nKCl7Y29uc3Qgc2V0dGluZ1ZhbHVlPXRoaXMuX3NldHRpbmc/KHRoaXMuX3NldHRpbmcuZ2V0KCl8fHt9KTp7fTtpZih0aGlzLl9zZWFyY2hQcm92aWRlci5zdXBwb3J0c0Nhc2VTZW5zaXRpdmVTZWFyY2goKSkKdGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbi5zZXRUb2dnbGVkKCEhc2V0dGluZ1ZhbHVlLmNhc2VTZW5zaXRpdmUpO2lmKHRoaXMuX3NlYXJjaFByb3ZpZGVyLnN1cHBvcnRzUmVnZXhTZWFyY2goKSkKdGhpcy5fcmVnZXhCdXR0b24uc2V0VG9nZ2xlZCghIXNldHRpbmdWYWx1ZS5pc1JlZ2V4KTt9CnNldE1pbmltYWxTZWFyY2hRdWVyeVNpemUobWluaW1hbFNlYXJjaFF1ZXJ5U2l6ZSl7dGhpcy5fbWluaW1hbFNlYXJjaFF1ZXJ5U2l6ZT1taW5pbWFsU2VhcmNoUXVlcnlTaXplO30Kc2V0UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpe3RoaXMuX3NlYXJjaElucHV0RWxlbWVudC5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjt9CnNldFJlcGxhY2VhYmxlKHJlcGxhY2VhYmxlKXt0aGlzLl9yZXBsYWNlYWJsZT1yZXBsYWNlYWJsZTt9CnVwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudChtYXRjaGVzKXtpZih0aGlzLl9zZWFyY2hQcm92aWRlci5jdXJyZW50U2VhcmNoTWF0Y2hlcz09PW1hdGNoZXMpCnJldHVybjt0aGlzLl9zZWFyY2hQcm92aWRlci5jdXJyZW50U2VhcmNoTWF0Y2hlcz1tYXRjaGVzO3RoaXMuX3VwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudEFuZEN1cnJlbnRNYXRjaEluZGV4KHRoaXMuX3NlYXJjaFByb3ZpZGVyLmN1cnJlbnRRdWVyeT9tYXRjaGVzOjAsLTEpO30KdXBkYXRlQ3VycmVudE1hdGNoSW5kZXgoY3VycmVudE1hdGNoSW5kZXgpe3RoaXMuX3VwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudEFuZEN1cnJlbnRNYXRjaEluZGV4KHRoaXMuX3NlYXJjaFByb3ZpZGVyLmN1cnJlbnRTZWFyY2hNYXRjaGVzLGN1cnJlbnRNYXRjaEluZGV4KTt9CmlzU2VhcmNoVmlzaWJsZSgpe3JldHVybiB0aGlzLl9zZWFyY2hJc1Zpc2libGU7fQpjbG9zZVNlYXJjaCgpe3RoaXMuY2FuY2VsU2VhcmNoKCk7aWYodGhpcy5fZm9vdGVyRWxlbWVudENvbnRhaW5lci5oYXNGb2N1cygpKQp0aGlzLmZvY3VzKCk7fQpfdG9nZ2xlU2VhcmNoQmFyKHRvZ2dsZWQpe3RoaXMuX2Zvb3RlckVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdG9nZ2xlZCk7dGhpcy5kb1Jlc2l6ZSgpO30KY2FuY2VsU2VhcmNoKCl7aWYoIXRoaXMuX3NlYXJjaElzVmlzaWJsZSkKcmV0dXJuO3RoaXMucmVzZXRTZWFyY2goKTtkZWxldGUgdGhpcy5fc2VhcmNoSXNWaXNpYmxlO3RoaXMuX3RvZ2dsZVNlYXJjaEJhcihmYWxzZSk7fQpyZXNldFNlYXJjaCgpe3RoaXMuX2NsZWFyU2VhcmNoKCk7dGhpcy5fdXBkYXRlUmVwbGFjZVZpc2liaWxpdHkoKTt0aGlzLl9tYXRjaGVzRWxlbWVudC50ZXh0Q29udGVudD0nJzt9CnJlZnJlc2hTZWFyY2goKXtpZighdGhpcy5fc2VhcmNoSXNWaXNpYmxlKQpyZXR1cm47dGhpcy5yZXNldFNlYXJjaCgpO3RoaXMuX3BlcmZvcm1TZWFyY2goZmFsc2UsZmFsc2UpO30KaGFuZGxlRmluZE5leHRTaG9ydGN1dCgpe2lmKCF0aGlzLl9zZWFyY2hJc1Zpc2libGUpCnJldHVybiBmYWxzZTt0aGlzLl9zZWFyY2hQcm92aWRlci5qdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCk7cmV0dXJuIHRydWU7fQpoYW5kbGVGaW5kUHJldmlvdXNTaG9ydGN1dCgpe2lmKCF0aGlzLl9zZWFyY2hJc1Zpc2libGUpCnJldHVybiBmYWxzZTt0aGlzLl9zZWFyY2hQcm92aWRlci5qdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpO3JldHVybiB0cnVlO30KaGFuZGxlRmluZFNob3J0Y3V0KCl7dGhpcy5zaG93U2VhcmNoRmllbGQoKTtyZXR1cm4gdHJ1ZTt9CmhhbmRsZUNhbmNlbFNlYXJjaFNob3J0Y3V0KCl7aWYoIXRoaXMuX3NlYXJjaElzVmlzaWJsZSkKcmV0dXJuIGZhbHNlO3RoaXMuY2xvc2VTZWFyY2goKTtyZXR1cm4gdHJ1ZTt9Cl91cGRhdGVTZWFyY2hOYXZpZ2F0aW9uQnV0dG9uU3RhdGUoZW5hYmxlZCl7dGhpcy5fcmVwbGFjZUJ1dHRvbkVsZW1lbnQuZGlzYWJsZWQ9IWVuYWJsZWQ7dGhpcy5fcmVwbGFjZUFsbEJ1dHRvbkVsZW1lbnQuZGlzYWJsZWQ9IWVuYWJsZWQ7dGhpcy5fc2VhcmNoTmF2aWdhdGlvblByZXZFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2VuYWJsZWQnLGVuYWJsZWQpO3RoaXMuX3NlYXJjaE5hdmlnYXRpb25OZXh0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdlbmFibGVkJyxlbmFibGVkKTt9Cl91cGRhdGVTZWFyY2hNYXRjaGVzQ291bnRBbmRDdXJyZW50TWF0Y2hJbmRleChtYXRjaGVzLGN1cnJlbnRNYXRjaEluZGV4KXtpZighdGhpcy5fY3VycmVudFF1ZXJ5KQp0aGlzLl9tYXRjaGVzRWxlbWVudC50ZXh0Q29udGVudD0nJztlbHNlIGlmKG1hdGNoZXM9PT0wfHxjdXJyZW50TWF0Y2hJbmRleD49MCkKdGhpcy5fbWF0Y2hlc0VsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclZCBvZiAlZCcsY3VycmVudE1hdGNoSW5kZXgrMSxtYXRjaGVzKTtlbHNlIGlmKG1hdGNoZXM9PT0xKQp0aGlzLl9tYXRjaGVzRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJzEgbWF0Y2gnKTtlbHNlCnRoaXMuX21hdGNoZXNFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnJWQgbWF0Y2hlcycsbWF0Y2hlcyk7dGhpcy5fdXBkYXRlU2VhcmNoTmF2aWdhdGlvbkJ1dHRvblN0YXRlKG1hdGNoZXM+MCk7fQpzaG93U2VhcmNoRmllbGQoKXtpZih0aGlzLl9zZWFyY2hJc1Zpc2libGUpCnRoaXMuY2FuY2VsU2VhcmNoKCk7bGV0IHF1ZXJ5Q2FuZGlkYXRlO2lmKCF0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuaGFzRm9jdXMoKSl7Y29uc3Qgc2VsZWN0aW9uPVVJLmluc3BlY3RvclZpZXcuZWxlbWVudC53aW5kb3coKS5nZXRTZWxlY3Rpb24oKTtpZihzZWxlY3Rpb24ucmFuZ2VDb3VudCkKcXVlcnlDYW5kaWRhdGU9c2VsZWN0aW9uLnRvU3RyaW5nKCkucmVwbGFjZSgvXHI/XG4uKi8sJycpO30KdGhpcy5fdG9nZ2xlU2VhcmNoQmFyKHRydWUpO3RoaXMuX3VwZGF0ZVJlcGxhY2VWaXNpYmlsaXR5KCk7aWYocXVlcnlDYW5kaWRhdGUpCnRoaXMuX3NlYXJjaElucHV0RWxlbWVudC52YWx1ZT1xdWVyeUNhbmRpZGF0ZTt0aGlzLl9wZXJmb3JtU2VhcmNoKGZhbHNlLGZhbHNlKTt0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuZm9jdXMoKTt0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuc2VsZWN0KCk7dGhpcy5fc2VhcmNoSXNWaXNpYmxlPXRydWU7fQpfdXBkYXRlUmVwbGFjZVZpc2liaWxpdHkoKXt0aGlzLl9yZXBsYWNlVG9nZ2xlQnV0dG9uLnNldFZpc2libGUodGhpcy5fcmVwbGFjZWFibGUpO2lmKCF0aGlzLl9yZXBsYWNlYWJsZSl7dGhpcy5fcmVwbGFjZVRvZ2dsZUJ1dHRvbi5zZXRUb2dnbGVkKGZhbHNlKTt0aGlzLl91cGRhdGVTZWNvbmRSb3dWaXNpYmlsaXR5KCk7fX0KX29uU2VhcmNoS2V5RG93bihldmVudCl7aWYoaXNFc2NLZXkoZXZlbnQpKXt0aGlzLmNsb3NlU2VhcmNoKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQppZighaXNFbnRlcktleShldmVudCkpCnJldHVybjtpZighdGhpcy5fY3VycmVudFF1ZXJ5KQp0aGlzLl9wZXJmb3JtU2VhcmNoKHRydWUsdHJ1ZSxldmVudC5zaGlmdEtleSk7ZWxzZQp0aGlzLl9qdW1wVG9OZXh0U2VhcmNoUmVzdWx0KGV2ZW50LnNoaWZ0S2V5KTt9Cl9vblJlcGxhY2VLZXlEb3duKGV2ZW50KXtpZihpc0VudGVyS2V5KGV2ZW50KSkKdGhpcy5fcmVwbGFjZSgpO30KX2p1bXBUb05leHRTZWFyY2hSZXN1bHQoaXNCYWNrd2FyZFNlYXJjaCl7aWYoIXRoaXMuX2N1cnJlbnRRdWVyeXx8IXRoaXMuX3NlYXJjaE5hdmlnYXRpb25QcmV2RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2VuYWJsZWQnKSkKcmV0dXJuO2lmKGlzQmFja3dhcmRTZWFyY2gpCnRoaXMuX3NlYXJjaFByb3ZpZGVyLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCk7ZWxzZQp0aGlzLl9zZWFyY2hQcm92aWRlci5qdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCk7fQpfb25OZXh0QnV0dG9uU2VhcmNoKGV2ZW50KXtpZighdGhpcy5fc2VhcmNoTmF2aWdhdGlvbk5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZW5hYmxlZCcpKQpyZXR1cm47dGhpcy5fanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpO3RoaXMuX3NlYXJjaElucHV0RWxlbWVudC5mb2N1cygpO30KX29uUHJldkJ1dHRvblNlYXJjaChldmVudCl7aWYoIXRoaXMuX3NlYXJjaE5hdmlnYXRpb25QcmV2RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2VuYWJsZWQnKSkKcmV0dXJuO3RoaXMuX2p1bXBUb05leHRTZWFyY2hSZXN1bHQodHJ1ZSk7dGhpcy5fc2VhcmNoSW5wdXRFbGVtZW50LmZvY3VzKCk7fQpfb25GaW5kQ2xpY2soZXZlbnQpe2lmKCF0aGlzLl9jdXJyZW50UXVlcnkpCnRoaXMuX3BlcmZvcm1TZWFyY2godHJ1ZSx0cnVlKTtlbHNlCnRoaXMuX2p1bXBUb05leHRTZWFyY2hSZXN1bHQoKTt0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuZm9jdXMoKTt9Cl9vblByZXZpb3VzQ2xpY2soZXZlbnQpe2lmKCF0aGlzLl9jdXJyZW50UXVlcnkpCnRoaXMuX3BlcmZvcm1TZWFyY2godHJ1ZSx0cnVlLHRydWUpO2Vsc2UKdGhpcy5fanVtcFRvTmV4dFNlYXJjaFJlc3VsdCh0cnVlKTt0aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQuZm9jdXMoKTt9Cl9jbGVhclNlYXJjaCgpe2RlbGV0ZSB0aGlzLl9jdXJyZW50UXVlcnk7aWYoISF0aGlzLl9zZWFyY2hQcm92aWRlci5jdXJyZW50UXVlcnkpe2RlbGV0ZSB0aGlzLl9zZWFyY2hQcm92aWRlci5jdXJyZW50UXVlcnk7dGhpcy5fc2VhcmNoUHJvdmlkZXIuc2VhcmNoQ2FuY2VsZWQoKTt9CnRoaXMuX3VwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudEFuZEN1cnJlbnRNYXRjaEluZGV4KDAsLTEpO30KX3BlcmZvcm1TZWFyY2goZm9yY2VTZWFyY2gsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXtjb25zdCBxdWVyeT10aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQudmFsdWU7aWYoIXF1ZXJ5fHwoIWZvcmNlU2VhcmNoJiZxdWVyeS5sZW5ndGg8dGhpcy5fbWluaW1hbFNlYXJjaFF1ZXJ5U2l6ZSYmIXRoaXMuX2N1cnJlbnRRdWVyeSkpe3RoaXMuX2NsZWFyU2VhcmNoKCk7cmV0dXJuO30KdGhpcy5fY3VycmVudFF1ZXJ5PXF1ZXJ5O3RoaXMuX3NlYXJjaFByb3ZpZGVyLmN1cnJlbnRRdWVyeT1xdWVyeTtjb25zdCBzZWFyY2hDb25maWc9dGhpcy5fY3VycmVudFNlYXJjaENvbmZpZygpO3RoaXMuX3NlYXJjaFByb3ZpZGVyLnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyk7fQpfY3VycmVudFNlYXJjaENvbmZpZygpe2NvbnN0IHF1ZXJ5PXRoaXMuX3NlYXJjaElucHV0RWxlbWVudC52YWx1ZTtjb25zdCBjYXNlU2Vuc2l0aXZlPXRoaXMuX2Nhc2VTZW5zaXRpdmVCdXR0b24/dGhpcy5fY2FzZVNlbnNpdGl2ZUJ1dHRvbi50b2dnbGVkKCk6ZmFsc2U7Y29uc3QgaXNSZWdleD10aGlzLl9yZWdleEJ1dHRvbj90aGlzLl9yZWdleEJ1dHRvbi50b2dnbGVkKCk6ZmFsc2U7cmV0dXJuIG5ldyBVSS5TZWFyY2hhYmxlVmlldy5TZWFyY2hDb25maWcocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTt9Cl91cGRhdGVTZWNvbmRSb3dWaXNpYmlsaXR5KCl7Y29uc3Qgc2Vjb25kUm93VmlzaWJsZT10aGlzLl9yZXBsYWNlVG9nZ2xlQnV0dG9uLnRvZ2dsZWQoKTt0aGlzLl9mb290ZXJFbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ3JlcGxhY2VhYmxlJyxzZWNvbmRSb3dWaXNpYmxlKTt0aGlzLl9zZWNvbmRSb3dCdXR0b25zLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXNlY29uZFJvd1Zpc2libGUpO3RoaXMuX3JlcGxhY2VJbnB1dEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhc2Vjb25kUm93VmlzaWJsZSk7aWYoc2Vjb25kUm93VmlzaWJsZSkKdGhpcy5fcmVwbGFjZUlucHV0RWxlbWVudC5mb2N1cygpO2Vsc2UKdGhpcy5fc2VhcmNoSW5wdXRFbGVtZW50LmZvY3VzKCk7dGhpcy5kb1Jlc2l6ZSgpO30KX3JlcGxhY2UoKXtjb25zdCBzZWFyY2hDb25maWc9dGhpcy5fY3VycmVudFNlYXJjaENvbmZpZygpOyh0aGlzLl9zZWFyY2hQcm92aWRlcikucmVwbGFjZVNlbGVjdGlvbldpdGgoc2VhcmNoQ29uZmlnLHRoaXMuX3JlcGxhY2VJbnB1dEVsZW1lbnQudmFsdWUpO2RlbGV0ZSB0aGlzLl9jdXJyZW50UXVlcnk7dGhpcy5fcGVyZm9ybVNlYXJjaCh0cnVlLHRydWUpO30KX3JlcGxhY2VBbGwoKXtjb25zdCBzZWFyY2hDb25maWc9dGhpcy5fY3VycmVudFNlYXJjaENvbmZpZygpOyh0aGlzLl9zZWFyY2hQcm92aWRlcikucmVwbGFjZUFsbFdpdGgoc2VhcmNoQ29uZmlnLHRoaXMuX3JlcGxhY2VJbnB1dEVsZW1lbnQudmFsdWUpO30KX29uSW5wdXQoZXZlbnQpe2lmKHRoaXMuX3ZhbHVlQ2hhbmdlZFRpbWVvdXRJZCkKY2xlYXJUaW1lb3V0KHRoaXMuX3ZhbHVlQ2hhbmdlZFRpbWVvdXRJZCk7Y29uc3QgdGltZW91dD10aGlzLl9zZWFyY2hJbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoPDM/MjAwOjA7dGhpcy5fdmFsdWVDaGFuZ2VkVGltZW91dElkPXNldFRpbWVvdXQodGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKSx0aW1lb3V0KTt9Cl9vblZhbHVlQ2hhbmdlZCgpe2lmKCF0aGlzLl9zZWFyY2hJc1Zpc2libGUpCnJldHVybjtkZWxldGUgdGhpcy5fdmFsdWVDaGFuZ2VkVGltZW91dElkO3RoaXMuX3BlcmZvcm1TZWFyY2goZmFsc2UsdHJ1ZSk7fX07VUkuU2VhcmNoYWJsZVZpZXcuX3N5bWJvbD1TeW1ib2woJ3NlYXJjaGFibGVWaWV3Jyk7VUkuU2VhcmNoYWJsZT1mdW5jdGlvbigpe307VUkuU2VhcmNoYWJsZS5wcm90b3R5cGU9e3NlYXJjaENhbmNlbGVkKCl7fSxwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpe30sanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpe30sanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXt9LHN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe30sc3VwcG9ydHNSZWdleFNlYXJjaCgpe319O1VJLlJlcGxhY2VhYmxlPWZ1bmN0aW9uKCl7fTtVSS5SZXBsYWNlYWJsZS5wcm90b3R5cGU9e3JlcGxhY2VTZWxlY3Rpb25XaXRoKHNlYXJjaENvbmZpZyxyZXBsYWNlbWVudCl7fSxyZXBsYWNlQWxsV2l0aChzZWFyY2hDb25maWcscmVwbGFjZW1lbnQpe319O1VJLlNlYXJjaGFibGVWaWV3LlNlYXJjaENvbmZpZz1jbGFzc3tjb25zdHJ1Y3RvcihxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe3RoaXMucXVlcnk9cXVlcnk7dGhpcy5jYXNlU2Vuc2l0aXZlPWNhc2VTZW5zaXRpdmU7dGhpcy5pc1JlZ2V4PWlzUmVnZXg7fQp0b1NlYXJjaFJlZ2V4KGdsb2JhbCl7bGV0IG1vZGlmaWVycz10aGlzLmNhc2VTZW5zaXRpdmU/Jyc6J2knO2lmKGdsb2JhbCkKbW9kaWZpZXJzKz0nZyc7Y29uc3QgcXVlcnk9dGhpcy5pc1JlZ2V4PycvJyt0aGlzLnF1ZXJ5KycvJzp0aGlzLnF1ZXJ5O2xldCByZWdleDt0cnl7aWYoL15cLy4rXC8kLy50ZXN0KHF1ZXJ5KSl7cmVnZXg9bmV3IFJlZ0V4cChxdWVyeS5zdWJzdHJpbmcoMSxxdWVyeS5sZW5ndGgtMSksbW9kaWZpZXJzKTtyZWdleC5fX2Zyb21SZWdFeHBRdWVyeT10cnVlO319Y2F0Y2goZSl7fQppZighcmVnZXgpCnJlZ2V4PWNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LG1vZGlmaWVycyk7cmV0dXJuIHJlZ2V4O319OztVSS5TZWdtZW50ZWRCdXR0b249Y2xhc3MgZXh0ZW5kcyBVSS5IQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5fYnV0dG9ucz1uZXcgTWFwKCk7dGhpcy5fc2VsZWN0ZWQ9bnVsbDt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3VpL3NlZ21lbnRlZEJ1dHRvbi5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlZ21lbnRlZC1idXR0b24nKTt9CmFkZFNlZ21lbnQobGFiZWwsdmFsdWUsdG9vbHRpcCl7Y29uc3QgYnV0dG9uPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2J1dHRvbicsJ3NlZ21lbnRlZC1idXR0b24tc2VnbWVudCcpO2J1dHRvbi50ZXh0Q29udGVudD1sYWJlbDtidXR0b24udGl0bGU9dG9vbHRpcDt0aGlzLl9idXR0b25zLnNldCh2YWx1ZSxidXR0b24pO2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnRoaXMuc2VsZWN0KHZhbHVlKSk7fQpzZWxlY3QodmFsdWUpe2lmKHRoaXMuX3NlbGVjdGVkPT09dmFsdWUpCnJldHVybjt0aGlzLl9zZWxlY3RlZD12YWx1ZTtmb3IoY29uc3Qga2V5IG9mIHRoaXMuX2J1dHRvbnMua2V5cygpKQp0aGlzLl9idXR0b25zLmdldChrZXkpLmNsYXNzTGlzdC50b2dnbGUoJ3NlZ21lbnRlZC1idXR0b24tc2VnbWVudC1zZWxlY3RlZCcsa2V5PT09dGhpcy5fc2VsZWN0ZWQpO30Kc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7fX07O1VJLlNldHRpbmdzVUk9e307VUkuU2V0dGluZ3NVSS5jcmVhdGVTZXR0aW5nQ2hlY2tib3g9ZnVuY3Rpb24obmFtZSxzZXR0aW5nLG9taXRQYXJhZ3JhcGhFbGVtZW50LHRvb2x0aXApe2NvbnN0IGxhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKG5hbWUpO2lmKHRvb2x0aXApCmxhYmVsLnRpdGxlPXRvb2x0aXA7Y29uc3QgaW5wdXQ9bGFiZWwuY2hlY2tib3hFbGVtZW50O2lucHV0Lm5hbWU9bmFtZTtVSS5TZXR0aW5nc1VJLmJpbmRDaGVja2JveChpbnB1dCxzZXR0aW5nKTtpZihvbWl0UGFyYWdyYXBoRWxlbWVudCkKcmV0dXJuIGxhYmVsO2NvbnN0IHA9Y3JlYXRlRWxlbWVudCgncCcpO3AuYXBwZW5kQ2hpbGQobGFiZWwpO3JldHVybiBwO307VUkuU2V0dGluZ3NVSS5jcmVhdGVTZXR0aW5nU2VsZWN0PWZ1bmN0aW9uKG5hbWUsb3B0aW9ucyxzZXR0aW5nKXtjb25zdCBwPWNyZWF0ZUVsZW1lbnQoJ3AnKTtwLmNyZWF0ZUNoaWxkKCdsYWJlbCcpLnRleHRDb250ZW50PW5hbWU7Y29uc3Qgc2VsZWN0PXAuY3JlYXRlQ2hpbGQoJ3NlbGVjdCcsJ2Nocm9tZS1zZWxlY3QnKTtmb3IobGV0IGk9MDtpPG9wdGlvbnMubGVuZ3RoOysraSl7Y29uc3Qgb3B0aW9uPW9wdGlvbnNbaV07Y29uc3Qgb3B0aW9uTmFtZT1vcHRpb24ucmF3P29wdGlvbi50ZXh0OkNvbW1vbi5VSVN0cmluZyhvcHRpb24udGV4dCk7c2VsZWN0LmFkZChuZXcgT3B0aW9uKG9wdGlvbk5hbWUsb3B0aW9uLnZhbHVlKSk7fQpzZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHNldHRpbmdDaGFuZ2VkKTtzZXR0aW5nQ2hhbmdlZCgpO3NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHNlbGVjdENoYW5nZWQsZmFsc2UpO3JldHVybiBwO2Z1bmN0aW9uIHNldHRpbmdDaGFuZ2VkKCl7Y29uc3QgbmV3VmFsdWU9c2V0dGluZy5nZXQoKTtmb3IobGV0IGk9MDtpPG9wdGlvbnMubGVuZ3RoO2krKyl7aWYob3B0aW9uc1tpXS52YWx1ZT09PW5ld1ZhbHVlKQpzZWxlY3Quc2VsZWN0ZWRJbmRleD1pO319CmZ1bmN0aW9uIHNlbGVjdENoYW5nZWQoKXtzZXR0aW5nLnNldChvcHRpb25zW3NlbGVjdC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7fX07VUkuU2V0dGluZ3NVSS5iaW5kQ2hlY2tib3g9ZnVuY3Rpb24oaW5wdXQsc2V0dGluZyl7ZnVuY3Rpb24gc2V0dGluZ0NoYW5nZWQoKXtpZihpbnB1dC5jaGVja2VkIT09c2V0dGluZy5nZXQoKSkKaW5wdXQuY2hlY2tlZD1zZXR0aW5nLmdldCgpO30Kc2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcihzZXR0aW5nQ2hhbmdlZCk7c2V0dGluZ0NoYW5nZWQoKTtmdW5jdGlvbiBpbnB1dENoYW5nZWQoKXtpZihzZXR0aW5nLmdldCgpIT09aW5wdXQuY2hlY2tlZCkKc2V0dGluZy5zZXQoaW5wdXQuY2hlY2tlZCk7fQppbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGlucHV0Q2hhbmdlZCxmYWxzZSk7fTtVSS5TZXR0aW5nc1VJLmNyZWF0ZUN1c3RvbVNldHRpbmc9ZnVuY3Rpb24obmFtZSxlbGVtZW50KXtjb25zdCBwPWNyZWF0ZUVsZW1lbnQoJ3AnKTtjb25zdCBmaWVsZHNldEVsZW1lbnQ9cC5jcmVhdGVDaGlsZCgnZmllbGRzZXQnKTtmaWVsZHNldEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2xhYmVsJykudGV4dENvbnRlbnQ9bmFtZTtmaWVsZHNldEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7cmV0dXJuIHA7fTtVSS5TZXR0aW5nc1VJLmNyZWF0ZUNvbnRyb2xGb3JTZXR0aW5nPWZ1bmN0aW9uKHNldHRpbmcpe2lmKCFzZXR0aW5nLmV4dGVuc2lvbigpKQpyZXR1cm4gbnVsbDtjb25zdCBkZXNjcmlwdG9yPXNldHRpbmcuZXh0ZW5zaW9uKCkuZGVzY3JpcHRvcigpO2NvbnN0IHVpVGl0bGU9Q29tbW9uLlVJU3RyaW5nKHNldHRpbmcudGl0bGUoKXx8JycpO3N3aXRjaChkZXNjcmlwdG9yWydzZXR0aW5nVHlwZSddKXtjYXNlJ2Jvb2xlYW4nOnJldHVybiBVSS5TZXR0aW5nc1VJLmNyZWF0ZVNldHRpbmdDaGVja2JveCh1aVRpdGxlLHNldHRpbmcpO2Nhc2UnZW51bSc6aWYoQXJyYXkuaXNBcnJheShkZXNjcmlwdG9yWydvcHRpb25zJ10pKQpyZXR1cm4gVUkuU2V0dGluZ3NVSS5jcmVhdGVTZXR0aW5nU2VsZWN0KHVpVGl0bGUsZGVzY3JpcHRvclsnb3B0aW9ucyddLHNldHRpbmcpO2NvbnNvbGUuZXJyb3IoJ0VudW0gc2V0dGluZyBkZWZpbmVkIHdpdGhvdXQgb3B0aW9ucycpO3JldHVybiBudWxsO2RlZmF1bHQ6Y29uc29sZS5lcnJvcignSW52YWxpZCBzZXR0aW5nIHR5cGU6ICcrZGVzY3JpcHRvclsnc2V0dGluZ1R5cGUnXSk7cmV0dXJuIG51bGw7fX07VUkuU2V0dGluZ1VJPWZ1bmN0aW9uKCl7fTtVSS5TZXR0aW5nVUkucHJvdG90eXBlPXtzZXR0aW5nRWxlbWVudCgpe319OztVSS5Tb2Z0Q29udGV4dE1lbnU9Y2xhc3N7Y29uc3RydWN0b3IoaXRlbXMsaXRlbVNlbGVjdGVkQ2FsbGJhY2sscGFyZW50TWVudSl7dGhpcy5faXRlbXM9aXRlbXM7dGhpcy5faXRlbVNlbGVjdGVkQ2FsbGJhY2s9aXRlbVNlbGVjdGVkQ2FsbGJhY2s7dGhpcy5fcGFyZW50TWVudT1wYXJlbnRNZW51O30Kc2hvdyhkb2N1bWVudCxhbmNob3JCb3gpe2lmKCF0aGlzLl9pdGVtcy5sZW5ndGgpCnJldHVybjt0aGlzLl9kb2N1bWVudD1kb2N1bWVudDt0aGlzLl9nbGFzc1BhbmU9bmV3IFVJLkdsYXNzUGFuZSgpO3RoaXMuX2dsYXNzUGFuZS5zZXRQb2ludGVyRXZlbnRzQmVoYXZpb3IodGhpcy5fcGFyZW50TWVudT9VSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLlBpZXJjZUdsYXNzUGFuZTpVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLkJsb2NrZWRCeUdsYXNzUGFuZSk7dGhpcy5fZ2xhc3NQYW5lLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3VpL3NvZnRDb250ZXh0TWVudS5jc3MnKTt0aGlzLl9nbGFzc1BhbmUuc2V0Q29udGVudEFuY2hvckJveChhbmNob3JCb3gpO3RoaXMuX2dsYXNzUGFuZS5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCk7dGhpcy5fZ2xhc3NQYW5lLnNldE1hcmdpbkJlaGF2aW9yKFVJLkdsYXNzUGFuZS5NYXJnaW5CZWhhdmlvci5Ob01hcmdpbik7dGhpcy5fZ2xhc3NQYW5lLnNldEFuY2hvckJlaGF2aW9yKHRoaXMuX3BhcmVudE1lbnU/VUkuR2xhc3NQYW5lLkFuY2hvckJlaGF2aW9yLlByZWZlclJpZ2h0OlVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJCb3R0b20pO3RoaXMuX2NvbnRleHRNZW51RWxlbWVudD10aGlzLl9nbGFzc1BhbmUuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NvZnQtY29udGV4dC1tZW51Jyk7dGhpcy5fY29udGV4dE1lbnVFbGVtZW50LnRhYkluZGV4PTA7dGhpcy5fY29udGV4dE1lbnVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLGU9PmUuY29uc3VtZSgpLGZhbHNlKTt0aGlzLl9jb250ZXh0TWVudUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fbWVudUtleURvd24uYmluZCh0aGlzKSxmYWxzZSk7Zm9yKGxldCBpPTA7aTx0aGlzLl9pdGVtcy5sZW5ndGg7KytpKQp0aGlzLl9jb250ZXh0TWVudUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlTWVudUl0ZW0odGhpcy5faXRlbXNbaV0pKTt0aGlzLl9nbGFzc1BhbmUuc2hvdyhkb2N1bWVudCk7dGhpcy5fZm9jdXNSZXN0b3Jlcj1uZXcgVUkuRWxlbWVudEZvY3VzUmVzdG9yZXIodGhpcy5fY29udGV4dE1lbnVFbGVtZW50KTtpZighdGhpcy5fcGFyZW50TWVudSl7dGhpcy5faGlkZU9uVXNlckdlc3R1cmU9ZXZlbnQ9Pnt0aGlzLmRpc2NhcmQoKTtldmVudC5jb25zdW1lKHRydWUpO307dGhpcy5fZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX2hpZGVPblVzZXJHZXN0dXJlLGZhbHNlKTt0aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlldy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHRoaXMuX2hpZGVPblVzZXJHZXN0dXJlLGZhbHNlKTt9fQpkaXNjYXJkKCl7aWYodGhpcy5fc3ViTWVudSkKdGhpcy5fc3ViTWVudS5kaXNjYXJkKCk7aWYodGhpcy5fZm9jdXNSZXN0b3JlcikKdGhpcy5fZm9jdXNSZXN0b3Jlci5yZXN0b3JlKCk7aWYodGhpcy5fZ2xhc3NQYW5lKXt0aGlzLl9nbGFzc1BhbmUuaGlkZSgpO2RlbGV0ZSB0aGlzLl9nbGFzc1BhbmU7aWYodGhpcy5faGlkZU9uVXNlckdlc3R1cmUpe3RoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9oaWRlT25Vc2VyR2VzdHVyZSxmYWxzZSk7dGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0aGlzLl9oaWRlT25Vc2VyR2VzdHVyZSxmYWxzZSk7ZGVsZXRlIHRoaXMuX2hpZGVPblVzZXJHZXN0dXJlO319CmlmKHRoaXMuX3BhcmVudE1lbnUpCmRlbGV0ZSB0aGlzLl9wYXJlbnRNZW51Ll9zdWJNZW51O30KX2NyZWF0ZU1lbnVJdGVtKGl0ZW0pe2lmKGl0ZW0udHlwZT09PSdzZXBhcmF0b3InKQpyZXR1cm4gdGhpcy5fY3JlYXRlU2VwYXJhdG9yKCk7aWYoaXRlbS50eXBlPT09J3N1Yk1lbnUnKQpyZXR1cm4gdGhpcy5fY3JlYXRlU3ViTWVudShpdGVtKTtjb25zdCBtZW51SXRlbUVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnc29mdC1jb250ZXh0LW1lbnUtaXRlbScpO2NvbnN0IGNoZWNrTWFya0VsZW1lbnQ9VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jaGVja21hcmsnLCdjaGVja21hcmsnKTttZW51SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tNYXJrRWxlbWVudCk7aWYoIWl0ZW0uY2hlY2tlZCkKY2hlY2tNYXJrRWxlbWVudC5zdHlsZS5vcGFjaXR5PScwJztpZihpdGVtLmVsZW1lbnQpe2NvbnN0IHdyYXBwZXI9bWVudUl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzb2Z0LWNvbnRleHQtbWVudS1jdXN0b20taXRlbScpO3dyYXBwZXIuYXBwZW5kQ2hpbGQoaXRlbS5lbGVtZW50KTttZW51SXRlbUVsZW1lbnQuX2lzQ3VzdG9tPXRydWU7cmV0dXJuIG1lbnVJdGVtRWxlbWVudDt9CmlmKCFpdGVtLmVuYWJsZWQpCm1lbnVJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWNvbnRleHQtbWVudS1kaXNhYmxlZCcpO21lbnVJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoaXRlbS5sYWJlbCk7bWVudUl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc29mdC1jb250ZXh0LW1lbnUtc2hvcnRjdXQnKS50ZXh0Q29udGVudD1pdGVtLnNob3J0Y3V0O21lbnVJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX21lbnVJdGVtTW91c2VEb3duLmJpbmQodGhpcyksZmFsc2UpO21lbnVJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx0aGlzLl9tZW51SXRlbU1vdXNlVXAuYmluZCh0aGlzKSxmYWxzZSk7bWVudUl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsdGhpcy5fbWVudUl0ZW1Nb3VzZU92ZXIuYmluZCh0aGlzKSxmYWxzZSk7bWVudUl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLHRoaXMuX21lbnVJdGVtTW91c2VMZWF2ZS5iaW5kKHRoaXMpLGZhbHNlKTttZW51SXRlbUVsZW1lbnQuX2FjdGlvbklkPWl0ZW0uaWQ7cmV0dXJuIG1lbnVJdGVtRWxlbWVudDt9Cl9jcmVhdGVTdWJNZW51KGl0ZW0pe2NvbnN0IG1lbnVJdGVtRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdzb2Z0LWNvbnRleHQtbWVudS1pdGVtJyk7bWVudUl0ZW1FbGVtZW50Ll9zdWJJdGVtcz1pdGVtLnN1Ykl0ZW1zO2NvbnN0IGNoZWNrTWFya0VsZW1lbnQ9VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jaGVja21hcmsnLCdzb2Z0LWNvbnRleHQtbWVudS1pdGVtLWNoZWNrbWFyaycpO2NoZWNrTWFya0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2hlY2ttYXJrJyk7bWVudUl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGNoZWNrTWFya0VsZW1lbnQpO2NoZWNrTWFya0VsZW1lbnQuc3R5bGUub3BhY2l0eT0nMCc7bWVudUl0ZW1FbGVtZW50LmNyZWF0ZVRleHRDaGlsZChpdGVtLmxhYmVsKTtjb25zdCBzdWJNZW51QXJyb3dFbGVtZW50PW1lbnVJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3NvZnQtY29udGV4dC1tZW51LWl0ZW0tc3VibWVudS1hcnJvdycpO3N1Yk1lbnVBcnJvd0VsZW1lbnQudGV4dENvbnRlbnQ9J1x1MjVCNic7bWVudUl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fbWVudUl0ZW1Nb3VzZURvd24uYmluZCh0aGlzKSxmYWxzZSk7bWVudUl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMuX21lbnVJdGVtTW91c2VVcC5iaW5kKHRoaXMpLGZhbHNlKTttZW51SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJyx0aGlzLl9tZW51SXRlbU1vdXNlT3Zlci5iaW5kKHRoaXMpLGZhbHNlKTttZW51SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsdGhpcy5fbWVudUl0ZW1Nb3VzZUxlYXZlLmJpbmQodGhpcyksZmFsc2UpO3JldHVybiBtZW51SXRlbUVsZW1lbnQ7fQpfY3JlYXRlU2VwYXJhdG9yKCl7Y29uc3Qgc2VwYXJhdG9yRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdzb2Z0LWNvbnRleHQtbWVudS1zZXBhcmF0b3InKTtzZXBhcmF0b3JFbGVtZW50Ll9pc1NlcGFyYXRvcj10cnVlO3NlcGFyYXRvckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlcGFyYXRvci1saW5lJyk7cmV0dXJuIHNlcGFyYXRvckVsZW1lbnQ7fQpfbWVudUl0ZW1Nb3VzZURvd24oZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfbWVudUl0ZW1Nb3VzZVVwKGV2ZW50KXt0aGlzLl90cmlnZ2VyQWN0aW9uKGV2ZW50LnRhcmdldCxldmVudCk7ZXZlbnQuY29uc3VtZSgpO30KX3Jvb3QoKXtsZXQgcm9vdD10aGlzO3doaWxlKHJvb3QuX3BhcmVudE1lbnUpCnJvb3Q9cm9vdC5fcGFyZW50TWVudTtyZXR1cm4gcm9vdDt9Cl90cmlnZ2VyQWN0aW9uKG1lbnVJdGVtRWxlbWVudCxldmVudCl7aWYoIW1lbnVJdGVtRWxlbWVudC5fc3ViSXRlbXMpe3RoaXMuX3Jvb3QoKS5kaXNjYXJkKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTtpZih0eXBlb2YgbWVudUl0ZW1FbGVtZW50Ll9hY3Rpb25JZCE9PSd1bmRlZmluZWQnKXt0aGlzLl9pdGVtU2VsZWN0ZWRDYWxsYmFjayhtZW51SXRlbUVsZW1lbnQuX2FjdGlvbklkKTtkZWxldGUgbWVudUl0ZW1FbGVtZW50Ll9hY3Rpb25JZDt9CnJldHVybjt9CnRoaXMuX3Nob3dTdWJNZW51KG1lbnVJdGVtRWxlbWVudCk7ZXZlbnQuY29uc3VtZSgpO30KX3Nob3dTdWJNZW51KG1lbnVJdGVtRWxlbWVudCl7aWYobWVudUl0ZW1FbGVtZW50Ll9zdWJNZW51VGltZXIpe2NsZWFyVGltZW91dChtZW51SXRlbUVsZW1lbnQuX3N1Yk1lbnVUaW1lcik7ZGVsZXRlIG1lbnVJdGVtRWxlbWVudC5fc3ViTWVudVRpbWVyO30KaWYodGhpcy5fc3ViTWVudSkKcmV0dXJuO3RoaXMuX3N1Yk1lbnU9bmV3IFVJLlNvZnRDb250ZXh0TWVudShtZW51SXRlbUVsZW1lbnQuX3N1Ykl0ZW1zLHRoaXMuX2l0ZW1TZWxlY3RlZENhbGxiYWNrLHRoaXMpO2NvbnN0IGFuY2hvckJveD1tZW51SXRlbUVsZW1lbnQuYm94SW5XaW5kb3coKTthbmNob3JCb3gueS09NTthbmNob3JCb3gueCs9MzthbmNob3JCb3gud2lkdGgtPTY7YW5jaG9yQm94LmhlaWdodCs9MTA7dGhpcy5fc3ViTWVudS5zaG93KHRoaXMuX2RvY3VtZW50LGFuY2hvckJveCk7fQpfbWVudUl0ZW1Nb3VzZU92ZXIoZXZlbnQpe3RoaXMuX2hpZ2hsaWdodE1lbnVJdGVtKGV2ZW50LnRhcmdldCx0cnVlKTt9Cl9tZW51SXRlbU1vdXNlTGVhdmUoZXZlbnQpe2lmKCF0aGlzLl9zdWJNZW51fHwhZXZlbnQucmVsYXRlZFRhcmdldCl7dGhpcy5faGlnaGxpZ2h0TWVudUl0ZW0obnVsbCx0cnVlKTtyZXR1cm47fQpjb25zdCByZWxhdGVkVGFyZ2V0PWV2ZW50LnJlbGF0ZWRUYXJnZXQ7aWYocmVsYXRlZFRhcmdldD09PXRoaXMuX2NvbnRleHRNZW51RWxlbWVudCkKdGhpcy5faGlnaGxpZ2h0TWVudUl0ZW0obnVsbCx0cnVlKTt9Cl9oaWdobGlnaHRNZW51SXRlbShtZW51SXRlbUVsZW1lbnQsc2NoZWR1bGVTdWJNZW51KXtpZih0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudD09PW1lbnVJdGVtRWxlbWVudCkKcmV0dXJuO2lmKHRoaXMuX3N1Yk1lbnUpCnRoaXMuX3N1Yk1lbnUuZGlzY2FyZCgpO2lmKHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50KXt0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmb3JjZS13aGl0ZS1pY29ucycpO3RoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3NvZnQtY29udGV4dC1tZW51LWl0ZW0tbW91c2Utb3ZlcicpO2lmKHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50Ll9zdWJJdGVtcyYmdGhpcy5faGlnaGxpZ2h0ZWRNZW51SXRlbUVsZW1lbnQuX3N1Yk1lbnVUaW1lcil7Y2xlYXJUaW1lb3V0KHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50Ll9zdWJNZW51VGltZXIpO2RlbGV0ZSB0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5fc3ViTWVudVRpbWVyO319CnRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50PW1lbnVJdGVtRWxlbWVudDtpZih0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudCl7dGhpcy5faGlnaGxpZ2h0ZWRNZW51SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9yY2Utd2hpdGUtaWNvbnMnKTt0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb2Z0LWNvbnRleHQtbWVudS1pdGVtLW1vdXNlLW92ZXInKTt0aGlzLl9jb250ZXh0TWVudUVsZW1lbnQuZm9jdXMoKTtpZihzY2hlZHVsZVN1Yk1lbnUmJnRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50Ll9zdWJJdGVtcyYmIXRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50Ll9zdWJNZW51VGltZXIpe3RoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50Ll9zdWJNZW51VGltZXI9c2V0VGltZW91dCh0aGlzLl9zaG93U3ViTWVudS5iaW5kKHRoaXMsdGhpcy5faGlnaGxpZ2h0ZWRNZW51SXRlbUVsZW1lbnQpLDE1MCk7fX19Cl9oaWdobGlnaHRQcmV2aW91cygpe2xldCBtZW51SXRlbUVsZW1lbnQ9dGhpcy5faGlnaGxpZ2h0ZWRNZW51SXRlbUVsZW1lbnQ/dGhpcy5faGlnaGxpZ2h0ZWRNZW51SXRlbUVsZW1lbnQucHJldmlvdXNTaWJsaW5nOnRoaXMuX2NvbnRleHRNZW51RWxlbWVudC5sYXN0Q2hpbGQ7d2hpbGUobWVudUl0ZW1FbGVtZW50JiYobWVudUl0ZW1FbGVtZW50Ll9pc1NlcGFyYXRvcnx8bWVudUl0ZW1FbGVtZW50Ll9pc0N1c3RvbSkpCm1lbnVJdGVtRWxlbWVudD1tZW51SXRlbUVsZW1lbnQucHJldmlvdXNTaWJsaW5nO2lmKG1lbnVJdGVtRWxlbWVudCkKdGhpcy5faGlnaGxpZ2h0TWVudUl0ZW0obWVudUl0ZW1FbGVtZW50LGZhbHNlKTt9Cl9oaWdobGlnaHROZXh0KCl7bGV0IG1lbnVJdGVtRWxlbWVudD10aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudD90aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5uZXh0U2libGluZzp0aGlzLl9jb250ZXh0TWVudUVsZW1lbnQuZmlyc3RDaGlsZDt3aGlsZShtZW51SXRlbUVsZW1lbnQmJihtZW51SXRlbUVsZW1lbnQuX2lzU2VwYXJhdG9yfHxtZW51SXRlbUVsZW1lbnQuX2lzQ3VzdG9tKSkKbWVudUl0ZW1FbGVtZW50PW1lbnVJdGVtRWxlbWVudC5uZXh0U2libGluZztpZihtZW51SXRlbUVsZW1lbnQpCnRoaXMuX2hpZ2hsaWdodE1lbnVJdGVtKG1lbnVJdGVtRWxlbWVudCxmYWxzZSk7fQpfbWVudUtleURvd24oZXZlbnQpe3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6dGhpcy5faGlnaGxpZ2h0UHJldmlvdXMoKTticmVhaztjYXNlJ0Fycm93RG93bic6dGhpcy5faGlnaGxpZ2h0TmV4dCgpO2JyZWFrO2Nhc2UnQXJyb3dMZWZ0JzppZih0aGlzLl9wYXJlbnRNZW51KXt0aGlzLl9oaWdobGlnaHRNZW51SXRlbShudWxsLGZhbHNlKTt0aGlzLmRpc2NhcmQoKTt9CmJyZWFrO2Nhc2UnQXJyb3dSaWdodCc6aWYoIXRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50KQpicmVhaztpZih0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5fc3ViSXRlbXMpe3RoaXMuX3Nob3dTdWJNZW51KHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50KTt0aGlzLl9zdWJNZW51Ll9oaWdobGlnaHROZXh0KCk7fQpicmVhaztjYXNlJ0VzY2FwZSc6dGhpcy5kaXNjYXJkKCk7YnJlYWs7Y2FzZSdFbnRlcic6aWYoIWlzRW50ZXJLZXkoZXZlbnQpKQpicmVhaztjYXNlJyAnOmlmKHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50KQp0aGlzLl90cmlnZ2VyQWN0aW9uKHRoaXMuX2hpZ2hsaWdodGVkTWVudUl0ZW1FbGVtZW50LGV2ZW50KTtpZih0aGlzLl9oaWdobGlnaHRlZE1lbnVJdGVtRWxlbWVudC5fc3ViSXRlbXMpCnRoaXMuX3N1Yk1lbnUuX2hpZ2hsaWdodE5leHQoKTticmVhazt9CmV2ZW50LmNvbnN1bWUodHJ1ZSk7fX07O1VJLlNvZnREcm9wRG93bj1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCxkZWxlZ2F0ZSl7dGhpcy5fZGVsZWdhdGU9ZGVsZWdhdGU7dGhpcy5fc2VsZWN0ZWRJdGVtPW51bGw7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2J1dHRvbicsJ3NvZnQtZHJvcGRvd24nKTtjb25zdCBzaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLmVsZW1lbnQsJ3VpL3NvZnREcm9wRG93bkJ1dHRvbi5jc3MnKTt0aGlzLl90aXRsZUVsZW1lbnQ9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnc3BhbicsJ3RpdGxlJyk7Y29uc3QgZHJvcGRvd25BcnJvd0ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1kb3duJyk7c2hhZG93Um9vdC5hcHBlbmRDaGlsZChkcm9wZG93bkFycm93SWNvbik7dGhpcy5fZ2xhc3NQYW5lPW5ldyBVSS5HbGFzc1BhbmUoKTt0aGlzLl9nbGFzc1BhbmUuc2V0TWFyZ2luQmVoYXZpb3IoVUkuR2xhc3NQYW5lLk1hcmdpbkJlaGF2aW9yLk5vTWFyZ2luKTt0aGlzLl9nbGFzc1BhbmUuc2V0QW5jaG9yQmVoYXZpb3IoVUkuR2xhc3NQYW5lLkFuY2hvckJlaGF2aW9yLlByZWZlckJvdHRvbSk7dGhpcy5fZ2xhc3NQYW5lLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKHRoaXMuX2hpZGUuYmluZCh0aGlzKSk7dGhpcy5fZ2xhc3NQYW5lLnNldFBvaW50ZXJFdmVudHNCZWhhdmlvcihVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLkJsb2NrZWRCeUdsYXNzUGFuZSk7dGhpcy5fbGlzdD1uZXcgVUkuTGlzdENvbnRyb2wobW9kZWwsdGhpcyxVSS5MaXN0TW9kZS5FcXVhbEhlaWdodEl0ZW1zKTt0aGlzLl9saXN0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXRlbS1saXN0Jyk7dGhpcy5fcm93SGVpZ2h0PTM2O3RoaXMuX3dpZHRoPTMxNTtVSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcy5fZ2xhc3NQYW5lLmNvbnRlbnRFbGVtZW50LCd1aS9zb2Z0RHJvcERvd24uY3NzJykuYXBwZW5kQ2hpbGQodGhpcy5fbGlzdC5lbGVtZW50KTt0aGlzLl9saXN0V2FzU2hvd2luZzIwMG1zQWdvPWZhbHNlO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGV2ZW50PT57aWYodGhpcy5fbGlzdFdhc1Nob3dpbmcyMDBtc0FnbykKdGhpcy5faGlkZShldmVudCk7ZWxzZSBpZighdGhpcy5lbGVtZW50LmRpc2FibGVkKQp0aGlzLl9zaG93KGV2ZW50KTt9LGZhbHNlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsdGhpcy5faGlkZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9saXN0LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxldmVudD0+ZXZlbnQuY29uc3VtZSh0cnVlKSxmYWxzZSk7dGhpcy5fbGlzdC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLGV2ZW50PT57aWYoZXZlbnQudGFyZ2V0PT09dGhpcy5fbGlzdC5lbGVtZW50KQpyZXR1cm47aWYoIXRoaXMuX2xpc3RXYXNTaG93aW5nMjAwbXNBZ28pCnJldHVybjt0aGlzLl9zZWxlY3RIaWdobGlnaHRlZEl0ZW0oKTt0aGlzLl9oaWRlKGV2ZW50KTt9LGZhbHNlKTttb2RlbC5hZGRFdmVudExpc3RlbmVyKFVJLkxpc3RNb2RlbC5FdmVudHMuSXRlbXNSZXBsYWNlZCx0aGlzLl9pdGVtc1JlcGxhY2VkLHRoaXMpO30KX3Nob3coZXZlbnQpe2lmKHRoaXMuX2dsYXNzUGFuZS5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX2dsYXNzUGFuZS5zZXRDb250ZW50QW5jaG9yQm94KHRoaXMuZWxlbWVudC5ib3hJbldpbmRvdygpKTt0aGlzLl9nbGFzc1BhbmUuc2hvdygodGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQpKTt0aGlzLl91cGRhdGVHbGFzc3BhbmVTaXplKCk7aWYodGhpcy5fc2VsZWN0ZWRJdGVtKQp0aGlzLl9saXN0LnNlbGVjdEl0ZW0odGhpcy5fc2VsZWN0ZWRJdGVtKTt0aGlzLmVsZW1lbnQuZm9jdXMoKTtldmVudC5jb25zdW1lKHRydWUpO3NldFRpbWVvdXQoKCk9PnRoaXMuX2xpc3RXYXNTaG93aW5nMjAwbXNBZ289dHJ1ZSwyMDApO30KX3VwZGF0ZUdsYXNzcGFuZVNpemUoKXtjb25zdCBtYXhIZWlnaHQ9dGhpcy5fcm93SGVpZ2h0KihNYXRoLm1pbih0aGlzLl9tb2RlbC5sZW5ndGgsOSkpO3RoaXMuX2dsYXNzUGFuZS5zZXRNYXhDb250ZW50U2l6ZShuZXcgVUkuU2l6ZSh0aGlzLl93aWR0aCxtYXhIZWlnaHQpKTt0aGlzLl9saXN0LnZpZXdwb3J0UmVzaXplZCgpO30KX2hpZGUoZXZlbnQpe3NldFRpbWVvdXQoKCk9PnRoaXMuX2xpc3RXYXNTaG93aW5nMjAwbXNBZ289ZmFsc2UsMjAwKTt0aGlzLl9nbGFzc1BhbmUuaGlkZSgpO3RoaXMuX2xpc3Quc2VsZWN0SXRlbShudWxsKTtldmVudC5jb25zdW1lKHRydWUpO30KX29uS2V5RG93bihldmVudCl7bGV0IGhhbmRsZWQ9ZmFsc2U7c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdBcnJvd0xlZnQnOmNhc2UnQXJyb3dVcCc6aGFuZGxlZD10aGlzLl9saXN0LnNlbGVjdFByZXZpb3VzSXRlbShmYWxzZSxmYWxzZSk7YnJlYWs7Y2FzZSdBcnJvd1JpZ2h0JzpjYXNlJ0Fycm93RG93bic6aGFuZGxlZD10aGlzLl9saXN0LnNlbGVjdE5leHRJdGVtKGZhbHNlLGZhbHNlKTticmVhaztjYXNlJ1BhZ2VVcCc6aGFuZGxlZD10aGlzLl9saXN0LnNlbGVjdEl0ZW1QcmV2aW91c1BhZ2UoZmFsc2UpO2JyZWFrO2Nhc2UnUGFnZURvd24nOmhhbmRsZWQ9dGhpcy5fbGlzdC5zZWxlY3RJdGVtTmV4dFBhZ2UoZmFsc2UpO2JyZWFrO2Nhc2UnSG9tZSc6Zm9yKGxldCBpPTA7aTx0aGlzLl9tb2RlbC5sZW5ndGg7aSsrKXtpZih0aGlzLmlzSXRlbVNlbGVjdGFibGUodGhpcy5fbW9kZWwuYXQoaSkpKXt0aGlzLl9saXN0LnNlbGVjdEl0ZW0odGhpcy5fbW9kZWwuYXQoaSkpO2hhbmRsZWQ9dHJ1ZTticmVhazt9fQpicmVhaztjYXNlJ0VuZCc6Zm9yKGxldCBpPXRoaXMuX21vZGVsLmxlbmd0aC0xO2k+PTA7aS0tKXtpZih0aGlzLmlzSXRlbVNlbGVjdGFibGUodGhpcy5fbW9kZWwuYXQoaSkpKXt0aGlzLl9saXN0LnNlbGVjdEl0ZW0odGhpcy5fbW9kZWwuYXQoaSkpO2hhbmRsZWQ9dHJ1ZTticmVhazt9fQpicmVhaztjYXNlJ0VzY2FwZSc6dGhpcy5faGlkZShldmVudCk7YnJlYWs7Y2FzZSdUYWInOmlmKCF0aGlzLl9nbGFzc1BhbmUuaXNTaG93aW5nKCkpCmJyZWFrO3RoaXMuX3NlbGVjdEhpZ2hsaWdodGVkSXRlbSgpO3RoaXMuX2hpZGUoZXZlbnQpO2JyZWFrO2Nhc2UnRW50ZXInOmlmKCF0aGlzLl9nbGFzc1BhbmUuaXNTaG93aW5nKCkpe3RoaXMuX3Nob3coZXZlbnQpO2JyZWFrO30KdGhpcy5fc2VsZWN0SGlnaGxpZ2h0ZWRJdGVtKCk7dGhpcy5faGlkZShldmVudCk7YnJlYWs7Y2FzZScgJzp0aGlzLl9zaG93KGV2ZW50KTticmVhaztkZWZhdWx0OmlmKGV2ZW50LmtleS5sZW5ndGg9PT0xKXtjb25zdCBzZWxlY3RlZEluZGV4PXRoaXMuX2xpc3Quc2VsZWN0ZWRJbmRleCgpO2NvbnN0IGxldHRlcj1ldmVudC5rZXkudG9VcHBlckNhc2UoKTtmb3IobGV0IGk9MDtpPHRoaXMuX21vZGVsLmxlbmd0aDtpKyspe2NvbnN0IGl0ZW09dGhpcy5fbW9kZWwuYXQoKHNlbGVjdGVkSW5kZXgraSsxKSV0aGlzLl9tb2RlbC5sZW5ndGgpO2lmKHRoaXMuX2RlbGVnYXRlLnRpdGxlRm9yKGl0ZW0pLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChsZXR0ZXIpKXt0aGlzLl9saXN0LnNlbGVjdEl0ZW0oaXRlbSk7YnJlYWs7fX0KaGFuZGxlZD10cnVlO30KYnJlYWs7fQppZihoYW5kbGVkKXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX3NlbGVjdEhpZ2hsaWdodGVkSXRlbSgpO319CnNldFdpZHRoKHdpZHRoKXt0aGlzLl93aWR0aD13aWR0aDt0aGlzLl91cGRhdGVHbGFzc3BhbmVTaXplKCk7fQpzZXRSb3dIZWlnaHQocm93SGVpZ2h0KXt0aGlzLl9yb3dIZWlnaHQ9cm93SGVpZ2h0O30KX2l0ZW1zUmVwbGFjZWQoZXZlbnQpe2NvbnN0IHJlbW92ZWQ9KGV2ZW50LmRhdGEucmVtb3ZlZCk7aWYocmVtb3ZlZC5pbmRleE9mKHRoaXMuX3NlbGVjdGVkSXRlbSkhPT0tMSl7dGhpcy5fc2VsZWN0ZWRJdGVtPW51bGw7dGhpcy5fc2VsZWN0SGlnaGxpZ2h0ZWRJdGVtKCk7fQp0aGlzLl91cGRhdGVHbGFzc3BhbmVTaXplKCk7fQpzZWxlY3RJdGVtKGl0ZW0pe3RoaXMuX3NlbGVjdGVkSXRlbT1pdGVtO2lmKHRoaXMuX3NlbGVjdGVkSXRlbSkKdGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50PXRoaXMuX2RlbGVnYXRlLnRpdGxlRm9yKHRoaXMuX3NlbGVjdGVkSXRlbSk7ZWxzZQp0aGlzLl90aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9Jyc7dGhpcy5fZGVsZWdhdGUuaXRlbVNlbGVjdGVkKHRoaXMuX3NlbGVjdGVkSXRlbSk7fQpjcmVhdGVFbGVtZW50Rm9ySXRlbShpdGVtKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2l0ZW0nKTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsZT0+e2lmKChlLm1vdmVtZW50WHx8ZS5tb3ZlbWVudFkpJiZ0aGlzLl9kZWxlZ2F0ZS5pc0l0ZW1TZWxlY3RhYmxlKGl0ZW0pKQp0aGlzLl9saXN0LnNlbGVjdEl0ZW0oaXRlbSxmYWxzZSx0cnVlKTt9KTtlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2Rpc2FibGVkJywhdGhpcy5fZGVsZWdhdGUuaXNJdGVtU2VsZWN0YWJsZShpdGVtKSk7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWdobGlnaHRlZCcsdGhpcy5fbGlzdC5zZWxlY3RlZEl0ZW0oKT09PWl0ZW0pO2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZGVsZWdhdGUuY3JlYXRlRWxlbWVudEZvckl0ZW0oaXRlbSkpO3JldHVybiBlbGVtZW50O30KaGVpZ2h0Rm9ySXRlbShpdGVtKXtyZXR1cm4gdGhpcy5fcm93SGVpZ2h0O30KaXNJdGVtU2VsZWN0YWJsZShpdGVtKXtyZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNJdGVtU2VsZWN0YWJsZShpdGVtKTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO2lmKHRvRWxlbWVudCkKdG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7dGhpcy5fZGVsZWdhdGUuaGlnaGxpZ2h0ZWRJdGVtQ2hhbmdlZChmcm9tLHRvLGZyb21FbGVtZW50JiZmcm9tRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCx0b0VsZW1lbnQmJnRvRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7fQpfc2VsZWN0SGlnaGxpZ2h0ZWRJdGVtKCl7dGhpcy5zZWxlY3RJdGVtKHRoaXMuX2xpc3Quc2VsZWN0ZWRJdGVtKCkpO30KcmVmcmVzaEl0ZW0oaXRlbSl7dGhpcy5fbGlzdC5yZWZyZXNoSXRlbShpdGVtKTt9fTtVSS5Tb2Z0RHJvcERvd24uRGVsZWdhdGU9Y2xhc3N7dGl0bGVGb3IoaXRlbSl7fQpjcmVhdGVFbGVtZW50Rm9ySXRlbShpdGVtKXt9CmlzSXRlbVNlbGVjdGFibGUoaXRlbSl7fQppdGVtU2VsZWN0ZWQoaXRlbSl7fQpoaWdobGlnaHRlZEl0ZW1DaGFuZ2VkKGZyb20sdG8sZnJvbUVsZW1lbnQsdG9FbGVtZW50KXt9fTs7VUkuU3BsaXRXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5XaWRnZXR7Y29uc3RydWN0b3IoaXNWZXJ0aWNhbCxzZWNvbmRJc1NpZGViYXIsc2V0dGluZ05hbWUsZGVmYXVsdFNpZGViYXJXaWR0aCxkZWZhdWx0U2lkZWJhckhlaWdodCxjb25zdHJhaW50c0luRGlwKXtzdXBlcih0cnVlKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3BsaXQtd2lkZ2V0Jyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd1aS9zcGxpdFdpZGdldC5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NoYWRvdy1zcGxpdC13aWRnZXQnKTt0aGlzLl9tYWluRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzaGFkb3ctc3BsaXQtd2lkZ2V0LWNvbnRlbnRzIHNoYWRvdy1zcGxpdC13aWRnZXQtbWFpbiB2Ym94Jyk7dGhpcy5fbWFpbkVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKS5zZWxlY3Q9Jy5pbnNlcnRpb24tcG9pbnQtbWFpbic7dGhpcy5fc2lkZWJhckVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2hhZG93LXNwbGl0LXdpZGdldC1jb250ZW50cyBzaGFkb3ctc3BsaXQtd2lkZ2V0LXNpZGViYXIgdmJveCcpO3RoaXMuX3NpZGViYXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdjb250ZW50Jykuc2VsZWN0PScuaW5zZXJ0aW9uLXBvaW50LXNpZGViYXInO3RoaXMuX3Jlc2l6ZXJFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NoYWRvdy1zcGxpdC13aWRnZXQtcmVzaXplcicpO3RoaXMuX3Jlc2l6ZXJFbGVtZW50U2l6ZT1udWxsO3RoaXMuX3Jlc2l6ZXJXaWRnZXQ9bmV3IFVJLlNpbXBsZVJlc2l6ZXJXaWRnZXQoKTt0aGlzLl9yZXNpemVyV2lkZ2V0LnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fcmVzaXplcldpZGdldC5hZGRFdmVudExpc3RlbmVyKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZVN0YXJ0LHRoaXMuX29uUmVzaXplU3RhcnQsdGhpcyk7dGhpcy5fcmVzaXplcldpZGdldC5hZGRFdmVudExpc3RlbmVyKFVJLlJlc2l6ZXJXaWRnZXQuRXZlbnRzLlJlc2l6ZVVwZGF0ZSx0aGlzLl9vblJlc2l6ZVVwZGF0ZSx0aGlzKTt0aGlzLl9yZXNpemVyV2lkZ2V0LmFkZEV2ZW50TGlzdGVuZXIoVUkuUmVzaXplcldpZGdldC5FdmVudHMuUmVzaXplRW5kLHRoaXMuX29uUmVzaXplRW5kLHRoaXMpO3RoaXMuX2RlZmF1bHRTaWRlYmFyV2lkdGg9ZGVmYXVsdFNpZGViYXJXaWR0aHx8MjAwO3RoaXMuX2RlZmF1bHRTaWRlYmFySGVpZ2h0PWRlZmF1bHRTaWRlYmFySGVpZ2h0fHx0aGlzLl9kZWZhdWx0U2lkZWJhcldpZHRoO3RoaXMuX2NvbnN0cmFpbnRzSW5EaXA9ISFjb25zdHJhaW50c0luRGlwO3RoaXMuX3Jlc2l6ZVN0YXJ0U2l6ZURJUD0wO3RoaXMuX3NldHRpbmc9c2V0dGluZ05hbWU/Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoc2V0dGluZ05hbWUse30pOm51bGw7dGhpcy5fdG90YWxTaXplQ1NTPTA7dGhpcy5fdG90YWxTaXplT3RoZXJEaW1lbnNpb25DU1M9MDt0aGlzLl9tYWluV2lkZ2V0PW51bGw7dGhpcy5fc2lkZWJhcldpZGdldD1udWxsO3RoaXMuX2FuaW1hdGlvbkZyYW1lSGFuZGxlPTA7dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2s9bnVsbDt0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b25UaXRsZT0nJzt0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b249bnVsbDt0aGlzLl9pc1ZlcnRpY2FsPWZhbHNlO3RoaXMuX3NpZGViYXJNaW5pbWl6ZWQ9ZmFsc2U7dGhpcy5fZGV0YWNoaW5nPWZhbHNlO3RoaXMuX3NpZGViYXJTaXplRElQPS0xO3RoaXMuX3NhdmVkU2lkZWJhclNpemVESVA9dGhpcy5fc2lkZWJhclNpemVESVA7dGhpcy5fc2Vjb25kSXNTaWRlYmFyPWZhbHNlO3RoaXMuX3Nob3VsZFNhdmVTaG93TW9kZT1mYWxzZTt0aGlzLl9zYXZlZFZlcnRpY2FsTWFpblNpemU9bnVsbDt0aGlzLl9zYXZlZEhvcml6b250YWxNYWluU2l6ZT1udWxsO3RoaXMuc2V0U2Vjb25kSXNTaWRlYmFyKHNlY29uZElzU2lkZWJhcik7dGhpcy5faW5uZXJTZXRWZXJ0aWNhbChpc1ZlcnRpY2FsKTt0aGlzLl9zaG93TW9kZT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RoO3RoaXMuX3NhdmVkU2hvd01vZGU9dGhpcy5fc2hvd01vZGU7dGhpcy5pbnN0YWxsUmVzaXplcih0aGlzLl9yZXNpemVyRWxlbWVudCk7fQppc1ZlcnRpY2FsKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw7fQpzZXRWZXJ0aWNhbChpc1ZlcnRpY2FsKXtpZih0aGlzLl9pc1ZlcnRpY2FsPT09aXNWZXJ0aWNhbCkKcmV0dXJuO3RoaXMuX2lubmVyU2V0VmVydGljYWwoaXNWZXJ0aWNhbCk7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fdXBkYXRlTGF5b3V0KCk7fQpfaW5uZXJTZXRWZXJ0aWNhbChpc1ZlcnRpY2FsKXt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Zib3gnLCFpc1ZlcnRpY2FsKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hib3gnLGlzVmVydGljYWwpO3RoaXMuX2lzVmVydGljYWw9aXNWZXJ0aWNhbDt0aGlzLl9yZXNpemVyRWxlbWVudFNpemU9bnVsbDt0aGlzLl9zaWRlYmFyU2l6ZURJUD0tMTt0aGlzLl9yZXN0b3JlU2lkZWJhclNpemVGcm9tU2V0dGluZ3MoKTtpZih0aGlzLl9zaG91bGRTYXZlU2hvd01vZGUpCnRoaXMuX3Jlc3RvcmVBbmRBcHBseVNob3dNb2RlRnJvbVNldHRpbmdzKCk7dGhpcy5fdXBkYXRlU2hvd0hpZGVTaWRlYmFyQnV0dG9uKCk7dGhpcy5fcmVzaXplcldpZGdldC5zZXRWZXJ0aWNhbCghaXNWZXJ0aWNhbCk7dGhpcy5pbnZhbGlkYXRlQ29uc3RyYWludHMoKTt9Cl91cGRhdGVMYXlvdXQoYW5pbWF0ZSl7dGhpcy5fdG90YWxTaXplQ1NTPTA7dGhpcy5fdG90YWxTaXplT3RoZXJEaW1lbnNpb25DU1M9MDt0aGlzLl9tYWluRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTt0aGlzLl9tYWluRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7dGhpcy5fc2lkZWJhckVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7dGhpcy5fc2lkZWJhckVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO3RoaXMuX2lubmVyU2V0U2lkZWJhclNpemVESVAodGhpcy5fcHJlZmVycmVkU2lkZWJhclNpemVESVAoKSwhIWFuaW1hdGUpO30Kc2V0TWFpbldpZGdldCh3aWRnZXQpe2lmKHRoaXMuX21haW5XaWRnZXQ9PT13aWRnZXQpCnJldHVybjt0aGlzLnN1c3BlbmRJbnZhbGlkYXRpb25zKCk7aWYodGhpcy5fbWFpbldpZGdldCkKdGhpcy5fbWFpbldpZGdldC5kZXRhY2goKTt0aGlzLl9tYWluV2lkZ2V0PXdpZGdldDtpZih3aWRnZXQpe3dpZGdldC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2luc2VydGlvbi1wb2ludC1tYWluJyk7d2lkZ2V0LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaW5zZXJ0aW9uLXBvaW50LXNpZGViYXInKTtpZih0aGlzLl9zaG93TW9kZT09PVVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLk9ubHlNYWlufHx0aGlzLl9zaG93TW9kZT09PVVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLkJvdGgpCndpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7fQp0aGlzLnJlc3VtZUludmFsaWRhdGlvbnMoKTt9CnNldFNpZGViYXJXaWRnZXQod2lkZ2V0KXtpZih0aGlzLl9zaWRlYmFyV2lkZ2V0PT09d2lkZ2V0KQpyZXR1cm47dGhpcy5zdXNwZW5kSW52YWxpZGF0aW9ucygpO2lmKHRoaXMuX3NpZGViYXJXaWRnZXQpCnRoaXMuX3NpZGViYXJXaWRnZXQuZGV0YWNoKCk7dGhpcy5fc2lkZWJhcldpZGdldD13aWRnZXQ7aWYod2lkZ2V0KXt3aWRnZXQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpbnNlcnRpb24tcG9pbnQtc2lkZWJhcicpO3dpZGdldC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2luc2VydGlvbi1wb2ludC1tYWluJyk7aWYodGhpcy5fc2hvd01vZGU9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5U2lkZWJhcnx8dGhpcy5fc2hvd01vZGU9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RoKQp3aWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO30KdGhpcy5yZXN1bWVJbnZhbGlkYXRpb25zKCk7fQptYWluV2lkZ2V0KCl7cmV0dXJuIHRoaXMuX21haW5XaWRnZXQ7fQpzaWRlYmFyV2lkZ2V0KCl7cmV0dXJuIHRoaXMuX3NpZGViYXJXaWRnZXQ7fQpjaGlsZFdhc0RldGFjaGVkKHdpZGdldCl7aWYodGhpcy5fZGV0YWNoaW5nKQpyZXR1cm47aWYodGhpcy5fbWFpbldpZGdldD09PXdpZGdldCkKdGhpcy5fbWFpbldpZGdldD1udWxsO2lmKHRoaXMuX3NpZGViYXJXaWRnZXQ9PT13aWRnZXQpCnRoaXMuX3NpZGViYXJXaWRnZXQ9bnVsbDt0aGlzLmludmFsaWRhdGVDb25zdHJhaW50cygpO30KaXNTaWRlYmFyU2Vjb25kKCl7cmV0dXJuIHRoaXMuX3NlY29uZElzU2lkZWJhcjt9CmVuYWJsZVNob3dNb2RlU2F2aW5nKCl7dGhpcy5fc2hvdWxkU2F2ZVNob3dNb2RlPXRydWU7dGhpcy5fcmVzdG9yZUFuZEFwcGx5U2hvd01vZGVGcm9tU2V0dGluZ3MoKTt9CnNob3dNb2RlKCl7cmV0dXJuIHRoaXMuX3Nob3dNb2RlO30Kc2V0U2Vjb25kSXNTaWRlYmFyKHNlY29uZElzU2lkZWJhcil7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdzaGFkb3ctc3BsaXQtd2lkZ2V0LWZpcnN0LWlzLXNpZGViYXInLCFzZWNvbmRJc1NpZGViYXIpO3RoaXMuX3NlY29uZElzU2lkZWJhcj1zZWNvbmRJc1NpZGViYXI7fQpzaWRlYmFyU2lkZSgpe2lmKHRoaXMuX3Nob3dNb2RlIT09VUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuQm90aCkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/KHRoaXMuX3NlY29uZElzU2lkZWJhcj8ncmlnaHQnOidsZWZ0Jyk6KHRoaXMuX3NlY29uZElzU2lkZWJhcj8nYm90dG9tJzondG9wJyk7fQpyZXNpemVyRWxlbWVudCgpe3JldHVybiB0aGlzLl9yZXNpemVyRWxlbWVudDt9CmhpZGVNYWluKGFuaW1hdGUpe3RoaXMuX3Nob3dPbmx5KHRoaXMuX3NpZGViYXJXaWRnZXQsdGhpcy5fbWFpbldpZGdldCx0aGlzLl9zaWRlYmFyRWxlbWVudCx0aGlzLl9tYWluRWxlbWVudCxhbmltYXRlKTt0aGlzLl91cGRhdGVTaG93TW9kZShVSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5U2lkZWJhcik7fQpoaWRlU2lkZWJhcihhbmltYXRlKXt0aGlzLl9zaG93T25seSh0aGlzLl9tYWluV2lkZ2V0LHRoaXMuX3NpZGViYXJXaWRnZXQsdGhpcy5fbWFpbkVsZW1lbnQsdGhpcy5fc2lkZWJhckVsZW1lbnQsYW5pbWF0ZSk7dGhpcy5fdXBkYXRlU2hvd01vZGUoVUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuT25seU1haW4pO30Kc2V0U2lkZWJhck1pbmltaXplZChtaW5pbWl6ZWQpe3RoaXMuX3NpZGViYXJNaW5pbWl6ZWQ9bWluaW1pemVkO3RoaXMuaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCk7fQppc1NpZGViYXJNaW5pbWl6ZWQoKXtyZXR1cm4gdGhpcy5fc2lkZWJhck1pbmltaXplZDt9Cl9zaG93T25seShzaWRlVG9TaG93LHNpZGVUb0hpZGUsc2hhZG93VG9TaG93LHNoYWRvd1RvSGlkZSxhbmltYXRlKXt0aGlzLl9jYW5jZWxBbmltYXRpb24oKTtmdW5jdGlvbiBjYWxsYmFjaygpe2lmKHNpZGVUb1Nob3cpe2lmKHNpZGVUb1Nob3c9PT10aGlzLl9tYWluV2lkZ2V0KQp0aGlzLl9tYWluV2lkZ2V0LnNob3codGhpcy5lbGVtZW50LHRoaXMuX3NpZGViYXJXaWRnZXQ/dGhpcy5fc2lkZWJhcldpZGdldC5lbGVtZW50Om51bGwpO2Vsc2UKdGhpcy5fc2lkZWJhcldpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7fQppZihzaWRlVG9IaWRlKXt0aGlzLl9kZXRhY2hpbmc9dHJ1ZTtzaWRlVG9IaWRlLmRldGFjaCgpO3RoaXMuX2RldGFjaGluZz1mYWxzZTt9CnRoaXMuX3Jlc2l6ZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3NoYWRvd1RvU2hvdy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtzaGFkb3dUb1Nob3cuY2xhc3NMaXN0LmFkZCgnbWF4aW1pemVkJyk7c2hhZG93VG9IaWRlLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3NoYWRvd1RvSGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdtYXhpbWl6ZWQnKTt0aGlzLl9yZW1vdmVBbGxMYXlvdXRQcm9wZXJ0aWVzKCk7dGhpcy5kb1Jlc2l6ZSgpO3RoaXMuX3Nob3dGaW5pc2hlZEZvclRlc3QoKTt9CmlmKGFuaW1hdGUpCnRoaXMuX2FuaW1hdGUodHJ1ZSxjYWxsYmFjay5iaW5kKHRoaXMpKTtlbHNlCmNhbGxiYWNrLmNhbGwodGhpcyk7dGhpcy5fc2lkZWJhclNpemVESVA9LTE7dGhpcy5zZXRSZXNpemFibGUoZmFsc2UpO30KX3Nob3dGaW5pc2hlZEZvclRlc3QoKXt9Cl9yZW1vdmVBbGxMYXlvdXRQcm9wZXJ0aWVzKCl7dGhpcy5fc2lkZWJhckVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2ZsZXhCYXNpcycpO3RoaXMuX21haW5FbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO3RoaXMuX21haW5FbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTt0aGlzLl9zaWRlYmFyRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTt0aGlzLl9zaWRlYmFyRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTt0aGlzLl9yZXNpemVyRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncmlnaHQnKTt0aGlzLl9yZXNpemVyRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2JvdHRvbScpO3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4tbGVmdCcpO3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4tcmlnaHQnKTt0aGlzLl9yZXNpemVyRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWFyZ2luLXRvcCcpO3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4tYm90dG9tJyk7fQpzaG93Qm90aChhbmltYXRlKXtpZih0aGlzLl9zaG93TW9kZT09PVVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLkJvdGgpCmFuaW1hdGU9ZmFsc2U7dGhpcy5fY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5fbWFpbkVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWF4aW1pemVkJywnaGlkZGVuJyk7dGhpcy5fc2lkZWJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWF4aW1pemVkJywnaGlkZGVuJyk7dGhpcy5fcmVzaXplckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5zZXRSZXNpemFibGUodHJ1ZSk7dGhpcy5zdXNwZW5kSW52YWxpZGF0aW9ucygpO2lmKHRoaXMuX3NpZGViYXJXaWRnZXQpCnRoaXMuX3NpZGViYXJXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO2lmKHRoaXMuX21haW5XaWRnZXQpCnRoaXMuX21haW5XaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQsdGhpcy5fc2lkZWJhcldpZGdldD90aGlzLl9zaWRlYmFyV2lkZ2V0LmVsZW1lbnQ6bnVsbCk7dGhpcy5yZXN1bWVJbnZhbGlkYXRpb25zKCk7dGhpcy5zZXRTZWNvbmRJc1NpZGViYXIodGhpcy5fc2Vjb25kSXNTaWRlYmFyKTt0aGlzLl9zaWRlYmFyU2l6ZURJUD0tMTt0aGlzLl91cGRhdGVTaG93TW9kZShVSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RoKTt0aGlzLl91cGRhdGVMYXlvdXQoYW5pbWF0ZSk7fQpzZXRSZXNpemFibGUocmVzaXphYmxlKXt0aGlzLl9yZXNpemVyV2lkZ2V0LnNldEVuYWJsZWQocmVzaXphYmxlKTt9CmlzUmVzaXphYmxlKCl7cmV0dXJuIHRoaXMuX3Jlc2l6ZXJXaWRnZXQuaXNFbmFibGVkKCk7fQpzZXRTaWRlYmFyU2l6ZShzaXplKXtjb25zdCBzaXplRElQPVVJLnpvb21NYW5hZ2VyLmNzc1RvRElQKHNpemUpO3RoaXMuX3NhdmVkU2lkZWJhclNpemVESVA9c2l6ZURJUDt0aGlzLl9zYXZlU2V0dGluZygpO3RoaXMuX2lubmVyU2V0U2lkZWJhclNpemVESVAoc2l6ZURJUCxmYWxzZSx0cnVlKTt9CnNpZGViYXJTaXplKCl7Y29uc3Qgc2l6ZURJUD1NYXRoLm1heCgwLHRoaXMuX3NpZGViYXJTaXplRElQKTtyZXR1cm4gVUkuem9vbU1hbmFnZXIuZGlwVG9DU1Moc2l6ZURJUCk7fQpfdG90YWxTaXplRElQKCl7aWYoIXRoaXMuX3RvdGFsU2l6ZUNTUyl7dGhpcy5fdG90YWxTaXplQ1NTPXRoaXMuX2lzVmVydGljYWw/dGhpcy5jb250ZW50RWxlbWVudC5vZmZzZXRXaWR0aDp0aGlzLmNvbnRlbnRFbGVtZW50Lm9mZnNldEhlaWdodDt0aGlzLl90b3RhbFNpemVPdGhlckRpbWVuc2lvbkNTUz10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuY29udGVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0OnRoaXMuY29udGVudEVsZW1lbnQub2Zmc2V0V2lkdGg7fQpyZXR1cm4gVUkuem9vbU1hbmFnZXIuY3NzVG9ESVAodGhpcy5fdG90YWxTaXplQ1NTKTt9Cl91cGRhdGVTaG93TW9kZShzaG93TW9kZSl7dGhpcy5fc2hvd01vZGU9c2hvd01vZGU7dGhpcy5fc2F2ZVNob3dNb2RlVG9TZXR0aW5ncygpO3RoaXMuX3VwZGF0ZVNob3dIaWRlU2lkZWJhckJ1dHRvbigpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlNwbGl0V2lkZ2V0LkV2ZW50cy5TaG93TW9kZUNoYW5nZWQsc2hvd01vZGUpO3RoaXMuaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCk7fQpfaW5uZXJTZXRTaWRlYmFyU2l6ZURJUChzaXplRElQLGFuaW1hdGUsdXNlckFjdGlvbil7aWYodGhpcy5fc2hvd01vZGUhPT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RofHwhdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3NpemVESVA9dGhpcy5fYXBwbHlDb25zdHJhaW50cyhzaXplRElQLHVzZXJBY3Rpb24pO2lmKHRoaXMuX3NpZGViYXJTaXplRElQPT09c2l6ZURJUCkKcmV0dXJuO2lmKCF0aGlzLl9yZXNpemVyRWxlbWVudFNpemUpe3RoaXMuX3Jlc2l6ZXJFbGVtZW50U2l6ZT10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuX3Jlc2l6ZXJFbGVtZW50Lm9mZnNldFdpZHRoOnRoaXMuX3Jlc2l6ZXJFbGVtZW50Lm9mZnNldEhlaWdodDt9CnRoaXMuX3JlbW92ZUFsbExheW91dFByb3BlcnRpZXMoKTtjb25zdCByb3VuZFNpemVDU1M9TWF0aC5yb3VuZChVSS56b29tTWFuYWdlci5kaXBUb0NTUyhzaXplRElQKSk7Y29uc3Qgc2lkZWJhclNpemVWYWx1ZT1yb3VuZFNpemVDU1MrJ3B4Jztjb25zdCBtYWluU2l6ZVZhbHVlPSh0aGlzLl90b3RhbFNpemVDU1Mtcm91bmRTaXplQ1NTKSsncHgnO3RoaXMuX3NpZGViYXJFbGVtZW50LnN0eWxlLmZsZXhCYXNpcz1zaWRlYmFyU2l6ZVZhbHVlO2lmKHRoaXMuX2lzVmVydGljYWwpe3RoaXMuX3NpZGViYXJFbGVtZW50LnN0eWxlLndpZHRoPXNpZGViYXJTaXplVmFsdWU7dGhpcy5fbWFpbkVsZW1lbnQuc3R5bGUud2lkdGg9bWFpblNpemVWYWx1ZTt0aGlzLl9zaWRlYmFyRWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5fdG90YWxTaXplT3RoZXJEaW1lbnNpb25DU1MrJ3B4Jzt0aGlzLl9tYWluRWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5fdG90YWxTaXplT3RoZXJEaW1lbnNpb25DU1MrJ3B4Jzt9ZWxzZXt0aGlzLl9zaWRlYmFyRWxlbWVudC5zdHlsZS5oZWlnaHQ9c2lkZWJhclNpemVWYWx1ZTt0aGlzLl9tYWluRWxlbWVudC5zdHlsZS5oZWlnaHQ9bWFpblNpemVWYWx1ZTt0aGlzLl9zaWRlYmFyRWxlbWVudC5zdHlsZS53aWR0aD10aGlzLl90b3RhbFNpemVPdGhlckRpbWVuc2lvbkNTUysncHgnO3RoaXMuX21haW5FbGVtZW50LnN0eWxlLndpZHRoPXRoaXMuX3RvdGFsU2l6ZU90aGVyRGltZW5zaW9uQ1NTKydweCc7fQppZih0aGlzLl9pc1ZlcnRpY2FsKXtpZih0aGlzLl9zZWNvbmRJc1NpZGViYXIpe3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLnJpZ2h0PXNpZGViYXJTaXplVmFsdWU7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQ9LXRoaXMuX3Jlc2l6ZXJFbGVtZW50U2l6ZS8yKydweCc7fWVsc2V7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUubGVmdD1zaWRlYmFyU2l6ZVZhbHVlO3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQ9LXRoaXMuX3Jlc2l6ZXJFbGVtZW50U2l6ZS8yKydweCc7fX1lbHNle2lmKHRoaXMuX3NlY29uZElzU2lkZWJhcil7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUuYm90dG9tPXNpZGViYXJTaXplVmFsdWU7dGhpcy5fcmVzaXplckVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tPS10aGlzLl9yZXNpemVyRWxlbWVudFNpemUvMisncHgnO31lbHNle3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLnRvcD1zaWRlYmFyU2l6ZVZhbHVlO3RoaXMuX3Jlc2l6ZXJFbGVtZW50LnN0eWxlLm1hcmdpblRvcD0tdGhpcy5fcmVzaXplckVsZW1lbnRTaXplLzIrJ3B4Jzt9fQp0aGlzLl9zaWRlYmFyU2l6ZURJUD1zaXplRElQO2lmKGFuaW1hdGUpe3RoaXMuX2FuaW1hdGUoZmFsc2UpO31lbHNle3RoaXMuZG9SZXNpemUoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5TcGxpdFdpZGdldC5FdmVudHMuU2lkZWJhclNpemVDaGFuZ2VkLHRoaXMuc2lkZWJhclNpemUoKSk7fX0KX2FuaW1hdGUocmV2ZXJzZSxjYWxsYmFjayl7Y29uc3QgYW5pbWF0aW9uVGltZT01MDt0aGlzLl9hbmltYXRpb25DYWxsYmFjaz1jYWxsYmFja3x8bnVsbDtsZXQgYW5pbWF0ZWRNYXJnaW5Qcm9wZXJ0eU5hbWU7aWYodGhpcy5faXNWZXJ0aWNhbCkKYW5pbWF0ZWRNYXJnaW5Qcm9wZXJ0eU5hbWU9dGhpcy5fc2Vjb25kSXNTaWRlYmFyPydtYXJnaW4tcmlnaHQnOidtYXJnaW4tbGVmdCc7ZWxzZQphbmltYXRlZE1hcmdpblByb3BlcnR5TmFtZT10aGlzLl9zZWNvbmRJc1NpZGViYXI/J21hcmdpbi1ib3R0b20nOidtYXJnaW4tdG9wJztjb25zdCBtYXJnaW5Gcm9tPXJldmVyc2U/JzAnOictJytVSS56b29tTWFuYWdlci5kaXBUb0NTUyh0aGlzLl9zaWRlYmFyU2l6ZURJUCkrJ3B4Jztjb25zdCBtYXJnaW5Ubz1yZXZlcnNlPyctJytVSS56b29tTWFuYWdlci5kaXBUb0NTUyh0aGlzLl9zaWRlYmFyU2l6ZURJUCkrJ3B4JzonMCc7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShhbmltYXRlZE1hcmdpblByb3BlcnR5TmFtZSxtYXJnaW5Gcm9tKTtpZighcmV2ZXJzZSl7c3VwcHJlc3NVbnVzZWQodGhpcy5fbWFpbkVsZW1lbnQub2Zmc2V0V2lkdGgpO3N1cHByZXNzVW51c2VkKHRoaXMuX3NpZGViYXJFbGVtZW50Lm9mZnNldFdpZHRoKTt9CmlmKCFyZXZlcnNlKQp0aGlzLl9zaWRlYmFyV2lkZ2V0LmRvUmVzaXplKCk7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNpdGlvbicsYW5pbWF0ZWRNYXJnaW5Qcm9wZXJ0eU5hbWUrJyAnK2FuaW1hdGlvblRpbWUrJ21zIGxpbmVhcicpO2NvbnN0IGJvdW5kQW5pbWF0aW9uRnJhbWU9YW5pbWF0aW9uRnJhbWUuYmluZCh0aGlzKTtsZXQgc3RhcnRUaW1lO2Z1bmN0aW9uIGFuaW1hdGlvbkZyYW1lKCl7dGhpcy5fYW5pbWF0aW9uRnJhbWVIYW5kbGU9MDtpZighc3RhcnRUaW1lKXt0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGFuaW1hdGVkTWFyZ2luUHJvcGVydHlOYW1lLG1hcmdpblRvKTtzdGFydFRpbWU9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpO31lbHNlIGlmKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTxzdGFydFRpbWUrYW5pbWF0aW9uVGltZSl7aWYodGhpcy5fbWFpbldpZGdldCkKdGhpcy5fbWFpbldpZGdldC5kb1Jlc2l6ZSgpO31lbHNle3RoaXMuX2NhbmNlbEFuaW1hdGlvbigpO2lmKHRoaXMuX21haW5XaWRnZXQpCnRoaXMuX21haW5XaWRnZXQuZG9SZXNpemUoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5TcGxpdFdpZGdldC5FdmVudHMuU2lkZWJhclNpemVDaGFuZ2VkLHRoaXMuc2lkZWJhclNpemUoKSk7cmV0dXJuO30KdGhpcy5fYW5pbWF0aW9uRnJhbWVIYW5kbGU9dGhpcy5jb250ZW50RWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYm91bmRBbmltYXRpb25GcmFtZSk7fQp0aGlzLl9hbmltYXRpb25GcmFtZUhhbmRsZT10aGlzLmNvbnRlbnRFbGVtZW50LndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZShib3VuZEFuaW1hdGlvbkZyYW1lKTt9Cl9jYW5jZWxBbmltYXRpb24oKXt0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4tdG9wJyk7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWFyZ2luLXJpZ2h0Jyk7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWFyZ2luLWJvdHRvbScpO3RoaXMuY29udGVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ21hcmdpbi1sZWZ0Jyk7dGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbicpO2lmKHRoaXMuX2FuaW1hdGlvbkZyYW1lSGFuZGxlKXt0aGlzLmNvbnRlbnRFbGVtZW50LndpbmRvdygpLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSGFuZGxlKTt0aGlzLl9hbmltYXRpb25GcmFtZUhhbmRsZT0wO30KaWYodGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2spe3RoaXMuX2FuaW1hdGlvbkNhbGxiYWNrKCk7dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2s9bnVsbDt9fQpfYXBwbHlDb25zdHJhaW50cyhzaWRlYmFyU2l6ZSx1c2VyQWN0aW9uKXtjb25zdCB0b3RhbFNpemU9dGhpcy5fdG90YWxTaXplRElQKCk7Y29uc3Qgem9vbUZhY3Rvcj10aGlzLl9jb25zdHJhaW50c0luRGlwPzE6VUkuem9vbU1hbmFnZXIuem9vbUZhY3RvcigpO2xldCBjb25zdHJhaW50cz10aGlzLl9zaWRlYmFyV2lkZ2V0P3RoaXMuX3NpZGViYXJXaWRnZXQuY29uc3RyYWludHMoKTpuZXcgVUkuQ29uc3RyYWludHMoKTtsZXQgbWluU2lkZWJhclNpemU9dGhpcy5pc1ZlcnRpY2FsKCk/Y29uc3RyYWludHMubWluaW11bS53aWR0aDpjb25zdHJhaW50cy5taW5pbXVtLmhlaWdodDtpZighbWluU2lkZWJhclNpemUpCm1pblNpZGViYXJTaXplPVVJLlNwbGl0V2lkZ2V0Lk1pblBhZGRpbmc7bWluU2lkZWJhclNpemUqPXpvb21GYWN0b3I7aWYodGhpcy5fc2lkZWJhck1pbmltaXplZCkKc2lkZWJhclNpemU9bWluU2lkZWJhclNpemU7bGV0IHByZWZlcnJlZFNpZGViYXJTaXplPXRoaXMuaXNWZXJ0aWNhbCgpP2NvbnN0cmFpbnRzLnByZWZlcnJlZC53aWR0aDpjb25zdHJhaW50cy5wcmVmZXJyZWQuaGVpZ2h0O2lmKCFwcmVmZXJyZWRTaWRlYmFyU2l6ZSkKcHJlZmVycmVkU2lkZWJhclNpemU9VUkuU3BsaXRXaWRnZXQuTWluUGFkZGluZztwcmVmZXJyZWRTaWRlYmFyU2l6ZSo9em9vbUZhY3RvcjtpZihzaWRlYmFyU2l6ZTxwcmVmZXJyZWRTaWRlYmFyU2l6ZSkKcHJlZmVycmVkU2lkZWJhclNpemU9TWF0aC5tYXgoc2lkZWJhclNpemUsbWluU2lkZWJhclNpemUpO3ByZWZlcnJlZFNpZGViYXJTaXplKz16b29tRmFjdG9yO2NvbnN0cmFpbnRzPXRoaXMuX21haW5XaWRnZXQ/dGhpcy5fbWFpbldpZGdldC5jb25zdHJhaW50cygpOm5ldyBVSS5Db25zdHJhaW50cygpO2xldCBtaW5NYWluU2l6ZT10aGlzLmlzVmVydGljYWwoKT9jb25zdHJhaW50cy5taW5pbXVtLndpZHRoOmNvbnN0cmFpbnRzLm1pbmltdW0uaGVpZ2h0O2lmKCFtaW5NYWluU2l6ZSkKbWluTWFpblNpemU9VUkuU3BsaXRXaWRnZXQuTWluUGFkZGluZzttaW5NYWluU2l6ZSo9em9vbUZhY3RvcjtsZXQgcHJlZmVycmVkTWFpblNpemU9dGhpcy5pc1ZlcnRpY2FsKCk/Y29uc3RyYWludHMucHJlZmVycmVkLndpZHRoOmNvbnN0cmFpbnRzLnByZWZlcnJlZC5oZWlnaHQ7aWYoIXByZWZlcnJlZE1haW5TaXplKQpwcmVmZXJyZWRNYWluU2l6ZT1VSS5TcGxpdFdpZGdldC5NaW5QYWRkaW5nO3ByZWZlcnJlZE1haW5TaXplKj16b29tRmFjdG9yO2NvbnN0IHNhdmVkTWFpblNpemU9dGhpcy5pc1ZlcnRpY2FsKCk/dGhpcy5fc2F2ZWRWZXJ0aWNhbE1haW5TaXplOnRoaXMuX3NhdmVkSG9yaXpvbnRhbE1haW5TaXplO2lmKHNhdmVkTWFpblNpemUhPT1udWxsKQpwcmVmZXJyZWRNYWluU2l6ZT1NYXRoLm1pbihwcmVmZXJyZWRNYWluU2l6ZSxzYXZlZE1haW5TaXplKnpvb21GYWN0b3IpO2lmKHVzZXJBY3Rpb24pCnByZWZlcnJlZE1haW5TaXplPW1pbk1haW5TaXplO2NvbnN0IHRvdGFsUHJlZmVycmVkPXByZWZlcnJlZE1haW5TaXplK3ByZWZlcnJlZFNpZGViYXJTaXplO2lmKHRvdGFsUHJlZmVycmVkPD10b3RhbFNpemUpCnJldHVybiBOdW1iZXIuY29uc3RyYWluKHNpZGViYXJTaXplLHByZWZlcnJlZFNpZGViYXJTaXplLHRvdGFsU2l6ZS1wcmVmZXJyZWRNYWluU2l6ZSk7aWYobWluTWFpblNpemUrbWluU2lkZWJhclNpemU8PXRvdGFsU2l6ZSl7Y29uc3QgZGVsdGE9dG90YWxQcmVmZXJyZWQtdG90YWxTaXplO2NvbnN0IHNpZGViYXJEZWx0YT1kZWx0YSpwcmVmZXJyZWRTaWRlYmFyU2l6ZS90b3RhbFByZWZlcnJlZDtzaWRlYmFyU2l6ZT1wcmVmZXJyZWRTaWRlYmFyU2l6ZS1zaWRlYmFyRGVsdGE7cmV0dXJuIE51bWJlci5jb25zdHJhaW4oc2lkZWJhclNpemUsbWluU2lkZWJhclNpemUsdG90YWxTaXplLW1pbk1haW5TaXplKTt9CnJldHVybiBNYXRoLm1heCgwLHRvdGFsU2l6ZS1taW5NYWluU2l6ZSk7fQp3YXNTaG93bigpe3RoaXMuX2ZvcmNlVXBkYXRlTGF5b3V0KCk7VUkuem9vbU1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihVSS5ab29tTWFuYWdlci5FdmVudHMuWm9vbUNoYW5nZWQsdGhpcy5fb25ab29tQ2hhbmdlZCx0aGlzKTt9CndpbGxIaWRlKCl7VUkuem9vbU1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihVSS5ab29tTWFuYWdlci5FdmVudHMuWm9vbUNoYW5nZWQsdGhpcy5fb25ab29tQ2hhbmdlZCx0aGlzKTt9Cm9uUmVzaXplKCl7dGhpcy5fdXBkYXRlTGF5b3V0KCk7fQpvbkxheW91dCgpe3RoaXMuX3VwZGF0ZUxheW91dCgpO30KY2FsY3VsYXRlQ29uc3RyYWludHMoKXtpZih0aGlzLl9zaG93TW9kZT09PVVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLk9ubHlNYWluKQpyZXR1cm4gdGhpcy5fbWFpbldpZGdldD90aGlzLl9tYWluV2lkZ2V0LmNvbnN0cmFpbnRzKCk6bmV3IFVJLkNvbnN0cmFpbnRzKCk7aWYodGhpcy5fc2hvd01vZGU9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5U2lkZWJhcikKcmV0dXJuIHRoaXMuX3NpZGViYXJXaWRnZXQ/dGhpcy5fc2lkZWJhcldpZGdldC5jb25zdHJhaW50cygpOm5ldyBVSS5Db25zdHJhaW50cygpO2xldCBtYWluQ29uc3RyYWludHM9dGhpcy5fbWFpbldpZGdldD90aGlzLl9tYWluV2lkZ2V0LmNvbnN0cmFpbnRzKCk6bmV3IFVJLkNvbnN0cmFpbnRzKCk7bGV0IHNpZGViYXJDb25zdHJhaW50cz10aGlzLl9zaWRlYmFyV2lkZ2V0P3RoaXMuX3NpZGViYXJXaWRnZXQuY29uc3RyYWludHMoKTpuZXcgVUkuQ29uc3RyYWludHMoKTtjb25zdCBtaW49VUkuU3BsaXRXaWRnZXQuTWluUGFkZGluZztpZih0aGlzLl9pc1ZlcnRpY2FsKXttYWluQ29uc3RyYWludHM9bWFpbkNvbnN0cmFpbnRzLndpZHRoVG9NYXgobWluKS5hZGRXaWR0aCgxKTtzaWRlYmFyQ29uc3RyYWludHM9c2lkZWJhckNvbnN0cmFpbnRzLndpZHRoVG9NYXgobWluKTtyZXR1cm4gbWFpbkNvbnN0cmFpbnRzLmFkZFdpZHRoKHNpZGViYXJDb25zdHJhaW50cykuaGVpZ2h0VG9NYXgoc2lkZWJhckNvbnN0cmFpbnRzKTt9ZWxzZXttYWluQ29uc3RyYWludHM9bWFpbkNvbnN0cmFpbnRzLmhlaWdodFRvTWF4KG1pbikuYWRkSGVpZ2h0KDEpO3NpZGViYXJDb25zdHJhaW50cz1zaWRlYmFyQ29uc3RyYWludHMuaGVpZ2h0VG9NYXgobWluKTtyZXR1cm4gbWFpbkNvbnN0cmFpbnRzLndpZHRoVG9NYXgoc2lkZWJhckNvbnN0cmFpbnRzKS5hZGRIZWlnaHQoc2lkZWJhckNvbnN0cmFpbnRzKTt9fQpfb25SZXNpemVTdGFydChldmVudCl7dGhpcy5fcmVzaXplU3RhcnRTaXplRElQPXRoaXMuX3NpZGViYXJTaXplRElQO30KX29uUmVzaXplVXBkYXRlKGV2ZW50KXtjb25zdCBvZmZzZXQ9ZXZlbnQuZGF0YS5jdXJyZW50UG9zaXRpb24tZXZlbnQuZGF0YS5zdGFydFBvc2l0aW9uO2NvbnN0IG9mZnNldERJUD1VSS56b29tTWFuYWdlci5jc3NUb0RJUChvZmZzZXQpO2NvbnN0IG5ld1NpemVESVA9dGhpcy5fc2Vjb25kSXNTaWRlYmFyP3RoaXMuX3Jlc2l6ZVN0YXJ0U2l6ZURJUC1vZmZzZXRESVA6dGhpcy5fcmVzaXplU3RhcnRTaXplRElQK29mZnNldERJUDtjb25zdCBjb25zdHJhaW5lZFNpemVESVA9dGhpcy5fYXBwbHlDb25zdHJhaW50cyhuZXdTaXplRElQLHRydWUpO3RoaXMuX3NhdmVkU2lkZWJhclNpemVESVA9Y29uc3RyYWluZWRTaXplRElQO3RoaXMuX3NhdmVTZXR0aW5nKCk7dGhpcy5faW5uZXJTZXRTaWRlYmFyU2l6ZURJUChjb25zdHJhaW5lZFNpemVESVAsZmFsc2UsdHJ1ZSk7aWYodGhpcy5pc1ZlcnRpY2FsKCkpCnRoaXMuX3NhdmVkVmVydGljYWxNYWluU2l6ZT10aGlzLl90b3RhbFNpemVESVAoKS10aGlzLl9zaWRlYmFyU2l6ZURJUDtlbHNlCnRoaXMuX3NhdmVkSG9yaXpvbnRhbE1haW5TaXplPXRoaXMuX3RvdGFsU2l6ZURJUCgpLXRoaXMuX3NpZGViYXJTaXplRElQO30KX29uUmVzaXplRW5kKGV2ZW50KXt0aGlzLl9yZXNpemVTdGFydFNpemVESVA9MDt9CmhpZGVEZWZhdWx0UmVzaXplcihub1NwbGl0dGVyKXt0aGlzLnVuaW5zdGFsbFJlc2l6ZXIodGhpcy5fcmVzaXplckVsZW1lbnQpO3RoaXMuX3NpZGViYXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ25vLWRlZmF1bHQtc3BsaXR0ZXInLCEhbm9TcGxpdHRlcik7fQppbnN0YWxsUmVzaXplcihyZXNpemVyRWxlbWVudCl7dGhpcy5fcmVzaXplcldpZGdldC5hZGRFbGVtZW50KHJlc2l6ZXJFbGVtZW50KTt9CnVuaW5zdGFsbFJlc2l6ZXIocmVzaXplckVsZW1lbnQpe3RoaXMuX3Jlc2l6ZXJXaWRnZXQucmVtb3ZlRWxlbWVudChyZXNpemVyRWxlbWVudCk7fQpoYXNDdXN0b21SZXNpemVyKCl7Y29uc3QgZWxlbWVudHM9dGhpcy5fcmVzaXplcldpZGdldC5lbGVtZW50cygpO3JldHVybiBlbGVtZW50cy5sZW5ndGg+MXx8KGVsZW1lbnRzLmxlbmd0aD09PTEmJmVsZW1lbnRzWzBdIT09dGhpcy5fcmVzaXplckVsZW1lbnQpO30KdG9nZ2xlUmVzaXplcihyZXNpemVyLG9uKXtpZihvbikKdGhpcy5pbnN0YWxsUmVzaXplcihyZXNpemVyKTtlbHNlCnRoaXMudW5pbnN0YWxsUmVzaXplcihyZXNpemVyKTt9Cl9zZXR0aW5nRm9yT3JpZW50YXRpb24oKXtjb25zdCBzdGF0ZT10aGlzLl9zZXR0aW5nP3RoaXMuX3NldHRpbmcuZ2V0KCk6e307cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/c3RhdGUudmVydGljYWw6c3RhdGUuaG9yaXpvbnRhbDt9Cl9wcmVmZXJyZWRTaWRlYmFyU2l6ZURJUCgpe2xldCBzaXplPXRoaXMuX3NhdmVkU2lkZWJhclNpemVESVA7aWYoIXNpemUpe3NpemU9dGhpcy5faXNWZXJ0aWNhbD90aGlzLl9kZWZhdWx0U2lkZWJhcldpZHRoOnRoaXMuX2RlZmF1bHRTaWRlYmFySGVpZ2h0O2lmKDA8c2l6ZSYmc2l6ZTwxKQpzaXplKj10aGlzLl90b3RhbFNpemVESVAoKTt9CnJldHVybiBzaXplO30KX3Jlc3RvcmVTaWRlYmFyU2l6ZUZyb21TZXR0aW5ncygpe2NvbnN0IHNldHRpbmdGb3JPcmllbnRhdGlvbj10aGlzLl9zZXR0aW5nRm9yT3JpZW50YXRpb24oKTt0aGlzLl9zYXZlZFNpZGViYXJTaXplRElQPXNldHRpbmdGb3JPcmllbnRhdGlvbj9zZXR0aW5nRm9yT3JpZW50YXRpb24uc2l6ZTowO30KX3Jlc3RvcmVBbmRBcHBseVNob3dNb2RlRnJvbVNldHRpbmdzKCl7Y29uc3Qgb3JpZW50YXRpb25TdGF0ZT10aGlzLl9zZXR0aW5nRm9yT3JpZW50YXRpb24oKTt0aGlzLl9zYXZlZFNob3dNb2RlPW9yaWVudGF0aW9uU3RhdGUmJm9yaWVudGF0aW9uU3RhdGUuc2hvd01vZGU/b3JpZW50YXRpb25TdGF0ZS5zaG93TW9kZTp0aGlzLl9zaG93TW9kZTt0aGlzLl9zaG93TW9kZT10aGlzLl9zYXZlZFNob3dNb2RlO3N3aXRjaCh0aGlzLl9zYXZlZFNob3dNb2RlKXtjYXNlIFVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLkJvdGg6dGhpcy5zaG93Qm90aCgpO2JyZWFrO2Nhc2UgVUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuT25seU1haW46dGhpcy5oaWRlU2lkZWJhcigpO2JyZWFrO2Nhc2UgVUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuT25seVNpZGViYXI6dGhpcy5oaWRlTWFpbigpO2JyZWFrO319Cl9zYXZlU2hvd01vZGVUb1NldHRpbmdzKCl7dGhpcy5fc2F2ZWRTaG93TW9kZT10aGlzLl9zaG93TW9kZTt0aGlzLl9zYXZlU2V0dGluZygpO30KX3NhdmVTZXR0aW5nKCl7aWYoIXRoaXMuX3NldHRpbmcpCnJldHVybjtjb25zdCBzdGF0ZT10aGlzLl9zZXR0aW5nLmdldCgpO2NvbnN0IG9yaWVudGF0aW9uU3RhdGU9KHRoaXMuX2lzVmVydGljYWw/c3RhdGUudmVydGljYWw6c3RhdGUuaG9yaXpvbnRhbCl8fHt9O29yaWVudGF0aW9uU3RhdGUuc2l6ZT10aGlzLl9zYXZlZFNpZGViYXJTaXplRElQO2lmKHRoaXMuX3Nob3VsZFNhdmVTaG93TW9kZSkKb3JpZW50YXRpb25TdGF0ZS5zaG93TW9kZT10aGlzLl9zYXZlZFNob3dNb2RlO2lmKHRoaXMuX2lzVmVydGljYWwpCnN0YXRlLnZlcnRpY2FsPW9yaWVudGF0aW9uU3RhdGU7ZWxzZQpzdGF0ZS5ob3Jpem9udGFsPW9yaWVudGF0aW9uU3RhdGU7dGhpcy5fc2V0dGluZy5zZXQoc3RhdGUpO30KX2ZvcmNlVXBkYXRlTGF5b3V0KCl7dGhpcy5fc2lkZWJhclNpemVESVA9LTE7dGhpcy5fdXBkYXRlTGF5b3V0KCk7fQpfb25ab29tQ2hhbmdlZChldmVudCl7dGhpcy5fZm9yY2VVcGRhdGVMYXlvdXQoKTt9CmNyZWF0ZVNob3dIaWRlU2lkZWJhckJ1dHRvbih0aXRsZSl7dGhpcy5fc2hvd0hpZGVTaWRlYmFyQnV0dG9uVGl0bGU9Q29tbW9uLlVJU3RyaW5nKHRpdGxlKTt0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oJycsJycpO3RoaXMuX3Nob3dIaWRlU2lkZWJhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLGJ1dHRvbkNsaWNrZWQsdGhpcyk7dGhpcy5fdXBkYXRlU2hvd0hpZGVTaWRlYmFyQnV0dG9uKCk7ZnVuY3Rpb24gYnV0dG9uQ2xpY2tlZChldmVudCl7aWYodGhpcy5fc2hvd01vZGUhPT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RoKQp0aGlzLnNob3dCb3RoKHRydWUpO2Vsc2UKdGhpcy5oaWRlU2lkZWJhcih0cnVlKTt9CnJldHVybiB0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b247fQpfdXBkYXRlU2hvd0hpZGVTaWRlYmFyQnV0dG9uKCl7aWYoIXRoaXMuX3Nob3dIaWRlU2lkZWJhckJ1dHRvbikKcmV0dXJuO2NvbnN0IHNpZGViYXJIaWRkZW49dGhpcy5fc2hvd01vZGU9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5TWFpbjtsZXQgZ2x5cGg9Jyc7aWYoc2lkZWJhckhpZGRlbil7Z2x5cGg9dGhpcy5pc1ZlcnRpY2FsKCk/KHRoaXMuaXNTaWRlYmFyU2Vjb25kKCk/J2xhcmdlaWNvbi1zaG93LXJpZ2h0LXNpZGViYXInOidsYXJnZWljb24tc2hvdy1sZWZ0LXNpZGViYXInKToodGhpcy5pc1NpZGViYXJTZWNvbmQoKT8nbGFyZ2VpY29uLXNob3ctYm90dG9tLXNpZGViYXInOidsYXJnZWljb24tc2hvdy10b3Atc2lkZWJhcicpO31lbHNle2dseXBoPXRoaXMuaXNWZXJ0aWNhbCgpPyh0aGlzLmlzU2lkZWJhclNlY29uZCgpPydsYXJnZWljb24taGlkZS1yaWdodC1zaWRlYmFyJzonbGFyZ2VpY29uLWhpZGUtbGVmdC1zaWRlYmFyJyk6KHRoaXMuaXNTaWRlYmFyU2Vjb25kKCk/J2xhcmdlaWNvbi1oaWRlLWJvdHRvbS1zaWRlYmFyJzonbGFyZ2VpY29uLWhpZGUtdG9wLXNpZGViYXInKTt9CnRoaXMuX3Nob3dIaWRlU2lkZWJhckJ1dHRvbi5zZXRHbHlwaChnbHlwaCk7dGhpcy5fc2hvd0hpZGVTaWRlYmFyQnV0dG9uLnNldFRpdGxlKHNpZGViYXJIaWRkZW4/Q29tbW9uLlVJU3RyaW5nKCdTaG93ICVzJyx0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b25UaXRsZSk6Q29tbW9uLlVJU3RyaW5nKCdIaWRlICVzJyx0aGlzLl9zaG93SGlkZVNpZGViYXJCdXR0b25UaXRsZSkpO319O1VJLlNwbGl0V2lkZ2V0LlNldHRpbmdGb3JPcmllbnRhdGlvbjtVSS5TcGxpdFdpZGdldC5TaG93TW9kZT17Qm90aDonQm90aCcsT25seU1haW46J09ubHlNYWluJyxPbmx5U2lkZWJhcjonT25seVNpZGViYXInfTtVSS5TcGxpdFdpZGdldC5FdmVudHM9e1NpZGViYXJTaXplQ2hhbmdlZDpTeW1ib2woJ1NpZGViYXJTaXplQ2hhbmdlZCcpLFNob3dNb2RlQ2hhbmdlZDpTeW1ib2woJ1Nob3dNb2RlQ2hhbmdlZCcpfTtVSS5TcGxpdFdpZGdldC5NaW5QYWRkaW5nPTIwOztVSS5UYXJnZXRDcmFzaGVkU2NyZWVuPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihoaWRlQ2FsbGJhY2spe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvdGFyZ2V0Q3Jhc2hlZFNjcmVlbi5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdtZXNzYWdlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdEZXZUb29scyB3YXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHBhZ2UuJyk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVzc2FnZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnT25jZSBwYWdlIGlzIHJlbG9hZGVkLCBEZXZUb29scyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0LicpO3RoaXMuX2hpZGVDYWxsYmFjaz1oaWRlQ2FsbGJhY2s7fQp3aWxsSGlkZSgpe3RoaXMuX2hpZGVDYWxsYmFjay5jYWxsKG51bGwpO319OztVSS5UZXh0UHJvbXB0PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fcHJveHlFbGVtZW50O3RoaXMuX3Byb3h5RWxlbWVudERpc3BsYXk9J2lubGluZS1ibG9jayc7dGhpcy5fYXV0b2NvbXBsZXRpb25UaW1lb3V0PVVJLlRleHRQcm9tcHQuRGVmYXVsdEF1dG9jb21wbGV0aW9uVGltZW91dDt0aGlzLl90aXRsZT0nJzt0aGlzLl9xdWVyeVJhbmdlPW51bGw7dGhpcy5fcHJldmlvdXNUZXh0PScnO3RoaXMuX2N1cnJlbnRTdWdnZXN0aW9uPScnO3RoaXMuX2NvbXBsZXRpb25SZXF1ZXN0SWQ9MDt0aGlzLl9naG9zdFRleHRFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdhdXRvLWNvbXBsZXRlLXRleHQnKTt0aGlzLl9naG9zdFRleHRFbGVtZW50LnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywnZmFsc2UnKTtVSS5BUklBVXRpbHMubWFya0FzSGlkZGVuKHRoaXMuX2dob3N0VGV4dEVsZW1lbnQpO30KaW5pdGlhbGl6ZShjb21wbGV0aW9ucyxzdG9wQ2hhcmFjdGVycyl7dGhpcy5fbG9hZENvbXBsZXRpb25zPWNvbXBsZXRpb25zO3RoaXMuX2NvbXBsZXRpb25TdG9wQ2hhcmFjdGVycz1zdG9wQ2hhcmFjdGVyc3x8JyA9OlsoezssISstKi8mfF48Pi4nO30Kc2V0QXV0b2NvbXBsZXRpb25UaW1lb3V0KHRpbWVvdXQpe3RoaXMuX2F1dG9jb21wbGV0aW9uVGltZW91dD10aW1lb3V0O30KcmVuZGVyQXNCbG9jaygpe3RoaXMuX3Byb3h5RWxlbWVudERpc3BsYXk9J2Jsb2NrJzt9CmF0dGFjaChlbGVtZW50KXtyZXR1cm4gdGhpcy5fYXR0YWNoSW50ZXJuYWwoZWxlbWVudCk7fQphdHRhY2hBbmRTdGFydEVkaXRpbmcoZWxlbWVudCxibHVyTGlzdGVuZXIpe2NvbnN0IHByb3h5RWxlbWVudD10aGlzLl9hdHRhY2hJbnRlcm5hbChlbGVtZW50KTt0aGlzLl9zdGFydEVkaXRpbmcoYmx1ckxpc3RlbmVyKTtyZXR1cm4gcHJveHlFbGVtZW50O30KX2F0dGFjaEludGVybmFsKGVsZW1lbnQpe2lmKHRoaXMuX3Byb3h5RWxlbWVudCkKdGhyb3cnQ2Fubm90IGF0dGFjaCBhbiBhdHRhY2hlZCBUZXh0UHJvbXB0Jzt0aGlzLl9lbGVtZW50PWVsZW1lbnQ7dGhpcy5fYm91bmRPbktleURvd249dGhpcy5vbktleURvd24uYmluZCh0aGlzKTt0aGlzLl9ib3VuZE9uSW5wdXQ9dGhpcy5vbklucHV0LmJpbmQodGhpcyk7dGhpcy5fYm91bmRPbk1vdXNlV2hlZWw9dGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKTt0aGlzLl9ib3VuZENsZWFyQXV0b2NvbXBsZXRlPXRoaXMuY2xlYXJBdXRvY29tcGxldGUuYmluZCh0aGlzKTt0aGlzLl9wcm94eUVsZW1lbnQ9ZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBzaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLl9wcm94eUVsZW1lbnQsJ3VpL3RleHRQcm9tcHQuY3NzJyk7dGhpcy5fY29udGVudEVsZW1lbnQ9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2JywndGV4dC1wcm9tcHQtcm9vdCcpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7dGhpcy5fcHJveHlFbGVtZW50LnN0eWxlLmRpc3BsYXk9dGhpcy5fcHJveHlFbGVtZW50RGlzcGxheTtlbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX3Byb3h5RWxlbWVudCxlbGVtZW50KTt0aGlzLl9wcm94eUVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0ZXh0LXByb21wdCcpO1VJLkFSSUFVdGlscy5tYXJrQXNUZXh0Qm94KHRoaXMuX2VsZW1lbnQpO3RoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCdwbGFpbnRleHQtb25seScpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRPbktleURvd24sZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX2JvdW5kT25JbnB1dCxmYWxzZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJyx0aGlzLl9ib3VuZE9uTW91c2VXaGVlbCxmYWxzZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsdGhpcy5fYm91bmRDbGVhckF1dG9jb21wbGV0ZSxmYWxzZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLl9ib3VuZENsZWFyQXV0b2NvbXBsZXRlLGZhbHNlKTt0aGlzLl9zdWdnZXN0Qm94PW5ldyBVSS5TdWdnZXN0Qm94KHRoaXMsMjApO2lmKHRoaXMuX3RpdGxlKQp0aGlzLl9wcm94eUVsZW1lbnQudGl0bGU9dGhpcy5fdGl0bGU7cmV0dXJuIHRoaXMuX3Byb3h5RWxlbWVudDt9CmRldGFjaCgpe3RoaXMuX3JlbW92ZUZyb21FbGVtZW50KCk7dGhpcy5fZm9jdXNSZXN0b3Jlci5yZXN0b3JlKCk7dGhpcy5fcHJveHlFbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2VsZW1lbnQsdGhpcy5fcHJveHlFbGVtZW50KTt0aGlzLl9wcm94eUVsZW1lbnQucmVtb3ZlKCk7ZGVsZXRlIHRoaXMuX3Byb3h5RWxlbWVudDt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RleHQtcHJvbXB0Jyk7dGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpO3RoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7fQp0ZXh0V2l0aEN1cnJlbnRTdWdnZXN0aW9uKCl7Y29uc3QgdGV4dD10aGlzLnRleHQoKTtpZighdGhpcy5fcXVlcnlSYW5nZSkKcmV0dXJuIHRleHQ7cmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsdGhpcy5fcXVlcnlSYW5nZS5zdGFydENvbHVtbikrdGhpcy5fY3VycmVudFN1Z2dlc3Rpb24rCnRleHQuc3Vic3RyaW5nKHRoaXMuX3F1ZXJ5UmFuZ2UuZW5kQ29sdW1uKTt9CnRleHQoKXtsZXQgdGV4dD10aGlzLl9lbGVtZW50LnRleHRDb250ZW50O2lmKHRoaXMuX2dob3N0VGV4dEVsZW1lbnQucGFyZW50Tm9kZSl7Y29uc3QgYWRkaXRpb249dGhpcy5fZ2hvc3RUZXh0RWxlbWVudC50ZXh0Q29udGVudDt0ZXh0PXRleHQuc3Vic3RyaW5nKDAsdGV4dC5sZW5ndGgtYWRkaXRpb24ubGVuZ3RoKTt9CnJldHVybiB0ZXh0O30Kc2V0VGV4dCh0ZXh0KXt0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7dGhpcy5fZWxlbWVudC50ZXh0Q29udGVudD10ZXh0O3RoaXMuX3ByZXZpb3VzVGV4dD10aGlzLnRleHQoKTtpZih0aGlzLl9lbGVtZW50Lmhhc0ZvY3VzKCkpe3RoaXMubW92ZUNhcmV0VG9FbmRPZlByb21wdCgpO3RoaXMuX2VsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoKTt9fQpmb2N1cygpe3RoaXMuX2VsZW1lbnQuZm9jdXMoKTt9CnRpdGxlKCl7cmV0dXJuIHRoaXMuX3RpdGxlO30Kc2V0VGl0bGUodGl0bGUpe3RoaXMuX3RpdGxlPXRpdGxlO2lmKHRoaXMuX3Byb3h5RWxlbWVudCkKdGhpcy5fcHJveHlFbGVtZW50LnRpdGxlPXRpdGxlO30Kc2V0UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpe2lmKHBsYWNlaG9sZGVyKXt0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicscGxhY2Vob2xkZXIpO1VJLkFSSUFVdGlscy5zZXRQbGFjZWhvbGRlcih0aGlzLl9lbGVtZW50LHBsYWNlaG9sZGVyKTt9ZWxzZXt0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1VJLkFSSUFVdGlscy5zZXRQbGFjZWhvbGRlcih0aGlzLl9lbGVtZW50LG51bGwpO319CnNldEVuYWJsZWQoZW5hYmxlZCl7aWYoZW5hYmxlZCkKdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsJ3BsYWludGV4dC1vbmx5Jyk7ZWxzZQp0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdkaXNhYmxlZCcsIWVuYWJsZWQpO30KX3JlbW92ZUZyb21FbGVtZW50KCl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO3RoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRPbktleURvd24sZmFsc2UpO3RoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX2JvdW5kT25JbnB1dCxmYWxzZSk7dGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsdGhpcy5fYm91bmRDbGVhckF1dG9jb21wbGV0ZSxmYWxzZSk7dGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLl9ib3VuZENsZWFyQXV0b2NvbXBsZXRlLGZhbHNlKTtpZih0aGlzLl9pc0VkaXRpbmcpCnRoaXMuX3N0b3BFZGl0aW5nKCk7aWYodGhpcy5fc3VnZ2VzdEJveCkKdGhpcy5fc3VnZ2VzdEJveC5oaWRlKCk7fQpfc3RhcnRFZGl0aW5nKGJsdXJMaXN0ZW5lcil7dGhpcy5faXNFZGl0aW5nPXRydWU7dGhpcy5fY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGV4dC1wcm9tcHQtZWRpdGluZycpO2lmKGJsdXJMaXN0ZW5lcil7dGhpcy5fYmx1ckxpc3RlbmVyPWJsdXJMaXN0ZW5lcjt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLHRoaXMuX2JsdXJMaXN0ZW5lcixmYWxzZSk7fQp0aGlzLl9vbGRUYWJJbmRleD10aGlzLl9lbGVtZW50LnRhYkluZGV4O2lmKHRoaXMuX2VsZW1lbnQudGFiSW5kZXg8MCkKdGhpcy5fZWxlbWVudC50YWJJbmRleD0wO3RoaXMuX2ZvY3VzUmVzdG9yZXI9bmV3IFVJLkVsZW1lbnRGb2N1c1Jlc3RvcmVyKHRoaXMuX2VsZW1lbnQpO2lmKCF0aGlzLnRleHQoKSkKdGhpcy5hdXRvQ29tcGxldGVTb29uKCk7fQpfc3RvcEVkaXRpbmcoKXt0aGlzLl9lbGVtZW50LnRhYkluZGV4PXRoaXMuX29sZFRhYkluZGV4O2lmKHRoaXMuX2JsdXJMaXN0ZW5lcikKdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLl9ibHVyTGlzdGVuZXIsZmFsc2UpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RleHQtcHJvbXB0LWVkaXRpbmcnKTtkZWxldGUgdGhpcy5faXNFZGl0aW5nO30Kb25Nb3VzZVdoZWVsKGV2ZW50KXt9Cm9uS2V5RG93bihldmVudCl7bGV0IGhhbmRsZWQ9ZmFsc2U7aWYodGhpcy5faXNTdWdnZXN0Qm94VmlzaWJsZSgpJiZ0aGlzLl9zdWdnZXN0Qm94LmtleVByZXNzZWQoZXZlbnQpKXtldmVudC5jb25zdW1lKHRydWUpO3JldHVybjt9CnN3aXRjaChldmVudC5rZXkpe2Nhc2UnVGFiJzpoYW5kbGVkPXRoaXMudGFiS2V5UHJlc3NlZChldmVudCk7YnJlYWs7Y2FzZSdBcnJvd0xlZnQnOmNhc2UnQXJyb3dVcCc6Y2FzZSdQYWdlVXAnOmNhc2UnSG9tZSc6dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO2JyZWFrO2Nhc2UnUGFnZURvd24nOmNhc2UnQXJyb3dSaWdodCc6Y2FzZSdBcnJvd0Rvd24nOmNhc2UnRW5kJzppZih0aGlzLl9pc0NhcmV0QXRFbmRPZlByb21wdCgpKQpoYW5kbGVkPXRoaXMuYWNjZXB0QXV0b0NvbXBsZXRlKCk7ZWxzZQp0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7YnJlYWs7Y2FzZSdFc2NhcGUnOmlmKHRoaXMuX2lzU3VnZ2VzdEJveFZpc2libGUoKSl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO2hhbmRsZWQ9dHJ1ZTt9CmJyZWFrO2Nhc2UnICc6aWYoZXZlbnQuY3RybEtleSYmIWV2ZW50Lm1ldGFLZXkmJiFldmVudC5hbHRLZXkmJiFldmVudC5zaGlmdEtleSl7dGhpcy5hdXRvQ29tcGxldGVTb29uKHRydWUpO2hhbmRsZWQ9dHJ1ZTt9CmJyZWFrO30KaWYoaXNFbnRlcktleShldmVudCkpCmV2ZW50LnByZXZlbnREZWZhdWx0KCk7aWYoaGFuZGxlZCkKZXZlbnQuY29uc3VtZSh0cnVlKTt9Cm9uSW5wdXQoZXZlbnQpe2NvbnN0IHRleHQ9dGhpcy50ZXh0KCk7Y29uc3QgaGFzQ29tbW9uUHJlZml4PXRleHQuc3RhcnRzV2l0aCh0aGlzLl9wcmV2aW91c1RleHQpfHx0aGlzLl9wcmV2aW91c1RleHQuc3RhcnRzV2l0aCh0ZXh0KTtpZih0aGlzLl9xdWVyeVJhbmdlJiZoYXNDb21tb25QcmVmaXgpCnRoaXMuX3F1ZXJ5UmFuZ2UuZW5kQ29sdW1uKz10ZXh0Lmxlbmd0aC10aGlzLl9wcmV2aW91c1RleHQubGVuZ3RoO3RoaXMuX3JlZnJlc2hHaG9zdFRleHQoKTt0aGlzLl9wcmV2aW91c1RleHQ9dGV4dDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5UZXh0UHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCk7dGhpcy5hdXRvQ29tcGxldGVTb29uKCk7fQphY2NlcHRBdXRvQ29tcGxldGUoKXtsZXQgcmVzdWx0PWZhbHNlO2lmKHRoaXMuX2lzU3VnZ2VzdEJveFZpc2libGUoKSkKcmVzdWx0PXRoaXMuX3N1Z2dlc3RCb3guYWNjZXB0U3VnZ2VzdGlvbigpO2lmKCFyZXN1bHQpCnJlc3VsdD10aGlzLl9hY2NlcHRTdWdnZXN0aW9uSW50ZXJuYWwoKTtyZXR1cm4gcmVzdWx0O30KY2xlYXJBdXRvY29tcGxldGUoKXtjb25zdCBiZWZvcmVUZXh0PXRoaXMudGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpO2lmKHRoaXMuX2lzU3VnZ2VzdEJveFZpc2libGUoKSkKdGhpcy5fc3VnZ2VzdEJveC5oaWRlKCk7dGhpcy5fY2xlYXJBdXRvY29tcGxldGVUaW1lb3V0KCk7dGhpcy5fcXVlcnlSYW5nZT1udWxsO3RoaXMuX3JlZnJlc2hHaG9zdFRleHQoKTtpZihiZWZvcmVUZXh0IT09dGhpcy50ZXh0V2l0aEN1cnJlbnRTdWdnZXN0aW9uKCkpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRleHRQcm9tcHQuRXZlbnRzLlRleHRDaGFuZ2VkKTt9Cl9yZWZyZXNoR2hvc3RUZXh0KCl7aWYodGhpcy5fcXVlcnlSYW5nZSYmdGhpcy5fY3VycmVudFN1Z2dlc3Rpb24mJnRoaXMuX2lzQ2FyZXRBdEVuZE9mUHJvbXB0KCkmJnRoaXMuX2N1cnJlbnRTdWdnZXN0aW9uLnN0YXJ0c1dpdGgodGhpcy50ZXh0KCkuc3Vic3RyaW5nKHRoaXMuX3F1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW4pKSl7dGhpcy5fZ2hvc3RUZXh0RWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9jdXJyZW50U3VnZ2VzdGlvbi5zdWJzdHJpbmcodGhpcy5fcXVlcnlSYW5nZS5lbmRDb2x1bW4tdGhpcy5fcXVlcnlSYW5nZS5zdGFydENvbHVtbik7dGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9naG9zdFRleHRFbGVtZW50KTt9ZWxzZXt0aGlzLl9naG9zdFRleHRFbGVtZW50LnJlbW92ZSgpO319Cl9jbGVhckF1dG9jb21wbGV0ZVRpbWVvdXQoKXtpZih0aGlzLl9jb21wbGV0ZVRpbWVvdXQpe2NsZWFyVGltZW91dCh0aGlzLl9jb21wbGV0ZVRpbWVvdXQpO2RlbGV0ZSB0aGlzLl9jb21wbGV0ZVRpbWVvdXQ7fQp0aGlzLl9jb21wbGV0aW9uUmVxdWVzdElkKys7fQphdXRvQ29tcGxldGVTb29uKGZvcmNlKXtjb25zdCBpbW1lZGlhdGVseT10aGlzLl9pc1N1Z2dlc3RCb3hWaXNpYmxlKCl8fGZvcmNlO2lmKCF0aGlzLl9jb21wbGV0ZVRpbWVvdXQpe3RoaXMuX2NvbXBsZXRlVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuY29tcGxldGUuYmluZCh0aGlzLGZvcmNlKSxpbW1lZGlhdGVseT8wOnRoaXMuX2F1dG9jb21wbGV0aW9uVGltZW91dCk7fX0KYXN5bmMgY29tcGxldGUoZm9yY2Upe3RoaXMuX2NsZWFyQXV0b2NvbXBsZXRlVGltZW91dCgpO2NvbnN0IHNlbGVjdGlvbj10aGlzLl9lbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpO2NvbnN0IHNlbGVjdGlvblJhbmdlPXNlbGVjdGlvbiYmc2VsZWN0aW9uLnJhbmdlQ291bnQ/c2VsZWN0aW9uLmdldFJhbmdlQXQoMCk6bnVsbDtpZighc2VsZWN0aW9uUmFuZ2UpCnJldHVybjtsZXQgc2hvdWxkRXhpdDtpZighZm9yY2UmJiF0aGlzLl9pc0NhcmV0QXRFbmRPZlByb21wdCgpJiYhdGhpcy5faXNTdWdnZXN0Qm94VmlzaWJsZSgpKQpzaG91bGRFeGl0PXRydWU7ZWxzZSBpZighc2VsZWN0aW9uLmlzQ29sbGFwc2VkKQpzaG91bGRFeGl0PXRydWU7aWYoc2hvdWxkRXhpdCl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO3JldHVybjt9CmNvbnN0IHdvcmRRdWVyeVJhbmdlPXNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLnJhbmdlT2ZXb3JkKHNlbGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0LHRoaXMuX2NvbXBsZXRpb25TdG9wQ2hhcmFjdGVycyx0aGlzLl9lbGVtZW50LCdiYWNrd2FyZCcpO2NvbnN0IGV4cHJlc3Npb25SYW5nZT13b3JkUXVlcnlSYW5nZS5jbG9uZVJhbmdlKCk7ZXhwcmVzc2lvblJhbmdlLmNvbGxhcHNlKHRydWUpO2V4cHJlc3Npb25SYW5nZS5zZXRTdGFydEJlZm9yZSh0aGlzLl9wcm94eUVsZW1lbnQpO2NvbnN0IGNvbXBsZXRpb25SZXF1ZXN0SWQ9Kyt0aGlzLl9jb21wbGV0aW9uUmVxdWVzdElkO2NvbnN0IGNvbXBsZXRpb25zPWF3YWl0IHRoaXMuX2xvYWRDb21wbGV0aW9ucyhleHByZXNzaW9uUmFuZ2UudG9TdHJpbmcoKSx3b3JkUXVlcnlSYW5nZS50b1N0cmluZygpLCEhZm9yY2UpO3RoaXMuX2NvbXBsZXRpb25zUmVhZHkoY29tcGxldGlvblJlcXVlc3RJZCxzZWxlY3Rpb24sd29yZFF1ZXJ5UmFuZ2UsISFmb3JjZSxjb21wbGV0aW9ucyk7fQpkaXNhYmxlRGVmYXVsdFN1Z2dlc3Rpb25Gb3JFbXB0eUlucHV0KCl7dGhpcy5fZGlzYWJsZURlZmF1bHRTdWdnZXN0aW9uRm9yRW1wdHlJbnB1dD10cnVlO30KX2JveEZvckFuY2hvckF0U3RhcnQoc2VsZWN0aW9uLHRleHRSYW5nZSl7Y29uc3QgcmFuZ2VDb3B5PXNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtjb25zdCBhbmNob3JFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTthbmNob3JFbGVtZW50LnRleHRDb250ZW50PSdcdTIwMEInO3RleHRSYW5nZS5pbnNlcnROb2RlKGFuY2hvckVsZW1lbnQpO2NvbnN0IGJveD1hbmNob3JFbGVtZW50LmJveEluV2luZG93KHdpbmRvdyk7YW5jaG9yRWxlbWVudC5yZW1vdmUoKTtzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7c2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlQ29weSk7cmV0dXJuIGJveDt9Cl9jcmVhdGVSYW5nZSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO30KYWRkaXRpb25hbENvbXBsZXRpb25zKHF1ZXJ5KXtyZXR1cm5bXTt9Cl9jb21wbGV0aW9uc1JlYWR5KGNvbXBsZXRpb25SZXF1ZXN0SWQsc2VsZWN0aW9uLG9yaWdpbmFsV29yZFF1ZXJ5UmFuZ2UsZm9yY2UsY29tcGxldGlvbnMpe2lmKHRoaXMuX2NvbXBsZXRpb25SZXF1ZXN0SWQhPT1jb21wbGV0aW9uUmVxdWVzdElkKQpyZXR1cm47Y29uc3QgcXVlcnk9b3JpZ2luYWxXb3JkUXVlcnlSYW5nZS50b1N0cmluZygpO2NvbnN0IHN0b3JlPW5ldyBTZXQoKTtjb21wbGV0aW9ucz1jb21wbGV0aW9ucy5maWx0ZXIoaXRlbT0+IXN0b3JlLmhhcyhpdGVtLnRleHQpJiYhIXN0b3JlLmFkZChpdGVtLnRleHQpKTtpZihxdWVyeXx8Zm9yY2Upe2lmKHF1ZXJ5KQpjb21wbGV0aW9ucz1jb21wbGV0aW9ucy5jb25jYXQodGhpcy5hZGRpdGlvbmFsQ29tcGxldGlvbnMocXVlcnkpKTtlbHNlCmNvbXBsZXRpb25zPXRoaXMuYWRkaXRpb25hbENvbXBsZXRpb25zKHF1ZXJ5KS5jb25jYXQoY29tcGxldGlvbnMpO30KaWYoIWNvbXBsZXRpb25zLmxlbmd0aCl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO3JldHVybjt9CmNvbnN0IHNlbGVjdGlvblJhbmdlPXNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO2NvbnN0IGZ1bGxXb3JkUmFuZ2U9dGhpcy5fY3JlYXRlUmFuZ2UoKTtmdWxsV29yZFJhbmdlLnNldFN0YXJ0KG9yaWdpbmFsV29yZFF1ZXJ5UmFuZ2Uuc3RhcnRDb250YWluZXIsb3JpZ2luYWxXb3JkUXVlcnlSYW5nZS5zdGFydE9mZnNldCk7ZnVsbFdvcmRSYW5nZS5zZXRFbmQoc2VsZWN0aW9uUmFuZ2UuZW5kQ29udGFpbmVyLHNlbGVjdGlvblJhbmdlLmVuZE9mZnNldCk7aWYocXVlcnkrc2VsZWN0aW9uUmFuZ2UudG9TdHJpbmcoKSE9PWZ1bGxXb3JkUmFuZ2UudG9TdHJpbmcoKSkKcmV0dXJuO2NvbnN0IGJlZm9yZVJhbmdlPXRoaXMuX2NyZWF0ZVJhbmdlKCk7YmVmb3JlUmFuZ2Uuc2V0U3RhcnQodGhpcy5fZWxlbWVudCwwKTtiZWZvcmVSYW5nZS5zZXRFbmQoZnVsbFdvcmRSYW5nZS5zdGFydENvbnRhaW5lcixmdWxsV29yZFJhbmdlLnN0YXJ0T2Zmc2V0KTt0aGlzLl9xdWVyeVJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKDAsYmVmb3JlUmFuZ2UudG9TdHJpbmcoKS5sZW5ndGgsMCxiZWZvcmVSYW5nZS50b1N0cmluZygpLmxlbmd0aCtmdWxsV29yZFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoKTtjb25zdCBzaG91bGRTZWxlY3Q9IXRoaXMuX2Rpc2FibGVEZWZhdWx0U3VnZ2VzdGlvbkZvckVtcHR5SW5wdXR8fCEhdGhpcy50ZXh0KCk7aWYodGhpcy5fc3VnZ2VzdEJveCl7dGhpcy5fc3VnZ2VzdEJveC51cGRhdGVTdWdnZXN0aW9ucyh0aGlzLl9ib3hGb3JBbmNob3JBdFN0YXJ0KHNlbGVjdGlvbixmdWxsV29yZFJhbmdlKSxjb21wbGV0aW9ucyxzaG91bGRTZWxlY3QsIXRoaXMuX2lzQ2FyZXRBdEVuZE9mUHJvbXB0KCksdGhpcy50ZXh0KCkpO319CmFwcGx5U3VnZ2VzdGlvbihzdWdnZXN0aW9uLGlzSW50ZXJtZWRpYXRlU3VnZ2VzdGlvbil7dGhpcy5fY3VycmVudFN1Z2dlc3Rpb249c3VnZ2VzdGlvbjt0aGlzLl9yZWZyZXNoR2hvc3RUZXh0KCk7aWYoaXNJbnRlcm1lZGlhdGVTdWdnZXN0aW9uKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5UZXh0UHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCk7fQphY2NlcHRTdWdnZXN0aW9uKCl7dGhpcy5fYWNjZXB0U3VnZ2VzdGlvbkludGVybmFsKCk7fQpfYWNjZXB0U3VnZ2VzdGlvbkludGVybmFsKCl7aWYoIXRoaXMuX3F1ZXJ5UmFuZ2UpCnJldHVybiBmYWxzZTt0aGlzLl9lbGVtZW50LnRleHRDb250ZW50PXRoaXMudGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpO3RoaXMuc2V0RE9NU2VsZWN0aW9uKHRoaXMuX3F1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW4rdGhpcy5fY3VycmVudFN1Z2dlc3Rpb24ubGVuZ3RoLHRoaXMuX3F1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW4rdGhpcy5fY3VycmVudFN1Z2dlc3Rpb24ubGVuZ3RoKTt0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVGV4dFByb21wdC5FdmVudHMuVGV4dENoYW5nZWQpO3JldHVybiB0cnVlO30Kc2V0RE9NU2VsZWN0aW9uKHN0YXJ0Q29sdW1uLGVuZENvbHVtbil7dGhpcy5fZWxlbWVudC5ub3JtYWxpemUoKTtjb25zdCBub2RlPXRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1swXTtpZighbm9kZXx8bm9kZT09PXRoaXMuX2dob3N0VGV4dEVsZW1lbnQpCnJldHVybjtjb25zdCByYW5nZT10aGlzLl9jcmVhdGVSYW5nZSgpO3JhbmdlLnNldFN0YXJ0KG5vZGUsc3RhcnRDb2x1bW4pO3JhbmdlLnNldEVuZChub2RlLGVuZENvbHVtbik7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX2VsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO3NlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7fQpfaXNTdWdnZXN0Qm94VmlzaWJsZSgpe3JldHVybiB0aGlzLl9zdWdnZXN0Qm94JiZ0aGlzLl9zdWdnZXN0Qm94LnZpc2libGUoKTt9CmlzQ2FyZXRJbnNpZGVQcm9tcHQoKXtjb25zdCBzZWxlY3Rpb249dGhpcy5fZWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKTtjb25zdCBzZWxlY3Rpb25SYW5nZT1zZWxlY3Rpb24mJnNlbGVjdGlvbi5yYW5nZUNvdW50P3NlbGVjdGlvbi5nZXRSYW5nZUF0KDApOm51bGw7aWYoIXNlbGVjdGlvblJhbmdlfHwhc2VsZWN0aW9uLmlzQ29sbGFwc2VkKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLmlzU2VsZk9yRGVzY2VuZGFudCh0aGlzLl9lbGVtZW50KTt9Cl9pc0NhcmV0QXRFbmRPZlByb21wdCgpe2NvbnN0IHNlbGVjdGlvbj10aGlzLl9lbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpO2NvbnN0IHNlbGVjdGlvblJhbmdlPXNlbGVjdGlvbiYmc2VsZWN0aW9uLnJhbmdlQ291bnQ/c2VsZWN0aW9uLmdldFJhbmdlQXQoMCk6bnVsbDtpZighc2VsZWN0aW9uUmFuZ2V8fCFzZWxlY3Rpb24uaXNDb2xsYXBzZWQpCnJldHVybiBmYWxzZTtsZXQgbm9kZT1zZWxlY3Rpb25SYW5nZS5zdGFydENvbnRhaW5lcjtpZighbm9kZS5pc1NlbGZPckRlc2NlbmRhbnQodGhpcy5fZWxlbWVudCkpCnJldHVybiBmYWxzZTtpZih0aGlzLl9naG9zdFRleHRFbGVtZW50LmlzQW5jZXN0b3Iobm9kZSkpCnJldHVybiB0cnVlO2lmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ8bm9kZS5ub2RlVmFsdWUubGVuZ3RoKQpyZXR1cm4gZmFsc2U7bGV0IGZvdW5kTmV4dFRleHQ9ZmFsc2U7d2hpbGUobm9kZSl7aWYobm9kZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFJiZub2RlLm5vZGVWYWx1ZS5sZW5ndGgpe2lmKGZvdW5kTmV4dFRleHQmJiF0aGlzLl9naG9zdFRleHRFbGVtZW50LmlzQW5jZXN0b3Iobm9kZSkpCnJldHVybiBmYWxzZTtmb3VuZE5leHRUZXh0PXRydWU7fQpub2RlPW5vZGUudHJhdmVyc2VOZXh0Tm9kZSh0aGlzLl9lbGVtZW50KTt9CnJldHVybiB0cnVlO30KbW92ZUNhcmV0VG9FbmRPZlByb21wdCgpe2NvbnN0IHNlbGVjdGlvbj10aGlzLl9lbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpO2NvbnN0IHNlbGVjdGlvblJhbmdlPXRoaXMuX2NyZWF0ZVJhbmdlKCk7bGV0IGNvbnRhaW5lcj10aGlzLl9lbGVtZW50O3doaWxlKGNvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCkKY29udGFpbmVyPWNvbnRhaW5lci5sYXN0Q2hpbGQ7Y29uc3Qgb2Zmc2V0PWNvbnRhaW5lci5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP2NvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGg6MDtzZWxlY3Rpb25SYW5nZS5zZXRTdGFydChjb250YWluZXIsb2Zmc2V0KTtzZWxlY3Rpb25SYW5nZS5zZXRFbmQoY29udGFpbmVyLG9mZnNldCk7c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO3NlbGVjdGlvbi5hZGRSYW5nZShzZWxlY3Rpb25SYW5nZSk7fQp0YWJLZXlQcmVzc2VkKGV2ZW50KXtyZXR1cm4gdGhpcy5hY2NlcHRBdXRvQ29tcGxldGUoKTt9CnByb3h5RWxlbWVudEZvclRlc3RzKCl7cmV0dXJuIHRoaXMuX3Byb3h5RWxlbWVudHx8bnVsbDt9fTtVSS5UZXh0UHJvbXB0LkRlZmF1bHRBdXRvY29tcGxldGlvblRpbWVvdXQ9MjUwO1VJLlRleHRQcm9tcHQuRXZlbnRzPXtUZXh0Q2hhbmdlZDpTeW1ib2woJ1RleHRDaGFuZ2VkJyl9OztVSS5UaHJvdHRsZWRXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGlzV2ViQ29tcG9uZW50LHRpbWVvdXQpe3N1cGVyKGlzV2ViQ29tcG9uZW50KTt0aGlzLl91cGRhdGVUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIodGltZW91dD09PXVuZGVmaW5lZD8xMDA6dGltZW91dCk7dGhpcy5fdXBkYXRlV2hlblZpc2libGU9ZmFsc2U7fQpkb1VwZGF0ZSgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CnVwZGF0ZSgpe3RoaXMuX3VwZGF0ZVdoZW5WaXNpYmxlPSF0aGlzLmlzU2hvd2luZygpO2lmKHRoaXMuX3VwZGF0ZVdoZW5WaXNpYmxlKQpyZXR1cm47dGhpcy5fdXBkYXRlVGhyb3R0bGVyLnNjaGVkdWxlKGlubmVyVXBkYXRlLmJpbmQodGhpcykpO2Z1bmN0aW9uIGlubmVyVXBkYXRlKCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuIHRoaXMuZG9VcGRhdGUoKTt0aGlzLl91cGRhdGVXaGVuVmlzaWJsZT10cnVlO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7aWYodGhpcy5fdXBkYXRlV2hlblZpc2libGUpCnRoaXMudXBkYXRlKCk7fX07O1VJLlRvb2xiYXI9Y2xhc3N7Y29uc3RydWN0b3IoY2xhc3NOYW1lLHBhcmVudEVsZW1lbnQpe3RoaXMuX2l0ZW1zPVtdO3RoaXMuZWxlbWVudD1wYXJlbnRFbGVtZW50P3BhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpOmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuZWxlbWVudC5jbGFzc05hbWU9Y2xhc3NOYW1lO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sYmFyJyk7dGhpcy5fZW5hYmxlZD10cnVlO3RoaXMuX3NoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuZWxlbWVudCwndWkvdG9vbGJhci5jc3MnKTt0aGlzLl9jb250ZW50RWxlbWVudD10aGlzLl9zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLXNoYWRvdycpO3RoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7fQpzdGF0aWMgY3JlYXRlQWN0aW9uQnV0dG9uKGFjdGlvbix0b2dnbGVkT3B0aW9ucyx1bnRvZ2dsZWRPcHRpb25zKXtjb25zdCBidXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUoYWN0aW9uLnRpdGxlKCksYWN0aW9uLmljb24oKSxhY3Rpb24udG9nZ2xlZEljb24oKSk7YnV0dG9uLnNldFRvZ2dsZVdpdGhSZWRDb2xvcihhY3Rpb24udG9nZ2xlV2l0aFJlZENvbG9yKCkpO2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLGFjdGlvbi5leGVjdXRlLGFjdGlvbik7YWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuQWN0aW9uLkV2ZW50cy5FbmFibGVkLGVuYWJsZWRDaGFuZ2VkKTthY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihVSS5BY3Rpb24uRXZlbnRzLlRvZ2dsZWQsdG9nZ2xlZCk7bGV0IGxvbmdDbGlja0NvbnRyb2xsZXI9bnVsbDtsZXQgbG9uZ0NsaWNrQnV0dG9ucz1udWxsO2xldCBsb25nQ2xpY2tHbHlwaD1udWxsO3RvZ2dsZWQoKTtidXR0b24uc2V0RW5hYmxlZChhY3Rpb24uZW5hYmxlZCgpKTtyZXR1cm4gYnV0dG9uO2Z1bmN0aW9uIGVuYWJsZWRDaGFuZ2VkKGV2ZW50KXtidXR0b24uc2V0RW5hYmxlZCgoZXZlbnQuZGF0YSkpO30KZnVuY3Rpb24gdG9nZ2xlZCgpe2J1dHRvbi5zZXRUb2dnbGVkKGFjdGlvbi50b2dnbGVkKCkpO2lmKGFjdGlvbi50aXRsZSgpKQpVSS5Ub29sdGlwLmluc3RhbGwoYnV0dG9uLmVsZW1lbnQsYWN0aW9uLnRpdGxlKCksYWN0aW9uLmlkKCkpO3VwZGF0ZU9wdGlvbnMoKTt9CmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoKXtjb25zdCBidXR0b25zPWFjdGlvbi50b2dnbGVkKCk/KHRvZ2dsZWRPcHRpb25zfHxudWxsKToodW50b2dnbGVkT3B0aW9uc3x8bnVsbCk7aWYoYnV0dG9ucyYmYnV0dG9ucy5sZW5ndGgpe2lmKCFsb25nQ2xpY2tDb250cm9sbGVyKXtsb25nQ2xpY2tDb250cm9sbGVyPW5ldyBVSS5Mb25nQ2xpY2tDb250cm9sbGVyKGJ1dHRvbi5lbGVtZW50LHNob3dPcHRpb25zKTtsb25nQ2xpY2tHbHlwaD1VSS5JY29uLmNyZWF0ZSgnbGFyZ2VpY29uLWxvbmdjbGljay10cmlhbmdsZScsJ2xvbmctY2xpY2stZ2x5cGgnKTtidXR0b24uZWxlbWVudC5hcHBlbmRDaGlsZChsb25nQ2xpY2tHbHlwaCk7bG9uZ0NsaWNrQnV0dG9ucz1idXR0b25zO319ZWxzZXtpZihsb25nQ2xpY2tDb250cm9sbGVyKXtsb25nQ2xpY2tDb250cm9sbGVyLmRpc3Bvc2UoKTtsb25nQ2xpY2tDb250cm9sbGVyPW51bGw7bG9uZ0NsaWNrR2x5cGgucmVtb3ZlKCk7bG9uZ0NsaWNrR2x5cGg9bnVsbDtsb25nQ2xpY2tCdXR0b25zPW51bGw7fX19CmZ1bmN0aW9uIHNob3dPcHRpb25zKCl7bGV0IGJ1dHRvbnM9bG9uZ0NsaWNrQnV0dG9ucy5zbGljZSgpO2NvbnN0IG1haW5CdXR0b25DbG9uZT1uZXcgVUkuVG9vbGJhclRvZ2dsZShhY3Rpb24udGl0bGUoKSxhY3Rpb24uaWNvbigpLGFjdGlvbi50b2dnbGVkSWNvbigpKTttYWluQnV0dG9uQ2xvbmUuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayxjbGlja2VkKTtmdW5jdGlvbiBjbGlja2VkKGV2ZW50KXtidXR0b24uX2NsaWNrZWQoKGV2ZW50LmRhdGEpKTt9Cm1haW5CdXR0b25DbG9uZS5zZXRUb2dnbGVkKGFjdGlvbi50b2dnbGVkKCkpO2J1dHRvbnMucHVzaChtYWluQnV0dG9uQ2xvbmUpO2NvbnN0IGRvY3VtZW50PWJ1dHRvbi5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG1vdXNlVXAsZmFsc2UpO2NvbnN0IG9wdGlvbnNHbGFzc1BhbmU9bmV3IFVJLkdsYXNzUGFuZSgpO29wdGlvbnNHbGFzc1BhbmUuc2V0UG9pbnRlckV2ZW50c0JlaGF2aW9yKFVJLkdsYXNzUGFuZS5Qb2ludGVyRXZlbnRzQmVoYXZpb3IuQmxvY2tlZEJ5R2xhc3NQYW5lKTtvcHRpb25zR2xhc3NQYW5lLnNob3coZG9jdW1lbnQpO2NvbnN0IG9wdGlvbnNCYXI9bmV3IFVJLlRvb2xiYXIoJ2ZpbGwnLG9wdGlvbnNHbGFzc1BhbmUuY29udGVudEVsZW1lbnQpO29wdGlvbnNCYXIuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zsb2F0aW5nJyk7Y29uc3QgYnV0dG9uSGVpZ2h0PTI2O2NvbnN0IGhvc3RCdXR0b25Qb3NpdGlvbj1idXR0b24uZWxlbWVudC5ib3hJbldpbmRvdygpLnJlbGF0aXZlVG9FbGVtZW50KFVJLkdsYXNzUGFuZS5jb250YWluZXIoZG9jdW1lbnQpKTtjb25zdCB0b3BOb3RCb3R0b209aG9zdEJ1dHRvblBvc2l0aW9uLnkrYnV0dG9uSGVpZ2h0KmJ1dHRvbnMubGVuZ3RoPGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7aWYodG9wTm90Qm90dG9tKQpidXR0b25zPWJ1dHRvbnMucmV2ZXJzZSgpO29wdGlvbnNCYXIuZWxlbWVudC5zdHlsZS5oZWlnaHQ9KGJ1dHRvbkhlaWdodCpidXR0b25zLmxlbmd0aCkrJ3B4JztpZih0b3BOb3RCb3R0b20pCm9wdGlvbnNCYXIuZWxlbWVudC5zdHlsZS50b3A9KGhvc3RCdXR0b25Qb3NpdGlvbi55LTUpKydweCc7ZWxzZQpvcHRpb25zQmFyLmVsZW1lbnQuc3R5bGUudG9wPShob3N0QnV0dG9uUG9zaXRpb24ueS0oYnV0dG9uSGVpZ2h0KihidXR0b25zLmxlbmd0aC0xKSktNikrJ3B4JztvcHRpb25zQmFyLmVsZW1lbnQuc3R5bGUubGVmdD0oaG9zdEJ1dHRvblBvc2l0aW9uLngtNSkrJ3B4Jztmb3IobGV0IGk9MDtpPGJ1dHRvbnMubGVuZ3RoOysraSl7YnV0dG9uc1tpXS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW91c2VPdmVyLGZhbHNlKTtidXR0b25zW2ldLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLG1vdXNlT3V0LGZhbHNlKTtvcHRpb25zQmFyLmFwcGVuZFRvb2xiYXJJdGVtKGJ1dHRvbnNbaV0pO30KY29uc3QgaG9zdEJ1dHRvbkluZGV4PXRvcE5vdEJvdHRvbT8wOmJ1dHRvbnMubGVuZ3RoLTE7YnV0dG9uc1tob3N0QnV0dG9uSW5kZXhdLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZW11bGF0ZS1hY3RpdmUnKTtmdW5jdGlvbiBtb3VzZU92ZXIoZSl7aWYoZS53aGljaCE9PTEpCnJldHVybjtjb25zdCBidXR0b25FbGVtZW50PWUudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3Rvb2xiYXItaXRlbScpO2J1dHRvbkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZW11bGF0ZS1hY3RpdmUnKTt9CmZ1bmN0aW9uIG1vdXNlT3V0KGUpe2lmKGUud2hpY2ghPT0xKQpyZXR1cm47Y29uc3QgYnV0dG9uRWxlbWVudD1lLnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCd0b29sYmFyLWl0ZW0nKTtidXR0b25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2VtdWxhdGUtYWN0aXZlJyk7fQpmdW5jdGlvbiBtb3VzZVVwKGUpe2lmKGUud2hpY2ghPT0xKQpyZXR1cm47b3B0aW9uc0dsYXNzUGFuZS5oaWRlKCk7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG1vdXNlVXAsZmFsc2UpO2ZvcihsZXQgaT0wO2k8YnV0dG9ucy5sZW5ndGg7KytpKXtpZihidXR0b25zW2ldLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdlbXVsYXRlLWFjdGl2ZScpKXtidXR0b25zW2ldLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZW11bGF0ZS1hY3RpdmUnKTtidXR0b25zW2ldLl9jbGlja2VkKGUpO2JyZWFrO319fX19CnN0YXRpYyBjcmVhdGVBY3Rpb25CdXR0b25Gb3JJZChhY3Rpb25JZCl7Y29uc3QgYWN0aW9uPVVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbihhY3Rpb25JZCk7cmV0dXJuIFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKChhY3Rpb24pKTt9CmdyaXBFbGVtZW50Rm9yUmVzaXplKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRFbGVtZW50O30KbWFrZVdyYXBwYWJsZShncm93VmVydGljYWxseSl7dGhpcy5fY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd3JhcHBhYmxlJyk7aWYoZ3Jvd1ZlcnRpY2FsbHkpCnRoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rvb2xiYXItZ3Jvdy12ZXJ0aWNhbCcpO30KbWFrZVZlcnRpY2FsKCl7dGhpcy5fY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmVydGljYWwnKTt9Cm1ha2VCbHVlT25Ib3Zlcigpe3RoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rvb2xiYXItYmx1ZS1vbi1ob3ZlcicpO30KbWFrZVRvZ2dsZWRHcmF5KCl7dGhpcy5fY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndG9vbGJhci10b2dnbGVkLWdyYXknKTt9CnJlbmRlckFzTGlua3MoKXt0aGlzLl9jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sYmFyLXJlbmRlci1hcy1saW5rcycpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9lbmFibGVkPWVuYWJsZWQ7Zm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5faXRlbXMpCml0ZW0uX2FwcGx5RW5hYmxlZFN0YXRlKHRoaXMuX2VuYWJsZWQmJml0ZW0uX2VuYWJsZWQpO30KYXBwZW5kVG9vbGJhckl0ZW0oaXRlbSl7dGhpcy5faXRlbXMucHVzaChpdGVtKTtpdGVtLl90b29sYmFyPXRoaXM7aWYoIXRoaXMuX2VuYWJsZWQpCml0ZW0uX2FwcGx5RW5hYmxlZFN0YXRlKGZhbHNlKTt0aGlzLl9jb250ZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaXRlbS5lbGVtZW50LHRoaXMuX2luc2VydGlvblBvaW50KTt0aGlzLl9oaWRlU2VwYXJhdG9yRHVwZXMoKTt9CmFwcGVuZFNlcGFyYXRvcigpe3RoaXMuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJTZXBhcmF0b3IoKSk7fQphcHBlbmRTcGFjZXIoKXt0aGlzLmFwcGVuZFRvb2xiYXJJdGVtKG5ldyBVSS5Ub29sYmFyU2VwYXJhdG9yKHRydWUpKTt9CmFwcGVuZFRleHQodGV4dCl7dGhpcy5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclRleHQodGV4dCkpO30KcmVtb3ZlVG9vbGJhckl0ZW1zKCl7Zm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5faXRlbXMpCmRlbGV0ZSBpdGVtLl90b29sYmFyO3RoaXMuX2l0ZW1zPVtdO3RoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt9CnNldENvbG9yKGNvbG9yKXtjb25zdCBzdHlsZT1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlLnRleHRDb250ZW50PScudG9vbGJhci1nbHlwaCB7IGJhY2tncm91bmQtY29sb3I6ICcrY29sb3IrJyAhaW1wb3J0YW50IH0nO3RoaXMuX3NoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO30Kc2V0VG9nZ2xlZENvbG9yKGNvbG9yKXtjb25zdCBzdHlsZT1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlLnRleHRDb250ZW50PScudG9vbGJhci1idXR0b24udG9vbGJhci1zdGF0ZS1vbiAudG9vbGJhci1nbHlwaCB7IGJhY2tncm91bmQtY29sb3I6ICcrY29sb3IrJyAhaW1wb3J0YW50IH0nO3RoaXMuX3NoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO30KX2hpZGVTZXBhcmF0b3JEdXBlcygpe2lmKCF0aGlzLl9pdGVtcy5sZW5ndGgpCnJldHVybjtsZXQgcHJldmlvdXNJc1NlcGFyYXRvcj1mYWxzZTtsZXQgbGFzdFNlcGFyYXRvcjtsZXQgbm9uU2VwYXJhdG9yVmlzaWJsZT1mYWxzZTtmb3IobGV0IGk9MDtpPHRoaXMuX2l0ZW1zLmxlbmd0aDsrK2kpe2lmKHRoaXMuX2l0ZW1zW2ldaW5zdGFuY2VvZiBVSS5Ub29sYmFyU2VwYXJhdG9yKXt0aGlzLl9pdGVtc1tpXS5zZXRWaXNpYmxlKCFwcmV2aW91c0lzU2VwYXJhdG9yKTtwcmV2aW91c0lzU2VwYXJhdG9yPXRydWU7bGFzdFNlcGFyYXRvcj10aGlzLl9pdGVtc1tpXTtjb250aW51ZTt9CmlmKHRoaXMuX2l0ZW1zW2ldLnZpc2libGUoKSl7cHJldmlvdXNJc1NlcGFyYXRvcj1mYWxzZTtsYXN0U2VwYXJhdG9yPW51bGw7bm9uU2VwYXJhdG9yVmlzaWJsZT10cnVlO319CmlmKGxhc3RTZXBhcmF0b3ImJmxhc3RTZXBhcmF0b3IhPT10aGlzLl9pdGVtcy5wZWVrTGFzdCgpKQpsYXN0U2VwYXJhdG9yLnNldFZpc2libGUoZmFsc2UpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCEhbGFzdFNlcGFyYXRvciYmbGFzdFNlcGFyYXRvci52aXNpYmxlKCkmJiFub25TZXBhcmF0b3JWaXNpYmxlKTt9CmFwcGVuZExvY2F0aW9uSXRlbXMobG9jYXRpb24pe2NvbnN0IGV4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIpO2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8ZXh0ZW5zaW9ucy5sZW5ndGg7KytpKXtpZihleHRlbnNpb25zW2ldLmRlc2NyaXB0b3IoKVsnbG9jYXRpb24nXT09PWxvY2F0aW9uKQpwcm9taXNlcy5wdXNoKHJlc29sdmVJdGVtKGV4dGVuc2lvbnNbaV0pKTt9ClByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGFwcGVuZEl0ZW1zSW5PcmRlci5iaW5kKHRoaXMpKTtmdW5jdGlvbiByZXNvbHZlSXRlbShleHRlbnNpb24pe2NvbnN0IGRlc2NyaXB0b3I9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKTtpZihkZXNjcmlwdG9yWydzZXBhcmF0b3InXSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgobmV3IFVJLlRvb2xiYXJTZXBhcmF0b3IoKSkpO2lmKGRlc2NyaXB0b3JbJ2FjdGlvbklkJ10pe3JldHVybiBQcm9taXNlLnJlc29sdmUoKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uRm9ySWQoZGVzY3JpcHRvclsnYWN0aW9uSWQnXSkpKTt9CnJldHVybiBleHRlbnNpb24uaW5zdGFuY2UoKS50aGVuKGZldGNoSXRlbUZyb21Qcm92aWRlcik7ZnVuY3Rpb24gZmV0Y2hJdGVtRnJvbVByb3ZpZGVyKHByb3ZpZGVyKXtyZXR1cm4ocHJvdmlkZXIpLml0ZW0oKTt9fQpmdW5jdGlvbiBhcHBlbmRJdGVtc0luT3JkZXIoaXRlbXMpe2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSl7Y29uc3QgaXRlbT1pdGVtc1tpXTtpZihpdGVtKQp0aGlzLmFwcGVuZFRvb2xiYXJJdGVtKGl0ZW0pO319fX07VUkuVG9vbGJhckl0ZW09Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGVsZW1lbnQpe3N1cGVyKCk7dGhpcy5lbGVtZW50PWVsZW1lbnQ7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rvb2xiYXItaXRlbScpO3RoaXMuX3Zpc2libGU9dHJ1ZTt0aGlzLl9lbmFibGVkPXRydWU7fQpzZXRUaXRsZSh0aXRsZSl7aWYodGhpcy5fdGl0bGU9PT10aXRsZSkKcmV0dXJuO3RoaXMuX3RpdGxlPXRpdGxlO1VJLkFSSUFVdGlscy5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmVsZW1lbnQsdGl0bGUpO1VJLlRvb2x0aXAuaW5zdGFsbCh0aGlzLmVsZW1lbnQsdGl0bGUpO30Kc2V0RW5hYmxlZCh2YWx1ZSl7aWYodGhpcy5fZW5hYmxlZD09PXZhbHVlKQpyZXR1cm47dGhpcy5fZW5hYmxlZD12YWx1ZTt0aGlzLl9hcHBseUVuYWJsZWRTdGF0ZSh0aGlzLl9lbmFibGVkJiYoIXRoaXMuX3Rvb2xiYXJ8fHRoaXMuX3Rvb2xiYXIuX2VuYWJsZWQpKTt9Cl9hcHBseUVuYWJsZWRTdGF0ZShlbmFibGVkKXt0aGlzLmVsZW1lbnQuZGlzYWJsZWQ9IWVuYWJsZWQ7fQp2aXNpYmxlKCl7cmV0dXJuIHRoaXMuX3Zpc2libGU7fQpzZXRWaXNpYmxlKHgpe2lmKHRoaXMuX3Zpc2libGU9PT14KQpyZXR1cm47dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXgpO3RoaXMuX3Zpc2libGU9eDtpZih0aGlzLl90b29sYmFyJiYhKHRoaXMgaW5zdGFuY2VvZiBVSS5Ub29sYmFyU2VwYXJhdG9yKSkKdGhpcy5fdG9vbGJhci5faGlkZVNlcGFyYXRvckR1cGVzKCk7fQpzZXRSaWdodEFsaWduZWQoYWxpZ25SaWdodCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Rvb2xiYXItaXRlbS1yaWdodC1hbGlnbmVkJyxhbGlnblJpZ2h0KTt9fTtVSS5Ub29sYmFyVGV4dD1jbGFzcyBleHRlbmRzIFVJLlRvb2xiYXJJdGVte2NvbnN0cnVjdG9yKHRleHQpe3N1cGVyKGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Rvb2xiYXItdGV4dCcpKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndG9vbGJhci10ZXh0Jyk7dGhpcy5zZXRUZXh0KHRleHR8fCcnKTt9CnRleHQoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnRleHRDb250ZW50O30Kc2V0VGV4dCh0ZXh0KXt0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDt9fTtVSS5Ub29sYmFyQnV0dG9uPWNsYXNzIGV4dGVuZHMgVUkuVG9vbGJhckl0ZW17Y29uc3RydWN0b3IodGl0bGUsZ2x5cGgsdGV4dCl7c3VwZXIoY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnYnV0dG9uJywndG9vbGJhci1idXR0b24nKSk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9jbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX21vdXNlRG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fbW91c2VVcC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9nbHlwaEVsZW1lbnQ9VUkuSWNvbi5jcmVhdGUoJycsJ3Rvb2xiYXItZ2x5cGggaGlkZGVuJyk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2dseXBoRWxlbWVudCk7dGhpcy5fdGV4dEVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLXRleHQgaGlkZGVuJyk7dGhpcy5zZXRUaXRsZSh0aXRsZSk7aWYoZ2x5cGgpCnRoaXMuc2V0R2x5cGgoZ2x5cGgpO3RoaXMuc2V0VGV4dCh0ZXh0fHwnJyk7dGhpcy5fdGl0bGU9Jyc7fQpzZXRUZXh0KHRleHQpe2lmKHRoaXMuX3RleHQ9PT10ZXh0KQpyZXR1cm47dGhpcy5fdGV4dEVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDt0aGlzLl90ZXh0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCF0ZXh0KTt0aGlzLl90ZXh0PXRleHQ7fQpzZXRHbHlwaChnbHlwaCl7aWYodGhpcy5fZ2x5cGg9PT1nbHlwaCkKcmV0dXJuO3RoaXMuX2dseXBoRWxlbWVudC5zZXRJY29uVHlwZShnbHlwaCk7dGhpcy5fZ2x5cGhFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIWdseXBoKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgndG9vbGJhci1oYXMtZ2x5cGgnLCEhZ2x5cGgpO3RoaXMuX2dseXBoPWdseXBoO30Kc2V0QmFja2dyb3VuZEltYWdlKGljb25VUkwpe3RoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9J3VybCgnK2ljb25VUkwrJyknO30Kc2V0RGFya1RleHQoKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGFyay10ZXh0Jyk7fQp0dXJuSW50b1NlbGVjdCh3aWR0aCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rvb2xiYXItaGFzLWRyb3Bkb3duJyk7Y29uc3QgZHJvcGRvd25BcnJvd0ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1kb3duJywndG9vbGJhci1kcm9wZG93bi1hcnJvdycpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkcm9wZG93bkFycm93SWNvbik7aWYod2lkdGgpCnRoaXMuZWxlbWVudC5zdHlsZS53aWR0aD13aWR0aCsncHgnO30KX2NsaWNrZWQoZXZlbnQpe2lmKCF0aGlzLl9lbmFibGVkKQpyZXR1cm47dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssZXZlbnQpO2V2ZW50LmNvbnN1bWUoKTt9Cl9tb3VzZURvd24oZXZlbnQpe2lmKCF0aGlzLl9lbmFibGVkKQpyZXR1cm47dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuTW91c2VEb3duLGV2ZW50KTt9Cl9tb3VzZVVwKGV2ZW50KXtpZighdGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLk1vdXNlVXAsZXZlbnQpO319O1VJLlRvb2xiYXJCdXR0b24uRXZlbnRzPXtDbGljazpTeW1ib2woJ0NsaWNrJyksTW91c2VEb3duOlN5bWJvbCgnTW91c2VEb3duJyksTW91c2VVcDpTeW1ib2woJ01vdXNlVXAnKX07VUkuVG9vbGJhcklucHV0PWNsYXNzIGV4dGVuZHMgVUkuVG9vbGJhckl0ZW17Y29uc3RydWN0b3IocGxhY2Vob2xkZXIsZ3Jvd0ZhY3RvcixzaHJpbmtGYWN0b3IsdG9vbHRpcCxjb21wbGV0aW9ucyl7c3VwZXIoY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndG9vbGJhci1pbnB1dCcpKTtjb25zdCBpbnRlcm5hbFByb21wdEVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sYmFyLWlucHV0LXByb21wdCcpO2ludGVybmFsUHJvbXB0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsKCk9PnRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJykpO2ludGVybmFsUHJvbXB0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywoKT0+dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKSk7dGhpcy5fcHJvbXB0PW5ldyBVSS5UZXh0UHJvbXB0KCk7dGhpcy5fcHJveHlFbGVtZW50PXRoaXMuX3Byb21wdC5hdHRhY2goaW50ZXJuYWxQcm9tcHRFbGVtZW50KTt0aGlzLl9wcm94eUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndG9vbGJhci1wcm9tcHQtcHJveHknKTt0aGlzLl9wcm94eUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PnRoaXMuX29uS2V5ZG93bkNhbGxiYWNrKGV2ZW50KSk7dGhpcy5fcHJvbXB0LmluaXRpYWxpemUoY29tcGxldGlvbnN8fCgoKT0+UHJvbWlzZS5yZXNvbHZlKFtdKSksJyAnKTtpZih0b29sdGlwKQp0aGlzLl9wcm9tcHQuc2V0VGl0bGUodG9vbHRpcCk7dGhpcy5fcHJvbXB0LnNldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyKTt0aGlzLl9wcm9tcHQuYWRkRXZlbnRMaXN0ZW5lcihVSS5UZXh0UHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrLmJpbmQodGhpcykpO2lmKGdyb3dGYWN0b3IpCnRoaXMuZWxlbWVudC5zdHlsZS5mbGV4R3Jvdz1ncm93RmFjdG9yO2lmKHNocmlua0ZhY3RvcikKdGhpcy5lbGVtZW50LnN0eWxlLmZsZXhTaHJpbms9c2hyaW5rRmFjdG9yO2NvbnN0IGNsZWFyQnV0dG9uPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndG9vbGJhci1pbnB1dC1jbGVhci1idXR0b24nKTtjbGVhckJ1dHRvbi5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1ncmF5LWNyb3NzLWhvdmVyJywnc2VhcmNoLWNhbmNlbC1idXR0b24nKSk7Y2xlYXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57dGhpcy5faW50ZXJuYWxTZXRWYWx1ZSgnJyx0cnVlKTt0aGlzLl9wcm9tcHQuZm9jdXMoKTt9KTt0aGlzLl91cGRhdGVFbXB0eVN0eWxlcygpO30KX2FwcGx5RW5hYmxlZFN0YXRlKGVuYWJsZWQpe3RoaXMuX3Byb21wdC5zZXRFbmFibGVkKGVuYWJsZWQpO30Kc2V0VmFsdWUodmFsdWUpe3RoaXMuX2ludGVybmFsU2V0VmFsdWUodmFsdWUsZmFsc2UpO30KX2ludGVybmFsU2V0VmFsdWUodmFsdWUsbm90aWZ5KXt0aGlzLl9wcm9tcHQuc2V0VGV4dCh2YWx1ZSk7aWYobm90aWZ5KQp0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7dGhpcy5fdXBkYXRlRW1wdHlTdHlsZXMoKTt9CnZhbHVlKCl7cmV0dXJuIHRoaXMuX3Byb21wdC50ZXh0V2l0aEN1cnJlbnRTdWdnZXN0aW9uKCk7fQpfb25LZXlkb3duQ2FsbGJhY2soZXZlbnQpe2lmKCFpc0VzY0tleShldmVudCl8fCF0aGlzLl9wcm9tcHQudGV4dCgpKQpyZXR1cm47dGhpcy5faW50ZXJuYWxTZXRWYWx1ZSgnJyx0cnVlKTtldmVudC5jb25zdW1lKHRydWUpO30KX29uQ2hhbmdlQ2FsbGJhY2soKXt0aGlzLl91cGRhdGVFbXB0eVN0eWxlcygpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRvb2xiYXJJbnB1dC5FdmVudC5UZXh0Q2hhbmdlZCx0aGlzLl9wcm9tcHQudGV4dCgpKTt9Cl91cGRhdGVFbXB0eVN0eWxlcygpe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd0b29sYmFyLWlucHV0LWVtcHR5JywhdGhpcy5fcHJvbXB0LnRleHQoKSk7fX07VUkuVG9vbGJhcklucHV0LkV2ZW50PXtUZXh0Q2hhbmdlZDpTeW1ib2woJ1RleHRDaGFuZ2VkJyl9O1VJLlRvb2xiYXJUb2dnbGU9Y2xhc3MgZXh0ZW5kcyBVSS5Ub29sYmFyQnV0dG9ue2NvbnN0cnVjdG9yKHRpdGxlLGdseXBoLHRvZ2dsZWRHbHlwaCl7c3VwZXIodGl0bGUsZ2x5cGgsJycpO3RoaXMuX3RvZ2dsZWQ9ZmFsc2U7dGhpcy5fdW50b2dnbGVkR2x5cGg9Z2x5cGg7dGhpcy5fdG9nZ2xlZEdseXBoPXRvZ2dsZWRHbHlwaDt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndG9vbGJhci1zdGF0ZS1vZmYnKTtVSS5BUklBVXRpbHMuc2V0UHJlc3NlZCh0aGlzLmVsZW1lbnQsZmFsc2UpO30KdG9nZ2xlZCgpe3JldHVybiB0aGlzLl90b2dnbGVkO30Kc2V0VG9nZ2xlZCh0b2dnbGVkKXtpZih0aGlzLl90b2dnbGVkPT09dG9nZ2xlZCkKcmV0dXJuO3RoaXMuX3RvZ2dsZWQ9dG9nZ2xlZDt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgndG9vbGJhci1zdGF0ZS1vbicsdG9nZ2xlZCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Rvb2xiYXItc3RhdGUtb2ZmJywhdG9nZ2xlZCk7VUkuQVJJQVV0aWxzLnNldFByZXNzZWQodGhpcy5lbGVtZW50LHRvZ2dsZWQpO2lmKHRoaXMuX3RvZ2dsZWRHbHlwaCYmdGhpcy5fdW50b2dnbGVkR2x5cGgpCnRoaXMuc2V0R2x5cGgodG9nZ2xlZD90aGlzLl90b2dnbGVkR2x5cGg6dGhpcy5fdW50b2dnbGVkR2x5cGgpO30Kc2V0RGVmYXVsdFdpdGhSZWRDb2xvcih3aXRoUmVkQ29sb3Ipe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd0b29sYmFyLWRlZmF1bHQtd2l0aC1yZWQtY29sb3InLHdpdGhSZWRDb2xvcik7fQpzZXRUb2dnbGVXaXRoUmVkQ29sb3IodG9nZ2xlV2l0aFJlZENvbG9yKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgndG9vbGJhci10b2dnbGUtd2l0aC1yZWQtY29sb3InLHRvZ2dsZVdpdGhSZWRDb2xvcik7fX07VUkuVG9vbGJhck1lbnVCdXR0b249Y2xhc3MgZXh0ZW5kcyBVSS5Ub29sYmFyQnV0dG9ue2NvbnN0cnVjdG9yKGNvbnRleHRNZW51SGFuZGxlcix1c2VTb2Z0TWVudSl7c3VwZXIoJycsJ2xhcmdlaWNvbi1tZW51Jyk7dGhpcy5fY29udGV4dE1lbnVIYW5kbGVyPWNvbnRleHRNZW51SGFuZGxlcjt0aGlzLl91c2VTb2Z0TWVudT0hIXVzZVNvZnRNZW51O30KX21vdXNlRG93bihldmVudCl7aWYoZXZlbnQuYnV0dG9ucyE9PTEpe3N1cGVyLl9tb3VzZURvd24oZXZlbnQpO3JldHVybjt9CmlmKCF0aGlzLl90cmlnZ2VyVGltZW91dCkKdGhpcy5fdHJpZ2dlclRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl90cmlnZ2VyLmJpbmQodGhpcyxldmVudCksMjAwKTt9Cl90cmlnZ2VyKGV2ZW50KXtkZWxldGUgdGhpcy5fdHJpZ2dlclRpbWVvdXQ7aWYodGhpcy5fbGFzdFRyaWdnZXJUaW1lJiZEYXRlLm5vdygpLXRoaXMuX2xhc3RUcmlnZ2VyVGltZTwzMDApCnJldHVybjtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQsdGhpcy5fdXNlU29mdE1lbnUsdGhpcy5lbGVtZW50LnRvdGFsT2Zmc2V0TGVmdCgpLHRoaXMuZWxlbWVudC50b3RhbE9mZnNldFRvcCgpK3RoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQpO3RoaXMuX2NvbnRleHRNZW51SGFuZGxlcihjb250ZXh0TWVudSk7Y29udGV4dE1lbnUuc2hvdygpO3RoaXMuX2xhc3RUcmlnZ2VyVGltZT1EYXRlLm5vdygpO30KX2NsaWNrZWQoZXZlbnQpe2lmKHRoaXMuX3RyaWdnZXJUaW1lb3V0KQpjbGVhclRpbWVvdXQodGhpcy5fdHJpZ2dlclRpbWVvdXQpO3RoaXMuX3RyaWdnZXIoZXZlbnQpO319O1VJLlRvb2xiYXJTZXR0aW5nVG9nZ2xlPWNsYXNzIGV4dGVuZHMgVUkuVG9vbGJhclRvZ2dsZXtjb25zdHJ1Y3RvcihzZXR0aW5nLGdseXBoLHRpdGxlLHRvZ2dsZWRUaXRsZSl7c3VwZXIodGl0bGUsZ2x5cGgpO3RoaXMuX2RlZmF1bHRUaXRsZT10aXRsZTt0aGlzLl90b2dnbGVkVGl0bGU9dG9nZ2xlZFRpdGxlfHx0aXRsZTt0aGlzLl9zZXR0aW5nPXNldHRpbmc7dGhpcy5fc2V0dGluZ0NoYW5nZWQoKTt0aGlzLl9zZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3NldHRpbmdDaGFuZ2VkLHRoaXMpO30KX3NldHRpbmdDaGFuZ2VkKCl7Y29uc3QgdG9nZ2xlZD10aGlzLl9zZXR0aW5nLmdldCgpO3RoaXMuc2V0VG9nZ2xlZCh0b2dnbGVkKTt0aGlzLnNldFRpdGxlKHRvZ2dsZWQ/dGhpcy5fdG9nZ2xlZFRpdGxlOnRoaXMuX2RlZmF1bHRUaXRsZSk7fQpfY2xpY2tlZChldmVudCl7dGhpcy5fc2V0dGluZy5zZXQoIXRoaXMudG9nZ2xlZCgpKTtzdXBlci5fY2xpY2tlZChldmVudCk7fX07VUkuVG9vbGJhclNlcGFyYXRvcj1jbGFzcyBleHRlbmRzIFVJLlRvb2xiYXJJdGVte2NvbnN0cnVjdG9yKHNwYWNlcil7c3VwZXIoY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JyxzcGFjZXI/J3Rvb2xiYXItc3BhY2VyJzondG9vbGJhci1kaXZpZGVyJykpO319O1VJLlRvb2xiYXJJdGVtLlByb3ZpZGVyPWZ1bmN0aW9uKCl7fTtVSS5Ub29sYmFySXRlbS5Qcm92aWRlci5wcm90b3R5cGU9e2l0ZW0oKXt9fTtVSS5Ub29sYmFySXRlbS5JdGVtc1Byb3ZpZGVyPWZ1bmN0aW9uKCl7fTtVSS5Ub29sYmFySXRlbS5JdGVtc1Byb3ZpZGVyLnByb3RvdHlwZT17dG9vbGJhckl0ZW1zKCl7fX07VUkuVG9vbGJhckNvbWJvQm94PWNsYXNzIGV4dGVuZHMgVUkuVG9vbGJhckl0ZW17Y29uc3RydWN0b3IoY2hhbmdlSGFuZGxlcixjbGFzc05hbWUpe3N1cGVyKGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCd0b29sYmFyLXNlbGVjdC1jb250YWluZXInKSk7dGhpcy5fc2VsZWN0RWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NlbGVjdCcsJ3Rvb2xiYXItaXRlbScpO2NvbnN0IGRyb3Bkb3duQXJyb3dJY29uPVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdHJpYW5nbGUtZG93bicsJ3Rvb2xiYXItZHJvcGRvd24tYXJyb3cnKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25BcnJvd0ljb24pO2lmKGNoYW5nZUhhbmRsZXIpCnRoaXMuX3NlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxjaGFuZ2VIYW5kbGVyLGZhbHNlKTtpZihjbGFzc05hbWUpCnRoaXMuX3NlbGVjdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO30Kc2V0VGl0bGUodGl0bGUpe1VJLkFSSUFVdGlscy5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLl9zZWxlY3RFbGVtZW50LHRpdGxlKTtzdXBlci5zZXRUaXRsZSh0aXRsZSk7fQpzZWxlY3RFbGVtZW50KCl7cmV0dXJuKHRoaXMuX3NlbGVjdEVsZW1lbnQpO30Kc2l6ZSgpe3JldHVybiB0aGlzLl9zZWxlY3RFbGVtZW50LmNoaWxkRWxlbWVudENvdW50O30Kb3B0aW9ucygpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9zZWxlY3RFbGVtZW50LmNoaWxkcmVuLDApO30KYWRkT3B0aW9uKG9wdGlvbil7dGhpcy5fc2VsZWN0RWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb24pO30KY3JlYXRlT3B0aW9uKGxhYmVsLHRpdGxlLHZhbHVlKXtjb25zdCBvcHRpb249dGhpcy5fc2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0aW9uJyk7b3B0aW9uLnRleHQ9bGFiZWw7aWYodGl0bGUpCm9wdGlvbi50aXRsZT10aXRsZTtpZih0eXBlb2YgdmFsdWUhPT0ndW5kZWZpbmVkJykKb3B0aW9uLnZhbHVlPXZhbHVlO3JldHVybiBvcHRpb247fQpfYXBwbHlFbmFibGVkU3RhdGUoZW5hYmxlZCl7c3VwZXIuX2FwcGx5RW5hYmxlZFN0YXRlKGVuYWJsZWQpO3RoaXMuX3NlbGVjdEVsZW1lbnQuZGlzYWJsZWQ9IWVuYWJsZWQ7fQpyZW1vdmVPcHRpb24ob3B0aW9uKXt0aGlzLl9zZWxlY3RFbGVtZW50LnJlbW92ZUNoaWxkKG9wdGlvbik7fQpyZW1vdmVPcHRpb25zKCl7dGhpcy5fc2VsZWN0RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO30Kc2VsZWN0ZWRPcHRpb24oKXtpZih0aGlzLl9zZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg+PTApCnJldHVybiB0aGlzLl9zZWxlY3RFbGVtZW50W3RoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleF07cmV0dXJuIG51bGw7fQpzZWxlY3Qob3B0aW9uKXt0aGlzLl9zZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCgodGhpcy5fc2VsZWN0RWxlbWVudCksb3B0aW9uKTt9CnNldFNlbGVjdGVkSW5kZXgoaW5kZXgpe3RoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleD1pbmRleDt9CnNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4O30Kc2V0TWF4V2lkdGgod2lkdGgpe3RoaXMuX3NlbGVjdEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9d2lkdGgrJ3B4Jzt9CnNldE1pbldpZHRoKHdpZHRoKXt0aGlzLl9zZWxlY3RFbGVtZW50LnN0eWxlLm1pbldpZHRoPXdpZHRoKydweCc7fX07VUkuVG9vbGJhclNldHRpbmdDb21ib0JveD1jbGFzcyBleHRlbmRzIFVJLlRvb2xiYXJDb21ib0JveHtjb25zdHJ1Y3RvcihvcHRpb25zLHNldHRpbmcsb3B0R3JvdXApe3N1cGVyKG51bGwpO3RoaXMuX3NldHRpbmc9c2V0dGluZzt0aGlzLl9vcHRpb25zPW9wdGlvbnM7dGhpcy5fc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHRoaXMuX3ZhbHVlQ2hhbmdlZC5iaW5kKHRoaXMpLGZhbHNlKTtpZihvcHRHcm91cCl7Y29uc3Qgb3B0R3JvdXBFbGVtZW50PXRoaXMuX3NlbGVjdEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ29wdGdyb3VwJyk7b3B0R3JvdXBFbGVtZW50LmxhYmVsPW9wdEdyb3VwO3RoaXMuX29wdGlvbkNvbnRhaW5lcj1vcHRHcm91cEVsZW1lbnQ7fWVsc2V7dGhpcy5fb3B0aW9uQ29udGFpbmVyPXRoaXMuX3NlbGVjdEVsZW1lbnQ7fQp0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7c2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9zZXR0aW5nQ2hhbmdlZCx0aGlzKTt9CnNldE9wdGlvbnMob3B0aW9ucyl7dGhpcy5fb3B0aW9ucz1vcHRpb25zO3RoaXMuX29wdGlvbkNvbnRhaW5lci5yZW1vdmVDaGlsZHJlbigpO2ZvcihsZXQgaT0wO2k8b3B0aW9ucy5sZW5ndGg7KytpKXtjb25zdCBkYXRhT3B0aW9uPW9wdGlvbnNbaV07Y29uc3Qgb3B0aW9uPXRoaXMuY3JlYXRlT3B0aW9uKGRhdGFPcHRpb24ubGFiZWwsZGF0YU9wdGlvbi50aXRsZSxkYXRhT3B0aW9uLnZhbHVlKTt0aGlzLl9vcHRpb25Db250YWluZXIuYXBwZW5kQ2hpbGQob3B0aW9uKTtpZih0aGlzLl9zZXR0aW5nLmdldCgpPT09ZGF0YU9wdGlvbi52YWx1ZSkKdGhpcy5zZXRTZWxlY3RlZEluZGV4KGkpO319CnZhbHVlKCl7cmV0dXJuIHRoaXMuX29wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4KCldLnZhbHVlO30KX3NldHRpbmdDaGFuZ2VkKCl7aWYodGhpcy5fbXV0ZVNldHRpbmdMaXN0ZW5lcikKcmV0dXJuO2NvbnN0IHZhbHVlPXRoaXMuX3NldHRpbmcuZ2V0KCk7Zm9yKGxldCBpPTA7aTx0aGlzLl9vcHRpb25zLmxlbmd0aDsrK2kpe2lmKHZhbHVlPT09dGhpcy5fb3B0aW9uc1tpXS52YWx1ZSl7dGhpcy5zZXRTZWxlY3RlZEluZGV4KGkpO2JyZWFrO319fQpfdmFsdWVDaGFuZ2VkKGV2ZW50KXtjb25zdCBvcHRpb249dGhpcy5fb3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXgoKV07dGhpcy5fbXV0ZVNldHRpbmdMaXN0ZW5lcj10cnVlO3RoaXMuX3NldHRpbmcuc2V0KG9wdGlvbi52YWx1ZSk7dGhpcy5fbXV0ZVNldHRpbmdMaXN0ZW5lcj1mYWxzZTt9fTtVSS5Ub29sYmFyQ2hlY2tib3g9Y2xhc3MgZXh0ZW5kcyBVSS5Ub29sYmFySXRlbXtjb25zdHJ1Y3Rvcih0ZXh0LHRvb2x0aXAsbGlzdGVuZXIpe3N1cGVyKFVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKHRleHQpKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTt0aGlzLmlucHV0RWxlbWVudD10aGlzLmVsZW1lbnQuY2hlY2tib3hFbGVtZW50O2lmKHRvb2x0aXApCnRoaXMuZWxlbWVudC50aXRsZT10b29sdGlwO2lmKGxpc3RlbmVyKQp0aGlzLmlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsbGlzdGVuZXIsZmFsc2UpO30KY2hlY2tlZCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC5jaGVja2VkO30Kc2V0Q2hlY2tlZCh2YWx1ZSl7dGhpcy5pbnB1dEVsZW1lbnQuY2hlY2tlZD12YWx1ZTt9Cl9hcHBseUVuYWJsZWRTdGF0ZShlbmFibGVkKXtzdXBlci5fYXBwbHlFbmFibGVkU3RhdGUoZW5hYmxlZCk7dGhpcy5pbnB1dEVsZW1lbnQuZGlzYWJsZWQ9IWVuYWJsZWQ7fX07VUkuVG9vbGJhclNldHRpbmdDaGVja2JveD1jbGFzcyBleHRlbmRzIFVJLlRvb2xiYXJDaGVja2JveHtjb25zdHJ1Y3RvcihzZXR0aW5nLHRvb2x0aXAsYWx0ZXJuYXRlVGl0bGUpe3N1cGVyKGFsdGVybmF0ZVRpdGxlfHxzZXR0aW5nLnRpdGxlKCl8fCcnLHRvb2x0aXApO1VJLlNldHRpbmdzVUkuYmluZENoZWNrYm94KHRoaXMuaW5wdXRFbGVtZW50LHNldHRpbmcpO319OztVSS5Ub29sdGlwPWNsYXNze2NvbnN0cnVjdG9yKGRvYyl7dGhpcy5lbGVtZW50PWRvYy5ib2R5LmNyZWF0ZUNoaWxkKCdkaXYnKTt0aGlzLl9zaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLmVsZW1lbnQsJ3VpL3Rvb2x0aXAuY3NzJyk7dGhpcy5fdG9vbHRpcEVsZW1lbnQ9dGhpcy5fc2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2JywndG9vbHRpcCcpO2RvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX21vdXNlTW92ZS5iaW5kKHRoaXMpLHRydWUpO2RvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX2hpZGUuYmluZCh0aGlzLHRydWUpLHRydWUpO2RvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9oaWRlLmJpbmQodGhpcyxmYWxzZSksdHJ1ZSk7ZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2hpZGUuYmluZCh0aGlzLHRydWUpLHRydWUpO1VJLnpvb21NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoVUkuWm9vbU1hbmFnZXIuRXZlbnRzLlpvb21DaGFuZ2VkLHRoaXMuX3Jlc2V0LHRoaXMpO2RvYy5kZWZhdWx0Vmlldy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHRoaXMuX3Jlc2V0LmJpbmQodGhpcyksZmFsc2UpO30Kc3RhdGljIGluc3RhbGxIYW5kbGVyKGRvYyl7bmV3IFVJLlRvb2x0aXAoZG9jKTt9CnN0YXRpYyBpbnN0YWxsKGVsZW1lbnQsdG9vbHRpcENvbnRlbnQsYWN0aW9uSWQsb3B0aW9ucyl7aWYoIXRvb2x0aXBDb250ZW50KXtkZWxldGUgZWxlbWVudFtVSS5Ub29sdGlwLl9zeW1ib2xdO3JldHVybjt9CmVsZW1lbnRbVUkuVG9vbHRpcC5fc3ltYm9sXT17Y29udGVudDp0b29sdGlwQ29udGVudCxhY3Rpb25JZDphY3Rpb25JZCxvcHRpb25zOm9wdGlvbnN8fHt9fTt9CnN0YXRpYyBhZGROYXRpdmVPdmVycmlkZUNvbnRhaW5lcihlbGVtZW50KXtVSS5Ub29sdGlwLl9uYXRpdmVPdmVycmlkZUNvbnRhaW5lci5wdXNoKGVsZW1lbnQpO30KX21vdXNlTW92ZShldmVudCl7Y29uc3QgbW91c2VFdmVudD0oZXZlbnQpO2NvbnN0IHBhdGg9bW91c2VFdmVudC5wYXRoO2lmKCFwYXRofHxtb3VzZUV2ZW50LmJ1dHRvbnMhPT0wfHwobW91c2VFdmVudC5tb3ZlbWVudFg9PT0wJiZtb3VzZUV2ZW50Lm1vdmVtZW50WT09PTApKQpyZXR1cm47aWYodGhpcy5fYW5jaG9yRWxlbWVudCYmcGF0aC5pbmRleE9mKHRoaXMuX2FuY2hvckVsZW1lbnQpPT09LTEpCnRoaXMuX2hpZGUoZmFsc2UpO2Zvcihjb25zdCBlbGVtZW50IG9mIHBhdGgpe2lmKGVsZW1lbnQ9PT10aGlzLl9hbmNob3JFbGVtZW50fHwoZWxlbWVudC5ub2RlTmFtZSE9PSdDT05URU5UJyYmZWxlbWVudC5vZmZzZXRQYXJlbnQ9PT1udWxsKSl7cmV0dXJuO31lbHNlIGlmKGVsZW1lbnRbVUkuVG9vbHRpcC5fc3ltYm9sXSl7dGhpcy5fc2hvdyhlbGVtZW50LG1vdXNlRXZlbnQpO3JldHVybjt9fX0KX3Nob3coYW5jaG9yRWxlbWVudCxldmVudCl7Y29uc3QgdG9vbHRpcD1hbmNob3JFbGVtZW50W1VJLlRvb2x0aXAuX3N5bWJvbF07dGhpcy5fYW5jaG9yRWxlbWVudD1hbmNob3JFbGVtZW50O3RoaXMuX3Rvb2x0aXBFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGNvbnN0IGVsZW1lbnQgb2YgVUkuVG9vbHRpcC5fbmF0aXZlT3ZlcnJpZGVDb250YWluZXIpe2lmKHRoaXMuX2FuY2hvckVsZW1lbnQuaXNTZWxmT3JEZXNjZW5kYW50KGVsZW1lbnQpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5fYW5jaG9yRWxlbWVudCwndGl0bGUnLFVJLlRvb2x0aXAuX25hdGl2ZVRpdGxlKTt0aGlzLl9hbmNob3JFbGVtZW50LnRpdGxlPXRvb2x0aXAuY29udGVudDtyZXR1cm47fX0KaWYodHlwZW9mIHRvb2x0aXAuY29udGVudD09PSdzdHJpbmcnKQp0aGlzLl90b29sdGlwRWxlbWVudC5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKHRvb2x0aXAuY29udGVudCk7ZWxzZQp0aGlzLl90b29sdGlwRWxlbWVudC5hcHBlbmRDaGlsZCh0b29sdGlwLmNvbnRlbnQpO2lmKHRvb2x0aXAuYWN0aW9uSWQpe2NvbnN0IHNob3J0Y3V0cz1VSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24odG9vbHRpcC5hY3Rpb25JZCk7Zm9yKGNvbnN0IHNob3J0Y3V0IG9mIHNob3J0Y3V0cyl7Y29uc3Qgc2hvcnRjdXRFbGVtZW50PXRoaXMuX3Rvb2x0aXBFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0b29sdGlwLXNob3J0Y3V0Jyk7c2hvcnRjdXRFbGVtZW50LnRleHRDb250ZW50PXNob3J0Y3V0Lm5hbWU7fX0KdGhpcy5fdG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2hvd24nKTt0aGlzLl90b29sdGlwRWxlbWVudC5wb3NpdGlvbkF0KDAsMCk7Y29uc3Qgbm93PURhdGUubm93KCk7Y29uc3QgaW5zdGFudD0odGhpcy5fdG9vbHRpcExhc3RDbG9zZWQmJm5vdy10aGlzLl90b29sdGlwTGFzdENsb3NlZDxVSS5Ub29sdGlwLlRpbWluZy5JbnN0YW50VGhyZXNob2xkKTt0aGlzLl90b29sdGlwRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdpbnN0YW50JyxpbnN0YW50KTt0aGlzLl90b29sdGlwTGFzdE9wZW5lZD1pbnN0YW50P25vdzpub3crVUkuVG9vbHRpcC5UaW1pbmcuT3BlbmluZ0RlbGF5O2NvbnN0IGNvbnRhaW5lcj1VSS5HbGFzc1BhbmUuY29udGFpbmVyKChhbmNob3JFbGVtZW50Lm93bmVyRG9jdW1lbnQpKTtjb25zdCBjb250YWluZXJCb3g9Y29udGFpbmVyLmJveEluV2luZG93KHRoaXMuZWxlbWVudC53aW5kb3coKSk7Y29uc3QgYW5jaG9yQm94PXRoaXMuX2FuY2hvckVsZW1lbnQuYm94SW5XaW5kb3codGhpcy5lbGVtZW50LndpbmRvdygpKTtjb25zdCBhbmNob3JPZmZzZXQ9Mjtjb25zdCBwYWdlTWFyZ2luPTI7Y29uc3QgY3Vyc29yT2Zmc2V0PTEwO3RoaXMuX3Rvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Rvb2x0aXAtYnJlYWt3b3JkJywhdGhpcy5fdG9vbHRpcEVsZW1lbnQudGV4dENvbnRlbnQubWF0Y2goJ1xccycpKTt0aGlzLl90b29sdGlwRWxlbWVudC5zdHlsZS5tYXhXaWR0aD0oY29udGFpbmVyQm94LndpZHRoLXBhZ2VNYXJnaW4qMikrJ3B4Jzt0aGlzLl90b29sdGlwRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQ9Jyc7Y29uc3QgdG9vbHRpcFdpZHRoPXRoaXMuX3Rvb2x0aXBFbGVtZW50Lm9mZnNldFdpZHRoO2NvbnN0IHRvb2x0aXBIZWlnaHQ9dGhpcy5fdG9vbHRpcEVsZW1lbnQub2Zmc2V0SGVpZ2h0O2NvbnN0IGFuY2hvclRvb2x0aXBBdEVsZW1lbnQ9dGhpcy5fYW5jaG9yRWxlbWVudC5ub2RlTmFtZT09PSdCVVRUT04nfHx0aGlzLl9hbmNob3JFbGVtZW50Lm5vZGVOYW1lPT09J0xBQkVMJztsZXQgdG9vbHRpcFg9YW5jaG9yVG9vbHRpcEF0RWxlbWVudD9hbmNob3JCb3gueDpldmVudC54K2N1cnNvck9mZnNldDt0b29sdGlwWD1OdW1iZXIuY29uc3RyYWluKHRvb2x0aXBYLGNvbnRhaW5lckJveC54K3BhZ2VNYXJnaW4sY29udGFpbmVyQm94LngrY29udGFpbmVyQm94LndpZHRoLXRvb2x0aXBXaWR0aC1wYWdlTWFyZ2luKTtsZXQgdG9vbHRpcFk7aWYoIWFuY2hvclRvb2x0aXBBdEVsZW1lbnQpe3Rvb2x0aXBZPWV2ZW50LnkrY3Vyc29yT2Zmc2V0K3Rvb2x0aXBIZWlnaHQ8Y29udGFpbmVyQm94LnkrY29udGFpbmVyQm94LmhlaWdodD9ldmVudC55K2N1cnNvck9mZnNldDpldmVudC55LXRvb2x0aXBIZWlnaHQtMTt9ZWxzZXtjb25zdCBvbkJvdHRvbT1hbmNob3JCb3gueSthbmNob3JPZmZzZXQrYW5jaG9yQm94LmhlaWdodCt0b29sdGlwSGVpZ2h0PGNvbnRhaW5lckJveC55K2NvbnRhaW5lckJveC5oZWlnaHQ7dG9vbHRpcFk9b25Cb3R0b20/YW5jaG9yQm94LnkrYW5jaG9yQm94LmhlaWdodCthbmNob3JPZmZzZXQ6YW5jaG9yQm94LnktdG9vbHRpcEhlaWdodC1hbmNob3JPZmZzZXQ7fQp0aGlzLl90b29sdGlwRWxlbWVudC5wb3NpdGlvbkF0KHRvb2x0aXBYLHRvb2x0aXBZKTt9Cl9oaWRlKHJlbW92ZUluc3RhbnQpe2RlbGV0ZSB0aGlzLl9hbmNob3JFbGVtZW50O3RoaXMuX3Rvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3duJyk7aWYoRGF0ZS5ub3coKT50aGlzLl90b29sdGlwTGFzdE9wZW5lZCkKdGhpcy5fdG9vbHRpcExhc3RDbG9zZWQ9RGF0ZS5ub3coKTtpZihyZW1vdmVJbnN0YW50KQpkZWxldGUgdGhpcy5fdG9vbHRpcExhc3RDbG9zZWQ7fQpfcmVzZXQoKXt0aGlzLl9oaWRlKHRydWUpO3RoaXMuX3Rvb2x0aXBFbGVtZW50LnBvc2l0aW9uQXQoMCwwKTt0aGlzLl90b29sdGlwRWxlbWVudC5zdHlsZS5tYXhXaWR0aD0nMCc7dGhpcy5fdG9vbHRpcEVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0PScwJzt9fTtVSS5Ub29sdGlwLlRpbWluZz17J0luc3RhbnRUaHJlc2hvbGQnOjMwMCwnT3BlbmluZ0RlbGF5Jzo2MDB9O1VJLlRvb2x0aXAuX3N5bWJvbD1TeW1ib2woJ1Rvb2x0aXAnKTtVSS5Ub29sdGlwLl9uYXRpdmVPdmVycmlkZUNvbnRhaW5lcj1bXTtVSS5Ub29sdGlwLl9uYXRpdmVUaXRsZT0oT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsJ3RpdGxlJykpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsJ3RpdGxlJyx7Z2V0OmZ1bmN0aW9uKCl7Y29uc3QgdG9vbHRpcD10aGlzW1VJLlRvb2x0aXAuX3N5bWJvbF07cmV0dXJuIHRvb2x0aXA/dG9vbHRpcC5jb250ZW50OicnO30sc2V0OmZ1bmN0aW9uKHgpe1VJLlRvb2x0aXAuaW5zdGFsbCh0aGlzLHgpO319KTs7VUkuU3VnZ2VzdEJveERlbGVnYXRlPWZ1bmN0aW9uKCl7fTtVSS5TdWdnZXN0Qm94RGVsZWdhdGUucHJvdG90eXBlPXthcHBseVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbixpc0ludGVybWVkaWF0ZVN1Z2dlc3Rpb24pe30sYWNjZXB0U3VnZ2VzdGlvbigpe30sfTtVSS5TdWdnZXN0Qm94PWNsYXNze2NvbnN0cnVjdG9yKHN1Z2dlc3RCb3hEZWxlZ2F0ZSxtYXhJdGVtc0hlaWdodCl7dGhpcy5fc3VnZ2VzdEJveERlbGVnYXRlPXN1Z2dlc3RCb3hEZWxlZ2F0ZTt0aGlzLl9tYXhJdGVtc0hlaWdodD1tYXhJdGVtc0hlaWdodDt0aGlzLl9yb3dIZWlnaHQ9MTc7dGhpcy5fdXNlckVudGVyZWRUZXh0PScnO3RoaXMuX2RlZmF1bHRTZWxlY3Rpb25Jc0RpbW1lZD1mYWxzZTt0aGlzLl9vbmx5Q29tcGxldGlvbj1udWxsO3RoaXMuX2l0ZW1zPW5ldyBVSS5MaXN0TW9kZWwoKTt0aGlzLl9saXN0PW5ldyBVSS5MaXN0Q29udHJvbCh0aGlzLl9pdGVtcyx0aGlzLFVJLkxpc3RNb2RlLkVxdWFsSGVpZ2h0SXRlbXMpO3RoaXMuX2VsZW1lbnQ9dGhpcy5fbGlzdC5lbGVtZW50O3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3VnZ2VzdC1ib3gnKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LnByZXZlbnREZWZhdWx0KCksdHJ1ZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25DbGljay5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9nbGFzc1BhbmU9bmV3IFVJLkdsYXNzUGFuZSgpO3RoaXMuX2dsYXNzUGFuZS5zZXRBbmNob3JCZWhhdmlvcihVSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyQm90dG9tKTt0aGlzLl9nbGFzc1BhbmUuc2V0T3V0c2lkZUNsaWNrQ2FsbGJhY2sodGhpcy5oaWRlLmJpbmQodGhpcykpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuX2dsYXNzUGFuZS5jb250ZW50RWxlbWVudCwndWkvc3VnZ2VzdEJveC5jc3MnKTtzaGFkb3dSb290LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO30KdmlzaWJsZSgpe3JldHVybiB0aGlzLl9nbGFzc1BhbmUuaXNTaG93aW5nKCk7fQpzZXRQb3NpdGlvbihhbmNob3JCb3gpe3RoaXMuX2dsYXNzUGFuZS5zZXRDb250ZW50QW5jaG9yQm94KGFuY2hvckJveCk7fQpzZXRBbmNob3JCZWhhdmlvcihiZWhhdmlvcil7dGhpcy5fZ2xhc3NQYW5lLnNldEFuY2hvckJlaGF2aW9yKGJlaGF2aW9yKTt9Cl91cGRhdGVNYXhTaXplKGl0ZW1zKXtjb25zdCBtYXhXaWR0aD10aGlzLl9tYXhXaWR0aChpdGVtcyk7Y29uc3QgbGVuZ3RoPXRoaXMuX21heEl0ZW1zSGVpZ2h0P01hdGgubWluKHRoaXMuX21heEl0ZW1zSGVpZ2h0LGl0ZW1zLmxlbmd0aCk6aXRlbXMubGVuZ3RoO2NvbnN0IG1heEhlaWdodD1sZW5ndGgqdGhpcy5fcm93SGVpZ2h0O3RoaXMuX2dsYXNzUGFuZS5zZXRNYXhDb250ZW50U2l6ZShuZXcgVUkuU2l6ZShtYXhXaWR0aCxtYXhIZWlnaHQpKTt9Cl9tYXhXaWR0aChpdGVtcyl7Y29uc3Qga01heFdpZHRoPTMwMDtpZighaXRlbXMubGVuZ3RoKQpyZXR1cm4ga01heFdpZHRoO2xldCBtYXhJdGVtO2xldCBtYXhMZW5ndGg9LUluZmluaXR5O2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoO2krKyl7Y29uc3QgbGVuZ3RoPShpdGVtc1tpXS50aXRsZXx8aXRlbXNbaV0udGV4dCkubGVuZ3RoKyhpdGVtc1tpXS5zdWJ0aXRsZXx8JycpLmxlbmd0aDtpZihsZW5ndGg+bWF4TGVuZ3RoKXttYXhMZW5ndGg9bGVuZ3RoO21heEl0ZW09aXRlbXNbaV07fX0KY29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnRGb3JJdGVtKChtYXhJdGVtKSk7Y29uc3QgcHJlZmVycmVkV2lkdGg9VUkubWVhc3VyZVByZWZlcnJlZFNpemUoZWxlbWVudCx0aGlzLl9lbGVtZW50KS53aWR0aCtVSS5tZWFzdXJlZFNjcm9sbGJhcldpZHRoKHRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudCk7cmV0dXJuIE1hdGgubWluKGtNYXhXaWR0aCxwcmVmZXJyZWRXaWR0aCk7fQpfc2hvdygpe2lmKHRoaXMudmlzaWJsZSgpKQpyZXR1cm47dGhpcy5fZ2xhc3NQYW5lLnNob3coZG9jdW1lbnQpO3RoaXMuX3Jvd0hlaWdodD1VSS5tZWFzdXJlUHJlZmVycmVkU2l6ZSh0aGlzLmNyZWF0ZUVsZW1lbnRGb3JJdGVtKHt0ZXh0OicxJyxzdWJ0aXRsZTonMTInfSksdGhpcy5fZWxlbWVudCkuaGVpZ2h0O30KaGlkZSgpe2lmKCF0aGlzLnZpc2libGUoKSkKcmV0dXJuO3RoaXMuX2dsYXNzUGFuZS5oaWRlKCk7fQpfYXBwbHlTdWdnZXN0aW9uKGlzSW50ZXJtZWRpYXRlU3VnZ2VzdGlvbil7aWYodGhpcy5fb25seUNvbXBsZXRpb24pe1VJLkFSSUFVdGlscy5hbGVydChsc2Ake3RoaXMuX29ubHlDb21wbGV0aW9ufSwgc3VnZ2VzdGlvbmAsdGhpcy5fZWxlbWVudCk7dGhpcy5fc3VnZ2VzdEJveERlbGVnYXRlLmFwcGx5U3VnZ2VzdGlvbih0aGlzLl9vbmx5Q29tcGxldGlvbixpc0ludGVybWVkaWF0ZVN1Z2dlc3Rpb24pO3JldHVybiB0cnVlO30KY29uc3Qgc3VnZ2VzdGlvbj10aGlzLl9saXN0LnNlbGVjdGVkSXRlbSgpP3RoaXMuX2xpc3Quc2VsZWN0ZWRJdGVtKCkudGV4dDonJztpZihzdWdnZXN0aW9uKQpVSS5BUklBVXRpbHMuYWxlcnQobHNgJHtzdWdnZXN0aW9ufSwgc3VnZ2VzdGlvbmAsdGhpcy5fZWxlbWVudCk7dGhpcy5fc3VnZ2VzdEJveERlbGVnYXRlLmFwcGx5U3VnZ2VzdGlvbihzdWdnZXN0aW9uLGlzSW50ZXJtZWRpYXRlU3VnZ2VzdGlvbik7cmV0dXJuIHRoaXMudmlzaWJsZSgpJiYhIXN1Z2dlc3Rpb247fQphY2NlcHRTdWdnZXN0aW9uKCl7Y29uc3QgcmVzdWx0PXRoaXMuX2FwcGx5U3VnZ2VzdGlvbigpO3RoaXMuaGlkZSgpO2lmKCFyZXN1bHQpCnJldHVybiBmYWxzZTt0aGlzLl9zdWdnZXN0Qm94RGVsZWdhdGUuYWNjZXB0U3VnZ2VzdGlvbigpO3JldHVybiB0cnVlO30KY3JlYXRlRWxlbWVudEZvckl0ZW0oaXRlbSl7Y29uc3QgcXVlcnk9dGhpcy5fdXNlckVudGVyZWRUZXh0O2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnc3VnZ2VzdC1ib3gtY29udGVudC1pdGVtIHNvdXJjZS1jb2RlJyk7aWYoaXRlbS5pY29uVHlwZSl7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZShpdGVtLmljb25UeXBlLCdzdWdnZXN0aW9uLWljb24nKTtlbGVtZW50LmFwcGVuZENoaWxkKGljb24pO30KaWYoaXRlbS5pc1NlY29uZGFyeSkKZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWNvbmRhcnknKTtlbGVtZW50LnRhYkluZGV4PS0xO2NvbnN0IG1heFRleHRMZW5ndGg9NTArcXVlcnkubGVuZ3RoO2NvbnN0IGRpc3BsYXlUZXh0PShpdGVtLnRpdGxlfHxpdGVtLnRleHQpLnRyaW0oKS50cmltRW5kKG1heFRleHRMZW5ndGgpLnJlcGxhY2UoL1xuL2csJ1x1MjFCNScpO2NvbnN0IHRpdGxlRWxlbWVudD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc3VnZ2VzdGlvbi10aXRsZScpO2NvbnN0IGluZGV4PWRpc3BsYXlUZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihxdWVyeS50b0xvd2VyQ2FzZSgpKTtpZihpbmRleD4wKQp0aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1kaXNwbGF5VGV4dC5zdWJzdHJpbmcoMCxpbmRleCk7aWYoaW5kZXg+LTEpCnRpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3F1ZXJ5JykudGV4dENvbnRlbnQ9ZGlzcGxheVRleHQuc3Vic3RyaW5nKGluZGV4LGluZGV4K3F1ZXJ5Lmxlbmd0aCk7dGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9ZGlzcGxheVRleHQuc3Vic3RyaW5nKGluZGV4Pi0xP2luZGV4K3F1ZXJ5Lmxlbmd0aDowKTt0aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdzcGFjZXInKTtpZihpdGVtLnN1YnRpdGxlUmVuZGVyZXIpe2NvbnN0IHN1YnRpdGxlRWxlbWVudD1pdGVtLnN1YnRpdGxlUmVuZGVyZXIuY2FsbChudWxsKTtzdWJ0aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3VnZ2VzdGlvbi1zdWJ0aXRsZScpO2VsZW1lbnQuYXBwZW5kQ2hpbGQoc3VidGl0bGVFbGVtZW50KTt9ZWxzZSBpZihpdGVtLnN1YnRpdGxlKXtjb25zdCBzdWJ0aXRsZUVsZW1lbnQ9ZWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N1Z2dlc3Rpb24tc3VidGl0bGUnKTtzdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9aXRlbS5zdWJ0aXRsZS50cmltRW5kKG1heFRleHRMZW5ndGgtZGlzcGxheVRleHQubGVuZ3RoKTt9CnJldHVybiBlbGVtZW50O30KaGVpZ2h0Rm9ySXRlbShpdGVtKXtyZXR1cm4gdGhpcy5fcm93SGVpZ2h0O30KaXNJdGVtU2VsZWN0YWJsZShpdGVtKXtyZXR1cm4gdHJ1ZTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcsJ2ZvcmNlLXdoaXRlLWljb25zJyk7aWYodG9FbGVtZW50KXt0b0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTt0b0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9yY2Utd2hpdGUtaWNvbnMnKTt9CnRoaXMuX2FwcGx5U3VnZ2VzdGlvbih0cnVlKTt9Cl9vbkNsaWNrKGV2ZW50KXtjb25zdCBpdGVtPXRoaXMuX2xpc3QuaXRlbUZvck5vZGUoKGV2ZW50LnRhcmdldCkpO2lmKCFpdGVtKQpyZXR1cm47dGhpcy5fbGlzdC5zZWxlY3RJdGVtKGl0ZW0pO3RoaXMuYWNjZXB0U3VnZ2VzdGlvbigpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfY2FuU2hvd0JveChjb21wbGV0aW9ucyxoaWdoZXN0UHJpb3JpdHlJdGVtLGNhblNob3dGb3JTaW5nbGVJdGVtLHVzZXJFbnRlcmVkVGV4dCl7aWYoIWNvbXBsZXRpb25zfHwhY29tcGxldGlvbnMubGVuZ3RoKQpyZXR1cm4gZmFsc2U7aWYoY29tcGxldGlvbnMubGVuZ3RoPjEpCnJldHVybiB0cnVlO2lmKCFoaWdoZXN0UHJpb3JpdHlJdGVtfHxoaWdoZXN0UHJpb3JpdHlJdGVtLmlzU2Vjb25kYXJ5fHwhaGlnaGVzdFByaW9yaXR5SXRlbS50ZXh0LnN0YXJ0c1dpdGgodXNlckVudGVyZWRUZXh0KSkKcmV0dXJuIHRydWU7cmV0dXJuIGNhblNob3dGb3JTaW5nbGVJdGVtJiZoaWdoZXN0UHJpb3JpdHlJdGVtLnRleHQhPT11c2VyRW50ZXJlZFRleHQ7fQp1cGRhdGVTdWdnZXN0aW9ucyhhbmNob3JCb3gsY29tcGxldGlvbnMsc2VsZWN0SGlnaGVzdFByaW9yaXR5LGNhblNob3dGb3JTaW5nbGVJdGVtLHVzZXJFbnRlcmVkVGV4dCl7dGhpcy5fb25seUNvbXBsZXRpb249bnVsbDtjb25zdCBoaWdoZXN0UHJpb3JpdHlJdGVtPXNlbGVjdEhpZ2hlc3RQcmlvcml0eT9jb21wbGV0aW9ucy5yZWR1Y2UoKGEsYik9PihhLnByaW9yaXR5fHwwKT49KGIucHJpb3JpdHl8fDApP2E6Yik6bnVsbDtpZih0aGlzLl9jYW5TaG93Qm94KGNvbXBsZXRpb25zLGhpZ2hlc3RQcmlvcml0eUl0ZW0sY2FuU2hvd0ZvclNpbmdsZUl0ZW0sdXNlckVudGVyZWRUZXh0KSl7dGhpcy5fdXNlckVudGVyZWRUZXh0PXVzZXJFbnRlcmVkVGV4dDt0aGlzLl9zaG93KCk7dGhpcy5fdXBkYXRlTWF4U2l6ZShjb21wbGV0aW9ucyk7dGhpcy5fZ2xhc3NQYW5lLnNldENvbnRlbnRBbmNob3JCb3goYW5jaG9yQm94KTt0aGlzLl9saXN0LmludmFsaWRhdGVJdGVtSGVpZ2h0KCk7dGhpcy5faXRlbXMucmVwbGFjZUFsbChjb21wbGV0aW9ucyk7aWYoaGlnaGVzdFByaW9yaXR5SXRlbSYmIWhpZ2hlc3RQcmlvcml0eUl0ZW0uaXNTZWNvbmRhcnkpCnRoaXMuX2xpc3Quc2VsZWN0SXRlbShoaWdoZXN0UHJpb3JpdHlJdGVtLHRydWUpO2Vsc2UKdGhpcy5fbGlzdC5zZWxlY3RJdGVtKG51bGwpO31lbHNle2lmKGNvbXBsZXRpb25zLmxlbmd0aD09PTEpe3RoaXMuX29ubHlDb21wbGV0aW9uPWNvbXBsZXRpb25zWzBdLnRleHQ7dGhpcy5fYXBwbHlTdWdnZXN0aW9uKHRydWUpO30KdGhpcy5oaWRlKCk7fX0Ka2V5UHJlc3NlZChldmVudCl7c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdFbnRlcic6cmV0dXJuIHRoaXMuZW50ZXJLZXlQcmVzc2VkKCk7Y2FzZSdBcnJvd1VwJzpyZXR1cm4gdGhpcy5fbGlzdC5zZWxlY3RQcmV2aW91c0l0ZW0odHJ1ZSxmYWxzZSk7Y2FzZSdBcnJvd0Rvd24nOnJldHVybiB0aGlzLl9saXN0LnNlbGVjdE5leHRJdGVtKHRydWUsZmFsc2UpO2Nhc2UnUGFnZVVwJzpyZXR1cm4gdGhpcy5fbGlzdC5zZWxlY3RJdGVtUHJldmlvdXNQYWdlKGZhbHNlKTtjYXNlJ1BhZ2VEb3duJzpyZXR1cm4gdGhpcy5fbGlzdC5zZWxlY3RJdGVtTmV4dFBhZ2UoZmFsc2UpO30KcmV0dXJuIGZhbHNlO30KZW50ZXJLZXlQcmVzc2VkKCl7Y29uc3QgaGFzU2VsZWN0ZWRJdGVtPSEhdGhpcy5fbGlzdC5zZWxlY3RlZEl0ZW0oKXx8ISF0aGlzLl9vbmx5Q29tcGxldGlvbjt0aGlzLmFjY2VwdFN1Z2dlc3Rpb24oKTtyZXR1cm4gaGFzU2VsZWN0ZWRJdGVtO319O1VJLlN1Z2dlc3RCb3guU3VnZ2VzdGlvbjtVSS5TdWdnZXN0Qm94LlN1Z2dlc3Rpb25zOztVSS5UYWJiZWRQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndWkvdGFiYmVkUGFuZS5jc3MnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGFiYmVkLXBhbmUnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RhYmJlZC1wYW5lLXNoYWRvdycpO3RoaXMuY29udGVudEVsZW1lbnQudGFiSW5kZXg9LTE7dGhpcy5faGVhZGVyRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0YWJiZWQtcGFuZS1oZWFkZXInKTt0aGlzLl9oZWFkZXJDb250ZW50c0VsZW1lbnQ9dGhpcy5faGVhZGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGFiYmVkLXBhbmUtaGVhZGVyLWNvbnRlbnRzJyk7dGhpcy5fdGFiU2xpZGVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RhYmJlZC1wYW5lLXRhYi1zbGlkZXInKTt0aGlzLl90YWJzRWxlbWVudD10aGlzLl9oZWFkZXJDb250ZW50c0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RhYmJlZC1wYW5lLWhlYWRlci10YWJzJyk7dGhpcy5fdGFic0VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywndGFibGlzdCcpO3RoaXMuX3RhYnNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2tleURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY29udGVudEVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGFiYmVkLXBhbmUtY29udGVudCcpO3RoaXMuX2NvbnRlbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsJ3RhYnBhbmVsJyk7dGhpcy5fY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt0aGlzLl90YWJzPVtdO3RoaXMuX3RhYnNIaXN0b3J5PVtdO3RoaXMuX3RhYnNCeUlkPW5ldyBNYXAoKTt0aGlzLl9jdXJyZW50VGFiTG9ja2VkPWZhbHNlO3RoaXMuX2F1dG9TZWxlY3RGaXJzdEl0ZW1PblNob3c9dHJ1ZTt0aGlzLl90cmlnZ2VyRHJvcERvd25UaW1lb3V0PW51bGw7dGhpcy5fZHJvcERvd25CdXR0b249dGhpcy5fY3JlYXRlRHJvcERvd25CdXR0b24oKTtVSS56b29tTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFVJLlpvb21NYW5hZ2VyLkV2ZW50cy5ab29tQ2hhbmdlZCx0aGlzLl96b29tQ2hhbmdlZCx0aGlzKTt0aGlzLm1ha2VUYWJTbGlkZXIoKTt9CnNldEFjY2Vzc2libGVOYW1lKG5hbWUpe1VJLkFSSUFVdGlscy5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLl90YWJzRWxlbWVudCxuYW1lKTt9CnNldEN1cnJlbnRUYWJMb2NrZWQobG9ja2VkKXt0aGlzLl9jdXJyZW50VGFiTG9ja2VkPWxvY2tlZDt0aGlzLl9oZWFkZXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2xvY2tlZCcsdGhpcy5fY3VycmVudFRhYkxvY2tlZCk7fQpzZXRBdXRvU2VsZWN0Rmlyc3RJdGVtT25TaG93KGF1dG9TZWxlY3Qpe3RoaXMuX2F1dG9TZWxlY3RGaXJzdEl0ZW1PblNob3c9YXV0b1NlbGVjdDt9CmdldCB2aXNpYmxlVmlldygpe3JldHVybiB0aGlzLl9jdXJyZW50VGFiP3RoaXMuX2N1cnJlbnRUYWIudmlldzpudWxsO30KdGFiSWRzKCl7cmV0dXJuIHRoaXMuX3RhYnMubWFwKHRhYj0+dGFiLl9pZCk7fQp0YWJJbmRleCh0YWJJZCl7cmV0dXJuIHRoaXMuX3RhYnMuZmluZEluZGV4KHRhYj0+dGFiLmlkPT09dGFiSWQpO30KdGFiVmlld3MoKXtyZXR1cm4gdGhpcy5fdGFicy5tYXAodGFiPT50YWIudmlldyk7fQp0YWJWaWV3KHRhYklkKXtyZXR1cm4gdGhpcy5fdGFic0J5SWQuaGFzKHRhYklkKT90aGlzLl90YWJzQnlJZC5nZXQodGFiSWQpLnZpZXc6bnVsbDt9CmdldCBzZWxlY3RlZFRhYklkKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRUYWI/dGhpcy5fY3VycmVudFRhYi5pZDpudWxsO30Kc2V0U2hyaW5rYWJsZVRhYnMoc2hyaW5rYWJsZVRhYnMpe3RoaXMuX3Nocmlua2FibGVUYWJzPXNocmlua2FibGVUYWJzO30KbWFrZVZlcnRpY2FsVGFiTGF5b3V0KCl7dGhpcy5fdmVydGljYWxUYWJMYXlvdXQ9dHJ1ZTt0aGlzLl9zZXRUYWJTbGlkZXIoZmFsc2UpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmVydGljYWwtdGFiLWxheW91dCcpO3RoaXMuaW52YWxpZGF0ZUNvbnN0cmFpbnRzKCk7fQpzZXRDbG9zZWFibGVUYWJzKGNsb3NlYWJsZVRhYnMpe3RoaXMuX2Nsb3NlYWJsZVRhYnM9Y2xvc2VhYmxlVGFiczt9CmZvY3VzKCl7aWYodGhpcy52aXNpYmxlVmlldykKdGhpcy52aXNpYmxlVmlldy5mb2N1cygpO2Vsc2UKdGhpcy5jb250ZW50RWxlbWVudC5mb2N1cygpO30KaGVhZGVyRWxlbWVudCgpe3JldHVybiB0aGlzLl9oZWFkZXJFbGVtZW50O30KaXNUYWJDbG9zZWFibGUoaWQpe2NvbnN0IHRhYj10aGlzLl90YWJzQnlJZC5nZXQoaWQpO3JldHVybiB0YWI/dGFiLmlzQ2xvc2VhYmxlKCk6ZmFsc2U7fQpzZXRUYWJEZWxlZ2F0ZShkZWxlZ2F0ZSl7Y29uc3QgdGFicz10aGlzLl90YWJzLnNsaWNlKCk7Zm9yKGxldCBpPTA7aTx0YWJzLmxlbmd0aDsrK2kpCnRhYnNbaV0uc2V0RGVsZWdhdGUoZGVsZWdhdGUpO3RoaXMuX2RlbGVnYXRlPWRlbGVnYXRlO30KYXBwZW5kVGFiKGlkLHRhYlRpdGxlLHZpZXcsdGFiVG9vbHRpcCx1c2VyR2VzdHVyZSxpc0Nsb3NlYWJsZSxpbmRleCl7aXNDbG9zZWFibGU9dHlwZW9mIGlzQ2xvc2VhYmxlPT09J2Jvb2xlYW4nP2lzQ2xvc2VhYmxlOnRoaXMuX2Nsb3NlYWJsZVRhYnM7Y29uc3QgdGFiPW5ldyBVSS5UYWJiZWRQYW5lVGFiKHRoaXMsaWQsdGFiVGl0bGUsaXNDbG9zZWFibGUsdmlldyx0YWJUb29sdGlwKTt0YWIuc2V0RGVsZWdhdGUodGhpcy5fZGVsZWdhdGUpO2NvbnNvbGUuYXNzZXJ0KCF0aGlzLl90YWJzQnlJZC5oYXMoaWQpLGBUYWJiZWQgcGFuZSBhbHJlYWR5IGNvbnRhaW5zIGEgdGFiIHdpdGggaWQgJyR7aWR9J2ApO3RoaXMuX3RhYnNCeUlkLnNldChpZCx0YWIpO2lmKGluZGV4IT09dW5kZWZpbmVkKQp0aGlzLl90YWJzLnNwbGljZShpbmRleCwwLHRhYik7ZWxzZQp0aGlzLl90YWJzLnB1c2godGFiKTt0aGlzLl90YWJzSGlzdG9yeS5wdXNoKHRhYik7aWYodGhpcy5fdGFic0hpc3RvcnlbMF09PT10YWImJnRoaXMuaXNTaG93aW5nKCkpCnRoaXMuc2VsZWN0VGFiKHRhYi5pZCx1c2VyR2VzdHVyZSk7dGhpcy5fdXBkYXRlVGFiRWxlbWVudHMoKTt9CmNsb3NlVGFiKGlkLHVzZXJHZXN0dXJlKXt0aGlzLmNsb3NlVGFicyhbaWRdLHVzZXJHZXN0dXJlKTt9CmNsb3NlVGFicyhpZHMsdXNlckdlc3R1cmUpe2NvbnN0IGZvY3VzZWQ9dGhpcy5oYXNGb2N1cygpO2ZvcihsZXQgaT0wO2k8aWRzLmxlbmd0aDsrK2kpCnRoaXMuX2lubmVyQ2xvc2VUYWIoaWRzW2ldLHVzZXJHZXN0dXJlKTt0aGlzLl91cGRhdGVUYWJFbGVtZW50cygpO2lmKHRoaXMuX3RhYnNIaXN0b3J5Lmxlbmd0aCkKdGhpcy5zZWxlY3RUYWIodGhpcy5fdGFic0hpc3RvcnlbMF0uaWQsZmFsc2UpO2lmKGZvY3VzZWQpCnRoaXMuZm9jdXMoKTt9Cl9pbm5lckNsb3NlVGFiKGlkLHVzZXJHZXN0dXJlKXtpZighdGhpcy5fdGFic0J5SWQuaGFzKGlkKSkKcmV0dXJuO2lmKHVzZXJHZXN0dXJlJiYhdGhpcy5fdGFic0J5SWQuZ2V0KGlkKS5fY2xvc2VhYmxlKQpyZXR1cm47aWYodGhpcy5fY3VycmVudFRhYiYmdGhpcy5fY3VycmVudFRhYi5pZD09PWlkKQp0aGlzLl9oaWRlQ3VycmVudFRhYigpO2NvbnN0IHRhYj10aGlzLl90YWJzQnlJZC5nZXQoaWQpO3RoaXMuX3RhYnNCeUlkLmRlbGV0ZShpZCk7dGhpcy5fdGFic0hpc3Rvcnkuc3BsaWNlKHRoaXMuX3RhYnNIaXN0b3J5LmluZGV4T2YodGFiKSwxKTt0aGlzLl90YWJzLnNwbGljZSh0aGlzLl90YWJzLmluZGV4T2YodGFiKSwxKTtpZih0YWIuX3Nob3duKQp0aGlzLl9oaWRlVGFiRWxlbWVudCh0YWIpO2NvbnN0IGV2ZW50RGF0YT17dGFiSWQ6aWQsdmlldzp0YWIudmlldyxpc1VzZXJHZXN0dXJlOnVzZXJHZXN0dXJlfTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5UYWJiZWRQYW5lLkV2ZW50cy5UYWJDbG9zZWQsZXZlbnREYXRhKTtyZXR1cm4gdHJ1ZTt9Cmhhc1RhYih0YWJJZCl7cmV0dXJuIHRoaXMuX3RhYnNCeUlkLmhhcyh0YWJJZCk7fQphbGxUYWJzKCl7cmV0dXJuIHRoaXMuX3RhYnMubWFwKGZ1bmN0aW9uKHRhYil7cmV0dXJuIHRhYi5pZDt9KTt9Cm90aGVyVGFicyhpZCl7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fdGFicy5sZW5ndGg7KytpKXtpZih0aGlzLl90YWJzW2ldLmlkIT09aWQpCnJlc3VsdC5wdXNoKHRoaXMuX3RhYnNbaV0uaWQpO30KcmV0dXJuIHJlc3VsdDt9Cl90YWJzVG9UaGVSaWdodChpZCl7bGV0IGluZGV4PS0xO2ZvcihsZXQgaT0wO2k8dGhpcy5fdGFicy5sZW5ndGg7KytpKXtpZih0aGlzLl90YWJzW2ldLmlkPT09aWQpe2luZGV4PWk7YnJlYWs7fX0KaWYoaW5kZXg9PT0tMSkKcmV0dXJuW107cmV0dXJuIHRoaXMuX3RhYnMuc2xpY2UoaW5kZXgrMSkubWFwKGZ1bmN0aW9uKHRhYil7cmV0dXJuIHRhYi5pZDt9KTt9Cl92aWV3SGFzRm9jdXMoKXtpZih0aGlzLnZpc2libGVWaWV3KQpyZXR1cm4gdGhpcy52aXNpYmxlVmlldy5oYXNGb2N1cygpO3JldHVybiB0aGlzLmNvbnRlbnRFbGVtZW50PT09dGhpcy5jb250ZW50RWxlbWVudC5nZXRDb21wb25lbnRSb290KCkuYWN0aXZlRWxlbWVudDt9CnNlbGVjdFRhYihpZCx1c2VyR2VzdHVyZSl7aWYodGhpcy5fY3VycmVudFRhYkxvY2tlZCkKcmV0dXJuIGZhbHNlO2NvbnN0IGZvY3VzZWQ9dGhpcy5fdmlld0hhc0ZvY3VzKCk7Y29uc3QgdGFiPXRoaXMuX3RhYnNCeUlkLmdldChpZCk7aWYoIXRhYikKcmV0dXJuIGZhbHNlO2lmKHRoaXMuX2N1cnJlbnRUYWImJnRoaXMuX2N1cnJlbnRUYWIuaWQ9PT1pZCkKcmV0dXJuIHRydWU7dGhpcy5zdXNwZW5kSW52YWxpZGF0aW9ucygpO3RoaXMuX2hpZGVDdXJyZW50VGFiKCk7dGhpcy5fc2hvd1RhYih0YWIpO3RoaXMucmVzdW1lSW52YWxpZGF0aW9ucygpO3RoaXMuX2N1cnJlbnRUYWI9dGFiO3RoaXMuX3RhYnNIaXN0b3J5LnNwbGljZSh0aGlzLl90YWJzSGlzdG9yeS5pbmRleE9mKHRhYiksMSk7dGhpcy5fdGFic0hpc3Rvcnkuc3BsaWNlKDAsMCx0YWIpO3RoaXMuX3VwZGF0ZVRhYkVsZW1lbnRzKCk7aWYoZm9jdXNlZCkKdGhpcy5mb2N1cygpO2NvbnN0IGV2ZW50RGF0YT17dGFiSWQ6aWQsdmlldzp0YWIudmlldyxpc1VzZXJHZXN0dXJlOnVzZXJHZXN0dXJlfTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5UYWJiZWRQYW5lLkV2ZW50cy5UYWJTZWxlY3RlZCxldmVudERhdGEpO3JldHVybiB0cnVlO30Kc2VsZWN0TmV4dFRhYigpe2NvbnN0IGluZGV4PXRoaXMuX3RhYnMuaW5kZXhPZih0aGlzLl9jdXJyZW50VGFiKTtjb25zdCBuZXh0SW5kZXg9bW9kKGluZGV4KzEsdGhpcy5fdGFicy5sZW5ndGgpO3RoaXMuc2VsZWN0VGFiKHRoaXMuX3RhYnNbbmV4dEluZGV4XS5pZCx0cnVlKTt9CnNlbGVjdFByZXZUYWIoKXtjb25zdCBpbmRleD10aGlzLl90YWJzLmluZGV4T2YodGhpcy5fY3VycmVudFRhYik7Y29uc3QgbmV4dEluZGV4PW1vZChpbmRleC0xLHRoaXMuX3RhYnMubGVuZ3RoKTt0aGlzLnNlbGVjdFRhYih0aGlzLl90YWJzW25leHRJbmRleF0uaWQsdHJ1ZSk7fQpsYXN0T3BlbmVkVGFiSWRzKHRhYnNDb3VudCl7ZnVuY3Rpb24gdGFiVG9UYWJJZCh0YWIpe3JldHVybiB0YWIuaWQ7fQpyZXR1cm4gdGhpcy5fdGFic0hpc3Rvcnkuc2xpY2UoMCx0YWJzQ291bnQpLm1hcCh0YWJUb1RhYklkKTt9CnNldFRhYkljb24oaWQsaWNvbil7Y29uc3QgdGFiPXRoaXMuX3RhYnNCeUlkLmdldChpZCk7dGFiLl9zZXRJY29uKGljb24pO3RoaXMuX3VwZGF0ZVRhYkVsZW1lbnRzKCk7fQpzZXRUYWJFbmFibGVkKGlkLGVuYWJsZWQpe2NvbnN0IHRhYj10aGlzLl90YWJzQnlJZC5nZXQoaWQpO3RhYi50YWJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2Rpc2FibGVkJywhZW5hYmxlZCk7fQp0b2dnbGVUYWJDbGFzcyhpZCxjbGFzc05hbWUsZm9yY2Upe2NvbnN0IHRhYj10aGlzLl90YWJzQnlJZC5nZXQoaWQpO2lmKHRhYi5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLGZvcmNlKSkKdGhpcy5fdXBkYXRlVGFiRWxlbWVudHMoKTt9Cl96b29tQ2hhbmdlZChldmVudCl7Zm9yKGxldCBpPTA7aTx0aGlzLl90YWJzLmxlbmd0aDsrK2kpCmRlbGV0ZSB0aGlzLl90YWJzW2ldLl9tZWFzdXJlZFdpZHRoO2lmKHRoaXMuaXNTaG93aW5nKCkpCnRoaXMuX3VwZGF0ZVRhYkVsZW1lbnRzKCk7fQpjaGFuZ2VUYWJUaXRsZShpZCx0YWJUaXRsZSx0YWJUb29sdGlwKXtjb25zdCB0YWI9dGhpcy5fdGFic0J5SWQuZ2V0KGlkKTtpZih0YWJUb29sdGlwIT09dW5kZWZpbmVkKQp0YWIudG9vbHRpcD10YWJUb29sdGlwO2lmKHRhYi50aXRsZSE9PXRhYlRpdGxlKXt0YWIudGl0bGU9dGFiVGl0bGU7dGhpcy5fdXBkYXRlVGFiRWxlbWVudHMoKTt9fQpjaGFuZ2VUYWJWaWV3KGlkLHZpZXcpe2NvbnN0IHRhYj10aGlzLl90YWJzQnlJZC5nZXQoaWQpO2lmKHRhYi52aWV3PT09dmlldykKcmV0dXJuO3RoaXMuc3VzcGVuZEludmFsaWRhdGlvbnMoKTtjb25zdCBpc1NlbGVjdGVkPXRoaXMuX2N1cnJlbnRUYWImJnRoaXMuX2N1cnJlbnRUYWIuaWQ9PT1pZDtjb25zdCBzaG91bGRGb2N1cz10YWIudmlldy5oYXNGb2N1cygpO2lmKGlzU2VsZWN0ZWQpCnRoaXMuX2hpZGVUYWIodGFiKTt0YWIudmlldz12aWV3O2lmKGlzU2VsZWN0ZWQpCnRoaXMuX3Nob3dUYWIodGFiKTtpZihzaG91bGRGb2N1cykKdGFiLnZpZXcuZm9jdXMoKTt0aGlzLnJlc3VtZUludmFsaWRhdGlvbnMoKTt9Cm9uUmVzaXplKCl7dGhpcy5fdXBkYXRlVGFiRWxlbWVudHMoKTt9CmhlYWRlclJlc2l6ZWQoKXt0aGlzLl91cGRhdGVUYWJFbGVtZW50cygpO30Kd2FzU2hvd24oKXtjb25zdCBlZmZlY3RpdmVUYWI9dGhpcy5fY3VycmVudFRhYnx8dGhpcy5fdGFic0hpc3RvcnlbMF07aWYoZWZmZWN0aXZlVGFiJiZ0aGlzLl9hdXRvU2VsZWN0Rmlyc3RJdGVtT25TaG93KQp0aGlzLnNlbGVjdFRhYihlZmZlY3RpdmVUYWIuaWQpO30KbWFrZVRhYlNsaWRlcigpe2lmKHRoaXMuX3ZlcnRpY2FsVGFiTGF5b3V0KQpyZXR1cm47dGhpcy5fc2V0VGFiU2xpZGVyKHRydWUpO30KX3NldFRhYlNsaWRlcihlbmFibGUpe3RoaXMuX3NsaWRlckVuYWJsZWQ9ZW5hYmxlO3RoaXMuX3RhYlNsaWRlci5jbGFzc0xpc3QudG9nZ2xlKCdlbmFibGVkJyxlbmFibGUpO30KY2FsY3VsYXRlQ29uc3RyYWludHMoKXtsZXQgY29uc3RyYWludHM9c3VwZXIuY2FsY3VsYXRlQ29uc3RyYWludHMoKTtjb25zdCBtaW5Db250ZW50Q29uc3RyYWludHM9bmV3IFVJLkNvbnN0cmFpbnRzKG5ldyBVSS5TaXplKDAsMCksbmV3IFVJLlNpemUoNTAsNTApKTtjb25zdHJhaW50cz1jb25zdHJhaW50cy53aWR0aFRvTWF4KG1pbkNvbnRlbnRDb25zdHJhaW50cykuaGVpZ2h0VG9NYXgobWluQ29udGVudENvbnN0cmFpbnRzKTtpZih0aGlzLl92ZXJ0aWNhbFRhYkxheW91dCkKY29uc3RyYWludHM9Y29uc3RyYWludHMuYWRkV2lkdGgobmV3IFVJLkNvbnN0cmFpbnRzKG5ldyBVSS5TaXplKDEyMCwwKSkpO2Vsc2UKY29uc3RyYWludHM9Y29uc3RyYWludHMuYWRkSGVpZ2h0KG5ldyBVSS5Db25zdHJhaW50cyhuZXcgVUkuU2l6ZSgwLDMwKSkpO3JldHVybiBjb25zdHJhaW50czt9Cl91cGRhdGVUYWJFbGVtZW50cygpe1VJLmludm9rZU9uY2VBZnRlckJhdGNoVXBkYXRlKHRoaXMsdGhpcy5faW5uZXJVcGRhdGVUYWJFbGVtZW50cyk7fQpzZXRQbGFjZWhvbGRlckVsZW1lbnQoZWxlbWVudCl7dGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50PWVsZW1lbnQ7aWYodGhpcy5fcGxhY2Vob2xkZXJDb250YWluZXJFbGVtZW50KXt0aGlzLl9wbGFjZWhvbGRlckNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9wbGFjZWhvbGRlckNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7fX0KX2lubmVyVXBkYXRlVGFiRWxlbWVudHMoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO2lmKCF0aGlzLl90YWJzLmxlbmd0aCl7dGhpcy5fY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGFzLW5vLXRhYnMnKTtpZih0aGlzLl9wbGFjZWhvbGRlckVsZW1lbnQmJiF0aGlzLl9wbGFjZWhvbGRlckNvbnRhaW5lckVsZW1lbnQpe3RoaXMuX3BsYWNlaG9sZGVyQ29udGFpbmVyRWxlbWVudD10aGlzLl9jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGFiYmVkLXBhbmUtcGxhY2Vob2xkZXIgZmlsbCcpO3RoaXMuX3BsYWNlaG9sZGVyQ29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wbGFjZWhvbGRlckVsZW1lbnQpO319ZWxzZXt0aGlzLl9jb250ZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtbm8tdGFicycpO2lmKHRoaXMuX3BsYWNlaG9sZGVyQ29udGFpbmVyRWxlbWVudCl7dGhpcy5fcGxhY2Vob2xkZXJDb250YWluZXJFbGVtZW50LnJlbW92ZSgpO2RlbGV0ZSB0aGlzLl9wbGFjZWhvbGRlckNvbnRhaW5lckVsZW1lbnQ7fX0KdGhpcy5fbWVhc3VyZURyb3BEb3duQnV0dG9uKCk7dGhpcy5fdXBkYXRlV2lkdGhzKCk7dGhpcy5fdXBkYXRlVGFic0Ryb3BEb3duKCk7dGhpcy5fdXBkYXRlVGFiU2xpZGVyKCk7fQpfc2hvd1RhYkVsZW1lbnQoaW5kZXgsdGFiKXtpZihpbmRleD49dGhpcy5fdGFic0VsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKQp0aGlzLl90YWJzRWxlbWVudC5hcHBlbmRDaGlsZCh0YWIudGFiRWxlbWVudCk7ZWxzZQp0aGlzLl90YWJzRWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLnRhYkVsZW1lbnQsdGhpcy5fdGFic0VsZW1lbnQuY2hpbGRyZW5baW5kZXhdKTt0YWIuX3Nob3duPXRydWU7fQpfaGlkZVRhYkVsZW1lbnQodGFiKXt0aGlzLl90YWJzRWxlbWVudC5yZW1vdmVDaGlsZCh0YWIudGFiRWxlbWVudCk7dGFiLl9zaG93bj1mYWxzZTt9Cl9jcmVhdGVEcm9wRG93bkJ1dHRvbigpe2NvbnN0IGRyb3BEb3duQ29udGFpbmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RhYmJlZC1wYW5lLWhlYWRlci10YWJzLWRyb3AtZG93bi1jb250YWluZXInKTtjb25zdCBjaGV2cm9uSWNvbj1VSS5JY29uLmNyZWF0ZSgnbGFyZ2VpY29uLWNoZXZyb24nLCdjaGV2cm9uLWljb24nKTtkcm9wRG93bkNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGV2cm9uSWNvbik7ZHJvcERvd25Db250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2Ryb3BEb3duQ2xpY2tlZC5iaW5kKHRoaXMpKTtkcm9wRG93bkNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGV2ZW50PT57aWYoZXZlbnQud2hpY2ghPT0xfHx0aGlzLl90cmlnZ2VyRHJvcERvd25UaW1lb3V0KQpyZXR1cm47dGhpcy5fdHJpZ2dlckRyb3BEb3duVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX2Ryb3BEb3duQ2xpY2tlZC5iaW5kKHRoaXMsZXZlbnQpLDIwMCk7fSk7cmV0dXJuIGRyb3BEb3duQ29udGFpbmVyO30KX2Ryb3BEb3duQ2xpY2tlZChldmVudCl7aWYoZXZlbnQud2hpY2ghPT0xKQpyZXR1cm47aWYodGhpcy5fdHJpZ2dlckRyb3BEb3duVGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RyaWdnZXJEcm9wRG93blRpbWVvdXQpO3RoaXMuX3RyaWdnZXJEcm9wRG93blRpbWVvdXQ9bnVsbDt9CmNvbnN0IHJlY3Q9dGhpcy5fZHJvcERvd25CdXR0b24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Y29uc3QgbWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQsZmFsc2UscmVjdC5sZWZ0LHJlY3QuYm90dG9tKTtmb3IobGV0IGk9MDtpPHRoaXMuX3RhYnMubGVuZ3RoOysraSl7Y29uc3QgdGFiPXRoaXMuX3RhYnNbaV07aWYodGFiLl9zaG93bikKY29udGludWU7bWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbSh0YWIudGl0bGUsdGhpcy5fZHJvcERvd25NZW51SXRlbVNlbGVjdGVkLmJpbmQodGhpcyx0YWIpLHRoaXMuX3RhYnNIaXN0b3J5WzBdPT09dGFiKTt9Cm1lbnUuc2hvdygpO30KX2Ryb3BEb3duTWVudUl0ZW1TZWxlY3RlZCh0YWIpe3RoaXMuX2xhc3RTZWxlY3RlZE92ZXJmbG93VGFiPXRhYjt0aGlzLnNlbGVjdFRhYih0YWIuaWQsdHJ1ZSk7fQpfdG90YWxXaWR0aCgpe3JldHVybiB0aGlzLl9oZWFkZXJDb250ZW50c0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7fQpfbnVtYmVyT2ZUYWJzU2hvd24oKXtsZXQgbnVtVGFic1Nob3duPTA7Zm9yKGNvbnN0IHRhYiBvZiB0aGlzLl90YWJzKXtpZih0YWIuX3Nob3duKQpudW1UYWJzU2hvd24rKzt9CnJldHVybiBudW1UYWJzU2hvd247fQpkaXNhYmxlT3ZlcmZsb3dNZW51KCl7dGhpcy5fb3ZlcmZsb3dEaXNhYmxlZD10cnVlO30KX3VwZGF0ZVRhYnNEcm9wRG93bigpe2NvbnN0IHRhYnNUb1Nob3dJbmRleGVzPXRoaXMuX3RhYnNUb1Nob3dJbmRleGVzKHRoaXMuX3RhYnMsdGhpcy5fdGFic0hpc3RvcnksdGhpcy5fdG90YWxXaWR0aCgpLHRoaXMuX21lYXN1cmVkRHJvcERvd25CdXR0b25XaWR0aHx8MCk7aWYodGhpcy5fbGFzdFNlbGVjdGVkT3ZlcmZsb3dUYWImJnRoaXMuX251bWJlck9mVGFic1Nob3duKCkhPT10YWJzVG9TaG93SW5kZXhlcy5sZW5ndGgpe2RlbGV0ZSB0aGlzLl9sYXN0U2VsZWN0ZWRPdmVyZmxvd1RhYjt0aGlzLl91cGRhdGVUYWJzRHJvcERvd24oKTtyZXR1cm47fQpmb3IobGV0IGk9MDtpPHRoaXMuX3RhYnMubGVuZ3RoOysraSl7aWYodGhpcy5fdGFic1tpXS5fc2hvd24mJnRhYnNUb1Nob3dJbmRleGVzLmluZGV4T2YoaSk9PT0tMSkKdGhpcy5faGlkZVRhYkVsZW1lbnQodGhpcy5fdGFic1tpXSk7fQpmb3IobGV0IGk9MDtpPHRhYnNUb1Nob3dJbmRleGVzLmxlbmd0aDsrK2kpe2NvbnN0IHRhYj10aGlzLl90YWJzW3RhYnNUb1Nob3dJbmRleGVzW2ldXTtpZighdGFiLl9zaG93bikKdGhpcy5fc2hvd1RhYkVsZW1lbnQoaSx0YWIpO30KaWYoIXRoaXMuX292ZXJmbG93RGlzYWJsZWQpCnRoaXMuX21heWJlU2hvd0Ryb3BEb3duKHRhYnNUb1Nob3dJbmRleGVzLmxlbmd0aCE9PXRoaXMuX3RhYnMubGVuZ3RoKTt9Cl9tYXliZVNob3dEcm9wRG93bihoYXNNb3JlVGFicyl7aWYoaGFzTW9yZVRhYnMmJiF0aGlzLl9kcm9wRG93bkJ1dHRvbi5wYXJlbnRFbGVtZW50KQp0aGlzLl9oZWFkZXJDb250ZW50c0VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZHJvcERvd25CdXR0b24pO2Vsc2UgaWYoIWhhc01vcmVUYWJzJiZ0aGlzLl9kcm9wRG93bkJ1dHRvbi5wYXJlbnRFbGVtZW50KQp0aGlzLl9oZWFkZXJDb250ZW50c0VsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZHJvcERvd25CdXR0b24pO30KX21lYXN1cmVEcm9wRG93bkJ1dHRvbigpe2lmKHRoaXMuX292ZXJmbG93RGlzYWJsZWR8fHRoaXMuX21lYXN1cmVkRHJvcERvd25CdXR0b25XaWR0aCkKcmV0dXJuO3RoaXMuX2Ryb3BEb3duQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21lYXN1cmluZycpO3RoaXMuX2hlYWRlckNvbnRlbnRzRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kcm9wRG93bkJ1dHRvbik7dGhpcy5fbWVhc3VyZWREcm9wRG93bkJ1dHRvbldpZHRoPXRoaXMuX2Ryb3BEb3duQnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3RoaXMuX2hlYWRlckNvbnRlbnRzRWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9kcm9wRG93bkJ1dHRvbik7dGhpcy5fZHJvcERvd25CdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWVhc3VyaW5nJyk7fQpfdXBkYXRlV2lkdGhzKCl7Y29uc3QgbWVhc3VyZWRXaWR0aHM9dGhpcy5fbWVhc3VyZVdpZHRocygpO2NvbnN0IG1heFdpZHRoPXRoaXMuX3Nocmlua2FibGVUYWJzP3RoaXMuX2NhbGN1bGF0ZU1heFdpZHRoKG1lYXN1cmVkV2lkdGhzLnNsaWNlKCksdGhpcy5fdG90YWxXaWR0aCgpKTpOdW1iZXIuTUFYX1ZBTFVFO2xldCBpPTA7Zm9yKGNvbnN0IHRhYiBvZiB0aGlzLl90YWJzKQp0YWIuc2V0V2lkdGgodGhpcy5fdmVydGljYWxUYWJMYXlvdXQ/LTE6TWF0aC5taW4obWF4V2lkdGgsbWVhc3VyZWRXaWR0aHNbaSsrXSkpO30KX21lYXN1cmVXaWR0aHMoKXt0aGlzLl90YWJzRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCcyMDAwcHgnKTtjb25zdCBtZWFzdXJpbmdUYWJFbGVtZW50cz1bXTtmb3IoY29uc3QgdGFiIG9mIHRoaXMuX3RhYnMpe2lmKHR5cGVvZiB0YWIuX21lYXN1cmVkV2lkdGg9PT0nbnVtYmVyJykKY29udGludWU7Y29uc3QgbWVhc3VyaW5nVGFiRWxlbWVudD10YWIuX2NyZWF0ZVRhYkVsZW1lbnQodHJ1ZSk7bWVhc3VyaW5nVGFiRWxlbWVudC5fX3RhYj10YWI7bWVhc3VyaW5nVGFiRWxlbWVudHMucHVzaChtZWFzdXJpbmdUYWJFbGVtZW50KTt0aGlzLl90YWJzRWxlbWVudC5hcHBlbmRDaGlsZChtZWFzdXJpbmdUYWJFbGVtZW50KTt9CmZvcihsZXQgaT0wO2k8bWVhc3VyaW5nVGFiRWxlbWVudHMubGVuZ3RoOysraSl7Y29uc3Qgd2lkdGg9bWVhc3VyaW5nVGFiRWxlbWVudHNbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7bWVhc3VyaW5nVGFiRWxlbWVudHNbaV0uX190YWIuX21lYXN1cmVkV2lkdGg9TWF0aC5jZWlsKHdpZHRoKTt9CmZvcihsZXQgaT0wO2k8bWVhc3VyaW5nVGFiRWxlbWVudHMubGVuZ3RoOysraSkKbWVhc3VyaW5nVGFiRWxlbWVudHNbaV0ucmVtb3ZlKCk7Y29uc3QgbWVhc3VyZWRXaWR0aHM9W107Zm9yKGNvbnN0IHRhYiBvZiB0aGlzLl90YWJzKQptZWFzdXJlZFdpZHRocy5wdXNoKHRhYi5fbWVhc3VyZWRXaWR0aCk7dGhpcy5fdGFic0VsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7cmV0dXJuIG1lYXN1cmVkV2lkdGhzO30KX2NhbGN1bGF0ZU1heFdpZHRoKG1lYXN1cmVkV2lkdGhzLHRvdGFsV2lkdGgpe2lmKCFtZWFzdXJlZFdpZHRocy5sZW5ndGgpCnJldHVybiAwO21lYXN1cmVkV2lkdGhzLnNvcnQoZnVuY3Rpb24oeCx5KXtyZXR1cm4geC15O30pO2xldCB0b3RhbE1lYXN1cmVkV2lkdGg9MDtmb3IobGV0IGk9MDtpPG1lYXN1cmVkV2lkdGhzLmxlbmd0aDsrK2kpCnRvdGFsTWVhc3VyZWRXaWR0aCs9bWVhc3VyZWRXaWR0aHNbaV07aWYodG90YWxXaWR0aD49dG90YWxNZWFzdXJlZFdpZHRoKQpyZXR1cm4gbWVhc3VyZWRXaWR0aHNbbWVhc3VyZWRXaWR0aHMubGVuZ3RoLTFdO2xldCB0b3RhbEV4dHJhV2lkdGg9MDtmb3IobGV0IGk9bWVhc3VyZWRXaWR0aHMubGVuZ3RoLTE7aT4wOy0taSl7Y29uc3QgZXh0cmFXaWR0aD1tZWFzdXJlZFdpZHRoc1tpXS1tZWFzdXJlZFdpZHRoc1tpLTFdO3RvdGFsRXh0cmFXaWR0aCs9KG1lYXN1cmVkV2lkdGhzLmxlbmd0aC1pKSpleHRyYVdpZHRoO2lmKHRvdGFsV2lkdGgrdG90YWxFeHRyYVdpZHRoPj10b3RhbE1lYXN1cmVkV2lkdGgpe3JldHVybiBtZWFzdXJlZFdpZHRoc1tpLTFdKwoodG90YWxXaWR0aCt0b3RhbEV4dHJhV2lkdGgtdG90YWxNZWFzdXJlZFdpZHRoKS8obWVhc3VyZWRXaWR0aHMubGVuZ3RoLWkpO319CnJldHVybiB0b3RhbFdpZHRoL21lYXN1cmVkV2lkdGhzLmxlbmd0aDt9Cl90YWJzVG9TaG93SW5kZXhlcyh0YWJzT3JkZXJlZCx0YWJzSGlzdG9yeSx0b3RhbFdpZHRoLG1lYXN1cmVkRHJvcERvd25CdXR0b25XaWR0aCl7Y29uc3QgdGFic1RvU2hvd0luZGV4ZXM9W107bGV0IHRvdGFsVGFic1dpZHRoPTA7Y29uc3QgdGFiQ291bnQ9dGFic09yZGVyZWQubGVuZ3RoO2NvbnN0IHRhYnNUb0xvb2tBdD10YWJzT3JkZXJlZC5zbGljZSgwKTtpZih0aGlzLl9jdXJyZW50VGFiIT09dW5kZWZpbmVkKQp0YWJzVG9Mb29rQXQudW5zaGlmdCh0YWJzVG9Mb29rQXQuc3BsaWNlKHRhYnNUb0xvb2tBdC5pbmRleE9mKHRoaXMuX2N1cnJlbnRUYWIpLDEpWzBdKTtpZih0aGlzLl9sYXN0U2VsZWN0ZWRPdmVyZmxvd1RhYiE9PXVuZGVmaW5lZCkKdGFic1RvTG9va0F0LnVuc2hpZnQodGFic1RvTG9va0F0LnNwbGljZSh0YWJzVG9Mb29rQXQuaW5kZXhPZih0aGlzLl9sYXN0U2VsZWN0ZWRPdmVyZmxvd1RhYiksMSlbMF0pO2ZvcihsZXQgaT0wO2k8dGFiQ291bnQ7KytpKXtjb25zdCB0YWI9dGhpcy5fYXV0b21hdGljUmVvcmRlcj90YWJzSGlzdG9yeVtpXTp0YWJzVG9Mb29rQXRbaV07dG90YWxUYWJzV2lkdGgrPXRhYi53aWR0aCgpO2xldCBtaW5pbWFsUmVxdWlyZWRXaWR0aD10b3RhbFRhYnNXaWR0aDtpZihpIT09dGFiQ291bnQtMSkKbWluaW1hbFJlcXVpcmVkV2lkdGgrPW1lYXN1cmVkRHJvcERvd25CdXR0b25XaWR0aDtpZighdGhpcy5fdmVydGljYWxUYWJMYXlvdXQmJm1pbmltYWxSZXF1aXJlZFdpZHRoPnRvdGFsV2lkdGgpCmJyZWFrO3RhYnNUb1Nob3dJbmRleGVzLnB1c2godGFic09yZGVyZWQuaW5kZXhPZih0YWIpKTt9CnRhYnNUb1Nob3dJbmRleGVzLnNvcnQoZnVuY3Rpb24oeCx5KXtyZXR1cm4geC15O30pO3JldHVybiB0YWJzVG9TaG93SW5kZXhlczt9Cl9oaWRlQ3VycmVudFRhYigpe2lmKCF0aGlzLl9jdXJyZW50VGFiKQpyZXR1cm47dGhpcy5faGlkZVRhYih0aGlzLl9jdXJyZW50VGFiKTtkZWxldGUgdGhpcy5fY3VycmVudFRhYjt9Cl9zaG93VGFiKHRhYil7dGFiLnRhYkVsZW1lbnQudGFiSW5kZXg9MDt0YWIudGFiRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1VJLkFSSUFVdGlscy5zZXRTZWxlY3RlZCh0YWIudGFiRWxlbWVudCx0cnVlKTt0YWIudmlldy5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fdXBkYXRlVGFiU2xpZGVyKCk7fQpfdXBkYXRlVGFiU2xpZGVyKCl7aWYoIXRoaXMuX3NsaWRlckVuYWJsZWQpCnJldHVybjtpZighdGhpcy5fY3VycmVudFRhYil7dGhpcy5fdGFiU2xpZGVyLnN0eWxlLndpZHRoPTA7cmV0dXJuO30KbGV0IGxlZnQ9MDtmb3IobGV0IGk9MDtpPHRoaXMuX3RhYnMubGVuZ3RoJiZ0aGlzLl9jdXJyZW50VGFiIT09dGhpcy5fdGFic1tpXTtpKyspe2lmKHRoaXMuX3RhYnNbaV0uX3Nob3duKQpsZWZ0Kz10aGlzLl90YWJzW2ldLl9tZWFzdXJlZFdpZHRoO30KY29uc3Qgc2xpZGVyV2lkdGg9dGhpcy5fY3VycmVudFRhYi5fc2hvd24/dGhpcy5fY3VycmVudFRhYi5fbWVhc3VyZWRXaWR0aDp0aGlzLl9kcm9wRG93bkJ1dHRvbi5vZmZzZXRXaWR0aDtjb25zdCBzY2FsZUZhY3Rvcj13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz49MS41Pycgc2NhbGVZKDAuNzUpJzonJzt0aGlzLl90YWJTbGlkZXIuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGVYKCcrbGVmdCsncHgpJytzY2FsZUZhY3Rvcjt0aGlzLl90YWJTbGlkZXIuc3R5bGUud2lkdGg9c2xpZGVyV2lkdGgrJ3B4JztpZih0aGlzLl90YWJTbGlkZXIucGFyZW50RWxlbWVudCE9PXRoaXMuX2hlYWRlckNvbnRlbnRzRWxlbWVudCkKdGhpcy5faGVhZGVyQ29udGVudHNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYlNsaWRlcik7fQpfaGlkZVRhYih0YWIpe3RhYi50YWJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiSW5kZXgnKTt0YWIudGFiRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO3RhYi50YWJFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsJ2ZhbHNlJyk7dGFiLnZpZXcuZGV0YWNoKCk7fQplbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0Zvcigpe3JldHVyblt0aGlzLl9jb250ZW50RWxlbWVudF07fQpfaW5zZXJ0QmVmb3JlKHRhYixpbmRleCl7dGhpcy5fdGFic0VsZW1lbnQuaW5zZXJ0QmVmb3JlKHRhYi50YWJFbGVtZW50LHRoaXMuX3RhYnNFbGVtZW50LmNoaWxkTm9kZXNbaW5kZXhdKTtjb25zdCBvbGRJbmRleD10aGlzLl90YWJzLmluZGV4T2YodGFiKTt0aGlzLl90YWJzLnNwbGljZShvbGRJbmRleCwxKTtpZihvbGRJbmRleDxpbmRleCkKLS1pbmRleDt0aGlzLl90YWJzLnNwbGljZShpbmRleCwwLHRhYik7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiT3JkZXJDaGFuZ2VkLHRoaXMuX3RhYnMpO30KbGVmdFRvb2xiYXIoKXtpZighdGhpcy5fbGVmdFRvb2xiYXIpe3RoaXMuX2xlZnRUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCd0YWJiZWQtcGFuZS1sZWZ0LXRvb2xiYXInKTt0aGlzLl9oZWFkZXJFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9sZWZ0VG9vbGJhci5lbGVtZW50LHRoaXMuX2hlYWRlckVsZW1lbnQuZmlyc3RDaGlsZCk7fQpyZXR1cm4gdGhpcy5fbGVmdFRvb2xiYXI7fQpyaWdodFRvb2xiYXIoKXtpZighdGhpcy5fcmlnaHRUb29sYmFyKXt0aGlzLl9yaWdodFRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3RhYmJlZC1wYW5lLXJpZ2h0LXRvb2xiYXInKTt0aGlzLl9oZWFkZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3JpZ2h0VG9vbGJhci5lbGVtZW50KTt9CnJldHVybiB0aGlzLl9yaWdodFRvb2xiYXI7fQpzZXRBbGxvd1RhYlJlb3JkZXIoYWxsb3csYXV0b21hdGljKXt0aGlzLl9hbGxvd1RhYlJlb3JkZXI9YWxsb3c7dGhpcy5fYXV0b21hdGljUmVvcmRlcj1hdXRvbWF0aWM7fQpfa2V5RG93bihldmVudCl7aWYoIXRoaXMuX2N1cnJlbnRUYWIpCnJldHVybjtsZXQgbmV4dFRhYkVsZW1lbnQ9bnVsbDtzd2l0Y2goZXZlbnQua2V5KXtjYXNlJ0Fycm93VXAnOmNhc2UnQXJyb3dMZWZ0JzpuZXh0VGFiRWxlbWVudD10aGlzLl9jdXJyZW50VGFiLnRhYkVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztpZighbmV4dFRhYkVsZW1lbnQmJiF0aGlzLl9kcm9wRG93bkJ1dHRvbi5wYXJlbnRFbGVtZW50KQpuZXh0VGFiRWxlbWVudD10aGlzLl9jdXJyZW50VGFiLnRhYkVsZW1lbnQucGFyZW50RWxlbWVudC5sYXN0RWxlbWVudENoaWxkO2JyZWFrO2Nhc2UnQXJyb3dEb3duJzpjYXNlJ0Fycm93UmlnaHQnOm5leHRUYWJFbGVtZW50PXRoaXMuX2N1cnJlbnRUYWIudGFiRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7aWYoIW5leHRUYWJFbGVtZW50JiYhdGhpcy5fZHJvcERvd25CdXR0b24ucGFyZW50RWxlbWVudCkKbmV4dFRhYkVsZW1lbnQ9dGhpcy5fY3VycmVudFRhYi50YWJFbGVtZW50LnBhcmVudEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7YnJlYWs7Y2FzZSdFbnRlcic6Y2FzZSdTcGFjZSc6dGhpcy5fY3VycmVudFRhYi52aWV3LmZvY3VzKCk7cmV0dXJuO2RlZmF1bHQ6cmV0dXJuO30KaWYoIW5leHRUYWJFbGVtZW50KXt0aGlzLl9kcm9wRG93bkJ1dHRvbi5jbGljaygpO3JldHVybjt9CmNvbnN0IHRhYj10aGlzLl90YWJzLmZpbmQodGFiPT50YWIudGFiRWxlbWVudD09PW5leHRUYWJFbGVtZW50KTt0aGlzLnNlbGVjdFRhYih0YWIuaWQsdHJ1ZSk7bmV4dFRhYkVsZW1lbnQuZm9jdXMoKTt9fTtVSS5UYWJiZWRQYW5lLkV2ZW50cz17VGFiU2VsZWN0ZWQ6U3ltYm9sKCdUYWJTZWxlY3RlZCcpLFRhYkNsb3NlZDpTeW1ib2woJ1RhYkNsb3NlZCcpLFRhYk9yZGVyQ2hhbmdlZDpTeW1ib2woJ1RhYk9yZGVyQ2hhbmdlZCcpfTtVSS5UYWJiZWRQYW5lVGFiPWNsYXNze2NvbnN0cnVjdG9yKHRhYmJlZFBhbmUsaWQsdGl0bGUsY2xvc2VhYmxlLHZpZXcsdG9vbHRpcCl7dGhpcy5fY2xvc2VhYmxlPWNsb3NlYWJsZTt0aGlzLl90YWJiZWRQYW5lPXRhYmJlZFBhbmU7dGhpcy5faWQ9aWQ7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5fdG9vbHRpcD10b29sdGlwO3RoaXMuX3ZpZXc9dmlldzt0aGlzLl9zaG93bj1mYWxzZTt0aGlzLl9tZWFzdXJlZFdpZHRoO3RoaXMuX3RhYkVsZW1lbnQ7dGhpcy5faWNvbkNvbnRhaW5lcj1udWxsO30KZ2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkO30KZ2V0IHRpdGxlKCl7cmV0dXJuIHRoaXMuX3RpdGxlO30Kc2V0IHRpdGxlKHRpdGxlKXtpZih0aXRsZT09PXRoaXMuX3RpdGxlKQpyZXR1cm47dGhpcy5fdGl0bGU9dGl0bGU7aWYodGhpcy5fdGl0bGVFbGVtZW50KQp0aGlzLl90aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9dGl0bGU7ZGVsZXRlIHRoaXMuX21lYXN1cmVkV2lkdGg7fQppc0Nsb3NlYWJsZSgpe3JldHVybiB0aGlzLl9jbG9zZWFibGU7fQpfc2V0SWNvbihpY29uKXt0aGlzLl9pY29uPWljb247aWYodGhpcy5fdGFiRWxlbWVudCkKdGhpcy5fY3JlYXRlSWNvbkVsZW1lbnQodGhpcy5fdGFiRWxlbWVudCx0aGlzLl90aXRsZUVsZW1lbnQsZmFsc2UpO2RlbGV0ZSB0aGlzLl9tZWFzdXJlZFdpZHRoO30KX3RvZ2dsZUNsYXNzKGNsYXNzTmFtZSxmb3JjZSl7Y29uc3QgZWxlbWVudD10aGlzLnRhYkVsZW1lbnQ7Y29uc3QgaGFzQ2xhc3M9ZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtpZihoYXNDbGFzcz09PWZvcmNlKQpyZXR1cm4gZmFsc2U7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSxmb3JjZSk7ZGVsZXRlIHRoaXMuX21lYXN1cmVkV2lkdGg7cmV0dXJuIHRydWU7fQpnZXQgdmlldygpe3JldHVybiB0aGlzLl92aWV3O30Kc2V0IHZpZXcodmlldyl7dGhpcy5fdmlldz12aWV3O30KZ2V0IHRvb2x0aXAoKXtyZXR1cm4gdGhpcy5fdG9vbHRpcDt9CnNldCB0b29sdGlwKHRvb2x0aXApe3RoaXMuX3Rvb2x0aXA9dG9vbHRpcDtpZih0aGlzLl90aXRsZUVsZW1lbnQpCnRoaXMuX3RpdGxlRWxlbWVudC50aXRsZT10b29sdGlwfHwnJzt9CmdldCB0YWJFbGVtZW50KCl7aWYoIXRoaXMuX3RhYkVsZW1lbnQpCnRoaXMuX3RhYkVsZW1lbnQ9dGhpcy5fY3JlYXRlVGFiRWxlbWVudChmYWxzZSk7cmV0dXJuIHRoaXMuX3RhYkVsZW1lbnQ7fQp3aWR0aCgpe3JldHVybiB0aGlzLl93aWR0aDt9CnNldFdpZHRoKHdpZHRoKXt0aGlzLnRhYkVsZW1lbnQuc3R5bGUud2lkdGg9d2lkdGg9PT0tMT8nJzood2lkdGgrJ3B4Jyk7dGhpcy5fd2lkdGg9d2lkdGg7fQpzZXREZWxlZ2F0ZShkZWxlZ2F0ZSl7dGhpcy5fZGVsZWdhdGU9ZGVsZWdhdGU7fQpfY3JlYXRlSWNvbkVsZW1lbnQodGFiRWxlbWVudCx0aXRsZUVsZW1lbnQsbWVhc3VyaW5nKXtpZih0YWJFbGVtZW50Ll9faWNvbkVsZW1lbnQpe3RhYkVsZW1lbnQuX19pY29uRWxlbWVudC5yZW1vdmUoKTt0YWJFbGVtZW50Ll9faWNvbkVsZW1lbnQ9bnVsbDt9CmlmKCF0aGlzLl9pY29uKQpyZXR1cm47Y29uc3QgaWNvbkNvbnRhaW5lcj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywndGFiYmVkLXBhbmUtaGVhZGVyLXRhYi1pY29uJyk7Y29uc3QgaWNvbk5vZGU9bWVhc3VyaW5nP3RoaXMuX2ljb24uY2xvbmVOb2RlKHRydWUpOnRoaXMuX2ljb247aWNvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uTm9kZSk7dGFiRWxlbWVudC5pbnNlcnRCZWZvcmUoaWNvbkNvbnRhaW5lcix0aXRsZUVsZW1lbnQpO3RhYkVsZW1lbnQuX19pY29uRWxlbWVudD1pY29uQ29udGFpbmVyO30KX2NyZWF0ZVRhYkVsZW1lbnQobWVhc3VyaW5nKXtjb25zdCB0YWJFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RhYmJlZC1wYW5lLWhlYWRlci10YWInKTt0YWJFbGVtZW50LmlkPSd0YWItJyt0aGlzLl9pZDtVSS5BUklBVXRpbHMubWFya0FzVGFiKHRhYkVsZW1lbnQpO1VJLkFSSUFVdGlscy5zZXRTZWxlY3RlZCh0YWJFbGVtZW50LGZhbHNlKTtjb25zdCB0aXRsZUVsZW1lbnQ9dGFiRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3RhYmJlZC1wYW5lLWhlYWRlci10YWItdGl0bGUnKTt0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy50aXRsZTt0aXRsZUVsZW1lbnQudGl0bGU9dGhpcy50b29sdGlwfHwnJzt0aGlzLl9jcmVhdGVJY29uRWxlbWVudCh0YWJFbGVtZW50LHRpdGxlRWxlbWVudCxtZWFzdXJpbmcpO2lmKCFtZWFzdXJpbmcpCnRoaXMuX3RpdGxlRWxlbWVudD10aXRsZUVsZW1lbnQ7aWYodGhpcy5fY2xvc2VhYmxlKXt0YWJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0YWJiZWQtcGFuZS1jbG9zZS1idXR0b24nLCdkdC1jbG9zZS1idXR0b24nKS5ncmF5PXRydWU7dGFiRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjbG9zZWFibGUnKTt9CmlmKG1lYXN1cmluZyl7dGFiRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtZWFzdXJpbmcnKTt9ZWxzZXt0YWJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl90YWJDbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO3RhYkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLHRoaXMuX3RhYkNsaWNrZWQuYmluZCh0aGlzKSxmYWxzZSk7dGFiRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX3RhYk1vdXNlRG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0YWJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMuX3RhYk1vdXNlVXAuYmluZCh0aGlzKSxmYWxzZSk7dGFiRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fdGFiQ29udGV4dE1lbnUuYmluZCh0aGlzKSxmYWxzZSk7aWYodGhpcy5fdGFiYmVkUGFuZS5fYWxsb3dUYWJSZW9yZGVyKXtVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0YWJFbGVtZW50LHRoaXMuX3N0YXJ0VGFiRHJhZ2dpbmcuYmluZCh0aGlzKSx0aGlzLl90YWJEcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX2VuZFRhYkRyYWdnaW5nLmJpbmQodGhpcyksJy13ZWJraXQtZ3JhYmJpbmcnLCdwb2ludGVyJywyMDApO319CnJldHVybiB0YWJFbGVtZW50O30KX3RhYkNsaWNrZWQoZXZlbnQpe2NvbnN0IG1pZGRsZUJ1dHRvbj1ldmVudC5idXR0b249PT0xO2NvbnN0IHNob3VsZENsb3NlPXRoaXMuX2Nsb3NlYWJsZSYmKG1pZGRsZUJ1dHRvbnx8ZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygndGFiYmVkLXBhbmUtY2xvc2UtYnV0dG9uJykpO2lmKCFzaG91bGRDbG9zZSl7dGhpcy5fdGFiYmVkUGFuZS5mb2N1cygpO3JldHVybjt9CnRoaXMuX2Nsb3NlVGFicyhbdGhpcy5pZF0pO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfdGFiTW91c2VEb3duKGV2ZW50KXtpZihldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0YWJiZWQtcGFuZS1jbG9zZS1idXR0b24nKXx8ZXZlbnQuYnV0dG9uPT09MSkKcmV0dXJuO3RoaXMuX3RhYmJlZFBhbmUuc2VsZWN0VGFiKHRoaXMuaWQsdHJ1ZSk7fQpfdGFiTW91c2VVcChldmVudCl7aWYoZXZlbnQuYnV0dG9uPT09MSkKZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9jbG9zZVRhYnMoaWRzKXtpZih0aGlzLl9kZWxlZ2F0ZSl7dGhpcy5fZGVsZWdhdGUuY2xvc2VUYWJzKHRoaXMuX3RhYmJlZFBhbmUsaWRzKTtyZXR1cm47fQp0aGlzLl90YWJiZWRQYW5lLmNsb3NlVGFicyhpZHMsdHJ1ZSk7fQpfdGFiQ29udGV4dE1lbnUoZXZlbnQpe2Z1bmN0aW9uIGNsb3NlKCl7dGhpcy5fY2xvc2VUYWJzKFt0aGlzLmlkXSk7fQpmdW5jdGlvbiBjbG9zZU90aGVycygpe3RoaXMuX2Nsb3NlVGFicyh0aGlzLl90YWJiZWRQYW5lLm90aGVyVGFicyh0aGlzLmlkKSk7fQpmdW5jdGlvbiBjbG9zZUFsbCgpe3RoaXMuX2Nsb3NlVGFicyh0aGlzLl90YWJiZWRQYW5lLmFsbFRhYnMoKSk7fQpmdW5jdGlvbiBjbG9zZVRvVGhlUmlnaHQoKXt0aGlzLl9jbG9zZVRhYnModGhpcy5fdGFiYmVkUGFuZS5fdGFic1RvVGhlUmlnaHQodGhpcy5pZCkpO30KY29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtpZih0aGlzLl9jbG9zZWFibGUpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0Nsb3NlJyksY2xvc2UuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xvc2Ugb3RoZXJzJyksY2xvc2VPdGhlcnMuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xvc2UgdGFicyB0byB0aGUgcmlnaHQnKSxjbG9zZVRvVGhlUmlnaHQuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xvc2UgYWxsJyksY2xvc2VBbGwuYmluZCh0aGlzKSk7fQppZih0aGlzLl9kZWxlZ2F0ZSkKdGhpcy5fZGVsZWdhdGUub25Db250ZXh0TWVudSh0aGlzLmlkLGNvbnRleHRNZW51KTtjb250ZXh0TWVudS5zaG93KCk7fQpfc3RhcnRUYWJEcmFnZ2luZyhldmVudCl7aWYoZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygndGFiYmVkLXBhbmUtY2xvc2UtYnV0dG9uJykpCnJldHVybiBmYWxzZTt0aGlzLl9kcmFnU3RhcnRYPWV2ZW50LnBhZ2VYO3RoaXMuX3RhYkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dpbmcnKTt0aGlzLl90YWJiZWRQYW5lLl90YWJTbGlkZXIucmVtb3ZlKCk7cmV0dXJuIHRydWU7fQpfdGFiRHJhZ2dpbmcoZXZlbnQpe2NvbnN0IHRhYkVsZW1lbnRzPXRoaXMuX3RhYmJlZFBhbmUuX3RhYnNFbGVtZW50LmNoaWxkTm9kZXM7Zm9yKGxldCBpPTA7aTx0YWJFbGVtZW50cy5sZW5ndGg7KytpKXtsZXQgdGFiRWxlbWVudD10YWJFbGVtZW50c1tpXTtpZih0YWJFbGVtZW50PT09dGhpcy5fdGFiRWxlbWVudCkKY29udGludWU7Y29uc3QgaW50ZXJzZWN0cz10YWJFbGVtZW50Lm9mZnNldExlZnQrdGFiRWxlbWVudC5jbGllbnRXaWR0aD50aGlzLl90YWJFbGVtZW50Lm9mZnNldExlZnQmJnRoaXMuX3RhYkVsZW1lbnQub2Zmc2V0TGVmdCt0aGlzLl90YWJFbGVtZW50LmNsaWVudFdpZHRoPnRhYkVsZW1lbnQub2Zmc2V0TGVmdDtpZighaW50ZXJzZWN0cykKY29udGludWU7aWYoTWF0aC5hYnMoZXZlbnQucGFnZVgtdGhpcy5fZHJhZ1N0YXJ0WCk8dGFiRWxlbWVudC5jbGllbnRXaWR0aC8yKzUpCmJyZWFrO2lmKGV2ZW50LnBhZ2VYLXRoaXMuX2RyYWdTdGFydFg+MCl7dGFiRWxlbWVudD10YWJFbGVtZW50Lm5leHRTaWJsaW5nOysraTt9CmNvbnN0IG9sZE9mZnNldExlZnQ9dGhpcy5fdGFiRWxlbWVudC5vZmZzZXRMZWZ0O3RoaXMuX3RhYmJlZFBhbmUuX2luc2VydEJlZm9yZSh0aGlzLGkpO3RoaXMuX2RyYWdTdGFydFgrPXRoaXMuX3RhYkVsZW1lbnQub2Zmc2V0TGVmdC1vbGRPZmZzZXRMZWZ0O2JyZWFrO30KaWYoIXRoaXMuX3RhYkVsZW1lbnQucHJldmlvdXNTaWJsaW5nJiZldmVudC5wYWdlWC10aGlzLl9kcmFnU3RhcnRYPDApe3RoaXMuX3RhYkVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2xlZnQnLCcwcHgnKTtyZXR1cm47fQppZighdGhpcy5fdGFiRWxlbWVudC5uZXh0U2libGluZyYmZXZlbnQucGFnZVgtdGhpcy5fZHJhZ1N0YXJ0WD4wKXt0aGlzLl90YWJFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCdsZWZ0JywnMHB4Jyk7cmV0dXJuO30KdGhpcy5fdGFiRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsKGV2ZW50LnBhZ2VYLXRoaXMuX2RyYWdTdGFydFgpKydweCcpO30KX2VuZFRhYkRyYWdnaW5nKGV2ZW50KXt0aGlzLl90YWJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7dGhpcy5fdGFiRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO2RlbGV0ZSB0aGlzLl9kcmFnU3RhcnRYO3RoaXMuX3RhYmJlZFBhbmUuX3VwZGF0ZVRhYlNsaWRlcigpO319O1VJLlRhYmJlZFBhbmVUYWJEZWxlZ2F0ZT1mdW5jdGlvbigpe307VUkuVGFiYmVkUGFuZVRhYkRlbGVnYXRlLnByb3RvdHlwZT17Y2xvc2VUYWJzKHRhYmJlZFBhbmUsaWRzKXt9LG9uQ29udGV4dE1lbnUodGFiSWQsY29udGV4dE1lbnUpe319OztVSS5oaWdobGlnaHRlZFNlYXJjaFJlc3VsdENsYXNzTmFtZT0naGlnaGxpZ2h0ZWQtc2VhcmNoLXJlc3VsdCc7VUkuaGlnaGxpZ2h0ZWRDdXJyZW50U2VhcmNoUmVzdWx0Q2xhc3NOYW1lPSdjdXJyZW50LXNlYXJjaC1yZXN1bHQnO1VJLmluc3RhbGxEcmFnSGFuZGxlPWZ1bmN0aW9uKGVsZW1lbnQsZWxlbWVudERyYWdTdGFydCxlbGVtZW50RHJhZyxlbGVtZW50RHJhZ0VuZCxjdXJzb3IsaG92ZXJDdXJzb3Isc3RhcnREZWxheSl7ZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpe2NvbnN0IGRyYWdIYW5kbGVyPW5ldyBVSS5EcmFnSGFuZGxlcigpO2NvbnN0IGRyYWdTdGFydD1kcmFnSGFuZGxlci5lbGVtZW50RHJhZ1N0YXJ0LmJpbmQoZHJhZ0hhbmRsZXIsZWxlbWVudCxlbGVtZW50RHJhZ1N0YXJ0LGVsZW1lbnREcmFnLGVsZW1lbnREcmFnRW5kLGN1cnNvcixldmVudCk7aWYoc3RhcnREZWxheSkKc3RhcnRUaW1lcj1zZXRUaW1lb3V0KGRyYWdTdGFydCxzdGFydERlbGF5KTtlbHNlCmRyYWdTdGFydCgpO30KZnVuY3Rpb24gb25Nb3VzZVVwKCl7aWYoc3RhcnRUaW1lcikKY2xlYXJUaW1lb3V0KHN0YXJ0VGltZXIpO3N0YXJ0VGltZXI9bnVsbDt9CmxldCBzdGFydFRpbWVyO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxvbk1vdXNlRG93bixmYWxzZSk7aWYoc3RhcnREZWxheSkKZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxvbk1vdXNlVXAsZmFsc2UpO2lmKGhvdmVyQ3Vyc29yIT09bnVsbCkKZWxlbWVudC5zdHlsZS5jdXJzb3I9aG92ZXJDdXJzb3J8fGN1cnNvcnx8Jyc7fTtVSS5lbGVtZW50RHJhZ1N0YXJ0PWZ1bmN0aW9uKHRhcmdldEVsZW1lbnQsZWxlbWVudERyYWdTdGFydCxlbGVtZW50RHJhZyxlbGVtZW50RHJhZ0VuZCxjdXJzb3IsZXZlbnQpe2NvbnN0IGRyYWdIYW5kbGVyPW5ldyBVSS5EcmFnSGFuZGxlcigpO2RyYWdIYW5kbGVyLmVsZW1lbnREcmFnU3RhcnQodGFyZ2V0RWxlbWVudCxlbGVtZW50RHJhZ1N0YXJ0LGVsZW1lbnREcmFnLGVsZW1lbnREcmFnRW5kLGN1cnNvcixldmVudCk7fTtVSS5EcmFnSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2VsZW1lbnREcmFnTW92ZT10aGlzLl9lbGVtZW50RHJhZ01vdmUuYmluZCh0aGlzKTt0aGlzLl9lbGVtZW50RHJhZ0VuZD10aGlzLl9lbGVtZW50RHJhZ0VuZC5iaW5kKHRoaXMpO3RoaXMuX21vdXNlT3V0V2hpbGVEcmFnZ2luZz10aGlzLl9tb3VzZU91dFdoaWxlRHJhZ2dpbmcuYmluZCh0aGlzKTt9Cl9jcmVhdGVHbGFzc1BhbmUoKXt0aGlzLl9nbGFzc1BhbmVJblVzZT10cnVlO2lmKCFVSS5EcmFnSGFuZGxlci5fZ2xhc3NQYW5lVXNhZ2VDb3VudCsrKXtVSS5EcmFnSGFuZGxlci5fZ2xhc3NQYW5lPW5ldyBVSS5HbGFzc1BhbmUoKTtVSS5EcmFnSGFuZGxlci5fZ2xhc3NQYW5lLnNldFBvaW50ZXJFdmVudHNCZWhhdmlvcihVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLkJsb2NrZWRCeUdsYXNzUGFuZSk7VUkuRHJhZ0hhbmRsZXIuX2dsYXNzUGFuZS5zaG93KFVJLkRyYWdIYW5kbGVyLl9kb2N1bWVudEZvck1vdXNlT3V0KTt9fQpfZGlzcG9zZUdsYXNzUGFuZSgpe2lmKCF0aGlzLl9nbGFzc1BhbmVJblVzZSkKcmV0dXJuO3RoaXMuX2dsYXNzUGFuZUluVXNlPWZhbHNlO2lmKC0tVUkuRHJhZ0hhbmRsZXIuX2dsYXNzUGFuZVVzYWdlQ291bnQpCnJldHVybjtVSS5EcmFnSGFuZGxlci5fZ2xhc3NQYW5lLmhpZGUoKTtkZWxldGUgVUkuRHJhZ0hhbmRsZXIuX2dsYXNzUGFuZTtkZWxldGUgVUkuRHJhZ0hhbmRsZXIuX2RvY3VtZW50Rm9yTW91c2VPdXQ7fQplbGVtZW50RHJhZ1N0YXJ0KHRhcmdldEVsZW1lbnQsZWxlbWVudERyYWdTdGFydCxlbGVtZW50RHJhZyxlbGVtZW50RHJhZ0VuZCxjdXJzb3IsZXZlbnQpe2lmKGV2ZW50LmJ1dHRvbnx8KEhvc3QuaXNNYWMoKSYmZXZlbnQuY3RybEtleSkpCnJldHVybjtpZih0aGlzLl9lbGVtZW50RHJhZ2dpbmdFdmVudExpc3RlbmVyKQpyZXR1cm47aWYoZWxlbWVudERyYWdTdGFydCYmIWVsZW1lbnREcmFnU3RhcnQoKGV2ZW50KSkpCnJldHVybjtjb25zdCB0YXJnZXREb2N1bWVudD1ldmVudC50YXJnZXQub3duZXJEb2N1bWVudDt0aGlzLl9lbGVtZW50RHJhZ2dpbmdFdmVudExpc3RlbmVyPWVsZW1lbnREcmFnO3RoaXMuX2VsZW1lbnRFbmREcmFnZ2luZ0V2ZW50TGlzdGVuZXI9ZWxlbWVudERyYWdFbmQ7Y29uc29sZS5hc3NlcnQoKFVJLkRyYWdIYW5kbGVyLl9kb2N1bWVudEZvck1vdXNlT3V0fHx0YXJnZXREb2N1bWVudCk9PT10YXJnZXREb2N1bWVudCwnRHJhZ2dpbmcgb24gbXVsdGlwbGUgZG9jdW1lbnRzLicpO1VJLkRyYWdIYW5kbGVyLl9kb2N1bWVudEZvck1vdXNlT3V0PXRhcmdldERvY3VtZW50O3RoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudD10YXJnZXREb2N1bWVudDt0cnl7dGhpcy5fZHJhZ0V2ZW50c1RhcmdldERvY3VtZW50VG9wPXRhcmdldERvY3VtZW50LmRlZmF1bHRWaWV3LnRvcC5kb2N1bWVudDt9Y2F0Y2goZSl7dGhpcy5fZHJhZ0V2ZW50c1RhcmdldERvY3VtZW50VG9wPXRoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudDt9CnRhcmdldERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fZWxlbWVudERyYWdNb3ZlLHRydWUpO3RhcmdldERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMuX2VsZW1lbnREcmFnRW5kLHRydWUpO3RhcmdldERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0Jyx0aGlzLl9tb3VzZU91dFdoaWxlRHJhZ2dpbmcsdHJ1ZSk7aWYodGFyZ2V0RG9jdW1lbnQhPT10aGlzLl9kcmFnRXZlbnRzVGFyZ2V0RG9jdW1lbnRUb3ApCnRoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudFRvcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx0aGlzLl9lbGVtZW50RHJhZ0VuZCx0cnVlKTtpZih0eXBlb2YgY3Vyc29yPT09J3N0cmluZycpe3RoaXMuX3Jlc3RvcmVDdXJzb3JBZnRlckRyYWc9cmVzdG9yZUN1cnNvci5iaW5kKHRoaXMsdGFyZ2V0RWxlbWVudC5zdHlsZS5jdXJzb3IpO3RhcmdldEVsZW1lbnQuc3R5bGUuY3Vyc29yPWN1cnNvcjt0YXJnZXREb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj1jdXJzb3I7fQpmdW5jdGlvbiByZXN0b3JlQ3Vyc29yKG9sZEN1cnNvcil7dGFyZ2V0RG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY3Vyc29yJyk7dGFyZ2V0RWxlbWVudC5zdHlsZS5jdXJzb3I9b2xkQ3Vyc29yO3RoaXMuX3Jlc3RvcmVDdXJzb3JBZnRlckRyYWc9bnVsbDt9CmV2ZW50LnByZXZlbnREZWZhdWx0KCk7fQpfbW91c2VPdXRXaGlsZURyYWdnaW5nKCl7dGhpcy5fdW5yZWdpc3Rlck1vdXNlT3V0V2hpbGVEcmFnZ2luZygpO3RoaXMuX2NyZWF0ZUdsYXNzUGFuZSgpO30KX3VucmVnaXN0ZXJNb3VzZU91dFdoaWxlRHJhZ2dpbmcoKXtpZighVUkuRHJhZ0hhbmRsZXIuX2RvY3VtZW50Rm9yTW91c2VPdXQpCnJldHVybjtVSS5EcmFnSGFuZGxlci5fZG9jdW1lbnRGb3JNb3VzZU91dC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsdGhpcy5fbW91c2VPdXRXaGlsZURyYWdnaW5nLHRydWUpO30KX3VucmVnaXN0ZXJEcmFnRXZlbnRzKCl7aWYoIXRoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudCkKcmV0dXJuO3RoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX2VsZW1lbnREcmFnTW92ZSx0cnVlKTt0aGlzLl9kcmFnRXZlbnRzVGFyZ2V0RG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fZWxlbWVudERyYWdFbmQsdHJ1ZSk7aWYodGhpcy5fZHJhZ0V2ZW50c1RhcmdldERvY3VtZW50IT09dGhpcy5fZHJhZ0V2ZW50c1RhcmdldERvY3VtZW50VG9wKQp0aGlzLl9kcmFnRXZlbnRzVGFyZ2V0RG9jdW1lbnRUb3AucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fZWxlbWVudERyYWdFbmQsdHJ1ZSk7ZGVsZXRlIHRoaXMuX2RyYWdFdmVudHNUYXJnZXREb2N1bWVudDtkZWxldGUgdGhpcy5fZHJhZ0V2ZW50c1RhcmdldERvY3VtZW50VG9wO30KX2VsZW1lbnREcmFnTW92ZShldmVudCl7aWYoZXZlbnQuYnV0dG9ucyE9PTEpe3RoaXMuX2VsZW1lbnREcmFnRW5kKGV2ZW50KTtyZXR1cm47fQppZih0aGlzLl9lbGVtZW50RHJhZ2dpbmdFdmVudExpc3RlbmVyKChldmVudCkpKQp0aGlzLl9jYW5jZWxEcmFnRXZlbnRzKGV2ZW50KTt9Cl9jYW5jZWxEcmFnRXZlbnRzKGV2ZW50KXt0aGlzLl91bnJlZ2lzdGVyRHJhZ0V2ZW50cygpO3RoaXMuX3VucmVnaXN0ZXJNb3VzZU91dFdoaWxlRHJhZ2dpbmcoKTtpZih0aGlzLl9yZXN0b3JlQ3Vyc29yQWZ0ZXJEcmFnKQp0aGlzLl9yZXN0b3JlQ3Vyc29yQWZ0ZXJEcmFnKCk7dGhpcy5fZGlzcG9zZUdsYXNzUGFuZSgpO2RlbGV0ZSB0aGlzLl9lbGVtZW50RHJhZ2dpbmdFdmVudExpc3RlbmVyO2RlbGV0ZSB0aGlzLl9lbGVtZW50RW5kRHJhZ2dpbmdFdmVudExpc3RlbmVyO30KX2VsZW1lbnREcmFnRW5kKGV2ZW50KXtjb25zdCBlbGVtZW50RHJhZ0VuZD10aGlzLl9lbGVtZW50RW5kRHJhZ2dpbmdFdmVudExpc3RlbmVyO3RoaXMuX2NhbmNlbERyYWdFdmVudHMoKGV2ZW50KSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihlbGVtZW50RHJhZ0VuZCkKZWxlbWVudERyYWdFbmQoKGV2ZW50KSk7fX07VUkuRHJhZ0hhbmRsZXIuX2dsYXNzUGFuZVVzYWdlQ291bnQ9MDtVSS5pc0JlaW5nRWRpdGVkPWZ1bmN0aW9uKG5vZGUpe2lmKCFub2RlfHxub2RlLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpCnJldHVybiBmYWxzZTtsZXQgZWxlbWVudD0obm9kZSk7aWYoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3RleHQtcHJvbXB0Jyl8fGVsZW1lbnQubm9kZU5hbWU9PT0nSU5QVVQnfHxlbGVtZW50Lm5vZGVOYW1lPT09J1RFWFRBUkVBJykKcmV0dXJuIHRydWU7aWYoIVVJLl9fZWRpdGluZ0NvdW50KQpyZXR1cm4gZmFsc2U7d2hpbGUoZWxlbWVudCl7aWYoZWxlbWVudC5fX2VkaXRpbmcpCnJldHVybiB0cnVlO2VsZW1lbnQ9ZWxlbWVudC5wYXJlbnRFbGVtZW50T3JTaGFkb3dIb3N0KCk7fQpyZXR1cm4gZmFsc2U7fTtVSS5pc0VkaXRpbmc9ZnVuY3Rpb24oKXtpZihVSS5fX2VkaXRpbmdDb3VudCkKcmV0dXJuIHRydWU7Y29uc3QgZm9jdXNlZD1kb2N1bWVudC5kZWVwQWN0aXZlRWxlbWVudCgpO2lmKCFmb2N1c2VkKQpyZXR1cm4gZmFsc2U7cmV0dXJuIGZvY3VzZWQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0ZXh0LXByb21wdCcpfHxmb2N1c2VkLm5vZGVOYW1lPT09J0lOUFVUJ3x8Zm9jdXNlZC5ub2RlTmFtZT09PSdURVhUQVJFQSc7fTtVSS5tYXJrQmVpbmdFZGl0ZWQ9ZnVuY3Rpb24oZWxlbWVudCx2YWx1ZSl7aWYodmFsdWUpe2lmKGVsZW1lbnQuX19lZGl0aW5nKQpyZXR1cm4gZmFsc2U7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdiZWluZy1lZGl0ZWQnKTtlbGVtZW50Ll9fZWRpdGluZz10cnVlO1VJLl9fZWRpdGluZ0NvdW50PShVSS5fX2VkaXRpbmdDb3VudHx8MCkrMTt9ZWxzZXtpZighZWxlbWVudC5fX2VkaXRpbmcpCnJldHVybiBmYWxzZTtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2JlaW5nLWVkaXRlZCcpO2RlbGV0ZSBlbGVtZW50Ll9fZWRpdGluZzstLVVJLl9fZWRpdGluZ0NvdW50O30KcmV0dXJuIHRydWU7fTtVSS5fbnVtYmVyUmVnZXg9L14oLT8oPzpcZCsoPzpcLlxkKyk/fFwuXGQrKSkkLztVSS5TdHlsZVZhbHVlRGVsaW1pdGVycz0nIFx4QTBcdFxuIlwnOjssLygpJztVSS5fdmFsdWVNb2RpZmljYXRpb25EaXJlY3Rpb249ZnVuY3Rpb24oZXZlbnQpe2xldCBkaXJlY3Rpb249bnVsbDtpZihldmVudC50eXBlPT09J21vdXNld2hlZWwnKXtpZihldmVudC53aGVlbERlbHRhWT4wfHxldmVudC53aGVlbERlbHRhWD4wKQpkaXJlY3Rpb249J1VwJztlbHNlIGlmKGV2ZW50LndoZWVsRGVsdGFZPDB8fGV2ZW50LndoZWVsRGVsdGFYPDApCmRpcmVjdGlvbj0nRG93bic7fWVsc2V7aWYoZXZlbnQua2V5PT09J0Fycm93VXAnfHxldmVudC5rZXk9PT0nUGFnZVVwJykKZGlyZWN0aW9uPSdVcCc7ZWxzZSBpZihldmVudC5rZXk9PT0nQXJyb3dEb3duJ3x8ZXZlbnQua2V5PT09J1BhZ2VEb3duJykKZGlyZWN0aW9uPSdEb3duJzt9CnJldHVybiBkaXJlY3Rpb247fTtVSS5fbW9kaWZpZWRIZXhWYWx1ZT1mdW5jdGlvbihoZXhTdHJpbmcsZXZlbnQpe2NvbnN0IGRpcmVjdGlvbj1VSS5fdmFsdWVNb2RpZmljYXRpb25EaXJlY3Rpb24oZXZlbnQpO2lmKCFkaXJlY3Rpb24pCnJldHVybiBudWxsO2NvbnN0IG1vdXNlRXZlbnQ9KGV2ZW50KTtjb25zdCBudW1iZXI9cGFyc2VJbnQoaGV4U3RyaW5nLDE2KTtpZihpc05hTihudW1iZXIpfHwhaXNGaW5pdGUobnVtYmVyKSkKcmV0dXJuIG51bGw7Y29uc3QgaGV4U3RyTGVuPWhleFN0cmluZy5sZW5ndGg7Y29uc3QgY2hhbm5lbExlbj1oZXhTdHJMZW4vMztpZihjaGFubmVsTGVuIT09MSYmY2hhbm5lbExlbiE9PTIpCnJldHVybiBudWxsO2xldCBkZWx0YT0wO2lmKFVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKG1vdXNlRXZlbnQpKQpkZWx0YSs9TWF0aC5wb3coMTYsY2hhbm5lbExlbioyKTtpZihtb3VzZUV2ZW50LnNoaWZ0S2V5KQpkZWx0YSs9TWF0aC5wb3coMTYsY2hhbm5lbExlbik7aWYobW91c2VFdmVudC5hbHRLZXkpCmRlbHRhKz0xO2lmKGRlbHRhPT09MCkKZGVsdGE9MTtpZihkaXJlY3Rpb249PT0nRG93bicpCmRlbHRhKj0tMTtjb25zdCBtYXhWYWx1ZT1NYXRoLnBvdygxNixoZXhTdHJMZW4pLTE7Y29uc3QgcmVzdWx0PU51bWJlci5jb25zdHJhaW4obnVtYmVyK2RlbHRhLDAsbWF4VmFsdWUpO2xldCByZXN1bHRTdHJpbmc9cmVzdWx0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO2ZvcihsZXQgaT0wLGxlbmd0aERlbHRhPWhleFN0ckxlbi1yZXN1bHRTdHJpbmcubGVuZ3RoO2k8bGVuZ3RoRGVsdGE7KytpKQpyZXN1bHRTdHJpbmc9JzAnK3Jlc3VsdFN0cmluZztyZXR1cm4gcmVzdWx0U3RyaW5nO307VUkuX21vZGlmaWVkRmxvYXROdW1iZXI9ZnVuY3Rpb24obnVtYmVyLGV2ZW50LG1vZGlmaWVyTXVsdGlwbGllcil7Y29uc3QgZGlyZWN0aW9uPVVJLl92YWx1ZU1vZGlmaWNhdGlvbkRpcmVjdGlvbihldmVudCk7aWYoIWRpcmVjdGlvbikKcmV0dXJuIG51bGw7Y29uc3QgbW91c2VFdmVudD0oZXZlbnQpO2xldCBkZWx0YT0xO2lmKFVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKG1vdXNlRXZlbnQpKQpkZWx0YT0xMDA7ZWxzZSBpZihtb3VzZUV2ZW50LnNoaWZ0S2V5KQpkZWx0YT0xMDtlbHNlIGlmKG1vdXNlRXZlbnQuYWx0S2V5KQpkZWx0YT0wLjE7aWYoZGlyZWN0aW9uPT09J0Rvd24nKQpkZWx0YSo9LTE7aWYobW9kaWZpZXJNdWx0aXBsaWVyKQpkZWx0YSo9bW9kaWZpZXJNdWx0aXBsaWVyO2NvbnN0IHJlc3VsdD1OdW1iZXIoKG51bWJlcitkZWx0YSkudG9GaXhlZCg2KSk7aWYoIVN0cmluZyhyZXN1bHQpLm1hdGNoKFVJLl9udW1iZXJSZWdleCkpCnJldHVybiBudWxsO3JldHVybiByZXN1bHQ7fTtVSS5jcmVhdGVSZXBsYWNlbWVudFN0cmluZz1mdW5jdGlvbih3b3JkU3RyaW5nLGV2ZW50LGN1c3RvbU51bWJlckhhbmRsZXIpe2xldCBwcmVmaXg7bGV0IHN1ZmZpeDtsZXQgbnVtYmVyO2xldCByZXBsYWNlbWVudFN0cmluZz1udWxsO2xldCBtYXRjaGVzPS8oLiojKShbXGRhLWZBLUZdKykoLiopLy5leGVjKHdvcmRTdHJpbmcpO2lmKG1hdGNoZXMmJm1hdGNoZXMubGVuZ3RoKXtwcmVmaXg9bWF0Y2hlc1sxXTtzdWZmaXg9bWF0Y2hlc1szXTtudW1iZXI9VUkuX21vZGlmaWVkSGV4VmFsdWUobWF0Y2hlc1syXSxldmVudCk7aWYobnVtYmVyIT09bnVsbCkKcmVwbGFjZW1lbnRTdHJpbmc9cHJlZml4K251bWJlcitzdWZmaXg7fWVsc2V7bWF0Y2hlcz0vKC4qPykoLT8oPzpcZCsoPzpcLlxkKyk/fFwuXGQrKSkoLiopLy5leGVjKHdvcmRTdHJpbmcpO2lmKG1hdGNoZXMmJm1hdGNoZXMubGVuZ3RoKXtwcmVmaXg9bWF0Y2hlc1sxXTtzdWZmaXg9bWF0Y2hlc1szXTtudW1iZXI9VUkuX21vZGlmaWVkRmxvYXROdW1iZXIocGFyc2VGbG9hdChtYXRjaGVzWzJdKSxldmVudCk7aWYobnVtYmVyIT09bnVsbCl7cmVwbGFjZW1lbnRTdHJpbmc9Y3VzdG9tTnVtYmVySGFuZGxlcj9jdXN0b21OdW1iZXJIYW5kbGVyKHByZWZpeCxudW1iZXIsc3VmZml4KTpwcmVmaXgrbnVtYmVyK3N1ZmZpeDt9fX0KcmV0dXJuIHJlcGxhY2VtZW50U3RyaW5nO307VUkuaGFuZGxlRWxlbWVudFZhbHVlTW9kaWZpY2F0aW9ucz1mdW5jdGlvbihldmVudCxlbGVtZW50LGZpbmlzaEhhbmRsZXIsc3VnZ2VzdGlvbkhhbmRsZXIsY3VzdG9tTnVtYmVySGFuZGxlcil7ZnVuY3Rpb24gY3JlYXRlUmFuZ2UoKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTt9CmNvbnN0IGFycm93S2V5T3JNb3VzZVdoZWVsRXZlbnQ9KGV2ZW50LmtleT09PSdBcnJvd1VwJ3x8ZXZlbnQua2V5PT09J0Fycm93RG93bid8fGV2ZW50LnR5cGU9PT0nbW91c2V3aGVlbCcpO2NvbnN0IHBhZ2VLZXlQcmVzc2VkPShldmVudC5rZXk9PT0nUGFnZVVwJ3x8ZXZlbnQua2V5PT09J1BhZ2VEb3duJyk7aWYoIWFycm93S2V5T3JNb3VzZVdoZWVsRXZlbnQmJiFwYWdlS2V5UHJlc3NlZCkKcmV0dXJuIGZhbHNlO2NvbnN0IHNlbGVjdGlvbj1lbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpO2lmKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkKcmV0dXJuIGZhbHNlO2NvbnN0IHNlbGVjdGlvblJhbmdlPXNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO2lmKCFzZWxlY3Rpb25SYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5pc1NlbGZPckRlc2NlbmRhbnQoZWxlbWVudCkpCnJldHVybiBmYWxzZTtjb25zdCBvcmlnaW5hbFZhbHVlPWVsZW1lbnQudGV4dENvbnRlbnQ7Y29uc3Qgd29yZFJhbmdlPXNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLnJhbmdlT2ZXb3JkKHNlbGVjdGlvblJhbmdlLnN0YXJ0T2Zmc2V0LFVJLlN0eWxlVmFsdWVEZWxpbWl0ZXJzLGVsZW1lbnQpO2NvbnN0IHdvcmRTdHJpbmc9d29yZFJhbmdlLnRvU3RyaW5nKCk7aWYoc3VnZ2VzdGlvbkhhbmRsZXImJnN1Z2dlc3Rpb25IYW5kbGVyKHdvcmRTdHJpbmcpKQpyZXR1cm4gZmFsc2U7Y29uc3QgcmVwbGFjZW1lbnRTdHJpbmc9VUkuY3JlYXRlUmVwbGFjZW1lbnRTdHJpbmcod29yZFN0cmluZyxldmVudCxjdXN0b21OdW1iZXJIYW5kbGVyKTtpZihyZXBsYWNlbWVudFN0cmluZyl7Y29uc3QgcmVwbGFjZW1lbnRUZXh0Tm9kZT1jcmVhdGVUZXh0Tm9kZShyZXBsYWNlbWVudFN0cmluZyk7d29yZFJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7d29yZFJhbmdlLmluc2VydE5vZGUocmVwbGFjZW1lbnRUZXh0Tm9kZSk7Y29uc3QgZmluYWxTZWxlY3Rpb25SYW5nZT1jcmVhdGVSYW5nZSgpO2ZpbmFsU2VsZWN0aW9uUmFuZ2Uuc2V0U3RhcnQocmVwbGFjZW1lbnRUZXh0Tm9kZSwwKTtmaW5hbFNlbGVjdGlvblJhbmdlLnNldEVuZChyZXBsYWNlbWVudFRleHROb2RlLHJlcGxhY2VtZW50U3RyaW5nLmxlbmd0aCk7c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO3NlbGVjdGlvbi5hZGRSYW5nZShmaW5hbFNlbGVjdGlvblJhbmdlKTtldmVudC5oYW5kbGVkPXRydWU7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihmaW5pc2hIYW5kbGVyKQpmaW5pc2hIYW5kbGVyKG9yaWdpbmFsVmFsdWUscmVwbGFjZW1lbnRTdHJpbmcpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO307TnVtYmVyLnByZWNpc2VNaWxsaXNUb1N0cmluZz1mdW5jdGlvbihtcyxwcmVjaXNpb24pe3ByZWNpc2lvbj1wcmVjaXNpb258fDA7Y29uc3QgZm9ybWF0PSclLicrcHJlY2lzaW9uKydmXHhhMG1zJztyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKGZvcm1hdCxtcyk7fTtVSS5fbWljcm9zRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyUuMGZceGEwXHUwM2JjcycpO1VJLl9zdWJNaWxsaXNGb3JtYXQ9bmV3IENvbW1vbi5VSVN0cmluZ0Zvcm1hdCgnJS4yZlx4YTBtcycpO1VJLl9taWxsaXNGb3JtYXQ9bmV3IENvbW1vbi5VSVN0cmluZ0Zvcm1hdCgnJS4wZlx4YTBtcycpO1VJLl9zZWNvbmRzRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyUuMmZceGEwcycpO1VJLl9taW51dGVzRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyUuMWZceGEwbWluJyk7VUkuX2hvdXJzRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyUuMWZceGEwaHJzJyk7VUkuX2RheXNGb3JtYXQ9bmV3IENvbW1vbi5VSVN0cmluZ0Zvcm1hdCgnJS4xZlx4YTBkYXlzJyk7TnVtYmVyLm1pbGxpc1RvU3RyaW5nPWZ1bmN0aW9uKG1zLGhpZ2hlclJlc29sdXRpb24pe2lmKCFpc0Zpbml0ZShtcykpCnJldHVybictJztpZihtcz09PTApCnJldHVybicwJztpZihoaWdoZXJSZXNvbHV0aW9uJiZtczwwLjEpCnJldHVybiBVSS5fbWljcm9zRm9ybWF0LmZvcm1hdChtcyoxMDAwKTtpZihoaWdoZXJSZXNvbHV0aW9uJiZtczwxMDAwKQpyZXR1cm4gVUkuX3N1Yk1pbGxpc0Zvcm1hdC5mb3JtYXQobXMpO2lmKG1zPDEwMDApCnJldHVybiBVSS5fbWlsbGlzRm9ybWF0LmZvcm1hdChtcyk7Y29uc3Qgc2Vjb25kcz1tcy8xMDAwO2lmKHNlY29uZHM8NjApCnJldHVybiBVSS5fc2Vjb25kc0Zvcm1hdC5mb3JtYXQoc2Vjb25kcyk7Y29uc3QgbWludXRlcz1zZWNvbmRzLzYwO2lmKG1pbnV0ZXM8NjApCnJldHVybiBVSS5fbWludXRlc0Zvcm1hdC5mb3JtYXQobWludXRlcyk7Y29uc3QgaG91cnM9bWludXRlcy82MDtpZihob3VyczwyNCkKcmV0dXJuIFVJLl9ob3Vyc0Zvcm1hdC5mb3JtYXQoaG91cnMpO2NvbnN0IGRheXM9aG91cnMvMjQ7cmV0dXJuIFVJLl9kYXlzRm9ybWF0LmZvcm1hdChkYXlzKTt9O051bWJlci5zZWNvbmRzVG9TdHJpbmc9ZnVuY3Rpb24oc2Vjb25kcyxoaWdoZXJSZXNvbHV0aW9uKXtpZighaXNGaW5pdGUoc2Vjb25kcykpCnJldHVybictJztyZXR1cm4gTnVtYmVyLm1pbGxpc1RvU3RyaW5nKHNlY29uZHMqMTAwMCxoaWdoZXJSZXNvbHV0aW9uKTt9O051bWJlci5ieXRlc1RvU3RyaW5nPWZ1bmN0aW9uKGJ5dGVzKXtpZihieXRlczwxMDI0KQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjBmXHhhMEInLGJ5dGVzKTtjb25zdCBraWxvYnl0ZXM9Ynl0ZXMvMTAyNDtpZihraWxvYnl0ZXM8MTAwKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjFmXHhhMEtCJyxraWxvYnl0ZXMpO2lmKGtpbG9ieXRlczwxMDI0KQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjBmXHhhMEtCJyxraWxvYnl0ZXMpO2NvbnN0IG1lZ2FieXRlcz1raWxvYnl0ZXMvMTAyNDtpZihtZWdhYnl0ZXM8MTAwKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjFmXHhhME1CJyxtZWdhYnl0ZXMpO2Vsc2UKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJS4wZlx4YTBNQicsbWVnYWJ5dGVzKTt9O051bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yPWZ1bmN0aW9uKG51bSl7bGV0IHN0cj1udW0rJyc7Y29uc3QgcmU9LyhcZCspKFxkezN9KS87d2hpbGUoc3RyLm1hdGNoKHJlKSkKc3RyPXN0ci5yZXBsYWNlKHJlLCckMVx4YTAkMicpO3JldHVybiBzdHI7fTtVSS5mb3JtYXRMb2NhbGl6ZWQ9ZnVuY3Rpb24oZm9ybWF0LHN1YnN0aXR1dGlvbnMpe2NvbnN0IGZvcm1hdHRlcnM9e3M6c3Vic3RpdHV0aW9uPT5zdWJzdGl0dXRpb259O2Z1bmN0aW9uIGFwcGVuZChhLGIpe2EuYXBwZW5kQ2hpbGQodHlwZW9mIGI9PT0nc3RyaW5nJz9jcmVhdGVUZXh0Tm9kZShiKTpiKTtyZXR1cm4gYTt9CnJldHVybiBTdHJpbmcuZm9ybWF0KENvbW1vbi5VSVN0cmluZyhmb3JtYXQpLHN1YnN0aXR1dGlvbnMsZm9ybWF0dGVycyxjcmVhdGVFbGVtZW50KCdzcGFuJyksYXBwZW5kKS5mb3JtYXR0ZWRSZXN1bHQ7fTtVSS5vcGVuTGlua0V4dGVybmFsbHlMYWJlbD1mdW5jdGlvbigpe3JldHVybiBDb21tb24uVUlTdHJpbmcoJ09wZW4gaW4gbmV3IHRhYicpO307VUkuY29weUxpbmtBZGRyZXNzTGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGxpbmsgYWRkcmVzcycpO307VUkuYW5vdGhlclByb2ZpbGVyQWN0aXZlTGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdBbm90aGVyIHByb2ZpbGVyIGlzIGFscmVhZHkgYWN0aXZlJyk7fTtVSS5hc3luY1N0YWNrVHJhY2VMYWJlbD1mdW5jdGlvbihkZXNjcmlwdGlvbil7aWYoZGVzY3JpcHRpb24pe2lmKGRlc2NyaXB0aW9uPT09J1Byb21pc2UucmVzb2x2ZScpCmRlc2NyaXB0aW9uPUNvbW1vbi5VSVN0cmluZygnUHJvbWlzZSByZXNvbHZlZCcpO2Vsc2UgaWYoZGVzY3JpcHRpb249PT0nUHJvbWlzZS5yZWplY3QnKQpkZXNjcmlwdGlvbj1Db21tb24uVUlTdHJpbmcoJ1Byb21pc2UgcmVqZWN0ZWQnKTtyZXR1cm4gZGVzY3JpcHRpb24rJyAnK0NvbW1vbi5VSVN0cmluZygnKGFzeW5jKScpO30KcmV0dXJuIENvbW1vbi5VSVN0cmluZygnQXN5bmMgQ2FsbCcpO307VUkuaW5zdGFsbENvbXBvbmVudFJvb3RTdHlsZXM9ZnVuY3Rpb24oZWxlbWVudCl7VUkuYXBwZW5kU3R5bGUoZWxlbWVudCwndWkvaW5zcGVjdG9yQ29tbW9uLmNzcycpO1VJLnRoZW1lU3VwcG9ydC5pbmplY3RIaWdobGlnaHRTdHlsZVNoZWV0cyhlbGVtZW50KTtVSS50aGVtZVN1cHBvcnQuaW5qZWN0Q3VzdG9tU3R5bGVTaGVldHMoZWxlbWVudCk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwbGF0Zm9ybS0nK0hvc3QucGxhdGZvcm0oKSk7aWYoIUhvc3QuaXNNYWMoKSYmVUkubWVhc3VyZWRTY3JvbGxiYXJXaWR0aChlbGVtZW50Lm93bmVyRG9jdW1lbnQpPT09MCkKZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvdmVybGF5LXNjcm9sbGJhci1lbmFibGVkJyk7fTtVSS5tZWFzdXJlZFNjcm9sbGJhcldpZHRoPWZ1bmN0aW9uKGRvY3VtZW50KXtpZih0eXBlb2YgVUkuX21lYXN1cmVkU2Nyb2xsYmFyV2lkdGg9PT0nbnVtYmVyJykKcmV0dXJuIFVJLl9tZWFzdXJlZFNjcm9sbGJhcldpZHRoO2lmKCFkb2N1bWVudCkKcmV0dXJuIDE2O2NvbnN0IHNjcm9sbERpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtzY3JvbGxEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsJ3dpZHRoOiAxMDBweDsgaGVpZ2h0OiAxMDBweDsgb3ZlcmZsb3c6IHNjcm9sbDsnKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7VUkuX21lYXN1cmVkU2Nyb2xsYmFyV2lkdGg9c2Nyb2xsRGl2Lm9mZnNldFdpZHRoLXNjcm9sbERpdi5jbGllbnRXaWR0aDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7cmV0dXJuIFVJLl9tZWFzdXJlZFNjcm9sbGJhcldpZHRoO307VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzPWZ1bmN0aW9uKGVsZW1lbnQsY3NzRmlsZSl7Y29uc3Qgc2hhZG93Um9vdD1lbGVtZW50LmNyZWF0ZVNoYWRvd1Jvb3QoKTtVSS5hcHBlbmRTdHlsZShzaGFkb3dSb290LCd1aS9pbnNwZWN0b3JDb21tb24uY3NzJyk7VUkudGhlbWVTdXBwb3J0LmluamVjdEhpZ2hsaWdodFN0eWxlU2hlZXRzKHNoYWRvd1Jvb3QpO1VJLnRoZW1lU3VwcG9ydC5pbmplY3RDdXN0b21TdHlsZVNoZWV0cyhzaGFkb3dSb290KTtpZihjc3NGaWxlKQpVSS5hcHBlbmRTdHlsZShzaGFkb3dSb290LGNzc0ZpbGUpO3NoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLFVJLl9mb2N1c0NoYW5nZWQuYmluZChVSSksdHJ1ZSk7cmV0dXJuIHNoYWRvd1Jvb3Q7fTtVSS5fd2luZG93Rm9jdXNlZD1mdW5jdGlvbihkb2N1bWVudCxldmVudCl7aWYoZXZlbnQudGFyZ2V0LmRvY3VtZW50Lm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKQpkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2luYWN0aXZlJyk7VUkuX2tleWJvYXJkRm9jdXM9dHJ1ZTtjb25zdCBsaXN0ZW5lcj0oKT0+e2NvbnN0IGFjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTtpZihhY3RpdmVFbGVtZW50KQphY3RpdmVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1rZXlib2FyZC1mb2N1cycpO1VJLl9rZXlib2FyZEZvY3VzPWZhbHNlO307ZG9jdW1lbnQuZGVmYXVsdFZpZXcucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57VUkuX2tleWJvYXJkRm9jdXM9ZmFsc2U7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxsaXN0ZW5lcix0cnVlKTt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGxpc3RlbmVyLHRydWUpO307VUkuX3dpbmRvd0JsdXJyZWQ9ZnVuY3Rpb24oZG9jdW1lbnQsZXZlbnQpe2lmKGV2ZW50LnRhcmdldC5kb2N1bWVudC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERSkKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpbmFjdGl2ZScpO307VUkuX2ZvY3VzQ2hhbmdlZD1mdW5jdGlvbihldmVudCl7Y29uc3QgZG9jdW1lbnQ9ZXZlbnQudGFyZ2V0JiZldmVudC50YXJnZXQub3duZXJEb2N1bWVudDtjb25zdCBlbGVtZW50PWRvY3VtZW50P2RvY3VtZW50LmRlZXBBY3RpdmVFbGVtZW50KCk6bnVsbDtVSS5XaWRnZXQuZm9jdXNXaWRnZXRGb3JOb2RlKGVsZW1lbnQpO1VJLlhXaWRnZXQuZm9jdXNXaWRnZXRGb3JOb2RlKGVsZW1lbnQpO2lmKCFVSS5fa2V5Ym9hcmRGb2N1cykKcmV0dXJuO2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWtleWJvYXJkLWZvY3VzJywndHJ1ZScpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsKCk9PmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWtleWJvYXJkLWZvY3VzJykse29uY2U6dHJ1ZSxjYXB0dXJlOnRydWV9KTt9O1VJLkVsZW1lbnRGb2N1c1Jlc3RvcmVyPWNsYXNze2NvbnN0cnVjdG9yKGVsZW1lbnQpe3RoaXMuX2VsZW1lbnQ9ZWxlbWVudDt0aGlzLl9wcmV2aW91cz1lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTtlbGVtZW50LmZvY3VzKCk7fQpyZXN0b3JlKCl7aWYoIXRoaXMuX2VsZW1lbnQpCnJldHVybjtpZih0aGlzLl9lbGVtZW50Lmhhc0ZvY3VzKCkmJnRoaXMuX3ByZXZpb3VzKQp0aGlzLl9wcmV2aW91cy5mb2N1cygpO3RoaXMuX3ByZXZpb3VzPW51bGw7dGhpcy5fZWxlbWVudD1udWxsO319O1VJLmhpZ2hsaWdodFNlYXJjaFJlc3VsdD1mdW5jdGlvbihlbGVtZW50LG9mZnNldCxsZW5ndGgsZG9tQ2hhbmdlcyl7Y29uc3QgcmVzdWx0PVVJLmhpZ2hsaWdodFNlYXJjaFJlc3VsdHMoZWxlbWVudCxbbmV3IFRleHRVdGlscy5Tb3VyY2VSYW5nZShvZmZzZXQsbGVuZ3RoKV0sZG9tQ2hhbmdlcyk7cmV0dXJuIHJlc3VsdC5sZW5ndGg/cmVzdWx0WzBdOm51bGw7fTtVSS5oaWdobGlnaHRTZWFyY2hSZXN1bHRzPWZ1bmN0aW9uKGVsZW1lbnQscmVzdWx0UmFuZ2VzLGNoYW5nZXMpe3JldHVybiBVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyhlbGVtZW50LHJlc3VsdFJhbmdlcyxVSS5oaWdobGlnaHRlZFNlYXJjaFJlc3VsdENsYXNzTmFtZSxjaGFuZ2VzKTt9O1VJLnJ1bkNTU0FuaW1hdGlvbk9uY2U9ZnVuY3Rpb24oZWxlbWVudCxjbGFzc05hbWUpe2Z1bmN0aW9uIGFuaW1hdGlvbkVuZENhbGxiYWNrKCl7ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7ZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRBbmltYXRpb25FbmQnLGFuaW1hdGlvbkVuZENhbGxiYWNrLGZhbHNlKTt9CmlmKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpCmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0QW5pbWF0aW9uRW5kJyxhbmltYXRpb25FbmRDYWxsYmFjayxmYWxzZSk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7fTtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcz1mdW5jdGlvbihlbGVtZW50LHJlc3VsdFJhbmdlcyxzdHlsZUNsYXNzLGNoYW5nZXMpe2NoYW5nZXM9Y2hhbmdlc3x8W107Y29uc3QgaGlnaGxpZ2h0Tm9kZXM9W107Y29uc3QgdGV4dE5vZGVzPWVsZW1lbnQuY2hpbGRUZXh0Tm9kZXMoKTtjb25zdCBsaW5lVGV4dD10ZXh0Tm9kZXMubWFwKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLnRleHRDb250ZW50O30pLmpvaW4oJycpO2NvbnN0IG93bmVyRG9jdW1lbnQ9ZWxlbWVudC5vd25lckRvY3VtZW50O2lmKHRleHROb2Rlcy5sZW5ndGg9PT0wKQpyZXR1cm4gaGlnaGxpZ2h0Tm9kZXM7Y29uc3Qgbm9kZVJhbmdlcz1bXTtsZXQgcmFuZ2VFbmRPZmZzZXQ9MDtmb3IobGV0IGk9MDtpPHRleHROb2Rlcy5sZW5ndGg7KytpKXtjb25zdCByYW5nZT17fTtyYW5nZS5vZmZzZXQ9cmFuZ2VFbmRPZmZzZXQ7cmFuZ2UubGVuZ3RoPXRleHROb2Rlc1tpXS50ZXh0Q29udGVudC5sZW5ndGg7cmFuZ2VFbmRPZmZzZXQ9cmFuZ2Uub2Zmc2V0K3JhbmdlLmxlbmd0aDtub2RlUmFuZ2VzLnB1c2gocmFuZ2UpO30KbGV0IHN0YXJ0SW5kZXg9MDtmb3IobGV0IGk9MDtpPHJlc3VsdFJhbmdlcy5sZW5ndGg7KytpKXtjb25zdCBzdGFydE9mZnNldD1yZXN1bHRSYW5nZXNbaV0ub2Zmc2V0O2NvbnN0IGVuZE9mZnNldD1zdGFydE9mZnNldCtyZXN1bHRSYW5nZXNbaV0ubGVuZ3RoO3doaWxlKHN0YXJ0SW5kZXg8dGV4dE5vZGVzLmxlbmd0aCYmbm9kZVJhbmdlc1tzdGFydEluZGV4XS5vZmZzZXQrbm9kZVJhbmdlc1tzdGFydEluZGV4XS5sZW5ndGg8PXN0YXJ0T2Zmc2V0KQpzdGFydEluZGV4Kys7bGV0IGVuZEluZGV4PXN0YXJ0SW5kZXg7d2hpbGUoZW5kSW5kZXg8dGV4dE5vZGVzLmxlbmd0aCYmbm9kZVJhbmdlc1tlbmRJbmRleF0ub2Zmc2V0K25vZGVSYW5nZXNbZW5kSW5kZXhdLmxlbmd0aDxlbmRPZmZzZXQpCmVuZEluZGV4Kys7aWYoZW5kSW5kZXg9PT10ZXh0Tm9kZXMubGVuZ3RoKQpicmVhaztjb25zdCBoaWdobGlnaHROb2RlPW93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO2hpZ2hsaWdodE5vZGUuY2xhc3NOYW1lPXN0eWxlQ2xhc3M7aGlnaGxpZ2h0Tm9kZS50ZXh0Q29udGVudD1saW5lVGV4dC5zdWJzdHJpbmcoc3RhcnRPZmZzZXQsZW5kT2Zmc2V0KTtjb25zdCBsYXN0VGV4dE5vZGU9dGV4dE5vZGVzW2VuZEluZGV4XTtjb25zdCBsYXN0VGV4dD1sYXN0VGV4dE5vZGUudGV4dENvbnRlbnQ7bGFzdFRleHROb2RlLnRleHRDb250ZW50PWxhc3RUZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQtbm9kZVJhbmdlc1tlbmRJbmRleF0ub2Zmc2V0KTtjaGFuZ2VzLnB1c2goe25vZGU6bGFzdFRleHROb2RlLHR5cGU6J2NoYW5nZWQnLG9sZFRleHQ6bGFzdFRleHQsbmV3VGV4dDpsYXN0VGV4dE5vZGUudGV4dENvbnRlbnR9KTtpZihzdGFydEluZGV4PT09ZW5kSW5kZXgpe2xhc3RUZXh0Tm9kZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShoaWdobGlnaHROb2RlLGxhc3RUZXh0Tm9kZSk7Y2hhbmdlcy5wdXNoKHtub2RlOmhpZ2hsaWdodE5vZGUsdHlwZTonYWRkZWQnLG5leHRTaWJsaW5nOmxhc3RUZXh0Tm9kZSxwYXJlbnQ6bGFzdFRleHROb2RlLnBhcmVudEVsZW1lbnR9KTtoaWdobGlnaHROb2Rlcy5wdXNoKGhpZ2hsaWdodE5vZGUpO2NvbnN0IHByZWZpeE5vZGU9b3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsYXN0VGV4dC5zdWJzdHJpbmcoMCxzdGFydE9mZnNldC1ub2RlUmFuZ2VzW3N0YXJ0SW5kZXhdLm9mZnNldCkpO2xhc3RUZXh0Tm9kZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShwcmVmaXhOb2RlLGhpZ2hsaWdodE5vZGUpO2NoYW5nZXMucHVzaCh7bm9kZTpwcmVmaXhOb2RlLHR5cGU6J2FkZGVkJyxuZXh0U2libGluZzpoaWdobGlnaHROb2RlLHBhcmVudDpsYXN0VGV4dE5vZGUucGFyZW50RWxlbWVudH0pO31lbHNle2NvbnN0IGZpcnN0VGV4dE5vZGU9dGV4dE5vZGVzW3N0YXJ0SW5kZXhdO2NvbnN0IGZpcnN0VGV4dD1maXJzdFRleHROb2RlLnRleHRDb250ZW50O2NvbnN0IGFuY2hvckVsZW1lbnQ9Zmlyc3RUZXh0Tm9kZS5uZXh0U2libGluZztmaXJzdFRleHROb2RlLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGhpZ2hsaWdodE5vZGUsYW5jaG9yRWxlbWVudCk7Y2hhbmdlcy5wdXNoKHtub2RlOmhpZ2hsaWdodE5vZGUsdHlwZTonYWRkZWQnLG5leHRTaWJsaW5nOmFuY2hvckVsZW1lbnQscGFyZW50OmZpcnN0VGV4dE5vZGUucGFyZW50RWxlbWVudH0pO2hpZ2hsaWdodE5vZGVzLnB1c2goaGlnaGxpZ2h0Tm9kZSk7Zmlyc3RUZXh0Tm9kZS50ZXh0Q29udGVudD1maXJzdFRleHQuc3Vic3RyaW5nKDAsc3RhcnRPZmZzZXQtbm9kZVJhbmdlc1tzdGFydEluZGV4XS5vZmZzZXQpO2NoYW5nZXMucHVzaCh7bm9kZTpmaXJzdFRleHROb2RlLHR5cGU6J2NoYW5nZWQnLG9sZFRleHQ6Zmlyc3RUZXh0LG5ld1RleHQ6Zmlyc3RUZXh0Tm9kZS50ZXh0Q29udGVudH0pO2ZvcihsZXQgaj1zdGFydEluZGV4KzE7ajxlbmRJbmRleDtqKyspe2NvbnN0IHRleHROb2RlPXRleHROb2Rlc1tqXTtjb25zdCB0ZXh0PXRleHROb2RlLnRleHRDb250ZW50O3RleHROb2RlLnRleHRDb250ZW50PScnO2NoYW5nZXMucHVzaCh7bm9kZTp0ZXh0Tm9kZSx0eXBlOidjaGFuZ2VkJyxvbGRUZXh0OnRleHQsbmV3VGV4dDp0ZXh0Tm9kZS50ZXh0Q29udGVudH0pO319CnN0YXJ0SW5kZXg9ZW5kSW5kZXg7bm9kZVJhbmdlc1tzdGFydEluZGV4XS5vZmZzZXQ9ZW5kT2Zmc2V0O25vZGVSYW5nZXNbc3RhcnRJbmRleF0ubGVuZ3RoPWxhc3RUZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGg7fQpyZXR1cm4gaGlnaGxpZ2h0Tm9kZXM7fTtVSS5hcHBseURvbUNoYW5nZXM9ZnVuY3Rpb24oZG9tQ2hhbmdlcyl7Zm9yKGxldCBpPTAsc2l6ZT1kb21DaGFuZ2VzLmxlbmd0aDtpPHNpemU7KytpKXtjb25zdCBlbnRyeT1kb21DaGFuZ2VzW2ldO3N3aXRjaChlbnRyeS50eXBlKXtjYXNlJ2FkZGVkJzplbnRyeS5wYXJlbnQuaW5zZXJ0QmVmb3JlKGVudHJ5Lm5vZGUsZW50cnkubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UnY2hhbmdlZCc6ZW50cnkubm9kZS50ZXh0Q29udGVudD1lbnRyeS5uZXdUZXh0O2JyZWFrO319fTtVSS5yZXZlcnREb21DaGFuZ2VzPWZ1bmN0aW9uKGRvbUNoYW5nZXMpe2ZvcihsZXQgaT1kb21DaGFuZ2VzLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCBlbnRyeT1kb21DaGFuZ2VzW2ldO3N3aXRjaChlbnRyeS50eXBlKXtjYXNlJ2FkZGVkJzplbnRyeS5ub2RlLnJlbW92ZSgpO2JyZWFrO2Nhc2UnY2hhbmdlZCc6ZW50cnkubm9kZS50ZXh0Q29udGVudD1lbnRyeS5vbGRUZXh0O2JyZWFrO319fTtVSS5tZWFzdXJlUHJlZmVycmVkU2l6ZT1mdW5jdGlvbihlbGVtZW50LGNvbnRhaW5lckVsZW1lbnQpe2NvbnN0IG9sZFBhcmVudD1lbGVtZW50LnBhcmVudEVsZW1lbnQ7Y29uc3Qgb2xkTmV4dFNpYmxpbmc9ZWxlbWVudC5uZXh0U2libGluZztjb250YWluZXJFbGVtZW50PWNvbnRhaW5lckVsZW1lbnR8fGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O2NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7ZWxlbWVudC5wb3NpdGlvbkF0KDAsMCk7Y29uc3QgcmVzdWx0PWVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxlbWVudC5wb3NpdGlvbkF0KHVuZGVmaW5lZCx1bmRlZmluZWQpO2lmKG9sZFBhcmVudCkKb2xkUGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LG9sZE5leHRTaWJsaW5nKTtlbHNlCmVsZW1lbnQucmVtb3ZlKCk7cmV0dXJuIG5ldyBVSS5TaXplKHJlc3VsdC53aWR0aCxyZXN1bHQuaGVpZ2h0KTt9O1VJLkludm9rZU9uY2VIYW5kbGVycz1jbGFzc3tjb25zdHJ1Y3RvcihhdXRvSW52b2tlKXt0aGlzLl9oYW5kbGVycz1udWxsO3RoaXMuX2F1dG9JbnZva2U9YXV0b0ludm9rZTt9CmFkZChvYmplY3QsbWV0aG9kKXtpZighdGhpcy5faGFuZGxlcnMpe3RoaXMuX2hhbmRsZXJzPW5ldyBNYXAoKTtpZih0aGlzLl9hdXRvSW52b2tlKQp0aGlzLnNjaGVkdWxlSW52b2tlKCk7fQpsZXQgbWV0aG9kcz10aGlzLl9oYW5kbGVycy5nZXQob2JqZWN0KTtpZighbWV0aG9kcyl7bWV0aG9kcz1uZXcgU2V0KCk7dGhpcy5faGFuZGxlcnMuc2V0KG9iamVjdCxtZXRob2RzKTt9Cm1ldGhvZHMuYWRkKG1ldGhvZCk7fQpzY2hlZHVsZUludm9rZSgpe2lmKHRoaXMuX2hhbmRsZXJzKQpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5faW52b2tlLmJpbmQodGhpcykpO30KX2ludm9rZSgpe2NvbnN0IGhhbmRsZXJzPXRoaXMuX2hhbmRsZXJzO3RoaXMuX2hhbmRsZXJzPW51bGw7Y29uc3Qga2V5cz1oYW5kbGVycy5rZXlzQXJyYXkoKTtmb3IobGV0IGk9MDtpPGtleXMubGVuZ3RoOysraSl7Y29uc3Qgb2JqZWN0PWtleXNbaV07Y29uc3QgbWV0aG9kcz1oYW5kbGVycy5nZXQob2JqZWN0KS52YWx1ZXNBcnJheSgpO2ZvcihsZXQgaj0wO2o8bWV0aG9kcy5sZW5ndGg7KytqKQptZXRob2RzW2pdLmNhbGwob2JqZWN0KTt9fX07VUkuX2NvYWxlc2NpbmdMZXZlbD0wO1VJLl9wb3N0VXBkYXRlSGFuZGxlcnM9bnVsbDtVSS5zdGFydEJhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7aWYoIVVJLl9jb2FsZXNjaW5nTGV2ZWwrKykKVUkuX3Bvc3RVcGRhdGVIYW5kbGVycz1uZXcgVUkuSW52b2tlT25jZUhhbmRsZXJzKGZhbHNlKTt9O1VJLmVuZEJhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7aWYoLS1VSS5fY29hbGVzY2luZ0xldmVsKQpyZXR1cm47VUkuX3Bvc3RVcGRhdGVIYW5kbGVycy5zY2hlZHVsZUludm9rZSgpO1VJLl9wb3N0VXBkYXRlSGFuZGxlcnM9bnVsbDt9O1VJLmludm9rZU9uY2VBZnRlckJhdGNoVXBkYXRlPWZ1bmN0aW9uKG9iamVjdCxtZXRob2Qpe2lmKCFVSS5fcG9zdFVwZGF0ZUhhbmRsZXJzKQpVSS5fcG9zdFVwZGF0ZUhhbmRsZXJzPW5ldyBVSS5JbnZva2VPbmNlSGFuZGxlcnModHJ1ZSk7VUkuX3Bvc3RVcGRhdGVIYW5kbGVycy5hZGQob2JqZWN0LG1ldGhvZCk7fTtVSS5hbmltYXRlRnVuY3Rpb249ZnVuY3Rpb24od2luZG93LGZ1bmMscGFyYW1zLGR1cmF0aW9uLGFuaW1hdGlvbkNvbXBsZXRlKXtjb25zdCBzdGFydD13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7bGV0IHJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGlvblN0ZXApO2Z1bmN0aW9uIGFuaW1hdGlvblN0ZXAodGltZXN0YW1wKXtjb25zdCBwcm9ncmVzcz1OdW1iZXIuY29uc3RyYWluKCh0aW1lc3RhbXAtc3RhcnQpL2R1cmF0aW9uLDAsMSk7ZnVuYyguLi5wYXJhbXMubWFwKHA9PnAuZnJvbSsocC50by1wLmZyb20pKnByb2dyZXNzKSk7aWYocHJvZ3Jlc3M8MSkKcmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uU3RlcCk7ZWxzZSBpZihhbmltYXRpb25Db21wbGV0ZSkKYW5pbWF0aW9uQ29tcGxldGUoKTt9CnJldHVybigpPT53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTt9O1VJLkxvbmdDbGlja0NvbnRyb2xsZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGVsZW1lbnQsY2FsbGJhY2spe3N1cGVyKCk7dGhpcy5fZWxlbWVudD1lbGVtZW50O3RoaXMuX2NhbGxiYWNrPWNhbGxiYWNrO3RoaXMuX2VuYWJsZSgpO30KcmVzZXQoKXtpZih0aGlzLl9sb25nQ2xpY2tJbnRlcnZhbCl7Y2xlYXJJbnRlcnZhbCh0aGlzLl9sb25nQ2xpY2tJbnRlcnZhbCk7ZGVsZXRlIHRoaXMuX2xvbmdDbGlja0ludGVydmFsO319Cl9lbmFibGUoKXtpZih0aGlzLl9sb25nQ2xpY2tEYXRhKQpyZXR1cm47Y29uc3QgYm91bmRNb3VzZURvd249bW91c2VEb3duLmJpbmQodGhpcyk7Y29uc3QgYm91bmRNb3VzZVVwPW1vdXNlVXAuYmluZCh0aGlzKTtjb25zdCBib3VuZFJlc2V0PXRoaXMucmVzZXQuYmluZCh0aGlzKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsYm91bmRNb3VzZURvd24sZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLGJvdW5kUmVzZXQsZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsYm91bmRNb3VzZVVwLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxib3VuZFJlc2V0LHRydWUpO3RoaXMuX2xvbmdDbGlja0RhdGE9e21vdXNlVXA6Ym91bmRNb3VzZVVwLG1vdXNlRG93bjpib3VuZE1vdXNlRG93bixyZXNldDpib3VuZFJlc2V0fTtmdW5jdGlvbiBtb3VzZURvd24oZSl7aWYoZS53aGljaCE9PTEpCnJldHVybjtjb25zdCBjYWxsYmFjaz10aGlzLl9jYWxsYmFjazt0aGlzLl9sb25nQ2xpY2tJbnRlcnZhbD1zZXRUaW1lb3V0KGNhbGxiYWNrLmJpbmQobnVsbCxlKSwyMDApO30KZnVuY3Rpb24gbW91c2VVcChlKXtpZihlLndoaWNoIT09MSkKcmV0dXJuO3RoaXMucmVzZXQoKTt9fQpkaXNwb3NlKCl7aWYoIXRoaXMuX2xvbmdDbGlja0RhdGEpCnJldHVybjt0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fbG9uZ0NsaWNrRGF0YS5tb3VzZURvd24sZmFsc2UpO3RoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLHRoaXMuX2xvbmdDbGlja0RhdGEucmVzZXQsZmFsc2UpO3RoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fbG9uZ0NsaWNrRGF0YS5tb3VzZVVwLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9sb25nQ2xpY2tEYXRhLnJlc2V0LHRydWUpO2RlbGV0ZSB0aGlzLl9sb25nQ2xpY2tEYXRhO319O1VJLmluaXRpYWxpemVVSVV0aWxzPWZ1bmN0aW9uKGRvY3VtZW50LHRoZW1lU2V0dGluZyl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdpbmFjdGl2ZScsIWRvY3VtZW50Lmhhc0ZvY3VzKCkpO2RvY3VtZW50LmRlZmF1bHRWaWV3LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyxVSS5fd2luZG93Rm9jdXNlZC5iaW5kKFVJLGRvY3VtZW50KSxmYWxzZSk7ZG9jdW1lbnQuZGVmYXVsdFZpZXcuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsVUkuX3dpbmRvd0JsdXJyZWQuYmluZChVSSxkb2N1bWVudCksZmFsc2UpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyxVSS5fZm9jdXNDaGFuZ2VkLmJpbmQoVUkpLHRydWUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGV2ZW50PT57VUkuX2tleWJvYXJkRm9jdXM9dHJ1ZTtkb2N1bWVudC5kZWZhdWx0Vmlldy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnZvaWQoVUkuX2tleWJvYXJkRm9jdXM9ZmFsc2UpKTt9LHRydWUpO2lmKCFVSS50aGVtZVN1cHBvcnQpClVJLnRoZW1lU3VwcG9ydD1uZXcgVUkuVGhlbWVTdXBwb3J0KHRoZW1lU2V0dGluZyk7VUkudGhlbWVTdXBwb3J0LmFwcGx5VGhlbWUoZG9jdW1lbnQpO2NvbnN0IGJvZHk9KGRvY3VtZW50LmJvZHkpO1VJLmFwcGVuZFN0eWxlKGJvZHksJ3VpL2luc3BlY3RvclN0eWxlLmNzcycpO1VJLkdsYXNzUGFuZS5zZXRDb250YWluZXIoKGRvY3VtZW50LmJvZHkpKTt9O1VJLmJlYXV0aWZ5RnVuY3Rpb25OYW1lPWZ1bmN0aW9uKG5hbWUpe3JldHVybiBuYW1lfHxDb21tb24uVUlTdHJpbmcoJyhhbm9ueW1vdXMpJyk7fTtVSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQ9ZnVuY3Rpb24obG9jYWxOYW1lLHR5cGVFeHRlbnNpb24scHJvdG90eXBlKXtyZXR1cm4gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KHR5cGVFeHRlbnNpb24se3Byb3RvdHlwZTpPYmplY3QuY3JlYXRlKHByb3RvdHlwZSksZXh0ZW5kczpsb2NhbE5hbWV9KTt9O1VJLmNyZWF0ZVRleHRCdXR0b249ZnVuY3Rpb24odGV4dCxjbGlja0hhbmRsZXIsY2xhc3NOYW1lLHByaW1hcnkpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnYnV0dG9uJyxjbGFzc05hbWV8fCcnLCd0ZXh0LWJ1dHRvbicpO2VsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDtpZihwcmltYXJ5KQplbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3ByaW1hcnktYnV0dG9uJyk7aWYoY2xpY2tIYW5kbGVyKQplbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbGlja0hhbmRsZXIsZmFsc2UpO3JldHVybiBlbGVtZW50O307VUkuY3JlYXRlSW5wdXQ9ZnVuY3Rpb24oY2xhc3NOYW1lLHR5cGUpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnaW5wdXQnLGNsYXNzTmFtZXx8JycpO2VsZW1lbnQuc3BlbGxjaGVjaz1mYWxzZTtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hhcm1vbnktaW5wdXQnKTtpZih0eXBlKQplbGVtZW50LnR5cGU9dHlwZTtyZXR1cm4gZWxlbWVudDt9O1VJLmNyZWF0ZVJhZGlvTGFiZWw9ZnVuY3Rpb24obmFtZSx0aXRsZSxjaGVja2VkKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywnZHQtcmFkaW8nKTtlbGVtZW50LnJhZGlvRWxlbWVudC5uYW1lPW5hbWU7ZWxlbWVudC5yYWRpb0VsZW1lbnQuY2hlY2tlZD0hIWNoZWNrZWQ7ZWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQodGl0bGUpO3JldHVybiBlbGVtZW50O307VUkuY3JlYXRlTGFiZWw9ZnVuY3Rpb24odGl0bGUsaWNvbkNsYXNzKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywnZHQtaWNvbi1sYWJlbCcpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD10aXRsZTtlbGVtZW50LnR5cGU9aWNvbkNsYXNzO3JldHVybiBlbGVtZW50O307VUkuY3JlYXRlU2xpZGVyTGFiZWw9ZnVuY3Rpb24obWluLG1heCx0YWJJbmRleCl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50KCdsYWJlbCcsJ2R0LXNsaWRlcicpO2VsZW1lbnQuc2xpZGVyRWxlbWVudC5taW49bWluO2VsZW1lbnQuc2xpZGVyRWxlbWVudC5tYXg9bWF4O2VsZW1lbnQuc2xpZGVyRWxlbWVudC5zdGVwPTE7ZWxlbWVudC5zbGlkZXJFbGVtZW50LnRhYkluZGV4PXRhYkluZGV4O3JldHVybiBlbGVtZW50O307VUkuYXBwZW5kU3R5bGU9ZnVuY3Rpb24obm9kZSxjc3NGaWxlKXtjb25zdCBjb250ZW50PVJ1bnRpbWUuY2FjaGVkUmVzb3VyY2VzW2Nzc0ZpbGVdfHwnJztpZighY29udGVudCkKY29uc29sZS5lcnJvcihjc3NGaWxlKycgbm90IHByZWxvYWRlZC4gQ2hlY2sgbW9kdWxlLmpzb24nKTtsZXQgc3R5bGVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7c3R5bGVFbGVtZW50LnR5cGU9J3RleHQvY3NzJztzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQ9Y29udGVudDtub2RlLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7Y29uc3QgdGhlbWVTdHlsZVNoZWV0PVVJLnRoZW1lU3VwcG9ydC50aGVtZVN0eWxlU2hlZXQoY3NzRmlsZSxjb250ZW50KTtpZih0aGVtZVN0eWxlU2hlZXQpe3N0eWxlRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlRWxlbWVudC50eXBlPSd0ZXh0L2Nzcyc7c3R5bGVFbGVtZW50LnRleHRDb250ZW50PXRoZW1lU3R5bGVTaGVldCsnXG4nK1J1bnRpbWUucmVzb2x2ZVNvdXJjZVVSTChjc3NGaWxlKycudGhlbWUnKTtub2RlLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7fX07VUkuQ2hlY2tib3hMYWJlbD1jbGFzcyBleHRlbmRzIEhUTUxMYWJlbEVsZW1lbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3NoYWRvd1Jvb3Q7dGhpcy5jaGVja2JveEVsZW1lbnQ7dGhpcy50ZXh0RWxlbWVudDt0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrYm94IG11c3QgYmUgY3JlYXRlZCB2aWEgZmFjdG9yeSBtZXRob2QuJyk7fQpjcmVhdGVkQ2FsbGJhY2soKXtVSS5DaGVja2JveExhYmVsLl9sYXN0SWQ9KFVJLkNoZWNrYm94TGFiZWwuX2xhc3RJZHx8MCkrMTtjb25zdCBpZD0ndWktY2hlY2tib3gtbGFiZWwnK1VJLkNoZWNrYm94TGFiZWwuX2xhc3RJZDt0aGlzLl9zaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLCd1aS9jaGVja2JveFRleHRMYWJlbC5jc3MnKTt0aGlzLmNoZWNrYm94RWxlbWVudD0odGhpcy5fc2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnaW5wdXQnKSk7dGhpcy5jaGVja2JveEVsZW1lbnQudHlwZT0nY2hlY2tib3gnO3RoaXMuY2hlY2tib3hFbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLGlkKTt0aGlzLnRleHRFbGVtZW50PXRoaXMuX3NoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ2xhYmVsJywnZHQtY2hlY2tib3gtdGV4dCcpO3RoaXMudGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCdmb3InLGlkKTt0aGlzLl9zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7fQpzdGF0aWMgY3JlYXRlKHRpdGxlLGNoZWNrZWQsc3VidGl0bGUpe2lmKCFVSS5DaGVja2JveExhYmVsLl9jb25zdHJ1Y3RvcikKVUkuQ2hlY2tib3hMYWJlbC5fY29uc3RydWN0b3I9VUkucmVnaXN0ZXJDdXN0b21FbGVtZW50KCdsYWJlbCcsJ2R0LWNoZWNrYm94JyxVSS5DaGVja2JveExhYmVsLnByb3RvdHlwZSk7Y29uc3QgZWxlbWVudD0obmV3IFVJLkNoZWNrYm94TGFiZWwuX2NvbnN0cnVjdG9yKCkpO2VsZW1lbnQuY2hlY2tib3hFbGVtZW50LmNoZWNrZWQ9ISFjaGVja2VkO2lmKHRpdGxlIT09dW5kZWZpbmVkKXtlbGVtZW50LnRleHRFbGVtZW50LnRleHRDb250ZW50PXRpdGxlO2lmKHN1YnRpdGxlIT09dW5kZWZpbmVkKQplbGVtZW50LnRleHRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkdC1jaGVja2JveC1zdWJ0aXRsZScpLnRleHRDb250ZW50PXN1YnRpdGxlO30KcmV0dXJuIGVsZW1lbnQ7fQpzZXQgYmFja2dyb3VuZENvbG9yKGNvbG9yKXt0aGlzLmNoZWNrYm94RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkdC1jaGVja2JveC10aGVtZWQnKTt0aGlzLmNoZWNrYm94RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y29sb3I7fQpzZXQgY2hlY2tDb2xvcihjb2xvcil7dGhpcy5jaGVja2JveEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHQtY2hlY2tib3gtdGhlbWVkJyk7Y29uc3Qgc3R5bGVzaGVldD1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlc2hlZXQudGV4dENvbnRlbnQ9J2lucHV0LmR0LWNoZWNrYm94LXRoZW1lZDpjaGVja2VkOmFmdGVyIHsgYmFja2dyb3VuZC1jb2xvcjogJytjb2xvcisnfSc7dGhpcy5fc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzdHlsZXNoZWV0KTt9CnNldCBib3JkZXJDb2xvcihjb2xvcil7dGhpcy5jaGVja2JveEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHQtY2hlY2tib3gtdGhlbWVkJyk7dGhpcy5jaGVja2JveEVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3I9Y29sb3I7fX07KGZ1bmN0aW9uKCl7VUkucmVnaXN0ZXJDdXN0b21FbGVtZW50KCdidXR0b24nLCd0ZXh0LWJ1dHRvbicse2NyZWF0ZWRDYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudHlwZT0nYnV0dG9uJztjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLCd1aS90ZXh0QnV0dG9uLmNzcycpO3Jvb3QuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt9LF9fcHJvdG9fXzpIVE1MQnV0dG9uRWxlbWVudC5wcm90b3R5cGV9KTtVSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2xhYmVsJywnZHQtcmFkaW8nLHtjcmVhdGVkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnJhZGlvRWxlbWVudD10aGlzLmNyZWF0ZUNoaWxkKCdpbnB1dCcsJ2R0LXJhZGlvLWJ1dHRvbicpO3RoaXMucmFkaW9FbGVtZW50LnR5cGU9J3JhZGlvJztjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLCd1aS9yYWRpb0J1dHRvbi5jc3MnKTtyb290LmNyZWF0ZUNoaWxkKCdjb250ZW50Jykuc2VsZWN0PScuZHQtcmFkaW8tYnV0dG9uJztyb290LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycscmFkaW9DbGlja0hhbmRsZXIsZmFsc2UpO30sX19wcm90b19fOkhUTUxMYWJlbEVsZW1lbnQucHJvdG90eXBlfSk7ZnVuY3Rpb24gcmFkaW9DbGlja0hhbmRsZXIoZXZlbnQpe2lmKHRoaXMucmFkaW9FbGVtZW50LmNoZWNrZWR8fHRoaXMucmFkaW9FbGVtZW50LmRpc2FibGVkKQpyZXR1cm47dGhpcy5yYWRpb0VsZW1lbnQuY2hlY2tlZD10cnVlO3RoaXMucmFkaW9FbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7fQpVSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2xhYmVsJywnZHQtaWNvbi1sYWJlbCcse2NyZWF0ZWRDYWxsYmFjazpmdW5jdGlvbigpe2NvbnN0IHJvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMpO3RoaXMuX2ljb25FbGVtZW50PVVJLkljb24uY3JlYXRlKCk7dGhpcy5faWNvbkVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi1yaWdodCcsJzRweCcpO3Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5faWNvbkVsZW1lbnQpO3Jvb3QuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt9LHNldCB0eXBlKHR5cGUpe3RoaXMuX2ljb25FbGVtZW50LnNldEljb25UeXBlKHR5cGUpO30sX19wcm90b19fOkhUTUxMYWJlbEVsZW1lbnQucHJvdG90eXBlfSk7VUkucmVnaXN0ZXJDdXN0b21FbGVtZW50KCdsYWJlbCcsJ2R0LXNsaWRlcicse2NyZWF0ZWRDYWxsYmFjazpmdW5jdGlvbigpe2NvbnN0IHJvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMsJ3VpL3NsaWRlci5jc3MnKTt0aGlzLnNsaWRlckVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnaW5wdXQnLCdkdC1yYW5nZS1pbnB1dCcpO3RoaXMuc2xpZGVyRWxlbWVudC50eXBlPSdyYW5nZSc7cm9vdC5hcHBlbmRDaGlsZCh0aGlzLnNsaWRlckVsZW1lbnQpO30sc2V0IHZhbHVlKGFtb3VudCl7dGhpcy5zbGlkZXJFbGVtZW50LnZhbHVlPWFtb3VudDt9LGdldCB2YWx1ZSgpe3JldHVybiB0aGlzLnNsaWRlckVsZW1lbnQudmFsdWU7fSxfX3Byb3RvX186SFRNTExhYmVsRWxlbWVudC5wcm90b3R5cGV9KTtVSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2xhYmVsJywnZHQtc21hbGwtYnViYmxlJyx7Y3JlYXRlZENhbGxiYWNrOmZ1bmN0aW9uKCl7Y29uc3Qgcm9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcywndWkvc21hbGxCdWJibGUuY3NzJyk7dGhpcy5fdGV4dEVsZW1lbnQ9cm9vdC5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fdGV4dEVsZW1lbnQuY2xhc3NOYW1lPSdpbmZvJzt0aGlzLl90ZXh0RWxlbWVudC5jcmVhdGVDaGlsZCgnY29udGVudCcpO30sc2V0IHR5cGUodHlwZSl7dGhpcy5fdGV4dEVsZW1lbnQuY2xhc3NOYW1lPXR5cGU7fSxfX3Byb3RvX186SFRNTExhYmVsRWxlbWVudC5wcm90b3R5cGV9KTtVSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2RpdicsJ2R0LWNsb3NlLWJ1dHRvbicse2NyZWF0ZWRDYWxsYmFjazpmdW5jdGlvbigpe2NvbnN0IHJvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMsJ3VpL2Nsb3NlQnV0dG9uLmNzcycpO3RoaXMuX2J1dHRvbkVsZW1lbnQ9cm9vdC5jcmVhdGVDaGlsZCgnZGl2JywnY2xvc2UtYnV0dG9uJyk7Y29uc3QgcmVndWxhckljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jcm9zcycsJ2RlZmF1bHQtaWNvbicpO3RoaXMuX2hvdmVySWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1yZWQtY3Jvc3MtaG92ZXInLCdob3Zlci1pY29uJyk7dGhpcy5fYWN0aXZlSWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1yZWQtY3Jvc3MtYWN0aXZlJywnYWN0aXZlLWljb24nKTt0aGlzLl9idXR0b25FbGVtZW50LmFwcGVuZENoaWxkKHJlZ3VsYXJJY29uKTt0aGlzLl9idXR0b25FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2hvdmVySWNvbik7dGhpcy5fYnV0dG9uRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9hY3RpdmVJY29uKTt9LHNldCBncmF5KGdyYXkpe2lmKGdyYXkpe3RoaXMuX2hvdmVySWNvbi5zZXRJY29uVHlwZSgnbWVkaXVtaWNvbi1ncmF5LWNyb3NzLWhvdmVyJyk7dGhpcy5fYWN0aXZlSWNvbi5zZXRJY29uVHlwZSgnbWVkaXVtaWNvbi1ncmF5LWNyb3NzLWFjdGl2ZScpO31lbHNle3RoaXMuX2hvdmVySWNvbi5zZXRJY29uVHlwZSgnbWVkaXVtaWNvbi1yZWQtY3Jvc3MtaG92ZXInKTt0aGlzLl9hY3RpdmVJY29uLnNldEljb25UeXBlKCdtZWRpdW1pY29uLXJlZC1jcm9zcy1hY3RpdmUnKTt9fSxfX3Byb3RvX186SFRNTERpdkVsZW1lbnQucHJvdG90eXBlfSk7fSkoKTtVSS5iaW5kSW5wdXQ9ZnVuY3Rpb24oaW5wdXQsYXBwbHksdmFsaWRhdGUsbnVtZXJpYyxtb2RpZmllck11bHRpcGxpZXIpe2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsb25DaGFuZ2UsZmFsc2UpO2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxvbklucHV0LGZhbHNlKTtpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxvbktleURvd24sZmFsc2UpO2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyxpbnB1dC5zZWxlY3QuYmluZChpbnB1dCksZmFsc2UpO2Z1bmN0aW9uIG9uSW5wdXQoKXtpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCdlcnJvci1pbnB1dCcsIXZhbGlkYXRlKGlucHV0LnZhbHVlKSk7fQpmdW5jdGlvbiBvbkNoYW5nZSgpe2NvbnN0IHZhbGlkPXZhbGlkYXRlKGlucHV0LnZhbHVlKTtpbnB1dC5jbGFzc0xpc3QudG9nZ2xlKCdlcnJvci1pbnB1dCcsIXZhbGlkKTtpZih2YWxpZCkKYXBwbHkoaW5wdXQudmFsdWUpO30KZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KXtpZihpc0VudGVyS2V5KGV2ZW50KSl7aWYodmFsaWRhdGUoaW5wdXQudmFsdWUpKQphcHBseShpbnB1dC52YWx1ZSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm47fQppZighbnVtZXJpYykKcmV0dXJuO2NvbnN0IHZhbHVlPVVJLl9tb2RpZmllZEZsb2F0TnVtYmVyKHBhcnNlRmxvYXQoaW5wdXQudmFsdWUpLGV2ZW50LG1vZGlmaWVyTXVsdGlwbGllcik7Y29uc3Qgc3RyaW5nVmFsdWU9dmFsdWU/U3RyaW5nKHZhbHVlKTonJztpZighdmFsaWRhdGUoc3RyaW5nVmFsdWUpfHwhdmFsdWUpCnJldHVybjtpbnB1dC52YWx1ZT1zdHJpbmdWYWx1ZTthcHBseShpbnB1dC52YWx1ZSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9CmZ1bmN0aW9uIHNldFZhbHVlKHZhbHVlKXtpZih2YWx1ZT09PWlucHV0LnZhbHVlKQpyZXR1cm47Y29uc3QgdmFsaWQ9dmFsaWRhdGUodmFsdWUpO2lucHV0LmNsYXNzTGlzdC50b2dnbGUoJ2Vycm9yLWlucHV0JywhdmFsaWQpO2lucHV0LnZhbHVlPXZhbHVlO30KcmV0dXJuIHNldFZhbHVlO307VUkudHJpbVRleHQ9ZnVuY3Rpb24oY29udGV4dCx0ZXh0LG1heFdpZHRoLHRyaW1GdW5jdGlvbil7Y29uc3QgbWF4TGVuZ3RoPTIwMDtpZihtYXhXaWR0aDw9MTApCnJldHVybicnO2lmKHRleHQubGVuZ3RoPm1heExlbmd0aCkKdGV4dD10cmltRnVuY3Rpb24odGV4dCxtYXhMZW5ndGgpO2NvbnN0IHRleHRXaWR0aD1VSS5tZWFzdXJlVGV4dFdpZHRoKGNvbnRleHQsdGV4dCk7aWYodGV4dFdpZHRoPD1tYXhXaWR0aCkKcmV0dXJuIHRleHQ7bGV0IGw9MDtsZXQgcj10ZXh0Lmxlbmd0aDtsZXQgbHY9MDtsZXQgcnY9dGV4dFdpZHRoO3doaWxlKGw8ciYmbHYhPT1ydiYmbHYhPT1tYXhXaWR0aCl7Y29uc3QgbT1NYXRoLmNlaWwobCsoci1sKSoobWF4V2lkdGgtbHYpLyhydi1sdikpO2NvbnN0IG12PVVJLm1lYXN1cmVUZXh0V2lkdGgoY29udGV4dCx0cmltRnVuY3Rpb24odGV4dCxtKSk7aWYobXY8PW1heFdpZHRoKXtsPW07bHY9bXY7fWVsc2V7cj1tLTE7cnY9bXY7fX0KdGV4dD10cmltRnVuY3Rpb24odGV4dCxsKTtyZXR1cm4gdGV4dCE9PSdcdTIwMjYnP3RleHQ6Jyc7fTtVSS50cmltVGV4dE1pZGRsZT1mdW5jdGlvbihjb250ZXh0LHRleHQsbWF4V2lkdGgpe3JldHVybiBVSS50cmltVGV4dChjb250ZXh0LHRleHQsbWF4V2lkdGgsKHRleHQsd2lkdGgpPT50ZXh0LnRyaW1NaWRkbGUod2lkdGgpKTt9O1VJLnRyaW1UZXh0RW5kPWZ1bmN0aW9uKGNvbnRleHQsdGV4dCxtYXhXaWR0aCl7cmV0dXJuIFVJLnRyaW1UZXh0KGNvbnRleHQsdGV4dCxtYXhXaWR0aCwodGV4dCx3aWR0aCk9PnRleHQudHJpbUVuZCh3aWR0aCkpO307VUkubWVhc3VyZVRleHRXaWR0aD1mdW5jdGlvbihjb250ZXh0LHRleHQpe2NvbnN0IG1heENhY2hlYWJsZUxlbmd0aD0yMDA7aWYodGV4dC5sZW5ndGg+bWF4Q2FjaGVhYmxlTGVuZ3RoKQpyZXR1cm4gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtsZXQgd2lkdGhDYWNoZT1VSS5tZWFzdXJlVGV4dFdpZHRoLl90ZXh0V2lkdGhDYWNoZTtpZighd2lkdGhDYWNoZSl7d2lkdGhDYWNoZT1uZXcgTWFwKCk7VUkubWVhc3VyZVRleHRXaWR0aC5fdGV4dFdpZHRoQ2FjaGU9d2lkdGhDYWNoZTt9CmNvbnN0IGZvbnQ9Y29udGV4dC5mb250O2xldCB0ZXh0V2lkdGhzPXdpZHRoQ2FjaGUuZ2V0KGZvbnQpO2lmKCF0ZXh0V2lkdGhzKXt0ZXh0V2lkdGhzPW5ldyBNYXAoKTt3aWR0aENhY2hlLnNldChmb250LHRleHRXaWR0aHMpO30KbGV0IHdpZHRoPXRleHRXaWR0aHMuZ2V0KHRleHQpO2lmKCF3aWR0aCl7d2lkdGg9Y29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDt0ZXh0V2lkdGhzLnNldCh0ZXh0LHdpZHRoKTt9CnJldHVybiB3aWR0aDt9O1VJLlRoZW1lU3VwcG9ydD1jbGFzc3tjb25zdHJ1Y3RvcihzZXR0aW5nKXt0aGlzLl90aGVtZU5hbWU9c2V0dGluZy5nZXQoKXx8J2RlZmF1bHQnO3RoaXMuX3RoZW1hYmxlUHJvcGVydGllcz1uZXcgU2V0KFsnY29sb3InLCdib3gtc2hhZG93JywndGV4dC1zaGFkb3cnLCdvdXRsaW5lLWNvbG9yJywnYmFja2dyb3VuZC1pbWFnZScsJ2JhY2tncm91bmQtY29sb3InLCdib3JkZXItbGVmdC1jb2xvcicsJ2JvcmRlci1yaWdodC1jb2xvcicsJ2JvcmRlci10b3AtY29sb3InLCdib3JkZXItYm90dG9tLWNvbG9yJywnLXdlYmtpdC1ib3JkZXItaW1hZ2UnLCdmaWxsJywnc3Ryb2tlJ10pO3RoaXMuX2NhY2hlZFRoZW1lUGF0Y2hlcz1uZXcgTWFwKCk7dGhpcy5fc2V0dGluZz1zZXR0aW5nO3RoaXMuX2N1c3RvbVNoZWV0cz1uZXcgU2V0KCk7fQpoYXNUaGVtZSgpe3JldHVybiB0aGlzLl90aGVtZU5hbWUhPT0nZGVmYXVsdCc7fQp0aGVtZU5hbWUoKXtyZXR1cm4gdGhpcy5fdGhlbWVOYW1lO30KaW5qZWN0SGlnaGxpZ2h0U3R5bGVTaGVldHMoZWxlbWVudCl7dGhpcy5faW5qZWN0aW5nU3R5bGVTaGVldD10cnVlO1VJLmFwcGVuZFN0eWxlKGVsZW1lbnQsJ3VpL2luc3BlY3RvclN5bnRheEhpZ2hsaWdodC5jc3MnKTtpZih0aGlzLl90aGVtZU5hbWU9PT0nZGFyaycpClVJLmFwcGVuZFN0eWxlKGVsZW1lbnQsJ3VpL2luc3BlY3RvclN5bnRheEhpZ2hsaWdodERhcmsuY3NzJyk7dGhpcy5faW5qZWN0aW5nU3R5bGVTaGVldD1mYWxzZTt9CmluamVjdEN1c3RvbVN0eWxlU2hlZXRzKGVsZW1lbnQpe2Zvcihjb25zdCBzaGVldCBvZiB0aGlzLl9jdXN0b21TaGVldHMpe2NvbnN0IHN0eWxlRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlRWxlbWVudC50eXBlPSd0ZXh0L2Nzcyc7c3R5bGVFbGVtZW50LnRleHRDb250ZW50PXNoZWV0O2VsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTt9fQphZGRDdXN0b21TdHlsZXNoZWV0KHNoZWV0VGV4dCl7dGhpcy5fY3VzdG9tU2hlZXRzLmFkZChzaGVldFRleHQpO30KYXBwbHlUaGVtZShkb2N1bWVudCl7aWYoIXRoaXMuaGFzVGhlbWUoKSkKcmV0dXJuO2lmKHRoaXMuX3RoZW1lTmFtZT09PSdkYXJrJykKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJy10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCcpO2NvbnN0IHN0eWxlU2hlZXRzPWRvY3VtZW50LnN0eWxlU2hlZXRzO2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHN0eWxlU2hlZXRzLmxlbmd0aDsrK2kpCnJlc3VsdC5wdXNoKHRoaXMuX3BhdGNoRm9yVGhlbWUoc3R5bGVTaGVldHNbaV0uaHJlZixzdHlsZVNoZWV0c1tpXSkpO3Jlc3VsdC5wdXNoKCcvKiMgc291cmNlVVJMPWluc3BlY3Rvci5jc3MudGhlbWUgKi8nKTtjb25zdCBzdHlsZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3R5bGUnKTtzdHlsZUVsZW1lbnQudHlwZT0ndGV4dC9jc3MnO3N0eWxlRWxlbWVudC50ZXh0Q29udGVudD1yZXN1bHQuam9pbignXG4nKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7fQp0aGVtZVN0eWxlU2hlZXQoaWQsdGV4dCl7aWYoIXRoaXMuaGFzVGhlbWUoKXx8dGhpcy5faW5qZWN0aW5nU3R5bGVTaGVldCkKcmV0dXJuJyc7bGV0IHBhdGNoPXRoaXMuX2NhY2hlZFRoZW1lUGF0Y2hlcy5nZXQoaWQpO2lmKCFwYXRjaCl7Y29uc3Qgc3R5bGVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7c3R5bGVFbGVtZW50LnR5cGU9J3RleHQvY3NzJztzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7cGF0Y2g9dGhpcy5fcGF0Y2hGb3JUaGVtZShpZCxzdHlsZUVsZW1lbnQuc2hlZXQpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTt9CnJldHVybiBwYXRjaDt9Cl9wYXRjaEZvclRoZW1lKGlkLHN0eWxlU2hlZXQpe2NvbnN0IGNhY2hlZD10aGlzLl9jYWNoZWRUaGVtZVBhdGNoZXMuZ2V0KGlkKTtpZihjYWNoZWQpCnJldHVybiBjYWNoZWQ7dHJ5e2NvbnN0IHJ1bGVzPXN0eWxlU2hlZXQuY3NzUnVsZXM7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaj0wO2o8cnVsZXMubGVuZ3RoOysrail7aWYocnVsZXNbal1pbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGUpe3Jlc3VsdC5wdXNoKHRoaXMuX3BhdGNoRm9yVGhlbWUocnVsZXNbal0uc3R5bGVTaGVldC5ocmVmLHJ1bGVzW2pdLnN0eWxlU2hlZXQpKTtjb250aW51ZTt9CmNvbnN0IG91dHB1dD1bXTtjb25zdCBzdHlsZT1ydWxlc1tqXS5zdHlsZTtjb25zdCBzZWxlY3RvclRleHQ9cnVsZXNbal0uc2VsZWN0b3JUZXh0O2ZvcihsZXQgaT0wO3N0eWxlJiZpPHN0eWxlLmxlbmd0aDsrK2kpCnRoaXMuX3BhdGNoUHJvcGVydHkoc2VsZWN0b3JUZXh0LHN0eWxlLHN0eWxlW2ldLG91dHB1dCk7aWYob3V0cHV0Lmxlbmd0aCkKcmVzdWx0LnB1c2gocnVsZXNbal0uc2VsZWN0b3JUZXh0Kyd7JytvdXRwdXQuam9pbignJykrJ30nKTt9CmNvbnN0IGZ1bGxUZXh0PXJlc3VsdC5qb2luKCdcbicpO3RoaXMuX2NhY2hlZFRoZW1lUGF0Y2hlcy5zZXQoaWQsZnVsbFRleHQpO3JldHVybiBmdWxsVGV4dDt9Y2F0Y2goZSl7dGhpcy5fc2V0dGluZy5zZXQoJ2RlZmF1bHQnKTtyZXR1cm4nJzt9fQpfcGF0Y2hQcm9wZXJ0eShzZWxlY3RvclRleHQsc3R5bGUsbmFtZSxvdXRwdXQpe2lmKCF0aGlzLl90aGVtYWJsZVByb3BlcnRpZXMuaGFzKG5hbWUpKQpyZXR1cm47Y29uc3QgdmFsdWU9c3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtpZighdmFsdWV8fHZhbHVlPT09J25vbmUnfHx2YWx1ZT09PSdpbmhlcml0J3x8dmFsdWU9PT0naW5pdGlhbCd8fHZhbHVlPT09J3RyYW5zcGFyZW50JykKcmV0dXJuO2lmKG5hbWU9PT0nYmFja2dyb3VuZC1pbWFnZScmJnZhbHVlLmluZGV4T2YoJ2dyYWRpZW50Jyk9PT0tMSkKcmV0dXJuO2lmKHNlbGVjdG9yVGV4dC5pbmRleE9mKCctdGhlbWUtJykhPT0tMSkKcmV0dXJuO2xldCBjb2xvclVzYWdlPVVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLlVua25vd247aWYobmFtZS5pbmRleE9mKCdiYWNrZ3JvdW5kJyk9PT0wfHxuYW1lLmluZGV4T2YoJ2JvcmRlcicpPT09MCkKY29sb3JVc2FnZXw9VUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZDtpZihuYW1lLmluZGV4T2YoJ2JhY2tncm91bmQnKT09PS0xKQpjb2xvclVzYWdlfD1VSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5Gb3JlZ3JvdW5kO291dHB1dC5wdXNoKG5hbWUpO291dHB1dC5wdXNoKCc6Jyk7Y29uc3QgaXRlbXM9dmFsdWUucmVwbGFjZShDb21tb24uQ29sb3IuUmVnZXgsJ1wwJDFcMCcpLnNwbGl0KCdcMCcpO2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSkKb3V0cHV0LnB1c2godGhpcy5wYXRjaENvbG9yVGV4dChpdGVtc1tpXSxjb2xvclVzYWdlKSk7aWYoc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKSkKb3V0cHV0LnB1c2goJyAhaW1wb3J0YW50Jyk7b3V0cHV0LnB1c2goJzsnKTt9CnBhdGNoQ29sb3JUZXh0KHRleHQsY29sb3JVc2FnZSl7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKHRleHQpO2lmKCFjb2xvcikKcmV0dXJuIHRleHQ7Y29uc3Qgb3V0Q29sb3I9dGhpcy5wYXRjaENvbG9yKGNvbG9yLGNvbG9yVXNhZ2UpO2xldCBvdXRUZXh0PW91dENvbG9yLmFzU3RyaW5nKG51bGwpO2lmKCFvdXRUZXh0KQpvdXRUZXh0PW91dENvbG9yLmFzU3RyaW5nKG91dENvbG9yLmhhc0FscGhhKCk/Q29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBOkNvbW1vbi5Db2xvci5Gb3JtYXQuUkdCKTtyZXR1cm4gb3V0VGV4dHx8dGV4dDt9CnBhdGNoQ29sb3IoY29sb3IsY29sb3JVc2FnZSl7Y29uc3QgaHNsYT1jb2xvci5oc2xhKCk7dGhpcy5fcGF0Y2hIU0xBKGhzbGEsY29sb3JVc2FnZSk7Y29uc3QgcmdiYT1bXTtDb21tb24uQ29sb3IuaHNsMnJnYihoc2xhLHJnYmEpO3JldHVybiBuZXcgQ29tbW9uLkNvbG9yKHJnYmEsY29sb3IuZm9ybWF0KCkpO30KX3BhdGNoSFNMQShoc2xhLGNvbG9yVXNhZ2Upe2NvbnN0IGh1ZT1oc2xhWzBdO2NvbnN0IHNhdD1oc2xhWzFdO2xldCBsaXQ9aHNsYVsyXTtjb25zdCBhbHBoYT1oc2xhWzNdO3N3aXRjaCh0aGlzLl90aGVtZU5hbWUpe2Nhc2UnZGFyayc6Y29uc3QgbWluQ2FwPWNvbG9yVXNhZ2UmVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZD8wLjE0OjA7Y29uc3QgbWF4Q2FwPWNvbG9yVXNhZ2UmVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuRm9yZWdyb3VuZD8wLjk6MTtsaXQ9MS1saXQ7aWYobGl0PG1pbkNhcCoyKQpsaXQ9bWluQ2FwK2xpdC8yO2Vsc2UgaWYobGl0PjIqbWF4Q2FwLTEpCmxpdD1tYXhDYXAtMS8yK2xpdC8yO2JyZWFrO30KaHNsYVswXT1OdW1iZXIuY29uc3RyYWluKGh1ZSwwLDEpO2hzbGFbMV09TnVtYmVyLmNvbnN0cmFpbihzYXQsMCwxKTtoc2xhWzJdPU51bWJlci5jb25zdHJhaW4obGl0LDAsMSk7aHNsYVszXT1OdW1iZXIuY29uc3RyYWluKGFscGhhLDAsMSk7fX07VUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2U9e1Vua25vd246MCxGb3JlZ3JvdW5kOjE8PDAsQmFja2dyb3VuZDoxPDwxLH07VUkuY3JlYXRlRG9jdW1lbnRhdGlvbkxpbms9ZnVuY3Rpb24oYXJ0aWNsZSx0aXRsZSl7cmV0dXJuIFVJLlhMaW5rLmNyZWF0ZSgnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2Nocm9tZS1kZXZ0b29scy8nK2FydGljbGUsdGl0bGUpO307VUkubG9hZEltYWdlPWZ1bmN0aW9uKHVybCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bGZpbGw9Pntjb25zdCBpbWFnZT1uZXcgSW1hZ2UoKTtpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywoKT0+ZnVsZmlsbChpbWFnZSkpO2ltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywoKT0+ZnVsZmlsbChudWxsKSk7aW1hZ2Uuc3JjPXVybDt9KTt9O1VJLmxvYWRJbWFnZUZyb21EYXRhPWZ1bmN0aW9uKGRhdGEpe3JldHVybiBkYXRhP1VJLmxvYWRJbWFnZSgnZGF0YTppbWFnZS9qcGc7YmFzZTY0LCcrZGF0YSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpO307VUkudGhlbWVTdXBwb3J0O1VJLmNyZWF0ZUZpbGVTZWxlY3RvckVsZW1lbnQ9ZnVuY3Rpb24oY2FsbGJhY2spe2NvbnN0IGZpbGVTZWxlY3RvckVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnaW5wdXQnKTtmaWxlU2VsZWN0b3JFbGVtZW50LnR5cGU9J2ZpbGUnO2ZpbGVTZWxlY3RvckVsZW1lbnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7ZmlsZVNlbGVjdG9yRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywtMSk7ZmlsZVNlbGVjdG9yRWxlbWVudC5vbmNoYW5nZT1vbkNoYW5nZTtmdW5jdGlvbiBvbkNoYW5nZShldmVudCl7Y2FsbGJhY2soZmlsZVNlbGVjdG9yRWxlbWVudC5maWxlc1swXSk7fQpyZXR1cm4gZmlsZVNlbGVjdG9yRWxlbWVudDt9O1VJLk1heExlbmd0aEZvckRpc3BsYXllZFVSTHM9MTUwO1VJLk1lc3NhZ2VEaWFsb2c9Y2xhc3N7c3RhdGljIGFzeW5jIHNob3cobWVzc2FnZSx3aGVyZSl7Y29uc3QgZGlhbG9nPW5ldyBVSS5EaWFsb2coKTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5zZXREaW1tZWQodHJ1ZSk7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoZGlhbG9nLmNvbnRlbnRFbGVtZW50LCd1aS9jb25maXJtRGlhbG9nLmNzcycpO2NvbnN0IGNvbnRlbnQ9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2Jywnd2lkZ2V0Jyk7YXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IG9rQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdPSycpLHJlc29sdmUsJycsdHJ1ZSk7Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVzc2FnZScpLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9bWVzc2FnZTtjb250ZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdidXR0b24nKS5hcHBlbmRDaGlsZChva0J1dHRvbik7ZGlhbG9nLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKGV2ZW50PT57ZXZlbnQuY29uc3VtZSgpO3Jlc29sdmUoKTt9KTtkaWFsb2cuc2hvdyh3aGVyZSk7b2tCdXR0b24uZm9jdXMoKTt9KTtkaWFsb2cuaGlkZSgpO319O1VJLkNvbmZpcm1EaWFsb2c9Y2xhc3N7c3RhdGljIGFzeW5jIHNob3cobWVzc2FnZSx3aGVyZSl7Y29uc3QgZGlhbG9nPW5ldyBVSS5EaWFsb2coKTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5zZXREaW1tZWQodHJ1ZSk7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoZGlhbG9nLmNvbnRlbnRFbGVtZW50LCd1aS9jb25maXJtRGlhbG9nLmNzcycpO2NvbnN0IGNvbnRlbnQ9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2Jywnd2lkZ2V0Jyk7Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVzc2FnZScpLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9bWVzc2FnZTtjb25zdCBidXR0b25zQmFyPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2J1dHRvbicpO2NvbnN0IHJlc3VsdD1hd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlPT57YnV0dG9uc0Jhci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnT0snKSwoKT0+cmVzb2x2ZSh0cnVlKSwnJyx0cnVlKSk7YnV0dG9uc0Jhci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2FuY2VsJyksKCk9PnJlc29sdmUoZmFsc2UpKSk7ZGlhbG9nLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKGV2ZW50PT57ZXZlbnQuY29uc3VtZSgpO3Jlc29sdmUoZmFsc2UpO30pO2RpYWxvZy5zaG93KHdoZXJlKTt9KTtkaWFsb2cuaGlkZSgpO3JldHVybiByZXN1bHQ7fX07VUkuY3JlYXRlSW5saW5lQnV0dG9uPWZ1bmN0aW9uKHRvb2xiYXJCdXR0b24pe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKGVsZW1lbnQsJ3VpL2lubGluZUJ1dHRvbi5jc3MnKTtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lubGluZS1idXR0b24nKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRvb2xiYXJCdXR0b24pO3NoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodG9vbGJhci5lbGVtZW50KTtyZXR1cm4gZWxlbWVudDt9O1VJLmNyZWF0ZUV4cGFuZGFibGVUZXh0PWZ1bmN0aW9uKHRleHQsbWF4TGVuZ3RoKXtjb25zdCBmcmFnbWVudD1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ZnJhZ21lbnQudGV4dENvbnRlbnQ9dGV4dC5zbGljZSgwLG1heExlbmd0aCk7Y29uc3QgaGlkZGVuVGV4dD10ZXh0LnNsaWNlKG1heExlbmd0aCk7Y29uc3QgZXhwYW5kQnV0dG9uPWZyYWdtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnZXhwYW5kYWJsZS1pbmxpbmUtYnV0dG9uJyk7ZXhwYW5kQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS10ZXh0Jyxsc2BTaG93ICR7TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IoaGlkZGVuVGV4dC5sZW5ndGgpfSBtb3JlYCk7ZXhwYW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e2lmKGV4cGFuZEJ1dHRvbi5wYXJlbnRFbGVtZW50KQpleHBhbmRCdXR0b24ucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoY3JlYXRlVGV4dE5vZGUoaGlkZGVuVGV4dCksZXhwYW5kQnV0dG9uKTtleHBhbmRCdXR0b24ucmVtb3ZlKCk7fSk7Y29uc3QgY29weUJ1dHRvbj1mcmFnbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2V4cGFuZGFibGUtaW5saW5lLWJ1dHRvbicpO2NvcHlCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRleHQnLGxzYENvcHlgKTtjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dCh0ZXh0KTt9KTtyZXR1cm4gZnJhZ21lbnQ7fTs7VUkuQVJJQVV0aWxzPXt9O1VJLkFSSUFVdGlscy5tYXJrQXNCdXR0b249ZnVuY3Rpb24oZWxlbWVudCl7ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdidXR0b24nKTt9O1VJLkFSSUFVdGlscy5tYXJrQXNHcm91cD1mdW5jdGlvbihlbGVtZW50KXtlbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsJ2dyb3VwJyk7fTtVSS5BUklBVXRpbHMubWFya0FzTGluaz1mdW5jdGlvbihlbGVtZW50KXtlbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsJ2xpbmsnKTt9O1VJLkFSSUFVdGlscy5tYXJrQXNUYWI9ZnVuY3Rpb24oZWxlbWVudCl7ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCd0YWInKTt9O1VJLkFSSUFVdGlscy5tYXJrQXNUcmVlPWZ1bmN0aW9uKGVsZW1lbnQpe2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywndHJlZScpO307VUkuQVJJQVV0aWxzLm1hcmtBc1RyZWVpdGVtPWZ1bmN0aW9uKGVsZW1lbnQpe2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywndHJlZWl0ZW0nKTt9O1VJLkFSSUFVdGlscy5tYXJrQXNUZXh0Qm94PWZ1bmN0aW9uKGVsZW1lbnQpe2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywndGV4dGJveCcpO307VUkuQVJJQVV0aWxzLm1hcmtBc0hpZGRlbj1mdW5jdGlvbihlbGVtZW50KXtlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7fTtVSS5BUklBVXRpbHMuc2V0UGxhY2Vob2xkZXI9ZnVuY3Rpb24oZWxlbWVudCxwbGFjZWhvbGRlcil7aWYocGxhY2Vob2xkZXIpCmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXBsYWNlaG9sZGVyJyxwbGFjZWhvbGRlcik7ZWxzZQplbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1wbGFjZWhvbGRlcicpO307VUkuQVJJQVV0aWxzLm1hcmtBc1ByZXNlbnRhdGlvbj1mdW5jdGlvbihlbGVtZW50KXtlbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsJ3ByZXNlbnRhdGlvbicpO307VUkuQVJJQVV0aWxzLnNldENvbnRyb2xzPWZ1bmN0aW9uKGVsZW1lbnQsY29udHJvbGxlZEVsZW1lbnQpe2lmKCFjb250cm9sbGVkRWxlbWVudCl7ZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnKTtyZXR1cm47fQppZihjb250cm9sbGVkRWxlbWVudC5pZD09PScnKQp0aHJvdyBuZXcgRXJyb3IoJ0NvbnRyb2xsZWQgZWxlbWVudCBtdXN0IGhhdmUgSUQnKTtlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsY29udHJvbGxlZEVsZW1lbnQuaWQpO307VUkuQVJJQVV0aWxzLnNldEV4cGFuZGVkPWZ1bmN0aW9uKGVsZW1lbnQsdmFsdWUpe2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywhIXZhbHVlKTt9O1VJLkFSSUFVdGlscy51bnNldEV4cGFuZGVkPWZ1bmN0aW9uKGVsZW1lbnQpe2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7fTtVSS5BUklBVXRpbHMuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oZWxlbWVudCx2YWx1ZSl7ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCEhdmFsdWUpO307VUkuQVJJQVV0aWxzLnNldFByZXNzZWQ9ZnVuY3Rpb24oZWxlbWVudCx2YWx1ZSl7ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsISF2YWx1ZSk7fTtVSS5BUklBVXRpbHMuc2V0QWNjZXNzaWJsZU5hbWU9ZnVuY3Rpb24oZWxlbWVudCxuYW1lKXtlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsbmFtZSk7fTtVSS5BUklBVXRpbHMuYWxlcnQ9ZnVuY3Rpb24obWVzc2FnZSxlbGVtZW50KXtjb25zdCBkb2N1bWVudD1lbGVtZW50Lm93bmVyRG9jdW1lbnQ7aWYoIWRvY3VtZW50W1VJLkFSSUFVdGlscy5BbGVydEVsZW1lbnRTeW1ib2xdKXtjb25zdCBhbGVydEVsZW1lbnQ9ZG9jdW1lbnQuYm9keS5jcmVhdGVDaGlsZCgnZGl2Jyk7YWxlcnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uPSdhYnNvbHV0ZSc7YWxlcnRFbGVtZW50LnN0eWxlLmxlZnQ9Jy05OTllbSc7YWxlcnRFbGVtZW50LnN0eWxlLndpZHRoPScxMDBlbSc7YWxlcnRFbGVtZW50LnN0eWxlLm92ZXJmbG93PSdoaWRkZW4nO2FsZXJ0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdhbGVydCcpO2FsZXJ0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYXRvbWljJywndHJ1ZScpO2RvY3VtZW50W1VJLkFSSUFVdGlscy5BbGVydEVsZW1lbnRTeW1ib2xdPWFsZXJ0RWxlbWVudDt9CmRvY3VtZW50W1VJLkFSSUFVdGlscy5BbGVydEVsZW1lbnRTeW1ib2xdLnRleHRDb250ZW50PW1lc3NhZ2UudHJpbUVuZCgxMDAwMCk7fTtVSS5BUklBVXRpbHMuQWxlcnRFbGVtZW50U3ltYm9sPVN5bWJvbCgnQWxlcnRFbGVtZW50U3libW9sJyk7O1VJLlpvb21NYW5hZ2VyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcih3aW5kb3csZnJvbnRlbmRIb3N0KXtzdXBlcigpO3RoaXMuX2Zyb250ZW5kSG9zdD1mcm9udGVuZEhvc3Q7dGhpcy5fem9vbUZhY3Rvcj10aGlzLl9mcm9udGVuZEhvc3Quem9vbUZhY3RvcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHRoaXMuX29uV2luZG93UmVzaXplLmJpbmQodGhpcyksdHJ1ZSk7fQp6b29tRmFjdG9yKCl7cmV0dXJuIHRoaXMuX3pvb21GYWN0b3I7fQpjc3NUb0RJUCh2YWx1ZSl7cmV0dXJuIHZhbHVlKnRoaXMuX3pvb21GYWN0b3I7fQpkaXBUb0NTUyh2YWx1ZURJUCl7cmV0dXJuIHZhbHVlRElQL3RoaXMuX3pvb21GYWN0b3I7fQpfb25XaW5kb3dSZXNpemUoKXtjb25zdCBvbGRab29tRmFjdG9yPXRoaXMuX3pvb21GYWN0b3I7dGhpcy5fem9vbUZhY3Rvcj10aGlzLl9mcm9udGVuZEhvc3Quem9vbUZhY3RvcigpO2lmKG9sZFpvb21GYWN0b3IhPT10aGlzLl96b29tRmFjdG9yKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhVSS5ab29tTWFuYWdlci5FdmVudHMuWm9vbUNoYW5nZWQse2Zyb206b2xkWm9vbUZhY3Rvcix0bzp0aGlzLl96b29tRmFjdG9yfSk7fX07VUkuWm9vbU1hbmFnZXIuRXZlbnRzPXtab29tQ2hhbmdlZDpTeW1ib2woJ1pvb21DaGFuZ2VkJyl9O1VJLnpvb21NYW5hZ2VyOztVSS5TaG9ydGN1dHNTY3JlZW49Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9zZWN0aW9ucz17fTt9CnN0YXRpYyByZWdpc3RlclNob3J0Y3V0cygpe2NvbnN0IGVsZW1lbnRzU2VjdGlvbj1VSS5zaG9ydGN1dHNTY3JlZW4uc2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0VsZW1lbnRzIFBhbmVsJykpO2NvbnN0IG5hdmlnYXRlPVVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLk5hdmlnYXRlVXAuY29uY2F0KFVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLk5hdmlnYXRlRG93bik7ZWxlbWVudHNTZWN0aW9uLmFkZFJlbGF0ZWRLZXlzKG5hdmlnYXRlLENvbW1vbi5VSVN0cmluZygnTmF2aWdhdGUgZWxlbWVudHMnKSk7Y29uc3QgZXhwYW5kQ29sbGFwc2U9VUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuRXhwYW5kLmNvbmNhdChVSS5TaG9ydGN1dHNTY3JlZW4uRWxlbWVudHNQYW5lbFNob3J0Y3V0cy5Db2xsYXBzZSk7ZWxlbWVudHNTZWN0aW9uLmFkZFJlbGF0ZWRLZXlzKGV4cGFuZENvbGxhcHNlLENvbW1vbi5VSVN0cmluZygnRXhwYW5kL2NvbGxhcHNlJykpO2VsZW1lbnRzU2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLkVkaXRBdHRyaWJ1dGUsQ29tbW9uLlVJU3RyaW5nKCdFZGl0IGF0dHJpYnV0ZScpKTtlbGVtZW50c1NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24oJ2VsZW1lbnRzLmhpZGUtZWxlbWVudCcpLENvbW1vbi5VSVN0cmluZygnSGlkZSBlbGVtZW50JykpO2VsZW1lbnRzU2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignZWxlbWVudHMuZWRpdC1hcy1odG1sJyksQ29tbW9uLlVJU3RyaW5nKCdUb2dnbGUgZWRpdCBhcyBIVE1MJykpO2NvbnN0IHN0eWxlc1BhbmVTZWN0aW9uPVVJLnNob3J0Y3V0c1NjcmVlbi5zZWN0aW9uKENvbW1vbi5VSVN0cmluZygnU3R5bGVzIFBhbmUnKSk7Y29uc3QgbmV4dFByZXZpb3VzUHJvcGVydHk9VUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuTmV4dFByb3BlcnR5LmNvbmNhdChVSS5TaG9ydGN1dHNTY3JlZW4uRWxlbWVudHNQYW5lbFNob3J0Y3V0cy5QcmV2aW91c1Byb3BlcnR5KTtzdHlsZXNQYW5lU2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhuZXh0UHJldmlvdXNQcm9wZXJ0eSxDb21tb24uVUlTdHJpbmcoJ05leHQvcHJldmlvdXMgcHJvcGVydHknKSk7c3R5bGVzUGFuZVNlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuSW5jcmVtZW50VmFsdWUsQ29tbW9uLlVJU3RyaW5nKCdJbmNyZW1lbnQgdmFsdWUnKSk7c3R5bGVzUGFuZVNlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuRGVjcmVtZW50VmFsdWUsQ29tbW9uLlVJU3RyaW5nKCdEZWNyZW1lbnQgdmFsdWUnKSk7c3R5bGVzUGFuZVNlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uRWxlbWVudHNQYW5lbFNob3J0Y3V0cy5JbmNyZW1lbnRCeTEwLENvbW1vbi5VSVN0cmluZygnSW5jcmVtZW50IGJ5ICVmJywxMCkpO3N0eWxlc1BhbmVTZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuRGVjcmVtZW50QnkxMCxDb21tb24uVUlTdHJpbmcoJ0RlY3JlbWVudCBieSAlZicsMTApKTtzdHlsZXNQYW5lU2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLkluY3JlbWVudEJ5MTAwLENvbW1vbi5VSVN0cmluZygnSW5jcmVtZW50IGJ5ICVmJywxMDApKTtzdHlsZXNQYW5lU2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLkRlY3JlbWVudEJ5MTAwLENvbW1vbi5VSVN0cmluZygnRGVjcmVtZW50IGJ5ICVmJywxMDApKTtzdHlsZXNQYW5lU2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzLkluY3JlbWVudEJ5MDEsQ29tbW9uLlVJU3RyaW5nKCdJbmNyZW1lbnQgYnkgJWYnLDAuMSkpO3N0eWxlc1BhbmVTZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkVsZW1lbnRzUGFuZWxTaG9ydGN1dHMuRGVjcmVtZW50QnkwMSxDb21tb24uVUlTdHJpbmcoJ0RlY3JlbWVudCBieSAlZicsMC4xKSk7bGV0IHNlY3Rpb249VUkuc2hvcnRjdXRzU2NyZWVuLnNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdEZWJ1Z2dlcicpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci50b2dnbGUtcGF1c2UnKSxDb21tb24uVUlTdHJpbmcoJ1BhdXNlLyBDb250aW51ZScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci5zdGVwLW92ZXInKSxDb21tb24uVUlTdHJpbmcoJ1N0ZXAgb3ZlcicpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci5zdGVwLWludG8nKSxDb21tb24uVUlTdHJpbmcoJ1N0ZXAgaW50bycpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci5zdGVwLW91dCcpLENvbW1vbi5VSVN0cmluZygnU3RlcCBvdXQnKSk7Y29uc3QgbmV4dEFuZFByZXZGcmFtZUtleXM9VUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci5uZXh0LWNhbGwtZnJhbWUnKS5jb25jYXQoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci5wcmV2aW91cy1jYWxsLWZyYW1lJykpO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMobmV4dEFuZFByZXZGcmFtZUtleXMsQ29tbW9uLlVJU3RyaW5nKCdOZXh0L3ByZXZpb3VzIGNhbGwgZnJhbWUnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5Tb3VyY2VzUGFuZWxTaG9ydGN1dHMuRXZhbHVhdGVTZWxlY3Rpb25JbkNvbnNvbGUsQ29tbW9uLlVJU3RyaW5nKCdFdmFsdWF0ZSBzZWxlY3Rpb24gaW4gY29uc29sZScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLlNvdXJjZXNQYW5lbFNob3J0Y3V0cy5BZGRTZWxlY3Rpb25Ub1dhdGNoLENvbW1vbi5VSVN0cmluZygnQWRkIHNlbGVjdGlvbiB0byB3YXRjaCcpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci50b2dnbGUtYnJlYWtwb2ludCcpLENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIGJyZWFrcG9pbnQnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignZGVidWdnZXIudG9nZ2xlLWJyZWFrcG9pbnQtZW5hYmxlZCcpLENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIGJyZWFrcG9pbnQgZW5hYmxlZCcpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdkZWJ1Z2dlci50b2dnbGUtYnJlYWtwb2ludHMtYWN0aXZlJyksQ29tbW9uLlVJU3RyaW5nKCdUb2dnbGUgYWxsIGJyZWFrcG9pbnRzJykpO3NlY3Rpb249VUkuc2hvcnRjdXRzU2NyZWVuLnNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdUZXh0IEVkaXRvcicpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdzb3VyY2VzLmdvLXRvLW1lbWJlcicpLENvbW1vbi5VSVN0cmluZygnR28gdG8gbWVtYmVyJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uU291cmNlc1BhbmVsU2hvcnRjdXRzLlRvZ2dsZUF1dG9jb21wbGV0aW9uLENvbW1vbi5VSVN0cmluZygnQXV0b2NvbXBsZXRpb24nKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignc291cmNlcy5nby10by1saW5lJyksQ29tbW9uLlVJU3RyaW5nKCdHbyB0byBsaW5lJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24oJ3NvdXJjZXMuanVtcC10by1wcmV2aW91cy1sb2NhdGlvbicpLENvbW1vbi5VSVN0cmluZygnSnVtcCB0byBwcmV2aW91cyBlZGl0aW5nIGxvY2F0aW9uJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24oJ3NvdXJjZXMuanVtcC10by1uZXh0LWxvY2F0aW9uJyksQ29tbW9uLlVJU3RyaW5nKCdKdW1wIHRvIG5leHQgZWRpdGluZyBsb2NhdGlvbicpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLlNvdXJjZXNQYW5lbFNob3J0Y3V0cy5Ub2dnbGVDb21tZW50LENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIGNvbW1lbnQnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5Tb3VyY2VzUGFuZWxTaG9ydGN1dHMuSW5jcmVhc2VDU1NVbml0QnlPbmUsQ29tbW9uLlVJU3RyaW5nKCdJbmNyZW1lbnQgQ1NTIHVuaXQgYnkgMScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLlNvdXJjZXNQYW5lbFNob3J0Y3V0cy5EZWNyZWFzZUNTU1VuaXRCeU9uZSxDb21tb24uVUlTdHJpbmcoJ0RlY3JlbWVudCBDU1MgdW5pdCBieSAxJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uU291cmNlc1BhbmVsU2hvcnRjdXRzLkluY3JlYXNlQ1NTVW5pdEJ5VGVuLENvbW1vbi5VSVN0cmluZygnSW5jcmVtZW50IENTUyB1bml0IGJ5IDEwJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uU291cmNlc1BhbmVsU2hvcnRjdXRzLkRlY3JlYXNlQ1NTVW5pdEJ5VGVuLENvbW1vbi5VSVN0cmluZygnRGVjcmVtZW50IENTUyB1bml0IGJ5IDEwJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uU291cmNlc1BhbmVsU2hvcnRjdXRzLlNlbGVjdE5leHRPY2N1cnJlbmNlLENvbW1vbi5VSVN0cmluZygnU2VsZWN0IG5leHQgb2NjdXJyZW5jZScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLlNvdXJjZXNQYW5lbFNob3J0Y3V0cy5Tb2Z0VW5kbyxDb21tb24uVUlTdHJpbmcoJ1NvZnQgdW5kbycpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLlNvdXJjZXNQYW5lbFNob3J0Y3V0cy5Hb3RvTWF0Y2hpbmdCcmFja2V0LENvbW1vbi5VSVN0cmluZygnR28gdG8gbWF0Y2hpbmcgYnJhY2tldCcpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdzb3VyY2VzLmNsb3NlLWVkaXRvci10YWInKSxDb21tb24uVUlTdHJpbmcoJ0Nsb3NlIGVkaXRvciB0YWInKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignc291cmNlcy5zd2l0Y2gtZmlsZScpLENvbW1vbi5VSVN0cmluZygnU3dpdGNoIGJldHdlZW4gZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBkaWZmZXJlbnQgZXh0ZW5zaW9ucy4nKSk7c2VjdGlvbj1VSS5zaG9ydGN1dHNTY3JlZW4uc2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ1BlcmZvcm1hbmNlIFBhbmVsJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24oJ3RpbWVsaW5lLnRvZ2dsZS1yZWNvcmRpbmcnKSxDb21tb24uVUlTdHJpbmcoJ1N0YXJ0L3N0b3AgcmVjb3JkaW5nJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0RGVzY3JpcHRvcnNGb3JBY3Rpb24oJ3RpbWVsaW5lLnJlY29yZC1yZWxvYWQnKSxDb21tb24uVUlTdHJpbmcoJ1JlY29yZCBwYWdlIHJlbG9hZCcpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5zYXZlLXRvLWZpbGUnKSxDb21tb24uVUlTdHJpbmcoJ1NhdmUgcHJvZmlsZScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5sb2FkLWZyb20tZmlsZScpLENvbW1vbi5VSVN0cmluZygnTG9hZCBwcm9maWxlJykpO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5qdW1wLXRvLXByZXZpb3VzLWZyYW1lJykuY29uY2F0KFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbigndGltZWxpbmUuanVtcC10by1uZXh0LWZyYW1lJykpLENvbW1vbi5VSVN0cmluZygnSnVtcCB0byBwcmV2aW91cy9uZXh0IGZyYW1lJykpO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5zaG93LWhpc3RvcnknKSxDb21tb24uVUlTdHJpbmcoJ1BpY2sgYSByZWNvcmRpbmcgZnJvbSBoaXN0b3J5JykpO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5wcmV2aW91cy1yZWNvcmRpbmcnKS5jb25jYXQoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5uZXh0LXJlY29yZGluZycpKSxDb21tb24uVUlTdHJpbmcoJ1Nob3cgcHJldmlvdXMvbmV4dCByZWNvcmRpbmcnKSk7c2VjdGlvbj1VSS5zaG9ydGN1dHNTY3JlZW4uc2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ01lbW9yeSBQYW5lbCcpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdwcm9maWxlci5oZWFwLXRvZ2dsZS1yZWNvcmRpbmcnKSxDb21tb24uVUlTdHJpbmcoJ1N0YXJ0L3N0b3AgcmVjb3JkaW5nJykpO3NlY3Rpb249VUkuc2hvcnRjdXRzU2NyZWVuLnNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdMYXllcnMgUGFuZWwnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5SZXNldFZpZXcsQ29tbW9uLlVJU3RyaW5nKCdSZXNldCB2aWV3JykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uTGF5ZXJzUGFuZWxTaG9ydGN1dHMuUGFuTW9kZSxDb21tb24uVUlTdHJpbmcoJ1N3aXRjaCB0byBwYW4gbW9kZScpKTtzZWN0aW9uLmFkZEFsdGVybmF0ZUtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlJvdGF0ZU1vZGUsQ29tbW9uLlVJU3RyaW5nKCdTd2l0Y2ggdG8gcm90YXRlIG1vZGUnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5Ub2dnbGVQYW5Sb3RhdGUsQ29tbW9uLlVJU3RyaW5nKCdUZW1wb3JhcmlseSB0b2dnbGUgcGFuL3JvdGF0ZSBtb2RlIHdoaWxlIGhlbGQnKSk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5ab29tSW4sQ29tbW9uLlVJU3RyaW5nKCdab29tIGluJykpO3NlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uTGF5ZXJzUGFuZWxTaG9ydGN1dHMuWm9vbU91dCxDb21tb24uVUlTdHJpbmcoJ1pvb20gb3V0JykpO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlVwLmNvbmNhdChVSS5TaG9ydGN1dHNTY3JlZW4uTGF5ZXJzUGFuZWxTaG9ydGN1dHMuRG93biksQ29tbW9uLlVJU3RyaW5nKCdQYW4gb3Igcm90YXRlIHVwL2Rvd24nKSk7c2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhVSS5TaG9ydGN1dHNTY3JlZW4uTGF5ZXJzUGFuZWxTaG9ydGN1dHMuTGVmdC5jb25jYXQoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlJpZ2h0KSxDb21tb24uVUlTdHJpbmcoJ1BhbiBvciByb3RhdGUgbGVmdC9yaWdodCcpKTt9CnNlY3Rpb24obmFtZSl7bGV0IHNlY3Rpb249dGhpcy5fc2VjdGlvbnNbbmFtZV07aWYoIXNlY3Rpb24pCnRoaXMuX3NlY3Rpb25zW25hbWVdPXNlY3Rpb249bmV3IFVJLlNob3J0Y3V0c1NlY3Rpb24obmFtZSk7cmV0dXJuIHNlY3Rpb247fQpjcmVhdGVTaG9ydGN1dHNUYWJWaWV3KCl7Y29uc3Qgb3JkZXJlZFNlY3Rpb25zPVtdO2Zvcihjb25zdCBzZWN0aW9uIGluIHRoaXMuX3NlY3Rpb25zKQpvcmRlcmVkU2VjdGlvbnMucHVzaCh0aGlzLl9zZWN0aW9uc1tzZWN0aW9uXSk7ZnVuY3Rpb24gY29tcGFyZVNlY3Rpb25zKGEsYil7cmV0dXJuIGEub3JkZXItYi5vcmRlcjt9Cm9yZGVyZWRTZWN0aW9ucy5zb3J0KGNvbXBhcmVTZWN0aW9ucyk7Y29uc3Qgd2lkZ2V0PW5ldyBVSS5XaWRnZXQoKTt3aWRnZXQuZWxlbWVudC5jbGFzc05hbWU9J3NldHRpbmdzLXRhYi1jb250YWluZXInO3dpZGdldC5lbGVtZW50LmNyZWF0ZUNoaWxkKCdoZWFkZXInKS5jcmVhdGVDaGlsZCgnaDMnKS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdTaG9ydGN1dHMnKSk7Y29uc3Qgc2Nyb2xsUGFuZT13aWRnZXQuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2V0dGluZ3MtY29udGFpbmVyLXdyYXBwZXInKTtjb25zdCBjb250YWluZXI9c2Nyb2xsUGFuZS5jcmVhdGVDaGlsZCgnZGl2Jyk7Y29udGFpbmVyLmNsYXNzTmFtZT0nc2V0dGluZ3MtY29udGVudCBzZXR0aW5ncy1jb250YWluZXInO2ZvcihsZXQgaT0wO2k8b3JkZXJlZFNlY3Rpb25zLmxlbmd0aDsrK2kpCm9yZGVyZWRTZWN0aW9uc1tpXS5yZW5kZXJTZWN0aW9uKGNvbnRhaW5lcik7Y29uc3Qgbm90ZT1zY3JvbGxQYW5lLmNyZWF0ZUNoaWxkKCdwJywnc2V0dGluZ3MtZm9vdG5vdGUnKTtub3RlLmFwcGVuZENoaWxkKFVJLmNyZWF0ZURvY3VtZW50YXRpb25MaW5rKCdpdGVyYXRlL2luc3BlY3Qtc3R5bGVzL3Nob3J0Y3V0cycsQ29tbW9uLlVJU3RyaW5nKCdGdWxsIGxpc3Qgb2YgRGV2VG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzIGFuZCBnZXN0dXJlcycpKSk7cmV0dXJuIHdpZGdldDt9fTtVSS5zaG9ydGN1dHNTY3JlZW47VUkuU2hvcnRjdXRzU2VjdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihuYW1lKXt0aGlzLm5hbWU9bmFtZTt0aGlzLl9saW5lcz0oW10pO3RoaXMub3JkZXI9KytVSS5TaG9ydGN1dHNTZWN0aW9uLl9zZXF1ZW5jZU51bWJlcjt9CmFkZEtleShrZXksZGVzY3JpcHRpb24pe3RoaXMuX2FkZExpbmUodGhpcy5fcmVuZGVyS2V5KGtleSksZGVzY3JpcHRpb24pO30KYWRkUmVsYXRlZEtleXMoa2V5cyxkZXNjcmlwdGlvbil7dGhpcy5fYWRkTGluZSh0aGlzLl9yZW5kZXJTZXF1ZW5jZShrZXlzLCcvJyksZGVzY3JpcHRpb24pO30KYWRkQWx0ZXJuYXRlS2V5cyhrZXlzLGRlc2NyaXB0aW9uKXt0aGlzLl9hZGRMaW5lKHRoaXMuX3JlbmRlclNlcXVlbmNlKGtleXMsQ29tbW9uLlVJU3RyaW5nKCdvcicpKSxkZXNjcmlwdGlvbik7fQpfYWRkTGluZShrZXlFbGVtZW50LGRlc2NyaXB0aW9uKXt0aGlzLl9saW5lcy5wdXNoKHtrZXk6a2V5RWxlbWVudCx0ZXh0OmRlc2NyaXB0aW9ufSk7fQpyZW5kZXJTZWN0aW9uKGNvbnRhaW5lcil7Y29uc3QgcGFyZW50PWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc2V0dGluZ3MtYmxvY2snKTtjb25zdCBoZWFkTGluZT1wYXJlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLWxpbmUnKTtoZWFkTGluZS5jcmVhdGVDaGlsZCgnZGl2Jywnc2V0dGluZ3Mta2V5LWNlbGwnKTtoZWFkTGluZS5jcmVhdGVDaGlsZCgnZGl2Jywnc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSBzZXR0aW5ncy1jZWxsJykudGV4dENvbnRlbnQ9dGhpcy5uYW1lO2ZvcihsZXQgaT0wO2k8dGhpcy5fbGluZXMubGVuZ3RoOysraSl7Y29uc3QgbGluZT1wYXJlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLWxpbmUnKTtjb25zdCBrZXlDZWxsPWxpbmUuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLWtleS1jZWxsJyk7a2V5Q2VsbC5hcHBlbmRDaGlsZCh0aGlzLl9saW5lc1tpXS5rZXkpO2tleUNlbGwuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU3Bhbignc2V0dGluZ3Mta2V5LWRlbGltaXRlcicsJzonKSk7bGluZS5jcmVhdGVDaGlsZCgnZGl2Jywnc2V0dGluZ3MtY2VsbCcpLnRleHRDb250ZW50PXRoaXMuX2xpbmVzW2ldLnRleHQ7fX0KX3JlbmRlclNlcXVlbmNlKHNlcXVlbmNlLGRlbGltaXRlcil7Y29uc3QgZGVsaW1pdGVyU3Bhbj10aGlzLl9jcmVhdGVTcGFuKCdzZXR0aW5ncy1rZXktZGVsaW1pdGVyJyxkZWxpbWl0ZXIpO3JldHVybiB0aGlzLl9qb2luTm9kZXMoc2VxdWVuY2UubWFwKHRoaXMuX3JlbmRlcktleS5iaW5kKHRoaXMpKSxkZWxpbWl0ZXJTcGFuKTt9Cl9yZW5kZXJLZXkoa2V5KXtjb25zdCBrZXlOYW1lPWtleS5uYW1lO2NvbnN0IHBsdXM9dGhpcy5fY3JlYXRlU3Bhbignc2V0dGluZ3MtY29tYmluZS1rZXlzJywnKycpO3JldHVybiB0aGlzLl9qb2luTm9kZXMoa2V5TmFtZS5zcGxpdCgnICsgJykubWFwKHRoaXMuX2NyZWF0ZVNwYW4uYmluZCh0aGlzLCdzZXR0aW5ncy1rZXknKSkscGx1cyk7fQpfY3JlYXRlU3BhbihjbGFzc05hbWUsdGV4dENvbnRlbnQpe2NvbnN0IG5vZGU9Y3JlYXRlRWxlbWVudCgnc3BhbicpO25vZGUuY2xhc3NOYW1lPWNsYXNzTmFtZTtub2RlLnRleHRDb250ZW50PXRleHRDb250ZW50O3JldHVybiBub2RlO30KX2pvaW5Ob2Rlcyhub2RlcyxkZWxpbWl0ZXIpe2NvbnN0IHJlc3VsdD1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKGxldCBpPTA7aTxub2Rlcy5sZW5ndGg7KytpKXtpZihpPjApCnJlc3VsdC5hcHBlbmRDaGlsZChkZWxpbWl0ZXIuY2xvbmVOb2RlKHRydWUpKTtyZXN1bHQuYXBwZW5kQ2hpbGQobm9kZXNbaV0pO30KcmV0dXJuIHJlc3VsdDt9fTtVSS5TaG9ydGN1dHNTZWN0aW9uLl9zZXF1ZW5jZU51bWJlcj0wO1VJLlNob3J0Y3V0c1NjcmVlbi5FbGVtZW50c1BhbmVsU2hvcnRjdXRzPXtOYXZpZ2F0ZVVwOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5VcCldLE5hdmlnYXRlRG93bjpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRG93bildLEV4cGFuZDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuUmlnaHQpXSxDb2xsYXBzZTpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuTGVmdCldLEVkaXRBdHRyaWJ1dGU6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVudGVyKV0sTmV4dFByb3BlcnR5OltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5UYWIpXSxQcmV2aW91c1Byb3BlcnR5OltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5UYWIsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQpXSxJbmNyZW1lbnRWYWx1ZTpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuVXApXSxEZWNyZW1lbnRWYWx1ZTpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRG93bildLEluY3JlbWVudEJ5MTA6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlBhZ2VVcCksVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuVXAsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQpXSxEZWNyZW1lbnRCeTEwOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5QYWdlRG93biksVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRG93bixVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5TaGlmdCldLEluY3JlbWVudEJ5MTAwOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5QYWdlVXAsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQpXSxEZWNyZW1lbnRCeTEwMDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuUGFnZURvd24sVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQpXSxJbmNyZW1lbnRCeTAxOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5VcCxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5BbHQpXSxEZWNyZW1lbnRCeTAxOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Eb3duLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkFsdCldfTtVSS5TaG9ydGN1dHNTY3JlZW4uU291cmNlc1BhbmVsU2hvcnRjdXRzPXtTZWxlY3ROZXh0T2NjdXJyZW5jZTpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignZCcsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybE9yTWV0YSldLFNvZnRVbmRvOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCd1JyxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsT3JNZXRhKV0sR290b01hdGNoaW5nQnJhY2tldDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignbScsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybCldLFRvZ2dsZUF1dG9jb21wbGV0aW9uOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5TcGFjZSxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsKV0sSW5jcmVhc2VDU1NVbml0QnlPbmU6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlVwLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkFsdCldLERlY3JlYXNlQ1NTVW5pdEJ5T25lOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Eb3duLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkFsdCldLEluY3JlYXNlQ1NTVW5pdEJ5VGVuOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5QYWdlVXAsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQWx0KV0sRGVjcmVhc2VDU1NVbml0QnlUZW46W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlBhZ2VEb3duLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkFsdCldLEV2YWx1YXRlU2VsZWN0aW9uSW5Db25zb2xlOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCdlJyxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5TaGlmdHxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsKV0sQWRkU2VsZWN0aW9uVG9XYXRjaDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignYScsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnR8VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybCldLFRvZ2dsZUNvbW1lbnQ6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlNsYXNoLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkN0cmxPck1ldGEpXSx9O1VJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cz17UmVzZXRWaWV3OltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCcwJyldLFBhbk1vZGU6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ3gnKV0sUm90YXRlTW9kZTpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcigndicpXSxUb2dnbGVQYW5Sb3RhdGU6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlNoaWZ0KV0sWm9vbUluOltVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5QbHVzLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLlNoaWZ0KSxVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5OdW1wYWRQbHVzKV0sWm9vbU91dDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuTWludXMsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQpLFVJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLk51bXBhZE1pbnVzKV0sVXA6W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlVwKSxVSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCd3JyldLERvd246W1VJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkRvd24pLFVJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ3MnKV0sTGVmdDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuTGVmdCksVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignYScpXSxSaWdodDpbVUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuUmlnaHQpLFVJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ2QnKV19OztVSS5HZW9tZXRyeT17fTtVSS5HZW9tZXRyeS5fRXBzPTFlLTU7VUkuR2VvbWV0cnkuVmVjdG9yPWNsYXNze2NvbnN0cnVjdG9yKHgseSx6KXt0aGlzLng9eDt0aGlzLnk9eTt0aGlzLno9ejt9Cmxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopO30Kbm9ybWFsaXplKCl7Y29uc3QgbGVuZ3RoPXRoaXMubGVuZ3RoKCk7aWYobGVuZ3RoPD1VSS5HZW9tZXRyeS5fRXBzKQpyZXR1cm47dGhpcy54Lz1sZW5ndGg7dGhpcy55Lz1sZW5ndGg7dGhpcy56Lz1sZW5ndGg7fX07VUkuR2VvbWV0cnkuUG9pbnQ9Y2xhc3N7Y29uc3RydWN0b3IoeCx5KXt0aGlzLng9eDt0aGlzLnk9eTt9CmRpc3RhbmNlVG8ocCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwLngtdGhpcy54LDIpK01hdGgucG93KHAueS10aGlzLnksMikpO30KcHJvamVjdE9uKGxpbmUpe2lmKGxpbmUueD09PTAmJmxpbmUueT09PTApCnJldHVybiBuZXcgVUkuR2VvbWV0cnkuUG9pbnQoMCwwKTtyZXR1cm4gbGluZS5zY2FsZSgodGhpcy54KmxpbmUueCt0aGlzLnkqbGluZS55KS8oTWF0aC5wb3cobGluZS54LDIpK01hdGgucG93KGxpbmUueSwyKSkpO30Kc2NhbGUoc2NhbGFyKXtyZXR1cm4gbmV3IFVJLkdlb21ldHJ5LlBvaW50KHRoaXMueCpzY2FsYXIsdGhpcy55KnNjYWxhcik7fQp0b1N0cmluZygpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMueCoxMDApLzEwMCsnLCAnK01hdGgucm91bmQodGhpcy55KjEwMCkvMTAwO319O1VJLkdlb21ldHJ5LkN1YmljQmV6aWVyPWNsYXNze2NvbnN0cnVjdG9yKHBvaW50MSxwb2ludDIpe3RoaXMuY29udHJvbFBvaW50cz1bcG9pbnQxLHBvaW50Ml07fQpzdGF0aWMgcGFyc2UodGV4dCl7Y29uc3Qga2V5d29yZFZhbHVlcz1VSS5HZW9tZXRyeS5DdWJpY0Jlemllci5LZXl3b3JkVmFsdWVzO2NvbnN0IHZhbHVlPXRleHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywnJyk7aWYoT2JqZWN0LmtleXMoa2V5d29yZFZhbHVlcykuaW5kZXhPZih2YWx1ZSkhPT0tMSkKcmV0dXJuIFVJLkdlb21ldHJ5LkN1YmljQmV6aWVyLnBhcnNlKGtleXdvcmRWYWx1ZXNbdmFsdWVdKTtjb25zdCBiZXppZXJSZWdleD0vXmN1YmljLWJlemllclwoKFteLF0rKSwoW14sXSspLChbXixdKyksKFteLF0rKVwpJC87Y29uc3QgbWF0Y2g9dmFsdWUubWF0Y2goYmV6aWVyUmVnZXgpO2lmKG1hdGNoKXtjb25zdCBjb250cm9sMT1uZXcgVUkuR2VvbWV0cnkuUG9pbnQocGFyc2VGbG9hdChtYXRjaFsxXSkscGFyc2VGbG9hdChtYXRjaFsyXSkpO2NvbnN0IGNvbnRyb2wyPW5ldyBVSS5HZW9tZXRyeS5Qb2ludChwYXJzZUZsb2F0KG1hdGNoWzNdKSxwYXJzZUZsb2F0KG1hdGNoWzRdKSk7cmV0dXJuIG5ldyBVSS5HZW9tZXRyeS5DdWJpY0Jlemllcihjb250cm9sMSxjb250cm9sMik7fQpyZXR1cm4gbnVsbDt9CmV2YWx1YXRlQXQodCl7ZnVuY3Rpb24gZXZhbHVhdGUodjEsdjIsdCl7cmV0dXJuIDMqKDEtdCkqKDEtdCkqdCp2MSszKigxLXQpKnQqdCp2MitNYXRoLnBvdyh0LDMpO30KY29uc3QgeD1ldmFsdWF0ZSh0aGlzLmNvbnRyb2xQb2ludHNbMF0ueCx0aGlzLmNvbnRyb2xQb2ludHNbMV0ueCx0KTtjb25zdCB5PWV2YWx1YXRlKHRoaXMuY29udHJvbFBvaW50c1swXS55LHRoaXMuY29udHJvbFBvaW50c1sxXS55LHQpO3JldHVybiBuZXcgVUkuR2VvbWV0cnkuUG9pbnQoeCx5KTt9CmFzQ1NTVGV4dCgpe2NvbnN0IHJhdz0nY3ViaWMtYmV6aWVyKCcrdGhpcy5jb250cm9sUG9pbnRzLmpvaW4oJywgJykrJyknO2NvbnN0IGtleXdvcmRWYWx1ZXM9VUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIuS2V5d29yZFZhbHVlcztmb3IoY29uc3Qga2V5d29yZCBpbiBrZXl3b3JkVmFsdWVzKXtpZihyYXc9PT1rZXl3b3JkVmFsdWVzW2tleXdvcmRdKQpyZXR1cm4ga2V5d29yZDt9CnJldHVybiByYXc7fX07VUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIuUmVnZXg9LygoY3ViaWMtYmV6aWVyXChbXildK1wpKXxcYihsaW5lYXJ8ZWFzZS1pbi1vdXR8ZWFzZS1pbnxlYXNlLW91dHxlYXNlKVxiKS9nO1VJLkdlb21ldHJ5LkN1YmljQmV6aWVyLktleXdvcmRWYWx1ZXM9eydsaW5lYXInOidjdWJpYy1iZXppZXIoMCwgMCwgMSwgMSknLCdlYXNlJzonY3ViaWMtYmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSknLCdlYXNlLWluJzonY3ViaWMtYmV6aWVyKDAuNDIsIDAsIDEsIDEpJywnZWFzZS1pbi1vdXQnOidjdWJpYy1iZXppZXIoMC40MiwgMCwgMC41OCwgMSknLCdlYXNlLW91dCc6J2N1YmljLWJlemllcigwLCAwLCAwLjU4LCAxKSd9O1VJLkdlb21ldHJ5LkV1bGVyQW5nbGVzPWNsYXNze2NvbnN0cnVjdG9yKGFscGhhLGJldGEsZ2FtbWEpe3RoaXMuYWxwaGE9YWxwaGE7dGhpcy5iZXRhPWJldGE7dGhpcy5nYW1tYT1nYW1tYTt9CnN0YXRpYyBmcm9tUm90YXRpb25NYXRyaXgocm90YXRpb25NYXRyaXgpe2NvbnN0IGJldGE9TWF0aC5hdGFuMihyb3RhdGlvbk1hdHJpeC5tMjMscm90YXRpb25NYXRyaXgubTMzKTtjb25zdCBnYW1tYT1NYXRoLmF0YW4yKC1yb3RhdGlvbk1hdHJpeC5tMTMsTWF0aC5zcXJ0KHJvdGF0aW9uTWF0cml4Lm0xMSpyb3RhdGlvbk1hdHJpeC5tMTErcm90YXRpb25NYXRyaXgubTEyKnJvdGF0aW9uTWF0cml4Lm0xMikpO2NvbnN0IGFscGhhPU1hdGguYXRhbjIocm90YXRpb25NYXRyaXgubTEyLHJvdGF0aW9uTWF0cml4Lm0xMSk7cmV0dXJuIG5ldyBVSS5HZW9tZXRyeS5FdWxlckFuZ2xlcyhVSS5HZW9tZXRyeS5yYWRpYW5zVG9EZWdyZWVzKGFscGhhKSxVSS5HZW9tZXRyeS5yYWRpYW5zVG9EZWdyZWVzKGJldGEpLFVJLkdlb21ldHJ5LnJhZGlhbnNUb0RlZ3JlZXMoZ2FtbWEpKTt9CnRvUm90YXRlM0RTdHJpbmcoKXtjb25zdCBnYW1tYUF4aXNZPS1NYXRoLnNpbihVSS5HZW9tZXRyeS5kZWdyZWVzVG9SYWRpYW5zKHRoaXMuYmV0YSkpO2NvbnN0IGdhbW1hQXhpc1o9TWF0aC5jb3MoVUkuR2VvbWV0cnkuZGVncmVlc1RvUmFkaWFucyh0aGlzLmJldGEpKTtjb25zdCBheGlzPXthbHBoYTpbMCwxLDBdLGJldGE6Wy0xLDAsMF0sZ2FtbWE6WzAsZ2FtbWFBeGlzWSxnYW1tYUF4aXNaXX07cmV0dXJuJ3JvdGF0ZTNkKCcrYXhpcy5hbHBoYS5qb2luKCcsJykrJywnK3RoaXMuYWxwaGErJ2RlZykgJysncm90YXRlM2QoJytheGlzLmJldGEuam9pbignLCcpKycsJyt0aGlzLmJldGErJ2RlZykgJysncm90YXRlM2QoJytheGlzLmdhbW1hLmpvaW4oJywnKSsnLCcrdGhpcy5nYW1tYSsnZGVnKSc7fX07VUkuR2VvbWV0cnkuc2NhbGFyUHJvZHVjdD1mdW5jdGlvbih1LHYpe3JldHVybiB1Lngqdi54K3UueSp2LnkrdS56KnYuejt9O1VJLkdlb21ldHJ5LmNyb3NzUHJvZHVjdD1mdW5jdGlvbih1LHYpe2NvbnN0IHg9dS55KnYuei11Lnoqdi55O2NvbnN0IHk9dS56KnYueC11Lngqdi56O2NvbnN0IHo9dS54KnYueS11Lnkqdi54O3JldHVybiBuZXcgVUkuR2VvbWV0cnkuVmVjdG9yKHgseSx6KTt9O1VJLkdlb21ldHJ5LnN1YnRyYWN0PWZ1bmN0aW9uKHUsdil7Y29uc3QgeD11Lngtdi54O2NvbnN0IHk9dS55LXYueTtjb25zdCB6PXUuei12Lno7cmV0dXJuIG5ldyBVSS5HZW9tZXRyeS5WZWN0b3IoeCx5LHopO307VUkuR2VvbWV0cnkubXVsdGlwbHlWZWN0b3JCeU1hdHJpeEFuZE5vcm1hbGl6ZT1mdW5jdGlvbih2LG0pe2NvbnN0IHQ9di54Km0ubTE0K3YueSptLm0yNCt2LnoqbS5tMzQrbS5tNDQ7Y29uc3QgeD0odi54Km0ubTExK3YueSptLm0yMSt2LnoqbS5tMzErbS5tNDEpL3Q7Y29uc3QgeT0odi54Km0ubTEyK3YueSptLm0yMit2LnoqbS5tMzIrbS5tNDIpL3Q7Y29uc3Qgej0odi54Km0ubTEzK3YueSptLm0yMyt2LnoqbS5tMzMrbS5tNDMpL3Q7cmV0dXJuIG5ldyBVSS5HZW9tZXRyeS5WZWN0b3IoeCx5LHopO307VUkuR2VvbWV0cnkuY2FsY3VsYXRlQW5nbGU9ZnVuY3Rpb24odSx2KXtjb25zdCB1TGVuZ3RoPXUubGVuZ3RoKCk7Y29uc3Qgdkxlbmd0aD12Lmxlbmd0aCgpO2lmKHVMZW5ndGg8PVVJLkdlb21ldHJ5Ll9FcHN8fHZMZW5ndGg8PVVJLkdlb21ldHJ5Ll9FcHMpCnJldHVybiAwO2NvbnN0IGNvcz1VSS5HZW9tZXRyeS5zY2FsYXJQcm9kdWN0KHUsdikvdUxlbmd0aC92TGVuZ3RoO2lmKE1hdGguYWJzKGNvcyk+MSkKcmV0dXJuIDA7cmV0dXJuIFVJLkdlb21ldHJ5LnJhZGlhbnNUb0RlZ3JlZXMoTWF0aC5hY29zKGNvcykpO307VUkuR2VvbWV0cnkuZGVncmVlc1RvUmFkaWFucz1mdW5jdGlvbihkZWcpe3JldHVybiBkZWcqTWF0aC5QSS8xODA7fTtVSS5HZW9tZXRyeS5yYWRpYW5zVG9EZWdyZWVzPWZ1bmN0aW9uKHJhZCl7cmV0dXJuIHJhZCoxODAvTWF0aC5QSTt9O1VJLkdlb21ldHJ5LmJvdW5kc0ZvclRyYW5zZm9ybWVkUG9pbnRzPWZ1bmN0aW9uKG1hdHJpeCxwb2ludHMsYWdncmVnYXRlQm91bmRzKXtpZighYWdncmVnYXRlQm91bmRzKQphZ2dyZWdhdGVCb3VuZHM9e21pblg6SW5maW5pdHksbWF4WDotSW5maW5pdHksbWluWTpJbmZpbml0eSxtYXhZOi1JbmZpbml0eX07aWYocG9pbnRzLmxlbmd0aCUzKQpjb25zb2xlLmFzc2VydCgnSW52YWxpZCBzaXplIG9mIHBvaW50cyBhcnJheScpO2ZvcihsZXQgcD0wO3A8cG9pbnRzLmxlbmd0aDtwKz0zKXtsZXQgdmVjdG9yPW5ldyBVSS5HZW9tZXRyeS5WZWN0b3IocG9pbnRzW3BdLHBvaW50c1twKzFdLHBvaW50c1twKzJdKTt2ZWN0b3I9VUkuR2VvbWV0cnkubXVsdGlwbHlWZWN0b3JCeU1hdHJpeEFuZE5vcm1hbGl6ZSh2ZWN0b3IsbWF0cml4KTthZ2dyZWdhdGVCb3VuZHMubWluWD1NYXRoLm1pbihhZ2dyZWdhdGVCb3VuZHMubWluWCx2ZWN0b3IueCk7YWdncmVnYXRlQm91bmRzLm1heFg9TWF0aC5tYXgoYWdncmVnYXRlQm91bmRzLm1heFgsdmVjdG9yLngpO2FnZ3JlZ2F0ZUJvdW5kcy5taW5ZPU1hdGgubWluKGFnZ3JlZ2F0ZUJvdW5kcy5taW5ZLHZlY3Rvci55KTthZ2dyZWdhdGVCb3VuZHMubWF4WT1NYXRoLm1heChhZ2dyZWdhdGVCb3VuZHMubWF4WSx2ZWN0b3IueSk7fQpyZXR1cm4gYWdncmVnYXRlQm91bmRzO307VUkuU2l6ZT1jbGFzc3tjb25zdHJ1Y3Rvcih3aWR0aCxoZWlnaHQpe3RoaXMud2lkdGg9d2lkdGg7dGhpcy5oZWlnaHQ9aGVpZ2h0O30KY2xpcFRvKHNpemUpe2lmKCFzaXplKQpyZXR1cm4gdGhpcztyZXR1cm4gbmV3IFVJLlNpemUoTWF0aC5taW4odGhpcy53aWR0aCxzaXplLndpZHRoKSxNYXRoLm1pbih0aGlzLmhlaWdodCxzaXplLmhlaWdodCkpO30Kc2NhbGUoc2NhbGUpe3JldHVybiBuZXcgVUkuU2l6ZSh0aGlzLndpZHRoKnNjYWxlLHRoaXMuaGVpZ2h0KnNjYWxlKTt9fTtVSS5TaXplLnByb3RvdHlwZS5pc0VxdWFsPWZ1bmN0aW9uKHNpemUpe3JldHVybiEhc2l6ZSYmdGhpcy53aWR0aD09PXNpemUud2lkdGgmJnRoaXMuaGVpZ2h0PT09c2l6ZS5oZWlnaHQ7fTtVSS5TaXplLnByb3RvdHlwZS53aWR0aFRvTWF4PWZ1bmN0aW9uKHNpemUpe3JldHVybiBuZXcgVUkuU2l6ZShNYXRoLm1heCh0aGlzLndpZHRoLCh0eXBlb2Ygc2l6ZT09PSdudW1iZXInP3NpemU6c2l6ZS53aWR0aCkpLHRoaXMuaGVpZ2h0KTt9O1VJLlNpemUucHJvdG90eXBlLmFkZFdpZHRoPWZ1bmN0aW9uKHNpemUpe3JldHVybiBuZXcgVUkuU2l6ZSh0aGlzLndpZHRoKyh0eXBlb2Ygc2l6ZT09PSdudW1iZXInP3NpemU6c2l6ZS53aWR0aCksdGhpcy5oZWlnaHQpO307VUkuU2l6ZS5wcm90b3R5cGUuaGVpZ2h0VG9NYXg9ZnVuY3Rpb24oc2l6ZSl7cmV0dXJuIG5ldyBVSS5TaXplKHRoaXMud2lkdGgsTWF0aC5tYXgodGhpcy5oZWlnaHQsKHR5cGVvZiBzaXplPT09J251bWJlcic/c2l6ZTpzaXplLmhlaWdodCkpKTt9O1VJLlNpemUucHJvdG90eXBlLmFkZEhlaWdodD1mdW5jdGlvbihzaXplKXtyZXR1cm4gbmV3IFVJLlNpemUodGhpcy53aWR0aCx0aGlzLmhlaWdodCsodHlwZW9mIHNpemU9PT0nbnVtYmVyJz9zaXplOnNpemUuaGVpZ2h0KSk7fTtVSS5JbnNldHM9Y2xhc3N7Y29uc3RydWN0b3IobGVmdCx0b3AscmlnaHQsYm90dG9tKXt0aGlzLmxlZnQ9bGVmdDt0aGlzLnRvcD10b3A7dGhpcy5yaWdodD1yaWdodDt0aGlzLmJvdHRvbT1ib3R0b207fQppc0VxdWFsKGluc2V0cyl7cmV0dXJuISFpbnNldHMmJnRoaXMubGVmdD09PWluc2V0cy5sZWZ0JiZ0aGlzLnRvcD09PWluc2V0cy50b3AmJnRoaXMucmlnaHQ9PT1pbnNldHMucmlnaHQmJnRoaXMuYm90dG9tPT09aW5zZXRzLmJvdHRvbTt9fTtVSS5SZWN0PWNsYXNze2NvbnN0cnVjdG9yKGxlZnQsdG9wLHdpZHRoLGhlaWdodCl7dGhpcy5sZWZ0PWxlZnQ7dGhpcy50b3A9dG9wO3RoaXMud2lkdGg9d2lkdGg7dGhpcy5oZWlnaHQ9aGVpZ2h0O30KaXNFcXVhbChyZWN0KXtyZXR1cm4hIXJlY3QmJnRoaXMubGVmdD09PXJlY3QubGVmdCYmdGhpcy50b3A9PT1yZWN0LnRvcCYmdGhpcy53aWR0aD09PXJlY3Qud2lkdGgmJnRoaXMuaGVpZ2h0PT09cmVjdC5oZWlnaHQ7fQpzY2FsZShzY2FsZSl7cmV0dXJuIG5ldyBVSS5SZWN0KHRoaXMubGVmdCpzY2FsZSx0aGlzLnRvcCpzY2FsZSx0aGlzLndpZHRoKnNjYWxlLHRoaXMuaGVpZ2h0KnNjYWxlKTt9CnNpemUoKXtyZXR1cm4gbmV3IFVJLlNpemUodGhpcy53aWR0aCx0aGlzLmhlaWdodCk7fQpyZWxhdGl2ZVRvKG9yaWdpbil7cmV0dXJuIG5ldyBVSS5SZWN0KHRoaXMubGVmdC1vcmlnaW4ubGVmdCx0aGlzLnRvcC1vcmlnaW4udG9wLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO30KcmViYXNlVG8ob3JpZ2luKXtyZXR1cm4gbmV3IFVJLlJlY3QodGhpcy5sZWZ0K29yaWdpbi5sZWZ0LHRoaXMudG9wK29yaWdpbi50b3AsdGhpcy53aWR0aCx0aGlzLmhlaWdodCk7fX07VUkuQ29uc3RyYWludHM9Y2xhc3N7Y29uc3RydWN0b3IobWluaW11bSxwcmVmZXJyZWQpe3RoaXMubWluaW11bT1taW5pbXVtfHxuZXcgVUkuU2l6ZSgwLDApO3RoaXMucHJlZmVycmVkPXByZWZlcnJlZHx8dGhpcy5taW5pbXVtO2lmKHRoaXMubWluaW11bS53aWR0aD50aGlzLnByZWZlcnJlZC53aWR0aHx8dGhpcy5taW5pbXVtLmhlaWdodD50aGlzLnByZWZlcnJlZC5oZWlnaHQpCnRocm93IG5ldyBFcnJvcignTWluaW11bSBzaXplIGlzIGdyZWF0ZXIgdGhhbiBwcmVmZXJyZWQuJyk7fX07VUkuQ29uc3RyYWludHMucHJvdG90eXBlLmlzRXF1YWw9ZnVuY3Rpb24oY29uc3RyYWludHMpe3JldHVybiEhY29uc3RyYWludHMmJnRoaXMubWluaW11bS5pc0VxdWFsKGNvbnN0cmFpbnRzLm1pbmltdW0pJiZ0aGlzLnByZWZlcnJlZC5pc0VxdWFsKGNvbnN0cmFpbnRzLnByZWZlcnJlZCk7fTtVSS5Db25zdHJhaW50cy5wcm90b3R5cGUud2lkdGhUb01heD1mdW5jdGlvbih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT09J251bWJlcicpCnJldHVybiBuZXcgVUkuQ29uc3RyYWludHModGhpcy5taW5pbXVtLndpZHRoVG9NYXgodmFsdWUpLHRoaXMucHJlZmVycmVkLndpZHRoVG9NYXgodmFsdWUpKTtyZXR1cm4gbmV3IFVJLkNvbnN0cmFpbnRzKHRoaXMubWluaW11bS53aWR0aFRvTWF4KHZhbHVlLm1pbmltdW0pLHRoaXMucHJlZmVycmVkLndpZHRoVG9NYXgodmFsdWUucHJlZmVycmVkKSk7fTtVSS5Db25zdHJhaW50cy5wcm90b3R5cGUuYWRkV2lkdGg9ZnVuY3Rpb24odmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInKQpyZXR1cm4gbmV3IFVJLkNvbnN0cmFpbnRzKHRoaXMubWluaW11bS5hZGRXaWR0aCh2YWx1ZSksdGhpcy5wcmVmZXJyZWQuYWRkV2lkdGgodmFsdWUpKTtyZXR1cm4gbmV3IFVJLkNvbnN0cmFpbnRzKHRoaXMubWluaW11bS5hZGRXaWR0aCh2YWx1ZS5taW5pbXVtKSx0aGlzLnByZWZlcnJlZC5hZGRXaWR0aCh2YWx1ZS5wcmVmZXJyZWQpKTt9O1VJLkNvbnN0cmFpbnRzLnByb3RvdHlwZS5oZWlnaHRUb01heD1mdW5jdGlvbih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT09J251bWJlcicpCnJldHVybiBuZXcgVUkuQ29uc3RyYWludHModGhpcy5taW5pbXVtLmhlaWdodFRvTWF4KHZhbHVlKSx0aGlzLnByZWZlcnJlZC5oZWlnaHRUb01heCh2YWx1ZSkpO3JldHVybiBuZXcgVUkuQ29uc3RyYWludHModGhpcy5taW5pbXVtLmhlaWdodFRvTWF4KHZhbHVlLm1pbmltdW0pLHRoaXMucHJlZmVycmVkLmhlaWdodFRvTWF4KHZhbHVlLnByZWZlcnJlZCkpO307VUkuQ29uc3RyYWludHMucHJvdG90eXBlLmFkZEhlaWdodD1mdW5jdGlvbih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT09J251bWJlcicpCnJldHVybiBuZXcgVUkuQ29uc3RyYWludHModGhpcy5taW5pbXVtLmFkZEhlaWdodCh2YWx1ZSksdGhpcy5wcmVmZXJyZWQuYWRkSGVpZ2h0KHZhbHVlKSk7cmV0dXJuIG5ldyBVSS5Db25zdHJhaW50cyh0aGlzLm1pbmltdW0uYWRkSGVpZ2h0KHZhbHVlLm1pbmltdW0pLHRoaXMucHJlZmVycmVkLmFkZEhlaWdodCh2YWx1ZS5wcmVmZXJyZWQpKTt9OztVSS5YTGluaz1jbGFzcyBleHRlbmRzIFVJLlhFbGVtZW50e3N0YXRpYyBjcmVhdGUodXJsLGxpbmtUZXh0LGNsYXNzTmFtZSxwcmV2ZW50Q2xpY2spe2lmKCFsaW5rVGV4dCkKbGlua1RleHQ9dXJsO2NsYXNzTmFtZT1jbGFzc05hbWV8fCcnO3JldHVybiBVSS5odG1sYAogICAgICAgIDx4LWxpbmsgaHJlZj0nJHt1cmx9JyBjbGFzcz0nJHtjbGFzc05hbWV9IGRldnRvb2xzLWxpbmsnICR7cHJldmVudENsaWNrID8gJ25vLWNsaWNrJyA6ICcnfQogICAgICAgID4ke2xpbmtUZXh0LnRyaW1NaWRkbGUoVUkuTWF4TGVuZ3RoRm9yRGlzcGxheWVkVVJMcyl9PC94LWxpbms+YDt9CmNvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywnaW5saW5lJyk7VUkuQVJJQVV0aWxzLm1hcmtBc0xpbmsodGhpcyk7dGhpcy50YWJJbmRleD0wO3RoaXMuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCdfYmxhbmsnKTt0aGlzLl9ocmVmPW51bGw7dGhpcy5fY2xpY2thYmxlPXRydWU7dGhpcy5fb25DbGljaz1ldmVudD0+e2V2ZW50LmNvbnN1bWUodHJ1ZSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0Lm9wZW5Jbk5ld1RhYigodGhpcy5faHJlZikpO307dGhpcy5fb25LZXlEb3duPWV2ZW50PT57aWYoZXZlbnQua2V5IT09JyAnJiYhaXNFbnRlcktleShldmVudCkpCnJldHVybjtldmVudC5jb25zdW1lKHRydWUpO0luc3BlY3RvckZyb250ZW5kSG9zdC5vcGVuSW5OZXdUYWIoKHRoaXMuX2hyZWYpKTt9O30Kc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gVUkuWEVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzLmNvbmNhdChbJ2hyZWYnLCduby1jbGljayddKTt9CmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyLG9sZFZhbHVlLG5ld1ZhbHVlKXtpZihhdHRyPT09J25vLWNsaWNrJyl7dGhpcy5fY2xpY2thYmxlPSFuZXdWYWx1ZTt0aGlzLl91cGRhdGVDbGljaygpO3JldHVybjt9CmlmKGF0dHI9PT0naHJlZicpe2xldCBocmVmPW5ld1ZhbHVlO2lmKG5ld1ZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykpCmhyZWY9bnVsbDtpZihDb21tb24uUGFyc2VkVVJMLmlzUmVsYXRpdmVVUkwobmV3VmFsdWUpKQpocmVmPW51bGw7dGhpcy5faHJlZj1ocmVmO3RoaXMudGl0bGU9bmV3VmFsdWU7dGhpcy5fdXBkYXRlQ2xpY2soKTtyZXR1cm47fQpzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0cixvbGRWYWx1ZSxuZXdWYWx1ZSk7fQpfdXBkYXRlQ2xpY2soKXtpZih0aGlzLl9ocmVmIT09bnVsbCYmdGhpcy5fY2xpY2thYmxlKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLGZhbHNlKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bixmYWxzZSk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnY3Vyc29yJywncG9pbnRlcicpO31lbHNle3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uQ2xpY2ssZmFsc2UpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLGZhbHNlKTt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdjdXJzb3InKTt9fX07VUkuWExpbmsuQ29udGV4dE1lbnVQcm92aWRlcj1jbGFzc3thcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsdGFyZ2V0KXtsZXQgdGFyZ2V0Tm9kZT0odGFyZ2V0KTt3aGlsZSh0YXJnZXROb2RlJiYhKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBVSS5YTGluaykpCnRhcmdldE5vZGU9dGFyZ2V0Tm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7aWYoIXRhcmdldE5vZGV8fCF0YXJnZXROb2RlLl9ocmVmKQpyZXR1cm47Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oVUkub3BlbkxpbmtFeHRlcm5hbGx5TGFiZWwoKSwoKT0+SW5zcGVjdG9yRnJvbnRlbmRIb3N0Lm9wZW5Jbk5ld1RhYih0YXJnZXROb2RlLl9ocmVmKSk7Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oVUkuY29weUxpbmtBZGRyZXNzTGFiZWwoKSwoKT0+SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KHRhcmdldE5vZGUuX2hyZWYpKTt9fTtzZWxmLmN1c3RvbUVsZW1lbnRzLmRlZmluZSgneC1saW5rJyxVSS5YTGluayk7O1VJLlhXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5YRWxlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsJ2ZsZXgnKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdmbGV4LWRpcmVjdGlvbicsJ2NvbHVtbicpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2FsaWduLWl0ZW1zJywnc3RyZXRjaCcpO3RoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ2p1c3RpZnktY29udGVudCcsJ2ZsZXgtc3RhcnQnKTt0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdjb250YWluJywnbGF5b3V0IHN0eWxlJyk7dGhpcy5fdmlzaWJsZT1mYWxzZTt0aGlzLl9zaGFkb3dSb290O3RoaXMuX2RlZmF1bHRGb2N1c2VkRWxlbWVudD1udWxsO3RoaXMuX2VsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yPVtdO3RoaXMuX29uU2hvd25DYWxsYmFjazt0aGlzLl9vbkhpZGRlbkNhbGxiYWNrO3RoaXMuX29uUmVzaXplZENhbGxiYWNrO2lmKCFVSS5YV2lkZ2V0Ll9vYnNlcnZlcil7VUkuWFdpZGdldC5fb2JzZXJ2ZXI9bmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXM9Pntmb3IoY29uc3QgZW50cnkgb2YgZW50cmllcyl7aWYoZW50cnkudGFyZ2V0Ll92aXNpYmxlJiZlbnRyeS50YXJnZXQuX29uUmVzaXplZENhbGxiYWNrKQplbnRyeS50YXJnZXQuX29uUmVzaXplZENhbGxiYWNrLmNhbGwobnVsbCk7fX0pO30KVUkuWFdpZGdldC5fb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzKTt0aGlzLnNldEVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKFt0aGlzXSk7fQpzdGF0aWMgZm9jdXNXaWRnZXRGb3JOb2RlKG5vZGUpe25vZGU9bm9kZSYmbm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7bGV0IHdpZGdldD1udWxsO3doaWxlKG5vZGUpe2lmKG5vZGUgaW5zdGFuY2VvZiBVSS5YV2lkZ2V0KXtpZih3aWRnZXQpCm5vZGUuX2RlZmF1bHRGb2N1c2VkRWxlbWVudD13aWRnZXQ7d2lkZ2V0PW5vZGU7fQpub2RlPW5vZGUucGFyZW50Tm9kZU9yU2hhZG93SG9zdCgpO319CmlzU2hvd2luZygpe3JldHVybiB0aGlzLl92aXNpYmxlO30KcmVnaXN0ZXJSZXF1aXJlZENTUyhjc3NGaWxlKXtVSS5hcHBlbmRTdHlsZSh0aGlzLl9zaGFkb3dSb290fHx0aGlzLGNzc0ZpbGUpO30Kc2V0T25TaG93bihjYWxsYmFjayl7dGhpcy5fb25TaG93bkNhbGxiYWNrPWNhbGxiYWNrO30Kc2V0T25IaWRkZW4oY2FsbGJhY2spe3RoaXMuX29uSGlkZGVuQ2FsbGJhY2s9Y2FsbGJhY2s7fQpzZXRPblJlc2l6ZWQoY2FsbGJhY2spe3RoaXMuX29uUmVzaXplZENhbGxiYWNrPWNhbGxiYWNrO30Kc2V0RWxlbWVudHNUb1Jlc3RvcmVTY3JvbGxQb3NpdGlvbnNGb3IoZWxlbWVudHMpe2Zvcihjb25zdCBlbGVtZW50IG9mIHRoaXMuX2VsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKQplbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsVUkuWFdpZGdldC5fc3RvcmVTY3JvbGxQb3NpdGlvbix7cGFzc2l2ZTp0cnVlLGNhcHR1cmU6ZmFsc2V9KTt0aGlzLl9lbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0Zvcj1lbGVtZW50cztmb3IoY29uc3QgZWxlbWVudCBvZiB0aGlzLl9lbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0ZvcikKZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLFVJLlhXaWRnZXQuX3N0b3JlU2Nyb2xsUG9zaXRpb24se3Bhc3NpdmU6dHJ1ZSxjYXB0dXJlOmZhbHNlfSk7fQpyZXN0b3JlU2Nyb2xsUG9zaXRpb25zKCl7Zm9yKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fZWxlbWVudHNUb1Jlc3RvcmVTY3JvbGxQb3NpdGlvbnNGb3Ipe2lmKGVsZW1lbnQuX3Njcm9sbFRvcCkKZWxlbWVudC5zY3JvbGxUb3A9ZWxlbWVudC5fc2Nyb2xsVG9wO2lmKGVsZW1lbnQuX3Njcm9sbExlZnQpCmVsZW1lbnQuc2Nyb2xsTGVmdD1lbGVtZW50Ll9zY3JvbGxMZWZ0O319CnN0YXRpYyBfc3RvcmVTY3JvbGxQb3NpdGlvbihldmVudCl7Y29uc3QgZWxlbWVudD1ldmVudC5jdXJyZW50VGFyZ2V0O2VsZW1lbnQuX3Njcm9sbFRvcD1lbGVtZW50LnNjcm9sbFRvcDtlbGVtZW50Ll9zY3JvbGxMZWZ0PWVsZW1lbnQuc2Nyb2xsTGVmdDt9CnNldERlZmF1bHRGb2N1c2VkRWxlbWVudChlbGVtZW50KXtpZihlbGVtZW50JiYhdGhpcy5pc1NlbGZPckFuY2VzdG9yKGVsZW1lbnQpKQp0aHJvdyBuZXcgRXJyb3IoJ0RlZmF1bHQgZm9jdXMgbXVzdCBiZSBkZXNjZW5kYW50Jyk7dGhpcy5fZGVmYXVsdEZvY3VzZWRFbGVtZW50PWVsZW1lbnQ7fQpmb2N1cygpe2lmKCF0aGlzLl92aXNpYmxlKQpyZXR1cm47bGV0IGVsZW1lbnQ7aWYodGhpcy5fZGVmYXVsdEZvY3VzZWRFbGVtZW50JiZ0aGlzLmlzU2VsZk9yQW5jZXN0b3IodGhpcy5fZGVmYXVsdEZvY3VzZWRFbGVtZW50KSl7ZWxlbWVudD10aGlzLl9kZWZhdWx0Rm9jdXNlZEVsZW1lbnQ7fWVsc2UgaWYodGhpcy50YWJJbmRleCE9PS0xKXtlbGVtZW50PXRoaXM7fWVsc2V7bGV0IGNoaWxkPXRoaXMudHJhdmVyc2VOZXh0Tm9kZSh0aGlzKTt3aGlsZShjaGlsZCl7aWYoKGNoaWxkIGluc3RhbmNlb2YgVUkuWFdpZGdldCkmJmNoaWxkLl92aXNpYmxlKXtlbGVtZW50PWNoaWxkO2JyZWFrO30KY2hpbGQ9Y2hpbGQudHJhdmVyc2VOZXh0Tm9kZSh0aGlzKTt9fQppZighZWxlbWVudHx8ZWxlbWVudC5oYXNGb2N1cygpKQpyZXR1cm47aWYoZWxlbWVudD09PXRoaXMpCkhUTUxFbGVtZW50LnByb3RvdHlwZS5mb2N1cy5jYWxsKHRoaXMpO2Vsc2UKZWxlbWVudC5mb2N1cygpO30KY29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLl92aXNpYmxlPXRydWU7dGhpcy5yZXN0b3JlU2Nyb2xsUG9zaXRpb25zKCk7aWYodGhpcy5fb25TaG93bkNhbGxiYWNrKQp0aGlzLl9vblNob3duQ2FsbGJhY2suY2FsbChudWxsKTt9CmRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fdmlzaWJsZT1mYWxzZTtpZih0aGlzLl9vbkhpZGRlbkNhbGxiYWNrKQp0aGlzLl9vbkhpZGRlbkNhbGxiYWNrLmNhbGwobnVsbCk7fX07c2VsZi5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3gtd2lkZ2V0JyxVSS5YV2lkZ2V0KTs7c2VsZlsnUHJvdG9jb2wnXT1zZWxmWydQcm90b2NvbCddfHx7fTtQcm90b2NvbC5FcnJvcj1TeW1ib2woJ1Byb3RvY29sLkVycm9yJyk7UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2FnZW50UHJvdG90eXBlcz17fTt0aGlzLl9kaXNwYXRjaGVyUHJvdG90eXBlcz17fTt0aGlzLl9pbml0aWFsaXplZD1mYWxzZTt9CnN0YXRpYyByZXBvcnRQcm90b2NvbEVycm9yKGVycm9yLG1lc3NhZ2VPYmplY3Qpe2NvbnNvbGUuZXJyb3IoZXJyb3IrJzogJytKU09OLnN0cmluZ2lmeShtZXNzYWdlT2JqZWN0KSk7fQppc0luaXRpYWxpemVkKCl7cmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO30KX2FkZEFnZW50R2V0dGVyTWV0aG9kVG9Qcm90b2NvbFRhcmdldFByb3RvdHlwZShkb21haW4pe2xldCB1cHBlckNhc2VMZW5ndGg9MDt3aGlsZSh1cHBlckNhc2VMZW5ndGg8ZG9tYWluLmxlbmd0aCYmZG9tYWluW3VwcGVyQ2FzZUxlbmd0aF0udG9Mb3dlckNhc2UoKSE9PWRvbWFpblt1cHBlckNhc2VMZW5ndGhdKQorK3VwcGVyQ2FzZUxlbmd0aDtjb25zdCBtZXRob2ROYW1lPWRvbWFpbi5zdWJzdHIoMCx1cHBlckNhc2VMZW5ndGgpLnRvTG93ZXJDYXNlKCkrZG9tYWluLnNsaWNlKHVwcGVyQ2FzZUxlbmd0aCkrJ0FnZW50JztmdW5jdGlvbiBhZ2VudEdldHRlcigpe3JldHVybiB0aGlzLl9hZ2VudHNbZG9tYWluXTt9ClByb3RvY29sLlRhcmdldEJhc2UucHJvdG90eXBlW21ldGhvZE5hbWVdPWFnZW50R2V0dGVyO2Z1bmN0aW9uIHJlZ2lzdGVyRGlzcGF0Y2hlcihkaXNwYXRjaGVyKXt0aGlzLnJlZ2lzdGVyRGlzcGF0Y2hlcihkb21haW4sZGlzcGF0Y2hlcik7fQpQcm90b2NvbC5UYXJnZXRCYXNlLnByb3RvdHlwZVsncmVnaXN0ZXInK2RvbWFpbisnRGlzcGF0Y2hlciddPXJlZ2lzdGVyRGlzcGF0Y2hlcjt9Cl9hZ2VudFByb3RvdHlwZShkb21haW4pe2lmKCF0aGlzLl9hZ2VudFByb3RvdHlwZXNbZG9tYWluXSl7dGhpcy5fYWdlbnRQcm90b3R5cGVzW2RvbWFpbl09bmV3IFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuX0FnZW50UHJvdG90eXBlKGRvbWFpbik7dGhpcy5fYWRkQWdlbnRHZXR0ZXJNZXRob2RUb1Byb3RvY29sVGFyZ2V0UHJvdG90eXBlKGRvbWFpbik7fQpyZXR1cm4gdGhpcy5fYWdlbnRQcm90b3R5cGVzW2RvbWFpbl07fQpfZGlzcGF0Y2hlclByb3RvdHlwZShkb21haW4pe2lmKCF0aGlzLl9kaXNwYXRjaGVyUHJvdG90eXBlc1tkb21haW5dKQp0aGlzLl9kaXNwYXRjaGVyUHJvdG90eXBlc1tkb21haW5dPW5ldyBQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl9EaXNwYXRjaGVyUHJvdG90eXBlKCk7cmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXJQcm90b3R5cGVzW2RvbWFpbl07fQpyZWdpc3RlckNvbW1hbmQobWV0aG9kLHNpZ25hdHVyZSxyZXBseUFyZ3MsaGFzRXJyb3JEYXRhKXtjb25zdCBkb21haW5BbmRNZXRob2Q9bWV0aG9kLnNwbGl0KCcuJyk7dGhpcy5fYWdlbnRQcm90b3R5cGUoZG9tYWluQW5kTWV0aG9kWzBdKS5yZWdpc3RlckNvbW1hbmQoZG9tYWluQW5kTWV0aG9kWzFdLHNpZ25hdHVyZSxyZXBseUFyZ3MsaGFzRXJyb3JEYXRhKTt0aGlzLl9pbml0aWFsaXplZD10cnVlO30KcmVnaXN0ZXJFbnVtKHR5cGUsdmFsdWVzKXtjb25zdCBkb21haW5BbmROYW1lPXR5cGUuc3BsaXQoJy4nKTtjb25zdCBkb21haW49ZG9tYWluQW5kTmFtZVswXTtpZighUHJvdG9jb2xbZG9tYWluXSkKUHJvdG9jb2xbZG9tYWluXT17fTtQcm90b2NvbFtkb21haW5dW2RvbWFpbkFuZE5hbWVbMV1dPXZhbHVlczt0aGlzLl9pbml0aWFsaXplZD10cnVlO30KcmVnaXN0ZXJFdmVudChldmVudE5hbWUscGFyYW1zKXtjb25zdCBkb21haW49ZXZlbnROYW1lLnNwbGl0KCcuJylbMF07dGhpcy5fZGlzcGF0Y2hlclByb3RvdHlwZShkb21haW4pLnJlZ2lzdGVyRXZlbnQoZXZlbnROYW1lLHBhcmFtcyk7dGhpcy5faW5pdGlhbGl6ZWQ9dHJ1ZTt9CndyYXBDbGllbnRDYWxsYmFjayhjbGllbnRDYWxsYmFjayxlcnJvclByZWZpeCxjb25zdHJ1Y3RvcixkZWZhdWx0VmFsdWUpe2Z1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihlcnJvcix2YWx1ZSl7aWYoZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3JQcmVmaXgrZXJyb3IpO2NsaWVudENhbGxiYWNrKGRlZmF1bHRWYWx1ZSk7cmV0dXJuO30KaWYoY29uc3RydWN0b3IpCmNsaWVudENhbGxiYWNrKG5ldyBjb25zdHJ1Y3Rvcih2YWx1ZSkpO2Vsc2UKY2xpZW50Q2FsbGJhY2sodmFsdWUpO30KcmV0dXJuIGNhbGxiYWNrV3JhcHBlcjt9fTtQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl9Db25uZWN0aW9uQ2xvc2VkRXJyb3JDb2RlPS0zMjAwMDtQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLkRldlRvb2xzU3R1YkVycm9yQ29kZT0tMzIwMTU7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZD1uZXcgUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZCgpO1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQuQ29ubmVjdGlvbj1mdW5jdGlvbigpe307UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5Db25uZWN0aW9uLnByb3RvdHlwZT17c2VuZE1lc3NhZ2UobWVzc2FnZSl7fSxkaXNjb25uZWN0KCl7fSx9O1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQuQ29ubmVjdGlvbi5QYXJhbXM7UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5Db25uZWN0aW9uLkZhY3Rvcnk7UHJvdG9jb2wuVGFyZ2V0QmFzZT1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoY29ubmVjdGlvbkZhY3Rvcnkpe3N1cGVyKCk7dGhpcy5fY29ubmVjdGlvbj1jb25uZWN0aW9uRmFjdG9yeSh7b25NZXNzYWdlOnRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpLG9uRGlzY29ubmVjdDp0aGlzLl9vbkRpc2Nvbm5lY3QuYmluZCh0aGlzKX0pO3RoaXMuX2xhc3RNZXNzYWdlSWQ9MTt0aGlzLl9wZW5kaW5nUmVzcG9uc2VzQ291bnQ9MDt0aGlzLl9hZ2VudHM9e307dGhpcy5fZGlzcGF0Y2hlcnM9e307dGhpcy5fY2FsbGJhY2tzPXt9O3RoaXMuX2luaXRpYWxpemUoUHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5fYWdlbnRQcm90b3R5cGVzLFByb3RvY29sLmluc3BlY3RvckJhY2tlbmQuX2Rpc3BhdGNoZXJQcm90b3R5cGVzKTt0aGlzLl9kb21haW5Ub0xvZ2dlcj1uZXcgTWFwKCk7aWYoIVByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuZGVwcmVjYXRlZFJ1bkFmdGVyUGVuZGluZ0Rpc3BhdGNoZXMpe1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQuZGVwcmVjYXRlZFJ1bkFmdGVyUGVuZGluZ0Rpc3BhdGNoZXM9dGhpcy5fZGVwcmVjYXRlZFJ1bkFmdGVyUGVuZGluZ0Rpc3BhdGNoZXMuYmluZCh0aGlzKTt9CmlmKCFQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLnNlbmRSYXdNZXNzYWdlRm9yVGVzdGluZykKUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5zZW5kUmF3TWVzc2FnZUZvclRlc3Rpbmc9dGhpcy5fc2VuZFJhd01lc3NhZ2VGb3JUZXN0aW5nLmJpbmQodGhpcyk7fQpfaW5pdGlhbGl6ZShhZ2VudFByb3RvdHlwZXMsZGlzcGF0Y2hlclByb3RvdHlwZXMpe2Zvcihjb25zdCBkb21haW4gaW4gYWdlbnRQcm90b3R5cGVzKXt0aGlzLl9hZ2VudHNbZG9tYWluXT1PYmplY3QuY3JlYXRlKGFnZW50UHJvdG90eXBlc1tkb21haW5dKTt0aGlzLl9hZ2VudHNbZG9tYWluXS5zZXRUYXJnZXQodGhpcyk7fQpmb3IoY29uc3QgZG9tYWluIGluIGRpc3BhdGNoZXJQcm90b3R5cGVzKXt0aGlzLl9kaXNwYXRjaGVyc1tkb21haW5dPU9iamVjdC5jcmVhdGUoZGlzcGF0Y2hlclByb3RvdHlwZXNbZG9tYWluXSk7dGhpcy5fZGlzcGF0Y2hlcnNbZG9tYWluXS5pbml0aWFsaXplKCk7fX0KX25leHRNZXNzYWdlSWQoKXtyZXR1cm4gdGhpcy5fbGFzdE1lc3NhZ2VJZCsrO30KX2FnZW50KGRvbWFpbil7cmV0dXJuIHRoaXMuX2FnZW50c1tkb21haW5dO30KX3dyYXBDYWxsYmFja0FuZFNlbmRNZXNzYWdlT2JqZWN0KGRvbWFpbixtZXRob2QscGFyYW1zLGNhbGxiYWNrKXtpZighdGhpcy5fY29ubmVjdGlvbil7aWYoY2FsbGJhY2spCnRoaXMuX2Rpc3BhdGNoQ29ubmVjdGlvbkVycm9yUmVzcG9uc2UoZG9tYWluLG1ldGhvZCxjYWxsYmFjayk7cmV0dXJuO30KY29uc3QgbWVzc2FnZU9iamVjdD17fTtjb25zdCBtZXNzYWdlSWQ9dGhpcy5fbmV4dE1lc3NhZ2VJZCgpO21lc3NhZ2VPYmplY3QuaWQ9bWVzc2FnZUlkO21lc3NhZ2VPYmplY3QubWV0aG9kPW1ldGhvZDtpZihwYXJhbXMpCm1lc3NhZ2VPYmplY3QucGFyYW1zPXBhcmFtcztjb25zdCB3cmFwcGVkQ2FsbGJhY2s9dGhpcy5fd3JhcChjYWxsYmFjayxkb21haW4sbWV0aG9kKTtjb25zdCBtZXNzYWdlPUpTT04uc3RyaW5naWZ5KG1lc3NhZ2VPYmplY3QpO2lmKFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yUHJvdG9jb2xNZXNzYWdlcykKdGhpcy5fZHVtcFByb3RvY29sTWVzc2FnZSgnZnJvbnRlbmQ6ICcrbWVzc2FnZSwnW0ZFXSAnK2RvbWFpbik7aWYodGhpcy5oYXNFdmVudExpc3RlbmVycyhQcm90b2NvbC5UYXJnZXRCYXNlLkV2ZW50cy5NZXNzYWdlU2VudCkpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb3RvY29sLlRhcmdldEJhc2UuRXZlbnRzLk1lc3NhZ2VTZW50LHtkb21haW4sbWV0aG9kLHBhcmFtczpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpLGlkOm1lc3NhZ2VJZH0pO30KdGhpcy5fY29ubmVjdGlvbi5zZW5kTWVzc2FnZShtZXNzYWdlKTsrK3RoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudDt0aGlzLl9jYWxsYmFja3NbbWVzc2FnZUlkXT13cmFwcGVkQ2FsbGJhY2s7fQpfd3JhcChjYWxsYmFjayxkb21haW4sbWV0aG9kKXtpZighY2FsbGJhY2spCmNhbGxiYWNrPWZ1bmN0aW9uKCl7fTtjYWxsYmFjay5tZXRob2ROYW1lPW1ldGhvZDtjYWxsYmFjay5kb21haW49ZG9tYWluO2lmKFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzKQpjYWxsYmFjay5zZW5kUmVxdWVzdFRpbWU9RGF0ZS5ub3coKTtyZXR1cm4gY2FsbGJhY2s7fQpfc2VuZFJhd01lc3NhZ2VGb3JUZXN0aW5nKG1ldGhvZCxwYXJhbXMsY2FsbGJhY2spe2NvbnN0IGRvbWFpbj1tZXRob2Quc3BsaXQoJy4nKVswXTt0aGlzLl93cmFwQ2FsbGJhY2tBbmRTZW5kTWVzc2FnZU9iamVjdChkb21haW4sbWV0aG9kLHBhcmFtcyxjYWxsYmFjayk7fQpfb25NZXNzYWdlKG1lc3NhZ2Upe2lmKFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yUHJvdG9jb2xNZXNzYWdlcyl7dGhpcy5fZHVtcFByb3RvY29sTWVzc2FnZSgnYmFja2VuZDogJysoKHR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycpP21lc3NhZ2U6SlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpLCdCYWNrZW5kJyk7fQppZih0aGlzLmhhc0V2ZW50TGlzdGVuZXJzKFByb3RvY29sLlRhcmdldEJhc2UuRXZlbnRzLk1lc3NhZ2VSZWNlaXZlZCkpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb3RvY29sLlRhcmdldEJhc2UuRXZlbnRzLk1lc3NhZ2VSZWNlaXZlZCx7bWVzc2FnZTpKU09OLnBhcnNlKCh0eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnKT9tZXNzYWdlOkpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKSx9KTt9CmNvbnN0IG1lc3NhZ2VPYmplY3Q9KCh0eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnKT9KU09OLnBhcnNlKG1lc3NhZ2UpOm1lc3NhZ2UpO2lmKCdpZCdpbiBtZXNzYWdlT2JqZWN0KXtjb25zdCBjYWxsYmFjaz10aGlzLl9jYWxsYmFja3NbbWVzc2FnZU9iamVjdC5pZF07aWYoIWNhbGxiYWNrKXtQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLnJlcG9ydFByb3RvY29sRXJyb3IoJ1Byb3RvY29sIEVycm9yOiB0aGUgbWVzc2FnZSB3aXRoIHdyb25nIGlkJyxtZXNzYWdlT2JqZWN0KTtyZXR1cm47fQpjb25zdCB0aW1pbmdMYWJlbD0ndGltZS1zdGF0czogJytjYWxsYmFjay5tZXRob2ROYW1lO2lmKFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzKQpQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl90aW1lTG9nZ2VyLnRpbWUodGltaW5nTGFiZWwpO3RoaXMuX2FnZW50KGNhbGxiYWNrLmRvbWFpbikuZGlzcGF0Y2hSZXNwb25zZShtZXNzYWdlT2JqZWN0LGNhbGxiYWNrLm1ldGhvZE5hbWUsY2FsbGJhY2spOy0tdGhpcy5fcGVuZGluZ1Jlc3BvbnNlc0NvdW50O2RlbGV0ZSB0aGlzLl9jYWxsYmFja3NbbWVzc2FnZU9iamVjdC5pZF07aWYoUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5PcHRpb25zLmR1bXBJbnNwZWN0b3JUaW1lU3RhdHMpClByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuX3RpbWVMb2dnZXIudGltZUVuZCh0aW1pbmdMYWJlbCk7aWYodGhpcy5fc2NyaXB0cyYmIXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudCkKdGhpcy5fZGVwcmVjYXRlZFJ1bkFmdGVyUGVuZGluZ0Rpc3BhdGNoZXMoKTt9ZWxzZXtpZighKCdtZXRob2QnaW4gbWVzc2FnZU9iamVjdCkpe1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQucmVwb3J0UHJvdG9jb2xFcnJvcignUHJvdG9jb2wgRXJyb3I6IHRoZSBtZXNzYWdlIHdpdGhvdXQgbWV0aG9kJyxtZXNzYWdlT2JqZWN0KTtyZXR1cm47fQpjb25zdCBtZXRob2Q9bWVzc2FnZU9iamVjdC5tZXRob2Quc3BsaXQoJy4nKTtjb25zdCBkb21haW5OYW1lPW1ldGhvZFswXTtpZighKGRvbWFpbk5hbWUgaW4gdGhpcy5fZGlzcGF0Y2hlcnMpKXtQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLnJlcG9ydFByb3RvY29sRXJyb3IoYFByb3RvY29sIEVycm9yOiB0aGUgbWVzc2FnZSAke21lc3NhZ2VPYmplY3QubWV0aG9kfSBpcyBmb3Igbm9uLWV4aXN0aW5nIGRvbWFpbiAnJHtkb21haW5OYW1lfSdgLG1lc3NhZ2VPYmplY3QpO3JldHVybjt9CnRoaXMuX2Rpc3BhdGNoZXJzW2RvbWFpbk5hbWVdLmRpc3BhdGNoKG1ldGhvZFsxXSxtZXNzYWdlT2JqZWN0KTt9fQpyZWdpc3RlckRpc3BhdGNoZXIoZG9tYWluLGRpc3BhdGNoZXIpe2lmKCF0aGlzLl9kaXNwYXRjaGVyc1tkb21haW5dKQpyZXR1cm47dGhpcy5fZGlzcGF0Y2hlcnNbZG9tYWluXS5hZGREb21haW5EaXNwYXRjaGVyKGRpc3BhdGNoZXIpO30KX2RlcHJlY2F0ZWRSdW5BZnRlclBlbmRpbmdEaXNwYXRjaGVzKHNjcmlwdCl7aWYoIXRoaXMuX3NjcmlwdHMpCnRoaXMuX3NjcmlwdHM9W107aWYoc2NyaXB0KQp0aGlzLl9zY3JpcHRzLnB1c2goc2NyaXB0KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudCkKdGhpcy5fZXhlY3V0ZUFmdGVyUGVuZGluZ0Rpc3BhdGNoZXMoKTtlbHNlCnRoaXMuX2RlcHJlY2F0ZWRSdW5BZnRlclBlbmRpbmdEaXNwYXRjaGVzKCk7fS5iaW5kKHRoaXMpLDApO30KX2V4ZWN1dGVBZnRlclBlbmRpbmdEaXNwYXRjaGVzKCl7aWYoIXRoaXMuX3BlbmRpbmdSZXNwb25zZXNDb3VudCl7Y29uc3Qgc2NyaXB0cz10aGlzLl9zY3JpcHRzO3RoaXMuX3NjcmlwdHM9W107Zm9yKGxldCBpZD0wO2lkPHNjcmlwdHMubGVuZ3RoOysraWQpCnNjcmlwdHNbaWRdLmNhbGwodGhpcyk7fX0KX2R1bXBQcm90b2NvbE1lc3NhZ2UobWVzc2FnZSxjb250ZXh0KXtpZighdGhpcy5fZG9tYWluVG9Mb2dnZXIuZ2V0KGNvbnRleHQpKQp0aGlzLl9kb21haW5Ub0xvZ2dlci5zZXQoY29udGV4dCxjb25zb2xlLmNvbnRleHQ/Y29uc29sZS5jb250ZXh0KGNvbnRleHQpOmNvbnNvbGUpO2NvbnN0IGxvZ2dlcj10aGlzLl9kb21haW5Ub0xvZ2dlci5nZXQoY29udGV4dCk7bG9nZ2VyLmxvZyhtZXNzYWdlKTt9Cl9vbkRpc2Nvbm5lY3QocmVhc29uKXt0aGlzLl9jb25uZWN0aW9uPW51bGw7dGhpcy5fcnVuUGVuZGluZ0NhbGxiYWNrcygpO3RoaXMuZGlzcG9zZSgpO30KZGlzcG9zZSgpe30KaXNEaXNwb3NlZCgpe3JldHVybiF0aGlzLl9jb25uZWN0aW9uO30KX3J1blBlbmRpbmdDYWxsYmFja3MoKXtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRoaXMuX2NhbGxiYWNrcykubWFwKGZ1bmN0aW9uKG51bSl7cmV0dXJuIHBhcnNlSW50KG51bSwxMCk7fSk7Zm9yKGxldCBpPTA7aTxrZXlzLmxlbmd0aDsrK2kpe2NvbnN0IGNhbGxiYWNrPXRoaXMuX2NhbGxiYWNrc1trZXlzW2ldXTt0aGlzLl9kaXNwYXRjaENvbm5lY3Rpb25FcnJvclJlc3BvbnNlKGNhbGxiYWNrLmRvbWFpbixjYWxsYmFjay5tZXRob2ROYW1lLGNhbGxiYWNrKTt9CnRoaXMuX2NhbGxiYWNrcz17fTt9Cl9kaXNwYXRjaENvbm5lY3Rpb25FcnJvclJlc3BvbnNlKGRvbWFpbixtZXRob2ROYW1lLGNhbGxiYWNrKXtjb25zdCBlcnJvcj17bWVzc2FnZTonQ29ubmVjdGlvbiBpcyBjbG9zZWQsIGNhblwndCBkaXNwYXRjaCBwZW5kaW5nICcrbWV0aG9kTmFtZSxjb2RlOlByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuX0Nvbm5lY3Rpb25DbG9zZWRFcnJvckNvZGUsZGF0YTpudWxsfTtjb25zdCBtZXNzYWdlT2JqZWN0PXtlcnJvcjplcnJvcn07c2V0VGltZW91dChQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl9BZ2VudFByb3RvdHlwZS5wcm90b3R5cGUuZGlzcGF0Y2hSZXNwb25zZS5iaW5kKHRoaXMuX2FnZW50KGRvbWFpbiksbWVzc2FnZU9iamVjdCxtZXRob2ROYW1lLGNhbGxiYWNrKSwwKTt9fTtQcm90b2NvbC5UYXJnZXRCYXNlLkV2ZW50cz17TWVzc2FnZVNlbnQ6U3ltYm9sKCdNZXNzYWdlU2VudCcpLE1lc3NhZ2VSZWNlaXZlZDpTeW1ib2woJ01lc3NhZ2VSZWNlaXZlZCcpfTtQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl9BZ2VudFByb3RvdHlwZT1jbGFzc3tjb25zdHJ1Y3Rvcihkb21haW4pe3RoaXMuX3JlcGx5QXJncz17fTt0aGlzLl9oYXNFcnJvckRhdGE9e307dGhpcy5fZG9tYWluPWRvbWFpbjt9CnNldFRhcmdldCh0YXJnZXQpe3RoaXMuX3RhcmdldD10YXJnZXQ7fQpyZWdpc3RlckNvbW1hbmQobWV0aG9kTmFtZSxzaWduYXR1cmUscmVwbHlBcmdzLGhhc0Vycm9yRGF0YSl7Y29uc3QgZG9tYWluQW5kTWV0aG9kPXRoaXMuX2RvbWFpbisnLicrbWV0aG9kTmFtZTtmdW5jdGlvbiBzZW5kTWVzc2FnZVByb21pc2UodmFyYXJnKXtjb25zdCBwYXJhbXM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5fQWdlbnRQcm90b3R5cGUucHJvdG90eXBlLl9zZW5kTWVzc2FnZVRvQmFja2VuZFByb21pc2UuY2FsbCh0aGlzLGRvbWFpbkFuZE1ldGhvZCxzaWduYXR1cmUscGFyYW1zKTt9CnRoaXNbbWV0aG9kTmFtZV09c2VuZE1lc3NhZ2VQcm9taXNlO2Z1bmN0aW9uIGludm9rZShyZXF1ZXN0KXtyZXR1cm4gdGhpcy5faW52b2tlKGRvbWFpbkFuZE1ldGhvZCxyZXF1ZXN0KTt9CnRoaXNbJ2ludm9rZV8nK21ldGhvZE5hbWVdPWludm9rZTt0aGlzLl9yZXBseUFyZ3NbZG9tYWluQW5kTWV0aG9kXT1yZXBseUFyZ3M7aWYoaGFzRXJyb3JEYXRhKQp0aGlzLl9oYXNFcnJvckRhdGFbZG9tYWluQW5kTWV0aG9kXT10cnVlO30KX3ByZXBhcmVQYXJhbWV0ZXJzKG1ldGhvZCxzaWduYXR1cmUsYXJncyxlcnJvckNhbGxiYWNrKXtjb25zdCBwYXJhbXM9e307bGV0IGhhc1BhcmFtcz1mYWxzZTtmb3IoY29uc3QgcGFyYW0gb2Ygc2lnbmF0dXJlKXtjb25zdCBwYXJhbU5hbWU9cGFyYW1bJ25hbWUnXTtjb25zdCB0eXBlTmFtZT1wYXJhbVsndHlwZSddO2NvbnN0IG9wdGlvbmFsRmxhZz1wYXJhbVsnb3B0aW9uYWwnXTtpZighYXJncy5sZW5ndGgmJiFvcHRpb25hbEZsYWcpe2Vycm9yQ2FsbGJhY2soYFByb3RvY29sIEVycm9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIG1ldGhvZCAnJHttZXRob2R9JyBjYWxsLiBgK2BJdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgJHtKU09OLnN0cmluZ2lmeShzaWduYXR1cmUpfScuYCk7cmV0dXJuIG51bGw7fQpjb25zdCB2YWx1ZT1hcmdzLnNoaWZ0KCk7aWYob3B0aW9uYWxGbGFnJiZ0eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJykKY29udGludWU7aWYodHlwZW9mIHZhbHVlIT09dHlwZU5hbWUpe2Vycm9yQ2FsbGJhY2soYFByb3RvY29sIEVycm9yOiBJbnZhbGlkIHR5cGUgb2YgYXJndW1lbnQgJyR7cGFyYW1OYW1lfScgZm9yIG1ldGhvZCAnJHttZXRob2R9JyBjYWxsLiBgK2BJdCBtdXN0IGJlICcke3R5cGVOYW1lfScgYnV0IGl0IGlzICcke3R5cGVvZiB2YWx1ZX0nLmApO3JldHVybiBudWxsO30KcGFyYW1zW3BhcmFtTmFtZV09dmFsdWU7aGFzUGFyYW1zPXRydWU7fQppZihhcmdzLmxlbmd0aCl7ZXJyb3JDYWxsYmFjayhgUHJvdG9jb2wgRXJyb3I6IEV4dHJhICR7YXJncy5sZW5ndGh9IGFyZ3VtZW50cyBpbiBhIGNhbGwgdG8gbWV0aG9kICcke21ldGhvZH0nLmApO3JldHVybiBudWxsO30KcmV0dXJuIGhhc1BhcmFtcz9wYXJhbXM6bnVsbDt9Cl9zZW5kTWVzc2FnZVRvQmFja2VuZFByb21pc2UobWV0aG9kLHNpZ25hdHVyZSxhcmdzKXtsZXQgZXJyb3JNZXNzYWdlO2Z1bmN0aW9uIG9uRXJyb3IobWVzc2FnZSl7Y29uc29sZS5lcnJvcihtZXNzYWdlKTtlcnJvck1lc3NhZ2U9bWVzc2FnZTt9CmNvbnN0IHBhcmFtcz10aGlzLl9wcmVwYXJlUGFyYW1ldGVycyhtZXRob2Qsc2lnbmF0dXJlLGFyZ3Msb25FcnJvcik7aWYoZXJyb3JNZXNzYWdlKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57dGhpcy5fdGFyZ2V0Ll93cmFwQ2FsbGJhY2tBbmRTZW5kTWVzc2FnZU9iamVjdCh0aGlzLl9kb21haW4sbWV0aG9kLHBhcmFtcywoZXJyb3IscmVzdWx0KT0+e2lmKGVycm9yKXtyZXNvbHZlKG51bGwpO3JldHVybjt9CmNvbnN0IGFyZ3M9dGhpcy5fcmVwbHlBcmdzW21ldGhvZF07cmVzb2x2ZShyZXN1bHQmJmFyZ3MubGVuZ3RoP3Jlc3VsdFthcmdzWzBdXTp1bmRlZmluZWQpO30pO30pO30KX2ludm9rZShtZXRob2QscmVxdWVzdCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bGZpbGw9Pnt0aGlzLl90YXJnZXQuX3dyYXBDYWxsYmFja0FuZFNlbmRNZXNzYWdlT2JqZWN0KHRoaXMuX2RvbWFpbixtZXRob2QscmVxdWVzdCwoZXJyb3IscmVzdWx0KT0+e2lmKCFyZXN1bHQpCnJlc3VsdD17fTtpZihlcnJvcikKcmVzdWx0W1Byb3RvY29sLkVycm9yXT1lcnJvci5tZXNzYWdlO2Z1bGZpbGwocmVzdWx0KTt9KTt9KTt9CmRpc3BhdGNoUmVzcG9uc2UobWVzc2FnZU9iamVjdCxtZXRob2ROYW1lLGNhbGxiYWNrKXtpZihtZXNzYWdlT2JqZWN0LmVycm9yJiZtZXNzYWdlT2JqZWN0LmVycm9yLmNvZGUhPT1Qcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl9Db25uZWN0aW9uQ2xvc2VkRXJyb3JDb2RlJiZtZXNzYWdlT2JqZWN0LmVycm9yLmNvZGUhPT1Qcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLkRldlRvb2xzU3R1YkVycm9yQ29kZSYmIVByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5zdXBwcmVzc1JlcXVlc3RFcnJvcnMpe2NvbnN0IGlkPVByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yUHJvdG9jb2xNZXNzYWdlcz8nIHdpdGggaWQgPSAnK21lc3NhZ2VPYmplY3QuaWQ6Jyc7Y29uc29sZS5lcnJvcignUmVxdWVzdCAnK21ldGhvZE5hbWUraWQrJyBmYWlsZWQuICcrSlNPTi5zdHJpbmdpZnkobWVzc2FnZU9iamVjdC5lcnJvcikpO30KY2FsbGJhY2sobWVzc2FnZU9iamVjdC5lcnJvcixtZXNzYWdlT2JqZWN0LnJlc3VsdCk7fX07UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5fRGlzcGF0Y2hlclByb3RvdHlwZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2V2ZW50QXJncz17fTt9CnJlZ2lzdGVyRXZlbnQoZXZlbnROYW1lLHBhcmFtcyl7dGhpcy5fZXZlbnRBcmdzW2V2ZW50TmFtZV09cGFyYW1zO30KaW5pdGlhbGl6ZSgpe3RoaXMuX2Rpc3BhdGNoZXJzPVtdO30KYWRkRG9tYWluRGlzcGF0Y2hlcihkaXNwYXRjaGVyKXt0aGlzLl9kaXNwYXRjaGVycy5wdXNoKGRpc3BhdGNoZXIpO30KZGlzcGF0Y2goZnVuY3Rpb25OYW1lLG1lc3NhZ2VPYmplY3Qpe2lmKCF0aGlzLl9kaXNwYXRjaGVycy5sZW5ndGgpCnJldHVybjtpZighdGhpcy5fZXZlbnRBcmdzW21lc3NhZ2VPYmplY3QubWV0aG9kXSl7UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5yZXBvcnRQcm90b2NvbEVycm9yKGBQcm90b2NvbCBFcnJvcjogQXR0ZW1wdGVkIHRvIGRpc3BhdGNoIGFuIHVuc3BlY2lmaWVkIG1ldGhvZCAnJHttZXNzYWdlT2JqZWN0Lm1ldGhvZH0nYCxtZXNzYWdlT2JqZWN0KTtyZXR1cm47fQpjb25zdCBwYXJhbXM9W107aWYobWVzc2FnZU9iamVjdC5wYXJhbXMpe2NvbnN0IHBhcmFtTmFtZXM9dGhpcy5fZXZlbnRBcmdzW21lc3NhZ2VPYmplY3QubWV0aG9kXTtmb3IobGV0IGk9MDtpPHBhcmFtTmFtZXMubGVuZ3RoOysraSkKcGFyYW1zLnB1c2gobWVzc2FnZU9iamVjdC5wYXJhbXNbcGFyYW1OYW1lc1tpXV0pO30KY29uc3QgdGltaW5nTGFiZWw9J3RpbWUtc3RhdHM6ICcrbWVzc2FnZU9iamVjdC5tZXRob2Q7aWYoUHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5PcHRpb25zLmR1bXBJbnNwZWN0b3JUaW1lU3RhdHMpClByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuX3RpbWVMb2dnZXIudGltZSh0aW1pbmdMYWJlbCk7Zm9yKGxldCBpbmRleD0wO2luZGV4PHRoaXMuX2Rpc3BhdGNoZXJzLmxlbmd0aDsrK2luZGV4KXtjb25zdCBkaXNwYXRjaGVyPXRoaXMuX2Rpc3BhdGNoZXJzW2luZGV4XTtpZihmdW5jdGlvbk5hbWUgaW4gZGlzcGF0Y2hlcikKZGlzcGF0Y2hlcltmdW5jdGlvbk5hbWVdLmFwcGx5KGRpc3BhdGNoZXIscGFyYW1zKTt9CmlmKFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucy5kdW1wSW5zcGVjdG9yVGltZVN0YXRzKQpQcm90b2NvbC5JbnNwZWN0b3JCYWNrZW5kLl90aW1lTG9nZ2VyLnRpbWVFbmQodGltaW5nTGFiZWwpO319O1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQuT3B0aW9ucz17ZHVtcEluc3BlY3RvclRpbWVTdGF0czpmYWxzZSxkdW1wSW5zcGVjdG9yUHJvdG9jb2xNZXNzYWdlczpmYWxzZSxzdXBwcmVzc1JlcXVlc3RFcnJvcnM6ZmFsc2V9O1Byb3RvY29sLkluc3BlY3RvckJhY2tlbmQuX3RpbWVMb2dnZXI9Y29uc29sZS5jb250ZXh0P2NvbnNvbGUuY29udGV4dCgnUHJvdG9jb2wgdGltaW5nJyk6Y29uc29sZTs7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkFjY2Vzc2liaWxpdHkuQVhWYWx1ZVR5cGUiLHtCb29sZWFuOiJib29sZWFuIixUcmlzdGF0ZToidHJpc3RhdGUiLEJvb2xlYW5PclVuZGVmaW5lZDoiYm9vbGVhbk9yVW5kZWZpbmVkIixJZHJlZjoiaWRyZWYiLElkcmVmTGlzdDoiaWRyZWZMaXN0IixJbnRlZ2VyOiJpbnRlZ2VyIixOb2RlOiJub2RlIixOb2RlTGlzdDoibm9kZUxpc3QiLE51bWJlcjoibnVtYmVyIixTdHJpbmc6InN0cmluZyIsQ29tcHV0ZWRTdHJpbmc6ImNvbXB1dGVkU3RyaW5nIixUb2tlbjoidG9rZW4iLFRva2VuTGlzdDoidG9rZW5MaXN0IixEb21SZWxhdGlvbjoiZG9tUmVsYXRpb24iLFJvbGU6InJvbGUiLEludGVybmFsUm9sZToiaW50ZXJuYWxSb2xlIixWYWx1ZVVuZGVmaW5lZDoidmFsdWVVbmRlZmluZWQifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkFjY2Vzc2liaWxpdHkuQVhWYWx1ZVNvdXJjZVR5cGUiLHtBdHRyaWJ1dGU6ImF0dHJpYnV0ZSIsSW1wbGljaXQ6ImltcGxpY2l0IixTdHlsZToic3R5bGUiLENvbnRlbnRzOiJjb250ZW50cyIsUGxhY2Vob2xkZXI6InBsYWNlaG9sZGVyIixSZWxhdGVkRWxlbWVudDoicmVsYXRlZEVsZW1lbnQifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkFjY2Vzc2liaWxpdHkuQVhWYWx1ZU5hdGl2ZVNvdXJjZVR5cGUiLHtGaWdjYXB0aW9uOiJmaWdjYXB0aW9uIixMYWJlbDoibGFiZWwiLExhYmVsZm9yOiJsYWJlbGZvciIsTGFiZWx3cmFwcGVkOiJsYWJlbHdyYXBwZWQiLExlZ2VuZDoibGVnZW5kIixUYWJsZWNhcHRpb246InRhYmxlY2FwdGlvbiIsVGl0bGU6InRpdGxlIixPdGhlcjoib3RoZXIifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkFjY2Vzc2liaWxpdHkuQVhQcm9wZXJ0eU5hbWUiLHtCdXN5OiJidXN5IixEaXNhYmxlZDoiZGlzYWJsZWQiLEhpZGRlbjoiaGlkZGVuIixIaWRkZW5Sb290OiJoaWRkZW5Sb290IixJbnZhbGlkOiJpbnZhbGlkIixLZXlzaG9ydGN1dHM6ImtleXNob3J0Y3V0cyIsUm9sZWRlc2NyaXB0aW9uOiJyb2xlZGVzY3JpcHRpb24iLExpdmU6ImxpdmUiLEF0b21pYzoiYXRvbWljIixSZWxldmFudDoicmVsZXZhbnQiLFJvb3Q6InJvb3QiLEF1dG9jb21wbGV0ZToiYXV0b2NvbXBsZXRlIixIYXNQb3B1cDoiaGFzUG9wdXAiLExldmVsOiJsZXZlbCIsTXVsdGlzZWxlY3RhYmxlOiJtdWx0aXNlbGVjdGFibGUiLE9yaWVudGF0aW9uOiJvcmllbnRhdGlvbiIsTXVsdGlsaW5lOiJtdWx0aWxpbmUiLFJlYWRvbmx5OiJyZWFkb25seSIsUmVxdWlyZWQ6InJlcXVpcmVkIixWYWx1ZW1pbjoidmFsdWVtaW4iLFZhbHVlbWF4OiJ2YWx1ZW1heCIsVmFsdWV0ZXh0OiJ2YWx1ZXRleHQiLENoZWNrZWQ6ImNoZWNrZWQiLEV4cGFuZGVkOiJleHBhbmRlZCIsTW9kYWw6Im1vZGFsIixQcmVzc2VkOiJwcmVzc2VkIixTZWxlY3RlZDoic2VsZWN0ZWQiLEFjdGl2ZWRlc2NlbmRhbnQ6ImFjdGl2ZWRlc2NlbmRhbnQiLENvbnRyb2xzOiJjb250cm9scyIsRGVzY3JpYmVkYnk6ImRlc2NyaWJlZGJ5IixEZXRhaWxzOiJkZXRhaWxzIixFcnJvcm1lc3NhZ2U6ImVycm9ybWVzc2FnZSIsRmxvd3RvOiJmbG93dG8iLExhYmVsbGVkYnk6ImxhYmVsbGVkYnkiLE93bnM6Im93bnMifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkFjY2Vzc2liaWxpdHkuZ2V0UGFydGlhbEFYVHJlZSIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYmFja2VuZE5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImZldGNoUmVsYXRpdmVzIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsibm9kZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkFuaW1hdGlvbi5BbmltYXRpb25UeXBlIix7Q1NTVHJhbnNpdGlvbjoiQ1NTVHJhbnNpdGlvbiIsQ1NTQW5pbWF0aW9uOiJDU1NBbmltYXRpb24iLFdlYkFuaW1hdGlvbjoiV2ViQW5pbWF0aW9uIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiQW5pbWF0aW9uLmFuaW1hdGlvbkNhbmNlbGVkIixbImlkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiQW5pbWF0aW9uLmFuaW1hdGlvbkNyZWF0ZWQiLFsiaWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJBbmltYXRpb24uYW5pbWF0aW9uU3RhcnRlZCIsWyJhbmltYXRpb24iXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkFuaW1hdGlvbi5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkFuaW1hdGlvbi5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQW5pbWF0aW9uLmdldEN1cnJlbnRUaW1lIixbeyJuYW1lIjoiaWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJjdXJyZW50VGltZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQW5pbWF0aW9uLmdldFBsYXliYWNrUmF0ZSIsW10sWyJwbGF5YmFja1JhdGUiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkFuaW1hdGlvbi5yZWxlYXNlQW5pbWF0aW9ucyIsW3sibmFtZSI6ImFuaW1hdGlvbnMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJBbmltYXRpb24ucmVzb2x2ZUFuaW1hdGlvbiIsW3sibmFtZSI6ImFuaW1hdGlvbklkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsicmVtb3RlT2JqZWN0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJBbmltYXRpb24uc2Vla0FuaW1hdGlvbnMiLFt7Im5hbWUiOiJhbmltYXRpb25zIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiY3VycmVudFRpbWUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJBbmltYXRpb24uc2V0UGF1c2VkIixbeyJuYW1lIjoiYW5pbWF0aW9ucyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InBhdXNlZCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJBbmltYXRpb24uc2V0UGxheWJhY2tSYXRlIixbeyJuYW1lIjoicGxheWJhY2tSYXRlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQW5pbWF0aW9uLnNldFRpbWluZyIsW3sibmFtZSI6ImFuaW1hdGlvbklkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZHVyYXRpb24iLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkZWxheSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJBcHBsaWNhdGlvbkNhY2hlLmFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkIixbImZyYW1lSWQiLCJtYW5pZmVzdFVSTCIsInN0YXR1cyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkFwcGxpY2F0aW9uQ2FjaGUubmV0d29ya1N0YXRlVXBkYXRlZCIsWyJpc05vd09ubGluZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQXBwbGljYXRpb25DYWNoZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQXBwbGljYXRpb25DYWNoZS5nZXRBcHBsaWNhdGlvbkNhY2hlRm9yRnJhbWUiLFt7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiYXBwbGljYXRpb25DYWNoZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQXBwbGljYXRpb25DYWNoZS5nZXRGcmFtZXNXaXRoTWFuaWZlc3RzIixbXSxbImZyYW1lSWRzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJBcHBsaWNhdGlvbkNhY2hlLmdldE1hbmlmZXN0Rm9yRnJhbWUiLFt7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsibWFuaWZlc3RVUkwiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkF1ZGl0cy5nZXRFbmNvZGVkUmVzcG9uc2UiLFt7Im5hbWUiOiJyZXF1ZXN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJlbmNvZGluZyIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InF1YWxpdHkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNpemVPbmx5IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsiYm9keSIsIm9yaWdpbmFsU2l6ZSIsImVuY29kZWRTaXplIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJCcm93c2VyLldpbmRvd1N0YXRlIix7Tm9ybWFsOiJub3JtYWwiLE1pbmltaXplZDoibWluaW1pemVkIixNYXhpbWl6ZWQ6Im1heGltaXplZCIsRnVsbHNjcmVlbjoiZnVsbHNjcmVlbiJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQnJvd3Nlci5jbG9zZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJCcm93c2VyLmdldFZlcnNpb24iLFtdLFsicHJvdG9jb2xWZXJzaW9uIiwicHJvZHVjdCIsInJldmlzaW9uIiwidXNlckFnZW50IiwianNWZXJzaW9uIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJCcm93c2VyLmdldEJyb3dzZXJDb21tYW5kTGluZSIsW10sWyJhcmd1bWVudHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkJyb3dzZXIuZ2V0SGlzdG9ncmFtcyIsW3sibmFtZSI6InF1ZXJ5IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkZWx0YSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbImhpc3RvZ3JhbXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkJyb3dzZXIuZ2V0SGlzdG9ncmFtIixbeyJuYW1lIjoibmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRlbHRhIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsiaGlzdG9ncmFtIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJCcm93c2VyLmdldFdpbmRvd0JvdW5kcyIsW3sibmFtZSI6IndpbmRvd0lkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiYm91bmRzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJCcm93c2VyLmdldFdpbmRvd0ZvclRhcmdldCIsW3sibmFtZSI6InRhcmdldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsid2luZG93SWQiLCJib3VuZHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkJyb3dzZXIuc2V0V2luZG93Qm91bmRzIixbeyJuYW1lIjoid2luZG93SWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJib3VuZHMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJDU1MuU3R5bGVTaGVldE9yaWdpbiIse0luamVjdGVkOiJpbmplY3RlZCIsVXNlckFnZW50OiJ1c2VyLWFnZW50IixJbnNwZWN0b3I6Imluc3BlY3RvciIsUmVndWxhcjoicmVndWxhciJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiQ1NTLkNTU01lZGlhU291cmNlIix7TWVkaWFSdWxlOiJtZWRpYVJ1bGUiLEltcG9ydFJ1bGU6ImltcG9ydFJ1bGUiLExpbmtlZFNoZWV0OiJsaW5rZWRTaGVldCIsSW5saW5lU2hlZXQ6ImlubGluZVNoZWV0In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiQ1NTLmZvbnRzVXBkYXRlZCIsWyJmb250Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiQ1NTLm1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkIixbXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJDU1Muc3R5bGVTaGVldEFkZGVkIixbImhlYWRlciJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkNTUy5zdHlsZVNoZWV0Q2hhbmdlZCIsWyJzdHlsZVNoZWV0SWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJDU1Muc3R5bGVTaGVldFJlbW92ZWQiLFsic3R5bGVTaGVldElkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuYWRkUnVsZSIsW3sibmFtZSI6InN0eWxlU2hlZXRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InJ1bGVUZXh0IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoibG9jYXRpb24iLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sWyJydWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuY29sbGVjdENsYXNzTmFtZXMiLFt7Im5hbWUiOiJzdHlsZVNoZWV0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJjbGFzc05hbWVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuY3JlYXRlU3R5bGVTaGVldCIsW3sibmFtZSI6ImZyYW1lSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJzdHlsZVNoZWV0SWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkNTUy5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkNTUy5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ1NTLmZvcmNlUHNldWRvU3RhdGUiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJmb3JjZWRQc2V1ZG9DbGFzc2VzIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ1NTLmdldEJhY2tncm91bmRDb2xvcnMiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJiYWNrZ3JvdW5kQ29sb3JzIiwiY29tcHV0ZWRGb250U2l6ZSIsImNvbXB1dGVkRm9udFdlaWdodCIsImNvbXB1dGVkQm9keUZvbnRTaXplIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuZ2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJjb21wdXRlZFN0eWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuZ2V0SW5saW5lU3R5bGVzRm9yTm9kZSIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbImlubGluZVN0eWxlIiwiYXR0cmlidXRlc1N0eWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuZ2V0TWF0Y2hlZFN0eWxlc0Zvck5vZGUiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJpbmxpbmVTdHlsZSIsImF0dHJpYnV0ZXNTdHlsZSIsIm1hdGNoZWRDU1NSdWxlcyIsInBzZXVkb0VsZW1lbnRzIiwiaW5oZXJpdGVkIiwiY3NzS2V5ZnJhbWVzUnVsZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkNTUy5nZXRNZWRpYVF1ZXJpZXMiLFtdLFsibWVkaWFzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1MuZ2V0UGxhdGZvcm1Gb250c0Zvck5vZGUiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJmb250cyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ1NTLmdldFN0eWxlU2hlZXRUZXh0IixbeyJuYW1lIjoic3R5bGVTaGVldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsidGV4dCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ1NTLnNldEVmZmVjdGl2ZVByb3BlcnR5VmFsdWVGb3JOb2RlIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoicHJvcGVydHlOYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidmFsdWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc2V0S2V5ZnJhbWVLZXkiLFt7Im5hbWUiOiJzdHlsZVNoZWV0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJyYW5nZSIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImtleVRleHQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJrZXlUZXh0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc2V0TWVkaWFUZXh0IixbeyJuYW1lIjoic3R5bGVTaGVldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoicmFuZ2UiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ0ZXh0IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsibWVkaWEiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkNTUy5zZXRSdWxlU2VsZWN0b3IiLFt7Im5hbWUiOiJzdHlsZVNoZWV0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJyYW5nZSIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNlbGVjdG9yIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsic2VsZWN0b3JMaXN0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc2V0U3R5bGVTaGVldFRleHQiLFt7Im5hbWUiOiJzdHlsZVNoZWV0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ0ZXh0IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsic291cmNlTWFwVVJMIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc2V0U3R5bGVUZXh0cyIsW3sibmFtZSI6ImVkaXRzIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX1dLFsic3R5bGVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc3RhcnRSdWxlVXNhZ2VUcmFja2luZyIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDU1Muc3RvcFJ1bGVVc2FnZVRyYWNraW5nIixbXSxbInJ1bGVVc2FnZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ1NTLnRha2VDb3ZlcmFnZURlbHRhIixbXSxbImNvdmVyYWdlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDYWNoZVN0b3JhZ2UuZGVsZXRlQ2FjaGUiLFt7Im5hbWUiOiJjYWNoZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ2FjaGVTdG9yYWdlLmRlbGV0ZUVudHJ5IixbeyJuYW1lIjoiY2FjaGVJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InJlcXVlc3QiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJDYWNoZVN0b3JhZ2UucmVxdWVzdENhY2hlTmFtZXMiLFt7Im5hbWUiOiJzZWN1cml0eU9yaWdpbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbImNhY2hlcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiQ2FjaGVTdG9yYWdlLnJlcXVlc3RDYWNoZWRSZXNwb25zZSIsW3sibmFtZSI6ImNhY2hlSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJyZXF1ZXN0VVJMIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsicmVzcG9uc2UiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkNhY2hlU3RvcmFnZS5yZXF1ZXN0RW50cmllcyIsW3sibmFtZSI6ImNhY2hlSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJza2lwQ291bnQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJwYWdlU2l6ZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbImNhY2hlRGF0YUVudHJpZXMiLCJoYXNNb3JlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJET00uUHNldWRvVHlwZSIse0ZpcnN0TGluZToiZmlyc3QtbGluZSIsRmlyc3RMZXR0ZXI6ImZpcnN0LWxldHRlciIsQmVmb3JlOiJiZWZvcmUiLEFmdGVyOiJhZnRlciIsQmFja2Ryb3A6ImJhY2tkcm9wIixTZWxlY3Rpb246InNlbGVjdGlvbiIsRmlyc3RMaW5lSW5oZXJpdGVkOiJmaXJzdC1saW5lLWluaGVyaXRlZCIsU2Nyb2xsYmFyOiJzY3JvbGxiYXIiLFNjcm9sbGJhclRodW1iOiJzY3JvbGxiYXItdGh1bWIiLFNjcm9sbGJhckJ1dHRvbjoic2Nyb2xsYmFyLWJ1dHRvbiIsU2Nyb2xsYmFyVHJhY2s6InNjcm9sbGJhci10cmFjayIsU2Nyb2xsYmFyVHJhY2tQaWVjZToic2Nyb2xsYmFyLXRyYWNrLXBpZWNlIixTY3JvbGxiYXJDb3JuZXI6InNjcm9sbGJhci1jb3JuZXIiLFJlc2l6ZXI6InJlc2l6ZXIiLElucHV0TGlzdEJ1dHRvbjoiaW5wdXQtbGlzdC1idXR0b24ifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkRPTS5TaGFkb3dSb290VHlwZSIse1VzZXJBZ2VudDoidXNlci1hZ2VudCIsT3Blbjoib3BlbiIsQ2xvc2VkOiJjbG9zZWQifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJET00uYXR0cmlidXRlTW9kaWZpZWQiLFsibm9kZUlkIiwibmFtZSIsInZhbHVlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLmF0dHJpYnV0ZVJlbW92ZWQiLFsibm9kZUlkIiwibmFtZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTS5jaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLFsibm9kZUlkIiwiY2hhcmFjdGVyRGF0YSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTS5jaGlsZE5vZGVDb3VudFVwZGF0ZWQiLFsibm9kZUlkIiwiY2hpbGROb2RlQ291bnQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJET00uY2hpbGROb2RlSW5zZXJ0ZWQiLFsicGFyZW50Tm9kZUlkIiwicHJldmlvdXNOb2RlSWQiLCJub2RlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLmNoaWxkTm9kZVJlbW92ZWQiLFsicGFyZW50Tm9kZUlkIiwibm9kZUlkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLmRpc3RyaWJ1dGVkTm9kZXNVcGRhdGVkIixbImluc2VydGlvblBvaW50SWQiLCJkaXN0cmlidXRlZE5vZGVzIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLmRvY3VtZW50VXBkYXRlZCIsW10pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLmlubGluZVN0eWxlSW52YWxpZGF0ZWQiLFsibm9kZUlkcyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTS5wc2V1ZG9FbGVtZW50QWRkZWQiLFsicGFyZW50SWQiLCJwc2V1ZG9FbGVtZW50Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLnBzZXVkb0VsZW1lbnRSZW1vdmVkIixbInBhcmVudElkIiwicHNldWRvRWxlbWVudElkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NLnNldENoaWxkTm9kZXMiLFsicGFyZW50SWQiLCJub2RlcyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTS5zaGFkb3dSb290UG9wcGVkIixbImhvc3RJZCIsInJvb3RJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTS5zaGFkb3dSb290UHVzaGVkIixbImhvc3RJZCIsInJvb3QiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5jb2xsZWN0Q2xhc3NOYW1lc0Zyb21TdWJ0cmVlIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiY2xhc3NOYW1lcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLmNvcHlUbyIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InRhcmdldE5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Imluc2VydEJlZm9yZU5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFsibm9kZUlkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZGVzY3JpYmVOb2RlIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJiYWNrZW5kTm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJvYmplY3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZGVwdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBpZXJjZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbIm5vZGUiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5kaXNjYXJkU2VhcmNoUmVzdWx0cyIsW3sibmFtZSI6InNlYXJjaElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLmVuYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZm9jdXMiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImJhY2tlbmROb2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZ2V0QXR0cmlidXRlcyIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbImF0dHJpYnV0ZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXRCb3hNb2RlbCIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYmFja2VuZE5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbIm1vZGVsIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZ2V0Q29udGVudFF1YWRzIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJiYWNrZW5kTm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJvYmplY3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFsicXVhZHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXREb2N1bWVudCIsW3sibmFtZSI6ImRlcHRoIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJwaWVyY2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sWyJyb290Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZ2V0RmxhdHRlbmVkRG9jdW1lbnQiLFt7Im5hbWUiOiJkZXB0aCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicGllcmNlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsibm9kZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXROb2RlRm9yTG9jYXRpb24iLFt7Im5hbWUiOiJ4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoieSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImluY2x1ZGVVc2VyQWdlbnRTaGFkb3dET00iLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sWyJub2RlSWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXRPdXRlckhUTUwiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImJhY2tlbmROb2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sWyJvdXRlckhUTUwiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXRSZWxheW91dEJvdW5kYXJ5IixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFsibm9kZUlkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uZ2V0U2VhcmNoUmVzdWx0cyIsW3sibmFtZSI6InNlYXJjaElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZnJvbUluZGV4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidG9JbmRleCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbIm5vZGVJZHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5oaWRlSGlnaGxpZ2h0IixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5oaWdobGlnaHROb2RlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5oaWdobGlnaHRSZWN0IixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5tYXJrVW5kb2FibGVTdGF0ZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00ubW92ZVRvIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidGFyZ2V0Tm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiaW5zZXJ0QmVmb3JlTm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfV0sWyJub2RlSWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5wZXJmb3JtU2VhcmNoIixbeyJuYW1lIjoicXVlcnkiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJpbmNsdWRlVXNlckFnZW50U2hhZG93RE9NIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsic2VhcmNoSWQiLCJyZXN1bHRDb3VudCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnB1c2hOb2RlQnlQYXRoVG9Gcm9udGVuZCIsW3sibmFtZSI6InBhdGgiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJub2RlSWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5wdXNoTm9kZXNCeUJhY2tlbmRJZHNUb0Zyb250ZW5kIixbeyJuYW1lIjoiYmFja2VuZE5vZGVJZHMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sWyJub2RlSWRzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00ucXVlcnlTZWxlY3RvciIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNlbGVjdG9yIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsibm9kZUlkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00ucXVlcnlTZWxlY3RvckFsbCIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNlbGVjdG9yIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsibm9kZUlkcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnJlZG8iLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnJlbW92ZUF0dHJpYnV0ZSIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00ucmVtb3ZlTm9kZSIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5yZXF1ZXN0Q2hpbGROb2RlcyIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRlcHRoIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJwaWVyY2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00ucmVxdWVzdE5vZGUiLFt7Im5hbWUiOiJvYmplY3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbIm5vZGVJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnJlc29sdmVOb2RlIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJiYWNrZW5kTm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJvYmplY3RHcm91cCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFsib2JqZWN0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uc2V0QXR0cmlidXRlVmFsdWUiLFt7Im5hbWUiOiJub2RlSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJuYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidmFsdWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uc2V0QXR0cmlidXRlc0FzVGV4dCIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InRleHQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJuYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET00uc2V0RmlsZUlucHV0RmlsZXMiLFt7Im5hbWUiOiJmaWxlcyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYmFja2VuZE5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5zZXRJbnNwZWN0ZWROb2RlIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnNldE5vZGVOYW1lIixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoibmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbIm5vZGVJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnNldE5vZGVWYWx1ZSIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InZhbHVlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NLnNldE91dGVySFRNTCIsW3sibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im91dGVySFRNTCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS51bmRvIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTS5nZXRGcmFtZU93bmVyIixbeyJuYW1lIjoiZnJhbWVJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbIm5vZGVJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiRE9NRGVidWdnZXIuRE9NQnJlYWtwb2ludFR5cGUiLHtTdWJ0cmVlTW9kaWZpZWQ6InN1YnRyZWUtbW9kaWZpZWQiLEF0dHJpYnV0ZU1vZGlmaWVkOiJhdHRyaWJ1dGUtbW9kaWZpZWQiLE5vZGVSZW1vdmVkOiJub2RlLXJlbW92ZWQifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTURlYnVnZ2VyLmdldEV2ZW50TGlzdGVuZXJzIixbeyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkZXB0aCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicGllcmNlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsibGlzdGVuZXJzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01EZWJ1Z2dlci5yZW1vdmVET01CcmVha3BvaW50IixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidHlwZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTURlYnVnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50IixbeyJuYW1lIjoiZXZlbnROYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidGFyZ2V0TmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NRGVidWdnZXIucmVtb3ZlSW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludCIsW3sibmFtZSI6ImV2ZW50TmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTURlYnVnZ2VyLnJlbW92ZVhIUkJyZWFrcG9pbnQiLFt7Im5hbWUiOiJ1cmwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01EZWJ1Z2dlci5zZXRET01CcmVha3BvaW50IixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidHlwZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTURlYnVnZ2VyLnNldEV2ZW50TGlzdGVuZXJCcmVha3BvaW50IixbeyJuYW1lIjoiZXZlbnROYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidGFyZ2V0TmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NRGVidWdnZXIuc2V0SW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludCIsW3sibmFtZSI6ImV2ZW50TmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTURlYnVnZ2VyLnNldFhIUkJyZWFrcG9pbnQiLFt7Im5hbWUiOiJ1cmwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01TbmFwc2hvdC5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTVNuYXBzaG90LmVuYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01TbmFwc2hvdC5nZXRTbmFwc2hvdCIsW3sibmFtZSI6ImNvbXB1dGVkU3R5bGVXaGl0ZWxpc3QiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJpbmNsdWRlRXZlbnRMaXN0ZW5lcnMiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJpbmNsdWRlUGFpbnRPcmRlciIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImluY2x1ZGVVc2VyQWdlbnRTaGFkb3dUcmVlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsiZG9tTm9kZXMiLCJsYXlvdXRUcmVlTm9kZXMiLCJjb21wdXRlZFN0eWxlcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NU25hcHNob3QuY2FwdHVyZVNuYXBzaG90IixbeyJuYW1lIjoiY29tcHV0ZWRTdHlsZXMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sWyJkb2N1bWVudHMiLCJzdHJpbmdzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NU3RvcmFnZS5kb21TdG9yYWdlSXRlbUFkZGVkIixbInN0b3JhZ2VJZCIsImtleSIsIm5ld1ZhbHVlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NU3RvcmFnZS5kb21TdG9yYWdlSXRlbVJlbW92ZWQiLFsic3RvcmFnZUlkIiwia2V5Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRE9NU3RvcmFnZS5kb21TdG9yYWdlSXRlbVVwZGF0ZWQiLFsic3RvcmFnZUlkIiwia2V5Iiwib2xkVmFsdWUiLCJuZXdWYWx1ZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRPTVN0b3JhZ2UuZG9tU3RvcmFnZUl0ZW1zQ2xlYXJlZCIsWyJzdG9yYWdlSWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRPTVN0b3JhZ2UuY2xlYXIiLFt7Im5hbWUiOiJzdG9yYWdlSWQiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01TdG9yYWdlLmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NU3RvcmFnZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NU3RvcmFnZS5nZXRET01TdG9yYWdlSXRlbXMiLFt7Im5hbWUiOiJzdG9yYWdlSWQiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sWyJlbnRyaWVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJET01TdG9yYWdlLnJlbW92ZURPTVN0b3JhZ2VJdGVtIixbeyJuYW1lIjoic3RvcmFnZUlkIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoia2V5IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRE9NU3RvcmFnZS5zZXRET01TdG9yYWdlSXRlbSIsW3sibmFtZSI6InN0b3JhZ2VJZCIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImtleSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InZhbHVlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRhdGFiYXNlLmFkZERhdGFiYXNlIixbImRhdGFiYXNlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEYXRhYmFzZS5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRhdGFiYXNlLmVuYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEYXRhYmFzZS5leGVjdXRlU1FMIixbeyJuYW1lIjoiZGF0YWJhc2VJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InF1ZXJ5IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiY29sdW1uTmFtZXMiLCJ2YWx1ZXMiLCJzcWxFcnJvciJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGF0YWJhc2UuZ2V0RGF0YWJhc2VUYWJsZU5hbWVzIixbeyJuYW1lIjoiZGF0YWJhc2VJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbInRhYmxlTmFtZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRldmljZU9yaWVudGF0aW9uLmNsZWFyRGV2aWNlT3JpZW50YXRpb25PdmVycmlkZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZXZpY2VPcmllbnRhdGlvbi5zZXREZXZpY2VPcmllbnRhdGlvbk92ZXJyaWRlIixbeyJuYW1lIjoiYWxwaGEiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJiZXRhIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZ2FtbWEiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJFbXVsYXRpb24uU2NyZWVuT3JpZW50YXRpb25UeXBlIix7UG9ydHJhaXRQcmltYXJ5OiJwb3J0cmFpdFByaW1hcnkiLFBvcnRyYWl0U2Vjb25kYXJ5OiJwb3J0cmFpdFNlY29uZGFyeSIsTGFuZHNjYXBlUHJpbWFyeToibGFuZHNjYXBlUHJpbWFyeSIsTGFuZHNjYXBlU2Vjb25kYXJ5OiJsYW5kc2NhcGVTZWNvbmRhcnkifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkVtdWxhdGlvbi5WaXJ0dWFsVGltZVBvbGljeSIse0FkdmFuY2U6ImFkdmFuY2UiLFBhdXNlOiJwYXVzZSIsUGF1c2VJZk5ldHdvcmtGZXRjaGVzUGVuZGluZzoicGF1c2VJZk5ldHdvcmtGZXRjaGVzUGVuZGluZyJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkVtdWxhdGlvbi52aXJ0dWFsVGltZUFkdmFuY2VkIixbInZpcnR1YWxUaW1lRWxhcHNlZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkVtdWxhdGlvbi52aXJ0dWFsVGltZUJ1ZGdldEV4cGlyZWQiLFtdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkVtdWxhdGlvbi52aXJ0dWFsVGltZVBhdXNlZCIsWyJ2aXJ0dWFsVGltZUVsYXBzZWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5jYW5FbXVsYXRlIixbXSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5jbGVhckdlb2xvY2F0aW9uT3ZlcnJpZGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRW11bGF0aW9uLnJlc2V0UGFnZVNjYWxlRmFjdG9yIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXRDUFVUaHJvdHRsaW5nUmF0ZSIsW3sibmFtZSI6InJhdGUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvck92ZXJyaWRlIixbeyJuYW1lIjoiY29sb3IiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUiLFt7Im5hbWUiOiJ3aWR0aCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImhlaWdodCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRldmljZVNjYWxlRmFjdG9yIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoibW9iaWxlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNjYWxlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJzY3JlZW5XaWR0aCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2NyZWVuSGVpZ2h0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJwb3NpdGlvblgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBvc2l0aW9uWSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZG9udFNldFZpc2libGVTaXplIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2NyZWVuT3JpZW50YXRpb24iLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InZpZXdwb3J0IiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0U2Nyb2xsYmFyc0hpZGRlbiIsW3sibmFtZSI6ImhpZGRlbiIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0RG9jdW1lbnRDb29raWVEaXNhYmxlZCIsW3sibmFtZSI6ImRpc2FibGVkIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXRFbWl0VG91Y2hFdmVudHNGb3JNb3VzZSIsW3sibmFtZSI6ImVuYWJsZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiY29uZmlndXJhdGlvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRW11bGF0aW9uLnNldEVtdWxhdGVkTWVkaWEiLFt7Im5hbWUiOiJtZWRpYSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlIixbeyJuYW1lIjoibGF0aXR1ZGUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImxvbmdpdHVkZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYWNjdXJhY3kiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXROYXZpZ2F0b3JPdmVycmlkZXMiLFt7Im5hbWUiOiJwbGF0Zm9ybSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkVtdWxhdGlvbi5zZXRQYWdlU2NhbGVGYWN0b3IiLFt7Im5hbWUiOiJwYWdlU2NhbGVGYWN0b3IiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0U2NyaXB0RXhlY3V0aW9uRGlzYWJsZWQiLFt7Im5hbWUiOiJ2YWx1ZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0VG91Y2hFbXVsYXRpb25FbmFibGVkIixbeyJuYW1lIjoiZW5hYmxlZCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJtYXhUb3VjaFBvaW50cyIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRW11bGF0aW9uLnNldFZpcnR1YWxUaW1lUG9saWN5IixbeyJuYW1lIjoicG9saWN5IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiYnVkZ2V0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtYXhWaXJ0dWFsVGltZVRhc2tTdGFydmF0aW9uQ291bnQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6IndhaXRGb3JOYXZpZ2F0aW9uIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaW5pdGlhbFZpcnR1YWxUaW1lIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfV0sWyJ2aXJ0dWFsVGltZVRpY2tzQmFzZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRW11bGF0aW9uLnNldFZpc2libGVTaXplIixbeyJuYW1lIjoid2lkdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJoZWlnaHQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJFbXVsYXRpb24uc2V0VXNlckFnZW50T3ZlcnJpZGUiLFt7Im5hbWUiOiJ1c2VyQWdlbnQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJhY2NlcHRMYW5ndWFnZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicGxhdGZvcm0iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkhlYWRsZXNzRXhwZXJpbWVudGFsLlNjcmVlbnNob3RQYXJhbXNGb3JtYXQiLHtKcGVnOiJqcGVnIixQbmc6InBuZyJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkhlYWRsZXNzRXhwZXJpbWVudGFsLm5lZWRzQmVnaW5GcmFtZXNDaGFuZ2VkIixbIm5lZWRzQmVnaW5GcmFtZXMiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYWRsZXNzRXhwZXJpbWVudGFsLmJlZ2luRnJhbWUiLFt7Im5hbWUiOiJmcmFtZVRpbWVUaWNrcyIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaW50ZXJ2YWwiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im5vRGlzcGxheVVwZGF0ZXMiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJzY3JlZW5zaG90IiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjp0cnVlfV0sWyJoYXNEYW1hZ2UiLCJzY3JlZW5zaG90RGF0YSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSGVhZGxlc3NFeHBlcmltZW50YWwuZGlzYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJIZWFkbGVzc0V4cGVyaW1lbnRhbC5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSU8uY2xvc2UiLFt7Im5hbWUiOiJoYW5kbGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJJTy5yZWFkIixbeyJuYW1lIjoiaGFuZGxlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoib2Zmc2V0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJzaXplIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfV0sWyJiYXNlNjRFbmNvZGVkIiwiZGF0YSIsImVvZiJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSU8ucmVzb2x2ZUJsb2IiLFt7Im5hbWUiOiJvYmplY3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbInV1aWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkluZGV4ZWREQi5LZXlUeXBlIix7TnVtYmVyOiJudW1iZXIiLFN0cmluZzoic3RyaW5nIixEYXRlOiJkYXRlIixBcnJheToiYXJyYXkifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkluZGV4ZWREQi5LZXlQYXRoVHlwZSIse051bGw6Im51bGwiLFN0cmluZzoic3RyaW5nIixBcnJheToiYXJyYXkifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkluZGV4ZWREQi5jbGVhck9iamVjdFN0b3JlIixbeyJuYW1lIjoic2VjdXJpdHlPcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkYXRhYmFzZU5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJvYmplY3RTdG9yZU5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJJbmRleGVkREIuZGVsZXRlRGF0YWJhc2UiLFt7Im5hbWUiOiJzZWN1cml0eU9yaWdpbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRhdGFiYXNlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkluZGV4ZWREQi5kZWxldGVPYmplY3RTdG9yZUVudHJpZXMiLFt7Im5hbWUiOiJzZWN1cml0eU9yaWdpbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRhdGFiYXNlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im9iamVjdFN0b3JlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImtleVJhbmdlIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5kZXhlZERCLmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5kZXhlZERCLmVuYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJJbmRleGVkREIucmVxdWVzdERhdGEiLFt7Im5hbWUiOiJzZWN1cml0eU9yaWdpbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRhdGFiYXNlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im9iamVjdFN0b3JlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImluZGV4TmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNraXBDb3VudCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InBhZ2VTaXplIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoia2V5UmFuZ2UiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbIm9iamVjdFN0b3JlRGF0YUVudHJpZXMiLCJoYXNNb3JlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJJbmRleGVkREIucmVxdWVzdERhdGFiYXNlIixbeyJuYW1lIjoic2VjdXJpdHlPcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkYXRhYmFzZU5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJkYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkluZGV4ZWREQi5yZXF1ZXN0RGF0YWJhc2VOYW1lcyIsW3sibmFtZSI6InNlY3VyaXR5T3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiZGF0YWJhc2VOYW1lcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiSW5wdXQuR2VzdHVyZVNvdXJjZVR5cGUiLHtEZWZhdWx0OiJkZWZhdWx0IixUb3VjaDoidG91Y2giLE1vdXNlOiJtb3VzZSJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCIsW3sibmFtZSI6InR5cGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJtb2RpZmllcnMiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRpbWVzdGFtcCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidGV4dCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidW5tb2RpZmllZFRleHQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImtleUlkZW50aWZpZXIiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImNvZGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImtleSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoid2luZG93c1ZpcnR1YWxLZXlDb2RlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJuYXRpdmVWaXJ0dWFsS2V5Q29kZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYXV0b1JlcGVhdCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImlzS2V5cGFkIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaXNTeXN0ZW1LZXkiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJsb2NhdGlvbiIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50IixbeyJuYW1lIjoidHlwZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6IngiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ5IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoibW9kaWZpZXJzIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0aW1lc3RhbXAiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImJ1dHRvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiY2xpY2tDb3VudCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZGVsdGFYIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkZWx0YVkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIklucHV0LmRpc3BhdGNoVG91Y2hFdmVudCIsW3sibmFtZSI6InR5cGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ0b3VjaFBvaW50cyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im1vZGlmaWVycyIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidGltZXN0YW1wIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJJbnB1dC5lbXVsYXRlVG91Y2hGcm9tTW91c2VFdmVudCIsW3sibmFtZSI6InR5cGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoieSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImJ1dHRvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InRpbWVzdGFtcCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZGVsdGFYIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkZWx0YVkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im1vZGlmaWVycyIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiY2xpY2tDb3VudCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuc2V0SWdub3JlSW5wdXRFdmVudHMiLFt7Im5hbWUiOiJpZ25vcmUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuc3ludGhlc2l6ZVBpbmNoR2VzdHVyZSIsW3sibmFtZSI6IngiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ5IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoic2NhbGVGYWN0b3IiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJyZWxhdGl2ZVNwZWVkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZXN0dXJlU291cmNlVHlwZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuc3ludGhlc2l6ZVNjcm9sbEdlc3R1cmUiLFt7Im5hbWUiOiJ4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoieSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InhEaXN0YW5jZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoieURpc3RhbmNlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ4T3ZlcnNjcm9sbCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoieU92ZXJzY3JvbGwiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InByZXZlbnRGbGluZyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNwZWVkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZXN0dXJlU291cmNlVHlwZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicmVwZWF0Q291bnQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InJlcGVhdERlbGF5TXMiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImludGVyYWN0aW9uTWFya2VyTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmUiLFt7Im5hbWUiOiJ4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoieSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImR1cmF0aW9uIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0YXBDb3VudCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZ2VzdHVyZVNvdXJjZVR5cGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJJbnNwZWN0b3IuZGV0YWNoZWQiLFsicmVhc29uIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiSW5zcGVjdG9yLnRhcmdldENyYXNoZWQiLFtdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkluc3BlY3Rvci50YXJnZXRSZWxvYWRlZEFmdGVyQ3Jhc2giLFtdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5zcGVjdG9yLmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSW5zcGVjdG9yLmVuYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJMYXllclRyZWUuU2Nyb2xsUmVjdFR5cGUiLHtSZXBhaW50c09uU2Nyb2xsOiJSZXBhaW50c09uU2Nyb2xsIixUb3VjaEV2ZW50SGFuZGxlcjoiVG91Y2hFdmVudEhhbmRsZXIiLFdoZWVsRXZlbnRIYW5kbGVyOiJXaGVlbEV2ZW50SGFuZGxlciJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkxheWVyVHJlZS5sYXllclBhaW50ZWQiLFsibGF5ZXJJZCIsImNsaXAiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJMYXllclRyZWUubGF5ZXJUcmVlRGlkQ2hhbmdlIixbImxheWVycyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTGF5ZXJUcmVlLmNvbXBvc2l0aW5nUmVhc29ucyIsW3sibmFtZSI6ImxheWVySWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJjb21wb3NpdGluZ1JlYXNvbnMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxheWVyVHJlZS5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxheWVyVHJlZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTGF5ZXJUcmVlLmxvYWRTbmFwc2hvdCIsW3sibmFtZSI6InRpbGVzIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX1dLFsic25hcHNob3RJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTGF5ZXJUcmVlLm1ha2VTbmFwc2hvdCIsW3sibmFtZSI6ImxheWVySWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJzbmFwc2hvdElkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJMYXllclRyZWUucHJvZmlsZVNuYXBzaG90IixbeyJuYW1lIjoic25hcHNob3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im1pblJlcGVhdENvdW50IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtaW5EdXJhdGlvbiIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiY2xpcFJlY3QiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbInRpbWluZ3MiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxheWVyVHJlZS5yZWxlYXNlU25hcHNob3QiLFt7Im5hbWUiOiJzbmFwc2hvdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTGF5ZXJUcmVlLnJlcGxheVNuYXBzaG90IixbeyJuYW1lIjoic25hcHNob3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImZyb21TdGVwIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0b1N0ZXAiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNjYWxlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfV0sWyJkYXRhVVJMIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJMYXllclRyZWUuc25hcHNob3RDb21tYW5kTG9nIixbeyJuYW1lIjoic25hcHNob3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbImNvbW1hbmRMb2ciXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkxvZy5Mb2dFbnRyeVNvdXJjZSIse1hNTDoieG1sIixKYXZhc2NyaXB0OiJqYXZhc2NyaXB0IixOZXR3b3JrOiJuZXR3b3JrIixTdG9yYWdlOiJzdG9yYWdlIixBcHBjYWNoZToiYXBwY2FjaGUiLFJlbmRlcmluZzoicmVuZGVyaW5nIixTZWN1cml0eToic2VjdXJpdHkiLERlcHJlY2F0aW9uOiJkZXByZWNhdGlvbiIsV29ya2VyOiJ3b3JrZXIiLFZpb2xhdGlvbjoidmlvbGF0aW9uIixJbnRlcnZlbnRpb246ImludGVydmVudGlvbiIsUmVjb21tZW5kYXRpb246InJlY29tbWVuZGF0aW9uIixPdGhlcjoib3RoZXIifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkxvZy5Mb2dFbnRyeUxldmVsIix7VmVyYm9zZToidmVyYm9zZSIsSW5mbzoiaW5mbyIsV2FybmluZzoid2FybmluZyIsRXJyb3I6ImVycm9yIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJMb2cuVmlvbGF0aW9uU2V0dGluZ05hbWUiLHtMb25nVGFzazoibG9uZ1Rhc2siLExvbmdMYXlvdXQ6ImxvbmdMYXlvdXQiLEJsb2NrZWRFdmVudDoiYmxvY2tlZEV2ZW50IixCbG9ja2VkUGFyc2VyOiJibG9ja2VkUGFyc2VyIixEaXNjb3VyYWdlZEFQSVVzZToiZGlzY291cmFnZWRBUElVc2UiLEhhbmRsZXI6ImhhbmRsZXIiLFJlY3VycmluZ0hhbmRsZXI6InJlY3VycmluZ0hhbmRsZXIifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJMb2cuZW50cnlBZGRlZCIsWyJlbnRyeSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTG9nLmNsZWFyIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxvZy5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxvZy5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTG9nLnN0YXJ0VmlvbGF0aW9uc1JlcG9ydCIsW3sibmFtZSI6ImNvbmZpZyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkxvZy5zdG9wVmlvbGF0aW9uc1JlcG9ydCIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJNZW1vcnkuUHJlc3N1cmVMZXZlbCIse01vZGVyYXRlOiJtb2RlcmF0ZSIsQ3JpdGljYWw6ImNyaXRpY2FsIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJNZW1vcnkuZ2V0RE9NQ291bnRlcnMiLFtdLFsiZG9jdW1lbnRzIiwibm9kZXMiLCJqc0V2ZW50TGlzdGVuZXJzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJNZW1vcnkucHJlcGFyZUZvckxlYWtEZXRlY3Rpb24iLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTWVtb3J5LnNldFByZXNzdXJlTm90aWZpY2F0aW9uc1N1cHByZXNzZWQiLFt7Im5hbWUiOiJzdXBwcmVzc2VkIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk1lbW9yeS5zaW11bGF0ZVByZXNzdXJlTm90aWZpY2F0aW9uIixbeyJuYW1lIjoibGV2ZWwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJNZW1vcnkuc3RhcnRTYW1wbGluZyIsW3sibmFtZSI6InNhbXBsaW5nSW50ZXJ2YWwiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InN1cHByZXNzUmFuZG9tbmVzcyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk1lbW9yeS5zdG9wU2FtcGxpbmciLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTWVtb3J5LmdldEFsbFRpbWVTYW1wbGluZ1Byb2ZpbGUiLFtdLFsicHJvZmlsZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTWVtb3J5LmdldEJyb3dzZXJTYW1wbGluZ1Byb2ZpbGUiLFtdLFsicHJvZmlsZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTWVtb3J5LmdldFNhbXBsaW5nUHJvZmlsZSIsW10sWyJwcm9maWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJOZXR3b3JrLkVycm9yUmVhc29uIix7RmFpbGVkOiJGYWlsZWQiLEFib3J0ZWQ6IkFib3J0ZWQiLFRpbWVkT3V0OiJUaW1lZE91dCIsQWNjZXNzRGVuaWVkOiJBY2Nlc3NEZW5pZWQiLENvbm5lY3Rpb25DbG9zZWQ6IkNvbm5lY3Rpb25DbG9zZWQiLENvbm5lY3Rpb25SZXNldDoiQ29ubmVjdGlvblJlc2V0IixDb25uZWN0aW9uUmVmdXNlZDoiQ29ubmVjdGlvblJlZnVzZWQiLENvbm5lY3Rpb25BYm9ydGVkOiJDb25uZWN0aW9uQWJvcnRlZCIsQ29ubmVjdGlvbkZhaWxlZDoiQ29ubmVjdGlvbkZhaWxlZCIsTmFtZU5vdFJlc29sdmVkOiJOYW1lTm90UmVzb2x2ZWQiLEludGVybmV0RGlzY29ubmVjdGVkOiJJbnRlcm5ldERpc2Nvbm5lY3RlZCIsQWRkcmVzc1VucmVhY2hhYmxlOiJBZGRyZXNzVW5yZWFjaGFibGUiLEJsb2NrZWRCeUNsaWVudDoiQmxvY2tlZEJ5Q2xpZW50IixCbG9ja2VkQnlSZXNwb25zZToiQmxvY2tlZEJ5UmVzcG9uc2UifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk5ldHdvcmsuQ29ubmVjdGlvblR5cGUiLHtOb25lOiJub25lIixDZWxsdWxhcjJnOiJjZWxsdWxhcjJnIixDZWxsdWxhcjNnOiJjZWxsdWxhcjNnIixDZWxsdWxhcjRnOiJjZWxsdWxhcjRnIixCbHVldG9vdGg6ImJsdWV0b290aCIsRXRoZXJuZXQ6ImV0aGVybmV0IixXaWZpOiJ3aWZpIixXaW1heDoid2ltYXgiLE90aGVyOiJvdGhlciJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiTmV0d29yay5Db29raWVTYW1lU2l0ZSIse1N0cmljdDoiU3RyaWN0IixMYXg6IkxheCJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiTmV0d29yay5SZXNvdXJjZVByaW9yaXR5Iix7VmVyeUxvdzoiVmVyeUxvdyIsTG93OiJMb3ciLE1lZGl1bToiTWVkaXVtIixIaWdoOiJIaWdoIixWZXJ5SGlnaDoiVmVyeUhpZ2gifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk5ldHdvcmsuUmVxdWVzdFJlZmVycmVyUG9saWN5Iix7VW5zYWZlVXJsOiJ1bnNhZmUtdXJsIixOb1JlZmVycmVyV2hlbkRvd25ncmFkZToibm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUiLE5vUmVmZXJyZXI6Im5vLXJlZmVycmVyIixPcmlnaW46Im9yaWdpbiIsT3JpZ2luV2hlbkNyb3NzT3JpZ2luOiJvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iLFNhbWVPcmlnaW46InNhbWUtb3JpZ2luIixTdHJpY3RPcmlnaW46InN0cmljdC1vcmlnaW4iLFN0cmljdE9yaWdpbldoZW5Dcm9zc09yaWdpbjoic3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbiJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiTmV0d29yay5DZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUNvbXBsaWFuY2UiLHtVbmtub3duOiJ1bmtub3duIixOb3RDb21wbGlhbnQ6Im5vdC1jb21wbGlhbnQiLENvbXBsaWFudDoiY29tcGxpYW50In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJOZXR3b3JrLkJsb2NrZWRSZWFzb24iLHtPdGhlcjoib3RoZXIiLENzcDoiY3NwIixNaXhlZENvbnRlbnQ6Im1peGVkLWNvbnRlbnQiLE9yaWdpbjoib3JpZ2luIixJbnNwZWN0b3I6Imluc3BlY3RvciIsU3VicmVzb3VyY2VGaWx0ZXI6InN1YnJlc291cmNlLWZpbHRlciIsQ29udGVudFR5cGU6ImNvbnRlbnQtdHlwZSIsQ29sbGFwc2VkQnlDbGllbnQ6ImNvbGxhcHNlZC1ieS1jbGllbnQifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk5ldHdvcmsuSW5pdGlhdG9yVHlwZSIse1BhcnNlcjoicGFyc2VyIixTY3JpcHQ6InNjcmlwdCIsUHJlbG9hZDoicHJlbG9hZCIsU2lnbmVkRXhjaGFuZ2U6IlNpZ25lZEV4Y2hhbmdlIixPdGhlcjoib3RoZXIifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk5ldHdvcmsuQXV0aENoYWxsZW5nZVNvdXJjZSIse1NlcnZlcjoiU2VydmVyIixQcm94eToiUHJveHkifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk5ldHdvcmsuQXV0aENoYWxsZW5nZVJlc3BvbnNlUmVzcG9uc2UiLHtEZWZhdWx0OiJEZWZhdWx0IixDYW5jZWxBdXRoOiJDYW5jZWxBdXRoIixQcm92aWRlQ3JlZGVudGlhbHM6IlByb3ZpZGVDcmVkZW50aWFscyJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiTmV0d29yay5JbnRlcmNlcHRpb25TdGFnZSIse1JlcXVlc3Q6IlJlcXVlc3QiLEhlYWRlcnNSZWNlaXZlZDoiSGVhZGVyc1JlY2VpdmVkIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJOZXR3b3JrLlNpZ25lZEV4Y2hhbmdlRXJyb3JGaWVsZCIse1NpZ25hdHVyZVNpZzoic2lnbmF0dXJlU2lnIixTaWduYXR1cmVJbnRlZ3JpdHk6InNpZ25hdHVyZUludGVncml0eSIsU2lnbmF0dXJlQ2VydFVybDoic2lnbmF0dXJlQ2VydFVybCIsU2lnbmF0dXJlQ2VydFNoYTI1Njoic2lnbmF0dXJlQ2VydFNoYTI1NiIsU2lnbmF0dXJlVmFsaWRpdHlVcmw6InNpZ25hdHVyZVZhbGlkaXR5VXJsIixTaWduYXR1cmVUaW1lc3RhbXBzOiJzaWduYXR1cmVUaW1lc3RhbXBzIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5kYXRhUmVjZWl2ZWQiLFsicmVxdWVzdElkIiwidGltZXN0YW1wIiwiZGF0YUxlbmd0aCIsImVuY29kZWREYXRhTGVuZ3RoIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCIsWyJyZXF1ZXN0SWQiLCJ0aW1lc3RhbXAiLCJldmVudE5hbWUiLCJldmVudElkIiwiZGF0YSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIk5ldHdvcmsubG9hZGluZ0ZhaWxlZCIsWyJyZXF1ZXN0SWQiLCJ0aW1lc3RhbXAiLCJ0eXBlIiwiZXJyb3JUZXh0IiwiY2FuY2VsZWQiLCJibG9ja2VkUmVhc29uIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5sb2FkaW5nRmluaXNoZWQiLFsicmVxdWVzdElkIiwidGltZXN0YW1wIiwiZW5jb2RlZERhdGFMZW5ndGgiLCJzaG91bGRSZXBvcnRDb3JiQmxvY2tpbmciXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJOZXR3b3JrLnJlcXVlc3RJbnRlcmNlcHRlZCIsWyJpbnRlcmNlcHRpb25JZCIsInJlcXVlc3QiLCJmcmFtZUlkIiwicmVzb3VyY2VUeXBlIiwiaXNOYXZpZ2F0aW9uUmVxdWVzdCIsImlzRG93bmxvYWQiLCJyZWRpcmVjdFVybCIsImF1dGhDaGFsbGVuZ2UiLCJyZXNwb25zZUVycm9yUmVhc29uIiwicmVzcG9uc2VTdGF0dXNDb2RlIiwicmVzcG9uc2VIZWFkZXJzIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlIixbInJlcXVlc3RJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIk5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQiLFsicmVxdWVzdElkIiwibG9hZGVySWQiLCJkb2N1bWVudFVSTCIsInJlcXVlc3QiLCJ0aW1lc3RhbXAiLCJ3YWxsVGltZSIsImluaXRpYXRvciIsInJlZGlyZWN0UmVzcG9uc2UiLCJ0eXBlIiwiZnJhbWVJZCIsImhhc1VzZXJHZXN0dXJlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eSIsWyJyZXF1ZXN0SWQiLCJuZXdQcmlvcml0eSIsInRpbWVzdGFtcCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIk5ldHdvcmsuc2lnbmVkRXhjaGFuZ2VSZWNlaXZlZCIsWyJyZXF1ZXN0SWQiLCJpbmZvIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay5yZXNwb25zZVJlY2VpdmVkIixbInJlcXVlc3RJZCIsImxvYWRlcklkIiwidGltZXN0YW1wIiwidHlwZSIsInJlc3BvbnNlIiwiZnJhbWVJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIk5ldHdvcmsud2ViU29ja2V0Q2xvc2VkIixbInJlcXVlc3RJZCIsInRpbWVzdGFtcCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIk5ldHdvcmsud2ViU29ja2V0Q3JlYXRlZCIsWyJyZXF1ZXN0SWQiLCJ1cmwiLCJpbml0aWF0b3IiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJOZXR3b3JrLndlYlNvY2tldEZyYW1lRXJyb3IiLFsicmVxdWVzdElkIiwidGltZXN0YW1wIiwiZXJyb3JNZXNzYWdlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkIixbInJlcXVlc3RJZCIsInRpbWVzdGFtcCIsInJlc3BvbnNlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiTmV0d29yay53ZWJTb2NrZXRGcmFtZVNlbnQiLFsicmVxdWVzdElkIiwidGltZXN0YW1wIiwicmVzcG9uc2UiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJOZXR3b3JrLndlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWQiLFsicmVxdWVzdElkIiwidGltZXN0YW1wIiwicmVzcG9uc2UiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCIsWyJyZXF1ZXN0SWQiLCJ0aW1lc3RhbXAiLCJ3YWxsVGltZSIsInJlcXVlc3QiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuY2FuQ2xlYXJCcm93c2VyQ2FjaGUiLFtdLFsicmVzdWx0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLmNhbkNsZWFyQnJvd3NlckNvb2tpZXMiLFtdLFsicmVzdWx0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLmNhbkVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyIsW10sWyJyZXN1bHQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuY2xlYXJCcm93c2VyQ2FjaGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5jbGVhckJyb3dzZXJDb29raWVzIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuY29udGludWVJbnRlcmNlcHRlZFJlcXVlc3QiLFt7Im5hbWUiOiJpbnRlcmNlcHRpb25JZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImVycm9yUmVhc29uIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJyYXdSZXNwb25zZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtZXRob2QiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBvc3REYXRhIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJoZWFkZXJzIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJhdXRoQ2hhbGxlbmdlUmVzcG9uc2UiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuZGVsZXRlQ29va2llcyIsW3sibmFtZSI6Im5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ1cmwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImRvbWFpbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicGF0aCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuZW11bGF0ZU5ldHdvcmtDb25kaXRpb25zIixbeyJuYW1lIjoib2ZmbGluZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJsYXRlbmN5IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZG93bmxvYWRUaHJvdWdocHV0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidXBsb2FkVGhyb3VnaHB1dCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImNvbm5lY3Rpb25UeXBlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLmVuYWJsZSIsW3sibmFtZSI6Im1heFRvdGFsQnVmZmVyU2l6ZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoibWF4UmVzb3VyY2VCdWZmZXJTaXplIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtYXhQb3N0RGF0YVNpemUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuZ2V0QWxsQ29va2llcyIsW10sWyJjb29raWVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLmdldENlcnRpZmljYXRlIixbeyJuYW1lIjoib3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsidGFibGVOYW1lcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5nZXRDb29raWVzIixbeyJuYW1lIjoidXJscyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6dHJ1ZX1dLFsiY29va2llcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5nZXRSZXNwb25zZUJvZHkiLFt7Im5hbWUiOiJyZXF1ZXN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJib2R5IiwiYmFzZTY0RW5jb2RlZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5nZXRSZXF1ZXN0UG9zdERhdGEiLFt7Im5hbWUiOiJyZXF1ZXN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJwb3N0RGF0YSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiTmV0d29yay5nZXRSZXNwb25zZUJvZHlGb3JJbnRlcmNlcHRpb24iLFt7Im5hbWUiOiJpbnRlcmNlcHRpb25JZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbImJvZHkiLCJiYXNlNjRFbmNvZGVkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnRha2VSZXNwb25zZUJvZHlGb3JJbnRlcmNlcHRpb25Bc1N0cmVhbSIsW3sibmFtZSI6ImludGVyY2VwdGlvbklkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsic3RyZWFtIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnJlcGxheVhIUiIsW3sibmFtZSI6InJlcXVlc3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2VhcmNoSW5SZXNwb25zZUJvZHkiLFt7Im5hbWUiOiJyZXF1ZXN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJxdWVyeSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImNhc2VTZW5zaXRpdmUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJpc1JlZ2V4IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsicmVzdWx0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnNldEJsb2NrZWRVUkxzIixbeyJuYW1lIjoidXJscyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2V0QnlwYXNzU2VydmljZVdvcmtlciIsW3sibmFtZSI6ImJ5cGFzcyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnNldENhY2hlRGlzYWJsZWQiLFt7Im5hbWUiOiJjYWNoZURpc2FibGVkIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2V0Q29va2llIixbeyJuYW1lIjoibmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InZhbHVlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkb21haW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBhdGgiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNlY3VyZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Imh0dHBPbmx5IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2FtZVNpdGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImV4cGlyZXMiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbInN1Y2Nlc3MiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2V0Q29va2llcyIsW3sibmFtZSI6ImNvb2tpZXMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnNldERhdGFTaXplTGltaXRzRm9yVGVzdCIsW3sibmFtZSI6Im1heFRvdGFsU2l6ZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im1heFJlc291cmNlU2l6ZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2V0RXh0cmFIVFRQSGVhZGVycyIsW3sibmFtZSI6ImhlYWRlcnMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJOZXR3b3JrLnNldFJlcXVlc3RJbnRlcmNlcHRpb24iLFt7Im5hbWUiOiJwYXR0ZXJucyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk5ldHdvcmsuc2V0VXNlckFnZW50T3ZlcnJpZGUiLFt7Im5hbWUiOiJ1c2VyQWdlbnQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJhY2NlcHRMYW5ndWFnZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicGxhdGZvcm0iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIk92ZXJsYXkuSW5zcGVjdE1vZGUiLHtTZWFyY2hGb3JOb2RlOiJzZWFyY2hGb3JOb2RlIixTZWFyY2hGb3JVQVNoYWRvd0RPTToic2VhcmNoRm9yVUFTaGFkb3dET00iLE5vbmU6Im5vbmUifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJPdmVybGF5Lmluc3BlY3ROb2RlUmVxdWVzdGVkIixbImJhY2tlbmROb2RlSWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJPdmVybGF5Lm5vZGVIaWdobGlnaHRSZXF1ZXN0ZWQiLFsibm9kZUlkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiT3ZlcmxheS5zY3JlZW5zaG90UmVxdWVzdGVkIixbInZpZXdwb3J0Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJPdmVybGF5LmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5nZXRIaWdobGlnaHRPYmplY3RGb3JUZXN0IixbeyJuYW1lIjoibm9kZUlkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiaGlnaGxpZ2h0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJPdmVybGF5LmhpZGVIaWdobGlnaHQiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5oaWdobGlnaHRGcmFtZSIsW3sibmFtZSI6ImZyYW1lSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJjb250ZW50Q29sb3IiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImNvbnRlbnRPdXRsaW5lQ29sb3IiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk92ZXJsYXkuaGlnaGxpZ2h0Tm9kZSIsW3sibmFtZSI6ImhpZ2hsaWdodENvbmZpZyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYmFja2VuZE5vZGVJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk92ZXJsYXkuaGlnaGxpZ2h0UXVhZCIsW3sibmFtZSI6InF1YWQiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJjb2xvciIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib3V0bGluZUNvbG9yIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJPdmVybGF5LmhpZ2hsaWdodFJlY3QiLFt7Im5hbWUiOiJ4IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoieSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6IndpZHRoIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiaGVpZ2h0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiY29sb3IiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im91dGxpbmVDb2xvciIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5zZXRJbnNwZWN0TW9kZSIsW3sibmFtZSI6Im1vZGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJoaWdobGlnaHRDb25maWciLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk92ZXJsYXkuc2V0UGF1c2VkSW5EZWJ1Z2dlck1lc3NhZ2UiLFt7Im5hbWUiOiJtZXNzYWdlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJPdmVybGF5LnNldFNob3dEZWJ1Z0JvcmRlcnMiLFt7Im5hbWUiOiJzaG93IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk92ZXJsYXkuc2V0U2hvd0ZQU0NvdW50ZXIiLFt7Im5hbWUiOiJzaG93IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIk92ZXJsYXkuc2V0U2hvd1BhaW50UmVjdHMiLFt7Im5hbWUiOiJyZXN1bHQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5zZXRTaG93U2Nyb2xsQm90dGxlbmVja1JlY3RzIixbeyJuYW1lIjoic2hvdyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJPdmVybGF5LnNldFNob3dWaWV3cG9ydFNpemVPblJlc2l6ZSIsW3sibmFtZSI6InNob3ciLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiT3ZlcmxheS5zZXRTdXNwZW5kZWQiLFt7Im5hbWUiOiJzdXNwZW5kZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiUGFnZS5SZXNvdXJjZVR5cGUiLHtEb2N1bWVudDoiRG9jdW1lbnQiLFN0eWxlc2hlZXQ6IlN0eWxlc2hlZXQiLEltYWdlOiJJbWFnZSIsTWVkaWE6Ik1lZGlhIixGb250OiJGb250IixTY3JpcHQ6IlNjcmlwdCIsVGV4dFRyYWNrOiJUZXh0VHJhY2siLFhIUjoiWEhSIixGZXRjaDoiRmV0Y2giLEV2ZW50U291cmNlOiJFdmVudFNvdXJjZSIsV2ViU29ja2V0OiJXZWJTb2NrZXQiLE1hbmlmZXN0OiJNYW5pZmVzdCIsU2lnbmVkRXhjaGFuZ2U6IlNpZ25lZEV4Y2hhbmdlIixQaW5nOiJQaW5nIixDU1BWaW9sYXRpb25SZXBvcnQ6IkNTUFZpb2xhdGlvblJlcG9ydCIsT3RoZXI6Ik90aGVyIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJQYWdlLlRyYW5zaXRpb25UeXBlIix7TGluazoibGluayIsVHlwZWQ6InR5cGVkIixBdXRvX2Jvb2ttYXJrOiJhdXRvX2Jvb2ttYXJrIixBdXRvX3N1YmZyYW1lOiJhdXRvX3N1YmZyYW1lIixNYW51YWxfc3ViZnJhbWU6Im1hbnVhbF9zdWJmcmFtZSIsR2VuZXJhdGVkOiJnZW5lcmF0ZWQiLEF1dG9fdG9wbGV2ZWw6ImF1dG9fdG9wbGV2ZWwiLEZvcm1fc3VibWl0OiJmb3JtX3N1Ym1pdCIsUmVsb2FkOiJyZWxvYWQiLEtleXdvcmQ6ImtleXdvcmQiLEtleXdvcmRfZ2VuZXJhdGVkOiJrZXl3b3JkX2dlbmVyYXRlZCIsT3RoZXI6Im90aGVyIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJQYWdlLkRpYWxvZ1R5cGUiLHtBbGVydDoiYWxlcnQiLENvbmZpcm06ImNvbmZpcm0iLFByb21wdDoicHJvbXB0IixCZWZvcmV1bmxvYWQ6ImJlZm9yZXVubG9hZCJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuZG9tQ29udGVudEV2ZW50RmlyZWQiLFsidGltZXN0YW1wIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5mcmFtZUF0dGFjaGVkIixbImZyYW1lSWQiLCJwYXJlbnRGcmFtZUlkIiwic3RhY2siXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLmZyYW1lQ2xlYXJlZFNjaGVkdWxlZE5hdmlnYXRpb24iLFsiZnJhbWVJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuZnJhbWVEZXRhY2hlZCIsWyJmcmFtZUlkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5mcmFtZU5hdmlnYXRlZCIsWyJmcmFtZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuZnJhbWVSZXNpemVkIixbXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbiIsWyJmcmFtZUlkIiwiZGVsYXkiLCJyZWFzb24iLCJ1cmwiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmciLFsiZnJhbWVJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZyIsWyJmcmFtZUlkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5pbnRlcnN0aXRpYWxIaWRkZW4iLFtdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuaW50ZXJzdGl0aWFsU2hvd24iLFtdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlBhZ2UuamF2YXNjcmlwdERpYWxvZ0Nsb3NlZCIsWyJyZXN1bHQiLCJ1c2VySW5wdXQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLmphdmFzY3JpcHREaWFsb2dPcGVuaW5nIixbInVybCIsIm1lc3NhZ2UiLCJ0eXBlIiwiaGFzQnJvd3NlckhhbmRsZXIiLCJkZWZhdWx0UHJvbXB0Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5saWZlY3ljbGVFdmVudCIsWyJmcmFtZUlkIiwibG9hZGVySWQiLCJuYW1lIiwidGltZXN0YW1wIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5sb2FkRXZlbnRGaXJlZCIsWyJ0aW1lc3RhbXAiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50IixbImZyYW1lSWQiLCJ1cmwiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLnNjcmVlbmNhc3RGcmFtZSIsWyJkYXRhIiwibWV0YWRhdGEiLCJzZXNzaW9uSWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQYWdlLnNjcmVlbmNhc3RWaXNpYmlsaXR5Q2hhbmdlZCIsWyJ2aXNpYmxlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS53aW5kb3dPcGVuIixbInVybCIsIndpbmRvd05hbWUiLCJ3aW5kb3dGZWF0dXJlcyIsInVzZXJHZXN0dXJlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQiLFsidXJsIiwiZGF0YSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25Mb2FkIixbeyJuYW1lIjoic2NyaXB0U291cmNlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiaWRlbnRpZmllciJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCIsW3sibmFtZSI6InNvdXJjZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbImlkZW50aWZpZXIiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UuYnJpbmdUb0Zyb250IixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UuY2FwdHVyZVNjcmVlbnNob3QiLFt7Im5hbWUiOiJmb3JtYXQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InF1YWxpdHkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImNsaXAiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImZyb21TdXJmYWNlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsiZGF0YSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5jbGVhckRldmljZU1ldHJpY3NPdmVycmlkZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmNsZWFyRGV2aWNlT3JpZW50YXRpb25PdmVycmlkZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmNsZWFyR2VvbG9jYXRpb25PdmVycmlkZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmNyZWF0ZUlzb2xhdGVkV29ybGQiLFt7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoid29ybGROYW1lIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJncmFudFVuaXZlcmFsQWNjZXNzIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsiZXhlY3V0aW9uQ29udGV4dElkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmRlbGV0ZUNvb2tpZSIsW3sibmFtZSI6ImNvb2tpZU5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ1cmwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5nZXRBcHBNYW5pZmVzdCIsW10sWyJ1cmwiLCJlcnJvcnMiLCJkYXRhIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmdldENvb2tpZXMiLFtdLFsiY29va2llcyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5nZXRGcmFtZVRyZWUiLFtdLFsiZnJhbWVUcmVlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmdldExheW91dE1ldHJpY3MiLFtdLFsibGF5b3V0Vmlld3BvcnQiLCJ2aXN1YWxWaWV3cG9ydCIsImNvbnRlbnRTaXplIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5IixbXSxbImN1cnJlbnRJbmRleCIsImVudHJpZXMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UuZ2V0UmVzb3VyY2VDb250ZW50IixbeyJuYW1lIjoiZnJhbWVJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InVybCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbImNvbnRlbnQiLCJiYXNlNjRFbmNvZGVkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmdldFJlc291cmNlVHJlZSIsW10sWyJmcmFtZVRyZWUiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UuaGFuZGxlSmF2YVNjcmlwdERpYWxvZyIsW3sibmFtZSI6ImFjY2VwdCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJwcm9tcHRUZXh0IiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLm5hdmlnYXRlIixbeyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoicmVmZXJyZXIiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRyYW5zaXRpb25UeXBlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sWyJmcmFtZUlkIiwibG9hZGVySWQiLCJlcnJvclRleHQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UubmF2aWdhdGVUb0hpc3RvcnlFbnRyeSIsW3sibmFtZSI6ImVudHJ5SWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnByaW50VG9QREYiLFt7Im5hbWUiOiJsYW5kc2NhcGUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkaXNwbGF5SGVhZGVyRm9vdGVyIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicHJpbnRCYWNrZ3JvdW5kIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2NhbGUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBhcGVyV2lkdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBhcGVySGVpZ2h0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtYXJnaW5Ub3AiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im1hcmdpbkJvdHRvbSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoibWFyZ2luTGVmdCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoibWFyZ2luUmlnaHQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InBhZ2VSYW5nZXMiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Imlnbm9yZUludmFsaWRQYWdlUmFuZ2VzIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaGVhZGVyVGVtcGxhdGUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImZvb3RlclRlbXBsYXRlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJwcmVmZXJDU1NQYWdlU2l6ZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbImRhdGEiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UucmVsb2FkIixbeyJuYW1lIjoiaWdub3JlQ2FjaGUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJzY3JpcHRUb0V2YWx1YXRlT25Mb2FkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbkxvYWQiLFt7Im5hbWUiOiJpZGVudGlmaWVyIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCIsW3sibmFtZSI6ImlkZW50aWZpZXIiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnJlcXVlc3RBcHBCYW5uZXIiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zY3JlZW5jYXN0RnJhbWVBY2siLFt7Im5hbWUiOiJzZXNzaW9uSWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnNlYXJjaEluUmVzb3VyY2UiLFt7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoicXVlcnkiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJjYXNlU2Vuc2l0aXZlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaXNSZWdleCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXRBZEJsb2NraW5nRW5hYmxlZCIsW3sibmFtZSI6ImVuYWJsZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXRCeXBhc3NDU1AiLFt7Im5hbWUiOiJlbmFibGVkIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc2V0RGV2aWNlTWV0cmljc092ZXJyaWRlIixbeyJuYW1lIjoid2lkdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJoZWlnaHQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkZXZpY2VTY2FsZUZhY3RvciIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im1vYmlsZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJzY2FsZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2NyZWVuV2lkdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNjcmVlbkhlaWdodCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicG9zaXRpb25YIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJwb3NpdGlvblkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImRvbnRTZXRWaXNpYmxlU2l6ZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNjcmVlbk9yaWVudGF0aW9uIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ2aWV3cG9ydCIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXREZXZpY2VPcmllbnRhdGlvbk92ZXJyaWRlIixbeyJuYW1lIjoiYWxwaGEiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJiZXRhIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZ2FtbWEiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnNldEZvbnRGYW1pbGllcyIsW3sibmFtZSI6ImZvbnRGYW1pbGllcyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc2V0Rm9udFNpemVzIixbeyJuYW1lIjoiZm9udFNpemVzIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXREb2N1bWVudENvbnRlbnQiLFt7Im5hbWUiOiJmcmFtZUlkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiaHRtbCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc2V0RG93bmxvYWRCZWhhdmlvciIsW3sibmFtZSI6ImJlaGF2aW9yIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZG93bmxvYWRQYXRoIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnNldEdlb2xvY2F0aW9uT3ZlcnJpZGUiLFt7Im5hbWUiOiJsYXRpdHVkZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoibG9uZ2l0dWRlIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJhY2N1cmFjeSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXRMaWZlY3ljbGVFdmVudHNFbmFibGVkIixbeyJuYW1lIjoiZW5hYmxlZCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCIsW3sibmFtZSI6ImVuYWJsZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiY29uZmlndXJhdGlvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zdGFydFNjcmVlbmNhc3QiLFt7Im5hbWUiOiJmb3JtYXQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InF1YWxpdHkiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6Im1heFdpZHRoIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJtYXhIZWlnaHQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImV2ZXJ5TnRoRnJhbWUiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc3RvcExvYWRpbmciLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5jcmFzaCIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQYWdlLmNsb3NlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc2V0V2ViTGlmZWN5Y2xlU3RhdGUiLFt7Im5hbWUiOiJzdGF0ZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2Uuc3RvcFNjcmVlbmNhc3QiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5zZXRQcm9kdWNlQ29tcGlsYXRpb25DYWNoZSIsW3sibmFtZSI6ImVuYWJsZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGFnZS5hZGRDb21waWxhdGlvbkNhY2hlIixbeyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiZGF0YSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlBhZ2UuY2xlYXJDb21waWxhdGlvbkNhY2hlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJQZXJmb3JtYW5jZS5tZXRyaWNzIixbIm1ldHJpY3MiLCJ0aXRsZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGVyZm9ybWFuY2UuZGlzYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQZXJmb3JtYW5jZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUGVyZm9ybWFuY2UuZ2V0TWV0cmljcyIsW10sWyJtZXRyaWNzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJTZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlIix7QmxvY2thYmxlOiJibG9ja2FibGUiLE9wdGlvbmFsbHlCbG9ja2FibGU6Im9wdGlvbmFsbHktYmxvY2thYmxlIixOb25lOiJub25lIn0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJTZWN1cml0eS5TZWN1cml0eVN0YXRlIix7VW5rbm93bjoidW5rbm93biIsTmV1dHJhbDoibmV1dHJhbCIsSW5zZWN1cmU6Imluc2VjdXJlIixTZWN1cmU6InNlY3VyZSIsSW5mbzoiaW5mbyJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiU2VjdXJpdHkuQ2VydGlmaWNhdGVFcnJvckFjdGlvbiIse0NvbnRpbnVlOiJjb250aW51ZSIsQ2FuY2VsOiJjYW5jZWwifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJTZWN1cml0eS5jZXJ0aWZpY2F0ZUVycm9yIixbImV2ZW50SWQiLCJlcnJvclR5cGUiLCJyZXF1ZXN0VVJMIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiU2VjdXJpdHkuc2VjdXJpdHlTdGF0ZUNoYW5nZWQiLFsic2VjdXJpdHlTdGF0ZSIsInNjaGVtZUlzQ3J5cHRvZ3JhcGhpYyIsImV4cGxhbmF0aW9ucyIsImluc2VjdXJlQ29udGVudFN0YXR1cyIsInN1bW1hcnkiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlY3VyaXR5LmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VjdXJpdHkuZW5hYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlY3VyaXR5LnNldElnbm9yZUNlcnRpZmljYXRlRXJyb3JzIixbeyJuYW1lIjoiaWdub3JlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlY3VyaXR5LmhhbmRsZUNlcnRpZmljYXRlRXJyb3IiLFt7Im5hbWUiOiJldmVudElkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiYWN0aW9uIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VjdXJpdHkuc2V0T3ZlcnJpZGVDZXJ0aWZpY2F0ZUVycm9ycyIsW3sibmFtZSI6Im92ZXJyaWRlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25SdW5uaW5nU3RhdHVzIix7U3RvcHBlZDoic3RvcHBlZCIsU3RhcnRpbmc6InN0YXJ0aW5nIixSdW5uaW5nOiJydW5uaW5nIixTdG9wcGluZzoic3RvcHBpbmcifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25TdGF0dXMiLHtOZXc6Im5ldyIsSW5zdGFsbGluZzoiaW5zdGFsbGluZyIsSW5zdGFsbGVkOiJpbnN0YWxsZWQiLEFjdGl2YXRpbmc6ImFjdGl2YXRpbmciLEFjdGl2YXRlZDoiYWN0aXZhdGVkIixSZWR1bmRhbnQ6InJlZHVuZGFudCJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlNlcnZpY2VXb3JrZXIud29ya2VyRXJyb3JSZXBvcnRlZCIsWyJlcnJvck1lc3NhZ2UiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJTZXJ2aWNlV29ya2VyLndvcmtlclJlZ2lzdHJhdGlvblVwZGF0ZWQiLFsicmVnaXN0cmF0aW9ucyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlNlcnZpY2VXb3JrZXIud29ya2VyVmVyc2lvblVwZGF0ZWQiLFsidmVyc2lvbnMiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlcnZpY2VXb3JrZXIuZGVsaXZlclB1c2hNZXNzYWdlIixbeyJuYW1lIjoib3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoicmVnaXN0cmF0aW9uSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJkYXRhIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlcnZpY2VXb3JrZXIuZGlzcGF0Y2hTeW5jRXZlbnQiLFt7Im5hbWUiOiJvcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJyZWdpc3RyYXRpb25JZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InRhZyIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Imxhc3RDaGFuY2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5pbnNwZWN0V29ya2VyIixbeyJuYW1lIjoidmVyc2lvbklkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5zZXRGb3JjZVVwZGF0ZU9uUGFnZUxvYWQiLFt7Im5hbWUiOiJmb3JjZVVwZGF0ZU9uUGFnZUxvYWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5za2lwV2FpdGluZyIsW3sibmFtZSI6InNjb3BlVVJMIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5zdGFydFdvcmtlciIsW3sibmFtZSI6InNjb3BlVVJMIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU2VydmljZVdvcmtlci5zdG9wQWxsV29ya2VycyIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJTZXJ2aWNlV29ya2VyLnN0b3BXb3JrZXIiLFt7Im5hbWUiOiJ2ZXJzaW9uSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJTZXJ2aWNlV29ya2VyLnVucmVnaXN0ZXIiLFt7Im5hbWUiOiJzY29wZVVSTCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlNlcnZpY2VXb3JrZXIudXBkYXRlUmVnaXN0cmF0aW9uIixbeyJuYW1lIjoic2NvcGVVUkwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJTdG9yYWdlLlN0b3JhZ2VUeXBlIix7QXBwY2FjaGU6ImFwcGNhY2hlIixDb29raWVzOiJjb29raWVzIixGaWxlX3N5c3RlbXM6ImZpbGVfc3lzdGVtcyIsSW5kZXhlZGRiOiJpbmRleGVkZGIiLExvY2FsX3N0b3JhZ2U6ImxvY2FsX3N0b3JhZ2UiLFNoYWRlcl9jYWNoZToic2hhZGVyX2NhY2hlIixXZWJzcWw6IndlYnNxbCIsU2VydmljZV93b3JrZXJzOiJzZXJ2aWNlX3dvcmtlcnMiLENhY2hlX3N0b3JhZ2U6ImNhY2hlX3N0b3JhZ2UiLEFsbDoiYWxsIixPdGhlcjoib3RoZXIifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJTdG9yYWdlLmNhY2hlU3RvcmFnZUNvbnRlbnRVcGRhdGVkIixbIm9yaWdpbiIsImNhY2hlTmFtZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlN0b3JhZ2UuY2FjaGVTdG9yYWdlTGlzdFVwZGF0ZWQiLFsib3JpZ2luIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiU3RvcmFnZS5pbmRleGVkREJDb250ZW50VXBkYXRlZCIsWyJvcmlnaW4iLCJkYXRhYmFzZU5hbWUiLCJvYmplY3RTdG9yZU5hbWUiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJTdG9yYWdlLmluZGV4ZWREQkxpc3RVcGRhdGVkIixbIm9yaWdpbiJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU3RvcmFnZS5jbGVhckRhdGFGb3JPcmlnaW4iLFt7Im5hbWUiOiJvcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJzdG9yYWdlVHlwZXMiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJTdG9yYWdlLmdldFVzYWdlQW5kUXVvdGEiLFt7Im5hbWUiOiJvcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJ1c2FnZSIsInF1b3RhIiwidXNhZ2VCcmVha2Rvd24iXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlN0b3JhZ2UudHJhY2tDYWNoZVN0b3JhZ2VGb3JPcmlnaW4iLFt7Im5hbWUiOiJvcmlnaW4iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJTdG9yYWdlLnRyYWNrSW5kZXhlZERCRm9yT3JpZ2luIixbeyJuYW1lIjoib3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU3RvcmFnZS51bnRyYWNrQ2FjaGVTdG9yYWdlRm9yT3JpZ2luIixbeyJuYW1lIjoib3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU3RvcmFnZS51bnRyYWNrSW5kZXhlZERCRm9yT3JpZ2luIixbeyJuYW1lIjoib3JpZ2luIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiU3lzdGVtSW5mby5nZXRJbmZvIixbXSxbImdwdSIsIm1vZGVsTmFtZSIsIm1vZGVsVmVyc2lvbiIsImNvbW1hbmRMaW5lIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQiLFsic2Vzc2lvbklkIiwidGFyZ2V0SW5mbyIsIndhaXRpbmdGb3JEZWJ1Z2dlciJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlRhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQiLFsic2Vzc2lvbklkIiwidGFyZ2V0SWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJUYXJnZXQucmVjZWl2ZWRNZXNzYWdlRnJvbVRhcmdldCIsWyJzZXNzaW9uSWQiLCJtZXNzYWdlIiwidGFyZ2V0SWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJUYXJnZXQudGFyZ2V0Q3JlYXRlZCIsWyJ0YXJnZXRJbmZvIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiVGFyZ2V0LnRhcmdldERlc3Ryb3llZCIsWyJ0YXJnZXRJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlRhcmdldC50YXJnZXRDcmFzaGVkIixbInRhcmdldElkIiwic3RhdHVzIiwiZXJyb3JDb2RlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiVGFyZ2V0LnRhcmdldEluZm9DaGFuZ2VkIixbInRhcmdldEluZm8iXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRhcmdldC5hY3RpdmF0ZVRhcmdldCIsW3sibmFtZSI6InRhcmdldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGFyZ2V0LmF0dGFjaFRvVGFyZ2V0IixbeyJuYW1lIjoidGFyZ2V0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJmbGF0dGVuIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsic2Vzc2lvbklkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuYXR0YWNoVG9Ccm93c2VyVGFyZ2V0IixbXSxbInNlc3Npb25JZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGFyZ2V0LmNsb3NlVGFyZ2V0IixbeyJuYW1lIjoidGFyZ2V0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJzdWNjZXNzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuZXhwb3NlRGV2VG9vbHNQcm90b2NvbCIsW3sibmFtZSI6InRhcmdldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiYmluZGluZ05hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRhcmdldC5jcmVhdGVCcm93c2VyQ29udGV4dCIsW10sWyJicm93c2VyQ29udGV4dElkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuZ2V0QnJvd3NlckNvbnRleHRzIixbXSxbImJyb3dzZXJDb250ZXh0SWRzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuY3JlYXRlVGFyZ2V0IixbeyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoid2lkdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImhlaWdodCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYnJvd3NlckNvbnRleHRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZW5hYmxlQmVnaW5GcmFtZUNvbnRyb2wiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sWyJ0YXJnZXRJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGFyZ2V0LmRldGFjaEZyb21UYXJnZXQiLFt7Im5hbWUiOiJzZXNzaW9uSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRhcmdldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuZGlzcG9zZUJyb3dzZXJDb250ZXh0IixbeyJuYW1lIjoiYnJvd3NlckNvbnRleHRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRhcmdldC5nZXRUYXJnZXRJbmZvIixbeyJuYW1lIjoidGFyZ2V0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbInRhcmdldEluZm8iXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRhcmdldC5nZXRUYXJnZXRzIixbXSxbInRhcmdldEluZm9zIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuc2VuZE1lc3NhZ2VUb1RhcmdldCIsW3sibmFtZSI6Im1lc3NhZ2UiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJzZXNzaW9uSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRhcmdldElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuc2V0QXV0b0F0dGFjaCIsW3sibmFtZSI6ImF1dG9BdHRhY2giLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoid2FpdEZvckRlYnVnZ2VyT25TdGFydCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUYXJnZXQuc2V0RGlzY292ZXJUYXJnZXRzIixbeyJuYW1lIjoiZGlzY292ZXIiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGFyZ2V0LnNldFJlbW90ZUxvY2F0aW9ucyIsW3sibmFtZSI6ImxvY2F0aW9ucyIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJUZXRoZXJpbmcuYWNjZXB0ZWQiLFsicG9ydCIsImNvbm5lY3Rpb25JZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGV0aGVyaW5nLmJpbmQiLFt7Im5hbWUiOiJwb3J0IiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiVGV0aGVyaW5nLnVuYmluZCIsW3sibmFtZSI6InBvcnQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJUcmFjaW5nLlRyYWNlQ29uZmlnUmVjb3JkTW9kZSIse1JlY29yZFVudGlsRnVsbDoicmVjb3JkVW50aWxGdWxsIixSZWNvcmRDb250aW51b3VzbHk6InJlY29yZENvbnRpbnVvdXNseSIsUmVjb3JkQXNNdWNoQXNQb3NzaWJsZToicmVjb3JkQXNNdWNoQXNQb3NzaWJsZSIsRWNob1RvQ29uc29sZToiZWNob1RvQ29uc29sZSJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiVHJhY2luZy5TdHJlYW1Db21wcmVzc2lvbiIse05vbmU6Im5vbmUiLEd6aXA6Imd6aXAifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJUcmFjaW5nLmJ1ZmZlclVzYWdlIixbInBlcmNlbnRGdWxsIiwiZXZlbnRDb3VudCIsInZhbHVlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiVHJhY2luZy5kYXRhQ29sbGVjdGVkIixbInZhbHVlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiVHJhY2luZy50cmFjaW5nQ29tcGxldGUiLFsic3RyZWFtIiwic3RyZWFtQ29tcHJlc3Npb24iXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRyYWNpbmcuZW5kIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRyYWNpbmcuZ2V0Q2F0ZWdvcmllcyIsW10sWyJjYXRlZ29yaWVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUcmFjaW5nLnJlY29yZENsb2NrU3luY01hcmtlciIsW3sibmFtZSI6InN5bmNJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlRyYWNpbmcucmVxdWVzdE1lbW9yeUR1bXAiLFtdLFsiZHVtcEd1aWQiLCJzdWNjZXNzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJUcmFjaW5nLnN0YXJ0IixbeyJuYW1lIjoiY2F0ZWdvcmllcyIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib3B0aW9ucyIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYnVmZmVyVXNhZ2VSZXBvcnRpbmdJbnRlcnZhbCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidHJhbnNmZXJNb2RlIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJzdHJlYW1Db21wcmVzc2lvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidHJhY2VDb25maWciLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkRlYnVnZ2VyLlNjb3BlVHlwZSIse0dsb2JhbDoiZ2xvYmFsIixMb2NhbDoibG9jYWwiLFdpdGg6IndpdGgiLENsb3N1cmU6ImNsb3N1cmUiLENhdGNoOiJjYXRjaCIsQmxvY2s6ImJsb2NrIixTY3JpcHQ6InNjcmlwdCIsRXZhbDoiZXZhbCIsTW9kdWxlOiJtb2R1bGUifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIkRlYnVnZ2VyLkJyZWFrTG9jYXRpb25UeXBlIix7RGVidWdnZXJTdGF0ZW1lbnQ6ImRlYnVnZ2VyU3RhdGVtZW50IixDYWxsOiJjYWxsIixSZXR1cm46InJldHVybiJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRlYnVnZ2VyLmJyZWFrcG9pbnRSZXNvbHZlZCIsWyJicmVha3BvaW50SWQiLCJsb2NhdGlvbiJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkRlYnVnZ2VyLnBhdXNlZCIsWyJjYWxsRnJhbWVzIiwicmVhc29uIiwiZGF0YSIsImhpdEJyZWFrcG9pbnRzIiwiYXN5bmNTdGFja1RyYWNlIiwiYXN5bmNTdGFja1RyYWNlSWQiLCJhc3luY0NhbGxTdGFja1RyYWNlSWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJEZWJ1Z2dlci5yZXN1bWVkIixbXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJEZWJ1Z2dlci5zY3JpcHRGYWlsZWRUb1BhcnNlIixbInNjcmlwdElkIiwidXJsIiwic3RhcnRMaW5lIiwic3RhcnRDb2x1bW4iLCJlbmRMaW5lIiwiZW5kQ29sdW1uIiwiZXhlY3V0aW9uQ29udGV4dElkIiwiaGFzaCIsImV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhIiwic291cmNlTWFwVVJMIiwiaGFzU291cmNlVVJMIiwiaXNNb2R1bGUiLCJsZW5ndGgiLCJzdGFja1RyYWNlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiRGVidWdnZXIuc2NyaXB0UGFyc2VkIixbInNjcmlwdElkIiwidXJsIiwic3RhcnRMaW5lIiwic3RhcnRDb2x1bW4iLCJlbmRMaW5lIiwiZW5kQ29sdW1uIiwiZXhlY3V0aW9uQ29udGV4dElkIiwiaGFzaCIsImV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhIiwiaXNMaXZlRWRpdCIsInNvdXJjZU1hcFVSTCIsImhhc1NvdXJjZVVSTCIsImlzTW9kdWxlIiwibGVuZ3RoIiwic3RhY2tUcmFjZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuY29udGludWVUb0xvY2F0aW9uIixbeyJuYW1lIjoibG9jYXRpb24iLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJ0YXJnZXRDYWxsRnJhbWVzIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLmVuYWJsZSIsW10sWyJkZWJ1Z2dlcklkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5ldmFsdWF0ZU9uQ2FsbEZyYW1lIixbeyJuYW1lIjoiY2FsbEZyYW1lSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJleHByZXNzaW9uIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoib2JqZWN0R3JvdXAiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImluY2x1ZGVDb21tYW5kTGluZUFQSSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNpbGVudCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InJldHVybkJ5VmFsdWUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZW5lcmF0ZVByZXZpZXciLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0aHJvd09uU2lkZUVmZmVjdCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRpbWVvdXQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCIsImV4Y2VwdGlvbkRldGFpbHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLmdldFBvc3NpYmxlQnJlYWtwb2ludHMiLFt7Im5hbWUiOiJzdGFydCIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImVuZCIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoicmVzdHJpY3RUb0Z1bmN0aW9uIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsibG9jYXRpb25zIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5nZXRTY3JpcHRTb3VyY2UiLFt7Im5hbWUiOiJzY3JpcHRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbInNjcmlwdFNvdXJjZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuZ2V0U3RhY2tUcmFjZSIsW3sibmFtZSI6InN0YWNrVHJhY2VJZCIsInR5cGUiOiJvYmplY3QiLCJvcHRpb25hbCI6ZmFsc2V9XSxbInN0YWNrVHJhY2UiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnBhdXNlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnBhdXNlT25Bc3luY0NhbGwiLFt7Im5hbWUiOiJwYXJlbnRTdGFja1RyYWNlSWQiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5yZW1vdmVCcmVha3BvaW50IixbeyJuYW1lIjoiYnJlYWtwb2ludElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIucmVzdGFydEZyYW1lIixbeyJuYW1lIjoiY2FsbEZyYW1lSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sWyJjYWxsRnJhbWVzIiwiYXN5bmNTdGFja1RyYWNlIiwiYXN5bmNTdGFja1RyYWNlSWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnJlc3VtZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zY2hlZHVsZVN0ZXBJbnRvQXN5bmMiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuc2VhcmNoSW5Db250ZW50IixbeyJuYW1lIjoic2NyaXB0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJxdWVyeSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImNhc2VTZW5zaXRpdmUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJpc1JlZ2V4IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFsicmVzdWx0Il0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRBc3luY0NhbGxTdGFja0RlcHRoIixbeyJuYW1lIjoibWF4RGVwdGgiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRCbGFja2JveFBhdHRlcm5zIixbeyJuYW1lIjoicGF0dGVybnMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRCbGFja2JveGVkUmFuZ2VzIixbeyJuYW1lIjoic2NyaXB0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJwb3NpdGlvbnMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRCcmVha3BvaW50IixbeyJuYW1lIjoibG9jYXRpb24iLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJjb25kaXRpb24iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbImJyZWFrcG9pbnRJZCIsImFjdHVhbExvY2F0aW9uIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRCcmVha3BvaW50QnlVcmwiLFt7Im5hbWUiOiJsaW5lTnVtYmVyIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoidXJsIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ1cmxSZWdleCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2NyaXB0SGFzaCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiY29sdW1uTnVtYmVyIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJjb25kaXRpb24iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbImJyZWFrcG9pbnRJZCIsImxvY2F0aW9ucyJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuc2V0QnJlYWtwb2ludE9uRnVuY3Rpb25DYWxsIixbeyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJjb25kaXRpb24iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbImJyZWFrcG9pbnRJZCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUiLFt7Im5hbWUiOiJhY3RpdmUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLFt7Im5hbWUiOiJzdGF0ZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnNldFJldHVyblZhbHVlIixbeyJuYW1lIjoibmV3VmFsdWUiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zZXRTY3JpcHRTb3VyY2UiLFt7Im5hbWUiOiJzY3JpcHRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InNjcmlwdFNvdXJjZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImRyeVJ1biIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbImNhbGxGcmFtZXMiLCJzdGFja0NoYW5nZWQiLCJhc3luY1N0YWNrVHJhY2UiLCJhc3luY1N0YWNrVHJhY2VJZCIsImV4Y2VwdGlvbkRldGFpbHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnNldFNraXBBbGxQYXVzZXMiLFt7Im5hbWUiOiJza2lwIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnNldFZhcmlhYmxlVmFsdWUiLFt7Im5hbWUiOiJzY29wZU51bWJlciIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InZhcmlhYmxlTmFtZSIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im5ld1ZhbHVlIiwidHlwZSI6Im9iamVjdCIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoiY2FsbEZyYW1lSWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zdGVwSW50byIsW3sibmFtZSI6ImJyZWFrT25Bc3luY0NhbGwiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJEZWJ1Z2dlci5zdGVwT3V0IixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkRlYnVnZ2VyLnN0ZXBPdmVyIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJIZWFwUHJvZmlsZXIuYWRkSGVhcFNuYXBzaG90Q2h1bmsiLFsiY2h1bmsiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJIZWFwUHJvZmlsZXIuaGVhcFN0YXRzVXBkYXRlIixbInN0YXRzVXBkYXRlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiSGVhcFByb2ZpbGVyLmxhc3RTZWVuT2JqZWN0SWQiLFsibGFzdFNlZW5PYmplY3RJZCIsInRpbWVzdGFtcCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkhlYXBQcm9maWxlci5yZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzcyIsWyJkb25lIiwidG90YWwiLCJmaW5pc2hlZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIkhlYXBQcm9maWxlci5yZXNldFByb2ZpbGVzIixbXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci5hZGRJbnNwZWN0ZWRIZWFwT2JqZWN0IixbeyJuYW1lIjoiaGVhcE9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSGVhcFByb2ZpbGVyLmNvbGxlY3RHYXJiYWdlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci5kaXNhYmxlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSGVhcFByb2ZpbGVyLmdldEhlYXBPYmplY3RJZCIsW3sibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFsiaGVhcFNuYXBzaG90T2JqZWN0SWQiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci5nZXRPYmplY3RCeUhlYXBPYmplY3RJZCIsW3sibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoib2JqZWN0R3JvdXAiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSGVhcFByb2ZpbGVyLmdldFNhbXBsaW5nUHJvZmlsZSIsW10sWyJwcm9maWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJIZWFwUHJvZmlsZXIuc3RhcnRTYW1wbGluZyIsW3sibmFtZSI6InNhbXBsaW5nSW50ZXJ2YWwiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci5zdGFydFRyYWNraW5nSGVhcE9iamVjdHMiLFt7Im5hbWUiOiJ0cmFja0FsbG9jYXRpb25zIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiSGVhcFByb2ZpbGVyLnN0b3BTYW1wbGluZyIsW10sWyJwcm9maWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJIZWFwUHJvZmlsZXIuc3RvcFRyYWNraW5nSGVhcE9iamVjdHMiLFt7Im5hbWUiOiJyZXBvcnRQcm9ncmVzcyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIkhlYXBQcm9maWxlci50YWtlSGVhcFNuYXBzaG90IixbeyJuYW1lIjoicmVwb3J0UHJvZ3Jlc3MiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUHJvZmlsZXIuY29uc29sZVByb2ZpbGVGaW5pc2hlZCIsWyJpZCIsImxvY2F0aW9uIiwicHJvZmlsZSIsInRpdGxlIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUHJvZmlsZXIuY29uc29sZVByb2ZpbGVTdGFydGVkIixbImlkIiwibG9jYXRpb24iLCJ0aXRsZSJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuZGlzYWJsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQcm9maWxlci5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuZ2V0QmVzdEVmZm9ydENvdmVyYWdlIixbXSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuc2V0U2FtcGxpbmdJbnRlcnZhbCIsW3sibmFtZSI6ImludGVydmFsIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuc3RhcnQiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuc3RhcnRQcmVjaXNlQ292ZXJhZ2UiLFt7Im5hbWUiOiJjYWxsQ291bnQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJkZXRhaWxlZCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlByb2ZpbGVyLnN0YXJ0VHlwZVByb2ZpbGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIuc3RvcCIsW10sWyJwcm9maWxlIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQcm9maWxlci5zdG9wUHJlY2lzZUNvdmVyYWdlIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlByb2ZpbGVyLnN0b3BUeXBlUHJvZmlsZSIsW10sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJQcm9maWxlci50YWtlUHJlY2lzZUNvdmVyYWdlIixbXSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUHJvZmlsZXIudGFrZVR5cGVQcm9maWxlIixbXSxbInJlc3VsdCJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRW51bSgiUnVudGltZS5SZW1vdGVPYmplY3RUeXBlIix7T2JqZWN0OiJvYmplY3QiLEZ1bmN0aW9uOiJmdW5jdGlvbiIsVW5kZWZpbmVkOiJ1bmRlZmluZWQiLFN0cmluZzoic3RyaW5nIixOdW1iZXI6Im51bWJlciIsQm9vbGVhbjoiYm9vbGVhbiIsU3ltYm9sOiJzeW1ib2wiLEJpZ2ludDoiYmlnaW50In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJSdW50aW1lLlJlbW90ZU9iamVjdFN1YnR5cGUiLHtBcnJheToiYXJyYXkiLE51bGw6Im51bGwiLE5vZGU6Im5vZGUiLFJlZ2V4cDoicmVnZXhwIixEYXRlOiJkYXRlIixNYXA6Im1hcCIsU2V0OiJzZXQiLFdlYWttYXA6IndlYWttYXAiLFdlYWtzZXQ6IndlYWtzZXQiLEl0ZXJhdG9yOiJpdGVyYXRvciIsR2VuZXJhdG9yOiJnZW5lcmF0b3IiLEVycm9yOiJlcnJvciIsUHJveHk6InByb3h5IixQcm9taXNlOiJwcm9taXNlIixUeXBlZGFycmF5OiJ0eXBlZGFycmF5In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJSdW50aW1lLk9iamVjdFByZXZpZXdUeXBlIix7T2JqZWN0OiJvYmplY3QiLEZ1bmN0aW9uOiJmdW5jdGlvbiIsVW5kZWZpbmVkOiJ1bmRlZmluZWQiLFN0cmluZzoic3RyaW5nIixOdW1iZXI6Im51bWJlciIsQm9vbGVhbjoiYm9vbGVhbiIsU3ltYm9sOiJzeW1ib2wiLEJpZ2ludDoiYmlnaW50In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJSdW50aW1lLk9iamVjdFByZXZpZXdTdWJ0eXBlIix7QXJyYXk6ImFycmF5IixOdWxsOiJudWxsIixOb2RlOiJub2RlIixSZWdleHA6InJlZ2V4cCIsRGF0ZToiZGF0ZSIsTWFwOiJtYXAiLFNldDoic2V0IixXZWFrbWFwOiJ3ZWFrbWFwIixXZWFrc2V0OiJ3ZWFrc2V0IixJdGVyYXRvcjoiaXRlcmF0b3IiLEdlbmVyYXRvcjoiZ2VuZXJhdG9yIixFcnJvcjoiZXJyb3IifSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckVudW0oIlJ1bnRpbWUuUHJvcGVydHlQcmV2aWV3VHlwZSIse09iamVjdDoib2JqZWN0IixGdW5jdGlvbjoiZnVuY3Rpb24iLFVuZGVmaW5lZDoidW5kZWZpbmVkIixTdHJpbmc6InN0cmluZyIsTnVtYmVyOiJudW1iZXIiLEJvb2xlYW46ImJvb2xlYW4iLFN5bWJvbDoic3ltYm9sIixBY2Nlc3NvcjoiYWNjZXNzb3IiLEJpZ2ludDoiYmlnaW50In0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFbnVtKCJSdW50aW1lLlByb3BlcnR5UHJldmlld1N1YnR5cGUiLHtBcnJheToiYXJyYXkiLE51bGw6Im51bGwiLE5vZGU6Im5vZGUiLFJlZ2V4cDoicmVnZXhwIixEYXRlOiJkYXRlIixNYXA6Im1hcCIsU2V0OiJzZXQiLFdlYWttYXA6IndlYWttYXAiLFdlYWtzZXQ6IndlYWtzZXQiLEl0ZXJhdG9yOiJpdGVyYXRvciIsR2VuZXJhdG9yOiJnZW5lcmF0b3IiLEVycm9yOiJlcnJvciJ9KTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlJ1bnRpbWUuYmluZGluZ0NhbGxlZCIsWyJuYW1lIiwicGF5bG9hZCIsImV4ZWN1dGlvbkNvbnRleHRJZCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlJ1bnRpbWUuY29uc29sZUFQSUNhbGxlZCIsWyJ0eXBlIiwiYXJncyIsImV4ZWN1dGlvbkNvbnRleHRJZCIsInRpbWVzdGFtcCIsInN0YWNrVHJhY2UiLCJjb250ZXh0Il0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUnVudGltZS5leGNlcHRpb25SZXZva2VkIixbInJlYXNvbiIsImV4Y2VwdGlvbklkIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUnVudGltZS5leGNlcHRpb25UaHJvd24iLFsidGltZXN0YW1wIiwiZXhjZXB0aW9uRGV0YWlscyJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlJ1bnRpbWUuZXhlY3V0aW9uQ29udGV4dENyZWF0ZWQiLFsiY29udGV4dCJdKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyRXZlbnQoIlJ1bnRpbWUuZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZCIsWyJleGVjdXRpb25Db250ZXh0SWQiXSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckV2ZW50KCJSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCIsW10pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJFdmVudCgiUnVudGltZS5pbnNwZWN0UmVxdWVzdGVkIixbIm9iamVjdCIsImhpbnRzIl0pO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLmF3YWl0UHJvbWlzZSIsW3sibmFtZSI6InByb21pc2VPYmplY3RJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6InJldHVybkJ5VmFsdWUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZW5lcmF0ZVByZXZpZXciLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sWyJyZXN1bHQiLCJleGNlcHRpb25EZXRhaWxzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLmNhbGxGdW5jdGlvbk9uIixbeyJuYW1lIjoiZnVuY3Rpb25EZWNsYXJhdGlvbiIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJhcmd1bWVudHMiLCJ0eXBlIjoib2JqZWN0Iiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNpbGVudCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InJldHVybkJ5VmFsdWUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZW5lcmF0ZVByZXZpZXciLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ1c2VyR2VzdHVyZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImF3YWl0UHJvbWlzZSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImV4ZWN1dGlvbkNvbnRleHRJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0R3JvdXAiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCIsImV4Y2VwdGlvbkRldGFpbHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUuY29tcGlsZVNjcmlwdCIsW3sibmFtZSI6ImV4cHJlc3Npb24iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJzb3VyY2VVUkwiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJwZXJzaXN0U2NyaXB0IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImV4ZWN1dGlvbkNvbnRleHRJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX1dLFsic2NyaXB0SWQiLCJleGNlcHRpb25EZXRhaWxzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLmRpc2FibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5kaXNjYXJkQ29uc29sZUVudHJpZXMiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5lbmFibGUiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5ldmFsdWF0ZSIsW3sibmFtZSI6ImV4cHJlc3Npb24iLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJvYmplY3RHcm91cCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiaW5jbHVkZUNvbW1hbmRMaW5lQVBJIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic2lsZW50IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiY29udGV4dElkIiwidHlwZSI6Im51bWJlciIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJyZXR1cm5CeVZhbHVlIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiZ2VuZXJhdGVQcmV2aWV3IiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoidXNlckdlc3R1cmUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJhd2FpdFByb21pc2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0aHJvd09uU2lkZUVmZmVjdCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InRpbWVvdXQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCIsImV4Y2VwdGlvbkRldGFpbHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUuZ2V0SXNvbGF0ZUlkIixbXSxbImlkIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLmdldEhlYXBVc2FnZSIsW10sWyJ1c2VkU2l6ZSIsInRvdGFsU2l6ZSJdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIixbeyJuYW1lIjoib2JqZWN0SWQiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJvd25Qcm9wZXJ0aWVzIiwidHlwZSI6ImJvb2xlYW4iLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoiYWNjZXNzb3JQcm9wZXJ0aWVzT25seSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImdlbmVyYXRlUHJldmlldyIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9XSxbInJlc3VsdCIsImludGVybmFsUHJvcGVydGllcyIsImV4Y2VwdGlvbkRldGFpbHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUuZ2xvYmFsTGV4aWNhbFNjb3BlTmFtZXMiLFt7Im5hbWUiOiJleGVjdXRpb25Db250ZXh0SWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbIm5hbWVzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLnF1ZXJ5T2JqZWN0cyIsW3sibmFtZSI6InByb3RvdHlwZU9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX0seyJuYW1lIjoib2JqZWN0R3JvdXAiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9XSxbIm9iamVjdHMiXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUucmVsZWFzZU9iamVjdCIsW3sibmFtZSI6Im9iamVjdElkIiwidHlwZSI6InN0cmluZyIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5yZWxlYXNlT2JqZWN0R3JvdXAiLFt7Im5hbWUiOiJvYmplY3RHcm91cCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXIiLFtdLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5ydW5TY3JpcHQiLFt7Im5hbWUiOiJzY3JpcHRJZCIsInR5cGUiOiJzdHJpbmciLCJvcHRpb25hbCI6ZmFsc2V9LHsibmFtZSI6ImV4ZWN1dGlvbkNvbnRleHRJZCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6dHJ1ZX0seyJuYW1lIjoib2JqZWN0R3JvdXAiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InNpbGVudCIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6ImluY2x1ZGVDb21tYW5kTGluZUFQSSIsInR5cGUiOiJib29sZWFuIiwib3B0aW9uYWwiOnRydWV9LHsibmFtZSI6InJldHVybkJ5VmFsdWUiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJnZW5lcmF0ZVByZXZpZXciLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJhd2FpdFByb21pc2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjp0cnVlfV0sWyJyZXN1bHQiLCJleGNlcHRpb25EZXRhaWxzIl0sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJSdW50aW1lLnNldEFzeW5jQ2FsbFN0YWNrRGVwdGgiLFt7Im5hbWUiOiJtYXhEZXB0aCIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUuc2V0Q3VzdG9tT2JqZWN0Rm9ybWF0dGVyRW5hYmxlZCIsW3sibmFtZSI6ImVuYWJsZWQiLCJ0eXBlIjoiYm9vbGVhbiIsIm9wdGlvbmFsIjpmYWxzZX1dLFtdLGZhbHNlKTtQcm90b2NvbC5pbnNwZWN0b3JCYWNrZW5kLnJlZ2lzdGVyQ29tbWFuZCgiUnVudGltZS5zZXRNYXhDYWxsU3RhY2tTaXplVG9DYXB0dXJlIixbeyJuYW1lIjoic2l6ZSIsInR5cGUiOiJudW1iZXIiLCJvcHRpb25hbCI6ZmFsc2V9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUudGVybWluYXRlRXhlY3V0aW9uIixbXSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUuYWRkQmluZGluZyIsW3sibmFtZSI6Im5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfSx7Im5hbWUiOiJleGVjdXRpb25Db250ZXh0SWQiLCJ0eXBlIjoibnVtYmVyIiwib3B0aW9uYWwiOnRydWV9XSxbXSxmYWxzZSk7UHJvdG9jb2wuaW5zcGVjdG9yQmFja2VuZC5yZWdpc3RlckNvbW1hbmQoIlJ1bnRpbWUucmVtb3ZlQmluZGluZyIsW3sibmFtZSI6Im5hbWUiLCJ0eXBlIjoic3RyaW5nIiwib3B0aW9uYWwiOmZhbHNlfV0sW10sZmFsc2UpO1Byb3RvY29sLmluc3BlY3RvckJhY2tlbmQucmVnaXN0ZXJDb21tYW5kKCJTY2hlbWEuZ2V0RG9tYWlucyIsW10sWyJkb21haW5zIl0sZmFsc2UpOztzZWxmWydTREsnXT1zZWxmWydTREsnXXx8e307U0RLLlRhcmdldD1jbGFzcyBleHRlbmRzIFByb3RvY29sLlRhcmdldEJhc2V7Y29uc3RydWN0b3IodGFyZ2V0TWFuYWdlcixpZCxuYW1lLGNhcGFiaWxpdGllc01hc2ssY29ubmVjdGlvbkZhY3RvcnkscGFyZW50VGFyZ2V0LHN1c3BlbmRlZCxpc05vZGVKUyl7c3VwZXIoY29ubmVjdGlvbkZhY3RvcnkpO3RoaXMuX3RhcmdldE1hbmFnZXI9dGFyZ2V0TWFuYWdlcjt0aGlzLl9uYW1lPW5hbWU7dGhpcy5faW5zcGVjdGVkVVJMPScnO3RoaXMuX2NhcGFiaWxpdGllc01hc2s9Y2FwYWJpbGl0aWVzTWFzazt0aGlzLl9wYXJlbnRUYXJnZXQ9cGFyZW50VGFyZ2V0O3RoaXMuX2lkPWlkO3RoaXMuX21vZGVsQnlDb25zdHJ1Y3Rvcj1uZXcgTWFwKCk7dGhpcy5faXNTdXNwZW5kZWQ9c3VzcGVuZGVkO3RoaXMuX2lzTm9kZUpTPWlzTm9kZUpTO30KY3JlYXRlTW9kZWxzKHJlcXVpcmVkKXt0aGlzLl9jcmVhdGluZ01vZGVscz10cnVlO3RoaXMubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtjb25zdCByZWdpc3RlcmVkPUFycmF5LmZyb20oU0RLLlNES01vZGVsLl9yZWdpc3RlcmVkTW9kZWxzLmtleXMoKSk7Zm9yKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgcmVnaXN0ZXJlZCl7Y29uc3QgaW5mbz1TREsuU0RLTW9kZWwuX3JlZ2lzdGVyZWRNb2RlbHMuZ2V0KG1vZGVsQ2xhc3MpO2lmKGluZm8uYXV0b3N0YXJ0fHxyZXF1aXJlZC5oYXMobW9kZWxDbGFzcykpCnRoaXMubW9kZWwobW9kZWxDbGFzcyk7fQp0aGlzLl9jcmVhdGluZ01vZGVscz1mYWxzZTt9CmlzTm9kZUpTKCl7cmV0dXJuIHRoaXMuX2lzTm9kZUpTO30KbWFya0FzTm9kZUpTRm9yVGVzdCgpe3RoaXMuX2lzTm9kZUpTPXRydWU7fQppZCgpe3JldHVybiB0aGlzLl9pZDt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZXx8dGhpcy5faW5zcGVjdGVkVVJMTmFtZTt9CnRhcmdldE1hbmFnZXIoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0TWFuYWdlcjt9Cmhhc0FsbENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXNNYXNrKXtyZXR1cm4odGhpcy5fY2FwYWJpbGl0aWVzTWFzayZjYXBhYmlsaXRpZXNNYXNrKT09PWNhcGFiaWxpdGllc01hc2s7fQpkZWNvcmF0ZUxhYmVsKGxhYmVsKXtyZXR1cm4hdGhpcy5oYXNCcm93c2VyQ2FwYWJpbGl0eSgpPydcdTI2OTkgJytsYWJlbDpsYWJlbDt9Cmhhc0Jyb3dzZXJDYXBhYmlsaXR5KCl7cmV0dXJuIHRoaXMuaGFzQWxsQ2FwYWJpbGl0aWVzKFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyKTt9Cmhhc0pTQ2FwYWJpbGl0eSgpe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSlMpO30KaGFzTG9nQ2FwYWJpbGl0eSgpe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTG9nKTt9Cmhhc05ldHdvcmtDYXBhYmlsaXR5KCl7cmV0dXJuIHRoaXMuaGFzQWxsQ2FwYWJpbGl0aWVzKFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5OZXR3b3JrKTt9Cmhhc1RhcmdldENhcGFiaWxpdHkoKXtyZXR1cm4gdGhpcy5oYXNBbGxDYXBhYmlsaXRpZXMoU0RLLlRhcmdldC5DYXBhYmlsaXR5LlRhcmdldCk7fQpoYXNET01DYXBhYmlsaXR5KCl7cmV0dXJuIHRoaXMuaGFzQWxsQ2FwYWJpbGl0aWVzKFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00pO30KcGFyZW50VGFyZ2V0KCl7cmV0dXJuIHRoaXMuX3BhcmVudFRhcmdldDt9CmRpc3Bvc2UoKXt0aGlzLl90YXJnZXRNYW5hZ2VyLnJlbW92ZVRhcmdldCh0aGlzKTtmb3IoY29uc3QgbW9kZWwgb2YgdGhpcy5fbW9kZWxCeUNvbnN0cnVjdG9yLnZhbHVlc0FycmF5KCkpCm1vZGVsLmRpc3Bvc2UoKTt9Cm1vZGVsKG1vZGVsQ2xhc3Mpe2lmKCF0aGlzLl9tb2RlbEJ5Q29uc3RydWN0b3IuZ2V0KG1vZGVsQ2xhc3MpKXtjb25zdCBpbmZvPVNESy5TREtNb2RlbC5fcmVnaXN0ZXJlZE1vZGVscy5nZXQobW9kZWxDbGFzcyk7aWYoaW5mbz09PXVuZGVmaW5lZCkKdGhyb3cnTW9kZWwgY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQgQCcrbmV3IEVycm9yKCkuc3RhY2s7aWYoKHRoaXMuX2NhcGFiaWxpdGllc01hc2smaW5mby5jYXBhYmlsaXRpZXMpPT09aW5mby5jYXBhYmlsaXRpZXMpe2NvbnN0IG1vZGVsPW5ldyBtb2RlbENsYXNzKHRoaXMpO3RoaXMuX21vZGVsQnlDb25zdHJ1Y3Rvci5zZXQobW9kZWxDbGFzcyxtb2RlbCk7aWYoIXRoaXMuX2NyZWF0aW5nTW9kZWxzKQp0aGlzLl90YXJnZXRNYW5hZ2VyLm1vZGVsQWRkZWQodGhpcyxtb2RlbENsYXNzLG1vZGVsKTt9fQpyZXR1cm4gdGhpcy5fbW9kZWxCeUNvbnN0cnVjdG9yLmdldChtb2RlbENsYXNzKXx8bnVsbDt9Cm1vZGVscygpe3JldHVybiB0aGlzLl9tb2RlbEJ5Q29uc3RydWN0b3I7fQppbnNwZWN0ZWRVUkwoKXtyZXR1cm4gdGhpcy5faW5zcGVjdGVkVVJMO30Kc2V0SW5zcGVjdGVkVVJMKGluc3BlY3RlZFVSTCl7dGhpcy5faW5zcGVjdGVkVVJMPWluc3BlY3RlZFVSTDtjb25zdCBwYXJzZWRVUkw9aW5zcGVjdGVkVVJMLmFzUGFyc2VkVVJMKCk7dGhpcy5faW5zcGVjdGVkVVJMTmFtZT1wYXJzZWRVUkw/cGFyc2VkVVJMLmxhc3RQYXRoQ29tcG9uZW50V2l0aEZyYWdtZW50KCk6JyMnK3RoaXMuX2lkO2lmKCF0aGlzLnBhcmVudFRhcmdldCgpKQpJbnNwZWN0b3JGcm9udGVuZEhvc3QuaW5zcGVjdGVkVVJMQ2hhbmdlZChpbnNwZWN0ZWRVUkx8fCcnKTt0aGlzLl90YXJnZXRNYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzKTtpZighdGhpcy5fbmFtZSkKdGhpcy5fdGFyZ2V0TWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLk5hbWVDaGFuZ2VkLHRoaXMpO30Kc3VzcGVuZCgpe2lmKHRoaXMuX2lzU3VzcGVuZGVkKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dGhpcy5faXNTdXNwZW5kZWQ9dHJ1ZTtjb25zdCBwcm9taXNlcz1bXTtmb3IoY29uc3QgbW9kZWwgb2YgdGhpcy5tb2RlbHMoKS52YWx1ZXMoKSkKcHJvbWlzZXMucHVzaChtb2RlbC5zdXNwZW5kTW9kZWwoKSk7cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTt9CnJlc3VtZSgpe2lmKCF0aGlzLl9pc1N1c3BlbmRlZCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RoaXMuX2lzU3VzcGVuZGVkPWZhbHNlO2NvbnN0IHByb21pc2VzPVtdO2Zvcihjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscygpLnZhbHVlcygpKQpwcm9taXNlcy5wdXNoKG1vZGVsLnJlc3VtZU1vZGVsKCkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fQpzdXNwZW5kZWQoKXtyZXR1cm4gdGhpcy5faXNTdXNwZW5kZWQ7fX07U0RLLlRhcmdldC5DYXBhYmlsaXR5PXtCcm93c2VyOjE8PDAsRE9NOjE8PDEsSlM6MTw8MixMb2c6MTw8MyxOZXR3b3JrOjE8PDQsVGFyZ2V0OjE8PDUsU2NyZWVuQ2FwdHVyZToxPDw2LFRyYWNpbmc6MTw8NyxFbXVsYXRpb246MTw8OCxTZWN1cml0eToxPDw5LElucHV0OjE8PDEwLEluc3BlY3RvcjoxPDwxMSxEZXZpY2VFbXVsYXRpb246MTw8MTIsTm9uZTowLEFsbEZvclRlc3RzOigxPDwxMyktMX07U0RLLlNES01vZGVsPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKCk7dGhpcy5fdGFyZ2V0PXRhcmdldDt9CnRhcmdldCgpe3JldHVybiB0aGlzLl90YXJnZXQ7fQpzdXNwZW5kTW9kZWwoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpyZXN1bWVNb2RlbCgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmRpc3Bvc2UoKXt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXI9ZnVuY3Rpb24obW9kZWxDbGFzcyxjYXBhYmlsaXRpZXMsYXV0b3N0YXJ0KXtpZighU0RLLlNES01vZGVsLl9yZWdpc3RlcmVkTW9kZWxzKQpTREsuU0RLTW9kZWwuX3JlZ2lzdGVyZWRNb2RlbHM9bmV3IE1hcCgpO1NESy5TREtNb2RlbC5fcmVnaXN0ZXJlZE1vZGVscy5zZXQobW9kZWxDbGFzcyx7Y2FwYWJpbGl0aWVzOmNhcGFiaWxpdGllcyxhdXRvc3RhcnQ6YXV0b3N0YXJ0fSk7fTtTREsuU0RLTW9kZWwuX3JlZ2lzdGVyZWRNb2RlbHM7O1NESy5UYXJnZXRNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fdGFyZ2V0cz1bXTt0aGlzLl9vYnNlcnZlcnM9W107dGhpcy5fb2JzZXJ2ZXJDYXBhYmlsaWVzTWFza1N5bWJvbD1TeW1ib2woJ29ic2VydmVyQ2FwYWJpbGl0aWVzTWFzaycpO3RoaXMuX21vZGVsTGlzdGVuZXJzPW5ldyBNdWx0aW1hcCgpO3RoaXMuX21vZGVsT2JzZXJ2ZXJzPW5ldyBNdWx0aW1hcCgpO3RoaXMuX2lzU3VzcGVuZGVkPWZhbHNlO30Kc3VzcGVuZEFsbFRhcmdldHMoKXtpZih0aGlzLl9pc1N1c3BlbmRlZCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RoaXMuX2lzU3VzcGVuZGVkPXRydWU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQpO3JldHVybiBQcm9taXNlLmFsbCh0aGlzLl90YXJnZXRzLm1hcCh0YXJnZXQ9PnRhcmdldC5zdXNwZW5kKCkpKTt9CnJlc3VtZUFsbFRhcmdldHMoKXtpZighdGhpcy5faXNTdXNwZW5kZWQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0aGlzLl9pc1N1c3BlbmRlZD1mYWxzZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuU3VzcGVuZFN0YXRlQ2hhbmdlZCk7cmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3RhcmdldHMubWFwKHRhcmdldD0+dGFyZ2V0LnJlc3VtZSgpKSk7fQphbGxUYXJnZXRzU3VzcGVuZGVkKCl7cmV0dXJuIHRoaXMuX2lzU3VzcGVuZGVkO30KbW9kZWxzKG1vZGVsQ2xhc3Mpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX3RhcmdldHMubGVuZ3RoOysraSl7Y29uc3QgbW9kZWw9dGhpcy5fdGFyZ2V0c1tpXS5tb2RlbChtb2RlbENsYXNzKTtpZihtb2RlbCkKcmVzdWx0LnB1c2gobW9kZWwpO30KcmV0dXJuIHJlc3VsdDt9Cmluc3BlY3RlZFVSTCgpe3JldHVybiB0aGlzLl90YXJnZXRzWzBdP3RoaXMuX3RhcmdldHNbMF0uaW5zcGVjdGVkVVJMKCk6Jyc7fQpvYnNlcnZlTW9kZWxzKG1vZGVsQ2xhc3Msb2JzZXJ2ZXIpe2NvbnN0IG1vZGVscz10aGlzLm1vZGVscyhtb2RlbENsYXNzKTt0aGlzLl9tb2RlbE9ic2VydmVycy5zZXQobW9kZWxDbGFzcyxvYnNlcnZlcik7Zm9yKGNvbnN0IG1vZGVsIG9mIG1vZGVscykKb2JzZXJ2ZXIubW9kZWxBZGRlZChtb2RlbCk7fQp1bm9ic2VydmVNb2RlbHMobW9kZWxDbGFzcyxvYnNlcnZlcil7dGhpcy5fbW9kZWxPYnNlcnZlcnMuZGVsZXRlKG1vZGVsQ2xhc3Msb2JzZXJ2ZXIpO30KbW9kZWxBZGRlZCh0YXJnZXQsbW9kZWxDbGFzcyxtb2RlbCl7Zm9yKGNvbnN0IG9ic2VydmVyIG9mIHRoaXMuX21vZGVsT2JzZXJ2ZXJzLmdldChtb2RlbENsYXNzKS52YWx1ZXNBcnJheSgpKQpvYnNlcnZlci5tb2RlbEFkZGVkKG1vZGVsKTt9Cl9tb2RlbFJlbW92ZWQodGFyZ2V0LG1vZGVsQ2xhc3MsbW9kZWwpe2Zvcihjb25zdCBvYnNlcnZlciBvZiB0aGlzLl9tb2RlbE9ic2VydmVycy5nZXQobW9kZWxDbGFzcykudmFsdWVzQXJyYXkoKSkKb2JzZXJ2ZXIubW9kZWxSZW1vdmVkKG1vZGVsKTt9CmFkZE1vZGVsTGlzdGVuZXIobW9kZWxDbGFzcyxldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCl7Zm9yKGxldCBpPTA7aTx0aGlzLl90YXJnZXRzLmxlbmd0aDsrK2kpe2NvbnN0IG1vZGVsPXRoaXMuX3RhcmdldHNbaV0ubW9kZWwobW9kZWxDbGFzcyk7aWYobW9kZWwpCm1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3QpO30KdGhpcy5fbW9kZWxMaXN0ZW5lcnMuc2V0KGV2ZW50VHlwZSx7bW9kZWxDbGFzczptb2RlbENsYXNzLHRoaXNPYmplY3Q6dGhpc09iamVjdCxsaXN0ZW5lcjpsaXN0ZW5lcn0pO30KcmVtb3ZlTW9kZWxMaXN0ZW5lcihtb2RlbENsYXNzLGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXtpZighdGhpcy5fbW9kZWxMaXN0ZW5lcnMuaGFzKGV2ZW50VHlwZSkpCnJldHVybjtmb3IobGV0IGk9MDtpPHRoaXMuX3RhcmdldHMubGVuZ3RoOysraSl7Y29uc3QgbW9kZWw9dGhpcy5fdGFyZ2V0c1tpXS5tb2RlbChtb2RlbENsYXNzKTtpZihtb2RlbCkKbW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCk7fQpmb3IoY29uc3QgaW5mbyBvZiB0aGlzLl9tb2RlbExpc3RlbmVycy5nZXQoZXZlbnRUeXBlKSl7aWYoaW5mby5tb2RlbENsYXNzPT09bW9kZWxDbGFzcyYmaW5mby5saXN0ZW5lcj09PWxpc3RlbmVyJiZpbmZvLnRoaXNPYmplY3Q9PT10aGlzT2JqZWN0KQp0aGlzLl9tb2RlbExpc3RlbmVycy5kZWxldGUoZXZlbnRUeXBlLGluZm8pO319Cm9ic2VydmVUYXJnZXRzKHRhcmdldE9ic2VydmVyLGNhcGFiaWxpdGllc01hc2spe2lmKHRoaXMuX29ic2VydmVyQ2FwYWJpbGllc01hc2tTeW1ib2wgaW4gdGFyZ2V0T2JzZXJ2ZXIpCnRocm93IG5ldyBFcnJvcignT2JzZXJ2ZXIgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlJyk7dGFyZ2V0T2JzZXJ2ZXJbdGhpcy5fb2JzZXJ2ZXJDYXBhYmlsaWVzTWFza1N5bWJvbF09Y2FwYWJpbGl0aWVzTWFza3x8MDt0aGlzLnRhcmdldHMoY2FwYWJpbGl0aWVzTWFzaykuZm9yRWFjaCh0YXJnZXRPYnNlcnZlci50YXJnZXRBZGRlZC5iaW5kKHRhcmdldE9ic2VydmVyKSk7dGhpcy5fb2JzZXJ2ZXJzLnB1c2godGFyZ2V0T2JzZXJ2ZXIpO30KdW5vYnNlcnZlVGFyZ2V0cyh0YXJnZXRPYnNlcnZlcil7ZGVsZXRlIHRhcmdldE9ic2VydmVyW3RoaXMuX29ic2VydmVyQ2FwYWJpbGllc01hc2tTeW1ib2xdO3RoaXMuX29ic2VydmVycy5yZW1vdmUodGFyZ2V0T2JzZXJ2ZXIpO30KY3JlYXRlVGFyZ2V0KGlkLG5hbWUsY2FwYWJpbGl0aWVzTWFzayxjb25uZWN0aW9uRmFjdG9yeSxwYXJlbnRUYXJnZXQsaXNOb2RlSlMpe2NvbnN0IHRhcmdldD1uZXcgU0RLLlRhcmdldCh0aGlzLGlkLG5hbWUsY2FwYWJpbGl0aWVzTWFzayxjb25uZWN0aW9uRmFjdG9yeSxwYXJlbnRUYXJnZXQsdGhpcy5faXNTdXNwZW5kZWQsaXNOb2RlSlMpO3RhcmdldC5jcmVhdGVNb2RlbHMobmV3IFNldCh0aGlzLl9tb2RlbE9ic2VydmVycy5rZXlzQXJyYXkoKSkpO3RoaXMuX3RhcmdldHMucHVzaCh0YXJnZXQpO2NvbnN0IGNvcHk9dGhpcy5fb2JzZXJ2ZXJzRm9yVGFyZ2V0KHRhcmdldCk7Zm9yKGxldCBpPTA7aTxjb3B5Lmxlbmd0aDsrK2kpCmNvcHlbaV0udGFyZ2V0QWRkZWQodGFyZ2V0KTtmb3IoY29uc3QgbW9kZWxDbGFzcyBvZiB0YXJnZXQubW9kZWxzKCkua2V5cygpKQp0aGlzLm1vZGVsQWRkZWQodGFyZ2V0LG1vZGVsQ2xhc3MsdGFyZ2V0Lm1vZGVscygpLmdldChtb2RlbENsYXNzKSk7Zm9yKGNvbnN0IGtleSBvZiB0aGlzLl9tb2RlbExpc3RlbmVycy5rZXlzQXJyYXkoKSl7Zm9yKGNvbnN0IGluZm8gb2YgdGhpcy5fbW9kZWxMaXN0ZW5lcnMuZ2V0KGtleSkpe2NvbnN0IG1vZGVsPXRhcmdldC5tb2RlbChpbmZvLm1vZGVsQ2xhc3MpO2lmKG1vZGVsKQptb2RlbC5hZGRFdmVudExpc3RlbmVyKGtleSxpbmZvLmxpc3RlbmVyLGluZm8udGhpc09iamVjdCk7fX0KcmV0dXJuIHRhcmdldDt9Cl9vYnNlcnZlcnNGb3JUYXJnZXQodGFyZ2V0KXtyZXR1cm4gdGhpcy5fb2JzZXJ2ZXJzLmZpbHRlcihvYnNlcnZlcj0+dGFyZ2V0Lmhhc0FsbENhcGFiaWxpdGllcyhvYnNlcnZlclt0aGlzLl9vYnNlcnZlckNhcGFiaWxpZXNNYXNrU3ltYm9sXXx8MCkpO30KcmVtb3ZlVGFyZ2V0KHRhcmdldCl7aWYoIXRoaXMuX3RhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkKcmV0dXJuO3RoaXMuX3RhcmdldHMucmVtb3ZlKHRhcmdldCk7Zm9yKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgdGFyZ2V0Lm1vZGVscygpLmtleXMoKSkKdGhpcy5fbW9kZWxSZW1vdmVkKHRhcmdldCxtb2RlbENsYXNzLHRhcmdldC5tb2RlbHMoKS5nZXQobW9kZWxDbGFzcykpO2NvbnN0IGNvcHk9dGhpcy5fb2JzZXJ2ZXJzRm9yVGFyZ2V0KHRhcmdldCk7Zm9yKGxldCBpPTA7aTxjb3B5Lmxlbmd0aDsrK2kpCmNvcHlbaV0udGFyZ2V0UmVtb3ZlZCh0YXJnZXQpO2Zvcihjb25zdCBrZXkgb2YgdGhpcy5fbW9kZWxMaXN0ZW5lcnMua2V5c0FycmF5KCkpe2Zvcihjb25zdCBpbmZvIG9mIHRoaXMuX21vZGVsTGlzdGVuZXJzLmdldChrZXkpKXtjb25zdCBtb2RlbD10YXJnZXQubW9kZWwoaW5mby5tb2RlbENsYXNzKTtpZihtb2RlbCkKbW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihrZXksaW5mby5saXN0ZW5lcixpbmZvLnRoaXNPYmplY3QpO319fQp0YXJnZXRzKGNhcGFiaWxpdGllc01hc2spe2lmKCFjYXBhYmlsaXRpZXNNYXNrKQpyZXR1cm4gdGhpcy5fdGFyZ2V0cy5zbGljZSgpO2Vsc2UKcmV0dXJuIHRoaXMuX3RhcmdldHMuZmlsdGVyKHRhcmdldD0+dGFyZ2V0Lmhhc0FsbENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXNNYXNrfHwwKSk7fQp0YXJnZXRCeUlkKGlkKXtmb3IobGV0IGk9MDtpPHRoaXMuX3RhcmdldHMubGVuZ3RoOysraSl7aWYodGhpcy5fdGFyZ2V0c1tpXS5pZCgpPT09aWQpCnJldHVybiB0aGlzLl90YXJnZXRzW2ldO30KcmV0dXJuIG51bGw7fQptYWluVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX3RhcmdldHNbMF18fG51bGw7fX07U0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzPXtBdmFpbGFibGVUYXJnZXRzQ2hhbmdlZDpTeW1ib2woJ0F2YWlsYWJsZVRhcmdldHNDaGFuZ2VkJyksSW5zcGVjdGVkVVJMQ2hhbmdlZDpTeW1ib2woJ0luc3BlY3RlZFVSTENoYW5nZWQnKSxOYW1lQ2hhbmdlZDpTeW1ib2woJ05hbWVDaGFuZ2VkJyksU3VzcGVuZFN0YXRlQ2hhbmdlZDpTeW1ib2woJ1N1c3BlbmRTdGF0ZUNoYW5nZWQnKX07U0RLLlRhcmdldE1hbmFnZXIuT2JzZXJ2ZXI9ZnVuY3Rpb24oKXt9O1NESy5UYXJnZXRNYW5hZ2VyLk9ic2VydmVyLnByb3RvdHlwZT17dGFyZ2V0QWRkZWQodGFyZ2V0KXt9LHRhcmdldFJlbW92ZWQodGFyZ2V0KXt9LH07U0RLLlNES01vZGVsT2JzZXJ2ZXI9ZnVuY3Rpb24oKXt9O1NESy5TREtNb2RlbE9ic2VydmVyLnByb3RvdHlwZT17bW9kZWxBZGRlZChtb2RlbCl7fSxtb2RlbFJlbW92ZWQobW9kZWwpe30sfTtTREsudGFyZ2V0TWFuYWdlcj1uZXcgU0RLLlRhcmdldE1hbmFnZXIoKTs7U0RLLk1haW5Db25uZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHBhcmFtcyl7dGhpcy5fb25NZXNzYWdlPXBhcmFtcy5vbk1lc3NhZ2U7dGhpcy5fb25EaXNjb25uZWN0PXBhcmFtcy5vbkRpc2Nvbm5lY3Q7dGhpcy5fZGlzY29ubmVjdGVkPWZhbHNlO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5EaXNwYXRjaE1lc3NhZ2UsdGhpcy5fZGlzcGF0Y2hNZXNzYWdlLHRoaXMpLEluc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRpc3BhdGNoTWVzc2FnZUNodW5rLHRoaXMuX2Rpc3BhdGNoTWVzc2FnZUNodW5rLHRoaXMpLF07fQpzZW5kTWVzc2FnZShtZXNzYWdlKXtpZighdGhpcy5fZGlzY29ubmVjdGVkKQpJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2VuZE1lc3NhZ2VUb0JhY2tlbmQobWVzc2FnZSk7fQpfZGlzcGF0Y2hNZXNzYWdlKGV2ZW50KXt0aGlzLl9vbk1lc3NhZ2UuY2FsbChudWxsLChldmVudC5kYXRhKSk7fQpfZGlzcGF0Y2hNZXNzYWdlQ2h1bmsoZXZlbnQpe2NvbnN0IG1lc3NhZ2VDaHVuaz0oZXZlbnQuZGF0YVsnbWVzc2FnZUNodW5rJ10pO2NvbnN0IG1lc3NhZ2VTaXplPShldmVudC5kYXRhWydtZXNzYWdlU2l6ZSddKTtpZihtZXNzYWdlU2l6ZSl7dGhpcy5fbWVzc2FnZUJ1ZmZlcj0nJzt0aGlzLl9tZXNzYWdlU2l6ZT1tZXNzYWdlU2l6ZTt9CnRoaXMuX21lc3NhZ2VCdWZmZXIrPW1lc3NhZ2VDaHVuaztpZih0aGlzLl9tZXNzYWdlQnVmZmVyLmxlbmd0aD09PXRoaXMuX21lc3NhZ2VTaXplKXt0aGlzLl9vbk1lc3NhZ2UuY2FsbChudWxsLHRoaXMuX21lc3NhZ2VCdWZmZXIpO3RoaXMuX21lc3NhZ2VCdWZmZXI9Jyc7dGhpcy5fbWVzc2FnZVNpemU9MDt9fQpkaXNjb25uZWN0KCl7Y29uc3Qgb25EaXNjb25uZWN0PXRoaXMuX29uRGlzY29ubmVjdDtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO3RoaXMuX29uRGlzY29ubmVjdD1udWxsO3RoaXMuX29uTWVzc2FnZT1udWxsO3RoaXMuX2Rpc2Nvbm5lY3RlZD10cnVlO2xldCBmdWxmaWxsO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UoZj0+ZnVsZmlsbD1mKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QucmVhdHRhY2goKCk9PntvbkRpc2Nvbm5lY3QuY2FsbChudWxsLCdmb3JjZSBkaXNjb25uZWN0Jyk7ZnVsZmlsbCgpO30pO3JldHVybiBwcm9taXNlO319O1NESy5XZWJTb2NrZXRDb25uZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHVybCxvbldlYlNvY2tldERpc2Nvbm5lY3QscGFyYW1zKXt0aGlzLl9zb2NrZXQ9bmV3IFdlYlNvY2tldCh1cmwpO3RoaXMuX3NvY2tldC5vbmVycm9yPXRoaXMuX29uRXJyb3IuYmluZCh0aGlzKTt0aGlzLl9zb2NrZXQub25vcGVuPXRoaXMuX29uT3Blbi5iaW5kKHRoaXMpO3RoaXMuX3NvY2tldC5vbm1lc3NhZ2U9bWVzc2FnZUV2ZW50PT5wYXJhbXMub25NZXNzYWdlLmNhbGwobnVsbCwobWVzc2FnZUV2ZW50LmRhdGEpKTt0aGlzLl9zb2NrZXQub25jbG9zZT10aGlzLl9vbkNsb3NlLmJpbmQodGhpcyk7dGhpcy5fb25EaXNjb25uZWN0PXBhcmFtcy5vbkRpc2Nvbm5lY3Q7dGhpcy5fb25XZWJTb2NrZXREaXNjb25uZWN0PW9uV2ViU29ja2V0RGlzY29ubmVjdDt0aGlzLl9jb25uZWN0ZWQ9ZmFsc2U7dGhpcy5fbWVzc2FnZXM9W107fQpfb25FcnJvcigpe3RoaXMuX29uV2ViU29ja2V0RGlzY29ubmVjdC5jYWxsKG51bGwpO3RoaXMuX29uRGlzY29ubmVjdC5jYWxsKG51bGwsJ2Nvbm5lY3Rpb24gZmFpbGVkJyk7dGhpcy5fY2xvc2UoKTt9Cl9vbk9wZW4oKXt0aGlzLl9zb2NrZXQub25lcnJvcj1jb25zb2xlLmVycm9yO3RoaXMuX2Nvbm5lY3RlZD10cnVlO2Zvcihjb25zdCBtZXNzYWdlIG9mIHRoaXMuX21lc3NhZ2VzKQp0aGlzLl9zb2NrZXQuc2VuZChtZXNzYWdlKTt0aGlzLl9tZXNzYWdlcz1bXTt9Cl9vbkNsb3NlKCl7dGhpcy5fb25XZWJTb2NrZXREaXNjb25uZWN0LmNhbGwobnVsbCk7dGhpcy5fb25EaXNjb25uZWN0LmNhbGwobnVsbCwnd2Vic29ja2V0IGNsb3NlZCcpO3RoaXMuX2Nsb3NlKCk7fQpfY2xvc2UoY2FsbGJhY2spe3RoaXMuX3NvY2tldC5vbmVycm9yPW51bGw7dGhpcy5fc29ja2V0Lm9ub3Blbj1udWxsO3RoaXMuX3NvY2tldC5vbmNsb3NlPWNhbGxiYWNrfHxudWxsO3RoaXMuX3NvY2tldC5vbm1lc3NhZ2U9bnVsbDt0aGlzLl9zb2NrZXQuY2xvc2UoKTt0aGlzLl9zb2NrZXQ9bnVsbDt0aGlzLl9vbldlYlNvY2tldERpc2Nvbm5lY3Q9bnVsbDt9CnNlbmRNZXNzYWdlKG1lc3NhZ2Upe2lmKHRoaXMuX2Nvbm5lY3RlZCkKdGhpcy5fc29ja2V0LnNlbmQobWVzc2FnZSk7ZWxzZQp0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO30KZGlzY29ubmVjdCgpe2xldCBmdWxmaWxsO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UoZj0+ZnVsZmlsbD1mKTt0aGlzLl9jbG9zZSgoKT0+e3RoaXMuX29uRGlzY29ubmVjdC5jYWxsKG51bGwsJ2ZvcmNlIGRpc2Nvbm5lY3QnKTtmdWxmaWxsKCk7fSk7cmV0dXJuIHByb21pc2U7fX07U0RLLlN0dWJDb25uZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHBhcmFtcyl7dGhpcy5fb25NZXNzYWdlPXBhcmFtcy5vbk1lc3NhZ2U7dGhpcy5fb25EaXNjb25uZWN0PXBhcmFtcy5vbkRpc2Nvbm5lY3Q7fQpzZW5kTWVzc2FnZShtZXNzYWdlKXtzZXRUaW1lb3V0KHRoaXMuX3Jlc3BvbmRXaXRoRXJyb3IuYmluZCh0aGlzLG1lc3NhZ2UpLDApO30KX3Jlc3BvbmRXaXRoRXJyb3IobWVzc2FnZSl7Y29uc3QgbWVzc2FnZU9iamVjdD1KU09OLnBhcnNlKG1lc3NhZ2UpO2NvbnN0IGVycm9yPXttZXNzYWdlOidUaGlzIGlzIGEgc3R1YiBjb25uZWN0aW9uLCBjYW5cJ3QgZGlzcGF0Y2ggbWVzc2FnZS4nLGNvZGU6UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5EZXZUb29sc1N0dWJFcnJvckNvZGUsZGF0YTptZXNzYWdlT2JqZWN0fTt0aGlzLl9vbk1lc3NhZ2UuY2FsbChudWxsLHtpZDptZXNzYWdlT2JqZWN0LmlkLGVycm9yOmVycm9yfSk7fQpkaXNjb25uZWN0KCl7dGhpcy5fb25EaXNjb25uZWN0LmNhbGwobnVsbCwnZm9yY2UgZGlzY29ubmVjdCcpO3RoaXMuX29uRGlzY29ubmVjdD1udWxsO3RoaXMuX29uTWVzc2FnZT1udWxsO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9fTtTREsuQ2hpbGRDb25uZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKGFnZW50LHNlc3Npb25JZCxwYXJhbXMpe3RoaXMuX2FnZW50PWFnZW50O3RoaXMuX3Nlc3Npb25JZD1zZXNzaW9uSWQ7dGhpcy5vbk1lc3NhZ2U9cGFyYW1zLm9uTWVzc2FnZTt0aGlzLm9uRGlzY29ubmVjdD1wYXJhbXMub25EaXNjb25uZWN0O30Kc2VuZE1lc3NhZ2UobWVzc2FnZSl7dGhpcy5fYWdlbnQuc2VuZE1lc3NhZ2VUb1RhcmdldChtZXNzYWdlLHRoaXMuX3Nlc3Npb25JZCk7fQpkaXNjb25uZWN0KCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9fTtTREsuY3JlYXRlTWFpbkNvbm5lY3Rpb249ZnVuY3Rpb24ocGFyYW1zLGNvbm5lY3Rpb25Mb3N0Q2FsbGJhY2spe2NvbnN0IHdzUGFyYW09UnVudGltZS5xdWVyeVBhcmFtKCd3cycpO2NvbnN0IHdzc1BhcmFtPVJ1bnRpbWUucXVlcnlQYXJhbSgnd3NzJyk7aWYod3NQYXJhbXx8d3NzUGFyYW0pe2NvbnN0IHdzPXdzUGFyYW0/YHdzOi8vJHt3c1BhcmFtfWA6YHdzczovLyR7d3NzUGFyYW19YDtyZXR1cm4gbmV3IFNESy5XZWJTb2NrZXRDb25uZWN0aW9uKHdzLGNvbm5lY3Rpb25Mb3N0Q2FsbGJhY2sscGFyYW1zKTt9CmlmKEluc3BlY3RvckZyb250ZW5kSG9zdC5pc0hvc3RlZE1vZGUoKSkKcmV0dXJuIG5ldyBTREsuU3R1YkNvbm5lY3Rpb24ocGFyYW1zKTtyZXR1cm4gbmV3IFNESy5NYWluQ29ubmVjdGlvbihwYXJhbXMpO307O1NESy5Db21waWxlclNvdXJjZU1hcHBpbmdDb250ZW50UHJvdmlkZXI9Y2xhc3N7Y29uc3RydWN0b3Ioc291cmNlVVJMLGNvbnRlbnRUeXBlKXt0aGlzLl9zb3VyY2VVUkw9c291cmNlVVJMO3RoaXMuX2NvbnRlbnRUeXBlPWNvbnRlbnRUeXBlO30KY29udGVudFVSTCgpe3JldHVybiB0aGlzLl9zb3VyY2VVUkw7fQpjb250ZW50VHlwZSgpe3JldHVybiB0aGlzLl9jb250ZW50VHlwZTt9CmNvbnRlbnRFbmNvZGVkKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7fQpyZXF1ZXN0Q29udGVudCgpe2xldCBjYWxsYmFjaztjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9PmNhbGxiYWNrPWZ1bGZpbGwpO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmxvYWRSZXNvdXJjZSh0aGlzLl9zb3VyY2VVUkwsY29udGVudExvYWRlZC5iaW5kKHRoaXMpKTtyZXR1cm4gcHJvbWlzZTtmdW5jdGlvbiBjb250ZW50TG9hZGVkKHN0YXR1c0NvZGUsaGVhZGVycyxjb250ZW50KXtpZihzdGF0dXNDb2RlPj00MDApe2NvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGNvbnRlbnQgZm9yICcrdGhpcy5fc291cmNlVVJMKycgOiAnKydIVFRQIHN0YXR1cyBjb2RlOiAnK3N0YXR1c0NvZGUpO2NhbGxiYWNrKG51bGwpO3JldHVybjt9CmNhbGxiYWNrKGNvbnRlbnQpO319CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgdGhpcy5yZXF1ZXN0Q29udGVudCgpO2lmKHR5cGVvZiBjb250ZW50IT09J3N0cmluZycpCnJldHVybltdO3JldHVybiBDb21tb24uQ29udGVudFByb3ZpZGVyLnBlcmZvcm1TZWFyY2hJbkNvbnRlbnQoY29udGVudCxxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpO319OztTREsuQ29va2llTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO30Kc3RhdGljIF9wYXJzZVByb3RvY29sQ29va2llKHByb3RvY29sQ29va2llKXtjb25zdCBjb29raWU9bmV3IFNESy5Db29raWUocHJvdG9jb2xDb29raWUubmFtZSxwcm90b2NvbENvb2tpZS52YWx1ZSxudWxsKTtjb29raWUuYWRkQXR0cmlidXRlKCdkb21haW4nLHByb3RvY29sQ29va2llWydkb21haW4nXSk7Y29va2llLmFkZEF0dHJpYnV0ZSgncGF0aCcscHJvdG9jb2xDb29raWVbJ3BhdGgnXSk7Y29va2llLmFkZEF0dHJpYnV0ZSgncG9ydCcscHJvdG9jb2xDb29raWVbJ3BvcnQnXSk7aWYocHJvdG9jb2xDb29raWVbJ2V4cGlyZXMnXSkKY29va2llLmFkZEF0dHJpYnV0ZSgnZXhwaXJlcycscHJvdG9jb2xDb29raWVbJ2V4cGlyZXMnXSoxMDAwKTtpZihwcm90b2NvbENvb2tpZVsnaHR0cE9ubHknXSkKY29va2llLmFkZEF0dHJpYnV0ZSgnaHR0cE9ubHknKTtpZihwcm90b2NvbENvb2tpZVsnc2VjdXJlJ10pCmNvb2tpZS5hZGRBdHRyaWJ1dGUoJ3NlY3VyZScpO2lmKHByb3RvY29sQ29va2llWydzYW1lU2l0ZSddKQpjb29raWUuYWRkQXR0cmlidXRlKCdzYW1lU2l0ZScscHJvdG9jb2xDb29raWVbJ3NhbWVTaXRlJ10pO2Nvb2tpZS5zZXRTaXplKHByb3RvY29sQ29va2llWydzaXplJ10pO3JldHVybiBjb29raWU7fQpzdGF0aWMgY29va2llTWF0Y2hlc1Jlc291cmNlVVJMKGNvb2tpZSxyZXNvdXJjZVVSTCl7Y29uc3QgdXJsPXJlc291cmNlVVJMLmFzUGFyc2VkVVJMKCk7aWYoIXVybHx8IVNESy5Db29raWVNb2RlbC5jb29raWVEb21haW5NYXRjaGVzUmVzb3VyY2VEb21haW4oY29va2llLmRvbWFpbigpLHVybC5ob3N0KSkKcmV0dXJuIGZhbHNlO3JldHVybih1cmwucGF0aC5zdGFydHNXaXRoKGNvb2tpZS5wYXRoKCkpJiYoIWNvb2tpZS5wb3J0KCl8fHVybC5wb3J0PT09Y29va2llLnBvcnQoKSkmJighY29va2llLnNlY3VyZSgpfHx1cmwuc2NoZW1lPT09J2h0dHBzJykpO30Kc3RhdGljIGNvb2tpZURvbWFpbk1hdGNoZXNSZXNvdXJjZURvbWFpbihjb29raWVEb21haW4scmVzb3VyY2VEb21haW4pe2lmKGNvb2tpZURvbWFpbi5jaGFyQXQoMCkhPT0nLicpCnJldHVybiByZXNvdXJjZURvbWFpbj09PWNvb2tpZURvbWFpbjtyZXR1cm4hIXJlc291cmNlRG9tYWluLm1hdGNoKG5ldyBSZWdFeHAoJ14oW15cXC5dK1xcLikqJytjb29raWVEb21haW4uc3Vic3RyaW5nKDEpLmVzY2FwZUZvclJlZ0V4cCgpKyckJywnaScpKTt9CmdldENvb2tpZXModXJscyl7cmV0dXJuIHRoaXMudGFyZ2V0KCkubmV0d29ya0FnZW50KCkuZ2V0Q29va2llcyh1cmxzKS50aGVuKGNvb2tpZXM9Pihjb29raWVzfHxbXSkubWFwKGNvb2tpZT0+U0RLLkNvb2tpZU1vZGVsLl9wYXJzZVByb3RvY29sQ29va2llKGNvb2tpZSkpKTt9CmRlbGV0ZUNvb2tpZShjb29raWUsY2FsbGJhY2spe3RoaXMuX2RlbGV0ZUFsbChbY29va2llXSxjYWxsYmFjayk7fQpjbGVhcihkb21haW4sY2FsbGJhY2spe3RoaXMuZ2V0Q29va2llc0ZvckRvbWFpbihkb21haW58fG51bGwpLnRoZW4oY29va2llcz0+dGhpcy5fZGVsZXRlQWxsKGNvb2tpZXMsY2FsbGJhY2spKTt9CnNhdmVDb29raWUoY29va2llKXtsZXQgZG9tYWluPWNvb2tpZS5kb21haW4oKTtpZighZG9tYWluLnN0YXJ0c1dpdGgoJy4nKSkKZG9tYWluPScnO2xldCBleHBpcmVzPXVuZGVmaW5lZDtpZihjb29raWUuZXhwaXJlcygpKQpleHBpcmVzPU1hdGguZmxvb3IoRGF0ZS5wYXJzZShjb29raWUuZXhwaXJlcygpKS8xMDAwKTtyZXR1cm4gdGhpcy50YXJnZXQoKS5uZXR3b3JrQWdlbnQoKS5zZXRDb29raWUoY29va2llLm5hbWUoKSxjb29raWUudmFsdWUoKSxjb29raWUudXJsKCksZG9tYWluLGNvb2tpZS5wYXRoKCksY29va2llLnNlY3VyZSgpLGNvb2tpZS5odHRwT25seSgpLGNvb2tpZS5zYW1lU2l0ZSgpLGV4cGlyZXMpLnRoZW4oc3VjY2Vzcz0+ISFzdWNjZXNzKTt9CmdldENvb2tpZXNGb3JEb21haW4oZG9tYWluKXtjb25zdCByZXNvdXJjZVVSTHM9W107ZnVuY3Rpb24gcG9wdWxhdGVSZXNvdXJjZVVSTHMocmVzb3VyY2Upe2NvbnN0IHVybD1yZXNvdXJjZS5kb2N1bWVudFVSTC5hc1BhcnNlZFVSTCgpO2lmKHVybCYmKCFkb21haW58fHVybC5zZWN1cml0eU9yaWdpbigpPT09ZG9tYWluKSkKcmVzb3VyY2VVUkxzLnB1c2gocmVzb3VyY2UudXJsKTt9CmNvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRoaXMudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZihyZXNvdXJjZVRyZWVNb2RlbCkKcmVzb3VyY2VUcmVlTW9kZWwuZm9yQWxsUmVzb3VyY2VzKHBvcHVsYXRlUmVzb3VyY2VVUkxzKTtyZXR1cm4gdGhpcy5nZXRDb29raWVzKHJlc291cmNlVVJMcyk7fQpfZGVsZXRlQWxsKGNvb2tpZXMsY2FsbGJhY2spe2NvbnN0IG5ldHdvcmtBZ2VudD10aGlzLnRhcmdldCgpLm5ldHdvcmtBZ2VudCgpO1Byb21pc2UuYWxsKGNvb2tpZXMubWFwKGNvb2tpZT0+bmV0d29ya0FnZW50LmRlbGV0ZUNvb2tpZXMoY29va2llLm5hbWUoKSx1bmRlZmluZWQsY29va2llLmRvbWFpbigpLGNvb2tpZS5wYXRoKCkpKSkudGhlbihjYWxsYmFja3x8ZnVuY3Rpb24oKXt9KTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLkNvb2tpZU1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5OZXR3b3JrLGZhbHNlKTs7U0RLLkNvb2tpZVBhcnNlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe30Kc3RhdGljIHBhcnNlQ29va2llKGhlYWRlcil7cmV0dXJuKG5ldyBTREsuQ29va2llUGFyc2VyKCkpLnBhcnNlQ29va2llKGhlYWRlcik7fQpzdGF0aWMgcGFyc2VTZXRDb29raWUoaGVhZGVyKXtyZXR1cm4obmV3IFNESy5Db29raWVQYXJzZXIoKSkucGFyc2VTZXRDb29raWUoaGVhZGVyKTt9CmNvb2tpZXMoKXtyZXR1cm4gdGhpcy5fY29va2llczt9CnBhcnNlQ29va2llKGNvb2tpZUhlYWRlcil7aWYoIXRoaXMuX2luaXRpYWxpemUoY29va2llSGVhZGVyKSkKcmV0dXJuIG51bGw7Zm9yKGxldCBrdj10aGlzLl9leHRyYWN0S2V5VmFsdWUoKTtrdjtrdj10aGlzLl9leHRyYWN0S2V5VmFsdWUoKSl7aWYoa3Yua2V5LmNoYXJBdCgwKT09PSckJyYmdGhpcy5fbGFzdENvb2tpZSkKdGhpcy5fbGFzdENvb2tpZS5hZGRBdHRyaWJ1dGUoa3Yua2V5LnNsaWNlKDEpLGt2LnZhbHVlKTtlbHNlIGlmKGt2LmtleS50b0xvd2VyQ2FzZSgpIT09JyR2ZXJzaW9uJyYmdHlwZW9mIGt2LnZhbHVlPT09J3N0cmluZycpCnRoaXMuX2FkZENvb2tpZShrdixTREsuQ29va2llLlR5cGUuUmVxdWVzdCk7dGhpcy5fYWR2YW5jZUFuZENoZWNrQ29va2llRGVsaW1pdGVyKCk7fQp0aGlzLl9mbHVzaENvb2tpZSgpO3JldHVybiB0aGlzLl9jb29raWVzO30KcGFyc2VTZXRDb29raWUoc2V0Q29va2llSGVhZGVyKXtpZighdGhpcy5faW5pdGlhbGl6ZShzZXRDb29raWVIZWFkZXIpKQpyZXR1cm4gbnVsbDtmb3IobGV0IGt2PXRoaXMuX2V4dHJhY3RLZXlWYWx1ZSgpO2t2O2t2PXRoaXMuX2V4dHJhY3RLZXlWYWx1ZSgpKXtpZih0aGlzLl9sYXN0Q29va2llKQp0aGlzLl9sYXN0Q29va2llLmFkZEF0dHJpYnV0ZShrdi5rZXksa3YudmFsdWUpO2Vsc2UKdGhpcy5fYWRkQ29va2llKGt2LFNESy5Db29raWUuVHlwZS5SZXNwb25zZSk7aWYodGhpcy5fYWR2YW5jZUFuZENoZWNrQ29va2llRGVsaW1pdGVyKCkpCnRoaXMuX2ZsdXNoQ29va2llKCk7fQp0aGlzLl9mbHVzaENvb2tpZSgpO3JldHVybiB0aGlzLl9jb29raWVzO30KX2luaXRpYWxpemUoaGVhZGVyVmFsdWUpe3RoaXMuX2lucHV0PWhlYWRlclZhbHVlO2lmKHR5cGVvZiBoZWFkZXJWYWx1ZSE9PSdzdHJpbmcnKQpyZXR1cm4gZmFsc2U7dGhpcy5fY29va2llcz1bXTt0aGlzLl9sYXN0Q29va2llPW51bGw7dGhpcy5fb3JpZ2luYWxJbnB1dExlbmd0aD10aGlzLl9pbnB1dC5sZW5ndGg7cmV0dXJuIHRydWU7fQpfZmx1c2hDb29raWUoKXtpZih0aGlzLl9sYXN0Q29va2llKQp0aGlzLl9sYXN0Q29va2llLnNldFNpemUodGhpcy5fb3JpZ2luYWxJbnB1dExlbmd0aC10aGlzLl9pbnB1dC5sZW5ndGgtdGhpcy5fbGFzdENvb2tpZVBvc2l0aW9uKTt0aGlzLl9sYXN0Q29va2llPW51bGw7fQpfZXh0cmFjdEtleVZhbHVlKCl7aWYoIXRoaXMuX2lucHV0fHwhdGhpcy5faW5wdXQubGVuZ3RoKQpyZXR1cm4gbnVsbDtjb25zdCBrZXlWYWx1ZU1hdGNoPS9eWyBcdF0qKFteXHM9O10rKVsgXHRdKig/Oj1bIFx0XSooW147XG5dKikpPy8uZXhlYyh0aGlzLl9pbnB1dCk7aWYoIWtleVZhbHVlTWF0Y2gpe2NvbnNvbGUuZXJyb3IoJ0ZhaWxlZCBwYXJzaW5nIGNvb2tpZSBoZWFkZXIgYmVmb3JlOiAnK3RoaXMuX2lucHV0KTtyZXR1cm4gbnVsbDt9CmNvbnN0IHJlc3VsdD1uZXcgU0RLLkNvb2tpZVBhcnNlci5LZXlWYWx1ZShrZXlWYWx1ZU1hdGNoWzFdLGtleVZhbHVlTWF0Y2hbMl0mJmtleVZhbHVlTWF0Y2hbMl0udHJpbSgpLHRoaXMuX29yaWdpbmFsSW5wdXRMZW5ndGgtdGhpcy5faW5wdXQubGVuZ3RoKTt0aGlzLl9pbnB1dD10aGlzLl9pbnB1dC5zbGljZShrZXlWYWx1ZU1hdGNoWzBdLmxlbmd0aCk7cmV0dXJuIHJlc3VsdDt9Cl9hZHZhbmNlQW5kQ2hlY2tDb29raWVEZWxpbWl0ZXIoKXtjb25zdCBtYXRjaD0vXlxzKltcbjtdXHMqLy5leGVjKHRoaXMuX2lucHV0KTtpZighbWF0Y2gpCnJldHVybiBmYWxzZTt0aGlzLl9pbnB1dD10aGlzLl9pbnB1dC5zbGljZShtYXRjaFswXS5sZW5ndGgpO3JldHVybiBtYXRjaFswXS5tYXRjaCgnXG4nKSE9PW51bGw7fQpfYWRkQ29va2llKGtleVZhbHVlLHR5cGUpe2lmKHRoaXMuX2xhc3RDb29raWUpCnRoaXMuX2xhc3RDb29raWUuc2V0U2l6ZShrZXlWYWx1ZS5wb3NpdGlvbi10aGlzLl9sYXN0Q29va2llUG9zaXRpb24pO3RoaXMuX2xhc3RDb29raWU9dHlwZW9mIGtleVZhbHVlLnZhbHVlPT09J3N0cmluZyc/bmV3IFNESy5Db29raWUoa2V5VmFsdWUua2V5LGtleVZhbHVlLnZhbHVlLHR5cGUpOm5ldyBTREsuQ29va2llKCcnLGtleVZhbHVlLmtleSx0eXBlKTt0aGlzLl9sYXN0Q29va2llUG9zaXRpb249a2V5VmFsdWUucG9zaXRpb247dGhpcy5fY29va2llcy5wdXNoKHRoaXMuX2xhc3RDb29raWUpO319O1NESy5Db29raWVQYXJzZXIuS2V5VmFsdWU9Y2xhc3N7Y29uc3RydWN0b3Ioa2V5LHZhbHVlLHBvc2l0aW9uKXt0aGlzLmtleT1rZXk7dGhpcy52YWx1ZT12YWx1ZTt0aGlzLnBvc2l0aW9uPXBvc2l0aW9uO319O1NESy5Db29raWU9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSx2YWx1ZSx0eXBlKXt0aGlzLl9uYW1lPW5hbWU7dGhpcy5fdmFsdWU9dmFsdWU7dGhpcy5fdHlwZT10eXBlO3RoaXMuX2F0dHJpYnV0ZXM9e307dGhpcy5fc2l6ZT0wO30KbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lO30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWU7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpodHRwT25seSgpe3JldHVybidodHRwb25seSdpbiB0aGlzLl9hdHRyaWJ1dGVzO30Kc2VjdXJlKCl7cmV0dXJuJ3NlY3VyZSdpbiB0aGlzLl9hdHRyaWJ1dGVzO30Kc2FtZVNpdGUoKXtyZXR1cm4odGhpcy5fYXR0cmlidXRlc1snc2FtZXNpdGUnXSk7fQpzZXNzaW9uKCl7cmV0dXJuISgnZXhwaXJlcydpbiB0aGlzLl9hdHRyaWJ1dGVzfHwnbWF4LWFnZSdpbiB0aGlzLl9hdHRyaWJ1dGVzKTt9CnBhdGgoKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlc1sncGF0aCddO30KcG9ydCgpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVzWydwb3J0J107fQpkb21haW4oKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlc1snZG9tYWluJ107fQpleHBpcmVzKCl7cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbJ2V4cGlyZXMnXTt9Cm1heEFnZSgpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVzWydtYXgtYWdlJ107fQpzaXplKCl7cmV0dXJuIHRoaXMuX3NpemU7fQp1cmwoKXtyZXR1cm4odGhpcy5zZWN1cmUoKT8naHR0cHM6Ly8nOidodHRwOi8vJykrdGhpcy5kb21haW4oKSt0aGlzLnBhdGgoKTt9CnNldFNpemUoc2l6ZSl7dGhpcy5fc2l6ZT1zaXplO30KZXhwaXJlc0RhdGUocmVxdWVzdERhdGUpe2lmKHRoaXMubWF4QWdlKCkpe2NvbnN0IHRhcmdldERhdGU9cmVxdWVzdERhdGU9PT1udWxsP25ldyBEYXRlKCk6cmVxdWVzdERhdGU7cmV0dXJuIG5ldyBEYXRlKHRhcmdldERhdGUuZ2V0VGltZSgpKzEwMDAqdGhpcy5tYXhBZ2UoKSk7fQppZih0aGlzLmV4cGlyZXMoKSkKcmV0dXJuIG5ldyBEYXRlKHRoaXMuZXhwaXJlcygpKTtyZXR1cm4gbnVsbDt9CmF0dHJpYnV0ZXMoKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlczt9CmFkZEF0dHJpYnV0ZShrZXksdmFsdWUpe3RoaXMuX2F0dHJpYnV0ZXNba2V5LnRvTG93ZXJDYXNlKCldPXZhbHVlO319O1NESy5Db29raWUuVHlwZT17UmVxdWVzdDowLFJlc3BvbnNlOjF9OztTREsuUHJvZmlsZU5vZGU9Y2xhc3N7Y29uc3RydWN0b3IoY2FsbEZyYW1lKXt0aGlzLmNhbGxGcmFtZT1jYWxsRnJhbWU7dGhpcy5jYWxsVUlEPWAke2NhbGxGcmFtZS5mdW5jdGlvbk5hbWV9QCR7Y2FsbEZyYW1lLnNjcmlwdElkfToke2NhbGxGcmFtZS5saW5lTnVtYmVyfToke2NhbGxGcmFtZS5jb2x1bW5OdW1iZXJ9YDt0aGlzLnNlbGY9MDt0aGlzLnRvdGFsPTA7dGhpcy5pZD0wO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt9CmdldCBmdW5jdGlvbk5hbWUoKXtyZXR1cm4gdGhpcy5jYWxsRnJhbWUuZnVuY3Rpb25OYW1lO30KZ2V0IHNjcmlwdElkKCl7cmV0dXJuIHRoaXMuY2FsbEZyYW1lLnNjcmlwdElkO30KZ2V0IHVybCgpe3JldHVybiB0aGlzLmNhbGxGcmFtZS51cmw7fQpnZXQgbGluZU51bWJlcigpe3JldHVybiB0aGlzLmNhbGxGcmFtZS5saW5lTnVtYmVyO30KZ2V0IGNvbHVtbk51bWJlcigpe3JldHVybiB0aGlzLmNhbGxGcmFtZS5jb2x1bW5OdW1iZXI7fX07U0RLLlByb2ZpbGVUcmVlTW9kZWw9Y2xhc3N7aW5pdGlhbGl6ZShyb290KXt0aGlzLnJvb3Q9cm9vdDt0aGlzLl9hc3NpZ25EZXB0aHNBbmRQYXJlbnRzKCk7dGhpcy50b3RhbD10aGlzLl9jYWxjdWxhdGVUb3RhbHModGhpcy5yb290KTt9Cl9hc3NpZ25EZXB0aHNBbmRQYXJlbnRzKCl7Y29uc3Qgcm9vdD10aGlzLnJvb3Q7cm9vdC5kZXB0aD0tMTtyb290LnBhcmVudD1udWxsO3RoaXMubWF4RGVwdGg9MDtjb25zdCBub2Rlc1RvVHJhdmVyc2U9W3Jvb3RdO3doaWxlKG5vZGVzVG9UcmF2ZXJzZS5sZW5ndGgpe2NvbnN0IHBhcmVudD1ub2Rlc1RvVHJhdmVyc2UucG9wKCk7Y29uc3QgZGVwdGg9cGFyZW50LmRlcHRoKzE7aWYoZGVwdGg+dGhpcy5tYXhEZXB0aCkKdGhpcy5tYXhEZXB0aD1kZXB0aDtjb25zdCBjaGlsZHJlbj1wYXJlbnQuY2hpbGRyZW47Y29uc3QgbGVuZ3RoPWNoaWxkcmVuLmxlbmd0aDtmb3IobGV0IGk9MDtpPGxlbmd0aDsrK2kpe2NvbnN0IGNoaWxkPWNoaWxkcmVuW2ldO2NoaWxkLmRlcHRoPWRlcHRoO2NoaWxkLnBhcmVudD1wYXJlbnQ7aWYoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKQpub2Rlc1RvVHJhdmVyc2UucHVzaChjaGlsZCk7fX19Cl9jYWxjdWxhdGVUb3RhbHMocm9vdCl7Y29uc3Qgbm9kZXNUb1RyYXZlcnNlPVtyb290XTtjb25zdCBkZnNMaXN0PVtdO3doaWxlKG5vZGVzVG9UcmF2ZXJzZS5sZW5ndGgpe2NvbnN0IG5vZGU9bm9kZXNUb1RyYXZlcnNlLnBvcCgpO25vZGUudG90YWw9bm9kZS5zZWxmO2Rmc0xpc3QucHVzaChub2RlKTtub2Rlc1RvVHJhdmVyc2UucHVzaCguLi5ub2RlLmNoaWxkcmVuKTt9CndoaWxlKGRmc0xpc3QubGVuZ3RoPjEpe2NvbnN0IG5vZGU9ZGZzTGlzdC5wb3AoKTtub2RlLnBhcmVudC50b3RhbCs9bm9kZS50b3RhbDt9CnJldHVybiByb290LnRvdGFsO319OztTREsuU2VydmVyVGltaW5nPWNsYXNze2NvbnN0cnVjdG9yKG1ldHJpYyx2YWx1ZSxkZXNjcmlwdGlvbil7dGhpcy5tZXRyaWM9bWV0cmljO3RoaXMudmFsdWU9dmFsdWU7dGhpcy5kZXNjcmlwdGlvbj1kZXNjcmlwdGlvbjt9CnN0YXRpYyBwYXJzZUhlYWRlcnMoaGVhZGVycyl7Y29uc3QgcmF3U2VydmVyVGltaW5nSGVhZGVycz1oZWFkZXJzLmZpbHRlcihpdGVtPT5pdGVtLm5hbWUudG9Mb3dlckNhc2UoKT09PSdzZXJ2ZXItdGltaW5nJyk7aWYoIXJhd1NlcnZlclRpbWluZ0hlYWRlcnMubGVuZ3RoKQpyZXR1cm4gbnVsbDtjb25zdCBzZXJ2ZXJUaW1pbmdzPXJhd1NlcnZlclRpbWluZ0hlYWRlcnMucmVkdWNlKChtZW1vLGhlYWRlcik9Pntjb25zdCB0aW1pbmc9dGhpcy5jcmVhdGVGcm9tSGVhZGVyVmFsdWUoaGVhZGVyLnZhbHVlKTttZW1vLnB1c2hBbGwodGltaW5nLm1hcChmdW5jdGlvbihlbnRyeSl7cmV0dXJuIG5ldyBTREsuU2VydmVyVGltaW5nKGVudHJ5Lm5hbWUsZW50cnkuaGFzT3duUHJvcGVydHkoJ2R1cicpP2VudHJ5LmR1cjpudWxsLGVudHJ5Lmhhc093blByb3BlcnR5KCdkZXNjJyk/ZW50cnkuZGVzYzonJyk7fSkpO3JldHVybiBtZW1vO30sW10pO3NlcnZlclRpbWluZ3Muc29ydCgoYSxiKT0+YS5tZXRyaWMudG9Mb3dlckNhc2UoKS5jb21wYXJlVG8oYi5tZXRyaWMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBzZXJ2ZXJUaW1pbmdzO30Kc3RhdGljIGNyZWF0ZUZyb21IZWFkZXJWYWx1ZSh2YWx1ZVN0cmluZyl7ZnVuY3Rpb24gdHJpbUxlYWRpbmdXaGl0ZVNwYWNlKCl7dmFsdWVTdHJpbmc9dmFsdWVTdHJpbmcucmVwbGFjZSgvXlxzKi8sJycpO30KZnVuY3Rpb24gY29uc3VtZURlbGltaXRlcihjaGFyKXtjb25zb2xlLmFzc2VydChjaGFyLmxlbmd0aD09PTEpO3RyaW1MZWFkaW5nV2hpdGVTcGFjZSgpO2lmKHZhbHVlU3RyaW5nLmNoYXJBdCgwKSE9PWNoYXIpCnJldHVybiBmYWxzZTt2YWx1ZVN0cmluZz12YWx1ZVN0cmluZy5zdWJzdHJpbmcoMSk7cmV0dXJuIHRydWU7fQpmdW5jdGlvbiBjb25zdW1lVG9rZW4oKXtjb25zdCByZXN1bHQ9L14oPzpccyopKFtcdyEjJCUmJyorXC0uXmB8fl0rKSg/OlxzKikoLiopLy5leGVjKHZhbHVlU3RyaW5nKTtpZighcmVzdWx0KQpyZXR1cm4gbnVsbDt2YWx1ZVN0cmluZz1yZXN1bHRbMl07cmV0dXJuIHJlc3VsdFsxXTt9CmZ1bmN0aW9uIGNvbnN1bWVUb2tlbk9yUXVvdGVkU3RyaW5nKCl7dHJpbUxlYWRpbmdXaGl0ZVNwYWNlKCk7aWYodmFsdWVTdHJpbmcuY2hhckF0KDApPT09JyInKQpyZXR1cm4gY29uc3VtZVF1b3RlZFN0cmluZygpO3JldHVybiBjb25zdW1lVG9rZW4oKTt9CmZ1bmN0aW9uIGNvbnN1bWVRdW90ZWRTdHJpbmcoKXtjb25zb2xlLmFzc2VydCh2YWx1ZVN0cmluZy5jaGFyQXQoMCk9PT0nIicpO3ZhbHVlU3RyaW5nPXZhbHVlU3RyaW5nLnN1YnN0cmluZygxKTtsZXQgdmFsdWU9Jyc7d2hpbGUodmFsdWVTdHJpbmcubGVuZ3RoKXtjb25zdCByZXN1bHQ9L14oW14iXFxdKikoLiopLy5leGVjKHZhbHVlU3RyaW5nKTt2YWx1ZSs9cmVzdWx0WzFdO2lmKHJlc3VsdFsyXS5jaGFyQXQoMCk9PT0nIicpe3ZhbHVlU3RyaW5nPXJlc3VsdFsyXS5zdWJzdHJpbmcoMSk7cmV0dXJuIHZhbHVlO30KY29uc29sZS5hc3NlcnQocmVzdWx0WzJdLmNoYXJBdCgwKT09PSdcXCcpO3ZhbHVlKz1yZXN1bHRbMl0uY2hhckF0KDEpO3ZhbHVlU3RyaW5nPXJlc3VsdFsyXS5zdWJzdHJpbmcoMik7fQpyZXR1cm4gbnVsbDt9CmZ1bmN0aW9uIGNvbnN1bWVFeHRyYW5lb3VzKCl7Y29uc3QgcmVzdWx0PS8oWyw7XS4qKS8uZXhlYyh2YWx1ZVN0cmluZyk7aWYocmVzdWx0KQp2YWx1ZVN0cmluZz1yZXN1bHRbMV07fQpjb25zdCByZXN1bHQ9W107bGV0IG5hbWU7d2hpbGUoKG5hbWU9Y29uc3VtZVRva2VuKCkpIT09bnVsbCl7Y29uc3QgZW50cnk9e25hbWV9O2lmKHZhbHVlU3RyaW5nLmNoYXJBdCgwKT09PSc9JykKdGhpcy5zaG93V2FybmluZyhsc2BEZXByZWNhdGVkIHN5bnRheCBmb3VuZC4gUGxlYXNlIHVzZTogPG5hbWU+O2R1cj08ZHVyYXRpb24+O2Rlc2M9PGRlc2NyaXB0aW9uPmApO3doaWxlKGNvbnN1bWVEZWxpbWl0ZXIoJzsnKSl7bGV0IHBhcmFtTmFtZTtpZigocGFyYW1OYW1lPWNvbnN1bWVUb2tlbigpKT09PW51bGwpCmNvbnRpbnVlO3BhcmFtTmFtZT1wYXJhbU5hbWUudG9Mb3dlckNhc2UoKTtjb25zdCBwYXJzZVBhcmFtZXRlcj10aGlzLmdldFBhcnNlckZvclBhcmFtZXRlcihwYXJhbU5hbWUpO2xldCBwYXJhbVZhbHVlPW51bGw7aWYoY29uc3VtZURlbGltaXRlcignPScpKXtwYXJhbVZhbHVlPWNvbnN1bWVUb2tlbk9yUXVvdGVkU3RyaW5nKCk7Y29uc3VtZUV4dHJhbmVvdXMoKTt9CmlmKHBhcnNlUGFyYW1ldGVyKXtpZihlbnRyeS5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKXt0aGlzLnNob3dXYXJuaW5nKGxzYER1cGxpY2F0ZSBwYXJhbWV0ZXIgXCIke3BhcmFtTmFtZX1cIiBpZ25vcmVkLmApO2NvbnRpbnVlO30KaWYocGFyYW1WYWx1ZT09PW51bGwpCnRoaXMuc2hvd1dhcm5pbmcobHNgTm8gdmFsdWUgZm91bmQgZm9yIHBhcmFtZXRlciBcIiR7cGFyYW1OYW1lfVwiLmApO3BhcnNlUGFyYW1ldGVyLmNhbGwodGhpcyxlbnRyeSxwYXJhbVZhbHVlKTt9ZWxzZXt0aGlzLnNob3dXYXJuaW5nKGxzYFVucmVjb2duaXplZCBwYXJhbWV0ZXIgXCIke3BhcmFtTmFtZX1cIi5gKTt9fQpyZXN1bHQucHVzaChlbnRyeSk7aWYoIWNvbnN1bWVEZWxpbWl0ZXIoJywnKSkKYnJlYWs7fQppZih2YWx1ZVN0cmluZy5sZW5ndGgpCnRoaXMuc2hvd1dhcm5pbmcobHNgRXh0cmFuZW91cyB0cmFpbGluZyBjaGFyYWN0ZXJzLmApO3JldHVybiByZXN1bHQ7fQpzdGF0aWMgZ2V0UGFyc2VyRm9yUGFyYW1ldGVyKHBhcmFtTmFtZSl7c3dpdGNoKHBhcmFtTmFtZSl7Y2FzZSdkdXInOnJldHVybiBmdW5jdGlvbihlbnRyeSxwYXJhbVZhbHVlKXtlbnRyeS5kdXI9MDtpZihwYXJhbVZhbHVlIT09bnVsbCl7Y29uc3QgZHVyYXRpb249cGFyc2VGbG9hdChwYXJhbVZhbHVlKTtpZihpc05hTihkdXJhdGlvbikpe3RoaXMuc2hvd1dhcm5pbmcobHNgVW5hYmxlIHRvIHBhcnNlIFwiJHtwYXJhbU5hbWV9XCIgdmFsdWUgXCIke3BhcmFtVmFsdWV9XCIuYCk7cmV0dXJuO30KZW50cnkuZHVyPWR1cmF0aW9uO319O2Nhc2UnZGVzYyc6cmV0dXJuIGZ1bmN0aW9uKGVudHJ5LHBhcmFtVmFsdWUpe2VudHJ5LmRlc2M9cGFyYW1WYWx1ZXx8Jyc7fTtkZWZhdWx0OnJldHVybiBudWxsO319CnN0YXRpYyBzaG93V2FybmluZyhtc2cpe0NvbW1vbi5jb25zb2xlLndhcm4oQ29tbW9uLlVJU3RyaW5nKGBTZXJ2ZXJUaW1pbmc6ICR7bXNnfWApKTt9fTs7U0RLLkNQVVByb2ZpbGVOb2RlPWNsYXNzIGV4dGVuZHMgU0RLLlByb2ZpbGVOb2Rle2NvbnN0cnVjdG9yKG5vZGUsc2FtcGxlVGltZSl7Y29uc3QgY2FsbEZyYW1lPW5vZGUuY2FsbEZyYW1lfHwoe2Z1bmN0aW9uTmFtZTpub2RlWydmdW5jdGlvbk5hbWUnXSxzY3JpcHRJZDpub2RlWydzY3JpcHRJZCddLHVybDpub2RlWyd1cmwnXSxsaW5lTnVtYmVyOm5vZGVbJ2xpbmVOdW1iZXInXS0xLGNvbHVtbk51bWJlcjpub2RlWydjb2x1bW5OdW1iZXInXS0xfSk7c3VwZXIoY2FsbEZyYW1lKTt0aGlzLmlkPW5vZGUuaWQ7dGhpcy5zZWxmPW5vZGUuaGl0Q291bnQqc2FtcGxlVGltZTt0aGlzLnBvc2l0aW9uVGlja3M9bm9kZS5wb3NpdGlvblRpY2tzO3RoaXMuZGVvcHRSZWFzb249bm9kZS5kZW9wdFJlYXNvbiYmbm9kZS5kZW9wdFJlYXNvbiE9PSdubyByZWFzb24nP25vZGUuZGVvcHRSZWFzb246bnVsbDt9fTtTREsuQ1BVUHJvZmlsZURhdGFNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5Qcm9maWxlVHJlZU1vZGVse2NvbnN0cnVjdG9yKHByb2ZpbGUpe3N1cGVyKCk7Y29uc3QgaXNMZWdhY3lGb3JtYXQ9ISFwcm9maWxlWydoZWFkJ107aWYoaXNMZWdhY3lGb3JtYXQpe3RoaXMucHJvZmlsZVN0YXJ0VGltZT1wcm9maWxlLnN0YXJ0VGltZSoxMDAwO3RoaXMucHJvZmlsZUVuZFRpbWU9cHJvZmlsZS5lbmRUaW1lKjEwMDA7dGhpcy50aW1lc3RhbXBzPXByb2ZpbGUudGltZXN0YW1wczt0aGlzLl9jb21wYXRpYmlsaXR5Q29udmVyc2lvbkhlYWRUb05vZGVzKHByb2ZpbGUpO31lbHNle3RoaXMucHJvZmlsZVN0YXJ0VGltZT1wcm9maWxlLnN0YXJ0VGltZS8xMDAwO3RoaXMucHJvZmlsZUVuZFRpbWU9cHJvZmlsZS5lbmRUaW1lLzEwMDA7dGhpcy50aW1lc3RhbXBzPXRoaXMuX2NvbnZlcnRUaW1lRGVsdGFzKHByb2ZpbGUpO30KdGhpcy5zYW1wbGVzPXByb2ZpbGUuc2FtcGxlczt0aGlzLnRvdGFsSGl0Q291bnQ9MDt0aGlzLnByb2ZpbGVIZWFkPXRoaXMuX3RyYW5zbGF0ZVByb2ZpbGVUcmVlKHByb2ZpbGUubm9kZXMpO3RoaXMuaW5pdGlhbGl6ZSh0aGlzLnByb2ZpbGVIZWFkKTt0aGlzLl9leHRyYWN0TWV0YU5vZGVzKCk7aWYodGhpcy5zYW1wbGVzKXt0aGlzLl9idWlsZElkVG9Ob2RlTWFwKCk7dGhpcy5fc29ydFNhbXBsZXMoKTt0aGlzLl9ub3JtYWxpemVUaW1lc3RhbXBzKCk7dGhpcy5fZml4TWlzc2luZ1NhbXBsZXMoKTt9fQpfY29tcGF0aWJpbGl0eUNvbnZlcnNpb25IZWFkVG9Ob2Rlcyhwcm9maWxlKXtpZighcHJvZmlsZS5oZWFkfHxwcm9maWxlLm5vZGVzKQpyZXR1cm47Y29uc3Qgbm9kZXM9W107Y29udmVydE5vZGVzVHJlZShwcm9maWxlLmhlYWQpO3Byb2ZpbGUubm9kZXM9bm9kZXM7ZGVsZXRlIHByb2ZpbGUuaGVhZDtmdW5jdGlvbiBjb252ZXJ0Tm9kZXNUcmVlKG5vZGUpe25vZGVzLnB1c2gobm9kZSk7bm9kZS5jaGlsZHJlbj0oKG5vZGUuY2hpbGRyZW4pKS5tYXAoY29udmVydE5vZGVzVHJlZSk7cmV0dXJuIG5vZGUuaWQ7fX0KX2NvbnZlcnRUaW1lRGVsdGFzKHByb2ZpbGUpe2lmKCFwcm9maWxlLnRpbWVEZWx0YXMpCnJldHVybiBudWxsO2xldCBsYXN0VGltZVVzZWM9cHJvZmlsZS5zdGFydFRpbWU7Y29uc3QgdGltZXN0YW1wcz1uZXcgQXJyYXkocHJvZmlsZS50aW1lRGVsdGFzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxwcm9maWxlLnRpbWVEZWx0YXMubGVuZ3RoOysraSl7bGFzdFRpbWVVc2VjKz1wcm9maWxlLnRpbWVEZWx0YXNbaV07dGltZXN0YW1wc1tpXT1sYXN0VGltZVVzZWM7fQpyZXR1cm4gdGltZXN0YW1wczt9Cl90cmFuc2xhdGVQcm9maWxlVHJlZShub2Rlcyl7ZnVuY3Rpb24gaXNOYXRpdmVOb2RlKG5vZGUpe2lmKG5vZGUuY2FsbEZyYW1lKQpyZXR1cm4hIW5vZGUuY2FsbEZyYW1lLnVybCYmbm9kZS5jYWxsRnJhbWUudXJsLnN0YXJ0c1dpdGgoJ25hdGl2ZSAnKTtyZXR1cm4hIW5vZGVbJ3VybCddJiZub2RlWyd1cmwnXS5zdGFydHNXaXRoKCduYXRpdmUgJyk7fQpmdW5jdGlvbiBidWlsZENoaWxkcmVuRnJvbVBhcmVudHMobm9kZXMpe2lmKG5vZGVzWzBdLmNoaWxkcmVuKQpyZXR1cm47bm9kZXNbMF0uY2hpbGRyZW49W107Zm9yKGxldCBpPTE7aTxub2Rlcy5sZW5ndGg7KytpKXtjb25zdCBub2RlPW5vZGVzW2ldO2NvbnN0IHBhcmVudE5vZGU9bm9kZUJ5SWRNYXAuZ2V0KG5vZGUucGFyZW50KTtpZihwYXJlbnROb2RlLmNoaWxkcmVuKQpwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2gobm9kZS5pZCk7ZWxzZQpwYXJlbnROb2RlLmNoaWxkcmVuPVtub2RlLmlkXTt9fQpjb25zdCBub2RlQnlJZE1hcD1uZXcgTWFwKCk7Zm9yKGxldCBpPTA7aTxub2Rlcy5sZW5ndGg7KytpKXtjb25zdCBub2RlPW5vZGVzW2ldO25vZGVCeUlkTWFwLnNldChub2RlLmlkLG5vZGUpO30KYnVpbGRDaGlsZHJlbkZyb21QYXJlbnRzKG5vZGVzKTt0aGlzLnRvdGFsSGl0Q291bnQ9bm9kZXMucmVkdWNlKChhY2Msbm9kZSk9PmFjYytub2RlLmhpdENvdW50LDApO2NvbnN0IHNhbXBsZVRpbWU9KHRoaXMucHJvZmlsZUVuZFRpbWUtdGhpcy5wcm9maWxlU3RhcnRUaW1lKS90aGlzLnRvdGFsSGl0Q291bnQ7Y29uc3Qga2VlcE5hdGl2ZXM9ISFDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd05hdGl2ZUZ1bmN0aW9uc0luSlNQcm9maWxlJykuZ2V0KCk7Y29uc3Qgcm9vdD1ub2Rlc1swXTtjb25zdCBpZE1hcD1uZXcgTWFwKFtbcm9vdC5pZCxyb290LmlkXV0pO2NvbnN0IHJlc3VsdFJvb3Q9bmV3IFNESy5DUFVQcm9maWxlTm9kZShyb290LHNhbXBsZVRpbWUpO2NvbnN0IHBhcmVudE5vZGVTdGFjaz1yb290LmNoaWxkcmVuLm1hcCgoKT0+cmVzdWx0Um9vdCk7Y29uc3Qgc291cmNlTm9kZVN0YWNrPXJvb3QuY2hpbGRyZW4ubWFwKGlkPT5ub2RlQnlJZE1hcC5nZXQoaWQpKTt3aGlsZShzb3VyY2VOb2RlU3RhY2subGVuZ3RoKXtsZXQgcGFyZW50Tm9kZT1wYXJlbnROb2RlU3RhY2sucG9wKCk7Y29uc3Qgc291cmNlTm9kZT1zb3VyY2VOb2RlU3RhY2sucG9wKCk7aWYoIXNvdXJjZU5vZGUuY2hpbGRyZW4pCnNvdXJjZU5vZGUuY2hpbGRyZW49W107Y29uc3QgdGFyZ2V0Tm9kZT1uZXcgU0RLLkNQVVByb2ZpbGVOb2RlKHNvdXJjZU5vZGUsc2FtcGxlVGltZSk7aWYoa2VlcE5hdGl2ZXN8fCFpc05hdGl2ZU5vZGUoc291cmNlTm9kZSkpe3BhcmVudE5vZGUuY2hpbGRyZW4ucHVzaCh0YXJnZXROb2RlKTtwYXJlbnROb2RlPXRhcmdldE5vZGU7fWVsc2V7cGFyZW50Tm9kZS5zZWxmKz10YXJnZXROb2RlLnNlbGY7fQppZE1hcC5zZXQoc291cmNlTm9kZS5pZCxwYXJlbnROb2RlLmlkKTtwYXJlbnROb2RlU3RhY2sucHVzaC5hcHBseShwYXJlbnROb2RlU3RhY2ssc291cmNlTm9kZS5jaGlsZHJlbi5tYXAoKCk9PnBhcmVudE5vZGUpKTtzb3VyY2VOb2RlU3RhY2sucHVzaC5hcHBseShzb3VyY2VOb2RlU3RhY2ssc291cmNlTm9kZS5jaGlsZHJlbi5tYXAoaWQ9Pm5vZGVCeUlkTWFwLmdldChpZCkpKTt9CmlmKHRoaXMuc2FtcGxlcykKdGhpcy5zYW1wbGVzPXRoaXMuc2FtcGxlcy5tYXAoaWQ9PmlkTWFwLmdldChpZCkpO3JldHVybiByZXN1bHRSb290O30KX3NvcnRTYW1wbGVzKCl7Y29uc3QgdGltZXN0YW1wcz10aGlzLnRpbWVzdGFtcHM7aWYoIXRpbWVzdGFtcHMpCnJldHVybjtjb25zdCBzYW1wbGVzPXRoaXMuc2FtcGxlcztjb25zdCBpbmRpY2VzPXRpbWVzdGFtcHMubWFwKCh4LGluZGV4KT0+aW5kZXgpO2luZGljZXMuc3RhYmxlU29ydCgoYSxiKT0+dGltZXN0YW1wc1thXS10aW1lc3RhbXBzW2JdKTtmb3IobGV0IGk9MDtpPHRpbWVzdGFtcHMubGVuZ3RoOysraSl7bGV0IGluZGV4PWluZGljZXNbaV07aWYoaW5kZXg9PT1pKQpjb250aW51ZTtjb25zdCBzYXZlZFRpbWVzdGFtcD10aW1lc3RhbXBzW2ldO2NvbnN0IHNhdmVkU2FtcGxlPXNhbXBsZXNbaV07bGV0IGN1cnJlbnRJbmRleD1pO3doaWxlKGluZGV4IT09aSl7c2FtcGxlc1tjdXJyZW50SW5kZXhdPXNhbXBsZXNbaW5kZXhdO3RpbWVzdGFtcHNbY3VycmVudEluZGV4XT10aW1lc3RhbXBzW2luZGV4XTtjdXJyZW50SW5kZXg9aW5kZXg7aW5kZXg9aW5kaWNlc1tpbmRleF07aW5kaWNlc1tjdXJyZW50SW5kZXhdPWN1cnJlbnRJbmRleDt9CnNhbXBsZXNbY3VycmVudEluZGV4XT1zYXZlZFNhbXBsZTt0aW1lc3RhbXBzW2N1cnJlbnRJbmRleF09c2F2ZWRUaW1lc3RhbXA7fX0KX25vcm1hbGl6ZVRpbWVzdGFtcHMoKXtsZXQgdGltZXN0YW1wcz10aGlzLnRpbWVzdGFtcHM7aWYoIXRpbWVzdGFtcHMpe2NvbnN0IHByb2ZpbGVTdGFydFRpbWU9dGhpcy5wcm9maWxlU3RhcnRUaW1lO2NvbnN0IGludGVydmFsPSh0aGlzLnByb2ZpbGVFbmRUaW1lLXByb2ZpbGVTdGFydFRpbWUpL3RoaXMuc2FtcGxlcy5sZW5ndGg7dGltZXN0YW1wcz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuc2FtcGxlcy5sZW5ndGgrMSk7Zm9yKGxldCBpPTA7aTx0aW1lc3RhbXBzLmxlbmd0aDsrK2kpCnRpbWVzdGFtcHNbaV09cHJvZmlsZVN0YXJ0VGltZStpKmludGVydmFsO3RoaXMudGltZXN0YW1wcz10aW1lc3RhbXBzO3JldHVybjt9CmZvcihsZXQgaT0wO2k8dGltZXN0YW1wcy5sZW5ndGg7KytpKQp0aW1lc3RhbXBzW2ldLz0xMDAwO2lmKHRoaXMuc2FtcGxlcy5sZW5ndGg9PT10aW1lc3RhbXBzLmxlbmd0aCl7Y29uc3QgYXZlcmFnZVNhbXBsZT0odGltZXN0YW1wcy5wZWVrTGFzdCgpLXRpbWVzdGFtcHNbMF0pLyh0aW1lc3RhbXBzLmxlbmd0aC0xKTt0aGlzLnRpbWVzdGFtcHMucHVzaCh0aW1lc3RhbXBzLnBlZWtMYXN0KCkrYXZlcmFnZVNhbXBsZSk7fQp0aGlzLnByb2ZpbGVTdGFydFRpbWU9dGltZXN0YW1wc1swXTt0aGlzLnByb2ZpbGVFbmRUaW1lPXRpbWVzdGFtcHMucGVla0xhc3QoKTt9Cl9idWlsZElkVG9Ob2RlTWFwKCl7dGhpcy5faWRUb05vZGU9bmV3IE1hcCgpO2NvbnN0IGlkVG9Ob2RlPXRoaXMuX2lkVG9Ob2RlO2NvbnN0IHN0YWNrPVt0aGlzLnByb2ZpbGVIZWFkXTt3aGlsZShzdGFjay5sZW5ndGgpe2NvbnN0IG5vZGU9c3RhY2sucG9wKCk7aWRUb05vZGUuc2V0KG5vZGUuaWQsbm9kZSk7c3RhY2sucHVzaC5hcHBseShzdGFjayxub2RlLmNoaWxkcmVuKTt9fQpfZXh0cmFjdE1ldGFOb2Rlcygpe2NvbnN0IHRvcExldmVsTm9kZXM9dGhpcy5wcm9maWxlSGVhZC5jaGlsZHJlbjtmb3IobGV0IGk9MDtpPHRvcExldmVsTm9kZXMubGVuZ3RoJiYhKHRoaXMuZ2NOb2RlJiZ0aGlzLnByb2dyYW1Ob2RlJiZ0aGlzLmlkbGVOb2RlKTtpKyspe2NvbnN0IG5vZGU9dG9wTGV2ZWxOb2Rlc1tpXTtpZihub2RlLmZ1bmN0aW9uTmFtZT09PScoZ2FyYmFnZSBjb2xsZWN0b3IpJykKdGhpcy5nY05vZGU9bm9kZTtlbHNlIGlmKG5vZGUuZnVuY3Rpb25OYW1lPT09Jyhwcm9ncmFtKScpCnRoaXMucHJvZ3JhbU5vZGU9bm9kZTtlbHNlIGlmKG5vZGUuZnVuY3Rpb25OYW1lPT09JyhpZGxlKScpCnRoaXMuaWRsZU5vZGU9bm9kZTt9fQpfZml4TWlzc2luZ1NhbXBsZXMoKXtjb25zdCBzYW1wbGVzPXRoaXMuc2FtcGxlcztjb25zdCBzYW1wbGVzQ291bnQ9c2FtcGxlcy5sZW5ndGg7aWYoIXRoaXMucHJvZ3JhbU5vZGV8fHNhbXBsZXNDb3VudDwzKQpyZXR1cm47Y29uc3QgaWRUb05vZGU9dGhpcy5faWRUb05vZGU7Y29uc3QgcHJvZ3JhbU5vZGVJZD10aGlzLnByb2dyYW1Ob2RlLmlkO2NvbnN0IGdjTm9kZUlkPXRoaXMuZ2NOb2RlP3RoaXMuZ2NOb2RlLmlkOi0xO2NvbnN0IGlkbGVOb2RlSWQ9dGhpcy5pZGxlTm9kZT90aGlzLmlkbGVOb2RlLmlkOi0xO2xldCBwcmV2Tm9kZUlkPXNhbXBsZXNbMF07bGV0IG5vZGVJZD1zYW1wbGVzWzFdO2xldCBjb3VudD0wO2ZvcihsZXQgc2FtcGxlSW5kZXg9MTtzYW1wbGVJbmRleDxzYW1wbGVzQ291bnQtMTtzYW1wbGVJbmRleCsrKXtjb25zdCBuZXh0Tm9kZUlkPXNhbXBsZXNbc2FtcGxlSW5kZXgrMV07aWYobm9kZUlkPT09cHJvZ3JhbU5vZGVJZCYmIWlzU3lzdGVtTm9kZShwcmV2Tm9kZUlkKSYmIWlzU3lzdGVtTm9kZShuZXh0Tm9kZUlkKSYmYm90dG9tTm9kZShpZFRvTm9kZS5nZXQocHJldk5vZGVJZCkpPT09Ym90dG9tTm9kZShpZFRvTm9kZS5nZXQobmV4dE5vZGVJZCkpKXsrK2NvdW50O3NhbXBsZXNbc2FtcGxlSW5kZXhdPXByZXZOb2RlSWQ7fQpwcmV2Tm9kZUlkPW5vZGVJZDtub2RlSWQ9bmV4dE5vZGVJZDt9CmlmKGNvdW50KQpDb21tb24uY29uc29sZS53YXJuKGxzYERldlRvb2xzOiBDUFUgcHJvZmlsZSBwYXJzZXIgaXMgZml4aW5nICR7Y291bnR9IG1pc3Npbmcgc2FtcGxlcy5gKTtmdW5jdGlvbiBib3R0b21Ob2RlKG5vZGUpe3doaWxlKG5vZGUucGFyZW50JiZub2RlLnBhcmVudC5wYXJlbnQpCm5vZGU9bm9kZS5wYXJlbnQ7cmV0dXJuIG5vZGU7fQpmdW5jdGlvbiBpc1N5c3RlbU5vZGUobm9kZUlkKXtyZXR1cm4gbm9kZUlkPT09cHJvZ3JhbU5vZGVJZHx8bm9kZUlkPT09Z2NOb2RlSWR8fG5vZGVJZD09PWlkbGVOb2RlSWQ7fX0KZm9yRWFjaEZyYW1lKG9wZW5GcmFtZUNhbGxiYWNrLGNsb3NlRnJhbWVDYWxsYmFjayxzdGFydFRpbWUsc3RvcFRpbWUpe2lmKCF0aGlzLnByb2ZpbGVIZWFkfHwhdGhpcy5zYW1wbGVzKQpyZXR1cm47c3RhcnRUaW1lPXN0YXJ0VGltZXx8MDtzdG9wVGltZT1zdG9wVGltZXx8SW5maW5pdHk7Y29uc3Qgc2FtcGxlcz10aGlzLnNhbXBsZXM7Y29uc3QgdGltZXN0YW1wcz10aGlzLnRpbWVzdGFtcHM7Y29uc3QgaWRUb05vZGU9dGhpcy5faWRUb05vZGU7Y29uc3QgZ2NOb2RlPXRoaXMuZ2NOb2RlO2NvbnN0IHNhbXBsZXNDb3VudD1zYW1wbGVzLmxlbmd0aDtjb25zdCBzdGFydEluZGV4PXRpbWVzdGFtcHMubG93ZXJCb3VuZChzdGFydFRpbWUpO2xldCBzdGFja1RvcD0wO2NvbnN0IHN0YWNrTm9kZXM9W107bGV0IHByZXZJZD10aGlzLnByb2ZpbGVIZWFkLmlkO2xldCBzYW1wbGVUaW1lO2xldCBnY1BhcmVudE5vZGU9bnVsbDtjb25zdCBzdGFja0RlcHRoPXRoaXMubWF4RGVwdGgrMztpZighdGhpcy5fc3RhY2tTdGFydFRpbWVzKQp0aGlzLl9zdGFja1N0YXJ0VGltZXM9bmV3IEZsb2F0NjRBcnJheShzdGFja0RlcHRoKTtjb25zdCBzdGFja1N0YXJ0VGltZXM9dGhpcy5fc3RhY2tTdGFydFRpbWVzO2lmKCF0aGlzLl9zdGFja0NoaWxkcmVuRHVyYXRpb24pCnRoaXMuX3N0YWNrQ2hpbGRyZW5EdXJhdGlvbj1uZXcgRmxvYXQ2NEFycmF5KHN0YWNrRGVwdGgpO2NvbnN0IHN0YWNrQ2hpbGRyZW5EdXJhdGlvbj10aGlzLl9zdGFja0NoaWxkcmVuRHVyYXRpb247bGV0IG5vZGU7bGV0IHNhbXBsZUluZGV4O2ZvcihzYW1wbGVJbmRleD1zdGFydEluZGV4O3NhbXBsZUluZGV4PHNhbXBsZXNDb3VudDtzYW1wbGVJbmRleCsrKXtzYW1wbGVUaW1lPXRpbWVzdGFtcHNbc2FtcGxlSW5kZXhdO2lmKHNhbXBsZVRpbWU+PXN0b3BUaW1lKQpicmVhaztjb25zdCBpZD1zYW1wbGVzW3NhbXBsZUluZGV4XTtpZihpZD09PXByZXZJZCkKY29udGludWU7bm9kZT1pZFRvTm9kZS5nZXQoaWQpO2xldCBwcmV2Tm9kZT1pZFRvTm9kZS5nZXQocHJldklkKTtpZihub2RlPT09Z2NOb2RlKXtnY1BhcmVudE5vZGU9cHJldk5vZGU7b3BlbkZyYW1lQ2FsbGJhY2soZ2NQYXJlbnROb2RlLmRlcHRoKzEsZ2NOb2RlLHNhbXBsZVRpbWUpO3N0YWNrU3RhcnRUaW1lc1srK3N0YWNrVG9wXT1zYW1wbGVUaW1lO3N0YWNrQ2hpbGRyZW5EdXJhdGlvbltzdGFja1RvcF09MDtwcmV2SWQ9aWQ7Y29udGludWU7fQppZihwcmV2Tm9kZT09PWdjTm9kZSl7Y29uc3Qgc3RhcnQ9c3RhY2tTdGFydFRpbWVzW3N0YWNrVG9wXTtjb25zdCBkdXJhdGlvbj1zYW1wbGVUaW1lLXN0YXJ0O3N0YWNrQ2hpbGRyZW5EdXJhdGlvbltzdGFja1RvcC0xXSs9ZHVyYXRpb247Y2xvc2VGcmFtZUNhbGxiYWNrKGdjUGFyZW50Tm9kZS5kZXB0aCsxLGdjTm9kZSxzdGFydCxkdXJhdGlvbixkdXJhdGlvbi1zdGFja0NoaWxkcmVuRHVyYXRpb25bc3RhY2tUb3BdKTstLXN0YWNrVG9wO3ByZXZOb2RlPWdjUGFyZW50Tm9kZTtwcmV2SWQ9cHJldk5vZGUuaWQ7Z2NQYXJlbnROb2RlPW51bGw7fQp3aGlsZShub2RlLmRlcHRoPnByZXZOb2RlLmRlcHRoKXtzdGFja05vZGVzLnB1c2gobm9kZSk7bm9kZT1ub2RlLnBhcmVudDt9CndoaWxlKHByZXZOb2RlIT09bm9kZSl7Y29uc3Qgc3RhcnQ9c3RhY2tTdGFydFRpbWVzW3N0YWNrVG9wXTtjb25zdCBkdXJhdGlvbj1zYW1wbGVUaW1lLXN0YXJ0O3N0YWNrQ2hpbGRyZW5EdXJhdGlvbltzdGFja1RvcC0xXSs9ZHVyYXRpb247Y2xvc2VGcmFtZUNhbGxiYWNrKHByZXZOb2RlLmRlcHRoLChwcmV2Tm9kZSksc3RhcnQsZHVyYXRpb24sZHVyYXRpb24tc3RhY2tDaGlsZHJlbkR1cmF0aW9uW3N0YWNrVG9wXSk7LS1zdGFja1RvcDtpZihub2RlLmRlcHRoPT09cHJldk5vZGUuZGVwdGgpe3N0YWNrTm9kZXMucHVzaChub2RlKTtub2RlPW5vZGUucGFyZW50O30KcHJldk5vZGU9cHJldk5vZGUucGFyZW50O30Kd2hpbGUoc3RhY2tOb2Rlcy5sZW5ndGgpe25vZGU9c3RhY2tOb2Rlcy5wb3AoKTtvcGVuRnJhbWVDYWxsYmFjayhub2RlLmRlcHRoLG5vZGUsc2FtcGxlVGltZSk7c3RhY2tTdGFydFRpbWVzWysrc3RhY2tUb3BdPXNhbXBsZVRpbWU7c3RhY2tDaGlsZHJlbkR1cmF0aW9uW3N0YWNrVG9wXT0wO30KcHJldklkPWlkO30Kc2FtcGxlVGltZT10aW1lc3RhbXBzW3NhbXBsZUluZGV4XXx8dGhpcy5wcm9maWxlRW5kVGltZTtpZihpZFRvTm9kZS5nZXQocHJldklkKT09PWdjTm9kZSl7Y29uc3Qgc3RhcnQ9c3RhY2tTdGFydFRpbWVzW3N0YWNrVG9wXTtjb25zdCBkdXJhdGlvbj1zYW1wbGVUaW1lLXN0YXJ0O3N0YWNrQ2hpbGRyZW5EdXJhdGlvbltzdGFja1RvcC0xXSs9ZHVyYXRpb247Y2xvc2VGcmFtZUNhbGxiYWNrKGdjUGFyZW50Tm9kZS5kZXB0aCsxLG5vZGUsc3RhcnQsZHVyYXRpb24sZHVyYXRpb24tc3RhY2tDaGlsZHJlbkR1cmF0aW9uW3N0YWNrVG9wXSk7LS1zdGFja1RvcDtwcmV2SWQ9Z2NQYXJlbnROb2RlLmlkO30KZm9yKGxldCBub2RlPWlkVG9Ob2RlLmdldChwcmV2SWQpO25vZGUucGFyZW50O25vZGU9bm9kZS5wYXJlbnQpe2NvbnN0IHN0YXJ0PXN0YWNrU3RhcnRUaW1lc1tzdGFja1RvcF07Y29uc3QgZHVyYXRpb249c2FtcGxlVGltZS1zdGFydDtzdGFja0NoaWxkcmVuRHVyYXRpb25bc3RhY2tUb3AtMV0rPWR1cmF0aW9uO2Nsb3NlRnJhbWVDYWxsYmFjayhub2RlLmRlcHRoLChub2RlKSxzdGFydCxkdXJhdGlvbixkdXJhdGlvbi1zdGFja0NoaWxkcmVuRHVyYXRpb25bc3RhY2tUb3BdKTstLXN0YWNrVG9wO319Cm5vZGVCeUluZGV4KGluZGV4KXtyZXR1cm4gdGhpcy5faWRUb05vZGUuZ2V0KHRoaXMuc2FtcGxlc1tpbmRleF0pfHxudWxsO319OztTREsuQ1BVUHJvZmlsZXJNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5faXNSZWNvcmRpbmc9ZmFsc2U7dGhpcy5fbmV4dEFub255bW91c0NvbnNvbGVQcm9maWxlTnVtYmVyPTE7dGhpcy5fYW5vbnltb3VzQ29uc29sZVByb2ZpbGVJZFRvVGl0bGU9bmV3IE1hcCgpO3RoaXMuX3Byb2ZpbGVyQWdlbnQ9dGFyZ2V0LnByb2ZpbGVyQWdlbnQoKTt0YXJnZXQucmVnaXN0ZXJQcm9maWxlckRpc3BhdGNoZXIodGhpcyk7dGhpcy5fcHJvZmlsZXJBZ2VudC5lbmFibGUoKTt0aGlzLl9kZWJ1Z2dlck1vZGVsPSh0YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpKTt9CnJ1bnRpbWVNb2RlbCgpe3JldHVybiB0aGlzLl9kZWJ1Z2dlck1vZGVsLnJ1bnRpbWVNb2RlbCgpO30KZGVidWdnZXJNb2RlbCgpe3JldHVybiB0aGlzLl9kZWJ1Z2dlck1vZGVsO30KY29uc29sZVByb2ZpbGVTdGFydGVkKGlkLHNjcmlwdExvY2F0aW9uLHRpdGxlKXtpZighdGl0bGUpe3RpdGxlPUNvbW1vbi5VSVN0cmluZygnUHJvZmlsZSAlZCcsdGhpcy5fbmV4dEFub255bW91c0NvbnNvbGVQcm9maWxlTnVtYmVyKyspO3RoaXMuX2Fub255bW91c0NvbnNvbGVQcm9maWxlSWRUb1RpdGxlLnNldChpZCx0aXRsZSk7fQp0aGlzLl9kaXNwYXRjaFByb2ZpbGVFdmVudChTREsuQ1BVUHJvZmlsZXJNb2RlbC5FdmVudHMuQ29uc29sZVByb2ZpbGVTdGFydGVkLGlkLHNjcmlwdExvY2F0aW9uLHRpdGxlKTt9CmNvbnNvbGVQcm9maWxlRmluaXNoZWQoaWQsc2NyaXB0TG9jYXRpb24sY3B1UHJvZmlsZSx0aXRsZSl7aWYoIXRpdGxlKXt0aXRsZT10aGlzLl9hbm9ueW1vdXNDb25zb2xlUHJvZmlsZUlkVG9UaXRsZS5nZXQoaWQpO3RoaXMuX2Fub255bW91c0NvbnNvbGVQcm9maWxlSWRUb1RpdGxlLmRlbGV0ZShpZCk7fQpzZWxmLnJ1bnRpbWUubG9hZE1vZHVsZVByb21pc2UoJ3Byb2ZpbGVyJykudGhlbigoKT0+e3RoaXMuX2Rpc3BhdGNoUHJvZmlsZUV2ZW50KFNESy5DUFVQcm9maWxlck1vZGVsLkV2ZW50cy5Db25zb2xlUHJvZmlsZUZpbmlzaGVkLGlkLHNjcmlwdExvY2F0aW9uLHRpdGxlLGNwdVByb2ZpbGUpO30pO30KX2Rpc3BhdGNoUHJvZmlsZUV2ZW50KGV2ZW50TmFtZSxpZCxzY3JpcHRMb2NhdGlvbix0aXRsZSxjcHVQcm9maWxlKXtjb25zdCBkZWJ1Z2dlckxvY2F0aW9uPVNESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uLmZyb21QYXlsb2FkKHRoaXMuX2RlYnVnZ2VyTW9kZWwsc2NyaXB0TG9jYXRpb24pO2NvbnN0IGdsb2JhbElkPXRoaXMudGFyZ2V0KCkuaWQoKSsnLicraWQ7Y29uc3QgZGF0YT0oe2lkOmdsb2JhbElkLHNjcmlwdExvY2F0aW9uOmRlYnVnZ2VyTG9jYXRpb24sY3B1UHJvZmlsZTpjcHVQcm9maWxlLHRpdGxlOnRpdGxlLGNwdVByb2ZpbGVyTW9kZWw6dGhpc30pO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKGV2ZW50TmFtZSxkYXRhKTt9CmlzUmVjb3JkaW5nUHJvZmlsZSgpe3JldHVybiB0aGlzLl9pc1JlY29yZGluZzt9CnN0YXJ0UmVjb3JkaW5nKCl7dGhpcy5faXNSZWNvcmRpbmc9dHJ1ZTtjb25zdCBpbnRlcnZhbFVzPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdoaWdoUmVzb2x1dGlvbkNwdVByb2ZpbGluZycpLmdldCgpPzEwMDoxMDAwO3RoaXMuX3Byb2ZpbGVyQWdlbnQuc2V0U2FtcGxpbmdJbnRlcnZhbChpbnRlcnZhbFVzKTtyZXR1cm4gdGhpcy5fcHJvZmlsZXJBZ2VudC5zdGFydCgpO30Kc3RvcFJlY29yZGluZygpe3RoaXMuX2lzUmVjb3JkaW5nPWZhbHNlO3JldHVybiB0aGlzLl9wcm9maWxlckFnZW50LnN0b3AoKTt9CnN0YXJ0UHJlY2lzZUNvdmVyYWdlKCl7Y29uc3QgY2FsbENvdW50PWZhbHNlO2NvbnN0IGRldGFpbGVkPXRydWU7cmV0dXJuIHRoaXMuX3Byb2ZpbGVyQWdlbnQuc3RhcnRQcmVjaXNlQ292ZXJhZ2UoY2FsbENvdW50LGRldGFpbGVkKTt9CnRha2VQcmVjaXNlQ292ZXJhZ2UoKXtyZXR1cm4gdGhpcy5fcHJvZmlsZXJBZ2VudC50YWtlUHJlY2lzZUNvdmVyYWdlKCkudGhlbihyZXN1bHQ9PnJlc3VsdHx8W10pO30Kc3RvcFByZWNpc2VDb3ZlcmFnZSgpe3JldHVybiB0aGlzLl9wcm9maWxlckFnZW50LnN0b3BQcmVjaXNlQ292ZXJhZ2UoKTt9CmJlc3RFZmZvcnRDb3ZlcmFnZSgpe3JldHVybiB0aGlzLl9wcm9maWxlckFnZW50LmdldEJlc3RFZmZvcnRDb3ZlcmFnZSgpLnRoZW4ocmVzdWx0PT5yZXN1bHR8fFtdKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLkNQVVByb2ZpbGVyTW9kZWwsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTLHRydWUpO1NESy5DUFVQcm9maWxlck1vZGVsLkV2ZW50cz17Q29uc29sZVByb2ZpbGVTdGFydGVkOlN5bWJvbCgnQ29uc29sZVByb2ZpbGVTdGFydGVkJyksQ29uc29sZVByb2ZpbGVGaW5pc2hlZDpTeW1ib2woJ0NvbnNvbGVQcm9maWxlRmluaXNoZWQnKX07U0RLLkNQVVByb2ZpbGVyTW9kZWwuRXZlbnREYXRhOztTREsuQ1NTTWF0Y2hlZFN0eWxlcz1jbGFzc3tjb25zdHJ1Y3Rvcihjc3NNb2RlbCxub2RlLGlubGluZVBheWxvYWQsYXR0cmlidXRlc1BheWxvYWQsbWF0Y2hlZFBheWxvYWQscHNldWRvUGF5bG9hZCxpbmhlcml0ZWRQYXlsb2FkLGFuaW1hdGlvbnNQYXlsb2FkKXt0aGlzLl9jc3NNb2RlbD1jc3NNb2RlbDt0aGlzLl9ub2RlPW5vZGU7dGhpcy5fYWRkZWRTdHlsZXM9bmV3IE1hcCgpO3RoaXMuX21hdGNoaW5nU2VsZWN0b3JzPW5ldyBNYXAoKTt0aGlzLl9rZXlmcmFtZXM9W107aWYoYW5pbWF0aW9uc1BheWxvYWQpCnRoaXMuX2tleWZyYW1lcz1hbmltYXRpb25zUGF5bG9hZC5tYXAocnVsZT0+bmV3IFNESy5DU1NLZXlmcmFtZXNSdWxlKGNzc01vZGVsLHJ1bGUpKTt0aGlzLl9ub2RlRm9yU3R5bGU9bmV3IE1hcCgpO3RoaXMuX2luaGVyaXRlZFN0eWxlcz1uZXcgU2V0KCk7dGhpcy5fbWFpbkRPTUNhc2NhZGU9dGhpcy5fYnVpbGRNYWluQ2FzY2FkZShpbmxpbmVQYXlsb2FkLGF0dHJpYnV0ZXNQYXlsb2FkLG1hdGNoZWRQYXlsb2FkLGluaGVyaXRlZFBheWxvYWQpO3RoaXMuX3BzZXVkb0RPTUNhc2NhZGVzPXRoaXMuX2J1aWxkUHNldWRvQ2FzY2FkZXMocHNldWRvUGF5bG9hZCk7dGhpcy5fc3R5bGVUb0RPTUNhc2NhZGU9bmV3IE1hcCgpO2Zvcihjb25zdCBkb21DYXNjYWRlIG9mIEFycmF5LmZyb20odGhpcy5fcHNldWRvRE9NQ2FzY2FkZXMudmFsdWVzKCkpLmNvbmNhdCh0aGlzLl9tYWluRE9NQ2FzY2FkZSkpe2Zvcihjb25zdCBzdHlsZSBvZiBkb21DYXNjYWRlLnN0eWxlcygpKQp0aGlzLl9zdHlsZVRvRE9NQ2FzY2FkZS5zZXQoc3R5bGUsZG9tQ2FzY2FkZSk7fX0KX2J1aWxkTWFpbkNhc2NhZGUoaW5saW5lUGF5bG9hZCxhdHRyaWJ1dGVzUGF5bG9hZCxtYXRjaGVkUGF5bG9hZCxpbmhlcml0ZWRQYXlsb2FkKXtjb25zdCBub2RlQ2FzY2FkZXM9W107Y29uc3Qgbm9kZVN0eWxlcz1bXTtmdW5jdGlvbiBhZGRBdHRyaWJ1dGVzU3R5bGUoKXtpZighYXR0cmlidXRlc1BheWxvYWQpCnJldHVybjtjb25zdCBzdHlsZT1uZXcgU0RLLkNTU1N0eWxlRGVjbGFyYXRpb24odGhpcy5fY3NzTW9kZWwsbnVsbCxhdHRyaWJ1dGVzUGF5bG9hZCxTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLkF0dHJpYnV0ZXMpO3RoaXMuX25vZGVGb3JTdHlsZS5zZXQoc3R5bGUsdGhpcy5fbm9kZSk7bm9kZVN0eWxlcy5wdXNoKHN0eWxlKTt9CmlmKGlubGluZVBheWxvYWQmJnRoaXMuX25vZGUubm9kZVR5cGUoKT09PU5vZGUuRUxFTUVOVF9OT0RFKXtjb25zdCBzdHlsZT1uZXcgU0RLLkNTU1N0eWxlRGVjbGFyYXRpb24odGhpcy5fY3NzTW9kZWwsbnVsbCxpbmxpbmVQYXlsb2FkLFNESy5DU1NTdHlsZURlY2xhcmF0aW9uLlR5cGUuSW5saW5lKTt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KHN0eWxlLHRoaXMuX25vZGUpO25vZGVTdHlsZXMucHVzaChzdHlsZSk7fQpsZXQgYWRkZWRBdHRyaWJ1dGVzU3R5bGU7Zm9yKGxldCBpPW1hdGNoZWRQYXlsb2FkLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCBydWxlPW5ldyBTREsuQ1NTU3R5bGVSdWxlKHRoaXMuX2Nzc01vZGVsLG1hdGNoZWRQYXlsb2FkW2ldLnJ1bGUpO2lmKChydWxlLmlzSW5qZWN0ZWQoKXx8cnVsZS5pc1VzZXJBZ2VudCgpKSYmIWFkZGVkQXR0cmlidXRlc1N0eWxlKXthZGRlZEF0dHJpYnV0ZXNTdHlsZT10cnVlO2FkZEF0dHJpYnV0ZXNTdHlsZS5jYWxsKHRoaXMpO30KdGhpcy5fbm9kZUZvclN0eWxlLnNldChydWxlLnN0eWxlLHRoaXMuX25vZGUpO25vZGVTdHlsZXMucHVzaChydWxlLnN0eWxlKTt0aGlzLl9hZGRNYXRjaGluZ1NlbGVjdG9ycyh0aGlzLl9ub2RlLHJ1bGUsbWF0Y2hlZFBheWxvYWRbaV0ubWF0Y2hpbmdTZWxlY3RvcnMpO30KaWYoIWFkZGVkQXR0cmlidXRlc1N0eWxlKQphZGRBdHRyaWJ1dGVzU3R5bGUuY2FsbCh0aGlzKTtub2RlQ2FzY2FkZXMucHVzaChuZXcgU0RLLkNTU01hdGNoZWRTdHlsZXMuTm9kZUNhc2NhZGUodGhpcyxub2RlU3R5bGVzLGZhbHNlKSk7bGV0IHBhcmVudE5vZGU9dGhpcy5fbm9kZS5wYXJlbnROb2RlO2ZvcihsZXQgaT0wO3BhcmVudE5vZGUmJmluaGVyaXRlZFBheWxvYWQmJmk8aW5oZXJpdGVkUGF5bG9hZC5sZW5ndGg7KytpKXtjb25zdCBpbmhlcml0ZWRTdHlsZXM9W107Y29uc3QgZW50cnlQYXlsb2FkPWluaGVyaXRlZFBheWxvYWRbaV07Y29uc3QgaW5oZXJpdGVkSW5saW5lU3R5bGU9ZW50cnlQYXlsb2FkLmlubGluZVN0eWxlP25ldyBTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbih0aGlzLl9jc3NNb2RlbCxudWxsLGVudHJ5UGF5bG9hZC5pbmxpbmVTdHlsZSxTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLklubGluZSk6bnVsbDtpZihpbmhlcml0ZWRJbmxpbmVTdHlsZSYmdGhpcy5fY29udGFpbnNJbmhlcml0ZWQoaW5oZXJpdGVkSW5saW5lU3R5bGUpKXt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KGluaGVyaXRlZElubGluZVN0eWxlLHBhcmVudE5vZGUpO2luaGVyaXRlZFN0eWxlcy5wdXNoKGluaGVyaXRlZElubGluZVN0eWxlKTt0aGlzLl9pbmhlcml0ZWRTdHlsZXMuYWRkKGluaGVyaXRlZElubGluZVN0eWxlKTt9CmNvbnN0IGluaGVyaXRlZE1hdGNoZWRDU1NSdWxlcz1lbnRyeVBheWxvYWQubWF0Y2hlZENTU1J1bGVzfHxbXTtmb3IobGV0IGo9aW5oZXJpdGVkTWF0Y2hlZENTU1J1bGVzLmxlbmd0aC0xO2o+PTA7LS1qKXtjb25zdCBpbmhlcml0ZWRSdWxlPW5ldyBTREsuQ1NTU3R5bGVSdWxlKHRoaXMuX2Nzc01vZGVsLGluaGVyaXRlZE1hdGNoZWRDU1NSdWxlc1tqXS5ydWxlKTt0aGlzLl9hZGRNYXRjaGluZ1NlbGVjdG9ycyhwYXJlbnROb2RlLGluaGVyaXRlZFJ1bGUsaW5oZXJpdGVkTWF0Y2hlZENTU1J1bGVzW2pdLm1hdGNoaW5nU2VsZWN0b3JzKTtpZighdGhpcy5fY29udGFpbnNJbmhlcml0ZWQoaW5oZXJpdGVkUnVsZS5zdHlsZSkpCmNvbnRpbnVlO3RoaXMuX25vZGVGb3JTdHlsZS5zZXQoaW5oZXJpdGVkUnVsZS5zdHlsZSxwYXJlbnROb2RlKTtpbmhlcml0ZWRTdHlsZXMucHVzaChpbmhlcml0ZWRSdWxlLnN0eWxlKTt0aGlzLl9pbmhlcml0ZWRTdHlsZXMuYWRkKGluaGVyaXRlZFJ1bGUuc3R5bGUpO30KcGFyZW50Tm9kZT1wYXJlbnROb2RlLnBhcmVudE5vZGU7bm9kZUNhc2NhZGVzLnB1c2gobmV3IFNESy5DU1NNYXRjaGVkU3R5bGVzLk5vZGVDYXNjYWRlKHRoaXMsaW5oZXJpdGVkU3R5bGVzLHRydWUpKTt9CnJldHVybiBuZXcgU0RLLkNTU01hdGNoZWRTdHlsZXMuRE9NSW5oZXJpdGFuY2VDYXNjYWRlKG5vZGVDYXNjYWRlcyk7fQpfYnVpbGRQc2V1ZG9DYXNjYWRlcyhwc2V1ZG9QYXlsb2FkKXtjb25zdCBwc2V1ZG9DYXNjYWRlcz1uZXcgTWFwKCk7aWYoIXBzZXVkb1BheWxvYWQpCnJldHVybiBwc2V1ZG9DYXNjYWRlcztmb3IobGV0IGk9MDtpPHBzZXVkb1BheWxvYWQubGVuZ3RoOysraSl7Y29uc3QgZW50cnlQYXlsb2FkPXBzZXVkb1BheWxvYWRbaV07Y29uc3QgcHNldWRvRWxlbWVudD10aGlzLl9ub2RlLnBzZXVkb0VsZW1lbnRzKCkuZ2V0KGVudHJ5UGF5bG9hZC5wc2V1ZG9UeXBlKXx8bnVsbDtjb25zdCBwc2V1ZG9TdHlsZXM9W107Y29uc3QgcnVsZXM9ZW50cnlQYXlsb2FkLm1hdGNoZXN8fFtdO2ZvcihsZXQgaj1ydWxlcy5sZW5ndGgtMTtqPj0wOy0tail7Y29uc3QgcHNldWRvUnVsZT1uZXcgU0RLLkNTU1N0eWxlUnVsZSh0aGlzLl9jc3NNb2RlbCxydWxlc1tqXS5ydWxlKTtwc2V1ZG9TdHlsZXMucHVzaChwc2V1ZG9SdWxlLnN0eWxlKTt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KHBzZXVkb1J1bGUuc3R5bGUscHNldWRvRWxlbWVudCk7aWYocHNldWRvRWxlbWVudCkKdGhpcy5fYWRkTWF0Y2hpbmdTZWxlY3RvcnMocHNldWRvRWxlbWVudCxwc2V1ZG9SdWxlLHJ1bGVzW2pdLm1hdGNoaW5nU2VsZWN0b3JzKTt9CmNvbnN0IG5vZGVDYXNjYWRlPW5ldyBTREsuQ1NTTWF0Y2hlZFN0eWxlcy5Ob2RlQ2FzY2FkZSh0aGlzLHBzZXVkb1N0eWxlcyxmYWxzZSk7cHNldWRvQ2FzY2FkZXMuc2V0KGVudHJ5UGF5bG9hZC5wc2V1ZG9UeXBlLG5ldyBTREsuQ1NTTWF0Y2hlZFN0eWxlcy5ET01Jbmhlcml0YW5jZUNhc2NhZGUoW25vZGVDYXNjYWRlXSkpO30KcmV0dXJuIHBzZXVkb0Nhc2NhZGVzO30KX2FkZE1hdGNoaW5nU2VsZWN0b3JzKG5vZGUscnVsZSxtYXRjaGluZ1NlbGVjdG9ySW5kaWNlcyl7Zm9yKGNvbnN0IG1hdGNoaW5nU2VsZWN0b3JJbmRleCBvZiBtYXRjaGluZ1NlbGVjdG9ySW5kaWNlcyl7Y29uc3Qgc2VsZWN0b3I9cnVsZS5zZWxlY3RvcnNbbWF0Y2hpbmdTZWxlY3RvckluZGV4XTt0aGlzLl9zZXRTZWxlY3Rvck1hdGNoZXMobm9kZSxzZWxlY3Rvci50ZXh0LHRydWUpO319Cm5vZGUoKXtyZXR1cm4gdGhpcy5fbm9kZTt9CmNzc01vZGVsKCl7cmV0dXJuIHRoaXMuX2Nzc01vZGVsO30KaGFzTWF0Y2hpbmdTZWxlY3RvcnMocnVsZSl7Y29uc3QgbWF0Y2hpbmdTZWxlY3RvcnM9dGhpcy5tYXRjaGluZ1NlbGVjdG9ycyhydWxlKTtyZXR1cm4gbWF0Y2hpbmdTZWxlY3RvcnMubGVuZ3RoPjAmJnRoaXMubWVkaWFNYXRjaGVzKHJ1bGUuc3R5bGUpO30KbWF0Y2hpbmdTZWxlY3RvcnMocnVsZSl7Y29uc3Qgbm9kZT10aGlzLm5vZGVGb3JTdHlsZShydWxlLnN0eWxlKTtpZighbm9kZSkKcmV0dXJuW107Y29uc3QgbWFwPXRoaXMuX21hdGNoaW5nU2VsZWN0b3JzLmdldChub2RlLmlkKTtpZighbWFwKQpyZXR1cm5bXTtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPTA7aTxydWxlLnNlbGVjdG9ycy5sZW5ndGg7KytpKXtpZihtYXAuZ2V0KHJ1bGUuc2VsZWN0b3JzW2ldLnRleHQpKQpyZXN1bHQucHVzaChpKTt9CnJldHVybiByZXN1bHQ7fQpyZWNvbXB1dGVNYXRjaGluZ1NlbGVjdG9ycyhydWxlKXtjb25zdCBub2RlPXRoaXMubm9kZUZvclN0eWxlKHJ1bGUuc3R5bGUpO2lmKCFub2RlKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGNvbnN0IHNlbGVjdG9yIG9mIHJ1bGUuc2VsZWN0b3JzKQpwcm9taXNlcy5wdXNoKHF1ZXJ5U2VsZWN0b3IuY2FsbCh0aGlzLG5vZGUsc2VsZWN0b3IudGV4dCkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7YXN5bmMgZnVuY3Rpb24gcXVlcnlTZWxlY3Rvcihub2RlLHNlbGVjdG9yVGV4dCl7Y29uc3Qgb3duZXJEb2N1bWVudD1ub2RlLm93bmVyRG9jdW1lbnR8fG51bGw7Y29uc3QgbWFwPXRoaXMuX21hdGNoaW5nU2VsZWN0b3JzLmdldChub2RlLmlkKTtpZigobWFwJiZtYXAuaGFzKHNlbGVjdG9yVGV4dCkpfHwhb3duZXJEb2N1bWVudCkKcmV0dXJuO2NvbnN0IG1hdGNoaW5nTm9kZUlkcz1hd2FpdCB0aGlzLl9ub2RlLmRvbU1vZGVsKCkucXVlcnlTZWxlY3RvckFsbChvd25lckRvY3VtZW50LmlkLHNlbGVjdG9yVGV4dCk7aWYobWF0Y2hpbmdOb2RlSWRzKQp0aGlzLl9zZXRTZWxlY3Rvck1hdGNoZXMobm9kZSxzZWxlY3RvclRleHQsbWF0Y2hpbmdOb2RlSWRzLmluZGV4T2Yobm9kZS5pZCkhPT0tMSk7fX0KYWRkTmV3UnVsZShydWxlLG5vZGUpe3RoaXMuX2FkZGVkU3R5bGVzLnNldChydWxlLnN0eWxlLG5vZGUpO3JldHVybiB0aGlzLnJlY29tcHV0ZU1hdGNoaW5nU2VsZWN0b3JzKHJ1bGUpO30KX3NldFNlbGVjdG9yTWF0Y2hlcyhub2RlLHNlbGVjdG9yVGV4dCx2YWx1ZSl7bGV0IG1hcD10aGlzLl9tYXRjaGluZ1NlbGVjdG9ycy5nZXQobm9kZS5pZCk7aWYoIW1hcCl7bWFwPW5ldyBNYXAoKTt0aGlzLl9tYXRjaGluZ1NlbGVjdG9ycy5zZXQobm9kZS5pZCxtYXApO30KbWFwLnNldChzZWxlY3RvclRleHQsdmFsdWUpO30KbWVkaWFNYXRjaGVzKHN0eWxlKXtjb25zdCBtZWRpYT1zdHlsZS5wYXJlbnRSdWxlP3N0eWxlLnBhcmVudFJ1bGUubWVkaWE6W107Zm9yKGxldCBpPTA7bWVkaWEmJmk8bWVkaWEubGVuZ3RoOysraSl7aWYoIW1lZGlhW2ldLmFjdGl2ZSgpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9Cm5vZGVTdHlsZXMoKXtyZXR1cm4gdGhpcy5fbWFpbkRPTUNhc2NhZGUuc3R5bGVzKCk7fQprZXlmcmFtZXMoKXtyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzO30KcHNldWRvU3R5bGVzKHBzZXVkb1R5cGUpe2NvbnN0IGRvbUNhc2NhZGU9dGhpcy5fcHNldWRvRE9NQ2FzY2FkZXMuZ2V0KHBzZXVkb1R5cGUpO3JldHVybiBkb21DYXNjYWRlP2RvbUNhc2NhZGUuc3R5bGVzKCk6W107fQpwc2V1ZG9UeXBlcygpe3JldHVybiBuZXcgU2V0KHRoaXMuX3BzZXVkb0RPTUNhc2NhZGVzLmtleXMoKSk7fQpfY29udGFpbnNJbmhlcml0ZWQoc3R5bGUpe2NvbnN0IHByb3BlcnRpZXM9c3R5bGUuYWxsUHJvcGVydGllcygpO2ZvcihsZXQgaT0wO2k8cHJvcGVydGllcy5sZW5ndGg7KytpKXtjb25zdCBwcm9wZXJ0eT1wcm9wZXJ0aWVzW2ldO2lmKHByb3BlcnR5LmFjdGl2ZUluU3R5bGUoKSYmU0RLLmNzc01ldGFkYXRhKCkuaXNQcm9wZXJ0eUluaGVyaXRlZChwcm9wZXJ0eS5uYW1lKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpub2RlRm9yU3R5bGUoc3R5bGUpe3JldHVybiB0aGlzLl9hZGRlZFN0eWxlcy5nZXQoc3R5bGUpfHx0aGlzLl9ub2RlRm9yU3R5bGUuZ2V0KHN0eWxlKXx8bnVsbDt9CmF2YWlsYWJsZUNTU1ZhcmlhYmxlcyhzdHlsZSl7Y29uc3QgZG9tQ2FzY2FkZT10aGlzLl9zdHlsZVRvRE9NQ2FzY2FkZS5nZXQoc3R5bGUpfHxudWxsO3JldHVybiBkb21DYXNjYWRlP2RvbUNhc2NhZGUuYXZhaWxhYmxlQ1NTVmFyaWFibGVzKHN0eWxlKTpbXTt9CmNvbXB1dGVDU1NWYXJpYWJsZShzdHlsZSx2YXJpYWJsZU5hbWUpe2NvbnN0IGRvbUNhc2NhZGU9dGhpcy5fc3R5bGVUb0RPTUNhc2NhZGUuZ2V0KHN0eWxlKXx8bnVsbDtyZXR1cm4gZG9tQ2FzY2FkZT9kb21DYXNjYWRlLmNvbXB1dGVDU1NWYXJpYWJsZShzdHlsZSx2YXJpYWJsZU5hbWUpOm51bGw7fQpjb21wdXRlVmFsdWUoc3R5bGUsdmFsdWUpe2NvbnN0IGRvbUNhc2NhZGU9dGhpcy5fc3R5bGVUb0RPTUNhc2NhZGUuZ2V0KHN0eWxlKXx8bnVsbDtyZXR1cm4gZG9tQ2FzY2FkZT9kb21DYXNjYWRlLmNvbXB1dGVWYWx1ZShzdHlsZSx2YWx1ZSk6bnVsbDt9CmlzSW5oZXJpdGVkKHN0eWxlKXtyZXR1cm4gdGhpcy5faW5oZXJpdGVkU3R5bGVzLmhhcyhzdHlsZSk7fQpwcm9wZXJ0eVN0YXRlKHByb3BlcnR5KXtjb25zdCBkb21DYXNjYWRlPXRoaXMuX3N0eWxlVG9ET01DYXNjYWRlLmdldChwcm9wZXJ0eS5vd25lclN0eWxlKTtyZXR1cm4gZG9tQ2FzY2FkZT9kb21DYXNjYWRlLnByb3BlcnR5U3RhdGUocHJvcGVydHkpOm51bGw7fQpyZXNldEFjdGl2ZVByb3BlcnRpZXMoKXt0aGlzLl9tYWluRE9NQ2FzY2FkZS5yZXNldCgpO2Zvcihjb25zdCBkb21DYXNjYWRlIG9mIHRoaXMuX3BzZXVkb0RPTUNhc2NhZGVzLnZhbHVlcygpKQpkb21DYXNjYWRlLnJlc2V0KCk7fX07U0RLLkNTU01hdGNoZWRTdHlsZXMuTm9kZUNhc2NhZGU9Y2xhc3N7Y29uc3RydWN0b3IobWF0Y2hlZFN0eWxlcyxzdHlsZXMsaXNJbmhlcml0ZWQpe3RoaXMuX21hdGNoZWRTdHlsZXM9bWF0Y2hlZFN0eWxlczt0aGlzLl9zdHlsZXM9c3R5bGVzO3RoaXMuX2lzSW5oZXJpdGVkPWlzSW5oZXJpdGVkO3RoaXMuX3Byb3BlcnRpZXNTdGF0ZT1uZXcgTWFwKCk7dGhpcy5fYWN0aXZlUHJvcGVydGllcz1uZXcgTWFwKCk7fQpfY29tcHV0ZUFjdGl2ZVByb3BlcnRpZXMoKXt0aGlzLl9wcm9wZXJ0aWVzU3RhdGUuY2xlYXIoKTt0aGlzLl9hY3RpdmVQcm9wZXJ0aWVzLmNsZWFyKCk7Zm9yKGNvbnN0IHN0eWxlIG9mIHRoaXMuX3N0eWxlcyl7Y29uc3QgcnVsZT1zdHlsZS5wYXJlbnRSdWxlO2lmKHJ1bGUmJiEocnVsZSBpbnN0YW5jZW9mIFNESy5DU1NTdHlsZVJ1bGUpKQpjb250aW51ZTtpZihydWxlJiYhdGhpcy5fbWF0Y2hlZFN0eWxlcy5oYXNNYXRjaGluZ1NlbGVjdG9ycyhydWxlKSkKY29udGludWU7Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHN0eWxlLmFsbFByb3BlcnRpZXMoKSl7aWYodGhpcy5faXNJbmhlcml0ZWQmJiFTREsuY3NzTWV0YWRhdGEoKS5pc1Byb3BlcnR5SW5oZXJpdGVkKHByb3BlcnR5Lm5hbWUpKQpjb250aW51ZTtpZighcHJvcGVydHkuYWN0aXZlSW5TdHlsZSgpKXt0aGlzLl9wcm9wZXJ0aWVzU3RhdGUuc2V0KHByb3BlcnR5LFNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCk7Y29udGludWU7fQpjb25zdCBjYW5vbmljYWxOYW1lPVNESy5jc3NNZXRhZGF0YSgpLmNhbm9uaWNhbFByb3BlcnR5TmFtZShwcm9wZXJ0eS5uYW1lKTtjb25zdCBhY3RpdmVQcm9wZXJ0eT10aGlzLl9hY3RpdmVQcm9wZXJ0aWVzLmdldChjYW5vbmljYWxOYW1lKTtpZihhY3RpdmVQcm9wZXJ0eSYmKGFjdGl2ZVByb3BlcnR5LmltcG9ydGFudHx8IXByb3BlcnR5LmltcG9ydGFudCkpe3RoaXMuX3Byb3BlcnRpZXNTdGF0ZS5zZXQocHJvcGVydHksU0RLLkNTU01hdGNoZWRTdHlsZXMuUHJvcGVydHlTdGF0ZS5PdmVybG9hZGVkKTtjb250aW51ZTt9CmlmKGFjdGl2ZVByb3BlcnR5KQp0aGlzLl9wcm9wZXJ0aWVzU3RhdGUuc2V0KGFjdGl2ZVByb3BlcnR5LFNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCk7dGhpcy5fcHJvcGVydGllc1N0YXRlLnNldChwcm9wZXJ0eSxTREsuQ1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLkFjdGl2ZSk7dGhpcy5fYWN0aXZlUHJvcGVydGllcy5zZXQoY2Fub25pY2FsTmFtZSxwcm9wZXJ0eSk7fX19fTtTREsuQ1NTTWF0Y2hlZFN0eWxlcy5ET01Jbmhlcml0YW5jZUNhc2NhZGU9Y2xhc3N7Y29uc3RydWN0b3Iobm9kZUNhc2NhZGVzKXt0aGlzLl9ub2RlQ2FzY2FkZXM9bm9kZUNhc2NhZGVzO3RoaXMuX3Byb3BlcnRpZXNTdGF0ZT1uZXcgTWFwKCk7dGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzPW5ldyBNYXAoKTt0aGlzLl9jb21wdXRlZENTU1ZhcmlhYmxlcz1uZXcgTWFwKCk7dGhpcy5faW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5fc3R5bGVUb05vZGVDYXNjYWRlPW5ldyBNYXAoKTtmb3IoY29uc3Qgbm9kZUNhc2NhZGUgb2Ygbm9kZUNhc2NhZGVzKXtmb3IoY29uc3Qgc3R5bGUgb2Ygbm9kZUNhc2NhZGUuX3N0eWxlcykKdGhpcy5fc3R5bGVUb05vZGVDYXNjYWRlLnNldChzdHlsZSxub2RlQ2FzY2FkZSk7fX0KYXZhaWxhYmxlQ1NTVmFyaWFibGVzKHN0eWxlKXtjb25zdCBub2RlQ2FzY2FkZT10aGlzLl9zdHlsZVRvTm9kZUNhc2NhZGUuZ2V0KHN0eWxlKTtpZighbm9kZUNhc2NhZGUpCnJldHVybltdO3RoaXMuX2Vuc3VyZUluaXRpYWxpemVkKCk7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzLmdldChub2RlQ2FzY2FkZSkua2V5cygpKTt9CmNvbXB1dGVDU1NWYXJpYWJsZShzdHlsZSx2YXJpYWJsZU5hbWUpe2NvbnN0IG5vZGVDYXNjYWRlPXRoaXMuX3N0eWxlVG9Ob2RlQ2FzY2FkZS5nZXQoc3R5bGUpO2lmKCFub2RlQ2FzY2FkZSkKcmV0dXJuIG51bGw7dGhpcy5fZW5zdXJlSW5pdGlhbGl6ZWQoKTtjb25zdCBhdmFpbGFibGVDU1NWYXJpYWJsZXM9dGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzLmdldChub2RlQ2FzY2FkZSk7Y29uc3QgY29tcHV0ZWRDU1NWYXJpYWJsZXM9dGhpcy5fY29tcHV0ZWRDU1NWYXJpYWJsZXMuZ2V0KG5vZGVDYXNjYWRlKTtyZXR1cm4gdGhpcy5faW5uZXJDb21wdXRlQ1NTVmFyaWFibGUoYXZhaWxhYmxlQ1NTVmFyaWFibGVzLGNvbXB1dGVkQ1NTVmFyaWFibGVzLHZhcmlhYmxlTmFtZSk7fQpjb21wdXRlVmFsdWUoc3R5bGUsdmFsdWUpe2NvbnN0IG5vZGVDYXNjYWRlPXRoaXMuX3N0eWxlVG9Ob2RlQ2FzY2FkZS5nZXQoc3R5bGUpO2lmKCFub2RlQ2FzY2FkZSkKcmV0dXJuIG51bGw7dGhpcy5fZW5zdXJlSW5pdGlhbGl6ZWQoKTtjb25zdCBhdmFpbGFibGVDU1NWYXJpYWJsZXM9dGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzLmdldChub2RlQ2FzY2FkZSk7Y29uc3QgY29tcHV0ZWRDU1NWYXJpYWJsZXM9dGhpcy5fY29tcHV0ZWRDU1NWYXJpYWJsZXMuZ2V0KG5vZGVDYXNjYWRlKTtyZXR1cm4gdGhpcy5faW5uZXJDb21wdXRlVmFsdWUoYXZhaWxhYmxlQ1NTVmFyaWFibGVzLGNvbXB1dGVkQ1NTVmFyaWFibGVzLHZhbHVlKTt9Cl9pbm5lckNvbXB1dGVDU1NWYXJpYWJsZShhdmFpbGFibGVDU1NWYXJpYWJsZXMsY29tcHV0ZWRDU1NWYXJpYWJsZXMsdmFyaWFibGVOYW1lKXtpZighYXZhaWxhYmxlQ1NTVmFyaWFibGVzLmhhcyh2YXJpYWJsZU5hbWUpKQpyZXR1cm4gbnVsbDtpZihjb21wdXRlZENTU1ZhcmlhYmxlcy5oYXModmFyaWFibGVOYW1lKSkKcmV0dXJuIGNvbXB1dGVkQ1NTVmFyaWFibGVzLmdldCh2YXJpYWJsZU5hbWUpO2NvbXB1dGVkQ1NTVmFyaWFibGVzLnNldCh2YXJpYWJsZU5hbWUsbnVsbCk7Y29uc3QgZGVmaW5lZFZhbHVlPWF2YWlsYWJsZUNTU1ZhcmlhYmxlcy5nZXQodmFyaWFibGVOYW1lKTtjb25zdCBjb21wdXRlZFZhbHVlPXRoaXMuX2lubmVyQ29tcHV0ZVZhbHVlKGF2YWlsYWJsZUNTU1ZhcmlhYmxlcyxjb21wdXRlZENTU1ZhcmlhYmxlcyxkZWZpbmVkVmFsdWUpO2NvbXB1dGVkQ1NTVmFyaWFibGVzLnNldCh2YXJpYWJsZU5hbWUsY29tcHV0ZWRWYWx1ZSk7cmV0dXJuIGNvbXB1dGVkVmFsdWU7fQpfaW5uZXJDb21wdXRlVmFsdWUoYXZhaWxhYmxlQ1NTVmFyaWFibGVzLGNvbXB1dGVkQ1NTVmFyaWFibGVzLHZhbHVlKXtjb25zdCByZXN1bHRzPVRleHRVdGlscy5UZXh0VXRpbHMuc3BsaXRTdHJpbmdCeVJlZ2V4ZXModmFsdWUsW1NESy5DU1NNZXRhZGF0YS5WYXJpYWJsZVJlZ2V4XSk7Y29uc3QgdG9rZW5zPVtdO2Zvcihjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7aWYocmVzdWx0LnJlZ2V4SW5kZXg9PT0tMSl7dG9rZW5zLnB1c2gocmVzdWx0LnZhbHVlKTtjb250aW51ZTt9CmNvbnN0IHJlZ2V4TWF0Y2g9cmVzdWx0LnZhbHVlLm1hdGNoKC9edmFyXCgoLS1bYS16QS1aMC05LV9dKylbLF0/XHMqKC4qKVwpJC8pO2lmKCFyZWdleE1hdGNoKQpyZXR1cm4gbnVsbDtjb25zdCBjc3NWYXJpYWJsZT1yZWdleE1hdGNoWzFdO2NvbnN0IGNvbXB1dGVkVmFsdWU9dGhpcy5faW5uZXJDb21wdXRlQ1NTVmFyaWFibGUoYXZhaWxhYmxlQ1NTVmFyaWFibGVzLGNvbXB1dGVkQ1NTVmFyaWFibGVzLGNzc1ZhcmlhYmxlKTtpZihjb21wdXRlZFZhbHVlPT09bnVsbCYmIXJlZ2V4TWF0Y2hbMl0pCnJldHVybiBudWxsO2lmKGNvbXB1dGVkVmFsdWU9PT1udWxsKQp0b2tlbnMucHVzaChyZWdleE1hdGNoWzJdKTtlbHNlCnRva2Vucy5wdXNoKGNvbXB1dGVkVmFsdWUpO30KcmV0dXJuIHRva2Vucy5tYXAodG9rZW49PnRva2VuLnRyaW0oKSkuam9pbignICcpO30Kc3R5bGVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fc3R5bGVUb05vZGVDYXNjYWRlLmtleXMoKSk7fQpwcm9wZXJ0eVN0YXRlKHByb3BlcnR5KXt0aGlzLl9lbnN1cmVJbml0aWFsaXplZCgpO3JldHVybiB0aGlzLl9wcm9wZXJ0aWVzU3RhdGUuZ2V0KHByb3BlcnR5KXx8bnVsbDt9CnJlc2V0KCl7dGhpcy5faW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5fcHJvcGVydGllc1N0YXRlLmNsZWFyKCk7dGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzLmNsZWFyKCk7dGhpcy5fY29tcHV0ZWRDU1NWYXJpYWJsZXMuY2xlYXIoKTt9Cl9lbnN1cmVJbml0aWFsaXplZCgpe2lmKHRoaXMuX2luaXRpYWxpemVkKQpyZXR1cm47dGhpcy5faW5pdGlhbGl6ZWQ9dHJ1ZTtjb25zdCBhY3RpdmVQcm9wZXJ0aWVzPW5ldyBNYXAoKTtmb3IoY29uc3Qgbm9kZUNhc2NhZGUgb2YgdGhpcy5fbm9kZUNhc2NhZGVzKXtub2RlQ2FzY2FkZS5fY29tcHV0ZUFjdGl2ZVByb3BlcnRpZXMoKTtmb3IoY29uc3QgZW50cnkgb2Ygbm9kZUNhc2NhZGUuX3Byb3BlcnRpZXNTdGF0ZS5lbnRyaWVzKCkpe2NvbnN0IHByb3BlcnR5PShlbnRyeVswXSk7Y29uc3Qgc3RhdGU9KGVudHJ5WzFdKTtpZihzdGF0ZT09PVNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCl7dGhpcy5fcHJvcGVydGllc1N0YXRlLnNldChwcm9wZXJ0eSxTREsuQ1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLk92ZXJsb2FkZWQpO2NvbnRpbnVlO30KY29uc3QgY2Fub25pY2FsTmFtZT1TREsuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk7aWYoYWN0aXZlUHJvcGVydGllcy5oYXMoY2Fub25pY2FsTmFtZSkpe3RoaXMuX3Byb3BlcnRpZXNTdGF0ZS5zZXQocHJvcGVydHksU0RLLkNTU01hdGNoZWRTdHlsZXMuUHJvcGVydHlTdGF0ZS5PdmVybG9hZGVkKTtjb250aW51ZTt9CmFjdGl2ZVByb3BlcnRpZXMuc2V0KGNhbm9uaWNhbE5hbWUscHJvcGVydHkpO3RoaXMuX3Byb3BlcnRpZXNTdGF0ZS5zZXQocHJvcGVydHksU0RLLkNTU01hdGNoZWRTdHlsZXMuUHJvcGVydHlTdGF0ZS5BY3RpdmUpO319CmZvcihjb25zdCBlbnRyeSBvZiBhY3RpdmVQcm9wZXJ0aWVzLmVudHJpZXMoKSl7Y29uc3QgY2Fub25pY2FsTmFtZT0oZW50cnlbMF0pO2NvbnN0IHNob3J0aGFuZFByb3BlcnR5PShlbnRyeVsxXSk7Y29uc3Qgc2hvcnRoYW5kU3R5bGU9c2hvcnRoYW5kUHJvcGVydHkub3duZXJTdHlsZTtjb25zdCBsb25naGFuZHM9c2hvcnRoYW5kU3R5bGUubG9uZ2hhbmRQcm9wZXJ0aWVzKHNob3J0aGFuZFByb3BlcnR5Lm5hbWUpO2lmKCFsb25naGFuZHMubGVuZ3RoKQpjb250aW51ZTtsZXQgaGFzQWN0aXZlTG9uZ2hhbmRzPWZhbHNlO2Zvcihjb25zdCBsb25naGFuZCBvZiBsb25naGFuZHMpe2NvbnN0IGxvbmdoYW5kQ2Fub25pY2FsTmFtZT1TREsuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUobG9uZ2hhbmQubmFtZSk7Y29uc3QgbG9uZ2hhbmRBY3RpdmVQcm9wZXJ0eT1hY3RpdmVQcm9wZXJ0aWVzLmdldChsb25naGFuZENhbm9uaWNhbE5hbWUpO2lmKCFsb25naGFuZEFjdGl2ZVByb3BlcnR5KQpjb250aW51ZTtpZihsb25naGFuZEFjdGl2ZVByb3BlcnR5Lm93bmVyU3R5bGU9PT1zaG9ydGhhbmRTdHlsZSl7aGFzQWN0aXZlTG9uZ2hhbmRzPXRydWU7YnJlYWs7fX0KaWYoaGFzQWN0aXZlTG9uZ2hhbmRzKQpjb250aW51ZTthY3RpdmVQcm9wZXJ0aWVzLmRlbGV0ZShjYW5vbmljYWxOYW1lKTt0aGlzLl9wcm9wZXJ0aWVzU3RhdGUuc2V0KHNob3J0aGFuZFByb3BlcnR5LFNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCk7fQpjb25zdCBhY2N1bXVsYXRlZENTU1ZhcmlhYmxlcz1uZXcgTWFwKCk7Zm9yKGxldCBpPXRoaXMuX25vZGVDYXNjYWRlcy5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3Qgbm9kZUNhc2NhZGU9dGhpcy5fbm9kZUNhc2NhZGVzW2ldO2Zvcihjb25zdCBlbnRyeSBvZiBub2RlQ2FzY2FkZS5fYWN0aXZlUHJvcGVydGllcy5lbnRyaWVzKCkpe2NvbnN0IHByb3BlcnR5TmFtZT0oZW50cnlbMF0pO2NvbnN0IHByb3BlcnR5PShlbnRyeVsxXSk7aWYocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoJy0tJykpCmFjY3VtdWxhdGVkQ1NTVmFyaWFibGVzLnNldChwcm9wZXJ0eU5hbWUscHJvcGVydHkudmFsdWUpO30KdGhpcy5fYXZhaWxhYmxlQ1NTVmFyaWFibGVzLnNldChub2RlQ2FzY2FkZSxuZXcgTWFwKGFjY3VtdWxhdGVkQ1NTVmFyaWFibGVzKSk7dGhpcy5fY29tcHV0ZWRDU1NWYXJpYWJsZXMuc2V0KG5vZGVDYXNjYWRlLG5ldyBNYXAoKSk7fX19O1NESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGU9e0FjdGl2ZTonQWN0aXZlJyxPdmVybG9hZGVkOidPdmVybG9hZGVkJ307O1NESy5DU1NNZWRpYVF1ZXJ5PWNsYXNze2NvbnN0cnVjdG9yKHBheWxvYWQpe3RoaXMuX2FjdGl2ZT1wYXlsb2FkLmFjdGl2ZTt0aGlzLl9leHByZXNzaW9ucz1bXTtmb3IobGV0IGo9MDtqPHBheWxvYWQuZXhwcmVzc2lvbnMubGVuZ3RoOysraikKdGhpcy5fZXhwcmVzc2lvbnMucHVzaChTREsuQ1NTTWVkaWFRdWVyeUV4cHJlc3Npb24ucGFyc2VQYXlsb2FkKHBheWxvYWQuZXhwcmVzc2lvbnNbal0pKTt9CnN0YXRpYyBwYXJzZVBheWxvYWQocGF5bG9hZCl7cmV0dXJuIG5ldyBTREsuQ1NTTWVkaWFRdWVyeShwYXlsb2FkKTt9CmFjdGl2ZSgpe3JldHVybiB0aGlzLl9hY3RpdmU7fQpleHByZXNzaW9ucygpe3JldHVybiB0aGlzLl9leHByZXNzaW9uczt9fTtTREsuQ1NTTWVkaWFRdWVyeUV4cHJlc3Npb249Y2xhc3N7Y29uc3RydWN0b3IocGF5bG9hZCl7dGhpcy5fdmFsdWU9cGF5bG9hZC52YWx1ZTt0aGlzLl91bml0PXBheWxvYWQudW5pdDt0aGlzLl9mZWF0dXJlPXBheWxvYWQuZmVhdHVyZTt0aGlzLl92YWx1ZVJhbmdlPXBheWxvYWQudmFsdWVSYW5nZT9UZXh0VXRpbHMuVGV4dFJhbmdlLmZyb21PYmplY3QocGF5bG9hZC52YWx1ZVJhbmdlKTpudWxsO3RoaXMuX2NvbXB1dGVkTGVuZ3RoPXBheWxvYWQuY29tcHV0ZWRMZW5ndGh8fG51bGw7fQpzdGF0aWMgcGFyc2VQYXlsb2FkKHBheWxvYWQpe3JldHVybiBuZXcgU0RLLkNTU01lZGlhUXVlcnlFeHByZXNzaW9uKHBheWxvYWQpO30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWU7fQp1bml0KCl7cmV0dXJuIHRoaXMuX3VuaXQ7fQpmZWF0dXJlKCl7cmV0dXJuIHRoaXMuX2ZlYXR1cmU7fQp2YWx1ZVJhbmdlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlUmFuZ2U7fQpjb21wdXRlZExlbmd0aCgpe3JldHVybiB0aGlzLl9jb21wdXRlZExlbmd0aDt9fTtTREsuQ1NTTWVkaWE9Y2xhc3N7Y29uc3RydWN0b3IoY3NzTW9kZWwscGF5bG9hZCl7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5fcmVpbml0aWFsaXplKHBheWxvYWQpO30Kc3RhdGljIHBhcnNlUGF5bG9hZChjc3NNb2RlbCxwYXlsb2FkKXtyZXR1cm4gbmV3IFNESy5DU1NNZWRpYShjc3NNb2RlbCxwYXlsb2FkKTt9CnN0YXRpYyBwYXJzZU1lZGlhQXJyYXlQYXlsb2FkKGNzc01vZGVsLHBheWxvYWQpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHBheWxvYWQubGVuZ3RoOysraSkKcmVzdWx0LnB1c2goU0RLLkNTU01lZGlhLnBhcnNlUGF5bG9hZChjc3NNb2RlbCxwYXlsb2FkW2ldKSk7cmV0dXJuIHJlc3VsdDt9Cl9yZWluaXRpYWxpemUocGF5bG9hZCl7dGhpcy50ZXh0PXBheWxvYWQudGV4dDt0aGlzLnNvdXJjZT1wYXlsb2FkLnNvdXJjZTt0aGlzLnNvdXJjZVVSTD1wYXlsb2FkLnNvdXJjZVVSTHx8Jyc7dGhpcy5yYW5nZT1wYXlsb2FkLnJhbmdlP1RleHRVdGlscy5UZXh0UmFuZ2UuZnJvbU9iamVjdChwYXlsb2FkLnJhbmdlKTpudWxsO3RoaXMuc3R5bGVTaGVldElkPXBheWxvYWQuc3R5bGVTaGVldElkO3RoaXMubWVkaWFMaXN0PW51bGw7aWYocGF5bG9hZC5tZWRpYUxpc3Qpe3RoaXMubWVkaWFMaXN0PVtdO2ZvcihsZXQgaT0wO2k8cGF5bG9hZC5tZWRpYUxpc3QubGVuZ3RoOysraSkKdGhpcy5tZWRpYUxpc3QucHVzaChTREsuQ1NTTWVkaWFRdWVyeS5wYXJzZVBheWxvYWQocGF5bG9hZC5tZWRpYUxpc3RbaV0pKTt9fQpyZWJhc2UoZWRpdCl7aWYodGhpcy5zdHlsZVNoZWV0SWQhPT1lZGl0LnN0eWxlU2hlZXRJZHx8IXRoaXMucmFuZ2UpCnJldHVybjtpZihlZGl0Lm9sZFJhbmdlLmVxdWFsKHRoaXMucmFuZ2UpKQp0aGlzLl9yZWluaXRpYWxpemUoKGVkaXQucGF5bG9hZCkpO2Vsc2UKdGhpcy5yYW5nZT10aGlzLnJhbmdlLnJlYmFzZUFmdGVyVGV4dEVkaXQoZWRpdC5vbGRSYW5nZSxlZGl0Lm5ld1JhbmdlKTt9CmVxdWFsKG90aGVyKXtpZighdGhpcy5zdHlsZVNoZWV0SWR8fCF0aGlzLnJhbmdlfHwhb3RoZXIucmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gdGhpcy5zdHlsZVNoZWV0SWQ9PT1vdGhlci5zdHlsZVNoZWV0SWQmJnRoaXMucmFuZ2UuZXF1YWwob3RoZXIucmFuZ2UpO30KYWN0aXZlKCl7aWYoIXRoaXMubWVkaWFMaXN0KQpyZXR1cm4gdHJ1ZTtmb3IobGV0IGk9MDtpPHRoaXMubWVkaWFMaXN0Lmxlbmd0aDsrK2kpe2lmKHRoaXMubWVkaWFMaXN0W2ldLmFjdGl2ZSgpKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CmxpbmVOdW1iZXJJblNvdXJjZSgpe2lmKCF0aGlzLnJhbmdlKQpyZXR1cm4gdW5kZWZpbmVkO2NvbnN0IGhlYWRlcj10aGlzLmhlYWRlcigpO2lmKCFoZWFkZXIpCnJldHVybiB1bmRlZmluZWQ7cmV0dXJuIGhlYWRlci5saW5lTnVtYmVySW5Tb3VyY2UodGhpcy5yYW5nZS5zdGFydExpbmUpO30KY29sdW1uTnVtYmVySW5Tb3VyY2UoKXtpZighdGhpcy5yYW5nZSkKcmV0dXJuIHVuZGVmaW5lZDtjb25zdCBoZWFkZXI9dGhpcy5oZWFkZXIoKTtpZighaGVhZGVyKQpyZXR1cm4gdW5kZWZpbmVkO3JldHVybiBoZWFkZXIuY29sdW1uTnVtYmVySW5Tb3VyY2UodGhpcy5yYW5nZS5zdGFydExpbmUsdGhpcy5yYW5nZS5zdGFydENvbHVtbik7fQpoZWFkZXIoKXtyZXR1cm4gdGhpcy5zdHlsZVNoZWV0SWQ/dGhpcy5fY3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuc3R5bGVTaGVldElkKTpudWxsO30KcmF3TG9jYXRpb24oKXtjb25zdCBoZWFkZXI9dGhpcy5oZWFkZXIoKTtpZighaGVhZGVyfHx0aGlzLmxpbmVOdW1iZXJJblNvdXJjZSgpPT09dW5kZWZpbmVkKQpyZXR1cm4gbnVsbDtjb25zdCBsaW5lTnVtYmVyPU51bWJlcih0aGlzLmxpbmVOdW1iZXJJblNvdXJjZSgpKTtyZXR1cm4gbmV3IFNESy5DU1NMb2NhdGlvbihoZWFkZXIsbGluZU51bWJlcix0aGlzLmNvbHVtbk51bWJlckluU291cmNlKCkpO319O1NESy5DU1NNZWRpYS5Tb3VyY2U9e0xJTktFRF9TSEVFVDonbGlua2VkU2hlZXQnLElOTElORV9TSEVFVDonaW5saW5lU2hlZXQnLE1FRElBX1JVTEU6J21lZGlhUnVsZScsSU1QT1JUX1JVTEU6J2ltcG9ydFJ1bGUnfTs7U0RLLkNTU01ldGFkYXRhPWNsYXNze2NvbnN0cnVjdG9yKHByb3BlcnRpZXMpe3RoaXMuX3ZhbHVlcz0oW10pO3RoaXMuX2xvbmdoYW5kcz1uZXcgTWFwKCk7dGhpcy5fc2hvcnRoYW5kcz1uZXcgTWFwKCk7dGhpcy5faW5oZXJpdGVkPW5ldyBTZXQoKTt0aGlzLl9zdmdQcm9wZXJ0aWVzPW5ldyBTZXQoKTtmb3IobGV0IGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoOysraSl7Y29uc3QgcHJvcGVydHk9cHJvcGVydGllc1tpXTtjb25zdCBwcm9wZXJ0eU5hbWU9cHJvcGVydHkubmFtZTtpZighQ1NTLnN1cHBvcnRzKHByb3BlcnR5TmFtZSwnaW5pdGlhbCcpKQpjb250aW51ZTt0aGlzLl92YWx1ZXMucHVzaChwcm9wZXJ0eU5hbWUpO2lmKHByb3BlcnR5LmluaGVyaXRlZCkKdGhpcy5faW5oZXJpdGVkLmFkZChwcm9wZXJ0eU5hbWUpO2lmKHByb3BlcnR5LnN2ZykKdGhpcy5fc3ZnUHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtjb25zdCBsb25naGFuZHM9cHJvcGVydGllc1tpXS5sb25naGFuZHM7aWYobG9uZ2hhbmRzKXt0aGlzLl9sb25naGFuZHMuc2V0KHByb3BlcnR5TmFtZSxsb25naGFuZHMpO2ZvcihsZXQgaj0wO2o8bG9uZ2hhbmRzLmxlbmd0aDsrK2ope2NvbnN0IGxvbmdoYW5kTmFtZT1sb25naGFuZHNbal07bGV0IHNob3J0aGFuZHM9dGhpcy5fc2hvcnRoYW5kcy5nZXQobG9uZ2hhbmROYW1lKTtpZighc2hvcnRoYW5kcyl7c2hvcnRoYW5kcz1bXTt0aGlzLl9zaG9ydGhhbmRzLnNldChsb25naGFuZE5hbWUsc2hvcnRoYW5kcyk7fQpzaG9ydGhhbmRzLnB1c2gocHJvcGVydHlOYW1lKTt9fX0KdGhpcy5fdmFsdWVzLnNvcnQoKTt0aGlzLl92YWx1ZXNTZXQ9bmV3IFNldCh0aGlzLl92YWx1ZXMpO30KYWxsUHJvcGVydGllcygpe3JldHVybiB0aGlzLl92YWx1ZXM7fQppc1NWR1Byb3BlcnR5KG5hbWUpe25hbWU9bmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0aGlzLl9zdmdQcm9wZXJ0aWVzLmhhcyhuYW1lKTt9CmxvbmdoYW5kcyhzaG9ydGhhbmQpe3JldHVybiB0aGlzLl9sb25naGFuZHMuZ2V0KHNob3J0aGFuZCl8fG51bGw7fQpzaG9ydGhhbmRzKGxvbmdoYW5kKXtyZXR1cm4gdGhpcy5fc2hvcnRoYW5kcy5nZXQobG9uZ2hhbmQpfHxudWxsO30KaXNDb2xvckF3YXJlUHJvcGVydHkocHJvcGVydHlOYW1lKXtyZXR1cm4hIVNESy5DU1NNZXRhZGF0YS5fY29sb3JBd2FyZVByb3BlcnRpZXMuaGFzKHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpKXx8dGhpcy5pc0N1c3RvbVByb3BlcnR5KHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpKTt9CmlzTGVuZ3RoUHJvcGVydHkocHJvcGVydHlOYW1lKXtwcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7aWYocHJvcGVydHlOYW1lPT09J2xpbmUtaGVpZ2h0JykKcmV0dXJuIGZhbHNlO3JldHVybiBTREsuQ1NTTWV0YWRhdGEuX2Rpc3RhbmNlUHJvcGVydGllcy5oYXMocHJvcGVydHlOYW1lKXx8cHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoJ21hcmdpbicpfHxwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgncGFkZGluZycpfHxwcm9wZXJ0eU5hbWUuaW5kZXhPZignd2lkdGgnKSE9PS0xfHxwcm9wZXJ0eU5hbWUuaW5kZXhPZignaGVpZ2h0JykhPT0tMTt9CmlzQmV6aWVyQXdhcmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpe3Byb3BlcnR5TmFtZT1wcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4hIVNESy5DU1NNZXRhZGF0YS5fYmV6aWVyQXdhcmVQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eU5hbWUpfHx0aGlzLmlzQ3VzdG9tUHJvcGVydHkocHJvcGVydHlOYW1lKTt9CmlzQ3VzdG9tUHJvcGVydHkocHJvcGVydHlOYW1lKXtyZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoJy0tJyk7fQpjYW5vbmljYWxQcm9wZXJ0eU5hbWUobmFtZSl7bmFtZT1uYW1lLnRvTG93ZXJDYXNlKCk7aWYoIW5hbWV8fG5hbWUubGVuZ3RoPDl8fG5hbWUuY2hhckF0KDApIT09Jy0nKQpyZXR1cm4gbmFtZTtjb25zdCBtYXRjaD1uYW1lLm1hdGNoKC8oPzotd2Via2l0LSkoLispLyk7aWYoIW1hdGNofHwhdGhpcy5fdmFsdWVzU2V0LmhhcyhtYXRjaFsxXSkpCnJldHVybiBuYW1lO3JldHVybiBtYXRjaFsxXTt9CmlzQ1NTUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSl7cHJvcGVydHlOYW1lPXByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO2lmKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCctbW96LScpfHxwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgnLW8tJyl8fHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCctd2Via2l0LScpfHxwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgnLW1zLScpKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fdmFsdWVzU2V0Lmhhcyhwcm9wZXJ0eU5hbWUpO30KaXNQcm9wZXJ0eUluaGVyaXRlZChwcm9wZXJ0eU5hbWUpe3Byb3BlcnR5TmFtZT1wcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoJy0tJyl8fHRoaXMuX2luaGVyaXRlZC5oYXModGhpcy5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSl8fHRoaXMuX2luaGVyaXRlZC5oYXMocHJvcGVydHlOYW1lKTt9CnByb3BlcnR5VmFsdWVzKHByb3BlcnR5TmFtZSl7Y29uc3QgYWNjZXB0ZWRLZXl3b3Jkcz1bJ2luaGVyaXQnLCdpbml0aWFsJywndW5zZXQnXTtwcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7Y29uc3QgdW5wcmVmaXhlZE5hbWU9cHJvcGVydHlOYW1lLnJlcGxhY2UoL14td2Via2l0LS8sJycpO2NvbnN0IGVudHJ5PVNESy5DU1NNZXRhZGF0YS5fcHJvcGVydHlEYXRhTWFwW3Byb3BlcnR5TmFtZV18fFNESy5DU1NNZXRhZGF0YS5fcHJvcGVydHlEYXRhTWFwW3VucHJlZml4ZWROYW1lXTtpZihlbnRyeSYmZW50cnkudmFsdWVzKQphY2NlcHRlZEtleXdvcmRzLnB1c2hBbGwoZW50cnkudmFsdWVzKTtpZih0aGlzLmlzQ29sb3JBd2FyZVByb3BlcnR5KHByb3BlcnR5TmFtZSkpe2FjY2VwdGVkS2V5d29yZHMucHVzaCgnY3VycmVudENvbG9yJyk7Zm9yKGNvbnN0IGNvbG9yIGluIENvbW1vbi5Db2xvci5OaWNrbmFtZXMpCmFjY2VwdGVkS2V5d29yZHMucHVzaChjb2xvcik7fQpyZXR1cm4gYWNjZXB0ZWRLZXl3b3Jkcy5zb3J0KCk7fQpwcm9wZXJ0eVVzYWdlV2VpZ2h0KHByb3BlcnR5KXtyZXR1cm4gU0RLLkNTU01ldGFkYXRhLldlaWdodFtwcm9wZXJ0eV18fFNESy5DU1NNZXRhZGF0YS5XZWlnaHRbdGhpcy5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHkpXXx8MDt9fTtTREsuQ1NTTWV0YWRhdGEuVmFyaWFibGVSZWdleD0vKHZhclwoLS0uKj9cKSkvZztTREsuQ1NTTWV0YWRhdGEuVVJMUmVnZXg9L3VybFwoXHMqKCcuKz8nfCIuKz8ifFteKV0rKVxzKlwpL2c7U0RLLmNzc01ldGFkYXRhPWZ1bmN0aW9uKCl7aWYoIVNESy5DU1NNZXRhZGF0YS5faW5zdGFuY2UpClNESy5DU1NNZXRhZGF0YS5faW5zdGFuY2U9bmV3IFNESy5DU1NNZXRhZGF0YShTREsuQ1NTTWV0YWRhdGEuX2dlbmVyYXRlZFByb3BlcnRpZXN8fFtdKTtyZXR1cm4gU0RLLkNTU01ldGFkYXRhLl9pbnN0YW5jZTt9O1NESy5DU1NNZXRhZGF0YS5fZGlzdGFuY2VQcm9wZXJ0aWVzPW5ldyBTZXQoWydiYWNrZ3JvdW5kLXBvc2l0aW9uJywnYm9yZGVyLXNwYWNpbmcnLCdib3R0b20nLCdmb250LXNpemUnLCdoZWlnaHQnLCdsZWZ0JywnbGV0dGVyLXNwYWNpbmcnLCdtYXgtaGVpZ2h0JywnbWF4LXdpZHRoJywnbWluLWhlaWdodCcsJ21pbi13aWR0aCcsJ3JpZ2h0JywndGV4dC1pbmRlbnQnLCd0b3AnLCd3aWR0aCcsJ3dvcmQtc3BhY2luZycsJ2dyaWQtcm93LWdhcCcsJ2dyaWQtY29sdW1uLWdhcCddKTtTREsuQ1NTTWV0YWRhdGEuX2JlemllckF3YXJlUHJvcGVydGllcz1uZXcgU2V0KFsnYW5pbWF0aW9uJywnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbicsJ3RyYW5zaXRpb24nLCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsJy13ZWJraXQtYW5pbWF0aW9uJywnLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJywnLXdlYmtpdC10cmFuc2l0aW9uJywnLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiddKTtTREsuQ1NTTWV0YWRhdGEuX2NvbG9yQXdhcmVQcm9wZXJ0aWVzPW5ldyBTZXQoWydiYWNrZHJvcC1maWx0ZXInLCdiYWNrZ3JvdW5kJywnYmFja2dyb3VuZC1jb2xvcicsJ2JhY2tncm91bmQtaW1hZ2UnLCdib3JkZXInLCdib3JkZXItY29sb3InLCdib3JkZXItaW1hZ2UnLCdib3JkZXItaW1hZ2Utc291cmNlJywnYm9yZGVyLWJvdHRvbScsJ2JvcmRlci1ib3R0b20tY29sb3InLCdib3JkZXItbGVmdCcsJ2JvcmRlci1sZWZ0LWNvbG9yJywnYm9yZGVyLXJpZ2h0JywnYm9yZGVyLXJpZ2h0LWNvbG9yJywnYm9yZGVyLXRvcCcsJ2JvcmRlci10b3AtY29sb3InLCdib3gtc2hhZG93JywnY2FyZXQtY29sb3InLCdjb2xvcicsJ2NvbHVtbi1ydWxlJywnY29sdW1uLXJ1bGUtY29sb3InLCdmaWxsJywnbGlzdC1zdHlsZScsJ2xpc3Qtc3R5bGUtaW1hZ2UnLCdvdXRsaW5lJywnb3V0bGluZS1jb2xvcicsJ3N0cm9rZScsJ3RleHQtZGVjb3JhdGlvbi1jb2xvcicsJ3RleHQtc2hhZG93JywnLXdlYmtpdC1ib3JkZXItYWZ0ZXInLCctd2Via2l0LWJvcmRlci1hZnRlci1jb2xvcicsJy13ZWJraXQtYm9yZGVyLWJlZm9yZScsJy13ZWJraXQtYm9yZGVyLWJlZm9yZS1jb2xvcicsJy13ZWJraXQtYm9yZGVyLWVuZCcsJy13ZWJraXQtYm9yZGVyLWVuZC1jb2xvcicsJy13ZWJraXQtYm9yZGVyLXN0YXJ0JywnLXdlYmtpdC1ib3JkZXItc3RhcnQtY29sb3InLCctd2Via2l0LWJveC1yZWZsZWN0JywnLXdlYmtpdC1ib3gtc2hhZG93JywnLXdlYmtpdC1jb2x1bW4tcnVsZS1jb2xvcicsJy13ZWJraXQtZmlsdGVyJywnLXdlYmtpdC1tYXNrJywnLXdlYmtpdC1tYXNrLWJveC1pbWFnZScsJy13ZWJraXQtbWFzay1ib3gtaW1hZ2Utc291cmNlJywnLXdlYmtpdC1tYXNrLWltYWdlJywnLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yJywnLXdlYmtpdC10ZXh0LWRlY29yYXRpb24tY29sb3InLCctd2Via2l0LXRleHQtZW1waGFzaXMnLCctd2Via2l0LXRleHQtZW1waGFzaXMtY29sb3InLCctd2Via2l0LXRleHQtZmlsbC1jb2xvcicsJy13ZWJraXQtdGV4dC1zdHJva2UnLCctd2Via2l0LXRleHQtc3Ryb2tlLWNvbG9yJ10pO1NESy5DU1NNZXRhZGF0YS5fcHJvcGVydHlEYXRhTWFwPXsndGFibGUtbGF5b3V0Jzp7dmFsdWVzOlsnYXV0bycsJ2ZpeGVkJ119LCd2aXNpYmlsaXR5Jzp7dmFsdWVzOlsnaGlkZGVuJywndmlzaWJsZScsJ2NvbGxhcHNlJ119LCdiYWNrZ3JvdW5kLXJlcGVhdCc6e3ZhbHVlczpbJ3JlcGVhdCcsJ3JlcGVhdC14JywncmVwZWF0LXknLCduby1yZXBlYXQnLCdzcGFjZScsJ3JvdW5kJ119LCdjb250ZW50Jzp7dmFsdWVzOlsnbm9uZScsJ25vcm1hbCcsJ2Nsb3NlLXF1b3RlJywnbm8tY2xvc2UtcXVvdGUnLCduby1vcGVuLXF1b3RlJywnb3Blbi1xdW90ZSddfSwnbGlzdC1zdHlsZS1pbWFnZSc6e3ZhbHVlczpbJ25vbmUnXX0sJ2NsZWFyJzp7dmFsdWVzOlsnbm9uZScsJ2xlZnQnLCdyaWdodCcsJ2JvdGgnXX0sJ292ZXJmbG93LXgnOnt2YWx1ZXM6WydoaWRkZW4nLCdhdXRvJywndmlzaWJsZScsJ292ZXJsYXknLCdzY3JvbGwnXX0sJ3N0cm9rZS1saW5lam9pbic6e3ZhbHVlczpbJ3JvdW5kJywnbWl0ZXInLCdiZXZlbCddfSwnYmFzZWxpbmUtc2hpZnQnOnt2YWx1ZXM6WydiYXNlbGluZScsJ3N1YicsJ3N1cGVyJ119LCdib3JkZXItYm90dG9tLXdpZHRoJzp7dmFsdWVzOlsnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCdtYXJnaW4tdG9wLWNvbGxhcHNlJzp7dmFsdWVzOlsnY29sbGFwc2UnLCdzZXBhcmF0ZScsJ2Rpc2NhcmQnXX0sJ21heC1oZWlnaHQnOnt2YWx1ZXM6Wydub25lJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdmaXQtY29udGVudCddfSwnYm94LW9yaWVudCc6e3ZhbHVlczpbJ2hvcml6b250YWwnLCd2ZXJ0aWNhbCcsJ2lubGluZS1heGlzJywnYmxvY2stYXhpcyddLH0sJ2ZvbnQtc3RyZXRjaCc6e3ZhbHVlczpbJ25vcm1hbCcsJ3VsdHJhLWNvbmRlbnNlZCcsJ2V4dHJhLWNvbmRlbnNlZCcsJ2NvbmRlbnNlZCcsJ3NlbWktY29uZGVuc2VkJywnc2VtaS1leHBhbmRlZCcsJ2V4cGFuZGVkJywnZXh0cmEtZXhwYW5kZWQnLCd1bHRyYS1leHBhbmRlZCddfSwnYm9yZGVyLWxlZnQtd2lkdGgnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJ2JveC1zaGFkb3cnOnt2YWx1ZXM6WydpbnNldCcsJ25vbmUnXX0sJy13ZWJraXQtd3JpdGluZy1tb2RlJzp7dmFsdWVzOlsnaG9yaXpvbnRhbC10YicsJ3ZlcnRpY2FsLXJsJywndmVydGljYWwtbHInXX0sJ3dyaXRpbmctbW9kZSc6e3ZhbHVlczpbJ2xyJywncmwnLCd0YicsJ2xyLXRiJywncmwtdGInLCd0Yi1ybCcsJ2hvcml6b250YWwtdGInLCd2ZXJ0aWNhbC1ybCcsJ3ZlcnRpY2FsLWxyJ119LCdib3JkZXItY29sbGFwc2UnOnt2YWx1ZXM6Wydjb2xsYXBzZScsJ3NlcGFyYXRlJ119LCdwYWdlLWJyZWFrLWluc2lkZSc6e3ZhbHVlczpbJ2F1dG8nLCdhdm9pZCddfSwnYm9yZGVyLXRvcC13aWR0aCc6e3ZhbHVlczpbJ21lZGl1bScsJ3RoaWNrJywndGhpbiddfSwnb3V0bGluZS1zdHlsZSc6e3ZhbHVlczpbJ2F1dG8nLCdub25lJywnaW5zZXQnLCdncm9vdmUnLCdyaWRnZScsJ291dHNldCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJ119LCdjdXJzb3InOnt2YWx1ZXM6Wydub25lJywnY29weScsJ2F1dG8nLCdjcm9zc2hhaXInLCdkZWZhdWx0JywncG9pbnRlcicsJ21vdmUnLCd2ZXJ0aWNhbC10ZXh0JywnY2VsbCcsJ2NvbnRleHQtbWVudScsJ2FsaWFzJywncHJvZ3Jlc3MnLCduby1kcm9wJywnbm90LWFsbG93ZWQnLCctd2Via2l0LXpvb20taW4nLCctd2Via2l0LXpvb20tb3V0JywnZS1yZXNpemUnLCduZS1yZXNpemUnLCdudy1yZXNpemUnLCduLXJlc2l6ZScsJ3NlLXJlc2l6ZScsJ3N3LXJlc2l6ZScsJ3MtcmVzaXplJywndy1yZXNpemUnLCdldy1yZXNpemUnLCducy1yZXNpemUnLCduZXN3LXJlc2l6ZScsJ253c2UtcmVzaXplJywnY29sLXJlc2l6ZScsJ3Jvdy1yZXNpemUnLCd0ZXh0Jywnd2FpdCcsJ2hlbHAnLCdhbGwtc2Nyb2xsJywnem9vbS1pbicsJ3pvb20tb3V0JywnLXdlYmtpdC1ncmFiJywnLXdlYmtpdC1ncmFiYmluZyddfSwnYm9yZGVyLXdpZHRoJzp7dmFsdWVzOlsnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCdib3JkZXItc3R5bGUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdyaWRnZScsJ291dHNldCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJ119LCdzaXplJzp7dmFsdWVzOlsnYXV0bycsJ2EzJywnYTQnLCdhNScsJ2I0JywnYjUnLCdsYW5kc2NhcGUnLCdsZWRnZXInLCdsZWdhbCcsJ2xldHRlcicsJ3BvcnRyYWl0J119LCdiYWNrZ3JvdW5kLXNpemUnOnt2YWx1ZXM6WydhdXRvJywnY29udGFpbicsJ2NvdmVyJ119LCdkaXJlY3Rpb24nOnt2YWx1ZXM6WydsdHInLCdydGwnXX0sJ2VuYWJsZS1iYWNrZ3JvdW5kJzp7dmFsdWVzOlsnYWNjdW11bGF0ZScsJ25ldyddfSwnZmxvYXQnOnt2YWx1ZXM6Wydub25lJywnbGVmdCcsJ3JpZ2h0J119LCdvdmVyZmxvdy15Jzp7dmFsdWVzOlsnaGlkZGVuJywnYXV0bycsJ3Zpc2libGUnLCdvdmVybGF5Jywnc2Nyb2xsJywnLXdlYmtpdC1wYWdlZC14JywnLXdlYmtpdC1wYWdlZC15J119LCdtYXJnaW4tYm90dG9tLWNvbGxhcHNlJzp7dmFsdWVzOlsnY29sbGFwc2UnLCdzZXBhcmF0ZScsJ2Rpc2NhcmQnXX0sJ2JveC1yZWZsZWN0Jzp7dmFsdWVzOlsnbGVmdCcsJ3JpZ2h0JywnYWJvdmUnLCdiZWxvdyddfSwnb3ZlcmZsb3cnOnt2YWx1ZXM6WydoaWRkZW4nLCdhdXRvJywndmlzaWJsZScsJ292ZXJsYXknLCdzY3JvbGwnLCctd2Via2l0LXBhZ2VkLXgnLCctd2Via2l0LXBhZ2VkLXknXX0sJ2NvbnRhaW4nOnt2YWx1ZXM6Wydub25lJywnc3RyaWN0JywnY29udGVudCcsJ3NpemUnLCdsYXlvdXQnLCdzdHlsZScsJ3BhaW50J119LCd0ZXh0LXJlbmRlcmluZyc6e3ZhbHVlczpbJ2F1dG8nLCdvcHRpbWl6ZVNwZWVkJywnb3B0aW1pemVMZWdpYmlsaXR5JywnZ2VvbWV0cmljUHJlY2lzaW9uJ119LCd0ZXh0LWFsaWduJzp7dmFsdWVzOlsnLXdlYmtpdC1hdXRvJywnc3RhcnQnLCdlbmQnLCdsZWZ0JywncmlnaHQnLCdjZW50ZXInLCdqdXN0aWZ5JywnLXdlYmtpdC1sZWZ0JywnLXdlYmtpdC1yaWdodCcsJy13ZWJraXQtY2VudGVyJywnLXdlYmtpdC1tYXRjaC1wYXJlbnQnXX0sJ2xpc3Qtc3R5bGUtcG9zaXRpb24nOnt2YWx1ZXM6WydvdXRzaWRlJywnaW5zaWRlJ119LCdtYXJnaW4tYm90dG9tJzp7dmFsdWVzOlsnYXV0byddfSwnY29sb3ItaW50ZXJwb2xhdGlvbic6e3ZhbHVlczpbJ2F1dG8nLCdzUkdCJywnbGluZWFyUkdCJ119LCdiYWNrZ3JvdW5kLW9yaWdpbic6e3ZhbHVlczpbJ2JvcmRlci1ib3gnLCdjb250ZW50LWJveCcsJ3BhZGRpbmctYm94J119LCd3b3JkLXdyYXAnOnt2YWx1ZXM6Wydub3JtYWwnLCdicmVhay13b3JkJ119LCdmb250LXdlaWdodCc6e3ZhbHVlczpbJ25vcm1hbCcsJ2JvbGQnLCdib2xkZXInLCdsaWdodGVyJywnMTAwJywnMjAwJywnMzAwJywnNDAwJywnNTAwJywnNjAwJywnNzAwJywnODAwJywnOTAwJ119LCdtYXJnaW4tYmVmb3JlLWNvbGxhcHNlJzp7dmFsdWVzOlsnY29sbGFwc2UnLCdzZXBhcmF0ZScsJ2Rpc2NhcmQnXX0sJ3RleHQtdHJhbnNmb3JtJzp7dmFsdWVzOlsnbm9uZScsJ2NhcGl0YWxpemUnLCd1cHBlcmNhc2UnLCdsb3dlcmNhc2UnXX0sJ2JvcmRlci1yaWdodC1zdHlsZSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ3JpZGdlJywnb3V0c2V0JywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnXX0sJ2JvcmRlci1sZWZ0LXN0eWxlJzp7dmFsdWVzOlsnbm9uZScsJ2hpZGRlbicsJ2luc2V0JywnZ3Jvb3ZlJywncmlkZ2UnLCdvdXRzZXQnLCdkb3R0ZWQnLCdkYXNoZWQnLCdzb2xpZCcsJ2RvdWJsZSddfSwnLXdlYmtpdC10ZXh0LWVtcGhhc2lzJzp7dmFsdWVzOlsnY2lyY2xlJywnZmlsbGVkJywnb3BlbicsJ2RvdCcsJ2RvdWJsZS1jaXJjbGUnLCd0cmlhbmdsZScsJ3Nlc2FtZScsJ25vbmUnXX0sJ2ZvbnQtc3R5bGUnOnt2YWx1ZXM6WydpdGFsaWMnLCdvYmxpcXVlJywnbm9ybWFsJ119LCdzcGVhayc6e3ZhbHVlczpbJ25vbmUnLCdub3JtYWwnLCdzcGVsbC1vdXQnLCdkaWdpdHMnLCdsaXRlcmFsLXB1bmN0dWF0aW9uJywnbm8tcHVuY3R1YXRpb24nXX0sJ2NvbG9yLXJlbmRlcmluZyc6e3ZhbHVlczpbJ2F1dG8nLCdvcHRpbWl6ZVNwZWVkJywnb3B0aW1pemVRdWFsaXR5J119LCdsaXN0LXN0eWxlLXR5cGUnOnt2YWx1ZXM6Wydub25lJywnZGlzYycsJ2NpcmNsZScsJ3NxdWFyZScsJ2RlY2ltYWwnLCdkZWNpbWFsLWxlYWRpbmctemVybycsJ2FyYWJpYy1pbmRpYycsJ2JlbmdhbGknLCdjYW1ib2RpYW4nLCdraG1lcicsJ2RldmFuYWdhcmknLCdndWphcmF0aScsJ2d1cm11a2hpJywna2FubmFkYScsJ2xhbycsJ21hbGF5YWxhbScsJ21vbmdvbGlhbicsJ215YW5tYXInLCdvcml5YScsJ3BlcnNpYW4nLCd1cmR1JywndGVsdWd1JywndGliZXRhbicsJ3RoYWknLCdsb3dlci1yb21hbicsJ3VwcGVyLXJvbWFuJywnbG93ZXItZ3JlZWsnLCdsb3dlci1hbHBoYScsJ2xvd2VyLWxhdGluJywndXBwZXItYWxwaGEnLCd1cHBlci1sYXRpbicsJ2V0aGlvcGljLWhhbGVoYW1lJywnZXRoaW9waWMtaGFsZWhhbWUtYW0nLCdldGhpb3BpYy1oYWxlaGFtZS10aS1lcicsJ2V0aGlvcGljLWhhbGVoYW1lLXRpLWV0JywnY2prLWVhcnRobHktYnJhbmNoJywnY2prLWhlYXZlbmx5LXN0ZW0nLCdoYW5ndWwtY29uc29uYW50JywnaGFuZ3VsJywna29yZWFuLWhhbmd1bC1mb3JtYWwnLCdrb3JlYW4taGFuamEtZm9ybWFsJywna29yZWFuLWhhbmphLWluZm9ybWFsJywnc2ltcC1jaGluZXNlLWZvcm1hbCcsJ3NpbXAtY2hpbmVzZS1pbmZvcm1hbCcsJ3RyYWQtY2hpbmVzZS1mb3JtYWwnLCd0cmFkLWNoaW5lc2UtaW5mb3JtYWwnLCdoZWJyZXcnLCdhcm1lbmlhbicsJ2xvd2VyLWFybWVuaWFuJywndXBwZXItYXJtZW5pYW4nLCdnZW9yZ2lhbicsJ2Nqay1pZGVvZ3JhcGhpYycsJ2hpcmFnYW5hJywna2F0YWthbmEnLCdoaXJhZ2FuYS1pcm9oYScsJ2thdGFrYW5hLWlyb2hhJ119LCd0ZXh0LWNvbWJpbmUtdXByaWdodCc6e3ZhbHVlczpbJ25vbmUnLCdhbGwnXX0sJy13ZWJraXQtdGV4dC1jb21iaW5lJzp7dmFsdWVzOlsnbm9uZScsJ2hvcml6b250YWwnXX0sJ3RleHQtb3JpZW50YXRpb24nOnt2YWx1ZXM6WydtaXhlZCcsJ3VwcmlnaHQnLCdzaWRld2F5cycsJ3NpZGV3YXlzLXJpZ2h0J119LCdvdXRsaW5lJzp7dmFsdWVzOlsnbm9uZScsJ2luc2V0JywnZ3Jvb3ZlJywncmlkZ2UnLCdvdXRzZXQnLCdkb3R0ZWQnLCdkYXNoZWQnLCdzb2xpZCcsJ2RvdWJsZScsJ21lZGl1bScsJ2F1dG8nLCd0aGljaycsJ3RoaW4nXX0sJ2ZvbnQnOnt2YWx1ZXM6WydjYXB0aW9uJywnaWNvbicsJ21lbnUnLCdtZXNzYWdlLWJveCcsJ3NtYWxsLWNhcHRpb24nLCctd2Via2l0LW1pbmktY29udHJvbCcsJy13ZWJraXQtc21hbGwtY29udHJvbCcsJy13ZWJraXQtY29udHJvbCcsJ3N0YXR1cy1iYXInLCdpdGFsaWMnLCdvYmxpcXVlJywnc21hbGwtY2FwcycsJ25vcm1hbCcsJ2JvbGQnLCdib2xkZXInLCdsaWdodGVyJywnMTAwJywnMjAwJywnMzAwJywnNDAwJywnNTAwJywnNjAwJywnNzAwJywnODAwJywnOTAwJywneHgtc21hbGwnLCd4LXNtYWxsJywnc21hbGwnLCdtZWRpdW0nLCdsYXJnZScsJ3gtbGFyZ2UnLCd4eC1sYXJnZScsJy13ZWJraXQteHh4LWxhcmdlJywnc21hbGxlcicsJ2xhcmdlcicsJ3NlcmlmJywnc2Fucy1zZXJpZicsJ2N1cnNpdmUnLCdmYW50YXN5JywnbW9ub3NwYWNlJywnLXdlYmtpdC1ib2R5JywnLXdlYmtpdC1waWN0b2dyYXBoJ119LCdkb21pbmFudC1iYXNlbGluZSc6e3ZhbHVlczpbJ21pZGRsZScsJ2F1dG8nLCdjZW50cmFsJywndGV4dC1iZWZvcmUtZWRnZScsJ3RleHQtYWZ0ZXItZWRnZScsJ2lkZW9ncmFwaGljJywnYWxwaGFiZXRpYycsJ2hhbmdpbmcnLCdtYXRoZW1hdGljYWwnLCd1c2Utc2NyaXB0Jywnbm8tY2hhbmdlJywncmVzZXQtc2l6ZSddfSwnZGlzcGxheSc6e3ZhbHVlczpbJ25vbmUnLCdpbmxpbmUnLCdibG9jaycsJ2Zsb3ctcm9vdCcsJ2xpc3QtaXRlbScsJ2lubGluZS1ibG9jaycsJ3RhYmxlJywnaW5saW5lLXRhYmxlJywndGFibGUtcm93LWdyb3VwJywndGFibGUtaGVhZGVyLWdyb3VwJywndGFibGUtZm9vdGVyLWdyb3VwJywndGFibGUtcm93JywndGFibGUtY29sdW1uLWdyb3VwJywndGFibGUtY29sdW1uJywndGFibGUtY2VsbCcsJ3RhYmxlLWNhcHRpb24nLCctd2Via2l0LWJveCcsJy13ZWJraXQtaW5saW5lLWJveCcsJ2ZsZXgnLCdpbmxpbmUtZmxleCcsJ2dyaWQnLCdpbmxpbmUtZ3JpZCcsJ2NvbnRlbnRzJ119LCctd2Via2l0LXRleHQtZW1waGFzaXMtcG9zaXRpb24nOnt2YWx1ZXM6WydvdmVyJywndW5kZXInXX0sJ2ltYWdlLXJlbmRlcmluZyc6e3ZhbHVlczpbJ2F1dG8nLCdwaXhlbGF0ZWQnLCctd2Via2l0LW9wdGltaXplLWNvbnRyYXN0J119LCdhbGlnbm1lbnQtYmFzZWxpbmUnOnt2YWx1ZXM6WydiYXNlbGluZScsJ21pZGRsZScsJ2F1dG8nLCdiZWZvcmUtZWRnZScsJ2FmdGVyLWVkZ2UnLCdjZW50cmFsJywndGV4dC1iZWZvcmUtZWRnZScsJ3RleHQtYWZ0ZXItZWRnZScsJ2lkZW9ncmFwaGljJywnYWxwaGFiZXRpYycsJ2hhbmdpbmcnLCdtYXRoZW1hdGljYWwnXX0sJ291dGxpbmUtd2lkdGgnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJ2JveC1hbGlnbic6e3ZhbHVlczpbJ2Jhc2VsaW5lJywnY2VudGVyJywnc3RyZXRjaCcsJ3N0YXJ0JywnZW5kJ119LCdib3JkZXItcmlnaHQtd2lkdGgnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJ2JvcmRlci10b3Atc3R5bGUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdyaWRnZScsJ291dHNldCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJ119LCdsaW5lLWhlaWdodCc6e3ZhbHVlczpbJ25vcm1hbCddfSwndGV4dC1vdmVyZmxvdyc6e3ZhbHVlczpbJ2NsaXAnLCdlbGxpcHNpcyddfSwnb3ZlcmZsb3ctd3JhcCc6e3ZhbHVlczpbJ25vcm1hbCcsJ2JyZWFrLXdvcmQnXX0sJ2JveC1kaXJlY3Rpb24nOnt2YWx1ZXM6Wydub3JtYWwnLCdyZXZlcnNlJ119LCdtYXJnaW4tYWZ0ZXItY29sbGFwc2UnOnt2YWx1ZXM6Wydjb2xsYXBzZScsJ3NlcGFyYXRlJywnZGlzY2FyZCddfSwncGFnZS1icmVhay1iZWZvcmUnOnt2YWx1ZXM6WydsZWZ0JywncmlnaHQnLCdhdXRvJywnYWx3YXlzJywnYXZvaWQnXX0sJ2JvcmRlci1pbWFnZSc6e3ZhbHVlczpbJ3JlcGVhdCcsJ3N0cmV0Y2gnLCdub25lJywnc3BhY2UnLCdyb3VuZCddfSwndGV4dC1kZWNvcmF0aW9uJzp7dmFsdWVzOlsnbm9uZScsJ2JsaW5rJywnbGluZS10aHJvdWdoJywnb3ZlcmxpbmUnLCd1bmRlcmxpbmUnLCd3YXZ5JywnZG91YmxlJywnc29saWQnLCdkYXNoZWQnLCdkb3R0ZWQnXX0sJ3Bvc2l0aW9uJzp7dmFsdWVzOlsnYWJzb2x1dGUnLCdmaXhlZCcsJ3JlbGF0aXZlJywnc3RhdGljJywnc3RpY2t5J119LCdmb250LWZhbWlseSc6e3ZhbHVlczpbJ3NlcmlmJywnc2Fucy1zZXJpZicsJ2N1cnNpdmUnLCdmYW50YXN5JywnbW9ub3NwYWNlJywnLXdlYmtpdC1ib2R5JywnLXdlYmtpdC1waWN0b2dyYXBoJ119LCd0ZXh0LW92ZXJmbG93LW1vZGUnOnt2YWx1ZXM6WydjbGlwJywnZWxsaXBzaXMnXX0sJ2JvcmRlci1ib3R0b20tc3R5bGUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdyaWRnZScsJ291dHNldCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJ119LCd1bmljb2RlLWJpZGknOnt2YWx1ZXM6Wydub3JtYWwnLCdiaWRpLW92ZXJyaWRlJywnZW1iZWQnLCdpc29sYXRlJywnaXNvbGF0ZS1vdmVycmlkZScsJ3BsYWludGV4dCddfSwnY2xpcC1ydWxlJzp7dmFsdWVzOlsnbm9uemVybycsJ2V2ZW5vZGQnXX0sJ21hcmdpbi1sZWZ0Jzp7dmFsdWVzOlsnYXV0byddfSwnbWFyZ2luLXRvcCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ3pvb20nOnt2YWx1ZXM6Wydub3JtYWwnXX0sJ21heC13aWR0aCc6e3ZhbHVlczpbJ25vbmUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnLXdlYmtpdC1maWxsLWF2YWlsYWJsZScsJ2ZpdC1jb250ZW50J119LCdjYXB0aW9uLXNpZGUnOnt2YWx1ZXM6Wyd0b3AnLCdib3R0b20nXX0sJ2VtcHR5LWNlbGxzJzp7dmFsdWVzOlsnaGlkZScsJ3Nob3cnXX0sJ3BvaW50ZXItZXZlbnRzJzp7dmFsdWVzOlsnbm9uZScsJ2FsbCcsJ2F1dG8nLCd2aXNpYmxlJywndmlzaWJsZXBhaW50ZWQnLCd2aXNpYmxlZmlsbCcsJ3Zpc2libGVzdHJva2UnLCdwYWludGVkJywnZmlsbCcsJ3N0cm9rZScsJ2JvdW5kaW5nLWJveCddfSwnbGV0dGVyLXNwYWNpbmcnOnt2YWx1ZXM6Wydub3JtYWwnXX0sJ2JhY2tncm91bmQtY2xpcCc6e3ZhbHVlczpbJ2JvcmRlci1ib3gnLCdjb250ZW50LWJveCcsJ3BhZGRpbmctYm94J119LCctd2Via2l0LWZvbnQtc21vb3RoaW5nJzp7dmFsdWVzOlsnbm9uZScsJ2F1dG8nLCdhbnRpYWxpYXNlZCcsJ3N1YnBpeGVsLWFudGlhbGlhc2VkJ119LCdib3JkZXInOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdyaWRnZScsJ291dHNldCcsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJywnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCdmb250LXNpemUnOnt2YWx1ZXM6Wyd4eC1zbWFsbCcsJ3gtc21hbGwnLCdzbWFsbCcsJ21lZGl1bScsJ2xhcmdlJywneC1sYXJnZScsJ3h4LWxhcmdlJywnLXdlYmtpdC14eHgtbGFyZ2UnLCdzbWFsbGVyJywnbGFyZ2VyJ119LCdmb250LXZhcmlhbnQnOnt2YWx1ZXM6WydzbWFsbC1jYXBzJywnbm9ybWFsJywnbm9uZScsJ2NvbW1vbi1saWdhdHVyZXMnLCduby1jb21tb24tbGlnYXR1cmVzJywnZGlzY3JldGlvbmFyeS1saWdhdHVyZXMnLCduby1kaXNjcmV0aW9uYXJ5LWxpZ2F0dXJlcycsJ2hpc3RvcmljYWwtbGlnYXR1cmVzJywnbm8taGlzdG9yaWNhbC1saWdhdHVyZXMnLCdjb250ZXh0dWFsJywnbm8tY29udGV4dHVhbCcsJ2FsbC1zbWFsbC1jYXBzJywncGV0aXRlLWNhcHMnLCdhbGwtcGV0aXRlLWNhcHMnLCd1bmljYXNlJywndGl0bGluZy1jYXBzJywnbGluaW5nLW51bXMnLCdvbGRzdHlsZS1udW1zJywncHJvcG9ydGlvbmFsLW51bXMnLCd0YWJ1bGFyLW51bXMnLCdkaWFnb25hbC1mcmFjdGlvbnMnLCdzdGFja2VkLWZyYWN0aW9ucycsJ29yZGluYWwnLCdzbGFzaGVkLXplcm8nLCdqaXM3OCcsJ2ppczgzJywnamlzOTAnLCdqaXMwNCcsJ3NpbXBsaWZpZWQnLCd0cmFkaXRpb25hbCcsJ2Z1bGwtd2lkdGgnLCdwcm9wb3J0aW9uYWwtd2lkdGgnLCdydWJ5J119LCd2ZXJ0aWNhbC1hbGlnbic6e3ZhbHVlczpbJ2Jhc2VsaW5lJywnbWlkZGxlJywnc3ViJywnc3VwZXInLCd0ZXh0LXRvcCcsJ3RleHQtYm90dG9tJywndG9wJywnYm90dG9tJywnLXdlYmtpdC1iYXNlbGluZS1taWRkbGUnXX0sJ3doaXRlLXNwYWNlJzp7dmFsdWVzOlsnbm9ybWFsJywnbm93cmFwJywncHJlJywncHJlLWxpbmUnLCdwcmUtd3JhcCddfSwncGFnZS1icmVhay1hZnRlcic6e3ZhbHVlczpbJ2xlZnQnLCdyaWdodCcsJ2F1dG8nLCdhbHdheXMnLCdhdm9pZCddfSwnY2xpcC1wYXRoJzp7dmFsdWVzOlsnbm9uZSddfSwnbWFyZ2luJzp7dmFsdWVzOlsnYXV0byddfSwnbWFyZ2luLXJpZ2h0Jzp7dmFsdWVzOlsnYXV0byddfSwnd29yZC1icmVhayc6e3ZhbHVlczpbJ25vcm1hbCcsJ2JyZWFrLWFsbCcsJ2JyZWFrLXdvcmQnLCdrZWVwLWFsbCddfSwnd29yZC1zcGFjaW5nJzp7dmFsdWVzOlsnbm9ybWFsJ119LCctd2Via2l0LXRleHQtZW1waGFzaXMtc3R5bGUnOnt2YWx1ZXM6WydjaXJjbGUnLCdmaWxsZWQnLCdvcGVuJywnZG90JywnZG91YmxlLWNpcmNsZScsJ3RyaWFuZ2xlJywnc2VzYW1lJywnbm9uZSddfSwndHJhbnNmb3JtJzp7dmFsdWVzOlsnc2NhbGUnLCdzY2FsZVgnLCdzY2FsZVknLCdzY2FsZTNkJywncm90YXRlJywncm90YXRlWCcsJ3JvdGF0ZVknLCdyb3RhdGVaJywncm90YXRlM2QnLCdza2V3Jywnc2tld1gnLCdza2V3WScsJ3RyYW5zbGF0ZScsJ3RyYW5zbGF0ZVgnLCd0cmFuc2xhdGVZJywndHJhbnNsYXRlWicsJ3RyYW5zbGF0ZTNkJywnbWF0cml4JywnbWF0cml4M2QnLCdwZXJzcGVjdGl2ZScsJ25vbmUnXX0sJ2ltYWdlLXJlc29sdXRpb24nOnt2YWx1ZXM6Wydmcm9tLWltYWdlJywnc25hcCddfSwnYm94LXNpemluZyc6e3ZhbHVlczpbJ2NvbnRlbnQtYm94JywnYm9yZGVyLWJveCddfSwnY2xpcCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ3Jlc2l6ZSc6e3ZhbHVlczpbJ25vbmUnLCdib3RoJywnaG9yaXpvbnRhbCcsJ3ZlcnRpY2FsJywnYXV0byddfSwnYWxpZ24tY29udGVudCc6e3ZhbHVlczpbJ25vcm1hbCcsJ2Jhc2VsaW5lJywnc3BhY2UtYmV0d2VlbicsJ3NwYWNlLWFyb3VuZCcsJ3NwYWNlLWV2ZW5seScsJ3N0cmV0Y2gnLCd1bnNhZmUnLCdzYWZlJywnY2VudGVyJywnc3RhcnQnLCdlbmQnLCdmbGV4LXN0YXJ0JywnZmxleC1lbmQnLCdsZWZ0JywncmlnaHQnXX0sJ2p1c3RpZnktY29udGVudCc6e3ZhbHVlczpbJ25vcm1hbCcsJ3NwYWNlLWJldHdlZW4nLCdzcGFjZS1hcm91bmQnLCdzcGFjZS1ldmVubHknLCdzdHJldGNoJywndW5zYWZlJywnc2FmZScsJ2NlbnRlcicsJ3N0YXJ0JywnZW5kJywnZmxleC1zdGFydCcsJ2ZsZXgtZW5kJywnbGVmdCcsJ3JpZ2h0JywnYmFzZWxpbmUnXX0sJ3BsYWNlLWNvbnRlbnQnOnt2YWx1ZXM6Wydub3JtYWwnLCdzcGFjZS1iZXR3ZWVuJywnc3BhY2UtYXJvdW5kJywnc3BhY2UtZXZlbmx5Jywnc3RyZXRjaCcsJ3Vuc2FmZScsJ3NhZmUnLCdjZW50ZXInLCdzdGFydCcsJ2VuZCcsJ2ZsZXgtc3RhcnQnLCdmbGV4LWVuZCcsJ2xlZnQnLCdyaWdodCcsJ2Jhc2VsaW5lJ119LCdhbGlnbi1pdGVtcyc6e3ZhbHVlczpbJ25vcm1hbCcsJ3N0cmV0Y2gnLCdiYXNlbGluZScsJ3Vuc2FmZScsJ3NhZmUnLCdjZW50ZXInLCdzdGFydCcsJ2VuZCcsJ3NlbGYtc3RhcnQnLCdzZWxmLWVuZCcsJ2ZsZXgtc3RhcnQnLCdmbGV4LWVuZCcsJ2xlZnQnLCdyaWdodCddfSwnanVzdGlmeS1pdGVtcyc6e3ZhbHVlczpbJ25vcm1hbCcsJ3N0cmV0Y2gnLCdiYXNlbGluZScsJ3Vuc2FmZScsJ3NhZmUnLCdjZW50ZXInLCdzdGFydCcsJ2VuZCcsJ3NlbGYtc3RhcnQnLCdzZWxmLWVuZCcsJ2ZsZXgtc3RhcnQnLCdmbGV4LWVuZCcsJ2xlZnQnLCdyaWdodCcsJ2xlZ2FjeScsJ2F1dG8nXX0sJ3BsYWNlLWl0ZW1zJzp7dmFsdWVzOlsnYXV0bycsJ25vcm1hbCcsJ3N0cmV0Y2gnLCdiYXNlbGluZScsJ3Vuc2FmZScsJ3NhZmUnLCdjZW50ZXInLCdzdGFydCcsJ2VuZCcsJ3NlbGYtc3RhcnQnLCdzZWxmLWVuZCcsJ2ZsZXgtc3RhcnQnLCdmbGV4LWVuZCcsJ2xlZnQnLCdyaWdodCddfSwnYWxpZ24tc2VsZic6e3ZhbHVlczpbJ2F1dG8nLCdub3JtYWwnLCdzdHJldGNoJywnYmFzZWxpbmUnLCd1bnNhZmUnLCdzYWZlJywnY2VudGVyJywnc3RhcnQnLCdlbmQnLCdzZWxmLXN0YXJ0Jywnc2VsZi1lbmQnLCdmbGV4LXN0YXJ0JywnZmxleC1lbmQnLCdsZWZ0JywncmlnaHQnXX0sJ2p1c3RpZnktc2VsZic6e3ZhbHVlczpbJ2F1dG8nLCdub3JtYWwnLCdzdHJldGNoJywnYmFzZWxpbmUnLCd1bnNhZmUnLCdzYWZlJywnY2VudGVyJywnc3RhcnQnLCdlbmQnLCdzZWxmLXN0YXJ0Jywnc2VsZi1lbmQnLCdmbGV4LXN0YXJ0JywnZmxleC1lbmQnLCdsZWZ0JywncmlnaHQnXX0sJ3BsYWNlLXNlbGYnOnt2YWx1ZXM6WydhdXRvJywnbm9ybWFsJywnc3RyZXRjaCcsJ2Jhc2VsaW5lJywndW5zYWZlJywnc2FmZScsJ2NlbnRlcicsJ3N0YXJ0JywnZW5kJywnc2VsZi1zdGFydCcsJ3NlbGYtZW5kJywnZmxleC1zdGFydCcsJ2ZsZXgtZW5kJywnbGVmdCcsJ3JpZ2h0J119LCdmbGV4LWRpcmVjdGlvbic6e3ZhbHVlczpbJ3JvdycsJ3Jvdy1yZXZlcnNlJywnY29sdW1uJywnY29sdW1uLXJldmVyc2UnXX0sJ2ZsZXgtd3JhcCc6e3ZhbHVlczpbJ25vd3JhcCcsJ3dyYXAnLCd3cmFwLXJldmVyc2UnXX0sJ3BlcnNwZWN0aXZlJzp7dmFsdWVzOlsnbm9uZSddfSwncGVyc3BlY3RpdmUtb3JpZ2luJzp7dmFsdWVzOlsnbGVmdCcsJ2NlbnRlcicsJ3JpZ2h0JywndG9wJywnYm90dG9tJ119LCd0cmFuc2Zvcm0tb3JpZ2luJzp7dmFsdWVzOlsnbGVmdCcsJ2NlbnRlcicsJ3JpZ2h0JywndG9wJywnYm90dG9tJ119LCd0cmFuc2Zvcm0tc3R5bGUnOnt2YWx1ZXM6WydmbGF0JywncHJlc2VydmUtM2QnXX0sJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzp7dmFsdWVzOlsnZWFzZScsJ2xpbmVhcicsJ2Vhc2UtaW4nLCdlYXNlLW91dCcsJ2Vhc2UtaW4tb3V0Jywnc3RlcC1zdGFydCcsJ3N0ZXAtZW5kJywnc3RlcHMnLCdmcmFtZXMnLCdjdWJpYy1iZXppZXInLCdzdGVwLW1pZGRsZSddfSwnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbic6e3ZhbHVlczpbJ2Vhc2UnLCdsaW5lYXInLCdlYXNlLWluJywnZWFzZS1vdXQnLCdlYXNlLWluLW91dCcsJ3N0ZXAtc3RhcnQnLCdzdGVwLWVuZCcsJ3N0ZXBzJywnZnJhbWVzJywnY3ViaWMtYmV6aWVyJywnc3RlcC1taWRkbGUnXX0sJ2FuaW1hdGlvbi1kaXJlY3Rpb24nOnt2YWx1ZXM6Wydub3JtYWwnLCdyZXZlcnNlJywnYWx0ZXJuYXRlJywnYWx0ZXJuYXRlLXJldmVyc2UnXX0sJ2FuaW1hdGlvbi1wbGF5LXN0YXRlJzp7dmFsdWVzOlsncnVubmluZycsJ3BhdXNlZCddfSwnYW5pbWF0aW9uLWZpbGwtbW9kZSc6e3ZhbHVlczpbJ25vbmUnLCdmb3J3YXJkcycsJ2JhY2t3YXJkcycsJ2JvdGgnXX0sJy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eSc6e3ZhbHVlczpbJ3Zpc2libGUnLCdoaWRkZW4nXX0sJy13ZWJraXQtYm94LWRlY29yYXRpb24tYnJlYWsnOnt2YWx1ZXM6WydzbGljZScsJ2Nsb25lJ119LCctd2Via2l0LWNvbHVtbi1icmVhay1hZnRlcic6e3ZhbHVlczpbJ2F1dG8nLCdhbHdheXMnLCdhdm9pZCcsJ2xlZnQnLCdyaWdodCcsJ3BhZ2UnLCdjb2x1bW4nLCdhdm9pZC1wYWdlJywnYXZvaWQtY29sdW1uJ119LCctd2Via2l0LWNvbHVtbi1icmVhay1iZWZvcmUnOnt2YWx1ZXM6WydhdXRvJywnYWx3YXlzJywnYXZvaWQnLCdsZWZ0JywncmlnaHQnLCdwYWdlJywnY29sdW1uJywnYXZvaWQtcGFnZScsJ2F2b2lkLWNvbHVtbiddfSwnLXdlYmtpdC1jb2x1bW4tYnJlYWstaW5zaWRlJzp7dmFsdWVzOlsnYXV0bycsJ2F2b2lkJywnYXZvaWQtcGFnZScsJ2F2b2lkLWNvbHVtbiddfSwnLXdlYmtpdC1jb2x1bW4tc3Bhbic6e3ZhbHVlczpbJ25vbmUnLCdhbGwnXX0sJy13ZWJraXQtY29sdW1uLWNvdW50Jzp7dmFsdWVzOlsnYXV0byddfSwnLXdlYmtpdC1jb2x1bW4tZ2FwJzp7dmFsdWVzOlsnbm9ybWFsJ119LCdmaWx0ZXInOnt2YWx1ZXM6Wyd1cmwnLCdibHVyJywnYnJpZ2h0bmVzcycsJ2NvbnRyYXN0JywnZHJvcC1zaGFkb3cnLCdncmF5c2NhbGUnLCdodWUtcm90YXRlJywnaW52ZXJ0Jywnb3BhY2l0eScsJ3NhdHVyYXRlJywnc2VwaWEnLCdub25lJ119LCdsaW5lLWJyZWFrJzp7dmFsdWVzOlsnYXV0bycsJ2xvb3NlJywnbm9ybWFsJywnc3RyaWN0JywnYWZ0ZXItd2hpdGUtc3BhY2UnXX0sJ3VzZXItc2VsZWN0Jzp7dmFsdWVzOlsnbm9uZScsJ3RleHQnLCdhbGwnLCdhdXRvJ119LCctd2Via2l0LXVzZXItbW9kaWZ5Jzp7dmFsdWVzOlsncmVhZC1vbmx5JywncmVhZC13cml0ZScsJ3JlYWQtd3JpdGUtcGxhaW50ZXh0LW9ubHknXX0sJ3RleHQtYWxpZ24tbGFzdCc6e3ZhbHVlczpbJ2F1dG8nLCdzdGFydCcsJ2VuZCcsJ2xlZnQnLCdyaWdodCcsJ2NlbnRlcicsJ2p1c3RpZnknXX0sJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLWxpbmUnOnt2YWx1ZXM6Wydub25lJywndW5kZXJsaW5lJywnb3ZlcmxpbmUnLCdsaW5lLXRocm91Z2gnLCdibGluayddfSwnLXdlYmtpdC10ZXh0LWRlY29yYXRpb24tc3R5bGUnOnt2YWx1ZXM6Wydzb2xpZCcsJ2RvdWJsZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3dhdnknXX0sJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXAnOnt2YWx1ZXM6Wydub25lJywnb2JqZWN0cycsJ3NwYWNlcycsJ2luaycsJ2VkZ2VzJywnYm94LWRlY29yYXRpb24nXX0sJ21peC1ibGVuZC1tb2RlJzp7dmFsdWVzOlsnbm9ybWFsJywnbXVsdGlwbHknLCdzY3JlZW4nLCdvdmVybGF5JywnZGFya2VuJywnbGlnaHRlbicsJ2NvbG9yLWRvZGdlJywnY29sb3ItYnVybicsJ2hhcmQtbGlnaHQnLCdzb2Z0LWxpZ2h0JywnZGlmZmVyZW5jZScsJ2V4Y2x1c2lvbicsJ2h1ZScsJ3NhdHVyYXRpb24nLCdjb2xvcicsJ2x1bWlub3NpdHknLCd1bnNldCddfSwnYmFja2dyb3VuZC1ibGVuZC1tb2RlJzp7dmFsdWVzOlsnbm9ybWFsJywnbXVsdGlwbHknLCdzY3JlZW4nLCdvdmVybGF5JywnZGFya2VuJywnbGlnaHRlbicsJ2NvbG9yLWRvZGdlJywnY29sb3ItYnVybicsJ2hhcmQtbGlnaHQnLCdzb2Z0LWxpZ2h0JywnZGlmZmVyZW5jZScsJ2V4Y2x1c2lvbicsJ2h1ZScsJ3NhdHVyYXRpb24nLCdjb2xvcicsJ2x1bWlub3NpdHknLCd1bnNldCddfSwnY2FyZXQtY29sb3InOnt2YWx1ZXM6WydhdXRvJ119LCdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOnt2YWx1ZXM6Wydub25lJywnYXV0bycsJ21pbi1jb250ZW50JywnbWF4LWNvbnRlbnQnXX0sJ2dyaWQtdGVtcGxhdGUtcm93cyc6e3ZhbHVlczpbJ25vbmUnLCdhdXRvJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCddfSwnZ3JpZC10ZW1wbGF0ZS1hcmVhcyc6e3ZhbHVlczpbJ25vbmUnXX0sJ2dyaWQtdGVtcGxhdGUnOnt2YWx1ZXM6Wydub25lJ119LCdncmlkLWF1dG8tY29sdW1ucyc6e3ZhbHVlczpbJ2F1dG8nLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50J119LCdncmlkLWF1dG8tcm93cyc6e3ZhbHVlczpbJ2F1dG8nLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50J119LCdncmlkLWF1dG8tZmxvdyc6e3ZhbHVlczpbJ3JvdycsJ2NvbHVtbicsJ2RlbnNlJ119LCdncmlkJzp7dmFsdWVzOlsnbm9uZSddfSwnZ3JpZC1yb3ctc3RhcnQnOnt2YWx1ZXM6WydhdXRvJ119LCdncmlkLWNvbHVtbi1zdGFydCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2dyaWQtcm93LWVuZCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2dyaWQtY29sdW1uLWVuZCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2dyaWQtcm93Jzp7dmFsdWVzOlsnYXV0byddfSwnZ3JpZC1jb2x1bW4nOnt2YWx1ZXM6WydhdXRvJ119LCdncmlkLWFyZWEnOnt2YWx1ZXM6WydhdXRvJ119LCdhbmltYXRpb24taXRlcmF0aW9uLWNvdW50Jzp7dmFsdWVzOlsnaW5maW5pdGUnXX0sJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncyc6e3ZhbHVlczpbJ25vcm1hbCddfSwnZm9udC1rZXJuaW5nJzp7dmFsdWVzOlsnbm9uZScsJ25vcm1hbCcsJ2F1dG8nXX0sJ2ZvbnQtc2l6ZS1hZGp1c3QnOnt2YWx1ZXM6Wydub25lJ119LCdmb250LXZhcmlhbnQtY2Fwcyc6e3ZhbHVlczpbJ3NtYWxsLWNhcHMnLCdhbGwtc21hbGwtY2FwcycsJ3BldGl0ZS1jYXBzJywnYWxsLXBldGl0ZS1jYXBzJywndW5pY2FzZScsJ3RpdGxpbmctY2FwcycsJ25vcm1hbCddfSwnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nOnt2YWx1ZXM6WydqaXM3OCcsJ2ppczgzJywnamlzOTAnLCdqaXMwNCcsJ3NpbXBsaWZpZWQnLCd0cmFkaXRpb25hbCcsJ2Z1bGwtd2lkdGgnLCdwcm9wb3J0aW9uYWwtd2lkdGgnLCdydWJ5J119LCdmb250LXZhcmlhbnQtbGlnYXR1cmVzJzp7dmFsdWVzOlsnbm9uZScsJ2NvbW1vbi1saWdhdHVyZXMnLCduby1jb21tb24tbGlnYXR1cmVzJywnZGlzY3JldGlvbmFyeS1saWdhdHVyZXMnLCduby1kaXNjcmV0aW9uYXJ5LWxpZ2F0dXJlcycsJ2hpc3RvcmljYWwtbGlnYXR1cmVzJywnbm8taGlzdG9yaWNhbC1saWdhdHVyZXMnLCdjb250ZXh0dWFsJywnbm8tY29udGV4dHVhbCcsJ25vcm1hbCddfSwnZm9udC12YXJpYW50LW51bWVyaWMnOnt2YWx1ZXM6WydsaW5pbmctbnVtcycsJ29sZHN0eWxlLW51bXMnLCdwcm9wb3J0aW9uYWwtbnVtcycsJ3RhYnVsYXItbnVtcycsJ2RpYWdvbmFsLWZyYWN0aW9ucycsJ3N0YWNrZWQtZnJhY3Rpb25zJywnb3JkaW5hbCcsJ3NsYXNoZWQtemVybycsJ25vcm1hbCddfSwnZm9udC12YXJpYXRpb24tc2V0dGluZ3MnOnt2YWx1ZXM6Wydub3JtYWwnXX0sJy13ZWJraXQtbG9jYWxlJzp7dmFsdWVzOlsnYXV0byddfSwnYmFja2Ryb3AtZmlsdGVyJzp7dmFsdWVzOlsnbm9uZSddfSwnYmFja2ZhY2UtdmlzaWJpbGl0eSc6e3ZhbHVlczpbJ2hpZGRlbicsJ3Zpc2libGUnXX0sJ2JhY2tncm91bmQnOnt2YWx1ZXM6Wydub25lJywncmVwZWF0JywncmVwZWF0LXgnLCdyZXBlYXQteScsJ25vLXJlcGVhdCcsJ3RvcCcsJ2JvdHRvbScsJ2xlZnQnLCdyaWdodCcsJ2NlbnRlcicsJ2ZpeGVkJywnbG9jYWwnLCdzY3JvbGwnLCdzcGFjZScsJ3JvdW5kJywnYm9yZGVyLWJveCcsJ2NvbnRlbnQtYm94JywncGFkZGluZy1ib3gnXX0sJ2JhY2tncm91bmQtYXR0YWNobWVudCc6e3ZhbHVlczpbJ2ZpeGVkJywnbG9jYWwnLCdzY3JvbGwnXX0sJ2JhY2tncm91bmQtaW1hZ2UnOnt2YWx1ZXM6Wydub25lJ119LCdiYWNrZ3JvdW5kLXBvc2l0aW9uJzp7dmFsdWVzOlsndG9wJywnYm90dG9tJywnbGVmdCcsJ3JpZ2h0JywnY2VudGVyJ119LCdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnOnt2YWx1ZXM6WydsZWZ0JywncmlnaHQnLCdjZW50ZXInXX0sJ2JhY2tncm91bmQtcG9zaXRpb24teSc6e3ZhbHVlczpbJ3RvcCcsJ2JvdHRvbScsJ2NlbnRlciddfSwnYmFja2dyb3VuZC1yZXBlYXQteCc6e3ZhbHVlczpbJ3JlcGVhdCcsJ25vLXJlcGVhdCddfSwnYmFja2dyb3VuZC1yZXBlYXQteSc6e3ZhbHVlczpbJ3JlcGVhdCcsJ25vLXJlcGVhdCddfSwnYm9yZGVyLWJvdHRvbSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnLCdtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJ2JvcmRlci1pbWFnZS1yZXBlYXQnOnt2YWx1ZXM6WydyZXBlYXQnLCdzdHJldGNoJywnc3BhY2UnLCdyb3VuZCddfSwnYm9yZGVyLWltYWdlLXNvdXJjZSc6e3ZhbHVlczpbJ25vbmUnXX0sJ2JvcmRlci1pbWFnZS13aWR0aCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2JvcmRlci1sZWZ0Jzp7dmFsdWVzOlsnbm9uZScsJ2hpZGRlbicsJ2luc2V0JywnZ3Jvb3ZlJywnb3V0c2V0JywncmlkZ2UnLCdkb3R0ZWQnLCdkYXNoZWQnLCdzb2xpZCcsJ2RvdWJsZScsJ21lZGl1bScsJ3RoaWNrJywndGhpbiddfSwnYm9yZGVyLXJpZ2h0Jzp7dmFsdWVzOlsnbm9uZScsJ2hpZGRlbicsJ2luc2V0JywnZ3Jvb3ZlJywnb3V0c2V0JywncmlkZ2UnLCdkb3R0ZWQnLCdkYXNoZWQnLCdzb2xpZCcsJ2RvdWJsZScsJ21lZGl1bScsJ3RoaWNrJywndGhpbiddfSwnYm9yZGVyLXRvcCc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnLCdtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJ2JvdHRvbSc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2JyZWFrLWFmdGVyJzp7dmFsdWVzOlsnbGVmdCcsJ3JpZ2h0JywnYXV0bycsJ2F2b2lkJywnY29sdW1uJywnYXZvaWQtcGFnZScsJ3BhZ2UnLCdyZWN0bycsJ3ZlcnNvJywnYXZvaWQtY29sdW1uJ119LCdicmVhay1iZWZvcmUnOnt2YWx1ZXM6WydsZWZ0JywncmlnaHQnLCdhdXRvJywnYXZvaWQnLCdjb2x1bW4nLCdhdm9pZC1wYWdlJywncGFnZScsJ3JlY3RvJywndmVyc28nLCdhdm9pZC1jb2x1bW4nXX0sJ2JyZWFrLWluc2lkZSc6e3ZhbHVlczpbJ2F1dG8nLCdhdm9pZCcsJ2F2b2lkLXBhZ2UnLCdhdm9pZC1jb2x1bW4nXX0sJ2J1ZmZlcmVkLXJlbmRlcmluZyc6e3ZhbHVlczpbJ2F1dG8nLCdzdGF0aWMnLCdkeW5hbWljJ119LCdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOnt2YWx1ZXM6WydhdXRvJywnc3JnYicsJ2xpbmVhcnJnYiddfSwnY29sdW1uLWNvdW50Jzp7dmFsdWVzOlsnYXV0byddfSwnY29sdW1uLWZpbGwnOnt2YWx1ZXM6WydhdXRvJywnYmFsYW5jZSddfSwnY29sdW1uLWdhcCc6e3ZhbHVlczpbJ25vcm1hbCddfSwnY29sdW1uLXJ1bGUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdvdXRzZXQnLCdyaWRnZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJywnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCdjb2x1bW4tcnVsZS1zdHlsZSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnXX0sJ2NvbHVtbi1ydWxlLXdpZHRoJzp7dmFsdWVzOlsnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCdjb2x1bW4tc3Bhbic6e3ZhbHVlczpbJ25vbmUnLCdhbGwnXX0sJ2NvbHVtbi13aWR0aCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2NvbHVtbnMnOnt2YWx1ZXM6WydhdXRvJ119LCdkJzp7dmFsdWVzOlsnbm9uZSddfSwnZmlsbCc6e3ZhbHVlczpbJ25vbmUnXX0sJ2ZpbGwtcnVsZSc6e3ZhbHVlczpbJ25vbnplcm8nLCdldmVub2RkJ119LCdmbGV4Jzp7dmFsdWVzOlsnbm9uZScsJ2F1dG8nXX0sJ2ZsZXgtYmFzaXMnOnt2YWx1ZXM6WydhdXRvJ119LCdmbGV4LWZsb3cnOnt2YWx1ZXM6Wydub3dyYXAnLCdyb3cnLCdyb3ctcmV2ZXJzZScsJ2NvbHVtbicsJ2NvbHVtbi1yZXZlcnNlJywnd3JhcCcsJ3dyYXAtcmV2ZXJzZSddfSwnaGVpZ2h0Jzp7dmFsdWVzOlsnYXV0bycsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJ2h5cGhlbnMnOnt2YWx1ZXM6Wydub25lJywnbWFudWFsJ119LCdpbmxpbmUtc2l6ZSc6e3ZhbHVlczpbJ2F1dG8nLCctd2Via2l0LWZpbGwtYXZhaWxhYmxlJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJ2ZpdC1jb250ZW50J119LCdpc29sYXRpb24nOnt2YWx1ZXM6WydhdXRvJywnaXNvbGF0ZSddfSwnbGVmdCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ2xpc3Qtc3R5bGUnOnt2YWx1ZXM6Wydub25lJywnb3V0c2lkZScsJ2luc2lkZScsJ2Rpc2MnLCdjaXJjbGUnLCdzcXVhcmUnLCdkZWNpbWFsJywnZGVjaW1hbC1sZWFkaW5nLXplcm8nLCdhcmFiaWMtaW5kaWMnLCdiZW5nYWxpJywnY2FtYm9kaWFuJywna2htZXInLCdkZXZhbmFnYXJpJywnZ3VqYXJhdGknLCdndXJtdWtoaScsJ2thbm5hZGEnLCdsYW8nLCdtYWxheWFsYW0nLCdtb25nb2xpYW4nLCdteWFubWFyJywnb3JpeWEnLCdwZXJzaWFuJywndXJkdScsJ3RlbHVndScsJ3RpYmV0YW4nLCd0aGFpJywnbG93ZXItcm9tYW4nLCd1cHBlci1yb21hbicsJ2xvd2VyLWdyZWVrJywnbG93ZXItYWxwaGEnLCdsb3dlci1sYXRpbicsJ3VwcGVyLWFscGhhJywndXBwZXItbGF0aW4nLCdjamstZWFydGhseS1icmFuY2gnLCdjamstaGVhdmVubHktc3RlbScsJ2V0aGlvcGljLWhhbGVoYW1lJywnZXRoaW9waWMtaGFsZWhhbWUtYW0nLCdldGhpb3BpYy1oYWxlaGFtZS10aS1lcicsJ2V0aGlvcGljLWhhbGVoYW1lLXRpLWV0JywnaGFuZ3VsJywnaGFuZ3VsLWNvbnNvbmFudCcsJ2tvcmVhbi1oYW5ndWwtZm9ybWFsJywna29yZWFuLWhhbmphLWZvcm1hbCcsJ2tvcmVhbi1oYW5qYS1pbmZvcm1hbCcsJ2hlYnJldycsJ2FybWVuaWFuJywnbG93ZXItYXJtZW5pYW4nLCd1cHBlci1hcm1lbmlhbicsJ2dlb3JnaWFuJywnY2prLWlkZW9ncmFwaGljJywnc2ltcC1jaGluZXNlLWZvcm1hbCcsJ3NpbXAtY2hpbmVzZS1pbmZvcm1hbCcsJ3RyYWQtY2hpbmVzZS1mb3JtYWwnLCd0cmFkLWNoaW5lc2UtaW5mb3JtYWwnLCdoaXJhZ2FuYScsJ2thdGFrYW5hJywnaGlyYWdhbmEtaXJvaGEnLCdrYXRha2FuYS1pcm9oYSddfSwnbWFya2VyJzp7dmFsdWVzOlsnbm9uZSddfSwnbWFya2VyLWVuZCc6e3ZhbHVlczpbJ25vbmUnXX0sJ21hcmtlci1taWQnOnt2YWx1ZXM6Wydub25lJ119LCdtYXJrZXItc3RhcnQnOnt2YWx1ZXM6Wydub25lJ119LCdtYXNrJzp7dmFsdWVzOlsnbm9uZSddfSwnbWFzay1zb3VyY2UtdHlwZSc6e3ZhbHVlczpbJ2F1dG8nLCdhbHBoYScsJ2x1bWluYW5jZSddfSwnbWFzay10eXBlJzp7dmFsdWVzOlsnYWxwaGEnLCdsdW1pbmFuY2UnXX0sJ21heC1ibG9jay1zaXplJzp7dmFsdWVzOlsnbm9uZScsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJ21heC1pbmxpbmUtc2l6ZSc6e3ZhbHVlczpbJ25vbmUnLCctd2Via2l0LWZpbGwtYXZhaWxhYmxlJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJ2ZpdC1jb250ZW50J119LCdtaW4tYmxvY2stc2l6ZSc6e3ZhbHVlczpbJ2F1dG8nLCctd2Via2l0LWZpbGwtYXZhaWxhYmxlJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJ2ZpdC1jb250ZW50J119LCdtaW4taGVpZ2h0Jzp7dmFsdWVzOlsnYXV0bycsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJ21pbi1pbmxpbmUtc2l6ZSc6e3ZhbHVlczpbJ2F1dG8nLCctd2Via2l0LWZpbGwtYXZhaWxhYmxlJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJ2ZpdC1jb250ZW50J119LCdtaW4td2lkdGgnOnt2YWx1ZXM6WydhdXRvJywnLXdlYmtpdC1maWxsLWF2YWlsYWJsZScsJ21pbi1jb250ZW50JywnbWF4LWNvbnRlbnQnLCdmaXQtY29udGVudCddfSwnb2JqZWN0LWZpdCc6e3ZhbHVlczpbJ25vbmUnLCdjb250YWluJywnY292ZXInLCdmaWxsJywnc2NhbGUtZG93biddfSwnb2JqZWN0LXBvc2l0aW9uJzp7dmFsdWVzOlsndG9wJywnYm90dG9tJywnbGVmdCcsJ3JpZ2h0JywnY2VudGVyJ119LCdvZmZzZXQtYW5jaG9yJzp7dmFsdWVzOlsndG9wJywnYm90dG9tJywnbGVmdCcsJ3JpZ2h0JywnY2VudGVyJywnYXV0byddfSwnb2Zmc2V0LXBhdGgnOnt2YWx1ZXM6Wydub25lJ119LCdvZmZzZXQtcG9zaXRpb24nOnt2YWx1ZXM6Wyd0b3AnLCdib3R0b20nLCdsZWZ0JywncmlnaHQnLCdjZW50ZXInLCdhdXRvJ119LCdvZmZzZXQtcm90YXRlJzp7dmFsdWVzOlsnYXV0bycsJ3JldmVyc2UnXX0sJ292ZXJmbG93LWFuY2hvcic6e3ZhbHVlczpbJ25vbmUnLCdhdXRvJywndmlzaWJsZSddfSwncGFpbnQtb3JkZXInOnt2YWx1ZXM6Wydub3JtYWwnLCdmaWxsJywnc3Ryb2tlJywnbWFya2VycyddfSwncXVvdGVzJzp7dmFsdWVzOlsnbm9uZSddfSwncmlnaHQnOnt2YWx1ZXM6WydhdXRvJ119LCdyb3RhdGUnOnt2YWx1ZXM6Wydub25lJ119LCdyeCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ3J5Jzp7dmFsdWVzOlsnYXV0byddfSwnc2NhbGUnOnt2YWx1ZXM6Wydub25lJ119LCdzY3JvbGwtYmVoYXZpb3InOnt2YWx1ZXM6WydhdXRvJywnc21vb3RoJ119LCdzY3JvbGwtY3VzdG9taXphdGlvbic6e3ZhbHVlczpbJ25vbmUnLCdhdXRvJywncGFuLXgnLCdwYW4teScsJ3Bhbi1sZWZ0JywncGFuLXJpZ2h0JywncGFuLXVwJywncGFuLWRvd24nLF19LCdzaGFwZS1vdXRzaWRlJzp7dmFsdWVzOlsnbm9uZScsJ2JvcmRlci1ib3gnLCdjb250ZW50LWJveCcsJ3BhZGRpbmctYm94JywnbWFyZ2luLWJveCddfSwnc2hhcGUtcmVuZGVyaW5nJzp7dmFsdWVzOlsnYXV0bycsJ29wdGltaXplc3BlZWQnLCdnZW9tZXRyaWNwcmVjaXNpb24nLCdjcmlzcGVkZ2VzJ119LCdzdHJva2UnOnt2YWx1ZXM6Wydub25lJ119LCdzdHJva2UtZGFzaGFycmF5Jzp7dmFsdWVzOlsnbm9uZSddfSwnc3Ryb2tlLWxpbmVjYXAnOnt2YWx1ZXM6WydzcXVhcmUnLCdyb3VuZCcsJ2J1dHQnXX0sJ3RleHQtYW5jaG9yJzp7dmFsdWVzOlsnbWlkZGxlJywnc3RhcnQnLCdlbmQnXX0sJ3RleHQtZGVjb3JhdGlvbi1saW5lJzp7dmFsdWVzOlsnbm9uZScsJ2JsaW5rJywnbGluZS10aHJvdWdoJywnb3ZlcmxpbmUnLCd1bmRlcmxpbmUnXX0sJ3RleHQtZGVjb3JhdGlvbi1za2lwJzp7dmFsdWVzOlsnb2JqZWN0cycsJ2luayddfSwndGV4dC1kZWNvcmF0aW9uLXN0eWxlJzp7dmFsdWVzOlsnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnLCd3YXZ5J119LCd0ZXh0LWp1c3RpZnknOnt2YWx1ZXM6Wydub25lJywnaW50ZXItd29yZCcsJ2Rpc3RyaWJ1dGUnLCdhdXRvJ119LCd0ZXh0LXNoYWRvdyc6e3ZhbHVlczpbJ25vbmUnXX0sJ3RleHQtc2l6ZS1hZGp1c3QnOnt2YWx1ZXM6Wydub25lJywnYXV0byddfSwndGV4dC11bmRlcmxpbmUtcG9zaXRpb24nOnt2YWx1ZXM6WydhdXRvJywndW5kZXInXX0sJ3RvcCc6e3ZhbHVlczpbJ2F1dG8nXX0sJ3RvdWNoLWFjdGlvbic6e3ZhbHVlczpbJ25vbmUnLCdhdXRvJywncGFuLXgnLCdwYW4teScsJ3Bhbi1sZWZ0JywncGFuLXJpZ2h0JywncGFuLXVwJywncGFuLWRvd24nLCdtYW5pcHVsYXRpb24nLCdwaW5jaC16b29tJ119LCd0cmFuc2Zvcm0tYm94Jzp7dmFsdWVzOlsnYm9yZGVyLWJveCcsJ2ZpbGwtYm94Jywndmlldy1ib3gnXX0sJ3RyYW5zbGF0ZSc6e3ZhbHVlczpbJ25vbmUnXX0sJ3ZlY3Rvci1lZmZlY3QnOnt2YWx1ZXM6Wydub25lJywnbm9uLXNjYWxpbmctc3Ryb2tlJ119LCctd2Via2l0LWFwcC1yZWdpb24nOnt2YWx1ZXM6WydkcmFnJywnbm8tZHJhZyddfSwnLXdlYmtpdC1hcHBlYXJhbmNlJzp7dmFsdWVzOlsnbm9uZScsJ2NoZWNrYm94JywncmFkaW8nLCdwdXNoLWJ1dHRvbicsJ3NxdWFyZS1idXR0b24nLCdidXR0b24nLCdidXR0b24tYmV2ZWwnLCdpbm5lci1zcGluLWJ1dHRvbicsJ2xpc3Rib3gnLCdsaXN0aXRlbScsJ21lZGlhLWVudGVyLWZ1bGxzY3JlZW4tYnV0dG9uJywnbWVkaWEtZXhpdC1mdWxsc2NyZWVuLWJ1dHRvbicsJ21lZGlhLW11dGUtYnV0dG9uJywnbWVkaWEtcGxheS1idXR0b24nLCdtZWRpYS1vdmVybGF5LXBsYXktYnV0dG9uJywnbWVkaWEtdG9nZ2xlLWNsb3NlZC1jYXB0aW9ucy1idXR0b24nLCdtZWRpYS1zbGlkZXInLCdtZWRpYS1zbGlkZXJ0aHVtYicsJ21lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyJywnbWVkaWEtdm9sdW1lLXNsaWRlcicsJ21lZGlhLXZvbHVtZS1zbGlkZXJ0aHVtYicsJ21lZGlhLWNvbnRyb2xzLWJhY2tncm91bmQnLCdtZWRpYS1jb250cm9scy1mdWxsc2NyZWVuLWJhY2tncm91bmQnLCdtZWRpYS1jdXJyZW50LXRpbWUtZGlzcGxheScsJ21lZGlhLXRpbWUtcmVtYWluaW5nLWRpc3BsYXknLCdtZW51bGlzdCcsJ21lbnVsaXN0LWJ1dHRvbicsJ21lbnVsaXN0LXRleHQnLCdtZW51bGlzdC10ZXh0ZmllbGQnLCdtZXRlcicsJ3Byb2dyZXNzLWJhcicsJ3Byb2dyZXNzLWJhci12YWx1ZScsJ3NsaWRlci1ob3Jpem9udGFsJywnc2xpZGVyLXZlcnRpY2FsJywnc2xpZGVydGh1bWItaG9yaXpvbnRhbCcsJ3NsaWRlcnRodW1iLXZlcnRpY2FsJywnY2FyZXQnLCdzZWFyY2hmaWVsZCcsJ3NlYXJjaGZpZWxkLWNhbmNlbC1idXR0b24nLCd0ZXh0ZmllbGQnLCd0ZXh0YXJlYSddfSwnLXdlYmtpdC1ib3JkZXItYWZ0ZXInOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdvdXRzZXQnLCdyaWRnZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJywnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCctd2Via2l0LWJvcmRlci1hZnRlci1zdHlsZSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnXX0sJy13ZWJraXQtYm9yZGVyLWFmdGVyLXdpZHRoJzp7dmFsdWVzOlsnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCctd2Via2l0LWJvcmRlci1iZWZvcmUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdvdXRzZXQnLCdyaWRnZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJywnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCctd2Via2l0LWJvcmRlci1iZWZvcmUtc3R5bGUnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdvdXRzZXQnLCdyaWRnZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJ119LCctd2Via2l0LWJvcmRlci1iZWZvcmUtd2lkdGgnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJy13ZWJraXQtYm9yZGVyLWVuZCc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnLCdtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJy13ZWJraXQtYm9yZGVyLWVuZC1zdHlsZSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnXX0sJy13ZWJraXQtYm9yZGVyLWVuZC13aWR0aCc6e3ZhbHVlczpbJ21lZGl1bScsJ3RoaWNrJywndGhpbiddfSwnLXdlYmtpdC1ib3JkZXItc3RhcnQnOnt2YWx1ZXM6Wydub25lJywnaGlkZGVuJywnaW5zZXQnLCdncm9vdmUnLCdvdXRzZXQnLCdyaWRnZScsJ2RvdHRlZCcsJ2Rhc2hlZCcsJ3NvbGlkJywnZG91YmxlJywnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCctd2Via2l0LWJvcmRlci1zdGFydC1zdHlsZSc6e3ZhbHVlczpbJ25vbmUnLCdoaWRkZW4nLCdpbnNldCcsJ2dyb292ZScsJ291dHNldCcsJ3JpZGdlJywnZG90dGVkJywnZGFzaGVkJywnc29saWQnLCdkb3VibGUnXX0sJy13ZWJraXQtYm9yZGVyLXN0YXJ0LXdpZHRoJzp7dmFsdWVzOlsnbWVkaXVtJywndGhpY2snLCd0aGluJ119LCctd2Via2l0LWJveC1wYWNrJzp7dmFsdWVzOlsnY2VudGVyJywnanVzdGlmeScsJ3N0YXJ0JywnZW5kJ119LCctd2Via2l0LWhpZ2hsaWdodCc6e3ZhbHVlczpbJ25vbmUnXX0sJy13ZWJraXQtaHlwaGVuYXRlLWNoYXJhY3Rlcic6e3ZhbHVlczpbJ2F1dG8nXX0sJy13ZWJraXQtbG9naWNhbC1oZWlnaHQnOnt2YWx1ZXM6WydhdXRvJywnLXdlYmtpdC1maWxsLWF2YWlsYWJsZScsJ21pbi1jb250ZW50JywnbWF4LWNvbnRlbnQnLCdmaXQtY29udGVudCddfSwnLXdlYmtpdC1sb2dpY2FsLXdpZHRoJzp7dmFsdWVzOlsnYXV0bycsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJy13ZWJraXQtbWFyZ2luLWFmdGVyJzp7dmFsdWVzOlsnYXV0byddfSwnLXdlYmtpdC1tYXJnaW4tYmVmb3JlJzp7dmFsdWVzOlsnYXV0byddfSwnLXdlYmtpdC1tYXJnaW4tY29sbGFwc2UnOnt2YWx1ZXM6Wydjb2xsYXBzZScsJ3NlcGFyYXRlJywnZGlzY2FyZCddfSwnLXdlYmtpdC1tYXJnaW4tZW5kJzp7dmFsdWVzOlsnYXV0byddfSwnLXdlYmtpdC1tYXJnaW4tc3RhcnQnOnt2YWx1ZXM6WydhdXRvJ119LCctd2Via2l0LW1hc2stYm94LWltYWdlJzp7dmFsdWVzOlsnbm9uZScsJ3JlcGVhdCcsJ3N0cmV0Y2gnLCdzcGFjZScsJ3JvdW5kJ119LCctd2Via2l0LW1hc2stYm94LWltYWdlLXJlcGVhdCc6e3ZhbHVlczpbJ3JlcGVhdCcsJ3N0cmV0Y2gnLCdzcGFjZScsJ3JvdW5kJ119LCctd2Via2l0LW1hc2stYm94LWltYWdlLXNvdXJjZSc6e3ZhbHVlczpbJ25vbmUnXX0sJy13ZWJraXQtbWFzay1ib3gtaW1hZ2Utd2lkdGgnOnt2YWx1ZXM6WydhdXRvJ119LCctd2Via2l0LW1hc2stY2xpcCc6e3ZhbHVlczpbJ3RleHQnLCdib3JkZXInLCdib3JkZXItYm94JywnY29udGVudCcsJ2NvbnRlbnQtYm94JywncGFkZGluZycsJ3BhZGRpbmctYm94J119LCctd2Via2l0LW1hc2stY29tcG9zaXRlJzp7dmFsdWVzOlsnY2xlYXInLCdjb3B5Jywnc291cmNlLW92ZXInLCdzb3VyY2UtaW4nLCdzb3VyY2Utb3V0Jywnc291cmNlLWF0b3AnLCdkZXN0aW5hdGlvbi1vdmVyJywnZGVzdGluYXRpb24taW4nLCdkZXN0aW5hdGlvbi1vdXQnLCdkZXN0aW5hdGlvbi1hdG9wJywneG9yJywncGx1cy1saWdodGVyJ119LCctd2Via2l0LW1hc2staW1hZ2UnOnt2YWx1ZXM6Wydub25lJ119LCctd2Via2l0LW1hc2stb3JpZ2luJzp7dmFsdWVzOlsnYm9yZGVyJywnYm9yZGVyLWJveCcsJ2NvbnRlbnQnLCdjb250ZW50LWJveCcsJ3BhZGRpbmcnLCdwYWRkaW5nLWJveCddfSwnLXdlYmtpdC1tYXNrLXBvc2l0aW9uJzp7dmFsdWVzOlsndG9wJywnYm90dG9tJywnbGVmdCcsJ3JpZ2h0JywnY2VudGVyJ119LCctd2Via2l0LW1hc2stcG9zaXRpb24teCc6e3ZhbHVlczpbJ2xlZnQnLCdyaWdodCcsJ2NlbnRlciddfSwnLXdlYmtpdC1tYXNrLXBvc2l0aW9uLXknOnt2YWx1ZXM6Wyd0b3AnLCdib3R0b20nLCdjZW50ZXInXX0sJy13ZWJraXQtbWFzay1yZXBlYXQnOnt2YWx1ZXM6WydyZXBlYXQnLCdyZXBlYXQteCcsJ3JlcGVhdC15Jywnbm8tcmVwZWF0Jywnc3BhY2UnLCdyb3VuZCddfSwnLXdlYmtpdC1tYXNrLXNpemUnOnt2YWx1ZXM6WydhdXRvJywnY29udGFpbicsJ2NvdmVyJ119LCctd2Via2l0LW1heC1sb2dpY2FsLWhlaWdodCc6e3ZhbHVlczpbJ25vbmUnLCctd2Via2l0LWZpbGwtYXZhaWxhYmxlJywnbWluLWNvbnRlbnQnLCdtYXgtY29udGVudCcsJ2ZpdC1jb250ZW50J119LCctd2Via2l0LW1heC1sb2dpY2FsLXdpZHRoJzp7dmFsdWVzOlsnbm9uZScsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJy13ZWJraXQtbWluLWxvZ2ljYWwtaGVpZ2h0Jzp7dmFsdWVzOlsnYXV0bycsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJy13ZWJraXQtbWluLWxvZ2ljYWwtd2lkdGgnOnt2YWx1ZXM6WydhdXRvJywnLXdlYmtpdC1maWxsLWF2YWlsYWJsZScsJ21pbi1jb250ZW50JywnbWF4LWNvbnRlbnQnLCdmaXQtY29udGVudCddfSwnLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW4teCc6e3ZhbHVlczpbJ2xlZnQnLCdyaWdodCcsJ2NlbnRlciddfSwnLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW4teSc6e3ZhbHVlczpbJ3RvcCcsJ2JvdHRvbScsJ2NlbnRlciddfSwnLXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3QnOnt2YWx1ZXM6WydlY29ub215JywnZXhhY3QnXX0sJy13ZWJraXQtcnRsLW9yZGVyaW5nJzp7dmFsdWVzOlsnbG9naWNhbCcsJ3Zpc3VhbCddfSwnLXdlYmtpdC1ydWJ5LXBvc2l0aW9uJzp7dmFsdWVzOlsnYWZ0ZXInLCdiZWZvcmUnXX0sJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9ucy1pbi1lZmZlY3QnOnt2YWx1ZXM6Wydub25lJywnYmxpbmsnLCdsaW5lLXRocm91Z2gnLCdvdmVybGluZScsJ3VuZGVybGluZSddfSwnLXdlYmtpdC10ZXh0LXNlY3VyaXR5Jzp7dmFsdWVzOlsnbm9uZScsJ2Rpc2MnLCdjaXJjbGUnLCdzcXVhcmUnXX0sJy13ZWJraXQtdGV4dC1zdHJva2UnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJy13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGgnOnt2YWx1ZXM6WydtZWRpdW0nLCd0aGljaycsJ3RoaW4nXX0sJy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbi14Jzp7dmFsdWVzOlsnbGVmdCcsJ3JpZ2h0JywnY2VudGVyJ119LCctd2Via2l0LXRyYW5zZm9ybS1vcmlnaW4teSc6e3ZhbHVlczpbJ3RvcCcsJ2JvdHRvbScsJ2NlbnRlciddfSwnLXdlYmtpdC11c2VyLWRyYWcnOnt2YWx1ZXM6Wydub25lJywnYXV0bycsJ2VsZW1lbnQnXX0sJ3dpZHRoJzp7dmFsdWVzOlsnYXV0bycsJy13ZWJraXQtZmlsbC1hdmFpbGFibGUnLCdtaW4tY29udGVudCcsJ21heC1jb250ZW50JywnZml0LWNvbnRlbnQnXX0sJ3otaW5kZXgnOnt2YWx1ZXM6WydhdXRvJ119fTtTREsuQ1NTTWV0YWRhdGEuV2VpZ2h0PXsnYWxpZ24tY29udGVudCc6NTcsJ2FsaWduLWl0ZW1zJzoxMjksJ2FsaWduLXNlbGYnOjU1LCdhbmltYXRpb24nOjE3NSwnYW5pbWF0aW9uLWRlbGF5JzoxMTQsJ2FuaW1hdGlvbi1kaXJlY3Rpb24nOjExMywnYW5pbWF0aW9uLWR1cmF0aW9uJzoxMzcsJ2FuaW1hdGlvbi1maWxsLW1vZGUnOjEzMiwnYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCc6MTI0LCdhbmltYXRpb24tbmFtZSc6MTM5LCdhbmltYXRpb24tcGxheS1zdGF0ZSc6MTA0LCdhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJzoxNDEsJ2JhY2tmYWNlLXZpc2liaWxpdHknOjEyMywnYmFja2dyb3VuZCc6MjYwLCdiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnOjExOSwnYmFja2dyb3VuZC1jbGlwJzoxNjUsJ2JhY2tncm91bmQtY29sb3InOjI1OSwnYmFja2dyb3VuZC1pbWFnZSc6MjQ2LCdiYWNrZ3JvdW5kLW9yaWdpbic6MTA3LCdiYWNrZ3JvdW5kLXBvc2l0aW9uJzoyMzcsJ2JhY2tncm91bmQtcG9zaXRpb24teCc6MTA4LCdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknOjkzLCdiYWNrZ3JvdW5kLXJlcGVhdCc6MjM0LCdiYWNrZ3JvdW5kLXNpemUnOjIwMywnYm9yZGVyJzoyNjMsJ2JvcmRlci1ib3R0b20nOjIzMywnYm9yZGVyLWJvdHRvbS1jb2xvcic6MTkwLCdib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzoxODYsJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzoxODUsJ2JvcmRlci1ib3R0b20tc3R5bGUnOjE1MCwnYm9yZGVyLWJvdHRvbS13aWR0aCc6MTc5LCdib3JkZXItY29sbGFwc2UnOjIwOSwnYm9yZGVyLWNvbG9yJzoyMjYsJ2JvcmRlci1pbWFnZSc6ODksJ2JvcmRlci1pbWFnZS1vdXRzZXQnOjUwLCdib3JkZXItaW1hZ2UtcmVwZWF0Jzo0OSwnYm9yZGVyLWltYWdlLXNsaWNlJzo1OCwnYm9yZGVyLWltYWdlLXNvdXJjZSc6MzIsJ2JvcmRlci1pbWFnZS13aWR0aCc6NTIsJ2JvcmRlci1sZWZ0JzoyMjEsJ2JvcmRlci1sZWZ0LWNvbG9yJzoxNzQsJ2JvcmRlci1sZWZ0LXN0eWxlJzoxNDIsJ2JvcmRlci1sZWZ0LXdpZHRoJzoxNzIsJ2JvcmRlci1yYWRpdXMnOjIyNCwnYm9yZGVyLXJpZ2h0JzoyMjMsJ2JvcmRlci1yaWdodC1jb2xvcic6MTgyLCdib3JkZXItcmlnaHQtc3R5bGUnOjEzMCwnYm9yZGVyLXJpZ2h0LXdpZHRoJzoxNzgsJ2JvcmRlci1zcGFjaW5nJzoxOTgsJ2JvcmRlci1zdHlsZSc6MjA2LCdib3JkZXItdG9wJzoyMzEsJ2JvcmRlci10b3AtY29sb3InOjE5MiwnYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyc6MTg3LCdib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyc6MTg5LCdib3JkZXItdG9wLXN0eWxlJzoxNTIsJ2JvcmRlci10b3Atd2lkdGgnOjE4MCwnYm9yZGVyLXdpZHRoJzoyMTQsJ2JvdHRvbSc6MjI3LCdib3gtc2hhZG93JzoyMTMsJ2JveC1zaXppbmcnOjIxNiwnY2FwdGlvbi1zaWRlJzo5NiwnY2xlYXInOjIyOSwnY2xpcCc6MTczLCdjbGlwLXJ1bGUnOjUsJ2NvbG9yJzoyNTYsJ2NvbnRlbnQnOjIxOSwnY291bnRlci1pbmNyZW1lbnQnOjExMSwnY291bnRlci1yZXNldCc6MTEwLCdjdXJzb3InOjI1MCwnZGlyZWN0aW9uJzoxNzYsJ2Rpc3BsYXknOjI2MiwnZW1wdHktY2VsbHMnOjk5LCdmaWxsJzoxNDAsJ2ZpbGwtb3BhY2l0eSc6ODIsJ2ZpbGwtcnVsZSc6MjIsJ2ZpbHRlcic6MTYwLCdmbGV4JzoxMzMsJ2ZsZXgtYmFzaXMnOjY2LCdmbGV4LWRpcmVjdGlvbic6ODUsJ2ZsZXgtZmxvdyc6OTQsJ2ZsZXgtZ3Jvdyc6MTEyLCdmbGV4LXNocmluayc6NjEsJ2ZsZXgtd3JhcCc6NjgsJ2Zsb2F0JzoyNTIsJ2ZvbnQnOjIxMSwnZm9udC1mYW1pbHknOjI1NCwnZm9udC1rZXJuaW5nJzoxOCwnZm9udC1zaXplJzoyNjQsJ2ZvbnQtc3RyZXRjaCc6NzcsJ2ZvbnQtc3R5bGUnOjIyMCwnZm9udC12YXJpYW50JzoxNjEsJ2ZvbnQtd2VpZ2h0JzoyNTcsJ2hlaWdodCc6MjY2LCdpbWFnZS1yZW5kZXJpbmcnOjkwLCdqdXN0aWZ5LWNvbnRlbnQnOjEyNywnbGVmdCc6MjQ4LCdsZXR0ZXItc3BhY2luZyc6MTg4LCdsaW5lLWhlaWdodCc6MjQ0LCdsaXN0LXN0eWxlJzoyMTUsJ2xpc3Qtc3R5bGUtaW1hZ2UnOjE0NSwnbGlzdC1zdHlsZS1wb3NpdGlvbic6MTQ5LCdsaXN0LXN0eWxlLXR5cGUnOjE5OSwnbWFyZ2luJzoyNjcsJ21hcmdpbi1ib3R0b20nOjI0MSwnbWFyZ2luLWxlZnQnOjI0MywnbWFyZ2luLXJpZ2h0JzoyMzgsJ21hcmdpbi10b3AnOjI1MywnbWFzayc6MjAsJ21heC1oZWlnaHQnOjIwNSwnbWF4LXdpZHRoJzoyMjUsJ21pbi1oZWlnaHQnOjIxNywnbWluLXdpZHRoJzoyMTgsJ29iamVjdC1maXQnOjMzLCdvcGFjaXR5JzoyNTEsJ29yZGVyJzoxMTcsJ29ycGhhbnMnOjE0Niwnb3V0bGluZSc6MjIyLCdvdXRsaW5lLWNvbG9yJzoxNTMsJ291dGxpbmUtb2Zmc2V0JzoxNDcsJ291dGxpbmUtc3R5bGUnOjE1MSwnb3V0bGluZS13aWR0aCc6MTQ4LCdvdmVyZmxvdyc6MjU1LCdvdmVyZmxvdy13cmFwJzoxMDUsJ292ZXJmbG93LXgnOjE4NCwnb3ZlcmZsb3cteSc6MTk2LCdwYWRkaW5nJzoyNjUsJ3BhZGRpbmctYm90dG9tJzoyMzAsJ3BhZGRpbmctbGVmdCc6MjM1LCdwYWRkaW5nLXJpZ2h0JzoyMzIsJ3BhZGRpbmctdG9wJzoyNDAsJ3BhZ2UnOjgsJ3BhZ2UtYnJlYWstYWZ0ZXInOjEyMCwncGFnZS1icmVhay1iZWZvcmUnOjY5LCdwYWdlLWJyZWFrLWluc2lkZSc6MTIxLCdwZXJzcGVjdGl2ZSc6OTIsJ3BlcnNwZWN0aXZlLW9yaWdpbic6MTAzLCdwb2ludGVyLWV2ZW50cyc6MTgzLCdwb3NpdGlvbic6MjYxLCdxdW90ZXMnOjE1OCwncmVzaXplJzoxNjgsJ3JpZ2h0JzoyNDUsJ3NoYXBlLXJlbmRlcmluZyc6MzgsJ3NpemUnOjY0LCdzcGVhayc6MTE4LCdzcmMnOjE3MCwnc3RvcC1jb2xvcic6NDIsJ3N0b3Atb3BhY2l0eSc6MzEsJ3N0cm9rZSc6OTgsJ3N0cm9rZS1kYXNoYXJyYXknOjM2LCdzdHJva2UtZGFzaG9mZnNldCc6Mywnc3Ryb2tlLWxpbmVjYXAnOjMwLCdzdHJva2UtbGluZWpvaW4nOjIxLCdzdHJva2UtbWl0ZXJsaW1pdCc6MTIsJ3N0cm9rZS1vcGFjaXR5JzozNCwnc3Ryb2tlLXdpZHRoJzo4NywndGFibGUtbGF5b3V0JzoxNzEsJ3RhYi1zaXplJzo0NiwndGV4dC1hbGlnbic6MjYwLCd0ZXh0LWFuY2hvcic6MzUsJ3RleHQtZGVjb3JhdGlvbic6MjQ3LCd0ZXh0LWluZGVudCc6MjA3LCd0ZXh0LW92ZXJmbG93JzoyMDQsJ3RleHQtcmVuZGVyaW5nJzoxNTUsJ3RleHQtc2hhZG93JzoyMDgsJ3RleHQtdHJhbnNmb3JtJzoyMDIsJ3RvcCc6MjU4LCd0b3VjaC1hY3Rpb24nOjgwLCd0cmFuc2Zvcm0nOjE4MSwndHJhbnNmb3JtLW9yaWdpbic6MTYyLCd0cmFuc2Zvcm0tc3R5bGUnOjg2LCd0cmFuc2l0aW9uJzoxOTMsJ3RyYW5zaXRpb24tZGVsYXknOjEzNCwndHJhbnNpdGlvbi1kdXJhdGlvbic6MTM1LCd0cmFuc2l0aW9uLXByb3BlcnR5JzoxMzEsJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzoxMjIsJ3VuaWNvZGUtYmlkaSc6MTU2LCd1bmljb2RlLXJhbmdlJzoxMzYsJ3ZlcnRpY2FsLWFsaWduJzoyMzYsJ3Zpc2liaWxpdHknOjI0MiwnLXdlYmtpdC1hcHBlYXJhbmNlJzoxOTEsJy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eSc6MTU0LCctd2Via2l0LWJhY2tncm91bmQtY2xpcCc6MTY0LCctd2Via2l0LWJhY2tncm91bmQtb3JpZ2luJzo0MCwnLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemUnOjE2MywnLXdlYmtpdC1ib3JkZXItZW5kJzo5LCctd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmcnOjgxLCctd2Via2l0LWJvcmRlci1pbWFnZSc6NzUsJy13ZWJraXQtYm9yZGVyLXJhZGl1cyc6MjEyLCctd2Via2l0LWJvcmRlci1zdGFydCc6MTAsJy13ZWJraXQtYm9yZGVyLXN0YXJ0LWNvbG9yJzoxNiwnLXdlYmtpdC1ib3JkZXItc3RhcnQtd2lkdGgnOjEzLCctd2Via2l0LWJvcmRlci12ZXJ0aWNhbC1zcGFjaW5nJzo0MywnLXdlYmtpdC1ib3gtYWxpZ24nOjEwMSwnLXdlYmtpdC1ib3gtZGlyZWN0aW9uJzo1MSwnLXdlYmtpdC1ib3gtZmxleCc6MTI4LCctd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwJzo5MSwnLXdlYmtpdC1ib3gtb3JpZW50JzoxNDQsJy13ZWJraXQtYm94LXBhY2snOjEwNiwnLXdlYmtpdC1ib3gtcmVmbGVjdCc6MzksJy13ZWJraXQtYm94LXNoYWRvdyc6MjEwLCctd2Via2l0LWNvbHVtbi1icmVhay1pbnNpZGUnOjYwLCctd2Via2l0LWNvbHVtbi1jb3VudCc6ODQsJy13ZWJraXQtY29sdW1uLWdhcCc6NzYsJy13ZWJraXQtY29sdW1uLXJ1bGUnOjI1LCctd2Via2l0LWNvbHVtbi1ydWxlLWNvbG9yJzoyMywnLXdlYmtpdC1jb2x1bW5zJzo0NCwnLXdlYmtpdC1jb2x1bW4tc3Bhbic6MjksJy13ZWJraXQtY29sdW1uLXdpZHRoJzo0NywnLXdlYmtpdC1maWx0ZXInOjE1OSwnLXdlYmtpdC1mb250LWZlYXR1cmUtc2V0dGluZ3MnOjU5LCctd2Via2l0LWZvbnQtc21vb3RoaW5nJzoxNzcsJy13ZWJraXQtaGlnaGxpZ2h0JzoxLCctd2Via2l0LWxpbmUtYnJlYWsnOjQ1LCctd2Via2l0LWxpbmUtY2xhbXAnOjEyNiwnLXdlYmtpdC1tYXJnaW4tYWZ0ZXInOjY3LCctd2Via2l0LW1hcmdpbi1iZWZvcmUnOjcwLCctd2Via2l0LW1hcmdpbi1jb2xsYXBzZSc6MTQsJy13ZWJraXQtbWFyZ2luLWVuZCc6NjUsJy13ZWJraXQtbWFyZ2luLXN0YXJ0JzoxMDAsJy13ZWJraXQtbWFyZ2luLXRvcC1jb2xsYXBzZSc6NzgsJy13ZWJraXQtbWFzayc6MTksJy13ZWJraXQtbWFzay1ib3gtaW1hZ2UnOjcyLCctd2Via2l0LW1hc2staW1hZ2UnOjg4LCctd2Via2l0LW1hc2stcG9zaXRpb24nOjU0LCctd2Via2l0LW1hc2stcmVwZWF0Jzo2MywnLXdlYmtpdC1tYXNrLXNpemUnOjc5LCctd2Via2l0LXBhZGRpbmctYWZ0ZXInOjE1LCctd2Via2l0LXBhZGRpbmctYmVmb3JlJzoyOCwnLXdlYmtpdC1wYWRkaW5nLWVuZCc6NDgsJy13ZWJraXQtcGFkZGluZy1zdGFydCc6NzMsJy13ZWJraXQtcHJpbnQtY29sb3ItYWRqdXN0Jzo4MywnLXdlYmtpdC1ydGwtb3JkZXJpbmcnOjcsJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic6MTY5LCctd2Via2l0LXRleHQtZW1waGFzaXMtY29sb3InOjExLCctd2Via2l0LXRleHQtZmlsbC1jb2xvcic6NzEsJy13ZWJraXQtdGV4dC1zZWN1cml0eSc6MTcsJy13ZWJraXQtdGV4dC1zdHJva2UnOjU2LCctd2Via2l0LXRleHQtc3Ryb2tlLWNvbG9yJzozNywnLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aCc6NTMsJy13ZWJraXQtdXNlci1kcmFnJzo5NSwnLXdlYmtpdC11c2VyLW1vZGlmeSc6NjIsJy13ZWJraXQtdXNlci1zZWxlY3QnOjE5NCwnLXdlYmtpdC13cml0aW5nLW1vZGUnOjQsJ3doaXRlLXNwYWNlJzoyMjgsJ3dpZG93cyc6MTE1LCd3aWR0aCc6MjY4LCd3aWxsLWNoYW5nZSc6NzQsJ3dvcmQtYnJlYWsnOjE2Niwnd29yZC1zcGFjaW5nJzoxNTcsJ3dvcmQtd3JhcCc6MTk3LCd3cml0aW5nLW1vZGUnOjQxLCd6LWluZGV4JzoyMzksJ3pvb20nOjIwMH07O1NESy5DU1NNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fZG9tTW9kZWw9KHRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpKTt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyPW5ldyBTREsuU291cmNlTWFwTWFuYWdlcih0YXJnZXQpO3RoaXMuX2FnZW50PXRhcmdldC5jc3NBZ2VudCgpO3RoaXMuX3N0eWxlTG9hZGVyPW5ldyBTREsuQ1NTTW9kZWwuQ29tcHV0ZWRTdHlsZUxvYWRlcih0aGlzKTt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZih0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbCl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLk1haW5GcmFtZU5hdmlnYXRlZCx0aGlzLl9yZXNldFN0eWxlU2hlZXRzLHRoaXMpO30KdGFyZ2V0LnJlZ2lzdGVyQ1NTRGlzcGF0Y2hlcihuZXcgU0RLLkNTU0Rpc3BhdGNoZXIodGhpcykpO2lmKCF0YXJnZXQuc3VzcGVuZGVkKCkpCnRoaXMuX2VuYWJsZSgpO3RoaXMuX3N0eWxlU2hlZXRJZFRvSGVhZGVyPW5ldyBNYXAoKTt0aGlzLl9zdHlsZVNoZWV0SWRzRm9yVVJMPW5ldyBNYXAoKTt0aGlzLl9vcmlnaW5hbFN0eWxlU2hlZXRUZXh0PW5ldyBNYXAoKTt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNldEVuYWJsZWQoQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2Nzc1NvdXJjZU1hcHNFbmFibGVkJykuZ2V0KCkpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdjc3NTb3VyY2VNYXBzRW5hYmxlZCcpLmFkZENoYW5nZUxpc3RlbmVyKGV2ZW50PT50aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNldEVuYWJsZWQoKGV2ZW50LmRhdGEpKSk7fQpzb3VyY2VNYXBNYW5hZ2VyKCl7cmV0dXJuIHRoaXMuX3NvdXJjZU1hcE1hbmFnZXI7fQpzdGF0aWMgdHJpbVNvdXJjZVVSTCh0ZXh0KXtsZXQgc291cmNlVVJMSW5kZXg9dGV4dC5sYXN0SW5kZXhPZignLyojIHNvdXJjZVVSTD0nKTtpZihzb3VyY2VVUkxJbmRleD09PS0xKXtzb3VyY2VVUkxJbmRleD10ZXh0Lmxhc3RJbmRleE9mKCcvKkAgc291cmNlVVJMPScpO2lmKHNvdXJjZVVSTEluZGV4PT09LTEpCnJldHVybiB0ZXh0O30KY29uc3Qgc291cmNlVVJMTGluZUluZGV4PXRleHQubGFzdEluZGV4T2YoJ1xuJyxzb3VyY2VVUkxJbmRleCk7aWYoc291cmNlVVJMTGluZUluZGV4PT09LTEpCnJldHVybiB0ZXh0O2NvbnN0IHNvdXJjZVVSTExpbmU9dGV4dC5zdWJzdHIoc291cmNlVVJMTGluZUluZGV4KzEpLnNwbGl0KCdcbicsMSlbMF07Y29uc3Qgc291cmNlVVJMUmVnZXg9L1tcMDQwXHRdKlwvXCpbI0BdIHNvdXJjZVVSTD1bXDA0MFx0XSooW15cc10qKVtcMDQwXHRdKlwqXC9bXDA0MFx0XSokLztpZihzb3VyY2VVUkxMaW5lLnNlYXJjaChzb3VyY2VVUkxSZWdleCk9PT0tMSkKcmV0dXJuIHRleHQ7cmV0dXJuIHRleHQuc3Vic3RyKDAsc291cmNlVVJMTGluZUluZGV4KSt0ZXh0LnN1YnN0cihzb3VyY2VVUkxMaW5lSW5kZXgrc291cmNlVVJMTGluZS5sZW5ndGgrMSk7fQpkb21Nb2RlbCgpe3JldHVybiB0aGlzLl9kb21Nb2RlbDt9CnNldFN0eWxlVGV4dChzdHlsZVNoZWV0SWQscmFuZ2UsdGV4dCxtYWpvckNoYW5nZSl7Y29uc3Qgb3JpZ2luYWw9dGhpcy5faW5uZXJTZXRTdHlsZVRleHRzLmJpbmQodGhpcyxbc3R5bGVTaGVldElkXSxbcmFuZ2VdLFt0ZXh0XSxtYWpvckNoYW5nZSk7Y29uc3QgaGVhZGVyPXRoaXMuc3R5bGVTaGVldEhlYWRlckZvcklkKHN0eWxlU2hlZXRJZCk7aWYoIWhlYWRlcikKcmV0dXJuIG9yaWdpbmFsKCk7Y29uc3Qgc291cmNlTWFwPXRoaXMuX3NvdXJjZU1hcE1hbmFnZXIuc291cmNlTWFwRm9yQ2xpZW50KGhlYWRlcik7aWYoIXNvdXJjZU1hcCkKcmV0dXJuIG9yaWdpbmFsKCk7Y29uc3Qgb3JpZ2luYWxBbmREZXRhY2g9b3JpZ2luYWxBbmREZXRhY2hJZlN1Y2Nlc3MuYmluZCh0aGlzLGhlYWRlcik7aWYoIXNvdXJjZU1hcC5lZGl0YWJsZSgpKQpyZXR1cm4gb3JpZ2luYWwoKTtyZXR1cm4oc291cmNlTWFwLmVkaXRDb21waWxlZChbcmFuZ2VdLFt0ZXh0XSkudGhlbihvbkVkaXRpbmdEb25lLmJpbmQodGhpcykpLmNhdGNoKG9uRXJyb3IuYmluZCh0aGlzLGhlYWRlcikpKTtmdW5jdGlvbiBvbkVkaXRpbmdEb25lKGVkaXRSZXN1bHQpe2lmKCFlZGl0UmVzdWx0KQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtsZXQgZWRpdHM9ZWRpdFJlc3VsdC5jb21waWxlZEVkaXRzO2lmKCFlZGl0cy5sZW5ndGgpCnJldHVybiBvbkNTU1BhdGNoZWQuY2FsbCh0aGlzLGVkaXRSZXN1bHQsdHJ1ZSk7ZWRpdHMuc29ydChUZXh0VXRpbHMuU291cmNlRWRpdC5jb21wYXJhdG9yKTtlZGl0cz1lZGl0cy5yZXZlcnNlKCk7Y29uc3Qgc3R5bGVTaGVldElkcz1bXTtjb25zdCByYW5nZXM9W107Y29uc3QgdGV4dHM9W107Zm9yKGNvbnN0IGVkaXQgb2YgZWRpdHMpe3N0eWxlU2hlZXRJZHMucHVzaChoZWFkZXIuaWQpO3Jhbmdlcy5wdXNoKGVkaXQub2xkUmFuZ2UpO3RleHRzLnB1c2goZWRpdC5uZXdUZXh0KTt9CnJldHVybiB0aGlzLl9pbm5lclNldFN0eWxlVGV4dHMoc3R5bGVTaGVldElkcyxyYW5nZXMsdGV4dHMsbWFqb3JDaGFuZ2UpLnRoZW4ob25DU1NQYXRjaGVkLmJpbmQodGhpcyxlZGl0UmVzdWx0KSk7fQpmdW5jdGlvbiBvbkNTU1BhdGNoZWQoZWRpdFJlc3VsdCxzdWNjZXNzKXtpZighc3VjY2VzcykKcmV0dXJuIG9yaWdpbmFsQW5kRGV0YWNoKCk7dGhpcy5fc291cmNlTWFwTWFuYWdlci5hcHBseVNvdXJjZU1hcEVkaXQoZWRpdFJlc3VsdCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTt9CmZ1bmN0aW9uIG9uRXJyb3IoaGVhZGVyLGVycm9yKXtDb21tb24uY29uc29sZS5lcnJvcihDb21tb24uVUlTdHJpbmcoJ0xpdmVTQVNTIGZhaWxlZDogJXMnLHNvdXJjZU1hcC5jb21waWxlZFVSTCgpKSk7Y29uc29sZS5lcnJvcihlcnJvcik7dGhpcy5fc291cmNlTWFwTWFuYWdlci5kZXRhY2hTb3VyY2VNYXAoaGVhZGVyKTtyZXR1cm4gb3JpZ2luYWwoKTt9CmZ1bmN0aW9uIG9yaWdpbmFsQW5kRGV0YWNoSWZTdWNjZXNzKGhlYWRlcil7cmV0dXJuIHRoaXMuX2lubmVyU2V0U3R5bGVUZXh0cyhbc3R5bGVTaGVldElkXSxbcmFuZ2VdLFt0ZXh0XSxtYWpvckNoYW5nZSkudGhlbihkZXRhY2hJZlN1Y2Nlc3MuYmluZCh0aGlzKSk7ZnVuY3Rpb24gZGV0YWNoSWZTdWNjZXNzKHN1Y2Nlc3Mpe2lmKHN1Y2Nlc3MpCnRoaXMuX3NvdXJjZU1hcE1hbmFnZXIuZGV0YWNoU291cmNlTWFwKGhlYWRlcik7cmV0dXJuIHN1Y2Nlc3M7fX19CmFzeW5jIF9pbm5lclNldFN0eWxlVGV4dHMoc3R5bGVTaGVldElkcyxyYW5nZXMsdGV4dHMsbWFqb3JDaGFuZ2Upe2NvbnNvbGUuYXNzZXJ0KHN0eWxlU2hlZXRJZHMubGVuZ3RoPT09cmFuZ2VzLmxlbmd0aCYmcmFuZ2VzLmxlbmd0aD09PXRleHRzLmxlbmd0aCwnQXJyYXkgbGVuZ3RocyBtdXN0IGJlIGVxdWFsJyk7Y29uc3QgZWRpdHM9W107Y29uc3QgZW5zdXJlQ29udGVudFByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8c3R5bGVTaGVldElkcy5sZW5ndGg7KytpKXtlZGl0cy5wdXNoKHtzdHlsZVNoZWV0SWQ6c3R5bGVTaGVldElkc1tpXSxyYW5nZTpyYW5nZXNbaV0uc2VyaWFsaXplVG9PYmplY3QoKSx0ZXh0OnRleHRzW2ldfSk7ZW5zdXJlQ29udGVudFByb21pc2VzLnB1c2godGhpcy5fZW5zdXJlT3JpZ2luYWxTdHlsZVNoZWV0VGV4dChzdHlsZVNoZWV0SWRzW2ldKSk7fQp0cnl7YXdhaXQgUHJvbWlzZS5hbGwoZW5zdXJlQ29udGVudFByb21pc2VzKTtjb25zdCBzdHlsZVBheWxvYWRzPWF3YWl0IHRoaXMuX2FnZW50LnNldFN0eWxlVGV4dHMoZWRpdHMpO2lmKCFzdHlsZVBheWxvYWRzfHxzdHlsZVBheWxvYWRzLmxlbmd0aCE9PXJhbmdlcy5sZW5ndGgpCnJldHVybiBmYWxzZTt0aGlzLl9kb21Nb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSghbWFqb3JDaGFuZ2UpO2ZvcihsZXQgaT0wO2k8cmFuZ2VzLmxlbmd0aDsrK2kpe2NvbnN0IGVkaXQ9bmV3IFNESy5DU1NNb2RlbC5FZGl0KHN0eWxlU2hlZXRJZHNbaV0scmFuZ2VzW2ldLHRleHRzW2ldLHN0eWxlUGF5bG9hZHNbaV0pO3RoaXMuX2ZpcmVTdHlsZVNoZWV0Q2hhbmdlZChzdHlsZVNoZWV0SWRzW2ldLGVkaXQpO30KcmV0dXJuIHRydWU7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9fQphc3luYyBzZXRTZWxlY3RvclRleHQoc3R5bGVTaGVldElkLHJhbmdlLHRleHQpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uU3R5bGVSdWxlRWRpdGVkKTt0cnl7YXdhaXQgdGhpcy5fZW5zdXJlT3JpZ2luYWxTdHlsZVNoZWV0VGV4dChzdHlsZVNoZWV0SWQpO2NvbnN0IHNlbGVjdG9yUGF5bG9hZD1hd2FpdCB0aGlzLl9hZ2VudC5zZXRSdWxlU2VsZWN0b3Ioc3R5bGVTaGVldElkLHJhbmdlLHRleHQpO2lmKCFzZWxlY3RvclBheWxvYWQpCnJldHVybiBmYWxzZTt0aGlzLl9kb21Nb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpO2NvbnN0IGVkaXQ9bmV3IFNESy5DU1NNb2RlbC5FZGl0KHN0eWxlU2hlZXRJZCxyYW5nZSx0ZXh0LHNlbGVjdG9yUGF5bG9hZCk7dGhpcy5fZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKHN0eWxlU2hlZXRJZCxlZGl0KTtyZXR1cm4gdHJ1ZTt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319CmFzeW5jIHNldEtleWZyYW1lS2V5KHN0eWxlU2hlZXRJZCxyYW5nZSx0ZXh0KXtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlN0eWxlUnVsZUVkaXRlZCk7dHJ5e2F3YWl0IHRoaXMuX2Vuc3VyZU9yaWdpbmFsU3R5bGVTaGVldFRleHQoc3R5bGVTaGVldElkKTtjb25zdCBwYXlsb2FkPWF3YWl0IHRoaXMuX2FnZW50LnNldEtleWZyYW1lS2V5KHN0eWxlU2hlZXRJZCxyYW5nZSx0ZXh0KTtpZighcGF5bG9hZCkKcmV0dXJuIGZhbHNlO3RoaXMuX2RvbU1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7Y29uc3QgZWRpdD1uZXcgU0RLLkNTU01vZGVsLkVkaXQoc3R5bGVTaGVldElkLHJhbmdlLHRleHQscGF5bG9hZCk7dGhpcy5fZmlyZVN0eWxlU2hlZXRDaGFuZ2VkKHN0eWxlU2hlZXRJZCxlZGl0KTtyZXR1cm4gdHJ1ZTt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319CnN0YXJ0Q292ZXJhZ2UoKXt0aGlzLl9hZ2VudC5zdGFydFJ1bGVVc2FnZVRyYWNraW5nKCk7fQp0YWtlQ292ZXJhZ2VEZWx0YSgpe3JldHVybiB0aGlzLl9hZ2VudC50YWtlQ292ZXJhZ2VEZWx0YSgpLnRoZW4ocnVsZVVzYWdlPT5ydWxlVXNhZ2V8fFtdKTt9CnN0b3BDb3ZlcmFnZSgpe3JldHVybiB0aGlzLl9hZ2VudC5zdG9wUnVsZVVzYWdlVHJhY2tpbmcoKTt9CmFzeW5jIG1lZGlhUXVlcmllc1Byb21pc2UoKXtjb25zdCBwYXlsb2FkPWF3YWl0IHRoaXMuX2FnZW50LmdldE1lZGlhUXVlcmllcygpO3JldHVybiBwYXlsb2FkP1NESy5DU1NNZWRpYS5wYXJzZU1lZGlhQXJyYXlQYXlsb2FkKHRoaXMscGF5bG9hZCk6W107fQppc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5faXNFbmFibGVkO30KYXN5bmMgX2VuYWJsZSgpe2F3YWl0IHRoaXMuX2FnZW50LmVuYWJsZSgpO3RoaXMuX2lzRW5hYmxlZD10cnVlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5DU1NNb2RlbC5FdmVudHMuTW9kZWxXYXNFbmFibGVkKTt9CmFzeW5jIG1hdGNoZWRTdHlsZXNQcm9taXNlKG5vZGVJZCl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX2dldE1hdGNoZWRTdHlsZXNGb3JOb2RlKHtub2RlSWR9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnJldHVybiBudWxsO2NvbnN0IG5vZGU9dGhpcy5fZG9tTW9kZWwubm9kZUZvcklkKG5vZGVJZCk7aWYoIW5vZGUpCnJldHVybiBudWxsO3JldHVybiBuZXcgU0RLLkNTU01hdGNoZWRTdHlsZXModGhpcywobm9kZSkscmVzcG9uc2UuaW5saW5lU3R5bGV8fG51bGwscmVzcG9uc2UuYXR0cmlidXRlc1N0eWxlfHxudWxsLHJlc3BvbnNlLm1hdGNoZWRDU1NSdWxlc3x8W10scmVzcG9uc2UucHNldWRvRWxlbWVudHN8fFtdLHJlc3BvbnNlLmluaGVyaXRlZHx8W10scmVzcG9uc2UuY3NzS2V5ZnJhbWVzUnVsZXN8fFtdKTt9CmNsYXNzTmFtZXNQcm9taXNlKHN0eWxlU2hlZXRJZCl7cmV0dXJuIHRoaXMuX2FnZW50LmNvbGxlY3RDbGFzc05hbWVzKHN0eWxlU2hlZXRJZCkudGhlbihjbGFzc05hbWVzPT5jbGFzc05hbWVzfHxbXSk7fQpjb21wdXRlZFN0eWxlUHJvbWlzZShub2RlSWQpe3JldHVybiB0aGlzLl9zdHlsZUxvYWRlci5jb21wdXRlZFN0eWxlUHJvbWlzZShub2RlSWQpO30KYXN5bmMgYmFja2dyb3VuZENvbG9yc1Byb21pc2Uobm9kZUlkKXtjb25zdCByZXNwb25zZT10aGlzLl9hZ2VudC5pbnZva2VfZ2V0QmFja2dyb3VuZENvbG9ycyh7bm9kZUlkfSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQpyZXR1cm4gbnVsbDtyZXR1cm4gcmVzcG9uc2U7fQpwbGF0Zm9ybUZvbnRzUHJvbWlzZShub2RlSWQpe3JldHVybiB0aGlzLl9hZ2VudC5nZXRQbGF0Zm9ybUZvbnRzRm9yTm9kZShub2RlSWQpO30KYWxsU3R5bGVTaGVldHMoKXtjb25zdCB2YWx1ZXM9dGhpcy5fc3R5bGVTaGVldElkVG9IZWFkZXIudmFsdWVzQXJyYXkoKTtmdW5jdGlvbiBzdHlsZVNoZWV0Q29tcGFyYXRvcihhLGIpe2lmKGEuc291cmNlVVJMPGIuc291cmNlVVJMKQpyZXR1cm4tMTtlbHNlIGlmKGEuc291cmNlVVJMPmIuc291cmNlVVJMKQpyZXR1cm4gMTtyZXR1cm4gYS5zdGFydExpbmUtYi5zdGFydExpbmV8fGEuc3RhcnRDb2x1bW4tYi5zdGFydENvbHVtbjt9CnZhbHVlcy5zb3J0KHN0eWxlU2hlZXRDb21wYXJhdG9yKTtyZXR1cm4gdmFsdWVzO30KYXN5bmMgaW5saW5lU3R5bGVzUHJvbWlzZShub2RlSWQpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9nZXRJbmxpbmVTdHlsZXNGb3JOb2RlKHtub2RlSWR9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fCFyZXNwb25zZS5pbmxpbmVTdHlsZSkKcmV0dXJuIG51bGw7Y29uc3QgaW5saW5lU3R5bGU9bmV3IFNESy5DU1NTdHlsZURlY2xhcmF0aW9uKHRoaXMsbnVsbCxyZXNwb25zZS5pbmxpbmVTdHlsZSxTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLklubGluZSk7Y29uc3QgYXR0cmlidXRlc1N0eWxlPXJlc3BvbnNlLmF0dHJpYnV0ZXNTdHlsZT9uZXcgU0RLLkNTU1N0eWxlRGVjbGFyYXRpb24odGhpcyxudWxsLHJlc3BvbnNlLmF0dHJpYnV0ZXNTdHlsZSxTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLkF0dHJpYnV0ZXMpOm51bGw7cmV0dXJuIG5ldyBTREsuQ1NTTW9kZWwuSW5saW5lU3R5bGVSZXN1bHQoaW5saW5lU3R5bGUsYXR0cmlidXRlc1N0eWxlKTt9CmZvcmNlUHNldWRvU3RhdGUobm9kZSxwc2V1ZG9DbGFzcyxlbmFibGUpe2NvbnN0IHBzZXVkb0NsYXNzZXM9bm9kZS5tYXJrZXIoU0RLLkNTU01vZGVsLlBzZXVkb1N0YXRlTWFya2VyKXx8W107aWYoZW5hYmxlKXtpZihwc2V1ZG9DbGFzc2VzLmluZGV4T2YocHNldWRvQ2xhc3MpPj0wKQpyZXR1cm4gZmFsc2U7cHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtub2RlLnNldE1hcmtlcihTREsuQ1NTTW9kZWwuUHNldWRvU3RhdGVNYXJrZXIscHNldWRvQ2xhc3Nlcyk7fWVsc2V7aWYocHNldWRvQ2xhc3Nlcy5pbmRleE9mKHBzZXVkb0NsYXNzKTwwKQpyZXR1cm4gZmFsc2U7cHNldWRvQ2xhc3Nlcy5yZW1vdmUocHNldWRvQ2xhc3MpO2lmKHBzZXVkb0NsYXNzZXMubGVuZ3RoKQpub2RlLnNldE1hcmtlcihTREsuQ1NTTW9kZWwuUHNldWRvU3RhdGVNYXJrZXIscHNldWRvQ2xhc3Nlcyk7ZWxzZQpub2RlLnNldE1hcmtlcihTREsuQ1NTTW9kZWwuUHNldWRvU3RhdGVNYXJrZXIsbnVsbCk7fQp0aGlzLl9hZ2VudC5mb3JjZVBzZXVkb1N0YXRlKG5vZGUuaWQscHNldWRvQ2xhc3Nlcyk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkNTU01vZGVsLkV2ZW50cy5Qc2V1ZG9TdGF0ZUZvcmNlZCx7bm9kZTpub2RlLHBzZXVkb0NsYXNzOnBzZXVkb0NsYXNzLGVuYWJsZTplbmFibGV9KTtyZXR1cm4gdHJ1ZTt9CnBzZXVkb1N0YXRlKG5vZGUpe3JldHVybiBub2RlLm1hcmtlcihTREsuQ1NTTW9kZWwuUHNldWRvU3RhdGVNYXJrZXIpfHxbXTt9CmFzeW5jIHNldE1lZGlhVGV4dChzdHlsZVNoZWV0SWQscmFuZ2UsbmV3TWVkaWFUZXh0KXtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlN0eWxlUnVsZUVkaXRlZCk7dHJ5e2F3YWl0IHRoaXMuX2Vuc3VyZU9yaWdpbmFsU3R5bGVTaGVldFRleHQoc3R5bGVTaGVldElkKTtjb25zdCBtZWRpYVBheWxvYWQ9YXdhaXQgdGhpcy5fYWdlbnQuc2V0TWVkaWFUZXh0KHN0eWxlU2hlZXRJZCxyYW5nZSxuZXdNZWRpYVRleHQpO2lmKCFtZWRpYVBheWxvYWQpCnJldHVybiBmYWxzZTt0aGlzLl9kb21Nb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpO2NvbnN0IGVkaXQ9bmV3IFNESy5DU1NNb2RlbC5FZGl0KHN0eWxlU2hlZXRJZCxyYW5nZSxuZXdNZWRpYVRleHQsbWVkaWFQYXlsb2FkKTt0aGlzLl9maXJlU3R5bGVTaGVldENoYW5nZWQoc3R5bGVTaGVldElkLGVkaXQpO3JldHVybiB0cnVlO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fX0KYXN5bmMgYWRkUnVsZShzdHlsZVNoZWV0SWQscnVsZVRleHQscnVsZUxvY2F0aW9uKXt0cnl7YXdhaXQgdGhpcy5fZW5zdXJlT3JpZ2luYWxTdHlsZVNoZWV0VGV4dChzdHlsZVNoZWV0SWQpO2NvbnN0IHJ1bGVQYXlsb2FkPWF3YWl0IHRoaXMuX2FnZW50LmFkZFJ1bGUoc3R5bGVTaGVldElkLHJ1bGVUZXh0LHJ1bGVMb2NhdGlvbik7aWYoIXJ1bGVQYXlsb2FkKQpyZXR1cm4gbnVsbDt0aGlzLl9kb21Nb2RlbC5tYXJrVW5kb2FibGVTdGF0ZSgpO2NvbnN0IGVkaXQ9bmV3IFNESy5DU1NNb2RlbC5FZGl0KHN0eWxlU2hlZXRJZCxydWxlTG9jYXRpb24scnVsZVRleHQscnVsZVBheWxvYWQpO3RoaXMuX2ZpcmVTdHlsZVNoZWV0Q2hhbmdlZChzdHlsZVNoZWV0SWQsZWRpdCk7cmV0dXJuIG5ldyBTREsuQ1NTU3R5bGVSdWxlKHRoaXMscnVsZVBheWxvYWQpO31jYXRjaChlKXtyZXR1cm4gbnVsbDt9fQphc3luYyByZXF1ZXN0VmlhSW5zcGVjdG9yU3R5bGVzaGVldChub2RlKXtjb25zdCBmcmFtZUlkPW5vZGUuZnJhbWVJZCgpfHwodGhpcy5fcmVzb3VyY2VUcmVlTW9kZWw/dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwubWFpbkZyYW1lLmlkOicnKTtjb25zdCBoZWFkZXJzPXRoaXMuX3N0eWxlU2hlZXRJZFRvSGVhZGVyLnZhbHVlc0FycmF5KCk7Y29uc3Qgc3R5bGVTaGVldEhlYWRlcj1oZWFkZXJzLmZpbmQoaGVhZGVyPT5oZWFkZXIuZnJhbWVJZD09PWZyYW1lSWQmJmhlYWRlci5pc1ZpYUluc3BlY3RvcigpKTtpZihzdHlsZVNoZWV0SGVhZGVyKQpyZXR1cm4gc3R5bGVTaGVldEhlYWRlcjt0cnl7Y29uc3Qgc3R5bGVTaGVldElkPWF3YWl0IHRoaXMuX2FnZW50LmNyZWF0ZVN0eWxlU2hlZXQoZnJhbWVJZCk7cmV0dXJuIHN0eWxlU2hlZXRJZCYmdGhpcy5fc3R5bGVTaGVldElkVG9IZWFkZXIuZ2V0KHN0eWxlU2hlZXRJZCl8fG51bGw7fWNhdGNoKGUpe3JldHVybiBudWxsO319Cm1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkKCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkNTU01vZGVsLkV2ZW50cy5NZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCk7fQpmb250c1VwZGF0ZWQoKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuQ1NTTW9kZWwuRXZlbnRzLkZvbnRzVXBkYXRlZCk7fQpzdHlsZVNoZWV0SGVhZGVyRm9ySWQoaWQpe3JldHVybiB0aGlzLl9zdHlsZVNoZWV0SWRUb0hlYWRlci5nZXQoaWQpfHxudWxsO30Kc3R5bGVTaGVldEhlYWRlcnMoKXtyZXR1cm4gdGhpcy5fc3R5bGVTaGVldElkVG9IZWFkZXIudmFsdWVzQXJyYXkoKTt9Cl9maXJlU3R5bGVTaGVldENoYW5nZWQoc3R5bGVTaGVldElkLGVkaXQpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5DU1NNb2RlbC5FdmVudHMuU3R5bGVTaGVldENoYW5nZWQse3N0eWxlU2hlZXRJZDpzdHlsZVNoZWV0SWQsZWRpdDplZGl0fSk7fQpfZW5zdXJlT3JpZ2luYWxTdHlsZVNoZWV0VGV4dChzdHlsZVNoZWV0SWQpe2NvbnN0IGhlYWRlcj10aGlzLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChzdHlsZVNoZWV0SWQpO2lmKCFoZWFkZXIpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtsZXQgcHJvbWlzZT10aGlzLl9vcmlnaW5hbFN0eWxlU2hlZXRUZXh0LmdldChoZWFkZXIpO2lmKCFwcm9taXNlKXtwcm9taXNlPXRoaXMuZ2V0U3R5bGVTaGVldFRleHQoaGVhZGVyLmlkKTt0aGlzLl9vcmlnaW5hbFN0eWxlU2hlZXRUZXh0LnNldChoZWFkZXIscHJvbWlzZSk7dGhpcy5fb3JpZ2luYWxDb250ZW50UmVxdWVzdGVkRm9yVGVzdChoZWFkZXIpO30KcmV0dXJuIHByb21pc2U7fQpfb3JpZ2luYWxDb250ZW50UmVxdWVzdGVkRm9yVGVzdChoZWFkZXIpe30Kb3JpZ2luYWxTdHlsZVNoZWV0VGV4dChoZWFkZXIpe3JldHVybiB0aGlzLl9lbnN1cmVPcmlnaW5hbFN0eWxlU2hlZXRUZXh0KGhlYWRlci5pZCk7fQpfc3R5bGVTaGVldEFkZGVkKGhlYWRlcil7Y29uc29sZS5hc3NlcnQoIXRoaXMuX3N0eWxlU2hlZXRJZFRvSGVhZGVyLmdldChoZWFkZXIuc3R5bGVTaGVldElkKSk7Y29uc3Qgc3R5bGVTaGVldEhlYWRlcj1uZXcgU0RLLkNTU1N0eWxlU2hlZXRIZWFkZXIodGhpcyxoZWFkZXIpO3RoaXMuX3N0eWxlU2hlZXRJZFRvSGVhZGVyLnNldChoZWFkZXIuc3R5bGVTaGVldElkLHN0eWxlU2hlZXRIZWFkZXIpO2NvbnN0IHVybD1zdHlsZVNoZWV0SGVhZGVyLnJlc291cmNlVVJMKCk7aWYoIXRoaXMuX3N0eWxlU2hlZXRJZHNGb3JVUkwuZ2V0KHVybCkpCnRoaXMuX3N0eWxlU2hlZXRJZHNGb3JVUkwuc2V0KHVybCx7fSk7Y29uc3QgZnJhbWVJZFRvU3R5bGVTaGVldElkcz10aGlzLl9zdHlsZVNoZWV0SWRzRm9yVVJMLmdldCh1cmwpO2xldCBzdHlsZVNoZWV0SWRzPWZyYW1lSWRUb1N0eWxlU2hlZXRJZHNbc3R5bGVTaGVldEhlYWRlci5mcmFtZUlkXTtpZighc3R5bGVTaGVldElkcyl7c3R5bGVTaGVldElkcz1bXTtmcmFtZUlkVG9TdHlsZVNoZWV0SWRzW3N0eWxlU2hlZXRIZWFkZXIuZnJhbWVJZF09c3R5bGVTaGVldElkczt9CnN0eWxlU2hlZXRJZHMucHVzaChzdHlsZVNoZWV0SGVhZGVyLmlkKTt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmF0dGFjaFNvdXJjZU1hcChzdHlsZVNoZWV0SGVhZGVyLHN0eWxlU2hlZXRIZWFkZXIuc291cmNlVVJMLHN0eWxlU2hlZXRIZWFkZXIuc291cmNlTWFwVVJMKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRBZGRlZCxzdHlsZVNoZWV0SGVhZGVyKTt9Cl9zdHlsZVNoZWV0UmVtb3ZlZChpZCl7Y29uc3QgaGVhZGVyPXRoaXMuX3N0eWxlU2hlZXRJZFRvSGVhZGVyLmdldChpZCk7Y29uc29sZS5hc3NlcnQoaGVhZGVyKTtpZighaGVhZGVyKQpyZXR1cm47dGhpcy5fc3R5bGVTaGVldElkVG9IZWFkZXIucmVtb3ZlKGlkKTtjb25zdCB1cmw9aGVhZGVyLnJlc291cmNlVVJMKCk7Y29uc3QgZnJhbWVJZFRvU3R5bGVTaGVldElkcz0odGhpcy5fc3R5bGVTaGVldElkc0ZvclVSTC5nZXQodXJsKSk7Y29uc29sZS5hc3NlcnQoZnJhbWVJZFRvU3R5bGVTaGVldElkcywnTm8gZnJhbWVJZCB0byBzdHlsZVNoZWV0SWQgbWFwIGlzIGF2YWlsYWJsZSBmb3IgZ2l2ZW4gc3R5bGUgc2hlZXQgVVJMLicpO2ZyYW1lSWRUb1N0eWxlU2hlZXRJZHNbaGVhZGVyLmZyYW1lSWRdLnJlbW92ZShpZCk7aWYoIWZyYW1lSWRUb1N0eWxlU2hlZXRJZHNbaGVhZGVyLmZyYW1lSWRdLmxlbmd0aCl7ZGVsZXRlIGZyYW1lSWRUb1N0eWxlU2hlZXRJZHNbaGVhZGVyLmZyYW1lSWRdO2lmKCFPYmplY3Qua2V5cyhmcmFtZUlkVG9TdHlsZVNoZWV0SWRzKS5sZW5ndGgpCnRoaXMuX3N0eWxlU2hlZXRJZHNGb3JVUkwucmVtb3ZlKHVybCk7fQp0aGlzLl9vcmlnaW5hbFN0eWxlU2hlZXRUZXh0LnJlbW92ZShoZWFkZXIpO3RoaXMuX3NvdXJjZU1hcE1hbmFnZXIuZGV0YWNoU291cmNlTWFwKGhlYWRlcik7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0UmVtb3ZlZCxoZWFkZXIpO30Kc3R5bGVTaGVldElkc0ZvclVSTCh1cmwpe2NvbnN0IGZyYW1lSWRUb1N0eWxlU2hlZXRJZHM9dGhpcy5fc3R5bGVTaGVldElkc0ZvclVSTC5nZXQodXJsKTtpZighZnJhbWVJZFRvU3R5bGVTaGVldElkcykKcmV0dXJuW107bGV0IHJlc3VsdD1bXTtmb3IoY29uc3QgZnJhbWVJZCBpbiBmcmFtZUlkVG9TdHlsZVNoZWV0SWRzKQpyZXN1bHQ9cmVzdWx0LmNvbmNhdChmcmFtZUlkVG9TdHlsZVNoZWV0SWRzW2ZyYW1lSWRdKTtyZXR1cm4gcmVzdWx0O30KYXN5bmMgc2V0U3R5bGVTaGVldFRleHQoc3R5bGVTaGVldElkLG5ld1RleHQsbWFqb3JDaGFuZ2Upe2NvbnN0IGhlYWRlcj0odGhpcy5fc3R5bGVTaGVldElkVG9IZWFkZXIuZ2V0KHN0eWxlU2hlZXRJZCkpO2NvbnNvbGUuYXNzZXJ0KGhlYWRlcik7bmV3VGV4dD1TREsuQ1NTTW9kZWwudHJpbVNvdXJjZVVSTChuZXdUZXh0KTtpZihoZWFkZXIuaGFzU291cmNlVVJMKQpuZXdUZXh0Kz0nXG4vKiMgc291cmNlVVJMPScraGVhZGVyLnNvdXJjZVVSTCsnICovJzthd2FpdCB0aGlzLl9lbnN1cmVPcmlnaW5hbFN0eWxlU2hlZXRUZXh0KHN0eWxlU2hlZXRJZCk7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX3NldFN0eWxlU2hlZXRUZXh0KHtzdHlsZVNoZWV0SWQ6aGVhZGVyLmlkLHRleHQ6bmV3VGV4dH0pO2NvbnN0IHNvdXJjZU1hcFVSTD1yZXNwb25zZS5zb3VyY2VNYXBVUkw7dGhpcy5fc291cmNlTWFwTWFuYWdlci5kZXRhY2hTb3VyY2VNYXAoaGVhZGVyKTtoZWFkZXIuc2V0U291cmNlTWFwVVJMKHNvdXJjZU1hcFVSTCk7dGhpcy5fc291cmNlTWFwTWFuYWdlci5hdHRhY2hTb3VyY2VNYXAoaGVhZGVyLGhlYWRlci5zb3VyY2VVUkwsaGVhZGVyLnNvdXJjZU1hcFVSTCk7aWYoc291cmNlTWFwVVJMPT09bnVsbCkKcmV0dXJuJ0Vycm9yIGluIENTUy5zZXRTdHlsZVNoZWV0VGV4dCc7dGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoIW1ham9yQ2hhbmdlKTt0aGlzLl9maXJlU3R5bGVTaGVldENoYW5nZWQoc3R5bGVTaGVldElkKTtyZXR1cm4gbnVsbDt9CmFzeW5jIGdldFN0eWxlU2hlZXRUZXh0KHN0eWxlU2hlZXRJZCl7dHJ5e2NvbnN0IHRleHQ9YXdhaXQgdGhpcy5fYWdlbnQuZ2V0U3R5bGVTaGVldFRleHQoc3R5bGVTaGVldElkKTtyZXR1cm4gdGV4dCYmU0RLLkNTU01vZGVsLnRyaW1Tb3VyY2VVUkwodGV4dCk7fWNhdGNoKGUpe3JldHVybiBudWxsO319Cl9yZXNldFN0eWxlU2hlZXRzKCl7Y29uc3QgaGVhZGVycz10aGlzLl9zdHlsZVNoZWV0SWRUb0hlYWRlci52YWx1ZXNBcnJheSgpO3RoaXMuX3N0eWxlU2hlZXRJZHNGb3JVUkwuY2xlYXIoKTt0aGlzLl9zdHlsZVNoZWV0SWRUb0hlYWRlci5jbGVhcigpO2ZvcihsZXQgaT0wO2k8aGVhZGVycy5sZW5ndGg7KytpKXt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmRldGFjaFNvdXJjZU1hcChoZWFkZXJzW2ldKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRSZW1vdmVkLGhlYWRlcnNbaV0pO319CnN1c3BlbmRNb2RlbCgpe3RoaXMuX2lzRW5hYmxlZD1mYWxzZTtyZXR1cm4gdGhpcy5fYWdlbnQuZGlzYWJsZSgpLnRoZW4odGhpcy5fcmVzZXRTdHlsZVNoZWV0cy5iaW5kKHRoaXMpKTt9CmFzeW5jIHJlc3VtZU1vZGVsKCl7cmV0dXJuIHRoaXMuX2VuYWJsZSgpO30Kc2V0RWZmZWN0aXZlUHJvcGVydHlWYWx1ZUZvck5vZGUobm9kZUlkLG5hbWUsdmFsdWUpe3RoaXMuX2FnZW50LnNldEVmZmVjdGl2ZVByb3BlcnR5VmFsdWVGb3JOb2RlKG5vZGVJZCxuYW1lLHZhbHVlKTt9CmNhY2hlZE1hdGNoZWRDYXNjYWRlRm9yTm9kZShub2RlKXtpZih0aGlzLl9jYWNoZWRNYXRjaGVkQ2FzY2FkZU5vZGUhPT1ub2RlKQp0aGlzLmRpc2NhcmRDYWNoZWRNYXRjaGVkQ2FzY2FkZSgpO3RoaXMuX2NhY2hlZE1hdGNoZWRDYXNjYWRlTm9kZT1ub2RlO2lmKCF0aGlzLl9jYWNoZWRNYXRjaGVkQ2FzY2FkZVByb21pc2UpCnRoaXMuX2NhY2hlZE1hdGNoZWRDYXNjYWRlUHJvbWlzZT10aGlzLm1hdGNoZWRTdHlsZXNQcm9taXNlKG5vZGUuaWQpO3JldHVybiB0aGlzLl9jYWNoZWRNYXRjaGVkQ2FzY2FkZVByb21pc2U7fQpkaXNjYXJkQ2FjaGVkTWF0Y2hlZENhc2NhZGUoKXtkZWxldGUgdGhpcy5fY2FjaGVkTWF0Y2hlZENhc2NhZGVOb2RlO2RlbGV0ZSB0aGlzLl9jYWNoZWRNYXRjaGVkQ2FzY2FkZVByb21pc2U7fQpkaXNwb3NlKCl7c3VwZXIuZGlzcG9zZSgpO3RoaXMuX3NvdXJjZU1hcE1hbmFnZXIuZGlzcG9zZSgpO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuQ1NTTW9kZWwsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkRPTSx0cnVlKTtTREsuQ1NTTW9kZWwuUnVsZVVzYWdlO1NESy5DU1NNb2RlbC5Db250cmFzdEluZm87U0RLLkNTU01vZGVsLkV2ZW50cz17Rm9udHNVcGRhdGVkOlN5bWJvbCgnRm9udHNVcGRhdGVkJyksTWVkaWFRdWVyeVJlc3VsdENoYW5nZWQ6U3ltYm9sKCdNZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCcpLE1vZGVsV2FzRW5hYmxlZDpTeW1ib2woJ01vZGVsV2FzRW5hYmxlZCcpLFBzZXVkb1N0YXRlRm9yY2VkOlN5bWJvbCgnUHNldWRvU3RhdGVGb3JjZWQnKSxTdHlsZVNoZWV0QWRkZWQ6U3ltYm9sKCdTdHlsZVNoZWV0QWRkZWQnKSxTdHlsZVNoZWV0Q2hhbmdlZDpTeW1ib2woJ1N0eWxlU2hlZXRDaGFuZ2VkJyksU3R5bGVTaGVldFJlbW92ZWQ6U3ltYm9sKCdTdHlsZVNoZWV0UmVtb3ZlZCcpfTtTREsuQ1NTTW9kZWwuTWVkaWFUeXBlcz1bJ2FsbCcsJ2JyYWlsbGUnLCdlbWJvc3NlZCcsJ2hhbmRoZWxkJywncHJpbnQnLCdwcm9qZWN0aW9uJywnc2NyZWVuJywnc3BlZWNoJywndHR5JywndHYnXTtTREsuQ1NTTW9kZWwuUHNldWRvU3RhdGVNYXJrZXI9J3BzZXVkby1zdGF0ZS1tYXJrZXInO1NESy5DU1NNb2RlbC5FZGl0PWNsYXNze2NvbnN0cnVjdG9yKHN0eWxlU2hlZXRJZCxvbGRSYW5nZSxuZXdUZXh0LHBheWxvYWQpe3RoaXMuc3R5bGVTaGVldElkPXN0eWxlU2hlZXRJZDt0aGlzLm9sZFJhbmdlPW9sZFJhbmdlO3RoaXMubmV3UmFuZ2U9VGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tRWRpdChvbGRSYW5nZSxuZXdUZXh0KTt0aGlzLm5ld1RleHQ9bmV3VGV4dDt0aGlzLnBheWxvYWQ9cGF5bG9hZDt9fTtTREsuQ1NTTG9jYXRpb249Y2xhc3N7Y29uc3RydWN0b3IoaGVhZGVyLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt0aGlzLl9jc3NNb2RlbD1oZWFkZXIuY3NzTW9kZWwoKTt0aGlzLnN0eWxlU2hlZXRJZD1oZWFkZXIuaWQ7dGhpcy51cmw9aGVhZGVyLnJlc291cmNlVVJMKCk7dGhpcy5saW5lTnVtYmVyPWxpbmVOdW1iZXI7dGhpcy5jb2x1bW5OdW1iZXI9Y29sdW1uTnVtYmVyfHwwO30KY3NzTW9kZWwoKXtyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fQpoZWFkZXIoKXtyZXR1cm4gdGhpcy5fY3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuc3R5bGVTaGVldElkKTt9fTtTREsuQ1NTRGlzcGF0Y2hlcj1jbGFzc3tjb25zdHJ1Y3Rvcihjc3NNb2RlbCl7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7fQptZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCgpe3RoaXMuX2Nzc01vZGVsLm1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkKCk7fQpmb250c1VwZGF0ZWQoKXt0aGlzLl9jc3NNb2RlbC5mb250c1VwZGF0ZWQoKTt9CnN0eWxlU2hlZXRDaGFuZ2VkKHN0eWxlU2hlZXRJZCl7dGhpcy5fY3NzTW9kZWwuX2ZpcmVTdHlsZVNoZWV0Q2hhbmdlZChzdHlsZVNoZWV0SWQpO30Kc3R5bGVTaGVldEFkZGVkKGhlYWRlcil7dGhpcy5fY3NzTW9kZWwuX3N0eWxlU2hlZXRBZGRlZChoZWFkZXIpO30Kc3R5bGVTaGVldFJlbW92ZWQoaWQpe3RoaXMuX2Nzc01vZGVsLl9zdHlsZVNoZWV0UmVtb3ZlZChpZCk7fX07U0RLLkNTU01vZGVsLkNvbXB1dGVkU3R5bGVMb2FkZXI9Y2xhc3N7Y29uc3RydWN0b3IoY3NzTW9kZWwpe3RoaXMuX2Nzc01vZGVsPWNzc01vZGVsO3RoaXMuX25vZGVJZFRvUHJvbWlzZT1uZXcgTWFwKCk7fQpjb21wdXRlZFN0eWxlUHJvbWlzZShub2RlSWQpe2xldCBwcm9taXNlPXRoaXMuX25vZGVJZFRvUHJvbWlzZS5nZXQobm9kZUlkKTtpZihwcm9taXNlKQpyZXR1cm4gcHJvbWlzZTtwcm9taXNlPXRoaXMuX2Nzc01vZGVsLl9hZ2VudC5nZXRDb21wdXRlZFN0eWxlRm9yTm9kZShub2RlSWQpLnRoZW4ocGFyc2VQYXlsb2FkLmJpbmQodGhpcykpO3RoaXMuX25vZGVJZFRvUHJvbWlzZS5zZXQobm9kZUlkLHByb21pc2UpO3JldHVybiBwcm9taXNlO2Z1bmN0aW9uIHBhcnNlUGF5bG9hZChjb21wdXRlZFBheWxvYWQpe3RoaXMuX25vZGVJZFRvUHJvbWlzZS5kZWxldGUobm9kZUlkKTtpZighY29tcHV0ZWRQYXlsb2FkfHwhY29tcHV0ZWRQYXlsb2FkLmxlbmd0aCkKcmV0dXJuIG51bGw7Y29uc3QgcmVzdWx0PW5ldyBNYXAoKTtmb3IoY29uc3QgcHJvcGVydHkgb2YgY29tcHV0ZWRQYXlsb2FkKQpyZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUscHJvcGVydHkudmFsdWUpO3JldHVybiByZXN1bHQ7fX19O1NESy5DU1NNb2RlbC5JbmxpbmVTdHlsZVJlc3VsdD1jbGFzc3tjb25zdHJ1Y3RvcihpbmxpbmVTdHlsZSxhdHRyaWJ1dGVzU3R5bGUpe3RoaXMuaW5saW5lU3R5bGU9aW5saW5lU3R5bGU7dGhpcy5hdHRyaWJ1dGVzU3R5bGU9YXR0cmlidXRlc1N0eWxlO319OztTREsuQ1NTUHJvcGVydHk9Y2xhc3N7Y29uc3RydWN0b3Iob3duZXJTdHlsZSxpbmRleCxuYW1lLHZhbHVlLGltcG9ydGFudCxkaXNhYmxlZCxwYXJzZWRPayxpbXBsaWNpdCx0ZXh0LHJhbmdlKXt0aGlzLm93bmVyU3R5bGU9b3duZXJTdHlsZTt0aGlzLmluZGV4PWluZGV4O3RoaXMubmFtZT1uYW1lO3RoaXMudmFsdWU9dmFsdWU7dGhpcy5pbXBvcnRhbnQ9aW1wb3J0YW50O3RoaXMuZGlzYWJsZWQ9ZGlzYWJsZWQ7dGhpcy5wYXJzZWRPaz1wYXJzZWRPazt0aGlzLmltcGxpY2l0PWltcGxpY2l0O3RoaXMudGV4dD10ZXh0O3RoaXMucmFuZ2U9cmFuZ2U/VGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tT2JqZWN0KHJhbmdlKTpudWxsO3RoaXMuX2FjdGl2ZT10cnVlO3RoaXMuX25hbWVSYW5nZT1udWxsO3RoaXMuX3ZhbHVlUmFuZ2U9bnVsbDt9CnN0YXRpYyBwYXJzZVBheWxvYWQob3duZXJTdHlsZSxpbmRleCxwYXlsb2FkKXtjb25zdCByZXN1bHQ9bmV3IFNESy5DU1NQcm9wZXJ0eShvd25lclN0eWxlLGluZGV4LHBheWxvYWQubmFtZSxwYXlsb2FkLnZhbHVlLHBheWxvYWQuaW1wb3J0YW50fHxmYWxzZSxwYXlsb2FkLmRpc2FibGVkfHxmYWxzZSwoJ3BhcnNlZE9rJ2luIHBheWxvYWQpPyEhcGF5bG9hZC5wYXJzZWRPazp0cnVlLCEhcGF5bG9hZC5pbXBsaWNpdCxwYXlsb2FkLnRleHQscGF5bG9hZC5yYW5nZSk7cmV0dXJuIHJlc3VsdDt9Cl9lbnN1cmVSYW5nZXMoKXtpZih0aGlzLl9uYW1lUmFuZ2UmJnRoaXMuX3ZhbHVlUmFuZ2UpCnJldHVybjtjb25zdCByYW5nZT10aGlzLnJhbmdlO2NvbnN0IHRleHQ9dGhpcy50ZXh0P25ldyBUZXh0VXRpbHMuVGV4dCh0aGlzLnRleHQpOm51bGw7aWYoIXJhbmdlfHwhdGV4dCkKcmV0dXJuO2NvbnN0IG5hbWVJbmRleD10ZXh0LnZhbHVlKCkuaW5kZXhPZih0aGlzLm5hbWUpO2NvbnN0IHZhbHVlSW5kZXg9dGV4dC52YWx1ZSgpLmxhc3RJbmRleE9mKHRoaXMudmFsdWUpO2lmKG5hbWVJbmRleD09PS0xfHx2YWx1ZUluZGV4PT09LTF8fG5hbWVJbmRleD52YWx1ZUluZGV4KQpyZXR1cm47Y29uc3QgbmFtZVNvdXJjZVJhbmdlPW5ldyBUZXh0VXRpbHMuU291cmNlUmFuZ2UobmFtZUluZGV4LHRoaXMubmFtZS5sZW5ndGgpO2NvbnN0IHZhbHVlU291cmNlUmFuZ2U9bmV3IFRleHRVdGlscy5Tb3VyY2VSYW5nZSh2YWx1ZUluZGV4LHRoaXMudmFsdWUubGVuZ3RoKTt0aGlzLl9uYW1lUmFuZ2U9cmViYXNlKHRleHQudG9UZXh0UmFuZ2UobmFtZVNvdXJjZVJhbmdlKSxyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pO3RoaXMuX3ZhbHVlUmFuZ2U9cmViYXNlKHRleHQudG9UZXh0UmFuZ2UodmFsdWVTb3VyY2VSYW5nZSkscmFuZ2Uuc3RhcnRMaW5lLHJhbmdlLnN0YXJ0Q29sdW1uKTtmdW5jdGlvbiByZWJhc2Uob25lTGluZVJhbmdlLGxpbmVPZmZzZXQsY29sdW1uT2Zmc2V0KXtpZihvbmVMaW5lUmFuZ2Uuc3RhcnRMaW5lPT09MCl7b25lTGluZVJhbmdlLnN0YXJ0Q29sdW1uKz1jb2x1bW5PZmZzZXQ7b25lTGluZVJhbmdlLmVuZENvbHVtbis9Y29sdW1uT2Zmc2V0O30Kb25lTGluZVJhbmdlLnN0YXJ0TGluZSs9bGluZU9mZnNldDtvbmVMaW5lUmFuZ2UuZW5kTGluZSs9bGluZU9mZnNldDtyZXR1cm4gb25lTGluZVJhbmdlO319Cm5hbWVSYW5nZSgpe3RoaXMuX2Vuc3VyZVJhbmdlcygpO3JldHVybiB0aGlzLl9uYW1lUmFuZ2U7fQp2YWx1ZVJhbmdlKCl7dGhpcy5fZW5zdXJlUmFuZ2VzKCk7cmV0dXJuIHRoaXMuX3ZhbHVlUmFuZ2U7fQpyZWJhc2UoZWRpdCl7aWYodGhpcy5vd25lclN0eWxlLnN0eWxlU2hlZXRJZCE9PWVkaXQuc3R5bGVTaGVldElkKQpyZXR1cm47aWYodGhpcy5yYW5nZSkKdGhpcy5yYW5nZT10aGlzLnJhbmdlLnJlYmFzZUFmdGVyVGV4dEVkaXQoZWRpdC5vbGRSYW5nZSxlZGl0Lm5ld1JhbmdlKTt9CnNldEFjdGl2ZShhY3RpdmUpe3RoaXMuX2FjdGl2ZT1hY3RpdmU7fQpnZXQgcHJvcGVydHlUZXh0KCl7aWYodGhpcy50ZXh0IT09dW5kZWZpbmVkKQpyZXR1cm4gdGhpcy50ZXh0O2lmKHRoaXMubmFtZT09PScnKQpyZXR1cm4nJztyZXR1cm4gdGhpcy5uYW1lKyc6ICcrdGhpcy52YWx1ZSsodGhpcy5pbXBvcnRhbnQ/JyAhaW1wb3J0YW50JzonJykrJzsnO30KYWN0aXZlSW5TdHlsZSgpe3JldHVybiB0aGlzLl9hY3RpdmU7fQpzZXRUZXh0KHByb3BlcnR5VGV4dCxtYWpvckNoYW5nZSxvdmVyd3JpdGUpe2lmKCF0aGlzLm93bmVyU3R5bGUpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIG93bmVyU3R5bGUgZm9yIHByb3BlcnR5JykpO2lmKCF0aGlzLm93bmVyU3R5bGUuc3R5bGVTaGVldElkKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBvd25lciBzdHlsZSBpZCcpKTtpZighdGhpcy5yYW5nZXx8IXRoaXMub3duZXJTdHlsZS5yYW5nZSkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignU3R5bGUgbm90IGVkaXRhYmxlJykpO2lmKG1ham9yQ2hhbmdlKQpIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlN0eWxlUnVsZUVkaXRlZCk7aWYob3ZlcndyaXRlJiZwcm9wZXJ0eVRleHQ9PT10aGlzLnByb3BlcnR5VGV4dCl7dGhpcy5vd25lclN0eWxlLmNzc01vZGVsKCkuZG9tTW9kZWwoKS5tYXJrVW5kb2FibGVTdGF0ZSghbWFqb3JDaGFuZ2UpO3JldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7fQpjb25zdCByYW5nZT10aGlzLnJhbmdlLnJlbGF0aXZlVG8odGhpcy5vd25lclN0eWxlLnJhbmdlLnN0YXJ0TGluZSx0aGlzLm93bmVyU3R5bGUucmFuZ2Uuc3RhcnRDb2x1bW4pO2NvbnN0IGluZGVudGF0aW9uPXRoaXMub3duZXJTdHlsZS5jc3NUZXh0P3RoaXMuX2RldGVjdEluZGVudGF0aW9uKHRoaXMub3duZXJTdHlsZS5jc3NUZXh0KTpDb21tb24ubW9kdWxlU2V0dGluZygndGV4dEVkaXRvckluZGVudCcpLmdldCgpO2NvbnN0IGVuZEluZGVudGF0aW9uPXRoaXMub3duZXJTdHlsZS5jc3NUZXh0P2luZGVudGF0aW9uLnN1YnN0cmluZygwLHRoaXMub3duZXJTdHlsZS5yYW5nZS5lbmRDb2x1bW4pOicnO2NvbnN0IHRleHQ9bmV3IFRleHRVdGlscy5UZXh0KHRoaXMub3duZXJTdHlsZS5jc3NUZXh0fHwnJyk7Y29uc3QgbmV3U3R5bGVUZXh0PXRleHQucmVwbGFjZVJhbmdlKHJhbmdlLFN0cmluZy5zcHJpbnRmKCc7JXM7Jyxwcm9wZXJ0eVRleHQpKTtyZXR1cm4gc2VsZi5ydW50aW1lLmV4dGVuc2lvbihUZXh0VXRpbHMuVG9rZW5pemVyRmFjdG9yeSkuaW5zdGFuY2UoKS50aGVuKHRoaXMuX2Zvcm1hdFN0eWxlLmJpbmQodGhpcyxuZXdTdHlsZVRleHQsaW5kZW50YXRpb24sZW5kSW5kZW50YXRpb24pKS50aGVuKHNldFN0eWxlVGV4dC5iaW5kKHRoaXMpKTtmdW5jdGlvbiBzZXRTdHlsZVRleHQoc3R5bGVUZXh0KXtyZXR1cm4gdGhpcy5vd25lclN0eWxlLnNldFRleHQoc3R5bGVUZXh0LG1ham9yQ2hhbmdlKTt9fQpfZm9ybWF0U3R5bGUoc3R5bGVUZXh0LGluZGVudGF0aW9uLGVuZEluZGVudGF0aW9uLHRva2VuaXplckZhY3Rvcnkpe2lmKGluZGVudGF0aW9uKQppbmRlbnRhdGlvbj0nXG4nK2luZGVudGF0aW9uO2xldCByZXN1bHQ9Jyc7bGV0IHByb3BlcnR5VGV4dDtsZXQgaW5zaWRlUHJvcGVydHk9ZmFsc2U7Y29uc3QgdG9rZW5pemU9dG9rZW5pemVyRmFjdG9yeS5jcmVhdGVUb2tlbml6ZXIoJ3RleHQvY3NzJyk7dG9rZW5pemUoJyp7JytzdHlsZVRleHQrJ30nLHByb2Nlc3NUb2tlbik7aWYoaW5zaWRlUHJvcGVydHkpCnJlc3VsdCs9cHJvcGVydHlUZXh0O3Jlc3VsdD1yZXN1bHQuc3Vic3RyaW5nKDIscmVzdWx0Lmxlbmd0aC0xKS50cmltUmlnaHQoKTtyZXR1cm4gcmVzdWx0KyhpbmRlbnRhdGlvbj8nXG4nK2VuZEluZGVudGF0aW9uOicnKTtmdW5jdGlvbiBwcm9jZXNzVG9rZW4odG9rZW4sdG9rZW5UeXBlLGNvbHVtbixuZXdDb2x1bW4pe2lmKCFpbnNpZGVQcm9wZXJ0eSl7Y29uc3QgZGlzYWJsZWRQcm9wZXJ0eT10b2tlblR5cGUmJnRva2VuVHlwZS5pbmNsdWRlcygnY3NzLWNvbW1lbnQnKSYmaXNEaXNhYmxlZFByb3BlcnR5KHRva2VuKTtjb25zdCBpc1Byb3BlcnR5U3RhcnQ9dG9rZW5UeXBlJiYodG9rZW5UeXBlLmluY2x1ZGVzKCdjc3Mtc3RyaW5nJyl8fHRva2VuVHlwZS5pbmNsdWRlcygnY3NzLW1ldGEnKXx8dG9rZW5UeXBlLmluY2x1ZGVzKCdjc3MtcHJvcGVydHknKXx8dG9rZW5UeXBlLmluY2x1ZGVzKCdjc3MtdmFyaWFibGUtMicpKTtpZihkaXNhYmxlZFByb3BlcnR5KXtyZXN1bHQ9cmVzdWx0LnRyaW1SaWdodCgpK2luZGVudGF0aW9uK3Rva2VuO31lbHNlIGlmKGlzUHJvcGVydHlTdGFydCl7aW5zaWRlUHJvcGVydHk9dHJ1ZTtwcm9wZXJ0eVRleHQ9dG9rZW47fWVsc2UgaWYodG9rZW4hPT0nOycpe3Jlc3VsdCs9dG9rZW47fQpyZXR1cm47fQppZih0b2tlbj09PSd9J3x8dG9rZW49PT0nOycpe3Jlc3VsdD1yZXN1bHQudHJpbVJpZ2h0KCkraW5kZW50YXRpb24rcHJvcGVydHlUZXh0LnRyaW0oKSsnOyc7aW5zaWRlUHJvcGVydHk9ZmFsc2U7aWYodG9rZW49PT0nfScpCnJlc3VsdCs9J30nO31lbHNle3Byb3BlcnR5VGV4dCs9dG9rZW47fX0KZnVuY3Rpb24gaXNEaXNhYmxlZFByb3BlcnR5KHRleHQpe2NvbnN0IGNvbG9uPXRleHQuaW5kZXhPZignOicpO2lmKGNvbG9uPT09LTEpCnJldHVybiBmYWxzZTtjb25zdCBwcm9wZXJ0eU5hbWU9dGV4dC5zdWJzdHJpbmcoMixjb2xvbikudHJpbSgpO3JldHVybiBTREsuY3NzTWV0YWRhdGEoKS5pc0NTU1Byb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO319Cl9kZXRlY3RJbmRlbnRhdGlvbih0ZXh0KXtjb25zdCBsaW5lcz10ZXh0LnNwbGl0KCdcbicpO2lmKGxpbmVzLmxlbmd0aDwyKQpyZXR1cm4nJztyZXR1cm4gVGV4dFV0aWxzLlRleHRVdGlscy5saW5lSW5kZW50KGxpbmVzWzFdKTt9CnNldFZhbHVlKG5ld1ZhbHVlLG1ham9yQ2hhbmdlLG92ZXJ3cml0ZSx1c2VyQ2FsbGJhY2spe2NvbnN0IHRleHQ9dGhpcy5uYW1lKyc6ICcrbmV3VmFsdWUrKHRoaXMuaW1wb3J0YW50PycgIWltcG9ydGFudCc6JycpKyc7Jzt0aGlzLnNldFRleHQodGV4dCxtYWpvckNoYW5nZSxvdmVyd3JpdGUpLnRoZW4odXNlckNhbGxiYWNrKTt9CnNldERpc2FibGVkKGRpc2FibGVkKXtpZighdGhpcy5vd25lclN0eWxlKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtpZihkaXNhYmxlZD09PXRoaXMuZGlzYWJsZWQpCnJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7Y29uc3QgcHJvcGVydHlUZXh0PXRoaXMudGV4dC50cmltKCk7Y29uc3QgdGV4dD1kaXNhYmxlZD8nLyogJytwcm9wZXJ0eVRleHQrJyAqLyc6dGhpcy50ZXh0LnN1YnN0cmluZygyLHByb3BlcnR5VGV4dC5sZW5ndGgtMikudHJpbSgpO3JldHVybiB0aGlzLnNldFRleHQodGV4dCx0cnVlLHRydWUpO319OztTREsuQ1NTVmFsdWU9Y2xhc3N7Y29uc3RydWN0b3IocGF5bG9hZCl7dGhpcy50ZXh0PXBheWxvYWQudGV4dDtpZihwYXlsb2FkLnJhbmdlKQp0aGlzLnJhbmdlPVRleHRVdGlscy5UZXh0UmFuZ2UuZnJvbU9iamVjdChwYXlsb2FkLnJhbmdlKTt9CnJlYmFzZShlZGl0KXtpZighdGhpcy5yYW5nZSkKcmV0dXJuO3RoaXMucmFuZ2U9dGhpcy5yYW5nZS5yZWJhc2VBZnRlclRleHRFZGl0KGVkaXQub2xkUmFuZ2UsZWRpdC5uZXdSYW5nZSk7fX07U0RLLkNTU1J1bGU9Y2xhc3N7Y29uc3RydWN0b3IoY3NzTW9kZWwscGF5bG9hZCl7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5zdHlsZVNoZWV0SWQ9cGF5bG9hZC5zdHlsZVNoZWV0SWQ7aWYodGhpcy5zdHlsZVNoZWV0SWQpe2NvbnN0IHN0eWxlU2hlZXRIZWFkZXI9Y3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuc3R5bGVTaGVldElkKTt0aGlzLnNvdXJjZVVSTD1zdHlsZVNoZWV0SGVhZGVyLnNvdXJjZVVSTDt9CnRoaXMub3JpZ2luPXBheWxvYWQub3JpZ2luO3RoaXMuc3R5bGU9bmV3IFNESy5DU1NTdHlsZURlY2xhcmF0aW9uKHRoaXMuX2Nzc01vZGVsLHRoaXMscGF5bG9hZC5zdHlsZSxTREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLlJlZ3VsYXIpO30KcmViYXNlKGVkaXQpe2lmKHRoaXMuc3R5bGVTaGVldElkIT09ZWRpdC5zdHlsZVNoZWV0SWQpCnJldHVybjt0aGlzLnN0eWxlLnJlYmFzZShlZGl0KTt9CnJlc291cmNlVVJMKCl7aWYoIXRoaXMuc3R5bGVTaGVldElkKQpyZXR1cm4nJztjb25zdCBzdHlsZVNoZWV0SGVhZGVyPXRoaXMuX2Nzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZCh0aGlzLnN0eWxlU2hlZXRJZCk7cmV0dXJuIHN0eWxlU2hlZXRIZWFkZXIucmVzb3VyY2VVUkwoKTt9CmlzVXNlckFnZW50KCl7cmV0dXJuIHRoaXMub3JpZ2luPT09UHJvdG9jb2wuQ1NTLlN0eWxlU2hlZXRPcmlnaW4uVXNlckFnZW50O30KaXNJbmplY3RlZCgpe3JldHVybiB0aGlzLm9yaWdpbj09PVByb3RvY29sLkNTUy5TdHlsZVNoZWV0T3JpZ2luLkluamVjdGVkO30KaXNWaWFJbnNwZWN0b3IoKXtyZXR1cm4gdGhpcy5vcmlnaW49PT1Qcm90b2NvbC5DU1MuU3R5bGVTaGVldE9yaWdpbi5JbnNwZWN0b3I7fQppc1JlZ3VsYXIoKXtyZXR1cm4gdGhpcy5vcmlnaW49PT1Qcm90b2NvbC5DU1MuU3R5bGVTaGVldE9yaWdpbi5SZWd1bGFyO30KY3NzTW9kZWwoKXtyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fX07U0RLLkNTU1N0eWxlUnVsZT1jbGFzcyBleHRlbmRzIFNESy5DU1NSdWxle2NvbnN0cnVjdG9yKGNzc01vZGVsLHBheWxvYWQsd2FzVXNlZCl7c3VwZXIoY3NzTW9kZWwscGF5bG9hZCk7dGhpcy5fcmVpbml0aWFsaXplU2VsZWN0b3JzKHBheWxvYWQuc2VsZWN0b3JMaXN0KTt0aGlzLm1lZGlhPXBheWxvYWQubWVkaWE/U0RLLkNTU01lZGlhLnBhcnNlTWVkaWFBcnJheVBheWxvYWQoY3NzTW9kZWwscGF5bG9hZC5tZWRpYSk6W107dGhpcy53YXNVc2VkPXdhc1VzZWR8fGZhbHNlO30Kc3RhdGljIGNyZWF0ZUR1bW15UnVsZShjc3NNb2RlbCxzZWxlY3RvclRleHQpe2NvbnN0IGR1bW15UGF5bG9hZD17c2VsZWN0b3JMaXN0OntzZWxlY3RvcnM6W3t0ZXh0OnNlbGVjdG9yVGV4dH1dLH0sc3R5bGU6e3N0eWxlU2hlZXRJZDonMCcscmFuZ2U6bmV3IFRleHRVdGlscy5UZXh0UmFuZ2UoMCwwLDAsMCksc2hvcnRoYW5kRW50cmllczpbXSxjc3NQcm9wZXJ0aWVzOltdfX07cmV0dXJuIG5ldyBTREsuQ1NTU3R5bGVSdWxlKGNzc01vZGVsLChkdW1teVBheWxvYWQpKTt9Cl9yZWluaXRpYWxpemVTZWxlY3RvcnMoc2VsZWN0b3JMaXN0KXt0aGlzLnNlbGVjdG9ycz1bXTtmb3IobGV0IGk9MDtpPHNlbGVjdG9yTGlzdC5zZWxlY3RvcnMubGVuZ3RoOysraSkKdGhpcy5zZWxlY3RvcnMucHVzaChuZXcgU0RLLkNTU1ZhbHVlKHNlbGVjdG9yTGlzdC5zZWxlY3RvcnNbaV0pKTt9CnNldFNlbGVjdG9yVGV4dChuZXdTZWxlY3Rvcil7Y29uc3Qgc3R5bGVTaGVldElkPXRoaXMuc3R5bGVTaGVldElkO2lmKCFzdHlsZVNoZWV0SWQpCnRocm93J05vIHJ1bGUgc3R5bGVzaGVldCBpZCc7Y29uc3QgcmFuZ2U9dGhpcy5zZWxlY3RvclJhbmdlKCk7aWYoIXJhbmdlKQp0aHJvdydSdWxlIHNlbGVjdG9yIGlzIG5vdCBlZGl0YWJsZSc7cmV0dXJuIHRoaXMuX2Nzc01vZGVsLnNldFNlbGVjdG9yVGV4dChzdHlsZVNoZWV0SWQscmFuZ2UsbmV3U2VsZWN0b3IpO30Kc2VsZWN0b3JUZXh0KCl7cmV0dXJuIHRoaXMuc2VsZWN0b3JzLnNlbGVjdCgndGV4dCcpLmpvaW4oJywgJyk7fQpzZWxlY3RvclJhbmdlKCl7Y29uc3QgZmlyc3RSYW5nZT10aGlzLnNlbGVjdG9yc1swXS5yYW5nZTtpZighZmlyc3RSYW5nZSkKcmV0dXJuIG51bGw7Y29uc3QgbGFzdFJhbmdlPXRoaXMuc2VsZWN0b3JzLnBlZWtMYXN0KCkucmFuZ2U7cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGZpcnN0UmFuZ2Uuc3RhcnRMaW5lLGZpcnN0UmFuZ2Uuc3RhcnRDb2x1bW4sbGFzdFJhbmdlLmVuZExpbmUsbGFzdFJhbmdlLmVuZENvbHVtbik7fQpsaW5lTnVtYmVySW5Tb3VyY2Uoc2VsZWN0b3JJbmRleCl7Y29uc3Qgc2VsZWN0b3I9dGhpcy5zZWxlY3RvcnNbc2VsZWN0b3JJbmRleF07aWYoIXNlbGVjdG9yfHwhc2VsZWN0b3IucmFuZ2V8fCF0aGlzLnN0eWxlU2hlZXRJZCkKcmV0dXJuIDA7Y29uc3Qgc3R5bGVTaGVldEhlYWRlcj10aGlzLl9jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQodGhpcy5zdHlsZVNoZWV0SWQpO3JldHVybiBzdHlsZVNoZWV0SGVhZGVyLmxpbmVOdW1iZXJJblNvdXJjZShzZWxlY3Rvci5yYW5nZS5zdGFydExpbmUpO30KY29sdW1uTnVtYmVySW5Tb3VyY2Uoc2VsZWN0b3JJbmRleCl7Y29uc3Qgc2VsZWN0b3I9dGhpcy5zZWxlY3RvcnNbc2VsZWN0b3JJbmRleF07aWYoIXNlbGVjdG9yfHwhc2VsZWN0b3IucmFuZ2V8fCF0aGlzLnN0eWxlU2hlZXRJZCkKcmV0dXJuIHVuZGVmaW5lZDtjb25zdCBzdHlsZVNoZWV0SGVhZGVyPXRoaXMuX2Nzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZCh0aGlzLnN0eWxlU2hlZXRJZCk7Y29uc29sZS5hc3NlcnQoc3R5bGVTaGVldEhlYWRlcik7cmV0dXJuIHN0eWxlU2hlZXRIZWFkZXIuY29sdW1uTnVtYmVySW5Tb3VyY2Uoc2VsZWN0b3IucmFuZ2Uuc3RhcnRMaW5lLHNlbGVjdG9yLnJhbmdlLnN0YXJ0Q29sdW1uKTt9CnJlYmFzZShlZGl0KXtpZih0aGlzLnN0eWxlU2hlZXRJZCE9PWVkaXQuc3R5bGVTaGVldElkKQpyZXR1cm47aWYodGhpcy5zZWxlY3RvclJhbmdlKCkuZXF1YWwoZWRpdC5vbGRSYW5nZSkpe3RoaXMuX3JlaW5pdGlhbGl6ZVNlbGVjdG9ycygoZWRpdC5wYXlsb2FkKSk7fWVsc2V7Zm9yKGxldCBpPTA7aTx0aGlzLnNlbGVjdG9ycy5sZW5ndGg7KytpKQp0aGlzLnNlbGVjdG9yc1tpXS5yZWJhc2UoZWRpdCk7fQpmb3IoY29uc3QgbWVkaWEgb2YgdGhpcy5tZWRpYSkKbWVkaWEucmViYXNlKGVkaXQpO3N1cGVyLnJlYmFzZShlZGl0KTt9fTtTREsuQ1NTS2V5ZnJhbWVzUnVsZT1jbGFzc3tjb25zdHJ1Y3Rvcihjc3NNb2RlbCxwYXlsb2FkKXt0aGlzLl9jc3NNb2RlbD1jc3NNb2RlbDt0aGlzLl9hbmltYXRpb25OYW1lPW5ldyBTREsuQ1NTVmFsdWUocGF5bG9hZC5hbmltYXRpb25OYW1lKTt0aGlzLl9rZXlmcmFtZXM9cGF5bG9hZC5rZXlmcmFtZXMubWFwKGtleWZyYW1lUnVsZT0+bmV3IFNESy5DU1NLZXlmcmFtZVJ1bGUoY3NzTW9kZWwsa2V5ZnJhbWVSdWxlKSk7fQpuYW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbk5hbWU7fQprZXlmcmFtZXMoKXtyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzO319O1NESy5DU1NLZXlmcmFtZVJ1bGU9Y2xhc3MgZXh0ZW5kcyBTREsuQ1NTUnVsZXtjb25zdHJ1Y3Rvcihjc3NNb2RlbCxwYXlsb2FkKXtzdXBlcihjc3NNb2RlbCxwYXlsb2FkKTt0aGlzLl9yZWluaXRpYWxpemVLZXkocGF5bG9hZC5rZXlUZXh0KTt9CmtleSgpe3JldHVybiB0aGlzLl9rZXlUZXh0O30KX3JlaW5pdGlhbGl6ZUtleShwYXlsb2FkKXt0aGlzLl9rZXlUZXh0PW5ldyBTREsuQ1NTVmFsdWUocGF5bG9hZCk7fQpyZWJhc2UoZWRpdCl7aWYodGhpcy5zdHlsZVNoZWV0SWQhPT1lZGl0LnN0eWxlU2hlZXRJZHx8IXRoaXMuX2tleVRleHQucmFuZ2UpCnJldHVybjtpZihlZGl0Lm9sZFJhbmdlLmVxdWFsKHRoaXMuX2tleVRleHQucmFuZ2UpKQp0aGlzLl9yZWluaXRpYWxpemVLZXkoKGVkaXQucGF5bG9hZCkpO2Vsc2UKdGhpcy5fa2V5VGV4dC5yZWJhc2UoZWRpdCk7c3VwZXIucmViYXNlKGVkaXQpO30Kc2V0S2V5VGV4dChuZXdLZXlUZXh0KXtjb25zdCBzdHlsZVNoZWV0SWQ9dGhpcy5zdHlsZVNoZWV0SWQ7aWYoIXN0eWxlU2hlZXRJZCkKdGhyb3cnTm8gcnVsZSBzdHlsZXNoZWV0IGlkJztjb25zdCByYW5nZT10aGlzLl9rZXlUZXh0LnJhbmdlO2lmKCFyYW5nZSkKdGhyb3cnS2V5ZnJhbWUga2V5IGlzIG5vdCBlZGl0YWJsZSc7cmV0dXJuIHRoaXMuX2Nzc01vZGVsLnNldEtleWZyYW1lS2V5KHN0eWxlU2hlZXRJZCxyYW5nZSxuZXdLZXlUZXh0KTt9fTs7U0RLLkNTU1N0eWxlRGVjbGFyYXRpb249Y2xhc3N7Y29uc3RydWN0b3IoY3NzTW9kZWwscGFyZW50UnVsZSxwYXlsb2FkLHR5cGUpe3RoaXMuX2Nzc01vZGVsPWNzc01vZGVsO3RoaXMucGFyZW50UnVsZT1wYXJlbnRSdWxlO3RoaXMuX2FsbFByb3BlcnRpZXM7dGhpcy5zdHlsZVNoZWV0SWQ7dGhpcy5yYW5nZTt0aGlzLmNzc1RleHQ7dGhpcy5fc2hvcnRoYW5kVmFsdWVzO3RoaXMuX3Nob3J0aGFuZElzSW1wb3J0YW50O3RoaXMuX2FjdGl2ZVByb3BlcnR5TWFwO3RoaXMuX2xlYWRpbmdQcm9wZXJ0aWVzO3RoaXMuX3JlaW5pdGlhbGl6ZShwYXlsb2FkKTt0aGlzLnR5cGU9dHlwZTt9CnJlYmFzZShlZGl0KXtpZih0aGlzLnN0eWxlU2hlZXRJZCE9PWVkaXQuc3R5bGVTaGVldElkfHwhdGhpcy5yYW5nZSkKcmV0dXJuO2lmKGVkaXQub2xkUmFuZ2UuZXF1YWwodGhpcy5yYW5nZSkpe3RoaXMuX3JlaW5pdGlhbGl6ZSgoZWRpdC5wYXlsb2FkKSk7fWVsc2V7dGhpcy5yYW5nZT10aGlzLnJhbmdlLnJlYmFzZUFmdGVyVGV4dEVkaXQoZWRpdC5vbGRSYW5nZSxlZGl0Lm5ld1JhbmdlKTtmb3IobGV0IGk9MDtpPHRoaXMuX2FsbFByb3BlcnRpZXMubGVuZ3RoOysraSkKdGhpcy5fYWxsUHJvcGVydGllc1tpXS5yZWJhc2UoZWRpdCk7fX0KX3JlaW5pdGlhbGl6ZShwYXlsb2FkKXt0aGlzLnN0eWxlU2hlZXRJZD1wYXlsb2FkLnN0eWxlU2hlZXRJZDt0aGlzLnJhbmdlPXBheWxvYWQucmFuZ2U/VGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tT2JqZWN0KHBheWxvYWQucmFuZ2UpOm51bGw7Y29uc3Qgc2hvcnRoYW5kRW50cmllcz1wYXlsb2FkLnNob3J0aGFuZEVudHJpZXM7dGhpcy5fc2hvcnRoYW5kVmFsdWVzPW5ldyBNYXAoKTt0aGlzLl9zaG9ydGhhbmRJc0ltcG9ydGFudD1uZXcgU2V0KCk7Zm9yKGxldCBpPTA7aTxzaG9ydGhhbmRFbnRyaWVzLmxlbmd0aDsrK2kpe3RoaXMuX3Nob3J0aGFuZFZhbHVlcy5zZXQoc2hvcnRoYW5kRW50cmllc1tpXS5uYW1lLHNob3J0aGFuZEVudHJpZXNbaV0udmFsdWUpO2lmKHNob3J0aGFuZEVudHJpZXNbaV0uaW1wb3J0YW50KQp0aGlzLl9zaG9ydGhhbmRJc0ltcG9ydGFudC5hZGQoc2hvcnRoYW5kRW50cmllc1tpXS5uYW1lKTt9CnRoaXMuX2FsbFByb3BlcnRpZXM9W107aWYocGF5bG9hZC5jc3NUZXh0JiZ0aGlzLnJhbmdlKXtjb25zdCBjc3NUZXh0PW5ldyBUZXh0VXRpbHMuVGV4dChwYXlsb2FkLmNzc1RleHQpO2xldCBzdGFydD17bGluZTp0aGlzLnJhbmdlLnN0YXJ0TGluZSxjb2x1bW46dGhpcy5yYW5nZS5zdGFydENvbHVtbn07Zm9yKGNvbnN0IGNzc1Byb3BlcnR5IG9mIHBheWxvYWQuY3NzUHJvcGVydGllcyl7Y29uc3QgcmFuZ2U9Y3NzUHJvcGVydHkucmFuZ2U7aWYocmFuZ2Upe3BhcnNlVW51c2VkVGV4dC5jYWxsKHRoaXMsY3NzVGV4dCxzdGFydC5saW5lLHN0YXJ0LmNvbHVtbixyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pO3N0YXJ0PXtsaW5lOnJhbmdlLmVuZExpbmUsY29sdW1uOnJhbmdlLmVuZENvbHVtbn07fQp0aGlzLl9hbGxQcm9wZXJ0aWVzLnB1c2goU0RLLkNTU1Byb3BlcnR5LnBhcnNlUGF5bG9hZCh0aGlzLHRoaXMuX2FsbFByb3BlcnRpZXMubGVuZ3RoLGNzc1Byb3BlcnR5KSk7fQpwYXJzZVVudXNlZFRleHQuY2FsbCh0aGlzLGNzc1RleHQsc3RhcnQubGluZSxzdGFydC5jb2x1bW4sdGhpcy5yYW5nZS5lbmRMaW5lLHRoaXMucmFuZ2UuZW5kQ29sdW1uKTt9ZWxzZXtmb3IoY29uc3QgY3NzUHJvcGVydHkgb2YgcGF5bG9hZC5jc3NQcm9wZXJ0aWVzKQp0aGlzLl9hbGxQcm9wZXJ0aWVzLnB1c2goU0RLLkNTU1Byb3BlcnR5LnBhcnNlUGF5bG9hZCh0aGlzLHRoaXMuX2FsbFByb3BlcnRpZXMubGVuZ3RoLGNzc1Byb3BlcnR5KSk7fQp0aGlzLl9nZW5lcmF0ZVN5bnRoZXRpY1Byb3BlcnRpZXNJZk5lZWRlZCgpO3RoaXMuX2NvbXB1dGVJbmFjdGl2ZVByb3BlcnRpZXMoKTt0aGlzLl9hY3RpdmVQcm9wZXJ0eU1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMuX2FsbFByb3BlcnRpZXMpe2lmKCFwcm9wZXJ0eS5hY3RpdmVJblN0eWxlKCkpCmNvbnRpbnVlO3RoaXMuX2FjdGl2ZVByb3BlcnR5TWFwLnNldChwcm9wZXJ0eS5uYW1lLHByb3BlcnR5KTt9CnRoaXMuY3NzVGV4dD1wYXlsb2FkLmNzc1RleHQ7dGhpcy5fbGVhZGluZ1Byb3BlcnRpZXM9bnVsbDtmdW5jdGlvbiBwYXJzZVVudXNlZFRleHQoY3NzVGV4dCxzdGFydExpbmUsc3RhcnRDb2x1bW4sZW5kTGluZSxlbmRDb2x1bW4pe2NvbnN0IHRyPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0TGluZSxzdGFydENvbHVtbixlbmRMaW5lLGVuZENvbHVtbik7Y29uc3QgbWlzc2luZ1RleHQ9Y3NzVGV4dC5leHRyYWN0KHRyLnJlbGF0aXZlVG8odGhpcy5yYW5nZS5zdGFydExpbmUsdGhpcy5yYW5nZS5zdGFydENvbHVtbikpO2NvbnN0IGxpbmVzPW1pc3NpbmdUZXh0LnNwbGl0KCdcbicpO2xldCBsaW5lTnVtYmVyPTA7bGV0IGluQ29tbWVudD1mYWxzZTtmb3IoY29uc3QgbGluZSBvZiBsaW5lcyl7bGV0IGNvbHVtbj0wO2Zvcihjb25zdCBwcm9wZXJ0eSBvZiBsaW5lLnNwbGl0KCc7Jykpe2NvbnN0IHN0cmlwcGVkUHJvcGVydHk9c3RyaXBDb21tZW50cyhwcm9wZXJ0eSxpbkNvbW1lbnQpO2NvbnN0IHRyaW1tZWRQcm9wZXJ0eT1zdHJpcHBlZFByb3BlcnR5LnRleHQudHJpbSgpO2luQ29tbWVudD1zdHJpcHBlZFByb3BlcnR5LmluQ29tbWVudDtpZih0cmltbWVkUHJvcGVydHkpe2xldCBuYW1lO2xldCB2YWx1ZTtjb25zdCBjb2xvbkluZGV4PXRyaW1tZWRQcm9wZXJ0eS5pbmRleE9mKCc6Jyk7aWYoY29sb25JbmRleD09PS0xKXtuYW1lPXRyaW1tZWRQcm9wZXJ0eTt2YWx1ZT0nJzt9ZWxzZXtuYW1lPXRyaW1tZWRQcm9wZXJ0eS5zdWJzdHJpbmcoMCxjb2xvbkluZGV4KS50cmltKCk7dmFsdWU9dHJpbW1lZFByb3BlcnR5LnN1YnN0cmluZyhjb2xvbkluZGV4KzEpLnRyaW0oKTt9CmNvbnN0IHJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGxpbmVOdW1iZXIsY29sdW1uLGxpbmVOdW1iZXIsY29sdW1uK3Byb3BlcnR5Lmxlbmd0aCk7dGhpcy5fYWxsUHJvcGVydGllcy5wdXNoKG5ldyBTREsuQ1NTUHJvcGVydHkodGhpcyx0aGlzLl9hbGxQcm9wZXJ0aWVzLmxlbmd0aCxuYW1lLHZhbHVlLGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLHByb3BlcnR5LHJhbmdlLnJlbGF0aXZlRnJvbShzdGFydExpbmUsc3RhcnRDb2x1bW4pKSk7fQpjb2x1bW4rPXByb3BlcnR5Lmxlbmd0aCsxO30KbGluZU51bWJlcisrO319CmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dCxpbkNvbW1lbnQpe2xldCBvdXRwdXQ9Jyc7Zm9yKGxldCBpPTA7aTx0ZXh0Lmxlbmd0aDtpKyspe2lmKCFpbkNvbW1lbnQmJnRleHQuc3Vic3RyaW5nKGksaSsyKT09PScvKicpe2luQ29tbWVudD10cnVlO2krKzt9ZWxzZSBpZihpbkNvbW1lbnQmJnRleHQuc3Vic3RyaW5nKGksaSsyKT09PScqLycpe2luQ29tbWVudD1mYWxzZTtpKys7fWVsc2UgaWYoIWluQ29tbWVudCl7b3V0cHV0Kz10ZXh0W2ldO319CnJldHVybnt0ZXh0Om91dHB1dCxpbkNvbW1lbnR9O319Cl9nZW5lcmF0ZVN5bnRoZXRpY1Byb3BlcnRpZXNJZk5lZWRlZCgpe2lmKHRoaXMucmFuZ2UpCnJldHVybjtpZighdGhpcy5fc2hvcnRoYW5kVmFsdWVzLnNpemUpCnJldHVybjtjb25zdCBwcm9wZXJ0aWVzU2V0PW5ldyBTZXQoKTtmb3IoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5fYWxsUHJvcGVydGllcykKcHJvcGVydGllc1NldC5hZGQocHJvcGVydHkubmFtZSk7Y29uc3QgZ2VuZXJhdGVkUHJvcGVydGllcz1bXTtmb3IoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5fYWxsUHJvcGVydGllcyl7Y29uc3Qgc2hvcnRoYW5kcz1TREsuY3NzTWV0YWRhdGEoKS5zaG9ydGhhbmRzKHByb3BlcnR5Lm5hbWUpfHxbXTtmb3IoY29uc3Qgc2hvcnRoYW5kIG9mIHNob3J0aGFuZHMpe2lmKHByb3BlcnRpZXNTZXQuaGFzKHNob3J0aGFuZCkpCmNvbnRpbnVlO2NvbnN0IHNob3J0aGFuZFZhbHVlPXRoaXMuX3Nob3J0aGFuZFZhbHVlcy5nZXQoc2hvcnRoYW5kKTtpZighc2hvcnRoYW5kVmFsdWUpCmNvbnRpbnVlO2NvbnN0IHNob3J0aGFuZEltcG9ydGFuY2U9ISF0aGlzLl9zaG9ydGhhbmRJc0ltcG9ydGFudC5oYXMoc2hvcnRoYW5kKTtjb25zdCBzaG9ydGhhbmRQcm9wZXJ0eT1uZXcgU0RLLkNTU1Byb3BlcnR5KHRoaXMsdGhpcy5hbGxQcm9wZXJ0aWVzKCkubGVuZ3RoLHNob3J0aGFuZCxzaG9ydGhhbmRWYWx1ZSxzaG9ydGhhbmRJbXBvcnRhbmNlLGZhbHNlLHRydWUsZmFsc2UpO2dlbmVyYXRlZFByb3BlcnRpZXMucHVzaChzaG9ydGhhbmRQcm9wZXJ0eSk7cHJvcGVydGllc1NldC5hZGQoc2hvcnRoYW5kKTt9fQp0aGlzLl9hbGxQcm9wZXJ0aWVzPXRoaXMuX2FsbFByb3BlcnRpZXMuY29uY2F0KGdlbmVyYXRlZFByb3BlcnRpZXMpO30KX2NvbXB1dGVMZWFkaW5nUHJvcGVydGllcygpe2Z1bmN0aW9uIHByb3BlcnR5SGFzUmFuZ2UocHJvcGVydHkpe3JldHVybiEhcHJvcGVydHkucmFuZ2U7fQppZih0aGlzLnJhbmdlKQpyZXR1cm4gdGhpcy5fYWxsUHJvcGVydGllcy5maWx0ZXIocHJvcGVydHlIYXNSYW5nZSk7Y29uc3QgbGVhZGluZ1Byb3BlcnRpZXM9W107Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMuX2FsbFByb3BlcnRpZXMpe2NvbnN0IHNob3J0aGFuZHM9U0RLLmNzc01ldGFkYXRhKCkuc2hvcnRoYW5kcyhwcm9wZXJ0eS5uYW1lKXx8W107bGV0IGJlbG9uZ1RvQW55U2hvcnRoYW5kPWZhbHNlO2Zvcihjb25zdCBzaG9ydGhhbmQgb2Ygc2hvcnRoYW5kcyl7aWYodGhpcy5fc2hvcnRoYW5kVmFsdWVzLmdldChzaG9ydGhhbmQpKXtiZWxvbmdUb0FueVNob3J0aGFuZD10cnVlO2JyZWFrO319CmlmKCFiZWxvbmdUb0FueVNob3J0aGFuZCkKbGVhZGluZ1Byb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7fQpyZXR1cm4gbGVhZGluZ1Byb3BlcnRpZXM7fQpsZWFkaW5nUHJvcGVydGllcygpe2lmKCF0aGlzLl9sZWFkaW5nUHJvcGVydGllcykKdGhpcy5fbGVhZGluZ1Byb3BlcnRpZXM9dGhpcy5fY29tcHV0ZUxlYWRpbmdQcm9wZXJ0aWVzKCk7cmV0dXJuIHRoaXMuX2xlYWRpbmdQcm9wZXJ0aWVzO30KdGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2Nzc01vZGVsLnRhcmdldCgpO30KY3NzTW9kZWwoKXtyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fQpfY29tcHV0ZUluYWN0aXZlUHJvcGVydGllcygpe2NvbnN0IGFjdGl2ZVByb3BlcnRpZXM9e307Zm9yKGxldCBpPTA7aTx0aGlzLl9hbGxQcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3BlcnR5PXRoaXMuX2FsbFByb3BlcnRpZXNbaV07aWYocHJvcGVydHkuZGlzYWJsZWR8fCFwcm9wZXJ0eS5wYXJzZWRPayl7cHJvcGVydHkuc2V0QWN0aXZlKGZhbHNlKTtjb250aW51ZTt9CmNvbnN0IGNhbm9uaWNhbE5hbWU9U0RLLmNzc01ldGFkYXRhKCkuY2Fub25pY2FsUHJvcGVydHlOYW1lKHByb3BlcnR5Lm5hbWUpO2NvbnN0IGFjdGl2ZVByb3BlcnR5PWFjdGl2ZVByb3BlcnRpZXNbY2Fub25pY2FsTmFtZV07aWYoIWFjdGl2ZVByb3BlcnR5KXthY3RpdmVQcm9wZXJ0aWVzW2Nhbm9uaWNhbE5hbWVdPXByb3BlcnR5O31lbHNlIGlmKCFhY3RpdmVQcm9wZXJ0eS5pbXBvcnRhbnR8fHByb3BlcnR5LmltcG9ydGFudCl7YWN0aXZlUHJvcGVydHkuc2V0QWN0aXZlKGZhbHNlKTthY3RpdmVQcm9wZXJ0aWVzW2Nhbm9uaWNhbE5hbWVdPXByb3BlcnR5O31lbHNle3Byb3BlcnR5LnNldEFjdGl2ZShmYWxzZSk7fX19CmFsbFByb3BlcnRpZXMoKXtyZXR1cm4gdGhpcy5fYWxsUHJvcGVydGllczt9CmdldFByb3BlcnR5VmFsdWUobmFtZSl7Y29uc3QgcHJvcGVydHk9dGhpcy5fYWN0aXZlUHJvcGVydHlNYXAuZ2V0KG5hbWUpO3JldHVybiBwcm9wZXJ0eT9wcm9wZXJ0eS52YWx1ZTonJzt9CmlzUHJvcGVydHlJbXBsaWNpdChuYW1lKXtjb25zdCBwcm9wZXJ0eT10aGlzLl9hY3RpdmVQcm9wZXJ0eU1hcC5nZXQobmFtZSk7cmV0dXJuIHByb3BlcnR5P3Byb3BlcnR5LmltcGxpY2l0OmZhbHNlO30KbG9uZ2hhbmRQcm9wZXJ0aWVzKG5hbWUpe2NvbnN0IGxvbmdoYW5kcz1TREsuY3NzTWV0YWRhdGEoKS5sb25naGFuZHMobmFtZSk7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2xvbmdoYW5kcyYmaTxsb25naGFuZHMubGVuZ3RoOysraSl7Y29uc3QgcHJvcGVydHk9dGhpcy5fYWN0aXZlUHJvcGVydHlNYXAuZ2V0KGxvbmdoYW5kc1tpXSk7aWYocHJvcGVydHkpCnJlc3VsdC5wdXNoKHByb3BlcnR5KTt9CnJldHVybiByZXN1bHQ7fQpwcm9wZXJ0eUF0KGluZGV4KXtyZXR1cm4oaW5kZXg8dGhpcy5hbGxQcm9wZXJ0aWVzKCkubGVuZ3RoKT90aGlzLmFsbFByb3BlcnRpZXMoKVtpbmRleF06bnVsbDt9CnBhc3RMYXN0U291cmNlUHJvcGVydHlJbmRleCgpe2ZvcihsZXQgaT10aGlzLmFsbFByb3BlcnRpZXMoKS5sZW5ndGgtMTtpPj0wOy0taSl7aWYodGhpcy5hbGxQcm9wZXJ0aWVzKClbaV0ucmFuZ2UpCnJldHVybiBpKzE7fQpyZXR1cm4gMDt9Cl9pbnNlcnRpb25SYW5nZShpbmRleCl7Y29uc3QgcHJvcGVydHk9dGhpcy5wcm9wZXJ0eUF0KGluZGV4KTtyZXR1cm4gcHJvcGVydHkmJnByb3BlcnR5LnJhbmdlP3Byb3BlcnR5LnJhbmdlLmNvbGxhcHNlVG9TdGFydCgpOnRoaXMucmFuZ2UuY29sbGFwc2VUb0VuZCgpO30KbmV3QmxhbmtQcm9wZXJ0eShpbmRleCl7aW5kZXg9KHR5cGVvZiBpbmRleD09PSd1bmRlZmluZWQnKT90aGlzLnBhc3RMYXN0U291cmNlUHJvcGVydHlJbmRleCgpOmluZGV4O2NvbnN0IHByb3BlcnR5PW5ldyBTREsuQ1NTUHJvcGVydHkodGhpcyxpbmRleCwnJywnJyxmYWxzZSxmYWxzZSx0cnVlLGZhbHNlLCcnLHRoaXMuX2luc2VydGlvblJhbmdlKGluZGV4KSk7cmV0dXJuIHByb3BlcnR5O30Kc2V0VGV4dCh0ZXh0LG1ham9yQ2hhbmdlKXtpZighdGhpcy5yYW5nZXx8IXRoaXMuc3R5bGVTaGVldElkKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtyZXR1cm4gdGhpcy5fY3NzTW9kZWwuc2V0U3R5bGVUZXh0KHRoaXMuc3R5bGVTaGVldElkLHRoaXMucmFuZ2UsdGV4dCxtYWpvckNoYW5nZSk7fQppbnNlcnRQcm9wZXJ0eUF0KGluZGV4LG5hbWUsdmFsdWUsdXNlckNhbGxiYWNrKXt0aGlzLm5ld0JsYW5rUHJvcGVydHkoaW5kZXgpLnNldFRleHQobmFtZSsnOiAnK3ZhbHVlKyc7JyxmYWxzZSx0cnVlKS50aGVuKHVzZXJDYWxsYmFjayk7fQphcHBlbmRQcm9wZXJ0eShuYW1lLHZhbHVlLHVzZXJDYWxsYmFjayl7dGhpcy5pbnNlcnRQcm9wZXJ0eUF0KHRoaXMuYWxsUHJvcGVydGllcygpLmxlbmd0aCxuYW1lLHZhbHVlLHVzZXJDYWxsYmFjayk7fX07U0RLLkNTU1N0eWxlRGVjbGFyYXRpb24uVHlwZT17UmVndWxhcjonUmVndWxhcicsSW5saW5lOidJbmxpbmUnLEF0dHJpYnV0ZXM6J0F0dHJpYnV0ZXMnfTs7U0RLLkNTU1N0eWxlU2hlZXRIZWFkZXI9Y2xhc3N7Y29uc3RydWN0b3IoY3NzTW9kZWwscGF5bG9hZCl7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5pZD1wYXlsb2FkLnN0eWxlU2hlZXRJZDt0aGlzLmZyYW1lSWQ9cGF5bG9hZC5mcmFtZUlkO3RoaXMuc291cmNlVVJMPXBheWxvYWQuc291cmNlVVJMO3RoaXMuaGFzU291cmNlVVJMPSEhcGF5bG9hZC5oYXNTb3VyY2VVUkw7dGhpcy5vcmlnaW49cGF5bG9hZC5vcmlnaW47dGhpcy50aXRsZT1wYXlsb2FkLnRpdGxlO3RoaXMuZGlzYWJsZWQ9cGF5bG9hZC5kaXNhYmxlZDt0aGlzLmlzSW5saW5lPXBheWxvYWQuaXNJbmxpbmU7dGhpcy5zdGFydExpbmU9cGF5bG9hZC5zdGFydExpbmU7dGhpcy5zdGFydENvbHVtbj1wYXlsb2FkLnN0YXJ0Q29sdW1uO3RoaXMuY29udGVudExlbmd0aD1wYXlsb2FkLmxlbmd0aDtpZihwYXlsb2FkLm93bmVyTm9kZSkKdGhpcy5vd25lck5vZGU9bmV3IFNESy5EZWZlcnJlZERPTU5vZGUoY3NzTW9kZWwudGFyZ2V0KCkscGF5bG9hZC5vd25lck5vZGUpO3RoaXMuc2V0U291cmNlTWFwVVJMKHBheWxvYWQuc291cmNlTWFwVVJMKTt9Cm9yaWdpbmFsQ29udGVudFByb3ZpZGVyKCl7aWYoIXRoaXMuX29yaWdpbmFsQ29udGVudFByb3ZpZGVyKXtjb25zdCBsYXp5Q29udGVudD10aGlzLl9jc3NNb2RlbC5vcmlnaW5hbFN0eWxlU2hlZXRUZXh0LmJpbmQodGhpcy5fY3NzTW9kZWwsdGhpcyk7dGhpcy5fb3JpZ2luYWxDb250ZW50UHJvdmlkZXI9bmV3IENvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXIodGhpcy5jb250ZW50VVJMKCksdGhpcy5jb250ZW50VHlwZSgpLChsYXp5Q29udGVudCkpO30KcmV0dXJuIHRoaXMuX29yaWdpbmFsQ29udGVudFByb3ZpZGVyO30Kc2V0U291cmNlTWFwVVJMKHNvdXJjZU1hcFVSTCl7dGhpcy5zb3VyY2VNYXBVUkw9c291cmNlTWFwVVJMO30KY3NzTW9kZWwoKXtyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fQppc0Fub255bW91c0lubGluZVN0eWxlU2hlZXQoKXtyZXR1cm4hdGhpcy5yZXNvdXJjZVVSTCgpJiYhdGhpcy5fY3NzTW9kZWwuc291cmNlTWFwTWFuYWdlcigpLnNvdXJjZU1hcEZvckNsaWVudCh0aGlzKTt9CnJlc291cmNlVVJMKCl7cmV0dXJuIHRoaXMuaXNWaWFJbnNwZWN0b3IoKT90aGlzLl92aWFJbnNwZWN0b3JSZXNvdXJjZVVSTCgpOnRoaXMuc291cmNlVVJMO30KX3ZpYUluc3BlY3RvclJlc291cmNlVVJMKCl7Y29uc3QgZnJhbWU9dGhpcy5fY3NzTW9kZWwudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKS5mcmFtZUZvcklkKHRoaXMuZnJhbWVJZCk7Y29uc29sZS5hc3NlcnQoZnJhbWUpO2NvbnN0IHBhcnNlZFVSTD1uZXcgQ29tbW9uLlBhcnNlZFVSTChmcmFtZS51cmwpO2xldCBmYWtlVVJMPSdpbnNwZWN0b3I6Ly8nK3BhcnNlZFVSTC5ob3N0K3BhcnNlZFVSTC5mb2xkZXJQYXRoQ29tcG9uZW50cztpZighZmFrZVVSTC5lbmRzV2l0aCgnLycpKQpmYWtlVVJMKz0nLyc7ZmFrZVVSTCs9J2luc3BlY3Rvci1zdHlsZXNoZWV0JztyZXR1cm4gZmFrZVVSTDt9CmxpbmVOdW1iZXJJblNvdXJjZShsaW5lTnVtYmVySW5TdHlsZVNoZWV0KXtyZXR1cm4gdGhpcy5zdGFydExpbmUrbGluZU51bWJlckluU3R5bGVTaGVldDt9CmNvbHVtbk51bWJlckluU291cmNlKGxpbmVOdW1iZXJJblN0eWxlU2hlZXQsY29sdW1uTnVtYmVySW5TdHlsZVNoZWV0KXtyZXR1cm4obGluZU51bWJlckluU3R5bGVTaGVldD8wOnRoaXMuc3RhcnRDb2x1bW4pK2NvbHVtbk51bWJlckluU3R5bGVTaGVldDt9CmNvbnRlbnRVUkwoKXtyZXR1cm4gdGhpcy5yZXNvdXJjZVVSTCgpO30KY29udGVudFR5cGUoKXtyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuU3R5bGVzaGVldDt9CmNvbnRlbnRFbmNvZGVkKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7fQpyZXF1ZXN0Q29udGVudCgpe3JldHVybiB0aGlzLl9jc3NNb2RlbC5nZXRTdHlsZVNoZWV0VGV4dCh0aGlzLmlkKTt9CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgdGhpcy5yZXF1ZXN0Q29udGVudCgpO3JldHVybiBDb21tb24uQ29udGVudFByb3ZpZGVyLnBlcmZvcm1TZWFyY2hJbkNvbnRlbnQoY29udGVudCxxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpO30KaXNWaWFJbnNwZWN0b3IoKXtyZXR1cm4gdGhpcy5vcmlnaW49PT0naW5zcGVjdG9yJzt9fTs7U0RLLkNoaWxkVGFyZ2V0TWFuYWdlcj1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3RvcihwYXJlbnRUYXJnZXQpe3N1cGVyKHBhcmVudFRhcmdldCk7dGhpcy5fdGFyZ2V0TWFuYWdlcj1wYXJlbnRUYXJnZXQudGFyZ2V0TWFuYWdlcigpO3RoaXMuX3BhcmVudFRhcmdldD1wYXJlbnRUYXJnZXQ7dGhpcy5fdGFyZ2V0QWdlbnQ9cGFyZW50VGFyZ2V0LnRhcmdldEFnZW50KCk7dGhpcy5fdGFyZ2V0SW5mb3M9bmV3IE1hcCgpO3RoaXMuX2NoaWxkQ29ubmVjdGlvbnM9bmV3IE1hcCgpO3BhcmVudFRhcmdldC5yZWdpc3RlclRhcmdldERpc3BhdGNoZXIodGhpcyk7dGhpcy5fdGFyZ2V0QWdlbnQuaW52b2tlX3NldEF1dG9BdHRhY2goe2F1dG9BdHRhY2g6dHJ1ZSx3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OnRydWV9KTtpZighcGFyZW50VGFyZ2V0LnBhcmVudFRhcmdldCgpKXt0aGlzLl90YXJnZXRBZ2VudC5zZXREaXNjb3ZlclRhcmdldHModHJ1ZSk7dGhpcy5fdGFyZ2V0QWdlbnQuc2V0UmVtb3RlTG9jYXRpb25zKFt7aG9zdDonbG9jYWxob3N0Jyxwb3J0OjkyMjl9XSk7fX0Kc3RhdGljIGluc3RhbGwoYXR0YWNoQ2FsbGJhY2spe1NESy5DaGlsZFRhcmdldE1hbmFnZXIuX2F0dGFjaENhbGxiYWNrPWF0dGFjaENhbGxiYWNrO1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuQ2hpbGRUYXJnZXRNYW5hZ2VyLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5UYXJnZXQsdHJ1ZSk7fQpzdXNwZW5kTW9kZWwoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0QWdlbnQuaW52b2tlX3NldEF1dG9BdHRhY2goe2F1dG9BdHRhY2g6dHJ1ZSx3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OmZhbHNlfSk7fQpyZXN1bWVNb2RlbCgpe3JldHVybiB0aGlzLl90YXJnZXRBZ2VudC5pbnZva2Vfc2V0QXV0b0F0dGFjaCh7YXV0b0F0dGFjaDp0cnVlLHdhaXRGb3JEZWJ1Z2dlck9uU3RhcnQ6dHJ1ZX0pO30KZGlzcG9zZSgpe2Zvcihjb25zdCBzZXNzaW9uSWQgb2YgdGhpcy5fY2hpbGRDb25uZWN0aW9ucy5rZXlzKCkpCnRoaXMuZGV0YWNoZWRGcm9tVGFyZ2V0KHNlc3Npb25JZCx1bmRlZmluZWQpO30KX2NhcGFiaWxpdGllc0ZvclR5cGUodHlwZSl7aWYodHlwZT09PSd3b3JrZXInKXtyZXR1cm4gU0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Mb2d8U0RLLlRhcmdldC5DYXBhYmlsaXR5Lk5ldHdvcmt8U0RLLlRhcmdldC5DYXBhYmlsaXR5LlRhcmdldDt9CmlmKHR5cGU9PT0nc2VydmljZV93b3JrZXInKQpyZXR1cm4gU0RLLlRhcmdldC5DYXBhYmlsaXR5LkxvZ3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTmV0d29ya3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVGFyZ2V0O2lmKHR5cGU9PT0naWZyYW1lJyl7cmV0dXJuIFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET018U0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Mb2d8U0RLLlRhcmdldC5DYXBhYmlsaXR5Lk5ldHdvcmt8U0RLLlRhcmdldC5DYXBhYmlsaXR5LlRhcmdldHxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVHJhY2luZ3xTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRW11bGF0aW9ufFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5JbnB1dDt9CnJldHVybiAwO30KdGFyZ2V0Q3JlYXRlZCh0YXJnZXRJbmZvKXt0aGlzLl90YXJnZXRJbmZvcy5zZXQodGFyZ2V0SW5mby50YXJnZXRJZCx0YXJnZXRJbmZvKTt0aGlzLl9maXJlQXZhaWxhYmxlVGFyZ2V0c0NoYW5nZWQoKTt9CnRhcmdldEluZm9DaGFuZ2VkKHRhcmdldEluZm8pe3RoaXMuX3RhcmdldEluZm9zLnNldCh0YXJnZXRJbmZvLnRhcmdldElkLHRhcmdldEluZm8pO3RoaXMuX2ZpcmVBdmFpbGFibGVUYXJnZXRzQ2hhbmdlZCgpO30KdGFyZ2V0RGVzdHJveWVkKHRhcmdldElkKXt0aGlzLl90YXJnZXRJbmZvcy5kZWxldGUodGFyZ2V0SWQpO3RoaXMuX2ZpcmVBdmFpbGFibGVUYXJnZXRzQ2hhbmdlZCgpO30KdGFyZ2V0Q3Jhc2hlZCh0YXJnZXRJZCxzdGF0dXMsZXJyb3JDb2RlKXt9Cl9maXJlQXZhaWxhYmxlVGFyZ2V0c0NoYW5nZWQoKXtTREsudGFyZ2V0TWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLkF2YWlsYWJsZVRhcmdldHNDaGFuZ2VkLHRoaXMuX3RhcmdldEluZm9zLnZhbHVlc0FycmF5KCkpO30KYXR0YWNoZWRUb1RhcmdldChzZXNzaW9uSWQsdGFyZ2V0SW5mbyx3YWl0aW5nRm9yRGVidWdnZXIpe2xldCB0YXJnZXROYW1lPScnO2lmKHRhcmdldEluZm8udHlwZSE9PSdpZnJhbWUnKXtjb25zdCBwYXJzZWRVUkw9dGFyZ2V0SW5mby51cmwuYXNQYXJzZWRVUkwoKTt0YXJnZXROYW1lPXBhcnNlZFVSTD9wYXJzZWRVUkwubGFzdFBhdGhDb21wb25lbnRXaXRoRnJhZ21lbnQoKTonIycrKCsrU0RLLkNoaWxkVGFyZ2V0TWFuYWdlci5fbGFzdEFub255bW91c1RhcmdldElkKTt9CmNvbnN0IHRhcmdldD10aGlzLl90YXJnZXRNYW5hZ2VyLmNyZWF0ZVRhcmdldCh0YXJnZXRJbmZvLnRhcmdldElkLHRhcmdldE5hbWUsdGhpcy5fY2FwYWJpbGl0aWVzRm9yVHlwZSh0YXJnZXRJbmZvLnR5cGUpLHRoaXMuX2NyZWF0ZUNoaWxkQ29ubmVjdGlvbi5iaW5kKHRoaXMsdGhpcy5fdGFyZ2V0QWdlbnQsc2Vzc2lvbklkKSx0aGlzLl9wYXJlbnRUYXJnZXQsZmFsc2UpO2lmKFNESy5DaGlsZFRhcmdldE1hbmFnZXIuX2F0dGFjaENhbGxiYWNrKQpTREsuQ2hpbGRUYXJnZXRNYW5hZ2VyLl9hdHRhY2hDYWxsYmFjayh7dGFyZ2V0LHdhaXRpbmdGb3JEZWJ1Z2dlcn0pO3RhcmdldC5ydW50aW1lQWdlbnQoKS5ydW5JZldhaXRpbmdGb3JEZWJ1Z2dlcigpO30KZGV0YWNoZWRGcm9tVGFyZ2V0KHNlc3Npb25JZCxjaGlsZFRhcmdldElkKXt0aGlzLl9jaGlsZENvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpLm9uRGlzY29ubmVjdC5jYWxsKG51bGwsJ3RhcmdldCB0ZXJtaW5hdGVkJyk7dGhpcy5fY2hpbGRDb25uZWN0aW9ucy5kZWxldGUoc2Vzc2lvbklkKTt9CnJlY2VpdmVkTWVzc2FnZUZyb21UYXJnZXQoc2Vzc2lvbklkLG1lc3NhZ2UsY2hpbGRUYXJnZXRJZCl7Y29uc3QgY29ubmVjdGlvbj10aGlzLl9jaGlsZENvbm5lY3Rpb25zLmdldChzZXNzaW9uSWQpO2lmKGNvbm5lY3Rpb24pCmNvbm5lY3Rpb24ub25NZXNzYWdlLmNhbGwobnVsbCxtZXNzYWdlKTt9Cl9jcmVhdGVDaGlsZENvbm5lY3Rpb24oYWdlbnQsc2Vzc2lvbklkLHBhcmFtcyl7Y29uc3QgY29ubmVjdGlvbj1uZXcgU0RLLkNoaWxkQ29ubmVjdGlvbihhZ2VudCxzZXNzaW9uSWQscGFyYW1zKTt0aGlzLl9jaGlsZENvbm5lY3Rpb25zLnNldChzZXNzaW9uSWQsY29ubmVjdGlvbik7cmV0dXJuIGNvbm5lY3Rpb247fX07U0RLLkNoaWxkVGFyZ2V0TWFuYWdlci5fbGFzdEFub255bW91c1RhcmdldElkPTA7U0RLLkNoaWxkVGFyZ2V0TWFuYWdlci5fYXR0YWNoQ2FsbGJhY2s7O1NESy5ET01EZWJ1Z2dlck1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9hZ2VudD10YXJnZXQuZG9tZGVidWdnZXJBZ2VudCgpO3RoaXMuX3J1bnRpbWVNb2RlbD0odGFyZ2V0Lm1vZGVsKFNESy5SdW50aW1lTW9kZWwpKTt0aGlzLl9kb21Nb2RlbD0odGFyZ2V0Lm1vZGVsKFNESy5ET01Nb2RlbCkpO3RoaXMuX2RvbU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkRPTU1vZGVsLkV2ZW50cy5Eb2N1bWVudFVwZGF0ZWQsdGhpcy5fZG9jdW1lbnRVcGRhdGVkLHRoaXMpO3RoaXMuX2RvbU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkRPTU1vZGVsLkV2ZW50cy5Ob2RlUmVtb3ZlZCx0aGlzLl9ub2RlUmVtb3ZlZCx0aGlzKTt0aGlzLl9kb21CcmVha3BvaW50cz1bXTt0aGlzLl9kb21CcmVha3BvaW50c1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnZG9tQnJlYWtwb2ludHMnLFtdKTtpZih0aGlzLl9kb21Nb2RlbC5leGlzdGluZ0RvY3VtZW50KCkpCnRoaXMuX2RvY3VtZW50VXBkYXRlZCgpO30KcnVudGltZU1vZGVsKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVNb2RlbDt9CmFzeW5jIGV2ZW50TGlzdGVuZXJzKHJlbW90ZU9iamVjdCl7Y29uc29sZS5hc3NlcnQocmVtb3RlT2JqZWN0LnJ1bnRpbWVNb2RlbCgpPT09dGhpcy5fcnVudGltZU1vZGVsKTtpZighcmVtb3RlT2JqZWN0Lm9iamVjdElkKQpyZXR1cm5bXTtjb25zdCBwYXlsb2Fkcz1hd2FpdCB0aGlzLl9hZ2VudC5nZXRFdmVudExpc3RlbmVycygocmVtb3RlT2JqZWN0Lm9iamVjdElkKSk7Y29uc3QgZXZlbnRMaXN0ZW5lcnM9W107Zm9yKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHN8fFtdKXtjb25zdCBsb2NhdGlvbj10aGlzLl9ydW50aW1lTW9kZWwuZGVidWdnZXJNb2RlbCgpLmNyZWF0ZVJhd0xvY2F0aW9uQnlTY3JpcHRJZChwYXlsb2FkLnNjcmlwdElkLHBheWxvYWQubGluZU51bWJlcixwYXlsb2FkLmNvbHVtbk51bWJlcik7aWYoIWxvY2F0aW9uKQpjb250aW51ZTtldmVudExpc3RlbmVycy5wdXNoKG5ldyBTREsuRXZlbnRMaXN0ZW5lcih0aGlzLHJlbW90ZU9iamVjdCxwYXlsb2FkLnR5cGUscGF5bG9hZC51c2VDYXB0dXJlLHBheWxvYWQucGFzc2l2ZSxwYXlsb2FkLm9uY2UscGF5bG9hZC5oYW5kbGVyP3RoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocGF5bG9hZC5oYW5kbGVyKTpudWxsLHBheWxvYWQub3JpZ2luYWxIYW5kbGVyP3RoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocGF5bG9hZC5vcmlnaW5hbEhhbmRsZXIpOm51bGwsbG9jYXRpb24sbnVsbCkpO30KcmV0dXJuIGV2ZW50TGlzdGVuZXJzO30KcmV0cmlldmVET01CcmVha3BvaW50cygpe3RoaXMuX2RvbU1vZGVsLnJlcXVlc3REb2N1bWVudCgpO30KZG9tQnJlYWtwb2ludHMoKXtyZXR1cm4gdGhpcy5fZG9tQnJlYWtwb2ludHMuc2xpY2UoKTt9Cmhhc0RPTUJyZWFrcG9pbnQobm9kZSx0eXBlKXtyZXR1cm4gdGhpcy5fZG9tQnJlYWtwb2ludHMuc29tZShicmVha3BvaW50PT4oYnJlYWtwb2ludC5ub2RlPT09bm9kZSYmYnJlYWtwb2ludC50eXBlPT09dHlwZSkpO30Kc2V0RE9NQnJlYWtwb2ludChub2RlLHR5cGUpe2Zvcihjb25zdCBicmVha3BvaW50IG9mIHRoaXMuX2RvbUJyZWFrcG9pbnRzKXtpZihicmVha3BvaW50Lm5vZGU9PT1ub2RlJiZicmVha3BvaW50LnR5cGU9PT10eXBlKXt0aGlzLnRvZ2dsZURPTUJyZWFrcG9pbnQoYnJlYWtwb2ludCx0cnVlKTtyZXR1cm4gYnJlYWtwb2ludDt9fQpjb25zdCBicmVha3BvaW50PW5ldyBTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50KHRoaXMsbm9kZSx0eXBlLHRydWUpO3RoaXMuX2RvbUJyZWFrcG9pbnRzLnB1c2goYnJlYWtwb2ludCk7dGhpcy5fc2F2ZURPTUJyZWFrcG9pbnRzKCk7dGhpcy5fZW5hYmxlRE9NQnJlYWtwb2ludChicmVha3BvaW50KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NRGVidWdnZXJNb2RlbC5FdmVudHMuRE9NQnJlYWtwb2ludEFkZGVkLGJyZWFrcG9pbnQpO3JldHVybiBicmVha3BvaW50O30KcmVtb3ZlRE9NQnJlYWtwb2ludChub2RlLHR5cGUpe3RoaXMuX3JlbW92ZURPTUJyZWFrcG9pbnRzKGJyZWFrcG9pbnQ9PmJyZWFrcG9pbnQubm9kZT09PW5vZGUmJmJyZWFrcG9pbnQudHlwZT09PXR5cGUpO30KcmVtb3ZlQWxsRE9NQnJlYWtwb2ludHMoKXt0aGlzLl9yZW1vdmVET01CcmVha3BvaW50cyhicmVha3BvaW50PT50cnVlKTt9CnRvZ2dsZURPTUJyZWFrcG9pbnQoYnJlYWtwb2ludCxlbmFibGVkKXtpZihlbmFibGVkPT09YnJlYWtwb2ludC5lbmFibGVkKQpyZXR1cm47YnJlYWtwb2ludC5lbmFibGVkPWVuYWJsZWQ7aWYoZW5hYmxlZCkKdGhpcy5fZW5hYmxlRE9NQnJlYWtwb2ludChicmVha3BvaW50KTtlbHNlCnRoaXMuX2Rpc2FibGVET01CcmVha3BvaW50KGJyZWFrcG9pbnQpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cy5ET01CcmVha3BvaW50VG9nZ2xlZCxicmVha3BvaW50KTt9Cl9lbmFibGVET01CcmVha3BvaW50KGJyZWFrcG9pbnQpe3RoaXMuX2FnZW50LnNldERPTUJyZWFrcG9pbnQoYnJlYWtwb2ludC5ub2RlLmlkLGJyZWFrcG9pbnQudHlwZSk7YnJlYWtwb2ludC5ub2RlLnNldE1hcmtlcihTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50Lk1hcmtlcix0cnVlKTt9Cl9kaXNhYmxlRE9NQnJlYWtwb2ludChicmVha3BvaW50KXt0aGlzLl9hZ2VudC5yZW1vdmVET01CcmVha3BvaW50KGJyZWFrcG9pbnQubm9kZS5pZCxicmVha3BvaW50LnR5cGUpO2JyZWFrcG9pbnQubm9kZS5zZXRNYXJrZXIoU0RLLkRPTURlYnVnZ2VyTW9kZWwuRE9NQnJlYWtwb2ludC5NYXJrZXIsdGhpcy5fbm9kZUhhc0JyZWFrcG9pbnRzKGJyZWFrcG9pbnQubm9kZSk/dHJ1ZTpudWxsKTt9Cl9ub2RlSGFzQnJlYWtwb2ludHMobm9kZSl7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgdGhpcy5fZG9tQnJlYWtwb2ludHMpe2lmKGJyZWFrcG9pbnQubm9kZT09PW5vZGUmJmJyZWFrcG9pbnQuZW5hYmxlZCkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpyZXNvbHZlRE9NQnJlYWtwb2ludERhdGEoYXV4RGF0YSl7Y29uc3QgdHlwZT1hdXhEYXRhWyd0eXBlJ107Y29uc3Qgbm9kZT10aGlzLl9kb21Nb2RlbC5ub2RlRm9ySWQoYXV4RGF0YVsnbm9kZUlkJ10pO2lmKCF0eXBlfHwhbm9kZSkKcmV0dXJuIG51bGw7bGV0IHRhcmdldE5vZGU9bnVsbDtsZXQgaW5zZXJ0aW9uPWZhbHNlO2lmKHR5cGU9PT1TREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50LlR5cGUuU3VidHJlZU1vZGlmaWVkKXtpbnNlcnRpb249YXV4RGF0YVsnaW5zZXJ0aW9uJ118fGZhbHNlO3RhcmdldE5vZGU9dGhpcy5fZG9tTW9kZWwubm9kZUZvcklkKGF1eERhdGFbJ3RhcmdldE5vZGVJZCddKTt9CnJldHVybnt0eXBlOnR5cGUsbm9kZTpub2RlLHRhcmdldE5vZGU6dGFyZ2V0Tm9kZSxpbnNlcnRpb246aW5zZXJ0aW9ufTt9Cl9jdXJyZW50VVJMKCl7Y29uc3QgZG9tRG9jdW1lbnQ9dGhpcy5fZG9tTW9kZWwuZXhpc3RpbmdEb2N1bWVudCgpO3JldHVybiBkb21Eb2N1bWVudD9kb21Eb2N1bWVudC5kb2N1bWVudFVSTDonJzt9Cl9kb2N1bWVudFVwZGF0ZWQoKXtjb25zdCByZW1vdmVkPXRoaXMuX2RvbUJyZWFrcG9pbnRzO3RoaXMuX2RvbUJyZWFrcG9pbnRzPVtdO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cy5ET01CcmVha3BvaW50c1JlbW92ZWQscmVtb3ZlZCk7Y29uc3QgY3VycmVudFVSTD10aGlzLl9jdXJyZW50VVJMKCk7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgdGhpcy5fZG9tQnJlYWtwb2ludHNTZXR0aW5nLmdldCgpKXtpZihicmVha3BvaW50LnVybD09PWN1cnJlbnRVUkwpCnRoaXMuX2RvbU1vZGVsLnB1c2hOb2RlQnlQYXRoVG9Gcm9udGVuZChicmVha3BvaW50LnBhdGgpLnRoZW4oYXBwZW5kQnJlYWtwb2ludC5iaW5kKHRoaXMsYnJlYWtwb2ludCkpO30KZnVuY3Rpb24gYXBwZW5kQnJlYWtwb2ludChicmVha3BvaW50LG5vZGVJZCl7Y29uc3Qgbm9kZT1ub2RlSWQ/dGhpcy5fZG9tTW9kZWwubm9kZUZvcklkKG5vZGVJZCk6bnVsbDtpZighbm9kZSkKcmV0dXJuO2NvbnN0IGRvbUJyZWFrcG9pbnQ9bmV3IFNESy5ET01EZWJ1Z2dlck1vZGVsLkRPTUJyZWFrcG9pbnQodGhpcyxub2RlLGJyZWFrcG9pbnQudHlwZSxicmVha3BvaW50LmVuYWJsZWQpO3RoaXMuX2RvbUJyZWFrcG9pbnRzLnB1c2goZG9tQnJlYWtwb2ludCk7aWYoYnJlYWtwb2ludC5lbmFibGVkKQp0aGlzLl9lbmFibGVET01CcmVha3BvaW50KGRvbUJyZWFrcG9pbnQpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cy5ET01CcmVha3BvaW50QWRkZWQsZG9tQnJlYWtwb2ludCk7fX0KX3JlbW92ZURPTUJyZWFrcG9pbnRzKGZpbHRlcil7Y29uc3QgcmVtb3ZlZD1bXTtjb25zdCBsZWZ0PVtdO2Zvcihjb25zdCBicmVha3BvaW50IG9mIHRoaXMuX2RvbUJyZWFrcG9pbnRzKXtpZihmaWx0ZXIoYnJlYWtwb2ludCkpe3JlbW92ZWQucHVzaChicmVha3BvaW50KTtpZihicmVha3BvaW50LmVuYWJsZWQpe2JyZWFrcG9pbnQuZW5hYmxlZD1mYWxzZTt0aGlzLl9kaXNhYmxlRE9NQnJlYWtwb2ludChicmVha3BvaW50KTt9fWVsc2V7bGVmdC5wdXNoKGJyZWFrcG9pbnQpO319CmlmKCFyZW1vdmVkLmxlbmd0aCkKcmV0dXJuO3RoaXMuX2RvbUJyZWFrcG9pbnRzPWxlZnQ7dGhpcy5fc2F2ZURPTUJyZWFrcG9pbnRzKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTURlYnVnZ2VyTW9kZWwuRXZlbnRzLkRPTUJyZWFrcG9pbnRzUmVtb3ZlZCxyZW1vdmVkKTt9Cl9ub2RlUmVtb3ZlZChldmVudCl7Y29uc3Qgbm9kZT0oZXZlbnQuZGF0YS5ub2RlKTtjb25zdCBjaGlsZHJlbj1ub2RlLmNoaWxkcmVuKCl8fFtdO3RoaXMuX3JlbW92ZURPTUJyZWFrcG9pbnRzKGJyZWFrcG9pbnQ9PmJyZWFrcG9pbnQubm9kZT09PW5vZGV8fGNoaWxkcmVuLmluZGV4T2YoYnJlYWtwb2ludC5ub2RlKSE9PS0xKTt9Cl9zYXZlRE9NQnJlYWtwb2ludHMoKXtjb25zdCBjdXJyZW50VVJMPXRoaXMuX2N1cnJlbnRVUkwoKTtjb25zdCBicmVha3BvaW50cz10aGlzLl9kb21CcmVha3BvaW50c1NldHRpbmcuZ2V0KCkuZmlsdGVyKGJyZWFrcG9pbnQ9PmJyZWFrcG9pbnQudXJsIT09Y3VycmVudFVSTCk7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgdGhpcy5fZG9tQnJlYWtwb2ludHMpe2JyZWFrcG9pbnRzLnB1c2goe3VybDpjdXJyZW50VVJMLHBhdGg6YnJlYWtwb2ludC5ub2RlLnBhdGgoKSx0eXBlOmJyZWFrcG9pbnQudHlwZSxlbmFibGVkOmJyZWFrcG9pbnQuZW5hYmxlZH0pO30KdGhpcy5fZG9tQnJlYWtwb2ludHNTZXR0aW5nLnNldChicmVha3BvaW50cyk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5ET01EZWJ1Z2dlck1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00sZmFsc2UpO1NESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cz17RE9NQnJlYWtwb2ludEFkZGVkOlN5bWJvbCgnRE9NQnJlYWtwb2ludEFkZGVkJyksRE9NQnJlYWtwb2ludFRvZ2dsZWQ6U3ltYm9sKCdET01CcmVha3BvaW50VG9nZ2xlZCcpLERPTUJyZWFrcG9pbnRzUmVtb3ZlZDpTeW1ib2woJ0RPTUJyZWFrcG9pbnRzUmVtb3ZlZCcpLH07U0RLLkRPTURlYnVnZ2VyTW9kZWwuRE9NQnJlYWtwb2ludD1jbGFzc3tjb25zdHJ1Y3Rvcihkb21EZWJ1Z2dlck1vZGVsLG5vZGUsdHlwZSxlbmFibGVkKXt0aGlzLmRvbURlYnVnZ2VyTW9kZWw9ZG9tRGVidWdnZXJNb2RlbDt0aGlzLm5vZGU9bm9kZTt0aGlzLnR5cGU9dHlwZTt0aGlzLmVuYWJsZWQ9ZW5hYmxlZDt9fTtTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50LlR5cGU9UHJvdG9jb2wuRE9NRGVidWdnZXIuRE9NQnJlYWtwb2ludFR5cGU7U0RLLkRPTURlYnVnZ2VyTW9kZWwuRE9NQnJlYWtwb2ludC5NYXJrZXI9J2JyZWFrcG9pbnQtbWFya2VyJztTREsuRXZlbnRMaXN0ZW5lcj1jbGFzc3tjb25zdHJ1Y3Rvcihkb21EZWJ1Z2dlck1vZGVsLGV2ZW50VGFyZ2V0LHR5cGUsdXNlQ2FwdHVyZSxwYXNzaXZlLG9uY2UsaGFuZGxlcixvcmlnaW5hbEhhbmRsZXIsbG9jYXRpb24sY3VzdG9tUmVtb3ZlRnVuY3Rpb24sb3JpZ2luKXt0aGlzLl9kb21EZWJ1Z2dlck1vZGVsPWRvbURlYnVnZ2VyTW9kZWw7dGhpcy5fZXZlbnRUYXJnZXQ9ZXZlbnRUYXJnZXQ7dGhpcy5fdHlwZT10eXBlO3RoaXMuX3VzZUNhcHR1cmU9dXNlQ2FwdHVyZTt0aGlzLl9wYXNzaXZlPXBhc3NpdmU7dGhpcy5fb25jZT1vbmNlO3RoaXMuX2hhbmRsZXI9aGFuZGxlcjt0aGlzLl9vcmlnaW5hbEhhbmRsZXI9b3JpZ2luYWxIYW5kbGVyfHxoYW5kbGVyO3RoaXMuX2xvY2F0aW9uPWxvY2F0aW9uO2NvbnN0IHNjcmlwdD1sb2NhdGlvbi5zY3JpcHQoKTt0aGlzLl9zb3VyY2VVUkw9c2NyaXB0P3NjcmlwdC5jb250ZW50VVJMKCk6Jyc7dGhpcy5fY3VzdG9tUmVtb3ZlRnVuY3Rpb249Y3VzdG9tUmVtb3ZlRnVuY3Rpb247dGhpcy5fb3JpZ2luPW9yaWdpbnx8U0RLLkV2ZW50TGlzdGVuZXIuT3JpZ2luLlJhdzt9CmRvbURlYnVnZ2VyTW9kZWwoKXtyZXR1cm4gdGhpcy5fZG9tRGVidWdnZXJNb2RlbDt9CnR5cGUoKXtyZXR1cm4gdGhpcy5fdHlwZTt9CnVzZUNhcHR1cmUoKXtyZXR1cm4gdGhpcy5fdXNlQ2FwdHVyZTt9CnBhc3NpdmUoKXtyZXR1cm4gdGhpcy5fcGFzc2l2ZTt9Cm9uY2UoKXtyZXR1cm4gdGhpcy5fb25jZTt9CmhhbmRsZXIoKXtyZXR1cm4gdGhpcy5faGFuZGxlcjt9CmxvY2F0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uO30Kc291cmNlVVJMKCl7cmV0dXJuIHRoaXMuX3NvdXJjZVVSTDt9Cm9yaWdpbmFsSGFuZGxlcigpe3JldHVybiB0aGlzLl9vcmlnaW5hbEhhbmRsZXI7fQpjYW5SZW1vdmUoKXtyZXR1cm4hIXRoaXMuX2N1c3RvbVJlbW92ZUZ1bmN0aW9ufHx0aGlzLl9vcmlnaW4hPT1TREsuRXZlbnRMaXN0ZW5lci5PcmlnaW4uRnJhbWV3b3JrVXNlcjt9CnJlbW92ZSgpe2lmKCF0aGlzLmNhblJlbW92ZSgpKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYodGhpcy5fb3JpZ2luIT09U0RLLkV2ZW50TGlzdGVuZXIuT3JpZ2luLkZyYW1ld29ya1VzZXIpe2Z1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsbGlzdGVuZXIsdXNlQ2FwdHVyZSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsbGlzdGVuZXIsdXNlQ2FwdHVyZSk7aWYodGhpc1snb24nK3R5cGVdKQp0aGlzWydvbicrdHlwZV09dW5kZWZpbmVkO30KcmV0dXJuKHRoaXMuX2V2ZW50VGFyZ2V0LmNhbGxGdW5jdGlvblByb21pc2UocmVtb3ZlTGlzdGVuZXIsW1NESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQodGhpcy5fdHlwZSksU0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudCh0aGlzLl9vcmlnaW5hbEhhbmRsZXIpLFNESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQodGhpcy5fdXNlQ2FwdHVyZSldKSk7fQpyZXR1cm4gdGhpcy5fY3VzdG9tUmVtb3ZlRnVuY3Rpb24uY2FsbEZ1bmN0aW9uUHJvbWlzZShjYWxsQ3VzdG9tUmVtb3ZlLFtTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHRoaXMuX3R5cGUpLFNESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQodGhpcy5fb3JpZ2luYWxIYW5kbGVyKSxTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHRoaXMuX3VzZUNhcHR1cmUpLFNESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQodGhpcy5fcGFzc2l2ZSksXSkudGhlbigoKT0+dW5kZWZpbmVkKTtmdW5jdGlvbiBjYWxsQ3VzdG9tUmVtb3ZlKHR5cGUsbGlzdGVuZXIsdXNlQ2FwdHVyZSxwYXNzaXZlKXt0aGlzLmNhbGwobnVsbCx0eXBlLGxpc3RlbmVyLHVzZUNhcHR1cmUscGFzc2l2ZSk7fX0KY2FuVG9nZ2xlUGFzc2l2ZSgpe3JldHVybiB0aGlzLl9vcmlnaW4hPT1TREsuRXZlbnRMaXN0ZW5lci5PcmlnaW4uRnJhbWV3b3JrVXNlcjt9CnRvZ2dsZVBhc3NpdmUoKXtyZXR1cm4odGhpcy5fZXZlbnRUYXJnZXQuY2FsbEZ1bmN0aW9uUHJvbWlzZShjYWxsVG9nZ2xlUGFzc2l2ZSxbU0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudCh0aGlzLl90eXBlKSxTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHRoaXMuX29yaWdpbmFsSGFuZGxlciksU0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudCh0aGlzLl91c2VDYXB0dXJlKSxTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHRoaXMuX3Bhc3NpdmUpLF0pKTtmdW5jdGlvbiBjYWxsVG9nZ2xlUGFzc2l2ZSh0eXBlLGxpc3RlbmVyLHVzZUNhcHR1cmUscGFzc2l2ZSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsbGlzdGVuZXIse2NhcHR1cmU6dXNlQ2FwdHVyZX0pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGxpc3RlbmVyLHtjYXB0dXJlOnVzZUNhcHR1cmUscGFzc2l2ZTohcGFzc2l2ZX0pO319Cm9yaWdpbigpe3JldHVybiB0aGlzLl9vcmlnaW47fQptYXJrQXNGcmFtZXdvcmsoKXt0aGlzLl9vcmlnaW49U0RLLkV2ZW50TGlzdGVuZXIuT3JpZ2luLkZyYW1ld29yazt9CmlzU2Nyb2xsQmxvY2tpbmdUeXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU9PT0ndG91Y2hzdGFydCd8fHRoaXMuX3R5cGU9PT0ndG91Y2htb3ZlJ3x8dGhpcy5fdHlwZT09PSdtb3VzZXdoZWVsJ3x8dGhpcy5fdHlwZT09PSd3aGVlbCc7fX07U0RLLkV2ZW50TGlzdGVuZXIuT3JpZ2luPXtSYXc6J1JhdycsRnJhbWV3b3JrOidGcmFtZXdvcmsnLEZyYW1ld29ya1VzZXI6J0ZyYW1ld29ya1VzZXInfTtTREsuRE9NRGVidWdnZXJNb2RlbC5FdmVudExpc3RlbmVyQnJlYWtwb2ludD1jbGFzc3tjb25zdHJ1Y3RvcihpbnN0cnVtZW50YXRpb25OYW1lLGV2ZW50TmFtZSxldmVudFRhcmdldE5hbWVzLGNhdGVnb3J5LHRpdGxlKXt0aGlzLl9pbnN0cnVtZW50YXRpb25OYW1lPWluc3RydW1lbnRhdGlvbk5hbWU7dGhpcy5fZXZlbnROYW1lPWV2ZW50TmFtZTt0aGlzLl9ldmVudFRhcmdldE5hbWVzPWV2ZW50VGFyZ2V0TmFtZXM7dGhpcy5fY2F0ZWdvcnk9Y2F0ZWdvcnk7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5fZW5hYmxlZD1mYWxzZTt9CmNhdGVnb3J5KCl7cmV0dXJuIHRoaXMuX2NhdGVnb3J5O30KZW5hYmxlZCgpe3JldHVybiB0aGlzLl9lbmFibGVkO30Kc2V0RW5hYmxlZChlbmFibGVkKXtpZih0aGlzLl9lbmFibGVkPT09ZW5hYmxlZCkKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9ZW5hYmxlZDtmb3IoY29uc3QgbW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5ET01EZWJ1Z2dlck1vZGVsKSkKdGhpcy5fdXBkYXRlT25Nb2RlbChtb2RlbCk7fQpfdXBkYXRlT25Nb2RlbChtb2RlbCl7aWYodGhpcy5faW5zdHJ1bWVudGF0aW9uTmFtZSl7aWYodGhpcy5fZW5hYmxlZCkKbW9kZWwuX2FnZW50LnNldEluc3RydW1lbnRhdGlvbkJyZWFrcG9pbnQodGhpcy5faW5zdHJ1bWVudGF0aW9uTmFtZSk7ZWxzZQptb2RlbC5fYWdlbnQucmVtb3ZlSW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludCh0aGlzLl9pbnN0cnVtZW50YXRpb25OYW1lKTt9ZWxzZXtmb3IoY29uc3QgZXZlbnRUYXJnZXROYW1lIG9mIHRoaXMuX2V2ZW50VGFyZ2V0TmFtZXMpe2lmKHRoaXMuX2VuYWJsZWQpCm1vZGVsLl9hZ2VudC5zZXRFdmVudExpc3RlbmVyQnJlYWtwb2ludCh0aGlzLl9ldmVudE5hbWUsZXZlbnRUYXJnZXROYW1lKTtlbHNlCm1vZGVsLl9hZ2VudC5yZW1vdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCh0aGlzLl9ldmVudE5hbWUsZXZlbnRUYXJnZXROYW1lKTt9fX0KdGl0bGUoKXtyZXR1cm4gdGhpcy5fdGl0bGU7fX07U0RLLkRPTURlYnVnZ2VyTW9kZWwuRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQuX2xpc3RlbmVyPSdsaXN0ZW5lcjonO1NESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50TGlzdGVuZXJCcmVha3BvaW50Ll9pbnN0cnVtZW50YXRpb249J2luc3RydW1lbnRhdGlvbjonO1NESy5ET01EZWJ1Z2dlck1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl94aHJCcmVha3BvaW50c1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygneGhyQnJlYWtwb2ludHMnLFtdKTt0aGlzLl94aHJCcmVha3BvaW50cz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgdGhpcy5feGhyQnJlYWtwb2ludHNTZXR0aW5nLmdldCgpKQp0aGlzLl94aHJCcmVha3BvaW50cy5zZXQoYnJlYWtwb2ludC51cmwsYnJlYWtwb2ludC5lbmFibGVkKTt0aGlzLl9ldmVudExpc3RlbmVyQnJlYWtwb2ludHM9W107dGhpcy5fY3JlYXRlSW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdBbmltYXRpb24nKSxbJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsJ2NhbmNlbEFuaW1hdGlvbkZyYW1lJywncmVxdWVzdEFuaW1hdGlvbkZyYW1lLmNhbGxiYWNrJ10pO3RoaXMuX2NyZWF0ZUluc3RydW1lbnRhdGlvbkJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnQ2FudmFzJyksWydjYW52YXNDb250ZXh0Q3JlYXRlZCcsJ3dlYmdsRXJyb3JGaXJlZCcsJ3dlYmdsV2FybmluZ0ZpcmVkJ10pO3RoaXMuX2NyZWF0ZUluc3RydW1lbnRhdGlvbkJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnR2VvbG9jYXRpb24nKSxbJ0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbicsJ0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24nXSk7dGhpcy5fY3JlYXRlSW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdOb3RpZmljYXRpb24nKSxbJ05vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbiddKTt0aGlzLl9jcmVhdGVJbnN0cnVtZW50YXRpb25CcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ1BhcnNlJyksWydFbGVtZW50LnNldElubmVySFRNTCcsJ0RvY3VtZW50LndyaXRlJ10pO3RoaXMuX2NyZWF0ZUluc3RydW1lbnRhdGlvbkJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnU2NyaXB0JyksWydzY3JpcHRGaXJzdFN0YXRlbWVudCcsJ3NjcmlwdEJsb2NrZWRCeUNTUCddKTt0aGlzLl9jcmVhdGVJbnN0cnVtZW50YXRpb25CcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ1RpbWVyJyksWydzZXRUaW1lb3V0JywnY2xlYXJUaW1lb3V0Jywnc2V0SW50ZXJ2YWwnLCdjbGVhckludGVydmFsJywnc2V0VGltZW91dC5jYWxsYmFjaycsJ3NldEludGVydmFsLmNhbGxiYWNrJ10pO3RoaXMuX2NyZWF0ZUluc3RydW1lbnRhdGlvbkJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnV2luZG93JyksWydET01XaW5kb3cuY2xvc2UnXSk7dGhpcy5fY3JlYXRlSW5zdHJ1bWVudGF0aW9uQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdXZWJBdWRpbycpLFsnYXVkaW9Db250ZXh0Q3JlYXRlZCcsJ2F1ZGlvQ29udGV4dENsb3NlZCcsJ2F1ZGlvQ29udGV4dFJlc3VtZWQnLCdhdWRpb0NvbnRleHRTdXNwZW5kZWQnXSk7dGhpcy5fY3JlYXRlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnTWVkaWEnKSxbJ3BsYXknLCdwYXVzZScsJ3BsYXlpbmcnLCdjYW5wbGF5JywnY2FucGxheXRocm91Z2gnLCdzZWVraW5nJywnc2Vla2VkJywndGltZXVwZGF0ZScsJ2VuZGVkJywncmF0ZWNoYW5nZScsJ2R1cmF0aW9uY2hhbmdlJywndm9sdW1lY2hhbmdlJywnbG9hZHN0YXJ0JywncHJvZ3Jlc3MnLCdzdXNwZW5kJywnYWJvcnQnLCdlcnJvcicsJ2VtcHRpZWQnLCdzdGFsbGVkJywnbG9hZGVkbWV0YWRhdGEnLCdsb2FkZWRkYXRhJywnd2FpdGluZyddLFsnYXVkaW8nLCd2aWRlbyddKTt0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVyQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdDbGlwYm9hcmQnKSxbJ2NvcHknLCdjdXQnLCdwYXN0ZScsJ2JlZm9yZWNvcHknLCdiZWZvcmVjdXQnLCdiZWZvcmVwYXN0ZSddLFsnKiddKTt0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVyQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdDb250cm9sJyksWydyZXNpemUnLCdzY3JvbGwnLCd6b29tJywnZm9jdXMnLCdibHVyJywnc2VsZWN0JywnY2hhbmdlJywnc3VibWl0JywncmVzZXQnXSxbJyonXSk7dGhpcy5fY3JlYXRlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnRGV2aWNlJyksWydkZXZpY2VvcmllbnRhdGlvbicsJ2RldmljZW1vdGlvbiddLFsnKiddKTt0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVyQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdET00gTXV0YXRpb24nKSxbJ0RPTUFjdGl2YXRlJywnRE9NRm9jdXNJbicsJ0RPTUZvY3VzT3V0JywnRE9NQXR0ck1vZGlmaWVkJywnRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkJywnRE9NTm9kZUluc2VydGVkJywnRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50JywnRE9NTm9kZVJlbW92ZWQnLCdET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCcsJ0RPTVN1YnRyZWVNb2RpZmllZCcsJ0RPTUNvbnRlbnRMb2FkZWQnXSxbJyonXSk7dGhpcy5fY3JlYXRlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnRHJhZyAvIGRyb3AnKSxbJ2RyYWcnLCdkcmFnc3RhcnQnLCdkcmFnZW5kJywnZHJhZ2VudGVyJywnZHJhZ292ZXInLCdkcmFnbGVhdmUnLCdkcm9wJ10sWycqJ10pO3RoaXMuX2NyZWF0ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ0tleWJvYXJkJyksWydrZXlkb3duJywna2V5dXAnLCdrZXlwcmVzcycsJ2lucHV0J10sWycqJ10pO3RoaXMuX2NyZWF0ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ0xvYWQnKSxbJ2xvYWQnLCdiZWZvcmV1bmxvYWQnLCd1bmxvYWQnLCdhYm9ydCcsJ2Vycm9yJywnaGFzaGNoYW5nZScsJ3BvcHN0YXRlJ10sWycqJ10pO3RoaXMuX2NyZWF0ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ01vdXNlJyksWydhdXhjbGljaycsJ2NsaWNrJywnZGJsY2xpY2snLCdtb3VzZWRvd24nLCdtb3VzZXVwJywnbW91c2VvdmVyJywnbW91c2Vtb3ZlJywnbW91c2VvdXQnLCdtb3VzZWVudGVyJywnbW91c2VsZWF2ZScsJ21vdXNld2hlZWwnLCd3aGVlbCcsJ2NvbnRleHRtZW51J10sWycqJ10pO3RoaXMuX2NyZWF0ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ1BvaW50ZXInKSxbJ3BvaW50ZXJvdmVyJywncG9pbnRlcm91dCcsJ3BvaW50ZXJlbnRlcicsJ3BvaW50ZXJsZWF2ZScsJ3BvaW50ZXJkb3duJywncG9pbnRlcnVwJywncG9pbnRlcm1vdmUnLCdwb2ludGVyY2FuY2VsJywnZ290cG9pbnRlcmNhcHR1cmUnLCdsb3N0cG9pbnRlcmNhcHR1cmUnXSxbJyonXSk7dGhpcy5fY3JlYXRlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKENvbW1vbi5VSVN0cmluZygnVG91Y2gnKSxbJ3RvdWNoc3RhcnQnLCd0b3VjaG1vdmUnLCd0b3VjaGVuZCcsJ3RvdWNoY2FuY2VsJ10sWycqJ10pO3RoaXMuX2NyZWF0ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50cyhDb21tb24uVUlTdHJpbmcoJ1dvcmtlcicpLFsnbWVzc2FnZScsJ21lc3NhZ2VlcnJvciddLFsnKiddKTt0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVyQnJlYWtwb2ludHMoQ29tbW9uLlVJU3RyaW5nKCdYSFInKSxbJ3JlYWR5c3RhdGVjaGFuZ2UnLCdsb2FkJywnbG9hZHN0YXJ0JywnbG9hZGVuZCcsJ2Fib3J0JywnZXJyb3InLCdwcm9ncmVzcycsJ3RpbWVvdXQnXSxbJ3htbGh0dHByZXF1ZXN0JywneG1saHR0cHJlcXVlc3R1cGxvYWQnXSk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246c2V0VGltZW91dC5jYWxsYmFjaycpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ3NldFRpbWVvdXQgZmlyZWQnKTt0aGlzLl9yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJ2luc3RydW1lbnRhdGlvbjpzZXRJbnRlcnZhbC5jYWxsYmFjaycpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ3NldEludGVydmFsIGZpcmVkJyk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246c2NyaXB0Rmlyc3RTdGF0ZW1lbnQnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTY3JpcHQgRmlyc3QgU3RhdGVtZW50Jyk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246c2NyaXB0QmxvY2tlZEJ5Q1NQJykuX3RpdGxlPUNvbW1vbi5VSVN0cmluZygnU2NyaXB0IEJsb2NrZWQgYnkgQ29udGVudCBTZWN1cml0eSBQb2xpY3knKTt0aGlzLl9yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJ2luc3RydW1lbnRhdGlvbjpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZScpO3RoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCgnaW5zdHJ1bWVudGF0aW9uOmNhbmNlbEFuaW1hdGlvbkZyYW1lJykuX3RpdGxlPUNvbW1vbi5VSVN0cmluZygnQ2FuY2VsIEFuaW1hdGlvbiBGcmFtZScpO3RoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCgnaW5zdHJ1bWVudGF0aW9uOnJlcXVlc3RBbmltYXRpb25GcmFtZS5jYWxsYmFjaycpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ0FuaW1hdGlvbiBGcmFtZSBGaXJlZCcpO3RoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCgnaW5zdHJ1bWVudGF0aW9uOndlYmdsRXJyb3JGaXJlZCcpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ1dlYkdMIEVycm9yIEZpcmVkJyk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246d2ViZ2xXYXJuaW5nRmlyZWQnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdXZWJHTCBXYXJuaW5nIEZpcmVkJyk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246RWxlbWVudC5zZXRJbm5lckhUTUwnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTZXQgaW5uZXJIVE1MJyk7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246Y2FudmFzQ29udGV4dENyZWF0ZWQnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdDcmVhdGUgY2FudmFzIGNvbnRleHQnKTt0aGlzLl9yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJ2luc3RydW1lbnRhdGlvbjpHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24nKS5fdGl0bGU9J2dldEN1cnJlbnRQb3NpdGlvbic7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246R2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbicpLl90aXRsZT0nd2F0Y2hQb3NpdGlvbic7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246Tm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uJykuX3RpdGxlPSdyZXF1ZXN0UGVybWlzc2lvbic7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246RE9NV2luZG93LmNsb3NlJykuX3RpdGxlPSd3aW5kb3cuY2xvc2UnO3RoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCgnaW5zdHJ1bWVudGF0aW9uOkRvY3VtZW50LndyaXRlJykuX3RpdGxlPSdkb2N1bWVudC53cml0ZSc7dGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KCdpbnN0cnVtZW50YXRpb246YXVkaW9Db250ZXh0Q3JlYXRlZCcpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ0NyZWF0ZSBBdWRpb0NvbnRleHQnKTt0aGlzLl9yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJ2luc3RydW1lbnRhdGlvbjphdWRpb0NvbnRleHRDbG9zZWQnKS5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdDbG9zZSBBdWRpb0NvbnRleHQnKTt0aGlzLl9yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJ2luc3RydW1lbnRhdGlvbjphdWRpb0NvbnRleHRSZXN1bWVkJykuX3RpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVzdW1lIEF1ZGlvQ29udGV4dCcpO3RoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludCgnaW5zdHJ1bWVudGF0aW9uOmF1ZGlvQ29udGV4dFN1c3BlbmRlZCcpLl90aXRsZT1Db21tb24uVUlTdHJpbmcoJ1N1c3BlbmQgQXVkaW9Db250ZXh0Jyk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuRE9NRGVidWdnZXJNb2RlbCx0aGlzKTt9Cl9jcmVhdGVJbnN0cnVtZW50YXRpb25CcmVha3BvaW50cyhjYXRlZ29yeSxpbnN0cnVtZW50YXRpb25OYW1lcyl7Zm9yKGNvbnN0IGluc3RydW1lbnRhdGlvbk5hbWUgb2YgaW5zdHJ1bWVudGF0aW9uTmFtZXMpe3RoaXMuX2V2ZW50TGlzdGVuZXJCcmVha3BvaW50cy5wdXNoKG5ldyBTREsuRE9NRGVidWdnZXJNb2RlbC5FdmVudExpc3RlbmVyQnJlYWtwb2ludChpbnN0cnVtZW50YXRpb25OYW1lLCcnLFtdLGNhdGVnb3J5LGluc3RydW1lbnRhdGlvbk5hbWUpKTt9fQpfY3JlYXRlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKGNhdGVnb3J5LGV2ZW50TmFtZXMsZXZlbnRUYXJnZXROYW1lcyl7Zm9yKGNvbnN0IGV2ZW50TmFtZSBvZiBldmVudE5hbWVzKXt0aGlzLl9ldmVudExpc3RlbmVyQnJlYWtwb2ludHMucHVzaChuZXcgU0RLLkRPTURlYnVnZ2VyTW9kZWwuRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoJycsZXZlbnROYW1lLGV2ZW50VGFyZ2V0TmFtZXMsY2F0ZWdvcnksZXZlbnROYW1lKSk7fX0KX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludChldmVudE5hbWUsZXZlbnRUYXJnZXROYW1lKXtjb25zdCBpbnN0cnVtZW50YXRpb25QcmVmaXg9J2luc3RydW1lbnRhdGlvbjonO2NvbnN0IGxpc3RlbmVyUHJlZml4PSdsaXN0ZW5lcjonO2xldCBpbnN0cnVtZW50YXRpb25OYW1lPScnO2lmKGV2ZW50TmFtZS5zdGFydHNXaXRoKGluc3RydW1lbnRhdGlvblByZWZpeCkpe2luc3RydW1lbnRhdGlvbk5hbWU9ZXZlbnROYW1lLnN1YnN0cmluZyhpbnN0cnVtZW50YXRpb25QcmVmaXgubGVuZ3RoKTtldmVudE5hbWU9Jyc7fWVsc2UgaWYoZXZlbnROYW1lLnN0YXJ0c1dpdGgobGlzdGVuZXJQcmVmaXgpKXtldmVudE5hbWU9ZXZlbnROYW1lLnN1YnN0cmluZyhsaXN0ZW5lclByZWZpeC5sZW5ndGgpO31lbHNle3JldHVybiBudWxsO30KZXZlbnRUYXJnZXROYW1lPShldmVudFRhcmdldE5hbWV8fCcqJykudG9Mb3dlckNhc2UoKTtsZXQgcmVzdWx0PW51bGw7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKXtpZihpbnN0cnVtZW50YXRpb25OYW1lJiZicmVha3BvaW50Ll9pbnN0cnVtZW50YXRpb25OYW1lPT09aW5zdHJ1bWVudGF0aW9uTmFtZSkKcmVzdWx0PWJyZWFrcG9pbnQ7aWYoZXZlbnROYW1lJiZicmVha3BvaW50Ll9ldmVudE5hbWU9PT1ldmVudE5hbWUmJmJyZWFrcG9pbnQuX2V2ZW50VGFyZ2V0TmFtZXMuaW5kZXhPZihldmVudFRhcmdldE5hbWUpIT09LTEpCnJlc3VsdD1icmVha3BvaW50O2lmKCFyZXN1bHQmJmV2ZW50TmFtZSYmYnJlYWtwb2ludC5fZXZlbnROYW1lPT09ZXZlbnROYW1lJiZicmVha3BvaW50Ll9ldmVudFRhcmdldE5hbWVzLmluZGV4T2YoJyonKSE9PS0xKQpyZXN1bHQ9YnJlYWtwb2ludDt9CnJldHVybiByZXN1bHQ7fQpldmVudExpc3RlbmVyQnJlYWtwb2ludHMoKXtyZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzLnNsaWNlKCk7fQpyZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRUaXRsZShhdXhEYXRhKXtjb25zdCBpZD1hdXhEYXRhWydldmVudE5hbWUnXTtpZihpZD09PSdpbnN0cnVtZW50YXRpb246d2ViZ2xFcnJvckZpcmVkJyYmYXV4RGF0YVsnd2ViZ2xFcnJvck5hbWUnXSl7bGV0IGVycm9yTmFtZT1hdXhEYXRhWyd3ZWJnbEVycm9yTmFtZSddO2Vycm9yTmFtZT1lcnJvck5hbWUucmVwbGFjZSgvXi4qKDB4WzAtOWEtZl0rKS4qJC9pLCckMScpO3JldHVybiBDb21tb24uVUlTdHJpbmcoJ1dlYkdMIEVycm9yIEZpcmVkICglcyknLGVycm9yTmFtZSk7fQppZihpZD09PSdpbnN0cnVtZW50YXRpb246c2NyaXB0QmxvY2tlZEJ5Q1NQJyYmYXV4RGF0YVsnZGlyZWN0aXZlVGV4dCddKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTY3JpcHQgYmxvY2tlZCBkdWUgdG8gQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZGlyZWN0aXZlOiAlcycsYXV4RGF0YVsnZGlyZWN0aXZlVGV4dCddKTtjb25zdCBicmVha3BvaW50PXRoaXMuX3Jlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludChpZCxhdXhEYXRhWyd0YXJnZXROYW1lJ10pO2lmKCFicmVha3BvaW50KQpyZXR1cm4nJztpZihhdXhEYXRhWyd0YXJnZXROYW1lJ10pCnJldHVybiBhdXhEYXRhWyd0YXJnZXROYW1lJ10rJy4nK2JyZWFrcG9pbnQuX3RpdGxlO3JldHVybiBicmVha3BvaW50Ll90aXRsZTt9CnJlc29sdmVFdmVudExpc3RlbmVyQnJlYWtwb2ludChhdXhEYXRhKXtyZXR1cm4gdGhpcy5fcmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50KGF1eERhdGFbJ2V2ZW50TmFtZSddLGF1eERhdGFbJ3RhcmdldE5hbWUnXSk7fQp4aHJCcmVha3BvaW50cygpe3JldHVybiB0aGlzLl94aHJCcmVha3BvaW50czt9Cl9zYXZlWEhSQnJlYWtwb2ludHMoKXtjb25zdCBicmVha3BvaW50cz1bXTtmb3IoY29uc3QgdXJsIG9mIHRoaXMuX3hockJyZWFrcG9pbnRzLmtleXMoKSkKYnJlYWtwb2ludHMucHVzaCh7dXJsOnVybCxlbmFibGVkOnRoaXMuX3hockJyZWFrcG9pbnRzLmdldCh1cmwpfSk7dGhpcy5feGhyQnJlYWtwb2ludHNTZXR0aW5nLnNldChicmVha3BvaW50cyk7fQphZGRYSFJCcmVha3BvaW50KHVybCxlbmFibGVkKXt0aGlzLl94aHJCcmVha3BvaW50cy5zZXQodXJsLGVuYWJsZWQpO2lmKGVuYWJsZWQpe2Zvcihjb25zdCBtb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRPTURlYnVnZ2VyTW9kZWwpKQptb2RlbC5fYWdlbnQuc2V0WEhSQnJlYWtwb2ludCh1cmwpO30KdGhpcy5fc2F2ZVhIUkJyZWFrcG9pbnRzKCk7fQpyZW1vdmVYSFJCcmVha3BvaW50KHVybCl7Y29uc3QgZW5hYmxlZD10aGlzLl94aHJCcmVha3BvaW50cy5nZXQodXJsKTt0aGlzLl94aHJCcmVha3BvaW50cy5kZWxldGUodXJsKTtpZihlbmFibGVkKXtmb3IoY29uc3QgbW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5ET01EZWJ1Z2dlck1vZGVsKSkKbW9kZWwuX2FnZW50LnJlbW92ZVhIUkJyZWFrcG9pbnQodXJsKTt9CnRoaXMuX3NhdmVYSFJCcmVha3BvaW50cygpO30KdG9nZ2xlWEhSQnJlYWtwb2ludCh1cmwsZW5hYmxlZCl7dGhpcy5feGhyQnJlYWtwb2ludHMuc2V0KHVybCxlbmFibGVkKTtmb3IoY29uc3QgbW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5ET01EZWJ1Z2dlck1vZGVsKSl7aWYoZW5hYmxlZCkKbW9kZWwuX2FnZW50LnNldFhIUkJyZWFrcG9pbnQodXJsKTtlbHNlCm1vZGVsLl9hZ2VudC5yZW1vdmVYSFJCcmVha3BvaW50KHVybCk7fQp0aGlzLl9zYXZlWEhSQnJlYWtwb2ludHMoKTt9Cm1vZGVsQWRkZWQoZG9tRGVidWdnZXJNb2RlbCl7Zm9yKGNvbnN0IHVybCBvZiB0aGlzLl94aHJCcmVha3BvaW50cy5rZXlzKCkpe2lmKHRoaXMuX3hockJyZWFrcG9pbnRzLmdldCh1cmwpKQpkb21EZWJ1Z2dlck1vZGVsLl9hZ2VudC5zZXRYSFJCcmVha3BvaW50KHVybCk7fQpmb3IoY29uc3QgYnJlYWtwb2ludCBvZiB0aGlzLl9ldmVudExpc3RlbmVyQnJlYWtwb2ludHMpe2lmKGJyZWFrcG9pbnQuX2VuYWJsZWQpCmJyZWFrcG9pbnQuX3VwZGF0ZU9uTW9kZWwoZG9tRGVidWdnZXJNb2RlbCk7fX0KbW9kZWxSZW1vdmVkKGRvbURlYnVnZ2VyTW9kZWwpe319O1NESy5kb21EZWJ1Z2dlck1hbmFnZXI7O1NESy5ET01Ob2RlPWNsYXNze2NvbnN0cnVjdG9yKGRvbU1vZGVsKXt0aGlzLl9kb21Nb2RlbD1kb21Nb2RlbDt9CnN0YXRpYyBjcmVhdGUoZG9tTW9kZWwsZG9jLGlzSW5TaGFkb3dUcmVlLHBheWxvYWQpe2NvbnN0IG5vZGU9bmV3IFNESy5ET01Ob2RlKGRvbU1vZGVsKTtub2RlLl9pbml0KGRvYyxpc0luU2hhZG93VHJlZSxwYXlsb2FkKTtyZXR1cm4gbm9kZTt9Cl9pbml0KGRvYyxpc0luU2hhZG93VHJlZSxwYXlsb2FkKXt0aGlzLl9hZ2VudD10aGlzLl9kb21Nb2RlbC5fYWdlbnQ7dGhpcy5vd25lckRvY3VtZW50PWRvYzt0aGlzLl9pc0luU2hhZG93VHJlZT1pc0luU2hhZG93VHJlZTt0aGlzLmlkPXBheWxvYWQubm9kZUlkO3RoaXMuX2JhY2tlbmROb2RlSWQ9cGF5bG9hZC5iYWNrZW5kTm9kZUlkO3RoaXMuX2RvbU1vZGVsLl9pZFRvRE9NTm9kZVt0aGlzLmlkXT10aGlzO3RoaXMuX25vZGVUeXBlPXBheWxvYWQubm9kZVR5cGU7dGhpcy5fbm9kZU5hbWU9cGF5bG9hZC5ub2RlTmFtZTt0aGlzLl9sb2NhbE5hbWU9cGF5bG9hZC5sb2NhbE5hbWU7dGhpcy5fbm9kZVZhbHVlPXBheWxvYWQubm9kZVZhbHVlO3RoaXMuX3BzZXVkb1R5cGU9cGF5bG9hZC5wc2V1ZG9UeXBlO3RoaXMuX3NoYWRvd1Jvb3RUeXBlPXBheWxvYWQuc2hhZG93Um9vdFR5cGU7dGhpcy5fZnJhbWVPd25lckZyYW1lSWQ9cGF5bG9hZC5mcmFtZUlkfHxudWxsO3RoaXMuX3htbFZlcnNpb249cGF5bG9hZC54bWxWZXJzaW9uO3RoaXMuX2lzU1ZHTm9kZT0hIXBheWxvYWQuaXNTVkc7dGhpcy5fc2hhZG93Um9vdHM9W107dGhpcy5fYXR0cmlidXRlcz1bXTt0aGlzLl9hdHRyaWJ1dGVzTWFwPXt9O2lmKHBheWxvYWQuYXR0cmlidXRlcykKdGhpcy5fc2V0QXR0cmlidXRlc1BheWxvYWQocGF5bG9hZC5hdHRyaWJ1dGVzKTt0aGlzLl9tYXJrZXJzPW5ldyBNYXAoKTt0aGlzLl9zdWJ0cmVlTWFya2VyQ291bnQ9MDt0aGlzLl9jaGlsZE5vZGVDb3VudD1wYXlsb2FkLmNoaWxkTm9kZUNvdW50fHwwO3RoaXMuX2NoaWxkcmVuPW51bGw7dGhpcy5uZXh0U2libGluZz1udWxsO3RoaXMucHJldmlvdXNTaWJsaW5nPW51bGw7dGhpcy5maXJzdENoaWxkPW51bGw7dGhpcy5sYXN0Q2hpbGQ9bnVsbDt0aGlzLnBhcmVudE5vZGU9bnVsbDtpZihwYXlsb2FkLnNoYWRvd1Jvb3RzKXtmb3IobGV0IGk9MDtpPHBheWxvYWQuc2hhZG93Um9vdHMubGVuZ3RoOysraSl7Y29uc3Qgcm9vdD1wYXlsb2FkLnNoYWRvd1Jvb3RzW2ldO2NvbnN0IG5vZGU9U0RLLkRPTU5vZGUuY3JlYXRlKHRoaXMuX2RvbU1vZGVsLHRoaXMub3duZXJEb2N1bWVudCx0cnVlLHJvb3QpO3RoaXMuX3NoYWRvd1Jvb3RzLnB1c2gobm9kZSk7bm9kZS5wYXJlbnROb2RlPXRoaXM7fX0KaWYocGF5bG9hZC50ZW1wbGF0ZUNvbnRlbnQpe3RoaXMuX3RlbXBsYXRlQ29udGVudD1TREsuRE9NTm9kZS5jcmVhdGUodGhpcy5fZG9tTW9kZWwsdGhpcy5vd25lckRvY3VtZW50LHRydWUscGF5bG9hZC50ZW1wbGF0ZUNvbnRlbnQpO3RoaXMuX3RlbXBsYXRlQ29udGVudC5wYXJlbnROb2RlPXRoaXM7dGhpcy5fY2hpbGRyZW49W107fQppZihwYXlsb2FkLmNvbnRlbnREb2N1bWVudCl7dGhpcy5fY29udGVudERvY3VtZW50PW5ldyBTREsuRE9NRG9jdW1lbnQodGhpcy5fZG9tTW9kZWwscGF5bG9hZC5jb250ZW50RG9jdW1lbnQpO3RoaXMuX2NvbnRlbnREb2N1bWVudC5wYXJlbnROb2RlPXRoaXM7dGhpcy5fY2hpbGRyZW49W107fWVsc2UgaWYocGF5bG9hZC5ub2RlTmFtZT09PSdJRlJBTUUnJiZwYXlsb2FkLmZyYW1lSWQmJlJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdvb3BpZklubGluZURPTScpKXtjb25zdCBjaGlsZFRhcmdldD1TREsudGFyZ2V0TWFuYWdlci50YXJnZXRCeUlkKHBheWxvYWQuZnJhbWVJZCk7Y29uc3QgY2hpbGRNb2RlbD1jaGlsZFRhcmdldD9jaGlsZFRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpOm51bGw7aWYoY2hpbGRNb2RlbCkKdGhpcy5fY2hpbGREb2N1bWVudFByb21pc2VGb3JUZXN0aW5nPWNoaWxkTW9kZWwucmVxdWVzdERvY3VtZW50KCk7dGhpcy5fY2hpbGRyZW49W107fQppZihwYXlsb2FkLmltcG9ydGVkRG9jdW1lbnQpe3RoaXMuX2ltcG9ydGVkRG9jdW1lbnQ9U0RLLkRPTU5vZGUuY3JlYXRlKHRoaXMuX2RvbU1vZGVsLHRoaXMub3duZXJEb2N1bWVudCx0cnVlLHBheWxvYWQuaW1wb3J0ZWREb2N1bWVudCk7dGhpcy5faW1wb3J0ZWREb2N1bWVudC5wYXJlbnROb2RlPXRoaXM7dGhpcy5fY2hpbGRyZW49W107fQppZihwYXlsb2FkLmRpc3RyaWJ1dGVkTm9kZXMpCnRoaXMuX3NldERpc3RyaWJ1dGVkTm9kZVBheWxvYWRzKHBheWxvYWQuZGlzdHJpYnV0ZWROb2Rlcyk7aWYocGF5bG9hZC5jaGlsZHJlbikKdGhpcy5fc2V0Q2hpbGRyZW5QYXlsb2FkKHBheWxvYWQuY2hpbGRyZW4pO3RoaXMuX3NldFBzZXVkb0VsZW1lbnRzKHBheWxvYWQucHNldWRvRWxlbWVudHMpO2lmKHRoaXMuX25vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2lmKHRoaXMub3duZXJEb2N1bWVudCYmIXRoaXMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJnRoaXMuX25vZGVOYW1lPT09J0hUTUwnKQp0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PXRoaXM7aWYodGhpcy5vd25lckRvY3VtZW50JiYhdGhpcy5vd25lckRvY3VtZW50LmJvZHkmJnRoaXMuX25vZGVOYW1lPT09J0JPRFknKQp0aGlzLm93bmVyRG9jdW1lbnQuYm9keT10aGlzO31lbHNlIGlmKHRoaXMuX25vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9UWVBFX05PREUpe3RoaXMucHVibGljSWQ9cGF5bG9hZC5wdWJsaWNJZDt0aGlzLnN5c3RlbUlkPXBheWxvYWQuc3lzdGVtSWQ7dGhpcy5pbnRlcm5hbFN1YnNldD1wYXlsb2FkLmludGVybmFsU3Vic2V0O31lbHNlIGlmKHRoaXMuX25vZGVUeXBlPT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7dGhpcy5uYW1lPXBheWxvYWQubmFtZTt0aGlzLnZhbHVlPXBheWxvYWQudmFsdWU7fX0KaXNTVkdOb2RlKCl7cmV0dXJuIHRoaXMuX2lzU1ZHTm9kZTt9CmRvbU1vZGVsKCl7cmV0dXJuIHRoaXMuX2RvbU1vZGVsO30KYmFja2VuZE5vZGVJZCgpe3JldHVybiB0aGlzLl9iYWNrZW5kTm9kZUlkO30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4/dGhpcy5fY2hpbGRyZW4uc2xpY2UoKTpudWxsO30KaGFzQXR0cmlidXRlcygpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVzLmxlbmd0aD4wO30KY2hpbGROb2RlQ291bnQoKXtyZXR1cm4gdGhpcy5fY2hpbGROb2RlQ291bnQ7fQpoYXNTaGFkb3dSb290cygpe3JldHVybiEhdGhpcy5fc2hhZG93Um9vdHMubGVuZ3RoO30Kc2hhZG93Um9vdHMoKXtyZXR1cm4gdGhpcy5fc2hhZG93Um9vdHMuc2xpY2UoKTt9CnRlbXBsYXRlQ29udGVudCgpe3JldHVybiB0aGlzLl90ZW1wbGF0ZUNvbnRlbnR8fG51bGw7fQpjb250ZW50RG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5fY29udGVudERvY3VtZW50fHxudWxsO30KaXNJZnJhbWUoKXtyZXR1cm4gdGhpcy5fbm9kZU5hbWU9PT0nSUZSQU1FJzt9CmltcG9ydGVkRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5faW1wb3J0ZWREb2N1bWVudHx8bnVsbDt9Cm5vZGVUeXBlKCl7cmV0dXJuIHRoaXMuX25vZGVUeXBlO30Kbm9kZU5hbWUoKXtyZXR1cm4gdGhpcy5fbm9kZU5hbWU7fQpwc2V1ZG9UeXBlKCl7cmV0dXJuIHRoaXMuX3BzZXVkb1R5cGU7fQpoYXNQc2V1ZG9FbGVtZW50cygpe3JldHVybiB0aGlzLl9wc2V1ZG9FbGVtZW50cy5zaXplPjA7fQpwc2V1ZG9FbGVtZW50cygpe3JldHVybiB0aGlzLl9wc2V1ZG9FbGVtZW50czt9CmJlZm9yZVBzZXVkb0VsZW1lbnQoKXtpZighdGhpcy5fcHNldWRvRWxlbWVudHMpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9wc2V1ZG9FbGVtZW50cy5nZXQoU0RLLkRPTU5vZGUuUHNldWRvRWxlbWVudE5hbWVzLkJlZm9yZSk7fQphZnRlclBzZXVkb0VsZW1lbnQoKXtpZighdGhpcy5fcHNldWRvRWxlbWVudHMpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9wc2V1ZG9FbGVtZW50cy5nZXQoU0RLLkRPTU5vZGUuUHNldWRvRWxlbWVudE5hbWVzLkFmdGVyKTt9CmlzSW5zZXJ0aW9uUG9pbnQoKXtyZXR1cm4hdGhpcy5pc1hNTE5vZGUoKSYmKHRoaXMuX25vZGVOYW1lPT09J1NIQURPVyd8fHRoaXMuX25vZGVOYW1lPT09J0NPTlRFTlQnfHx0aGlzLl9ub2RlTmFtZT09PSdTTE9UJyk7fQpkaXN0cmlidXRlZE5vZGVzKCl7cmV0dXJuIHRoaXMuX2Rpc3RyaWJ1dGVkTm9kZXN8fFtdO30KaXNJblNoYWRvd1RyZWUoKXtyZXR1cm4gdGhpcy5faXNJblNoYWRvd1RyZWU7fQphbmNlc3RvclNoYWRvd0hvc3QoKXtjb25zdCBhbmNlc3RvclNoYWRvd1Jvb3Q9dGhpcy5hbmNlc3RvclNoYWRvd1Jvb3QoKTtyZXR1cm4gYW5jZXN0b3JTaGFkb3dSb290P2FuY2VzdG9yU2hhZG93Um9vdC5wYXJlbnROb2RlOm51bGw7fQphbmNlc3RvclNoYWRvd1Jvb3QoKXtpZighdGhpcy5faXNJblNoYWRvd1RyZWUpCnJldHVybiBudWxsO2xldCBjdXJyZW50PXRoaXM7d2hpbGUoY3VycmVudCYmIWN1cnJlbnQuaXNTaGFkb3dSb290KCkpCmN1cnJlbnQ9Y3VycmVudC5wYXJlbnROb2RlO3JldHVybiBjdXJyZW50O30KYW5jZXN0b3JVc2VyQWdlbnRTaGFkb3dSb290KCl7Y29uc3QgYW5jZXN0b3JTaGFkb3dSb290PXRoaXMuYW5jZXN0b3JTaGFkb3dSb290KCk7aWYoIWFuY2VzdG9yU2hhZG93Um9vdCkKcmV0dXJuIG51bGw7cmV0dXJuIGFuY2VzdG9yU2hhZG93Um9vdC5zaGFkb3dSb290VHlwZSgpPT09U0RLLkRPTU5vZGUuU2hhZG93Um9vdFR5cGVzLlVzZXJBZ2VudD9hbmNlc3RvclNoYWRvd1Jvb3Q6bnVsbDt9CmlzU2hhZG93Um9vdCgpe3JldHVybiEhdGhpcy5fc2hhZG93Um9vdFR5cGU7fQpzaGFkb3dSb290VHlwZSgpe3JldHVybiB0aGlzLl9zaGFkb3dSb290VHlwZXx8bnVsbDt9Cm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpe2NvbnN0IHNoYWRvd1Jvb3RUeXBlPXRoaXMuc2hhZG93Um9vdFR5cGUoKTtpZihzaGFkb3dSb290VHlwZSkKcmV0dXJuJyNzaGFkb3ctcm9vdCAoJytzaGFkb3dSb290VHlwZSsnKSc7aWYoIXRoaXMubG9jYWxOYW1lKCkpCnJldHVybiB0aGlzLm5vZGVOYW1lKCk7aWYodGhpcy5sb2NhbE5hbWUoKS5sZW5ndGghPT10aGlzLm5vZGVOYW1lKCkubGVuZ3RoKQpyZXR1cm4gdGhpcy5ub2RlTmFtZSgpO3JldHVybiB0aGlzLmxvY2FsTmFtZSgpO30Kc2V0Tm9kZU5hbWUobmFtZSxjYWxsYmFjayl7dGhpcy5fYWdlbnQuaW52b2tlX3NldE5vZGVOYW1lKHtub2RlSWQ6dGhpcy5pZCxuYW1lfSkudGhlbihyZXNwb25zZT0+e2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnRoaXMuX2RvbU1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8bnVsbCx0aGlzLl9kb21Nb2RlbC5ub2RlRm9ySWQocmVzcG9uc2Uubm9kZUlkKSk7fSk7fQpsb2NhbE5hbWUoKXtyZXR1cm4gdGhpcy5fbG9jYWxOYW1lO30Kbm9kZVZhbHVlKCl7cmV0dXJuIHRoaXMuX25vZGVWYWx1ZTt9CnNldE5vZGVWYWx1ZSh2YWx1ZSxjYWxsYmFjayl7dGhpcy5fYWdlbnQuaW52b2tlX3NldE5vZGVWYWx1ZSh7bm9kZUlkOnRoaXMuaWQsdmFsdWV9KS50aGVuKHJlc3BvbnNlPT57aWYoIXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKdGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTtpZihjYWxsYmFjaykKY2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdfHxudWxsKTt9KTt9CmdldEF0dHJpYnV0ZShuYW1lKXtjb25zdCBhdHRyPXRoaXMuX2F0dHJpYnV0ZXNNYXBbbmFtZV07cmV0dXJuIGF0dHI/YXR0ci52YWx1ZTp1bmRlZmluZWQ7fQpzZXRBdHRyaWJ1dGUobmFtZSx0ZXh0LGNhbGxiYWNrKXt0aGlzLl9hZ2VudC5pbnZva2Vfc2V0QXR0cmlidXRlc0FzVGV4dCh7bm9kZUlkOnRoaXMuaWQsdGV4dCxuYW1lfSkudGhlbihyZXNwb25zZT0+e2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnRoaXMuX2RvbU1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8bnVsbCk7fSk7fQpzZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLHZhbHVlLGNhbGxiYWNrKXt0aGlzLl9hZ2VudC5pbnZva2Vfc2V0QXR0cmlidXRlVmFsdWUoe25vZGVJZDp0aGlzLmlkLG5hbWUsdmFsdWV9KS50aGVuKHJlc3BvbnNlPT57aWYoIXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKdGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTtpZihjYWxsYmFjaykKY2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdfHxudWxsKTt9KTt9CnNldEF0dHJpYnV0ZVZhbHVlUHJvbWlzZShuYW1lLHZhbHVlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVsZmlsbD0+dGhpcy5zZXRBdHRyaWJ1dGVWYWx1ZShuYW1lLHZhbHVlLGZ1bGZpbGwpKTt9CmF0dHJpYnV0ZXMoKXtyZXR1cm4gdGhpcy5fYXR0cmlidXRlczt9CmFzeW5jIHJlbW92ZUF0dHJpYnV0ZShuYW1lKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2VfcmVtb3ZlQXR0cmlidXRlKHtub2RlSWQ6dGhpcy5pZCxuYW1lfSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQpyZXR1cm47ZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNNYXBbbmFtZV07Y29uc3QgaW5kZXg9dGhpcy5fYXR0cmlidXRlcy5maW5kSW5kZXgoYXR0cj0+YXR0ci5uYW1lPT09bmFtZSk7aWYoaW5kZXghPT0tMSkKdGhpcy5fYXR0cmlidXRlcy5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTt9CmdldENoaWxkTm9kZXMoY2FsbGJhY2spe2lmKHRoaXMuX2NoaWxkcmVuKXtjYWxsYmFjayh0aGlzLmNoaWxkcmVuKCkpO3JldHVybjt9CnRoaXMuX2FnZW50Lmludm9rZV9yZXF1ZXN0Q2hpbGROb2Rlcyh7bm9kZUlkOnRoaXMuaWR9KS50aGVuKHJlc3BvbnNlPT57Y2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdP251bGw6dGhpcy5jaGlsZHJlbigpKTt9KTt9CmFzeW5jIGdldFN1YnRyZWUoZGVwdGgscGllcmNlKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2VfcmVxdWVzdENoaWxkTm9kZXMoe25vZGVJZDp0aGlzLmlkLGRlcHRoOmRlcHRoLHBpZXJjZTpwaWVyY2V9KTtyZXR1cm4gcmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdP251bGw6dGhpcy5fY2hpbGRyZW47fQpnZXRPdXRlckhUTUwoKXtyZXR1cm4gdGhpcy5fYWdlbnQuZ2V0T3V0ZXJIVE1MKHRoaXMuaWQpO30Kc2V0T3V0ZXJIVE1MKGh0bWwsY2FsbGJhY2spe3RoaXMuX2FnZW50Lmludm9rZV9zZXRPdXRlckhUTUwoe25vZGVJZDp0aGlzLmlkLG91dGVySFRNTDpodG1sfSkudGhlbihyZXNwb25zZT0+e2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnRoaXMuX2RvbU1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8bnVsbCk7fSk7fQpyZW1vdmVOb2RlKGNhbGxiYWNrKXt0aGlzLl9hZ2VudC5pbnZva2VfcmVtb3ZlTm9kZSh7bm9kZUlkOnRoaXMuaWR9KS50aGVuKHJlc3BvbnNlPT57aWYoIXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKdGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTtpZihjYWxsYmFjaykKY2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdfHxudWxsKTt9KTt9CmFzeW5jIGNvcHlOb2RlKCl7Y29uc3QgdGV4dD1hd2FpdCB0aGlzLl9hZ2VudC5nZXRPdXRlckhUTUwodGhpcy5pZCk7aWYodGV4dCE9PW51bGwpCkluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dCh0ZXh0KTtyZXR1cm4gdGV4dDt9CnBhdGgoKXtmdW5jdGlvbiBjYW5QdXNoKG5vZGUpe3JldHVybiBub2RlJiYoJ2luZGV4J2luIG5vZGV8fChub2RlLmlzU2hhZG93Um9vdCgpJiZub2RlLnBhcmVudE5vZGUpKSYmbm9kZS5fbm9kZU5hbWUubGVuZ3RoO30KY29uc3QgcGF0aD1bXTtsZXQgbm9kZT10aGlzO3doaWxlKGNhblB1c2gobm9kZSkpe2NvbnN0IGluZGV4PXR5cGVvZiBub2RlLmluZGV4PT09J251bWJlcic/bm9kZS5pbmRleDoobm9kZS5zaGFkb3dSb290VHlwZSgpPT09U0RLLkRPTU5vZGUuU2hhZG93Um9vdFR5cGVzLlVzZXJBZ2VudD8ndSc6J2EnKTtwYXRoLnB1c2goW2luZGV4LG5vZGUuX25vZGVOYW1lXSk7bm9kZT1ub2RlLnBhcmVudE5vZGU7fQpwYXRoLnJldmVyc2UoKTtyZXR1cm4gcGF0aC5qb2luKCcsJyk7fQppc0FuY2VzdG9yKG5vZGUpe2lmKCFub2RlKQpyZXR1cm4gZmFsc2U7bGV0IGN1cnJlbnROb2RlPW5vZGUucGFyZW50Tm9kZTt3aGlsZShjdXJyZW50Tm9kZSl7aWYodGhpcz09PWN1cnJlbnROb2RlKQpyZXR1cm4gdHJ1ZTtjdXJyZW50Tm9kZT1jdXJyZW50Tm9kZS5wYXJlbnROb2RlO30KcmV0dXJuIGZhbHNlO30KaXNEZXNjZW5kYW50KGRlc2NlbmRhbnQpe3JldHVybiBkZXNjZW5kYW50IT09bnVsbCYmZGVzY2VuZGFudC5pc0FuY2VzdG9yKHRoaXMpO30KZnJhbWVJZCgpe2xldCBub2RlPXRoaXMucGFyZW50Tm9kZXx8dGhpczt3aGlsZSghbm9kZS5fZnJhbWVPd25lckZyYW1lSWQmJm5vZGUucGFyZW50Tm9kZSkKbm9kZT1ub2RlLnBhcmVudE5vZGU7cmV0dXJuIG5vZGUuX2ZyYW1lT3duZXJGcmFtZUlkO30KX3NldEF0dHJpYnV0ZXNQYXlsb2FkKGF0dHJzKXtsZXQgYXR0cmlidXRlc0NoYW5nZWQ9IXRoaXMuX2F0dHJpYnV0ZXN8fGF0dHJzLmxlbmd0aCE9PXRoaXMuX2F0dHJpYnV0ZXMubGVuZ3RoKjI7Y29uc3Qgb2xkQXR0cmlidXRlc01hcD10aGlzLl9hdHRyaWJ1dGVzTWFwfHx7fTt0aGlzLl9hdHRyaWJ1dGVzPVtdO3RoaXMuX2F0dHJpYnV0ZXNNYXA9e307Zm9yKGxldCBpPTA7aTxhdHRycy5sZW5ndGg7aSs9Mil7Y29uc3QgbmFtZT1hdHRyc1tpXTtjb25zdCB2YWx1ZT1hdHRyc1tpKzFdO3RoaXMuX2FkZEF0dHJpYnV0ZShuYW1lLHZhbHVlKTtpZihhdHRyaWJ1dGVzQ2hhbmdlZCkKY29udGludWU7aWYoIW9sZEF0dHJpYnV0ZXNNYXBbbmFtZV18fG9sZEF0dHJpYnV0ZXNNYXBbbmFtZV0udmFsdWUhPT12YWx1ZSkKYXR0cmlidXRlc0NoYW5nZWQ9dHJ1ZTt9CnJldHVybiBhdHRyaWJ1dGVzQ2hhbmdlZDt9Cl9pbnNlcnRDaGlsZChwcmV2LHBheWxvYWQpe2NvbnN0IG5vZGU9U0RLLkRPTU5vZGUuY3JlYXRlKHRoaXMuX2RvbU1vZGVsLHRoaXMub3duZXJEb2N1bWVudCx0aGlzLl9pc0luU2hhZG93VHJlZSxwYXlsb2FkKTt0aGlzLl9jaGlsZHJlbi5zcGxpY2UodGhpcy5fY2hpbGRyZW4uaW5kZXhPZihwcmV2KSsxLDAsbm9kZSk7dGhpcy5fcmVudW1iZXIoKTtyZXR1cm4gbm9kZTt9Cl9yZW1vdmVDaGlsZChub2RlKXtpZihub2RlLnBzZXVkb1R5cGUoKSl7dGhpcy5fcHNldWRvRWxlbWVudHMuZGVsZXRlKG5vZGUucHNldWRvVHlwZSgpKTt9ZWxzZXtjb25zdCBzaGFkb3dSb290SW5kZXg9dGhpcy5fc2hhZG93Um9vdHMuaW5kZXhPZihub2RlKTtpZihzaGFkb3dSb290SW5kZXghPT0tMSl7dGhpcy5fc2hhZG93Um9vdHMuc3BsaWNlKHNoYWRvd1Jvb3RJbmRleCwxKTt9ZWxzZXtjb25zb2xlLmFzc2VydCh0aGlzLl9jaGlsZHJlbi5pbmRleE9mKG5vZGUpIT09LTEpO3RoaXMuX2NoaWxkcmVuLnNwbGljZSh0aGlzLl9jaGlsZHJlbi5pbmRleE9mKG5vZGUpLDEpO319Cm5vZGUucGFyZW50Tm9kZT1udWxsO3RoaXMuX3N1YnRyZWVNYXJrZXJDb3VudC09bm9kZS5fc3VidHJlZU1hcmtlckNvdW50O2lmKG5vZGUuX3N1YnRyZWVNYXJrZXJDb3VudCkKdGhpcy5fZG9tTW9kZWwuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5ET01Nb2RlbC5FdmVudHMuTWFya2Vyc0NoYW5nZWQsdGhpcyk7dGhpcy5fcmVudW1iZXIoKTt9Cl9zZXRDaGlsZHJlblBheWxvYWQocGF5bG9hZHMpe3RoaXMuX2NoaWxkcmVuPVtdO2ZvcihsZXQgaT0wO2k8cGF5bG9hZHMubGVuZ3RoOysraSl7Y29uc3QgcGF5bG9hZD1wYXlsb2Fkc1tpXTtjb25zdCBub2RlPVNESy5ET01Ob2RlLmNyZWF0ZSh0aGlzLl9kb21Nb2RlbCx0aGlzLm93bmVyRG9jdW1lbnQsdGhpcy5faXNJblNoYWRvd1RyZWUscGF5bG9hZCk7dGhpcy5fY2hpbGRyZW4ucHVzaChub2RlKTt9CnRoaXMuX3JlbnVtYmVyKCk7fQpfc2V0UHNldWRvRWxlbWVudHMocGF5bG9hZHMpe3RoaXMuX3BzZXVkb0VsZW1lbnRzPW5ldyBNYXAoKTtpZighcGF5bG9hZHMpCnJldHVybjtmb3IobGV0IGk9MDtpPHBheWxvYWRzLmxlbmd0aDsrK2kpe2NvbnN0IG5vZGU9U0RLLkRPTU5vZGUuY3JlYXRlKHRoaXMuX2RvbU1vZGVsLHRoaXMub3duZXJEb2N1bWVudCx0aGlzLl9pc0luU2hhZG93VHJlZSxwYXlsb2Fkc1tpXSk7bm9kZS5wYXJlbnROb2RlPXRoaXM7dGhpcy5fcHNldWRvRWxlbWVudHMuc2V0KG5vZGUucHNldWRvVHlwZSgpLG5vZGUpO319Cl9zZXREaXN0cmlidXRlZE5vZGVQYXlsb2FkcyhwYXlsb2Fkcyl7dGhpcy5fZGlzdHJpYnV0ZWROb2Rlcz1bXTtmb3IoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcyl7dGhpcy5fZGlzdHJpYnV0ZWROb2Rlcy5wdXNoKG5ldyBTREsuRE9NTm9kZVNob3J0Y3V0KHRoaXMuX2RvbU1vZGVsLnRhcmdldCgpLHBheWxvYWQuYmFja2VuZE5vZGVJZCxwYXlsb2FkLm5vZGVUeXBlLHBheWxvYWQubm9kZU5hbWUpKTt9fQpfcmVudW1iZXIoKXt0aGlzLl9jaGlsZE5vZGVDb3VudD10aGlzLl9jaGlsZHJlbi5sZW5ndGg7aWYodGhpcy5fY2hpbGROb2RlQ291bnQ9PT0wKXt0aGlzLmZpcnN0Q2hpbGQ9bnVsbDt0aGlzLmxhc3RDaGlsZD1udWxsO3JldHVybjt9CnRoaXMuZmlyc3RDaGlsZD10aGlzLl9jaGlsZHJlblswXTt0aGlzLmxhc3RDaGlsZD10aGlzLl9jaGlsZHJlblt0aGlzLl9jaGlsZE5vZGVDb3VudC0xXTtmb3IobGV0IGk9MDtpPHRoaXMuX2NoaWxkTm9kZUNvdW50OysraSl7Y29uc3QgY2hpbGQ9dGhpcy5fY2hpbGRyZW5baV07Y2hpbGQuaW5kZXg9aTtjaGlsZC5uZXh0U2libGluZz1pKzE8dGhpcy5fY2hpbGROb2RlQ291bnQ/dGhpcy5fY2hpbGRyZW5baSsxXTpudWxsO2NoaWxkLnByZXZpb3VzU2libGluZz1pLTE+PTA/dGhpcy5fY2hpbGRyZW5baS0xXTpudWxsO2NoaWxkLnBhcmVudE5vZGU9dGhpczt9fQpfYWRkQXR0cmlidXRlKG5hbWUsdmFsdWUpe2NvbnN0IGF0dHI9e25hbWU6bmFtZSx2YWx1ZTp2YWx1ZSxfbm9kZTp0aGlzfTt0aGlzLl9hdHRyaWJ1dGVzTWFwW25hbWVdPWF0dHI7dGhpcy5fYXR0cmlidXRlcy5wdXNoKGF0dHIpO30KX3NldEF0dHJpYnV0ZShuYW1lLHZhbHVlKXtjb25zdCBhdHRyPXRoaXMuX2F0dHJpYnV0ZXNNYXBbbmFtZV07aWYoYXR0cikKYXR0ci52YWx1ZT12YWx1ZTtlbHNlCnRoaXMuX2FkZEF0dHJpYnV0ZShuYW1lLHZhbHVlKTt9Cl9yZW1vdmVBdHRyaWJ1dGUobmFtZSl7Y29uc3QgYXR0cj10aGlzLl9hdHRyaWJ1dGVzTWFwW25hbWVdO2lmKGF0dHIpe3RoaXMuX2F0dHJpYnV0ZXMucmVtb3ZlKGF0dHIpO2RlbGV0ZSB0aGlzLl9hdHRyaWJ1dGVzTWFwW25hbWVdO319CmNvcHlUbyh0YXJnZXROb2RlLGFuY2hvck5vZGUsY2FsbGJhY2spe3RoaXMuX2FnZW50Lmludm9rZV9jb3B5VG8oe25vZGVJZDp0aGlzLmlkLHRhcmdldE5vZGVJZDp0YXJnZXROb2RlLmlkLGluc2VydEJlZm9yZU5vZGVJZDphbmNob3JOb2RlP2FuY2hvck5vZGUuaWQ6dW5kZWZpbmVkfSkudGhlbihyZXNwb25zZT0+e2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnRoaXMuX2RvbU1vZGVsLm1hcmtVbmRvYWJsZVN0YXRlKCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8bnVsbCxyZXNwb25zZS5ub2RlSWQpO30pO30KbW92ZVRvKHRhcmdldE5vZGUsYW5jaG9yTm9kZSxjYWxsYmFjayl7dGhpcy5fYWdlbnQuaW52b2tlX21vdmVUbyh7bm9kZUlkOnRoaXMuaWQsdGFyZ2V0Tm9kZUlkOnRhcmdldE5vZGUuaWQsaW5zZXJ0QmVmb3JlTm9kZUlkOmFuY2hvck5vZGU/YW5jaG9yTm9kZS5pZDp1bmRlZmluZWR9KS50aGVuKHJlc3BvbnNlPT57aWYoIXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKdGhpcy5fZG9tTW9kZWwubWFya1VuZG9hYmxlU3RhdGUoKTtpZihjYWxsYmFjaykKY2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdfHxudWxsLHRoaXMuX2RvbU1vZGVsLm5vZGVGb3JJZChyZXNwb25zZS5ub2RlSWQpKTt9KTt9CmlzWE1MTm9kZSgpe3JldHVybiEhdGhpcy5feG1sVmVyc2lvbjt9CnNldE1hcmtlcihuYW1lLHZhbHVlKXtpZih2YWx1ZT09PW51bGwpe2lmKCF0aGlzLl9tYXJrZXJzLmhhcyhuYW1lKSkKcmV0dXJuO3RoaXMuX21hcmtlcnMuZGVsZXRlKG5hbWUpO2ZvcihsZXQgbm9kZT10aGlzO25vZGU7bm9kZT1ub2RlLnBhcmVudE5vZGUpCi0tbm9kZS5fc3VidHJlZU1hcmtlckNvdW50O2ZvcihsZXQgbm9kZT10aGlzO25vZGU7bm9kZT1ub2RlLnBhcmVudE5vZGUpCnRoaXMuX2RvbU1vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk1hcmtlcnNDaGFuZ2VkLG5vZGUpO3JldHVybjt9CmlmKHRoaXMucGFyZW50Tm9kZSYmIXRoaXMuX21hcmtlcnMuaGFzKG5hbWUpKXtmb3IobGV0IG5vZGU9dGhpcztub2RlO25vZGU9bm9kZS5wYXJlbnROb2RlKQorK25vZGUuX3N1YnRyZWVNYXJrZXJDb3VudDt9CnRoaXMuX21hcmtlcnMuc2V0KG5hbWUsdmFsdWUpO2ZvcihsZXQgbm9kZT10aGlzO25vZGU7bm9kZT1ub2RlLnBhcmVudE5vZGUpCnRoaXMuX2RvbU1vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk1hcmtlcnNDaGFuZ2VkLG5vZGUpO30KbWFya2VyKG5hbWUpe3JldHVybiB0aGlzLl9tYXJrZXJzLmdldChuYW1lKXx8bnVsbDt9CnRyYXZlcnNlTWFya2Vycyh2aXNpdG9yKXtmdW5jdGlvbiB0cmF2ZXJzZShub2RlKXtpZighbm9kZS5fc3VidHJlZU1hcmtlckNvdW50KQpyZXR1cm47Zm9yKGNvbnN0IG1hcmtlciBvZiBub2RlLl9tYXJrZXJzLmtleXMoKSkKdmlzaXRvcihub2RlLG1hcmtlcik7aWYoIW5vZGUuX2NoaWxkcmVuKQpyZXR1cm47Zm9yKGNvbnN0IGNoaWxkIG9mIG5vZGUuX2NoaWxkcmVuKQp0cmF2ZXJzZShjaGlsZCk7fQp0cmF2ZXJzZSh0aGlzKTt9CnJlc29sdmVVUkwodXJsKXtpZighdXJsKQpyZXR1cm4gdXJsO2ZvcihsZXQgZnJhbWVPd25lckNhbmRpZGF0ZT10aGlzO2ZyYW1lT3duZXJDYW5kaWRhdGU7ZnJhbWVPd25lckNhbmRpZGF0ZT1mcmFtZU93bmVyQ2FuZGlkYXRlLnBhcmVudE5vZGUpe2lmKGZyYW1lT3duZXJDYW5kaWRhdGUuYmFzZVVSTCkKcmV0dXJuIENvbW1vbi5QYXJzZWRVUkwuY29tcGxldGVVUkwoZnJhbWVPd25lckNhbmRpZGF0ZS5iYXNlVVJMLHVybCk7fQpyZXR1cm4gbnVsbDt9CmhpZ2hsaWdodChtb2RlLG9iamVjdElkKXt0aGlzLl9kb21Nb2RlbC5vdmVybGF5TW9kZWwoKS5oaWdobGlnaHRET01Ob2RlKHRoaXMuaWQsbW9kZSx1bmRlZmluZWQsb2JqZWN0SWQpO30KaGlnaGxpZ2h0Rm9yVHdvU2Vjb25kcygpe3RoaXMuX2RvbU1vZGVsLm92ZXJsYXlNb2RlbCgpLmhpZ2hsaWdodERPTU5vZGVGb3JUd29TZWNvbmRzKHRoaXMuaWQpO30KYXN5bmMgcmVzb2x2ZVRvT2JqZWN0KG9iamVjdEdyb3VwKXtjb25zdCBvYmplY3Q9YXdhaXQgdGhpcy5fYWdlbnQucmVzb2x2ZU5vZGUodGhpcy5pZCx1bmRlZmluZWQsb2JqZWN0R3JvdXApO3JldHVybiBvYmplY3QmJnRoaXMuX2RvbU1vZGVsLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KG9iamVjdCk7fQpib3hNb2RlbCgpe3JldHVybiB0aGlzLl9hZ2VudC5nZXRCb3hNb2RlbCh0aGlzLmlkKTt9CnNldEFzSW5zcGVjdGVkTm9kZSgpe2xldCBub2RlPXRoaXM7d2hpbGUodHJ1ZSl7bGV0IGFuY2VzdG9yPW5vZGUuYW5jZXN0b3JVc2VyQWdlbnRTaGFkb3dSb290KCk7aWYoIWFuY2VzdG9yKQpicmVhazthbmNlc3Rvcj1ub2RlLmFuY2VzdG9yU2hhZG93SG9zdCgpO2lmKCFhbmNlc3RvcikKYnJlYWs7bm9kZT1hbmNlc3Rvcjt9CnRoaXMuX2FnZW50LnNldEluc3BlY3RlZE5vZGUobm9kZS5pZCk7fQplbmNsb3NpbmdFbGVtZW50T3JTZWxmKCl7bGV0IG5vZGU9dGhpcztpZihub2RlJiZub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLlRFWFRfTk9ERSYmbm9kZS5wYXJlbnROb2RlKQpub2RlPW5vZGUucGFyZW50Tm9kZTtpZihub2RlJiZub2RlLm5vZGVUeXBlKCkhPT1Ob2RlLkVMRU1FTlRfTk9ERSkKbm9kZT1udWxsO3JldHVybiBub2RlO30KYXN5bmMgc2Nyb2xsSW50b1ZpZXcoKXtjb25zdCBub2RlPXRoaXMuZW5jbG9zaW5nRWxlbWVudE9yU2VsZigpO2NvbnN0IG9iamVjdD1hd2FpdCBub2RlLnJlc29sdmVUb09iamVjdCgpO2lmKCFvYmplY3QpCnJldHVybjtvYmplY3QuY2FsbEZ1bmN0aW9uKHNjcm9sbEludG9WaWV3KTtvYmplY3QucmVsZWFzZSgpO25vZGUuaGlnaGxpZ2h0Rm9yVHdvU2Vjb25kcygpO2Z1bmN0aW9uIHNjcm9sbEludG9WaWV3KCl7dGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKHRydWUpO319CmFzeW5jIGZvY3VzKCl7Y29uc3Qgbm9kZT10aGlzLmVuY2xvc2luZ0VsZW1lbnRPclNlbGYoKTtjb25zdCBvYmplY3Q9YXdhaXQgbm9kZS5yZXNvbHZlVG9PYmplY3QoKTtpZighb2JqZWN0KQpyZXR1cm47YXdhaXQgb2JqZWN0LmNhbGxGdW5jdGlvblByb21pc2UoZm9jdXNJblBhZ2UpO29iamVjdC5yZWxlYXNlKCk7bm9kZS5oaWdobGlnaHRGb3JUd29TZWNvbmRzKCk7dGhpcy5fZG9tTW9kZWwudGFyZ2V0KCkucGFnZUFnZW50KCkuYnJpbmdUb0Zyb250KCk7ZnVuY3Rpb24gZm9jdXNJblBhZ2UoKXt0aGlzLmZvY3VzKCk7fX0Kc2ltcGxlU2VsZWN0b3IoKXtjb25zdCBsb3dlckNhc2VOYW1lPXRoaXMubG9jYWxOYW1lKCl8fHRoaXMubm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpO2lmKHRoaXMubm9kZVR5cGUoKSE9PU5vZGUuRUxFTUVOVF9OT0RFKQpyZXR1cm4gbG93ZXJDYXNlTmFtZTtpZihsb3dlckNhc2VOYW1lPT09J2lucHV0JyYmdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSYmIXRoaXMuZ2V0QXR0cmlidXRlKCdpZCcpJiYhdGhpcy5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpCnJldHVybiBsb3dlckNhc2VOYW1lKydbdHlwZT0iJyt0aGlzLmdldEF0dHJpYnV0ZSgndHlwZScpKyciXSc7aWYodGhpcy5nZXRBdHRyaWJ1dGUoJ2lkJykpCnJldHVybiBsb3dlckNhc2VOYW1lKycjJyt0aGlzLmdldEF0dHJpYnV0ZSgnaWQnKTtpZih0aGlzLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSl7cmV0dXJuKGxvd2VyQ2FzZU5hbWU9PT0nZGl2Jz8nJzpsb3dlckNhc2VOYW1lKSsnLicrCnRoaXMuZ2V0QXR0cmlidXRlKCdjbGFzcycpLnRyaW0oKS5yZXBsYWNlKC9ccysvZywnLicpO30KcmV0dXJuIGxvd2VyQ2FzZU5hbWU7fX07U0RLLkRPTU5vZGUuUHNldWRvRWxlbWVudE5hbWVzPXtCZWZvcmU6J2JlZm9yZScsQWZ0ZXI6J2FmdGVyJ307U0RLLkRPTU5vZGUuU2hhZG93Um9vdFR5cGVzPXtVc2VyQWdlbnQ6J3VzZXItYWdlbnQnLE9wZW46J29wZW4nLENsb3NlZDonY2xvc2VkJ307U0RLLkRPTU5vZGUuQXR0cmlidXRlO1NESy5EZWZlcnJlZERPTU5vZGU9Y2xhc3N7Y29uc3RydWN0b3IodGFyZ2V0LGJhY2tlbmROb2RlSWQpe3RoaXMuX2RvbU1vZGVsPSh0YXJnZXQubW9kZWwoU0RLLkRPTU1vZGVsKSk7dGhpcy5fYmFja2VuZE5vZGVJZD1iYWNrZW5kTm9kZUlkO30KcmVzb2x2ZShjYWxsYmFjayl7dGhpcy5yZXNvbHZlUHJvbWlzZSgpLnRoZW4oY2FsbGJhY2spO30KYXN5bmMgcmVzb2x2ZVByb21pc2UoKXtjb25zdCBub2RlSWRzPWF3YWl0IHRoaXMuX2RvbU1vZGVsLnB1c2hOb2Rlc0J5QmFja2VuZElkc1RvRnJvbnRlbmQobmV3IFNldChbdGhpcy5fYmFja2VuZE5vZGVJZF0pKTtyZXR1cm4gbm9kZUlkcyYmbm9kZUlkcy5nZXQodGhpcy5fYmFja2VuZE5vZGVJZCl8fG51bGw7fQpiYWNrZW5kTm9kZUlkKCl7cmV0dXJuIHRoaXMuX2JhY2tlbmROb2RlSWQ7fQpkb21Nb2RlbCgpe3JldHVybiB0aGlzLl9kb21Nb2RlbDt9CmhpZ2hsaWdodCgpe3RoaXMuX2RvbU1vZGVsLm92ZXJsYXlNb2RlbCgpLmhpZ2hsaWdodERPTU5vZGUodW5kZWZpbmVkLHVuZGVmaW5lZCx0aGlzLl9iYWNrZW5kTm9kZUlkKTt9fTtTREsuRE9NTm9kZVNob3J0Y3V0PWNsYXNze2NvbnN0cnVjdG9yKHRhcmdldCxiYWNrZW5kTm9kZUlkLG5vZGVUeXBlLG5vZGVOYW1lKXt0aGlzLm5vZGVUeXBlPW5vZGVUeXBlO3RoaXMubm9kZU5hbWU9bm9kZU5hbWU7dGhpcy5kZWZlcnJlZE5vZGU9bmV3IFNESy5EZWZlcnJlZERPTU5vZGUodGFyZ2V0LGJhY2tlbmROb2RlSWQpO319O1NESy5ET01Eb2N1bWVudD1jbGFzcyBleHRlbmRzIFNESy5ET01Ob2Rle2NvbnN0cnVjdG9yKGRvbU1vZGVsLHBheWxvYWQpe3N1cGVyKGRvbU1vZGVsKTt0aGlzLl9pbml0KHRoaXMsZmFsc2UscGF5bG9hZCk7dGhpcy5kb2N1bWVudFVSTD1wYXlsb2FkLmRvY3VtZW50VVJMfHwnJzt0aGlzLmJhc2VVUkw9cGF5bG9hZC5iYXNlVVJMfHwnJzt9fTtTREsuRE9NTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX2FnZW50PXRhcmdldC5kb21BZ2VudCgpO3RoaXMuX2lkVG9ET01Ob2RlPXt9O3RoaXMuX2RvY3VtZW50PW51bGw7dGhpcy5fYXR0cmlidXRlTG9hZE5vZGVJZHM9bmV3IFNldCgpO3RhcmdldC5yZWdpc3RlckRPTURpc3BhdGNoZXIobmV3IFNESy5ET01EaXNwYXRjaGVyKHRoaXMpKTt0aGlzLl9ydW50aW1lTW9kZWw9KHRhcmdldC5tb2RlbChTREsuUnVudGltZU1vZGVsKSk7aWYoIXRhcmdldC5zdXNwZW5kZWQoKSkKdGhpcy5fYWdlbnQuZW5hYmxlKCk7fQpydW50aW1lTW9kZWwoKXtyZXR1cm4gdGhpcy5fcnVudGltZU1vZGVsO30KY3NzTW9kZWwoKXtyZXR1cm4odGhpcy50YXJnZXQoKS5tb2RlbChTREsuQ1NTTW9kZWwpKTt9Cm92ZXJsYXlNb2RlbCgpe3JldHVybih0aGlzLnRhcmdldCgpLm1vZGVsKFNESy5PdmVybGF5TW9kZWwpKTt9CnN0YXRpYyBjYW5jZWxTZWFyY2goKXtmb3IoY29uc3QgZG9tTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5ET01Nb2RlbCkpCmRvbU1vZGVsLl9jYW5jZWxTZWFyY2goKTt9Cl9zY2hlZHVsZU11dGF0aW9uRXZlbnQobm9kZSl7aWYoIXRoaXMuaGFzRXZlbnRMaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5ET01NdXRhdGVkKSkKcmV0dXJuO3RoaXMuX2xhc3RNdXRhdGlvbklkPSh0aGlzLl9sYXN0TXV0YXRpb25JZHx8MCkrMTtQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxPYnNlcnZlLmJpbmQodGhpcyxub2RlLHRoaXMuX2xhc3RNdXRhdGlvbklkKSk7ZnVuY3Rpb24gY2FsbE9ic2VydmUobm9kZSxtdXRhdGlvbklkKXtpZighdGhpcy5oYXNFdmVudExpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkRPTU11dGF0ZWQpfHx0aGlzLl9sYXN0TXV0YXRpb25JZCE9PW11dGF0aW9uSWQpCnJldHVybjt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkRPTU11dGF0ZWQsbm9kZSk7fX0KcmVxdWVzdERvY3VtZW50KCl7aWYodGhpcy5fZG9jdW1lbnQpCnJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZG9jdW1lbnQpO2lmKCF0aGlzLl9wZW5kaW5nRG9jdW1lbnRSZXF1ZXN0UHJvbWlzZSkKdGhpcy5fcGVuZGluZ0RvY3VtZW50UmVxdWVzdFByb21pc2U9dGhpcy5fcmVxdWVzdERvY3VtZW50KCk7cmV0dXJuIHRoaXMuX3BlbmRpbmdEb2N1bWVudFJlcXVlc3RQcm9taXNlO30KYXN5bmMgX3JlcXVlc3REb2N1bWVudCgpe2NvbnN0IGRvY3VtZW50UGF5bG9hZD1hd2FpdCB0aGlzLl9hZ2VudC5nZXREb2N1bWVudCgpO2RlbGV0ZSB0aGlzLl9wZW5kaW5nRG9jdW1lbnRSZXF1ZXN0UHJvbWlzZTtpZihkb2N1bWVudFBheWxvYWQpCnRoaXMuX3NldERvY3VtZW50KGRvY3VtZW50UGF5bG9hZCk7aWYoIXRoaXMuX2RvY3VtZW50KXtjb25zb2xlLmVycm9yKCdObyBkb2N1bWVudCcpO3JldHVybiBudWxsO30KY29uc3QgcGFyZW50TW9kZWw9dGhpcy5wYXJlbnRNb2RlbCgpO2lmKHBhcmVudE1vZGVsJiYhdGhpcy5fZnJhbWVPd25lck5vZGUpe2F3YWl0IHBhcmVudE1vZGVsLnJlcXVlc3REb2N1bWVudCgpO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHBhcmVudE1vZGVsLl9hZ2VudC5pbnZva2VfZ2V0RnJhbWVPd25lcih7ZnJhbWVJZDp0aGlzLnRhcmdldCgpLmlkKCl9KTtpZighcmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQp0aGlzLl9mcmFtZU93bmVyTm9kZT1wYXJlbnRNb2RlbC5ub2RlRm9ySWQocmVzcG9uc2Uubm9kZUlkKTt9CmlmKHRoaXMuX2ZyYW1lT3duZXJOb2RlKXtjb25zdCBvbGREb2N1bWVudD10aGlzLl9mcmFtZU93bmVyTm9kZS5fY29udGVudERvY3VtZW50O3RoaXMuX2ZyYW1lT3duZXJOb2RlLl9jb250ZW50RG9jdW1lbnQ9dGhpcy5fZG9jdW1lbnQ7dGhpcy5fZnJhbWVPd25lck5vZGUuX2NoaWxkcmVuPVtdO2lmKHRoaXMuX2RvY3VtZW50KXt0aGlzLl9kb2N1bWVudC5wYXJlbnROb2RlPXRoaXMuX2ZyYW1lT3duZXJOb2RlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5ET01Nb2RlbC5FdmVudHMuTm9kZUluc2VydGVkLHRoaXMuX2RvY3VtZW50KTt9ZWxzZSBpZihvbGREb2N1bWVudCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5Ob2RlUmVtb3ZlZCx7bm9kZTpvbGREb2N1bWVudCxwYXJlbnQ6dGhpcy5fZnJhbWVPd25lck5vZGV9KTt9fQpyZXR1cm4gdGhpcy5fZG9jdW1lbnQ7fQpleGlzdGluZ0RvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50O30KYXN5bmMgcHVzaE5vZGVUb0Zyb250ZW5kKG9iamVjdElkKXthd2FpdCB0aGlzLnJlcXVlc3REb2N1bWVudCgpO2NvbnN0IG5vZGVJZD1hd2FpdCB0aGlzLl9hZ2VudC5yZXF1ZXN0Tm9kZShvYmplY3RJZCk7cmV0dXJuIG5vZGVJZD90aGlzLm5vZGVGb3JJZChub2RlSWQpOm51bGw7fQpwdXNoTm9kZUJ5UGF0aFRvRnJvbnRlbmQocGF0aCl7cmV0dXJuIHRoaXMucmVxdWVzdERvY3VtZW50KCkudGhlbigoKT0+dGhpcy5fYWdlbnQucHVzaE5vZGVCeVBhdGhUb0Zyb250ZW5kKHBhdGgpKTt9CmFzeW5jIHB1c2hOb2Rlc0J5QmFja2VuZElkc1RvRnJvbnRlbmQoYmFja2VuZE5vZGVJZHMpe2F3YWl0IHRoaXMucmVxdWVzdERvY3VtZW50KCk7Y29uc3QgYmFja2VuZE5vZGVJZHNBcnJheT1iYWNrZW5kTm9kZUlkcy52YWx1ZXNBcnJheSgpO2NvbnN0IG5vZGVJZHM9YXdhaXQgdGhpcy5fYWdlbnQucHVzaE5vZGVzQnlCYWNrZW5kSWRzVG9Gcm9udGVuZChiYWNrZW5kTm9kZUlkc0FycmF5KTtpZighbm9kZUlkcykKcmV0dXJuIG51bGw7Y29uc3QgbWFwPW5ldyBNYXAoKTtmb3IobGV0IGk9MDtpPG5vZGVJZHMubGVuZ3RoOysraSl7aWYobm9kZUlkc1tpXSkKbWFwLnNldChiYWNrZW5kTm9kZUlkc0FycmF5W2ldLHRoaXMubm9kZUZvcklkKG5vZGVJZHNbaV0pKTt9CnJldHVybiBtYXA7fQpfd3JhcENsaWVudENhbGxiYWNrKGNhbGxiYWNrKXtmdW5jdGlvbiB3cmFwcGVyKGVycm9yLHJlc3VsdCl7Y2FsbGJhY2soZXJyb3I/bnVsbDpyZXN1bHR8fG51bGwpO30KcmV0dXJuIHdyYXBwZXI7fQpfYXR0cmlidXRlTW9kaWZpZWQobm9kZUlkLG5hbWUsdmFsdWUpe2NvbnN0IG5vZGU9dGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTtpZighbm9kZSkKcmV0dXJuO25vZGUuX3NldEF0dHJpYnV0ZShuYW1lLHZhbHVlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJNb2RpZmllZCx7bm9kZTpub2RlLG5hbWU6bmFtZX0pO3RoaXMuX3NjaGVkdWxlTXV0YXRpb25FdmVudChub2RlKTt9Cl9hdHRyaWJ1dGVSZW1vdmVkKG5vZGVJZCxuYW1lKXtjb25zdCBub2RlPXRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF07aWYoIW5vZGUpCnJldHVybjtub2RlLl9yZW1vdmVBdHRyaWJ1dGUobmFtZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5BdHRyUmVtb3ZlZCx7bm9kZTpub2RlLG5hbWU6bmFtZX0pO3RoaXMuX3NjaGVkdWxlTXV0YXRpb25FdmVudChub2RlKTt9Cl9pbmxpbmVTdHlsZUludmFsaWRhdGVkKG5vZGVJZHMpe3RoaXMuX2F0dHJpYnV0ZUxvYWROb2RlSWRzLmFkZEFsbChub2RlSWRzKTtpZighdGhpcy5fbG9hZE5vZGVBdHRyaWJ1dGVzVGltZW91dCkKdGhpcy5fbG9hZE5vZGVBdHRyaWJ1dGVzVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX2xvYWROb2RlQXR0cmlidXRlcy5iaW5kKHRoaXMpLDIwKTt9Cl9sb2FkTm9kZUF0dHJpYnV0ZXMoKXtkZWxldGUgdGhpcy5fbG9hZE5vZGVBdHRyaWJ1dGVzVGltZW91dDtmb3IoY29uc3Qgbm9kZUlkIG9mIHRoaXMuX2F0dHJpYnV0ZUxvYWROb2RlSWRzKXt0aGlzLl9hZ2VudC5nZXRBdHRyaWJ1dGVzKG5vZGVJZCkudGhlbihhdHRyaWJ1dGVzPT57aWYoIWF0dHJpYnV0ZXMpe3JldHVybjt9CmNvbnN0IG5vZGU9dGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTtpZighbm9kZSkKcmV0dXJuO2lmKG5vZGUuX3NldEF0dHJpYnV0ZXNQYXlsb2FkKGF0dHJpYnV0ZXMpKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJNb2RpZmllZCx7bm9kZTpub2RlLG5hbWU6J3N0eWxlJ30pO3RoaXMuX3NjaGVkdWxlTXV0YXRpb25FdmVudChub2RlKTt9fSk7fQp0aGlzLl9hdHRyaWJ1dGVMb2FkTm9kZUlkcy5jbGVhcigpO30KX2NoYXJhY3RlckRhdGFNb2RpZmllZChub2RlSWQsbmV3VmFsdWUpe2NvbnN0IG5vZGU9dGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTtub2RlLl9ub2RlVmFsdWU9bmV3VmFsdWU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5DaGFyYWN0ZXJEYXRhTW9kaWZpZWQsbm9kZSk7dGhpcy5fc2NoZWR1bGVNdXRhdGlvbkV2ZW50KG5vZGUpO30Kbm9kZUZvcklkKG5vZGVJZCl7cmV0dXJuIHRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF18fG51bGw7fQpfZG9jdW1lbnRVcGRhdGVkKCl7Y29uc3QgZG9jdW1lbnRXYXNSZXF1ZXN0ZWQ9dGhpcy5fZG9jdW1lbnR8fHRoaXMuX3BlbmRpbmdEb2N1bWVudFJlcXVlc3RQcm9taXNlO3RoaXMuX3NldERvY3VtZW50KG51bGwpO2lmKHRoaXMucGFyZW50TW9kZWwoKSYmZG9jdW1lbnRXYXNSZXF1ZXN0ZWQpCnRoaXMucmVxdWVzdERvY3VtZW50KCk7fQpfc2V0RG9jdW1lbnQocGF5bG9hZCl7dGhpcy5faWRUb0RPTU5vZGU9e307aWYocGF5bG9hZCYmJ25vZGVJZCdpbiBwYXlsb2FkKQp0aGlzLl9kb2N1bWVudD1uZXcgU0RLLkRPTURvY3VtZW50KHRoaXMscGF5bG9hZCk7ZWxzZQp0aGlzLl9kb2N1bWVudD1udWxsO1NESy5kb21Nb2RlbFVuZG9TdGFjay5fZGlzcG9zZSh0aGlzKTtpZighdGhpcy5wYXJlbnRNb2RlbCgpKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkRvY3VtZW50VXBkYXRlZCx0aGlzKTt9Cl9zZXREZXRhY2hlZFJvb3QocGF5bG9hZCl7aWYocGF5bG9hZC5ub2RlTmFtZT09PScjZG9jdW1lbnQnKQpuZXcgU0RLLkRPTURvY3VtZW50KHRoaXMscGF5bG9hZCk7ZWxzZQpTREsuRE9NTm9kZS5jcmVhdGUodGhpcyxudWxsLGZhbHNlLHBheWxvYWQpO30KX3NldENoaWxkTm9kZXMocGFyZW50SWQscGF5bG9hZHMpe2lmKCFwYXJlbnRJZCYmcGF5bG9hZHMubGVuZ3RoKXt0aGlzLl9zZXREZXRhY2hlZFJvb3QocGF5bG9hZHNbMF0pO3JldHVybjt9CmNvbnN0IHBhcmVudD10aGlzLl9pZFRvRE9NTm9kZVtwYXJlbnRJZF07cGFyZW50Ll9zZXRDaGlsZHJlblBheWxvYWQocGF5bG9hZHMpO30KX2NoaWxkTm9kZUNvdW50VXBkYXRlZChub2RlSWQsbmV3VmFsdWUpe2NvbnN0IG5vZGU9dGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTtub2RlLl9jaGlsZE5vZGVDb3VudD1uZXdWYWx1ZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkNoaWxkTm9kZUNvdW50VXBkYXRlZCxub2RlKTt0aGlzLl9zY2hlZHVsZU11dGF0aW9uRXZlbnQobm9kZSk7fQpfY2hpbGROb2RlSW5zZXJ0ZWQocGFyZW50SWQscHJldklkLHBheWxvYWQpe2NvbnN0IHBhcmVudD10aGlzLl9pZFRvRE9NTm9kZVtwYXJlbnRJZF07Y29uc3QgcHJldj10aGlzLl9pZFRvRE9NTm9kZVtwcmV2SWRdO2NvbnN0IG5vZGU9cGFyZW50Ll9pbnNlcnRDaGlsZChwcmV2LHBheWxvYWQpO3RoaXMuX2lkVG9ET01Ob2RlW25vZGUuaWRdPW5vZGU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5Ob2RlSW5zZXJ0ZWQsbm9kZSk7dGhpcy5fc2NoZWR1bGVNdXRhdGlvbkV2ZW50KG5vZGUpO30KX2NoaWxkTm9kZVJlbW92ZWQocGFyZW50SWQsbm9kZUlkKXtjb25zdCBwYXJlbnQ9dGhpcy5faWRUb0RPTU5vZGVbcGFyZW50SWRdO2NvbnN0IG5vZGU9dGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTtwYXJlbnQuX3JlbW92ZUNoaWxkKG5vZGUpO3RoaXMuX3VuYmluZChub2RlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVSZW1vdmVkLHtub2RlOm5vZGUscGFyZW50OnBhcmVudH0pO3RoaXMuX3NjaGVkdWxlTXV0YXRpb25FdmVudChub2RlKTt9Cl9zaGFkb3dSb290UHVzaGVkKGhvc3RJZCxyb290KXtjb25zdCBob3N0PXRoaXMuX2lkVG9ET01Ob2RlW2hvc3RJZF07aWYoIWhvc3QpCnJldHVybjtjb25zdCBub2RlPVNESy5ET01Ob2RlLmNyZWF0ZSh0aGlzLGhvc3Qub3duZXJEb2N1bWVudCx0cnVlLHJvb3QpO25vZGUucGFyZW50Tm9kZT1ob3N0O3RoaXMuX2lkVG9ET01Ob2RlW25vZGUuaWRdPW5vZGU7aG9zdC5fc2hhZG93Um9vdHMudW5zaGlmdChub2RlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVJbnNlcnRlZCxub2RlKTt0aGlzLl9zY2hlZHVsZU11dGF0aW9uRXZlbnQobm9kZSk7fQpfc2hhZG93Um9vdFBvcHBlZChob3N0SWQscm9vdElkKXtjb25zdCBob3N0PXRoaXMuX2lkVG9ET01Ob2RlW2hvc3RJZF07aWYoIWhvc3QpCnJldHVybjtjb25zdCByb290PXRoaXMuX2lkVG9ET01Ob2RlW3Jvb3RJZF07aWYoIXJvb3QpCnJldHVybjtob3N0Ll9yZW1vdmVDaGlsZChyb290KTt0aGlzLl91bmJpbmQocm9vdCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRPTU1vZGVsLkV2ZW50cy5Ob2RlUmVtb3ZlZCx7bm9kZTpyb290LHBhcmVudDpob3N0fSk7dGhpcy5fc2NoZWR1bGVNdXRhdGlvbkV2ZW50KHJvb3QpO30KX3BzZXVkb0VsZW1lbnRBZGRlZChwYXJlbnRJZCxwc2V1ZG9FbGVtZW50KXtjb25zdCBwYXJlbnQ9dGhpcy5faWRUb0RPTU5vZGVbcGFyZW50SWRdO2lmKCFwYXJlbnQpCnJldHVybjtjb25zdCBub2RlPVNESy5ET01Ob2RlLmNyZWF0ZSh0aGlzLHBhcmVudC5vd25lckRvY3VtZW50LGZhbHNlLHBzZXVkb0VsZW1lbnQpO25vZGUucGFyZW50Tm9kZT1wYXJlbnQ7dGhpcy5faWRUb0RPTU5vZGVbbm9kZS5pZF09bm9kZTtjb25zb2xlLmFzc2VydCghcGFyZW50Ll9wc2V1ZG9FbGVtZW50cy5nZXQobm9kZS5wc2V1ZG9UeXBlKCkpKTtwYXJlbnQuX3BzZXVkb0VsZW1lbnRzLnNldChub2RlLnBzZXVkb1R5cGUoKSxub2RlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVJbnNlcnRlZCxub2RlKTt0aGlzLl9zY2hlZHVsZU11dGF0aW9uRXZlbnQobm9kZSk7fQpfcHNldWRvRWxlbWVudFJlbW92ZWQocGFyZW50SWQscHNldWRvRWxlbWVudElkKXtjb25zdCBwYXJlbnQ9dGhpcy5faWRUb0RPTU5vZGVbcGFyZW50SWRdO2lmKCFwYXJlbnQpCnJldHVybjtjb25zdCBwc2V1ZG9FbGVtZW50PXRoaXMuX2lkVG9ET01Ob2RlW3BzZXVkb0VsZW1lbnRJZF07aWYoIXBzZXVkb0VsZW1lbnQpCnJldHVybjtwYXJlbnQuX3JlbW92ZUNoaWxkKHBzZXVkb0VsZW1lbnQpO3RoaXMuX3VuYmluZChwc2V1ZG9FbGVtZW50KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVSZW1vdmVkLHtub2RlOnBzZXVkb0VsZW1lbnQscGFyZW50OnBhcmVudH0pO3RoaXMuX3NjaGVkdWxlTXV0YXRpb25FdmVudChwc2V1ZG9FbGVtZW50KTt9Cl9kaXN0cmlidXRlZE5vZGVzVXBkYXRlZChpbnNlcnRpb25Qb2ludElkLGRpc3RyaWJ1dGVkTm9kZXMpe2NvbnN0IGluc2VydGlvblBvaW50PXRoaXMuX2lkVG9ET01Ob2RlW2luc2VydGlvblBvaW50SWRdO2lmKCFpbnNlcnRpb25Qb2ludCkKcmV0dXJuO2luc2VydGlvblBvaW50Ll9zZXREaXN0cmlidXRlZE5vZGVQYXlsb2FkcyhkaXN0cmlidXRlZE5vZGVzKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRE9NTW9kZWwuRXZlbnRzLkRpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkLGluc2VydGlvblBvaW50KTt0aGlzLl9zY2hlZHVsZU11dGF0aW9uRXZlbnQoaW5zZXJ0aW9uUG9pbnQpO30KX3VuYmluZChub2RlKXtkZWxldGUgdGhpcy5faWRUb0RPTU5vZGVbbm9kZS5pZF07Zm9yKGxldCBpPTA7bm9kZS5fY2hpbGRyZW4mJmk8bm9kZS5fY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5fdW5iaW5kKG5vZGUuX2NoaWxkcmVuW2ldKTtmb3IobGV0IGk9MDtpPG5vZGUuX3NoYWRvd1Jvb3RzLmxlbmd0aDsrK2kpCnRoaXMuX3VuYmluZChub2RlLl9zaGFkb3dSb290c1tpXSk7Y29uc3QgcHNldWRvRWxlbWVudHM9bm9kZS5wc2V1ZG9FbGVtZW50cygpO2Zvcihjb25zdCB2YWx1ZSBvZiBwc2V1ZG9FbGVtZW50cy52YWx1ZXMoKSkKdGhpcy5fdW5iaW5kKHZhbHVlKTtpZihub2RlLl90ZW1wbGF0ZUNvbnRlbnQpCnRoaXMuX3VuYmluZChub2RlLl90ZW1wbGF0ZUNvbnRlbnQpO30KYXN5bmMgcGVyZm9ybVNlYXJjaChxdWVyeSxpbmNsdWRlVXNlckFnZW50U2hhZG93RE9NKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2VfcGVyZm9ybVNlYXJjaCh7cXVlcnksaW5jbHVkZVVzZXJBZ2VudFNoYWRvd0RPTX0pO2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnRoaXMuX3NlYXJjaElkPXJlc3BvbnNlLnNlYXJjaElkO3JldHVybiByZXNwb25zZVtQcm90b2NvbC5FcnJvcl0/MDpyZXNwb25zZS5yZXN1bHRDb3VudDt9CmFzeW5jIHNlYXJjaFJlc3VsdChpbmRleCl7aWYoIXRoaXMuX3NlYXJjaElkKQpyZXR1cm4gbnVsbDtjb25zdCBub2RlSWRzPWF3YWl0IHRoaXMuX2FnZW50LmdldFNlYXJjaFJlc3VsdHModGhpcy5fc2VhcmNoSWQsaW5kZXgsaW5kZXgrMSk7cmV0dXJuIG5vZGVJZHMmJm5vZGVJZHMubGVuZ3RoPT09MT90aGlzLm5vZGVGb3JJZChub2RlSWRzWzBdKTpudWxsO30KX2NhbmNlbFNlYXJjaCgpe2lmKCF0aGlzLl9zZWFyY2hJZCkKcmV0dXJuO3RoaXMuX2FnZW50LmRpc2NhcmRTZWFyY2hSZXN1bHRzKHRoaXMuX3NlYXJjaElkKTtkZWxldGUgdGhpcy5fc2VhcmNoSWQ7fQpjbGFzc05hbWVzUHJvbWlzZShub2RlSWQpe3JldHVybiB0aGlzLl9hZ2VudC5jb2xsZWN0Q2xhc3NOYW1lc0Zyb21TdWJ0cmVlKG5vZGVJZCkudGhlbihjbGFzc05hbWVzPT5jbGFzc05hbWVzfHxbXSk7fQpxdWVyeVNlbGVjdG9yKG5vZGVJZCxzZWxlY3RvcnMpe3JldHVybiB0aGlzLl9hZ2VudC5xdWVyeVNlbGVjdG9yKG5vZGVJZCxzZWxlY3RvcnMpO30KcXVlcnlTZWxlY3RvckFsbChub2RlSWQsc2VsZWN0b3JzKXtyZXR1cm4gdGhpcy5fYWdlbnQucXVlcnlTZWxlY3RvckFsbChub2RlSWQsc2VsZWN0b3JzKTt9Cm1hcmtVbmRvYWJsZVN0YXRlKG1pbm9yQ2hhbmdlKXtTREsuZG9tTW9kZWxVbmRvU3RhY2suX21hcmtVbmRvYWJsZVN0YXRlKHRoaXMsbWlub3JDaGFuZ2V8fGZhbHNlKTt9Cm5vZGVGb3JMb2NhdGlvbih4LHksaW5jbHVkZVVzZXJBZ2VudFNoYWRvd0RPTSl7cmV0dXJuIHRoaXMuX2FnZW50LmdldE5vZGVGb3JMb2NhdGlvbih4LHksaW5jbHVkZVVzZXJBZ2VudFNoYWRvd0RPTSkudGhlbihub2RlSWQ9Pm5vZGVJZD90aGlzLm5vZGVGb3JJZChub2RlSWQpOm51bGwpO30KcHVzaE9iamVjdEFzTm9kZVRvRnJvbnRlbmQob2JqZWN0KXtyZXR1cm4gb2JqZWN0LmlzTm9kZSgpP3RoaXMucHVzaE5vZGVUb0Zyb250ZW5kKChvYmplY3Qub2JqZWN0SWQpKTpQcm9taXNlLnJlc29sdmUobnVsbCk7fQpzdXNwZW5kTW9kZWwoKXtyZXR1cm4gdGhpcy5fYWdlbnQuZGlzYWJsZSgpLnRoZW4oKCk9PnRoaXMuX3NldERvY3VtZW50KG51bGwpKTt9CnJlc3VtZU1vZGVsKCl7cmV0dXJuIHRoaXMuX2FnZW50LmVuYWJsZSgpO30KZGlzcG9zZSgpe1NESy5kb21Nb2RlbFVuZG9TdGFjay5fZGlzcG9zZSh0aGlzKTt9CnBhcmVudE1vZGVsKCl7aWYoIVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdvb3BpZklubGluZURPTScpKQpyZXR1cm4gbnVsbDtjb25zdCBwYXJlbnRUYXJnZXQ9dGhpcy50YXJnZXQoKS5wYXJlbnRUYXJnZXQoKTtyZXR1cm4gcGFyZW50VGFyZ2V0P3BhcmVudFRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpOm51bGw7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5ET01Nb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRE9NLHRydWUpO1NESy5ET01Nb2RlbC5FdmVudHM9e0F0dHJNb2RpZmllZDpTeW1ib2woJ0F0dHJNb2RpZmllZCcpLEF0dHJSZW1vdmVkOlN5bWJvbCgnQXR0clJlbW92ZWQnKSxDaGFyYWN0ZXJEYXRhTW9kaWZpZWQ6U3ltYm9sKCdDaGFyYWN0ZXJEYXRhTW9kaWZpZWQnKSxET01NdXRhdGVkOlN5bWJvbCgnRE9NTXV0YXRlZCcpLE5vZGVJbnNlcnRlZDpTeW1ib2woJ05vZGVJbnNlcnRlZCcpLE5vZGVSZW1vdmVkOlN5bWJvbCgnTm9kZVJlbW92ZWQnKSxEb2N1bWVudFVwZGF0ZWQ6U3ltYm9sKCdEb2N1bWVudFVwZGF0ZWQnKSxDaGlsZE5vZGVDb3VudFVwZGF0ZWQ6U3ltYm9sKCdDaGlsZE5vZGVDb3VudFVwZGF0ZWQnKSxEaXN0cmlidXRlZE5vZGVzQ2hhbmdlZDpTeW1ib2woJ0Rpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkJyksTWFya2Vyc0NoYW5nZWQ6U3ltYm9sKCdNYXJrZXJzQ2hhbmdlZCcpfTtTREsuRE9NRGlzcGF0Y2hlcj1jbGFzc3tjb25zdHJ1Y3Rvcihkb21Nb2RlbCl7dGhpcy5fZG9tTW9kZWw9ZG9tTW9kZWw7fQpkb2N1bWVudFVwZGF0ZWQoKXt0aGlzLl9kb21Nb2RlbC5fZG9jdW1lbnRVcGRhdGVkKCk7fQphdHRyaWJ1dGVNb2RpZmllZChub2RlSWQsbmFtZSx2YWx1ZSl7dGhpcy5fZG9tTW9kZWwuX2F0dHJpYnV0ZU1vZGlmaWVkKG5vZGVJZCxuYW1lLHZhbHVlKTt9CmF0dHJpYnV0ZVJlbW92ZWQobm9kZUlkLG5hbWUpe3RoaXMuX2RvbU1vZGVsLl9hdHRyaWJ1dGVSZW1vdmVkKG5vZGVJZCxuYW1lKTt9CmlubGluZVN0eWxlSW52YWxpZGF0ZWQobm9kZUlkcyl7dGhpcy5fZG9tTW9kZWwuX2lubGluZVN0eWxlSW52YWxpZGF0ZWQobm9kZUlkcyk7fQpjaGFyYWN0ZXJEYXRhTW9kaWZpZWQobm9kZUlkLGNoYXJhY3RlckRhdGEpe3RoaXMuX2RvbU1vZGVsLl9jaGFyYWN0ZXJEYXRhTW9kaWZpZWQobm9kZUlkLGNoYXJhY3RlckRhdGEpO30Kc2V0Q2hpbGROb2RlcyhwYXJlbnRJZCxwYXlsb2Fkcyl7dGhpcy5fZG9tTW9kZWwuX3NldENoaWxkTm9kZXMocGFyZW50SWQscGF5bG9hZHMpO30KY2hpbGROb2RlQ291bnRVcGRhdGVkKG5vZGVJZCxjaGlsZE5vZGVDb3VudCl7dGhpcy5fZG9tTW9kZWwuX2NoaWxkTm9kZUNvdW50VXBkYXRlZChub2RlSWQsY2hpbGROb2RlQ291bnQpO30KY2hpbGROb2RlSW5zZXJ0ZWQocGFyZW50Tm9kZUlkLHByZXZpb3VzTm9kZUlkLHBheWxvYWQpe3RoaXMuX2RvbU1vZGVsLl9jaGlsZE5vZGVJbnNlcnRlZChwYXJlbnROb2RlSWQscHJldmlvdXNOb2RlSWQscGF5bG9hZCk7fQpjaGlsZE5vZGVSZW1vdmVkKHBhcmVudE5vZGVJZCxub2RlSWQpe3RoaXMuX2RvbU1vZGVsLl9jaGlsZE5vZGVSZW1vdmVkKHBhcmVudE5vZGVJZCxub2RlSWQpO30Kc2hhZG93Um9vdFB1c2hlZChob3N0SWQscm9vdCl7dGhpcy5fZG9tTW9kZWwuX3NoYWRvd1Jvb3RQdXNoZWQoaG9zdElkLHJvb3QpO30Kc2hhZG93Um9vdFBvcHBlZChob3N0SWQscm9vdElkKXt0aGlzLl9kb21Nb2RlbC5fc2hhZG93Um9vdFBvcHBlZChob3N0SWQscm9vdElkKTt9CnBzZXVkb0VsZW1lbnRBZGRlZChwYXJlbnRJZCxwc2V1ZG9FbGVtZW50KXt0aGlzLl9kb21Nb2RlbC5fcHNldWRvRWxlbWVudEFkZGVkKHBhcmVudElkLHBzZXVkb0VsZW1lbnQpO30KcHNldWRvRWxlbWVudFJlbW92ZWQocGFyZW50SWQscHNldWRvRWxlbWVudElkKXt0aGlzLl9kb21Nb2RlbC5fcHNldWRvRWxlbWVudFJlbW92ZWQocGFyZW50SWQscHNldWRvRWxlbWVudElkKTt9CmRpc3RyaWJ1dGVkTm9kZXNVcGRhdGVkKGluc2VydGlvblBvaW50SWQsZGlzdHJpYnV0ZWROb2Rlcyl7dGhpcy5fZG9tTW9kZWwuX2Rpc3RyaWJ1dGVkTm9kZXNVcGRhdGVkKGluc2VydGlvblBvaW50SWQsZGlzdHJpYnV0ZWROb2Rlcyk7fX07U0RLLkRPTU1vZGVsVW5kb1N0YWNrPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RhY2s9W107dGhpcy5faW5kZXg9MDt0aGlzLl9sYXN0TW9kZWxXaXRoTWlub3JDaGFuZ2U9bnVsbDt9Cl9tYXJrVW5kb2FibGVTdGF0ZShtb2RlbCxtaW5vckNoYW5nZSl7aWYodGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlJiZtb2RlbCE9PXRoaXMuX2xhc3RNb2RlbFdpdGhNaW5vckNoYW5nZSl7dGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlLm1hcmtVbmRvYWJsZVN0YXRlKCk7dGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlPW51bGw7fQppZihtaW5vckNoYW5nZSYmdGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlPT09bW9kZWwpCnJldHVybjt0aGlzLl9zdGFjaz10aGlzLl9zdGFjay5zbGljZSgwLHRoaXMuX2luZGV4KTt0aGlzLl9zdGFjay5wdXNoKG1vZGVsKTt0aGlzLl9pbmRleD10aGlzLl9zdGFjay5sZW5ndGg7aWYobWlub3JDaGFuZ2Upe3RoaXMuX2xhc3RNb2RlbFdpdGhNaW5vckNoYW5nZT1tb2RlbDt9ZWxzZXttb2RlbC5fYWdlbnQubWFya1VuZG9hYmxlU3RhdGUoKTt0aGlzLl9sYXN0TW9kZWxXaXRoTWlub3JDaGFuZ2U9bnVsbDt9fQp1bmRvKCl7aWYodGhpcy5faW5kZXg9PT0wKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7LS10aGlzLl9pbmRleDt0aGlzLl9sYXN0TW9kZWxXaXRoTWlub3JDaGFuZ2U9bnVsbDtyZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5faW5kZXhdLl9hZ2VudC51bmRvKCk7fQpyZWRvKCl7aWYodGhpcy5faW5kZXg+PXRoaXMuX3N0YWNrLmxlbmd0aCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOysrdGhpcy5faW5kZXg7dGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlPW51bGw7cmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX2luZGV4LTFdLl9hZ2VudC5yZWRvKCk7fQpfZGlzcG9zZShtb2RlbCl7bGV0IHNoaWZ0PTA7Zm9yKGxldCBpPTA7aTx0aGlzLl9pbmRleDsrK2kpe2lmKHRoaXMuX3N0YWNrW2ldPT09bW9kZWwpCisrc2hpZnQ7fQp0aGlzLl9zdGFjay5yZW1vdmUobW9kZWwpO3RoaXMuX2luZGV4LT1zaGlmdDtpZih0aGlzLl9sYXN0TW9kZWxXaXRoTWlub3JDaGFuZ2U9PT1tb2RlbCkKdGhpcy5fbGFzdE1vZGVsV2l0aE1pbm9yQ2hhbmdlPW51bGw7fX07U0RLLmRvbU1vZGVsVW5kb1N0YWNrPW5ldyBTREsuRE9NTW9kZWxVbmRvU3RhY2soKTs7U0RLLkRlYnVnZ2VyTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RhcmdldC5yZWdpc3RlckRlYnVnZ2VyRGlzcGF0Y2hlcihuZXcgU0RLLkRlYnVnZ2VyRGlzcGF0Y2hlcih0aGlzKSk7dGhpcy5fYWdlbnQ9dGFyZ2V0LmRlYnVnZ2VyQWdlbnQoKTt0aGlzLl9ydW50aW1lTW9kZWw9KHRhcmdldC5tb2RlbChTREsuUnVudGltZU1vZGVsKSk7dGhpcy5fc291cmNlTWFwTWFuYWdlcj1uZXcgU0RLLlNvdXJjZU1hcE1hbmFnZXIodGFyZ2V0KTt0aGlzLl9zb3VyY2VNYXBJZFRvU2NyaXB0PW5ldyBNYXAoKTt0aGlzLl9kZWJ1Z2dlclBhdXNlZERldGFpbHM9bnVsbDt0aGlzLl9zY3JpcHRzPW5ldyBNYXAoKTt0aGlzLl9zY3JpcHRzQnlTb3VyY2VVUkw9bmV3IE1hcCgpO3RoaXMuX2Rpc2NhcmRhYmxlU2NyaXB0cz1bXTt0aGlzLl9icmVha3BvaW50UmVzb2x2ZWRFdmVudFRhcmdldD1uZXcgQ29tbW9uLk9iamVjdCgpO3RoaXMuX2lzUGF1c2luZz1mYWxzZTtDb21tb24ubW9kdWxlU2V0dGluZygncGF1c2VPbkV4Y2VwdGlvbkVuYWJsZWQnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9wYXVzZU9uRXhjZXB0aW9uU3RhdGVDaGFuZ2VkLHRoaXMpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uQ2F1Z2h0RXhjZXB0aW9uJykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fcGF1c2VPbkV4Y2VwdGlvblN0YXRlQ2hhbmdlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnZGlzYWJsZUFzeW5jU3RhY2tUcmFjZXMnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9hc3luY1N0YWNrVHJhY2VzU3RhdGVDaGFuZ2VkLHRoaXMpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdicmVha3BvaW50c0FjdGl2ZScpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2JyZWFrcG9pbnRzQWN0aXZlQ2hhbmdlZCx0aGlzKTtpZighdGFyZ2V0LnN1c3BlbmRlZCgpKQp0aGlzLl9lbmFibGVEZWJ1Z2dlcigpO3RoaXMuX3N0cmluZ01hcD1uZXcgTWFwKCk7dGhpcy5fc291cmNlTWFwTWFuYWdlci5zZXRFbmFibGVkKENvbW1vbi5tb2R1bGVTZXR0aW5nKCdqc1NvdXJjZU1hcHNFbmFibGVkJykuZ2V0KCkpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdqc1NvdXJjZU1hcHNFbmFibGVkJykuYWRkQ2hhbmdlTGlzdGVuZXIoZXZlbnQ9PnRoaXMuX3NvdXJjZU1hcE1hbmFnZXIuc2V0RW5hYmxlZCgoZXZlbnQuZGF0YSkpKTt9CnN0YXRpYyBfc291cmNlTWFwSWQoZXhlY3V0aW9uQ29udGV4dElkLHNvdXJjZVVSTCxzb3VyY2VNYXBVUkwpe2lmKCFzb3VyY2VNYXBVUkwpCnJldHVybiBudWxsO3JldHVybiBleGVjdXRpb25Db250ZXh0SWQrJzonK3NvdXJjZVVSTCsnOicrc291cmNlTWFwVVJMO30Kc291cmNlTWFwTWFuYWdlcigpe3JldHVybiB0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyO30KcnVudGltZU1vZGVsKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVNb2RlbDt9CmRlYnVnZ2VyRW5hYmxlZCgpe3JldHVybiEhdGhpcy5fZGVidWdnZXJFbmFibGVkO30KX2VuYWJsZURlYnVnZ2VyKCl7aWYodGhpcy5fZGVidWdnZXJFbmFibGVkKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dGhpcy5fZGVidWdnZXJFbmFibGVkPXRydWU7Y29uc3QgZW5hYmxlUHJvbWlzZT10aGlzLl9hZ2VudC5lbmFibGUoKTtlbmFibGVQcm9taXNlLnRoZW4odGhpcy5fcmVnaXN0ZXJEZWJ1Z2dlci5iaW5kKHRoaXMpKTt0aGlzLl9wYXVzZU9uRXhjZXB0aW9uU3RhdGVDaGFuZ2VkKCk7dGhpcy5fYXN5bmNTdGFja1RyYWNlc1N0YXRlQ2hhbmdlZCgpO2lmKCFDb21tb24ubW9kdWxlU2V0dGluZygnYnJlYWtwb2ludHNBY3RpdmUnKS5nZXQoKSkKdGhpcy5fYnJlYWtwb2ludHNBY3RpdmVDaGFuZ2VkKCk7aWYoU0RLLkRlYnVnZ2VyTW9kZWwuX3NjaGVkdWxlZFBhdXNlT25Bc3luY0NhbGwpCnRoaXMuX3BhdXNlT25Bc3luY0NhbGwoU0RLLkRlYnVnZ2VyTW9kZWwuX3NjaGVkdWxlZFBhdXNlT25Bc3luY0NhbGwpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlcldhc0VuYWJsZWQsdGhpcyk7cmV0dXJuIGVuYWJsZVByb21pc2U7fQpfcmVnaXN0ZXJEZWJ1Z2dlcihkZWJ1Z2dlcklkKXtpZighZGVidWdnZXJJZCkKcmV0dXJuO1NESy5EZWJ1Z2dlck1vZGVsLl9kZWJ1Z2dlcklkVG9Nb2RlbC5zZXQoZGVidWdnZXJJZCx0aGlzKTt0aGlzLl9kZWJ1Z2dlcklkPWRlYnVnZ2VySWQ7fQpzdGF0aWMgbW9kZWxGb3JEZWJ1Z2dlcklkKGRlYnVnZ2VySWQpe3JldHVybiBTREsuRGVidWdnZXJNb2RlbC5fZGVidWdnZXJJZFRvTW9kZWwuZ2V0KGRlYnVnZ2VySWQpfHxudWxsO30KX2Rpc2FibGVEZWJ1Z2dlcigpe2lmKCF0aGlzLl9kZWJ1Z2dlckVuYWJsZWQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0aGlzLl9kZWJ1Z2dlckVuYWJsZWQ9ZmFsc2U7Y29uc3QgZGlzYWJsZVByb21pc2U9dGhpcy5fYWdlbnQuZGlzYWJsZSgpO3RoaXMuX2lzUGF1c2luZz1mYWxzZTt0aGlzLl9hc3luY1N0YWNrVHJhY2VzU3RhdGVDaGFuZ2VkKCk7dGhpcy5nbG9iYWxPYmplY3RDbGVhcmVkKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyV2FzRGlzYWJsZWQpO1NESy5EZWJ1Z2dlck1vZGVsLl9kZWJ1Z2dlcklkVG9Nb2RlbC5kZWxldGUodGhpcy5fZGVidWdnZXJJZCk7cmV0dXJuIGRpc2FibGVQcm9taXNlO30KX3NraXBBbGxQYXVzZXMoc2tpcCl7aWYodGhpcy5fc2tpcEFsbFBhdXNlc1RpbWVvdXQpe2NsZWFyVGltZW91dCh0aGlzLl9za2lwQWxsUGF1c2VzVGltZW91dCk7ZGVsZXRlIHRoaXMuX3NraXBBbGxQYXVzZXNUaW1lb3V0O30KdGhpcy5fYWdlbnQuc2V0U2tpcEFsbFBhdXNlcyhza2lwKTt9CnNraXBBbGxQYXVzZXNVbnRpbFJlbG9hZE9yVGltZW91dCh0aW1lb3V0KXtpZih0aGlzLl9za2lwQWxsUGF1c2VzVGltZW91dCkKY2xlYXJUaW1lb3V0KHRoaXMuX3NraXBBbGxQYXVzZXNUaW1lb3V0KTt0aGlzLl9hZ2VudC5zZXRTa2lwQWxsUGF1c2VzKHRydWUpO3RoaXMuX3NraXBBbGxQYXVzZXNUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fc2tpcEFsbFBhdXNlcy5iaW5kKHRoaXMsZmFsc2UpLHRpbWVvdXQpO30KX3BhdXNlT25FeGNlcHRpb25TdGF0ZUNoYW5nZWQoKXtsZXQgc3RhdGU7aWYoIUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uRXhjZXB0aW9uRW5hYmxlZCcpLmdldCgpKQpzdGF0ZT1TREsuRGVidWdnZXJNb2RlbC5QYXVzZU9uRXhjZXB0aW9uc1N0YXRlLkRvbnRQYXVzZU9uRXhjZXB0aW9ucztlbHNlIGlmKENvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uQ2F1Z2h0RXhjZXB0aW9uJykuZ2V0KCkpCnN0YXRlPVNESy5EZWJ1Z2dlck1vZGVsLlBhdXNlT25FeGNlcHRpb25zU3RhdGUuUGF1c2VPbkFsbEV4Y2VwdGlvbnM7ZWxzZQpzdGF0ZT1TREsuRGVidWdnZXJNb2RlbC5QYXVzZU9uRXhjZXB0aW9uc1N0YXRlLlBhdXNlT25VbmNhdWdodEV4Y2VwdGlvbnM7dGhpcy5fYWdlbnQuc2V0UGF1c2VPbkV4Y2VwdGlvbnMoc3RhdGUpO30KX2FzeW5jU3RhY2tUcmFjZXNTdGF0ZUNoYW5nZWQoKXtjb25zdCBtYXhBc3luY1N0YWNrQ2hhaW5EZXB0aD0zMjtjb25zdCBlbmFibGVkPSFDb21tb24ubW9kdWxlU2V0dGluZygnZGlzYWJsZUFzeW5jU3RhY2tUcmFjZXMnKS5nZXQoKSYmdGhpcy5fZGVidWdnZXJFbmFibGVkO3RoaXMuX2FnZW50LnNldEFzeW5jQ2FsbFN0YWNrRGVwdGgoZW5hYmxlZD9tYXhBc3luY1N0YWNrQ2hhaW5EZXB0aDowKTt9Cl9icmVha3BvaW50c0FjdGl2ZUNoYW5nZWQoKXt0aGlzLl9hZ2VudC5zZXRCcmVha3BvaW50c0FjdGl2ZShDb21tb24ubW9kdWxlU2V0dGluZygnYnJlYWtwb2ludHNBY3RpdmUnKS5nZXQoKSk7fQpzdGVwSW50bygpe3RoaXMuX2FnZW50LnN0ZXBJbnRvKCk7fQpzdGVwT3Zlcigpe3RoaXMuX2FnZW50LnN0ZXBPdmVyKCk7fQpzdGVwT3V0KCl7dGhpcy5fYWdlbnQuc3RlcE91dCgpO30Kc2NoZWR1bGVTdGVwSW50b0FzeW5jKCl7dGhpcy5fYWdlbnQuaW52b2tlX3N0ZXBJbnRvKHticmVha09uQXN5bmNDYWxsOnRydWV9KTt9CnJlc3VtZSgpe3RoaXMuX2FnZW50LnJlc3VtZSgpO3RoaXMuX2lzUGF1c2luZz1mYWxzZTt9CnBhdXNlKCl7dGhpcy5faXNQYXVzaW5nPXRydWU7dGhpcy5fc2tpcEFsbFBhdXNlcyhmYWxzZSk7dGhpcy5fYWdlbnQucGF1c2UoKTt9Cl9wYXVzZU9uQXN5bmNDYWxsKHBhcmVudFN0YWNrVHJhY2VJZCl7cmV0dXJuIHRoaXMuX2FnZW50Lmludm9rZV9wYXVzZU9uQXN5bmNDYWxsKHtwYXJlbnRTdGFja1RyYWNlSWQ6cGFyZW50U3RhY2tUcmFjZUlkfSk7fQphc3luYyBzZXRCcmVha3BvaW50QnlVUkwodXJsLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNvbmRpdGlvbil7aWYodGhpcy50YXJnZXQoKS5pc05vZGVKUygpKQp1cmw9Q29tbW9uLlBhcnNlZFVSTC51cmxUb1BsYXRmb3JtUGF0aCh1cmwsSG9zdC5pc1dpbigpKTtsZXQgbWluQ29sdW1uTnVtYmVyPTA7Y29uc3Qgc2NyaXB0cz10aGlzLl9zY3JpcHRzQnlTb3VyY2VVUkwuZ2V0KHVybCl8fFtdO2ZvcihsZXQgaT0wLGw9c2NyaXB0cy5sZW5ndGg7aTxsOysraSl7Y29uc3Qgc2NyaXB0PXNjcmlwdHNbaV07aWYobGluZU51bWJlcj09PXNjcmlwdC5saW5lT2Zmc2V0KQptaW5Db2x1bW5OdW1iZXI9bWluQ29sdW1uTnVtYmVyP01hdGgubWluKG1pbkNvbHVtbk51bWJlcixzY3JpcHQuY29sdW1uT2Zmc2V0KTpzY3JpcHQuY29sdW1uT2Zmc2V0O30KY29sdW1uTnVtYmVyPU1hdGgubWF4KGNvbHVtbk51bWJlcixtaW5Db2x1bW5OdW1iZXIpO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9zZXRCcmVha3BvaW50QnlVcmwoe2xpbmVOdW1iZXI6bGluZU51bWJlcix1cmw6dXJsLGNvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXIsY29uZGl0aW9uOmNvbmRpdGlvbn0pO2lmKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKcmV0dXJue2xvY2F0aW9uczpbXSxicmVha3BvaW50SWQ6bnVsbH07bGV0IGxvY2F0aW9ucztpZihyZXNwb25zZS5sb2NhdGlvbnMpCmxvY2F0aW9ucz1yZXNwb25zZS5sb2NhdGlvbnMubWFwKHBheWxvYWQ9PlNESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uLmZyb21QYXlsb2FkKHRoaXMscGF5bG9hZCkpO3JldHVybntsb2NhdGlvbnM6bG9jYXRpb25zLGJyZWFrcG9pbnRJZDpyZXNwb25zZS5icmVha3BvaW50SWR9O30KYXN5bmMgc2V0QnJlYWtwb2ludEluQW5vbnltb3VzU2NyaXB0KHNjcmlwdElkLHNjcmlwdEhhc2gsbGluZU51bWJlcixjb2x1bW5OdW1iZXIsY29uZGl0aW9uKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2Vfc2V0QnJlYWtwb2ludEJ5VXJsKHtsaW5lTnVtYmVyOmxpbmVOdW1iZXIsc2NyaXB0SGFzaDpzY3JpcHRIYXNoLGNvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXIsY29uZGl0aW9uOmNvbmRpdGlvbn0pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXTtpZihlcnJvcil7aWYoZXJyb3IhPT0nRWl0aGVyIHVybCBvciB1cmxSZWdleCBtdXN0IGJlIHNwZWNpZmllZC4nKQpyZXR1cm57bG9jYXRpb25zOltdLGJyZWFrcG9pbnRJZDpudWxsfTtyZXR1cm4gdGhpcy5fc2V0QnJlYWtwb2ludEJ5U291cmNlSWQoc2NyaXB0SWQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIsY29uZGl0aW9uKTt9CmxldCBsb2NhdGlvbnM7aWYocmVzcG9uc2UubG9jYXRpb25zKQpsb2NhdGlvbnM9cmVzcG9uc2UubG9jYXRpb25zLm1hcChwYXlsb2FkPT5TREsuRGVidWdnZXJNb2RlbC5Mb2NhdGlvbi5mcm9tUGF5bG9hZCh0aGlzLHBheWxvYWQpKTtyZXR1cm57bG9jYXRpb25zOmxvY2F0aW9ucyxicmVha3BvaW50SWQ6cmVzcG9uc2UuYnJlYWtwb2ludElkfTt9CmFzeW5jIF9zZXRCcmVha3BvaW50QnlTb3VyY2VJZChzY3JpcHRJZCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24pe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9zZXRCcmVha3BvaW50KHtsb2NhdGlvbjp7c2NyaXB0SWQ6c2NyaXB0SWQsbGluZU51bWJlcjpsaW5lTnVtYmVyLGNvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXJ9LGNvbmRpdGlvbjpjb25kaXRpb259KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnJldHVybnticmVha3BvaW50SWQ6bnVsbCxsb2NhdGlvbnM6W119O2xldCBhY3R1YWxMb2NhdGlvbj1bXTtpZihyZXNwb25zZS5hY3R1YWxMb2NhdGlvbikKYWN0dWFsTG9jYXRpb249W1NESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uLmZyb21QYXlsb2FkKHRoaXMscmVzcG9uc2UuYWN0dWFsTG9jYXRpb24pXTtyZXR1cm57bG9jYXRpb25zOmFjdHVhbExvY2F0aW9uLGJyZWFrcG9pbnRJZDpyZXNwb25zZS5icmVha3BvaW50SWR9O30KYXN5bmMgcmVtb3ZlQnJlYWtwb2ludChicmVha3BvaW50SWQpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9yZW1vdmVCcmVha3BvaW50KHticmVha3BvaW50SWR9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCmNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZW1vdmUgYnJlYWtwb2ludDogJytyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pO30KYXN5bmMgZ2V0UG9zc2libGVCcmVha3BvaW50cyhzdGFydExvY2F0aW9uLGVuZExvY2F0aW9uLHJlc3RyaWN0VG9GdW5jdGlvbil7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX2dldFBvc3NpYmxlQnJlYWtwb2ludHMoe3N0YXJ0OnN0YXJ0TG9jYXRpb24ucGF5bG9hZCgpLGVuZDplbmRMb2NhdGlvbj9lbmRMb2NhdGlvbi5wYXlsb2FkKCk6dW5kZWZpbmVkLHJlc3RyaWN0VG9GdW5jdGlvbjpyZXN0cmljdFRvRnVuY3Rpb259KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fCFyZXNwb25zZS5sb2NhdGlvbnMpCnJldHVybltdO3JldHVybiByZXNwb25zZS5sb2NhdGlvbnMubWFwKGxvY2F0aW9uPT5TREsuRGVidWdnZXJNb2RlbC5CcmVha0xvY2F0aW9uLmZyb21QYXlsb2FkKHRoaXMsbG9jYXRpb24pKTt9CmFzeW5jIGZldGNoQXN5bmNTdGFja1RyYWNlKHN0YWNrSWQpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9nZXRTdGFja1RyYWNlKHtzdGFja1RyYWNlSWQ6c3RhY2tJZH0pO3JldHVybiByZXNwb25zZVtQcm90b2NvbC5FcnJvcl0/bnVsbDpyZXNwb25zZS5zdGFja1RyYWNlO30KX2JyZWFrcG9pbnRSZXNvbHZlZChicmVha3BvaW50SWQsbG9jYXRpb24pe3RoaXMuX2JyZWFrcG9pbnRSZXNvbHZlZEV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhicmVha3BvaW50SWQsU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24uZnJvbVBheWxvYWQodGhpcyxsb2NhdGlvbikpO30KZ2xvYmFsT2JqZWN0Q2xlYXJlZCgpe3RoaXMuX3NldERlYnVnZ2VyUGF1c2VkRGV0YWlscyhudWxsKTt0aGlzLl9yZXNldCgpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMpO30KX3Jlc2V0KCl7Zm9yKGNvbnN0IHNjcmlwdFdpdGhTb3VyY2VNYXAgb2YgdGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC52YWx1ZXMoKSkKdGhpcy5fc291cmNlTWFwTWFuYWdlci5kZXRhY2hTb3VyY2VNYXAoc2NyaXB0V2l0aFNvdXJjZU1hcCk7dGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC5jbGVhcigpO3RoaXMuX3NjcmlwdHMuY2xlYXIoKTt0aGlzLl9zY3JpcHRzQnlTb3VyY2VVUkwuY2xlYXIoKTt0aGlzLl9zdHJpbmdNYXAuY2xlYXIoKTt0aGlzLl9kaXNjYXJkYWJsZVNjcmlwdHM9W107fQpzY3JpcHRzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fc2NyaXB0cy52YWx1ZXMoKSk7fQpzY3JpcHRGb3JJZChzY3JpcHRJZCl7cmV0dXJuIHRoaXMuX3NjcmlwdHMuZ2V0KHNjcmlwdElkKXx8bnVsbDt9CnNjcmlwdHNGb3JTb3VyY2VVUkwoc291cmNlVVJMKXtpZighc291cmNlVVJMKQpyZXR1cm5bXTtyZXR1cm4gdGhpcy5fc2NyaXB0c0J5U291cmNlVVJMLmdldChzb3VyY2VVUkwpfHxbXTt9CnNjcmlwdHNGb3JFeGVjdXRpb25Db250ZXh0KGV4ZWN1dGlvbkNvbnRleHQpe2NvbnN0IHJlc3VsdD1bXTtmb3IoY29uc3Qgc2NyaXB0IG9mIHRoaXMuX3NjcmlwdHMudmFsdWVzKCkpe2lmKHNjcmlwdC5leGVjdXRpb25Db250ZXh0SWQ9PT1leGVjdXRpb25Db250ZXh0LmlkKQpyZXN1bHQucHVzaChzY3JpcHQpO30KcmV0dXJuIHJlc3VsdDt9CnNldFNjcmlwdFNvdXJjZShzY3JpcHRJZCxuZXdTb3VyY2UsY2FsbGJhY2spe3RoaXMuX3NjcmlwdHMuZ2V0KHNjcmlwdElkKS5lZGl0U291cmNlKG5ld1NvdXJjZSx0aGlzLl9kaWRFZGl0U2NyaXB0U291cmNlLmJpbmQodGhpcyxzY3JpcHRJZCxuZXdTb3VyY2UsY2FsbGJhY2spKTt9Cl9kaWRFZGl0U2NyaXB0U291cmNlKHNjcmlwdElkLG5ld1NvdXJjZSxjYWxsYmFjayxlcnJvcixleGNlcHRpb25EZXRhaWxzLGNhbGxGcmFtZXMsYXN5bmNTdGFja1RyYWNlLGFzeW5jU3RhY2tUcmFjZUlkLG5lZWRzU3RlcEluKXtjYWxsYmFjayhlcnJvcixleGNlcHRpb25EZXRhaWxzKTtpZihuZWVkc1N0ZXBJbil7dGhpcy5zdGVwSW50bygpO3JldHVybjt9CmlmKCFlcnJvciYmY2FsbEZyYW1lcyYmY2FsbEZyYW1lcy5sZW5ndGgpe3RoaXMuX3BhdXNlZFNjcmlwdChjYWxsRnJhbWVzLHRoaXMuX2RlYnVnZ2VyUGF1c2VkRGV0YWlscy5yZWFzb24sdGhpcy5fZGVidWdnZXJQYXVzZWREZXRhaWxzLmF1eERhdGEsdGhpcy5fZGVidWdnZXJQYXVzZWREZXRhaWxzLmJyZWFrcG9pbnRJZHMsYXN5bmNTdGFja1RyYWNlLGFzeW5jU3RhY2tUcmFjZUlkKTt9fQpnZXQgY2FsbEZyYW1lcygpe3JldHVybiB0aGlzLl9kZWJ1Z2dlclBhdXNlZERldGFpbHM/dGhpcy5fZGVidWdnZXJQYXVzZWREZXRhaWxzLmNhbGxGcmFtZXM6bnVsbDt9CmRlYnVnZ2VyUGF1c2VkRGV0YWlscygpe3JldHVybiB0aGlzLl9kZWJ1Z2dlclBhdXNlZERldGFpbHM7fQpfc2V0RGVidWdnZXJQYXVzZWREZXRhaWxzKGRlYnVnZ2VyUGF1c2VkRGV0YWlscyl7dGhpcy5faXNQYXVzaW5nPWZhbHNlO3RoaXMuX2RlYnVnZ2VyUGF1c2VkRGV0YWlscz1kZWJ1Z2dlclBhdXNlZERldGFpbHM7aWYodGhpcy5fZGVidWdnZXJQYXVzZWREZXRhaWxzKXtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgnZW1wdHlTb3VyY2VNYXBBdXRvU3RlcHBpbmcnKSYmdGhpcy5fYmVmb3JlUGF1c2VkQ2FsbGJhY2spe2lmKCF0aGlzLl9iZWZvcmVQYXVzZWRDYWxsYmFjay5jYWxsKG51bGwsdGhpcy5fZGVidWdnZXJQYXVzZWREZXRhaWxzKSkKcmV0dXJuIGZhbHNlO30KdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyUGF1c2VkLHRoaXMpO30KaWYoZGVidWdnZXJQYXVzZWREZXRhaWxzKQp0aGlzLnNldFNlbGVjdGVkQ2FsbEZyYW1lKGRlYnVnZ2VyUGF1c2VkRGV0YWlscy5jYWxsRnJhbWVzWzBdKTtlbHNlCnRoaXMuc2V0U2VsZWN0ZWRDYWxsRnJhbWUobnVsbCk7cmV0dXJuIHRydWU7fQpzZXRCZWZvcmVQYXVzZWRDYWxsYmFjayhjYWxsYmFjayl7dGhpcy5fYmVmb3JlUGF1c2VkQ2FsbGJhY2s9Y2FsbGJhY2s7fQphc3luYyBfcGF1c2VkU2NyaXB0KGNhbGxGcmFtZXMscmVhc29uLGF1eERhdGEsYnJlYWtwb2ludElkcyxhc3luY1N0YWNrVHJhY2UsYXN5bmNTdGFja1RyYWNlSWQsYXN5bmNDYWxsU3RhY2tUcmFjZUlkKXtpZihhc3luY0NhbGxTdGFja1RyYWNlSWQpe1NESy5EZWJ1Z2dlck1vZGVsLl9zY2hlZHVsZWRQYXVzZU9uQXN5bmNDYWxsPWFzeW5jQ2FsbFN0YWNrVHJhY2VJZDtjb25zdCBwcm9taXNlcz1bXTtmb3IoY29uc3QgbW9kZWwgb2YgU0RLLkRlYnVnZ2VyTW9kZWwuX2RlYnVnZ2VySWRUb01vZGVsLnZhbHVlcygpKQpwcm9taXNlcy5wdXNoKG1vZGVsLl9wYXVzZU9uQXN5bmNDYWxsKGFzeW5jQ2FsbFN0YWNrVHJhY2VJZCkpO2F3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTt0aGlzLnJlc3VtZSgpO3JldHVybjt9CmNvbnN0IHBhdXNlZERldGFpbHM9bmV3IFNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHModGhpcyxjYWxsRnJhbWVzLHJlYXNvbixhdXhEYXRhLGJyZWFrcG9pbnRJZHMsYXN5bmNTdGFja1RyYWNlLGFzeW5jU3RhY2tUcmFjZUlkKTtpZihwYXVzZWREZXRhaWxzJiZ0aGlzLl9jb250aW51ZVRvTG9jYXRpb25DYWxsYmFjayl7Y29uc3QgY2FsbGJhY2s9dGhpcy5fY29udGludWVUb0xvY2F0aW9uQ2FsbGJhY2s7ZGVsZXRlIHRoaXMuX2NvbnRpbnVlVG9Mb2NhdGlvbkNhbGxiYWNrO2lmKGNhbGxiYWNrKHBhdXNlZERldGFpbHMpKQpyZXR1cm47fQppZighdGhpcy5fc2V0RGVidWdnZXJQYXVzZWREZXRhaWxzKHBhdXNlZERldGFpbHMpKQp0aGlzLl9hZ2VudC5zdGVwSW50bygpO1NESy5EZWJ1Z2dlck1vZGVsLl9zY2hlZHVsZWRQYXVzZU9uQXN5bmNDYWxsPW51bGw7fQpfcmVzdW1lZFNjcmlwdCgpe3RoaXMuX3NldERlYnVnZ2VyUGF1c2VkRGV0YWlscyhudWxsKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRGVidWdnZXJSZXN1bWVkLHRoaXMpO30KX3BhcnNlZFNjcmlwdFNvdXJjZShzY3JpcHRJZCxzb3VyY2VVUkwsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uLGV4ZWN1dGlvbkNvbnRleHRJZCxoYXNoLGV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhLGlzTGl2ZUVkaXQsc291cmNlTWFwVVJMLGhhc1NvdXJjZVVSTENvbW1lbnQsaGFzU3ludGF4RXJyb3IsbGVuZ3RoKXtsZXQgaXNDb250ZW50U2NyaXB0PWZhbHNlO2lmKGV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhJiYoJ2lzRGVmYXVsdCdpbiBleGVjdXRpb25Db250ZXh0QXV4RGF0YSkpCmlzQ29udGVudFNjcmlwdD0hZXhlY3V0aW9uQ29udGV4dEF1eERhdGFbJ2lzRGVmYXVsdCddO2lmKHRoaXMudGFyZ2V0KCkuaXNOb2RlSlMoKSYmc291cmNlVVJMJiYhaGFzU291cmNlVVJMQ29tbWVudCl7Y29uc3Qgbm9kZUpTUGF0aD1zb3VyY2VVUkw7c291cmNlVVJMPUNvbW1vbi5QYXJzZWRVUkwucGxhdGZvcm1QYXRoVG9VUkwobm9kZUpTUGF0aCk7c291cmNlVVJMPXRoaXMuX2ludGVyblN0cmluZyhzb3VyY2VVUkwpO31lbHNle3NvdXJjZVVSTD10aGlzLl9pbnRlcm5TdHJpbmcoc291cmNlVVJMKTt9CmNvbnN0IHNjcmlwdD1uZXcgU0RLLlNjcmlwdCh0aGlzLHNjcmlwdElkLHNvdXJjZVVSTCxzdGFydExpbmUsc3RhcnRDb2x1bW4sZW5kTGluZSxlbmRDb2x1bW4sZXhlY3V0aW9uQ29udGV4dElkLHRoaXMuX2ludGVyblN0cmluZyhoYXNoKSxpc0NvbnRlbnRTY3JpcHQsaXNMaXZlRWRpdCxzb3VyY2VNYXBVUkwsaGFzU291cmNlVVJMQ29tbWVudCxsZW5ndGgpO3RoaXMuX3JlZ2lzdGVyU2NyaXB0KHNjcmlwdCk7aWYoIWhhc1N5bnRheEVycm9yKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuUGFyc2VkU2NyaXB0U291cmNlLHNjcmlwdCk7ZWxzZQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRmFpbGVkVG9QYXJzZVNjcmlwdFNvdXJjZSxzY3JpcHQpO2NvbnN0IHNvdXJjZU1hcElkPVNESy5EZWJ1Z2dlck1vZGVsLl9zb3VyY2VNYXBJZChzY3JpcHQuZXhlY3V0aW9uQ29udGV4dElkLHNjcmlwdC5zb3VyY2VVUkwsc2NyaXB0LnNvdXJjZU1hcFVSTCk7aWYoc291cmNlTWFwSWQmJiFoYXNTeW50YXhFcnJvcil7Y29uc3QgcHJldmlvdXNTY3JpcHQ9dGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC5nZXQoc291cmNlTWFwSWQpO2lmKHByZXZpb3VzU2NyaXB0KQp0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmRldGFjaFNvdXJjZU1hcChwcmV2aW91c1NjcmlwdCk7dGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC5zZXQoc291cmNlTWFwSWQsc2NyaXB0KTt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmF0dGFjaFNvdXJjZU1hcChzY3JpcHQsc2NyaXB0LnNvdXJjZVVSTCxzY3JpcHQuc291cmNlTWFwVVJMKTt9CmNvbnN0IGlzRGlzY2FyZGFibGU9aGFzU3ludGF4RXJyb3ImJnNjcmlwdC5pc0Fub255bW91c1NjcmlwdCgpO2lmKGlzRGlzY2FyZGFibGUpe3RoaXMuX2Rpc2NhcmRhYmxlU2NyaXB0cy5wdXNoKHNjcmlwdCk7dGhpcy5fY29sbGVjdERpc2NhcmRlZFNjcmlwdHMoKTt9CnJldHVybiBzY3JpcHQ7fQpzZXRTb3VyY2VNYXBVUkwoc2NyaXB0LG5ld1NvdXJjZU1hcFVSTCl7bGV0IHNvdXJjZU1hcElkPVNESy5EZWJ1Z2dlck1vZGVsLl9zb3VyY2VNYXBJZChzY3JpcHQuZXhlY3V0aW9uQ29udGV4dElkLHNjcmlwdC5zb3VyY2VVUkwsc2NyaXB0LnNvdXJjZU1hcFVSTCk7aWYoc291cmNlTWFwSWQmJnRoaXMuX3NvdXJjZU1hcElkVG9TY3JpcHQuZ2V0KHNvdXJjZU1hcElkKT09PXNjcmlwdCkKdGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC5kZWxldGUoc291cmNlTWFwSWQpO3RoaXMuX3NvdXJjZU1hcE1hbmFnZXIuZGV0YWNoU291cmNlTWFwKHNjcmlwdCk7c2NyaXB0LnNvdXJjZU1hcFVSTD1uZXdTb3VyY2VNYXBVUkw7c291cmNlTWFwSWQ9U0RLLkRlYnVnZ2VyTW9kZWwuX3NvdXJjZU1hcElkKHNjcmlwdC5leGVjdXRpb25Db250ZXh0SWQsc2NyaXB0LnNvdXJjZVVSTCxzY3JpcHQuc291cmNlTWFwVVJMKTtpZighc291cmNlTWFwSWQpCnJldHVybjt0aGlzLl9zb3VyY2VNYXBJZFRvU2NyaXB0LnNldChzb3VyY2VNYXBJZCxzY3JpcHQpO3RoaXMuX3NvdXJjZU1hcE1hbmFnZXIuYXR0YWNoU291cmNlTWFwKHNjcmlwdCxzY3JpcHQuc291cmNlVVJMLHNjcmlwdC5zb3VyY2VNYXBVUkwpO30KZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZChleGVjdXRpb25Db250ZXh0KXtjb25zdCBzb3VyY2VNYXBJZHM9QXJyYXkuZnJvbSh0aGlzLl9zb3VyY2VNYXBJZFRvU2NyaXB0LmtleXMoKSk7Zm9yKGNvbnN0IHNvdXJjZU1hcElkIG9mIHNvdXJjZU1hcElkcyl7Y29uc3Qgc2NyaXB0PXRoaXMuX3NvdXJjZU1hcElkVG9TY3JpcHQuZ2V0KHNvdXJjZU1hcElkKTtpZihzY3JpcHQuZXhlY3V0aW9uQ29udGV4dElkPT09ZXhlY3V0aW9uQ29udGV4dC5pZCl7dGhpcy5fc291cmNlTWFwSWRUb1NjcmlwdC5kZWxldGUoc291cmNlTWFwSWQpO3RoaXMuX3NvdXJjZU1hcE1hbmFnZXIuZGV0YWNoU291cmNlTWFwKHNjcmlwdCk7fX19Cl9yZWdpc3RlclNjcmlwdChzY3JpcHQpe3RoaXMuX3NjcmlwdHMuc2V0KHNjcmlwdC5zY3JpcHRJZCxzY3JpcHQpO2lmKHNjcmlwdC5pc0Fub255bW91c1NjcmlwdCgpKQpyZXR1cm47bGV0IHNjcmlwdHM9dGhpcy5fc2NyaXB0c0J5U291cmNlVVJMLmdldChzY3JpcHQuc291cmNlVVJMKTtpZighc2NyaXB0cyl7c2NyaXB0cz1bXTt0aGlzLl9zY3JpcHRzQnlTb3VyY2VVUkwuc2V0KHNjcmlwdC5zb3VyY2VVUkwsc2NyaXB0cyk7fQpzY3JpcHRzLnB1c2goc2NyaXB0KTt9Cl91bnJlZ2lzdGVyU2NyaXB0KHNjcmlwdCl7Y29uc29sZS5hc3NlcnQoc2NyaXB0LmlzQW5vbnltb3VzU2NyaXB0KCkpO3RoaXMuX3NjcmlwdHMuZGVsZXRlKHNjcmlwdC5zY3JpcHRJZCk7fQpfY29sbGVjdERpc2NhcmRlZFNjcmlwdHMoKXtpZih0aGlzLl9kaXNjYXJkYWJsZVNjcmlwdHMubGVuZ3RoPDEwMDApCnJldHVybjtjb25zdCBzY3JpcHRzVG9EaXNjYXJkPXRoaXMuX2Rpc2NhcmRhYmxlU2NyaXB0cy5zcGxpY2UoMCwxMDApO2Zvcihjb25zdCBzY3JpcHQgb2Ygc2NyaXB0c1RvRGlzY2FyZCl7dGhpcy5fdW5yZWdpc3RlclNjcmlwdChzY3JpcHQpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EaXNjYXJkZWRBbm9ueW1vdXNTY3JpcHRTb3VyY2Usc2NyaXB0KTt9fQpjcmVhdGVSYXdMb2NhdGlvbihzY3JpcHQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybiBuZXcgU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24odGhpcyxzY3JpcHQuc2NyaXB0SWQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KY3JlYXRlUmF3TG9jYXRpb25CeVVSTChzb3VyY2VVUkwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2xldCBjbG9zZXN0U2NyaXB0PW51bGw7Y29uc3Qgc2NyaXB0cz10aGlzLl9zY3JpcHRzQnlTb3VyY2VVUkwuZ2V0KHNvdXJjZVVSTCl8fFtdO2ZvcihsZXQgaT0wLGw9c2NyaXB0cy5sZW5ndGg7aTxsOysraSl7Y29uc3Qgc2NyaXB0PXNjcmlwdHNbaV07aWYoIWNsb3Nlc3RTY3JpcHQpCmNsb3Nlc3RTY3JpcHQ9c2NyaXB0O2lmKHNjcmlwdC5saW5lT2Zmc2V0PmxpbmVOdW1iZXJ8fChzY3JpcHQubGluZU9mZnNldD09PWxpbmVOdW1iZXImJnNjcmlwdC5jb2x1bW5PZmZzZXQ+Y29sdW1uTnVtYmVyKSkKY29udGludWU7aWYoc2NyaXB0LmVuZExpbmU8bGluZU51bWJlcnx8KHNjcmlwdC5lbmRMaW5lPT09bGluZU51bWJlciYmc2NyaXB0LmVuZENvbHVtbjw9Y29sdW1uTnVtYmVyKSkKY29udGludWU7Y2xvc2VzdFNjcmlwdD1zY3JpcHQ7YnJlYWs7fQpyZXR1cm4gY2xvc2VzdFNjcmlwdD9uZXcgU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24odGhpcyxjbG9zZXN0U2NyaXB0LnNjcmlwdElkLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTpudWxsO30KY3JlYXRlUmF3TG9jYXRpb25CeVNjcmlwdElkKHNjcmlwdElkLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBzY3JpcHQ9dGhpcy5zY3JpcHRGb3JJZChzY3JpcHRJZCk7cmV0dXJuIHNjcmlwdD90aGlzLmNyZWF0ZVJhd0xvY2F0aW9uKHNjcmlwdCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik6bnVsbDt9CmNyZWF0ZVJhd0xvY2F0aW9uc0J5U3RhY2tUcmFjZShzdGFja1RyYWNlKXtjb25zdCBmcmFtZXM9W107d2hpbGUoc3RhY2tUcmFjZSl7Zm9yKGNvbnN0IGZyYW1lIG9mIHN0YWNrVHJhY2UuY2FsbEZyYW1lcykKZnJhbWVzLnB1c2goZnJhbWUpO3N0YWNrVHJhY2U9c3RhY2tUcmFjZS5wYXJlbnQ7fQpjb25zdCByYXdMb2NhdGlvbnM9W107Zm9yKGNvbnN0IGZyYW1lIG9mIGZyYW1lcyl7Y29uc3QgcmF3TG9jYXRpb249dGhpcy5jcmVhdGVSYXdMb2NhdGlvbkJ5U2NyaXB0SWQoZnJhbWUuc2NyaXB0SWQsZnJhbWUubGluZU51bWJlcixmcmFtZS5jb2x1bW5OdW1iZXIpO2lmKHJhd0xvY2F0aW9uKQpyYXdMb2NhdGlvbnMucHVzaChyYXdMb2NhdGlvbik7fQpyZXR1cm4gcmF3TG9jYXRpb25zO30KaXNQYXVzZWQoKXtyZXR1cm4hIXRoaXMuZGVidWdnZXJQYXVzZWREZXRhaWxzKCk7fQppc1BhdXNpbmcoKXtyZXR1cm4gdGhpcy5faXNQYXVzaW5nO30Kc2V0U2VsZWN0ZWRDYWxsRnJhbWUoY2FsbEZyYW1lKXtpZih0aGlzLl9zZWxlY3RlZENhbGxGcmFtZT09PWNhbGxGcmFtZSkKcmV0dXJuO3RoaXMuX3NlbGVjdGVkQ2FsbEZyYW1lPWNhbGxGcmFtZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuQ2FsbEZyYW1lU2VsZWN0ZWQsdGhpcyk7fQpzZWxlY3RlZENhbGxGcmFtZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZENhbGxGcmFtZTt9CmV2YWx1YXRlT25TZWxlY3RlZENhbGxGcmFtZShvcHRpb25zKXtyZXR1cm4gdGhpcy5zZWxlY3RlZENhbGxGcmFtZSgpLmV2YWx1YXRlKG9wdGlvbnMpO30KZnVuY3Rpb25EZXRhaWxzUHJvbWlzZShyZW1vdGVPYmplY3Qpe3JldHVybiByZW1vdGVPYmplY3QuZ2V0QWxsUHJvcGVydGllc1Byb21pc2UoZmFsc2UsZmFsc2UpLnRoZW4oYnVpbGREZXRhaWxzLmJpbmQodGhpcykpO2Z1bmN0aW9uIGJ1aWxkRGV0YWlscyhyZXNwb25zZSl7aWYoIXJlc3BvbnNlKQpyZXR1cm4gbnVsbDtsZXQgbG9jYXRpb249bnVsbDtpZihyZXNwb25zZS5pbnRlcm5hbFByb3BlcnRpZXMpe2Zvcihjb25zdCBwcm9wIG9mIHJlc3BvbnNlLmludGVybmFsUHJvcGVydGllcyl7aWYocHJvcC5uYW1lPT09J1tbRnVuY3Rpb25Mb2NhdGlvbl1dJykKbG9jYXRpb249cHJvcC52YWx1ZTt9fQpsZXQgZnVuY3Rpb25OYW1lPW51bGw7aWYocmVzcG9uc2UucHJvcGVydGllcyl7Zm9yKGNvbnN0IHByb3Agb2YgcmVzcG9uc2UucHJvcGVydGllcyl7aWYocHJvcC5uYW1lPT09J25hbWUnJiZwcm9wLnZhbHVlJiZwcm9wLnZhbHVlLnR5cGU9PT0nc3RyaW5nJykKZnVuY3Rpb25OYW1lPXByb3AudmFsdWU7aWYocHJvcC5uYW1lPT09J2Rpc3BsYXlOYW1lJyYmcHJvcC52YWx1ZSYmcHJvcC52YWx1ZS50eXBlPT09J3N0cmluZycpe2Z1bmN0aW9uTmFtZT1wcm9wLnZhbHVlO2JyZWFrO319fQpsZXQgZGVidWdnZXJMb2NhdGlvbj1udWxsO2lmKGxvY2F0aW9uKXtkZWJ1Z2dlckxvY2F0aW9uPXRoaXMuY3JlYXRlUmF3TG9jYXRpb25CeVNjcmlwdElkKGxvY2F0aW9uLnZhbHVlLnNjcmlwdElkLGxvY2F0aW9uLnZhbHVlLmxpbmVOdW1iZXIsbG9jYXRpb24udmFsdWUuY29sdW1uTnVtYmVyKTt9CnJldHVybntsb2NhdGlvbjpkZWJ1Z2dlckxvY2F0aW9uLGZ1bmN0aW9uTmFtZTpmdW5jdGlvbk5hbWU/ZnVuY3Rpb25OYW1lLnZhbHVlOicnfTt9fQphc3luYyBzZXRWYXJpYWJsZVZhbHVlKHNjb3BlTnVtYmVyLHZhcmlhYmxlTmFtZSxuZXdWYWx1ZSxjYWxsRnJhbWVJZCl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX3NldFZhcmlhYmxlVmFsdWUoe3Njb3BlTnVtYmVyLHZhcmlhYmxlTmFtZSxuZXdWYWx1ZSxjYWxsRnJhbWVJZH0pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXTtpZihlcnJvcikKY29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJuIGVycm9yO30KYWRkQnJlYWtwb2ludExpc3RlbmVyKGJyZWFrcG9pbnRJZCxsaXN0ZW5lcix0aGlzT2JqZWN0KXt0aGlzLl9icmVha3BvaW50UmVzb2x2ZWRFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKGJyZWFrcG9pbnRJZCxsaXN0ZW5lcix0aGlzT2JqZWN0KTt9CnJlbW92ZUJyZWFrcG9pbnRMaXN0ZW5lcihicmVha3BvaW50SWQsbGlzdGVuZXIsdGhpc09iamVjdCl7dGhpcy5fYnJlYWtwb2ludFJlc29sdmVkRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihicmVha3BvaW50SWQsbGlzdGVuZXIsdGhpc09iamVjdCk7fQphc3luYyBzZXRCbGFja2JveFBhdHRlcm5zKHBhdHRlcm5zKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2Vfc2V0QmxhY2tib3hQYXR0ZXJucyh7cGF0dGVybnN9KTtjb25zdCBlcnJvcj1yZXNwb25zZVtQcm90b2NvbC5FcnJvcl07aWYoZXJyb3IpCmNvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybiFlcnJvcjt9CmRpc3Bvc2UoKXt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmRpc3Bvc2UoKTtTREsuRGVidWdnZXJNb2RlbC5fZGVidWdnZXJJZFRvTW9kZWwuZGVsZXRlKHRoaXMuX2RlYnVnZ2VySWQpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uRXhjZXB0aW9uRW5hYmxlZCcpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuX3BhdXNlT25FeGNlcHRpb25TdGF0ZUNoYW5nZWQsdGhpcyk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3BhdXNlT25DYXVnaHRFeGNlcHRpb24nKS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl9wYXVzZU9uRXhjZXB0aW9uU3RhdGVDaGFuZ2VkLHRoaXMpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdkaXNhYmxlQXN5bmNTdGFja1RyYWNlcycpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuX2FzeW5jU3RhY2tUcmFjZXNTdGF0ZUNoYW5nZWQsdGhpcyk7fQphc3luYyBzdXNwZW5kTW9kZWwoKXthd2FpdCB0aGlzLl9kaXNhYmxlRGVidWdnZXIoKTt9CmFzeW5jIHJlc3VtZU1vZGVsKCl7YXdhaXQgdGhpcy5fZW5hYmxlRGVidWdnZXIoKTt9Cl9pbnRlcm5TdHJpbmcoc3RyaW5nKXtpZighdGhpcy5fc3RyaW5nTWFwLmhhcyhzdHJpbmcpKQp0aGlzLl9zdHJpbmdNYXAuc2V0KHN0cmluZyxzdHJpbmcpO3JldHVybiB0aGlzLl9zdHJpbmdNYXAuZ2V0KHN0cmluZyk7fX07U0RLLkRlYnVnZ2VyTW9kZWwuX2RlYnVnZ2VySWRUb01vZGVsPW5ldyBNYXAoKTtTREsuRGVidWdnZXJNb2RlbC5fc2NoZWR1bGVkUGF1c2VPbkFzeW5jQ2FsbD1udWxsO1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuRGVidWdnZXJNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSlMsdHJ1ZSk7U0RLLkRlYnVnZ2VyTW9kZWwuRnVuY3Rpb25EZXRhaWxzO1NESy5EZWJ1Z2dlck1vZGVsLlBhdXNlT25FeGNlcHRpb25zU3RhdGU9e0RvbnRQYXVzZU9uRXhjZXB0aW9uczonbm9uZScsUGF1c2VPbkFsbEV4Y2VwdGlvbnM6J2FsbCcsUGF1c2VPblVuY2F1Z2h0RXhjZXB0aW9uczondW5jYXVnaHQnfTtTREsuRGVidWdnZXJNb2RlbC5FdmVudHM9e0RlYnVnZ2VyV2FzRW5hYmxlZDpTeW1ib2woJ0RlYnVnZ2VyV2FzRW5hYmxlZCcpLERlYnVnZ2VyV2FzRGlzYWJsZWQ6U3ltYm9sKCdEZWJ1Z2dlcldhc0Rpc2FibGVkJyksRGVidWdnZXJQYXVzZWQ6U3ltYm9sKCdEZWJ1Z2dlclBhdXNlZCcpLERlYnVnZ2VyUmVzdW1lZDpTeW1ib2woJ0RlYnVnZ2VyUmVzdW1lZCcpLFBhcnNlZFNjcmlwdFNvdXJjZTpTeW1ib2woJ1BhcnNlZFNjcmlwdFNvdXJjZScpLEZhaWxlZFRvUGFyc2VTY3JpcHRTb3VyY2U6U3ltYm9sKCdGYWlsZWRUb1BhcnNlU2NyaXB0U291cmNlJyksRGlzY2FyZGVkQW5vbnltb3VzU2NyaXB0U291cmNlOlN5bWJvbCgnRGlzY2FyZGVkQW5vbnltb3VzU2NyaXB0U291cmNlJyksR2xvYmFsT2JqZWN0Q2xlYXJlZDpTeW1ib2woJ0dsb2JhbE9iamVjdENsZWFyZWQnKSxDYWxsRnJhbWVTZWxlY3RlZDpTeW1ib2woJ0NhbGxGcmFtZVNlbGVjdGVkJyksQ29uc29sZUNvbW1hbmRFdmFsdWF0ZWRJblNlbGVjdGVkQ2FsbEZyYW1lOlN5bWJvbCgnQ29uc29sZUNvbW1hbmRFdmFsdWF0ZWRJblNlbGVjdGVkQ2FsbEZyYW1lJyl9O1NESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uPXtET006J0RPTScsRXZlbnRMaXN0ZW5lcjonRXZlbnRMaXN0ZW5lcicsWEhSOidYSFInLEV4Y2VwdGlvbjonZXhjZXB0aW9uJyxQcm9taXNlUmVqZWN0aW9uOidwcm9taXNlUmVqZWN0aW9uJyxBc3NlcnQ6J2Fzc2VydCcsRGVidWdDb21tYW5kOidkZWJ1Z0NvbW1hbmQnLE9PTTonT09NJyxPdGhlcjonb3RoZXInfTtTREsuRGVidWdnZXJNb2RlbC5CcmVha0xvY2F0aW9uVHlwZT17UmV0dXJuOidyZXR1cm4nLENhbGw6J2NhbGwnLERlYnVnZ2VyU3RhdGVtZW50OidkZWJ1Z2dlclN0YXRlbWVudCd9O1NESy5EZWJ1Z2dlckV2ZW50VHlwZXM9e0phdmFTY3JpcHRQYXVzZTowLEphdmFTY3JpcHRCcmVha3BvaW50OjEsTmF0aXZlQnJlYWtwb2ludDoyfTtTREsuRGVidWdnZXJNb2RlbC5Db250aW51ZVRvTG9jYXRpb25UYXJnZXRDYWxsRnJhbWVzPXtBbnk6J2FueScsQ3VycmVudDonY3VycmVudCd9O1NESy5EZWJ1Z2dlck1vZGVsLlNldEJyZWFrcG9pbnRSZXN1bHQ7U0RLLkRlYnVnZ2VyRGlzcGF0Y2hlcj1jbGFzc3tjb25zdHJ1Y3RvcihkZWJ1Z2dlck1vZGVsKXt0aGlzLl9kZWJ1Z2dlck1vZGVsPWRlYnVnZ2VyTW9kZWw7fQpwYXVzZWQoY2FsbEZyYW1lcyxyZWFzb24sYXV4RGF0YSxicmVha3BvaW50SWRzLGFzeW5jU3RhY2tUcmFjZSxhc3luY1N0YWNrVHJhY2VJZCxhc3luY0NhbGxTdGFja1RyYWNlSWQpe3RoaXMuX2RlYnVnZ2VyTW9kZWwuX3BhdXNlZFNjcmlwdChjYWxsRnJhbWVzLHJlYXNvbixhdXhEYXRhLGJyZWFrcG9pbnRJZHN8fFtdLGFzeW5jU3RhY2tUcmFjZSxhc3luY1N0YWNrVHJhY2VJZCxhc3luY0NhbGxTdGFja1RyYWNlSWQpO30KcmVzdW1lZCgpe3RoaXMuX2RlYnVnZ2VyTW9kZWwuX3Jlc3VtZWRTY3JpcHQoKTt9CnNjcmlwdFBhcnNlZChzY3JpcHRJZCxzb3VyY2VVUkwsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uLGV4ZWN1dGlvbkNvbnRleHRJZCxoYXNoLGV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhLGlzTGl2ZUVkaXQsc291cmNlTWFwVVJMLGhhc1NvdXJjZVVSTCxpc01vZHVsZSxsZW5ndGgpe3RoaXMuX2RlYnVnZ2VyTW9kZWwuX3BhcnNlZFNjcmlwdFNvdXJjZShzY3JpcHRJZCxzb3VyY2VVUkwsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uLGV4ZWN1dGlvbkNvbnRleHRJZCxoYXNoLGV4ZWN1dGlvbkNvbnRleHRBdXhEYXRhLCEhaXNMaXZlRWRpdCxzb3VyY2VNYXBVUkwsISFoYXNTb3VyY2VVUkwsZmFsc2UsbGVuZ3RofHwwKTt9CnNjcmlwdEZhaWxlZFRvUGFyc2Uoc2NyaXB0SWQsc291cmNlVVJMLHN0YXJ0TGluZSxzdGFydENvbHVtbixlbmRMaW5lLGVuZENvbHVtbixleGVjdXRpb25Db250ZXh0SWQsaGFzaCxleGVjdXRpb25Db250ZXh0QXV4RGF0YSxzb3VyY2VNYXBVUkwsaGFzU291cmNlVVJMLGlzTW9kdWxlLGxlbmd0aCl7dGhpcy5fZGVidWdnZXJNb2RlbC5fcGFyc2VkU2NyaXB0U291cmNlKHNjcmlwdElkLHNvdXJjZVVSTCxzdGFydExpbmUsc3RhcnRDb2x1bW4sZW5kTGluZSxlbmRDb2x1bW4sZXhlY3V0aW9uQ29udGV4dElkLGhhc2gsZXhlY3V0aW9uQ29udGV4dEF1eERhdGEsZmFsc2Usc291cmNlTWFwVVJMLCEhaGFzU291cmNlVVJMLHRydWUsbGVuZ3RofHwwKTt9CmJyZWFrcG9pbnRSZXNvbHZlZChicmVha3BvaW50SWQsbG9jYXRpb24pe3RoaXMuX2RlYnVnZ2VyTW9kZWwuX2JyZWFrcG9pbnRSZXNvbHZlZChicmVha3BvaW50SWQsbG9jYXRpb24pO319O1NESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uPWNsYXNze2NvbnN0cnVjdG9yKGRlYnVnZ2VyTW9kZWwsc2NyaXB0SWQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3RoaXMuZGVidWdnZXJNb2RlbD1kZWJ1Z2dlck1vZGVsO3RoaXMuc2NyaXB0SWQ9c2NyaXB0SWQ7dGhpcy5saW5lTnVtYmVyPWxpbmVOdW1iZXI7dGhpcy5jb2x1bW5OdW1iZXI9Y29sdW1uTnVtYmVyfHwwO30Kc3RhdGljIGZyb21QYXlsb2FkKGRlYnVnZ2VyTW9kZWwscGF5bG9hZCl7cmV0dXJuIG5ldyBTREsuRGVidWdnZXJNb2RlbC5Mb2NhdGlvbihkZWJ1Z2dlck1vZGVsLHBheWxvYWQuc2NyaXB0SWQscGF5bG9hZC5saW5lTnVtYmVyLHBheWxvYWQuY29sdW1uTnVtYmVyKTt9CnBheWxvYWQoKXtyZXR1cm57c2NyaXB0SWQ6dGhpcy5zY3JpcHRJZCxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXJ9O30Kc2NyaXB0KCl7cmV0dXJuIHRoaXMuZGVidWdnZXJNb2RlbC5zY3JpcHRGb3JJZCh0aGlzLnNjcmlwdElkKTt9CmNvbnRpbnVlVG9Mb2NhdGlvbihwYXVzZWRDYWxsYmFjayl7aWYocGF1c2VkQ2FsbGJhY2spCnRoaXMuZGVidWdnZXJNb2RlbC5fY29udGludWVUb0xvY2F0aW9uQ2FsbGJhY2s9dGhpcy5fcGF1c2VkLmJpbmQodGhpcyxwYXVzZWRDYWxsYmFjayk7dGhpcy5kZWJ1Z2dlck1vZGVsLl9hZ2VudC5jb250aW51ZVRvTG9jYXRpb24odGhpcy5wYXlsb2FkKCksU0RLLkRlYnVnZ2VyTW9kZWwuQ29udGludWVUb0xvY2F0aW9uVGFyZ2V0Q2FsbEZyYW1lcy5DdXJyZW50KTt9Cl9wYXVzZWQocGF1c2VkQ2FsbGJhY2ssZGVidWdnZXJQYXVzZWREZXRhaWxzKXtjb25zdCBsb2NhdGlvbj1kZWJ1Z2dlclBhdXNlZERldGFpbHMuY2FsbEZyYW1lc1swXS5sb2NhdGlvbigpO2lmKGxvY2F0aW9uLnNjcmlwdElkPT09dGhpcy5zY3JpcHRJZCYmbG9jYXRpb24ubGluZU51bWJlcj09PXRoaXMubGluZU51bWJlciYmbG9jYXRpb24uY29sdW1uTnVtYmVyPT09dGhpcy5jb2x1bW5OdW1iZXIpe3BhdXNlZENhbGxiYWNrKCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQppZCgpe3JldHVybiB0aGlzLmRlYnVnZ2VyTW9kZWwudGFyZ2V0KCkuaWQoKSsnOicrdGhpcy5zY3JpcHRJZCsnOicrdGhpcy5saW5lTnVtYmVyKyc6Jyt0aGlzLmNvbHVtbk51bWJlcjt9fTtTREsuRGVidWdnZXJNb2RlbC5CcmVha0xvY2F0aW9uPWNsYXNzIGV4dGVuZHMgU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb257Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCxzY3JpcHRJZCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcix0eXBlKXtzdXBlcihkZWJ1Z2dlck1vZGVsLHNjcmlwdElkLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtpZih0eXBlKQp0aGlzLnR5cGU9dHlwZTt9CnN0YXRpYyBmcm9tUGF5bG9hZChkZWJ1Z2dlck1vZGVsLHBheWxvYWQpe3JldHVybiBuZXcgU0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtMb2NhdGlvbihkZWJ1Z2dlck1vZGVsLHBheWxvYWQuc2NyaXB0SWQscGF5bG9hZC5saW5lTnVtYmVyLHBheWxvYWQuY29sdW1uTnVtYmVyLHBheWxvYWQudHlwZSk7fX07U0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lPWNsYXNze2NvbnN0cnVjdG9yKGRlYnVnZ2VyTW9kZWwsc2NyaXB0LHBheWxvYWQpe3RoaXMuZGVidWdnZXJNb2RlbD1kZWJ1Z2dlck1vZGVsO3RoaXMuX3NjcmlwdD1zY3JpcHQ7dGhpcy5fcGF5bG9hZD1wYXlsb2FkO3RoaXMuX2xvY2F0aW9uPVNESy5EZWJ1Z2dlck1vZGVsLkxvY2F0aW9uLmZyb21QYXlsb2FkKGRlYnVnZ2VyTW9kZWwscGF5bG9hZC5sb2NhdGlvbik7dGhpcy5fc2NvcGVDaGFpbj1bXTt0aGlzLl9sb2NhbFNjb3BlPW51bGw7Zm9yKGxldCBpPTA7aTxwYXlsb2FkLnNjb3BlQ2hhaW4ubGVuZ3RoOysraSl7Y29uc3Qgc2NvcGU9bmV3IFNESy5EZWJ1Z2dlck1vZGVsLlNjb3BlKHRoaXMsaSk7dGhpcy5fc2NvcGVDaGFpbi5wdXNoKHNjb3BlKTtpZihzY29wZS50eXBlKCk9PT1Qcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuTG9jYWwpCnRoaXMuX2xvY2FsU2NvcGU9c2NvcGU7fQppZihwYXlsb2FkLmZ1bmN0aW9uTG9jYXRpb24pCnRoaXMuX2Z1bmN0aW9uTG9jYXRpb249U0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24uZnJvbVBheWxvYWQoZGVidWdnZXJNb2RlbCxwYXlsb2FkLmZ1bmN0aW9uTG9jYXRpb24pO3RoaXMuX3JldHVyblZhbHVlPXBheWxvYWQucmV0dXJuVmFsdWU/dGhpcy5kZWJ1Z2dlck1vZGVsLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KHBheWxvYWQucmV0dXJuVmFsdWUpOm51bGw7fQpzdGF0aWMgZnJvbVBheWxvYWRBcnJheShkZWJ1Z2dlck1vZGVsLGNhbGxGcmFtZXMpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPGNhbGxGcmFtZXMubGVuZ3RoOysraSl7Y29uc3QgY2FsbEZyYW1lPWNhbGxGcmFtZXNbaV07Y29uc3Qgc2NyaXB0PWRlYnVnZ2VyTW9kZWwuc2NyaXB0Rm9ySWQoY2FsbEZyYW1lLmxvY2F0aW9uLnNjcmlwdElkKTtpZihzY3JpcHQpCnJlc3VsdC5wdXNoKG5ldyBTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUoZGVidWdnZXJNb2RlbCxzY3JpcHQsY2FsbEZyYW1lKSk7fQpyZXR1cm4gcmVzdWx0O30KZ2V0IHNjcmlwdCgpe3JldHVybiB0aGlzLl9zY3JpcHQ7fQpnZXQgaWQoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC5jYWxsRnJhbWVJZDt9CnNjb3BlQ2hhaW4oKXtyZXR1cm4gdGhpcy5fc2NvcGVDaGFpbjt9CmxvY2FsU2NvcGUoKXtyZXR1cm4gdGhpcy5fbG9jYWxTY29wZTt9CnRoaXNPYmplY3QoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC50aGlzP3RoaXMuZGVidWdnZXJNb2RlbC5fcnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdCh0aGlzLl9wYXlsb2FkLnRoaXMpOm51bGw7fQpyZXR1cm5WYWx1ZSgpe3JldHVybiB0aGlzLl9yZXR1cm5WYWx1ZTt9CmFzeW5jIHNldFJldHVyblZhbHVlKGV4cHJlc3Npb24pe2lmKCF0aGlzLl9yZXR1cm5WYWx1ZSkKcmV0dXJuIG51bGw7Y29uc3QgZXZhbHVhdGVSZXNwb25zZT1hd2FpdCB0aGlzLmRlYnVnZ2VyTW9kZWwuX2FnZW50Lmludm9rZV9ldmFsdWF0ZU9uQ2FsbEZyYW1lKHtjYWxsRnJhbWVJZDp0aGlzLmlkLGV4cHJlc3Npb246ZXhwcmVzc2lvbixzaWxlbnQ6dHJ1ZSxvYmplY3RHcm91cDonYmFja3RyYWNlJ30pO2lmKGV2YWx1YXRlUmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdfHxldmFsdWF0ZVJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpCnJldHVybiBudWxsO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuZGVidWdnZXJNb2RlbC5fYWdlbnQuaW52b2tlX3NldFJldHVyblZhbHVlKHtuZXdWYWx1ZTpldmFsdWF0ZVJlc3BvbnNlLnJlc3VsdH0pO2lmKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKcmV0dXJuIG51bGw7dGhpcy5fcmV0dXJuVmFsdWU9dGhpcy5kZWJ1Z2dlck1vZGVsLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KGV2YWx1YXRlUmVzcG9uc2UucmVzdWx0KTtyZXR1cm4gdGhpcy5fcmV0dXJuVmFsdWU7fQpnZXQgZnVuY3Rpb25OYW1lKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQuZnVuY3Rpb25OYW1lO30KbG9jYXRpb24oKXtyZXR1cm4gdGhpcy5fbG9jYXRpb247fQpmdW5jdGlvbkxvY2F0aW9uKCl7cmV0dXJuIHRoaXMuX2Z1bmN0aW9uTG9jYXRpb258fG51bGw7fQphc3luYyBldmFsdWF0ZShvcHRpb25zKXtjb25zdCBydW50aW1lTW9kZWw9dGhpcy5kZWJ1Z2dlck1vZGVsLnJ1bnRpbWVNb2RlbCgpO2NvbnN0IG5lZWRzVGVybWluYXRpb25PcHRpb25zPSEhb3B0aW9ucy50aHJvd09uU2lkZUVmZmVjdHx8b3B0aW9ucy50aW1lb3V0IT09dW5kZWZpbmVkO2lmKG5lZWRzVGVybWluYXRpb25PcHRpb25zJiYocnVudGltZU1vZGVsLmhhc1NpZGVFZmZlY3RTdXBwb3J0KCk9PT1mYWxzZXx8KHJ1bnRpbWVNb2RlbC5oYXNTaWRlRWZmZWN0U3VwcG9ydCgpPT09bnVsbCYmIWF3YWl0IHJ1bnRpbWVNb2RlbC5jaGVja1NpZGVFZmZlY3RTdXBwb3J0KCkpKSkKcmV0dXJue2Vycm9yOidTaWRlLWVmZmVjdCBjaGVja3Mgbm90IHN1cHBvcnRlZCBieSBiYWNrZW5kLid9O2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuZGVidWdnZXJNb2RlbC5fYWdlbnQuaW52b2tlX2V2YWx1YXRlT25DYWxsRnJhbWUoe2NhbGxGcmFtZUlkOnRoaXMuaWQsZXhwcmVzc2lvbjpvcHRpb25zLmV4cHJlc3Npb24sb2JqZWN0R3JvdXA6b3B0aW9ucy5vYmplY3RHcm91cCxpbmNsdWRlQ29tbWFuZExpbmVBUEk6b3B0aW9ucy5pbmNsdWRlQ29tbWFuZExpbmVBUEksc2lsZW50Om9wdGlvbnMuc2lsZW50LHJldHVybkJ5VmFsdWU6b3B0aW9ucy5yZXR1cm5CeVZhbHVlLGdlbmVyYXRlUHJldmlldzpvcHRpb25zLmdlbmVyYXRlUHJldmlldyx0aHJvd09uU2lkZUVmZmVjdDpvcHRpb25zLnRocm93T25TaWRlRWZmZWN0LHRpbWVvdXQ6b3B0aW9ucy50aW1lb3V0fSk7Y29uc3QgZXJyb3I9cmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdO2lmKGVycm9yKXtjb25zb2xlLmVycm9yKGVycm9yKTtyZXR1cm57ZXJyb3I6ZXJyb3J9O30KcmV0dXJue29iamVjdDpydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KHJlc3BvbnNlLnJlc3VsdCksZXhjZXB0aW9uRGV0YWlsczpyZXNwb25zZS5leGNlcHRpb25EZXRhaWxzfTt9CmFzeW5jIHJlc3RhcnQoKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLmRlYnVnZ2VyTW9kZWwuX2FnZW50Lmludm9rZV9yZXN0YXJ0RnJhbWUoe2NhbGxGcmFtZUlkOnRoaXMuX3BheWxvYWQuY2FsbEZyYW1lSWR9KTtpZighcmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQp0aGlzLmRlYnVnZ2VyTW9kZWwuc3RlcEludG8oKTt9fTtTREsuRGVidWdnZXJNb2RlbC5TY29wZT1jbGFzc3tjb25zdHJ1Y3RvcihjYWxsRnJhbWUsb3JkaW5hbCl7dGhpcy5fY2FsbEZyYW1lPWNhbGxGcmFtZTt0aGlzLl9wYXlsb2FkPWNhbGxGcmFtZS5fcGF5bG9hZC5zY29wZUNoYWluW29yZGluYWxdO3RoaXMuX3R5cGU9dGhpcy5fcGF5bG9hZC50eXBlO3RoaXMuX25hbWU9dGhpcy5fcGF5bG9hZC5uYW1lO3RoaXMuX29yZGluYWw9b3JkaW5hbDt0aGlzLl9zdGFydExvY2F0aW9uPXRoaXMuX3BheWxvYWQuc3RhcnRMb2NhdGlvbj9TREsuRGVidWdnZXJNb2RlbC5Mb2NhdGlvbi5mcm9tUGF5bG9hZChjYWxsRnJhbWUuZGVidWdnZXJNb2RlbCx0aGlzLl9wYXlsb2FkLnN0YXJ0TG9jYXRpb24pOm51bGw7dGhpcy5fZW5kTG9jYXRpb249dGhpcy5fcGF5bG9hZC5lbmRMb2NhdGlvbj9TREsuRGVidWdnZXJNb2RlbC5Mb2NhdGlvbi5mcm9tUGF5bG9hZChjYWxsRnJhbWUuZGVidWdnZXJNb2RlbCx0aGlzLl9wYXlsb2FkLmVuZExvY2F0aW9uKTpudWxsO30KY2FsbEZyYW1lKCl7cmV0dXJuIHRoaXMuX2NhbGxGcmFtZTt9CnR5cGUoKXtyZXR1cm4gdGhpcy5fdHlwZTt9CnR5cGVOYW1lKCl7c3dpdGNoKHRoaXMuX3R5cGUpe2Nhc2UgUHJvdG9jb2wuRGVidWdnZXIuU2NvcGVUeXBlLkxvY2FsOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0xvY2FsJyk7Y2FzZSBQcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuQ2xvc3VyZTpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdDbG9zdXJlJyk7Y2FzZSBQcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuQ2F0Y2g6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnQ2F0Y2gnKTtjYXNlIFByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5CbG9jazpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdCbG9jaycpO2Nhc2UgUHJvdG9jb2wuRGVidWdnZXIuU2NvcGVUeXBlLlNjcmlwdDpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTY3JpcHQnKTtjYXNlIFByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5XaXRoOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1dpdGggQmxvY2snKTtjYXNlIFByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5HbG9iYWw6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnR2xvYmFsJyk7Y2FzZSBQcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuTW9kdWxlOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ01vZHVsZScpO30KcmV0dXJuJyc7fQpuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQpzdGFydExvY2F0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0TG9jYXRpb247fQplbmRMb2NhdGlvbigpe3JldHVybiB0aGlzLl9lbmRMb2NhdGlvbjt9Cm9iamVjdCgpe2lmKHRoaXMuX29iamVjdCkKcmV0dXJuIHRoaXMuX29iamVjdDtjb25zdCBydW50aW1lTW9kZWw9dGhpcy5fY2FsbEZyYW1lLmRlYnVnZ2VyTW9kZWwuX3J1bnRpbWVNb2RlbDtjb25zdCBkZWNsYXJhdGl2ZVNjb3BlPXRoaXMuX3R5cGUhPT1Qcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuV2l0aCYmdGhpcy5fdHlwZSE9PVByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5HbG9iYWw7aWYoZGVjbGFyYXRpdmVTY29wZSl7dGhpcy5fb2JqZWN0PXJ1bnRpbWVNb2RlbC5jcmVhdGVTY29wZVJlbW90ZU9iamVjdCh0aGlzLl9wYXlsb2FkLm9iamVjdCxuZXcgU0RLLlNjb3BlUmVmKHRoaXMuX29yZGluYWwsdGhpcy5fY2FsbEZyYW1lLmlkKSk7fWVsc2V7dGhpcy5fb2JqZWN0PXJ1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QodGhpcy5fcGF5bG9hZC5vYmplY3QpO30KcmV0dXJuIHRoaXMuX29iamVjdDt9CmRlc2NyaXB0aW9uKCl7Y29uc3QgZGVjbGFyYXRpdmVTY29wZT10aGlzLl90eXBlIT09UHJvdG9jb2wuRGVidWdnZXIuU2NvcGVUeXBlLldpdGgmJnRoaXMuX3R5cGUhPT1Qcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuR2xvYmFsO3JldHVybiBkZWNsYXJhdGl2ZVNjb3BlPycnOih0aGlzLl9wYXlsb2FkLm9iamVjdC5kZXNjcmlwdGlvbnx8JycpO319O1NESy5EZWJ1Z2dlclBhdXNlZERldGFpbHM9Y2xhc3N7Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCxjYWxsRnJhbWVzLHJlYXNvbixhdXhEYXRhLGJyZWFrcG9pbnRJZHMsYXN5bmNTdGFja1RyYWNlLGFzeW5jU3RhY2tUcmFjZUlkKXt0aGlzLmRlYnVnZ2VyTW9kZWw9ZGVidWdnZXJNb2RlbDt0aGlzLmNhbGxGcmFtZXM9U0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lLmZyb21QYXlsb2FkQXJyYXkoZGVidWdnZXJNb2RlbCxjYWxsRnJhbWVzKTt0aGlzLnJlYXNvbj1yZWFzb247dGhpcy5hdXhEYXRhPWF1eERhdGE7dGhpcy5icmVha3BvaW50SWRzPWJyZWFrcG9pbnRJZHM7aWYoYXN5bmNTdGFja1RyYWNlKQp0aGlzLmFzeW5jU3RhY2tUcmFjZT10aGlzLl9jbGVhblJlZHVuZGFudEZyYW1lcyhhc3luY1N0YWNrVHJhY2UpO3RoaXMuYXN5bmNTdGFja1RyYWNlSWQ9YXN5bmNTdGFja1RyYWNlSWQ7fQpleGNlcHRpb24oKXtpZih0aGlzLnJlYXNvbiE9PVNESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uLkV4Y2VwdGlvbiYmdGhpcy5yZWFzb24hPT1TREsuRGVidWdnZXJNb2RlbC5CcmVha1JlYXNvbi5Qcm9taXNlUmVqZWN0aW9uKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5kZWJ1Z2dlck1vZGVsLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KCh0aGlzLmF1eERhdGEpKTt9Cl9jbGVhblJlZHVuZGFudEZyYW1lcyhhc3luY1N0YWNrVHJhY2Upe2xldCBzdGFjaz1hc3luY1N0YWNrVHJhY2U7bGV0IHByZXZpb3VzPW51bGw7d2hpbGUoc3RhY2spe2lmKHN0YWNrLmRlc2NyaXB0aW9uPT09J2FzeW5jIGZ1bmN0aW9uJyYmc3RhY2suY2FsbEZyYW1lcy5sZW5ndGgpCnN0YWNrLmNhbGxGcmFtZXMuc2hpZnQoKTtpZihwcmV2aW91cyYmIXN0YWNrLmNhbGxGcmFtZXMubGVuZ3RoKQpwcmV2aW91cy5wYXJlbnQ9c3RhY2sucGFyZW50O2Vsc2UKcHJldmlvdXM9c3RhY2s7c3RhY2s9c3RhY2sucGFyZW50O30KcmV0dXJuIGFzeW5jU3RhY2tUcmFjZTt9fTs7U0RLLkVtdWxhdGlvbk1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9lbXVsYXRpb25BZ2VudD10YXJnZXQuZW11bGF0aW9uQWdlbnQoKTt0aGlzLl9wYWdlQWdlbnQ9dGFyZ2V0LnBhZ2VBZ2VudCgpO3RoaXMuX2RldmljZU9yaWVudGF0aW9uQWdlbnQ9dGFyZ2V0LmRldmljZU9yaWVudGF0aW9uQWdlbnQoKTt0aGlzLl9jc3NNb2RlbD10YXJnZXQubW9kZWwoU0RLLkNTU01vZGVsKTt0aGlzLl9vdmVybGF5TW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5PdmVybGF5TW9kZWwpO2lmKHRoaXMuX292ZXJsYXlNb2RlbCkKdGhpcy5fb3ZlcmxheU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk92ZXJsYXlNb2RlbC5FdmVudHMuSW5zcGVjdE1vZGVXaWxsQmVUb2dnbGVkLHRoaXMuX3VwZGF0ZVRvdWNoLHRoaXMpO2NvbnN0IGRpc2FibGVKYXZhc2NyaXB0U2V0dGluZz1Db21tb24uc2V0dGluZ3MubW9kdWxlU2V0dGluZygnamF2YVNjcmlwdERpc2FibGVkJyk7ZGlzYWJsZUphdmFzY3JpcHRTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKCgpPT50aGlzLl9lbXVsYXRpb25BZ2VudC5zZXRTY3JpcHRFeGVjdXRpb25EaXNhYmxlZChkaXNhYmxlSmF2YXNjcmlwdFNldHRpbmcuZ2V0KCkpKTtpZihkaXNhYmxlSmF2YXNjcmlwdFNldHRpbmcuZ2V0KCkpCnRoaXMuX2VtdWxhdGlvbkFnZW50LnNldFNjcmlwdEV4ZWN1dGlvbkRpc2FibGVkKHRydWUpO2NvbnN0IG1lZGlhU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnZW11bGF0ZWRDU1NNZWRpYScpO21lZGlhU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+dGhpcy5fZW11bGF0ZUNTU01lZGlhKG1lZGlhU2V0dGluZy5nZXQoKSkpO2lmKG1lZGlhU2V0dGluZy5nZXQoKSkKdGhpcy5fZW11bGF0ZUNTU01lZGlhKG1lZGlhU2V0dGluZy5nZXQoKSk7dGhpcy5fdG91Y2hFbmFibGVkPWZhbHNlO3RoaXMuX3RvdWNoTW9iaWxlPWZhbHNlO3RoaXMuX2N1c3RvbVRvdWNoRW5hYmxlZD1mYWxzZTt0aGlzLl90b3VjaENvbmZpZ3VyYXRpb249e2VuYWJsZWQ6ZmFsc2UsY29uZmlndXJhdGlvbjonbW9iaWxlJyxzY3JpcHRJZDonJ307fQpzdXBwb3J0c0RldmljZUVtdWxhdGlvbigpe3JldHVybiB0aGlzLnRhcmdldCgpLmhhc0FsbENhcGFiaWxpdGllcyhTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRGV2aWNlRW11bGF0aW9uKTt9CnJlc2V0UGFnZVNjYWxlRmFjdG9yKCl7cmV0dXJuIHRoaXMuX2VtdWxhdGlvbkFnZW50LnJlc2V0UGFnZVNjYWxlRmFjdG9yKCk7fQplbXVsYXRlRGV2aWNlKG1ldHJpY3Mpe2lmKG1ldHJpY3MpCnJldHVybiB0aGlzLl9lbXVsYXRpb25BZ2VudC5pbnZva2Vfc2V0RGV2aWNlTWV0cmljc092ZXJyaWRlKG1ldHJpY3MpO2Vsc2UKcmV0dXJuIHRoaXMuX2VtdWxhdGlvbkFnZW50LmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlKCk7fQpvdmVybGF5TW9kZWwoKXtyZXR1cm4gdGhpcy5fb3ZlcmxheU1vZGVsO30KZW11bGF0ZUdlb2xvY2F0aW9uKGdlb2xvY2F0aW9uKXtpZighZ2VvbG9jYXRpb24pe3RoaXMuX2VtdWxhdGlvbkFnZW50LmNsZWFyR2VvbG9jYXRpb25PdmVycmlkZSgpO3JldHVybjt9CmlmKGdlb2xvY2F0aW9uLmVycm9yKXt0aGlzLl9lbXVsYXRpb25BZ2VudC5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlKCk7fWVsc2V7dGhpcy5fZW11bGF0aW9uQWdlbnQuc2V0R2VvbG9jYXRpb25PdmVycmlkZShnZW9sb2NhdGlvbi5sYXRpdHVkZSxnZW9sb2NhdGlvbi5sb25naXR1ZGUsU0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uLkRlZmF1bHRNb2NrQWNjdXJhY3kpO319CmVtdWxhdGVEZXZpY2VPcmllbnRhdGlvbihkZXZpY2VPcmllbnRhdGlvbil7aWYoZGV2aWNlT3JpZW50YXRpb24pe3RoaXMuX2RldmljZU9yaWVudGF0aW9uQWdlbnQuc2V0RGV2aWNlT3JpZW50YXRpb25PdmVycmlkZShkZXZpY2VPcmllbnRhdGlvbi5hbHBoYSxkZXZpY2VPcmllbnRhdGlvbi5iZXRhLGRldmljZU9yaWVudGF0aW9uLmdhbW1hKTt9ZWxzZXt0aGlzLl9kZXZpY2VPcmllbnRhdGlvbkFnZW50LmNsZWFyRGV2aWNlT3JpZW50YXRpb25PdmVycmlkZSgpO319Cl9lbXVsYXRlQ1NTTWVkaWEobWVkaWEpe3RoaXMuX2VtdWxhdGlvbkFnZW50LnNldEVtdWxhdGVkTWVkaWEobWVkaWEpO2lmKHRoaXMuX2Nzc01vZGVsKQp0aGlzLl9jc3NNb2RlbC5tZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCgpO30Kc2V0Q1BVVGhyb3R0bGluZ1JhdGUocmF0ZSl7dGhpcy5fZW11bGF0aW9uQWdlbnQuc2V0Q1BVVGhyb3R0bGluZ1JhdGUocmF0ZSk7fQplbXVsYXRlVG91Y2goZW5hYmxlZCxtb2JpbGUpe3RoaXMuX3RvdWNoRW5hYmxlZD1lbmFibGVkO3RoaXMuX3RvdWNoTW9iaWxlPW1vYmlsZTt0aGlzLl91cGRhdGVUb3VjaCgpO30Kb3ZlcnJpZGVFbXVsYXRlVG91Y2goZW5hYmxlZCl7dGhpcy5fY3VzdG9tVG91Y2hFbmFibGVkPWVuYWJsZWQ7dGhpcy5fdXBkYXRlVG91Y2goKTt9Cl91cGRhdGVUb3VjaCgpe2xldCBjb25maWd1cmF0aW9uPXtlbmFibGVkOnRoaXMuX3RvdWNoRW5hYmxlZCxjb25maWd1cmF0aW9uOnRoaXMuX3RvdWNoTW9iaWxlPydtb2JpbGUnOidkZXNrdG9wJyx9O2lmKHRoaXMuX2N1c3RvbVRvdWNoRW5hYmxlZCkKY29uZmlndXJhdGlvbj17ZW5hYmxlZDp0cnVlLGNvbmZpZ3VyYXRpb246J21vYmlsZSd9O2lmKHRoaXMuX292ZXJsYXlNb2RlbCYmdGhpcy5fb3ZlcmxheU1vZGVsLmluc3BlY3RNb2RlRW5hYmxlZCgpKQpjb25maWd1cmF0aW9uPXtlbmFibGVkOmZhbHNlLGNvbmZpZ3VyYXRpb246J21vYmlsZSd9O2lmKCF0aGlzLl90b3VjaENvbmZpZ3VyYXRpb24uZW5hYmxlZCYmIWNvbmZpZ3VyYXRpb24uZW5hYmxlZCkKcmV0dXJuO2lmKHRoaXMuX3RvdWNoQ29uZmlndXJhdGlvbi5lbmFibGVkJiZjb25maWd1cmF0aW9uLmVuYWJsZWQmJnRoaXMuX3RvdWNoQ29uZmlndXJhdGlvbi5jb25maWd1cmF0aW9uPT09Y29uZmlndXJhdGlvbi5jb25maWd1cmF0aW9uKQpyZXR1cm47dGhpcy5fdG91Y2hDb25maWd1cmF0aW9uPWNvbmZpZ3VyYXRpb247dGhpcy5fZW11bGF0aW9uQWdlbnQuc2V0VG91Y2hFbXVsYXRpb25FbmFibGVkKGNvbmZpZ3VyYXRpb24uZW5hYmxlZCwxKTt0aGlzLl9lbXVsYXRpb25BZ2VudC5zZXRFbWl0VG91Y2hFdmVudHNGb3JNb3VzZShjb25maWd1cmF0aW9uLmVuYWJsZWQsY29uZmlndXJhdGlvbi5jb25maWd1cmF0aW9uKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLkVtdWxhdGlvbk1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5FbXVsYXRpb24sdHJ1ZSk7U0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uPWNsYXNze2NvbnN0cnVjdG9yKGxhdGl0dWRlLGxvbmdpdHVkZSxlcnJvcil7dGhpcy5sYXRpdHVkZT1sYXRpdHVkZTt0aGlzLmxvbmdpdHVkZT1sb25naXR1ZGU7dGhpcy5lcnJvcj1lcnJvcjt9CnN0YXRpYyBwYXJzZVNldHRpbmcodmFsdWUpe2lmKHZhbHVlKXtjb25zdCBzcGxpdEVycm9yPXZhbHVlLnNwbGl0KCc6Jyk7aWYoc3BsaXRFcnJvci5sZW5ndGg9PT0yKXtjb25zdCBzcGxpdFBvc2l0aW9uPXNwbGl0RXJyb3JbMF0uc3BsaXQoJ0AnKTtpZihzcGxpdFBvc2l0aW9uLmxlbmd0aD09PTIpe3JldHVybiBuZXcgU0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uKHBhcnNlRmxvYXQoc3BsaXRQb3NpdGlvblswXSkscGFyc2VGbG9hdChzcGxpdFBvc2l0aW9uWzFdKSwhIXNwbGl0RXJyb3JbMV0pO319fQpyZXR1cm4gbmV3IFNESy5FbXVsYXRpb25Nb2RlbC5HZW9sb2NhdGlvbigwLDAsZmFsc2UpO30Kc3RhdGljIHBhcnNlVXNlcklucHV0KGxhdGl0dWRlU3RyaW5nLGxvbmdpdHVkZVN0cmluZyxlcnJvclN0YXR1cyl7aWYoIWxhdGl0dWRlU3RyaW5nJiYhbG9uZ2l0dWRlU3RyaW5nKQpyZXR1cm4gbnVsbDtjb25zdCBpc0xhdGl0dWRlVmFsaWQ9U0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uLmxhdGl0dWRlVmFsaWRhdG9yKGxhdGl0dWRlU3RyaW5nKTtjb25zdCBpc0xvbmdpdHVkZVZhbGlkPVNESy5FbXVsYXRpb25Nb2RlbC5HZW9sb2NhdGlvbi5sb25naXR1ZGVWYWxpZGF0b3IobG9uZ2l0dWRlU3RyaW5nKTtpZighaXNMYXRpdHVkZVZhbGlkJiYhaXNMb25naXR1ZGVWYWxpZCkKcmV0dXJuIG51bGw7Y29uc3QgbGF0aXR1ZGU9aXNMYXRpdHVkZVZhbGlkP3BhcnNlRmxvYXQobGF0aXR1ZGVTdHJpbmcpOi0xO2NvbnN0IGxvbmdpdHVkZT1pc0xvbmdpdHVkZVZhbGlkP3BhcnNlRmxvYXQobG9uZ2l0dWRlU3RyaW5nKTotMTtyZXR1cm4gbmV3IFNESy5FbXVsYXRpb25Nb2RlbC5HZW9sb2NhdGlvbihsYXRpdHVkZSxsb25naXR1ZGUsISFlcnJvclN0YXR1cyk7fQpzdGF0aWMgbGF0aXR1ZGVWYWxpZGF0b3IodmFsdWUpe2NvbnN0IG51bVZhbHVlPXBhcnNlRmxvYXQodmFsdWUpO3JldHVybi9eKFsrLV0/W1xkXSsoXC5cZCspP3xbKy1dP1wuXGQrKSQvLnRlc3QodmFsdWUpJiZudW1WYWx1ZT49LTkwJiZudW1WYWx1ZTw9OTA7fQpzdGF0aWMgbG9uZ2l0dWRlVmFsaWRhdG9yKHZhbHVlKXtjb25zdCBudW1WYWx1ZT1wYXJzZUZsb2F0KHZhbHVlKTtyZXR1cm4vXihbKy1dP1tcZF0rKFwuXGQrKT98WystXT9cLlxkKykkLy50ZXN0KHZhbHVlKSYmbnVtVmFsdWU+PS0xODAmJm51bVZhbHVlPD0xODA7fQp0b1NldHRpbmcoKXtyZXR1cm4gdGhpcy5sYXRpdHVkZSsnQCcrdGhpcy5sb25naXR1ZGUrJzonKyh0aGlzLmVycm9yfHwnJyk7fX07U0RLLkVtdWxhdGlvbk1vZGVsLkdlb2xvY2F0aW9uLkRlZmF1bHRNb2NrQWNjdXJhY3k9MTUwO1NESy5FbXVsYXRpb25Nb2RlbC5EZXZpY2VPcmllbnRhdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihhbHBoYSxiZXRhLGdhbW1hKXt0aGlzLmFscGhhPWFscGhhO3RoaXMuYmV0YT1iZXRhO3RoaXMuZ2FtbWE9Z2FtbWE7fQpzdGF0aWMgcGFyc2VTZXR0aW5nKHZhbHVlKXtpZih2YWx1ZSl7Y29uc3QganNvbk9iamVjdD1KU09OLnBhcnNlKHZhbHVlKTtyZXR1cm4gbmV3IFNESy5FbXVsYXRpb25Nb2RlbC5EZXZpY2VPcmllbnRhdGlvbihqc29uT2JqZWN0LmFscGhhLGpzb25PYmplY3QuYmV0YSxqc29uT2JqZWN0LmdhbW1hKTt9CnJldHVybiBuZXcgU0RLLkVtdWxhdGlvbk1vZGVsLkRldmljZU9yaWVudGF0aW9uKDAsMCwwKTt9CnN0YXRpYyBwYXJzZVVzZXJJbnB1dChhbHBoYVN0cmluZyxiZXRhU3RyaW5nLGdhbW1hU3RyaW5nKXtpZighYWxwaGFTdHJpbmcmJiFiZXRhU3RyaW5nJiYhZ2FtbWFTdHJpbmcpCnJldHVybiBudWxsO2NvbnN0IGlzQWxwaGFWYWxpZD1TREsuRW11bGF0aW9uTW9kZWwuRGV2aWNlT3JpZW50YXRpb24udmFsaWRhdG9yKGFscGhhU3RyaW5nKTtjb25zdCBpc0JldGFWYWxpZD1TREsuRW11bGF0aW9uTW9kZWwuRGV2aWNlT3JpZW50YXRpb24udmFsaWRhdG9yKGJldGFTdHJpbmcpO2NvbnN0IGlzR2FtbWFWYWxpZD1TREsuRW11bGF0aW9uTW9kZWwuRGV2aWNlT3JpZW50YXRpb24udmFsaWRhdG9yKGdhbW1hU3RyaW5nKTtpZighaXNBbHBoYVZhbGlkJiYhaXNCZXRhVmFsaWQmJiFpc0dhbW1hVmFsaWQpCnJldHVybiBudWxsO2NvbnN0IGFscGhhPWlzQWxwaGFWYWxpZD9wYXJzZUZsb2F0KGFscGhhU3RyaW5nKTotMTtjb25zdCBiZXRhPWlzQmV0YVZhbGlkP3BhcnNlRmxvYXQoYmV0YVN0cmluZyk6LTE7Y29uc3QgZ2FtbWE9aXNHYW1tYVZhbGlkP3BhcnNlRmxvYXQoZ2FtbWFTdHJpbmcpOi0xO3JldHVybiBuZXcgU0RLLkVtdWxhdGlvbk1vZGVsLkRldmljZU9yaWVudGF0aW9uKGFscGhhLGJldGEsZ2FtbWEpO30Kc3RhdGljIHZhbGlkYXRvcih2YWx1ZSl7cmV0dXJuL14oWystXT9bXGRdKyhcLlxkKyk/fFsrLV0/XC5cZCspJC8udGVzdCh2YWx1ZSk7fQp0b1NldHRpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7fX07O1NESy5TbmFwc2hvdFdpdGhSZWN0O1NESy5MYXllcj1mdW5jdGlvbigpe307U0RLLkxheWVyLnByb3RvdHlwZT17aWQoKXt9LHBhcmVudElkKCl7fSxwYXJlbnQoKXt9LGlzUm9vdCgpe30sY2hpbGRyZW4oKXt9LGFkZENoaWxkKGNoaWxkKXt9LG5vZGUoKXt9LG5vZGVGb3JTZWxmT3JBbmNlc3Rvcigpe30sb2Zmc2V0WCgpe30sb2Zmc2V0WSgpe30sd2lkdGgoKXt9LGhlaWdodCgpe30sdHJhbnNmb3JtKCl7fSxxdWFkKCl7fSxhbmNob3JQb2ludCgpe30saW52aXNpYmxlKCl7fSxwYWludENvdW50KCl7fSxsYXN0UGFpbnRSZWN0KCl7fSxzY3JvbGxSZWN0cygpe30sc3RpY2t5UG9zaXRpb25Db25zdHJhaW50KCl7fSxncHVNZW1vcnlVc2FnZSgpe30scmVxdWVzdENvbXBvc2l0aW5nUmVhc29ucygpe30sZHJhd3NDb250ZW50KCl7fSxzbmFwc2hvdHMoKXt9fTtTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGU9e05vbkZhc3RTY3JvbGxhYmxlOidOb25GYXN0U2Nyb2xsYWJsZScsVG91Y2hFdmVudEhhbmRsZXI6J1RvdWNoRXZlbnRIYW5kbGVyJyxXaGVlbEV2ZW50SGFuZGxlcjonV2hlZWxFdmVudEhhbmRsZXInLFJlcGFpbnRzT25TY3JvbGw6J1JlcGFpbnRzT25TY3JvbGwnfTtTREsuTGF5ZXIuU3RpY2t5UG9zaXRpb25Db25zdHJhaW50PWNsYXNze2NvbnN0cnVjdG9yKGxheWVyVHJlZSxjb25zdHJhaW50KXt0aGlzLl9zdGlja3lCb3hSZWN0PWNvbnN0cmFpbnQuc3RpY2t5Qm94UmVjdDt0aGlzLl9jb250YWluaW5nQmxvY2tSZWN0PWNvbnN0cmFpbnQuY29udGFpbmluZ0Jsb2NrUmVjdDt0aGlzLl9uZWFyZXN0TGF5ZXJTaGlmdGluZ1N0aWNreUJveD1udWxsO2lmKGxheWVyVHJlZSYmY29uc3RyYWludC5uZWFyZXN0TGF5ZXJTaGlmdGluZ1N0aWNreUJveCkKdGhpcy5fbmVhcmVzdExheWVyU2hpZnRpbmdTdGlja3lCb3g9bGF5ZXJUcmVlLmxheWVyQnlJZChjb25zdHJhaW50Lm5lYXJlc3RMYXllclNoaWZ0aW5nU3RpY2t5Qm94KTt0aGlzLl9uZWFyZXN0TGF5ZXJTaGlmdGluZ0NvbnRhaW5pbmdCbG9jaz1udWxsO2lmKGxheWVyVHJlZSYmY29uc3RyYWludC5uZWFyZXN0TGF5ZXJTaGlmdGluZ0NvbnRhaW5pbmdCbG9jaykKdGhpcy5fbmVhcmVzdExheWVyU2hpZnRpbmdDb250YWluaW5nQmxvY2s9bGF5ZXJUcmVlLmxheWVyQnlJZChjb25zdHJhaW50Lm5lYXJlc3RMYXllclNoaWZ0aW5nQ29udGFpbmluZ0Jsb2NrKTt9CnN0aWNreUJveFJlY3QoKXtyZXR1cm4gdGhpcy5fc3RpY2t5Qm94UmVjdDt9CmNvbnRhaW5pbmdCbG9ja1JlY3QoKXtyZXR1cm4gdGhpcy5fY29udGFpbmluZ0Jsb2NrUmVjdDt9Cm5lYXJlc3RMYXllclNoaWZ0aW5nU3RpY2t5Qm94KCl7cmV0dXJuIHRoaXMuX25lYXJlc3RMYXllclNoaWZ0aW5nU3RpY2t5Qm94O30KbmVhcmVzdExheWVyU2hpZnRpbmdDb250YWluaW5nQmxvY2soKXtyZXR1cm4gdGhpcy5fbmVhcmVzdExheWVyU2hpZnRpbmdDb250YWluaW5nQmxvY2s7fX07U0RLLkxheWVyVHJlZUJhc2U9Y2xhc3N7Y29uc3RydWN0b3IodGFyZ2V0KXt0aGlzLl90YXJnZXQ9dGFyZ2V0O3RoaXMuX2RvbU1vZGVsPXRhcmdldD90YXJnZXQubW9kZWwoU0RLLkRPTU1vZGVsKTpudWxsO3RoaXMuX2xheWVyc0J5SWQ9e307dGhpcy5fcm9vdD1udWxsO3RoaXMuX2NvbnRlbnRSb290PW51bGw7dGhpcy5fYmFja2VuZE5vZGVJZFRvTm9kZT1uZXcgTWFwKCk7fQp0YXJnZXQoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0O30Kcm9vdCgpe3JldHVybiB0aGlzLl9yb290O30Kc2V0Um9vdChyb290KXt0aGlzLl9yb290PXJvb3Q7fQpjb250ZW50Um9vdCgpe3JldHVybiB0aGlzLl9jb250ZW50Um9vdDt9CnNldENvbnRlbnRSb290KGNvbnRlbnRSb290KXt0aGlzLl9jb250ZW50Um9vdD1jb250ZW50Um9vdDt9CmZvckVhY2hMYXllcihjYWxsYmFjayxyb290KXtpZighcm9vdCl7cm9vdD10aGlzLnJvb3QoKTtpZighcm9vdCkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIGNhbGxiYWNrKHJvb3QpfHxyb290LmNoaWxkcmVuKCkuc29tZSh0aGlzLmZvckVhY2hMYXllci5iaW5kKHRoaXMsY2FsbGJhY2spKTt9CmxheWVyQnlJZChpZCl7cmV0dXJuIHRoaXMuX2xheWVyc0J5SWRbaWRdfHxudWxsO30KYXN5bmMgcmVzb2x2ZUJhY2tlbmROb2RlSWRzKHJlcXVlc3RlZE5vZGVJZHMpe2lmKCFyZXF1ZXN0ZWROb2RlSWRzLnNpemV8fCF0aGlzLl9kb21Nb2RlbCkKcmV0dXJuO2NvbnN0IG5vZGVzTWFwPWF3YWl0IHRoaXMuX2RvbU1vZGVsLnB1c2hOb2Rlc0J5QmFja2VuZElkc1RvRnJvbnRlbmQocmVxdWVzdGVkTm9kZUlkcyk7aWYoIW5vZGVzTWFwKQpyZXR1cm47Zm9yKGNvbnN0IG5vZGVJZCBvZiBub2Rlc01hcC5rZXlzQXJyYXkoKSkKdGhpcy5fYmFja2VuZE5vZGVJZFRvTm9kZS5zZXQobm9kZUlkLG5vZGVzTWFwLmdldChub2RlSWQpfHxudWxsKTt9CmJhY2tlbmROb2RlSWRUb05vZGUoKXtyZXR1cm4gdGhpcy5fYmFja2VuZE5vZGVJZFRvTm9kZTt9CnNldFZpZXdwb3J0U2l6ZSh2aWV3cG9ydFNpemUpe3RoaXMuX3ZpZXdwb3J0U2l6ZT12aWV3cG9ydFNpemU7fQp2aWV3cG9ydFNpemUoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRTaXplO30KX25vZGVGb3JJZChpZCl7cmV0dXJuIHRoaXMuX2RvbU1vZGVsP3RoaXMuX2RvbU1vZGVsLm5vZGVGb3JJZChpZCk6bnVsbDt9fTs7U0RLLkxvZ01vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0YXJnZXQucmVnaXN0ZXJMb2dEaXNwYXRjaGVyKHRoaXMpO3RoaXMuX2xvZ0FnZW50PXRhcmdldC5sb2dBZ2VudCgpO3RoaXMuX2xvZ0FnZW50LmVuYWJsZSgpO2lmKCFIb3N0LmlzVW5kZXJUZXN0KCkpe3RoaXMuX2xvZ0FnZW50LnN0YXJ0VmlvbGF0aW9uc1JlcG9ydChbe25hbWU6J2xvbmdUYXNrJyx0aHJlc2hvbGQ6MjAwfSx7bmFtZTonbG9uZ0xheW91dCcsdGhyZXNob2xkOjMwfSx7bmFtZTonYmxvY2tlZEV2ZW50Jyx0aHJlc2hvbGQ6MTAwfSx7bmFtZTonYmxvY2tlZFBhcnNlcicsdGhyZXNob2xkOi0xfSx7bmFtZTonaGFuZGxlcicsdGhyZXNob2xkOjE1MH0se25hbWU6J3JlY3VycmluZ0hhbmRsZXInLHRocmVzaG9sZDo1MH0se25hbWU6J2Rpc2NvdXJhZ2VkQVBJVXNlJyx0aHJlc2hvbGQ6LTF9XSk7fX0KZW50cnlBZGRlZChwYXlsb2FkKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTG9nTW9kZWwuRXZlbnRzLkVudHJ5QWRkZWQse2xvZ01vZGVsOnRoaXMsZW50cnk6cGF5bG9hZH0pO30KcmVxdWVzdENsZWFyKCl7dGhpcy5fbG9nQWdlbnQuY2xlYXIoKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLkxvZ01vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Mb2csdHJ1ZSk7U0RLLkxvZ01vZGVsLkV2ZW50cz17RW50cnlBZGRlZDpTeW1ib2woJ0VudHJ5QWRkZWQnKX07O1NESy5TZXJ2aWNlV29ya2VyTWFuYWdlcj1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGFyZ2V0LnJlZ2lzdGVyU2VydmljZVdvcmtlckRpc3BhdGNoZXIobmV3IFNESy5TZXJ2aWNlV29ya2VyRGlzcGF0Y2hlcih0aGlzKSk7dGhpcy5fbGFzdEFub255bW91c1RhcmdldElkPTA7dGhpcy5fYWdlbnQ9dGFyZ2V0LnNlcnZpY2VXb3JrZXJBZ2VudCgpO3RoaXMuX3JlZ2lzdHJhdGlvbnM9bmV3IE1hcCgpO3RoaXMuZW5hYmxlKCk7dGhpcy5fZm9yY2VVcGRhdGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzZXJ2aWNlV29ya2VyVXBkYXRlT25SZWxvYWQnLGZhbHNlKTtpZih0aGlzLl9mb3JjZVVwZGF0ZVNldHRpbmcuZ2V0KCkpCnRoaXMuX2ZvcmNlVXBkYXRlU2V0dGluZ0NoYW5nZWQoKTt0aGlzLl9mb3JjZVVwZGF0ZVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fZm9yY2VVcGRhdGVTZXR0aW5nQ2hhbmdlZCx0aGlzKTtuZXcgU0RLLlNlcnZpY2VXb3JrZXJDb250ZXh0TmFtZXIodGFyZ2V0LHRoaXMpO30KZW5hYmxlKCl7aWYodGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt0aGlzLl9hZ2VudC5lbmFibGUoKTt9CmRpc2FibGUoKXtpZighdGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9ZmFsc2U7dGhpcy5fcmVnaXN0cmF0aW9ucy5jbGVhcigpO3RoaXMuX2FnZW50LmRpc2FibGUoKTt9CnJlZ2lzdHJhdGlvbnMoKXtyZXR1cm4gdGhpcy5fcmVnaXN0cmF0aW9uczt9CmZpbmRWZXJzaW9uKHZlcnNpb25JZCl7Zm9yKGNvbnN0IHJlZ2lzdHJhdGlvbiBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMoKS52YWx1ZXMoKSl7Y29uc3QgdmVyc2lvbj1yZWdpc3RyYXRpb24udmVyc2lvbnMuZ2V0KHZlcnNpb25JZCk7aWYodmVyc2lvbikKcmV0dXJuIHZlcnNpb247fQpyZXR1cm4gbnVsbDt9CmRlbGV0ZVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb25JZCl7Y29uc3QgcmVnaXN0cmF0aW9uPXRoaXMuX3JlZ2lzdHJhdGlvbnMuZ2V0KHJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKQpyZXR1cm47aWYocmVnaXN0cmF0aW9uLl9pc1JlZHVuZGFudCgpKXt0aGlzLl9yZWdpc3RyYXRpb25zLmRlbGV0ZShyZWdpc3RyYXRpb25JZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25EZWxldGVkLHJlZ2lzdHJhdGlvbik7cmV0dXJuO30KcmVnaXN0cmF0aW9uLl9kZWxldGluZz10cnVlO2Zvcihjb25zdCB2ZXJzaW9uIG9mIHJlZ2lzdHJhdGlvbi52ZXJzaW9ucy52YWx1ZXMoKSkKdGhpcy5zdG9wV29ya2VyKHZlcnNpb24uaWQpO3RoaXMuX3VucmVnaXN0ZXIocmVnaXN0cmF0aW9uLnNjb3BlVVJMKTt9CnVwZGF0ZVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb25JZCl7Y29uc3QgcmVnaXN0cmF0aW9uPXRoaXMuX3JlZ2lzdHJhdGlvbnMuZ2V0KHJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKQpyZXR1cm47dGhpcy5fYWdlbnQudXBkYXRlUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbi5zY29wZVVSTCk7fQpkZWxpdmVyUHVzaE1lc3NhZ2UocmVnaXN0cmF0aW9uSWQsZGF0YSl7Y29uc3QgcmVnaXN0cmF0aW9uPXRoaXMuX3JlZ2lzdHJhdGlvbnMuZ2V0KHJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKQpyZXR1cm47Y29uc3Qgb3JpZ2luPUNvbW1vbi5QYXJzZWRVUkwuZXh0cmFjdE9yaWdpbihyZWdpc3RyYXRpb24uc2NvcGVVUkwpO3RoaXMuX2FnZW50LmRlbGl2ZXJQdXNoTWVzc2FnZShvcmlnaW4scmVnaXN0cmF0aW9uSWQsZGF0YSk7fQpkaXNwYXRjaFN5bmNFdmVudChyZWdpc3RyYXRpb25JZCx0YWcsbGFzdENoYW5jZSl7Y29uc3QgcmVnaXN0cmF0aW9uPXRoaXMuX3JlZ2lzdHJhdGlvbnMuZ2V0KHJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKQpyZXR1cm47Y29uc3Qgb3JpZ2luPUNvbW1vbi5QYXJzZWRVUkwuZXh0cmFjdE9yaWdpbihyZWdpc3RyYXRpb24uc2NvcGVVUkwpO3RoaXMuX2FnZW50LmRpc3BhdGNoU3luY0V2ZW50KG9yaWdpbixyZWdpc3RyYXRpb25JZCx0YWcsbGFzdENoYW5jZSk7fQpfdW5yZWdpc3RlcihzY29wZSl7dGhpcy5fYWdlbnQudW5yZWdpc3RlcihzY29wZSk7fQpzdGFydFdvcmtlcihzY29wZSl7dGhpcy5fYWdlbnQuc3RhcnRXb3JrZXIoc2NvcGUpO30Kc2tpcFdhaXRpbmcoc2NvcGUpe3RoaXMuX2FnZW50LnNraXBXYWl0aW5nKHNjb3BlKTt9CnN0b3BXb3JrZXIodmVyc2lvbklkKXt0aGlzLl9hZ2VudC5zdG9wV29ya2VyKHZlcnNpb25JZCk7fQppbnNwZWN0V29ya2VyKHZlcnNpb25JZCl7dGhpcy5fYWdlbnQuaW5zcGVjdFdvcmtlcih2ZXJzaW9uSWQpO30KX3dvcmtlclJlZ2lzdHJhdGlvblVwZGF0ZWQocmVnaXN0cmF0aW9ucyl7Zm9yKGNvbnN0IHBheWxvYWQgb2YgcmVnaXN0cmF0aW9ucyl7bGV0IHJlZ2lzdHJhdGlvbj10aGlzLl9yZWdpc3RyYXRpb25zLmdldChwYXlsb2FkLnJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKXtyZWdpc3RyYXRpb249bmV3IFNESy5TZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKHBheWxvYWQpO3RoaXMuX3JlZ2lzdHJhdGlvbnMuc2V0KHBheWxvYWQucmVnaXN0cmF0aW9uSWQscmVnaXN0cmF0aW9uKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VydmljZVdvcmtlck1hbmFnZXIuRXZlbnRzLlJlZ2lzdHJhdGlvblVwZGF0ZWQscmVnaXN0cmF0aW9uKTtjb250aW51ZTt9CnJlZ2lzdHJhdGlvbi5fdXBkYXRlKHBheWxvYWQpO2lmKHJlZ2lzdHJhdGlvbi5fc2hvdWxkQmVSZW1vdmVkKCkpe3RoaXMuX3JlZ2lzdHJhdGlvbnMuZGVsZXRlKHJlZ2lzdHJhdGlvbi5pZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25EZWxldGVkLHJlZ2lzdHJhdGlvbik7fWVsc2V7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25VcGRhdGVkLHJlZ2lzdHJhdGlvbik7fX19Cl93b3JrZXJWZXJzaW9uVXBkYXRlZCh2ZXJzaW9ucyl7Y29uc3QgcmVnaXN0cmF0aW9ucz1uZXcgU2V0KCk7Zm9yKGNvbnN0IHBheWxvYWQgb2YgdmVyc2lvbnMpe2NvbnN0IHJlZ2lzdHJhdGlvbj10aGlzLl9yZWdpc3RyYXRpb25zLmdldChwYXlsb2FkLnJlZ2lzdHJhdGlvbklkKTtpZighcmVnaXN0cmF0aW9uKQpjb250aW51ZTtyZWdpc3RyYXRpb24uX3VwZGF0ZVZlcnNpb24ocGF5bG9hZCk7cmVnaXN0cmF0aW9ucy5hZGQocmVnaXN0cmF0aW9uKTt9CmZvcihjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucyl7aWYocmVnaXN0cmF0aW9uLl9zaG91bGRCZVJlbW92ZWQoKSl7dGhpcy5fcmVnaXN0cmF0aW9ucy5kZWxldGUocmVnaXN0cmF0aW9uLmlkKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VydmljZVdvcmtlck1hbmFnZXIuRXZlbnRzLlJlZ2lzdHJhdGlvbkRlbGV0ZWQscmVnaXN0cmF0aW9uKTt9ZWxzZXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VydmljZVdvcmtlck1hbmFnZXIuRXZlbnRzLlJlZ2lzdHJhdGlvblVwZGF0ZWQscmVnaXN0cmF0aW9uKTt9fX0KX3dvcmtlckVycm9yUmVwb3J0ZWQocGF5bG9hZCl7Y29uc3QgcmVnaXN0cmF0aW9uPXRoaXMuX3JlZ2lzdHJhdGlvbnMuZ2V0KHBheWxvYWQucmVnaXN0cmF0aW9uSWQpO2lmKCFyZWdpc3RyYXRpb24pCnJldHVybjtyZWdpc3RyYXRpb24uZXJyb3JzLnB1c2gocGF5bG9hZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25FcnJvckFkZGVkLHtyZWdpc3RyYXRpb246cmVnaXN0cmF0aW9uLGVycm9yOnBheWxvYWR9KTt9CmZvcmNlVXBkYXRlT25SZWxvYWRTZXR0aW5nKCl7cmV0dXJuIHRoaXMuX2ZvcmNlVXBkYXRlU2V0dGluZzt9Cl9mb3JjZVVwZGF0ZVNldHRpbmdDaGFuZ2VkKCl7dGhpcy5fYWdlbnQuc2V0Rm9yY2VVcGRhdGVPblBhZ2VMb2FkKHRoaXMuX2ZvcmNlVXBkYXRlU2V0dGluZy5nZXQoKSk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5TZXJ2aWNlV29ya2VyTWFuYWdlcixTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVGFyZ2V0fFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyLHRydWUpO1NESy5TZXJ2aWNlV29ya2VyTWFuYWdlci5FdmVudHM9e1JlZ2lzdHJhdGlvblVwZGF0ZWQ6U3ltYm9sKCdSZWdpc3RyYXRpb25VcGRhdGVkJyksUmVnaXN0cmF0aW9uRXJyb3JBZGRlZDpTeW1ib2woJ1JlZ2lzdHJhdGlvbkVycm9yQWRkZWQnKSxSZWdpc3RyYXRpb25EZWxldGVkOlN5bWJvbCgnUmVnaXN0cmF0aW9uRGVsZXRlZCcpfTtTREsuU2VydmljZVdvcmtlckRpc3BhdGNoZXI9Y2xhc3N7Y29uc3RydWN0b3IobWFuYWdlcil7dGhpcy5fbWFuYWdlcj1tYW5hZ2VyO30Kd29ya2VyUmVnaXN0cmF0aW9uVXBkYXRlZChyZWdpc3RyYXRpb25zKXt0aGlzLl9tYW5hZ2VyLl93b3JrZXJSZWdpc3RyYXRpb25VcGRhdGVkKHJlZ2lzdHJhdGlvbnMpO30Kd29ya2VyVmVyc2lvblVwZGF0ZWQodmVyc2lvbnMpe3RoaXMuX21hbmFnZXIuX3dvcmtlclZlcnNpb25VcGRhdGVkKHZlcnNpb25zKTt9CndvcmtlckVycm9yUmVwb3J0ZWQoZXJyb3JNZXNzYWdlKXt0aGlzLl9tYW5hZ2VyLl93b3JrZXJFcnJvclJlcG9ydGVkKGVycm9yTWVzc2FnZSk7fX07U0RLLlNlcnZpY2VXb3JrZXJWZXJzaW9uPWNsYXNze2NvbnN0cnVjdG9yKHJlZ2lzdHJhdGlvbixwYXlsb2FkKXt0aGlzLnJlZ2lzdHJhdGlvbj1yZWdpc3RyYXRpb247dGhpcy5fdXBkYXRlKHBheWxvYWQpO30KX3VwZGF0ZShwYXlsb2FkKXt0aGlzLmlkPXBheWxvYWQudmVyc2lvbklkO3RoaXMuc2NyaXB0VVJMPXBheWxvYWQuc2NyaXB0VVJMO2NvbnN0IHBhcnNlZFVSTD1uZXcgQ29tbW9uLlBhcnNlZFVSTChwYXlsb2FkLnNjcmlwdFVSTCk7dGhpcy5zZWN1cml0eU9yaWdpbj1wYXJzZWRVUkwuc2VjdXJpdHlPcmlnaW4oKTt0aGlzLnJ1bm5pbmdTdGF0dXM9cGF5bG9hZC5ydW5uaW5nU3RhdHVzO3RoaXMuc3RhdHVzPXBheWxvYWQuc3RhdHVzO3RoaXMuc2NyaXB0TGFzdE1vZGlmaWVkPXBheWxvYWQuc2NyaXB0TGFzdE1vZGlmaWVkO3RoaXMuc2NyaXB0UmVzcG9uc2VUaW1lPXBheWxvYWQuc2NyaXB0UmVzcG9uc2VUaW1lO3RoaXMuY29udHJvbGxlZENsaWVudHM9W107Zm9yKGxldCBpPTA7aTxwYXlsb2FkLmNvbnRyb2xsZWRDbGllbnRzLmxlbmd0aDsrK2kpCnRoaXMuY29udHJvbGxlZENsaWVudHMucHVzaChwYXlsb2FkLmNvbnRyb2xsZWRDbGllbnRzW2ldKTt0aGlzLnRhcmdldElkPXBheWxvYWQudGFyZ2V0SWR8fG51bGw7fQppc1N0YXJ0YWJsZSgpe3JldHVybiF0aGlzLnJlZ2lzdHJhdGlvbi5pc0RlbGV0ZWQmJnRoaXMuaXNBY3RpdmF0ZWQoKSYmdGhpcy5pc1N0b3BwZWQoKTt9CmlzU3RvcHBlZEFuZFJlZHVuZGFudCgpe3JldHVybiB0aGlzLnJ1bm5pbmdTdGF0dXM9PT1Qcm90b2NvbC5TZXJ2aWNlV29ya2VyLlNlcnZpY2VXb3JrZXJWZXJzaW9uUnVubmluZ1N0YXR1cy5TdG9wcGVkJiZ0aGlzLnN0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25TdGF0dXMuUmVkdW5kYW50O30KaXNTdG9wcGVkKCl7cmV0dXJuIHRoaXMucnVubmluZ1N0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25SdW5uaW5nU3RhdHVzLlN0b3BwZWQ7fQppc1N0YXJ0aW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ1N0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25SdW5uaW5nU3RhdHVzLlN0YXJ0aW5nO30KaXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ1N0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25SdW5uaW5nU3RhdHVzLlJ1bm5pbmc7fQppc1N0b3BwaW5nKCl7cmV0dXJuIHRoaXMucnVubmluZ1N0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25SdW5uaW5nU3RhdHVzLlN0b3BwaW5nO30KaXNOZXcoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PT1Qcm90b2NvbC5TZXJ2aWNlV29ya2VyLlNlcnZpY2VXb3JrZXJWZXJzaW9uU3RhdHVzLk5ldzt9CmlzSW5zdGFsbGluZygpe3JldHVybiB0aGlzLnN0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25TdGF0dXMuSW5zdGFsbGluZzt9CmlzSW5zdGFsbGVkKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT09UHJvdG9jb2wuU2VydmljZVdvcmtlci5TZXJ2aWNlV29ya2VyVmVyc2lvblN0YXR1cy5JbnN0YWxsZWQ7fQppc0FjdGl2YXRpbmcoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PT1Qcm90b2NvbC5TZXJ2aWNlV29ya2VyLlNlcnZpY2VXb3JrZXJWZXJzaW9uU3RhdHVzLkFjdGl2YXRpbmc7fQppc0FjdGl2YXRlZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVByb3RvY29sLlNlcnZpY2VXb3JrZXIuU2VydmljZVdvcmtlclZlcnNpb25TdGF0dXMuQWN0aXZhdGVkO30KaXNSZWR1bmRhbnQoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PT1Qcm90b2NvbC5TZXJ2aWNlV29ya2VyLlNlcnZpY2VXb3JrZXJWZXJzaW9uU3RhdHVzLlJlZHVuZGFudDt9Cm1vZGUoKXtpZih0aGlzLmlzTmV3KCl8fHRoaXMuaXNJbnN0YWxsaW5nKCkpCnJldHVybiBTREsuU2VydmljZVdvcmtlclZlcnNpb24uTW9kZXMuSW5zdGFsbGluZztlbHNlIGlmKHRoaXMuaXNJbnN0YWxsZWQoKSkKcmV0dXJuIFNESy5TZXJ2aWNlV29ya2VyVmVyc2lvbi5Nb2Rlcy5XYWl0aW5nO2Vsc2UgaWYodGhpcy5pc0FjdGl2YXRpbmcoKXx8dGhpcy5pc0FjdGl2YXRlZCgpKQpyZXR1cm4gU0RLLlNlcnZpY2VXb3JrZXJWZXJzaW9uLk1vZGVzLkFjdGl2ZTtyZXR1cm4gU0RLLlNlcnZpY2VXb3JrZXJWZXJzaW9uLk1vZGVzLlJlZHVuZGFudDt9fTtTREsuU2VydmljZVdvcmtlclZlcnNpb24uTW9kZXM9e0luc3RhbGxpbmc6J2luc3RhbGxpbmcnLFdhaXRpbmc6J3dhaXRpbmcnLEFjdGl2ZTonYWN0aXZlJyxSZWR1bmRhbnQ6J3JlZHVuZGFudCd9O1NESy5TZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHBheWxvYWQpe3RoaXMuX3VwZGF0ZShwYXlsb2FkKTt0aGlzLnZlcnNpb25zPW5ldyBNYXAoKTt0aGlzLl9kZWxldGluZz1mYWxzZTt0aGlzLmVycm9ycz1bXTt9Cl91cGRhdGUocGF5bG9hZCl7dGhpcy5fZmluZ2VycHJpbnQ9U3ltYm9sKCdmaW5nZXJwcmludCcpO3RoaXMuaWQ9cGF5bG9hZC5yZWdpc3RyYXRpb25JZDt0aGlzLnNjb3BlVVJMPXBheWxvYWQuc2NvcGVVUkw7Y29uc3QgcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKHBheWxvYWQuc2NvcGVVUkwpO3RoaXMuc2VjdXJpdHlPcmlnaW49cGFyc2VkVVJMLnNlY3VyaXR5T3JpZ2luKCk7dGhpcy5pc0RlbGV0ZWQ9cGF5bG9hZC5pc0RlbGV0ZWQ7dGhpcy5mb3JjZVVwZGF0ZU9uUGFnZUxvYWQ9cGF5bG9hZC5mb3JjZVVwZGF0ZU9uUGFnZUxvYWQ7fQpmaW5nZXJwcmludCgpe3JldHVybiB0aGlzLl9maW5nZXJwcmludDt9CnZlcnNpb25zQnlNb2RlKCl7Y29uc3QgcmVzdWx0PW5ldyBNYXAoKTtmb3IoY29uc3QgdmVyc2lvbiBvZiB0aGlzLnZlcnNpb25zLnZhbHVlcygpKQpyZXN1bHQuc2V0KHZlcnNpb24ubW9kZSgpLHZlcnNpb24pO3JldHVybiByZXN1bHQ7fQpfdXBkYXRlVmVyc2lvbihwYXlsb2FkKXt0aGlzLl9maW5nZXJwcmludD1TeW1ib2woJ2ZpbmdlcnByaW50Jyk7bGV0IHZlcnNpb249dGhpcy52ZXJzaW9ucy5nZXQocGF5bG9hZC52ZXJzaW9uSWQpO2lmKCF2ZXJzaW9uKXt2ZXJzaW9uPW5ldyBTREsuU2VydmljZVdvcmtlclZlcnNpb24odGhpcyxwYXlsb2FkKTt0aGlzLnZlcnNpb25zLnNldChwYXlsb2FkLnZlcnNpb25JZCx2ZXJzaW9uKTtyZXR1cm4gdmVyc2lvbjt9CnZlcnNpb24uX3VwZGF0ZShwYXlsb2FkKTtyZXR1cm4gdmVyc2lvbjt9Cl9pc1JlZHVuZGFudCgpe2Zvcihjb25zdCB2ZXJzaW9uIG9mIHRoaXMudmVyc2lvbnMudmFsdWVzKCkpe2lmKCF2ZXJzaW9uLmlzU3RvcHBlZEFuZFJlZHVuZGFudCgpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9Cl9zaG91bGRCZVJlbW92ZWQoKXtyZXR1cm4gdGhpcy5faXNSZWR1bmRhbnQoKSYmKCF0aGlzLmVycm9ycy5sZW5ndGh8fHRoaXMuX2RlbGV0aW5nKTt9CmNhbkJlUmVtb3ZlZCgpe3JldHVybiB0aGlzLmlzRGVsZXRlZHx8dGhpcy5fZGVsZXRpbmc7fQpjbGVhckVycm9ycygpe3RoaXMuX2ZpbmdlcnByaW50PVN5bWJvbCgnZmluZ2VycHJpbnQnKTt0aGlzLmVycm9ycz1bXTt9fTtTREsuU2VydmljZVdvcmtlckNvbnRleHROYW1lcj1jbGFzc3tjb25zdHJ1Y3Rvcih0YXJnZXQsc2VydmljZVdvcmtlck1hbmFnZXIpe3RoaXMuX3RhcmdldD10YXJnZXQ7dGhpcy5fc2VydmljZVdvcmtlck1hbmFnZXI9c2VydmljZVdvcmtlck1hbmFnZXI7dGhpcy5fdmVyc2lvbkJ5VGFyZ2V0SWQ9bmV3IE1hcCgpO3NlcnZpY2VXb3JrZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25VcGRhdGVkLHRoaXMuX3JlZ2lzdHJhdGlvbnNVcGRhdGVkLHRoaXMpO3NlcnZpY2VXb3JrZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25EZWxldGVkLHRoaXMuX3JlZ2lzdHJhdGlvbnNVcGRhdGVkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q3JlYXRlZCx0aGlzLl9leGVjdXRpb25Db250ZXh0Q3JlYXRlZCx0aGlzKTt9Cl9yZWdpc3RyYXRpb25zVXBkYXRlZChldmVudCl7dGhpcy5fdmVyc2lvbkJ5VGFyZ2V0SWQuY2xlYXIoKTtjb25zdCByZWdpc3RyYXRpb25zPXRoaXMuX3NlcnZpY2VXb3JrZXJNYW5hZ2VyLnJlZ2lzdHJhdGlvbnMoKS52YWx1ZXNBcnJheSgpO2Zvcihjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucyl7Y29uc3QgdmVyc2lvbnM9cmVnaXN0cmF0aW9uLnZlcnNpb25zLnZhbHVlc0FycmF5KCk7Zm9yKGNvbnN0IHZlcnNpb24gb2YgdmVyc2lvbnMpe2lmKHZlcnNpb24udGFyZ2V0SWQpCnRoaXMuX3ZlcnNpb25CeVRhcmdldElkLnNldCh2ZXJzaW9uLnRhcmdldElkLHZlcnNpb24pO319CnRoaXMuX3VwZGF0ZUFsbENvbnRleHRMYWJlbHMoKTt9Cl9leGVjdXRpb25Db250ZXh0Q3JlYXRlZChldmVudCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD0oZXZlbnQuZGF0YSk7Y29uc3Qgc2VydmljZVdvcmtlclRhcmdldElkPXRoaXMuX3NlcnZpY2VXb3JrZXJUYXJnZXRJZEZvcldvcmtlcihleGVjdXRpb25Db250ZXh0LnRhcmdldCgpKTtpZighc2VydmljZVdvcmtlclRhcmdldElkKQpyZXR1cm47dGhpcy5fdXBkYXRlQ29udGV4dExhYmVsKGV4ZWN1dGlvbkNvbnRleHQsdGhpcy5fdmVyc2lvbkJ5VGFyZ2V0SWQuZ2V0KHNlcnZpY2VXb3JrZXJUYXJnZXRJZCl8fG51bGwpO30KX3NlcnZpY2VXb3JrZXJUYXJnZXRJZEZvcldvcmtlcih0YXJnZXQpe2NvbnN0IHBhcmVudD10YXJnZXQucGFyZW50VGFyZ2V0KCk7aWYoIXBhcmVudHx8cGFyZW50LnBhcmVudFRhcmdldCgpIT09dGhpcy5fdGFyZ2V0KQpyZXR1cm4gbnVsbDtyZXR1cm4gcGFyZW50LmlkKCk7fQpfdXBkYXRlQWxsQ29udGV4dExhYmVscygpe2Zvcihjb25zdCB0YXJnZXQgb2YgU0RLLnRhcmdldE1hbmFnZXIudGFyZ2V0cygpKXtjb25zdCBzZXJ2aWNlV29ya2VyVGFyZ2V0SWQ9dGhpcy5fc2VydmljZVdvcmtlclRhcmdldElkRm9yV29ya2VyKHRhcmdldCk7aWYoIXNlcnZpY2VXb3JrZXJUYXJnZXRJZCkKY29udGludWU7Y29uc3QgdmVyc2lvbj10aGlzLl92ZXJzaW9uQnlUYXJnZXRJZC5nZXQoc2VydmljZVdvcmtlclRhcmdldElkKXx8bnVsbDtjb25zdCBydW50aW1lTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SdW50aW1lTW9kZWwpO2NvbnN0IGV4ZWN1dGlvbkNvbnRleHRzPXJ1bnRpbWVNb2RlbD9ydW50aW1lTW9kZWwuZXhlY3V0aW9uQ29udGV4dHMoKTpbXTtmb3IoY29uc3QgY29udGV4dCBvZiBleGVjdXRpb25Db250ZXh0cykKdGhpcy5fdXBkYXRlQ29udGV4dExhYmVsKGNvbnRleHQsdmVyc2lvbik7fX0KX3VwZGF0ZUNvbnRleHRMYWJlbChjb250ZXh0LHZlcnNpb24pe2lmKCF2ZXJzaW9uKXtjb250ZXh0LnNldExhYmVsKCcnKTtyZXR1cm47fQpjb25zdCBwYXJzZWRVcmw9Y29udGV4dC5vcmlnaW4uYXNQYXJzZWRVUkwoKTtjb25zdCBsYWJlbD1wYXJzZWRVcmw/cGFyc2VkVXJsLmxhc3RQYXRoQ29tcG9uZW50V2l0aEZyYWdtZW50KCk6Y29udGV4dC5uYW1lO2NvbnRleHQuc2V0TGFiZWwobGFiZWwrJyAjJyt2ZXJzaW9uLmlkKycgKCcrdmVyc2lvbi5zdGF0dXMrJyknKTt9fTs7U0RLLlRyYWNpbmdNYW5hZ2VyQ2xpZW50PWZ1bmN0aW9uKCl7fTtTREsuVHJhY2luZ01hbmFnZXJDbGllbnQucHJvdG90eXBlPXt0cmFjZUV2ZW50c0NvbGxlY3RlZChldmVudHMpe30sdHJhY2luZ0NvbXBsZXRlKCl7fSx0cmFjaW5nQnVmZmVyVXNhZ2UodXNhZ2Upe30sZXZlbnRzUmV0cmlldmFsUHJvZ3Jlc3MocHJvZ3Jlc3Mpe319O1NESy5UcmFjaW5nTWFuYWdlcj1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fdHJhY2luZ0FnZW50PXRhcmdldC50cmFjaW5nQWdlbnQoKTt0YXJnZXQucmVnaXN0ZXJUcmFjaW5nRGlzcGF0Y2hlcihuZXcgU0RLLlRyYWNpbmdEaXNwYXRjaGVyKHRoaXMpKTt0aGlzLl9hY3RpdmVDbGllbnQ9bnVsbDt0aGlzLl9ldmVudEJ1ZmZlclNpemU9MDt0aGlzLl9ldmVudHNSZXRyaWV2ZWQ9MDt9Cl9idWZmZXJVc2FnZSh1c2FnZSxldmVudENvdW50LHBlcmNlbnRGdWxsKXt0aGlzLl9ldmVudEJ1ZmZlclNpemU9ZXZlbnRDb3VudDt0aGlzLl9hY3RpdmVDbGllbnQudHJhY2luZ0J1ZmZlclVzYWdlKHVzYWdlfHxwZXJjZW50RnVsbHx8MCk7fQpfZXZlbnRzQ29sbGVjdGVkKGV2ZW50cyl7dGhpcy5fYWN0aXZlQ2xpZW50LnRyYWNlRXZlbnRzQ29sbGVjdGVkKGV2ZW50cyk7dGhpcy5fZXZlbnRzUmV0cmlldmVkKz1ldmVudHMubGVuZ3RoO2lmKCF0aGlzLl9ldmVudEJ1ZmZlclNpemUpCnJldHVybjtpZih0aGlzLl9ldmVudHNSZXRyaWV2ZWQ+dGhpcy5fZXZlbnRCdWZmZXJTaXplKQp0aGlzLl9ldmVudHNSZXRyaWV2ZWQ9dGhpcy5fZXZlbnRCdWZmZXJTaXplO3RoaXMuX2FjdGl2ZUNsaWVudC5ldmVudHNSZXRyaWV2YWxQcm9ncmVzcyh0aGlzLl9ldmVudHNSZXRyaWV2ZWQvdGhpcy5fZXZlbnRCdWZmZXJTaXplKTt9Cl90cmFjaW5nQ29tcGxldGUoKXt0aGlzLl9ldmVudEJ1ZmZlclNpemU9MDt0aGlzLl9ldmVudHNSZXRyaWV2ZWQ9MDt0aGlzLl9hY3RpdmVDbGllbnQudHJhY2luZ0NvbXBsZXRlKCk7dGhpcy5fYWN0aXZlQ2xpZW50PW51bGw7dGhpcy5fZmluaXNoaW5nPWZhbHNlO30Kc3RhcnQoY2xpZW50LGNhdGVnb3J5RmlsdGVyLG9wdGlvbnMpe2lmKHRoaXMuX2FjdGl2ZUNsaWVudCkKdGhyb3cgbmV3IEVycm9yKCdUcmFjaW5nIGlzIGFscmVhZHkgc3RhcnRlZCcpO2NvbnN0IGJ1ZmZlclVzYWdlUmVwb3J0aW5nSW50ZXJ2YWxNcz01MDA7dGhpcy5fYWN0aXZlQ2xpZW50PWNsaWVudDtyZXR1cm4gdGhpcy5fdHJhY2luZ0FnZW50LnN0YXJ0KGNhdGVnb3J5RmlsdGVyLG9wdGlvbnMsYnVmZmVyVXNhZ2VSZXBvcnRpbmdJbnRlcnZhbE1zLFNESy5UcmFjaW5nTWFuYWdlci5UcmFuc2Zlck1vZGUuUmVwb3J0RXZlbnRzKTt9CnN0b3AoKXtpZighdGhpcy5fYWN0aXZlQ2xpZW50KQp0aHJvdyBuZXcgRXJyb3IoJ1RyYWNpbmcgaXMgbm90IHN0YXJ0ZWQnKTtpZih0aGlzLl9maW5pc2hpbmcpCnRocm93IG5ldyBFcnJvcignVHJhY2luZyBpcyBhbHJlYWR5IGJlaW5nIHN0b3BwZWQnKTt0aGlzLl9maW5pc2hpbmc9dHJ1ZTt0aGlzLl90cmFjaW5nQWdlbnQuZW5kKCk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5UcmFjaW5nTWFuYWdlcixTREsuVGFyZ2V0LkNhcGFiaWxpdHkuVHJhY2luZyxmYWxzZSk7U0RLLlRyYWNpbmdNYW5hZ2VyLkV2ZW50UGF5bG9hZDtTREsuVHJhY2luZ01hbmFnZXIuVHJhbnNmZXJNb2RlPXtSZXBvcnRFdmVudHM6J1JlcG9ydEV2ZW50cycsUmV0dXJuQXNTdHJlYW06J1JldHVybkFzU3RyZWFtJ307U0RLLlRyYWNpbmdEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKHRyYWNpbmdNYW5hZ2VyKXt0aGlzLl90cmFjaW5nTWFuYWdlcj10cmFjaW5nTWFuYWdlcjt9CmJ1ZmZlclVzYWdlKHVzYWdlLGV2ZW50Q291bnQscGVyY2VudEZ1bGwpe3RoaXMuX3RyYWNpbmdNYW5hZ2VyLl9idWZmZXJVc2FnZSh1c2FnZSxldmVudENvdW50LHBlcmNlbnRGdWxsKTt9CmRhdGFDb2xsZWN0ZWQoZGF0YSl7dGhpcy5fdHJhY2luZ01hbmFnZXIuX2V2ZW50c0NvbGxlY3RlZChkYXRhKTt9CnRyYWNpbmdDb21wbGV0ZSgpe3RoaXMuX3RyYWNpbmdNYW5hZ2VyLl90cmFjaW5nQ29tcGxldGUoKTt9fTs7U0RLLlRyYWNpbmdNb2RlbD1jbGFzc3tjb25zdHJ1Y3RvcihiYWNraW5nU3RvcmFnZSl7dGhpcy5fYmFja2luZ1N0b3JhZ2U9YmFja2luZ1N0b3JhZ2U7dGhpcy5fZmlyc3RXcml0ZVBlbmRpbmc9dHJ1ZTt0aGlzLl9wcm9jZXNzQnlJZD1uZXcgTWFwKCk7dGhpcy5fcHJvY2Vzc0J5TmFtZT1uZXcgTWFwKCk7dGhpcy5fbWluaW11bVJlY29yZFRpbWU9MDt0aGlzLl9tYXhpbXVtUmVjb3JkVGltZT0wO3RoaXMuX2RldlRvb2xzTWV0YWRhdGFFdmVudHM9W107dGhpcy5fYXN5bmNFdmVudHM9W107dGhpcy5fb3BlbkFzeW5jRXZlbnRzPW5ldyBNYXAoKTt0aGlzLl9vcGVuTmVzdGFibGVBc3luY0V2ZW50cz1uZXcgTWFwKCk7dGhpcy5fcHJvZmlsZUdyb3Vwcz1uZXcgTWFwKCk7dGhpcy5fcGFyc2VkQ2F0ZWdvcmllcz1uZXcgTWFwKCk7fQpzdGF0aWMgaXNOZXN0YWJsZUFzeW5jUGhhc2UocGhhc2Upe3JldHVybiBwaGFzZT09PSdiJ3x8cGhhc2U9PT0nZSd8fHBoYXNlPT09J24nO30Kc3RhdGljIGlzQXN5bmNCZWdpblBoYXNlKHBoYXNlKXtyZXR1cm4gcGhhc2U9PT0nUyd8fHBoYXNlPT09J2InO30Kc3RhdGljIGlzQXN5bmNQaGFzZShwaGFzZSl7cmV0dXJuIFNESy5UcmFjaW5nTW9kZWwuaXNOZXN0YWJsZUFzeW5jUGhhc2UocGhhc2UpfHxwaGFzZT09PSdTJ3x8cGhhc2U9PT0nVCd8fHBoYXNlPT09J0YnfHxwaGFzZT09PSdwJzt9CnN0YXRpYyBpc0Zsb3dQaGFzZShwaGFzZSl7cmV0dXJuIHBoYXNlPT09J3MnfHxwaGFzZT09PSd0J3x8cGhhc2U9PT0nZic7fQpzdGF0aWMgaXNUb3BMZXZlbEV2ZW50KGV2ZW50KXtyZXR1cm4gZXZlbnQuaGFzQ2F0ZWdvcnkoU0RLLlRyYWNpbmdNb2RlbC5Ub3BMZXZlbEV2ZW50Q2F0ZWdvcnkpfHxldmVudC5oYXNDYXRlZ29yeShTREsuVHJhY2luZ01vZGVsLkRldlRvb2xzTWV0YWRhdGFFdmVudENhdGVnb3J5KSYmZXZlbnQubmFtZT09PSdQcm9ncmFtJzt9CnN0YXRpYyBfZXh0cmFjdElkKHBheWxvYWQpe2NvbnN0IHNjb3BlPXBheWxvYWQuc2NvcGV8fCcnO2lmKHR5cGVvZiBwYXlsb2FkLmlkMj09PSd1bmRlZmluZWQnKQpyZXR1cm4gc2NvcGUmJnBheWxvYWQuaWQ/YCR7c2NvcGV9QCR7cGF5bG9hZC5pZH1gOnBheWxvYWQuaWQ7Y29uc3QgaWQyPXBheWxvYWQuaWQyO2lmKHR5cGVvZiBpZDI9PT0nb2JqZWN0JyYmKCdnbG9iYWwnaW4gaWQyKSE9PSgnbG9jYWwnaW4gaWQyKSl7cmV0dXJuIHR5cGVvZiBpZDJbJ2dsb2JhbCddIT09J3VuZGVmaW5lZCc/YDoke3Njb3BlfToke2lkMlsnZ2xvYmFsJ119YDpgOiR7c2NvcGV9OiR7cGF5bG9hZC5waWR9OiR7aWQyWydsb2NhbCddfWA7fQpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGlkMiBmaWVsZCBhdCAke3BheWxvYWQudHMgLyAxMDAwfSwgb25lIGFuZCBvbmx5IG9uZSBvZiAnbG9jYWwnIGFuZCAnZ2xvYmFsJyBzaG91bGQgYmUgcHJlc2VudC5gKTt9CnN0YXRpYyBicm93c2VyTWFpblRocmVhZCh0cmFjaW5nTW9kZWwpe2NvbnN0IHByb2Nlc3Nlcz10cmFjaW5nTW9kZWwuc29ydGVkUHJvY2Vzc2VzKCk7aWYoIXByb2Nlc3Nlcy5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGJyb3dzZXJNYWluVGhyZWFkTmFtZT0nQ3JCcm93c2VyTWFpbic7Y29uc3QgYnJvd3NlclByb2Nlc3Nlcz1bXTtjb25zdCBicm93c2VyTWFpblRocmVhZHM9W107Zm9yKGNvbnN0IHByb2Nlc3Mgb2YgcHJvY2Vzc2VzKXtpZihwcm9jZXNzLm5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCdicm93c2VyJykpCmJyb3dzZXJQcm9jZXNzZXMucHVzaChwcm9jZXNzKTticm93c2VyTWFpblRocmVhZHMucHVzaCguLi5wcm9jZXNzLnNvcnRlZFRocmVhZHMoKS5maWx0ZXIodD0+dC5uYW1lKCk9PT1icm93c2VyTWFpblRocmVhZE5hbWUpKTt9CmlmKGJyb3dzZXJNYWluVGhyZWFkcy5sZW5ndGg9PT0xKQpyZXR1cm4gYnJvd3Nlck1haW5UaHJlYWRzWzBdO2lmKGJyb3dzZXJQcm9jZXNzZXMubGVuZ3RoPT09MSkKcmV0dXJuIGJyb3dzZXJQcm9jZXNzZXNbMF0udGhyZWFkQnlOYW1lKGJyb3dzZXJNYWluVGhyZWFkTmFtZSk7Y29uc3QgdHJhY2luZ1N0YXJ0ZWRJbkJyb3dzZXI9dHJhY2luZ01vZGVsLmRldlRvb2xzTWV0YWRhdGFFdmVudHMoKS5maWx0ZXIoZT0+ZS5uYW1lPT09J1RyYWNpbmdTdGFydGVkSW5Ccm93c2VyJyk7aWYodHJhY2luZ1N0YXJ0ZWRJbkJyb3dzZXIubGVuZ3RoPT09MSkKcmV0dXJuIHRyYWNpbmdTdGFydGVkSW5Ccm93c2VyWzBdLnRocmVhZDtDb21tb24uY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZpbmQgYnJvd3NlciBtYWluIHRocmVhZCBpbiB0cmFjZSwgc29tZSB0aW1lbGluZSBmZWF0dXJlcyBtYXkgYmUgdW5hdmFpbGFibGUnKTtyZXR1cm4gbnVsbDt9CmRldlRvb2xzTWV0YWRhdGFFdmVudHMoKXtyZXR1cm4gdGhpcy5fZGV2VG9vbHNNZXRhZGF0YUV2ZW50czt9CmFkZEV2ZW50cyhldmVudHMpe2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDsrK2kpCnRoaXMuX2FkZEV2ZW50KGV2ZW50c1tpXSk7fQp0cmFjaW5nQ29tcGxldGUoKXt0aGlzLl9wcm9jZXNzUGVuZGluZ0FzeW5jRXZlbnRzKCk7dGhpcy5fYmFja2luZ1N0b3JhZ2UuYXBwZW5kU3RyaW5nKHRoaXMuX2ZpcnN0V3JpdGVQZW5kaW5nPydbXSc6J10nKTt0aGlzLl9iYWNraW5nU3RvcmFnZS5maW5pc2hXcml0aW5nKCk7dGhpcy5fZmlyc3RXcml0ZVBlbmRpbmc9ZmFsc2U7Zm9yKGNvbnN0IHByb2Nlc3Mgb2YgdGhpcy5fcHJvY2Vzc0J5SWQudmFsdWVzKCkpe2Zvcihjb25zdCB0aHJlYWQgb2YgcHJvY2Vzcy5fdGhyZWFkcy52YWx1ZXMoKSkKdGhyZWFkLnRyYWNpbmdDb21wbGV0ZSgpO319CmRpc3Bvc2UoKXtpZighdGhpcy5fZmlyc3RXcml0ZVBlbmRpbmcpCnRoaXMuX2JhY2tpbmdTdG9yYWdlLnJlc2V0KCk7fQphZGp1c3RUaW1lKG9mZnNldCl7dGhpcy5fbWluaW11bVJlY29yZFRpbWUrPW9mZnNldDt0aGlzLl9tYXhpbXVtUmVjb3JkVGltZSs9b2Zmc2V0O2Zvcihjb25zdCBwcm9jZXNzIG9mIHRoaXMuX3Byb2Nlc3NCeUlkLnZhbHVlcygpKXtmb3IoY29uc3QgdGhyZWFkIG9mIHByb2Nlc3MuX3RocmVhZHMudmFsdWVzKCkpe2Zvcihjb25zdCBldmVudCBvZiB0aHJlYWQuZXZlbnRzKCkpe2V2ZW50LnN0YXJ0VGltZSs9b2Zmc2V0O2lmKHR5cGVvZiBldmVudC5lbmRUaW1lPT09J251bWJlcicpCmV2ZW50LmVuZFRpbWUrPW9mZnNldDt9CmZvcihjb25zdCBldmVudCBvZiB0aHJlYWQuYXN5bmNFdmVudHMoKSl7ZXZlbnQuc3RhcnRUaW1lKz1vZmZzZXQ7aWYodHlwZW9mIGV2ZW50LmVuZFRpbWU9PT0nbnVtYmVyJykKZXZlbnQuZW5kVGltZSs9b2Zmc2V0O319fX0KX2FkZEV2ZW50KHBheWxvYWQpe2xldCBwcm9jZXNzPXRoaXMuX3Byb2Nlc3NCeUlkLmdldChwYXlsb2FkLnBpZCk7aWYoIXByb2Nlc3Mpe3Byb2Nlc3M9bmV3IFNESy5UcmFjaW5nTW9kZWwuUHJvY2Vzcyh0aGlzLHBheWxvYWQucGlkKTt0aGlzLl9wcm9jZXNzQnlJZC5zZXQocGF5bG9hZC5waWQscHJvY2Vzcyk7fQpjb25zdCBwaGFzZT1TREsuVHJhY2luZ01vZGVsLlBoYXNlO2NvbnN0IGV2ZW50c0RlbGltaXRlcj0nLFxuJzt0aGlzLl9iYWNraW5nU3RvcmFnZS5hcHBlbmRTdHJpbmcodGhpcy5fZmlyc3RXcml0ZVBlbmRpbmc/J1snOmV2ZW50c0RlbGltaXRlcik7dGhpcy5fZmlyc3RXcml0ZVBlbmRpbmc9ZmFsc2U7Y29uc3Qgc3RyaW5nUGF5bG9hZD1KU09OLnN0cmluZ2lmeShwYXlsb2FkKTtjb25zdCBpc0FjY2Vzc2libGU9cGF5bG9hZC5waD09PXBoYXNlLlNuYXBzaG90T2JqZWN0O2xldCBiYWNraW5nU3RvcmFnZT1udWxsO2NvbnN0IGtlZXBTdHJpbmdzTGVzc1RoYW49MTAwMDA7aWYoaXNBY2Nlc3NpYmxlJiZzdHJpbmdQYXlsb2FkLmxlbmd0aD5rZWVwU3RyaW5nc0xlc3NUaGFuKQpiYWNraW5nU3RvcmFnZT10aGlzLl9iYWNraW5nU3RvcmFnZS5hcHBlbmRBY2Nlc3NpYmxlU3RyaW5nKHN0cmluZ1BheWxvYWQpO2Vsc2UKdGhpcy5fYmFja2luZ1N0b3JhZ2UuYXBwZW5kU3RyaW5nKHN0cmluZ1BheWxvYWQpO2NvbnN0IHRpbWVzdGFtcD1wYXlsb2FkLnRzLzEwMDA7aWYodGltZXN0YW1wJiYoIXRoaXMuX21pbmltdW1SZWNvcmRUaW1lfHx0aW1lc3RhbXA8dGhpcy5fbWluaW11bVJlY29yZFRpbWUpJiYocGF5bG9hZC5waD09PXBoYXNlLkJlZ2lufHxwYXlsb2FkLnBoPT09cGhhc2UuQ29tcGxldGV8fHBheWxvYWQucGg9PT1waGFzZS5JbnN0YW50KSkKdGhpcy5fbWluaW11bVJlY29yZFRpbWU9dGltZXN0YW1wO2NvbnN0IGVuZFRpbWVTdGFtcD0ocGF5bG9hZC50cysocGF5bG9hZC5kdXJ8fDApKS8xMDAwO3RoaXMuX21heGltdW1SZWNvcmRUaW1lPU1hdGgubWF4KHRoaXMuX21heGltdW1SZWNvcmRUaW1lLGVuZFRpbWVTdGFtcCk7Y29uc3QgZXZlbnQ9cHJvY2Vzcy5fYWRkRXZlbnQocGF5bG9hZCk7aWYoIWV2ZW50KQpyZXR1cm47aWYocGF5bG9hZC5waD09PXBoYXNlLlNhbXBsZSl7dGhpcy5fYWRkU2FtcGxlRXZlbnQoZXZlbnQpO3JldHVybjt9CmlmKFNESy5UcmFjaW5nTW9kZWwuaXNBc3luY1BoYXNlKHBheWxvYWQucGgpKQp0aGlzLl9hc3luY0V2ZW50cy5wdXNoKGV2ZW50KTtldmVudC5fc2V0QmFja2luZ1N0b3JhZ2UoYmFja2luZ1N0b3JhZ2UpO2lmKGV2ZW50Lmhhc0NhdGVnb3J5KFNESy5UcmFjaW5nTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50Q2F0ZWdvcnkpKQp0aGlzLl9kZXZUb29sc01ldGFkYXRhRXZlbnRzLnB1c2goZXZlbnQpO2lmKHBheWxvYWQucGghPT1waGFzZS5NZXRhZGF0YSkKcmV0dXJuO3N3aXRjaChwYXlsb2FkLm5hbWUpe2Nhc2UgU0RLLlRyYWNpbmdNb2RlbC5NZXRhZGF0YUV2ZW50LlByb2Nlc3NTb3J0SW5kZXg6cHJvY2Vzcy5fc2V0U29ydEluZGV4KHBheWxvYWQuYXJnc1snc29ydF9pbmRleCddKTticmVhaztjYXNlIFNESy5UcmFjaW5nTW9kZWwuTWV0YWRhdGFFdmVudC5Qcm9jZXNzTmFtZTpjb25zdCBwcm9jZXNzTmFtZT1wYXlsb2FkLmFyZ3NbJ25hbWUnXTtwcm9jZXNzLl9zZXROYW1lKHByb2Nlc3NOYW1lKTt0aGlzLl9wcm9jZXNzQnlOYW1lLnNldChwcm9jZXNzTmFtZSxwcm9jZXNzKTticmVhaztjYXNlIFNESy5UcmFjaW5nTW9kZWwuTWV0YWRhdGFFdmVudC5UaHJlYWRTb3J0SW5kZXg6cHJvY2Vzcy50aHJlYWRCeUlkKHBheWxvYWQudGlkKS5fc2V0U29ydEluZGV4KHBheWxvYWQuYXJnc1snc29ydF9pbmRleCddKTticmVhaztjYXNlIFNESy5UcmFjaW5nTW9kZWwuTWV0YWRhdGFFdmVudC5UaHJlYWROYW1lOnByb2Nlc3MudGhyZWFkQnlJZChwYXlsb2FkLnRpZCkuX3NldE5hbWUocGF5bG9hZC5hcmdzWyduYW1lJ10pO2JyZWFrO319Cl9hZGRTYW1wbGVFdmVudChldmVudCl7Y29uc3QgaWQ9YCR7ZXZlbnQudGhyZWFkLnByb2Nlc3MoKS5pZCgpfToke2V2ZW50LmlkfWA7Y29uc3QgZ3JvdXA9dGhpcy5fcHJvZmlsZUdyb3Vwcy5nZXQoaWQpO2lmKGdyb3VwKQpncm91cC5fYWRkQ2hpbGQoZXZlbnQpO2Vsc2UKdGhpcy5fcHJvZmlsZUdyb3Vwcy5zZXQoaWQsbmV3IFNESy5UcmFjaW5nTW9kZWwuUHJvZmlsZUV2ZW50c0dyb3VwKGV2ZW50KSk7fQpwcm9maWxlR3JvdXAoZXZlbnQpe3JldHVybiB0aGlzLl9wcm9maWxlR3JvdXBzLmdldChgJHtldmVudC50aHJlYWQucHJvY2VzcygpLmlkKCl9OiR7ZXZlbnQuaWR9YCl8fG51bGw7fQptaW5pbXVtUmVjb3JkVGltZSgpe3JldHVybiB0aGlzLl9taW5pbXVtUmVjb3JkVGltZTt9Cm1heGltdW1SZWNvcmRUaW1lKCl7cmV0dXJuIHRoaXMuX21heGltdW1SZWNvcmRUaW1lO30Kc29ydGVkUHJvY2Vzc2VzKCl7cmV0dXJuIFNESy5UcmFjaW5nTW9kZWwuTmFtZWRPYmplY3QuX3NvcnQodGhpcy5fcHJvY2Vzc0J5SWQudmFsdWVzQXJyYXkoKSk7fQpwcm9jZXNzQnlOYW1lKG5hbWUpe3JldHVybiB0aGlzLl9wcm9jZXNzQnlOYW1lLmdldChuYW1lKTt9CnByb2Nlc3NCeUlkKHBpZCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3NCeUlkLmdldChwaWQpfHxudWxsO30KdGhyZWFkQnlOYW1lKHByb2Nlc3NOYW1lLHRocmVhZE5hbWUpe2NvbnN0IHByb2Nlc3M9dGhpcy5wcm9jZXNzQnlOYW1lKHByb2Nlc3NOYW1lKTtyZXR1cm4gcHJvY2VzcyYmcHJvY2Vzcy50aHJlYWRCeU5hbWUodGhyZWFkTmFtZSk7fQpfcHJvY2Vzc1BlbmRpbmdBc3luY0V2ZW50cygpe3RoaXMuX2FzeW5jRXZlbnRzLnN0YWJsZVNvcnQoU0RLLlRyYWNpbmdNb2RlbC5FdmVudC5jb21wYXJlU3RhcnRUaW1lKTtmb3IobGV0IGk9MDtpPHRoaXMuX2FzeW5jRXZlbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV2ZW50PXRoaXMuX2FzeW5jRXZlbnRzW2ldO2lmKFNESy5UcmFjaW5nTW9kZWwuaXNOZXN0YWJsZUFzeW5jUGhhc2UoZXZlbnQucGhhc2UpKQp0aGlzLl9hZGROZXN0YWJsZUFzeW5jRXZlbnQoZXZlbnQpO2Vsc2UKdGhpcy5fYWRkQXN5bmNFdmVudChldmVudCk7fQp0aGlzLl9hc3luY0V2ZW50cz1bXTt0aGlzLl9jbG9zZU9wZW5Bc3luY0V2ZW50cygpO30KX2Nsb3NlT3BlbkFzeW5jRXZlbnRzKCl7Zm9yKGNvbnN0IGV2ZW50IG9mIHRoaXMuX29wZW5Bc3luY0V2ZW50cy52YWx1ZXMoKSl7ZXZlbnQuc2V0RW5kVGltZSh0aGlzLl9tYXhpbXVtUmVjb3JkVGltZSk7ZXZlbnQuc3RlcHNbMF0uc2V0RW5kVGltZSh0aGlzLl9tYXhpbXVtUmVjb3JkVGltZSk7fQp0aGlzLl9vcGVuQXN5bmNFdmVudHMuY2xlYXIoKTtmb3IoY29uc3QgZXZlbnRTdGFjayBvZiB0aGlzLl9vcGVuTmVzdGFibGVBc3luY0V2ZW50cy52YWx1ZXMoKSl7d2hpbGUoZXZlbnRTdGFjay5sZW5ndGgpCmV2ZW50U3RhY2sucG9wKCkuc2V0RW5kVGltZSh0aGlzLl9tYXhpbXVtUmVjb3JkVGltZSk7fQp0aGlzLl9vcGVuTmVzdGFibGVBc3luY0V2ZW50cy5jbGVhcigpO30KX2FkZE5lc3RhYmxlQXN5bmNFdmVudChldmVudCl7Y29uc3QgcGhhc2U9U0RLLlRyYWNpbmdNb2RlbC5QaGFzZTtjb25zdCBrZXk9ZXZlbnQuY2F0ZWdvcmllc1N0cmluZysnLicrZXZlbnQuaWQ7bGV0IG9wZW5FdmVudHNTdGFjaz10aGlzLl9vcGVuTmVzdGFibGVBc3luY0V2ZW50cy5nZXQoa2V5KTtzd2l0Y2goZXZlbnQucGhhc2Upe2Nhc2UgcGhhc2UuTmVzdGFibGVBc3luY0JlZ2luOmlmKCFvcGVuRXZlbnRzU3RhY2spe29wZW5FdmVudHNTdGFjaz1bXTt0aGlzLl9vcGVuTmVzdGFibGVBc3luY0V2ZW50cy5zZXQoa2V5LG9wZW5FdmVudHNTdGFjayk7fQpjb25zdCBhc3luY0V2ZW50PW5ldyBTREsuVHJhY2luZ01vZGVsLkFzeW5jRXZlbnQoZXZlbnQpO29wZW5FdmVudHNTdGFjay5wdXNoKGFzeW5jRXZlbnQpO2V2ZW50LnRocmVhZC5fYWRkQXN5bmNFdmVudChhc3luY0V2ZW50KTticmVhaztjYXNlIHBoYXNlLk5lc3RhYmxlQXN5bmNJbnN0YW50OmlmKG9wZW5FdmVudHNTdGFjayYmb3BlbkV2ZW50c1N0YWNrLmxlbmd0aCkKb3BlbkV2ZW50c1N0YWNrLnBlZWtMYXN0KCkuX2FkZFN0ZXAoZXZlbnQpO2JyZWFrO2Nhc2UgcGhhc2UuTmVzdGFibGVBc3luY0VuZDppZighb3BlbkV2ZW50c1N0YWNrfHwhb3BlbkV2ZW50c1N0YWNrLmxlbmd0aCkKYnJlYWs7Y29uc3QgdG9wPW9wZW5FdmVudHNTdGFjay5wb3AoKTtpZih0b3AubmFtZSE9PWV2ZW50Lm5hbWUpe2NvbnNvbGUuZXJyb3IoYEJlZ2luL2VuZCBldmVudCBtaXNtYXRjaCBmb3IgbmVzdGFibGUgYXN5bmMgZXZlbnQsICR7dG9wLm5hbWV9IHZzLiAke2V2ZW50Lm5hbWV9LCBrZXk6ICR7a2V5fWApO2JyZWFrO30KdG9wLl9hZGRTdGVwKGV2ZW50KTt9fQpfYWRkQXN5bmNFdmVudChldmVudCl7Y29uc3QgcGhhc2U9U0RLLlRyYWNpbmdNb2RlbC5QaGFzZTtjb25zdCBrZXk9ZXZlbnQuY2F0ZWdvcmllc1N0cmluZysnLicrZXZlbnQubmFtZSsnLicrZXZlbnQuaWQ7bGV0IGFzeW5jRXZlbnQ9dGhpcy5fb3BlbkFzeW5jRXZlbnRzLmdldChrZXkpO2lmKGV2ZW50LnBoYXNlPT09cGhhc2UuQXN5bmNCZWdpbil7aWYoYXN5bmNFdmVudCl7Y29uc29sZS5lcnJvcihgRXZlbnQgJHtldmVudC5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWRgKTtyZXR1cm47fQphc3luY0V2ZW50PW5ldyBTREsuVHJhY2luZ01vZGVsLkFzeW5jRXZlbnQoZXZlbnQpO3RoaXMuX29wZW5Bc3luY0V2ZW50cy5zZXQoa2V5LGFzeW5jRXZlbnQpO2V2ZW50LnRocmVhZC5fYWRkQXN5bmNFdmVudChhc3luY0V2ZW50KTtyZXR1cm47fQppZighYXN5bmNFdmVudCl7cmV0dXJuO30KaWYoZXZlbnQucGhhc2U9PT1waGFzZS5Bc3luY0VuZCl7YXN5bmNFdmVudC5fYWRkU3RlcChldmVudCk7dGhpcy5fb3BlbkFzeW5jRXZlbnRzLmRlbGV0ZShrZXkpO3JldHVybjt9CmlmKGV2ZW50LnBoYXNlPT09cGhhc2UuQXN5bmNTdGVwSW50b3x8ZXZlbnQucGhhc2U9PT1waGFzZS5Bc3luY1N0ZXBQYXN0KXtjb25zdCBsYXN0U3RlcD1hc3luY0V2ZW50LnN0ZXBzLnBlZWtMYXN0KCk7aWYobGFzdFN0ZXAucGhhc2UhPT1waGFzZS5Bc3luY0JlZ2luJiZsYXN0U3RlcC5waGFzZSE9PWV2ZW50LnBoYXNlKXtjb25zb2xlLmFzc2VydChmYWxzZSwnQXN5bmMgZXZlbnQgc3RlcCBwaGFzZSBtaXNtYXRjaDogJytsYXN0U3RlcC5waGFzZSsnIGF0ICcrbGFzdFN0ZXAuc3RhcnRUaW1lKycgdnMuICcrCmV2ZW50LnBoYXNlKycgYXQgJytldmVudC5zdGFydFRpbWUpO3JldHVybjt9CmFzeW5jRXZlbnQuX2FkZFN0ZXAoZXZlbnQpO3JldHVybjt9CmNvbnNvbGUuYXNzZXJ0KGZhbHNlLCdJbnZhbGlkIGFzeW5jIGV2ZW50IHBoYXNlJyk7fQpiYWNraW5nU3RvcmFnZSgpe3JldHVybiB0aGlzLl9iYWNraW5nU3RvcmFnZTt9Cl9wYXJzZWRDYXRlZ29yaWVzRm9yU3RyaW5nKHN0cil7bGV0IHBhcnNlZENhdGVnb3JpZXM9dGhpcy5fcGFyc2VkQ2F0ZWdvcmllcy5nZXQoc3RyKTtpZighcGFyc2VkQ2F0ZWdvcmllcyl7cGFyc2VkQ2F0ZWdvcmllcz1uZXcgU2V0KHN0cj9zdHIuc3BsaXQoJywnKTpbXSk7dGhpcy5fcGFyc2VkQ2F0ZWdvcmllcy5zZXQoc3RyLHBhcnNlZENhdGVnb3JpZXMpO30KcmV0dXJuIHBhcnNlZENhdGVnb3JpZXM7fX07U0RLLlRyYWNpbmdNb2RlbC5QaGFzZT17QmVnaW46J0InLEVuZDonRScsQ29tcGxldGU6J1gnLEluc3RhbnQ6J0knLEFzeW5jQmVnaW46J1MnLEFzeW5jU3RlcEludG86J1QnLEFzeW5jU3RlcFBhc3Q6J3AnLEFzeW5jRW5kOidGJyxOZXN0YWJsZUFzeW5jQmVnaW46J2InLE5lc3RhYmxlQXN5bmNFbmQ6J2UnLE5lc3RhYmxlQXN5bmNJbnN0YW50OiduJyxGbG93QmVnaW46J3MnLEZsb3dTdGVwOid0JyxGbG93RW5kOidmJyxNZXRhZGF0YTonTScsQ291bnRlcjonQycsU2FtcGxlOidQJyxDcmVhdGVPYmplY3Q6J04nLFNuYXBzaG90T2JqZWN0OidPJyxEZWxldGVPYmplY3Q6J0QnfTtTREsuVHJhY2luZ01vZGVsLk1ldGFkYXRhRXZlbnQ9e1Byb2Nlc3NTb3J0SW5kZXg6J3Byb2Nlc3Nfc29ydF9pbmRleCcsUHJvY2Vzc05hbWU6J3Byb2Nlc3NfbmFtZScsVGhyZWFkU29ydEluZGV4Oid0aHJlYWRfc29ydF9pbmRleCcsVGhyZWFkTmFtZTondGhyZWFkX25hbWUnfTtTREsuVHJhY2luZ01vZGVsLlRvcExldmVsRXZlbnRDYXRlZ29yeT0ndG9wbGV2ZWwnO1NESy5UcmFjaW5nTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50Q2F0ZWdvcnk9J2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnO1NESy5UcmFjaW5nTW9kZWwuRGV2VG9vbHNUaW1lbGluZUV2ZW50Q2F0ZWdvcnk9J2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnO1NESy5UcmFjaW5nTW9kZWwuRnJhbWVMaWZlY3ljbGVFdmVudENhdGVnb3J5PSdjYyxkZXZ0b29scyc7U0RLLkJhY2tpbmdTdG9yYWdlPWZ1bmN0aW9uKCl7fTtTREsuQmFja2luZ1N0b3JhZ2UucHJvdG90eXBlPXthcHBlbmRTdHJpbmcoc3RyaW5nKXt9LGFwcGVuZEFjY2Vzc2libGVTdHJpbmcoc3RyaW5nKXt9LGZpbmlzaFdyaXRpbmcoKXt9LHJlc2V0KCl7fX07U0RLLlRyYWNpbmdNb2RlbC5FdmVudD1jbGFzc3tjb25zdHJ1Y3RvcihjYXRlZ29yaWVzLG5hbWUscGhhc2Usc3RhcnRUaW1lLHRocmVhZCl7dGhpcy5jYXRlZ29yaWVzU3RyaW5nPWNhdGVnb3JpZXN8fCcnO3RoaXMuX3BhcnNlZENhdGVnb3JpZXM9dGhyZWFkLl9tb2RlbC5fcGFyc2VkQ2F0ZWdvcmllc0ZvclN0cmluZyh0aGlzLmNhdGVnb3JpZXNTdHJpbmcpO3RoaXMubmFtZT1uYW1lO3RoaXMucGhhc2U9cGhhc2U7dGhpcy5zdGFydFRpbWU9c3RhcnRUaW1lO3RoaXMudGhyZWFkPXRocmVhZDt0aGlzLmFyZ3M9e307dGhpcy5zZWxmVGltZT0wO30Kc3RhdGljIGZyb21QYXlsb2FkKHBheWxvYWQsdGhyZWFkKXtjb25zdCBldmVudD1uZXcgU0RLLlRyYWNpbmdNb2RlbC5FdmVudChwYXlsb2FkLmNhdCxwYXlsb2FkLm5hbWUsKHBheWxvYWQucGgpLHBheWxvYWQudHMvMTAwMCx0aHJlYWQpO2lmKHBheWxvYWQuYXJncykKZXZlbnQuYWRkQXJncyhwYXlsb2FkLmFyZ3MpO2lmKHR5cGVvZiBwYXlsb2FkLmR1cj09PSdudW1iZXInKQpldmVudC5zZXRFbmRUaW1lKChwYXlsb2FkLnRzK3BheWxvYWQuZHVyKS8xMDAwKTtjb25zdCBpZD1TREsuVHJhY2luZ01vZGVsLl9leHRyYWN0SWQocGF5bG9hZCk7aWYodHlwZW9mIGlkIT09J3VuZGVmaW5lZCcpCmV2ZW50LmlkPWlkO2lmKHBheWxvYWQuYmluZF9pZCkKZXZlbnQuYmluZF9pZD1wYXlsb2FkLmJpbmRfaWQ7cmV0dXJuIGV2ZW50O30Kc3RhdGljIGNvbXBhcmVTdGFydFRpbWUoYSxiKXtyZXR1cm4gYS5zdGFydFRpbWUtYi5zdGFydFRpbWU7fQpzdGF0aWMgb3JkZXJlZENvbXBhcmVTdGFydFRpbWUoYSxiKXtyZXR1cm4gYS5zdGFydFRpbWUtYi5zdGFydFRpbWV8fGEub3JkaW5hbC1iLm9yZGluYWx8fC0xO30KaGFzQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKXtyZXR1cm4gdGhpcy5fcGFyc2VkQ2F0ZWdvcmllcy5oYXMoY2F0ZWdvcnlOYW1lKTt9CnNldEVuZFRpbWUoZW5kVGltZSl7aWYoZW5kVGltZTx0aGlzLnN0YXJ0VGltZSl7Y29uc29sZS5hc3NlcnQoZmFsc2UsJ0V2ZW50IG91dCBvZiBvcmRlcjogJyt0aGlzLm5hbWUpO3JldHVybjt9CnRoaXMuZW5kVGltZT1lbmRUaW1lO3RoaXMuZHVyYXRpb249ZW5kVGltZS10aGlzLnN0YXJ0VGltZTt9CmFkZEFyZ3MoYXJncyl7Zm9yKGNvbnN0IG5hbWUgaW4gYXJncyl7aWYobmFtZSBpbiB0aGlzLmFyZ3MpCmNvbnNvbGUuZXJyb3IoJ1NhbWUgYXJndW1lbnQgbmFtZSAoJytuYW1lKycpIGlzIHVzZWQgZm9yIGJlZ2luIGFuZCBlbmQgcGhhc2VzIG9mICcrdGhpcy5uYW1lKTt0aGlzLmFyZ3NbbmFtZV09YXJnc1tuYW1lXTt9fQpfY29tcGxldGUoZW5kRXZlbnQpe2lmKGVuZEV2ZW50LmFyZ3MpCnRoaXMuYWRkQXJncyhlbmRFdmVudC5hcmdzKTtlbHNlCmNvbnNvbGUuZXJyb3IoJ01pc3NpbmcgbWFuZGF0b3J5IGV2ZW50IGFyZ3VtZW50IFwnYXJnc1wnIGF0ICcrZW5kRXZlbnQuc3RhcnRUaW1lKTt0aGlzLnNldEVuZFRpbWUoZW5kRXZlbnQuc3RhcnRUaW1lKTt9Cl9zZXRCYWNraW5nU3RvcmFnZShiYWNraW5nU3RvcmFnZSl7fX07U0RLLlRyYWNpbmdNb2RlbC5PYmplY3RTbmFwc2hvdD1jbGFzcyBleHRlbmRzIFNESy5UcmFjaW5nTW9kZWwuRXZlbnR7Y29uc3RydWN0b3IoY2F0ZWdvcnksbmFtZSxzdGFydFRpbWUsdGhyZWFkKXtzdXBlcihjYXRlZ29yeSxuYW1lLFNESy5UcmFjaW5nTW9kZWwuUGhhc2UuU25hcHNob3RPYmplY3Qsc3RhcnRUaW1lLHRocmVhZCk7dGhpcy5fYmFja2luZ1N0b3JhZ2U9bnVsbDt0aGlzLmlkO3RoaXMuX29iamVjdFByb21pc2U9bnVsbDt9CnN0YXRpYyBmcm9tUGF5bG9hZChwYXlsb2FkLHRocmVhZCl7Y29uc3Qgc25hcHNob3Q9bmV3IFNESy5UcmFjaW5nTW9kZWwuT2JqZWN0U25hcHNob3QocGF5bG9hZC5jYXQscGF5bG9hZC5uYW1lLHBheWxvYWQudHMvMTAwMCx0aHJlYWQpO2NvbnN0IGlkPVNESy5UcmFjaW5nTW9kZWwuX2V4dHJhY3RJZChwYXlsb2FkKTtpZih0eXBlb2YgaWQhPT0ndW5kZWZpbmVkJykKc25hcHNob3QuaWQ9aWQ7aWYoIXBheWxvYWQuYXJnc3x8IXBheWxvYWQuYXJnc1snc25hcHNob3QnXSl7Y29uc29sZS5lcnJvcignTWlzc2luZyBtYW5kYXRvcnkgXCdzbmFwc2hvdFwnIGFyZ3VtZW50IGF0ICcrcGF5bG9hZC50cy8xMDAwKTtyZXR1cm4gc25hcHNob3Q7fQppZihwYXlsb2FkLmFyZ3MpCnNuYXBzaG90LmFkZEFyZ3MocGF5bG9hZC5hcmdzKTtyZXR1cm4gc25hcHNob3Q7fQpyZXF1ZXN0T2JqZWN0KGNhbGxiYWNrKXtjb25zdCBzbmFwc2hvdD10aGlzLmFyZ3NbJ3NuYXBzaG90J107aWYoc25hcHNob3Qpe2NhbGxiYWNrKHNuYXBzaG90KTtyZXR1cm47fQp0aGlzLl9iYWNraW5nU3RvcmFnZSgpLnRoZW4ob25SZWFkLGNhbGxiYWNrLmJpbmQobnVsbCxudWxsKSk7ZnVuY3Rpb24gb25SZWFkKHJlc3VsdCl7aWYoIXJlc3VsdCl7Y2FsbGJhY2sobnVsbCk7cmV0dXJuO30KdHJ5e2NvbnN0IHBheWxvYWQ9SlNPTi5wYXJzZShyZXN1bHQpO2NhbGxiYWNrKHBheWxvYWRbJ2FyZ3MnXVsnc25hcHNob3QnXSk7fWNhdGNoKGUpe0NvbW1vbi5jb25zb2xlLmVycm9yKCdNYWxmb3JtZWQgZXZlbnQgZGF0YSBpbiBiYWNraW5nIHN0b3JhZ2UnKTtjYWxsYmFjayhudWxsKTt9fX0Kb2JqZWN0UHJvbWlzZSgpe2lmKCF0aGlzLl9vYmplY3RQcm9taXNlKQp0aGlzLl9vYmplY3RQcm9taXNlPW5ldyBQcm9taXNlKHRoaXMucmVxdWVzdE9iamVjdC5iaW5kKHRoaXMpKTtyZXR1cm4gdGhpcy5fb2JqZWN0UHJvbWlzZTt9Cl9zZXRCYWNraW5nU3RvcmFnZShiYWNraW5nU3RvcmFnZSl7aWYoIWJhY2tpbmdTdG9yYWdlKQpyZXR1cm47dGhpcy5fYmFja2luZ1N0b3JhZ2U9YmFja2luZ1N0b3JhZ2U7dGhpcy5hcmdzPXt9O319O1NESy5UcmFjaW5nTW9kZWwuQXN5bmNFdmVudD1jbGFzcyBleHRlbmRzIFNESy5UcmFjaW5nTW9kZWwuRXZlbnR7Y29uc3RydWN0b3Ioc3RhcnRFdmVudCl7c3VwZXIoc3RhcnRFdmVudC5jYXRlZ29yaWVzU3RyaW5nLHN0YXJ0RXZlbnQubmFtZSxzdGFydEV2ZW50LnBoYXNlLHN0YXJ0RXZlbnQuc3RhcnRUaW1lLHN0YXJ0RXZlbnQudGhyZWFkKTt0aGlzLmFkZEFyZ3Moc3RhcnRFdmVudC5hcmdzKTt0aGlzLnN0ZXBzPVtzdGFydEV2ZW50XTt9Cl9hZGRTdGVwKGV2ZW50KXt0aGlzLnN0ZXBzLnB1c2goZXZlbnQpO2lmKGV2ZW50LnBoYXNlPT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5Bc3luY0VuZHx8ZXZlbnQucGhhc2U9PT1TREsuVHJhY2luZ01vZGVsLlBoYXNlLk5lc3RhYmxlQXN5bmNFbmQpe3RoaXMuc2V0RW5kVGltZShldmVudC5zdGFydFRpbWUpO3RoaXMuc3RlcHNbMF0uc2V0RW5kVGltZShldmVudC5zdGFydFRpbWUpO319fTtTREsuVHJhY2luZ01vZGVsLlByb2ZpbGVFdmVudHNHcm91cD1jbGFzc3tjb25zdHJ1Y3RvcihldmVudCl7dGhpcy5jaGlsZHJlbj1bZXZlbnRdO30KX2FkZENoaWxkKGV2ZW50KXt0aGlzLmNoaWxkcmVuLnB1c2goZXZlbnQpO319O1NESy5UcmFjaW5nTW9kZWwuTmFtZWRPYmplY3Q9Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwsaWQpe3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX2lkPWlkO3RoaXMuX25hbWU9Jyc7dGhpcy5fc29ydEluZGV4PTA7fQpzdGF0aWMgX3NvcnQoYXJyYXkpe2Z1bmN0aW9uIGNvbXBhcmF0b3IoYSxiKXtyZXR1cm4gYS5fc29ydEluZGV4IT09Yi5fc29ydEluZGV4P2EuX3NvcnRJbmRleC1iLl9zb3J0SW5kZXg6YS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7fQpyZXR1cm4gYXJyYXkuc29ydChjb21wYXJhdG9yKTt9Cl9zZXROYW1lKG5hbWUpe3RoaXMuX25hbWU9bmFtZTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9Cl9zZXRTb3J0SW5kZXgoc29ydEluZGV4KXt0aGlzLl9zb3J0SW5kZXg9c29ydEluZGV4O319O1NESy5UcmFjaW5nTW9kZWwuUHJvY2Vzcz1jbGFzcyBleHRlbmRzIFNESy5UcmFjaW5nTW9kZWwuTmFtZWRPYmplY3R7Y29uc3RydWN0b3IobW9kZWwsaWQpe3N1cGVyKG1vZGVsLGlkKTt0aGlzLl90aHJlYWRzPW5ldyBNYXAoKTt0aGlzLl90aHJlYWRCeU5hbWU9bmV3IE1hcCgpO30KaWQoKXtyZXR1cm4gdGhpcy5faWQ7fQp0aHJlYWRCeUlkKGlkKXtsZXQgdGhyZWFkPXRoaXMuX3RocmVhZHMuZ2V0KGlkKTtpZighdGhyZWFkKXt0aHJlYWQ9bmV3IFNESy5UcmFjaW5nTW9kZWwuVGhyZWFkKHRoaXMsaWQpO3RoaXMuX3RocmVhZHMuc2V0KGlkLHRocmVhZCk7fQpyZXR1cm4gdGhyZWFkO30KdGhyZWFkQnlOYW1lKG5hbWUpe3JldHVybiB0aGlzLl90aHJlYWRCeU5hbWUuZ2V0KG5hbWUpfHxudWxsO30KX3NldFRocmVhZEJ5TmFtZShuYW1lLHRocmVhZCl7dGhpcy5fdGhyZWFkQnlOYW1lLnNldChuYW1lLHRocmVhZCk7fQpfYWRkRXZlbnQocGF5bG9hZCl7cmV0dXJuIHRoaXMudGhyZWFkQnlJZChwYXlsb2FkLnRpZCkuX2FkZEV2ZW50KHBheWxvYWQpO30Kc29ydGVkVGhyZWFkcygpe3JldHVybiBTREsuVHJhY2luZ01vZGVsLk5hbWVkT2JqZWN0Ll9zb3J0KHRoaXMuX3RocmVhZHMudmFsdWVzQXJyYXkoKSk7fX07U0RLLlRyYWNpbmdNb2RlbC5UaHJlYWQ9Y2xhc3MgZXh0ZW5kcyBTREsuVHJhY2luZ01vZGVsLk5hbWVkT2JqZWN0e2NvbnN0cnVjdG9yKHByb2Nlc3MsaWQpe3N1cGVyKHByb2Nlc3MuX21vZGVsLGlkKTt0aGlzLl9wcm9jZXNzPXByb2Nlc3M7dGhpcy5fZXZlbnRzPVtdO3RoaXMuX2FzeW5jRXZlbnRzPVtdO3RoaXMuX2xhc3RUb3BMZXZlbEV2ZW50PW51bGw7fQp0cmFjaW5nQ29tcGxldGUoKXt0aGlzLl9hc3luY0V2ZW50cy5zdGFibGVTb3J0KFNESy5UcmFjaW5nTW9kZWwuRXZlbnQuY29tcGFyZVN0YXJ0VGltZSk7dGhpcy5fZXZlbnRzLnN0YWJsZVNvcnQoU0RLLlRyYWNpbmdNb2RlbC5FdmVudC5jb21wYXJlU3RhcnRUaW1lKTtjb25zdCBwaGFzZXM9U0RLLlRyYWNpbmdNb2RlbC5QaGFzZTtjb25zdCBzdGFjaz1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX2V2ZW50cy5sZW5ndGg7KytpKXtjb25zdCBlPXRoaXMuX2V2ZW50c1tpXTtlLm9yZGluYWw9aTtzd2l0Y2goZS5waGFzZSl7Y2FzZSBwaGFzZXMuRW5kOnRoaXMuX2V2ZW50c1tpXT1udWxsO2lmKCFzdGFjay5sZW5ndGgpCmNvbnRpbnVlO2NvbnN0IHRvcD1zdGFjay5wb3AoKTtpZih0b3AubmFtZSE9PWUubmFtZXx8dG9wLmNhdGVnb3JpZXNTdHJpbmchPT1lLmNhdGVnb3JpZXNTdHJpbmcpe2NvbnNvbGUuZXJyb3IoJ0IvRSBldmVudHMgbWlzbWF0Y2ggYXQgJyt0b3Auc3RhcnRUaW1lKycgKCcrdG9wLm5hbWUrJykgdnMuICcrZS5zdGFydFRpbWUrJyAoJytlLm5hbWUrJyknKTt9ZWxzZXt0b3AuX2NvbXBsZXRlKGUpO30KYnJlYWs7Y2FzZSBwaGFzZXMuQmVnaW46c3RhY2sucHVzaChlKTticmVhazt9fQp3aGlsZShzdGFjay5sZW5ndGgpCnN0YWNrLnBvcCgpLnNldEVuZFRpbWUodGhpcy5fbW9kZWwubWF4aW11bVJlY29yZFRpbWUoKSk7dGhpcy5fZXZlbnRzLnJlbW92ZShudWxsLGZhbHNlKTt9Cl9hZGRFdmVudChwYXlsb2FkKXtjb25zdCBldmVudD1wYXlsb2FkLnBoPT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5TbmFwc2hvdE9iamVjdD9TREsuVHJhY2luZ01vZGVsLk9iamVjdFNuYXBzaG90LmZyb21QYXlsb2FkKHBheWxvYWQsdGhpcyk6U0RLLlRyYWNpbmdNb2RlbC5FdmVudC5mcm9tUGF5bG9hZChwYXlsb2FkLHRoaXMpO2lmKFNESy5UcmFjaW5nTW9kZWwuaXNUb3BMZXZlbEV2ZW50KGV2ZW50KSl7aWYodGhpcy5fbGFzdFRvcExldmVsRXZlbnQmJnRoaXMuX2xhc3RUb3BMZXZlbEV2ZW50LmVuZFRpbWU+ZXZlbnQuc3RhcnRUaW1lKQpyZXR1cm4gbnVsbDt0aGlzLl9sYXN0VG9wTGV2ZWxFdmVudD1ldmVudDt9CnRoaXMuX2V2ZW50cy5wdXNoKGV2ZW50KTtyZXR1cm4gZXZlbnQ7fQpfYWRkQXN5bmNFdmVudChhc3luY0V2ZW50KXt0aGlzLl9hc3luY0V2ZW50cy5wdXNoKGFzeW5jRXZlbnQpO30KX3NldE5hbWUobmFtZSl7c3VwZXIuX3NldE5hbWUobmFtZSk7dGhpcy5fcHJvY2Vzcy5fc2V0VGhyZWFkQnlOYW1lKG5hbWUsdGhpcyk7fQppZCgpe3JldHVybiB0aGlzLl9pZDt9CnByb2Nlc3MoKXtyZXR1cm4gdGhpcy5fcHJvY2Vzczt9CmV2ZW50cygpe3JldHVybiB0aGlzLl9ldmVudHM7fQphc3luY0V2ZW50cygpe3JldHVybiB0aGlzLl9hc3luY0V2ZW50czt9fTs7U0RLLk92ZXJsYXlNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fZG9tTW9kZWw9KHRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpKTt0YXJnZXQucmVnaXN0ZXJPdmVybGF5RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9vdmVybGF5QWdlbnQ9dGFyZ2V0Lm92ZXJsYXlBZ2VudCgpO3RoaXMuX292ZXJsYXlBZ2VudC5lbmFibGUoKTt0aGlzLl9vdmVybGF5QWdlbnQuc2V0U2hvd1ZpZXdwb3J0U2l6ZU9uUmVzaXplKHRydWUpO3RoaXMuX2RlYnVnZ2VyTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5EZWJ1Z2dlck1vZGVsKTtpZih0aGlzLl9kZWJ1Z2dlck1vZGVsKXtDb21tb24ubW9kdWxlU2V0dGluZygnZGlzYWJsZVBhdXNlZFN0YXRlT3ZlcmxheScpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVBhdXNlZEluRGVidWdnZXJNZXNzYWdlLHRoaXMpO3RoaXMuX2RlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRGVidWdnZXJQYXVzZWQsdGhpcy5fdXBkYXRlUGF1c2VkSW5EZWJ1Z2dlck1lc3NhZ2UsdGhpcyk7dGhpcy5fZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclJlc3VtZWQsdGhpcy5fdXBkYXRlUGF1c2VkSW5EZWJ1Z2dlck1lc3NhZ2UsdGhpcyk7dGhpcy5fZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMuX3VwZGF0ZVBhdXNlZEluRGVidWdnZXJNZXNzYWdlLHRoaXMpO30KdGhpcy5faW5zcGVjdE1vZGVFbmFibGVkPWZhbHNlO3RoaXMuX2hpZGVIaWdobGlnaHRUaW1lb3V0PW51bGw7dGhpcy5fZGVmYXVsdEhpZ2hsaWdodGVyPW5ldyBTREsuT3ZlcmxheU1vZGVsLkRlZmF1bHRIaWdobGlnaHRlcih0aGlzKTt0aGlzLl9oaWdobGlnaHRlcj10aGlzLl9kZWZhdWx0SGlnaGxpZ2h0ZXI7dGhpcy5fc2hvd1BhaW50UmVjdHNTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93UGFpbnRSZWN0cycpO3RoaXMuX3Nob3dQYWludFJlY3RzU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+dGhpcy5fb3ZlcmxheUFnZW50LnNldFNob3dQYWludFJlY3RzKHRoaXMuX3Nob3dQYWludFJlY3RzU2V0dGluZy5nZXQoKSkpO2lmKHRoaXMuX3Nob3dQYWludFJlY3RzU2V0dGluZy5nZXQoKSkKdGhpcy5fb3ZlcmxheUFnZW50LnNldFNob3dQYWludFJlY3RzKHRydWUpO3RoaXMuX3Nob3dEZWJ1Z0JvcmRlcnNTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93RGVidWdCb3JkZXJzJyk7dGhpcy5fc2hvd0RlYnVnQm9yZGVyc1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIoKCk9PnRoaXMuX292ZXJsYXlBZ2VudC5zZXRTaG93RGVidWdCb3JkZXJzKHRoaXMuX3Nob3dEZWJ1Z0JvcmRlcnNTZXR0aW5nLmdldCgpKSk7aWYodGhpcy5fc2hvd0RlYnVnQm9yZGVyc1NldHRpbmcuZ2V0KCkpCnRoaXMuX292ZXJsYXlBZ2VudC5zZXRTaG93RGVidWdCb3JkZXJzKHRydWUpO3RoaXMuX3Nob3dGUFNDb3VudGVyU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnc2hvd0ZQU0NvdW50ZXInKTt0aGlzLl9zaG93RlBTQ291bnRlclNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIoKCk9PnRoaXMuX292ZXJsYXlBZ2VudC5zZXRTaG93RlBTQ291bnRlcih0aGlzLl9zaG93RlBTQ291bnRlclNldHRpbmcuZ2V0KCkpKTtpZih0aGlzLl9zaG93RlBTQ291bnRlclNldHRpbmcuZ2V0KCkpCnRoaXMuX292ZXJsYXlBZ2VudC5zZXRTaG93RlBTQ291bnRlcih0cnVlKTt0aGlzLl9zaG93U2Nyb2xsQm90dGxlbmVja1JlY3RzU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnc2hvd1Njcm9sbEJvdHRsZW5lY2tSZWN0cycpO3RoaXMuX3Nob3dTY3JvbGxCb3R0bGVuZWNrUmVjdHNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKCgpPT50aGlzLl9vdmVybGF5QWdlbnQuc2V0U2hvd1Njcm9sbEJvdHRsZW5lY2tSZWN0cyh0aGlzLl9zaG93U2Nyb2xsQm90dGxlbmVja1JlY3RzU2V0dGluZy5nZXQoKSkpO2lmKHRoaXMuX3Nob3dTY3JvbGxCb3R0bGVuZWNrUmVjdHNTZXR0aW5nLmdldCgpKQp0aGlzLl9vdmVybGF5QWdlbnQuc2V0U2hvd1Njcm9sbEJvdHRsZW5lY2tSZWN0cyh0cnVlKTtpZih0YXJnZXQuc3VzcGVuZGVkKCkpCnRoaXMuX292ZXJsYXlBZ2VudC5zZXRTdXNwZW5kZWQodHJ1ZSk7fQpzdGF0aWMgaGlnaGxpZ2h0T2JqZWN0QXNET01Ob2RlKG9iamVjdCl7Y29uc3QgZG9tTW9kZWw9b2JqZWN0LnJ1bnRpbWVNb2RlbCgpLnRhcmdldCgpLm1vZGVsKFNESy5ET01Nb2RlbCk7aWYoZG9tTW9kZWwpCmRvbU1vZGVsLm92ZXJsYXlNb2RlbCgpLmhpZ2hsaWdodERPTU5vZGUodW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsb2JqZWN0Lm9iamVjdElkKTt9CnN0YXRpYyBoaWRlRE9NTm9kZUhpZ2hsaWdodCgpe2Zvcihjb25zdCBvdmVybGF5TW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5PdmVybGF5TW9kZWwpKQpvdmVybGF5TW9kZWwuaGlnaGxpZ2h0RE9NTm9kZSgwKTt9CnN0YXRpYyBtdXRlSGlnaGxpZ2h0KCl7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO1NESy5PdmVybGF5TW9kZWwuX2hpZ2hsaWdodERpc2FibGVkPXRydWU7fQpzdGF0aWMgdW5tdXRlSGlnaGxpZ2h0KCl7U0RLLk92ZXJsYXlNb2RlbC5faGlnaGxpZ2h0RGlzYWJsZWQ9ZmFsc2U7fQpzdXNwZW5kTW9kZWwoKXtyZXR1cm4gdGhpcy5fb3ZlcmxheUFnZW50LnNldFN1c3BlbmRlZCh0cnVlKTt9CnJlc3VtZU1vZGVsKCl7cmV0dXJuIHRoaXMuX292ZXJsYXlBZ2VudC5zZXRTdXNwZW5kZWQoZmFsc2UpO30Kc2V0U2hvd1ZpZXdwb3J0U2l6ZU9uUmVzaXplKHNob3cpe3RoaXMuX292ZXJsYXlBZ2VudC5zZXRTaG93Vmlld3BvcnRTaXplT25SZXNpemUoc2hvdyk7fQpfdXBkYXRlUGF1c2VkSW5EZWJ1Z2dlck1lc3NhZ2UoKXtjb25zdCBtZXNzYWdlPXRoaXMuX2RlYnVnZ2VyTW9kZWwuaXNQYXVzZWQoKSYmIUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdkaXNhYmxlUGF1c2VkU3RhdGVPdmVybGF5JykuZ2V0KCk/Q29tbW9uLlVJU3RyaW5nKCdQYXVzZWQgaW4gZGVidWdnZXInKTp1bmRlZmluZWQ7dGhpcy5fb3ZlcmxheUFnZW50LnNldFBhdXNlZEluRGVidWdnZXJNZXNzYWdlKG1lc3NhZ2UpO30Kc2V0SGlnaGxpZ2h0ZXIoaGlnaGxpZ2h0ZXIpe3RoaXMuX2hpZ2hsaWdodGVyPWhpZ2hsaWdodGVyfHx0aGlzLl9kZWZhdWx0SGlnaGxpZ2h0ZXI7fQphc3luYyBzZXRJbnNwZWN0TW9kZShtb2RlKXthd2FpdCB0aGlzLl9kb21Nb2RlbC5yZXF1ZXN0RG9jdW1lbnQoKTt0aGlzLl9pbnNwZWN0TW9kZUVuYWJsZWQ9bW9kZSE9PVByb3RvY29sLk92ZXJsYXkuSW5zcGVjdE1vZGUuTm9uZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuT3ZlcmxheU1vZGVsLkV2ZW50cy5JbnNwZWN0TW9kZVdpbGxCZVRvZ2dsZWQsdGhpcyk7dGhpcy5faGlnaGxpZ2h0ZXIuc2V0SW5zcGVjdE1vZGUobW9kZSx0aGlzLl9idWlsZEhpZ2hsaWdodENvbmZpZygpKTt9Cmluc3BlY3RNb2RlRW5hYmxlZCgpe3JldHVybiB0aGlzLl9pbnNwZWN0TW9kZUVuYWJsZWQ7fQpoaWdobGlnaHRET01Ob2RlKG5vZGVJZCxtb2RlLGJhY2tlbmROb2RlSWQsb2JqZWN0SWQpe3RoaXMuaGlnaGxpZ2h0RE9NTm9kZVdpdGhDb25maWcobm9kZUlkLHttb2RlOm1vZGV9LGJhY2tlbmROb2RlSWQsb2JqZWN0SWQpO30KaGlnaGxpZ2h0RE9NTm9kZVdpdGhDb25maWcobm9kZUlkLGNvbmZpZyxiYWNrZW5kTm9kZUlkLG9iamVjdElkKXtpZihTREsuT3ZlcmxheU1vZGVsLl9oaWdobGlnaHREaXNhYmxlZCkKcmV0dXJuO2NvbmZpZz1jb25maWd8fHttb2RlOidhbGwnLHNob3dJbmZvOnVuZGVmaW5lZCxzZWxlY3RvcnM6dW5kZWZpbmVkfTtpZih0aGlzLl9oaWRlSGlnaGxpZ2h0VGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVIaWdobGlnaHRUaW1lb3V0KTt0aGlzLl9oaWRlSGlnaGxpZ2h0VGltZW91dD1udWxsO30KY29uc3QgaGlnaGxpZ2h0Q29uZmlnPXRoaXMuX2J1aWxkSGlnaGxpZ2h0Q29uZmlnKGNvbmZpZy5tb2RlKTtpZih0eXBlb2YgY29uZmlnLnNob3dJbmZvIT09J3VuZGVmaW5lZCcpCmhpZ2hsaWdodENvbmZpZy5zaG93SW5mbz1jb25maWcuc2hvd0luZm87aWYodHlwZW9mIGNvbmZpZy5zZWxlY3RvcnMhPT0ndW5kZWZpbmVkJykKaGlnaGxpZ2h0Q29uZmlnLnNlbGVjdG9yTGlzdD1jb25maWcuc2VsZWN0b3JzO3RoaXMuX2hpZ2hsaWdodGVyLmhpZ2hsaWdodERPTU5vZGUodGhpcy5fZG9tTW9kZWwubm9kZUZvcklkKG5vZGVJZHx8MCksaGlnaGxpZ2h0Q29uZmlnLGJhY2tlbmROb2RlSWQsb2JqZWN0SWQpO30KaGlnaGxpZ2h0RE9NTm9kZUZvclR3b1NlY29uZHMobm9kZUlkKXt0aGlzLmhpZ2hsaWdodERPTU5vZGUobm9kZUlkKTt0aGlzLl9oaWRlSGlnaGxpZ2h0VGltZW91dD1zZXRUaW1lb3V0KCgpPT50aGlzLmhpZ2hsaWdodERPTU5vZGUoMCksMjAwMCk7fQpoaWdobGlnaHRGcmFtZShmcmFtZUlkKXtpZihTREsuT3ZlcmxheU1vZGVsLl9oaWdobGlnaHREaXNhYmxlZCkKcmV0dXJuO3RoaXMuX2hpZ2hsaWdodGVyLmhpZ2hsaWdodEZyYW1lKGZyYW1lSWQpO30KX2J1aWxkSGlnaGxpZ2h0Q29uZmlnKG1vZGUpe21vZGU9bW9kZXx8J2FsbCc7Y29uc3Qgc2hvd1J1bGVycz1Db21tb24ubW9kdWxlU2V0dGluZygnc2hvd01ldHJpY3NSdWxlcnMnKS5nZXQoKTtjb25zdCBoaWdobGlnaHRDb25maWc9e3Nob3dJbmZvOm1vZGU9PT0nYWxsJyxzaG93UnVsZXJzOnNob3dSdWxlcnMsc2hvd0V4dGVuc2lvbkxpbmVzOnNob3dSdWxlcnN9O2lmKG1vZGU9PT0nYWxsJ3x8bW9kZT09PSdjb250ZW50JykKaGlnaGxpZ2h0Q29uZmlnLmNvbnRlbnRDb2xvcj1Db21tb24uQ29sb3IuUGFnZUhpZ2hsaWdodC5Db250ZW50LnRvUHJvdG9jb2xSR0JBKCk7aWYobW9kZT09PSdhbGwnfHxtb2RlPT09J3BhZGRpbmcnKQpoaWdobGlnaHRDb25maWcucGFkZGluZ0NvbG9yPUNvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0LlBhZGRpbmcudG9Qcm90b2NvbFJHQkEoKTtpZihtb2RlPT09J2FsbCd8fG1vZGU9PT0nYm9yZGVyJykKaGlnaGxpZ2h0Q29uZmlnLmJvcmRlckNvbG9yPUNvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0LkJvcmRlci50b1Byb3RvY29sUkdCQSgpO2lmKG1vZGU9PT0nYWxsJ3x8bW9kZT09PSdtYXJnaW4nKQpoaWdobGlnaHRDb25maWcubWFyZ2luQ29sb3I9Q29tbW9uLkNvbG9yLlBhZ2VIaWdobGlnaHQuTWFyZ2luLnRvUHJvdG9jb2xSR0JBKCk7aWYobW9kZT09PSdhbGwnKXtoaWdobGlnaHRDb25maWcuZXZlbnRUYXJnZXRDb2xvcj1Db21tb24uQ29sb3IuUGFnZUhpZ2hsaWdodC5FdmVudFRhcmdldC50b1Byb3RvY29sUkdCQSgpO2hpZ2hsaWdodENvbmZpZy5zaGFwZUNvbG9yPUNvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0LlNoYXBlLnRvUHJvdG9jb2xSR0JBKCk7aGlnaGxpZ2h0Q29uZmlnLnNoYXBlTWFyZ2luQ29sb3I9Q29tbW9uLkNvbG9yLlBhZ2VIaWdobGlnaHQuU2hhcGVNYXJnaW4udG9Qcm90b2NvbFJHQkEoKTtoaWdobGlnaHRDb25maWcuZGlzcGxheUFzTWF0ZXJpYWw9dHJ1ZTt9CmlmKG1vZGU9PT0nYWxsJykKaGlnaGxpZ2h0Q29uZmlnLmNzc0dyaWRDb2xvcj1Db21tb24uQ29sb3IuUGFnZUhpZ2hsaWdodC5Dc3NHcmlkLnRvUHJvdG9jb2xSR0JBKCk7cmV0dXJuIGhpZ2hsaWdodENvbmZpZzt9Cm5vZGVIaWdobGlnaHRSZXF1ZXN0ZWQobm9kZUlkKXtjb25zdCBub2RlPXRoaXMuX2RvbU1vZGVsLm5vZGVGb3JJZChub2RlSWQpO2lmKG5vZGUpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5PdmVybGF5TW9kZWwuRXZlbnRzLkhpZ2hsaWdodE5vZGVSZXF1ZXN0ZWQsbm9kZSk7fQppbnNwZWN0Tm9kZVJlcXVlc3RlZChiYWNrZW5kTm9kZUlkKXtjb25zdCBkZWZlcnJlZE5vZGU9bmV3IFNESy5EZWZlcnJlZERPTU5vZGUodGhpcy50YXJnZXQoKSxiYWNrZW5kTm9kZUlkKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuT3ZlcmxheU1vZGVsLkV2ZW50cy5JbnNwZWN0Tm9kZVJlcXVlc3RlZCxkZWZlcnJlZE5vZGUpO30Kc2NyZWVuc2hvdFJlcXVlc3RlZCh2aWV3cG9ydCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk92ZXJsYXlNb2RlbC5FdmVudHMuU2NyZWVuc2hvdFJlcXVlc3RlZCx2aWV3cG9ydCk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5PdmVybGF5TW9kZWwsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkRPTSx0cnVlKTtTREsuT3ZlcmxheU1vZGVsLkV2ZW50cz17SW5zcGVjdE1vZGVXaWxsQmVUb2dnbGVkOlN5bWJvbCgnSW5zcGVjdE1vZGVXaWxsQmVUb2dnbGVkJyksSGlnaGxpZ2h0Tm9kZVJlcXVlc3RlZDpTeW1ib2woJ0hpZ2hsaWdodE5vZGVSZXF1ZXN0ZWQnKSxJbnNwZWN0Tm9kZVJlcXVlc3RlZDpTeW1ib2woJ0luc3BlY3ROb2RlUmVxdWVzdGVkJyksU2NyZWVuc2hvdFJlcXVlc3RlZDpTeW1ib2woJ1NjcmVlbnNob3RSZXF1ZXN0ZWQnKSx9O1NESy5PdmVybGF5TW9kZWwuSGlnaGxpZ2h0ZXI9ZnVuY3Rpb24oKXt9O1NESy5PdmVybGF5TW9kZWwuSGlnaGxpZ2h0ZXIucHJvdG90eXBlPXtoaWdobGlnaHRET01Ob2RlKG5vZGUsY29uZmlnLGJhY2tlbmROb2RlSWQsb2JqZWN0SWQpe30sc2V0SW5zcGVjdE1vZGUobW9kZSxjb25maWcpe30saGlnaGxpZ2h0RnJhbWUoZnJhbWVJZCl7fX07U0RLLk92ZXJsYXlNb2RlbC5EZWZhdWx0SGlnaGxpZ2h0ZXI9Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwpe3RoaXMuX21vZGVsPW1vZGVsO30KaGlnaGxpZ2h0RE9NTm9kZShub2RlLGNvbmZpZyxiYWNrZW5kTm9kZUlkLG9iamVjdElkKXtpZihvYmplY3RJZHx8bm9kZXx8YmFja2VuZE5vZGVJZCl7dGhpcy5fbW9kZWwuX292ZXJsYXlBZ2VudC5oaWdobGlnaHROb2RlKGNvbmZpZywob2JqZWN0SWR8fGJhY2tlbmROb2RlSWQpP3VuZGVmaW5lZDpub2RlLmlkLGJhY2tlbmROb2RlSWQsb2JqZWN0SWQpO31lbHNle3RoaXMuX21vZGVsLl9vdmVybGF5QWdlbnQuaGlkZUhpZ2hsaWdodCgpO319CnNldEluc3BlY3RNb2RlKG1vZGUsY29uZmlnKXtyZXR1cm4gdGhpcy5fbW9kZWwuX292ZXJsYXlBZ2VudC5zZXRJbnNwZWN0TW9kZShtb2RlLGNvbmZpZyk7fQpoaWdobGlnaHRGcmFtZShmcmFtZUlkKXt0aGlzLl9tb2RlbC5fb3ZlcmxheUFnZW50LmhpZ2hsaWdodEZyYW1lKGZyYW1lSWQsQ29tbW9uLkNvbG9yLlBhZ2VIaWdobGlnaHQuQ29udGVudC50b1Byb3RvY29sUkdCQSgpLENvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0LkNvbnRlbnRPdXRsaW5lLnRvUHJvdG9jb2xSR0JBKCkpO319OztTREsuUnVudGltZU1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9hZ2VudD10YXJnZXQucnVudGltZUFnZW50KCk7dGhpcy50YXJnZXQoKS5yZWdpc3RlclJ1bnRpbWVEaXNwYXRjaGVyKG5ldyBTREsuUnVudGltZURpc3BhdGNoZXIodGhpcykpO3RoaXMuX2FnZW50LmVuYWJsZSgpO3RoaXMuX2V4ZWN1dGlvbkNvbnRleHRCeUlkPW5ldyBNYXAoKTt0aGlzLl9leGVjdXRpb25Db250ZXh0Q29tcGFyYXRvcj1TREsuRXhlY3V0aW9uQ29udGV4dC5jb21wYXJhdG9yO3RoaXMuX2hhc1NpZGVFZmZlY3RTdXBwb3J0PW51bGw7aWYoQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2N1c3RvbUZvcm1hdHRlcnMnKS5nZXQoKSkKdGhpcy5fYWdlbnQuc2V0Q3VzdG9tT2JqZWN0Rm9ybWF0dGVyRW5hYmxlZCh0cnVlKTtDb21tb24ubW9kdWxlU2V0dGluZygnY3VzdG9tRm9ybWF0dGVycycpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2N1c3RvbUZvcm1hdHRlcnNTdGF0ZUNoYW5nZWQuYmluZCh0aGlzKSk7fQpzdGF0aWMgd3JhcE9iamVjdExpdGVyYWxFeHByZXNzaW9uSWZOZWVkZWQoY29kZSl7aWYoISgvXlxzKlx7Ly50ZXN0KGNvZGUpJiYvXH1ccyokLy50ZXN0KGNvZGUpKSkKcmV0dXJuIGNvZGU7Y29uc3QgcGFyc2U9KGFzeW5jKCk9PjApLmNvbnN0cnVjdG9yO3RyeXtwYXJzZSgncmV0dXJuICcrY29kZSsnOycpO2NvbnN0IHdyYXBwZWRDb2RlPScoJytjb2RlKycpJztwYXJzZSh3cmFwcGVkQ29kZSk7cmV0dXJuIHdyYXBwZWRDb2RlO31jYXRjaChlKXtyZXR1cm4gY29kZTt9fQpkZWJ1Z2dlck1vZGVsKCl7cmV0dXJuKHRoaXMudGFyZ2V0KCkubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpKTt9CmhlYXBQcm9maWxlck1vZGVsKCl7cmV0dXJuKHRoaXMudGFyZ2V0KCkubW9kZWwoU0RLLkhlYXBQcm9maWxlck1vZGVsKSk7fQpleGVjdXRpb25Db250ZXh0cygpe3JldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0QnlJZC52YWx1ZXNBcnJheSgpLnNvcnQodGhpcy5leGVjdXRpb25Db250ZXh0Q29tcGFyYXRvcigpKTt9CnNldEV4ZWN1dGlvbkNvbnRleHRDb21wYXJhdG9yKGNvbXBhcmF0b3Ipe3RoaXMuX2V4ZWN1dGlvbkNvbnRleHRDb21wYXJhdG9yPWNvbXBhcmF0b3I7fQpleGVjdXRpb25Db250ZXh0Q29tcGFyYXRvcigpe3JldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0Q29tcGFyYXRvcjt9CmRlZmF1bHRFeGVjdXRpb25Db250ZXh0KCl7Zm9yKGNvbnN0IGNvbnRleHQgb2YgdGhpcy5leGVjdXRpb25Db250ZXh0cygpKXtpZihjb250ZXh0LmlzRGVmYXVsdCkKcmV0dXJuIGNvbnRleHQ7fQpyZXR1cm4gbnVsbDt9CmV4ZWN1dGlvbkNvbnRleHQoaWQpe3JldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0QnlJZC5nZXQoaWQpfHxudWxsO30KX2V4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHQpe2NvbnN0IGRhdGE9Y29udGV4dC5hdXhEYXRhfHx7aXNEZWZhdWx0OnRydWV9O2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9bmV3IFNESy5FeGVjdXRpb25Db250ZXh0KHRoaXMsY29udGV4dC5pZCxjb250ZXh0Lm5hbWUsY29udGV4dC5vcmlnaW4sZGF0YVsnaXNEZWZhdWx0J10sZGF0YVsnZnJhbWVJZCddKTt0aGlzLl9leGVjdXRpb25Db250ZXh0QnlJZC5zZXQoZXhlY3V0aW9uQ29udGV4dC5pZCxleGVjdXRpb25Db250ZXh0KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q3JlYXRlZCxleGVjdXRpb25Db250ZXh0KTt9Cl9leGVjdXRpb25Db250ZXh0RGVzdHJveWVkKGV4ZWN1dGlvbkNvbnRleHRJZCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD10aGlzLl9leGVjdXRpb25Db250ZXh0QnlJZC5nZXQoZXhlY3V0aW9uQ29udGV4dElkKTtpZighZXhlY3V0aW9uQ29udGV4dCkKcmV0dXJuO3RoaXMuZGVidWdnZXJNb2RlbCgpLmV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQoZXhlY3V0aW9uQ29udGV4dCk7dGhpcy5fZXhlY3V0aW9uQ29udGV4dEJ5SWQuZGVsZXRlKGV4ZWN1dGlvbkNvbnRleHRJZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZCxleGVjdXRpb25Db250ZXh0KTt9CmZpcmVFeGVjdXRpb25Db250ZXh0T3JkZXJDaGFuZ2VkKCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhlY3V0aW9uQ29udGV4dE9yZGVyQ2hhbmdlZCx0aGlzKTt9Cl9leGVjdXRpb25Db250ZXh0c0NsZWFyZWQoKXt0aGlzLmRlYnVnZ2VyTW9kZWwoKS5nbG9iYWxPYmplY3RDbGVhcmVkKCk7Y29uc3QgY29udGV4dHM9dGhpcy5leGVjdXRpb25Db250ZXh0cygpO3RoaXMuX2V4ZWN1dGlvbkNvbnRleHRCeUlkLmNsZWFyKCk7Zm9yKGxldCBpPTA7aTxjb250ZXh0cy5sZW5ndGg7KytpKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0RGVzdHJveWVkLGNvbnRleHRzW2ldKTt9CmNyZWF0ZVJlbW90ZU9iamVjdChwYXlsb2FkKXtjb25zb2xlLmFzc2VydCh0eXBlb2YgcGF5bG9hZD09PSdvYmplY3QnLCdSZW1vdGUgb2JqZWN0IHBheWxvYWQgc2hvdWxkIG9ubHkgYmUgYW4gb2JqZWN0Jyk7cmV0dXJuIG5ldyBTREsuUmVtb3RlT2JqZWN0SW1wbCh0aGlzLHBheWxvYWQub2JqZWN0SWQscGF5bG9hZC50eXBlLHBheWxvYWQuc3VidHlwZSxwYXlsb2FkLnZhbHVlLHBheWxvYWQudW5zZXJpYWxpemFibGVWYWx1ZSxwYXlsb2FkLmRlc2NyaXB0aW9uLHBheWxvYWQucHJldmlldyxwYXlsb2FkLmN1c3RvbVByZXZpZXcscGF5bG9hZC5jbGFzc05hbWUpO30KY3JlYXRlU2NvcGVSZW1vdGVPYmplY3QocGF5bG9hZCxzY29wZVJlZil7cmV0dXJuIG5ldyBTREsuU2NvcGVSZW1vdGVPYmplY3QodGhpcyxwYXlsb2FkLm9iamVjdElkLHNjb3BlUmVmLHBheWxvYWQudHlwZSxwYXlsb2FkLnN1YnR5cGUscGF5bG9hZC52YWx1ZSxwYXlsb2FkLnVuc2VyaWFsaXphYmxlVmFsdWUscGF5bG9hZC5kZXNjcmlwdGlvbixwYXlsb2FkLnByZXZpZXcpO30KY3JlYXRlUmVtb3RlT2JqZWN0RnJvbVByaW1pdGl2ZVZhbHVlKHZhbHVlKXtjb25zdCB0eXBlPXR5cGVvZiB2YWx1ZTtsZXQgdW5zZXJpYWxpemFibGVWYWx1ZT11bmRlZmluZWQ7Y29uc3QgdW5zZXJpYWxpemFibGVEZXNjcmlwdGlvbj1TREsuUmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb24odmFsdWUpO2lmKHVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb24hPT1udWxsKQp1bnNlcmlhbGl6YWJsZVZhbHVlPSh1bnNlcmlhbGl6YWJsZURlc2NyaXB0aW9uKTtpZih0eXBlb2YgdW5zZXJpYWxpemFibGVWYWx1ZSE9PSd1bmRlZmluZWQnKQp2YWx1ZT11bmRlZmluZWQ7cmV0dXJuIG5ldyBTREsuUmVtb3RlT2JqZWN0SW1wbCh0aGlzLHVuZGVmaW5lZCx0eXBlLHVuZGVmaW5lZCx2YWx1ZSx1bnNlcmlhbGl6YWJsZVZhbHVlKTt9CmNyZWF0ZVJlbW90ZVByb3BlcnR5RnJvbVByaW1pdGl2ZVZhbHVlKG5hbWUsdmFsdWUpe3JldHVybiBuZXcgU0RLLlJlbW90ZU9iamVjdFByb3BlcnR5KG5hbWUsdGhpcy5jcmVhdGVSZW1vdGVPYmplY3RGcm9tUHJpbWl0aXZlVmFsdWUodmFsdWUpKTt9CmRpc2NhcmRDb25zb2xlRW50cmllcygpe3RoaXMuX2FnZW50LmRpc2NhcmRDb25zb2xlRW50cmllcygpO30KcmVsZWFzZU9iamVjdEdyb3VwKG9iamVjdEdyb3VwTmFtZSl7dGhpcy5fYWdlbnQucmVsZWFzZU9iamVjdEdyb3VwKG9iamVjdEdyb3VwTmFtZSk7fQpydW5JZldhaXRpbmdGb3JEZWJ1Z2dlcigpe3RoaXMuX2FnZW50LnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyKCk7fQpfY3VzdG9tRm9ybWF0dGVyc1N0YXRlQ2hhbmdlZChldmVudCl7Y29uc3QgZW5hYmxlZD0oZXZlbnQuZGF0YSk7dGhpcy5fYWdlbnQuc2V0Q3VzdG9tT2JqZWN0Rm9ybWF0dGVyRW5hYmxlZChlbmFibGVkKTt9CmFzeW5jIGNvbXBpbGVTY3JpcHQoZXhwcmVzc2lvbixzb3VyY2VVUkwscGVyc2lzdFNjcmlwdCxleGVjdXRpb25Db250ZXh0SWQpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9jb21waWxlU2NyaXB0KHtleHByZXNzaW9uOmV4cHJlc3Npb24sc291cmNlVVJMOnNvdXJjZVVSTCxwZXJzaXN0U2NyaXB0OnBlcnNpc3RTY3JpcHQsZXhlY3V0aW9uQ29udGV4dElkOmV4ZWN1dGlvbkNvbnRleHRJZH0pO2lmKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSl7Y29uc29sZS5lcnJvcihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pO3JldHVybiBudWxsO30KcmV0dXJue3NjcmlwdElkOnJlc3BvbnNlLnNjcmlwdElkLGV4Y2VwdGlvbkRldGFpbHM6cmVzcG9uc2UuZXhjZXB0aW9uRGV0YWlsc307fQphc3luYyBydW5TY3JpcHQoc2NyaXB0SWQsZXhlY3V0aW9uQ29udGV4dElkLG9iamVjdEdyb3VwLHNpbGVudCxpbmNsdWRlQ29tbWFuZExpbmVBUEkscmV0dXJuQnlWYWx1ZSxnZW5lcmF0ZVByZXZpZXcsYXdhaXRQcm9taXNlKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9hZ2VudC5pbnZva2VfcnVuU2NyaXB0KHtzY3JpcHRJZCxleGVjdXRpb25Db250ZXh0SWQsb2JqZWN0R3JvdXAsc2lsZW50LGluY2x1ZGVDb21tYW5kTGluZUFQSSxyZXR1cm5CeVZhbHVlLGdlbmVyYXRlUHJldmlldyxhd2FpdFByb21pc2V9KTtjb25zdCBlcnJvcj1yZXNwb25zZVtQcm90b2NvbC5FcnJvcl07aWYoZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybntlcnJvcjplcnJvcn07fQpyZXR1cm57b2JqZWN0OnRoaXMuY3JlYXRlUmVtb3RlT2JqZWN0KHJlc3BvbnNlLnJlc3VsdCksZXhjZXB0aW9uRGV0YWlsczpyZXNwb25zZS5leGNlcHRpb25EZXRhaWxzfTt9CmFzeW5jIHF1ZXJ5T2JqZWN0cyhwcm90b3R5cGUpe2lmKCFwcm90b3R5cGUub2JqZWN0SWQpCnJldHVybntlcnJvcjonUHJvdG90eXBlIHNob3VsZCBiZSBhbiBPYmplY3QuJ307Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX3F1ZXJ5T2JqZWN0cyh7cHJvdG90eXBlT2JqZWN0SWQ6KHByb3RvdHlwZS5vYmplY3RJZCksb2JqZWN0R3JvdXA6J2NvbnNvbGUnfSk7Y29uc3QgZXJyb3I9cmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdO2lmKGVycm9yKXtjb25zb2xlLmVycm9yKGVycm9yKTtyZXR1cm57ZXJyb3I6ZXJyb3J9O30KcmV0dXJue29iamVjdHM6dGhpcy5jcmVhdGVSZW1vdGVPYmplY3QocmVzcG9uc2Uub2JqZWN0cyl9O30KYXN5bmMgaXNvbGF0ZUlkKCl7cmV0dXJuKGF3YWl0IHRoaXMuX2FnZW50LmdldElzb2xhdGVJZCgpKXx8dGhpcy50YXJnZXQoKS5pZCgpO30KYXN5bmMgaGVhcFVzYWdlKCl7Y29uc3QgcmVzdWx0PWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9nZXRIZWFwVXNhZ2Uoe30pO3JldHVybiByZXN1bHRbUHJvdG9jb2wuRXJyb3JdP251bGw6cmVzdWx0O30KX2luc3BlY3RSZXF1ZXN0ZWQocGF5bG9hZCxoaW50cyl7Y29uc3Qgb2JqZWN0PXRoaXMuY3JlYXRlUmVtb3RlT2JqZWN0KHBheWxvYWQpO2lmKGhpbnRzLmNvcHlUb0NsaXBib2FyZCl7dGhpcy5fY29weVJlcXVlc3RlZChvYmplY3QpO3JldHVybjt9CmlmKGhpbnRzLnF1ZXJ5T2JqZWN0cyl7dGhpcy5fcXVlcnlPYmplY3RzUmVxdWVzdGVkKG9iamVjdCk7cmV0dXJuO30KaWYob2JqZWN0LmlzTm9kZSgpKXtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKG9iamVjdCkudGhlbihvYmplY3QucmVsZWFzZS5iaW5kKG9iamVjdCkpO3JldHVybjt9CmlmKG9iamVjdC50eXBlPT09J2Z1bmN0aW9uJyl7U0RLLlJlbW90ZUZ1bmN0aW9uLm9iamVjdEFzRnVuY3Rpb24ob2JqZWN0KS50YXJnZXRGdW5jdGlvbkRldGFpbHMoKS50aGVuKGRpZEdldERldGFpbHMpO3JldHVybjt9CmZ1bmN0aW9uIGRpZEdldERldGFpbHMocmVzcG9uc2Upe29iamVjdC5yZWxlYXNlKCk7aWYoIXJlc3BvbnNlfHwhcmVzcG9uc2UubG9jYXRpb24pCnJldHVybjtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHJlc3BvbnNlLmxvY2F0aW9uKTt9Cm9iamVjdC5yZWxlYXNlKCk7fQpfY29weVJlcXVlc3RlZChvYmplY3Qpe2lmKCFvYmplY3Qub2JqZWN0SWQpe0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChvYmplY3QudW5zZXJpYWxpemFibGVWYWx1ZSgpfHxvYmplY3QudmFsdWUpO3JldHVybjt9Cm9iamVjdC5jYWxsRnVuY3Rpb25KU09OKHRvU3RyaW5nRm9yQ2xpcGJvYXJkLFt7dmFsdWU6b2JqZWN0LnN1YnR5cGV9XSxJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQuYmluZChJbnNwZWN0b3JGcm9udGVuZEhvc3QpKTtmdW5jdGlvbiB0b1N0cmluZ0ZvckNsaXBib2FyZChzdWJ0eXBlKXtpZihzdWJ0eXBlPT09J25vZGUnKQpyZXR1cm4gdGhpcy5vdXRlckhUTUw7aWYoc3VidHlwZSYmdHlwZW9mIHRoaXM9PT0ndW5kZWZpbmVkJykKcmV0dXJuIHN1YnR5cGUrJyc7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLG51bGwsJyAgJyk7fWNhdGNoKGUpe3JldHVybicnK3RoaXM7fX19CmFzeW5jIF9xdWVyeU9iamVjdHNSZXF1ZXN0ZWQob2JqZWN0KXtjb25zdCByZXN1bHQ9YXdhaXQgdGhpcy5xdWVyeU9iamVjdHMob2JqZWN0KTtvYmplY3QucmVsZWFzZSgpO2lmKHJlc3VsdC5lcnJvcil7Q29tbW9uLmNvbnNvbGUuZXJyb3IocmVzdWx0LmVycm9yKTtyZXR1cm47fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUnVudGltZU1vZGVsLkV2ZW50cy5RdWVyeU9iamVjdFJlcXVlc3RlZCx7b2JqZWN0czpyZXN1bHQub2JqZWN0c30pO30Kc3RhdGljIHNpbXBsZVRleHRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbkRldGFpbHMpe2xldCB0ZXh0PWV4Y2VwdGlvbkRldGFpbHMudGV4dDtpZihleGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbiYmZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24uZGVzY3JpcHRpb24pe2xldCBkZXNjcmlwdGlvbj1leGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbi5kZXNjcmlwdGlvbjtpZihkZXNjcmlwdGlvbi5pbmRleE9mKCdcbicpIT09LTEpCmRlc2NyaXB0aW9uPWRlc2NyaXB0aW9uLnN1YnN0cmluZygwLGRlc2NyaXB0aW9uLmluZGV4T2YoJ1xuJykpO3RleHQrPScgJytkZXNjcmlwdGlvbjt9CnJldHVybiB0ZXh0O30KZXhjZXB0aW9uVGhyb3duKHRpbWVzdGFtcCxleGNlcHRpb25EZXRhaWxzKXtjb25zdCBleGNlcHRpb25XaXRoVGltZXN0YW1wPXt0aW1lc3RhbXA6dGltZXN0YW1wLGRldGFpbHM6ZXhjZXB0aW9uRGV0YWlsc307dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhjZXB0aW9uVGhyb3duLGV4Y2VwdGlvbldpdGhUaW1lc3RhbXApO30KX2V4Y2VwdGlvblJldm9rZWQoZXhjZXB0aW9uSWQpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5SdW50aW1lTW9kZWwuRXZlbnRzLkV4Y2VwdGlvblJldm9rZWQsZXhjZXB0aW9uSWQpO30KX2NvbnNvbGVBUElDYWxsZWQodHlwZSxhcmdzLGV4ZWN1dGlvbkNvbnRleHRJZCx0aW1lc3RhbXAsc3RhY2tUcmFjZSxjb250ZXh0KXtjb25zdCBjb25zb2xlQVBJQ2FsbD17dHlwZTp0eXBlLGFyZ3M6YXJncyxleGVjdXRpb25Db250ZXh0SWQ6ZXhlY3V0aW9uQ29udGV4dElkLHRpbWVzdGFtcDp0aW1lc3RhbXAsc3RhY2tUcmFjZTpzdGFja1RyYWNlLGNvbnRleHQ6Y29udGV4dH07dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuQ29uc29sZUFQSUNhbGxlZCxjb25zb2xlQVBJQ2FsbCk7fQpleGVjdXRpb25Db250ZXh0SWRGb3JTY3JpcHRJZChzY3JpcHRJZCl7Y29uc3Qgc2NyaXB0PXRoaXMuZGVidWdnZXJNb2RlbCgpLnNjcmlwdEZvcklkKHNjcmlwdElkKTtyZXR1cm4gc2NyaXB0P3NjcmlwdC5leGVjdXRpb25Db250ZXh0SWQ6MDt9CmV4ZWN1dGlvbkNvbnRleHRGb3JTdGFja1RyYWNlKHN0YWNrVHJhY2Upe3doaWxlKHN0YWNrVHJhY2UmJiFzdGFja1RyYWNlLmNhbGxGcmFtZXMubGVuZ3RoKQpzdGFja1RyYWNlPXN0YWNrVHJhY2UucGFyZW50O2lmKCFzdGFja1RyYWNlfHwhc3RhY2tUcmFjZS5jYWxsRnJhbWVzLmxlbmd0aCkKcmV0dXJuIDA7cmV0dXJuIHRoaXMuZXhlY3V0aW9uQ29udGV4dElkRm9yU2NyaXB0SWQoc3RhY2tUcmFjZS5jYWxsRnJhbWVzWzBdLnNjcmlwdElkKTt9Cmhhc1NpZGVFZmZlY3RTdXBwb3J0KCl7cmV0dXJuIHRoaXMuX2hhc1NpZGVFZmZlY3RTdXBwb3J0O30KYXN5bmMgY2hlY2tTaWRlRWZmZWN0U3VwcG9ydCgpe2NvbnN0IHRlc3RDb250ZXh0PXRoaXMuZXhlY3V0aW9uQ29udGV4dHMoKS5wZWVrTGFzdCgpO2lmKCF0ZXN0Q29udGV4dCkKcmV0dXJuIGZhbHNlO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9ldmFsdWF0ZSh7ZXhwcmVzc2lvbjpTREsuUnVudGltZU1vZGVsLl9zaWRlRWZmZWN0VGVzdEV4cHJlc3Npb24sY29udGV4dElkOnRlc3RDb250ZXh0LmlkLHRocm93T25TaWRlRWZmZWN0OnRydWV9KTtjb25zdCBleGNlcHRpb25EZXRhaWxzPSFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0mJnJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHM7Y29uc3Qgc3VwcG9ydHM9ISEoZXhjZXB0aW9uRGV0YWlscyYmZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24mJmV4Y2VwdGlvbkRldGFpbHMuZXhjZXB0aW9uLmRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ0V2YWxFcnJvcjogUG9zc2libGUgc2lkZS1lZmZlY3QgaW4gZGVidWctZXZhbHVhdGUnKSk7dGhpcy5faGFzU2lkZUVmZmVjdFN1cHBvcnQ9c3VwcG9ydHM7cmV0dXJuIHN1cHBvcnRzO30KdGVybWluYXRlRXhlY3V0aW9uKCl7cmV0dXJuIHRoaXMuX2FnZW50Lmludm9rZV90ZXJtaW5hdGVFeGVjdXRpb24oe30pO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuUnVudGltZU1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5KUyx0cnVlKTtTREsuUnVudGltZU1vZGVsLl9zaWRlRWZmZWN0VGVzdEV4cHJlc3Npb249Jyhhc3luYyBmdW5jdGlvbigpeyBhd2FpdCAxOyB9KSgpJztTREsuUnVudGltZU1vZGVsLkV2ZW50cz17RXhlY3V0aW9uQ29udGV4dENyZWF0ZWQ6U3ltYm9sKCdFeGVjdXRpb25Db250ZXh0Q3JlYXRlZCcpLEV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQ6U3ltYm9sKCdFeGVjdXRpb25Db250ZXh0RGVzdHJveWVkJyksRXhlY3V0aW9uQ29udGV4dENoYW5nZWQ6U3ltYm9sKCdFeGVjdXRpb25Db250ZXh0Q2hhbmdlZCcpLEV4ZWN1dGlvbkNvbnRleHRPcmRlckNoYW5nZWQ6U3ltYm9sKCdFeGVjdXRpb25Db250ZXh0T3JkZXJDaGFuZ2VkJyksRXhjZXB0aW9uVGhyb3duOlN5bWJvbCgnRXhjZXB0aW9uVGhyb3duJyksRXhjZXB0aW9uUmV2b2tlZDpTeW1ib2woJ0V4Y2VwdGlvblJldm9rZWQnKSxDb25zb2xlQVBJQ2FsbGVkOlN5bWJvbCgnQ29uc29sZUFQSUNhbGxlZCcpLFF1ZXJ5T2JqZWN0UmVxdWVzdGVkOlN5bWJvbCgnUXVlcnlPYmplY3RSZXF1ZXN0ZWQnKSx9O1NESy5SdW50aW1lTW9kZWwuRXhjZXB0aW9uV2l0aFRpbWVzdGFtcDtTREsuUnVudGltZU1vZGVsLkNvbXBpbGVTY3JpcHRSZXN1bHQ7U0RLLlJ1bnRpbWVNb2RlbC5FdmFsdWF0aW9uT3B0aW9ucztTREsuUnVudGltZU1vZGVsLkV2YWx1YXRpb25SZXN1bHQ7U0RLLlJ1bnRpbWVNb2RlbC5RdWVyeU9iamVjdFJlc3VsdDtTREsuUnVudGltZU1vZGVsLkNvbnNvbGVBUElDYWxsO1NESy5SdW50aW1lRGlzcGF0Y2hlcj1jbGFzc3tjb25zdHJ1Y3RvcihydW50aW1lTW9kZWwpe3RoaXMuX3J1bnRpbWVNb2RlbD1ydW50aW1lTW9kZWw7fQpleGVjdXRpb25Db250ZXh0Q3JlYXRlZChjb250ZXh0KXt0aGlzLl9ydW50aW1lTW9kZWwuX2V4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHQpO30KZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZChleGVjdXRpb25Db250ZXh0SWQpe3RoaXMuX3J1bnRpbWVNb2RlbC5fZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZChleGVjdXRpb25Db250ZXh0SWQpO30KZXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkKCl7dGhpcy5fcnVudGltZU1vZGVsLl9leGVjdXRpb25Db250ZXh0c0NsZWFyZWQoKTt9CmV4Y2VwdGlvblRocm93bih0aW1lc3RhbXAsZXhjZXB0aW9uRGV0YWlscyl7dGhpcy5fcnVudGltZU1vZGVsLmV4Y2VwdGlvblRocm93bih0aW1lc3RhbXAsZXhjZXB0aW9uRGV0YWlscyk7fQpleGNlcHRpb25SZXZva2VkKHJlYXNvbixleGNlcHRpb25JZCl7dGhpcy5fcnVudGltZU1vZGVsLl9leGNlcHRpb25SZXZva2VkKGV4Y2VwdGlvbklkKTt9CmNvbnNvbGVBUElDYWxsZWQodHlwZSxhcmdzLGV4ZWN1dGlvbkNvbnRleHRJZCx0aW1lc3RhbXAsc3RhY2tUcmFjZSxjb250ZXh0KXt0aGlzLl9ydW50aW1lTW9kZWwuX2NvbnNvbGVBUElDYWxsZWQodHlwZSxhcmdzLGV4ZWN1dGlvbkNvbnRleHRJZCx0aW1lc3RhbXAsc3RhY2tUcmFjZSxjb250ZXh0KTt9Cmluc3BlY3RSZXF1ZXN0ZWQocGF5bG9hZCxoaW50cyl7dGhpcy5fcnVudGltZU1vZGVsLl9pbnNwZWN0UmVxdWVzdGVkKHBheWxvYWQsaGludHMpO319O1NESy5FeGVjdXRpb25Db250ZXh0PWNsYXNze2NvbnN0cnVjdG9yKHJ1bnRpbWVNb2RlbCxpZCxuYW1lLG9yaWdpbixpc0RlZmF1bHQsZnJhbWVJZCl7dGhpcy5pZD1pZDt0aGlzLm5hbWU9bmFtZTt0aGlzLm9yaWdpbj1vcmlnaW47dGhpcy5pc0RlZmF1bHQ9aXNEZWZhdWx0O3RoaXMucnVudGltZU1vZGVsPXJ1bnRpbWVNb2RlbDt0aGlzLmRlYnVnZ2VyTW9kZWw9cnVudGltZU1vZGVsLmRlYnVnZ2VyTW9kZWwoKTt0aGlzLmZyYW1lSWQ9ZnJhbWVJZDt0aGlzLl9zZXRMYWJlbCgnJyk7fQp0YXJnZXQoKXtyZXR1cm4gdGhpcy5ydW50aW1lTW9kZWwudGFyZ2V0KCk7fQpzdGF0aWMgY29tcGFyYXRvcihhLGIpe2Z1bmN0aW9uIHRhcmdldFdlaWdodCh0YXJnZXQpe2lmKCF0YXJnZXQucGFyZW50VGFyZ2V0KCkpCnJldHVybiA0O2lmKHRhcmdldC5oYXNCcm93c2VyQ2FwYWJpbGl0eSgpKQpyZXR1cm4gMztpZih0YXJnZXQuaGFzSlNDYXBhYmlsaXR5KCkpCnJldHVybiAyO3JldHVybiAxO30KY29uc3Qgd2VpZ2h0RGlmZj10YXJnZXRXZWlnaHQoYS50YXJnZXQoKSktdGFyZ2V0V2VpZ2h0KGIudGFyZ2V0KCkpO2lmKHdlaWdodERpZmYpCnJldHVybi13ZWlnaHREaWZmO2lmKGEuaXNEZWZhdWx0KQpyZXR1cm4tMTtpZihiLmlzRGVmYXVsdCkKcmV0dXJuKzE7cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7fQpldmFsdWF0ZShvcHRpb25zLHVzZXJHZXN0dXJlLGF3YWl0UHJvbWlzZSl7aWYodGhpcy5kZWJ1Z2dlck1vZGVsLnNlbGVjdGVkQ2FsbEZyYW1lKCkpCnJldHVybiB0aGlzLmRlYnVnZ2VyTW9kZWwuZXZhbHVhdGVPblNlbGVjdGVkQ2FsbEZyYW1lKG9wdGlvbnMpO2NvbnN0IG5lZWRzVGVybWluYXRpb25PcHRpb25zPSEhb3B0aW9ucy50aHJvd09uU2lkZUVmZmVjdHx8b3B0aW9ucy50aW1lb3V0IT09dW5kZWZpbmVkO2lmKCFuZWVkc1Rlcm1pbmF0aW9uT3B0aW9uc3x8dGhpcy5ydW50aW1lTW9kZWwuaGFzU2lkZUVmZmVjdFN1cHBvcnQoKSkKcmV0dXJuIHRoaXMuX2V2YWx1YXRlR2xvYmFsKG9wdGlvbnMsdXNlckdlc3R1cmUsYXdhaXRQcm9taXNlKTtjb25zdCB1bnN1cHBvcnRlZEVycm9yPXtlcnJvcjonU2lkZS1lZmZlY3QgY2hlY2tzIG5vdCBzdXBwb3J0ZWQgYnkgYmFja2VuZC4nfTtpZih0aGlzLnJ1bnRpbWVNb2RlbC5oYXNTaWRlRWZmZWN0U3VwcG9ydCgpPT09ZmFsc2UpCnJldHVybiBQcm9taXNlLnJlc29sdmUodW5zdXBwb3J0ZWRFcnJvcik7cmV0dXJuIHRoaXMucnVudGltZU1vZGVsLmNoZWNrU2lkZUVmZmVjdFN1cHBvcnQoKS50aGVuKCgpPT57aWYodGhpcy5ydW50aW1lTW9kZWwuaGFzU2lkZUVmZmVjdFN1cHBvcnQoKSkKcmV0dXJuIHRoaXMuX2V2YWx1YXRlR2xvYmFsKG9wdGlvbnMsdXNlckdlc3R1cmUsYXdhaXRQcm9taXNlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuc3VwcG9ydGVkRXJyb3IpO30pO30KZ2xvYmFsT2JqZWN0KG9iamVjdEdyb3VwLGdlbmVyYXRlUHJldmlldyl7cmV0dXJuIHRoaXMuX2V2YWx1YXRlR2xvYmFsKHtleHByZXNzaW9uOid0aGlzJyxvYmplY3RHcm91cDpvYmplY3RHcm91cCxpbmNsdWRlQ29tbWFuZExpbmVBUEk6ZmFsc2Usc2lsZW50OnRydWUscmV0dXJuQnlWYWx1ZTpmYWxzZSxnZW5lcmF0ZVByZXZpZXc6Z2VuZXJhdGVQcmV2aWV3fSxmYWxzZSxmYWxzZSk7fQphc3luYyBfZXZhbHVhdGVHbG9iYWwob3B0aW9ucyx1c2VyR2VzdHVyZSxhd2FpdFByb21pc2Upe2lmKCFvcHRpb25zLmV4cHJlc3Npb24pe29wdGlvbnMuZXhwcmVzc2lvbj0ndGhpcyc7fQpjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLnJ1bnRpbWVNb2RlbC5fYWdlbnQuaW52b2tlX2V2YWx1YXRlKHtleHByZXNzaW9uOm9wdGlvbnMuZXhwcmVzc2lvbixvYmplY3RHcm91cDpvcHRpb25zLm9iamVjdEdyb3VwLGluY2x1ZGVDb21tYW5kTGluZUFQSTpvcHRpb25zLmluY2x1ZGVDb21tYW5kTGluZUFQSSxzaWxlbnQ6b3B0aW9ucy5zaWxlbnQsY29udGV4dElkOnRoaXMuaWQscmV0dXJuQnlWYWx1ZTpvcHRpb25zLnJldHVybkJ5VmFsdWUsZ2VuZXJhdGVQcmV2aWV3Om9wdGlvbnMuZ2VuZXJhdGVQcmV2aWV3LHVzZXJHZXN0dXJlOnVzZXJHZXN0dXJlLGF3YWl0UHJvbWlzZTphd2FpdFByb21pc2UsdGhyb3dPblNpZGVFZmZlY3Q6b3B0aW9ucy50aHJvd09uU2lkZUVmZmVjdCx0aW1lb3V0Om9wdGlvbnMudGltZW91dH0pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXTtpZihlcnJvcil7Y29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJue2Vycm9yOmVycm9yfTt9CnJldHVybntvYmplY3Q6dGhpcy5ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KHJlc3BvbnNlLnJlc3VsdCksZXhjZXB0aW9uRGV0YWlsczpyZXNwb25zZS5leGNlcHRpb25EZXRhaWxzfTt9CmFzeW5jIGdsb2JhbExleGljYWxTY29wZU5hbWVzKCl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5ydW50aW1lTW9kZWwuX2FnZW50Lmludm9rZV9nbG9iYWxMZXhpY2FsU2NvcGVOYW1lcyh7ZXhlY3V0aW9uQ29udGV4dElkOnRoaXMuaWR9KTtyZXR1cm4gcmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdP1tdOnJlc3BvbnNlLm5hbWVzO30KbGFiZWwoKXtyZXR1cm4gdGhpcy5fbGFiZWw7fQpzZXRMYWJlbChsYWJlbCl7dGhpcy5fc2V0TGFiZWwobGFiZWwpO3RoaXMucnVudGltZU1vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q2hhbmdlZCx0aGlzKTt9Cl9zZXRMYWJlbChsYWJlbCl7aWYobGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybjt9CmlmKHRoaXMubmFtZSl7dGhpcy5fbGFiZWw9dGhpcy5uYW1lO3JldHVybjt9CmNvbnN0IHBhcnNlZFVybD10aGlzLm9yaWdpbi5hc1BhcnNlZFVSTCgpO3RoaXMuX2xhYmVsPXBhcnNlZFVybD9wYXJzZWRVcmwubGFzdFBhdGhDb21wb25lbnRXaXRoRnJhZ21lbnQoKTonJzt9fTs7U0RLLlNjcmVlbkNhcHR1cmVNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fYWdlbnQ9dGFyZ2V0LnBhZ2VBZ2VudCgpO3RoaXMuX29uU2NyZWVuY2FzdEZyYW1lPW51bGw7dGhpcy5fb25TY3JlZW5jYXN0VmlzaWJpbGl0eUNoYW5nZWQ9bnVsbDt0YXJnZXQucmVnaXN0ZXJQYWdlRGlzcGF0Y2hlcih0aGlzKTt9CnN0YXJ0U2NyZWVuY2FzdChmb3JtYXQscXVhbGl0eSx3aWR0aCxoZWlnaHQsZXZlcnlOdGhGcmFtZSxvbkZyYW1lLG9uVmlzaWJpbGl0eUNoYW5nZWQpe3RoaXMuX29uU2NyZWVuY2FzdEZyYW1lPW9uRnJhbWU7dGhpcy5fb25TY3JlZW5jYXN0VmlzaWJpbGl0eUNoYW5nZWQ9b25WaXNpYmlsaXR5Q2hhbmdlZDt0aGlzLl9hZ2VudC5zdGFydFNjcmVlbmNhc3QoZm9ybWF0LHF1YWxpdHksd2lkdGgsaGVpZ2h0LGV2ZXJ5TnRoRnJhbWUpO30Kc3RvcFNjcmVlbmNhc3QoKXt0aGlzLl9vblNjcmVlbmNhc3RGcmFtZT1udWxsO3RoaXMuX29uU2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkPW51bGw7dGhpcy5fYWdlbnQuc3RvcFNjcmVlbmNhc3QoKTt9CmNhcHR1cmVTY3JlZW5zaG90KGZvcm1hdCxxdWFsaXR5LGNsaXApe3JldHVybiB0aGlzLl9hZ2VudC5jYXB0dXJlU2NyZWVuc2hvdChmb3JtYXQscXVhbGl0eSxjbGlwLHRydWUpO30KYXN5bmMgZmV0Y2hMYXlvdXRNZXRyaWNzKCl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX2dldExheW91dE1ldHJpY3Moe30pO2lmKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSkKcmV0dXJuIG51bGw7cmV0dXJue3ZpZXdwb3J0WDpyZXNwb25zZS52aXN1YWxWaWV3cG9ydC5wYWdlWCx2aWV3cG9ydFk6cmVzcG9uc2UudmlzdWFsVmlld3BvcnQucGFnZVksdmlld3BvcnRTY2FsZTpyZXNwb25zZS52aXN1YWxWaWV3cG9ydC5zY2FsZSxjb250ZW50V2lkdGg6cmVzcG9uc2UuY29udGVudFNpemUud2lkdGgsY29udGVudEhlaWdodDpyZXNwb25zZS5jb250ZW50U2l6ZS5oZWlnaHR9O30Kc2NyZWVuY2FzdEZyYW1lKGRhdGEsbWV0YWRhdGEsc2Vzc2lvbklkKXt0aGlzLl9hZ2VudC5zY3JlZW5jYXN0RnJhbWVBY2soc2Vzc2lvbklkKTtpZih0aGlzLl9vblNjcmVlbmNhc3RGcmFtZSkKdGhpcy5fb25TY3JlZW5jYXN0RnJhbWUuY2FsbChudWxsLGRhdGEsbWV0YWRhdGEpO30Kc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpe2lmKHRoaXMuX29uU2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkKQp0aGlzLl9vblNjcmVlbmNhc3RWaXNpYmlsaXR5Q2hhbmdlZC5jYWxsKG51bGwsdmlzaWJsZSk7fQpkb21Db250ZW50RXZlbnRGaXJlZCh0aW1lKXt9CmxvYWRFdmVudEZpcmVkKHRpbWUpe30KbGlmZWN5Y2xlRXZlbnQoZnJhbWVJZCxsb2FkZXJJZCxuYW1lLHRpbWUpe30KbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoZnJhbWVJZCx1cmwpe30KZnJhbWVBdHRhY2hlZChmcmFtZUlkLHBhcmVudEZyYW1lSWQpe30KZnJhbWVOYXZpZ2F0ZWQoZnJhbWUpe30KZnJhbWVEZXRhY2hlZChmcmFtZUlkKXt9CmZyYW1lU3RhcnRlZExvYWRpbmcoZnJhbWVJZCl7fQpmcmFtZVN0b3BwZWRMb2FkaW5nKGZyYW1lSWQpe30KZnJhbWVTY2hlZHVsZWROYXZpZ2F0aW9uKGZyYW1lSWQsZGVsYXkpe30KZnJhbWVDbGVhcmVkU2NoZWR1bGVkTmF2aWdhdGlvbihmcmFtZUlkKXt9CmZyYW1lUmVzaXplZCgpe30KamF2YXNjcmlwdERpYWxvZ09wZW5pbmcodXJsLG1lc3NhZ2UsZGlhbG9nVHlwZSxoYXNCcm93c2VySGFuZGxlcixwcm9tcHQpe30KamF2YXNjcmlwdERpYWxvZ0Nsb3NlZChyZXN1bHQsdXNlcklucHV0KXt9CmludGVyc3RpdGlhbFNob3duKCl7fQppbnRlcnN0aXRpYWxIaWRkZW4oKXt9CndpbmRvd09wZW4odXJsLHdpbmRvd05hbWUsd2luZG93RmVhdHVyZXMsdXNlckdlc3R1cmUpe30KY29tcGlsYXRpb25DYWNoZVByb2R1Y2VkKHVybCxkYXRhKXt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLlNjcmVlbkNhcHR1cmVNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuU2NyZWVuQ2FwdHVyZSxmYWxzZSk7O1NESy5TY3JpcHQ9Y2xhc3N7Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCxzY3JpcHRJZCxzb3VyY2VVUkwsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uLGV4ZWN1dGlvbkNvbnRleHRJZCxoYXNoLGlzQ29udGVudFNjcmlwdCxpc0xpdmVFZGl0LHNvdXJjZU1hcFVSTCxoYXNTb3VyY2VVUkwsbGVuZ3RoKXt0aGlzLmRlYnVnZ2VyTW9kZWw9ZGVidWdnZXJNb2RlbDt0aGlzLnNjcmlwdElkPXNjcmlwdElkO3RoaXMuc291cmNlVVJMPXNvdXJjZVVSTDt0aGlzLmxpbmVPZmZzZXQ9c3RhcnRMaW5lO3RoaXMuY29sdW1uT2Zmc2V0PXN0YXJ0Q29sdW1uO3RoaXMuZW5kTGluZT1lbmRMaW5lO3RoaXMuZW5kQ29sdW1uPWVuZENvbHVtbjt0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZD1leGVjdXRpb25Db250ZXh0SWQ7dGhpcy5oYXNoPWhhc2g7dGhpcy5faXNDb250ZW50U2NyaXB0PWlzQ29udGVudFNjcmlwdDt0aGlzLl9pc0xpdmVFZGl0PWlzTGl2ZUVkaXQ7dGhpcy5zb3VyY2VNYXBVUkw9c291cmNlTWFwVVJMO3RoaXMuaGFzU291cmNlVVJMPWhhc1NvdXJjZVVSTDt0aGlzLmNvbnRlbnRMZW5ndGg9bGVuZ3RoO3RoaXMuX29yaWdpbmFsQ29udGVudFByb3ZpZGVyPW51bGw7dGhpcy5fb3JpZ2luYWxTb3VyY2U9bnVsbDt9CnN0YXRpYyBfdHJpbVNvdXJjZVVSTENvbW1lbnQoc291cmNlKXtsZXQgc291cmNlVVJMSW5kZXg9c291cmNlLmxhc3RJbmRleE9mKCcvLyMgc291cmNlVVJMPScpO2lmKHNvdXJjZVVSTEluZGV4PT09LTEpe3NvdXJjZVVSTEluZGV4PXNvdXJjZS5sYXN0SW5kZXhPZignLy9AIHNvdXJjZVVSTD0nKTtpZihzb3VyY2VVUkxJbmRleD09PS0xKQpyZXR1cm4gc291cmNlO30KY29uc3Qgc291cmNlVVJMTGluZUluZGV4PXNvdXJjZS5sYXN0SW5kZXhPZignXG4nLHNvdXJjZVVSTEluZGV4KTtpZihzb3VyY2VVUkxMaW5lSW5kZXg9PT0tMSkKcmV0dXJuIHNvdXJjZTtjb25zdCBzb3VyY2VVUkxMaW5lPXNvdXJjZS5zdWJzdHIoc291cmNlVVJMTGluZUluZGV4KzEpLnNwbGl0KCdcbicsMSlbMF07aWYoc291cmNlVVJMTGluZS5zZWFyY2goU0RLLlNjcmlwdC5zb3VyY2VVUkxSZWdleCk9PT0tMSkKcmV0dXJuIHNvdXJjZTtyZXR1cm4gc291cmNlLnN1YnN0cigwLHNvdXJjZVVSTExpbmVJbmRleCkrc291cmNlLnN1YnN0cihzb3VyY2VVUkxMaW5lSW5kZXgrc291cmNlVVJMTGluZS5sZW5ndGgrMSk7fQppc0NvbnRlbnRTY3JpcHQoKXtyZXR1cm4gdGhpcy5faXNDb250ZW50U2NyaXB0O30KZXhlY3V0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLmRlYnVnZ2VyTW9kZWwucnVudGltZU1vZGVsKCkuZXhlY3V0aW9uQ29udGV4dCh0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZCk7fQppc0xpdmVFZGl0KCl7cmV0dXJuIHRoaXMuX2lzTGl2ZUVkaXQ7fQpjb250ZW50VVJMKCl7cmV0dXJuIHRoaXMuc291cmNlVVJMO30KY29udGVudFR5cGUoKXtyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0O30KY29udGVudEVuY29kZWQoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTt9CmFzeW5jIHJlcXVlc3RDb250ZW50KCl7aWYodGhpcy5fc291cmNlKQpyZXR1cm4gdGhpcy5fc291cmNlO2lmKCF0aGlzLnNjcmlwdElkKQpyZXR1cm4nJztjb25zdCBzb3VyY2U9YXdhaXQgdGhpcy5kZWJ1Z2dlck1vZGVsLnRhcmdldCgpLmRlYnVnZ2VyQWdlbnQoKS5nZXRTY3JpcHRTb3VyY2UodGhpcy5zY3JpcHRJZCk7dGhpcy5fc291cmNlPXNvdXJjZT9TREsuU2NyaXB0Ll90cmltU291cmNlVVJMQ29tbWVudChzb3VyY2UpOicnO2lmKHRoaXMuX29yaWdpbmFsU291cmNlPT09bnVsbCkKdGhpcy5fb3JpZ2luYWxTb3VyY2U9dGhpcy5fc291cmNlO3JldHVybiB0aGlzLl9zb3VyY2U7fQpvcmlnaW5hbENvbnRlbnRQcm92aWRlcigpe2lmKCF0aGlzLl9vcmlnaW5hbENvbnRlbnRQcm92aWRlcil7Y29uc3QgbGF6eUNvbnRlbnQ9KCk9PnRoaXMucmVxdWVzdENvbnRlbnQoKS50aGVuKCgpPT50aGlzLl9vcmlnaW5hbFNvdXJjZSk7dGhpcy5fb3JpZ2luYWxDb250ZW50UHJvdmlkZXI9bmV3IENvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXIodGhpcy5jb250ZW50VVJMKCksdGhpcy5jb250ZW50VHlwZSgpLGxhenlDb250ZW50KTt9CnJldHVybiB0aGlzLl9vcmlnaW5hbENvbnRlbnRQcm92aWRlcjt9CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2lmKCF0aGlzLnNjcmlwdElkKQpyZXR1cm5bXTtjb25zdCBtYXRjaGVzPWF3YWl0IHRoaXMuZGVidWdnZXJNb2RlbC50YXJnZXQoKS5kZWJ1Z2dlckFnZW50KCkuc2VhcmNoSW5Db250ZW50KHRoaXMuc2NyaXB0SWQscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtyZXR1cm4obWF0Y2hlc3x8W10pLm1hcChtYXRjaD0+bmV3IENvbW1vbi5Db250ZW50UHJvdmlkZXIuU2VhcmNoTWF0Y2gobWF0Y2gubGluZU51bWJlcixtYXRjaC5saW5lQ29udGVudCkpO30KX2FwcGVuZFNvdXJjZVVSTENvbW1lbnRJZk5lZWRlZChzb3VyY2Upe2lmKCF0aGlzLmhhc1NvdXJjZVVSTCkKcmV0dXJuIHNvdXJjZTtyZXR1cm4gc291cmNlKydcbiAvLyMgc291cmNlVVJMPScrdGhpcy5zb3VyY2VVUkw7fQphc3luYyBlZGl0U291cmNlKG5ld1NvdXJjZSxjYWxsYmFjayl7bmV3U291cmNlPVNESy5TY3JpcHQuX3RyaW1Tb3VyY2VVUkxDb21tZW50KG5ld1NvdXJjZSk7bmV3U291cmNlPXRoaXMuX2FwcGVuZFNvdXJjZVVSTENvbW1lbnRJZk5lZWRlZChuZXdTb3VyY2UpO2lmKCF0aGlzLnNjcmlwdElkKXtjYWxsYmFjaygnU2NyaXB0IGZhaWxlZCB0byBwYXJzZScpO3JldHVybjt9CmF3YWl0IHRoaXMucmVxdWVzdENvbnRlbnQoKTtpZih0aGlzLl9zb3VyY2U9PT1uZXdTb3VyY2Upe2NhbGxiYWNrKG51bGwpO3JldHVybjt9CmNvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuZGVidWdnZXJNb2RlbC50YXJnZXQoKS5kZWJ1Z2dlckFnZW50KCkuaW52b2tlX3NldFNjcmlwdFNvdXJjZSh7c2NyaXB0SWQ6dGhpcy5zY3JpcHRJZCxzY3JpcHRTb3VyY2U6bmV3U291cmNlfSk7aWYoIXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXSYmIXJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpCnRoaXMuX3NvdXJjZT1uZXdTb3VyY2U7Y29uc3QgbmVlZHNTdGVwSW49ISFyZXNwb25zZS5zdGFja0NoYW5nZWQ7Y2FsbGJhY2socmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdLHJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMscmVzcG9uc2UuY2FsbEZyYW1lcyxyZXNwb25zZS5hc3luY1N0YWNrVHJhY2UscmVzcG9uc2UuYXN5bmNTdGFja1RyYWNlSWQsbmVlZHNTdGVwSW4pO30KcmF3TG9jYXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybiBuZXcgU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24odGhpcy5kZWJ1Z2dlck1vZGVsLHRoaXMuc2NyaXB0SWQsbGluZU51bWJlcixjb2x1bW5OdW1iZXJ8fDApO30KaXNJbmxpbmVTY3JpcHQoKXtjb25zdCBzdGFydHNBdFplcm89IXRoaXMubGluZU9mZnNldCYmIXRoaXMuY29sdW1uT2Zmc2V0O3JldHVybiEhdGhpcy5zb3VyY2VVUkwmJiFzdGFydHNBdFplcm87fQppc0Fub255bW91c1NjcmlwdCgpe3JldHVybiF0aGlzLnNvdXJjZVVSTDt9CmlzSW5saW5lU2NyaXB0V2l0aFNvdXJjZVVSTCgpe3JldHVybiEhdGhpcy5oYXNTb3VyY2VVUkwmJnRoaXMuaXNJbmxpbmVTY3JpcHQoKTt9CmFzeW5jIHNldEJsYWNrYm94ZWRSYW5nZXMocG9zaXRpb25zKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLmRlYnVnZ2VyTW9kZWwudGFyZ2V0KCkuZGVidWdnZXJBZ2VudCgpLmludm9rZV9zZXRCbGFja2JveGVkUmFuZ2VzKHtzY3JpcHRJZDp0aGlzLnNjcmlwdElkLHBvc2l0aW9uc30pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXTtpZihlcnJvcikKY29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJuIWVycm9yO319O1NESy5TY3JpcHQuc291cmNlVVJMUmVnZXg9L15bXDA0MFx0XSpcL1wvW0AjXSBzb3VyY2VVUkw9XHMqKFxTKj8pXHMqJC9tOztTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RhcmdldC5yZWdpc3RlclN0b3JhZ2VEaXNwYXRjaGVyKHRoaXMpO3RoaXMuX2NhY2hlcz1uZXcgTWFwKCk7dGhpcy5fY2FjaGVBZ2VudD10YXJnZXQuY2FjaGVTdG9yYWdlQWdlbnQoKTt0aGlzLl9zdG9yYWdlQWdlbnQ9dGFyZ2V0LnN0b3JhZ2VBZ2VudCgpO3RoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlcj10YXJnZXQubW9kZWwoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlcik7dGhpcy5fb3JpZ2luc1VwZGF0ZWQ9bmV3IFNldCgpO3RoaXMuX3Rocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcigyMDAwKTt0aGlzLl9lbmFibGVkPWZhbHNlO30KZW5hYmxlKCl7aWYodGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5TZWN1cml0eU9yaWdpbk1hbmFnZXIuRXZlbnRzLlNlY3VyaXR5T3JpZ2luQWRkZWQsdGhpcy5fc2VjdXJpdHlPcmlnaW5BZGRlZCx0aGlzKTt0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5TZWN1cml0eU9yaWdpblJlbW92ZWQsdGhpcy5fc2VjdXJpdHlPcmlnaW5SZW1vdmVkLHRoaXMpO2Zvcihjb25zdCBzZWN1cml0eU9yaWdpbiBvZiB0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIuc2VjdXJpdHlPcmlnaW5zKCkpCnRoaXMuX2FkZE9yaWdpbihzZWN1cml0eU9yaWdpbik7dGhpcy5fZW5hYmxlZD10cnVlO30KY2xlYXJGb3JPcmlnaW4ob3JpZ2luKXt0aGlzLl9yZW1vdmVPcmlnaW4ob3JpZ2luKTt0aGlzLl9hZGRPcmlnaW4ob3JpZ2luKTt9CnJlZnJlc2hDYWNoZU5hbWVzKCl7Zm9yKGNvbnN0IGNhY2hlIG9mIHRoaXMuX2NhY2hlcy52YWx1ZXMoKSkKdGhpcy5fY2FjaGVSZW1vdmVkKGNhY2hlKTt0aGlzLl9jYWNoZXMuY2xlYXIoKTtjb25zdCBzZWN1cml0eU9yaWdpbnM9dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnNlY3VyaXR5T3JpZ2lucygpO2Zvcihjb25zdCBzZWN1cml0eU9yaWdpbiBvZiBzZWN1cml0eU9yaWdpbnMpCnRoaXMuX2xvYWRDYWNoZU5hbWVzKHNlY3VyaXR5T3JpZ2luKTt9CmFzeW5jIGRlbGV0ZUNhY2hlKGNhY2hlKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9jYWNoZUFnZW50Lmludm9rZV9kZWxldGVDYWNoZSh7Y2FjaGVJZDpjYWNoZS5jYWNoZUlkfSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKXtjb25zb2xlLmVycm9yKGBTZXJ2aWNlV29ya2VyQ2FjaGVBZ2VudCBlcnJvciBkZWxldGluZyBjYWNoZSAke2NhY2hlLnRvU3RyaW5nKCl9OiAke3Jlc3BvbnNlW1Byb3RvY29sLkVycm9yXX1gKTtyZXR1cm47fQp0aGlzLl9jYWNoZXMuZGVsZXRlKGNhY2hlLmNhY2hlSWQpO3RoaXMuX2NhY2hlUmVtb3ZlZChjYWNoZSk7fQphc3luYyBkZWxldGVDYWNoZUVudHJ5KGNhY2hlLHJlcXVlc3Qpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2NhY2hlQWdlbnQuaW52b2tlX2RlbGV0ZUVudHJ5KHtjYWNoZUlkOmNhY2hlLmNhY2hlSWQscmVxdWVzdH0pO2lmKCFyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnJldHVybjtDb21tb24uY29uc29sZS5lcnJvcihDb21tb24uVUlTdHJpbmcoJ1NlcnZpY2VXb3JrZXJDYWNoZUFnZW50IGVycm9yIGRlbGV0aW5nIGNhY2hlIGVudHJ5ICVzIGluIGNhY2hlOiAlcycsY2FjaGUudG9TdHJpbmcoKSxyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pKTt9CmxvYWRDYWNoZURhdGEoY2FjaGUsc2tpcENvdW50LHBhZ2VTaXplLGNhbGxiYWNrKXt0aGlzLl9yZXF1ZXN0RW50cmllcyhjYWNoZSxza2lwQ291bnQscGFnZVNpemUsY2FsbGJhY2spO30KY2FjaGVzKCl7Y29uc3QgY2FjaGVzPW5ldyBBcnJheSgpO2Zvcihjb25zdCBjYWNoZSBvZiB0aGlzLl9jYWNoZXMudmFsdWVzKCkpCmNhY2hlcy5wdXNoKGNhY2hlKTtyZXR1cm4gY2FjaGVzO30KZGlzcG9zZSgpe2Zvcihjb25zdCBjYWNoZSBvZiB0aGlzLl9jYWNoZXMudmFsdWVzKCkpCnRoaXMuX2NhY2hlUmVtb3ZlZChjYWNoZSk7dGhpcy5fY2FjaGVzLmNsZWFyKCk7aWYodGhpcy5fZW5hYmxlZCl7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlci5FdmVudHMuU2VjdXJpdHlPcmlnaW5BZGRlZCx0aGlzLl9zZWN1cml0eU9yaWdpbkFkZGVkLHRoaXMpO3RoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5TZWN1cml0eU9yaWdpbk1hbmFnZXIuRXZlbnRzLlNlY3VyaXR5T3JpZ2luUmVtb3ZlZCx0aGlzLl9zZWN1cml0eU9yaWdpblJlbW92ZWQsdGhpcyk7fX0KX2FkZE9yaWdpbihzZWN1cml0eU9yaWdpbil7dGhpcy5fbG9hZENhY2hlTmFtZXMoc2VjdXJpdHlPcmlnaW4pO2lmKHRoaXMuX2lzVmFsaWRTZWN1cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbikpCnRoaXMuX3N0b3JhZ2VBZ2VudC50cmFja0NhY2hlU3RvcmFnZUZvck9yaWdpbihzZWN1cml0eU9yaWdpbik7fQpfcmVtb3ZlT3JpZ2luKHNlY3VyaXR5T3JpZ2luKXtmb3IoY29uc3Qgb3BhcXVlSWQgb2YgdGhpcy5fY2FjaGVzLmtleXMoKSl7Y29uc3QgY2FjaGU9dGhpcy5fY2FjaGVzLmdldChvcGFxdWVJZCk7aWYoY2FjaGUuc2VjdXJpdHlPcmlnaW49PT1zZWN1cml0eU9yaWdpbil7dGhpcy5fY2FjaGVzLmRlbGV0ZShvcGFxdWVJZCk7dGhpcy5fY2FjaGVSZW1vdmVkKGNhY2hlKTt9fQppZih0aGlzLl9pc1ZhbGlkU2VjdXJpdHlPcmlnaW4oc2VjdXJpdHlPcmlnaW4pKQp0aGlzLl9zdG9yYWdlQWdlbnQudW50cmFja0NhY2hlU3RvcmFnZUZvck9yaWdpbihzZWN1cml0eU9yaWdpbik7fQpfaXNWYWxpZFNlY3VyaXR5T3JpZ2luKHNlY3VyaXR5T3JpZ2luKXtjb25zdCBwYXJzZWRVUkw9c2VjdXJpdHlPcmlnaW4uYXNQYXJzZWRVUkwoKTtyZXR1cm4hIXBhcnNlZFVSTCYmcGFyc2VkVVJMLnNjaGVtZS5zdGFydHNXaXRoKCdodHRwJyk7fQphc3luYyBfbG9hZENhY2hlTmFtZXMoc2VjdXJpdHlPcmlnaW4pe2NvbnN0IGNhY2hlcz1hd2FpdCB0aGlzLl9jYWNoZUFnZW50LnJlcXVlc3RDYWNoZU5hbWVzKHNlY3VyaXR5T3JpZ2luKTtpZighY2FjaGVzKQpyZXR1cm47dGhpcy5fdXBkYXRlQ2FjaGVOYW1lcyhzZWN1cml0eU9yaWdpbixjYWNoZXMpO30KX3VwZGF0ZUNhY2hlTmFtZXMoc2VjdXJpdHlPcmlnaW4sY2FjaGVzSnNvbil7ZnVuY3Rpb24gZGVsZXRlQW5kU2F2ZU9sZENhY2hlcyhjYWNoZSl7aWYoY2FjaGUuc2VjdXJpdHlPcmlnaW49PT1zZWN1cml0eU9yaWdpbiYmIXVwZGF0aW5nQ2FjaGVzSWRzLmhhcyhjYWNoZS5jYWNoZUlkKSl7b2xkQ2FjaGVzLnNldChjYWNoZS5jYWNoZUlkLGNhY2hlKTt0aGlzLl9jYWNoZXMuZGVsZXRlKGNhY2hlLmNhY2hlSWQpO319CmNvbnN0IHVwZGF0aW5nQ2FjaGVzSWRzPW5ldyBTZXQoKTtjb25zdCBuZXdDYWNoZXM9bmV3IE1hcCgpO2NvbnN0IG9sZENhY2hlcz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGNhY2hlSnNvbiBvZiBjYWNoZXNKc29uKXtjb25zdCBjYWNoZT1uZXcgU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkNhY2hlKHRoaXMsY2FjaGVKc29uLnNlY3VyaXR5T3JpZ2luLGNhY2hlSnNvbi5jYWNoZU5hbWUsY2FjaGVKc29uLmNhY2hlSWQpO3VwZGF0aW5nQ2FjaGVzSWRzLmFkZChjYWNoZS5jYWNoZUlkKTtpZih0aGlzLl9jYWNoZXMuaGFzKGNhY2hlLmNhY2hlSWQpKQpjb250aW51ZTtuZXdDYWNoZXMuc2V0KGNhY2hlLmNhY2hlSWQsY2FjaGUpO3RoaXMuX2NhY2hlcy5zZXQoY2FjaGUuY2FjaGVJZCxjYWNoZSk7fQp0aGlzLl9jYWNoZXMuZm9yRWFjaChkZWxldGVBbmRTYXZlT2xkQ2FjaGVzLHRoaXMpO25ld0NhY2hlcy5mb3JFYWNoKHRoaXMuX2NhY2hlQWRkZWQsdGhpcyk7b2xkQ2FjaGVzLmZvckVhY2godGhpcy5fY2FjaGVSZW1vdmVkLHRoaXMpO30KX3NlY3VyaXR5T3JpZ2luQWRkZWQoZXZlbnQpe2NvbnN0IHNlY3VyaXR5T3JpZ2luPShldmVudC5kYXRhKTt0aGlzLl9hZGRPcmlnaW4oc2VjdXJpdHlPcmlnaW4pO30KX3NlY3VyaXR5T3JpZ2luUmVtb3ZlZChldmVudCl7Y29uc3Qgc2VjdXJpdHlPcmlnaW49KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZU9yaWdpbihzZWN1cml0eU9yaWdpbik7fQpfY2FjaGVBZGRlZChjYWNoZSl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cy5DYWNoZUFkZGVkLHttb2RlbDp0aGlzLGNhY2hlOmNhY2hlfSk7fQpfY2FjaGVSZW1vdmVkKGNhY2hlKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWwuRXZlbnRzLkNhY2hlUmVtb3ZlZCx7bW9kZWw6dGhpcyxjYWNoZTpjYWNoZX0pO30KYXN5bmMgX3JlcXVlc3RFbnRyaWVzKGNhY2hlLHNraXBDb3VudCxwYWdlU2l6ZSxjYWxsYmFjayl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fY2FjaGVBZ2VudC5pbnZva2VfcmVxdWVzdEVudHJpZXMoe2NhY2hlSWQ6Y2FjaGUuY2FjaGVJZCxza2lwQ291bnQscGFnZVNpemV9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pe2NvbnNvbGUuZXJyb3IoJ1NlcnZpY2VXb3JrZXJDYWNoZUFnZW50IGVycm9yIHdoaWxlIHJlcXVlc3RpbmcgZW50cmllczogJyxyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pO3JldHVybjt9CmNhbGxiYWNrKHJlc3BvbnNlLmNhY2hlRGF0YUVudHJpZXMscmVzcG9uc2UuaGFzTW9yZSk7fQpjYWNoZVN0b3JhZ2VMaXN0VXBkYXRlZChvcmlnaW4pe3RoaXMuX29yaWdpbnNVcGRhdGVkLmFkZChvcmlnaW4pO3RoaXMuX3Rocm90dGxlci5zY2hlZHVsZSgoKT0+e2NvbnN0IHByb21pc2VzPUFycmF5LmZyb20odGhpcy5fb3JpZ2luc1VwZGF0ZWQsb3JpZ2luPT50aGlzLl9sb2FkQ2FjaGVOYW1lcyhvcmlnaW4pKTt0aGlzLl9vcmlnaW5zVXBkYXRlZC5jbGVhcigpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fSk7fQpjYWNoZVN0b3JhZ2VDb250ZW50VXBkYXRlZChvcmlnaW4sY2FjaGVOYW1lKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWwuRXZlbnRzLkNhY2hlU3RvcmFnZUNvbnRlbnRVcGRhdGVkLHtvcmlnaW46b3JpZ2luLGNhY2hlTmFtZTpjYWNoZU5hbWV9KTt9CmluZGV4ZWREQkxpc3RVcGRhdGVkKG9yaWdpbil7fQppbmRleGVkREJDb250ZW50VXBkYXRlZChvcmlnaW4sZGF0YWJhc2VOYW1lLG9iamVjdFN0b3JlTmFtZSl7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5TZXJ2aWNlV29ya2VyQ2FjaGVNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuQnJvd3NlcixmYWxzZSk7U0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cz17Q2FjaGVBZGRlZDpTeW1ib2woJ0NhY2hlQWRkZWQnKSxDYWNoZVJlbW92ZWQ6U3ltYm9sKCdDYWNoZVJlbW92ZWQnKSxDYWNoZVN0b3JhZ2VDb250ZW50VXBkYXRlZDpTeW1ib2woJ0NhY2hlU3RvcmFnZUNvbnRlbnRVcGRhdGVkJyl9O1NESy5TZXJ2aWNlV29ya2VyQ2FjaGVNb2RlbC5DYWNoZT1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCxzZWN1cml0eU9yaWdpbixjYWNoZU5hbWUsY2FjaGVJZCl7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5zZWN1cml0eU9yaWdpbj1zZWN1cml0eU9yaWdpbjt0aGlzLmNhY2hlTmFtZT1jYWNoZU5hbWU7dGhpcy5jYWNoZUlkPWNhY2hlSWQ7fQplcXVhbHMoY2FjaGUpe3JldHVybiB0aGlzLmNhY2hlSWQ9PT1jYWNoZS5jYWNoZUlkO30KdG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5zZWN1cml0eU9yaWdpbit0aGlzLmNhY2hlTmFtZTt9CnJlcXVlc3RDYWNoZWRSZXNwb25zZSh1cmwpe3JldHVybiB0aGlzLl9tb2RlbC5fY2FjaGVBZ2VudC5yZXF1ZXN0Q2FjaGVkUmVzcG9uc2UodGhpcy5jYWNoZUlkLHVybCk7fX07O1NESy5DYWxsRnVuY3Rpb25SZXN1bHQ7U0RLLlJlbW90ZU9iamVjdD1jbGFzc3tzdGF0aWMgZnJvbUxvY2FsT2JqZWN0KHZhbHVlKXtyZXR1cm4gbmV3IFNESy5Mb2NhbEpTT05PYmplY3QodmFsdWUpO30Kc3RhdGljIHR5cGUocmVtb3RlT2JqZWN0KXtpZihyZW1vdGVPYmplY3Q9PT1udWxsKQpyZXR1cm4nbnVsbCc7Y29uc3QgdHlwZT10eXBlb2YgcmVtb3RlT2JqZWN0O2lmKHR5cGUhPT0nb2JqZWN0JyYmdHlwZSE9PSdmdW5jdGlvbicpCnJldHVybiB0eXBlO3JldHVybiByZW1vdGVPYmplY3QudHlwZTt9CnN0YXRpYyBhcnJheU5hbWVGcm9tRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pe3JldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKFNESy5SZW1vdGVPYmplY3QuX2Rlc2NyaXB0aW9uTGVuZ3RoUGFyZW5SZWdleCwnJykucmVwbGFjZShTREsuUmVtb3RlT2JqZWN0Ll9kZXNjcmlwdGlvbkxlbmd0aFNxdWFyZVJlZ2V4LCcnKTt9CnN0YXRpYyBhcnJheUxlbmd0aChvYmplY3Qpe2lmKG9iamVjdC5zdWJ0eXBlIT09J2FycmF5JyYmb2JqZWN0LnN1YnR5cGUhPT0ndHlwZWRhcnJheScpCnJldHVybiAwO2NvbnN0IHBhcmVuTWF0Y2hlcz1vYmplY3QuZGVzY3JpcHRpb24ubWF0Y2goU0RLLlJlbW90ZU9iamVjdC5fZGVzY3JpcHRpb25MZW5ndGhQYXJlblJlZ2V4KTtjb25zdCBzcXVhcmVNYXRjaGVzPW9iamVjdC5kZXNjcmlwdGlvbi5tYXRjaChTREsuUmVtb3RlT2JqZWN0Ll9kZXNjcmlwdGlvbkxlbmd0aFNxdWFyZVJlZ2V4KTtyZXR1cm4gcGFyZW5NYXRjaGVzP3BhcnNlSW50KHBhcmVuTWF0Y2hlc1sxXSwxMCk6KHNxdWFyZU1hdGNoZXM/cGFyc2VJbnQoc3F1YXJlTWF0Y2hlc1sxXSwxMCk6MCk7fQpzdGF0aWMgdW5zZXJpYWxpemFibGVEZXNjcmlwdGlvbihvYmplY3Qpe2NvbnN0IHR5cGU9dHlwZW9mIG9iamVjdDtpZih0eXBlPT09J251bWJlcicpe2NvbnN0IGRlc2NyaXB0aW9uPVN0cmluZyhvYmplY3QpO2lmKG9iamVjdD09PTAmJjEvb2JqZWN0PDApCnJldHVybiBTREsuUmVtb3RlT2JqZWN0LlVuc2VyaWFsaXphYmxlTnVtYmVyLk5lZ2F0aXZlMDtpZihkZXNjcmlwdGlvbj09PVNESy5SZW1vdGVPYmplY3QuVW5zZXJpYWxpemFibGVOdW1iZXIuTmFOfHxkZXNjcmlwdGlvbj09PVNESy5SZW1vdGVPYmplY3QuVW5zZXJpYWxpemFibGVOdW1iZXIuSW5maW5pdHl8fGRlc2NyaXB0aW9uPT09U0RLLlJlbW90ZU9iamVjdC5VbnNlcmlhbGl6YWJsZU51bWJlci5OZWdhdGl2ZUluZmluaXR5KQpyZXR1cm4gZGVzY3JpcHRpb247fQppZih0eXBlPT09J2JpZ2ludCcpCnJldHVybiBvYmplY3QrJ24nO3JldHVybiBudWxsO30Kc3RhdGljIHRvQ2FsbEFyZ3VtZW50KG9iamVjdCl7Y29uc3QgdHlwZT10eXBlb2Ygb2JqZWN0O2lmKHR5cGU9PT0ndW5kZWZpbmVkJykKcmV0dXJue307Y29uc3QgdW5zZXJpYWxpemFibGVEZXNjcmlwdGlvbj1TREsuUmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb24ob2JqZWN0KTtpZih0eXBlPT09J251bWJlcicpe2lmKHVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb24hPT1udWxsKQpyZXR1cm57dW5zZXJpYWxpemFibGVWYWx1ZTp1bnNlcmlhbGl6YWJsZURlc2NyaXB0aW9ufTtyZXR1cm57dmFsdWU6b2JqZWN0fTt9CmlmKHR5cGU9PT0nYmlnaW50JykKcmV0dXJue3Vuc2VyaWFsaXphYmxlVmFsdWU6KHVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb24pfTtpZih0eXBlPT09J3N0cmluZyd8fHR5cGU9PT0nYm9vbGVhbicpCnJldHVybnt2YWx1ZTpvYmplY3R9O2lmKCFvYmplY3QpCnJldHVybnt2YWx1ZTpudWxsfTtpZihvYmplY3QgaW5zdGFuY2VvZiBTREsuUmVtb3RlT2JqZWN0KXtjb25zdCB1bnNlcmlhbGl6YWJsZVZhbHVlPW9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKCk7aWYodW5zZXJpYWxpemFibGVWYWx1ZSE9PXVuZGVmaW5lZCkKcmV0dXJue3Vuc2VyaWFsaXphYmxlVmFsdWU6dW5zZXJpYWxpemFibGVWYWx1ZX07fWVsc2UgaWYob2JqZWN0LnVuc2VyaWFsaXphYmxlVmFsdWUhPT11bmRlZmluZWQpe3JldHVybnt1bnNlcmlhbGl6YWJsZVZhbHVlOm9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlfTt9CmlmKHR5cGVvZiBvYmplY3Qub2JqZWN0SWQhPT0ndW5kZWZpbmVkJykKcmV0dXJue29iamVjdElkOm9iamVjdC5vYmplY3RJZH07cmV0dXJue3ZhbHVlOm9iamVjdC52YWx1ZX07fQpzdGF0aWMgbG9hZEZyb21PYmplY3RQZXJQcm90byhvYmplY3QsZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKXtsZXQgc2F2ZWRPd25Qcm9wZXJ0aWVzO2xldCBzYXZlZEFjY2Vzc29yUHJvcGVydGllcztsZXQgc2F2ZWRJbnRlcm5hbFByb3BlcnRpZXM7bGV0IHJlc3VsdENvdW50ZXI9MjtmdW5jdGlvbiBwcm9jZXNzQ2FsbGJhY2soKXtpZigtLXJlc3VsdENvdW50ZXIpCnJldHVybjtpZihzYXZlZE93blByb3BlcnRpZXMmJnNhdmVkQWNjZXNzb3JQcm9wZXJ0aWVzKXtjb25zdCBwcm9wZXJ0aWVzTWFwPW5ldyBNYXAoKTtjb25zdCBwcm9wZXJ0eVN5bWJvbHM9W107Zm9yKGxldCBpPTA7aTxzYXZlZEFjY2Vzc29yUHJvcGVydGllcy5sZW5ndGg7aSsrKXtjb25zdCBwcm9wZXJ0eT1zYXZlZEFjY2Vzc29yUHJvcGVydGllc1tpXTtpZihwcm9wZXJ0eS5zeW1ib2wpCnByb3BlcnR5U3ltYm9scy5wdXNoKHByb3BlcnR5KTtlbHNlCnByb3BlcnRpZXNNYXAuc2V0KHByb3BlcnR5Lm5hbWUscHJvcGVydHkpO30KZm9yKGxldCBpPTA7aTxzYXZlZE93blByb3BlcnRpZXMubGVuZ3RoO2krKyl7Y29uc3QgcHJvcGVydHk9c2F2ZWRPd25Qcm9wZXJ0aWVzW2ldO2lmKHByb3BlcnR5LmlzQWNjZXNzb3JQcm9wZXJ0eSgpKQpjb250aW51ZTtpZihwcm9wZXJ0eS5zeW1ib2wpCnByb3BlcnR5U3ltYm9scy5wdXNoKHByb3BlcnR5KTtlbHNlCnByb3BlcnRpZXNNYXAuc2V0KHByb3BlcnR5Lm5hbWUscHJvcGVydHkpO30KcmV0dXJuIGNhbGxiYWNrKHByb3BlcnRpZXNNYXAudmFsdWVzQXJyYXkoKS5jb25jYXQocHJvcGVydHlTeW1ib2xzKSxzYXZlZEludGVybmFsUHJvcGVydGllcz9zYXZlZEludGVybmFsUHJvcGVydGllczpudWxsKTt9ZWxzZXtjYWxsYmFjayhudWxsLG51bGwpO319CmZ1bmN0aW9uIGFsbEFjY2Vzc29yUHJvcGVydGllc0NhbGxiYWNrKHByb3BlcnRpZXMsaW50ZXJuYWxQcm9wZXJ0aWVzKXtzYXZlZEFjY2Vzc29yUHJvcGVydGllcz1wcm9wZXJ0aWVzO3Byb2Nlc3NDYWxsYmFjaygpO30KZnVuY3Rpb24gb3duUHJvcGVydGllc0NhbGxiYWNrKHByb3BlcnRpZXMsaW50ZXJuYWxQcm9wZXJ0aWVzKXtzYXZlZE93blByb3BlcnRpZXM9cHJvcGVydGllcztzYXZlZEludGVybmFsUHJvcGVydGllcz1pbnRlcm5hbFByb3BlcnRpZXM7cHJvY2Vzc0NhbGxiYWNrKCk7fQpvYmplY3QuZ2V0QWxsUHJvcGVydGllcyh0cnVlLGdlbmVyYXRlUHJldmlldyxhbGxBY2Nlc3NvclByb3BlcnRpZXNDYWxsYmFjayk7b2JqZWN0LmdldE93blByb3BlcnRpZXMoZ2VuZXJhdGVQcmV2aWV3LG93blByb3BlcnRpZXNDYWxsYmFjayk7fQpjdXN0b21QcmV2aWV3KCl7cmV0dXJuIG51bGw7fQpnZXQgb2JqZWN0SWQoKXtyZXR1cm4nTm90IGltcGxlbWVudGVkJzt9CmdldCB0eXBlKCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CmdldCBzdWJ0eXBlKCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CmdldCB2YWx1ZSgpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQp1bnNlcmlhbGl6YWJsZVZhbHVlKCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CmdldCBkZXNjcmlwdGlvbigpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpnZXQgaGFzQ2hpbGRyZW4oKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KZ2V0IHByZXZpZXcoKXtyZXR1cm4gdW5kZWZpbmVkO30KZ2V0IGNsYXNzTmFtZSgpe3JldHVybiBudWxsO30KYXJyYXlMZW5ndGgoKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KZ2V0T3duUHJvcGVydGllcyhnZW5lcmF0ZVByZXZpZXcsY2FsbGJhY2spe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpnZXRPd25Qcm9wZXJ0aWVzUHJvbWlzZShnZW5lcmF0ZVByZXZpZXcpe3JldHVybiBuZXcgUHJvbWlzZShwcm9taXNlQ29uc3RydWN0b3IuYmluZCh0aGlzKSk7ZnVuY3Rpb24gcHJvbWlzZUNvbnN0cnVjdG9yKHN1Y2Nlc3Mpe3RoaXMuZ2V0T3duUHJvcGVydGllcyghIWdlbmVyYXRlUHJldmlldyxnZXRPd25Qcm9wZXJ0aWVzQ2FsbGJhY2suYmluZChudWxsLHN1Y2Nlc3MpKTt9CmZ1bmN0aW9uIGdldE93blByb3BlcnRpZXNDYWxsYmFjayhjYWxsYmFjayxwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyl7Y2FsbGJhY2soe3Byb3BlcnRpZXM6cHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXM6aW50ZXJuYWxQcm9wZXJ0aWVzfSk7fX0KZ2V0QWxsUHJvcGVydGllcyhhY2Nlc3NvclByb3BlcnRpZXNPbmx5LGdlbmVyYXRlUHJldmlldyxjYWxsYmFjayl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CmdldEFsbFByb3BlcnRpZXNQcm9taXNlKGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3KXtyZXR1cm4gbmV3IFByb21pc2UocHJvbWlzZUNvbnN0cnVjdG9yLmJpbmQodGhpcykpO2Z1bmN0aW9uIHByb21pc2VDb25zdHJ1Y3RvcihzdWNjZXNzKXt0aGlzLmdldEFsbFByb3BlcnRpZXMoYWNjZXNzb3JQcm9wZXJ0aWVzT25seSxnZW5lcmF0ZVByZXZpZXcsZ2V0QWxsUHJvcGVydGllc0NhbGxiYWNrLmJpbmQobnVsbCxzdWNjZXNzKSk7fQpmdW5jdGlvbiBnZXRBbGxQcm9wZXJ0aWVzQ2FsbGJhY2soY2FsbGJhY2sscHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpe2NhbGxiYWNrKHtwcm9wZXJ0aWVzOnByb3BlcnRpZXMsaW50ZXJuYWxQcm9wZXJ0aWVzOmludGVybmFsUHJvcGVydGllc30pO319CmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCxjYWxsYmFjayl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CmFzeW5jIGRlbGV0ZVByb3BlcnR5KG5hbWUpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQphc3luYyBzZXRQcm9wZXJ0eVZhbHVlKG5hbWUsdmFsdWUpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpjYWxsRnVuY3Rpb24oZnVuY3Rpb25EZWNsYXJhdGlvbixhcmdzLGNhbGxiYWNrKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KY2FsbEZ1bmN0aW9uUHJvbWlzZShmdW5jdGlvbkRlY2xhcmF0aW9uLGFyZ3Mpe3JldHVybiBuZXcgUHJvbWlzZShwcm9taXNlQ29uc3RydWN0b3IuYmluZCh0aGlzKSk7ZnVuY3Rpb24gcHJvbWlzZUNvbnN0cnVjdG9yKHN1Y2Nlc3Mpe3RoaXMuY2FsbEZ1bmN0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sYXJncyxjYWxsRnVuY3Rpb25DYWxsYmFjay5iaW5kKG51bGwsc3VjY2VzcykpO30KZnVuY3Rpb24gY2FsbEZ1bmN0aW9uQ2FsbGJhY2soY2FsbGJhY2ssb2JqZWN0LHdhc1Rocm93bil7Y2FsbGJhY2soe29iamVjdDpvYmplY3Qsd2FzVGhyb3duOndhc1Rocm93bn0pO319CmNhbGxGdW5jdGlvbkpTT04oZnVuY3Rpb25EZWNsYXJhdGlvbixhcmdzLGNhbGxiYWNrKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KY2FsbEZ1bmN0aW9uSlNPTlByb21pc2UoZnVuY3Rpb25EZWNsYXJhdGlvbixhcmdzKXtyZXR1cm4gbmV3IFByb21pc2Uoc3VjY2Vzcz0+dGhpcy5jYWxsRnVuY3Rpb25KU09OKGZ1bmN0aW9uRGVjbGFyYXRpb24sYXJncyxzdWNjZXNzKSk7fQpyZWxlYXNlKCl7fQpkZWJ1Z2dlck1vZGVsKCl7dGhyb3cgbmV3IEVycm9yKCdEZWJ1Z2dlck1vZGVsLWxlc3Mgb2JqZWN0Jyk7fQpydW50aW1lTW9kZWwoKXt0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWVNb2RlbC1sZXNzIG9iamVjdCcpO30KaXNOb2RlKCl7cmV0dXJuIGZhbHNlO319O1NESy5SZW1vdGVPYmplY3RJbXBsPWNsYXNzIGV4dGVuZHMgU0RLLlJlbW90ZU9iamVjdHtjb25zdHJ1Y3RvcihydW50aW1lTW9kZWwsb2JqZWN0SWQsdHlwZSxzdWJ0eXBlLHZhbHVlLHVuc2VyaWFsaXphYmxlVmFsdWUsZGVzY3JpcHRpb24scHJldmlldyxjdXN0b21QcmV2aWV3LGNsYXNzTmFtZSl7c3VwZXIoKTt0aGlzLl9ydW50aW1lTW9kZWw9cnVudGltZU1vZGVsO3RoaXMuX3J1bnRpbWVBZ2VudD1ydW50aW1lTW9kZWwudGFyZ2V0KCkucnVudGltZUFnZW50KCk7dGhpcy5fdHlwZT10eXBlO3RoaXMuX3N1YnR5cGU9c3VidHlwZTtpZihvYmplY3RJZCl7dGhpcy5fb2JqZWN0SWQ9b2JqZWN0SWQ7dGhpcy5fZGVzY3JpcHRpb249ZGVzY3JpcHRpb247dGhpcy5faGFzQ2hpbGRyZW49KHR5cGUhPT0nc3ltYm9sJyk7dGhpcy5fcHJldmlldz1wcmV2aWV3O31lbHNle3RoaXMuX2Rlc2NyaXB0aW9uPWRlc2NyaXB0aW9uO2lmKCF0aGlzLmRlc2NyaXB0aW9uJiZ1bnNlcmlhbGl6YWJsZVZhbHVlKQp0aGlzLl9kZXNjcmlwdGlvbj11bnNlcmlhbGl6YWJsZVZhbHVlO2lmKCF0aGlzLl9kZXNjcmlwdGlvbiYmKHR5cGVvZiB2YWx1ZSE9PSdvYmplY3QnfHx2YWx1ZT09PW51bGwpKQp0aGlzLl9kZXNjcmlwdGlvbj12YWx1ZSsnJzt0aGlzLl9oYXNDaGlsZHJlbj1mYWxzZTtpZih0eXBlb2YgdW5zZXJpYWxpemFibGVWYWx1ZT09PSdzdHJpbmcnKXt0aGlzLl91bnNlcmlhbGl6YWJsZVZhbHVlPXVuc2VyaWFsaXphYmxlVmFsdWU7aWYodW5zZXJpYWxpemFibGVWYWx1ZT09PVNESy5SZW1vdGVPYmplY3QuVW5zZXJpYWxpemFibGVOdW1iZXIuSW5maW5pdHl8fHVuc2VyaWFsaXphYmxlVmFsdWU9PT1TREsuUmVtb3RlT2JqZWN0LlVuc2VyaWFsaXphYmxlTnVtYmVyLk5lZ2F0aXZlSW5maW5pdHl8fHVuc2VyaWFsaXphYmxlVmFsdWU9PT1TREsuUmVtb3RlT2JqZWN0LlVuc2VyaWFsaXphYmxlTnVtYmVyLk5lZ2F0aXZlMHx8dW5zZXJpYWxpemFibGVWYWx1ZT09PVNESy5SZW1vdGVPYmplY3QuVW5zZXJpYWxpemFibGVOdW1iZXIuTmFOKQp0aGlzLl92YWx1ZT1OdW1iZXIodW5zZXJpYWxpemFibGVWYWx1ZSk7ZWxzZSBpZih0eXBlPT09J2JpZ2ludCcmJnVuc2VyaWFsaXphYmxlVmFsdWUuZW5kc1dpdGgoJ24nKSkKdGhpcy5fdmFsdWU9QmlnSW50KHVuc2VyaWFsaXphYmxlVmFsdWUuc3Vic3RyaW5nKDAsdW5zZXJpYWxpemFibGVWYWx1ZS5sZW5ndGgtMSkpO2Vsc2UKdGhpcy5fdmFsdWU9dW5zZXJpYWxpemFibGVWYWx1ZTt9ZWxzZXt0aGlzLl92YWx1ZT12YWx1ZTt9fQp0aGlzLl9jdXN0b21QcmV2aWV3PWN1c3RvbVByZXZpZXd8fG51bGw7dGhpcy5fY2xhc3NOYW1lPXR5cGVvZiBjbGFzc05hbWU9PT0nc3RyaW5nJz9jbGFzc05hbWU6bnVsbDt9CmN1c3RvbVByZXZpZXcoKXtyZXR1cm4gdGhpcy5fY3VzdG9tUHJldmlldzt9CmdldCBvYmplY3RJZCgpe3JldHVybiB0aGlzLl9vYmplY3RJZDt9CmdldCB0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpnZXQgc3VidHlwZSgpe3JldHVybiB0aGlzLl9zdWJ0eXBlO30KZ2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlO30KdW5zZXJpYWxpemFibGVWYWx1ZSgpe3JldHVybiB0aGlzLl91bnNlcmlhbGl6YWJsZVZhbHVlO30KZ2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO30KZ2V0IGhhc0NoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX2hhc0NoaWxkcmVuO30KZ2V0IHByZXZpZXcoKXtyZXR1cm4gdGhpcy5fcHJldmlldzt9CmdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fY2xhc3NOYW1lO30KZ2V0T3duUHJvcGVydGllcyhnZW5lcmF0ZVByZXZpZXcsY2FsbGJhY2spe3RoaXMuZG9HZXRQcm9wZXJ0aWVzKHRydWUsZmFsc2UsZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKTt9CmdldEFsbFByb3BlcnRpZXMoYWNjZXNzb3JQcm9wZXJ0aWVzT25seSxnZW5lcmF0ZVByZXZpZXcsY2FsbGJhY2spe3RoaXMuZG9HZXRQcm9wZXJ0aWVzKGZhbHNlLGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKTt9CmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCxjYWxsYmFjayl7ZnVuY3Rpb24gcmVtb3RlRnVuY3Rpb24oYXJyYXlTdHIpe2xldCByZXN1bHQ9dGhpcztjb25zdCBwcm9wZXJ0aWVzPUpTT04ucGFyc2UoYXJyYXlTdHIpO2ZvcihsZXQgaT0wLG49cHJvcGVydGllcy5sZW5ndGg7aTxuOysraSkKcmVzdWx0PXJlc3VsdFtwcm9wZXJ0aWVzW2ldXTtyZXR1cm4gcmVzdWx0O30KY29uc3QgYXJncz1be3ZhbHVlOkpTT04uc3RyaW5naWZ5KHByb3BlcnR5UGF0aCl9XTt0aGlzLmNhbGxGdW5jdGlvbihyZW1vdGVGdW5jdGlvbixhcmdzLGNhbGxiYWNrKTt9CmRvR2V0UHJvcGVydGllcyhvd25Qcm9wZXJ0aWVzLGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKXtpZighdGhpcy5fb2JqZWN0SWQpe2NhbGxiYWNrKG51bGwsbnVsbCk7cmV0dXJuO30KdGhpcy5fcnVudGltZUFnZW50Lmludm9rZV9nZXRQcm9wZXJ0aWVzKHtvYmplY3RJZDp0aGlzLl9vYmplY3RJZCxvd25Qcm9wZXJ0aWVzLGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3fSkudGhlbihyZW1vdGVPYmplY3RCaW5kZXIuYmluZCh0aGlzKSk7ZnVuY3Rpb24gcmVtb3RlT2JqZWN0QmluZGVyKHJlc3BvbnNlKXtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pe2NhbGxiYWNrKG51bGwsbnVsbCk7cmV0dXJuO30KaWYocmVzcG9uc2UuZXhjZXB0aW9uRGV0YWlscyl7dGhpcy5fcnVudGltZU1vZGVsLmV4Y2VwdGlvblRocm93bihEYXRlLm5vdygpLHJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpO2NhbGxiYWNrKG51bGwsbnVsbCk7cmV0dXJuO30KY29uc3QgcHJvcGVydGllcz1yZXNwb25zZS5yZXN1bHQ7Y29uc3QgaW50ZXJuYWxQcm9wZXJ0aWVzPXJlc3BvbnNlLmludGVybmFsUHJvcGVydGllcztjb25zdCByZXN1bHQ9W107Zm9yKGxldCBpPTA7cHJvcGVydGllcyYmaTxwcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3BlcnR5PXByb3BlcnRpZXNbaV07Y29uc3QgcHJvcGVydHlWYWx1ZT1wcm9wZXJ0eS52YWx1ZT90aGlzLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KHByb3BlcnR5LnZhbHVlKTpudWxsO2NvbnN0IHByb3BlcnR5U3ltYm9sPXByb3BlcnR5LnN5bWJvbD90aGlzLl9ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0KHByb3BlcnR5LnN5bWJvbCk6bnVsbDtjb25zdCByZW1vdGVQcm9wZXJ0eT1uZXcgU0RLLlJlbW90ZU9iamVjdFByb3BlcnR5KHByb3BlcnR5Lm5hbWUscHJvcGVydHlWYWx1ZSwhIXByb3BlcnR5LmVudW1lcmFibGUsISFwcm9wZXJ0eS53cml0YWJsZSwhIXByb3BlcnR5LmlzT3duLCEhcHJvcGVydHkud2FzVGhyb3duLHByb3BlcnR5U3ltYm9sKTtpZih0eXBlb2YgcHJvcGVydHkudmFsdWU9PT0ndW5kZWZpbmVkJyl7aWYocHJvcGVydHkuZ2V0JiZwcm9wZXJ0eS5nZXQudHlwZSE9PSd1bmRlZmluZWQnKQpyZW1vdGVQcm9wZXJ0eS5nZXR0ZXI9dGhpcy5fcnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdChwcm9wZXJ0eS5nZXQpO2lmKHByb3BlcnR5LnNldCYmcHJvcGVydHkuc2V0LnR5cGUhPT0ndW5kZWZpbmVkJykKcmVtb3RlUHJvcGVydHkuc2V0dGVyPXRoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocHJvcGVydHkuc2V0KTt9CnJlc3VsdC5wdXNoKHJlbW90ZVByb3BlcnR5KTt9CmxldCBpbnRlcm5hbFByb3BlcnRpZXNSZXN1bHQ9bnVsbDtpZihpbnRlcm5hbFByb3BlcnRpZXMpe2ludGVybmFsUHJvcGVydGllc1Jlc3VsdD1bXTtmb3IobGV0IGk9MDtpPGludGVybmFsUHJvcGVydGllcy5sZW5ndGg7aSsrKXtjb25zdCBwcm9wZXJ0eT1pbnRlcm5hbFByb3BlcnRpZXNbaV07aWYoIXByb3BlcnR5LnZhbHVlKQpjb250aW51ZTtjb25zdCBwcm9wZXJ0eVZhbHVlPXRoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocHJvcGVydHkudmFsdWUpO2ludGVybmFsUHJvcGVydGllc1Jlc3VsdC5wdXNoKG5ldyBTREsuUmVtb3RlT2JqZWN0UHJvcGVydHkocHJvcGVydHkubmFtZSxwcm9wZXJ0eVZhbHVlLHRydWUsZmFsc2UsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdHJ1ZSkpO319CmNhbGxiYWNrKHJlc3VsdCxpbnRlcm5hbFByb3BlcnRpZXNSZXN1bHQpO319CmFzeW5jIHNldFByb3BlcnR5VmFsdWUobmFtZSx2YWx1ZSl7aWYoIXRoaXMuX29iamVjdElkKQpyZXR1cm5gQ2FuJ3Qgc2V0IGEgcHJvcGVydHkgb2Ygbm9uLW9iamVjdC5gO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX3J1bnRpbWVBZ2VudC5pbnZva2VfZXZhbHVhdGUoe2V4cHJlc3Npb246dmFsdWUsc2lsZW50OnRydWV9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fHJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpe3JldHVybiByZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fChyZXNwb25zZS5yZXN1bHQudHlwZSE9PSdzdHJpbmcnP3Jlc3BvbnNlLnJlc3VsdC5kZXNjcmlwdGlvbjoocmVzcG9uc2UucmVzdWx0LnZhbHVlKSk7fQppZih0eXBlb2YgbmFtZT09PSdzdHJpbmcnKQpuYW1lPVNESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQobmFtZSk7Y29uc3QgcmVzdWx0UHJvbWlzZT10aGlzLmRvU2V0T2JqZWN0UHJvcGVydHlWYWx1ZShyZXNwb25zZS5yZXN1bHQsbmFtZSk7aWYocmVzcG9uc2UucmVzdWx0Lm9iamVjdElkKQp0aGlzLl9ydW50aW1lQWdlbnQucmVsZWFzZU9iamVjdChyZXNwb25zZS5yZXN1bHQub2JqZWN0SWQpO3JldHVybiByZXN1bHRQcm9taXNlO30KYXN5bmMgZG9TZXRPYmplY3RQcm9wZXJ0eVZhbHVlKHJlc3VsdCxuYW1lKXtjb25zdCBzZXRQcm9wZXJ0eVZhbHVlRnVuY3Rpb249J2Z1bmN0aW9uKGEsIGIpIHsgdGhpc1thXSA9IGI7IH0nO2NvbnN0IGFyZ3Y9W25hbWUsU0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudChyZXN1bHQpXTtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9ydW50aW1lQWdlbnQuaW52b2tlX2NhbGxGdW5jdGlvbk9uKHtvYmplY3RJZDp0aGlzLl9vYmplY3RJZCxmdW5jdGlvbkRlY2xhcmF0aW9uOnNldFByb3BlcnR5VmFsdWVGdW5jdGlvbixhcmd1bWVudHM6YXJndixzaWxlbnQ6dHJ1ZX0pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXTtyZXR1cm4gZXJyb3J8fHJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHM/ZXJyb3J8fHJlc3BvbnNlLnJlc3VsdC5kZXNjcmlwdGlvbjp1bmRlZmluZWQ7fQphc3luYyBkZWxldGVQcm9wZXJ0eShuYW1lKXtpZighdGhpcy5fb2JqZWN0SWQpCnJldHVybmBDYW4ndCBkZWxldGUgYSBwcm9wZXJ0eSBvZiBub24tb2JqZWN0LmA7Y29uc3QgZGVsZXRlUHJvcGVydHlGdW5jdGlvbj0nZnVuY3Rpb24oYSkgeyBkZWxldGUgdGhpc1thXTsgcmV0dXJuICEoYSBpbiB0aGlzKTsgfSc7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fcnVudGltZUFnZW50Lmludm9rZV9jYWxsRnVuY3Rpb25Pbih7b2JqZWN0SWQ6dGhpcy5fb2JqZWN0SWQsZnVuY3Rpb25EZWNsYXJhdGlvbjpkZWxldGVQcm9wZXJ0eUZ1bmN0aW9uLGFyZ3VtZW50czpbbmFtZV0sc2lsZW50OnRydWV9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fHJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpCnJldHVybiByZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fHJlc3BvbnNlLnJlc3VsdC5kZXNjcmlwdGlvbjtpZighcmVzcG9uc2UucmVzdWx0LnZhbHVlKQpyZXR1cm4nRmFpbGVkIHRvIGRlbGV0ZSBwcm9wZXJ0eS4nO30KY2FsbEZ1bmN0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sYXJncyxjYWxsYmFjayl7dGhpcy5fcnVudGltZUFnZW50Lmludm9rZV9jYWxsRnVuY3Rpb25Pbih7b2JqZWN0SWQ6dGhpcy5fb2JqZWN0SWQsZnVuY3Rpb25EZWNsYXJhdGlvbjpmdW5jdGlvbkRlY2xhcmF0aW9uLnRvU3RyaW5nKCksYXJndW1lbnRzOmFyZ3Msc2lsZW50OnRydWV9KS50aGVuKHJlc3BvbnNlPT57aWYoIWNhbGxiYWNrKQpyZXR1cm47aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQpjYWxsYmFjayhudWxsLGZhbHNlKTtlbHNlCmNhbGxiYWNrKHRoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocmVzcG9uc2UucmVzdWx0KSwhIXJlc3BvbnNlLmV4Y2VwdGlvbkRldGFpbHMpO30pO30KY2FsbEZ1bmN0aW9uSlNPTihmdW5jdGlvbkRlY2xhcmF0aW9uLGFyZ3MsY2FsbGJhY2spe3RoaXMuX3J1bnRpbWVBZ2VudC5pbnZva2VfY2FsbEZ1bmN0aW9uT24oe29iamVjdElkOnRoaXMuX29iamVjdElkLGZ1bmN0aW9uRGVjbGFyYXRpb246ZnVuY3Rpb25EZWNsYXJhdGlvbi50b1N0cmluZygpLGFyZ3VtZW50czphcmdzLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6dHJ1ZX0pLnRoZW4ocmVzcG9uc2U9PmNhbGxiYWNrKHJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8cmVzcG9uc2UuZXhjZXB0aW9uRGV0YWlscz9udWxsOnJlc3BvbnNlLnJlc3VsdC52YWx1ZSkpO30KcmVsZWFzZSgpe2lmKCF0aGlzLl9vYmplY3RJZCkKcmV0dXJuO3RoaXMuX3J1bnRpbWVBZ2VudC5yZWxlYXNlT2JqZWN0KHRoaXMuX29iamVjdElkKTt9CmFycmF5TGVuZ3RoKCl7cmV0dXJuIFNESy5SZW1vdGVPYmplY3QuYXJyYXlMZW5ndGgodGhpcyk7fQpkZWJ1Z2dlck1vZGVsKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVNb2RlbC5kZWJ1Z2dlck1vZGVsKCk7fQpydW50aW1lTW9kZWwoKXtyZXR1cm4gdGhpcy5fcnVudGltZU1vZGVsO30KaXNOb2RlKCl7cmV0dXJuISF0aGlzLl9vYmplY3RJZCYmdGhpcy50eXBlPT09J29iamVjdCcmJnRoaXMuc3VidHlwZT09PSdub2RlJzt9fTtTREsuU2NvcGVSZW1vdGVPYmplY3Q9Y2xhc3MgZXh0ZW5kcyBTREsuUmVtb3RlT2JqZWN0SW1wbHtjb25zdHJ1Y3RvcihydW50aW1lTW9kZWwsb2JqZWN0SWQsc2NvcGVSZWYsdHlwZSxzdWJ0eXBlLHZhbHVlLHVuc2VyaWFsaXphYmxlVmFsdWUsZGVzY3JpcHRpb24scHJldmlldyl7c3VwZXIocnVudGltZU1vZGVsLG9iamVjdElkLHR5cGUsc3VidHlwZSx2YWx1ZSx1bnNlcmlhbGl6YWJsZVZhbHVlLGRlc2NyaXB0aW9uLHByZXZpZXcpO3RoaXMuX3Njb3BlUmVmPXNjb3BlUmVmO3RoaXMuX3NhdmVkU2NvcGVQcm9wZXJ0aWVzPXVuZGVmaW5lZDt9CmRvR2V0UHJvcGVydGllcyhvd25Qcm9wZXJ0aWVzLGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKXtpZihhY2Nlc3NvclByb3BlcnRpZXNPbmx5KXtjYWxsYmFjayhbXSxbXSk7cmV0dXJuO30KaWYodGhpcy5fc2F2ZWRTY29wZVByb3BlcnRpZXMpe2NhbGxiYWNrKHRoaXMuX3NhdmVkU2NvcGVQcm9wZXJ0aWVzLnNsaWNlKCksW10pO3JldHVybjt9CmZ1bmN0aW9uIHdyYXBwZWRDYWxsYmFjayhwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyl7aWYodGhpcy5fc2NvcGVSZWYmJkFycmF5LmlzQXJyYXkocHJvcGVydGllcykpe3RoaXMuX3NhdmVkU2NvcGVQcm9wZXJ0aWVzPXByb3BlcnRpZXMuc2xpY2UoKTtpZighdGhpcy5fc2NvcGVSZWYuY2FsbEZyYW1lSWQpe2Zvcihjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLl9zYXZlZFNjb3BlUHJvcGVydGllcykKcHJvcGVydHkud3JpdGFibGU9ZmFsc2U7fX0KY2FsbGJhY2socHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpO30KZ2VuZXJhdGVQcmV2aWV3PXRydWU7c3VwZXIuZG9HZXRQcm9wZXJ0aWVzKG93blByb3BlcnRpZXMsYWNjZXNzb3JQcm9wZXJ0aWVzT25seSxnZW5lcmF0ZVByZXZpZXcsd3JhcHBlZENhbGxiYWNrLmJpbmQodGhpcykpO30KYXN5bmMgZG9TZXRPYmplY3RQcm9wZXJ0eVZhbHVlKHJlc3VsdCxhcmd1bWVudE5hbWUpe2NvbnN0IG5hbWU9KGFyZ3VtZW50TmFtZS52YWx1ZSk7Y29uc3QgZXJyb3I9YXdhaXQgdGhpcy5kZWJ1Z2dlck1vZGVsKCkuc2V0VmFyaWFibGVWYWx1ZSh0aGlzLl9zY29wZVJlZi5udW1iZXIsbmFtZSxTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHJlc3VsdCksdGhpcy5fc2NvcGVSZWYuY2FsbEZyYW1lSWQpO2lmKGVycm9yKQpyZXR1cm4gZXJyb3I7aWYodGhpcy5fc2F2ZWRTY29wZVByb3BlcnRpZXMpe2Zvcihjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLl9zYXZlZFNjb3BlUHJvcGVydGllcyl7aWYocHJvcGVydHkubmFtZT09PW5hbWUpCnByb3BlcnR5LnZhbHVlPXRoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocmVzdWx0KTt9fX19O1NESy5TY29wZVJlZj1jbGFzc3tjb25zdHJ1Y3RvcihudW1iZXIsY2FsbEZyYW1lSWQpe3RoaXMubnVtYmVyPW51bWJlcjt0aGlzLmNhbGxGcmFtZUlkPWNhbGxGcmFtZUlkO319O1NESy5SZW1vdGVPYmplY3RQcm9wZXJ0eT1jbGFzc3tjb25zdHJ1Y3RvcihuYW1lLHZhbHVlLGVudW1lcmFibGUsd3JpdGFibGUsaXNPd24sd2FzVGhyb3duLHN5bWJvbCxzeW50aGV0aWMsc3ludGhldGljU2V0dGVyKXt0aGlzLm5hbWU9bmFtZTtpZih2YWx1ZSE9PW51bGwpCnRoaXMudmFsdWU9dmFsdWU7dGhpcy5lbnVtZXJhYmxlPXR5cGVvZiBlbnVtZXJhYmxlIT09J3VuZGVmaW5lZCc/ZW51bWVyYWJsZTp0cnVlO2NvbnN0IGlzTm9uU3ludGhldGljT3JTeW50aGV0aWNXcml0YWJsZT0hc3ludGhldGljfHwhIXN5bnRoZXRpY1NldHRlcjt0aGlzLndyaXRhYmxlPXR5cGVvZiB3cml0YWJsZSE9PSd1bmRlZmluZWQnP3dyaXRhYmxlOmlzTm9uU3ludGhldGljT3JTeW50aGV0aWNXcml0YWJsZTt0aGlzLmlzT3duPSEhaXNPd247dGhpcy53YXNUaHJvd249ISF3YXNUaHJvd247aWYoc3ltYm9sKQp0aGlzLnN5bWJvbD1zeW1ib2w7dGhpcy5zeW50aGV0aWM9ISFzeW50aGV0aWM7aWYoc3ludGhldGljU2V0dGVyKQp0aGlzLnN5bnRoZXRpY1NldHRlcj1zeW50aGV0aWNTZXR0ZXI7fQphc3luYyBzZXRTeW50aGV0aWNWYWx1ZShleHByZXNzaW9uKXtpZighdGhpcy5zeW50aGV0aWNTZXR0ZXIpCnJldHVybiBmYWxzZTtjb25zdCByZXN1bHQ9YXdhaXQgdGhpcy5zeW50aGV0aWNTZXR0ZXIoZXhwcmVzc2lvbik7aWYocmVzdWx0KQp0aGlzLnZhbHVlPXJlc3VsdDtyZXR1cm4hIXJlc3VsdDt9CmlzQWNjZXNzb3JQcm9wZXJ0eSgpe3JldHVybiEhKHRoaXMuZ2V0dGVyfHx0aGlzLnNldHRlcik7fX07U0RLLkxvY2FsSlNPTk9iamVjdD1jbGFzcyBleHRlbmRzIFNESy5SZW1vdGVPYmplY3R7Y29uc3RydWN0b3IodmFsdWUpe3N1cGVyKCk7dGhpcy5fdmFsdWU9dmFsdWU7dGhpcy5fY2FjaGVkRGVzY3JpcHRpb247dGhpcy5fY2FjaGVkQ2hpbGRyZW47fQpnZXQgb2JqZWN0SWQoKXtyZXR1cm4gdW5kZWZpbmVkO30KZ2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlO30KdW5zZXJpYWxpemFibGVWYWx1ZSgpe2NvbnN0IHVuc2VyaWFsaXphYmxlRGVzY3JpcHRpb249U0RLLlJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZURlc2NyaXB0aW9uKHRoaXMuX3ZhbHVlKTtyZXR1cm4gdW5zZXJpYWxpemFibGVEZXNjcmlwdGlvbnx8dW5kZWZpbmVkO30KZ2V0IGRlc2NyaXB0aW9uKCl7aWYodGhpcy5fY2FjaGVkRGVzY3JpcHRpb24pCnJldHVybiB0aGlzLl9jYWNoZWREZXNjcmlwdGlvbjtmdW5jdGlvbiBmb3JtYXRBcnJheUl0ZW0ocHJvcGVydHkpe3JldHVybiB0aGlzLl9mb3JtYXRWYWx1ZShwcm9wZXJ0eS52YWx1ZSk7fQpmdW5jdGlvbiBmb3JtYXRPYmplY3RJdGVtKHByb3BlcnR5KXtsZXQgbmFtZT1wcm9wZXJ0eS5uYW1lO2lmKC9eXHN8XHMkfF4kfFxuLy50ZXN0KG5hbWUpKQpuYW1lPSciJytuYW1lLnJlcGxhY2UoL1xuL2csJ1x1MjFCNScpKyciJztyZXR1cm4gbmFtZSsnOiAnK3RoaXMuX2Zvcm1hdFZhbHVlKHByb3BlcnR5LnZhbHVlKTt9CmlmKHRoaXMudHlwZT09PSdvYmplY3QnKXtzd2l0Y2godGhpcy5zdWJ0eXBlKXtjYXNlJ2FycmF5Jzp0aGlzLl9jYWNoZWREZXNjcmlwdGlvbj10aGlzLl9jb25jYXRlbmF0ZSgnWycsJ10nLGZvcm1hdEFycmF5SXRlbS5iaW5kKHRoaXMpKTticmVhaztjYXNlJ2RhdGUnOnRoaXMuX2NhY2hlZERlc2NyaXB0aW9uPScnK3RoaXMuX3ZhbHVlO2JyZWFrO2Nhc2UnbnVsbCc6dGhpcy5fY2FjaGVkRGVzY3JpcHRpb249J251bGwnO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY2FjaGVkRGVzY3JpcHRpb249dGhpcy5fY29uY2F0ZW5hdGUoJ3snLCd9Jyxmb3JtYXRPYmplY3RJdGVtLmJpbmQodGhpcykpO319ZWxzZXt0aGlzLl9jYWNoZWREZXNjcmlwdGlvbj1TdHJpbmcodGhpcy5fdmFsdWUpO30KcmV0dXJuIHRoaXMuX2NhY2hlZERlc2NyaXB0aW9uO30KX2Zvcm1hdFZhbHVlKHZhbHVlKXtpZighdmFsdWUpCnJldHVybid1bmRlZmluZWQnO2NvbnN0IGRlc2NyaXB0aW9uPXZhbHVlLmRlc2NyaXB0aW9ufHwnJztpZih2YWx1ZS50eXBlPT09J3N0cmluZycpCnJldHVybiciJytkZXNjcmlwdGlvbi5yZXBsYWNlKC9cbi9nLCdcdTIxQjUnKSsnIic7cmV0dXJuIGRlc2NyaXB0aW9uO30KX2NvbmNhdGVuYXRlKHByZWZpeCxzdWZmaXgsZm9ybWF0UHJvcGVydHkpe2NvbnN0IHByZXZpZXdDaGFycz0xMDA7bGV0IGJ1ZmZlcj1wcmVmaXg7Y29uc3QgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW4oKTtmb3IobGV0IGk9MDtpPGNoaWxkcmVuLmxlbmd0aDsrK2kpe2NvbnN0IGl0ZW1EZXNjcmlwdGlvbj1mb3JtYXRQcm9wZXJ0eShjaGlsZHJlbltpXSk7aWYoYnVmZmVyLmxlbmd0aCtpdGVtRGVzY3JpcHRpb24ubGVuZ3RoPnByZXZpZXdDaGFycyl7YnVmZmVyKz0nLFx1MjAyNic7YnJlYWs7fQppZihpKQpidWZmZXIrPScsICc7YnVmZmVyKz1pdGVtRGVzY3JpcHRpb247fQpidWZmZXIrPXN1ZmZpeDtyZXR1cm4gYnVmZmVyO30KZ2V0IHR5cGUoKXtyZXR1cm4gdHlwZW9mIHRoaXMuX3ZhbHVlO30KZ2V0IHN1YnR5cGUoKXtpZih0aGlzLl92YWx1ZT09PW51bGwpCnJldHVybidudWxsJztpZihBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkKcmV0dXJuJ2FycmF5JztpZih0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERhdGUpCnJldHVybidkYXRlJztyZXR1cm4gdW5kZWZpbmVkO30KZ2V0IGhhc0NoaWxkcmVuKCl7aWYoKHR5cGVvZiB0aGlzLl92YWx1ZSE9PSdvYmplY3QnKXx8KHRoaXMuX3ZhbHVlPT09bnVsbCkpCnJldHVybiBmYWxzZTtyZXR1cm4hIU9iamVjdC5rZXlzKCh0aGlzLl92YWx1ZSkpLmxlbmd0aDt9CmdldE93blByb3BlcnRpZXMoZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKXtjYWxsYmFjayh0aGlzLl9jaGlsZHJlbigpLG51bGwpO30KZ2V0QWxsUHJvcGVydGllcyhhY2Nlc3NvclByb3BlcnRpZXNPbmx5LGdlbmVyYXRlUHJldmlldyxjYWxsYmFjayl7aWYoYWNjZXNzb3JQcm9wZXJ0aWVzT25seSkKY2FsbGJhY2soW10sbnVsbCk7ZWxzZQpjYWxsYmFjayh0aGlzLl9jaGlsZHJlbigpLG51bGwpO30KX2NoaWxkcmVuKCl7aWYoIXRoaXMuaGFzQ2hpbGRyZW4pCnJldHVybltdO2NvbnN0IHZhbHVlPSh0aGlzLl92YWx1ZSk7ZnVuY3Rpb24gYnVpbGRQcm9wZXJ0eShwcm9wTmFtZSl7bGV0IHByb3BWYWx1ZT12YWx1ZVtwcm9wTmFtZV07aWYoIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBTREsuUmVtb3RlT2JqZWN0KSkKcHJvcFZhbHVlPVNESy5SZW1vdGVPYmplY3QuZnJvbUxvY2FsT2JqZWN0KHByb3BWYWx1ZSk7cmV0dXJuIG5ldyBTREsuUmVtb3RlT2JqZWN0UHJvcGVydHkocHJvcE5hbWUscHJvcFZhbHVlKTt9CmlmKCF0aGlzLl9jYWNoZWRDaGlsZHJlbikKdGhpcy5fY2FjaGVkQ2hpbGRyZW49T2JqZWN0LmtleXModmFsdWUpLm1hcChidWlsZFByb3BlcnR5KTtyZXR1cm4gdGhpcy5fY2FjaGVkQ2hpbGRyZW47fQppc0Vycm9yKCl7cmV0dXJuIGZhbHNlO30KYXJyYXlMZW5ndGgoKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSk/dGhpcy5fdmFsdWUubGVuZ3RoOjA7fQpjYWxsRnVuY3Rpb24oZnVuY3Rpb25EZWNsYXJhdGlvbixhcmdzLGNhbGxiYWNrKXtjb25zdCB0YXJnZXQ9KHRoaXMuX3ZhbHVlKTtjb25zdCByYXdBcmdzPWFyZ3M/YXJncy5tYXAoYXJnPT5hcmcudmFsdWUpOltdO2xldCByZXN1bHQ7bGV0IHdhc1Rocm93bj1mYWxzZTt0cnl7cmVzdWx0PWZ1bmN0aW9uRGVjbGFyYXRpb24uYXBwbHkodGFyZ2V0LHJhd0FyZ3MpO31jYXRjaChlKXt3YXNUaHJvd249dHJ1ZTt9CmlmKCFjYWxsYmFjaykKcmV0dXJuO2NhbGxiYWNrKFNESy5SZW1vdGVPYmplY3QuZnJvbUxvY2FsT2JqZWN0KHJlc3VsdCksd2FzVGhyb3duKTt9CmNhbGxGdW5jdGlvbkpTT04oZnVuY3Rpb25EZWNsYXJhdGlvbixhcmdzLGNhbGxiYWNrKXtjb25zdCB0YXJnZXQ9KHRoaXMuX3ZhbHVlKTtjb25zdCByYXdBcmdzPWFyZ3M/YXJncy5tYXAoYXJnPT5hcmcudmFsdWUpOltdO2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1mdW5jdGlvbkRlY2xhcmF0aW9uLmFwcGx5KHRhcmdldCxyYXdBcmdzKTt9Y2F0Y2goZSl7cmVzdWx0PW51bGw7fQpjYWxsYmFjayhyZXN1bHQpO319O1NESy5SZW1vdGVBcnJheT1jbGFzc3tjb25zdHJ1Y3RvcihvYmplY3Qpe3RoaXMuX29iamVjdD1vYmplY3Q7fQpzdGF0aWMgb2JqZWN0QXNBcnJheShvYmplY3Qpe2lmKCFvYmplY3R8fG9iamVjdC50eXBlIT09J29iamVjdCd8fChvYmplY3Quc3VidHlwZSE9PSdhcnJheScmJm9iamVjdC5zdWJ0eXBlIT09J3R5cGVkYXJyYXknKSkKdGhyb3cgbmV3IEVycm9yKCdPYmplY3QgaXMgZW1wdHkgb3Igbm90IGFuIGFycmF5Jyk7cmV0dXJuIG5ldyBTREsuUmVtb3RlQXJyYXkob2JqZWN0KTt9CnN0YXRpYyBjcmVhdGVGcm9tUmVtb3RlT2JqZWN0cyhvYmplY3RzKXtpZighb2JqZWN0cy5sZW5ndGgpCnRocm93IG5ldyBFcnJvcignSW5wdXQgYXJyYXkgaXMgZW1wdHknKTtjb25zdCBvYmplY3RBcmd1bWVudHM9W107Zm9yKGxldCBpPTA7aTxvYmplY3RzLmxlbmd0aDsrK2kpCm9iamVjdEFyZ3VtZW50cy5wdXNoKFNESy5SZW1vdGVPYmplY3QudG9DYWxsQXJndW1lbnQob2JqZWN0c1tpXSkpO3JldHVybiBvYmplY3RzWzBdLmNhbGxGdW5jdGlvblByb21pc2UoY3JlYXRlQXJyYXksb2JqZWN0QXJndW1lbnRzKS50aGVuKHJldHVyblJlbW90ZUFycmF5KTtmdW5jdGlvbiBjcmVhdGVBcnJheSgpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSkKcmV0dXJuIG5ldyBBcnJheShhcmd1bWVudHMpO3JldHVyblthcmd1bWVudHNbMF1dO30KZnVuY3Rpb24gcmV0dXJuUmVtb3RlQXJyYXkocmVzdWx0KXtpZihyZXN1bHQud2FzVGhyb3dufHwhcmVzdWx0Lm9iamVjdCkKdGhyb3cgbmV3IEVycm9yKCdDYWxsIGZ1bmN0aW9uIHRocm93cyBleGNlcHRpb25zIG9yIHJldHVybnMgZW1wdHkgdmFsdWUnKTtyZXR1cm4gU0RLLlJlbW90ZUFycmF5Lm9iamVjdEFzQXJyYXkocmVzdWx0Lm9iamVjdCk7fX0KYXQoaW5kZXgpe2lmKGluZGV4PDB8fGluZGV4PnRoaXMuX29iamVjdC5hcnJheUxlbmd0aCgpKQp0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiByYW5nZScpO3JldHVybiB0aGlzLl9vYmplY3QuY2FsbEZ1bmN0aW9uUHJvbWlzZShhdCxbU0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudChpbmRleCldKS50aGVuKGFzc2VydENhbGxGdW5jdGlvblJlc3VsdCk7ZnVuY3Rpb24gYXQoaW5kZXgpe3JldHVybiB0aGlzW2luZGV4XTt9CmZ1bmN0aW9uIGFzc2VydENhbGxGdW5jdGlvblJlc3VsdChyZXN1bHQpe2lmKHJlc3VsdC53YXNUaHJvd258fCFyZXN1bHQub2JqZWN0KQp0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbiBpbiBjYWxsRnVuY3Rpb24gb3IgcmVzdWx0IHZhbHVlIGlzIGVtcHR5Jyk7cmV0dXJuIHJlc3VsdC5vYmplY3Q7fX0KbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX29iamVjdC5hcnJheUxlbmd0aCgpO30KbWFwKGZ1bmMpe2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGgoKTsrK2kpCnByb21pc2VzLnB1c2godGhpcy5hdChpKS50aGVuKGZ1bmMpKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30Kb2JqZWN0KCl7cmV0dXJuIHRoaXMuX29iamVjdDt9fTtTREsuUmVtb3RlRnVuY3Rpb249Y2xhc3N7Y29uc3RydWN0b3Iob2JqZWN0KXt0aGlzLl9vYmplY3Q9b2JqZWN0O30Kc3RhdGljIG9iamVjdEFzRnVuY3Rpb24ob2JqZWN0KXtpZighb2JqZWN0fHxvYmplY3QudHlwZSE9PSdmdW5jdGlvbicpCnRocm93IG5ldyBFcnJvcignT2JqZWN0IGlzIGVtcHR5IG9yIG5vdCBhIGZ1bmN0aW9uJyk7cmV0dXJuIG5ldyBTREsuUmVtb3RlRnVuY3Rpb24ob2JqZWN0KTt9CnRhcmdldEZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29iamVjdC5nZXRPd25Qcm9wZXJ0aWVzUHJvbWlzZShmYWxzZSkudGhlbih0YXJnZXRGdW5jdGlvbi5iaW5kKHRoaXMpKTtmdW5jdGlvbiB0YXJnZXRGdW5jdGlvbihvd25Qcm9wZXJ0aWVzKXtpZighb3duUHJvcGVydGllcy5pbnRlcm5hbFByb3BlcnRpZXMpCnJldHVybiB0aGlzLl9vYmplY3Q7Y29uc3QgaW50ZXJuYWxQcm9wZXJ0aWVzPW93blByb3BlcnRpZXMuaW50ZXJuYWxQcm9wZXJ0aWVzO2Zvcihjb25zdCBwcm9wZXJ0eSBvZiBpbnRlcm5hbFByb3BlcnRpZXMpe2lmKHByb3BlcnR5Lm5hbWU9PT0nW1tUYXJnZXRGdW5jdGlvbl1dJykKcmV0dXJuIHByb3BlcnR5LnZhbHVlO30KcmV0dXJuIHRoaXMuX29iamVjdDt9fQp0YXJnZXRGdW5jdGlvbkRldGFpbHMoKXtyZXR1cm4gdGhpcy50YXJnZXRGdW5jdGlvbigpLnRoZW4oZnVuY3Rpb25EZXRhaWxzLmJpbmQodGhpcykpO2Z1bmN0aW9uIGZ1bmN0aW9uRGV0YWlscyh0YXJnZXRGdW5jdGlvbil7Y29uc3QgYm91bmRSZWxlYXNlRnVuY3Rpb25EZXRhaWxzPXJlbGVhc2VUYXJnZXRGdW5jdGlvbi5iaW5kKG51bGwsdGhpcy5fb2JqZWN0IT09dGFyZ2V0RnVuY3Rpb24/dGFyZ2V0RnVuY3Rpb246bnVsbCk7cmV0dXJuIHRhcmdldEZ1bmN0aW9uLmRlYnVnZ2VyTW9kZWwoKS5mdW5jdGlvbkRldGFpbHNQcm9taXNlKHRhcmdldEZ1bmN0aW9uKS50aGVuKGJvdW5kUmVsZWFzZUZ1bmN0aW9uRGV0YWlscyk7fQpmdW5jdGlvbiByZWxlYXNlVGFyZ2V0RnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24sZnVuY3Rpb25EZXRhaWxzKXtpZih0YXJnZXRGdW5jdGlvbikKdGFyZ2V0RnVuY3Rpb24ucmVsZWFzZSgpO3JldHVybiBmdW5jdGlvbkRldGFpbHM7fX0Kb2JqZWN0KCl7cmV0dXJuIHRoaXMuX29iamVjdDt9fTtTREsuUmVtb3RlT2JqZWN0Ll9kZXNjcmlwdGlvbkxlbmd0aFBhcmVuUmVnZXg9L1woKFswLTldKylcKS87U0RLLlJlbW90ZU9iamVjdC5fZGVzY3JpcHRpb25MZW5ndGhTcXVhcmVSZWdleD0vXFsoWzAtOV0rKVxdLztTREsuUmVtb3RlT2JqZWN0LlVuc2VyaWFsaXphYmxlTnVtYmVyPXtOZWdhdGl2ZTA6KCctMCcpLE5hTjooJ05hTicpLEluZmluaXR5OignSW5maW5pdHknKSxOZWdhdGl2ZUluZmluaXR5OignLUluZmluaXR5Jyl9OztTREsuUmVzb3VyY2U9Y2xhc3N7Y29uc3RydWN0b3IocmVzb3VyY2VUcmVlTW9kZWwscmVxdWVzdCx1cmwsZG9jdW1lbnRVUkwsZnJhbWVJZCxsb2FkZXJJZCx0eXBlLG1pbWVUeXBlLGxhc3RNb2RpZmllZCxjb250ZW50U2l6ZSl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWw9cmVzb3VyY2VUcmVlTW9kZWw7dGhpcy5fcmVxdWVzdD1yZXF1ZXN0O3RoaXMudXJsPXVybDt0aGlzLl9kb2N1bWVudFVSTD1kb2N1bWVudFVSTDt0aGlzLl9mcmFtZUlkPWZyYW1lSWQ7dGhpcy5fbG9hZGVySWQ9bG9hZGVySWQ7dGhpcy5fdHlwZT10eXBlfHxDb21tb24ucmVzb3VyY2VUeXBlcy5PdGhlcjt0aGlzLl9taW1lVHlwZT1taW1lVHlwZTt0aGlzLl9sYXN0TW9kaWZpZWQ9bGFzdE1vZGlmaWVkJiZsYXN0TW9kaWZpZWQuaXNWYWxpZCgpP2xhc3RNb2RpZmllZDpudWxsO3RoaXMuX2NvbnRlbnRTaXplPWNvbnRlbnRTaXplO3RoaXMuX2NvbnRlbnQ7dGhpcy5fY29udGVudEVuY29kZWQ7dGhpcy5fcGVuZGluZ0NvbnRlbnRDYWxsYmFja3M9W107aWYodGhpcy5fcmVxdWVzdCYmIXRoaXMuX3JlcXVlc3QuZmluaXNoZWQpCnRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyx0aGlzLl9yZXF1ZXN0RmluaXNoZWQsdGhpcyk7fQpsYXN0TW9kaWZpZWQoKXtpZih0aGlzLl9sYXN0TW9kaWZpZWR8fCF0aGlzLl9yZXF1ZXN0KQpyZXR1cm4gdGhpcy5fbGFzdE1vZGlmaWVkO2NvbnN0IGxhc3RNb2RpZmllZEhlYWRlcj10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlTGFzdE1vZGlmaWVkKCk7Y29uc3QgZGF0ZT1sYXN0TW9kaWZpZWRIZWFkZXI/bmV3IERhdGUobGFzdE1vZGlmaWVkSGVhZGVyKTpudWxsO3RoaXMuX2xhc3RNb2RpZmllZD1kYXRlJiZkYXRlLmlzVmFsaWQoKT9kYXRlOm51bGw7cmV0dXJuIHRoaXMuX2xhc3RNb2RpZmllZDt9CmNvbnRlbnRTaXplKCl7aWYodHlwZW9mIHRoaXMuX2NvbnRlbnRTaXplPT09J251bWJlcid8fCF0aGlzLl9yZXF1ZXN0KQpyZXR1cm4gdGhpcy5fY29udGVudFNpemU7cmV0dXJuIHRoaXMuX3JlcXVlc3QucmVzb3VyY2VTaXplO30KZ2V0IHJlcXVlc3QoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdDt9CmdldCB1cmwoKXtyZXR1cm4gdGhpcy5fdXJsO30Kc2V0IHVybCh4KXt0aGlzLl91cmw9eDt0aGlzLl9wYXJzZWRVUkw9bmV3IENvbW1vbi5QYXJzZWRVUkwoeCk7fQpnZXQgcGFyc2VkVVJMKCl7cmV0dXJuIHRoaXMuX3BhcnNlZFVSTDt9CmdldCBkb2N1bWVudFVSTCgpe3JldHVybiB0aGlzLl9kb2N1bWVudFVSTDt9CmdldCBmcmFtZUlkKCl7cmV0dXJuIHRoaXMuX2ZyYW1lSWQ7fQpnZXQgbG9hZGVySWQoKXtyZXR1cm4gdGhpcy5fbG9hZGVySWQ7fQpnZXQgZGlzcGxheU5hbWUoKXtyZXR1cm4gdGhpcy5fcGFyc2VkVVJMLmRpc3BsYXlOYW1lO30KcmVzb3VyY2VUeXBlKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3Q/dGhpcy5fcmVxdWVzdC5yZXNvdXJjZVR5cGUoKTp0aGlzLl90eXBlO30KZ2V0IG1pbWVUeXBlKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3Q/dGhpcy5fcmVxdWVzdC5taW1lVHlwZTp0aGlzLl9taW1lVHlwZTt9CmdldCBjb250ZW50KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ7fQpjb250ZW50VVJMKCl7cmV0dXJuIHRoaXMuX3VybDt9CmNvbnRlbnRUeXBlKCl7aWYodGhpcy5yZXNvdXJjZVR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50JiZ0aGlzLm1pbWVUeXBlLmluZGV4T2YoJ2phdmFzY3JpcHQnKSE9PS0xKQpyZXR1cm4gQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0O3JldHVybiB0aGlzLnJlc291cmNlVHlwZSgpO30KYXN5bmMgY29udGVudEVuY29kZWQoKXthd2FpdCB0aGlzLnJlcXVlc3RDb250ZW50KCk7cmV0dXJuIHRoaXMuX2NvbnRlbnRFbmNvZGVkO30KcmVxdWVzdENvbnRlbnQoKXtpZih0eXBlb2YgdGhpcy5fY29udGVudCE9PSd1bmRlZmluZWQnKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NvbnRlbnQpO2xldCBjYWxsYmFjaztjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9PmNhbGxiYWNrPWZ1bGZpbGwpO3RoaXMuX3BlbmRpbmdDb250ZW50Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO2lmKCF0aGlzLl9yZXF1ZXN0fHx0aGlzLl9yZXF1ZXN0LmZpbmlzaGVkKQp0aGlzLl9pbm5lclJlcXVlc3RDb250ZW50KCk7cmV0dXJuIHByb21pc2U7fQpjYW5vbmljYWxNaW1lVHlwZSgpe3JldHVybiB0aGlzLmNvbnRlbnRUeXBlKCkuY2Fub25pY2FsTWltZVR5cGUoKXx8dGhpcy5taW1lVHlwZTt9CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2lmKCF0aGlzLmZyYW1lSWQpCnJldHVybltdO2lmKHRoaXMucmVxdWVzdCkKcmV0dXJuIHRoaXMucmVxdWVzdC5zZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtjb25zdCByZXN1bHQ9YXdhaXQgdGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwudGFyZ2V0KCkucGFnZUFnZW50KCkuc2VhcmNoSW5SZXNvdXJjZSh0aGlzLmZyYW1lSWQsdGhpcy51cmwscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtyZXR1cm4gcmVzdWx0fHxbXTt9CnBvcHVsYXRlSW1hZ2VTb3VyY2UoaW1hZ2Upe2Z1bmN0aW9uIG9uUmVzb3VyY2VDb250ZW50KGNvbnRlbnQpe2xldCBpbWFnZVNyYz1Db21tb24uQ29udGVudFByb3ZpZGVyLmNvbnRlbnRBc0RhdGFVUkwoY29udGVudCx0aGlzLl9taW1lVHlwZSx0cnVlKTtpZihpbWFnZVNyYz09PW51bGwpCmltYWdlU3JjPXRoaXMuX3VybDtpbWFnZS5zcmM9aW1hZ2VTcmM7fQp0aGlzLnJlcXVlc3RDb250ZW50KCkudGhlbihvblJlc291cmNlQ29udGVudC5iaW5kKHRoaXMpKTt9Cl9yZXF1ZXN0RmluaXNoZWQoKXt0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5GaW5pc2hlZExvYWRpbmcsdGhpcy5fcmVxdWVzdEZpbmlzaGVkLHRoaXMpO2lmKHRoaXMuX3BlbmRpbmdDb250ZW50Q2FsbGJhY2tzLmxlbmd0aCkKdGhpcy5faW5uZXJSZXF1ZXN0Q29udGVudCgpO30KYXN5bmMgX2lubmVyUmVxdWVzdENvbnRlbnQoKXtpZih0aGlzLl9jb250ZW50UmVxdWVzdGVkKQpyZXR1cm47dGhpcy5fY29udGVudFJlcXVlc3RlZD10cnVlO2lmKHRoaXMucmVxdWVzdCl7Y29uc3QgY29udGVudERhdGE9YXdhaXQgdGhpcy5yZXF1ZXN0LmNvbnRlbnREYXRhKCk7dGhpcy5fY29udGVudD1jb250ZW50RGF0YS5jb250ZW50O3RoaXMuX2NvbnRlbnRFbmNvZGVkPWNvbnRlbnREYXRhLmVuY29kZWQ7fWVsc2V7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwudGFyZ2V0KCkucGFnZUFnZW50KCkuaW52b2tlX2dldFJlc291cmNlQ29udGVudCh7ZnJhbWVJZDp0aGlzLmZyYW1lSWQsdXJsOnRoaXMudXJsfSk7dGhpcy5fY29udGVudD1yZXNwb25zZVtQcm90b2NvbC5FcnJvcl0/bnVsbDpyZXNwb25zZS5jb250ZW50O3RoaXMuX2NvbnRlbnRFbmNvZGVkPXJlc3BvbnNlLmJhc2U2NEVuY29kZWQ7fQppZih0aGlzLl9jb250ZW50PT09bnVsbCkKdGhpcy5fY29udGVudEVuY29kZWQ9ZmFsc2U7Zm9yKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuX3BlbmRpbmdDb250ZW50Q2FsbGJhY2tzLnNwbGljZSgwKSkKY2FsbGJhY2sodGhpcy5fY29udGVudCk7ZGVsZXRlIHRoaXMuX2NvbnRlbnRSZXF1ZXN0ZWQ7fQpoYXNUZXh0Q29udGVudCgpe2lmKHRoaXMuX3R5cGUuaXNUZXh0VHlwZSgpKQpyZXR1cm4gdHJ1ZTtpZih0aGlzLl90eXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXIpCnJldHVybiEhdGhpcy5fY29udGVudCYmIXRoaXMuX2NvbnRlbnRFbmNvZGVkO3JldHVybiBmYWxzZTt9CmZyYW1lKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQodGhpcy5fZnJhbWVJZCk7fX07O1NESy5SZXNvdXJjZVRyZWVNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7Y29uc3QgbmV0d29ya01hbmFnZXI9dGFyZ2V0Lm1vZGVsKFNESy5OZXR3b3JrTWFuYWdlcik7aWYobmV0d29ya01hbmFnZXIpe25ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5SZXF1ZXN0RmluaXNoZWQsdGhpcy5fb25SZXF1ZXN0RmluaXNoZWQsdGhpcyk7bmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RVcGRhdGVEcm9wcGVkLHRoaXMuX29uUmVxdWVzdFVwZGF0ZURyb3BwZWQsdGhpcyk7fQp0aGlzLl9hZ2VudD10YXJnZXQucGFnZUFnZW50KCk7dGhpcy5fYWdlbnQuZW5hYmxlKCk7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyPXRhcmdldC5tb2RlbChTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyKTt0YXJnZXQucmVnaXN0ZXJQYWdlRGlzcGF0Y2hlcihuZXcgU0RLLlBhZ2VEaXNwYXRjaGVyKHRoaXMpKTt0aGlzLl9mcmFtZXM9bmV3IE1hcCgpO3RoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZD1mYWxzZTt0aGlzLl9wZW5kaW5nUmVsb2FkT3B0aW9ucz1udWxsO3RoaXMuX3JlbG9hZFN1c3BlbnNpb25Db3VudD0wO3RoaXMuX2lzSW50ZXJzdGl0aWFsU2hvd2luZz1mYWxzZTt0aGlzLm1haW5GcmFtZT1udWxsO3RoaXMuX2FnZW50LmdldFJlc291cmNlVHJlZSgpLnRoZW4odGhpcy5fcHJvY2Vzc0NhY2hlZFJlc291cmNlcy5iaW5kKHRoaXMpKTt9CnN0YXRpYyBmcmFtZUZvclJlcXVlc3QocmVxdWVzdCl7Y29uc3QgbmV0d29ya01hbmFnZXI9U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QocmVxdWVzdCk7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9bmV0d29ya01hbmFnZXI/bmV0d29ya01hbmFnZXIudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTpudWxsO2lmKCFyZXNvdXJjZVRyZWVNb2RlbCkKcmV0dXJuIG51bGw7cmV0dXJuIHJlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQocmVxdWVzdC5mcmFtZUlkKTt9CnN0YXRpYyBmcmFtZXMoKXtsZXQgcmVzdWx0PVtdO2Zvcihjb25zdCByZXNvdXJjZVRyZWVNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLlJlc291cmNlVHJlZU1vZGVsKSkKcmVzdWx0PXJlc3VsdC5jb25jYXQocmVzb3VyY2VUcmVlTW9kZWwuX2ZyYW1lcy52YWx1ZXNBcnJheSgpKTtyZXR1cm4gcmVzdWx0O30Kc3RhdGljIHJlc291cmNlRm9yVVJMKHVybCl7Zm9yKGNvbnN0IHJlc291cmNlVHJlZU1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuUmVzb3VyY2VUcmVlTW9kZWwpKXtjb25zdCBtYWluRnJhbWU9cmVzb3VyY2VUcmVlTW9kZWwubWFpbkZyYW1lO2NvbnN0IHJlc3VsdD1tYWluRnJhbWU/bWFpbkZyYW1lLnJlc291cmNlRm9yVVJMKHVybCk6bnVsbDtpZihyZXN1bHQpCnJldHVybiByZXN1bHQ7fQpyZXR1cm4gbnVsbDt9CnN0YXRpYyByZWxvYWRBbGxQYWdlcyhieXBhc3NDYWNoZSxzY3JpcHRUb0V2YWx1YXRlT25Mb2FkKXtmb3IoY29uc3QgcmVzb3VyY2VUcmVlTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5SZXNvdXJjZVRyZWVNb2RlbCkpe2lmKCFyZXNvdXJjZVRyZWVNb2RlbC50YXJnZXQoKS5wYXJlbnRUYXJnZXQoKSkKcmVzb3VyY2VUcmVlTW9kZWwucmVsb2FkUGFnZShieXBhc3NDYWNoZSxzY3JpcHRUb0V2YWx1YXRlT25Mb2FkKTt9fQpkb21Nb2RlbCgpe3JldHVybih0aGlzLnRhcmdldCgpLm1vZGVsKFNESy5ET01Nb2RlbCkpO30KX3Byb2Nlc3NDYWNoZWRSZXNvdXJjZXMobWFpbkZyYW1lUGF5bG9hZCl7aWYobWFpbkZyYW1lUGF5bG9hZCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5XaWxsTG9hZENhY2hlZFJlc291cmNlcyk7dGhpcy5fYWRkRnJhbWVzUmVjdXJzaXZlbHkobnVsbCxtYWluRnJhbWVQYXlsb2FkKTt0aGlzLnRhcmdldCgpLnNldEluc3BlY3RlZFVSTChtYWluRnJhbWVQYXlsb2FkLmZyYW1lLnVybCk7fQp0aGlzLl9jYWNoZWRSZXNvdXJjZXNQcm9jZXNzZWQ9dHJ1ZTtjb25zdCBydW50aW1lTW9kZWw9dGhpcy50YXJnZXQoKS5tb2RlbChTREsuUnVudGltZU1vZGVsKTtpZihydW50aW1lTW9kZWwpe3J1bnRpbWVNb2RlbC5zZXRFeGVjdXRpb25Db250ZXh0Q29tcGFyYXRvcih0aGlzLl9leGVjdXRpb25Db250ZXh0Q29tcGFyYXRvci5iaW5kKHRoaXMpKTtydW50aW1lTW9kZWwuZmlyZUV4ZWN1dGlvbkNvbnRleHRPcmRlckNoYW5nZWQoKTt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuQ2FjaGVkUmVzb3VyY2VzTG9hZGVkLHRoaXMpO30KY2FjaGVkUmVzb3VyY2VzTG9hZGVkKCl7cmV0dXJuIHRoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZDt9CmlzSW50ZXJzdGl0aWFsU2hvd2luZygpe3JldHVybiB0aGlzLl9pc0ludGVyc3RpdGlhbFNob3dpbmc7fQpfYWRkRnJhbWUoZnJhbWUsYWJvdXRUb05hdmlnYXRlKXt0aGlzLl9mcmFtZXMuc2V0KGZyYW1lLmlkLGZyYW1lKTtpZihmcmFtZS5pc01haW5GcmFtZSgpKQp0aGlzLm1haW5GcmFtZT1mcmFtZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkZyYW1lQWRkZWQsZnJhbWUpO3RoaXMuX3VwZGF0ZVNlY3VyaXR5T3JpZ2lucygpO30KX2ZyYW1lQXR0YWNoZWQoZnJhbWVJZCxwYXJlbnRGcmFtZUlkLHN0YWNrVHJhY2Upe2NvbnN0IHBhcmVudEZyYW1lPXBhcmVudEZyYW1lSWQ/KHRoaXMuX2ZyYW1lcy5nZXQocGFyZW50RnJhbWVJZCl8fG51bGwpOm51bGw7aWYoIXRoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZCYmcGFyZW50RnJhbWUpCnJldHVybiBudWxsO2lmKHRoaXMuX2ZyYW1lcy5oYXMoZnJhbWVJZCkpCnJldHVybiBudWxsO2NvbnN0IGZyYW1lPW5ldyBTREsuUmVzb3VyY2VUcmVlRnJhbWUodGhpcyxwYXJlbnRGcmFtZSxmcmFtZUlkLG51bGwsc3RhY2tUcmFjZXx8bnVsbCk7aWYocGFyZW50RnJhbWVJZCYmIXBhcmVudEZyYW1lKQpmcmFtZS5fY3Jvc3NUYXJnZXRQYXJlbnRGcmFtZUlkPXBhcmVudEZyYW1lSWQ7aWYoZnJhbWUuaXNNYWluRnJhbWUoKSYmdGhpcy5tYWluRnJhbWUpe3RoaXMuX2ZyYW1lRGV0YWNoZWQodGhpcy5tYWluRnJhbWUuaWQpO30KdGhpcy5fYWRkRnJhbWUoZnJhbWUsdHJ1ZSk7cmV0dXJuIGZyYW1lO30KX2ZyYW1lTmF2aWdhdGVkKGZyYW1lUGF5bG9hZCl7Y29uc3QgcGFyZW50RnJhbWU9ZnJhbWVQYXlsb2FkLnBhcmVudElkPyh0aGlzLl9mcmFtZXMuZ2V0KGZyYW1lUGF5bG9hZC5wYXJlbnRJZCl8fG51bGwpOm51bGw7aWYoIXRoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZCYmcGFyZW50RnJhbWUpCnJldHVybjtsZXQgZnJhbWU9dGhpcy5fZnJhbWVzLmdldChmcmFtZVBheWxvYWQuaWQpO2lmKCFmcmFtZSl7ZnJhbWU9dGhpcy5fZnJhbWVBdHRhY2hlZChmcmFtZVBheWxvYWQuaWQsZnJhbWVQYXlsb2FkLnBhcmVudElkfHwnJyk7Y29uc29sZS5hc3NlcnQoZnJhbWUpO30KdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZVdpbGxOYXZpZ2F0ZSxmcmFtZSk7ZnJhbWUuX25hdmlnYXRlKGZyYW1lUGF5bG9hZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZU5hdmlnYXRlZCxmcmFtZSk7aWYoZnJhbWUuaXNNYWluRnJhbWUoKSkKdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsZnJhbWUpO2NvbnN0IHJlc291cmNlcz1mcmFtZS5yZXNvdXJjZXMoKTtmb3IobGV0IGk9MDtpPHJlc291cmNlcy5sZW5ndGg7KytpKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLlJlc291cmNlQWRkZWQscmVzb3VyY2VzW2ldKTtpZihmcmFtZS5pc01haW5GcmFtZSgpKQp0aGlzLnRhcmdldCgpLnNldEluc3BlY3RlZFVSTChmcmFtZS51cmwpO3RoaXMuX3VwZGF0ZVNlY3VyaXR5T3JpZ2lucygpO30KX2ZyYW1lRGV0YWNoZWQoZnJhbWVJZCl7aWYoIXRoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZCkKcmV0dXJuO2NvbnN0IGZyYW1lPXRoaXMuX2ZyYW1lcy5nZXQoZnJhbWVJZCk7aWYoIWZyYW1lKQpyZXR1cm47aWYoZnJhbWUucGFyZW50RnJhbWUpCmZyYW1lLnBhcmVudEZyYW1lLl9yZW1vdmVDaGlsZEZyYW1lKGZyYW1lKTtlbHNlCmZyYW1lLl9yZW1vdmUoKTt0aGlzLl91cGRhdGVTZWN1cml0eU9yaWdpbnMoKTt9Cl9vblJlcXVlc3RGaW5pc2hlZChldmVudCl7aWYoIXRoaXMuX2NhY2hlZFJlc291cmNlc1Byb2Nlc3NlZCkKcmV0dXJuO2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO2lmKHJlcXVlc3QuZmFpbGVkfHxyZXF1ZXN0LnJlc291cmNlVHlwZSgpPT09Q29tbW9uLnJlc291cmNlVHlwZXMuWEhSKQpyZXR1cm47Y29uc3QgZnJhbWU9dGhpcy5fZnJhbWVzLmdldChyZXF1ZXN0LmZyYW1lSWQpO2lmKGZyYW1lKQpmcmFtZS5fYWRkUmVxdWVzdChyZXF1ZXN0KTt9Cl9vblJlcXVlc3RVcGRhdGVEcm9wcGVkKGV2ZW50KXtpZighdGhpcy5fY2FjaGVkUmVzb3VyY2VzUHJvY2Vzc2VkKQpyZXR1cm47Y29uc3QgZnJhbWVJZD1ldmVudC5kYXRhLmZyYW1lSWQ7Y29uc3QgZnJhbWU9dGhpcy5fZnJhbWVzLmdldChmcmFtZUlkKTtpZighZnJhbWUpCnJldHVybjtjb25zdCB1cmw9ZXZlbnQuZGF0YS51cmw7aWYoZnJhbWUuX3Jlc291cmNlc01hcFt1cmxdKQpyZXR1cm47Y29uc3QgcmVzb3VyY2U9bmV3IFNESy5SZXNvdXJjZSh0aGlzLG51bGwsdXJsLGZyYW1lLnVybCxmcmFtZUlkLGV2ZW50LmRhdGEubG9hZGVySWQsQ29tbW9uLnJlc291cmNlVHlwZXNbZXZlbnQuZGF0YS5yZXNvdXJjZVR5cGVdLGV2ZW50LmRhdGEubWltZVR5cGUsZXZlbnQuZGF0YS5sYXN0TW9kaWZpZWQsbnVsbCk7ZnJhbWUuYWRkUmVzb3VyY2UocmVzb3VyY2UpO30KZnJhbWVGb3JJZChmcmFtZUlkKXtyZXR1cm4gdGhpcy5fZnJhbWVzLmdldChmcmFtZUlkKTt9CmZvckFsbFJlc291cmNlcyhjYWxsYmFjayl7aWYodGhpcy5tYWluRnJhbWUpCnJldHVybiB0aGlzLm1haW5GcmFtZS5fY2FsbEZvckZyYW1lUmVzb3VyY2VzKGNhbGxiYWNrKTtyZXR1cm4gZmFsc2U7fQpmcmFtZXMoKXtyZXR1cm4gdGhpcy5fZnJhbWVzLnZhbHVlc0FycmF5KCk7fQpyZXNvdXJjZUZvclVSTCh1cmwpe3JldHVybiB0aGlzLm1haW5GcmFtZT90aGlzLm1haW5GcmFtZS5yZXNvdXJjZUZvclVSTCh1cmwpOm51bGw7fQpfYWRkRnJhbWVzUmVjdXJzaXZlbHkocGFyZW50RnJhbWUsZnJhbWVUcmVlUGF5bG9hZCl7Y29uc3QgZnJhbWVQYXlsb2FkPWZyYW1lVHJlZVBheWxvYWQuZnJhbWU7Y29uc3QgZnJhbWU9bmV3IFNESy5SZXNvdXJjZVRyZWVGcmFtZSh0aGlzLHBhcmVudEZyYW1lLGZyYW1lUGF5bG9hZC5pZCxmcmFtZVBheWxvYWQsbnVsbCk7aWYoIXBhcmVudEZyYW1lJiZmcmFtZVBheWxvYWQucGFyZW50SWQpCmZyYW1lLl9jcm9zc1RhcmdldFBhcmVudEZyYW1lSWQ9ZnJhbWVQYXlsb2FkLnBhcmVudElkO3RoaXMuX2FkZEZyYW1lKGZyYW1lKTtmb3IobGV0IGk9MDtmcmFtZVRyZWVQYXlsb2FkLmNoaWxkRnJhbWVzJiZpPGZyYW1lVHJlZVBheWxvYWQuY2hpbGRGcmFtZXMubGVuZ3RoOysraSkKdGhpcy5fYWRkRnJhbWVzUmVjdXJzaXZlbHkoZnJhbWUsZnJhbWVUcmVlUGF5bG9hZC5jaGlsZEZyYW1lc1tpXSk7Zm9yKGxldCBpPTA7aTxmcmFtZVRyZWVQYXlsb2FkLnJlc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCBzdWJyZXNvdXJjZT1mcmFtZVRyZWVQYXlsb2FkLnJlc291cmNlc1tpXTtjb25zdCByZXNvdXJjZT10aGlzLl9jcmVhdGVSZXNvdXJjZUZyb21GcmFtZVBheWxvYWQoZnJhbWVQYXlsb2FkLHN1YnJlc291cmNlLnVybCxDb21tb24ucmVzb3VyY2VUeXBlc1tzdWJyZXNvdXJjZS50eXBlXSxzdWJyZXNvdXJjZS5taW1lVHlwZSxzdWJyZXNvdXJjZS5sYXN0TW9kaWZpZWR8fG51bGwsc3VicmVzb3VyY2UuY29udGVudFNpemV8fG51bGwpO2ZyYW1lLmFkZFJlc291cmNlKHJlc291cmNlKTt9CmlmKCFmcmFtZS5fcmVzb3VyY2VzTWFwW2ZyYW1lUGF5bG9hZC51cmxdKXtjb25zdCBmcmFtZVJlc291cmNlPXRoaXMuX2NyZWF0ZVJlc291cmNlRnJvbUZyYW1lUGF5bG9hZChmcmFtZVBheWxvYWQsZnJhbWVQYXlsb2FkLnVybCxDb21tb24ucmVzb3VyY2VUeXBlcy5Eb2N1bWVudCxmcmFtZVBheWxvYWQubWltZVR5cGUsbnVsbCxudWxsKTtmcmFtZS5hZGRSZXNvdXJjZShmcmFtZVJlc291cmNlKTt9fQpfY3JlYXRlUmVzb3VyY2VGcm9tRnJhbWVQYXlsb2FkKGZyYW1lLHVybCx0eXBlLG1pbWVUeXBlLGxhc3RNb2RpZmllZFRpbWUsY29udGVudFNpemUpe2NvbnN0IGxhc3RNb2RpZmllZD10eXBlb2YgbGFzdE1vZGlmaWVkVGltZT09PSdudW1iZXInP25ldyBEYXRlKGxhc3RNb2RpZmllZFRpbWUqMTAwMCk6bnVsbDtyZXR1cm4gbmV3IFNESy5SZXNvdXJjZSh0aGlzLG51bGwsdXJsLGZyYW1lLnVybCxmcmFtZS5pZCxmcmFtZS5sb2FkZXJJZCx0eXBlLG1pbWVUeXBlLGxhc3RNb2RpZmllZCxjb250ZW50U2l6ZSk7fQpzdXNwZW5kUmVsb2FkKCl7dGhpcy5fcmVsb2FkU3VzcGVuc2lvbkNvdW50Kys7fQpyZXN1bWVSZWxvYWQoKXt0aGlzLl9yZWxvYWRTdXNwZW5zaW9uQ291bnQtLTtjb25zb2xlLmFzc2VydCh0aGlzLl9yZWxvYWRTdXNwZW5zaW9uQ291bnQ+PTAsJ1VuYmFsYW5jZWQgY2FsbCB0byBSZXNvdXJjZVRyZWVNb2RlbC5yZXN1bWVSZWxvYWQoKScpO2lmKCF0aGlzLl9yZWxvYWRTdXNwZW5zaW9uQ291bnQmJnRoaXMuX3BlbmRpbmdSZWxvYWRPcHRpb25zKQp0aGlzLnJlbG9hZFBhZ2UuYXBwbHkodGhpcyx0aGlzLl9wZW5kaW5nUmVsb2FkT3B0aW9ucyk7fQpyZWxvYWRQYWdlKGJ5cGFzc0NhY2hlLHNjcmlwdFRvRXZhbHVhdGVPbkxvYWQpe2lmKCF0aGlzLl9wZW5kaW5nUmVsb2FkT3B0aW9ucykKdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5QYWdlUmVsb2FkUmVxdWVzdGVkLHRoaXMpO2lmKHRoaXMuX3JlbG9hZFN1c3BlbnNpb25Db3VudCl7dGhpcy5fcGVuZGluZ1JlbG9hZE9wdGlvbnM9W2J5cGFzc0NhY2hlLHNjcmlwdFRvRXZhbHVhdGVPbkxvYWRdO3JldHVybjt9CnRoaXMuX3BlbmRpbmdSZWxvYWRPcHRpb25zPW51bGw7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5XaWxsUmVsb2FkUGFnZSk7dGhpcy5fYWdlbnQucmVsb2FkKGJ5cGFzc0NhY2hlLHNjcmlwdFRvRXZhbHVhdGVPbkxvYWQpO30KbmF2aWdhdGUodXJsKXtyZXR1cm4gdGhpcy5fYWdlbnQubmF2aWdhdGUodXJsKTt9CmFzeW5jIG5hdmlnYXRpb25IaXN0b3J5KCl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgdGhpcy5fYWdlbnQuaW52b2tlX2dldE5hdmlnYXRpb25IaXN0b3J5KHt9KTtpZihyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pCnJldHVybiBudWxsO3JldHVybntjdXJyZW50SW5kZXg6cmVzcG9uc2UuY3VycmVudEluZGV4LGVudHJpZXM6cmVzcG9uc2UuZW50cmllc307fQpuYXZpZ2F0ZVRvSGlzdG9yeUVudHJ5KGVudHJ5KXt0aGlzLl9hZ2VudC5uYXZpZ2F0ZVRvSGlzdG9yeUVudHJ5KGVudHJ5LmlkKTt9CmFzeW5jIGZldGNoQXBwTWFuaWZlc3QoY2FsbGJhY2spe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX2FnZW50Lmludm9rZV9nZXRBcHBNYW5pZmVzdCh7fSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKQpjYWxsYmFjayhyZXNwb25zZS51cmwsbnVsbCxbXSk7ZWxzZQpjYWxsYmFjayhyZXNwb25zZS51cmwscmVzcG9uc2UuZGF0YXx8bnVsbCxyZXNwb25zZS5lcnJvcnMpO30KX2V4ZWN1dGlvbkNvbnRleHRDb21wYXJhdG9yKGEsYil7ZnVuY3Rpb24gZnJhbWVQYXRoKGZyYW1lKXtsZXQgY3VycmVudEZyYW1lPWZyYW1lO2NvbnN0IHBhcmVudHM9W107d2hpbGUoY3VycmVudEZyYW1lKXtwYXJlbnRzLnB1c2goY3VycmVudEZyYW1lKTtjdXJyZW50RnJhbWU9Y3VycmVudEZyYW1lLnBhcmVudEZyYW1lO30KcmV0dXJuIHBhcmVudHMucmV2ZXJzZSgpO30KaWYoYS50YXJnZXQoKSE9PWIudGFyZ2V0KCkpCnJldHVybiBTREsuRXhlY3V0aW9uQ29udGV4dC5jb21wYXJhdG9yKGEsYik7Y29uc3QgZnJhbWVzQT1hLmZyYW1lSWQ/ZnJhbWVQYXRoKHRoaXMuZnJhbWVGb3JJZChhLmZyYW1lSWQpKTpbXTtjb25zdCBmcmFtZXNCPWIuZnJhbWVJZD9mcmFtZVBhdGgodGhpcy5mcmFtZUZvcklkKGIuZnJhbWVJZCkpOltdO2xldCBmcmFtZUE7bGV0IGZyYW1lQjtmb3IobGV0IGk9MDs7aSsrKXtpZighZnJhbWVzQVtpXXx8IWZyYW1lc0JbaV18fChmcmFtZXNBW2ldIT09ZnJhbWVzQltpXSkpe2ZyYW1lQT1mcmFtZXNBW2ldO2ZyYW1lQj1mcmFtZXNCW2ldO2JyZWFrO319CmlmKCFmcmFtZUEmJmZyYW1lQikKcmV0dXJuLTE7aWYoIWZyYW1lQiYmZnJhbWVBKQpyZXR1cm4gMTtpZihmcmFtZUEmJmZyYW1lQikKcmV0dXJuIGZyYW1lQS5pZC5sb2NhbGVDb21wYXJlKGZyYW1lQi5pZCk7cmV0dXJuIFNESy5FeGVjdXRpb25Db250ZXh0LmNvbXBhcmF0b3IoYSxiKTt9Cl91cGRhdGVTZWN1cml0eU9yaWdpbnMoKXtjb25zdCBzZWN1cml0eU9yaWdpbnM9bmV3IFNldCgpO2xldCBtYWluU2VjdXJpdHlPcmlnaW49bnVsbDtmb3IoY29uc3QgZnJhbWUgb2YgdGhpcy5fZnJhbWVzLnZhbHVlcygpKXtjb25zdCBvcmlnaW49ZnJhbWUuc2VjdXJpdHlPcmlnaW47aWYoIW9yaWdpbikKY29udGludWU7c2VjdXJpdHlPcmlnaW5zLmFkZChvcmlnaW4pO2lmKGZyYW1lLmlzTWFpbkZyYW1lKCkpCm1haW5TZWN1cml0eU9yaWdpbj1vcmlnaW47fQp0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIudXBkYXRlU2VjdXJpdHlPcmlnaW5zKHNlY3VyaXR5T3JpZ2lucyk7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnNldE1haW5TZWN1cml0eU9yaWdpbihtYWluU2VjdXJpdHlPcmlnaW58fCcnKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00sdHJ1ZSk7U0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cz17RnJhbWVBZGRlZDpTeW1ib2woJ0ZyYW1lQWRkZWQnKSxGcmFtZU5hdmlnYXRlZDpTeW1ib2woJ0ZyYW1lTmF2aWdhdGVkJyksRnJhbWVEZXRhY2hlZDpTeW1ib2woJ0ZyYW1lRGV0YWNoZWQnKSxGcmFtZVJlc2l6ZWQ6U3ltYm9sKCdGcmFtZVJlc2l6ZWQnKSxGcmFtZVdpbGxOYXZpZ2F0ZTpTeW1ib2woJ0ZyYW1lV2lsbE5hdmlnYXRlJyksTWFpbkZyYW1lTmF2aWdhdGVkOlN5bWJvbCgnTWFpbkZyYW1lTmF2aWdhdGVkJyksUmVzb3VyY2VBZGRlZDpTeW1ib2woJ1Jlc291cmNlQWRkZWQnKSxXaWxsTG9hZENhY2hlZFJlc291cmNlczpTeW1ib2woJ1dpbGxMb2FkQ2FjaGVkUmVzb3VyY2VzJyksQ2FjaGVkUmVzb3VyY2VzTG9hZGVkOlN5bWJvbCgnQ2FjaGVkUmVzb3VyY2VzTG9hZGVkJyksRE9NQ29udGVudExvYWRlZDpTeW1ib2woJ0RPTUNvbnRlbnRMb2FkZWQnKSxMaWZlY3ljbGVFdmVudDpTeW1ib2woJ0xpZmVjeWNsZUV2ZW50JyksTG9hZDpTeW1ib2woJ0xvYWQnKSxQYWdlUmVsb2FkUmVxdWVzdGVkOlN5bWJvbCgnUGFnZVJlbG9hZFJlcXVlc3RlZCcpLFdpbGxSZWxvYWRQYWdlOlN5bWJvbCgnV2lsbFJlbG9hZFBhZ2UnKSxJbnRlcnN0aXRpYWxTaG93bjpTeW1ib2woJ0ludGVyc3RpdGlhbFNob3duJyksSW50ZXJzdGl0aWFsSGlkZGVuOlN5bWJvbCgnSW50ZXJzdGl0aWFsSGlkZGVuJyl9O1NESy5SZXNvdXJjZVRyZWVGcmFtZT1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCxwYXJlbnRGcmFtZSxmcmFtZUlkLHBheWxvYWQsY3JlYXRpb25TdGFja1RyYWNlKXt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9wYXJlbnRGcmFtZT1wYXJlbnRGcmFtZTt0aGlzLl9pZD1mcmFtZUlkO3RoaXMuX3VybD0nJzt0aGlzLl9jcm9zc1RhcmdldFBhcmVudEZyYW1lSWQ9bnVsbDtpZihwYXlsb2FkKXt0aGlzLl9sb2FkZXJJZD1wYXlsb2FkLmxvYWRlcklkO3RoaXMuX25hbWU9cGF5bG9hZC5uYW1lO3RoaXMuX3VybD1wYXlsb2FkLnVybDt0aGlzLl9zZWN1cml0eU9yaWdpbj1wYXlsb2FkLnNlY3VyaXR5T3JpZ2luO3RoaXMuX21pbWVUeXBlPXBheWxvYWQubWltZVR5cGU7fQp0aGlzLl9jcmVhdGlvblN0YWNrVHJhY2U9Y3JlYXRpb25TdGFja1RyYWNlO3RoaXMuX2NoaWxkRnJhbWVzPVtdO3RoaXMuX3Jlc291cmNlc01hcD17fTtpZih0aGlzLl9wYXJlbnRGcmFtZSkKdGhpcy5fcGFyZW50RnJhbWUuX2NoaWxkRnJhbWVzLnB1c2godGhpcyk7fQpyZXNvdXJjZVRyZWVNb2RlbCgpe3JldHVybiB0aGlzLl9tb2RlbDt9CmdldCBpZCgpe3JldHVybiB0aGlzLl9pZDt9CmdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV8fCcnO30KZ2V0IHVybCgpe3JldHVybiB0aGlzLl91cmw7fQpnZXQgc2VjdXJpdHlPcmlnaW4oKXtyZXR1cm4gdGhpcy5fc2VjdXJpdHlPcmlnaW47fQpnZXQgbG9hZGVySWQoKXtyZXR1cm4gdGhpcy5fbG9hZGVySWQ7fQpnZXQgcGFyZW50RnJhbWUoKXtyZXR1cm4gdGhpcy5fcGFyZW50RnJhbWU7fQpnZXQgY2hpbGRGcmFtZXMoKXtyZXR1cm4gdGhpcy5fY2hpbGRGcmFtZXM7fQpjcm9zc1RhcmdldFBhcmVudEZyYW1lKCl7aWYoIXRoaXMuX2Nyb3NzVGFyZ2V0UGFyZW50RnJhbWVJZCkKcmV0dXJuIG51bGw7aWYoIXRoaXMuX21vZGVsLnRhcmdldCgpLnBhcmVudFRhcmdldCgpKQpyZXR1cm4gbnVsbDtjb25zdCBwYXJlbnRNb2RlbD10aGlzLl9tb2RlbC50YXJnZXQoKS5wYXJlbnRUYXJnZXQoKS5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKCFwYXJlbnRNb2RlbCkKcmV0dXJuIG51bGw7cmV0dXJuIHBhcmVudE1vZGVsLl9mcmFtZXMuZ2V0KHRoaXMuX2Nyb3NzVGFyZ2V0UGFyZW50RnJhbWVJZCl8fG51bGw7fQpmaW5kQ3JlYXRpb25DYWxsRnJhbWUoc2VhcmNoRm4pe2xldCBzdGFja1RyYWNlPXRoaXMuX2NyZWF0aW9uU3RhY2tUcmFjZTt3aGlsZShzdGFja1RyYWNlKXtjb25zdCBmb3VuZEVudHJ5PXN0YWNrVHJhY2UuY2FsbEZyYW1lcy5maW5kKHNlYXJjaEZuKTtpZihmb3VuZEVudHJ5KQpyZXR1cm4gZm91bmRFbnRyeTtzdGFja1RyYWNlPXRoaXMucGFyZW50O30KcmV0dXJuIG51bGw7fQppc01haW5GcmFtZSgpe3JldHVybiF0aGlzLl9wYXJlbnRGcmFtZTt9CmlzVG9wRnJhbWUoKXtyZXR1cm4hdGhpcy5fcGFyZW50RnJhbWUmJiF0aGlzLl9jcm9zc1RhcmdldFBhcmVudEZyYW1lSWQ7fQpfbmF2aWdhdGUoZnJhbWVQYXlsb2FkKXt0aGlzLl9sb2FkZXJJZD1mcmFtZVBheWxvYWQubG9hZGVySWQ7dGhpcy5fbmFtZT1mcmFtZVBheWxvYWQubmFtZTt0aGlzLl91cmw9ZnJhbWVQYXlsb2FkLnVybDt0aGlzLl9zZWN1cml0eU9yaWdpbj1mcmFtZVBheWxvYWQuc2VjdXJpdHlPcmlnaW47dGhpcy5fbWltZVR5cGU9ZnJhbWVQYXlsb2FkLm1pbWVUeXBlO2NvbnN0IG1haW5SZXNvdXJjZT10aGlzLl9yZXNvdXJjZXNNYXBbdGhpcy5fdXJsXTt0aGlzLl9yZXNvdXJjZXNNYXA9e307dGhpcy5fcmVtb3ZlQ2hpbGRGcmFtZXMoKTtpZihtYWluUmVzb3VyY2UmJm1haW5SZXNvdXJjZS5sb2FkZXJJZD09PXRoaXMuX2xvYWRlcklkKQp0aGlzLmFkZFJlc291cmNlKG1haW5SZXNvdXJjZSk7fQpnZXQgbWFpblJlc291cmNlKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlc01hcFt0aGlzLl91cmxdO30KX3JlbW92ZUNoaWxkRnJhbWUoZnJhbWUpe3RoaXMuX2NoaWxkRnJhbWVzLnJlbW92ZShmcmFtZSk7ZnJhbWUuX3JlbW92ZSgpO30KX3JlbW92ZUNoaWxkRnJhbWVzKCl7Y29uc3QgZnJhbWVzPXRoaXMuX2NoaWxkRnJhbWVzO3RoaXMuX2NoaWxkRnJhbWVzPVtdO2ZvcihsZXQgaT0wO2k8ZnJhbWVzLmxlbmd0aDsrK2kpCmZyYW1lc1tpXS5fcmVtb3ZlKCk7fQpfcmVtb3ZlKCl7dGhpcy5fcmVtb3ZlQ2hpbGRGcmFtZXMoKTt0aGlzLl9tb2RlbC5fZnJhbWVzLmRlbGV0ZSh0aGlzLmlkKTt0aGlzLl9tb2RlbC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZURldGFjaGVkLHRoaXMpO30KYWRkUmVzb3VyY2UocmVzb3VyY2Upe2lmKHRoaXMuX3Jlc291cmNlc01hcFtyZXNvdXJjZS51cmxdPT09cmVzb3VyY2Upe3JldHVybjt9CnRoaXMuX3Jlc291cmNlc01hcFtyZXNvdXJjZS51cmxdPXJlc291cmNlO3RoaXMuX21vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLlJlc291cmNlQWRkZWQscmVzb3VyY2UpO30KX2FkZFJlcXVlc3QocmVxdWVzdCl7bGV0IHJlc291cmNlPXRoaXMuX3Jlc291cmNlc01hcFtyZXF1ZXN0LnVybCgpXTtpZihyZXNvdXJjZSYmcmVzb3VyY2UucmVxdWVzdD09PXJlcXVlc3Qpe3JldHVybjt9CnJlc291cmNlPW5ldyBTREsuUmVzb3VyY2UodGhpcy5fbW9kZWwscmVxdWVzdCxyZXF1ZXN0LnVybCgpLHJlcXVlc3QuZG9jdW1lbnRVUkwscmVxdWVzdC5mcmFtZUlkLHJlcXVlc3QubG9hZGVySWQscmVxdWVzdC5yZXNvdXJjZVR5cGUoKSxyZXF1ZXN0Lm1pbWVUeXBlLG51bGwsbnVsbCk7dGhpcy5fcmVzb3VyY2VzTWFwW3Jlc291cmNlLnVybF09cmVzb3VyY2U7dGhpcy5fbW9kZWwuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuUmVzb3VyY2VBZGRlZCxyZXNvdXJjZSk7fQpyZXNvdXJjZXMoKXtjb25zdCByZXN1bHQ9W107Zm9yKGNvbnN0IHVybCBpbiB0aGlzLl9yZXNvdXJjZXNNYXApCnJlc3VsdC5wdXNoKHRoaXMuX3Jlc291cmNlc01hcFt1cmxdKTtyZXR1cm4gcmVzdWx0O30KcmVzb3VyY2VGb3JVUkwodXJsKXtsZXQgcmVzb3VyY2U9dGhpcy5fcmVzb3VyY2VzTWFwW3VybF18fG51bGw7aWYocmVzb3VyY2UpCnJldHVybiByZXNvdXJjZTtmb3IobGV0IGk9MDshcmVzb3VyY2UmJmk8dGhpcy5fY2hpbGRGcmFtZXMubGVuZ3RoOysraSkKcmVzb3VyY2U9dGhpcy5fY2hpbGRGcmFtZXNbaV0ucmVzb3VyY2VGb3JVUkwodXJsKTtyZXR1cm4gcmVzb3VyY2U7fQpfY2FsbEZvckZyYW1lUmVzb3VyY2VzKGNhbGxiYWNrKXtmb3IoY29uc3QgdXJsIGluIHRoaXMuX3Jlc291cmNlc01hcCl7aWYoY2FsbGJhY2sodGhpcy5fcmVzb3VyY2VzTWFwW3VybF0pKQpyZXR1cm4gdHJ1ZTt9CmZvcihsZXQgaT0wO2k8dGhpcy5fY2hpbGRGcmFtZXMubGVuZ3RoOysraSl7aWYodGhpcy5fY2hpbGRGcmFtZXNbaV0uX2NhbGxGb3JGcmFtZVJlc291cmNlcyhjYWxsYmFjaykpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30KZGlzcGxheU5hbWUoKXtpZih0aGlzLmlzVG9wRnJhbWUoKSkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygndG9wJyk7Y29uc3Qgc3VidGl0bGU9bmV3IENvbW1vbi5QYXJzZWRVUkwodGhpcy5fdXJsKS5kaXNwbGF5TmFtZTtpZihzdWJ0aXRsZSl7aWYoIXRoaXMuX25hbWUpCnJldHVybiBzdWJ0aXRsZTtyZXR1cm4gdGhpcy5fbmFtZSsnICgnK3N1YnRpdGxlKycpJzt9CnJldHVybiBDb21tb24uVUlTdHJpbmcoJzxpZnJhbWU+Jyk7fX07U0RLLlBhZ2VEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKHJlc291cmNlVHJlZU1vZGVsKXt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1yZXNvdXJjZVRyZWVNb2RlbDt9CmRvbUNvbnRlbnRFdmVudEZpcmVkKHRpbWUpe3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkRPTUNvbnRlbnRMb2FkZWQsdGltZSk7fQpsb2FkRXZlbnRGaXJlZCh0aW1lKXt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5Mb2FkLHtyZXNvdXJjZVRyZWVNb2RlbDp0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbCxsb2FkVGltZTp0aW1lfSk7fQpsaWZlY3ljbGVFdmVudChmcmFtZUlkLGxvYWRlcklkLG5hbWUsdGltZSl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTGlmZWN5Y2xlRXZlbnQse2ZyYW1lSWQsbmFtZX0pO30KZnJhbWVBdHRhY2hlZChmcmFtZUlkLHBhcmVudEZyYW1lSWQsc3RhY2tUcmFjZSl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuX2ZyYW1lQXR0YWNoZWQoZnJhbWVJZCxwYXJlbnRGcmFtZUlkLHN0YWNrVHJhY2UpO30KZnJhbWVOYXZpZ2F0ZWQoZnJhbWUpe3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLl9mcmFtZU5hdmlnYXRlZChmcmFtZSk7fQpmcmFtZURldGFjaGVkKGZyYW1lSWQpe3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLl9mcmFtZURldGFjaGVkKGZyYW1lSWQpO30KZnJhbWVTdGFydGVkTG9hZGluZyhmcmFtZUlkKXt9CmZyYW1lU3RvcHBlZExvYWRpbmcoZnJhbWVJZCl7fQpmcmFtZVNjaGVkdWxlZE5hdmlnYXRpb24oZnJhbWVJZCxkZWxheSl7fQpmcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uKGZyYW1lSWQpe30KbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoZnJhbWVJZCx1cmwpe30KZnJhbWVSZXNpemVkKCl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRnJhbWVSZXNpemVkLG51bGwpO30KamF2YXNjcmlwdERpYWxvZ09wZW5pbmcodXJsLG1lc3NhZ2UsZGlhbG9nVHlwZSxoYXNCcm93c2VySGFuZGxlcixwcm9tcHQpe2lmKCFoYXNCcm93c2VySGFuZGxlcikKdGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuX2FnZW50LmhhbmRsZUphdmFTY3JpcHREaWFsb2coZmFsc2UpO30KamF2YXNjcmlwdERpYWxvZ0Nsb3NlZChyZXN1bHQsdXNlcklucHV0KXt9CnNjcmVlbmNhc3RGcmFtZShkYXRhLG1ldGFkYXRhLHNlc3Npb25JZCl7fQpzY3JlZW5jYXN0VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSl7fQppbnRlcnN0aXRpYWxTaG93bigpe3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLl9pc0ludGVyc3RpdGlhbFNob3dpbmc9dHJ1ZTt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5JbnRlcnN0aXRpYWxTaG93bik7fQppbnRlcnN0aXRpYWxIaWRkZW4oKXt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5faXNJbnRlcnN0aXRpYWxTaG93aW5nPWZhbHNlO3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkludGVyc3RpdGlhbEhpZGRlbik7fQp3aW5kb3dPcGVuKHVybCx3aW5kb3dOYW1lLHdpbmRvd0ZlYXR1cmVzLHVzZXJHZXN0dXJlKXt9CmNvbXBpbGF0aW9uQ2FjaGVQcm9kdWNlZCh1cmwsZGF0YSl7fX07O1NESy5TZWN1cml0eU9yaWdpbk1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX3NlY3VyaXR5T3JpZ2lucz1uZXcgU2V0KCk7dGhpcy5fbWFpblNlY3VyaXR5T3JpZ2luPScnO30KdXBkYXRlU2VjdXJpdHlPcmlnaW5zKHNlY3VyaXR5T3JpZ2lucyl7Y29uc3Qgb2xkT3JpZ2lucz10aGlzLl9zZWN1cml0eU9yaWdpbnM7dGhpcy5fc2VjdXJpdHlPcmlnaW5zPXNlY3VyaXR5T3JpZ2lucztmb3IoY29uc3Qgb3JpZ2luIG9mIG9sZE9yaWdpbnMpe2lmKCF0aGlzLl9zZWN1cml0eU9yaWdpbnMuaGFzKG9yaWdpbikpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5TZWN1cml0eU9yaWdpbk1hbmFnZXIuRXZlbnRzLlNlY3VyaXR5T3JpZ2luUmVtb3ZlZCxvcmlnaW4pO30KZm9yKGNvbnN0IG9yaWdpbiBvZiB0aGlzLl9zZWN1cml0eU9yaWdpbnMpe2lmKCFvbGRPcmlnaW5zLmhhcyhvcmlnaW4pKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5TZWN1cml0eU9yaWdpbkFkZGVkLG9yaWdpbik7fX0Kc2VjdXJpdHlPcmlnaW5zKCl7cmV0dXJuIHRoaXMuX3NlY3VyaXR5T3JpZ2lucy52YWx1ZXNBcnJheSgpO30KbWFpblNlY3VyaXR5T3JpZ2luKCl7cmV0dXJuIHRoaXMuX21haW5TZWN1cml0eU9yaWdpbjt9CnNldE1haW5TZWN1cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbil7dGhpcy5fbWFpblNlY3VyaXR5T3JpZ2luPXNlY3VyaXR5T3JpZ2luO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5TZWN1cml0eU9yaWdpbk1hbmFnZXIuRXZlbnRzLk1haW5TZWN1cml0eU9yaWdpbkNoYW5nZWQsc2VjdXJpdHlPcmlnaW4pO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ob25lLGZhbHNlKTtTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cz17U2VjdXJpdHlPcmlnaW5BZGRlZDpTeW1ib2woJ1NlY3VyaXR5T3JpZ2luQWRkZWQnKSxTZWN1cml0eU9yaWdpblJlbW92ZWQ6U3ltYm9sKCdTZWN1cml0eU9yaWdpblJlbW92ZWQnKSxNYWluU2VjdXJpdHlPcmlnaW5DaGFuZ2VkOlN5bWJvbCgnTWFpblNlY3VyaXR5T3JpZ2luQ2hhbmdlZCcpfTs7U0RLLlNvdXJjZU1hcFYzPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy52ZXJzaW9uO3RoaXMuZmlsZTt0aGlzLnNvdXJjZXM7dGhpcy5zZWN0aW9uczt0aGlzLm1hcHBpbmdzO3RoaXMuc291cmNlUm9vdDt0aGlzLm5hbWVzO319O1NESy5Tb3VyY2VNYXBWMy5TZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5tYXA7dGhpcy5vZmZzZXQ7fX07U0RLLlNvdXJjZU1hcFYzLk9mZnNldD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubGluZTt0aGlzLmNvbHVtbjt9fTtTREsuU291cmNlTWFwRW50cnk9Y2xhc3N7Y29uc3RydWN0b3IobGluZU51bWJlcixjb2x1bW5OdW1iZXIsc291cmNlVVJMLHNvdXJjZUxpbmVOdW1iZXIsc291cmNlQ29sdW1uTnVtYmVyLG5hbWUpe3RoaXMubGluZU51bWJlcj1saW5lTnVtYmVyO3RoaXMuY29sdW1uTnVtYmVyPWNvbHVtbk51bWJlcjt0aGlzLnNvdXJjZVVSTD1zb3VyY2VVUkw7dGhpcy5zb3VyY2VMaW5lTnVtYmVyPXNvdXJjZUxpbmVOdW1iZXI7dGhpcy5zb3VyY2VDb2x1bW5OdW1iZXI9c291cmNlQ29sdW1uTnVtYmVyO3RoaXMubmFtZT1uYW1lO30Kc3RhdGljIGNvbXBhcmUoZW50cnkxLGVudHJ5Mil7aWYoZW50cnkxLmxpbmVOdW1iZXIhPT1lbnRyeTIubGluZU51bWJlcikKcmV0dXJuIGVudHJ5MS5saW5lTnVtYmVyLWVudHJ5Mi5saW5lTnVtYmVyO3JldHVybiBlbnRyeTEuY29sdW1uTnVtYmVyLWVudHJ5Mi5jb2x1bW5OdW1iZXI7fX07U0RLLlNvdXJjZU1hcD1mdW5jdGlvbigpe307U0RLLlNvdXJjZU1hcC5wcm90b3R5cGU9e2NvbXBpbGVkVVJMKCl7fSx1cmwoKXt9LHNvdXJjZVVSTHMoKXt9LHNvdXJjZUNvbnRlbnRQcm92aWRlcihzb3VyY2VVUkwsY29udGVudFR5cGUpe30sZW1iZWRkZWRDb250ZW50QnlVUkwoc291cmNlVVJMKXt9LGZpbmRFbnRyeShsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7fSxlZGl0YWJsZSgpe30sZWRpdENvbXBpbGVkKHJhbmdlcyx0ZXh0cyl7fSx9O1NESy5Tb3VyY2VNYXAuRWRpdFJlc3VsdD1jbGFzc3tjb25zdHJ1Y3RvcihtYXAsY29tcGlsZWRFZGl0cyxuZXdTb3VyY2VzKXt0aGlzLm1hcD1tYXA7dGhpcy5jb21waWxlZEVkaXRzPWNvbXBpbGVkRWRpdHM7dGhpcy5uZXdTb3VyY2VzPW5ld1NvdXJjZXM7fX07U0RLLlNvdXJjZU1hcEZhY3Rvcnk9ZnVuY3Rpb24oKXt9O1NESy5Tb3VyY2VNYXBGYWN0b3J5LnByb3RvdHlwZT17ZWRpdGFibGVTb3VyY2VNYXAodGFyZ2V0LHNvdXJjZU1hcCl7fSx9O1NESy5UZXh0U291cmNlTWFwPWNsYXNze2NvbnN0cnVjdG9yKGNvbXBpbGVkVVJMLHNvdXJjZU1hcHBpbmdVUkwscGF5bG9hZCl7aWYoIVNESy5UZXh0U291cmNlTWFwLl9iYXNlNjRNYXApe2NvbnN0IGJhc2U2NERpZ2l0cz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7U0RLLlRleHRTb3VyY2VNYXAuX2Jhc2U2NE1hcD17fTtmb3IobGV0IGk9MDtpPGJhc2U2NERpZ2l0cy5sZW5ndGg7KytpKQpTREsuVGV4dFNvdXJjZU1hcC5fYmFzZTY0TWFwW2Jhc2U2NERpZ2l0cy5jaGFyQXQoaSldPWk7fQp0aGlzLl9qc29uPXBheWxvYWQ7dGhpcy5fY29tcGlsZWRVUkw9Y29tcGlsZWRVUkw7dGhpcy5fc291cmNlTWFwcGluZ1VSTD1zb3VyY2VNYXBwaW5nVVJMO3RoaXMuX2Jhc2VVUkw9c291cmNlTWFwcGluZ1VSTC5zdGFydHNXaXRoKCdkYXRhOicpP2NvbXBpbGVkVVJMOnNvdXJjZU1hcHBpbmdVUkw7dGhpcy5fbWFwcGluZ3M9bnVsbDt0aGlzLl9zb3VyY2VJbmZvcz1uZXcgTWFwKCk7dGhpcy5fZWFjaFNlY3Rpb24odGhpcy5fcGFyc2VTb3VyY2VzLmJpbmQodGhpcykpO30Kc3RhdGljIGxvYWQoc291cmNlTWFwVVJMLGNvbXBpbGVkVVJMKXtsZXQgY2FsbGJhY2s7Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT5jYWxsYmFjaz1mdWxmaWxsKTtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5sb2FkUmVzb3VyY2Uoc291cmNlTWFwVVJMLGNvbnRlbnRMb2FkZWQpO3JldHVybiBwcm9taXNlO2Z1bmN0aW9uIGNvbnRlbnRMb2FkZWQoc3RhdHVzQ29kZSxoZWFkZXJzLGNvbnRlbnQpe2lmKCFjb250ZW50fHxzdGF0dXNDb2RlPj00MDApe2NhbGxiYWNrKG51bGwpO3JldHVybjt9CmlmKGNvbnRlbnQuc2xpY2UoMCwzKT09PScpXX0nKQpjb250ZW50PWNvbnRlbnQuc3Vic3RyaW5nKGNvbnRlbnQuaW5kZXhPZignXG4nKSk7dHJ5e2NvbnN0IHBheWxvYWQ9KEpTT04ucGFyc2UoY29udGVudCkpO2NhbGxiYWNrKG5ldyBTREsuVGV4dFNvdXJjZU1hcChjb21waWxlZFVSTCxzb3VyY2VNYXBVUkwscGF5bG9hZCkpO31jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpO0NvbW1vbi5jb25zb2xlLndhcm4oJ0RldlRvb2xzIGZhaWxlZCB0byBwYXJzZSBTb3VyY2VNYXA6ICcrc291cmNlTWFwVVJMKTtjYWxsYmFjayhudWxsKTt9fX0KY29tcGlsZWRVUkwoKXtyZXR1cm4gdGhpcy5fY29tcGlsZWRVUkw7fQp1cmwoKXtyZXR1cm4gdGhpcy5fc291cmNlTWFwcGluZ1VSTDt9CnNvdXJjZVVSTHMoKXtyZXR1cm4gdGhpcy5fc291cmNlSW5mb3Mua2V5c0FycmF5KCk7fQpzb3VyY2VDb250ZW50UHJvdmlkZXIoc291cmNlVVJMLGNvbnRlbnRUeXBlKXtjb25zdCBpbmZvPXRoaXMuX3NvdXJjZUluZm9zLmdldChzb3VyY2VVUkwpO2lmKGluZm8uY29udGVudCkKcmV0dXJuIENvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXIuZnJvbVN0cmluZyhzb3VyY2VVUkwsY29udGVudFR5cGUsaW5mby5jb250ZW50KTtyZXR1cm4gbmV3IFNESy5Db21waWxlclNvdXJjZU1hcHBpbmdDb250ZW50UHJvdmlkZXIoc291cmNlVVJMLGNvbnRlbnRUeXBlKTt9CmVtYmVkZGVkQ29udGVudEJ5VVJMKHNvdXJjZVVSTCl7aWYoIXRoaXMuX3NvdXJjZUluZm9zLmhhcyhzb3VyY2VVUkwpKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fc291cmNlSW5mb3MuZ2V0KHNvdXJjZVVSTCkuY29udGVudDt9CmVkaXRhYmxlKCl7cmV0dXJuIGZhbHNlO30KZWRpdENvbXBpbGVkKHJhbmdlcyx0ZXh0cyl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO30KZmluZEVudHJ5KGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBtYXBwaW5ncz10aGlzLm1hcHBpbmdzKCk7Y29uc3QgaW5kZXg9bWFwcGluZ3MudXBwZXJCb3VuZCh1bmRlZmluZWQsKHVudXNlZCxlbnRyeSk9PmxpbmVOdW1iZXItZW50cnkubGluZU51bWJlcnx8Y29sdW1uTnVtYmVyLWVudHJ5LmNvbHVtbk51bWJlcik7cmV0dXJuIGluZGV4P21hcHBpbmdzW2luZGV4LTFdOm51bGw7fQpzb3VyY2VMaW5lTWFwcGluZyhzb3VyY2VVUkwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IG1hcHBpbmdzPXRoaXMuX3JldmVyc2VkTWFwcGluZ3Moc291cmNlVVJMKTtjb25zdCBmaXJzdD1tYXBwaW5ncy5sb3dlckJvdW5kKGxpbmVOdW1iZXIsbGluZUNvbXBhcmF0b3IpO2NvbnN0IGxhc3Q9bWFwcGluZ3MudXBwZXJCb3VuZChsaW5lTnVtYmVyLGxpbmVDb21wYXJhdG9yKTtpZihmaXJzdD49bWFwcGluZ3MubGVuZ3RofHxtYXBwaW5nc1tmaXJzdF0uc291cmNlTGluZU51bWJlciE9PWxpbmVOdW1iZXIpCnJldHVybiBudWxsO2NvbnN0IGNvbHVtbk1hcHBpbmdzPW1hcHBpbmdzLnNsaWNlKGZpcnN0LGxhc3QpO2lmKCFjb2x1bW5NYXBwaW5ncy5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGluZGV4PWNvbHVtbk1hcHBpbmdzLmxvd2VyQm91bmQoY29sdW1uTnVtYmVyLChjb2x1bW5OdW1iZXIsbWFwcGluZyk9PmNvbHVtbk51bWJlci1tYXBwaW5nLnNvdXJjZUNvbHVtbk51bWJlcik7cmV0dXJuIGluZGV4Pj1jb2x1bW5NYXBwaW5ncy5sZW5ndGg/Y29sdW1uTWFwcGluZ3NbY29sdW1uTWFwcGluZ3MubGVuZ3RoLTFdOmNvbHVtbk1hcHBpbmdzW2luZGV4XTtmdW5jdGlvbiBsaW5lQ29tcGFyYXRvcihsaW5lTnVtYmVyLG1hcHBpbmcpe3JldHVybiBsaW5lTnVtYmVyLW1hcHBpbmcuc291cmNlTGluZU51bWJlcjt9fQpmaW5kUmV2ZXJzZUVudHJpZXMoc291cmNlVVJMLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBtYXBwaW5ncz10aGlzLl9yZXZlcnNlZE1hcHBpbmdzKHNvdXJjZVVSTCk7Y29uc3QgZW5kSW5kZXg9bWFwcGluZ3MudXBwZXJCb3VuZCh1bmRlZmluZWQsKHVudXNlZCxlbnRyeSk9PmxpbmVOdW1iZXItZW50cnkuc291cmNlTGluZU51bWJlcnx8Y29sdW1uTnVtYmVyLWVudHJ5LnNvdXJjZUNvbHVtbk51bWJlcik7bGV0IHN0YXJ0SW5kZXg9ZW5kSW5kZXg7d2hpbGUoc3RhcnRJbmRleD4wJiZtYXBwaW5nc1tzdGFydEluZGV4LTFdLnNvdXJjZUxpbmVOdW1iZXI9PT1tYXBwaW5nc1tlbmRJbmRleC0xXS5zb3VyY2VMaW5lTnVtYmVyJiZtYXBwaW5nc1tzdGFydEluZGV4LTFdLnNvdXJjZUNvbHVtbk51bWJlcj09PW1hcHBpbmdzW2VuZEluZGV4LTFdLnNvdXJjZUNvbHVtbk51bWJlcikKLS1zdGFydEluZGV4O3JldHVybiBtYXBwaW5ncy5zbGljZShzdGFydEluZGV4LGVuZEluZGV4KTt9Cm1hcHBpbmdzKCl7aWYodGhpcy5fbWFwcGluZ3M9PT1udWxsKXt0aGlzLl9tYXBwaW5ncz1bXTt0aGlzLl9lYWNoU2VjdGlvbih0aGlzLl9wYXJzZU1hcC5iaW5kKHRoaXMpKTt0aGlzLl9qc29uPW51bGw7fQpyZXR1cm4odGhpcy5fbWFwcGluZ3MpO30KX3JldmVyc2VkTWFwcGluZ3Moc291cmNlVVJMKXtpZighdGhpcy5fc291cmNlSW5mb3MuaGFzKHNvdXJjZVVSTCkpCnJldHVybltdO2NvbnN0IG1hcHBpbmdzPXRoaXMubWFwcGluZ3MoKTtjb25zdCBpbmZvPXRoaXMuX3NvdXJjZUluZm9zLmdldChzb3VyY2VVUkwpO2lmKGluZm8ucmV2ZXJzZU1hcHBpbmdzPT09bnVsbCkKaW5mby5yZXZlcnNlTWFwcGluZ3M9bWFwcGluZ3MuZmlsdGVyKG1hcHBpbmc9Pm1hcHBpbmcuc291cmNlVVJMPT09c291cmNlVVJMKS5zb3J0KHNvdXJjZU1hcHBpbmdDb21wYXJhdG9yKTtyZXR1cm4gaW5mby5yZXZlcnNlTWFwcGluZ3M7ZnVuY3Rpb24gc291cmNlTWFwcGluZ0NvbXBhcmF0b3IoYSxiKXtpZihhLnNvdXJjZUxpbmVOdW1iZXIhPT1iLnNvdXJjZUxpbmVOdW1iZXIpCnJldHVybiBhLnNvdXJjZUxpbmVOdW1iZXItYi5zb3VyY2VMaW5lTnVtYmVyO2lmKGEuc291cmNlQ29sdW1uTnVtYmVyIT09Yi5zb3VyY2VDb2x1bW5OdW1iZXIpCnJldHVybiBhLnNvdXJjZUNvbHVtbk51bWJlci1iLnNvdXJjZUNvbHVtbk51bWJlcjtpZihhLmxpbmVOdW1iZXIhPT1iLmxpbmVOdW1iZXIpCnJldHVybiBhLmxpbmVOdW1iZXItYi5saW5lTnVtYmVyO3JldHVybiBhLmNvbHVtbk51bWJlci1iLmNvbHVtbk51bWJlcjt9fQpfZWFjaFNlY3Rpb24oY2FsbGJhY2spe2lmKCF0aGlzLl9qc29uLnNlY3Rpb25zKXtjYWxsYmFjayh0aGlzLl9qc29uLDAsMCk7cmV0dXJuO30KZm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fanNvbi5zZWN0aW9ucykKY2FsbGJhY2soc2VjdGlvbi5tYXAsc2VjdGlvbi5vZmZzZXQubGluZSxzZWN0aW9uLm9mZnNldC5jb2x1bW4pO30KX3BhcnNlU291cmNlcyhzb3VyY2VNYXApe2NvbnN0IHNvdXJjZXNMaXN0PVtdO2xldCBzb3VyY2VSb290PXNvdXJjZU1hcC5zb3VyY2VSb290fHwnJztpZihzb3VyY2VSb290JiYhc291cmNlUm9vdC5lbmRzV2l0aCgnLycpKQpzb3VyY2VSb290Kz0nLyc7Zm9yKGxldCBpPTA7aTxzb3VyY2VNYXAuc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCBocmVmPXNvdXJjZVJvb3Qrc291cmNlTWFwLnNvdXJjZXNbaV07bGV0IHVybD1Db21tb24uUGFyc2VkVVJMLmNvbXBsZXRlVVJMKHRoaXMuX2Jhc2VVUkwsaHJlZil8fGhyZWY7Y29uc3Qgc291cmNlPXNvdXJjZU1hcC5zb3VyY2VzQ29udGVudCYmc291cmNlTWFwLnNvdXJjZXNDb250ZW50W2ldO2lmKHVybD09PXRoaXMuX2NvbXBpbGVkVVJMJiZzb3VyY2UpCnVybCs9Q29tbW9uLlVJU3RyaW5nKCc/IFtzbV0nKTt0aGlzLl9zb3VyY2VJbmZvcy5zZXQodXJsLG5ldyBTREsuVGV4dFNvdXJjZU1hcC5Tb3VyY2VJbmZvKHNvdXJjZSxudWxsKSk7c291cmNlc0xpc3QucHVzaCh1cmwpO30Kc291cmNlTWFwW1NESy5UZXh0U291cmNlTWFwLl9zb3VyY2VzTGlzdFN5bWJvbF09c291cmNlc0xpc3Q7fQpfcGFyc2VNYXAobWFwLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtsZXQgc291cmNlSW5kZXg9MDtsZXQgc291cmNlTGluZU51bWJlcj0wO2xldCBzb3VyY2VDb2x1bW5OdW1iZXI9MDtsZXQgbmFtZUluZGV4PTA7Y29uc3Qgc291cmNlcz1tYXBbU0RLLlRleHRTb3VyY2VNYXAuX3NvdXJjZXNMaXN0U3ltYm9sXTtjb25zdCBuYW1lcz1tYXAubmFtZXN8fFtdO2NvbnN0IHN0cmluZ0NoYXJJdGVyYXRvcj1uZXcgU0RLLlRleHRTb3VyY2VNYXAuU3RyaW5nQ2hhckl0ZXJhdG9yKG1hcC5tYXBwaW5ncyk7bGV0IHNvdXJjZVVSTD1zb3VyY2VzW3NvdXJjZUluZGV4XTt3aGlsZSh0cnVlKXtpZihzdHJpbmdDaGFySXRlcmF0b3IucGVlaygpPT09JywnKXtzdHJpbmdDaGFySXRlcmF0b3IubmV4dCgpO31lbHNle3doaWxlKHN0cmluZ0NoYXJJdGVyYXRvci5wZWVrKCk9PT0nOycpe2xpbmVOdW1iZXIrPTE7Y29sdW1uTnVtYmVyPTA7c3RyaW5nQ2hhckl0ZXJhdG9yLm5leHQoKTt9CmlmKCFzdHJpbmdDaGFySXRlcmF0b3IuaGFzTmV4dCgpKQpicmVhazt9CmNvbHVtbk51bWJlcis9dGhpcy5fZGVjb2RlVkxRKHN0cmluZ0NoYXJJdGVyYXRvcik7aWYoIXN0cmluZ0NoYXJJdGVyYXRvci5oYXNOZXh0KCl8fHRoaXMuX2lzU2VwYXJhdG9yKHN0cmluZ0NoYXJJdGVyYXRvci5wZWVrKCkpKXt0aGlzLl9tYXBwaW5ncy5wdXNoKG5ldyBTREsuU291cmNlTWFwRW50cnkobGluZU51bWJlcixjb2x1bW5OdW1iZXIpKTtjb250aW51ZTt9CmNvbnN0IHNvdXJjZUluZGV4RGVsdGE9dGhpcy5fZGVjb2RlVkxRKHN0cmluZ0NoYXJJdGVyYXRvcik7aWYoc291cmNlSW5kZXhEZWx0YSl7c291cmNlSW5kZXgrPXNvdXJjZUluZGV4RGVsdGE7c291cmNlVVJMPXNvdXJjZXNbc291cmNlSW5kZXhdO30Kc291cmNlTGluZU51bWJlcis9dGhpcy5fZGVjb2RlVkxRKHN0cmluZ0NoYXJJdGVyYXRvcik7c291cmNlQ29sdW1uTnVtYmVyKz10aGlzLl9kZWNvZGVWTFEoc3RyaW5nQ2hhckl0ZXJhdG9yKTtpZighc3RyaW5nQ2hhckl0ZXJhdG9yLmhhc05leHQoKXx8dGhpcy5faXNTZXBhcmF0b3Ioc3RyaW5nQ2hhckl0ZXJhdG9yLnBlZWsoKSkpe3RoaXMuX21hcHBpbmdzLnB1c2gobmV3IFNESy5Tb3VyY2VNYXBFbnRyeShsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixzb3VyY2VVUkwsc291cmNlTGluZU51bWJlcixzb3VyY2VDb2x1bW5OdW1iZXIpKTtjb250aW51ZTt9Cm5hbWVJbmRleCs9dGhpcy5fZGVjb2RlVkxRKHN0cmluZ0NoYXJJdGVyYXRvcik7dGhpcy5fbWFwcGluZ3MucHVzaChuZXcgU0RLLlNvdXJjZU1hcEVudHJ5KGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLHNvdXJjZVVSTCxzb3VyY2VMaW5lTnVtYmVyLHNvdXJjZUNvbHVtbk51bWJlcixuYW1lc1tuYW1lSW5kZXhdKSk7fQp0aGlzLl9tYXBwaW5ncy5zdGFibGVTb3J0KFNESy5Tb3VyY2VNYXBFbnRyeS5jb21wYXJlKTt9Cl9pc1NlcGFyYXRvcihjaGFyKXtyZXR1cm4gY2hhcj09PScsJ3x8Y2hhcj09PSc7Jzt9Cl9kZWNvZGVWTFEoc3RyaW5nQ2hhckl0ZXJhdG9yKXtsZXQgcmVzdWx0PTA7bGV0IHNoaWZ0PTA7bGV0IGRpZ2l0O2Rve2RpZ2l0PVNESy5UZXh0U291cmNlTWFwLl9iYXNlNjRNYXBbc3RyaW5nQ2hhckl0ZXJhdG9yLm5leHQoKV07cmVzdWx0Kz0oZGlnaXQmU0RLLlRleHRTb3VyY2VNYXAuX1ZMUV9CQVNFX01BU0spPDxzaGlmdDtzaGlmdCs9U0RLLlRleHRTb3VyY2VNYXAuX1ZMUV9CQVNFX1NISUZUO313aGlsZShkaWdpdCZTREsuVGV4dFNvdXJjZU1hcC5fVkxRX0NPTlRJTlVBVElPTl9NQVNLKTtjb25zdCBuZWdhdGl2ZT1yZXN1bHQmMTtyZXN1bHQ+Pj0xO3JldHVybiBuZWdhdGl2ZT8tcmVzdWx0OnJlc3VsdDt9CnJldmVyc2VNYXBUZXh0UmFuZ2UodXJsLHRleHRSYW5nZSl7ZnVuY3Rpb24gY29tcGFyYXRvcihwb3NpdGlvbixtYXBwaW5nKXtpZihwb3NpdGlvbi5saW5lTnVtYmVyIT09bWFwcGluZy5zb3VyY2VMaW5lTnVtYmVyKQpyZXR1cm4gcG9zaXRpb24ubGluZU51bWJlci1tYXBwaW5nLnNvdXJjZUxpbmVOdW1iZXI7cmV0dXJuIHBvc2l0aW9uLmNvbHVtbk51bWJlci1tYXBwaW5nLnNvdXJjZUNvbHVtbk51bWJlcjt9CmNvbnN0IG1hcHBpbmdzPXRoaXMuX3JldmVyc2VkTWFwcGluZ3ModXJsKTtjb25zdCBzdGFydEluZGV4PW1hcHBpbmdzLmxvd2VyQm91bmQoe2xpbmVOdW1iZXI6dGV4dFJhbmdlLnN0YXJ0TGluZSxjb2x1bW5OdW1iZXI6dGV4dFJhbmdlLnN0YXJ0Q29sdW1ufSxjb21wYXJhdG9yKTtjb25zdCBlbmRJbmRleD1tYXBwaW5ncy51cHBlckJvdW5kKHtsaW5lTnVtYmVyOnRleHRSYW5nZS5lbmRMaW5lLGNvbHVtbk51bWJlcjp0ZXh0UmFuZ2UuZW5kQ29sdW1ufSxjb21wYXJhdG9yKTtjb25zdCBzdGFydE1hcHBpbmc9bWFwcGluZ3Nbc3RhcnRJbmRleF07Y29uc3QgZW5kTWFwcGluZz1tYXBwaW5nc1tlbmRJbmRleF07cmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0TWFwcGluZy5saW5lTnVtYmVyLHN0YXJ0TWFwcGluZy5jb2x1bW5OdW1iZXIsZW5kTWFwcGluZy5saW5lTnVtYmVyLGVuZE1hcHBpbmcuY29sdW1uTnVtYmVyKTt9fTtTREsuVGV4dFNvdXJjZU1hcC5fVkxRX0JBU0VfU0hJRlQ9NTtTREsuVGV4dFNvdXJjZU1hcC5fVkxRX0JBU0VfTUFTSz0oMTw8NSktMTtTREsuVGV4dFNvdXJjZU1hcC5fVkxRX0NPTlRJTlVBVElPTl9NQVNLPTE8PDU7U0RLLlRleHRTb3VyY2VNYXAuU3RyaW5nQ2hhckl0ZXJhdG9yPWNsYXNze2NvbnN0cnVjdG9yKHN0cmluZyl7dGhpcy5fc3RyaW5nPXN0cmluZzt0aGlzLl9wb3NpdGlvbj0wO30KbmV4dCgpe3JldHVybiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX3Bvc2l0aW9uKyspO30KcGVlaygpe3JldHVybiB0aGlzLl9zdHJpbmcuY2hhckF0KHRoaXMuX3Bvc2l0aW9uKTt9Cmhhc05leHQoKXtyZXR1cm4gdGhpcy5fcG9zaXRpb248dGhpcy5fc3RyaW5nLmxlbmd0aDt9fTtTREsuVGV4dFNvdXJjZU1hcC5Tb3VyY2VJbmZvPWNsYXNze2NvbnN0cnVjdG9yKGNvbnRlbnQscmV2ZXJzZU1hcHBpbmdzKXt0aGlzLmNvbnRlbnQ9Y29udGVudDt0aGlzLnJldmVyc2VNYXBwaW5ncz1yZXZlcnNlTWFwcGluZ3M7fX07U0RLLlRleHRTb3VyY2VNYXAuX3NvdXJjZXNMaXN0U3ltYm9sPVN5bWJvbCgnc291cmNlc0xpc3QnKTs7U0RLLlNvdXJjZU1hcE1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIoKTt0aGlzLl90YXJnZXQ9dGFyZ2V0O3RoaXMuX2lzRW5hYmxlZD10cnVlO3RoaXMuX3JlbGF0aXZlU291cmNlVVJMPW5ldyBNYXAoKTt0aGlzLl9yZWxhdGl2ZVNvdXJjZU1hcFVSTD1uZXcgTWFwKCk7dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkw9bmV3IE1hcCgpO3RoaXMuX3NvdXJjZU1hcEJ5VVJMPW5ldyBNYXAoKTt0aGlzLl9zb3VyY2VNYXBVUkxUb0xvYWRpbmdDbGllbnRzPW5ldyBNdWx0aW1hcCgpO3RoaXMuX3NvdXJjZU1hcFVSTFRvQ2xpZW50cz1uZXcgTXVsdGltYXAoKTtTREsudGFyZ2V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5JbnNwZWN0ZWRVUkxDaGFuZ2VkLHRoaXMuX2luc3BlY3RlZFVSTENoYW5nZWQsdGhpcyk7fQpzZXRFbmFibGVkKGlzRW5hYmxlZCl7aWYoaXNFbmFibGVkPT09dGhpcy5faXNFbmFibGVkKQpyZXR1cm47dGhpcy5faXNFbmFibGVkPWlzRW5hYmxlZDtjb25zdCBjbGllbnRzPUFycmF5LmZyb20odGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwua2V5cygpKTtmb3IoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpe2NvbnN0IHJlbGF0aXZlU291cmNlVVJMPXRoaXMuX3JlbGF0aXZlU291cmNlVVJMLmdldChjbGllbnQpO2NvbnN0IHJlbGF0aXZlU291cmNlTWFwVVJMPXRoaXMuX3JlbGF0aXZlU291cmNlTWFwVVJMLmdldChjbGllbnQpO3RoaXMuZGV0YWNoU291cmNlTWFwKGNsaWVudCk7dGhpcy5hdHRhY2hTb3VyY2VNYXAoY2xpZW50LHJlbGF0aXZlU291cmNlVVJMLHJlbGF0aXZlU291cmNlTWFwVVJMKTt9fQpfaW5zcGVjdGVkVVJMQ2hhbmdlZChldmVudCl7aWYoZXZlbnQuZGF0YSE9PXRoaXMuX3RhcmdldCkKcmV0dXJuO2NvbnN0IGNsaWVudHM9QXJyYXkuZnJvbSh0aGlzLl9yZXNvbHZlZFNvdXJjZU1hcFVSTC5rZXlzKCkpO2Zvcihjb25zdCBjbGllbnQgb2YgY2xpZW50cyl7Y29uc3QgcmVsYXRpdmVTb3VyY2VVUkw9dGhpcy5fcmVsYXRpdmVTb3VyY2VVUkwuZ2V0KGNsaWVudCk7Y29uc3QgcmVsYXRpdmVTb3VyY2VNYXBVUkw9dGhpcy5fcmVsYXRpdmVTb3VyY2VNYXBVUkwuZ2V0KGNsaWVudCk7Y29uc3QgcmVzb2x2ZWRTb3VyY2VNYXBVUkw9dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuZ2V0KGNsaWVudCk7Y29uc3Qgc291cmNlTWFwVVJMPXRoaXMuX3Jlc29sdmVSZWxhdGl2ZVVSTHMocmVsYXRpdmVTb3VyY2VVUkwscmVsYXRpdmVTb3VyY2VNYXBVUkwpLnNvdXJjZU1hcFVSTDtpZihzb3VyY2VNYXBVUkwhPT1yZXNvbHZlZFNvdXJjZU1hcFVSTCl7dGhpcy5kZXRhY2hTb3VyY2VNYXAoY2xpZW50KTt0aGlzLmF0dGFjaFNvdXJjZU1hcChjbGllbnQscmVsYXRpdmVTb3VyY2VVUkwscmVsYXRpdmVTb3VyY2VNYXBVUkwpO319fQpzb3VyY2VNYXBGb3JDbGllbnQoY2xpZW50KXtjb25zdCBzb3VyY2VNYXBVUkw9dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuZ2V0KGNsaWVudCk7cmV0dXJuIHNvdXJjZU1hcFVSTD90aGlzLl9zb3VyY2VNYXBCeVVSTC5nZXQoc291cmNlTWFwVVJMKXx8bnVsbDpudWxsO30KY2xpZW50c0ZvclNvdXJjZU1hcChzb3VyY2VNYXApe2lmKHRoaXMuX3NvdXJjZU1hcFVSTFRvQ2xpZW50cy5oYXMoc291cmNlTWFwLnVybCgpKSkKcmV0dXJuIHRoaXMuX3NvdXJjZU1hcFVSTFRvQ2xpZW50cy5nZXQoc291cmNlTWFwLnVybCgpKS52YWx1ZXNBcnJheSgpO3JldHVybiB0aGlzLl9zb3VyY2VNYXBVUkxUb0xvYWRpbmdDbGllbnRzLmdldChzb3VyY2VNYXAudXJsKCkpLnZhbHVlc0FycmF5KCk7fQphcHBseVNvdXJjZU1hcEVkaXQoZWRpdFJlc3VsdCl7Y29uc29sZS5hc3NlcnQodGhpcy5fc291cmNlTWFwQnlVUkwuaGFzKGVkaXRSZXN1bHQubWFwLnVybCgpKSwnQ2Fubm90IGFwcGx5IGVkaXQgcmVzdWx0IGZvciBub24tZXhpc3Rpbmcgc291cmNlIG1hcCcpO3RoaXMuX3NvdXJjZU1hcEJ5VVJMLnNldChlZGl0UmVzdWx0Lm1hcC51cmwoKSxlZGl0UmVzdWx0Lm1hcCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzLlNvdXJjZU1hcENoYW5nZWQse3NvdXJjZU1hcDplZGl0UmVzdWx0Lm1hcCxuZXdTb3VyY2VzOmVkaXRSZXN1bHQubmV3U291cmNlc30pO30KX3Jlc29sdmVSZWxhdGl2ZVVSTHMoc291cmNlVVJMLHNvdXJjZU1hcFVSTCl7Y29uc3QgcmVzb2x2ZWRTb3VyY2VVUkw9Q29tbW9uLlBhcnNlZFVSTC5jb21wbGV0ZVVSTCh0aGlzLl90YXJnZXQuaW5zcGVjdGVkVVJMKCksc291cmNlVVJMKTtjb25zdCByZXNvbHZlZFNvdXJjZU1hcFVSTD1yZXNvbHZlZFNvdXJjZVVSTD9Db21tb24uUGFyc2VkVVJMLmNvbXBsZXRlVVJMKHJlc29sdmVkU291cmNlVVJMLHNvdXJjZU1hcFVSTCk6bnVsbDtyZXR1cm57c291cmNlVVJMOnJlc29sdmVkU291cmNlVVJMLHNvdXJjZU1hcFVSTDpyZXNvbHZlZFNvdXJjZU1hcFVSTH07fQphdHRhY2hTb3VyY2VNYXAoY2xpZW50LHNvdXJjZVVSTCxzb3VyY2VNYXBVUkwpe2lmKCFzb3VyY2VNYXBVUkwpCnJldHVybjtjb25zb2xlLmFzc2VydCghdGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuaGFzKGNsaWVudCksJ1NvdXJjZU1hcCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGNsaWVudCcpO2NvbnN0IHJlc29sdmVkVVJMcz10aGlzLl9yZXNvbHZlUmVsYXRpdmVVUkxzKHNvdXJjZVVSTCxzb3VyY2VNYXBVUkwpO2lmKCFyZXNvbHZlZFVSTHMuc291cmNlVVJMfHwhcmVzb2x2ZWRVUkxzLnNvdXJjZU1hcFVSTCkKcmV0dXJuO3RoaXMuX3JlbGF0aXZlU291cmNlVVJMLnNldChjbGllbnQsc291cmNlVVJMKTt0aGlzLl9yZWxhdGl2ZVNvdXJjZU1hcFVSTC5zZXQoY2xpZW50LHNvdXJjZU1hcFVSTCk7dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuc2V0KGNsaWVudCxyZXNvbHZlZFVSTHMuc291cmNlTWFwVVJMKTtzb3VyY2VVUkw9cmVzb2x2ZWRVUkxzLnNvdXJjZVVSTDtzb3VyY2VNYXBVUkw9cmVzb2x2ZWRVUkxzLnNvdXJjZU1hcFVSTDtpZighdGhpcy5faXNFbmFibGVkKQpyZXR1cm47dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzLlNvdXJjZU1hcFdpbGxBdHRhY2gsY2xpZW50KTtpZih0aGlzLl9zb3VyY2VNYXBCeVVSTC5oYXMoc291cmNlTWFwVVJMKSl7YXR0YWNoLmNhbGwodGhpcyxzb3VyY2VNYXBVUkwsY2xpZW50KTtyZXR1cm47fQppZighdGhpcy5fc291cmNlTWFwVVJMVG9Mb2FkaW5nQ2xpZW50cy5oYXMoc291cmNlTWFwVVJMKSl7U0RLLlRleHRTb3VyY2VNYXAubG9hZChzb3VyY2VNYXBVUkwsc291cmNlVVJMKS50aGVuKG9uVGV4dFNvdXJjZU1hcExvYWRlZC5iaW5kKHRoaXMsc291cmNlTWFwVVJMKSkudGhlbihvblNvdXJjZU1hcC5iaW5kKHRoaXMsc291cmNlTWFwVVJMKSk7fQp0aGlzLl9zb3VyY2VNYXBVUkxUb0xvYWRpbmdDbGllbnRzLnNldChzb3VyY2VNYXBVUkwsY2xpZW50KTtmdW5jdGlvbiBvblRleHRTb3VyY2VNYXBMb2FkZWQoc291cmNlTWFwVVJMLHNvdXJjZU1hcCl7aWYoIXNvdXJjZU1hcCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO2NvbnN0IGZhY3RvcnlFeHRlbnNpb249dGhpcy5fZmFjdG9yeUZvclNvdXJjZU1hcChzb3VyY2VNYXApO2lmKCFmYWN0b3J5RXh0ZW5zaW9uKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChzb3VyY2VNYXApKTtyZXR1cm4gZmFjdG9yeUV4dGVuc2lvbi5pbnN0YW5jZSgpLnRoZW4oZmFjdG9yeT0+ZmFjdG9yeS5lZGl0YWJsZVNvdXJjZU1hcCh0aGlzLl90YXJnZXQsc291cmNlTWFwKSkudGhlbihtYXA9Pm1hcHx8c291cmNlTWFwKS5jYXRjaEV4Y2VwdGlvbigobnVsbCkpO30KZnVuY3Rpb24gb25Tb3VyY2VNYXAoc291cmNlTWFwVVJMLHNvdXJjZU1hcCl7dGhpcy5fc291cmNlTWFwTG9hZGVkRm9yVGVzdCgpO2NvbnN0IGNsaWVudHM9dGhpcy5fc291cmNlTWFwVVJMVG9Mb2FkaW5nQ2xpZW50cy5nZXQoc291cmNlTWFwVVJMKTt0aGlzLl9zb3VyY2VNYXBVUkxUb0xvYWRpbmdDbGllbnRzLmRlbGV0ZUFsbChzb3VyY2VNYXBVUkwpO2lmKCFjbGllbnRzLnNpemUpCnJldHVybjtpZighc291cmNlTWFwKXtmb3IoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5Tb3VyY2VNYXBNYW5hZ2VyLkV2ZW50cy5Tb3VyY2VNYXBGYWlsZWRUb0F0dGFjaCxjbGllbnQpO3JldHVybjt9CnRoaXMuX3NvdXJjZU1hcEJ5VVJMLnNldChzb3VyY2VNYXBVUkwsc291cmNlTWFwKTtmb3IoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpCmF0dGFjaC5jYWxsKHRoaXMsc291cmNlTWFwVVJMLGNsaWVudCk7fQpmdW5jdGlvbiBhdHRhY2goc291cmNlTWFwVVJMLGNsaWVudCl7dGhpcy5fc291cmNlTWFwVVJMVG9DbGllbnRzLnNldChzb3VyY2VNYXBVUkwsY2xpZW50KTtjb25zdCBzb3VyY2VNYXA9dGhpcy5fc291cmNlTWFwQnlVUkwuZ2V0KHNvdXJjZU1hcFVSTCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzLlNvdXJjZU1hcEF0dGFjaGVkLHtjbGllbnQ6Y2xpZW50LHNvdXJjZU1hcDpzb3VyY2VNYXB9KTt9fQpfZmFjdG9yeUZvclNvdXJjZU1hcChzb3VyY2VNYXApe2NvbnN0IHNvdXJjZUV4dGVuc2lvbnM9bmV3IFNldCgpO2Zvcihjb25zdCB1cmwgb2Ygc291cmNlTWFwLnNvdXJjZVVSTHMoKSkKc291cmNlRXh0ZW5zaW9ucy5hZGQoQ29tbW9uLlBhcnNlZFVSTC5leHRyYWN0RXh0ZW5zaW9uKHVybCkpO2Zvcihjb25zdCBydW50aW1lRXh0ZW5zaW9uIG9mIHNlbGYucnVudGltZS5leHRlbnNpb25zKFNESy5Tb3VyY2VNYXBGYWN0b3J5KSl7Y29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucz1uZXcgU2V0KHJ1bnRpbWVFeHRlbnNpb24uZGVzY3JpcHRvcigpWydleHRlbnNpb25zJ10pO2lmKHN1cHBvcnRlZEV4dGVuc2lvbnMuY29udGFpbnNBbGwoc291cmNlRXh0ZW5zaW9ucykpCnJldHVybiBydW50aW1lRXh0ZW5zaW9uO30KcmV0dXJuIG51bGw7fQpkZXRhY2hTb3VyY2VNYXAoY2xpZW50KXtjb25zdCBzb3VyY2VNYXBVUkw9dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuZ2V0KGNsaWVudCk7dGhpcy5fcmVsYXRpdmVTb3VyY2VVUkwuZGVsZXRlKGNsaWVudCk7dGhpcy5fcmVsYXRpdmVTb3VyY2VNYXBVUkwuZGVsZXRlKGNsaWVudCk7dGhpcy5fcmVzb2x2ZWRTb3VyY2VNYXBVUkwuZGVsZXRlKGNsaWVudCk7aWYoIXNvdXJjZU1hcFVSTCkKcmV0dXJuO2lmKCF0aGlzLl9zb3VyY2VNYXBVUkxUb0NsaWVudHMuaGFzVmFsdWUoc291cmNlTWFwVVJMLGNsaWVudCkpe2lmKHRoaXMuX3NvdXJjZU1hcFVSTFRvTG9hZGluZ0NsaWVudHMuZGVsZXRlKHNvdXJjZU1hcFVSTCxjbGllbnQpKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU291cmNlTWFwTWFuYWdlci5FdmVudHMuU291cmNlTWFwRmFpbGVkVG9BdHRhY2gsY2xpZW50KTtyZXR1cm47fQp0aGlzLl9zb3VyY2VNYXBVUkxUb0NsaWVudHMuZGVsZXRlKHNvdXJjZU1hcFVSTCxjbGllbnQpO2NvbnN0IHNvdXJjZU1hcD10aGlzLl9zb3VyY2VNYXBCeVVSTC5nZXQoc291cmNlTWFwVVJMKTtpZighdGhpcy5fc291cmNlTWFwVVJMVG9DbGllbnRzLmhhcyhzb3VyY2VNYXBVUkwpKQp0aGlzLl9zb3VyY2VNYXBCeVVSTC5kZWxldGUoc291cmNlTWFwVVJMKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuU291cmNlTWFwTWFuYWdlci5FdmVudHMuU291cmNlTWFwRGV0YWNoZWQse2NsaWVudDpjbGllbnQsc291cmNlTWFwOnNvdXJjZU1hcH0pO30KX3NvdXJjZU1hcExvYWRlZEZvclRlc3QoKXt9CmRpc3Bvc2UoKXtTREsudGFyZ2V0TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5JbnNwZWN0ZWRVUkxDaGFuZ2VkLHRoaXMuX2luc3BlY3RlZFVSTENoYW5nZWQsdGhpcyk7fX07U0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzPXtTb3VyY2VNYXBXaWxsQXR0YWNoOlN5bWJvbCgnU291cmNlTWFwV2lsbEF0dGFjaCcpLFNvdXJjZU1hcEZhaWxlZFRvQXR0YWNoOlN5bWJvbCgnU291cmNlTWFwRmFpbGVkVG9BdHRhY2gnKSxTb3VyY2VNYXBBdHRhY2hlZDpTeW1ib2woJ1NvdXJjZU1hcEF0dGFjaGVkJyksU291cmNlTWFwRGV0YWNoZWQ6U3ltYm9sKCdTb3VyY2VNYXBEZXRhY2hlZCcpLFNvdXJjZU1hcENoYW5nZWQ6U3ltYm9sKCdTb3VyY2VNYXBDaGFuZ2VkJyl9OztTREsuTmV0d29ya01hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX2Rpc3BhdGNoZXI9bmV3IFNESy5OZXR3b3JrRGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9uZXR3b3JrQWdlbnQ9dGFyZ2V0Lm5ldHdvcmtBZ2VudCgpO3RhcmdldC5yZWdpc3Rlck5ldHdvcmtEaXNwYXRjaGVyKHRoaXMuX2Rpc3BhdGNoZXIpO2lmKENvbW1vbi5tb2R1bGVTZXR0aW5nKCdjYWNoZURpc2FibGVkJykuZ2V0KCkpCnRoaXMuX25ldHdvcmtBZ2VudC5zZXRDYWNoZURpc2FibGVkKHRydWUpO3RoaXMuX25ldHdvcmtBZ2VudC5lbmFibGUodW5kZWZpbmVkLHVuZGVmaW5lZCxTREsuTmV0d29ya01hbmFnZXIuTUFYX0VBR0VSX1BPU1RfUkVRVUVTVF9CT0RZX0xFTkdUSCk7dGhpcy5fYnlwYXNzU2VydmljZVdvcmtlclNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2J5cGFzc1NlcnZpY2VXb3JrZXInLGZhbHNlKTtpZih0aGlzLl9ieXBhc3NTZXJ2aWNlV29ya2VyU2V0dGluZy5nZXQoKSkKdGhpcy5fYnlwYXNzU2VydmljZVdvcmtlckNoYW5nZWQoKTt0aGlzLl9ieXBhc3NTZXJ2aWNlV29ya2VyU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9ieXBhc3NTZXJ2aWNlV29ya2VyQ2hhbmdlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnY2FjaGVEaXNhYmxlZCcpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2NhY2hlRGlzYWJsZWRTZXR0aW5nQ2hhbmdlZCx0aGlzKTt9CnN0YXRpYyBmb3JSZXF1ZXN0KHJlcXVlc3Qpe3JldHVybiByZXF1ZXN0W1NESy5OZXR3b3JrTWFuYWdlci5fbmV0d29ya01hbmFnZXJGb3JSZXF1ZXN0U3ltYm9sXTt9CnN0YXRpYyBjYW5SZXBsYXlSZXF1ZXN0KHJlcXVlc3Qpe3JldHVybiEhcmVxdWVzdFtTREsuTmV0d29ya01hbmFnZXIuX25ldHdvcmtNYW5hZ2VyRm9yUmVxdWVzdFN5bWJvbF0mJnJlcXVlc3QucmVzb3VyY2VUeXBlKCk9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5YSFI7fQpzdGF0aWMgcmVwbGF5UmVxdWVzdChyZXF1ZXN0KXtjb25zdCBtYW5hZ2VyPXJlcXVlc3RbU0RLLk5ldHdvcmtNYW5hZ2VyLl9uZXR3b3JrTWFuYWdlckZvclJlcXVlc3RTeW1ib2xdO2lmKCFtYW5hZ2VyKQpyZXR1cm47bWFuYWdlci5fbmV0d29ya0FnZW50LnJlcGxheVhIUihyZXF1ZXN0LnJlcXVlc3RJZCgpKTt9CnN0YXRpYyBhc3luYyBzZWFyY2hJblJlcXVlc3QocmVxdWVzdCxxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe2NvbnN0IG1hbmFnZXI9U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QocmVxdWVzdCk7aWYoIW1hbmFnZXIpCnJldHVybltdO2NvbnN0IHJlc3BvbnNlPWF3YWl0IG1hbmFnZXIuX25ldHdvcmtBZ2VudC5pbnZva2Vfc2VhcmNoSW5SZXNwb25zZUJvZHkoe3JlcXVlc3RJZDpyZXF1ZXN0LnJlcXVlc3RJZCgpLHF1ZXJ5OnF1ZXJ5LGNhc2VTZW5zaXRpdmU6Y2FzZVNlbnNpdGl2ZSxpc1JlZ2V4OmlzUmVnZXh9KTtyZXR1cm4gcmVzcG9uc2UucmVzdWx0fHxbXTt9CnN0YXRpYyBhc3luYyByZXF1ZXN0Q29udGVudERhdGEocmVxdWVzdCl7aWYocmVxdWVzdC5yZXNvdXJjZVR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLldlYlNvY2tldCkKcmV0dXJue2Vycm9yOidDb250ZW50IGZvciBXZWJTb2NrZXRzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkJyxjb250ZW50Om51bGwsZW5jb2RlZDpmYWxzZX07aWYoIXJlcXVlc3QuZmluaXNoZWQpCmF3YWl0IHJlcXVlc3Qub25jZShTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyk7Y29uc3QgbWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KTtpZighbWFuYWdlcikKcmV0dXJue2Vycm9yOidObyBuZXR3b3JrIG1hbmFnZXIgZm9yIHJlcXVlc3QnLGNvbnRlbnQ6bnVsbCxlbmNvZGVkOmZhbHNlfTtjb25zdCByZXNwb25zZT1hd2FpdCBtYW5hZ2VyLl9uZXR3b3JrQWdlbnQuaW52b2tlX2dldFJlc3BvbnNlQm9keSh7cmVxdWVzdElkOnJlcXVlc3QucmVxdWVzdElkKCl9KTtjb25zdCBlcnJvcj1yZXNwb25zZVtQcm90b2NvbC5FcnJvcl18fG51bGw7cmV0dXJue2Vycm9yOmVycm9yLGNvbnRlbnQ6ZXJyb3I/bnVsbDpyZXNwb25zZS5ib2R5LGVuY29kZWQ6cmVzcG9uc2UuYmFzZTY0RW5jb2RlZH07fQpzdGF0aWMgcmVxdWVzdFBvc3REYXRhKHJlcXVlc3Qpe2NvbnN0IG1hbmFnZXI9U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QocmVxdWVzdCk7aWYobWFuYWdlcikKcmV0dXJuIG1hbmFnZXIuX25ldHdvcmtBZ2VudC5nZXRSZXF1ZXN0UG9zdERhdGEocmVxdWVzdC5iYWNrZW5kUmVxdWVzdElkKCkpO2NvbnNvbGUuZXJyb3IoJ05vIG5ldHdvcmsgbWFuYWdlciBmb3IgcmVxdWVzdCcpO3JldHVybihQcm9taXNlLnJlc29sdmUobnVsbCkpO30Kc3RhdGljIF9jb25uZWN0aW9uVHlwZShjb25kaXRpb25zKXtpZighY29uZGl0aW9ucy5kb3dubG9hZCYmIWNvbmRpdGlvbnMudXBsb2FkKQpyZXR1cm4gUHJvdG9jb2wuTmV0d29yay5Db25uZWN0aW9uVHlwZS5Ob25lO2xldCB0eXBlcz1TREsuTmV0d29ya01hbmFnZXIuX2Nvbm5lY3Rpb25UeXBlcztpZighdHlwZXMpe1NESy5OZXR3b3JrTWFuYWdlci5fY29ubmVjdGlvblR5cGVzPVtdO3R5cGVzPVNESy5OZXR3b3JrTWFuYWdlci5fY29ubmVjdGlvblR5cGVzO3R5cGVzLnB1c2goWycyZycsUHJvdG9jb2wuTmV0d29yay5Db25uZWN0aW9uVHlwZS5DZWxsdWxhcjJnXSk7dHlwZXMucHVzaChbJzNnJyxQcm90b2NvbC5OZXR3b3JrLkNvbm5lY3Rpb25UeXBlLkNlbGx1bGFyM2ddKTt0eXBlcy5wdXNoKFsnNGcnLFByb3RvY29sLk5ldHdvcmsuQ29ubmVjdGlvblR5cGUuQ2VsbHVsYXI0Z10pO3R5cGVzLnB1c2goWydibHVldG9vdGgnLFByb3RvY29sLk5ldHdvcmsuQ29ubmVjdGlvblR5cGUuQmx1ZXRvb3RoXSk7dHlwZXMucHVzaChbJ3dpZmknLFByb3RvY29sLk5ldHdvcmsuQ29ubmVjdGlvblR5cGUuV2lmaV0pO3R5cGVzLnB1c2goWyd3aW1heCcsUHJvdG9jb2wuTmV0d29yay5Db25uZWN0aW9uVHlwZS5XaW1heF0pO30KZm9yKGNvbnN0IHR5cGUgb2YgdHlwZXMpe2lmKGNvbmRpdGlvbnMudGl0bGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHR5cGVbMF0pIT09LTEpCnJldHVybiB0eXBlWzFdO30KcmV0dXJuIFByb3RvY29sLk5ldHdvcmsuQ29ubmVjdGlvblR5cGUuT3RoZXI7fQpzdGF0aWMgbG93ZXJjYXNlSGVhZGVycyhoZWFkZXJzKXtjb25zdCBuZXdIZWFkZXJzPXt9O2Zvcihjb25zdCBoZWFkZXJOYW1lIGluIGhlYWRlcnMpCm5ld0hlYWRlcnNbaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpXT1oZWFkZXJzW2hlYWRlck5hbWVdO3JldHVybiBuZXdIZWFkZXJzO30KaW5mbGlnaHRSZXF1ZXN0Rm9yVVJMKHVybCl7cmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuX2luZmxpZ2h0UmVxdWVzdHNCeVVSTFt1cmxdO30KX2NhY2hlRGlzYWJsZWRTZXR0aW5nQ2hhbmdlZChldmVudCl7Y29uc3QgZW5hYmxlZD0oZXZlbnQuZGF0YSk7dGhpcy5fbmV0d29ya0FnZW50LnNldENhY2hlRGlzYWJsZWQoZW5hYmxlZCk7fQpkaXNwb3NlKCl7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2NhY2hlRGlzYWJsZWQnKS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl9jYWNoZURpc2FibGVkU2V0dGluZ0NoYW5nZWQsdGhpcyk7fQpfYnlwYXNzU2VydmljZVdvcmtlckNoYW5nZWQoKXt0aGlzLl9uZXR3b3JrQWdlbnQuc2V0QnlwYXNzU2VydmljZVdvcmtlcih0aGlzLl9ieXBhc3NTZXJ2aWNlV29ya2VyU2V0dGluZy5nZXQoKSk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFNESy5OZXR3b3JrTWFuYWdlcixTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTmV0d29yayx0cnVlKTtTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzPXtSZXF1ZXN0U3RhcnRlZDpTeW1ib2woJ1JlcXVlc3RTdGFydGVkJyksUmVxdWVzdFVwZGF0ZWQ6U3ltYm9sKCdSZXF1ZXN0VXBkYXRlZCcpLFJlcXVlc3RGaW5pc2hlZDpTeW1ib2woJ1JlcXVlc3RGaW5pc2hlZCcpLFJlcXVlc3RVcGRhdGVEcm9wcGVkOlN5bWJvbCgnUmVxdWVzdFVwZGF0ZURyb3BwZWQnKSxSZXNwb25zZVJlY2VpdmVkOlN5bWJvbCgnUmVzcG9uc2VSZWNlaXZlZCcpLE1lc3NhZ2VHZW5lcmF0ZWQ6U3ltYm9sKCdNZXNzYWdlR2VuZXJhdGVkJyksUmVxdWVzdFJlZGlyZWN0ZWQ6U3ltYm9sKCdSZXF1ZXN0UmVkaXJlY3RlZCcpLH07U0RLLk5ldHdvcmtNYW5hZ2VyLk1lc3NhZ2U7U0RLLk5ldHdvcmtNYW5hZ2VyLl9NSU1FVHlwZXM9eyd0ZXh0L2h0bWwnOnsnZG9jdW1lbnQnOnRydWV9LCd0ZXh0L3htbCc6eydkb2N1bWVudCc6dHJ1ZX0sJ3RleHQvcGxhaW4nOnsnZG9jdW1lbnQnOnRydWV9LCdhcHBsaWNhdGlvbi94aHRtbCt4bWwnOnsnZG9jdW1lbnQnOnRydWV9LCdpbWFnZS9zdmcreG1sJzp7J2RvY3VtZW50Jzp0cnVlfSwndGV4dC9jc3MnOnsnc3R5bGVzaGVldCc6dHJ1ZX0sJ3RleHQveHNsJzp7J3N0eWxlc2hlZXQnOnRydWV9LCd0ZXh0L3Z0dCc6eyd0ZXh0dHJhY2snOnRydWV9LH07U0RLLk5ldHdvcmtNYW5hZ2VyLkNvbmRpdGlvbnM7U0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnM9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnT25saW5lJyksZG93bmxvYWQ6LTEsdXBsb2FkOi0xLGxhdGVuY3k6MH07U0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ09mZmxpbmUnKSxkb3dubG9hZDowLHVwbG9hZDowLGxhdGVuY3k6MCx9O1NESy5OZXR3b3JrTWFuYWdlci5TbG93M0dDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1Nsb3cgM0cnKSxkb3dubG9hZDo1MDAqMTAyNC84Ki44LHVwbG9hZDo1MDAqMTAyNC84Ki44LGxhdGVuY3k6NDAwKjUsfTtTREsuTmV0d29ya01hbmFnZXIuRmFzdDNHQ29uZGl0aW9ucz17dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdGYXN0IDNHJyksZG93bmxvYWQ6MS42KjEwMjQqMTAyNC84Ki45LHVwbG9hZDo3NTAqMTAyNC84Ki45LGxhdGVuY3k6MTUwKjMuNzUsfTtTREsuTmV0d29ya01hbmFnZXIuQmxvY2tlZFBhdHRlcm47U0RLLk5ldHdvcmtNYW5hZ2VyLl9uZXR3b3JrTWFuYWdlckZvclJlcXVlc3RTeW1ib2w9U3ltYm9sKCdOZXR3b3JrTWFuYWdlcicpO1NESy5OZXR3b3JrTWFuYWdlci5NQVhfRUFHRVJfUE9TVF9SRVFVRVNUX0JPRFlfTEVOR1RIPTY0KjEwMjQ7U0RLLk5ldHdvcmtEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKG1hbmFnZXIpe3RoaXMuX21hbmFnZXI9bWFuYWdlcjt0aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlJZD17fTt0aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlVUkw9e307fQpfaGVhZGVyc01hcFRvSGVhZGVyc0FycmF5KGhlYWRlcnNNYXApe2NvbnN0IHJlc3VsdD1bXTtmb3IoY29uc3QgbmFtZSBpbiBoZWFkZXJzTWFwKXtjb25zdCB2YWx1ZXM9aGVhZGVyc01hcFtuYW1lXS5zcGxpdCgnXG4nKTtmb3IobGV0IGk9MDtpPHZhbHVlcy5sZW5ndGg7KytpKQpyZXN1bHQucHVzaCh7bmFtZTpuYW1lLHZhbHVlOnZhbHVlc1tpXX0pO30KcmV0dXJuIHJlc3VsdDt9Cl91cGRhdGVOZXR3b3JrUmVxdWVzdFdpdGhSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0LHJlcXVlc3Qpe25ldHdvcmtSZXF1ZXN0LnJlcXVlc3RNZXRob2Q9cmVxdWVzdC5tZXRob2Q7bmV0d29ya1JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnModGhpcy5faGVhZGVyc01hcFRvSGVhZGVyc0FycmF5KHJlcXVlc3QuaGVhZGVycykpO25ldHdvcmtSZXF1ZXN0LnNldFJlcXVlc3RGb3JtRGF0YSghIXJlcXVlc3QuaGFzUG9zdERhdGEscmVxdWVzdC5wb3N0RGF0YXx8bnVsbCk7bmV0d29ya1JlcXVlc3Quc2V0SW5pdGlhbFByaW9yaXR5KHJlcXVlc3QuaW5pdGlhbFByaW9yaXR5KTtuZXR3b3JrUmVxdWVzdC5taXhlZENvbnRlbnRUeXBlPXJlcXVlc3QubWl4ZWRDb250ZW50VHlwZXx8UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5Ob25lO25ldHdvcmtSZXF1ZXN0LnNldFJlZmVycmVyUG9saWN5KHJlcXVlc3QucmVmZXJyZXJQb2xpY3kpO30KX3VwZGF0ZU5ldHdvcmtSZXF1ZXN0V2l0aFJlc3BvbnNlKG5ldHdvcmtSZXF1ZXN0LHJlc3BvbnNlKXtpZihyZXNwb25zZS51cmwmJm5ldHdvcmtSZXF1ZXN0LnVybCgpIT09cmVzcG9uc2UudXJsKQpuZXR3b3JrUmVxdWVzdC5zZXRVcmwocmVzcG9uc2UudXJsKTtuZXR3b3JrUmVxdWVzdC5taW1lVHlwZT1yZXNwb25zZS5taW1lVHlwZTtuZXR3b3JrUmVxdWVzdC5zdGF0dXNDb2RlPXJlc3BvbnNlLnN0YXR1cztuZXR3b3JrUmVxdWVzdC5zdGF0dXNUZXh0PXJlc3BvbnNlLnN0YXR1c1RleHQ7bmV0d29ya1JlcXVlc3QucmVzcG9uc2VIZWFkZXJzPXRoaXMuX2hlYWRlcnNNYXBUb0hlYWRlcnNBcnJheShyZXNwb25zZS5oZWFkZXJzKTtpZihyZXNwb25zZS5lbmNvZGVkRGF0YUxlbmd0aD49MCkKbmV0d29ya1JlcXVlc3Quc2V0VHJhbnNmZXJTaXplKHJlc3BvbnNlLmVuY29kZWREYXRhTGVuZ3RoKTtpZihyZXNwb25zZS5oZWFkZXJzVGV4dCkKbmV0d29ya1JlcXVlc3QucmVzcG9uc2VIZWFkZXJzVGV4dD1yZXNwb25zZS5oZWFkZXJzVGV4dDtpZihyZXNwb25zZS5yZXF1ZXN0SGVhZGVycyl7bmV0d29ya1JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnModGhpcy5faGVhZGVyc01hcFRvSGVhZGVyc0FycmF5KHJlc3BvbnNlLnJlcXVlc3RIZWFkZXJzKSk7bmV0d29ya1JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnNUZXh0KHJlc3BvbnNlLnJlcXVlc3RIZWFkZXJzVGV4dHx8JycpO30KbmV0d29ya1JlcXVlc3QuY29ubmVjdGlvblJldXNlZD1yZXNwb25zZS5jb25uZWN0aW9uUmV1c2VkO25ldHdvcmtSZXF1ZXN0LmNvbm5lY3Rpb25JZD1TdHJpbmcocmVzcG9uc2UuY29ubmVjdGlvbklkKTtpZihyZXNwb25zZS5yZW1vdGVJUEFkZHJlc3MpCm5ldHdvcmtSZXF1ZXN0LnNldFJlbW90ZUFkZHJlc3MocmVzcG9uc2UucmVtb3RlSVBBZGRyZXNzLHJlc3BvbnNlLnJlbW90ZVBvcnR8fC0xKTtpZihyZXNwb25zZS5mcm9tU2VydmljZVdvcmtlcikKbmV0d29ya1JlcXVlc3QuZmV0Y2hlZFZpYVNlcnZpY2VXb3JrZXI9dHJ1ZTtpZihyZXNwb25zZS5mcm9tRGlza0NhY2hlKQpuZXR3b3JrUmVxdWVzdC5zZXRGcm9tRGlza0NhY2hlKCk7bmV0d29ya1JlcXVlc3QudGltaW5nPXJlc3BvbnNlLnRpbWluZztuZXR3b3JrUmVxdWVzdC5wcm90b2NvbD1yZXNwb25zZS5wcm90b2NvbDtuZXR3b3JrUmVxdWVzdC5zZXRTZWN1cml0eVN0YXRlKHJlc3BvbnNlLnNlY3VyaXR5U3RhdGUpO2lmKCF0aGlzLl9taW1lVHlwZUlzQ29uc2lzdGVudFdpdGhUeXBlKG5ldHdvcmtSZXF1ZXN0KSl7Y29uc3QgbWVzc2FnZT1Db21tb24uVUlTdHJpbmcoJ1Jlc291cmNlIGludGVycHJldGVkIGFzICVzIGJ1dCB0cmFuc2ZlcnJlZCB3aXRoIE1JTUUgdHlwZSAlczogIiVzIi4nLG5ldHdvcmtSZXF1ZXN0LnJlc291cmNlVHlwZSgpLnRpdGxlKCksbmV0d29ya1JlcXVlc3QubWltZVR5cGUsbmV0d29ya1JlcXVlc3QudXJsKCkpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuTWVzc2FnZUdlbmVyYXRlZCx7bWVzc2FnZTptZXNzYWdlLHJlcXVlc3RJZDpuZXR3b3JrUmVxdWVzdC5yZXF1ZXN0SWQoKSx3YXJuaW5nOnRydWV9KTt9CmlmKHJlc3BvbnNlLnNlY3VyaXR5RGV0YWlscykKbmV0d29ya1JlcXVlc3Quc2V0U2VjdXJpdHlEZXRhaWxzKHJlc3BvbnNlLnNlY3VyaXR5RGV0YWlscyk7fQpfbWltZVR5cGVJc0NvbnNpc3RlbnRXaXRoVHlwZShuZXR3b3JrUmVxdWVzdCl7aWYobmV0d29ya1JlcXVlc3QuaGFzRXJyb3JTdGF0dXNDb2RlKCl8fG5ldHdvcmtSZXF1ZXN0LnN0YXR1c0NvZGU9PT0zMDR8fG5ldHdvcmtSZXF1ZXN0LnN0YXR1c0NvZGU9PT0yMDQpCnJldHVybiB0cnVlO2NvbnN0IHJlc291cmNlVHlwZT1uZXR3b3JrUmVxdWVzdC5yZXNvdXJjZVR5cGUoKTtpZihyZXNvdXJjZVR5cGUhPT1Db21tb24ucmVzb3VyY2VUeXBlcy5TdHlsZXNoZWV0JiZyZXNvdXJjZVR5cGUhPT1Db21tb24ucmVzb3VyY2VUeXBlcy5Eb2N1bWVudCYmcmVzb3VyY2VUeXBlIT09Q29tbW9uLnJlc291cmNlVHlwZXMuVGV4dFRyYWNrKQpyZXR1cm4gdHJ1ZTtpZighbmV0d29ya1JlcXVlc3QubWltZVR5cGUpCnJldHVybiB0cnVlO2lmKG5ldHdvcmtSZXF1ZXN0Lm1pbWVUeXBlIGluIFNESy5OZXR3b3JrTWFuYWdlci5fTUlNRVR5cGVzKQpyZXR1cm4gcmVzb3VyY2VUeXBlLm5hbWUoKWluIFNESy5OZXR3b3JrTWFuYWdlci5fTUlNRVR5cGVzW25ldHdvcmtSZXF1ZXN0Lm1pbWVUeXBlXTtyZXR1cm4gZmFsc2U7fQpyZXNvdXJjZUNoYW5nZWRQcmlvcml0eShyZXF1ZXN0SWQsbmV3UHJpb3JpdHksdGltZXN0YW1wKXtjb25zdCBuZXR3b3JrUmVxdWVzdD10aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlJZFtyZXF1ZXN0SWRdO2lmKG5ldHdvcmtSZXF1ZXN0KQpuZXR3b3JrUmVxdWVzdC5zZXRQcmlvcml0eShuZXdQcmlvcml0eSk7fQpzaWduZWRFeGNoYW5nZVJlY2VpdmVkKHJlcXVlc3RJZCxpbmZvKXtsZXQgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtpZighbmV0d29ya1JlcXVlc3Qpe25ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeVVSTFtpbmZvLm91dGVyUmVzcG9uc2UudXJsXTtpZighbmV0d29ya1JlcXVlc3QpCnJldHVybjt9Cm5ldHdvcmtSZXF1ZXN0LnNldFNpZ25lZEV4Y2hhbmdlSW5mbyhpbmZvKTtuZXR3b3JrUmVxdWVzdC5zZXRSZXNvdXJjZVR5cGUoQ29tbW9uLnJlc291cmNlVHlwZXMuU2lnbmVkRXhjaGFuZ2UpO3RoaXMuX3VwZGF0ZU5ldHdvcmtSZXF1ZXN0V2l0aFJlc3BvbnNlKG5ldHdvcmtSZXF1ZXN0LGluZm8ub3V0ZXJSZXNwb25zZSk7dGhpcy5fdXBkYXRlTmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVzcG9uc2VSZWNlaXZlZCxuZXR3b3JrUmVxdWVzdCk7fQpyZXF1ZXN0V2lsbEJlU2VudChyZXF1ZXN0SWQsbG9hZGVySWQsZG9jdW1lbnRVUkwscmVxdWVzdCx0aW1lLHdhbGxUaW1lLGluaXRpYXRvcixyZWRpcmVjdFJlc3BvbnNlLHJlc291cmNlVHlwZSxmcmFtZUlkKXtsZXQgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtpZihuZXR3b3JrUmVxdWVzdCl7aWYoIXJlZGlyZWN0UmVzcG9uc2UpCnJldHVybjtpZighbmV0d29ya1JlcXVlc3Quc2lnbmVkRXhjaGFuZ2VJbmZvKCkpCnRoaXMucmVzcG9uc2VSZWNlaXZlZChyZXF1ZXN0SWQsbG9hZGVySWQsdGltZSxQcm90b2NvbC5QYWdlLlJlc291cmNlVHlwZS5PdGhlcixyZWRpcmVjdFJlc3BvbnNlLGZyYW1lSWQpO25ldHdvcmtSZXF1ZXN0PXRoaXMuX2FwcGVuZFJlZGlyZWN0KHJlcXVlc3RJZCx0aW1lLHJlcXVlc3QudXJsKTt0aGlzLl9tYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RSZWRpcmVjdGVkLG5ldHdvcmtSZXF1ZXN0KTt9ZWxzZXtuZXR3b3JrUmVxdWVzdD10aGlzLl9jcmVhdGVOZXR3b3JrUmVxdWVzdChyZXF1ZXN0SWQsZnJhbWVJZHx8JycsbG9hZGVySWQscmVxdWVzdC51cmwsZG9jdW1lbnRVUkwsaW5pdGlhdG9yKTt9Cm5ldHdvcmtSZXF1ZXN0Lmhhc05ldHdvcmtEYXRhPXRydWU7dGhpcy5fdXBkYXRlTmV0d29ya1JlcXVlc3RXaXRoUmVxdWVzdChuZXR3b3JrUmVxdWVzdCxyZXF1ZXN0KTtuZXR3b3JrUmVxdWVzdC5zZXRJc3N1ZVRpbWUodGltZSx3YWxsVGltZSk7bmV0d29ya1JlcXVlc3Quc2V0UmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZT9Db21tb24ucmVzb3VyY2VUeXBlc1tyZXNvdXJjZVR5cGVdOlByb3RvY29sLlBhZ2UuUmVzb3VyY2VUeXBlLk90aGVyKTt0aGlzLl9zdGFydE5ldHdvcmtSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0KTt9CnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUocmVxdWVzdElkKXtjb25zdCBuZXR3b3JrUmVxdWVzdD10aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlJZFtyZXF1ZXN0SWRdO2lmKCFuZXR3b3JrUmVxdWVzdCkKcmV0dXJuO25ldHdvcmtSZXF1ZXN0LnNldEZyb21NZW1vcnlDYWNoZSgpO30KcmVzcG9uc2VSZWNlaXZlZChyZXF1ZXN0SWQsbG9hZGVySWQsdGltZSxyZXNvdXJjZVR5cGUscmVzcG9uc2UsZnJhbWVJZCl7Y29uc3QgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtjb25zdCBsb3dlcmNhc2VIZWFkZXJzPVNESy5OZXR3b3JrTWFuYWdlci5sb3dlcmNhc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO2lmKCFuZXR3b3JrUmVxdWVzdCl7Y29uc3QgZXZlbnREYXRhPXt9O2V2ZW50RGF0YS51cmw9cmVzcG9uc2UudXJsO2V2ZW50RGF0YS5mcmFtZUlkPWZyYW1lSWR8fCcnO2V2ZW50RGF0YS5sb2FkZXJJZD1sb2FkZXJJZDtldmVudERhdGEucmVzb3VyY2VUeXBlPXJlc291cmNlVHlwZTtldmVudERhdGEubWltZVR5cGU9cmVzcG9uc2UubWltZVR5cGU7Y29uc3QgbGFzdE1vZGlmaWVkSGVhZGVyPWxvd2VyY2FzZUhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXTtldmVudERhdGEubGFzdE1vZGlmaWVkPWxhc3RNb2RpZmllZEhlYWRlcj9uZXcgRGF0ZShsYXN0TW9kaWZpZWRIZWFkZXIpOm51bGw7dGhpcy5fbWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5SZXF1ZXN0VXBkYXRlRHJvcHBlZCxldmVudERhdGEpO3JldHVybjt9Cm5ldHdvcmtSZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lPXRpbWU7bmV0d29ya1JlcXVlc3Quc2V0UmVzb3VyY2VUeXBlKENvbW1vbi5yZXNvdXJjZVR5cGVzW3Jlc291cmNlVHlwZV0pO2lmKCdzZXQtY29va2llJ2luIGxvd2VyY2FzZUhlYWRlcnMmJmxvd2VyY2FzZUhlYWRlcnNbJ3NldC1jb29raWUnXS5sZW5ndGg+NDA5Nil7Y29uc3QgbWVzc2FnZT1Db21tb24uVUlTdHJpbmcoJ1NldC1Db29raWUgaGVhZGVyIGlzIGlnbm9yZWQgaW4gcmVzcG9uc2UgZnJvbSB1cmw6ICVzLiBDb29raWUgbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNDA5NiBjaGFyYWN0ZXJzLicscmVzcG9uc2UudXJsKTt0aGlzLl9tYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLk1lc3NhZ2VHZW5lcmF0ZWQse21lc3NhZ2U6bWVzc2FnZSxyZXF1ZXN0SWQ6cmVxdWVzdElkLHdhcm5pbmc6dHJ1ZX0pO30KaWYoJ3B1YmxpYy1rZXktcGlucydpbiBsb3dlcmNhc2VIZWFkZXJzfHwncHVibGljLWtleS1waW5zLXJlcG9ydC1vbmx5J2luIGxvd2VyY2FzZUhlYWRlcnMpe2lmKCF0aGlzLl9ocGtwRG9tYWlucykKdGhpcy5faHBrcERvbWFpbnM9bmV3IFNldCgpO2NvbnN0IHBhcnNlZD1uZXcgQ29tbW9uLlBhcnNlZFVSTChyZXNwb25zZS51cmwpO2lmKHBhcnNlZC5pc1ZhbGlkJiYhdGhpcy5faHBrcERvbWFpbnMuaGFzKHBhcnNlZC5ob3N0KSl7dGhpcy5faHBrcERvbWFpbnMuYWRkKHBhcnNlZC5ob3N0KTtjb25zdCBtZXNzYWdlPUNvbW1vbi5VSVN0cmluZygnSFRUUC1CYXNlZCBQdWJsaWMgS2V5IFBpbm5pbmcgaXMgZGVwcmVjYXRlZC4gQ2hyb21lIDY5IGFuZCBsYXRlciB3aWxsIGlnbm9yZSBIUEtQIHJlc3BvbnNlIGhlYWRlcnMuIChIb3N0OiAlcyknLHBhcnNlZC5ob3N0KTt0aGlzLl9tYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLk1lc3NhZ2VHZW5lcmF0ZWQse21lc3NhZ2U6bWVzc2FnZSxyZXF1ZXN0SWQ6cmVxdWVzdElkLHdhcm5pbmc6dHJ1ZX0pO319CnRoaXMuX3VwZGF0ZU5ldHdvcmtSZXF1ZXN0V2l0aFJlc3BvbnNlKG5ldHdvcmtSZXF1ZXN0LHJlc3BvbnNlKTt0aGlzLl91cGRhdGVOZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCk7dGhpcy5fbWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5SZXNwb25zZVJlY2VpdmVkLG5ldHdvcmtSZXF1ZXN0KTt9CmRhdGFSZWNlaXZlZChyZXF1ZXN0SWQsdGltZSxkYXRhTGVuZ3RoLGVuY29kZWREYXRhTGVuZ3RoKXtsZXQgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtpZighbmV0d29ya1JlcXVlc3QpCm5ldHdvcmtSZXF1ZXN0PXRoaXMuX21heWJlQWRvcHRNYWluUmVzb3VyY2VSZXF1ZXN0KHJlcXVlc3RJZCk7aWYoIW5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47bmV0d29ya1JlcXVlc3QucmVzb3VyY2VTaXplKz1kYXRhTGVuZ3RoO2lmKGVuY29kZWREYXRhTGVuZ3RoIT09LTEpCm5ldHdvcmtSZXF1ZXN0LmluY3JlYXNlVHJhbnNmZXJTaXplKGVuY29kZWREYXRhTGVuZ3RoKTtuZXR3b3JrUmVxdWVzdC5lbmRUaW1lPXRpbWU7dGhpcy5fdXBkYXRlTmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QpO30KbG9hZGluZ0ZpbmlzaGVkKHJlcXVlc3RJZCxmaW5pc2hUaW1lLGVuY29kZWREYXRhTGVuZ3RoLHNob3VsZFJlcG9ydENvcmJCbG9ja2luZyl7bGV0IG5ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeUlkW3JlcXVlc3RJZF07aWYoIW5ldHdvcmtSZXF1ZXN0KQpuZXR3b3JrUmVxdWVzdD10aGlzLl9tYXliZUFkb3B0TWFpblJlc291cmNlUmVxdWVzdChyZXF1ZXN0SWQpO2lmKCFuZXR3b3JrUmVxdWVzdCkKcmV0dXJuO3RoaXMuX2ZpbmlzaE5ldHdvcmtSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0LGZpbmlzaFRpbWUsZW5jb2RlZERhdGFMZW5ndGgsc2hvdWxkUmVwb3J0Q29yYkJsb2NraW5nKTt9CmxvYWRpbmdGYWlsZWQocmVxdWVzdElkLHRpbWUscmVzb3VyY2VUeXBlLGxvY2FsaXplZERlc2NyaXB0aW9uLGNhbmNlbGVkLGJsb2NrZWRSZWFzb24pe2NvbnN0IG5ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeUlkW3JlcXVlc3RJZF07aWYoIW5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47bmV0d29ya1JlcXVlc3QuZmFpbGVkPXRydWU7bmV0d29ya1JlcXVlc3Quc2V0UmVzb3VyY2VUeXBlKENvbW1vbi5yZXNvdXJjZVR5cGVzW3Jlc291cmNlVHlwZV0pO25ldHdvcmtSZXF1ZXN0LmNhbmNlbGVkPSEhY2FuY2VsZWQ7aWYoYmxvY2tlZFJlYXNvbil7bmV0d29ya1JlcXVlc3Quc2V0QmxvY2tlZFJlYXNvbihibG9ja2VkUmVhc29uKTtpZihibG9ja2VkUmVhc29uPT09UHJvdG9jb2wuTmV0d29yay5CbG9ja2VkUmVhc29uLkluc3BlY3Rvcil7Y29uc3QgbWVzc2FnZT1Db21tb24uVUlTdHJpbmcoJ1JlcXVlc3Qgd2FzIGJsb2NrZWQgYnkgRGV2VG9vbHM6ICIlcyIuJyxuZXR3b3JrUmVxdWVzdC51cmwoKSk7dGhpcy5fbWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5NZXNzYWdlR2VuZXJhdGVkLHttZXNzYWdlOm1lc3NhZ2UscmVxdWVzdElkOnJlcXVlc3RJZCx3YXJuaW5nOnRydWV9KTt9fQpuZXR3b3JrUmVxdWVzdC5sb2NhbGl6ZWRGYWlsRGVzY3JpcHRpb249bG9jYWxpemVkRGVzY3JpcHRpb247dGhpcy5fZmluaXNoTmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QsdGltZSwtMSk7fQp3ZWJTb2NrZXRDcmVhdGVkKHJlcXVlc3RJZCxyZXF1ZXN0VVJMLGluaXRpYXRvcil7Y29uc3QgbmV0d29ya1JlcXVlc3Q9bmV3IFNESy5OZXR3b3JrUmVxdWVzdChyZXF1ZXN0SWQscmVxdWVzdFVSTCwnJywnJywnJyxpbml0aWF0b3J8fG51bGwpO25ldHdvcmtSZXF1ZXN0W1NESy5OZXR3b3JrTWFuYWdlci5fbmV0d29ya01hbmFnZXJGb3JSZXF1ZXN0U3ltYm9sXT10aGlzLl9tYW5hZ2VyO25ldHdvcmtSZXF1ZXN0LnNldFJlc291cmNlVHlwZShDb21tb24ucmVzb3VyY2VUeXBlcy5XZWJTb2NrZXQpO3RoaXMuX3N0YXJ0TmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QpO30Kd2ViU29ja2V0V2lsbFNlbmRIYW5kc2hha2VSZXF1ZXN0KHJlcXVlc3RJZCx0aW1lLHdhbGxUaW1lLHJlcXVlc3Qpe2NvbnN0IG5ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeUlkW3JlcXVlc3RJZF07aWYoIW5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47bmV0d29ya1JlcXVlc3QucmVxdWVzdE1ldGhvZD0nR0VUJztuZXR3b3JrUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVycyh0aGlzLl9oZWFkZXJzTWFwVG9IZWFkZXJzQXJyYXkocmVxdWVzdC5oZWFkZXJzKSk7bmV0d29ya1JlcXVlc3Quc2V0SXNzdWVUaW1lKHRpbWUsd2FsbFRpbWUpO3RoaXMuX3VwZGF0ZU5ldHdvcmtSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0KTt9CndlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWQocmVxdWVzdElkLHRpbWUscmVzcG9uc2Upe2NvbnN0IG5ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeUlkW3JlcXVlc3RJZF07aWYoIW5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47bmV0d29ya1JlcXVlc3Quc3RhdHVzQ29kZT1yZXNwb25zZS5zdGF0dXM7bmV0d29ya1JlcXVlc3Quc3RhdHVzVGV4dD1yZXNwb25zZS5zdGF0dXNUZXh0O25ldHdvcmtSZXF1ZXN0LnJlc3BvbnNlSGVhZGVycz10aGlzLl9oZWFkZXJzTWFwVG9IZWFkZXJzQXJyYXkocmVzcG9uc2UuaGVhZGVycyk7bmV0d29ya1JlcXVlc3QucmVzcG9uc2VIZWFkZXJzVGV4dD1yZXNwb25zZS5oZWFkZXJzVGV4dHx8Jyc7aWYocmVzcG9uc2UucmVxdWVzdEhlYWRlcnMpCm5ldHdvcmtSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXJzKHRoaXMuX2hlYWRlcnNNYXBUb0hlYWRlcnNBcnJheShyZXNwb25zZS5yZXF1ZXN0SGVhZGVycykpO2lmKHJlc3BvbnNlLnJlcXVlc3RIZWFkZXJzVGV4dCkKbmV0d29ya1JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnNUZXh0KHJlc3BvbnNlLnJlcXVlc3RIZWFkZXJzVGV4dCk7bmV0d29ya1JlcXVlc3QucmVzcG9uc2VSZWNlaXZlZFRpbWU9dGltZTtuZXR3b3JrUmVxdWVzdC5wcm90b2NvbD0nd2Vic29ja2V0Jzt0aGlzLl91cGRhdGVOZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCk7fQp3ZWJTb2NrZXRGcmFtZVJlY2VpdmVkKHJlcXVlc3RJZCx0aW1lLHJlc3BvbnNlKXtjb25zdCBuZXR3b3JrUmVxdWVzdD10aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlJZFtyZXF1ZXN0SWRdO2lmKCFuZXR3b3JrUmVxdWVzdCkKcmV0dXJuO25ldHdvcmtSZXF1ZXN0LmFkZEZyYW1lKHJlc3BvbnNlLHRpbWUsZmFsc2UpO25ldHdvcmtSZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lPXRpbWU7dGhpcy5fdXBkYXRlTmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QpO30Kd2ViU29ja2V0RnJhbWVTZW50KHJlcXVlc3RJZCx0aW1lLHJlc3BvbnNlKXtjb25zdCBuZXR3b3JrUmVxdWVzdD10aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlJZFtyZXF1ZXN0SWRdO2lmKCFuZXR3b3JrUmVxdWVzdCkKcmV0dXJuO25ldHdvcmtSZXF1ZXN0LmFkZEZyYW1lKHJlc3BvbnNlLHRpbWUsdHJ1ZSk7bmV0d29ya1JlcXVlc3QucmVzcG9uc2VSZWNlaXZlZFRpbWU9dGltZTt0aGlzLl91cGRhdGVOZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCk7fQp3ZWJTb2NrZXRGcmFtZUVycm9yKHJlcXVlc3RJZCx0aW1lLGVycm9yTWVzc2FnZSl7Y29uc3QgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtpZighbmV0d29ya1JlcXVlc3QpCnJldHVybjtuZXR3b3JrUmVxdWVzdC5hZGRGcmFtZUVycm9yKGVycm9yTWVzc2FnZSx0aW1lKTtuZXR3b3JrUmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZT10aW1lO3RoaXMuX3VwZGF0ZU5ldHdvcmtSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0KTt9CndlYlNvY2tldENsb3NlZChyZXF1ZXN0SWQsdGltZSl7Y29uc3QgbmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtpZighbmV0d29ya1JlcXVlc3QpCnJldHVybjt0aGlzLl9maW5pc2hOZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCx0aW1lLC0xKTt9CmV2ZW50U291cmNlTWVzc2FnZVJlY2VpdmVkKHJlcXVlc3RJZCx0aW1lLGV2ZW50TmFtZSxldmVudElkLGRhdGEpe2NvbnN0IG5ldHdvcmtSZXF1ZXN0PXRoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeUlkW3JlcXVlc3RJZF07aWYoIW5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47bmV0d29ya1JlcXVlc3QuYWRkRXZlbnRTb3VyY2VNZXNzYWdlKHRpbWUsZXZlbnROYW1lLGV2ZW50SWQsZGF0YSk7fQpyZXF1ZXN0SW50ZXJjZXB0ZWQoaW50ZXJjZXB0aW9uSWQscmVxdWVzdCxmcmFtZUlkLHJlc291cmNlVHlwZSxpc05hdmlnYXRpb25SZXF1ZXN0LGlzRG93bmxvYWQscmVkaXJlY3RVcmwsYXV0aENoYWxsZW5nZSxyZXNwb25zZUVycm9yUmVhc29uLHJlc3BvbnNlU3RhdHVzQ29kZSxyZXNwb25zZUhlYWRlcnMpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLl9yZXF1ZXN0SW50ZXJjZXB0ZWQobmV3IFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkludGVyY2VwdGVkUmVxdWVzdCh0aGlzLl9tYW5hZ2VyLnRhcmdldCgpLm5ldHdvcmtBZ2VudCgpLGludGVyY2VwdGlvbklkLHJlcXVlc3QsZnJhbWVJZCxyZXNvdXJjZVR5cGUsaXNOYXZpZ2F0aW9uUmVxdWVzdCxpc0Rvd25sb2FkLHJlZGlyZWN0VXJsLGF1dGhDaGFsbGVuZ2UscmVzcG9uc2VFcnJvclJlYXNvbixyZXNwb25zZVN0YXR1c0NvZGUscmVzcG9uc2VIZWFkZXJzKSk7fQpfYXBwZW5kUmVkaXJlY3QocmVxdWVzdElkLHRpbWUscmVkaXJlY3RVUkwpe2NvbnN0IG9yaWdpbmFsTmV0d29ya1JlcXVlc3Q9dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXTtsZXQgcmVkaXJlY3RDb3VudD0wO2ZvcihsZXQgcmVkaXJlY3Q9b3JpZ2luYWxOZXR3b3JrUmVxdWVzdC5yZWRpcmVjdFNvdXJjZSgpO3JlZGlyZWN0O3JlZGlyZWN0PXJlZGlyZWN0LnJlZGlyZWN0U291cmNlKCkpCnJlZGlyZWN0Q291bnQrKztvcmlnaW5hbE5ldHdvcmtSZXF1ZXN0Lm1hcmtBc1JlZGlyZWN0KHJlZGlyZWN0Q291bnQpO3RoaXMuX2ZpbmlzaE5ldHdvcmtSZXF1ZXN0KG9yaWdpbmFsTmV0d29ya1JlcXVlc3QsdGltZSwtMSk7Y29uc3QgbmV3TmV0d29ya1JlcXVlc3Q9dGhpcy5fY3JlYXRlTmV0d29ya1JlcXVlc3QocmVxdWVzdElkLG9yaWdpbmFsTmV0d29ya1JlcXVlc3QuZnJhbWVJZCxvcmlnaW5hbE5ldHdvcmtSZXF1ZXN0LmxvYWRlcklkLHJlZGlyZWN0VVJMLG9yaWdpbmFsTmV0d29ya1JlcXVlc3QuZG9jdW1lbnRVUkwsb3JpZ2luYWxOZXR3b3JrUmVxdWVzdC5pbml0aWF0b3IoKSk7bmV3TmV0d29ya1JlcXVlc3Quc2V0UmVkaXJlY3RTb3VyY2Uob3JpZ2luYWxOZXR3b3JrUmVxdWVzdCk7b3JpZ2luYWxOZXR3b3JrUmVxdWVzdC5zZXRSZWRpcmVjdERlc3RpbmF0aW9uKG5ld05ldHdvcmtSZXF1ZXN0KTtyZXR1cm4gbmV3TmV0d29ya1JlcXVlc3Q7fQpfbWF5YmVBZG9wdE1haW5SZXNvdXJjZVJlcXVlc3QocmVxdWVzdElkKXtjb25zdCByZXF1ZXN0PVNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLl9pbmZsaWdodE1haW5SZXNvdXJjZVJlcXVlc3RzLmdldChyZXF1ZXN0SWQpO2lmKCFyZXF1ZXN0KQpyZXR1cm4gbnVsbDtjb25zdCBvbGREaXNwYXRjaGVyPVNESy5OZXR3b3JrTWFuYWdlci5mb3JSZXF1ZXN0KHJlcXVlc3QpLl9kaXNwYXRjaGVyO2RlbGV0ZSBvbGREaXNwYXRjaGVyLl9pbmZsaWdodFJlcXVlc3RzQnlJZFtyZXF1ZXN0SWRdO2RlbGV0ZSBvbGREaXNwYXRjaGVyLl9pbmZsaWdodFJlcXVlc3RzQnlVUkxbcmVxdWVzdC51cmwoKV07dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbcmVxdWVzdElkXT1yZXF1ZXN0O3RoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeVVSTFtyZXF1ZXN0LnVybCgpXT1yZXF1ZXN0O3JlcXVlc3RbU0RLLk5ldHdvcmtNYW5hZ2VyLl9uZXR3b3JrTWFuYWdlckZvclJlcXVlc3RTeW1ib2xdPXRoaXMuX21hbmFnZXI7cmV0dXJuIHJlcXVlc3Q7fQpfc3RhcnROZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCl7dGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbbmV0d29ya1JlcXVlc3QucmVxdWVzdElkKCldPW5ldHdvcmtSZXF1ZXN0O3RoaXMuX2luZmxpZ2h0UmVxdWVzdHNCeVVSTFtuZXR3b3JrUmVxdWVzdC51cmwoKV09bmV0d29ya1JlcXVlc3Q7aWYobmV0d29ya1JlcXVlc3QubG9hZGVySWQ9PT1uZXR3b3JrUmVxdWVzdC5yZXF1ZXN0SWQoKSl7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuX2luZmxpZ2h0TWFpblJlc291cmNlUmVxdWVzdHMuc2V0KG5ldHdvcmtSZXF1ZXN0LnJlcXVlc3RJZCgpLG5ldHdvcmtSZXF1ZXN0KTtkZWxldGUgdGhpcy5faHBrcERvbWFpbnM7fQp0aGlzLl9tYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RTdGFydGVkLG5ldHdvcmtSZXF1ZXN0KTt9Cl91cGRhdGVOZXR3b3JrUmVxdWVzdChuZXR3b3JrUmVxdWVzdCl7dGhpcy5fbWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5SZXF1ZXN0VXBkYXRlZCxuZXR3b3JrUmVxdWVzdCk7fQpfZmluaXNoTmV0d29ya1JlcXVlc3QobmV0d29ya1JlcXVlc3QsZmluaXNoVGltZSxlbmNvZGVkRGF0YUxlbmd0aCxzaG91bGRSZXBvcnRDb3JiQmxvY2tpbmcpe25ldHdvcmtSZXF1ZXN0LmVuZFRpbWU9ZmluaXNoVGltZTtuZXR3b3JrUmVxdWVzdC5maW5pc2hlZD10cnVlO2lmKGVuY29kZWREYXRhTGVuZ3RoPj0wKQpuZXR3b3JrUmVxdWVzdC5zZXRUcmFuc2ZlclNpemUoZW5jb2RlZERhdGFMZW5ndGgpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdEZpbmlzaGVkLG5ldHdvcmtSZXF1ZXN0KTtkZWxldGUgdGhpcy5faW5mbGlnaHRSZXF1ZXN0c0J5SWRbbmV0d29ya1JlcXVlc3QucmVxdWVzdElkKCldO2RlbGV0ZSB0aGlzLl9pbmZsaWdodFJlcXVlc3RzQnlVUkxbbmV0d29ya1JlcXVlc3QudXJsKCldO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLl9pbmZsaWdodE1haW5SZXNvdXJjZVJlcXVlc3RzLmRlbGV0ZShuZXR3b3JrUmVxdWVzdC5yZXF1ZXN0SWQoKSk7aWYoc2hvdWxkUmVwb3J0Q29yYkJsb2NraW5nKXtjb25zdCBtZXNzYWdlPUNvbW1vbi5VSVN0cmluZyhgQ3Jvc3MtT3JpZ2luIFJlYWQgQmxvY2tpbmcgKENPUkIpIGJsb2NrZWQgY3Jvc3Mtb3JpZ2luIHJlc3BvbnNlICVzIHdpdGggTUlNRSB0eXBlICVzLiBgK2BTZWUgaHR0cHM6Ly93d3cuY2hyb21lc3RhdHVzLmNvbS9mZWF0dXJlLzU2Mjk3MDk4MjQwMzI3NjggZm9yIG1vcmUgZGV0YWlscy5gLG5ldHdvcmtSZXF1ZXN0LnVybCgpLG5ldHdvcmtSZXF1ZXN0Lm1pbWVUeXBlKTt0aGlzLl9tYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLk1lc3NhZ2VHZW5lcmF0ZWQse21lc3NhZ2U6bWVzc2FnZSxyZXF1ZXN0SWQ6bmV0d29ya1JlcXVlc3QucmVxdWVzdElkKCksd2FybmluZzp0cnVlfSk7fQppZihDb21tb24ubW9kdWxlU2V0dGluZygnbW9uaXRvcmluZ1hIUkVuYWJsZWQnKS5nZXQoKSYmbmV0d29ya1JlcXVlc3QucmVzb3VyY2VUeXBlKCkuY2F0ZWdvcnkoKT09PUNvbW1vbi5yZXNvdXJjZUNhdGVnb3JpZXMuWEhSKXtjb25zdCBtZXNzYWdlPUNvbW1vbi5VSVN0cmluZygobmV0d29ya1JlcXVlc3QuZmFpbGVkfHxuZXR3b3JrUmVxdWVzdC5oYXNFcnJvclN0YXR1c0NvZGUoKSk/JyVzIGZhaWxlZCBsb2FkaW5nOiAlcyAiJXMiLic6JyVzIGZpbmlzaGVkIGxvYWRpbmc6ICVzICIlcyIuJyxuZXR3b3JrUmVxdWVzdC5yZXNvdXJjZVR5cGUoKS50aXRsZSgpLG5ldHdvcmtSZXF1ZXN0LnJlcXVlc3RNZXRob2QsbmV0d29ya1JlcXVlc3QudXJsKCkpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuTWVzc2FnZUdlbmVyYXRlZCx7bWVzc2FnZTptZXNzYWdlLHJlcXVlc3RJZDpuZXR3b3JrUmVxdWVzdC5yZXF1ZXN0SWQoKSx3YXJuaW5nOmZhbHNlfSk7fX0KX2NyZWF0ZU5ldHdvcmtSZXF1ZXN0KHJlcXVlc3RJZCxmcmFtZUlkLGxvYWRlcklkLHVybCxkb2N1bWVudFVSTCxpbml0aWF0b3Ipe2NvbnN0IHJlcXVlc3Q9bmV3IFNESy5OZXR3b3JrUmVxdWVzdChyZXF1ZXN0SWQsdXJsLGRvY3VtZW50VVJMLGZyYW1lSWQsbG9hZGVySWQsaW5pdGlhdG9yKTtyZXF1ZXN0W1NESy5OZXR3b3JrTWFuYWdlci5fbmV0d29ya01hbmFnZXJGb3JSZXF1ZXN0U3ltYm9sXT10aGlzLl9tYW5hZ2VyO3JldHVybiByZXF1ZXN0O319O1NESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fdXNlckFnZW50T3ZlcnJpZGU9Jyc7dGhpcy5fYWdlbnRzPW5ldyBTZXQoKTt0aGlzLl9pbmZsaWdodE1haW5SZXNvdXJjZVJlcXVlc3RzPW5ldyBNYXAoKTt0aGlzLl9uZXR3b3JrQ29uZGl0aW9ucz1TREsuTmV0d29ya01hbmFnZXIuTm9UaHJvdHRsaW5nQ29uZGl0aW9uczt0aGlzLl91cGRhdGluZ0ludGVyY2VwdGlvblBhdHRlcm5zUHJvbWlzZT1udWxsO3RoaXMuX2Jsb2NraW5nRW5hYmxlZFNldHRpbmc9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3JlcXVlc3RCbG9ja2luZ0VuYWJsZWQnKTt0aGlzLl9ibG9ja2VkUGF0dGVybnNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrQmxvY2tlZFBhdHRlcm5zJyxbXSk7dGhpcy5fZWZmZWN0aXZlQmxvY2tlZFVSTHM9W107dGhpcy5fdXBkYXRlQmxvY2tlZFBhdHRlcm5zKCk7dGhpcy5fdXJsc0ZvclJlcXVlc3RJbnRlcmNlcHRvcj1uZXcgTXVsdGltYXAoKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlVGFyZ2V0cyh0aGlzLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5OZXR3b3JrKTt9CnN0YXRpYyBwYXRjaFVzZXJBZ2VudFdpdGhDaHJvbWVWZXJzaW9uKHVhU3RyaW5nKXtjb25zdCBjaHJvbWVSZWdleD1uZXcgUmVnRXhwKCcoPzpefFxcVylDaHJvbWUvKFxcUyspJyk7Y29uc3QgY2hyb21lTWF0Y2g9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChjaHJvbWVSZWdleCk7aWYoY2hyb21lTWF0Y2gmJmNocm9tZU1hdGNoLmxlbmd0aD4xKQpyZXR1cm4gU3RyaW5nLnNwcmludGYodWFTdHJpbmcsY2hyb21lTWF0Y2hbMV0pO3JldHVybiB1YVN0cmluZzt9CnRhcmdldEFkZGVkKHRhcmdldCl7Y29uc3QgbmV0d29ya0FnZW50PXRhcmdldC5uZXR3b3JrQWdlbnQoKTtpZih0aGlzLl9leHRyYUhlYWRlcnMpCm5ldHdvcmtBZ2VudC5zZXRFeHRyYUhUVFBIZWFkZXJzKHRoaXMuX2V4dHJhSGVhZGVycyk7aWYodGhpcy5fY3VycmVudFVzZXJBZ2VudCgpKQpuZXR3b3JrQWdlbnQuc2V0VXNlckFnZW50T3ZlcnJpZGUodGhpcy5fY3VycmVudFVzZXJBZ2VudCgpKTtpZih0aGlzLl9lZmZlY3RpdmVCbG9ja2VkVVJMcy5sZW5ndGgpCm5ldHdvcmtBZ2VudC5zZXRCbG9ja2VkVVJMcyh0aGlzLl9lZmZlY3RpdmVCbG9ja2VkVVJMcyk7aWYodGhpcy5pc0ludGVyY2VwdGluZygpKQpuZXR3b3JrQWdlbnQuc2V0UmVxdWVzdEludGVyY2VwdGlvbih0aGlzLl91cmxzRm9yUmVxdWVzdEludGVyY2VwdG9yLnZhbHVlc0FycmF5KCkpO3RoaXMuX2FnZW50cy5hZGQobmV0d29ya0FnZW50KTtpZih0aGlzLmlzVGhyb3R0bGluZygpKQp0aGlzLl91cGRhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQWdlbnQpO30KdGFyZ2V0UmVtb3ZlZCh0YXJnZXQpe2Zvcihjb25zdCBlbnRyeSBvZiB0aGlzLl9pbmZsaWdodE1haW5SZXNvdXJjZVJlcXVlc3RzKXtjb25zdCBtYW5hZ2VyPVNESy5OZXR3b3JrTWFuYWdlci5mb3JSZXF1ZXN0KChlbnRyeVsxXSkpO2lmKG1hbmFnZXIudGFyZ2V0KCkhPT10YXJnZXQpCmNvbnRpbnVlO3RoaXMuX2luZmxpZ2h0TWFpblJlc291cmNlUmVxdWVzdHMuZGVsZXRlKChlbnRyeVswXSkpO30KdGhpcy5fYWdlbnRzLmRlbGV0ZSh0YXJnZXQubmV0d29ya0FnZW50KCkpO30KaXNUaHJvdHRsaW5nKCl7cmV0dXJuIHRoaXMuX25ldHdvcmtDb25kaXRpb25zLmRvd25sb2FkPj0wfHx0aGlzLl9uZXR3b3JrQ29uZGl0aW9ucy51cGxvYWQ+PTB8fHRoaXMuX25ldHdvcmtDb25kaXRpb25zLmxhdGVuY3k+MDt9CmlzT2ZmbGluZSgpe3JldHVybiF0aGlzLl9uZXR3b3JrQ29uZGl0aW9ucy5kb3dubG9hZCYmIXRoaXMuX25ldHdvcmtDb25kaXRpb25zLnVwbG9hZDt9CnNldE5ldHdvcmtDb25kaXRpb25zKGNvbmRpdGlvbnMpe3RoaXMuX25ldHdvcmtDb25kaXRpb25zPWNvbmRpdGlvbnM7Zm9yKGNvbnN0IGFnZW50IG9mIHRoaXMuX2FnZW50cykKdGhpcy5fdXBkYXRlTmV0d29ya0NvbmRpdGlvbnMoYWdlbnQpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5Db25kaXRpb25zQ2hhbmdlZCk7fQpuZXR3b3JrQ29uZGl0aW9ucygpe3JldHVybiB0aGlzLl9uZXR3b3JrQ29uZGl0aW9uczt9Cl91cGRhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQWdlbnQpe2NvbnN0IGNvbmRpdGlvbnM9dGhpcy5fbmV0d29ya0NvbmRpdGlvbnM7aWYoIXRoaXMuaXNUaHJvdHRsaW5nKCkpe25ldHdvcmtBZ2VudC5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMoZmFsc2UsMCwwLDApO31lbHNle25ldHdvcmtBZ2VudC5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnModGhpcy5pc09mZmxpbmUoKSxjb25kaXRpb25zLmxhdGVuY3ksY29uZGl0aW9ucy5kb3dubG9hZDwwPzA6Y29uZGl0aW9ucy5kb3dubG9hZCxjb25kaXRpb25zLnVwbG9hZDwwPzA6Y29uZGl0aW9ucy51cGxvYWQsU0RLLk5ldHdvcmtNYW5hZ2VyLl9jb25uZWN0aW9uVHlwZShjb25kaXRpb25zKSk7fX0Kc2V0RXh0cmFIVFRQSGVhZGVycyhoZWFkZXJzKXt0aGlzLl9leHRyYUhlYWRlcnM9aGVhZGVycztmb3IoY29uc3QgYWdlbnQgb2YgdGhpcy5fYWdlbnRzKQphZ2VudC5zZXRFeHRyYUhUVFBIZWFkZXJzKHRoaXMuX2V4dHJhSGVhZGVycyk7fQpfY3VycmVudFVzZXJBZ2VudCgpe3JldHVybiB0aGlzLl9jdXN0b21Vc2VyQWdlbnQ/dGhpcy5fY3VzdG9tVXNlckFnZW50OnRoaXMuX3VzZXJBZ2VudE92ZXJyaWRlO30KX3VwZGF0ZVVzZXJBZ2VudE92ZXJyaWRlKCl7Y29uc3QgdXNlckFnZW50PXRoaXMuX2N1cnJlbnRVc2VyQWdlbnQoKTtmb3IoY29uc3QgYWdlbnQgb2YgdGhpcy5fYWdlbnRzKQphZ2VudC5zZXRVc2VyQWdlbnRPdmVycmlkZSh1c2VyQWdlbnQpO30Kc2V0VXNlckFnZW50T3ZlcnJpZGUodXNlckFnZW50KXtpZih0aGlzLl91c2VyQWdlbnRPdmVycmlkZT09PXVzZXJBZ2VudCkKcmV0dXJuO3RoaXMuX3VzZXJBZ2VudE92ZXJyaWRlPXVzZXJBZ2VudDtpZighdGhpcy5fY3VzdG9tVXNlckFnZW50KQp0aGlzLl91cGRhdGVVc2VyQWdlbnRPdmVycmlkZSgpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5Vc2VyQWdlbnRDaGFuZ2VkKTt9CnVzZXJBZ2VudE92ZXJyaWRlKCl7cmV0dXJuIHRoaXMuX3VzZXJBZ2VudE92ZXJyaWRlO30Kc2V0Q3VzdG9tVXNlckFnZW50T3ZlcnJpZGUodXNlckFnZW50KXt0aGlzLl9jdXN0b21Vc2VyQWdlbnQ9dXNlckFnZW50O3RoaXMuX3VwZGF0ZVVzZXJBZ2VudE92ZXJyaWRlKCk7fQpibG9ja2VkUGF0dGVybnMoKXtyZXR1cm4gdGhpcy5fYmxvY2tlZFBhdHRlcm5zU2V0dGluZy5nZXQoKS5zbGljZSgpO30KYmxvY2tpbmdFbmFibGVkKCl7cmV0dXJuIHRoaXMuX2Jsb2NraW5nRW5hYmxlZFNldHRpbmcuZ2V0KCk7fQppc0Jsb2NraW5nKCl7cmV0dXJuISF0aGlzLl9lZmZlY3RpdmVCbG9ja2VkVVJMcy5sZW5ndGg7fQpzZXRCbG9ja2VkUGF0dGVybnMocGF0dGVybnMpe3RoaXMuX2Jsb2NrZWRQYXR0ZXJuc1NldHRpbmcuc2V0KHBhdHRlcm5zKTt0aGlzLl91cGRhdGVCbG9ja2VkUGF0dGVybnMoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQmxvY2tlZFBhdHRlcm5zQ2hhbmdlZCk7fQpzZXRCbG9ja2luZ0VuYWJsZWQoZW5hYmxlZCl7aWYodGhpcy5fYmxvY2tpbmdFbmFibGVkU2V0dGluZy5nZXQoKT09PWVuYWJsZWQpCnJldHVybjt0aGlzLl9ibG9ja2luZ0VuYWJsZWRTZXR0aW5nLnNldChlbmFibGVkKTt0aGlzLl91cGRhdGVCbG9ja2VkUGF0dGVybnMoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQmxvY2tlZFBhdHRlcm5zQ2hhbmdlZCk7fQpfdXBkYXRlQmxvY2tlZFBhdHRlcm5zKCl7Y29uc3QgdXJscz1bXTtpZih0aGlzLl9ibG9ja2luZ0VuYWJsZWRTZXR0aW5nLmdldCgpKXtmb3IoY29uc3QgcGF0dGVybiBvZiB0aGlzLl9ibG9ja2VkUGF0dGVybnNTZXR0aW5nLmdldCgpKXtpZihwYXR0ZXJuLmVuYWJsZWQpCnVybHMucHVzaChwYXR0ZXJuLnVybCk7fX0KaWYoIXVybHMubGVuZ3RoJiYhdGhpcy5fZWZmZWN0aXZlQmxvY2tlZFVSTHMubGVuZ3RoKQpyZXR1cm47dGhpcy5fZWZmZWN0aXZlQmxvY2tlZFVSTHM9dXJscztmb3IoY29uc3QgYWdlbnQgb2YgdGhpcy5fYWdlbnRzKQphZ2VudC5zZXRCbG9ja2VkVVJMcyh0aGlzLl9lZmZlY3RpdmVCbG9ja2VkVVJMcyk7fQppc0ludGVyY2VwdGluZygpe3JldHVybiEhdGhpcy5fdXJsc0ZvclJlcXVlc3RJbnRlcmNlcHRvci5zaXplO30Kc2V0SW50ZXJjZXB0aW9uSGFuZGxlckZvclBhdHRlcm5zKHBhdHRlcm5zLHJlcXVlc3RJbnRlcmNlcHRvcil7dGhpcy5fdXJsc0ZvclJlcXVlc3RJbnRlcmNlcHRvci5kZWxldGVBbGwocmVxdWVzdEludGVyY2VwdG9yKTtmb3IoY29uc3QgbmV3UGF0dGVybiBvZiBwYXR0ZXJucykKdGhpcy5fdXJsc0ZvclJlcXVlc3RJbnRlcmNlcHRvci5zZXQocmVxdWVzdEludGVyY2VwdG9yLG5ld1BhdHRlcm4pO3JldHVybiB0aGlzLl91cGRhdGVJbnRlcmNlcHRpb25QYXR0ZXJuc09uTmV4dFRpY2soKTt9Cl91cGRhdGVJbnRlcmNlcHRpb25QYXR0ZXJuc09uTmV4dFRpY2soKXtpZighdGhpcy5fdXBkYXRpbmdJbnRlcmNlcHRpb25QYXR0ZXJuc1Byb21pc2UpCnRoaXMuX3VwZGF0aW5nSW50ZXJjZXB0aW9uUGF0dGVybnNQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fdXBkYXRlSW50ZXJjZXB0aW9uUGF0dGVybnMuYmluZCh0aGlzKSk7cmV0dXJuIHRoaXMuX3VwZGF0aW5nSW50ZXJjZXB0aW9uUGF0dGVybnNQcm9taXNlO30KX3VwZGF0ZUludGVyY2VwdGlvblBhdHRlcm5zKCl7aWYoIUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjYWNoZURpc2FibGVkJykuZ2V0KCkpCkNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjYWNoZURpc2FibGVkJykuc2V0KHRydWUpO3RoaXMuX3VwZGF0aW5nSW50ZXJjZXB0aW9uUGF0dGVybnNQcm9taXNlPW51bGw7Y29uc3QgcHJvbWlzZXM9KFtdKTtmb3IoY29uc3QgYWdlbnQgb2YgdGhpcy5fYWdlbnRzKQpwcm9taXNlcy5wdXNoKGFnZW50LnNldFJlcXVlc3RJbnRlcmNlcHRpb24odGhpcy5fdXJsc0ZvclJlcXVlc3RJbnRlcmNlcHRvci52YWx1ZXNBcnJheSgpKSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkludGVyY2VwdG9yc0NoYW5nZWQpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7fQphc3luYyBfcmVxdWVzdEludGVyY2VwdGVkKGludGVyY2VwdGVkUmVxdWVzdCl7Zm9yKGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvciBvZiB0aGlzLl91cmxzRm9yUmVxdWVzdEludGVyY2VwdG9yLmtleXNBcnJheSgpKXthd2FpdCByZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0ZWRSZXF1ZXN0KTtpZihpbnRlcmNlcHRlZFJlcXVlc3QuaGFzUmVzcG9uZGVkKCkpCnJldHVybjt9CmlmKCFpbnRlcmNlcHRlZFJlcXVlc3QuaGFzUmVzcG9uZGVkKCkpCmludGVyY2VwdGVkUmVxdWVzdC5jb250aW51ZVJlcXVlc3RXaXRob3V0Q2hhbmdlKCk7fQpjbGVhckJyb3dzZXJDYWNoZSgpe2Zvcihjb25zdCBhZ2VudCBvZiB0aGlzLl9hZ2VudHMpCmFnZW50LmNsZWFyQnJvd3NlckNhY2hlKCk7fQpjbGVhckJyb3dzZXJDb29raWVzKCl7Zm9yKGNvbnN0IGFnZW50IG9mIHRoaXMuX2FnZW50cykKYWdlbnQuY2xlYXJCcm93c2VyQ29va2llcygpO30KZ2V0Q2VydGlmaWNhdGUob3JpZ2luKXtjb25zdCB0YXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO3JldHVybiB0YXJnZXQubmV0d29ya0FnZW50KCkuZ2V0Q2VydGlmaWNhdGUob3JpZ2luKS50aGVuKGNlcnRpZmljYXRlPT5jZXJ0aWZpY2F0ZXx8W10pO30KbG9hZFJlc291cmNlKHVybCxjYWxsYmFjayl7Y29uc3QgaGVhZGVycz17fTtjb25zdCBjdXJyZW50VXNlckFnZW50PXRoaXMuX2N1cnJlbnRVc2VyQWdlbnQoKTtpZihjdXJyZW50VXNlckFnZW50KQpoZWFkZXJzWydVc2VyLUFnZW50J109Y3VycmVudFVzZXJBZ2VudDtpZihDb21tb24ubW9kdWxlU2V0dGluZygnY2FjaGVEaXNhYmxlZCcpLmdldCgpKQpoZWFkZXJzWydDYWNoZS1Db250cm9sJ109J25vLWNhY2hlJztIb3N0LlJlc291cmNlTG9hZGVyLmxvYWQodXJsLGhlYWRlcnMsY2FsbGJhY2spO319O1NESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cz17QmxvY2tlZFBhdHRlcm5zQ2hhbmdlZDpTeW1ib2woJ0Jsb2NrZWRQYXR0ZXJuc0NoYW5nZWQnKSxDb25kaXRpb25zQ2hhbmdlZDpTeW1ib2woJ0NvbmRpdGlvbnNDaGFuZ2VkJyksVXNlckFnZW50Q2hhbmdlZDpTeW1ib2woJ1VzZXJBZ2VudENoYW5nZWQnKSxJbnRlcmNlcHRvcnNDaGFuZ2VkOlN5bWJvbCgnSW50ZXJjZXB0b3JzQ2hhbmdlZCcpfTtTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5JbnRlcmNlcHRlZFJlcXVlc3Q9Y2xhc3N7Y29uc3RydWN0b3IobmV0d29ya0FnZW50LGludGVyY2VwdGlvbklkLHJlcXVlc3QsZnJhbWVJZCxyZXNvdXJjZVR5cGUsaXNOYXZpZ2F0aW9uUmVxdWVzdCxpc0Rvd25sb2FkLHJlZGlyZWN0VXJsLGF1dGhDaGFsbGVuZ2UscmVzcG9uc2VFcnJvclJlYXNvbixyZXNwb25zZVN0YXR1c0NvZGUscmVzcG9uc2VIZWFkZXJzKXt0aGlzLl9uZXR3b3JrQWdlbnQ9bmV0d29ya0FnZW50O3RoaXMuX2ludGVyY2VwdGlvbklkPWludGVyY2VwdGlvbklkO3RoaXMuX2hhc1Jlc3BvbmRlZD1mYWxzZTt0aGlzLnJlcXVlc3Q9cmVxdWVzdDt0aGlzLmZyYW1lSWQ9ZnJhbWVJZDt0aGlzLnJlc291cmNlVHlwZT1yZXNvdXJjZVR5cGU7dGhpcy5pc05hdmlnYXRpb25SZXF1ZXN0PWlzTmF2aWdhdGlvblJlcXVlc3Q7dGhpcy5pc0Rvd25sb2FkPSEhaXNEb3dubG9hZDt0aGlzLnJlZGlyZWN0VXJsPXJlZGlyZWN0VXJsO3RoaXMuYXV0aENoYWxsZW5nZT1hdXRoQ2hhbGxlbmdlO3RoaXMucmVzcG9uc2VFcnJvclJlYXNvbj1yZXNwb25zZUVycm9yUmVhc29uO3RoaXMucmVzcG9uc2VTdGF0dXNDb2RlPXJlc3BvbnNlU3RhdHVzQ29kZTt0aGlzLnJlc3BvbnNlSGVhZGVycz1yZXNwb25zZUhlYWRlcnM7fQpoYXNSZXNwb25kZWQoKXtyZXR1cm4gdGhpcy5faGFzUmVzcG9uZGVkO30KYXN5bmMgY29udGludWVSZXF1ZXN0V2l0aENvbnRlbnQoY29udGVudEJsb2Ipe3RoaXMuX2hhc1Jlc3BvbmRlZD10cnVlO2NvbnN0IGhlYWRlcnM9WydIVFRQLzEuMSAyMDAgT0snLCdEYXRlOiAnKyhuZXcgRGF0ZSgpKS50b1VUQ1N0cmluZygpLCdTZXJ2ZXI6IENocm9tZSBEZXZ0b29scyBSZXF1ZXN0IEludGVyY2VwdG9yJywnQ29ubmVjdGlvbjogY2xvc2VkJywnQ29udGVudC1MZW5ndGg6ICcrY29udGVudEJsb2Iuc2l6ZSwnQ29udGVudC1UeXBlOiAnK2NvbnRlbnRCbG9iLnR5cGV8fCd0ZXh0L3gtdW5rbm93bicsXTtjb25zdCBlbmNvZGVkUmVzcG9uc2U9YXdhaXQgYmxvYlRvQmFzZTY0KG5ldyBCbG9iKFtoZWFkZXJzLmpvaW4oJ1xyXG4nKSwnXHJcblxyXG4nLGNvbnRlbnRCbG9iXSkpO3RoaXMuX25ldHdvcmtBZ2VudC5jb250aW51ZUludGVyY2VwdGVkUmVxdWVzdCh0aGlzLl9pbnRlcmNlcHRpb25JZCx1bmRlZmluZWQsZW5jb2RlZFJlc3BvbnNlKTthc3luYyBmdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYil7Y29uc3QgcmVhZGVyPW5ldyBGaWxlUmVhZGVyKCk7Y29uc3QgZmlsZUNvbnRlbnRzTG9hZGVkUHJvbWlzZT1uZXcgUHJvbWlzZShyZXNvbHZlPT5yZWFkZXIub25sb2FkZW5kPXJlc29sdmUpO3JlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO2F3YWl0IGZpbGVDb250ZW50c0xvYWRlZFByb21pc2U7aWYocmVhZGVyLmVycm9yKXtjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgY29udmVydCBibG9iIHRvIGJhc2U2NC4nLHJlYWRlci5lcnJvcik7cmV0dXJuJyc7fQpjb25zdCByZXN1bHQ9cmVhZGVyLnJlc3VsdDtpZihyZXN1bHQ9PT11bmRlZmluZWQpe2NvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGJsb2IgdG8gYmFzZTY0LicpO3JldHVybicnO30KcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcocmVzdWx0LmluZGV4T2YoJywnKSsxKTt9fQpjb250aW51ZVJlcXVlc3RXaXRob3V0Q2hhbmdlKCl7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2hhc1Jlc3BvbmRlZCk7dGhpcy5faGFzUmVzcG9uZGVkPXRydWU7dGhpcy5fbmV0d29ya0FnZW50LmNvbnRpbnVlSW50ZXJjZXB0ZWRSZXF1ZXN0KHRoaXMuX2ludGVyY2VwdGlvbklkKTt9CmNvbnRpbnVlUmVxdWVzdFdpdGhFcnJvcihlcnJvclJlYXNvbil7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2hhc1Jlc3BvbmRlZCk7dGhpcy5faGFzUmVzcG9uZGVkPXRydWU7dGhpcy5fbmV0d29ya0FnZW50LmNvbnRpbnVlSW50ZXJjZXB0ZWRSZXF1ZXN0KHRoaXMuX2ludGVyY2VwdGlvbklkLGVycm9yUmVhc29uKTt9CmFzeW5jIHJlc3BvbnNlQm9keSgpe2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX25ldHdvcmtBZ2VudC5pbnZva2VfZ2V0UmVzcG9uc2VCb2R5Rm9ySW50ZXJjZXB0aW9uKHtpbnRlcmNlcHRpb25JZDp0aGlzLl9pbnRlcmNlcHRpb25JZH0pO2NvbnN0IGVycm9yPXJlc3BvbnNlW1Byb3RvY29sLkVycm9yXXx8bnVsbDtyZXR1cm57ZXJyb3I6ZXJyb3IsY29udGVudDplcnJvcj9udWxsOnJlc3BvbnNlLmJvZHksZW5jb2RlZDpyZXNwb25zZS5iYXNlNjRFbmNvZGVkfTt9fTtTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5JbnRlcmNlcHRpb25QYXR0ZXJuO1NESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLlJlcXVlc3RJbnRlcmNlcHRvcjtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlcjs7U0RLLk5ldHdvcmtSZXF1ZXN0PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihyZXF1ZXN0SWQsdXJsLGRvY3VtZW50VVJMLGZyYW1lSWQsbG9hZGVySWQsaW5pdGlhdG9yKXtzdXBlcigpO3RoaXMuX3JlcXVlc3RJZD1yZXF1ZXN0SWQ7dGhpcy5fYmFja2VuZFJlcXVlc3RJZD1yZXF1ZXN0SWQ7dGhpcy5zZXRVcmwodXJsKTt0aGlzLl9kb2N1bWVudFVSTD1kb2N1bWVudFVSTDt0aGlzLl9mcmFtZUlkPWZyYW1lSWQ7dGhpcy5fbG9hZGVySWQ9bG9hZGVySWQ7dGhpcy5faW5pdGlhdG9yPWluaXRpYXRvcjt0aGlzLl9yZWRpcmVjdFNvdXJjZT1udWxsO3RoaXMuX3JlZGlyZWN0RGVzdGluYXRpb249bnVsbDt0aGlzLl9pc3N1ZVRpbWU9LTE7dGhpcy5fc3RhcnRUaW1lPS0xO3RoaXMuX2VuZFRpbWU9LTE7dGhpcy5fYmxvY2tlZFJlYXNvbj11bmRlZmluZWQ7dGhpcy5zdGF0dXNDb2RlPTA7dGhpcy5zdGF0dXNUZXh0PScnO3RoaXMucmVxdWVzdE1ldGhvZD0nJzt0aGlzLnJlcXVlc3RUaW1lPTA7dGhpcy5wcm90b2NvbD0nJzt0aGlzLm1peGVkQ29udGVudFR5cGU9UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5Ob25lO3RoaXMuX2luaXRpYWxQcmlvcml0eT1udWxsO3RoaXMuX2N1cnJlbnRQcmlvcml0eT1udWxsO3RoaXMuX3NpZ25lZEV4Y2hhbmdlSW5mbz1udWxsO3RoaXMuX3Jlc291cmNlVHlwZT1Db21tb24ucmVzb3VyY2VUeXBlcy5PdGhlcjt0aGlzLl9jb250ZW50RGF0YT1udWxsO3RoaXMuX2ZyYW1lcz1bXTt0aGlzLl9ldmVudFNvdXJjZU1lc3NhZ2VzPVtdO3RoaXMuX3Jlc3BvbnNlSGVhZGVyVmFsdWVzPXt9O3RoaXMuX3Jlc3BvbnNlSGVhZGVyc1RleHQ9Jyc7dGhpcy5fcmVxdWVzdEhlYWRlcnM9W107dGhpcy5fcmVxdWVzdEhlYWRlclZhbHVlcz17fTt0aGlzLl9yZW1vdGVBZGRyZXNzPScnO3RoaXMuX3JlZmVycmVyUG9saWN5PW51bGw7dGhpcy5fc2VjdXJpdHlTdGF0ZT1Qcm90b2NvbC5TZWN1cml0eS5TZWN1cml0eVN0YXRlLlVua25vd247dGhpcy5fc2VjdXJpdHlEZXRhaWxzPW51bGw7dGhpcy5jb25uZWN0aW9uSWQ9JzAnO3RoaXMuX2Zvcm1QYXJhbWV0ZXJzUHJvbWlzZT1udWxsO3RoaXMuX3JlcXVlc3RGb3JtRGF0YVByb21pc2U9KFByb21pc2UucmVzb2x2ZShudWxsKSk7fQppbmRlbnRpdHlDb21wYXJlKG90aGVyKXtjb25zdCB0aGlzSWQ9dGhpcy5yZXF1ZXN0SWQoKTtjb25zdCB0aGF0SWQ9b3RoZXIucmVxdWVzdElkKCk7aWYodGhpc0lkPnRoYXRJZCkKcmV0dXJuIDE7aWYodGhpc0lkPHRoYXRJZCkKcmV0dXJuLTE7cmV0dXJuIDA7fQpyZXF1ZXN0SWQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdElkO30KYmFja2VuZFJlcXVlc3RJZCgpe3JldHVybiB0aGlzLl9iYWNrZW5kUmVxdWVzdElkO30KdXJsKCl7cmV0dXJuIHRoaXMuX3VybDt9CnNldFVybCh4KXtpZih0aGlzLl91cmw9PT14KQpyZXR1cm47dGhpcy5fdXJsPXg7dGhpcy5fcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKHgpO2RlbGV0ZSB0aGlzLl9xdWVyeVN0cmluZztkZWxldGUgdGhpcy5fcGFyc2VkUXVlcnlQYXJhbWV0ZXJzO2RlbGV0ZSB0aGlzLl9uYW1lO2RlbGV0ZSB0aGlzLl9wYXRoO30KZ2V0IGRvY3VtZW50VVJMKCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50VVJMO30KZ2V0IHBhcnNlZFVSTCgpe3JldHVybiB0aGlzLl9wYXJzZWRVUkw7fQpnZXQgZnJhbWVJZCgpe3JldHVybiB0aGlzLl9mcmFtZUlkO30KZ2V0IGxvYWRlcklkKCl7cmV0dXJuIHRoaXMuX2xvYWRlcklkO30Kc2V0UmVtb3RlQWRkcmVzcyhpcCxwb3J0KXt0aGlzLl9yZW1vdGVBZGRyZXNzPWlwKyc6Jytwb3J0O3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuUmVtb3RlQWRkcmVzc0NoYW5nZWQsdGhpcyk7fQpyZW1vdGVBZGRyZXNzKCl7cmV0dXJuIHRoaXMuX3JlbW90ZUFkZHJlc3M7fQpzZXRSZWZlcnJlclBvbGljeShyZWZlcnJlclBvbGljeSl7dGhpcy5fcmVmZXJyZXJQb2xpY3k9cmVmZXJyZXJQb2xpY3k7fQpyZWZlcnJlclBvbGljeSgpe3JldHVybiB0aGlzLl9yZWZlcnJlclBvbGljeTt9CnNlY3VyaXR5U3RhdGUoKXtyZXR1cm4gdGhpcy5fc2VjdXJpdHlTdGF0ZTt9CnNldFNlY3VyaXR5U3RhdGUoc2VjdXJpdHlTdGF0ZSl7dGhpcy5fc2VjdXJpdHlTdGF0ZT1zZWN1cml0eVN0YXRlO30Kc2VjdXJpdHlEZXRhaWxzKCl7cmV0dXJuIHRoaXMuX3NlY3VyaXR5RGV0YWlsczt9CnNldFNlY3VyaXR5RGV0YWlscyhzZWN1cml0eURldGFpbHMpe3RoaXMuX3NlY3VyaXR5RGV0YWlscz1zZWN1cml0eURldGFpbHM7fQpnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZXx8LTE7fQpzZXRJc3N1ZVRpbWUobW9ub3RvbmljVGltZSx3YWxsVGltZSl7dGhpcy5faXNzdWVUaW1lPW1vbm90b25pY1RpbWU7dGhpcy5fd2FsbElzc3VlVGltZT13YWxsVGltZTt0aGlzLl9zdGFydFRpbWU9bW9ub3RvbmljVGltZTt9Cmlzc3VlVGltZSgpe3JldHVybiB0aGlzLl9pc3N1ZVRpbWU7fQpwc2V1ZG9XYWxsVGltZShtb25vdG9uaWNUaW1lKXtyZXR1cm4gdGhpcy5fd2FsbElzc3VlVGltZT90aGlzLl93YWxsSXNzdWVUaW1lLXRoaXMuX2lzc3VlVGltZSttb25vdG9uaWNUaW1lOm1vbm90b25pY1RpbWU7fQpnZXQgcmVzcG9uc2VSZWNlaXZlZFRpbWUoKXtyZXR1cm4gdGhpcy5fcmVzcG9uc2VSZWNlaXZlZFRpbWV8fC0xO30Kc2V0IHJlc3BvbnNlUmVjZWl2ZWRUaW1lKHgpe3RoaXMuX3Jlc3BvbnNlUmVjZWl2ZWRUaW1lPXg7fQpnZXQgZW5kVGltZSgpe3JldHVybiB0aGlzLl9lbmRUaW1lfHwtMTt9CnNldCBlbmRUaW1lKHgpe2lmKHRoaXMudGltaW5nJiZ0aGlzLnRpbWluZy5yZXF1ZXN0VGltZSl7dGhpcy5fZW5kVGltZT1NYXRoLm1heCh4LHRoaXMucmVzcG9uc2VSZWNlaXZlZFRpbWUpO31lbHNle3RoaXMuX2VuZFRpbWU9eDtpZih0aGlzLl9yZXNwb25zZVJlY2VpdmVkVGltZT54KQp0aGlzLl9yZXNwb25zZVJlY2VpdmVkVGltZT14O30KdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5UaW1pbmdDaGFuZ2VkLHRoaXMpO30KZ2V0IGR1cmF0aW9uKCl7aWYodGhpcy5fZW5kVGltZT09PS0xfHx0aGlzLl9zdGFydFRpbWU9PT0tMSkKcmV0dXJuLTE7cmV0dXJuIHRoaXMuX2VuZFRpbWUtdGhpcy5fc3RhcnRUaW1lO30KZ2V0IGxhdGVuY3koKXtpZih0aGlzLl9yZXNwb25zZVJlY2VpdmVkVGltZT09PS0xfHx0aGlzLl9zdGFydFRpbWU9PT0tMSkKcmV0dXJuLTE7cmV0dXJuIHRoaXMuX3Jlc3BvbnNlUmVjZWl2ZWRUaW1lLXRoaXMuX3N0YXJ0VGltZTt9CmdldCByZXNvdXJjZVNpemUoKXtyZXR1cm4gdGhpcy5fcmVzb3VyY2VTaXplfHwwO30Kc2V0IHJlc291cmNlU2l6ZSh4KXt0aGlzLl9yZXNvdXJjZVNpemU9eDt9CmdldCB0cmFuc2ZlclNpemUoKXtyZXR1cm4gdGhpcy5fdHJhbnNmZXJTaXplfHwwO30KaW5jcmVhc2VUcmFuc2ZlclNpemUoeCl7dGhpcy5fdHJhbnNmZXJTaXplPSh0aGlzLl90cmFuc2ZlclNpemV8fDApK3g7fQpzZXRUcmFuc2ZlclNpemUoeCl7dGhpcy5fdHJhbnNmZXJTaXplPXg7fQpnZXQgZmluaXNoZWQoKXtyZXR1cm4gdGhpcy5fZmluaXNoZWQ7fQpzZXQgZmluaXNoZWQoeCl7aWYodGhpcy5fZmluaXNoZWQ9PT14KQpyZXR1cm47dGhpcy5fZmluaXNoZWQ9eDtpZih4KQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyx0aGlzKTt9CmdldCBmYWlsZWQoKXtyZXR1cm4gdGhpcy5fZmFpbGVkO30Kc2V0IGZhaWxlZCh4KXt0aGlzLl9mYWlsZWQ9eDt9CmdldCBjYW5jZWxlZCgpe3JldHVybiB0aGlzLl9jYW5jZWxlZDt9CnNldCBjYW5jZWxlZCh4KXt0aGlzLl9jYW5jZWxlZD14O30KYmxvY2tlZFJlYXNvbigpe3JldHVybiB0aGlzLl9ibG9ja2VkUmVhc29uO30Kc2V0QmxvY2tlZFJlYXNvbihyZWFzb24pe3RoaXMuX2Jsb2NrZWRSZWFzb249cmVhc29uO30Kd2FzQmxvY2tlZCgpe3JldHVybiEhdGhpcy5fYmxvY2tlZFJlYXNvbjt9CmNhY2hlZCgpe3JldHVybighIXRoaXMuX2Zyb21NZW1vcnlDYWNoZXx8ISF0aGlzLl9mcm9tRGlza0NhY2hlKSYmIXRoaXMuX3RyYW5zZmVyU2l6ZTt9CmNhY2hlZEluTWVtb3J5KCl7cmV0dXJuISF0aGlzLl9mcm9tTWVtb3J5Q2FjaGUmJiF0aGlzLl90cmFuc2ZlclNpemU7fQpzZXRGcm9tTWVtb3J5Q2FjaGUoKXt0aGlzLl9mcm9tTWVtb3J5Q2FjaGU9dHJ1ZTtkZWxldGUgdGhpcy5fdGltaW5nO30Kc2V0RnJvbURpc2tDYWNoZSgpe3RoaXMuX2Zyb21EaXNrQ2FjaGU9dHJ1ZTt9CmdldCBmZXRjaGVkVmlhU2VydmljZVdvcmtlcigpe3JldHVybiB0aGlzLl9mZXRjaGVkVmlhU2VydmljZVdvcmtlcjt9CnNldCBmZXRjaGVkVmlhU2VydmljZVdvcmtlcih4KXt0aGlzLl9mZXRjaGVkVmlhU2VydmljZVdvcmtlcj14O30KZ2V0IHRpbWluZygpe3JldHVybiB0aGlzLl90aW1pbmc7fQpzZXQgdGltaW5nKHRpbWluZ0luZm8pe2lmKCF0aW1pbmdJbmZvfHx0aGlzLl9mcm9tTWVtb3J5Q2FjaGUpCnJldHVybjt0aGlzLl9zdGFydFRpbWU9dGltaW5nSW5mby5yZXF1ZXN0VGltZTtjb25zdCBoZWFkZXJzUmVjZWl2ZWRUaW1lPXRpbWluZ0luZm8ucmVxdWVzdFRpbWUrdGltaW5nSW5mby5yZWNlaXZlSGVhZGVyc0VuZC8xMDAwLjA7aWYoKHRoaXMuX3Jlc3BvbnNlUmVjZWl2ZWRUaW1lfHwtMSk8MHx8dGhpcy5fcmVzcG9uc2VSZWNlaXZlZFRpbWU+aGVhZGVyc1JlY2VpdmVkVGltZSkKdGhpcy5fcmVzcG9uc2VSZWNlaXZlZFRpbWU9aGVhZGVyc1JlY2VpdmVkVGltZTtpZih0aGlzLl9zdGFydFRpbWU+dGhpcy5fcmVzcG9uc2VSZWNlaXZlZFRpbWUpCnRoaXMuX3Jlc3BvbnNlUmVjZWl2ZWRUaW1lPXRoaXMuX3N0YXJ0VGltZTt0aGlzLl90aW1pbmc9dGltaW5nSW5mbzt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlRpbWluZ0NoYW5nZWQsdGhpcyk7fQpnZXQgbWltZVR5cGUoKXtyZXR1cm4gdGhpcy5fbWltZVR5cGU7fQpzZXQgbWltZVR5cGUoeCl7dGhpcy5fbWltZVR5cGU9eDt9CmdldCBkaXNwbGF5TmFtZSgpe3JldHVybiB0aGlzLl9wYXJzZWRVUkwuZGlzcGxheU5hbWU7fQpuYW1lKCl7aWYodGhpcy5fbmFtZSkKcmV0dXJuIHRoaXMuX25hbWU7dGhpcy5fcGFyc2VOYW1lQW5kUGF0aEZyb21VUkwoKTtyZXR1cm4gdGhpcy5fbmFtZTt9CnBhdGgoKXtpZih0aGlzLl9wYXRoKQpyZXR1cm4gdGhpcy5fcGF0aDt0aGlzLl9wYXJzZU5hbWVBbmRQYXRoRnJvbVVSTCgpO3JldHVybiB0aGlzLl9wYXRoO30KX3BhcnNlTmFtZUFuZFBhdGhGcm9tVVJMKCl7aWYodGhpcy5fcGFyc2VkVVJMLmlzRGF0YVVSTCgpKXt0aGlzLl9uYW1lPXRoaXMuX3BhcnNlZFVSTC5kYXRhVVJMRGlzcGxheU5hbWUoKTt0aGlzLl9wYXRoPScnO31lbHNlIGlmKHRoaXMuX3BhcnNlZFVSTC5pc0Fib3V0QmxhbmsoKSl7dGhpcy5fbmFtZT10aGlzLl9wYXJzZWRVUkwudXJsO3RoaXMuX3BhdGg9Jyc7fWVsc2V7dGhpcy5fcGF0aD10aGlzLl9wYXJzZWRVUkwuaG9zdCt0aGlzLl9wYXJzZWRVUkwuZm9sZGVyUGF0aENvbXBvbmVudHM7Y29uc3QgbmV0d29ya01hbmFnZXI9U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QodGhpcyk7Y29uc3QgaW5zcGVjdGVkVVJMPW5ldHdvcmtNYW5hZ2VyP25ldHdvcmtNYW5hZ2VyLnRhcmdldCgpLmluc3BlY3RlZFVSTCgpLmFzUGFyc2VkVVJMKCk6bnVsbDt0aGlzLl9wYXRoPXRoaXMuX3BhdGgudHJpbVVSTChpbnNwZWN0ZWRVUkw/aW5zcGVjdGVkVVJMLmhvc3Q6JycpO2lmKHRoaXMuX3BhcnNlZFVSTC5sYXN0UGF0aENvbXBvbmVudHx8dGhpcy5fcGFyc2VkVVJMLnF1ZXJ5UGFyYW1zKXt0aGlzLl9uYW1lPXRoaXMuX3BhcnNlZFVSTC5sYXN0UGF0aENvbXBvbmVudCsodGhpcy5fcGFyc2VkVVJMLnF1ZXJ5UGFyYW1zPyc/Jyt0aGlzLl9wYXJzZWRVUkwucXVlcnlQYXJhbXM6JycpO31lbHNlIGlmKHRoaXMuX3BhcnNlZFVSTC5mb2xkZXJQYXRoQ29tcG9uZW50cyl7dGhpcy5fbmFtZT10aGlzLl9wYXJzZWRVUkwuZm9sZGVyUGF0aENvbXBvbmVudHMuc3Vic3RyaW5nKHRoaXMuX3BhcnNlZFVSTC5mb2xkZXJQYXRoQ29tcG9uZW50cy5sYXN0SW5kZXhPZignLycpKzEpKycvJzt0aGlzLl9wYXRoPXRoaXMuX3BhdGguc3Vic3RyaW5nKDAsdGhpcy5fcGF0aC5sYXN0SW5kZXhPZignLycpKTt9ZWxzZXt0aGlzLl9uYW1lPXRoaXMuX3BhcnNlZFVSTC5ob3N0O3RoaXMuX3BhdGg9Jyc7fX19CmdldCBmb2xkZXIoKXtsZXQgcGF0aD10aGlzLl9wYXJzZWRVUkwucGF0aDtjb25zdCBpbmRleE9mUXVlcnk9cGF0aC5pbmRleE9mKCc/Jyk7aWYoaW5kZXhPZlF1ZXJ5IT09LTEpCnBhdGg9cGF0aC5zdWJzdHJpbmcoMCxpbmRleE9mUXVlcnkpO2NvbnN0IGxhc3RTbGFzaEluZGV4PXBhdGgubGFzdEluZGV4T2YoJy8nKTtyZXR1cm4gbGFzdFNsYXNoSW5kZXghPT0tMT9wYXRoLnN1YnN0cmluZygwLGxhc3RTbGFzaEluZGV4KTonJzt9CnJlc291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9yZXNvdXJjZVR5cGU7fQpzZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKXt0aGlzLl9yZXNvdXJjZVR5cGU9cmVzb3VyY2VUeXBlO30KZ2V0IGRvbWFpbigpe3JldHVybiB0aGlzLl9wYXJzZWRVUkwuaG9zdDt9CmdldCBzY2hlbWUoKXtyZXR1cm4gdGhpcy5fcGFyc2VkVVJMLnNjaGVtZTt9CnJlZGlyZWN0U291cmNlKCl7cmV0dXJuIHRoaXMuX3JlZGlyZWN0U291cmNlO30Kc2V0UmVkaXJlY3RTb3VyY2Uob3JpZ2luYXRpbmdSZXF1ZXN0KXt0aGlzLl9yZWRpcmVjdFNvdXJjZT1vcmlnaW5hdGluZ1JlcXVlc3Q7fQpyZWRpcmVjdERlc3RpbmF0aW9uKCl7cmV0dXJuIHRoaXMuX3JlZGlyZWN0RGVzdGluYXRpb247fQpzZXRSZWRpcmVjdERlc3RpbmF0aW9uKHJlZGlyZWN0RGVzdGluYXRpb24pe3RoaXMuX3JlZGlyZWN0RGVzdGluYXRpb249cmVkaXJlY3REZXN0aW5hdGlvbjt9CnJlcXVlc3RIZWFkZXJzKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RIZWFkZXJzO30Kc2V0UmVxdWVzdEhlYWRlcnMoaGVhZGVycyl7dGhpcy5fcmVxdWVzdEhlYWRlcnM9aGVhZGVycztkZWxldGUgdGhpcy5fcmVxdWVzdENvb2tpZXM7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5SZXF1ZXN0SGVhZGVyc0NoYW5nZWQpO30KcmVxdWVzdEhlYWRlcnNUZXh0KCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RIZWFkZXJzVGV4dDt9CnNldFJlcXVlc3RIZWFkZXJzVGV4dCh0ZXh0KXt0aGlzLl9yZXF1ZXN0SGVhZGVyc1RleHQ9dGV4dDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlcXVlc3RIZWFkZXJzQ2hhbmdlZCk7fQpyZXF1ZXN0SGVhZGVyVmFsdWUoaGVhZGVyTmFtZSl7aWYoaGVhZGVyTmFtZSBpbiB0aGlzLl9yZXF1ZXN0SGVhZGVyVmFsdWVzKQpyZXR1cm4gdGhpcy5fcmVxdWVzdEhlYWRlclZhbHVlc1toZWFkZXJOYW1lXTt0aGlzLl9yZXF1ZXN0SGVhZGVyVmFsdWVzW2hlYWRlck5hbWVdPXRoaXMuX2NvbXB1dGVIZWFkZXJWYWx1ZSh0aGlzLnJlcXVlc3RIZWFkZXJzKCksaGVhZGVyTmFtZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RIZWFkZXJWYWx1ZXNbaGVhZGVyTmFtZV07fQpnZXQgcmVxdWVzdENvb2tpZXMoKXtpZighdGhpcy5fcmVxdWVzdENvb2tpZXMpCnRoaXMuX3JlcXVlc3RDb29raWVzPVNESy5Db29raWVQYXJzZXIucGFyc2VDb29raWUodGhpcy5yZXF1ZXN0SGVhZGVyVmFsdWUoJ0Nvb2tpZScpKTtyZXR1cm4gdGhpcy5fcmVxdWVzdENvb2tpZXM7fQpyZXF1ZXN0Rm9ybURhdGEoKXtpZighdGhpcy5fcmVxdWVzdEZvcm1EYXRhUHJvbWlzZSkKdGhpcy5fcmVxdWVzdEZvcm1EYXRhUHJvbWlzZT1TREsuTmV0d29ya01hbmFnZXIucmVxdWVzdFBvc3REYXRhKHRoaXMpO3JldHVybiB0aGlzLl9yZXF1ZXN0Rm9ybURhdGFQcm9taXNlO30Kc2V0UmVxdWVzdEZvcm1EYXRhKGhhc0RhdGEsZGF0YSl7dGhpcy5fcmVxdWVzdEZvcm1EYXRhUHJvbWlzZT0oaGFzRGF0YSYmZGF0YT09PW51bGwpP251bGw6UHJvbWlzZS5yZXNvbHZlKGRhdGEpO3RoaXMuX2Zvcm1QYXJhbWV0ZXJzUHJvbWlzZT1udWxsO30KX2ZpbHRlcmVkUHJvdG9jb2xOYW1lKCl7Y29uc3QgcHJvdG9jb2w9dGhpcy5wcm90b2NvbC50b0xvd2VyQ2FzZSgpO2lmKHByb3RvY29sPT09J2gyJykKcmV0dXJuJ2h0dHAvMi4wJztyZXR1cm4gcHJvdG9jb2wucmVwbGFjZSgvXmh0dHBcLzIoXC4wKT9cKy8sJ2h0dHAvMi4wKycpO30KcmVxdWVzdEh0dHBWZXJzaW9uKCl7Y29uc3QgaGVhZGVyc1RleHQ9dGhpcy5yZXF1ZXN0SGVhZGVyc1RleHQoKTtpZighaGVhZGVyc1RleHQpe2NvbnN0IHZlcnNpb249dGhpcy5yZXF1ZXN0SGVhZGVyVmFsdWUoJ3ZlcnNpb24nKXx8dGhpcy5yZXF1ZXN0SGVhZGVyVmFsdWUoJzp2ZXJzaW9uJyk7aWYodmVyc2lvbikKcmV0dXJuIHZlcnNpb247cmV0dXJuIHRoaXMuX2ZpbHRlcmVkUHJvdG9jb2xOYW1lKCk7fQpjb25zdCBmaXJzdExpbmU9aGVhZGVyc1RleHQuc3BsaXQoL1xyXG4vKVswXTtjb25zdCBtYXRjaD1maXJzdExpbmUubWF0Y2goLyhIVFRQXC9cZCtcLlxkKykkLyk7cmV0dXJuIG1hdGNoP21hdGNoWzFdOidIVFRQLzAuOSc7fQpnZXQgcmVzcG9uc2VIZWFkZXJzKCl7cmV0dXJuIHRoaXMuX3Jlc3BvbnNlSGVhZGVyc3x8W107fQpzZXQgcmVzcG9uc2VIZWFkZXJzKHgpe3RoaXMuX3Jlc3BvbnNlSGVhZGVycz14O2RlbGV0ZSB0aGlzLl9zb3J0ZWRSZXNwb25zZUhlYWRlcnM7ZGVsZXRlIHRoaXMuX3NlcnZlclRpbWluZ3M7ZGVsZXRlIHRoaXMuX3Jlc3BvbnNlQ29va2llczt0aGlzLl9yZXNwb25zZUhlYWRlclZhbHVlcz17fTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlc3BvbnNlSGVhZGVyc0NoYW5nZWQpO30KZ2V0IHJlc3BvbnNlSGVhZGVyc1RleHQoKXtyZXR1cm4gdGhpcy5fcmVzcG9uc2VIZWFkZXJzVGV4dDt9CnNldCByZXNwb25zZUhlYWRlcnNUZXh0KHgpe3RoaXMuX3Jlc3BvbnNlSGVhZGVyc1RleHQ9eDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlc3BvbnNlSGVhZGVyc0NoYW5nZWQpO30KZ2V0IHNvcnRlZFJlc3BvbnNlSGVhZGVycygpe2lmKHRoaXMuX3NvcnRlZFJlc3BvbnNlSGVhZGVycyE9PXVuZGVmaW5lZCkKcmV0dXJuIHRoaXMuX3NvcnRlZFJlc3BvbnNlSGVhZGVyczt0aGlzLl9zb3J0ZWRSZXNwb25zZUhlYWRlcnM9dGhpcy5yZXNwb25zZUhlYWRlcnMuc2xpY2UoKTt0aGlzLl9zb3J0ZWRSZXNwb25zZUhlYWRlcnMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm5hbWUudG9Mb3dlckNhc2UoKS5jb21wYXJlVG8oYi5uYW1lLnRvTG93ZXJDYXNlKCkpO30pO3JldHVybiB0aGlzLl9zb3J0ZWRSZXNwb25zZUhlYWRlcnM7fQpyZXNwb25zZUhlYWRlclZhbHVlKGhlYWRlck5hbWUpe2lmKGhlYWRlck5hbWUgaW4gdGhpcy5fcmVzcG9uc2VIZWFkZXJWYWx1ZXMpCnJldHVybiB0aGlzLl9yZXNwb25zZUhlYWRlclZhbHVlc1toZWFkZXJOYW1lXTt0aGlzLl9yZXNwb25zZUhlYWRlclZhbHVlc1toZWFkZXJOYW1lXT10aGlzLl9jb21wdXRlSGVhZGVyVmFsdWUodGhpcy5yZXNwb25zZUhlYWRlcnMsaGVhZGVyTmFtZSk7cmV0dXJuIHRoaXMuX3Jlc3BvbnNlSGVhZGVyVmFsdWVzW2hlYWRlck5hbWVdO30KZ2V0IHJlc3BvbnNlQ29va2llcygpe2lmKCF0aGlzLl9yZXNwb25zZUNvb2tpZXMpCnRoaXMuX3Jlc3BvbnNlQ29va2llcz1TREsuQ29va2llUGFyc2VyLnBhcnNlU2V0Q29va2llKHRoaXMucmVzcG9uc2VIZWFkZXJWYWx1ZSgnU2V0LUNvb2tpZScpKTtyZXR1cm4gdGhpcy5fcmVzcG9uc2VDb29raWVzO30KcmVzcG9uc2VMYXN0TW9kaWZpZWQoKXtyZXR1cm4gdGhpcy5yZXNwb25zZUhlYWRlclZhbHVlKCdsYXN0LW1vZGlmaWVkJyk7fQpnZXQgc2VydmVyVGltaW5ncygpe2lmKHR5cGVvZiB0aGlzLl9zZXJ2ZXJUaW1pbmdzPT09J3VuZGVmaW5lZCcpCnRoaXMuX3NlcnZlclRpbWluZ3M9U0RLLlNlcnZlclRpbWluZy5wYXJzZUhlYWRlcnModGhpcy5yZXNwb25zZUhlYWRlcnMpO3JldHVybiB0aGlzLl9zZXJ2ZXJUaW1pbmdzO30KcXVlcnlTdHJpbmcoKXtpZih0aGlzLl9xdWVyeVN0cmluZyE9PXVuZGVmaW5lZCkKcmV0dXJuIHRoaXMuX3F1ZXJ5U3RyaW5nO2xldCBxdWVyeVN0cmluZz1udWxsO2NvbnN0IHVybD10aGlzLnVybCgpO2NvbnN0IHF1ZXN0aW9uTWFya1Bvc2l0aW9uPXVybC5pbmRleE9mKCc/Jyk7aWYocXVlc3Rpb25NYXJrUG9zaXRpb24hPT0tMSl7cXVlcnlTdHJpbmc9dXJsLnN1YnN0cmluZyhxdWVzdGlvbk1hcmtQb3NpdGlvbisxKTtjb25zdCBoYXNoU2lnblBvc2l0aW9uPXF1ZXJ5U3RyaW5nLmluZGV4T2YoJyMnKTtpZihoYXNoU2lnblBvc2l0aW9uIT09LTEpCnF1ZXJ5U3RyaW5nPXF1ZXJ5U3RyaW5nLnN1YnN0cmluZygwLGhhc2hTaWduUG9zaXRpb24pO30KdGhpcy5fcXVlcnlTdHJpbmc9cXVlcnlTdHJpbmc7cmV0dXJuIHRoaXMuX3F1ZXJ5U3RyaW5nO30KZ2V0IHF1ZXJ5UGFyYW1ldGVycygpe2lmKHRoaXMuX3BhcnNlZFF1ZXJ5UGFyYW1ldGVycykKcmV0dXJuIHRoaXMuX3BhcnNlZFF1ZXJ5UGFyYW1ldGVycztjb25zdCBxdWVyeVN0cmluZz10aGlzLnF1ZXJ5U3RyaW5nKCk7aWYoIXF1ZXJ5U3RyaW5nKQpyZXR1cm4gbnVsbDt0aGlzLl9wYXJzZWRRdWVyeVBhcmFtZXRlcnM9dGhpcy5fcGFyc2VQYXJhbWV0ZXJzKHF1ZXJ5U3RyaW5nKTtyZXR1cm4gdGhpcy5fcGFyc2VkUXVlcnlQYXJhbWV0ZXJzO30KYXN5bmMgX3BhcnNlRm9ybVBhcmFtZXRlcnMoKXtjb25zdCByZXF1ZXN0Q29udGVudFR5cGU9dGhpcy5yZXF1ZXN0Q29udGVudFR5cGUoKTtpZighcmVxdWVzdENvbnRlbnRUeXBlKQpyZXR1cm4gbnVsbDtpZihyZXF1ZXN0Q29udGVudFR5cGUubWF0Y2goL15hcHBsaWNhdGlvblwveC13d3ctZm9ybS11cmxlbmNvZGVkXHMqKDsuKik/JC9pKSl7Y29uc3QgZm9ybURhdGE9YXdhaXQgdGhpcy5yZXF1ZXN0Rm9ybURhdGEoKTtpZighZm9ybURhdGEpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9wYXJzZVBhcmFtZXRlcnMoZm9ybURhdGEpO30KY29uc3QgbXVsdGlwYXJ0RGV0YWlscz1yZXF1ZXN0Q29udGVudFR5cGUubWF0Y2goL15tdWx0aXBhcnRcL2Zvcm0tZGF0YVxzKjtccypib3VuZGFyeVxzKj1ccyooXFMrKVxzKiQvKTtpZighbXVsdGlwYXJ0RGV0YWlscykKcmV0dXJuIG51bGw7Y29uc3QgYm91bmRhcnk9bXVsdGlwYXJ0RGV0YWlsc1sxXTtpZighYm91bmRhcnkpCnJldHVybiBudWxsO2NvbnN0IGZvcm1EYXRhPWF3YWl0IHRoaXMucmVxdWVzdEZvcm1EYXRhKCk7aWYoIWZvcm1EYXRhKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXBhcnRGb3JtRGF0YVBhcmFtZXRlcnMoZm9ybURhdGEsYm91bmRhcnkpO30KZm9ybVBhcmFtZXRlcnMoKXtpZighdGhpcy5fZm9ybVBhcmFtZXRlcnNQcm9taXNlKQp0aGlzLl9mb3JtUGFyYW1ldGVyc1Byb21pc2U9dGhpcy5fcGFyc2VGb3JtUGFyYW1ldGVycygpO3JldHVybiB0aGlzLl9mb3JtUGFyYW1ldGVyc1Byb21pc2U7fQpyZXNwb25zZUh0dHBWZXJzaW9uKCl7Y29uc3QgaGVhZGVyc1RleHQ9dGhpcy5fcmVzcG9uc2VIZWFkZXJzVGV4dDtpZighaGVhZGVyc1RleHQpe2NvbnN0IHZlcnNpb249dGhpcy5yZXNwb25zZUhlYWRlclZhbHVlKCd2ZXJzaW9uJyl8fHRoaXMucmVzcG9uc2VIZWFkZXJWYWx1ZSgnOnZlcnNpb24nKTtpZih2ZXJzaW9uKQpyZXR1cm4gdmVyc2lvbjtyZXR1cm4gdGhpcy5fZmlsdGVyZWRQcm90b2NvbE5hbWUoKTt9CmNvbnN0IGZpcnN0TGluZT1oZWFkZXJzVGV4dC5zcGxpdCgvXHJcbi8pWzBdO2NvbnN0IG1hdGNoPWZpcnN0TGluZS5tYXRjaCgvXihIVFRQXC9cZCtcLlxkKykvKTtyZXR1cm4gbWF0Y2g/bWF0Y2hbMV06J0hUVFAvMC45Jzt9Cl9wYXJzZVBhcmFtZXRlcnMocXVlcnlTdHJpbmcpe2Z1bmN0aW9uIHBhcnNlTmFtZVZhbHVlKHBhaXIpe2NvbnN0IHBvc2l0aW9uPXBhaXIuaW5kZXhPZignPScpO2lmKHBvc2l0aW9uPT09LTEpCnJldHVybntuYW1lOnBhaXIsdmFsdWU6Jyd9O2Vsc2UKcmV0dXJue25hbWU6cGFpci5zdWJzdHJpbmcoMCxwb3NpdGlvbiksdmFsdWU6cGFpci5zdWJzdHJpbmcocG9zaXRpb24rMSl9O30KcmV0dXJuIHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJykubWFwKHBhcnNlTmFtZVZhbHVlKTt9Cl9wYXJzZU11bHRpcGFydEZvcm1EYXRhUGFyYW1ldGVycyhkYXRhLGJvdW5kYXJ5KXtjb25zdCBzYW5pdGl6ZWRCb3VuZGFyeT1ib3VuZGFyeS5lc2NhcGVGb3JSZWdFeHAoKTtjb25zdCBrZXlWYWx1ZVBhdHRlcm49bmV3IFJlZ0V4cCgnXlxcclxcbmNvbnRlbnQtZGlzcG9zaXRpb25cXHMqOlxccypmb3JtLWRhdGFcXHMqO1xccypuYW1lPSIoW14iXSopIig/Olxccyo7XFxzKmZpbGVuYW1lPSIoW14iXSopIik/JysnKD86XFxyXFxuY29udGVudC10eXBlXFxzKjpcXHMqKFteXFxyXFxuXSopKT8nKydcXHJcXG5cXHJcXG4nKycoLiopJysnXFxyXFxuJCcsJ2lzJyk7Y29uc3QgZmllbGRzPWRhdGEuc3BsaXQobmV3IFJlZ0V4cChgLS0ke3Nhbml0aXplZEJvdW5kYXJ5fSg/Oi0tXHMqJCk/YCwnZycpKTtyZXR1cm4gZmllbGRzLnJlZHVjZShwYXJzZU11bHRpcGFydEZpZWxkLFtdKTtmdW5jdGlvbiBwYXJzZU11bHRpcGFydEZpZWxkKHJlc3VsdCxmaWVsZCl7Y29uc3RbbWF0Y2gsbmFtZSxmaWxlbmFtZSxjb250ZW50VHlwZSx2YWx1ZV09ZmllbGQubWF0Y2goa2V5VmFsdWVQYXR0ZXJuKXx8W107aWYoIW1hdGNoKQpyZXR1cm4gcmVzdWx0O2NvbnN0IHByb2Nlc3NlZFZhbHVlPShmaWxlbmFtZXx8Y29udGVudFR5cGUpP2xzYChiaW5hcnkpYDp2YWx1ZTtyZXN1bHQucHVzaCh7bmFtZSx2YWx1ZTpwcm9jZXNzZWRWYWx1ZX0pO3JldHVybiByZXN1bHQ7fX0KX2NvbXB1dGVIZWFkZXJWYWx1ZShoZWFkZXJzLGhlYWRlck5hbWUpe2hlYWRlck5hbWU9aGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO2NvbnN0IHZhbHVlcz1bXTtmb3IobGV0IGk9MDtpPGhlYWRlcnMubGVuZ3RoOysraSl7aWYoaGVhZGVyc1tpXS5uYW1lLnRvTG93ZXJDYXNlKCk9PT1oZWFkZXJOYW1lKQp2YWx1ZXMucHVzaChoZWFkZXJzW2ldLnZhbHVlKTt9CmlmKCF2YWx1ZXMubGVuZ3RoKQpyZXR1cm4gdW5kZWZpbmVkO2lmKGhlYWRlck5hbWU9PT0nc2V0LWNvb2tpZScpCnJldHVybiB2YWx1ZXMuam9pbignXG4nKTtyZXR1cm4gdmFsdWVzLmpvaW4oJywgJyk7fQpjb250ZW50RGF0YSgpe2lmKHRoaXMuX2NvbnRlbnREYXRhKQpyZXR1cm4gdGhpcy5fY29udGVudERhdGE7aWYodGhpcy5fY29udGVudERhdGFQcm92aWRlcikKdGhpcy5fY29udGVudERhdGE9dGhpcy5fY29udGVudERhdGFQcm92aWRlcigpO2Vsc2UKdGhpcy5fY29udGVudERhdGE9U0RLLk5ldHdvcmtNYW5hZ2VyLnJlcXVlc3RDb250ZW50RGF0YSh0aGlzKTtyZXR1cm4gdGhpcy5fY29udGVudERhdGE7fQpzZXRDb250ZW50RGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcil7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2NvbnRlbnREYXRhLCdjb250ZW50RGF0YSBjYW4gb25seSBiZSBzZXQgb25jZS4nKTt0aGlzLl9jb250ZW50RGF0YVByb3ZpZGVyPWRhdGFQcm92aWRlcjt9CmNvbnRlbnRVUkwoKXtyZXR1cm4gdGhpcy5fdXJsO30KY29udGVudFR5cGUoKXtyZXR1cm4gdGhpcy5fcmVzb3VyY2VUeXBlO30KYXN5bmMgY29udGVudEVuY29kZWQoKXtyZXR1cm4oYXdhaXQgdGhpcy5jb250ZW50RGF0YSgpKS5lbmNvZGVkO30KYXN5bmMgcmVxdWVzdENvbnRlbnQoKXtyZXR1cm4oYXdhaXQgdGhpcy5jb250ZW50RGF0YSgpKS5jb250ZW50O30KYXN5bmMgc2VhcmNoSW5Db250ZW50KHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCl7aWYoIXRoaXMuX2NvbnRlbnREYXRhUHJvdmlkZXIpCnJldHVybiBTREsuTmV0d29ya01hbmFnZXIuc2VhcmNoSW5SZXF1ZXN0KHRoaXMscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtjb25zdCBjb250ZW50PWF3YWl0IHRoaXMucmVxdWVzdENvbnRlbnQoKTtpZighY29udGVudCkKcmV0dXJuW107cmV0dXJuIENvbW1vbi5Db250ZW50UHJvdmlkZXIucGVyZm9ybVNlYXJjaEluQ29udGVudChjb250ZW50LHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCk7fQppc0h0dHBGYW1pbHkoKXtyZXR1cm4hIXRoaXMudXJsKCkubWF0Y2goL15odHRwcz86L2kpO30KcmVxdWVzdENvbnRlbnRUeXBlKCl7cmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlclZhbHVlKCdDb250ZW50LVR5cGUnKTt9Cmhhc0Vycm9yU3RhdHVzQ29kZSgpe3JldHVybiB0aGlzLnN0YXR1c0NvZGU+PTQwMDt9CnNldEluaXRpYWxQcmlvcml0eShwcmlvcml0eSl7dGhpcy5faW5pdGlhbFByaW9yaXR5PXByaW9yaXR5O30KaW5pdGlhbFByaW9yaXR5KCl7cmV0dXJuIHRoaXMuX2luaXRpYWxQcmlvcml0eTt9CnNldFByaW9yaXR5KHByaW9yaXR5KXt0aGlzLl9jdXJyZW50UHJpb3JpdHk9cHJpb3JpdHk7fQpwcmlvcml0eSgpe3JldHVybiB0aGlzLl9jdXJyZW50UHJpb3JpdHl8fHRoaXMuX2luaXRpYWxQcmlvcml0eXx8bnVsbDt9CnNldFNpZ25lZEV4Y2hhbmdlSW5mbyhpbmZvKXt0aGlzLl9zaWduZWRFeGNoYW5nZUluZm89aW5mbzt9CnNpZ25lZEV4Y2hhbmdlSW5mbygpe3JldHVybiB0aGlzLl9zaWduZWRFeGNoYW5nZUluZm87fQpwb3B1bGF0ZUltYWdlU291cmNlKGltYWdlKXtmdW5jdGlvbiBvblJlc291cmNlQ29udGVudChjb250ZW50KXtsZXQgaW1hZ2VTcmM9Q29tbW9uLkNvbnRlbnRQcm92aWRlci5jb250ZW50QXNEYXRhVVJMKGNvbnRlbnQsdGhpcy5fbWltZVR5cGUsdHJ1ZSk7Y29uc3QgY2FjaGVDb250cm9sPXRoaXMucmVzcG9uc2VIZWFkZXJWYWx1ZSgnY2FjaGUtY29udHJvbCcpO2lmKGltYWdlU3JjPT09bnVsbCYmKCFjYWNoZUNvbnRyb2x8fCFjYWNoZUNvbnRyb2wuaW5jbHVkZXMoJ25vLWNhY2hlJykpKQppbWFnZVNyYz10aGlzLl91cmw7aW1hZ2Uuc3JjPWltYWdlU3JjO30KdGhpcy5yZXF1ZXN0Q29udGVudCgpLnRoZW4ob25SZXNvdXJjZUNvbnRlbnQuYmluZCh0aGlzKSk7fQppbml0aWF0b3IoKXtyZXR1cm4gdGhpcy5faW5pdGlhdG9yO30KZnJhbWVzKCl7cmV0dXJuIHRoaXMuX2ZyYW1lczt9CmFkZEZyYW1lRXJyb3IoZXJyb3JNZXNzYWdlLHRpbWUpe3RoaXMuX2FkZEZyYW1lKHt0eXBlOlNESy5OZXR3b3JrUmVxdWVzdC5XZWJTb2NrZXRGcmFtZVR5cGUuRXJyb3IsdGV4dDplcnJvck1lc3NhZ2UsdGltZTp0aGlzLnBzZXVkb1dhbGxUaW1lKHRpbWUpLG9wQ29kZTotMSxtYXNrOmZhbHNlfSk7fQphZGRGcmFtZShyZXNwb25zZSx0aW1lLHNlbnQpe2NvbnN0IHR5cGU9c2VudD9TREsuTmV0d29ya1JlcXVlc3QuV2ViU29ja2V0RnJhbWVUeXBlLlNlbmQ6U0RLLk5ldHdvcmtSZXF1ZXN0LldlYlNvY2tldEZyYW1lVHlwZS5SZWNlaXZlO3RoaXMuX2FkZEZyYW1lKHt0eXBlOnR5cGUsdGV4dDpyZXNwb25zZS5wYXlsb2FkRGF0YSx0aW1lOnRoaXMucHNldWRvV2FsbFRpbWUodGltZSksb3BDb2RlOnJlc3BvbnNlLm9wY29kZSxtYXNrOnJlc3BvbnNlLm1hc2t9KTt9Cl9hZGRGcmFtZShmcmFtZSl7dGhpcy5fZnJhbWVzLnB1c2goZnJhbWUpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuV2Vic29ja2V0RnJhbWVBZGRlZCxmcmFtZSk7fQpldmVudFNvdXJjZU1lc3NhZ2VzKCl7cmV0dXJuIHRoaXMuX2V2ZW50U291cmNlTWVzc2FnZXM7fQphZGRFdmVudFNvdXJjZU1lc3NhZ2UodGltZSxldmVudE5hbWUsZXZlbnRJZCxkYXRhKXtjb25zdCBtZXNzYWdlPXt0aW1lOnRoaXMucHNldWRvV2FsbFRpbWUodGltZSksZXZlbnROYW1lOmV2ZW50TmFtZSxldmVudElkOmV2ZW50SWQsZGF0YTpkYXRhfTt0aGlzLl9ldmVudFNvdXJjZU1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5FdmVudFNvdXJjZU1lc3NhZ2VBZGRlZCxtZXNzYWdlKTt9Cm1hcmtBc1JlZGlyZWN0KHJlZGlyZWN0Q291bnQpe3RoaXMuX3JlcXVlc3RJZD1gJHt0aGlzLl9iYWNrZW5kUmVxdWVzdElkfTpyZWRpcmVjdGVkLiR7cmVkaXJlY3RDb3VudH1gO30Kc2V0UmVxdWVzdElkRm9yVGVzdChyZXF1ZXN0SWQpe3RoaXMuX2JhY2tlbmRSZXF1ZXN0SWQ9cmVxdWVzdElkO3RoaXMuX3JlcXVlc3RJZD1yZXF1ZXN0SWQ7fX07U0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cz17RmluaXNoZWRMb2FkaW5nOlN5bWJvbCgnRmluaXNoZWRMb2FkaW5nJyksVGltaW5nQ2hhbmdlZDpTeW1ib2woJ1RpbWluZ0NoYW5nZWQnKSxSZW1vdGVBZGRyZXNzQ2hhbmdlZDpTeW1ib2woJ1JlbW90ZUFkZHJlc3NDaGFuZ2VkJyksUmVxdWVzdEhlYWRlcnNDaGFuZ2VkOlN5bWJvbCgnUmVxdWVzdEhlYWRlcnNDaGFuZ2VkJyksUmVzcG9uc2VIZWFkZXJzQ2hhbmdlZDpTeW1ib2woJ1Jlc3BvbnNlSGVhZGVyc0NoYW5nZWQnKSxXZWJzb2NrZXRGcmFtZUFkZGVkOlN5bWJvbCgnV2Vic29ja2V0RnJhbWVBZGRlZCcpLEV2ZW50U291cmNlTWVzc2FnZUFkZGVkOlN5bWJvbCgnRXZlbnRTb3VyY2VNZXNzYWdlQWRkZWQnKX07U0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGU9e090aGVyOidvdGhlcicsUGFyc2VyOidwYXJzZXInLFJlZGlyZWN0OidyZWRpcmVjdCcsU2NyaXB0OidzY3JpcHQnLFByZWxvYWQ6J3ByZWxvYWQnLFNpZ25lZEV4Y2hhbmdlOidzaWduZWRFeGNoYW5nZSd9O1NESy5OZXR3b3JrUmVxdWVzdC5OYW1lVmFsdWU7U0RLLk5ldHdvcmtSZXF1ZXN0LldlYlNvY2tldEZyYW1lVHlwZT17U2VuZDonc2VuZCcsUmVjZWl2ZToncmVjZWl2ZScsRXJyb3I6J2Vycm9yJ307U0RLLk5ldHdvcmtSZXF1ZXN0LldlYlNvY2tldEZyYW1lO1NESy5OZXR3b3JrUmVxdWVzdC5FdmVudFNvdXJjZU1lc3NhZ2U7U0RLLk5ldHdvcmtSZXF1ZXN0LkNvbnRlbnREYXRhOztTREsuUGFpbnRQcm9maWxlck1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9sYXllclRyZWVBZ2VudD10YXJnZXQubGF5ZXJUcmVlQWdlbnQoKTt9CmFzeW5jIGxvYWRTbmFwc2hvdEZyb21GcmFnbWVudHMoZnJhZ21lbnRzKXtjb25zdCBzbmFwc2hvdElkPWF3YWl0IHRoaXMuX2xheWVyVHJlZUFnZW50LmxvYWRTbmFwc2hvdChmcmFnbWVudHMpO3JldHVybiBzbmFwc2hvdElkJiZuZXcgU0RLLlBhaW50UHJvZmlsZXJTbmFwc2hvdCh0aGlzLHNuYXBzaG90SWQpO30KbG9hZFNuYXBzaG90KGVuY29kZWRQaWN0dXJlKXtjb25zdCBmcmFnbWVudD17eDowLHk6MCxwaWN0dXJlOmVuY29kZWRQaWN0dXJlfTtyZXR1cm4gdGhpcy5sb2FkU25hcHNob3RGcm9tRnJhZ21lbnRzKFtmcmFnbWVudF0pO30KYXN5bmMgbWFrZVNuYXBzaG90KGxheWVySWQpe2NvbnN0IHNuYXBzaG90SWQ9YXdhaXQgdGhpcy5fbGF5ZXJUcmVlQWdlbnQubWFrZVNuYXBzaG90KGxheWVySWQpO3JldHVybiBzbmFwc2hvdElkJiZuZXcgU0RLLlBhaW50UHJvZmlsZXJTbmFwc2hvdCh0aGlzLHNuYXBzaG90SWQpO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuUGFpbnRQcm9maWxlck1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00sZmFsc2UpO1NESy5QaWN0dXJlRnJhZ21lbnQ7U0RLLlBhaW50UHJvZmlsZXJTbmFwc2hvdD1jbGFzc3tjb25zdHJ1Y3RvcihwYWludFByb2ZpbGVyTW9kZWwsc25hcHNob3RJZCl7dGhpcy5fcGFpbnRQcm9maWxlck1vZGVsPXBhaW50UHJvZmlsZXJNb2RlbDt0aGlzLl9pZD1zbmFwc2hvdElkO3RoaXMuX3JlZkNvdW50PTE7fQpyZWxlYXNlKCl7Y29uc29sZS5hc3NlcnQodGhpcy5fcmVmQ291bnQ+MCwncmVsZWFzZSBpcyBhbHJlYWR5IGNhbGxlZCBvbiB0aGUgb2JqZWN0Jyk7aWYoIS0tdGhpcy5fcmVmQ291bnQpCnRoaXMuX3BhaW50UHJvZmlsZXJNb2RlbC5fbGF5ZXJUcmVlQWdlbnQucmVsZWFzZVNuYXBzaG90KHRoaXMuX2lkKTt9CmFkZFJlZmVyZW5jZSgpeysrdGhpcy5fcmVmQ291bnQ7Y29uc29sZS5hc3NlcnQodGhpcy5fcmVmQ291bnQ+MCwnUmVmZXJlbmNpbmcgYSBkZWFkIG9iamVjdCcpO30KcmVwbGF5KHNjYWxlLGZpcnN0U3RlcCxsYXN0U3RlcCl7cmV0dXJuIHRoaXMuX3BhaW50UHJvZmlsZXJNb2RlbC5fbGF5ZXJUcmVlQWdlbnQucmVwbGF5U25hcHNob3QodGhpcy5faWQsZmlyc3RTdGVwLGxhc3RTdGVwLHNjYWxlfHwxLjApO30KcHJvZmlsZShjbGlwUmVjdCl7cmV0dXJuIHRoaXMuX3BhaW50UHJvZmlsZXJNb2RlbC5fbGF5ZXJUcmVlQWdlbnQucHJvZmlsZVNuYXBzaG90KHRoaXMuX2lkLDUsMSxjbGlwUmVjdHx8dW5kZWZpbmVkKTt9CmFzeW5jIGNvbW1hbmRMb2coKXtjb25zdCBsb2c9YXdhaXQgdGhpcy5fcGFpbnRQcm9maWxlck1vZGVsLl9sYXllclRyZWVBZ2VudC5zbmFwc2hvdENvbW1hbmRMb2codGhpcy5faWQpO3JldHVybiBsb2cmJmxvZy5tYXAoKGVudHJ5LGluZGV4KT0+bmV3IFNESy5QYWludFByb2ZpbGVyTG9nSXRlbShlbnRyeSxpbmRleCkpO319O1NESy5SYXdQYWludFByb2ZpbGVyTG9nSXRlbTtTREsuUGFpbnRQcm9maWxlckxvZ0l0ZW09Y2xhc3N7Y29uc3RydWN0b3IocmF3RW50cnksY29tbWFuZEluZGV4KXt0aGlzLm1ldGhvZD1yYXdFbnRyeS5tZXRob2Q7dGhpcy5wYXJhbXM9cmF3RW50cnkucGFyYW1zO3RoaXMuY29tbWFuZEluZGV4PWNvbW1hbmRJbmRleDt9fTs7U0RLLkhlYXBQcm9maWxlck1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0YXJnZXQucmVnaXN0ZXJIZWFwUHJvZmlsZXJEaXNwYXRjaGVyKG5ldyBTREsuSGVhcFByb2ZpbGVyRGlzcGF0Y2hlcih0aGlzKSk7dGhpcy5fZW5hYmxlZD1mYWxzZTt0aGlzLl9oZWFwUHJvZmlsZXJBZ2VudD10YXJnZXQuaGVhcFByb2ZpbGVyQWdlbnQoKTt0aGlzLl9tZW1vcnlBZ2VudD10YXJnZXQubWVtb3J5QWdlbnQoKTt0aGlzLl9ydW50aW1lTW9kZWw9KHRhcmdldC5tb2RlbChTREsuUnVudGltZU1vZGVsKSk7fQpkZWJ1Z2dlck1vZGVsKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVNb2RlbC5kZWJ1Z2dlck1vZGVsKCk7fQpydW50aW1lTW9kZWwoKXtyZXR1cm4gdGhpcy5fcnVudGltZU1vZGVsO30KZW5hYmxlKCl7aWYodGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt0aGlzLl9oZWFwUHJvZmlsZXJBZ2VudC5lbmFibGUoKTt9CnN0YXJ0U2FtcGxpbmcoKXtjb25zdCBkZWZhdWx0U2FtcGxpbmdJbnRlcnZhbEluQnl0ZXM9MTYzODQ7dGhpcy5faGVhcFByb2ZpbGVyQWdlbnQuc3RhcnRTYW1wbGluZyhkZWZhdWx0U2FtcGxpbmdJbnRlcnZhbEluQnl0ZXMpO30Kc3RvcFNhbXBsaW5nKCl7dGhpcy5faXNSZWNvcmRpbmc9ZmFsc2U7cmV0dXJuIHRoaXMuX2hlYXBQcm9maWxlckFnZW50LnN0b3BTYW1wbGluZygpO30Kc3RhcnROYXRpdmVTYW1wbGluZygpe2NvbnN0IGRlZmF1bHRTYW1wbGluZ0ludGVydmFsSW5CeXRlcz02NTUzNjt0aGlzLl9tZW1vcnlBZ2VudC5zdGFydFNhbXBsaW5nKGRlZmF1bHRTYW1wbGluZ0ludGVydmFsSW5CeXRlcyk7fQphc3luYyBzdG9wTmF0aXZlU2FtcGxpbmcoKXtjb25zdCByYXdQcm9maWxlPWF3YWl0IHRoaXMuX21lbW9yeUFnZW50LmdldFNhbXBsaW5nUHJvZmlsZSgpO3RoaXMuX21lbW9yeUFnZW50LnN0b3BTYW1wbGluZygpO3JldHVybiB0aGlzLl9jb252ZXJ0TmF0aXZlUHJvZmlsZShyYXdQcm9maWxlKTt9CmFzeW5jIHRha2VOYXRpdmVTbmFwc2hvdCgpe2NvbnN0IHJhd1Byb2ZpbGU9YXdhaXQgdGhpcy5fbWVtb3J5QWdlbnQuZ2V0QWxsVGltZVNhbXBsaW5nUHJvZmlsZSgpO3JldHVybiB0aGlzLl9jb252ZXJ0TmF0aXZlUHJvZmlsZShyYXdQcm9maWxlKTt9CmFzeW5jIHRha2VOYXRpdmVCcm93c2VyU25hcHNob3QoKXtjb25zdCByYXdQcm9maWxlPWF3YWl0IHRoaXMuX21lbW9yeUFnZW50LmdldEJyb3dzZXJTYW1wbGluZ1Byb2ZpbGUoKTtyZXR1cm4gdGhpcy5fY29udmVydE5hdGl2ZVByb2ZpbGUocmF3UHJvZmlsZSk7fQpfY29udmVydE5hdGl2ZVByb2ZpbGUocmF3UHJvZmlsZSl7Y29uc3QgaGVhZD17Y2hpbGRyZW46bmV3IE1hcCgpLHNlbGZTaXplOjAsY2FsbEZyYW1lOntmdW5jdGlvbk5hbWU6Jyhyb290KScsdXJsOicnfX07Zm9yKGNvbnN0IHNhbXBsZSBvZiByYXdQcm9maWxlLnNhbXBsZXMpe2NvbnN0IG5vZGU9c2FtcGxlLnN0YWNrLnJldmVyc2UoKS5yZWR1Y2UoKG5vZGUsbmFtZSk9PntsZXQgY2hpbGQ9bm9kZS5jaGlsZHJlbi5nZXQobmFtZSk7aWYoY2hpbGQpCnJldHVybiBjaGlsZDtjb25zdCBuYW1lc3BhY2U9L14oW146XSopOjovLmV4ZWMobmFtZSk7Y2hpbGQ9e2NoaWxkcmVuOm5ldyBNYXAoKSxjYWxsRnJhbWU6e2Z1bmN0aW9uTmFtZTpuYW1lLHVybDpuYW1lc3BhY2UmJm5hbWVzcGFjZVsxXXx8Jyd9LHNlbGZTaXplOjB9O25vZGUuY2hpbGRyZW4uc2V0KG5hbWUsY2hpbGQpO3JldHVybiBjaGlsZDt9LGhlYWQpO25vZGUuc2VsZlNpemUrPXNhbXBsZS50b3RhbDt9CmZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlbihub2RlKXtub2RlLmNoaWxkcmVuPUFycmF5LmZyb20obm9kZS5jaGlsZHJlbi52YWx1ZXMoKSk7bm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNvbnZlcnRDaGlsZHJlbik7fQpjb252ZXJ0Q2hpbGRyZW4oaGVhZCk7cmV0dXJuKHtoZWFkfSk7fQpjb2xsZWN0R2FyYmFnZSgpe3JldHVybiB0aGlzLl9oZWFwUHJvZmlsZXJBZ2VudC5jb2xsZWN0R2FyYmFnZSgpO30Kc25hcHNob3RPYmplY3RJZEZvck9iamVjdElkKG9iamVjdElkKXtyZXR1cm4gdGhpcy5faGVhcFByb2ZpbGVyQWdlbnQuZ2V0SGVhcE9iamVjdElkKG9iamVjdElkKTt9CmFzeW5jIG9iamVjdEZvclNuYXBzaG90T2JqZWN0SWQoc25hcHNob3RPYmplY3RJZCxvYmplY3RHcm91cE5hbWUpe2NvbnN0IHJlc3VsdD1hd2FpdCB0aGlzLl9oZWFwUHJvZmlsZXJBZ2VudC5nZXRPYmplY3RCeUhlYXBPYmplY3RJZChzbmFwc2hvdE9iamVjdElkLG9iamVjdEdyb3VwTmFtZSk7cmV0dXJuIHJlc3VsdCYmcmVzdWx0LnR5cGUmJnRoaXMuX3J1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocmVzdWx0KXx8bnVsbDt9CmFkZEluc3BlY3RlZEhlYXBPYmplY3Qoc25hcHNob3RPYmplY3RJZCl7cmV0dXJuIHRoaXMuX2hlYXBQcm9maWxlckFnZW50LmFkZEluc3BlY3RlZEhlYXBPYmplY3Qoc25hcHNob3RPYmplY3RJZCk7fQp0YWtlSGVhcFNuYXBzaG90KHJlcG9ydFByb2dyZXNzKXtyZXR1cm4gdGhpcy5faGVhcFByb2ZpbGVyQWdlbnQudGFrZUhlYXBTbmFwc2hvdChyZXBvcnRQcm9ncmVzcyk7fQpzdGFydFRyYWNraW5nSGVhcE9iamVjdHMocmVjb3JkQWxsb2NhdGlvblN0YWNrcyl7cmV0dXJuIHRoaXMuX2hlYXBQcm9maWxlckFnZW50LnN0YXJ0VHJhY2tpbmdIZWFwT2JqZWN0cyhyZWNvcmRBbGxvY2F0aW9uU3RhY2tzKTt9CnN0b3BUcmFja2luZ0hlYXBPYmplY3RzKHJlcG9ydFByb2dyZXNzKXtyZXR1cm4gdGhpcy5faGVhcFByb2ZpbGVyQWdlbnQuc3RvcFRyYWNraW5nSGVhcE9iamVjdHMocmVwb3J0UHJvZ3Jlc3MpO30KaGVhcFN0YXRzVXBkYXRlKHNhbXBsZXMpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5IZWFwUHJvZmlsZXJNb2RlbC5FdmVudHMuSGVhcFN0YXRzVXBkYXRlLHNhbXBsZXMpO30KbGFzdFNlZW5PYmplY3RJZChsYXN0U2Vlbk9iamVjdElkLHRpbWVzdGFtcCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5MYXN0U2Vlbk9iamVjdElkLHtsYXN0U2Vlbk9iamVjdElkOmxhc3RTZWVuT2JqZWN0SWQsdGltZXN0YW1wOnRpbWVzdGFtcH0pO30KYWRkSGVhcFNuYXBzaG90Q2h1bmsoY2h1bmspe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5IZWFwUHJvZmlsZXJNb2RlbC5FdmVudHMuQWRkSGVhcFNuYXBzaG90Q2h1bmssY2h1bmspO30KcmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MoZG9uZSx0b3RhbCxmaW5pc2hlZCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5SZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzcyx7ZG9uZTpkb25lLHRvdGFsOnRvdGFsLGZpbmlzaGVkOmZpbmlzaGVkfSk7fQpyZXNldFByb2ZpbGVzKCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5SZXNldFByb2ZpbGVzLHRoaXMpO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihTREsuSGVhcFByb2ZpbGVyTW9kZWwsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTLGZhbHNlKTtTREsuSGVhcFByb2ZpbGVyTW9kZWwuRXZlbnRzPXtIZWFwU3RhdHNVcGRhdGU6U3ltYm9sKCdIZWFwU3RhdHNVcGRhdGUnKSxMYXN0U2Vlbk9iamVjdElkOlN5bWJvbCgnTGFzdFNlZW5PYmplY3RJZCcpLEFkZEhlYXBTbmFwc2hvdENodW5rOlN5bWJvbCgnQWRkSGVhcFNuYXBzaG90Q2h1bmsnKSxSZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzczpTeW1ib2woJ1JlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzJyksUmVzZXRQcm9maWxlczpTeW1ib2woJ1Jlc2V0UHJvZmlsZXMnKX07U0RLLkhlYXBQcm9maWxlckRpc3BhdGNoZXI9Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwpe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsPW1vZGVsO30KaGVhcFN0YXRzVXBkYXRlKHNhbXBsZXMpe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsLmhlYXBTdGF0c1VwZGF0ZShzYW1wbGVzKTt9Cmxhc3RTZWVuT2JqZWN0SWQobGFzdFNlZW5PYmplY3RJZCx0aW1lc3RhbXApe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsLmxhc3RTZWVuT2JqZWN0SWQobGFzdFNlZW5PYmplY3RJZCx0aW1lc3RhbXApO30KYWRkSGVhcFNuYXBzaG90Q2h1bmsoY2h1bmspe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsLmFkZEhlYXBTbmFwc2hvdENodW5rKGNodW5rKTt9CnJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzKGRvbmUsdG90YWwsZmluaXNoZWQpe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsLnJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzKGRvbmUsdG90YWwsZmluaXNoZWQpO30KcmVzZXRQcm9maWxlcygpe3RoaXMuX2hlYXBQcm9maWxlck1vZGVsLnJlc2V0UHJvZmlsZXMoKTt9fTs7U0RLLlBlcmZvcm1hbmNlTWV0cmljc01vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9hZ2VudD10YXJnZXQucGVyZm9ybWFuY2VBZ2VudCgpO2NvbnN0IG1vZGU9U0RLLlBlcmZvcm1hbmNlTWV0cmljc01vZGVsLk1ldHJpY01vZGU7dGhpcy5fbWV0cmljTW9kZXM9bmV3IE1hcChbWydUYXNrRHVyYXRpb24nLG1vZGUuQ3VtdWxhdGl2ZVRpbWVdLFsnU2NyaXB0RHVyYXRpb24nLG1vZGUuQ3VtdWxhdGl2ZVRpbWVdLFsnTGF5b3V0RHVyYXRpb24nLG1vZGUuQ3VtdWxhdGl2ZVRpbWVdLFsnUmVjYWxjU3R5bGVEdXJhdGlvbicsbW9kZS5DdW11bGF0aXZlVGltZV0sWydMYXlvdXRDb3VudCcsbW9kZS5DdW11bGF0aXZlQ291bnRdLFsnUmVjYWxjU3R5bGVDb3VudCcsbW9kZS5DdW11bGF0aXZlQ291bnRdXSk7dGhpcy5fbWV0cmljRGF0YT1uZXcgTWFwKCk7fQplbmFibGUoKXtyZXR1cm4gdGhpcy5fYWdlbnQuZW5hYmxlKCk7fQpkaXNhYmxlKCl7cmV0dXJuIHRoaXMuX2FnZW50LmRpc2FibGUoKTt9CmFzeW5jIHJlcXVlc3RNZXRyaWNzKCl7Y29uc3QgcmF3TWV0cmljcz1hd2FpdCB0aGlzLl9hZ2VudC5nZXRNZXRyaWNzKCl8fFtdO2NvbnN0IG1ldHJpY3M9bmV3IE1hcCgpO2NvbnN0IHRpbWVzdGFtcD1wZXJmb3JtYW5jZS5ub3coKTtmb3IoY29uc3QgbWV0cmljIG9mIHJhd01ldHJpY3Mpe2xldCBkYXRhPXRoaXMuX21ldHJpY0RhdGEuZ2V0KG1ldHJpYy5uYW1lKTtpZighZGF0YSl7ZGF0YT17fTt0aGlzLl9tZXRyaWNEYXRhLnNldChtZXRyaWMubmFtZSxkYXRhKTt9CmxldCB2YWx1ZTtzd2l0Y2godGhpcy5fbWV0cmljTW9kZXMuZ2V0KG1ldHJpYy5uYW1lKSl7Y2FzZSBTREsuUGVyZm9ybWFuY2VNZXRyaWNzTW9kZWwuTWV0cmljTW9kZS5DdW11bGF0aXZlVGltZTp2YWx1ZT1kYXRhLmxhc3RUaW1lc3RhbXA/TnVtYmVyLmNvbnN0cmFpbigobWV0cmljLnZhbHVlLWRhdGEubGFzdFZhbHVlKSoxMDAwLyh0aW1lc3RhbXAtZGF0YS5sYXN0VGltZXN0YW1wKSwwLDEpOjA7ZGF0YS5sYXN0VmFsdWU9bWV0cmljLnZhbHVlO2RhdGEubGFzdFRpbWVzdGFtcD10aW1lc3RhbXA7YnJlYWs7Y2FzZSBTREsuUGVyZm9ybWFuY2VNZXRyaWNzTW9kZWwuTWV0cmljTW9kZS5DdW11bGF0aXZlQ291bnQ6dmFsdWU9ZGF0YS5sYXN0VGltZXN0YW1wP01hdGgubWF4KDAsKG1ldHJpYy52YWx1ZS1kYXRhLmxhc3RWYWx1ZSkqMTAwMC8odGltZXN0YW1wLWRhdGEubGFzdFRpbWVzdGFtcCkpOjA7ZGF0YS5sYXN0VmFsdWU9bWV0cmljLnZhbHVlO2RhdGEubGFzdFRpbWVzdGFtcD10aW1lc3RhbXA7YnJlYWs7ZGVmYXVsdDp2YWx1ZT1tZXRyaWMudmFsdWU7YnJlYWs7fQptZXRyaWNzLnNldChtZXRyaWMubmFtZSx2YWx1ZSk7fQpyZXR1cm57bWV0cmljczptZXRyaWNzLHRpbWVzdGFtcDp0aW1lc3RhbXB9O319O1NESy5QZXJmb3JtYW5jZU1ldHJpY3NNb2RlbC5NZXRyaWNNb2RlPXtDdW11bGF0aXZlVGltZTpTeW1ib2woJ0N1bXVsYXRpdmVUaW1lJyksQ3VtdWxhdGl2ZUNvdW50OlN5bWJvbCgnQ3VtdWxhdGl2ZUNvdW50JyksfTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU0RLLlBlcmZvcm1hbmNlTWV0cmljc01vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyLGZhbHNlKTs7U0RLLkNTU01ldGFkYXRhLl9nZW5lcmF0ZWRQcm9wZXJ0aWVzPVt7Im5hbWUiOiItd2Via2l0LWFwcC1yZWdpb24ifSx7Im5hbWUiOiItd2Via2l0LWFwcGVhcmFuY2UifSx7Im5hbWUiOiItd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmciLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtYm9yZGVyLWltYWdlIn0seyJuYW1lIjoiLXdlYmtpdC1ib3JkZXItdmVydGljYWwtc3BhY2luZyIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC1ib3gtYWxpZ24ifSx7Im5hbWUiOiItd2Via2l0LWJveC1kZWNvcmF0aW9uLWJyZWFrIn0seyJuYW1lIjoiLXdlYmtpdC1ib3gtZGlyZWN0aW9uIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiItd2Via2l0LWJveC1mbGV4In0seyJuYW1lIjoiLXdlYmtpdC1ib3gtb3JkaW5hbC1ncm91cCJ9LHsibmFtZSI6Ii13ZWJraXQtYm94LW9yaWVudCJ9LHsibmFtZSI6Ii13ZWJraXQtYm94LXBhY2sifSx7Im5hbWUiOiItd2Via2l0LWJveC1yZWZsZWN0In0seyJsb25naGFuZHMiOlsiYnJlYWstYWZ0ZXIiXSwibmFtZSI6Ii13ZWJraXQtY29sdW1uLWJyZWFrLWFmdGVyIn0seyJsb25naGFuZHMiOlsiYnJlYWstYmVmb3JlIl0sIm5hbWUiOiItd2Via2l0LWNvbHVtbi1icmVhay1iZWZvcmUifSx7ImxvbmdoYW5kcyI6WyJicmVhay1pbnNpZGUiXSwibmFtZSI6Ii13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZSJ9LHsibmFtZSI6Ii13ZWJraXQtZm9udC1zaXplLWRlbHRhIn0seyJuYW1lIjoiLXdlYmtpdC1mb250LXNtb290aGluZyIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC1oaWdobGlnaHQiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtaHlwaGVuYXRlLWNoYXJhY3RlciIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC1saW5lLWJyZWFrIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiItd2Via2l0LWxpbmUtY2xhbXAifSx7Im5hbWUiOiItd2Via2l0LWxvY2FsZSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC1tYXJnaW4tYWZ0ZXItY29sbGFwc2UifSx7Im5hbWUiOiItd2Via2l0LW1hcmdpbi1iZWZvcmUtY29sbGFwc2UifSx7Im5hbWUiOiItd2Via2l0LW1hcmdpbi1ib3R0b20tY29sbGFwc2UifSx7ImxvbmdoYW5kcyI6WyItd2Via2l0LW1hcmdpbi1iZWZvcmUtY29sbGFwc2UiLCItd2Via2l0LW1hcmdpbi1hZnRlci1jb2xsYXBzZSJdLCJuYW1lIjoiLXdlYmtpdC1tYXJnaW4tY29sbGFwc2UifSx7Im5hbWUiOiItd2Via2l0LW1hcmdpbi10b3AtY29sbGFwc2UifSx7ImxvbmdoYW5kcyI6WyItd2Via2l0LW1hc2staW1hZ2UiLCItd2Via2l0LW1hc2stcG9zaXRpb24teCIsIi13ZWJraXQtbWFzay1wb3NpdGlvbi15IiwiLXdlYmtpdC1tYXNrLXNpemUiLCItd2Via2l0LW1hc2stcmVwZWF0LXgiLCItd2Via2l0LW1hc2stcmVwZWF0LXkiLCItd2Via2l0LW1hc2stb3JpZ2luIiwiLXdlYmtpdC1tYXNrLWNsaXAiXSwibmFtZSI6Ii13ZWJraXQtbWFzayJ9LHsibG9uZ2hhbmRzIjpbIi13ZWJraXQtbWFzay1ib3gtaW1hZ2Utc291cmNlIiwiLXdlYmtpdC1tYXNrLWJveC1pbWFnZS1zbGljZSIsIi13ZWJraXQtbWFzay1ib3gtaW1hZ2Utd2lkdGgiLCItd2Via2l0LW1hc2stYm94LWltYWdlLW91dHNldCIsIi13ZWJraXQtbWFzay1ib3gtaW1hZ2UtcmVwZWF0Il0sIm5hbWUiOiItd2Via2l0LW1hc2stYm94LWltYWdlIn0seyJuYW1lIjoiLXdlYmtpdC1tYXNrLWJveC1pbWFnZS1vdXRzZXQifSx7Im5hbWUiOiItd2Via2l0LW1hc2stYm94LWltYWdlLXJlcGVhdCJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1ib3gtaW1hZ2Utc2xpY2UifSx7Im5hbWUiOiItd2Via2l0LW1hc2stYm94LWltYWdlLXNvdXJjZSJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1ib3gtaW1hZ2Utd2lkdGgifSx7Im5hbWUiOiItd2Via2l0LW1hc2stY2xpcCJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1jb21wb3NpdGUifSx7Im5hbWUiOiItd2Via2l0LW1hc2staW1hZ2UifSx7Im5hbWUiOiItd2Via2l0LW1hc2stb3JpZ2luIn0seyJsb25naGFuZHMiOlsiLXdlYmtpdC1tYXNrLXBvc2l0aW9uLXgiLCItd2Via2l0LW1hc2stcG9zaXRpb24teSJdLCJuYW1lIjoiLXdlYmtpdC1tYXNrLXBvc2l0aW9uIn0seyJuYW1lIjoiLXdlYmtpdC1tYXNrLXBvc2l0aW9uLXgifSx7Im5hbWUiOiItd2Via2l0LW1hc2stcG9zaXRpb24teSJ9LHsibG9uZ2hhbmRzIjpbIi13ZWJraXQtbWFzay1yZXBlYXQteCIsIi13ZWJraXQtbWFzay1yZXBlYXQteSJdLCJuYW1lIjoiLXdlYmtpdC1tYXNrLXJlcGVhdCJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1yZXBlYXQteCJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1yZXBlYXQteSJ9LHsibmFtZSI6Ii13ZWJraXQtbWFzay1zaXplIn0seyJuYW1lIjoiLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW4teCJ9LHsibmFtZSI6Ii13ZWJraXQtcGVyc3BlY3RpdmUtb3JpZ2luLXkifSx7Im5hbWUiOiItd2Via2l0LXByaW50LWNvbG9yLWFkanVzdCIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC1ydGwtb3JkZXJpbmciLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtcnVieS1wb3NpdGlvbiIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiItd2Via2l0LXRleHQtY29tYmluZSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC10ZXh0LWRlY29yYXRpb25zLWluLWVmZmVjdCIsImluaGVyaXRlZCI6dHJ1ZX0seyJsb25naGFuZHMiOlsiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLXN0eWxlIiwiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLWNvbG9yIl0sIm5hbWUiOiItd2Via2l0LXRleHQtZW1waGFzaXMiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdGV4dC1lbXBoYXNpcy1jb2xvciIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLXBvc2l0aW9uIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiItd2Via2l0LXRleHQtZW1waGFzaXMtc3R5bGUiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdGV4dC1maWxsLWNvbG9yIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiItd2Via2l0LXRleHQtb3JpZW50YXRpb24iLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdGV4dC1zZWN1cml0eSIsImluaGVyaXRlZCI6dHJ1ZX0seyJsb25naGFuZHMiOlsiLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aCIsIi13ZWJraXQtdGV4dC1zdHJva2UtY29sb3IiXSwibmFtZSI6Ii13ZWJraXQtdGV4dC1zdHJva2UiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdGV4dC1zdHJva2UtY29sb3IiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGgiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6Ii13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbi14In0seyJuYW1lIjoiLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luLXkifSx7Im5hbWUiOiItd2Via2l0LXRyYW5zZm9ybS1vcmlnaW4teiJ9LHsibmFtZSI6Ii13ZWJraXQtdXNlci1kcmFnIn0seyJuYW1lIjoiLXdlYmtpdC11c2VyLW1vZGlmeSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiLXdlYmtpdC13cml0aW5nLW1vZGUiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImFsaWduLWNvbnRlbnQifSx7Im5hbWUiOiJhbGlnbi1pdGVtcyJ9LHsibmFtZSI6ImFsaWduLXNlbGYifSx7InN2ZyI6dHJ1ZSwibmFtZSI6ImFsaWdubWVudC1iYXNlbGluZSJ9LHsibmFtZSI6ImFsbCJ9LHsibG9uZ2hhbmRzIjpbImFuaW1hdGlvbi1uYW1lIiwiYW5pbWF0aW9uLWR1cmF0aW9uIiwiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiIsImFuaW1hdGlvbi1kZWxheSIsImFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQiLCJhbmltYXRpb24tZGlyZWN0aW9uIiwiYW5pbWF0aW9uLWZpbGwtbW9kZSIsImFuaW1hdGlvbi1wbGF5LXN0YXRlIl0sIm5hbWUiOiJhbmltYXRpb24ifSx7Im5hbWUiOiJhbmltYXRpb24tZGVsYXkifSx7Im5hbWUiOiJhbmltYXRpb24tZGlyZWN0aW9uIn0seyJuYW1lIjoiYW5pbWF0aW9uLWR1cmF0aW9uIn0seyJuYW1lIjoiYW5pbWF0aW9uLWZpbGwtbW9kZSJ9LHsibmFtZSI6ImFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQifSx7Im5hbWUiOiJhbmltYXRpb24tbmFtZSJ9LHsibmFtZSI6ImFuaW1hdGlvbi1wbGF5LXN0YXRlIn0seyJuYW1lIjoiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiJ9LHsibmFtZSI6ImJhY2tkcm9wLWZpbHRlciJ9LHsibmFtZSI6ImJhY2tmYWNlLXZpc2liaWxpdHkifSx7ImxvbmdoYW5kcyI6WyJiYWNrZ3JvdW5kLWltYWdlIiwiYmFja2dyb3VuZC1wb3NpdGlvbi14IiwiYmFja2dyb3VuZC1wb3NpdGlvbi15IiwiYmFja2dyb3VuZC1zaXplIiwiYmFja2dyb3VuZC1yZXBlYXQteCIsImJhY2tncm91bmQtcmVwZWF0LXkiLCJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLCJiYWNrZ3JvdW5kLW9yaWdpbiIsImJhY2tncm91bmQtY2xpcCIsImJhY2tncm91bmQtY29sb3IiXSwibmFtZSI6ImJhY2tncm91bmQifSx7Im5hbWUiOiJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQifSx7Im5hbWUiOiJiYWNrZ3JvdW5kLWJsZW5kLW1vZGUifSx7Im5hbWUiOiJiYWNrZ3JvdW5kLWNsaXAifSx7Im5hbWUiOiJiYWNrZ3JvdW5kLWNvbG9yIn0seyJuYW1lIjoiYmFja2dyb3VuZC1pbWFnZSJ9LHsibmFtZSI6ImJhY2tncm91bmQtb3JpZ2luIn0seyJsb25naGFuZHMiOlsiYmFja2dyb3VuZC1wb3NpdGlvbi14IiwiYmFja2dyb3VuZC1wb3NpdGlvbi15Il0sIm5hbWUiOiJiYWNrZ3JvdW5kLXBvc2l0aW9uIn0seyJuYW1lIjoiYmFja2dyb3VuZC1wb3NpdGlvbi14In0seyJuYW1lIjoiYmFja2dyb3VuZC1wb3NpdGlvbi15In0seyJsb25naGFuZHMiOlsiYmFja2dyb3VuZC1yZXBlYXQteCIsImJhY2tncm91bmQtcmVwZWF0LXkiXSwibmFtZSI6ImJhY2tncm91bmQtcmVwZWF0In0seyJuYW1lIjoiYmFja2dyb3VuZC1yZXBlYXQteCJ9LHsibmFtZSI6ImJhY2tncm91bmQtcmVwZWF0LXkifSx7Im5hbWUiOiJiYWNrZ3JvdW5kLXNpemUifSx7Im5hbWUiOiJiYXNlbGluZS1zaGlmdCIsInN2ZyI6dHJ1ZX0seyJuYW1lIjoiYmxvY2stc2l6ZSJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci10b3AtY29sb3IiLCJib3JkZXItdG9wLXN0eWxlIiwiYm9yZGVyLXRvcC13aWR0aCIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci1yaWdodC1zdHlsZSIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItYm90dG9tLXN0eWxlIiwiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLWxlZnQtc3R5bGUiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1pbWFnZS1zb3VyY2UiLCJib3JkZXItaW1hZ2Utc2xpY2UiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItaW1hZ2Utb3V0c2V0IiwiYm9yZGVyLWltYWdlLXJlcGVhdCJdLCJuYW1lIjoiYm9yZGVyIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWJsb2NrLXN0YXJ0IiwiYm9yZGVyLWJsb2NrLWVuZCJdLCJuYW1lIjoiYm9yZGVyLWJsb2NrIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yIiwiYm9yZGVyLWJsb2NrLWVuZC1jb2xvciJdLCJuYW1lIjoiYm9yZGVyLWJsb2NrLWNvbG9yIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWJsb2NrLWVuZC13aWR0aCIsImJvcmRlci1ibG9jay1lbmQtc3R5bGUiLCJib3JkZXItYmxvY2stZW5kLWNvbG9yIl0sIm5hbWUiOiJib3JkZXItYmxvY2stZW5kIn0seyJuYW1lIjoiYm9yZGVyLWJsb2NrLWVuZC1jb2xvciJ9LHsibmFtZSI6ImJvcmRlci1ibG9jay1lbmQtc3R5bGUifSx7Im5hbWUiOiJib3JkZXItYmxvY2stZW5kLXdpZHRoIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWJsb2NrLXN0YXJ0LXdpZHRoIiwiYm9yZGVyLWJsb2NrLXN0YXJ0LXN0eWxlIiwiYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yIl0sIm5hbWUiOiJib3JkZXItYmxvY2stc3RhcnQifSx7Im5hbWUiOiJib3JkZXItYmxvY2stc3RhcnQtY29sb3IifSx7Im5hbWUiOiJib3JkZXItYmxvY2stc3RhcnQtc3R5bGUifSx7Im5hbWUiOiJib3JkZXItYmxvY2stc3RhcnQtd2lkdGgifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItYmxvY2stc3RhcnQtc3R5bGUiLCJib3JkZXItYmxvY2stZW5kLXN0eWxlIl0sIm5hbWUiOiJib3JkZXItYmxvY2stc3R5bGUifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItYmxvY2stc3RhcnQtd2lkdGgiLCJib3JkZXItYmxvY2stZW5kLXdpZHRoIl0sIm5hbWUiOiJib3JkZXItYmxvY2std2lkdGgifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItYm90dG9tLXdpZHRoIiwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsImJvcmRlci1ib3R0b20tY29sb3IiXSwibmFtZSI6ImJvcmRlci1ib3R0b20ifSx7Im5hbWUiOiJib3JkZXItYm90dG9tLWNvbG9yIn0seyJuYW1lIjoiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyJ9LHsibmFtZSI6ImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIn0seyJuYW1lIjoiYm9yZGVyLWJvdHRvbS1zdHlsZSJ9LHsibmFtZSI6ImJvcmRlci1ib3R0b20td2lkdGgifSx7Im5hbWUiOiJib3JkZXItY29sbGFwc2UiLCJpbmhlcml0ZWQiOnRydWV9LHsibG9uZ2hhbmRzIjpbImJvcmRlci10b3AtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiXSwibmFtZSI6ImJvcmRlci1jb2xvciJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci1pbWFnZS1zb3VyY2UiLCJib3JkZXItaW1hZ2Utc2xpY2UiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItaW1hZ2Utb3V0c2V0IiwiYm9yZGVyLWltYWdlLXJlcGVhdCJdLCJuYW1lIjoiYm9yZGVyLWltYWdlIn0seyJuYW1lIjoiYm9yZGVyLWltYWdlLW91dHNldCJ9LHsibmFtZSI6ImJvcmRlci1pbWFnZS1yZXBlYXQifSx7Im5hbWUiOiJib3JkZXItaW1hZ2Utc2xpY2UifSx7Im5hbWUiOiJib3JkZXItaW1hZ2Utc291cmNlIn0seyJuYW1lIjoiYm9yZGVyLWltYWdlLXdpZHRoIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWlubGluZS1zdGFydCIsImJvcmRlci1pbmxpbmUtZW5kIl0sIm5hbWUiOiJib3JkZXItaW5saW5lIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWlubGluZS1zdGFydC1jb2xvciIsImJvcmRlci1pbmxpbmUtZW5kLWNvbG9yIl0sIm5hbWUiOiJib3JkZXItaW5saW5lLWNvbG9yIn0seyJsb25naGFuZHMiOlsiYm9yZGVyLWlubGluZS1lbmQtd2lkdGgiLCJib3JkZXItaW5saW5lLWVuZC1zdHlsZSIsImJvcmRlci1pbmxpbmUtZW5kLWNvbG9yIl0sIm5hbWUiOiJib3JkZXItaW5saW5lLWVuZCJ9LHsibmFtZSI6ImJvcmRlci1pbmxpbmUtZW5kLWNvbG9yIn0seyJuYW1lIjoiYm9yZGVyLWlubGluZS1lbmQtc3R5bGUifSx7Im5hbWUiOiJib3JkZXItaW5saW5lLWVuZC13aWR0aCJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci1pbmxpbmUtc3RhcnQtd2lkdGgiLCJib3JkZXItaW5saW5lLXN0YXJ0LXN0eWxlIiwiYm9yZGVyLWlubGluZS1zdGFydC1jb2xvciJdLCJuYW1lIjoiYm9yZGVyLWlubGluZS1zdGFydCJ9LHsibmFtZSI6ImJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3IifSx7Im5hbWUiOiJib3JkZXItaW5saW5lLXN0YXJ0LXN0eWxlIn0seyJuYW1lIjoiYm9yZGVyLWlubGluZS1zdGFydC13aWR0aCJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGUiLCJib3JkZXItaW5saW5lLWVuZC1zdHlsZSJdLCJuYW1lIjoiYm9yZGVyLWlubGluZS1zdHlsZSJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci1pbmxpbmUtc3RhcnQtd2lkdGgiLCJib3JkZXItaW5saW5lLWVuZC13aWR0aCJdLCJuYW1lIjoiYm9yZGVyLWlubGluZS13aWR0aCJ9LHsibG9uZ2hhbmRzIjpbImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLWxlZnQtc3R5bGUiLCJib3JkZXItbGVmdC1jb2xvciJdLCJuYW1lIjoiYm9yZGVyLWxlZnQifSx7Im5hbWUiOiJib3JkZXItbGVmdC1jb2xvciJ9LHsibmFtZSI6ImJvcmRlci1sZWZ0LXN0eWxlIn0seyJuYW1lIjoiYm9yZGVyLWxlZnQtd2lkdGgifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiXSwibmFtZSI6ImJvcmRlci1yYWRpdXMifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItcmlnaHQtc3R5bGUiLCJib3JkZXItcmlnaHQtY29sb3IiXSwibmFtZSI6ImJvcmRlci1yaWdodCJ9LHsibmFtZSI6ImJvcmRlci1yaWdodC1jb2xvciJ9LHsibmFtZSI6ImJvcmRlci1yaWdodC1zdHlsZSJ9LHsibmFtZSI6ImJvcmRlci1yaWdodC13aWR0aCJ9LHsibG9uZ2hhbmRzIjpbIi13ZWJraXQtYm9yZGVyLWhvcml6b250YWwtc3BhY2luZyIsIi13ZWJraXQtYm9yZGVyLXZlcnRpY2FsLXNwYWNpbmciXSwibmFtZSI6ImJvcmRlci1zcGFjaW5nIiwiaW5oZXJpdGVkIjp0cnVlfSx7ImxvbmdoYW5kcyI6WyJib3JkZXItdG9wLXN0eWxlIiwiYm9yZGVyLXJpZ2h0LXN0eWxlIiwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsImJvcmRlci1sZWZ0LXN0eWxlIl0sIm5hbWUiOiJib3JkZXItc3R5bGUifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItdG9wLXdpZHRoIiwiYm9yZGVyLXRvcC1zdHlsZSIsImJvcmRlci10b3AtY29sb3IiXSwibmFtZSI6ImJvcmRlci10b3AifSx7Im5hbWUiOiJib3JkZXItdG9wLWNvbG9yIn0seyJuYW1lIjoiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyJ9LHsibmFtZSI6ImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIn0seyJuYW1lIjoiYm9yZGVyLXRvcC1zdHlsZSJ9LHsibmFtZSI6ImJvcmRlci10b3Atd2lkdGgifSx7ImxvbmdoYW5kcyI6WyJib3JkZXItdG9wLXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIl0sIm5hbWUiOiJib3JkZXItd2lkdGgifSx7Im5hbWUiOiJib3R0b20ifSx7Im5hbWUiOiJib3gtc2hhZG93In0seyJuYW1lIjoiYm94LXNpemluZyJ9LHsibmFtZSI6ImJyZWFrLWFmdGVyIn0seyJuYW1lIjoiYnJlYWstYmVmb3JlIn0seyJuYW1lIjoiYnJlYWstaW5zaWRlIn0seyJzdmciOnRydWUsIm5hbWUiOiJidWZmZXJlZC1yZW5kZXJpbmcifSx7Im5hbWUiOiJjYXB0aW9uLXNpZGUiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImNhcmV0LWNvbG9yIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJjbGVhciJ9LHsibmFtZSI6ImNsaXAifSx7Im5hbWUiOiJjbGlwLXBhdGgifSx7Im5hbWUiOiJjbGlwLXJ1bGUiLCJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiY29sb3IiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImNvbG9yLWludGVycG9sYXRpb24iLCJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZX0seyJzdmciOnRydWUsIm5hbWUiOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImNvbG9yLXJlbmRlcmluZyIsInN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJjb2x1bW4tY291bnQifSx7Im5hbWUiOiJjb2x1bW4tZmlsbCJ9LHsibmFtZSI6ImNvbHVtbi1nYXAifSx7ImxvbmdoYW5kcyI6WyJjb2x1bW4tcnVsZS13aWR0aCIsImNvbHVtbi1ydWxlLXN0eWxlIiwiY29sdW1uLXJ1bGUtY29sb3IiXSwibmFtZSI6ImNvbHVtbi1ydWxlIn0seyJuYW1lIjoiY29sdW1uLXJ1bGUtY29sb3IifSx7Im5hbWUiOiJjb2x1bW4tcnVsZS1zdHlsZSJ9LHsibmFtZSI6ImNvbHVtbi1ydWxlLXdpZHRoIn0seyJuYW1lIjoiY29sdW1uLXNwYW4ifSx7Im5hbWUiOiJjb2x1bW4td2lkdGgifSx7ImxvbmdoYW5kcyI6WyJjb2x1bW4td2lkdGgiLCJjb2x1bW4tY291bnQiXSwibmFtZSI6ImNvbHVtbnMifSx7Im5hbWUiOiJjb250YWluIn0seyJuYW1lIjoiY29udGVudCJ9LHsibmFtZSI6ImNvdW50ZXItaW5jcmVtZW50In0seyJuYW1lIjoiY291bnRlci1yZXNldCJ9LHsibmFtZSI6ImN1cnNvciIsImluaGVyaXRlZCI6dHJ1ZX0seyJzdmciOnRydWUsIm5hbWUiOiJjeCJ9LHsic3ZnIjp0cnVlLCJuYW1lIjoiY3kifSx7Im5hbWUiOiJkIiwic3ZnIjp0cnVlfSx7Im5hbWUiOiJkaXJlY3Rpb24iLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImRpc3BsYXkifSx7Im5hbWUiOiJkb21pbmFudC1iYXNlbGluZSIsInN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJlbXB0eS1jZWxscyIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiZmlsbCIsInN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlfSx7InN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlLCJuYW1lIjoiZmlsbC1vcGFjaXR5In0seyJuYW1lIjoiZmlsbC1ydWxlIiwic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImZpbHRlciJ9LHsibG9uZ2hhbmRzIjpbImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIiwiZmxleC1iYXNpcyJdLCJuYW1lIjoiZmxleCJ9LHsibmFtZSI6ImZsZXgtYmFzaXMifSx7Im5hbWUiOiJmbGV4LWRpcmVjdGlvbiJ9LHsibG9uZ2hhbmRzIjpbImZsZXgtZGlyZWN0aW9uIiwiZmxleC13cmFwIl0sIm5hbWUiOiJmbGV4LWZsb3cifSx7Im5hbWUiOiJmbGV4LWdyb3cifSx7Im5hbWUiOiJmbGV4LXNocmluayJ9LHsibmFtZSI6ImZsZXgtd3JhcCJ9LHsibmFtZSI6ImZsb2F0In0seyJuYW1lIjoiZmxvb2QtY29sb3IiLCJzdmciOnRydWV9LHsibmFtZSI6ImZsb29kLW9wYWNpdHkiLCJzdmciOnRydWV9LHsibG9uZ2hhbmRzIjpbImZvbnQtc3R5bGUiLCJmb250LXZhcmlhbnQtbGlnYXR1cmVzIiwiZm9udC12YXJpYW50LWNhcHMiLCJmb250LXZhcmlhbnQtbnVtZXJpYyIsImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIiwiZm9udC13ZWlnaHQiLCJmb250LXN0cmV0Y2giLCJmb250LXNpemUiLCJsaW5lLWhlaWdodCIsImZvbnQtZmFtaWx5Il0sIm5hbWUiOiJmb250IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJmb250LWRpc3BsYXkifSx7Im5hbWUiOiJmb250LWZhbWlseSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJmb250LWtlcm5pbmciLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImZvbnQtc2l6ZSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiZm9udC1zaXplLWFkanVzdCIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiZm9udC1zdHJldGNoIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJmb250LXN0eWxlIiwiaW5oZXJpdGVkIjp0cnVlfSx7ImxvbmdoYW5kcyI6WyJmb250LXZhcmlhbnQtbGlnYXR1cmVzIiwiZm9udC12YXJpYW50LWNhcHMiLCJmb250LXZhcmlhbnQtbnVtZXJpYyIsImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIl0sIm5hbWUiOiJmb250LXZhcmlhbnQiLCJpbmhlcml0ZWQiOnRydWV9LHsiaW5oZXJpdGVkIjp0cnVlLCJuYW1lIjoiZm9udC12YXJpYW50LWNhcHMifSx7ImluaGVyaXRlZCI6dHJ1ZSwibmFtZSI6ImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIn0seyJuYW1lIjoiZm9udC12YXJpYW50LWxpZ2F0dXJlcyIsImluaGVyaXRlZCI6dHJ1ZX0seyJpbmhlcml0ZWQiOnRydWUsIm5hbWUiOiJmb250LXZhcmlhbnQtbnVtZXJpYyJ9LHsibmFtZSI6ImZvbnQtdmFyaWF0aW9uLXNldHRpbmdzIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJmb250LXdlaWdodCIsImluaGVyaXRlZCI6dHJ1ZX0seyJsb25naGFuZHMiOlsicm93LWdhcCIsImNvbHVtbi1nYXAiXSwibmFtZSI6ImdhcCJ9LHsibG9uZ2hhbmRzIjpbImdyaWQtdGVtcGxhdGUtcm93cyIsImdyaWQtdGVtcGxhdGUtY29sdW1ucyIsImdyaWQtdGVtcGxhdGUtYXJlYXMiLCJncmlkLWF1dG8tZmxvdyIsImdyaWQtYXV0by1yb3dzIiwiZ3JpZC1hdXRvLWNvbHVtbnMiXSwibmFtZSI6ImdyaWQifSx7ImxvbmdoYW5kcyI6WyJncmlkLXJvdy1zdGFydCIsImdyaWQtY29sdW1uLXN0YXJ0IiwiZ3JpZC1yb3ctZW5kIiwiZ3JpZC1jb2x1bW4tZW5kIl0sIm5hbWUiOiJncmlkLWFyZWEifSx7Im5hbWUiOiJncmlkLWF1dG8tY29sdW1ucyJ9LHsibmFtZSI6ImdyaWQtYXV0by1mbG93In0seyJuYW1lIjoiZ3JpZC1hdXRvLXJvd3MifSx7ImxvbmdoYW5kcyI6WyJncmlkLWNvbHVtbi1zdGFydCIsImdyaWQtY29sdW1uLWVuZCJdLCJuYW1lIjoiZ3JpZC1jb2x1bW4ifSx7Im5hbWUiOiJncmlkLWNvbHVtbi1lbmQifSx7ImxvbmdoYW5kcyI6WyJjb2x1bW4tZ2FwIl0sIm5hbWUiOiJncmlkLWNvbHVtbi1nYXAifSx7Im5hbWUiOiJncmlkLWNvbHVtbi1zdGFydCJ9LHsibG9uZ2hhbmRzIjpbInJvdy1nYXAiLCJjb2x1bW4tZ2FwIl0sIm5hbWUiOiJncmlkLWdhcCJ9LHsibG9uZ2hhbmRzIjpbImdyaWQtcm93LXN0YXJ0IiwiZ3JpZC1yb3ctZW5kIl0sIm5hbWUiOiJncmlkLXJvdyJ9LHsibmFtZSI6ImdyaWQtcm93LWVuZCJ9LHsibG9uZ2hhbmRzIjpbInJvdy1nYXAiXSwibmFtZSI6ImdyaWQtcm93LWdhcCJ9LHsibmFtZSI6ImdyaWQtcm93LXN0YXJ0In0seyJsb25naGFuZHMiOlsiZ3JpZC10ZW1wbGF0ZS1yb3dzIiwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIiwiZ3JpZC10ZW1wbGF0ZS1hcmVhcyJdLCJuYW1lIjoiZ3JpZC10ZW1wbGF0ZSJ9LHsibmFtZSI6ImdyaWQtdGVtcGxhdGUtYXJlYXMifSx7Im5hbWUiOiJncmlkLXRlbXBsYXRlLWNvbHVtbnMifSx7Im5hbWUiOiJncmlkLXRlbXBsYXRlLXJvd3MifSx7Im5hbWUiOiJoZWlnaHQifSx7Im5hbWUiOiJoeXBoZW5zIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJpbWFnZS1vcmllbnRhdGlvbiIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoiaW1hZ2UtcmVuZGVyaW5nIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJpbmxpbmUtc2l6ZSJ9LHsibG9uZ2hhbmRzIjpbInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLCJuYW1lIjoiaW5zZXQifSx7ImxvbmdoYW5kcyI6WyJpbnNldC1ibG9jay1zdGFydCIsImluc2V0LWJsb2NrLWVuZCJdLCJuYW1lIjoiaW5zZXQtYmxvY2sifSx7Im5hbWUiOiJpbnNldC1ibG9jay1lbmQifSx7Im5hbWUiOiJpbnNldC1ibG9jay1zdGFydCJ9LHsibG9uZ2hhbmRzIjpbImluc2V0LWlubGluZS1zdGFydCIsImluc2V0LWlubGluZS1lbmQiXSwibmFtZSI6Imluc2V0LWlubGluZSJ9LHsibmFtZSI6Imluc2V0LWlubGluZS1lbmQifSx7Im5hbWUiOiJpbnNldC1pbmxpbmUtc3RhcnQifSx7Im5hbWUiOiJpc29sYXRpb24ifSx7Im5hbWUiOiJqdXN0aWZ5LWNvbnRlbnQifSx7Im5hbWUiOiJqdXN0aWZ5LWl0ZW1zIn0seyJuYW1lIjoianVzdGlmeS1zZWxmIn0seyJuYW1lIjoibGVmdCJ9LHsiaW5oZXJpdGVkIjp0cnVlLCJuYW1lIjoibGV0dGVyLXNwYWNpbmcifSx7Im5hbWUiOiJsaWdodGluZy1jb2xvciIsInN2ZyI6dHJ1ZX0seyJuYW1lIjoibGluZS1icmVhayIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoibGluZS1oZWlnaHQiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6ImxpbmUtaGVpZ2h0LXN0ZXAiLCJpbmhlcml0ZWQiOnRydWV9LHsibG9uZ2hhbmRzIjpbImxpc3Qtc3R5bGUtdHlwZSIsImxpc3Qtc3R5bGUtcG9zaXRpb24iLCJsaXN0LXN0eWxlLWltYWdlIl0sIm5hbWUiOiJsaXN0LXN0eWxlIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJsaXN0LXN0eWxlLWltYWdlIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJsaXN0LXN0eWxlLXBvc2l0aW9uIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJsaXN0LXN0eWxlLXR5cGUiLCJpbmhlcml0ZWQiOnRydWV9LHsibG9uZ2hhbmRzIjpbIm1hcmdpbi10b3AiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiXSwibmFtZSI6Im1hcmdpbiJ9LHsibG9uZ2hhbmRzIjpbIm1hcmdpbi1ibG9jay1zdGFydCIsIm1hcmdpbi1ibG9jay1lbmQiXSwibmFtZSI6Im1hcmdpbi1ibG9jayJ9LHsibmFtZSI6Im1hcmdpbi1ibG9jay1lbmQifSx7Im5hbWUiOiJtYXJnaW4tYmxvY2stc3RhcnQifSx7Im5hbWUiOiJtYXJnaW4tYm90dG9tIn0seyJsb25naGFuZHMiOlsibWFyZ2luLWlubGluZS1zdGFydCIsIm1hcmdpbi1pbmxpbmUtZW5kIl0sIm5hbWUiOiJtYXJnaW4taW5saW5lIn0seyJuYW1lIjoibWFyZ2luLWlubGluZS1lbmQifSx7Im5hbWUiOiJtYXJnaW4taW5saW5lLXN0YXJ0In0seyJuYW1lIjoibWFyZ2luLWxlZnQifSx7Im5hbWUiOiJtYXJnaW4tcmlnaHQifSx7Im5hbWUiOiJtYXJnaW4tdG9wIn0seyJsb25naGFuZHMiOlsibWFya2VyLXN0YXJ0IiwibWFya2VyLW1pZCIsIm1hcmtlci1lbmQiXSwibmFtZSI6Im1hcmtlciIsImluaGVyaXRlZCI6dHJ1ZX0seyJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZSwibmFtZSI6Im1hcmtlci1lbmQifSx7InN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlLCJuYW1lIjoibWFya2VyLW1pZCJ9LHsic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWUsIm5hbWUiOiJtYXJrZXItc3RhcnQifSx7InN2ZyI6dHJ1ZSwibmFtZSI6Im1hc2sifSx7Im5hbWUiOiJtYXNrLXNvdXJjZS10eXBlIn0seyJzdmciOnRydWUsIm5hbWUiOiJtYXNrLXR5cGUifSx7Im5hbWUiOiJtYXgtYmxvY2stc2l6ZSJ9LHsibmFtZSI6Im1heC1oZWlnaHQifSx7Im5hbWUiOiJtYXgtaW5saW5lLXNpemUifSx7Im5hbWUiOiJtYXgtd2lkdGgifSx7Im5hbWUiOiJtYXgtem9vbSJ9LHsibmFtZSI6Im1pbi1ibG9jay1zaXplIn0seyJuYW1lIjoibWluLWhlaWdodCJ9LHsibmFtZSI6Im1pbi1pbmxpbmUtc2l6ZSJ9LHsibmFtZSI6Im1pbi13aWR0aCJ9LHsibmFtZSI6Im1pbi16b29tIn0seyJuYW1lIjoibWl4LWJsZW5kLW1vZGUifSx7Im5hbWUiOiJvYmplY3QtZml0In0seyJuYW1lIjoib2JqZWN0LXBvc2l0aW9uIn0seyJsb25naGFuZHMiOlsib2Zmc2V0LXBvc2l0aW9uIiwib2Zmc2V0LXBhdGgiLCJvZmZzZXQtZGlzdGFuY2UiLCJvZmZzZXQtcm90YXRlIiwib2Zmc2V0LWFuY2hvciJdLCJuYW1lIjoib2Zmc2V0In0seyJuYW1lIjoib2Zmc2V0LWFuY2hvciJ9LHsibmFtZSI6Im9mZnNldC1kaXN0YW5jZSJ9LHsibmFtZSI6Im9mZnNldC1wYXRoIn0seyJuYW1lIjoib2Zmc2V0LXBvc2l0aW9uIn0seyJuYW1lIjoib2Zmc2V0LXJvdGF0ZSJ9LHsibmFtZSI6Im9wYWNpdHkifSx7Im5hbWUiOiJvcmRlciJ9LHsibmFtZSI6Im9yaWVudGF0aW9uIn0seyJuYW1lIjoib3JwaGFucyIsImluaGVyaXRlZCI6dHJ1ZX0seyJsb25naGFuZHMiOlsib3V0bGluZS1jb2xvciIsIm91dGxpbmUtc3R5bGUiLCJvdXRsaW5lLXdpZHRoIl0sIm5hbWUiOiJvdXRsaW5lIn0seyJuYW1lIjoib3V0bGluZS1jb2xvciJ9LHsibmFtZSI6Im91dGxpbmUtb2Zmc2V0In0seyJuYW1lIjoib3V0bGluZS1zdHlsZSJ9LHsibmFtZSI6Im91dGxpbmUtd2lkdGgifSx7ImxvbmdoYW5kcyI6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLCJuYW1lIjoib3ZlcmZsb3cifSx7Im5hbWUiOiJvdmVyZmxvdy1hbmNob3IiLCJpbmhlcml0ZWQiOmZhbHNlfSx7Im5hbWUiOiJvdmVyZmxvdy13cmFwIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJvdmVyZmxvdy14In0seyJuYW1lIjoib3ZlcmZsb3cteSJ9LHsibG9uZ2hhbmRzIjpbIm92ZXJzY3JvbGwtYmVoYXZpb3IteCIsIm92ZXJzY3JvbGwtYmVoYXZpb3IteSJdLCJuYW1lIjoib3ZlcnNjcm9sbC1iZWhhdmlvciJ9LHsibmFtZSI6Im92ZXJzY3JvbGwtYmVoYXZpb3IteCJ9LHsibmFtZSI6Im92ZXJzY3JvbGwtYmVoYXZpb3IteSJ9LHsibG9uZ2hhbmRzIjpbInBhZGRpbmctdG9wIiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0Il0sIm5hbWUiOiJwYWRkaW5nIn0seyJsb25naGFuZHMiOlsicGFkZGluZy1ibG9jay1zdGFydCIsInBhZGRpbmctYmxvY2stZW5kIl0sIm5hbWUiOiJwYWRkaW5nLWJsb2NrIn0seyJuYW1lIjoicGFkZGluZy1ibG9jay1lbmQifSx7Im5hbWUiOiJwYWRkaW5nLWJsb2NrLXN0YXJ0In0seyJuYW1lIjoicGFkZGluZy1ib3R0b20ifSx7ImxvbmdoYW5kcyI6WyJwYWRkaW5nLWlubGluZS1zdGFydCIsInBhZGRpbmctaW5saW5lLWVuZCJdLCJuYW1lIjoicGFkZGluZy1pbmxpbmUifSx7Im5hbWUiOiJwYWRkaW5nLWlubGluZS1lbmQifSx7Im5hbWUiOiJwYWRkaW5nLWlubGluZS1zdGFydCJ9LHsibmFtZSI6InBhZGRpbmctbGVmdCJ9LHsibmFtZSI6InBhZGRpbmctcmlnaHQifSx7Im5hbWUiOiJwYWRkaW5nLXRvcCJ9LHsibmFtZSI6InBhZ2UifSx7ImxvbmdoYW5kcyI6WyJicmVhay1hZnRlciJdLCJuYW1lIjoicGFnZS1icmVhay1hZnRlciJ9LHsibG9uZ2hhbmRzIjpbImJyZWFrLWJlZm9yZSJdLCJuYW1lIjoicGFnZS1icmVhay1iZWZvcmUifSx7ImxvbmdoYW5kcyI6WyJicmVhay1pbnNpZGUiXSwibmFtZSI6InBhZ2UtYnJlYWstaW5zaWRlIn0seyJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZSwibmFtZSI6InBhaW50LW9yZGVyIn0seyJuYW1lIjoicGVyc3BlY3RpdmUifSx7Im5hbWUiOiJwZXJzcGVjdGl2ZS1vcmlnaW4ifSx7ImxvbmdoYW5kcyI6WyJhbGlnbi1jb250ZW50IiwianVzdGlmeS1jb250ZW50Il0sIm5hbWUiOiJwbGFjZS1jb250ZW50In0seyJsb25naGFuZHMiOlsiYWxpZ24taXRlbXMiLCJqdXN0aWZ5LWl0ZW1zIl0sIm5hbWUiOiJwbGFjZS1pdGVtcyJ9LHsibG9uZ2hhbmRzIjpbImFsaWduLXNlbGYiLCJqdXN0aWZ5LXNlbGYiXSwibmFtZSI6InBsYWNlLXNlbGYifSx7Im5hbWUiOiJwb2ludGVyLWV2ZW50cyIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoicG9zaXRpb24ifSx7Im5hbWUiOiJxdW90ZXMiLCJpbmhlcml0ZWQiOnRydWV9LHsic3ZnIjp0cnVlLCJuYW1lIjoiciJ9LHsibmFtZSI6InJlc2l6ZSJ9LHsibmFtZSI6InJpZ2h0In0seyJuYW1lIjoicm90YXRlIn0seyJuYW1lIjoicm93LWdhcCJ9LHsibmFtZSI6InJ4Iiwic3ZnIjp0cnVlfSx7Im5hbWUiOiJyeSIsInN2ZyI6dHJ1ZX0seyJuYW1lIjoic2NhbGUifSx7Im5hbWUiOiJzY3JvbGwtYmVoYXZpb3IifSx7Im5hbWUiOiJzY3JvbGwtY3VzdG9taXphdGlvbiJ9LHsibG9uZ2hhbmRzIjpbInNjcm9sbC1tYXJnaW4tdG9wIiwic2Nyb2xsLW1hcmdpbi1yaWdodCIsInNjcm9sbC1tYXJnaW4tYm90dG9tIiwic2Nyb2xsLW1hcmdpbi1sZWZ0Il0sIm5hbWUiOiJzY3JvbGwtbWFyZ2luIn0seyJsb25naGFuZHMiOlsic2Nyb2xsLW1hcmdpbi1ibG9jay1zdGFydCIsInNjcm9sbC1tYXJnaW4tYmxvY2stZW5kIl0sIm5hbWUiOiJzY3JvbGwtbWFyZ2luLWJsb2NrIn0seyJuYW1lIjoic2Nyb2xsLW1hcmdpbi1ibG9jay1lbmQifSx7Im5hbWUiOiJzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0In0seyJuYW1lIjoic2Nyb2xsLW1hcmdpbi1ib3R0b20ifSx7ImxvbmdoYW5kcyI6WyJzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCIsInNjcm9sbC1tYXJnaW4taW5saW5lLWVuZCJdLCJuYW1lIjoic2Nyb2xsLW1hcmdpbi1pbmxpbmUifSx7Im5hbWUiOiJzY3JvbGwtbWFyZ2luLWlubGluZS1lbmQifSx7Im5hbWUiOiJzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCJ9LHsibmFtZSI6InNjcm9sbC1tYXJnaW4tbGVmdCJ9LHsibmFtZSI6InNjcm9sbC1tYXJnaW4tcmlnaHQifSx7Im5hbWUiOiJzY3JvbGwtbWFyZ2luLXRvcCJ9LHsibG9uZ2hhbmRzIjpbInNjcm9sbC1wYWRkaW5nLXRvcCIsInNjcm9sbC1wYWRkaW5nLXJpZ2h0Iiwic2Nyb2xsLXBhZGRpbmctYm90dG9tIiwic2Nyb2xsLXBhZGRpbmctbGVmdCJdLCJuYW1lIjoic2Nyb2xsLXBhZGRpbmcifSx7ImxvbmdoYW5kcyI6WyJzY3JvbGwtcGFkZGluZy1ibG9jay1zdGFydCIsInNjcm9sbC1wYWRkaW5nLWJsb2NrLWVuZCJdLCJuYW1lIjoic2Nyb2xsLXBhZGRpbmctYmxvY2sifSx7Im5hbWUiOiJzY3JvbGwtcGFkZGluZy1ibG9jay1lbmQifSx7Im5hbWUiOiJzY3JvbGwtcGFkZGluZy1ibG9jay1zdGFydCJ9LHsibmFtZSI6InNjcm9sbC1wYWRkaW5nLWJvdHRvbSJ9LHsibG9uZ2hhbmRzIjpbInNjcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydCIsInNjcm9sbC1wYWRkaW5nLWlubGluZS1lbmQiXSwibmFtZSI6InNjcm9sbC1wYWRkaW5nLWlubGluZSJ9LHsibmFtZSI6InNjcm9sbC1wYWRkaW5nLWlubGluZS1lbmQifSx7Im5hbWUiOiJzY3JvbGwtcGFkZGluZy1pbmxpbmUtc3RhcnQifSx7Im5hbWUiOiJzY3JvbGwtcGFkZGluZy1sZWZ0In0seyJuYW1lIjoic2Nyb2xsLXBhZGRpbmctcmlnaHQifSx7Im5hbWUiOiJzY3JvbGwtcGFkZGluZy10b3AifSx7Im5hbWUiOiJzY3JvbGwtc25hcC1hbGlnbiJ9LHsibmFtZSI6InNjcm9sbC1zbmFwLXN0b3AifSx7Im5hbWUiOiJzY3JvbGwtc25hcC10eXBlIn0seyJuYW1lIjoic2hhcGUtaW1hZ2UtdGhyZXNob2xkIn0seyJuYW1lIjoic2hhcGUtbWFyZ2luIn0seyJuYW1lIjoic2hhcGUtb3V0c2lkZSJ9LHsibmFtZSI6InNoYXBlLXJlbmRlcmluZyIsInN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJzaXplIn0seyJuYW1lIjoic3BlYWsiLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6InNyYyJ9LHsibmFtZSI6InN0b3AtY29sb3IiLCJzdmciOnRydWV9LHsibmFtZSI6InN0b3Atb3BhY2l0eSIsInN2ZyI6dHJ1ZX0seyJuYW1lIjoic3Ryb2tlIiwic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6InN0cm9rZS1kYXNoYXJyYXkiLCJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoic3Ryb2tlLWxpbmVjYXAiLCJzdmciOnRydWUsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoic3Ryb2tlLWxpbmVqb2luIiwic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6InN0cm9rZS1taXRlcmxpbWl0Iiwic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWV9LHsic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWUsIm5hbWUiOiJzdHJva2Utb3BhY2l0eSJ9LHsic3ZnIjp0cnVlLCJpbmhlcml0ZWQiOnRydWUsIm5hbWUiOiJzdHJva2Utd2lkdGgifSx7Im5hbWUiOiJ0YWItc2l6ZSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoidGFibGUtbGF5b3V0In0seyJuYW1lIjoidGV4dC1hbGlnbiIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoidGV4dC1hbGlnbi1sYXN0IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LWFuY2hvciIsInN2ZyI6dHJ1ZSwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LWNvbWJpbmUtdXByaWdodCIsImluaGVyaXRlZCI6dHJ1ZX0seyJsb25naGFuZHMiOlsidGV4dC1kZWNvcmF0aW9uLWxpbmUiLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSwibmFtZSI6InRleHQtZGVjb3JhdGlvbiJ9LHsibmFtZSI6InRleHQtZGVjb3JhdGlvbi1jb2xvciJ9LHsibmFtZSI6InRleHQtZGVjb3JhdGlvbi1saW5lIn0seyJuYW1lIjoidGV4dC1kZWNvcmF0aW9uLXNraXAtaW5rIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LWRlY29yYXRpb24tc3R5bGUifSx7Im5hbWUiOiJ0ZXh0LWluZGVudCIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoidGV4dC1qdXN0aWZ5IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LW9yaWVudGF0aW9uIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LW92ZXJmbG93In0seyJuYW1lIjoidGV4dC1yZW5kZXJpbmciLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6InRleHQtc2hhZG93IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LXNpemUtYWRqdXN0IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ0ZXh0LXRyYW5zZm9ybSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoidGV4dC11bmRlcmxpbmUtcG9zaXRpb24iLCJpbmhlcml0ZWQiOnRydWV9LHsibmFtZSI6InRvcCJ9LHsibmFtZSI6InRvdWNoLWFjdGlvbiJ9LHsibmFtZSI6InRyYW5zZm9ybSJ9LHsibmFtZSI6InRyYW5zZm9ybS1ib3gifSx7Im5hbWUiOiJ0cmFuc2Zvcm0tb3JpZ2luIn0seyJuYW1lIjoidHJhbnNmb3JtLXN0eWxlIn0seyJsb25naGFuZHMiOlsidHJhbnNpdGlvbi1wcm9wZXJ0eSIsInRyYW5zaXRpb24tZHVyYXRpb24iLCJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiIsInRyYW5zaXRpb24tZGVsYXkiXSwibmFtZSI6InRyYW5zaXRpb24ifSx7Im5hbWUiOiJ0cmFuc2l0aW9uLWRlbGF5In0seyJuYW1lIjoidHJhbnNpdGlvbi1kdXJhdGlvbiJ9LHsibmFtZSI6InRyYW5zaXRpb24tcHJvcGVydHkifSx7Im5hbWUiOiJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiJ9LHsibmFtZSI6InRyYW5zbGF0ZSJ9LHsibmFtZSI6InVuaWNvZGUtYmlkaSJ9LHsibmFtZSI6InVuaWNvZGUtcmFuZ2UifSx7Im5hbWUiOiJ1c2VyLXNlbGVjdCIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoidXNlci16b29tIn0seyJzdmciOnRydWUsIm5hbWUiOiJ2ZWN0b3ItZWZmZWN0In0seyJuYW1lIjoidmVydGljYWwtYWxpZ24ifSx7Im5hbWUiOiJ2aWV3cG9ydC1maXQifSx7Im5hbWUiOiJ2aXNpYmlsaXR5IiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ3aGl0ZS1zcGFjZSIsImluaGVyaXRlZCI6dHJ1ZX0seyJuYW1lIjoid2lkb3dzIiwiaW5oZXJpdGVkIjp0cnVlfSx7Im5hbWUiOiJ3aWR0aCJ9LHsibmFtZSI6IndpbGwtY2hhbmdlIn0seyJuYW1lIjoid29yZC1icmVhayIsImluaGVyaXRlZCI6dHJ1ZX0seyJpbmhlcml0ZWQiOnRydWUsIm5hbWUiOiJ3b3JkLXNwYWNpbmcifSx7Im5hbWUiOiJ3cml0aW5nLW1vZGUiLCJpbmhlcml0ZWQiOnRydWV9LHsic3ZnIjp0cnVlLCJuYW1lIjoieCJ9LHsic3ZnIjp0cnVlLCJuYW1lIjoieSJ9LHsibmFtZSI6InotaW5kZXgifSx7Im5hbWUiOiJ6b29tIn1dOztTREsuRmlsbVN0cmlwTW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IodHJhY2luZ01vZGVsLHplcm9UaW1lKXt0aGlzLnJlc2V0KHRyYWNpbmdNb2RlbCx6ZXJvVGltZSk7fQpyZXNldCh0cmFjaW5nTW9kZWwsemVyb1RpbWUpe3RoaXMuX3plcm9UaW1lPXplcm9UaW1lfHx0cmFjaW5nTW9kZWwubWluaW11bVJlY29yZFRpbWUoKTt0aGlzLl9zcGFuVGltZT10cmFjaW5nTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKS10aGlzLl96ZXJvVGltZTt0aGlzLl9mcmFtZXM9W107Y29uc3QgYnJvd3Nlck1haW49U0RLLlRyYWNpbmdNb2RlbC5icm93c2VyTWFpblRocmVhZCh0cmFjaW5nTW9kZWwpO2lmKCFicm93c2VyTWFpbikKcmV0dXJuO2NvbnN0IGV2ZW50cz1icm93c2VyTWFpbi5ldmVudHMoKTtmb3IobGV0IGk9MDtpPGV2ZW50cy5sZW5ndGg7KytpKXtjb25zdCBldmVudD1ldmVudHNbaV07aWYoZXZlbnQuc3RhcnRUaW1lPHRoaXMuX3plcm9UaW1lKQpjb250aW51ZTtpZighZXZlbnQuaGFzQ2F0ZWdvcnkoU0RLLkZpbG1TdHJpcE1vZGVsLl9jYXRlZ29yeSkpCmNvbnRpbnVlO2lmKGV2ZW50Lm5hbWU9PT1TREsuRmlsbVN0cmlwTW9kZWwuVHJhY2VFdmVudHMuQ2FwdHVyZUZyYW1lKXtjb25zdCBkYXRhPWV2ZW50LmFyZ3NbJ2RhdGEnXTtpZihkYXRhKQp0aGlzLl9mcmFtZXMucHVzaChTREsuRmlsbVN0cmlwTW9kZWwuRnJhbWUuX2Zyb21FdmVudCh0aGlzLGV2ZW50LHRoaXMuX2ZyYW1lcy5sZW5ndGgpKTt9ZWxzZSBpZihldmVudC5uYW1lPT09U0RLLkZpbG1TdHJpcE1vZGVsLlRyYWNlRXZlbnRzLlNjcmVlbnNob3Qpe3RoaXMuX2ZyYW1lcy5wdXNoKFNESy5GaWxtU3RyaXBNb2RlbC5GcmFtZS5fZnJvbVNuYXBzaG90KHRoaXMsKGV2ZW50KSx0aGlzLl9mcmFtZXMubGVuZ3RoKSk7fX19CmZyYW1lcygpe3JldHVybiB0aGlzLl9mcmFtZXM7fQp6ZXJvVGltZSgpe3JldHVybiB0aGlzLl96ZXJvVGltZTt9CnNwYW5UaW1lKCl7cmV0dXJuIHRoaXMuX3NwYW5UaW1lO30KZnJhbWVCeVRpbWVzdGFtcCh0aW1lc3RhbXApe2NvbnN0IGluZGV4PXRoaXMuX2ZyYW1lcy51cHBlckJvdW5kKHRpbWVzdGFtcCwodGltZXN0YW1wLGZyYW1lKT0+dGltZXN0YW1wLWZyYW1lLnRpbWVzdGFtcCktMTtyZXR1cm4gaW5kZXg+PTA/dGhpcy5fZnJhbWVzW2luZGV4XTpudWxsO319O1NESy5GaWxtU3RyaXBNb2RlbC5fY2F0ZWdvcnk9J2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMuc2NyZWVuc2hvdCc7U0RLLkZpbG1TdHJpcE1vZGVsLlRyYWNlRXZlbnRzPXtDYXB0dXJlRnJhbWU6J0NhcHR1cmVGcmFtZScsU2NyZWVuc2hvdDonU2NyZWVuc2hvdCd9O1NESy5GaWxtU3RyaXBNb2RlbC5GcmFtZT1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCx0aW1lc3RhbXAsaW5kZXgpe3RoaXMuX21vZGVsPW1vZGVsO3RoaXMudGltZXN0YW1wPXRpbWVzdGFtcDt0aGlzLmluZGV4PWluZGV4O3RoaXMuX2ltYWdlRGF0YT1udWxsO3RoaXMuX3NuYXBzaG90PW51bGw7fQpzdGF0aWMgX2Zyb21FdmVudChtb2RlbCxldmVudCxpbmRleCl7Y29uc3QgZnJhbWU9bmV3IFNESy5GaWxtU3RyaXBNb2RlbC5GcmFtZShtb2RlbCxldmVudC5zdGFydFRpbWUsaW5kZXgpO2ZyYW1lLl9pbWFnZURhdGE9ZXZlbnQuYXJnc1snZGF0YSddO3JldHVybiBmcmFtZTt9CnN0YXRpYyBfZnJvbVNuYXBzaG90KG1vZGVsLHNuYXBzaG90LGluZGV4KXtjb25zdCBmcmFtZT1uZXcgU0RLLkZpbG1TdHJpcE1vZGVsLkZyYW1lKG1vZGVsLHNuYXBzaG90LnN0YXJ0VGltZSxpbmRleCk7ZnJhbWUuX3NuYXBzaG90PXNuYXBzaG90O3JldHVybiBmcmFtZTt9Cm1vZGVsKCl7cmV0dXJuIHRoaXMuX21vZGVsO30KaW1hZ2VEYXRhUHJvbWlzZSgpe2lmKHRoaXMuX2ltYWdlRGF0YXx8IXRoaXMuX3NuYXBzaG90KQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2ltYWdlRGF0YSk7cmV0dXJuKHRoaXMuX3NuYXBzaG90Lm9iamVjdFByb21pc2UoKSk7fX07O1NESy5Db25zb2xlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9tZXNzYWdlcz1bXTt0aGlzLl9tZXNzYWdlQnlFeGNlcHRpb25JZD1uZXcgTWFwKCk7dGhpcy5fd2FybmluZ3M9MDt0aGlzLl9lcnJvcnM9MDt0aGlzLl9wYWdlTG9hZFNlcXVlbmNlTnVtYmVyPTA7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZVRhcmdldHModGhpcyk7fQp0YXJnZXRBZGRlZCh0YXJnZXQpe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKCFyZXNvdXJjZVRyZWVNb2RlbHx8cmVzb3VyY2VUcmVlTW9kZWwuY2FjaGVkUmVzb3VyY2VzTG9hZGVkKCkpe3RoaXMuX2luaXRUYXJnZXQodGFyZ2V0KTtyZXR1cm47fQpjb25zdCBldmVudExpc3RlbmVyPXJlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5DYWNoZWRSZXNvdXJjZXNMb2FkZWQsKCk9PntDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoW2V2ZW50TGlzdGVuZXJdKTt0aGlzLl9pbml0VGFyZ2V0KHRhcmdldCk7fSk7fQpfaW5pdFRhcmdldCh0YXJnZXQpe2NvbnN0IGV2ZW50TGlzdGVuZXJzPVtdO2NvbnN0IGNwdVByb2ZpbGVyTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5DUFVQcm9maWxlck1vZGVsKTtpZihjcHVQcm9maWxlck1vZGVsKXtldmVudExpc3RlbmVycy5wdXNoKGNwdVByb2ZpbGVyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ1BVUHJvZmlsZXJNb2RlbC5FdmVudHMuQ29uc29sZVByb2ZpbGVTdGFydGVkLHRoaXMuX2NvbnNvbGVQcm9maWxlU3RhcnRlZC5iaW5kKHRoaXMsY3B1UHJvZmlsZXJNb2RlbCkpKTtldmVudExpc3RlbmVycy5wdXNoKGNwdVByb2ZpbGVyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ1BVUHJvZmlsZXJNb2RlbC5FdmVudHMuQ29uc29sZVByb2ZpbGVGaW5pc2hlZCx0aGlzLl9jb25zb2xlUHJvZmlsZUZpbmlzaGVkLmJpbmQodGhpcyxjcHVQcm9maWxlck1vZGVsKSkpO30KY29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7aWYocmVzb3VyY2VUcmVlTW9kZWwmJiF0YXJnZXQucGFyZW50VGFyZ2V0KCkpe2V2ZW50TGlzdGVuZXJzLnB1c2gocmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLk1haW5GcmFtZU5hdmlnYXRlZCx0aGlzLl9tYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcykpO30KY29uc3QgcnVudGltZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUnVudGltZU1vZGVsKTtpZihydW50aW1lTW9kZWwpe2V2ZW50TGlzdGVuZXJzLnB1c2gocnVudGltZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhjZXB0aW9uVGhyb3duLHRoaXMuX2V4Y2VwdGlvblRocm93bi5iaW5kKHRoaXMscnVudGltZU1vZGVsKSkpO2V2ZW50TGlzdGVuZXJzLnB1c2gocnVudGltZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhjZXB0aW9uUmV2b2tlZCx0aGlzLl9leGNlcHRpb25SZXZva2VkLmJpbmQodGhpcyxydW50aW1lTW9kZWwpKSk7ZXZlbnRMaXN0ZW5lcnMucHVzaChydW50aW1lTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUnVudGltZU1vZGVsLkV2ZW50cy5Db25zb2xlQVBJQ2FsbGVkLHRoaXMuX2NvbnNvbGVBUElDYWxsZWQuYmluZCh0aGlzLHJ1bnRpbWVNb2RlbCkpKTtpZighdGFyZ2V0LnBhcmVudFRhcmdldCgpKXtldmVudExpc3RlbmVycy5wdXNoKHJ1bnRpbWVNb2RlbC5kZWJ1Z2dlck1vZGVsKCkuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuR2xvYmFsT2JqZWN0Q2xlYXJlZCx0aGlzLl9jbGVhcklmTmVjZXNzYXJ5LHRoaXMpKTt9CmV2ZW50TGlzdGVuZXJzLnB1c2gocnVudGltZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuUXVlcnlPYmplY3RSZXF1ZXN0ZWQsdGhpcy5fcXVlcnlPYmplY3RSZXF1ZXN0ZWQuYmluZCh0aGlzLHJ1bnRpbWVNb2RlbCkpKTt9CnRhcmdldFtTREsuQ29uc29sZU1vZGVsLl9ldmVudHNdPWV2ZW50TGlzdGVuZXJzO30KdGFyZ2V0UmVtb3ZlZCh0YXJnZXQpe2NvbnN0IHJ1bnRpbWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJ1bnRpbWVNb2RlbCk7aWYocnVudGltZU1vZGVsKQp0aGlzLl9tZXNzYWdlQnlFeGNlcHRpb25JZC5kZWxldGUocnVudGltZU1vZGVsKTtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGFyZ2V0W1NESy5Db25zb2xlTW9kZWwuX2V2ZW50c118fFtdKTt9CmFzeW5jIGV2YWx1YXRlQ29tbWFuZEluQ29uc29sZShleGVjdXRpb25Db250ZXh0LG9yaWdpbmF0aW5nTWVzc2FnZSxleHByZXNzaW9uLHVzZUNvbW1hbmRMaW5lQVBJLGF3YWl0UHJvbWlzZSl7Y29uc3QgcmVzdWx0PWF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoe2V4cHJlc3Npb246ZXhwcmVzc2lvbixvYmplY3RHcm91cDonY29uc29sZScsaW5jbHVkZUNvbW1hbmRMaW5lQVBJOnVzZUNvbW1hbmRMaW5lQVBJLHNpbGVudDpmYWxzZSxyZXR1cm5CeVZhbHVlOmZhbHNlLGdlbmVyYXRlUHJldmlldzp0cnVlfSx0cnVlLGF3YWl0UHJvbWlzZSk7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5Db25zb2xlRXZhbHVhdGVkKTtpZihyZXN1bHQuZXJyb3IpCnJldHVybjthd2FpdCBDb21tb24uY29uc29sZS5zaG93UHJvbWlzZSgpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLkNvbW1hbmRFdmFsdWF0ZWQse3Jlc3VsdDpyZXN1bHQub2JqZWN0LGNvbW1hbmRNZXNzYWdlOm9yaWdpbmF0aW5nTWVzc2FnZSxleGNlcHRpb25EZXRhaWxzOnJlc3VsdC5leGNlcHRpb25EZXRhaWxzfSk7fQphZGRDb21tYW5kTWVzc2FnZShleGVjdXRpb25Db250ZXh0LHRleHQpe2NvbnN0IGNvbW1hbmRNZXNzYWdlPW5ldyBTREsuQ29uc29sZU1lc3NhZ2UoZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWwsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuSlMsbnVsbCx0ZXh0LFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5Db21tYW5kKTtjb21tYW5kTWVzc2FnZS5zZXRFeGVjdXRpb25Db250ZXh0SWQoZXhlY3V0aW9uQ29udGV4dC5pZCk7dGhpcy5hZGRNZXNzYWdlKGNvbW1hbmRNZXNzYWdlKTtyZXR1cm4gY29tbWFuZE1lc3NhZ2U7fQphZGRNZXNzYWdlKG1zZyl7aWYobXNnLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLldvcmtlciYmU0RLLnRhcmdldE1hbmFnZXIudGFyZ2V0QnlJZChtc2cud29ya2VySWQpKQpyZXR1cm47bXNnLl9wYWdlTG9hZFNlcXVlbmNlTnVtYmVyPXRoaXMuX3BhZ2VMb2FkU2VxdWVuY2VOdW1iZXI7aWYobXNnLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkNvbnNvbGVBUEkmJm1zZy50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkNsZWFyKQp0aGlzLl9jbGVhcklmTmVjZXNzYXJ5KCk7dGhpcy5fbWVzc2FnZXMucHVzaChtc2cpO2NvbnN0IHJ1bnRpbWVNb2RlbD1tc2cucnVudGltZU1vZGVsKCk7aWYobXNnLl9leGNlcHRpb25JZCYmcnVudGltZU1vZGVsKXtsZXQgbW9kZWxNYXA9dGhpcy5fbWVzc2FnZUJ5RXhjZXB0aW9uSWQuZ2V0KHJ1bnRpbWVNb2RlbCk7aWYoIW1vZGVsTWFwKXttb2RlbE1hcD1uZXcgTWFwKCk7dGhpcy5fbWVzc2FnZUJ5RXhjZXB0aW9uSWQuc2V0KHJ1bnRpbWVNb2RlbCxtb2RlbE1hcCk7fQptb2RlbE1hcC5zZXQobXNnLl9leGNlcHRpb25JZCxtc2cpO30KdGhpcy5faW5jcmVtZW50RXJyb3JXYXJuaW5nQ291bnQobXNnKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5NZXNzYWdlQWRkZWQsbXNnKTt9Cl9leGNlcHRpb25UaHJvd24ocnVudGltZU1vZGVsLGV2ZW50KXtjb25zdCBleGNlcHRpb25XaXRoVGltZXN0YW1wPShldmVudC5kYXRhKTtjb25zdCBjb25zb2xlTWVzc2FnZT1TREsuQ29uc29sZU1lc3NhZ2UuZnJvbUV4Y2VwdGlvbihydW50aW1lTW9kZWwsZXhjZXB0aW9uV2l0aFRpbWVzdGFtcC5kZXRhaWxzLHVuZGVmaW5lZCxleGNlcHRpb25XaXRoVGltZXN0YW1wLnRpbWVzdGFtcCx1bmRlZmluZWQpO2NvbnNvbGVNZXNzYWdlLnNldEV4Y2VwdGlvbklkKGV4Y2VwdGlvbldpdGhUaW1lc3RhbXAuZGV0YWlscy5leGNlcHRpb25JZCk7dGhpcy5hZGRNZXNzYWdlKGNvbnNvbGVNZXNzYWdlKTt9Cl9leGNlcHRpb25SZXZva2VkKHJ1bnRpbWVNb2RlbCxldmVudCl7Y29uc3QgZXhjZXB0aW9uSWQ9KGV2ZW50LmRhdGEpO2NvbnN0IG1vZGVsTWFwPXRoaXMuX21lc3NhZ2VCeUV4Y2VwdGlvbklkLmdldChydW50aW1lTW9kZWwpO2NvbnN0IGV4Y2VwdGlvbk1lc3NhZ2U9bW9kZWxNYXA/bW9kZWxNYXAuZ2V0KGV4Y2VwdGlvbklkKTpudWxsO2lmKCFleGNlcHRpb25NZXNzYWdlKQpyZXR1cm47dGhpcy5fZXJyb3JzLS07ZXhjZXB0aW9uTWVzc2FnZS5sZXZlbD1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkluZm87dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZVVwZGF0ZWQsZXhjZXB0aW9uTWVzc2FnZSk7fQpfY29uc29sZUFQSUNhbGxlZChydW50aW1lTW9kZWwsZXZlbnQpe2NvbnN0IGNhbGw9KGV2ZW50LmRhdGEpO2xldCBsZXZlbD1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkluZm87aWYoY2FsbC50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkRlYnVnKQpsZXZlbD1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLlZlcmJvc2U7ZWxzZSBpZihjYWxsLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuRXJyb3J8fGNhbGwudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5Bc3NlcnQpCmxldmVsPVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3I7ZWxzZSBpZihjYWxsLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuV2FybmluZykKbGV2ZWw9U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nO2Vsc2UgaWYoY2FsbC50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkluZm98fGNhbGwudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5Mb2cpCmxldmVsPVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuSW5mbztsZXQgbWVzc2FnZT0nJztpZihjYWxsLmFyZ3MubGVuZ3RoJiZjYWxsLmFyZ3NbMF0udW5zZXJpYWxpemFibGVWYWx1ZSkKbWVzc2FnZT1jYWxsLmFyZ3NbMF0udW5zZXJpYWxpemFibGVWYWx1ZTtlbHNlIGlmKGNhbGwuYXJncy5sZW5ndGgmJih0eXBlb2YgY2FsbC5hcmdzWzBdLnZhbHVlIT09J29iamVjdCd8fGNhbGwuYXJnc1swXS52YWx1ZT09PW51bGwpKQptZXNzYWdlPWNhbGwuYXJnc1swXS52YWx1ZSsnJztlbHNlIGlmKGNhbGwuYXJncy5sZW5ndGgmJmNhbGwuYXJnc1swXS5kZXNjcmlwdGlvbikKbWVzc2FnZT1jYWxsLmFyZ3NbMF0uZGVzY3JpcHRpb247Y29uc3QgY2FsbEZyYW1lPWNhbGwuc3RhY2tUcmFjZSYmY2FsbC5zdGFja1RyYWNlLmNhbGxGcmFtZXMubGVuZ3RoP2NhbGwuc3RhY2tUcmFjZS5jYWxsRnJhbWVzWzBdOm51bGw7Y29uc3QgY29uc29sZU1lc3NhZ2U9bmV3IFNESy5Db25zb2xlTWVzc2FnZShydW50aW1lTW9kZWwsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuQ29uc29sZUFQSSxsZXZlbCwobWVzc2FnZSksY2FsbC50eXBlLGNhbGxGcmFtZT9jYWxsRnJhbWUudXJsOnVuZGVmaW5lZCxjYWxsRnJhbWU/Y2FsbEZyYW1lLmxpbmVOdW1iZXI6dW5kZWZpbmVkLGNhbGxGcmFtZT9jYWxsRnJhbWUuY29sdW1uTnVtYmVyOnVuZGVmaW5lZCxjYWxsLmFyZ3MsY2FsbC5zdGFja1RyYWNlLGNhbGwudGltZXN0YW1wLGNhbGwuZXhlY3V0aW9uQ29udGV4dElkLHVuZGVmaW5lZCx1bmRlZmluZWQsY2FsbC5jb250ZXh0KTt0aGlzLmFkZE1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO30KX3F1ZXJ5T2JqZWN0UmVxdWVzdGVkKHJ1bnRpbWVNb2RlbCxldmVudCl7Y29uc3QgY29uc29sZU1lc3NhZ2U9bmV3IFNESy5Db25zb2xlTWVzc2FnZShydW50aW1lTW9kZWwsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuQ29uc29sZUFQSSxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkluZm8sJycsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlF1ZXJ5T2JqZWN0UmVzdWx0LHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLFtldmVudC5kYXRhLm9iamVjdHNdKTt0aGlzLmFkZE1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO30KX2NsZWFySWZOZWNlc3NhcnkoKXtpZighQ29tbW9uLm1vZHVsZVNldHRpbmcoJ3ByZXNlcnZlQ29uc29sZUxvZycpLmdldCgpKQp0aGlzLl9jbGVhcigpOysrdGhpcy5fcGFnZUxvYWRTZXF1ZW5jZU51bWJlcjt9Cl9tYWluRnJhbWVOYXZpZ2F0ZWQoZXZlbnQpe2lmKENvbW1vbi5tb2R1bGVTZXR0aW5nKCdwcmVzZXJ2ZUNvbnNvbGVMb2cnKS5nZXQoKSkKQ29tbW9uLmNvbnNvbGUubG9nKENvbW1vbi5VSVN0cmluZygnTmF2aWdhdGVkIHRvICVzJyxldmVudC5kYXRhLnVybCkpO30KX2NvbnNvbGVQcm9maWxlU3RhcnRlZChjcHVQcm9maWxlck1vZGVsLGV2ZW50KXtjb25zdCBkYXRhPShldmVudC5kYXRhKTt0aGlzLl9hZGRDb25zb2xlUHJvZmlsZU1lc3NhZ2UoY3B1UHJvZmlsZXJNb2RlbCxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuUHJvZmlsZSxkYXRhLnNjcmlwdExvY2F0aW9uLENvbW1vbi5VSVN0cmluZygnUHJvZmlsZSBcJyVzXCcgc3RhcnRlZC4nLGRhdGEudGl0bGUpKTt9Cl9jb25zb2xlUHJvZmlsZUZpbmlzaGVkKGNwdVByb2ZpbGVyTW9kZWwsZXZlbnQpe2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO3RoaXMuX2FkZENvbnNvbGVQcm9maWxlTWVzc2FnZShjcHVQcm9maWxlck1vZGVsLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5Qcm9maWxlRW5kLGRhdGEuc2NyaXB0TG9jYXRpb24sQ29tbW9uLlVJU3RyaW5nKCdQcm9maWxlIFwnJXNcJyBmaW5pc2hlZC4nLGRhdGEudGl0bGUpKTt9Cl9hZGRDb25zb2xlUHJvZmlsZU1lc3NhZ2UoY3B1UHJvZmlsZXJNb2RlbCx0eXBlLHNjcmlwdExvY2F0aW9uLG1lc3NhZ2VUZXh0KXtjb25zdCBzdGFja1RyYWNlPVt7ZnVuY3Rpb25OYW1lOicnLHNjcmlwdElkOnNjcmlwdExvY2F0aW9uLnNjcmlwdElkLHVybDpzY3JpcHRMb2NhdGlvbi5zY3JpcHQoKT9zY3JpcHRMb2NhdGlvbi5zY3JpcHQoKS5jb250ZW50VVJMKCk6JycsbGluZU51bWJlcjpzY3JpcHRMb2NhdGlvbi5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjpzY3JpcHRMb2NhdGlvbi5jb2x1bW5OdW1iZXJ8fDB9XTt0aGlzLmFkZE1lc3NhZ2UobmV3IFNESy5Db25zb2xlTWVzc2FnZShjcHVQcm9maWxlck1vZGVsLnJ1bnRpbWVNb2RlbCgpLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkNvbnNvbGVBUEksU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5JbmZvLG1lc3NhZ2VUZXh0LHR5cGUsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsc3RhY2tUcmFjZSkpO30KX2luY3JlbWVudEVycm9yV2FybmluZ0NvdW50KG1zZyl7aWYobXNnLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLlZpb2xhdGlvbikKcmV0dXJuO3N3aXRjaChtc2cubGV2ZWwpe2Nhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nOnRoaXMuX3dhcm5pbmdzKys7YnJlYWs7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yOnRoaXMuX2Vycm9ycysrO2JyZWFrO319Cm1lc3NhZ2VzKCl7cmV0dXJuIHRoaXMuX21lc3NhZ2VzO30KcmVxdWVzdENsZWFyTWVzc2FnZXMoKXtmb3IoY29uc3QgbG9nTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5Mb2dNb2RlbCkpCmxvZ01vZGVsLnJlcXVlc3RDbGVhcigpO2Zvcihjb25zdCBydW50aW1lTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5SdW50aW1lTW9kZWwpKQpydW50aW1lTW9kZWwuZGlzY2FyZENvbnNvbGVFbnRyaWVzKCk7dGhpcy5fY2xlYXIoKTt9Cl9jbGVhcigpe3RoaXMuX21lc3NhZ2VzPVtdO3RoaXMuX21lc3NhZ2VCeUV4Y2VwdGlvbklkLmNsZWFyKCk7dGhpcy5fZXJyb3JzPTA7dGhpcy5fd2FybmluZ3M9MDt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5Db25zb2xlQ2xlYXJlZCk7fQplcnJvcnMoKXtyZXR1cm4gdGhpcy5fZXJyb3JzO30Kd2FybmluZ3MoKXtyZXR1cm4gdGhpcy5fd2FybmluZ3M7fX07U0RLLkNvbnNvbGVNb2RlbC5FdmVudHM9e0NvbnNvbGVDbGVhcmVkOlN5bWJvbCgnQ29uc29sZUNsZWFyZWQnKSxNZXNzYWdlQWRkZWQ6U3ltYm9sKCdNZXNzYWdlQWRkZWQnKSxNZXNzYWdlVXBkYXRlZDpTeW1ib2woJ01lc3NhZ2VVcGRhdGVkJyksQ29tbWFuZEV2YWx1YXRlZDpTeW1ib2woJ0NvbW1hbmRFdmFsdWF0ZWQnKX07U0RLLkNvbnNvbGVNZXNzYWdlPWNsYXNze2NvbnN0cnVjdG9yKHJ1bnRpbWVNb2RlbCxzb3VyY2UsbGV2ZWwsbWVzc2FnZVRleHQsdHlwZSx1cmwsbGluZSxjb2x1bW4scGFyYW1ldGVycyxzdGFja1RyYWNlLHRpbWVzdGFtcCxleGVjdXRpb25Db250ZXh0SWQsc2NyaXB0SWQsd29ya2VySWQsY29udGV4dCl7dGhpcy5fcnVudGltZU1vZGVsPXJ1bnRpbWVNb2RlbDt0aGlzLnNvdXJjZT1zb3VyY2U7dGhpcy5sZXZlbD0obGV2ZWwpO3RoaXMubWVzc2FnZVRleHQ9bWVzc2FnZVRleHQ7dGhpcy50eXBlPXR5cGV8fFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5Mb2c7dGhpcy51cmw9dXJsfHx1bmRlZmluZWQ7dGhpcy5saW5lPWxpbmV8fDA7dGhpcy5jb2x1bW49Y29sdW1ufHwwO3RoaXMucGFyYW1ldGVycz1wYXJhbWV0ZXJzO3RoaXMuc3RhY2tUcmFjZT1zdGFja1RyYWNlO3RoaXMudGltZXN0YW1wPXRpbWVzdGFtcHx8RGF0ZS5ub3coKTt0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZD1leGVjdXRpb25Db250ZXh0SWR8fDA7dGhpcy5zY3JpcHRJZD1zY3JpcHRJZHx8bnVsbDt0aGlzLndvcmtlcklkPXdvcmtlcklkfHxudWxsO2lmKCF0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZCYmdGhpcy5fcnVudGltZU1vZGVsKXtpZih0aGlzLnNjcmlwdElkKQp0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZD10aGlzLl9ydW50aW1lTW9kZWwuZXhlY3V0aW9uQ29udGV4dElkRm9yU2NyaXB0SWQodGhpcy5zY3JpcHRJZCk7ZWxzZSBpZih0aGlzLnN0YWNrVHJhY2UpCnRoaXMuZXhlY3V0aW9uQ29udGV4dElkPXRoaXMuX3J1bnRpbWVNb2RlbC5leGVjdXRpb25Db250ZXh0Rm9yU3RhY2tUcmFjZSh0aGlzLnN0YWNrVHJhY2UpO30KaWYoY29udGV4dCkKdGhpcy5jb250ZXh0PWNvbnRleHQubWF0Y2goL1teI10qLylbMF07fQpzdGF0aWMgZnJvbUV4Y2VwdGlvbihydW50aW1lTW9kZWwsZXhjZXB0aW9uRGV0YWlscyxtZXNzYWdlVHlwZSx0aW1lc3RhbXAsZm9yY2VVcmwpe3JldHVybiBuZXcgU0RLLkNvbnNvbGVNZXNzYWdlKHJ1bnRpbWVNb2RlbCxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5KUyxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yLFNESy5SdW50aW1lTW9kZWwuc2ltcGxlVGV4dEZyb21FeGNlcHRpb24oZXhjZXB0aW9uRGV0YWlscyksbWVzc2FnZVR5cGUsZm9yY2VVcmx8fGV4Y2VwdGlvbkRldGFpbHMudXJsLGV4Y2VwdGlvbkRldGFpbHMubGluZU51bWJlcixleGNlcHRpb25EZXRhaWxzLmNvbHVtbk51bWJlcixleGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbj9bU0RLLlJlbW90ZU9iamVjdC5mcm9tTG9jYWxPYmplY3QoZXhjZXB0aW9uRGV0YWlscy50ZXh0KSxleGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbl06dW5kZWZpbmVkLGV4Y2VwdGlvbkRldGFpbHMuc3RhY2tUcmFjZSx0aW1lc3RhbXAsZXhjZXB0aW9uRGV0YWlscy5leGVjdXRpb25Db250ZXh0SWQsZXhjZXB0aW9uRGV0YWlscy5zY3JpcHRJZCk7fQpydW50aW1lTW9kZWwoKXtyZXR1cm4gdGhpcy5fcnVudGltZU1vZGVsO30KdGFyZ2V0KCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVNb2RlbD90aGlzLl9ydW50aW1lTW9kZWwudGFyZ2V0KCk6bnVsbDt9CnNldE9yaWdpbmF0aW5nTWVzc2FnZShvcmlnaW5hdGluZ01lc3NhZ2Upe3RoaXMuX29yaWdpbmF0aW5nQ29uc29sZU1lc3NhZ2U9b3JpZ2luYXRpbmdNZXNzYWdlO3RoaXMuZXhlY3V0aW9uQ29udGV4dElkPW9yaWdpbmF0aW5nTWVzc2FnZS5leGVjdXRpb25Db250ZXh0SWQ7fQpzZXRFeGVjdXRpb25Db250ZXh0SWQoZXhlY3V0aW9uQ29udGV4dElkKXt0aGlzLmV4ZWN1dGlvbkNvbnRleHRJZD1leGVjdXRpb25Db250ZXh0SWQ7fQpzZXRFeGNlcHRpb25JZChleGNlcHRpb25JZCl7dGhpcy5fZXhjZXB0aW9uSWQ9ZXhjZXB0aW9uSWQ7fQpvcmlnaW5hdGluZ01lc3NhZ2UoKXtyZXR1cm4gdGhpcy5fb3JpZ2luYXRpbmdDb25zb2xlTWVzc2FnZTt9CmlzR3JvdXBNZXNzYWdlKCl7cmV0dXJuIHRoaXMudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5TdGFydEdyb3VwfHx0aGlzLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuU3RhcnRHcm91cENvbGxhcHNlZHx8dGhpcy50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkVuZEdyb3VwO30KaXNHcm91cFN0YXJ0TWVzc2FnZSgpe3JldHVybiB0aGlzLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuU3RhcnRHcm91cHx8dGhpcy50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlN0YXJ0R3JvdXBDb2xsYXBzZWQ7fQppc0Vycm9yT3JXYXJuaW5nKCl7cmV0dXJuKHRoaXMubGV2ZWw9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLldhcm5pbmd8fHRoaXMubGV2ZWw9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yKTt9CmlzR3JvdXBhYmxlKCl7Y29uc3QgaXNVbmdyb3VwYWJsZUVycm9yPXRoaXMubGV2ZWw9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yJiYodGhpcy5zb3VyY2U9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5KU3x8dGhpcy5zb3VyY2U9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5OZXR3b3JrKTtyZXR1cm4odGhpcy5zb3VyY2UhPT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5Db25zb2xlQVBJJiZ0aGlzLnR5cGUhPT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuQ29tbWFuZCYmdGhpcy50eXBlIT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlJlc3VsdCYmdGhpcy50eXBlIT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlN5c3RlbSYmIWlzVW5ncm91cGFibGVFcnJvcik7fQpncm91cENhdGVnb3J5S2V5KCl7cmV0dXJuW3RoaXMuc291cmNlLHRoaXMubGV2ZWwsdGhpcy50eXBlLHRoaXMuX3BhZ2VMb2FkU2VxdWVuY2VOdW1iZXJdLmpvaW4oJzonKTt9CmlzRXF1YWwobXNnKXtpZighbXNnKQpyZXR1cm4gZmFsc2U7aWYoIXRoaXMuX2lzRXF1YWxTdGFja1RyYWNlcyh0aGlzLnN0YWNrVHJhY2UsbXNnLnN0YWNrVHJhY2UpKQpyZXR1cm4gZmFsc2U7aWYodGhpcy5wYXJhbWV0ZXJzKXtpZighbXNnLnBhcmFtZXRlcnN8fHRoaXMucGFyYW1ldGVycy5sZW5ndGghPT1tc2cucGFyYW1ldGVycy5sZW5ndGgpCnJldHVybiBmYWxzZTtmb3IobGV0IGk9MDtpPG1zZy5wYXJhbWV0ZXJzLmxlbmd0aDsrK2kpe2lmKG1zZy5wYXJhbWV0ZXJzW2ldLnR5cGU9PT0nb2JqZWN0JyYmbXNnLnBhcmFtZXRlcnNbaV0uc3VidHlwZSE9PSdlcnJvcicpCnJldHVybiBmYWxzZTtpZih0aGlzLnBhcmFtZXRlcnNbaV0udHlwZSE9PW1zZy5wYXJhbWV0ZXJzW2ldLnR5cGV8fHRoaXMucGFyYW1ldGVyc1tpXS52YWx1ZSE9PW1zZy5wYXJhbWV0ZXJzW2ldLnZhbHVlfHx0aGlzLnBhcmFtZXRlcnNbaV0uZGVzY3JpcHRpb24hPT1tc2cucGFyYW1ldGVyc1tpXS5kZXNjcmlwdGlvbikKcmV0dXJuIGZhbHNlO319CnJldHVybih0aGlzLnJ1bnRpbWVNb2RlbCgpPT09bXNnLnJ1bnRpbWVNb2RlbCgpKSYmKHRoaXMuc291cmNlPT09bXNnLnNvdXJjZSkmJih0aGlzLnR5cGU9PT1tc2cudHlwZSkmJih0aGlzLmxldmVsPT09bXNnLmxldmVsKSYmKHRoaXMubGluZT09PW1zZy5saW5lKSYmKHRoaXMudXJsPT09bXNnLnVybCkmJih0aGlzLm1lc3NhZ2VUZXh0PT09bXNnLm1lc3NhZ2VUZXh0KSYmKHRoaXMucmVxdWVzdD09PW1zZy5yZXF1ZXN0KSYmKHRoaXMuZXhlY3V0aW9uQ29udGV4dElkPT09bXNnLmV4ZWN1dGlvbkNvbnRleHRJZCk7fQpfaXNFcXVhbFN0YWNrVHJhY2VzKHN0YWNrVHJhY2UxLHN0YWNrVHJhY2UyKXtpZighc3RhY2tUcmFjZTEhPT0hc3RhY2tUcmFjZTIpCnJldHVybiBmYWxzZTtpZighc3RhY2tUcmFjZTEpCnJldHVybiB0cnVlO2NvbnN0IGNhbGxGcmFtZXMxPXN0YWNrVHJhY2UxLmNhbGxGcmFtZXM7Y29uc3QgY2FsbEZyYW1lczI9c3RhY2tUcmFjZTIuY2FsbEZyYW1lcztpZihjYWxsRnJhbWVzMS5sZW5ndGghPT1jYWxsRnJhbWVzMi5sZW5ndGgpCnJldHVybiBmYWxzZTtmb3IobGV0IGk9MCxuPWNhbGxGcmFtZXMxLmxlbmd0aDtpPG47KytpKXtpZihjYWxsRnJhbWVzMVtpXS51cmwhPT1jYWxsRnJhbWVzMltpXS51cmx8fGNhbGxGcmFtZXMxW2ldLmZ1bmN0aW9uTmFtZSE9PWNhbGxGcmFtZXMyW2ldLmZ1bmN0aW9uTmFtZXx8Y2FsbEZyYW1lczFbaV0ubGluZU51bWJlciE9PWNhbGxGcmFtZXMyW2ldLmxpbmVOdW1iZXJ8fGNhbGxGcmFtZXMxW2ldLmNvbHVtbk51bWJlciE9PWNhbGxGcmFtZXMyW2ldLmNvbHVtbk51bWJlcikKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRoaXMuX2lzRXF1YWxTdGFja1RyYWNlcyhzdGFja1RyYWNlMS5wYXJlbnQsc3RhY2tUcmFjZTIucGFyZW50KTt9fTtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZT17WE1MOid4bWwnLEpTOidqYXZhc2NyaXB0JyxOZXR3b3JrOiduZXR3b3JrJyxDb25zb2xlQVBJOidjb25zb2xlLWFwaScsU3RvcmFnZTonc3RvcmFnZScsQXBwQ2FjaGU6J2FwcGNhY2hlJyxSZW5kZXJpbmc6J3JlbmRlcmluZycsQ1NTOidjc3MnLFNlY3VyaXR5OidzZWN1cml0eScsRGVwcmVjYXRpb246J2RlcHJlY2F0aW9uJyxXb3JrZXI6J3dvcmtlcicsVmlvbGF0aW9uOid2aW9sYXRpb24nLEludGVydmVudGlvbjonaW50ZXJ2ZW50aW9uJyxSZWNvbW1lbmRhdGlvbjoncmVjb21tZW5kYXRpb24nLE90aGVyOidvdGhlcid9O1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZT17TG9nOidsb2cnLERlYnVnOidkZWJ1ZycsSW5mbzonaW5mbycsRXJyb3I6J2Vycm9yJyxXYXJuaW5nOid3YXJuaW5nJyxEaXI6J2RpcicsRGlyWE1MOidkaXJ4bWwnLFRhYmxlOid0YWJsZScsVHJhY2U6J3RyYWNlJyxDbGVhcjonY2xlYXInLFN0YXJ0R3JvdXA6J3N0YXJ0R3JvdXAnLFN0YXJ0R3JvdXBDb2xsYXBzZWQ6J3N0YXJ0R3JvdXBDb2xsYXBzZWQnLEVuZEdyb3VwOidlbmRHcm91cCcsQXNzZXJ0Oidhc3NlcnQnLFJlc3VsdDoncmVzdWx0JyxQcm9maWxlOidwcm9maWxlJyxQcm9maWxlRW5kOidwcm9maWxlRW5kJyxDb21tYW5kOidjb21tYW5kJyxTeXN0ZW06J3N5c3RlbScsUXVlcnlPYmplY3RSZXN1bHQ6J3F1ZXJ5T2JqZWN0UmVzdWx0J307U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbD17VmVyYm9zZTondmVyYm9zZScsSW5mbzonaW5mbycsV2FybmluZzond2FybmluZycsRXJyb3I6J2Vycm9yJ307U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2VEaXNwbGF5TmFtZT1uZXcgTWFwKFtbU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuWE1MLCd4bWwnXSxbU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuSlMsJ2phdmFzY3JpcHQnXSxbU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuTmV0d29yaywnbmV0d29yayddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5Db25zb2xlQVBJLCdjb25zb2xlLWFwaSddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5TdG9yYWdlLCdzdG9yYWdlJ10sW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkFwcENhY2hlLCdhcHBjYWNoZSddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5SZW5kZXJpbmcsJ3JlbmRlcmluZyddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5DU1MsJ2NzcyddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5TZWN1cml0eSwnc2VjdXJpdHknXSxbU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuRGVwcmVjYXRpb24sJ2RlcHJlY2F0aW9uJ10sW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLldvcmtlciwnd29ya2VyJ10sW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLlZpb2xhdGlvbiwndmlvbGF0aW9uJ10sW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkludGVydmVudGlvbiwnaW50ZXJ2ZW50aW9uJ10sW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLlJlY29tbWVuZGF0aW9uLCdyZWNvbW1lbmRhdGlvbiddLFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5PdGhlciwnb3RoZXInXV0pO1NESy5Db25zb2xlTW9kZWwuX2V2ZW50cz1TeW1ib2woJ1NESy5Db25zb2xlTW9kZWwuZXZlbnRzJyk7U0RLLmNvbnNvbGVNb2RlbDs7c2VsZlsnU2VydmljZXMnXT1zZWxmWydTZXJ2aWNlcyddfHx7fTtTZXJ2aWNlcy5TZXJ2aWNlTWFuYWdlcj1jbGFzc3tjcmVhdGVSZW1vdGVTZXJ2aWNlKHNlcnZpY2VOYW1lKXtpZighdGhpcy5fcmVtb3RlQ29ubmVjdGlvbil7Y29uc3QgdXJsPVJ1bnRpbWUucXVlcnlQYXJhbSgnc2VydmljZS1iYWNrZW5kJyk7aWYoIXVybCl7Y29uc29sZS5lcnJvcignTm8gZW5kcG9pbnQgYWRkcmVzcyBzcGVjaWZpZWQnKTtyZXR1cm4oUHJvbWlzZS5yZXNvbHZlKG51bGwpKTt9CnRoaXMuX3JlbW90ZUNvbm5lY3Rpb249bmV3IFNlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLkNvbm5lY3Rpb24obmV3IFNlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLlJlbW90ZVNlcnZpY2VQb3J0KHVybCkpO30KcmV0dXJuIHRoaXMuX3JlbW90ZUNvbm5lY3Rpb24uX2NyZWF0ZVNlcnZpY2Uoc2VydmljZU5hbWUpO30KY3JlYXRlQXBwU2VydmljZShhcHBOYW1lLHNlcnZpY2VOYW1lKXtsZXQgdXJsPWFwcE5hbWUrJy5qcyc7Y29uc3QgcmVtb3RlQmFzZT1SdW50aW1lLnF1ZXJ5UGFyYW0oJ3JlbW90ZUJhc2UnKTtjb25zdCBkZWJ1Z0Zyb250ZW5kPVJ1bnRpbWUucXVlcnlQYXJhbSgnZGVidWdGcm9udGVuZCcpO2NvbnN0IGlzVW5kZXJUZXN0PUhvc3QuaXNVbmRlclRlc3QoKTtjb25zdCBxdWVyeVBhcmFtcz1bXTtpZihyZW1vdGVCYXNlKQpxdWVyeVBhcmFtcy5wdXNoKCdyZW1vdGVCYXNlPScrcmVtb3RlQmFzZSk7aWYoZGVidWdGcm9udGVuZCkKcXVlcnlQYXJhbXMucHVzaCgnZGVidWdGcm9udGVuZD0nK2RlYnVnRnJvbnRlbmQpO2lmKGlzVW5kZXJUZXN0KQpxdWVyeVBhcmFtcy5wdXNoKCdpc1VuZGVyVGVzdD10cnVlJyk7aWYocXVlcnlQYXJhbXMubGVuZ3RoKQp1cmwrPWA/JHtxdWVyeVBhcmFtcy5qb2luKCcmJyl9YDtjb25zdCB3b3JrZXI9bmV3IFdvcmtlcih1cmwpO2NvbnN0IGNvbm5lY3Rpb249bmV3IFNlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLkNvbm5lY3Rpb24obmV3IFNlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLldvcmtlclNlcnZpY2VQb3J0KHdvcmtlcikpO3JldHVybiBjb25uZWN0aW9uLl9jcmVhdGVTZXJ2aWNlKHNlcnZpY2VOYW1lKTt9fTtTZXJ2aWNlcy5TZXJ2aWNlTWFuYWdlci5Db25uZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHBvcnQpe3RoaXMuX3BvcnQ9cG9ydDt0aGlzLl9wb3J0LnNldEhhbmRsZXJzKHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpLHRoaXMuX2Nvbm5lY3Rpb25DbG9zZWQuYmluZCh0aGlzKSk7dGhpcy5fbGFzdElkPTE7dGhpcy5fY2FsbGJhY2tzPW5ldyBNYXAoKTt0aGlzLl9zZXJ2aWNlcz1uZXcgTWFwKCk7fQpfY3JlYXRlU2VydmljZShzZXJ2aWNlTmFtZSl7cmV0dXJuIHRoaXMuX3NlbmRDb21tYW5kKHNlcnZpY2VOYW1lKycuY3JlYXRlJykudGhlbihyZXN1bHQ9PntpZighcmVzdWx0KXtjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgaW5pdGlhbGl6ZSBzZXJ2aWNlOiAnK3NlcnZpY2VOYW1lKTtyZXR1cm4gbnVsbDt9CmNvbnN0IHNlcnZpY2U9bmV3IFNlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLlNlcnZpY2UodGhpcyxzZXJ2aWNlTmFtZSxyZXN1bHQuaWQpO3RoaXMuX3NlcnZpY2VzLnNldChzZXJ2aWNlTmFtZSsnOicrcmVzdWx0LmlkLHNlcnZpY2UpO3JldHVybiBzZXJ2aWNlO30pO30KX3NlcnZpY2VEaXNwb3NlZChzZXJ2aWNlKXt0aGlzLl9zZXJ2aWNlcy5kZWxldGUoc2VydmljZS5fc2VydmljZU5hbWUrJzonK3NlcnZpY2UuX29iamVjdElkKTtpZighdGhpcy5fc2VydmljZXMuc2l6ZSl7dGhpcy5fcG9ydC5jbG9zZSgpO319Cl9zZW5kQ29tbWFuZChtZXRob2QscGFyYW1zKXtjb25zdCBpZD10aGlzLl9sYXN0SWQrKztjb25zdCBtZXNzYWdlPUpTT04uc3RyaW5naWZ5KHtpZDppZCxtZXRob2Q6bWV0aG9kLHBhcmFtczpwYXJhbXN8fHt9fSk7cmV0dXJuIHRoaXMuX3BvcnQuc2VuZChtZXNzYWdlKS50aGVuKHN1Y2Nlc3M9PntpZighc3VjY2VzcykKcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtyZXR1cm4gbmV3IFByb21pc2UoZnVsZmlsbD0+dGhpcy5fY2FsbGJhY2tzLnNldChpZCxmdWxmaWxsKSk7fSk7fQpfb25NZXNzYWdlKGRhdGEpe2xldCBvYmplY3Q7dHJ5e29iamVjdD1KU09OLnBhcnNlKGRhdGEpO31jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpO3JldHVybjt9CmlmKG9iamVjdC5pZCl7aWYob2JqZWN0LmVycm9yKQpjb25zb2xlLmVycm9yKCdTZXJ2aWNlIGVycm9yOiAnK29iamVjdC5lcnJvcik7dGhpcy5fY2FsbGJhY2tzLmdldChvYmplY3QuaWQpKG9iamVjdC5lcnJvcj9udWxsOm9iamVjdC5yZXN1bHQpO3RoaXMuX2NhbGxiYWNrcy5kZWxldGUob2JqZWN0LmlkKTtyZXR1cm47fQpjb25zdCB0b2tlbnM9b2JqZWN0Lm1ldGhvZC5zcGxpdCgnLicpO2NvbnN0IHNlcnZpY2VOYW1lPXRva2Vuc1swXTtjb25zdCBtZXRob2ROYW1lPXRva2Vuc1sxXTtjb25zdCBzZXJ2aWNlPXRoaXMuX3NlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSsnOicrb2JqZWN0LnBhcmFtcy5pZCk7aWYoIXNlcnZpY2Upe2NvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBsb29rdXAgc3R1YiBmb3IgJytzZXJ2aWNlTmFtZSsnOicrb2JqZWN0LnBhcmFtcy5pZCk7cmV0dXJuO30Kc2VydmljZS5fZGlzcGF0Y2hOb3RpZmljYXRpb24obWV0aG9kTmFtZSxvYmplY3QucGFyYW1zKTt9Cl9jb25uZWN0aW9uQ2xvc2VkKCl7Zm9yKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuX2NhbGxiYWNrcy52YWx1ZXMoKSkKY2FsbGJhY2sobnVsbCk7dGhpcy5fY2FsbGJhY2tzLmNsZWFyKCk7Zm9yKGNvbnN0IHNlcnZpY2Ugb2YgdGhpcy5fc2VydmljZXMudmFsdWVzKCkpCnNlcnZpY2UuX2Rpc3BhdGNoTm90aWZpY2F0aW9uKCdkaXNwb3NlZCcpO3RoaXMuX3NlcnZpY2VzLmNsZWFyKCk7fX07U2VydmljZXMuU2VydmljZU1hbmFnZXIuU2VydmljZT1jbGFzc3tjb25zdHJ1Y3Rvcihjb25uZWN0aW9uLHNlcnZpY2VOYW1lLG9iamVjdElkKXt0aGlzLl9jb25uZWN0aW9uPWNvbm5lY3Rpb247dGhpcy5fc2VydmljZU5hbWU9c2VydmljZU5hbWU7dGhpcy5fb2JqZWN0SWQ9b2JqZWN0SWQ7dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnM9bmV3IE1hcCgpO30KZGlzcG9zZSgpe2NvbnN0IHBhcmFtcz17aWQ6dGhpcy5fb2JqZWN0SWR9O3JldHVybiB0aGlzLl9jb25uZWN0aW9uLl9zZW5kQ29tbWFuZCh0aGlzLl9zZXJ2aWNlTmFtZSsnLmRpc3Bvc2UnLHBhcmFtcykudGhlbigoKT0+e3RoaXMuX2Nvbm5lY3Rpb24uX3NlcnZpY2VEaXNwb3NlZCh0aGlzKTt9KTt9Cm9uKG1ldGhvZE5hbWUsaGFuZGxlcil7dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KG1ldGhvZE5hbWUsaGFuZGxlcik7fQpzZW5kKG1ldGhvZE5hbWUscGFyYW1zKXtwYXJhbXM9cGFyYW1zfHx7fTtwYXJhbXMuaWQ9dGhpcy5fb2JqZWN0SWQ7cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uX3NlbmRDb21tYW5kKHRoaXMuX3NlcnZpY2VOYW1lKycuJyttZXRob2ROYW1lLHBhcmFtcyk7fQpfZGlzcGF0Y2hOb3RpZmljYXRpb24obWV0aG9kTmFtZSxwYXJhbXMpe2NvbnN0IGhhbmRsZXI9dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1ldGhvZE5hbWUpO2lmKCFoYW5kbGVyKXtjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcmVwb3J0IG5vdGlmaWNhdGlvbiBcJycrbWV0aG9kTmFtZSsnXCcgb24gXCcnK3RoaXMuX29iamVjdElkKydcJycpO3JldHVybjt9CmhhbmRsZXIocGFyYW1zKTt9fTtTZXJ2aWNlcy5TZXJ2aWNlTWFuYWdlci5SZW1vdGVTZXJ2aWNlUG9ydD1jbGFzc3tjb25zdHJ1Y3Rvcih1cmwpe3RoaXMuX3VybD11cmw7fQpzZXRIYW5kbGVycyhtZXNzYWdlSGFuZGxlcixjbG9zZUhhbmRsZXIpe3RoaXMuX21lc3NhZ2VIYW5kbGVyPW1lc3NhZ2VIYW5kbGVyO3RoaXMuX2Nsb3NlSGFuZGxlcj1jbG9zZUhhbmRsZXI7fQpfb3Blbigpe2lmKCF0aGlzLl9jb25uZWN0aW9uUHJvbWlzZSkKdGhpcy5fY29ubmVjdGlvblByb21pc2U9bmV3IFByb21pc2UocHJvbWlzZUJvZHkuYmluZCh0aGlzKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Qcm9taXNlO2Z1bmN0aW9uIHByb21pc2VCb2R5KGZ1bGZpbGwpe2xldCBzb2NrZXQ7dHJ5e3NvY2tldD1uZXcgV2ViU29ja2V0KCh0aGlzLl91cmwpKTtzb2NrZXQub25tZXNzYWdlPW9uTWVzc2FnZS5iaW5kKHRoaXMpO3NvY2tldC5vbmNsb3NlPW9uQ2xvc2UuYmluZCh0aGlzKTtzb2NrZXQub25vcGVuPW9uQ29ubmVjdC5iaW5kKHRoaXMpO31jYXRjaChlKXtmdWxmaWxsKGZhbHNlKTt9CmZ1bmN0aW9uIG9uQ29ubmVjdCgpe3RoaXMuX3NvY2tldD1zb2NrZXQ7ZnVsZmlsbCh0cnVlKTt9CmZ1bmN0aW9uIG9uTWVzc2FnZShldmVudCl7dGhpcy5fbWVzc2FnZUhhbmRsZXIoZXZlbnQuZGF0YSk7fQpmdW5jdGlvbiBvbkNsb3NlKCl7aWYoIXRoaXMuX3NvY2tldCkKZnVsZmlsbChmYWxzZSk7dGhpcy5fc29ja2V0Q2xvc2VkKCEhdGhpcy5fc29ja2V0KTt9fX0Kc2VuZChtZXNzYWdlKXtyZXR1cm4gdGhpcy5fb3BlbigpLnRoZW4oKCk9PntpZih0aGlzLl9zb2NrZXQpe3RoaXMuX3NvY2tldC5zZW5kKG1lc3NhZ2UpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30pO30KY2xvc2UoKXtyZXR1cm4gdGhpcy5fb3BlbigpLnRoZW4oKCk9PntpZih0aGlzLl9zb2NrZXQpe3RoaXMuX3NvY2tldC5jbG9zZSgpO3RoaXMuX3NvY2tldENsb3NlZCh0cnVlKTt9CnJldHVybiB0cnVlO30pO30KX3NvY2tldENsb3NlZChub3RpZnlDbGllbnQpe3RoaXMuX3NvY2tldD1udWxsO2RlbGV0ZSB0aGlzLl9jb25uZWN0aW9uUHJvbWlzZTtpZihub3RpZnlDbGllbnQpCnRoaXMuX2Nsb3NlSGFuZGxlcigpO319O1NlcnZpY2VzLlNlcnZpY2VNYW5hZ2VyLldvcmtlclNlcnZpY2VQb3J0PWNsYXNze2NvbnN0cnVjdG9yKHdvcmtlcil7dGhpcy5fd29ya2VyPXdvcmtlcjtsZXQgZnVsZmlsbDt0aGlzLl93b3JrZXJQcm9taXNlPW5ldyBQcm9taXNlKHJlc29sdmU9PmZ1bGZpbGw9cmVzb2x2ZSk7dGhpcy5fd29ya2VyLm9ubWVzc2FnZT1vbk1lc3NhZ2UuYmluZCh0aGlzKTt0aGlzLl93b3JrZXIub25jbG9zZT10aGlzLl9jbG9zZUhhbmRsZXI7ZnVuY3Rpb24gb25NZXNzYWdlKGV2ZW50KXtpZihldmVudC5kYXRhPT09J3dvcmtlclJlYWR5Jyl7ZnVsZmlsbCh0cnVlKTtyZXR1cm47fQp0aGlzLl9tZXNzYWdlSGFuZGxlcihldmVudC5kYXRhKTt9fQpzZXRIYW5kbGVycyhtZXNzYWdlSGFuZGxlcixjbG9zZUhhbmRsZXIpe3RoaXMuX21lc3NhZ2VIYW5kbGVyPW1lc3NhZ2VIYW5kbGVyO3RoaXMuX2Nsb3NlSGFuZGxlcj1jbG9zZUhhbmRsZXI7fQpzZW5kKG1lc3NhZ2Upe3JldHVybiB0aGlzLl93b3JrZXJQcm9taXNlLnRoZW4oKCk9Pnt0cnl7dGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO3JldHVybiB0cnVlO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fX0pO30KY2xvc2UoKXtyZXR1cm4gdGhpcy5fd29ya2VyUHJvbWlzZS50aGVuKCgpPT57aWYodGhpcy5fd29ya2VyKQp0aGlzLl93b3JrZXIudGVybWluYXRlKCk7cmV0dXJuIGZhbHNlO30pO319O1NlcnZpY2VzLnNlcnZpY2VNYW5hZ2VyPW5ldyBTZXJ2aWNlcy5TZXJ2aWNlTWFuYWdlcigpOztzZWxmWydXb3Jrc3BhY2UnXT1zZWxmWydXb3Jrc3BhY2UnXXx8e307V29ya3NwYWNlLkZpbGVNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fc2F2ZUNhbGxiYWNrcz1uZXcgTWFwKCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuU2F2ZWRVUkwsdGhpcy5fc2F2ZWRVUkwsdGhpcyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuQ2FuY2VsZWRTYXZlVVJMLHRoaXMuX2NhbmNlbGVkU2F2ZWRVUkwsdGhpcyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuQXBwZW5kZWRUb1VSTCx0aGlzLl9hcHBlbmRlZFRvVVJMLHRoaXMpO30Kc2F2ZSh1cmwsY29udGVudCxmb3JjZVNhdmVBcyl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNhdmUodXJsLGNvbnRlbnQsZm9yY2VTYXZlQXMpO3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT50aGlzLl9zYXZlQ2FsbGJhY2tzLnNldCh1cmwscmVzb2x2ZSkpO30KX3NhdmVkVVJMKGV2ZW50KXtjb25zdCB1cmw9KGV2ZW50LmRhdGEudXJsKTtjb25zdCBjYWxsYmFjaz10aGlzLl9zYXZlQ2FsbGJhY2tzLmdldCh1cmwpO3RoaXMuX3NhdmVDYWxsYmFja3MuZGVsZXRlKHVybCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKHtmaWxlU3lzdGVtUGF0aDooZXZlbnQuZGF0YS5maWxlU3lzdGVtUGF0aCl9KTt9Cl9jYW5jZWxlZFNhdmVkVVJMKGV2ZW50KXtjb25zdCB1cmw9KGV2ZW50LmRhdGEpO2NvbnN0IGNhbGxiYWNrPXRoaXMuX3NhdmVDYWxsYmFja3MuZ2V0KHVybCk7dGhpcy5fc2F2ZUNhbGxiYWNrcy5kZWxldGUodXJsKTtpZihjYWxsYmFjaykKY2FsbGJhY2sobnVsbCk7fQphcHBlbmQodXJsLGNvbnRlbnQpe0luc3BlY3RvckZyb250ZW5kSG9zdC5hcHBlbmQodXJsLGNvbnRlbnQpO30KY2xvc2UodXJsKXt9Cl9hcHBlbmRlZFRvVVJMKGV2ZW50KXtjb25zdCB1cmw9KGV2ZW50LmRhdGEpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5GaWxlTWFuYWdlci5FdmVudHMuQXBwZW5kZWRUb1VSTCx1cmwpO319O1dvcmtzcGFjZS5GaWxlTWFuYWdlci5FdmVudHM9e0FwcGVuZGVkVG9VUkw6U3ltYm9sKCdBcHBlbmRlZFRvVVJMJyl9O1dvcmtzcGFjZS5maWxlTWFuYWdlcjs7V29ya3NwYWNlLlVJU291cmNlQ29kZT1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IocHJvamVjdCx1cmwsY29udGVudFR5cGUpe3N1cGVyKCk7dGhpcy5fcHJvamVjdD1wcm9qZWN0O3RoaXMuX3VybD11cmw7Y29uc3QgcGFyc2VkVVJMPXVybC5hc1BhcnNlZFVSTCgpO2lmKHBhcnNlZFVSTCl7dGhpcy5fb3JpZ2luPXBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbigpO3RoaXMuX3BhcmVudFVSTD10aGlzLl9vcmlnaW4rcGFyc2VkVVJMLmZvbGRlclBhdGhDb21wb25lbnRzO3RoaXMuX25hbWU9cGFyc2VkVVJMLmxhc3RQYXRoQ29tcG9uZW50O2lmKHBhcnNlZFVSTC5xdWVyeVBhcmFtcykKdGhpcy5fbmFtZSs9Jz8nK3BhcnNlZFVSTC5xdWVyeVBhcmFtczt9ZWxzZXt0aGlzLl9vcmlnaW49Jyc7dGhpcy5fcGFyZW50VVJMPScnO3RoaXMuX25hbWU9dXJsO30KdGhpcy5fY29udGVudFR5cGU9Y29udGVudFR5cGU7dGhpcy5fcmVxdWVzdENvbnRlbnRQcm9taXNlPW51bGw7dGhpcy5fZGVjb3JhdGlvbnM9bnVsbDt0aGlzLl9oYXNDb21taXRzPWZhbHNlO3RoaXMuX21lc3NhZ2VzPW51bGw7dGhpcy5fY29udGVudExvYWRlZD1mYWxzZTt0aGlzLl9jb250ZW50PW51bGw7dGhpcy5fY29udGVudEVuY29kZWQ7dGhpcy5fZm9yY2VMb2FkT25DaGVja0NvbnRlbnQ9ZmFsc2U7dGhpcy5fY2hlY2tpbmdDb250ZW50PWZhbHNlO3RoaXMuX2xhc3RBY2NlcHRlZENvbnRlbnQ9bnVsbDt0aGlzLl93b3JraW5nQ29weT1udWxsO3RoaXMuX3dvcmtpbmdDb3B5R2V0dGVyPW51bGw7fQpyZXF1ZXN0TWV0YWRhdGEoKXtyZXR1cm4gdGhpcy5fcHJvamVjdC5yZXF1ZXN0TWV0YWRhdGEodGhpcyk7fQpuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQptaW1lVHlwZSgpe3JldHVybiB0aGlzLl9wcm9qZWN0Lm1pbWVUeXBlKHRoaXMpO30KdXJsKCl7cmV0dXJuIHRoaXMuX3VybDt9CnBhcmVudFVSTCgpe3JldHVybiB0aGlzLl9wYXJlbnRVUkw7fQpvcmlnaW4oKXtyZXR1cm4gdGhpcy5fb3JpZ2luO30KZnVsbERpc3BsYXlOYW1lKCl7cmV0dXJuIHRoaXMuX3Byb2plY3QuZnVsbERpc3BsYXlOYW1lKHRoaXMpO30KZGlzcGxheU5hbWUoc2tpcFRyaW0pe2lmKCF0aGlzLl9uYW1lKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCcoaW5kZXgpJyk7bGV0IG5hbWU9dGhpcy5fbmFtZTt0cnl7aWYodGhpcy5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpuYW1lPXVuZXNjYXBlKG5hbWUpO2Vsc2UKbmFtZT1kZWNvZGVVUkkobmFtZSk7fWNhdGNoKGUpe30KcmV0dXJuIHNraXBUcmltP25hbWU6bmFtZS50cmltRW5kKDEwMCk7fQpjYW5SZW5hbWUoKXtyZXR1cm4gdGhpcy5fcHJvamVjdC5jYW5SZW5hbWUoKTt9CnJlbmFtZShuZXdOYW1lKXtsZXQgZnVsZmlsbDtjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKHg9PmZ1bGZpbGw9eCk7dGhpcy5fcHJvamVjdC5yZW5hbWUodGhpcyxuZXdOYW1lLGlubmVyQ2FsbGJhY2suYmluZCh0aGlzKSk7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gaW5uZXJDYWxsYmFjayhzdWNjZXNzLG5ld05hbWUsbmV3VVJMLG5ld0NvbnRlbnRUeXBlKXtpZihzdWNjZXNzKXt0aGlzLl91cGRhdGVOYW1lKChuZXdOYW1lKSwobmV3VVJMKSwobmV3Q29udGVudFR5cGUpKTt9CmZ1bGZpbGwoc3VjY2Vzcyk7fX0KcmVtb3ZlKCl7dGhpcy5fcHJvamVjdC5kZWxldGVGaWxlKHRoaXMpO30KX3VwZGF0ZU5hbWUobmFtZSx1cmwsY29udGVudFR5cGUpe2NvbnN0IG9sZFVSTD10aGlzLl91cmw7dGhpcy5fdXJsPXRoaXMuX3VybC5zdWJzdHJpbmcoMCx0aGlzLl91cmwubGVuZ3RoLXRoaXMuX25hbWUubGVuZ3RoKStuYW1lO3RoaXMuX25hbWU9bmFtZTtpZih1cmwpCnRoaXMuX3VybD11cmw7aWYoY29udGVudFR5cGUpCnRoaXMuX2NvbnRlbnRUeXBlPWNvbnRlbnRUeXBlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLlRpdGxlQ2hhbmdlZCx0aGlzKTt0aGlzLnByb2plY3QoKS53b3Jrc3BhY2UoKS5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlUmVuYW1lZCx7b2xkVVJMOm9sZFVSTCx1aVNvdXJjZUNvZGU6dGhpc30pO30KY29udGVudFVSTCgpe3JldHVybiB0aGlzLnVybCgpO30KY29udGVudFR5cGUoKXtyZXR1cm4gdGhpcy5fY29udGVudFR5cGU7fQphc3luYyBjb250ZW50RW5jb2RlZCgpe2F3YWl0IHRoaXMucmVxdWVzdENvbnRlbnQoKTtyZXR1cm4gdGhpcy5fY29udGVudEVuY29kZWR8fGZhbHNlO30KcHJvamVjdCgpe3JldHVybiB0aGlzLl9wcm9qZWN0O30KcmVxdWVzdENvbnRlbnQoKXtpZih0aGlzLl9yZXF1ZXN0Q29udGVudFByb21pc2UpCnJldHVybiB0aGlzLl9yZXF1ZXN0Q29udGVudFByb21pc2U7aWYodGhpcy5fY29udGVudExvYWRlZCl7dGhpcy5fcmVxdWVzdENvbnRlbnRQcm9taXNlPVByb21pc2UucmVzb2x2ZSh0aGlzLl9jb250ZW50KTt9ZWxzZXtsZXQgZnVsZmlsbDt0aGlzLl9yZXF1ZXN0Q29udGVudFByb21pc2U9bmV3IFByb21pc2UoeD0+ZnVsZmlsbD14KTt0aGlzLl9wcm9qZWN0LnJlcXVlc3RGaWxlQ29udGVudCh0aGlzLChjb250ZW50LGVuY29kZWQpPT57aWYoIXRoaXMuX2NvbnRlbnRMb2FkZWQpe3RoaXMuX2NvbnRlbnRMb2FkZWQ9dHJ1ZTt0aGlzLl9jb250ZW50PWNvbnRlbnQ7dGhpcy5fY29udGVudEVuY29kZWQ9ZW5jb2RlZDt9CmZ1bGZpbGwodGhpcy5fY29udGVudCk7fSk7fQpyZXR1cm4gdGhpcy5fcmVxdWVzdENvbnRlbnRQcm9taXNlO30KY2hlY2tDb250ZW50VXBkYXRlZCgpe2lmKCF0aGlzLl9jb250ZW50TG9hZGVkJiYhdGhpcy5fZm9yY2VMb2FkT25DaGVja0NvbnRlbnQpCnJldHVybjtpZighdGhpcy5fcHJvamVjdC5jYW5TZXRGaWxlQ29udGVudCgpfHx0aGlzLl9jaGVja2luZ0NvbnRlbnQpCnJldHVybjt0aGlzLl9jaGVja2luZ0NvbnRlbnQ9dHJ1ZTt0aGlzLl9wcm9qZWN0LnJlcXVlc3RGaWxlQ29udGVudCh0aGlzLGNvbnRlbnRMb2FkZWQuYmluZCh0aGlzKSk7YXN5bmMgZnVuY3Rpb24gY29udGVudExvYWRlZCh1cGRhdGVkQ29udGVudCxlbmNvZGVkKXt0aGlzLl9jaGVja2luZ0NvbnRlbnQ9ZmFsc2U7aWYodXBkYXRlZENvbnRlbnQ9PT1udWxsKXtjb25zdCB3b3JraW5nQ29weT10aGlzLndvcmtpbmdDb3B5KCk7dGhpcy5fY29udGVudENvbW1pdHRlZCgnJyxmYWxzZSk7dGhpcy5zZXRXb3JraW5nQ29weSh3b3JraW5nQ29weSk7cmV0dXJuO30KaWYodGhpcy5fbGFzdEFjY2VwdGVkQ29udGVudD09PXVwZGF0ZWRDb250ZW50KQpyZXR1cm47aWYodGhpcy5fY29udGVudD09PXVwZGF0ZWRDb250ZW50KXt0aGlzLl9sYXN0QWNjZXB0ZWRDb250ZW50PW51bGw7cmV0dXJuO30KaWYoIXRoaXMuaXNEaXJ0eSgpfHx0aGlzLl93b3JraW5nQ29weT09PXVwZGF0ZWRDb250ZW50KXt0aGlzLl9jb250ZW50Q29tbWl0dGVkKCh1cGRhdGVkQ29udGVudCksZmFsc2UpO3JldHVybjt9CmF3YWl0IENvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcyk7YXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZT0+c2V0VGltZW91dChyZXNvbHZlLDApKTtjb25zdCBzaG91bGRVcGRhdGU9d2luZG93LmNvbmZpcm0oQ29tbW9uLlVJU3RyaW5nKCdUaGlzIGZpbGUgd2FzIGNoYW5nZWQgZXh0ZXJuYWxseS4gV291bGQgeW91IGxpa2UgdG8gcmVsb2FkIGl0PycpKTtpZihzaG91bGRVcGRhdGUpCnRoaXMuX2NvbnRlbnRDb21taXR0ZWQoKHVwZGF0ZWRDb250ZW50KSxmYWxzZSk7ZWxzZQp0aGlzLl9sYXN0QWNjZXB0ZWRDb250ZW50PXVwZGF0ZWRDb250ZW50O319CmZvcmNlTG9hZE9uQ2hlY2tDb250ZW50KCl7dGhpcy5fZm9yY2VMb2FkT25DaGVja0NvbnRlbnQ9dHJ1ZTt9Cl9jb21taXRDb250ZW50KGNvbnRlbnQpe2lmKHRoaXMuX3Byb2plY3QuY2FuU2V0RmlsZUNvbnRlbnQoKSkKdGhpcy5fcHJvamVjdC5zZXRGaWxlQ29udGVudCh0aGlzLGNvbnRlbnQsZmFsc2UpO3RoaXMuX2NvbnRlbnRDb21taXR0ZWQoY29udGVudCx0cnVlKTt9Cl9jb250ZW50Q29tbWl0dGVkKGNvbnRlbnQsY29tbWl0dGVkQnlVc2VyKXt0aGlzLl9sYXN0QWNjZXB0ZWRDb250ZW50PW51bGw7dGhpcy5fY29udGVudD1jb250ZW50O3RoaXMuX2NvbnRlbnRMb2FkZWQ9dHJ1ZTt0aGlzLl9yZXF1ZXN0Q29udGVudFByb21pc2U9bnVsbDt0aGlzLl9oYXNDb21taXRzPXRydWU7dGhpcy5faW5uZXJSZXNldFdvcmtpbmdDb3B5KCk7Y29uc3QgZGF0YT17dWlTb3VyY2VDb2RlOnRoaXMsY29udGVudCxlbmNvZGVkOnRoaXMuX2NvbnRlbnRFbmNvZGVkfTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCxkYXRhKTt0aGlzLl9wcm9qZWN0LndvcmtzcGFjZSgpLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCxkYXRhKTtpZihjb21taXR0ZWRCeVVzZXIpCnRoaXMuX3Byb2plY3Qud29ya3NwYWNlKCkuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkQnlVc2VyLGRhdGEpO30KYWRkUmV2aXNpb24oY29udGVudCl7dGhpcy5fY29tbWl0Q29udGVudChjb250ZW50KTt9Cmhhc0NvbW1pdHMoKXtyZXR1cm4gdGhpcy5faGFzQ29tbWl0czt9CndvcmtpbmdDb3B5KCl7aWYodGhpcy5fd29ya2luZ0NvcHlHZXR0ZXIpe3RoaXMuX3dvcmtpbmdDb3B5PXRoaXMuX3dvcmtpbmdDb3B5R2V0dGVyKCk7dGhpcy5fd29ya2luZ0NvcHlHZXR0ZXI9bnVsbDt9CmlmKHRoaXMuaXNEaXJ0eSgpKQpyZXR1cm4odGhpcy5fd29ya2luZ0NvcHkpO3JldHVybiB0aGlzLl9jb250ZW50fHwnJzt9CnJlc2V0V29ya2luZ0NvcHkoKXt0aGlzLl9pbm5lclJlc2V0V29ya2luZ0NvcHkoKTt0aGlzLl93b3JraW5nQ29weUNoYW5nZWQoKTt9Cl9pbm5lclJlc2V0V29ya2luZ0NvcHkoKXt0aGlzLl93b3JraW5nQ29weT1udWxsO3RoaXMuX3dvcmtpbmdDb3B5R2V0dGVyPW51bGw7fQpzZXRXb3JraW5nQ29weShuZXdXb3JraW5nQ29weSl7dGhpcy5fd29ya2luZ0NvcHk9bmV3V29ya2luZ0NvcHk7dGhpcy5fd29ya2luZ0NvcHlHZXR0ZXI9bnVsbDt0aGlzLl93b3JraW5nQ29weUNoYW5nZWQoKTt9CnNldENvbnRlbnQoY29udGVudCxpc0Jhc2U2NCl7dGhpcy5fY29udGVudEVuY29kZWQ9aXNCYXNlNjQ7aWYodGhpcy5fcHJvamVjdC5jYW5TZXRGaWxlQ29udGVudCgpKQp0aGlzLl9wcm9qZWN0LnNldEZpbGVDb250ZW50KHRoaXMsY29udGVudCxpc0Jhc2U2NCk7dGhpcy5fY29udGVudENvbW1pdHRlZChjb250ZW50LHRydWUpO30Kc2V0V29ya2luZ0NvcHlHZXR0ZXIod29ya2luZ0NvcHlHZXR0ZXIpe3RoaXMuX3dvcmtpbmdDb3B5R2V0dGVyPXdvcmtpbmdDb3B5R2V0dGVyO3RoaXMuX3dvcmtpbmdDb3B5Q2hhbmdlZCgpO30KX3dvcmtpbmdDb3B5Q2hhbmdlZCgpe3RoaXMuX3JlbW92ZUFsbE1lc3NhZ2VzKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMpO3RoaXMuX3Byb2plY3Qud29ya3NwYWNlKCkuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx7dWlTb3VyY2VDb2RlOnRoaXN9KTt9CnJlbW92ZVdvcmtpbmdDb3B5R2V0dGVyKCl7aWYoIXRoaXMuX3dvcmtpbmdDb3B5R2V0dGVyKQpyZXR1cm47dGhpcy5fd29ya2luZ0NvcHk9dGhpcy5fd29ya2luZ0NvcHlHZXR0ZXIoKTt0aGlzLl93b3JraW5nQ29weUdldHRlcj1udWxsO30KY29tbWl0V29ya2luZ0NvcHkoKXtpZih0aGlzLmlzRGlydHkoKSkKdGhpcy5fY29tbWl0Q29udGVudCh0aGlzLndvcmtpbmdDb3B5KCkpO30KaXNEaXJ0eSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29weSE9PW51bGx8fHRoaXMuX3dvcmtpbmdDb3B5R2V0dGVyIT09bnVsbDt9CmV4dGVuc2lvbigpe3JldHVybiBDb21tb24uUGFyc2VkVVJMLmV4dHJhY3RFeHRlbnNpb24odGhpcy5fbmFtZSk7fQpjb250ZW50KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ7fQpzZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCBjb250ZW50PXRoaXMuY29udGVudCgpO2lmKCFjb250ZW50KQpyZXR1cm4gdGhpcy5fcHJvamVjdC5zZWFyY2hJbkZpbGVDb250ZW50KHRoaXMscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENvbW1vbi5Db250ZW50UHJvdmlkZXIucGVyZm9ybVNlYXJjaEluQ29udGVudChjb250ZW50LHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCkpO30KY29udGVudExvYWRlZCgpe3JldHVybiB0aGlzLl9jb250ZW50TG9hZGVkO30KdWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYodHlwZW9mIGNvbHVtbk51bWJlcj09PSd1bmRlZmluZWQnKQpjb2x1bW5OdW1iZXI9MDtyZXR1cm4gbmV3IFdvcmtzcGFjZS5VSUxvY2F0aW9uKHRoaXMsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KbWVzc2FnZXMoKXtyZXR1cm4gdGhpcy5fbWVzc2FnZXM/bmV3IFNldCh0aGlzLl9tZXNzYWdlcyk6bmV3IFNldCgpO30KYWRkTGluZU1lc3NhZ2UobGV2ZWwsdGV4dCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7cmV0dXJuIHRoaXMuYWRkTWVzc2FnZShsZXZlbCx0ZXh0LG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyfHwwLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyfHwwKSk7fQphZGRNZXNzYWdlKGxldmVsLHRleHQscmFuZ2Upe2NvbnN0IG1lc3NhZ2U9bmV3IFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZSh0aGlzLGxldmVsLHRleHQscmFuZ2UpO2lmKCF0aGlzLl9tZXNzYWdlcykKdGhpcy5fbWVzc2FnZXM9bmV3IFNldCgpO3RoaXMuX21lc3NhZ2VzLmFkZChtZXNzYWdlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlQWRkZWQsbWVzc2FnZSk7cmV0dXJuIG1lc3NhZ2U7fQpyZW1vdmVNZXNzYWdlKG1lc3NhZ2Upe2lmKHRoaXMuX21lc3NhZ2VzJiZ0aGlzLl9tZXNzYWdlcy5kZWxldGUobWVzc2FnZSkpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLk1lc3NhZ2VSZW1vdmVkLG1lc3NhZ2UpO30KX3JlbW92ZUFsbE1lc3NhZ2VzKCl7aWYoIXRoaXMuX21lc3NhZ2VzKQpyZXR1cm47Zm9yKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5fbWVzc2FnZXMpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLk1lc3NhZ2VSZW1vdmVkLG1lc3NhZ2UpO3RoaXMuX21lc3NhZ2VzPW51bGw7fQphZGRMaW5lRGVjb3JhdGlvbihsaW5lTnVtYmVyLHR5cGUsZGF0YSl7dGhpcy5hZGREZWNvcmF0aW9uKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmVOdW1iZXIsMCksdHlwZSxkYXRhKTt9CmFkZERlY29yYXRpb24ocmFuZ2UsdHlwZSxkYXRhKXtjb25zdCBtYXJrZXI9bmV3IFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTGluZU1hcmtlcihyYW5nZSx0eXBlLGRhdGEpO2lmKCF0aGlzLl9kZWNvcmF0aW9ucykKdGhpcy5fZGVjb3JhdGlvbnM9bmV3IE11bHRpbWFwKCk7dGhpcy5fZGVjb3JhdGlvbnMuc2V0KHR5cGUsbWFya2VyKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5MaW5lRGVjb3JhdGlvbkFkZGVkLG1hcmtlcik7fQpyZW1vdmVEZWNvcmF0aW9uc0ZvclR5cGUodHlwZSl7aWYoIXRoaXMuX2RlY29yYXRpb25zKQpyZXR1cm47Y29uc3QgbWFya2Vycz10aGlzLl9kZWNvcmF0aW9ucy5nZXQodHlwZSk7dGhpcy5fZGVjb3JhdGlvbnMuZGVsZXRlQWxsKHR5cGUpO21hcmtlcnMuZm9yRWFjaChtYXJrZXI9Pnt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5MaW5lRGVjb3JhdGlvblJlbW92ZWQsbWFya2VyKTt9KTt9CmFsbERlY29yYXRpb25zKCl7cmV0dXJuIHRoaXMuX2RlY29yYXRpb25zP3RoaXMuX2RlY29yYXRpb25zLnZhbHVlc0FycmF5KCk6W107fQpyZW1vdmVBbGxEZWNvcmF0aW9ucygpe2lmKCF0aGlzLl9kZWNvcmF0aW9ucykKcmV0dXJuO2NvbnN0IGRlY29yYXRpb25MaXN0PXRoaXMuX2RlY29yYXRpb25zLnZhbHVlc0FycmF5KCk7dGhpcy5fZGVjb3JhdGlvbnMuY2xlYXIoKTtkZWNvcmF0aW9uTGlzdC5mb3JFYWNoKG1hcmtlcj0+dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuTGluZURlY29yYXRpb25SZW1vdmVkLG1hcmtlcikpO30KZGVjb3JhdGlvbnNGb3JUeXBlKHR5cGUpe3JldHVybiB0aGlzLl9kZWNvcmF0aW9ucz90aGlzLl9kZWNvcmF0aW9ucy5nZXQodHlwZSk6bnVsbDt9fTtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cz17V29ya2luZ0NvcHlDaGFuZ2VkOlN5bWJvbCgnV29ya2luZ0NvcHlDaGFuZ2VkJyksV29ya2luZ0NvcHlDb21taXR0ZWQ6U3ltYm9sKCdXb3JraW5nQ29weUNvbW1pdHRlZCcpLFRpdGxlQ2hhbmdlZDpTeW1ib2woJ1RpdGxlQ2hhbmdlZCcpLE1lc3NhZ2VBZGRlZDpTeW1ib2woJ01lc3NhZ2VBZGRlZCcpLE1lc3NhZ2VSZW1vdmVkOlN5bWJvbCgnTWVzc2FnZVJlbW92ZWQnKSxMaW5lRGVjb3JhdGlvbkFkZGVkOlN5bWJvbCgnTGluZURlY29yYXRpb25BZGRlZCcpLExpbmVEZWNvcmF0aW9uUmVtb3ZlZDpTeW1ib2woJ0xpbmVEZWNvcmF0aW9uUmVtb3ZlZCcpfTtXb3Jrc3BhY2UuVUlMb2NhdGlvbj1jbGFzc3tjb25zdHJ1Y3Rvcih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3RoaXMudWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLmxpbmVOdW1iZXI9bGluZU51bWJlcjt0aGlzLmNvbHVtbk51bWJlcj1jb2x1bW5OdW1iZXI7fQpsaW5rVGV4dChza2lwVHJpbSl7bGV0IGxpbmtUZXh0PXRoaXMudWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKHNraXBUcmltKTtpZih0eXBlb2YgdGhpcy5saW5lTnVtYmVyPT09J251bWJlcicpCmxpbmtUZXh0Kz0nOicrKHRoaXMubGluZU51bWJlcisxKTtyZXR1cm4gbGlua1RleHQ7fQppZCgpe3JldHVybiB0aGlzLnVpU291cmNlQ29kZS5wcm9qZWN0KCkuaWQoKSsnOicrdGhpcy51aVNvdXJjZUNvZGUudXJsKCkrJzonK3RoaXMubGluZU51bWJlcisnOicrCnRoaXMuY29sdW1uTnVtYmVyO30KdG9VSVN0cmluZygpe3JldHVybiB0aGlzLnVpU291cmNlQ29kZS51cmwoKSsnOicrKHRoaXMubGluZU51bWJlcisxKTt9CnN0YXRpYyBjb21wYXJhdG9yKGxvY2F0aW9uMSxsb2NhdGlvbjIpe3JldHVybiBsb2NhdGlvbjEuY29tcGFyZVRvKGxvY2F0aW9uMik7fQpjb21wYXJlVG8ob3RoZXIpe2lmKHRoaXMudWlTb3VyY2VDb2RlLnVybCgpIT09b3RoZXIudWlTb3VyY2VDb2RlLnVybCgpKQpyZXR1cm4gdGhpcy51aVNvdXJjZUNvZGUudXJsKCk+b3RoZXIudWlTb3VyY2VDb2RlLnVybCgpPzE6LTE7aWYodGhpcy5saW5lTnVtYmVyIT09b3RoZXIubGluZU51bWJlcikKcmV0dXJuIHRoaXMubGluZU51bWJlci1vdGhlci5saW5lTnVtYmVyO3JldHVybiB0aGlzLmNvbHVtbk51bWJlci1vdGhlci5jb2x1bW5OdW1iZXI7fX07V29ya3NwYWNlLlVJU291cmNlQ29kZS5NZXNzYWdlPWNsYXNze2NvbnN0cnVjdG9yKHVpU291cmNlQ29kZSxsZXZlbCx0ZXh0LHJhbmdlKXt0aGlzLl91aVNvdXJjZUNvZGU9dWlTb3VyY2VDb2RlO3RoaXMuX2xldmVsPWxldmVsO3RoaXMuX3RleHQ9dGV4dDt0aGlzLl9yYW5nZT1yYW5nZTt9CnVpU291cmNlQ29kZSgpe3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGU7fQpsZXZlbCgpe3JldHVybiB0aGlzLl9sZXZlbDt9CnRleHQoKXtyZXR1cm4gdGhpcy5fdGV4dDt9CnJhbmdlKCl7cmV0dXJuIHRoaXMuX3JhbmdlO30KbGluZU51bWJlcigpe3JldHVybiB0aGlzLl9yYW5nZS5zdGFydExpbmU7fQpjb2x1bW5OdW1iZXIoKXtyZXR1cm4gdGhpcy5fcmFuZ2Uuc3RhcnRDb2x1bW47fQppc0VxdWFsKGFub3RoZXIpe3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGU9PT1hbm90aGVyLl91aVNvdXJjZUNvZGUmJnRoaXMudGV4dCgpPT09YW5vdGhlci50ZXh0KCkmJnRoaXMubGV2ZWwoKT09PWFub3RoZXIubGV2ZWwoKSYmdGhpcy5yYW5nZSgpLmVxdWFsKGFub3RoZXIucmFuZ2UoKSk7fQpyZW1vdmUoKXt0aGlzLl91aVNvdXJjZUNvZGUucmVtb3ZlTWVzc2FnZSh0aGlzKTt9fTtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UuTGV2ZWw9e0Vycm9yOidFcnJvcicsV2FybmluZzonV2FybmluZyd9O1dvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTGluZU1hcmtlcj1jbGFzc3tjb25zdHJ1Y3RvcihyYW5nZSx0eXBlLGRhdGEpe3RoaXMuX3JhbmdlPXJhbmdlO3RoaXMuX3R5cGU9dHlwZTt0aGlzLl9kYXRhPWRhdGE7fQpyYW5nZSgpe3JldHVybiB0aGlzLl9yYW5nZTt9CnR5cGUoKXtyZXR1cm4gdGhpcy5fdHlwZTt9CmRhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YTt9fTtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlTWV0YWRhdGE9Y2xhc3N7Y29uc3RydWN0b3IobW9kaWZpY2F0aW9uVGltZSxjb250ZW50U2l6ZSl7dGhpcy5tb2RpZmljYXRpb25UaW1lPW1vZGlmaWNhdGlvblRpbWU7dGhpcy5jb250ZW50U2l6ZT1jb250ZW50U2l6ZTt9fTs7V29ya3NwYWNlLlByb2plY3RTZWFyY2hDb25maWc9ZnVuY3Rpb24oKXt9O1dvcmtzcGFjZS5Qcm9qZWN0U2VhcmNoQ29uZmlnLnByb3RvdHlwZT17cXVlcnkoKXt9LGlnbm9yZUNhc2UoKXt9LGlzUmVnZXgoKXt9LHF1ZXJpZXMoKXt9LGZpbGVQYXRoTWF0Y2hlc0ZpbGVRdWVyeShmaWxlUGF0aCl7fX07V29ya3NwYWNlLlByb2plY3Q9ZnVuY3Rpb24oKXt9O1dvcmtzcGFjZS5Qcm9qZWN0LnByb3RvdHlwZT17d29ya3NwYWNlKCl7fSxpZCgpe30sdHlwZSgpe30saXNTZXJ2aWNlUHJvamVjdCgpe30sZGlzcGxheU5hbWUoKXt9LHJlcXVlc3RNZXRhZGF0YSh1aVNvdXJjZUNvZGUpe30scmVxdWVzdEZpbGVDb250ZW50KHVpU291cmNlQ29kZSxjYWxsYmFjayl7fSxjYW5TZXRGaWxlQ29udGVudCgpe30sc2V0RmlsZUNvbnRlbnQodWlTb3VyY2VDb2RlLG5ld0NvbnRlbnQsaXNCYXNlNjQpe30sZnVsbERpc3BsYXlOYW1lKHVpU291cmNlQ29kZSl7fSxtaW1lVHlwZSh1aVNvdXJjZUNvZGUpe30sY2FuUmVuYW1lKCl7fSxyZW5hbWUodWlTb3VyY2VDb2RlLG5ld05hbWUsY2FsbGJhY2spe30sZXhjbHVkZUZvbGRlcihwYXRoKXt9LGNhbkV4Y2x1ZGVGb2xkZXIocGF0aCl7fSxjcmVhdGVGaWxlKHBhdGgsbmFtZSxjb250ZW50LGlzQmFzZTY0KXt9LGNhbkNyZWF0ZUZpbGUoKXt9LGRlbGV0ZUZpbGUodWlTb3VyY2VDb2RlKXt9LHJlbW92ZSgpe30sc2VhcmNoSW5GaWxlQ29udGVudCh1aVNvdXJjZUNvZGUscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXt9LGZpbmRGaWxlc01hdGNoaW5nU2VhcmNoUmVxdWVzdChzZWFyY2hDb25maWcsZmlsZXNNYXRoaW5nRmlsZVF1ZXJ5LHByb2dyZXNzKXt9LGluZGV4Q29udGVudChwcm9ncmVzcyl7fSx1aVNvdXJjZUNvZGVGb3JVUkwodXJsKXt9LHVpU291cmNlQ29kZXMoKXt9fTtXb3Jrc3BhY2UucHJvamVjdFR5cGVzPXtEZWJ1Z2dlcjonZGVidWdnZXInLEZvcm1hdHRlcjonZm9ybWF0dGVyJyxOZXR3b3JrOiduZXR3b3JrJyxTbmlwcGV0czonc25pcHBldHMnLEZpbGVTeXN0ZW06J2ZpbGVzeXN0ZW0nLENvbnRlbnRTY3JpcHRzOidjb250ZW50c2NyaXB0cycsU2VydmljZTonc2VydmljZSd9O1dvcmtzcGFjZS5Qcm9qZWN0U3RvcmU9Y2xhc3N7Y29uc3RydWN0b3Iod29ya3NwYWNlLGlkLHR5cGUsZGlzcGxheU5hbWUpe3RoaXMuX3dvcmtzcGFjZT13b3Jrc3BhY2U7dGhpcy5faWQ9aWQ7dGhpcy5fdHlwZT10eXBlO3RoaXMuX2Rpc3BsYXlOYW1lPWRpc3BsYXlOYW1lO3RoaXMuX3VpU291cmNlQ29kZXNNYXA9bmV3IE1hcCgpO3RoaXMuX3VpU291cmNlQ29kZXNMaXN0PVtdO3RoaXMuX3Byb2plY3Q9KHRoaXMpO30KaWQoKXtyZXR1cm4gdGhpcy5faWQ7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpkaXNwbGF5TmFtZSgpe3JldHVybiB0aGlzLl9kaXNwbGF5TmFtZTt9CndvcmtzcGFjZSgpe3JldHVybiB0aGlzLl93b3Jrc3BhY2U7fQpjcmVhdGVVSVNvdXJjZUNvZGUodXJsLGNvbnRlbnRUeXBlKXtyZXR1cm4gbmV3IFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUodGhpcy5fcHJvamVjdCx1cmwsY29udGVudFR5cGUpO30KYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgdXJsPXVpU291cmNlQ29kZS51cmwoKTtpZih0aGlzLnVpU291cmNlQ29kZUZvclVSTCh1cmwpKQpyZXR1cm4gZmFsc2U7dGhpcy5fdWlTb3VyY2VDb2Rlc01hcC5zZXQodXJsLHt1aVNvdXJjZUNvZGU6dWlTb3VyY2VDb2RlLGluZGV4OnRoaXMuX3VpU291cmNlQ29kZXNMaXN0Lmxlbmd0aH0pO3RoaXMuX3VpU291cmNlQ29kZXNMaXN0LnB1c2godWlTb3VyY2VDb2RlKTt0aGlzLl93b3Jrc3BhY2UuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHVpU291cmNlQ29kZSk7cmV0dXJuIHRydWU7fQpyZW1vdmVVSVNvdXJjZUNvZGUodXJsKXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy51aVNvdXJjZUNvZGVGb3JVUkwodXJsKTtpZighdWlTb3VyY2VDb2RlKQpyZXR1cm47Y29uc3QgZW50cnk9dGhpcy5fdWlTb3VyY2VDb2Rlc01hcC5nZXQodXJsKTtjb25zdCBtb3ZlZFVJU291cmNlQ29kZT10aGlzLl91aVNvdXJjZUNvZGVzTGlzdFt0aGlzLl91aVNvdXJjZUNvZGVzTGlzdC5sZW5ndGgtMV07dGhpcy5fdWlTb3VyY2VDb2Rlc0xpc3RbZW50cnkuaW5kZXhdPW1vdmVkVUlTb3VyY2VDb2RlO2NvbnN0IG1vdmVkRW50cnk9dGhpcy5fdWlTb3VyY2VDb2Rlc01hcC5nZXQobW92ZWRVSVNvdXJjZUNvZGUudXJsKCkpO21vdmVkRW50cnkuaW5kZXg9ZW50cnkuaW5kZXg7dGhpcy5fdWlTb3VyY2VDb2Rlc0xpc3Quc3BsaWNlKHRoaXMuX3VpU291cmNlQ29kZXNMaXN0Lmxlbmd0aC0xLDEpO3RoaXMuX3VpU291cmNlQ29kZXNNYXAuZGVsZXRlKHVybCk7dGhpcy5fd29ya3NwYWNlLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVSZW1vdmVkLGVudHJ5LnVpU291cmNlQ29kZSk7fQpyZW1vdmVQcm9qZWN0KCl7dGhpcy5fd29ya3NwYWNlLl9yZW1vdmVQcm9qZWN0KHRoaXMuX3Byb2plY3QpO3RoaXMuX3VpU291cmNlQ29kZXNNYXA9bmV3IE1hcCgpO3RoaXMuX3VpU291cmNlQ29kZXNMaXN0PVtdO30KdWlTb3VyY2VDb2RlRm9yVVJMKHVybCl7Y29uc3QgZW50cnk9dGhpcy5fdWlTb3VyY2VDb2Rlc01hcC5nZXQodXJsKTtyZXR1cm4gZW50cnk/ZW50cnkudWlTb3VyY2VDb2RlOm51bGw7fQp1aVNvdXJjZUNvZGVzKCl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZXNMaXN0O30KcmVuYW1lVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSxuZXdOYW1lKXtjb25zdCBvbGRQYXRoPXVpU291cmNlQ29kZS51cmwoKTtjb25zdCBuZXdQYXRoPXVpU291cmNlQ29kZS5wYXJlbnRVUkwoKT91aVNvdXJjZUNvZGUucGFyZW50VVJMKCkrJy8nK25ld05hbWU6bmV3TmFtZTtjb25zdCB2YWx1ZT0odGhpcy5fdWlTb3VyY2VDb2Rlc01hcC5nZXQob2xkUGF0aCkpO3RoaXMuX3VpU291cmNlQ29kZXNNYXAuc2V0KG5ld1BhdGgsdmFsdWUpO3RoaXMuX3VpU291cmNlQ29kZXNNYXAuZGVsZXRlKG9sZFBhdGgpO319O1dvcmtzcGFjZS5Xb3Jrc3BhY2U9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9wcm9qZWN0cz1uZXcgTWFwKCk7dGhpcy5faGFzUmVzb3VyY2VDb250ZW50VHJhY2tpbmdFeHRlbnNpb25zPWZhbHNlO30KdWlTb3VyY2VDb2RlKHByb2plY3RJZCx1cmwpe2NvbnN0IHByb2plY3Q9dGhpcy5fcHJvamVjdHMuZ2V0KHByb2plY3RJZCk7cmV0dXJuIHByb2plY3Q/cHJvamVjdC51aVNvdXJjZUNvZGVGb3JVUkwodXJsKTpudWxsO30KdWlTb3VyY2VDb2RlRm9yVVJMKHVybCl7Zm9yKGNvbnN0IHByb2plY3Qgb2YgdGhpcy5fcHJvamVjdHMudmFsdWVzKCkpe2NvbnN0IHVpU291cmNlQ29kZT1wcm9qZWN0LnVpU291cmNlQ29kZUZvclVSTCh1cmwpO2lmKHVpU291cmNlQ29kZSkKcmV0dXJuIHVpU291cmNlQ29kZTt9CnJldHVybiBudWxsO30KdWlTb3VyY2VDb2Rlc0ZvclByb2plY3RUeXBlKHR5cGUpe2xldCByZXN1bHQ9W107Zm9yKGNvbnN0IHByb2plY3Qgb2YgdGhpcy5fcHJvamVjdHMudmFsdWVzKCkpe2lmKHByb2plY3QudHlwZSgpPT09dHlwZSkKcmVzdWx0PXJlc3VsdC5jb25jYXQocHJvamVjdC51aVNvdXJjZUNvZGVzKCkpO30KcmV0dXJuIHJlc3VsdDt9CmFkZFByb2plY3QocHJvamVjdCl7Y29uc29sZS5hc3NlcnQoIXRoaXMuX3Byb2plY3RzLmhhcyhwcm9qZWN0LmlkKCkpLGBBIHByb2plY3Qgd2l0aCBpZCAke3Byb2plY3QuaWQoKX0gYWxyZWFkeSBleGlzdHMhYCk7dGhpcy5fcHJvamVjdHMuc2V0KHByb2plY3QuaWQoKSxwcm9qZWN0KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0QWRkZWQscHJvamVjdCk7fQpfcmVtb3ZlUHJvamVjdChwcm9qZWN0KXt0aGlzLl9wcm9qZWN0cy5kZWxldGUocHJvamVjdC5pZCgpKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0UmVtb3ZlZCxwcm9qZWN0KTt9CnByb2plY3QocHJvamVjdElkKXtyZXR1cm4gdGhpcy5fcHJvamVjdHMuZ2V0KHByb2plY3RJZCl8fG51bGw7fQpwcm9qZWN0cygpe3JldHVybiB0aGlzLl9wcm9qZWN0cy52YWx1ZXNBcnJheSgpO30KcHJvamVjdHNGb3JUeXBlKHR5cGUpe2Z1bmN0aW9uIGZpbHRlckJ5VHlwZShwcm9qZWN0KXtyZXR1cm4gcHJvamVjdC50eXBlKCk9PT10eXBlO30KcmV0dXJuIHRoaXMucHJvamVjdHMoKS5maWx0ZXIoZmlsdGVyQnlUeXBlKTt9CnVpU291cmNlQ29kZXMoKXtsZXQgcmVzdWx0PVtdO2Zvcihjb25zdCBwcm9qZWN0IG9mIHRoaXMuX3Byb2plY3RzLnZhbHVlcygpKQpyZXN1bHQ9cmVzdWx0LmNvbmNhdChwcm9qZWN0LnVpU291cmNlQ29kZXMoKSk7cmV0dXJuIHJlc3VsdDt9CnNldEhhc1Jlc291cmNlQ29udGVudFRyYWNraW5nRXh0ZW5zaW9ucyhoYXNFeHRlbnNpb25zKXt0aGlzLl9oYXNSZXNvdXJjZUNvbnRlbnRUcmFja2luZ0V4dGVuc2lvbnM9aGFzRXh0ZW5zaW9uczt9Cmhhc1Jlc291cmNlQ29udGVudFRyYWNraW5nRXh0ZW5zaW9ucygpe3JldHVybiB0aGlzLl9oYXNSZXNvdXJjZUNvbnRlbnRUcmFja2luZ0V4dGVuc2lvbnM7fX07V29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHM9e1VJU291cmNlQ29kZUFkZGVkOlN5bWJvbCgnVUlTb3VyY2VDb2RlQWRkZWQnKSxVSVNvdXJjZUNvZGVSZW1vdmVkOlN5bWJvbCgnVUlTb3VyY2VDb2RlUmVtb3ZlZCcpLFVJU291cmNlQ29kZVJlbmFtZWQ6U3ltYm9sKCdVSVNvdXJjZUNvZGVSZW5hbWVkJyksV29ya2luZ0NvcHlDaGFuZ2VkOlN5bWJvbCgnV29ya2luZ0NvcHlDaGFuZ2VkJyksV29ya2luZ0NvcHlDb21taXR0ZWQ6U3ltYm9sKCdXb3JraW5nQ29weUNvbW1pdHRlZCcpLFdvcmtpbmdDb3B5Q29tbWl0dGVkQnlVc2VyOlN5bWJvbCgnV29ya2luZ0NvcHlDb21taXR0ZWRCeVVzZXInKSxQcm9qZWN0QWRkZWQ6U3ltYm9sKCdQcm9qZWN0QWRkZWQnKSxQcm9qZWN0UmVtb3ZlZDpTeW1ib2woJ1Byb2plY3RSZW1vdmVkJyl9O1dvcmtzcGFjZS53b3Jrc3BhY2U7O3NlbGZbJ0JpbmRpbmdzJ109c2VsZlsnQmluZGluZ3MnXXx8e307QmluZGluZ3MuTGl2ZUxvY2F0aW9uPWZ1bmN0aW9uKCl7fTtCaW5kaW5ncy5MaXZlTG9jYXRpb24ucHJvdG90eXBlPXt1cGRhdGUoKXt9LHVpTG9jYXRpb24oKXt9LGRpc3Bvc2UoKXt9LGlzQmxhY2tib3hlZCgpe319O0JpbmRpbmdzLkxpdmVMb2NhdGlvbldpdGhQb29sPWNsYXNze2NvbnN0cnVjdG9yKHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCl7dGhpcy5fdXBkYXRlRGVsZWdhdGU9dXBkYXRlRGVsZWdhdGU7dGhpcy5fbG9jYXRpb25Qb29sPWxvY2F0aW9uUG9vbDt0aGlzLl9sb2NhdGlvblBvb2wuX2FkZCh0aGlzKTt9CnVwZGF0ZSgpe3RoaXMuX3VwZGF0ZURlbGVnYXRlKHRoaXMpO30KdWlMb2NhdGlvbigpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpkaXNwb3NlKCl7dGhpcy5fbG9jYXRpb25Qb29sLl9kZWxldGUodGhpcyk7dGhpcy5fdXBkYXRlRGVsZWdhdGU9bnVsbDt9CmlzQmxhY2tib3hlZCgpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fX07QmluZGluZ3MuTGl2ZUxvY2F0aW9uUG9vbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2xvY2F0aW9ucz1uZXcgU2V0KCk7fQpfYWRkKGxvY2F0aW9uKXt0aGlzLl9sb2NhdGlvbnMuYWRkKGxvY2F0aW9uKTt9Cl9kZWxldGUobG9jYXRpb24pe3RoaXMuX2xvY2F0aW9ucy5kZWxldGUobG9jYXRpb24pO30KZGlzcG9zZUFsbCgpe2Zvcihjb25zdCBsb2NhdGlvbiBvZiB0aGlzLl9sb2NhdGlvbnMpCmxvY2F0aW9uLmRpc3Bvc2UoKTt9fTs7QmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nPWNsYXNze2NvbnN0cnVjdG9yKHRhcmdldE1hbmFnZXIsd29ya3NwYWNlKXt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX21vZGVsVG9JbmZvPW5ldyBNYXAoKTt0YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLlJlc291cmNlVHJlZU1vZGVsLHRoaXMpO30KbW9kZWxBZGRlZChyZXNvdXJjZVRyZWVNb2RlbCl7Y29uc3QgaW5mbz1uZXcgQmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nLk1vZGVsSW5mbyh0aGlzLl93b3Jrc3BhY2UscmVzb3VyY2VUcmVlTW9kZWwpO3RoaXMuX21vZGVsVG9JbmZvLnNldChyZXNvdXJjZVRyZWVNb2RlbCxpbmZvKTt9Cm1vZGVsUmVtb3ZlZChyZXNvdXJjZVRyZWVNb2RlbCl7Y29uc3QgaW5mbz10aGlzLl9tb2RlbFRvSW5mby5nZXQocmVzb3VyY2VUcmVlTW9kZWwpO2luZm8uZGlzcG9zZSgpO3RoaXMuX21vZGVsVG9JbmZvLmRlbGV0ZShyZXNvdXJjZVRyZWVNb2RlbCk7fQpfaW5mb0ZvclRhcmdldCh0YXJnZXQpe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO3JldHVybiByZXNvdXJjZVRyZWVNb2RlbD90aGlzLl9tb2RlbFRvSW5mby5nZXQocmVzb3VyY2VUcmVlTW9kZWwpOm51bGw7fQpjc3NMb2NhdGlvblRvVUlMb2NhdGlvbihjc3NMb2NhdGlvbil7Y29uc3QgaGVhZGVyPWNzc0xvY2F0aW9uLmhlYWRlcigpO2lmKCFoZWFkZXIpCnJldHVybiBudWxsO2NvbnN0IGluZm89dGhpcy5faW5mb0ZvclRhcmdldChjc3NMb2NhdGlvbi5jc3NNb2RlbCgpLnRhcmdldCgpKTtpZighaW5mbykKcmV0dXJuIG51bGw7Y29uc3QgdWlTb3VyY2VDb2RlPWluZm8uX3Byb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKGNzc0xvY2F0aW9uLnVybCk7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIG51bGw7Y29uc3Qgb2Zmc2V0PWhlYWRlcltCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX29mZnNldFN5bWJvbF18fFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGhlYWRlci5zdGFydExpbmUsaGVhZGVyLnN0YXJ0Q29sdW1uKTtjb25zdCBsaW5lTnVtYmVyPWNzc0xvY2F0aW9uLmxpbmVOdW1iZXIrb2Zmc2V0LnN0YXJ0TGluZS1oZWFkZXIuc3RhcnRMaW5lO2xldCBjb2x1bW5OdW1iZXI9Y3NzTG9jYXRpb24uY29sdW1uTnVtYmVyO2lmKGNzc0xvY2F0aW9uLmxpbmVOdW1iZXI9PT1oZWFkZXIuc3RhcnRMaW5lKQpjb2x1bW5OdW1iZXIrPW9mZnNldC5zdGFydENvbHVtbi1oZWFkZXIuc3RhcnRDb2x1bW47cmV0dXJuIHVpU291cmNlQ29kZS51aUxvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTt9CmpzTG9jYXRpb25Ub1VJTG9jYXRpb24oanNMb2NhdGlvbil7Y29uc3Qgc2NyaXB0PWpzTG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIG51bGw7Y29uc3QgaW5mbz10aGlzLl9pbmZvRm9yVGFyZ2V0KGpzTG9jYXRpb24uZGVidWdnZXJNb2RlbC50YXJnZXQoKSk7aWYoIWluZm8pCnJldHVybiBudWxsO2NvbnN0IHVpU291cmNlQ29kZT1pbmZvLl9wcm9qZWN0LnVpU291cmNlQ29kZUZvclVSTChzY3JpcHQuc291cmNlVVJMKTtpZighdWlTb3VyY2VDb2RlKQpyZXR1cm4gbnVsbDtjb25zdCBvZmZzZXQ9c2NyaXB0W0JpbmRpbmdzLlJlc291cmNlTWFwcGluZy5fb2Zmc2V0U3ltYm9sXXx8VGV4dFV0aWxzLlRleHRSYW5nZS5jcmVhdGVGcm9tTG9jYXRpb24oc2NyaXB0LmxpbmVPZmZzZXQsc2NyaXB0LmNvbHVtbk9mZnNldCk7Y29uc3QgbGluZU51bWJlcj1qc0xvY2F0aW9uLmxpbmVOdW1iZXIrb2Zmc2V0LnN0YXJ0TGluZS1zY3JpcHQubGluZU9mZnNldDtsZXQgY29sdW1uTnVtYmVyPWpzTG9jYXRpb24uY29sdW1uTnVtYmVyO2lmKGpzTG9jYXRpb24ubGluZU51bWJlcj09PXNjcmlwdC5saW5lT2Zmc2V0KQpjb2x1bW5OdW1iZXIrPW9mZnNldC5zdGFydENvbHVtbi1zY3JpcHQuY29sdW1uT2Zmc2V0O3JldHVybiB1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fQp1aUxvY2F0aW9uVG9KU0xvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYoIXVpU291cmNlQ29kZVtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX3N5bWJvbF0pCnJldHVybiBudWxsO2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtpZighdGFyZ2V0KQpyZXR1cm4gbnVsbDtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7aWYoIWRlYnVnZ2VyTW9kZWwpCnJldHVybiBudWxsO3JldHVybiBkZWJ1Z2dlck1vZGVsLmNyZWF0ZVJhd0xvY2F0aW9uQnlVUkwodWlTb3VyY2VDb2RlLnVybCgpLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTt9Cl9yZXNldEZvclRlc3QodGFyZ2V0KXtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtjb25zdCBpbmZvPXJlc291cmNlVHJlZU1vZGVsP3RoaXMuX21vZGVsVG9JbmZvLmdldChyZXNvdXJjZVRyZWVNb2RlbCk6bnVsbDtpZihpbmZvKQppbmZvLl9yZXNldEZvclRlc3QoKTt9fTtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuTW9kZWxJbmZvPWNsYXNze2NvbnN0cnVjdG9yKHdvcmtzcGFjZSxyZXNvdXJjZVRyZWVNb2RlbCl7Y29uc3QgdGFyZ2V0PXJlc291cmNlVHJlZU1vZGVsLnRhcmdldCgpO3RoaXMuX3Byb2plY3Q9bmV3IEJpbmRpbmdzLkNvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdCh3b3Jrc3BhY2UsJ3Jlc291cmNlczonK3RhcmdldC5pZCgpLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yaywnJyxmYWxzZSk7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0VGFyZ2V0Rm9yUHJvamVjdCh0aGlzLl9wcm9qZWN0LHRhcmdldCk7dGhpcy5fYmluZGluZ3M9bmV3IE1hcCgpO2NvbnN0IGNzc01vZGVsPXRhcmdldC5tb2RlbChTREsuQ1NTTW9kZWwpO3RoaXMuX2Nzc01vZGVsPWNzc01vZGVsO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuUmVzb3VyY2VBZGRlZCx0aGlzLl9yZXNvdXJjZUFkZGVkLHRoaXMpLHJlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZVdpbGxOYXZpZ2F0ZSx0aGlzLl9mcmFtZVdpbGxOYXZpZ2F0ZSx0aGlzKSxyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRnJhbWVEZXRhY2hlZCx0aGlzLl9mcmFtZURldGFjaGVkLHRoaXMpLGNzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0Q2hhbmdlZCx0aGlzLl9zdHlsZVNoZWV0Q2hhbmdlZCx0aGlzKV07fQpfc3R5bGVTaGVldENoYW5nZWQoZXZlbnQpe2NvbnN0IGhlYWRlcj10aGlzLl9jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQoZXZlbnQuZGF0YS5zdHlsZVNoZWV0SWQpO2lmKCFoZWFkZXJ8fCFoZWFkZXIuaXNJbmxpbmUpCnJldHVybjtjb25zdCBiaW5kaW5nPXRoaXMuX2JpbmRpbmdzLmdldChoZWFkZXIucmVzb3VyY2VVUkwoKSk7aWYoIWJpbmRpbmcpCnJldHVybjtiaW5kaW5nLl9zdHlsZVNoZWV0Q2hhbmdlZChoZWFkZXIsZXZlbnQuZGF0YS5lZGl0KTt9Cl9hY2NlcHRzUmVzb3VyY2UocmVzb3VyY2Upe2NvbnN0IHJlc291cmNlVHlwZT1yZXNvdXJjZS5yZXNvdXJjZVR5cGUoKTtpZihyZXNvdXJjZVR5cGUhPT1Db21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZSYmcmVzb3VyY2VUeXBlIT09Q29tbW9uLnJlc291cmNlVHlwZXMuRm9udCYmcmVzb3VyY2VUeXBlIT09Q29tbW9uLnJlc291cmNlVHlwZXMuRG9jdW1lbnQmJnJlc291cmNlVHlwZSE9PUNvbW1vbi5yZXNvdXJjZVR5cGVzLk1hbmlmZXN0KQpyZXR1cm4gZmFsc2U7aWYocmVzb3VyY2VUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2UmJnJlc291cmNlLm1pbWVUeXBlJiYhcmVzb3VyY2UubWltZVR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UnKSkKcmV0dXJuIGZhbHNlO2lmKHJlc291cmNlVHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkZvbnQmJnJlc291cmNlLm1pbWVUeXBlJiYhcmVzb3VyY2UubWltZVR5cGUuaW5jbHVkZXMoJ2ZvbnQnKSkKcmV0dXJuIGZhbHNlO2lmKChyZXNvdXJjZVR5cGU9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZXx8cmVzb3VyY2VUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuRm9udCkmJnJlc291cmNlLmNvbnRlbnRVUkwoKS5zdGFydHNXaXRoKCdkYXRhOicpKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWU7fQpfcmVzb3VyY2VBZGRlZChldmVudCl7Y29uc3QgcmVzb3VyY2U9KGV2ZW50LmRhdGEpO2lmKCF0aGlzLl9hY2NlcHRzUmVzb3VyY2UocmVzb3VyY2UpKQpyZXR1cm47bGV0IGJpbmRpbmc9dGhpcy5fYmluZGluZ3MuZ2V0KHJlc291cmNlLnVybCk7aWYoIWJpbmRpbmcpe2JpbmRpbmc9bmV3IEJpbmRpbmdzLlJlc291cmNlTWFwcGluZy5CaW5kaW5nKHRoaXMuX3Byb2plY3QscmVzb3VyY2UpO3RoaXMuX2JpbmRpbmdzLnNldChyZXNvdXJjZS51cmwsYmluZGluZyk7fWVsc2V7YmluZGluZy5hZGRSZXNvdXJjZShyZXNvdXJjZSk7fX0KX3JlbW92ZUZyYW1lUmVzb3VyY2VzKGZyYW1lKXtmb3IoY29uc3QgcmVzb3VyY2Ugb2YgZnJhbWUucmVzb3VyY2VzKCkpe2lmKCF0aGlzLl9hY2NlcHRzUmVzb3VyY2UocmVzb3VyY2UpKQpjb250aW51ZTtjb25zdCBiaW5kaW5nPXRoaXMuX2JpbmRpbmdzLmdldChyZXNvdXJjZS51cmwpO2lmKGJpbmRpbmcuX3Jlc291cmNlcy5zaXplPT09MSl7YmluZGluZy5kaXNwb3NlKCk7dGhpcy5fYmluZGluZ3MuZGVsZXRlKHJlc291cmNlLnVybCk7fWVsc2V7YmluZGluZy5yZW1vdmVSZXNvdXJjZShyZXNvdXJjZSk7fX19Cl9mcmFtZVdpbGxOYXZpZ2F0ZShldmVudCl7Y29uc3QgZnJhbWU9KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZUZyYW1lUmVzb3VyY2VzKGZyYW1lKTt9Cl9mcmFtZURldGFjaGVkKGV2ZW50KXtjb25zdCBmcmFtZT0oZXZlbnQuZGF0YSk7dGhpcy5fcmVtb3ZlRnJhbWVSZXNvdXJjZXMoZnJhbWUpO30KX3Jlc2V0Rm9yVGVzdCgpe2Zvcihjb25zdCBiaW5kaW5nIG9mIHRoaXMuX2JpbmRpbmdzLnZhbHVlc0FycmF5KCkpCmJpbmRpbmcuZGlzcG9zZSgpO3RoaXMuX2JpbmRpbmdzLmNsZWFyKCk7fQpkaXNwb3NlKCl7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2V2ZW50TGlzdGVuZXJzKTtmb3IoY29uc3QgYmluZGluZyBvZiB0aGlzLl9iaW5kaW5ncy52YWx1ZXNBcnJheSgpKQpiaW5kaW5nLmRpc3Bvc2UoKTt0aGlzLl9iaW5kaW5ncy5jbGVhcigpO3RoaXMuX3Byb2plY3QucmVtb3ZlUHJvamVjdCgpO319O0JpbmRpbmdzLlJlc291cmNlTWFwcGluZy5CaW5kaW5nPWNsYXNze2NvbnN0cnVjdG9yKHByb2plY3QscmVzb3VyY2Upe3RoaXMuX3Jlc291cmNlcz1uZXcgU2V0KFtyZXNvdXJjZV0pO3RoaXMuX3Byb2plY3Q9cHJvamVjdDt0aGlzLl91aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC5jcmVhdGVVSVNvdXJjZUNvZGUocmVzb3VyY2UudXJsLHJlc291cmNlLmNvbnRlbnRUeXBlKCkpO3RoaXMuX3VpU291cmNlQ29kZVtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX3N5bWJvbF09dHJ1ZTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5zZXRJbml0aWFsRnJhbWVBdHRyaWJ1dGlvbih0aGlzLl91aVNvdXJjZUNvZGUscmVzb3VyY2UuZnJhbWVJZCk7dGhpcy5fcHJvamVjdC5hZGRVSVNvdXJjZUNvZGVXaXRoUHJvdmlkZXIodGhpcy5fdWlTb3VyY2VDb2RlLHRoaXMsQmluZGluZ3MucmVzb3VyY2VNZXRhZGF0YShyZXNvdXJjZSkscmVzb3VyY2UubWltZVR5cGUpO3RoaXMuX2VkaXRzPVtdO30KX2lubGluZVN0eWxlcygpe2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUodGhpcy5fdWlTb3VyY2VDb2RlKTtjb25zdCBjc3NNb2RlbD10YXJnZXQubW9kZWwoU0RLLkNTU01vZGVsKTtjb25zdCBzdHlsZXNoZWV0cz1bXTtpZihjc3NNb2RlbCl7Zm9yKGNvbnN0IGhlYWRlcklkIG9mIGNzc01vZGVsLnN0eWxlU2hlZXRJZHNGb3JVUkwodGhpcy5fdWlTb3VyY2VDb2RlLnVybCgpKSl7Y29uc3QgaGVhZGVyPWNzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChoZWFkZXJJZCk7aWYoaGVhZGVyKQpzdHlsZXNoZWV0cy5wdXNoKGhlYWRlcik7fX0KcmV0dXJuIHN0eWxlc2hlZXRzO30KX2lubGluZVNjcmlwdHMoKXtjb25zdCB0YXJnZXQ9QmluZGluZ3MuTmV0d29ya1Byb2plY3QudGFyZ2V0Rm9yVUlTb3VyY2VDb2RlKHRoaXMuX3VpU291cmNlQ29kZSk7Y29uc3QgZGVidWdnZXJNb2RlbD10YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpO2lmKCFkZWJ1Z2dlck1vZGVsKQpyZXR1cm5bXTtyZXR1cm4gZGVidWdnZXJNb2RlbC5zY3JpcHRzRm9yU291cmNlVVJMKHRoaXMuX3VpU291cmNlQ29kZS51cmwoKSk7fQphc3luYyBfc3R5bGVTaGVldENoYW5nZWQoc3R5bGVzaGVldCxlZGl0KXt0aGlzLl9lZGl0cy5wdXNoKHtzdHlsZXNoZWV0LGVkaXR9KTtpZih0aGlzLl9lZGl0cy5sZW5ndGg+MSkKcmV0dXJuO2NvbnN0IGNvbnRlbnQ9YXdhaXQgdGhpcy5fdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCk7aWYoY29udGVudCE9PW51bGwpCnRoaXMuX2lubmVyU3R5bGVTaGVldENoYW5nZWQoY29udGVudCk7dGhpcy5fZWRpdHM9W107fQpfaW5uZXJTdHlsZVNoZWV0Q2hhbmdlZChjb250ZW50KXtjb25zdCBzY3JpcHRzPXRoaXMuX2lubGluZVNjcmlwdHMoKTtjb25zdCBzdHlsZXM9dGhpcy5faW5saW5lU3R5bGVzKCk7bGV0IHRleHQ9bmV3IFRleHRVdGlscy5UZXh0KGNvbnRlbnQpO2Zvcihjb25zdCBkYXRhIG9mIHRoaXMuX2VkaXRzKXtjb25zdCBlZGl0PWRhdGEuZWRpdDtjb25zdCBzdHlsZXNoZWV0PWRhdGEuc3R5bGVzaGVldDtjb25zdCBzdGFydExvY2F0aW9uPXN0eWxlc2hlZXRbQmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nLl9vZmZzZXRTeW1ib2xdfHxUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihzdHlsZXNoZWV0LnN0YXJ0TGluZSxzdHlsZXNoZWV0LnN0YXJ0Q29sdW1uKTtjb25zdCBvbGRSYW5nZT1lZGl0Lm9sZFJhbmdlLnJlbGF0aXZlRnJvbShzdGFydExvY2F0aW9uLnN0YXJ0TGluZSxzdGFydExvY2F0aW9uLnN0YXJ0Q29sdW1uKTtjb25zdCBuZXdSYW5nZT1lZGl0Lm5ld1JhbmdlLnJlbGF0aXZlRnJvbShzdGFydExvY2F0aW9uLnN0YXJ0TGluZSxzdGFydExvY2F0aW9uLnN0YXJ0Q29sdW1uKTt0ZXh0PW5ldyBUZXh0VXRpbHMuVGV4dCh0ZXh0LnJlcGxhY2VSYW5nZShvbGRSYW5nZSxlZGl0Lm5ld1RleHQpKTtmb3IoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpe2NvbnN0IHNjcmlwdE9mZnNldD1zY3JpcHRbQmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nLl9vZmZzZXRTeW1ib2xdfHxUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihzY3JpcHQubGluZU9mZnNldCxzY3JpcHQuY29sdW1uT2Zmc2V0KTtpZighc2NyaXB0T2Zmc2V0LmZvbGxvd3Mob2xkUmFuZ2UpKQpjb250aW51ZTtzY3JpcHRbQmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nLl9vZmZzZXRTeW1ib2xdPXNjcmlwdE9mZnNldC5yZWJhc2VBZnRlclRleHRFZGl0KG9sZFJhbmdlLG5ld1JhbmdlKTtCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcudXBkYXRlTG9jYXRpb25zKHNjcmlwdCk7fQpmb3IoY29uc3Qgc3R5bGUgb2Ygc3R5bGVzKXtjb25zdCBzdHlsZU9mZnNldD1zdHlsZVtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX29mZnNldFN5bWJvbF18fFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKHN0eWxlLnN0YXJ0TGluZSxzdHlsZS5zdGFydENvbHVtbik7aWYoIXN0eWxlT2Zmc2V0LmZvbGxvd3Mob2xkUmFuZ2UpKQpjb250aW51ZTtzdHlsZVtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX29mZnNldFN5bWJvbF09c3R5bGVPZmZzZXQucmViYXNlQWZ0ZXJUZXh0RWRpdChvbGRSYW5nZSxuZXdSYW5nZSk7QmluZGluZ3MuY3NzV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoc3R5bGUpO319CnRoaXMuX3VpU291cmNlQ29kZS5hZGRSZXZpc2lvbih0ZXh0LnZhbHVlKCkpO30KYWRkUmVzb3VyY2UocmVzb3VyY2Upe3RoaXMuX3Jlc291cmNlcy5hZGQocmVzb3VyY2UpO0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LmFkZEZyYW1lQXR0cmlidXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLHJlc291cmNlLmZyYW1lSWQpO30KcmVtb3ZlUmVzb3VyY2UocmVzb3VyY2Upe3RoaXMuX3Jlc291cmNlcy5kZWxldGUocmVzb3VyY2UpO0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnJlbW92ZUZyYW1lQXR0cmlidXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLHJlc291cmNlLmZyYW1lSWQpO30KZGlzcG9zZSgpe3RoaXMuX3Byb2plY3QucmVtb3ZlRmlsZSh0aGlzLl91aVNvdXJjZUNvZGUudXJsKCkpO30KY29udGVudFVSTCgpe3JldHVybiB0aGlzLl9yZXNvdXJjZXMuZmlyc3RWYWx1ZSgpLmNvbnRlbnRVUkwoKTt9CmNvbnRlbnRUeXBlKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlcy5maXJzdFZhbHVlKCkuY29udGVudFR5cGUoKTt9CmNvbnRlbnRFbmNvZGVkKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlcy5maXJzdFZhbHVlKCkuY29udGVudEVuY29kZWQoKTt9CnJlcXVlc3RDb250ZW50KCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlcy5maXJzdFZhbHVlKCkucmVxdWVzdENvbnRlbnQoKTt9CnNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe3JldHVybiB0aGlzLl9yZXNvdXJjZXMuZmlyc3RWYWx1ZSgpLnNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpO319O0JpbmRpbmdzLlJlc291cmNlTWFwcGluZy5fc3ltYm9sPVN5bWJvbCgnQmluZGluZ3MuUmVzb3VyY2VNYXBwaW5nLl9zeW1ib2wnKTtCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcuX29mZnNldFN5bWJvbD1TeW1ib2woJ0JpbmRpbmdzLlJlc291cmNlTWFwcGluZy5fb2Zmc2V0U3ltYm9sJyk7O0JpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZz1jbGFzc3tjb25zdHJ1Y3RvcihkZWJ1Z2dlck1vZGVsLHdvcmtzcGFjZSxkZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcpe3RoaXMuX2RlYnVnZ2VyTW9kZWw9ZGVidWdnZXJNb2RlbDt0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyPXRoaXMuX2RlYnVnZ2VyTW9kZWwuc291cmNlTWFwTWFuYWdlcigpO3RoaXMuX3dvcmtzcGFjZT13b3Jrc3BhY2U7dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nPWRlYnVnZ2VyV29ya3NwYWNlQmluZGluZztjb25zdCB0YXJnZXQ9ZGVidWdnZXJNb2RlbC50YXJnZXQoKTt0aGlzLl9yZWd1bGFyUHJvamVjdD1uZXcgQmluZGluZ3MuQ29udGVudFByb3ZpZGVyQmFzZWRQcm9qZWN0KHdvcmtzcGFjZSwnanNTb3VyY2VNYXBzOjonK3RhcmdldC5pZCgpLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yaywnJyxmYWxzZSk7dGhpcy5fY29udGVudFNjcmlwdHNQcm9qZWN0PW5ldyBCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3Qod29ya3NwYWNlLCdqc1NvdXJjZU1hcHM6ZXh0ZW5zaW9uczonK3RhcmdldC5pZCgpLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuQ29udGVudFNjcmlwdHMsJycsZmFsc2UpO0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnNldFRhcmdldEZvclByb2plY3QodGhpcy5fcmVndWxhclByb2plY3QsdGFyZ2V0KTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5zZXRUYXJnZXRGb3JQcm9qZWN0KHRoaXMuX2NvbnRlbnRTY3JpcHRzUHJvamVjdCx0YXJnZXQpO3RoaXMuX3JlZ3VsYXJCaW5kaW5ncz1uZXcgTWFwKCk7dGhpcy5fY29udGVudFNjcmlwdHNCaW5kaW5ncz1uZXcgTWFwKCk7dGhpcy5fc3R1YlVJU291cmNlQ29kZXM9bmV3IE1hcCgpO3RoaXMuX3N0dWJQcm9qZWN0PW5ldyBCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3Qod29ya3NwYWNlLCdqc1NvdXJjZU1hcHM6c3R1YjonK3RhcmdldC5pZCgpLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU2VydmljZSwnJyx0cnVlKTt0aGlzLl9ldmVudExpc3RlbmVycz1bdGhpcy5fc291cmNlTWFwTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5Tb3VyY2VNYXBNYW5hZ2VyLkV2ZW50cy5Tb3VyY2VNYXBXaWxsQXR0YWNoLHRoaXMuX3NvdXJjZU1hcFdpbGxBdHRhY2gsdGhpcyksdGhpcy5fc291cmNlTWFwTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5Tb3VyY2VNYXBNYW5hZ2VyLkV2ZW50cy5Tb3VyY2VNYXBGYWlsZWRUb0F0dGFjaCx0aGlzLl9zb3VyY2VNYXBGYWlsZWRUb0F0dGFjaCx0aGlzKSx0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzLlNvdXJjZU1hcEF0dGFjaGVkLHRoaXMuX3NvdXJjZU1hcEF0dGFjaGVkLHRoaXMpLHRoaXMuX3NvdXJjZU1hcE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU291cmNlTWFwTWFuYWdlci5FdmVudHMuU291cmNlTWFwRGV0YWNoZWQsdGhpcy5fc291cmNlTWFwRGV0YWNoZWQsdGhpcyksXTt9Cl9hZGRTdHViVUlTb3VyY2VDb2RlKHNjcmlwdCl7Y29uc3Qgc3R1YlVJU291cmNlQ29kZT10aGlzLl9zdHViUHJvamVjdC5hZGRDb250ZW50UHJvdmlkZXIoc2NyaXB0LnNvdXJjZVVSTCsnOnNvdXJjZW1hcCcsQ29tbW9uLlN0YXRpY0NvbnRlbnRQcm92aWRlci5mcm9tU3RyaW5nKHNjcmlwdC5zb3VyY2VVUkwsQ29tbW9uLnJlc291cmNlVHlwZXMuU2NyaXB0LCdcblxuXG5cblxuLy8gUGxlYXNlIHdhaXQgYSBiaXQuXG4vLyBDb21waWxlZCBzY3JpcHQgaXMgbm90IHNob3duIHdoaWxlIHNvdXJjZSBtYXAgaXMgYmVpbmcgbG9hZGVkIScpLCd0ZXh0L2phdmFzY3JpcHQnKTt0aGlzLl9zdHViVUlTb3VyY2VDb2Rlcy5zZXQoc2NyaXB0LHN0dWJVSVNvdXJjZUNvZGUpO30KX3JlbW92ZVN0dWJVSVNvdXJjZUNvZGUoc2NyaXB0KXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fc3R1YlVJU291cmNlQ29kZXMuZ2V0KHNjcmlwdCk7dGhpcy5fc3R1YlVJU291cmNlQ29kZXMuZGVsZXRlKHNjcmlwdCk7dGhpcy5fc3R1YlByb2plY3QucmVtb3ZlRmlsZSh1aVNvdXJjZUNvZGUudXJsKCkpO3RoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoc2NyaXB0KTt9CnN0YXRpYyB1aVNvdXJjZUNvZGVPcmlnaW4odWlTb3VyY2VDb2RlKXtjb25zdCBzb3VyY2VNYXA9dWlTb3VyY2VDb2RlW0JpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZy5fc291cmNlTWFwU3ltYm9sXTtpZighc291cmNlTWFwKQpyZXR1cm4gbnVsbDtyZXR1cm4gc291cmNlTWFwLmNvbXBpbGVkVVJMKCk7fQptYXBzVG9Tb3VyY2VDb2RlKHJhd0xvY2F0aW9uKXtjb25zdCBzY3JpcHQ9cmF3TG9jYXRpb24uc2NyaXB0KCk7Y29uc3Qgc291cmNlTWFwPXNjcmlwdD90aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNvdXJjZU1hcEZvckNsaWVudChzY3JpcHQpOm51bGw7aWYoIXNvdXJjZU1hcCkKcmV0dXJuIHRydWU7cmV0dXJuISFzb3VyY2VNYXAuZmluZEVudHJ5KHJhd0xvY2F0aW9uLmxpbmVOdW1iZXIscmF3TG9jYXRpb24uY29sdW1uTnVtYmVyKTt9CnVpU291cmNlQ29kZUZvclVSTCh1cmwsaXNDb250ZW50U2NyaXB0KXtyZXR1cm4gaXNDb250ZW50U2NyaXB0P3RoaXMuX2NvbnRlbnRTY3JpcHRzUHJvamVjdC51aVNvdXJjZUNvZGVGb3JVUkwodXJsKTp0aGlzLl9yZWd1bGFyUHJvamVjdC51aVNvdXJjZUNvZGVGb3JVUkwodXJsKTt9CnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXtjb25zdCBzY3JpcHQ9cmF3TG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIG51bGw7Y29uc3QgbGluZU51bWJlcj1yYXdMb2NhdGlvbi5saW5lTnVtYmVyLXNjcmlwdC5saW5lT2Zmc2V0O2xldCBjb2x1bW5OdW1iZXI9cmF3TG9jYXRpb24uY29sdW1uTnVtYmVyO2lmKCFsaW5lTnVtYmVyKQpjb2x1bW5OdW1iZXItPXNjcmlwdC5jb2x1bW5PZmZzZXQ7Y29uc3Qgc3R1YlVJU291cmNlQ29kZT10aGlzLl9zdHViVUlTb3VyY2VDb2Rlcy5nZXQoc2NyaXB0KTtpZihzdHViVUlTb3VyY2VDb2RlKQpyZXR1cm4gbmV3IFdvcmtzcGFjZS5VSUxvY2F0aW9uKHN0dWJVSVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO2NvbnN0IHNvdXJjZU1hcD10aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNvdXJjZU1hcEZvckNsaWVudChzY3JpcHQpO2lmKCFzb3VyY2VNYXApCnJldHVybiBudWxsO2NvbnN0IGVudHJ5PXNvdXJjZU1hcC5maW5kRW50cnkobGluZU51bWJlcixjb2x1bW5OdW1iZXIpO2lmKCFlbnRyeXx8IWVudHJ5LnNvdXJjZVVSTCkKcmV0dXJuIG51bGw7Y29uc3QgdWlTb3VyY2VDb2RlPXNjcmlwdC5pc0NvbnRlbnRTY3JpcHQoKT90aGlzLl9jb250ZW50U2NyaXB0c1Byb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKGVudHJ5LnNvdXJjZVVSTCk6dGhpcy5fcmVndWxhclByb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKGVudHJ5LnNvdXJjZVVSTCk7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIG51bGw7cmV0dXJuIHVpU291cmNlQ29kZS51aUxvY2F0aW9uKChlbnRyeS5zb3VyY2VMaW5lTnVtYmVyKSwoZW50cnkuc291cmNlQ29sdW1uTnVtYmVyKSk7fQp1aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IHNvdXJjZU1hcD11aVNvdXJjZUNvZGVbQmluZGluZ3MuQ29tcGlsZXJTY3JpcHRNYXBwaW5nLl9zb3VyY2VNYXBTeW1ib2xdO2lmKCFzb3VyY2VNYXApCnJldHVybiBudWxsO2NvbnN0IHNjcmlwdHM9dGhpcy5fc291cmNlTWFwTWFuYWdlci5jbGllbnRzRm9yU291cmNlTWFwKHNvdXJjZU1hcCk7Y29uc3Qgc2NyaXB0PXNjcmlwdHMubGVuZ3RoP3NjcmlwdHNbMF06bnVsbDtpZighc2NyaXB0KQpyZXR1cm4gbnVsbDtjb25zdCBlbnRyeT1zb3VyY2VNYXAuc291cmNlTGluZU1hcHBpbmcodWlTb3VyY2VDb2RlLnVybCgpLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtpZighZW50cnkpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9kZWJ1Z2dlck1vZGVsLmNyZWF0ZVJhd0xvY2F0aW9uKHNjcmlwdCxlbnRyeS5saW5lTnVtYmVyK3NjcmlwdC5saW5lT2Zmc2V0LCFlbnRyeS5saW5lTnVtYmVyP2VudHJ5LmNvbHVtbk51bWJlcitzY3JpcHQuY29sdW1uT2Zmc2V0OmVudHJ5LmNvbHVtbk51bWJlcik7fQpfc291cmNlTWFwV2lsbEF0dGFjaChldmVudCl7Y29uc3Qgc2NyaXB0PShldmVudC5kYXRhKTt0aGlzLl9hZGRTdHViVUlTb3VyY2VDb2RlKHNjcmlwdCk7dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30KX3NvdXJjZU1hcEZhaWxlZFRvQXR0YWNoKGV2ZW50KXtjb25zdCBzY3JpcHQ9KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZVN0dWJVSVNvdXJjZUNvZGUoc2NyaXB0KTt9Cl9zb3VyY2VNYXBBdHRhY2hlZChldmVudCl7Y29uc3Qgc2NyaXB0PShldmVudC5kYXRhLmNsaWVudCk7Y29uc3Qgc291cmNlTWFwPShldmVudC5kYXRhLnNvdXJjZU1hcCk7dGhpcy5fcmVtb3ZlU3R1YlVJU291cmNlQ29kZShzY3JpcHQpO2lmKEJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5pc0JsYWNrYm94ZWRVUkwoc2NyaXB0LnNvdXJjZVVSTCxzY3JpcHQuaXNDb250ZW50U2NyaXB0KCkpKQpyZXR1cm47QmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLnNvdXJjZU1hcExvYWRlZChzY3JpcHQsc291cmNlTWFwKTt0aGlzLl9wb3B1bGF0ZVNvdXJjZU1hcFNvdXJjZXMoc2NyaXB0LHNvdXJjZU1hcCk7dGhpcy5fc291cmNlTWFwQXR0YWNoZWRGb3JUZXN0KHNvdXJjZU1hcCk7fQpfc291cmNlTWFwRGV0YWNoZWQoZXZlbnQpe2NvbnN0IHNjcmlwdD0oZXZlbnQuZGF0YS5jbGllbnQpO2NvbnN0IGZyYW1lSWQ9c2NyaXB0W0JpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZy5fZnJhbWVJZFN5bWJvbF07Y29uc3Qgc291cmNlTWFwPShldmVudC5kYXRhLnNvdXJjZU1hcCk7Y29uc3QgYmluZGluZ3M9c2NyaXB0LmlzQ29udGVudFNjcmlwdCgpP3RoaXMuX2NvbnRlbnRTY3JpcHRzQmluZGluZ3M6dGhpcy5fcmVndWxhckJpbmRpbmdzO2Zvcihjb25zdCBzb3VyY2VVUkwgb2Ygc291cmNlTWFwLnNvdXJjZVVSTHMoKSl7Y29uc3QgYmluZGluZz1iaW5kaW5ncy5nZXQoc291cmNlVVJMKTtiaW5kaW5nLnJlbW92ZVNvdXJjZU1hcChzb3VyY2VNYXAsZnJhbWVJZCk7aWYoIWJpbmRpbmcuX3VpU291cmNlQ29kZSkKYmluZGluZ3MuZGVsZXRlKHNvdXJjZVVSTCk7fQp0aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcudXBkYXRlTG9jYXRpb25zKHNjcmlwdCk7fQpzb3VyY2VNYXBGb3JTY3JpcHQoc2NyaXB0KXtyZXR1cm4gdGhpcy5fc291cmNlTWFwTWFuYWdlci5zb3VyY2VNYXBGb3JDbGllbnQoc2NyaXB0KTt9Cm1heWJlTG9hZFNvdXJjZU1hcChzY3JpcHQpe2NvbnN0IHNvdXJjZU1hcD10aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNvdXJjZU1hcEZvckNsaWVudChzY3JpcHQpO2lmKCFzb3VyY2VNYXApCnJldHVybjt0aGlzLl9wb3B1bGF0ZVNvdXJjZU1hcFNvdXJjZXMoc2NyaXB0LHNvdXJjZU1hcCk7fQpfc291cmNlTWFwQXR0YWNoZWRGb3JUZXN0KHNvdXJjZU1hcCl7fQpfcG9wdWxhdGVTb3VyY2VNYXBTb3VyY2VzKHNjcmlwdCxzb3VyY2VNYXApe2NvbnN0IGZyYW1lSWQ9QmluZGluZ3MuZnJhbWVJZEZvclNjcmlwdChzY3JpcHQpO3NjcmlwdFtCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuX2ZyYW1lSWRTeW1ib2xdPWZyYW1lSWQ7Y29uc3QgcHJvamVjdD1zY3JpcHQuaXNDb250ZW50U2NyaXB0KCk/dGhpcy5fY29udGVudFNjcmlwdHNQcm9qZWN0OnRoaXMuX3JlZ3VsYXJQcm9qZWN0O2NvbnN0IGJpbmRpbmdzPXNjcmlwdC5pc0NvbnRlbnRTY3JpcHQoKT90aGlzLl9jb250ZW50U2NyaXB0c0JpbmRpbmdzOnRoaXMuX3JlZ3VsYXJCaW5kaW5ncztmb3IoY29uc3Qgc291cmNlVVJMIG9mIHNvdXJjZU1hcC5zb3VyY2VVUkxzKCkpe2xldCBiaW5kaW5nPWJpbmRpbmdzLmdldChzb3VyY2VVUkwpO2lmKCFiaW5kaW5nKXtiaW5kaW5nPW5ldyBCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuQmluZGluZyhwcm9qZWN0LHNvdXJjZVVSTCk7YmluZGluZ3Muc2V0KHNvdXJjZVVSTCxiaW5kaW5nKTt9CmJpbmRpbmcuYWRkU291cmNlTWFwKHNvdXJjZU1hcCxmcmFtZUlkKTt9CnRoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoc2NyaXB0KTt9CnN0YXRpYyB1aUxpbmVIYXNNYXBwaW5nKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyKXtjb25zdCBzb3VyY2VNYXA9dWlTb3VyY2VDb2RlW0JpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZy5fc291cmNlTWFwU3ltYm9sXTtpZighc291cmNlTWFwKQpyZXR1cm4gdHJ1ZTtyZXR1cm4hIXNvdXJjZU1hcC5zb3VyY2VMaW5lTWFwcGluZyh1aVNvdXJjZUNvZGUudXJsKCksbGluZU51bWJlciwwKTt9CmRpc3Bvc2UoKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO3RoaXMuX3JlZ3VsYXJQcm9qZWN0LmRpc3Bvc2UoKTt0aGlzLl9jb250ZW50U2NyaXB0c1Byb2plY3QuZGlzcG9zZSgpO3RoaXMuX3N0dWJQcm9qZWN0LmRpc3Bvc2UoKTt9fTtCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuX2ZyYW1lSWRTeW1ib2w9U3ltYm9sKCdCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuX2ZyYW1lSWRTeW1ib2wnKTtCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuX3NvdXJjZU1hcFN5bWJvbD1TeW1ib2woJ0JpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZy5fc291cmNlTWFwU3ltYm9sJyk7QmluZGluZ3MuQ29tcGlsZXJTY3JpcHRNYXBwaW5nLkJpbmRpbmc9Y2xhc3N7Y29uc3RydWN0b3IocHJvamVjdCx1cmwpe3RoaXMuX3Byb2plY3Q9cHJvamVjdDt0aGlzLl91cmw9dXJsO3RoaXMuX3JlZmVycmluZ1NvdXJjZU1hcHM9W107dGhpcy5fYWN0aXZlU291cmNlTWFwPW51bGw7dGhpcy5fdWlTb3VyY2VDb2RlPW51bGw7fQpfcmVjcmVhdGVVSVNvdXJjZUNvZGVJZk5lZWRlZChmcmFtZUlkKXtjb25zdCBzb3VyY2VNYXA9dGhpcy5fcmVmZXJyaW5nU291cmNlTWFwcy5wZWVrTGFzdCgpO2lmKHRoaXMuX2FjdGl2ZVNvdXJjZU1hcD09PXNvdXJjZU1hcCkKcmV0dXJuO3RoaXMuX2FjdGl2ZVNvdXJjZU1hcD1zb3VyY2VNYXA7Y29uc3QgbmV3VUlTb3VyY2VDb2RlPXRoaXMuX3Byb2plY3QuY3JlYXRlVUlTb3VyY2VDb2RlKHRoaXMuX3VybCxDb21tb24ucmVzb3VyY2VUeXBlcy5Tb3VyY2VNYXBTY3JpcHQpO25ld1VJU291cmNlQ29kZVtCaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcuX3NvdXJjZU1hcFN5bWJvbF09c291cmNlTWFwO2NvbnN0IGNvbnRlbnRQcm92aWRlcj1zb3VyY2VNYXAuc291cmNlQ29udGVudFByb3ZpZGVyKHRoaXMuX3VybCxDb21tb24ucmVzb3VyY2VUeXBlcy5Tb3VyY2VNYXBTY3JpcHQpO2NvbnN0IG1pbWVUeXBlPUNvbW1vbi5SZXNvdXJjZVR5cGUubWltZUZyb21VUkwodGhpcy5fdXJsKXx8J3RleHQvamF2YXNjcmlwdCc7Y29uc3QgZW1iZWRkZWRDb250ZW50PXNvdXJjZU1hcC5lbWJlZGRlZENvbnRlbnRCeVVSTCh0aGlzLl91cmwpO2NvbnN0IG1ldGFkYXRhPXR5cGVvZiBlbWJlZGRlZENvbnRlbnQ9PT0nc3RyaW5nJz9uZXcgV29ya3NwYWNlLlVJU291cmNlQ29kZU1ldGFkYXRhKG51bGwsZW1iZWRkZWRDb250ZW50Lmxlbmd0aCk6bnVsbDtpZih0aGlzLl91aVNvdXJjZUNvZGUpe0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LmNsb25lSW5pdGlhbEZyYW1lQXR0cmlidXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLG5ld1VJU291cmNlQ29kZSk7dGhpcy5fcHJvamVjdC5yZW1vdmVGaWxlKHRoaXMuX3VpU291cmNlQ29kZS51cmwoKSk7fWVsc2V7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0SW5pdGlhbEZyYW1lQXR0cmlidXRpb24obmV3VUlTb3VyY2VDb2RlLGZyYW1lSWQpO30KdGhpcy5fdWlTb3VyY2VDb2RlPW5ld1VJU291cmNlQ29kZTt0aGlzLl9wcm9qZWN0LmFkZFVJU291cmNlQ29kZVdpdGhQcm92aWRlcih0aGlzLl91aVNvdXJjZUNvZGUsY29udGVudFByb3ZpZGVyLG1ldGFkYXRhLG1pbWVUeXBlKTt9CmFkZFNvdXJjZU1hcChzb3VyY2VNYXAsZnJhbWVJZCl7aWYodGhpcy5fdWlTb3VyY2VDb2RlKQpCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5hZGRGcmFtZUF0dHJpYnV0aW9uKHRoaXMuX3VpU291cmNlQ29kZSxmcmFtZUlkKTt0aGlzLl9yZWZlcnJpbmdTb3VyY2VNYXBzLnB1c2goc291cmNlTWFwKTt0aGlzLl9yZWNyZWF0ZVVJU291cmNlQ29kZUlmTmVlZGVkKGZyYW1lSWQpO30KcmVtb3ZlU291cmNlTWFwKHNvdXJjZU1hcCxmcmFtZUlkKXtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5yZW1vdmVGcmFtZUF0dHJpYnV0aW9uKCh0aGlzLl91aVNvdXJjZUNvZGUpLGZyYW1lSWQpO2NvbnN0IGxhc3RJbmRleD10aGlzLl9yZWZlcnJpbmdTb3VyY2VNYXBzLmxhc3RJbmRleE9mKHNvdXJjZU1hcCk7aWYobGFzdEluZGV4IT09LTEpCnRoaXMuX3JlZmVycmluZ1NvdXJjZU1hcHMuc3BsaWNlKGxhc3RJbmRleCwxKTtpZighdGhpcy5fcmVmZXJyaW5nU291cmNlTWFwcy5sZW5ndGgpe3RoaXMuX3Byb2plY3QucmVtb3ZlRmlsZSh0aGlzLl91aVNvdXJjZUNvZGUudXJsKCkpO3RoaXMuX3VpU291cmNlQ29kZT1udWxsO31lbHNle3RoaXMuX3JlY3JlYXRlVUlTb3VyY2VDb2RlSWZOZWVkZWQoZnJhbWVJZCk7fX19OztCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdE1hcHBpbmc9Y2xhc3N7Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCx3b3Jrc3BhY2UsZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKXt0aGlzLl9kZWJ1Z2dlck1vZGVsPWRlYnVnZ2VyTW9kZWw7dGhpcy5fd29ya3NwYWNlPXdvcmtzcGFjZTt0aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmc9ZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nO3RoaXMuX3VpU291cmNlQ29kZVRvU2NyaXB0RmlsZT1uZXcgTWFwKCk7dGhpcy5fcHJvamVjdHM9bmV3IE1hcCgpO3RoaXMuX2FjY2VwdGVkU2NyaXB0cz1uZXcgU2V0KCk7Y29uc3QgcnVudGltZU1vZGVsPWRlYnVnZ2VyTW9kZWwucnVudGltZU1vZGVsKCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX2RlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuUGFyc2VkU2NyaXB0U291cmNlLHRoaXMuX3BhcnNlZFNjcmlwdFNvdXJjZSx0aGlzKSx0aGlzLl9kZWJ1Z2dlck1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkZhaWxlZFRvUGFyc2VTY3JpcHRTb3VyY2UsdGhpcy5fcGFyc2VkU2NyaXB0U291cmNlLHRoaXMpLHRoaXMuX2RlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuR2xvYmFsT2JqZWN0Q2xlYXJlZCx0aGlzLl9nbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMpLHJ1bnRpbWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SdW50aW1lTW9kZWwuRXZlbnRzLkV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQsdGhpcy5fZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZCx0aGlzKSxdO30KX3Byb2plY3Qoc2NyaXB0KXtjb25zdCBmcmFtZUlkPXNjcmlwdFtCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdE1hcHBpbmcuX2ZyYW1lSWRTeW1ib2xdO2NvbnN0IHByZWZpeD1zY3JpcHQuaXNDb250ZW50U2NyaXB0KCk/J2pzOmV4dGVuc2lvbnM6JzonanM6Oic7Y29uc3QgcHJvamVjdElkPXByZWZpeCt0aGlzLl9kZWJ1Z2dlck1vZGVsLnRhcmdldCgpLmlkKCkrJzonK2ZyYW1lSWQ7bGV0IHByb2plY3Q9dGhpcy5fcHJvamVjdHMuZ2V0KHByb2plY3RJZCk7aWYoIXByb2plY3Qpe2NvbnN0IHByb2plY3RUeXBlPXNjcmlwdC5pc0NvbnRlbnRTY3JpcHQoKT9Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkNvbnRlbnRTY3JpcHRzOldvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yaztwcm9qZWN0PW5ldyBCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3QodGhpcy5fd29ya3NwYWNlLHByb2plY3RJZCxwcm9qZWN0VHlwZSwnJyxmYWxzZSk7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0VGFyZ2V0Rm9yUHJvamVjdChwcm9qZWN0LHRoaXMuX2RlYnVnZ2VyTW9kZWwudGFyZ2V0KCkpO3RoaXMuX3Byb2plY3RzLnNldChwcm9qZWN0SWQscHJvamVjdCk7fQpyZXR1cm4gcHJvamVjdDt9CnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXtjb25zdCBzY3JpcHQ9cmF3TG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIG51bGw7Y29uc3QgcHJvamVjdD10aGlzLl9wcm9qZWN0KHNjcmlwdCk7Y29uc3QgdWlTb3VyY2VDb2RlPXByb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKHNjcmlwdC5zb3VyY2VVUkwpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybiBudWxsO2NvbnN0IHNjcmlwdEZpbGU9dGhpcy5fdWlTb3VyY2VDb2RlVG9TY3JpcHRGaWxlLmdldCh1aVNvdXJjZUNvZGUpO2lmKCFzY3JpcHRGaWxlKQpyZXR1cm4gbnVsbDtpZigoc2NyaXB0RmlsZS5oYXNEaXZlcmdlZEZyb21WTSgpJiYhc2NyaXB0RmlsZS5pc01lcmdpbmdUb1ZNKCkpfHxzY3JpcHRGaWxlLmlzRGl2ZXJnaW5nRnJvbVZNKCkpCnJldHVybiBudWxsO2lmKCFzY3JpcHRGaWxlLl9oYXNTY3JpcHRzKFtzY3JpcHRdKSkKcmV0dXJuIG51bGw7Y29uc3QgbGluZU51bWJlcj1yYXdMb2NhdGlvbi5saW5lTnVtYmVyLShzY3JpcHQuaXNJbmxpbmVTY3JpcHRXaXRoU291cmNlVVJMKCk/c2NyaXB0LmxpbmVPZmZzZXQ6MCk7bGV0IGNvbHVtbk51bWJlcj1yYXdMb2NhdGlvbi5jb2x1bW5OdW1iZXJ8fDA7aWYoc2NyaXB0LmlzSW5saW5lU2NyaXB0V2l0aFNvdXJjZVVSTCgpJiYhbGluZU51bWJlciYmY29sdW1uTnVtYmVyKQpjb2x1bW5OdW1iZXItPXNjcmlwdC5jb2x1bW5PZmZzZXQ7cmV0dXJuIHVpU291cmNlQ29kZS51aUxvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTt9CnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7Y29uc3Qgc2NyaXB0RmlsZT10aGlzLl91aVNvdXJjZUNvZGVUb1NjcmlwdEZpbGUuZ2V0KHVpU291cmNlQ29kZSk7aWYoIXNjcmlwdEZpbGUpCnJldHVybiBudWxsO2NvbnN0IHNjcmlwdD1zY3JpcHRGaWxlLl9zY3JpcHQ7aWYoc2NyaXB0LmlzSW5saW5lU2NyaXB0V2l0aFNvdXJjZVVSTCgpKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbihzY3JpcHQsbGluZU51bWJlcitzY3JpcHQubGluZU9mZnNldCxsaW5lTnVtYmVyP2NvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXIrc2NyaXB0LmNvbHVtbk9mZnNldCk7fQpyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbihzY3JpcHQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KX2FjY2VwdHNTY3JpcHQoc2NyaXB0KXtpZighc2NyaXB0LnNvdXJjZVVSTHx8c2NyaXB0LmlzTGl2ZUVkaXQoKXx8KHNjcmlwdC5pc0lubGluZVNjcmlwdCgpJiYhc2NyaXB0Lmhhc1NvdXJjZVVSTCkpCnJldHVybiBmYWxzZTtpZihzY3JpcHQuaXNDb250ZW50U2NyaXB0KCkmJiFzY3JpcHQuaGFzU291cmNlVVJMKXtjb25zdCBwYXJzZWRVUkw9bmV3IENvbW1vbi5QYXJzZWRVUkwoc2NyaXB0LnNvdXJjZVVSTCk7aWYoIXBhcnNlZFVSTC5pc1ZhbGlkKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9Cl9wYXJzZWRTY3JpcHRTb3VyY2UoZXZlbnQpe2NvbnN0IHNjcmlwdD0oZXZlbnQuZGF0YSk7aWYoIXRoaXMuX2FjY2VwdHNTY3JpcHQoc2NyaXB0KSkKcmV0dXJuO3RoaXMuX2FjY2VwdGVkU2NyaXB0cy5hZGQoc2NyaXB0KTtjb25zdCBvcmlnaW5hbENvbnRlbnRQcm92aWRlcj1zY3JpcHQub3JpZ2luYWxDb250ZW50UHJvdmlkZXIoKTtjb25zdCBmcmFtZUlkPUJpbmRpbmdzLmZyYW1lSWRGb3JTY3JpcHQoc2NyaXB0KTtzY3JpcHRbQmluZGluZ3MuUmVzb3VyY2VTY3JpcHRNYXBwaW5nLl9mcmFtZUlkU3ltYm9sXT1mcmFtZUlkO2NvbnN0IHVybD1zY3JpcHQuc291cmNlVVJMO2NvbnN0IHByb2plY3Q9dGhpcy5fcHJvamVjdChzY3JpcHQpO2NvbnN0IG9sZFVJU291cmNlQ29kZT1wcm9qZWN0LnVpU291cmNlQ29kZUZvclVSTCh1cmwpO2lmKG9sZFVJU291cmNlQ29kZSl7Y29uc3Qgc2NyaXB0RmlsZT10aGlzLl91aVNvdXJjZUNvZGVUb1NjcmlwdEZpbGUuZ2V0KG9sZFVJU291cmNlQ29kZSk7dGhpcy5fcmVtb3ZlU2NyaXB0KHNjcmlwdEZpbGUuX3NjcmlwdCk7fQpjb25zdCB1aVNvdXJjZUNvZGU9cHJvamVjdC5jcmVhdGVVSVNvdXJjZUNvZGUodXJsLG9yaWdpbmFsQ29udGVudFByb3ZpZGVyLmNvbnRlbnRUeXBlKCkpO0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnNldEluaXRpYWxGcmFtZUF0dHJpYnV0aW9uKHVpU291cmNlQ29kZSxmcmFtZUlkKTtjb25zdCBtZXRhZGF0YT1CaW5kaW5ncy5tZXRhZGF0YUZvclVSTCh0aGlzLl9kZWJ1Z2dlck1vZGVsLnRhcmdldCgpLGZyYW1lSWQsdXJsKTtjb25zdCBzY3JpcHRGaWxlPW5ldyBCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdEZpbGUodGhpcyx1aVNvdXJjZUNvZGUsW3NjcmlwdF0pO3RoaXMuX3VpU291cmNlQ29kZVRvU2NyaXB0RmlsZS5zZXQodWlTb3VyY2VDb2RlLHNjcmlwdEZpbGUpO3Byb2plY3QuYWRkVUlTb3VyY2VDb2RlV2l0aFByb3ZpZGVyKHVpU291cmNlQ29kZSxvcmlnaW5hbENvbnRlbnRQcm92aWRlcixtZXRhZGF0YSwndGV4dC9qYXZhc2NyaXB0Jyk7dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30Kc2NyaXB0RmlsZSh1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGVUb1NjcmlwdEZpbGUuZ2V0KHVpU291cmNlQ29kZSl8fG51bGw7fQpfcmVtb3ZlU2NyaXB0KHNjcmlwdCl7aWYoIXRoaXMuX2FjY2VwdGVkU2NyaXB0cy5oYXMoc2NyaXB0KSkKcmV0dXJuO3RoaXMuX2FjY2VwdGVkU2NyaXB0cy5kZWxldGUoc2NyaXB0KTtjb25zdCBwcm9qZWN0PXRoaXMuX3Byb2plY3Qoc2NyaXB0KTtjb25zdCB1aVNvdXJjZUNvZGU9KHByb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKHNjcmlwdC5zb3VyY2VVUkwpKTtjb25zdCBzY3JpcHRGaWxlPXRoaXMuX3VpU291cmNlQ29kZVRvU2NyaXB0RmlsZS5nZXQodWlTb3VyY2VDb2RlKTtzY3JpcHRGaWxlLmRpc3Bvc2UoKTt0aGlzLl91aVNvdXJjZUNvZGVUb1NjcmlwdEZpbGUuZGVsZXRlKHVpU291cmNlQ29kZSk7cHJvamVjdC5yZW1vdmVGaWxlKHNjcmlwdC5zb3VyY2VVUkwpO3RoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoc2NyaXB0KTt9Cl9leGVjdXRpb25Db250ZXh0RGVzdHJveWVkKGV2ZW50KXtjb25zdCBleGVjdXRpb25Db250ZXh0PShldmVudC5kYXRhKTtjb25zdCBzY3JpcHRzPXRoaXMuX2RlYnVnZ2VyTW9kZWwuc2NyaXB0c0ZvckV4ZWN1dGlvbkNvbnRleHQoZXhlY3V0aW9uQ29udGV4dCk7Zm9yKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKQp0aGlzLl9yZW1vdmVTY3JpcHQoc2NyaXB0KTt9Cl9nbG9iYWxPYmplY3RDbGVhcmVkKGV2ZW50KXtjb25zdCBzY3JpcHRzPUFycmF5LmZyb20odGhpcy5fYWNjZXB0ZWRTY3JpcHRzKTtmb3IoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpCnRoaXMuX3JlbW92ZVNjcmlwdChzY3JpcHQpO30KcmVzZXRGb3JUZXN0KCl7Y29uc3Qgc2NyaXB0cz1BcnJheS5mcm9tKHRoaXMuX2FjY2VwdGVkU2NyaXB0cyk7Zm9yKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKQp0aGlzLl9yZW1vdmVTY3JpcHQoc2NyaXB0KTt9CmRpc3Bvc2UoKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO2NvbnN0IHNjcmlwdHM9QXJyYXkuZnJvbSh0aGlzLl9hY2NlcHRlZFNjcmlwdHMpO2Zvcihjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykKdGhpcy5fcmVtb3ZlU2NyaXB0KHNjcmlwdCk7Zm9yKGNvbnN0IHByb2plY3Qgb2YgdGhpcy5fcHJvamVjdHMudmFsdWVzKCkpCnByb2plY3QucmVtb3ZlUHJvamVjdCgpO3RoaXMuX3Byb2plY3RzLmNsZWFyKCk7fX07QmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihyZXNvdXJjZVNjcmlwdE1hcHBpbmcsdWlTb3VyY2VDb2RlLHNjcmlwdHMpe3N1cGVyKCk7Y29uc29sZS5hc3NlcnQoc2NyaXB0cy5sZW5ndGgpO3RoaXMuX3Jlc291cmNlU2NyaXB0TWFwcGluZz1yZXNvdXJjZVNjcmlwdE1hcHBpbmc7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTtpZih0aGlzLl91aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5pc1NjcmlwdCgpKQp0aGlzLl9zY3JpcHQ9c2NyaXB0c1tzY3JpcHRzLmxlbmd0aC0xXTt0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdGhpcy5fd29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMpO3RoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX3dvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMpO30KX2hhc1NjcmlwdHMoc2NyaXB0cyl7cmV0dXJuIHRoaXMuX3NjcmlwdCYmdGhpcy5fc2NyaXB0PT09c2NyaXB0c1swXTt9Cl9pc0RpdmVyZ2VkKCl7aWYodGhpcy5fdWlTb3VyY2VDb2RlLmlzRGlydHkoKSkKcmV0dXJuIHRydWU7aWYoIXRoaXMuX3NjcmlwdCkKcmV0dXJuIGZhbHNlO2lmKHR5cGVvZiB0aGlzLl9zY3JpcHRTb3VyY2U9PT0ndW5kZWZpbmVkJykKcmV0dXJuIGZhbHNlO2NvbnN0IHdvcmtpbmdDb3B5PXRoaXMuX3VpU291cmNlQ29kZS53b3JraW5nQ29weSgpO2lmKCF3b3JraW5nQ29weSkKcmV0dXJuIGZhbHNlO2lmKCF3b3JraW5nQ29weS5zdGFydHNXaXRoKHRoaXMuX3NjcmlwdFNvdXJjZS50cmltUmlnaHQoKSkpCnJldHVybiB0cnVlO2NvbnN0IHN1ZmZpeD10aGlzLl91aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKS5zdWJzdHIodGhpcy5fc2NyaXB0U291cmNlLmxlbmd0aCk7cmV0dXJuISFzdWZmaXgubGVuZ3RoJiYhc3VmZml4Lm1hdGNoKFNESy5TY3JpcHQuc291cmNlVVJMUmVnZXgpO30KX3dvcmtpbmdDb3B5Q2hhbmdlZChldmVudCl7dGhpcy5fdXBkYXRlKCk7fQpfd29ya2luZ0NvcHlDb21taXR0ZWQoZXZlbnQpe2lmKHRoaXMuX3VpU291cmNlQ29kZS5wcm9qZWN0KCkuY2FuU2V0RmlsZUNvbnRlbnQoKSkKcmV0dXJuO2lmKCF0aGlzLl9zY3JpcHQpCnJldHVybjtjb25zdCBkZWJ1Z2dlck1vZGVsPXRoaXMuX3Jlc291cmNlU2NyaXB0TWFwcGluZy5fZGVidWdnZXJNb2RlbDtjb25zdCBicmVha3BvaW50cz1CaW5kaW5ncy5icmVha3BvaW50TWFuYWdlci5icmVha3BvaW50c0ZvclVJU291cmNlQ29kZSh0aGlzLl91aVNvdXJjZUNvZGUpO2NvbnN0IHNvdXJjZT10aGlzLl91aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKTtkZWJ1Z2dlck1vZGVsLnNldFNjcmlwdFNvdXJjZSh0aGlzLl9zY3JpcHQuc2NyaXB0SWQsc291cmNlLHNjcmlwdFNvdXJjZVdhc1NldC5iaW5kKHRoaXMpKTthc3luYyBmdW5jdGlvbiBzY3JpcHRTb3VyY2VXYXNTZXQoZXJyb3IsZXhjZXB0aW9uRGV0YWlscyl7aWYoIWVycm9yJiYhZXhjZXB0aW9uRGV0YWlscykKdGhpcy5fc2NyaXB0U291cmNlPXNvdXJjZTt0aGlzLl91cGRhdGUoKTtpZighZXJyb3ImJiFleGNlcHRpb25EZXRhaWxzKXticmVha3BvaW50cy5tYXAoYnJlYWtwb2ludD0+YnJlYWtwb2ludC5yZWZyZXNoSW5EZWJ1Z2dlcigpKTtyZXR1cm47fQppZighZXhjZXB0aW9uRGV0YWlscyl7Q29tbW9uLmNvbnNvbGUuYWRkTWVzc2FnZShDb21tb24uVUlTdHJpbmcoJ0xpdmVFZGl0IGZhaWxlZDogJXMnLGVycm9yKSxDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuV2FybmluZyk7cmV0dXJuO30KY29uc3QgbWVzc2FnZVRleHQ9Q29tbW9uLlVJU3RyaW5nKCdMaXZlRWRpdCBjb21waWxlIGZhaWxlZDogJXMnLGV4Y2VwdGlvbkRldGFpbHMudGV4dCk7dGhpcy5fdWlTb3VyY2VDb2RlLmFkZExpbmVNZXNzYWdlKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5MZXZlbC5FcnJvcixtZXNzYWdlVGV4dCxleGNlcHRpb25EZXRhaWxzLmxpbmVOdW1iZXIsZXhjZXB0aW9uRGV0YWlscy5jb2x1bW5OdW1iZXIpO319Cl91cGRhdGUoKXtpZih0aGlzLl9pc0RpdmVyZ2VkKCkmJiF0aGlzLl9oYXNEaXZlcmdlZEZyb21WTSkKdGhpcy5fZGl2ZXJnZUZyb21WTSgpO2Vsc2UgaWYoIXRoaXMuX2lzRGl2ZXJnZWQoKSYmdGhpcy5faGFzRGl2ZXJnZWRGcm9tVk0pCnRoaXMuX21lcmdlVG9WTSgpO30KX2RpdmVyZ2VGcm9tVk0oKXt0aGlzLl9pc0RpdmVyZ2luZ0Zyb21WTT10cnVlO3RoaXMuX3Jlc291cmNlU2NyaXB0TWFwcGluZy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyh0aGlzLl9zY3JpcHQpO2RlbGV0ZSB0aGlzLl9pc0RpdmVyZ2luZ0Zyb21WTTt0aGlzLl9oYXNEaXZlcmdlZEZyb21WTT10cnVlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEJpbmRpbmdzLlJlc291cmNlU2NyaXB0RmlsZS5FdmVudHMuRGlkRGl2ZXJnZUZyb21WTSx0aGlzLl91aVNvdXJjZUNvZGUpO30KX21lcmdlVG9WTSgpe2RlbGV0ZSB0aGlzLl9oYXNEaXZlcmdlZEZyb21WTTt0aGlzLl9pc01lcmdpbmdUb1ZNPXRydWU7dGhpcy5fcmVzb3VyY2VTY3JpcHRNYXBwaW5nLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcudXBkYXRlTG9jYXRpb25zKHRoaXMuX3NjcmlwdCk7ZGVsZXRlIHRoaXMuX2lzTWVyZ2luZ1RvVk07dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlLkV2ZW50cy5EaWRNZXJnZVRvVk0sdGhpcy5fdWlTb3VyY2VDb2RlKTt9Cmhhc0RpdmVyZ2VkRnJvbVZNKCl7cmV0dXJuIHRoaXMuX2hhc0RpdmVyZ2VkRnJvbVZNO30KaXNEaXZlcmdpbmdGcm9tVk0oKXtyZXR1cm4gdGhpcy5faXNEaXZlcmdpbmdGcm9tVk07fQppc01lcmdpbmdUb1ZNKCl7cmV0dXJuIHRoaXMuX2lzTWVyZ2luZ1RvVk07fQpjaGVja01hcHBpbmcoKXtpZighdGhpcy5fc2NyaXB0fHx0eXBlb2YgdGhpcy5fc2NyaXB0U291cmNlIT09J3VuZGVmaW5lZCcpe3RoaXMuX21hcHBpbmdDaGVja2VkRm9yVGVzdCgpO3JldHVybjt9CnRoaXMuX3NjcmlwdC5yZXF1ZXN0Q29udGVudCgpLnRoZW4oY2FsbGJhY2suYmluZCh0aGlzKSk7ZnVuY3Rpb24gY2FsbGJhY2soc291cmNlKXt0aGlzLl9zY3JpcHRTb3VyY2U9c291cmNlO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX21hcHBpbmdDaGVja2VkRm9yVGVzdCgpO319Cl9tYXBwaW5nQ2hlY2tlZEZvclRlc3QoKXt9CmRpc3Bvc2UoKXt0aGlzLl91aVNvdXJjZUNvZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdGhpcy5fd29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMpO3RoaXMuX3VpU291cmNlQ29kZS5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX3dvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMpO30KYWRkU291cmNlTWFwVVJMKHNvdXJjZU1hcFVSTCl7aWYoIXRoaXMuX3NjcmlwdCkKcmV0dXJuO3RoaXMuX3NjcmlwdC5kZWJ1Z2dlck1vZGVsLnNldFNvdXJjZU1hcFVSTCh0aGlzLl9zY3JpcHQsc291cmNlTWFwVVJMKTt9Cmhhc1NvdXJjZU1hcFVSTCgpe3JldHVybiB0aGlzLl9zY3JpcHQmJiEhdGhpcy5fc2NyaXB0LnNvdXJjZU1hcFVSTDt9fTtCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdE1hcHBpbmcuX2ZyYW1lSWRTeW1ib2w9U3ltYm9sKCdmcmFtZWlkJyk7QmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlLkV2ZW50cz17RGlkTWVyZ2VUb1ZNOlN5bWJvbCgnRGlkTWVyZ2VUb1ZNJyksRGlkRGl2ZXJnZUZyb21WTTpTeW1ib2woJ0RpZERpdmVyZ2VGcm9tVk0nKSx9OztCaW5kaW5ncy5TQVNTU291cmNlTWFwcGluZz1jbGFzc3tjb25zdHJ1Y3Rvcih0YXJnZXQsc291cmNlTWFwTWFuYWdlcix3b3Jrc3BhY2Upe3RoaXMuX3NvdXJjZU1hcE1hbmFnZXI9c291cmNlTWFwTWFuYWdlcjt0aGlzLl9wcm9qZWN0PW5ldyBCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3Qod29ya3NwYWNlLCdjc3NTb3VyY2VNYXBzOicrdGFyZ2V0LmlkKCksV29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrLCcnLGZhbHNlKTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5zZXRUYXJnZXRGb3JQcm9qZWN0KHRoaXMuX3Byb2plY3QsdGFyZ2V0KTt0aGlzLl9ldmVudExpc3RlbmVycz1bdGhpcy5fc291cmNlTWFwTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5Tb3VyY2VNYXBNYW5hZ2VyLkV2ZW50cy5Tb3VyY2VNYXBBdHRhY2hlZCx0aGlzLl9zb3VyY2VNYXBBdHRhY2hlZCx0aGlzKSx0aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNvdXJjZU1hcE1hbmFnZXIuRXZlbnRzLlNvdXJjZU1hcERldGFjaGVkLHRoaXMuX3NvdXJjZU1hcERldGFjaGVkLHRoaXMpLHRoaXMuX3NvdXJjZU1hcE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU291cmNlTWFwTWFuYWdlci5FdmVudHMuU291cmNlTWFwQ2hhbmdlZCx0aGlzLl9zb3VyY2VNYXBDaGFuZ2VkLHRoaXMpXTt9Cl9zb3VyY2VNYXBBdHRhY2hlZEZvclRlc3Qoc291cmNlTWFwKXt9Cl9zb3VyY2VNYXBBdHRhY2hlZChldmVudCl7Y29uc3QgaGVhZGVyPShldmVudC5kYXRhLmNsaWVudCk7Y29uc3Qgc291cmNlTWFwPShldmVudC5kYXRhLnNvdXJjZU1hcCk7Zm9yKGNvbnN0IHNhc3NVUkwgb2Ygc291cmNlTWFwLnNvdXJjZVVSTHMoKSl7bGV0IHVpU291cmNlQ29kZT10aGlzLl9wcm9qZWN0LnVpU291cmNlQ29kZUZvclVSTChzYXNzVVJMKTtpZih1aVNvdXJjZUNvZGUpe0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LmFkZEZyYW1lQXR0cmlidXRpb24odWlTb3VyY2VDb2RlLGhlYWRlci5mcmFtZUlkKTtjb250aW51ZTt9CmNvbnN0IGNvbnRlbnRQcm92aWRlcj1zb3VyY2VNYXAuc291cmNlQ29udGVudFByb3ZpZGVyKHNhc3NVUkwsQ29tbW9uLnJlc291cmNlVHlwZXMuU291cmNlTWFwU3R5bGVTaGVldCk7Y29uc3QgbWltZVR5cGU9Q29tbW9uLlJlc291cmNlVHlwZS5taW1lRnJvbVVSTChzYXNzVVJMKXx8Y29udGVudFByb3ZpZGVyLmNvbnRlbnRUeXBlKCkuY2Fub25pY2FsTWltZVR5cGUoKTtjb25zdCBlbWJlZGRlZENvbnRlbnQ9c291cmNlTWFwLmVtYmVkZGVkQ29udGVudEJ5VVJMKHNhc3NVUkwpO2NvbnN0IG1ldGFkYXRhPXR5cGVvZiBlbWJlZGRlZENvbnRlbnQ9PT0nc3RyaW5nJz9uZXcgV29ya3NwYWNlLlVJU291cmNlQ29kZU1ldGFkYXRhKG51bGwsZW1iZWRkZWRDb250ZW50Lmxlbmd0aCk6bnVsbDt1aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC5jcmVhdGVVSVNvdXJjZUNvZGUoc2Fzc1VSTCxjb250ZW50UHJvdmlkZXIuY29udGVudFR5cGUoKSk7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0SW5pdGlhbEZyYW1lQXR0cmlidXRpb24odWlTb3VyY2VDb2RlLGhlYWRlci5mcmFtZUlkKTt1aVNvdXJjZUNvZGVbQmluZGluZ3MuU0FTU1NvdXJjZU1hcHBpbmcuX3NvdXJjZU1hcFN5bWJvbF09c291cmNlTWFwO3RoaXMuX3Byb2plY3QuYWRkVUlTb3VyY2VDb2RlV2l0aFByb3ZpZGVyKHVpU291cmNlQ29kZSxjb250ZW50UHJvdmlkZXIsbWV0YWRhdGEsbWltZVR5cGUpO30KQmluZGluZ3MuY3NzV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoaGVhZGVyKTt0aGlzLl9zb3VyY2VNYXBBdHRhY2hlZEZvclRlc3Qoc291cmNlTWFwKTt9Cl9zb3VyY2VNYXBEZXRhY2hlZChldmVudCl7Y29uc3QgaGVhZGVyPShldmVudC5kYXRhLmNsaWVudCk7Y29uc3Qgc291cmNlTWFwPShldmVudC5kYXRhLnNvdXJjZU1hcCk7Y29uc3QgaGVhZGVycz10aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmNsaWVudHNGb3JTb3VyY2VNYXAoc291cmNlTWFwKTtmb3IoY29uc3Qgc2Fzc1VSTCBvZiBzb3VyY2VNYXAuc291cmNlVVJMcygpKXtpZihoZWFkZXJzLmxlbmd0aCl7Y29uc3QgdWlTb3VyY2VDb2RlPSh0aGlzLl9wcm9qZWN0LnVpU291cmNlQ29kZUZvclVSTChzYXNzVVJMKSk7QmluZGluZ3MuTmV0d29ya1Byb2plY3QucmVtb3ZlRnJhbWVBdHRyaWJ1dGlvbih1aVNvdXJjZUNvZGUsaGVhZGVyLmZyYW1lSWQpO31lbHNle3RoaXMuX3Byb2plY3QucmVtb3ZlRmlsZShzYXNzVVJMKTt9fQpCaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhoZWFkZXIpO30KX3NvdXJjZU1hcENoYW5nZWQoZXZlbnQpe2NvbnN0IHNvdXJjZU1hcD0oZXZlbnQuZGF0YS5zb3VyY2VNYXApO2NvbnN0IG5ld1NvdXJjZXM9KGV2ZW50LmRhdGEubmV3U291cmNlcyk7Y29uc3QgaGVhZGVycz10aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLmNsaWVudHNGb3JTb3VyY2VNYXAoc291cmNlTWFwKTtmb3IoY29uc3Qgc291cmNlVVJMIG9mIG5ld1NvdXJjZXMua2V5cygpKXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC51aVNvdXJjZUNvZGVGb3JVUkwoc291cmNlVVJMKTtpZighdWlTb3VyY2VDb2RlKXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIHNvdXJjZSBmb3IgJytzb3VyY2VVUkwpO2NvbnRpbnVlO30KY29uc3Qgc2Fzc1RleHQ9KG5ld1NvdXJjZXMuZ2V0KHNvdXJjZVVSTCkpO3VpU291cmNlQ29kZS5zZXRXb3JraW5nQ29weShzYXNzVGV4dCk7fQpmb3IoY29uc3QgaGVhZGVyIG9mIGhlYWRlcnMpCkJpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmcudXBkYXRlTG9jYXRpb25zKGhlYWRlcik7fQpyYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbil7Y29uc3QgaGVhZGVyPXJhd0xvY2F0aW9uLmhlYWRlcigpO2lmKCFoZWFkZXIpCnJldHVybiBudWxsO2NvbnN0IHNvdXJjZU1hcD10aGlzLl9zb3VyY2VNYXBNYW5hZ2VyLnNvdXJjZU1hcEZvckNsaWVudChoZWFkZXIpO2lmKCFzb3VyY2VNYXApCnJldHVybiBudWxsO2NvbnN0IGVudHJ5PXNvdXJjZU1hcC5maW5kRW50cnkocmF3TG9jYXRpb24ubGluZU51bWJlcixyYXdMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2lmKCFlbnRyeXx8IWVudHJ5LnNvdXJjZVVSTCkKcmV0dXJuIG51bGw7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKGVudHJ5LnNvdXJjZVVSTCk7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIG51bGw7cmV0dXJuIHVpU291cmNlQ29kZS51aUxvY2F0aW9uKGVudHJ5LnNvdXJjZUxpbmVOdW1iZXJ8fDAsZW50cnkuc291cmNlQ29sdW1uTnVtYmVyKTt9CnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9ucyh1aUxvY2F0aW9uKXtjb25zdCBzb3VyY2VNYXA9dWlMb2NhdGlvbi51aVNvdXJjZUNvZGVbQmluZGluZ3MuU0FTU1NvdXJjZU1hcHBpbmcuX3NvdXJjZU1hcFN5bWJvbF07aWYoIXNvdXJjZU1hcCkKcmV0dXJuW107Y29uc3QgZW50cmllcz1zb3VyY2VNYXAuZmluZFJldmVyc2VFbnRyaWVzKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLnVybCgpLHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcik7Y29uc3QgbG9jYXRpb25zPVtdO2Zvcihjb25zdCBoZWFkZXIgb2YgdGhpcy5fc291cmNlTWFwTWFuYWdlci5jbGllbnRzRm9yU291cmNlTWFwKHNvdXJjZU1hcCkpCmxvY2F0aW9ucy5wdXNoQWxsKGVudHJpZXMubWFwKGVudHJ5PT5uZXcgU0RLLkNTU0xvY2F0aW9uKGhlYWRlcixlbnRyeS5saW5lTnVtYmVyLGVudHJ5LmNvbHVtbk51bWJlcikpKTtyZXR1cm4gbG9jYXRpb25zO30KZGlzcG9zZSgpe3RoaXMuX3Byb2plY3QuZGlzcG9zZSgpO0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7fX07QmluZGluZ3MuU0FTU1NvdXJjZU1hcHBpbmcuX3NvdXJjZU1hcFN5bWJvbD1TeW1ib2woJ3NvdXJjZU1hcCcpOztCaW5kaW5ncy5TdHlsZXNTb3VyY2VNYXBwaW5nPWNsYXNze2NvbnN0cnVjdG9yKGNzc01vZGVsLHdvcmtzcGFjZSl7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7Y29uc3QgdGFyZ2V0PXRoaXMuX2Nzc01vZGVsLnRhcmdldCgpO3RoaXMuX3Byb2plY3Q9bmV3IEJpbmRpbmdzLkNvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdCh3b3Jrc3BhY2UsJ2NzczonK3RhcmdldC5pZCgpLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yaywnJyxmYWxzZSk7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0VGFyZ2V0Rm9yUHJvamVjdCh0aGlzLl9wcm9qZWN0LHRhcmdldCk7dGhpcy5fc3R5bGVGaWxlcz1uZXcgTWFwKCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX2Nzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0QWRkZWQsdGhpcy5fc3R5bGVTaGVldEFkZGVkLHRoaXMpLHRoaXMuX2Nzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0UmVtb3ZlZCx0aGlzLl9zdHlsZVNoZWV0UmVtb3ZlZCx0aGlzKSx0aGlzLl9jc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuU3R5bGVTaGVldENoYW5nZWQsdGhpcy5fc3R5bGVTaGVldENoYW5nZWQsdGhpcyksXTt9CnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXtjb25zdCBoZWFkZXI9cmF3TG9jYXRpb24uaGVhZGVyKCk7aWYoIWhlYWRlcnx8IXRoaXMuX2FjY2VwdHNIZWFkZXIoaGVhZGVyKSkKcmV0dXJuIG51bGw7Y29uc3Qgc3R5bGVGaWxlPXRoaXMuX3N0eWxlRmlsZXMuZ2V0KGhlYWRlci5yZXNvdXJjZVVSTCgpKTtpZighc3R5bGVGaWxlKQpyZXR1cm4gbnVsbDtsZXQgbGluZU51bWJlcj1yYXdMb2NhdGlvbi5saW5lTnVtYmVyO2xldCBjb2x1bW5OdW1iZXI9cmF3TG9jYXRpb24uY29sdW1uTnVtYmVyO2lmKGhlYWRlci5pc0lubGluZSYmaGVhZGVyLmhhc1NvdXJjZVVSTCl7bGluZU51bWJlci09aGVhZGVyLmxpbmVOdW1iZXJJblNvdXJjZSgwKTtjb2x1bW5OdW1iZXItPWhlYWRlci5jb2x1bW5OdW1iZXJJblNvdXJjZShsaW5lTnVtYmVyLDApO30KcmV0dXJuIHN0eWxlRmlsZS5fdWlTb3VyY2VDb2RlLnVpTG9jYXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KdWlMb2NhdGlvblRvUmF3TG9jYXRpb25zKHVpTG9jYXRpb24pe2NvbnN0IHN0eWxlRmlsZT11aUxvY2F0aW9uLnVpU291cmNlQ29kZVtCaW5kaW5ncy5TdHlsZUZpbGUuX3N5bWJvbF07aWYoIXN0eWxlRmlsZSkKcmV0dXJuW107Y29uc3QgcmF3TG9jYXRpb25zPVtdO2Zvcihjb25zdCBoZWFkZXIgb2Ygc3R5bGVGaWxlLl9oZWFkZXJzKXtsZXQgbGluZU51bWJlcj11aUxvY2F0aW9uLmxpbmVOdW1iZXI7bGV0IGNvbHVtbk51bWJlcj11aUxvY2F0aW9uLmNvbHVtbk51bWJlcjtpZihoZWFkZXIuaXNJbmxpbmUmJmhlYWRlci5oYXNTb3VyY2VVUkwpe2NvbHVtbk51bWJlcj1oZWFkZXIuY29sdW1uTnVtYmVySW5Tb3VyY2UobGluZU51bWJlcixjb2x1bW5OdW1iZXIpO2xpbmVOdW1iZXI9aGVhZGVyLmxpbmVOdW1iZXJJblNvdXJjZShsaW5lTnVtYmVyKTt9CnJhd0xvY2F0aW9ucy5wdXNoKG5ldyBTREsuQ1NTTG9jYXRpb24oaGVhZGVyLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKSk7fQpyZXR1cm4gcmF3TG9jYXRpb25zO30KX2FjY2VwdHNIZWFkZXIoaGVhZGVyKXtpZihoZWFkZXIuaXNJbmxpbmUmJiFoZWFkZXIuaGFzU291cmNlVVJMJiZoZWFkZXIub3JpZ2luIT09J2luc3BlY3RvcicpCnJldHVybiBmYWxzZTtpZighaGVhZGVyLnJlc291cmNlVVJMKCkpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9Cl9zdHlsZVNoZWV0QWRkZWQoZXZlbnQpe2NvbnN0IGhlYWRlcj0oZXZlbnQuZGF0YSk7aWYoIXRoaXMuX2FjY2VwdHNIZWFkZXIoaGVhZGVyKSkKcmV0dXJuO2NvbnN0IHVybD1oZWFkZXIucmVzb3VyY2VVUkwoKTtsZXQgc3R5bGVGaWxlPXRoaXMuX3N0eWxlRmlsZXMuZ2V0KHVybCk7aWYoIXN0eWxlRmlsZSl7c3R5bGVGaWxlPW5ldyBCaW5kaW5ncy5TdHlsZUZpbGUodGhpcy5fY3NzTW9kZWwsdGhpcy5fcHJvamVjdCxoZWFkZXIpO3RoaXMuX3N0eWxlRmlsZXMuc2V0KHVybCxzdHlsZUZpbGUpO31lbHNle3N0eWxlRmlsZS5hZGRIZWFkZXIoaGVhZGVyKTt9fQpfc3R5bGVTaGVldFJlbW92ZWQoZXZlbnQpe2NvbnN0IGhlYWRlcj0oZXZlbnQuZGF0YSk7aWYoIXRoaXMuX2FjY2VwdHNIZWFkZXIoaGVhZGVyKSkKcmV0dXJuO2NvbnN0IHVybD1oZWFkZXIucmVzb3VyY2VVUkwoKTtjb25zdCBzdHlsZUZpbGU9dGhpcy5fc3R5bGVGaWxlcy5nZXQodXJsKTtpZihzdHlsZUZpbGUuX2hlYWRlcnMuc2l6ZT09PTEpe3N0eWxlRmlsZS5kaXNwb3NlKCk7dGhpcy5fc3R5bGVGaWxlcy5kZWxldGUodXJsKTt9ZWxzZXtzdHlsZUZpbGUucmVtb3ZlSGVhZGVyKGhlYWRlcik7fX0KX3N0eWxlU2hlZXRDaGFuZ2VkKGV2ZW50KXtjb25zdCBoZWFkZXI9dGhpcy5fY3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKGV2ZW50LmRhdGEuc3R5bGVTaGVldElkKTtpZighaGVhZGVyfHwhdGhpcy5fYWNjZXB0c0hlYWRlcihoZWFkZXIpKQpyZXR1cm47Y29uc3Qgc3R5bGVGaWxlPXRoaXMuX3N0eWxlRmlsZXMuZ2V0KGhlYWRlci5yZXNvdXJjZVVSTCgpKTtzdHlsZUZpbGUuX3N0eWxlU2hlZXRDaGFuZ2VkKGhlYWRlcik7fQpkaXNwb3NlKCl7Zm9yKGNvbnN0IHN0eWxlRmlsZSBvZiB0aGlzLl9zdHlsZUZpbGVzLnZhbHVlcygpKQpzdHlsZUZpbGUuZGlzcG9zZSgpO3RoaXMuX3N0eWxlRmlsZXMuY2xlYXIoKTtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO3RoaXMuX3Byb2plY3QucmVtb3ZlUHJvamVjdCgpO319O0JpbmRpbmdzLlN0eWxlRmlsZT1jbGFzc3tjb25zdHJ1Y3Rvcihjc3NNb2RlbCxwcm9qZWN0LGhlYWRlcil7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5fcHJvamVjdD1wcm9qZWN0O3RoaXMuX2hlYWRlcnM9bmV3IFNldChbaGVhZGVyXSk7Y29uc3QgdGFyZ2V0PWNzc01vZGVsLnRhcmdldCgpO2NvbnN0IHVybD1oZWFkZXIucmVzb3VyY2VVUkwoKTtjb25zdCBtZXRhZGF0YT1CaW5kaW5ncy5tZXRhZGF0YUZvclVSTCh0YXJnZXQsaGVhZGVyLmZyYW1lSWQsdXJsKTt0aGlzLl91aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC5jcmVhdGVVSVNvdXJjZUNvZGUodXJsLGhlYWRlci5jb250ZW50VHlwZSgpKTt0aGlzLl91aVNvdXJjZUNvZGVbQmluZGluZ3MuU3R5bGVGaWxlLl9zeW1ib2xdPXRoaXM7QmluZGluZ3MuTmV0d29ya1Byb2plY3Quc2V0SW5pdGlhbEZyYW1lQXR0cmlidXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLGhlYWRlci5mcmFtZUlkKTt0aGlzLl9wcm9qZWN0LmFkZFVJU291cmNlQ29kZVdpdGhQcm92aWRlcih0aGlzLl91aVNvdXJjZUNvZGUsdGhpcyxtZXRhZGF0YSwndGV4dC9jc3MnKTt0aGlzLl9ldmVudExpc3RlbmVycz1bdGhpcy5fdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX3dvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKSx0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl93b3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKV07dGhpcy5fdGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKEJpbmRpbmdzLlN0eWxlRmlsZS51cGRhdGVUaW1lb3V0KTt0aGlzLl90ZXJtaW5hdGVkPWZhbHNlO30KYWRkSGVhZGVyKGhlYWRlcil7dGhpcy5faGVhZGVycy5hZGQoaGVhZGVyKTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5hZGRGcmFtZUF0dHJpYnV0aW9uKHRoaXMuX3VpU291cmNlQ29kZSxoZWFkZXIuZnJhbWVJZCk7fQpyZW1vdmVIZWFkZXIoaGVhZGVyKXt0aGlzLl9oZWFkZXJzLmRlbGV0ZShoZWFkZXIpO0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnJlbW92ZUZyYW1lQXR0cmlidXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLGhlYWRlci5mcmFtZUlkKTt9Cl9zdHlsZVNoZWV0Q2hhbmdlZChoZWFkZXIpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2hlYWRlcnMuaGFzKGhlYWRlcikpO2lmKHRoaXMuX2lzVXBkYXRpbmdIZWFkZXJzfHwhdGhpcy5faGVhZGVycy5oYXMoaGVhZGVyKSkKcmV0dXJuO2NvbnN0IG1pcnJvckNvbnRlbnRCb3VuZD10aGlzLl9taXJyb3JDb250ZW50LmJpbmQodGhpcyxoZWFkZXIsdHJ1ZSk7dGhpcy5fdGhyb3R0bGVyLnNjaGVkdWxlKG1pcnJvckNvbnRlbnRCb3VuZCxmYWxzZSk7fQpfd29ya2luZ0NvcHlDb21taXR0ZWQoZXZlbnQpe2lmKHRoaXMuX2lzQWRkaW5nUmV2aXNpb24pCnJldHVybjtjb25zdCBtaXJyb3JDb250ZW50Qm91bmQ9dGhpcy5fbWlycm9yQ29udGVudC5iaW5kKHRoaXMsdGhpcy5fdWlTb3VyY2VDb2RlLHRydWUpO3RoaXMuX3Rocm90dGxlci5zY2hlZHVsZShtaXJyb3JDb250ZW50Qm91bmQsdHJ1ZSk7fQpfd29ya2luZ0NvcHlDaGFuZ2VkKGV2ZW50KXtpZih0aGlzLl9pc0FkZGluZ1JldmlzaW9uKQpyZXR1cm47Y29uc3QgbWlycm9yQ29udGVudEJvdW5kPXRoaXMuX21pcnJvckNvbnRlbnQuYmluZCh0aGlzLHRoaXMuX3VpU291cmNlQ29kZSxmYWxzZSk7dGhpcy5fdGhyb3R0bGVyLnNjaGVkdWxlKG1pcnJvckNvbnRlbnRCb3VuZCxmYWxzZSk7fQphc3luYyBfbWlycm9yQ29udGVudChmcm9tUHJvdmlkZXIsbWFqb3JDaGFuZ2Upe2lmKHRoaXMuX3Rlcm1pbmF0ZWQpe3RoaXMuX3N0eWxlRmlsZVN5bmNlZEZvclRlc3QoKTtyZXR1cm47fQpsZXQgbmV3Q29udGVudD1udWxsO2lmKGZyb21Qcm92aWRlcj09PXRoaXMuX3VpU291cmNlQ29kZSl7bmV3Q29udGVudD10aGlzLl91aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKTt9ZWxzZXtuZXdDb250ZW50PWF3YWl0IGZyb21Qcm92aWRlci5yZXF1ZXN0Q29udGVudCgpO30KaWYobmV3Q29udGVudD09PW51bGx8fHRoaXMuX3Rlcm1pbmF0ZWQpe3RoaXMuX3N0eWxlRmlsZVN5bmNlZEZvclRlc3QoKTtyZXR1cm47fQppZihmcm9tUHJvdmlkZXIhPT10aGlzLl91aVNvdXJjZUNvZGUpe3RoaXMuX2lzQWRkaW5nUmV2aXNpb249dHJ1ZTt0aGlzLl91aVNvdXJjZUNvZGUuYWRkUmV2aXNpb24obmV3Q29udGVudCk7dGhpcy5faXNBZGRpbmdSZXZpc2lvbj1mYWxzZTt9CnRoaXMuX2lzVXBkYXRpbmdIZWFkZXJzPXRydWU7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGNvbnN0IGhlYWRlciBvZiB0aGlzLl9oZWFkZXJzKXtpZihoZWFkZXI9PT1mcm9tUHJvdmlkZXIpCmNvbnRpbnVlO3Byb21pc2VzLnB1c2godGhpcy5fY3NzTW9kZWwuc2V0U3R5bGVTaGVldFRleHQoaGVhZGVyLmlkLG5ld0NvbnRlbnQsbWFqb3JDaGFuZ2UpKTt9CmF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTt0aGlzLl9pc1VwZGF0aW5nSGVhZGVycz1mYWxzZTt0aGlzLl9zdHlsZUZpbGVTeW5jZWRGb3JUZXN0KCk7fQpfc3R5bGVGaWxlU3luY2VkRm9yVGVzdCgpe30KZGlzcG9zZSgpe2lmKHRoaXMuX3Rlcm1pbmF0ZWQpCnJldHVybjt0aGlzLl90ZXJtaW5hdGVkPXRydWU7dGhpcy5fcHJvamVjdC5yZW1vdmVGaWxlKHRoaXMuX3VpU291cmNlQ29kZS51cmwoKSk7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2V2ZW50TGlzdGVuZXJzKTt9CmNvbnRlbnRVUkwoKXtyZXR1cm4gdGhpcy5faGVhZGVycy5maXJzdFZhbHVlKCkub3JpZ2luYWxDb250ZW50UHJvdmlkZXIoKS5jb250ZW50VVJMKCk7fQpjb250ZW50VHlwZSgpe3JldHVybiB0aGlzLl9oZWFkZXJzLmZpcnN0VmFsdWUoKS5vcmlnaW5hbENvbnRlbnRQcm92aWRlcigpLmNvbnRlbnRUeXBlKCk7fQpjb250ZW50RW5jb2RlZCgpe3JldHVybiB0aGlzLl9oZWFkZXJzLmZpcnN0VmFsdWUoKS5vcmlnaW5hbENvbnRlbnRQcm92aWRlcigpLmNvbnRlbnRFbmNvZGVkKCk7fQpyZXF1ZXN0Q29udGVudCgpe3JldHVybiB0aGlzLl9oZWFkZXJzLmZpcnN0VmFsdWUoKS5vcmlnaW5hbENvbnRlbnRQcm92aWRlcigpLnJlcXVlc3RDb250ZW50KCk7fQpzZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtyZXR1cm4gdGhpcy5faGVhZGVycy5maXJzdFZhbHVlKCkub3JpZ2luYWxDb250ZW50UHJvdmlkZXIoKS5zZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTt9fTtCaW5kaW5ncy5TdHlsZUZpbGUuX3N5bWJvbD1TeW1ib2woJ0JpbmRpbmdzLlN0eWxlRmlsZS5fc3ltYm9sJyk7QmluZGluZ3MuU3R5bGVGaWxlLnVwZGF0ZVRpbWVvdXQ9MjAwOztCaW5kaW5ncy5DU1NXb3Jrc3BhY2VCaW5kaW5nPWNsYXNze2NvbnN0cnVjdG9yKHRhcmdldE1hbmFnZXIsd29ya3NwYWNlKXt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX21vZGVsVG9JbmZvPW5ldyBNYXAoKTt0aGlzLl9zb3VyY2VNYXBwaW5ncz1bXTt0YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkNTU01vZGVsLHRoaXMpO30KbW9kZWxBZGRlZChjc3NNb2RlbCl7dGhpcy5fbW9kZWxUb0luZm8uc2V0KGNzc01vZGVsLG5ldyBCaW5kaW5ncy5DU1NXb3Jrc3BhY2VCaW5kaW5nLk1vZGVsSW5mbyhjc3NNb2RlbCx0aGlzLl93b3Jrc3BhY2UpKTt9Cm1vZGVsUmVtb3ZlZChjc3NNb2RlbCl7dGhpcy5fbW9kZWxUb0luZm8uZ2V0KGNzc01vZGVsKS5fZGlzcG9zZSgpO3RoaXMuX21vZGVsVG9JbmZvLmRlbGV0ZShjc3NNb2RlbCk7fQp1cGRhdGVMb2NhdGlvbnMoaGVhZGVyKXt0aGlzLl9tb2RlbFRvSW5mby5nZXQoaGVhZGVyLmNzc01vZGVsKCkpLl91cGRhdGVMb2NhdGlvbnMoaGVhZGVyKTt9CmNyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe3JldHVybiB0aGlzLl9tb2RlbFRvSW5mby5nZXQocmF3TG9jYXRpb24uY3NzTW9kZWwoKSkuX2NyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpO30KcHJvcGVydHlVSUxvY2F0aW9uKGNzc1Byb3BlcnR5LGZvck5hbWUpe2NvbnN0IHN0eWxlPWNzc1Byb3BlcnR5Lm93bmVyU3R5bGU7aWYoIXN0eWxlfHxzdHlsZS50eXBlIT09U0RLLkNTU1N0eWxlRGVjbGFyYXRpb24uVHlwZS5SZWd1bGFyfHwhc3R5bGUuc3R5bGVTaGVldElkKQpyZXR1cm4gbnVsbDtjb25zdCBoZWFkZXI9c3R5bGUuY3NzTW9kZWwoKS5zdHlsZVNoZWV0SGVhZGVyRm9ySWQoc3R5bGUuc3R5bGVTaGVldElkKTtpZighaGVhZGVyKQpyZXR1cm4gbnVsbDtjb25zdCByYW5nZT1mb3JOYW1lP2Nzc1Byb3BlcnR5Lm5hbWVSYW5nZSgpOmNzc1Byb3BlcnR5LnZhbHVlUmFuZ2UoKTtpZighcmFuZ2UpCnJldHVybiBudWxsO2NvbnN0IGxpbmVOdW1iZXI9cmFuZ2Uuc3RhcnRMaW5lO2NvbnN0IGNvbHVtbk51bWJlcj1yYW5nZS5zdGFydENvbHVtbjtjb25zdCByYXdMb2NhdGlvbj1uZXcgU0RLLkNTU0xvY2F0aW9uKGhlYWRlcixoZWFkZXIubGluZU51bWJlckluU291cmNlKGxpbmVOdW1iZXIpLGhlYWRlci5jb2x1bW5OdW1iZXJJblNvdXJjZShsaW5lTnVtYmVyLGNvbHVtbk51bWJlcikpO3JldHVybiB0aGlzLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTt9CnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXtmb3IobGV0IGk9dGhpcy5fc291cmNlTWFwcGluZ3MubGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IHVpTG9jYXRpb249dGhpcy5fc291cmNlTWFwcGluZ3NbaV0ucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO2lmKHVpTG9jYXRpb24pCnJldHVybiB1aUxvY2F0aW9uO30KcmV0dXJuIHRoaXMuX21vZGVsVG9JbmZvLmdldChyYXdMb2NhdGlvbi5jc3NNb2RlbCgpKS5fcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO30KdWlMb2NhdGlvblRvUmF3TG9jYXRpb25zKHVpTG9jYXRpb24pe2ZvcihsZXQgaT10aGlzLl9zb3VyY2VNYXBwaW5ncy5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgcmF3TG9jYXRpb25zPXRoaXMuX3NvdXJjZU1hcHBpbmdzW2ldLnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9ucyh1aUxvY2F0aW9uKTtpZihyYXdMb2NhdGlvbnMubGVuZ3RoKQpyZXR1cm4gcmF3TG9jYXRpb25zO30KY29uc3QgcmF3TG9jYXRpb25zPVtdO2Zvcihjb25zdCBtb2RlbEluZm8gb2YgdGhpcy5fbW9kZWxUb0luZm8udmFsdWVzKCkpCnJhd0xvY2F0aW9ucy5wdXNoQWxsKG1vZGVsSW5mby5fdWlMb2NhdGlvblRvUmF3TG9jYXRpb25zKHVpTG9jYXRpb24pKTtyZXR1cm4gcmF3TG9jYXRpb25zO30KYWRkU291cmNlTWFwcGluZyhzb3VyY2VNYXBwaW5nKXt0aGlzLl9zb3VyY2VNYXBwaW5ncy5wdXNoKHNvdXJjZU1hcHBpbmcpO319O0JpbmRpbmdzLkNTU1dvcmtzcGFjZUJpbmRpbmcuU291cmNlTWFwcGluZz1mdW5jdGlvbigpe307QmluZGluZ3MuQ1NTV29ya3NwYWNlQmluZGluZy5Tb3VyY2VNYXBwaW5nLnByb3RvdHlwZT17cmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe30sdWlMb2NhdGlvblRvUmF3TG9jYXRpb25zKHVpTG9jYXRpb24pe30sfTtCaW5kaW5ncy5DU1NXb3Jrc3BhY2VCaW5kaW5nLk1vZGVsSW5mbz1jbGFzc3tjb25zdHJ1Y3Rvcihjc3NNb2RlbCx3b3Jrc3BhY2Upe3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtjc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuU3R5bGVTaGVldEFkZGVkLHRoaXMuX3N0eWxlU2hlZXRBZGRlZCx0aGlzKSxjc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuU3R5bGVTaGVldFJlbW92ZWQsdGhpcy5fc3R5bGVTaGVldFJlbW92ZWQsdGhpcyldO3RoaXMuX3N0eWxlc1NvdXJjZU1hcHBpbmc9bmV3IEJpbmRpbmdzLlN0eWxlc1NvdXJjZU1hcHBpbmcoY3NzTW9kZWwsd29ya3NwYWNlKTtjb25zdCBzb3VyY2VNYXBNYW5hZ2VyPWNzc01vZGVsLnNvdXJjZU1hcE1hbmFnZXIoKTt0aGlzLl9zYXNzU291cmNlTWFwcGluZz1uZXcgQmluZGluZ3MuU0FTU1NvdXJjZU1hcHBpbmcoY3NzTW9kZWwudGFyZ2V0KCksc291cmNlTWFwTWFuYWdlcix3b3Jrc3BhY2UpO3RoaXMuX2xvY2F0aW9ucz1uZXcgTXVsdGltYXAoKTt0aGlzLl91bmJvdW5kTG9jYXRpb25zPW5ldyBNdWx0aW1hcCgpO30KX2NyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe2NvbnN0IGxvY2F0aW9uPW5ldyBCaW5kaW5ncy5DU1NXb3Jrc3BhY2VCaW5kaW5nLkxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix0aGlzLHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCk7Y29uc3QgaGVhZGVyPXJhd0xvY2F0aW9uLmhlYWRlcigpO2lmKGhlYWRlcil7bG9jYXRpb24uX2hlYWRlcj1oZWFkZXI7dGhpcy5fbG9jYXRpb25zLnNldChoZWFkZXIsbG9jYXRpb24pO2xvY2F0aW9uLnVwZGF0ZSgpO31lbHNle3RoaXMuX3VuYm91bmRMb2NhdGlvbnMuc2V0KHJhd0xvY2F0aW9uLnVybCxsb2NhdGlvbik7fQpyZXR1cm4gbG9jYXRpb247fQpfZGlzcG9zZUxvY2F0aW9uKGxvY2F0aW9uKXtpZihsb2NhdGlvbi5faGVhZGVyKQp0aGlzLl9sb2NhdGlvbnMuZGVsZXRlKGxvY2F0aW9uLl9oZWFkZXIsbG9jYXRpb24pO2Vsc2UKdGhpcy5fdW5ib3VuZExvY2F0aW9ucy5kZWxldGUobG9jYXRpb24uX3VybCxsb2NhdGlvbik7fQpfdXBkYXRlTG9jYXRpb25zKGhlYWRlcil7Zm9yKGNvbnN0IGxvY2F0aW9uIG9mIHRoaXMuX2xvY2F0aW9ucy5nZXQoaGVhZGVyKSkKbG9jYXRpb24udXBkYXRlKCk7fQpfc3R5bGVTaGVldEFkZGVkKGV2ZW50KXtjb25zdCBoZWFkZXI9KGV2ZW50LmRhdGEpO2lmKCFoZWFkZXIuc291cmNlVVJMKQpyZXR1cm47Zm9yKGNvbnN0IGxvY2F0aW9uIG9mIHRoaXMuX3VuYm91bmRMb2NhdGlvbnMuZ2V0KGhlYWRlci5zb3VyY2VVUkwpKXtsb2NhdGlvbi5faGVhZGVyPWhlYWRlcjt0aGlzLl9sb2NhdGlvbnMuc2V0KGhlYWRlcixsb2NhdGlvbik7bG9jYXRpb24udXBkYXRlKCk7fQp0aGlzLl91bmJvdW5kTG9jYXRpb25zLmRlbGV0ZUFsbChoZWFkZXIuc291cmNlVVJMKTt9Cl9zdHlsZVNoZWV0UmVtb3ZlZChldmVudCl7Y29uc3QgaGVhZGVyPShldmVudC5kYXRhKTtmb3IoY29uc3QgbG9jYXRpb24gb2YgdGhpcy5fbG9jYXRpb25zLmdldChoZWFkZXIpKXtsb2NhdGlvbi5faGVhZGVyPW51bGw7dGhpcy5fdW5ib3VuZExvY2F0aW9ucy5zZXQobG9jYXRpb24uX3VybCxsb2NhdGlvbik7bG9jYXRpb24udXBkYXRlKCk7fQp0aGlzLl9sb2NhdGlvbnMuZGVsZXRlQWxsKGhlYWRlcik7fQpfcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe2xldCB1aUxvY2F0aW9uPW51bGw7dWlMb2NhdGlvbj11aUxvY2F0aW9ufHx0aGlzLl9zYXNzU291cmNlTWFwcGluZy5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbik7dWlMb2NhdGlvbj11aUxvY2F0aW9ufHx0aGlzLl9zdHlsZXNTb3VyY2VNYXBwaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTt1aUxvY2F0aW9uPXVpTG9jYXRpb258fEJpbmRpbmdzLnJlc291cmNlTWFwcGluZy5jc3NMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbik7cmV0dXJuIHVpTG9jYXRpb247fQpfdWlMb2NhdGlvblRvUmF3TG9jYXRpb25zKHVpTG9jYXRpb24pe2NvbnN0IHJhd0xvY2F0aW9ucz10aGlzLl9zYXNzU291cmNlTWFwcGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbnModWlMb2NhdGlvbik7aWYocmF3TG9jYXRpb25zLmxlbmd0aCkKcmV0dXJuIHJhd0xvY2F0aW9ucztyZXR1cm4gdGhpcy5fc3R5bGVzU291cmNlTWFwcGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbnModWlMb2NhdGlvbik7fQpfZGlzcG9zZSgpe0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7dGhpcy5fc3R5bGVzU291cmNlTWFwcGluZy5kaXNwb3NlKCk7dGhpcy5fc2Fzc1NvdXJjZU1hcHBpbmcuZGlzcG9zZSgpO319O0JpbmRpbmdzLkNTU1dvcmtzcGFjZUJpbmRpbmcuTGl2ZUxvY2F0aW9uPWNsYXNzIGV4dGVuZHMgQmluZGluZ3MuTGl2ZUxvY2F0aW9uV2l0aFBvb2x7Y29uc3RydWN0b3IocmF3TG9jYXRpb24saW5mbyx1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe3N1cGVyKHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCk7dGhpcy5fdXJsPXJhd0xvY2F0aW9uLnVybDt0aGlzLl9saW5lTnVtYmVyPXJhd0xvY2F0aW9uLmxpbmVOdW1iZXI7dGhpcy5fY29sdW1uTnVtYmVyPXJhd0xvY2F0aW9uLmNvbHVtbk51bWJlcjt0aGlzLl9pbmZvPWluZm87dGhpcy5faGVhZGVyPW51bGw7fQp1aUxvY2F0aW9uKCl7aWYoIXRoaXMuX2hlYWRlcikKcmV0dXJuIG51bGw7Y29uc3QgcmF3TG9jYXRpb249bmV3IFNESy5DU1NMb2NhdGlvbih0aGlzLl9oZWFkZXIsdGhpcy5fbGluZU51bWJlcix0aGlzLl9jb2x1bW5OdW1iZXIpO3JldHVybiBCaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTt9CmRpc3Bvc2UoKXtzdXBlci5kaXNwb3NlKCk7dGhpcy5faW5mby5fZGlzcG9zZUxvY2F0aW9uKHRoaXMpO30KaXNCbGFja2JveGVkKCl7cmV0dXJuIGZhbHNlO319O0JpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmc7O0JpbmRpbmdzLkRlYnVnZ2VyV29ya3NwYWNlQmluZGluZz1jbGFzc3tjb25zdHJ1Y3Rvcih0YXJnZXRNYW5hZ2VyLHdvcmtzcGFjZSl7dGhpcy5fd29ya3NwYWNlPXdvcmtzcGFjZTt0aGlzLl9zb3VyY2VNYXBwaW5ncz1bXTt0aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhPW5ldyBNYXAoKTt0YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkdsb2JhbE9iamVjdENsZWFyZWQsdGhpcy5fZ2xvYmFsT2JqZWN0Q2xlYXJlZCx0aGlzKTt0YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyUmVzdW1lZCx0aGlzLl9kZWJ1Z2dlclJlc3VtZWQsdGhpcyk7dGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5EZWJ1Z2dlck1vZGVsLHRoaXMpO30KYWRkU291cmNlTWFwcGluZyhzb3VyY2VNYXBwaW5nKXt0aGlzLl9zb3VyY2VNYXBwaW5ncy5wdXNoKHNvdXJjZU1hcHBpbmcpO30KbW9kZWxBZGRlZChkZWJ1Z2dlck1vZGVsKXt0aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLnNldChkZWJ1Z2dlck1vZGVsLG5ldyBCaW5kaW5ncy5EZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuTW9kZWxEYXRhKGRlYnVnZ2VyTW9kZWwsdGhpcykpO30KbW9kZWxSZW1vdmVkKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IG1vZGVsRGF0YT10aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLmdldChkZWJ1Z2dlck1vZGVsKTttb2RlbERhdGEuX2Rpc3Bvc2UoKTt0aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLnJlbW92ZShkZWJ1Z2dlck1vZGVsKTt9CnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpe2NvbnN0IG1vZGVsRGF0YT10aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLmdldChzY3JpcHQuZGVidWdnZXJNb2RlbCk7aWYobW9kZWxEYXRhKQptb2RlbERhdGEuX3VwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30KY3JlYXRlTGl2ZUxvY2F0aW9uKHJhd0xvY2F0aW9uLHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCl7Y29uc3QgbW9kZWxEYXRhPXRoaXMuX2RlYnVnZ2VyTW9kZWxUb0RhdGEuZ2V0KHJhd0xvY2F0aW9uLnNjcmlwdCgpLmRlYnVnZ2VyTW9kZWwpO3JldHVybiBtb2RlbERhdGEuX2NyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpO30KY3JlYXRlU3RhY2tUcmFjZVRvcEZyYW1lTGl2ZUxvY2F0aW9uKHJhd0xvY2F0aW9ucyx1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe2NvbnNvbGUuYXNzZXJ0KHJhd0xvY2F0aW9ucy5sZW5ndGgpO2NvbnN0IGxvY2F0aW9uPW5ldyBCaW5kaW5ncy5EZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuU3RhY2tUcmFjZVRvcEZyYW1lTG9jYXRpb24ocmF3TG9jYXRpb25zLHRoaXMsdXBkYXRlRGVsZWdhdGUsbG9jYXRpb25Qb29sKTtsb2NhdGlvbi51cGRhdGUoKTtyZXR1cm4gbG9jYXRpb247fQpjcmVhdGVDYWxsRnJhbWVMaXZlTG9jYXRpb24obG9jYXRpb24sdXBkYXRlRGVsZWdhdGUsbG9jYXRpb25Qb29sKXtjb25zdCBzY3JpcHQ9bG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIG51bGw7Y29uc3QgZGVidWdnZXJNb2RlbD1sb2NhdGlvbi5kZWJ1Z2dlck1vZGVsO2NvbnN0IGxpdmVMb2NhdGlvbj10aGlzLmNyZWF0ZUxpdmVMb2NhdGlvbihsb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpO3RoaXMuX3JlZ2lzdGVyQ2FsbEZyYW1lTGl2ZUxvY2F0aW9uKGRlYnVnZ2VyTW9kZWwsbGl2ZUxvY2F0aW9uKTtyZXR1cm4gbGl2ZUxvY2F0aW9uO30KcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe2ZvcihsZXQgaT0wO2k8dGhpcy5fc291cmNlTWFwcGluZ3MubGVuZ3RoOysraSl7Y29uc3QgdWlMb2NhdGlvbj10aGlzLl9zb3VyY2VNYXBwaW5nc1tpXS5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbik7aWYodWlMb2NhdGlvbikKcmV0dXJuIHVpTG9jYXRpb247fQpjb25zdCBtb2RlbERhdGE9dGhpcy5fZGVidWdnZXJNb2RlbFRvRGF0YS5nZXQocmF3TG9jYXRpb24uZGVidWdnZXJNb2RlbCk7cmV0dXJuIG1vZGVsRGF0YS5fcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO30KdWlTb3VyY2VDb2RlRm9yU291cmNlTWFwU291cmNlVVJMKGRlYnVnZ2VyTW9kZWwsdXJsLGlzQ29udGVudFNjcmlwdCl7Y29uc3QgbW9kZWxEYXRhPXRoaXMuX2RlYnVnZ2VyTW9kZWxUb0RhdGEuZ2V0KGRlYnVnZ2VyTW9kZWwpO2lmKCFtb2RlbERhdGEpCnJldHVybiBudWxsO3JldHVybiBtb2RlbERhdGEuX2NvbXBpbGVyTWFwcGluZy51aVNvdXJjZUNvZGVGb3JVUkwodXJsLGlzQ29udGVudFNjcmlwdCk7fQp1aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2ZvcihsZXQgaT0wO2k8dGhpcy5fc291cmNlTWFwcGluZ3MubGVuZ3RoOysraSl7Y29uc3QgcmF3TG9jYXRpb249dGhpcy5fc291cmNlTWFwcGluZ3NbaV0udWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtpZihyYXdMb2NhdGlvbikKcmV0dXJuIHJhd0xvY2F0aW9uO30KZm9yKGNvbnN0IG1vZGVsRGF0YSBvZiB0aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLnZhbHVlcygpKXtjb25zdCByYXdMb2NhdGlvbj1tb2RlbERhdGEuX3VpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7aWYocmF3TG9jYXRpb24pCnJldHVybiByYXdMb2NhdGlvbjt9CnJldHVybiBudWxsO30Kbm9ybWFsaXplVUlMb2NhdGlvbih1aUxvY2F0aW9uKXtjb25zdCByYXdMb2NhdGlvbj10aGlzLnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcik7aWYocmF3TG9jYXRpb24pCnJldHVybiB0aGlzLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXx8dWlMb2NhdGlvbjtyZXR1cm4gdWlMb2NhdGlvbjt9CnNjcmlwdEZpbGUodWlTb3VyY2VDb2RlLGRlYnVnZ2VyTW9kZWwpe2NvbnN0IG1vZGVsRGF0YT10aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLmdldChkZWJ1Z2dlck1vZGVsKTtyZXR1cm4gbW9kZWxEYXRhP21vZGVsRGF0YS5fcmVzb3VyY2VNYXBwaW5nLnNjcmlwdEZpbGUodWlTb3VyY2VDb2RlKTpudWxsO30Kc291cmNlTWFwRm9yU2NyaXB0KHNjcmlwdCl7Y29uc3QgbW9kZWxEYXRhPXRoaXMuX2RlYnVnZ2VyTW9kZWxUb0RhdGEuZ2V0KHNjcmlwdC5kZWJ1Z2dlck1vZGVsKTtpZighbW9kZWxEYXRhKQpyZXR1cm4gbnVsbDtyZXR1cm4gbW9kZWxEYXRhLl9jb21waWxlck1hcHBpbmcuc291cmNlTWFwRm9yU2NyaXB0KHNjcmlwdCk7fQptYXliZUxvYWRTb3VyY2VNYXAoc2NyaXB0KXtjb25zdCBtb2RlbERhdGE9dGhpcy5fZGVidWdnZXJNb2RlbFRvRGF0YS5nZXQoc2NyaXB0LmRlYnVnZ2VyTW9kZWwpO2lmKCFtb2RlbERhdGEpCnJldHVybjttb2RlbERhdGEuX2NvbXBpbGVyTWFwcGluZy5tYXliZUxvYWRTb3VyY2VNYXAoc2NyaXB0KTt9Cl9nbG9iYWxPYmplY3RDbGVhcmVkKGV2ZW50KXtjb25zdCBkZWJ1Z2dlck1vZGVsPShldmVudC5kYXRhKTt0aGlzLl9yZXNldChkZWJ1Z2dlck1vZGVsKTt9Cl9yZXNldChkZWJ1Z2dlck1vZGVsKXtjb25zdCBtb2RlbERhdGE9dGhpcy5fZGVidWdnZXJNb2RlbFRvRGF0YS5nZXQoZGVidWdnZXJNb2RlbCk7bW9kZWxEYXRhLmNhbGxGcmFtZUxvY2F0aW9ucy52YWx1ZXNBcnJheSgpLmZvckVhY2gobG9jYXRpb249PnRoaXMuX3JlbW92ZUxpdmVMb2NhdGlvbihsb2NhdGlvbikpO21vZGVsRGF0YS5jYWxsRnJhbWVMb2NhdGlvbnMuY2xlYXIoKTt9Cl9yZXNldEZvclRlc3QodGFyZ2V0KXtjb25zdCBkZWJ1Z2dlck1vZGVsPSh0YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpKTtjb25zdCBtb2RlbERhdGE9dGhpcy5fZGVidWdnZXJNb2RlbFRvRGF0YS5nZXQoZGVidWdnZXJNb2RlbCk7bW9kZWxEYXRhLl9yZXNvdXJjZU1hcHBpbmcucmVzZXRGb3JUZXN0KCk7fQpfcmVnaXN0ZXJDYWxsRnJhbWVMaXZlTG9jYXRpb24oZGVidWdnZXJNb2RlbCxsb2NhdGlvbil7Y29uc3QgbG9jYXRpb25zPXRoaXMuX2RlYnVnZ2VyTW9kZWxUb0RhdGEuZ2V0KGRlYnVnZ2VyTW9kZWwpLmNhbGxGcmFtZUxvY2F0aW9ucztsb2NhdGlvbnMuYWRkKGxvY2F0aW9uKTt9Cl9yZW1vdmVMaXZlTG9jYXRpb24obG9jYXRpb24pe2NvbnN0IG1vZGVsRGF0YT10aGlzLl9kZWJ1Z2dlck1vZGVsVG9EYXRhLmdldChsb2NhdGlvbi5fc2NyaXB0LmRlYnVnZ2VyTW9kZWwpO2lmKG1vZGVsRGF0YSkKbW9kZWxEYXRhLl9kaXNwb3NlTG9jYXRpb24obG9jYXRpb24pO30KX2RlYnVnZ2VyUmVzdW1lZChldmVudCl7Y29uc3QgZGVidWdnZXJNb2RlbD0oZXZlbnQuZGF0YSk7dGhpcy5fcmVzZXQoZGVidWdnZXJNb2RlbCk7fX07QmluZGluZ3MuRGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLk1vZGVsRGF0YT1jbGFzc3tjb25zdHJ1Y3RvcihkZWJ1Z2dlck1vZGVsLGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZyl7dGhpcy5fZGVidWdnZXJNb2RlbD1kZWJ1Z2dlck1vZGVsO3RoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZz1kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmc7dGhpcy5jYWxsRnJhbWVMb2NhdGlvbnM9bmV3IFNldCgpO2NvbnN0IHdvcmtzcGFjZT1kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuX3dvcmtzcGFjZTt0aGlzLl9kZWZhdWx0TWFwcGluZz1uZXcgQmluZGluZ3MuRGVmYXVsdFNjcmlwdE1hcHBpbmcoZGVidWdnZXJNb2RlbCx3b3Jrc3BhY2UsZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKTt0aGlzLl9yZXNvdXJjZU1hcHBpbmc9bmV3IEJpbmRpbmdzLlJlc291cmNlU2NyaXB0TWFwcGluZyhkZWJ1Z2dlck1vZGVsLHdvcmtzcGFjZSxkZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcpO3RoaXMuX2NvbXBpbGVyTWFwcGluZz1uZXcgQmluZGluZ3MuQ29tcGlsZXJTY3JpcHRNYXBwaW5nKGRlYnVnZ2VyTW9kZWwsd29ya3NwYWNlLGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZyk7dGhpcy5fbG9jYXRpb25zPW5ldyBNdWx0aW1hcCgpO2RlYnVnZ2VyTW9kZWwuc2V0QmVmb3JlUGF1c2VkQ2FsbGJhY2sodGhpcy5fYmVmb3JlUGF1c2VkLmJpbmQodGhpcykpO30KX2NyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe2NvbnN0IHNjcmlwdD0ocmF3TG9jYXRpb24uc2NyaXB0KCkpO2NvbnNvbGUuYXNzZXJ0KHNjcmlwdCk7Y29uc3QgbG9jYXRpb249bmV3IEJpbmRpbmdzLkRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5Mb2NhdGlvbihzY3JpcHQscmF3TG9jYXRpb24sdGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCk7dGhpcy5fbG9jYXRpb25zLnNldChzY3JpcHQsbG9jYXRpb24pO2xvY2F0aW9uLnVwZGF0ZSgpO3JldHVybiBsb2NhdGlvbjt9Cl9kaXNwb3NlTG9jYXRpb24obG9jYXRpb24pe3RoaXMuX2xvY2F0aW9ucy5kZWxldGUobG9jYXRpb24uX3NjcmlwdCxsb2NhdGlvbik7fQpfdXBkYXRlTG9jYXRpb25zKHNjcmlwdCl7Zm9yKGNvbnN0IGxvY2F0aW9uIG9mIHRoaXMuX2xvY2F0aW9ucy5nZXQoc2NyaXB0KSkKbG9jYXRpb24udXBkYXRlKCk7fQpfcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe2xldCB1aUxvY2F0aW9uPW51bGw7dWlMb2NhdGlvbj11aUxvY2F0aW9ufHx0aGlzLl9jb21waWxlck1hcHBpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO3VpTG9jYXRpb249dWlMb2NhdGlvbnx8dGhpcy5fcmVzb3VyY2VNYXBwaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTt1aUxvY2F0aW9uPXVpTG9jYXRpb258fEJpbmRpbmdzLnJlc291cmNlTWFwcGluZy5qc0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTt1aUxvY2F0aW9uPXVpTG9jYXRpb258fHRoaXMuX2RlZmF1bHRNYXBwaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTtyZXR1cm4odWlMb2NhdGlvbik7fQpfdWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtsZXQgcmF3TG9jYXRpb249bnVsbDtyYXdMb2NhdGlvbj1yYXdMb2NhdGlvbnx8dGhpcy5fY29tcGlsZXJNYXBwaW5nLnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7cmF3TG9jYXRpb249cmF3TG9jYXRpb258fHRoaXMuX3Jlc291cmNlTWFwcGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO3Jhd0xvY2F0aW9uPXJhd0xvY2F0aW9ufHxCaW5kaW5ncy5yZXNvdXJjZU1hcHBpbmcudWlMb2NhdGlvblRvSlNMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO3Jhd0xvY2F0aW9uPXJhd0xvY2F0aW9ufHx0aGlzLl9kZWZhdWx0TWFwcGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO3JldHVybiByYXdMb2NhdGlvbjt9Cl9iZWZvcmVQYXVzZWQoZGVidWdnZXJQYXVzZWREZXRhaWxzKXtyZXR1cm4hIXRoaXMuX2NvbXBpbGVyTWFwcGluZy5tYXBzVG9Tb3VyY2VDb2RlKGRlYnVnZ2VyUGF1c2VkRGV0YWlscy5jYWxsRnJhbWVzWzBdLmxvY2F0aW9uKCkpO30KX2Rpc3Bvc2UoKXt0aGlzLl9kZWJ1Z2dlck1vZGVsLnNldEJlZm9yZVBhdXNlZENhbGxiYWNrKG51bGwpO3RoaXMuX2NvbXBpbGVyTWFwcGluZy5kaXNwb3NlKCk7dGhpcy5fcmVzb3VyY2VNYXBwaW5nLmRpc3Bvc2UoKTt0aGlzLl9kZWZhdWx0TWFwcGluZy5kaXNwb3NlKCk7fX07QmluZGluZ3MuRGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLkxvY2F0aW9uPWNsYXNzIGV4dGVuZHMgQmluZGluZ3MuTGl2ZUxvY2F0aW9uV2l0aFBvb2x7Y29uc3RydWN0b3Ioc2NyaXB0LHJhd0xvY2F0aW9uLGJpbmRpbmcsdXBkYXRlRGVsZWdhdGUsbG9jYXRpb25Qb29sKXtzdXBlcih1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpO3RoaXMuX3NjcmlwdD1zY3JpcHQ7dGhpcy5fcmF3TG9jYXRpb249cmF3TG9jYXRpb247dGhpcy5fYmluZGluZz1iaW5kaW5nO30KdWlMb2NhdGlvbigpe2NvbnN0IGRlYnVnZ2VyTW9kZWxMb2NhdGlvbj10aGlzLl9yYXdMb2NhdGlvbjtyZXR1cm4gdGhpcy5fYmluZGluZy5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbihkZWJ1Z2dlck1vZGVsTG9jYXRpb24pO30KZGlzcG9zZSgpe3N1cGVyLmRpc3Bvc2UoKTt0aGlzLl9iaW5kaW5nLl9yZW1vdmVMaXZlTG9jYXRpb24odGhpcyk7fQppc0JsYWNrYm94ZWQoKXtyZXR1cm4gQmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmlzQmxhY2tib3hlZFJhd0xvY2F0aW9uKHRoaXMuX3Jhd0xvY2F0aW9uKTt9fTtCaW5kaW5ncy5EZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuU3RhY2tUcmFjZVRvcEZyYW1lTG9jYXRpb249Y2xhc3MgZXh0ZW5kcyBCaW5kaW5ncy5MaXZlTG9jYXRpb25XaXRoUG9vbHtjb25zdHJ1Y3RvcihyYXdMb2NhdGlvbnMsYmluZGluZyx1cGRhdGVEZWxlZ2F0ZSxsb2NhdGlvblBvb2wpe3N1cGVyKHVwZGF0ZURlbGVnYXRlLGxvY2F0aW9uUG9vbCk7dGhpcy5fdXBkYXRlU2NoZWR1bGVkPXRydWU7dGhpcy5fY3VycmVudD1udWxsO3RoaXMuX2xvY2F0aW9ucz1yYXdMb2NhdGlvbnMubWFwKGxvY2F0aW9uPT5iaW5kaW5nLmNyZWF0ZUxpdmVMb2NhdGlvbihsb2NhdGlvbix0aGlzLl9zY2hlZHVsZVVwZGF0ZS5iaW5kKHRoaXMpLGxvY2F0aW9uUG9vbCkpO3RoaXMuX3VwZGF0ZUxvY2F0aW9uKCk7fQp1aUxvY2F0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnQudWlMb2NhdGlvbigpO30KaXNCbGFja2JveGVkKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnQuaXNCbGFja2JveGVkKCk7fQpkaXNwb3NlKCl7c3VwZXIuZGlzcG9zZSgpO2Zvcihjb25zdCBsb2NhdGlvbiBvZiB0aGlzLl9sb2NhdGlvbnMpCmxvY2F0aW9uLmRpc3Bvc2UoKTt0aGlzLl9sb2NhdGlvbnM9bnVsbDt0aGlzLl9jdXJyZW50PW51bGw7fQpfc2NoZWR1bGVVcGRhdGUoKXtpZih0aGlzLl91cGRhdGVTY2hlZHVsZWQpCnJldHVybjt0aGlzLl91cGRhdGVTY2hlZHVsZWQ9dHJ1ZTtzZXRJbW1lZGlhdGUodGhpcy5fdXBkYXRlTG9jYXRpb24uYmluZCh0aGlzKSk7fQpfdXBkYXRlTG9jYXRpb24oKXt0aGlzLl91cGRhdGVTY2hlZHVsZWQ9ZmFsc2U7aWYoIXRoaXMuX2xvY2F0aW9ucykKcmV0dXJuO3RoaXMuX2N1cnJlbnQ9dGhpcy5fbG9jYXRpb25zLmZpbmQobG9jYXRpb249PiFsb2NhdGlvbi5pc0JsYWNrYm94ZWQoKSl8fHRoaXMuX2xvY2F0aW9uc1swXTt0aGlzLnVwZGF0ZSgpO319O0JpbmRpbmdzLkRlYnVnZ2VyU291cmNlTWFwcGluZz1mdW5jdGlvbigpe307QmluZGluZ3MuRGVidWdnZXJTb3VyY2VNYXBwaW5nLnByb3RvdHlwZT17cmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe30sdWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt9LH07QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nOztCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlcj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3Iod29ya3NwYWNlLHRhcmdldE1hbmFnZXIsZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKXtzdXBlcigpO3RoaXMuX3N0b3JhZ2U9bmV3IEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLlN0b3JhZ2UoKTt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX3RhcmdldE1hbmFnZXI9dGFyZ2V0TWFuYWdlcjt0aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmc9ZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nO3RoaXMuX2JyZWFrcG9pbnRzRm9yVUlTb3VyY2VDb2RlPW5ldyBNYXAoKTt0aGlzLl9icmVha3BvaW50QnlTdG9yYWdlSWQ9bmV3IE1hcCgpO3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlByb2plY3RSZW1vdmVkLHRoaXMuX3Byb2plY3RSZW1vdmVkLHRoaXMpO3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHRoaXMuX3VpU291cmNlQ29kZUFkZGVkLHRoaXMpO3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZVJlbW92ZWQsdGhpcy5fdWlTb3VyY2VDb2RlUmVtb3ZlZCx0aGlzKTt9CnN0YXRpYyBfYnJlYWtwb2ludFN0b3JhZ2VJZCh1cmwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2lmKCF1cmwpCnJldHVybicnO3JldHVybiB1cmwrJzonK2xpbmVOdW1iZXIrJzonK2NvbHVtbk51bWJlcjt9CmNvcHlCcmVha3BvaW50cyhmcm9tVVJMLHRvU291cmNlQ29kZSl7Y29uc3QgYnJlYWtwb2ludEl0ZW1zPXRoaXMuX3N0b3JhZ2UuYnJlYWtwb2ludEl0ZW1zKGZyb21VUkwpO2Zvcihjb25zdCBpdGVtIG9mIGJyZWFrcG9pbnRJdGVtcykKdGhpcy5zZXRCcmVha3BvaW50KHRvU291cmNlQ29kZSxpdGVtLmxpbmVOdW1iZXIsaXRlbS5jb2x1bW5OdW1iZXIsaXRlbS5jb25kaXRpb24saXRlbS5lbmFibGVkKTt9Cl9yZXN0b3JlQnJlYWtwb2ludHModWlTb3VyY2VDb2RlKXtjb25zdCB1cmw9dWlTb3VyY2VDb2RlLnVybCgpO2lmKCF1cmwpCnJldHVybjt0aGlzLl9zdG9yYWdlLm11dGUoKTtjb25zdCBicmVha3BvaW50SXRlbXM9dGhpcy5fc3RvcmFnZS5icmVha3BvaW50SXRlbXModXJsKTtmb3IoY29uc3QgaXRlbSBvZiBicmVha3BvaW50SXRlbXMpCnRoaXMuX2lubmVyU2V0QnJlYWtwb2ludCh1aVNvdXJjZUNvZGUsaXRlbS5saW5lTnVtYmVyLGl0ZW0uY29sdW1uTnVtYmVyLGl0ZW0uY29uZGl0aW9uLGl0ZW0uZW5hYmxlZCk7dGhpcy5fc3RvcmFnZS51bm11dGUoKTt9Cl91aVNvdXJjZUNvZGVBZGRlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTt0aGlzLl9yZXN0b3JlQnJlYWtwb2ludHModWlTb3VyY2VDb2RlKTt9Cl91aVNvdXJjZUNvZGVSZW1vdmVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO30KX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2NvbnN0IGJyZWFrcG9pbnRzPXVpU291cmNlQ29kZVtCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5fYnJlYWtwb2ludHNTeW1ib2xdfHxuZXcgU2V0KCk7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgYnJlYWtwb2ludHMpCmJyZWFrcG9pbnQuX3Jlc2V0TG9jYXRpb25zKCk7fQpzZXRCcmVha3BvaW50KHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCl7bGV0IHVpTG9jYXRpb249bmV3IFdvcmtzcGFjZS5VSUxvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7Y29uc3Qgbm9ybWFsaXplZExvY2F0aW9uPXRoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5ub3JtYWxpemVVSUxvY2F0aW9uKHVpTG9jYXRpb24pO2lmKG5vcm1hbGl6ZWRMb2NhdGlvbi5pZCgpIT09dWlMb2NhdGlvbi5pZCgpKXtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKG5vcm1hbGl6ZWRMb2NhdGlvbik7dWlMb2NhdGlvbj1ub3JtYWxpemVkTG9jYXRpb247fQpyZXR1cm4gdGhpcy5faW5uZXJTZXRCcmVha3BvaW50KHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCk7fQpfaW5uZXJTZXRCcmVha3BvaW50KHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCl7Y29uc3QgaXRlbUlkPUJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLl9icmVha3BvaW50U3RvcmFnZUlkKHVpU291cmNlQ29kZS51cmwoKSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7bGV0IGJyZWFrcG9pbnQ9dGhpcy5fYnJlYWtwb2ludEJ5U3RvcmFnZUlkLmdldChpdGVtSWQpO2lmKGJyZWFrcG9pbnQpe2JyZWFrcG9pbnQuc2V0UHJpbWFyeVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO2JyZWFrcG9pbnQuX3VwZGF0ZVN0YXRlKGNvbmRpdGlvbixlbmFibGVkKTticmVha3BvaW50Ll91cGRhdGVCcmVha3BvaW50KCk7cmV0dXJuIGJyZWFrcG9pbnQ7fQpicmVha3BvaW50PW5ldyBCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5CcmVha3BvaW50KHRoaXMsdWlTb3VyY2VDb2RlLHVpU291cmNlQ29kZS51cmwoKSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCk7dGhpcy5fYnJlYWtwb2ludEJ5U3RvcmFnZUlkLnNldChpdGVtSWQsYnJlYWtwb2ludCk7cmV0dXJuIGJyZWFrcG9pbnQ7fQpmaW5kQnJlYWtwb2ludHModWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIpe2NvbnN0IGJyZWFrcG9pbnRzPXRoaXMuX2JyZWFrcG9pbnRzRm9yVUlTb3VyY2VDb2RlLmdldCh1aVNvdXJjZUNvZGUpO2NvbnN0IGxpbmVCcmVha3BvaW50cz1icmVha3BvaW50cz9icmVha3BvaW50cy5nZXQobGluZU51bWJlcik6bnVsbDtyZXR1cm4gbGluZUJyZWFrcG9pbnRzP2xpbmVCcmVha3BvaW50cy52YWx1ZXNBcnJheSgpWzBdOltdO30KZmluZEJyZWFrcG9pbnQodWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBicmVha3BvaW50cz10aGlzLl9icmVha3BvaW50c0ZvclVJU291cmNlQ29kZS5nZXQodWlTb3VyY2VDb2RlKTtjb25zdCBsaW5lQnJlYWtwb2ludHM9YnJlYWtwb2ludHM/YnJlYWtwb2ludHMuZ2V0KGxpbmVOdW1iZXIpOm51bGw7Y29uc3QgY29sdW1uQnJlYWtwb2ludHM9bGluZUJyZWFrcG9pbnRzP2xpbmVCcmVha3BvaW50cy5nZXQoY29sdW1uTnVtYmVyKTpudWxsO3JldHVybiBjb2x1bW5CcmVha3BvaW50cz9jb2x1bW5CcmVha3BvaW50c1swXTpudWxsO30KcG9zc2libGVCcmVha3BvaW50cyh1aVNvdXJjZUNvZGUsdGV4dFJhbmdlKXtjb25zdCBzdGFydExvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsdGV4dFJhbmdlLnN0YXJ0TGluZSx0ZXh0UmFuZ2Uuc3RhcnRDb2x1bW4pO2NvbnN0IGVuZExvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsdGV4dFJhbmdlLmVuZExpbmUsdGV4dFJhbmdlLmVuZENvbHVtbik7aWYoIXN0YXJ0TG9jYXRpb258fCFlbmRMb2NhdGlvbnx8c3RhcnRMb2NhdGlvbi5kZWJ1Z2dlck1vZGVsIT09ZW5kTG9jYXRpb24uZGVidWdnZXJNb2RlbCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7cmV0dXJuIHN0YXJ0TG9jYXRpb24uZGVidWdnZXJNb2RlbC5nZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHN0YXJ0TG9jYXRpb24sZW5kTG9jYXRpb24sZmFsc2UpLnRoZW4odG9VSUxvY2F0aW9ucy5iaW5kKHRoaXMpKTtmdW5jdGlvbiB0b1VJTG9jYXRpb25zKGxvY2F0aW9ucyl7bGV0IHNvcnRlZExvY2F0aW9ucz1sb2NhdGlvbnMubWFwKGxvY2F0aW9uPT50aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24obG9jYXRpb24pKTtzb3J0ZWRMb2NhdGlvbnM9c29ydGVkTG9jYXRpb25zLmZpbHRlcihsb2NhdGlvbj0+bG9jYXRpb24mJmxvY2F0aW9uLnVpU291cmNlQ29kZT09PXVpU291cmNlQ29kZSk7c29ydGVkTG9jYXRpb25zLnNvcnQoV29ya3NwYWNlLlVJTG9jYXRpb24uY29tcGFyYXRvcik7aWYoIXNvcnRlZExvY2F0aW9ucy5sZW5ndGgpCnJldHVybltdO2NvbnN0IHJlc3VsdD1bc29ydGVkTG9jYXRpb25zWzBdXTtsZXQgbGFzdExvY2F0aW9uPXNvcnRlZExvY2F0aW9uc1swXTtmb3IobGV0IGk9MTtpPHNvcnRlZExvY2F0aW9ucy5sZW5ndGg7KytpKXtpZihzb3J0ZWRMb2NhdGlvbnNbaV0uaWQoKT09PWxhc3RMb2NhdGlvbi5pZCgpKQpjb250aW51ZTtyZXN1bHQucHVzaChzb3J0ZWRMb2NhdGlvbnNbaV0pO2xhc3RMb2NhdGlvbj1zb3J0ZWRMb2NhdGlvbnNbaV07fQpyZXR1cm4gcmVzdWx0O319CmJyZWFrcG9pbnRzRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7bGV0IHJlc3VsdD1bXTtjb25zdCB1aVNvdXJjZUNvZGVCcmVha3BvaW50cz10aGlzLl9icmVha3BvaW50c0ZvclVJU291cmNlQ29kZS5nZXQodWlTb3VyY2VDb2RlKTtjb25zdCBicmVha3BvaW50cz11aVNvdXJjZUNvZGVCcmVha3BvaW50cz91aVNvdXJjZUNvZGVCcmVha3BvaW50cy52YWx1ZXNBcnJheSgpOltdO2ZvcihsZXQgaT0wO2k8YnJlYWtwb2ludHMubGVuZ3RoOysraSl7Y29uc3QgbGluZUJyZWFrcG9pbnRzPWJyZWFrcG9pbnRzW2ldO2NvbnN0IGNvbHVtbkJyZWFrcG9pbnRBcnJheXM9bGluZUJyZWFrcG9pbnRzP2xpbmVCcmVha3BvaW50cy52YWx1ZXNBcnJheSgpOltdO3Jlc3VsdD1yZXN1bHQuY29uY2F0LmFwcGx5KHJlc3VsdCxjb2x1bW5CcmVha3BvaW50QXJyYXlzKTt9CnJldHVybiByZXN1bHQ7fQpfYWxsQnJlYWtwb2ludHMoKXtsZXQgcmVzdWx0PVtdO2NvbnN0IHVpU291cmNlQ29kZXM9dGhpcy5fYnJlYWtwb2ludHNGb3JVSVNvdXJjZUNvZGUua2V5c0FycmF5KCk7Zm9yKGxldCBpPTA7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpCnJlc3VsdD1yZXN1bHQuY29uY2F0KHRoaXMuYnJlYWtwb2ludHNGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2Rlc1tpXSkpO3JldHVybiByZXN1bHQ7fQpicmVha3BvaW50TG9jYXRpb25zRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgdWlTb3VyY2VDb2RlQnJlYWtwb2ludHM9dGhpcy5fYnJlYWtwb2ludHNGb3JVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSk7Y29uc3QgbGluZU51bWJlcnM9dWlTb3VyY2VDb2RlQnJlYWtwb2ludHM/dWlTb3VyY2VDb2RlQnJlYWtwb2ludHMua2V5c0FycmF5KCk6W107Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8bGluZU51bWJlcnMubGVuZ3RoOysraSl7Y29uc3QgbGluZUJyZWFrcG9pbnRzPXVpU291cmNlQ29kZUJyZWFrcG9pbnRzLmdldChsaW5lTnVtYmVyc1tpXSk7Y29uc3QgY29sdW1uTnVtYmVycz1saW5lQnJlYWtwb2ludHMua2V5c0FycmF5KCk7Zm9yKGxldCBqPTA7ajxjb2x1bW5OdW1iZXJzLmxlbmd0aDsrK2ope2NvbnN0IGNvbHVtbkJyZWFrcG9pbnRzPWxpbmVCcmVha3BvaW50cy5nZXQoY29sdW1uTnVtYmVyc1tqXSk7Y29uc3QgbGluZU51bWJlcj1wYXJzZUludChsaW5lTnVtYmVyc1tpXSwxMCk7Y29uc3QgY29sdW1uTnVtYmVyPXBhcnNlSW50KGNvbHVtbk51bWJlcnNbal0sMTApO2ZvcihsZXQgaz0wO2s8Y29sdW1uQnJlYWtwb2ludHMubGVuZ3RoOysrayl7Y29uc3QgYnJlYWtwb2ludD1jb2x1bW5CcmVha3BvaW50c1trXTtjb25zdCB1aUxvY2F0aW9uPXVpU291cmNlQ29kZS51aUxvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtyZXN1bHQucHVzaCh7YnJlYWtwb2ludDpicmVha3BvaW50LHVpTG9jYXRpb246dWlMb2NhdGlvbn0pO319fQpyZXR1cm4gcmVzdWx0O30KYWxsQnJlYWtwb2ludExvY2F0aW9ucygpe2xldCByZXN1bHQ9W107Y29uc3QgdWlTb3VyY2VDb2Rlcz10aGlzLl9icmVha3BvaW50c0ZvclVJU291cmNlQ29kZS5rZXlzQXJyYXkoKTtmb3IobGV0IGk9MDtpPHVpU291cmNlQ29kZXMubGVuZ3RoOysraSkKcmVzdWx0PXJlc3VsdC5jb25jYXQodGhpcy5icmVha3BvaW50TG9jYXRpb25zRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZXNbaV0pKTtyZXR1cm4gcmVzdWx0O30KdG9nZ2xlQWxsQnJlYWtwb2ludHModG9nZ2xlU3RhdGUpe2NvbnN0IGJyZWFrcG9pbnRzPXRoaXMuX2FsbEJyZWFrcG9pbnRzKCk7Zm9yKGxldCBpPTA7aTxicmVha3BvaW50cy5sZW5ndGg7KytpKQpicmVha3BvaW50c1tpXS5zZXRFbmFibGVkKHRvZ2dsZVN0YXRlKTt9CnJlbW92ZUFsbEJyZWFrcG9pbnRzKCl7Y29uc3QgYnJlYWtwb2ludHM9dGhpcy5fYWxsQnJlYWtwb2ludHMoKTtmb3IobGV0IGk9MDtpPGJyZWFrcG9pbnRzLmxlbmd0aDsrK2kpCmJyZWFrcG9pbnRzW2ldLnJlbW92ZShmYWxzZSk7fQpyZW1vdmVPdGhlckJyZWFrcG9pbnRzKHNlbGVjdGVkQnJlYWtwb2ludHMpe2NvbnN0IGFsbEJyZWFrcG9pbnRzPXRoaXMuX2FsbEJyZWFrcG9pbnRzKCk7YWxsQnJlYWtwb2ludHMuZm9yRWFjaChicmVha3BvaW50PT57aWYoIXNlbGVjdGVkQnJlYWtwb2ludHMuaGFzKGJyZWFrcG9pbnQpKQpicmVha3BvaW50LnJlbW92ZShmYWxzZSk7fSk7fQpfcHJvamVjdFJlbW92ZWQoZXZlbnQpe2NvbnN0IHByb2plY3Q9KGV2ZW50LmRhdGEpO2NvbnN0IHVpU291cmNlQ29kZXM9cHJvamVjdC51aVNvdXJjZUNvZGVzKCk7Zm9yKGxldCBpPTA7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpCnRoaXMuX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGVzW2ldKTt9Cl9yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnQscmVtb3ZlRnJvbVN0b3JhZ2Upe2lmKHJlbW92ZUZyb21TdG9yYWdlKQp0aGlzLl9zdG9yYWdlLl9yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnQpO3RoaXMuX2JyZWFrcG9pbnRCeVN0b3JhZ2VJZC5kZWxldGUoYnJlYWtwb2ludC5fYnJlYWtwb2ludFN0b3JhZ2VJZCgpKTt9Cl91aUxvY2F0aW9uQWRkZWQoYnJlYWtwb2ludCx1aUxvY2F0aW9uKXtsZXQgYnJlYWtwb2ludHM9dGhpcy5fYnJlYWtwb2ludHNGb3JVSVNvdXJjZUNvZGUuZ2V0KHVpTG9jYXRpb24udWlTb3VyY2VDb2RlKTtpZighYnJlYWtwb2ludHMpe2JyZWFrcG9pbnRzPW5ldyBNYXAoKTt0aGlzLl9icmVha3BvaW50c0ZvclVJU291cmNlQ29kZS5zZXQodWlMb2NhdGlvbi51aVNvdXJjZUNvZGUsYnJlYWtwb2ludHMpO30KbGV0IGxpbmVCcmVha3BvaW50cz1icmVha3BvaW50cy5nZXQodWlMb2NhdGlvbi5saW5lTnVtYmVyKTtpZighbGluZUJyZWFrcG9pbnRzKXtsaW5lQnJlYWtwb2ludHM9bmV3IE1hcCgpO2JyZWFrcG9pbnRzLnNldCh1aUxvY2F0aW9uLmxpbmVOdW1iZXIsbGluZUJyZWFrcG9pbnRzKTt9CmxldCBjb2x1bW5CcmVha3BvaW50cz1saW5lQnJlYWtwb2ludHMuZ2V0KHVpTG9jYXRpb24uY29sdW1uTnVtYmVyKTtpZighY29sdW1uQnJlYWtwb2ludHMpe2NvbHVtbkJyZWFrcG9pbnRzPVtdO2xpbmVCcmVha3BvaW50cy5zZXQodWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIsY29sdW1uQnJlYWtwb2ludHMpO30KY29sdW1uQnJlYWtwb2ludHMucHVzaChicmVha3BvaW50KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5FdmVudHMuQnJlYWtwb2ludEFkZGVkLHticmVha3BvaW50OmJyZWFrcG9pbnQsdWlMb2NhdGlvbjp1aUxvY2F0aW9ufSk7fQpfdWlMb2NhdGlvblJlbW92ZWQoYnJlYWtwb2ludCx1aUxvY2F0aW9uKXtjb25zdCBicmVha3BvaW50cz10aGlzLl9icmVha3BvaW50c0ZvclVJU291cmNlQ29kZS5nZXQodWlMb2NhdGlvbi51aVNvdXJjZUNvZGUpO2lmKCFicmVha3BvaW50cykKcmV0dXJuO2NvbnN0IGxpbmVCcmVha3BvaW50cz1icmVha3BvaW50cy5nZXQodWlMb2NhdGlvbi5saW5lTnVtYmVyKTtpZighbGluZUJyZWFrcG9pbnRzKQpyZXR1cm47Y29uc3QgY29sdW1uQnJlYWtwb2ludHM9bGluZUJyZWFrcG9pbnRzLmdldCh1aUxvY2F0aW9uLmNvbHVtbk51bWJlcik7aWYoIWNvbHVtbkJyZWFrcG9pbnRzKQpyZXR1cm47Y29sdW1uQnJlYWtwb2ludHMucmVtb3ZlKGJyZWFrcG9pbnQpO2lmKCFjb2x1bW5CcmVha3BvaW50cy5sZW5ndGgpCmxpbmVCcmVha3BvaW50cy5yZW1vdmUodWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2lmKCFsaW5lQnJlYWtwb2ludHMuc2l6ZSkKYnJlYWtwb2ludHMucmVtb3ZlKHVpTG9jYXRpb24ubGluZU51bWJlcik7aWYoIWJyZWFrcG9pbnRzLnNpemUpCnRoaXMuX2JyZWFrcG9pbnRzRm9yVUlTb3VyY2VDb2RlLnJlbW92ZSh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuRXZlbnRzLkJyZWFrcG9pbnRSZW1vdmVkLHticmVha3BvaW50OmJyZWFrcG9pbnQsdWlMb2NhdGlvbjp1aUxvY2F0aW9ufSk7fX07QmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuRXZlbnRzPXtCcmVha3BvaW50QWRkZWQ6U3ltYm9sKCdicmVha3BvaW50LWFkZGVkJyksQnJlYWtwb2ludFJlbW92ZWQ6U3ltYm9sKCdicmVha3BvaW50LXJlbW92ZWQnKX07QmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuQnJlYWtwb2ludD1jbGFzc3tjb25zdHJ1Y3RvcihicmVha3BvaW50TWFuYWdlcixwcmltYXJ5VUlTb3VyY2VDb2RlLHVybCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCl7dGhpcy5fYnJlYWtwb2ludE1hbmFnZXI9YnJlYWtwb2ludE1hbmFnZXI7dGhpcy5fdXJsPXVybDt0aGlzLl9saW5lTnVtYmVyPWxpbmVOdW1iZXI7dGhpcy5fY29sdW1uTnVtYmVyPWNvbHVtbk51bWJlcjt0aGlzLnNldFByaW1hcnlVSVNvdXJjZUNvZGUocHJpbWFyeVVJU291cmNlQ29kZSk7dGhpcy5fbnVtYmVyT2ZEZWJ1Z2dlckxvY2F0aW9uRm9yVUlMb2NhdGlvbj1uZXcgTWFwKCk7dGhpcy5fY29uZGl0aW9uO3RoaXMuX2VuYWJsZWQ7dGhpcy5faXNSZW1vdmVkO3RoaXMuX2Zha2VQcmltYXJ5TG9jYXRpb247dGhpcy5fY3VycmVudFN0YXRlPW51bGw7dGhpcy5fbW9kZWxCcmVha3BvaW50cz1uZXcgTWFwKCk7dGhpcy5fdXBkYXRlU3RhdGUoY29uZGl0aW9uLGVuYWJsZWQpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl90YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwsdGhpcyk7fQpyZWZyZXNoSW5EZWJ1Z2dlcigpe2lmKHRoaXMuX2lzUmVtb3ZlZCkKcmV0dXJuO2Zvcihjb25zdCBicmVha3BvaW50IG9mIHRoaXMuX21vZGVsQnJlYWtwb2ludHMudmFsdWVzKCkpCmJyZWFrcG9pbnQuX3JlZnJlc2hCcmVha3BvaW50KCk7fQptb2RlbEFkZGVkKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZz10aGlzLl9icmVha3BvaW50TWFuYWdlci5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nO3RoaXMuX21vZGVsQnJlYWtwb2ludHMuc2V0KGRlYnVnZ2VyTW9kZWwsbmV3IEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLk1vZGVsQnJlYWtwb2ludChkZWJ1Z2dlck1vZGVsLHRoaXMsZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKSk7fQptb2RlbFJlbW92ZWQoZGVidWdnZXJNb2RlbCl7Y29uc3QgbW9kZWxCcmVha3BvaW50PXRoaXMuX21vZGVsQnJlYWtwb2ludHMucmVtb3ZlKGRlYnVnZ2VyTW9kZWwpO21vZGVsQnJlYWtwb2ludC5fY2xlYW5VcEFmdGVyRGVidWdnZXJJc0dvbmUoKTttb2RlbEJyZWFrcG9pbnQuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7fQpzZXRQcmltYXJ5VUlTb3VyY2VDb2RlKHByaW1hcnlVSVNvdXJjZUNvZGUpe2NvbnN0IHN5bWJvbD1CaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5fYnJlYWtwb2ludHNTeW1ib2w7aWYodGhpcy5fcHJpbWFyeVVJU291cmNlQ29kZSkKdGhpcy5fcHJpbWFyeVVJU291cmNlQ29kZVtzeW1ib2xdLmRlbGV0ZSh0aGlzKTt0aGlzLl9wcmltYXJ5VUlTb3VyY2VDb2RlPXByaW1hcnlVSVNvdXJjZUNvZGU7aWYoIXByaW1hcnlVSVNvdXJjZUNvZGUpCnJldHVybjtpZighdGhpcy5fcHJpbWFyeVVJU291cmNlQ29kZVtzeW1ib2xdKQp0aGlzLl9wcmltYXJ5VUlTb3VyY2VDb2RlW3N5bWJvbF09bmV3IFNldCgpO3RoaXMuX3ByaW1hcnlVSVNvdXJjZUNvZGVbc3ltYm9sXS5hZGQodGhpcyk7fQp1cmwoKXtyZXR1cm4gdGhpcy5fdXJsO30KbGluZU51bWJlcigpe3JldHVybiB0aGlzLl9saW5lTnVtYmVyO30KY29sdW1uTnVtYmVyKCl7cmV0dXJuIHRoaXMuX2NvbHVtbk51bWJlcjt9Cl9yZXBsYWNlVUlMb2NhdGlvbihvbGRVSUxvY2F0aW9uLG5ld1VJTG9jYXRpb24pe2lmKHRoaXMuX2lzUmVtb3ZlZCkKcmV0dXJuO3RoaXMuX3JlbW92ZVVJTG9jYXRpb24ob2xkVUlMb2NhdGlvbix0cnVlKTt0aGlzLl9yZW1vdmVGYWtlQnJlYWtwb2ludEF0UHJpbWFyeUxvY2F0aW9uKCk7Y29uc3QgY3VycmVudD0odGhpcy5fbnVtYmVyT2ZEZWJ1Z2dlckxvY2F0aW9uRm9yVUlMb2NhdGlvbi5nZXQobmV3VUlMb2NhdGlvbi5pZCgpKXx8MCkrMTt0aGlzLl9udW1iZXJPZkRlYnVnZ2VyTG9jYXRpb25Gb3JVSUxvY2F0aW9uLnNldChuZXdVSUxvY2F0aW9uLmlkKCksY3VycmVudCk7aWYoY3VycmVudD09PTEpCnRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl91aUxvY2F0aW9uQWRkZWQodGhpcyxuZXdVSUxvY2F0aW9uKTt9Cl9yZW1vdmVVSUxvY2F0aW9uKHVpTG9jYXRpb24sbXV0ZUNyZWF0aW9uRmFrZUJyZWFrcG9pbnQpe2lmKCF1aUxvY2F0aW9ufHwhdGhpcy5fbnVtYmVyT2ZEZWJ1Z2dlckxvY2F0aW9uRm9yVUlMb2NhdGlvbi5oYXModWlMb2NhdGlvbi5pZCgpKSkKcmV0dXJuO2NvbnN0IGN1cnJlbnQ9KHRoaXMuX251bWJlck9mRGVidWdnZXJMb2NhdGlvbkZvclVJTG9jYXRpb24uZ2V0KHVpTG9jYXRpb24uaWQoKSl8fDApLTE7dGhpcy5fbnVtYmVyT2ZEZWJ1Z2dlckxvY2F0aW9uRm9yVUlMb2NhdGlvbi5zZXQodWlMb2NhdGlvbi5pZCgpLGN1cnJlbnQpO2lmKGN1cnJlbnQhPT0wKQpyZXR1cm47dGhpcy5fbnVtYmVyT2ZEZWJ1Z2dlckxvY2F0aW9uRm9yVUlMb2NhdGlvbi5kZWxldGUodWlMb2NhdGlvbi5pZCgpKTt0aGlzLl9icmVha3BvaW50TWFuYWdlci5fdWlMb2NhdGlvblJlbW92ZWQodGhpcyx1aUxvY2F0aW9uKTtpZighbXV0ZUNyZWF0aW9uRmFrZUJyZWFrcG9pbnQpCnRoaXMuX2Zha2VCcmVha3BvaW50QXRQcmltYXJ5TG9jYXRpb24oKTt9CmVuYWJsZWQoKXtyZXR1cm4gdGhpcy5fZW5hYmxlZDt9CnNldEVuYWJsZWQoZW5hYmxlZCl7dGhpcy5fdXBkYXRlU3RhdGUodGhpcy5fY29uZGl0aW9uLGVuYWJsZWQpO30KY29uZGl0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbmRpdGlvbjt9CnNldENvbmRpdGlvbihjb25kaXRpb24pe3RoaXMuX3VwZGF0ZVN0YXRlKGNvbmRpdGlvbix0aGlzLl9lbmFibGVkKTt9Cl91cGRhdGVTdGF0ZShjb25kaXRpb24sZW5hYmxlZCl7aWYodGhpcy5fZW5hYmxlZD09PWVuYWJsZWQmJnRoaXMuX2NvbmRpdGlvbj09PWNvbmRpdGlvbikKcmV0dXJuO3RoaXMuX2VuYWJsZWQ9ZW5hYmxlZDt0aGlzLl9jb25kaXRpb249Y29uZGl0aW9uO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl9zdG9yYWdlLl91cGRhdGVCcmVha3BvaW50KHRoaXMpO3RoaXMuX3VwZGF0ZUJyZWFrcG9pbnQoKTt9Cl91cGRhdGVCcmVha3BvaW50KCl7dGhpcy5fcmVtb3ZlRmFrZUJyZWFrcG9pbnRBdFByaW1hcnlMb2NhdGlvbigpO3RoaXMuX2Zha2VCcmVha3BvaW50QXRQcmltYXJ5TG9jYXRpb24oKTtjb25zdCBtb2RlbEJyZWFrcG9pbnRzPXRoaXMuX21vZGVsQnJlYWtwb2ludHMudmFsdWVzQXJyYXkoKTtmb3IobGV0IGk9MDtpPG1vZGVsQnJlYWtwb2ludHMubGVuZ3RoOysraSkKbW9kZWxCcmVha3BvaW50c1tpXS5fc2NoZWR1bGVVcGRhdGVJbkRlYnVnZ2VyKCk7fQpyZW1vdmUoa2VlcEluU3RvcmFnZSl7dGhpcy5faXNSZW1vdmVkPXRydWU7Y29uc3QgcmVtb3ZlRnJvbVN0b3JhZ2U9IWtlZXBJblN0b3JhZ2U7dGhpcy5fcmVtb3ZlRmFrZUJyZWFrcG9pbnRBdFByaW1hcnlMb2NhdGlvbigpO2NvbnN0IG1vZGVsQnJlYWtwb2ludHM9dGhpcy5fbW9kZWxCcmVha3BvaW50cy52YWx1ZXNBcnJheSgpO2ZvcihsZXQgaT0wO2k8bW9kZWxCcmVha3BvaW50cy5sZW5ndGg7KytpKXttb2RlbEJyZWFrcG9pbnRzW2ldLl9zY2hlZHVsZVVwZGF0ZUluRGVidWdnZXIoKTttb2RlbEJyZWFrcG9pbnRzW2ldLl9yZW1vdmVFdmVudExpc3RlbmVycygpO30KdGhpcy5zZXRQcmltYXJ5VUlTb3VyY2VDb2RlKG51bGwpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl9yZW1vdmVCcmVha3BvaW50KHRoaXMscmVtb3ZlRnJvbVN0b3JhZ2UpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl90YXJnZXRNYW5hZ2VyLnVub2JzZXJ2ZU1vZGVscyhTREsuRGVidWdnZXJNb2RlbCx0aGlzKTt9Cl91cGRhdGVJbkRlYnVnZ2VyRm9yTW9kZWwoZGVidWdnZXJNb2RlbCl7dGhpcy5fbW9kZWxCcmVha3BvaW50cy5nZXQoZGVidWdnZXJNb2RlbCkuX3NjaGVkdWxlVXBkYXRlSW5EZWJ1Z2dlcigpO30KX2JyZWFrcG9pbnRTdG9yYWdlSWQoKXtyZXR1cm4gQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuX2JyZWFrcG9pbnRTdG9yYWdlSWQodGhpcy5fdXJsLHRoaXMuX2xpbmVOdW1iZXIsdGhpcy5fY29sdW1uTnVtYmVyKTt9Cl9mYWtlQnJlYWtwb2ludEF0UHJpbWFyeUxvY2F0aW9uKCl7aWYodGhpcy5faXNSZW1vdmVkfHx0aGlzLl9udW1iZXJPZkRlYnVnZ2VyTG9jYXRpb25Gb3JVSUxvY2F0aW9uLnNpemV8fHRoaXMuX2Zha2VQcmltYXJ5TG9jYXRpb24pCnJldHVybjtpZighdGhpcy5fcHJpbWFyeVVJU291cmNlQ29kZSkKcmV0dXJuO3RoaXMuX2Zha2VQcmltYXJ5TG9jYXRpb249dGhpcy5fcHJpbWFyeVVJU291cmNlQ29kZS51aUxvY2F0aW9uKHRoaXMuX2xpbmVOdW1iZXIsdGhpcy5fY29sdW1uTnVtYmVyKTtpZih0aGlzLl9mYWtlUHJpbWFyeUxvY2F0aW9uKQp0aGlzLl9icmVha3BvaW50TWFuYWdlci5fdWlMb2NhdGlvbkFkZGVkKHRoaXMsdGhpcy5fZmFrZVByaW1hcnlMb2NhdGlvbik7fQpfcmVtb3ZlRmFrZUJyZWFrcG9pbnRBdFByaW1hcnlMb2NhdGlvbigpe2lmKHRoaXMuX2Zha2VQcmltYXJ5TG9jYXRpb24pe3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLl91aUxvY2F0aW9uUmVtb3ZlZCh0aGlzLHRoaXMuX2Zha2VQcmltYXJ5TG9jYXRpb24pO2RlbGV0ZSB0aGlzLl9mYWtlUHJpbWFyeUxvY2F0aW9uO319Cl9yZXNldExvY2F0aW9ucygpe3RoaXMuc2V0UHJpbWFyeVVJU291cmNlQ29kZShudWxsKTt0aGlzLl9yZW1vdmVGYWtlQnJlYWtwb2ludEF0UHJpbWFyeUxvY2F0aW9uKCk7Y29uc3QgbW9kZWxCcmVha3BvaW50cz10aGlzLl9tb2RlbEJyZWFrcG9pbnRzLnZhbHVlc0FycmF5KCk7Zm9yKGxldCBpPTA7aTxtb2RlbEJyZWFrcG9pbnRzLmxlbmd0aDsrK2kpCm1vZGVsQnJlYWtwb2ludHNbaV0uX3Jlc2V0TG9jYXRpb25zKCk7fX07QmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuX2JyZWFrcG9pbnRzU3ltYm9sPVN5bWJvbCgnYnJlYWtwb2ludHMnKTtCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5Nb2RlbEJyZWFrcG9pbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCxicmVha3BvaW50LGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZyl7dGhpcy5fZGVidWdnZXJNb2RlbD1kZWJ1Z2dlck1vZGVsO3RoaXMuX2JyZWFrcG9pbnQ9YnJlYWtwb2ludDt0aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmc9ZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nO3RoaXMuX2xpdmVMb2NhdGlvbnM9bmV3IEJpbmRpbmdzLkxpdmVMb2NhdGlvblBvb2woKTt0aGlzLl91aUxvY2F0aW9ucz1uZXcgTWFwKCk7dGhpcy5fZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlcldhc0Rpc2FibGVkLHRoaXMuX2NsZWFuVXBBZnRlckRlYnVnZ2VySXNHb25lLHRoaXMpO3RoaXMuX2RlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRGVidWdnZXJXYXNFbmFibGVkLHRoaXMuX3NjaGVkdWxlVXBkYXRlSW5EZWJ1Z2dlcix0aGlzKTt0aGlzLl9oYXNQZW5kaW5nVXBkYXRlPWZhbHNlO3RoaXMuX2lzVXBkYXRpbmc9ZmFsc2U7dGhpcy5fY2FuY2VsQ2FsbGJhY2s9ZmFsc2U7dGhpcy5fY3VycmVudFN0YXRlPW51bGw7aWYodGhpcy5fZGVidWdnZXJNb2RlbC5kZWJ1Z2dlckVuYWJsZWQoKSkKdGhpcy5fc2NoZWR1bGVVcGRhdGVJbkRlYnVnZ2VyKCk7fQpfcmVzZXRMb2NhdGlvbnMoKXtmb3IoY29uc3QgdWlMb2NhdGlvbiBvZiB0aGlzLl91aUxvY2F0aW9ucy52YWx1ZXMoKSkKdGhpcy5fYnJlYWtwb2ludC5fcmVtb3ZlVUlMb2NhdGlvbih1aUxvY2F0aW9uKTt0aGlzLl91aUxvY2F0aW9ucy5jbGVhcigpO3RoaXMuX2xpdmVMb2NhdGlvbnMuZGlzcG9zZUFsbCgpO30KX3NjaGVkdWxlVXBkYXRlSW5EZWJ1Z2dlcigpe2lmKHRoaXMuX2lzVXBkYXRpbmcpe3RoaXMuX2hhc1BlbmRpbmdVcGRhdGU9dHJ1ZTtyZXR1cm47fQp0aGlzLl9pc1VwZGF0aW5nPXRydWU7dGhpcy5fdXBkYXRlSW5EZWJ1Z2dlcih0aGlzLl9kaWRVcGRhdGVJbkRlYnVnZ2VyLmJpbmQodGhpcykpO30KX2RpZFVwZGF0ZUluRGVidWdnZXIoKXt0aGlzLl9pc1VwZGF0aW5nPWZhbHNlO2lmKHRoaXMuX2hhc1BlbmRpbmdVcGRhdGUpe3RoaXMuX2hhc1BlbmRpbmdVcGRhdGU9ZmFsc2U7dGhpcy5fc2NoZWR1bGVVcGRhdGVJbkRlYnVnZ2VyKCk7fX0KX3NjcmlwdERpdmVyZ2VkKCl7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2JyZWFrcG9pbnQuX3ByaW1hcnlVSVNvdXJjZUNvZGU7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIGZhbHNlO2NvbnN0IHNjcmlwdEZpbGU9dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnNjcmlwdEZpbGUodWlTb3VyY2VDb2RlLHRoaXMuX2RlYnVnZ2VyTW9kZWwpO3JldHVybiEhc2NyaXB0RmlsZSYmc2NyaXB0RmlsZS5oYXNEaXZlcmdlZEZyb21WTSgpO30KYXN5bmMgX3VwZGF0ZUluRGVidWdnZXIoY2FsbGJhY2spe2lmKHRoaXMuX2RlYnVnZ2VyTW9kZWwudGFyZ2V0KCkuaXNEaXNwb3NlZCgpKXt0aGlzLl9jbGVhblVwQWZ0ZXJEZWJ1Z2dlcklzR29uZSgpO2NhbGxiYWNrKCk7cmV0dXJuO30KY29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2JyZWFrcG9pbnQuX3ByaW1hcnlVSVNvdXJjZUNvZGU7Y29uc3QgbGluZU51bWJlcj10aGlzLl9icmVha3BvaW50Ll9saW5lTnVtYmVyO2NvbnN0IGNvbHVtbk51bWJlcj10aGlzLl9icmVha3BvaW50Ll9jb2x1bW5OdW1iZXI7Y29uc3QgY29uZGl0aW9uPXRoaXMuX2JyZWFrcG9pbnQuY29uZGl0aW9uKCk7bGV0IGRlYnVnZ2VyTG9jYXRpb249dWlTb3VyY2VDb2RlJiZCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcudWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtpZihkZWJ1Z2dlckxvY2F0aW9uJiZkZWJ1Z2dlckxvY2F0aW9uLmRlYnVnZ2VyTW9kZWwhPT10aGlzLl9kZWJ1Z2dlck1vZGVsKQpkZWJ1Z2dlckxvY2F0aW9uPW51bGw7bGV0IG5ld1N0YXRlO2lmKHRoaXMuX2JyZWFrcG9pbnQuX2lzUmVtb3ZlZHx8IXRoaXMuX2JyZWFrcG9pbnQuZW5hYmxlZCgpfHx0aGlzLl9zY3JpcHREaXZlcmdlZCgpKXtuZXdTdGF0ZT1udWxsO31lbHNlIGlmKGRlYnVnZ2VyTG9jYXRpb24pe2NvbnN0IHNjcmlwdD1kZWJ1Z2dlckxvY2F0aW9uLnNjcmlwdCgpO2lmKHNjcmlwdC5zb3VyY2VVUkwpe25ld1N0YXRlPW5ldyBCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5CcmVha3BvaW50LlN0YXRlKHNjcmlwdC5zb3VyY2VVUkwsbnVsbCxudWxsLGRlYnVnZ2VyTG9jYXRpb24ubGluZU51bWJlcixkZWJ1Z2dlckxvY2F0aW9uLmNvbHVtbk51bWJlcixjb25kaXRpb24pO31lbHNle25ld1N0YXRlPW5ldyBCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5CcmVha3BvaW50LlN0YXRlKG51bGwsc2NyaXB0LnNjcmlwdElkLHNjcmlwdC5oYXNoLGRlYnVnZ2VyTG9jYXRpb24ubGluZU51bWJlcixkZWJ1Z2dlckxvY2F0aW9uLmNvbHVtbk51bWJlcixjb25kaXRpb24pO319ZWxzZSBpZih0aGlzLl9icmVha3BvaW50Ll9jdXJyZW50U3RhdGUmJnRoaXMuX2JyZWFrcG9pbnQuX2N1cnJlbnRTdGF0ZS51cmwpe2NvbnN0IHBvc2l0aW9uPXRoaXMuX2JyZWFrcG9pbnQuX2N1cnJlbnRTdGF0ZTtuZXdTdGF0ZT1uZXcgQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuQnJlYWtwb2ludC5TdGF0ZShwb3NpdGlvbi51cmwsbnVsbCxudWxsLHBvc2l0aW9uLmxpbmVOdW1iZXIscG9zaXRpb24uY29sdW1uTnVtYmVyLGNvbmRpdGlvbik7fWVsc2UgaWYodWlTb3VyY2VDb2RlKXtuZXdTdGF0ZT1uZXcgQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuQnJlYWtwb2ludC5TdGF0ZSh1aVNvdXJjZUNvZGUudXJsKCksbnVsbCxudWxsLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNvbmRpdGlvbik7fQppZih0aGlzLl9kZWJ1Z2dlcklkJiZCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5CcmVha3BvaW50LlN0YXRlLmVxdWFscyhuZXdTdGF0ZSx0aGlzLl9jdXJyZW50U3RhdGUpKXtjYWxsYmFjaygpO3JldHVybjt9CnRoaXMuX2JyZWFrcG9pbnQuX2N1cnJlbnRTdGF0ZT1uZXdTdGF0ZTtpZih0aGlzLl9kZWJ1Z2dlcklkKXthd2FpdCB0aGlzLl9yZWZyZXNoQnJlYWtwb2ludCgpO2NhbGxiYWNrKCk7cmV0dXJuO30KaWYoIW5ld1N0YXRlKXtjYWxsYmFjaygpO3JldHVybjt9CmxldCByZXN1bHQ7dGhpcy5fY3VycmVudFN0YXRlPW5ld1N0YXRlO2lmKG5ld1N0YXRlLnVybCl7cmVzdWx0PWF3YWl0IHRoaXMuX2RlYnVnZ2VyTW9kZWwuc2V0QnJlYWtwb2ludEJ5VVJMKG5ld1N0YXRlLnVybCxuZXdTdGF0ZS5saW5lTnVtYmVyLG5ld1N0YXRlLmNvbHVtbk51bWJlcixuZXdTdGF0ZS5jb25kaXRpb24pO31lbHNlIGlmKG5ld1N0YXRlLnNjcmlwdElkJiZuZXdTdGF0ZS5zY3JpcHRIYXNoKXtyZXN1bHQ9YXdhaXQgdGhpcy5fZGVidWdnZXJNb2RlbC5zZXRCcmVha3BvaW50SW5Bbm9ueW1vdXNTY3JpcHQobmV3U3RhdGUuc2NyaXB0SWQsbmV3U3RhdGUuc2NyaXB0SGFzaCxuZXdTdGF0ZS5saW5lTnVtYmVyLG5ld1N0YXRlLmNvbHVtbk51bWJlcixuZXdTdGF0ZS5jb25kaXRpb24pO30KaWYocmVzdWx0JiZyZXN1bHQuYnJlYWtwb2ludElkKQp0aGlzLl9kaWRTZXRCcmVha3BvaW50SW5EZWJ1Z2dlcihjYWxsYmFjayxyZXN1bHQuYnJlYWtwb2ludElkLHJlc3VsdC5sb2NhdGlvbnMpO2Vsc2UKdGhpcy5fZGlkU2V0QnJlYWtwb2ludEluRGVidWdnZXIoY2FsbGJhY2ssbnVsbCxbXSk7fQphc3luYyBfcmVmcmVzaEJyZWFrcG9pbnQoKXtpZighdGhpcy5fZGVidWdnZXJJZCkKcmV0dXJuO3RoaXMuX3Jlc2V0TG9jYXRpb25zKCk7YXdhaXQgdGhpcy5fZGVidWdnZXJNb2RlbC5yZW1vdmVCcmVha3BvaW50KHRoaXMuX2RlYnVnZ2VySWQpO3RoaXMuX2RpZFJlbW92ZUZyb21EZWJ1Z2dlcigpO3RoaXMuX2N1cnJlbnRTdGF0ZT1udWxsO3RoaXMuX3NjaGVkdWxlVXBkYXRlSW5EZWJ1Z2dlcigpO30KX2RpZFNldEJyZWFrcG9pbnRJbkRlYnVnZ2VyKGNhbGxiYWNrLGJyZWFrcG9pbnRJZCxsb2NhdGlvbnMpe2lmKHRoaXMuX2NhbmNlbENhbGxiYWNrKXt0aGlzLl9jYW5jZWxDYWxsYmFjaz1mYWxzZTtjYWxsYmFjaygpO3JldHVybjt9CmlmKCFicmVha3BvaW50SWQpe3RoaXMuX2JyZWFrcG9pbnQucmVtb3ZlKHRydWUpO2NhbGxiYWNrKCk7cmV0dXJuO30KdGhpcy5fZGVidWdnZXJJZD1icmVha3BvaW50SWQ7dGhpcy5fZGVidWdnZXJNb2RlbC5hZGRCcmVha3BvaW50TGlzdGVuZXIodGhpcy5fZGVidWdnZXJJZCx0aGlzLl9icmVha3BvaW50UmVzb2x2ZWQsdGhpcyk7Zm9yKGxldCBpPTA7aTxsb2NhdGlvbnMubGVuZ3RoOysraSl7aWYoIXRoaXMuX2FkZFJlc29sdmVkTG9jYXRpb24obG9jYXRpb25zW2ldKSkKYnJlYWs7fQpjYWxsYmFjaygpO30KX2RpZFJlbW92ZUZyb21EZWJ1Z2dlcigpe2lmKHRoaXMuX2NhbmNlbENhbGxiYWNrKXt0aGlzLl9jYW5jZWxDYWxsYmFjaz1mYWxzZTtyZXR1cm47fQp0aGlzLl9yZXNldExvY2F0aW9ucygpO3RoaXMuX2RlYnVnZ2VyTW9kZWwucmVtb3ZlQnJlYWtwb2ludExpc3RlbmVyKHRoaXMuX2RlYnVnZ2VySWQsdGhpcy5fYnJlYWtwb2ludFJlc29sdmVkLHRoaXMpO2RlbGV0ZSB0aGlzLl9kZWJ1Z2dlcklkO30KX2JyZWFrcG9pbnRSZXNvbHZlZChldmVudCl7dGhpcy5fYWRkUmVzb2x2ZWRMb2NhdGlvbigoZXZlbnQuZGF0YSkpO30KX2xvY2F0aW9uVXBkYXRlZChsb2NhdGlvbixsaXZlTG9jYXRpb24pe2NvbnN0IHVpTG9jYXRpb249bGl2ZUxvY2F0aW9uLnVpTG9jYXRpb24oKTtpZighdWlMb2NhdGlvbikKcmV0dXJuO2NvbnN0IG9sZFVJTG9jYXRpb249dGhpcy5fdWlMb2NhdGlvbnMuZ2V0KGxvY2F0aW9uLmlkKCkpfHxudWxsO3RoaXMuX3VpTG9jYXRpb25zLnNldChsb2NhdGlvbi5pZCgpLHVpTG9jYXRpb24pO3RoaXMuX2JyZWFrcG9pbnQuX3JlcGxhY2VVSUxvY2F0aW9uKG9sZFVJTG9jYXRpb24sdWlMb2NhdGlvbik7fQpfYWRkUmVzb2x2ZWRMb2NhdGlvbihsb2NhdGlvbil7Y29uc3QgdWlMb2NhdGlvbj10aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24obG9jYXRpb24pO2lmKCF1aUxvY2F0aW9uKQpyZXR1cm4gZmFsc2U7Y29uc3QgYnJlYWtwb2ludD10aGlzLl9icmVha3BvaW50Ll9icmVha3BvaW50TWFuYWdlci5maW5kQnJlYWtwb2ludCh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSx1aUxvY2F0aW9uLmxpbmVOdW1iZXIsdWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2lmKGJyZWFrcG9pbnQmJmJyZWFrcG9pbnQhPT10aGlzLl9icmVha3BvaW50KXt0aGlzLl9icmVha3BvaW50LnJlbW92ZShmYWxzZSk7cmV0dXJuIGZhbHNlO30KdGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLmNyZWF0ZUxpdmVMb2NhdGlvbihsb2NhdGlvbix0aGlzLl9sb2NhdGlvblVwZGF0ZWQuYmluZCh0aGlzLGxvY2F0aW9uKSx0aGlzLl9saXZlTG9jYXRpb25zKTtyZXR1cm4gdHJ1ZTt9Cl9jbGVhblVwQWZ0ZXJEZWJ1Z2dlcklzR29uZSgpe2lmKHRoaXMuX2lzVXBkYXRpbmcpCnRoaXMuX2NhbmNlbENhbGxiYWNrPXRydWU7dGhpcy5fcmVzZXRMb2NhdGlvbnMoKTt0aGlzLl9jdXJyZW50U3RhdGU9bnVsbDtpZih0aGlzLl9kZWJ1Z2dlcklkKQp0aGlzLl9kaWRSZW1vdmVGcm9tRGVidWdnZXIoKTt9Cl9yZW1vdmVFdmVudExpc3RlbmVycygpe3RoaXMuX2RlYnVnZ2VyTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRGVidWdnZXJXYXNEaXNhYmxlZCx0aGlzLl9jbGVhblVwQWZ0ZXJEZWJ1Z2dlcklzR29uZSx0aGlzKTt0aGlzLl9kZWJ1Z2dlck1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyV2FzRW5hYmxlZCx0aGlzLl9zY2hlZHVsZVVwZGF0ZUluRGVidWdnZXIsdGhpcyk7fX07QmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuQnJlYWtwb2ludC5TdGF0ZT1jbGFzc3tjb25zdHJ1Y3Rvcih1cmwsc2NyaXB0SWQsc2NyaXB0SGFzaCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24pe3RoaXMudXJsPXVybDt0aGlzLnNjcmlwdElkPXNjcmlwdElkO3RoaXMuc2NyaXB0SGFzaD1zY3JpcHRIYXNoO3RoaXMubGluZU51bWJlcj1saW5lTnVtYmVyO3RoaXMuY29sdW1uTnVtYmVyPWNvbHVtbk51bWJlcjt0aGlzLmNvbmRpdGlvbj1jb25kaXRpb247fQpzdGF0aWMgZXF1YWxzKHN0YXRlQSxzdGF0ZUIpe2lmKCFzdGF0ZUF8fCFzdGF0ZUIpCnJldHVybiBmYWxzZTtyZXR1cm4gc3RhdGVBLnVybD09PXN0YXRlQi51cmwmJnN0YXRlQS5zY3JpcHRJZD09PXN0YXRlQi5zY3JpcHRJZCYmc3RhdGVBLnNjcmlwdEhhc2g9PT1zdGF0ZUIuc2NyaXB0SGFzaCYmc3RhdGVBLmxpbmVOdW1iZXI9PT1zdGF0ZUIubGluZU51bWJlciYmc3RhdGVBLmNvbHVtbk51bWJlcj09PXN0YXRlQi5jb2x1bW5OdW1iZXImJnN0YXRlQS5jb25kaXRpb249PT1zdGF0ZUIuY29uZGl0aW9uO319O0JpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLlN0b3JhZ2U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9zZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ2JyZWFrcG9pbnRzJyxbXSk7dGhpcy5fYnJlYWtwb2ludHM9bmV3IE1hcCgpO2NvbnN0IGl0ZW1zPSh0aGlzLl9zZXR0aW5nLmdldCgpKTtmb3IoY29uc3QgaXRlbSBvZiBpdGVtcyl7aXRlbS5jb2x1bW5OdW1iZXI9aXRlbS5jb2x1bW5OdW1iZXJ8fDA7dGhpcy5fYnJlYWtwb2ludHMuc2V0KEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLl9icmVha3BvaW50U3RvcmFnZUlkKGl0ZW0udXJsLGl0ZW0ubGluZU51bWJlcixpdGVtLmNvbHVtbk51bWJlciksaXRlbSk7fQp0aGlzLl9tdXRlZDt9Cm11dGUoKXt0aGlzLl9tdXRlZD10cnVlO30KdW5tdXRlKCl7ZGVsZXRlIHRoaXMuX211dGVkO30KYnJlYWtwb2ludEl0ZW1zKHVybCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYnJlYWtwb2ludHMudmFsdWVzKCkpLmZpbHRlcihpdGVtPT5pdGVtLnVybD09PXVybCk7fQpfdXBkYXRlQnJlYWtwb2ludChicmVha3BvaW50KXtpZih0aGlzLl9tdXRlZHx8IWJyZWFrcG9pbnQuX2JyZWFrcG9pbnRTdG9yYWdlSWQoKSkKcmV0dXJuO3RoaXMuX2JyZWFrcG9pbnRzLnNldChicmVha3BvaW50Ll9icmVha3BvaW50U3RvcmFnZUlkKCksbmV3IEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLlN0b3JhZ2UuSXRlbShicmVha3BvaW50KSk7dGhpcy5fc2F2ZSgpO30KX3JlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludCl7aWYodGhpcy5fbXV0ZWQpCnJldHVybjt0aGlzLl9icmVha3BvaW50cy5kZWxldGUoYnJlYWtwb2ludC5fYnJlYWtwb2ludFN0b3JhZ2VJZCgpKTt0aGlzLl9zYXZlKCk7fQpfc2F2ZSgpe3RoaXMuX3NldHRpbmcuc2V0KEFycmF5LmZyb20odGhpcy5fYnJlYWtwb2ludHMudmFsdWVzKCkpKTt9fTtCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5TdG9yYWdlLkl0ZW09Y2xhc3N7Y29uc3RydWN0b3IoYnJlYWtwb2ludCl7dGhpcy51cmw9YnJlYWtwb2ludC5fdXJsO3RoaXMubGluZU51bWJlcj1icmVha3BvaW50LmxpbmVOdW1iZXIoKTt0aGlzLmNvbHVtbk51bWJlcj1icmVha3BvaW50LmNvbHVtbk51bWJlcigpO3RoaXMuY29uZGl0aW9uPWJyZWFrcG9pbnQuY29uZGl0aW9uKCk7dGhpcy5lbmFibGVkPWJyZWFrcG9pbnQuZW5hYmxlZCgpO319O0JpbmRpbmdzLmJyZWFrcG9pbnRNYW5hZ2VyOztCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3Q9Y2xhc3MgZXh0ZW5kcyBXb3Jrc3BhY2UuUHJvamVjdFN0b3Jle2NvbnN0cnVjdG9yKHdvcmtzcGFjZSxpZCx0eXBlLGRpc3BsYXlOYW1lLGlzU2VydmljZVByb2plY3Qpe3N1cGVyKHdvcmtzcGFjZSxpZCx0eXBlLGRpc3BsYXlOYW1lKTt0aGlzLl9jb250ZW50UHJvdmlkZXJzPXt9O3RoaXMuX2lzU2VydmljZVByb2plY3Q9aXNTZXJ2aWNlUHJvamVjdDt3b3Jrc3BhY2UuYWRkUHJvamVjdCh0aGlzKTt9CnJlcXVlc3RGaWxlQ29udGVudCh1aVNvdXJjZUNvZGUsY2FsbGJhY2spe2NvbnN0IGNvbnRlbnRQcm92aWRlcj10aGlzLl9jb250ZW50UHJvdmlkZXJzW3VpU291cmNlQ29kZS51cmwoKV07KGFzeW5jKCk9PntjYWxsYmFjayhhd2FpdCBjb250ZW50UHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKSxhd2FpdCBjb250ZW50UHJvdmlkZXIuY29udGVudEVuY29kZWQoKSk7fSkoKTt9CmlzU2VydmljZVByb2plY3QoKXtyZXR1cm4gdGhpcy5faXNTZXJ2aWNlUHJvamVjdDt9CnJlcXVlc3RNZXRhZGF0YSh1aVNvdXJjZUNvZGUpe3JldHVybiBQcm9taXNlLnJlc29sdmUodWlTb3VyY2VDb2RlW0JpbmRpbmdzLkNvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdC5fbWV0YWRhdGFdKTt9CmNhblNldEZpbGVDb250ZW50KCl7cmV0dXJuIGZhbHNlO30KYXN5bmMgc2V0RmlsZUNvbnRlbnQodWlTb3VyY2VDb2RlLG5ld0NvbnRlbnQsaXNCYXNlNjQpe30KZnVsbERpc3BsYXlOYW1lKHVpU291cmNlQ29kZSl7bGV0IHBhcmVudFBhdGg9dWlTb3VyY2VDb2RlLnBhcmVudFVSTCgpLnJlcGxhY2UoL14oPzpodHRwcz98ZmlsZSlcOlwvXC8vLCcnKTt0cnl7cGFyZW50UGF0aD1kZWNvZGVVUkkocGFyZW50UGF0aCk7fWNhdGNoKGUpe30KcmV0dXJuIHBhcmVudFBhdGgrJy8nK3VpU291cmNlQ29kZS5kaXNwbGF5TmFtZSh0cnVlKTt9Cm1pbWVUeXBlKHVpU291cmNlQ29kZSl7cmV0dXJuKHVpU291cmNlQ29kZVtCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3QuX21pbWVUeXBlXSk7fQpjYW5SZW5hbWUoKXtyZXR1cm4gZmFsc2U7fQpyZW5hbWUodWlTb3VyY2VDb2RlLG5ld05hbWUsY2FsbGJhY2spe2NvbnN0IHBhdGg9dWlTb3VyY2VDb2RlLnVybCgpO3RoaXMucGVyZm9ybVJlbmFtZShwYXRoLG5ld05hbWUsaW5uZXJDYWxsYmFjay5iaW5kKHRoaXMpKTtmdW5jdGlvbiBpbm5lckNhbGxiYWNrKHN1Y2Nlc3MsbmV3TmFtZSl7aWYoc3VjY2VzcyYmbmV3TmFtZSl7Y29uc3QgY29weU9mUGF0aD1wYXRoLnNwbGl0KCcvJyk7Y29weU9mUGF0aFtjb3B5T2ZQYXRoLmxlbmd0aC0xXT1uZXdOYW1lO2NvbnN0IG5ld1BhdGg9Y29weU9mUGF0aC5qb2luKCcvJyk7dGhpcy5fY29udGVudFByb3ZpZGVyc1tuZXdQYXRoXT10aGlzLl9jb250ZW50UHJvdmlkZXJzW3BhdGhdO2RlbGV0ZSB0aGlzLl9jb250ZW50UHJvdmlkZXJzW3BhdGhdO3RoaXMucmVuYW1lVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSxuZXdOYW1lKTt9CmNhbGxiYWNrKHN1Y2Nlc3MsbmV3TmFtZSk7fX0KZXhjbHVkZUZvbGRlcihwYXRoKXt9CmNhbkV4Y2x1ZGVGb2xkZXIocGF0aCl7cmV0dXJuIGZhbHNlO30KY3JlYXRlRmlsZShwYXRoLG5hbWUsY29udGVudCxpc0Jhc2U2NCl7fQpjYW5DcmVhdGVGaWxlKCl7cmV0dXJuIGZhbHNlO30KZGVsZXRlRmlsZSh1aVNvdXJjZUNvZGUpe30KcmVtb3ZlKCl7fQpwZXJmb3JtUmVuYW1lKHBhdGgsbmV3TmFtZSxjYWxsYmFjayl7Y2FsbGJhY2soZmFsc2UpO30Kc2VhcmNoSW5GaWxlQ29udGVudCh1aVNvdXJjZUNvZGUscXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCBjb250ZW50UHJvdmlkZXI9dGhpcy5fY29udGVudFByb3ZpZGVyc1t1aVNvdXJjZUNvZGUudXJsKCldO3JldHVybiBjb250ZW50UHJvdmlkZXIuc2VhcmNoSW5Db250ZW50KHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCk7fQphc3luYyBmaW5kRmlsZXNNYXRjaGluZ1NlYXJjaFJlcXVlc3Qoc2VhcmNoQ29uZmlnLGZpbGVzTWF0aGluZ0ZpbGVRdWVyeSxwcm9ncmVzcyl7Y29uc3QgcmVzdWx0PVtdO3Byb2dyZXNzLnNldFRvdGFsV29yayhmaWxlc01hdGhpbmdGaWxlUXVlcnkubGVuZ3RoKTthd2FpdCBQcm9taXNlLmFsbChmaWxlc01hdGhpbmdGaWxlUXVlcnkubWFwKHNlYXJjaEluQ29udGVudC5iaW5kKHRoaXMpKSk7cHJvZ3Jlc3MuZG9uZSgpO3JldHVybiByZXN1bHQ7YXN5bmMgZnVuY3Rpb24gc2VhcmNoSW5Db250ZW50KHBhdGgpe2NvbnN0IHByb3ZpZGVyPXRoaXMuX2NvbnRlbnRQcm92aWRlcnNbcGF0aF07bGV0IGFsbE1hdGNoZXNGb3VuZD10cnVlO2Zvcihjb25zdCBxdWVyeSBvZiBzZWFyY2hDb25maWcucXVlcmllcygpLnNsaWNlKCkpe2NvbnN0IHNlYXJjaE1hdGNoZXM9YXdhaXQgcHJvdmlkZXIuc2VhcmNoSW5Db250ZW50KHF1ZXJ5LCFzZWFyY2hDb25maWcuaWdub3JlQ2FzZSgpLHNlYXJjaENvbmZpZy5pc1JlZ2V4KCkpO2lmKCFzZWFyY2hNYXRjaGVzLmxlbmd0aCl7YWxsTWF0Y2hlc0ZvdW5kPWZhbHNlO2JyZWFrO319CmlmKGFsbE1hdGNoZXNGb3VuZCkKcmVzdWx0LnB1c2gocGF0aCk7cHJvZ3Jlc3Mud29ya2VkKDEpO319CmluZGV4Q29udGVudChwcm9ncmVzcyl7c2V0SW1tZWRpYXRlKHByb2dyZXNzLmRvbmUuYmluZChwcm9ncmVzcykpO30KYWRkVUlTb3VyY2VDb2RlV2l0aFByb3ZpZGVyKHVpU291cmNlQ29kZSxjb250ZW50UHJvdmlkZXIsbWV0YWRhdGEsbWltZVR5cGUpe3VpU291cmNlQ29kZVtCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3QuX21pbWVUeXBlXT1taW1lVHlwZTt0aGlzLl9jb250ZW50UHJvdmlkZXJzW3VpU291cmNlQ29kZS51cmwoKV09Y29udGVudFByb3ZpZGVyO3VpU291cmNlQ29kZVtCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3QuX21ldGFkYXRhXT1tZXRhZGF0YTt0aGlzLmFkZFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO30KYWRkQ29udGVudFByb3ZpZGVyKHVybCxjb250ZW50UHJvdmlkZXIsbWltZVR5cGUpe2NvbnN0IHVpU291cmNlQ29kZT10aGlzLmNyZWF0ZVVJU291cmNlQ29kZSh1cmwsY29udGVudFByb3ZpZGVyLmNvbnRlbnRUeXBlKCkpO3RoaXMuYWRkVUlTb3VyY2VDb2RlV2l0aFByb3ZpZGVyKHVpU291cmNlQ29kZSxjb250ZW50UHJvdmlkZXIsbnVsbCxtaW1lVHlwZSk7cmV0dXJuIHVpU291cmNlQ29kZTt9CnJlbW92ZUZpbGUocGF0aCl7ZGVsZXRlIHRoaXMuX2NvbnRlbnRQcm92aWRlcnNbcGF0aF07dGhpcy5yZW1vdmVVSVNvdXJjZUNvZGUocGF0aCk7fQpyZXNldCgpe3RoaXMuX2NvbnRlbnRQcm92aWRlcnM9e307dGhpcy5yZW1vdmVQcm9qZWN0KCk7dGhpcy53b3Jrc3BhY2UoKS5hZGRQcm9qZWN0KHRoaXMpO30KZGlzcG9zZSgpe3RoaXMuX2NvbnRlbnRQcm92aWRlcnM9e307dGhpcy5yZW1vdmVQcm9qZWN0KCk7fX07QmluZGluZ3MuQ29udGVudFByb3ZpZGVyQmFzZWRQcm9qZWN0Ll9tZXRhZGF0YT1TeW1ib2woJ0NvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdC5NZXRhZGF0YScpO0JpbmRpbmdzLkNvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdC5fbWltZVR5cGU9U3ltYm9sKCdCaW5kaW5ncy5Db250ZW50UHJvdmlkZXJCYXNlZFByb2plY3QuX21pbWVUeXBlJyk7O0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nPWNsYXNze2NvbnN0cnVjdG9yKGRlYnVnZ2VyTW9kZWwsd29ya3NwYWNlLGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZyl7dGhpcy5fZGVidWdnZXJNb2RlbD1kZWJ1Z2dlck1vZGVsO3RoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZz1kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmc7dGhpcy5fcHJvamVjdD1uZXcgQmluZGluZ3MuQ29udGVudFByb3ZpZGVyQmFzZWRQcm9qZWN0KHdvcmtzcGFjZSwnZGVidWdnZXI6JytkZWJ1Z2dlck1vZGVsLnRhcmdldCgpLmlkKCksV29ya3NwYWNlLnByb2plY3RUeXBlcy5EZWJ1Z2dlciwnJyx0cnVlKTt0aGlzLl9ldmVudExpc3RlbmVycz1bZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMuX2RlYnVnZ2VyUmVzZXQsdGhpcyksZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5QYXJzZWRTY3JpcHRTb3VyY2UsdGhpcy5fcGFyc2VkU2NyaXB0U291cmNlLHRoaXMpLGRlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRmFpbGVkVG9QYXJzZVNjcmlwdFNvdXJjZSx0aGlzLl9wYXJzZWRTY3JpcHRTb3VyY2UsdGhpcyksZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EaXNjYXJkZWRBbm9ueW1vdXNTY3JpcHRTb3VyY2UsdGhpcy5fZGlzY2FyZGVkU2NyaXB0U291cmNlLHRoaXMpXTt9CnN0YXRpYyBzY3JpcHRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtyZXR1cm4gdWlTb3VyY2VDb2RlW0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl9zY3JpcHRTeW1ib2xdfHxudWxsO30KcmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pe2NvbnN0IHNjcmlwdD1yYXdMb2NhdGlvbi5zY3JpcHQoKTtpZighc2NyaXB0KQpyZXR1cm4gbnVsbDtjb25zdCB1aVNvdXJjZUNvZGU9c2NyaXB0W0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl91aVNvdXJjZUNvZGVTeW1ib2xdO2NvbnN0IGxpbmVOdW1iZXI9cmF3TG9jYXRpb24ubGluZU51bWJlci0oc2NyaXB0LmlzSW5saW5lU2NyaXB0V2l0aFNvdXJjZVVSTCgpP3NjcmlwdC5saW5lT2Zmc2V0OjApO2xldCBjb2x1bW5OdW1iZXI9cmF3TG9jYXRpb24uY29sdW1uTnVtYmVyfHwwO2lmKHNjcmlwdC5pc0lubGluZVNjcmlwdFdpdGhTb3VyY2VVUkwoKSYmIWxpbmVOdW1iZXImJmNvbHVtbk51bWJlcikKY29sdW1uTnVtYmVyLT1zY3JpcHQuY29sdW1uT2Zmc2V0O3JldHVybiB1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fQp1aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IHNjcmlwdD11aVNvdXJjZUNvZGVbQmluZGluZ3MuRGVmYXVsdFNjcmlwdE1hcHBpbmcuX3NjcmlwdFN5bWJvbF07aWYoIXNjcmlwdCkKcmV0dXJuIG51bGw7aWYoc2NyaXB0LmlzSW5saW5lU2NyaXB0V2l0aFNvdXJjZVVSTCgpKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbihzY3JpcHQsbGluZU51bWJlcitzY3JpcHQubGluZU9mZnNldCxsaW5lTnVtYmVyP2NvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXIrc2NyaXB0LmNvbHVtbk9mZnNldCk7fQpyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbihzY3JpcHQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KX3BhcnNlZFNjcmlwdFNvdXJjZShldmVudCl7Y29uc3Qgc2NyaXB0PShldmVudC5kYXRhKTtjb25zdCBuYW1lPUNvbW1vbi5QYXJzZWRVUkwuZXh0cmFjdE5hbWUoc2NyaXB0LnNvdXJjZVVSTCk7Y29uc3QgdXJsPSdkZWJ1Z2dlcjovLy9WTScrc2NyaXB0LnNjcmlwdElkKyhuYW1lPycgJytuYW1lOicnKTtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC5jcmVhdGVVSVNvdXJjZUNvZGUodXJsLENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdCk7dWlTb3VyY2VDb2RlW0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl9zY3JpcHRTeW1ib2xdPXNjcmlwdDtzY3JpcHRbQmluZGluZ3MuRGVmYXVsdFNjcmlwdE1hcHBpbmcuX3VpU291cmNlQ29kZVN5bWJvbF09dWlTb3VyY2VDb2RlO3RoaXMuX3Byb2plY3QuYWRkVUlTb3VyY2VDb2RlV2l0aFByb3ZpZGVyKHVpU291cmNlQ29kZSxzY3JpcHQsbnVsbCwndGV4dC9qYXZhc2NyaXB0Jyk7dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30KX2Rpc2NhcmRlZFNjcmlwdFNvdXJjZShldmVudCl7Y29uc3Qgc2NyaXB0PShldmVudC5kYXRhKTtjb25zdCB1aVNvdXJjZUNvZGU9c2NyaXB0W0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl91aVNvdXJjZUNvZGVTeW1ib2xdO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybjtkZWxldGUgc2NyaXB0W0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl91aVNvdXJjZUNvZGVTeW1ib2xdO2RlbGV0ZSB1aVNvdXJjZUNvZGVbQmluZGluZ3MuRGVmYXVsdFNjcmlwdE1hcHBpbmcuX3NjcmlwdFN5bWJvbF07dGhpcy5fcHJvamVjdC5yZW1vdmVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLnVybCgpKTt9Cl9kZWJ1Z2dlclJlc2V0KCl7dGhpcy5fcHJvamVjdC5yZXNldCgpO30KZGlzcG9zZSgpe0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7dGhpcy5fZGVidWdnZXJSZXNldCgpO3RoaXMuX3Byb2plY3QuZGlzcG9zZSgpO319O0JpbmRpbmdzLkRlZmF1bHRTY3JpcHRNYXBwaW5nLl9zY3JpcHRTeW1ib2w9U3ltYm9sKCdzeW1ib2wnKTtCaW5kaW5ncy5EZWZhdWx0U2NyaXB0TWFwcGluZy5fdWlTb3VyY2VDb2RlU3ltYm9sPVN5bWJvbCgndWlTb3VyY2VDb2RlU3ltYm9sJyk7O0JpbmRpbmdzLkNodW5rZWRSZWFkZXI9ZnVuY3Rpb24oKXt9O0JpbmRpbmdzLkNodW5rZWRSZWFkZXIucHJvdG90eXBlPXtmaWxlU2l6ZSgpe30sbG9hZGVkU2l6ZSgpe30sZmlsZU5hbWUoKXt9LGNhbmNlbCgpe30sZXJyb3IoKXt9fTtCaW5kaW5ncy5DaHVua2VkRmlsZVJlYWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihibG9iLGNodW5rU2l6ZSxjaHVua1RyYW5zZmVycmVkQ2FsbGJhY2spe3RoaXMuX2ZpbGU9YmxvYjt0aGlzLl9maWxlU2l6ZT1ibG9iLnNpemU7dGhpcy5fbG9hZGVkU2l6ZT0wO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5fY2h1bmtUcmFuc2ZlcnJlZENhbGxiYWNrPWNodW5rVHJhbnNmZXJyZWRDYWxsYmFjazt0aGlzLl9kZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO3RoaXMuX2lzQ2FuY2VsZWQ9ZmFsc2U7dGhpcy5fZXJyb3I9bnVsbDt9CnJlYWQob3V0cHV0KXtpZih0aGlzLl9jaHVua1RyYW5zZmVycmVkQ2FsbGJhY2spCnRoaXMuX2NodW5rVHJhbnNmZXJyZWRDYWxsYmFjayh0aGlzKTt0aGlzLl9vdXRwdXQ9b3V0cHV0O3RoaXMuX3JlYWRlcj1uZXcgRmlsZVJlYWRlcigpO3RoaXMuX3JlYWRlci5vbmxvYWQ9dGhpcy5fb25DaHVua0xvYWRlZC5iaW5kKHRoaXMpO3RoaXMuX3JlYWRlci5vbmVycm9yPXRoaXMuX29uRXJyb3IuYmluZCh0aGlzKTt0aGlzLl9sb2FkQ2h1bmsoKTtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+dGhpcy5fdHJhbnNmZXJGaW5pc2hlZD1yZXNvbHZlKTt9CmNhbmNlbCgpe3RoaXMuX2lzQ2FuY2VsZWQ9dHJ1ZTt9CmxvYWRlZFNpemUoKXtyZXR1cm4gdGhpcy5fbG9hZGVkU2l6ZTt9CmZpbGVTaXplKCl7cmV0dXJuIHRoaXMuX2ZpbGVTaXplO30KZmlsZU5hbWUoKXtyZXR1cm4gdGhpcy5fZmlsZS5uYW1lO30KZXJyb3IoKXtyZXR1cm4gdGhpcy5fZXJyb3I7fQpfb25DaHVua0xvYWRlZChldmVudCl7aWYodGhpcy5faXNDYW5jZWxlZCkKcmV0dXJuO2lmKGV2ZW50LnRhcmdldC5yZWFkeVN0YXRlIT09RmlsZVJlYWRlci5ET05FKQpyZXR1cm47Y29uc3QgYnVmZmVyPXRoaXMuX3JlYWRlci5yZXN1bHQ7dGhpcy5fbG9hZGVkU2l6ZSs9YnVmZmVyLmJ5dGVMZW5ndGg7Y29uc3QgZW5kT2ZGaWxlPXRoaXMuX2xvYWRlZFNpemU9PT10aGlzLl9maWxlU2l6ZTtjb25zdCBkZWNvZGVkU3RyaW5nPXRoaXMuX2RlY29kZXIuZGVjb2RlKGJ1ZmZlcix7c3RyZWFtOiFlbmRPZkZpbGV9KTt0aGlzLl9vdXRwdXQud3JpdGUoZGVjb2RlZFN0cmluZyk7aWYodGhpcy5faXNDYW5jZWxlZCkKcmV0dXJuO2lmKHRoaXMuX2NodW5rVHJhbnNmZXJyZWRDYWxsYmFjaykKdGhpcy5fY2h1bmtUcmFuc2ZlcnJlZENhbGxiYWNrKHRoaXMpO2lmKGVuZE9mRmlsZSl7dGhpcy5fZmlsZT1udWxsO3RoaXMuX3JlYWRlcj1udWxsO3RoaXMuX291dHB1dC5jbG9zZSgpO3RoaXMuX3RyYW5zZmVyRmluaXNoZWQoIXRoaXMuX2Vycm9yKTtyZXR1cm47fQp0aGlzLl9sb2FkQ2h1bmsoKTt9Cl9sb2FkQ2h1bmsoKXtjb25zdCBjaHVua1N0YXJ0PXRoaXMuX2xvYWRlZFNpemU7Y29uc3QgY2h1bmtFbmQ9TWF0aC5taW4odGhpcy5fZmlsZVNpemUsY2h1bmtTdGFydCt0aGlzLl9jaHVua1NpemUpO2NvbnN0IG5leHRQYXJ0PXRoaXMuX2ZpbGUuc2xpY2UoY2h1bmtTdGFydCxjaHVua0VuZCk7dGhpcy5fcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKG5leHRQYXJ0KTt9Cl9vbkVycm9yKGV2ZW50KXt0aGlzLl9lcnJvcj1ldmVudC50YXJnZXQuZXJyb3I7dGhpcy5fdHJhbnNmZXJGaW5pc2hlZChmYWxzZSk7fX07QmluZGluZ3MuRmlsZU91dHB1dFN0cmVhbT1jbGFzc3thc3luYyBvcGVuKGZpbGVOYW1lKXt0aGlzLl9jbG9zZWQ9ZmFsc2U7dGhpcy5fd3JpdGVDYWxsYmFja3M9W107dGhpcy5fZmlsZU5hbWU9ZmlsZU5hbWU7Y29uc3Qgc2F2ZVJlc3BvbnNlPWF3YWl0IFdvcmtzcGFjZS5maWxlTWFuYWdlci5zYXZlKHRoaXMuX2ZpbGVOYW1lLCcnLHRydWUpO2lmKHNhdmVSZXNwb25zZSkKV29ya3NwYWNlLmZpbGVNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLkZpbGVNYW5hZ2VyLkV2ZW50cy5BcHBlbmRlZFRvVVJMLHRoaXMuX29uQXBwZW5kRG9uZSx0aGlzKTtyZXR1cm4hIXNhdmVSZXNwb25zZTt9CndyaXRlKGRhdGEpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57dGhpcy5fd3JpdGVDYWxsYmFja3MucHVzaChyZXNvbHZlKTtXb3Jrc3BhY2UuZmlsZU1hbmFnZXIuYXBwZW5kKHRoaXMuX2ZpbGVOYW1lLGRhdGEpO30pO30KY2xvc2UoKXt0aGlzLl9jbG9zZWQ9dHJ1ZTtpZih0aGlzLl93cml0ZUNhbGxiYWNrcy5sZW5ndGgpCnJldHVybjtXb3Jrc3BhY2UuZmlsZU1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuRmlsZU1hbmFnZXIuRXZlbnRzLkFwcGVuZGVkVG9VUkwsdGhpcy5fb25BcHBlbmREb25lLHRoaXMpO1dvcmtzcGFjZS5maWxlTWFuYWdlci5jbG9zZSh0aGlzLl9maWxlTmFtZSk7fQpfb25BcHBlbmREb25lKGV2ZW50KXtpZihldmVudC5kYXRhIT09dGhpcy5fZmlsZU5hbWUpCnJldHVybjt0aGlzLl93cml0ZUNhbGxiYWNrcy5zaGlmdCgpKCk7aWYodGhpcy5fd3JpdGVDYWxsYmFja3MubGVuZ3RoKQpyZXR1cm47aWYoIXRoaXMuX2Nsb3NlZCkKcmV0dXJuO1dvcmtzcGFjZS5maWxlTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5GaWxlTWFuYWdlci5FdmVudHMuQXBwZW5kZWRUb1VSTCx0aGlzLl9vbkFwcGVuZERvbmUsdGhpcyk7V29ya3NwYWNlLmZpbGVNYW5hZ2VyLmNsb3NlKHRoaXMuX2ZpbGVOYW1lKTt9fTs7QmluZGluZ3MuQmxhY2tib3hNYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKGRlYnVnZ2VyV29ya3NwYWNlQmluZGluZyl7dGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nPWRlYnVnZ2VyV29ya3NwYWNlQmluZGluZztTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5QYXJzZWRTY3JpcHRTb3VyY2UsdGhpcy5fcGFyc2VkU2NyaXB0U291cmNlLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkdsb2JhbE9iamVjdENsZWFyZWQsdGhpcy5fZ2xvYmFsT2JqZWN0Q2xlYXJlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3BhdHRlcm5DaGFuZ2VkLmJpbmQodGhpcykpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdza2lwQ29udGVudFNjcmlwdHMnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9wYXR0ZXJuQ2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCgpO3RoaXMuX2RlYnVnZ2VyTW9kZWxEYXRhPW5ldyBNYXAoKTt0aGlzLl9pc0JsYWNrYm94ZWRVUkxDYWNoZT1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuRGVidWdnZXJNb2RlbCx0aGlzKTt9CmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKXt0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTt9CnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKXt0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTt9Cm1vZGVsQWRkZWQoZGVidWdnZXJNb2RlbCl7dGhpcy5fc2V0QmxhY2tib3hQYXR0ZXJucyhkZWJ1Z2dlck1vZGVsKTt9Cm1vZGVsUmVtb3ZlZChkZWJ1Z2dlck1vZGVsKXt0aGlzLl9kZWJ1Z2dlck1vZGVsRGF0YS5kZWxldGUoZGVidWdnZXJNb2RlbCk7dGhpcy5faXNCbGFja2JveGVkVVJMQ2FjaGUuY2xlYXIoKTt9Cl9zZXRCbGFja2JveFBhdHRlcm5zKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IHJlZ2V4UGF0dGVybnM9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3NraXBTdGFja0ZyYW1lc1BhdHRlcm4nKS5nZXRBc0FycmF5KCk7Y29uc3QgcGF0dGVybnM9KFtdKTtmb3IoY29uc3QgaXRlbSBvZiByZWdleFBhdHRlcm5zKXtpZighaXRlbS5kaXNhYmxlZCYmaXRlbS5wYXR0ZXJuKQpwYXR0ZXJucy5wdXNoKGl0ZW0ucGF0dGVybik7fQpyZXR1cm4gZGVidWdnZXJNb2RlbC5zZXRCbGFja2JveFBhdHRlcm5zKHBhdHRlcm5zKTt9CmlzQmxhY2tib3hlZFJhd0xvY2F0aW9uKGxvY2F0aW9uKXtjb25zdCBzY3JpcHQ9bG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIGZhbHNlO2NvbnN0IHBvc2l0aW9ucz10aGlzLl9zY3JpcHRQb3NpdGlvbnMoc2NyaXB0KTtpZighcG9zaXRpb25zKQpyZXR1cm4gdGhpcy5faXNCbGFja2JveGVkU2NyaXB0KHNjcmlwdCk7Y29uc3QgaW5kZXg9cG9zaXRpb25zLmxvd2VyQm91bmQobG9jYXRpb24sY29tcGFyYXRvcik7cmV0dXJuISEoaW5kZXglMik7ZnVuY3Rpb24gY29tcGFyYXRvcihhLGIpe2lmKGEubGluZU51bWJlciE9PWIubGluZU51bWJlcikKcmV0dXJuIGEubGluZU51bWJlci1iLmxpbmVOdW1iZXI7cmV0dXJuIGEuY29sdW1uTnVtYmVyLWIuY29sdW1uTnVtYmVyO319CmlzQmxhY2tib3hlZFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2NvbnN0IHByb2plY3RUeXBlPXVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpO2NvbnN0IGlzQ29udGVudFNjcmlwdD1wcm9qZWN0VHlwZT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuQ29udGVudFNjcmlwdHM7aWYoaXNDb250ZW50U2NyaXB0JiZDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcENvbnRlbnRTY3JpcHRzJykuZ2V0KCkpCnJldHVybiB0cnVlO2NvbnN0IHVybD10aGlzLl91aVNvdXJjZUNvZGVVUkwodWlTb3VyY2VDb2RlKTtyZXR1cm4gdXJsP3RoaXMuaXNCbGFja2JveGVkVVJMKHVybCk6ZmFsc2U7fQppc0JsYWNrYm94ZWRVUkwodXJsLGlzQ29udGVudFNjcmlwdCl7aWYodGhpcy5faXNCbGFja2JveGVkVVJMQ2FjaGUuaGFzKHVybCkpCnJldHVybiEhdGhpcy5faXNCbGFja2JveGVkVVJMQ2FjaGUuZ2V0KHVybCk7aWYoaXNDb250ZW50U2NyaXB0JiZDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcENvbnRlbnRTY3JpcHRzJykuZ2V0KCkpCnJldHVybiB0cnVlO2NvbnN0IHJlZ2V4PUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdza2lwU3RhY2tGcmFtZXNQYXR0ZXJuJykuYXNSZWdFeHAoKTtjb25zdCBpc0JsYWNrYm94ZWQ9cmVnZXgmJnJlZ2V4LnRlc3QodXJsKTt0aGlzLl9pc0JsYWNrYm94ZWRVUkxDYWNoZS5zZXQodXJsLGlzQmxhY2tib3hlZCk7cmV0dXJuIGlzQmxhY2tib3hlZDt9CnNvdXJjZU1hcExvYWRlZChzY3JpcHQsc291cmNlTWFwKXtpZighc291cmNlTWFwKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgcHJldmlvdXNTY3JpcHRTdGF0ZT10aGlzLl9zY3JpcHRQb3NpdGlvbnMoc2NyaXB0KTtpZighcHJldmlvdXNTY3JpcHRTdGF0ZSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IGhhc0JsYWNrYm94ZWRNYXBwaW5ncz1zb3VyY2VNYXAuc291cmNlVVJMcygpLnNvbWUodXJsPT50aGlzLmlzQmxhY2tib3hlZFVSTCh1cmwpKTtjb25zdCBtYXBwaW5ncz1oYXNCbGFja2JveGVkTWFwcGluZ3M/c291cmNlTWFwLm1hcHBpbmdzKCkuc2xpY2UoKTpbXTtpZighbWFwcGluZ3MubGVuZ3RoKXtpZihwcmV2aW91c1NjcmlwdFN0YXRlLmxlbmd0aD4wKQpyZXR1cm4gdGhpcy5fc2V0U2NyaXB0U3RhdGUoc2NyaXB0LFtdKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQptYXBwaW5ncy5zb3J0KG1hcHBpbmdDb21wYXJhdG9yKTtsZXQgY3VycmVudEJsYWNrYm94ZWQ9ZmFsc2U7bGV0IGlzQmxhY2tib3hlZD1mYWxzZTtjb25zdCBwb3NpdGlvbnM9W107aWYobWFwcGluZ3NbMF0ubGluZU51bWJlciE9PTB8fG1hcHBpbmdzWzBdLmNvbHVtbk51bWJlciE9PTApe3Bvc2l0aW9ucy5wdXNoKHtsaW5lTnVtYmVyOjAsY29sdW1uTnVtYmVyOjB9KTtjdXJyZW50QmxhY2tib3hlZD10cnVlO30KZm9yKGNvbnN0IG1hcHBpbmcgb2YgbWFwcGluZ3Mpe2lmKG1hcHBpbmcuc291cmNlVVJMJiZjdXJyZW50QmxhY2tib3hlZCE9PXRoaXMuaXNCbGFja2JveGVkVVJMKG1hcHBpbmcuc291cmNlVVJMKSl7cG9zaXRpb25zLnB1c2goe2xpbmVOdW1iZXI6bWFwcGluZy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjptYXBwaW5nLmNvbHVtbk51bWJlcn0pO2N1cnJlbnRCbGFja2JveGVkPSFjdXJyZW50QmxhY2tib3hlZDt9CmlzQmxhY2tib3hlZD1jdXJyZW50QmxhY2tib3hlZHx8aXNCbGFja2JveGVkO30KcmV0dXJuIHRoaXMuX3NldFNjcmlwdFN0YXRlKHNjcmlwdCwhaXNCbGFja2JveGVkP1tdOnBvc2l0aW9ucyk7ZnVuY3Rpb24gbWFwcGluZ0NvbXBhcmF0b3IoYSxiKXtpZihhLmxpbmVOdW1iZXIhPT1iLmxpbmVOdW1iZXIpCnJldHVybiBhLmxpbmVOdW1iZXItYi5saW5lTnVtYmVyO3JldHVybiBhLmNvbHVtbk51bWJlci1iLmNvbHVtbk51bWJlcjt9fQpfdWlTb3VyY2VDb2RlVVJMKHVpU291cmNlQ29kZSl7cmV0dXJuIHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5EZWJ1Z2dlcj9udWxsOnVpU291cmNlQ29kZS51cmwoKTt9CmNhbkJsYWNrYm94VUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgdXJsPXRoaXMuX3VpU291cmNlQ29kZVVSTCh1aVNvdXJjZUNvZGUpO3JldHVybiB1cmw/ISF0aGlzLl91cmxUb1JlZ0V4cFN0cmluZyh1cmwpOmZhbHNlO30KYmxhY2tib3hVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtjb25zdCB1cmw9dGhpcy5fdWlTb3VyY2VDb2RlVVJMKHVpU291cmNlQ29kZSk7aWYodXJsKQp0aGlzLl9ibGFja2JveFVSTCh1cmwpO30KdW5ibGFja2JveFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2NvbnN0IHVybD10aGlzLl91aVNvdXJjZUNvZGVVUkwodWlTb3VyY2VDb2RlKTtpZih1cmwpCnRoaXMuX3VuYmxhY2tib3hVUkwodXJsKTt9CmJsYWNrYm94Q29udGVudFNjcmlwdHMoKXtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcENvbnRlbnRTY3JpcHRzJykuc2V0KHRydWUpO30KdW5ibGFja2JveENvbnRlbnRTY3JpcHRzKCl7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3NraXBDb250ZW50U2NyaXB0cycpLnNldChmYWxzZSk7fQpfYmxhY2tib3hVUkwodXJsKXtjb25zdCByZWdleFBhdHRlcm5zPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdza2lwU3RhY2tGcmFtZXNQYXR0ZXJuJykuZ2V0QXNBcnJheSgpO2NvbnN0IHJlZ2V4VmFsdWU9dGhpcy5fdXJsVG9SZWdFeHBTdHJpbmcodXJsKTtpZighcmVnZXhWYWx1ZSkKcmV0dXJuO2xldCBmb3VuZD1mYWxzZTtmb3IobGV0IGk9MDtpPHJlZ2V4UGF0dGVybnMubGVuZ3RoOysraSl7Y29uc3QgaXRlbT1yZWdleFBhdHRlcm5zW2ldO2lmKGl0ZW0ucGF0dGVybj09PXJlZ2V4VmFsdWUpe2l0ZW0uZGlzYWJsZWQ9ZmFsc2U7Zm91bmQ9dHJ1ZTticmVhazt9fQppZighZm91bmQpCnJlZ2V4UGF0dGVybnMucHVzaCh7cGF0dGVybjpyZWdleFZhbHVlfSk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3NraXBTdGFja0ZyYW1lc1BhdHRlcm4nKS5zZXRBc0FycmF5KHJlZ2V4UGF0dGVybnMpO30KX3VuYmxhY2tib3hVUkwodXJsKXtsZXQgcmVnZXhQYXR0ZXJucz1Db21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpLmdldEFzQXJyYXkoKTtjb25zdCByZWdleFZhbHVlPUJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5fdXJsVG9SZWdFeHBTdHJpbmcodXJsKTtpZighcmVnZXhWYWx1ZSkKcmV0dXJuO3JlZ2V4UGF0dGVybnM9cmVnZXhQYXR0ZXJucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGl0ZW0ucGF0dGVybiE9PXJlZ2V4VmFsdWU7fSk7Zm9yKGxldCBpPTA7aTxyZWdleFBhdHRlcm5zLmxlbmd0aDsrK2kpe2NvbnN0IGl0ZW09cmVnZXhQYXR0ZXJuc1tpXTtpZihpdGVtLmRpc2FibGVkKQpjb250aW51ZTt0cnl7Y29uc3QgcmVnZXg9bmV3IFJlZ0V4cChpdGVtLnBhdHRlcm4pO2lmKHJlZ2V4LnRlc3QodXJsKSkKaXRlbS5kaXNhYmxlZD10cnVlO31jYXRjaChlKXt9fQpDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpLnNldEFzQXJyYXkocmVnZXhQYXR0ZXJucyk7fQpfcGF0dGVybkNoYW5nZWQoKXt0aGlzLl9pc0JsYWNrYm94ZWRVUkxDYWNoZS5jbGVhcigpO2NvbnN0IHByb21pc2VzPVtdO2Zvcihjb25zdCBkZWJ1Z2dlck1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRGVidWdnZXJNb2RlbCkpe3Byb21pc2VzLnB1c2godGhpcy5fc2V0QmxhY2tib3hQYXR0ZXJucyhkZWJ1Z2dlck1vZGVsKSk7Zm9yKGNvbnN0IHNjcmlwdCBvZiBkZWJ1Z2dlck1vZGVsLnNjcmlwdHMoKSkKcHJvbWlzZXMucHVzaCh0aGlzLl9hZGRTY3JpcHQoc2NyaXB0KS50aGVuKGxvYWRTb3VyY2VNYXAuYmluZCh0aGlzLHNjcmlwdCkpKTt9ClByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpPT57Y29uc3QgbGlzdGVuZXJzPUFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKTtmb3IoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKQpsaXN0ZW5lcigpO3RoaXMuX3BhdHRlcm5DaGFuZ2VGaW5pc2hlZEZvclRlc3RzKCk7fSk7ZnVuY3Rpb24gbG9hZFNvdXJjZU1hcChzY3JpcHQpe3JldHVybiB0aGlzLnNvdXJjZU1hcExvYWRlZChzY3JpcHQsdGhpcy5fZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnNvdXJjZU1hcEZvclNjcmlwdChzY3JpcHQpKTt9fQpfcGF0dGVybkNoYW5nZUZpbmlzaGVkRm9yVGVzdHMoKXt9Cl9nbG9iYWxPYmplY3RDbGVhcmVkKGV2ZW50KXtjb25zdCBkZWJ1Z2dlck1vZGVsPShldmVudC5kYXRhKTt0aGlzLl9kZWJ1Z2dlck1vZGVsRGF0YS5kZWxldGUoZGVidWdnZXJNb2RlbCk7dGhpcy5faXNCbGFja2JveGVkVVJMQ2FjaGUuY2xlYXIoKTt9Cl9wYXJzZWRTY3JpcHRTb3VyY2UoZXZlbnQpe2NvbnN0IHNjcmlwdD0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkU2NyaXB0KHNjcmlwdCk7fQpfYWRkU2NyaXB0KHNjcmlwdCl7aWYoIXNjcmlwdC5zb3VyY2VVUkwmJiFzY3JpcHQuc291cmNlTWFwVVJMKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgYmxhY2tib3hlZD10aGlzLl9pc0JsYWNrYm94ZWRTY3JpcHQoc2NyaXB0KTtyZXR1cm4gdGhpcy5fc2V0U2NyaXB0U3RhdGUoc2NyaXB0LGJsYWNrYm94ZWQ/W3tsaW5lTnVtYmVyOjAsY29sdW1uTnVtYmVyOjB9XTpbXSk7fQpfaXNCbGFja2JveGVkU2NyaXB0KHNjcmlwdCl7cmV0dXJuIHRoaXMuaXNCbGFja2JveGVkVVJMKHNjcmlwdC5zb3VyY2VVUkwsc2NyaXB0LmlzQ29udGVudFNjcmlwdCgpKTt9Cl9zY3JpcHRQb3NpdGlvbnMoc2NyaXB0KXtpZih0aGlzLl9kZWJ1Z2dlck1vZGVsRGF0YS5oYXMoc2NyaXB0LmRlYnVnZ2VyTW9kZWwpKQpyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbERhdGEuZ2V0KHNjcmlwdC5kZWJ1Z2dlck1vZGVsKS5nZXQoc2NyaXB0LnNjcmlwdElkKXx8bnVsbDtyZXR1cm4gbnVsbDt9Cl9zZXRTY3JpcHRQb3NpdGlvbnMoc2NyaXB0LHBvc2l0aW9ucyl7Y29uc3QgZGVidWdnZXJNb2RlbD1zY3JpcHQuZGVidWdnZXJNb2RlbDtpZighdGhpcy5fZGVidWdnZXJNb2RlbERhdGEuaGFzKGRlYnVnZ2VyTW9kZWwpKQp0aGlzLl9kZWJ1Z2dlck1vZGVsRGF0YS5zZXQoZGVidWdnZXJNb2RlbCxuZXcgTWFwKCkpO3RoaXMuX2RlYnVnZ2VyTW9kZWxEYXRhLmdldChkZWJ1Z2dlck1vZGVsKS5zZXQoc2NyaXB0LnNjcmlwdElkLHBvc2l0aW9ucyk7fQpfc2V0U2NyaXB0U3RhdGUoc2NyaXB0LHBvc2l0aW9ucyl7Y29uc3QgcHJldmlvdXNTY3JpcHRTdGF0ZT10aGlzLl9zY3JpcHRQb3NpdGlvbnMoc2NyaXB0KTtpZihwcmV2aW91c1NjcmlwdFN0YXRlKXtsZXQgaGFzQ2hhbmdlZD1mYWxzZTtoYXNDaGFuZ2VkPXByZXZpb3VzU2NyaXB0U3RhdGUubGVuZ3RoIT09cG9zaXRpb25zLmxlbmd0aDtmb3IobGV0IGk9MDshaGFzQ2hhbmdlZCYmaTxwb3NpdGlvbnMubGVuZ3RoOysraSl7aGFzQ2hhbmdlZD1wb3NpdGlvbnNbaV0ubGluZU51bWJlciE9PXByZXZpb3VzU2NyaXB0U3RhdGVbaV0ubGluZU51bWJlcnx8cG9zaXRpb25zW2ldLmNvbHVtbk51bWJlciE9PXByZXZpb3VzU2NyaXB0U3RhdGVbaV0uY29sdW1uTnVtYmVyO30KaWYoIWhhc0NoYW5nZWQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt9ZWxzZXtpZihwb3NpdGlvbnMubGVuZ3RoPT09MCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odXBkYXRlU3RhdGUuYmluZCh0aGlzLGZhbHNlKSk7fQpyZXR1cm4gc2NyaXB0LnNldEJsYWNrYm94ZWRSYW5nZXMocG9zaXRpb25zKS50aGVuKHVwZGF0ZVN0YXRlLmJpbmQodGhpcykpO2Z1bmN0aW9uIHVwZGF0ZVN0YXRlKHN1Y2Nlc3Mpe2lmKHN1Y2Nlc3Mpe3RoaXMuX3NldFNjcmlwdFBvc2l0aW9ucyhzY3JpcHQscG9zaXRpb25zKTt0aGlzLl9kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcudXBkYXRlTG9jYXRpb25zKHNjcmlwdCk7Y29uc3QgaXNCbGFja2JveGVkPXBvc2l0aW9ucy5sZW5ndGghPT0wO2lmKCFpc0JsYWNrYm94ZWQmJnNjcmlwdC5zb3VyY2VNYXBVUkwpCnRoaXMuX2RlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5tYXliZUxvYWRTb3VyY2VNYXAoc2NyaXB0KTt9ZWxzZXtjb25zdCBoYXNQb3NpdGlvbnM9ISF0aGlzLl9zY3JpcHRQb3NpdGlvbnMoc2NyaXB0KTtpZighaGFzUG9zaXRpb25zKQp0aGlzLl9zZXRTY3JpcHRQb3NpdGlvbnMoc2NyaXB0LFtdKTt9fX0KX3VybFRvUmVnRXhwU3RyaW5nKHVybCl7Y29uc3QgcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKHVybCk7aWYocGFyc2VkVVJMLmlzQWJvdXRCbGFuaygpfHxwYXJzZWRVUkwuaXNEYXRhVVJMKCkpCnJldHVybicnO2lmKCFwYXJzZWRVUkwuaXNWYWxpZCkKcmV0dXJuJ14nK3VybC5lc2NhcGVGb3JSZWdFeHAoKSsnJCc7bGV0IG5hbWU9cGFyc2VkVVJMLmxhc3RQYXRoQ29tcG9uZW50O2lmKG5hbWUpCm5hbWU9Jy8nK25hbWU7ZWxzZSBpZihwYXJzZWRVUkwuZm9sZGVyUGF0aENvbXBvbmVudHMpCm5hbWU9cGFyc2VkVVJMLmZvbGRlclBhdGhDb21wb25lbnRzKycvJztpZighbmFtZSkKbmFtZT1wYXJzZWRVUkwuaG9zdDtpZighbmFtZSkKcmV0dXJuJyc7Y29uc3Qgc2NoZW1lPXBhcnNlZFVSTC5zY2hlbWU7bGV0IHByZWZpeD0nJztpZihzY2hlbWUmJnNjaGVtZSE9PSdodHRwJyYmc2NoZW1lIT09J2h0dHBzJyl7cHJlZml4PSdeJytzY2hlbWUrJzovLyc7aWYoc2NoZW1lPT09J2Nocm9tZS1leHRlbnNpb24nKQpwcmVmaXgrPXBhcnNlZFVSTC5ob3N0KydcXGInO3ByZWZpeCs9Jy4qJzt9CnJldHVybiBwcmVmaXgrbmFtZS5lc2NhcGVGb3JSZWdFeHAoKSsodXJsLmVuZHNXaXRoKG5hbWUpPyckJzonXFxiJyk7fX07QmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyOztCaW5kaW5ncy5OZXR3b3JrUHJvamVjdE1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e307QmluZGluZ3MuTmV0d29ya1Byb2plY3RNYW5hZ2VyLkV2ZW50cz17RnJhbWVBdHRyaWJ1dGlvbkFkZGVkOlN5bWJvbCgnRnJhbWVBdHRyaWJ1dGlvbkFkZGVkJyksRnJhbWVBdHRyaWJ1dGlvblJlbW92ZWQ6U3ltYm9sKCdGcmFtZUF0dHJpYnV0aW9uUmVtb3ZlZCcpfTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdD1jbGFzc3tzdGF0aWMgX3Jlc29sdmVGcmFtZSh1aVNvdXJjZUNvZGUsZnJhbWVJZCl7Y29uc3QgdGFyZ2V0PUJpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnRhcmdldEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldCYmdGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7cmV0dXJuIHJlc291cmNlVHJlZU1vZGVsP3Jlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQoZnJhbWVJZCk6bnVsbDt9CnN0YXRpYyBzZXRJbml0aWFsRnJhbWVBdHRyaWJ1dGlvbih1aVNvdXJjZUNvZGUsZnJhbWVJZCl7Y29uc3QgZnJhbWU9QmluZGluZ3MuTmV0d29ya1Byb2plY3QuX3Jlc29sdmVGcmFtZSh1aVNvdXJjZUNvZGUsZnJhbWVJZCk7aWYoIWZyYW1lKQpyZXR1cm47Y29uc3QgYXR0cmlidXRpb249bmV3IE1hcCgpO2F0dHJpYnV0aW9uLnNldChmcmFtZUlkLHtmcmFtZTpmcmFtZSxjb3VudDoxfSk7dWlTb3VyY2VDb2RlW0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0Ll9mcmFtZUF0dHJpYnV0aW9uU3ltYm9sXT1hdHRyaWJ1dGlvbjt9CnN0YXRpYyBjbG9uZUluaXRpYWxGcmFtZUF0dHJpYnV0aW9uKGZyb21VSVNvdXJjZUNvZGUsdG9VSVNvdXJjZUNvZGUpe2NvbnN0IGZyb21BdHRyaWJ1dGlvbj1mcm9tVUlTb3VyY2VDb2RlW0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0Ll9mcmFtZUF0dHJpYnV0aW9uU3ltYm9sXTtpZighZnJvbUF0dHJpYnV0aW9uKQpyZXR1cm47Y29uc3QgdG9BdHRyaWJ1dGlvbj1uZXcgTWFwKCk7dG9VSVNvdXJjZUNvZGVbQmluZGluZ3MuTmV0d29ya1Byb2plY3QuX2ZyYW1lQXR0cmlidXRpb25TeW1ib2xdPXRvQXR0cmlidXRpb247Zm9yKGNvbnN0IGZyYW1lSWQgb2YgZnJvbUF0dHJpYnV0aW9uLmtleXMoKSl7Y29uc3QgdmFsdWU9ZnJvbUF0dHJpYnV0aW9uLmdldChmcmFtZUlkKTt0b0F0dHJpYnV0aW9uLnNldChmcmFtZUlkLHtmcmFtZTp2YWx1ZS5mcmFtZSxjb3VudDp2YWx1ZS5jb3VudH0pO319CnN0YXRpYyBhZGRGcmFtZUF0dHJpYnV0aW9uKHVpU291cmNlQ29kZSxmcmFtZUlkKXtjb25zdCBmcmFtZT1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fcmVzb2x2ZUZyYW1lKHVpU291cmNlQ29kZSxmcmFtZUlkKTtpZighZnJhbWUpCnJldHVybjtjb25zdCBmcmFtZUF0dHJpYnV0aW9uPXVpU291cmNlQ29kZVtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fZnJhbWVBdHRyaWJ1dGlvblN5bWJvbF07Y29uc3QgYXR0cmlidXRpb25JbmZvPWZyYW1lQXR0cmlidXRpb24uZ2V0KGZyYW1lSWQpfHx7ZnJhbWU6ZnJhbWUsY291bnQ6MH07YXR0cmlidXRpb25JbmZvLmNvdW50Kz0xO2ZyYW1lQXR0cmlidXRpb24uc2V0KGZyYW1lSWQsYXR0cmlidXRpb25JbmZvKTtpZihhdHRyaWJ1dGlvbkluZm8uY291bnQhPT0xKQpyZXR1cm47Y29uc3QgZGF0YT17dWlTb3VyY2VDb2RlOnVpU291cmNlQ29kZSxmcmFtZTpmcmFtZX07QmluZGluZ3MubmV0d29ya1Byb2plY3RNYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCaW5kaW5ncy5OZXR3b3JrUHJvamVjdE1hbmFnZXIuRXZlbnRzLkZyYW1lQXR0cmlidXRpb25BZGRlZCxkYXRhKTt9CnN0YXRpYyByZW1vdmVGcmFtZUF0dHJpYnV0aW9uKHVpU291cmNlQ29kZSxmcmFtZUlkKXtjb25zdCBmcmFtZUF0dHJpYnV0aW9uPXVpU291cmNlQ29kZVtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fZnJhbWVBdHRyaWJ1dGlvblN5bWJvbF07aWYoIWZyYW1lQXR0cmlidXRpb24pCnJldHVybjtjb25zdCBhdHRyaWJ1dGlvbkluZm89ZnJhbWVBdHRyaWJ1dGlvbi5nZXQoZnJhbWVJZCk7Y29uc29sZS5hc3NlcnQoYXR0cmlidXRpb25JbmZvLCdGYWlsZWQgdG8gcmVtb3ZlIGZyYW1lIGF0dHJpYnV0aW9uIGZvciB1cmw6ICcrdWlTb3VyY2VDb2RlLnVybCgpKTthdHRyaWJ1dGlvbkluZm8uY291bnQtPTE7aWYoYXR0cmlidXRpb25JbmZvLmNvdW50PjApCnJldHVybjtmcmFtZUF0dHJpYnV0aW9uLmRlbGV0ZShmcmFtZUlkKTtjb25zdCBkYXRhPXt1aVNvdXJjZUNvZGU6dWlTb3VyY2VDb2RlLGZyYW1lOmF0dHJpYnV0aW9uSW5mby5mcmFtZX07QmluZGluZ3MubmV0d29ya1Byb2plY3RNYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCaW5kaW5ncy5OZXR3b3JrUHJvamVjdE1hbmFnZXIuRXZlbnRzLkZyYW1lQXR0cmlidXRpb25SZW1vdmVkLGRhdGEpO30Kc3RhdGljIHRhcmdldEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe3JldHVybiB1aVNvdXJjZUNvZGUucHJvamVjdCgpW0JpbmRpbmdzLk5ldHdvcmtQcm9qZWN0Ll90YXJnZXRTeW1ib2xdfHxudWxsO30Kc3RhdGljIHNldFRhcmdldEZvclByb2plY3QocHJvamVjdCx0YXJnZXQpe3Byb2plY3RbQmluZGluZ3MuTmV0d29ya1Byb2plY3QuX3RhcmdldFN5bWJvbF09dGFyZ2V0O30Kc3RhdGljIGZyYW1lc0ZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQmJnRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2NvbnN0IGF0dHJpYnV0aW9uPXVpU291cmNlQ29kZVtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fZnJhbWVBdHRyaWJ1dGlvblN5bWJvbF07aWYoIXJlc291cmNlVHJlZU1vZGVsfHwhYXR0cmlidXRpb24pCnJldHVybltdO2NvbnN0IGZyYW1lcz1BcnJheS5mcm9tKGF0dHJpYnV0aW9uLmtleXMoKSkubWFwKGZyYW1lSWQ9PnJlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQoZnJhbWVJZCkpO3JldHVybiBmcmFtZXMuZmlsdGVyKGZyYW1lPT4hIWZyYW1lKTt9fTtCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fdGFyZ2V0U3ltYm9sPVN5bWJvbCgndGFyZ2V0Jyk7QmluZGluZ3MuTmV0d29ya1Byb2plY3QuX2ZyYW1lQXR0cmlidXRpb25TeW1ib2w9U3ltYm9sKCdCaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5fZnJhbWVBdHRyaWJ1dGlvblN5bWJvbCcpOztCaW5kaW5ncy5QcmVzZW50YXRpb25Db25zb2xlTWVzc2FnZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5EZWJ1Z2dlck1vZGVsLHRoaXMpO1NESy5jb25zb2xlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5Db25zb2xlQ2xlYXJlZCx0aGlzLl9jb25zb2xlQ2xlYXJlZCx0aGlzKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLGV2ZW50PT50aGlzLl9jb25zb2xlTWVzc2FnZUFkZGVkKChldmVudC5kYXRhKSkpO1NESy5jb25zb2xlTW9kZWwubWVzc2FnZXMoKS5mb3JFYWNoKHRoaXMuX2NvbnNvbGVNZXNzYWdlQWRkZWQsdGhpcyk7fQptb2RlbEFkZGVkKGRlYnVnZ2VyTW9kZWwpe2RlYnVnZ2VyTW9kZWxbQmluZGluZ3MuUHJlc2VudGF0aW9uQ29uc29sZU1lc3NhZ2VNYW5hZ2VyLl9zeW1ib2xdPW5ldyBCaW5kaW5ncy5QcmVzZW50YXRpb25Db25zb2xlTWVzc2FnZUhlbHBlcihkZWJ1Z2dlck1vZGVsKTt9Cm1vZGVsUmVtb3ZlZChkZWJ1Z2dlck1vZGVsKXtkZWJ1Z2dlck1vZGVsW0JpbmRpbmdzLlByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlTWFuYWdlci5fc3ltYm9sXS5fY29uc29sZUNsZWFyZWQoKTt9Cl9jb25zb2xlTWVzc2FnZUFkZGVkKG1lc3NhZ2Upe2lmKCFtZXNzYWdlLmlzRXJyb3JPcldhcm5pbmcoKXx8IW1lc3NhZ2UucnVudGltZU1vZGVsKCl8fG1lc3NhZ2Uuc291cmNlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuVmlvbGF0aW9uKQpyZXR1cm47Y29uc3QgZGVidWdnZXJNb2RlbD1tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpLmRlYnVnZ2VyTW9kZWwoKTtkZWJ1Z2dlck1vZGVsW0JpbmRpbmdzLlByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlTWFuYWdlci5fc3ltYm9sXS5fY29uc29sZU1lc3NhZ2VBZGRlZChtZXNzYWdlKTt9Cl9jb25zb2xlQ2xlYXJlZCgpe2Zvcihjb25zdCBkZWJ1Z2dlck1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRGVidWdnZXJNb2RlbCkpCmRlYnVnZ2VyTW9kZWxbQmluZGluZ3MuUHJlc2VudGF0aW9uQ29uc29sZU1lc3NhZ2VNYW5hZ2VyLl9zeW1ib2xdLl9jb25zb2xlQ2xlYXJlZCgpO319O0JpbmRpbmdzLlByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlTWFuYWdlci5fc3ltYm9sPVN5bWJvbCgnUHJlc2VudGF0aW9uQ29uc29sZU1lc3NhZ2VIZWxwZXInKTtCaW5kaW5ncy5QcmVzZW50YXRpb25Db25zb2xlTWVzc2FnZUhlbHBlcj1jbGFzc3tjb25zdHJ1Y3RvcihkZWJ1Z2dlck1vZGVsKXt0aGlzLl9kZWJ1Z2dlck1vZGVsPWRlYnVnZ2VyTW9kZWw7dGhpcy5fcGVuZGluZ0NvbnNvbGVNZXNzYWdlcz17fTt0aGlzLl9wcmVzZW50YXRpb25Db25zb2xlTWVzc2FnZXM9W107ZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5QYXJzZWRTY3JpcHRTb3VyY2UsZXZlbnQ9PnNldEltbWVkaWF0ZSh0aGlzLl9wYXJzZWRTY3JpcHRTb3VyY2UuYmluZCh0aGlzLGV2ZW50KSkpO2RlYnVnZ2VyTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRmFpbGVkVG9QYXJzZVNjcmlwdFNvdXJjZSxldmVudD0+c2V0SW1tZWRpYXRlKHRoaXMuX3BhcnNlZFNjcmlwdFNvdXJjZS5iaW5kKHRoaXMsZXZlbnQpKSk7ZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMuX2RlYnVnZ2VyUmVzZXQsdGhpcyk7dGhpcy5fbG9jYXRpb25Qb29sPW5ldyBCaW5kaW5ncy5MaXZlTG9jYXRpb25Qb29sKCk7fQpfY29uc29sZU1lc3NhZ2VBZGRlZChtZXNzYWdlKXtjb25zdCByYXdMb2NhdGlvbj10aGlzLl9yYXdMb2NhdGlvbihtZXNzYWdlKTtpZihyYXdMb2NhdGlvbikKdGhpcy5fYWRkQ29uc29sZU1lc3NhZ2VUb1NjcmlwdChtZXNzYWdlLHJhd0xvY2F0aW9uKTtlbHNlCnRoaXMuX2FkZFBlbmRpbmdDb25zb2xlTWVzc2FnZShtZXNzYWdlKTt9Cl9yYXdMb2NhdGlvbihtZXNzYWdlKXtpZihtZXNzYWdlLnNjcmlwdElkKQpyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbkJ5U2NyaXB0SWQobWVzc2FnZS5zY3JpcHRJZCxtZXNzYWdlLmxpbmUsbWVzc2FnZS5jb2x1bW4pO2NvbnN0IGNhbGxGcmFtZT1tZXNzYWdlLnN0YWNrVHJhY2UmJm1lc3NhZ2Uuc3RhY2tUcmFjZS5jYWxsRnJhbWVzP21lc3NhZ2Uuc3RhY2tUcmFjZS5jYWxsRnJhbWVzWzBdOm51bGw7aWYoY2FsbEZyYW1lKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbkJ5U2NyaXB0SWQoY2FsbEZyYW1lLnNjcmlwdElkLGNhbGxGcmFtZS5saW5lTnVtYmVyLGNhbGxGcmFtZS5jb2x1bW5OdW1iZXIpO30KaWYobWVzc2FnZS51cmwpCnJldHVybiB0aGlzLl9kZWJ1Z2dlck1vZGVsLmNyZWF0ZVJhd0xvY2F0aW9uQnlVUkwobWVzc2FnZS51cmwsbWVzc2FnZS5saW5lLG1lc3NhZ2UuY29sdW1uKTtyZXR1cm4gbnVsbDt9Cl9hZGRDb25zb2xlTWVzc2FnZVRvU2NyaXB0KG1lc3NhZ2UscmF3TG9jYXRpb24pe3RoaXMuX3ByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlcy5wdXNoKG5ldyBCaW5kaW5ncy5QcmVzZW50YXRpb25Db25zb2xlTWVzc2FnZShtZXNzYWdlLHJhd0xvY2F0aW9uLHRoaXMuX2xvY2F0aW9uUG9vbCkpO30KX2FkZFBlbmRpbmdDb25zb2xlTWVzc2FnZShtZXNzYWdlKXtpZighbWVzc2FnZS51cmwpCnJldHVybjtpZighdGhpcy5fcGVuZGluZ0NvbnNvbGVNZXNzYWdlc1ttZXNzYWdlLnVybF0pCnRoaXMuX3BlbmRpbmdDb25zb2xlTWVzc2FnZXNbbWVzc2FnZS51cmxdPVtdO3RoaXMuX3BlbmRpbmdDb25zb2xlTWVzc2FnZXNbbWVzc2FnZS51cmxdLnB1c2gobWVzc2FnZSk7fQpfcGFyc2VkU2NyaXB0U291cmNlKGV2ZW50KXtjb25zdCBzY3JpcHQ9KGV2ZW50LmRhdGEpO2NvbnN0IG1lc3NhZ2VzPXRoaXMuX3BlbmRpbmdDb25zb2xlTWVzc2FnZXNbc2NyaXB0LnNvdXJjZVVSTF07aWYoIW1lc3NhZ2VzKQpyZXR1cm47Y29uc3QgcGVuZGluZ01lc3NhZ2VzPVtdO2ZvcihsZXQgaT0wO2k8bWVzc2FnZXMubGVuZ3RoO2krKyl7Y29uc3QgbWVzc2FnZT1tZXNzYWdlc1tpXTtjb25zdCByYXdMb2NhdGlvbj10aGlzLl9yYXdMb2NhdGlvbihtZXNzYWdlKTtpZighcmF3TG9jYXRpb24pCmNvbnRpbnVlO2lmKHNjcmlwdC5zY3JpcHRJZD09PXJhd0xvY2F0aW9uLnNjcmlwdElkKQp0aGlzLl9hZGRDb25zb2xlTWVzc2FnZVRvU2NyaXB0KG1lc3NhZ2UscmF3TG9jYXRpb24pO2Vsc2UKcGVuZGluZ01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7fQppZihwZW5kaW5nTWVzc2FnZXMubGVuZ3RoKQp0aGlzLl9wZW5kaW5nQ29uc29sZU1lc3NhZ2VzW3NjcmlwdC5zb3VyY2VVUkxdPXBlbmRpbmdNZXNzYWdlcztlbHNlCmRlbGV0ZSB0aGlzLl9wZW5kaW5nQ29uc29sZU1lc3NhZ2VzW3NjcmlwdC5zb3VyY2VVUkxdO30KX2NvbnNvbGVDbGVhcmVkKCl7dGhpcy5fcGVuZGluZ0NvbnNvbGVNZXNzYWdlcz17fTt0aGlzLl9kZWJ1Z2dlclJlc2V0KCk7fQpfZGVidWdnZXJSZXNldCgpe2Zvcihjb25zdCBtZXNzYWdlIG9mIHRoaXMuX3ByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlcykKbWVzc2FnZS5kaXNwb3NlKCk7dGhpcy5fcHJlc2VudGF0aW9uQ29uc29sZU1lc3NhZ2VzPVtdO3RoaXMuX2xvY2F0aW9uUG9vbC5kaXNwb3NlQWxsKCk7fX07QmluZGluZ3MuUHJlc2VudGF0aW9uQ29uc29sZU1lc3NhZ2U9Y2xhc3N7Y29uc3RydWN0b3IobWVzc2FnZSxyYXdMb2NhdGlvbixsb2NhdGlvblBvb2wpe3RoaXMuX3RleHQ9bWVzc2FnZS5tZXNzYWdlVGV4dDt0aGlzLl9sZXZlbD1tZXNzYWdlLmxldmVsPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5FcnJvcj9Xb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UuTGV2ZWwuRXJyb3I6V29ya3NwYWNlLlVJU291cmNlQ29kZS5NZXNzYWdlLkxldmVsLldhcm5pbmc7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLmNyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix0aGlzLl91cGRhdGVMb2NhdGlvbi5iaW5kKHRoaXMpLGxvY2F0aW9uUG9vbCk7fQpfdXBkYXRlTG9jYXRpb24obGl2ZUxvY2F0aW9uKXtpZih0aGlzLl91aU1lc3NhZ2UpCnRoaXMuX3VpTWVzc2FnZS5yZW1vdmUoKTtjb25zdCB1aUxvY2F0aW9uPWxpdmVMb2NhdGlvbi51aUxvY2F0aW9uKCk7aWYoIXVpTG9jYXRpb24pCnJldHVybjt0aGlzLl91aU1lc3NhZ2U9dWlMb2NhdGlvbi51aVNvdXJjZUNvZGUuYWRkTGluZU1lc3NhZ2UodGhpcy5fbGV2ZWwsdGhpcy5fdGV4dCx1aUxvY2F0aW9uLmxpbmVOdW1iZXIsdWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO30KZGlzcG9zZSgpe2lmKHRoaXMuX3VpTWVzc2FnZSkKdGhpcy5fdWlNZXNzYWdlLnJlbW92ZSgpO319OztCaW5kaW5ncy5yZXNvdXJjZUZvclVSTD1mdW5jdGlvbih1cmwpe2Zvcihjb25zdCByZXNvdXJjZVRyZWVNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLlJlc291cmNlVHJlZU1vZGVsKSl7Y29uc3QgcmVzb3VyY2U9cmVzb3VyY2VUcmVlTW9kZWwucmVzb3VyY2VGb3JVUkwodXJsKTtpZihyZXNvdXJjZSkKcmV0dXJuIHJlc291cmNlO30KcmV0dXJuIG51bGw7fTtCaW5kaW5ncy5mb3JBbGxSZXNvdXJjZXM9ZnVuY3Rpb24oY2FsbGJhY2spe2Zvcihjb25zdCByZXNvdXJjZVRyZWVNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLlJlc291cmNlVHJlZU1vZGVsKSkKcmVzb3VyY2VUcmVlTW9kZWwuZm9yQWxsUmVzb3VyY2VzKGNhbGxiYWNrKTt9O0JpbmRpbmdzLmRpc3BsYXlOYW1lRm9yVVJMPWZ1bmN0aW9uKHVybCl7aWYoIXVybCkKcmV0dXJuJyc7Y29uc3QgcmVzb3VyY2U9QmluZGluZ3MucmVzb3VyY2VGb3JVUkwodXJsKTtpZihyZXNvdXJjZSkKcmV0dXJuIHJlc291cmNlLmRpc3BsYXlOYW1lO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTCh1cmwpO2lmKHVpU291cmNlQ29kZSkKcmV0dXJuIHVpU291cmNlQ29kZS5kaXNwbGF5TmFtZSgpO2NvbnN0IG1haW5UYXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO2NvbnN0IGluc3BlY3RlZFVSTD1tYWluVGFyZ2V0JiZtYWluVGFyZ2V0Lmluc3BlY3RlZFVSTCgpO2lmKCFpbnNwZWN0ZWRVUkwpCnJldHVybiB1cmwudHJpbVVSTCgnJyk7Y29uc3QgcGFyc2VkVVJMPWluc3BlY3RlZFVSTC5hc1BhcnNlZFVSTCgpO2NvbnN0IGxhc3RQYXRoQ29tcG9uZW50PXBhcnNlZFVSTD9wYXJzZWRVUkwubGFzdFBhdGhDb21wb25lbnQ6cGFyc2VkVVJMO2NvbnN0IGluZGV4PWluc3BlY3RlZFVSTC5pbmRleE9mKGxhc3RQYXRoQ29tcG9uZW50KTtpZihpbmRleCE9PS0xJiZpbmRleCtsYXN0UGF0aENvbXBvbmVudC5sZW5ndGg9PT1pbnNwZWN0ZWRVUkwubGVuZ3RoKXtjb25zdCBiYXNlVVJMPWluc3BlY3RlZFVSTC5zdWJzdHJpbmcoMCxpbmRleCk7aWYodXJsLnN0YXJ0c1dpdGgoYmFzZVVSTCkpCnJldHVybiB1cmwuc3Vic3RyaW5nKGluZGV4KTt9CmlmKCFwYXJzZWRVUkwpCnJldHVybiB1cmw7Y29uc3QgZGlzcGxheU5hbWU9dXJsLnRyaW1VUkwocGFyc2VkVVJMLmhvc3QpO3JldHVybiBkaXNwbGF5TmFtZT09PScvJz9wYXJzZWRVUkwuaG9zdCsnLyc6ZGlzcGxheU5hbWU7fTtCaW5kaW5ncy5tZXRhZGF0YUZvclVSTD1mdW5jdGlvbih0YXJnZXQsZnJhbWVJZCx1cmwpe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKCFyZXNvdXJjZVRyZWVNb2RlbCkKcmV0dXJuIG51bGw7Y29uc3QgZnJhbWU9cmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JJZChmcmFtZUlkKTtpZighZnJhbWUpCnJldHVybiBudWxsO3JldHVybiBCaW5kaW5ncy5yZXNvdXJjZU1ldGFkYXRhKGZyYW1lLnJlc291cmNlRm9yVVJMKHVybCkpO307QmluZGluZ3MucmVzb3VyY2VNZXRhZGF0YT1mdW5jdGlvbihyZXNvdXJjZSl7aWYoIXJlc291cmNlfHwodHlwZW9mIHJlc291cmNlLmNvbnRlbnRTaXplKCkhPT0nbnVtYmVyJyYmIXJlc291cmNlLmxhc3RNb2RpZmllZCgpKSkKcmV0dXJuIG51bGw7cmV0dXJuIG5ldyBXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlTWV0YWRhdGEocmVzb3VyY2UubGFzdE1vZGlmaWVkKCkscmVzb3VyY2UuY29udGVudFNpemUoKSk7fTtCaW5kaW5ncy5mcmFtZUlkRm9yU2NyaXB0PWZ1bmN0aW9uKHNjcmlwdCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1zY3JpcHQuZXhlY3V0aW9uQ29udGV4dCgpO2lmKGV4ZWN1dGlvbkNvbnRleHQpCnJldHVybiBleGVjdXRpb25Db250ZXh0LmZyYW1lSWR8fCcnO2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXNjcmlwdC5kZWJ1Z2dlck1vZGVsLnRhcmdldCgpLm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7aWYoIXJlc291cmNlVHJlZU1vZGVsfHwhcmVzb3VyY2VUcmVlTW9kZWwubWFpbkZyYW1lKQpyZXR1cm4nJztyZXR1cm4gcmVzb3VyY2VUcmVlTW9kZWwubWFpbkZyYW1lLmlkO307O0JpbmRpbmdzLlRlbXBGaWxlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fbGFzdEJsb2I9bnVsbDt9CndyaXRlKHBpZWNlcyl7aWYodGhpcy5fbGFzdEJsb2IpCnBpZWNlcy51bnNoaWZ0KHRoaXMuX2xhc3RCbG9iKTt0aGlzLl9sYXN0QmxvYj1uZXcgQmxvYihwaWVjZXMse3R5cGU6J3RleHQvcGxhaW4nfSk7fQpyZWFkKCl7cmV0dXJuIHRoaXMucmVhZFJhbmdlKCk7fQpzaXplKCl7cmV0dXJuIHRoaXMuX2xhc3RCbG9iP3RoaXMuX2xhc3RCbG9iLnNpemU6MDt9CmFzeW5jIHJlYWRSYW5nZShzdGFydE9mZnNldCxlbmRPZmZzZXQpe2lmKCF0aGlzLl9sYXN0QmxvYil7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0F0dGVtcHQgdG8gcmVhZCBhIHRlbXAgZmlsZSB0aGF0IHdhcyBuZXZlciB3cml0dGVuJyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7fQpjb25zdCBibG9iPXR5cGVvZiBzdGFydE9mZnNldD09PSdudW1iZXInfHx0eXBlb2YgZW5kT2Zmc2V0PT09J251bWJlcic/dGhpcy5fbGFzdEJsb2Iuc2xpY2UoKHN0YXJ0T2Zmc2V0KSwoZW5kT2Zmc2V0KSk6dGhpcy5fbGFzdEJsb2I7Y29uc3QgcmVhZGVyPW5ldyBGaWxlUmVhZGVyKCk7dHJ5e2F3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntyZWFkZXIub25sb2FkZW5kPXJlc29sdmU7cmVhZGVyLm9uZXJyb3I9cmVqZWN0O3JlYWRlci5yZWFkQXNUZXh0KGJsb2IpO30pO31jYXRjaChlcnJvcil7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWFkIGZyb20gdGVtcCBmaWxlOiAnK2Vycm9yLm1lc3NhZ2UpO30KcmV0dXJuIHJlYWRlci5yZXN1bHQ7fQpjb3B5VG9PdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtLHByb2dyZXNzKXtpZighdGhpcy5fbGFzdEJsb2Ipe291dHB1dFN0cmVhbS5jbG9zZSgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTt9CmNvbnN0IHJlYWRlcj1uZXcgQmluZGluZ3MuQ2h1bmtlZEZpbGVSZWFkZXIoKHRoaXMuX2xhc3RCbG9iKSwxMCoxMDAwKjEwMDAscHJvZ3Jlc3MpO3JldHVybiByZWFkZXIucmVhZChvdXRwdXRTdHJlYW0pLnRoZW4oc3VjY2Vzcz0+c3VjY2Vzcz9udWxsOnJlYWRlci5lcnJvcigpKTt9CnJlbW92ZSgpe3RoaXMuX2xhc3RCbG9iPW51bGw7fX07QmluZGluZ3MuVGVtcEZpbGVCYWNraW5nU3RvcmFnZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZpbGU9bnVsbDt0aGlzLl9zdHJpbmdzO3RoaXMuX3N0cmluZ3NMZW5ndGg7dGhpcy5yZXNldCgpO30KYXBwZW5kU3RyaW5nKHN0cmluZyl7dGhpcy5fc3RyaW5ncy5wdXNoKHN0cmluZyk7dGhpcy5fc3RyaW5nc0xlbmd0aCs9c3RyaW5nLmxlbmd0aDtjb25zdCBmbHVzaFN0cmluZ0xlbmd0aD0xMCoxMDI0KjEwMjQ7aWYodGhpcy5fc3RyaW5nc0xlbmd0aD5mbHVzaFN0cmluZ0xlbmd0aCkKdGhpcy5fZmx1c2goKTt9CmFwcGVuZEFjY2Vzc2libGVTdHJpbmcoc3RyaW5nKXt0aGlzLl9mbHVzaCgpO2NvbnN0IHN0YXJ0T2Zmc2V0PXRoaXMuX2ZpbGUuc2l6ZSgpO3RoaXMuX3N0cmluZ3MucHVzaChzdHJpbmcpO3RoaXMuX2ZsdXNoKCk7cmV0dXJuIHRoaXMuX2ZpbGUucmVhZFJhbmdlLmJpbmQodGhpcy5fZmlsZSxzdGFydE9mZnNldCx0aGlzLl9maWxlLnNpemUoKSk7fQpfZmx1c2goKXtpZighdGhpcy5fc3RyaW5ncy5sZW5ndGgpCnJldHVybjtpZighdGhpcy5fZmlsZSkKdGhpcy5fZmlsZT1uZXcgQmluZGluZ3MuVGVtcEZpbGUoKTt0aGlzLl9zdHJpbmdzTGVuZ3RoPTA7dGhpcy5fZmlsZS53cml0ZSh0aGlzLl9zdHJpbmdzLnNwbGljZSgwKSk7fQpmaW5pc2hXcml0aW5nKCl7dGhpcy5fZmx1c2goKTt9CnJlc2V0KCl7aWYodGhpcy5fZmlsZSkKdGhpcy5fZmlsZS5yZW1vdmUoKTt0aGlzLl9maWxlPW51bGw7dGhpcy5fc3RyaW5ncz1bXTt0aGlzLl9zdHJpbmdzTGVuZ3RoPTA7fQp3cml0ZVRvU3RyZWFtKG91dHB1dFN0cmVhbSl7cmV0dXJuIHRoaXMuX2ZpbGU/dGhpcy5fZmlsZS5jb3B5VG9PdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKTpQcm9taXNlLnJlc29sdmUobnVsbCk7fX07QmluZGluZ3MuVGVtcEZpbGVCYWNraW5nU3RvcmFnZS5DaHVuazs7c2VsZlsnQ29tcG9uZW50cyddPXNlbGZbJ0NvbXBvbmVudHMnXXx8e307Q29tcG9uZW50cy5KU1ByZXNlbnRhdGlvblV0aWxzPXt9O0NvbXBvbmVudHMuSlNQcmVzZW50YXRpb25VdGlscy5idWlsZFN0YWNrVHJhY2VQcmV2aWV3Q29udGVudHM9ZnVuY3Rpb24odGFyZ2V0LGxpbmtpZmllcixzdGFja1RyYWNlLGNvbnRlbnRVcGRhdGVkKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtlbGVtZW50LnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoZWxlbWVudCwnY29tcG9uZW50cy9qc1V0aWxzLmNzcycpO2NvbnN0IGNvbnRlbnRFbGVtZW50PXNoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ3RhYmxlJywnc3RhY2stcHJldmlldy1jb250YWluZXInKTtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldD90YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOm51bGw7bGV0IHRvdGFsSGlkZGVuQ2FsbEZyYW1lc0NvdW50PTA7ZnVuY3Rpb24gYXBwZW5kU3RhY2tUcmFjZShzdGFja1RyYWNlKXtsZXQgaGlkZGVuQ2FsbEZyYW1lcz0wO2Zvcihjb25zdCBzdGFja0ZyYW1lIG9mIHN0YWNrVHJhY2UuY2FsbEZyYW1lcyl7Y29uc3Qgcm93PWNyZWF0ZUVsZW1lbnQoJ3RyJyk7cm93LmNyZWF0ZUNoaWxkKCd0ZCcpLnRleHRDb250ZW50PSdcbic7cm93LmNyZWF0ZUNoaWxkKCd0ZCcsJ2Z1bmN0aW9uLW5hbWUnKS50ZXh0Q29udGVudD1VSS5iZWF1dGlmeUZ1bmN0aW9uTmFtZShzdGFja0ZyYW1lLmZ1bmN0aW9uTmFtZSk7Y29uc3QgbGluaz1saW5raWZpZXIubWF5YmVMaW5raWZ5Q29uc29sZUNhbGxGcmFtZSh0YXJnZXQsc3RhY2tGcmFtZSk7aWYobGluayl7bGluay5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScscG9wdWxhdGVDb250ZXh0TWVudS5iaW5kKG51bGwsbGluaykpO2lmKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IGxvY2F0aW9uPWRlYnVnZ2VyTW9kZWwuY3JlYXRlUmF3TG9jYXRpb25CeVNjcmlwdElkKHN0YWNrRnJhbWUuc2NyaXB0SWQsc3RhY2tGcmFtZS5saW5lTnVtYmVyLHN0YWNrRnJhbWUuY29sdW1uTnVtYmVyKTtpZihsb2NhdGlvbiYmQmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmlzQmxhY2tib3hlZFJhd0xvY2F0aW9uKGxvY2F0aW9uKSl7cm93LmNsYXNzTGlzdC5hZGQoJ2JsYWNrYm94ZWQnKTsrK2hpZGRlbkNhbGxGcmFtZXM7fX0Kcm93LmNyZWF0ZUNoaWxkKCd0ZCcpLnRleHRDb250ZW50PScgQCAnO3Jvdy5jcmVhdGVDaGlsZCgndGQnKS5hcHBlbmRDaGlsZChsaW5rKTt9CmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHJvdyk7fQp0b3RhbEhpZGRlbkNhbGxGcmFtZXNDb3VudCs9aGlkZGVuQ2FsbEZyYW1lcztyZXR1cm4gc3RhY2tUcmFjZS5jYWxsRnJhbWVzLmxlbmd0aD09PWhpZGRlbkNhbGxGcmFtZXM7fQpmdW5jdGlvbiBwb3B1bGF0ZUNvbnRleHRNZW51KGxpbmssZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7ZXZlbnQuY29uc3VtZSh0cnVlKTtjb25zdCB1aUxvY2F0aW9uPUNvbXBvbmVudHMuTGlua2lmaWVyLnVpTG9jYXRpb24obGluayk7aWYodWlMb2NhdGlvbiYmQmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmNhbkJsYWNrYm94VUlTb3VyY2VDb2RlKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlKSl7aWYoQmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmlzQmxhY2tib3hlZFVJU291cmNlQ29kZSh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSkpe2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgU3RvcCBibGFja2JveGluZ2AsKCk9PkJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci51bmJsYWNrYm94VUlTb3VyY2VDb2RlKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlKSk7fWVsc2V7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BCbGFja2JveCBzY3JpcHRgLCgpPT5CaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuYmxhY2tib3hVSVNvdXJjZUNvZGUodWlMb2NhdGlvbi51aVNvdXJjZUNvZGUpKTt9fQpjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQpO2NvbnRleHRNZW51LnNob3coKTt9CmlmKCFzdGFja1RyYWNlKQpyZXR1cm4gZWxlbWVudDthcHBlbmRTdGFja1RyYWNlKHN0YWNrVHJhY2UpO2xldCBhc3luY1N0YWNrVHJhY2U9c3RhY2tUcmFjZS5wYXJlbnQ7d2hpbGUoYXN5bmNTdGFja1RyYWNlKXtpZighYXN5bmNTdGFja1RyYWNlLmNhbGxGcmFtZXMubGVuZ3RoKXthc3luY1N0YWNrVHJhY2U9YXN5bmNTdGFja1RyYWNlLnBhcmVudDtjb250aW51ZTt9CmNvbnN0IHJvdz1jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgndHInKTtyb3cuY3JlYXRlQ2hpbGQoJ3RkJykudGV4dENvbnRlbnQ9J1xuJztyb3cuY3JlYXRlQ2hpbGQoJ3RkJywnc3RhY2stcHJldmlldy1hc3luYy1kZXNjcmlwdGlvbicpLnRleHRDb250ZW50PVVJLmFzeW5jU3RhY2tUcmFjZUxhYmVsKGFzeW5jU3RhY2tUcmFjZS5kZXNjcmlwdGlvbik7cm93LmNyZWF0ZUNoaWxkKCd0ZCcpO3Jvdy5jcmVhdGVDaGlsZCgndGQnKTtpZihhcHBlbmRTdGFja1RyYWNlKGFzeW5jU3RhY2tUcmFjZSkpCnJvdy5jbGFzc0xpc3QuYWRkKCdibGFja2JveGVkJyk7YXN5bmNTdGFja1RyYWNlPWFzeW5jU3RhY2tUcmFjZS5wYXJlbnQ7fQppZih0b3RhbEhpZGRlbkNhbGxGcmFtZXNDb3VudCl7Y29uc3Qgcm93PWNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCd0cicsJ3Nob3ctYmxhY2tib3hlZC1saW5rJyk7cm93LmNyZWF0ZUNoaWxkKCd0ZCcpLnRleHRDb250ZW50PSdcbic7Y29uc3QgY2VsbD1yb3cuY3JlYXRlQ2hpbGQoJ3RkJyk7Y2VsbC5jb2xTcGFuPTQ7Y29uc3Qgc2hvd0FsbExpbms9Y2VsbC5jcmVhdGVDaGlsZCgnc3BhbicsJ2xpbmsnKTtpZih0b3RhbEhpZGRlbkNhbGxGcmFtZXNDb3VudD09PTEpCnNob3dBbGxMaW5rLnRleHRDb250ZW50PWxzYFNob3cgMSBtb3JlIGJsYWNrYm94ZWQgZnJhbWVgO2Vsc2UKc2hvd0FsbExpbmsudGV4dENvbnRlbnQ9bHNgU2hvdyAke3RvdGFsSGlkZGVuQ2FsbEZyYW1lc0NvdW50fSBtb3JlIGJsYWNrYm94ZWQgZnJhbWVzYDtzaG93QWxsTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9Pntjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaG93LWJsYWNrYm94ZWQnKTtpZihjb250ZW50VXBkYXRlZCkKY29udGVudFVwZGF0ZWQoKTt9LGZhbHNlKTt9CnJldHVybiBlbGVtZW50O307O0NvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGNhbkRvY2spe3N1cGVyKCk7dGhpcy5fY2FuRG9jaz1jYW5Eb2NrO3RoaXMuX2Nsb3NlQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xvc2UnKSwnbGFyZ2VpY29uLWRlbGV0ZScpO3RoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNsb3NlV2luZG93LmJpbmQoSW5zcGVjdG9yRnJvbnRlbmRIb3N0KSk7aWYoIWNhbkRvY2spe3RoaXMuX2RvY2tTaWRlPUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuVW5kb2NrZWQ7dGhpcy5fY2xvc2VCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7cmV0dXJuO30KdGhpcy5fc3RhdGVzPVtDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLkRvY2tlZFRvUmlnaHQsQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb0JvdHRvbSxDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLkRvY2tlZFRvTGVmdCxDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLlVuZG9ja2VkXTt0aGlzLl9jdXJyZW50RG9ja1N0YXRlU2V0dGluZz1Db21tb24uc2V0dGluZ3MubW9kdWxlU2V0dGluZygnY3VycmVudERvY2tTdGF0ZScpO3RoaXMuX2N1cnJlbnREb2NrU3RhdGVTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2RvY2tTaWRlQ2hhbmdlZCx0aGlzKTt0aGlzLl9sYXN0RG9ja1N0YXRlU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbGFzdERvY2tTdGF0ZScsJ2JvdHRvbScpO2lmKHRoaXMuX3N0YXRlcy5pbmRleE9mKHRoaXMuX2N1cnJlbnREb2NrU3RhdGVTZXR0aW5nLmdldCgpKT09PS0xKQp0aGlzLl9jdXJyZW50RG9ja1N0YXRlU2V0dGluZy5zZXQoJ3JpZ2h0Jyk7aWYodGhpcy5fc3RhdGVzLmluZGV4T2YodGhpcy5fbGFzdERvY2tTdGF0ZVNldHRpbmcuZ2V0KCkpPT09LTEpCnRoaXMuX2N1cnJlbnREb2NrU3RhdGVTZXR0aW5nLnNldCgnYm90dG9tJyk7fQppbml0aWFsaXplKCl7aWYoIXRoaXMuX2NhbkRvY2spCnJldHVybjt0aGlzLl90aXRsZXM9W0NvbW1vbi5VSVN0cmluZygnRG9jayB0byByaWdodCcpLENvbW1vbi5VSVN0cmluZygnRG9jayB0byBib3R0b20nKSxDb21tb24uVUlTdHJpbmcoJ0RvY2sgdG8gbGVmdCcpLENvbW1vbi5VSVN0cmluZygnVW5kb2NrIGludG8gc2VwYXJhdGUgd2luZG93JyldO3RoaXMuX2RvY2tTaWRlQ2hhbmdlZCgpO30KX2RvY2tTaWRlQ2hhbmdlZCgpe3RoaXMuc2V0RG9ja1NpZGUodGhpcy5fY3VycmVudERvY2tTdGF0ZVNldHRpbmcuZ2V0KCkpO30KZG9ja1NpZGUoKXtyZXR1cm4gdGhpcy5fZG9ja1NpZGU7fQpjYW5Eb2NrKCl7cmV0dXJuIHRoaXMuX2NhbkRvY2s7fQppc1ZlcnRpY2FsKCl7cmV0dXJuIHRoaXMuX2RvY2tTaWRlPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb1JpZ2h0fHx0aGlzLl9kb2NrU2lkZT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9MZWZ0O30Kc2V0RG9ja1NpZGUoZG9ja1NpZGUpe2lmKHRoaXMuX3N0YXRlcy5pbmRleE9mKGRvY2tTaWRlKT09PS0xKQpkb2NrU2lkZT10aGlzLl9zdGF0ZXNbMF07aWYodGhpcy5fZG9ja1NpZGU9PT1kb2NrU2lkZSkKcmV0dXJuO2lmKHRoaXMuX2RvY2tTaWRlKQp0aGlzLl9sYXN0RG9ja1N0YXRlU2V0dGluZy5zZXQodGhpcy5fZG9ja1NpZGUpO3RoaXMuX3NhdmVkRm9jdXM9ZG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTtjb25zdCBldmVudERhdGE9e2Zyb206dGhpcy5fZG9ja1NpZGUsdG86ZG9ja1NpZGV9O3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKENvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuRXZlbnRzLkJlZm9yZURvY2tTaWRlQ2hhbmdlZCxldmVudERhdGEpO2NvbnNvbGUudGltZVN0YW1wKCdEb2NrQ29udHJvbGxlci5zZXRJc0RvY2tlZCcpO3RoaXMuX2RvY2tTaWRlPWRvY2tTaWRlO3RoaXMuX2N1cnJlbnREb2NrU3RhdGVTZXR0aW5nLnNldChkb2NrU2lkZSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNldElzRG9ja2VkKGRvY2tTaWRlIT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCx0aGlzLl9zZXRJc0RvY2tlZFJlc3BvbnNlLmJpbmQodGhpcyxldmVudERhdGEpKTt0aGlzLl9jbG9zZUJ1dHRvbi5zZXRWaXNpYmxlKHRoaXMuX2RvY2tTaWRlIT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5FdmVudHMuRG9ja1NpZGVDaGFuZ2VkLGV2ZW50RGF0YSk7fQpfc2V0SXNEb2NrZWRSZXNwb25zZShldmVudERhdGEpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKENvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuRXZlbnRzLkFmdGVyRG9ja1NpZGVDaGFuZ2VkLGV2ZW50RGF0YSk7aWYodGhpcy5fc2F2ZWRGb2N1cyl7dGhpcy5fc2F2ZWRGb2N1cy5mb2N1cygpO3RoaXMuX3NhdmVkRm9jdXM9bnVsbDt9fQpfdG9nZ2xlRG9ja1NpZGUoKXtpZih0aGlzLl9sYXN0RG9ja1N0YXRlU2V0dGluZy5nZXQoKT09PXRoaXMuX2N1cnJlbnREb2NrU3RhdGVTZXR0aW5nLmdldCgpKXtjb25zdCBpbmRleD10aGlzLl9zdGF0ZXMuaW5kZXhPZih0aGlzLl9jdXJyZW50RG9ja1N0YXRlU2V0dGluZy5nZXQoKSl8fDA7dGhpcy5fbGFzdERvY2tTdGF0ZVNldHRpbmcuc2V0KHRoaXMuX3N0YXRlc1soaW5kZXgrMSkldGhpcy5fc3RhdGVzLmxlbmd0aF0pO30KdGhpcy5zZXREb2NrU2lkZSh0aGlzLl9sYXN0RG9ja1N0YXRlU2V0dGluZy5nZXQoKSk7fX07Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZT17RG9ja2VkVG9Cb3R0b206J2JvdHRvbScsRG9ja2VkVG9SaWdodDoncmlnaHQnLERvY2tlZFRvTGVmdDonbGVmdCcsVW5kb2NrZWQ6J3VuZG9ja2VkJ307Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5FdmVudHM9e0JlZm9yZURvY2tTaWRlQ2hhbmdlZDpTeW1ib2woJ0JlZm9yZURvY2tTaWRlQ2hhbmdlZCcpLERvY2tTaWRlQ2hhbmdlZDpTeW1ib2woJ0RvY2tTaWRlQ2hhbmdlZCcpLEFmdGVyRG9ja1NpZGVDaGFuZ2VkOlN5bWJvbCgnQWZ0ZXJEb2NrU2lkZUNoYW5nZWQnKX07Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5Ub2dnbGVEb2NrQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe0NvbXBvbmVudHMuZG9ja0NvbnRyb2xsZXIuX3RvZ2dsZURvY2tTaWRlKCk7cmV0dXJuIHRydWU7fX07Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5DbG9zZUJ1dHRvblByb3ZpZGVyPWNsYXNze2l0ZW0oKXtyZXR1cm4gQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5fY2xvc2VCdXR0b247fX07Q29tcG9uZW50cy5kb2NrQ29udHJvbGxlcjs7Q29tcG9uZW50cy5MaW5raWZpZXI9Y2xhc3N7Y29uc3RydWN0b3IobWF4TGVuZ3RoRm9yRGlzcGxheWVkVVJMcyx1c2VMaW5rRGVjb3JhdG9yKXt0aGlzLl9tYXhMZW5ndGg9bWF4TGVuZ3RoRm9yRGlzcGxheWVkVVJMc3x8VUkuTWF4TGVuZ3RoRm9yRGlzcGxheWVkVVJMczt0aGlzLl9hbmNob3JzQnlUYXJnZXQ9bmV3IE1hcCgpO3RoaXMuX2xvY2F0aW9uUG9vbEJ5VGFyZ2V0PW5ldyBNYXAoKTt0aGlzLl91c2VMaW5rRGVjb3JhdG9yPSEhdXNlTGlua0RlY29yYXRvcjtDb21wb25lbnRzLkxpbmtpZmllci5faW5zdGFuY2VzLmFkZCh0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlVGFyZ2V0cyh0aGlzKTt9CnN0YXRpYyBzZXRMaW5rRGVjb3JhdG9yKGRlY29yYXRvcil7Y29uc29sZS5hc3NlcnQoIUNvbXBvbmVudHMuTGlua2lmaWVyLl9kZWNvcmF0b3IsJ0Nhbm5vdCByZS1yZWdpc3RlciBsaW5rIGRlY29yYXRvci4nKTtDb21wb25lbnRzLkxpbmtpZmllci5fZGVjb3JhdG9yPWRlY29yYXRvcjtkZWNvcmF0b3IuYWRkRXZlbnRMaXN0ZW5lcihDb21wb25lbnRzLkxpbmtEZWNvcmF0b3IuRXZlbnRzLkxpbmtJY29uQ2hhbmdlZCxvbkxpbmtJY29uQ2hhbmdlZCk7Zm9yKGNvbnN0IGxpbmtpZmllciBvZiBDb21wb25lbnRzLkxpbmtpZmllci5faW5zdGFuY2VzKQpsaW5raWZpZXIuX3VwZGF0ZUFsbEFuY2hvckRlY29yYXRpb25zKCk7ZnVuY3Rpb24gb25MaW5rSWNvbkNoYW5nZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7Y29uc3QgbGlua3M9dWlTb3VyY2VDb2RlW0NvbXBvbmVudHMuTGlua2lmaWVyLl9zb3VyY2VDb2RlQW5jaG9yc118fFtdO2Zvcihjb25zdCBsaW5rIG9mIGxpbmtzKQpDb21wb25lbnRzLkxpbmtpZmllci5fdXBkYXRlTGlua0RlY29yYXRpb25zKGxpbmspO319Cl91cGRhdGVBbGxBbmNob3JEZWNvcmF0aW9ucygpe2Zvcihjb25zdCBhbmNob3JzIG9mIHRoaXMuX2FuY2hvcnNCeVRhcmdldC52YWx1ZXMoKSl7Zm9yKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKQpDb21wb25lbnRzLkxpbmtpZmllci5fdXBkYXRlTGlua0RlY29yYXRpb25zKGFuY2hvcik7fX0Kc3RhdGljIF9iaW5kVUlMb2NhdGlvbihhbmNob3IsdWlMb2NhdGlvbil7Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtJbmZvKGFuY2hvcikudWlMb2NhdGlvbj11aUxvY2F0aW9uO2lmKCF1aUxvY2F0aW9uKQpyZXR1cm47Y29uc3QgdWlTb3VyY2VDb2RlPXVpTG9jYXRpb24udWlTb3VyY2VDb2RlO2xldCBzb3VyY2VDb2RlQW5jaG9ycz11aVNvdXJjZUNvZGVbQ29tcG9uZW50cy5MaW5raWZpZXIuX3NvdXJjZUNvZGVBbmNob3JzXTtpZighc291cmNlQ29kZUFuY2hvcnMpe3NvdXJjZUNvZGVBbmNob3JzPW5ldyBTZXQoKTt1aVNvdXJjZUNvZGVbQ29tcG9uZW50cy5MaW5raWZpZXIuX3NvdXJjZUNvZGVBbmNob3JzXT1zb3VyY2VDb2RlQW5jaG9yczt9CnNvdXJjZUNvZGVBbmNob3JzLmFkZChhbmNob3IpO30Kc3RhdGljIF91bmJpbmRVSUxvY2F0aW9uKGFuY2hvcil7Y29uc3QgaW5mbz1Db21wb25lbnRzLkxpbmtpZmllci5fbGlua0luZm8oYW5jaG9yKTtpZighaW5mby51aUxvY2F0aW9uKQpyZXR1cm47Y29uc3QgdWlTb3VyY2VDb2RlPWluZm8udWlMb2NhdGlvbi51aVNvdXJjZUNvZGU7aW5mby51aUxvY2F0aW9uPW51bGw7Y29uc3Qgc291cmNlQ29kZUFuY2hvcnM9dWlTb3VyY2VDb2RlW0NvbXBvbmVudHMuTGlua2lmaWVyLl9zb3VyY2VDb2RlQW5jaG9yc107aWYoc291cmNlQ29kZUFuY2hvcnMpCnNvdXJjZUNvZGVBbmNob3JzLmRlbGV0ZShhbmNob3IpO30KdGFyZ2V0QWRkZWQodGFyZ2V0KXt0aGlzLl9hbmNob3JzQnlUYXJnZXQuc2V0KHRhcmdldCxbXSk7dGhpcy5fbG9jYXRpb25Qb29sQnlUYXJnZXQuc2V0KHRhcmdldCxuZXcgQmluZGluZ3MuTGl2ZUxvY2F0aW9uUG9vbCgpKTt9CnRhcmdldFJlbW92ZWQodGFyZ2V0KXtjb25zdCBsb2NhdGlvblBvb2w9KHRoaXMuX2xvY2F0aW9uUG9vbEJ5VGFyZ2V0LnJlbW92ZSh0YXJnZXQpKTtsb2NhdGlvblBvb2wuZGlzcG9zZUFsbCgpO2NvbnN0IGFuY2hvcnM9dGhpcy5fYW5jaG9yc0J5VGFyZ2V0LnJlbW92ZSh0YXJnZXQpO2Zvcihjb25zdCBhbmNob3Igb2YgYW5jaG9ycyl7Y29uc3QgaW5mbz1Db21wb25lbnRzLkxpbmtpZmllci5fbGlua0luZm8oYW5jaG9yKTtpbmZvLmxpdmVMb2NhdGlvbj1udWxsO0NvbXBvbmVudHMuTGlua2lmaWVyLl91bmJpbmRVSUxvY2F0aW9uKGFuY2hvcik7aWYoaW5mby5mYWxsYmFjayl7YW5jaG9yLmhyZWY9aW5mby5mYWxsYmFjay5ocmVmO2FuY2hvci50aXRsZT1pbmZvLmZhbGxiYWNrLnRpdGxlO2FuY2hvci5jbGFzc05hbWU9aW5mby5mYWxsYmFjay5jbGFzc05hbWU7YW5jaG9yLnRleHRDb250ZW50PWluZm8uZmFsbGJhY2sudGV4dENvbnRlbnQ7YW5jaG9yW0NvbXBvbmVudHMuTGlua2lmaWVyLl9pbmZvU3ltYm9sXT1pbmZvLmZhbGxiYWNrW0NvbXBvbmVudHMuTGlua2lmaWVyLl9pbmZvU3ltYm9sXTt9fX0KbWF5YmVMaW5raWZ5U2NyaXB0TG9jYXRpb24odGFyZ2V0LHNjcmlwdElkLHNvdXJjZVVSTCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjbGFzc2VzKXtsZXQgZmFsbGJhY2tBbmNob3I9bnVsbDtpZihzb3VyY2VVUkwpe2ZhbGxiYWNrQW5jaG9yPUNvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwoc291cmNlVVJMLHtjbGFzc05hbWU6Y2xhc3NlcyxsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNvbHVtbk51bWJlcixtYXhMZW5ndGg6dGhpcy5fbWF4TGVuZ3RofSk7fQppZighdGFyZ2V0fHx0YXJnZXQuaXNEaXNwb3NlZCgpKQpyZXR1cm4gZmFsbGJhY2tBbmNob3I7Y29uc3QgZGVidWdnZXJNb2RlbD10YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpO2lmKCFkZWJ1Z2dlck1vZGVsKQpyZXR1cm4gZmFsbGJhY2tBbmNob3I7Y29uc3QgcmF3TG9jYXRpb249KHNjcmlwdElkP2RlYnVnZ2VyTW9kZWwuY3JlYXRlUmF3TG9jYXRpb25CeVNjcmlwdElkKHNjcmlwdElkLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyfHwwKTpudWxsKXx8ZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbkJ5VVJMKHNvdXJjZVVSTCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcnx8MCk7aWYoIXJhd0xvY2F0aW9uKQpyZXR1cm4gZmFsbGJhY2tBbmNob3I7Y29uc3QgYW5jaG9yPUNvbXBvbmVudHMuTGlua2lmaWVyLl9jcmVhdGVMaW5rKCcnLGNsYXNzZXN8fCcnKTtjb25zdCBpbmZvPUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSW5mbyhhbmNob3IpO2luZm8uZW5hYmxlRGVjb3JhdG9yPXRoaXMuX3VzZUxpbmtEZWNvcmF0b3I7aW5mby5mYWxsYmFjaz1mYWxsYmFja0FuY2hvcjtpbmZvLmxpdmVMb2NhdGlvbj1CaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuY3JlYXRlTGl2ZUxvY2F0aW9uKHJhd0xvY2F0aW9uLHRoaXMuX3VwZGF0ZUFuY2hvci5iaW5kKHRoaXMsYW5jaG9yKSwodGhpcy5fbG9jYXRpb25Qb29sQnlUYXJnZXQuZ2V0KHJhd0xvY2F0aW9uLmRlYnVnZ2VyTW9kZWwudGFyZ2V0KCkpKSk7Y29uc3QgYW5jaG9ycz0odGhpcy5fYW5jaG9yc0J5VGFyZ2V0LmdldChyYXdMb2NhdGlvbi5kZWJ1Z2dlck1vZGVsLnRhcmdldCgpKSk7YW5jaG9ycy5wdXNoKGFuY2hvcik7cmV0dXJuIGFuY2hvcjt9CmxpbmtpZnlTY3JpcHRMb2NhdGlvbih0YXJnZXQsc2NyaXB0SWQsc291cmNlVVJMLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNsYXNzZXMpe2NvbnN0IHNjcmlwdExpbms9dGhpcy5tYXliZUxpbmtpZnlTY3JpcHRMb2NhdGlvbih0YXJnZXQsc2NyaXB0SWQsc291cmNlVVJMLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNsYXNzZXMpO3JldHVybiBzY3JpcHRMaW5rfHxDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5VVJMKHNvdXJjZVVSTCx7Y2xhc3NOYW1lOmNsYXNzZXMsbGluZU51bWJlcjpsaW5lTnVtYmVyLGNvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXIsbWF4TGVuZ3RoOnRoaXMuX21heExlbmd0aH0pO30KbGlua2lmeVJhd0xvY2F0aW9uKHJhd0xvY2F0aW9uLGZhbGxiYWNrVXJsLGNsYXNzZXMpe3JldHVybiB0aGlzLmxpbmtpZnlTY3JpcHRMb2NhdGlvbihyYXdMb2NhdGlvbi5kZWJ1Z2dlck1vZGVsLnRhcmdldCgpLHJhd0xvY2F0aW9uLnNjcmlwdElkLGZhbGxiYWNrVXJsLHJhd0xvY2F0aW9uLmxpbmVOdW1iZXIscmF3TG9jYXRpb24uY29sdW1uTnVtYmVyLGNsYXNzZXMpO30KbWF5YmVMaW5raWZ5Q29uc29sZUNhbGxGcmFtZSh0YXJnZXQsY2FsbEZyYW1lLGNsYXNzZXMpe3JldHVybiB0aGlzLm1heWJlTGlua2lmeVNjcmlwdExvY2F0aW9uKHRhcmdldCxjYWxsRnJhbWUuc2NyaXB0SWQsY2FsbEZyYW1lLnVybCxjYWxsRnJhbWUubGluZU51bWJlcixjYWxsRnJhbWUuY29sdW1uTnVtYmVyLGNsYXNzZXMpO30KbGlua2lmeVN0YWNrVHJhY2VUb3BGcmFtZSh0YXJnZXQsc3RhY2tUcmFjZSxjbGFzc2VzKXtjb25zb2xlLmFzc2VydChzdGFja1RyYWNlLmNhbGxGcmFtZXMmJnN0YWNrVHJhY2UuY2FsbEZyYW1lcy5sZW5ndGgpO2NvbnN0IHRvcEZyYW1lPXN0YWNrVHJhY2UuY2FsbEZyYW1lc1swXTtjb25zdCBmYWxsYmFja0FuY2hvcj1Db21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5VVJMKHRvcEZyYW1lLnVybCx7Y2xhc3NOYW1lOmNsYXNzZXMsbGluZU51bWJlcjp0b3BGcmFtZS5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0b3BGcmFtZS5jb2x1bW5OdW1iZXIsbWF4TGVuZ3RoOnRoaXMuX21heExlbmd0aH0pO2lmKHRhcmdldC5pc0Rpc3Bvc2VkKCkpCnJldHVybiBmYWxsYmFja0FuY2hvcjtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7Y29uc3QgcmF3TG9jYXRpb25zPWRlYnVnZ2VyTW9kZWwuY3JlYXRlUmF3TG9jYXRpb25zQnlTdGFja1RyYWNlKHN0YWNrVHJhY2UpO2lmKHJhd0xvY2F0aW9ucy5sZW5ndGg9PT0wKQpyZXR1cm4gZmFsbGJhY2tBbmNob3I7Y29uc3QgYW5jaG9yPUNvbXBvbmVudHMuTGlua2lmaWVyLl9jcmVhdGVMaW5rKCcnLGNsYXNzZXN8fCcnKTtjb25zdCBpbmZvPUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSW5mbyhhbmNob3IpO2luZm8uZW5hYmxlRGVjb3JhdG9yPXRoaXMuX3VzZUxpbmtEZWNvcmF0b3I7aW5mby5mYWxsYmFjaz1mYWxsYmFja0FuY2hvcjtpbmZvLmxpdmVMb2NhdGlvbj1CaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuY3JlYXRlU3RhY2tUcmFjZVRvcEZyYW1lTGl2ZUxvY2F0aW9uKHJhd0xvY2F0aW9ucyx0aGlzLl91cGRhdGVBbmNob3IuYmluZCh0aGlzLGFuY2hvciksKHRoaXMuX2xvY2F0aW9uUG9vbEJ5VGFyZ2V0LmdldCh0YXJnZXQpKSk7Y29uc3QgYW5jaG9ycz0odGhpcy5fYW5jaG9yc0J5VGFyZ2V0LmdldCh0YXJnZXQpKTthbmNob3JzLnB1c2goYW5jaG9yKTtyZXR1cm4gYW5jaG9yO30KbGlua2lmeUNTU0xvY2F0aW9uKHJhd0xvY2F0aW9uLGNsYXNzZXMpe2NvbnN0IGFuY2hvcj1Db21wb25lbnRzLkxpbmtpZmllci5fY3JlYXRlTGluaygnJyxjbGFzc2VzfHwnJyk7Y29uc3QgaW5mbz1Db21wb25lbnRzLkxpbmtpZmllci5fbGlua0luZm8oYW5jaG9yKTtpbmZvLmVuYWJsZURlY29yYXRvcj10aGlzLl91c2VMaW5rRGVjb3JhdG9yO2luZm8ubGl2ZUxvY2F0aW9uPUJpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmcuY3JlYXRlTGl2ZUxvY2F0aW9uKHJhd0xvY2F0aW9uLHRoaXMuX3VwZGF0ZUFuY2hvci5iaW5kKHRoaXMsYW5jaG9yKSwodGhpcy5fbG9jYXRpb25Qb29sQnlUYXJnZXQuZ2V0KHJhd0xvY2F0aW9uLmNzc01vZGVsKCkudGFyZ2V0KCkpKSk7Y29uc3QgYW5jaG9ycz0odGhpcy5fYW5jaG9yc0J5VGFyZ2V0LmdldChyYXdMb2NhdGlvbi5jc3NNb2RlbCgpLnRhcmdldCgpKSk7YW5jaG9ycy5wdXNoKGFuY2hvcik7cmV0dXJuIGFuY2hvcjt9CnJlc2V0KCl7Zm9yKGNvbnN0IHRhcmdldCBvZiB0aGlzLl9hbmNob3JzQnlUYXJnZXQua2V5c0FycmF5KCkpe3RoaXMudGFyZ2V0UmVtb3ZlZCh0YXJnZXQpO3RoaXMudGFyZ2V0QWRkZWQodGFyZ2V0KTt9fQpkaXNwb3NlKCl7Zm9yKGNvbnN0IHRhcmdldCBvZiB0aGlzLl9hbmNob3JzQnlUYXJnZXQua2V5c0FycmF5KCkpCnRoaXMudGFyZ2V0UmVtb3ZlZCh0YXJnZXQpO1NESy50YXJnZXRNYW5hZ2VyLnVub2JzZXJ2ZVRhcmdldHModGhpcyk7Q29tcG9uZW50cy5MaW5raWZpZXIuX2luc3RhbmNlcy5kZWxldGUodGhpcyk7fQpfdXBkYXRlQW5jaG9yKGFuY2hvcixsaXZlTG9jYXRpb24pe0NvbXBvbmVudHMuTGlua2lmaWVyLl91bmJpbmRVSUxvY2F0aW9uKGFuY2hvcik7Y29uc3QgdWlMb2NhdGlvbj1saXZlTG9jYXRpb24udWlMb2NhdGlvbigpO2lmKCF1aUxvY2F0aW9uKQpyZXR1cm47Q29tcG9uZW50cy5MaW5raWZpZXIuX2JpbmRVSUxvY2F0aW9uKGFuY2hvcix1aUxvY2F0aW9uKTtjb25zdCB0ZXh0PXVpTG9jYXRpb24ubGlua1RleHQodHJ1ZSk7Q29tcG9uZW50cy5MaW5raWZpZXIuX3NldFRyaW1tZWRUZXh0KGFuY2hvcix0ZXh0LHRoaXMuX21heExlbmd0aCk7bGV0IHRpdGxlVGV4dD11aUxvY2F0aW9uLnVpU291cmNlQ29kZS51cmwoKTtpZih0eXBlb2YgdWlMb2NhdGlvbi5saW5lTnVtYmVyPT09J251bWJlcicpCnRpdGxlVGV4dCs9JzonKyh1aUxvY2F0aW9uLmxpbmVOdW1iZXIrMSk7YW5jaG9yLnRpdGxlPXRpdGxlVGV4dDthbmNob3IuY2xhc3NMaXN0LnRvZ2dsZSgnd2Via2l0LWh0bWwtYmxhY2tib3gtbGluaycsbGl2ZUxvY2F0aW9uLmlzQmxhY2tib3hlZCgpKTtDb21wb25lbnRzLkxpbmtpZmllci5fdXBkYXRlTGlua0RlY29yYXRpb25zKGFuY2hvcik7fQpzdGF0aWMgX3VwZGF0ZUxpbmtEZWNvcmF0aW9ucyhhbmNob3Ipe2NvbnN0IGluZm89Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtJbmZvKGFuY2hvcik7aWYoIWluZm98fCFpbmZvLmVuYWJsZURlY29yYXRvcikKcmV0dXJuO2lmKCFDb21wb25lbnRzLkxpbmtpZmllci5fZGVjb3JhdG9yfHwhaW5mby51aUxvY2F0aW9uKQpyZXR1cm47aWYoaW5mby5pY29uJiZpbmZvLmljb24ucGFyZW50RWxlbWVudCkKYW5jaG9yLnJlbW92ZUNoaWxkKGluZm8uaWNvbik7Y29uc3QgaWNvbj1Db21wb25lbnRzLkxpbmtpZmllci5fZGVjb3JhdG9yLmxpbmtJY29uKGluZm8udWlMb2NhdGlvbi51aVNvdXJjZUNvZGUpO2lmKGljb24pe2ljb24uc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi1yaWdodCcsJzJweCcpO2FuY2hvci5pbnNlcnRCZWZvcmUoaWNvbixhbmNob3IuZmlyc3RDaGlsZCk7fQppbmZvLmljb249aWNvbjt9CnN0YXRpYyBsaW5raWZ5VVJMKHVybCxvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O2NvbnN0IHRleHQ9b3B0aW9ucy50ZXh0O2NvbnN0IGNsYXNzTmFtZT1vcHRpb25zLmNsYXNzTmFtZXx8Jyc7Y29uc3QgbGluZU51bWJlcj1vcHRpb25zLmxpbmVOdW1iZXI7Y29uc3QgY29sdW1uTnVtYmVyPW9wdGlvbnMuY29sdW1uTnVtYmVyO2NvbnN0IHByZXZlbnRDbGljaz1vcHRpb25zLnByZXZlbnRDbGljaztjb25zdCBtYXhMZW5ndGg9b3B0aW9ucy5tYXhMZW5ndGh8fFVJLk1heExlbmd0aEZvckRpc3BsYXllZFVSTHM7aWYoIXVybHx8dXJsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6Jykpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsY2xhc3NOYW1lKTtlbGVtZW50LnRleHRDb250ZW50PXRleHR8fHVybHx8Q29tbW9uLlVJU3RyaW5nKCcodW5rbm93biknKTtyZXR1cm4gZWxlbWVudDt9CmxldCBsaW5rVGV4dD10ZXh0fHxCaW5kaW5ncy5kaXNwbGF5TmFtZUZvclVSTCh1cmwpO2lmKHR5cGVvZiBsaW5lTnVtYmVyPT09J251bWJlcicmJiF0ZXh0KQpsaW5rVGV4dCs9JzonKyhsaW5lTnVtYmVyKzEpO2NvbnN0IHRpdGxlPWxpbmtUZXh0IT09dXJsP3VybDonJztjb25zdCBsaW5rPUNvbXBvbmVudHMuTGlua2lmaWVyLl9jcmVhdGVMaW5rKGxpbmtUZXh0LGNsYXNzTmFtZSxtYXhMZW5ndGgsdGl0bGUsdXJsLHByZXZlbnRDbGljayk7Y29uc3QgaW5mbz1Db21wb25lbnRzLkxpbmtpZmllci5fbGlua0luZm8obGluayk7aWYodHlwZW9mIGxpbmVOdW1iZXI9PT0nbnVtYmVyJykKaW5mby5saW5lTnVtYmVyPWxpbmVOdW1iZXI7aWYodHlwZW9mIGNvbHVtbk51bWJlcj09PSdudW1iZXInKQppbmZvLmNvbHVtbk51bWJlcj1jb2x1bW5OdW1iZXI7cmV0dXJuIGxpbms7fQpzdGF0aWMgbGlua2lmeVJldmVhbGFibGUocmV2ZWFsYWJsZSx0ZXh0LGZhbGxiYWNrSHJlZil7Y29uc3QgbGluaz1Db21wb25lbnRzLkxpbmtpZmllci5fY3JlYXRlTGluayh0ZXh0LCcnLFVJLk1heExlbmd0aEZvckRpc3BsYXllZFVSTHMsdW5kZWZpbmVkLGZhbGxiYWNrSHJlZik7Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtJbmZvKGxpbmspLnJldmVhbGFibGU9cmV2ZWFsYWJsZTtyZXR1cm4gbGluazt9CnN0YXRpYyBfY3JlYXRlTGluayh0ZXh0LGNsYXNzTmFtZSxtYXhMZW5ndGgsdGl0bGUsaHJlZixwcmV2ZW50Q2xpY2spe2NvbnN0IGxpbms9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsY2xhc3NOYW1lKTtsaW5rLmNsYXNzTGlzdC5hZGQoJ2RldnRvb2xzLWxpbmsnKTtpZih0aXRsZSkKbGluay50aXRsZT10aXRsZTtpZihocmVmKQpsaW5rLmhyZWY9aHJlZjtDb21wb25lbnRzLkxpbmtpZmllci5fc2V0VHJpbW1lZFRleHQobGluayx0ZXh0LG1heExlbmd0aCk7bGlua1tDb21wb25lbnRzLkxpbmtpZmllci5faW5mb1N5bWJvbF09e2ljb246bnVsbCxlbmFibGVEZWNvcmF0b3I6ZmFsc2UsdWlMb2NhdGlvbjpudWxsLGxpdmVMb2NhdGlvbjpudWxsLHVybDpocmVmfHxudWxsLGxpbmVOdW1iZXI6bnVsbCxjb2x1bW5OdW1iZXI6bnVsbCxyZXZlYWxhYmxlOm51bGwsZmFsbGJhY2s6bnVsbH07aWYoIXByZXZlbnRDbGljaykKbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsQ29tcG9uZW50cy5MaW5raWZpZXIuX2hhbmRsZUNsaWNrLGZhbHNlKTtlbHNlCmxpbmsuY2xhc3NMaXN0LmFkZCgnZGV2dG9vbHMtbGluay1wcmV2ZW50LWNsaWNrJyk7cmV0dXJuIGxpbms7fQpzdGF0aWMgX3NldFRyaW1tZWRUZXh0KGxpbmssdGV4dCxtYXhMZW5ndGgpe2xpbmsucmVtb3ZlQ2hpbGRyZW4oKTtpZihtYXhMZW5ndGgmJnRleHQubGVuZ3RoPm1heExlbmd0aCl7Y29uc3QgbWlkZGxlU3BsaXQ9c3BsaXRNaWRkbGUodGV4dCxtYXhMZW5ndGgpO2FwcGVuZFRleHRXaXRob3V0SGFzaGVzKG1pZGRsZVNwbGl0WzBdKTthcHBlbmRIaWRkZW5UZXh0KG1pZGRsZVNwbGl0WzFdKTthcHBlbmRUZXh0V2l0aG91dEhhc2hlcyhtaWRkbGVTcGxpdFsyXSk7fWVsc2V7YXBwZW5kVGV4dFdpdGhvdXRIYXNoZXModGV4dCk7fQpmdW5jdGlvbiBhcHBlbmRIaWRkZW5UZXh0KHN0cmluZyl7Y29uc3QgZWxsaXBzaXNOb2RlPWxpbmsuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdkZXZ0b29scy1saW5rLWVsbGlwc2lzJykuY3JlYXRlVGV4dENoaWxkKCdcdTIwMjYnKTtlbGxpcHNpc05vZGVbQ29tcG9uZW50cy5MaW5raWZpZXIuX3VudHJ1bmNhdGVkTm9kZVRleHRTeW1ib2xdPXN0cmluZzt9CmZ1bmN0aW9uIGFwcGVuZFRleHRXaXRob3V0SGFzaGVzKHN0cmluZyl7Y29uc3QgaGFzaFNwbGl0PVRleHRVdGlscy5UZXh0VXRpbHMuc3BsaXRTdHJpbmdCeVJlZ2V4ZXMoc3RyaW5nLFsvW2EtZjAtOV17MjAsfS9nXSk7Zm9yKGNvbnN0IG1hdGNoIG9mIGhhc2hTcGxpdCl7aWYobWF0Y2gucmVnZXhJbmRleD09PS0xKXtsaW5rLmNyZWF0ZVRleHRDaGlsZChtYXRjaC52YWx1ZSk7fWVsc2V7bGluay5jcmVhdGVUZXh0Q2hpbGQobWF0Y2gudmFsdWUuc3Vic3RyaW5nKDAsNykpO2FwcGVuZEhpZGRlblRleHQobWF0Y2gudmFsdWUuc3Vic3RyaW5nKDcpKTt9fX0KZnVuY3Rpb24gc3BsaXRNaWRkbGUoc3RyaW5nLG1heExlbmd0aCl7bGV0IGxlZnRJbmRleD1NYXRoLmZsb29yKG1heExlbmd0aC8yKTtsZXQgcmlnaHRJbmRleD1zdHJpbmcubGVuZ3RoLU1hdGguY2VpbChtYXhMZW5ndGgvMikrMTtpZihzdHJpbmcuY29kZVBvaW50QXQocmlnaHRJbmRleC0xKT49MHgxMDAwMCl7cmlnaHRJbmRleCsrO2xlZnRJbmRleCsrO30KaWYobGVmdEluZGV4PjAmJnN0cmluZy5jb2RlUG9pbnRBdChsZWZ0SW5kZXgtMSk+PTB4MTAwMDApCmxlZnRJbmRleC0tO3JldHVybltzdHJpbmcuc3Vic3RyaW5nKDAsbGVmdEluZGV4KSxzdHJpbmcuc3Vic3RyaW5nKGxlZnRJbmRleCxyaWdodEluZGV4KSxzdHJpbmcuc3Vic3RyaW5nKHJpZ2h0SW5kZXgpXTt9fQpzdGF0aWMgdW50cnVuY2F0ZWROb2RlVGV4dChub2RlKXtyZXR1cm4gbm9kZVtDb21wb25lbnRzLkxpbmtpZmllci5fdW50cnVuY2F0ZWROb2RlVGV4dFN5bWJvbF18fG5vZGUudGV4dENvbnRlbnQ7fQpzdGF0aWMgX2xpbmtJbmZvKGxpbmspe3JldHVybihsaW5rP2xpbmtbQ29tcG9uZW50cy5MaW5raWZpZXIuX2luZm9TeW1ib2xdfHxudWxsOm51bGwpO30Kc3RhdGljIF9oYW5kbGVDbGljayhldmVudCl7Y29uc3QgbGluaz0oZXZlbnQuY3VycmVudFRhcmdldCk7ZXZlbnQuY29uc3VtZSh0cnVlKTtpZihVSS5pc0JlaW5nRWRpdGVkKChldmVudC50YXJnZXQpKXx8bGluay5oYXNTZWxlY3Rpb24oKSkKcmV0dXJuO2NvbnN0IGFjdGlvbnM9Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtBY3Rpb25zKGxpbmspO2lmKGFjdGlvbnMubGVuZ3RoKQphY3Rpb25zWzBdLmhhbmRsZXIuY2FsbChudWxsKTt9CnN0YXRpYyBfbGlua0hhbmRsZXJTZXR0aW5nKCl7aWYoIUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSGFuZGxlclNldHRpbmdJbnN0YW5jZSl7Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVyU2V0dGluZ0luc3RhbmNlPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdvcGVuTGlua0hhbmRsZXInLENvbW1vbi5VSVN0cmluZygnYXV0bycpKTt9CnJldHVybiBDb21wb25lbnRzLkxpbmtpZmllci5fbGlua0hhbmRsZXJTZXR0aW5nSW5zdGFuY2U7fQpzdGF0aWMgcmVnaXN0ZXJMaW5rSGFuZGxlcih0aXRsZSxoYW5kbGVyKXtDb21wb25lbnRzLkxpbmtpZmllci5fbGlua0hhbmRsZXJzLnNldCh0aXRsZSxoYW5kbGVyKTtzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoQ29tcG9uZW50cy5MaW5raWZpZXIuTGlua0hhbmRsZXJTZXR0aW5nVUkpLl91cGRhdGUoKTt9CnN0YXRpYyB1bnJlZ2lzdGVyTGlua0hhbmRsZXIodGl0bGUpe0NvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSGFuZGxlcnMuZGVsZXRlKHRpdGxlKTtzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoQ29tcG9uZW50cy5MaW5raWZpZXIuTGlua0hhbmRsZXJTZXR0aW5nVUkpLl91cGRhdGUoKTt9CnN0YXRpYyB1aUxvY2F0aW9uKGxpbmspe2NvbnN0IGluZm89Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtJbmZvKGxpbmspO3JldHVybiBpbmZvP2luZm8udWlMb2NhdGlvbjpudWxsO30Kc3RhdGljIF9saW5rQWN0aW9ucyhsaW5rKXtjb25zdCBpbmZvPUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSW5mbyhsaW5rKTtjb25zdCByZXN1bHQ9W107aWYoIWluZm8pCnJldHVybiByZXN1bHQ7bGV0IHVybD0nJztsZXQgdWlMb2NhdGlvbj1udWxsO2lmKGluZm8udWlMb2NhdGlvbil7dWlMb2NhdGlvbj1pbmZvLnVpTG9jYXRpb247dXJsPXVpTG9jYXRpb24udWlTb3VyY2VDb2RlLmNvbnRlbnRVUkwoKTt9ZWxzZSBpZihpbmZvLnVybCl7dXJsPWluZm8udXJsO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTCh1cmwpfHxXb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTChDb21tb24uUGFyc2VkVVJMLnVybFdpdGhvdXRIYXNoKHVybCkpO3VpTG9jYXRpb249dWlTb3VyY2VDb2RlP3VpU291cmNlQ29kZS51aUxvY2F0aW9uKGluZm8ubGluZU51bWJlcnx8MCxpbmZvLmNvbHVtbk51bWJlcnx8MCk6bnVsbDt9CmNvbnN0IHJlc291cmNlPXVybD9CaW5kaW5ncy5yZXNvdXJjZUZvclVSTCh1cmwpOm51bGw7Y29uc3QgY29udGVudFByb3ZpZGVyPXVpTG9jYXRpb24/dWlMb2NhdGlvbi51aVNvdXJjZUNvZGU6cmVzb3VyY2U7Y29uc3QgcmV2ZWFsYWJsZT1pbmZvLnJldmVhbGFibGV8fHVpTG9jYXRpb258fHJlc291cmNlO2lmKHJldmVhbGFibGUpe2NvbnN0IGRlc3RpbmF0aW9uPUNvbW1vbi5SZXZlYWxlci5yZXZlYWxEZXN0aW5hdGlvbihyZXZlYWxhYmxlKTtyZXN1bHQucHVzaCh7c2VjdGlvbjoncmV2ZWFsJyx0aXRsZTpkZXN0aW5hdGlvbj9sc2BSZXZlYWwgaW4gJHtkZXN0aW5hdGlvbn1gOmxzYFJldmVhbGAsaGFuZGxlcjooKT0+Q29tbW9uLlJldmVhbGVyLnJldmVhbChyZXZlYWxhYmxlKX0pO30KaWYoY29udGVudFByb3ZpZGVyKXtjb25zdCBsaW5lTnVtYmVyPXVpTG9jYXRpb24/dWlMb2NhdGlvbi5saW5lTnVtYmVyOmluZm8ubGluZU51bWJlcnx8MDtmb3IoY29uc3QgdGl0bGUgb2YgQ29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVycy5rZXlzKCkpe2NvbnN0IGhhbmRsZXI9Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVycy5nZXQodGl0bGUpO2NvbnN0IGFjdGlvbj17c2VjdGlvbjoncmV2ZWFsJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ09wZW4gdXNpbmcgJXMnLHRpdGxlKSxoYW5kbGVyOmhhbmRsZXIuYmluZChudWxsLGNvbnRlbnRQcm92aWRlcixsaW5lTnVtYmVyKX07aWYodGl0bGU9PT1Db21wb25lbnRzLkxpbmtpZmllci5fbGlua0hhbmRsZXJTZXR0aW5nKCkuZ2V0KCkpCnJlc3VsdC51bnNoaWZ0KGFjdGlvbik7ZWxzZQpyZXN1bHQucHVzaChhY3Rpb24pO319CmlmKHJlc291cmNlfHxpbmZvLnVybCl7cmVzdWx0LnB1c2goe3NlY3Rpb246J3JldmVhbCcsdGl0bGU6VUkub3BlbkxpbmtFeHRlcm5hbGx5TGFiZWwoKSxoYW5kbGVyOigpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKHVybCl9KTtyZXN1bHQucHVzaCh7c2VjdGlvbjonY2xpcGJvYXJkJyx0aXRsZTpVSS5jb3B5TGlua0FkZHJlc3NMYWJlbCgpLGhhbmRsZXI6KCk9Pkluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dCh1cmwpfSk7fQpyZXR1cm4gcmVzdWx0O319O0NvbXBvbmVudHMuTGlua2lmaWVyLl9pbnN0YW5jZXM9bmV3IFNldCgpO0NvbXBvbmVudHMuTGlua2lmaWVyLl9kZWNvcmF0b3I9bnVsbDtDb21wb25lbnRzLkxpbmtpZmllci5fc291cmNlQ29kZUFuY2hvcnM9U3ltYm9sKCdMaW5raWZpZXIuYW5jaG9ycycpO0NvbXBvbmVudHMuTGlua2lmaWVyLl9pbmZvU3ltYm9sPVN5bWJvbCgnTGlua2lmaWVyLmluZm8nKTtDb21wb25lbnRzLkxpbmtpZmllci5fdW50cnVuY2F0ZWROb2RlVGV4dFN5bWJvbD1TeW1ib2woJ0xpbmtpZmllci51bnRydW5jYXRlZE5vZGVUZXh0Jyk7Q29tcG9uZW50cy5fTGlua0luZm87Q29tcG9uZW50cy5MaW5raWZ5VVJMT3B0aW9ucztDb21wb25lbnRzLkxpbmtpZmllci5NYXhMZW5ndGhUb0lnbm9yZUxpbmtpZmllcj0xMDAwMDtDb21wb25lbnRzLkxpbmtpZmllci5MaW5rSGFuZGxlcjtDb21wb25lbnRzLkxpbmtpZmllci5fbGlua0hhbmRsZXJzPW5ldyBNYXAoKTtDb21wb25lbnRzLkxpbmtEZWNvcmF0b3I9ZnVuY3Rpb24oKXt9O0NvbXBvbmVudHMuTGlua0RlY29yYXRvci5wcm90b3R5cGU9e2xpbmtJY29uKHVpU291cmNlQ29kZSl7fX07Q29tcG9uZW50cy5MaW5rRGVjb3JhdG9yLkV2ZW50cz17TGlua0ljb25DaGFuZ2VkOlN5bWJvbCgnTGlua0ljb25DaGFuZ2VkJyl9O0NvbXBvbmVudHMuTGlua2lmaWVyLkxpbmtDb250ZXh0TWVudVByb3ZpZGVyPWNsYXNze2FwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpe2xldCB0YXJnZXROb2RlPSh0YXJnZXQpO3doaWxlKHRhcmdldE5vZGUmJiF0YXJnZXROb2RlW0NvbXBvbmVudHMuTGlua2lmaWVyLl9pbmZvU3ltYm9sXSkKdGFyZ2V0Tm9kZT10YXJnZXROb2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKTtjb25zdCBsaW5rPSh0YXJnZXROb2RlKTtjb25zdCBhY3Rpb25zPUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rQWN0aW9ucyhsaW5rKTtmb3IoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpCmNvbnRleHRNZW51LnNlY3Rpb24oYWN0aW9uLnNlY3Rpb24pLmFwcGVuZEl0ZW0oYWN0aW9uLnRpdGxlLGFjdGlvbi5oYW5kbGVyKTt9fTtDb21wb25lbnRzLkxpbmtpZmllci5MaW5rSGFuZGxlclNldHRpbmdVST1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2VsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc2VsZWN0JywnY2hyb21lLXNlbGVjdCcpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyx0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl91cGRhdGUoKTt9Cl91cGRhdGUoKXt0aGlzLl9lbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgbmFtZXM9Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVycy5rZXlzQXJyYXkoKTtuYW1lcy51bnNoaWZ0KENvbW1vbi5VSVN0cmluZygnYXV0bycpKTtmb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7Y29uc3Qgb3B0aW9uPWNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO29wdGlvbi50ZXh0Q29udGVudD1uYW1lO29wdGlvbi5zZWxlY3RlZD1uYW1lPT09Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVyU2V0dGluZygpLmdldCgpO3RoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uKTt9CnRoaXMuX2VsZW1lbnQuZGlzYWJsZWQ9bmFtZXMubGVuZ3RoPD0xO30KX29uQ2hhbmdlKGV2ZW50KXtjb25zdCB2YWx1ZT1ldmVudC50YXJnZXQudmFsdWU7Q29tcG9uZW50cy5MaW5raWZpZXIuX2xpbmtIYW5kbGVyU2V0dGluZygpLnNldCh2YWx1ZSk7fQpzZXR0aW5nRWxlbWVudCgpe3JldHVybiBVSS5TZXR0aW5nc1VJLmNyZWF0ZUN1c3RvbVNldHRpbmcoQ29tbW9uLlVJU3RyaW5nKCdMaW5rIGhhbmRsaW5nOicpLHRoaXMuX2VsZW1lbnQpO319O0NvbXBvbmVudHMuTGlua2lmaWVyLkNvbnRlbnRQcm92aWRlckNvbnRleHRNZW51UHJvdmlkZXI9Y2xhc3N7YXBwZW5kQXBwbGljYWJsZUl0ZW1zKGV2ZW50LGNvbnRleHRNZW51LHRhcmdldCl7Y29uc3QgY29udGVudFByb3ZpZGVyPSh0YXJnZXQpO2lmKCFjb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpKQpyZXR1cm47Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oVUkub3BlbkxpbmtFeHRlcm5hbGx5TGFiZWwoKSwoKT0+SW5zcGVjdG9yRnJvbnRlbmRIb3N0Lm9wZW5Jbk5ld1RhYihjb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpKSk7Zm9yKGNvbnN0IHRpdGxlIG9mIENvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSGFuZGxlcnMua2V5cygpKXtjb25zdCBoYW5kbGVyPUNvbXBvbmVudHMuTGlua2lmaWVyLl9saW5rSGFuZGxlcnMuZ2V0KHRpdGxlKTtjb250ZXh0TWVudS5yZXZlYWxTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ09wZW4gdXNpbmcgJXMnLHRpdGxlKSxoYW5kbGVyLmJpbmQobnVsbCxjb250ZW50UHJvdmlkZXIsMCkpO30KaWYoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU0RLLk5ldHdvcmtSZXF1ZXN0KQpyZXR1cm47Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oVUkuY29weUxpbmtBZGRyZXNzTGFiZWwoKSwoKT0+SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KGNvbnRlbnRQcm92aWRlci5jb250ZW50VVJMKCkpKTt9fTs7Q29tcG9uZW50cy5yZWxvYWQ9ZnVuY3Rpb24oKXtpZihDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLmNhbkRvY2soKSYmQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5kb2NrU2lkZSgpPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCkKSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNldElzRG9ja2VkKHRydWUsZnVuY3Rpb24oKXt9KTt3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7fTs7Q29tcG9uZW50cy5UYXJnZXREZXRhY2hlZERpYWxvZz1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7aWYodGFyZ2V0LnBhcmVudFRhcmdldCgpKQpyZXR1cm47dGFyZ2V0LnJlZ2lzdGVySW5zcGVjdG9yRGlzcGF0Y2hlcih0aGlzKTt0YXJnZXQuaW5zcGVjdG9yQWdlbnQoKS5lbmFibGUoKTt0aGlzLl9oaWRlQ3Jhc2hlZERpYWxvZz1udWxsO0NvbXBvbmVudHMuVGFyZ2V0RGV0YWNoZWREaWFsb2cuX2Rpc2Nvbm5lY3RlZFNjcmVlbldpdGhSZWFzb25XYXNTaG93bj1mYWxzZTt9CmRldGFjaGVkKHJlYXNvbil7Q29tcG9uZW50cy5UYXJnZXREZXRhY2hlZERpYWxvZy5fZGlzY29ubmVjdGVkU2NyZWVuV2l0aFJlYXNvbldhc1Nob3duPXRydWU7VUkuUmVtb3RlRGVidWdnaW5nVGVybWluYXRlZFNjcmVlbi5zaG93KHJlYXNvbik7fQpzdGF0aWMgd2ViU29ja2V0Q29ubmVjdGlvbkxvc3QoKXtVSS5SZW1vdGVEZWJ1Z2dpbmdUZXJtaW5hdGVkU2NyZWVuLnNob3coJ1dlYlNvY2tldCBkaXNjb25uZWN0ZWQnKTt9CnRhcmdldENyYXNoZWQoKXtjb25zdCBkaWFsb2c9bmV3IFVJLkRpYWxvZygpO2RpYWxvZy5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCk7ZGlhbG9nLmFkZENsb3NlQnV0dG9uKCk7ZGlhbG9nLnNldERpbW1lZCh0cnVlKTt0aGlzLl9oaWRlQ3Jhc2hlZERpYWxvZz1kaWFsb2cuaGlkZS5iaW5kKGRpYWxvZyk7bmV3IFVJLlRhcmdldENyYXNoZWRTY3JlZW4oKCk9PnRoaXMuX2hpZGVDcmFzaGVkRGlhbG9nPW51bGwpLnNob3coZGlhbG9nLmNvbnRlbnRFbGVtZW50KTtkaWFsb2cuc2hvdygpO30KdGFyZ2V0UmVsb2FkZWRBZnRlckNyYXNoKCl7aWYodGhpcy5faGlkZUNyYXNoZWREaWFsb2cpe3RoaXMuX2hpZGVDcmFzaGVkRGlhbG9nLmNhbGwobnVsbCk7dGhpcy5faGlkZUNyYXNoZWREaWFsb2c9bnVsbDt9fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKENvbXBvbmVudHMuVGFyZ2V0RGV0YWNoZWREaWFsb2csU0RLLlRhcmdldC5DYXBhYmlsaXR5Lkluc3BlY3Rvcix0cnVlKTs7c2VsZlsnUGVyc2lzdGVuY2UnXT1zZWxmWydQZXJzaXN0ZW5jZSddfHx7fTtQZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW09Y2xhc3N7Y29uc3RydWN0b3IobWFuYWdlcixwYXRoLGVtYmVkZGVyUGF0aCxkb21GaWxlU3lzdGVtLHR5cGUpe3RoaXMuX21hbmFnZXI9bWFuYWdlcjt0aGlzLl9wYXRoPXBhdGg7dGhpcy5fZW1iZWRkZXJQYXRoPWVtYmVkZGVyUGF0aDt0aGlzLl9kb21GaWxlU3lzdGVtPWRvbUZpbGVTeXN0ZW07dGhpcy5fdHlwZT10eXBlO3RoaXMuX2V4Y2x1ZGVkRm9sZGVyc1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnd29ya3NwYWNlRXhjbHVkZWRGb2xkZXJzJyx7fSk7dGhpcy5fZXhjbHVkZWRGb2xkZXJzPW5ldyBTZXQodGhpcy5fZXhjbHVkZWRGb2xkZXJzU2V0dGluZy5nZXQoKVtwYXRoXXx8W10pO3RoaXMuX2V4Y2x1ZGVkRW1iZWRkZXJGb2xkZXJzPVtdO3RoaXMuX2luaXRpYWxGaWxlUGF0aHM9bmV3IFNldCgpO3RoaXMuX2luaXRpYWxHaXRGb2xkZXJzPW5ldyBTZXQoKTt0aGlzLl9maWxlTG9ja3M9bmV3IE1hcCgpO30Kc3RhdGljIGNyZWF0ZShtYW5hZ2VyLHBhdGgsZW1iZWRkZXJQYXRoLHR5cGUsbmFtZSxyb290VVJMKXtjb25zdCBkb21GaWxlU3lzdGVtPUluc3BlY3RvckZyb250ZW5kSG9zdC5pc29sYXRlZEZpbGVTeXN0ZW0obmFtZSxyb290VVJMKTtpZighZG9tRmlsZVN5c3RlbSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO2NvbnN0IGZpbGVTeXN0ZW09bmV3IFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbShtYW5hZ2VyLHBhdGgsZW1iZWRkZXJQYXRoLGRvbUZpbGVTeXN0ZW0sdHlwZSk7cmV0dXJuIGZpbGVTeXN0ZW0uX2luaXRpYWxpemVGaWxlUGF0aHMoKS50aGVuKCgpPT5maWxlU3lzdGVtKS5jYXRjaEV4Y2VwdGlvbigobnVsbCkpO30Kc3RhdGljIGVycm9yTWVzc2FnZShlcnJvcil7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnRmlsZSBzeXN0ZW0gZXJyb3I6ICVzJyxlcnJvci5tZXNzYWdlKTt9Cl9zZXJpYWxpemVkRmlsZU9wZXJhdGlvbihwYXRoLG9wZXJhdGlvbil7Y29uc3QgcHJvbWlzZT1Qcm9taXNlLnJlc29sdmUodGhpcy5fZmlsZUxvY2tzLmdldChwYXRoKSkudGhlbigoKT0+b3BlcmF0aW9uLmNhbGwobnVsbCkpO3RoaXMuX2ZpbGVMb2Nrcy5zZXQocGF0aCxwcm9taXNlKTtyZXR1cm4gcHJvbWlzZTt9CmdldE1ldGFkYXRhKHBhdGgpe2xldCBmdWxmaWxsO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UoZj0+ZnVsZmlsbD1mKTt0aGlzLl9kb21GaWxlU3lzdGVtLnJvb3QuZ2V0RmlsZShwYXRoLHVuZGVmaW5lZCxmaWxlRW50cnlMb2FkZWQsZXJyb3JIYW5kbGVyKTtyZXR1cm4gcHJvbWlzZTtmdW5jdGlvbiBmaWxlRW50cnlMb2FkZWQoZW50cnkpe2VudHJ5LmdldE1ldGFkYXRhKGZ1bGZpbGwsZXJyb3JIYW5kbGVyKTt9CmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcil7Y29uc3QgZXJyb3JNZXNzYWdlPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5lcnJvck1lc3NhZ2UoZXJyb3IpO2NvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKycgd2hlbiBnZXR0aW5nIGZpbGUgbWV0YWRhdGEgXCcnK3BhdGgpO2Z1bGZpbGwobnVsbCk7fX0KaW5pdGlhbEZpbGVQYXRocygpe3JldHVybiB0aGlzLl9pbml0aWFsRmlsZVBhdGhzLnZhbHVlc0FycmF5KCk7fQppbml0aWFsR2l0Rm9sZGVycygpe3JldHVybiB0aGlzLl9pbml0aWFsR2l0Rm9sZGVycy52YWx1ZXNBcnJheSgpO30KcGF0aCgpe3JldHVybiB0aGlzLl9wYXRoO30KZW1iZWRkZXJQYXRoKCl7cmV0dXJuIHRoaXMuX2VtYmVkZGVyUGF0aDt9CnR5cGUoKXtyZXR1cm4gdGhpcy5fdHlwZTt9Cl9pbml0aWFsaXplRmlsZVBhdGhzKCl7bGV0IGZ1bGZpbGw7Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZSh4PT5mdWxmaWxsPXgpO2xldCBwZW5kaW5nUmVxdWVzdHM9MTtjb25zdCBib3VuZElubmVyQ2FsbGJhY2s9aW5uZXJDYWxsYmFjay5iaW5kKHRoaXMpO3RoaXMuX3JlcXVlc3RFbnRyaWVzKCcnLGJvdW5kSW5uZXJDYWxsYmFjayk7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gaW5uZXJDYWxsYmFjayhlbnRyaWVzKXtmb3IobGV0IGk9MDtpPGVudHJpZXMubGVuZ3RoOysraSl7Y29uc3QgZW50cnk9ZW50cmllc1tpXTtpZighZW50cnkuaXNEaXJlY3Rvcnkpe2lmKHRoaXMuaXNGaWxlRXhjbHVkZWQoZW50cnkuZnVsbFBhdGgpKQpjb250aW51ZTt0aGlzLl9pbml0aWFsRmlsZVBhdGhzLmFkZChlbnRyeS5mdWxsUGF0aC5zdWJzdHIoMSkpO31lbHNle2lmKGVudHJ5LmZ1bGxQYXRoLmVuZHNXaXRoKCcvLmdpdCcpKXtjb25zdCBsYXN0U2xhc2g9ZW50cnkuZnVsbFBhdGgubGFzdEluZGV4T2YoJy8nKTtjb25zdCBwYXJlbnRGb2xkZXI9ZW50cnkuZnVsbFBhdGguc3Vic3RyaW5nKDEsbGFzdFNsYXNoKTt0aGlzLl9pbml0aWFsR2l0Rm9sZGVycy5hZGQocGFyZW50Rm9sZGVyKTt9CmlmKHRoaXMuaXNGaWxlRXhjbHVkZWQoZW50cnkuZnVsbFBhdGgrJy8nKSl7dGhpcy5fZXhjbHVkZWRFbWJlZGRlckZvbGRlcnMucHVzaChDb21tb24uUGFyc2VkVVJMLnVybFRvUGxhdGZvcm1QYXRoKHRoaXMuX3BhdGgrZW50cnkuZnVsbFBhdGgsSG9zdC5pc1dpbigpKSk7Y29udGludWU7fQorK3BlbmRpbmdSZXF1ZXN0czt0aGlzLl9yZXF1ZXN0RW50cmllcyhlbnRyeS5mdWxsUGF0aCxib3VuZElubmVyQ2FsbGJhY2spO319CmlmKCgtLXBlbmRpbmdSZXF1ZXN0cz09PTApKQpmdWxmaWxsKCk7fX0KYXN5bmMgX2NyZWF0ZUZvbGRlcnNJZk5vdEV4aXN0KGZvbGRlclBhdGgpe2xldCBkaXJFbnRyeT1hd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlPT50aGlzLl9kb21GaWxlU3lzdGVtLnJvb3QuZ2V0RGlyZWN0b3J5KGZvbGRlclBhdGgsdW5kZWZpbmVkLHJlc29sdmUsKCk9PnJlc29sdmUobnVsbCkpKTtpZihkaXJFbnRyeSkKcmV0dXJuIGRpckVudHJ5O2NvbnN0IHBhdGhzPWZvbGRlclBhdGguc3BsaXQoJy8nKTtsZXQgYWN0aXZlUGF0aD0nJztmb3IoY29uc3QgcGF0aCBvZiBwYXRocyl7YWN0aXZlUGF0aD1hY3RpdmVQYXRoKycvJytwYXRoO2RpckVudHJ5PWF3YWl0IHRoaXMuX2lubmVyQ3JlYXRlRm9sZGVySWZOZWVkZWQoYWN0aXZlUGF0aCk7aWYoIWRpckVudHJ5KQpyZXR1cm4gbnVsbDt9CnJldHVybiBkaXJFbnRyeTt9Cl9pbm5lckNyZWF0ZUZvbGRlcklmTmVlZGVkKHBhdGgpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57dGhpcy5fZG9tRmlsZVN5c3RlbS5yb290LmdldERpcmVjdG9yeShwYXRoLHtjcmVhdGU6dHJ1ZX0sZGlyRW50cnk9PnJlc29sdmUoZGlyRW50cnkpLGVycm9yPT57Y29uc3QgZXJyb3JNZXNzYWdlPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5lcnJvck1lc3NhZ2UoZXJyb3IpO2NvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKycgdHJ5aW5nIHRvIGNyZWF0ZSBkaXJlY3RvcnkgXCcnK3BhdGgrJ1wnJyk7cmVzb2x2ZShudWxsKTt9KTt9KTt9CmFzeW5jIGNyZWF0ZUZpbGUocGF0aCxuYW1lKXtjb25zdCBkaXJFbnRyeT1hd2FpdCB0aGlzLl9jcmVhdGVGb2xkZXJzSWZOb3RFeGlzdChwYXRoKTtpZighZGlyRW50cnkpCnJldHVybiBudWxsO2NvbnN0IGZpbGVFbnRyeT1hd2FpdCB0aGlzLl9zZXJpYWxpemVkRmlsZU9wZXJhdGlvbihwYXRoLGNyZWF0ZUZpbGVDYW5kaWRhdGUuYmluZCh0aGlzLG5hbWV8fCdOZXdGaWxlJykpO2lmKCFmaWxlRW50cnkpCnJldHVybiBudWxsO3JldHVybiBmaWxlRW50cnkuZnVsbFBhdGguc3Vic3RyKDEpO2Z1bmN0aW9uIGNyZWF0ZUZpbGVDYW5kaWRhdGUobmFtZSxuZXdGaWxlSW5kZXgpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57Y29uc3QgbmFtZUNhbmRpZGF0ZT1uYW1lKyhuZXdGaWxlSW5kZXh8fCcnKTtkaXJFbnRyeS5nZXRGaWxlKG5hbWVDYW5kaWRhdGUse2NyZWF0ZTp0cnVlLGV4Y2x1c2l2ZTp0cnVlfSxyZXNvbHZlLGVycm9yPT57aWYoZXJyb3IubmFtZT09PSdJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3InKXtyZXNvbHZlKGNyZWF0ZUZpbGVDYW5kaWRhdGUuY2FsbCh0aGlzLG5hbWUsKG5ld0ZpbGVJbmRleD9uZXdGaWxlSW5kZXgrMToxKSkpO3JldHVybjt9CmNvbnN0IGVycm9yTWVzc2FnZT1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uZXJyb3JNZXNzYWdlKGVycm9yKTtjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSsnIHdoZW4gdGVzdGluZyBpZiBmaWxlIGV4aXN0cyBcJycrKHRoaXMuX3BhdGgrJy8nK3BhdGgrJy8nK25hbWVDYW5kaWRhdGUpKydcJycpO3Jlc29sdmUobnVsbCk7fSk7fSk7fX0KZGVsZXRlRmlsZShwYXRoKXtsZXQgcmVzb2x2ZUNhbGxiYWNrO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UocmVzb2x2ZT0+cmVzb2x2ZUNhbGxiYWNrPXJlc29sdmUpO3RoaXMuX2RvbUZpbGVTeXN0ZW0ucm9vdC5nZXRGaWxlKHBhdGgsdW5kZWZpbmVkLGZpbGVFbnRyeUxvYWRlZC5iaW5kKHRoaXMpLGVycm9ySGFuZGxlci5iaW5kKHRoaXMpKTtyZXR1cm4gcHJvbWlzZTtmdW5jdGlvbiBmaWxlRW50cnlMb2FkZWQoZmlsZUVudHJ5KXtmaWxlRW50cnkucmVtb3ZlKGZpbGVFbnRyeVJlbW92ZWQsZXJyb3JIYW5kbGVyLmJpbmQodGhpcykpO30KZnVuY3Rpb24gZmlsZUVudHJ5UmVtb3ZlZCgpe3Jlc29sdmVDYWxsYmFjayh0cnVlKTt9CmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcil7Y29uc3QgZXJyb3JNZXNzYWdlPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5lcnJvck1lc3NhZ2UoZXJyb3IpO2NvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKycgd2hlbiBkZWxldGluZyBmaWxlIFwnJysodGhpcy5fcGF0aCsnLycrcGF0aCkrJ1wnJyk7cmVzb2x2ZUNhbGxiYWNrKGZhbHNlKTt9fQpyZXF1ZXN0RmlsZUJsb2IocGF0aCl7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pnt0aGlzLl9kb21GaWxlU3lzdGVtLnJvb3QuZ2V0RmlsZShwYXRoLHVuZGVmaW5lZCxlbnRyeT0+e2VudHJ5LmZpbGUocmVzb2x2ZSxlcnJvckhhbmRsZXIuYmluZCh0aGlzKSk7fSxlcnJvckhhbmRsZXIuYmluZCh0aGlzKSk7ZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGVycm9yKXtpZihlcnJvci5uYW1lPT09J05vdEZvdW5kRXJyb3InKXtyZXNvbHZlKG51bGwpO3JldHVybjt9CmNvbnN0IGVycm9yTWVzc2FnZT1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uZXJyb3JNZXNzYWdlKGVycm9yKTtjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSsnIHdoZW4gZ2V0dGluZyBjb250ZW50IGZvciBmaWxlIFwnJysodGhpcy5fcGF0aCsnLycrcGF0aCkrJ1wnJyk7cmVzb2x2ZShudWxsKTt9fSk7fQpyZXF1ZXN0RmlsZUNvbnRlbnQocGF0aCxjYWxsYmFjayl7Y29uc3QgaW5uZXJSZXF1ZXN0RmlsZUNvbnRlbnQ9YXN5bmMoKT0+e2NvbnN0IGJsb2I9YXdhaXQgdGhpcy5yZXF1ZXN0RmlsZUJsb2IocGF0aCk7aWYoIWJsb2Ipe2NhbGxiYWNrKG51bGwsZmFsc2UpO3JldHVybjt9CmNvbnN0IHJlYWRlcj1uZXcgRmlsZVJlYWRlcigpO2NvbnN0IGV4dGVuc2lvbj1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RFeHRlbnNpb24ocGF0aCk7Y29uc3QgZW5jb2RlZD1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uQmluYXJ5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtjb25zdCByZWFkUHJvbWlzZT1uZXcgUHJvbWlzZSh4PT5yZWFkZXIub25sb2FkZW5kPXgpO2lmKGVuY29kZWQpCnJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7ZWxzZQpyZWFkZXIucmVhZEFzVGV4dChibG9iKTthd2FpdCByZWFkUHJvbWlzZTtpZihyZWFkZXIuZXJyb3Ipe2NvbnNvbGUuZXJyb3IoJ0NhblwndCByZWFkIGZpbGU6ICcrcGF0aCsnOiAnK3JlYWRlci5lcnJvcik7Y2FsbGJhY2sobnVsbCxmYWxzZSk7cmV0dXJuO30KbGV0IHJlc3VsdDt0cnl7cmVzdWx0PXJlYWRlci5yZXN1bHQ7fWNhdGNoKGUpe3Jlc3VsdD1udWxsO2NvbnNvbGUuZXJyb3IoJ0NhblwndCByZWFkIGZpbGU6ICcrcGF0aCsnOiAnK2UpO30KaWYocmVzdWx0PT09dW5kZWZpbmVkfHxyZXN1bHQ9PT1udWxsKXtjYWxsYmFjayhudWxsLGZhbHNlKTtyZXR1cm47fQpjYWxsYmFjayhlbmNvZGVkP2J0b2EocmVzdWx0KTpyZXN1bHQsZW5jb2RlZCk7fTt0aGlzLl9zZXJpYWxpemVkRmlsZU9wZXJhdGlvbihwYXRoLGlubmVyUmVxdWVzdEZpbGVDb250ZW50KTt9CmFzeW5jIHNldEZpbGVDb250ZW50KHBhdGgsY29udGVudCxpc0Jhc2U2NCl7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5GaWxlU2F2ZWRJbldvcmtzcGFjZSk7bGV0IGNhbGxiYWNrO2NvbnN0IGlubmVyU2V0RmlsZUNvbnRlbnQ9KCk9Pntjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKHg9PmNhbGxiYWNrPXgpO3RoaXMuX2RvbUZpbGVTeXN0ZW0ucm9vdC5nZXRGaWxlKHBhdGgse2NyZWF0ZTp0cnVlfSxmaWxlRW50cnlMb2FkZWQuYmluZCh0aGlzKSxlcnJvckhhbmRsZXIuYmluZCh0aGlzKSk7cmV0dXJuIHByb21pc2U7fTt0aGlzLl9zZXJpYWxpemVkRmlsZU9wZXJhdGlvbihwYXRoLGlubmVyU2V0RmlsZUNvbnRlbnQpO2Z1bmN0aW9uIGZpbGVFbnRyeUxvYWRlZChlbnRyeSl7ZW50cnkuY3JlYXRlV3JpdGVyKGZpbGVXcml0ZXJDcmVhdGVkLmJpbmQodGhpcyksZXJyb3JIYW5kbGVyLmJpbmQodGhpcykpO30KYXN5bmMgZnVuY3Rpb24gZmlsZVdyaXRlckNyZWF0ZWQoZmlsZVdyaXRlcil7ZmlsZVdyaXRlci5vbmVycm9yPWVycm9ySGFuZGxlci5iaW5kKHRoaXMpO2ZpbGVXcml0ZXIub253cml0ZWVuZD1maWxlV3JpdHRlbjtsZXQgYmxvYjtpZihpc0Jhc2U2NCkKYmxvYj1hd2FpdChhd2FpdCBmZXRjaChgZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCR7Y29udGVudH1gKSkuYmxvYigpO2Vsc2UKYmxvYj1uZXcgQmxvYihbY29udGVudF0se3R5cGU6J3RleHQvcGxhaW4nfSk7ZmlsZVdyaXRlci53cml0ZShibG9iKTtmdW5jdGlvbiBmaWxlV3JpdHRlbigpe2ZpbGVXcml0ZXIub253cml0ZWVuZD1jYWxsYmFjaztmaWxlV3JpdGVyLnRydW5jYXRlKGJsb2Iuc2l6ZSk7fX0KZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGVycm9yKXtjb25zdCBlcnJvck1lc3NhZ2U9UGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtLmVycm9yTWVzc2FnZShlcnJvcik7Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UrJyB3aGVuIHNldHRpbmcgY29udGVudCBmb3IgZmlsZSBcJycrKHRoaXMuX3BhdGgrJy8nK3BhdGgpKydcJycpO2NhbGxiYWNrKCk7fX0KcmVuYW1lRmlsZShwYXRoLG5ld05hbWUsY2FsbGJhY2spe25ld05hbWU9bmV3TmFtZT9uZXdOYW1lLnRyaW0oKTpuZXdOYW1lO2lmKCFuZXdOYW1lfHxuZXdOYW1lLmluZGV4T2YoJy8nKSE9PS0xKXtjYWxsYmFjayhmYWxzZSk7cmV0dXJuO30KbGV0IGZpbGVFbnRyeTtsZXQgZGlyRW50cnk7dGhpcy5fZG9tRmlsZVN5c3RlbS5yb290LmdldEZpbGUocGF0aCx1bmRlZmluZWQsZmlsZUVudHJ5TG9hZGVkLmJpbmQodGhpcyksZXJyb3JIYW5kbGVyLmJpbmQodGhpcykpO2Z1bmN0aW9uIGZpbGVFbnRyeUxvYWRlZChlbnRyeSl7aWYoZW50cnkubmFtZT09PW5ld05hbWUpe2NhbGxiYWNrKGZhbHNlKTtyZXR1cm47fQpmaWxlRW50cnk9ZW50cnk7ZmlsZUVudHJ5LmdldFBhcmVudChkaXJFbnRyeUxvYWRlZC5iaW5kKHRoaXMpLGVycm9ySGFuZGxlci5iaW5kKHRoaXMpKTt9CmZ1bmN0aW9uIGRpckVudHJ5TG9hZGVkKGVudHJ5KXtkaXJFbnRyeT1lbnRyeTtkaXJFbnRyeS5nZXRGaWxlKG5ld05hbWUsbnVsbCxuZXdGaWxlRW50cnlMb2FkZWQsbmV3RmlsZUVudHJ5TG9hZEVycm9ySGFuZGxlci5iaW5kKHRoaXMpKTt9CmZ1bmN0aW9uIG5ld0ZpbGVFbnRyeUxvYWRlZChlbnRyeSl7Y2FsbGJhY2soZmFsc2UpO30KZnVuY3Rpb24gbmV3RmlsZUVudHJ5TG9hZEVycm9ySGFuZGxlcihlcnJvcil7aWYoZXJyb3IubmFtZSE9PSdOb3RGb3VuZEVycm9yJyl7Y2FsbGJhY2soZmFsc2UpO3JldHVybjt9CmZpbGVFbnRyeS5tb3ZlVG8oZGlyRW50cnksbmV3TmFtZSxmaWxlUmVuYW1lZCxlcnJvckhhbmRsZXIuYmluZCh0aGlzKSk7fQpmdW5jdGlvbiBmaWxlUmVuYW1lZChlbnRyeSl7Y2FsbGJhY2sodHJ1ZSxlbnRyeS5uYW1lKTt9CmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcil7Y29uc3QgZXJyb3JNZXNzYWdlPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5lcnJvck1lc3NhZ2UoZXJyb3IpO2NvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKycgd2hlbiByZW5hbWluZyBmaWxlIFwnJysodGhpcy5fcGF0aCsnLycrcGF0aCkrJ1wnIHRvIFwnJytuZXdOYW1lKydcJycpO2NhbGxiYWNrKGZhbHNlKTt9fQpfcmVhZERpcmVjdG9yeShkaXJFbnRyeSxjYWxsYmFjayl7Y29uc3QgZGlyUmVhZGVyPWRpckVudHJ5LmNyZWF0ZVJlYWRlcigpO2xldCBlbnRyaWVzPVtdO2Z1bmN0aW9uIGlubmVyQ2FsbGJhY2socmVzdWx0cyl7aWYoIXJlc3VsdHMubGVuZ3RoKXtjYWxsYmFjayhlbnRyaWVzLnNvcnQoKSk7fWVsc2V7ZW50cmllcz1lbnRyaWVzLmNvbmNhdCh0b0FycmF5KHJlc3VsdHMpKTtkaXJSZWFkZXIucmVhZEVudHJpZXMoaW5uZXJDYWxsYmFjayxlcnJvckhhbmRsZXIpO319CmZ1bmN0aW9uIHRvQXJyYXkobGlzdCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3R8fFtdLDApO30KZGlyUmVhZGVyLnJlYWRFbnRyaWVzKGlubmVyQ2FsbGJhY2ssZXJyb3JIYW5kbGVyKTtmdW5jdGlvbiBlcnJvckhhbmRsZXIoZXJyb3Ipe2NvbnN0IGVycm9yTWVzc2FnZT1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uZXJyb3JNZXNzYWdlKGVycm9yKTtjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSsnIHdoZW4gcmVhZGluZyBkaXJlY3RvcnkgXCcnK2RpckVudHJ5LmZ1bGxQYXRoKydcJycpO2NhbGxiYWNrKFtdKTt9fQpfcmVxdWVzdEVudHJpZXMocGF0aCxjYWxsYmFjayl7dGhpcy5fZG9tRmlsZVN5c3RlbS5yb290LmdldERpcmVjdG9yeShwYXRoLHVuZGVmaW5lZCxpbm5lckNhbGxiYWNrLmJpbmQodGhpcyksZXJyb3JIYW5kbGVyKTtmdW5jdGlvbiBpbm5lckNhbGxiYWNrKGRpckVudHJ5KXt0aGlzLl9yZWFkRGlyZWN0b3J5KGRpckVudHJ5LGNhbGxiYWNrKTt9CmZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcil7Y29uc3QgZXJyb3JNZXNzYWdlPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5lcnJvck1lc3NhZ2UoZXJyb3IpO2NvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKycgd2hlbiByZXF1ZXN0aW5nIGVudHJ5IFwnJytwYXRoKydcJycpO2NhbGxiYWNrKFtdKTt9fQpfc2F2ZUV4Y2x1ZGVkRm9sZGVycygpe2NvbnN0IHNldHRpbmdWYWx1ZT10aGlzLl9leGNsdWRlZEZvbGRlcnNTZXR0aW5nLmdldCgpO3NldHRpbmdWYWx1ZVt0aGlzLl9wYXRoXT10aGlzLl9leGNsdWRlZEZvbGRlcnMudmFsdWVzQXJyYXkoKTt0aGlzLl9leGNsdWRlZEZvbGRlcnNTZXR0aW5nLnNldChzZXR0aW5nVmFsdWUpO30KYWRkRXhjbHVkZWRGb2xkZXIocGF0aCl7dGhpcy5fZXhjbHVkZWRGb2xkZXJzLmFkZChwYXRoKTt0aGlzLl9zYXZlRXhjbHVkZWRGb2xkZXJzKCk7dGhpcy5fbWFuYWdlci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRXhjbHVkZWRGb2xkZXJBZGRlZCxwYXRoKTt9CnJlbW92ZUV4Y2x1ZGVkRm9sZGVyKHBhdGgpe3RoaXMuX2V4Y2x1ZGVkRm9sZGVycy5kZWxldGUocGF0aCk7dGhpcy5fc2F2ZUV4Y2x1ZGVkRm9sZGVycygpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuRXZlbnRzLkV4Y2x1ZGVkRm9sZGVyUmVtb3ZlZCxwYXRoKTt9CmZpbGVTeXN0ZW1SZW1vdmVkKCl7Y29uc3Qgc2V0dGluZ1ZhbHVlPXRoaXMuX2V4Y2x1ZGVkRm9sZGVyc1NldHRpbmcuZ2V0KCk7ZGVsZXRlIHNldHRpbmdWYWx1ZVt0aGlzLl9wYXRoXTt0aGlzLl9leGNsdWRlZEZvbGRlcnNTZXR0aW5nLnNldChzZXR0aW5nVmFsdWUpO30KaXNGaWxlRXhjbHVkZWQoZm9sZGVyUGF0aCl7aWYodGhpcy5fZXhjbHVkZWRGb2xkZXJzLmhhcyhmb2xkZXJQYXRoKSkKcmV0dXJuIHRydWU7Y29uc3QgcmVnZXg9dGhpcy5fbWFuYWdlci53b3Jrc3BhY2VGb2xkZXJFeGNsdWRlUGF0dGVyblNldHRpbmcoKS5hc1JlZ0V4cCgpO3JldHVybiEhKHJlZ2V4JiZyZWdleC50ZXN0KGZvbGRlclBhdGgpKTt9CmV4Y2x1ZGVkRm9sZGVycygpe3JldHVybiB0aGlzLl9leGNsdWRlZEZvbGRlcnM7fQpzZWFyY2hJblBhdGgocXVlcnkscHJvZ3Jlc3Mpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57Y29uc3QgcmVxdWVzdElkPXRoaXMuX21hbmFnZXIucmVnaXN0ZXJDYWxsYmFjayhpbm5lckNhbGxiYWNrKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2VhcmNoSW5QYXRoKHJlcXVlc3RJZCx0aGlzLl9lbWJlZGRlclBhdGgscXVlcnkpO2Z1bmN0aW9uIGlubmVyQ2FsbGJhY2soZmlsZXMpe3Jlc29sdmUoZmlsZXMubWFwKHBhdGg9PkNvbW1vbi5QYXJzZWRVUkwucGxhdGZvcm1QYXRoVG9VUkwocGF0aCkpKTtwcm9ncmVzcy53b3JrZWQoMSk7fX0pO30KaW5kZXhDb250ZW50KHByb2dyZXNzKXtwcm9ncmVzcy5zZXRUb3RhbFdvcmsoMSk7Y29uc3QgcmVxdWVzdElkPXRoaXMuX21hbmFnZXIucmVnaXN0ZXJQcm9ncmVzcyhwcm9ncmVzcyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmluZGV4UGF0aChyZXF1ZXN0SWQsdGhpcy5fZW1iZWRkZXJQYXRoLEpTT04uc3RyaW5naWZ5KHRoaXMuX2V4Y2x1ZGVkRW1iZWRkZXJGb2xkZXJzKSk7fX07UGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtLkltYWdlRXh0ZW5zaW9ucz1uZXcgU2V0KFsnanBlZycsJ2pwZycsJ3N2ZycsJ2dpZicsJ3dlYnAnLCdwbmcnLCdpY28nLCd0aWZmJywndGlmJywnYm1wJ10pO1BlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5CaW5hcnlFeHRlbnNpb25zPW5ldyBTZXQoWydjbWQnLCdjb20nLCdleGUnLCdhJywnYXInLCdpc28nLCd0YXInLCdiejInLCdneicsJ2x6JywnbHptYScsJ3onLCc3eicsJ2FwaycsJ2FyYycsJ2NhYicsJ2RtZycsJ2phcicsJ3BhaycsJ3JhcicsJ3ppcCcsJzNncCcsJ2FhYycsJ2FpZmYnLCdmbGFjJywnbTRhJywnbW1mJywnbXAzJywnb2dnJywnb2dhJywncmF3Jywnc2xuJywnd2F2Jywnd21hJywnd2VibScsJ21rdicsJ2ZsdicsJ3ZvYicsJ29ndicsJ2dpZnYnLCdhdmknLCdtb3YnLCdxdCcsJ21wNCcsJ200cCcsJ200dicsJ21wZycsJ21wZWcnLCdqcGVnJywnanBnJywnZ2lmJywnd2VicCcsJ3BuZycsJ2ljbycsJ3RpZmYnLCd0aWYnLCdibXAnXSk7O1BlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9maWxlU3lzdGVtcz1uZXcgTWFwKCk7dGhpcy5fY2FsbGJhY2tzPW5ldyBNYXAoKTt0aGlzLl9wcm9ncmVzc2VzPW5ldyBNYXAoKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5GaWxlU3lzdGVtUmVtb3ZlZCx0aGlzLl9vbkZpbGVTeXN0ZW1SZW1vdmVkLHRoaXMpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkZpbGVTeXN0ZW1BZGRlZCx0aGlzLl9vbkZpbGVTeXN0ZW1BZGRlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5GaWxlU3lzdGVtRmlsZXNDaGFuZ2VkQWRkZWRSZW1vdmVkLHRoaXMuX29uRmlsZVN5c3RlbUZpbGVzQ2hhbmdlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5JbmRleGluZ1RvdGFsV29ya0NhbGN1bGF0ZWQsdGhpcy5fb25JbmRleGluZ1RvdGFsV29ya0NhbGN1bGF0ZWQsdGhpcyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuSW5kZXhpbmdXb3JrZWQsdGhpcy5fb25JbmRleGluZ1dvcmtlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5JbmRleGluZ0RvbmUsdGhpcy5fb25JbmRleGluZ0RvbmUsdGhpcyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuU2VhcmNoQ29tcGxldGVkLHRoaXMuX29uU2VhcmNoQ29tcGxldGVkLHRoaXMpO3RoaXMuX2luaXRFeGNsdWRlUGF0dGVyU2V0dGluZygpO3RoaXMuX2ZpbGVTeXN0ZW1SZXF1ZXN0UmVzb2x2ZT1udWxsO3RoaXMuX2ZpbGVTeXN0ZW1zTG9hZGVkUHJvbWlzZT10aGlzLl9yZXF1ZXN0RmlsZVN5c3RlbXMoKTt9Cl9yZXF1ZXN0RmlsZVN5c3RlbXMoKXtsZXQgZnVsZmlsbDtjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKGY9PmZ1bGZpbGw9Zik7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRmlsZVN5c3RlbXNMb2FkZWQsb25GaWxlU3lzdGVtc0xvYWRlZCx0aGlzKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QucmVxdWVzdEZpbGVTeXN0ZW1zKCk7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gb25GaWxlU3lzdGVtc0xvYWRlZChldmVudCl7Y29uc3QgZmlsZVN5c3RlbXM9KGV2ZW50LmRhdGEpO2NvbnN0IHByb21pc2VzPVtdO2ZvcihsZXQgaT0wO2k8ZmlsZVN5c3RlbXMubGVuZ3RoOysraSkKcHJvbWlzZXMucHVzaCh0aGlzLl9pbm5lckFkZEZpbGVTeXN0ZW0oZmlsZVN5c3RlbXNbaV0sZmFsc2UpKTtQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihvbkZpbGVTeXN0ZW1zQWRkZWQpO30KZnVuY3Rpb24gb25GaWxlU3lzdGVtc0FkZGVkKGZpbGVTeXN0ZW1zKXtmdWxmaWxsKGZpbGVTeXN0ZW1zLmZpbHRlcihmcz0+ISFmcykpO319CmFkZEZpbGVTeXN0ZW0odHlwZSl7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pnt0aGlzLl9maWxlU3lzdGVtUmVxdWVzdFJlc29sdmU9cmVzb2x2ZTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuYWRkRmlsZVN5c3RlbSh0eXBlfHwnJyk7fSk7fQpyZW1vdmVGaWxlU3lzdGVtKGZpbGVTeXN0ZW0pe0luc3BlY3RvckZyb250ZW5kSG9zdC5yZW1vdmVGaWxlU3lzdGVtKGZpbGVTeXN0ZW0uZW1iZWRkZXJQYXRoKCkpO30Kd2FpdEZvckZpbGVTeXN0ZW1zKCl7cmV0dXJuIHRoaXMuX2ZpbGVTeXN0ZW1zTG9hZGVkUHJvbWlzZTt9Cl9pbm5lckFkZEZpbGVTeXN0ZW0oZmlsZVN5c3RlbSxkaXNwYXRjaEV2ZW50KXtjb25zdCBlbWJlZGRlclBhdGg9ZmlsZVN5c3RlbS5maWxlU3lzdGVtUGF0aDtjb25zdCBmaWxlU3lzdGVtVVJMPUNvbW1vbi5QYXJzZWRVUkwucGxhdGZvcm1QYXRoVG9VUkwoZmlsZVN5c3RlbS5maWxlU3lzdGVtUGF0aCk7Y29uc3QgcHJvbWlzZT1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uY3JlYXRlKHRoaXMsZmlsZVN5c3RlbVVSTCxlbWJlZGRlclBhdGgsZmlsZVN5c3RlbS50eXBlLGZpbGVTeXN0ZW0uZmlsZVN5c3RlbU5hbWUsZmlsZVN5c3RlbS5yb290VVJMKTtyZXR1cm4gcHJvbWlzZS50aGVuKHN0b3JlRmlsZVN5c3RlbS5iaW5kKHRoaXMpKTtmdW5jdGlvbiBzdG9yZUZpbGVTeXN0ZW0oZmlsZVN5c3RlbSl7aWYoIWZpbGVTeXN0ZW0pCnJldHVybiBudWxsO3RoaXMuX2ZpbGVTeXN0ZW1zLnNldChmaWxlU3lzdGVtVVJMLGZpbGVTeXN0ZW0pO2lmKGRpc3BhdGNoRXZlbnQpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuRXZlbnRzLkZpbGVTeXN0ZW1BZGRlZCxmaWxlU3lzdGVtKTtyZXR1cm4gZmlsZVN5c3RlbTt9fQphc3luYyBfb25GaWxlU3lzdGVtQWRkZWQoZXZlbnQpe2NvbnN0IGVycm9yTWVzc2FnZT0oZXZlbnQuZGF0YVsnZXJyb3JNZXNzYWdlJ10pO2xldCBmaWxlU3lzdGVtPShldmVudC5kYXRhWydmaWxlU3lzdGVtJ10pO2lmKGVycm9yTWVzc2FnZSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoQ29tbW9uLlVJU3RyaW5nKCdVbmFibGUgdG8gYWRkIGZpbGVzeXN0ZW06ICVzJyxlcnJvck1lc3NhZ2UpKTtpZighdGhpcy5fZmlsZVN5c3RlbVJlcXVlc3RSZXNvbHZlKQpyZXR1cm47dGhpcy5fZmlsZVN5c3RlbVJlcXVlc3RSZXNvbHZlLmNhbGwobnVsbCxudWxsKTt0aGlzLl9maWxlU3lzdGVtUmVxdWVzdFJlc29sdmU9bnVsbDt9ZWxzZSBpZihmaWxlU3lzdGVtKXtmaWxlU3lzdGVtPWF3YWl0IHRoaXMuX2lubmVyQWRkRmlsZVN5c3RlbShmaWxlU3lzdGVtLHRydWUpO2lmKHRoaXMuX2ZpbGVTeXN0ZW1SZXF1ZXN0UmVzb2x2ZSl7dGhpcy5fZmlsZVN5c3RlbVJlcXVlc3RSZXNvbHZlLmNhbGwobnVsbCxmaWxlU3lzdGVtKTt0aGlzLl9maWxlU3lzdGVtUmVxdWVzdFJlc29sdmU9bnVsbDt9fX0KX29uRmlsZVN5c3RlbVJlbW92ZWQoZXZlbnQpe2NvbnN0IGVtYmVkZGVyUGF0aD0oZXZlbnQuZGF0YSk7Y29uc3QgZmlsZVN5c3RlbVBhdGg9Q29tbW9uLlBhcnNlZFVSTC5wbGF0Zm9ybVBhdGhUb1VSTChlbWJlZGRlclBhdGgpO2NvbnN0IGlzb2xhdGVkRmlsZVN5c3RlbT10aGlzLl9maWxlU3lzdGVtcy5nZXQoZmlsZVN5c3RlbVBhdGgpO2lmKCFpc29sYXRlZEZpbGVTeXN0ZW0pCnJldHVybjt0aGlzLl9maWxlU3lzdGVtcy5kZWxldGUoZmlsZVN5c3RlbVBhdGgpO2lzb2xhdGVkRmlsZVN5c3RlbS5maWxlU3lzdGVtUmVtb3ZlZCgpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuRXZlbnRzLkZpbGVTeXN0ZW1SZW1vdmVkLGlzb2xhdGVkRmlsZVN5c3RlbSk7fQpfb25GaWxlU3lzdGVtRmlsZXNDaGFuZ2VkKGV2ZW50KXtjb25zdCB1cmxQYXRocz17Y2hhbmdlZDpncm91cEZpbGVQYXRoc0ludG9GaWxlU3lzdGVtUGF0aHMuY2FsbCh0aGlzLGV2ZW50LmRhdGEuY2hhbmdlZCksYWRkZWQ6Z3JvdXBGaWxlUGF0aHNJbnRvRmlsZVN5c3RlbVBhdGhzLmNhbGwodGhpcyxldmVudC5kYXRhLmFkZGVkKSxyZW1vdmVkOmdyb3VwRmlsZVBhdGhzSW50b0ZpbGVTeXN0ZW1QYXRocy5jYWxsKHRoaXMsZXZlbnQuZGF0YS5yZW1vdmVkKX07dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRmlsZVN5c3RlbUZpbGVzQ2hhbmdlZCx1cmxQYXRocyk7ZnVuY3Rpb24gZ3JvdXBGaWxlUGF0aHNJbnRvRmlsZVN5c3RlbVBhdGhzKGVtYmVkZGVyUGF0aHMpe2NvbnN0IHBhdGhzPW5ldyBNdWx0aW1hcCgpO2Zvcihjb25zdCBlbWJlZGRlclBhdGggb2YgZW1iZWRkZXJQYXRocyl7Y29uc3QgZmlsZVBhdGg9Q29tbW9uLlBhcnNlZFVSTC5wbGF0Zm9ybVBhdGhUb1VSTChlbWJlZGRlclBhdGgpO2Zvcihjb25zdCBmaWxlU3lzdGVtUGF0aCBvZiB0aGlzLl9maWxlU3lzdGVtcy5rZXlzKCkpe2lmKHRoaXMuX2ZpbGVTeXN0ZW1zLmdldChmaWxlU3lzdGVtUGF0aCkuaXNGaWxlRXhjbHVkZWQoZW1iZWRkZXJQYXRoKSkKY29udGludWU7Y29uc3QgcGF0aFByZWZpeD1maWxlU3lzdGVtUGF0aC5lbmRzV2l0aCgnLycpP2ZpbGVTeXN0ZW1QYXRoOmZpbGVTeXN0ZW1QYXRoKycvJztpZighZmlsZVBhdGguc3RhcnRzV2l0aChwYXRoUHJlZml4KSkKY29udGludWU7cGF0aHMuc2V0KGZpbGVTeXN0ZW1QYXRoLGZpbGVQYXRoKTt9fQpyZXR1cm4gcGF0aHM7fX0KZmlsZVN5c3RlbXMoKXtyZXR1cm4gdGhpcy5fZmlsZVN5c3RlbXMudmFsdWVzQXJyYXkoKTt9CmZpbGVTeXN0ZW0oZmlsZVN5c3RlbVBhdGgpe3JldHVybiB0aGlzLl9maWxlU3lzdGVtcy5nZXQoZmlsZVN5c3RlbVBhdGgpfHxudWxsO30KX2luaXRFeGNsdWRlUGF0dGVyU2V0dGluZygpe2NvbnN0IGRlZmF1bHRDb21tb25FeGNsdWRlZEZvbGRlcnM9Wycvbm9kZV9tb2R1bGVzLycsJy9ib3dlcl9jb21wb25lbnRzLycsJy9cXC5kZXZ0b29scycsJy9cXC5naXQvJywnL1xcLnNhc3MtY2FjaGUvJywnL1xcLmhnLycsJy9cXC5pZGVhLycsJy9cXC5zdm4vJywnL1xcLmNhY2hlLycsJy9cXC5wcm9qZWN0LyddO2NvbnN0IGRlZmF1bHRXaW5FeGNsdWRlZEZvbGRlcnM9WycvVGh1bWJzLmRiJCcsJy9laHRodW1icy5kYiQnLCcvRGVza3RvcC5pbmkkJywnL1xcJFJFQ1lDTEUuQklOLyddO2NvbnN0IGRlZmF1bHRNYWNFeGNsdWRlZEZvbGRlcnM9WycvXFwuRFNfU3RvcmUkJywnL1xcLlRyYXNoZXMkJywnL1xcLlNwb3RsaWdodC1WMTAwJCcsJy9cXC5BcHBsZURvdWJsZSQnLCcvXFwuTFNPdmVycmlkZSQnLCcvSWNvbiQnLCcvXFwuXy4qJCddO2NvbnN0IGRlZmF1bHRMaW51eEV4Y2x1ZGVkRm9sZGVycz1bJy8uKn4kJ107bGV0IGRlZmF1bHRFeGNsdWRlZEZvbGRlcnM9ZGVmYXVsdENvbW1vbkV4Y2x1ZGVkRm9sZGVycztpZihIb3N0LmlzV2luKCkpCmRlZmF1bHRFeGNsdWRlZEZvbGRlcnM9ZGVmYXVsdEV4Y2x1ZGVkRm9sZGVycy5jb25jYXQoZGVmYXVsdFdpbkV4Y2x1ZGVkRm9sZGVycyk7ZWxzZSBpZihIb3N0LmlzTWFjKCkpCmRlZmF1bHRFeGNsdWRlZEZvbGRlcnM9ZGVmYXVsdEV4Y2x1ZGVkRm9sZGVycy5jb25jYXQoZGVmYXVsdE1hY0V4Y2x1ZGVkRm9sZGVycyk7ZWxzZQpkZWZhdWx0RXhjbHVkZWRGb2xkZXJzPWRlZmF1bHRFeGNsdWRlZEZvbGRlcnMuY29uY2F0KGRlZmF1bHRMaW51eEV4Y2x1ZGVkRm9sZGVycyk7Y29uc3QgZGVmYXVsdEV4Y2x1ZGVkRm9sZGVyc1BhdHRlcm49ZGVmYXVsdEV4Y2x1ZGVkRm9sZGVycy5qb2luKCd8Jyk7dGhpcy5fd29ya3NwYWNlRm9sZGVyRXhjbHVkZVBhdHRlcm5TZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVSZWdFeHBTZXR0aW5nKCd3b3Jrc3BhY2VGb2xkZXJFeGNsdWRlUGF0dGVybicsZGVmYXVsdEV4Y2x1ZGVkRm9sZGVyc1BhdHRlcm4sSG9zdC5pc1dpbigpPydpJzonJyk7fQp3b3Jrc3BhY2VGb2xkZXJFeGNsdWRlUGF0dGVyblNldHRpbmcoKXtyZXR1cm4gdGhpcy5fd29ya3NwYWNlRm9sZGVyRXhjbHVkZVBhdHRlcm5TZXR0aW5nO30KcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjayl7Y29uc3QgcmVxdWVzdElkPSsrUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5fbGFzdFJlcXVlc3RJZDt0aGlzLl9jYWxsYmFja3Muc2V0KHJlcXVlc3RJZCxjYWxsYmFjayk7cmV0dXJuIHJlcXVlc3RJZDt9CnJlZ2lzdGVyUHJvZ3Jlc3MocHJvZ3Jlc3Mpe2NvbnN0IHJlcXVlc3RJZD0rK1BlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuX2xhc3RSZXF1ZXN0SWQ7dGhpcy5fcHJvZ3Jlc3Nlcy5zZXQocmVxdWVzdElkLHByb2dyZXNzKTtyZXR1cm4gcmVxdWVzdElkO30KX29uSW5kZXhpbmdUb3RhbFdvcmtDYWxjdWxhdGVkKGV2ZW50KXtjb25zdCByZXF1ZXN0SWQ9KGV2ZW50LmRhdGFbJ3JlcXVlc3RJZCddKTtjb25zdCB0b3RhbFdvcms9KGV2ZW50LmRhdGFbJ3RvdGFsV29yayddKTtjb25zdCBwcm9ncmVzcz10aGlzLl9wcm9ncmVzc2VzLmdldChyZXF1ZXN0SWQpO2lmKCFwcm9ncmVzcykKcmV0dXJuO3Byb2dyZXNzLnNldFRvdGFsV29yayh0b3RhbFdvcmspO30KX29uSW5kZXhpbmdXb3JrZWQoZXZlbnQpe2NvbnN0IHJlcXVlc3RJZD0oZXZlbnQuZGF0YVsncmVxdWVzdElkJ10pO2NvbnN0IHdvcmtlZD0oZXZlbnQuZGF0YVsnd29ya2VkJ10pO2NvbnN0IHByb2dyZXNzPXRoaXMuX3Byb2dyZXNzZXMuZ2V0KHJlcXVlc3RJZCk7aWYoIXByb2dyZXNzKQpyZXR1cm47cHJvZ3Jlc3Mud29ya2VkKHdvcmtlZCk7aWYocHJvZ3Jlc3MuaXNDYW5jZWxlZCgpKXtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc3RvcEluZGV4aW5nKHJlcXVlc3RJZCk7dGhpcy5fb25JbmRleGluZ0RvbmUoZXZlbnQpO319Cl9vbkluZGV4aW5nRG9uZShldmVudCl7Y29uc3QgcmVxdWVzdElkPShldmVudC5kYXRhWydyZXF1ZXN0SWQnXSk7Y29uc3QgcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3Nlcy5nZXQocmVxdWVzdElkKTtpZighcHJvZ3Jlc3MpCnJldHVybjtwcm9ncmVzcy5kb25lKCk7dGhpcy5fcHJvZ3Jlc3Nlcy5kZWxldGUocmVxdWVzdElkKTt9Cl9vblNlYXJjaENvbXBsZXRlZChldmVudCl7Y29uc3QgcmVxdWVzdElkPShldmVudC5kYXRhWydyZXF1ZXN0SWQnXSk7Y29uc3QgZmlsZXM9KGV2ZW50LmRhdGFbJ2ZpbGVzJ10pO2NvbnN0IGNhbGxiYWNrPXRoaXMuX2NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTtpZighY2FsbGJhY2spCnJldHVybjtjYWxsYmFjay5jYWxsKG51bGwsZmlsZXMpO3RoaXMuX2NhbGxiYWNrcy5kZWxldGUocmVxdWVzdElkKTt9fTtQZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLkZpbGVTeXN0ZW07UGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5GaWxlc0NoYW5nZWREYXRhO1BlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuRXZlbnRzPXtGaWxlU3lzdGVtQWRkZWQ6U3ltYm9sKCdGaWxlU3lzdGVtQWRkZWQnKSxGaWxlU3lzdGVtUmVtb3ZlZDpTeW1ib2woJ0ZpbGVTeXN0ZW1SZW1vdmVkJyksRmlsZVN5c3RlbUZpbGVzQ2hhbmdlZDpTeW1ib2woJ0ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWQnKSxFeGNsdWRlZEZvbGRlckFkZGVkOlN5bWJvbCgnRXhjbHVkZWRGb2xkZXJBZGRlZCcpLEV4Y2x1ZGVkRm9sZGVyUmVtb3ZlZDpTeW1ib2woJ0V4Y2x1ZGVkRm9sZGVyUmVtb3ZlZCcpfTtQZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLl9sYXN0UmVxdWVzdElkPTA7UGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlcjs7UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmc9Y2xhc3N7Y29uc3RydWN0b3IoaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlcix3b3Jrc3BhY2Upe3RoaXMuX2lzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXI9aXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlcjt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVt0aGlzLl9pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRmlsZVN5c3RlbUFkZGVkLHRoaXMuX29uRmlsZVN5c3RlbUFkZGVkLHRoaXMpLHRoaXMuX2lzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihQZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLkV2ZW50cy5GaWxlU3lzdGVtUmVtb3ZlZCx0aGlzLl9vbkZpbGVTeXN0ZW1SZW1vdmVkLHRoaXMpLHRoaXMuX2lzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihQZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLkV2ZW50cy5GaWxlU3lzdGVtRmlsZXNDaGFuZ2VkLHRoaXMuX2ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWQsdGhpcyldO3RoaXMuX2JvdW5kRmlsZVN5c3RlbXM9bmV3IE1hcCgpO3RoaXMuX2lzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIud2FpdEZvckZpbGVTeXN0ZW1zKCkudGhlbih0aGlzLl9vbkZpbGVTeXN0ZW1zTG9hZGVkLmJpbmQodGhpcykpO30Kc3RhdGljIHByb2plY3RJZChmaWxlU3lzdGVtUGF0aCl7cmV0dXJuIGZpbGVTeXN0ZW1QYXRoO30Kc3RhdGljIHJlbGF0aXZlUGF0aCh1aVNvdXJjZUNvZGUpe2NvbnN0IGJhc2VVUkw9KHVpU291cmNlQ29kZS5wcm9qZWN0KCkpLl9maWxlU3lzdGVtQmFzZVVSTDtyZXR1cm4gdWlTb3VyY2VDb2RlLnVybCgpLnN1YnN0cmluZyhiYXNlVVJMLmxlbmd0aCkuc3BsaXQoJy8nKTt9CnN0YXRpYyBmaWxlU3lzdGVtVHlwZShwcm9qZWN0KXtjb25zdCBmaWxlU3lzdGVtPShwcm9qZWN0KS5fZmlsZVN5c3RlbTtyZXR1cm4gZmlsZVN5c3RlbS50eXBlKCk7fQpzdGF0aWMgY29tcGxldGVVUkwocHJvamVjdCxyZWxhdGl2ZVBhdGgpe2NvbnN0IGZzUHJvamVjdD0ocHJvamVjdCk7cmV0dXJuIGZzUHJvamVjdC5fZmlsZVN5c3RlbUJhc2VVUkwrcmVsYXRpdmVQYXRoO30Kc3RhdGljIF9jb250ZW50VHlwZUZvckV4dGVuc2lvbihleHRlbnNpb24pe2lmKFBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9zdHlsZVNoZWV0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLlN0eWxlc2hlZXQ7aWYoUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2RvY3VtZW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50O2lmKFBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9pbWFnZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpCnJldHVybiBDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZTtpZihQZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5fc2NyaXB0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkKcmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLlNjcmlwdDtyZXR1cm4gUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2JpbmFyeUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik/Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXI6Q29tbW9uLnJlc291cmNlVHlwZXMuRG9jdW1lbnQ7fQpzdGF0aWMgZmlsZVN5c3RlbVBhdGgocHJvamVjdElkKXtyZXR1cm4gcHJvamVjdElkO30KZmlsZVN5c3RlbU1hbmFnZXIoKXtyZXR1cm4gdGhpcy5faXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlcjt9Cl9vbkZpbGVTeXN0ZW1zTG9hZGVkKGZpbGVTeXN0ZW1zKXtmb3IoY29uc3QgZmlsZVN5c3RlbSBvZiBmaWxlU3lzdGVtcykKdGhpcy5fYWRkRmlsZVN5c3RlbShmaWxlU3lzdGVtKTt9Cl9vbkZpbGVTeXN0ZW1BZGRlZChldmVudCl7Y29uc3QgZmlsZVN5c3RlbT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkRmlsZVN5c3RlbShmaWxlU3lzdGVtKTt9Cl9hZGRGaWxlU3lzdGVtKGZpbGVTeXN0ZW0pe2NvbnN0IGJvdW5kRmlsZVN5c3RlbT1uZXcgUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuRmlsZVN5c3RlbSh0aGlzLGZpbGVTeXN0ZW0sdGhpcy5fd29ya3NwYWNlKTt0aGlzLl9ib3VuZEZpbGVTeXN0ZW1zLnNldChmaWxlU3lzdGVtLnBhdGgoKSxib3VuZEZpbGVTeXN0ZW0pO30KX29uRmlsZVN5c3RlbVJlbW92ZWQoZXZlbnQpe2NvbnN0IGZpbGVTeXN0ZW09KGV2ZW50LmRhdGEpO2NvbnN0IGJvdW5kRmlsZVN5c3RlbT10aGlzLl9ib3VuZEZpbGVTeXN0ZW1zLmdldChmaWxlU3lzdGVtLnBhdGgoKSk7Ym91bmRGaWxlU3lzdGVtLmRpc3Bvc2UoKTt0aGlzLl9ib3VuZEZpbGVTeXN0ZW1zLnJlbW92ZShmaWxlU3lzdGVtLnBhdGgoKSk7fQpfZmlsZVN5c3RlbUZpbGVzQ2hhbmdlZChldmVudCl7Y29uc3QgcGF0aHM9KGV2ZW50LmRhdGEpO2Zvcihjb25zdCBmaWxlU3lzdGVtUGF0aCBvZiBwYXRocy5jaGFuZ2VkLmtleXNBcnJheSgpKXtjb25zdCBmaWxlU3lzdGVtPXRoaXMuX2JvdW5kRmlsZVN5c3RlbXMuZ2V0KGZpbGVTeXN0ZW1QYXRoKTtpZighZmlsZVN5c3RlbSkKY29udGludWU7cGF0aHMuY2hhbmdlZC5nZXQoZmlsZVN5c3RlbVBhdGgpLmZvckVhY2gocGF0aD0+ZmlsZVN5c3RlbS5fZmlsZUNoYW5nZWQocGF0aCkpO30KZm9yKGNvbnN0IGZpbGVTeXN0ZW1QYXRoIG9mIHBhdGhzLmFkZGVkLmtleXNBcnJheSgpKXtjb25zdCBmaWxlU3lzdGVtPXRoaXMuX2JvdW5kRmlsZVN5c3RlbXMuZ2V0KGZpbGVTeXN0ZW1QYXRoKTtpZighZmlsZVN5c3RlbSkKY29udGludWU7cGF0aHMuYWRkZWQuZ2V0KGZpbGVTeXN0ZW1QYXRoKS5mb3JFYWNoKHBhdGg9PmZpbGVTeXN0ZW0uX2ZpbGVDaGFuZ2VkKHBhdGgpKTt9CmZvcihjb25zdCBmaWxlU3lzdGVtUGF0aCBvZiBwYXRocy5yZW1vdmVkLmtleXNBcnJheSgpKXtjb25zdCBmaWxlU3lzdGVtPXRoaXMuX2JvdW5kRmlsZVN5c3RlbXMuZ2V0KGZpbGVTeXN0ZW1QYXRoKTtpZighZmlsZVN5c3RlbSkKY29udGludWU7cGF0aHMucmVtb3ZlZC5nZXQoZmlsZVN5c3RlbVBhdGgpLmZvckVhY2gocGF0aD0+ZmlsZVN5c3RlbS5yZW1vdmVVSVNvdXJjZUNvZGUocGF0aCkpO319CmRpc3Bvc2UoKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO2Zvcihjb25zdCBmaWxlU3lzdGVtIG9mIHRoaXMuX2JvdW5kRmlsZVN5c3RlbXMudmFsdWVzKCkpe2ZpbGVTeXN0ZW0uZGlzcG9zZSgpO3RoaXMuX2JvdW5kRmlsZVN5c3RlbXMucmVtb3ZlKGZpbGVTeXN0ZW0uX2ZpbGVTeXN0ZW0ucGF0aCgpKTt9fX07UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX3N0eWxlU2hlZXRFeHRlbnNpb25zPW5ldyBTZXQoWydjc3MnLCdzY3NzJywnc2FzcycsJ2xlc3MnXSk7UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2RvY3VtZW50RXh0ZW5zaW9ucz1uZXcgU2V0KFsnaHRtJywnaHRtbCcsJ2FzcCcsJ2FzcHgnLCdwaHRtbCcsJ2pzcCddKTtQZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5fc2NyaXB0RXh0ZW5zaW9ucz1uZXcgU2V0KFsnYXNwJywnYXNweCcsJ2MnLCdjYycsJ2NsanMnLCdjb2ZmZWUnLCdjcHAnLCdjcycsJ2RhcnQnLCdqYXZhJywnanMnLCdqc3AnLCdqc3gnLCdoJywnbScsJ21qcycsJ21tJywncHknLCdzaCcsJ3RzJywndHN4JywnbHMnXSk7UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2ltYWdlRXh0ZW5zaW9ucz1QZXJzaXN0ZW5jZS5Jc29sYXRlZEZpbGVTeXN0ZW0uSW1hZ2VFeHRlbnNpb25zO1BlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9iaW5hcnlFeHRlbnNpb25zPVBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbS5CaW5hcnlFeHRlbnNpb25zO1BlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLkZpbGVTeXN0ZW09Y2xhc3MgZXh0ZW5kcyBXb3Jrc3BhY2UuUHJvamVjdFN0b3Jle2NvbnN0cnVjdG9yKGZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLGlzb2xhdGVkRmlsZVN5c3RlbSx3b3Jrc3BhY2Upe2NvbnN0IGZpbGVTeXN0ZW1QYXRoPWlzb2xhdGVkRmlsZVN5c3RlbS5wYXRoKCk7Y29uc3QgaWQ9UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcucHJvamVjdElkKGZpbGVTeXN0ZW1QYXRoKTtjb25zb2xlLmFzc2VydCghd29ya3NwYWNlLnByb2plY3QoaWQpKTtjb25zdCBkaXNwbGF5TmFtZT1maWxlU3lzdGVtUGF0aC5zdWJzdHIoZmlsZVN5c3RlbVBhdGgubGFzdEluZGV4T2YoJy8nKSsxKTtzdXBlcih3b3Jrc3BhY2UsaWQsV29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtLGRpc3BsYXlOYW1lKTt0aGlzLl9maWxlU3lzdGVtPWlzb2xhdGVkRmlsZVN5c3RlbTt0aGlzLl9maWxlU3lzdGVtQmFzZVVSTD10aGlzLl9maWxlU3lzdGVtLnBhdGgoKSsnLyc7dGhpcy5fZmlsZVN5c3RlbVBhcmVudFVSTD10aGlzLl9maWxlU3lzdGVtQmFzZVVSTC5zdWJzdHIoMCxmaWxlU3lzdGVtUGF0aC5sYXN0SW5kZXhPZignLycpKzEpO3RoaXMuX2ZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nPWZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nO3RoaXMuX2ZpbGVTeXN0ZW1QYXRoPWZpbGVTeXN0ZW1QYXRoO3RoaXMuX2NyZWF0aW5nRmlsZXNHdWFyZD1uZXcgU2V0KCk7d29ya3NwYWNlLmFkZFByb2plY3QodGhpcyk7dGhpcy5wb3B1bGF0ZSgpO30KZmlsZVN5c3RlbVBhdGgoKXtyZXR1cm4gdGhpcy5fZmlsZVN5c3RlbVBhdGg7fQptaW1lVHlwZSh1aVNvdXJjZUNvZGUpe3JldHVybiBDb21tb24uUmVzb3VyY2VUeXBlLm1pbWVGcm9tVVJMKHVpU291cmNlQ29kZS51cmwoKSl8fCd0ZXh0L3BsYWluJzt9CmluaXRpYWxHaXRGb2xkZXJzKCl7cmV0dXJuIHRoaXMuX2ZpbGVTeXN0ZW0uaW5pdGlhbEdpdEZvbGRlcnMoKS5tYXAoZm9sZGVyPT50aGlzLl9maWxlU3lzdGVtUGF0aCsnLycrZm9sZGVyKTt9Cl9maWxlUGF0aEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe3JldHVybiB1aVNvdXJjZUNvZGUudXJsKCkuc3Vic3RyaW5nKHRoaXMuX2ZpbGVTeXN0ZW1QYXRoLmxlbmd0aCk7fQppc1NlcnZpY2VQcm9qZWN0KCl7cmV0dXJuIGZhbHNlO30KcmVxdWVzdE1ldGFkYXRhKHVpU291cmNlQ29kZSl7aWYodWlTb3VyY2VDb2RlW1BlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9tZXRhZGF0YV0pCnJldHVybiB1aVNvdXJjZUNvZGVbUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX21ldGFkYXRhXTtjb25zdCByZWxhdGl2ZVBhdGg9dGhpcy5fZmlsZVBhdGhGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtjb25zdCBwcm9taXNlPXRoaXMuX2ZpbGVTeXN0ZW0uZ2V0TWV0YWRhdGEocmVsYXRpdmVQYXRoKS50aGVuKG9uTWV0YWRhdGEpO3VpU291cmNlQ29kZVtQZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5fbWV0YWRhdGFdPXByb21pc2U7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gb25NZXRhZGF0YShtZXRhZGF0YSl7aWYoIW1ldGFkYXRhKQpyZXR1cm4gbnVsbDtyZXR1cm4gbmV3IFdvcmtzcGFjZS5VSVNvdXJjZUNvZGVNZXRhZGF0YShtZXRhZGF0YS5tb2RpZmljYXRpb25UaW1lLG1ldGFkYXRhLnNpemUpO319CnJlcXVlc3RGaWxlQmxvYih1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLl9maWxlU3lzdGVtLnJlcXVlc3RGaWxlQmxvYih0aGlzLl9maWxlUGF0aEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpKTt9CnJlcXVlc3RGaWxlQ29udGVudCh1aVNvdXJjZUNvZGUsY2FsbGJhY2spe2NvbnN0IGZpbGVQYXRoPXRoaXMuX2ZpbGVQYXRoRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7dGhpcy5fZmlsZVN5c3RlbS5yZXF1ZXN0RmlsZUNvbnRlbnQoZmlsZVBhdGgsY2FsbGJhY2spO30KY2FuU2V0RmlsZUNvbnRlbnQoKXtyZXR1cm4gdHJ1ZTt9CmFzeW5jIHNldEZpbGVDb250ZW50KHVpU291cmNlQ29kZSxuZXdDb250ZW50LGlzQmFzZTY0KXtjb25zdCBmaWxlUGF0aD10aGlzLl9maWxlUGF0aEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO2F3YWl0IHRoaXMuX2ZpbGVTeXN0ZW0uc2V0RmlsZUNvbnRlbnQoZmlsZVBhdGgsbmV3Q29udGVudCxpc0Jhc2U2NCk7fQpmdWxsRGlzcGxheU5hbWUodWlTb3VyY2VDb2RlKXtjb25zdCBiYXNlVVJMPSh1aVNvdXJjZUNvZGUucHJvamVjdCgpKS5fZmlsZVN5c3RlbVBhcmVudFVSTDtyZXR1cm4gdWlTb3VyY2VDb2RlLnVybCgpLnN1YnN0cmluZyhiYXNlVVJMLmxlbmd0aCk7fQpjYW5SZW5hbWUoKXtyZXR1cm4gdHJ1ZTt9CnJlbmFtZSh1aVNvdXJjZUNvZGUsbmV3TmFtZSxjYWxsYmFjayl7aWYobmV3TmFtZT09PXVpU291cmNlQ29kZS5uYW1lKCkpe2NhbGxiYWNrKHRydWUsdWlTb3VyY2VDb2RlLm5hbWUoKSx1aVNvdXJjZUNvZGUudXJsKCksdWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCkpO3JldHVybjt9CmxldCBmaWxlUGF0aD10aGlzLl9maWxlUGF0aEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO3RoaXMuX2ZpbGVTeXN0ZW0ucmVuYW1lRmlsZShmaWxlUGF0aCxuZXdOYW1lLGlubmVyQ2FsbGJhY2suYmluZCh0aGlzKSk7ZnVuY3Rpb24gaW5uZXJDYWxsYmFjayhzdWNjZXNzLG5ld05hbWUpe2lmKCFzdWNjZXNzfHwhbmV3TmFtZSl7Y2FsbGJhY2soZmFsc2UsbmV3TmFtZSk7cmV0dXJuO30KY29uc29sZS5hc3NlcnQobmV3TmFtZSk7Y29uc3Qgc2xhc2g9ZmlsZVBhdGgubGFzdEluZGV4T2YoJy8nKTtjb25zdCBwYXJlbnRQYXRoPWZpbGVQYXRoLnN1YnN0cmluZygwLHNsYXNoKTtmaWxlUGF0aD1wYXJlbnRQYXRoKycvJytuZXdOYW1lO2ZpbGVQYXRoPWZpbGVQYXRoLnN1YnN0cigxKTtjb25zdCBleHRlbnNpb249dGhpcy5fZXh0ZW5zaW9uRm9yUGF0aChuZXdOYW1lKTtjb25zdCBuZXdVUkw9dGhpcy5fZmlsZVN5c3RlbUJhc2VVUkwrZmlsZVBhdGg7Y29uc3QgbmV3Q29udGVudFR5cGU9UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2NvbnRlbnRUeXBlRm9yRXh0ZW5zaW9uKGV4dGVuc2lvbik7dGhpcy5yZW5hbWVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLG5ld05hbWUpO2NhbGxiYWNrKHRydWUsbmV3TmFtZSxuZXdVUkwsbmV3Q29udGVudFR5cGUpO319CnNlYXJjaEluRmlsZUNvbnRlbnQodWlTb3VyY2VDb2RlLHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCl7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pntjb25zdCBmaWxlUGF0aD10aGlzLl9maWxlUGF0aEZvclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO3RoaXMuX2ZpbGVTeXN0ZW0ucmVxdWVzdEZpbGVDb250ZW50KGZpbGVQYXRoLGNvbnRlbnRDYWxsYmFjayk7ZnVuY3Rpb24gY29udGVudENhbGxiYWNrKGNvbnRlbnQpe3Jlc29sdmUoY29udGVudD9Db21tb24uQ29udGVudFByb3ZpZGVyLnBlcmZvcm1TZWFyY2hJbkNvbnRlbnQoY29udGVudCxxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpOltdKTt9fSk7fQphc3luYyBmaW5kRmlsZXNNYXRjaGluZ1NlYXJjaFJlcXVlc3Qoc2VhcmNoQ29uZmlnLGZpbGVzTWF0aGluZ0ZpbGVRdWVyeSxwcm9ncmVzcyl7bGV0IHJlc3VsdD1maWxlc01hdGhpbmdGaWxlUXVlcnk7Y29uc3QgcXVlcmllc1RvUnVuPXNlYXJjaENvbmZpZy5xdWVyaWVzKCkuc2xpY2UoKTtpZighcXVlcmllc1RvUnVuLmxlbmd0aCkKcXVlcmllc1RvUnVuLnB1c2goJycpO3Byb2dyZXNzLnNldFRvdGFsV29yayhxdWVyaWVzVG9SdW4ubGVuZ3RoKTtmb3IoY29uc3QgcXVlcnkgb2YgcXVlcmllc1RvUnVuKXtjb25zdCBmaWxlcz1hd2FpdCB0aGlzLl9maWxlU3lzdGVtLnNlYXJjaEluUGF0aChzZWFyY2hDb25maWcuaXNSZWdleCgpPycnOnF1ZXJ5LHByb2dyZXNzKTtyZXN1bHQ9cmVzdWx0LmludGVyc2VjdE9yZGVyZWQoZmlsZXMuc29ydCgpLFN0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yKTtwcm9ncmVzcy53b3JrZWQoMSk7fQpwcm9ncmVzcy5kb25lKCk7cmV0dXJuIHJlc3VsdDt9CmluZGV4Q29udGVudChwcm9ncmVzcyl7dGhpcy5fZmlsZVN5c3RlbS5pbmRleENvbnRlbnQocHJvZ3Jlc3MpO30KX2V4dGVuc2lvbkZvclBhdGgocGF0aCl7cmV0dXJuIENvbW1vbi5QYXJzZWRVUkwuZXh0cmFjdEV4dGVuc2lvbihwYXRoKTt9CnBvcHVsYXRlKCl7Y29uc3QgY2h1bmtTaXplPTEwMDA7Y29uc3QgZmlsZVBhdGhzPXRoaXMuX2ZpbGVTeXN0ZW0uaW5pdGlhbEZpbGVQYXRocygpO3JlcG9ydEZpbGVDaHVuay5jYWxsKHRoaXMsMCk7ZnVuY3Rpb24gcmVwb3J0RmlsZUNodW5rKGZyb20pe2NvbnN0IHRvPU1hdGgubWluKGZyb20rY2h1bmtTaXplLGZpbGVQYXRocy5sZW5ndGgpO2ZvcihsZXQgaT1mcm9tO2k8dG87KytpKQp0aGlzLl9hZGRGaWxlKGZpbGVQYXRoc1tpXSk7aWYodG88ZmlsZVBhdGhzLmxlbmd0aCkKc2V0VGltZW91dChyZXBvcnRGaWxlQ2h1bmsuYmluZCh0aGlzLHRvKSwxMDApO319CmV4Y2x1ZGVGb2xkZXIodXJsKXtsZXQgcmVsYXRpdmVGb2xkZXI9dXJsLnN1YnN0cmluZyh0aGlzLl9maWxlU3lzdGVtQmFzZVVSTC5sZW5ndGgpO2lmKCFyZWxhdGl2ZUZvbGRlci5zdGFydHNXaXRoKCcvJykpCnJlbGF0aXZlRm9sZGVyPScvJytyZWxhdGl2ZUZvbGRlcjtpZighcmVsYXRpdmVGb2xkZXIuZW5kc1dpdGgoJy8nKSkKcmVsYXRpdmVGb2xkZXIrPScvJzt0aGlzLl9maWxlU3lzdGVtLmFkZEV4Y2x1ZGVkRm9sZGVyKHJlbGF0aXZlRm9sZGVyKTtjb25zdCB1aVNvdXJjZUNvZGVzPXRoaXMudWlTb3VyY2VDb2RlcygpLnNsaWNlKCk7Zm9yKGxldCBpPTA7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpe2NvbnN0IHVpU291cmNlQ29kZT11aVNvdXJjZUNvZGVzW2ldO2lmKHVpU291cmNlQ29kZS51cmwoKS5zdGFydHNXaXRoKHVybCkpCnRoaXMucmVtb3ZlVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZS51cmwoKSk7fX0KY2FuRXhjbHVkZUZvbGRlcihwYXRoKXtyZXR1cm4hIXBhdGgmJlBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLmZpbGVTeXN0ZW1UeXBlKHRoaXMpIT09J292ZXJyaWRlcyc7fQpjYW5DcmVhdGVGaWxlKCl7cmV0dXJuIHRydWU7fQphc3luYyBjcmVhdGVGaWxlKHBhdGgsbmFtZSxjb250ZW50LGlzQmFzZTY0KXtjb25zdCBndWFyZEZpbGVOYW1lPXRoaXMuX2ZpbGVTeXN0ZW1QYXRoK3BhdGgrKCFwYXRoLmVuZHNXaXRoKCcvJyk/Jy8nOicnKStuYW1lO3RoaXMuX2NyZWF0aW5nRmlsZXNHdWFyZC5hZGQoZ3VhcmRGaWxlTmFtZSk7Y29uc3QgZmlsZVBhdGg9YXdhaXQgdGhpcy5fZmlsZVN5c3RlbS5jcmVhdGVGaWxlKHBhdGgsbmFtZSk7aWYoIWZpbGVQYXRoKQpyZXR1cm4gbnVsbDtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fYWRkRmlsZShmaWxlUGF0aCk7dWlTb3VyY2VDb2RlLnNldENvbnRlbnQoY29udGVudCwhIWlzQmFzZTY0KTt0aGlzLl9jcmVhdGluZ0ZpbGVzR3VhcmQuZGVsZXRlKGd1YXJkRmlsZU5hbWUpO3JldHVybiB1aVNvdXJjZUNvZGU7fQpkZWxldGVGaWxlKHVpU291cmNlQ29kZSl7Y29uc3QgcmVsYXRpdmVQYXRoPXRoaXMuX2ZpbGVQYXRoRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7dGhpcy5fZmlsZVN5c3RlbS5kZWxldGVGaWxlKHJlbGF0aXZlUGF0aCkudGhlbihzdWNjZXNzPT57aWYoc3VjY2VzcykKdGhpcy5yZW1vdmVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLnVybCgpKTt9KTt9CnJlbW92ZSgpe3RoaXMuX2ZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLnJlbW92ZUZpbGVTeXN0ZW0odGhpcy5fZmlsZVN5c3RlbSk7fQpfYWRkRmlsZShmaWxlUGF0aCl7Y29uc3QgZXh0ZW5zaW9uPXRoaXMuX2V4dGVuc2lvbkZvclBhdGgoZmlsZVBhdGgpO2NvbnN0IGNvbnRlbnRUeXBlPVBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLl9jb250ZW50VHlwZUZvckV4dGVuc2lvbihleHRlbnNpb24pO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLmNyZWF0ZVVJU291cmNlQ29kZSh0aGlzLl9maWxlU3lzdGVtQmFzZVVSTCtmaWxlUGF0aCxjb250ZW50VHlwZSk7dGhpcy5hZGRVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtyZXR1cm4gdWlTb3VyY2VDb2RlO30KX2ZpbGVDaGFuZ2VkKHBhdGgpe2lmKHRoaXMuX2NyZWF0aW5nRmlsZXNHdWFyZC5oYXMocGF0aCkpCnJldHVybjtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy51aVNvdXJjZUNvZGVGb3JVUkwocGF0aCk7aWYoIXVpU291cmNlQ29kZSl7Y29uc3QgY29udGVudFR5cGU9UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX2NvbnRlbnRUeXBlRm9yRXh0ZW5zaW9uKHRoaXMuX2V4dGVuc2lvbkZvclBhdGgocGF0aCkpO3RoaXMuYWRkVUlTb3VyY2VDb2RlKHRoaXMuY3JlYXRlVUlTb3VyY2VDb2RlKHBhdGgsY29udGVudFR5cGUpKTtyZXR1cm47fQp1aVNvdXJjZUNvZGVbUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX21ldGFkYXRhXT1udWxsO3VpU291cmNlQ29kZS5jaGVja0NvbnRlbnRVcGRhdGVkKCk7fQpkaXNwb3NlKCl7dGhpcy5yZW1vdmVQcm9qZWN0KCk7fX07UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuX21ldGFkYXRhPVN5bWJvbCgnRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuTWV0YWRhdGEnKTs7UGVyc2lzdGVuY2UuQXV0b21hcHBpbmc9Y2xhc3N7Y29uc3RydWN0b3Iod29ya3NwYWNlLG9uU3RhdHVzQWRkZWQsb25TdGF0dXNSZW1vdmVkKXt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX29uU3RhdHVzQWRkZWQ9b25TdGF0dXNBZGRlZDt0aGlzLl9vblN0YXR1c1JlbW92ZWQ9b25TdGF0dXNSZW1vdmVkO3RoaXMuX3N0YXR1c2VzPW5ldyBTZXQoKTt0aGlzLl9maWxlU3lzdGVtVUlTb3VyY2VDb2Rlcz1uZXcgTWFwKCk7dGhpcy5fc3dlZXBUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMTAwKTtjb25zdCBwYXRoRW5jb2Rlcj1uZXcgUGVyc2lzdGVuY2UuUGF0aEVuY29kZXIoKTt0aGlzLl9maWxlc0luZGV4PW5ldyBQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5GaWxlUGF0aEluZGV4KHBhdGhFbmNvZGVyKTt0aGlzLl9wcm9qZWN0Rm9sZGVyc0luZGV4PW5ldyBQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5Gb2xkZXJJbmRleChwYXRoRW5jb2Rlcik7dGhpcy5fYWN0aXZlRm9sZGVyc0luZGV4PW5ldyBQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5Gb2xkZXJJbmRleChwYXRoRW5jb2Rlcik7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLGV2ZW50PT50aGlzLl9vblVJU291cmNlQ29kZUFkZGVkKChldmVudC5kYXRhKSkpLHRoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZVJlbW92ZWQsZXZlbnQ9PnRoaXMuX29uVUlTb3VyY2VDb2RlUmVtb3ZlZCgoZXZlbnQuZGF0YSkpKSx0aGlzLl93b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVSZW5hbWVkLHRoaXMuX29uVUlTb3VyY2VDb2RlUmVuYW1lZCx0aGlzKSx0aGlzLl93b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0QWRkZWQsZXZlbnQ9PnRoaXMuX29uUHJvamVjdEFkZGVkKChldmVudC5kYXRhKSksdGhpcyksdGhpcy5fd29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdFJlbW92ZWQsZXZlbnQ9PnRoaXMuX29uUHJvamVjdFJlbW92ZWQoKGV2ZW50LmRhdGEpKSx0aGlzKSxdO2Zvcihjb25zdCBmaWxlU3lzdGVtIG9mIHdvcmtzcGFjZS5wcm9qZWN0cygpKQp0aGlzLl9vblByb2plY3RBZGRlZChmaWxlU3lzdGVtKTtmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIHdvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkpCnRoaXMuX29uVUlTb3VyY2VDb2RlQWRkZWQodWlTb3VyY2VDb2RlKTt9Cl9zY2hlZHVsZVJlbWFwKCl7Zm9yKGNvbnN0IHN0YXR1cyBvZiB0aGlzLl9zdGF0dXNlcy52YWx1ZXNBcnJheSgpKQp0aGlzLl9jbGVhck5ldHdvcmtTdGF0dXMoc3RhdHVzLm5ldHdvcmspO3RoaXMuX3NjaGVkdWxlU3dlZXAoKTt9Cl9zY2hlZHVsZVN3ZWVwKCl7dGhpcy5fc3dlZXBUaHJvdHRsZXIuc2NoZWR1bGUoc3dlZXBVbm1hcHBlZC5iaW5kKHRoaXMpKTtmdW5jdGlvbiBzd2VlcFVubWFwcGVkKCl7Y29uc3QgbmV0d29ya1Byb2plY3RzPXRoaXMuX3dvcmtzcGFjZS5wcm9qZWN0c0ZvclR5cGUoV29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrKTtmb3IoY29uc3QgbmV0d29ya1Byb2plY3Qgb2YgbmV0d29ya1Byb2plY3RzKXtmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIG5ldHdvcmtQcm9qZWN0LnVpU291cmNlQ29kZXMoKSkKdGhpcy5fY29tcHV0ZU5ldHdvcmtTdGF0dXModWlTb3VyY2VDb2RlKTt9CnRoaXMuX29uU3dlZXBIYXBwZW5lZEZvclRlc3QoKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fX0KX29uU3dlZXBIYXBwZW5lZEZvclRlc3QoKXt9Cl9vblByb2plY3RSZW1vdmVkKHByb2plY3Qpe2Zvcihjb25zdCB1aVNvdXJjZUNvZGUgb2YgcHJvamVjdC51aVNvdXJjZUNvZGVzKCkpCnRoaXMuX29uVUlTb3VyY2VDb2RlUmVtb3ZlZCh1aVNvdXJjZUNvZGUpO2lmKHByb2plY3QudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpyZXR1cm47Y29uc3QgZmlsZVN5c3RlbT0ocHJvamVjdCk7Zm9yKGNvbnN0IGdpdEZvbGRlciBvZiBmaWxlU3lzdGVtLmluaXRpYWxHaXRGb2xkZXJzKCkpCnRoaXMuX3Byb2plY3RGb2xkZXJzSW5kZXgucmVtb3ZlRm9sZGVyKGdpdEZvbGRlcik7dGhpcy5fcHJvamVjdEZvbGRlcnNJbmRleC5yZW1vdmVGb2xkZXIoZmlsZVN5c3RlbS5maWxlU3lzdGVtUGF0aCgpKTt0aGlzLl9zY2hlZHVsZVJlbWFwKCk7fQpfb25Qcm9qZWN0QWRkZWQocHJvamVjdCl7aWYocHJvamVjdC50eXBlKCkhPT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pCnJldHVybjtjb25zdCBmaWxlU3lzdGVtPShwcm9qZWN0KTtmb3IoY29uc3QgZ2l0Rm9sZGVyIG9mIGZpbGVTeXN0ZW0uaW5pdGlhbEdpdEZvbGRlcnMoKSkKdGhpcy5fcHJvamVjdEZvbGRlcnNJbmRleC5hZGRGb2xkZXIoZ2l0Rm9sZGVyKTt0aGlzLl9wcm9qZWN0Rm9sZGVyc0luZGV4LmFkZEZvbGRlcihmaWxlU3lzdGVtLmZpbGVTeXN0ZW1QYXRoKCkpO3Byb2plY3QudWlTb3VyY2VDb2RlcygpLmZvckVhY2godGhpcy5fb25VSVNvdXJjZUNvZGVBZGRlZC5iaW5kKHRoaXMpKTt0aGlzLl9zY2hlZHVsZVJlbWFwKCk7fQpfb25VSVNvdXJjZUNvZGVBZGRlZCh1aVNvdXJjZUNvZGUpe2NvbnN0IHByb2plY3Q9dWlTb3VyY2VDb2RlLnByb2plY3QoKTtpZihwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSl7aWYoUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuZmlsZVN5c3RlbVR5cGUocHJvamVjdCkpCnJldHVybjt0aGlzLl9maWxlc0luZGV4LmFkZFBhdGgodWlTb3VyY2VDb2RlLnVybCgpKTt0aGlzLl9maWxlU3lzdGVtVUlTb3VyY2VDb2Rlcy5zZXQodWlTb3VyY2VDb2RlLnVybCgpLHVpU291cmNlQ29kZSk7dGhpcy5fc2NoZWR1bGVTd2VlcCgpO31lbHNlIGlmKHByb2plY3QudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrKXt0aGlzLl9jb21wdXRlTmV0d29ya1N0YXR1cyh1aVNvdXJjZUNvZGUpO319Cl9vblVJU291cmNlQ29kZVJlbW92ZWQodWlTb3VyY2VDb2RlKXtpZih1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSl7dGhpcy5fZmlsZXNJbmRleC5yZW1vdmVQYXRoKHVpU291cmNlQ29kZS51cmwoKSk7dGhpcy5fZmlsZVN5c3RlbVVJU291cmNlQ29kZXMuZGVsZXRlKHVpU291cmNlQ29kZS51cmwoKSk7Y29uc3Qgc3RhdHVzPXVpU291cmNlQ29kZVtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fc3RhdHVzXTtpZihzdGF0dXMpCnRoaXMuX2NsZWFyTmV0d29ya1N0YXR1cyhzdGF0dXMubmV0d29yayk7fWVsc2UgaWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLk5ldHdvcmspe3RoaXMuX2NsZWFyTmV0d29ya1N0YXR1cyh1aVNvdXJjZUNvZGUpO319Cl9vblVJU291cmNlQ29kZVJlbmFtZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO2NvbnN0IG9sZFVSTD0oZXZlbnQuZGF0YS5vbGRVUkwpO2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpyZXR1cm47dGhpcy5fZmlsZXNJbmRleC5yZW1vdmVQYXRoKG9sZFVSTCk7dGhpcy5fZmlsZVN5c3RlbVVJU291cmNlQ29kZXMuZGVsZXRlKG9sZFVSTCk7Y29uc3Qgc3RhdHVzPXVpU291cmNlQ29kZVtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fc3RhdHVzXTtpZihzdGF0dXMpCnRoaXMuX2NsZWFyTmV0d29ya1N0YXR1cyhzdGF0dXMubmV0d29yayk7dGhpcy5fZmlsZXNJbmRleC5hZGRQYXRoKHVpU291cmNlQ29kZS51cmwoKSk7dGhpcy5fZmlsZVN5c3RlbVVJU291cmNlQ29kZXMuc2V0KHVpU291cmNlQ29kZS51cmwoKSx1aVNvdXJjZUNvZGUpO3RoaXMuX3NjaGVkdWxlU3dlZXAoKTt9Cl9jb21wdXRlTmV0d29ya1N0YXR1cyhuZXR3b3JrU291cmNlQ29kZSl7aWYobmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXXx8bmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3N0YXR1c10pCnJldHVybjtjb25zdCBjcmVhdGVCaW5kaW5nUHJvbWlzZT10aGlzLl9jcmVhdGVCaW5kaW5nKG5ldHdvcmtTb3VyY2VDb2RlKS50aGVuKHZhbGlkYXRlU3RhdHVzLmJpbmQodGhpcykpLnRoZW4ob25TdGF0dXMuYmluZCh0aGlzKSk7bmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXT1jcmVhdGVCaW5kaW5nUHJvbWlzZTthc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpe2lmKCFzdGF0dXMpCnJldHVybiBudWxsO2lmKHN0YXR1cy5uZXR3b3JrLmNvbnRlbnRUeXBlKCkuaXNGcm9tU291cmNlTWFwKCl8fCFzdGF0dXMuZmlsZVN5c3RlbS5jb250ZW50VHlwZSgpLmlzVGV4dFR5cGUoKSkKcmV0dXJuIHN0YXR1cztpZihzdGF0dXMuZmlsZVN5c3RlbS5pc0RpcnR5KCkmJihzdGF0dXMubmV0d29yay5pc0RpcnR5KCl8fHN0YXR1cy5uZXR3b3JrLmhhc0NvbW1pdHMoKSkpCnJldHVybiBudWxsO2NvbnN0IGNvbnRlbnRzPWF3YWl0IFByb21pc2UuYWxsKFtzdGF0dXMuZmlsZVN5c3RlbS5yZXF1ZXN0Q29udGVudCgpLG5ldyBQcm9taXNlKHg9PnN0YXR1cy5uZXR3b3JrLnByb2plY3QoKS5yZXF1ZXN0RmlsZUNvbnRlbnQoc3RhdHVzLm5ldHdvcmsseCkpXSk7Y29uc3QgZmlsZVN5c3RlbUNvbnRlbnQ9Y29udGVudHNbMF07Y29uc3QgbmV0d29ya0NvbnRlbnQ9Y29udGVudHNbMV07aWYoZmlsZVN5c3RlbUNvbnRlbnQ9PT1udWxsfHxuZXR3b3JrQ29udGVudD09PW51bGwpCnJldHVybiBudWxsO2lmKG5ldHdvcmtTb3VyY2VDb2RlW1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9wcm9jZXNzaW5nUHJvbWlzZV0hPT1jcmVhdGVCaW5kaW5nUHJvbWlzZSkKcmV0dXJuIG51bGw7Y29uc3QgdGFyZ2V0PUJpbmRpbmdzLk5ldHdvcmtQcm9qZWN0LnRhcmdldEZvclVJU291cmNlQ29kZShzdGF0dXMubmV0d29yayk7bGV0IGlzVmFsaWQ9ZmFsc2U7aWYodGFyZ2V0JiZ0YXJnZXQuaXNOb2RlSlMoKSl7Y29uc3QgcmV3cmFwcGVkTmV0d29ya0NvbnRlbnQ9UGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UucmV3cmFwTm9kZUpTQ29udGVudChzdGF0dXMuZmlsZVN5c3RlbSxmaWxlU3lzdGVtQ29udGVudCxuZXR3b3JrQ29udGVudCk7aXNWYWxpZD1maWxlU3lzdGVtQ29udGVudD09PXJld3JhcHBlZE5ldHdvcmtDb250ZW50O31lbHNle2lzVmFsaWQ9ZmlsZVN5c3RlbUNvbnRlbnQudHJpbVJpZ2h0KCk9PT1uZXR3b3JrQ29udGVudC50cmltUmlnaHQoKTt9CmlmKCFpc1ZhbGlkKXt0aGlzLl9wcmV2YWxpZGF0aW9uRmFpbGVkRm9yVGVzdChzdGF0dXMpO3JldHVybiBudWxsO30KcmV0dXJuIHN0YXR1czt9CmZ1bmN0aW9uIG9uU3RhdHVzKHN0YXR1cyl7aWYobmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXSE9PWNyZWF0ZUJpbmRpbmdQcm9taXNlKQpyZXR1cm47bmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXT1udWxsO2lmKCFzdGF0dXN8fHRoaXMuX2Rpc3Bvc2VkKXt0aGlzLl9vbkJpbmRpbmdGYWlsZWRGb3JUZXN0KCk7cmV0dXJuO30KaWYoc3RhdHVzLm5ldHdvcmtbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3N0YXR1c118fHN0YXR1cy5maWxlU3lzdGVtW1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9zdGF0dXNdKQpyZXR1cm47dGhpcy5fc3RhdHVzZXMuYWRkKHN0YXR1cyk7c3RhdHVzLm5ldHdvcmtbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3N0YXR1c109c3RhdHVzO3N0YXR1cy5maWxlU3lzdGVtW1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9zdGF0dXNdPXN0YXR1cztpZihzdGF0dXMuZXhhY3RNYXRjaCl7Y29uc3QgcHJvamVjdEZvbGRlcj10aGlzLl9wcm9qZWN0Rm9sZGVyc0luZGV4LmNsb3Nlc3RQYXJlbnRGb2xkZXIoc3RhdHVzLmZpbGVTeXN0ZW0udXJsKCkpO2NvbnN0IG5ld0ZvbGRlckFkZGVkPXByb2plY3RGb2xkZXI/dGhpcy5fYWN0aXZlRm9sZGVyc0luZGV4LmFkZEZvbGRlcihwcm9qZWN0Rm9sZGVyKTpmYWxzZTtpZihuZXdGb2xkZXJBZGRlZCkKdGhpcy5fc2NoZWR1bGVTd2VlcCgpO30KdGhpcy5fb25TdGF0dXNBZGRlZC5jYWxsKG51bGwsc3RhdHVzKTt9fQpfcHJldmFsaWRhdGlvbkZhaWxlZEZvclRlc3QoYmluZGluZyl7fQpfb25CaW5kaW5nRmFpbGVkRm9yVGVzdCgpe30KX2NsZWFyTmV0d29ya1N0YXR1cyhuZXR3b3JrU291cmNlQ29kZSl7aWYobmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXSl7bmV0d29ya1NvdXJjZUNvZGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3Byb2Nlc3NpbmdQcm9taXNlXT1udWxsO3JldHVybjt9CmNvbnN0IHN0YXR1cz1uZXR3b3JrU291cmNlQ29kZVtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fc3RhdHVzXTtpZighc3RhdHVzKQpyZXR1cm47dGhpcy5fc3RhdHVzZXMuZGVsZXRlKHN0YXR1cyk7c3RhdHVzLm5ldHdvcmtbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX3N0YXR1c109bnVsbDtzdGF0dXMuZmlsZVN5c3RlbVtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fc3RhdHVzXT1udWxsO2lmKHN0YXR1cy5leGFjdE1hdGNoKXtjb25zdCBwcm9qZWN0Rm9sZGVyPXRoaXMuX3Byb2plY3RGb2xkZXJzSW5kZXguY2xvc2VzdFBhcmVudEZvbGRlcihzdGF0dXMuZmlsZVN5c3RlbS51cmwoKSk7aWYocHJvamVjdEZvbGRlcikKdGhpcy5fYWN0aXZlRm9sZGVyc0luZGV4LnJlbW92ZUZvbGRlcihwcm9qZWN0Rm9sZGVyKTt9CnRoaXMuX29uU3RhdHVzUmVtb3ZlZC5jYWxsKG51bGwsc3RhdHVzKTt9Cl9jcmVhdGVCaW5kaW5nKG5ldHdvcmtTb3VyY2VDb2RlKXtpZihuZXR3b3JrU291cmNlQ29kZS51cmwoKS5zdGFydHNXaXRoKCdmaWxlOi8vJykpe2NvbnN0IGZpbGVTb3VyY2VDb2RlPXRoaXMuX2ZpbGVTeXN0ZW1VSVNvdXJjZUNvZGVzLmdldChuZXR3b3JrU291cmNlQ29kZS51cmwoKSk7Y29uc3Qgc3RhdHVzPWZpbGVTb3VyY2VDb2RlP25ldyBQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZ1N0YXR1cyhuZXR3b3JrU291cmNlQ29kZSxmaWxlU291cmNlQ29kZSxmYWxzZSk6bnVsbDtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0YXR1cyk7fQpsZXQgbmV0d29ya1BhdGg9Q29tbW9uLlBhcnNlZFVSTC5leHRyYWN0UGF0aChuZXR3b3JrU291cmNlQ29kZS51cmwoKSk7aWYobmV0d29ya1BhdGg9PT1udWxsKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7aWYobmV0d29ya1BhdGguZW5kc1dpdGgoJy8nKSkKbmV0d29ya1BhdGgrPSdpbmRleC5odG1sJztjb25zdCBzaW1pbGFyRmlsZXM9dGhpcy5fZmlsZXNJbmRleC5zaW1pbGFyRmlsZXMobmV0d29ya1BhdGgpLm1hcChwYXRoPT50aGlzLl9maWxlU3lzdGVtVUlTb3VyY2VDb2Rlcy5nZXQocGF0aCkpO2lmKCFzaW1pbGFyRmlsZXMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7cmV0dXJuIHRoaXMuX3B1bGxNZXRhZGF0YXMoc2ltaWxhckZpbGVzLmNvbmNhdChuZXR3b3JrU291cmNlQ29kZSkpLnRoZW4ob25NZXRhZGF0YXMuYmluZCh0aGlzKSk7ZnVuY3Rpb24gb25NZXRhZGF0YXMoKXtjb25zdCBhY3RpdmVGaWxlcz1zaW1pbGFyRmlsZXMuZmlsdGVyKGZpbGU9PiEhdGhpcy5fYWN0aXZlRm9sZGVyc0luZGV4LmNsb3Nlc3RQYXJlbnRGb2xkZXIoZmlsZS51cmwoKSkpO2NvbnN0IG5ldHdvcmtNZXRhZGF0YT1uZXR3b3JrU291cmNlQ29kZVtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fbWV0YWRhdGFdO2lmKCFuZXR3b3JrTWV0YWRhdGF8fCghbmV0d29ya01ldGFkYXRhLm1vZGlmaWNhdGlvblRpbWUmJnR5cGVvZiBuZXR3b3JrTWV0YWRhdGEuY29udGVudFNpemUhPT0nbnVtYmVyJykpe2lmKGFjdGl2ZUZpbGVzLmxlbmd0aCE9PTEpCnJldHVybiBudWxsO3JldHVybiBuZXcgUGVyc2lzdGVuY2UuQXV0b21hcHBpbmdTdGF0dXMobmV0d29ya1NvdXJjZUNvZGUsYWN0aXZlRmlsZXNbMF0sZmFsc2UpO30KbGV0IGV4YWN0TWF0Y2hlcz10aGlzLl9maWx0ZXJXaXRoTWV0YWRhdGEoYWN0aXZlRmlsZXMsbmV0d29ya01ldGFkYXRhKTtpZighZXhhY3RNYXRjaGVzLmxlbmd0aCkKZXhhY3RNYXRjaGVzPXRoaXMuX2ZpbHRlcldpdGhNZXRhZGF0YShzaW1pbGFyRmlsZXMsbmV0d29ya01ldGFkYXRhKTtpZihleGFjdE1hdGNoZXMubGVuZ3RoIT09MSkKcmV0dXJuIG51bGw7cmV0dXJuIG5ldyBQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZ1N0YXR1cyhuZXR3b3JrU291cmNlQ29kZSxleGFjdE1hdGNoZXNbMF0sdHJ1ZSk7fX0KX3B1bGxNZXRhZGF0YXModWlTb3VyY2VDb2Rlcyl7Y29uc3QgcHJvbWlzZXM9dWlTb3VyY2VDb2Rlcy5tYXAoZmlsZT0+ZmV0Y2hNZXRhZGF0YShmaWxlKSk7cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtmdW5jdGlvbiBmZXRjaE1ldGFkYXRhKGZpbGUpe3JldHVybiBmaWxlLnJlcXVlc3RNZXRhZGF0YSgpLnRoZW4obWV0YWRhdGE9PmZpbGVbUGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuX21ldGFkYXRhXT1tZXRhZGF0YSk7fX0KX2ZpbHRlcldpdGhNZXRhZGF0YShmaWxlcyxuZXR3b3JrTWV0YWRhdGEpe3JldHVybiBmaWxlcy5maWx0ZXIoZmlsZT0+e2NvbnN0IGZpbGVNZXRhZGF0YT1maWxlW1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9tZXRhZGF0YV07aWYoIWZpbGVNZXRhZGF0YSkKcmV0dXJuIGZhbHNlO2NvbnN0IHRpbWVNYXRjaGVzPSFuZXR3b3JrTWV0YWRhdGEubW9kaWZpY2F0aW9uVGltZXx8TWF0aC5hYnMobmV0d29ya01ldGFkYXRhLm1vZGlmaWNhdGlvblRpbWUtZmlsZU1ldGFkYXRhLm1vZGlmaWNhdGlvblRpbWUpPDEwMDA7Y29uc3QgY29udGVudE1hdGNoZXM9IW5ldHdvcmtNZXRhZGF0YS5jb250ZW50U2l6ZXx8ZmlsZU1ldGFkYXRhLmNvbnRlbnRTaXplPT09bmV0d29ya01ldGFkYXRhLmNvbnRlbnRTaXplO3JldHVybiB0aW1lTWF0Y2hlcyYmY29udGVudE1hdGNoZXM7fSk7fQpkaXNwb3NlKCl7aWYodGhpcy5fZGlzcG9zZWQpCnJldHVybjt0aGlzLl9kaXNwb3NlZD10cnVlO0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7Zm9yKGNvbnN0IHN0YXR1cyBvZiB0aGlzLl9zdGF0dXNlcy52YWx1ZXNBcnJheSgpKQp0aGlzLl9jbGVhck5ldHdvcmtTdGF0dXMoc3RhdHVzLm5ldHdvcmspO319O1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9zdGF0dXM9U3ltYm9sKCdBdXRvbWFwcGluZy5TdGF0dXMnKTtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZy5fcHJvY2Vzc2luZ1Byb21pc2U9U3ltYm9sKCdBdXRvbWFwcGluZy5Qcm9jZXNzaW5nUHJvbWlzZScpO1BlcnNpc3RlbmNlLkF1dG9tYXBwaW5nLl9tZXRhZGF0YT1TeW1ib2woJ0F1dG9tYXBwaW5nLk1ldGFkYXRhJyk7UGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuRmlsZVBhdGhJbmRleD1jbGFzc3tjb25zdHJ1Y3RvcihlbmNvZGVyKXt0aGlzLl9lbmNvZGVyPWVuY29kZXI7dGhpcy5fcmV2ZXJzZWRJbmRleD1uZXcgQ29tbW9uLlRyaWUoKTt9CmFkZFBhdGgocGF0aCl7Y29uc3QgZW5jb2RlZFBhdGg9dGhpcy5fZW5jb2Rlci5lbmNvZGUocGF0aCk7dGhpcy5fcmV2ZXJzZWRJbmRleC5hZGQoZW5jb2RlZFBhdGgucmV2ZXJzZSgpKTt9CnJlbW92ZVBhdGgocGF0aCl7Y29uc3QgZW5jb2RlZFBhdGg9dGhpcy5fZW5jb2Rlci5lbmNvZGUocGF0aCk7dGhpcy5fcmV2ZXJzZWRJbmRleC5yZW1vdmUoZW5jb2RlZFBhdGgucmV2ZXJzZSgpKTt9CnNpbWlsYXJGaWxlcyhuZXR3b3JrUGF0aCl7Y29uc3QgZW5jb2RlZFBhdGg9dGhpcy5fZW5jb2Rlci5lbmNvZGUobmV0d29ya1BhdGgpO2NvbnN0IGxvbmdlc3RDb21tb25QcmVmaXg9dGhpcy5fcmV2ZXJzZWRJbmRleC5sb25nZXN0UHJlZml4KGVuY29kZWRQYXRoLnJldmVyc2UoKSxmYWxzZSk7aWYoIWxvbmdlc3RDb21tb25QcmVmaXgpCnJldHVybltdO3JldHVybiB0aGlzLl9yZXZlcnNlZEluZGV4LndvcmRzKGxvbmdlc3RDb21tb25QcmVmaXgpLm1hcChlbmNvZGVkUGF0aD0+dGhpcy5fZW5jb2Rlci5kZWNvZGUoZW5jb2RlZFBhdGgucmV2ZXJzZSgpKSk7fX07UGVyc2lzdGVuY2UuQXV0b21hcHBpbmcuRm9sZGVySW5kZXg9Y2xhc3N7Y29uc3RydWN0b3IoZW5jb2Rlcil7dGhpcy5fZW5jb2Rlcj1lbmNvZGVyO3RoaXMuX2luZGV4PW5ldyBDb21tb24uVHJpZSgpO3RoaXMuX2ZvbGRlckNvdW50PW5ldyBNYXAoKTt9CmFkZEZvbGRlcihwYXRoKXtpZihwYXRoLmVuZHNXaXRoKCcvJykpCnBhdGg9cGF0aC5zdWJzdHJpbmcoMCxwYXRoLmxlbmd0aC0xKTtjb25zdCBlbmNvZGVkUGF0aD10aGlzLl9lbmNvZGVyLmVuY29kZShwYXRoKTt0aGlzLl9pbmRleC5hZGQoZW5jb2RlZFBhdGgpO2NvbnN0IGNvdW50PXRoaXMuX2ZvbGRlckNvdW50LmdldChlbmNvZGVkUGF0aCl8fDA7dGhpcy5fZm9sZGVyQ291bnQuc2V0KGVuY29kZWRQYXRoLGNvdW50KzEpO3JldHVybiBjb3VudD09PTA7fQpyZW1vdmVGb2xkZXIocGF0aCl7aWYocGF0aC5lbmRzV2l0aCgnLycpKQpwYXRoPXBhdGguc3Vic3RyaW5nKDAscGF0aC5sZW5ndGgtMSk7Y29uc3QgZW5jb2RlZFBhdGg9dGhpcy5fZW5jb2Rlci5lbmNvZGUocGF0aCk7Y29uc3QgY291bnQ9dGhpcy5fZm9sZGVyQ291bnQuZ2V0KGVuY29kZWRQYXRoKXx8MDtpZighY291bnQpCnJldHVybiBmYWxzZTtpZihjb3VudD4xKXt0aGlzLl9mb2xkZXJDb3VudC5zZXQoZW5jb2RlZFBhdGgsY291bnQtMSk7cmV0dXJuIGZhbHNlO30KdGhpcy5faW5kZXgucmVtb3ZlKGVuY29kZWRQYXRoKTt0aGlzLl9mb2xkZXJDb3VudC5kZWxldGUoZW5jb2RlZFBhdGgpO3JldHVybiB0cnVlO30KY2xvc2VzdFBhcmVudEZvbGRlcihwYXRoKXtjb25zdCBlbmNvZGVkUGF0aD10aGlzLl9lbmNvZGVyLmVuY29kZShwYXRoKTtjb25zdCBjb21tb25QcmVmaXg9dGhpcy5faW5kZXgubG9uZ2VzdFByZWZpeChlbmNvZGVkUGF0aCx0cnVlKTtyZXR1cm4gdGhpcy5fZW5jb2Rlci5kZWNvZGUoY29tbW9uUHJlZml4KTt9fTtQZXJzaXN0ZW5jZS5BdXRvbWFwcGluZ1N0YXR1cz1jbGFzc3tjb25zdHJ1Y3RvcihuZXR3b3JrLGZpbGVTeXN0ZW0sZXhhY3RNYXRjaCl7dGhpcy5uZXR3b3JrPW5ldHdvcms7dGhpcy5maWxlU3lzdGVtPWZpbGVTeXN0ZW07dGhpcy5leGFjdE1hdGNoPWV4YWN0TWF0Y2g7fX07O1BlcnNpc3RlbmNlLk5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHdvcmtzcGFjZSl7c3VwZXIoKTt0aGlzLl9iaW5kaW5nU3ltYm9sPVN5bWJvbCgnTmV0d29ya1BlcnNpc3RlbmNlQmluZGluZycpO3RoaXMuX29yaWdpbmFsUmVzcG9uc2VDb250ZW50UHJvbWlzZVN5bWJvbD1TeW1ib2woJ09yaWdpbmFsUmVzcG9uc2VQcm9taXNlJyk7dGhpcy5fc2F2aW5nU3ltYm9sPVN5bWJvbCgnU2F2aW5nRm9yT3ZlcnJpZGVzJyk7dGhpcy5fZW5hYmxlZFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ3BlcnNpc3RlbmNlTmV0d29ya092ZXJyaWRlc0VuYWJsZWQnKTt0aGlzLl9lbmFibGVkU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9lbmFibGVkQ2hhbmdlZCx0aGlzKTt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX25ldHdvcmtVSVNvdXJjZUNvZGVGb3JFbmNvZGVkUGF0aD1uZXcgTWFwKCk7dGhpcy5faW50ZXJjZXB0aW9uSGFuZGxlckJvdW5kPXRoaXMuX2ludGVyY2VwdGlvbkhhbmRsZXIuYmluZCh0aGlzKTt0aGlzLl91cGRhdGVJbnRlcmNlcHRpb25UaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoNTApO3RoaXMuX3Byb2plY3Q9bnVsbDt0aGlzLl9hY3RpdmVQcm9qZWN0PW51bGw7dGhpcy5fYWN0aXZlPWZhbHNlO3RoaXMuX2VuYWJsZWQ9ZmFsc2U7dGhpcy5fd29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdEFkZGVkLGV2ZW50PT50aGlzLl9vblByb2plY3RBZGRlZCgoZXZlbnQuZGF0YSkpKTt0aGlzLl93b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0UmVtb3ZlZCxldmVudD0+dGhpcy5fb25Qcm9qZWN0UmVtb3ZlZCgoZXZlbnQuZGF0YSkpKTt0aGlzLl9ldmVudERlc2NyaXB0b3JzPVtdO3RoaXMuX2VuYWJsZWRDaGFuZ2VkKCk7fQphY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlO30KcHJvamVjdCgpe3JldHVybiB0aGlzLl9wcm9qZWN0O30Kb3JpZ2luYWxDb250ZW50Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7aWYoIXVpU291cmNlQ29kZVt0aGlzLl9iaW5kaW5nU3ltYm9sXSkKcmV0dXJuIG51bGw7Y29uc3QgZmlsZVN5c3RlbVVJU291cmNlQ29kZT11aVNvdXJjZUNvZGVbdGhpcy5fYmluZGluZ1N5bWJvbF0uZmlsZVN5c3RlbTtyZXR1cm4gZmlsZVN5c3RlbVVJU291cmNlQ29kZVt0aGlzLl9vcmlnaW5hbFJlc3BvbnNlQ29udGVudFByb21pc2VTeW1ib2xdfHxudWxsO30KX2VuYWJsZWRDaGFuZ2VkKCl7aWYodGhpcy5fZW5hYmxlZD09PXRoaXMuX2VuYWJsZWRTZXR0aW5nLmdldCgpKQpyZXR1cm47dGhpcy5fZW5hYmxlZD10aGlzLl9lbmFibGVkU2V0dGluZy5nZXQoKTtpZih0aGlzLl9lbmFibGVkKXt0aGlzLl9ldmVudERlc2NyaXB0b3JzPVtXb3Jrc3BhY2Uud29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlUmVuYW1lZCxldmVudD0+e2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO3RoaXMuX29uVUlTb3VyY2VDb2RlUmVtb3ZlZCh1aVNvdXJjZUNvZGUpO3RoaXMuX29uVUlTb3VyY2VDb2RlQWRkZWQodWlTb3VyY2VDb2RlKTt9KSxXb3Jrc3BhY2Uud29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlQWRkZWQsZXZlbnQ9PnRoaXMuX29uVUlTb3VyY2VDb2RlQWRkZWQoKGV2ZW50LmRhdGEpKSksV29ya3NwYWNlLndvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZVJlbW92ZWQsZXZlbnQ9PnRoaXMuX29uVUlTb3VyY2VDb2RlUmVtb3ZlZCgoZXZlbnQuZGF0YSkpKSxXb3Jrc3BhY2Uud29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsZXZlbnQ9PnRoaXMuX29uVUlTb3VyY2VDb2RlV29ya2luZ0NvcHlDb21taXR0ZWQoKGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKSkpXTt0aGlzLl91cGRhdGVBY3RpdmVQcm9qZWN0KCk7fWVsc2V7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2V2ZW50RGVzY3JpcHRvcnMpO3RoaXMuX3VwZGF0ZUFjdGl2ZVByb2plY3QoKTt9fQpfdXBkYXRlQWN0aXZlUHJvamVjdCgpe2NvbnN0IHdhc0FjdGl2ZT10aGlzLl9hY3RpdmU7dGhpcy5fYWN0aXZlPSEhKHRoaXMuX2VuYWJsZWRTZXR0aW5nLmdldCgpJiZTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkmJnRoaXMuX3Byb2plY3QpO2lmKHRoaXMuX2FjdGl2ZT09PXdhc0FjdGl2ZSkKcmV0dXJuO2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fcHJvamVjdC51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9maWxlc3lzdGVtVUlTb3VyY2VDb2RlQWRkZWQuYmluZCh0aGlzKSk7Y29uc3QgbmV0d29ya1Byb2plY3RzPXRoaXMuX3dvcmtzcGFjZS5wcm9qZWN0c0ZvclR5cGUoV29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrKTtmb3IoY29uc3QgbmV0d29ya1Byb2plY3Qgb2YgbmV0d29ya1Byb2plY3RzKQpuZXR3b3JrUHJvamVjdC51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9uZXR3b3JrVUlTb3VyY2VDb2RlQWRkZWQuYmluZCh0aGlzKSk7fWVsc2UgaWYodGhpcy5fcHJvamVjdCl7dGhpcy5fcHJvamVjdC51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9maWxlc3lzdGVtVUlTb3VyY2VDb2RlUmVtb3ZlZC5iaW5kKHRoaXMpKTt0aGlzLl9uZXR3b3JrVUlTb3VyY2VDb2RlRm9yRW5jb2RlZFBhdGguY2xlYXIoKTt9ClBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnNldEF1dG9tYXBwaW5nRW5hYmxlZCghdGhpcy5fYWN0aXZlKTt9Cl9lbmNvZGVkUGF0aEZyb21VcmwodXJsKXtpZighdGhpcy5fYWN0aXZlKQpyZXR1cm4nJztsZXQgdXJsUGF0aD1Db21tb24uUGFyc2VkVVJMLnVybFdpdGhvdXRIYXNoKHVybC5yZXBsYWNlKC9eaHR0cHM/OlwvXC8vLCcnKSk7aWYodXJsUGF0aC5lbmRzV2l0aCgnLycpJiZ1cmxQYXRoLmluZGV4T2YoJz8nKT09PS0xKQp1cmxQYXRoPXVybFBhdGgrJ2luZGV4Lmh0bWwnO2xldCBlbmNvZGVkUGF0aFBhcnRzPWVuY29kZVVybFBhdGhUb0xvY2FsUGF0aFBhcnRzKHVybFBhdGgpO2NvbnN0IHByb2plY3RQYXRoPVBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLmZpbGVTeXN0ZW1QYXRoKHRoaXMuX3Byb2plY3QuaWQoKSk7Y29uc3QgZW5jb2RlZFBhdGg9ZW5jb2RlZFBhdGhQYXJ0cy5qb2luKCcvJyk7aWYocHJvamVjdFBhdGgubGVuZ3RoK2VuY29kZWRQYXRoLmxlbmd0aD4yMDApe2NvbnN0IGRvbWFpbj1lbmNvZGVkUGF0aFBhcnRzWzBdO2NvbnN0IGVuY29kZWRGaWxlTmFtZT1lbmNvZGVkUGF0aFBhcnRzW2VuY29kZWRQYXRoUGFydHMubGVuZ3RoLTFdO2NvbnN0IHNob3J0RmlsZU5hbWU9ZW5jb2RlZEZpbGVOYW1lP2VuY29kZWRGaWxlTmFtZS5zdWJzdHIoMCwxMCkrJy0nOicnO2NvbnN0IGV4dGVuc2lvbj1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RFeHRlbnNpb24odXJsUGF0aCk7Y29uc3QgZXh0ZW5zaW9uUGFydD1leHRlbnNpb24/Jy4nK2V4dGVuc2lvbi5zdWJzdHIoMCwxMCk6Jyc7ZW5jb2RlZFBhdGhQYXJ0cz1bZG9tYWluLCdsb25ndXJscycsc2hvcnRGaWxlTmFtZStTdHJpbmcuaGFzaENvZGUoZW5jb2RlZFBhdGgpLnRvU3RyaW5nKDE2KStleHRlbnNpb25QYXJ0XTt9CnJldHVybiBlbmNvZGVkUGF0aFBhcnRzLmpvaW4oJy8nKTtmdW5jdGlvbiBlbmNvZGVVcmxQYXRoVG9Mb2NhbFBhdGhQYXJ0cyh1cmxQYXRoKXtjb25zdCBlbmNvZGVkUGFydHM9W107Zm9yKGNvbnN0IHBhdGhQYXJ0IG9mIGZpbGVOYW1lUGFydHNGcm9tVXJsUGF0aCh1cmxQYXRoKSl7aWYoIXBhdGhQYXJ0KQpjb250aW51ZTtsZXQgZW5jb2RlZE5hbWU9ZW5jb2RlVVJJKHBhdGhQYXJ0KS5yZXBsYWNlKC9bXC86XD9cKl0vZyxtYXRjaD0+JyUnK21hdGNoWzBdLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKTtpZihQZXJzaXN0ZW5jZS5OZXR3b3JrUGVyc2lzdGVuY2VNYW5hZ2VyLl9yZXNlcnZlZEZpbGVOYW1lcy5oYXMoZW5jb2RlZE5hbWUudG9Mb3dlckNhc2UoKSkpCmVuY29kZWROYW1lPWVuY29kZWROYW1lLnNwbGl0KCcnKS5tYXAoY2hhcj0+JyUnK2NoYXIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLmpvaW4oJycpO2NvbnN0IGxhc3RDaGFyPWVuY29kZWROYW1lLmNoYXJBdChlbmNvZGVkTmFtZS5sZW5ndGgtMSk7aWYobGFzdENoYXI9PT0nLicpCmVuY29kZWROYW1lPWVuY29kZWROYW1lLnN1YnN0cigwLGVuY29kZWROYW1lLmxlbmd0aC0xKSsnJTJlJztlbmNvZGVkUGFydHMucHVzaChlbmNvZGVkTmFtZSk7fQpyZXR1cm4gZW5jb2RlZFBhcnRzO30KZnVuY3Rpb24gZmlsZU5hbWVQYXJ0c0Zyb21VcmxQYXRoKHVybFBhdGgpe3VybFBhdGg9Q29tbW9uLlBhcnNlZFVSTC51cmxXaXRob3V0SGFzaCh1cmxQYXRoKTtjb25zdCBxdWVyeUluZGV4PXVybFBhdGguaW5kZXhPZignPycpO2lmKHF1ZXJ5SW5kZXg9PT0tMSkKcmV0dXJuIHVybFBhdGguc3BsaXQoJy8nKTtpZihxdWVyeUluZGV4PT09MCkKcmV0dXJuW3VybFBhdGhdO2NvbnN0IGVuZFNlY3Rpb249dXJsUGF0aC5zdWJzdHIocXVlcnlJbmRleCk7Y29uc3QgcGFydHM9dXJsUGF0aC5zdWJzdHIoMCx1cmxQYXRoLmxlbmd0aC1lbmRTZWN0aW9uLmxlbmd0aCkuc3BsaXQoJy8nKTtwYXJ0c1twYXJ0cy5sZW5ndGgtMV0rPWVuZFNlY3Rpb247cmV0dXJuIHBhcnRzO319Cl9kZWNvZGVMb2NhbFBhdGhUb1VybFBhdGgocGF0aCl7dHJ5e3JldHVybiB1bmVzY2FwZShwYXRoKTt9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKTt9CnJldHVybiBwYXRoO30KX3VuYmluZCh1aVNvdXJjZUNvZGUpe2NvbnN0IGJpbmRpbmc9dWlTb3VyY2VDb2RlW3RoaXMuX2JpbmRpbmdTeW1ib2xdO2lmKCFiaW5kaW5nKQpyZXR1cm47ZGVsZXRlIGJpbmRpbmcubmV0d29ya1t0aGlzLl9iaW5kaW5nU3ltYm9sXTtkZWxldGUgYmluZGluZy5maWxlU3lzdGVtW3RoaXMuX2JpbmRpbmdTeW1ib2xdO1BlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnJlbW92ZUJpbmRpbmcoYmluZGluZyk7fQphc3luYyBfYmluZChuZXR3b3JrVUlTb3VyY2VDb2RlLGZpbGVTeXN0ZW1VSVNvdXJjZUNvZGUpe2lmKG5ldHdvcmtVSVNvdXJjZUNvZGVbdGhpcy5fYmluZGluZ1N5bWJvbF0pCnRoaXMuX3VuYmluZChuZXR3b3JrVUlTb3VyY2VDb2RlKTtpZihmaWxlU3lzdGVtVUlTb3VyY2VDb2RlW3RoaXMuX2JpbmRpbmdTeW1ib2xdKQp0aGlzLl91bmJpbmQoZmlsZVN5c3RlbVVJU291cmNlQ29kZSk7Y29uc3QgYmluZGluZz1uZXcgUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VCaW5kaW5nKG5ldHdvcmtVSVNvdXJjZUNvZGUsZmlsZVN5c3RlbVVJU291cmNlQ29kZSk7bmV0d29ya1VJU291cmNlQ29kZVt0aGlzLl9iaW5kaW5nU3ltYm9sXT1iaW5kaW5nO2ZpbGVTeXN0ZW1VSVNvdXJjZUNvZGVbdGhpcy5fYmluZGluZ1N5bWJvbF09YmluZGluZztQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5hZGRCaW5kaW5nKGJpbmRpbmcpO2NvbnN0IHVpU291cmNlQ29kZU9mVHJ1dGg9bmV0d29ya1VJU291cmNlQ29kZVt0aGlzLl9zYXZpbmdTeW1ib2xdP25ldHdvcmtVSVNvdXJjZUNvZGU6ZmlsZVN5c3RlbVVJU291cmNlQ29kZTtjb25zdFtjb250ZW50LGVuY29kZWRdPWF3YWl0IFByb21pc2UuYWxsKFt1aVNvdXJjZUNvZGVPZlRydXRoLnJlcXVlc3RDb250ZW50KCksdWlTb3VyY2VDb2RlT2ZUcnV0aC5jb250ZW50RW5jb2RlZCgpXSk7UGVyc2lzdGVuY2UucGVyc2lzdGVuY2Uuc3luY0NvbnRlbnQodWlTb3VyY2VDb2RlT2ZUcnV0aCxjb250ZW50LGVuY29kZWQpO30KX29uVUlTb3VyY2VDb2RlV29ya2luZ0NvcHlDb21taXR0ZWQodWlTb3VyY2VDb2RlKXt0aGlzLnNhdmVVSVNvdXJjZUNvZGVGb3JPdmVycmlkZXModWlTb3VyY2VDb2RlKTt9CmNhblNhdmVVSVNvdXJjZUNvZGVGb3JPdmVycmlkZXModWlTb3VyY2VDb2RlKXtyZXR1cm4gdGhpcy5fYWN0aXZlJiZ1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yayYmIXVpU291cmNlQ29kZVt0aGlzLl9iaW5kaW5nU3ltYm9sXSYmIXVpU291cmNlQ29kZVt0aGlzLl9zYXZpbmdTeW1ib2xdO30KYXN5bmMgc2F2ZVVJU291cmNlQ29kZUZvck92ZXJyaWRlcyh1aVNvdXJjZUNvZGUpe2lmKCF0aGlzLmNhblNhdmVVSVNvdXJjZUNvZGVGb3JPdmVycmlkZXModWlTb3VyY2VDb2RlKSkKcmV0dXJuO3VpU291cmNlQ29kZVt0aGlzLl9zYXZpbmdTeW1ib2xdPXRydWU7bGV0IGVuY29kZWRQYXRoPXRoaXMuX2VuY29kZWRQYXRoRnJvbVVybCh1aVNvdXJjZUNvZGUudXJsKCkpO2NvbnN0IGNvbnRlbnQ9YXdhaXQgdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCk7Y29uc3QgZW5jb2RlZD1hd2FpdCB1aVNvdXJjZUNvZGUuY29udGVudEVuY29kZWQoKTtjb25zdCBsYXN0SW5kZXhPZlNsYXNoPWVuY29kZWRQYXRoLmxhc3RJbmRleE9mKCcvJyk7Y29uc3QgZW5jb2RlZEZpbGVOYW1lPWVuY29kZWRQYXRoLnN1YnN0cihsYXN0SW5kZXhPZlNsYXNoKzEpO2VuY29kZWRQYXRoPWVuY29kZWRQYXRoLnN1YnN0cigwLGxhc3RJbmRleE9mU2xhc2gpO2F3YWl0IHRoaXMuX3Byb2plY3QuY3JlYXRlRmlsZShlbmNvZGVkUGF0aCxlbmNvZGVkRmlsZU5hbWUsY29udGVudCxlbmNvZGVkKTt0aGlzLl9maWxlQ3JlYXRlZEZvclRlc3QoZW5jb2RlZFBhdGgsZW5jb2RlZEZpbGVOYW1lKTt1aVNvdXJjZUNvZGVbdGhpcy5fc2F2aW5nU3ltYm9sXT1mYWxzZTt9Cl9maWxlQ3JlYXRlZEZvclRlc3QocGF0aCxmaWxlTmFtZSl7fQpfcGF0dGVybkZvckZpbGVTeXN0ZW1VSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtjb25zdCByZWxhdGl2ZVBhdGhQYXJ0cz1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5yZWxhdGl2ZVBhdGgodWlTb3VyY2VDb2RlKTtpZihyZWxhdGl2ZVBhdGhQYXJ0cy5sZW5ndGg8MikKcmV0dXJuJyc7aWYocmVsYXRpdmVQYXRoUGFydHNbMV09PT0nbG9uZ3VybHMnJiZyZWxhdGl2ZVBhdGhQYXJ0cy5sZW5ndGghPT0yKQpyZXR1cm4naHR0cD86Ly8nK3JlbGF0aXZlUGF0aFBhcnRzWzBdKycvKic7cmV0dXJuJ2h0dHA/Oi8vJyt0aGlzLl9kZWNvZGVMb2NhbFBhdGhUb1VybFBhdGgocmVsYXRpdmVQYXRoUGFydHMuam9pbignLycpKTt9Cl9vblVJU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSl7dGhpcy5fbmV0d29ya1VJU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSk7dGhpcy5fZmlsZXN5c3RlbVVJU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSk7fQpfbmV0d29ya1VJU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSl7aWYoIXRoaXMuX2FjdGl2ZXx8dWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCkhPT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLk5ldHdvcmspCnJldHVybjtjb25zdCB1cmw9Q29tbW9uLlBhcnNlZFVSTC51cmxXaXRob3V0SGFzaCh1aVNvdXJjZUNvZGUudXJsKCkpO3RoaXMuX25ldHdvcmtVSVNvdXJjZUNvZGVGb3JFbmNvZGVkUGF0aC5zZXQodGhpcy5fZW5jb2RlZFBhdGhGcm9tVXJsKHVybCksdWlTb3VyY2VDb2RlKTtjb25zdCBmaWxlU3lzdGVtVUlTb3VyY2VDb2RlPXRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKHRoaXMuX3Byb2plY3QuZmlsZVN5c3RlbVBhdGgoKSsnLycrdGhpcy5fZW5jb2RlZFBhdGhGcm9tVXJsKHVybCkpO2lmKCFmaWxlU3lzdGVtVUlTb3VyY2VDb2RlKQpyZXR1cm47dGhpcy5fYmluZCh1aVNvdXJjZUNvZGUsZmlsZVN5c3RlbVVJU291cmNlQ29kZSk7fQpfZmlsZXN5c3RlbVVJU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSl7aWYoIXRoaXMuX2FjdGl2ZXx8dWlTb3VyY2VDb2RlLnByb2plY3QoKSE9PXRoaXMuX3Byb2plY3QpCnJldHVybjt0aGlzLl91cGRhdGVJbnRlcmNlcHRpb25QYXR0ZXJucygpO2NvbnN0IHJlbGF0aXZlUGF0aD1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5yZWxhdGl2ZVBhdGgodWlTb3VyY2VDb2RlKTtjb25zdCBuZXR3b3JrVUlTb3VyY2VDb2RlPXRoaXMuX25ldHdvcmtVSVNvdXJjZUNvZGVGb3JFbmNvZGVkUGF0aC5nZXQocmVsYXRpdmVQYXRoLmpvaW4oJy8nKSk7aWYobmV0d29ya1VJU291cmNlQ29kZSkKdGhpcy5fYmluZChuZXR3b3JrVUlTb3VyY2VDb2RlLHVpU291cmNlQ29kZSk7fQpfdXBkYXRlSW50ZXJjZXB0aW9uUGF0dGVybnMoKXt0aGlzLl91cGRhdGVJbnRlcmNlcHRpb25UaHJvdHRsZXIuc2NoZWR1bGUoaW5uZXJVcGRhdGVJbnRlcmNlcHRpb25QYXR0ZXJucy5iaW5kKHRoaXMpKTtmdW5jdGlvbiBpbm5lclVwZGF0ZUludGVyY2VwdGlvblBhdHRlcm5zKCl7aWYoIXRoaXMuX2FjdGl2ZSkKcmV0dXJuIFNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldEludGVyY2VwdGlvbkhhbmRsZXJGb3JQYXR0ZXJucyhbXSx0aGlzLl9pbnRlcmNlcHRpb25IYW5kbGVyQm91bmQpO2NvbnN0IHBhdHRlcm5zPW5ldyBTZXQoKTtjb25zdCBpbmRleEZpbGVOYW1lPSdpbmRleC5odG1sJztmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIHRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlcygpKXtjb25zdCBwYXR0ZXJuPXRoaXMuX3BhdHRlcm5Gb3JGaWxlU3lzdGVtVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7cGF0dGVybnMuYWRkKHBhdHRlcm4pO2lmKHBhdHRlcm4uZW5kc1dpdGgoJy8nK2luZGV4RmlsZU5hbWUpKQpwYXR0ZXJucy5hZGQocGF0dGVybi5zdWJzdHIoMCxwYXR0ZXJuLmxlbmd0aC1pbmRleEZpbGVOYW1lLmxlbmd0aCkpO30KcmV0dXJuIFNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldEludGVyY2VwdGlvbkhhbmRsZXJGb3JQYXR0ZXJucyhBcnJheS5mcm9tKHBhdHRlcm5zKS5tYXAocGF0dGVybj0+KHt1cmxQYXR0ZXJuOnBhdHRlcm4saW50ZXJjZXB0aW9uU3RhZ2U6UHJvdG9jb2wuTmV0d29yay5JbnRlcmNlcHRpb25TdGFnZS5IZWFkZXJzUmVjZWl2ZWR9KSksdGhpcy5faW50ZXJjZXB0aW9uSGFuZGxlckJvdW5kKTt9fQpfb25VSVNvdXJjZUNvZGVSZW1vdmVkKHVpU291cmNlQ29kZSl7dGhpcy5fbmV0d29ya1VJU291cmNlQ29kZVJlbW92ZWQodWlTb3VyY2VDb2RlKTt0aGlzLl9maWxlc3lzdGVtVUlTb3VyY2VDb2RlUmVtb3ZlZCh1aVNvdXJjZUNvZGUpO30KX25ldHdvcmtVSVNvdXJjZUNvZGVSZW1vdmVkKHVpU291cmNlQ29kZSl7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCkhPT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLk5ldHdvcmspCnJldHVybjt0aGlzLl91bmJpbmQodWlTb3VyY2VDb2RlKTt0aGlzLl9uZXR3b3JrVUlTb3VyY2VDb2RlRm9yRW5jb2RlZFBhdGguZGVsZXRlKHRoaXMuX2VuY29kZWRQYXRoRnJvbVVybCh1aVNvdXJjZUNvZGUudXJsKCkpKTt9Cl9maWxlc3lzdGVtVUlTb3VyY2VDb2RlUmVtb3ZlZCh1aVNvdXJjZUNvZGUpe2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkhPT10aGlzLl9wcm9qZWN0KQpyZXR1cm47dGhpcy5fdXBkYXRlSW50ZXJjZXB0aW9uUGF0dGVybnMoKTtkZWxldGUgdWlTb3VyY2VDb2RlW3RoaXMuX29yaWdpbmFsUmVzcG9uc2VDb250ZW50UHJvbWlzZVN5bWJvbF07dGhpcy5fdW5iaW5kKHVpU291cmNlQ29kZSk7fQpfc2V0UHJvamVjdChwcm9qZWN0KXtpZihwcm9qZWN0PT09dGhpcy5fcHJvamVjdCkKcmV0dXJuO2lmKHRoaXMuX3Byb2plY3QpCnRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlcygpLmZvckVhY2godGhpcy5fZmlsZXN5c3RlbVVJU291cmNlQ29kZVJlbW92ZWQuYmluZCh0aGlzKSk7dGhpcy5fcHJvamVjdD1wcm9qZWN0O2lmKHRoaXMuX3Byb2plY3QpCnRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlcygpLmZvckVhY2godGhpcy5fZmlsZXN5c3RlbVVJU291cmNlQ29kZUFkZGVkLmJpbmQodGhpcykpO3RoaXMuX3VwZGF0ZUFjdGl2ZVByb2plY3QoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJzaXN0ZW5jZS5OZXR3b3JrUGVyc2lzdGVuY2VNYW5hZ2VyLkV2ZW50cy5Qcm9qZWN0Q2hhbmdlZCx0aGlzLl9wcm9qZWN0KTt9Cl9vblByb2plY3RBZGRlZChwcm9qZWN0KXtpZihwcm9qZWN0LnR5cGUoKSE9PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbXx8UGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuZmlsZVN5c3RlbVR5cGUocHJvamVjdCkhPT0nb3ZlcnJpZGVzJykKcmV0dXJuO2NvbnN0IGZpbGVTeXN0ZW1QYXRoPVBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLmZpbGVTeXN0ZW1QYXRoKHByb2plY3QuaWQoKSk7aWYoIWZpbGVTeXN0ZW1QYXRoKQpyZXR1cm47aWYodGhpcy5fcHJvamVjdCkKdGhpcy5fcHJvamVjdC5yZW1vdmUoKTt0aGlzLl9zZXRQcm9qZWN0KHByb2plY3QpO30KX29uUHJvamVjdFJlbW92ZWQocHJvamVjdCl7aWYocHJvamVjdCE9PXRoaXMuX3Byb2plY3QpCnJldHVybjt0aGlzLl9zZXRQcm9qZWN0KG51bGwpO30KYXN5bmMgX2ludGVyY2VwdGlvbkhhbmRsZXIoaW50ZXJjZXB0ZWRSZXF1ZXN0KXtjb25zdCBtZXRob2Q9aW50ZXJjZXB0ZWRSZXF1ZXN0LnJlcXVlc3QubWV0aG9kO2lmKCF0aGlzLl9hY3RpdmV8fChtZXRob2QhPT0nR0VUJyYmbWV0aG9kIT09J1BPU1QnKSkKcmV0dXJuO2NvbnN0IHBhdGg9dGhpcy5fcHJvamVjdC5maWxlU3lzdGVtUGF0aCgpKycvJyt0aGlzLl9lbmNvZGVkUGF0aEZyb21VcmwoaW50ZXJjZXB0ZWRSZXF1ZXN0LnJlcXVlc3QudXJsKTtjb25zdCBmaWxlU3lzdGVtVUlTb3VyY2VDb2RlPXRoaXMuX3Byb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKHBhdGgpO2lmKCFmaWxlU3lzdGVtVUlTb3VyY2VDb2RlKQpyZXR1cm47bGV0IG1pbWVUeXBlPScnO2lmKGludGVyY2VwdGVkUmVxdWVzdC5yZXNwb25zZUhlYWRlcnMpe2NvbnN0IHJlc3BvbnNlSGVhZGVycz1TREsuTmV0d29ya01hbmFnZXIubG93ZXJjYXNlSGVhZGVycyhpbnRlcmNlcHRlZFJlcXVlc3QucmVzcG9uc2VIZWFkZXJzKTttaW1lVHlwZT1yZXNwb25zZUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO30KaWYoIW1pbWVUeXBlKXtjb25zdCBleHBlY3RlZFJlc291cmNlVHlwZT1Db21tb24ucmVzb3VyY2VUeXBlc1tpbnRlcmNlcHRlZFJlcXVlc3QucmVzb3VyY2VUeXBlXXx8Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXI7bWltZVR5cGU9ZmlsZVN5c3RlbVVJU291cmNlQ29kZS5taW1lVHlwZSgpO2lmKENvbW1vbi5SZXNvdXJjZVR5cGUuZnJvbU1pbWVUeXBlKG1pbWVUeXBlKSE9PWV4cGVjdGVkUmVzb3VyY2VUeXBlKQptaW1lVHlwZT1leHBlY3RlZFJlc291cmNlVHlwZS5jYW5vbmljYWxNaW1lVHlwZSgpO30KY29uc3QgcHJvamVjdD0oZmlsZVN5c3RlbVVJU291cmNlQ29kZS5wcm9qZWN0KCkpO2ZpbGVTeXN0ZW1VSVNvdXJjZUNvZGVbdGhpcy5fb3JpZ2luYWxSZXNwb25zZUNvbnRlbnRQcm9taXNlU3ltYm9sXT1pbnRlcmNlcHRlZFJlcXVlc3QucmVzcG9uc2VCb2R5KCkudGhlbihyZXNwb25zZT0+e2lmKHJlc3BvbnNlLmVycm9yfHxyZXNwb25zZS5jb250ZW50PT09bnVsbCkKcmV0dXJuIG51bGw7cmV0dXJuIHJlc3BvbnNlLmVuY29kZWQ/YXRvYihyZXNwb25zZS5jb250ZW50KTpyZXNwb25zZS5jb250ZW50O30pO2NvbnN0IGJsb2I9YXdhaXQgcHJvamVjdC5yZXF1ZXN0RmlsZUJsb2IoZmlsZVN5c3RlbVVJU291cmNlQ29kZSk7aW50ZXJjZXB0ZWRSZXF1ZXN0LmNvbnRpbnVlUmVxdWVzdFdpdGhDb250ZW50KG5ldyBCbG9iKFtibG9iXSx7dHlwZTptaW1lVHlwZX0pKTt9fTtQZXJzaXN0ZW5jZS5OZXR3b3JrUGVyc2lzdGVuY2VNYW5hZ2VyLl9yZXNlcnZlZEZpbGVOYW1lcz1uZXcgU2V0KFsnY29uJywncHJuJywnYXV4JywnbnVsJywnY29tMScsJ2NvbTInLCdjb20zJywnY29tNCcsJ2NvbTUnLCdjb202JywnY29tNycsJ2NvbTgnLCdjb205JywnbHB0MScsJ2xwdDInLCdscHQzJywnbHB0NCcsJ2xwdDUnLCdscHQ2JywnbHB0NycsJ2xwdDgnLCdscHQ5J10pO1BlcnNpc3RlbmNlLk5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIuRXZlbnRzPXtQcm9qZWN0Q2hhbmdlZDpTeW1ib2woJ1Byb2plY3RDaGFuZ2VkJyl9O1BlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXI7O1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcih3b3Jrc3BhY2UsYnJlYWtwb2ludE1hbmFnZXIpe3N1cGVyKCk7dGhpcy5fd29ya3NwYWNlPXdvcmtzcGFjZTt0aGlzLl9icmVha3BvaW50TWFuYWdlcj1icmVha3BvaW50TWFuYWdlcjt0aGlzLl9maWxlUGF0aFByZWZpeGVzVG9CaW5kaW5nQ291bnQ9bmV3IE1hcCgpO3RoaXMuX3N1YnNjcmliZWRCaW5kaW5nRXZlbnRMaXN0ZW5lcnM9bmV3IE11bHRpbWFwKCk7Y29uc3QgbGlua0RlY29yYXRvcj1uZXcgUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVdGlscy5MaW5rRGVjb3JhdG9yKHRoaXMpO0NvbXBvbmVudHMuTGlua2lmaWVyLnNldExpbmtEZWNvcmF0b3IobGlua0RlY29yYXRvcik7dGhpcy5fbWFwcGluZz1udWxsO3RoaXMuc2V0QXV0b21hcHBpbmdFbmFibGVkKHRydWUpO30Kc2V0QXV0b21hcHBpbmdFbmFibGVkKGVuYWJsZWQpe2lmKGVuYWJsZWQ9PT0hIXRoaXMuX21hcHBpbmcpCnJldHVybjtpZighZW5hYmxlZCl7dGhpcy5fbWFwcGluZy5kaXNwb3NlKCk7dGhpcy5fbWFwcGluZz1udWxsO31lbHNle3RoaXMuX21hcHBpbmc9bmV3IFBlcnNpc3RlbmNlLkF1dG9tYXBwaW5nKHRoaXMuX3dvcmtzcGFjZSx0aGlzLl9vblN0YXR1c0FkZGVkLmJpbmQodGhpcyksdGhpcy5fb25TdGF0dXNSZW1vdmVkLmJpbmQodGhpcykpO319CmFkZEJpbmRpbmcoYmluZGluZyl7dGhpcy5faW5uZXJBZGRCaW5kaW5nKGJpbmRpbmcpO30KYWRkQmluZGluZ0ZvclRlc3QoYmluZGluZyl7dGhpcy5faW5uZXJBZGRCaW5kaW5nKGJpbmRpbmcpO30KcmVtb3ZlQmluZGluZyhiaW5kaW5nKXt0aGlzLl9pbm5lclJlbW92ZUJpbmRpbmcoYmluZGluZyk7fQpyZW1vdmVCaW5kaW5nRm9yVGVzdChiaW5kaW5nKXt0aGlzLl9pbm5lclJlbW92ZUJpbmRpbmcoYmluZGluZyk7fQpfaW5uZXJBZGRCaW5kaW5nKGJpbmRpbmcpe2JpbmRpbmcubmV0d29ya1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fYmluZGluZ109YmluZGluZztiaW5kaW5nLmZpbGVTeXN0ZW1bUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX2JpbmRpbmddPWJpbmRpbmc7YmluZGluZy5maWxlU3lzdGVtLmZvcmNlTG9hZE9uQ2hlY2tDb250ZW50KCk7YmluZGluZy5uZXR3b3JrLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcy5fb25Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTtiaW5kaW5nLmZpbGVTeXN0ZW0uYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl9vbldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMpO2JpbmRpbmcubmV0d29yay5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzLl9vbldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTtiaW5kaW5nLmZpbGVTeXN0ZW0uYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdGhpcy5fb25Xb3JraW5nQ29weUNoYW5nZWQsdGhpcyk7dGhpcy5fYWRkRmlsZVBhdGhCaW5kaW5nUHJlZml4ZXMoYmluZGluZy5maWxlU3lzdGVtLnVybCgpKTt0aGlzLl9tb3ZlQnJlYWtwb2ludHMoYmluZGluZy5maWxlU3lzdGVtLGJpbmRpbmcubmV0d29yayk7Y29uc29sZS5hc3NlcnQoIWJpbmRpbmcuZmlsZVN5c3RlbS5pc0RpcnR5KCl8fCFiaW5kaW5nLm5ldHdvcmsuaXNEaXJ0eSgpKTtpZihiaW5kaW5nLmZpbGVTeXN0ZW0uaXNEaXJ0eSgpKXt0aGlzLl9zeW5jV29ya2luZ0NvcHkoYmluZGluZy5maWxlU3lzdGVtKTt9ZWxzZSBpZihiaW5kaW5nLm5ldHdvcmsuaXNEaXJ0eSgpKXt0aGlzLl9zeW5jV29ya2luZ0NvcHkoYmluZGluZy5uZXR3b3JrKTt9ZWxzZSBpZihiaW5kaW5nLm5ldHdvcmsuaGFzQ29tbWl0cygpJiZiaW5kaW5nLm5ldHdvcmsuY29udGVudCgpIT09YmluZGluZy5maWxlU3lzdGVtLmNvbnRlbnQoKSl7YmluZGluZy5uZXR3b3JrLnNldFdvcmtpbmdDb3B5KGJpbmRpbmcubmV0d29yay5jb250ZW50KCkpO3RoaXMuX3N5bmNXb3JraW5nQ29weShiaW5kaW5nLm5ldHdvcmspO30KdGhpcy5fbm90aWZ5QmluZGluZ0V2ZW50KGJpbmRpbmcubmV0d29yayk7dGhpcy5fbm90aWZ5QmluZGluZ0V2ZW50KGJpbmRpbmcuZmlsZVN5c3RlbSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuRXZlbnRzLkJpbmRpbmdDcmVhdGVkLGJpbmRpbmcpO30KX2lubmVyUmVtb3ZlQmluZGluZyhiaW5kaW5nKXtpZihiaW5kaW5nLm5ldHdvcmtbUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX2JpbmRpbmddIT09YmluZGluZykKcmV0dXJuO2NvbnNvbGUuYXNzZXJ0KGJpbmRpbmcubmV0d29ya1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fYmluZGluZ109PT1iaW5kaW5nLmZpbGVTeXN0ZW1bUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX2JpbmRpbmddLCdFUlJPUjogaW5jb25zaXN0ZW50IGJpbmRpbmcgZm9yIG5ldHdvcmtVUkwgJytiaW5kaW5nLm5ldHdvcmsudXJsKCkpO2JpbmRpbmcubmV0d29ya1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fYmluZGluZ109bnVsbDtiaW5kaW5nLmZpbGVTeXN0ZW1bUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX2JpbmRpbmddPW51bGw7YmluZGluZy5uZXR3b3JrLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcy5fb25Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTtiaW5kaW5nLmZpbGVTeXN0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl9vbldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMpO2JpbmRpbmcubmV0d29yay5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzLl9vbldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTtiaW5kaW5nLmZpbGVTeXN0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdGhpcy5fb25Xb3JraW5nQ29weUNoYW5nZWQsdGhpcyk7dGhpcy5fcmVtb3ZlRmlsZVBhdGhCaW5kaW5nUHJlZml4ZXMoYmluZGluZy5maWxlU3lzdGVtLnVybCgpKTt0aGlzLl9icmVha3BvaW50TWFuYWdlci5jb3B5QnJlYWtwb2ludHMoYmluZGluZy5uZXR3b3JrLnVybCgpLGJpbmRpbmcuZmlsZVN5c3RlbSk7dGhpcy5fbm90aWZ5QmluZGluZ0V2ZW50KGJpbmRpbmcubmV0d29yayk7dGhpcy5fbm90aWZ5QmluZGluZ0V2ZW50KGJpbmRpbmcuZmlsZVN5c3RlbSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuRXZlbnRzLkJpbmRpbmdSZW1vdmVkLGJpbmRpbmcpO30KX29uU3RhdHVzQWRkZWQoc3RhdHVzKXtjb25zdCBiaW5kaW5nPW5ldyBQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUJpbmRpbmcoc3RhdHVzLm5ldHdvcmssc3RhdHVzLmZpbGVTeXN0ZW0pO3N0YXR1c1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fYmluZGluZ109YmluZGluZzt0aGlzLl9pbm5lckFkZEJpbmRpbmcoYmluZGluZyk7fQpfb25TdGF0dXNSZW1vdmVkKHN0YXR1cyl7Y29uc3QgYmluZGluZz0oc3RhdHVzW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9iaW5kaW5nXSk7dGhpcy5faW5uZXJSZW1vdmVCaW5kaW5nKGJpbmRpbmcpO30KX29uV29ya2luZ0NvcHlDaGFuZ2VkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3N5bmNXb3JraW5nQ29weSh1aVNvdXJjZUNvZGUpO30KX3N5bmNXb3JraW5nQ29weSh1aVNvdXJjZUNvZGUpe2NvbnN0IGJpbmRpbmc9dWlTb3VyY2VDb2RlW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9iaW5kaW5nXTtpZighYmluZGluZ3x8YmluZGluZ1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fbXV0ZVdvcmtpbmdDb3B5XSkKcmV0dXJuO2NvbnN0IG90aGVyPWJpbmRpbmcubmV0d29yaz09PXVpU291cmNlQ29kZT9iaW5kaW5nLmZpbGVTeXN0ZW06YmluZGluZy5uZXR3b3JrO2lmKCF1aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKXtiaW5kaW5nW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9tdXRlV29ya2luZ0NvcHldPXRydWU7b3RoZXIucmVzZXRXb3JraW5nQ29weSgpO2JpbmRpbmdbUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX211dGVXb3JraW5nQ29weV09ZmFsc2U7dGhpcy5fY29udGVudFN5bmNlZEZvclRlc3QoKTtyZXR1cm47fQpjb25zdCB0YXJnZXQ9QmluZGluZ3MuTmV0d29ya1Byb2plY3QudGFyZ2V0Rm9yVUlTb3VyY2VDb2RlKGJpbmRpbmcubmV0d29yayk7aWYodGFyZ2V0LmlzTm9kZUpTKCkpe2NvbnN0IG5ld0NvbnRlbnQ9dWlTb3VyY2VDb2RlLndvcmtpbmdDb3B5KCk7b3RoZXIucmVxdWVzdENvbnRlbnQoKS50aGVuKCgpPT57Y29uc3Qgbm9kZUpTQ29udGVudD1QZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5yZXdyYXBOb2RlSlNDb250ZW50KG90aGVyLG90aGVyLndvcmtpbmdDb3B5KCksbmV3Q29udGVudCk7c2V0V29ya2luZ0NvcHkuY2FsbCh0aGlzLCgpPT5ub2RlSlNDb250ZW50KTt9KTtyZXR1cm47fQpzZXRXb3JraW5nQ29weS5jYWxsKHRoaXMsKCk9PnVpU291cmNlQ29kZS53b3JraW5nQ29weSgpKTtmdW5jdGlvbiBzZXRXb3JraW5nQ29weSh3b3JraW5nQ29weUdldHRlcil7YmluZGluZ1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fbXV0ZVdvcmtpbmdDb3B5XT10cnVlO290aGVyLnNldFdvcmtpbmdDb3B5R2V0dGVyKHdvcmtpbmdDb3B5R2V0dGVyKTtiaW5kaW5nW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9tdXRlV29ya2luZ0NvcHldPWZhbHNlO3RoaXMuX2NvbnRlbnRTeW5jZWRGb3JUZXN0KCk7fX0KX29uV29ya2luZ0NvcHlDb21taXR0ZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO2NvbnN0IG5ld0NvbnRlbnQ9KGV2ZW50LmRhdGEuY29udGVudCk7dGhpcy5zeW5jQ29udGVudCh1aVNvdXJjZUNvZGUsbmV3Q29udGVudCxldmVudC5kYXRhLmVuY29kZWQpO30Kc3luY0NvbnRlbnQodWlTb3VyY2VDb2RlLG5ld0NvbnRlbnQsZW5jb2RlZCl7Y29uc3QgYmluZGluZz11aVNvdXJjZUNvZGVbUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX2JpbmRpbmddO2lmKCFiaW5kaW5nfHxiaW5kaW5nW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9tdXRlQ29tbWl0XSkKcmV0dXJuO2NvbnN0IG90aGVyPWJpbmRpbmcubmV0d29yaz09PXVpU291cmNlQ29kZT9iaW5kaW5nLmZpbGVTeXN0ZW06YmluZGluZy5uZXR3b3JrO2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUoYmluZGluZy5uZXR3b3JrKTtpZih0YXJnZXQuaXNOb2RlSlMoKSl7b3RoZXIucmVxdWVzdENvbnRlbnQoKS50aGVuKGN1cnJlbnRDb250ZW50PT57Y29uc3Qgbm9kZUpTQ29udGVudD1QZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5yZXdyYXBOb2RlSlNDb250ZW50KG90aGVyLGN1cnJlbnRDb250ZW50LG5ld0NvbnRlbnQpO3NldENvbnRlbnQuY2FsbCh0aGlzLG5vZGVKU0NvbnRlbnQpO30pO3JldHVybjt9CnNldENvbnRlbnQuY2FsbCh0aGlzLG5ld0NvbnRlbnQpO2Z1bmN0aW9uIHNldENvbnRlbnQobmV3Q29udGVudCl7YmluZGluZ1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fbXV0ZUNvbW1pdF09dHJ1ZTtvdGhlci5zZXRDb250ZW50KG5ld0NvbnRlbnQsZW5jb2RlZCk7YmluZGluZ1tQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fbXV0ZUNvbW1pdF09ZmFsc2U7dGhpcy5fY29udGVudFN5bmNlZEZvclRlc3QoKTt9fQpzdGF0aWMgcmV3cmFwTm9kZUpTQ29udGVudCh1aVNvdXJjZUNvZGUsY3VycmVudENvbnRlbnQsbmV3Q29udGVudCl7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pe2lmKG5ld0NvbnRlbnQuc3RhcnRzV2l0aChQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVByZWZpeCkmJm5ld0NvbnRlbnQuZW5kc1dpdGgoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX05vZGVTdWZmaXgpKXtuZXdDb250ZW50PW5ld0NvbnRlbnQuc3Vic3RyaW5nKFBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9Ob2RlUHJlZml4Lmxlbmd0aCxuZXdDb250ZW50Lmxlbmd0aC1QZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVN1ZmZpeC5sZW5ndGgpO30KaWYoY3VycmVudENvbnRlbnQuc3RhcnRzV2l0aChQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVNoZWJhbmcpKQpuZXdDb250ZW50PVBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9Ob2RlU2hlYmFuZytuZXdDb250ZW50O31lbHNle2lmKG5ld0NvbnRlbnQuc3RhcnRzV2l0aChQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVNoZWJhbmcpKQpuZXdDb250ZW50PW5ld0NvbnRlbnQuc3Vic3RyaW5nKFBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9Ob2RlU2hlYmFuZy5sZW5ndGgpO2lmKGN1cnJlbnRDb250ZW50LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX05vZGVQcmVmaXgpJiZjdXJyZW50Q29udGVudC5lbmRzV2l0aChQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVN1ZmZpeCkpCm5ld0NvbnRlbnQ9UGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX05vZGVQcmVmaXgrbmV3Q29udGVudCtQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVN1ZmZpeDt9CnJldHVybiBuZXdDb250ZW50O30KX2NvbnRlbnRTeW5jZWRGb3JUZXN0KCl7fQpfbW92ZUJyZWFrcG9pbnRzKGZyb20sdG8pe2NvbnN0IGJyZWFrcG9pbnRzPXRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLmJyZWFrcG9pbnRzRm9yVUlTb3VyY2VDb2RlKGZyb20pO2Zvcihjb25zdCBicmVha3BvaW50IG9mIGJyZWFrcG9pbnRzKXticmVha3BvaW50LnJlbW92ZShmYWxzZSk7dGhpcy5fYnJlYWtwb2ludE1hbmFnZXIuc2V0QnJlYWtwb2ludCh0byxicmVha3BvaW50LmxpbmVOdW1iZXIoKSxicmVha3BvaW50LmNvbHVtbk51bWJlcigpLGJyZWFrcG9pbnQuY29uZGl0aW9uKCksYnJlYWtwb2ludC5lbmFibGVkKCkpO319Cmhhc1Vuc2F2ZWRDb21taXR0ZWRDaGFuZ2VzKHVpU291cmNlQ29kZSl7aWYodGhpcy5fd29ya3NwYWNlLmhhc1Jlc291cmNlQ29udGVudFRyYWNraW5nRXh0ZW5zaW9ucygpKQpyZXR1cm4gZmFsc2U7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS5jYW5TZXRGaWxlQ29udGVudCgpKQpyZXR1cm4gZmFsc2U7aWYodWlTb3VyY2VDb2RlW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9iaW5kaW5nXSkKcmV0dXJuIGZhbHNlO3JldHVybiEhdWlTb3VyY2VDb2RlLmhhc0NvbW1pdHMoKTt9CmJpbmRpbmcodWlTb3VyY2VDb2RlKXtyZXR1cm4gdWlTb3VyY2VDb2RlW1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9iaW5kaW5nXXx8bnVsbDt9CnN1YnNjcmliZUZvckJpbmRpbmdFdmVudCh1aVNvdXJjZUNvZGUsbGlzdGVuZXIpe3RoaXMuX3N1YnNjcmliZWRCaW5kaW5nRXZlbnRMaXN0ZW5lcnMuc2V0KHVpU291cmNlQ29kZSxsaXN0ZW5lcik7fQp1bnN1YnNjcmliZUZyb21CaW5kaW5nRXZlbnQodWlTb3VyY2VDb2RlLGxpc3RlbmVyKXt0aGlzLl9zdWJzY3JpYmVkQmluZGluZ0V2ZW50TGlzdGVuZXJzLmRlbGV0ZSh1aVNvdXJjZUNvZGUsbGlzdGVuZXIpO30KX25vdGlmeUJpbmRpbmdFdmVudCh1aVNvdXJjZUNvZGUpe2lmKCF0aGlzLl9zdWJzY3JpYmVkQmluZGluZ0V2ZW50TGlzdGVuZXJzLmhhcyh1aVNvdXJjZUNvZGUpKQpyZXR1cm47Y29uc3QgbGlzdGVuZXJzPUFycmF5LmZyb20odGhpcy5fc3Vic2NyaWJlZEJpbmRpbmdFdmVudExpc3RlbmVycy5nZXQodWlTb3VyY2VDb2RlKSk7Zm9yKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykKbGlzdGVuZXIuY2FsbChudWxsKTt9CmZpbGVTeXN0ZW0odWlTb3VyY2VDb2RlKXtjb25zdCBiaW5kaW5nPXRoaXMuYmluZGluZyh1aVNvdXJjZUNvZGUpO3JldHVybiBiaW5kaW5nP2JpbmRpbmcuZmlsZVN5c3RlbTpudWxsO30KbmV0d29yayh1aVNvdXJjZUNvZGUpe2NvbnN0IGJpbmRpbmc9dGhpcy5iaW5kaW5nKHVpU291cmNlQ29kZSk7cmV0dXJuIGJpbmRpbmc/YmluZGluZy5uZXR3b3JrOm51bGw7fQpfYWRkRmlsZVBhdGhCaW5kaW5nUHJlZml4ZXMoZmlsZVBhdGgpe2xldCByZWxhdGl2ZT0nJztmb3IoY29uc3QgdG9rZW4gb2YgZmlsZVBhdGguc3BsaXQoJy8nKSl7cmVsYXRpdmUrPXRva2VuKycvJztjb25zdCBjb3VudD10aGlzLl9maWxlUGF0aFByZWZpeGVzVG9CaW5kaW5nQ291bnQuZ2V0KHJlbGF0aXZlKXx8MDt0aGlzLl9maWxlUGF0aFByZWZpeGVzVG9CaW5kaW5nQ291bnQuc2V0KHJlbGF0aXZlLGNvdW50KzEpO319Cl9yZW1vdmVGaWxlUGF0aEJpbmRpbmdQcmVmaXhlcyhmaWxlUGF0aCl7bGV0IHJlbGF0aXZlPScnO2Zvcihjb25zdCB0b2tlbiBvZiBmaWxlUGF0aC5zcGxpdCgnLycpKXtyZWxhdGl2ZSs9dG9rZW4rJy8nO2NvbnN0IGNvdW50PXRoaXMuX2ZpbGVQYXRoUHJlZml4ZXNUb0JpbmRpbmdDb3VudC5nZXQocmVsYXRpdmUpO2lmKGNvdW50PT09MSkKdGhpcy5fZmlsZVBhdGhQcmVmaXhlc1RvQmluZGluZ0NvdW50LmRlbGV0ZShyZWxhdGl2ZSk7ZWxzZQp0aGlzLl9maWxlUGF0aFByZWZpeGVzVG9CaW5kaW5nQ291bnQuc2V0KHJlbGF0aXZlLGNvdW50LTEpO319CmZpbGVQYXRoSGFzQmluZGluZ3MoZmlsZVBhdGgpe2lmKCFmaWxlUGF0aC5lbmRzV2l0aCgnLycpKQpmaWxlUGF0aCs9Jy8nO3JldHVybiB0aGlzLl9maWxlUGF0aFByZWZpeGVzVG9CaW5kaW5nQ291bnQuaGFzKGZpbGVQYXRoKTt9CmRpc3Bvc2UoKXtpZih0aGlzLl9tYXBwaW5nKXt0aGlzLl9tYXBwaW5nLmRpc3Bvc2UoKTt0aGlzLl9tYXBwaW5nPW51bGw7fX19O1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9iaW5kaW5nPVN5bWJvbCgnUGVyc2lzdGVuY2UuQmluZGluZycpO1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9tdXRlQ29tbWl0PVN5bWJvbCgnUGVyc2lzdGVuY2UuTXV0ZUNvbW1pdCcpO1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9tdXRlV29ya2luZ0NvcHk9U3ltYm9sKCdQZXJzaXN0ZW5jZS5NdXRlV29ya2luZ0NvcHknKTtQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5fTm9kZVByZWZpeD0nKGZ1bmN0aW9uIChleHBvcnRzLCByZXF1aXJlLCBtb2R1bGUsIF9fZmlsZW5hbWUsIF9fZGlybmFtZSkgeyAnO1BlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLl9Ob2RlU3VmZml4PSdcbn0pOyc7UGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuX05vZGVTaGViYW5nPScjIS91c3IvYmluL2VudiBub2RlJztQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5FdmVudHM9e0JpbmRpbmdDcmVhdGVkOlN5bWJvbCgnQmluZGluZ0NyZWF0ZWQnKSxCaW5kaW5nUmVtb3ZlZDpTeW1ib2woJ0JpbmRpbmdSZW1vdmVkJyl9O1BlcnNpc3RlbmNlLlBhdGhFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZW5jb2Rlcj1uZXcgQ29tbW9uLkNoYXJhY3RlcklkTWFwKCk7fQplbmNvZGUocGF0aCl7cmV0dXJuIHBhdGguc3BsaXQoJy8nKS5tYXAodG9rZW49PnRoaXMuX2VuY29kZXIudG9DaGFyKHRva2VuKSkuam9pbignJyk7fQpkZWNvZGUocGF0aCl7cmV0dXJuIHBhdGguc3BsaXQoJycpLm1hcCh0b2tlbj0+dGhpcy5fZW5jb2Rlci5mcm9tQ2hhcih0b2tlbikpLmpvaW4oJy8nKTt9fTtQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUJpbmRpbmc9Y2xhc3N7Y29uc3RydWN0b3IobmV0d29yayxmaWxlU3lzdGVtKXt0aGlzLm5ldHdvcms9bmV0d29yazt0aGlzLmZpbGVTeXN0ZW09ZmlsZVN5c3RlbTt9fTtQZXJzaXN0ZW5jZS5NYXBwaW5nU3lzdGVtPWZ1bmN0aW9uKCl7fTtQZXJzaXN0ZW5jZS5NYXBwaW5nU3lzdGVtLnByb3RvdHlwZT17ZGlzcG9zZTpmdW5jdGlvbigpe319O1BlcnNpc3RlbmNlLnBlcnNpc3RlbmNlOztQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUFjdGlvbnM9e307UGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBY3Rpb25zLkNvbnRleHRNZW51UHJvdmlkZXI9Y2xhc3N7YXBwZW5kQXBwbGljYWJsZUl0ZW1zKGV2ZW50LGNvbnRleHRNZW51LHRhcmdldCl7Y29uc3QgY29udGVudFByb3ZpZGVyPSh0YXJnZXQpO2FzeW5jIGZ1bmN0aW9uIHNhdmVBcygpe2lmKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUpCihjb250ZW50UHJvdmlkZXIpLmNvbW1pdFdvcmtpbmdDb3B5KCk7Y29uc3QgY29udGVudD1hd2FpdCBjb250ZW50UHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKTtjb25zdCB1cmw9Y29udGVudFByb3ZpZGVyLmNvbnRlbnRVUkwoKTtXb3Jrc3BhY2UuZmlsZU1hbmFnZXIuc2F2ZSh1cmwsKGNvbnRlbnQpLHRydWUpO1dvcmtzcGFjZS5maWxlTWFuYWdlci5jbG9zZSh1cmwpO30KaWYoY29udGVudFByb3ZpZGVyLmNvbnRlbnRUeXBlKCkuaXNEb2N1bWVudE9yU2NyaXB0T3JTdHlsZVNoZWV0KCkpCmNvbnRleHRNZW51LnNhdmVTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1NhdmUgYXMuLi4nKSxzYXZlQXMpO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTChjb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpKTtpZih1aVNvdXJjZUNvZGUmJlBlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIuY2FuU2F2ZVVJU291cmNlQ29kZUZvck92ZXJyaWRlcyh1aVNvdXJjZUNvZGUpKXtjb250ZXh0TWVudS5zYXZlU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTYXZlIGZvciBvdmVycmlkZXMnKSwoKT0+e3VpU291cmNlQ29kZS5jb21taXRXb3JraW5nQ29weSgpO1BlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIuc2F2ZVVJU291cmNlQ29kZUZvck92ZXJyaWRlcygodWlTb3VyY2VDb2RlKSk7Q29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUpO30pO30KY29uc3QgYmluZGluZz11aVNvdXJjZUNvZGUmJlBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLmJpbmRpbmcodWlTb3VyY2VDb2RlKTtjb25zdCBmaWxlVVJMPWJpbmRpbmc/YmluZGluZy5maWxlU3lzdGVtLmNvbnRlbnRVUkwoKTpjb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpO2lmKGZpbGVVUkwuc3RhcnRzV2l0aCgnZmlsZTovLycpKXtjb25zdCBwYXRoPUNvbW1vbi5QYXJzZWRVUkwudXJsVG9QbGF0Zm9ybVBhdGgoZmlsZVVSTCxIb3N0LmlzV2luKCkpO2NvbnRleHRNZW51LnJldmVhbFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnT3BlbiBpbiBjb250YWluaW5nIGZvbGRlcicpLCgpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Quc2hvd0l0ZW1JbkZvbGRlcihwYXRoKSk7fX19OztQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVV0aWxzPWNsYXNze3N0YXRpYyB0b29sdGlwRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7aWYoIWJpbmRpbmcpCnJldHVybicnO2lmKHVpU291cmNlQ29kZT09PWJpbmRpbmcubmV0d29yayl7Y29uc3QgcGF0aD1Db21tb24uUGFyc2VkVVJMLnVybFRvUGxhdGZvcm1QYXRoKGJpbmRpbmcuZmlsZVN5c3RlbS51cmwoKSxIb3N0LmlzV2luKCkpLnRyaW1NaWRkbGUoMTUwKTtyZXR1cm4gbHNgTGlua2VkIHRvICR7cGF0aH1gO30KaWYoYmluZGluZy5uZXR3b3JrLmNvbnRlbnRUeXBlKCkuaXNGcm9tU291cmNlTWFwKCkpCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0xpbmtlZCB0byBzb3VyY2UgbWFwOiAlcycsYmluZGluZy5uZXR3b3JrLnVybCgpLnRyaW1NaWRkbGUoMTUwKSk7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnTGlua2VkIHRvICVzJyxiaW5kaW5nLm5ldHdvcmsudXJsKCkudHJpbU1pZGRsZSgxNTApKTt9CnN0YXRpYyBpY29uRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7aWYoYmluZGluZyl7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1maWxlLXN5bmMnKTtpY29uLnRpdGxlPVBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVXRpbHMudG9vbHRpcEZvclVJU291cmNlQ29kZShiaW5kaW5nLm5ldHdvcmspO2lmKFBlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIucHJvamVjdCgpPT09YmluZGluZy5maWxlU3lzdGVtLnByb2plY3QoKSkKaWNvbi5zdHlsZS5maWx0ZXI9J2h1ZS1yb3RhdGUoMTYwZGVnKSc7cmV0dXJuIGljb247fQppZih1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKSE9PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSkKcmV0dXJuIG51bGw7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1maWxlJyk7aWNvbi50aXRsZT1QZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVV0aWxzLnRvb2x0aXBGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtyZXR1cm4gaWNvbjt9fTtQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVV0aWxzLkxpbmtEZWNvcmF0b3I9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHBlcnNpc3RlbmNlKXtzdXBlcigpO3BlcnNpc3RlbmNlLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuRXZlbnRzLkJpbmRpbmdDcmVhdGVkLHRoaXMuX2JpbmRpbmdDaGFuZ2VkLHRoaXMpO3BlcnNpc3RlbmNlLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UuRXZlbnRzLkJpbmRpbmdSZW1vdmVkLHRoaXMuX2JpbmRpbmdDaGFuZ2VkLHRoaXMpO30KX2JpbmRpbmdDaGFuZ2VkKGV2ZW50KXtjb25zdCBiaW5kaW5nPShldmVudC5kYXRhKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhDb21wb25lbnRzLkxpbmtEZWNvcmF0b3IuRXZlbnRzLkxpbmtJY29uQ2hhbmdlZCxiaW5kaW5nLm5ldHdvcmspO30KbGlua0ljb24odWlTb3VyY2VDb2RlKXtyZXR1cm4gUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVdGlscy5pY29uRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7fX07O1BlcnNpc3RlbmNlLkVkaXRGaWxlU3lzdGVtVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoZmlsZVN5c3RlbVBhdGgpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncGVyc2lzdGVuY2UvZWRpdEZpbGVTeXN0ZW1WaWV3LmNzcycpO3RoaXMuX2ZpbGVTeXN0ZW1QYXRoPWZpbGVTeXN0ZW1QYXRoO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtQZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRXhjbHVkZWRGb2xkZXJBZGRlZCx0aGlzLl91cGRhdGUsdGhpcyksUGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuRXZlbnRzLkV4Y2x1ZGVkRm9sZGVyUmVtb3ZlZCx0aGlzLl91cGRhdGUsdGhpcyldO2NvbnN0IGV4Y2x1ZGVkRm9sZGVyc0hlYWRlcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmaWxlLXN5c3RlbS1oZWFkZXInKTtleGNsdWRlZEZvbGRlcnNIZWFkZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbGUtc3lzdGVtLWhlYWRlci10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdFeGNsdWRlZCBmb2xkZXJzJyk7ZXhjbHVkZWRGb2xkZXJzSGVhZGVyLmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQnKSx0aGlzLl9hZGRFeGNsdWRlZEZvbGRlckJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSwnYWRkLWJ1dHRvbicpKTt0aGlzLl9leGNsdWRlZEZvbGRlcnNMaXN0PW5ldyBVSS5MaXN0V2lkZ2V0KHRoaXMpO3RoaXMuX2V4Y2x1ZGVkRm9sZGVyc0xpc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWxlLXN5c3RlbS1saXN0Jyk7dGhpcy5fZXhjbHVkZWRGb2xkZXJzTGlzdC5yZWdpc3RlclJlcXVpcmVkQ1NTKCdwZXJzaXN0ZW5jZS9lZGl0RmlsZVN5c3RlbVZpZXcuY3NzJyk7Y29uc3QgZXhjbHVkZWRGb2xkZXJzUGxhY2Vob2xkZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZmlsZS1zeXN0ZW0tbGlzdC1lbXB0eScpO2V4Y2x1ZGVkRm9sZGVyc1BsYWNlaG9sZGVyLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm9uZScpO3RoaXMuX2V4Y2x1ZGVkRm9sZGVyc0xpc3Quc2V0RW1wdHlQbGFjZWhvbGRlcihleGNsdWRlZEZvbGRlcnNQbGFjZWhvbGRlcik7dGhpcy5fZXhjbHVkZWRGb2xkZXJzTGlzdC5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuY29udGVudEVsZW1lbnQudGFiSW5kZXg9MDt0aGlzLl91cGRhdGUoKTt9CmRpc3Bvc2UoKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO30KX3VwZGF0ZSgpe2lmKHRoaXMuX211dGVVcGRhdGUpCnJldHVybjt0aGlzLl9leGNsdWRlZEZvbGRlcnNMaXN0LmNsZWFyKCk7dGhpcy5fZXhjbHVkZWRGb2xkZXJzPVtdO2Zvcihjb25zdCBmb2xkZXIgb2YgUGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5maWxlU3lzdGVtKHRoaXMuX2ZpbGVTeXN0ZW1QYXRoKS5leGNsdWRlZEZvbGRlcnMoKS52YWx1ZXMoKSl7dGhpcy5fZXhjbHVkZWRGb2xkZXJzLnB1c2goZm9sZGVyKTt0aGlzLl9leGNsdWRlZEZvbGRlcnNMaXN0LmFwcGVuZEl0ZW0oZm9sZGVyLHRydWUpO319Cl9hZGRFeGNsdWRlZEZvbGRlckJ1dHRvbkNsaWNrZWQoKXt0aGlzLl9leGNsdWRlZEZvbGRlcnNMaXN0LmFkZE5ld0l0ZW0oMCwnJyk7fQpyZW5kZXJJdGVtKGl0ZW0sZWRpdGFibGUpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZmlsZS1zeXN0ZW0tbGlzdC1pdGVtJyk7Y29uc3QgcGF0aFByZWZpeD0oZWRpdGFibGU/aXRlbTpDb21tb24uVUlTdHJpbmcoJyVzICh2aWEgLmRldnRvb2xzKScsaXRlbSkpO2NvbnN0IHBhdGhQcmVmaXhFbGVtZW50PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbGUtc3lzdGVtLXZhbHVlJyk7cGF0aFByZWZpeEVsZW1lbnQudGV4dENvbnRlbnQ9cGF0aFByZWZpeDtwYXRoUHJlZml4RWxlbWVudC50aXRsZT1wYXRoUHJlZml4O3JldHVybiBlbGVtZW50O30KcmVtb3ZlSXRlbVJlcXVlc3RlZChpdGVtLGluZGV4KXtQZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmZpbGVTeXN0ZW0odGhpcy5fZmlsZVN5c3RlbVBhdGgpLnJlbW92ZUV4Y2x1ZGVkRm9sZGVyKHRoaXMuX2V4Y2x1ZGVkRm9sZGVyc1tpbmRleF0pO30KY29tbWl0RWRpdChpdGVtLGVkaXRvcixpc05ldyl7dGhpcy5fbXV0ZVVwZGF0ZT10cnVlO2lmKCFpc05ldyl7UGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5maWxlU3lzdGVtKHRoaXMuX2ZpbGVTeXN0ZW1QYXRoKS5yZW1vdmVFeGNsdWRlZEZvbGRlcigoaXRlbSkpO30KUGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5maWxlU3lzdGVtKHRoaXMuX2ZpbGVTeXN0ZW1QYXRoKS5hZGRFeGNsdWRlZEZvbGRlcih0aGlzLl9ub3JtYWxpemVQcmVmaXgoZWRpdG9yLmNvbnRyb2woJ3BhdGhQcmVmaXgnKS52YWx1ZSkpO3RoaXMuX211dGVVcGRhdGU9ZmFsc2U7dGhpcy5fdXBkYXRlKCk7fQpiZWdpbkVkaXQoaXRlbSl7Y29uc3QgZWRpdG9yPXRoaXMuX2NyZWF0ZUV4Y2x1ZGVkRm9sZGVyRWRpdG9yKCk7ZWRpdG9yLmNvbnRyb2woJ3BhdGhQcmVmaXgnKS52YWx1ZT1pdGVtO3JldHVybiBlZGl0b3I7fQpfY3JlYXRlRXhjbHVkZWRGb2xkZXJFZGl0b3IoKXtpZih0aGlzLl9leGNsdWRlZEZvbGRlckVkaXRvcikKcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkRm9sZGVyRWRpdG9yO2NvbnN0IGVkaXRvcj1uZXcgVUkuTGlzdFdpZGdldC5FZGl0b3IoKTt0aGlzLl9leGNsdWRlZEZvbGRlckVkaXRvcj1lZGl0b3I7Y29uc3QgY29udGVudD1lZGl0b3IuY29udGVudEVsZW1lbnQoKTtjb25zdCB0aXRsZXM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmlsZS1zeXN0ZW0tZWRpdC1yb3cnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbGUtc3lzdGVtLXZhbHVlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdGb2xkZXIgcGF0aCcpO2NvbnN0IGZpZWxkcz1jb250ZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmaWxlLXN5c3RlbS1lZGl0LXJvdycpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnZmlsZS1zeXN0ZW0tdmFsdWUnKS5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlSW5wdXQoJ3BhdGhQcmVmaXgnLCd0ZXh0JywnL3BhdGgvdG8vZm9sZGVyLycscGF0aFByZWZpeFZhbGlkYXRvci5iaW5kKHRoaXMpKSk7cmV0dXJuIGVkaXRvcjtmdW5jdGlvbiBwYXRoUHJlZml4VmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe2NvbnN0IHByZWZpeD10aGlzLl9ub3JtYWxpemVQcmVmaXgoaW5wdXQudmFsdWUpO2NvbnN0IGNvbmZpZ3VyYWJsZUNvdW50PVBlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuZmlsZVN5c3RlbSh0aGlzLl9maWxlU3lzdGVtUGF0aCkuZXhjbHVkZWRGb2xkZXJzKCkuc2l6ZTtmb3IobGV0IGk9MDtpPGNvbmZpZ3VyYWJsZUNvdW50OysraSl7aWYoaSE9PWluZGV4JiZ0aGlzLl9leGNsdWRlZEZvbGRlcnNbaV09PT1wcmVmaXgpCnJldHVybiBmYWxzZTt9CnJldHVybiEhcHJlZml4O319Cl9ub3JtYWxpemVQcmVmaXgocHJlZml4KXtpZighcHJlZml4KQpyZXR1cm4nJztyZXR1cm4gcHJlZml4KyhwcmVmaXhbcHJlZml4Lmxlbmd0aC0xXT09PScvJz8nJzonLycpO319OztQZXJzaXN0ZW5jZS5Xb3Jrc3BhY2VTZXR0aW5nc1RhYj1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncGVyc2lzdGVuY2Uvd29ya3NwYWNlU2V0dGluZ3NUYWIuY3NzJyk7Y29uc3QgaGVhZGVyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnaGVhZGVyJyk7aGVhZGVyLmNyZWF0ZUNoaWxkKCdoMycpLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1dvcmtzcGFjZScpKTt0aGlzLmNvbnRhaW5lckVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy1jb250YWluZXItd3JhcHBlcicpLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy10YWIgc2V0dGluZ3MtY29udGVudCBzZXR0aW5ncy1jb250YWluZXInKTtQZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRmlsZVN5c3RlbUFkZGVkLGV2ZW50PT50aGlzLl9maWxlU3lzdGVtQWRkZWQoKGV2ZW50LmRhdGEpKSx0aGlzKTtQZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoUGVyc2lzdGVuY2UuSXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5FdmVudHMuRmlsZVN5c3RlbVJlbW92ZWQsZXZlbnQ9PnRoaXMuX2ZpbGVTeXN0ZW1SZW1vdmVkKChldmVudC5kYXRhKSksdGhpcyk7Y29uc3QgZm9sZGVyRXhjbHVkZVBhdHRlcm5JbnB1dD10aGlzLl9jcmVhdGVGb2xkZXJFeGNsdWRlUGF0dGVybklucHV0KCk7Zm9sZGVyRXhjbHVkZVBhdHRlcm5JbnB1dC5jbGFzc0xpc3QuYWRkKCdmb2xkZXItZXhjbHVkZS1wYXR0ZXJuJyk7dGhpcy5jb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGZvbGRlckV4Y2x1ZGVQYXR0ZXJuSW5wdXQpO2NvbnN0IGRpdj10aGlzLmNvbnRhaW5lckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLWluZm8tbWVzc2FnZScpO2Rpdi5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdNYXBwaW5ncyBhcmUgaW5mZXJyZWQgYXV0b21hdGljYWxseS4gUGxlYXNlICcpKTtkaXYuYXBwZW5kQ2hpbGQoVUkuWExpbmsuY3JlYXRlKCdodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2VudHJ5P3RlbXBsYXRlPURlZmVjdCUyMHJlcG9ydCUyMGZyb20lMjB1c2VyJmNvbXBvbmVudHM9UGxhdGZvcm0lM0VEZXZUb29scyUzRUF1dGhvcmluZyZjb21tZW50PURldlRvb2xzJTIwZmFpbGVkJTIwdG8lMjBsaW5rJTIwbmV0d29yayUyMHJlc291cmNlJTIwdG8lMjBmaWxlc3lzdGVtLiUwQSUwQVBsYXRmb3JtJTNBJTIwJTNDTGludXglMkZXaW4lMkZNYWMlM0UlMEFDaHJvbWUlMjB2ZXJzaW9uJTNBJTIwJTNDeW91ciUyMGNocm9tZSUyMHZlcnNpb24lM0UlMEElMEFXaGF0JTIwYXJlJTIwdGhlJTIwZGV0YWlscyUyMG9mJTIweW91ciUyMHByb2plY3QlM0YlMEEtJTIwU291cmNlJTIwY29kZSUyMChpZiUyMGFueSklM0ElMjBodHRwJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmV4YW1wbGUlMkZleGFtcGxlJTBBLSUyMEJ1aWxkJTIwU3lzdGVtJTNBJTIwZ3VscCUyRmdydW50JTJGd2VicGFjayUyRnJvbGx1cCUyRi4uLiUwQS0lMjBIVFRQJTIwc2VydmVyJTNBJTIwbm9kZSUyMEhUVFAlMkZuZ2lueCUyRmFwYWNoZS4uLiUwQSUwQUFzc2V0cyUyMGZhaWxlZCUyMHRvJTIwbGluayUyMChvciUyMGluY29ycmVjdGx5JTIwbGlua2VkKSUzQSUwQTEuJTBBMi4lMEEzLiUwQSUwQUlmJTIwcG9zc2libGUlMkMlMjBwbGVhc2UlMjBhdHRhY2glMjBhJTIwc2NyZWVuc2hvdCUyMG9mJTIwbmV0d29yayUyMHNvdXJjZXMlMjBuYXZpZ2F0b3IlMjB3aGljaCUyMHNob3VsZCUwQXNob3clMjB3aGljaCUyMHJlc291cmNlcyUyMGZhaWxlZCUyMHRvJTIwbWFwJyxDb21tb24uVUlTdHJpbmcoJ3JlcG9ydCcpKSk7ZGl2LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJyBhbnkgYnVncy4nKSk7dGhpcy5fZmlsZVN5c3RlbXNMaXN0Q29udGFpbmVyPXRoaXMuY29udGFpbmVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnJyk7dGhpcy5jb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgZm9sZGVyXHUyMDI2JyksdGhpcy5fYWRkRmlsZVN5c3RlbUNsaWNrZWQuYmluZCh0aGlzKSkpO3RoaXMuX2VsZW1lbnRCeVBhdGg9bmV3IE1hcCgpO3RoaXMuX21hcHBpbmdWaWV3QnlQYXRoPW5ldyBNYXAoKTtjb25zdCBmaWxlU3lzdGVtcz1QZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmZpbGVTeXN0ZW1zKCk7Zm9yKGxldCBpPTA7aTxmaWxlU3lzdGVtcy5sZW5ndGg7KytpKQp0aGlzLl9hZGRJdGVtKGZpbGVTeXN0ZW1zW2ldKTt9Cl9jcmVhdGVGb2xkZXJFeGNsdWRlUGF0dGVybklucHV0KCl7Y29uc3QgcD1jcmVhdGVFbGVtZW50KCdwJyk7Y29uc3QgbGFiZWxFbGVtZW50PXAuY3JlYXRlQ2hpbGQoJ2xhYmVsJyk7bGFiZWxFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRm9sZGVyIGV4Y2x1ZGUgcGF0dGVybicpO2NvbnN0IGlucHV0RWxlbWVudD1VSS5jcmVhdGVJbnB1dCgnJywndGV4dCcpO3AuYXBwZW5kQ2hpbGQoaW5wdXRFbGVtZW50KTtpbnB1dEVsZW1lbnQuc3R5bGUud2lkdGg9JzI3MHB4Jztjb25zdCBmb2xkZXJFeGNsdWRlU2V0dGluZz1QZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLndvcmtzcGFjZUZvbGRlckV4Y2x1ZGVQYXR0ZXJuU2V0dGluZygpO2NvbnN0IHNldFZhbHVlPVVJLmJpbmRJbnB1dChpbnB1dEVsZW1lbnQsZm9sZGVyRXhjbHVkZVNldHRpbmcuc2V0LmJpbmQoZm9sZGVyRXhjbHVkZVNldHRpbmcpLHJlZ2V4VmFsaWRhdG9yLGZhbHNlKTtmb2xkZXJFeGNsdWRlU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+c2V0VmFsdWUuY2FsbChudWxsLGZvbGRlckV4Y2x1ZGVTZXR0aW5nLmdldCgpKSk7c2V0VmFsdWUoZm9sZGVyRXhjbHVkZVNldHRpbmcuZ2V0KCkpO3JldHVybiBwO2Z1bmN0aW9uIHJlZ2V4VmFsaWRhdG9yKHZhbHVlKXtsZXQgcmVnZXg7dHJ5e3JlZ2V4PW5ldyBSZWdFeHAodmFsdWUpO31jYXRjaChlKXt9CnJldHVybiEhcmVnZXg7fX0KX2FkZEl0ZW0oZmlsZVN5c3RlbSl7Y29uc3QgbmV0d29ya1BlcnNpc3RlbmNlUHJvamVjdD1QZXJzaXN0ZW5jZS5uZXR3b3JrUGVyc2lzdGVuY2VNYW5hZ2VyLnByb2plY3QoKTtpZihuZXR3b3JrUGVyc2lzdGVuY2VQcm9qZWN0JiZQZXJzaXN0ZW5jZS5pc29sYXRlZEZpbGVTeXN0ZW1NYW5hZ2VyLmZpbGVTeXN0ZW0obmV0d29ya1BlcnNpc3RlbmNlUHJvamVjdC5maWxlU3lzdGVtUGF0aCgpKT09PWZpbGVTeXN0ZW0pCnJldHVybjtjb25zdCBlbGVtZW50PXRoaXMuX3JlbmRlckZpbGVTeXN0ZW0oZmlsZVN5c3RlbSk7dGhpcy5fZWxlbWVudEJ5UGF0aC5zZXQoZmlsZVN5c3RlbS5wYXRoKCksZWxlbWVudCk7dGhpcy5fZmlsZVN5c3RlbXNMaXN0Q29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO2NvbnN0IG1hcHBpbmdWaWV3PW5ldyBQZXJzaXN0ZW5jZS5FZGl0RmlsZVN5c3RlbVZpZXcoZmlsZVN5c3RlbS5wYXRoKCkpO3RoaXMuX21hcHBpbmdWaWV3QnlQYXRoLnNldChmaWxlU3lzdGVtLnBhdGgoKSxtYXBwaW5nVmlldyk7bWFwcGluZ1ZpZXcuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWxlLXN5c3RlbS1tYXBwaW5nLXZpZXcnKTttYXBwaW5nVmlldy5zaG93KGVsZW1lbnQpO30KX3JlbmRlckZpbGVTeXN0ZW0oZmlsZVN5c3RlbSl7Y29uc3QgZmlsZVN5c3RlbVBhdGg9ZmlsZVN5c3RlbS5wYXRoKCk7Y29uc3QgbGFzdEluZGV4T2ZTbGFzaD1maWxlU3lzdGVtUGF0aC5sYXN0SW5kZXhPZihIb3N0LmlzV2luKCk/J1xcJzonLycpO2NvbnN0IGZvbGRlck5hbWU9ZmlsZVN5c3RlbVBhdGguc3Vic3RyKGxhc3RJbmRleE9mU2xhc2grMSk7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdmaWxlLXN5c3RlbS1jb250YWluZXInKTtjb25zdCBoZWFkZXI9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmlsZS1zeXN0ZW0taGVhZGVyJyk7aGVhZGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdmaWxlLXN5c3RlbS1uYW1lJykudGV4dENvbnRlbnQ9Zm9sZGVyTmFtZTtjb25zdCBwYXRoPWhlYWRlci5jcmVhdGVDaGlsZCgnZGl2JywnZmlsZS1zeXN0ZW0tcGF0aCcpO3BhdGgudGV4dENvbnRlbnQ9ZmlsZVN5c3RlbVBhdGg7cGF0aC50aXRsZT1maWxlU3lzdGVtUGF0aDtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnKTtjb25zdCBidXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUnKSwnbGFyZ2VpY29uLWRlbGV0ZScpO2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3JlbW92ZUZpbGVTeXN0ZW1DbGlja2VkLmJpbmQodGhpcyxmaWxlU3lzdGVtKSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShidXR0b24pO2hlYWRlci5hcHBlbmRDaGlsZCh0b29sYmFyLmVsZW1lbnQpO3JldHVybiBlbGVtZW50O30KX3JlbW92ZUZpbGVTeXN0ZW1DbGlja2VkKGZpbGVTeXN0ZW0pe1BlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIucmVtb3ZlRmlsZVN5c3RlbShmaWxlU3lzdGVtKTt9Cl9hZGRGaWxlU3lzdGVtQ2xpY2tlZCgpe1BlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuYWRkRmlsZVN5c3RlbSgpO30KX2ZpbGVTeXN0ZW1BZGRlZChmaWxlU3lzdGVtKXt0aGlzLl9hZGRJdGVtKGZpbGVTeXN0ZW0pO30KX2ZpbGVTeXN0ZW1SZW1vdmVkKGZpbGVTeXN0ZW0pe2NvbnN0IG1hcHBpbmdWaWV3PXRoaXMuX21hcHBpbmdWaWV3QnlQYXRoLmdldChmaWxlU3lzdGVtLnBhdGgoKSk7aWYobWFwcGluZ1ZpZXcpe21hcHBpbmdWaWV3LmRpc3Bvc2UoKTt0aGlzLl9tYXBwaW5nVmlld0J5UGF0aC5kZWxldGUoZmlsZVN5c3RlbS5wYXRoKCkpO30KY29uc3QgZWxlbWVudD10aGlzLl9lbGVtZW50QnlQYXRoLmdldChmaWxlU3lzdGVtLnBhdGgoKSk7aWYoZWxlbWVudCl7dGhpcy5fZWxlbWVudEJ5UGF0aC5kZWxldGUoZmlsZVN5c3RlbS5wYXRoKCkpO2VsZW1lbnQucmVtb3ZlKCk7fX19OztzZWxmWydCcm93c2VyU0RLJ109c2VsZlsnQnJvd3NlclNESyddfHx7fTtCcm93c2VyU0RLLkxvZ01hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5Mb2dNb2RlbCx0aGlzKTt9Cm1vZGVsQWRkZWQobG9nTW9kZWwpe2NvbnN0IGV2ZW50TGlzdGVuZXJzPVtdO2V2ZW50TGlzdGVuZXJzLnB1c2gobG9nTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuTG9nTW9kZWwuRXZlbnRzLkVudHJ5QWRkZWQsdGhpcy5fbG9nRW50cnlBZGRlZCx0aGlzKSk7bG9nTW9kZWxbQnJvd3NlclNESy5Mb2dNYW5hZ2VyLl9ldmVudFN5bWJvbF09ZXZlbnRMaXN0ZW5lcnM7fQptb2RlbFJlbW92ZWQobG9nTW9kZWwpe0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyhsb2dNb2RlbFtCcm93c2VyU0RLLkxvZ01hbmFnZXIuX2V2ZW50U3ltYm9sXSk7fQpfbG9nRW50cnlBZGRlZChldmVudCl7Y29uc3QgZGF0YT0oZXZlbnQuZGF0YSk7Y29uc3QgdGFyZ2V0PWRhdGEubG9nTW9kZWwudGFyZ2V0KCk7Y29uc3QgY29uc29sZU1lc3NhZ2U9bmV3IFNESy5Db25zb2xlTWVzc2FnZSh0YXJnZXQubW9kZWwoU0RLLlJ1bnRpbWVNb2RlbCksZGF0YS5lbnRyeS5zb3VyY2UsZGF0YS5lbnRyeS5sZXZlbCxkYXRhLmVudHJ5LnRleHQsdW5kZWZpbmVkLGRhdGEuZW50cnkudXJsLGRhdGEuZW50cnkubGluZU51bWJlcix1bmRlZmluZWQsW2RhdGEuZW50cnkudGV4dCwuLi4oZGF0YS5lbnRyeS5hcmdzfHxbXSldLGRhdGEuZW50cnkuc3RhY2tUcmFjZSxkYXRhLmVudHJ5LnRpbWVzdGFtcCx1bmRlZmluZWQsdW5kZWZpbmVkLGRhdGEuZW50cnkud29ya2VySWQpO2lmKGRhdGEuZW50cnkubmV0d29ya1JlcXVlc3RJZCkKQnJvd3NlclNESy5uZXR3b3JrTG9nLmFzc29jaWF0ZUNvbnNvbGVNZXNzYWdlV2l0aFJlcXVlc3QoY29uc29sZU1lc3NhZ2UsZGF0YS5lbnRyeS5uZXR3b3JrUmVxdWVzdElkKTtTREsuY29uc29sZU1vZGVsLmFkZE1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO319O0Jyb3dzZXJTREsuTG9nTWFuYWdlci5fZXZlbnRTeW1ib2w9U3ltYm9sKCdfZXZlbnRzJyk7bmV3IEJyb3dzZXJTREsuTG9nTWFuYWdlcigpOztCcm93c2VyU0RLLk5ldHdvcmtMb2c9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9yZXF1ZXN0c1NldD1uZXcgU2V0KCk7dGhpcy5fcGFnZUxvYWRGb3JNYW5hZ2VyPW5ldyBNYXAoKTt0aGlzLl9pc1JlY29yZGluZz10cnVlO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLk5ldHdvcmtNYW5hZ2VyLHRoaXMpO30KbW9kZWxBZGRlZChuZXR3b3JrTWFuYWdlcil7Y29uc3QgZXZlbnRMaXN0ZW5lcnM9W107ZXZlbnRMaXN0ZW5lcnMucHVzaChuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdFN0YXJ0ZWQsdGhpcy5fb25SZXF1ZXN0U3RhcnRlZCx0aGlzKSk7ZXZlbnRMaXN0ZW5lcnMucHVzaChuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdFVwZGF0ZWQsdGhpcy5fb25SZXF1ZXN0VXBkYXRlZCx0aGlzKSk7ZXZlbnRMaXN0ZW5lcnMucHVzaChuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVxdWVzdFJlZGlyZWN0ZWQsdGhpcy5fb25SZXF1ZXN0UmVkaXJlY3QsdGhpcykpO2V2ZW50TGlzdGVuZXJzLnB1c2gobmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RGaW5pc2hlZCx0aGlzLl9vblJlcXVlc3RVcGRhdGVkLHRoaXMpKTtldmVudExpc3RlbmVycy5wdXNoKG5ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5NZXNzYWdlR2VuZXJhdGVkLHRoaXMuX25ldHdvcmtNZXNzYWdlR2VuZXJhdGVkLmJpbmQodGhpcyxuZXR3b3JrTWFuYWdlcikpKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1uZXR3b3JrTWFuYWdlci50YXJnZXQoKS5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKHJlc291cmNlVHJlZU1vZGVsKXtldmVudExpc3RlbmVycy5wdXNoKHJlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5XaWxsUmVsb2FkUGFnZSx0aGlzLl93aWxsUmVsb2FkUGFnZSx0aGlzKSk7ZXZlbnRMaXN0ZW5lcnMucHVzaChyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMuX29uTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMpKTtldmVudExpc3RlbmVycy5wdXNoKHJlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5Mb2FkLHRoaXMuX29uTG9hZCx0aGlzKSk7ZXZlbnRMaXN0ZW5lcnMucHVzaChyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRE9NQ29udGVudExvYWRlZCx0aGlzLl9vbkRPTUNvbnRlbnRMb2FkZWQuYmluZCh0aGlzLHJlc291cmNlVHJlZU1vZGVsKSkpO30KbmV0d29ya01hbmFnZXJbQnJvd3NlclNESy5OZXR3b3JrTG9nLl9ldmVudHNdPWV2ZW50TGlzdGVuZXJzO30KbW9kZWxSZW1vdmVkKG5ldHdvcmtNYW5hZ2VyKXt0aGlzLl9yZW1vdmVOZXR3b3JrTWFuYWdlckxpc3RlbmVycyhuZXR3b3JrTWFuYWdlcik7fQpfcmVtb3ZlTmV0d29ya01hbmFnZXJMaXN0ZW5lcnMobmV0d29ya01hbmFnZXIpe0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyhuZXR3b3JrTWFuYWdlcltCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2V2ZW50c10pO30Kc2V0SXNSZWNvcmRpbmcoZW5hYmxlZCl7aWYodGhpcy5faXNSZWNvcmRpbmc9PT1lbmFibGVkKQpyZXR1cm47dGhpcy5faXNSZWNvcmRpbmc9ZW5hYmxlZDtpZihlbmFibGVkKXtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5OZXR3b3JrTWFuYWdlcix0aGlzKTt9ZWxzZXtTREsudGFyZ2V0TWFuYWdlci51bm9ic2VydmVNb2RlbHMoU0RLLk5ldHdvcmtNYW5hZ2VyLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuTmV0d29ya01hbmFnZXIpLmZvckVhY2godGhpcy5fcmVtb3ZlTmV0d29ya01hbmFnZXJMaXN0ZW5lcnMuYmluZCh0aGlzKSk7fX0KcmVxdWVzdEZvclVSTCh1cmwpe3JldHVybiB0aGlzLl9yZXF1ZXN0cy5maW5kKHJlcXVlc3Q9PnJlcXVlc3QudXJsKCk9PT11cmwpfHxudWxsO30KcmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdHM7fQpyZXF1ZXN0QnlNYW5hZ2VyQW5kSWQobmV0d29ya01hbmFnZXIscmVxdWVzdElkKXtmb3IobGV0IGk9dGhpcy5fcmVxdWVzdHMubGVuZ3RoLTE7aT49MDtpLS0pe2NvbnN0IHJlcXVlc3Q9dGhpcy5fcmVxdWVzdHNbaV07aWYocmVxdWVzdElkPT09cmVxdWVzdC5yZXF1ZXN0SWQoKSYmbmV0d29ya01hbmFnZXI9PT1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KSkKcmV0dXJuIHJlcXVlc3Q7fQpyZXR1cm4gbnVsbDt9Cl9yZXF1ZXN0QnlNYW5hZ2VyQW5kVVJMKG5ldHdvcmtNYW5hZ2VyLHVybCl7Zm9yKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy5fcmVxdWVzdHMpe2lmKHVybD09PXJlcXVlc3QudXJsKCkmJm5ldHdvcmtNYW5hZ2VyPT09U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QocmVxdWVzdCkpCnJldHVybiByZXF1ZXN0O30KcmV0dXJuIG51bGw7fQpfaW5pdGlhbGl6ZUluaXRpYXRvclN5bWJvbElmTmVlZGVkKHJlcXVlc3Qpe2lmKCFyZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0pe3JlcXVlc3RbQnJvd3NlclNESy5OZXR3b3JrTG9nLl9pbml0aWF0b3JEYXRhU3ltYm9sXT17aW5mbzpudWxsLGNoYWluOm51bGwscmVxdWVzdDp1bmRlZmluZWQsfTt9fQppbml0aWF0b3JJbmZvRm9yUmVxdWVzdChyZXF1ZXN0KXt0aGlzLl9pbml0aWFsaXplSW5pdGlhdG9yU3ltYm9sSWZOZWVkZWQocmVxdWVzdCk7aWYocmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLmluZm8pCnJldHVybiByZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0uaW5mbztsZXQgdHlwZT1TREsuTmV0d29ya1JlcXVlc3QuSW5pdGlhdG9yVHlwZS5PdGhlcjtsZXQgdXJsPScnO2xldCBsaW5lTnVtYmVyPS1JbmZpbml0eTtsZXQgY29sdW1uTnVtYmVyPS1JbmZpbml0eTtsZXQgc2NyaXB0SWQ9bnVsbDtsZXQgaW5pdGlhdG9yU3RhY2s9bnVsbDtjb25zdCBpbml0aWF0b3I9cmVxdWVzdC5pbml0aWF0b3IoKTtjb25zdCByZWRpcmVjdFNvdXJjZT1yZXF1ZXN0LnJlZGlyZWN0U291cmNlKCk7aWYocmVkaXJlY3RTb3VyY2Upe3R5cGU9U0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGUuUmVkaXJlY3Q7dXJsPXJlZGlyZWN0U291cmNlLnVybCgpO31lbHNlIGlmKGluaXRpYXRvcil7aWYoaW5pdGlhdG9yLnR5cGU9PT1Qcm90b2NvbC5OZXR3b3JrLkluaXRpYXRvclR5cGUuUGFyc2VyKXt0eXBlPVNESy5OZXR3b3JrUmVxdWVzdC5Jbml0aWF0b3JUeXBlLlBhcnNlcjt1cmw9aW5pdGlhdG9yLnVybD9pbml0aWF0b3IudXJsOnVybDtsaW5lTnVtYmVyPWluaXRpYXRvci5saW5lTnVtYmVyP2luaXRpYXRvci5saW5lTnVtYmVyOmxpbmVOdW1iZXI7fWVsc2UgaWYoaW5pdGlhdG9yLnR5cGU9PT1Qcm90b2NvbC5OZXR3b3JrLkluaXRpYXRvclR5cGUuU2NyaXB0KXtmb3IobGV0IHN0YWNrPWluaXRpYXRvci5zdGFjaztzdGFjaztzdGFjaz1zdGFjay5wYXJlbnQpe2NvbnN0IHRvcEZyYW1lPXN0YWNrLmNhbGxGcmFtZXMubGVuZ3RoP3N0YWNrLmNhbGxGcmFtZXNbMF06bnVsbDtpZighdG9wRnJhbWUpCmNvbnRpbnVlO3R5cGU9U0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGUuU2NyaXB0O3VybD10b3BGcmFtZS51cmx8fENvbW1vbi5VSVN0cmluZygnPGFub255bW91cz4nKTtsaW5lTnVtYmVyPXRvcEZyYW1lLmxpbmVOdW1iZXI7Y29sdW1uTnVtYmVyPXRvcEZyYW1lLmNvbHVtbk51bWJlcjtzY3JpcHRJZD10b3BGcmFtZS5zY3JpcHRJZDticmVhazt9CmlmKCFpbml0aWF0b3Iuc3RhY2smJmluaXRpYXRvci51cmwpe3R5cGU9U0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGUuU2NyaXB0O3VybD1pbml0aWF0b3IudXJsO2xpbmVOdW1iZXI9aW5pdGlhdG9yLmxpbmVOdW1iZXJ8fDA7fQppZihpbml0aWF0b3Iuc3RhY2smJmluaXRpYXRvci5zdGFjay5jYWxsRnJhbWVzJiZpbml0aWF0b3Iuc3RhY2suY2FsbEZyYW1lcy5sZW5ndGgpCmluaXRpYXRvclN0YWNrPWluaXRpYXRvci5zdGFja3x8bnVsbDt9ZWxzZSBpZihpbml0aWF0b3IudHlwZT09PVByb3RvY29sLk5ldHdvcmsuSW5pdGlhdG9yVHlwZS5QcmVsb2FkKXt0eXBlPVNESy5OZXR3b3JrUmVxdWVzdC5Jbml0aWF0b3JUeXBlLlByZWxvYWQ7fWVsc2UgaWYoaW5pdGlhdG9yLnR5cGU9PT1Qcm90b2NvbC5OZXR3b3JrLkluaXRpYXRvclR5cGUuU2lnbmVkRXhjaGFuZ2Upe3R5cGU9U0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGUuU2lnbmVkRXhjaGFuZ2U7dXJsPWluaXRpYXRvci51cmw7fX0KcmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLmluZm89e3R5cGU6dHlwZSx1cmw6dXJsLGxpbmVOdW1iZXI6bGluZU51bWJlcixjb2x1bW5OdW1iZXI6Y29sdW1uTnVtYmVyLHNjcmlwdElkOnNjcmlwdElkLHN0YWNrOmluaXRpYXRvclN0YWNrfTtyZXR1cm4gcmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLmluZm87fQppbml0aWF0b3JHcmFwaEZvclJlcXVlc3QocmVxdWVzdCl7Y29uc3QgaW5pdGlhdGVkPW5ldyBTZXQoKTtjb25zdCBuZXR3b3JrTWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KTtmb3IoY29uc3Qgb3RoZXJSZXF1ZXN0IG9mIHRoaXMuX3JlcXVlc3RzKXtjb25zdCBvdGhlclJlcXVlc3RNYW5hZ2VyPVNESy5OZXR3b3JrTWFuYWdlci5mb3JSZXF1ZXN0KHJlcXVlc3QpO2lmKG5ldHdvcmtNYW5hZ2VyPT09b3RoZXJSZXF1ZXN0TWFuYWdlciYmdGhpcy5faW5pdGlhdG9yQ2hhaW4ob3RoZXJSZXF1ZXN0KS5oYXMocmVxdWVzdCkpCmluaXRpYXRlZC5hZGQob3RoZXJSZXF1ZXN0KTt9CnJldHVybntpbml0aWF0b3JzOnRoaXMuX2luaXRpYXRvckNoYWluKHJlcXVlc3QpLGluaXRpYXRlZDppbml0aWF0ZWR9O30KX2luaXRpYXRvckNoYWluKHJlcXVlc3Qpe3RoaXMuX2luaXRpYWxpemVJbml0aWF0b3JTeW1ib2xJZk5lZWRlZChyZXF1ZXN0KTtsZXQgaW5pdGlhdG9yQ2hhaW5DYWNoZT0ocmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLmNoYWluKTtpZihpbml0aWF0b3JDaGFpbkNhY2hlKQpyZXR1cm4gaW5pdGlhdG9yQ2hhaW5DYWNoZTtpbml0aWF0b3JDaGFpbkNhY2hlPW5ldyBTZXQoKTtsZXQgY2hlY2tSZXF1ZXN0PXJlcXVlc3Q7ZG97aWYoY2hlY2tSZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0uY2hhaW4pe2luaXRpYXRvckNoYWluQ2FjaGUuYWRkQWxsKGNoZWNrUmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLmNoYWluKTticmVhazt9CmlmKGluaXRpYXRvckNoYWluQ2FjaGUuaGFzKGNoZWNrUmVxdWVzdCkpCmJyZWFrO2luaXRpYXRvckNoYWluQ2FjaGUuYWRkKGNoZWNrUmVxdWVzdCk7Y2hlY2tSZXF1ZXN0PXRoaXMuX2luaXRpYXRvclJlcXVlc3QoY2hlY2tSZXF1ZXN0KTt9d2hpbGUoY2hlY2tSZXF1ZXN0KTtyZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0uY2hhaW49aW5pdGlhdG9yQ2hhaW5DYWNoZTtyZXR1cm4gaW5pdGlhdG9yQ2hhaW5DYWNoZTt9Cl9pbml0aWF0b3JSZXF1ZXN0KHJlcXVlc3Qpe3RoaXMuX2luaXRpYWxpemVJbml0aWF0b3JTeW1ib2xJZk5lZWRlZChyZXF1ZXN0KTtpZihyZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0ucmVxdWVzdCE9PXVuZGVmaW5lZCkKcmV0dXJuIHJlcXVlc3RbQnJvd3NlclNESy5OZXR3b3JrTG9nLl9pbml0aWF0b3JEYXRhU3ltYm9sXS5yZXF1ZXN0O2NvbnN0IHVybD10aGlzLmluaXRpYXRvckluZm9Gb3JSZXF1ZXN0KHJlcXVlc3QpLnVybDtjb25zdCBuZXR3b3JrTWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KTtyZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF0ucmVxdWVzdD1uZXR3b3JrTWFuYWdlcj90aGlzLl9yZXF1ZXN0QnlNYW5hZ2VyQW5kVVJMKG5ldHdvcmtNYW5hZ2VyLHVybCk6bnVsbDtyZXR1cm4gcmVxdWVzdFtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2luaXRpYXRvckRhdGFTeW1ib2xdLnJlcXVlc3Q7fQpfd2lsbFJlbG9hZFBhZ2UoKXtpZighQ29tbW9uLm1vZHVsZVNldHRpbmcoJ25ldHdvcmtfbG9nLnByZXNlcnZlLWxvZycpLmdldCgpKQp0aGlzLnJlc2V0KCk7fQpfb25NYWluRnJhbWVOYXZpZ2F0ZWQoZXZlbnQpe2NvbnN0IG1haW5GcmFtZT0oZXZlbnQuZGF0YSk7Y29uc3QgbWFuYWdlcj1tYWluRnJhbWUucmVzb3VyY2VUcmVlTW9kZWwoKS50YXJnZXQoKS5tb2RlbChTREsuTmV0d29ya01hbmFnZXIpO2lmKCFtYW5hZ2VyfHxtYWluRnJhbWUucmVzb3VyY2VUcmVlTW9kZWwoKS50YXJnZXQoKS5wYXJlbnRUYXJnZXQoKSkKcmV0dXJuO2NvbnN0IG9sZE1hbmFnZXJSZXF1ZXN0cz10aGlzLl9yZXF1ZXN0cy5maWx0ZXIocmVxdWVzdD0+U0RLLk5ldHdvcmtNYW5hZ2VyLmZvclJlcXVlc3QocmVxdWVzdCk9PT1tYW5hZ2VyKTtjb25zdCBvbGRSZXF1ZXN0c1NldD10aGlzLl9yZXF1ZXN0c1NldDt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9yZXF1ZXN0c1NldD1uZXcgU2V0KCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cy5SZXNldCk7bGV0IGN1cnJlbnRQYWdlTG9hZD1udWxsO2NvbnN0IHJlcXVlc3RzVG9BZGQ9W107Zm9yKGNvbnN0IHJlcXVlc3Qgb2Ygb2xkTWFuYWdlclJlcXVlc3RzKXtpZihyZXF1ZXN0LmxvYWRlcklkIT09bWFpbkZyYW1lLmxvYWRlcklkKQpjb250aW51ZTtpZighY3VycmVudFBhZ2VMb2FkKXtjdXJyZW50UGFnZUxvYWQ9bmV3IEJyb3dzZXJTREsuUGFnZUxvYWQocmVxdWVzdCk7bGV0IHJlZGlyZWN0U291cmNlPXJlcXVlc3QucmVkaXJlY3RTb3VyY2UoKTt3aGlsZShyZWRpcmVjdFNvdXJjZSl7cmVxdWVzdHNUb0FkZC5wdXNoKHJlZGlyZWN0U291cmNlKTtyZWRpcmVjdFNvdXJjZT1yZWRpcmVjdFNvdXJjZS5yZWRpcmVjdFNvdXJjZSgpO319CnJlcXVlc3RzVG9BZGQucHVzaChyZXF1ZXN0KTt9CmZvcihjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzVG9BZGQpe29sZFJlcXVlc3RzU2V0LmRlbGV0ZShyZXF1ZXN0KTt0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO3RoaXMuX3JlcXVlc3RzU2V0LmFkZChyZXF1ZXN0KTtjdXJyZW50UGFnZUxvYWQuYmluZFJlcXVlc3QocmVxdWVzdCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cy5SZXF1ZXN0QWRkZWQscmVxdWVzdCk7fQppZihDb21tb24ubW9kdWxlU2V0dGluZygnbmV0d29ya19sb2cucHJlc2VydmUtbG9nJykuZ2V0KCkpe2Zvcihjb25zdCByZXF1ZXN0IG9mIG9sZFJlcXVlc3RzU2V0KXt0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO3RoaXMuX3JlcXVlc3RzU2V0LmFkZChyZXF1ZXN0KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCcm93c2VyU0RLLk5ldHdvcmtMb2cuRXZlbnRzLlJlcXVlc3RBZGRlZCxyZXF1ZXN0KTt9fQppZihjdXJyZW50UGFnZUxvYWQpCnRoaXMuX3BhZ2VMb2FkRm9yTWFuYWdlci5zZXQobWFuYWdlcixjdXJyZW50UGFnZUxvYWQpO30KaW1wb3J0UmVxdWVzdHMocmVxdWVzdHMpe3RoaXMucmVzZXQoKTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9yZXF1ZXN0c1NldC5jbGVhcigpO2Zvcihjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKXt0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO3RoaXMuX3JlcXVlc3RzU2V0LmFkZChyZXF1ZXN0KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCcm93c2VyU0RLLk5ldHdvcmtMb2cuRXZlbnRzLlJlcXVlc3RBZGRlZCxyZXF1ZXN0KTt9fQpfb25SZXF1ZXN0U3RhcnRlZChldmVudCl7Y29uc3QgcmVxdWVzdD0oZXZlbnQuZGF0YSk7dGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0KTt0aGlzLl9yZXF1ZXN0c1NldC5hZGQocmVxdWVzdCk7Y29uc3QgbWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KTtjb25zdCBwYWdlTG9hZD1tYW5hZ2VyP3RoaXMuX3BhZ2VMb2FkRm9yTWFuYWdlci5nZXQobWFuYWdlcik6bnVsbDtpZihwYWdlTG9hZCkKcGFnZUxvYWQuYmluZFJlcXVlc3QocmVxdWVzdCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cy5SZXF1ZXN0QWRkZWQscmVxdWVzdCk7fQpfb25SZXF1ZXN0VXBkYXRlZChldmVudCl7Y29uc3QgcmVxdWVzdD0oZXZlbnQuZGF0YSk7aWYoIXRoaXMuX3JlcXVlc3RzU2V0LmhhcyhyZXF1ZXN0KSkKcmV0dXJuO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEJyb3dzZXJTREsuTmV0d29ya0xvZy5FdmVudHMuUmVxdWVzdFVwZGF0ZWQscmVxdWVzdCk7fQpfb25SZXF1ZXN0UmVkaXJlY3QoZXZlbnQpe2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO2RlbGV0ZSByZXF1ZXN0W0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbF07fQpfb25ET01Db250ZW50TG9hZGVkKHJlc291cmNlVHJlZU1vZGVsLGV2ZW50KXtjb25zdCBuZXR3b3JrTWFuYWdlcj1yZXNvdXJjZVRyZWVNb2RlbC50YXJnZXQoKS5tb2RlbChTREsuTmV0d29ya01hbmFnZXIpO2NvbnN0IHBhZ2VMb2FkPW5ldHdvcmtNYW5hZ2VyP3RoaXMuX3BhZ2VMb2FkRm9yTWFuYWdlci5nZXQobmV0d29ya01hbmFnZXIpOm51bGw7aWYocGFnZUxvYWQpCnBhZ2VMb2FkLmNvbnRlbnRMb2FkVGltZT0oZXZlbnQuZGF0YSk7fQpfb25Mb2FkKGV2ZW50KXtjb25zdCBuZXR3b3JrTWFuYWdlcj1ldmVudC5kYXRhLnJlc291cmNlVHJlZU1vZGVsLnRhcmdldCgpLm1vZGVsKFNESy5OZXR3b3JrTWFuYWdlcik7Y29uc3QgcGFnZUxvYWQ9bmV0d29ya01hbmFnZXI/dGhpcy5fcGFnZUxvYWRGb3JNYW5hZ2VyLmdldChuZXR3b3JrTWFuYWdlcik6bnVsbDtpZihwYWdlTG9hZCkKcGFnZUxvYWQubG9hZFRpbWU9KGV2ZW50LmRhdGEubG9hZFRpbWUpO30KcmVzZXQoKXt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9yZXF1ZXN0c1NldC5jbGVhcigpO2NvbnN0IG1hbmFnZXJzPW5ldyBTZXQoU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5OZXR3b3JrTWFuYWdlcikpO2Zvcihjb25zdCBtYW5hZ2VyIG9mIHRoaXMuX3BhZ2VMb2FkRm9yTWFuYWdlci5rZXlzKCkpe2lmKCFtYW5hZ2Vycy5oYXMobWFuYWdlcikpCnRoaXMuX3BhZ2VMb2FkRm9yTWFuYWdlci5kZWxldGUobWFuYWdlcik7fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhCcm93c2VyU0RLLk5ldHdvcmtMb2cuRXZlbnRzLlJlc2V0KTt9Cl9uZXR3b3JrTWVzc2FnZUdlbmVyYXRlZChuZXR3b3JrTWFuYWdlcixldmVudCl7Y29uc3QgbWVzc2FnZT0oZXZlbnQuZGF0YSk7Y29uc3QgY29uc29sZU1lc3NhZ2U9bmV3IFNESy5Db25zb2xlTWVzc2FnZShuZXR3b3JrTWFuYWdlci50YXJnZXQoKS5tb2RlbChTREsuUnVudGltZU1vZGVsKSxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5OZXR3b3JrLG1lc3NhZ2Uud2FybmluZz9TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLldhcm5pbmc6U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5JbmZvLG1lc3NhZ2UubWVzc2FnZSk7dGhpcy5hc3NvY2lhdGVDb25zb2xlTWVzc2FnZVdpdGhSZXF1ZXN0KGNvbnNvbGVNZXNzYWdlLG1lc3NhZ2UucmVxdWVzdElkKTtTREsuY29uc29sZU1vZGVsLmFkZE1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO30KYXNzb2NpYXRlQ29uc29sZU1lc3NhZ2VXaXRoUmVxdWVzdChjb25zb2xlTWVzc2FnZSxyZXF1ZXN0SWQpe2NvbnN0IHRhcmdldD1jb25zb2xlTWVzc2FnZS50YXJnZXQoKTtjb25zdCBuZXR3b3JrTWFuYWdlcj10YXJnZXQ/dGFyZ2V0Lm1vZGVsKFNESy5OZXR3b3JrTWFuYWdlcik6bnVsbDtpZighbmV0d29ya01hbmFnZXIpCnJldHVybjtjb25zdCByZXF1ZXN0PXRoaXMucmVxdWVzdEJ5TWFuYWdlckFuZElkKG5ldHdvcmtNYW5hZ2VyLHJlcXVlc3RJZCk7aWYoIXJlcXVlc3QpCnJldHVybjtjb25zb2xlTWVzc2FnZVtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX3JlcXVlc3RTeW1ib2xdPXJlcXVlc3Q7Y29uc3QgaW5pdGlhdG9yPXJlcXVlc3QuaW5pdGlhdG9yKCk7aWYoaW5pdGlhdG9yKXtjb25zb2xlTWVzc2FnZS5zdGFja1RyYWNlPWluaXRpYXRvci5zdGFja3x8dW5kZWZpbmVkO2lmKGluaXRpYXRvci51cmwpe2NvbnNvbGVNZXNzYWdlLnVybD1pbml0aWF0b3IudXJsO2NvbnNvbGVNZXNzYWdlLmxpbmU9aW5pdGlhdG9yLmxpbmVOdW1iZXJ8fDA7fX19CnN0YXRpYyByZXF1ZXN0Rm9yQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2Upe3JldHVybiBjb25zb2xlTWVzc2FnZVtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX3JlcXVlc3RTeW1ib2xdfHxudWxsO319O0Jyb3dzZXJTREsuUGFnZUxvYWQ9Y2xhc3N7Y29uc3RydWN0b3IobWFpblJlcXVlc3Qpe3RoaXMuaWQ9KytCcm93c2VyU0RLLlBhZ2VMb2FkLl9sYXN0SWRlbnRpZmllcjt0aGlzLnVybD1tYWluUmVxdWVzdC51cmwoKTt0aGlzLnN0YXJ0VGltZT1tYWluUmVxdWVzdC5zdGFydFRpbWU7dGhpcy5sb2FkVGltZTt0aGlzLmNvbnRlbnRMb2FkVGltZTt0aGlzLm1haW5SZXF1ZXN0PW1haW5SZXF1ZXN0O3RoaXMuX3Nob3dEYXRhU2F2ZXJXYXJuaW5nSWZOZWVkZWQoKTt9CmFzeW5jIF9zaG93RGF0YVNhdmVyV2FybmluZ0lmTmVlZGVkKCl7Y29uc3QgbWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdCh0aGlzLm1haW5SZXF1ZXN0KTtpZighbWFuYWdlcikKcmV0dXJuO2lmKCF0aGlzLm1haW5SZXF1ZXN0LmZpbmlzaGVkKQphd2FpdCB0aGlzLm1haW5SZXF1ZXN0Lm9uY2UoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5GaW5pc2hlZExvYWRpbmcpO2NvbnN0IHNhdmVEYXRhSGVhZGVyPXRoaXMubWFpblJlcXVlc3QucmVxdWVzdEhlYWRlclZhbHVlKCdTYXZlLURhdGEnKTtpZighQnJvd3NlclNESy5QYWdlTG9hZC5fZGF0YVNhdmVyTWVzc2FnZVdhc1Nob3duJiZzYXZlRGF0YUhlYWRlciYmc2F2ZURhdGFIZWFkZXI9PT0nb24nKXtjb25zdCBtZXNzYWdlPUNvbW1vbi5VSVN0cmluZygnQ29uc2lkZXIgZGlzYWJsaW5nICVzIHdoaWxlIGRlYnVnZ2luZy4gRm9yIG1vcmUgaW5mbyBzZWU6ICVzJyxDb21tb24uVUlTdHJpbmcoJ0Nocm9tZSBEYXRhIFNhdmVyJyksJ2h0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL2Nocm9tZS8/cD1kYXRhc2F2ZXInKTttYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLk1lc3NhZ2VHZW5lcmF0ZWQse21lc3NhZ2U6bWVzc2FnZSxyZXF1ZXN0SWQ6dGhpcy5tYWluUmVxdWVzdC5yZXF1ZXN0SWQoKSx3YXJuaW5nOnRydWV9KTtCcm93c2VyU0RLLlBhZ2VMb2FkLl9kYXRhU2F2ZXJNZXNzYWdlV2FzU2hvd249dHJ1ZTt9fQpzdGF0aWMgZm9yUmVxdWVzdChyZXF1ZXN0KXtyZXR1cm4gcmVxdWVzdFtCcm93c2VyU0RLLlBhZ2VMb2FkLl9wYWdlTG9hZEZvclJlcXVlc3RTeW1ib2xdfHxudWxsO30KYmluZFJlcXVlc3QocmVxdWVzdCl7cmVxdWVzdFtCcm93c2VyU0RLLlBhZ2VMb2FkLl9wYWdlTG9hZEZvclJlcXVlc3RTeW1ib2xdPXRoaXM7fX07QnJvd3NlclNESy5QYWdlTG9hZC5fbGFzdElkZW50aWZpZXI9MDtCcm93c2VyU0RLLlBhZ2VMb2FkLl9wYWdlTG9hZEZvclJlcXVlc3RTeW1ib2w9U3ltYm9sKCdQYWdlTG9hZEZvclJlcXVlc3QnKTtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX3JlcXVlc3RTeW1ib2w9U3ltYm9sKCdfcmVxdWVzdCcpO0Jyb3dzZXJTREsuUGFnZUxvYWQuX2RhdGFTYXZlck1lc3NhZ2VXYXNTaG93bj1mYWxzZTtCcm93c2VyU0RLLk5ldHdvcmtMb2cuSW5pdGlhdG9yR3JhcGg7QnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cz17UmVzZXQ6U3ltYm9sKCdSZXNldCcpLFJlcXVlc3RBZGRlZDpTeW1ib2woJ1JlcXVlc3RBZGRlZCcpLFJlcXVlc3RVcGRhdGVkOlN5bWJvbCgnUmVxdWVzdFVwZGF0ZWQnKX07QnJvd3NlclNESy5OZXR3b3JrTG9nLl9Jbml0aWF0b3JJbmZvO0Jyb3dzZXJTREsuTmV0d29ya0xvZy5faW5pdGlhdG9yRGF0YVN5bWJvbD1TeW1ib2woJ0luaXRpYXRvckRhdGEnKTtCcm93c2VyU0RLLk5ldHdvcmtMb2cuX2V2ZW50cz1TeW1ib2woJ0Jyb3dzZXJTREsuTmV0d29ya0xvZy5ldmVudHMnKTtCcm93c2VyU0RLLm5ldHdvcmtMb2c9bmV3IEJyb3dzZXJTREsuTmV0d29ya0xvZygpOztCcm93c2VyU0RLLkhBUkVudHJ5PWNsYXNze2NvbnN0cnVjdG9yKHJlcXVlc3Qpe3RoaXMuX3JlcXVlc3Q9cmVxdWVzdDt9CnN0YXRpYyBfdG9NaWxsaXNlY29uZHModGltZSl7cmV0dXJuIHRpbWU9PT0tMT8tMTp0aW1lKjEwMDA7fQpzdGF0aWMgYXN5bmMgYnVpbGQocmVxdWVzdCl7Y29uc3QgaGFyRW50cnk9bmV3IEJyb3dzZXJTREsuSEFSRW50cnkocmVxdWVzdCk7bGV0IGlwQWRkcmVzcz1oYXJFbnRyeS5fcmVxdWVzdC5yZW1vdGVBZGRyZXNzKCk7Y29uc3QgcG9ydFBvc2l0aW9uSW5TdHJpbmc9aXBBZGRyZXNzLmxhc3RJbmRleE9mKCc6Jyk7aWYocG9ydFBvc2l0aW9uSW5TdHJpbmchPT0tMSkKaXBBZGRyZXNzPWlwQWRkcmVzcy5zdWJzdHIoMCxwb3J0UG9zaXRpb25JblN0cmluZyk7Y29uc3QgdGltaW5ncz1oYXJFbnRyeS5fYnVpbGRUaW1pbmdzKCk7bGV0IHRpbWU9MDtmb3IoY29uc3QgdCBvZlt0aW1pbmdzLmJsb2NrZWQsdGltaW5ncy5kbnMsdGltaW5ncy5jb25uZWN0LHRpbWluZ3Muc2VuZCx0aW1pbmdzLndhaXQsdGltaW5ncy5yZWNlaXZlXSkKdGltZSs9TWF0aC5tYXgodCwwKTtjb25zdCBlbnRyeT17c3RhcnRlZERhdGVUaW1lOkJyb3dzZXJTREsuSEFSTG9nLnBzZXVkb1dhbGxUaW1lKGhhckVudHJ5Ll9yZXF1ZXN0LGhhckVudHJ5Ll9yZXF1ZXN0Lmlzc3VlVGltZSgpKS50b0pTT04oKSx0aW1lOnRpbWUscmVxdWVzdDphd2FpdCBoYXJFbnRyeS5fYnVpbGRSZXF1ZXN0KCkscmVzcG9uc2U6aGFyRW50cnkuX2J1aWxkUmVzcG9uc2UoKSxjYWNoZTp7fSx0aW1pbmdzOnRpbWluZ3Msc2VydmVySVBBZGRyZXNzOmlwQWRkcmVzcy5yZXBsYWNlKC9cW1xdL2csJycpfTtpZihoYXJFbnRyeS5fcmVxdWVzdC5jYWNoZWQoKSkKZW50cnkuX2Zyb21DYWNoZT1oYXJFbnRyeS5fcmVxdWVzdC5jYWNoZWRJbk1lbW9yeSgpPydtZW1vcnknOidkaXNrJztpZihoYXJFbnRyeS5fcmVxdWVzdC5jb25uZWN0aW9uSWQhPT0nMCcpCmVudHJ5LmNvbm5lY3Rpb249aGFyRW50cnkuX3JlcXVlc3QuY29ubmVjdGlvbklkO2NvbnN0IHBhZ2U9QnJvd3NlclNESy5QYWdlTG9hZC5mb3JSZXF1ZXN0KGhhckVudHJ5Ll9yZXF1ZXN0KTtpZihwYWdlKQplbnRyeS5wYWdlcmVmPSdwYWdlXycrcGFnZS5pZDtyZXR1cm4gZW50cnk7fQphc3luYyBfYnVpbGRSZXF1ZXN0KCl7Y29uc3QgaGVhZGVyc1RleHQ9dGhpcy5fcmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1RleHQoKTtjb25zdCByZXM9e21ldGhvZDp0aGlzLl9yZXF1ZXN0LnJlcXVlc3RNZXRob2QsdXJsOnRoaXMuX2J1aWxkUmVxdWVzdFVSTCh0aGlzLl9yZXF1ZXN0LnVybCgpKSxodHRwVmVyc2lvbjp0aGlzLl9yZXF1ZXN0LnJlcXVlc3RIdHRwVmVyc2lvbigpLGhlYWRlcnM6dGhpcy5fcmVxdWVzdC5yZXF1ZXN0SGVhZGVycygpLHF1ZXJ5U3RyaW5nOnRoaXMuX2J1aWxkUGFyYW1ldGVycyh0aGlzLl9yZXF1ZXN0LnF1ZXJ5UGFyYW1ldGVyc3x8W10pLGNvb2tpZXM6dGhpcy5fYnVpbGRDb29raWVzKHRoaXMuX3JlcXVlc3QucmVxdWVzdENvb2tpZXN8fFtdKSxoZWFkZXJzU2l6ZTpoZWFkZXJzVGV4dD9oZWFkZXJzVGV4dC5sZW5ndGg6LTEsYm9keVNpemU6dGhpcy5yZXF1ZXN0Qm9keVNpemV9O2NvbnN0IHBvc3REYXRhPWF3YWl0IHRoaXMuX2J1aWxkUG9zdERhdGEoKTtpZihwb3N0RGF0YSkKcmVzLnBvc3REYXRhPXBvc3REYXRhO3JldHVybiByZXM7fQpfYnVpbGRSZXNwb25zZSgpe2NvbnN0IGhlYWRlcnNUZXh0PXRoaXMuX3JlcXVlc3QucmVzcG9uc2VIZWFkZXJzVGV4dDtyZXR1cm57c3RhdHVzOnRoaXMuX3JlcXVlc3Quc3RhdHVzQ29kZSxzdGF0dXNUZXh0OnRoaXMuX3JlcXVlc3Quc3RhdHVzVGV4dCxodHRwVmVyc2lvbjp0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSHR0cFZlcnNpb24oKSxoZWFkZXJzOnRoaXMuX3JlcXVlc3QucmVzcG9uc2VIZWFkZXJzLGNvb2tpZXM6dGhpcy5fYnVpbGRDb29raWVzKHRoaXMuX3JlcXVlc3QucmVzcG9uc2VDb29raWVzfHxbXSksY29udGVudDp0aGlzLl9idWlsZENvbnRlbnQoKSxyZWRpcmVjdFVSTDp0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSGVhZGVyVmFsdWUoJ0xvY2F0aW9uJyl8fCcnLGhlYWRlcnNTaXplOmhlYWRlcnNUZXh0P2hlYWRlcnNUZXh0Lmxlbmd0aDotMSxib2R5U2l6ZTp0aGlzLnJlc3BvbnNlQm9keVNpemUsX3RyYW5zZmVyU2l6ZTp0aGlzLl9yZXF1ZXN0LnRyYW5zZmVyU2l6ZSxfZXJyb3I6dGhpcy5fcmVxdWVzdC5sb2NhbGl6ZWRGYWlsRGVzY3JpcHRpb259O30KX2J1aWxkQ29udGVudCgpe2NvbnN0IGNvbnRlbnQ9e3NpemU6dGhpcy5fcmVxdWVzdC5yZXNvdXJjZVNpemUsbWltZVR5cGU6dGhpcy5fcmVxdWVzdC5taW1lVHlwZXx8J3gtdW5rbm93bicsfTtjb25zdCBjb21wcmVzc2lvbj10aGlzLnJlc3BvbnNlQ29tcHJlc3Npb247aWYodHlwZW9mIGNvbXByZXNzaW9uPT09J251bWJlcicpCmNvbnRlbnQuY29tcHJlc3Npb249Y29tcHJlc3Npb247cmV0dXJuIGNvbnRlbnQ7fQpfYnVpbGRUaW1pbmdzKCl7Y29uc3QgdGltaW5nPXRoaXMuX3JlcXVlc3QudGltaW5nO2NvbnN0IGlzc3VlVGltZT10aGlzLl9yZXF1ZXN0Lmlzc3VlVGltZSgpO2NvbnN0IHN0YXJ0VGltZT10aGlzLl9yZXF1ZXN0LnN0YXJ0VGltZTtjb25zdCByZXN1bHQ9e2Jsb2NrZWQ6LTEsZG5zOi0xLHNzbDotMSxjb25uZWN0Oi0xLHNlbmQ6MCx3YWl0OjAscmVjZWl2ZTowLF9ibG9ja2VkX3F1ZXVlaW5nOi0xfTtjb25zdCBxdWV1ZWRUaW1lPShpc3N1ZVRpbWU8c3RhcnRUaW1lKT9zdGFydFRpbWUtaXNzdWVUaW1lOi0xO3Jlc3VsdC5ibG9ja2VkPXF1ZXVlZFRpbWU7cmVzdWx0Ll9ibG9ja2VkX3F1ZXVlaW5nPUJyb3dzZXJTREsuSEFSRW50cnkuX3RvTWlsbGlzZWNvbmRzKHF1ZXVlZFRpbWUpO2xldCBoaWdoZXN0VGltZT0wO2lmKHRpbWluZyl7Y29uc3QgYmxvY2tlZFN0YXJ0PWxlYXN0Tm9uTmVnYXRpdmUoW3RpbWluZy5kbnNTdGFydCx0aW1pbmcuY29ubmVjdFN0YXJ0LHRpbWluZy5zZW5kU3RhcnRdKTtpZihibG9ja2VkU3RhcnQhPT1JbmZpbml0eSkKcmVzdWx0LmJsb2NrZWQrPWJsb2NrZWRTdGFydDtpZih0aW1pbmcucHJveHlFbmQhPT0tMSkKcmVzdWx0Ll9ibG9ja2VkX3Byb3h5PXRpbWluZy5wcm94eUVuZC10aW1pbmcucHJveHlTdGFydDtpZihyZXN1bHQuX2Jsb2NrZWRfcHJveHkmJnJlc3VsdC5fYmxvY2tlZF9wcm94eT5yZXN1bHQuYmxvY2tlZCkKcmVzdWx0LmJsb2NrZWQ9cmVzdWx0Ll9ibG9ja2VkX3Byb3h5O2NvbnN0IGRuc1N0YXJ0PXRpbWluZy5kbnNFbmQ+PTA/YmxvY2tlZFN0YXJ0OjA7Y29uc3QgZG5zRW5kPXRpbWluZy5kbnNFbmQ+PTA/dGltaW5nLmRuc0VuZDotMTtyZXN1bHQuZG5zPWRuc0VuZC1kbnNTdGFydDtjb25zdCBzc2xTdGFydD10aW1pbmcuc3NsRW5kPjA/dGltaW5nLnNzbFN0YXJ0OjA7Y29uc3Qgc3NsRW5kPXRpbWluZy5zc2xFbmQ+MD90aW1pbmcuc3NsRW5kOi0xO3Jlc3VsdC5zc2w9c3NsRW5kLXNzbFN0YXJ0O2NvbnN0IGNvbm5lY3RTdGFydD10aW1pbmcuY29ubmVjdEVuZD49MD9sZWFzdE5vbk5lZ2F0aXZlKFtkbnNFbmQsYmxvY2tlZFN0YXJ0XSk6MDtjb25zdCBjb25uZWN0RW5kPXRpbWluZy5jb25uZWN0RW5kPj0wP3RpbWluZy5jb25uZWN0RW5kOi0xO3Jlc3VsdC5jb25uZWN0PWNvbm5lY3RFbmQtY29ubmVjdFN0YXJ0O2NvbnN0IHNlbmRTdGFydD10aW1pbmcuc2VuZEVuZD49MD9NYXRoLm1heChjb25uZWN0RW5kLGRuc0VuZCxibG9ja2VkU3RhcnQpOjA7Y29uc3Qgc2VuZEVuZD10aW1pbmcuc2VuZEVuZD49MD90aW1pbmcuc2VuZEVuZDowO3Jlc3VsdC5zZW5kPXNlbmRFbmQtc2VuZFN0YXJ0O2lmKHJlc3VsdC5zZW5kPDApCnJlc3VsdC5zZW5kPTA7aGlnaGVzdFRpbWU9TWF0aC5tYXgoc2VuZEVuZCxjb25uZWN0RW5kLHNzbEVuZCxkbnNFbmQsYmxvY2tlZFN0YXJ0LDApO31lbHNlIGlmKHRoaXMuX3JlcXVlc3QucmVzcG9uc2VSZWNlaXZlZFRpbWU9PT0tMSl7cmVzdWx0LmJsb2NrZWQ9dGhpcy5fcmVxdWVzdC5lbmRUaW1lLWlzc3VlVGltZTtyZXR1cm4gcmVzdWx0O30KY29uc3QgcmVxdWVzdFRpbWU9dGltaW5nP3RpbWluZy5yZXF1ZXN0VGltZTpzdGFydFRpbWU7Y29uc3Qgd2FpdFN0YXJ0PWhpZ2hlc3RUaW1lO2NvbnN0IHdhaXRFbmQ9QnJvd3NlclNESy5IQVJFbnRyeS5fdG9NaWxsaXNlY29uZHModGhpcy5fcmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZS1yZXF1ZXN0VGltZSk7cmVzdWx0LndhaXQ9d2FpdEVuZC13YWl0U3RhcnQ7Y29uc3QgcmVjZWl2ZVN0YXJ0PXdhaXRFbmQ7Y29uc3QgcmVjZWl2ZUVuZD1Ccm93c2VyU0RLLkhBUkVudHJ5Ll90b01pbGxpc2Vjb25kcyh0aGlzLl9yZXF1ZXN0LmVuZFRpbWUtaXNzdWVUaW1lKTtyZXN1bHQucmVjZWl2ZT1NYXRoLm1heChyZWNlaXZlRW5kLXJlY2VpdmVTdGFydCwwKTtyZXR1cm4gcmVzdWx0O2Z1bmN0aW9uIGxlYXN0Tm9uTmVnYXRpdmUodmFsdWVzKXtyZXR1cm4gdmFsdWVzLnJlZHVjZSgoYmVzdCx2YWx1ZSk9Pih2YWx1ZT49MCYmdmFsdWU8YmVzdCk/dmFsdWU6YmVzdCxJbmZpbml0eSk7fX0KYXN5bmMgX2J1aWxkUG9zdERhdGEoKXtjb25zdCBwb3N0RGF0YT1hd2FpdCB0aGlzLl9yZXF1ZXN0LnJlcXVlc3RGb3JtRGF0YSgpO2lmKCFwb3N0RGF0YSkKcmV0dXJuIG51bGw7Y29uc3QgcmVzPXttaW1lVHlwZTp0aGlzLl9yZXF1ZXN0LnJlcXVlc3RDb250ZW50VHlwZSgpLHRleHQ6cG9zdERhdGF9O2NvbnN0IGZvcm1QYXJhbWV0ZXJzPWF3YWl0IHRoaXMuX3JlcXVlc3QuZm9ybVBhcmFtZXRlcnMoKTtpZihmb3JtUGFyYW1ldGVycykKcmVzLnBhcmFtcz10aGlzLl9idWlsZFBhcmFtZXRlcnMoZm9ybVBhcmFtZXRlcnMpO3JldHVybiByZXM7fQpfYnVpbGRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpe3JldHVybiBwYXJhbWV0ZXJzLnNsaWNlKCk7fQpfYnVpbGRSZXF1ZXN0VVJMKHVybCl7cmV0dXJuIHVybC5zcGxpdCgnIycsMilbMF07fQpfYnVpbGRDb29raWVzKGNvb2tpZXMpe3JldHVybiBjb29raWVzLm1hcCh0aGlzLl9idWlsZENvb2tpZS5iaW5kKHRoaXMpKTt9Cl9idWlsZENvb2tpZShjb29raWUpe2NvbnN0IGM9e25hbWU6Y29va2llLm5hbWUoKSx2YWx1ZTpjb29raWUudmFsdWUoKSxwYXRoOmNvb2tpZS5wYXRoKCksZG9tYWluOmNvb2tpZS5kb21haW4oKSxleHBpcmVzOmNvb2tpZS5leHBpcmVzRGF0ZShCcm93c2VyU0RLLkhBUkxvZy5wc2V1ZG9XYWxsVGltZSh0aGlzLl9yZXF1ZXN0LHRoaXMuX3JlcXVlc3Quc3RhcnRUaW1lKSksaHR0cE9ubHk6Y29va2llLmh0dHBPbmx5KCksc2VjdXJlOmNvb2tpZS5zZWN1cmUoKX07aWYoY29va2llLnNhbWVTaXRlKCkpCmMuc2FtZVNpdGU9Y29va2llLnNhbWVTaXRlKCk7cmV0dXJuIGM7fQpnZXQgcmVxdWVzdEJvZHlTaXplKCl7cmV0dXJuIXRoaXMuX3JlcXVlc3QucmVxdWVzdEZvcm1EYXRhPzA6dGhpcy5fcmVxdWVzdC5yZXF1ZXN0Rm9ybURhdGEubGVuZ3RoO30KZ2V0IHJlc3BvbnNlQm9keVNpemUoKXtpZih0aGlzLl9yZXF1ZXN0LmNhY2hlZCgpfHx0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGU9PT0zMDQpCnJldHVybiAwO2lmKCF0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQpCnJldHVybi0xO3JldHVybiB0aGlzLl9yZXF1ZXN0LnRyYW5zZmVyU2l6ZS10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQubGVuZ3RoO30KZ2V0IHJlc3BvbnNlQ29tcHJlc3Npb24oKXtpZih0aGlzLl9yZXF1ZXN0LmNhY2hlZCgpfHx0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGU9PT0zMDR8fHRoaXMuX3JlcXVlc3Quc3RhdHVzQ29kZT09PTIwNikKcmV0dXJuO2lmKCF0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQpCnJldHVybjtyZXR1cm4gdGhpcy5fcmVxdWVzdC5yZXNvdXJjZVNpemUtdGhpcy5yZXNwb25zZUJvZHlTaXplO319O0Jyb3dzZXJTREsuSEFSRW50cnkuVGltaW5nO0Jyb3dzZXJTREsuSEFSTG9nPWNsYXNze3N0YXRpYyBwc2V1ZG9XYWxsVGltZShyZXF1ZXN0LG1vbm90b25pY1RpbWUpe3JldHVybiBuZXcgRGF0ZShyZXF1ZXN0LnBzZXVkb1dhbGxUaW1lKG1vbm90b25pY1RpbWUpKjEwMDApO30Kc3RhdGljIGFzeW5jIGJ1aWxkKHJlcXVlc3RzKXtjb25zdCBsb2c9bmV3IEJyb3dzZXJTREsuSEFSTG9nKCk7Y29uc3QgZW50cnlQcm9taXNlcz1bXTtmb3IoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykKZW50cnlQcm9taXNlcy5wdXNoKEJyb3dzZXJTREsuSEFSRW50cnkuYnVpbGQocmVxdWVzdCkpO2NvbnN0IGVudHJpZXM9YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQcm9taXNlcyk7cmV0dXJue3ZlcnNpb246JzEuMicsY3JlYXRvcjpsb2cuX2NyZWF0b3IoKSxwYWdlczpsb2cuX2J1aWxkUGFnZXMocmVxdWVzdHMpLGVudHJpZXM6ZW50cmllc307fQpfY3JlYXRvcigpe2NvbnN0IHdlYktpdFZlcnNpb249L0FwcGxlV2ViS2l0XC8oW14gXSspLy5leGVjKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtyZXR1cm57bmFtZTonV2ViSW5zcGVjdG9yJyx2ZXJzaW9uOndlYktpdFZlcnNpb24/d2ViS2l0VmVyc2lvblsxXTonbi9hJ307fQpfYnVpbGRQYWdlcyhyZXF1ZXN0cyl7Y29uc3Qgc2VlbklkZW50aWZpZXJzPXt9O2NvbnN0IHBhZ2VzPVtdO2ZvcihsZXQgaT0wO2k8cmVxdWVzdHMubGVuZ3RoOysraSl7Y29uc3QgcmVxdWVzdD1yZXF1ZXN0c1tpXTtjb25zdCBwYWdlPUJyb3dzZXJTREsuUGFnZUxvYWQuZm9yUmVxdWVzdChyZXF1ZXN0KTtpZighcGFnZXx8c2VlbklkZW50aWZpZXJzW3BhZ2UuaWRdKQpjb250aW51ZTtzZWVuSWRlbnRpZmllcnNbcGFnZS5pZF09dHJ1ZTtwYWdlcy5wdXNoKHRoaXMuX2NvbnZlcnRQYWdlKHBhZ2UscmVxdWVzdCkpO30KcmV0dXJuIHBhZ2VzO30KX2NvbnZlcnRQYWdlKHBhZ2UscmVxdWVzdCl7cmV0dXJue3N0YXJ0ZWREYXRlVGltZTpCcm93c2VyU0RLLkhBUkxvZy5wc2V1ZG9XYWxsVGltZShyZXF1ZXN0LHBhZ2Uuc3RhcnRUaW1lKS50b0pTT04oKSxpZDoncGFnZV8nK3BhZ2UuaWQsdGl0bGU6cGFnZS51cmwscGFnZVRpbWluZ3M6e29uQ29udGVudExvYWQ6dGhpcy5fcGFnZUV2ZW50VGltZShwYWdlLHBhZ2UuY29udGVudExvYWRUaW1lKSxvbkxvYWQ6dGhpcy5fcGFnZUV2ZW50VGltZShwYWdlLHBhZ2UubG9hZFRpbWUpfX07fQpfcGFnZUV2ZW50VGltZShwYWdlLHRpbWUpe2NvbnN0IHN0YXJ0VGltZT1wYWdlLnN0YXJ0VGltZTtpZih0aW1lPT09LTF8fHN0YXJ0VGltZT09PS0xKQpyZXR1cm4tMTtyZXR1cm4gQnJvd3NlclNESy5IQVJFbnRyeS5fdG9NaWxsaXNlY29uZHModGltZS1zdGFydFRpbWUpO319OztzZWxmWydFeHRlbnNpb25zJ109c2VsZlsnRXh0ZW5zaW9ucyddfHx7fTtmdW5jdGlvbiBkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzKGFwaVByaXZhdGUpe2lmKCFhcGlQcml2YXRlLnBhbmVscykKYXBpUHJpdmF0ZS5wYW5lbHM9e307YXBpUHJpdmF0ZS5wYW5lbHMuU2VhcmNoQWN0aW9uPXtDYW5jZWxTZWFyY2g6J2NhbmNlbFNlYXJjaCcsUGVyZm9ybVNlYXJjaDoncGVyZm9ybVNlYXJjaCcsTmV4dFNlYXJjaFJlc3VsdDonbmV4dFNlYXJjaFJlc3VsdCcsUHJldmlvdXNTZWFyY2hSZXN1bHQ6J3ByZXZpb3VzU2VhcmNoUmVzdWx0J307YXBpUHJpdmF0ZS5FdmVudHM9e0J1dHRvbkNsaWNrZWQ6J2J1dHRvbi1jbGlja2VkLScsUGFuZWxPYmplY3RTZWxlY3RlZDoncGFuZWwtb2JqZWN0U2VsZWN0ZWQtJyxOZXR3b3JrUmVxdWVzdEZpbmlzaGVkOiduZXR3b3JrLXJlcXVlc3QtZmluaXNoZWQnLE9wZW5SZXNvdXJjZTonb3Blbi1yZXNvdXJjZScsUGFuZWxTZWFyY2g6J3BhbmVsLXNlYXJjaC0nLFJlY29yZGluZ1N0YXJ0ZWQ6J3RyYWNlLXJlY29yZGluZy1zdGFydGVkLScsUmVjb3JkaW5nU3RvcHBlZDondHJhY2UtcmVjb3JkaW5nLXN0b3BwZWQtJyxSZXNvdXJjZUFkZGVkOidyZXNvdXJjZS1hZGRlZCcsUmVzb3VyY2VDb250ZW50Q29tbWl0dGVkOidyZXNvdXJjZS1jb250ZW50LWNvbW1pdHRlZCcsVmlld1Nob3duOid2aWV3LXNob3duLScsVmlld0hpZGRlbjondmlldy1oaWRkZW4tJ307YXBpUHJpdmF0ZS5Db21tYW5kcz17QWRkUmVxdWVzdEhlYWRlcnM6J2FkZFJlcXVlc3RIZWFkZXJzJyxBZGRUcmFjZVByb3ZpZGVyOidhZGRUcmFjZVByb3ZpZGVyJyxBcHBseVN0eWxlU2hlZXQ6J2FwcGx5U3R5bGVTaGVldCcsQ29tcGxldGVUcmFjZVNlc3Npb246J2NvbXBsZXRlVHJhY2VTZXNzaW9uJyxDcmVhdGVQYW5lbDonY3JlYXRlUGFuZWwnLENyZWF0ZVNpZGViYXJQYW5lOidjcmVhdGVTaWRlYmFyUGFuZScsQ3JlYXRlVG9vbGJhckJ1dHRvbjonY3JlYXRlVG9vbGJhckJ1dHRvbicsRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2U6J2V2YWx1YXRlT25JbnNwZWN0ZWRQYWdlJyxGb3J3YXJkS2V5Ym9hcmRFdmVudDonX2ZvcndhcmRLZXlib2FyZEV2ZW50JyxHZXRIQVI6J2dldEhBUicsR2V0UGFnZVJlc291cmNlczonZ2V0UGFnZVJlc291cmNlcycsR2V0UmVxdWVzdENvbnRlbnQ6J2dldFJlcXVlc3RDb250ZW50JyxHZXRSZXNvdXJjZUNvbnRlbnQ6J2dldFJlc291cmNlQ29udGVudCcsSW5zcGVjdGVkVVJMQ2hhbmdlZDonaW5zcGVjdGVkVVJMQ2hhbmdlZCcsT3BlblJlc291cmNlOidvcGVuUmVzb3VyY2UnLFJlbG9hZDonUmVsb2FkJyxTdWJzY3JpYmU6J3N1YnNjcmliZScsU2V0T3BlblJlc291cmNlSGFuZGxlcjonc2V0T3BlblJlc291cmNlSGFuZGxlcicsU2V0UmVzb3VyY2VDb250ZW50OidzZXRSZXNvdXJjZUNvbnRlbnQnLFNldFNpZGViYXJDb250ZW50OidzZXRTaWRlYmFyQ29udGVudCcsU2V0U2lkZWJhckhlaWdodDonc2V0U2lkZWJhckhlaWdodCcsU2V0U2lkZWJhclBhZ2U6J3NldFNpZGViYXJQYWdlJyxTaG93UGFuZWw6J3Nob3dQYW5lbCcsVW5zdWJzY3JpYmU6J3Vuc3Vic2NyaWJlJyxVcGRhdGVCdXR0b246J3VwZGF0ZUJ1dHRvbid9O30KZnVuY3Rpb24gaW5qZWN0ZWRFeHRlbnNpb25BUEkoZXh0ZW5zaW9uSW5mbyxpbnNwZWN0ZWRUYWJJZCx0aGVtZU5hbWUsdGVzdEhvb2ssaW5qZWN0ZWRTY3JpcHRJZCl7Y29uc3QgY2hyb21lPXdpbmRvdy5jaHJvbWV8fHt9O2NvbnN0IGRldnRvb2xzX2Rlc2NyaXB0b3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjaHJvbWUsJ2RldnRvb2xzJyk7aWYoZGV2dG9vbHNfZGVzY3JpcHRvcikKcmV0dXJuO2NvbnN0IGFwaVByaXZhdGU9e307ZGVmaW5lQ29tbW9uRXh0ZW5zaW9uU3ltYm9scyhhcGlQcml2YXRlKTtjb25zdCBjb21tYW5kcz1hcGlQcml2YXRlLkNvbW1hbmRzO2NvbnN0IGV2ZW50cz1hcGlQcml2YXRlLkV2ZW50cztsZXQgdXNlckFjdGlvbj1mYWxzZTtmdW5jdGlvbiBFdmVudFNpbmtJbXBsKHR5cGUsY3VzdG9tRGlzcGF0Y2gpe3RoaXMuX3R5cGU9dHlwZTt0aGlzLl9saXN0ZW5lcnM9W107dGhpcy5fY3VzdG9tRGlzcGF0Y2g9Y3VzdG9tRGlzcGF0Y2g7fQpFdmVudFNpbmtJbXBsLnByb3RvdHlwZT17YWRkTGlzdGVuZXI6ZnVuY3Rpb24oY2FsbGJhY2spe2lmKHR5cGVvZiBjYWxsYmFjayE9PSdmdW5jdGlvbicpCnRocm93J2FkZExpc3RlbmVyOiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbic7aWYodGhpcy5fbGlzdGVuZXJzLmxlbmd0aD09PTApCmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5TdWJzY3JpYmUsdHlwZTp0aGlzLl90eXBlfSk7dGhpcy5fbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO2V4dGVuc2lvblNlcnZlci5yZWdpc3RlckhhbmRsZXIoJ25vdGlmeS0nK3RoaXMuX3R5cGUsdGhpcy5fZGlzcGF0Y2guYmluZCh0aGlzKSk7fSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihjYWxsYmFjayl7Y29uc3QgbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVycztmb3IobGV0IGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7KytpKXtpZihsaXN0ZW5lcnNbaV09PT1jYWxsYmFjayl7bGlzdGVuZXJzLnNwbGljZShpLDEpO2JyZWFrO319CmlmKHRoaXMuX2xpc3RlbmVycy5sZW5ndGg9PT0wKQpleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuVW5zdWJzY3JpYmUsdHlwZTp0aGlzLl90eXBlfSk7fSxfZmlyZTpmdW5jdGlvbih2YXJhcmcpe2NvbnN0IGxpc3RlbmVycz10aGlzLl9saXN0ZW5lcnMuc2xpY2UoKTtmb3IobGV0IGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7KytpKQpsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCxhcmd1bWVudHMpO30sX2Rpc3BhdGNoOmZ1bmN0aW9uKHJlcXVlc3Qpe2lmKHRoaXMuX2N1c3RvbURpc3BhdGNoKQp0aGlzLl9jdXN0b21EaXNwYXRjaC5jYWxsKHRoaXMscmVxdWVzdCk7ZWxzZQp0aGlzLl9maXJlLmFwcGx5KHRoaXMscmVxdWVzdC5hcmd1bWVudHMpO319O2Z1bmN0aW9uIEluc3BlY3RvckV4dGVuc2lvbkFQSSgpe3RoaXMuaW5zcGVjdGVkV2luZG93PW5ldyBJbnNwZWN0ZWRXaW5kb3coKTt0aGlzLnBhbmVscz1uZXcgUGFuZWxzKCk7dGhpcy5uZXR3b3JrPW5ldyBOZXR3b3JrKCk7dGhpcy50aW1lbGluZT1uZXcgVGltZWxpbmUoKTtkZWZpbmVEZXByZWNhdGVkUHJvcGVydHkodGhpcywnd2ViSW5zcGVjdG9yJywncmVzb3VyY2VzJywnbmV0d29yaycpO30KZnVuY3Rpb24gTmV0d29yaygpe2Z1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdEV2ZW50KG1lc3NhZ2Upe2NvbnN0IHJlcXVlc3Q9bWVzc2FnZS5hcmd1bWVudHNbMV07cmVxdWVzdC5fX3Byb3RvX189bmV3IFJlcXVlc3QobWVzc2FnZS5hcmd1bWVudHNbMF0pO3RoaXMuX2ZpcmUocmVxdWVzdCk7fQp0aGlzLm9uUmVxdWVzdEZpbmlzaGVkPW5ldyBFdmVudFNpbmsoZXZlbnRzLk5ldHdvcmtSZXF1ZXN0RmluaXNoZWQsZGlzcGF0Y2hSZXF1ZXN0RXZlbnQpO2RlZmluZURlcHJlY2F0ZWRQcm9wZXJ0eSh0aGlzLCduZXR3b3JrJywnb25GaW5pc2hlZCcsJ29uUmVxdWVzdEZpbmlzaGVkJyk7dGhpcy5vbk5hdmlnYXRlZD1uZXcgRXZlbnRTaW5rKGV2ZW50cy5JbnNwZWN0ZWRVUkxDaGFuZ2VkKTt9Ck5ldHdvcmsucHJvdG90eXBlPXtnZXRIQVI6ZnVuY3Rpb24oY2FsbGJhY2spe2Z1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXN1bHQpe2NvbnN0IGVudHJpZXM9KHJlc3VsdCYmcmVzdWx0LmVudHJpZXMpfHxbXTtmb3IobGV0IGk9MDtpPGVudHJpZXMubGVuZ3RoOysraSl7ZW50cmllc1tpXS5fX3Byb3RvX189bmV3IFJlcXVlc3QoZW50cmllc1tpXS5fcmVxdWVzdElkKTtkZWxldGUgZW50cmllc1tpXS5fcmVxdWVzdElkO30KY2FsbGJhY2socmVzdWx0KTt9CmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5HZXRIQVJ9LGNhbGxiYWNrJiZjYWxsYmFja1dyYXBwZXIpO30sYWRkUmVxdWVzdEhlYWRlcnM6ZnVuY3Rpb24oaGVhZGVycyl7ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOmNvbW1hbmRzLkFkZFJlcXVlc3RIZWFkZXJzLGhlYWRlcnM6aGVhZGVycyxleHRlbnNpb25JZDp3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9KTt9fTtmdW5jdGlvbiBSZXF1ZXN0SW1wbChpZCl7dGhpcy5faWQ9aWQ7fQpSZXF1ZXN0SW1wbC5wcm90b3R5cGU9e2dldENvbnRlbnQ6ZnVuY3Rpb24oY2FsbGJhY2spe2Z1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXNwb25zZSl7Y2FsbGJhY2socmVzcG9uc2UuY29udGVudCxyZXNwb25zZS5lbmNvZGluZyk7fQpleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuR2V0UmVxdWVzdENvbnRlbnQsaWQ6dGhpcy5faWR9LGNhbGxiYWNrJiZjYWxsYmFja1dyYXBwZXIpO319O2Z1bmN0aW9uIFBhbmVscygpe2NvbnN0IHBhbmVscz17ZWxlbWVudHM6bmV3IEVsZW1lbnRzUGFuZWwoKSxzb3VyY2VzOm5ldyBTb3VyY2VzUGFuZWwoKSx9O2Z1bmN0aW9uIHBhbmVsR2V0dGVyKG5hbWUpe3JldHVybiBwYW5lbHNbbmFtZV07fQpmb3IoY29uc3QgcGFuZWwgaW4gcGFuZWxzKQp0aGlzLl9fZGVmaW5lR2V0dGVyX18ocGFuZWwscGFuZWxHZXR0ZXIuYmluZChudWxsLHBhbmVsKSk7dGhpcy5hcHBseVN0eWxlU2hlZXQ9ZnVuY3Rpb24oc3R5bGVTaGVldCl7ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOmNvbW1hbmRzLkFwcGx5U3R5bGVTaGVldCxzdHlsZVNoZWV0OnN0eWxlU2hlZXR9KTt9O30KUGFuZWxzLnByb3RvdHlwZT17Y3JlYXRlOmZ1bmN0aW9uKHRpdGxlLGljb24scGFnZSxjYWxsYmFjayl7Y29uc3QgaWQ9J2V4dGVuc2lvbi1wYW5lbC0nK2V4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQoKTtjb25zdCByZXF1ZXN0PXtjb21tYW5kOmNvbW1hbmRzLkNyZWF0ZVBhbmVsLGlkOmlkLHRpdGxlOnRpdGxlLGljb246aWNvbixwYWdlOnBhZ2V9O2V4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0LGNhbGxiYWNrJiZjYWxsYmFjay5iaW5kKHRoaXMsbmV3IEV4dGVuc2lvblBhbmVsKGlkKSkpO30sc2V0T3BlblJlc291cmNlSGFuZGxlcjpmdW5jdGlvbihjYWxsYmFjayl7Y29uc3QgaGFkSGFuZGxlcj1leHRlbnNpb25TZXJ2ZXIuaGFzSGFuZGxlcihldmVudHMuT3BlblJlc291cmNlKTtmdW5jdGlvbiBjYWxsYmFja1dyYXBwZXIobWVzc2FnZSl7dXNlckFjdGlvbj10cnVlO3RyeXtjYWxsYmFjay5jYWxsKG51bGwsbmV3IFJlc291cmNlKG1lc3NhZ2UucmVzb3VyY2UpLG1lc3NhZ2UubGluZU51bWJlcik7fWZpbmFsbHl7dXNlckFjdGlvbj1mYWxzZTt9fQppZighY2FsbGJhY2spCmV4dGVuc2lvblNlcnZlci51bnJlZ2lzdGVySGFuZGxlcihldmVudHMuT3BlblJlc291cmNlKTtlbHNlCmV4dGVuc2lvblNlcnZlci5yZWdpc3RlckhhbmRsZXIoZXZlbnRzLk9wZW5SZXNvdXJjZSxjYWxsYmFja1dyYXBwZXIpO2lmKGhhZEhhbmRsZXI9PT0hY2FsbGJhY2spCmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5TZXRPcGVuUmVzb3VyY2VIYW5kbGVyLCdoYW5kbGVyUHJlc2VudCc6ISFjYWxsYmFja30pO30sb3BlblJlc291cmNlOmZ1bmN0aW9uKHVybCxsaW5lTnVtYmVyLGNhbGxiYWNrKXtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuT3BlblJlc291cmNlLCd1cmwnOnVybCwnbGluZU51bWJlcic6bGluZU51bWJlcn0sY2FsbGJhY2spO30sZ2V0IFNlYXJjaEFjdGlvbigpe3JldHVybiBhcGlQcml2YXRlLnBhbmVscy5TZWFyY2hBY3Rpb247fX07ZnVuY3Rpb24gRXh0ZW5zaW9uVmlld0ltcGwoaWQpe3RoaXMuX2lkPWlkO2Z1bmN0aW9uIGRpc3BhdGNoU2hvd0V2ZW50KG1lc3NhZ2Upe2NvbnN0IGZyYW1lSW5kZXg9bWVzc2FnZS5hcmd1bWVudHNbMF07aWYodHlwZW9mIGZyYW1lSW5kZXg9PT0nbnVtYmVyJykKdGhpcy5fZmlyZSh3aW5kb3cucGFyZW50LmZyYW1lc1tmcmFtZUluZGV4XSk7ZWxzZQp0aGlzLl9maXJlKCk7fQppZihpZCl7dGhpcy5vblNob3duPW5ldyBFdmVudFNpbmsoZXZlbnRzLlZpZXdTaG93bitpZCxkaXNwYXRjaFNob3dFdmVudCk7dGhpcy5vbkhpZGRlbj1uZXcgRXZlbnRTaW5rKGV2ZW50cy5WaWV3SGlkZGVuK2lkKTt9fQpmdW5jdGlvbiBQYW5lbFdpdGhTaWRlYmFySW1wbChob3N0UGFuZWxOYW1lKXtFeHRlbnNpb25WaWV3SW1wbC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5faG9zdFBhbmVsTmFtZT1ob3N0UGFuZWxOYW1lO3RoaXMub25TZWxlY3Rpb25DaGFuZ2VkPW5ldyBFdmVudFNpbmsoZXZlbnRzLlBhbmVsT2JqZWN0U2VsZWN0ZWQraG9zdFBhbmVsTmFtZSk7fQpQYW5lbFdpdGhTaWRlYmFySW1wbC5wcm90b3R5cGU9e2NyZWF0ZVNpZGViYXJQYW5lOmZ1bmN0aW9uKHRpdGxlLGNhbGxiYWNrKXtjb25zdCBpZD0nZXh0ZW5zaW9uLXNpZGViYXItJytleHRlbnNpb25TZXJ2ZXIubmV4dE9iamVjdElkKCk7Y29uc3QgcmVxdWVzdD17Y29tbWFuZDpjb21tYW5kcy5DcmVhdGVTaWRlYmFyUGFuZSxwYW5lbDp0aGlzLl9ob3N0UGFuZWxOYW1lLGlkOmlkLHRpdGxlOnRpdGxlfTtmdW5jdGlvbiBjYWxsYmFja1dyYXBwZXIoKXtjYWxsYmFjayhuZXcgRXh0ZW5zaW9uU2lkZWJhclBhbmUoaWQpKTt9CmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0LGNhbGxiYWNrJiZjYWxsYmFja1dyYXBwZXIpO30sX19wcm90b19fOkV4dGVuc2lvblZpZXdJbXBsLnByb3RvdHlwZX07ZnVuY3Rpb24gZGVjbGFyZUludGVyZmFjZUNsYXNzKGltcGxDb25zdHJ1Y3Rvcil7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgaW1wbD17X19wcm90b19fOmltcGxDb25zdHJ1Y3Rvci5wcm90b3R5cGV9O2ltcGxDb25zdHJ1Y3Rvci5hcHBseShpbXBsLGFyZ3VtZW50cyk7cG9wdWxhdGVJbnRlcmZhY2VDbGFzcyh0aGlzLGltcGwpO307fQpmdW5jdGlvbiBkZWZpbmVEZXByZWNhdGVkUHJvcGVydHkob2JqZWN0LGNsYXNzTmFtZSxvbGROYW1lLG5ld05hbWUpe2xldCB3YXJuaW5nR2l2ZW49ZmFsc2U7ZnVuY3Rpb24gZ2V0dGVyKCl7aWYoIXdhcm5pbmdHaXZlbil7Y29uc29sZS53YXJuKGNsYXNzTmFtZSsnLicrb2xkTmFtZSsnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnK2NsYXNzTmFtZSsnLicrbmV3TmFtZSsnIGluc3RlYWQnKTt3YXJuaW5nR2l2ZW49dHJ1ZTt9CnJldHVybiBvYmplY3RbbmV3TmFtZV07fQpvYmplY3QuX19kZWZpbmVHZXR0ZXJfXyhvbGROYW1lLGdldHRlcik7fQpmdW5jdGlvbiBleHRyYWN0Q2FsbGJhY2tBcmd1bWVudChhcmdzKXtjb25zdCBsYXN0QXJndW1lbnQ9YXJnc1thcmdzLmxlbmd0aC0xXTtyZXR1cm4gdHlwZW9mIGxhc3RBcmd1bWVudD09PSdmdW5jdGlvbic/bGFzdEFyZ3VtZW50OnVuZGVmaW5lZDt9CmNvbnN0IEJ1dHRvbj1kZWNsYXJlSW50ZXJmYWNlQ2xhc3MoQnV0dG9uSW1wbCk7Y29uc3QgRXZlbnRTaW5rPWRlY2xhcmVJbnRlcmZhY2VDbGFzcyhFdmVudFNpbmtJbXBsKTtjb25zdCBFeHRlbnNpb25QYW5lbD1kZWNsYXJlSW50ZXJmYWNlQ2xhc3MoRXh0ZW5zaW9uUGFuZWxJbXBsKTtjb25zdCBFeHRlbnNpb25TaWRlYmFyUGFuZT1kZWNsYXJlSW50ZXJmYWNlQ2xhc3MoRXh0ZW5zaW9uU2lkZWJhclBhbmVJbXBsKTtjb25zdCBQYW5lbFdpdGhTaWRlYmFyPWRlY2xhcmVJbnRlcmZhY2VDbGFzcyhQYW5lbFdpdGhTaWRlYmFySW1wbCk7Y29uc3QgUmVxdWVzdD1kZWNsYXJlSW50ZXJmYWNlQ2xhc3MoUmVxdWVzdEltcGwpO2NvbnN0IFJlc291cmNlPWRlY2xhcmVJbnRlcmZhY2VDbGFzcyhSZXNvdXJjZUltcGwpO2NvbnN0IFRyYWNlU2Vzc2lvbj1kZWNsYXJlSW50ZXJmYWNlQ2xhc3MoVHJhY2VTZXNzaW9uSW1wbCk7ZnVuY3Rpb24gRWxlbWVudHNQYW5lbCgpe1BhbmVsV2l0aFNpZGViYXIuY2FsbCh0aGlzLCdlbGVtZW50cycpO30KRWxlbWVudHNQYW5lbC5wcm90b3R5cGU9e19fcHJvdG9fXzpQYW5lbFdpdGhTaWRlYmFyLnByb3RvdHlwZX07ZnVuY3Rpb24gU291cmNlc1BhbmVsKCl7UGFuZWxXaXRoU2lkZWJhci5jYWxsKHRoaXMsJ3NvdXJjZXMnKTt9ClNvdXJjZXNQYW5lbC5wcm90b3R5cGU9e19fcHJvdG9fXzpQYW5lbFdpdGhTaWRlYmFyLnByb3RvdHlwZX07ZnVuY3Rpb24gRXh0ZW5zaW9uUGFuZWxJbXBsKGlkKXtFeHRlbnNpb25WaWV3SW1wbC5jYWxsKHRoaXMsaWQpO3RoaXMub25TZWFyY2g9bmV3IEV2ZW50U2luayhldmVudHMuUGFuZWxTZWFyY2graWQpO30KRXh0ZW5zaW9uUGFuZWxJbXBsLnByb3RvdHlwZT17Y3JlYXRlU3RhdHVzQmFyQnV0dG9uOmZ1bmN0aW9uKGljb25QYXRoLHRvb2x0aXBUZXh0LGRpc2FibGVkKXtjb25zdCBpZD0nYnV0dG9uLScrZXh0ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJZCgpO2NvbnN0IHJlcXVlc3Q9e2NvbW1hbmQ6Y29tbWFuZHMuQ3JlYXRlVG9vbGJhckJ1dHRvbixwYW5lbDp0aGlzLl9pZCxpZDppZCxpY29uOmljb25QYXRoLHRvb2x0aXA6dG9vbHRpcFRleHQsZGlzYWJsZWQ6ISFkaXNhYmxlZH07ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHJlcXVlc3QpO3JldHVybiBuZXcgQnV0dG9uKGlkKTt9LHNob3c6ZnVuY3Rpb24oKXtpZighdXNlckFjdGlvbikKcmV0dXJuO2NvbnN0IHJlcXVlc3Q9e2NvbW1hbmQ6Y29tbWFuZHMuU2hvd1BhbmVsLGlkOnRoaXMuX2lkfTtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCk7fSxfX3Byb3RvX186RXh0ZW5zaW9uVmlld0ltcGwucHJvdG90eXBlfTtmdW5jdGlvbiBFeHRlbnNpb25TaWRlYmFyUGFuZUltcGwoaWQpe0V4dGVuc2lvblZpZXdJbXBsLmNhbGwodGhpcyxpZCk7fQpFeHRlbnNpb25TaWRlYmFyUGFuZUltcGwucHJvdG90eXBlPXtzZXRIZWlnaHQ6ZnVuY3Rpb24oaGVpZ2h0KXtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuU2V0U2lkZWJhckhlaWdodCxpZDp0aGlzLl9pZCxoZWlnaHQ6aGVpZ2h0fSk7fSxzZXRFeHByZXNzaW9uOmZ1bmN0aW9uKGV4cHJlc3Npb24scm9vdFRpdGxlLGV2YWx1YXRlT3B0aW9ucyl7Y29uc3QgcmVxdWVzdD17Y29tbWFuZDpjb21tYW5kcy5TZXRTaWRlYmFyQ29udGVudCxpZDp0aGlzLl9pZCxleHByZXNzaW9uOmV4cHJlc3Npb24scm9vdFRpdGxlOnJvb3RUaXRsZSxldmFsdWF0ZU9uUGFnZTp0cnVlLH07aWYodHlwZW9mIGV2YWx1YXRlT3B0aW9ucz09PSdvYmplY3QnKQpyZXF1ZXN0LmV2YWx1YXRlT3B0aW9ucz1ldmFsdWF0ZU9wdGlvbnM7ZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHJlcXVlc3QsZXh0cmFjdENhbGxiYWNrQXJndW1lbnQoYXJndW1lbnRzKSk7fSxzZXRPYmplY3Q6ZnVuY3Rpb24oanNvbk9iamVjdCxyb290VGl0bGUsY2FsbGJhY2spe2V4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5TZXRTaWRlYmFyQ29udGVudCxpZDp0aGlzLl9pZCxleHByZXNzaW9uOmpzb25PYmplY3Qscm9vdFRpdGxlOnJvb3RUaXRsZX0sY2FsbGJhY2spO30sc2V0UGFnZTpmdW5jdGlvbihwYWdlKXtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuU2V0U2lkZWJhclBhZ2UsaWQ6dGhpcy5faWQscGFnZTpwYWdlfSk7fSxfX3Byb3RvX186RXh0ZW5zaW9uVmlld0ltcGwucHJvdG90eXBlfTtmdW5jdGlvbiBCdXR0b25JbXBsKGlkKXt0aGlzLl9pZD1pZDt0aGlzLm9uQ2xpY2tlZD1uZXcgRXZlbnRTaW5rKGV2ZW50cy5CdXR0b25DbGlja2VkK2lkKTt9CkJ1dHRvbkltcGwucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oaWNvblBhdGgsdG9vbHRpcFRleHQsZGlzYWJsZWQpe2NvbnN0IHJlcXVlc3Q9e2NvbW1hbmQ6Y29tbWFuZHMuVXBkYXRlQnV0dG9uLGlkOnRoaXMuX2lkLGljb246aWNvblBhdGgsdG9vbHRpcDp0b29sdGlwVGV4dCxkaXNhYmxlZDohIWRpc2FibGVkfTtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCk7fX07ZnVuY3Rpb24gVGltZWxpbmUoKXt9ClRpbWVsaW5lLnByb3RvdHlwZT17YWRkVHJhY2VQcm92aWRlcjpmdW5jdGlvbihjYXRlZ29yeU5hbWUsY2F0ZWdvcnlUb29sdGlwKXtjb25zdCBpZD0nZXh0ZW5zaW9uLXRyYWNlLXByb3ZpZGVyLScrZXh0ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJZCgpO2V4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5BZGRUcmFjZVByb3ZpZGVyLGlkOmlkLGNhdGVnb3J5TmFtZTpjYXRlZ29yeU5hbWUsY2F0ZWdvcnlUb29sdGlwOmNhdGVnb3J5VG9vbHRpcH0pO3JldHVybiBuZXcgVHJhY2VQcm92aWRlcihpZCk7fX07ZnVuY3Rpb24gVHJhY2VTZXNzaW9uSW1wbChpZCl7dGhpcy5faWQ9aWQ7fQpUcmFjZVNlc3Npb25JbXBsLnByb3RvdHlwZT17Y29tcGxldGU6ZnVuY3Rpb24odXJsLHRpbWVPZmZzZXQpe2NvbnN0IHJlcXVlc3Q9e2NvbW1hbmQ6Y29tbWFuZHMuQ29tcGxldGVUcmFjZVNlc3Npb24saWQ6dGhpcy5faWQsdXJsOnVybHx8JycsdGltZU9mZnNldDp0aW1lT2Zmc2V0fHwwfTtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCk7fX07ZnVuY3Rpb24gVHJhY2VQcm92aWRlcihpZCl7ZnVuY3Rpb24gZGlzcGF0Y2hSZWNvcmRpbmdTdGFydGVkKG1lc3NhZ2Upe2NvbnN0IHNlc3Npb25JZD1tZXNzYWdlLmFyZ3VtZW50c1swXTt0aGlzLl9maXJlKG5ldyBUcmFjZVNlc3Npb24oc2Vzc2lvbklkKSk7fQp0aGlzLm9uUmVjb3JkaW5nU3RhcnRlZD1uZXcgRXZlbnRTaW5rKGV2ZW50cy5SZWNvcmRpbmdTdGFydGVkK2lkLGRpc3BhdGNoUmVjb3JkaW5nU3RhcnRlZCk7dGhpcy5vblJlY29yZGluZ1N0b3BwZWQ9bmV3IEV2ZW50U2luayhldmVudHMuUmVjb3JkaW5nU3RvcHBlZCtpZCk7fQpmdW5jdGlvbiBJbnNwZWN0ZWRXaW5kb3coKXtmdW5jdGlvbiBkaXNwYXRjaFJlc291cmNlRXZlbnQobWVzc2FnZSl7dGhpcy5fZmlyZShuZXcgUmVzb3VyY2UobWVzc2FnZS5hcmd1bWVudHNbMF0pKTt9CmZ1bmN0aW9uIGRpc3BhdGNoUmVzb3VyY2VDb250ZW50RXZlbnQobWVzc2FnZSl7dGhpcy5fZmlyZShuZXcgUmVzb3VyY2UobWVzc2FnZS5hcmd1bWVudHNbMF0pLG1lc3NhZ2UuYXJndW1lbnRzWzFdKTt9CnRoaXMub25SZXNvdXJjZUFkZGVkPW5ldyBFdmVudFNpbmsoZXZlbnRzLlJlc291cmNlQWRkZWQsZGlzcGF0Y2hSZXNvdXJjZUV2ZW50KTt0aGlzLm9uUmVzb3VyY2VDb250ZW50Q29tbWl0dGVkPW5ldyBFdmVudFNpbmsoZXZlbnRzLlJlc291cmNlQ29udGVudENvbW1pdHRlZCxkaXNwYXRjaFJlc291cmNlQ29udGVudEV2ZW50KTt9Ckluc3BlY3RlZFdpbmRvdy5wcm90b3R5cGU9e3JlbG9hZDpmdW5jdGlvbihvcHRpb25zT3JVc2VyQWdlbnQpe2xldCBvcHRpb25zPW51bGw7aWYodHlwZW9mIG9wdGlvbnNPclVzZXJBZ2VudD09PSdvYmplY3QnKXtvcHRpb25zPW9wdGlvbnNPclVzZXJBZ2VudDt9ZWxzZSBpZih0eXBlb2Ygb3B0aW9uc09yVXNlckFnZW50PT09J3N0cmluZycpe29wdGlvbnM9e3VzZXJBZ2VudDpvcHRpb25zT3JVc2VyQWdlbnR9O2NvbnNvbGUud2FybignUGFzc2luZyB1c2VyQWdlbnQgYXMgc3RyaW5nIHBhcmFtZXRlciB0byBpbnNwZWN0ZWRXaW5kb3cucmVsb2FkKCkgaXMgZGVwcmVjYXRlZC4gJysnVXNlIGluc3BlY3RlZFdpbmRvdy5yZWxvYWQoeyB1c2VyQWdlbnQ6IHZhbHVlfSkgaW5zdGVhZC4nKTt9CmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5SZWxvYWQsb3B0aW9uczpvcHRpb25zfSk7fSxldmFsOmZ1bmN0aW9uKGV4cHJlc3Npb24sZXZhbHVhdGVPcHRpb25zKXtjb25zdCBjYWxsYmFjaz1leHRyYWN0Q2FsbGJhY2tBcmd1bWVudChhcmd1bWVudHMpO2Z1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXN1bHQpe2lmKHJlc3VsdC5pc0Vycm9yfHxyZXN1bHQuaXNFeGNlcHRpb24pCmNhbGxiYWNrKHVuZGVmaW5lZCxyZXN1bHQpO2Vsc2UKY2FsbGJhY2socmVzdWx0LnZhbHVlKTt9CmNvbnN0IHJlcXVlc3Q9e2NvbW1hbmQ6Y29tbWFuZHMuRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UsZXhwcmVzc2lvbjpleHByZXNzaW9ufTtpZih0eXBlb2YgZXZhbHVhdGVPcHRpb25zPT09J29iamVjdCcpCnJlcXVlc3QuZXZhbHVhdGVPcHRpb25zPWV2YWx1YXRlT3B0aW9ucztleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCxjYWxsYmFjayYmY2FsbGJhY2tXcmFwcGVyKTtyZXR1cm4gbnVsbDt9LGdldFJlc291cmNlczpmdW5jdGlvbihjYWxsYmFjayl7ZnVuY3Rpb24gd3JhcFJlc291cmNlKHJlc291cmNlRGF0YSl7cmV0dXJuIG5ldyBSZXNvdXJjZShyZXNvdXJjZURhdGEpO30KZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc291cmNlcyl7Y2FsbGJhY2socmVzb3VyY2VzLm1hcCh3cmFwUmVzb3VyY2UpKTt9CmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5HZXRQYWdlUmVzb3VyY2VzfSxjYWxsYmFjayYmY2FsbGJhY2tXcmFwcGVyKTt9fTtmdW5jdGlvbiBSZXNvdXJjZUltcGwocmVzb3VyY2VEYXRhKXt0aGlzLl91cmw9cmVzb3VyY2VEYXRhLnVybDt0aGlzLl90eXBlPXJlc291cmNlRGF0YS50eXBlO30KUmVzb3VyY2VJbXBsLnByb3RvdHlwZT17Z2V0IHVybCgpe3JldHVybiB0aGlzLl91cmw7fSxnZXQgdHlwZSgpe3JldHVybiB0aGlzLl90eXBlO30sZ2V0Q29udGVudDpmdW5jdGlvbihjYWxsYmFjayl7ZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3BvbnNlKXtjYWxsYmFjayhyZXNwb25zZS5jb250ZW50LHJlc3BvbnNlLmVuY29kaW5nKTt9CmV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDpjb21tYW5kcy5HZXRSZXNvdXJjZUNvbnRlbnQsdXJsOnRoaXMuX3VybH0sY2FsbGJhY2smJmNhbGxiYWNrV3JhcHBlcik7fSxzZXRDb250ZW50OmZ1bmN0aW9uKGNvbnRlbnQsY29tbWl0LGNhbGxiYWNrKXtleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6Y29tbWFuZHMuU2V0UmVzb3VyY2VDb250ZW50LHVybDp0aGlzLl91cmwsY29udGVudDpjb250ZW50LGNvbW1pdDpjb21taXR9LGNhbGxiYWNrKTt9fTtmdW5jdGlvbiBnZXRUYWJJZCgpe3JldHVybiBpbnNwZWN0ZWRUYWJJZDt9CmxldCBrZXlib2FyZEV2ZW50UmVxdWVzdFF1ZXVlPVtdO2xldCBmb3J3YXJkVGltZXI9bnVsbDtmdW5jdGlvbiBmb3J3YXJkS2V5Ym9hcmRFdmVudChldmVudCl7aWYoIWV2ZW50LmN0cmxLZXkmJiFldmVudC5hbHRLZXkmJiFldmVudC5tZXRhS2V5JiYhL15GXGQrJC8udGVzdChldmVudC5rZXkpJiZldmVudC5rZXkhPT0nRXNjYXBlJykKcmV0dXJuO2NvbnN0IHJlcXVlc3RQYXlsb2FkPXtldmVudFR5cGU6ZXZlbnQudHlwZSxjdHJsS2V5OmV2ZW50LmN0cmxLZXksYWx0S2V5OmV2ZW50LmFsdEtleSxtZXRhS2V5OmV2ZW50Lm1ldGFLZXksa2V5SWRlbnRpZmllcjpldmVudC5rZXlJZGVudGlmaWVyLGtleTpldmVudC5rZXksY29kZTpldmVudC5jb2RlLGxvY2F0aW9uOmV2ZW50LmxvY2F0aW9uLGtleUNvZGU6ZXZlbnQua2V5Q29kZX07a2V5Ym9hcmRFdmVudFJlcXVlc3RRdWV1ZS5wdXNoKHJlcXVlc3RQYXlsb2FkKTtpZighZm9yd2FyZFRpbWVyKQpmb3J3YXJkVGltZXI9c2V0VGltZW91dChmb3J3YXJkRXZlbnRRdWV1ZSwwKTt9CmZ1bmN0aW9uIGZvcndhcmRFdmVudFF1ZXVlKCl7Zm9yd2FyZFRpbWVyPW51bGw7Y29uc3QgcmVxdWVzdD17Y29tbWFuZDpjb21tYW5kcy5Gb3J3YXJkS2V5Ym9hcmRFdmVudCxlbnRyaWVzOmtleWJvYXJkRXZlbnRSZXF1ZXN0UXVldWV9O2V4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0KTtrZXlib2FyZEV2ZW50UmVxdWVzdFF1ZXVlPVtdO30KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZm9yd2FyZEtleWJvYXJkRXZlbnQsZmFsc2UpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJyxmb3J3YXJkS2V5Ym9hcmRFdmVudCxmYWxzZSk7ZnVuY3Rpb24gRXh0ZW5zaW9uU2VydmVyQ2xpZW50KCl7dGhpcy5fY2FsbGJhY2tzPXt9O3RoaXMuX2hhbmRsZXJzPXt9O3RoaXMuX2xhc3RSZXF1ZXN0SWQ9MDt0aGlzLl9sYXN0T2JqZWN0SWQ9MDt0aGlzLnJlZ2lzdGVySGFuZGxlcignY2FsbGJhY2snLHRoaXMuX29uQ2FsbGJhY2suYmluZCh0aGlzKSk7Y29uc3QgY2hhbm5lbD1uZXcgTWVzc2FnZUNoYW5uZWwoKTt0aGlzLl9wb3J0PWNoYW5uZWwucG9ydDE7dGhpcy5fcG9ydC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJyx0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fcG9ydC5zdGFydCgpO3dpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoJ3JlZ2lzdGVyRXh0ZW5zaW9uJywnKicsW2NoYW5uZWwucG9ydDJdKTt9CkV4dGVuc2lvblNlcnZlckNsaWVudC5wcm90b3R5cGU9e3NlbmRSZXF1ZXN0OmZ1bmN0aW9uKG1lc3NhZ2UsY2FsbGJhY2spe2lmKHR5cGVvZiBjYWxsYmFjaz09PSdmdW5jdGlvbicpCm1lc3NhZ2UucmVxdWVzdElkPXRoaXMuX3JlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spO3RoaXMuX3BvcnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7fSxoYXNIYW5kbGVyOmZ1bmN0aW9uKGNvbW1hbmQpe3JldHVybiEhdGhpcy5faGFuZGxlcnNbY29tbWFuZF07fSxyZWdpc3RlckhhbmRsZXI6ZnVuY3Rpb24oY29tbWFuZCxoYW5kbGVyKXt0aGlzLl9oYW5kbGVyc1tjb21tYW5kXT1oYW5kbGVyO30sdW5yZWdpc3RlckhhbmRsZXI6ZnVuY3Rpb24oY29tbWFuZCl7ZGVsZXRlIHRoaXMuX2hhbmRsZXJzW2NvbW1hbmRdO30sbmV4dE9iamVjdElkOmZ1bmN0aW9uKCl7cmV0dXJuIGluamVjdGVkU2NyaXB0SWQudG9TdHJpbmcoKSsnXycrICsrdGhpcy5fbGFzdE9iamVjdElkO30sX3JlZ2lzdGVyQ2FsbGJhY2s6ZnVuY3Rpb24oY2FsbGJhY2spe2NvbnN0IGlkPSsrdGhpcy5fbGFzdFJlcXVlc3RJZDt0aGlzLl9jYWxsYmFja3NbaWRdPWNhbGxiYWNrO3JldHVybiBpZDt9LF9vbkNhbGxiYWNrOmZ1bmN0aW9uKHJlcXVlc3Qpe2lmKHJlcXVlc3QucmVxdWVzdElkIGluIHRoaXMuX2NhbGxiYWNrcyl7Y29uc3QgY2FsbGJhY2s9dGhpcy5fY2FsbGJhY2tzW3JlcXVlc3QucmVxdWVzdElkXTtkZWxldGUgdGhpcy5fY2FsbGJhY2tzW3JlcXVlc3QucmVxdWVzdElkXTtjYWxsYmFjayhyZXF1ZXN0LnJlc3VsdCk7fX0sX29uTWVzc2FnZTpmdW5jdGlvbihldmVudCl7Y29uc3QgcmVxdWVzdD1ldmVudC5kYXRhO2NvbnN0IGhhbmRsZXI9dGhpcy5faGFuZGxlcnNbcmVxdWVzdC5jb21tYW5kXTtpZihoYW5kbGVyKQpoYW5kbGVyLmNhbGwodGhpcyxyZXF1ZXN0KTt9fTtmdW5jdGlvbiBwb3B1bGF0ZUludGVyZmFjZUNsYXNzKGludGVyZmF6ZSxpbXBsZW1lbnRhdGlvbil7Zm9yKGNvbnN0IG1lbWJlciBpbiBpbXBsZW1lbnRhdGlvbil7aWYobWVtYmVyLmNoYXJBdCgwKT09PSdfJykKY29udGludWU7bGV0IGRlc2NyaXB0b3I9bnVsbDtmb3IobGV0IG93bmVyPWltcGxlbWVudGF0aW9uO293bmVyJiYhZGVzY3JpcHRvcjtvd25lcj1vd25lci5fX3Byb3RvX18pCmRlc2NyaXB0b3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lcixtZW1iZXIpO2lmKCFkZXNjcmlwdG9yKQpjb250aW51ZTtpZih0eXBlb2YgZGVzY3JpcHRvci52YWx1ZT09PSdmdW5jdGlvbicpCmludGVyZmF6ZVttZW1iZXJdPWRlc2NyaXB0b3IudmFsdWUuYmluZChpbXBsZW1lbnRhdGlvbik7ZWxzZSBpZih0eXBlb2YgZGVzY3JpcHRvci5nZXQ9PT0nZnVuY3Rpb24nKQppbnRlcmZhemUuX19kZWZpbmVHZXR0ZXJfXyhtZW1iZXIsZGVzY3JpcHRvci5nZXQuYmluZChpbXBsZW1lbnRhdGlvbikpO2Vsc2UKT2JqZWN0LmRlZmluZVByb3BlcnR5KGludGVyZmF6ZSxtZW1iZXIsZGVzY3JpcHRvcik7fX0KY29uc3QgZXh0ZW5zaW9uU2VydmVyPW5ldyBFeHRlbnNpb25TZXJ2ZXJDbGllbnQoKTtjb25zdCBjb3JlQVBJPW5ldyBJbnNwZWN0b3JFeHRlbnNpb25BUEkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hyb21lLCdkZXZ0b29scycse3ZhbHVlOnt9LGVudW1lcmFibGU6dHJ1ZX0pO2Nocm9tZS5kZXZ0b29scy5pbnNwZWN0ZWRXaW5kb3c9e307Y2hyb21lLmRldnRvb2xzLmluc3BlY3RlZFdpbmRvdy5fX2RlZmluZUdldHRlcl9fKCd0YWJJZCcsZ2V0VGFiSWQpO2Nocm9tZS5kZXZ0b29scy5pbnNwZWN0ZWRXaW5kb3cuX19wcm90b19fPWNvcmVBUEkuaW5zcGVjdGVkV2luZG93O2Nocm9tZS5kZXZ0b29scy5uZXR3b3JrPWNvcmVBUEkubmV0d29yaztjaHJvbWUuZGV2dG9vbHMucGFuZWxzPWNvcmVBUEkucGFuZWxzO2Nocm9tZS5kZXZ0b29scy5wYW5lbHMudGhlbWVOYW1lPXRoZW1lTmFtZTtpZihleHRlbnNpb25JbmZvLmV4cG9zZUV4cGVyaW1lbnRhbEFQSXMhPT1mYWxzZSl7Y2hyb21lLmV4cGVyaW1lbnRhbD1jaHJvbWUuZXhwZXJpbWVudGFsfHx7fTtjaHJvbWUuZXhwZXJpbWVudGFsLmRldnRvb2xzPWNocm9tZS5leHBlcmltZW50YWwuZGV2dG9vbHN8fHt9O2NvbnN0IHByb3BlcnRpZXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29yZUFQSSk7Zm9yKGxldCBpPTA7aTxwcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IGRlc2NyaXB0b3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb3JlQVBJLHByb3BlcnRpZXNbaV0pO2lmKGRlc2NyaXB0b3IpCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaHJvbWUuZXhwZXJpbWVudGFsLmRldnRvb2xzLHByb3BlcnRpZXNbaV0sZGVzY3JpcHRvcik7fQpjaHJvbWUuZXhwZXJpbWVudGFsLmRldnRvb2xzLmluc3BlY3RlZFdpbmRvdz1jaHJvbWUuZGV2dG9vbHMuaW5zcGVjdGVkV2luZG93O30KaWYoZXh0ZW5zaW9uSW5mby5leHBvc2VXZWJJbnNwZWN0b3JOYW1lc3BhY2UpCndpbmRvdy53ZWJJbnNwZWN0b3I9Y29yZUFQSTt0ZXN0SG9vayhleHRlbnNpb25TZXJ2ZXIsY29yZUFQSSk7fQpmdW5jdGlvbiBidWlsZEV4dGVuc2lvbkFQSUluamVjdGVkU2NyaXB0KGV4dGVuc2lvbkluZm8saW5zcGVjdGVkVGFiSWQsdGhlbWVOYW1lLHRlc3RIb29rKXtjb25zdCBhcmd1bWVudHNKU09OPVtleHRlbnNpb25JbmZvLGluc3BlY3RlZFRhYklkfHxudWxsLHRoZW1lTmFtZV0ubWFwKF89PkpTT04uc3RyaW5naWZ5KF8pKS5qb2luKCcsJyk7aWYoIXRlc3RIb29rKQp0ZXN0SG9vaz0oKT0+e307cmV0dXJuJyhmdW5jdGlvbihpbmplY3RlZFNjcmlwdElkKXsgJytkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzLnRvU3RyaW5nKCkrJzsnKycoJytpbmplY3RlZEV4dGVuc2lvbkFQSS50b1N0cmluZygpKycpKCcrYXJndW1lbnRzSlNPTisnLCcrdGVzdEhvb2srJywgaW5qZWN0ZWRTY3JpcHRJZCk7JysnfSknO307aWYoIXdpbmRvdy5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeSl7RXh0ZW5zaW9ucy5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWI9Y2xhc3N7Z2V0RXh0ZW5zaW9uc0FzeW5jKCl7fX07c2VsZi5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeT1uZXcgRXh0ZW5zaW9ucy5JbnNwZWN0b3JFeHRlbnNpb25SZWdpc3RyeVN0dWIoKTt9O0V4dGVuc2lvbnMuRXh0ZW5zaW9uVHJhY2VQcm92aWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihleHRlbnNpb25PcmlnaW4saWQsY2F0ZWdvcnlOYW1lLGNhdGVnb3J5VG9vbHRpcCl7dGhpcy5fZXh0ZW5zaW9uT3JpZ2luPWV4dGVuc2lvbk9yaWdpbjt0aGlzLl9pZD1pZDt0aGlzLl9jYXRlZ29yeU5hbWU9Y2F0ZWdvcnlOYW1lO3RoaXMuX2NhdGVnb3J5VG9vbHRpcD1jYXRlZ29yeVRvb2x0aXA7fQpzdGFydChzZXNzaW9uKXtjb25zdCBzZXNzaW9uSWQ9U3RyaW5nKCsrRXh0ZW5zaW9ucy5FeHRlbnNpb25UcmFjZVByb3ZpZGVyLl9sYXN0U2Vzc2lvbklkKTtFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci5zdGFydFRyYWNlUmVjb3JkaW5nKHRoaXMuX2lkLHNlc3Npb25JZCxzZXNzaW9uKTt9CnN0b3AoKXtFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci5zdG9wVHJhY2VSZWNvcmRpbmcodGhpcy5faWQpO30Kc2hvcnREaXNwbGF5TmFtZSgpe3JldHVybiB0aGlzLl9jYXRlZ29yeU5hbWU7fQpsb25nRGlzcGxheU5hbWUoKXtyZXR1cm4gdGhpcy5fY2F0ZWdvcnlUb29sdGlwO30KcGVyc2lzdGVudElkZW50aWZpZXIoKXtyZXR1cm5gJHt0aGlzLl9leHRlbnNpb25PcmlnaW59LyR7dGhpcy5fY2F0ZWdvcnlOYW1lfWA7fX07RXh0ZW5zaW9ucy5FeHRlbnNpb25UcmFjZVByb3ZpZGVyLl9sYXN0U2Vzc2lvbklkPTA7RXh0ZW5zaW9ucy5UcmFjaW5nU2Vzc2lvbj1mdW5jdGlvbigpe307RXh0ZW5zaW9ucy5UcmFjaW5nU2Vzc2lvbi5wcm90b3R5cGU9e2NvbXBsZXRlOmZ1bmN0aW9uKHVybCx0aW1lT2Zmc2V0TWljcm9zZWNvbmRzKXt9fTs7RXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXI9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9jbGllbnRPYmplY3RzPXt9O3RoaXMuX2hhbmRsZXJzPXt9O3RoaXMuX3N1YnNjcmliZXJzPXt9O3RoaXMuX3N1YnNjcmlwdGlvblN0YXJ0SGFuZGxlcnM9e307dGhpcy5fc3Vic2NyaXB0aW9uU3RvcEhhbmRsZXJzPXt9O3RoaXMuX2V4dHJhSGVhZGVycz17fTt0aGlzLl9yZXF1ZXN0cz17fTt0aGlzLl9sYXN0UmVxdWVzdElkPTA7dGhpcy5fcmVnaXN0ZXJlZEV4dGVuc2lvbnM9e307dGhpcy5fc3RhdHVzPW5ldyBFeHRlbnNpb25zLkV4dGVuc2lvblN0YXR1cygpO3RoaXMuX3NpZGViYXJQYW5lcz1bXTt0aGlzLl90cmFjZVByb3ZpZGVycz1bXTt0aGlzLl90cmFjZVNlc3Npb25zPW5ldyBNYXAoKTtjb25zdCBjb21tYW5kcz1FeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5Db21tYW5kczt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQWRkUmVxdWVzdEhlYWRlcnMsdGhpcy5fb25BZGRSZXF1ZXN0SGVhZGVycy5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQWRkVHJhY2VQcm92aWRlcix0aGlzLl9vbkFkZFRyYWNlUHJvdmlkZXIuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkFwcGx5U3R5bGVTaGVldCx0aGlzLl9vbkFwcGx5U3R5bGVTaGVldC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQ29tcGxldGVUcmFjZVNlc3Npb24sdGhpcy5fb25Db21wbGV0ZVRyYWNlU2Vzc2lvbi5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQ3JlYXRlUGFuZWwsdGhpcy5fb25DcmVhdGVQYW5lbC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQ3JlYXRlU2lkZWJhclBhbmUsdGhpcy5fb25DcmVhdGVTaWRlYmFyUGFuZS5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuQ3JlYXRlVG9vbGJhckJ1dHRvbix0aGlzLl9vbkNyZWF0ZVRvb2xiYXJCdXR0b24uYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkV2YWx1YXRlT25JbnNwZWN0ZWRQYWdlLHRoaXMuX29uRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkZvcndhcmRLZXlib2FyZEV2ZW50LHRoaXMuX29uRm9yd2FyZEtleWJvYXJkRXZlbnQuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkdldEhBUix0aGlzLl9vbkdldEhBUi5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuR2V0UGFnZVJlc291cmNlcyx0aGlzLl9vbkdldFBhZ2VSZXNvdXJjZXMuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkdldFJlcXVlc3RDb250ZW50LHRoaXMuX29uR2V0UmVxdWVzdENvbnRlbnQuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLkdldFJlc291cmNlQ29udGVudCx0aGlzLl9vbkdldFJlc291cmNlQ29udGVudC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuUmVsb2FkLHRoaXMuX29uUmVsb2FkLmJpbmQodGhpcykpO3RoaXMuX3JlZ2lzdGVySGFuZGxlcihjb21tYW5kcy5TZXRPcGVuUmVzb3VyY2VIYW5kbGVyLHRoaXMuX29uU2V0T3BlblJlc291cmNlSGFuZGxlci5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuU2V0UmVzb3VyY2VDb250ZW50LHRoaXMuX29uU2V0UmVzb3VyY2VDb250ZW50LmJpbmQodGhpcykpO3RoaXMuX3JlZ2lzdGVySGFuZGxlcihjb21tYW5kcy5TZXRTaWRlYmFySGVpZ2h0LHRoaXMuX29uU2V0U2lkZWJhckhlaWdodC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuU2V0U2lkZWJhckNvbnRlbnQsdGhpcy5fb25TZXRTaWRlYmFyQ29udGVudC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuU2V0U2lkZWJhclBhZ2UsdGhpcy5fb25TZXRTaWRlYmFyUGFnZS5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuU2hvd1BhbmVsLHRoaXMuX29uU2hvd1BhbmVsLmJpbmQodGhpcykpO3RoaXMuX3JlZ2lzdGVySGFuZGxlcihjb21tYW5kcy5TdWJzY3JpYmUsdGhpcy5fb25TdWJzY3JpYmUuYmluZCh0aGlzKSk7dGhpcy5fcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmRzLk9wZW5SZXNvdXJjZSx0aGlzLl9vbk9wZW5SZXNvdXJjZS5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuVW5zdWJzY3JpYmUsdGhpcy5fb25VbnN1YnNjcmliZS5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlckhhbmRsZXIoY29tbWFuZHMuVXBkYXRlQnV0dG9uLHRoaXMuX29uVXBkYXRlQnV0dG9uLmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJyx0aGlzLl9vbldpbmRvd01lc3NhZ2UuYmluZCh0aGlzKSxmYWxzZSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuQWRkRXh0ZW5zaW9ucyx0aGlzLl9hZGRFeHRlbnNpb25zLHRoaXMpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLlNldEluc3BlY3RlZFRhYklkLHRoaXMuX3NldEluc3BlY3RlZFRhYklkLHRoaXMpO3RoaXMuX2luaXRFeHRlbnNpb25zKCk7fQppbml0aWFsaXplRXh0ZW5zaW9ucygpe3RoaXMuX2luaXRpYWxpemVDb21tYW5kSXNzdWVkPXRydWU7aWYodGhpcy5fcGVuZGluZ0V4dGVuc2lvbkluZm9zKXt0aGlzLl9wZW5kaW5nRXh0ZW5zaW9uSW5mb3MuZm9yRWFjaCh0aGlzLl9hZGRFeHRlbnNpb24sdGhpcyk7ZGVsZXRlIHRoaXMuX3BlbmRpbmdFeHRlbnNpb25JbmZvczt9fQpoYXNFeHRlbnNpb25zKCl7cmV0dXJuISFPYmplY3Qua2V5cyh0aGlzLl9yZWdpc3RlcmVkRXh0ZW5zaW9ucykubGVuZ3RoO30Kbm90aWZ5U2VhcmNoQWN0aW9uKHBhbmVsSWQsYWN0aW9uLHNlYXJjaFN0cmluZyl7dGhpcy5fcG9zdE5vdGlmaWNhdGlvbihFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5FdmVudHMuUGFuZWxTZWFyY2grcGFuZWxJZCxhY3Rpb24sc2VhcmNoU3RyaW5nKTt9Cm5vdGlmeVZpZXdTaG93bihpZGVudGlmaWVyLGZyYW1lSW5kZXgpe3RoaXMuX3Bvc3ROb3RpZmljYXRpb24oRXh0ZW5zaW9ucy5leHRlbnNpb25BUEkuRXZlbnRzLlZpZXdTaG93bitpZGVudGlmaWVyLGZyYW1lSW5kZXgpO30Kbm90aWZ5Vmlld0hpZGRlbihpZGVudGlmaWVyKXt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5WaWV3SGlkZGVuK2lkZW50aWZpZXIpO30Kbm90aWZ5QnV0dG9uQ2xpY2tlZChpZGVudGlmaWVyKXt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5CdXR0b25DbGlja2VkK2lkZW50aWZpZXIpO30KX2luc3BlY3RlZFVSTENoYW5nZWQoZXZlbnQpe2lmKGV2ZW50LmRhdGEhPT1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkpCnJldHVybjt0aGlzLl9yZXF1ZXN0cz17fTtjb25zdCB1cmw9ZXZlbnQuZGF0YS5pbnNwZWN0ZWRVUkwoKTt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5JbnNwZWN0ZWRVUkxDaGFuZ2VkLHVybCk7fQpzdGFydFRyYWNlUmVjb3JkaW5nKHByb3ZpZGVySWQsc2Vzc2lvbklkLHNlc3Npb24pe3RoaXMuX3RyYWNlU2Vzc2lvbnMuc2V0KHNlc3Npb25JZCxzZXNzaW9uKTt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCd0cmFjZS1yZWNvcmRpbmctc3RhcnRlZC0nK3Byb3ZpZGVySWQsc2Vzc2lvbklkKTt9CnN0b3BUcmFjZVJlY29yZGluZyhwcm92aWRlcklkKXt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKCd0cmFjZS1yZWNvcmRpbmctc3RvcHBlZC0nK3Byb3ZpZGVySWQpO30KaGFzU3Vic2NyaWJlcnModHlwZSl7cmV0dXJuISF0aGlzLl9zdWJzY3JpYmVyc1t0eXBlXTt9Cl9wb3N0Tm90aWZpY2F0aW9uKHR5cGUsdmFyYXJnKXtjb25zdCBzdWJzY3JpYmVycz10aGlzLl9zdWJzY3JpYmVyc1t0eXBlXTtpZighc3Vic2NyaWJlcnMpCnJldHVybjtjb25zdCBtZXNzYWdlPXtjb21tYW5kOidub3RpZnktJyt0eXBlLGFyZ3VtZW50czpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSl9O2ZvcihsZXQgaT0wO2k8c3Vic2NyaWJlcnMubGVuZ3RoOysraSkKc3Vic2NyaWJlcnNbaV0ucG9zdE1lc3NhZ2UobWVzc2FnZSk7fQpfb25TdWJzY3JpYmUobWVzc2FnZSxwb3J0KXtjb25zdCBzdWJzY3JpYmVycz10aGlzLl9zdWJzY3JpYmVyc1ttZXNzYWdlLnR5cGVdO2lmKHN1YnNjcmliZXJzKXtzdWJzY3JpYmVycy5wdXNoKHBvcnQpO31lbHNle3RoaXMuX3N1YnNjcmliZXJzW21lc3NhZ2UudHlwZV09W3BvcnRdO2lmKHRoaXMuX3N1YnNjcmlwdGlvblN0YXJ0SGFuZGxlcnNbbWVzc2FnZS50eXBlXSkKdGhpcy5fc3Vic2NyaXB0aW9uU3RhcnRIYW5kbGVyc1ttZXNzYWdlLnR5cGVdKCk7fX0KX29uVW5zdWJzY3JpYmUobWVzc2FnZSxwb3J0KXtjb25zdCBzdWJzY3JpYmVycz10aGlzLl9zdWJzY3JpYmVyc1ttZXNzYWdlLnR5cGVdO2lmKCFzdWJzY3JpYmVycykKcmV0dXJuO3N1YnNjcmliZXJzLnJlbW92ZShwb3J0KTtpZighc3Vic2NyaWJlcnMubGVuZ3RoKXtkZWxldGUgdGhpcy5fc3Vic2NyaWJlcnNbbWVzc2FnZS50eXBlXTtpZih0aGlzLl9zdWJzY3JpcHRpb25TdG9wSGFuZGxlcnNbbWVzc2FnZS50eXBlXSkKdGhpcy5fc3Vic2NyaXB0aW9uU3RvcEhhbmRsZXJzW21lc3NhZ2UudHlwZV0oKTt9fQpfb25BZGRSZXF1ZXN0SGVhZGVycyhtZXNzYWdlKXtjb25zdCBpZD1tZXNzYWdlLmV4dGVuc2lvbklkO2lmKHR5cGVvZiBpZCE9PSdzdHJpbmcnKQpyZXR1cm4gdGhpcy5fc3RhdHVzLkVfQkFEQVJHVFlQRSgnZXh0ZW5zaW9uSWQnLHR5cGVvZiBpZCwnc3RyaW5nJyk7bGV0IGV4dGVuc2lvbkhlYWRlcnM9dGhpcy5fZXh0cmFIZWFkZXJzW2lkXTtpZighZXh0ZW5zaW9uSGVhZGVycyl7ZXh0ZW5zaW9uSGVhZGVycz17fTt0aGlzLl9leHRyYUhlYWRlcnNbaWRdPWV4dGVuc2lvbkhlYWRlcnM7fQpmb3IoY29uc3QgbmFtZSBpbiBtZXNzYWdlLmhlYWRlcnMpCmV4dGVuc2lvbkhlYWRlcnNbbmFtZV09bWVzc2FnZS5oZWFkZXJzW25hbWVdO2NvbnN0IGFsbEhlYWRlcnM9KHt9KTtmb3IoY29uc3QgZXh0ZW5zaW9uIGluIHRoaXMuX2V4dHJhSGVhZGVycyl7Y29uc3QgaGVhZGVycz10aGlzLl9leHRyYUhlYWRlcnNbZXh0ZW5zaW9uXTtmb3IoY29uc3QgbmFtZSBpbiBoZWFkZXJzKXtpZih0eXBlb2YgaGVhZGVyc1tuYW1lXT09PSdzdHJpbmcnKQphbGxIZWFkZXJzW25hbWVdPWhlYWRlcnNbbmFtZV07fX0KU0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0RXh0cmFIVFRQSGVhZGVycyhhbGxIZWFkZXJzKTt9Cl9vbkFwcGx5U3R5bGVTaGVldChtZXNzYWdlKXtpZighUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ2FwcGx5Q3VzdG9tU3R5bGVzaGVldCcpKQpyZXR1cm47Y29uc3Qgc3R5bGVTaGVldD1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlU2hlZXQudGV4dENvbnRlbnQ9bWVzc2FnZS5zdHlsZVNoZWV0O2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVTaGVldCk7VUkudGhlbWVTdXBwb3J0LmFkZEN1c3RvbVN0eWxlc2hlZXQobWVzc2FnZS5zdHlsZVNoZWV0KTtmb3IobGV0IG5vZGU9ZG9jdW1lbnQuYm9keTtub2RlO25vZGU9bm9kZS50cmF2ZXJzZU5leHROb2RlKGRvY3VtZW50LmJvZHkpKXtpZihub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkKVUkudGhlbWVTdXBwb3J0LmluamVjdEN1c3RvbVN0eWxlU2hlZXRzKG5vZGUpO319Cl9vbkNyZWF0ZVBhbmVsKG1lc3NhZ2UscG9ydCl7Y29uc3QgaWQ9bWVzc2FnZS5pZDtpZihpZCBpbiB0aGlzLl9jbGllbnRPYmplY3RzfHxVSS5pbnNwZWN0b3JWaWV3Lmhhc1BhbmVsKGlkKSkKcmV0dXJuIHRoaXMuX3N0YXR1cy5FX0VYSVNUUyhpZCk7Y29uc3QgcGFnZT10aGlzLl9leHBhbmRSZXNvdXJjZVBhdGgocG9ydC5fZXh0ZW5zaW9uT3JpZ2luLG1lc3NhZ2UucGFnZSk7bGV0IHBlcnNpc3RlbnRJZD1wb3J0Ll9leHRlbnNpb25PcmlnaW4rbWVzc2FnZS50aXRsZTtwZXJzaXN0ZW50SWQ9cGVyc2lzdGVudElkLnJlcGxhY2UoL1xzL2csJycpO2NvbnN0IHBhbmVsVmlldz1uZXcgRXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXJQYW5lbFZpZXcocGVyc2lzdGVudElkLG1lc3NhZ2UudGl0bGUsbmV3IEV4dGVuc2lvbnMuRXh0ZW5zaW9uUGFuZWwodGhpcyxwZXJzaXN0ZW50SWQsaWQscGFnZSkpO3RoaXMuX2NsaWVudE9iamVjdHNbaWRdPXBhbmVsVmlldztVSS5pbnNwZWN0b3JWaWV3LmFkZFBhbmVsKHBhbmVsVmlldyk7cmV0dXJuIHRoaXMuX3N0YXR1cy5PSygpO30KX29uU2hvd1BhbmVsKG1lc3NhZ2Upe2xldCBwYW5lbFZpZXdJZD1tZXNzYWdlLmlkO2NvbnN0IHBhbmVsVmlldz10aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdO2lmKHBhbmVsVmlldyYmcGFuZWxWaWV3IGluc3RhbmNlb2YgRXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXJQYW5lbFZpZXcpCnBhbmVsVmlld0lkPXBhbmVsVmlldy52aWV3SWQoKTtVSS5pbnNwZWN0b3JWaWV3LnNob3dQYW5lbChwYW5lbFZpZXdJZCk7fQpfb25DcmVhdGVUb29sYmFyQnV0dG9uKG1lc3NhZ2UscG9ydCl7Y29uc3QgcGFuZWxWaWV3PXRoaXMuX2NsaWVudE9iamVjdHNbbWVzc2FnZS5wYW5lbF07aWYoIXBhbmVsVmlld3x8IShwYW5lbFZpZXcgaW5zdGFuY2VvZiBFeHRlbnNpb25zLkV4dGVuc2lvblNlcnZlclBhbmVsVmlldykpCnJldHVybiB0aGlzLl9zdGF0dXMuRV9OT1RGT1VORChtZXNzYWdlLnBhbmVsKTtjb25zdCBidXR0b249bmV3IEV4dGVuc2lvbnMuRXh0ZW5zaW9uQnV0dG9uKHRoaXMsbWVzc2FnZS5pZCx0aGlzLl9leHBhbmRSZXNvdXJjZVBhdGgocG9ydC5fZXh0ZW5zaW9uT3JpZ2luLG1lc3NhZ2UuaWNvbiksbWVzc2FnZS50b29sdGlwLG1lc3NhZ2UuZGlzYWJsZWQpO3RoaXMuX2NsaWVudE9iamVjdHNbbWVzc2FnZS5pZF09YnV0dG9uO3BhbmVsVmlldy53aWRnZXQoKS50aGVuKGFwcGVuZEJ1dHRvbik7ZnVuY3Rpb24gYXBwZW5kQnV0dG9uKHBhbmVsKXsocGFuZWwpLmFkZFRvb2xiYXJJdGVtKGJ1dHRvbi50b29sYmFyQnV0dG9uKCkpO30KcmV0dXJuIHRoaXMuX3N0YXR1cy5PSygpO30KX29uVXBkYXRlQnV0dG9uKG1lc3NhZ2UscG9ydCl7Y29uc3QgYnV0dG9uPXRoaXMuX2NsaWVudE9iamVjdHNbbWVzc2FnZS5pZF07aWYoIWJ1dHRvbnx8IShidXR0b24gaW5zdGFuY2VvZiBFeHRlbnNpb25zLkV4dGVuc2lvbkJ1dHRvbikpCnJldHVybiB0aGlzLl9zdGF0dXMuRV9OT1RGT1VORChtZXNzYWdlLmlkKTtidXR0b24udXBkYXRlKHRoaXMuX2V4cGFuZFJlc291cmNlUGF0aChwb3J0Ll9leHRlbnNpb25PcmlnaW4sbWVzc2FnZS5pY29uKSxtZXNzYWdlLnRvb2x0aXAsbWVzc2FnZS5kaXNhYmxlZCk7cmV0dXJuIHRoaXMuX3N0YXR1cy5PSygpO30KX29uQ29tcGxldGVUcmFjZVNlc3Npb24obWVzc2FnZSl7Y29uc3Qgc2Vzc2lvbj10aGlzLl90cmFjZVNlc3Npb25zLmdldChtZXNzYWdlLmlkKTtpZighc2Vzc2lvbikKcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpO3RoaXMuX3RyYWNlU2Vzc2lvbnMuZGVsZXRlKG1lc3NhZ2UuaWQpO3Nlc3Npb24uY29tcGxldGUobWVzc2FnZS51cmwsbWVzc2FnZS50aW1lT2Zmc2V0KTt9Cl9vbkNyZWF0ZVNpZGViYXJQYW5lKG1lc3NhZ2Upe2lmKG1lc3NhZ2UucGFuZWwhPT0nZWxlbWVudHMnJiZtZXNzYWdlLnBhbmVsIT09J3NvdXJjZXMnKQpyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQobWVzc2FnZS5wYW5lbCk7Y29uc3QgaWQ9bWVzc2FnZS5pZDtjb25zdCBzaWRlYmFyPW5ldyBFeHRlbnNpb25zLkV4dGVuc2lvblNpZGViYXJQYW5lKHRoaXMsbWVzc2FnZS5wYW5lbCxtZXNzYWdlLnRpdGxlLGlkKTt0aGlzLl9zaWRlYmFyUGFuZXMucHVzaChzaWRlYmFyKTt0aGlzLl9jbGllbnRPYmplY3RzW2lkXT1zaWRlYmFyO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEV4dGVuc2lvbnMuRXh0ZW5zaW9uU2VydmVyLkV2ZW50cy5TaWRlYmFyUGFuZUFkZGVkLHNpZGViYXIpO3JldHVybiB0aGlzLl9zdGF0dXMuT0soKTt9CnNpZGViYXJQYW5lcygpe3JldHVybiB0aGlzLl9zaWRlYmFyUGFuZXM7fQpfb25TZXRTaWRlYmFySGVpZ2h0KG1lc3NhZ2Upe2NvbnN0IHNpZGViYXI9dGhpcy5fY2xpZW50T2JqZWN0c1ttZXNzYWdlLmlkXTtpZighc2lkZWJhcikKcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpO3NpZGViYXIuc2V0SGVpZ2h0KG1lc3NhZ2UuaGVpZ2h0KTtyZXR1cm4gdGhpcy5fc3RhdHVzLk9LKCk7fQpfb25TZXRTaWRlYmFyQ29udGVudChtZXNzYWdlLHBvcnQpe2NvbnN0IHNpZGViYXI9dGhpcy5fY2xpZW50T2JqZWN0c1ttZXNzYWdlLmlkXTtpZighc2lkZWJhcikKcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpO2Z1bmN0aW9uIGNhbGxiYWNrKGVycm9yKXtjb25zdCByZXN1bHQ9ZXJyb3I/dGhpcy5fc3RhdHVzLkVfRkFJTEVEKGVycm9yKTp0aGlzLl9zdGF0dXMuT0soKTt0aGlzLl9kaXNwYXRjaENhbGxiYWNrKG1lc3NhZ2UucmVxdWVzdElkLHBvcnQscmVzdWx0KTt9CmlmKG1lc3NhZ2UuZXZhbHVhdGVPblBhZ2Upe3JldHVybiBzaWRlYmFyLnNldEV4cHJlc3Npb24obWVzc2FnZS5leHByZXNzaW9uLG1lc3NhZ2Uucm9vdFRpdGxlLG1lc3NhZ2UuZXZhbHVhdGVPcHRpb25zLHBvcnQuX2V4dGVuc2lvbk9yaWdpbixjYWxsYmFjay5iaW5kKHRoaXMpKTt9CnNpZGViYXIuc2V0T2JqZWN0KG1lc3NhZ2UuZXhwcmVzc2lvbixtZXNzYWdlLnJvb3RUaXRsZSxjYWxsYmFjay5iaW5kKHRoaXMpKTt9Cl9vblNldFNpZGViYXJQYWdlKG1lc3NhZ2UscG9ydCl7Y29uc3Qgc2lkZWJhcj10aGlzLl9jbGllbnRPYmplY3RzW21lc3NhZ2UuaWRdO2lmKCFzaWRlYmFyKQpyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQobWVzc2FnZS5pZCk7c2lkZWJhci5zZXRQYWdlKHRoaXMuX2V4cGFuZFJlc291cmNlUGF0aChwb3J0Ll9leHRlbnNpb25PcmlnaW4sbWVzc2FnZS5wYWdlKSk7fQpfb25PcGVuUmVzb3VyY2UobWVzc2FnZSl7Y29uc3QgdWlTb3VyY2VDb2RlPVdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2RlRm9yVVJMKG1lc3NhZ2UudXJsKTtpZih1aVNvdXJjZUNvZGUpe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwodWlTb3VyY2VDb2RlLnVpTG9jYXRpb24obWVzc2FnZS5saW5lTnVtYmVyLDApKTtyZXR1cm4gdGhpcy5fc3RhdHVzLk9LKCk7fQpjb25zdCByZXNvdXJjZT1CaW5kaW5ncy5yZXNvdXJjZUZvclVSTChtZXNzYWdlLnVybCk7aWYocmVzb3VyY2Upe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwocmVzb3VyY2UpO3JldHVybiB0aGlzLl9zdGF0dXMuT0soKTt9CmNvbnN0IHJlcXVlc3Q9QnJvd3NlclNESy5uZXR3b3JrTG9nLnJlcXVlc3RGb3JVUkwobWVzc2FnZS51cmwpO2lmKHJlcXVlc3Qpe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwocmVxdWVzdCk7cmV0dXJuIHRoaXMuX3N0YXR1cy5PSygpO30KcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UudXJsKTt9Cl9vblNldE9wZW5SZXNvdXJjZUhhbmRsZXIobWVzc2FnZSxwb3J0KXtjb25zdCBuYW1lPXRoaXMuX3JlZ2lzdGVyZWRFeHRlbnNpb25zW3BvcnQuX2V4dGVuc2lvbk9yaWdpbl0ubmFtZXx8KCdFeHRlbnNpb24gJytwb3J0Ll9leHRlbnNpb25PcmlnaW4pO2lmKG1lc3NhZ2UuaGFuZGxlclByZXNlbnQpCkNvbXBvbmVudHMuTGlua2lmaWVyLnJlZ2lzdGVyTGlua0hhbmRsZXIobmFtZSx0aGlzLl9oYW5kbGVPcGVuVVJMLmJpbmQodGhpcyxwb3J0KSk7ZWxzZQpDb21wb25lbnRzLkxpbmtpZmllci51bnJlZ2lzdGVyTGlua0hhbmRsZXIobmFtZSk7fQpfaGFuZGxlT3BlblVSTChwb3J0LGNvbnRlbnRQcm92aWRlcixsaW5lTnVtYmVyKXtwb3J0LnBvc3RNZXNzYWdlKHtjb21tYW5kOidvcGVuLXJlc291cmNlJyxyZXNvdXJjZTp0aGlzLl9tYWtlUmVzb3VyY2UoY29udGVudFByb3ZpZGVyKSxsaW5lTnVtYmVyOmxpbmVOdW1iZXIrMX0pO30KX29uUmVsb2FkKG1lc3NhZ2Upe2NvbnN0IG9wdGlvbnM9KG1lc3NhZ2Uub3B0aW9uc3x8e30pO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudE92ZXJyaWRlKHR5cGVvZiBvcHRpb25zLnVzZXJBZ2VudD09PSdzdHJpbmcnP29wdGlvbnMudXNlckFnZW50OicnKTtsZXQgaW5qZWN0ZWRTY3JpcHQ7aWYob3B0aW9ucy5pbmplY3RlZFNjcmlwdCkKaW5qZWN0ZWRTY3JpcHQ9JyhmdW5jdGlvbigpeycrb3B0aW9ucy5pbmplY3RlZFNjcmlwdCsnfSkoKSc7U0RLLlJlc291cmNlVHJlZU1vZGVsLnJlbG9hZEFsbFBhZ2VzKCEhb3B0aW9ucy5pZ25vcmVDYWNoZSxpbmplY3RlZFNjcmlwdCk7cmV0dXJuIHRoaXMuX3N0YXR1cy5PSygpO30KX29uRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2UobWVzc2FnZSxwb3J0KXtmdW5jdGlvbiBjYWxsYmFjayhlcnJvcixvYmplY3Qsd2FzVGhyb3duKXtsZXQgcmVzdWx0O2lmKGVycm9yfHwhb2JqZWN0KQpyZXN1bHQ9dGhpcy5fc3RhdHVzLkVfUFJPVE9DT0xFUlJPUihlcnJvci50b1N0cmluZygpKTtlbHNlIGlmKHdhc1Rocm93bikKcmVzdWx0PXtpc0V4Y2VwdGlvbjp0cnVlLHZhbHVlOm9iamVjdC5kZXNjcmlwdGlvbn07ZWxzZQpyZXN1bHQ9e3ZhbHVlOm9iamVjdC52YWx1ZX07dGhpcy5fZGlzcGF0Y2hDYWxsYmFjayhtZXNzYWdlLnJlcXVlc3RJZCxwb3J0LHJlc3VsdCk7fQpyZXR1cm4gdGhpcy5ldmFsdWF0ZShtZXNzYWdlLmV4cHJlc3Npb24sdHJ1ZSx0cnVlLG1lc3NhZ2UuZXZhbHVhdGVPcHRpb25zLHBvcnQuX2V4dGVuc2lvbk9yaWdpbixjYWxsYmFjay5iaW5kKHRoaXMpKTt9CmFzeW5jIF9vbkdldEhBUigpe2NvbnN0IHJlcXVlc3RzPUJyb3dzZXJTREsubmV0d29ya0xvZy5yZXF1ZXN0cygpO2NvbnN0IGhhckxvZz1hd2FpdCBCcm93c2VyU0RLLkhBUkxvZy5idWlsZChyZXF1ZXN0cyk7Zm9yKGxldCBpPTA7aTxoYXJMb2cuZW50cmllcy5sZW5ndGg7KytpKQpoYXJMb2cuZW50cmllc1tpXS5fcmVxdWVzdElkPXRoaXMuX3JlcXVlc3RJZChyZXF1ZXN0c1tpXSk7cmV0dXJuIGhhckxvZzt9Cl9tYWtlUmVzb3VyY2UoY29udGVudFByb3ZpZGVyKXtyZXR1cm57dXJsOmNvbnRlbnRQcm92aWRlci5jb250ZW50VVJMKCksdHlwZTpjb250ZW50UHJvdmlkZXIuY29udGVudFR5cGUoKS5uYW1lKCl9O30KX29uR2V0UGFnZVJlc291cmNlcygpe2NvbnN0IHJlc291cmNlcz1uZXcgTWFwKCk7ZnVuY3Rpb24gcHVzaFJlc291cmNlRGF0YShjb250ZW50UHJvdmlkZXIpe2lmKCFyZXNvdXJjZXMuaGFzKGNvbnRlbnRQcm92aWRlci5jb250ZW50VVJMKCkpKQpyZXNvdXJjZXMuc2V0KGNvbnRlbnRQcm92aWRlci5jb250ZW50VVJMKCksdGhpcy5fbWFrZVJlc291cmNlKGNvbnRlbnRQcm92aWRlcikpO30KbGV0IHVpU291cmNlQ29kZXM9V29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVzRm9yUHJvamVjdFR5cGUoV29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrKTt1aVNvdXJjZUNvZGVzPXVpU291cmNlQ29kZXMuY29uY2F0KFdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2Rlc0ZvclByb2plY3RUeXBlKFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuQ29udGVudFNjcmlwdHMpKTt1aVNvdXJjZUNvZGVzLmZvckVhY2gocHVzaFJlc291cmNlRGF0YS5iaW5kKHRoaXMpKTtmb3IoY29uc3QgcmVzb3VyY2VUcmVlTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5SZXNvdXJjZVRyZWVNb2RlbCkpCnJlc291cmNlVHJlZU1vZGVsLmZvckFsbFJlc291cmNlcyhwdXNoUmVzb3VyY2VEYXRhLmJpbmQodGhpcykpO3JldHVybiByZXNvdXJjZXMudmFsdWVzQXJyYXkoKTt9CmFzeW5jIF9nZXRSZXNvdXJjZUNvbnRlbnQoY29udGVudFByb3ZpZGVyLG1lc3NhZ2UscG9ydCl7Y29uc3QgY29udGVudD1hd2FpdCBjb250ZW50UHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKTtjb25zdCBlbmNvZGVkPWF3YWl0IGNvbnRlbnRQcm92aWRlci5jb250ZW50RW5jb2RlZCgpO3RoaXMuX2Rpc3BhdGNoQ2FsbGJhY2sobWVzc2FnZS5yZXF1ZXN0SWQscG9ydCx7ZW5jb2Rpbmc6ZW5jb2RlZD8nYmFzZTY0JzonJyxjb250ZW50OmNvbnRlbnR9KTt9Cl9vbkdldFJlcXVlc3RDb250ZW50KG1lc3NhZ2UscG9ydCl7Y29uc3QgcmVxdWVzdD10aGlzLl9yZXF1ZXN0QnlJZChtZXNzYWdlLmlkKTtpZighcmVxdWVzdCkKcmV0dXJuIHRoaXMuX3N0YXR1cy5FX05PVEZPVU5EKG1lc3NhZ2UuaWQpO3RoaXMuX2dldFJlc291cmNlQ29udGVudChyZXF1ZXN0LG1lc3NhZ2UscG9ydCk7fQpfb25HZXRSZXNvdXJjZUNvbnRlbnQobWVzc2FnZSxwb3J0KXtjb25zdCB1cmw9KG1lc3NhZ2UudXJsKTtjb25zdCBjb250ZW50UHJvdmlkZXI9V29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVGb3JVUkwodXJsKXx8QmluZGluZ3MucmVzb3VyY2VGb3JVUkwodXJsKTtpZighY29udGVudFByb3ZpZGVyKQpyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQodXJsKTt0aGlzLl9nZXRSZXNvdXJjZUNvbnRlbnQoY29udGVudFByb3ZpZGVyLG1lc3NhZ2UscG9ydCk7fQpfb25TZXRSZXNvdXJjZUNvbnRlbnQobWVzc2FnZSxwb3J0KXtmdW5jdGlvbiBjYWxsYmFja1dyYXBwZXIoZXJyb3Ipe2NvbnN0IHJlc3BvbnNlPWVycm9yP3RoaXMuX3N0YXR1cy5FX0ZBSUxFRChlcnJvcik6dGhpcy5fc3RhdHVzLk9LKCk7dGhpcy5fZGlzcGF0Y2hDYWxsYmFjayhtZXNzYWdlLnJlcXVlc3RJZCxwb3J0LHJlc3BvbnNlKTt9CmNvbnN0IHVybD0obWVzc2FnZS51cmwpO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTCh1cmwpO2lmKCF1aVNvdXJjZUNvZGV8fCF1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5pc0RvY3VtZW50T3JTY3JpcHRPclN0eWxlU2hlZXQoKSl7Y29uc3QgcmVzb3VyY2U9U0RLLlJlc291cmNlVHJlZU1vZGVsLnJlc291cmNlRm9yVVJMKHVybCk7aWYoIXJlc291cmNlKQpyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQodXJsKTtyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9UU1VQUE9SVEVEKCdSZXNvdXJjZSBpcyBub3QgZWRpdGFibGUnKTt9CnVpU291cmNlQ29kZS5zZXRXb3JraW5nQ29weShtZXNzYWdlLmNvbnRlbnQpO2lmKG1lc3NhZ2UuY29tbWl0KQp1aVNvdXJjZUNvZGUuY29tbWl0V29ya2luZ0NvcHkoKTtjYWxsYmFja1dyYXBwZXIuY2FsbCh0aGlzLG51bGwpO30KX3JlcXVlc3RJZChyZXF1ZXN0KXtpZighcmVxdWVzdC5fZXh0ZW5zaW9uUmVxdWVzdElkKXtyZXF1ZXN0Ll9leHRlbnNpb25SZXF1ZXN0SWQ9Kyt0aGlzLl9sYXN0UmVxdWVzdElkO3RoaXMuX3JlcXVlc3RzW3JlcXVlc3QuX2V4dGVuc2lvblJlcXVlc3RJZF09cmVxdWVzdDt9CnJldHVybiByZXF1ZXN0Ll9leHRlbnNpb25SZXF1ZXN0SWQ7fQpfcmVxdWVzdEJ5SWQoaWQpe3JldHVybiB0aGlzLl9yZXF1ZXN0c1tpZF07fQpfb25BZGRUcmFjZVByb3ZpZGVyKG1lc3NhZ2UscG9ydCl7Y29uc3QgcHJvdmlkZXI9bmV3IEV4dGVuc2lvbnMuRXh0ZW5zaW9uVHJhY2VQcm92aWRlcihwb3J0Ll9leHRlbnNpb25PcmlnaW4sbWVzc2FnZS5pZCxtZXNzYWdlLmNhdGVnb3J5TmFtZSxtZXNzYWdlLmNhdGVnb3J5VG9vbHRpcCk7dGhpcy5fY2xpZW50T2JqZWN0c1ttZXNzYWdlLmlkXT1wcm92aWRlcjt0aGlzLl90cmFjZVByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhFeHRlbnNpb25zLkV4dGVuc2lvblNlcnZlci5FdmVudHMuVHJhY2VQcm92aWRlckFkZGVkLHByb3ZpZGVyKTt9CnRyYWNlUHJvdmlkZXJzKCl7cmV0dXJuIHRoaXMuX3RyYWNlUHJvdmlkZXJzO30KX29uRm9yd2FyZEtleWJvYXJkRXZlbnQobWVzc2FnZSl7bWVzc2FnZS5lbnRyaWVzLmZvckVhY2goaGFuZGxlRXZlbnRFbnRyeSk7ZnVuY3Rpb24gaGFuZGxlRXZlbnRFbnRyeShlbnRyeSl7aWYoIWVudHJ5LmN0cmxLZXkmJiFlbnRyeS5hbHRLZXkmJiFlbnRyeS5tZXRhS2V5JiYhL15GXGQrJC8udGVzdChlbnRyeS5rZXkpJiZlbnRyeS5rZXkhPT0nRXNjYXBlJykKcmV0dXJuO2NvbnN0IGV2ZW50PW5ldyB3aW5kb3cuS2V5Ym9hcmRFdmVudChlbnRyeS5ldmVudFR5cGUse2tleTplbnRyeS5rZXksY29kZTplbnRyeS5jb2RlLGtleUNvZGU6ZW50cnkua2V5Q29kZSxsb2NhdGlvbjplbnRyeS5sb2NhdGlvbixjdHJsS2V5OmVudHJ5LmN0cmxLZXksYWx0S2V5OmVudHJ5LmFsdEtleSxzaGlmdEtleTplbnRyeS5zaGlmdEtleSxtZXRhS2V5OmVudHJ5Lm1ldGFLZXl9KTtldmVudC5fX2tleUNvZGU9a2V5Q29kZUZvckVudHJ5KGVudHJ5KTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTt9CmZ1bmN0aW9uIGtleUNvZGVGb3JFbnRyeShlbnRyeSl7bGV0IGtleUNvZGU9ZW50cnkua2V5Q29kZTtpZigha2V5Q29kZSl7aWYoZW50cnkua2V5PT09J0VzY2FwZScpCmtleUNvZGU9Mjc7fQpyZXR1cm4ga2V5Q29kZXx8MDt9fQpfZGlzcGF0Y2hDYWxsYmFjayhyZXF1ZXN0SWQscG9ydCxyZXN1bHQpe2lmKHJlcXVlc3RJZCkKcG9ydC5wb3N0TWVzc2FnZSh7Y29tbWFuZDonY2FsbGJhY2snLHJlcXVlc3RJZDpyZXF1ZXN0SWQscmVzdWx0OnJlc3VsdH0pO30KX2luaXRFeHRlbnNpb25zKCl7dGhpcy5fcmVnaXN0ZXJBdXRvc3Vic2NyaXB0aW9uSGFuZGxlcihFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5FdmVudHMuUmVzb3VyY2VBZGRlZCxXb3Jrc3BhY2Uud29ya3NwYWNlLFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHRoaXMuX25vdGlmeVJlc291cmNlQWRkZWQpO3RoaXMuX3JlZ2lzdGVyQXV0b3N1YnNjcmlwdGlvblRhcmdldE1hbmFnZXJIYW5kbGVyKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5OZXR3b3JrUmVxdWVzdEZpbmlzaGVkLFNESy5OZXR3b3JrTWFuYWdlcixTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RGaW5pc2hlZCx0aGlzLl9ub3RpZnlSZXF1ZXN0RmluaXNoZWQpO2Z1bmN0aW9uIG9uRWxlbWVudHNTdWJzY3JpcHRpb25TdGFydGVkKCl7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRE9NTm9kZSx0aGlzLl9ub3RpZnlFbGVtZW50c1NlbGVjdGlvbkNoYW5nZWQsdGhpcyk7fQpmdW5jdGlvbiBvbkVsZW1lbnRzU3Vic2NyaXB0aW9uU3RvcHBlZCgpe1VJLmNvbnRleHQucmVtb3ZlRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkRPTU5vZGUsdGhpcy5fbm90aWZ5RWxlbWVudHNTZWxlY3Rpb25DaGFuZ2VkLHRoaXMpO30KdGhpcy5fcmVnaXN0ZXJTdWJzY3JpcHRpb25IYW5kbGVyKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5QYW5lbE9iamVjdFNlbGVjdGVkKydlbGVtZW50cycsb25FbGVtZW50c1N1YnNjcmlwdGlvblN0YXJ0ZWQuYmluZCh0aGlzKSxvbkVsZW1lbnRzU3Vic2NyaXB0aW9uU3RvcHBlZC5iaW5kKHRoaXMpKTt0aGlzLl9yZWdpc3RlclJlc291cmNlQ29udGVudENvbW1pdHRlZEhhbmRsZXIodGhpcy5fbm90aWZ5VUlTb3VyY2VDb2RlQ29udGVudENvbW1pdHRlZCk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzLl9pbnNwZWN0ZWRVUkxDaGFuZ2VkLHRoaXMpO3NlbGYuSW5zcGVjdG9yRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uc0FzeW5jKCk7fQpfbm90aWZ5UmVzb3VyY2VBZGRlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTt0aGlzLl9wb3N0Tm90aWZpY2F0aW9uKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLkV2ZW50cy5SZXNvdXJjZUFkZGVkLHRoaXMuX21ha2VSZXNvdXJjZSh1aVNvdXJjZUNvZGUpKTt9Cl9ub3RpZnlVSVNvdXJjZUNvZGVDb250ZW50Q29tbWl0dGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKTtjb25zdCBjb250ZW50PShldmVudC5kYXRhLmNvbnRlbnQpO3RoaXMuX3Bvc3ROb3RpZmljYXRpb24oRXh0ZW5zaW9ucy5leHRlbnNpb25BUEkuRXZlbnRzLlJlc291cmNlQ29udGVudENvbW1pdHRlZCx0aGlzLl9tYWtlUmVzb3VyY2UodWlTb3VyY2VDb2RlKSxjb250ZW50KTt9CmFzeW5jIF9ub3RpZnlSZXF1ZXN0RmluaXNoZWQoZXZlbnQpe2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO2NvbnN0IGVudHJ5PWF3YWl0IEJyb3dzZXJTREsuSEFSRW50cnkuYnVpbGQocmVxdWVzdCk7dGhpcy5fcG9zdE5vdGlmaWNhdGlvbihFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5FdmVudHMuTmV0d29ya1JlcXVlc3RGaW5pc2hlZCx0aGlzLl9yZXF1ZXN0SWQocmVxdWVzdCksZW50cnkpO30KX25vdGlmeUVsZW1lbnRzU2VsZWN0aW9uQ2hhbmdlZCgpe3RoaXMuX3Bvc3ROb3RpZmljYXRpb24oRXh0ZW5zaW9ucy5leHRlbnNpb25BUEkuRXZlbnRzLlBhbmVsT2JqZWN0U2VsZWN0ZWQrJ2VsZW1lbnRzJyk7fQpzb3VyY2VTZWxlY3Rpb25DaGFuZ2VkKHVybCxyYW5nZSl7dGhpcy5fcG9zdE5vdGlmaWNhdGlvbihFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5FdmVudHMuUGFuZWxPYmplY3RTZWxlY3RlZCsnc291cmNlcycse3N0YXJ0TGluZTpyYW5nZS5zdGFydExpbmUsc3RhcnRDb2x1bW46cmFuZ2Uuc3RhcnRDb2x1bW4sZW5kTGluZTpyYW5nZS5lbmRMaW5lLGVuZENvbHVtbjpyYW5nZS5lbmRDb2x1bW4sdXJsOnVybCx9KTt9Cl9hZGRFeHRlbnNpb25zKGV2ZW50KXtpZihFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci5fb3ZlcnJpZGVQbGF0Zm9ybUV4dGVuc2lvbkFQSUZvclRlc3QpCndpbmRvdy5idWlsZFBsYXRmb3JtRXh0ZW5zaW9uQVBJPUV4dGVuc2lvbnMuZXh0ZW5zaW9uU2VydmVyLl9vdmVycmlkZVBsYXRmb3JtRXh0ZW5zaW9uQVBJRm9yVGVzdDtjb25zdCBleHRlbnNpb25JbmZvcz0oZXZlbnQuZGF0YSk7aWYodGhpcy5faW5pdGlhbGl6ZUNvbW1hbmRJc3N1ZWQpCmV4dGVuc2lvbkluZm9zLmZvckVhY2godGhpcy5fYWRkRXh0ZW5zaW9uLHRoaXMpO2Vsc2UKdGhpcy5fcGVuZGluZ0V4dGVuc2lvbkluZm9zPWV4dGVuc2lvbkluZm9zO30KX3NldEluc3BlY3RlZFRhYklkKGV2ZW50KXt0aGlzLl9pbnNwZWN0ZWRUYWJJZD0oZXZlbnQuZGF0YSk7fQpfYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbkluZm8pe2NvbnN0IHVybE9yaWdpblJlZ0V4cD1uZXcgUmVnRXhwKCcoW146XSs6XC9cL1teL10qKVwvJyk7Y29uc3Qgc3RhcnRQYWdlPWV4dGVuc2lvbkluZm8uc3RhcnRQYWdlO2NvbnN0IG5hbWU9ZXh0ZW5zaW9uSW5mby5uYW1lO3RyeXtjb25zdCBvcmlnaW5NYXRjaD11cmxPcmlnaW5SZWdFeHAuZXhlYyhzdGFydFBhZ2UpO2lmKCFvcmlnaW5NYXRjaCl7Y29uc29sZS5lcnJvcignU2tpcHBpbmcgZXh0ZW5zaW9uIHdpdGggaW52YWxpZCBVUkw6ICcrc3RhcnRQYWdlKTtyZXR1cm4gZmFsc2U7fQpjb25zdCBleHRlbnNpb25PcmlnaW49b3JpZ2luTWF0Y2hbMV07aWYoIXRoaXMuX3JlZ2lzdGVyZWRFeHRlbnNpb25zW2V4dGVuc2lvbk9yaWdpbl0pe2NvbnN0IGluamVjdGVkQVBJPWJ1aWxkRXh0ZW5zaW9uQVBJSW5qZWN0ZWRTY3JpcHQoZXh0ZW5zaW9uSW5mbyx0aGlzLl9pbnNwZWN0ZWRUYWJJZCxVSS50aGVtZVN1cHBvcnQudGhlbWVOYW1lKCksRXh0ZW5zaW9ucy5leHRlbnNpb25TZXJ2ZXJbJ19leHRlbnNpb25BUElUZXN0SG9vayddKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0SW5qZWN0ZWRTY3JpcHRGb3JPcmlnaW4oZXh0ZW5zaW9uT3JpZ2luLGluamVjdGVkQVBJKTt0aGlzLl9yZWdpc3RlcmVkRXh0ZW5zaW9uc1tleHRlbnNpb25PcmlnaW5dPXtuYW1lOm5hbWV9O30KY29uc3QgaWZyYW1lPWNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO2lmcmFtZS5zcmM9c3RhcnRQYWdlO2lmcmFtZS5zdHlsZS5kaXNwbGF5PSdub25lJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7fWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGV4dGVuc2lvbiAnK3N0YXJ0UGFnZSsnOicrZSk7cmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fQpfcmVnaXN0ZXJFeHRlbnNpb24ob3JpZ2luLHBvcnQpe2lmKCF0aGlzLl9yZWdpc3RlcmVkRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShvcmlnaW4pKXtpZihvcmlnaW4hPT13aW5kb3cubG9jYXRpb24ub3JpZ2luKQpjb25zb2xlLmVycm9yKCdJZ25vcmluZyB1bmF1dGhvcml6ZWQgY2xpZW50IHJlcXVlc3QgZnJvbSAnK29yaWdpbik7cmV0dXJuO30KcG9ydC5fZXh0ZW5zaW9uT3JpZ2luPW9yaWdpbjtwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLHRoaXMuX29ubWVzc2FnZS5iaW5kKHRoaXMpLGZhbHNlKTtwb3J0LnN0YXJ0KCk7fQpfb25XaW5kb3dNZXNzYWdlKGV2ZW50KXtpZihldmVudC5kYXRhPT09J3JlZ2lzdGVyRXh0ZW5zaW9uJykKdGhpcy5fcmVnaXN0ZXJFeHRlbnNpb24oZXZlbnQub3JpZ2luLGV2ZW50LnBvcnRzWzBdKTt9CmFzeW5jIF9vbm1lc3NhZ2UoZXZlbnQpe2NvbnN0IG1lc3NhZ2U9ZXZlbnQuZGF0YTtsZXQgcmVzdWx0O2lmKG1lc3NhZ2UuY29tbWFuZCBpbiB0aGlzLl9oYW5kbGVycykKcmVzdWx0PWF3YWl0IHRoaXMuX2hhbmRsZXJzW21lc3NhZ2UuY29tbWFuZF0obWVzc2FnZSxldmVudC50YXJnZXQpO2Vsc2UKcmVzdWx0PXRoaXMuX3N0YXR1cy5FX05PVFNVUFBPUlRFRChtZXNzYWdlLmNvbW1hbmQpO2lmKHJlc3VsdCYmbWVzc2FnZS5yZXF1ZXN0SWQpCnRoaXMuX2Rpc3BhdGNoQ2FsbGJhY2sobWVzc2FnZS5yZXF1ZXN0SWQsZXZlbnQudGFyZ2V0LHJlc3VsdCk7fQpfcmVnaXN0ZXJIYW5kbGVyKGNvbW1hbmQsY2FsbGJhY2spe2NvbnNvbGUuYXNzZXJ0KGNvbW1hbmQpO3RoaXMuX2hhbmRsZXJzW2NvbW1hbmRdPWNhbGxiYWNrO30KX3JlZ2lzdGVyU3Vic2NyaXB0aW9uSGFuZGxlcihldmVudFRvcGljLG9uU3Vic2NyaWJlRmlyc3Qsb25VbnN1YnNjcmliZUxhc3Qpe3RoaXMuX3N1YnNjcmlwdGlvblN0YXJ0SGFuZGxlcnNbZXZlbnRUb3BpY109b25TdWJzY3JpYmVGaXJzdDt0aGlzLl9zdWJzY3JpcHRpb25TdG9wSGFuZGxlcnNbZXZlbnRUb3BpY109b25VbnN1YnNjcmliZUxhc3Q7fQpfcmVnaXN0ZXJBdXRvc3Vic2NyaXB0aW9uSGFuZGxlcihldmVudFRvcGljLGV2ZW50VGFyZ2V0LGZyb250ZW5kRXZlbnRUeXBlLGhhbmRsZXIpe3RoaXMuX3JlZ2lzdGVyU3Vic2NyaXB0aW9uSGFuZGxlcihldmVudFRvcGljLGV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIuYmluZChldmVudFRhcmdldCxmcm9udGVuZEV2ZW50VHlwZSxoYW5kbGVyLHRoaXMpLGV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChldmVudFRhcmdldCxmcm9udGVuZEV2ZW50VHlwZSxoYW5kbGVyLHRoaXMpKTt9Cl9yZWdpc3RlckF1dG9zdWJzY3JpcHRpb25UYXJnZXRNYW5hZ2VySGFuZGxlcihldmVudFRvcGljLG1vZGVsQ2xhc3MsZnJvbnRlbmRFdmVudFR5cGUsaGFuZGxlcil7dGhpcy5fcmVnaXN0ZXJTdWJzY3JpcHRpb25IYW5kbGVyKGV2ZW50VG9waWMsU0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lci5iaW5kKFNESy50YXJnZXRNYW5hZ2VyLG1vZGVsQ2xhc3MsZnJvbnRlbmRFdmVudFR5cGUsaGFuZGxlcix0aGlzKSxTREsudGFyZ2V0TWFuYWdlci5yZW1vdmVNb2RlbExpc3RlbmVyLmJpbmQoU0RLLnRhcmdldE1hbmFnZXIsbW9kZWxDbGFzcyxmcm9udGVuZEV2ZW50VHlwZSxoYW5kbGVyLHRoaXMpKTt9Cl9yZWdpc3RlclJlc291cmNlQ29udGVudENvbW1pdHRlZEhhbmRsZXIoaGFuZGxlcil7ZnVuY3Rpb24gYWRkRmlyc3RFdmVudExpc3RlbmVyKCl7V29ya3NwYWNlLndvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkQnlVc2VyLGhhbmRsZXIsdGhpcyk7V29ya3NwYWNlLndvcmtzcGFjZS5zZXRIYXNSZXNvdXJjZUNvbnRlbnRUcmFja2luZ0V4dGVuc2lvbnModHJ1ZSk7fQpmdW5jdGlvbiByZW1vdmVMYXN0RXZlbnRMaXN0ZW5lcigpe1dvcmtzcGFjZS53b3Jrc3BhY2Uuc2V0SGFzUmVzb3VyY2VDb250ZW50VHJhY2tpbmdFeHRlbnNpb25zKGZhbHNlKTtXb3Jrc3BhY2Uud29ya3NwYWNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWRCeVVzZXIsaGFuZGxlcix0aGlzKTt9CnRoaXMuX3JlZ2lzdGVyU3Vic2NyaXB0aW9uSGFuZGxlcihFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5FdmVudHMuUmVzb3VyY2VDb250ZW50Q29tbWl0dGVkLGFkZEZpcnN0RXZlbnRMaXN0ZW5lci5iaW5kKHRoaXMpLHJlbW92ZUxhc3RFdmVudExpc3RlbmVyLmJpbmQodGhpcykpO30KX2V4cGFuZFJlc291cmNlUGF0aChleHRlbnNpb25QYXRoLHJlc291cmNlUGF0aCl7aWYoIXJlc291cmNlUGF0aCkKcmV0dXJuO3JldHVybiBleHRlbnNpb25QYXRoK3RoaXMuX25vcm1hbGl6ZVBhdGgocmVzb3VyY2VQYXRoKTt9Cl9ub3JtYWxpemVQYXRoKHBhdGgpe2NvbnN0IHNvdXJjZT1wYXRoLnNwbGl0KCcvJyk7Y29uc3QgcmVzdWx0PVtdO2ZvcihsZXQgaT0wO2k8c291cmNlLmxlbmd0aDsrK2kpe2lmKHNvdXJjZVtpXT09PScuJykKY29udGludWU7aWYoc291cmNlW2ldPT09JycpCmNvbnRpbnVlO2lmKHNvdXJjZVtpXT09PScuLicpCnJlc3VsdC5wb3AoKTtlbHNlCnJlc3VsdC5wdXNoKHNvdXJjZVtpXSk7fQpyZXR1cm4nLycrcmVzdWx0LmpvaW4oJy8nKTt9CmV2YWx1YXRlKGV4cHJlc3Npb24sZXhwb3NlQ29tbWFuZExpbmVBUEkscmV0dXJuQnlWYWx1ZSxvcHRpb25zLHNlY3VyaXR5T3JpZ2luLGNhbGxiYWNrKXtsZXQgY29udGV4dDtmdW5jdGlvbiByZXNvbHZlVVJMVG9GcmFtZSh1cmwpe2xldCBmb3VuZDtmdW5jdGlvbiBoYXNNYXRjaGluZ1VSTChmcmFtZSl7Zm91bmQ9KGZyYW1lLnVybD09PXVybCk/ZnJhbWU6bnVsbDtyZXR1cm4gZm91bmQ7fQpTREsuUmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVzKCkuc29tZShoYXNNYXRjaGluZ1VSTCk7cmV0dXJuIGZvdW5kO30Kb3B0aW9ucz1vcHRpb25zfHx7fTtsZXQgZnJhbWU7aWYob3B0aW9ucy5mcmFtZVVSTCl7ZnJhbWU9cmVzb2x2ZVVSTFRvRnJhbWUob3B0aW9ucy5mcmFtZVVSTCk7fWVsc2V7Y29uc3QgdGFyZ2V0PVNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQmJnRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2ZyYW1lPXJlc291cmNlVHJlZU1vZGVsJiZyZXNvdXJjZVRyZWVNb2RlbC5tYWluRnJhbWU7fQppZighZnJhbWUpe2lmKG9wdGlvbnMuZnJhbWVVUkwpCmNvbnNvbGUud2FybignZXZhbHVhdGU6IHRoZXJlIGlzIG5vIGZyYW1lIHdpdGggVVJMICcrb3B0aW9ucy5mcmFtZVVSTCk7ZWxzZQpjb25zb2xlLndhcm4oJ2V2YWx1YXRlOiB0aGUgbWFpbiBmcmFtZSBpcyBub3QgeWV0IGF2YWlsYWJsZScpO3JldHVybiB0aGlzLl9zdGF0dXMuRV9OT1RGT1VORChvcHRpb25zLmZyYW1lVVJMfHwnPHRvcD4nKTt9CmxldCBjb250ZXh0U2VjdXJpdHlPcmlnaW47aWYob3B0aW9ucy51c2VDb250ZW50U2NyaXB0Q29udGV4dCkKY29udGV4dFNlY3VyaXR5T3JpZ2luPXNlY3VyaXR5T3JpZ2luO2Vsc2UgaWYob3B0aW9ucy5zY3JpcHRFeGVjdXRpb25Db250ZXh0KQpjb250ZXh0U2VjdXJpdHlPcmlnaW49b3B0aW9ucy5zY3JpcHRFeGVjdXRpb25Db250ZXh0O2NvbnN0IHJ1bnRpbWVNb2RlbD1mcmFtZS5yZXNvdXJjZVRyZWVNb2RlbCgpLnRhcmdldCgpLm1vZGVsKFNESy5SdW50aW1lTW9kZWwpO2NvbnN0IGV4ZWN1dGlvbkNvbnRleHRzPXJ1bnRpbWVNb2RlbD9ydW50aW1lTW9kZWwuZXhlY3V0aW9uQ29udGV4dHMoKTpbXTtpZihjb250ZXh0U2VjdXJpdHlPcmlnaW4pe2ZvcihsZXQgaT0wO2k8ZXhlY3V0aW9uQ29udGV4dHMubGVuZ3RoOysraSl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1leGVjdXRpb25Db250ZXh0c1tpXTtpZihleGVjdXRpb25Db250ZXh0LmZyYW1lSWQ9PT1mcmFtZS5pZCYmZXhlY3V0aW9uQ29udGV4dC5vcmlnaW49PT1jb250ZXh0U2VjdXJpdHlPcmlnaW4mJiFleGVjdXRpb25Db250ZXh0LmlzRGVmYXVsdCkKY29udGV4dD1leGVjdXRpb25Db250ZXh0O30KaWYoIWNvbnRleHQpe2NvbnNvbGUud2FybignVGhlIEphdmFTY3JpcHQgY29udGV4dCAnK2NvbnRleHRTZWN1cml0eU9yaWdpbisnIHdhcyBub3QgZm91bmQgaW4gdGhlIGZyYW1lICcrZnJhbWUudXJsKTtyZXR1cm4gdGhpcy5fc3RhdHVzLkVfTk9URk9VTkQoY29udGV4dFNlY3VyaXR5T3JpZ2luKTt9fWVsc2V7Zm9yKGxldCBpPTA7aTxleGVjdXRpb25Db250ZXh0cy5sZW5ndGg7KytpKXtjb25zdCBleGVjdXRpb25Db250ZXh0PWV4ZWN1dGlvbkNvbnRleHRzW2ldO2lmKGV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZD09PWZyYW1lLmlkJiZleGVjdXRpb25Db250ZXh0LmlzRGVmYXVsdCkKY29udGV4dD1leGVjdXRpb25Db250ZXh0O30KaWYoIWNvbnRleHQpCnJldHVybiB0aGlzLl9zdGF0dXMuRV9GQUlMRUQoZnJhbWUudXJsKycgaGFzIG5vIGV4ZWN1dGlvbiBjb250ZXh0Jyk7fQpjb250ZXh0LmV2YWx1YXRlKHtleHByZXNzaW9uOmV4cHJlc3Npb24sb2JqZWN0R3JvdXA6J2V4dGVuc2lvbicsaW5jbHVkZUNvbW1hbmRMaW5lQVBJOmV4cG9zZUNvbW1hbmRMaW5lQVBJLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6cmV0dXJuQnlWYWx1ZSxnZW5lcmF0ZVByZXZpZXc6ZmFsc2V9LGZhbHNlLGZhbHNlKS50aGVuKG9uRXZhbHVhdGUpO2Z1bmN0aW9uIG9uRXZhbHVhdGUocmVzdWx0KXtpZihyZXN1bHQuZXJyb3Ipe2NhbGxiYWNrKHJlc3VsdC5lcnJvcixudWxsLGZhbHNlKTtyZXR1cm47fQpjYWxsYmFjayhudWxsLHJlc3VsdC5vYmplY3R8fG51bGwsISFyZXN1bHQuZXhjZXB0aW9uRGV0YWlscyk7fX19O0V4dGVuc2lvbnMuRXh0ZW5zaW9uU2VydmVyLkV2ZW50cz17U2lkZWJhclBhbmVBZGRlZDpTeW1ib2woJ1NpZGViYXJQYW5lQWRkZWQnKSxUcmFjZVByb3ZpZGVyQWRkZWQ6U3ltYm9sKCdUcmFjZVByb3ZpZGVyQWRkZWQnKX07RXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXJQYW5lbFZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5TaW1wbGVWaWV3e2NvbnN0cnVjdG9yKG5hbWUsdGl0bGUscGFuZWwpe3N1cGVyKHRpdGxlKTt0aGlzLl9uYW1lPW5hbWU7dGhpcy5fcGFuZWw9cGFuZWw7fQp2aWV3SWQoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CndpZGdldCgpe3JldHVybihQcm9taXNlLnJlc29sdmUodGhpcy5fcGFuZWwpKTt9fTtFeHRlbnNpb25zLkV4dGVuc2lvblN0YXR1cz1jbGFzc3tjb25zdHJ1Y3Rvcigpe2Z1bmN0aW9uIG1ha2VTdGF0dXMoY29kZSxkZXNjcmlwdGlvbil7Y29uc3QgZGV0YWlscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7Y29uc3Qgc3RhdHVzPXtjb2RlOmNvZGUsZGVzY3JpcHRpb246ZGVzY3JpcHRpb24sZGV0YWlsczpkZXRhaWxzfTtpZihjb2RlIT09J09LJyl7c3RhdHVzLmlzRXJyb3I9dHJ1ZTtjb25zb2xlLmVycm9yKCdFeHRlbnNpb24gc2VydmVyIGVycm9yOiAnK1N0cmluZy52c3ByaW50ZihkZXNjcmlwdGlvbixkZXRhaWxzKSk7fQpyZXR1cm4gc3RhdHVzO30KdGhpcy5PSz1tYWtlU3RhdHVzLmJpbmQobnVsbCwnT0snLCdPSycpO3RoaXMuRV9FWElTVFM9bWFrZVN0YXR1cy5iaW5kKG51bGwsJ0VfRVhJU1RTJywnT2JqZWN0IGFscmVhZHkgZXhpc3RzOiAlcycpO3RoaXMuRV9CQURBUkc9bWFrZVN0YXR1cy5iaW5kKG51bGwsJ0VfQkFEQVJHJywnSW52YWxpZCBhcmd1bWVudCAlczogJXMnKTt0aGlzLkVfQkFEQVJHVFlQRT1tYWtlU3RhdHVzLmJpbmQobnVsbCwnRV9CQURBUkdUWVBFJywnSW52YWxpZCB0eXBlIGZvciBhcmd1bWVudCAlczogZ290ICVzLCBleHBlY3RlZCAlcycpO3RoaXMuRV9OT1RGT1VORD1tYWtlU3RhdHVzLmJpbmQobnVsbCwnRV9OT1RGT1VORCcsJ09iamVjdCBub3QgZm91bmQ6ICVzJyk7dGhpcy5FX05PVFNVUFBPUlRFRD1tYWtlU3RhdHVzLmJpbmQobnVsbCwnRV9OT1RTVVBQT1JURUQnLCdPYmplY3QgZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgb3BlcmF0aW9uOiAlcycpO3RoaXMuRV9QUk9UT0NPTEVSUk9SPW1ha2VTdGF0dXMuYmluZChudWxsLCdFX1BST1RPQ09MRVJST1InLCdJbnNwZWN0b3IgcHJvdG9jb2wgZXJyb3I6ICVzJyk7dGhpcy5FX0ZBSUxFRD1tYWtlU3RhdHVzLmJpbmQobnVsbCwnRV9GQUlMRUQnLCdPcGVyYXRpb24gZmFpbGVkOiAlcycpO319O0V4dGVuc2lvbnMuRXh0ZW5zaW9uU3RhdHVzLlJlY29yZDtFeHRlbnNpb25zLmV4dGVuc2lvbkFQST17fTtkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzKEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJKTtFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlcjs7RXh0ZW5zaW9ucy5FeHRlbnNpb25QYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKHNlcnZlcixwYW5lbE5hbWUsaWQscGFnZVVSTCl7c3VwZXIocGFuZWxOYW1lKTt0aGlzLl9zZXJ2ZXI9c2VydmVyO3RoaXMuX2lkPWlkO3RoaXMuc2V0SGlkZU9uRGV0YWNoKCk7dGhpcy5fcGFuZWxUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCdoaWRkZW4nLHRoaXMuZWxlbWVudCk7dGhpcy5fc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KHRoaXMpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNob3codGhpcy5lbGVtZW50KTtjb25zdCBleHRlbnNpb25WaWV3PW5ldyBFeHRlbnNpb25zLkV4dGVuc2lvblZpZXcoc2VydmVyLHRoaXMuX2lkLHBhZ2VVUkwsJ2V4dGVuc2lvbicpO2V4dGVuc2lvblZpZXcuc2hvdyh0aGlzLl9zZWFyY2hhYmxlVmlldy5lbGVtZW50KTt9CmFkZFRvb2xiYXJJdGVtKGl0ZW0pe3RoaXMuX3BhbmVsVG9vbGJhci5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShpdGVtKTt9CnNlYXJjaENhbmNlbGVkKCl7dGhpcy5fc2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCxFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5wYW5lbHMuU2VhcmNoQWN0aW9uLkNhbmNlbFNlYXJjaCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KDApO30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc2VhcmNoYWJsZVZpZXc7fQpwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpe2NvbnN0IHF1ZXJ5PXNlYXJjaENvbmZpZy5xdWVyeTt0aGlzLl9zZXJ2ZXIubm90aWZ5U2VhcmNoQWN0aW9uKHRoaXMuX2lkLEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLnBhbmVscy5TZWFyY2hBY3Rpb24uUGVyZm9ybVNlYXJjaCxxdWVyeSk7fQpqdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCl7dGhpcy5fc2VydmVyLm5vdGlmeVNlYXJjaEFjdGlvbih0aGlzLl9pZCxFeHRlbnNpb25zLmV4dGVuc2lvbkFQSS5wYW5lbHMuU2VhcmNoQWN0aW9uLk5leHRTZWFyY2hSZXN1bHQpO30KanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXt0aGlzLl9zZXJ2ZXIubm90aWZ5U2VhcmNoQWN0aW9uKHRoaXMuX2lkLEV4dGVuc2lvbnMuZXh0ZW5zaW9uQVBJLnBhbmVscy5TZWFyY2hBY3Rpb24uUHJldmlvdXNTZWFyY2hSZXN1bHQpO30Kc3VwcG9ydHNDYXNlU2Vuc2l0aXZlU2VhcmNoKCl7cmV0dXJuIGZhbHNlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiBmYWxzZTt9fTtFeHRlbnNpb25zLkV4dGVuc2lvbkJ1dHRvbj1jbGFzc3tjb25zdHJ1Y3RvcihzZXJ2ZXIsaWQsaWNvblVSTCx0b29sdGlwLGRpc2FibGVkKXt0aGlzLl9pZD1pZDt0aGlzLl90b29sYmFyQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKCcnLCcnKTt0aGlzLl90b29sYmFyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssc2VydmVyLm5vdGlmeUJ1dHRvbkNsaWNrZWQuYmluZChzZXJ2ZXIsdGhpcy5faWQpKTt0aGlzLnVwZGF0ZShpY29uVVJMLHRvb2x0aXAsZGlzYWJsZWQpO30KdXBkYXRlKGljb25VUkwsdG9vbHRpcCxkaXNhYmxlZCl7aWYodHlwZW9mIGljb25VUkw9PT0nc3RyaW5nJykKdGhpcy5fdG9vbGJhckJ1dHRvbi5zZXRCYWNrZ3JvdW5kSW1hZ2UoaWNvblVSTCk7aWYodHlwZW9mIHRvb2x0aXA9PT0nc3RyaW5nJykKdGhpcy5fdG9vbGJhckJ1dHRvbi5zZXRUaXRsZSh0b29sdGlwKTtpZih0eXBlb2YgZGlzYWJsZWQ9PT0nYm9vbGVhbicpCnRoaXMuX3Rvb2xiYXJCdXR0b24uc2V0RW5hYmxlZCghZGlzYWJsZWQpO30KdG9vbGJhckJ1dHRvbigpe3JldHVybiB0aGlzLl90b29sYmFyQnV0dG9uO319O0V4dGVuc2lvbnMuRXh0ZW5zaW9uU2lkZWJhclBhbmU9Y2xhc3MgZXh0ZW5kcyBVSS5TaW1wbGVWaWV3e2NvbnN0cnVjdG9yKHNlcnZlcixwYW5lbE5hbWUsdGl0bGUsaWQpe3N1cGVyKHRpdGxlKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsbCcpO3RoaXMuX3BhbmVsTmFtZT1wYW5lbE5hbWU7dGhpcy5fc2VydmVyPXNlcnZlcjt0aGlzLl9pZD1pZDt9CmlkKCl7cmV0dXJuIHRoaXMuX2lkO30KcGFuZWxOYW1lKCl7cmV0dXJuIHRoaXMuX3BhbmVsTmFtZTt9CnNldE9iamVjdChvYmplY3QsdGl0bGUsY2FsbGJhY2spe3RoaXMuX2NyZWF0ZU9iamVjdFByb3BlcnRpZXNWaWV3KCk7dGhpcy5fc2V0T2JqZWN0KFNESy5SZW1vdGVPYmplY3QuZnJvbUxvY2FsT2JqZWN0KG9iamVjdCksdGl0bGUsY2FsbGJhY2spO30Kc2V0RXhwcmVzc2lvbihleHByZXNzaW9uLHRpdGxlLGV2YWx1YXRlT3B0aW9ucyxzZWN1cml0eU9yaWdpbixjYWxsYmFjayl7dGhpcy5fY3JlYXRlT2JqZWN0UHJvcGVydGllc1ZpZXcoKTt0aGlzLl9zZXJ2ZXIuZXZhbHVhdGUoZXhwcmVzc2lvbix0cnVlLGZhbHNlLGV2YWx1YXRlT3B0aW9ucyxzZWN1cml0eU9yaWdpbix0aGlzLl9vbkV2YWx1YXRlLmJpbmQodGhpcyx0aXRsZSxjYWxsYmFjaykpO30Kc2V0UGFnZSh1cmwpe2lmKHRoaXMuX29iamVjdFByb3BlcnRpZXNWaWV3KXt0aGlzLl9vYmplY3RQcm9wZXJ0aWVzVmlldy5kZXRhY2goKTtkZWxldGUgdGhpcy5fb2JqZWN0UHJvcGVydGllc1ZpZXc7fQppZih0aGlzLl9leHRlbnNpb25WaWV3KQp0aGlzLl9leHRlbnNpb25WaWV3LmRldGFjaCh0cnVlKTt0aGlzLl9leHRlbnNpb25WaWV3PW5ldyBFeHRlbnNpb25zLkV4dGVuc2lvblZpZXcodGhpcy5fc2VydmVyLHRoaXMuX2lkLHVybCwnZXh0ZW5zaW9uIGZpbGwnKTt0aGlzLl9leHRlbnNpb25WaWV3LnNob3codGhpcy5lbGVtZW50KTtpZighdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCkKdGhpcy5zZXRIZWlnaHQoJzE1MHB4Jyk7fQpzZXRIZWlnaHQoaGVpZ2h0KXt0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWhlaWdodDt9Cl9vbkV2YWx1YXRlKHRpdGxlLGNhbGxiYWNrLGVycm9yLHJlc3VsdCx3YXNUaHJvd24pe2lmKGVycm9yfHwhcmVzdWx0KQpjYWxsYmFjayhlcnJvci50b1N0cmluZygpKTtlbHNlCnRoaXMuX3NldE9iamVjdChyZXN1bHQsdGl0bGUsY2FsbGJhY2spO30KX2NyZWF0ZU9iamVjdFByb3BlcnRpZXNWaWV3KCl7aWYodGhpcy5fb2JqZWN0UHJvcGVydGllc1ZpZXcpCnJldHVybjtpZih0aGlzLl9leHRlbnNpb25WaWV3KXt0aGlzLl9leHRlbnNpb25WaWV3LmRldGFjaCh0cnVlKTtkZWxldGUgdGhpcy5fZXh0ZW5zaW9uVmlldzt9CnRoaXMuX29iamVjdFByb3BlcnRpZXNWaWV3PW5ldyBFeHRlbnNpb25zLkV4dGVuc2lvbk5vdGlmaWVyVmlldyh0aGlzLl9zZXJ2ZXIsdGhpcy5faWQpO3RoaXMuX29iamVjdFByb3BlcnRpZXNWaWV3LnNob3codGhpcy5lbGVtZW50KTt9Cl9zZXRPYmplY3Qob2JqZWN0LHRpdGxlLGNhbGxiYWNrKXtpZighdGhpcy5fb2JqZWN0UHJvcGVydGllc1ZpZXcpe2NhbGxiYWNrKCdvcGVyYXRpb24gY2FuY2VsbGVkJyk7cmV0dXJuO30KdGhpcy5fb2JqZWN0UHJvcGVydGllc1ZpZXcuZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO0NvbW1vbi5SZW5kZXJlci5yZW5kZXIob2JqZWN0LHt0aXRsZTp0aXRsZSxleHBhbmRlZDp0cnVlLGVkaXRhYmxlOmZhbHNlLH0pLnRoZW4oZWxlbWVudD0+e3RoaXMuX29iamVjdFByb3BlcnRpZXNWaWV3LmVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Y2FsbGJhY2soKTt9KTt9fTs7RXh0ZW5zaW9ucy5FeHRlbnNpb25WaWV3PWNsYXNzIGV4dGVuZHMgVUkuV2lkZ2V0e2NvbnN0cnVjdG9yKHNlcnZlcixpZCxzcmMsY2xhc3NOYW1lKXtzdXBlcigpO3RoaXMuc2V0SGlkZU9uRGV0YWNoKCk7dGhpcy5lbGVtZW50LmNsYXNzTmFtZT0ndmJveCBmbGV4LWF1dG8nO3RoaXMuX3NlcnZlcj1zZXJ2ZXI7dGhpcy5faWQ9aWQ7dGhpcy5faWZyYW1lPWNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO3RoaXMuX2lmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyx0aGlzLl9vbkxvYWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5faWZyYW1lLnNyYz1zcmM7dGhpcy5faWZyYW1lLmNsYXNzTmFtZT1jbGFzc05hbWU7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5faWZyYW1lKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faWZyYW1lKTt9Cndhc1Nob3duKCl7aWYodHlwZW9mIHRoaXMuX2ZyYW1lSW5kZXg9PT0nbnVtYmVyJykKdGhpcy5fc2VydmVyLm5vdGlmeVZpZXdTaG93bih0aGlzLl9pZCx0aGlzLl9mcmFtZUluZGV4KTt9CndpbGxIaWRlKCl7aWYodHlwZW9mIHRoaXMuX2ZyYW1lSW5kZXg9PT0nbnVtYmVyJykKdGhpcy5fc2VydmVyLm5vdGlmeVZpZXdIaWRkZW4odGhpcy5faWQpO30KX29uTG9hZCgpe2NvbnN0IGZyYW1lcz0od2luZG93LmZyYW1lcyk7dGhpcy5fZnJhbWVJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGZyYW1lcyx0aGlzLl9pZnJhbWUuY29udGVudFdpbmRvdyk7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fc2VydmVyLm5vdGlmeVZpZXdTaG93bih0aGlzLl9pZCx0aGlzLl9mcmFtZUluZGV4KTt9fTtFeHRlbnNpb25zLkV4dGVuc2lvbk5vdGlmaWVyVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3Ioc2VydmVyLGlkKXtzdXBlcigpO3RoaXMuX3NlcnZlcj1zZXJ2ZXI7dGhpcy5faWQ9aWQ7fQp3YXNTaG93bigpe3RoaXMuX3NlcnZlci5ub3RpZnlWaWV3U2hvd24odGhpcy5faWQpO30Kd2lsbEhpZGUoKXt0aGlzLl9zZXJ2ZXIubm90aWZ5Vmlld0hpZGRlbih0aGlzLl9pZCk7fX07O3NlbGZbJ1Byb2R1Y3RSZWdpc3RyeSddPXNlbGZbJ1Byb2R1Y3RSZWdpc3RyeSddfHx7fTtQcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sPWNsYXNze2NvbnN0cnVjdG9yKGZvcmNlU2hvdyl7dGhpcy5fc2hvd1RpdGxlcz1mYWxzZTt0aGlzLl9iYWRnZUVsZW1lbnRzPW5ldyBNYXAoKTtpZighZm9yY2VTaG93KXt0aGlzLl9zZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdwcm9kdWN0X3JlZ2lzdHJ5LmJhZGdlcy12aXNpYmxlJyk7dGhpcy5fc2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9zZXR0aW5nVXBkYXRlZC5iaW5kKHRoaXMpKTtpZih0aGlzLl9zZXR0aW5nLmdldCgpKQpIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlNob3dlZFRoaXJkUGFydHlCYWRnZXMpO319CnNldFNob3dUaXRsZXModmFsdWUpe3RoaXMuX3Nob3dUaXRsZXM9dmFsdWU7fQpiYWRnZUZvckZyYW1lKGZyYW1lKXtyZXR1cm4gdGhpcy5fYmFkZ2VGb3JGcmFtZU9yVXJsKHRoaXMuX3Jlc29sdmVVcmwuYmluZCh0aGlzLGZyYW1lKSk7fQpiYWRnZUZvclVSTChwYXJzZWRVcmwpe3JldHVybiB0aGlzLl9iYWRnZUZvckZyYW1lT3JVcmwoKCk9PlByb21pc2UucmVzb2x2ZShwYXJzZWRVcmwpKTt9CnJlc2V0KCl7dGhpcy5fYmFkZ2VFbGVtZW50cy5jbGVhcigpO30KX2JhZGdlRm9yRnJhbWVPclVybCh1cmxSZXNvbHZlcil7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnaGlkZGVuJyk7Y29uc3Qgcm9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoZWxlbWVudCwncHJvZHVjdF9yZWdpc3RyeS9iYWRnZS5jc3MnKTtjb25zdCBiYWRnZUVsZW1lbnQ9cm9vdC5jcmVhdGVDaGlsZCgnc3BhbicpO2JhZGdlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlLWJhZGdlLXRpdGxlJywhdGhpcy5fc2hvd1RpdGxlcyk7YmFkZ2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LmNvbnN1bWUoKSk7YmFkZ2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxldmVudD0+e3RoaXMuX3Nob3dQb3B1cChiYWRnZUVsZW1lbnQpO2V2ZW50LmNvbnN1bWUoKTt9LGZhbHNlKTt0aGlzLl9iYWRnZUVsZW1lbnRzLnNldChiYWRnZUVsZW1lbnQsdXJsUmVzb2x2ZXIpO3RoaXMuX3JlbmRlckJhZGdlKGJhZGdlRWxlbWVudCk7cmV0dXJuIGVsZW1lbnQ7fQphc3luYyBfcmVzb2x2ZVVybChmcmFtZSl7Y29uc3QgcmVnaXN0cnk9YXdhaXQgUHJvZHVjdFJlZ2lzdHJ5Lmluc3RhbmNlKCk7bGV0IHBhcnNlZFVybD1uZXcgQ29tbW9uLlBhcnNlZFVSTChmcmFtZS51cmwpO2NvbnN0IGVudHJ5PXJlZ2lzdHJ5LmVudHJ5Rm9yVXJsKHBhcnNlZFVybCk7aWYoIWVudHJ5KXtmcmFtZS5maW5kQ3JlYXRpb25DYWxsRnJhbWUoY2FsbEZyYW1lPT57aWYoIWNhbGxGcmFtZS51cmwpCnJldHVybiBmYWxzZTtwYXJzZWRVcmw9bmV3IENvbW1vbi5QYXJzZWRVUkwoY2FsbEZyYW1lLnVybCk7cmV0dXJuISFyZWdpc3RyeS5lbnRyeUZvclVybChwYXJzZWRVcmwpO30pO30KcmV0dXJuIHBhcnNlZFVybDt9CmFzeW5jIF9yZW5kZXJCYWRnZShiYWRnZUVsZW1lbnQpe2lmKGJhZGdlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGh8fCF0aGlzLl9pc1Zpc2libGUoYmFkZ2VFbGVtZW50KSl7dGhpcy5fdXBkYXRlQmFkZ2VFbGVtZW50VmlzaWJpbGl0eShiYWRnZUVsZW1lbnQpO3JldHVybjt9CmNvbnN0IHBhcnNlZFVybD1hd2FpdCB0aGlzLl9iYWRnZUVsZW1lbnRzLmdldChiYWRnZUVsZW1lbnQpKCk7Y29uc3QgcmVnaXN0cnk9YXdhaXQgUHJvZHVjdFJlZ2lzdHJ5Lmluc3RhbmNlKCk7Y29uc3QgZW50cnlOYW1lPXBhcnNlZFVybCYmcmVnaXN0cnkubmFtZUZvclVybChwYXJzZWRVcmwpO2lmKCFlbnRyeU5hbWUpCnJldHVybjtjb25zdCB0b2tlbnM9ZW50cnlOYW1lLnJlcGxhY2UoL1thLXpdKi9nLCcnKS5zcGxpdCgnICcpO2xldCBsYWJlbDtpZih0b2tlbnMubGVuZ3RoPjEpCmxhYmVsPXRva2Vuc1swXVswXSt0b2tlbnNbMV1bMF07ZWxzZQpsYWJlbD1lbnRyeU5hbWU7Y29uc3QgaWNvbkVsZW1lbnQ9YmFkZ2VFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywncHJvZHVjdC1yZWdpc3RyeS1iYWRnZSBtb25vc3BhY2UnKTtpY29uRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaW5pdGlhbCcsbGFiZWwuc3Vic3RyaW5nKDAsMikudG9VcHBlckNhc2UoKSk7aWNvbkVsZW1lbnQudGl0bGU9ZW50cnlOYW1lO2ljb25FbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcj1Qcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sLmNvbG9yRm9yRW50cnlOYW1lKGVudHJ5TmFtZSk7YmFkZ2VFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywncHJvZHVjdC1yZWdpc3RyeS1iYWRnZS10aXRsZScpLnRleHRDb250ZW50PWVudHJ5TmFtZTt0aGlzLl91cGRhdGVCYWRnZUVsZW1lbnRWaXNpYmlsaXR5KGJhZGdlRWxlbWVudCk7fQpfc2V0dGluZ1VwZGF0ZWQoKXtmb3IoY29uc3QgYmFkZ2VFbGVtZW50IG9mIHRoaXMuX2JhZGdlRWxlbWVudHMua2V5cygpKQp0aGlzLl9yZW5kZXJCYWRnZShiYWRnZUVsZW1lbnQpO30KX2lzVmlzaWJsZShiYWRnZUVsZW1lbnQpe3JldHVybiF0aGlzLl9zZXR0aW5nfHx0aGlzLl9zZXR0aW5nLmdldCgpO30KX3VwZGF0ZUJhZGdlRWxlbWVudFZpc2liaWxpdHkoYmFkZ2VFbGVtZW50KXtiYWRnZUVsZW1lbnQucGFyZW50Tm9kZU9yU2hhZG93SG9zdCgpLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCF0aGlzLl9pc1Zpc2libGUoYmFkZ2VFbGVtZW50KSk7fQphc3luYyBfc2hvd1BvcHVwKGJhZGdlRWxlbWVudCl7aWYoIXRoaXMuX2JhZGdlRWxlbWVudHMuaGFzKGJhZGdlRWxlbWVudCkpCnJldHVybjtjb25zdCByZWdpc3RyeT1hd2FpdCBQcm9kdWN0UmVnaXN0cnkuaW5zdGFuY2UoKTtjb25zdCBwYXJzZWRVcmw9YXdhaXQgdGhpcy5fYmFkZ2VFbGVtZW50cy5nZXQoYmFkZ2VFbGVtZW50KSgpO2NvbnN0IGVudHJ5TmFtZT1yZWdpc3RyeS5uYW1lRm9yVXJsKHBhcnNlZFVybCk7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyhlbGVtZW50LCdwcm9kdWN0X3JlZ2lzdHJ5L3BvcHVwLmNzcycpO2NvbnN0IHBvcHVwRWxlbWVudD1yb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdwcm9kdWN0LXJlZ2lzdHJ5LXBvcHVwJyk7Y29uc3QgZG9tYWluRWxlbWVudD1wb3B1cEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Byb2R1Y3QtcmVnaXN0cnktZG9tYWluJyk7ZG9tYWluRWxlbWVudC50ZXh0Q29udGVudD1wYXJzZWRVcmwuZG9tYWluKCk7Y29uc3QgZW50cnlOYW1lRWxlbWVudD1wb3B1cEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Byb2R1Y3QtcmVnaXN0cnktbmFtZScpO2VudHJ5TmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9ZW50cnlOYW1lO2NvbnN0IHJlcG9ydExpbms9J2h0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2NoejJGZGNRLXJSbGx6bDhCYmhXYVRSUlktMTJCcFBqVzZIcjllMS1CcENBMDgzdy92aWV3Zm9ybScrJz9lbnRyeV8xNDI1OTE4MTcxPScrZW5jb2RlVVJJQ29tcG9uZW50KChwYXJzZWRVcmwuZG9tYWluKCkrcGFyc2VkVXJsLnBhdGgpLnN1YnN0cigwLDEwMCkpO3BvcHVwRWxlbWVudC5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUocmVwb3J0TGluaywnUmVwb3J0IG1pc21hdGNoJywncHJvZHVjdC1yZWdpc3RyeS1saW5rJykpO2NvbnN0IGRpYWxvZz1uZXcgVUkuRGlhbG9nKCk7ZGlhbG9nLnNldENvbnRlbnRBbmNob3JCb3goYmFkZ2VFbGVtZW50LmJveEluV2luZG93KCkpO2RpYWxvZy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5zZXRBbmNob3JCZWhhdmlvcihVSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyVG9wKTtkaWFsb2cuYWRkQ2xvc2VCdXR0b24oKTtkaWFsb2cuc2hvdygoYmFkZ2VFbGVtZW50Lm93bmVyRG9jdW1lbnQpKTt9CnN0YXRpYyBjb2xvckZvckVudHJ5TmFtZShlbnRyeU5hbWUpe2lmKCFQcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sLl9jb2xvckdlbmVyYXRvcil7UHJvZHVjdFJlZ2lzdHJ5LkJhZGdlUG9vbC5fY29sb3JHZW5lcmF0b3I9bmV3IENvbW1vbi5Db2xvci5HZW5lcmF0b3Ioe21pbjozMCxtYXg6MzMwfSx7bWluOjUwLG1heDo4MCxjb3VudDozfSw4MCk7fQpyZXR1cm4gUHJvZHVjdFJlZ2lzdHJ5LkJhZGdlUG9vbC5fY29sb3JHZW5lcmF0b3IuY29sb3JGb3JJRChlbnRyeU5hbWUpO319OztQcm9kdWN0UmVnaXN0cnkuaW5zdGFuY2U9ZnVuY3Rpb24oKXtjb25zdCBleHRlbnNpb249c2VsZi5ydW50aW1lLmV4dGVuc2lvbihQcm9kdWN0UmVnaXN0cnkuUmVnaXN0cnkpO2lmKGV4dGVuc2lvbikKcmV0dXJuIGV4dGVuc2lvbi5pbnN0YW5jZSgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoc2VsZi5zaW5nbGV0b24oUHJvZHVjdFJlZ2lzdHJ5LlJlZ2lzdHJ5U3R1YikpO307UHJvZHVjdFJlZ2lzdHJ5LlJlZ2lzdHJ5PWZ1bmN0aW9uKCl7fTtQcm9kdWN0UmVnaXN0cnkuUmVnaXN0cnkucHJvdG90eXBlPXtuYW1lRm9yVXJsOmZ1bmN0aW9uKHBhcnNlZFVybCl7fSxlbnRyeUZvclVybDpmdW5jdGlvbihwYXJzZWRVcmwpe30sdHlwZUZvclVybDpmdW5jdGlvbihwYXJzZWRVcmwpe319O1Byb2R1Y3RSZWdpc3RyeS5SZWdpc3RyeVN0dWI9Y2xhc3N7bmFtZUZvclVybChwYXJzZWRVcmwpe3JldHVybiBudWxsO30KZW50cnlGb3JVcmwocGFyc2VkVXJsKXtyZXR1cm4gbnVsbDt9CnR5cGVGb3JVcmwocGFyc2VkVXJsKXtyZXR1cm4gbnVsbDt9fTtQcm9kdWN0UmVnaXN0cnkuUmVnaXN0cnkuUHJvZHVjdEVudHJ5OztzZWxmWydNYWluJ109c2VsZlsnTWFpbiddfHx7fTtNYWluLlNpbXBsZUFwcD1jbGFzc3twcmVzZW50VUkoZG9jdW1lbnQpe2NvbnN0IHJvb3RWaWV3PW5ldyBVSS5Sb290VmlldygpO1VJLmluc3BlY3RvclZpZXcuc2hvdyhyb290Vmlldy5lbGVtZW50KTtyb290Vmlldy5hdHRhY2hUb0RvY3VtZW50KGRvY3VtZW50KTtyb290Vmlldy5mb2N1cygpO319O01haW4uU2ltcGxlQXBwUHJvdmlkZXI9Y2xhc3N7Y3JlYXRlQXBwKCl7cmV0dXJuIG5ldyBNYWluLlNpbXBsZUFwcCgpO319OztNYWluLkV4ZWN1dGlvbkNvbnRleHRTZWxlY3Rvcj1jbGFzc3tjb25zdHJ1Y3Rvcih0YXJnZXRNYW5hZ2VyLGNvbnRleHQpe3RhcmdldE1hbmFnZXIub2JzZXJ2ZVRhcmdldHModGhpcyxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuSlMpO2NvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkV4ZWN1dGlvbkNvbnRleHQsdGhpcy5fZXhlY3V0aW9uQ29udGV4dENoYW5nZWQsdGhpcyk7Y29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuVGFyZ2V0LHRoaXMuX3RhcmdldENoYW5nZWQsdGhpcyk7dGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5SdW50aW1lTW9kZWwsU0RLLlJ1bnRpbWVNb2RlbC5FdmVudHMuRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQsdGhpcy5fb25FeGVjdXRpb25Db250ZXh0Q3JlYXRlZCx0aGlzKTt0YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0RGVzdHJveWVkLHRoaXMuX29uRXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZCx0aGlzKTt0YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0T3JkZXJDaGFuZ2VkLHRoaXMuX29uRXhlY3V0aW9uQ29udGV4dE9yZGVyQ2hhbmdlZCx0aGlzKTt0aGlzLl90YXJnZXRNYW5hZ2VyPXRhcmdldE1hbmFnZXI7dGhpcy5fY29udGV4dD1jb250ZXh0O30KdGFyZ2V0QWRkZWQodGFyZ2V0KXtzZXRJbW1lZGlhdGUoZGVmZXJyZWQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gZGVmZXJyZWQoKXtpZighdGhpcy5fY29udGV4dC5mbGF2b3IoU0RLLlRhcmdldCkpCnRoaXMuX2NvbnRleHQuc2V0Rmxhdm9yKFNESy5UYXJnZXQsdGFyZ2V0KTt9fQp0YXJnZXRSZW1vdmVkKHRhcmdldCl7Y29uc3QgY3VycmVudEV4ZWN1dGlvbkNvbnRleHQ9dGhpcy5fY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKGN1cnJlbnRFeGVjdXRpb25Db250ZXh0JiZjdXJyZW50RXhlY3V0aW9uQ29udGV4dC50YXJnZXQoKT09PXRhcmdldCkKdGhpcy5fY3VycmVudEV4ZWN1dGlvbkNvbnRleHRHb25lKCk7Y29uc3QgdGFyZ2V0cz10aGlzLl90YXJnZXRNYW5hZ2VyLnRhcmdldHMoU0RLLlRhcmdldC5DYXBhYmlsaXR5LkpTKTtpZih0aGlzLl9jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KT09PXRhcmdldCYmdGFyZ2V0cy5sZW5ndGgpCnRoaXMuX2NvbnRleHQuc2V0Rmxhdm9yKFNESy5UYXJnZXQsdGFyZ2V0c1swXSk7fQpfZXhlY3V0aW9uQ29udGV4dENoYW5nZWQoZXZlbnQpe2NvbnN0IG5ld0NvbnRleHQ9KGV2ZW50LmRhdGEpO2lmKG5ld0NvbnRleHQpe3RoaXMuX2NvbnRleHQuc2V0Rmxhdm9yKFNESy5UYXJnZXQsbmV3Q29udGV4dC50YXJnZXQoKSk7aWYoIXRoaXMuX2lnbm9yZUNvbnRleHRDaGFuZ2VkKQp0aGlzLl9sYXN0U2VsZWN0ZWRDb250ZXh0SWQ9dGhpcy5fY29udGV4dFBlcnNpc3RlbnRJZChuZXdDb250ZXh0KTt9fQpfY29udGV4dFBlcnNpc3RlbnRJZChleGVjdXRpb25Db250ZXh0KXtyZXR1cm4gZXhlY3V0aW9uQ29udGV4dC5pc0RlZmF1bHQ/ZXhlY3V0aW9uQ29udGV4dC50YXJnZXQoKS5uYW1lKCkrJzonK2V4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZDonJzt9Cl90YXJnZXRDaGFuZ2VkKGV2ZW50KXtjb25zdCBuZXdUYXJnZXQ9KGV2ZW50LmRhdGEpO2NvbnN0IGN1cnJlbnRDb250ZXh0PXRoaXMuX2NvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighbmV3VGFyZ2V0fHwoY3VycmVudENvbnRleHQmJmN1cnJlbnRDb250ZXh0LnRhcmdldCgpPT09bmV3VGFyZ2V0KSkKcmV0dXJuO2NvbnN0IHJ1bnRpbWVNb2RlbD1uZXdUYXJnZXQubW9kZWwoU0RLLlJ1bnRpbWVNb2RlbCk7Y29uc3QgZXhlY3V0aW9uQ29udGV4dHM9cnVudGltZU1vZGVsP3J1bnRpbWVNb2RlbC5leGVjdXRpb25Db250ZXh0cygpOltdO2lmKCFleGVjdXRpb25Db250ZXh0cy5sZW5ndGgpCnJldHVybjtsZXQgbmV3Q29udGV4dD1udWxsO2ZvcihsZXQgaT0wO2k8ZXhlY3V0aW9uQ29udGV4dHMubGVuZ3RoJiYhbmV3Q29udGV4dDsrK2kpe2lmKHRoaXMuX3Nob3VsZFN3aXRjaFRvQ29udGV4dChleGVjdXRpb25Db250ZXh0c1tpXSkpCm5ld0NvbnRleHQ9ZXhlY3V0aW9uQ29udGV4dHNbaV07fQpmb3IobGV0IGk9MDtpPGV4ZWN1dGlvbkNvbnRleHRzLmxlbmd0aCYmIW5ld0NvbnRleHQ7KytpKXtpZih0aGlzLl9pc0RlZmF1bHRDb250ZXh0KGV4ZWN1dGlvbkNvbnRleHRzW2ldKSkKbmV3Q29udGV4dD1leGVjdXRpb25Db250ZXh0c1tpXTt9CnRoaXMuX2lnbm9yZUNvbnRleHRDaGFuZ2VkPXRydWU7dGhpcy5fY29udGV4dC5zZXRGbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQsbmV3Q29udGV4dHx8ZXhlY3V0aW9uQ29udGV4dHNbMF0pO3RoaXMuX2lnbm9yZUNvbnRleHRDaGFuZ2VkPWZhbHNlO30KX3Nob3VsZFN3aXRjaFRvQ29udGV4dChleGVjdXRpb25Db250ZXh0KXtpZih0aGlzLl9sYXN0U2VsZWN0ZWRDb250ZXh0SWQmJnRoaXMuX2xhc3RTZWxlY3RlZENvbnRleHRJZD09PXRoaXMuX2NvbnRleHRQZXJzaXN0ZW50SWQoZXhlY3V0aW9uQ29udGV4dCkpCnJldHVybiB0cnVlO2lmKCF0aGlzLl9sYXN0U2VsZWN0ZWRDb250ZXh0SWQmJnRoaXMuX2lzRGVmYXVsdENvbnRleHQoZXhlY3V0aW9uQ29udGV4dCkpCnJldHVybiB0cnVlO3JldHVybiBmYWxzZTt9Cl9pc0RlZmF1bHRDb250ZXh0KGV4ZWN1dGlvbkNvbnRleHQpe2lmKCFleGVjdXRpb25Db250ZXh0LmlzRGVmYXVsdHx8IWV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZCkKcmV0dXJuIGZhbHNlO2lmKGV4ZWN1dGlvbkNvbnRleHQudGFyZ2V0KCkucGFyZW50VGFyZ2V0KCkpCnJldHVybiBmYWxzZTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1leGVjdXRpb25Db250ZXh0LnRhcmdldCgpLm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7Y29uc3QgZnJhbWU9cmVzb3VyY2VUcmVlTW9kZWwmJnJlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQoZXhlY3V0aW9uQ29udGV4dC5mcmFtZUlkKTtpZihmcmFtZSYmZnJhbWUuaXNUb3BGcmFtZSgpKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2U7fQpfb25FeGVjdXRpb25Db250ZXh0Q3JlYXRlZChldmVudCl7dGhpcy5fc3dpdGNoQ29udGV4dElmTmVjZXNzYXJ5KChldmVudC5kYXRhKSk7fQpfb25FeGVjdXRpb25Db250ZXh0RGVzdHJveWVkKGV2ZW50KXtjb25zdCBleGVjdXRpb25Db250ZXh0PShldmVudC5kYXRhKTtpZih0aGlzLl9jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk9PT1leGVjdXRpb25Db250ZXh0KQp0aGlzLl9jdXJyZW50RXhlY3V0aW9uQ29udGV4dEdvbmUoKTt9Cl9vbkV4ZWN1dGlvbkNvbnRleHRPcmRlckNoYW5nZWQoZXZlbnQpe2NvbnN0IHJ1bnRpbWVNb2RlbD0oZXZlbnQuZGF0YSk7Y29uc3QgZXhlY3V0aW9uQ29udGV4dHM9cnVudGltZU1vZGVsLmV4ZWN1dGlvbkNvbnRleHRzKCk7Zm9yKGxldCBpPTA7aTxleGVjdXRpb25Db250ZXh0cy5sZW5ndGg7aSsrKXtpZih0aGlzLl9zd2l0Y2hDb250ZXh0SWZOZWNlc3NhcnkoZXhlY3V0aW9uQ29udGV4dHNbaV0pKQpicmVhazt9fQpfc3dpdGNoQ29udGV4dElmTmVjZXNzYXJ5KGV4ZWN1dGlvbkNvbnRleHQpe2lmKCF0aGlzLl9jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCl8fHRoaXMuX3Nob3VsZFN3aXRjaFRvQ29udGV4dChleGVjdXRpb25Db250ZXh0KSl7dGhpcy5faWdub3JlQ29udGV4dENoYW5nZWQ9dHJ1ZTt0aGlzLl9jb250ZXh0LnNldEZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCxleGVjdXRpb25Db250ZXh0KTt0aGlzLl9pZ25vcmVDb250ZXh0Q2hhbmdlZD1mYWxzZTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9Cl9jdXJyZW50RXhlY3V0aW9uQ29udGV4dEdvbmUoKXtjb25zdCBydW50aW1lTW9kZWxzPXRoaXMuX3RhcmdldE1hbmFnZXIubW9kZWxzKFNESy5SdW50aW1lTW9kZWwpO2xldCBuZXdDb250ZXh0PW51bGw7Zm9yKGxldCBpPTA7aTxydW50aW1lTW9kZWxzLmxlbmd0aCYmIW5ld0NvbnRleHQ7KytpKXtjb25zdCBleGVjdXRpb25Db250ZXh0cz1ydW50aW1lTW9kZWxzW2ldLmV4ZWN1dGlvbkNvbnRleHRzKCk7Zm9yKGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgb2YgZXhlY3V0aW9uQ29udGV4dHMpe2lmKHRoaXMuX2lzRGVmYXVsdENvbnRleHQoZXhlY3V0aW9uQ29udGV4dCkpe25ld0NvbnRleHQ9ZXhlY3V0aW9uQ29udGV4dDticmVhazt9fX0KaWYoIW5ld0NvbnRleHQpe2ZvcihsZXQgaT0wO2k8cnVudGltZU1vZGVscy5sZW5ndGgmJiFuZXdDb250ZXh0OysraSl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dHM9cnVudGltZU1vZGVsc1tpXS5leGVjdXRpb25Db250ZXh0cygpO2lmKGV4ZWN1dGlvbkNvbnRleHRzLmxlbmd0aCl7bmV3Q29udGV4dD1leGVjdXRpb25Db250ZXh0c1swXTticmVhazt9fX0KdGhpcy5faWdub3JlQ29udGV4dENoYW5nZWQ9dHJ1ZTt0aGlzLl9jb250ZXh0LnNldEZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCxuZXdDb250ZXh0KTt0aGlzLl9pZ25vcmVDb250ZXh0Q2hhbmdlZD1mYWxzZTt9fTs7TWFpbi5NYWluPWNsYXNze2NvbnN0cnVjdG9yKCl7TWFpbi5NYWluLl9pbnN0YW5jZUZvclRlc3Q9dGhpcztydW5PbldpbmRvd0xvYWQodGhpcy5fbG9hZGVkLmJpbmQodGhpcykpO30Kc3RhdGljIHRpbWUobGFiZWwpe2lmKEhvc3QuaXNVbmRlclRlc3QoKSkKcmV0dXJuO2NvbnNvbGUudGltZShsYWJlbCk7fQpzdGF0aWMgdGltZUVuZChsYWJlbCl7aWYoSG9zdC5pc1VuZGVyVGVzdCgpKQpyZXR1cm47Y29uc29sZS50aW1lRW5kKGxhYmVsKTt9CmFzeW5jIF9sb2FkZWQoKXtjb25zb2xlLnRpbWVTdGFtcCgnTWFpbi5fbG9hZGVkJyk7YXdhaXQgUnVudGltZS5ydW50aW1lUmVhZHkoKTtSdW50aW1lLnNldFBsYXRmb3JtKEhvc3QucGxhdGZvcm0oKSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmdldFByZWZlcmVuY2VzKHRoaXMuX2dvdFByZWZlcmVuY2VzLmJpbmQodGhpcykpO30KX2dvdFByZWZlcmVuY2VzKHByZWZzKXtjb25zb2xlLnRpbWVTdGFtcCgnTWFpbi5fZ290UHJlZmVyZW5jZXMnKTtpZihIb3N0LmlzVW5kZXJUZXN0KHByZWZzKSkKc2VsZi5ydW50aW1lLnVzZVRlc3RCYXNlKCk7dGhpcy5fY3JlYXRlU2V0dGluZ3MocHJlZnMpO3RoaXMuX2NyZWF0ZUFwcFVJKCk7fQpfY3JlYXRlU2V0dGluZ3MocHJlZnMpe3RoaXMuX2luaXRpYWxpemVFeHBlcmltZW50cygpO2xldCBzdG9yYWdlUHJlZml4PScnO2lmKEhvc3QuaXNDdXN0b21EZXZ0b29sc0Zyb250ZW5kKCkpCnN0b3JhZ2VQcmVmaXg9J19fY3VzdG9tX18nO2Vsc2UgaWYoIVJ1bnRpbWUucXVlcnlQYXJhbSgnY2FuX2RvY2snKSYmISFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKSYmIUhvc3QuaXNVbmRlclRlc3QoKSkKc3RvcmFnZVByZWZpeD0nX19idW5kbGVkX18nO2xldCBsb2NhbFN0b3JhZ2U7aWYoIUhvc3QuaXNVbmRlclRlc3QoKSYmd2luZG93LmxvY2FsU3RvcmFnZSl7bG9jYWxTdG9yYWdlPW5ldyBDb21tb24uU2V0dGluZ3NTdG9yYWdlKHdpbmRvdy5sb2NhbFN0b3JhZ2UsdW5kZWZpbmVkLHVuZGVmaW5lZCwoKT0+d2luZG93LmxvY2FsU3RvcmFnZS5jbGVhcigpLHN0b3JhZ2VQcmVmaXgpO31lbHNle2xvY2FsU3RvcmFnZT1uZXcgQ29tbW9uLlNldHRpbmdzU3RvcmFnZSh7fSx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxzdG9yYWdlUHJlZml4KTt9CmNvbnN0IGdsb2JhbFN0b3JhZ2U9bmV3IENvbW1vbi5TZXR0aW5nc1N0b3JhZ2UocHJlZnMsSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNldFByZWZlcmVuY2UsSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnJlbW92ZVByZWZlcmVuY2UsSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNsZWFyUHJlZmVyZW5jZXMsc3RvcmFnZVByZWZpeCk7Q29tbW9uLnNldHRpbmdzPW5ldyBDb21tb24uU2V0dGluZ3MoZ2xvYmFsU3RvcmFnZSxsb2NhbFN0b3JhZ2UpO2lmKCFIb3N0LmlzVW5kZXJUZXN0KCkpCm5ldyBDb21tb24uVmVyc2lvbkNvbnRyb2xsZXIoKS51cGRhdGVWZXJzaW9uKCk7fQpfaW5pdGlhbGl6ZUV4cGVyaW1lbnRzKCl7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3RlcignYXBwbHlDdXN0b21TdHlsZXNoZWV0JywnQWxsb3cgY3VzdG9tIFVJIHRoZW1lcycpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ2JsYWNrYm94SlNGcmFtZXNPblRpbWVsaW5lJywnQmxhY2tib3ggSmF2YVNjcmlwdCBmcmFtZXMgb24gVGltZWxpbmUnLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ2NvbG9yQ29udHJhc3RSYXRpbycsJ0NvbG9yIGNvbnRyYXN0IHJhdGlvIGxpbmUgaW4gY29sb3IgcGlja2VyJyx0cnVlKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCdjb25zb2xlQmVsb3dQcm9tcHQnLCdFYWdlciBldmFsdWF0aW9uJyk7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3RlcignZW1wdHlTb3VyY2VNYXBBdXRvU3RlcHBpbmcnLCdFbXB0eSBzb3VyY2VtYXAgYXV0by1zdGVwcGluZycpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ2lucHV0RXZlbnRzT25UaW1lbGluZU92ZXJ2aWV3JywnSW5wdXQgZXZlbnRzIG9uIFRpbWVsaW5lIG92ZXJ2aWV3Jyx0cnVlKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCduYXRpdmVIZWFwUHJvZmlsZXInLCdOYXRpdmUgbWVtb3J5IHNhbXBsaW5nIGhlYXAgcHJvZmlsZXInLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ25ldHdvcmtTZWFyY2gnLCdOZXR3b3JrIHNlYXJjaCcpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ29vcGlmSW5saW5lRE9NJywnT09QSUY6IGlubGluZSBET00gJyx0cnVlKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCdwaW5uZWRFeHByZXNzaW9ucycsJ1Bpbm5lZCBleHByZXNzaW9ucyBpbiBDb25zb2xlJyx0cnVlKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCdwcm90b2NvbE1vbml0b3InLCdQcm90b2NvbCBNb25pdG9yJyk7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3Rlcignc291cmNlRGlmZicsJ1NvdXJjZSBkaWZmJyk7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3Rlcignc291cmNlc1ByZXR0eVByaW50JywnQXV0b21hdGljYWxseSBwcmV0dHkgcHJpbnQgaW4gdGhlIFNvdXJjZXMgUGFuZWwnKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCdzdGVwSW50b0FzeW5jJywnSW50cm9kdWNlIHNlcGFyYXRlIHN0ZXAgYWN0aW9uLCBzdGVwSW50byBiZWNvbWVzIHBvd2VyZnVsIGVub3VnaCB0byBnbyBpbnNpZGUgYXN5bmMgY2FsbCcpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ3NwbGl0SW5EcmF3ZXInLCdTcGxpdCBpbiBkcmF3ZXInLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ3Rlcm1pbmFsSW5EcmF3ZXInLCdUZXJtaW5hbCBpbiBkcmF3ZXInLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ3RpbWVsaW5lRXZlbnRJbml0aWF0b3JzJywnVGltZWxpbmU6IGV2ZW50IGluaXRpYXRvcnMnKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCd0aW1lbGluZUZsb3dFdmVudHMnLCdUaW1lbGluZTogZmxvdyBldmVudHMnLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ3RpbWVsaW5lSW52YWxpZGF0aW9uVHJhY2tpbmcnLCdUaW1lbGluZTogaW52YWxpZGF0aW9uIHRyYWNraW5nJyx0cnVlKTtSdW50aW1lLmV4cGVyaW1lbnRzLnJlZ2lzdGVyKCd0aW1lbGluZVBhaW50VGltaW5nTWFya2VycycsJ1RpbWVsaW5lOiBwYWludCB0aW1pbmcgbWFya2VycycsdHJ1ZSk7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3RlcigndGltZWxpbmVTaG93QWxsRXZlbnRzJywnVGltZWxpbmU6IHNob3cgYWxsIGV2ZW50cycsdHJ1ZSk7UnVudGltZS5leHBlcmltZW50cy5yZWdpc3RlcigndGltZWxpbmVUcmFjaW5nSlNQcm9maWxlJywnVGltZWxpbmU6IHRyYWNpbmcgYmFzZWQgSlMgcHJvZmlsZXInLHRydWUpO1J1bnRpbWUuZXhwZXJpbWVudHMucmVnaXN0ZXIoJ3RpbWVsaW5lVjhSdW50aW1lQ2FsbFN0YXRzJywnVGltZWxpbmU6IFY4IFJ1bnRpbWUgQ2FsbCBTdGF0cyBvbiBUaW1lbGluZScsdHJ1ZSk7UnVudGltZS5leHBlcmltZW50cy5jbGVhblVwU3RhbGVFeHBlcmltZW50cygpO2lmKEhvc3QuaXNVbmRlclRlc3QoKSl7Y29uc3QgdGVzdFBhdGg9UnVudGltZS5xdWVyeVBhcmFtKCd0ZXN0Jyk7aWYodGVzdFBhdGguaW5kZXhPZignb29waWYvJykhPT0tMSkKUnVudGltZS5leHBlcmltZW50cy5lbmFibGVGb3JUZXN0KCdvb3BpZklubGluZURPTScpO2lmKHRlc3RQYXRoLmluZGV4T2YoJ25ldHdvcmsvJykhPT0tMSkKUnVudGltZS5leHBlcmltZW50cy5lbmFibGVGb3JUZXN0KCduZXR3b3JrU2VhcmNoJyk7aWYodGVzdFBhdGguaW5kZXhPZignY29uc29sZS92aWV3cG9ydC10ZXN0aW5nLycpIT09LTEpClJ1bnRpbWUuZXhwZXJpbWVudHMuZW5hYmxlRm9yVGVzdCgnY29uc29sZUJlbG93UHJvbXB0Jyk7fQpSdW50aW1lLmV4cGVyaW1lbnRzLnNldERlZmF1bHRFeHBlcmltZW50cyhbJ2NvbG9yQ29udHJhc3RSYXRpbycsJ3N0ZXBJbnRvQXN5bmMnLCdvb3BpZklubGluZURPTScsJ2NvbnNvbGVCZWxvd1Byb21wdCcsJ3RpbWVsaW5lVHJhY2luZ0pTUHJvZmlsZSddKTt9CmFzeW5jIF9jcmVhdGVBcHBVSSgpe01haW4uTWFpbi50aW1lKCdNYWluLl9jcmVhdGVBcHBVSScpO1VJLnZpZXdNYW5hZ2VyPW5ldyBVSS5WaWV3TWFuYWdlcigpO1BlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXI9bmV3IFBlcnNpc3RlbmNlLklzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIoKTtjb25zdCB0aGVtZVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3VpVGhlbWUnLCdkZWZhdWx0Jyk7VUkuaW5pdGlhbGl6ZVVJVXRpbHMoZG9jdW1lbnQsdGhlbWVTZXR0aW5nKTt0aGVtZVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIoQ29tcG9uZW50cy5yZWxvYWQuYmluZChDb21wb25lbnRzKSk7VUkuaW5zdGFsbENvbXBvbmVudFJvb3RTdHlsZXMoKGRvY3VtZW50LmJvZHkpKTt0aGlzLl9hZGRNYWluRXZlbnRMaXN0ZW5lcnMoZG9jdW1lbnQpO2NvbnN0IGNhbkRvY2s9ISFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2Nhbl9kb2NrJyk7VUkuem9vbU1hbmFnZXI9bmV3IFVJLlpvb21NYW5hZ2VyKHdpbmRvdyxJbnNwZWN0b3JGcm9udGVuZEhvc3QpO1VJLmluc3BlY3RvclZpZXc9VUkuSW5zcGVjdG9yVmlldy5pbnN0YW5jZSgpO1VJLkNvbnRleHRNZW51LmluaXRpYWxpemUoKTtVSS5Db250ZXh0TWVudS5pbnN0YWxsSGFuZGxlcihkb2N1bWVudCk7VUkuVG9vbHRpcC5pbnN0YWxsSGFuZGxlcihkb2N1bWVudCk7Q29tcG9uZW50cy5kb2NrQ29udHJvbGxlcj1uZXcgQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlcihjYW5Eb2NrKTtTREsuY29uc29sZU1vZGVsPW5ldyBTREsuQ29uc29sZU1vZGVsKCk7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXI9bmV3IFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyKCk7U0RLLmRvbURlYnVnZ2VyTWFuYWdlcj1uZXcgU0RLLkRPTURlYnVnZ2VyTWFuYWdlcigpO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcy5fb25TdXNwZW5kU3RhdGVDaGFuZ2VkLmJpbmQodGhpcykpO1VJLnNob3J0Y3V0c1NjcmVlbj1uZXcgVUkuU2hvcnRjdXRzU2NyZWVuKCk7VUkuc2hvcnRjdXRzU2NyZWVuLnNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdFbGVtZW50cyBQYW5lbCcpKTtVSS5zaG9ydGN1dHNTY3JlZW4uc2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ1N0eWxlcyBQYW5lJykpO1VJLnNob3J0Y3V0c1NjcmVlbi5zZWN0aW9uKENvbW1vbi5VSVN0cmluZygnRGVidWdnZXInKSk7VUkuc2hvcnRjdXRzU2NyZWVuLnNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdDb25zb2xlJykpO1dvcmtzcGFjZS5maWxlTWFuYWdlcj1uZXcgV29ya3NwYWNlLkZpbGVNYW5hZ2VyKCk7V29ya3NwYWNlLndvcmtzcGFjZT1uZXcgV29ya3NwYWNlLldvcmtzcGFjZSgpO0JpbmRpbmdzLm5ldHdvcmtQcm9qZWN0TWFuYWdlcj1uZXcgQmluZGluZ3MuTmV0d29ya1Byb2plY3RNYW5hZ2VyKCk7QmluZGluZ3MucmVzb3VyY2VNYXBwaW5nPW5ldyBCaW5kaW5ncy5SZXNvdXJjZU1hcHBpbmcoU0RLLnRhcmdldE1hbmFnZXIsV29ya3NwYWNlLndvcmtzcGFjZSk7bmV3IEJpbmRpbmdzLlByZXNlbnRhdGlvbkNvbnNvbGVNZXNzYWdlTWFuYWdlcigpO0JpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmc9bmV3IEJpbmRpbmdzLkNTU1dvcmtzcGFjZUJpbmRpbmcoU0RLLnRhcmdldE1hbmFnZXIsV29ya3NwYWNlLndvcmtzcGFjZSk7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nPW5ldyBCaW5kaW5ncy5EZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcoU0RLLnRhcmdldE1hbmFnZXIsV29ya3NwYWNlLndvcmtzcGFjZSk7QmluZGluZ3MuYnJlYWtwb2ludE1hbmFnZXI9bmV3IEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyKFdvcmtzcGFjZS53b3Jrc3BhY2UsU0RLLnRhcmdldE1hbmFnZXIsQmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKTtFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlcj1uZXcgRXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXIoKTtuZXcgUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcoUGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlcixXb3Jrc3BhY2Uud29ya3NwYWNlKTtQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZT1uZXcgUGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UoV29ya3NwYWNlLndvcmtzcGFjZSxCaW5kaW5ncy5icmVha3BvaW50TWFuYWdlcik7UGVyc2lzdGVuY2UubmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlcj1uZXcgUGVyc2lzdGVuY2UuTmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlcihXb3Jrc3BhY2Uud29ya3NwYWNlKTtuZXcgTWFpbi5FeGVjdXRpb25Db250ZXh0U2VsZWN0b3IoU0RLLnRhcmdldE1hbmFnZXIsVUkuY29udGV4dCk7QmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyPW5ldyBCaW5kaW5ncy5CbGFja2JveE1hbmFnZXIoQmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nKTtuZXcgTWFpbi5NYWluLlBhdXNlTGlzdGVuZXIoKTtVSS5hY3Rpb25SZWdpc3RyeT1uZXcgVUkuQWN0aW9uUmVnaXN0cnkoKTtVSS5zaG9ydGN1dFJlZ2lzdHJ5PW5ldyBVSS5TaG9ydGN1dFJlZ2lzdHJ5KFVJLmFjdGlvblJlZ2lzdHJ5LGRvY3VtZW50KTtVSS5TaG9ydGN1dHNTY3JlZW4ucmVnaXN0ZXJTaG9ydGN1dHMoKTt0aGlzLl9yZWdpc3RlckZvcndhcmRlZFNob3J0Y3V0cygpO3RoaXMuX3JlZ2lzdGVyTWVzc2FnZVNpbmtMaXN0ZW5lcigpO01haW4uTWFpbi50aW1lRW5kKCdNYWluLl9jcmVhdGVBcHBVSScpO3RoaXMuX3Nob3dBcHBVSShhd2FpdCBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9uKENvbW1vbi5BcHBQcm92aWRlcikuaW5zdGFuY2UoKSk7fQpfc2hvd0FwcFVJKGFwcFByb3ZpZGVyKXtNYWluLk1haW4udGltZSgnTWFpbi5fc2hvd0FwcFVJJyk7Y29uc3QgYXBwPShhcHBQcm92aWRlcikuY3JlYXRlQXBwKCk7Q29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5pbml0aWFsaXplKCk7YXBwLnByZXNlbnRVSShkb2N1bWVudCk7Y29uc3QgdG9nZ2xlU2VhcmNoTm9kZUFjdGlvbj1VSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24oJ2VsZW1lbnRzLnRvZ2dsZS1lbGVtZW50LXNlYXJjaCcpO2lmKHRvZ2dsZVNlYXJjaE5vZGVBY3Rpb24pe0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkVudGVySW5zcGVjdEVsZW1lbnRNb2RlLHRvZ2dsZVNlYXJjaE5vZGVBY3Rpb24uZXhlY3V0ZS5iaW5kKHRvZ2dsZVNlYXJjaE5vZGVBY3Rpb24pLHRoaXMpO30KSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuUmV2ZWFsU291cmNlTGluZSx0aGlzLl9yZXZlYWxTb3VyY2VMaW5lLHRoaXMpO1VJLmluc3BlY3RvclZpZXcuY3JlYXRlVG9vbGJhcnMoKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QubG9hZENvbXBsZXRlZCgpO2NvbnN0IGV4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoQ29tbW9uLlF1ZXJ5UGFyYW1IYW5kbGVyKTtmb3IoY29uc3QgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvbnMpe2NvbnN0IHZhbHVlPVJ1bnRpbWUucXVlcnlQYXJhbShleHRlbnNpb24uZGVzY3JpcHRvcigpWyduYW1lJ10pO2lmKHZhbHVlIT09bnVsbCkKZXh0ZW5zaW9uLmluc3RhbmNlKCkudGhlbihoYW5kbGVRdWVyeVBhcmFtLmJpbmQobnVsbCx2YWx1ZSkpO30KZnVuY3Rpb24gaGFuZGxlUXVlcnlQYXJhbSh2YWx1ZSxoYW5kbGVyKXtoYW5kbGVyLmhhbmRsZVF1ZXJ5UGFyYW0odmFsdWUpO30Kc2V0VGltZW91dCh0aGlzLl9pbml0aWFsaXplVGFyZ2V0LmJpbmQodGhpcyksMCk7TWFpbi5NYWluLnRpbWVFbmQoJ01haW4uX3Nob3dBcHBVSScpO30KYXN5bmMgX2luaXRpYWxpemVUYXJnZXQoKXtNYWluLk1haW4udGltZSgnTWFpbi5faW5pdGlhbGl6ZVRhcmdldCcpO2NvbnN0IGluc3RhbmNlcz1hd2FpdCBQcm9taXNlLmFsbChzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygnZWFybHktaW5pdGlhbGl6YXRpb24nKS5tYXAoZXh0ZW5zaW9uPT5leHRlbnNpb24uaW5zdGFuY2UoKSkpO2Zvcihjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpCihpbnN0YW5jZSkucnVuKCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnJlYWR5Rm9yVGVzdCgpO3NldFRpbWVvdXQodGhpcy5fbGF0ZUluaXRpYWxpemF0aW9uLmJpbmQodGhpcyksMTAwKTtNYWluLk1haW4udGltZUVuZCgnTWFpbi5faW5pdGlhbGl6ZVRhcmdldCcpO30KX2xhdGVJbml0aWFsaXphdGlvbigpe01haW4uTWFpbi50aW1lKCdNYWluLl9sYXRlSW5pdGlhbGl6YXRpb24nKTt0aGlzLl9yZWdpc3RlclNob3J0Y3V0cygpO0V4dGVuc2lvbnMuZXh0ZW5zaW9uU2VydmVyLmluaXRpYWxpemVFeHRlbnNpb25zKCk7aWYoIUhvc3QuaXNVbmRlclRlc3QoKSl7Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygnbGF0ZS1pbml0aWFsaXphdGlvbicpKQpleHRlbnNpb24uaW5zdGFuY2UoKS50aGVuKGluc3RhbmNlPT4oKGluc3RhbmNlKSkucnVuKCkpO30KTWFpbi5NYWluLnRpbWVFbmQoJ01haW4uX2xhdGVJbml0aWFsaXphdGlvbicpO30KX3JlZ2lzdGVyRm9yd2FyZGVkU2hvcnRjdXRzKCl7Y29uc3QgZm9yd2FyZGVkQWN0aW9ucz1bJ21haW4udG9nZ2xlLWRvY2snLCdkZWJ1Z2dlci50b2dnbGUtYnJlYWtwb2ludHMtYWN0aXZlJywnZGVidWdnZXIudG9nZ2xlLXBhdXNlJywnY29tbWFuZE1lbnUuc2hvdycsJ2NvbnNvbGUuc2hvdyddO2NvbnN0IGFjdGlvbktleXM9VUkuc2hvcnRjdXRSZWdpc3RyeS5rZXlzRm9yQWN0aW9ucyhmb3J3YXJkZWRBY3Rpb25zKS5tYXAoVUkuS2V5Ym9hcmRTaG9ydGN1dC5rZXlDb2RlQW5kTW9kaWZpZXJzRnJvbUtleSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNldFdoaXRlbGlzdGVkU2hvcnRjdXRzKEpTT04uc3RyaW5naWZ5KGFjdGlvbktleXMpKTt9Cl9yZWdpc3Rlck1lc3NhZ2VTaW5rTGlzdGVuZXIoKXtDb21tb24uY29uc29sZS5hZGRFdmVudExpc3RlbmVyKENvbW1vbi5Db25zb2xlLkV2ZW50cy5NZXNzYWdlQWRkZWQsbWVzc2FnZUFkZGVkKTtmdW5jdGlvbiBtZXNzYWdlQWRkZWQoZXZlbnQpe2NvbnN0IG1lc3NhZ2U9KGV2ZW50LmRhdGEpO2lmKG1lc3NhZ2Uuc2hvdykKQ29tbW9uLmNvbnNvbGUuc2hvdygpO319Cl9yZXZlYWxTb3VyY2VMaW5lKGV2ZW50KXtjb25zdCB1cmw9KGV2ZW50LmRhdGFbJ3VybCddKTtjb25zdCBsaW5lTnVtYmVyPShldmVudC5kYXRhWydsaW5lTnVtYmVyJ10pO2NvbnN0IGNvbHVtbk51bWJlcj0oZXZlbnQuZGF0YVsnY29sdW1uTnVtYmVyJ10pO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZUZvclVSTCh1cmwpO2lmKHVpU291cmNlQ29kZSl7Q29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcikpO3JldHVybjt9CmZ1bmN0aW9uIGxpc3RlbmVyKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO2lmKHVpU291cmNlQ29kZS51cmwoKT09PXVybCl7Q29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcikpO1dvcmtzcGFjZS53b3Jrc3BhY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVBZGRlZCxsaXN0ZW5lcik7fX0KV29ya3NwYWNlLndvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLGxpc3RlbmVyKTt9Cl9yZWdpc3RlclNob3J0Y3V0cygpe2NvbnN0IHNob3J0Y3V0PVVJLktleWJvYXJkU2hvcnRjdXQ7Y29uc3Qgc2VjdGlvbj1VSS5zaG9ydGN1dHNTY3JlZW4uc2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0FsbCBQYW5lbHMnKSk7bGV0IGtleXM9W3Nob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCdbJyxzaG9ydGN1dC5Nb2RpZmllcnMuQ3RybE9yTWV0YSksc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ10nLHNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsT3JNZXRhKV07c2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhrZXlzLENvbW1vbi5VSVN0cmluZygnR28gdG8gdGhlIHBhbmVsIHRvIHRoZSBsZWZ0L3JpZ2h0JykpO2NvbnN0IHRvZ2dsZUNvbnNvbGVMYWJlbD1Db21tb24uVUlTdHJpbmcoJ1Nob3cgY29uc29sZScpO3NlY3Rpb24uYWRkS2V5KHNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKHNob3J0Y3V0LktleXMuVGlsZGUsc2hvcnRjdXQuTW9kaWZpZXJzLkN0cmwpLHRvZ2dsZUNvbnNvbGVMYWJlbCk7c2VjdGlvbi5hZGRLZXkoc2hvcnRjdXQubWFrZURlc2NyaXB0b3Ioc2hvcnRjdXQuS2V5cy5Fc2MpLENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIGRyYXdlcicpKTtpZihDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLmNhbkRvY2soKSl7c2VjdGlvbi5hZGRLZXkoc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ00nLHNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsT3JNZXRhfHNob3J0Y3V0Lk1vZGlmaWVycy5TaGlmdCksQ29tbW9uLlVJU3RyaW5nKCdUb2dnbGUgZGV2aWNlIG1vZGUnKSk7c2VjdGlvbi5hZGRLZXkoc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ0QnLHNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsT3JNZXRhfHNob3J0Y3V0Lk1vZGlmaWVycy5TaGlmdCksQ29tbW9uLlVJU3RyaW5nKCdUb2dnbGUgZG9jayBzaWRlJykpO30Kc2VjdGlvbi5hZGRLZXkoc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ2YnLHNob3J0Y3V0Lk1vZGlmaWVycy5DdHJsT3JNZXRhKSxDb21tb24uVUlTdHJpbmcoJ1NlYXJjaCcpKTtjb25zdCBhZHZhbmNlZFNlYXJjaFNob3J0Y3V0TW9kaWZpZXI9SG9zdC5pc01hYygpP1VJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLk1ldGF8VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQWx0OlVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkN0cmx8VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuU2hpZnQ7Y29uc3QgYWR2YW5jZWRTZWFyY2hTaG9ydGN1dD1zaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignZicsYWR2YW5jZWRTZWFyY2hTaG9ydGN1dE1vZGlmaWVyKTtzZWN0aW9uLmFkZEtleShhZHZhbmNlZFNlYXJjaFNob3J0Y3V0LENvbW1vbi5VSVN0cmluZygnU2VhcmNoIGFjcm9zcyBhbGwgc291cmNlcycpKTtjb25zdCBpbnNwZWN0RWxlbWVudE1vZGVTaG9ydGN1dHM9VUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2gnKTtpZihpbnNwZWN0RWxlbWVudE1vZGVTaG9ydGN1dHMubGVuZ3RoKQpzZWN0aW9uLmFkZEtleShpbnNwZWN0RWxlbWVudE1vZGVTaG9ydGN1dHNbMF0sQ29tbW9uLlVJU3RyaW5nKCdTZWxlY3Qgbm9kZSB0byBpbnNwZWN0JykpO2NvbnN0IG9wZW5SZXNvdXJjZVNob3J0Y3V0PVVJLktleWJvYXJkU2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ3AnLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkN0cmxPck1ldGEpO3NlY3Rpb24uYWRkS2V5KG9wZW5SZXNvdXJjZVNob3J0Y3V0LENvbW1vbi5VSVN0cmluZygnR28gdG8gc291cmNlJykpO2lmKEhvc3QuaXNNYWMoKSl7a2V5cz1bc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ2cnLHNob3J0Y3V0Lk1vZGlmaWVycy5NZXRhKSxzaG9ydGN1dC5tYWtlRGVzY3JpcHRvcignZycsc2hvcnRjdXQuTW9kaWZpZXJzLk1ldGF8c2hvcnRjdXQuTW9kaWZpZXJzLlNoaWZ0KV07c2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhrZXlzLENvbW1vbi5VSVN0cmluZygnRmluZCBuZXh0L3ByZXZpb3VzJykpO319Cl9wb3N0RG9jdW1lbnRLZXlEb3duKGV2ZW50KXtpZighZXZlbnQuaGFuZGxlZCkKVUkuc2hvcnRjdXRSZWdpc3RyeS5oYW5kbGVTaG9ydGN1dChldmVudCk7fQpfcmVkaXNwYXRjaENsaXBib2FyZEV2ZW50KGV2ZW50KXtjb25zdCBldmVudENvcHk9bmV3IEN1c3RvbUV2ZW50KCdjbGlwYm9hcmQtJytldmVudC50eXBlLHtidWJibGVzOnRydWV9KTtldmVudENvcHlbJ29yaWdpbmFsJ109ZXZlbnQ7Y29uc3QgZG9jdW1lbnQ9ZXZlbnQudGFyZ2V0JiZldmVudC50YXJnZXQub3duZXJEb2N1bWVudDtjb25zdCB0YXJnZXQ9ZG9jdW1lbnQ/ZG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTpudWxsO2lmKHRhcmdldCkKdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnRDb3B5KTtpZihldmVudENvcHkuaGFuZGxlZCkKZXZlbnQucHJldmVudERlZmF1bHQoKTt9Cl9jb250ZXh0TWVudUV2ZW50RmlyZWQoZXZlbnQpe2lmKGV2ZW50LmhhbmRsZWR8fGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3BvcHVwLWdsYXNzcGFuZScpKQpldmVudC5wcmV2ZW50RGVmYXVsdCgpO30KX2FkZE1haW5FdmVudExpc3RlbmVycyhkb2N1bWVudCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fcG9zdERvY3VtZW50S2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVjb3B5Jyx0aGlzLl9yZWRpc3BhdGNoQ2xpcGJvYXJkRXZlbnQuYmluZCh0aGlzKSx0cnVlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjb3B5Jyx0aGlzLl9yZWRpc3BhdGNoQ2xpcGJvYXJkRXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY3V0Jyx0aGlzLl9yZWRpc3BhdGNoQ2xpcGJvYXJkRXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLHRoaXMuX3JlZGlzcGF0Y2hDbGlwYm9hcmRFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnVFdmVudEZpcmVkLmJpbmQodGhpcyksdHJ1ZSk7fQpfb25TdXNwZW5kU3RhdGVDaGFuZ2VkKCl7Y29uc3Qgc3VzcGVuZGVkPVNESy50YXJnZXRNYW5hZ2VyLmFsbFRhcmdldHNTdXNwZW5kZWQoKTtVSS5pbnNwZWN0b3JWaWV3Lm9uU3VzcGVuZFN0YXRlQ2hhbmdlZChzdXNwZW5kZWQpO319O01haW4uTWFpbi5ab29tQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2lmKEluc3BlY3RvckZyb250ZW5kSG9zdC5pc0hvc3RlZE1vZGUoKSkKcmV0dXJuIGZhbHNlO3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdtYWluLnpvb20taW4nOkluc3BlY3RvckZyb250ZW5kSG9zdC56b29tSW4oKTtyZXR1cm4gdHJ1ZTtjYXNlJ21haW4uem9vbS1vdXQnOkluc3BlY3RvckZyb250ZW5kSG9zdC56b29tT3V0KCk7cmV0dXJuIHRydWU7Y2FzZSdtYWluLnpvb20tcmVzZXQnOkluc3BlY3RvckZyb250ZW5kSG9zdC5yZXNldFpvb20oKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtNYWluLk1haW4uU2VhcmNoQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2NvbnN0IHNlYXJjaGFibGVWaWV3PVVJLlNlYXJjaGFibGVWaWV3LmZyb21FbGVtZW50KGRvY3VtZW50LmRlZXBBY3RpdmVFbGVtZW50KCkpfHxVSS5pbnNwZWN0b3JWaWV3LmN1cnJlbnRQYW5lbERlcHJlY2F0ZWQoKS5zZWFyY2hhYmxlVmlldygpO2lmKCFzZWFyY2hhYmxlVmlldykKcmV0dXJuIGZhbHNlO3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdtYWluLnNlYXJjaC1pbi1wYW5lbC5maW5kJzpyZXR1cm4gc2VhcmNoYWJsZVZpZXcuaGFuZGxlRmluZFNob3J0Y3V0KCk7Y2FzZSdtYWluLnNlYXJjaC1pbi1wYW5lbC5jYW5jZWwnOnJldHVybiBzZWFyY2hhYmxlVmlldy5oYW5kbGVDYW5jZWxTZWFyY2hTaG9ydGN1dCgpO2Nhc2UnbWFpbi5zZWFyY2gtaW4tcGFuZWwuZmluZC1uZXh0JzpyZXR1cm4gc2VhcmNoYWJsZVZpZXcuaGFuZGxlRmluZE5leHRTaG9ydGN1dCgpO2Nhc2UnbWFpbi5zZWFyY2gtaW4tcGFuZWwuZmluZC1wcmV2aW91cyc6cmV0dXJuIHNlYXJjaGFibGVWaWV3LmhhbmRsZUZpbmRQcmV2aW91c1Nob3J0Y3V0KCk7fQpyZXR1cm4gZmFsc2U7fX07TWFpbi5NYWluLk1haW5NZW51SXRlbT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2l0ZW09bmV3IFVJLlRvb2xiYXJNZW51QnV0dG9uKHRoaXMuX2hhbmRsZUNvbnRleHRNZW51LmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5faXRlbS5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ0N1c3RvbWl6ZSBhbmQgY29udHJvbCBEZXZUb29scycpKTt9Cml0ZW0oKXtyZXR1cm4gdGhpcy5faXRlbTt9Cl9oYW5kbGVDb250ZXh0TWVudShjb250ZXh0TWVudSl7aWYoQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5jYW5Eb2NrKCkpe2NvbnN0IGRvY2tJdGVtRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdmbGV4LWNlbnRlcmVkIGZsZXgtYXV0bycpO2NvbnN0IHRpdGxlRWxlbWVudD1kb2NrSXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdmbGV4LWF1dG8nKTt0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdEb2NrIHNpZGUnKTtjb25zdCB0b2dnbGVEb2NrU2lkZVNob3JjdXRzPVVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignbWFpbi50b2dnbGUtZG9jaycpO3RpdGxlRWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ1BsYWNlbWVudCBvZiBEZXZUb29scyByZWxhdGl2ZSB0byB0aGUgcGFnZS4gKCVzIHRvIHJlc3RvcmUgbGFzdCBwb3NpdGlvbiknLHRvZ2dsZURvY2tTaWRlU2hvcmN1dHNbMF0ubmFtZSk7ZG9ja0l0ZW1FbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7Y29uc3QgZG9ja0l0ZW1Ub29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLGRvY2tJdGVtRWxlbWVudCk7ZG9ja0l0ZW1Ub29sYmFyLm1ha2VCbHVlT25Ib3ZlcigpO2NvbnN0IHVuZG9jaz1uZXcgVUkuVG9vbGJhclRvZ2dsZShDb21tb24uVUlTdHJpbmcoJ1VuZG9jayBpbnRvIHNlcGFyYXRlIHdpbmRvdycpLCdsYXJnZWljb24tdW5kb2NrJyk7Y29uc3QgYm90dG9tPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKENvbW1vbi5VSVN0cmluZygnRG9jayB0byBib3R0b20nKSwnbGFyZ2VpY29uLWRvY2stdG8tYm90dG9tJyk7Y29uc3QgcmlnaHQ9bmV3IFVJLlRvb2xiYXJUb2dnbGUoQ29tbW9uLlVJU3RyaW5nKCdEb2NrIHRvIHJpZ2h0JyksJ2xhcmdlaWNvbi1kb2NrLXRvLXJpZ2h0Jyk7Y29uc3QgbGVmdD1uZXcgVUkuVG9vbGJhclRvZ2dsZShDb21tb24uVUlTdHJpbmcoJ0RvY2sgdG8gbGVmdCcpLCdsYXJnZWljb24tZG9jay10by1sZWZ0Jyk7dW5kb2NrLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuTW91c2VEb3duLGV2ZW50PT5ldmVudC5kYXRhLmNvbnN1bWUoKSk7Ym90dG9tLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuTW91c2VEb3duLGV2ZW50PT5ldmVudC5kYXRhLmNvbnN1bWUoKSk7cmlnaHQuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5Nb3VzZURvd24sZXZlbnQ9PmV2ZW50LmRhdGEuY29uc3VtZSgpKTtsZWZ0LmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuTW91c2VEb3duLGV2ZW50PT5ldmVudC5kYXRhLmNvbnN1bWUoKSk7dW5kb2NrLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuTW91c2VVcCxzZXREb2NrU2lkZS5iaW5kKG51bGwsQ29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5VbmRvY2tlZCkpO2JvdHRvbS5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLk1vdXNlVXAsc2V0RG9ja1NpZGUuYmluZChudWxsLENvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9Cb3R0b20pKTtyaWdodC5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLk1vdXNlVXAsc2V0RG9ja1NpZGUuYmluZChudWxsLENvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9SaWdodCkpO2xlZnQuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5Nb3VzZVVwLHNldERvY2tTaWRlLmJpbmQobnVsbCxDb21wb25lbnRzLkRvY2tDb250cm9sbGVyLlN0YXRlLkRvY2tlZFRvTGVmdCkpO3VuZG9jay5zZXRUb2dnbGVkKENvbXBvbmVudHMuZG9ja0NvbnRyb2xsZXIuZG9ja1NpZGUoKT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuVW5kb2NrZWQpO2JvdHRvbS5zZXRUb2dnbGVkKENvbXBvbmVudHMuZG9ja0NvbnRyb2xsZXIuZG9ja1NpZGUoKT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuRG9ja2VkVG9Cb3R0b20pO3JpZ2h0LnNldFRvZ2dsZWQoQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5kb2NrU2lkZSgpPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb1JpZ2h0KTtsZWZ0LnNldFRvZ2dsZWQoQ29tcG9uZW50cy5kb2NrQ29udHJvbGxlci5kb2NrU2lkZSgpPT09Q29tcG9uZW50cy5Eb2NrQ29udHJvbGxlci5TdGF0ZS5Eb2NrZWRUb0xlZnQpO2RvY2tJdGVtVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh1bmRvY2spO2RvY2tJdGVtVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShsZWZ0KTtkb2NrSXRlbVRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oYm90dG9tKTtkb2NrSXRlbVRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0ocmlnaHQpO2NvbnRleHRNZW51LmhlYWRlclNlY3Rpb24oKS5hcHBlbmRDdXN0b21JdGVtKGRvY2tJdGVtRWxlbWVudCk7fQpmdW5jdGlvbiBzZXREb2NrU2lkZShzaWRlKXtDb21wb25lbnRzLmRvY2tDb250cm9sbGVyLnNldERvY2tTaWRlKHNpZGUpO2NvbnRleHRNZW51LmRpc2NhcmQoKTt9CmlmKENvbXBvbmVudHMuZG9ja0NvbnRyb2xsZXIuZG9ja1NpZGUoKT09PUNvbXBvbmVudHMuRG9ja0NvbnRyb2xsZXIuU3RhdGUuVW5kb2NrZWQmJlNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKSYmU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmhhc0Jyb3dzZXJDYXBhYmlsaXR5KCkpCmNvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQWN0aW9uKCdpbnNwZWN0b3JfbWFpbi5mb2N1cy1kZWJ1Z2dlZScsQ29tbW9uLlVJU3RyaW5nKCdGb2N1cyBkZWJ1Z2dlZScpKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEFjdGlvbignbWFpbi50b2dnbGUtZHJhd2VyJyxVSS5pbnNwZWN0b3JWaWV3LmRyYXdlclZpc2libGUoKT9Db21tb24uVUlTdHJpbmcoJ0hpZGUgY29uc29sZSBkcmF3ZXInKTpDb21tb24uVUlTdHJpbmcoJ1Nob3cgY29uc29sZSBkcmF3ZXInKSk7Y29udGV4dE1lbnUuYXBwZW5kSXRlbXNBdExvY2F0aW9uKCdtYWluTWVudScpO2NvbnN0IG1vcmVUb29scz1jb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnTW9yZSB0b29scycpKTtjb25zdCBleHRlbnNpb25zPXNlbGYucnVudGltZS5leHRlbnNpb25zKCd2aWV3Jyx1bmRlZmluZWQsdHJ1ZSk7Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBleHRlbnNpb25zKXtjb25zdCBkZXNjcmlwdG9yPWV4dGVuc2lvbi5kZXNjcmlwdG9yKCk7aWYoZGVzY3JpcHRvclsncGVyc2lzdGVuY2UnXSE9PSdjbG9zZWFibGUnKQpjb250aW51ZTtpZihkZXNjcmlwdG9yWydsb2NhdGlvbiddIT09J2RyYXdlci12aWV3JyYmZGVzY3JpcHRvclsnbG9jYXRpb24nXSE9PSdwYW5lbCcpCmNvbnRpbnVlO21vcmVUb29scy5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oZXh0ZW5zaW9uLnRpdGxlKCksVUkudmlld01hbmFnZXIuc2hvd1ZpZXcuYmluZChVSS52aWV3TWFuYWdlcixkZXNjcmlwdG9yWydpZCddKSk7fQpjb25zdCBoZWxwU3ViTWVudT1jb250ZXh0TWVudS5mb290ZXJTZWN0aW9uKCkuYXBwZW5kU3ViTWVudUl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdIZWxwJykpO2hlbHBTdWJNZW51LmFwcGVuZEl0ZW1zQXRMb2NhdGlvbignbWFpbk1lbnVIZWxwJyk7fX07TWFpbi5NYWluLlBhdXNlTGlzdGVuZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclBhdXNlZCx0aGlzLl9kZWJ1Z2dlclBhdXNlZCx0aGlzKTt9Cl9kZWJ1Z2dlclBhdXNlZChldmVudCl7U0RLLnRhcmdldE1hbmFnZXIucmVtb3ZlTW9kZWxMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbCxTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuRGVidWdnZXJQYXVzZWQsdGhpcy5fZGVidWdnZXJQYXVzZWQsdGhpcyk7Y29uc3QgZGVidWdnZXJNb2RlbD0oZXZlbnQuZGF0YSk7Y29uc3QgZGVidWdnZXJQYXVzZWREZXRhaWxzPWRlYnVnZ2VyTW9kZWwuZGVidWdnZXJQYXVzZWREZXRhaWxzKCk7VUkuY29udGV4dC5zZXRGbGF2b3IoU0RLLlRhcmdldCxkZWJ1Z2dlck1vZGVsLnRhcmdldCgpKTtDb21tb24uUmV2ZWFsZXIucmV2ZWFsKGRlYnVnZ2VyUGF1c2VkRGV0YWlscyk7fX07TWFpbi5zZW5kT3ZlclByb3RvY29sPWZ1bmN0aW9uKG1ldGhvZCxwYXJhbXMpe3JldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57UHJvdG9jb2wuSW5zcGVjdG9yQmFja2VuZC5zZW5kUmF3TWVzc2FnZUZvclRlc3RpbmcobWV0aG9kLHBhcmFtcywoZXJyLC4uLnJlc3VsdHMpPT57aWYoZXJyKQpyZXR1cm4gcmVqZWN0KGVycik7cmV0dXJuIHJlc29sdmUocmVzdWx0cyk7fSk7fSk7fTtNYWluLlJlbG9hZEFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtzd2l0Y2goYWN0aW9uSWQpe2Nhc2UnbWFpbi5kZWJ1Zy1yZWxvYWQnOkNvbXBvbmVudHMucmVsb2FkKCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fX07bmV3IE1haW4uTWFpbigpOztzZWxmWydDb25zb2xlQ291bnRlcnMnXT1zZWxmWydDb25zb2xlQ291bnRlcnMnXXx8e307Q29uc29sZUNvdW50ZXJzLldhcm5pbmdFcnJvckNvdW50ZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtDb25zb2xlQ291bnRlcnMuV2FybmluZ0Vycm9yQ291bnRlci5faW5zdGFuY2VGb3JUZXN0PXRoaXM7dGhpcy5fY291bnRlcj1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLl9jb3VudGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxDb21tb24uY29uc29sZS5zaG93LmJpbmQoQ29tbW9uLmNvbnNvbGUpLGZhbHNlKTt0aGlzLl90b29sYmFySXRlbT1uZXcgVUkuVG9vbGJhckl0ZW0odGhpcy5fY291bnRlcik7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcy5fY291bnRlciwnY29uc29sZV9jb3VudGVycy9lcnJvcldhcm5pbmdDb3VudGVyLmNzcycpO3RoaXMuX2Vycm9ycz10aGlzLl9jcmVhdGVJdGVtKHNoYWRvd1Jvb3QsJ3NtYWxsaWNvbi1lcnJvcicpO3RoaXMuX3dhcm5pbmdzPXRoaXMuX2NyZWF0ZUl0ZW0oc2hhZG93Um9vdCwnc21hbGxpY29uLXdhcm5pbmcnKTt0aGlzLl90aXRsZXM9W107dGhpcy5fZXJyb3JDb3VudD0tMTt0aGlzLl93YXJuaW5nQ291bnQ9LTE7dGhpcy5fdGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDEwMCk7U0RLLmNvbnNvbGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLkNvbnNvbGVDbGVhcmVkLHRoaXMuX3VwZGF0ZSx0aGlzKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLHRoaXMuX3VwZGF0ZSx0aGlzKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZVVwZGF0ZWQsdGhpcy5fdXBkYXRlLHRoaXMpO3RoaXMuX3VwZGF0ZSgpO30KX3VwZGF0ZWRGb3JUZXN0KCl7fQpfY3JlYXRlSXRlbShzaGFkb3dSb290LGljb25UeXBlKXtjb25zdCBpdGVtPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdjb3VudGVyLWl0ZW0nKTtjb25zdCBpY29uPWl0ZW0uY3JlYXRlQ2hpbGQoJ2xhYmVsJywnJywnZHQtaWNvbi1sYWJlbCcpO2ljb24udHlwZT1pY29uVHlwZTtjb25zdCB0ZXh0PWljb24uY3JlYXRlQ2hpbGQoJ3NwYW4nKTtzaGFkb3dSb290LmFwcGVuZENoaWxkKGl0ZW0pO3JldHVybntpdGVtOml0ZW0sdGV4dDp0ZXh0fTt9Cl91cGRhdGVJdGVtKGl0ZW0sY291bnQsZmlyc3QsdGl0bGUpe2l0ZW0uaXRlbS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFjb3VudCk7aXRlbS5pdGVtLmNsYXNzTGlzdC50b2dnbGUoJ2NvdW50ZXItaXRlbS1maXJzdCcsZmlyc3QpO2l0ZW0udGV4dC50ZXh0Q29udGVudD1jb3VudDtpZihjb3VudCkKdGhpcy5fdGl0bGVzLnB1c2godGl0bGUpO30KX3VwZGF0ZSgpe3RoaXMuX3VwZGF0aW5nRm9yVGVzdD10cnVlO3RoaXMuX3Rocm90dGxlci5zY2hlZHVsZSh0aGlzLl91cGRhdGVUaHJvdHRsZWQuYmluZCh0aGlzKSk7fQpfdXBkYXRlVGhyb3R0bGVkKCl7Y29uc3QgZXJyb3JzPVNESy5jb25zb2xlTW9kZWwuZXJyb3JzKCk7Y29uc3Qgd2FybmluZ3M9U0RLLmNvbnNvbGVNb2RlbC53YXJuaW5ncygpO2lmKGVycm9ycz09PXRoaXMuX2Vycm9yQ291bnQmJndhcm5pbmdzPT09dGhpcy5fd2FybmluZ0NvdW50KQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dGhpcy5fZXJyb3JDb3VudD1lcnJvcnM7dGhpcy5fd2FybmluZ0NvdW50PXdhcm5pbmdzO3RoaXMuX3RpdGxlcz1bXTt0aGlzLl90b29sYmFySXRlbS5zZXRWaXNpYmxlKCEhKGVycm9yc3x8d2FybmluZ3MpKTt0aGlzLl91cGRhdGVJdGVtKHRoaXMuX2Vycm9ycyxlcnJvcnMsZmFsc2UsQ29tbW9uLlVJU3RyaW5nKGVycm9ycz09PTE/JyVkIGVycm9yJzonJWQgZXJyb3JzJyxlcnJvcnMpKTt0aGlzLl91cGRhdGVJdGVtKHRoaXMuX3dhcm5pbmdzLHdhcm5pbmdzLCFlcnJvcnMsQ29tbW9uLlVJU3RyaW5nKHdhcm5pbmdzPT09MT8nJWQgd2FybmluZyc6JyVkIHdhcm5pbmdzJyx3YXJuaW5ncykpO3RoaXMuX2NvdW50ZXIudGl0bGU9dGhpcy5fdGl0bGVzLmpvaW4oJywgJyk7VUkuaW5zcGVjdG9yVmlldy50b29sYmFySXRlbVJlc2l6ZWQoKTt0aGlzLl91cGRhdGluZ0ZvclRlc3Q9ZmFsc2U7dGhpcy5fdXBkYXRlZEZvclRlc3QoKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQppdGVtKCl7cmV0dXJuIHRoaXMuX3Rvb2xiYXJJdGVtO319Ozs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2NoZWNrYm94VGV4dExhYmVsLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xufVxuXG5pbnB1dCB7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIHdpZHRoOiAxMnB4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG5pbnB1dDpmb2N1cyB7XG4gICAgb3V0bGluZTogYXV0byA1cHggLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO1xufVxuXG5pbnB1dC5kdC1jaGVja2JveC10aGVtZWQge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBtYXJnaW46IGF1dG8gNXB4IGF1dG8gMnB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYig0NSwgNDUsIDQ1KTtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMiwgMTAyLCAxMDIpO1xufVxuXG5pbnB1dC5kdC1jaGVja2JveC10aGVtZWQ6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG59XG5cbmlucHV0LmR0LWNoZWNrYm94LXRoZW1lZDpjaGVja2VkOmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xufVxuXG5pbnB1dC5kdC1jaGVja2JveC10aGVtZWQ6YWZ0ZXIge1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9jaGVja2JveENoZWNrbWFyay5wbmcpO1xuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMXB4IDExcHg7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAwIDA7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgaW5wdXQ6bm90KC5kdC1jaGVja2JveC10aGVtZWQpIHtcbiAgICBmaWx0ZXI6IGludmVydCg4MCUpO1xufVxuXG5AbWVkaWEgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMS4xKSB7XG5pbnB1dC5kdC1jaGVja2JveC10aGVtZWQ6YWZ0ZXIge1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9jaGVja2JveENoZWNrbWFya18yeC5wbmcpO1xufVxuXG59IC8qIG1lZGlhICovXG5cbi5kdC1jaGVja2JveC10ZXh0IHtcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5kdC1jaGVja2JveC1zdWJ0aXRsZSB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvY2hlY2tib3hUZXh0TGFiZWwuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvY2xvc2VCdXR0b24uY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5jbG9zZS1idXR0b24ge1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uaG92ZXItaWNvbiwgLmFjdGl2ZS1pY29uIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uY2xvc2UtYnV0dG9uOmhvdmVyIC5kZWZhdWx0LWljb24sIC5jbG9zZS1idXR0b246YWN0aXZlIC5kZWZhdWx0LWljb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jbG9zZS1idXR0b246aG92ZXIgLmhvdmVyLWljb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uY2xvc2UtYnV0dG9uOmFjdGl2ZSAuaG92ZXItaWNvbiB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uY2xvc2UtYnV0dG9uOmFjdGl2ZSAuYWN0aXZlLWljb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2Nsb3NlQnV0dG9uLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2NvbmZpcm1EaWFsb2cuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi53aWRnZXQge1xuICAgIHBhZGRpbmc6IDIwcHg7XG59XG5cbi5tZXNzYWdlLCAuYnV0dG9uIHtcbiAgICBmb250LXNpemU6IGxhcmdlcjtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIG1hcmdpbjogNXB4O1xufVxuXG4uYnV0dG9uIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLmJ1dHRvbiBidXR0b24ge1xuICAgIG1pbi13aWR0aDogODBweDtcbn1cblxuLnJlYXNvbiB7XG4gICAgY29sb3I6ICM4YjAwMDA7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvY29uZmlybURpYWxvZy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9kaWFsb2cuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi53aWRnZXQge1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWRyb3Atc2hhZG93KTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmRpYWxvZy1jbG9zZS1idXR0b24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogOXB4O1xuICAgIHRvcDogOXB4O1xuICAgIHotaW5kZXg6IDE7XG59XG4vKiMgc291cmNlVVJMPXVpL2RpYWxvZy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9kcm9wVGFyZ2V0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTtcbiAgICB6LWluZGV4OiAxMDAwO1xufVxuXG4uZHJvcC10YXJnZXQtbWVzc2FnZSB7XG4gICAgZmxleDogYXV0bztcbiAgICBmb250LXNpemU6IDMwcHg7XG4gICAgY29sb3I6ICM5OTk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbjogMjBweDtcbiAgICBib3JkZXI6IDRweCBkYXNoZWQgI2RkZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9kcm9wVGFyZ2V0LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2VtcHR5V2lkZ2V0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uZW1wdHktdmlldyB7XG4gICAgY29sb3I6IGhzbGEoMCwgMCUsIDY1JSwgMSk7XG4gICAgcGFkZGluZzogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBtaW4td2lkdGg6IDcwcHg7XG59XG5cbi5lbXB0eS12aWV3LXNjcm9sbGVyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLmVtcHR5LXZpZXcgcCB7XG4gICAgd2hpdGUtc3BhY2U6IGluaXRpYWw7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgbWF4LXdpZHRoOiAzMDBweDtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9lbXB0eVdpZGdldC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9maWx0ZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuICogZGlzdHJpYnV0aW9uLlxuICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5maWx0ZXItYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBmbGV4OiBub25lO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLmZpbHRlci10ZXh0LWZpbHRlciB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgbWFyZ2luLWxlZnQ6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmZpbHRlci10ZXh0LWZpbHRlciBsYWJlbCB7XG4gICAgbWFyZ2luOiBhdXRvIDA7XG59XG5cbi5maWx0ZXItYml0c2V0LWZpbHRlciB7XG4gICAgcGFkZGluZzogMnB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5maWx0ZXItYml0c2V0LWZpbHRlciBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXJnaW46IGF1dG8gMnB4O1xuICAgIHBhZGRpbmc6IDNweDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LXNoYWRvdzogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIDAgMXB4IDA7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5maWx0ZXItYml0c2V0LWZpbHRlci1kaXZpZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xuICAgIGhlaWdodDogMTZweDtcbiAgICB3aWR0aDogMXB4O1xuICAgIG1hcmdpbjogYXV0byAycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZmlsdGVyLWJpdHNldC1maWx0ZXIgc3Bhbi5zZWxlY3RlZCxcbi5maWx0ZXItYml0c2V0LWZpbHRlciBzcGFuOmhvdmVyLFxuLmZpbHRlci1iaXRzZXQtZmlsdGVyIHNwYW46YWN0aXZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgdGV4dC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC40KSAwIDFweCAwO1xufVxuXG4uZmlsdGVyLWJpdHNldC1maWx0ZXIgc3Bhbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xufVxuXG4uZmlsdGVyLWJpdHNldC1maWx0ZXIgc3Bhbi5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpO1xufVxuXG4uZmlsdGVyLWJpdHNldC1maWx0ZXIgc3BhbjphY3RpdmUge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuLmZpbHRlci1jb21ib2JveC1maWx0ZXIge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZmlsdGVyLWNoZWNrYm94LWZpbHRlciB7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgcGFkZGluZy1yaWdodDogMnB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIGhlaWdodDogMjRweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5maWx0ZXItY2hlY2tib3gtZmlsdGVyID4gbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luOiBhdXRvIDA7XG59XG5cbi5maWx0ZXItY2hlY2tib3gtZmlsdGVyIC5jaGVja2JveC1maWx0ZXItY2hlY2tib3gge1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBtYXJnaW46IGF1dG8gM3B4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJvcmRlcjogc29saWQgMXB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBvcGFjaXR5OiAwLjg7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5maWx0ZXItaW5wdXQtZmllbGQge1xuICAgIG1hcmdpbjogMCAzcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAzcHg7XG4gICAgd2lkdGg6IDE2M3B4O1xuICAgIGhlaWdodDogMThweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYmFja2dyb3VuZDogI0ZGRjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgY3Vyc29yOiBhdXRvO1xufVxuXG4uZmlsdGVyLWlucHV0LWZpZWxkOmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWluYWN0aXZlLXNoYWRvdyk7XG59XG5cbi5maWx0ZXItaW5wdXQtZmllbGQ6Zm9jdXMsXG4uZmlsdGVyLWlucHV0LWZpZWxkOm5vdCg6ZW1wdHkpIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWFjdGl2ZS1zaGFkb3cpO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2ZpbHRlci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9nbGFzc1BhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGNvbnRhaW46IHN0cmljdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuOmhvc3QtY29udGV4dCguZGltbWVkLXBhbmUpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG59XG5cbjpob3N0LWNvbnRleHQoLm5vLXBvaW50ZXItZXZlbnRzKSB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi53aWRnZXQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgZmxleDogbm9uZTtcbn1cblxuLm5vLXBvaW50ZXItZXZlbnRzIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFycm93LXRvcCB7XG4gICAgbWFyZ2luLXRvcDogLTE5cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC05cHg7XG59XG5cbi5hcnJvdy1ib3R0b20ge1xuICAgIG1hcmdpbi1sZWZ0OiAtOXB4O1xufVxuXG4uYXJyb3ctbGVmdCB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xOXB4O1xuICAgIG1hcmdpbi10b3A6IC05cHg7XG59XG5cbi5hcnJvdy1yaWdodCB7XG4gICAgbWFyZ2luLXRvcDogLTlweDtcbn1cblxuLmFycm93LW5vbmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLmFycm93IHtcbiAgICAtd2Via2l0LWZpbHRlcjogaW52ZXJ0KDgwJSk7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvZ2xhc3NQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2luZm9iYXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmluZm9iYXIge1xuICAgIGNvbG9yOiByZ2IoMzQsIDM0LCAzNCk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTcxLCAxNzEsIDE3MSk7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5pbmZvYmFyLXdhcm5pbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTMsIDI0MiwgMTkyKTtcbn1cblxuLmluZm9iYXItaW5mbyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xufVxuXG4uaW5mb2Jhci1tYWluLXJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG4gICAgbWluLWhlaWdodDogMjVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBhZGRpbmctbGVmdDogNHB4O1xufVxuXG4uaW5mb2Jhci1tYWluLXJvdyA+ICoge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgcGFkZGluZzogMCAzcHg7XG59XG5cbi5pbmZvYmFyLW1haW4tdGl0bGUge1xuICAgIGZsZXg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLmluZm9iYXItZGV0YWlscy1yb3dzIHtcbiAgICBwYWRkaW5nOiA1cHggNXB4IDAgNXB4O1xufVxuXG4uaW5mb2Jhci1kZXRhaWxzLXJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiA2cHg7XG59XG5cbi5jbG9zZS1idXR0b24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDVweDtcbiAgICByaWdodDogNnB4O1xufVxuXG4uaW5mb2Jhci10b2dnbGUge1xuICAgIGNvbG9yOiBoc2woMjE0LCA5MiUsIDUwJSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uaW5mb2Jhci10b2dnbGU6aG92ZXIge1xuICAgIGNvbG9yOiBoc2woMjE0LCA5MiUsIDMwJSk7XG59XG5cbi5pbmZvLWljb24ge1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9pY19pbmZvX2JsYWNrXzE4ZHAuc3ZnKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjE0LCA5MiUsIDUwJSk7XG59XG5cbi53YXJuaW5nLWljb24ge1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9pY193YXJuaW5nX2JsYWNrXzE4ZHAuc3ZnKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woNDQsIDkyJSwgNTAlKTtcbn1cblxuLmljb24ge1xuICAgIC13ZWJraXQtbWFzay1zaXplOiAxOHB4IDE4cHg7XG4gICAgd2lkdGg6IDE4cHg7XG4gICAgaGVpZ2h0OiAxOXB4O1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2luZm9iYXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvaW5saW5lQnV0dG9uLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogN3B4O1xuICBtYXJnaW46IDJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG59XG5cbjpob3N0ID4gKiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogLTJweDtcbiAgd2lkdGg6IDI4cHg7XG4gIGhlaWdodDogMjZweDtcbn1cbi8qIyBzb3VyY2VVUkw9dWkvaW5saW5lQnV0dG9uLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2luc3BlY3RvckNvbW1vbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4qIHtcbiAgICAvKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IHNpemluZyBvZiBmbGV4IGl0ZW1zIGJlY2F1c2Ugd2UgcmVseVxuICAgICAqIG9uIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBmbGV4Ym94IHNwZWMuXG4gICAgICogTG9uZ2VyLXRlcm0gd2Ugc2hvdWxkIHJlbW92ZSB0aGlzLCBzZWUgY3JidWcuY29tLzQ3MzYyNSAqL1xuICAgIG1pbi13aWR0aDogMDtcbiAgICBtaW4taGVpZ2h0OiAwO1xufVxuXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIC5tb25vc3BhY2UsXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIC5zb3VyY2UtY29kZSxcbi5wbGF0Zm9ybS1tYWMgLm1vbm9zcGFjZSxcbi5wbGF0Zm9ybS1tYWMgLnNvdXJjZS1jb2RlIHtcbiAgICBmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogTWVubG8sIG1vbm9zcGFjZTtcbn1cblxuOmhvc3QtY29udGV4dCgucGxhdGZvcm0td2luZG93cykgLm1vbm9zcGFjZSxcbjpob3N0LWNvbnRleHQoLnBsYXRmb3JtLXdpbmRvd3MpIC5zb3VyY2UtY29kZSxcbi5wbGF0Zm9ybS13aW5kb3dzIC5tb25vc3BhY2UsXG4ucGxhdGZvcm0td2luZG93cyAuc291cmNlLWNvZGUge1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTHVjaWRhIENvbnNvbGUsIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7XG59XG5cbjpob3N0LWNvbnRleHQoLnBsYXRmb3JtLWxpbnV4KSAubW9ub3NwYWNlLFxuOmhvc3QtY29udGV4dCgucGxhdGZvcm0tbGludXgpIC5zb3VyY2UtY29kZSxcbi5wbGF0Zm9ybS1saW51eCAubW9ub3NwYWNlLFxuLnBsYXRmb3JtLWxpbnV4IC5zb3VyY2UtY29kZSB7XG4gICAgZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGRlamF2dSBzYW5zIG1vbm8sIG1vbm9zcGFjZTtcbn1cblxuLnNvdXJjZS1jb2RlIHtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuKiB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuOmZvY3VzIHtcbiAgICBvdXRsaW5lLXdpZHRoOiAwO1xufVxuXG5pbWcge1xuICAgIC13ZWJraXQtdXNlci1kcmFnOiBub25lO1xufVxuXG5pZnJhbWUsXG5hIGltZyB7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uZmlsbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbn1cblxuaWZyYW1lLmZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLndpZGdldCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGZsZXg6IGF1dG87XG4gICAgY29udGFpbjogc3R5bGU7XG59XG5cbi5oYm94IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi52Ym94IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi52aWV3LWNvbnRhaW5lciA+IC50b29sYmFyIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcbn1cblxuLmZsZXgtYXV0byB7XG4gICAgZmxleDogYXV0bztcbn1cblxuLmZsZXgtYXV0by1pbXBvcnRhbnQge1xuICAgIGZsZXg6IGF1dG8gIWltcG9ydGFudDtcbn1cblxuLmZsZXgtbm9uZSB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmZsZXgtY2VudGVyZWQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLm92ZXJmbG93LWF1dG8ge1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG5pZnJhbWUud2lkZ2V0IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbn1cblxuLmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubW9ub3NwYWNlIHtcbiAgICBmb250LXNpemU6IDEwcHggIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xufVxuXG4uaGlnaGxpZ2h0ZWQtc2VhcmNoLXJlc3VsdCB7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHBhZGRpbmc6IDFweDtcbiAgICBtYXJnaW46IC0xcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMCwgMC44KTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuaGlnaGxpZ2h0ZWQtc2VhcmNoLXJlc3VsdCxcbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLmhpZ2hsaWdodGVkLXNlYXJjaC1yZXN1bHQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgxMzMsIDEwMCUsIDMwJSk7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgY29sb3I6IHJnYigxNywgODUsIDIwNCk7XG59XG5cbmJ1dHRvbixcbmlucHV0LFxuc2VsZWN0IHtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbmlucHV0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Om5vdCguLXRoZW1lLXByZXNlcnZlKSB7XG4gICAgLXdlYmtpdC1maWx0ZXI6IGludmVydCg4MCUpO1xufVxuXG4uaGFybW9ueS1pbnB1dDpub3QoW3R5cGVdKSxcbi5oYXJtb255LWlucHV0W3R5cGU9bnVtYmVyXSxcbi5oYXJtb255LWlucHV0W3R5cGU9dGV4dF0ge1xuICAgIHBhZGRpbmc6IDNweCA2cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuLmhhcm1vbnktaW5wdXQ6bm90KFt0eXBlXSk6bm90KC5lcnJvci1pbnB1dCk6bm90KDppbnZhbGlkKTpob3Zlcixcbi5oYXJtb255LWlucHV0W3R5cGU9bnVtYmVyXTpub3QoLmVycm9yLWlucHV0KTpub3QoOmludmFsaWQpOmhvdmVyLFxuLmhhcm1vbnktaW5wdXRbdHlwZT10ZXh0XTpub3QoLmVycm9yLWlucHV0KTpub3QoOmludmFsaWQpOmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWluYWN0aXZlLXNoYWRvdyk7XG59XG5cbi5oYXJtb255LWlucHV0Om5vdChbdHlwZV0pOm5vdCguZXJyb3ItaW5wdXQpOm5vdCg6aW52YWxpZCk6Zm9jdXMsXG4uaGFybW9ueS1pbnB1dFt0eXBlPW51bWJlcl06bm90KC5lcnJvci1pbnB1dCk6bm90KDppbnZhbGlkKTpmb2N1cyxcbi5oYXJtb255LWlucHV0W3R5cGU9dGV4dF06bm90KC5lcnJvci1pbnB1dCk6bm90KDppbnZhbGlkKTpmb2N1cyB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZm9jdXMtcmluZy1hY3RpdmUtc2hhZG93KTtcbn1cblxuLmhpZ2hsaWdodGVkLXNlYXJjaC1yZXN1bHQuY3VycmVudC1zZWFyY2gtcmVzdWx0IHtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgcGFkZGluZzogMXB4O1xuICAgIG1hcmdpbjogLTFweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMTI3LCAwLCAwLjgpO1xufVxuXG4uZGltbWVkIHtcbiAgICBvcGFjaXR5OiAwLjY7XG59XG5cbi5lZGl0aW5nIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1kcm9wLXNoYWRvdyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdGV4dC1vdmVyZmxvdzogY2xpcCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogMnB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtMnB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDJweDtcbiAgICBtYXJnaW4tcmlnaHQ6IC0ycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXB4O1xuICAgIG9wYWNpdHk6IDEuMCAhaW1wb3J0YW50O1xufVxuXG4uZWRpdGluZyxcbi5lZGl0aW5nICoge1xuICAgIGNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5oYXJtb255LWlucHV0Om5vdChbdHlwZV0pLmVycm9yLWlucHV0LFxuLmhhcm1vbnktaW5wdXRbdHlwZT1udW1iZXJdLmVycm9yLWlucHV0LFxuLmhhcm1vbnktaW5wdXRbdHlwZT10ZXh0XS5lcnJvci1pbnB1dCxcbi5oYXJtb255LWlucHV0Om5vdChbdHlwZV0pOmludmFsaWQsXG4uaGFybW9ueS1pbnB1dFt0eXBlPW51bWJlcl06aW52YWxpZCxcbi5oYXJtb255LWlucHV0W3R5cGU9dGV4dF06aW52YWxpZCB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICNmZjFhMDA7XG59XG5cbi5jaHJvbWUtc2VsZWN0IHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgbWFyZ2luOiAwO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgcGFkZGluZy1yaWdodDogMjBweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL2Nocm9tZVNlbGVjdC5wbmcpIDF4LCB1cmwoSW1hZ2VzL2Nocm9tZVNlbGVjdF8yeC5wbmcpIDJ4KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMCUsIDk4JSk7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgY2VudGVyO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgbWluLWhlaWdodDogMjRweDtcbiAgICBtaW4td2lkdGg6IDgwcHg7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxNXB4O1xufVxuXG4uY2hyb21lLXNlbGVjdDplbmFibGVkOmFjdGl2ZSxcbi5jaHJvbWUtc2VsZWN0OmVuYWJsZWQ6Zm9jdXMsXG4uY2hyb21lLXNlbGVjdDplbmFibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMCUsIDk2JSk7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLmNocm9tZS1zZWxlY3Q6ZW5hYmxlZDphY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7XG59XG5cbi5jaHJvbWUtc2VsZWN0OmVuYWJsZWQ6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAwIDAgMnB4IHJnYmEoNjYsIDEzMywgMjQ0LCAwLjQpO1xufVxuXG4uY2hyb21lLXNlbGVjdDpkaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC4zODtcbn1cblxuLmNocm9tZS1zZWxlY3Qgb3B0Z3JvdXAsXG4uY2hyb21lLXNlbGVjdCBvcHRpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7XG4gICAgY29sb3I6ICMyMjI7XG59XG5cbjpub3QoLnBsYXRmb3JtLW1hYykuLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIDo6LXdlYmtpdC1zY3JvbGxiYXIsXG46aG9zdC1jb250ZXh0KDpub3QoLnBsYXRmb3JtLW1hYykuLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSA6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMTRweDtcbiAgICBoZWlnaHQ6IDE0cHg7XG59XG5cbjpub3QoLnBsYXRmb3JtLW1hYykuLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssXG46aG9zdC1jb250ZXh0KDpub3QoLnBsYXRmb3JtLW1hYykuLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAxcHggcmdiYSgyNTUsMjU1LDI1NSwwLjMpO1xufVxuXG46bm90KC5wbGF0Zm9ybS1tYWMpLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLFxuOmhvc3QtY29udGV4dCg6bm90KC5wbGF0Zm9ybS1tYWMpLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsMC41KTtcbn1cblxuOm5vdCgucGxhdGZvcm0tbWFjKS4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIsXG46aG9zdC1jb250ZXh0KDpub3QoLnBsYXRmb3JtLW1hYykuLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSA6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzI0MjQyNDtcbn1cblxuLmdyYXktaW5mby1tZXNzYWdlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIHBhZGRpbmc6IDZweDtcbiAgICBjb2xvcjogIzg4ODtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG5sYWJlbFtpcz1kdC1pY29uLWxhYmVsXSB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmZ1bGwtd2lkZ2V0LWRpbW1lZC1iYW5uZXIgYSB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5mdWxsLXdpZGdldC1kaW1tZWQtYmFubmVyIHtcbiAgICBjb2xvcjogIzc3NztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogMDtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgei1pbmRleDogNTAwO1xufVxuXG5baXM9dWktaWNvbl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCBbaXM9dWktaWNvbl0uaWNvbi1pbnZlcnQsXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIFtpcz11aS1pY29uXS5pY29uLWludmVydCB7XG4gICAgZmlsdGVyOiBpbnZlcnQoODAlKSBodWUtcm90YXRlKDE4MGRlZyk7XG59XG5cbltpcz11aS1pY29uXS5pY29uLW1hc2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IHZhcigtLXNwcml0ZXNoZWV0LXBvc2l0aW9uKTtcbn1cblxuW2lzPXVpLWljb25dOm5vdCguaWNvbi1tYXNrKSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogdmFyKC0tc3ByaXRlc2hlZXQtcG9zaXRpb24pO1xufVxuXG4uc3ByaXRlc2hlZXQtc21hbGxpY29uczpub3QoLmljb24tbWFzaykge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtaW1hZ2Utc2V0KHVybChJbWFnZXMvc21hbGxJY29ucy5wbmcpIDF4LCB1cmwoSW1hZ2VzL3NtYWxsSWNvbnNfMngucG5nKSAyeCk7XG59XG5cbi5zcHJpdGVzaGVldC1zbWFsbGljb25zLmljb24tbWFzayB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL3NtYWxsSWNvbnMucG5nKSAxeCwgdXJsKEltYWdlcy9zbWFsbEljb25zXzJ4LnBuZykgMngpO1xufVxuXG4uc3ByaXRlc2hlZXQtbGFyZ2VpY29uczpub3QoLmljb24tbWFzaykge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtaW1hZ2Utc2V0KHVybChJbWFnZXMvbGFyZ2VJY29ucy5wbmcpIDF4LCB1cmwoSW1hZ2VzL2xhcmdlSWNvbnNfMngucG5nKSAyeCk7XG59XG5cbi5zcHJpdGVzaGVldC1sYXJnZWljb25zLmljb24tbWFzayB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL2xhcmdlSWNvbnMucG5nKSAxeCwgdXJsKEltYWdlcy9sYXJnZUljb25zXzJ4LnBuZykgMngpO1xufVxuXG4uc3ByaXRlc2hlZXQtbWVkaXVtaWNvbnM6bm90KC5pY29uLW1hc2spIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL21lZGl1bUljb25zLnBuZykgMXgsIHVybChJbWFnZXMvbWVkaXVtSWNvbnNfMngucG5nKSAyeCk7XG59XG5cbi5zcHJpdGVzaGVldC1tZWRpdW1pY29ucy5pY29uLW1hc2sge1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogLXdlYmtpdC1pbWFnZS1zZXQodXJsKEltYWdlcy9tZWRpdW1JY29ucy5wbmcpIDF4LCB1cmwoSW1hZ2VzL21lZGl1bUljb25zXzJ4LnBuZykgMngpO1xufVxuXG4uc3ByaXRlc2hlZXQtYXJyb3dpY29ucyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9wb3BvdmVyQXJyb3dzLnBuZyk7XG59XG5cbi5mb3JjZS13aGl0ZS1pY29ucyBbaXM9dWktaWNvbl0uc3ByaXRlc2hlZXQtc21hbGxpY29ucywgW2lzPXVpLWljb25dLmZvcmNlLXdoaXRlLWljb25zLnNwcml0ZXNoZWV0LXNtYWxsaWNvbnMsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL3NtYWxsSWNvbnMucG5nKSAxeCwgdXJsKEltYWdlcy9zbWFsbEljb25zXzJ4LnBuZykgMngpO1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogdmFyKC0tc3ByaXRlc2hlZXQtcG9zaXRpb24pO1xuICAgIGJhY2tncm91bmQ6ICNmYWZhZmEgIWltcG9ydGFudDtcbn1cblxuLmZvcmNlLXdoaXRlLWljb25zIFtpcz11aS1pY29uXS5zcHJpdGVzaGVldC1sYXJnZWljb25zLCBbaXM9dWktaWNvbl0uZm9yY2Utd2hpdGUtaWNvbnMuc3ByaXRlc2hlZXQtbGFyZ2VpY29ucywgLXRoZW1lLXByZXNlcnZlIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IC13ZWJraXQtaW1hZ2Utc2V0KHVybChJbWFnZXMvbGFyZ2VJY29ucy5wbmcpIDF4LCB1cmwoSW1hZ2VzL2xhcmdlSWNvbnNfMngucG5nKSAyeCk7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiB2YXIoLS1zcHJpdGVzaGVldC1wb3NpdGlvbik7XG4gICAgYmFja2dyb3VuZDogI2ZhZmFmYSAhaW1wb3J0YW50O1xufVxuXG4uZm9yY2Utd2hpdGUtaWNvbnMgW2lzPXVpLWljb25dLnNwcml0ZXNoZWV0LW1lZGl1bWljb25zLCBbaXM9dWktaWNvbl0uZm9yY2Utd2hpdGUtaWNvbnMuc3ByaXRlc2hlZXQtbWVkaXVtaWNvbnMsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiAtd2Via2l0LWltYWdlLXNldCh1cmwoSW1hZ2VzL21lZGl1bUljb25zLnBuZykgMXgsIHVybChJbWFnZXMvbWVkaXVtSWNvbnNfMngucG5nKSAyeCk7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiB2YXIoLS1zcHJpdGVzaGVldC1wb3NpdGlvbik7XG4gICAgYmFja2dyb3VuZDogI2ZhZmFmYSAhaW1wb3J0YW50O1xufVxuXG4uZXhwYW5kYWJsZS1pbmxpbmUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlO1xuICAgIHBhZGRpbmc6IDJweCA0cHg7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICBjb2xvcjogIzMzMztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmV4cGFuZGFibGUtaW5saW5lLWJ1dHRvbjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS10ZXh0KTtcbn1cblxuLmV4cGFuZGFibGUtaW5saW5lLWJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Q1ZDVkNTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9pbnNwZWN0b3JDb21tb24uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvaW5zcGVjdG9yU3R5bGUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoQykgMjAwOSBBbnRob255IFJpY2F1ZCA8cmlrQHdlYmtpdC5vcmc+XG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKlxuICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoXCJBcHBsZVwiKSBub3IgdGhlIG5hbWVzIG9mXG4gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbjpyb290IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuOnJvb3Qge1xuICAgIC0tYWNjZW50LWNvbG9yOiAjMDNhOWY0O1xuICAgIC0tYWNjZW50LWNvbG9yLWI6ICMyMTk2ZjM7XG4gICAgLS1hY2NlbnQtY29sb3ItYzogIzNlODJmNztcbiAgICAtLXRvb2xiYXItYmctY29sb3I6ICNmM2YzZjM7XG4gICAgLS10b29sYmFyLWhvdmVyLWJnLWNvbG9yOiAjZWFlYWVhO1xuICAgIC0tc2VsZWN0aW9uLWZnLWNvbG9yOiB3aGl0ZTtcbiAgICAtLXNlbGVjdGlvbi1pbmFjdGl2ZS1iZy1jb2xvcjogI2RhZGFkYTtcbiAgICAtLXRhYi1zZWxlY3RlZC1mZy1jb2xvcjogIzMzMztcbiAgICAtLXRhYi1zZWxlY3RlZC1iZy1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgLS1kcm9wLXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXG4gICAgICAgICAgICAgICAgICAgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSxcbiAgICAgICAgICAgICAgICAgICAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgIC0tZGl2aWRlci1jb2xvcjogI2QwZDBkMDtcbiAgICAtLWZvY3VzLXJpbmctaW5hY3RpdmUtc2hhZG93OiAwIDAgMCAxcHggI2UwZTBlMDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCB7XG4gICAgLS1hY2NlbnQtY29sb3I6ICMzMjY5OWY7XG4gICAgLS1hY2NlbnQtY29sb3ItYjogIzJmODRkYTtcbiAgICAtLWFjY2VudC1jb2xvci1jOiAjMWY0MDYxO1xuICAgIC0tdG9vbGJhci1iZy1jb2xvcjogIzMzMzMzMztcbiAgICAtLXRvb2xiYXItaG92ZXItYmctY29sb3I6ICMyMDIwMjA7XG4gICAgLS1zZWxlY3Rpb24tZmctY29sb3I6ICNjZGNkY2Q7XG4gICAgLS1zZWxlY3Rpb24taW5hY3RpdmUtYmctY29sb3I6ICMzMzMzMzM7XG4gICAgLS10YWItc2VsZWN0ZWQtZmctY29sb3I6ICNlYWVhZWE7XG4gICAgLS10YWItc2VsZWN0ZWQtYmctY29sb3I6IGJsYWNrO1xuICAgIC0tZHJvcC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksXG4gICAgICAgICAgICAgICAgICAgMCAycHggNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMiksXG4gICAgICAgICAgICAgICAgICAgMCAycHggNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgLS1kaXZpZGVyLWNvbG9yOiAjNTI1MjUyO1xuICAgIC0tZm9jdXMtcmluZy1pbmFjdGl2ZS1zaGFkb3c6IDAgMCAwIDFweCAjNWE1YTVhO1xufVxuXG46cm9vdCB7XG4gICAgLS1mb2N1cy1yaW5nLWFjdGl2ZS1zaGFkb3c6IDAgMCAwIDFweCB2YXIoLS1hY2NlbnQtY29sb3IpO1xuICAgIC0tc2VsZWN0aW9uLWJnLWNvbG9yOiB2YXIoLS1hY2NlbnQtY29sb3ItYik7XG4gICAgLS1kaXZpZGVyLWJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xufVxuXG5ib2R5IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiAwO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBmb250LWZhbWlseTogJy5TRk5TRGlzcGxheS1SZWd1bGFyJywgJ0hlbHZldGljYSBOZXVlJywgJ0x1Y2lkYSBHcmFuZGUnLCBzYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICB0YWItc2l6ZTogNDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiAjMjIyO1xufVxuXG4ucGxhdGZvcm0tbGludXgge1xuICAgIGNvbG9yOiByZ2IoNDgsIDU3LCA2Nik7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bywgVWJ1bnR1LCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cblxuLnBsYXRmb3JtLW1hYyB7XG4gICAgY29sb3I6IHJnYig0OCwgNTcsIDY2KTtcbiAgICBmb250LWZhbWlseTogJy5TRk5TRGlzcGxheS1SZWd1bGFyJywgJ0hlbHZldGljYSBOZXVlJywgJ0x1Y2lkYSBHcmFuZGUnLCBzYW5zLXNlcmlmO1xufVxuXG4ucGxhdGZvcm0td2luZG93cyB7XG4gICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIFRhaG9tYSwgc2Fucy1zZXJpZjtcbn1cblxuLnBhbmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4ucGFuZWwtc2lkZWJhciB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG5pZnJhbWUuZXh0ZW5zaW9uIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuaWZyYW1lLnBhbmVsLmV4dGVuc2lvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2luc3BlY3RvclN0eWxlLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL2luc3BlY3RvclN5bnRheEhpZ2hsaWdodC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICpcbiAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKFwiQXBwbGVcIikgbm9yIHRoZSBuYW1lcyBvZlxuICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuLmNtLWpzLWtleXdvcmQge2NvbG9yOiBoc2woMzEwLCA4NiUsIDM2JSk7fVxuLmNtLWpzLW51bWJlciB7Y29sb3I6IGhzbCgyNDgsIDEwMCUsIDQxJSk7fVxuLmNtLWpzLWNvbW1lbnQge2NvbG9yOiBoc2woMTIwLCAxMDAlLCAyMyUpOyBmb250LXN0eWxlOiBpdGFsaWM7fVxuLmNtLWpzLXN0cmluZyB7Y29sb3I6IGhzbCgxLCA4MCUsIDQzJSk7fVxuLmNtLWpzLXN0cmluZy0yIHtjb2xvcjogaHNsKDEsIDk5JSwgMzklKTt9XG4uY20tanMtYXRvbSB7Y29sb3I6IGhzbCgzMTAsIDg2JSwgMzYlKTt9XG4uY20tanMtZGVmIHtjb2xvcjogaHNsKDI0MCwgNzMlLCAzOCUpO31cbi5jbS1qcy1vcGVyYXRvciB7Y29sb3I6IGhzbCgyNywgMTAwJSwgMzAlKTt9XG4uY20tanMtbWV0YSB7Y29sb3I6IGhzbCgyNywgMTAwJSwgMzAlKTt9XG4uY20tanMtdmFyaWFibGUtMiB7Y29sb3I6IGhzbCgyNDAsIDczJSwgMzglKTt9XG5cbi5jbS1jc3Mta2V5d29yZCB7IGNvbG9yOiByZ2IoNywgMTQ0LCAxNTQpO31cbi5jbS1jc3MtbnVtYmVyIHtjb2xvcjogcmdiKDUwLCAwLCAyNTUpO31cbi5jbS1jc3MtY29tbWVudCB7Y29sb3I6IHJnYigwLCAxMTYsIDApO31cbi5jbS1jc3MtZGVmIHtjb2xvcjogcmdiKDIwMCwgMCwgMCk7fVxuLmNtLWNzcy1tZXRhIHtjb2xvcjogcmdiKDIwMCwgMCwgMCk7fVxuLmNtLWNzcy1hdG9tIHtjb2xvcjogcmdiKDcsIDE0NCwgMTU0KTt9XG4uY20tY3NzLXN0cmluZyB7Y29sb3I6IHJnYig3LCAxNDQsIDE1NCk7fVxuLmNtLWNzcy1zdHJpbmctMiB7Y29sb3I6IHJnYig3LCAxNDQsIDE1NCk7fVxuLmNtLWNzcy1saW5rIHtjb2xvcjogcmdiKDcsIDE0NCwgMTU0KTt9XG4uY20tY3NzLXZhcmlhYmxlIHtjb2xvcjogcmdiKDIwMCwgMCwgMCk7fVxuLmNtLWNzcy12YXJpYWJsZS0yIHtjb2xvcjogcmdiKDAsIDAsIDEyOCk7fVxuLmNtLWNzcy1wcm9wZXJ0eSwgLndlYmtpdC1jc3MtcHJvcGVydHkge2NvbG9yOiByZ2IoMjAwLCAwLCAwKTt9XG5cbi5jbS14bWwtbWV0YSB7Y29sb3I6IHJnYigxOTIsIDE5MiwgMTkyKTt9XG4uY20teG1sLWNvbW1lbnQge2NvbG9yOiByZ2IoMzUsIDExMCwgMzcpO31cbi5jbS14bWwtc3RyaW5nIHtjb2xvcjogcmdiKDI2LCAyNiwgMTY2KTt9XG4uY20teG1sLXRhZyB7Y29sb3I6IHZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7fVxuLmNtLXhtbC1hdHRyaWJ1dGUge2NvbG9yOiByZ2IoMTUzLCA2OSwgMCk7fVxuLmNtLXhtbC1saW5rIHtjb2xvcjogIzAwZTt9XG5cbjpyb290IHtcbiAgICAtLWRvbS10YWctbmFtZS1jb2xvcjogcmdiKDEzNiwgMTgsIDEyOCk7XG4gICAgLS1kb20tYXR0cmlidXRlLW5hbWUtY29sb3I6IHJnYigxNTMsIDY5LCAwKTtcbn1cblxuLndlYmtpdC1odG1sLWNvbW1lbnQge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtY29tbWVudCkgKi9cbiAgICBjb2xvcjogcmdiKDM1LCAxMTAsIDM3KTtcbn1cblxuLndlYmtpdC1odG1sLXRhZyB7XG4gICAgY29sb3I6IHJnYigxNjgsIDE0OCwgMTY2KTtcbn1cblxuLndlYmtpdC1odG1sLXRhZy1uYW1lLCAud2Via2l0LWh0bWwtY2xvc2UtdGFnLW5hbWUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtdGFnKSAqL1xuICAgIGNvbG9yOiB2YXIoLS1kb20tdGFnLW5hbWUtY29sb3IpO1xufVxuXG4ud2Via2l0LWh0bWwtcHNldWRvLWVsZW1lbnQge1xuICAgIC8qIFRoaXMgb25lIGlzIG5vbi1zdGFuZGFyZC4gKi9cbiAgICBjb2xvcjogYnJvd247XG59XG5cbi53ZWJraXQtaHRtbC1qcy1ub2RlLFxuLndlYmtpdC1odG1sLWNzcy1ub2RlIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi53ZWJraXQtaHRtbC10ZXh0LW5vZGUge1xuICAgIHVuaWNvZGUtYmlkaTogLXdlYmtpdC1pc29sYXRlO1xufVxuXG4ud2Via2l0LWh0bWwtZW50aXR5LXZhbHVlIHtcbiAgICAvKiBUaGlzIG9uZSBpcyBub24tc3RhbmRhcmQuICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgICB1bmljb2RlLWJpZGk6IC13ZWJraXQtaXNvbGF0ZTtcbn1cblxuLndlYmtpdC1odG1sLWRvY3R5cGUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtZG9jdHlwZSkgKi9cbiAgICBjb2xvcjogcmdiKDE5MiwgMTkyLCAxOTIpO1xufVxuXG4ud2Via2l0LWh0bWwtYXR0cmlidXRlLW5hbWUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtYXR0cmlidXRlLW5hbWUpICovXG4gICAgY29sb3I6IHZhcigtLWRvbS1hdHRyaWJ1dGUtbmFtZS1jb2xvcik7XG4gICAgdW5pY29kZS1iaWRpOiAtd2Via2l0LWlzb2xhdGU7XG59XG5cbi53ZWJraXQtaHRtbC1hdHRyaWJ1dGUtdmFsdWUge1xuICAgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdmlldy1zb3VyY2UuY3NzICgud2Via2l0LWh0bWwtYXR0cmlidXRlLXZhbHVlKSAqL1xuICAgIGNvbG9yOiByZ2IoMjYsIDI2LCAxNjYpO1xuICAgIHVuaWNvZGUtYmlkaTogLXdlYmtpdC1pc29sYXRlO1xufVxuXG4uZGV2dG9vbHMtbGluayB7XG4gICAgY29sb3I6IHJnYigxNywgODUsIDIwNCk7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi5kZXZ0b29scy1saW5rIFtpcz11aS1pY29uXSB7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRldnRvb2xzLWxpbmtbZGF0YS1rZXlib2FyZC1mb2N1cz1cInRydWVcIl06Zm9jdXMge1xuICAgIG91dGxpbmUtd2lkdGg6IHVuc2V0O1xufVxuXG4uZGV2dG9vbHMtbGluazpub3QoLmRldnRvb2xzLWxpbmstcHJldmVudC1jbGljaykge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuZGV2dG9vbHMtbGluayxcbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLmRldnRvb2xzLWxpbmsge1xuICAgIGNvbG9yOiBoc2woMCwgMCUsIDY3JSk7XG59XG5cbi53ZWJraXQtaHRtbC1lbmQtb2YtZmlsZSB7XG4gICAgLyogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB2aWV3LXNvdXJjZS5jc3MgKC53ZWJraXQtaHRtbC1lbmQtb2YtZmlsZSkgKi9cbiAgICBjb2xvcjogcmdiKDI1NSwgMCwgMCk7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi8qIERlZmF1bHQgQ29kZU1pcnJvciBUaGVtZSAqL1xuLmNtLW5lZ2F0aXZlIHtjb2xvcjogI2Q0NDt9XG4uY20tcG9zaXRpdmUge2NvbG9yOiAjMjkyO31cbi5jbS1oZWFkZXIsIC5jbS1zdHJvbmcge2ZvbnQtd2VpZ2h0OiBib2xkO31cbi5jbS1lbSB7Zm9udC1zdHlsZTogaXRhbGljO31cbi5jbS1saW5rIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9XG4uY20tc3RyaWtldGhyb3VnaCB7dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7fVxuXG4uY20taW52YWxpZGNoYXIge2NvbG9yOiAjZjAwO31cblxuLmNtLWhlYWRlciB7Y29sb3I6IGJsdWU7fVxuLmNtLXF1b3RlIHtjb2xvcjogIzA5MDt9XG5cbi5jbS1rZXl3b3JkIHtjb2xvcjogIzcwODt9XG4uY20tYXRvbSB7Y29sb3I6ICMyMTk7fVxuLmNtLW51bWJlciB7Y29sb3I6ICMxNjQ7fVxuLmNtLWRlZiB7Y29sb3I6ICMwMGY7fVxuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjMDVhO31cbi5jbS12YXJpYWJsZS0zLCAuY20tdHlwZSB7Y29sb3I6ICMwODU7fVxuLmNtLWNvbW1lbnQge2NvbG9yOiAjYTUwO31cbi5jbS1zdHJpbmcge2NvbG9yOiAjYTExO31cbi5jbS1zdHJpbmctMiB7Y29sb3I6ICNmNTA7fVxuLmNtLW1ldGEge2NvbG9yOiAjNTU1O31cbi5jbS1xdWFsaWZpZXIge2NvbG9yOiAjNTU1O31cbi5jbS1idWlsdGluIHtjb2xvcjogIzMwYTt9XG4uY20tYnJhY2tldCB7Y29sb3I6ICM5OTc7fVxuLmNtLXRhZyB7Y29sb3I6ICMxNzA7fVxuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICMwMGM7fVxuLmNtLWhyIHtjb2xvcjogIzk5OTt9XG4uY20tbGluayB7Y29sb3I6ICMwMGM7fVxuXG4uY20tZXJyb3Ige2NvbG9yOiAjZjAwO31cblxuLyojIHNvdXJjZVVSTD11aS9pbnNwZWN0b3JTeW50YXhIaWdobGlnaHQuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvaW5zcGVjdG9yU3ludGF4SGlnaGxpZ2h0RGFyay5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uY20tanMtYXRvbXtjb2xvcjpyZ2IoMTYxLCAyNDcsIDE4MSk7fVxuLmNtLWpzLWF0dHJpYnV0ZXtjb2xvcjpyZ2IoOTcsIDE0OCwgMTk4KTt9XG4uY20tanMtYnVpbHRpbntjb2xvcjpyZ2IoMTU5LCAxODAsIDIxNCk7fVxuLmNtLWpzLWNvbW1lbnR7Y29sb3I6cmdiKDExNiwgMTE2LCAxMTYpO31cbi5jbS1qcy1kZWZ7Y29sb3I6dmFyKC0tZG9tLXRhZy1uYW1lLWNvbG9yKTt9XG4uY20tanMta2V5d29yZHtjb2xvcjpyZ2IoMTU0LCAxMjcsIDIxMyk7fVxuLmNtLWpzLWxpbmt7Y29sb3I6cmdiKDE1OSwgMTgwLCAyMTQpO31cbi5jbS1qcy1tZXRhe2NvbG9yOnJnYigyMjEsIDI1MSwgODUpO31cbi5jbS1qcy1udW1iZXJ7Y29sb3I6cmdiKDE2MSwgMjQ3LCAxODEpO31cbi5jbS1qcy1vcGVyYXRvcntjb2xvcjpyZ2IoMjEwLCAxOTIsIDg3KTt9XG4uY20tanMtcHJvcGVydHl7Y29sb3I6cmdiKDIxMCwgMTkyLCA4Nyk7fVxuLmNtLWpzLXN0cmluZ3tjb2xvcjpyZ2IoMjQyLCAxMzksIDg0KTt9XG4uY20tanMtc3RyaW5nLTJ7Y29sb3I6cmdiKDI0MiwgMTM5LCA4NCk7fVxuLmNtLWpzLXRhZ3tjb2xvcjp2YXIoLS1kb20tdGFnLW5hbWUtY29sb3IpO31cbi5jbS1qcy12YXJpYWJsZXtjb2xvcjpyZ2IoMjE3LCAyMTcsIDIxNyk7fVxuLmNtLWpzLXZhcmlhYmxlLTJ7Y29sb3I6cmdiKDIxNywgMjE3LCAyMTcpO31cbi5jbS1hdG9te2NvbG9yOnJnYigxNjEsIDI0NywgMTgxKTt9XG4uY20tY29tbWVudHtjb2xvcjpyZ2IoMTE2LCAxMTYsIDExNik7fVxuLmNtLXZhcmlhYmxle2NvbG9yOnJnYigyMTcsIDIxNywgMjE3KTt9XG4uY20tc3RyaW5ne2NvbG9yOnJnYigyNDIsIDEzOSwgODQpO31cbi5jbS1rZXl3b3Jke2NvbG9yOnJnYigxNTQsIDEyNywgMjEzKTt9XG4uY20tbnVtYmVye2NvbG9yOnJnYigxNjEsIDI0NywgMTgxKTt9XG4uY20tb3BlcmF0b3J7Y29sb3I6cmdiKDIxMCwgMTkyLCA4Nyk7fVxuLmNtLWNzcy1hdG9te2NvbG9yOnJnYigyMTcsIDIxNywgMjE3KTt9XG4uY20tY3NzLWJ1aWx0aW57Y29sb3I6cmdiKDI1NSwgMTYzLCA3OSk7fVxuLmNtLWNzcy1kZWZ7Y29sb3I6cmdiKDI1NSwgMTYzLCA3OSk7fVxuLmNtLWNzcy1jb21tZW50e2NvbG9yOnJnYigxMTYsIDExNiwgMTE2KTt9XG4uY20tY3NzLW1ldGF7Y29sb3I6cmdiKDEzMiwgMjQwLCAyNTUpO31cbi5jbS1jc3MtbnVtYmVye2NvbG9yOnJnYigyMTcsIDIxNywgMjE3KTt9XG4uY20tY3NzLW9wZXJhdG9ye2NvbG9yOnJnYigyMTcsIDIxNywgMjE3KTt9XG4uY20tY3NzLXByb3BlcnR5e2NvbG9yOnJnYigxMzIsIDI0MCwgMjU1KTt9XG4uY20tY3NzLXF1YWxpZmllcntjb2xvcjpyZ2IoMjU1LCAxNjMsIDc5KTt9XG4uY20tY3NzLXN0cmluZ3tjb2xvcjpyZ2IoMjMxLCAxOTQsIDExMSk7fVxuLmNtLWNzcy1zdHJpbmctMntjb2xvcjpyZ2IoMjE3LCAyMTcsIDIxNyk7fVxuLmNtLWNzcy10YWd7Y29sb3I6cmdiKDI1NSwgMTYzLCA3OSk7fVxuLmNtLWNzcy12YXJpYWJsZXtjb2xvcjpyZ2IoMjU1LCAxNjMsIDc5KTt9XG4uY20tY3NzLXZhcmlhYmxlLTJ7Y29sb3I6cmdiKDI1NSwgMTYzLCA3OSk7fVxuLmNtLXhtbC1jb21tZW50e2NvbG9yOnJnYigxMzcsIDEzNywgMTM3KTt9XG4uY20teG1sLWVycm9ye2NvbG9yOnJnYigxOTgsIDk1LCA5NSk7fVxuLmNtLXhtbC1zdHJpbmd7Y29sb3I6cmdiKDI0MiwgMTUxLCAxMDIpO31cbi5jbS14bWwtdGFne2NvbG9yOnZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7fVxuLmNtLXhtbC1hdHRyaWJ1dGV7Y29sb3I6dmFyKC0tZG9tLWF0dHJpYnV0ZS1uYW1lLWNvbG9yKTt9XG4uY20teG1sLWxpbmt7Y29sb3I6cmdiKDIzMSwgMTk0LCAxMTEpO31cblxuLndlYmtpdC1odG1sLWF0dHJpYnV0ZS1uYW1le2NvbG9yOnZhcigtLWRvbS1hdHRyaWJ1dGUtbmFtZS1jb2xvcik7fVxuLndlYmtpdC1odG1sLWF0dHJpYnV0ZS12YWx1ZXtjb2xvcjpyZ2IoMjQyLCAxNTEsIDEwMik7fVxuLndlYmtpdC1odG1sLWNvbW1lbnR7Y29sb3I6cmdiKDEzNywgMTM3LCAxMzcpO31cbi5kZXZ0b29scy1saW5re2NvbG9yOnJnYigyMzEsIDE5NCwgMTExKTt9XG4ud2Via2l0LWh0bWwtdGFne2NvbG9yOnZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7fVxuLndlYmtpdC1odG1sLXRhZy1uYW1le2NvbG9yOnZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7fVxuLndlYmtpdC1odG1sLWNsb3NlLXRhZy1uYW1le2NvbG9yOnZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7fVxuLndlYmtpdC1odG1sLXRleHQtbm9kZXtjb2xvcjpyZ2IoMjA3LCAyMDgsIDIwOCk7fVxuLndlYmtpdC1odG1sLWNzcy1ub2Rle2NvbG9yOnJnYigyMDcsIDIwOCwgMjA4KTt9XG4ud2Via2l0LWh0bWwtanMtbm9kZXtjb2xvcjpyZ2IoMjA3LCAyMDgsIDIwOCk7fVxuLndlYmtpdC1odG1sLXBzZXVkby1lbGVtZW50e2NvbG9yOnJnYig5MywgMTc1LCAyMTUpO31cbi53ZWJraXQtY3NzLXNlbGVjdG9ye2NvbG9yOnJnYigyNTUsIDE2MywgNzkpO31cbi53ZWJraXQtY3NzLWF0LXJ1bGV7Y29sb3I6cmdiKDE4OCwgMTY0LCAxOTcpO31cbi53ZWJraXQtY3NzLWNvbG9ye2NvbG9yOnJnYigyNTUsIDE2MywgNzkpO31cbi53ZWJraXQtY3NzLWNvbW1lbnR7Y29sb3I6cmdiKDExNiwgMTE2LCAxMTYpO31cbi53ZWJraXQtY3NzLWltcG9ydGFudHtjb2xvcjpyZ2IoMjU1LCAyNiwgMjYpO31cbi53ZWJraXQtY3NzLWtleXdvcmR7Y29sb3I6cmdiKDI1NSwgMTYzLCA3OSk7fVxuLndlYmtpdC1jc3MtbnVtYmVye2NvbG9yOnJnYigyMTcsIDIxNywgMjE3KTt9XG4ud2Via2l0LWNzcy1wcm9wZXJ0eXtjb2xvcjogcmdiKDUzLCAyMTIsIDE5OSk7fVxuLndlYmtpdC1jc3Mtc3RyaW5ne2NvbG9yOnJnYigyMzEsIDE5NCwgMTExKTt9XG4ud2Via2l0LWNzcy11cmx7Y29sb3I6cmdiKDIzMSwgMTk0LCAxMTEpO31cblxuLmNtLWRlZntjb2xvcjp2YXIoLS1kb20tdGFnLW5hbWUtY29sb3IpO31cbi5jbS1oZWFkZXJ7Y29sb3I6dmFyKC0tZG9tLXRhZy1uYW1lLWNvbG9yKTt9XG4uY20tdmFyaWFibGUtMntjb2xvcjpyZ2IoMjE3LCAyMTcsIDIxNyk7fVxuXG4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwNWE7fVxuLmNtLXZhcmlhYmxlLTMsIC5jbS10eXBlIHtjb2xvcjogcmdiKDkzLCAxNzYsIDIxNSk7fVxuLmNtLXN0cmluZyB7Y29sb3I6IHJnYigyNDIsIDEzOSwgODQpO31cbi5jbS1tZXRhIHtjb2xvcjogIzU1NTt9XG4uY20tbWV0YSB7Y29sb3I6cmdiKDIyMSwgMjUxLCA4NSk7fVxuLmNtLXF1YWxpZmllcntjb2xvcjpyZ2IoMjU1LCAxNjMsIDc5KTt9XG4uY20tYnVpbHRpbntjb2xvcjpyZ2IoMTU5LCAxODAsIDIxNCk7fVxuLmNtLWJyYWNrZXQge2NvbG9yOiAjOTk3O31cbi5jbS10YWd7Y29sb3I6dmFyKC0tZG9tLXRhZy1uYW1lLWNvbG9yKTt9XG4uY20tYXR0cmlidXRle2NvbG9yOnJnYig5NywgMTQ4LCAxOTgpO31cbi5jbS1ociB7Y29sb3I6ICM5OTk7fVxuLmNtLWxpbmt7Y29sb3I6cmdiKDE1OSwgMTgwLCAyMTQpO31cblxuOnJvb3Qge1xuICAgIC0tZG9tLXRhZy1uYW1lLWNvbG9yOiByZ2IoOTMsIDE3NiwgMjE1KTtcbiAgICAtLWRvbS1hdHRyaWJ1dGUtbmFtZS1jb2xvcjogcmdiKDE1NSwgMTg3LCAyMjApO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2luc3BlY3RvclN5bnRheEhpZ2hsaWdodERhcmsuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvaW5zcGVjdG9yVmlld1RhYmJlZFBhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWIsXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYi5zZWxlY3RlZCB7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWIuc2VsZWN0ZWQge1xuICAgIGJvcmRlci13aWR0aDogMCAycHggMCAycHg7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItY29udGVudHMge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4udGFiYmVkLXBhbmUtbGVmdC10b29sYmFyIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDAgIWltcG9ydGFudDtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9pbnNwZWN0b3JWaWV3VGFiYmVkUGFuZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9saXN0V2lkZ2V0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5saXN0IHtcbiAgICBmbGV4OiBhdXRvIDAgMTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigyMzEsIDIzMSwgMjMxKTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4ubGlzdC1zZXBhcmF0b3Ige1xuICAgIGJhY2tncm91bmQ6IHJnYigyMzEsIDIzMSwgMjMxKTtcbiAgICBoZWlnaHQ6IDFweDtcbn1cblxuLmxpc3QtaXRlbSB7XG4gICAgZmxleDogbm9uZTtcbiAgICBtaW4taGVpZ2h0OiAzMHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmxpc3QtaXRlbTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogaHNsKDAsIDAlLCA5NiUpO1xufVxuXG4uY29udHJvbHMtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmNvbnRyb2xzLWdyYWRpZW50IHtcbiAgICBmbGV4OiAwIDEgNTBweDtcbn1cblxuLmxpc3QtaXRlbTpob3ZlciAuY29udHJvbHMtZ3JhZGllbnQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIGhzbCgwLCAwJSwgOTYlKSk7XG59XG5cbi5jb250cm9scy1idXR0b25zIHtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmxpc3QtaXRlbTpob3ZlciAuY29udHJvbHMtYnV0dG9ucyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA5NiUpO1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi5lZGl0b3ItY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgZmxleDogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBoc2woMCwgMCUsIDk2JSk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmVkaXRvci1jb250ZW50IHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cblxuLmVkaXRvci1idXR0b25zIHtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5lZGl0b3ItYnV0dG9ucyA+IGJ1dHRvbiB7XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbi5lZGl0b3ItY29udGVudCBpbnB1dCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xufVxuXG4uZWRpdG9yLWNvbnRlbnQgaW5wdXQuZXJyb3ItaW5wdXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL2xpc3RXaWRnZXQuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvcG9wb3Zlci5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ud2lkZ2V0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWRyb3Atc2hhZG93KTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbiAgICBsaW5lLWhlaWdodDogMTFweDtcbn1cblxuLndpZGdldC5oYXMtcGFkZGluZyB7XG4gICAgcGFkZGluZzogNnB4O1xufVxuXG4vKiMgc291cmNlVVJMPXVpL3BvcG92ZXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvcHJvZ3Jlc3NJbmRpY2F0b3IuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wcm9ncmVzcy1pbmRpY2F0b3Itc2hhZG93LXN0b3AtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjE2LCAwLCAwKSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMDtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxuXG4ucHJvZ3Jlc3MtaW5kaWNhdG9yLXNoYWRvdy1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogMSAwIGF1dG87XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnByb2dyZXNzLWluZGljYXRvci1zaGFkb3ctY29udGFpbmVyIC50aXRsZSB7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXgtd2lkdGg6IDE1MHB4O1xuICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIGNvbG9yOiAjNzc3O1xufVxuXG4ucHJvZ3Jlc3MtaW5kaWNhdG9yLXNoYWRvdy1jb250YWluZXIgcHJvZ3Jlc3Mge1xuICAgIGZsZXg6IGF1dG87XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICB3aWR0aDogMTAwcHhcbn1cblxuLyojIHNvdXJjZVVSTD11aS9wcm9ncmVzc0luZGljYXRvci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9yYWRpb0J1dHRvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOjpjb250ZW50IC5kdC1yYWRpby1idXR0b24ge1xuICAgIGhlaWdodDogMTdweDtcbiAgICB3aWR0aDogMTdweDtcbiAgICBtaW4td2lkdGg6IDE3cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2NSwgMTY1LCAxNjUpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYigyNTIsIDI1MiwgMjUyKSwgcmdiKDIyMywgMjIzLCAyMjMpKTtcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgbWFyZ2luOiAwIDVweCA1cHggMDtcbn1cblxuOjpjb250ZW50IC5kdC1yYWRpby1idXR0b246YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2IoMTk0LCAxOTQsIDE5NCksIHJnYigyMzksIDIzOSwgMjM5KSk7XG59XG5cbjo6Y29udGVudCAuZHQtcmFkaW8tYnV0dG9uOmNoZWNrZWQge1xuICAgIGJhY2tncm91bmQ6IHVybChJbWFnZXMvcmFkaW9Eb3QucG5nKSBjZW50ZXIgbm8tcmVwZWF0LFxuICAgICAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYigyNTIsIDI1MiwgMjUyKSwgcmdiKDIyMywgMjIzLCAyMjMpKTtcbn1cblxuOjpjb250ZW50IC5kdC1yYWRpby1idXR0b246Y2hlY2tlZDphY3RpdmUge1xuICAgIGJhY2tncm91bmQ6IHVybChJbWFnZXMvcmFkaW9Eb3QucG5nKSBjZW50ZXIgbm8tcmVwZWF0LFxuICAgICAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYigxOTQsIDE5NCwgMTk0KSwgcmdiKDIzOSwgMjM5LCAyMzkpKTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9yYWRpb0J1dHRvbi5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9yZW1vdGVEZWJ1Z2dpbmdUZXJtaW5hdGVkU2NyZWVuLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ud2lkZ2V0IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xufVxuXG4ubWVzc2FnZSwgLmJ1dHRvbiB7XG4gICAgZm9udC1zaXplOiBsYXJnZXI7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICBtYXJnaW46IDVweDtcbn1cblxuLmJ1dHRvbiB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbi5yZWFzb24ge1xuICAgIGNvbG9yOiAjOGIwMDAwO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL3JlbW90ZURlYnVnZ2luZ1Rlcm1pbmF0ZWRTY3JlZW4uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvcmVwb3J0Vmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbn1cblxuLnJlcG9ydC1jb250ZW50LWJveCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLnJlcG9ydC1jb250ZW50LWJveC5uby1zY3JvbGwge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4ucmVwb3J0LWhlYWRlciB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMzAsIDIzMCwgMjMwKTtcbiAgICBwYWRkaW5nOiAxMnB4IDI0cHg7XG59XG5cbi5yZXBvcnQtaGVhZGVyIC50b29sYmFyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAtOHB4O1xufVxuXG4ucmVwb3J0LWhlYWRlciAudG9vbGJhciB7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtOHB4O1xufVxuXG4ucmVwb3J0LXRpdGxlIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG59XG5cbi5yZXBvcnQtdXJsLCAucmVwb3J0LXN1YnRpdGxlIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLnJlcG9ydC1zZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBhZGRpbmc6IDEycHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMzAsIDIzMCwgMjMwKTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4ucmVwb3J0LXNlY3Rpb24taGVhZGVyIHtcbiAgICBtYXJnaW4tbGVmdDogMThweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnJlcG9ydC1zZWN0aW9uLXRpdGxlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgY29sb3I6ICM1NTU7XG59XG5cbi5yZXBvcnQtZmllbGQge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGxpbmUtaGVpZ2h0OiAyOHB4O1xufVxuXG4ucmVwb3J0LXJvdyB7XG4gICAgbWFyZ2luOiAxMHB4IDAgMnB4IDE4cHg7XG59XG5cbi5yZXBvcnQtZmllbGQtbmFtZSB7XG4gICAgY29sb3I6ICM4ODg7XG4gICAgZmxleDogMCAwIDEyOHB4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmc6IDAgNnB4O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG59XG5cbi5yZXBvcnQtZmllbGQtdmFsdWUge1xuICAgIGZsZXg6IGF1dG87XG4gICAgcGFkZGluZzogMCA2cHg7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxuLnJlcG9ydC1maWVsZC12YWx1ZS1zdWJ0aXRsZSB7XG4gICAgY29sb3I6ICM4ODg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvcmVwb3J0Vmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9yb290Vmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ucm9vdC12aWV3IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9yb290Vmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9zZWFyY2hhYmxlVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNlYXJjaC1iYXIge1xuICAgIGZsZXg6IDAgMCAzMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHotaW5kZXg6IDA7XG59XG5cbi5zZWFyY2gtYmFyLnJlcGxhY2VhYmxlIHtcbiAgICBmbGV4OiAwIDAgNTdweDtcbn1cblxuLnNlYXJjaC1yZXBsYWNlIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyOiAwO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIG1hcmdpbjogMDtcbiAgICBmbGV4OiAxO1xufVxuXG4uc2VhcmNoLXJlcGxhY2U6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG59XG5cbi50b29sYmFyLXNlYXJjaCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRvb2xiYXItc2VhcmNoID4gZGl2IHtcbiAgICBtYXJnaW46IDJweCAycHg7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi50b29sYmFyLXNlYXJjaC1pbnB1dHMge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBtaW4td2lkdGg6IDE1MHB4O1xufVxuXG4udG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbi1jb250cm9scyB7XG4gICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbn1cblxuLnRvb2xiYXItc2VhcmNoLW5hdmlnYXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0cHggN3B4O1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiKDE3MCwgMTcwLCAxNzApO1xuICAgIG9wYWNpdHk6IDAuMztcbn1cblxuLnRvb2xiYXItc2VhcmNoLW5hdmlnYXRpb24uZW5hYmxlZCB7XG4gICAgb3BhY2l0eTogMS4wO1xufVxuXG4udG9vbGJhci1zZWFyY2ggYnV0dG9uLnNlYXJjaC1hY3Rpb24tYnV0dG9uIHtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIGhlaWdodDogMjJweDtcbiAgICB3aWR0aDogODdweDtcbn1cblxuLnRvb2xiYXItc2VhcmNoLWNvbnRyb2wge1xuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi50b29sYmFyLXNlYXJjaC1idXR0b25zIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi50b29sYmFyLXJlcGxhY2UtY29udHJvbCxcbiNzZWFyY2gtaW5wdXQtZmllbGQge1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICBsaW5lLWhlaWdodDogMTdweDtcbn1cblxuLnRvb2xiYXItc2VhcmNoLWNvbnRyb2wsIC50b29sYmFyLXJlcGxhY2UtY29udHJvbCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MywgMTYzLCAxNjMpO1xuICAgIGhlaWdodDogMjJweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luLXRvcDogMnB4O1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbn1cblxuLnRvb2xiYXItc2VhcmNoLW5hdmlnYXRpb24uZW5hYmxlZDphY3RpdmUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDRweCA3cHgsIDAgMDtcbn1cblxuLnRvb2xiYXItc2VhcmNoLW5hdmlnYXRpb24udG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbi1wcmV2IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL3NlYXJjaFByZXYucG5nKTtcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYigxNjMsIDE2MywgMTYzKTtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAudG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbiB7XG4gICAgLXdlYmtpdC1maWx0ZXI6IGludmVydCg5MCUpO1xufVxuXG4udG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbi50b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uLXByZXYuZW5hYmxlZDphY3RpdmUge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvc2VhcmNoUHJldi5wbmcpLCAjZjJmMmYyO1xufVxuXG4udG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbi50b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uLW5leHQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvc2VhcmNoTmV4dC5wbmcpO1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiKDIzMCwgMjMwLCAyMzApO1xufVxuXG4udG9vbGJhci1zZWFyY2gtbmF2aWdhdGlvbi50b29sYmFyLXNlYXJjaC1uYXZpZ2F0aW9uLW5leHQuZW5hYmxlZDphY3RpdmUge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvc2VhcmNoTmV4dC5wbmcpLCAjZjJmMmYyO1xufVxuXG4uc2VhcmNoLXJlc3VsdHMtbWF0Y2hlcyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmc6IDAgNHB4O1xuICAgIGNvbG9yOiByZ2IoMTY1LCAxNjUsIDE2NSk7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xufVxuXG4uZmlyc3Qtcm93LWJ1dHRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4udG9vbGJhci1zZWFyY2ggPiAucmVwbGFjZS10b2dnbGUtdG9vbGJhciB7XG4gICAgbWFyZ2luOiAycHggLTJweCAwIDA7XG59XG5cbi50b29sYmFyLXNlYXJjaC1vcHRpb25zIHtcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cblxuLyojIHNvdXJjZVVSTD11aS9zZWFyY2hhYmxlVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS9zbGlkZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmR0LXJhbmdlLWlucHV0IHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgaGVpZ2h0OiAxMHB4O1xuICAgIHdpZHRoOiA4OHB4O1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cblxuLmR0LXJhbmdlLWlucHV0Ojotd2Via2l0LXNsaWRlci10aHVtYiwgLXRoZW1lLXByZXNlcnZlIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyOiAwO1xuICAgIHdpZHRoOiAxMnB4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICBtYXJnaW4tdG9wOiAtNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY0O1xufVxuXG4uZHQtcmFuZ2UtaW5wdXQ6Oi13ZWJraXQtc2xpZGVyLXJ1bm5hYmxlLXRyYWNrIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbn1cblxuLmR0LXJhbmdlLWlucHV0OmZvY3VzOjotd2Via2l0LXNsaWRlci10aHVtYiwgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg2NiwgMTMzLCAyNDQsIDAuNCk7XG59XG5cbi5kdC1yYW5nZS1pbnB1dDpkaXNhYmxlZDo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvc2xpZGVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3NtYWxsQnViYmxlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbmRpdiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogMTRweDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgcGFkZGluZzogMXB4IDRweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbn1cblxuZGl2LnZlcmJvc2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigwLCAwLCAyNTUpO1xufVxuXG5kaXYuaW5mbyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEyOCwgMTUxLCAxODkpO1xufVxuXG5kaXYud2FybmluZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMiwgMTY0LCAwKTtcbn1cblxuZGl2LmVycm9yIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjE2LCAzNSwgMzUpO1xufVxuXG4vKiMgc291cmNlVVJMPXVpL3NtYWxsQnViYmxlLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3NlZ21lbnRlZEJ1dHRvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uc2VnbWVudGVkLWJ1dHRvbiB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNlZ21lbnRlZC1idXR0b24tc2VnbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3JkZXI6IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbiAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lO1xuICBjb2xvcjogIzVhNWE1YTtcbiAgZmxleDogMSAxIDA7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBwYWRkaW5nOiA0cHggMTZweDtcbn1cblxuLnNlZ21lbnRlZC1idXR0b24tc2VnbWVudDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNGNEY0RjQ7XG4gIGNvbG9yOiAjMzMzO1xufVxuXG4uc2VnbWVudGVkLWJ1dHRvbi1zZWdtZW50OmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG59XG5cbi5zZWdtZW50ZWQtYnV0dG9uLXNlZ21lbnQ6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG59XG5cbi5zZWdtZW50ZWQtYnV0dG9uLXNlZ21lbnQuc2VnbWVudGVkLWJ1dHRvbi1zZWdtZW50LXNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxOCwgODElLCA1OSUpO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogI0ZBRkFGQTtcbn1cblxuLnNlZ21lbnRlZC1idXR0b24tc2VnbWVudC5zZWdtZW50ZWQtYnV0dG9uLXNlZ21lbnQtc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjE4LCA4MSUsIDYyJSk7XG4gIGNvbG9yOiAjRkZGO1xufVxuXG4vKiBSZW1vdmUgYSBib3JkZXIgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgYnV0dG9uIGFuZCBpdHMgc2libGluICovXG4uc2VnbWVudGVkLWJ1dHRvbi1zZWdtZW50LXNlbGVjdGVkICsgLnNlZ21lbnRlZC1idXR0b24tc2VnbWVudCB7XG4gIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9zZWdtZW50ZWRCdXR0b24uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvc29mdENvbnRleHRNZW51LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uc29mdC1jb250ZXh0LW1lbnUge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAxOTYsIDE5NiwgMC45KTtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgxOTYsIDE5NiwgMTk2LCAwLjUpO1xuICAgIC8qIE5PVEU6IEtlZXAgcGFkZGluZyBpbiBzeW5jIHdpdGggcGFkZGluZyBhZGp1c3RtZW50IGluIFNvZnRDb250ZXh0TWVudS5qcyAqL1xuICAgIHBhZGRpbmc6IDRweCAwIDRweCAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7XG4gICAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbWluLXdpZHRoOiAxNjBweCAhaW1wb3J0YW50O1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5zb2Z0LWNvbnRleHQtbWVudSB7XG4gICAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjUpO1xufVxuXG4uc29mdC1jb250ZXh0LW1lbnUtaXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBwYWRkaW5nOiAycHggN3B4IDJweCA4cHg7XG4gICAgbWFyZ2luOiAwIDEzcHggMCAwO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5zb2Z0LWNvbnRleHQtbWVudS1kaXNhYmxlZCB7XG4gICAgY29sb3I6ICM5OTk7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5zb2Z0LWNvbnRleHQtbWVudS1zZXBhcmF0b3Ige1xuICAgIGhlaWdodDogMTBweDtcbiAgICBtYXJnaW46IDAgMXB4O1xufVxuXG4uc29mdC1jb250ZXh0LW1lbnUtc2VwYXJhdG9yID4gLnNlcGFyYXRvci1saW5lIHtcbiAgICBtYXJnaW46IDA7XG4gICAgaGVpZ2h0OiA1cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMjIsIDIyMiwgMjIyKTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnNvZnQtY29udGV4dC1tZW51LWl0ZW0tbW91c2Utb3Zlcixcbi4tdGhlbWUtc2VsZWN0aW9uLWNvbG9yIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuOmhvc3QtY29udGV4dCgucGxhdGZvcm0tbWFjKSAuc29mdC1jb250ZXh0LW1lbnUtaXRlbS1tb3VzZS1vdmVyLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCBoc2woMjE0LCA4MSUsIDYwJSksIGhzbCgyMTQsIDEwMCUsIDU2JSkpO1xufVxuXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIC5zZXBhcmF0b3ItbGluZSB7XG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XG59XG5cbi5zb2Z0LWNvbnRleHQtbWVudS1pdGVtLXN1Ym1lbnUtYXJyb3cge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnNvZnQtY29udGV4dC1tZW51LWl0ZW0tbW91c2Utb3ZlciAuc29mdC1jb250ZXh0LW1lbnUtaXRlbS1jaGVja21hcmsge1xuICAgIGNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tZmctY29sb3IpO1xufVxuXG4uc29mdC1jb250ZXh0LW1lbnUtY3VzdG9tLWl0ZW0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogYXV0bztcbn1cblxuLnNvZnQtY29udGV4dC1tZW51LXNob3J0Y3V0IHtcbiAgICBjb2xvcjogZ3JheTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5zb2Z0LWNvbnRleHQtbWVudS1pdGVtLW1vdXNlLW92ZXIgLnNvZnQtY29udGV4dC1tZW51LXNob3J0Y3V0IHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLmNoZWNrbWFyayB7XG4gICAgb3BhY2l0eTogMC43O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIG1hcmdpbjogYXV0byA1cHggYXV0byAwcHg7XG59XG5cbi5zb2Z0LWNvbnRleHQtbWVudS1pdGVtLW1vdXNlLW92ZXIgLmNoZWNrbWFyayB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9zb2Z0Q29udGV4dE1lbnUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvc29mdERyb3BEb3duLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5pdGVtLmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi5pdGVtLWxpc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWRyb3Atc2hhZG93KTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLml0ZW0uaGlnaGxpZ2h0ZWQge1xuICAgIGNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tZmctY29sb3IpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvc29mdERyb3BEb3duLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3NvZnREcm9wRG93bkJ1dHRvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuOmhvc3Qge1xuICAgIGhlaWdodDogMjZweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cblxuOmhvc3QoW2Rpc2FibGVkXSkge1xuICAgIG9wYWNpdHk6IC41O1xufVxuXG46aG9zdCAudGl0bGUge1xuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgICB3aWR0aDogMTIwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuOmhvc3QoW2RhdGEta2V5Ym9hcmQtZm9jdXM9XCJ0cnVlXCJdOmZvY3VzKTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDJweDtcbiAgICBsZWZ0OiAycHg7XG4gICAgcmlnaHQ6IDJweDtcbiAgICBib3R0b206IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA4KTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9zb2Z0RHJvcERvd25CdXR0b24uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvc3BsaXRXaWRnZXQuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJcbiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEdPT0dMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHT09HTEUgSU5DLlxuICogT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG46aG9zdCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNoYWRvdy1zcGxpdC13aWRnZXQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNoYWRvdy1zcGxpdC13aWRnZXQtY29udGVudHMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgY29udGFpbjogbGF5b3V0IHNpemUgc3R5bGU7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0LXNpZGViYXIge1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0LW1haW4sIC5zaGFkb3ctc3BsaXQtd2lkZ2V0LXNpZGViYXIubWF4aW1pemVkIHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uc2hhZG93LXNwbGl0LXdpZGdldC5oYm94ID4gLnNoYWRvdy1zcGxpdC13aWRnZXQtcmVzaXplciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDZweDtcbiAgICB6LWluZGV4OiA1MDA7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0LnZib3ggPiAuc2hhZG93LXNwbGl0LXdpZGdldC1yZXNpemVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBoZWlnaHQ6IDZweDtcbiAgICB6LWluZGV4OiA1MDA7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0Lmhib3guc2hhZG93LXNwbGl0LXdpZGdldC1maXJzdC1pcy1zaWRlYmFyIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2UgIWltcG9ydGFudDtcbn1cblxuLnNoYWRvdy1zcGxpdC13aWRnZXQudmJveC5zaGFkb3ctc3BsaXQtd2lkZ2V0LWZpcnN0LWlzLXNpZGViYXIge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZSAhaW1wb3J0YW50O1xufVxuXG4uc2hhZG93LXNwbGl0LXdpZGdldC1yZXNpemVyLWJvcmRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0LnZib3ggPiAuc2hhZG93LXNwbGl0LXdpZGdldC1zaWRlYmFyLm5vLWRlZmF1bHQtc3BsaXR0ZXIge1xuICAgIGJvcmRlcjogMCAhaW1wb3J0YW50O1xufVxuXG4uc2hhZG93LXNwbGl0LXdpZGdldC52Ym94ID4gLnNoYWRvdy1zcGxpdC13aWRnZXQtc2lkZWJhcjpub3QoLm1heGltaXplZCkge1xuICAgIGJvcmRlcjogMDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvcik7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0LnZib3guc2hhZG93LXNwbGl0LXdpZGdldC1maXJzdC1pcy1zaWRlYmFyID4gLnNoYWRvdy1zcGxpdC13aWRnZXQtc2lkZWJhcjpub3QoLm1heGltaXplZCkge1xuICAgIGJvcmRlcjogMDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvcik7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0Lmhib3ggPiAuc2hhZG93LXNwbGl0LXdpZGdldC1zaWRlYmFyOm5vdCgubWF4aW1pemVkKSB7XG4gICAgYm9yZGVyOiAwO1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvcik7XG59XG5cbi5zaGFkb3ctc3BsaXQtd2lkZ2V0Lmhib3guc2hhZG93LXNwbGl0LXdpZGdldC1maXJzdC1pcy1zaWRlYmFyID4gLnNoYWRvdy1zcGxpdC13aWRnZXQtc2lkZWJhcjpub3QoLm1heGltaXplZCkge1xuICAgIGJvcmRlcjogMDtcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yKTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS9zcGxpdFdpZGdldC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS90b29sYmFyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgZmxleDogbm9uZTtcbiAgICBwYWRkaW5nOiAwIDJweDtcbn1cblxuLnRvb2xiYXItc2hhZG93IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBoZWlnaHQ6IDI2cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB6LWluZGV4OiAxMjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IG5vbmU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnRvb2xiYXItc2hhZG93LndyYXBwYWJsZSB7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4udG9vbGJhci1zaGFkb3cudG9vbGJhci1ncm93LXZlcnRpY2FsIHtcbiAgICBoZWlnaHQ6IGluaXRpYWw7XG59XG5cbi50b29sYmFyLXNoYWRvdy52ZXJ0aWNhbCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG59XG5cbi50b29sYmFyLWl0ZW0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGZsZXg6IG5vbmU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGhlaWdodDogMjZweDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICM1YTVhNWE7XG59XG5cbnNlbGVjdC50b29sYmFyLWl0ZW06ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLnRvb2xiYXItZHJvcGRvd24tYXJyb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgZmxleDogbm9uZTtcbn1cblxuc2VsZWN0LnRvb2xiYXItaXRlbTpkaXNhYmxlZCArIC50b29sYmFyLWRyb3Bkb3duLWFycm93IHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi8qIFRvb2xiYXIgaXRlbSAqL1xuXG4udG9vbGJhci1idXR0b24ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtaW4td2lkdGg6IDI4cHg7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLnRvb2xiYXItdGV4dCB7XG4gICAgbWFyZ2luOiAwIDVweDtcbiAgICBmbGV4OiBub25lO1xuICAgIGNvbG9yOiAjNWE1YTVhO1xufVxuXG4udG9vbGJhci10ZXh0OmVtcHR5IHtcbiAgICBtYXJnaW46IDA7XG59XG5cbi50b29sYmFyLWhhcy1kcm9wZG93biB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDAgM3B4IDAgNXB4O1xufVxuXG4udG9vbGJhci1oYXMtZHJvcGRvd24gLnRvb2xiYXItdGV4dCB7XG4gICAgbWFyZ2luOiAwIDRweCAwIDA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZmxleDogYXV0bztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4udG9vbGJhci1idXR0b24uZGFyay10ZXh0IC50b29sYmFyLWRyb3Bkb3duLWFycm93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xufVxuXG4udG9vbGJhci1oYXMtZ2x5cGggLnRvb2xiYXItdGV4dCB7XG4gICAgbWFyZ2luLWxlZnQ6IC00cHg7XG59XG5cbi50b29sYmFyLWJ1dHRvbjpub3QoLnRvb2xiYXItaGFzLWdseXBoKTpub3QoLnRvb2xiYXItaGFzLWRyb3Bkb3duKTpub3QoLmxhcmdlaWNvbi1tZW51KSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi50b29sYmFyLXJlbmRlci1hcy1saW5rcyAqIHtcbiAgICBmb250LXdlaWdodDogaW5pdGlhbDtcbiAgICBjb2xvcjogcmdiKDE3LCA4NSwgMjA0KTtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi50b29sYmFyLXRvZ2dsZWQtZ3JheTpub3QoLnRvb2xiYXItcmVuZGVyLWFzLWxpbmtzKSAudG9vbGJhci1idXR0b246bm90KC50b29sYmFyLWhhcy1nbHlwaCk6bm90KC50b29sYmFyLWhhcy1kcm9wZG93bik6bm90KC5sYXJnZWljb24tbWVudSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG4udG9vbGJhci1nbHlwaCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVhNWE1YTtcbiAgICBmbGV4OiBub25lO1xufVxuXG4vKiBCdXR0b24gKi9cblxuLnRvb2xiYXItYnV0dG9uOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi50b29sYmFyLWJ1dHRvbi5kYXJrLXRleHQgLnRvb2xiYXItdGV4dHtcbiAgICBjb2xvcjogIzMzMyAhaW1wb3J0YW50O1xufVxuXG46bm90KC50b29sYmFyLXJlbmRlci1hcy1saW5rcykgLnRvb2xiYXItYnV0dG9uOmVuYWJsZWQ6aG92ZXI6bm90KDphY3RpdmUpIC50b29sYmFyLWdseXBoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xufVxuXG46bm90KC50b29sYmFyLXJlbmRlci1hcy1saW5rcykgLnRvb2xiYXItYnV0dG9uOmVuYWJsZWQ6aG92ZXI6bm90KDphY3RpdmUpIC50b29sYmFyLXRleHQge1xuICAgIGNvbG9yOiAjMzMzO1xufVxuXG4udG9vbGJhci1idXR0b24udG9vbGJhci1zdGF0ZS1vbiAudG9vbGJhci1nbHlwaCxcbi50b29sYmFyLWJsdWUtb24taG92ZXIgLnRvb2xiYXItYnV0dG9uOm5vdCgudG9vbGJhci1zdGF0ZS1vbik6ZW5hYmxlZDpob3Zlcjpub3QoOmFjdGl2ZSksXG4uLXRoZW1lLXNlbGVjdGlvbi1jb2xvciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWNjZW50LWNvbG9yLWIpO1xufVxuXG4udG9vbGJhci1idXR0b24udG9vbGJhci1zdGF0ZS1vbiAudG9vbGJhci10ZXh0LFxuLi10aGVtZS1zZWxlY3Rpb24tY29sb3Ige1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtY29sb3ItYik7XG59XG5cbi50b29sYmFyLWJsdWUtb24taG92ZXIgLnRvb2xiYXItYnV0dG9uOm5vdCgudG9vbGJhci1zdGF0ZS1vbik6ZW5hYmxlZDpob3ZlciAudG9vbGJhci1nbHlwaCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi50b29sYmFyLWJsdWUtb24taG92ZXIgLnRvb2xiYXItYnV0dG9uOm5vdCgudG9vbGJhci1zdGF0ZS1vbik6ZW5hYmxlZDpob3ZlciAudG9vbGJhci10ZXh0IHtcbiAgICBjb2xvcjogd2hpdGU7XG59XG5cbi50b29sYmFyLWJ1dHRvbi50b29sYmFyLXN0YXRlLW9uOmVuYWJsZWQ6aG92ZXI6bm90KDphY3RpdmUpIC50b29sYmFyLWdseXBoLFxuLnRvb2xiYXItYmx1ZS1vbi1ob3ZlciAudG9vbGJhci1idXR0b246bm90KC50b29sYmFyLXN0YXRlLW9uKTplbmFibGVkOmFjdGl2ZTpob3Zlcixcbi4tdGhlbWUtc2VsZWN0aW9uLWNvbG9yIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hY2NlbnQtY29sb3ItYik7XG59XG5cbi50b29sYmFyLWJ1dHRvbi50b29sYmFyLXN0YXRlLW9uOmVuYWJsZWQ6aG92ZXI6bm90KDphY3RpdmUpIC50b29sYmFyLXRleHQsXG4uLXRoZW1lLXNlbGVjdGlvbi1jb2xvciB7XG4gICAgY29sb3I6IHZhcigtLWFjY2VudC1jb2xvci1iKTtcbn1cblxuLnRvb2xiYXItdG9nZ2xlZC1ncmF5IC50b29sYmFyLWJ1dHRvbi50b29sYmFyLXN0YXRlLW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKSAhaW1wb3J0YW50O1xufVxuXG4udG9vbGJhci1idXR0b24udG9vbGJhci1zdGF0ZS1vbi50b29sYmFyLXRvZ2dsZS13aXRoLXJlZC1jb2xvciAudG9vbGJhci1nbHlwaCxcbi50b29sYmFyLWJ1dHRvbi50b29sYmFyLXN0YXRlLW9mZi50b29sYmFyLWRlZmF1bHQtd2l0aC1yZWQtY29sb3IgLnRvb2xiYXItZ2x5cGgge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMTYsIDAsIDApICFpbXBvcnRhbnQ7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLnRvb2xiYXItYnV0dG9uLnRvb2xiYXItc3RhdGUtb24udG9vbGJhci10b2dnbGUtd2l0aC1yZWQtY29sb3IgLnRvb2xiYXItZ2x5cGgsXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC50b29sYmFyLWJ1dHRvbi50b29sYmFyLXN0YXRlLW9mZi50b29sYmFyLWRlZmF1bHQtd2l0aC1yZWQtY29sb3IgLnRvb2xiYXItZ2x5cGgge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAxMDAlLCA2NSUpICFpbXBvcnRhbnQ7XG59XG5cblxuLyogQ2hlY2tib3ggKi9cblxuLnRvb2xiYXItaXRlbS5jaGVja2JveCB7XG4gICAgcGFkZGluZzogMCA1cHggMCAycHg7XG59XG5cbi50b29sYmFyLWl0ZW0uY2hlY2tib3g6aG92ZXIge1xuICAgIGNvbG9yOiAjMzMzO1xufVxuXG4vKiBTZWxlY3QgKi9cblxuLnRvb2xiYXItc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG59XG5cbnNlbGVjdC50b29sYmFyLWl0ZW0ge1xuICAgIG1pbi13aWR0aDogMzhweDtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgcGFkZGluZzogMCAxM3B4IDAgNXB4O1xuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMjJweDtcbiAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxuXG5zZWxlY3QudG9vbGJhci1pdGVtW2RhdGEta2V5Ym9hcmQtZm9jdXM9XCJ0cnVlXCJdOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuc2VsZWN0LnRvb2xiYXItaXRlbVtkYXRhLWtleWJvYXJkLWZvY3VzPVwidHJ1ZVwiXTpmb2N1cyA+ICoge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4vKiBJbnB1dCAqL1xuXG4udG9vbGJhci1pbnB1dCB7XG4gICAgd2lkdGg6IDEyMHB4O1xuICAgIGhlaWdodDogMTlweDtcbiAgICBwYWRkaW5nOiA0cHggM3B4IDNweCAzcHg7XG4gICAgbWFyZ2luOiAxcHggM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50IDtcbiAgICBtaW4td2lkdGg6IDM1cHg7XG59XG5cbi50b29sYmFyLWlucHV0OmhvdmVyIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWluYWN0aXZlLXNoYWRvdyk7XG59XG5cbi50b29sYmFyLWlucHV0LmZvY3VzZWQsXG4udG9vbGJhci1pbnB1dDpub3QoLnRvb2xiYXItaW5wdXQtZW1wdHkpIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWFjdGl2ZS1zaGFkb3cpO1xufVxuXG4udG9vbGJhci1pbnB1dCA+IGlucHV0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZmxleC1ncm93OiAxO1xufVxuXG4udG9vbGJhci1pbnB1dC1jbGVhci1idXR0b24ge1xuICAgIG9wYWNpdHk6IDAuNztcbiAgICBmbGV4LWJhc2lzOiAxM3B4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGhlaWdodDogMTZweDtcbn1cblxuLnRvb2xiYXItaW5wdXQtY2xlYXItYnV0dG9uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAuOTk7XG59XG5cbi50b29sYmFyLWlucHV0LWVtcHR5IC50b29sYmFyLWlucHV0LWNsZWFyLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnRvb2xiYXItcHJvbXB0LXByb3h5IHtcbiAgICBmbGV4OiAxO1xufVxuXG4udG9vbGJhci1pbnB1dC1wcm9tcHQge1xuICAgIGZsZXg6IDE7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGN1cnNvcjogYXV0bztcbn1cblxuLyogU2VwYXJhdG9yICovXG5cbi50b29sYmFyLWRpdmlkZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XG4gICAgd2lkdGg6IDFweDtcbiAgICBtYXJnaW46IDVweCA0cHg7XG4gICAgaGVpZ2h0OiAxNnB4O1xufVxuXG4udG9vbGJhci1zcGFjZXIge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi8qIExvbmcgY2xpY2sgKi9cblxuLmxvbmctY2xpY2stZ2x5cGgge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWE1YTVhO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAgMDtcbn1cblxuLnRvb2xiYXItYnV0dG9uLmVtdWxhdGUtYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTYzLCAxNjMsIDE2Myk7XG59XG5cbi50b29sYmFyLWJ1dHRvbltkYXRhLWtleWJvYXJkLWZvY3VzPVwidHJ1ZVwiXTpmb2N1czo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDJweDtcbiAgICBib3R0b206IDJweDtcbiAgICBsZWZ0OiAycHg7XG4gICAgcmlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBjb250ZW50OiBcIlwiO1xufVxuXG4udG9vbGJhci1zaGFkb3cuZmxvYXRpbmcge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICB3aWR0aDogMjhweDtcbiAgICBsZWZ0OiAtMnB4O1xufVxuXG5pbnB1dFtpcz1oaXN0b3J5LWlucHV0XSB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICAgIHBhZGRpbmc6IDFweDtcbn1cblxuaW5wdXRbaXM9aGlzdG9yeS1pbnB1dF06aG92ZXIge1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWZvY3VzLXJpbmctaW5hY3RpdmUtc2hhZG93KTtcbn1cblxuaW5wdXRbaXM9aGlzdG9yeS1pbnB1dF06Zm9jdXMsXG5pbnB1dFtpcz1oaXN0b3J5LWlucHV0XTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZm9jdXMtcmluZy1hY3RpdmUtc2hhZG93KTtcbn1cblxuLnRvb2xiYXItaXRlbS53YXJuaW5nIHtcbiAgICBiYWNrZ3JvdW5kOiBoc2woMCwgMTAwJSwgOTUlKTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS90b29sYmFyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3N1Z2dlc3RCb3guY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuICogZGlzdHJpYnV0aW9uLlxuICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbjpob3N0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5zdWdnZXN0LWJveCB7XG4gICAgZmxleDogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWRyb3Atc2hhZG93KTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi5zdWdnZXN0LWJveC1jb250ZW50LWl0ZW0ge1xuICAgIHBhZGRpbmc6IDFweCAwIDFweCAxcHg7XG4gICAgbWFyZ2luOiAwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLnN1Z2dlc3QtYm94LWNvbnRlbnQtaXRlbS5zZWNvbmRhcnkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG59XG5cbi5zdWdnZXN0aW9uLXRpdGxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4uc3VnZ2VzdGlvbi10aXRsZSBzcGFuIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xufVxuXG4uc3VnZ2VzdGlvbi1zdWJ0aXRsZSB7XG4gICAgZmxleDogYXV0bztcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBjb2xvcjogIzk5OTtcbiAgICBtYXJnaW4tcmlnaHQ6IDNweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4uc3VnZ2VzdGlvbi1pY29uIHtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5zdWdnZXN0LWJveC1jb250ZW50LWl0ZW0gLnF1ZXJ5IHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnN1Z2dlc3QtYm94LWNvbnRlbnQtaXRlbSAuc3BhY2VyIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDIwcHg7XG59XG5cbi5zdWdnZXN0LWJveC1jb250ZW50LWl0ZW0uc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi5zdWdnZXN0LWJveC1jb250ZW50LWl0ZW0uc2VsZWN0ZWQgPiBzcGFuIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbn1cblxuLnN1Z2dlc3QtYm94LWNvbnRlbnQtaXRlbTpob3Zlcjpub3QoLnNlbGVjdGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NiwgMTIxLCAyMTcsIDAuMSk7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvc3VnZ2VzdEJveC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS90YWJiZWRQYW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50aG9ueSBSaWNhdWQgPHJpa0B3ZWJraXQub3JnPlxuICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBHT09HTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy5cbiAqIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLnRhYmJlZC1wYW5lIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi50YWJiZWQtcGFuZS1jb250ZW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgZmxleDogYXV0bztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi50YWJiZWQtcGFuZS1jb250ZW50Lmhhcy1uby10YWJzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XG59XG5cbi50YWJiZWQtcGFuZS1wbGFjZWhvbGRlciB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIHRleHQtc2hhZG93OiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpIDAgMXB4IDA7XG4gICAgbGluZS1oZWlnaHQ6IDI4cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRhYmJlZC1wYW5lLXBsYWNlaG9sZGVyLXJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udGFiYmVkLXBhbmUtcGxhY2Vob2xkZXIta2V5IHtcbiAgICBmbGV4OiAxO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmctcmlnaHQ6IDE0cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLnRhYmJlZC1wYW5lLXBsYWNlaG9sZGVyLXZhbHVlIHtcbiAgICBmbGV4OiAxO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgcGFkZGluZy1sZWZ0OiAxNHB4O1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXg6IDAgMCAyN3B4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjO1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLWNvbnRlbnRzIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci1jb250ZW50cyA+ICoge1xuICAgIHBvaW50ZXItZXZlbnRzOiBpbml0aWFsO1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYi1pY29uIHtcbiAgICBtaW4td2lkdGg6IDE0cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbi1yaWdodDogMnB4O1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYiB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgcGFkZGluZzogMnB4IDAuOGVtO1xuICAgIGhlaWdodDogMjZweDtcbiAgICBsaW5lLWhlaWdodDogMTVweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgY29sb3I6ICM1YTVhNWE7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFiLmNsb3NlYWJsZSB7XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYjpob3Zlcixcbi50YWJiZWQtcGFuZS1zaGFkb3cgLnRhYmJlZC1wYW5lLWhlYWRlci10YWJbZGF0YS1rZXlib2FyZC1mb2N1cz1cInRydWVcIl06Zm9jdXMge1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItaG92ZXItYmctY29sb3IpO1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYi10aXRsZSB7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWIubWVhc3VyaW5nIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFiLnNlbGVjdGVkIHtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xufVxuXG4udGFiYmVkLXBhbmUtaGVhZGVyLXRhYi5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGFiLXNlbGVjdGVkLWJnLWNvbG9yKTtcbiAgICBjb2xvcjogdmFyKC0tdGFiLXNlbGVjdGVkLWZnLWNvbG9yKTtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWIuZHJhZ2dpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMzcpO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFiIC50YWJiZWQtcGFuZS1jbG9zZS1idXR0b24ge1xuICAgIG1hcmdpbjogMCAtM3B4IDAgNHB4O1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWI6aG92ZXIgLnRhYmJlZC1wYW5lLWNsb3NlLWJ1dHRvbixcbi50YWJiZWQtcGFuZS1oZWFkZXItdGFiLnNlbGVjdGVkIC50YWJiZWQtcGFuZS1jbG9zZS1idXR0b24ge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFicy1kcm9wLWRvd24tY29udGFpbmVyIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBvcGFjaXR5OiAwLjg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFicy1kcm9wLWRvd24tY29udGFpbmVyID4gLmNoZXZyb24taWNvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLDAlLDIwJSwxKTtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWJzLWRyb3AtZG93bi1jb250YWluZXI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjksIDIyOSwgMjI5KTtcbn1cblxuLnRhYmJlZC1wYW5lLWhlYWRlci10YWJzLWRyb3AtZG93bi1jb250YWluZXIubWVhc3VyaW5nIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFicy1kcm9wLWRvd24tY29udGFpbmVyOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxLjA7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFicy1kcm9wLWRvd24tY29udGFpbmVyOmFjdGl2ZSB7XG4gICAgb3BhY2l0eTogMC44O1xufVxuXG4vKiBXZWIgcGFnZSBzdHlsZSAqL1xuXG4udGFiYmVkLXBhbmUtc2hhZG93LnZlcnRpY2FsLXRhYi1sYXlvdXQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDtcbn1cblxuLnRhYmJlZC1wYW5lLXNoYWRvdy52ZXJ0aWNhbC10YWItbGF5b3V0IC50YWJiZWQtcGFuZS1oZWFkZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogbm9uZSB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRhYmJlZC1wYW5lLXNoYWRvdy52ZXJ0aWNhbC10YWItbGF5b3V0IC50YWJiZWQtcGFuZS1jb250ZW50IHtcbiAgICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAwO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cblxuLnRhYmJlZC1wYW5lLXNoYWRvdy52ZXJ0aWNhbC10YWItbGF5b3V0IC50YWJiZWQtcGFuZS1oZWFkZXItY29udGVudHMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4udGFiYmVkLXBhbmUtc2hhZG93LnZlcnRpY2FsLXRhYi1sYXlvdXQgLnRhYmJlZC1wYW5lLWhlYWRlci10YWJzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgd2lkdGg6IDEyMHB4O1xufVxuXG4udGFiYmVkLXBhbmUtc2hhZG93LnZlcnRpY2FsLXRhYi1sYXlvdXQgLnRhYmJlZC1wYW5lLWhlYWRlci10YWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogbm9uZSB0cmFuc3BhcmVudDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIGhlaWdodDogMjZweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4udGFiYmVkLXBhbmUtc2hhZG93LnZlcnRpY2FsLXRhYi1sYXlvdXQgLnRhYmJlZC1wYW5lLWhlYWRlci10YWI6bm90KC5zZWxlY3RlZCkge1xuICAgIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xufVxuXG4udGFiYmVkLXBhbmUtc2hhZG93LnZlcnRpY2FsLXRhYi1sYXlvdXQgLnRhYmJlZC1wYW5lLWhlYWRlci10YWIuc2VsZWN0ZWQge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGJvcmRlcjogbm9uZSB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItbGVmdDogNnB4IHNvbGlkICM2NjY7XG59XG5cbi50YWJiZWQtcGFuZS10YWItc2xpZGVyIHtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAtMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwM2E5ZjQ7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiA1MDtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiAwIDEwMCU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAudGFiYmVkLXBhbmUtdGFiLXNsaWRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuQG1lZGlhICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuMSkge1xuICAgIC50YWJiZWQtcGFuZS10YWItc2xpZGVyIHtcbiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICB9XG59XG5cbi50YWJiZWQtcGFuZS10YWItc2xpZGVyLmVuYWJsZWQge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi50YWJiZWQtcGFuZS1oZWFkZXItdGFiLmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi50YWJiZWQtcGFuZS1sZWZ0LXRvb2xiYXIge1xuICAgIG1hcmdpbi1yaWdodDogLTRweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4udGFiYmVkLXBhbmUtcmlnaHQtdG9vbGJhciB7XG4gICAgbWFyZ2luLWxlZnQ6IC00cHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS90YWJiZWRQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3RhcmdldENyYXNoZWRTY3JlZW4uY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi53aWRnZXQge1xuICAgIHBhZGRpbmc6IDI1cHg7XG59XG5cbi5tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IGxhcmdlcjtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIG1hcmdpbjogNXB4O1xufVxuXG4vKiMgc291cmNlVVJMPXVpL3RhcmdldENyYXNoZWRTY3JlZW4uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidWkvdGV4dEJ1dHRvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICAgIG1hcmdpbjogMnB4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBwYWRkaW5nOiAwcHggMTJweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgZmxleDogbm9uZTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG46aG9zdCg6bm90KDpkaXNhYmxlZCk6Zm9jdXMpLFxuOmhvc3QoOm5vdCg6ZGlzYWJsZWQpOmhvdmVyKSxcbjpob3N0KDpub3QoOmRpc2FibGVkKTphY3RpdmUpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuOmhvc3QoOm5vdCg6ZGlzYWJsZWQpOmFjdGl2ZSkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7XG59XG5cbjpob3N0KDpub3QoOmRpc2FibGVkKTpmb2N1cykge1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMCAwIDJweCByZ2JhKDY2LCAxMzMsIDI0NCwgMC40KTtcbn1cblxuOmhvc3QoOmRpc2FibGVkKSB7XG4gICAgb3BhY2l0eTogMC4zODtcbn1cblxuOmhvc3QoLnByaW1hcnktYnV0dG9uKSwgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDI4NUY0O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBjb2xvcjogI2ZmZjtcbn1cblxuOmhvc3QoLnByaW1hcnktYnV0dG9uOm5vdCg6ZGlzYWJsZWQpOmZvY3VzKSxcbjpob3N0KC5wcmltYXJ5LWJ1dHRvbjpub3QoOmRpc2FibGVkKTpob3ZlciksIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzNCNzhFNztcbn1cblxuOmhvc3QoLnByaW1hcnktYnV0dG9uOm5vdCg6ZGlzYWJsZWQpOmFjdGl2ZSksIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzMzNjdENjtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKTpob3N0KDpub3QoLnByaW1hcnktYnV0dG9uKTpub3QoOmRpc2FibGVkKTpmb2N1cyksXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpOmhvc3QoOm5vdCgucHJpbWFyeS1idXR0b24pOm5vdCg6ZGlzYWJsZWQpOmhvdmVyKSxcbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCk6aG9zdCg6bm90KC5wcmltYXJ5LWJ1dHRvbik6bm90KDpkaXNhYmxlZCk6YWN0aXZlKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzMxMzEzMTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpOmhvc3QoOm5vdCgucHJpbWFyeS1idXR0b24pOm5vdCg6ZGlzYWJsZWQpOmZvY3VzKSB7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAwIDAgMnB4IHJnYmEoOTQsIDE1MSwgMjQ2LCAwLjYpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpOmhvc3QoOm5vdCgucHJpbWFyeS1idXR0b24pOm5vdCg6ZGlzYWJsZWQpOmFjdGl2ZSkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMzZTNlM2U7XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvdGV4dEJ1dHRvbi5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS90ZXh0UHJvbXB0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4udGV4dC1wcm9tcHQtcm9vdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4udGV4dC1wcm9tcHQtZWRpdGluZyB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHRleHQtb3ZlcmZsb3c6IGNsaXAgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDJweDtcbiAgICBtYXJnaW4tbGVmdDogLTJweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMnB4O1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gICAgcGFkZGluZy1ib3R0b206IDFweDtcbiAgICBvcGFjaXR5OiAxLjAgIWltcG9ydGFudDtcbn1cblxuLnRleHQtcHJvbXB0LWVkaXRpbmcsXG4udGV4dC1wcm9tcHQtZWRpdGluZyA6OmNvbnRlbnQgKiB7XG4gICAgY29sb3I6ICMyMjIgIWltcG9ydGFudDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xufVxuXG46OmNvbnRlbnQgLmF1dG8tY29tcGxldGUtdGV4dCB7XG4gICAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KSAhaW1wb3J0YW50O1xufVxuXG46OmNvbnRlbnQgLnRleHQtcHJvbXB0W2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTtcbn1cblxuOjpjb250ZW50IC50ZXh0LXByb21wdDpub3QoW2RhdGEtcGxhY2Vob2xkZXJdKTplbXB0eTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdcXDAwQTAnO1xuICAgIHdpZHRoOiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG46OmNvbnRlbnQgLnRleHQtcHJvbXB0IHtcbiAgICBjdXJzb3I6IHRleHQ7XG4gICAgb3ZlcmZsb3cteDogdmlzaWJsZTtcbn1cblxuOjpjb250ZW50IC50ZXh0LXByb21wdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbjo6Y29udGVudCAudGV4dC1wcm9tcHQuZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi50ZXh0LXByb21wdC1lZGl0aW5nIDo6Y29udGVudCBiciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD11aS90ZXh0UHJvbXB0LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInVpL3Rvb2x0aXAuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50b29sdGlwIHtcbiAgICBiYWNrZ3JvdW5kOiBoc2woMCwgMCUsIDk1JSk7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XG4gICAgcGFkZGluZzogNXB4IDhweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1maWx0ZXI6IGRyb3Atc2hhZG93KDAgMXB4IDJweCBoc2xhKDAsIDAlLCAwJSwgMC4zKSk7XG4gICAgYm9yZGVyOiAxcHggc29saWQgaHNsYSgwLCAwJSwgMCUsIDAuMSk7XG4gICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcyAxMDBtcywgb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgLjIsIDEpO1xuICAgIHotaW5kZXg6IDIwMDAxO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnRvb2x0aXAtYnJlYWt3b3JkIHtcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4udG9vbHRpcC5zaG93biB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiA2MDBtcztcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4udG9vbHRpcC5zaG93bi5pbnN0YW50IHtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbn1cblxuLnRvb2x0aXAtc2hvcnRjdXQge1xuICAgIGNvbG9yOiBoc2woMCwgMCUsIDQ1JSk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgZmxleDogMCAwIGF1dG87XG59XG5cbi8qIyBzb3VyY2VVUkw9dWkvdG9vbHRpcC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS90cmVlb3V0bGluZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgZmxleDogMSAxO1xuICAgIHBhZGRpbmc6IDJweCAwIDAgMDtcbn1cblxuLnRyZWUtb3V0bGluZS1kaXNjbG9zdXJlOm5vdCgudHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUtaGlkZS1vdmVyZmxvdykge1xuICAgIG1pbi13aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi50cmVlLW91dGxpbmUge1xuICAgIHBhZGRpbmc6IDAgMCA0cHggNHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICB6LWluZGV4OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5ob3ZlcmVkOm5vdCguc2VsZWN0ZWQpIC5zZWxlY3Rpb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGxlZnQ6IDNweDtcbiAgICByaWdodDogM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTYsIDEyMSwgMjE3LCAwLjEpO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHotaW5kZXg6IC0xO1xuICAgIG1hcmdpbi1sZWZ0OiAtMTAwMDBweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5zZWxlY3RlZCAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24taW5hY3RpdmUtYmctY29sb3IpO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmluLWNsaXBib2FyZCAuaGlnaGxpZ2h0IHtcbiAgICBvdXRsaW5lOiAxcHggZG90dGVkIGRhcmtncmV5O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmVsZW1lbnRzLWRyYWctb3ZlciAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xuICAgIGJvcmRlci10b3A6IDJweCBzb2xpZDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xufVxuXG5vbC50cmVlLW91dGxpbmUgbGkuc2VsZWN0ZWQ6Zm9jdXMgLnNlbGVjdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbn1cblxub2wudHJlZS1vdXRsaW5lIGxpLnBhcmVudC5zZWxlY3RlZDpmb2N1czo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tZmctY29sb3IpO1xufVxuXG5vbC50cmVlLW91dGxpbmUsXG4udHJlZS1vdXRsaW5lIG9sIHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG59XG5cbi50cmVlLW91dGxpbmUtbm8tcGFkZGluZyB7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLnRyZWUtb3V0bGluZSBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxMnB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWluLWhlaWdodDogMTZweDtcbn1cblxub2wudHJlZS1vdXRsaW5lIGxpLnNlbGVjdGVkOmZvY3VzIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbn1cblxub2wudHJlZS1vdXRsaW5lIGxpLnNlbGVjdGVkOmZvY3VzICoge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIC5pY29ucy1jb250YWluZXIge1xuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi50cmVlLW91dGxpbmUgbGkgLmxlYWRpbmctaWNvbnMge1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIC50cmFpbGluZy1pY29ucyB7XG4gICAgbWFyZ2luLWxlZnQ6IDRweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaTo6YmVmb3JlIHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy90cmVlb3V0bGluZVRyaWFuZ2xlcy5wbmcpO1xuICAgIC13ZWJraXQtbWFzay1zaXplOiAzMnB4IDI0cHg7XG4gICAgY29udGVudDogXCJhYVwiO1xuICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0ycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOm5vdCgucGFyZW50KTo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuQG1lZGlhICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuMSkge1xuLnRyZWUtb3V0bGluZSBsaTo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChJbWFnZXMvdHJlZW91dGxpbmVUcmlhbmdsZXNfMngucG5nKTtcbn1cbn0gLyogbWVkaWEgKi9cblxuLnRyZWUtb3V0bGluZSBsaTo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IDAgMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzI3MjcyO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLnBhcmVudC5leHBhbmRlZDo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IC0xNnB4IDA7XG59XG5cbi50cmVlLW91dGxpbmUgb2wuY2hpbGRyZW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi50cmVlLW91dGxpbmUgb2wuY2hpbGRyZW4uZXhwYW5kZWQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udHJlZS1vdXRsaW5lLnRyZWUtb3V0bGluZS1kZW5zZSBsaSB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIG1pbi1oZWlnaHQ6IDEycHg7XG59XG5cbi50cmVlLW91dGxpbmUudHJlZS1vdXRsaW5lLWRlbnNlIGxpLnBhcmVudCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbn1cblxuLnRyZWUtb3V0bGluZS50cmVlLW91dGxpbmUtZGVuc2UgbGkucGFyZW50OjpiZWZvcmUge1xuICAgIHRvcDogMDtcbn1cblxuLnRyZWUtb3V0bGluZS50cmVlLW91dGxpbmUtZGVuc2Ugb2wge1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuLyojIHNvdXJjZVVSTD11aS90cmVlb3V0bGluZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ1aS92aWV3Q29udGFpbmVycy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChDKSAyMDA5IEFudGhvbnkgUmljYXVkIDxyaWtAd2Via2l0Lm9yZz5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqXG4gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIChcIkFwcGxlXCIpIG5vciB0aGUgbmFtZXMgb2ZcbiAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLnNpZGViYXItaGlkZGVuLW92ZXJyaWRlIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5leHBhbmRhYmxlLXZpZXctdGl0bGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgcGFkZGluZzogMCA1cHg7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4uZXhwYW5kYWJsZS12aWV3LXRpdGxlLmV4cGFuZGVkLFxuLmV4cGFuZGFibGUtdmlldy10aXRsZTpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cblxuLmV4cGFuZGFibGUtdmlldy10aXRsZSAudG9vbGJhciB7XG4gICAgbWFyZ2luLXRvcDogLTNweDtcbn1cblxuLmV4cGFuZGFibGUtdmlldy10aXRsZTpub3QoLmV4cGFuZGVkKSAudG9vbGJhciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnRpdGxlLWV4cGFuZC1pY29uIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAtMnB4O1xufVxuXG4uZXhwYW5kYWJsZS12aWV3LXRpdGxlW2RhdGEta2V5Ym9hcmQtZm9jdXM9XCJ0cnVlXCJdOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xufVxuXG4uZXhwYW5kYWJsZS12aWV3LXRpdGxlID4gLnRvb2xiYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG59XG5cbi5zaWRlYmFyLXBhbmUtY29udGFpbmVyIC50b29sYmFyIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcbn1cblxuLnNpZGViYXItcGFuZS1jb250YWluZXIgLnRvb2xiYXIgPiAqIHtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuLyojIHNvdXJjZVVSTD11aS92aWV3Q29udGFpbmVycy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjb21wb25lbnRzL2pzVXRpbHMuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cbi5zdGFjay1wcmV2aWV3LWFzeW5jLWRlc2NyaXB0aW9uIHtcbiAgICBwYWRkaW5nOiAzcHggMCAxcHg7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uc3RhY2stcHJldmlldy1jb250YWluZXIgLndlYmtpdC1odG1sLWJsYWNrYm94LWxpbmsge1xuICAgIG9wYWNpdHk6IDAuNjtcbn1cblxuLnN0YWNrLXByZXZpZXctY29udGFpbmVyID4gdHIge1xuICAgIGhlaWdodDogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbn1cblxuLnN0YWNrLXByZXZpZXctY29udGFpbmVyIHRkIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5zdGFjay1wcmV2aWV3LWNvbnRhaW5lciAuZnVuY3Rpb24tbmFtZSB7XG4gICAgbWF4LXdpZHRoOiA4MGVtO1xufVxuXG4uc3RhY2stcHJldmlldy1jb250YWluZXI6bm90KC5zaG93LWJsYWNrYm94ZWQpID4gdHIuYmxhY2tib3hlZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnN0YWNrLXByZXZpZXctY29udGFpbmVyLnNob3ctYmxhY2tib3hlZCA+IHRyLnNob3ctYmxhY2tib3hlZC1saW5rIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uc3RhY2stcHJldmlldy1jb250YWluZXIgPiB0ci5zaG93LWJsYWNrYm94ZWQtbGluayB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4vKiMgc291cmNlVVJMPWNvbXBvbmVudHMvanNVdGlscy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwZXJzaXN0ZW5jZS9lZGl0RmlsZVN5c3RlbVZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmZpbGUtc3lzdGVtLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogYXV0bztcbiAgICBtYXJnaW46IDEwcHggMDtcbn1cblxuLmZpbGUtc3lzdGVtLWhlYWRlci10ZXh0IHtcbiAgICBmbGV4OiAxIDAgYXV0bztcbn1cblxuLmFkZC1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG59XG5cbi5maWxlLXN5c3RlbS1saXN0IHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uZmlsZS1zeXN0ZW0tbGlzdC1lbXB0eSB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmZpbGUtc3lzdGVtLWxpc3QtaXRlbSB7XG4gICAgcGFkZGluZzogM3B4IDVweCAzcHggNXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogYXV0byAxIDE7XG59XG5cbi5saXN0LWl0ZW0gLmZpbGUtc3lzdGVtLXZhbHVlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmZpbGUtc3lzdGVtLXZhbHVlIHtcbiAgICBmbGV4OiAxIDEgMHB4O1xufVxuXG4uZmlsZS1zeXN0ZW0tZWRpdC1yb3cge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbjogNnB4IDVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZmlsZS1zeXN0ZW0tZWRpdC1yb3cgaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9cGVyc2lzdGVuY2UvZWRpdEZpbGVTeXN0ZW1WaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInBlcnNpc3RlbmNlL3dvcmtzcGFjZVNldHRpbmdzVGFiLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbmhlYWRlciB7XG4gICAgcGFkZGluZzogMCAwIDZweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0VFRUVFRTtcbn1cblxuaGVhZGVyID4gaDMge1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogM3B4O1xufVxuXG4uc2V0dGluZ3MtY29udGVudCB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgbWFyZ2luOiA4cHggOHB4IDhweCAwO1xuICAgIHBhZGRpbmc6IDAgNHB4O1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC13ZWJraXQtY29sdW1uLXdpZHRoOiAyODhweDtcbn1cblxuXG4uc2V0dGluZ3MtdGFiLnNldHRpbmdzLWNvbnRhaW5lciB7XG4gICAgLXdlYmtpdC1jb2x1bW4td2lkdGg6IDMwOHB4O1xufVxuXG4uc2V0dGluZ3MtdGFiIGxhYmVsIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG5cbi5zZXR0aW5ncy1jb250YWluZXItd3JhcHBlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMzFweDtcbiAgICBsZWZ0OiAwcHg7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHBhZGRpbmctdG9wOiA5cHg7XG59XG5cbi5zZXR0aW5ncy10YWIuc2V0dGluZ3MtY29udGVudCB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi5zZXR0aW5ncy10YWIgcCB7XG4gICAgbWFyZ2luOiAxMnB4IDA7XG59XG5cbnAuZm9sZGVyLWV4Y2x1ZGUtcGF0dGVybiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5wLmZvbGRlci1leGNsdWRlLXBhdHRlcm4gPiBpbnB1dCB7XG4gICAgZmxleDogYXV0bztcbn1cblxuLnNldHRpbmdzLXRhYiAuZmlsZS1zeXN0ZW0tY29udGFpbmVyIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2FhYTtcbiAgICBwYWRkaW5nOiAxOXB4IDAgMTBweDtcbiAgICBtYXJnaW46IDIwcHggMDtcbn1cblxuLnNldHRpbmdzLXRhYiAuZmlsZS1zeXN0ZW0taGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNldHRpbmdzLXRhYiAuZmlsZS1zeXN0ZW0tbmFtZSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgZm9udC1zaXplOiAxNXB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgbWF4LXdpZHRoOiA3MCU7XG59XG5cbi5zZXR0aW5ncy10YWIgLmZpbGUtc3lzdGVtLXBhdGgge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uc2V0dGluZ3MtaW5mby1tZXNzYWdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgbWFyZ2luOiAyMHB4IDA7XG59XG5cbi5zZXR0aW5ncy10YWIuc2V0dGluZ3MtY29udGVudC5zZXR0aW5ncy1jb250YWluZXIge1xuICAgIC13ZWJraXQtY29sdW1uLXdpZHRoOiBpbml0aWFsO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLyojIHNvdXJjZVVSTD1wZXJzaXN0ZW5jZS93b3Jrc3BhY2VTZXR0aW5nc1RhYi5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm9kdWN0X3JlZ2lzdHJ5L2JhZGdlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wcm9kdWN0LXJlZ2lzdHJ5LWJhZGdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIHBhZGRpbmc6IDFweCAycHg7XG4gIHdoaXRlLXNwYWNlOiBwcmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnByb2R1Y3QtcmVnaXN0cnktYmFkZ2U6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IGF0dHIoZGF0YS1pbml0aWFsKTtcbiAgY29sb3I6ICMyMjI7XG59XG5cbi5oaWRlLWJhZGdlLXRpdGxlIC5wcm9kdWN0LXJlZ2lzdHJ5LWJhZGdlLXRpdGxlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLnByb2R1Y3QtcmVnaXN0cnktYmFkZ2UtdGl0bGUge1xuICBwYWRkaW5nLWxlZnQ6IDRweDtcbn1cbi8qIyBzb3VyY2VVUkw9cHJvZHVjdF9yZWdpc3RyeS9iYWRnZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm9kdWN0X3JlZ2lzdHJ5L3BvcHVwLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wcm9kdWN0LXJlZ2lzdHJ5LXBvcHVwIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBwYWRkaW5nOiAxNXB4IDQ1cHggMTVweCAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGJveC1zaGFkb3c6IDBweCAxcHggMnB4IDBweCBncmF5O1xufVxuXG4ucHJvZHVjdC1yZWdpc3RyeS1kb21haW4ge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucHJvZHVjdC1yZWdpc3RyeS1uYW1lIHtcbiAgICBwYWRkaW5nOiAxMHB4IDA7XG59XG5cbi5wcm9kdWN0LXJlZ2lzdHJ5LWxpbmsge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5kaXZbaXM9ZHQtY2xvc2UtYnV0dG9uXSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1cHg7XG4gIHJpZ2h0OiA1cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9cHJvZHVjdF9yZWdpc3RyeS9wb3B1cC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjb25zb2xlX2NvdW50ZXJzL2Vycm9yV2FybmluZ0NvdW50ZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcGFkZGluZzogMCAycHg7XG4gICAgbWluLXdpZHRoOiAyNnB4O1xufVxuXG46aG9zdDpob3ZlciB7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5jb3VudGVyLWl0ZW0ge1xuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XG59XG5cbi5jb3VudGVyLWl0ZW0gbGFiZWwge1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbn1cblxuLmNvdW50ZXItaXRlbS5jb3VudGVyLWl0ZW0tZmlyc3Qge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4vKiMgc291cmNlVVJMPWNvbnNvbGVfY291bnRlcnMvZXJyb3JXYXJuaW5nQ291bnRlci5jc3MgKi8iOzwhLS0KICogQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+CjwhZG9jdHlwZSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9Im9iamVjdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICdzZWxmJyAndW5zYWZlLWV2YWwnICd1bnNhZmUtaW5saW5lJyAiPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idG9vbGJveC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PlJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbigndG9vbGJveCcpOzwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ1bmRvY2tlZCIgaWQ9Ii1ibGluay1kZXYtdG9vbHMiPjwvYm9keT4KPC9odG1sPgpjb25zdCBhbGxEZXNjcmlwdG9ycz1bXTtsZXQgYXBwbGljYXRpb25EZXNjcmlwdG9yO2NvbnN0IF9sb2FkZWRTY3JpcHRzPXt9O2Zvcihjb25zdCBrIG9mW10pe30KKGZ1bmN0aW9uKCl7Y29uc3QgYmFzZVVybD1zZWxmLmxvY2F0aW9uP3NlbGYubG9jYXRpb24ub3JpZ2luK3NlbGYubG9jYXRpb24ucGF0aG5hbWU6Jyc7c2VsZi5faW1wb3J0U2NyaXB0UGF0aFByZWZpeD1iYXNlVXJsLnN1YnN0cmluZygwLGJhc2VVcmwubGFzdEluZGV4T2YoJy8nKSsxKTt9KSgpO2NvbnN0IFJFTU9URV9NT0RVTEVfRkFMTEJBQ0tfUkVWSVNJT049J0AwMTBkZGNmZGEyNDY5NzVkMTk0OTY0Y2NmMjAwMzhlYmJkZWM2MDg0Jzt2YXIgUnVudGltZT1jbGFzc3tjb25zdHJ1Y3RvcihkZXNjcmlwdG9ycyl7dGhpcy5fbW9kdWxlcz1bXTt0aGlzLl9tb2R1bGVzTWFwPXt9O3RoaXMuX2V4dGVuc2lvbnM9W107dGhpcy5fY2FjaGVkVHlwZUNsYXNzZXM9e307dGhpcy5fZGVzY3JpcHRvcnNNYXA9e307Zm9yKGxldCBpPTA7aTxkZXNjcmlwdG9ycy5sZW5ndGg7KytpKQp0aGlzLl9yZWdpc3Rlck1vZHVsZShkZXNjcmlwdG9yc1tpXSk7UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZUNhbGxiYWNrKCk7fQpzdGF0aWMgbG9hZFJlc291cmNlUHJvbWlzZSh1cmwpe3JldHVybiBuZXcgUHJvbWlzZShsb2FkKTtmdW5jdGlvbiBsb2FkKGZ1bGZpbGwscmVqZWN0KXtjb25zdCB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7eGhyLm9wZW4oJ0dFVCcsdXJsLHRydWUpO3hoci5vbnJlYWR5c3RhdGVjaGFuZ2U9b25yZWFkeXN0YXRlY2hhbmdlO2Z1bmN0aW9uIG9ucmVhZHlzdGF0ZWNoYW5nZShlKXtpZih4aHIucmVhZHlTdGF0ZSE9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpCnJldHVybjtjb25zdCBzdGF0dXM9L15IVFRQXC8xLjEgNDA0Ly50ZXN0KGUudGFyZ2V0LnJlc3BvbnNlKT80MDQ6eGhyLnN0YXR1cztpZihbMCwyMDAsMzA0XS5pbmRleE9mKHN0YXR1cyk9PT0tMSkKcmVqZWN0KG5ldyBFcnJvcignV2hpbGUgbG9hZGluZyBmcm9tIHVybCAnK3VybCsnIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIHN0YXR1cyBvZiAnK3N0YXR1cykpO2Vsc2UKZnVsZmlsbChlLnRhcmdldC5yZXNwb25zZSk7fQp4aHIuc2VuZChudWxsKTt9fQpzdGF0aWMgbG9hZFJlc291cmNlUHJvbWlzZVdpdGhGYWxsYmFjayh1cmwpe3JldHVybiBSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UodXJsKS5jYXRjaChlcnI9Pntjb25zdCB1cmxXaXRoRmFsbGJhY2tWZXJzaW9uPXVybC5yZXBsYWNlKC9AWzAtOWEtZl17NDB9LyxSRU1PVEVfTU9EVUxFX0ZBTExCQUNLX1JFVklTSU9OKTtpZih1cmxXaXRoRmFsbGJhY2tWZXJzaW9uPT09dXJsfHwhdXJsLmluY2x1ZGVzKCdhdWRpdHMyX3dvcmtlcl9tb2R1bGUnKSkKdGhyb3cgZXJyO3JldHVybiBSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UodXJsV2l0aEZhbGxiYWNrVmVyc2lvbik7fSk7fQpzdGF0aWMgbm9ybWFsaXplUGF0aChwYXRoKXtpZihwYXRoLmluZGV4T2YoJy4uJyk9PT0tMSYmcGF0aC5pbmRleE9mKCcuJyk9PT0tMSkKcmV0dXJuIHBhdGg7Y29uc3Qgbm9ybWFsaXplZFNlZ21lbnRzPVtdO2NvbnN0IHNlZ21lbnRzPXBhdGguc3BsaXQoJy8nKTtmb3IobGV0IGk9MDtpPHNlZ21lbnRzLmxlbmd0aDtpKyspe2NvbnN0IHNlZ21lbnQ9c2VnbWVudHNbaV07aWYoc2VnbWVudD09PScuJykKY29udGludWU7ZWxzZSBpZihzZWdtZW50PT09Jy4uJykKbm9ybWFsaXplZFNlZ21lbnRzLnBvcCgpO2Vsc2UgaWYoc2VnbWVudCkKbm9ybWFsaXplZFNlZ21lbnRzLnB1c2goc2VnbWVudCk7fQpsZXQgbm9ybWFsaXplZFBhdGg9bm9ybWFsaXplZFNlZ21lbnRzLmpvaW4oJy8nKTtpZihub3JtYWxpemVkUGF0aFtub3JtYWxpemVkUGF0aC5sZW5ndGgtMV09PT0nLycpCnJldHVybiBub3JtYWxpemVkUGF0aDtpZihwYXRoWzBdPT09Jy8nJiZub3JtYWxpemVkUGF0aCkKbm9ybWFsaXplZFBhdGg9Jy8nK25vcm1hbGl6ZWRQYXRoO2lmKChwYXRoW3BhdGgubGVuZ3RoLTFdPT09Jy8nKXx8KHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aC0xXT09PScuJyl8fChzZWdtZW50c1tzZWdtZW50cy5sZW5ndGgtMV09PT0nLi4nKSkKbm9ybWFsaXplZFBhdGg9bm9ybWFsaXplZFBhdGgrJy8nO3JldHVybiBub3JtYWxpemVkUGF0aDt9CnN0YXRpYyBfbG9hZFNjcmlwdHNQcm9taXNlKHNjcmlwdE5hbWVzLGJhc2Upe2NvbnN0IHByb21pc2VzPVtdO2NvbnN0IHVybHM9W107Y29uc3Qgc291cmNlcz1uZXcgQXJyYXkoc2NyaXB0TmFtZXMubGVuZ3RoKTtsZXQgc2NyaXB0VG9FdmFsPTA7Zm9yKGxldCBpPTA7aTxzY3JpcHROYW1lcy5sZW5ndGg7KytpKXtjb25zdCBzY3JpcHROYW1lPXNjcmlwdE5hbWVzW2ldO2xldCBzb3VyY2VVUkw9KGJhc2V8fHNlbGYuX2ltcG9ydFNjcmlwdFBhdGhQcmVmaXgpK3NjcmlwdE5hbWU7Y29uc3Qgc2NoZW1hSW5kZXg9c291cmNlVVJMLmluZGV4T2YoJzovLycpKzM7bGV0IHBhdGhJbmRleD1zb3VyY2VVUkwuaW5kZXhPZignLycsc2NoZW1hSW5kZXgpO2lmKHBhdGhJbmRleD09PS0xKQpwYXRoSW5kZXg9c291cmNlVVJMLmxlbmd0aDtzb3VyY2VVUkw9c291cmNlVVJMLnN1YnN0cmluZygwLHBhdGhJbmRleCkrUnVudGltZS5ub3JtYWxpemVQYXRoKHNvdXJjZVVSTC5zdWJzdHJpbmcocGF0aEluZGV4KSk7aWYoX2xvYWRlZFNjcmlwdHNbc291cmNlVVJMXSkKY29udGludWU7dXJscy5wdXNoKHNvdXJjZVVSTCk7Y29uc3QgbG9hZFJlc291cmNlUHJvbWlzZT1iYXNlP1J1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZVdpdGhGYWxsYmFjayhzb3VyY2VVUkwpOlJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShzb3VyY2VVUkwpO3Byb21pc2VzLnB1c2gobG9hZFJlc291cmNlUHJvbWlzZS50aGVuKHNjcmlwdFNvdXJjZUxvYWRlZC5iaW5kKG51bGwsaSksc2NyaXB0U291cmNlTG9hZGVkLmJpbmQobnVsbCxpLHVuZGVmaW5lZCkpKTt9CnJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih1bmRlZmluZWQpO2Z1bmN0aW9uIHNjcmlwdFNvdXJjZUxvYWRlZChzY3JpcHROdW1iZXIsc2NyaXB0U291cmNlKXtzb3VyY2VzW3NjcmlwdE51bWJlcl09c2NyaXB0U291cmNlfHwnJzt3aGlsZSh0eXBlb2Ygc291cmNlc1tzY3JpcHRUb0V2YWxdIT09J3VuZGVmaW5lZCcpe2V2YWx1YXRlU2NyaXB0KHVybHNbc2NyaXB0VG9FdmFsXSxzb3VyY2VzW3NjcmlwdFRvRXZhbF0pOysrc2NyaXB0VG9FdmFsO319CmZ1bmN0aW9uIGV2YWx1YXRlU2NyaXB0KHNvdXJjZVVSTCxzY3JpcHRTb3VyY2Upe19sb2FkZWRTY3JpcHRzW3NvdXJjZVVSTF09dHJ1ZTtpZighc2NyaXB0U291cmNlKXtjb25zb2xlLmVycm9yKCdFbXB0eSByZXNwb25zZSBhcnJpdmVkIGZvciBzY3JpcHQgXCcnK3NvdXJjZVVSTCsnXCcnKTtyZXR1cm47fQpzZWxmLmV2YWwoc2NyaXB0U291cmNlKydcbi8vIyBzb3VyY2VVUkw9Jytzb3VyY2VVUkwpO319CnN0YXRpYyBfbG9hZFJlc291cmNlSW50b0NhY2hlKHVybCxhcHBlbmRTb3VyY2VVUkwpe3JldHVybiBSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UodXJsKS50aGVuKGNhY2hlUmVzb3VyY2UuYmluZCh0aGlzLHVybCksY2FjaGVSZXNvdXJjZS5iaW5kKHRoaXMsdXJsLHVuZGVmaW5lZCkpO2Z1bmN0aW9uIGNhY2hlUmVzb3VyY2UocGF0aCxjb250ZW50KXtpZighY29udGVudCl7Y29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2U6ICcrcGF0aCk7cmV0dXJuO30KY29uc3Qgc291cmNlVVJMPWFwcGVuZFNvdXJjZVVSTD9SdW50aW1lLnJlc29sdmVTb3VyY2VVUkwocGF0aCk6Jyc7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbcGF0aF09Y29udGVudCtzb3VyY2VVUkw7fX0Kc3RhdGljIGFzeW5jIHJ1bnRpbWVSZWFkeSgpe3JldHVybiBSdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlO30Kc3RhdGljIGFzeW5jIHN0YXJ0QXBwbGljYXRpb24oYXBwTmFtZSl7Y29uc29sZS50aW1lU3RhbXAoJ1J1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbicpO2NvbnN0IGFsbERlc2NyaXB0b3JzQnlOYW1lPXt9O2ZvcihsZXQgaT0wO2k8YWxsRGVzY3JpcHRvcnMubGVuZ3RoOysraSl7Y29uc3QgZD1hbGxEZXNjcmlwdG9yc1tpXTthbGxEZXNjcmlwdG9yc0J5TmFtZVtkWyduYW1lJ11dPWQ7fQppZighYXBwbGljYXRpb25EZXNjcmlwdG9yKXtsZXQgZGF0YT1hd2FpdCBSdW50aW1lLmxvYWRSZXNvdXJjZVByb21pc2UoYXBwTmFtZSsnLmpzb24nKTthcHBsaWNhdGlvbkRlc2NyaXB0b3I9SlNPTi5wYXJzZShkYXRhKTtsZXQgZGVzY3JpcHRvcj1hcHBsaWNhdGlvbkRlc2NyaXB0b3I7d2hpbGUoZGVzY3JpcHRvci5leHRlbmRzKXtkYXRhPWF3YWl0IFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShkZXNjcmlwdG9yLmV4dGVuZHMrJy5qc29uJyk7ZGVzY3JpcHRvcj1KU09OLnBhcnNlKGRhdGEpO2FwcGxpY2F0aW9uRGVzY3JpcHRvci5tb2R1bGVzPWRlc2NyaXB0b3IubW9kdWxlcy5jb25jYXQoYXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXMpO319CmNvbnN0IGNvbmZpZ3VyYXRpb249YXBwbGljYXRpb25EZXNjcmlwdG9yLm1vZHVsZXM7Y29uc3QgbW9kdWxlSlNPTlByb21pc2VzPVtdO2NvbnN0IGNvcmVNb2R1bGVOYW1lcz1bXTtmb3IobGV0IGk9MDtpPGNvbmZpZ3VyYXRpb24ubGVuZ3RoOysraSl7Y29uc3QgZGVzY3JpcHRvcj1jb25maWd1cmF0aW9uW2ldO2NvbnN0IG5hbWU9ZGVzY3JpcHRvclsnbmFtZSddO2NvbnN0IG1vZHVsZUpTT049YWxsRGVzY3JpcHRvcnNCeU5hbWVbbmFtZV07aWYobW9kdWxlSlNPTikKbW9kdWxlSlNPTlByb21pc2VzLnB1c2goUHJvbWlzZS5yZXNvbHZlKG1vZHVsZUpTT04pKTtlbHNlCm1vZHVsZUpTT05Qcm9taXNlcy5wdXNoKFJ1bnRpbWUubG9hZFJlc291cmNlUHJvbWlzZShuYW1lKycvbW9kdWxlLmpzb24nKS50aGVuKEpTT04ucGFyc2UuYmluZChKU09OKSkpO2lmKGRlc2NyaXB0b3JbJ3R5cGUnXT09PSdhdXRvc3RhcnQnKQpjb3JlTW9kdWxlTmFtZXMucHVzaChuYW1lKTt9CmNvbnN0IG1vZHVsZURlc2NyaXB0b3JzPWF3YWl0IFByb21pc2UuYWxsKG1vZHVsZUpTT05Qcm9taXNlcyk7Zm9yKGxldCBpPTA7aTxtb2R1bGVEZXNjcmlwdG9ycy5sZW5ndGg7KytpKXttb2R1bGVEZXNjcmlwdG9yc1tpXS5uYW1lPWNvbmZpZ3VyYXRpb25baV1bJ25hbWUnXTttb2R1bGVEZXNjcmlwdG9yc1tpXS5jb25kaXRpb249Y29uZmlndXJhdGlvbltpXVsnY29uZGl0aW9uJ107bW9kdWxlRGVzY3JpcHRvcnNbaV0ucmVtb3RlPWNvbmZpZ3VyYXRpb25baV1bJ3R5cGUnXT09PSdyZW1vdGUnO30Kc2VsZi5ydW50aW1lPW5ldyBSdW50aW1lKG1vZHVsZURlc2NyaXB0b3JzKTtpZihjb3JlTW9kdWxlTmFtZXMpCnJldHVybihzZWxmLnJ1bnRpbWUuX2xvYWRBdXRvU3RhcnRNb2R1bGVzKGNvcmVNb2R1bGVOYW1lcykpO30Kc3RhdGljIHN0YXJ0V29ya2VyKGFwcE5hbWUpe3JldHVybiBSdW50aW1lLnN0YXJ0QXBwbGljYXRpb24oYXBwTmFtZSkudGhlbihzZW5kV29ya2VyUmVhZHkpO2Z1bmN0aW9uIHNlbmRXb3JrZXJSZWFkeSgpe3NlbGYucG9zdE1lc3NhZ2UoJ3dvcmtlclJlYWR5Jyk7fX0Kc3RhdGljIHF1ZXJ5UGFyYW0obmFtZSl7cmV0dXJuIFJ1bnRpbWUuX3F1ZXJ5UGFyYW1zT2JqZWN0W25hbWVdfHxudWxsO30Kc3RhdGljIHF1ZXJ5UGFyYW1zU3RyaW5nKCl7cmV0dXJuIGxvY2F0aW9uLnNlYXJjaDt9CnN0YXRpYyBfZXhwZXJpbWVudHNTZXR0aW5nKCl7dHJ5e3JldHVybihKU09OLnBhcnNlKHNlbGYubG9jYWxTdG9yYWdlJiZzZWxmLmxvY2FsU3RvcmFnZVsnZXhwZXJpbWVudHMnXT9zZWxmLmxvY2FsU3RvcmFnZVsnZXhwZXJpbWVudHMnXTone30nKSk7fWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBsb2NhbFN0b3JhZ2VbXCdleHBlcmltZW50c1wnXScpO3JldHVybnt9O319CnN0YXRpYyBfYXNzZXJ0KHZhbHVlLG1lc3NhZ2Upe2lmKHZhbHVlKQpyZXR1cm47UnVudGltZS5fb3JpZ2luYWxBc3NlcnQuY2FsbChSdW50aW1lLl9jb25zb2xlLHZhbHVlLG1lc3NhZ2UrJyAnK25ldyBFcnJvcigpLnN0YWNrKTt9CnN0YXRpYyBzZXRQbGF0Zm9ybShwbGF0Zm9ybSl7UnVudGltZS5fcGxhdGZvcm09cGxhdGZvcm07fQpzdGF0aWMgX2lzRGVzY3JpcHRvckVuYWJsZWQoZGVzY3JpcHRvcil7Y29uc3QgYWN0aXZhdG9yRXhwZXJpbWVudD1kZXNjcmlwdG9yWydleHBlcmltZW50J107aWYoYWN0aXZhdG9yRXhwZXJpbWVudD09PScqJykKcmV0dXJuIFJ1bnRpbWUuZXhwZXJpbWVudHMuc3VwcG9ydEVuYWJsZWQoKTtpZihhY3RpdmF0b3JFeHBlcmltZW50JiZhY3RpdmF0b3JFeHBlcmltZW50LnN0YXJ0c1dpdGgoJyEnKSYmUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoYWN0aXZhdG9yRXhwZXJpbWVudC5zdWJzdHJpbmcoMSkpKQpyZXR1cm4gZmFsc2U7aWYoYWN0aXZhdG9yRXhwZXJpbWVudCYmIWFjdGl2YXRvckV4cGVyaW1lbnQuc3RhcnRzV2l0aCgnIScpJiYhUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoYWN0aXZhdG9yRXhwZXJpbWVudCkpCnJldHVybiBmYWxzZTtjb25zdCBjb25kaXRpb249ZGVzY3JpcHRvclsnY29uZGl0aW9uJ107aWYoY29uZGl0aW9uJiYhY29uZGl0aW9uLnN0YXJ0c1dpdGgoJyEnKSYmIVJ1bnRpbWUucXVlcnlQYXJhbShjb25kaXRpb24pKQpyZXR1cm4gZmFsc2U7aWYoY29uZGl0aW9uJiZjb25kaXRpb24uc3RhcnRzV2l0aCgnIScpJiZSdW50aW1lLnF1ZXJ5UGFyYW0oY29uZGl0aW9uLnN1YnN0cmluZygxKSkpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9CnN0YXRpYyByZXNvbHZlU291cmNlVVJMKHBhdGgpe2xldCBzb3VyY2VVUkw9c2VsZi5sb2NhdGlvbi5ocmVmO2lmKHNlbGYubG9jYXRpb24uc2VhcmNoKQpzb3VyY2VVUkw9c291cmNlVVJMLnJlcGxhY2Uoc2VsZi5sb2NhdGlvbi5zZWFyY2gsJycpO3NvdXJjZVVSTD1zb3VyY2VVUkwuc3Vic3RyaW5nKDAsc291cmNlVVJMLmxhc3RJbmRleE9mKCcvJykrMSkrcGF0aDtyZXR1cm4nXG4vKiMgc291cmNlVVJMPScrc291cmNlVVJMKycgKi8nO30KdXNlVGVzdEJhc2UoKXtSdW50aW1lLl9yZW1vdGVCYXNlPSdodHRwOi8vbG9jYWxob3N0OjgwMDAvaW5zcGVjdG9yLXNvdXJjZXMvJztpZihSdW50aW1lLnF1ZXJ5UGFyYW0oJ2RlYnVnRnJvbnRlbmQnKSkKUnVudGltZS5fcmVtb3RlQmFzZSs9J2RlYnVnLyc7fQpfcmVnaXN0ZXJNb2R1bGUoZGVzY3JpcHRvcil7Y29uc3QgbW9kdWxlPW5ldyBSdW50aW1lLk1vZHVsZSh0aGlzLGRlc2NyaXB0b3IpO3RoaXMuX21vZHVsZXMucHVzaChtb2R1bGUpO3RoaXMuX21vZHVsZXNNYXBbZGVzY3JpcHRvclsnbmFtZSddXT1tb2R1bGU7fQpsb2FkTW9kdWxlUHJvbWlzZShtb2R1bGVOYW1lKXtyZXR1cm4gdGhpcy5fbW9kdWxlc01hcFttb2R1bGVOYW1lXS5fbG9hZFByb21pc2UoKTt9Cl9sb2FkQXV0b1N0YXJ0TW9kdWxlcyhtb2R1bGVOYW1lcyl7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGxldCBpPTA7aTxtb2R1bGVOYW1lcy5sZW5ndGg7KytpKQpwcm9taXNlcy5wdXNoKHRoaXMubG9hZE1vZHVsZVByb21pc2UobW9kdWxlTmFtZXNbaV0pKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30KX2NoZWNrRXh0ZW5zaW9uQXBwbGljYWJpbGl0eShleHRlbnNpb24scHJlZGljYXRlKXtpZighcHJlZGljYXRlKQpyZXR1cm4gZmFsc2U7Y29uc3QgY29udGV4dFR5cGVzPWV4dGVuc2lvbi5kZXNjcmlwdG9yKCkuY29udGV4dFR5cGVzO2lmKCFjb250ZXh0VHlwZXMpCnJldHVybiB0cnVlO2ZvcihsZXQgaT0wO2k8Y29udGV4dFR5cGVzLmxlbmd0aDsrK2kpe2NvbnN0IGNvbnRleHRUeXBlPXRoaXMuX3Jlc29sdmUoY29udGV4dFR5cGVzW2ldKTtjb25zdCBpc01hdGNoaW5nPSEhY29udGV4dFR5cGUmJnByZWRpY2F0ZShjb250ZXh0VHlwZSk7aWYoaXNNYXRjaGluZykKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQppc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHQoZXh0ZW5zaW9uLGNvbnRleHQpe2lmKCFjb250ZXh0KQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fY2hlY2tFeHRlbnNpb25BcHBsaWNhYmlsaXR5KGV4dGVuc2lvbixpc0luc3RhbmNlT2YpO2Z1bmN0aW9uIGlzSW5zdGFuY2VPZih0YXJnZXRUeXBlKXtyZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIHRhcmdldFR5cGU7fX0KaXNFeHRlbnNpb25BcHBsaWNhYmxlVG9Db250ZXh0VHlwZXMoZXh0ZW5zaW9uLGN1cnJlbnRDb250ZXh0VHlwZXMpe2lmKCFleHRlbnNpb24uZGVzY3JpcHRvcigpLmNvbnRleHRUeXBlcykKcmV0dXJuIHRydWU7cmV0dXJuIHRoaXMuX2NoZWNrRXh0ZW5zaW9uQXBwbGljYWJpbGl0eShleHRlbnNpb24sY3VycmVudENvbnRleHRUeXBlcz9pc0NvbnRleHRUeXBlS25vd246bnVsbCk7ZnVuY3Rpb24gaXNDb250ZXh0VHlwZUtub3duKHRhcmdldFR5cGUpe3JldHVybiBjdXJyZW50Q29udGV4dFR5cGVzLmhhcyh0YXJnZXRUeXBlKTt9fQpleHRlbnNpb25zKHR5cGUsY29udGV4dCxzb3J0QnlUaXRsZSl7cmV0dXJuIHRoaXMuX2V4dGVuc2lvbnMuZmlsdGVyKGZpbHRlcikuc29ydChzb3J0QnlUaXRsZT90aXRsZUNvbXBhcmF0b3I6b3JkZXJDb21wYXJhdG9yKTtmdW5jdGlvbiBmaWx0ZXIoZXh0ZW5zaW9uKXtpZihleHRlbnNpb24uX3R5cGUhPT10eXBlJiZleHRlbnNpb24uX3R5cGVDbGFzcygpIT09dHlwZSkKcmV0dXJuIGZhbHNlO2lmKCFleHRlbnNpb24uZW5hYmxlZCgpKQpyZXR1cm4gZmFsc2U7cmV0dXJuIWNvbnRleHR8fGV4dGVuc2lvbi5pc0FwcGxpY2FibGUoY29udGV4dCk7fQpmdW5jdGlvbiBvcmRlckNvbXBhcmF0b3IoZXh0ZW5zaW9uMSxleHRlbnNpb24yKXtjb25zdCBvcmRlcjE9ZXh0ZW5zaW9uMS5kZXNjcmlwdG9yKClbJ29yZGVyJ118fDA7Y29uc3Qgb3JkZXIyPWV4dGVuc2lvbjIuZGVzY3JpcHRvcigpWydvcmRlciddfHwwO3JldHVybiBvcmRlcjEtb3JkZXIyO30KZnVuY3Rpb24gdGl0bGVDb21wYXJhdG9yKGV4dGVuc2lvbjEsZXh0ZW5zaW9uMil7Y29uc3QgdGl0bGUxPWV4dGVuc2lvbjEudGl0bGUoKXx8Jyc7Y29uc3QgdGl0bGUyPWV4dGVuc2lvbjIudGl0bGUoKXx8Jyc7cmV0dXJuIHRpdGxlMS5sb2NhbGVDb21wYXJlKHRpdGxlMik7fX0KZXh0ZW5zaW9uKHR5cGUsY29udGV4dCl7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucyh0eXBlLGNvbnRleHQpWzBdfHxudWxsO30KYWxsSW5zdGFuY2VzKHR5cGUsY29udGV4dCl7cmV0dXJuIFByb21pc2UuYWxsKHRoaXMuZXh0ZW5zaW9ucyh0eXBlLGNvbnRleHQpLm1hcChleHRlbnNpb249PmV4dGVuc2lvbi5pbnN0YW5jZSgpKSk7fQpfcmVzb2x2ZSh0eXBlTmFtZSl7aWYoIXRoaXMuX2NhY2hlZFR5cGVDbGFzc2VzW3R5cGVOYW1lXSl7Y29uc3QgcGF0aD10eXBlTmFtZS5zcGxpdCgnLicpO2xldCBvYmplY3Q9c2VsZjtmb3IobGV0IGk9MDtvYmplY3QmJihpPHBhdGgubGVuZ3RoKTsrK2kpCm9iamVjdD1vYmplY3RbcGF0aFtpXV07aWYob2JqZWN0KQp0aGlzLl9jYWNoZWRUeXBlQ2xhc3Nlc1t0eXBlTmFtZV09KG9iamVjdCk7fQpyZXR1cm4gdGhpcy5fY2FjaGVkVHlwZUNsYXNzZXNbdHlwZU5hbWVdfHxudWxsO30Kc2hhcmVkSW5zdGFuY2UoY29uc3RydWN0b3JGdW5jdGlvbil7aWYoUnVudGltZS5faW5zdGFuY2VTeW1ib2wgaW4gY29uc3RydWN0b3JGdW5jdGlvbiYmT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhjb25zdHJ1Y3RvckZ1bmN0aW9uKS5pbmNsdWRlcyhSdW50aW1lLl9pbnN0YW5jZVN5bWJvbCkpCnJldHVybiBjb25zdHJ1Y3RvckZ1bmN0aW9uW1J1bnRpbWUuX2luc3RhbmNlU3ltYm9sXTtjb25zdCBpbnN0YW5jZT1uZXcgY29uc3RydWN0b3JGdW5jdGlvbigpO2NvbnN0cnVjdG9yRnVuY3Rpb25bUnVudGltZS5faW5zdGFuY2VTeW1ib2xdPWluc3RhbmNlO3JldHVybiBpbnN0YW5jZTt9fTtSdW50aW1lLl9xdWVyeVBhcmFtc09iamVjdD17X19wcm90b19fOm51bGx9O1J1bnRpbWUuX2luc3RhbmNlU3ltYm9sPVN5bWJvbCgnaW5zdGFuY2UnKTtSdW50aW1lLmNhY2hlZFJlc291cmNlcz17X19wcm90b19fOm51bGx9O1J1bnRpbWUuX2NvbnNvbGU9Y29uc29sZTtSdW50aW1lLl9vcmlnaW5hbEFzc2VydD1jb25zb2xlLmFzc2VydDtSdW50aW1lLl9wbGF0Zm9ybT0nJztSdW50aW1lLk1vZHVsZURlc2NyaXB0b3I9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLm5hbWU7dGhpcy5leHRlbnNpb25zO3RoaXMuZGVwZW5kZW5jaWVzO3RoaXMuc2NyaXB0czt0aGlzLmNvbmRpdGlvbjt0aGlzLnJlbW90ZTt9fTtSdW50aW1lLkV4dGVuc2lvbkRlc2NyaXB0b3I9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU7dGhpcy5jbGFzc05hbWU7dGhpcy5mYWN0b3J5TmFtZTt0aGlzLmNvbnRleHRUeXBlczt9fTtSdW50aW1lLk1vZHVsZT1jbGFzc3tjb25zdHJ1Y3RvcihtYW5hZ2VyLGRlc2NyaXB0b3Ipe3RoaXMuX21hbmFnZXI9bWFuYWdlcjt0aGlzLl9kZXNjcmlwdG9yPWRlc2NyaXB0b3I7dGhpcy5fbmFtZT1kZXNjcmlwdG9yLm5hbWU7dGhpcy5fZXh0ZW5zaW9ucz1bXTt0aGlzLl9leHRlbnNpb25zQnlDbGFzc05hbWU9bmV3IE1hcCgpO2NvbnN0IGV4dGVuc2lvbnM9KGRlc2NyaXB0b3IuZXh0ZW5zaW9ucyk7Zm9yKGxldCBpPTA7ZXh0ZW5zaW9ucyYmaTxleHRlbnNpb25zLmxlbmd0aDsrK2kpe2NvbnN0IGV4dGVuc2lvbj1uZXcgUnVudGltZS5FeHRlbnNpb24odGhpcyxleHRlbnNpb25zW2ldKTt0aGlzLl9tYW5hZ2VyLl9leHRlbnNpb25zLnB1c2goZXh0ZW5zaW9uKTt0aGlzLl9leHRlbnNpb25zLnB1c2goZXh0ZW5zaW9uKTt9CnRoaXMuX2xvYWRlZEZvclRlc3Q9ZmFsc2U7fQpuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQplbmFibGVkKCl7cmV0dXJuIFJ1bnRpbWUuX2lzRGVzY3JpcHRvckVuYWJsZWQodGhpcy5fZGVzY3JpcHRvcik7fQpyZXNvdXJjZShuYW1lKXtjb25zdCBmdWxsTmFtZT10aGlzLl9uYW1lKycvJytuYW1lO2NvbnN0IGNvbnRlbnQ9UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbZnVsbE5hbWVdO2lmKCFjb250ZW50KQp0aHJvdyBuZXcgRXJyb3IoZnVsbE5hbWUrJyBub3QgcHJlbG9hZGVkLiBDaGVjayBtb2R1bGUuanNvbicpO3JldHVybiBjb250ZW50O30KX2xvYWRQcm9taXNlKCl7aWYoIXRoaXMuZW5hYmxlZCgpKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNb2R1bGUgJyt0aGlzLl9uYW1lKycgaXMgbm90IGVuYWJsZWQnKSk7aWYodGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlKQpyZXR1cm4gdGhpcy5fcGVuZGluZ0xvYWRQcm9taXNlO2NvbnN0IGRlcGVuZGVuY2llcz10aGlzLl9kZXNjcmlwdG9yLmRlcGVuZGVuY2llcztjb25zdCBkZXBlbmRlbmN5UHJvbWlzZXM9W107Zm9yKGxldCBpPTA7ZGVwZW5kZW5jaWVzJiZpPGRlcGVuZGVuY2llcy5sZW5ndGg7KytpKQpkZXBlbmRlbmN5UHJvbWlzZXMucHVzaCh0aGlzLl9tYW5hZ2VyLl9tb2R1bGVzTWFwW2RlcGVuZGVuY2llc1tpXV0uX2xvYWRQcm9taXNlKCkpO3RoaXMuX3BlbmRpbmdMb2FkUHJvbWlzZT1Qcm9taXNlLmFsbChkZXBlbmRlbmN5UHJvbWlzZXMpLnRoZW4odGhpcy5fbG9hZFJlc291cmNlcy5iaW5kKHRoaXMpKS50aGVuKHRoaXMuX2xvYWRTY3JpcHRzLmJpbmQodGhpcykpLnRoZW4oKCk9PnRoaXMuX2xvYWRlZEZvclRlc3Q9dHJ1ZSk7cmV0dXJuIHRoaXMuX3BlbmRpbmdMb2FkUHJvbWlzZTt9Cl9sb2FkUmVzb3VyY2VzKCl7Y29uc3QgcmVzb3VyY2VzPXRoaXMuX2Rlc2NyaXB0b3JbJ3Jlc291cmNlcyddO2lmKCFyZXNvdXJjZXN8fCFyZXNvdXJjZXMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGxldCBpPTA7aTxyZXNvdXJjZXMubGVuZ3RoOysraSl7Y29uc3QgdXJsPXRoaXMuX21vZHVsYXJpemVVUkwocmVzb3VyY2VzW2ldKTtwcm9taXNlcy5wdXNoKFJ1bnRpbWUuX2xvYWRSZXNvdXJjZUludG9DYWNoZSh1cmwsdHJ1ZSkpO30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHVuZGVmaW5lZCk7fQpfbG9hZFNjcmlwdHMoKXtpZighdGhpcy5fZGVzY3JpcHRvci5zY3JpcHRzfHwhdGhpcy5fZGVzY3JpcHRvci5zY3JpcHRzLmxlbmd0aCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IHNwZWNpYWxDYXNlcz17J3Nkayc6J1NESycsJ2pzX3Nkayc6J0pTU0RLJywnYnJvd3Nlcl9zZGsnOidCcm93c2VyU0RLJywndWknOidVSScsJ29iamVjdF91aSc6J09iamVjdFVJJywnamF2YXNjcmlwdF9tZXRhZGF0YSc6J0phdmFTY3JpcHRNZXRhZGF0YScsJ3BlcmZfdWknOidQZXJmVUknLCdoYXJfaW1wb3J0ZXInOidIQVJJbXBvcnRlcicsJ3Nka190ZXN0X3J1bm5lcic6J1NES1Rlc3RSdW5uZXInLCdjcHVfcHJvZmlsZXJfdGVzdF9ydW5uZXInOidDUFVQcm9maWxlclRlc3RSdW5uZXInfTtjb25zdCBuYW1lc3BhY2U9c3BlY2lhbENhc2VzW3RoaXMuX25hbWVdfHx0aGlzLl9uYW1lLnNwbGl0KCdfJykubWFwKGE9PmEuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKSkuam9pbignJyk7c2VsZltuYW1lc3BhY2VdPXNlbGZbbmFtZXNwYWNlXXx8e307cmV0dXJuIFJ1bnRpbWUuX2xvYWRTY3JpcHRzUHJvbWlzZSh0aGlzLl9kZXNjcmlwdG9yLnNjcmlwdHMubWFwKHRoaXMuX21vZHVsYXJpemVVUkwsdGhpcyksdGhpcy5fcmVtb3RlQmFzZSgpKTt9Cl9tb2R1bGFyaXplVVJMKHJlc291cmNlTmFtZSl7cmV0dXJuIFJ1bnRpbWUubm9ybWFsaXplUGF0aCh0aGlzLl9uYW1lKycvJytyZXNvdXJjZU5hbWUpO30KX3JlbW90ZUJhc2UoKXtyZXR1cm4hUnVudGltZS5xdWVyeVBhcmFtKCdkZWJ1Z0Zyb250ZW5kJykmJnRoaXMuX2Rlc2NyaXB0b3IucmVtb3RlJiZSdW50aW1lLl9yZW1vdGVCYXNlfHx1bmRlZmluZWQ7fQpzdWJzdGl0dXRlVVJMKHZhbHVlKXtjb25zdCBiYXNlPXRoaXMuX3JlbW90ZUJhc2UoKXx8Jyc7cmV0dXJuIHZhbHVlLnJlcGxhY2UoL0B1cmxcKChbXlwpXSo/KVwpL2csY29udmVydFVSTC5iaW5kKHRoaXMpKTtmdW5jdGlvbiBjb252ZXJ0VVJMKG1hdGNoLHVybCl7cmV0dXJuIGJhc2UrdGhpcy5fbW9kdWxhcml6ZVVSTCh1cmwpO319fTtSdW50aW1lLkV4dGVuc2lvbj1jbGFzc3tjb25zdHJ1Y3Rvcihtb2R1bGUsZGVzY3JpcHRvcil7dGhpcy5fbW9kdWxlPW1vZHVsZTt0aGlzLl9kZXNjcmlwdG9yPWRlc2NyaXB0b3I7dGhpcy5fdHlwZT1kZXNjcmlwdG9yLnR5cGU7dGhpcy5faGFzVHlwZUNsYXNzPXRoaXMuX3R5cGUuY2hhckF0KDApPT09J0AnO3RoaXMuX2NsYXNzTmFtZT1kZXNjcmlwdG9yLmNsYXNzTmFtZXx8bnVsbDt0aGlzLl9mYWN0b3J5TmFtZT1kZXNjcmlwdG9yLmZhY3RvcnlOYW1lfHxudWxsO30KZGVzY3JpcHRvcigpe3JldHVybiB0aGlzLl9kZXNjcmlwdG9yO30KbW9kdWxlKCl7cmV0dXJuIHRoaXMuX21vZHVsZTt9CmVuYWJsZWQoKXtyZXR1cm4gdGhpcy5fbW9kdWxlLmVuYWJsZWQoKSYmUnVudGltZS5faXNEZXNjcmlwdG9yRW5hYmxlZCh0aGlzLmRlc2NyaXB0b3IoKSk7fQpfdHlwZUNsYXNzKCl7aWYoIXRoaXMuX2hhc1R5cGVDbGFzcykKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX21vZHVsZS5fbWFuYWdlci5fcmVzb2x2ZSh0aGlzLl90eXBlLnN1YnN0cmluZygxKSk7fQppc0FwcGxpY2FibGUoY29udGV4dCl7cmV0dXJuIHRoaXMuX21vZHVsZS5fbWFuYWdlci5pc0V4dGVuc2lvbkFwcGxpY2FibGVUb0NvbnRleHQodGhpcyxjb250ZXh0KTt9Cmluc3RhbmNlKCl7cmV0dXJuIHRoaXMuX21vZHVsZS5fbG9hZFByb21pc2UoKS50aGVuKHRoaXMuX2NyZWF0ZUluc3RhbmNlLmJpbmQodGhpcykpO30KY2FuSW5zdGFudGlhdGUoKXtyZXR1cm4hISh0aGlzLl9jbGFzc05hbWV8fHRoaXMuX2ZhY3RvcnlOYW1lKTt9Cl9jcmVhdGVJbnN0YW5jZSgpe2NvbnN0IGNsYXNzTmFtZT10aGlzLl9jbGFzc05hbWV8fHRoaXMuX2ZhY3RvcnlOYW1lO2lmKCFjbGFzc05hbWUpCnRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGluc3RhbnRpYXRlIGV4dGVuc2lvbiB3aXRoIG5vIGNsYXNzJyk7Y29uc3QgY29uc3RydWN0b3JGdW5jdGlvbj1zZWxmLmV2YWwoKGNsYXNzTmFtZSkpO2lmKCEoY29uc3RydWN0b3JGdW5jdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkKdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgaW5zdGFudGlhdGU6ICcrY2xhc3NOYW1lKTtpZih0aGlzLl9jbGFzc05hbWUpCnJldHVybiB0aGlzLl9tb2R1bGUuX21hbmFnZXIuc2hhcmVkSW5zdGFuY2UoY29uc3RydWN0b3JGdW5jdGlvbik7cmV0dXJuIG5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKHRoaXMpO30KdGl0bGUoKXtyZXR1cm4gdGhpcy5fZGVzY3JpcHRvclsndGl0bGUtJytSdW50aW1lLl9wbGF0Zm9ybV18fHRoaXMuX2Rlc2NyaXB0b3JbJ3RpdGxlJ107fQpoYXNDb250ZXh0VHlwZShjb250ZXh0VHlwZSl7Y29uc3QgY29udGV4dFR5cGVzPXRoaXMuZGVzY3JpcHRvcigpLmNvbnRleHRUeXBlcztpZighY29udGV4dFR5cGVzKQpyZXR1cm4gZmFsc2U7Zm9yKGxldCBpPTA7aTxjb250ZXh0VHlwZXMubGVuZ3RoOysraSl7aWYoY29udGV4dFR5cGU9PT10aGlzLl9tb2R1bGUuX21hbmFnZXIuX3Jlc29sdmUoY29udGV4dFR5cGVzW2ldKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fX07UnVudGltZS5FeHBlcmltZW50c1N1cHBvcnQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9zdXBwb3J0RW5hYmxlZD1SdW50aW1lLnF1ZXJ5UGFyYW0oJ2V4cGVyaW1lbnRzJykhPT1udWxsO3RoaXMuX2V4cGVyaW1lbnRzPVtdO3RoaXMuX2V4cGVyaW1lbnROYW1lcz17fTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHk9e307fQphbGxDb25maWd1cmFibGVFeHBlcmltZW50cygpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX2V4cGVyaW1lbnRzLmxlbmd0aDtpKyspe2NvbnN0IGV4cGVyaW1lbnQ9dGhpcy5fZXhwZXJpbWVudHNbaV07aWYoIXRoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50Lm5hbWVdKQpyZXN1bHQucHVzaChleHBlcmltZW50KTt9CnJldHVybiByZXN1bHQ7fQpzdXBwb3J0RW5hYmxlZCgpe3JldHVybiB0aGlzLl9zdXBwb3J0RW5hYmxlZDt9Cl9zZXRFeHBlcmltZW50c1NldHRpbmcodmFsdWUpe2lmKCFzZWxmLmxvY2FsU3RvcmFnZSkKcmV0dXJuO3NlbGYubG9jYWxTdG9yYWdlWydleHBlcmltZW50cyddPUpTT04uc3RyaW5naWZ5KHZhbHVlKTt9CnJlZ2lzdGVyKGV4cGVyaW1lbnROYW1lLGV4cGVyaW1lbnRUaXRsZSxoaWRkZW4pe1J1bnRpbWUuX2Fzc2VydCghdGhpcy5fZXhwZXJpbWVudE5hbWVzW2V4cGVyaW1lbnROYW1lXSwnRHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBvZiBleHBlcmltZW50ICcrZXhwZXJpbWVudE5hbWUpO3RoaXMuX2V4cGVyaW1lbnROYW1lc1tleHBlcmltZW50TmFtZV09dHJ1ZTt0aGlzLl9leHBlcmltZW50cy5wdXNoKG5ldyBSdW50aW1lLkV4cGVyaW1lbnQodGhpcyxleHBlcmltZW50TmFtZSxleHBlcmltZW50VGl0bGUsISFoaWRkZW4pKTt9CmlzRW5hYmxlZChleHBlcmltZW50TmFtZSl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKTtpZih0aGlzLl9lbmFibGVkVHJhbnNpZW50bHlbZXhwZXJpbWVudE5hbWVdKQpyZXR1cm4gdHJ1ZTtpZighdGhpcy5zdXBwb3J0RW5hYmxlZCgpKQpyZXR1cm4gZmFsc2U7cmV0dXJuISFSdW50aW1lLl9leHBlcmltZW50c1NldHRpbmcoKVtleHBlcmltZW50TmFtZV07fQpzZXRFbmFibGVkKGV4cGVyaW1lbnROYW1lLGVuYWJsZWQpe3RoaXMuX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZSk7Y29uc3QgZXhwZXJpbWVudHNTZXR0aW5nPVJ1bnRpbWUuX2V4cGVyaW1lbnRzU2V0dGluZygpO2V4cGVyaW1lbnRzU2V0dGluZ1tleHBlcmltZW50TmFtZV09ZW5hYmxlZDt0aGlzLl9zZXRFeHBlcmltZW50c1NldHRpbmcoZXhwZXJpbWVudHNTZXR0aW5nKTt9CnNldERlZmF1bHRFeHBlcmltZW50cyhleHBlcmltZW50TmFtZXMpe2ZvcihsZXQgaT0wO2k8ZXhwZXJpbWVudE5hbWVzLmxlbmd0aDsrK2kpe3RoaXMuX2NoZWNrRXhwZXJpbWVudChleHBlcmltZW50TmFtZXNbaV0pO3RoaXMuX2VuYWJsZWRUcmFuc2llbnRseVtleHBlcmltZW50TmFtZXNbaV1dPXRydWU7fX0KZW5hYmxlRm9yVGVzdChleHBlcmltZW50TmFtZSl7dGhpcy5fY2hlY2tFeHBlcmltZW50KGV4cGVyaW1lbnROYW1lKTt0aGlzLl9lbmFibGVkVHJhbnNpZW50bHlbZXhwZXJpbWVudE5hbWVdPXRydWU7fQpjbGVhckZvclRlc3QoKXt0aGlzLl9leHBlcmltZW50cz1bXTt0aGlzLl9leHBlcmltZW50TmFtZXM9e307dGhpcy5fZW5hYmxlZFRyYW5zaWVudGx5PXt9O30KY2xlYW5VcFN0YWxlRXhwZXJpbWVudHMoKXtjb25zdCBleHBlcmltZW50c1NldHRpbmc9UnVudGltZS5fZXhwZXJpbWVudHNTZXR0aW5nKCk7Y29uc3QgY2xlYW5lZFVwRXhwZXJpbWVudFNldHRpbmc9e307Zm9yKGxldCBpPTA7aTx0aGlzLl9leHBlcmltZW50cy5sZW5ndGg7KytpKXtjb25zdCBleHBlcmltZW50TmFtZT10aGlzLl9leHBlcmltZW50c1tpXS5uYW1lO2lmKGV4cGVyaW1lbnRzU2V0dGluZ1tleHBlcmltZW50TmFtZV0pCmNsZWFuZWRVcEV4cGVyaW1lbnRTZXR0aW5nW2V4cGVyaW1lbnROYW1lXT10cnVlO30KdGhpcy5fc2V0RXhwZXJpbWVudHNTZXR0aW5nKGNsZWFuZWRVcEV4cGVyaW1lbnRTZXR0aW5nKTt9Cl9jaGVja0V4cGVyaW1lbnQoZXhwZXJpbWVudE5hbWUpe1J1bnRpbWUuX2Fzc2VydCh0aGlzLl9leHBlcmltZW50TmFtZXNbZXhwZXJpbWVudE5hbWVdLCdVbmtub3duIGV4cGVyaW1lbnQgJytleHBlcmltZW50TmFtZSk7fX07UnVudGltZS5FeHBlcmltZW50PWNsYXNze2NvbnN0cnVjdG9yKGV4cGVyaW1lbnRzLG5hbWUsdGl0bGUsaGlkZGVuKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnRpdGxlPXRpdGxlO3RoaXMuaGlkZGVuPWhpZGRlbjt0aGlzLl9leHBlcmltZW50cz1leHBlcmltZW50czt9CmlzRW5hYmxlZCgpe3JldHVybiB0aGlzLl9leHBlcmltZW50cy5pc0VuYWJsZWQodGhpcy5uYW1lKTt9CnNldEVuYWJsZWQoZW5hYmxlZCl7dGhpcy5fZXhwZXJpbWVudHMuc2V0RW5hYmxlZCh0aGlzLm5hbWUsZW5hYmxlZCk7fX07eyhmdW5jdGlvbiBwYXJzZVF1ZXJ5UGFyYW1ldGVycygpe2NvbnN0IHF1ZXJ5UGFyYW1zPVJ1bnRpbWUucXVlcnlQYXJhbXNTdHJpbmcoKTtpZighcXVlcnlQYXJhbXMpCnJldHVybjtjb25zdCBwYXJhbXM9cXVlcnlQYXJhbXMuc3Vic3RyaW5nKDEpLnNwbGl0KCcmJyk7Zm9yKGxldCBpPTA7aTxwYXJhbXMubGVuZ3RoOysraSl7Y29uc3QgcGFpcj1wYXJhbXNbaV0uc3BsaXQoJz0nKTtjb25zdCBuYW1lPXBhaXIuc2hpZnQoKTtSdW50aW1lLl9xdWVyeVBhcmFtc09iamVjdFtuYW1lXT1wYWlyLmpvaW4oJz0nKTt9fSkoKTt9ClJ1bnRpbWUuZXhwZXJpbWVudHM9bmV3IFJ1bnRpbWUuRXhwZXJpbWVudHNTdXBwb3J0KCk7UnVudGltZS5fcnVudGltZVJlYWR5UHJvbWlzZUNhbGxiYWNrO1J1bnRpbWUuX3J1bnRpbWVSZWFkeVByb21pc2U9bmV3IFByb21pc2UoZnVsZmlsPT5SdW50aW1lLl9ydW50aW1lUmVhZHlQcm9taXNlQ2FsbGJhY2s9ZnVsZmlsKTtSdW50aW1lLl9yZW1vdGVCYXNlOyhmdW5jdGlvbiB2YWxpZGF0ZVJlbW90ZUJhc2UoKXtpZihsb2NhdGlvbi5ocmVmLnN0YXJ0c1dpdGgoJ2Nocm9tZS1kZXZ0b29sczovL2RldnRvb2xzL2J1bmRsZWQvJykmJlJ1bnRpbWUucXVlcnlQYXJhbSgncmVtb3RlQmFzZScpKXtjb25zdCB2ZXJzaW9uTWF0Y2g9L1wvc2VydmVfZmlsZVwvKEBbMC05YS16QS1aXSspXC8/JC8uZXhlYyhSdW50aW1lLnF1ZXJ5UGFyYW0oJ3JlbW90ZUJhc2UnKSk7aWYodmVyc2lvbk1hdGNoKQpSdW50aW1lLl9yZW1vdGVCYXNlPWAke2xvY2F0aW9uLm9yaWdpbn0vcmVtb3RlL3NlcnZlX2ZpbGUvJHt2ZXJzaW9uTWF0Y2hbMV19L2A7fX0pKCk7ZnVuY3Rpb24gU2VydmljZVBvcnQoKXt9ClNlcnZpY2VQb3J0LnByb3RvdHlwZT17c2V0SGFuZGxlcnMobWVzc2FnZUhhbmRsZXIsY2xvc2VIYW5kbGVyKXt9LHNlbmQobWVzc2FnZSl7fSxjbG9zZSgpe319O3ZhciBydW50aW1lO2FsbERlc2NyaXB0b3JzLnB1c2goLi4uW3siZGVwZW5kZW5jaWVzIjpbXSwibmFtZSI6InBsYXRmb3JtIn0seyJkZXBlbmRlbmNpZXMiOlsicGxhdGZvcm0iLCJkb21fZXh0ZW5zaW9uIl0sIm5hbWUiOiJ0b29sYm94X2Jvb3RzdHJhcCJ9LHsiZGVwZW5kZW5jaWVzIjpbInBsYXRmb3JtIl0sIm5hbWUiOiJkb21fZXh0ZW5zaW9uIn1dKTthcHBsaWNhdGlvbkRlc2NyaXB0b3I9eyJoYXNfaHRtbCI6dHJ1ZSwibW9kdWxlcyI6W3sidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJwbGF0Zm9ybSJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJ0b29sYm94X2Jvb3RzdHJhcCJ9LHsidHlwZSI6ImF1dG9zdGFydCIsIm5hbWUiOiJkb21fZXh0ZW5zaW9uIn1dfQpzZWxmWydQbGF0Zm9ybSddPXNlbGZbJ1BsYXRmb3JtJ118fHt9O2xldCBBcnJheUxpa2U7ZnVuY3Rpb24gbW9kKG0sbil7cmV0dXJuKChtJW4pK24pJW47fQpTdHJpbmcucHJvdG90eXBlLmZpbmRBbGw9ZnVuY3Rpb24oc3RyaW5nKXtjb25zdCBtYXRjaGVzPVtdO2xldCBpPXRoaXMuaW5kZXhPZihzdHJpbmcpO3doaWxlKGkhPT0tMSl7bWF0Y2hlcy5wdXNoKGkpO2k9dGhpcy5pbmRleE9mKHN0cmluZyxpK3N0cmluZy5sZW5ndGgpO30KcmV0dXJuIG1hdGNoZXM7fTtTdHJpbmcucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO307U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQ29udHJvbENoYXJhY3RlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC9bXHUwMDAwLVx1MDAwOFx1MDAwYlx1MDAwY1x1MDAwZS1cdTAwMWZcdTAwODAtXHUwMDlmXS9nLCfvv70nKTt9O1N0cmluZy5wcm90b3R5cGUuaXNXaGl0ZXNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuL15ccyokLy50ZXN0KHRoaXMpO307U3RyaW5nLnByb3RvdHlwZS5jb21wdXRlTGluZUVuZGluZ3M9ZnVuY3Rpb24oKXtjb25zdCBlbmRpbmdzPXRoaXMuZmluZEFsbCgnXG4nKTtlbmRpbmdzLnB1c2godGhpcy5sZW5ndGgpO3JldHVybiBlbmRpbmdzO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVDaGFyYWN0ZXJzPWZ1bmN0aW9uKGNoYXJzKXtsZXQgZm91bmRDaGFyPWZhbHNlO2ZvcihsZXQgaT0wO2k8Y2hhcnMubGVuZ3RoOysraSl7aWYodGhpcy5pbmRleE9mKGNoYXJzLmNoYXJBdChpKSkhPT0tMSl7Zm91bmRDaGFyPXRydWU7YnJlYWs7fX0KaWYoIWZvdW5kQ2hhcikKcmV0dXJuIFN0cmluZyh0aGlzKTtsZXQgcmVzdWx0PScnO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGg7KytpKXtpZihjaGFycy5pbmRleE9mKHRoaXMuY2hhckF0KGkpKSE9PS0xKQpyZXN1bHQrPSdcXCc7cmVzdWx0Kz10aGlzLmNoYXJBdChpKTt9CnJldHVybiByZXN1bHQ7fTtTdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycz1mdW5jdGlvbigpe3JldHVybideW117fSgpXFwuXiQqKz98LSwnO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVGb3JSZWdFeHA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lc2NhcGVDaGFyYWN0ZXJzKFN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCkpO307U3RyaW5nLmZpbHRlclJlZ2V4PWZ1bmN0aW9uKHF1ZXJ5KXtjb25zdCB0b0VzY2FwZT1TdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycygpO2xldCByZWdleFN0cmluZz0nJztmb3IobGV0IGk9MDtpPHF1ZXJ5Lmxlbmd0aDsrK2kpe2xldCBjPXF1ZXJ5LmNoYXJBdChpKTtpZih0b0VzY2FwZS5pbmRleE9mKGMpIT09LTEpCmM9J1xcJytjO2lmKGkpCnJlZ2V4U3RyaW5nKz0nW15cXDAnK2MrJ10qJztyZWdleFN0cmluZys9Yzt9CnJldHVybiBuZXcgUmVnRXhwKHJlZ2V4U3RyaW5nLCdpJyk7fTtTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7JykucmVwbGFjZSgvIi9nLCcmcXVvdDsnKTt9O1N0cmluZy5wcm90b3R5cGUudW5lc2NhcGVIVE1MPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+JykucmVwbGFjZSgvJiM1ODsvZywnOicpLnJlcGxhY2UoLyZxdW90Oy9nLCciJykucmVwbGFjZSgvJiM2MDsvZywnPCcpLnJlcGxhY2UoLyYjNjI7L2csJz4nKS5yZXBsYWNlKC8mYW1wOy9nLCcmJyk7fTtTdHJpbmcucHJvdG90eXBlLmNvbGxhcHNlV2hpdGVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL1tcc1x4QTBdKy9nLCcgJyk7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1NaWRkbGU9ZnVuY3Rpb24obWF4TGVuZ3RoKXtpZih0aGlzLmxlbmd0aDw9bWF4TGVuZ3RoKQpyZXR1cm4gU3RyaW5nKHRoaXMpO2xldCBsZWZ0SGFsZj1tYXhMZW5ndGg+PjE7bGV0IHJpZ2h0SGFsZj1tYXhMZW5ndGgtbGVmdEhhbGYtMTtpZih0aGlzLmNvZGVQb2ludEF0KHRoaXMubGVuZ3RoLXJpZ2h0SGFsZi0xKT49MHgxMDAwMCl7LS1yaWdodEhhbGY7KytsZWZ0SGFsZjt9CmlmKGxlZnRIYWxmPjAmJnRoaXMuY29kZVBvaW50QXQobGVmdEhhbGYtMSk+PTB4MTAwMDApCi0tbGVmdEhhbGY7cmV0dXJuIHRoaXMuc3Vic3RyKDAsbGVmdEhhbGYpKydcdTIwMjYnK3RoaXMuc3Vic3RyKHRoaXMubGVuZ3RoLXJpZ2h0SGFsZixyaWdodEhhbGYpO307U3RyaW5nLnByb3RvdHlwZS50cmltRW5kPWZ1bmN0aW9uKG1heExlbmd0aCl7aWYodGhpcy5sZW5ndGg8PW1heExlbmd0aCkKcmV0dXJuIFN0cmluZyh0aGlzKTtyZXR1cm4gdGhpcy5zdWJzdHIoMCxtYXhMZW5ndGgtMSkrJ1x1MjAyNic7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1VUkw9ZnVuY3Rpb24oYmFzZVVSTERvbWFpbil7bGV0IHJlc3VsdD10aGlzLnJlcGxhY2UoL14oaHR0cHN8aHR0cHxmaWxlKTpcL1wvL2ksJycpO2lmKGJhc2VVUkxEb21haW4pe2lmKHJlc3VsdC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYmFzZVVSTERvbWFpbi50b0xvd2VyQ2FzZSgpKSkKcmVzdWx0PXJlc3VsdC5zdWJzdHIoYmFzZVVSTERvbWFpbi5sZW5ndGgpO30KcmV0dXJuIHJlc3VsdDt9O1N0cmluZy5wcm90b3R5cGUudG9UaXRsZUNhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3RoaXMuc3Vic3RyaW5nKDEpO307U3RyaW5nLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24ob3RoZXIpe2lmKHRoaXM+b3RoZXIpCnJldHVybiAxO2lmKHRoaXM8b3RoZXIpCnJldHVybi0xO3JldHVybiAwO307U3RyaW5nLnByb3RvdHlwZS5yZW1vdmVVUkxGcmFnbWVudD1mdW5jdGlvbigpe2xldCBmcmFnbWVudEluZGV4PXRoaXMuaW5kZXhPZignIycpO2lmKGZyYWdtZW50SW5kZXg9PT0tMSkKZnJhZ21lbnRJbmRleD10aGlzLmxlbmd0aDtyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCxmcmFnbWVudEluZGV4KTt9O1N0cmluZy5oYXNoQ29kZT1mdW5jdGlvbihzdHJpbmcpe2lmKCFzdHJpbmcpCnJldHVybiAwO2NvbnN0IHA9KCgxPDwzMCkqNC01KTtjb25zdCB6PTB4NTAzM2Q5Njc7Y29uc3QgejI9MHg1OWQyZjE1ZDtsZXQgcz0wO2xldCB6aT0xO2ZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKyspe2NvbnN0IHhpPXN0cmluZy5jaGFyQ29kZUF0KGkpKnoyO3M9KHMremkqeGkpJXA7emk9KHppKnopJXA7fQpzPShzK3ppKihwLTEpKSVwO3JldHVybiBNYXRoLmFicyhzfDApO307U3RyaW5nLmlzRGlnaXRBdD1mdW5jdGlvbihzdHJpbmcsaW5kZXgpe2NvbnN0IGM9c3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO3JldHVybig0ODw9YyYmYzw9NTcpO307U3RyaW5nLnByb3RvdHlwZS50b0Jhc2U2ND1mdW5jdGlvbigpe2Z1bmN0aW9uIGVuY29kZUJpdHMoYil7cmV0dXJuIGI8MjY/Yis2NTpiPDUyP2IrNzE6Yjw2Mj9iLTQ6Yj09PTYyPzQzOmI9PT02Mz80Nzo2NTt9CmNvbnN0IGVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7Y29uc3QgZGF0YT1lbmNvZGVyLmVuY29kZSh0aGlzLnRvU3RyaW5nKCkpO2NvbnN0IG49ZGF0YS5sZW5ndGg7bGV0IGVuY29kZWQ9Jyc7aWYobj09PTApCnJldHVybiBlbmNvZGVkO2xldCBzaGlmdDtsZXQgdj0wO2ZvcihsZXQgaT0wO2k8bjtpKyspe3NoaWZ0PWklMzt2fD1kYXRhW2ldPDwoMTY+Pj5zaGlmdCYyNCk7aWYoc2hpZnQ9PT0yKXtlbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksZW5jb2RlQml0cyh2Pj4+NiY2MyksZW5jb2RlQml0cyh2JjYzKSk7dj0wO319CmlmKHNoaWZ0PT09MCkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLDYxLDYxKTtlbHNlIGlmKHNoaWZ0PT09MSkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLGVuY29kZUJpdHModj4+PjYmNjMpLDYxKTtyZXR1cm4gZW5jb2RlZDt9O1N0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yPWZ1bmN0aW9uKGEsYil7Y29uc3QgY2h1bms9L15cZCt8XlxEKy87bGV0IGNodW5rYSxjaHVua2IsYW51bSxibnVtO3doaWxlKDEpe2lmKGEpe2lmKCFiKQpyZXR1cm4gMTt9ZWxzZXtpZihiKQpyZXR1cm4tMTtlbHNlCnJldHVybiAwO30KY2h1bmthPWEubWF0Y2goY2h1bmspWzBdO2NodW5rYj1iLm1hdGNoKGNodW5rKVswXTthbnVtPSFpc05hTihjaHVua2EpO2JudW09IWlzTmFOKGNodW5rYik7aWYoYW51bSYmIWJudW0pCnJldHVybi0xO2lmKGJudW0mJiFhbnVtKQpyZXR1cm4gMTtpZihhbnVtJiZibnVtKXtjb25zdCBkaWZmPWNodW5rYS1jaHVua2I7aWYoZGlmZikKcmV0dXJuIGRpZmY7aWYoY2h1bmthLmxlbmd0aCE9PWNodW5rYi5sZW5ndGgpe2lmKCErY2h1bmthJiYhK2NodW5rYikKcmV0dXJuIGNodW5rYS5sZW5ndGgtY2h1bmtiLmxlbmd0aDtlbHNlCnJldHVybiBjaHVua2IubGVuZ3RoLWNodW5rYS5sZW5ndGg7fX1lbHNlIGlmKGNodW5rYSE9PWNodW5rYil7cmV0dXJuKGNodW5rYTxjaHVua2IpPy0xOjE7fQphPWEuc3Vic3RyaW5nKGNodW5rYS5sZW5ndGgpO2I9Yi5zdWJzdHJpbmcoY2h1bmtiLmxlbmd0aCk7fX07U3RyaW5nLmNhc2VJbnNlbnNldGl2ZUNvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXthPWEudG9VcHBlckNhc2UoKTtiPWIudG9VcHBlckNhc2UoKTtpZihhPT09YikKcmV0dXJuIDA7cmV0dXJuIGE+Yj8xOi0xO307TnVtYmVyLmNvbnN0cmFpbj1mdW5jdGlvbihudW0sbWluLG1heCl7aWYobnVtPG1pbikKbnVtPW1pbjtlbHNlIGlmKG51bT5tYXgpCm51bT1tYXg7cmV0dXJuIG51bTt9O051bWJlci5nY2Q9ZnVuY3Rpb24oYSxiKXtpZihiPT09MCkKcmV0dXJuIGE7ZWxzZQpyZXR1cm4gTnVtYmVyLmdjZChiLGElYik7fTtOdW1iZXIudG9GaXhlZElmRmxvYXRpbmc9ZnVuY3Rpb24odmFsdWUpe2lmKCF2YWx1ZXx8aXNOYU4odmFsdWUpKQpyZXR1cm4gdmFsdWU7Y29uc3QgbnVtYmVyPU51bWJlcih2YWx1ZSk7cmV0dXJuIG51bWJlciUxP251bWJlci50b0ZpeGVkKDMpOlN0cmluZyhudW1iZXIpO307RGF0ZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiFpc05hTih0aGlzLmdldFRpbWUoKSk7fTtEYXRlLnByb3RvdHlwZS50b0lTTzg2MDFDb21wYWN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbGVhZFplcm8oeCl7cmV0dXJuKHg+OT8nJzonMCcpK3g7fQpyZXR1cm4gdGhpcy5nZXRGdWxsWWVhcigpK2xlYWRaZXJvKHRoaXMuZ2V0TW9udGgoKSsxKStsZWFkWmVybyh0aGlzLmdldERhdGUoKSkrJ1QnKwpsZWFkWmVybyh0aGlzLmdldEhvdXJzKCkpK2xlYWRaZXJvKHRoaXMuZ2V0TWludXRlcygpKStsZWFkWmVybyh0aGlzLmdldFNlY29uZHMoKSk7fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdyZW1vdmUnLHt2YWx1ZTpmdW5jdGlvbih2YWx1ZSxmaXJzdE9ubHkpe2xldCBpbmRleD10aGlzLmluZGV4T2YodmFsdWUpO2lmKGluZGV4PT09LTEpCnJldHVybiBmYWxzZTtpZihmaXJzdE9ubHkpe3RoaXMuc3BsaWNlKGluZGV4LDEpO3JldHVybiB0cnVlO30KZm9yKGxldCBpPWluZGV4KzEsbj10aGlzLmxlbmd0aDtpPG47KytpKXtpZih0aGlzW2ldIT09dmFsdWUpCnRoaXNbaW5kZXgrK109dGhpc1tpXTt9CnRoaXMubGVuZ3RoPWluZGV4O3JldHVybiB0cnVlO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwdXNoQWxsJyx7dmFsdWU6ZnVuY3Rpb24oYXJyYXkpe2ZvcihsZXQgaT0wO2k8YXJyYXkubGVuZ3RoOysraSkKdGhpcy5wdXNoKGFycmF5W2ldKTt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwncm90YXRlJyx7dmFsdWU6ZnVuY3Rpb24oaW5kZXgpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9aW5kZXg7aTxpbmRleCt0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdC5wdXNoKHRoaXNbaSV0aGlzLmxlbmd0aF0pO3JldHVybiByZXN1bHQ7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3NvcnROdW1iZXJzJyx7dmFsdWU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBudW1lcmljQ29tcGFyYXRvcihhLGIpe3JldHVybiBhLWI7fQp0aGlzLnNvcnQobnVtZXJpY0NvbXBhcmF0b3IpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDMyQXJyYXkucHJvdG90eXBlLCdzb3J0Jyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLnNvcnR9KTsoZnVuY3Rpb24oKXtjb25zdCBwYXJ0aXRpb249e3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KXtmdW5jdGlvbiBzd2FwKGFycmF5LGkxLGkyKXtjb25zdCB0ZW1wPWFycmF5W2kxXTthcnJheVtpMV09YXJyYXlbaTJdO2FycmF5W2kyXT10ZW1wO30KY29uc3QgcGl2b3RWYWx1ZT10aGlzW3Bpdm90SW5kZXhdO3N3YXAodGhpcyxyaWdodCxwaXZvdEluZGV4KTtsZXQgc3RvcmVJbmRleD1sZWZ0O2ZvcihsZXQgaT1sZWZ0O2k8cmlnaHQ7KytpKXtpZihjb21wYXJhdG9yKHRoaXNbaV0scGl2b3RWYWx1ZSk8MCl7c3dhcCh0aGlzLHN0b3JlSW5kZXgsaSk7KytzdG9yZUluZGV4O319CnN3YXAodGhpcyxyaWdodCxzdG9yZUluZGV4KTtyZXR1cm4gc3RvcmVJbmRleDt9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwYXJ0aXRpb24nLHBhcnRpdGlvbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwncGFydGl0aW9uJyxwYXJ0aXRpb24pO2NvbnN0IHNvcnRSYW5nZT17dmFsdWU6ZnVuY3Rpb24oY29tcGFyYXRvcixsZWZ0Qm91bmQscmlnaHRCb3VuZCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2Z1bmN0aW9uIHF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IsbGVmdCxyaWdodCxzb3J0V2luZG93TGVmdCxzb3J0V2luZG93UmlnaHQpe2lmKHJpZ2h0PD1sZWZ0KQpyZXR1cm47Y29uc3QgcGl2b3RJbmRleD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHJpZ2h0LWxlZnQpKStsZWZ0O2NvbnN0IHBpdm90TmV3SW5kZXg9YXJyYXkucGFydGl0aW9uKGNvbXBhcmF0b3IsbGVmdCxyaWdodCxwaXZvdEluZGV4KTtpZihzb3J0V2luZG93TGVmdDxwaXZvdE5ld0luZGV4KQpxdWlja1NvcnRSYW5nZShhcnJheSxjb21wYXJhdG9yLGxlZnQscGl2b3ROZXdJbmRleC0xLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7aWYocGl2b3ROZXdJbmRleDxzb3J0V2luZG93UmlnaHQpCnF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IscGl2b3ROZXdJbmRleCsxLHJpZ2h0LHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7fQppZihsZWZ0Qm91bmQ9PT0wJiZyaWdodEJvdW5kPT09KHRoaXMubGVuZ3RoLTEpJiZzb3J0V2luZG93TGVmdD09PTAmJnNvcnRXaW5kb3dSaWdodD49cmlnaHRCb3VuZCkKdGhpcy5zb3J0KGNvbXBhcmF0b3IpO2Vsc2UKcXVpY2tTb3J0UmFuZ2UodGhpcyxjb21wYXJhdG9yLGxlZnRCb3VuZCxyaWdodEJvdW5kLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7cmV0dXJuIHRoaXM7fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnc29ydFJhbmdlJyxzb3J0UmFuZ2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsJ3NvcnRSYW5nZScsc29ydFJhbmdlKTt9KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3N0YWJsZVNvcnQnLHt2YWx1ZTpmdW5jdGlvbihjb21wYXJhdG9yKXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtjb25zdCBpbmRpY2VzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCmluZGljZXNbaV09aTtjb25zdCBzZWxmPXRoaXM7ZnVuY3Rpb24gaW5kZXhDb21wYXJhdG9yKGEsYil7Y29uc3QgcmVzdWx0PWNvbXBhcmF0b3Ioc2VsZlthXSxzZWxmW2JdKTtyZXR1cm4gcmVzdWx0P3Jlc3VsdDphLWI7fQppbmRpY2VzLnNvcnQoaW5kZXhDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPHRoaXMubGVuZ3RoOysraSl7aWYoaW5kaWNlc1tpXTwwfHxpPT09aW5kaWNlc1tpXSkKY29udGludWU7bGV0IGN5Y2xpY2FsPWk7Y29uc3Qgc2F2ZWQ9dGhpc1tpXTt3aGlsZSh0cnVlKXtjb25zdCBuZXh0PWluZGljZXNbY3ljbGljYWxdO2luZGljZXNbY3ljbGljYWxdPS0xO2lmKG5leHQ9PT1pKXt0aGlzW2N5Y2xpY2FsXT1zYXZlZDticmVhazt9ZWxzZXt0aGlzW2N5Y2xpY2FsXT10aGlzW25leHRdO2N5Y2xpY2FsPW5leHQ7fX19CnJldHVybiB0aGlzO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdxc2VsZWN0Jyx7dmFsdWU6ZnVuY3Rpb24oayxjb21wYXJhdG9yKXtpZihrPDB8fGs+PXRoaXMubGVuZ3RoKQpyZXR1cm47aWYoIWNvbXBhcmF0b3Ipe2NvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO307fQpsZXQgbG93PTA7bGV0IGhpZ2g9dGhpcy5sZW5ndGgtMTtmb3IoOzspe2NvbnN0IHBpdm90UG9zaXRpb249dGhpcy5wYXJ0aXRpb24oY29tcGFyYXRvcixsb3csaGlnaCxNYXRoLmZsb29yKChoaWdoK2xvdykvMikpO2lmKHBpdm90UG9zaXRpb249PT1rKQpyZXR1cm4gdGhpc1trXTtlbHNlIGlmKHBpdm90UG9zaXRpb24+aykKaGlnaD1waXZvdFBvc2l0aW9uLTE7ZWxzZQpsb3c9cGl2b3RQb3NpdGlvbisxO319fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpe2Z1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsYil7cmV0dXJuIGE8Yj8tMTooYT5iPzE6MCk7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO2xldCBsPWxlZnR8fDA7bGV0IHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXtjb25zdCBtPShsK3IpPj4xO2lmKGNvbXBhcmF0b3Iob2JqZWN0LHRoaXNbbV0pPjApCmw9bSsxO2Vsc2UKcj1tO30KcmV0dXJuIHI7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpmdW5jdGlvbihvYmplY3QsY29tcGFyYXRvcixsZWZ0LHJpZ2h0KXtmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpe3JldHVybiBhPGI/LTE6KGE+Yj8xOjApO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjtsZXQgbD1sZWZ0fHwwO2xldCByPXJpZ2h0IT09dW5kZWZpbmVkP3JpZ2h0OnRoaXMubGVuZ3RoO3doaWxlKGw8cil7Y29uc3QgbT0obCtyKT4+MTtpZihjb21wYXJhdG9yKG9iamVjdCx0aGlzW21dKT49MCkKbD1tKzE7ZWxzZQpyPW07fQpyZXR1cm4gcjt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwnbG93ZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS5sb3dlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwndXBwZXJCb3VuZCcse3ZhbHVlOkFycmF5LnByb3RvdHlwZS51cHBlckJvdW5kfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEludDMyQXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzJBcnJheS5wcm90b3R5cGUsJ3VwcGVyQm91bmQnLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUudXBwZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDY0QXJyYXkucHJvdG90eXBlLCdsb3dlckJvdW5kJyx7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdiaW5hcnlJbmRleE9mJyx7dmFsdWU6ZnVuY3Rpb24odmFsdWUsY29tcGFyYXRvcil7Y29uc3QgaW5kZXg9dGhpcy5sb3dlckJvdW5kKHZhbHVlLGNvbXBhcmF0b3IpO3JldHVybiBpbmRleDx0aGlzLmxlbmd0aCYmY29tcGFyYXRvcih2YWx1ZSx0aGlzW2luZGV4XSk9PT0wP2luZGV4Oi0xO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdzZWxlY3QnLHt2YWx1ZTpmdW5jdGlvbihmaWVsZCl7Y29uc3QgcmVzdWx0PW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpCnJlc3VsdFtpXT10aGlzW2ldW2ZpZWxkXTtyZXR1cm4gcmVzdWx0O319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdwZWVrTGFzdCcse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5sZW5ndGgtMV07fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIG1lcmdlT3JJbnRlcnNlY3QoYXJyYXkxLGFycmF5Mixjb21wYXJhdG9yLG1lcmdlTm90SW50ZXJzZWN0KXtjb25zdCByZXN1bHQ9W107bGV0IGk9MDtsZXQgaj0wO3doaWxlKGk8YXJyYXkxLmxlbmd0aCYmajxhcnJheTIubGVuZ3RoKXtjb25zdCBjb21wYXJlVmFsdWU9Y29tcGFyYXRvcihhcnJheTFbaV0sYXJyYXkyW2pdKTtpZihtZXJnZU5vdEludGVyc2VjdHx8IWNvbXBhcmVWYWx1ZSkKcmVzdWx0LnB1c2goY29tcGFyZVZhbHVlPD0wP2FycmF5MVtpXTphcnJheTJbal0pO2lmKGNvbXBhcmVWYWx1ZTw9MCkKaSsrO2lmKGNvbXBhcmVWYWx1ZT49MCkKaisrO30KaWYobWVyZ2VOb3RJbnRlcnNlY3Qpe3doaWxlKGk8YXJyYXkxLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkxW2krK10pO3doaWxlKGo8YXJyYXkyLmxlbmd0aCkKcmVzdWx0LnB1c2goYXJyYXkyW2orK10pO30KcmV0dXJuIHJlc3VsdDt9Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsJ2ludGVyc2VjdE9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsZmFsc2UpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCdtZXJnZU9yZGVyZWQnLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKXtyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsdHJ1ZSk7fX0pO30pKCk7U3RyaW5nLnNwcmludGY9ZnVuY3Rpb24oZm9ybWF0LHZhcl9hcmcpe3JldHVybiBTdHJpbmcudnNwcmludGYoZm9ybWF0LEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7fTtTdHJpbmcudG9rZW5pemVGb3JtYXRTdHJpbmc9ZnVuY3Rpb24oZm9ybWF0LGZvcm1hdHRlcnMpe2NvbnN0IHRva2Vucz1bXTtmdW5jdGlvbiBhZGRTdHJpbmdUb2tlbihzdHIpe2lmKCFzdHIpCnJldHVybjtpZih0b2tlbnMubGVuZ3RoJiZ0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS50eXBlPT09J3N0cmluZycpCnRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnZhbHVlKz1zdHI7ZWxzZQp0b2tlbnMucHVzaCh7dHlwZTonc3RyaW5nJyx2YWx1ZTpzdHJ9KTt9CmZ1bmN0aW9uIGFkZFNwZWNpZmllclRva2VuKHNwZWNpZmllcixwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpe3Rva2Vucy5wdXNoKHt0eXBlOidzcGVjaWZpZXInLHNwZWNpZmllcjpzcGVjaWZpZXIscHJlY2lzaW9uOnByZWNpc2lvbixzdWJzdGl0dXRpb25JbmRleDpzdWJzdGl0dXRpb25JbmRleH0pO30KZnVuY3Rpb24gYWRkQW5zaUNvbG9yKGNvZGUpe2NvbnN0IHR5cGVzPXszOidjb2xvcicsOTonY29sb3JMaWdodCcsNDonYmdDb2xvcicsMTA6J2JnQ29sb3JMaWdodCd9O2NvbnN0IGNvbG9yQ29kZXM9WydibGFjaycsJ3JlZCcsJ2dyZWVuJywneWVsbG93JywnYmx1ZScsJ21hZ2VudGEnLCdjeWFuJywnbGlnaHRHcmF5JywnJywnZGVmYXVsdCddO2NvbnN0IGNvbG9yQ29kZXNMaWdodD1bJ2RhcmtHcmF5JywnbGlnaHRSZWQnLCdsaWdodEdyZWVuJywnbGlnaHRZZWxsb3cnLCdsaWdodEJsdWUnLCdsaWdodE1hZ2VudGEnLCdsaWdodEN5YW4nLCd3aGl0ZScsJyddO2NvbnN0IGNvbG9ycz17Y29sb3I6Y29sb3JDb2Rlcyxjb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodCxiZ0NvbG9yOmNvbG9yQ29kZXMsYmdDb2xvckxpZ2h0OmNvbG9yQ29kZXNMaWdodH07Y29uc3QgdHlwZT10eXBlc1tNYXRoLmZsb29yKGNvZGUvMTApXTtpZighdHlwZSkKcmV0dXJuO2NvbnN0IGNvbG9yPWNvbG9yc1t0eXBlXVtjb2RlJTEwXTtpZighY29sb3IpCnJldHVybjt0b2tlbnMucHVzaCh7dHlwZTonc3BlY2lmaWVyJyxzcGVjaWZpZXI6J2MnLHZhbHVlOntkZXNjcmlwdGlvbjoodHlwZS5zdGFydHNXaXRoKCdiZycpPydiYWNrZ3JvdW5kIDogJzonY29sb3I6ICcpK2NvbG9yfX0pO30KbGV0IHRleHRTdGFydD0wO2xldCBzdWJzdGl0dXRpb25JbmRleD0wO2NvbnN0IHJlPW5ldyBSZWdFeHAoYCUlfCUoPzooXFxkKylcXCQpPyg/OlxcLihcXGQqKSk/KFske09iamVjdC5rZXlzKGZvcm1hdHRlcnMpLmpvaW4oJycpfV0pfFxcdTAwMWJcXFsoXFxkKyltYCwnZycpO2ZvcihsZXQgbWF0Y2g9cmUuZXhlYyhmb3JtYXQpOyEhbWF0Y2g7bWF0Y2g9cmUuZXhlYyhmb3JtYXQpKXtjb25zdCBtYXRjaFN0YXJ0PW1hdGNoLmluZGV4O2lmKG1hdGNoU3RhcnQ+dGV4dFN0YXJ0KQphZGRTdHJpbmdUb2tlbihmb3JtYXQuc3Vic3RyaW5nKHRleHRTdGFydCxtYXRjaFN0YXJ0KSk7aWYobWF0Y2hbMF09PT0nJSUnKXthZGRTdHJpbmdUb2tlbignJScpO31lbHNlIGlmKG1hdGNoWzBdLnN0YXJ0c1dpdGgoJyUnKSl7Y29uc3RbXyxzdWJzdGl0aW9uU3RyaW5nLHByZWNpc2lvblN0cmluZyxzcGVjaWZpZXJTdHJpbmddPW1hdGNoO2lmKHN1YnN0aXRpb25TdHJpbmcmJk51bWJlcihzdWJzdGl0aW9uU3RyaW5nKT4wKQpzdWJzdGl0dXRpb25JbmRleD1OdW1iZXIoc3Vic3RpdGlvblN0cmluZyktMTtjb25zdCBwcmVjaXNpb249cHJlY2lzaW9uU3RyaW5nP051bWJlcihwcmVjaXNpb25TdHJpbmcpOi0xO2FkZFNwZWNpZmllclRva2VuKHNwZWNpZmllclN0cmluZyxwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpOysrc3Vic3RpdHV0aW9uSW5kZXg7fWVsc2V7Y29uc3QgY29kZT1OdW1iZXIobWF0Y2hbNF0pO2FkZEFuc2lDb2xvcihjb2RlKTt9CnRleHRTdGFydD1tYXRjaFN0YXJ0K21hdGNoWzBdLmxlbmd0aDt9CmFkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcodGV4dFN0YXJ0KSk7cmV0dXJuIHRva2Vuczt9O1N0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnM9e2Q6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4haXNOYU4oc3Vic3RpdHV0aW9uKT9zdWJzdGl0dXRpb246MDt9LGY6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uLHRva2VuKXtpZihzdWJzdGl0dXRpb24mJnRva2VuLnByZWNpc2lvbj4tMSkKc3Vic3RpdHV0aW9uPXN1YnN0aXR1dGlvbi50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7cmV0dXJuIWlzTmFOKHN1YnN0aXR1dGlvbik/c3Vic3RpdHV0aW9uOih0b2tlbi5wcmVjaXNpb24+LTE/TnVtYmVyKDApLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTowKTt9LHM6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uKXtyZXR1cm4gc3Vic3RpdHV0aW9uO319O1N0cmluZy52c3ByaW50Zj1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyl7cmV0dXJuIFN0cmluZy5mb3JtYXQoZm9ybWF0LHN1YnN0aXR1dGlvbnMsU3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycywnJyxmdW5jdGlvbihhLGIpe3JldHVybiBhK2I7fSkuZm9ybWF0dGVkUmVzdWx0O307U3RyaW5nLmZvcm1hdD1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucyxmb3JtYXR0ZXJzLGluaXRpYWxWYWx1ZSxhcHBlbmQsdG9rZW5pemVkRm9ybWF0KXtpZighZm9ybWF0fHwoKCFzdWJzdGl0dXRpb25zfHwhc3Vic3RpdHV0aW9ucy5sZW5ndGgpJiZmb3JtYXQuc2VhcmNoKC9cdTAwMWJcWyhcZCspbS8pPT09LTEpKQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OmFwcGVuZChpbml0aWFsVmFsdWUsZm9ybWF0KSx1bnVzZWRTdWJzdGl0dXRpb25zOnN1YnN0aXR1dGlvbnN9O2Z1bmN0aW9uIHByZXR0eUZ1bmN0aW9uTmFtZSgpe3JldHVybidTdHJpbmcuZm9ybWF0KCInK2Zvcm1hdCsnIiwgIicrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChzdWJzdGl0dXRpb25zLCciLCAiJykrJyIpJzt9CmZ1bmN0aW9uIHdhcm4obXNnKXtjb25zb2xlLndhcm4ocHJldHR5RnVuY3Rpb25OYW1lKCkrJzogJyttc2cpO30KZnVuY3Rpb24gZXJyb3IobXNnKXtjb25zb2xlLmVycm9yKHByZXR0eUZ1bmN0aW9uTmFtZSgpKyc6ICcrbXNnKTt9CmxldCByZXN1bHQ9aW5pdGlhbFZhbHVlO2NvbnN0IHRva2Vucz10b2tlbml6ZWRGb3JtYXR8fFN0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZyhmb3JtYXQsZm9ybWF0dGVycyk7Y29uc3QgdXNlZFN1YnN0aXR1dGlvbkluZGV4ZXM9e307Zm9yKGxldCBpPTA7aTx0b2tlbnMubGVuZ3RoOysraSl7Y29uc3QgdG9rZW49dG9rZW5zW2ldO2lmKHRva2VuLnR5cGU9PT0nc3RyaW5nJyl7cmVzdWx0PWFwcGVuZChyZXN1bHQsdG9rZW4udmFsdWUpO2NvbnRpbnVlO30KaWYodG9rZW4udHlwZSE9PSdzcGVjaWZpZXInKXtlcnJvcignVW5rbm93biB0b2tlbiB0eXBlICInK3Rva2VuLnR5cGUrJyIgZm91bmQuJyk7Y29udGludWU7fQppZighdG9rZW4udmFsdWUmJnRva2VuLnN1YnN0aXR1dGlvbkluZGV4Pj1zdWJzdGl0dXRpb25zLmxlbmd0aCl7ZXJyb3IoJ25vdCBlbm91Z2ggc3Vic3RpdHV0aW9uIGFyZ3VtZW50cy4gSGFkICcrc3Vic3RpdHV0aW9ucy5sZW5ndGgrJyBidXQgbmVlZGVkICcrCih0b2tlbi5zdWJzdGl0dXRpb25JbmRleCsxKSsnLCBzbyBzdWJzdGl0dXRpb24gd2FzIHNraXBwZWQuJyk7cmVzdWx0PWFwcGVuZChyZXN1bHQsJyUnKyh0b2tlbi5wcmVjaXNpb24+LTE/dG9rZW4ucHJlY2lzaW9uOicnKSt0b2tlbi5zcGVjaWZpZXIpO2NvbnRpbnVlO30KaWYoIXRva2VuLnZhbHVlKQp1c2VkU3Vic3RpdHV0aW9uSW5kZXhlc1t0b2tlbi5zdWJzdGl0dXRpb25JbmRleF09dHJ1ZTtpZighKHRva2VuLnNwZWNpZmllciBpbiBmb3JtYXR0ZXJzKSl7d2FybigndW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciBcdTIwMUMnK3Rva2VuLnNwZWNpZmllcisnXHUyMDFELiBUcmVhdGluZyBhcyBhIHN0cmluZy4nKTtyZXN1bHQ9YXBwZW5kKHJlc3VsdCx0b2tlbi52YWx1ZT8nJzpzdWJzdGl0dXRpb25zW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XSk7Y29udGludWU7fQpyZXN1bHQ9YXBwZW5kKHJlc3VsdCxmb3JtYXR0ZXJzW3Rva2VuLnNwZWNpZmllcl0odG9rZW4udmFsdWV8fHN1YnN0aXR1dGlvbnNbdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXhdLHRva2VuKSk7fQpjb25zdCB1bnVzZWRTdWJzdGl0dXRpb25zPVtdO2ZvcihsZXQgaT0wO2k8c3Vic3RpdHV0aW9ucy5sZW5ndGg7KytpKXtpZihpIGluIHVzZWRTdWJzdGl0dXRpb25JbmRleGVzKQpjb250aW51ZTt1bnVzZWRTdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uc1tpXSk7fQpyZXR1cm57Zm9ybWF0dGVkUmVzdWx0OnJlc3VsdCx1bnVzZWRTdWJzdGl0dXRpb25zOnVudXNlZFN1YnN0aXR1dGlvbnN9O307ZnVuY3Rpb24gY3JlYXRlU2VhcmNoUmVnZXgocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtjb25zdCByZWdleEZsYWdzPWNhc2VTZW5zaXRpdmU/J2cnOidnaSc7bGV0IHJlZ2V4T2JqZWN0O2lmKGlzUmVnZXgpe3RyeXtyZWdleE9iamVjdD1uZXcgUmVnRXhwKHF1ZXJ5LHJlZ2V4RmxhZ3MpO31jYXRjaChlKXt9fQppZighcmVnZXhPYmplY3QpCnJlZ2V4T2JqZWN0PWNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LHJlZ2V4RmxhZ3MpO3JldHVybiByZWdleE9iamVjdDt9CmZ1bmN0aW9uIGNyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHF1ZXJ5LGZsYWdzKXtjb25zdCByZWdleFNwZWNpYWxDaGFyYWN0ZXJzPVN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCk7bGV0IHJlZ2V4PScnO2ZvcihsZXQgaT0wO2k8cXVlcnkubGVuZ3RoOysraSl7Y29uc3QgYz1xdWVyeS5jaGFyQXQoaSk7aWYocmVnZXhTcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKGMpIT09LTEpCnJlZ2V4Kz0nXFwnO3JlZ2V4Kz1jO30KcmV0dXJuIG5ldyBSZWdFeHAocmVnZXgsZmxhZ3N8fCcnKTt9CmZ1bmN0aW9uIGNvdW50UmVnZXhNYXRjaGVzKHJlZ2V4LGNvbnRlbnQpe2xldCB0ZXh0PWNvbnRlbnQ7bGV0IHJlc3VsdD0wO2xldCBtYXRjaDt3aGlsZSh0ZXh0JiYobWF0Y2g9cmVnZXguZXhlYyh0ZXh0KSkpe2lmKG1hdGNoWzBdLmxlbmd0aD4wKQorK3Jlc3VsdDt0ZXh0PXRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KzEpO30KcmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIHNwYWNlc1BhZGRpbmcoc3BhY2VzQ291bnQpe3JldHVybidcdTAwYTAnLnJlcGVhdChzcGFjZXNDb3VudCk7fQpmdW5jdGlvbiBudW1iZXJUb1N0cmluZ1dpdGhTcGFjZXNQYWRkaW5nKHZhbHVlLHN5bWJvbHNDb3VudCl7Y29uc3QgbnVtYmVyU3RyaW5nPXZhbHVlLnRvU3RyaW5nKCk7Y29uc3QgcGFkZGluZ0xlbmd0aD1NYXRoLm1heCgwLHN5bWJvbHNDb3VudC1udW1iZXJTdHJpbmcubGVuZ3RoKTtyZXR1cm4gc3BhY2VzUGFkZGluZyhwYWRkaW5nTGVuZ3RoKStudW1iZXJTdHJpbmc7fQpTZXQucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtTZXQucHJvdG90eXBlLmZpcnN0VmFsdWU9ZnVuY3Rpb24oKXtpZighdGhpcy5zaXplKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7fTtTZXQucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpCnRoaXMuYWRkKGUpO307U2V0LnByb3RvdHlwZS5jb250YWluc0FsbD1mdW5jdGlvbihpdGVyYWJsZSl7Zm9yKGNvbnN0IGUgb2YgaXRlcmFibGUpe2lmKCF0aGlzLmhhcyhlKSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fTtNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihrZXkpe2NvbnN0IHZhbHVlPXRoaXMuZ2V0KGtleSk7dGhpcy5kZWxldGUoa2V5KTtyZXR1cm4gdmFsdWU7fTtNYXAucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy52YWx1ZXMoKSk7fTtNYXAucHJvdG90eXBlLmtleXNBcnJheT1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cygpKTt9O01hcC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpe2NvbnN0IHJlc3VsdD1uZXcgTXVsdGltYXAoKTtmb3IoY29uc3Qga2V5IG9mIHRoaXMua2V5cygpKXtjb25zdCB2YWx1ZT10aGlzLmdldChrZXkpO3Jlc3VsdC5zZXQodmFsdWUsa2V5KTt9CnJldHVybiByZXN1bHQ7fTt2YXIgTXVsdGltYXA9ZnVuY3Rpb24oKXt0aGlzLl9tYXA9bmV3IE1hcCgpO307TXVsdGltYXAucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXtsZXQgc2V0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighc2V0KXtzZXQ9bmV3IFNldCgpO3RoaXMuX21hcC5zZXQoa2V5LHNldCk7fQpzZXQuYWRkKHZhbHVlKTt9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGtleSl8fG5ldyBTZXQoKTt9LGhhczpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7fSxoYXNWYWx1ZTpmdW5jdGlvbihrZXksdmFsdWUpe2NvbnN0IHNldD10aGlzLl9tYXAuZ2V0KGtleSk7aWYoIXNldCkKcmV0dXJuIGZhbHNlO3JldHVybiBzZXQuaGFzKHZhbHVlKTt9LGdldCBzaXplKCl7cmV0dXJuIHRoaXMuX21hcC5zaXplO30sZGVsZXRlOmZ1bmN0aW9uKGtleSx2YWx1ZSl7Y29uc3QgdmFsdWVzPXRoaXMuZ2V0KGtleSk7aWYoIXZhbHVlcykKcmV0dXJuIGZhbHNlO2NvbnN0IHJlc3VsdD12YWx1ZXMuZGVsZXRlKHZhbHVlKTtpZighdmFsdWVzLnNpemUpCnRoaXMuX21hcC5kZWxldGUoa2V5KTtyZXR1cm4gcmVzdWx0O30sZGVsZXRlQWxsOmZ1bmN0aW9uKGtleSl7dGhpcy5fbWFwLmRlbGV0ZShrZXkpO30sa2V5c0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5rZXlzQXJyYXkoKTt9LHZhbHVlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGtleXM9dGhpcy5rZXlzQXJyYXkoKTtmb3IobGV0IGk9MDtpPGtleXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2hBbGwodGhpcy5nZXQoa2V5c1tpXSkudmFsdWVzQXJyYXkoKSk7cmV0dXJuIHJlc3VsdDt9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLmNsZWFyKCk7fX07ZnVuY3Rpb24gbG9hZFhIUih1cmwpe3JldHVybiBuZXcgUHJvbWlzZShsb2FkKTtmdW5jdGlvbiBsb2FkKHN1Y2Nlc3NDYWxsYmFjayxmYWlsdXJlQ2FsbGJhY2spe2Z1bmN0aW9uIG9uUmVhZHlTdGF0ZUNoYW5nZWQoKXtpZih4aHIucmVhZHlTdGF0ZSE9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpCnJldHVybjtpZih4aHIuc3RhdHVzIT09MjAwKXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7ZmFpbHVyZUNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzKSk7cmV0dXJuO30KeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3N1Y2Nlc3NDYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTt9CmNvbnN0IHhocj1uZXcgWE1MSHR0cFJlcXVlc3QoKTt4aHIud2l0aENyZWRlbnRpYWxzPWZhbHNlO3hoci5vcGVuKCdHRVQnLHVybCx0cnVlKTt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW9uUmVhZHlTdGF0ZUNoYW5nZWQ7eGhyLnNlbmQobnVsbCk7fX0KZnVuY3Rpb24gc3VwcHJlc3NVbnVzZWQodmFsdWUpe30Kc2VsZi5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oY2FsbGJhY2spe2NvbnN0IGFyZ3M9Wy4uLmFyZ3VtZW50c10uc2xpY2UoMSk7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Y2FsbGJhY2soLi4uYXJncykpO3JldHVybiAwO307UHJvbWlzZS5wcm90b3R5cGUuc3ByZWFkPWZ1bmN0aW9uKGNhbGxiYWNrKXtyZXR1cm4gdGhpcy50aGVuKHNwcmVhZFByb21pc2UpO2Z1bmN0aW9uIHNwcmVhZFByb21pc2UoYXJnKXtyZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCxhcmcpO319O1Byb21pc2UucHJvdG90eXBlLmNhdGNoRXhjZXB0aW9uPWZ1bmN0aW9uKGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHRoaXMuY2F0Y2goZnVuY3Rpb24oZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybiBkZWZhdWx0VmFsdWU7fSk7fTtNYXAucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24ob3RoZXIsaXNFcXVhbCl7Y29uc3QgbGVmdEtleXM9dGhpcy5rZXlzQXJyYXkoKTtjb25zdCByaWdodEtleXM9b3RoZXIua2V5c0FycmF5KCk7bGVmdEtleXMuc29ydCgoYSxiKT0+YS1iKTtyaWdodEtleXMuc29ydCgoYSxiKT0+YS1iKTtjb25zdCByZW1vdmVkPVtdO2NvbnN0IGFkZGVkPVtdO2NvbnN0IGVxdWFsPVtdO2xldCBsZWZ0SW5kZXg9MDtsZXQgcmlnaHRJbmRleD0wO3doaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgmJnJpZ2h0SW5kZXg8cmlnaHRLZXlzLmxlbmd0aCl7Y29uc3QgbGVmdEtleT1sZWZ0S2V5c1tsZWZ0SW5kZXhdO2NvbnN0IHJpZ2h0S2V5PXJpZ2h0S2V5c1tyaWdodEluZGV4XTtpZihsZWZ0S2V5PT09cmlnaHRLZXkmJmlzRXF1YWwodGhpcy5nZXQobGVmdEtleSksb3RoZXIuZ2V0KHJpZ2h0S2V5KSkpe2VxdWFsLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4OysrcmlnaHRJbmRleDtjb250aW51ZTt9CmlmKGxlZnRLZXk8PXJpZ2h0S2V5KXtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpOysrbGVmdEluZGV4O2NvbnRpbnVlO30KYWRkZWQucHVzaChvdGhlci5nZXQocmlnaHRLZXkpKTsrK3JpZ2h0SW5kZXg7fQp3aGlsZShsZWZ0SW5kZXg8bGVmdEtleXMubGVuZ3RoKXtjb25zdCBsZWZ0S2V5PWxlZnRLZXlzW2xlZnRJbmRleCsrXTtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpO30Kd2hpbGUocmlnaHRJbmRleDxyaWdodEtleXMubGVuZ3RoKXtjb25zdCByaWdodEtleT1yaWdodEtleXNbcmlnaHRJbmRleCsrXTthZGRlZC5wdXNoKG90aGVyLmdldChyaWdodEtleSkpO30KcmV0dXJue2FkZGVkOmFkZGVkLHJlbW92ZWQ6cmVtb3ZlZCxlcXVhbDplcXVhbH07fTtmdW5jdGlvbiBydW5PbldpbmRvd0xvYWQoY2FsbGJhY2spe2Z1bmN0aW9uIHdpbmRvd0xvYWRlZCgpe3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsd2luZG93TG9hZGVkLGZhbHNlKTtjYWxsYmFjaygpO30KaWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSdjb21wbGV0ZSd8fGRvY3VtZW50LnJlYWR5U3RhdGU9PT0naW50ZXJhY3RpdmUnKQpjYWxsYmFjaygpO2Vsc2UKc2VsZi5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJyx3aW5kb3dMb2FkZWQsZmFsc2UpO30KY29uc3QgX3NpbmdsZXRvblN5bWJvbD1TeW1ib2woJ3NpbmdsZXRvbicpO2Z1bmN0aW9uIHNpbmdsZXRvbihjb25zdHJ1Y3RvckZ1bmN0aW9uKXtpZihfc2luZ2xldG9uU3ltYm9sIGluIGNvbnN0cnVjdG9yRnVuY3Rpb24pCnJldHVybiBjb25zdHJ1Y3RvckZ1bmN0aW9uW19zaW5nbGV0b25TeW1ib2xdO2NvbnN0IGluc3RhbmNlPW5ldyBjb25zdHJ1Y3RvckZ1bmN0aW9uKCk7Y29uc3RydWN0b3JGdW5jdGlvbltfc2luZ2xldG9uU3ltYm9sXT1pbnN0YW5jZTtyZXR1cm4gaW5zdGFuY2U7fTtzZWxmWydEb21FeHRlbnNpb24nXT1zZWxmWydEb21FeHRlbnNpb24nXXx8e307Tm9kZS5wcm90b3R5cGUucmFuZ2VPZldvcmQ9ZnVuY3Rpb24ob2Zmc2V0LHN0b3BDaGFyYWN0ZXJzLHN0YXlXaXRoaW5Ob2RlLGRpcmVjdGlvbil7bGV0IHN0YXJ0Tm9kZTtsZXQgc3RhcnRPZmZzZXQ9MDtsZXQgZW5kTm9kZTtsZXQgZW5kT2Zmc2V0PTA7aWYoIXN0YXlXaXRoaW5Ob2RlKQpzdGF5V2l0aGluTm9kZT10aGlzO2lmKCFkaXJlY3Rpb258fGRpcmVjdGlvbj09PSdiYWNrd2FyZCd8fGRpcmVjdGlvbj09PSdib3RoJyl7bGV0IG5vZGU9dGhpczt3aGlsZShub2RlKXtpZihub2RlPT09c3RheVdpdGhpbk5vZGUpe2lmKCFzdGFydE5vZGUpCnN0YXJ0Tm9kZT1zdGF5V2l0aGluTm9kZTticmVhazt9CmlmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSl7Y29uc3Qgc3RhcnQ9KG5vZGU9PT10aGlzPyhvZmZzZXQtMSk6KG5vZGUubm9kZVZhbHVlLmxlbmd0aC0xKSk7Zm9yKGxldCBpPXN0YXJ0O2k+PTA7LS1pKXtpZihzdG9wQ2hhcmFjdGVycy5pbmRleE9mKG5vZGUubm9kZVZhbHVlW2ldKSE9PS0xKXtzdGFydE5vZGU9bm9kZTtzdGFydE9mZnNldD1pKzE7YnJlYWs7fX19CmlmKHN0YXJ0Tm9kZSkKYnJlYWs7bm9kZT1ub2RlLnRyYXZlcnNlUHJldmlvdXNOb2RlKHN0YXlXaXRoaW5Ob2RlKTt9CmlmKCFzdGFydE5vZGUpe3N0YXJ0Tm9kZT1zdGF5V2l0aGluTm9kZTtzdGFydE9mZnNldD0wO319ZWxzZXtzdGFydE5vZGU9dGhpcztzdGFydE9mZnNldD1vZmZzZXQ7fQppZighZGlyZWN0aW9ufHxkaXJlY3Rpb249PT0nZm9yd2FyZCd8fGRpcmVjdGlvbj09PSdib3RoJyl7bGV0IG5vZGU9dGhpczt3aGlsZShub2RlKXtpZihub2RlPT09c3RheVdpdGhpbk5vZGUpe2lmKCFlbmROb2RlKQplbmROb2RlPXN0YXlXaXRoaW5Ob2RlO2JyZWFrO30KaWYobm9kZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtjb25zdCBzdGFydD0obm9kZT09PXRoaXM/b2Zmc2V0OjApO2ZvcihsZXQgaT1zdGFydDtpPG5vZGUubm9kZVZhbHVlLmxlbmd0aDsrK2kpe2lmKHN0b3BDaGFyYWN0ZXJzLmluZGV4T2Yobm9kZS5ub2RlVmFsdWVbaV0pIT09LTEpe2VuZE5vZGU9bm9kZTtlbmRPZmZzZXQ9aTticmVhazt9fX0KaWYoZW5kTm9kZSkKYnJlYWs7bm9kZT1ub2RlLnRyYXZlcnNlTmV4dE5vZGUoc3RheVdpdGhpbk5vZGUpO30KaWYoIWVuZE5vZGUpe2VuZE5vZGU9c3RheVdpdGhpbk5vZGU7ZW5kT2Zmc2V0PXN0YXlXaXRoaW5Ob2RlLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREU/c3RheVdpdGhpbk5vZGUubm9kZVZhbHVlLmxlbmd0aDpzdGF5V2l0aGluTm9kZS5jaGlsZE5vZGVzLmxlbmd0aDt9fWVsc2V7ZW5kTm9kZT10aGlzO2VuZE9mZnNldD1vZmZzZXQ7fQpjb25zdCByZXN1bHQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmVzdWx0LnNldFN0YXJ0KHN0YXJ0Tm9kZSxzdGFydE9mZnNldCk7cmVzdWx0LnNldEVuZChlbmROb2RlLGVuZE9mZnNldCk7cmV0dXJuIHJlc3VsdDt9O05vZGUucHJvdG90eXBlLnRyYXZlcnNlTmV4dFRleHROb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2xldCBub2RlPXRoaXMudHJhdmVyc2VOZXh0Tm9kZShzdGF5V2l0aGluKTtpZighbm9kZSkKcmV0dXJuIG51bGw7Y29uc3Qgbm9uVGV4dFRhZ3M9eydTVFlMRSc6MSwnU0NSSVBUJzoxfTt3aGlsZShub2RlJiYobm9kZS5ub2RlVHlwZSE9PU5vZGUuVEVYVF9OT0RFfHxub25UZXh0VGFnc1tub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWVdKSkKbm9kZT1ub2RlLnRyYXZlcnNlTmV4dE5vZGUoc3RheVdpdGhpbik7cmV0dXJuIG5vZGU7fTtFbGVtZW50LnByb3RvdHlwZS5wb3NpdGlvbkF0PWZ1bmN0aW9uKHgseSxyZWxhdGl2ZVRvKXtsZXQgc2hpZnQ9e3g6MCx5OjB9O2lmKHJlbGF0aXZlVG8pCnNoaWZ0PXJlbGF0aXZlVG8uYm94SW5XaW5kb3codGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0eXBlb2YgeD09PSdudW1iZXInKQp0aGlzLnN0eWxlLnNldFByb3BlcnR5KCdsZWZ0Jywoc2hpZnQueCt4KSsncHgnKTtlbHNlCnRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtpZih0eXBlb2YgeT09PSdudW1iZXInKQp0aGlzLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLChzaGlmdC55K3kpKydweCcpO2Vsc2UKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7aWYodHlwZW9mIHg9PT0nbnVtYmVyJ3x8dHlwZW9mIHk9PT0nbnVtYmVyJykKdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgncG9zaXRpb24nLCdhYnNvbHV0ZScpO2Vsc2UKdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncG9zaXRpb24nKTt9O0VsZW1lbnQucHJvdG90eXBlLmlzU2Nyb2xsZWRUb0JvdHRvbT1mdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLnNjcm9sbFRvcCt0aGlzLmNsaWVudEhlaWdodC10aGlzLnNjcm9sbEhlaWdodCk8PTI7fTtOb2RlLnByb3RvdHlwZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aE5vZGVOYW1lSW5BcnJheT1mdW5jdGlvbihuYW1lQXJyYXkpe2ZvcihsZXQgbm9kZT10aGlzO25vZGUmJm5vZGUhPT10aGlzLm93bmVyRG9jdW1lbnQ7bm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKSl7Zm9yKGxldCBpPTA7aTxuYW1lQXJyYXkubGVuZ3RoOysraSl7aWYobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09bmFtZUFycmF5W2ldLnRvTG93ZXJDYXNlKCkpCnJldHVybiBub2RlO319CnJldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZT1mdW5jdGlvbihub2RlTmFtZSl7cmV0dXJuIHRoaXMuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZUluQXJyYXkoW25vZGVOYW1lXSk7fTtOb2RlLnByb3RvdHlwZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzPWZ1bmN0aW9uKGNsYXNzTmFtZSxzdGF5V2l0aGluKXtyZXR1cm4gdGhpcy5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzTGlzdChbY2xhc3NOYW1lXSxzdGF5V2l0aGluKTt9O05vZGUucHJvdG90eXBlLmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3NMaXN0PWZ1bmN0aW9uKGNsYXNzTmFtZXMsc3RheVdpdGhpbil7Zm9yKGxldCBub2RlPXRoaXM7bm9kZSYmbm9kZSE9PXN0YXlXaXRoaW4mJm5vZGUhPT10aGlzLm93bmVyRG9jdW1lbnQ7bm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKSl7aWYobm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXtsZXQgY29udGFpbnNBbGw9dHJ1ZTtmb3IobGV0IGk9MDtpPGNsYXNzTmFtZXMubGVuZ3RoJiZjb250YWluc0FsbDsrK2kpe2lmKCFub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVzW2ldKSkKY29udGFpbnNBbGw9ZmFsc2U7fQppZihjb250YWluc0FsbCkKcmV0dXJuKG5vZGUpO319CnJldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUucGFyZW50RWxlbWVudE9yU2hhZG93SG9zdD1mdW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJnRoaXMuaG9zdCkKcmV0dXJuKHRoaXMuaG9zdCk7Y29uc3Qgbm9kZT10aGlzLnBhcmVudE5vZGU7aWYoIW5vZGUpCnJldHVybiBudWxsO2lmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkKcmV0dXJuKG5vZGUpO2lmKG5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpCnJldHVybihub2RlLmhvc3QpO3JldHVybiBudWxsO307Tm9kZS5wcm90b3R5cGUucGFyZW50Tm9kZU9yU2hhZG93SG9zdD1mdW5jdGlvbigpe2lmKHRoaXMucGFyZW50Tm9kZSkKcmV0dXJuIHRoaXMucGFyZW50Tm9kZTtpZih0aGlzLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZ0aGlzLmhvc3QpCnJldHVybiB0aGlzLmhvc3Q7cmV0dXJuIG51bGw7fTtOb2RlLnByb3RvdHlwZS5nZXRDb21wb25lbnRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgcGFyZW50PXRoaXMucGFyZW50Tm9kZTt3aGlsZShwYXJlbnQmJnBhcmVudC5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKcGFyZW50PXBhcmVudC5wYXJlbnROb2RlO3JldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290P3BhcmVudC5nZXRTZWxlY3Rpb24oKTp0aGlzLndpbmRvdygpLmdldFNlbGVjdGlvbigpO307Tm9kZS5wcm90b3R5cGUuaGFzU2VsZWN0aW9uPWZ1bmN0aW9uKCl7Y29uc3QgY29udGVudHM9dGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdjb250ZW50Jyk7Zm9yKGNvbnN0IGNvbnRlbnQgb2YgY29udGVudHMpe2lmKEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoY29udGVudC5nZXREaXN0cmlidXRlZE5vZGVzKCksbm9kZT0+bm9kZS5oYXNTZWxlY3Rpb24oKSkpCnJldHVybiB0cnVlO30KY29uc3Qgc2VsZWN0aW9uPXRoaXMuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7aWYoc2VsZWN0aW9uLnR5cGUhPT0nUmFuZ2UnKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHNlbGVjdGlvbi5jb250YWluc05vZGUodGhpcyx0cnVlKXx8c2VsZWN0aW9uLmFuY2hvck5vZGUuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMpfHxzZWxlY3Rpb24uZm9jdXNOb2RlLmlzU2VsZk9yRGVzY2VuZGFudCh0aGlzKTt9O05vZGUucHJvdG90eXBlLndpbmRvdz1mdW5jdGlvbigpe3JldHVybih0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO307RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXtpZih0aGlzLmZpcnN0Q2hpbGQpCnRoaXMudGV4dENvbnRlbnQ9Jyc7fTtmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZ05hbWUsY3VzdG9tRWxlbWVudFR5cGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUsY3VzdG9tRWxlbWVudFR5cGV8fCcnKTt9CmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKGRhdGEpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTt9CkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50V2l0aENsYXNzPWZ1bmN0aW9uKGVsZW1lbnROYW1lLGNsYXNzTmFtZSxjdXN0b21FbGVtZW50VHlwZSl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUsY3VzdG9tRWxlbWVudFR5cGV8fCcnKTtpZihjbGFzc05hbWUpCmVsZW1lbnQuY2xhc3NOYW1lPWNsYXNzTmFtZTtyZXR1cm4gZWxlbWVudDt9O2Z1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoZWxlbWVudE5hbWUsY2xhc3NOYW1lLGN1c3RvbUVsZW1lbnRUeXBlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudFdpdGhDbGFzcyhlbGVtZW50TmFtZSxjbGFzc05hbWUsY3VzdG9tRWxlbWVudFR5cGUpO30KRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR0VsZW1lbnQ9ZnVuY3Rpb24oY2hpbGRUeXBlLGNsYXNzTmFtZSl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLGNoaWxkVHlwZSk7aWYoY2xhc3NOYW1lKQplbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLGNsYXNzTmFtZSk7cmV0dXJuIGVsZW1lbnQ7fTtmdW5jdGlvbiBjcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpO30KZnVuY3Rpb24gY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7fQpFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVDaGlsZD1mdW5jdGlvbihlbGVtZW50TmFtZSxjbGFzc05hbWUsY3VzdG9tRWxlbWVudFR5cGUpe2NvbnN0IGVsZW1lbnQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoZWxlbWVudE5hbWUsY2xhc3NOYW1lLGN1c3RvbUVsZW1lbnRUeXBlKTt0aGlzLmFwcGVuZENoaWxkKGVsZW1lbnQpO3JldHVybiBlbGVtZW50O307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuY3JlYXRlQ2hpbGQ9RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlQ2hpbGQ7RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkPWZ1bmN0aW9uKHRleHQpe2NvbnN0IGVsZW1lbnQ9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO3RoaXMuYXBwZW5kQ2hpbGQoZWxlbWVudCk7cmV0dXJuIGVsZW1lbnQ7fTtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5jcmVhdGVUZXh0Q2hpbGQ9RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkO0VsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVRleHRDaGlsZHJlbj1mdW5jdGlvbih2YXJfYXJncyl7Zm9yKGxldCBpPTAsbj1hcmd1bWVudHMubGVuZ3RoO2k8bjsrK2kpCnRoaXMuY3JlYXRlVGV4dENoaWxkKGFyZ3VtZW50c1tpXSk7fTtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5jcmVhdGVUZXh0Q2hpbGRyZW49RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dENoaWxkcmVuO0VsZW1lbnQucHJvdG90eXBlLnRvdGFsT2Zmc2V0TGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvdGFsT2Zmc2V0KCkubGVmdDt9O0VsZW1lbnQucHJvdG90eXBlLnRvdGFsT2Zmc2V0VG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG90YWxPZmZzZXQoKS50b3A7fTtFbGVtZW50LnByb3RvdHlwZS50b3RhbE9mZnNldD1mdW5jdGlvbigpe2NvbnN0IHJlY3Q9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDpyZWN0LmxlZnQsdG9wOnJlY3QudG9wfTt9O0VsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNWR0NoaWxkPWZ1bmN0aW9uKGNoaWxkVHlwZSxjbGFzc05hbWUpe2NvbnN0IGNoaWxkPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVTVkdFbGVtZW50KGNoaWxkVHlwZSxjbGFzc05hbWUpO3RoaXMuYXBwZW5kQ2hpbGQoY2hpbGQpO3JldHVybiBjaGlsZDt9O3ZhciBBbmNob3JCb3g9Y2xhc3N7Y29uc3RydWN0b3IoeCx5LHdpZHRoLGhlaWdodCl7dGhpcy54PXh8fDA7dGhpcy55PXl8fDA7dGhpcy53aWR0aD13aWR0aHx8MDt0aGlzLmhlaWdodD1oZWlnaHR8fDA7fQpjb250YWlucyh4LHkpe3JldHVybiB4Pj10aGlzLngmJng8PXRoaXMueCt0aGlzLndpZHRoJiZ5Pj10aGlzLnkmJnk8PXRoaXMueSt0aGlzLmhlaWdodDt9fTtBbmNob3JCb3gucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oYm94KXtyZXR1cm4gbmV3IEFuY2hvckJveCh0aGlzLngtYm94LngsdGhpcy55LWJveC55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO307QW5jaG9yQm94LnByb3RvdHlwZS5yZWxhdGl2ZVRvRWxlbWVudD1mdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gdGhpcy5yZWxhdGl2ZVRvKGVsZW1lbnQuYm94SW5XaW5kb3coZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSk7fTtBbmNob3JCb3gucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihhbmNob3JCb3gpe3JldHVybiEhYW5jaG9yQm94JiZ0aGlzLng9PT1hbmNob3JCb3gueCYmdGhpcy55PT09YW5jaG9yQm94LnkmJnRoaXMud2lkdGg9PT1hbmNob3JCb3gud2lkdGgmJnRoaXMuaGVpZ2h0PT09YW5jaG9yQm94LmhlaWdodDt9O0VsZW1lbnQucHJvdG90eXBlLmJveEluV2luZG93PWZ1bmN0aW9uKHRhcmdldFdpbmRvdyl7dGFyZ2V0V2luZG93PXRhcmdldFdpbmRvd3x8dGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O2NvbnN0IGFuY2hvckJveD1uZXcgQW5jaG9yQm94KCk7bGV0IGN1ckVsZW1lbnQ9dGhpcztsZXQgY3VyV2luZG93PXRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldzt3aGlsZShjdXJXaW5kb3cmJmN1ckVsZW1lbnQpe2FuY2hvckJveC54Kz1jdXJFbGVtZW50LnRvdGFsT2Zmc2V0TGVmdCgpO2FuY2hvckJveC55Kz1jdXJFbGVtZW50LnRvdGFsT2Zmc2V0VG9wKCk7aWYoY3VyV2luZG93PT09dGFyZ2V0V2luZG93KQpicmVhaztjdXJFbGVtZW50PWN1cldpbmRvdy5mcmFtZUVsZW1lbnQ7Y3VyV2luZG93PWN1cldpbmRvdy5wYXJlbnQ7fQphbmNob3JCb3gud2lkdGg9TWF0aC5taW4odGhpcy5vZmZzZXRXaWR0aCx0YXJnZXRXaW5kb3cuaW5uZXJXaWR0aC1hbmNob3JCb3gueCk7YW5jaG9yQm94LmhlaWdodD1NYXRoLm1pbih0aGlzLm9mZnNldEhlaWdodCx0YXJnZXRXaW5kb3cuaW5uZXJIZWlnaHQtYW5jaG9yQm94LnkpO3JldHVybiBhbmNob3JCb3g7fTtFdmVudC5wcm90b3R5cGUuY29uc3VtZT1mdW5jdGlvbihwcmV2ZW50RGVmYXVsdCl7dGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtpZihwcmV2ZW50RGVmYXVsdCkKdGhpcy5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGFuZGxlZD10cnVlO307VGV4dC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9c3RhcnR8fDA7ZW5kPWVuZHx8dGhpcy50ZXh0Q29udGVudC5sZW5ndGg7aWYoc3RhcnQ8MCkKc3RhcnQ9ZW5kK3N0YXJ0O2NvbnN0IHNlbGVjdGlvbj10aGlzLmdldENvbXBvbmVudFNlbGVjdGlvbigpO3NlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtjb25zdCByYW5nZT10aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtyYW5nZS5zZXRTdGFydCh0aGlzLHN0YXJ0KTtyYW5nZS5zZXRFbmQodGhpcyxlbmQpO3NlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7cmV0dXJuIHRoaXM7fTtFbGVtZW50LnByb3RvdHlwZS5zZWxlY3Rpb25MZWZ0T2Zmc2V0PWZ1bmN0aW9uKCl7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7aWYoIXNlbGVjdGlvbi5jb250YWluc05vZGUodGhpcyx0cnVlKSkKcmV0dXJuIG51bGw7bGV0IGxlZnRPZmZzZXQ9c2VsZWN0aW9uLmFuY2hvck9mZnNldDtsZXQgbm9kZT1zZWxlY3Rpb24uYW5jaG9yTm9kZTt3aGlsZShub2RlIT09dGhpcyl7d2hpbGUobm9kZS5wcmV2aW91c1NpYmxpbmcpe25vZGU9bm9kZS5wcmV2aW91c1NpYmxpbmc7bGVmdE9mZnNldCs9bm9kZS50ZXh0Q29udGVudC5sZW5ndGg7fQpub2RlPW5vZGUucGFyZW50Tm9kZU9yU2hhZG93SG9zdCgpO30KcmV0dXJuIGxlZnRPZmZzZXQ7fTtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZHJlbj1mdW5jdGlvbih2YXJfYXJncyl7Zm9yKGxldCBpPTAsbj1hcmd1bWVudHMubGVuZ3RoO2k8bjsrK2kpCnRoaXMuYXBwZW5kQ2hpbGQoYXJndW1lbnRzW2ldKTt9O05vZGUucHJvdG90eXBlLmRlZXBUZXh0Q29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkVGV4dE5vZGVzKCkubWFwKGZ1bmN0aW9uKG5vZGUpe3JldHVybiBub2RlLnRleHRDb250ZW50O30pLmpvaW4oJycpO307Tm9kZS5wcm90b3R5cGUuY2hpbGRUZXh0Tm9kZXM9ZnVuY3Rpb24oKXtsZXQgbm9kZT10aGlzLnRyYXZlcnNlTmV4dFRleHROb2RlKHRoaXMpO2NvbnN0IHJlc3VsdD1bXTtjb25zdCBub25UZXh0VGFncz17J1NUWUxFJzoxLCdTQ1JJUFQnOjF9O3doaWxlKG5vZGUpe2lmKCFub25UZXh0VGFnc1tub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWVdKQpyZXN1bHQucHVzaChub2RlKTtub2RlPW5vZGUudHJhdmVyc2VOZXh0VGV4dE5vZGUodGhpcyk7fQpyZXR1cm4gcmVzdWx0O307Tm9kZS5wcm90b3R5cGUuaXNBbmNlc3Rvcj1mdW5jdGlvbihub2RlKXtpZighbm9kZSkKcmV0dXJuIGZhbHNlO2xldCBjdXJyZW50Tm9kZT1ub2RlLnBhcmVudE5vZGVPclNoYWRvd0hvc3QoKTt3aGlsZShjdXJyZW50Tm9kZSl7aWYodGhpcz09PWN1cnJlbnROb2RlKQpyZXR1cm4gdHJ1ZTtjdXJyZW50Tm9kZT1jdXJyZW50Tm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fQpyZXR1cm4gZmFsc2U7fTtOb2RlLnByb3RvdHlwZS5pc0Rlc2NlbmRhbnQ9ZnVuY3Rpb24oZGVzY2VuZGFudCl7cmV0dXJuISFkZXNjZW5kYW50JiZkZXNjZW5kYW50LmlzQW5jZXN0b3IodGhpcyk7fTtOb2RlLnByb3RvdHlwZS5pc1NlbGZPckFuY2VzdG9yPWZ1bmN0aW9uKG5vZGUpe3JldHVybiEhbm9kZSYmKG5vZGU9PT10aGlzfHx0aGlzLmlzQW5jZXN0b3Iobm9kZSkpO307Tm9kZS5wcm90b3R5cGUuaXNTZWxmT3JEZXNjZW5kYW50PWZ1bmN0aW9uKG5vZGUpe3JldHVybiEhbm9kZSYmKG5vZGU9PT10aGlzfHx0aGlzLmlzRGVzY2VuZGFudChub2RlKSk7fTtOb2RlLnByb3RvdHlwZS50cmF2ZXJzZU5leHROb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2lmKHRoaXMuc2hhZG93Um9vdCkKcmV0dXJuIHRoaXMuc2hhZG93Um9vdDtjb25zdCBkaXN0cmlidXRlZE5vZGVzPXRoaXMuZ2V0RGlzdHJpYnV0ZWROb2Rlcz90aGlzLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpbXTtpZihkaXN0cmlidXRlZE5vZGVzLmxlbmd0aCkKcmV0dXJuIGRpc3RyaWJ1dGVkTm9kZXNbMF07aWYodGhpcy5maXJzdENoaWxkKQpyZXR1cm4gdGhpcy5maXJzdENoaWxkO2xldCBub2RlPXRoaXM7d2hpbGUobm9kZSl7aWYoc3RheVdpdGhpbiYmbm9kZT09PXN0YXlXaXRoaW4pCnJldHVybiBudWxsO2NvbnN0IHNpYmxpbmc9bmV4dFNpYmxpbmcobm9kZSk7aWYoc2libGluZykKcmV0dXJuIHNpYmxpbmc7bm9kZT1pbnNlcnRpb25Qb2ludChub2RlKXx8bm9kZS5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fQpmdW5jdGlvbiBuZXh0U2libGluZyhub2RlKXtjb25zdCBwYXJlbnQ9aW5zZXJ0aW9uUG9pbnQobm9kZSk7aWYoIXBhcmVudCkKcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7Y29uc3QgZGlzdHJpYnV0ZWROb2Rlcz1wYXJlbnQuZ2V0RGlzdHJpYnV0ZWROb2Rlcz9wYXJlbnQuZ2V0RGlzdHJpYnV0ZWROb2RlcygpOltdO2NvbnN0IHBvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZGlzdHJpYnV0ZWROb2Rlcyxub2RlKTtpZihwb3NpdGlvbisxPGRpc3RyaWJ1dGVkTm9kZXMubGVuZ3RoKQpyZXR1cm4gZGlzdHJpYnV0ZWROb2Rlc1twb3NpdGlvbisxXTtyZXR1cm4gbnVsbDt9CmZ1bmN0aW9uIGluc2VydGlvblBvaW50KG5vZGUpe2NvbnN0IGluc2VydGlvblBvaW50cz1ub2RlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzP25vZGUuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKTpbXTtyZXR1cm4gaW5zZXJ0aW9uUG9pbnRzLmxlbmd0aD4wP2luc2VydGlvblBvaW50c1tpbnNlcnRpb25Qb2ludHMubGVuZ3RoLTFdOm51bGw7fQpyZXR1cm4gbnVsbDt9O05vZGUucHJvdG90eXBlLnRyYXZlcnNlUHJldmlvdXNOb2RlPWZ1bmN0aW9uKHN0YXlXaXRoaW4pe2lmKHN0YXlXaXRoaW4mJnRoaXM9PT1zdGF5V2l0aGluKQpyZXR1cm4gbnVsbDtsZXQgbm9kZT10aGlzLnByZXZpb3VzU2libGluZzt3aGlsZShub2RlJiZub2RlLmxhc3RDaGlsZCkKbm9kZT1ub2RlLmxhc3RDaGlsZDtpZihub2RlKQpyZXR1cm4gbm9kZTtyZXR1cm4gdGhpcy5wYXJlbnROb2RlT3JTaGFkb3dIb3N0KCk7fTtOb2RlLnByb3RvdHlwZS5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkPWZ1bmN0aW9uKHRleHQscGxhY2Vob2xkZXIpe2NvbnN0IG1heFRleHRDb250ZW50TGVuZ3RoPTEwMDAwO2lmKHR5cGVvZiB0ZXh0PT09J3N0cmluZycmJnRleHQubGVuZ3RoPm1heFRleHRDb250ZW50TGVuZ3RoKXt0aGlzLnRleHRDb250ZW50PXR5cGVvZiBwbGFjZWhvbGRlcj09PSdzdHJpbmcnP3BsYWNlaG9sZGVyOnRleHQudHJpbU1pZGRsZShtYXhUZXh0Q29udGVudExlbmd0aCk7cmV0dXJuIHRydWU7fQp0aGlzLnRleHRDb250ZW50PXRleHQ7cmV0dXJuIGZhbHNlO307RXZlbnQucHJvdG90eXBlLmRlZXBFbGVtZW50RnJvbVBvaW50PWZ1bmN0aW9uKCl7aWYoIXRoaXMud2hpY2gmJiF0aGlzLnBhZ2VYJiYhdGhpcy5wYWdlWSYmIXRoaXMuY2xpZW50WCYmIXRoaXMuY2xpZW50WSYmIXRoaXMubW92ZW1lbnRYJiYhdGhpcy5tb3ZlbWVudFkpCnJldHVybiBudWxsO2NvbnN0IHJvb3Q9dGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LmdldENvbXBvbmVudFJvb3QoKTtyZXR1cm4gcm9vdD9yb290LmRlZXBFbGVtZW50RnJvbVBvaW50KHRoaXMucGFnZVgsdGhpcy5wYWdlWSk6bnVsbDt9O0RvY3VtZW50LnByb3RvdHlwZS5kZWVwRWxlbWVudEZyb21Qb2ludD1mdW5jdGlvbih4LHkpe2xldCBjb250YWluZXI9dGhpcztsZXQgbm9kZT1udWxsO3doaWxlKGNvbnRhaW5lcil7Y29uc3QgaW5uZXJOb2RlPWNvbnRhaW5lci5lbGVtZW50RnJvbVBvaW50KHgseSk7aWYoIWlubmVyTm9kZXx8bm9kZT09PWlubmVyTm9kZSkKYnJlYWs7bm9kZT1pbm5lck5vZGU7Y29udGFpbmVyPW5vZGUuc2hhZG93Um9vdDt9CnJldHVybiBub2RlO307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuZGVlcEVsZW1lbnRGcm9tUG9pbnQ9RG9jdW1lbnQucHJvdG90eXBlLmRlZXBFbGVtZW50RnJvbVBvaW50O0RvY3VtZW50LnByb3RvdHlwZS5kZWVwQWN0aXZlRWxlbWVudD1mdW5jdGlvbigpe2xldCBhY3RpdmVFbGVtZW50PXRoaXMuYWN0aXZlRWxlbWVudDt3aGlsZShhY3RpdmVFbGVtZW50JiZhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QmJmFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KQphY3RpdmVFbGVtZW50PWFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O3JldHVybiBhY3RpdmVFbGVtZW50O307RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuZGVlcEFjdGl2ZUVsZW1lbnQ9RG9jdW1lbnQucHJvdG90eXBlLmRlZXBBY3RpdmVFbGVtZW50O0VsZW1lbnQucHJvdG90eXBlLmhhc0ZvY3VzPWZ1bmN0aW9uKCl7Y29uc3Qgcm9vdD10aGlzLmdldENvbXBvbmVudFJvb3QoKTtyZXR1cm4hIXJvb3QmJnRoaXMuaXNTZWxmT3JBbmNlc3Rvcihyb290LmFjdGl2ZUVsZW1lbnQpO307Tm9kZS5wcm90b3R5cGUuZ2V0Q29tcG9uZW50Um9vdD1mdW5jdGlvbigpe2xldCBub2RlPXRoaXM7d2hpbGUobm9kZSYmbm9kZS5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmbm9kZS5ub2RlVHlwZSE9PU5vZGUuRE9DVU1FTlRfTk9ERSkKbm9kZT1ub2RlLnBhcmVudE5vZGU7cmV0dXJuKG5vZGUpO307ZnVuY3Rpb24gaXNFbnRlcktleShldmVudCl7cmV0dXJuIGV2ZW50LmtleUNvZGUhPT0yMjkmJmV2ZW50LmtleT09PSdFbnRlcic7fQpmdW5jdGlvbiBpc0VzY0tleShldmVudCl7cmV0dXJuIGV2ZW50LmtleUNvZGU9PT0yNzt9O3NlbGZbJ1Rvb2xib3hCb290c3RyYXAnXT1zZWxmWydUb29sYm94Qm9vdHN0cmFwJ118fHt9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHRvb2xib3hMb2FkZWQoKXtpZighd2luZG93Lm9wZW5lcikKcmV0dXJuO2NvbnN0IGFwcD13aW5kb3cub3BlbmVyWydFbXVsYXRpb24nXVsnQWR2YW5jZWRBcHAnXVsnX2luc3RhbmNlJ10oKTthcHBbJ3Rvb2xib3hMb2FkZWQnXShkb2N1bWVudCk7fQpydW5PbldpbmRvd0xvYWQodG9vbGJveExvYWRlZCk7fSkoKTs7OzwhLS0KICogQ29weXJpZ2h0IDIwMTggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+CjwhZG9jdHlwZSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TZWN1cml0eS1Qb2xpY3kiIGNvbnRlbnQ9Im9iamVjdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICdzZWxmJyAndW5zYWZlLWV2YWwnICd1bnNhZmUtaW5saW5lJyBodHRwczovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbSI+CiAgICA8bWV0YSBuYW1lPSJyZWZlcnJlciIgY29udGVudD0ibm8tcmVmZXJyZXIiPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ic2hlbGwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0id29ya2VyX2FwcC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PlJ1bnRpbWUuc3RhcnRBcHBsaWNhdGlvbignd29ya2VyX2FwcCcpOzwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ1bmRvY2tlZCIgaWQ9Ii1ibGluay1kZXYtdG9vbHMiPjwvYm9keT4KPC9odG1sPgphbGxEZXNjcmlwdG9ycy5wdXNoKC4uLlt7ImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJzZGsiLCJ1aSIsInByb3RvY29sIl0sImV4dGVuc2lvbnMiOlt7ImRlZmF1bHRWYWx1ZSI6W10sInR5cGUiOiJzZXR0aW5nIiwic2V0dGluZ05hbWUiOiJjdXN0b21OZXR3b3JrQ29uZGl0aW9ucyIsInNldHRpbmdUeXBlIjoiYXJyYXkifSx7ImNhdGVnb3J5IjoiTmV0d29yayIsInRhZ3MiOiJkZXZpY2UsIHRocm90dGxpbmciLCJ0aXRsZSI6IkdvIG9mZmxpbmUiLCJjbGFzc05hbWUiOiJNb2JpbGVUaHJvdHRsaW5nLlRocm90dGxpbmdNYW5hZ2VyLkFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJuZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1vZmZsaW5lIiwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGFncyI6ImRldmljZSwgdGhyb3R0bGluZyIsInRpdGxlIjoiRW5hYmxlIHNsb3cgM0cgdGhyb3R0bGluZyIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLWxvdy1lbmQtbW9iaWxlIiwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJOZXR3b3JrIiwidGFncyI6ImRldmljZSwgdGhyb3R0bGluZyIsInRpdGxlIjoiRW5hYmxlIGZhc3QgM0cgdGhyb3R0bGluZyIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLW1pZC10aWVyLW1vYmlsZSIsInR5cGUiOiJhY3Rpb24ifSx7ImNhdGVnb3J5IjoiTmV0d29yayIsInRhZ3MiOiJkZXZpY2UsIHRocm90dGxpbmciLCJ0aXRsZSI6IkdvIG9ubGluZSIsImNsYXNzTmFtZSI6Ik1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuQWN0aW9uRGVsZWdhdGUiLCJhY3Rpb25JZCI6Im5ldHdvcmstY29uZGl0aW9ucy5uZXR3b3JrLW9ubGluZSIsInR5cGUiOiJhY3Rpb24ifSx7InRpdGxlIjoiVGhyb3R0bGluZyIsInNldHRpbmdzIjpbImN1c3RvbU5ldHdvcmtDb25kaXRpb25zIl0sImlkIjoidGhyb3R0bGluZy1jb25kaXRpb25zIiwiY2xhc3NOYW1lIjoiTW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nU2V0dGluZ3NUYWIiLCJsb2NhdGlvbiI6InNldHRpbmdzLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjozNX1dLCJuYW1lIjoibW9iaWxlX3Rocm90dGxpbmcifSx7ImRlcGVuZGVuY2llcyI6WyJjb21tb24iLCJicm93c2VyX3NkayJdLCJuYW1lIjoiaGFyX2ltcG9ydGVyIiwic2NyaXB0cyI6WyJoYXJfaW1wb3J0ZXJfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImJyb3dzZXJfY29tcG9uZW50cyIsImV4dGVuc2lvbnMiLCJpbmxpbmVfZWRpdG9yIiwiY29sb3JfcGlja2VyIiwiZXZlbnRfbGlzdGVuZXJzIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiRWxlbWVudHMiLCJpZCI6ImVsZW1lbnRzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxMH0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1BhbmVsLkNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLlJlbW90ZU9iamVjdCIsIlNESy5ET01Ob2RlIiwiU0RLLkRlZmVycmVkRE9NTm9kZSJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlJlbmRlcmVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5ET01Ob2RlIiwiU0RLLkRlZmVycmVkRE9NTm9kZSJdLCJ0eXBlIjoiQENvbW1vbi5SZW5kZXJlciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbC5ET01Ob2RlUmV2ZWFsZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRPTU5vZGUiLCJTREsuRGVmZXJyZWRET01Ob2RlIiwiU0RLLlJlbW90ZU9iamVjdCJdLCJkZXN0aW5hdGlvbiI6IkVsZW1lbnRzIHBhbmVsIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkRPTUxpbmtpZmllci5MaW5raWZpZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkRPTU5vZGUiLCJTREsuRGVmZXJyZWRET01Ob2RlIl0sInR5cGUiOiJAQ29tbW9uLkxpbmtpZmllciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbC5DU1NQcm9wZXJ0eVJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5DU1NQcm9wZXJ0eSJdLCJkZXN0aW5hdGlvbiI6InN0eWxlcyBzaWRlYmFyIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifSx7ImNhdGVnb3J5IjoiRWxlbWVudHMiLCJ0aXRsZSI6IkNvbG9yIGZvcm1hdDoiLCJkZWZhdWx0VmFsdWUiOiJvcmlnaW5hbCIsIm9wdGlvbnMiOlt7InRleHQiOiJBcyBhdXRob3JlZCIsInZhbHVlIjoib3JpZ2luYWwiLCJ0aXRsZSI6IlNldCBjb2xvciBmb3JtYXQgYXMgYXV0aG9yZWQifSx7InJhdyI6dHJ1ZSwidGV4dCI6IkhFWDogI2RhYzBkZSIsInZhbHVlIjoiaGV4IiwidGl0bGUiOiJTZXQgY29sb3IgZm9ybWF0IHRvIEhFWCJ9LHsicmF3Ijp0cnVlLCJ0ZXh0IjoiUkdCOiByZ2IoMTI4LCAyNTUsIDI1NSkiLCJ2YWx1ZSI6InJnYiIsInRpdGxlIjoiU2V0IGNvbG9yIGZvcm1hdCB0byBSR0IifSx7InJhdyI6dHJ1ZSwidGV4dCI6IkhTTDogaHNsKDMwMCwgODAlLCA5MCUpIiwidmFsdWUiOiJoc2wiLCJ0aXRsZSI6IlNldCBjb2xvciBmb3JtYXQgdG8gSFNMIn1dLCJzZXR0aW5nTmFtZSI6ImNvbG9yRm9ybWF0Iiwic2V0dGluZ1R5cGUiOiJlbnVtIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MH0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJTaG93IHVzZXIgYWdlbnQgc2hhZG93IERPTSIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoic2hvd1VBU2hhZG93RE9NIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6MX0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJXb3JkIHdyYXAiLCJkZWZhdWx0VmFsdWUiOnRydWUsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkVuYWJsZSBET00gd29yZCB3cmFwIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRGlzYWJsZSBET00gd29yZCB3cmFwIn1dLCJzZXR0aW5nTmFtZSI6ImRvbVdvcmRXcmFwIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6Mn0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJTaG93IEhUTUwgY29tbWVudHMiLCJkZWZhdWx0VmFsdWUiOnRydWUsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IlNob3cgSFRNTCBjb21tZW50cyJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IkhpZGUgSFRNTCBjb21tZW50cyJ9XSwic2V0dGluZ05hbWUiOiJzaG93SFRNTENvbW1lbnRzIiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmciLCJvcmRlciI6M30seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwidGl0bGUiOiJSZXZlYWwgRE9NIG5vZGUgb24gaG92ZXIiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiaGlnaGxpZ2h0Tm9kZU9uSG92ZXJJbk92ZXJsYXkiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9yZGVyIjo0fSx7ImRlZmF1bHRWYWx1ZSI6dHJ1ZSwidHlwZSI6InNldHRpbmciLCJzZXR0aW5nTmFtZSI6InNob3dFdmVudExpc3RlbmVyc0ZvckFuY2VzdG9ycyIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudFN0YXRlUGFuZVdpZGdldC5CdXR0b25Qcm92aWRlciIsInR5cGUiOiJAVUkuVG9vbGJhckl0ZW0uUHJvdmlkZXIiLCJvcmRlciI6MSwibG9jYXRpb24iOiJzdHlsZXMtc2lkZWJhcnBhbmUtdG9vbGJhciJ9LHsiY2xhc3NOYW1lIjoiRWxlbWVudHMuQ2xhc3Nlc1BhbmVXaWRnZXQuQnV0dG9uUHJvdmlkZXIiLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwib3JkZXIiOjIsImxvY2F0aW9uIjoic3R5bGVzLXNpZGViYXJwYW5lLXRvb2xiYXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lLkJ1dHRvblByb3ZpZGVyIiwidHlwZSI6IkBVSS5Ub29sYmFySXRlbS5Qcm92aWRlciIsIm9yZGVyIjoxMDAsImxvY2F0aW9uIjoic3R5bGVzLXNpZGViYXJwYW5lLXRvb2xiYXIifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkVsZW1lbnRzQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiRWxlbWVudHMuRWxlbWVudHNQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJIIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy5oaWRlLWVsZW1lbnQifSx7ImNsYXNzTmFtZSI6IkVsZW1lbnRzLkVsZW1lbnRzQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiRWxlbWVudHMuRWxlbWVudHNQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJGMiJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiZWxlbWVudHMuZWRpdC1hcy1odG1sIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIkVsZW1lbnRzLkVsZW1lbnRzUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtaIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStaIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy51bmRvIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c0FjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIkVsZW1lbnRzLkVsZW1lbnRzUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtZIn0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStTaGlmdCtaIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJlbGVtZW50cy5yZWRvIn0seyJjbGFzc05hbWUiOiJFbGVtZW50cy5FbGVtZW50c1BhbmVsLlBzZXVkb1N0YXRlTWFya2VyRGVjb3JhdG9yIiwibWFya2VyIjoicHNldWRvLXN0YXRlLW1hcmtlciIsInR5cGUiOiJARWxlbWVudHMuTWFya2VyRGVjb3JhdG9yIn0seyJtYXJrZXIiOiJoaWRkZW4tbWFya2VyIiwiZmFjdG9yeU5hbWUiOiJFbGVtZW50cy5HZW5lcmljRGVjb3JhdG9yIiwidHlwZSI6IkBFbGVtZW50cy5NYXJrZXJEZWNvcmF0b3IiLCJjb2xvciI6IiM1NTUiLCJ0aXRsZSI6IkVsZW1lbnQgaXMgaGlkZGVuIn0seyJpY29uQ2xhc3MiOiJsYXJnZWljb24tbm9kZS1zZWFyY2giLCJ0aXRsZSI6IlNlbGVjdCBhbiBlbGVtZW50IGluIHRoZSBwYWdlIHRvIGluc3BlY3QgaXQiLCJjbGFzc05hbWUiOiJFbGVtZW50cy5JbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyLlRvZ2dsZVNlYXJjaEFjdGlvbkRlbGVnYXRlIiwiYWN0aW9uSWQiOiJlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2giLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK1NoaWZ0K0MifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK1NoaWZ0K0MifV0sInR5cGUiOiJhY3Rpb24ifSx7Im9yZGVyIjowLCJ0eXBlIjoiQFVJLlRvb2xiYXJJdGVtLlByb3ZpZGVyIiwiYWN0aW9uSWQiOiJlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2giLCJsb2NhdGlvbiI6Im1haW4tdG9vbGJhci1sZWZ0In0seyJjYXRlZ29yeSI6IkVsZW1lbnRzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRWxlbWVudHNQYW5lbCIsInR5cGUiOiJAVUkuVmlld0xvY2F0aW9uUmVzb2x2ZXIiLCJuYW1lIjoiZWxlbWVudHMtc2lkZWJhciJ9LHsidGl0bGUiOiJFdmVudCBMaXN0ZW5lcnMiLCJpZCI6ImVsZW1lbnRzLmV2ZW50TGlzdGVuZXJzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQiLCJsb2NhdGlvbiI6ImVsZW1lbnRzLXNpZGViYXIiLCJoYXNUb29sYmFyIjp0cnVlLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo1LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJQcm9wZXJ0aWVzIiwiaWQiOiJlbGVtZW50cy5kb21Qcm9wZXJ0aWVzIiwiY2xhc3NOYW1lIjoiRWxlbWVudHMuUHJvcGVydGllc1dpZGdldCIsImxvY2F0aW9uIjoiZWxlbWVudHMtc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In1dLCJuYW1lIjoiZWxlbWVudHMiLCJzY3JpcHRzIjpbImVsZW1lbnRzX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJ1aSIsImhvc3QiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJXaGF0J3MgTmV3IiwiaWQiOiJyZWxlYXNlLW5vdGUiLCJjbGFzc05hbWUiOiJIZWxwLlJlbGVhc2VOb3RlVmlldyIsImxvY2F0aW9uIjoiZHJhd2VyLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjoxLCJwZXJzaXN0ZW5jZSI6ImNsb3NlYWJsZSJ9LHsiY2F0ZWdvcnkiOiJBcHBlYXJhbmNlIiwidGl0bGUiOiJTaG93IFdoYXQncyBOZXcgYWZ0ZXIgZWFjaCB1cGRhdGUiLCJkZWZhdWx0VmFsdWUiOnRydWUsInNldHRpbmdOYW1lIjoiaGVscC5zaG93LXJlbGVhc2Utbm90ZSIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiU2hvdyBXaGF0J3MgTmV3IGFmdGVyIGVhY2ggdXBkYXRlIn0seyJ2YWx1ZSI6ZmFsc2UsInRpdGxlIjoiRG8gbm90IHNob3cgV2hhdCdzIE5ldyBhZnRlciBlYWNoIHVwZGF0ZSJ9XX0seyJjYXRlZ29yeSI6IkhlbHAiLCJjbGFzc05hbWUiOiJIZWxwLlJlbGVhc2VOb3Rlc0FjdGlvbkRlbGVnYXRlIiwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoiaGVscC5yZWxlYXNlLW5vdGVzIiwidGl0bGUiOiJSZWxlYXNlIG5vdGVzIn0seyJvcmRlciI6MTAsInR5cGUiOiJjb250ZXh0LW1lbnUtaXRlbSIsImxvY2F0aW9uIjoibWFpbk1lbnVIZWxwL2RlZmF1bHQiLCJhY3Rpb25JZCI6ImhlbHAucmVsZWFzZS1ub3RlcyJ9LHsiY2xhc3NOYW1lIjoiSGVscC5IZWxwTGF0ZUluaXRpYWxpemF0aW9uIiwidHlwZSI6ImxhdGUtaW5pdGlhbGl6YXRpb24ifV0sIm5hbWUiOiJoZWxwIiwic2NyaXB0cyI6WyJoZWxwX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJicm93c2VyX3NkayIsImNvbnNvbGUiXSwiZXh0ZW5zaW9ucyI6W3siY2xhc3NOYW1lIjoiQnJvd3NlckNvbnNvbGUuQnJvd3NlckNvbnNvbGUiLCJjb250ZXh0VHlwZXMiOlsiU0RLLkNvbnNvbGVNZXNzYWdlIl0sInR5cGUiOiJAVUkuQ29udGV4dE1lbnUuUHJvdmlkZXIifSx7ImNsYXNzTmFtZSI6IkJyb3dzZXJDb25zb2xlLkJyb3dzZXJDb25zb2xlIiwiY29udGV4dFR5cGVzIjpbIlNESy5Db25zb2xlTWVzc2FnZSJdLCJ0eXBlIjoiQENvbW1vbi5SZW5kZXJlciIsInNvdXJjZSI6Im5ldHdvcmsifV0sIm5hbWUiOiJicm93c2VyX2NvbnNvbGUiLCJzY3JpcHRzIjpbImJyb3dzZXJfY29uc29sZV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsiYnJvd3Nlcl9jb21wb25lbnRzIiwibGF5ZXJfdmlld2VyIiwidGltZWxpbmVfbW9kZWwiLCJwZXJmX3VpIiwiZXh0ZW5zaW9ucyIsImRhdGFfZ3JpZCIsInByb2R1Y3RfcmVnaXN0cnkiLCJwcm9maWxlciIsIm1vYmlsZV90aHJvdHRsaW5nIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiUGVyZm9ybWFuY2UiLCJpZCI6InRpbWVsaW5lIiwiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo1MH0seyJjYXRlZ29yeSI6IlBlcmZvcm1hbmNlIiwidGl0bGUiOiJIaWRlIGNocm9tZSBmcmFtZSBpbiBMYXllcnMgdmlldyIsImRlZmF1bHRWYWx1ZSI6ZmFsc2UsInNldHRpbmdOYW1lIjoiZnJhbWVWaWV3ZXJIaWRlQ2hyb21lV2luZG93Iiwic2V0dGluZ1R5cGUiOiJib29sZWFuIiwidHlwZSI6InNldHRpbmcifSx7ImNsYXNzTmFtZSI6IlRpbWVsaW5lLkxvYWRUaW1lbGluZUhhbmRsZXIiLCJ0eXBlIjoiQENvbW1vbi5RdWVyeVBhcmFtSGFuZGxlciIsIm5hbWUiOiJsb2FkVGltZWxpbmVGcm9tVVJMIn0seyJvcmRlciI6MTAsInR5cGUiOiJjb250ZXh0LW1lbnUtaXRlbSIsImxvY2F0aW9uIjoidGltZWxpbmVNZW51L29wZW4iLCJhY3Rpb25JZCI6InRpbWVsaW5lLmxvYWQtZnJvbS1maWxlIn0seyJvcmRlciI6MTUsInR5cGUiOiJjb250ZXh0LW1lbnUtaXRlbSIsImxvY2F0aW9uIjoidGltZWxpbmVNZW51L29wZW4iLCJhY3Rpb25JZCI6InRpbWVsaW5lLnNhdmUtdG8tZmlsZSJ9LHsiaWNvbkNsYXNzIjoibGFyZ2VpY29uLXN0YXJ0LXJlY29yZGluZyIsInRvZ2dsZWRJY29uQ2xhc3MiOiJsYXJnZWljb24tc3RvcC1yZWNvcmRpbmciLCJjbGFzc05hbWUiOiJUaW1lbGluZS5UaW1lbGluZVBhbmVsLkFjdGlvbkRlbGVnYXRlIiwidG9nZ2xlV2l0aFJlZENvbG9yIjp0cnVlLCJhY3Rpb25JZCI6InRpbWVsaW5lLnRvZ2dsZS1yZWNvcmRpbmciLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK0UifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0UifV0sInR5cGUiOiJhY3Rpb24iLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJSZWNvcmQifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJTdG9wIn1dfSx7Imljb25DbGFzcyI6ImxhcmdlaWNvbi1yZWZyZXNoIiwiY2F0ZWdvcnkiOiJQZXJmb3JtYW5jZSIsInRpdGxlIjoiU3RhcnQgcHJvZmlsaW5nIGFuZCByZWxvYWQgcGFnZSIsImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJhY3Rpb25JZCI6InRpbWVsaW5lLnJlY29yZC1yZWxvYWQiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK1NoaWZ0K0UifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK1NoaWZ0K0UifV0sInR5cGUiOiJhY3Rpb24ifSx7ImNhdGVnb3J5IjoiVGltZWxpbmUiLCJ0aXRsZSI6IlNhdmUgcHJvZmlsZVx1MjAyNiIsImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJhY3Rpb25JZCI6InRpbWVsaW5lLnNhdmUtdG8tZmlsZSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrUyJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErUyJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsiY2F0ZWdvcnkiOiJUaW1lbGluZSIsInRpdGxlIjoiTG9hZCBwcm9maWxlXHUyMDI2IiwiY2xhc3NOYW1lIjoiVGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJUaW1lbGluZS5UaW1lbGluZVBhbmVsIl0sImFjdGlvbklkIjoidGltZWxpbmUubG9hZC1mcm9tLWZpbGUiLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK08ifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK08ifV0sInR5cGUiOiJhY3Rpb24ifSx7ImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJbIn1dLCJ0eXBlIjoiYWN0aW9uIiwiYWN0aW9uSWQiOiJ0aW1lbGluZS5qdW1wLXRvLXByZXZpb3VzLWZyYW1lIn0seyJjbGFzc05hbWUiOiJUaW1lbGluZS5UaW1lbGluZVBhbmVsLkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwiXSwiYmluZGluZ3MiOlt7InNob3J0Y3V0IjoiXSJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoidGltZWxpbmUuanVtcC10by1uZXh0LWZyYW1lIn0seyJjYXRlZ29yeSI6IlBlcmZvcm1hbmNlIiwidGl0bGUiOiJTaG93IHJlY2VudCB0aW1lbGluZSBzZXNzaW9ucyIsImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJhY3Rpb25JZCI6InRpbWVsaW5lLnNob3ctaGlzdG9yeSIsImJpbmRpbmdzIjpbeyJwbGF0Zm9ybSI6IndpbmRvd3MsbGludXgiLCJzaG9ydGN1dCI6IkN0cmwrSCJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErWSJ9XSwidHlwZSI6ImFjdGlvbiJ9LHsidGl0bGUiOiJKYXZhU2NyaXB0IFByb2ZpbGVyIiwiaWQiOiJqc19wcm9maWxlciIsImNsYXNzTmFtZSI6IlByb2ZpbGVyLkpTUHJvZmlsZXJQYW5lbCIsImxvY2F0aW9uIjoicGFuZWwiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo2NSwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifSx7ImNsYXNzTmFtZSI6IlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuQWN0aW9uRGVsZWdhdGUiLCJjb250ZXh0VHlwZXMiOlsiVGltZWxpbmUuVGltZWxpbmVQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJBbHQrTGVmdCJ9LHsicGxhdGZvcm0iOiJtYWMiLCJzaG9ydGN1dCI6Ik1ldGErTGVmdCJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoidGltZWxpbmUucHJldmlvdXMtcmVjb3JkaW5nIn0seyJjbGFzc05hbWUiOiJUaW1lbGluZS5UaW1lbGluZVBhbmVsLkFjdGlvbkRlbGVnYXRlIiwiY29udGV4dFR5cGVzIjpbIlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwiXSwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQWx0K1JpZ2h0In0seyJwbGF0Zm9ybSI6Im1hYyIsInNob3J0Y3V0IjoiTWV0YStSaWdodCJ9XSwidHlwZSI6ImFjdGlvbiIsImFjdGlvbklkIjoidGltZWxpbmUubmV4dC1yZWNvcmRpbmcifV0sIm5hbWUiOiJ0aW1lbGluZSIsInNjcmlwdHMiOlsidGltZWxpbmVfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImVsZW1lbnRzIiwic291cmNlcyIsImNvbnNvbGUiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJFdmVudCBMaXN0ZW5lciBCcmVha3BvaW50cyIsImlkIjoic291cmNlcy5ldmVudExpc3RlbmVyQnJlYWtwb2ludHMiLCJjbGFzc05hbWUiOiJCcm93c2VyRGVidWdnZXIuRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzU2lkZWJhclBhbmUiLCJsb2NhdGlvbiI6InNvdXJjZXMtc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjksInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJjbGFzc05hbWUiOiJCcm93c2VyRGVidWdnZXIuWEhSQnJlYWtwb2ludHNTaWRlYmFyUGFuZSIsImNvbnRleHRUeXBlcyI6WyJTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzIl0sInR5cGUiOiJAVUkuQ29udGV4dEZsYXZvckxpc3RlbmVyIn0seyJ0aXRsZSI6IlhIUi9mZXRjaCBCcmVha3BvaW50cyIsImlkIjoic291cmNlcy54aHJCcmVha3BvaW50cyIsImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5YSFJCcmVha3BvaW50c1NpZGViYXJQYW5lIiwibG9jYXRpb24iOiJzb3VyY2VzLXNpZGViYXIiLCJoYXNUb29sYmFyIjp0cnVlLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo1LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJET00gQnJlYWtwb2ludHMiLCJpZCI6InNvdXJjZXMuZG9tQnJlYWtwb2ludHMiLCJmYWN0b3J5TmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5ET01CcmVha3BvaW50c1NpZGViYXJQYW5lIiwibG9jYXRpb24iOiJzb3VyY2VzLXNpZGViYXIiLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo3LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJET00gQnJlYWtwb2ludHMiLCJpZCI6ImVsZW1lbnRzLmRvbUJyZWFrcG9pbnRzIiwiZmFjdG9yeU5hbWUiOiJCcm93c2VyRGVidWdnZXIuRE9NQnJlYWtwb2ludHNTaWRlYmFyUGFuZSIsImxvY2F0aW9uIjoiZWxlbWVudHMtc2lkZWJhciIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjYsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJtYXJrZXIiOiJicmVha3BvaW50LW1hcmtlciIsImZhY3RvcnlOYW1lIjoiRWxlbWVudHMuR2VuZXJpY0RlY29yYXRvciIsInR5cGUiOiJARWxlbWVudHMuTWFya2VyRGVjb3JhdG9yIiwiY29sb3IiOiJyZ2IoMTA1LCAxNDAsIDI1NCkiLCJ0aXRsZSI6IkRPTSBCcmVha3BvaW50In0seyJjbGFzc05hbWUiOiJCcm93c2VyRGVidWdnZXIuRE9NQnJlYWtwb2ludHNTaWRlYmFyUGFuZS5Db250ZXh0TWVudVByb3ZpZGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5ET01Ob2RlIl0sInR5cGUiOiJAVUkuQ29udGV4dE1lbnUuUHJvdmlkZXIifSx7ImNsYXNzTmFtZSI6IkJyb3dzZXJEZWJ1Z2dlci5ET01CcmVha3BvaW50c1NpZGViYXJQYW5lIiwiY29udGV4dFR5cGVzIjpbIlNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHMiXSwidHlwZSI6IkBVSS5Db250ZXh0Rmxhdm9yTGlzdGVuZXIifSx7InRpdGxlIjoiR2xvYmFsIExpc3RlbmVycyIsImlkIjoic291cmNlcy5nbG9iYWxMaXN0ZW5lcnMiLCJjbGFzc05hbWUiOiJCcm93c2VyRGVidWdnZXIuT2JqZWN0RXZlbnRMaXN0ZW5lcnNTaWRlYmFyUGFuZSIsImxvY2F0aW9uIjoic291cmNlcy1zaWRlYmFyIiwiaGFzVG9vbGJhciI6dHJ1ZSwidHlwZSI6InZpZXciLCJvcmRlciI6OCwicGVyc2lzdGVuY2UiOiJwZXJtYW5lbnQifSx7InRpdGxlIjoiUGFnZSIsImlkIjoibmF2aWdhdG9yLW5ldHdvcmsiLCJjbGFzc05hbWUiOiJTb3VyY2VzLk5ldHdvcmtOYXZpZ2F0b3JWaWV3IiwibG9jYXRpb24iOiJuYXZpZ2F0b3ItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjIsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJ0aXRsZSI6Ik92ZXJyaWRlcyIsImlkIjoibmF2aWdhdG9yLW92ZXJyaWRlcyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuT3ZlcnJpZGVzTmF2aWdhdG9yVmlldyIsImxvY2F0aW9uIjoibmF2aWdhdG9yLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo0LCJwZXJzaXN0ZW5jZSI6InBlcm1hbmVudCJ9LHsidGl0bGUiOiJDb250ZW50IHNjcmlwdHMiLCJpZCI6Im5hdmlnYXRvci1jb250ZW50U2NyaXB0cyIsImNsYXNzTmFtZSI6IlNvdXJjZXMuQ29udGVudFNjcmlwdHNOYXZpZ2F0b3JWaWV3IiwibG9jYXRpb24iOiJuYXZpZ2F0b3ItdmlldyIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjUsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJjbGFzc05hbWUiOiJTb3VyY2VzLk92ZXJyaWRlc05hdmlnYXRvclZpZXciLCJ2aWV3SWQiOiJuYXZpZ2F0b3Itb3ZlcnJpZGVzIiwidHlwZSI6IkBTb3VyY2VzLk5hdmlnYXRvclZpZXcifSx7ImNsYXNzTmFtZSI6IlNvdXJjZXMuQ29udGVudFNjcmlwdHNOYXZpZ2F0b3JWaWV3Iiwidmlld0lkIjoibmF2aWdhdG9yLWNvbnRlbnRTY3JpcHRzIiwidHlwZSI6IkBTb3VyY2VzLk5hdmlnYXRvclZpZXcifV0sIm5hbWUiOiJicm93c2VyX2RlYnVnZ2VyIiwic2NyaXB0cyI6WyJicm93c2VyX2RlYnVnZ2VyX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJjb21wb25lbnRzIiwic2RrIiwidGltZWxpbmVfbW9kZWwiLCJ1aSIsInBlcmZfdWkiXSwibmFtZSI6ImxheWVyX3ZpZXdlciIsInNjcmlwdHMiOlsibGF5ZXJfdmlld2VyX21vZHVsZS5qcyJdfSx7ImRlcGVuZGVuY2llcyI6WyJicm93c2VyX3NkayIsImNvbXBvbmVudHMiXSwibmFtZSI6ImJyb3dzZXJfY29tcG9uZW50cyJ9LHsiZGVwZW5kZW5jaWVzIjpbInVpIiwic2RrIiwiZGF0YV9ncmlkIl0sIm5hbWUiOiJjb29raWVfdGFibGUiLCJzY3JpcHRzIjpbImNvb2tpZV90YWJsZV9tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsic2RrIl0sIm5hbWUiOiJ0aW1lbGluZV9tb2RlbCIsInNjcmlwdHMiOlsidGltZWxpbmVfbW9kZWxfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbW1vbiIsInByb2R1Y3RfcmVnaXN0cnkiXSwiZXh0ZW5zaW9ucyI6W3siY2xhc3NOYW1lIjoiUHJvZHVjdFJlZ2lzdHJ5SW1wbC5SZWdpc3RyeSIsInR5cGUiOiJAUHJvZHVjdFJlZ2lzdHJ5LlJlZ2lzdHJ5In1dLCJuYW1lIjoicHJvZHVjdF9yZWdpc3RyeV9pbXBsIiwic2NyaXB0cyI6WyJwcm9kdWN0X3JlZ2lzdHJ5X2ltcGxfbW9kdWxlLmpzIl19LHsiZGVwZW5kZW5jaWVzIjpbImNvbXBvbmVudHMiLCJtb2JpbGVfdGhyb3R0bGluZyJdLCJleHRlbnNpb25zIjpbeyJjbGFzc05hbWUiOiJXb3JrZXJNYWluLldvcmtlck1haW4iLCJ0eXBlIjoiZWFybHktaW5pdGlhbGl6YXRpb24ifV0sIm5hbWUiOiJ3b3JrZXJfbWFpbiJ9LHsiZGVwZW5kZW5jaWVzIjpbInNvdXJjZV9mcmFtZSIsImNvb2tpZV90YWJsZSIsImlubGluZV9lZGl0b3IiLCJkYXRhX2dyaWQiLCJjb21wb25lbnRzIiwib2JqZWN0X3VpIiwicGVyZl91aSIsIm1vYmlsZV90aHJvdHRsaW5nIiwibmV0d29yayIsInNvdXJjZXMiXSwiZXh0ZW5zaW9ucyI6W3sidGl0bGUiOiJBcHBsaWNhdGlvbiIsImlkIjoicmVzb3VyY2VzIiwiY2xhc3NOYW1lIjoiUmVzb3VyY2VzLlJlc291cmNlc1BhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjcwfSx7ImNsYXNzTmFtZSI6IlJlc291cmNlcy5SZXNvdXJjZXNQYW5lbC5SZXNvdXJjZVJldmVhbGVyIiwiY29udGV4dFR5cGVzIjpbIlNESy5SZXNvdXJjZSJdLCJkZXN0aW5hdGlvbiI6IkFwcGxpY2F0aW9uIHBhbmVsIiwidHlwZSI6IkBDb21tb24uUmV2ZWFsZXIifV0sIm5hbWUiOiJyZXNvdXJjZXMiLCJzY3JpcHRzIjpbInJlc291cmNlc19tb2R1bGUuanMiXX0seyJkZXBlbmRlbmNpZXMiOlsic2VhcmNoIiwic291cmNlX2ZyYW1lIiwiY29tcG9uZW50cyIsInBlcmZfdWkiLCJjb29raWVfdGFibGUiLCJkYXRhX2dyaWQiLCJicm93c2VyX3NkayIsInByb2R1Y3RfcmVnaXN0cnkiLCJtb2JpbGVfdGhyb3R0bGluZyIsImhhcl9pbXBvcnRlciIsInBlcnNpc3RlbmNlIl0sImV4dGVuc2lvbnMiOlt7InRpdGxlIjoiTmV0d29yayIsImlkIjoibmV0d29yayIsImNsYXNzTmFtZSI6Ik5ldHdvcmsuTmV0d29ya1BhbmVsIiwibG9jYXRpb24iOiJwYW5lbCIsInR5cGUiOiJ2aWV3Iiwib3JkZXIiOjQwfSx7ImNsYXNzTmFtZSI6Ik5ldHdvcmsuTmV0d29ya1BhbmVsLkNvbnRleHRNZW51UHJvdmlkZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLk5ldHdvcmtSZXF1ZXN0IiwiU0RLLlJlc291cmNlIiwiV29ya3NwYWNlLlVJU291cmNlQ29kZSJdLCJ0eXBlIjoiQFVJLkNvbnRleHRNZW51LlByb3ZpZGVyIn0seyJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5SZXF1ZXN0UmV2ZWFsZXIiLCJjb250ZXh0VHlwZXMiOlsiU0RLLk5ldHdvcmtSZXF1ZXN0Il0sImRlc3RpbmF0aW9uIjoiTmV0d29yayBwYW5lbCIsInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5SZXF1ZXN0TG9jYXRpb25SZXZlYWxlciIsImNvbnRleHRUeXBlcyI6WyJOZXR3b3JrLlVJUmVxdWVzdExvY2F0aW9uIl0sInR5cGUiOiJAQ29tbW9uLlJldmVhbGVyIn0seyJjYXRlZ29yeSI6Ik5ldHdvcmsiLCJ0aXRsZSI6IkNvbG9yLWNvZGUgcmVzb3VyY2UgdHlwZXMiLCJkZWZhdWx0VmFsdWUiOmZhbHNlLCJ0YWdzIjoiY29sb3IgY29kZSwgcmVzb3VyY2UgdHlwZSIsInNldHRpbmdOYW1lIjoibmV0d29ya0NvbG9yQ29kZVJlc291cmNlVHlwZXMiLCJzZXR0aW5nVHlwZSI6ImJvb2xlYW4iLCJ0eXBlIjoic2V0dGluZyIsIm9wdGlvbnMiOlt7InZhbHVlIjp0cnVlLCJ0aXRsZSI6IkNvbG9yIGNvZGUgYnkgcmVzb3VyY2UgdHlwZSJ9LHsidmFsdWUiOmZhbHNlLCJ0aXRsZSI6IlVzZSBkZWZhdWx0IGNvbG9ycyJ9XX0seyJjYXRlZ29yeSI6Ik5ldHdvcmsiLCJ0aXRsZSI6Ikdyb3VwIG5ldHdvcmsgbG9nIGJ5IGZyYW1lIiwiZGVmYXVsdFZhbHVlIjpmYWxzZSwidGFncyI6Im5ldHdvcmssIGZyYW1lLCBncm91cCIsInNldHRpbmdOYW1lIjoibmV0d29yay5ncm91cC1ieS1mcmFtZSIsInNldHRpbmdUeXBlIjoiYm9vbGVhbiIsInR5cGUiOiJzZXR0aW5nIiwib3B0aW9ucyI6W3sidmFsdWUiOnRydWUsInRpdGxlIjoiR3JvdXAgbmV0d29yayBsb2cgaXRlbXMgYnkgZnJhbWUifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJEb24ndCBncm91cCBuZXR3b3JrIGxvZyBpdGVtcyBieSBmcmFtZSJ9XX0seyJpY29uQ2xhc3MiOiJsYXJnZWljb24tc3RhcnQtcmVjb3JkaW5nIiwidG9nZ2xlZEljb25DbGFzcyI6ImxhcmdlaWNvbi1zdG9wLXJlY29yZGluZyIsImNsYXNzTmFtZSI6Ik5ldHdvcmsuTmV0d29ya1BhbmVsLkFjdGlvbkRlbGVnYXRlIiwidG9nZ2xlV2l0aFJlZENvbG9yIjp0cnVlLCJhY3Rpb25JZCI6Im5ldHdvcmsudG9nZ2xlLXJlY29yZGluZyIsImNvbnRleHRUeXBlcyI6WyJOZXR3b3JrLk5ldHdvcmtQYW5lbCJdLCJiaW5kaW5ncyI6W3sicGxhdGZvcm0iOiJ3aW5kb3dzLGxpbnV4Iiwic2hvcnRjdXQiOiJDdHJsK0UifSx7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0UifV0sInR5cGUiOiJhY3Rpb24iLCJvcHRpb25zIjpbeyJ2YWx1ZSI6dHJ1ZSwidGl0bGUiOiJSZWNvcmQgbmV0d29yayBsb2cifSx7InZhbHVlIjpmYWxzZSwidGl0bGUiOiJTdG9wIHJlY29yZGluZyBuZXR3b3JrIGxvZyJ9XX0seyJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJOZXR3b3JrLk5ldHdvcmtQYW5lbCJdLCJiaW5kaW5ncyI6W3sic2hvcnRjdXQiOiJFc2MifV0sInR5cGUiOiJhY3Rpb24iLCJhY3Rpb25JZCI6Im5ldHdvcmsuaGlkZS1yZXF1ZXN0LWRldGFpbHMifSx7InRpdGxlIjoiUmVxdWVzdCBibG9ja2luZyIsImlkIjoibmV0d29yay5ibG9ja2VkLXVybHMiLCJjbGFzc05hbWUiOiJOZXR3b3JrLkJsb2NrZWRVUkxzUGFuZSIsImxvY2F0aW9uIjoiZHJhd2VyLXZpZXciLCJ0eXBlIjoidmlldyIsIm9yZGVyIjo2MCwicGVyc2lzdGVuY2UiOiJjbG9zZWFibGUifSx7InRpdGxlIjoiTmV0d29yayBjb25kaXRpb25zIiwidGFncyI6ImRpc2sgY2FjaGUsIG5ldHdvcmsgdGhyb3R0bGluZywgdXNlcmFnZW50LCB1c2VyIGFnZW50IiwiaWQiOiJuZXR3b3JrLmNvbmZpZyIsImNsYXNzTmFtZSI6Ik5ldHdvcmsuTmV0d29ya0NvbmZpZ1ZpZXciLCJsb2NhdGlvbiI6ImRyYXdlci12aWV3IiwidHlwZSI6InZpZXciLCJvcmRlciI6NDAsInBlcnNpc3RlbmNlIjoiY2xvc2VhYmxlIn0seyJjYXRlZ29yeSI6Ik5ldHdvcmsiLCJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbCIsInR5cGUiOiJAVUkuVmlld0xvY2F0aW9uUmVzb2x2ZXIiLCJuYW1lIjoibmV0d29yay1zaWRlYmFyIn0seyJ0aXRsZSI6IlNlYXJjaCIsImNsYXNzTmFtZSI6Ik5ldHdvcmsuU2VhcmNoTmV0d29ya1ZpZXciLCJsb2NhdGlvbiI6Im5ldHdvcmstc2lkZWJhciIsInR5cGUiOiJ2aWV3IiwiaWQiOiJuZXR3b3JrLnNlYXJjaC1uZXR3b3JrLXRhYiIsInBlcnNpc3RlbmNlIjoicGVybWFuZW50In0seyJjYXRlZ29yeSI6IkRldlRvb2xzIiwidGl0bGUiOiJTZWFyY2giLCJjbGFzc05hbWUiOiJOZXR3b3JrLk5ldHdvcmtQYW5lbC5BY3Rpb25EZWxlZ2F0ZSIsImNvbnRleHRUeXBlcyI6WyJOZXR3b3JrLk5ldHdvcmtQYW5lbCJdLCJhY3Rpb25JZCI6Im5ldHdvcmsuc2VhcmNoIiwiYmluZGluZ3MiOlt7InBsYXRmb3JtIjoibWFjIiwic2hvcnRjdXQiOiJNZXRhK0YifSx7InBsYXRmb3JtIjoid2luZG93cyxsaW51eCIsInNob3J0Y3V0IjoiQ3RybCtGIn1dLCJ0eXBlIjoiYWN0aW9uIn1dLCJuYW1lIjoibmV0d29yayIsInNjcmlwdHMiOlsibmV0d29ya19tb2R1bGUuanMiXX1dKTthcHBsaWNhdGlvbkRlc2NyaXB0b3IubW9kdWxlcy5wdXNoKC4uLlt7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoibW9iaWxlX3Rocm90dGxpbmcifSx7Im5hbWUiOiJoYXJfaW1wb3J0ZXIifSx7Im5hbWUiOiJlbGVtZW50cyJ9LHsibmFtZSI6ImhlbHAifSx7Im5hbWUiOiJicm93c2VyX2NvbnNvbGUifSx7Im5hbWUiOiJ0aW1lbGluZSJ9LHsibmFtZSI6ImJyb3dzZXJfZGVidWdnZXIifSx7Im5hbWUiOiJsYXllcl92aWV3ZXIifSx7InR5cGUiOiJhdXRvc3RhcnQiLCJuYW1lIjoiYnJvd3Nlcl9jb21wb25lbnRzIn0seyJuYW1lIjoiY29va2llX3RhYmxlIn0seyJuYW1lIjoidGltZWxpbmVfbW9kZWwifSx7InR5cGUiOiJyZW1vdGUiLCJuYW1lIjoicHJvZHVjdF9yZWdpc3RyeV9pbXBsIn0seyJ0eXBlIjoiYXV0b3N0YXJ0IiwibmFtZSI6Indvcmtlcl9tYWluIn0seyJuYW1lIjoicmVzb3VyY2VzIn0seyJuYW1lIjoibmV0d29yayJ9XSkKc2VsZlsnTW9iaWxlVGhyb3R0bGluZyddPXNlbGZbJ01vYmlsZVRocm90dGxpbmcnXXx8e307TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXM9e05vVGhyb3R0bGluZzoxLE1pZFRpZXJNb2JpbGU6NCxMb3dFbmRNb2JpbGU6Nix9O01vYmlsZVRocm90dGxpbmcuQ29uZGl0aW9ucztNb2JpbGVUaHJvdHRsaW5nLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnM9e3RpdGxlOlNESy5OZXR3b3JrTWFuYWdlci5Ob1Rocm90dGxpbmdDb25kaXRpb25zLnRpdGxlLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnTm8gdGhyb3R0bGluZycpLG5ldHdvcms6U0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTm9UaHJvdHRsaW5nLH07TW9iaWxlVGhyb3R0bGluZy5PZmZsaW5lQ29uZGl0aW9ucz17dGl0bGU6U0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zLnRpdGxlLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnTm8gaW50ZXJuZXQgY29ubmVjdGl2aXR5JyksbmV0d29yazpTREsuTmV0d29ya01hbmFnZXIuT2ZmbGluZUNvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTm9UaHJvdHRsaW5nLH07TW9iaWxlVGhyb3R0bGluZy5Mb3dFbmRNb2JpbGVDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0xvdy1lbmQgbW9iaWxlJyksZGVzY3JpcHRpb246Q29tbW9uLlVJU3RyaW5nKCdTbG93IDNHICYgNnggQ1BVIHNsb3dkb3duJyksbmV0d29yazpTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyxjcHVUaHJvdHRsaW5nUmF0ZTpNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Mb3dFbmRNb2JpbGUsfTtNb2JpbGVUaHJvdHRsaW5nLk1pZFRpZXJNb2JpbGVDb25kaXRpb25zPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ01pZC10aWVyIG1vYmlsZScpLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnRmFzdCAzRyAmIDR4IENQVSBzbG93ZG93bicpLG5ldHdvcms6U0RLLk5ldHdvcmtNYW5hZ2VyLkZhc3QzR0NvbmRpdGlvbnMsY3B1VGhyb3R0bGluZ1JhdGU6TW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTWlkVGllck1vYmlsZSx9O01vYmlsZVRocm90dGxpbmcuUGxhY2Vob2xkZXJDb25kaXRpb25zO01vYmlsZVRocm90dGxpbmcuQ3VzdG9tQ29uZGl0aW9ucz17dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdDdXN0b20nKSxkZXNjcmlwdGlvbjpDb21tb24uVUlTdHJpbmcoJ0NoZWNrIE5ldHdvcmsgYW5kIFBlcmZvcm1hbmNlIHBhbmVscycpLH07TW9iaWxlVGhyb3R0bGluZy5OZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnNHcm91cDtNb2JpbGVUaHJvdHRsaW5nLk1vYmlsZVRocm90dGxpbmdDb25kaXRpb25zR3JvdXA7TW9iaWxlVGhyb3R0bGluZy5Db25kaXRpb25zTGlzdDtNb2JpbGVUaHJvdHRsaW5nLm1vYmlsZVByZXNldHM9W01vYmlsZVRocm90dGxpbmcuTWlkVGllck1vYmlsZUNvbmRpdGlvbnMsTW9iaWxlVGhyb3R0bGluZy5Mb3dFbmRNb2JpbGVDb25kaXRpb25zLE1vYmlsZVRocm90dGxpbmcuQ3VzdG9tQ29uZGl0aW9uc107TW9iaWxlVGhyb3R0bGluZy5hZHZhbmNlZE1vYmlsZVByZXNldHM9W01vYmlsZVRocm90dGxpbmcuT2ZmbGluZUNvbmRpdGlvbnMsXTtNb2JpbGVUaHJvdHRsaW5nLm5ldHdvcmtQcmVzZXRzPVtTREsuTmV0d29ya01hbmFnZXIuRmFzdDNHQ29uZGl0aW9ucyxTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyxTREsuTmV0d29ya01hbmFnZXIuT2ZmbGluZUNvbmRpdGlvbnMsXTtNb2JpbGVUaHJvdHRsaW5nLmNwdVRocm90dGxpbmdQcmVzZXRzPVtNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Ob1Rocm90dGxpbmcsTW9iaWxlVGhyb3R0bGluZy5DUFVUaHJvdHRsaW5nUmF0ZXMuTWlkVGllck1vYmlsZSxNb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Mb3dFbmRNb2JpbGUsXTs7TW9iaWxlVGhyb3R0bGluZy5Nb2JpbGVUaHJvdHRsaW5nU2VsZWN0b3I9Y2xhc3N7Y29uc3RydWN0b3IocG9wdWxhdGVDYWxsYmFjayxzZWxlY3RDYWxsYmFjayl7dGhpcy5fcG9wdWxhdGVDYWxsYmFjaz1wb3B1bGF0ZUNhbGxiYWNrO3RoaXMuX3NlbGVjdENhbGxiYWNrPXNlbGVjdENhbGxiYWNrO01vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5hZGRFdmVudExpc3RlbmVyKE1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuRXZlbnRzLlJhdGVDaGFuZ2VkLHRoaXMuX2NvbmRpdGlvbnNDaGFuZ2VkLHRoaXMpO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLHRoaXMuX2NvbmRpdGlvbnNDaGFuZ2VkLHRoaXMpO3RoaXMuX29wdGlvbnM9dGhpcy5fcG9wdWxhdGVPcHRpb25zKCk7dGhpcy5fY29uZGl0aW9uc0NoYW5nZWQoKTt9Cm9wdGlvblNlbGVjdGVkKGNvbmRpdGlvbnMpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKGNvbmRpdGlvbnMubmV0d29yayk7TW9iaWxlVGhyb3R0bGluZy50aHJvdHRsaW5nTWFuYWdlcigpLnNldENQVVRocm90dGxpbmdSYXRlKGNvbmRpdGlvbnMuY3B1VGhyb3R0bGluZ1JhdGUpO30KX3BvcHVsYXRlT3B0aW9ucygpe2NvbnN0IGRpc2FibGVkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRGlzYWJsZWQnKSxpdGVtczpbTW9iaWxlVGhyb3R0bGluZy5Ob1Rocm90dGxpbmdDb25kaXRpb25zXX07Y29uc3QgcHJlc2V0c0dyb3VwPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ByZXNldHMnKSxpdGVtczpNb2JpbGVUaHJvdHRsaW5nLm1vYmlsZVByZXNldHN9O2NvbnN0IGFkdmFuY2VkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnQWR2YW5jZWQnKSxpdGVtczpNb2JpbGVUaHJvdHRsaW5nLmFkdmFuY2VkTW9iaWxlUHJlc2V0c307cmV0dXJuIHRoaXMuX3BvcHVsYXRlQ2FsbGJhY2soW2Rpc2FibGVkR3JvdXAscHJlc2V0c0dyb3VwLGFkdmFuY2VkR3JvdXBdKTt9Cl9jb25kaXRpb25zQ2hhbmdlZCgpe2NvbnN0IG5ldHdvcmtDb25kaXRpb25zPVNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLm5ldHdvcmtDb25kaXRpb25zKCk7Y29uc3QgY3B1VGhyb3R0bGluZ1JhdGU9TW9iaWxlVGhyb3R0bGluZy50aHJvdHRsaW5nTWFuYWdlcigpLmNwdVRocm90dGxpbmdSYXRlKCk7Zm9yKGxldCBpbmRleD0wO2luZGV4PHRoaXMuX29wdGlvbnMubGVuZ3RoOysraW5kZXgpe2NvbnN0IG9wdGlvbj10aGlzLl9vcHRpb25zW2luZGV4XTtpZihvcHRpb24mJm9wdGlvbi5uZXR3b3JrPT09bmV0d29ya0NvbmRpdGlvbnMmJm9wdGlvbi5jcHVUaHJvdHRsaW5nUmF0ZT09PWNwdVRocm90dGxpbmdSYXRlKXt0aGlzLl9zZWxlY3RDYWxsYmFjayhpbmRleCk7cmV0dXJuO319CnRoaXMuX3NlbGVjdENhbGxiYWNrKHRoaXMuX29wdGlvbnMuaW5kZXhPZihNb2JpbGVUaHJvdHRsaW5nLkN1c3RvbUNvbmRpdGlvbnMpKTt9fTs7TW9iaWxlVGhyb3R0bGluZy5OZXR3b3JrUGFuZWxJbmRpY2F0b3I9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZighVUkuaW5zcGVjdG9yVmlldy5oYXNQYW5lbCgnbmV0d29yaycpKQpyZXR1cm47Y29uc3QgbWFuYWdlcj1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlcjttYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLHVwZGF0ZVZpc2liaWxpdHkpO21hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQmxvY2tlZFBhdHRlcm5zQ2hhbmdlZCx1cGRhdGVWaXNpYmlsaXR5KTttYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkludGVyY2VwdG9yc0NoYW5nZWQsdXBkYXRlVmlzaWJpbGl0eSk7dXBkYXRlVmlzaWJpbGl0eSgpO2Z1bmN0aW9uIHVwZGF0ZVZpc2liaWxpdHkoKXtsZXQgaWNvbj1udWxsO2lmKG1hbmFnZXIuaXNUaHJvdHRsaW5nKCkpe2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ05ldHdvcmsgdGhyb3R0bGluZyBpcyBlbmFibGVkJyk7fWVsc2UgaWYoU0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuaXNJbnRlcmNlcHRpbmcoKSl7aWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXdhcm5pbmcnKTtpY29uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVxdWVzdHMgbWF5IGJlIHJld3JpdHRlbiBieSBsb2NhbCBvdmVycmlkZXMnKTt9ZWxzZSBpZihtYW5hZ2VyLmlzQmxvY2tpbmcoKSl7aWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXdhcm5pbmcnKTtpY29uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVxdWVzdHMgbWF5IGJlIGJsb2NrZWQnKTt9ClVJLmluc3BlY3RvclZpZXcuc2V0UGFuZWxJY29uKCduZXR3b3JrJyxpY29uKTt9fX07O01vYmlsZVRocm90dGxpbmcuTmV0d29ya1Rocm90dGxpbmdTZWxlY3Rvcj1jbGFzc3tjb25zdHJ1Y3Rvcihwb3B1bGF0ZUNhbGxiYWNrLHNlbGVjdENhbGxiYWNrLGN1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZyl7dGhpcy5fcG9wdWxhdGVDYWxsYmFjaz1wb3B1bGF0ZUNhbGxiYWNrO3RoaXMuX3NlbGVjdENhbGxiYWNrPXNlbGVjdENhbGxiYWNrO3RoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZz1jdXN0b21OZXR3b3JrQ29uZGl0aW9uc1NldHRpbmc7dGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3BvcHVsYXRlT3B0aW9ucyx0aGlzKTtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5Db25kaXRpb25zQ2hhbmdlZCx0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQsdGhpcyk7dGhpcy5fb3B0aW9uczt0aGlzLl9wb3B1bGF0ZU9wdGlvbnMoKTt9CnJldmVhbEFuZFVwZGF0ZSgpe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nKTt0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKTt9Cm9wdGlvblNlbGVjdGVkKGNvbmRpdGlvbnMpe1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKGNvbmRpdGlvbnMpO30KX3BvcHVsYXRlT3B0aW9ucygpe2NvbnN0IGRpc2FibGVkR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRGlzYWJsZWQnKSxpdGVtczpbU0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnNdfTtjb25zdCBwcmVzZXRzR3JvdXA9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnUHJlc2V0cycpLGl0ZW1zOk1vYmlsZVRocm90dGxpbmcubmV0d29ya1ByZXNldHN9O2NvbnN0IGN1c3RvbUdyb3VwPXt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0N1c3RvbScpLGl0ZW1zOnRoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZy5nZXQoKX07dGhpcy5fb3B0aW9ucz10aGlzLl9wb3B1bGF0ZUNhbGxiYWNrKFtkaXNhYmxlZEdyb3VwLHByZXNldHNHcm91cCxjdXN0b21Hcm91cF0pO2lmKCF0aGlzLl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKSl7Zm9yKGxldCBpPXRoaXMuX29wdGlvbnMubGVuZ3RoLTE7aT49MDtpLS0pe2lmKHRoaXMuX29wdGlvbnNbaV0pe3RoaXMub3B0aW9uU2VsZWN0ZWQoKHRoaXMuX29wdGlvbnNbaV0pKTticmVhazt9fX19Cl9uZXR3b3JrQ29uZGl0aW9uc0NoYW5nZWQoKXtjb25zdCB2YWx1ZT1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpO2ZvcihsZXQgaW5kZXg9MDtpbmRleDx0aGlzLl9vcHRpb25zLmxlbmd0aDsrK2luZGV4KXtjb25zdCBvcHRpb249dGhpcy5fb3B0aW9uc1tpbmRleF07aWYob3B0aW9uJiZvcHRpb24uZG93bmxvYWQ9PT12YWx1ZS5kb3dubG9hZCYmb3B0aW9uLnVwbG9hZD09PXZhbHVlLnVwbG9hZCYmb3B0aW9uLmxhdGVuY3k9PT12YWx1ZS5sYXRlbmN5JiZvcHRpb24udGl0bGU9PT12YWx1ZS50aXRsZSl7dGhpcy5fc2VsZWN0Q2FsbGJhY2soaW5kZXgpO3JldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9fTs7TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nU2V0dGluZ3NUYWI9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdtb2JpbGVfdGhyb3R0bGluZy90aHJvdHRsaW5nU2V0dGluZ3NUYWIuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaGVhZGVyJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdOZXR3b3JrIFRocm90dGxpbmcgUHJvZmlsZXMnKTtjb25zdCBhZGRCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0FkZCBjdXN0b20gcHJvZmlsZS4uLicpLHRoaXMuX2FkZEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSwnYWRkLWNvbmRpdGlvbnMtYnV0dG9uJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChhZGRCdXR0b24pO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbmRpdGlvbnMtbGlzdCcpO3RoaXMuX2xpc3QucmVnaXN0ZXJSZXF1aXJlZENTUygnbW9iaWxlX3Rocm90dGxpbmcvdGhyb3R0bGluZ1NldHRpbmdzVGFiLmNzcycpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9jdXN0b21TZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjdXN0b21OZXR3b3JrQ29uZGl0aW9ucycpO3RoaXMuX2N1c3RvbVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fY29uZGl0aW9uc1VwZGF0ZWQsdGhpcyk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQoYWRkQnV0dG9uKTt0aGlzLmNvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7dGhpcy5fY29uZGl0aW9uc1VwZGF0ZWQoKTt9Cl9jb25kaXRpb25zVXBkYXRlZCgpe3RoaXMuX2xpc3QuY2xlYXIoKTtjb25zdCBjb25kaXRpb25zPXRoaXMuX2N1c3RvbVNldHRpbmcuZ2V0KCk7Zm9yKGxldCBpPTA7aTxjb25kaXRpb25zLmxlbmd0aDsrK2kpCnRoaXMuX2xpc3QuYXBwZW5kSXRlbShjb25kaXRpb25zW2ldLHRydWUpO3RoaXMuX2xpc3QuYXBwZW5kU2VwYXJhdG9yKCk7fQpfYWRkQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX2xpc3QuYWRkTmV3SXRlbSh0aGlzLl9jdXN0b21TZXR0aW5nLmdldCgpLmxlbmd0aCx7dGl0bGU6JycsZG93bmxvYWQ6LTEsdXBsb2FkOi0xLGxhdGVuY3k6MH0pO30KcmVuZGVySXRlbShpdGVtLGVkaXRhYmxlKXtjb25zdCBjb25kaXRpb25zPShpdGVtKTtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1pdGVtJyk7Y29uc3QgdGl0bGU9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXRleHQgY29uZGl0aW9ucy1saXN0LXRpdGxlJyk7Y29uc3QgdGl0bGVUZXh0PXRpdGxlLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGl0bGUtdGV4dCcpO3RpdGxlVGV4dC50ZXh0Q29udGVudD1jb25kaXRpb25zLnRpdGxlO3RpdGxlVGV4dC50aXRsZT1jb25kaXRpb25zLnRpdGxlO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3InKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpLnRleHRDb250ZW50PU1vYmlsZVRocm90dGxpbmcudGhyb3VnaHB1dFRleHQoY29uZGl0aW9ucy5kb3dubG9hZCk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvcicpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9TW9iaWxlVGhyb3R0bGluZy50aHJvdWdocHV0VGV4dChjb25kaXRpb25zLnVwbG9hZCk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvcicpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclZG1zJyxjb25kaXRpb25zLmxhdGVuY3kpO3JldHVybiBlbGVtZW50O30KcmVtb3ZlSXRlbVJlcXVlc3RlZChpdGVtLGluZGV4KXtjb25zdCBsaXN0PXRoaXMuX2N1c3RvbVNldHRpbmcuZ2V0KCk7bGlzdC5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fY3VzdG9tU2V0dGluZy5zZXQobGlzdCk7fQpjb21taXRFZGl0KGl0ZW0sZWRpdG9yLGlzTmV3KXtjb25zdCBjb25kaXRpb25zPShpdGVtKTtjb25kaXRpb25zLnRpdGxlPWVkaXRvci5jb250cm9sKCd0aXRsZScpLnZhbHVlLnRyaW0oKTtjb25zdCBkb3dubG9hZD1lZGl0b3IuY29udHJvbCgnZG93bmxvYWQnKS52YWx1ZS50cmltKCk7Y29uZGl0aW9ucy5kb3dubG9hZD1kb3dubG9hZD9wYXJzZUludChkb3dubG9hZCwxMCkqKDEwMjQvOCk6LTE7Y29uc3QgdXBsb2FkPWVkaXRvci5jb250cm9sKCd1cGxvYWQnKS52YWx1ZS50cmltKCk7Y29uZGl0aW9ucy51cGxvYWQ9dXBsb2FkP3BhcnNlSW50KHVwbG9hZCwxMCkqKDEwMjQvOCk6LTE7Y29uc3QgbGF0ZW5jeT1lZGl0b3IuY29udHJvbCgnbGF0ZW5jeScpLnZhbHVlLnRyaW0oKTtjb25kaXRpb25zLmxhdGVuY3k9bGF0ZW5jeT9wYXJzZUludChsYXRlbmN5LDEwKTowO2NvbnN0IGxpc3Q9dGhpcy5fY3VzdG9tU2V0dGluZy5nZXQoKTtpZihpc05ldykKbGlzdC5wdXNoKGNvbmRpdGlvbnMpO3RoaXMuX2N1c3RvbVNldHRpbmcuc2V0KGxpc3QpO30KYmVnaW5FZGl0KGl0ZW0pe2NvbnN0IGNvbmRpdGlvbnM9KGl0ZW0pO2NvbnN0IGVkaXRvcj10aGlzLl9jcmVhdGVFZGl0b3IoKTtlZGl0b3IuY29udHJvbCgndGl0bGUnKS52YWx1ZT1jb25kaXRpb25zLnRpdGxlO2VkaXRvci5jb250cm9sKCdkb3dubG9hZCcpLnZhbHVlPWNvbmRpdGlvbnMuZG93bmxvYWQ8PTA/Jyc6U3RyaW5nKGNvbmRpdGlvbnMuZG93bmxvYWQvKDEwMjQvOCkpO2VkaXRvci5jb250cm9sKCd1cGxvYWQnKS52YWx1ZT1jb25kaXRpb25zLnVwbG9hZDw9MD8nJzpTdHJpbmcoY29uZGl0aW9ucy51cGxvYWQvKDEwMjQvOCkpO2VkaXRvci5jb250cm9sKCdsYXRlbmN5JykudmFsdWU9Y29uZGl0aW9ucy5sYXRlbmN5P1N0cmluZyhjb25kaXRpb25zLmxhdGVuY3kpOicnO3JldHVybiBlZGl0b3I7fQpfY3JlYXRlRWRpdG9yKCl7aWYodGhpcy5fZWRpdG9yKQpyZXR1cm4gdGhpcy5fZWRpdG9yO2NvbnN0IGVkaXRvcj1uZXcgVUkuTGlzdFdpZGdldC5FZGl0b3IoKTt0aGlzLl9lZGl0b3I9ZWRpdG9yO2NvbnN0IGNvbnRlbnQ9ZWRpdG9yLmNvbnRlbnRFbGVtZW50KCk7Y29uc3QgdGl0bGVzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtZWRpdC1yb3cnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0IGNvbmRpdGlvbnMtbGlzdC10aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUHJvZmlsZSBOYW1lJyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yIGNvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3ItaW52aXNpYmxlJyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRG93bmxvYWQnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3IgY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvci1pbnZpc2libGUnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdVcGxvYWQnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3IgY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvci1pbnZpc2libGUnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdMYXRlbmN5Jyk7Y29uc3QgZmllbGRzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtZWRpdC1yb3cnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbmRpdGlvbnMtbGlzdC10ZXh0IGNvbmRpdGlvbnMtbGlzdC10aXRsZScpLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgndGl0bGUnLCd0ZXh0JywnJyx0aXRsZVZhbGlkYXRvcikpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2xldCBjZWxsPWZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXRleHQnKTtjZWxsLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgnZG93bmxvYWQnLCd0ZXh0JyxDb21tb24uVUlTdHJpbmcoJ2tiL3MnKSx0aHJvdWdocHV0VmFsaWRhdG9yKSk7Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1lZGl0LW9wdGlvbmFsJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdvcHRpb25hbCcpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2NlbGw9ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpO2NlbGwuYXBwZW5kQ2hpbGQoZWRpdG9yLmNyZWF0ZUlucHV0KCd1cGxvYWQnLCd0ZXh0JyxDb21tb24uVUlTdHJpbmcoJ2tiL3MnKSx0aHJvdWdocHV0VmFsaWRhdG9yKSk7Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1lZGl0LW9wdGlvbmFsJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdvcHRpb25hbCcpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvciBjb25kaXRpb25zLWxpc3Qtc2VwYXJhdG9yLWludmlzaWJsZScpO2NlbGw9ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWxpc3QtdGV4dCcpO2NlbGwuYXBwZW5kQ2hpbGQoZWRpdG9yLmNyZWF0ZUlucHV0KCdsYXRlbmN5JywndGV4dCcsQ29tbW9uLlVJU3RyaW5nKCdtcycpLGxhdGVuY3lWYWxpZGF0b3IpKTtjZWxsLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25kaXRpb25zLWVkaXQtb3B0aW9uYWwnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ29wdGlvbmFsJyk7cmV0dXJuIGVkaXRvcjtmdW5jdGlvbiB0aXRsZVZhbGlkYXRvcihpdGVtLGluZGV4LGlucHV0KXtjb25zdCB2YWx1ZT1pbnB1dC52YWx1ZS50cmltKCk7cmV0dXJuIHZhbHVlLmxlbmd0aD4wJiZ2YWx1ZS5sZW5ndGg8NTA7fQpmdW5jdGlvbiB0aHJvdWdocHV0VmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe2NvbnN0IHZhbHVlPWlucHV0LnZhbHVlLnRyaW0oKTtyZXR1cm4hdmFsdWV8fCgvXltcZF0rKFwuXGQrKT98XC5cZCskLy50ZXN0KHZhbHVlKSYmdmFsdWU+PTAmJnZhbHVlPD0xMDAwMDAwMCk7fQpmdW5jdGlvbiBsYXRlbmN5VmFsaWRhdG9yKGl0ZW0saW5kZXgsaW5wdXQpe2NvbnN0IHZhbHVlPWlucHV0LnZhbHVlLnRyaW0oKTtyZXR1cm4hdmFsdWV8fCgvXltcZF0rJC8udGVzdCh2YWx1ZSkmJnZhbHVlPj0wJiZ2YWx1ZTw9MTAwMDAwMCk7fX19O01vYmlsZVRocm90dGxpbmcudGhyb3VnaHB1dFRleHQ9ZnVuY3Rpb24odGhyb3VnaHB1dCxwbGFpblRleHQpe2lmKHRocm91Z2hwdXQ8MCkKcmV0dXJuJyc7Y29uc3QgdGhyb3VnaHB1dEluS2Jwcz10aHJvdWdocHV0LygxMDI0LzgpO2NvbnN0IGRlbGltaXRlcj1wbGFpblRleHQ/Jyc6JyAnO2lmKHRocm91Z2hwdXRJbkticHM8MTAyNCkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJWQlc2tiL3MnLHRocm91Z2hwdXRJbkticHMsZGVsaW1pdGVyKTtpZih0aHJvdWdocHV0SW5LYnBzPDEwMjQqMTApCnJldHVybiBDb21tb24uVUlTdHJpbmcoJyUuMWYlc01iL3MnLHRocm91Z2hwdXRJbkticHMvMTAyNCxkZWxpbWl0ZXIpO3JldHVybiBDb21tb24uVUlTdHJpbmcoJyVkJXNNYi9zJywodGhyb3VnaHB1dEluS2Jwcy8xMDI0KXwwLGRlbGltaXRlcik7fTs7TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlcj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2NwdVRocm90dGxpbmdSYXRlPU1vYmlsZVRocm90dGxpbmcuQ1BVVGhyb3R0bGluZ1JhdGVzLk5vVGhyb3R0bGluZzt0aGlzLl9jcHVUaHJvdHRsaW5nQ29udHJvbHM9bmV3IFNldCgpO3RoaXMuX2NwdVRocm90dGxpbmdSYXRlcz1Nb2JpbGVUaHJvdHRsaW5nLmNwdVRocm90dGxpbmdQcmVzZXRzO3RoaXMuX2N1c3RvbU5ldHdvcmtDb25kaXRpb25zU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnY3VzdG9tTmV0d29ya0NvbmRpdGlvbnMnKTt0aGlzLl9jdXJyZW50TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zPVNESy5OZXR3b3JrTWFuYWdlci5Ob1Rocm90dGxpbmdDb25kaXRpb25zO3RoaXMuX2xhc3ROZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnM7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5FdmVudHMuQ29uZGl0aW9uc0NoYW5nZWQsKCk9Pnt0aGlzLl9sYXN0TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zPXRoaXMuX2N1cnJlbnROZXR3b3JrVGhyb3R0bGluZ0NvbmRpdGlvbnM7dGhpcy5fY3VycmVudE5ldHdvcmtUaHJvdHRsaW5nQ29uZGl0aW9ucz1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpO30pO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsLHRoaXMpO30KZGVjb3JhdGVTZWxlY3RXaXRoTmV0d29ya1Rocm90dGxpbmcoc2VsZWN0RWxlbWVudCl7bGV0IG9wdGlvbnM9W107Y29uc3Qgc2VsZWN0b3I9bmV3IE1vYmlsZVRocm90dGxpbmcuTmV0d29ya1Rocm90dGxpbmdTZWxlY3Rvcihwb3B1bGF0ZSxzZWxlY3QsdGhpcy5fY3VzdG9tTmV0d29ya0NvbmRpdGlvbnNTZXR0aW5nKTtzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsb3B0aW9uU2VsZWN0ZWQsZmFsc2UpO3JldHVybiBzZWxlY3RvcjtmdW5jdGlvbiBwb3B1bGF0ZShncm91cHMpe3NlbGVjdEVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtvcHRpb25zPVtdO2ZvcihsZXQgaT0wO2k8Z3JvdXBzLmxlbmd0aDsrK2kpe2NvbnN0IGdyb3VwPWdyb3Vwc1tpXTtjb25zdCBncm91cEVsZW1lbnQ9c2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0Z3JvdXAnKTtncm91cEVsZW1lbnQubGFiZWw9Z3JvdXAudGl0bGU7Zm9yKGNvbnN0IGNvbmRpdGlvbnMgb2YgZ3JvdXAuaXRlbXMpe2NvbnN0IHRpdGxlPWNvbmRpdGlvbnMudGl0bGU7Y29uc3Qgb3B0aW9uPW5ldyBPcHRpb24odGl0bGUsdGl0bGUpO2dyb3VwRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb24pO29wdGlvbnMucHVzaChjb25kaXRpb25zKTt9CmlmKGk9PT1ncm91cHMubGVuZ3RoLTEpe2dyb3VwRWxlbWVudC5hcHBlbmRDaGlsZChuZXcgT3B0aW9uKENvbW1vbi5VSVN0cmluZygnQWRkXHUyMDI2JyksQ29tbW9uLlVJU3RyaW5nKCdBZGRcdTIwMjYnKSkpO29wdGlvbnMucHVzaChudWxsKTt9fQpyZXR1cm4gb3B0aW9uczt9CmZ1bmN0aW9uIG9wdGlvblNlbGVjdGVkKCl7aWYoc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4PT09c2VsZWN0RWxlbWVudC5vcHRpb25zLmxlbmd0aC0xKQpzZWxlY3Rvci5yZXZlYWxBbmRVcGRhdGUoKTtlbHNlCnNlbGVjdG9yLm9wdGlvblNlbGVjdGVkKG9wdGlvbnNbc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4XSk7fQpmdW5jdGlvbiBzZWxlY3QoaW5kZXgpe2lmKHNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleCE9PWluZGV4KQpzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXg9aW5kZXg7fX0KY3JlYXRlT2ZmbGluZVRvb2xiYXJDaGVja2JveCgpe2NvbnN0IGNoZWNrYm94PW5ldyBVSS5Ub29sYmFyQ2hlY2tib3goQ29tbW9uLlVJU3RyaW5nKCdPZmZsaW5lJyksQ29tbW9uLlVJU3RyaW5nKCdGb3JjZSBkaXNjb25uZWN0ZWQgZnJvbSBuZXR3b3JrJyksZm9yY2VPZmZsaW5lLmJpbmQodGhpcykpO1NESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuRXZlbnRzLkNvbmRpdGlvbnNDaGFuZ2VkLG5ldHdvcmtDb25kaXRpb25zQ2hhbmdlZCk7Y2hlY2tib3guc2V0Q2hlY2tlZChTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5uZXR3b3JrQ29uZGl0aW9ucygpPT09U0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zKTtmdW5jdGlvbiBmb3JjZU9mZmxpbmUoKXtpZihjaGVja2JveC5jaGVja2VkKCkpClNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKFNESy5OZXR3b3JrTWFuYWdlci5PZmZsaW5lQ29uZGl0aW9ucyk7ZWxzZQpTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyh0aGlzLl9sYXN0TmV0d29ya1Rocm90dGxpbmdDb25kaXRpb25zKTt9CmZ1bmN0aW9uIG5ldHdvcmtDb25kaXRpb25zQ2hhbmdlZCgpe2NoZWNrYm94LnNldENoZWNrZWQoU0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIubmV0d29ya0NvbmRpdGlvbnMoKT09PVNESy5OZXR3b3JrTWFuYWdlci5PZmZsaW5lQ29uZGl0aW9ucyk7fQpyZXR1cm4gY2hlY2tib3g7fQpjcmVhdGVNb2JpbGVUaHJvdHRsaW5nQnV0dG9uKCl7Y29uc3QgYnV0dG9uPW5ldyBVSS5Ub29sYmFyTWVudUJ1dHRvbihhcHBlbmRJdGVtcyk7YnV0dG9uLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnVGhyb3R0bGluZycpKTtidXR0b24uc2V0R2x5cGgoJycpO2J1dHRvbi50dXJuSW50b1NlbGVjdCgpO2J1dHRvbi5zZXREYXJrVGV4dCgpO2xldCBvcHRpb25zPVtdO2xldCBzZWxlY3RlZEluZGV4PS0xO2NvbnN0IHNlbGVjdG9yPW5ldyBNb2JpbGVUaHJvdHRsaW5nLk1vYmlsZVRocm90dGxpbmdTZWxlY3Rvcihwb3B1bGF0ZSxzZWxlY3QpO3JldHVybiBidXR0b247ZnVuY3Rpb24gYXBwZW5kSXRlbXMoY29udGV4dE1lbnUpe2ZvcihsZXQgaW5kZXg9MDtpbmRleDxvcHRpb25zLmxlbmd0aDsrK2luZGV4KXtjb25zdCBjb25kaXRpb25zPW9wdGlvbnNbaW5kZXhdO2lmKCFjb25kaXRpb25zKQpjb250aW51ZTtpZihjb25kaXRpb25zLnRpdGxlPT09TW9iaWxlVGhyb3R0bGluZy5DdXN0b21Db25kaXRpb25zLnRpdGxlJiZjb25kaXRpb25zLmRlc2NyaXB0aW9uPT09TW9iaWxlVGhyb3R0bGluZy5DdXN0b21Db25kaXRpb25zLmRlc2NyaXB0aW9uKQpjb250aW51ZTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShDb21tb24uVUlTdHJpbmcoY29uZGl0aW9ucy50aXRsZSksc2VsZWN0b3Iub3B0aW9uU2VsZWN0ZWQuYmluZChzZWxlY3RvciwoY29uZGl0aW9ucykpLHNlbGVjdGVkSW5kZXg9PT1pbmRleCk7fX0KZnVuY3Rpb24gcG9wdWxhdGUoZ3JvdXBzKXtvcHRpb25zPVtdO2Zvcihjb25zdCBncm91cCBvZiBncm91cHMpe2Zvcihjb25zdCBjb25kaXRpb25zIG9mIGdyb3VwLml0ZW1zKQpvcHRpb25zLnB1c2goY29uZGl0aW9ucyk7b3B0aW9ucy5wdXNoKG51bGwpO30KcmV0dXJuIG9wdGlvbnM7fQpmdW5jdGlvbiBzZWxlY3QoaW5kZXgpe3NlbGVjdGVkSW5kZXg9aW5kZXg7YnV0dG9uLnNldFRleHQob3B0aW9uc1tpbmRleF0udGl0bGUpO2J1dHRvbi5zZXRUaXRsZShvcHRpb25zW2luZGV4XS5kZXNjcmlwdGlvbik7fX0KY3B1VGhyb3R0bGluZ1JhdGUoKXtyZXR1cm4gdGhpcy5fY3B1VGhyb3R0bGluZ1JhdGU7fQpzZXRDUFVUaHJvdHRsaW5nUmF0ZShyYXRlKXt0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZT1yYXRlO2Zvcihjb25zdCBlbXVsYXRpb25Nb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkVtdWxhdGlvbk1vZGVsKSkKZW11bGF0aW9uTW9kZWwuc2V0Q1BVVGhyb3R0bGluZ1JhdGUodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUpO2xldCBpY29uPW51bGw7aWYodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUhPT1Nb2JpbGVUaHJvdHRsaW5nLkNQVVRocm90dGxpbmdSYXRlcy5Ob1Rocm90dGxpbmcpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQ3B1VGhyb3R0bGluZ0VuYWJsZWQpO2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0NQVSB0aHJvdHRsaW5nIGlzIGVuYWJsZWQnKTt9CmNvbnN0IGluZGV4PXRoaXMuX2NwdVRocm90dGxpbmdSYXRlcy5pbmRleE9mKHRoaXMuX2NwdVRocm90dGxpbmdSYXRlKTtmb3IoY29uc3QgY29udHJvbCBvZiB0aGlzLl9jcHVUaHJvdHRsaW5nQ29udHJvbHMpCmNvbnRyb2wuc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7VUkuaW5zcGVjdG9yVmlldy5zZXRQYW5lbEljb24oJ3RpbWVsaW5lJyxpY29uKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhNb2JpbGVUaHJvdHRsaW5nLlRocm90dGxpbmdNYW5hZ2VyLkV2ZW50cy5SYXRlQ2hhbmdlZCx0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZSk7fQptb2RlbEFkZGVkKGVtdWxhdGlvbk1vZGVsKXtpZih0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZSE9PU1vYmlsZVRocm90dGxpbmcuQ1BVVGhyb3R0bGluZ1JhdGVzLk5vVGhyb3R0bGluZykKZW11bGF0aW9uTW9kZWwuc2V0Q1BVVGhyb3R0bGluZ1JhdGUodGhpcy5fY3B1VGhyb3R0bGluZ1JhdGUpO30KbW9kZWxSZW1vdmVkKGVtdWxhdGlvbk1vZGVsKXt9CmNyZWF0ZUNQVVRocm90dGxpbmdTZWxlY3Rvcigpe2NvbnN0IGNvbnRyb2w9bmV3IFVJLlRvb2xiYXJDb21ib0JveChldmVudD0+dGhpcy5zZXRDUFVUaHJvdHRsaW5nUmF0ZSh0aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZXNbZXZlbnQudGFyZ2V0LnNlbGVjdGVkSW5kZXhdKSk7dGhpcy5fY3B1VGhyb3R0bGluZ0NvbnRyb2xzLmFkZChjb250cm9sKTtjb25zdCBjdXJyZW50UmF0ZT10aGlzLl9jcHVUaHJvdHRsaW5nUmF0ZTtmb3IobGV0IGk9MDtpPHRoaXMuX2NwdVRocm90dGxpbmdSYXRlcy5sZW5ndGg7KytpKXtjb25zdCByYXRlPXRoaXMuX2NwdVRocm90dGxpbmdSYXRlc1tpXTtjb25zdCB0aXRsZT1yYXRlPT09MT9Db21tb24uVUlTdHJpbmcoJ05vIHRocm90dGxpbmcnKTpDb21tb24uVUlTdHJpbmcoJyVkXHhENyBzbG93ZG93bicscmF0ZSk7Y29uc3Qgb3B0aW9uPWNvbnRyb2wuY3JlYXRlT3B0aW9uKHRpdGxlKTtjb250cm9sLmFkZE9wdGlvbihvcHRpb24pO2lmKGN1cnJlbnRSYXRlPT09cmF0ZSkKY29udHJvbC5zZXRTZWxlY3RlZEluZGV4KGkpO30KcmV0dXJuIGNvbnRyb2w7fX07TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlci5FdmVudHM9e1JhdGVDaGFuZ2VkOlN5bWJvbCgnUmF0ZUNoYW5nZWQnKX07TW9iaWxlVGhyb3R0bGluZy5UaHJvdHRsaW5nTWFuYWdlci5BY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7aWYoYWN0aW9uSWQ9PT0nbmV0d29yay1jb25kaXRpb25zLm5ldHdvcmstb25saW5lJyl7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0TmV0d29ya0NvbmRpdGlvbnMoU0RLLk5ldHdvcmtNYW5hZ2VyLk5vVGhyb3R0bGluZ0NvbmRpdGlvbnMpO3JldHVybiB0cnVlO30KaWYoYWN0aW9uSWQ9PT0nbmV0d29yay1jb25kaXRpb25zLm5ldHdvcmstbG93LWVuZC1tb2JpbGUnKXtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyhTREsuTmV0d29ya01hbmFnZXIuU2xvdzNHQ29uZGl0aW9ucyk7cmV0dXJuIHRydWU7fQppZihhY3Rpb25JZD09PSduZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1taWQtdGllci1tb2JpbGUnKXtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXROZXR3b3JrQ29uZGl0aW9ucyhTREsuTmV0d29ya01hbmFnZXIuRmFzdDNHQ29uZGl0aW9ucyk7cmV0dXJuIHRydWU7fQppZihhY3Rpb25JZD09PSduZXR3b3JrLWNvbmRpdGlvbnMubmV0d29yay1vZmZsaW5lJyl7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0TmV0d29ya0NvbmRpdGlvbnMoU0RLLk5ldHdvcmtNYW5hZ2VyLk9mZmxpbmVDb25kaXRpb25zKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtNb2JpbGVUaHJvdHRsaW5nLnRocm90dGxpbmdNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHNlbGYuc2luZ2xldG9uKE1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIpO307O3NlbGZbJ0Jyb3dzZXJDb21wb25lbnRzJ109c2VsZlsnQnJvd3NlckNvbXBvbmVudHMnXXx8e307QnJvd3NlckNvbXBvbmVudHMuSW1hZ2VQcmV2aWV3PWNsYXNze3N0YXRpYyBidWlsZCh0YXJnZXQsb3JpZ2luYWxJbWFnZVVSTCxzaG93RGltZW5zaW9ucyxwcmVjb21wdXRlZEZlYXR1cmVzKXtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZighcmVzb3VyY2VUcmVlTW9kZWwpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtsZXQgcmVzb3VyY2U9cmVzb3VyY2VUcmVlTW9kZWwucmVzb3VyY2VGb3JVUkwob3JpZ2luYWxJbWFnZVVSTCk7bGV0IGltYWdlVVJMPW9yaWdpbmFsSW1hZ2VVUkw7aWYoIWlzSW1hZ2VSZXNvdXJjZShyZXNvdXJjZSkmJnByZWNvbXB1dGVkRmVhdHVyZXMmJnByZWNvbXB1dGVkRmVhdHVyZXMuY3VycmVudFNyYyl7aW1hZ2VVUkw9cHJlY29tcHV0ZWRGZWF0dXJlcy5jdXJyZW50U3JjO3Jlc291cmNlPXJlc291cmNlVHJlZU1vZGVsLnJlc291cmNlRm9yVVJMKGltYWdlVVJMKTt9CmlmKCFpc0ltYWdlUmVzb3VyY2UocmVzb3VyY2UpKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7bGV0IGZ1bGZpbGw7Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZSh4PT5mdWxmaWxsPXgpO2NvbnN0IGltYWdlRWxlbWVudD1jcmVhdGVFbGVtZW50KCdpbWcnKTtpbWFnZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsYnVpbGRDb250ZW50LGZhbHNlKTtpbWFnZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCgpPT5mdWxmaWxsKG51bGwpLGZhbHNlKTtyZXNvdXJjZS5wb3B1bGF0ZUltYWdlU291cmNlKGltYWdlRWxlbWVudCk7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gaXNJbWFnZVJlc291cmNlKHJlc291cmNlKXtyZXR1cm4hIXJlc291cmNlJiZyZXNvdXJjZS5yZXNvdXJjZVR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlO30KZnVuY3Rpb24gYnVpbGRDb250ZW50KCl7Y29uc3QgY29udGFpbmVyPWNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7VUkuYXBwZW5kU3R5bGUoY29udGFpbmVyLCdicm93c2VyX2NvbXBvbmVudHMvaW1hZ2VQcmV2aWV3LmNzcycpO2NvbnRhaW5lci5jbGFzc05hbWU9J2ltYWdlLXByZXZpZXctY29udGFpbmVyJztjb25zdCBuYXR1cmFsV2lkdGg9cHJlY29tcHV0ZWRGZWF0dXJlcz9wcmVjb21wdXRlZEZlYXR1cmVzLm5hdHVyYWxXaWR0aDppbWFnZUVsZW1lbnQubmF0dXJhbFdpZHRoO2NvbnN0IG5hdHVyYWxIZWlnaHQ9cHJlY29tcHV0ZWRGZWF0dXJlcz9wcmVjb21wdXRlZEZlYXR1cmVzLm5hdHVyYWxIZWlnaHQ6aW1hZ2VFbGVtZW50Lm5hdHVyYWxIZWlnaHQ7Y29uc3Qgb2Zmc2V0V2lkdGg9cHJlY29tcHV0ZWRGZWF0dXJlcz9wcmVjb21wdXRlZEZlYXR1cmVzLm9mZnNldFdpZHRoOm5hdHVyYWxXaWR0aDtjb25zdCBvZmZzZXRIZWlnaHQ9cHJlY29tcHV0ZWRGZWF0dXJlcz9wcmVjb21wdXRlZEZlYXR1cmVzLm9mZnNldEhlaWdodDpuYXR1cmFsSGVpZ2h0O2xldCBkZXNjcmlwdGlvbjtpZihzaG93RGltZW5zaW9ucyl7aWYob2Zmc2V0SGVpZ2h0PT09bmF0dXJhbEhlaWdodCYmb2Zmc2V0V2lkdGg9PT1uYXR1cmFsV2lkdGgpe2Rlc2NyaXB0aW9uPUNvbW1vbi5VSVN0cmluZygnJWQgXHhkNyAlZCBwaXhlbHMnLG9mZnNldFdpZHRoLG9mZnNldEhlaWdodCk7fWVsc2V7ZGVzY3JpcHRpb249Q29tbW9uLlVJU3RyaW5nKCclZCBceGQ3ICVkIHBpeGVscyAoTmF0dXJhbDogJWQgXHhkNyAlZCBwaXhlbHMpJyxvZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQsbmF0dXJhbFdpZHRoLG5hdHVyYWxIZWlnaHQpO319CmNvbnRhaW5lci5jcmVhdGVDaGlsZCgndHInKS5jcmVhdGVDaGlsZCgndGQnLCdpbWFnZS1jb250YWluZXInKS5hcHBlbmRDaGlsZChpbWFnZUVsZW1lbnQpO2lmKGRlc2NyaXB0aW9uKQpjb250YWluZXIuY3JlYXRlQ2hpbGQoJ3RyJykuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdkZXNjcmlwdGlvbicpLnRleHRDb250ZW50PWRlc2NyaXB0aW9uO2lmKGltYWdlVVJMIT09b3JpZ2luYWxJbWFnZVVSTCl7Y29udGFpbmVyLmNyZWF0ZUNoaWxkKCd0cicpLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZUNoaWxkKCdzcGFuJywnZGVzY3JpcHRpb24nKS50ZXh0Q29udGVudD1TdHJpbmcuc3ByaW50ZignY3VycmVudFNyYzogJXMnLGltYWdlVVJMLnRyaW1NaWRkbGUoMTAwKSk7fQpmdWxmaWxsKGNvbnRhaW5lcik7fX19OztzZWxmWydXb3JrZXJNYWluJ109c2VsZlsnV29ya2VyTWFpbiddfHx7fTtXb3JrZXJNYWluLldvcmtlck1haW49Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e3J1bigpe2NvbnN0IGNhcGFiaWxpdGllcz1TREsuVGFyZ2V0LkNhcGFiaWxpdHkuQnJvd3NlcnxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTG9nfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5OZXR3b3JrfFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5UYXJnZXR8U0RLLlRhcmdldC5DYXBhYmlsaXR5Lkluc3BlY3RvcjtTREsudGFyZ2V0TWFuYWdlci5jcmVhdGVUYXJnZXQoJ21haW4nLENvbW1vbi5VSVN0cmluZygnTWFpbicpLGNhcGFiaWxpdGllcyx0aGlzLl9jcmVhdGVNYWluQ29ubmVjdGlvbi5iaW5kKHRoaXMpLG51bGwsZmFsc2UpO0luc3BlY3RvckZyb250ZW5kSG9zdC5jb25uZWN0aW9uUmVhZHkoKTtuZXcgTW9iaWxlVGhyb3R0bGluZy5OZXR3b3JrUGFuZWxJbmRpY2F0b3IoKTt9Cl9jcmVhdGVNYWluQ29ubmVjdGlvbihwYXJhbXMpe3JldHVybiBTREsuY3JlYXRlTWFpbkNvbm5lY3Rpb24ocGFyYW1zLCgpPT5Db21wb25lbnRzLlRhcmdldERldGFjaGVkRGlhbG9nLndlYlNvY2tldENvbm5lY3Rpb25Mb3N0KCkpO319O1NESy5DaGlsZFRhcmdldE1hbmFnZXIuaW5zdGFsbCgoe3RhcmdldCx3YWl0aW5nRm9yRGVidWdnZXJ9KT0+e2NvbnN0IHBhcmVudFRhcmdldD10YXJnZXQucGFyZW50VGFyZ2V0KCk7aWYoIXBhcmVudFRhcmdldC5wYXJlbnRUYXJnZXQoKSYmd2FpdGluZ0ZvckRlYnVnZ2VyKXtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7aWYoZGVidWdnZXJNb2RlbCkKZGVidWdnZXJNb2RlbC5wYXVzZSgpO319KTs7O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJtb2JpbGVfdGhyb3R0bGluZy90aHJvdHRsaW5nU2V0dGluZ3NUYWIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICAgIG92ZXJmbG93OmhpZGRlbjtcbn1cblxuLmhlYWRlciB7XG4gICAgcGFkZGluZzogMCAwIDZweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0VFRUVFRTtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uYWRkLWNvbmRpdGlvbnMtYnV0dG9uIHtcbiAgICBmbGV4OiBub25lO1xuICAgIG1hcmdpbjogMTBweCAycHg7XG4gICAgbWluLXdpZHRoOiAxNDBweDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xufVxuXG4uY29uZGl0aW9ucy1saXN0IHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICAgIG1pbi13aWR0aDogMzQwcHg7XG4gICAgZmxleDogYXV0bztcbn1cblxuLmNvbmRpdGlvbnMtbGlzdC1pdGVtIHtcbiAgICBwYWRkaW5nOiAzcHggNXB4IDNweCA1cHg7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxleDogYXV0byAxIDE7XG59XG5cbi5jb25kaXRpb25zLWxpc3QtdGV4dCB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmbGV4OiAwIDAgNzBweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiAjMjIyO1xuICAgIHRleHQtYWxpZ246IGVuZDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jb25kaXRpb25zLWxpc3QtdGl0bGUge1xuICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuICAgIGZsZXg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cblxuLmNvbmRpdGlvbnMtbGlzdC10aXRsZS10ZXh0IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IGF1dG87XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLmNvbmRpdGlvbnMtbGlzdC1zZXBhcmF0b3Ige1xuICAgIGZsZXg6IDAgMCAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMSwgMjMxLCAyMzEpO1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW46IDAgNHB4O1xufVxuXG4uY29uZGl0aW9ucy1saXN0LXNlcGFyYXRvci1pbnZpc2libGUge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbn1cblxuLmNvbmRpdGlvbnMtZWRpdC1yb3cge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbjogNnB4IDVweDtcbn1cblxuLmNvbmRpdGlvbnMtZWRpdC1yb3cgaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG59XG5cbi5jb25kaXRpb25zLWVkaXQtb3B0aW9uYWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IC0yMHB4O1xuICAgIHJpZ2h0OiAwO1xuICAgIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7XG59XG5cbi8qIyBzb3VyY2VVUkw9bW9iaWxlX3Rocm90dGxpbmcvdGhyb3R0bGluZ1NldHRpbmdzVGFiLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImJyb3dzZXJfY29tcG9uZW50cy9pbWFnZVByZXZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmltYWdlLXByZXZpZXctY29udGFpbmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbi5pbWFnZS1wcmV2aWV3LWNvbnRhaW5lciBpbWcge1xuICAgIG1hcmdpbjogMnB4IGF1dG87XG4gICAgbWF4LXdpZHRoOiAxMDBweDtcbiAgICBtYXgtaGVpZ2h0OiAxMDBweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2NoZWNrZXIucG5nKTtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIC13ZWJraXQtdXNlci1kcmFnOiBhdXRvO1xufVxuXG4uaW1hZ2UtY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4vKiMgc291cmNlVVJMPWJyb3dzZXJfY29tcG9uZW50cy9pbWFnZVByZXZpZXcuY3NzICovIjtBbmltYXRpb24uQW5pbWF0aW9uTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX3J1bnRpbWVNb2RlbD0odGFyZ2V0Lm1vZGVsKFNESy5SdW50aW1lTW9kZWwpKTt0aGlzLl9hZ2VudD10YXJnZXQuYW5pbWF0aW9uQWdlbnQoKTt0YXJnZXQucmVnaXN0ZXJBbmltYXRpb25EaXNwYXRjaGVyKG5ldyBBbmltYXRpb24uQW5pbWF0aW9uRGlzcGF0Y2hlcih0aGlzKSk7dGhpcy5fYW5pbWF0aW9uc0J5SWQ9bmV3IE1hcCgpO3RoaXMuX2FuaW1hdGlvbkdyb3Vwcz1uZXcgTWFwKCk7dGhpcy5fcGVuZGluZ0FuaW1hdGlvbnM9W107dGhpcy5fcGxheWJhY2tSYXRlPTE7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9KHRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpKTtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMuX3Jlc2V0LHRoaXMpO2NvbnN0IHNjcmVlbkNhcHR1cmVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlNjcmVlbkNhcHR1cmVNb2RlbCk7aWYoc2NyZWVuQ2FwdHVyZU1vZGVsKQp0aGlzLl9zY3JlZW5zaG90Q2FwdHVyZT1uZXcgQW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLlNjcmVlbnNob3RDYXB0dXJlKHRoaXMsc2NyZWVuQ2FwdHVyZU1vZGVsKTt9Cl9yZXNldCgpe3RoaXMuX2FuaW1hdGlvbnNCeUlkLmNsZWFyKCk7dGhpcy5fYW5pbWF0aW9uR3JvdXBzLmNsZWFyKCk7dGhpcy5fcGVuZGluZ0FuaW1hdGlvbnM9W107dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLkV2ZW50cy5Nb2RlbFJlc2V0KTt9CmFuaW1hdGlvbkNyZWF0ZWQoaWQpe3RoaXMuX3BlbmRpbmdBbmltYXRpb25zLnB1c2goaWQpO30KX2FuaW1hdGlvbkNhbmNlbGVkKGlkKXt0aGlzLl9wZW5kaW5nQW5pbWF0aW9ucy5yZW1vdmUoaWQpO3RoaXMuX2ZsdXNoUGVuZGluZ0FuaW1hdGlvbnNJZk5lZWRlZCgpO30KYW5pbWF0aW9uU3RhcnRlZChwYXlsb2FkKXtpZighcGF5bG9hZC5zb3VyY2V8fCFwYXlsb2FkLnNvdXJjZS5iYWNrZW5kTm9kZUlkKQpyZXR1cm47Y29uc3QgYW5pbWF0aW9uPUFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5BbmltYXRpb24ucGFyc2VQYXlsb2FkKHRoaXMscGF5bG9hZCk7aWYoYW5pbWF0aW9uLnR5cGUoKT09PSdXZWJBbmltYXRpb24nJiZhbmltYXRpb24uc291cmNlKCkua2V5ZnJhbWVzUnVsZSgpLmtleWZyYW1lcygpLmxlbmd0aD09PTApe3RoaXMuX3BlbmRpbmdBbmltYXRpb25zLnJlbW92ZShhbmltYXRpb24uaWQoKSk7fWVsc2V7dGhpcy5fYW5pbWF0aW9uc0J5SWQuc2V0KGFuaW1hdGlvbi5pZCgpLGFuaW1hdGlvbik7aWYodGhpcy5fcGVuZGluZ0FuaW1hdGlvbnMuaW5kZXhPZihhbmltYXRpb24uaWQoKSk9PT0tMSkKdGhpcy5fcGVuZGluZ0FuaW1hdGlvbnMucHVzaChhbmltYXRpb24uaWQoKSk7fQp0aGlzLl9mbHVzaFBlbmRpbmdBbmltYXRpb25zSWZOZWVkZWQoKTt9Cl9mbHVzaFBlbmRpbmdBbmltYXRpb25zSWZOZWVkZWQoKXtmb3IoY29uc3QgaWQgb2YgdGhpcy5fcGVuZGluZ0FuaW1hdGlvbnMpe2lmKCF0aGlzLl9hbmltYXRpb25zQnlJZC5nZXQoaWQpKQpyZXR1cm47fQp3aGlsZSh0aGlzLl9wZW5kaW5nQW5pbWF0aW9ucy5sZW5ndGgpCnRoaXMuX21hdGNoRXhpc3RpbmdHcm91cHModGhpcy5fY3JlYXRlR3JvdXBGcm9tUGVuZGluZ0FuaW1hdGlvbnMoKSk7fQpfbWF0Y2hFeGlzdGluZ0dyb3VwcyhpbmNvbWluZ0dyb3VwKXtsZXQgbWF0Y2hlZEdyb3VwPW51bGw7Zm9yKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2FuaW1hdGlvbkdyb3Vwcy52YWx1ZXMoKSl7aWYoZ3JvdXAuX21hdGNoZXMoaW5jb21pbmdHcm91cCkpe21hdGNoZWRHcm91cD1ncm91cDtncm91cC5fdXBkYXRlKGluY29taW5nR3JvdXApO2JyZWFrO319CmlmKCFtYXRjaGVkR3JvdXApe3RoaXMuX2FuaW1hdGlvbkdyb3Vwcy5zZXQoaW5jb21pbmdHcm91cC5pZCgpLGluY29taW5nR3JvdXApO2lmKHRoaXMuX3NjcmVlbnNob3RDYXB0dXJlKQp0aGlzLl9zY3JlZW5zaG90Q2FwdHVyZS5jYXB0dXJlU2NyZWVuc2hvdHMoaW5jb21pbmdHcm91cC5maW5pdGVEdXJhdGlvbigpLGluY29taW5nR3JvdXAuX3NjcmVlbnNob3RzKTt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5FdmVudHMuQW5pbWF0aW9uR3JvdXBTdGFydGVkLG1hdGNoZWRHcm91cHx8aW5jb21pbmdHcm91cCk7cmV0dXJuISFtYXRjaGVkR3JvdXA7fQpfY3JlYXRlR3JvdXBGcm9tUGVuZGluZ0FuaW1hdGlvbnMoKXtjb25zb2xlLmFzc2VydCh0aGlzLl9wZW5kaW5nQW5pbWF0aW9ucy5sZW5ndGgpO2NvbnN0IGdyb3VwZWRBbmltYXRpb25zPVt0aGlzLl9hbmltYXRpb25zQnlJZC5nZXQodGhpcy5fcGVuZGluZ0FuaW1hdGlvbnMuc2hpZnQoKSldO2NvbnN0IHJlbWFpbmluZ0FuaW1hdGlvbnM9W107Zm9yKGNvbnN0IGlkIG9mIHRoaXMuX3BlbmRpbmdBbmltYXRpb25zKXtjb25zdCBhbmltPXRoaXMuX2FuaW1hdGlvbnNCeUlkLmdldChpZCk7aWYoYW5pbS5zdGFydFRpbWUoKT09PWdyb3VwZWRBbmltYXRpb25zWzBdLnN0YXJ0VGltZSgpKQpncm91cGVkQW5pbWF0aW9ucy5wdXNoKGFuaW0pO2Vsc2UKcmVtYWluaW5nQW5pbWF0aW9ucy5wdXNoKGlkKTt9CnRoaXMuX3BlbmRpbmdBbmltYXRpb25zPXJlbWFpbmluZ0FuaW1hdGlvbnM7cmV0dXJuIG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuQW5pbWF0aW9uR3JvdXAodGhpcyxncm91cGVkQW5pbWF0aW9uc1swXS5pZCgpLGdyb3VwZWRBbmltYXRpb25zKTt9CnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpe3RoaXMuX3BsYXliYWNrUmF0ZT1wbGF5YmFja1JhdGU7dGhpcy5fYWdlbnQuc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7fQpfcmVsZWFzZUFuaW1hdGlvbnMoYW5pbWF0aW9ucyl7dGhpcy5fYWdlbnQucmVsZWFzZUFuaW1hdGlvbnMoYW5pbWF0aW9ucyk7fQpzdXNwZW5kTW9kZWwoKXt0aGlzLl9yZXNldCgpO3JldHVybiB0aGlzLl9hZ2VudC5kaXNhYmxlKCk7fQpyZXN1bWVNb2RlbCgpe2lmKCF0aGlzLl9lbmFibGVkKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIHRoaXMuX2FnZW50LmVuYWJsZSgpO30KZW5zdXJlRW5hYmxlZCgpe2lmKHRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9hZ2VudC5lbmFibGUoKTt0aGlzLl9lbmFibGVkPXRydWU7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRE9NLGZhbHNlKTtBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuRXZlbnRzPXtBbmltYXRpb25Hcm91cFN0YXJ0ZWQ6U3ltYm9sKCdBbmltYXRpb25Hcm91cFN0YXJ0ZWQnKSxNb2RlbFJlc2V0OlN5bWJvbCgnTW9kZWxSZXNldCcpfTtBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuQW5pbWF0aW9uPWNsYXNze2NvbnN0cnVjdG9yKGFuaW1hdGlvbk1vZGVsLHBheWxvYWQpe3RoaXMuX2FuaW1hdGlvbk1vZGVsPWFuaW1hdGlvbk1vZGVsO3RoaXMuX3BheWxvYWQ9cGF5bG9hZDt0aGlzLl9zb3VyY2U9bmV3IEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5BbmltYXRpb25FZmZlY3QoYW5pbWF0aW9uTW9kZWwsKHRoaXMuX3BheWxvYWQuc291cmNlKSk7fQpzdGF0aWMgcGFyc2VQYXlsb2FkKGFuaW1hdGlvbk1vZGVsLHBheWxvYWQpe3JldHVybiBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLkFuaW1hdGlvbihhbmltYXRpb25Nb2RlbCxwYXlsb2FkKTt9CnBheWxvYWQoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZDt9CmlkKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQuaWQ7fQpuYW1lKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQubmFtZTt9CnBhdXNlZCgpe3JldHVybiB0aGlzLl9wYXlsb2FkLnBhdXNlZFN0YXRlO30KcGxheVN0YXRlKCl7cmV0dXJuIHRoaXMuX3BsYXlTdGF0ZXx8dGhpcy5fcGF5bG9hZC5wbGF5U3RhdGU7fQpzZXRQbGF5U3RhdGUocGxheVN0YXRlKXt0aGlzLl9wbGF5U3RhdGU9cGxheVN0YXRlO30KcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQucGxheWJhY2tSYXRlO30Kc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQuc3RhcnRUaW1lO30KZW5kVGltZSgpe2lmKCF0aGlzLnNvdXJjZSgpLml0ZXJhdGlvbnMpCnJldHVybiBJbmZpbml0eTtyZXR1cm4gdGhpcy5zdGFydFRpbWUoKSt0aGlzLnNvdXJjZSgpLmRlbGF5KCkrdGhpcy5zb3VyY2UoKS5kdXJhdGlvbigpKnRoaXMuc291cmNlKCkuaXRlcmF0aW9ucygpKwp0aGlzLnNvdXJjZSgpLmVuZERlbGF5KCk7fQpfZmluaXRlRHVyYXRpb24oKXtjb25zdCBpdGVyYXRpb25zPU1hdGgubWluKHRoaXMuc291cmNlKCkuaXRlcmF0aW9ucygpLDMpO3JldHVybiB0aGlzLnNvdXJjZSgpLmRlbGF5KCkrdGhpcy5zb3VyY2UoKS5kdXJhdGlvbigpKml0ZXJhdGlvbnM7fQpjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl9wYXlsb2FkLmN1cnJlbnRUaW1lO30Kc291cmNlKCl7cmV0dXJuIHRoaXMuX3NvdXJjZTt9CnR5cGUoKXtyZXR1cm4odGhpcy5fcGF5bG9hZC50eXBlKTt9Cm92ZXJsYXBzKGFuaW1hdGlvbil7aWYoIXRoaXMuc291cmNlKCkuaXRlcmF0aW9ucygpfHwhYW5pbWF0aW9uLnNvdXJjZSgpLml0ZXJhdGlvbnMoKSkKcmV0dXJuIHRydWU7Y29uc3QgZmlyc3RBbmltYXRpb249dGhpcy5zdGFydFRpbWUoKTxhbmltYXRpb24uc3RhcnRUaW1lKCk/dGhpczphbmltYXRpb247Y29uc3Qgc2Vjb25kQW5pbWF0aW9uPWZpcnN0QW5pbWF0aW9uPT09dGhpcz9hbmltYXRpb246dGhpcztyZXR1cm4gZmlyc3RBbmltYXRpb24uZW5kVGltZSgpPj1zZWNvbmRBbmltYXRpb24uc3RhcnRUaW1lKCk7fQpzZXRUaW1pbmcoZHVyYXRpb24sZGVsYXkpe3RoaXMuX3NvdXJjZS5ub2RlKCkudGhlbih0aGlzLl91cGRhdGVOb2RlU3R5bGUuYmluZCh0aGlzLGR1cmF0aW9uLGRlbGF5KSk7dGhpcy5fc291cmNlLl9kdXJhdGlvbj1kdXJhdGlvbjt0aGlzLl9zb3VyY2UuX2RlbGF5PWRlbGF5O3RoaXMuX2FuaW1hdGlvbk1vZGVsLl9hZ2VudC5zZXRUaW1pbmcodGhpcy5pZCgpLGR1cmF0aW9uLGRlbGF5KTt9Cl91cGRhdGVOb2RlU3R5bGUoZHVyYXRpb24sZGVsYXksbm9kZSl7bGV0IGFuaW1hdGlvblByZWZpeDtpZih0aGlzLnR5cGUoKT09PUFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5BbmltYXRpb24uVHlwZS5DU1NUcmFuc2l0aW9uKQphbmltYXRpb25QcmVmaXg9J3RyYW5zaXRpb24tJztlbHNlIGlmKHRoaXMudHlwZSgpPT09QW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLkFuaW1hdGlvbi5UeXBlLkNTU0FuaW1hdGlvbikKYW5pbWF0aW9uUHJlZml4PSdhbmltYXRpb24tJztlbHNlCnJldHVybjtjb25zdCBjc3NNb2RlbD1ub2RlLmRvbU1vZGVsKCkuY3NzTW9kZWwoKTtjc3NNb2RlbC5zZXRFZmZlY3RpdmVQcm9wZXJ0eVZhbHVlRm9yTm9kZShub2RlLmlkLGFuaW1hdGlvblByZWZpeCsnZHVyYXRpb24nLGR1cmF0aW9uKydtcycpO2Nzc01vZGVsLnNldEVmZmVjdGl2ZVByb3BlcnR5VmFsdWVGb3JOb2RlKG5vZGUuaWQsYW5pbWF0aW9uUHJlZml4KydkZWxheScsZGVsYXkrJ21zJyk7fQpyZW1vdGVPYmplY3RQcm9taXNlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbk1vZGVsLl9hZ2VudC5yZXNvbHZlQW5pbWF0aW9uKHRoaXMuaWQoKSkudGhlbihwYXlsb2FkPT5wYXlsb2FkJiZ0aGlzLl9hbmltYXRpb25Nb2RlbC5fcnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdChwYXlsb2FkKSk7fQpfY3NzSWQoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC5jc3NJZHx8Jyc7fX07QW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLkFuaW1hdGlvbi5UeXBlPXtDU1NUcmFuc2l0aW9uOidDU1NUcmFuc2l0aW9uJyxDU1NBbmltYXRpb246J0NTU0FuaW1hdGlvbicsV2ViQW5pbWF0aW9uOidXZWJBbmltYXRpb24nfTtBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuQW5pbWF0aW9uRWZmZWN0PWNsYXNze2NvbnN0cnVjdG9yKGFuaW1hdGlvbk1vZGVsLHBheWxvYWQpe3RoaXMuX2FuaW1hdGlvbk1vZGVsPWFuaW1hdGlvbk1vZGVsO3RoaXMuX3BheWxvYWQ9cGF5bG9hZDtpZihwYXlsb2FkLmtleWZyYW1lc1J1bGUpCnRoaXMuX2tleWZyYW1lc1J1bGU9bmV3IEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5LZXlmcmFtZXNSdWxlKHBheWxvYWQua2V5ZnJhbWVzUnVsZSk7dGhpcy5fZGVsYXk9dGhpcy5fcGF5bG9hZC5kZWxheTt0aGlzLl9kdXJhdGlvbj10aGlzLl9wYXlsb2FkLmR1cmF0aW9uO30KZGVsYXkoKXtyZXR1cm4gdGhpcy5fZGVsYXk7fQplbmREZWxheSgpe3JldHVybiB0aGlzLl9wYXlsb2FkLmVuZERlbGF5O30KaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC5pdGVyYXRpb25TdGFydDt9Cml0ZXJhdGlvbnMoKXtpZighdGhpcy5kZWxheSgpJiYhdGhpcy5lbmREZWxheSgpJiYhdGhpcy5kdXJhdGlvbigpKQpyZXR1cm4gMDtyZXR1cm4gdGhpcy5fcGF5bG9hZC5pdGVyYXRpb25zfHxJbmZpbml0eTt9CmR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2R1cmF0aW9uO30KZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQuZGlyZWN0aW9uO30KZmlsbCgpe3JldHVybiB0aGlzLl9wYXlsb2FkLmZpbGw7fQpub2RlKCl7aWYoIXRoaXMuX2RlZmVycmVkTm9kZSkKdGhpcy5fZGVmZXJyZWROb2RlPW5ldyBTREsuRGVmZXJyZWRET01Ob2RlKHRoaXMuX2FuaW1hdGlvbk1vZGVsLnRhcmdldCgpLHRoaXMuYmFja2VuZE5vZGVJZCgpKTtyZXR1cm4gdGhpcy5fZGVmZXJyZWROb2RlLnJlc29sdmVQcm9taXNlKCk7fQpkZWZlcnJlZE5vZGUoKXtyZXR1cm4gbmV3IFNESy5EZWZlcnJlZERPTU5vZGUodGhpcy5fYW5pbWF0aW9uTW9kZWwudGFyZ2V0KCksdGhpcy5iYWNrZW5kTm9kZUlkKCkpO30KYmFja2VuZE5vZGVJZCgpe3JldHVybih0aGlzLl9wYXlsb2FkLmJhY2tlbmROb2RlSWQpO30Ka2V5ZnJhbWVzUnVsZSgpe3JldHVybiB0aGlzLl9rZXlmcmFtZXNSdWxlO30KZWFzaW5nKCl7cmV0dXJuIHRoaXMuX3BheWxvYWQuZWFzaW5nO319O0FuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5LZXlmcmFtZXNSdWxlPWNsYXNze2NvbnN0cnVjdG9yKHBheWxvYWQpe3RoaXMuX3BheWxvYWQ9cGF5bG9hZDt0aGlzLl9rZXlmcmFtZXM9dGhpcy5fcGF5bG9hZC5rZXlmcmFtZXMubWFwKGZ1bmN0aW9uKGtleWZyYW1lU3R5bGUpe3JldHVybiBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLktleWZyYW1lU3R5bGUoa2V5ZnJhbWVTdHlsZSk7fSk7fQpfc2V0S2V5ZnJhbWVzUGF5bG9hZChwYXlsb2FkKXt0aGlzLl9rZXlmcmFtZXM9cGF5bG9hZC5tYXAoZnVuY3Rpb24oa2V5ZnJhbWVTdHlsZSl7cmV0dXJuIG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuS2V5ZnJhbWVTdHlsZShrZXlmcmFtZVN0eWxlKTt9KTt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC5uYW1lO30Ka2V5ZnJhbWVzKCl7cmV0dXJuIHRoaXMuX2tleWZyYW1lczt9fTtBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuS2V5ZnJhbWVTdHlsZT1jbGFzc3tjb25zdHJ1Y3RvcihwYXlsb2FkKXt0aGlzLl9wYXlsb2FkPXBheWxvYWQ7dGhpcy5fb2Zmc2V0PXRoaXMuX3BheWxvYWQub2Zmc2V0O30Kb2Zmc2V0KCl7cmV0dXJuIHRoaXMuX29mZnNldDt9CnNldE9mZnNldChvZmZzZXQpe3RoaXMuX29mZnNldD1vZmZzZXQqMTAwKyclJzt9Cm9mZnNldEFzTnVtYmVyKCl7cmV0dXJuIHBhcnNlRmxvYXQodGhpcy5fb2Zmc2V0KS8xMDA7fQplYXNpbmcoKXtyZXR1cm4gdGhpcy5fcGF5bG9hZC5lYXNpbmc7fX07QW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLkFuaW1hdGlvbkdyb3VwPWNsYXNze2NvbnN0cnVjdG9yKGFuaW1hdGlvbk1vZGVsLGlkLGFuaW1hdGlvbnMpe3RoaXMuX2FuaW1hdGlvbk1vZGVsPWFuaW1hdGlvbk1vZGVsO3RoaXMuX2lkPWlkO3RoaXMuX2FuaW1hdGlvbnM9YW5pbWF0aW9uczt0aGlzLl9wYXVzZWQ9ZmFsc2U7dGhpcy5fc2NyZWVuc2hvdHM9W107dGhpcy5fc2NyZWVuc2hvdEltYWdlcz1bXTt9CmlkKCl7cmV0dXJuIHRoaXMuX2lkO30KYW5pbWF0aW9ucygpe3JldHVybiB0aGlzLl9hbmltYXRpb25zO30KcmVsZWFzZSgpe3RoaXMuX2FuaW1hdGlvbk1vZGVsLl9hbmltYXRpb25Hcm91cHMucmVtb3ZlKHRoaXMuaWQoKSk7dGhpcy5fYW5pbWF0aW9uTW9kZWwuX3JlbGVhc2VBbmltYXRpb25zKHRoaXMuX2FuaW1hdGlvbklkcygpKTt9Cl9hbmltYXRpb25JZHMoKXtmdW5jdGlvbiBleHRyYWN0SWQoYW5pbWF0aW9uKXtyZXR1cm4gYW5pbWF0aW9uLmlkKCk7fQpyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5tYXAoZXh0cmFjdElkKTt9CnN0YXJ0VGltZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb25zWzBdLnN0YXJ0VGltZSgpO30KZmluaXRlRHVyYXRpb24oKXtsZXQgbWF4RHVyYXRpb249MDtmb3IobGV0IGk9MDtpPHRoaXMuX2FuaW1hdGlvbnMubGVuZ3RoOysraSkKbWF4RHVyYXRpb249TWF0aC5tYXgobWF4RHVyYXRpb24sdGhpcy5fYW5pbWF0aW9uc1tpXS5fZmluaXRlRHVyYXRpb24oKSk7cmV0dXJuIG1heER1cmF0aW9uO30Kc2Vla1RvKGN1cnJlbnRUaW1lKXt0aGlzLl9hbmltYXRpb25Nb2RlbC5fYWdlbnQuc2Vla0FuaW1hdGlvbnModGhpcy5fYW5pbWF0aW9uSWRzKCksY3VycmVudFRpbWUpO30KcGF1c2VkKCl7cmV0dXJuIHRoaXMuX3BhdXNlZDt9CnRvZ2dsZVBhdXNlKHBhdXNlZCl7aWYocGF1c2VkPT09dGhpcy5fcGF1c2VkKQpyZXR1cm47dGhpcy5fcGF1c2VkPXBhdXNlZDt0aGlzLl9hbmltYXRpb25Nb2RlbC5fYWdlbnQuc2V0UGF1c2VkKHRoaXMuX2FuaW1hdGlvbklkcygpLHBhdXNlZCk7fQpjdXJyZW50VGltZVByb21pc2UoKXtsZXQgbG9uZ2VzdEFuaW09bnVsbDtmb3IoY29uc3QgYW5pbSBvZiB0aGlzLl9hbmltYXRpb25zKXtpZighbG9uZ2VzdEFuaW18fGFuaW0uZW5kVGltZSgpPmxvbmdlc3RBbmltLmVuZFRpbWUoKSkKbG9uZ2VzdEFuaW09YW5pbTt9CnJldHVybiB0aGlzLl9hbmltYXRpb25Nb2RlbC5fYWdlbnQuZ2V0Q3VycmVudFRpbWUobG9uZ2VzdEFuaW0uaWQoKSkudGhlbihjdXJyZW50VGltZT0+Y3VycmVudFRpbWV8fDApO30KX21hdGNoZXMoZ3JvdXApe2Z1bmN0aW9uIGV4dHJhY3RJZChhbmltKXtpZihhbmltLnR5cGUoKT09PUFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5BbmltYXRpb24uVHlwZS5XZWJBbmltYXRpb24pCnJldHVybiBhbmltLnR5cGUoKSthbmltLmlkKCk7ZWxzZQpyZXR1cm4gYW5pbS5fY3NzSWQoKTt9CmlmKHRoaXMuX2FuaW1hdGlvbnMubGVuZ3RoIT09Z3JvdXAuX2FuaW1hdGlvbnMubGVuZ3RoKQpyZXR1cm4gZmFsc2U7Y29uc3QgbGVmdD10aGlzLl9hbmltYXRpb25zLm1hcChleHRyYWN0SWQpLnNvcnQoKTtjb25zdCByaWdodD1ncm91cC5fYW5pbWF0aW9ucy5tYXAoZXh0cmFjdElkKS5zb3J0KCk7Zm9yKGxldCBpPTA7aTxsZWZ0Lmxlbmd0aDtpKyspe2lmKGxlZnRbaV0hPT1yaWdodFtpXSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fQpfdXBkYXRlKGdyb3VwKXt0aGlzLl9hbmltYXRpb25Nb2RlbC5fcmVsZWFzZUFuaW1hdGlvbnModGhpcy5fYW5pbWF0aW9uSWRzKCkpO3RoaXMuX2FuaW1hdGlvbnM9Z3JvdXAuX2FuaW1hdGlvbnM7fQpzY3JlZW5zaG90cygpe2ZvcihsZXQgaT0wO2k8dGhpcy5fc2NyZWVuc2hvdHMubGVuZ3RoOysraSl7Y29uc3QgaW1hZ2U9bmV3IEltYWdlKCk7aW1hZ2Uuc3JjPSdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcrdGhpcy5fc2NyZWVuc2hvdHNbaV07dGhpcy5fc2NyZWVuc2hvdEltYWdlcy5wdXNoKGltYWdlKTt9CnRoaXMuX3NjcmVlbnNob3RzPVtdO3JldHVybiB0aGlzLl9zY3JlZW5zaG90SW1hZ2VzO319O0FuaW1hdGlvbi5BbmltYXRpb25EaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKGFuaW1hdGlvbk1vZGVsKXt0aGlzLl9hbmltYXRpb25Nb2RlbD1hbmltYXRpb25Nb2RlbDt9CmFuaW1hdGlvbkNyZWF0ZWQoaWQpe3RoaXMuX2FuaW1hdGlvbk1vZGVsLmFuaW1hdGlvbkNyZWF0ZWQoaWQpO30KYW5pbWF0aW9uQ2FuY2VsZWQoaWQpe3RoaXMuX2FuaW1hdGlvbk1vZGVsLl9hbmltYXRpb25DYW5jZWxlZChpZCk7fQphbmltYXRpb25TdGFydGVkKHBheWxvYWQpe3RoaXMuX2FuaW1hdGlvbk1vZGVsLmFuaW1hdGlvblN0YXJ0ZWQocGF5bG9hZCk7fX07QW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLlNjcmVlbnNob3RDYXB0dXJlPWNsYXNze2NvbnN0cnVjdG9yKGFuaW1hdGlvbk1vZGVsLHNjcmVlbkNhcHR1cmVNb2RlbCl7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsPXNjcmVlbkNhcHR1cmVNb2RlbDt0aGlzLl9hbmltYXRpb25Nb2RlbD1hbmltYXRpb25Nb2RlbDt0aGlzLl9hbmltYXRpb25Nb2RlbC5hZGRFdmVudExpc3RlbmVyKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5FdmVudHMuTW9kZWxSZXNldCx0aGlzLl9zdG9wU2NyZWVuY2FzdCx0aGlzKTt9CmNhcHR1cmVTY3JlZW5zaG90cyhkdXJhdGlvbixzY3JlZW5zaG90cyl7Y29uc3Qgc2NyZWVuY2FzdER1cmF0aW9uPU1hdGgubWluKGR1cmF0aW9uL3RoaXMuX2FuaW1hdGlvbk1vZGVsLl9wbGF5YmFja1JhdGUsMzAwMCk7Y29uc3QgZW5kVGltZT1zY3JlZW5jYXN0RHVyYXRpb24rd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO3RoaXMuX3JlcXVlc3RzLnB1c2goe2VuZFRpbWU6ZW5kVGltZSxzY3JlZW5zaG90czpzY3JlZW5zaG90c30pO2lmKCF0aGlzLl9lbmRUaW1lfHxlbmRUaW1lPnRoaXMuX2VuZFRpbWUpe2NsZWFyVGltZW91dCh0aGlzLl9zdG9wVGltZXIpO3RoaXMuX3N0b3BUaW1lcj1zZXRUaW1lb3V0KHRoaXMuX3N0b3BTY3JlZW5jYXN0LmJpbmQodGhpcyksc2NyZWVuY2FzdER1cmF0aW9uKTt0aGlzLl9lbmRUaW1lPWVuZFRpbWU7fQppZih0aGlzLl9jYXB0dXJpbmcpCnJldHVybjt0aGlzLl9jYXB0dXJpbmc9dHJ1ZTt0aGlzLl9zY3JlZW5DYXB0dXJlTW9kZWwuc3RhcnRTY3JlZW5jYXN0KCdqcGVnJyw4MCx1bmRlZmluZWQsMzAwLDIsdGhpcy5fc2NyZWVuY2FzdEZyYW1lLmJpbmQodGhpcyksdmlzaWJsZT0+e30pO30KX3NjcmVlbmNhc3RGcmFtZShiYXNlNjREYXRhLG1ldGFkYXRhKXtmdW5jdGlvbiBpc0FuaW1hdGluZyhyZXF1ZXN0KXtyZXR1cm4gcmVxdWVzdC5lbmRUaW1lPj1ub3c7fQppZighdGhpcy5fY2FwdHVyaW5nKQpyZXR1cm47Y29uc3Qgbm93PXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTt0aGlzLl9yZXF1ZXN0cz10aGlzLl9yZXF1ZXN0cy5maWx0ZXIoaXNBbmltYXRpbmcpO2Zvcihjb25zdCByZXF1ZXN0IG9mIHRoaXMuX3JlcXVlc3RzKQpyZXF1ZXN0LnNjcmVlbnNob3RzLnB1c2goYmFzZTY0RGF0YSk7fQpfc3RvcFNjcmVlbmNhc3QoKXtpZighdGhpcy5fY2FwdHVyaW5nKQpyZXR1cm47ZGVsZXRlIHRoaXMuX3N0b3BUaW1lcjtkZWxldGUgdGhpcy5fZW5kVGltZTt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9jYXB0dXJpbmc9ZmFsc2U7dGhpcy5fc2NyZWVuQ2FwdHVyZU1vZGVsLnN0b3BTY3JlZW5jYXN0KCk7fX07QW5pbWF0aW9uLkFuaW1hdGlvbk1vZGVsLlNjcmVlbnNob3RDYXB0dXJlLlJlcXVlc3Q7O0FuaW1hdGlvbi5BbmltYXRpb25Hcm91cFByZXZpZXdVST1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCl7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2FuaW1hdGlvbi1idWZmZXItcHJldmlldycpO3RoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLXBhdXNlZCBmaWxsJyk7dGhpcy5fcmVtb3ZlQnV0dG9uPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLXJlbW92ZS1idXR0b24nKTt0aGlzLl9yZW1vdmVCdXR0b24udGV4dENvbnRlbnQ9J1x1MjcxNSc7dGhpcy5fcmVwbGF5T3ZlcmxheUVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tYnVmZmVyLXByZXZpZXctYW5pbWF0aW9uJyk7dGhpcy5fc3ZnPXRoaXMuZWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnc3ZnJyk7dGhpcy5fc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCcxMDAlJyk7dGhpcy5fc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsJ25vbmUnKTt0aGlzLl9zdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCcxMDAlJyk7dGhpcy5fdmlld0JveEhlaWdodD0zMjt0aGlzLl9zdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywnMCAwIDEwMCAnK3RoaXMuX3ZpZXdCb3hIZWlnaHQpO3RoaXMuX3N2Zy5zZXRBdHRyaWJ1dGUoJ3NoYXBlLXJlbmRlcmluZycsJ2NyaXNwRWRnZXMnKTt0aGlzLl9yZW5kZXIoKTt9Cl9ncm91cER1cmF0aW9uKCl7bGV0IGR1cmF0aW9uPTA7Zm9yKGNvbnN0IGFuaW0gb2YgdGhpcy5fbW9kZWwuYW5pbWF0aW9ucygpKXtjb25zdCBhbmltRHVyYXRpb249YW5pbS5zb3VyY2UoKS5kZWxheSgpK2FuaW0uc291cmNlKCkuZHVyYXRpb24oKTtpZihhbmltRHVyYXRpb24+ZHVyYXRpb24pCmR1cmF0aW9uPWFuaW1EdXJhdGlvbjt9CnJldHVybiBkdXJhdGlvbjt9CnJlbW92ZUJ1dHRvbigpe3JldHVybiB0aGlzLl9yZW1vdmVCdXR0b247fQpyZXBsYXkoKXt0aGlzLl9yZXBsYXlPdmVybGF5RWxlbWVudC5hbmltYXRlKFt7b2Zmc2V0OjAsd2lkdGg6JzAlJyxvcGFjaXR5OjF9LHtvZmZzZXQ6MC45LHdpZHRoOicxMDAlJyxvcGFjaXR5OjF9LHtvZmZzZXQ6MSx3aWR0aDonMTAwJScsb3BhY2l0eTowfV0se2R1cmF0aW9uOjIwMCxlYXNpbmc6J2N1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJ30pO30KX3JlbmRlcigpe3RoaXMuX3N2Zy5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IG1heFRvU2hvdz0xMDtjb25zdCBudW1iZXJPZkFuaW1hdGlvbnM9TWF0aC5taW4odGhpcy5fbW9kZWwuYW5pbWF0aW9ucygpLmxlbmd0aCxtYXhUb1Nob3cpO2NvbnN0IHRpbWVUb1BpeGVsUmF0aW89MTAwL01hdGgubWF4KHRoaXMuX2dyb3VwRHVyYXRpb24oKSw3NTApO2ZvcihsZXQgaT0wO2k8bnVtYmVyT2ZBbmltYXRpb25zO2krKyl7Y29uc3QgZWZmZWN0PXRoaXMuX21vZGVsLmFuaW1hdGlvbnMoKVtpXS5zb3VyY2UoKTtjb25zdCBsaW5lPXRoaXMuX3N2Zy5jcmVhdGVTVkdDaGlsZCgnbGluZScpO2xpbmUuc2V0QXR0cmlidXRlKCd4MScsZWZmZWN0LmRlbGF5KCkqdGltZVRvUGl4ZWxSYXRpbyk7bGluZS5zZXRBdHRyaWJ1dGUoJ3gyJywoZWZmZWN0LmRlbGF5KCkrZWZmZWN0LmR1cmF0aW9uKCkpKnRpbWVUb1BpeGVsUmF0aW8pO2NvbnN0IHk9TWF0aC5mbG9vcih0aGlzLl92aWV3Qm94SGVpZ2h0L01hdGgubWF4KDYsbnVtYmVyT2ZBbmltYXRpb25zKSppKzEpO2xpbmUuc2V0QXR0cmlidXRlKCd5MScseSk7bGluZS5zZXRBdHRyaWJ1dGUoJ3kyJyx5KTtsaW5lLnN0eWxlLnN0cm9rZT1BbmltYXRpb24uQW5pbWF0aW9uVUkuQ29sb3IodGhpcy5fbW9kZWwuYW5pbWF0aW9ucygpW2ldKTt9fX07O0FuaW1hdGlvbi5BbmltYXRpb25TY3JlZW5zaG90UG9wb3Zlcj1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoaW1hZ2VzKXtzdXBlcih0cnVlKTtjb25zb2xlLmFzc2VydChpbWFnZXMubGVuZ3RoKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2FuaW1hdGlvbi9hbmltYXRpb25TY3JlZW5zaG90UG9wb3Zlci5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGlvbi1zY3JlZW5zaG90LXBvcG92ZXInKTt0aGlzLl9mcmFtZXM9aW1hZ2VzO2Zvcihjb25zdCBpbWFnZSBvZiBpbWFnZXMpe3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1hZ2UpO2ltYWdlLnN0eWxlLmRpc3BsYXk9J25vbmUnO30KdGhpcy5fY3VycmVudEZyYW1lPTA7dGhpcy5fZnJhbWVzWzBdLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzt0aGlzLl9wcm9ncmVzc0Jhcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tcHJvZ3Jlc3MnKTt9Cndhc1Nob3duKCl7dGhpcy5fcmFmSWQ9dGhpcy5jb250ZW50RWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fY2hhbmdlRnJhbWUuYmluZCh0aGlzKSk7fQp3aWxsSGlkZSgpe3RoaXMuY29udGVudEVsZW1lbnQud2luZG93KCkuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmSWQpO2RlbGV0ZSB0aGlzLl9lbmREZWxheTt9Cl9jaGFuZ2VGcmFtZSgpe3RoaXMuX3JhZklkPXRoaXMuY29udGVudEVsZW1lbnQud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2NoYW5nZUZyYW1lLmJpbmQodGhpcykpO2lmKHRoaXMuX2VuZERlbGF5KXt0aGlzLl9lbmREZWxheS0tO3JldHVybjt9CnRoaXMuX3Nob3dGcmFtZT0hdGhpcy5fc2hvd0ZyYW1lO2lmKCF0aGlzLl9zaG93RnJhbWUpCnJldHVybjtjb25zdCBudW1GcmFtZXM9dGhpcy5fZnJhbWVzLmxlbmd0aDt0aGlzLl9mcmFtZXNbdGhpcy5fY3VycmVudEZyYW1lJW51bUZyYW1lc10uc3R5bGUuZGlzcGxheT0nbm9uZSc7dGhpcy5fY3VycmVudEZyYW1lKys7dGhpcy5fZnJhbWVzWyh0aGlzLl9jdXJyZW50RnJhbWUpJW51bUZyYW1lc10uc3R5bGUuZGlzcGxheT0nYmxvY2snO2lmKHRoaXMuX2N1cnJlbnRGcmFtZSVudW1GcmFtZXM9PT1udW1GcmFtZXMtMSkKdGhpcy5fZW5kRGVsYXk9NTA7dGhpcy5fcHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGg9KHRoaXMuX2N1cnJlbnRGcmFtZSVudW1GcmFtZXMrMSkvbnVtRnJhbWVzKjEwMCsnJSc7fX07O0FuaW1hdGlvbi5BbmltYXRpb25UaW1lbGluZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2FuaW1hdGlvbi9hbmltYXRpb25UaW1lbGluZS5jc3MnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYW5pbWF0aW9ucy10aW1lbGluZScpO3RoaXMuX2dyaWQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnc3ZnJywnYW5pbWF0aW9uLXRpbWVsaW5lLWdyaWQnKTt0aGlzLl9wbGF5YmFja1JhdGU9MTt0aGlzLl9hbGxQYXVzZWQ9ZmFsc2U7dGhpcy5fY3JlYXRlSGVhZGVyKCk7dGhpcy5fYW5pbWF0aW9uc0NvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tdGltZWxpbmUtcm93cycpO2NvbnN0IHRpbWVsaW5lSGludD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tdGltZWxpbmUtcm93cy1oaW50Jyk7dGltZWxpbmVIaW50LnRleHRDb250ZW50PWxzYFNlbGVjdCBhbiBlZmZlY3QgYWJvdmUgdG8gaW5zcGVjdCBhbmQgbW9kaWZ5LmA7dGhpcy5fZGVmYXVsdER1cmF0aW9uPTEwMDt0aGlzLl9kdXJhdGlvbj10aGlzLl9kZWZhdWx0RHVyYXRpb247dGhpcy5fdGltZWxpbmVDb250cm9sc1dpZHRoPTE1MDt0aGlzLl9ub2Rlc01hcD1uZXcgTWFwKCk7dGhpcy5fdWlBbmltYXRpb25zPVtdO3RoaXMuX2dyb3VwQnVmZmVyPVtdO3RoaXMuX3ByZXZpZXdNYXA9bmV3IE1hcCgpO3RoaXMuX3N5bWJvbD1TeW1ib2woJ2FuaW1hdGlvblRpbWVsaW5lJyk7dGhpcy5fYW5pbWF0aW9uc01hcD1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRE9NTW9kZWwsU0RLLkRPTU1vZGVsLkV2ZW50cy5Ob2RlUmVtb3ZlZCx0aGlzLl9ub2RlUmVtb3ZlZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbCx0aGlzKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLHRoaXMuX25vZGVDaGFuZ2VkLHRoaXMpO30Kd2FzU2hvd24oKXtmb3IoY29uc3QgYW5pbWF0aW9uTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbCkpCnRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKGFuaW1hdGlvbk1vZGVsKTt9CndpbGxIaWRlKCl7Zm9yKGNvbnN0IGFuaW1hdGlvbk1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwpKQp0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVycyhhbmltYXRpb25Nb2RlbCk7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO30KbW9kZWxBZGRlZChhbmltYXRpb25Nb2RlbCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoYW5pbWF0aW9uTW9kZWwpO30KbW9kZWxSZW1vdmVkKGFuaW1hdGlvbk1vZGVsKXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVycyhhbmltYXRpb25Nb2RlbCk7fQpfYWRkRXZlbnRMaXN0ZW5lcnMoYW5pbWF0aW9uTW9kZWwpe2FuaW1hdGlvbk1vZGVsLmVuc3VyZUVuYWJsZWQoKTthbmltYXRpb25Nb2RlbC5hZGRFdmVudExpc3RlbmVyKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5FdmVudHMuQW5pbWF0aW9uR3JvdXBTdGFydGVkLHRoaXMuX2FuaW1hdGlvbkdyb3VwU3RhcnRlZCx0aGlzKTthbmltYXRpb25Nb2RlbC5hZGRFdmVudExpc3RlbmVyKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbC5FdmVudHMuTW9kZWxSZXNldCx0aGlzLl9yZXNldCx0aGlzKTt9Cl9yZW1vdmVFdmVudExpc3RlbmVycyhhbmltYXRpb25Nb2RlbCl7YW5pbWF0aW9uTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuRXZlbnRzLkFuaW1hdGlvbkdyb3VwU3RhcnRlZCx0aGlzLl9hbmltYXRpb25Hcm91cFN0YXJ0ZWQsdGhpcyk7YW5pbWF0aW9uTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihBbmltYXRpb24uQW5pbWF0aW9uTW9kZWwuRXZlbnRzLk1vZGVsUmVzZXQsdGhpcy5fcmVzZXQsdGhpcyk7fQpfbm9kZUNoYW5nZWQoKXtmb3IoY29uc3Qgbm9kZVVJIG9mIHRoaXMuX25vZGVzTWFwLnZhbHVlcygpKQpub2RlVUkuX25vZGVDaGFuZ2VkKCk7fQpfY3JlYXRlU2NydWJiZXIoKXt0aGlzLl90aW1lbGluZVNjcnViYmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2FuaW1hdGlvbi1zY3J1YmJlciBoaWRkZW4nKTt0aGlzLl90aW1lbGluZVNjcnViYmVyTGluZT10aGlzLl90aW1lbGluZVNjcnViYmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tc2NydWJiZXItbGluZScpO3RoaXMuX3RpbWVsaW5lU2NydWJiZXJMaW5lLmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tc2NydWJiZXItaGVhZCcpO3RoaXMuX3RpbWVsaW5lU2NydWJiZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi10aW1lLW92ZXJsYXknKTtyZXR1cm4gdGhpcy5fdGltZWxpbmVTY3J1YmJlcjt9Cl9jcmVhdGVIZWFkZXIoKXtjb25zdCB0b29sYmFyQ29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi10aW1lbGluZS10b29sYmFyLWNvbnRhaW5lcicpO2NvbnN0IHRvcFRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ2FuaW1hdGlvbi10aW1lbGluZS10b29sYmFyJyx0b29sYmFyQ29udGFpbmVyKTtjb25zdCBjbGVhckJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihsc2BDbGVhciBhbGxgLCdsYXJnZWljb24tY2xlYXInKTtjbGVhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3Jlc2V0LmJpbmQodGhpcykpO3RvcFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oY2xlYXJCdXR0b24pO3RvcFRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dGhpcy5fcGF1c2VCdXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUobHNgUGF1c2UgYWxsYCwnbGFyZ2VpY29uLXBhdXNlJywnbGFyZ2VpY29uLXJlc3VtZScpO3RoaXMuX3BhdXNlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fdG9nZ2xlUGF1c2VBbGwuYmluZCh0aGlzKSk7dG9wVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9wYXVzZUJ1dHRvbik7Y29uc3QgcGxheWJhY2tSYXRlQ29udHJvbD10b29sYmFyQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tcGxheWJhY2stcmF0ZS1jb250cm9sJyk7dGhpcy5fcGxheWJhY2tSYXRlQnV0dG9ucz1bXTtmb3IoY29uc3QgcGxheWJhY2tSYXRlIG9mIEFuaW1hdGlvbi5BbmltYXRpb25UaW1lbGluZS5HbG9iYWxQbGF5YmFja1JhdGVzKXtjb25zdCBidXR0b249cGxheWJhY2tSYXRlQ29udHJvbC5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLXBsYXliYWNrLXJhdGUtYnV0dG9uJyk7YnV0dG9uLnRleHRDb250ZW50PXBsYXliYWNrUmF0ZT9sc2Ake3BsYXliYWNrUmF0ZSAqIDEwMH0lYDpsc2BQYXVzZWA7YnV0dG9uLnBsYXliYWNrUmF0ZT1wbGF5YmFja1JhdGU7YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9zZXRQbGF5YmFja1JhdGUuYmluZCh0aGlzLHBsYXliYWNrUmF0ZSkpO2J1dHRvbi50aXRsZT1sc2BTZXQgc3BlZWQgdG8gJHtidXR0b24udGV4dENvbnRlbnR9YDt0aGlzLl9wbGF5YmFja1JhdGVCdXR0b25zLnB1c2goYnV0dG9uKTt9CnRoaXMuX3VwZGF0ZVBsYXliYWNrQ29udHJvbHMoKTt0aGlzLl9wcmV2aWV3Q29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi10aW1lbGluZS1idWZmZXInKTt0aGlzLl9wb3BvdmVySGVscGVyPW5ldyBVSS5Qb3BvdmVySGVscGVyKHRoaXMuX3ByZXZpZXdDb250YWluZXIsdGhpcy5fZ2V0UG9wb3ZlclJlcXVlc3QuYmluZCh0aGlzKSk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXREaXNhYmxlT25DbGljayh0cnVlKTt0aGlzLl9wb3BvdmVySGVscGVyLnNldFRpbWVvdXQoMCk7Y29uc3QgZW1wdHlCdWZmZXJIaW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi10aW1lbGluZS1idWZmZXItaGludCcpO2VtcHR5QnVmZmVySGludC50ZXh0Q29udGVudD1sc2BMaXN0ZW5pbmcgZm9yIGFuaW1hdGlvbnMuLi5gO2NvbnN0IGNvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tdGltZWxpbmUtaGVhZGVyJyk7Y29uc3QgY29udHJvbHM9Y29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tY29udHJvbHMnKTt0aGlzLl9jdXJyZW50VGltZT1jb250cm9scy5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLXRpbWVsaW5lLWN1cnJlbnQtdGltZSBtb25vc3BhY2UnKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCdhbmltYXRpb24tY29udHJvbHMtdG9vbGJhcicsY29udHJvbHMpO3RoaXMuX2NvbnRyb2xCdXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUobHNgUmVwbGF5IHRpbWVsaW5lYCwnbGFyZ2VpY29uLXJlcGxheS1hbmltYXRpb24nKTt0aGlzLl9jb250cm9sU3RhdGU9QW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLl9Db250cm9sU3RhdGUuUmVwbGF5O3RoaXMuX2NvbnRyb2xCdXR0b24uc2V0VG9nZ2xlZCh0cnVlKTt0aGlzLl9jb250cm9sQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fY29udHJvbEJ1dHRvblRvZ2dsZS5iaW5kKHRoaXMpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2NvbnRyb2xCdXR0b24pO2NvbnN0IGdyaWRIZWFkZXI9Y29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdhbmltYXRpb24tZ3JpZC1oZWFkZXInKTtVSS5pbnN0YWxsRHJhZ0hhbmRsZShncmlkSGVhZGVyLHRoaXMuX3JlcG9zaXRpb25TY3J1YmJlci5iaW5kKHRoaXMpLHRoaXMuX3NjcnViYmVyRHJhZ01vdmUuYmluZCh0aGlzKSx0aGlzLl9zY3J1YmJlckRyYWdFbmQuYmluZCh0aGlzKSwndGV4dCcpO2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVTY3J1YmJlcigpKTtVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0aGlzLl90aW1lbGluZVNjcnViYmVyTGluZSx0aGlzLl9zY3J1YmJlckRyYWdTdGFydC5iaW5kKHRoaXMpLHRoaXMuX3NjcnViYmVyRHJhZ01vdmUuYmluZCh0aGlzKSx0aGlzLl9zY3J1YmJlckRyYWdFbmQuYmluZCh0aGlzKSwnY29sLXJlc2l6ZScpO3RoaXMuX2N1cnJlbnRUaW1lLnRleHRDb250ZW50PScnO3JldHVybiBjb250YWluZXI7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2NvbnN0IGVsZW1lbnQ9ZXZlbnQudGFyZ2V0O2lmKCFlbGVtZW50LmlzRGVzY2VuZGFudCh0aGlzLl9wcmV2aWV3Q29udGFpbmVyKSkKcmV0dXJuIG51bGw7cmV0dXJue2JveDpldmVudC50YXJnZXQuYm94SW5XaW5kb3coKSxzaG93OnBvcG92ZXI9PntsZXQgYW5pbUdyb3VwO2Zvcihjb25zdCBncm91cCBvZiB0aGlzLl9wcmV2aWV3TWFwLmtleXNBcnJheSgpKXtpZih0aGlzLl9wcmV2aWV3TWFwLmdldChncm91cCkuZWxlbWVudD09PWVsZW1lbnQucGFyZW50RWxlbWVudCkKYW5pbUdyb3VwPWdyb3VwO30KY29uc29sZS5hc3NlcnQoYW5pbUdyb3VwKTtjb25zdCBzY3JlZW5zaG90cz1hbmltR3JvdXAuc2NyZWVuc2hvdHMoKTtpZighc2NyZWVuc2hvdHMubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtsZXQgZnVsZmlsbDtjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKHg9PmZ1bGZpbGw9eCk7aWYoIXNjcmVlbnNob3RzWzBdLmNvbXBsZXRlKQpzY3JlZW5zaG90c1swXS5vbmxvYWQ9b25GaXJzdFNjcmVlbnNob3RMb2FkZWQuYmluZChudWxsLHNjcmVlbnNob3RzKTtlbHNlCm9uRmlyc3RTY3JlZW5zaG90TG9hZGVkKHNjcmVlbnNob3RzKTtyZXR1cm4gcHJvbWlzZTtmdW5jdGlvbiBvbkZpcnN0U2NyZWVuc2hvdExvYWRlZChzY3JlZW5zaG90cyl7bmV3IEFuaW1hdGlvbi5BbmltYXRpb25TY3JlZW5zaG90UG9wb3ZlcihzY3JlZW5zaG90cykuc2hvdyhwb3BvdmVyLmNvbnRlbnRFbGVtZW50KTtmdWxmaWxsKHRydWUpO319fTt9Cl90b2dnbGVQYXVzZUFsbCgpe3RoaXMuX2FsbFBhdXNlZD0hdGhpcy5fYWxsUGF1c2VkO3RoaXMuX3BhdXNlQnV0dG9uLnNldFRvZ2dsZWQodGhpcy5fYWxsUGF1c2VkKTt0aGlzLl9zZXRQbGF5YmFja1JhdGUodGhpcy5fcGxheWJhY2tSYXRlKTt0aGlzLl9wYXVzZUJ1dHRvbi5zZXRUaXRsZSh0aGlzLl9hbGxQYXVzZWQ/bHNgUmVzdW1lIGFsbGA6bHNgUGF1c2UgYWxsYCk7fQpfc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSl7dGhpcy5fcGxheWJhY2tSYXRlPXBsYXliYWNrUmF0ZTtmb3IoY29uc3QgYW5pbWF0aW9uTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKEFuaW1hdGlvbi5BbmltYXRpb25Nb2RlbCkpCmFuaW1hdGlvbk1vZGVsLnNldFBsYXliYWNrUmF0ZSh0aGlzLl9hbGxQYXVzZWQ/MDp0aGlzLl9wbGF5YmFja1JhdGUpO0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQW5pbWF0aW9uc1BsYXliYWNrUmF0ZUNoYW5nZWQpO2lmKHRoaXMuX3NjcnViYmVyUGxheWVyKQp0aGlzLl9zY3J1YmJlclBsYXllci5wbGF5YmFja1JhdGU9dGhpcy5fZWZmZWN0aXZlUGxheWJhY2tSYXRlKCk7dGhpcy5fdXBkYXRlUGxheWJhY2tDb250cm9scygpO30KX3VwZGF0ZVBsYXliYWNrQ29udHJvbHMoKXtmb3IoY29uc3QgYnV0dG9uIG9mIHRoaXMuX3BsYXliYWNrUmF0ZUJ1dHRvbnMpe2NvbnN0IHNlbGVjdGVkPXRoaXMuX3BsYXliYWNrUmF0ZT09PWJ1dHRvbi5wbGF5YmFja1JhdGU7YnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ3NlbGVjdGVkJyxzZWxlY3RlZCk7fX0KX2NvbnRyb2xCdXR0b25Ub2dnbGUoKXtpZih0aGlzLl9jb250cm9sU3RhdGU9PT1BbmltYXRpb24uQW5pbWF0aW9uVGltZWxpbmUuX0NvbnRyb2xTdGF0ZS5QbGF5KQp0aGlzLl90b2dnbGVQYXVzZShmYWxzZSk7ZWxzZSBpZih0aGlzLl9jb250cm9sU3RhdGU9PT1BbmltYXRpb24uQW5pbWF0aW9uVGltZWxpbmUuX0NvbnRyb2xTdGF0ZS5SZXBsYXkpCnRoaXMuX3JlcGxheSgpO2Vsc2UKdGhpcy5fdG9nZ2xlUGF1c2UodHJ1ZSk7fQpfdXBkYXRlQ29udHJvbEJ1dHRvbigpe3RoaXMuX2NvbnRyb2xCdXR0b24uc2V0RW5hYmxlZCghIXRoaXMuX3NlbGVjdGVkR3JvdXApO2lmKHRoaXMuX3NlbGVjdGVkR3JvdXAmJnRoaXMuX3NlbGVjdGVkR3JvdXAucGF1c2VkKCkpe3RoaXMuX2NvbnRyb2xTdGF0ZT1BbmltYXRpb24uQW5pbWF0aW9uVGltZWxpbmUuX0NvbnRyb2xTdGF0ZS5QbGF5O3RoaXMuX2NvbnRyb2xCdXR0b24uc2V0VG9nZ2xlZCh0cnVlKTt0aGlzLl9jb250cm9sQnV0dG9uLnNldFRpdGxlKGxzYFBsYXkgdGltZWxpbmVgKTt0aGlzLl9jb250cm9sQnV0dG9uLnNldEdseXBoKCdsYXJnZWljb24tcGxheS1hbmltYXRpb24nKTt9ZWxzZSBpZighdGhpcy5fc2NydWJiZXJQbGF5ZXJ8fHRoaXMuX3NjcnViYmVyUGxheWVyLmN1cnJlbnRUaW1lPj10aGlzLmR1cmF0aW9uKCkpe3RoaXMuX2NvbnRyb2xTdGF0ZT1BbmltYXRpb24uQW5pbWF0aW9uVGltZWxpbmUuX0NvbnRyb2xTdGF0ZS5SZXBsYXk7dGhpcy5fY29udHJvbEJ1dHRvbi5zZXRUb2dnbGVkKHRydWUpO3RoaXMuX2NvbnRyb2xCdXR0b24uc2V0VGl0bGUobHNgUmVwbGF5IHRpbWVsaW5lYCk7dGhpcy5fY29udHJvbEJ1dHRvbi5zZXRHbHlwaCgnbGFyZ2VpY29uLXJlcGxheS1hbmltYXRpb24nKTt9ZWxzZXt0aGlzLl9jb250cm9sU3RhdGU9QW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLl9Db250cm9sU3RhdGUuUGF1c2U7dGhpcy5fY29udHJvbEJ1dHRvbi5zZXRUb2dnbGVkKGZhbHNlKTt0aGlzLl9jb250cm9sQnV0dG9uLnNldFRpdGxlKGxzYFBhdXNlIHRpbWVsaW5lYCk7dGhpcy5fY29udHJvbEJ1dHRvbi5zZXRHbHlwaCgnbGFyZ2VpY29uLXBhdXNlLWFuaW1hdGlvbicpO319Cl9lZmZlY3RpdmVQbGF5YmFja1JhdGUoKXtyZXR1cm4odGhpcy5fYWxsUGF1c2VkfHwodGhpcy5fc2VsZWN0ZWRHcm91cCYmdGhpcy5fc2VsZWN0ZWRHcm91cC5wYXVzZWQoKSkpPzA6dGhpcy5fcGxheWJhY2tSYXRlO30KX3RvZ2dsZVBhdXNlKHBhdXNlKXt0aGlzLl9zZWxlY3RlZEdyb3VwLnRvZ2dsZVBhdXNlKHBhdXNlKTtpZih0aGlzLl9zY3J1YmJlclBsYXllcikKdGhpcy5fc2NydWJiZXJQbGF5ZXIucGxheWJhY2tSYXRlPXRoaXMuX2VmZmVjdGl2ZVBsYXliYWNrUmF0ZSgpO3RoaXMuX3ByZXZpZXdNYXAuZ2V0KHRoaXMuX3NlbGVjdGVkR3JvdXApLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgncGF1c2VkJyxwYXVzZSk7dGhpcy5fdXBkYXRlQ29udHJvbEJ1dHRvbigpO30KX3JlcGxheSgpe2lmKCF0aGlzLl9zZWxlY3RlZEdyb3VwKQpyZXR1cm47dGhpcy5fc2VsZWN0ZWRHcm91cC5zZWVrVG8oMCk7dGhpcy5fYW5pbWF0ZVRpbWUoMCk7dGhpcy5fdXBkYXRlQ29udHJvbEJ1dHRvbigpO30KZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb247fQpzZXREdXJhdGlvbihkdXJhdGlvbil7dGhpcy5fZHVyYXRpb249ZHVyYXRpb247dGhpcy5zY2hlZHVsZVJlZHJhdygpO30KX2NsZWFyVGltZWxpbmUoKXt0aGlzLl91aUFuaW1hdGlvbnM9W107dGhpcy5fbm9kZXNNYXAuY2xlYXIoKTt0aGlzLl9hbmltYXRpb25zTWFwLmNsZWFyKCk7dGhpcy5fYW5pbWF0aW9uc0NvbnRhaW5lci5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2R1cmF0aW9uPXRoaXMuX2RlZmF1bHREdXJhdGlvbjt0aGlzLl90aW1lbGluZVNjcnViYmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO2RlbGV0ZSB0aGlzLl9zZWxlY3RlZEdyb3VwO2lmKHRoaXMuX3NjcnViYmVyUGxheWVyKQp0aGlzLl9zY3J1YmJlclBsYXllci5jYW5jZWwoKTtkZWxldGUgdGhpcy5fc2NydWJiZXJQbGF5ZXI7dGhpcy5fY3VycmVudFRpbWUudGV4dENvbnRlbnQ9Jyc7dGhpcy5fdXBkYXRlQ29udHJvbEJ1dHRvbigpO30KX3Jlc2V0KCl7dGhpcy5fY2xlYXJUaW1lbGluZSgpO2lmKHRoaXMuX2FsbFBhdXNlZCkKdGhpcy5fdG9nZ2xlUGF1c2VBbGwoKTtlbHNlCnRoaXMuX3NldFBsYXliYWNrUmF0ZSh0aGlzLl9wbGF5YmFja1JhdGUpO2Zvcihjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cEJ1ZmZlcikKZ3JvdXAucmVsZWFzZSgpO3RoaXMuX2dyb3VwQnVmZmVyPVtdO3RoaXMuX3ByZXZpZXdNYXAuY2xlYXIoKTt0aGlzLl9wcmV2aWV3Q29udGFpbmVyLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO3RoaXMuX3JlbmRlckdyaWQoKTt9Cl9hbmltYXRpb25Hcm91cFN0YXJ0ZWQoZXZlbnQpe3RoaXMuX2FkZEFuaW1hdGlvbkdyb3VwKChldmVudC5kYXRhKSk7fQpfYWRkQW5pbWF0aW9uR3JvdXAoZ3JvdXApe2Z1bmN0aW9uIHN0YXJ0VGltZUNvbXBhcmF0b3IobGVmdCxyaWdodCl7cmV0dXJuIGxlZnQuc3RhcnRUaW1lKCk+cmlnaHQuc3RhcnRUaW1lKCk7fQppZih0aGlzLl9wcmV2aWV3TWFwLmdldChncm91cCkpe2lmKHRoaXMuX3NlbGVjdGVkR3JvdXA9PT1ncm91cCkKdGhpcy5fc3luY1NjcnViYmVyKCk7ZWxzZQp0aGlzLl9wcmV2aWV3TWFwLmdldChncm91cCkucmVwbGF5KCk7cmV0dXJuO30KdGhpcy5fZ3JvdXBCdWZmZXIuc29ydChzdGFydFRpbWVDb21wYXJhdG9yKTtjb25zdCBncm91cHNUb0Rpc2NhcmQ9W107Y29uc3QgYnVmZmVyU2l6ZT10aGlzLndpZHRoKCkvNTA7d2hpbGUodGhpcy5fZ3JvdXBCdWZmZXIubGVuZ3RoPmJ1ZmZlclNpemUpe2NvbnN0IHRvRGlzY2FyZD10aGlzLl9ncm91cEJ1ZmZlci5zcGxpY2UodGhpcy5fZ3JvdXBCdWZmZXJbMF09PT10aGlzLl9zZWxlY3RlZEdyb3VwPzE6MCwxKTtncm91cHNUb0Rpc2NhcmQucHVzaCh0b0Rpc2NhcmRbMF0pO30KZm9yKGNvbnN0IGcgb2YgZ3JvdXBzVG9EaXNjYXJkKXt0aGlzLl9wcmV2aWV3TWFwLmdldChnKS5lbGVtZW50LnJlbW92ZSgpO3RoaXMuX3ByZXZpZXdNYXAuZGVsZXRlKGcpO2cucmVsZWFzZSgpO30KY29uc3QgcHJldmlldz1uZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkdyb3VwUHJldmlld1VJKGdyb3VwKTt0aGlzLl9ncm91cEJ1ZmZlci5wdXNoKGdyb3VwKTt0aGlzLl9wcmV2aWV3TWFwLnNldChncm91cCxwcmV2aWV3KTt0aGlzLl9wcmV2aWV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHByZXZpZXcuZWxlbWVudCk7cHJldmlldy5yZW1vdmVCdXR0b24oKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fcmVtb3ZlQW5pbWF0aW9uR3JvdXAuYmluZCh0aGlzLGdyb3VwKSk7cHJldmlldy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9zZWxlY3RBbmltYXRpb25Hcm91cC5iaW5kKHRoaXMsZ3JvdXApKTt9Cl9yZW1vdmVBbmltYXRpb25Hcm91cChncm91cCxldmVudCl7dGhpcy5fZ3JvdXBCdWZmZXIucmVtb3ZlKGdyb3VwKTt0aGlzLl9wcmV2aWV3TWFwLmdldChncm91cCkuZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9wcmV2aWV3TWFwLmRlbGV0ZShncm91cCk7Z3JvdXAucmVsZWFzZSgpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYodGhpcy5fc2VsZWN0ZWRHcm91cD09PWdyb3VwKXt0aGlzLl9jbGVhclRpbWVsaW5lKCk7dGhpcy5fcmVuZGVyR3JpZCgpO319Cl9zZWxlY3RBbmltYXRpb25Hcm91cChncm91cCl7ZnVuY3Rpb24gYXBwbHlTZWxlY3Rpb25DbGFzcyh1aSxncm91cCl7dWkuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdzZWxlY3RlZCcsdGhpcy5fc2VsZWN0ZWRHcm91cD09PWdyb3VwKTt9CmlmKHRoaXMuX3NlbGVjdGVkR3JvdXA9PT1ncm91cCl7dGhpcy5fdG9nZ2xlUGF1c2UoZmFsc2UpO3RoaXMuX3JlcGxheSgpO3JldHVybjt9CnRoaXMuX2NsZWFyVGltZWxpbmUoKTt0aGlzLl9zZWxlY3RlZEdyb3VwPWdyb3VwO3RoaXMuX3ByZXZpZXdNYXAuZm9yRWFjaChhcHBseVNlbGVjdGlvbkNsYXNzLHRoaXMpO3RoaXMuc2V0RHVyYXRpb24oTWF0aC5tYXgoNTAwLGdyb3VwLmZpbml0ZUR1cmF0aW9uKCkrMTAwKSk7Zm9yKGNvbnN0IGFuaW0gb2YgZ3JvdXAuYW5pbWF0aW9ucygpKQp0aGlzLl9hZGRBbmltYXRpb24oYW5pbSk7dGhpcy5zY2hlZHVsZVJlZHJhdygpO3RoaXMuX3RpbWVsaW5lU2NydWJiZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5fdG9nZ2xlUGF1c2UoZmFsc2UpO3RoaXMuX3JlcGxheSgpO30KX2FkZEFuaW1hdGlvbihhbmltYXRpb24pe2Z1bmN0aW9uIG5vZGVSZXNvbHZlZChub2RlKXtub2RlVUkubm9kZVJlc29sdmVkKG5vZGUpO3VpQW5pbWF0aW9uLnNldE5vZGUobm9kZSk7aWYobm9kZSkKbm9kZVt0aGlzLl9zeW1ib2xdPW5vZGVVSTt9CmxldCBub2RlVUk9dGhpcy5fbm9kZXNNYXAuZ2V0KGFuaW1hdGlvbi5zb3VyY2UoKS5iYWNrZW5kTm9kZUlkKCkpO2lmKCFub2RlVUkpe25vZGVVST1uZXcgQW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLk5vZGVVSShhbmltYXRpb24uc291cmNlKCkpO3RoaXMuX2FuaW1hdGlvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZVVJLmVsZW1lbnQpO3RoaXMuX25vZGVzTWFwLnNldChhbmltYXRpb24uc291cmNlKCkuYmFja2VuZE5vZGVJZCgpLG5vZGVVSSk7fQpjb25zdCBub2RlUm93PW5vZGVVSS5jcmVhdGVOZXdSb3coKTtjb25zdCB1aUFuaW1hdGlvbj1uZXcgQW5pbWF0aW9uLkFuaW1hdGlvblVJKGFuaW1hdGlvbix0aGlzLG5vZGVSb3cpO2FuaW1hdGlvbi5zb3VyY2UoKS5kZWZlcnJlZE5vZGUoKS5yZXNvbHZlKG5vZGVSZXNvbHZlZC5iaW5kKHRoaXMpKTt0aGlzLl91aUFuaW1hdGlvbnMucHVzaCh1aUFuaW1hdGlvbik7dGhpcy5fYW5pbWF0aW9uc01hcC5zZXQoYW5pbWF0aW9uLmlkKCksYW5pbWF0aW9uKTt9Cl9ub2RlUmVtb3ZlZChldmVudCl7Y29uc3Qgbm9kZT1ldmVudC5kYXRhLm5vZGU7aWYobm9kZVt0aGlzLl9zeW1ib2xdKQpub2RlW3RoaXMuX3N5bWJvbF0ubm9kZVJlbW92ZWQoKTt9Cl9yZW5kZXJHcmlkKCl7Y29uc3QgZ3JpZFNpemU9MjUwO3RoaXMuX2dyaWQuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy53aWR0aCgpKzEwKTt0aGlzLl9ncmlkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLl9jYWNoZWRUaW1lbGluZUhlaWdodCszMCk7dGhpcy5fZ3JpZC5zZXRBdHRyaWJ1dGUoJ3NoYXBlLXJlbmRlcmluZycsJ2NyaXNwRWRnZXMnKTt0aGlzLl9ncmlkLnJlbW92ZUNoaWxkcmVuKCk7bGV0IGxhc3REcmF3PXVuZGVmaW5lZDtmb3IobGV0IHRpbWU9MDt0aW1lPHRoaXMuZHVyYXRpb24oKTt0aW1lKz1ncmlkU2l6ZSl7Y29uc3QgbGluZT10aGlzLl9ncmlkLmNyZWF0ZVNWR0NoaWxkKCdyZWN0JywnYW5pbWF0aW9uLXRpbWVsaW5lLWdyaWQtbGluZScpO2xpbmUuc2V0QXR0cmlidXRlKCd4Jyx0aW1lKnRoaXMucGl4ZWxNc1JhdGlvKCkrMTApO2xpbmUuc2V0QXR0cmlidXRlKCd5JywyMyk7bGluZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsJzEwMCUnKTtsaW5lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLDEpO30KZm9yKGxldCB0aW1lPTA7dGltZTx0aGlzLmR1cmF0aW9uKCk7dGltZSs9Z3JpZFNpemUpe2NvbnN0IGdyaWRXaWR0aD10aW1lKnRoaXMucGl4ZWxNc1JhdGlvKCk7aWYobGFzdERyYXc9PT11bmRlZmluZWR8fGdyaWRXaWR0aC1sYXN0RHJhdz41MCl7bGFzdERyYXc9Z3JpZFdpZHRoO2NvbnN0IGxhYmVsPXRoaXMuX2dyaWQuY3JlYXRlU1ZHQ2hpbGQoJ3RleHQnLCdhbmltYXRpb24tdGltZWxpbmUtZ3JpZC1sYWJlbCcpO2xhYmVsLnRleHRDb250ZW50PU51bWJlci5taWxsaXNUb1N0cmluZyh0aW1lKTtsYWJlbC5zZXRBdHRyaWJ1dGUoJ3gnLGdyaWRXaWR0aCsxMCk7bGFiZWwuc2V0QXR0cmlidXRlKCd5JywxNik7fX19CnNjaGVkdWxlUmVkcmF3KCl7dGhpcy5fcmVuZGVyUXVldWU9W107Zm9yKGNvbnN0IHVpIG9mIHRoaXMuX3VpQW5pbWF0aW9ucykKdGhpcy5fcmVuZGVyUXVldWUucHVzaCh1aSk7aWYodGhpcy5fcmVkcmF3aW5nKQpyZXR1cm47dGhpcy5fcmVkcmF3aW5nPXRydWU7dGhpcy5fcmVuZGVyR3JpZCgpO3RoaXMuX2FuaW1hdGlvbnNDb250YWluZXIud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlbmRlci5iaW5kKHRoaXMpKTt9Cl9yZW5kZXIodGltZXN0YW1wKXt3aGlsZSh0aGlzLl9yZW5kZXJRdWV1ZS5sZW5ndGgmJighdGltZXN0YW1wfHx3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktdGltZXN0YW1wPDUwKSkKdGhpcy5fcmVuZGVyUXVldWUuc2hpZnQoKS5yZWRyYXcoKTtpZih0aGlzLl9yZW5kZXJRdWV1ZS5sZW5ndGgpCnRoaXMuX2FuaW1hdGlvbnNDb250YWluZXIud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlbmRlci5iaW5kKHRoaXMpKTtlbHNlCmRlbGV0ZSB0aGlzLl9yZWRyYXdpbmc7fQpvblJlc2l6ZSgpe3RoaXMuX2NhY2hlZFRpbWVsaW5lV2lkdGg9TWF0aC5tYXgoMCx0aGlzLl9hbmltYXRpb25zQ29udGFpbmVyLm9mZnNldFdpZHRoLXRoaXMuX3RpbWVsaW5lQ29udHJvbHNXaWR0aCl8fDA7dGhpcy5fY2FjaGVkVGltZWxpbmVIZWlnaHQ9dGhpcy5fYW5pbWF0aW9uc0NvbnRhaW5lci5vZmZzZXRIZWlnaHQ7dGhpcy5zY2hlZHVsZVJlZHJhdygpO2lmKHRoaXMuX3NjcnViYmVyUGxheWVyKQp0aGlzLl9zeW5jU2NydWJiZXIoKTtkZWxldGUgdGhpcy5fZ3JpZE9mZnNldExlZnQ7fQp3aWR0aCgpe3JldHVybiB0aGlzLl9jYWNoZWRUaW1lbGluZVdpZHRofHwwO30KX3Jlc2l6ZVdpbmRvdyhhbmltYXRpb24pe2xldCByZXNpemVkPWZhbHNlO2NvbnN0IGR1cmF0aW9uPWFuaW1hdGlvbi5zb3VyY2UoKS5kdXJhdGlvbigpKk1hdGgubWluKDIsYW5pbWF0aW9uLnNvdXJjZSgpLml0ZXJhdGlvbnMoKSk7Y29uc3QgcmVxdWlyZWREdXJhdGlvbj1hbmltYXRpb24uc291cmNlKCkuZGVsYXkoKStkdXJhdGlvbithbmltYXRpb24uc291cmNlKCkuZW5kRGVsYXkoKTtpZihyZXF1aXJlZER1cmF0aW9uPnRoaXMuX2R1cmF0aW9uKXtyZXNpemVkPXRydWU7dGhpcy5fZHVyYXRpb249cmVxdWlyZWREdXJhdGlvbisyMDA7fQpyZXR1cm4gcmVzaXplZDt9Cl9zeW5jU2NydWJiZXIoKXtpZighdGhpcy5fc2VsZWN0ZWRHcm91cCkKcmV0dXJuO3RoaXMuX3NlbGVjdGVkR3JvdXAuY3VycmVudFRpbWVQcm9taXNlKCkudGhlbih0aGlzLl9hbmltYXRlVGltZS5iaW5kKHRoaXMpKS50aGVuKHRoaXMuX3VwZGF0ZUNvbnRyb2xCdXR0b24uYmluZCh0aGlzKSk7fQpfYW5pbWF0ZVRpbWUoY3VycmVudFRpbWUpe2lmKHRoaXMuX3NjcnViYmVyUGxheWVyKQp0aGlzLl9zY3J1YmJlclBsYXllci5jYW5jZWwoKTt0aGlzLl9zY3J1YmJlclBsYXllcj10aGlzLl90aW1lbGluZVNjcnViYmVyLmFuaW1hdGUoW3t0cmFuc2Zvcm06J3RyYW5zbGF0ZVgoMHB4KSd9LHt0cmFuc2Zvcm06J3RyYW5zbGF0ZVgoJyt0aGlzLndpZHRoKCkrJ3B4KSd9XSx7ZHVyYXRpb246dGhpcy5kdXJhdGlvbigpLGZpbGw6J2ZvcndhcmRzJ30pO3RoaXMuX3NjcnViYmVyUGxheWVyLnBsYXliYWNrUmF0ZT10aGlzLl9lZmZlY3RpdmVQbGF5YmFja1JhdGUoKTt0aGlzLl9zY3J1YmJlclBsYXllci5vbmZpbmlzaD10aGlzLl91cGRhdGVDb250cm9sQnV0dG9uLmJpbmQodGhpcyk7dGhpcy5fc2NydWJiZXJQbGF5ZXIuY3VycmVudFRpbWU9Y3VycmVudFRpbWU7dGhpcy5lbGVtZW50LndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVTY3J1YmJlci5iaW5kKHRoaXMpKTt9CnBpeGVsTXNSYXRpbygpe3JldHVybiB0aGlzLndpZHRoKCkvdGhpcy5kdXJhdGlvbigpfHwwO30KX3VwZGF0ZVNjcnViYmVyKHRpbWVzdGFtcCl7aWYoIXRoaXMuX3NjcnViYmVyUGxheWVyKQpyZXR1cm47dGhpcy5fY3VycmVudFRpbWUudGV4dENvbnRlbnQ9TnVtYmVyLm1pbGxpc1RvU3RyaW5nKHRoaXMuX3NjcnViYmVyUGxheWVyLmN1cnJlbnRUaW1lKTtpZih0aGlzLl9zY3J1YmJlclBsYXllci5wbGF5U3RhdGU9PT0ncGVuZGluZyd8fHRoaXMuX3NjcnViYmVyUGxheWVyLnBsYXlTdGF0ZT09PSdydW5uaW5nJykKdGhpcy5lbGVtZW50LndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVTY3J1YmJlci5iaW5kKHRoaXMpKTtlbHNlIGlmKHRoaXMuX3NjcnViYmVyUGxheWVyLnBsYXlTdGF0ZT09PSdmaW5pc2hlZCcpCnRoaXMuX2N1cnJlbnRUaW1lLnRleHRDb250ZW50PScnO30KX3JlcG9zaXRpb25TY3J1YmJlcihldmVudCl7aWYoIXRoaXMuX3NlbGVjdGVkR3JvdXApCnJldHVybiBmYWxzZTtpZighdGhpcy5fZ3JpZE9mZnNldExlZnQpCnRoaXMuX2dyaWRPZmZzZXRMZWZ0PXRoaXMuX2dyaWQudG90YWxPZmZzZXRMZWZ0KCkrMTA7Y29uc3Qgc2Vla1RpbWU9TWF0aC5tYXgoMCxldmVudC54LXRoaXMuX2dyaWRPZmZzZXRMZWZ0KS90aGlzLnBpeGVsTXNSYXRpbygpO3RoaXMuX3NlbGVjdGVkR3JvdXAuc2Vla1RvKHNlZWtUaW1lKTt0aGlzLl90b2dnbGVQYXVzZSh0cnVlKTt0aGlzLl9hbmltYXRlVGltZShzZWVrVGltZSk7dGhpcy5fb3JpZ2luYWxTY3J1YmJlclRpbWU9c2Vla1RpbWU7dGhpcy5fb3JpZ2luYWxNb3VzZVBvc2l0aW9uPWV2ZW50Lng7cmV0dXJuIHRydWU7fQpfc2NydWJiZXJEcmFnU3RhcnQoZXZlbnQpe2lmKCF0aGlzLl9zY3J1YmJlclBsYXllcnx8IXRoaXMuX3NlbGVjdGVkR3JvdXApCnJldHVybiBmYWxzZTt0aGlzLl9vcmlnaW5hbFNjcnViYmVyVGltZT10aGlzLl9zY3J1YmJlclBsYXllci5jdXJyZW50VGltZTt0aGlzLl90aW1lbGluZVNjcnViYmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2FuaW1hdGlvbi10aW1lbGluZS1lbmQnKTt0aGlzLl9zY3J1YmJlclBsYXllci5wYXVzZSgpO3RoaXMuX29yaWdpbmFsTW91c2VQb3NpdGlvbj1ldmVudC54O3RoaXMuX3RvZ2dsZVBhdXNlKHRydWUpO3JldHVybiB0cnVlO30KX3NjcnViYmVyRHJhZ01vdmUoZXZlbnQpe2NvbnN0IGRlbHRhPWV2ZW50LngtdGhpcy5fb3JpZ2luYWxNb3VzZVBvc2l0aW9uO2NvbnN0IGN1cnJlbnRUaW1lPU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fb3JpZ2luYWxTY3J1YmJlclRpbWUrZGVsdGEvdGhpcy5waXhlbE1zUmF0aW8oKSx0aGlzLmR1cmF0aW9uKCkpKTt0aGlzLl9zY3J1YmJlclBsYXllci5jdXJyZW50VGltZT1jdXJyZW50VGltZTt0aGlzLl9jdXJyZW50VGltZS50ZXh0Q29udGVudD1OdW1iZXIubWlsbGlzVG9TdHJpbmcoTWF0aC5yb3VuZChjdXJyZW50VGltZSkpO3RoaXMuX3NlbGVjdGVkR3JvdXAuc2Vla1RvKGN1cnJlbnRUaW1lKTt9Cl9zY3J1YmJlckRyYWdFbmQoZXZlbnQpe2NvbnN0IGN1cnJlbnRUaW1lPU1hdGgubWF4KDAsdGhpcy5fc2NydWJiZXJQbGF5ZXIuY3VycmVudFRpbWUpO3RoaXMuX3NjcnViYmVyUGxheWVyLnBsYXkoKTt0aGlzLl9zY3J1YmJlclBsYXllci5jdXJyZW50VGltZT1jdXJyZW50VGltZTt0aGlzLl9jdXJyZW50VGltZS53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fdXBkYXRlU2NydWJiZXIuYmluZCh0aGlzKSk7fX07QW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLkdsb2JhbFBsYXliYWNrUmF0ZXM9WzEsMC4yNSwwLjFdO0FuaW1hdGlvbi5BbmltYXRpb25UaW1lbGluZS5fQ29udHJvbFN0YXRlPXtQbGF5OidwbGF5LW91dGxpbmUnLFJlcGxheToncmVwbGF5LW91dGxpbmUnLFBhdXNlOidwYXVzZS1vdXRsaW5lJ307QW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLk5vZGVVST1jbGFzc3tjb25zdHJ1Y3RvcihhbmltYXRpb25FZmZlY3Qpe3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdhbmltYXRpb24tbm9kZS1yb3cnKTt0aGlzLl9kZXNjcmlwdGlvbj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi1ub2RlLWRlc2NyaXB0aW9uJyk7dGhpcy5fdGltZWxpbmVFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLW5vZGUtdGltZWxpbmUnKTt9CmFzeW5jIG5vZGVSZXNvbHZlZChub2RlKXtpZighbm9kZSl7dGhpcy5fZGVzY3JpcHRpb24uY3JlYXRlVGV4dENoaWxkKCc8bm9kZT4nKTtyZXR1cm47fQp0aGlzLl9ub2RlPW5vZGU7dGhpcy5fbm9kZUNoYW5nZWQoKTtDb21tb24uTGlua2lmaWVyLmxpbmtpZnkobm9kZSkudGhlbihsaW5rPT50aGlzLl9kZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChsaW5rKSk7aWYoIW5vZGUub3duZXJEb2N1bWVudCkKdGhpcy5ub2RlUmVtb3ZlZCgpO30KY3JlYXRlTmV3Um93KCl7cmV0dXJuIHRoaXMuX3RpbWVsaW5lRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYW5pbWF0aW9uLXRpbWVsaW5lLXJvdycpO30Kbm9kZVJlbW92ZWQoKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYW5pbWF0aW9uLW5vZGUtcmVtb3ZlZCcpO3RoaXMuX25vZGU9bnVsbDt9Cl9ub2RlQ2hhbmdlZCgpe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdhbmltYXRpb24tbm9kZS1zZWxlY3RlZCcsdGhpcy5fbm9kZSYmdGhpcy5fbm9kZT09PVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKSk7fX07QW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLlN0ZXBUaW1pbmdGdW5jdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihzdGVwcyxzdGVwQXRQb3NpdGlvbil7dGhpcy5zdGVwcz1zdGVwczt0aGlzLnN0ZXBBdFBvc2l0aW9uPXN0ZXBBdFBvc2l0aW9uO30Kc3RhdGljIHBhcnNlKHRleHQpe2xldCBtYXRjaD10ZXh0Lm1hdGNoKC9ec3RlcHNcKChcZCspLCAoc3RhcnR8bWlkZGxlKVwpJC8pO2lmKG1hdGNoKQpyZXR1cm4gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25UaW1lbGluZS5TdGVwVGltaW5nRnVuY3Rpb24ocGFyc2VJbnQobWF0Y2hbMV0sMTApLG1hdGNoWzJdKTttYXRjaD10ZXh0Lm1hdGNoKC9ec3RlcHNcKChcZCspXCkkLyk7aWYobWF0Y2gpCnJldHVybiBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvblRpbWVsaW5lLlN0ZXBUaW1pbmdGdW5jdGlvbihwYXJzZUludChtYXRjaFsxXSwxMCksJ2VuZCcpO3JldHVybiBudWxsO319OztBbmltYXRpb24uQW5pbWF0aW9uVUk9Y2xhc3N7Y29uc3RydWN0b3IoYW5pbWF0aW9uLHRpbWVsaW5lLHBhcmVudEVsZW1lbnQpe3RoaXMuX2FuaW1hdGlvbj1hbmltYXRpb247dGhpcy5fdGltZWxpbmU9dGltZWxpbmU7dGhpcy5fcGFyZW50RWxlbWVudD1wYXJlbnRFbGVtZW50O2lmKHRoaXMuX2FuaW1hdGlvbi5zb3VyY2UoKS5rZXlmcmFtZXNSdWxlKCkpCnRoaXMuX2tleWZyYW1lcz10aGlzLl9hbmltYXRpb24uc291cmNlKCkua2V5ZnJhbWVzUnVsZSgpLmtleWZyYW1lcygpO3RoaXMuX25hbWVFbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FuaW1hdGlvbi1uYW1lJyk7dGhpcy5fbmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5fYW5pbWF0aW9uLm5hbWUoKTt0aGlzLl9zdmc9cGFyZW50RWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnc3ZnJywnYW5pbWF0aW9uLXVpJyk7dGhpcy5fc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxBbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucy5BbmltYXRpb25TVkdIZWlnaHQpO3RoaXMuX3N2Zy5zdHlsZS5tYXJnaW5MZWZ0PSctJytBbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucy5BbmltYXRpb25NYXJnaW4rJ3B4Jzt0aGlzLl9zdmcuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKSk7dGhpcy5fYWN0aXZlSW50ZXJ2YWxHcm91cD10aGlzLl9zdmcuY3JlYXRlU1ZHQ2hpbGQoJ2cnKTtVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0aGlzLl9hY3RpdmVJbnRlcnZhbEdyb3VwLHRoaXMuX21vdXNlRG93bi5iaW5kKHRoaXMsQW5pbWF0aW9uLkFuaW1hdGlvblVJLk1vdXNlRXZlbnRzLkFuaW1hdGlvbkRyYWcsbnVsbCksdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcyksdGhpcy5fbW91c2VVcC5iaW5kKHRoaXMpLCctd2Via2l0LWdyYWJiaW5nJywnLXdlYmtpdC1ncmFiJyk7dGhpcy5fY2FjaGVkRWxlbWVudHM9W107dGhpcy5fbW92ZW1lbnRJbk1zPTA7dGhpcy5fY29sb3I9QW5pbWF0aW9uLkFuaW1hdGlvblVJLkNvbG9yKHRoaXMuX2FuaW1hdGlvbik7fQpzdGF0aWMgQ29sb3IoYW5pbWF0aW9uKXtjb25zdCBuYW1lcz1PYmplY3Qua2V5cyhBbmltYXRpb24uQW5pbWF0aW9uVUkuQ29sb3JzKTtjb25zdCBjb2xvcj1BbmltYXRpb24uQW5pbWF0aW9uVUkuQ29sb3JzW25hbWVzW1N0cmluZy5oYXNoQ29kZShhbmltYXRpb24ubmFtZSgpfHxhbmltYXRpb24uaWQoKSklbmFtZXMubGVuZ3RoXV07cmV0dXJuIGNvbG9yLmFzU3RyaW5nKENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCKTt9CmFuaW1hdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRpb247fQpzZXROb2RlKG5vZGUpe3RoaXMuX25vZGU9bm9kZTt9Cl9jcmVhdGVMaW5lKHBhcmVudEVsZW1lbnQsY2xhc3NOYW1lKXtjb25zdCBsaW5lPXBhcmVudEVsZW1lbnQuY3JlYXRlU1ZHQ2hpbGQoJ2xpbmUnLGNsYXNzTmFtZSk7bGluZS5zZXRBdHRyaWJ1dGUoJ3gxJyxBbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucy5BbmltYXRpb25NYXJnaW4pO2xpbmUuc2V0QXR0cmlidXRlKCd5MScsQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uSGVpZ2h0KTtsaW5lLnNldEF0dHJpYnV0ZSgneTInLEFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbkhlaWdodCk7bGluZS5zdHlsZS5zdHJva2U9dGhpcy5fY29sb3I7cmV0dXJuIGxpbmU7fQpfZHJhd0FuaW1hdGlvbkxpbmUoaXRlcmF0aW9uLHBhcmVudEVsZW1lbnQpe2NvbnN0IGNhY2hlPXRoaXMuX2NhY2hlZEVsZW1lbnRzW2l0ZXJhdGlvbl07aWYoIWNhY2hlLmFuaW1hdGlvbkxpbmUpCmNhY2hlLmFuaW1hdGlvbkxpbmU9dGhpcy5fY3JlYXRlTGluZShwYXJlbnRFbGVtZW50LCdhbmltYXRpb24tbGluZScpO2NhY2hlLmFuaW1hdGlvbkxpbmUuc2V0QXR0cmlidXRlKCd4MicsKHRoaXMuX2R1cmF0aW9uKCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCkrQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uTWFyZ2luKS50b0ZpeGVkKDIpKTt9Cl9kcmF3RGVsYXlMaW5lKHBhcmVudEVsZW1lbnQpe2lmKCF0aGlzLl9kZWxheUxpbmUpe3RoaXMuX2RlbGF5TGluZT10aGlzLl9jcmVhdGVMaW5lKHBhcmVudEVsZW1lbnQsJ2FuaW1hdGlvbi1kZWxheS1saW5lJyk7dGhpcy5fZW5kRGVsYXlMaW5lPXRoaXMuX2NyZWF0ZUxpbmUocGFyZW50RWxlbWVudCwnYW5pbWF0aW9uLWRlbGF5LWxpbmUnKTt9CmNvbnN0IGZpbGw9dGhpcy5fYW5pbWF0aW9uLnNvdXJjZSgpLmZpbGwoKTt0aGlzLl9kZWxheUxpbmUuY2xhc3NMaXN0LnRvZ2dsZSgnYW5pbWF0aW9uLWZpbGwnLGZpbGw9PT0nYmFja3dhcmRzJ3x8ZmlsbD09PSdib3RoJyk7Y29uc3QgbWFyZ2luPUFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbk1hcmdpbjt0aGlzLl9kZWxheUxpbmUuc2V0QXR0cmlidXRlKCd4MScsbWFyZ2luKTt0aGlzLl9kZWxheUxpbmUuc2V0QXR0cmlidXRlKCd4MicsKHRoaXMuX2RlbGF5KCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCkrbWFyZ2luKS50b0ZpeGVkKDIpKTtjb25zdCBmb3J3YXJkc0ZpbGw9ZmlsbD09PSdmb3J3YXJkcyd8fGZpbGw9PT0nYm90aCc7dGhpcy5fZW5kRGVsYXlMaW5lLmNsYXNzTGlzdC50b2dnbGUoJ2FuaW1hdGlvbi1maWxsJyxmb3J3YXJkc0ZpbGwpO2NvbnN0IGxlZnRNYXJnaW49TWF0aC5taW4odGhpcy5fdGltZWxpbmUud2lkdGgoKSwodGhpcy5fZGVsYXkoKSt0aGlzLl9kdXJhdGlvbigpKnRoaXMuX2FuaW1hdGlvbi5zb3VyY2UoKS5pdGVyYXRpb25zKCkpKnRoaXMuX3RpbWVsaW5lLnBpeGVsTXNSYXRpbygpKTt0aGlzLl9lbmREZWxheUxpbmUuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGVYKCcrbGVmdE1hcmdpbi50b0ZpeGVkKDIpKydweCknO3RoaXMuX2VuZERlbGF5TGluZS5zZXRBdHRyaWJ1dGUoJ3gxJyxtYXJnaW4pO3RoaXMuX2VuZERlbGF5TGluZS5zZXRBdHRyaWJ1dGUoJ3gyJyxmb3J3YXJkc0ZpbGw/KHRoaXMuX3RpbWVsaW5lLndpZHRoKCktbGVmdE1hcmdpbittYXJnaW4pLnRvRml4ZWQoMik6KHRoaXMuX2FuaW1hdGlvbi5zb3VyY2UoKS5lbmREZWxheSgpKnRoaXMuX3RpbWVsaW5lLnBpeGVsTXNSYXRpbygpK21hcmdpbikudG9GaXhlZCgyKSk7fQpfZHJhd1BvaW50KGl0ZXJhdGlvbixwYXJlbnRFbGVtZW50LHgsa2V5ZnJhbWVJbmRleCxhdHRhY2hFdmVudHMpe2lmKHRoaXMuX2NhY2hlZEVsZW1lbnRzW2l0ZXJhdGlvbl0ua2V5ZnJhbWVQb2ludHNba2V5ZnJhbWVJbmRleF0pe3RoaXMuX2NhY2hlZEVsZW1lbnRzW2l0ZXJhdGlvbl0ua2V5ZnJhbWVQb2ludHNba2V5ZnJhbWVJbmRleF0uc2V0QXR0cmlidXRlKCdjeCcseC50b0ZpeGVkKDIpKTtyZXR1cm47fQpjb25zdCBjaXJjbGU9cGFyZW50RWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnY2lyY2xlJyxrZXlmcmFtZUluZGV4PD0wPydhbmltYXRpb24tZW5kcG9pbnQnOidhbmltYXRpb24ta2V5ZnJhbWUtcG9pbnQnKTtjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcseC50b0ZpeGVkKDIpKTtjaXJjbGUuc2V0QXR0cmlidXRlKCdjeScsQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uSGVpZ2h0KTtjaXJjbGUuc3R5bGUuc3Ryb2tlPXRoaXMuX2NvbG9yO2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLEFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbk1hcmdpbi8yKTtpZihrZXlmcmFtZUluZGV4PD0wKQpjaXJjbGUuc3R5bGUuZmlsbD10aGlzLl9jb2xvcjt0aGlzLl9jYWNoZWRFbGVtZW50c1tpdGVyYXRpb25dLmtleWZyYW1lUG9pbnRzW2tleWZyYW1lSW5kZXhdPWNpcmNsZTtpZighYXR0YWNoRXZlbnRzKQpyZXR1cm47bGV0IGV2ZW50VHlwZTtpZihrZXlmcmFtZUluZGV4PT09MCkKZXZlbnRUeXBlPUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5TdGFydEVuZHBvaW50TW92ZTtlbHNlIGlmKGtleWZyYW1lSW5kZXg9PT0tMSkKZXZlbnRUeXBlPUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5GaW5pc2hFbmRwb2ludE1vdmU7ZWxzZQpldmVudFR5cGU9QW5pbWF0aW9uLkFuaW1hdGlvblVJLk1vdXNlRXZlbnRzLktleWZyYW1lTW92ZTtVSS5pbnN0YWxsRHJhZ0hhbmRsZShjaXJjbGUsdGhpcy5fbW91c2VEb3duLmJpbmQodGhpcyxldmVudFR5cGUsa2V5ZnJhbWVJbmRleCksdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcyksdGhpcy5fbW91c2VVcC5iaW5kKHRoaXMpLCdldy1yZXNpemUnKTt9Cl9yZW5kZXJLZXlmcmFtZShpdGVyYXRpb24sa2V5ZnJhbWVJbmRleCxwYXJlbnRFbGVtZW50LGxlZnREaXN0YW5jZSx3aWR0aCxlYXNpbmcpe2Z1bmN0aW9uIGNyZWF0ZVN0ZXBMaW5lKHBhcmVudEVsZW1lbnQseCxzdHJva2VDb2xvcil7Y29uc3QgbGluZT1wYXJlbnRFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdsaW5lJyk7bGluZS5zZXRBdHRyaWJ1dGUoJ3gxJyx4KTtsaW5lLnNldEF0dHJpYnV0ZSgneDInLHgpO2xpbmUuc2V0QXR0cmlidXRlKCd5MScsQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uTWFyZ2luKTtsaW5lLnNldEF0dHJpYnV0ZSgneTInLEFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbkhlaWdodCk7bGluZS5zdHlsZS5zdHJva2U9c3Ryb2tlQ29sb3I7fQpjb25zdCBiZXppZXI9VUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIucGFyc2UoZWFzaW5nKTtjb25zdCBjYWNoZT10aGlzLl9jYWNoZWRFbGVtZW50c1tpdGVyYXRpb25dLmtleWZyYW1lUmVuZGVyO2lmKCFjYWNoZVtrZXlmcmFtZUluZGV4XSl7Y2FjaGVba2V5ZnJhbWVJbmRleF09YmV6aWVyP3BhcmVudEVsZW1lbnQuY3JlYXRlU1ZHQ2hpbGQoJ3BhdGgnLCdhbmltYXRpb24ta2V5ZnJhbWUnKTpwYXJlbnRFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdnJywnYW5pbWF0aW9uLWtleWZyYW1lLXN0ZXAnKTt9CmNvbnN0IGdyb3VwPWNhY2hlW2tleWZyYW1lSW5kZXhdO2dyb3VwLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlWCgnK2xlZnREaXN0YW5jZS50b0ZpeGVkKDIpKydweCknO2lmKGVhc2luZz09PSdsaW5lYXInKXtncm91cC5zdHlsZS5maWxsPXRoaXMuX2NvbG9yO2NvbnN0IGhlaWdodD1JbmxpbmVFZGl0b3IuQmV6aWVyVUkuSGVpZ2h0O2dyb3VwLnNldEF0dHJpYnV0ZSgnZCcsWydNJywwLGhlaWdodCwnTCcsMCw1LCdMJyx3aWR0aC50b0ZpeGVkKDIpLDUsJ0wnLHdpZHRoLnRvRml4ZWQoMiksaGVpZ2h0LCdaJ10uam9pbignICcpKTt9ZWxzZSBpZihiZXppZXIpe2dyb3VwLnN0eWxlLmZpbGw9dGhpcy5fY29sb3I7SW5saW5lRWRpdG9yLkJlemllclVJLmRyYXdWZWxvY2l0eUNoYXJ0KGJlemllcixncm91cCx3aWR0aCk7fWVsc2V7Y29uc3Qgc3RlcEZ1bmN0aW9uPUFuaW1hdGlvbi5BbmltYXRpb25UaW1lbGluZS5TdGVwVGltaW5nRnVuY3Rpb24ucGFyc2UoZWFzaW5nKTtncm91cC5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IG9mZnNldE1hcD17J3N0YXJ0JzowLCdtaWRkbGUnOjAuNSwnZW5kJzoxfTtjb25zdCBvZmZzZXRXZWlnaHQ9b2Zmc2V0TWFwW3N0ZXBGdW5jdGlvbi5zdGVwQXRQb3NpdGlvbl07Zm9yKGxldCBpPTA7aTxzdGVwRnVuY3Rpb24uc3RlcHM7aSsrKQpjcmVhdGVTdGVwTGluZShncm91cCwoaStvZmZzZXRXZWlnaHQpKndpZHRoL3N0ZXBGdW5jdGlvbi5zdGVwcyx0aGlzLl9jb2xvcik7fX0KcmVkcmF3KCl7Y29uc3QgbWF4V2lkdGg9dGhpcy5fdGltZWxpbmUud2lkdGgoKS1BbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucy5BbmltYXRpb25NYXJnaW47dGhpcy5fc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLChtYXhXaWR0aCsyKkFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbk1hcmdpbikudG9GaXhlZCgyKSk7dGhpcy5fYWN0aXZlSW50ZXJ2YWxHcm91cC5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZVgoJysodGhpcy5fZGVsYXkoKSp0aGlzLl90aW1lbGluZS5waXhlbE1zUmF0aW8oKSkudG9GaXhlZCgyKSsncHgpJzt0aGlzLl9uYW1lRWxlbWVudC5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZVgoJysKKHRoaXMuX2RlbGF5KCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCkrQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uTWFyZ2luKS50b0ZpeGVkKDIpKydweCknO3RoaXMuX25hbWVFbGVtZW50LnN0eWxlLndpZHRoPSh0aGlzLl9kdXJhdGlvbigpKnRoaXMuX3RpbWVsaW5lLnBpeGVsTXNSYXRpbygpKS50b0ZpeGVkKDIpKydweCc7dGhpcy5fZHJhd0RlbGF5TGluZSh0aGlzLl9zdmcpO2lmKHRoaXMuX2FuaW1hdGlvbi50eXBlKCk9PT0nQ1NTVHJhbnNpdGlvbicpe3RoaXMuX3JlbmRlclRyYW5zaXRpb24oKTtyZXR1cm47fQp0aGlzLl9yZW5kZXJJdGVyYXRpb24odGhpcy5fYWN0aXZlSW50ZXJ2YWxHcm91cCwwKTtpZighdGhpcy5fdGFpbEdyb3VwKQp0aGlzLl90YWlsR3JvdXA9dGhpcy5fYWN0aXZlSW50ZXJ2YWxHcm91cC5jcmVhdGVTVkdDaGlsZCgnZycsJ2FuaW1hdGlvbi10YWlsLWl0ZXJhdGlvbnMnKTtjb25zdCBpdGVyYXRpb25XaWR0aD10aGlzLl9kdXJhdGlvbigpKnRoaXMuX3RpbWVsaW5lLnBpeGVsTXNSYXRpbygpO2xldCBpdGVyYXRpb247Zm9yKGl0ZXJhdGlvbj0xO2l0ZXJhdGlvbjx0aGlzLl9hbmltYXRpb24uc291cmNlKCkuaXRlcmF0aW9ucygpJiZpdGVyYXRpb25XaWR0aCooaXRlcmF0aW9uLTEpPHRoaXMuX3RpbWVsaW5lLndpZHRoKCk7aXRlcmF0aW9uKyspCnRoaXMuX3JlbmRlckl0ZXJhdGlvbih0aGlzLl90YWlsR3JvdXAsaXRlcmF0aW9uKTt3aGlsZShpdGVyYXRpb248dGhpcy5fY2FjaGVkRWxlbWVudHMubGVuZ3RoKQp0aGlzLl9jYWNoZWRFbGVtZW50cy5wb3AoKS5ncm91cC5yZW1vdmUoKTt9Cl9yZW5kZXJUcmFuc2l0aW9uKCl7aWYoIXRoaXMuX2NhY2hlZEVsZW1lbnRzWzBdKQp0aGlzLl9jYWNoZWRFbGVtZW50c1swXT17YW5pbWF0aW9uTGluZTpudWxsLGtleWZyYW1lUG9pbnRzOnt9LGtleWZyYW1lUmVuZGVyOnt9LGdyb3VwOm51bGx9O3RoaXMuX2RyYXdBbmltYXRpb25MaW5lKDAsdGhpcy5fYWN0aXZlSW50ZXJ2YWxHcm91cCk7dGhpcy5fcmVuZGVyS2V5ZnJhbWUoMCwwLHRoaXMuX2FjdGl2ZUludGVydmFsR3JvdXAsQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uTWFyZ2luLHRoaXMuX2R1cmF0aW9uKCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCksdGhpcy5fYW5pbWF0aW9uLnNvdXJjZSgpLmVhc2luZygpKTt0aGlzLl9kcmF3UG9pbnQoMCx0aGlzLl9hY3RpdmVJbnRlcnZhbEdyb3VwLEFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbk1hcmdpbiwwLHRydWUpO3RoaXMuX2RyYXdQb2ludCgwLHRoaXMuX2FjdGl2ZUludGVydmFsR3JvdXAsdGhpcy5fZHVyYXRpb24oKSp0aGlzLl90aW1lbGluZS5waXhlbE1zUmF0aW8oKStBbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucy5BbmltYXRpb25NYXJnaW4sLTEsdHJ1ZSk7fQpfcmVuZGVySXRlcmF0aW9uKHBhcmVudEVsZW1lbnQsaXRlcmF0aW9uKXtpZighdGhpcy5fY2FjaGVkRWxlbWVudHNbaXRlcmF0aW9uXSl7dGhpcy5fY2FjaGVkRWxlbWVudHNbaXRlcmF0aW9uXT17YW5pbWF0aW9uTGluZTpudWxsLGtleWZyYW1lUG9pbnRzOnt9LGtleWZyYW1lUmVuZGVyOnt9LGdyb3VwOnBhcmVudEVsZW1lbnQuY3JlYXRlU1ZHQ2hpbGQoJ2cnKX07fQpjb25zdCBncm91cD10aGlzLl9jYWNoZWRFbGVtZW50c1tpdGVyYXRpb25dLmdyb3VwO2dyb3VwLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlWCgnKyhpdGVyYXRpb24qdGhpcy5fZHVyYXRpb24oKSp0aGlzLl90aW1lbGluZS5waXhlbE1zUmF0aW8oKSkudG9GaXhlZCgyKSsncHgpJzt0aGlzLl9kcmF3QW5pbWF0aW9uTGluZShpdGVyYXRpb24sZ3JvdXApO2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2tleWZyYW1lcy5sZW5ndGg+MSk7Zm9yKGxldCBpPTA7aTx0aGlzLl9rZXlmcmFtZXMubGVuZ3RoLTE7aSsrKXtjb25zdCBsZWZ0RGlzdGFuY2U9dGhpcy5fb2Zmc2V0KGkpKnRoaXMuX2R1cmF0aW9uKCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCkrCkFuaW1hdGlvbi5BbmltYXRpb25VSS5PcHRpb25zLkFuaW1hdGlvbk1hcmdpbjtjb25zdCB3aWR0aD10aGlzLl9kdXJhdGlvbigpKih0aGlzLl9vZmZzZXQoaSsxKS10aGlzLl9vZmZzZXQoaSkpKnRoaXMuX3RpbWVsaW5lLnBpeGVsTXNSYXRpbygpO3RoaXMuX3JlbmRlcktleWZyYW1lKGl0ZXJhdGlvbixpLGdyb3VwLGxlZnREaXN0YW5jZSx3aWR0aCx0aGlzLl9rZXlmcmFtZXNbaV0uZWFzaW5nKCkpO2lmKGl8fCghaSYmaXRlcmF0aW9uPT09MCkpCnRoaXMuX2RyYXdQb2ludChpdGVyYXRpb24sZ3JvdXAsbGVmdERpc3RhbmNlLGksaXRlcmF0aW9uPT09MCk7fQp0aGlzLl9kcmF3UG9pbnQoaXRlcmF0aW9uLGdyb3VwLHRoaXMuX2R1cmF0aW9uKCkqdGhpcy5fdGltZWxpbmUucGl4ZWxNc1JhdGlvKCkrQW5pbWF0aW9uLkFuaW1hdGlvblVJLk9wdGlvbnMuQW5pbWF0aW9uTWFyZ2luLC0xLGl0ZXJhdGlvbj09PTApO30KX2RlbGF5KCl7bGV0IGRlbGF5PXRoaXMuX2FuaW1hdGlvbi5zb3VyY2UoKS5kZWxheSgpO2lmKHRoaXMuX21vdXNlRXZlbnRUeXBlPT09QW5pbWF0aW9uLkFuaW1hdGlvblVJLk1vdXNlRXZlbnRzLkFuaW1hdGlvbkRyYWd8fHRoaXMuX21vdXNlRXZlbnRUeXBlPT09QW5pbWF0aW9uLkFuaW1hdGlvblVJLk1vdXNlRXZlbnRzLlN0YXJ0RW5kcG9pbnRNb3ZlKQpkZWxheSs9dGhpcy5fbW92ZW1lbnRJbk1zO3JldHVybiBNYXRoLm1heCgwLGRlbGF5KTt9Cl9kdXJhdGlvbigpe2xldCBkdXJhdGlvbj10aGlzLl9hbmltYXRpb24uc291cmNlKCkuZHVyYXRpb24oKTtpZih0aGlzLl9tb3VzZUV2ZW50VHlwZT09PUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5GaW5pc2hFbmRwb2ludE1vdmUpCmR1cmF0aW9uKz10aGlzLl9tb3ZlbWVudEluTXM7ZWxzZSBpZih0aGlzLl9tb3VzZUV2ZW50VHlwZT09PUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5TdGFydEVuZHBvaW50TW92ZSkKZHVyYXRpb24tPU1hdGgubWF4KHRoaXMuX21vdmVtZW50SW5NcywtdGhpcy5fYW5pbWF0aW9uLnNvdXJjZSgpLmRlbGF5KCkpO3JldHVybiBNYXRoLm1heCgwLGR1cmF0aW9uKTt9Cl9vZmZzZXQoaSl7bGV0IG9mZnNldD10aGlzLl9rZXlmcmFtZXNbaV0ub2Zmc2V0QXNOdW1iZXIoKTtpZih0aGlzLl9tb3VzZUV2ZW50VHlwZT09PUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5LZXlmcmFtZU1vdmUmJmk9PT10aGlzLl9rZXlmcmFtZU1vdmVkKXtjb25zb2xlLmFzc2VydChpPjAmJmk8dGhpcy5fa2V5ZnJhbWVzLmxlbmd0aC0xLCdGaXJzdCBhbmQgbGFzdCBrZXlmcmFtZSBjYW5ub3QgYmUgbW92ZWQnKTtvZmZzZXQrPXRoaXMuX21vdmVtZW50SW5Ncy90aGlzLl9hbmltYXRpb24uc291cmNlKCkuZHVyYXRpb24oKTtvZmZzZXQ9TWF0aC5tYXgob2Zmc2V0LHRoaXMuX2tleWZyYW1lc1tpLTFdLm9mZnNldEFzTnVtYmVyKCkpO29mZnNldD1NYXRoLm1pbihvZmZzZXQsdGhpcy5fa2V5ZnJhbWVzW2krMV0ub2Zmc2V0QXNOdW1iZXIoKSk7fQpyZXR1cm4gb2Zmc2V0O30KX21vdXNlRG93bihtb3VzZUV2ZW50VHlwZSxrZXlmcmFtZUluZGV4LGV2ZW50KXtpZihldmVudC5idXR0b25zPT09MikKcmV0dXJuIGZhbHNlO2lmKHRoaXMuX3N2Zy5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdhbmltYXRpb24tbm9kZS1yZW1vdmVkJykpCnJldHVybiBmYWxzZTt0aGlzLl9tb3VzZUV2ZW50VHlwZT1tb3VzZUV2ZW50VHlwZTt0aGlzLl9rZXlmcmFtZU1vdmVkPWtleWZyYW1lSW5kZXg7dGhpcy5fZG93bk1vdXNlWD1ldmVudC5jbGllbnRYO2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYodGhpcy5fbm9kZSkKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh0aGlzLl9ub2RlKTtyZXR1cm4gdHJ1ZTt9Cl9tb3VzZU1vdmUoZXZlbnQpe3RoaXMuX21vdmVtZW50SW5Ncz0oZXZlbnQuY2xpZW50WC10aGlzLl9kb3duTW91c2VYKS90aGlzLl90aW1lbGluZS5waXhlbE1zUmF0aW8oKTtpZih0aGlzLl9kZWxheSgpK3RoaXMuX2R1cmF0aW9uKCk+dGhpcy5fdGltZWxpbmUuZHVyYXRpb24oKSowLjgpCnRoaXMuX3RpbWVsaW5lLnNldER1cmF0aW9uKHRoaXMuX3RpbWVsaW5lLmR1cmF0aW9uKCkqMS4yKTt0aGlzLnJlZHJhdygpO30KX21vdXNlVXAoZXZlbnQpe3RoaXMuX21vdmVtZW50SW5Ncz0oZXZlbnQuY2xpZW50WC10aGlzLl9kb3duTW91c2VYKS90aGlzLl90aW1lbGluZS5waXhlbE1zUmF0aW8oKTtpZih0aGlzLl9tb3VzZUV2ZW50VHlwZT09PUFuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cy5LZXlmcmFtZU1vdmUpCnRoaXMuX2tleWZyYW1lc1t0aGlzLl9rZXlmcmFtZU1vdmVkXS5zZXRPZmZzZXQodGhpcy5fb2Zmc2V0KHRoaXMuX2tleWZyYW1lTW92ZWQpKTtlbHNlCnRoaXMuX2FuaW1hdGlvbi5zZXRUaW1pbmcodGhpcy5fZHVyYXRpb24oKSx0aGlzLl9kZWxheSgpKTt0aGlzLl9tb3ZlbWVudEluTXM9MDt0aGlzLnJlZHJhdygpO2RlbGV0ZSB0aGlzLl9tb3VzZUV2ZW50VHlwZTtkZWxldGUgdGhpcy5fZG93bk1vdXNlWDtkZWxldGUgdGhpcy5fa2V5ZnJhbWVNb3ZlZDt9Cl9vbkNvbnRleHRNZW51KGV2ZW50KXtmdW5jdGlvbiBzaG93Q29udGV4dE1lbnUocmVtb3RlT2JqZWN0KXtpZighcmVtb3RlT2JqZWN0KQpyZXR1cm47Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXMocmVtb3RlT2JqZWN0KTtjb250ZXh0TWVudS5zaG93KCk7fQp0aGlzLl9hbmltYXRpb24ucmVtb3RlT2JqZWN0UHJvbWlzZSgpLnRoZW4oc2hvd0NvbnRleHRNZW51KTtldmVudC5jb25zdW1lKHRydWUpO319O0FuaW1hdGlvbi5BbmltYXRpb25VSS5Nb3VzZUV2ZW50cz17QW5pbWF0aW9uRHJhZzonQW5pbWF0aW9uRHJhZycsS2V5ZnJhbWVNb3ZlOidLZXlmcmFtZU1vdmUnLFN0YXJ0RW5kcG9pbnRNb3ZlOidTdGFydEVuZHBvaW50TW92ZScsRmluaXNoRW5kcG9pbnRNb3ZlOidGaW5pc2hFbmRwb2ludE1vdmUnfTtBbmltYXRpb24uQW5pbWF0aW9uVUkuT3B0aW9ucz17QW5pbWF0aW9uSGVpZ2h0OjI2LEFuaW1hdGlvblNWR0hlaWdodDo1MCxBbmltYXRpb25NYXJnaW46NyxFbmRwb2ludHNDbGlja1JlZ2lvblNpemU6MTAsR3JpZENhbnZhc0hlaWdodDo0MH07QW5pbWF0aW9uLkFuaW1hdGlvblVJLkNvbG9ycz17J1B1cnBsZSc6Q29tbW9uLkNvbG9yLnBhcnNlKCcjOUMyN0IwJyksJ0xpZ2h0IEJsdWUnOkNvbW1vbi5Db2xvci5wYXJzZSgnIzAzQTlGNCcpLCdEZWVwIE9yYW5nZSc6Q29tbW9uLkNvbG9yLnBhcnNlKCcjRkY1NzIyJyksJ0JsdWUnOkNvbW1vbi5Db2xvci5wYXJzZSgnIzU2NzdGQycpLCdMaW1lJzpDb21tb24uQ29sb3IucGFyc2UoJyNDRERDMzknKSwnQmx1ZSBHcmV5JzpDb21tb24uQ29sb3IucGFyc2UoJyM2MDdEOEInKSwnUGluayc6Q29tbW9uLkNvbG9yLnBhcnNlKCcjRTkxRTYzJyksJ0dyZWVuJzpDb21tb24uQ29sb3IucGFyc2UoJyMwRjlENTgnKSwnQnJvd24nOkNvbW1vbi5Db2xvci5wYXJzZSgnIzc5NTU0OCcpLCdDeWFuJzpDb21tb24uQ29sb3IucGFyc2UoJyMwMEJDRDQnKX07O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJhbmltYXRpb24vYW5pbWF0aW9uU2NyZWVuc2hvdFBvcG92ZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbmltZyB7XG4gICAgbWF4LWhlaWdodDogMzAwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxuXG4uYW5pbWF0aW9uLXByb2dyZXNzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbn1cblxuLyojIHNvdXJjZVVSTD1hbmltYXRpb24vYW5pbWF0aW9uU2NyZWVuc2hvdFBvcG92ZXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siYW5pbWF0aW9uL2FuaW1hdGlvblRpbWVsaW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmFuaW1hdGlvbi1ub2RlLXJvdyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkIGhzbGEoMCwwJSw5NCUsMSk7XG59XG5cbi5hbmltYXRpb24tbm9kZS1kZXNjcmlwdGlvbiB7XG4gICAgd2lkdGg6IDE1MHB4O1xuICAgIHBhZGRpbmctbGVmdDogOHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGhzbCgwLCAwJSwgOTAlKTtcbiAgICBtYXJnaW4tYm90dG9tOiAtMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAwJSwgOTglKTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogMCAwIDE1MHB4O1xufVxuXG4uYW5pbWF0aW9uLW5vZGUtZGVzY3JpcHRpb24gPiAqIHtcbiAgICBmbGV4OiAwIDAgYXV0bztcbn1cblxuLmFuaW1hdGlvbi10aW1lbGluZS1yb3cge1xuICAgIGhlaWdodDogMzJweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbnBhdGguYW5pbWF0aW9uLWtleWZyYW1lIHtcbiAgICBmaWxsLW9wYWNpdHk6IDAuMjtcbn1cblxuc3ZnLmFuaW1hdGlvbi11aSBnOmZpcnN0LWNoaWxkOmhvdmVyIHBhdGguYW5pbWF0aW9uLWtleWZyYW1lIHtcbiAgICBmaWxsLW9wYWNpdHk6IDAuNDtcbn1cblxuLmFuaW1hdGlvbi1ub2RlLXNlbGVjdGVkIHBhdGguYW5pbWF0aW9uLWtleWZyYW1lIHtcbiAgICBmaWxsLW9wYWNpdHk6IDAuNDtcbn1cblxubGluZS5hbmltYXRpb24tbGluZSB7XG4gICAgc3Ryb2tlLXdpZHRoOiAycHg7XG4gICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICAgIGZpbGw6IG5vbmU7XG59XG5cbmxpbmUuYW5pbWF0aW9uLWRlbGF5LWxpbmUge1xuICAgIHN0cm9rZS13aWR0aDogMnB4O1xuICAgIHN0cm9rZS1kYXNoYXJyYXk6IDYsIDQ7XG59XG5cbmxpbmUuYW5pbWF0aW9uLWRlbGF5LWxpbmUuYW5pbWF0aW9uLWZpbGwge1xuICAgIHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7XG59XG5cbmNpcmNsZS5hbmltYXRpb24tZW5kcG9pbnQsIGNpcmNsZS5hbmltYXRpb24ta2V5ZnJhbWUtcG9pbnQge1xuICAgIHN0cm9rZS13aWR0aDogMnB4O1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIHRyYW5zZm9ybS1ib3g6IGZpbGwtYm94O1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7XG59XG5cbi5hbmltYXRpb24tdWkgY2lyY2xlLmFuaW1hdGlvbi1lbmRwb2ludDpob3ZlciwgLmFuaW1hdGlvbi11aSBjaXJjbGUuYW5pbWF0aW9uLWtleWZyYW1lLXBvaW50OmhvdmVyIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMik7XG59XG5cbmNpcmNsZS5hbmltYXRpb24tZW5kcG9pbnQ6YWN0aXZlLCBjaXJjbGUuYW5pbWF0aW9uLWtleWZyYW1lLXBvaW50OmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbn1cblxuY2lyY2xlLmFuaW1hdGlvbi1rZXlmcmFtZS1wb2ludCB7XG4gICAgZmlsbDogd2hpdGU7XG59XG5cbi5hbmltYXRpb24tbmFtZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogOHB4O1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogLThweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uYW5pbWF0aW9uLXRpbWVsaW5lLXRvb2xiYXItY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbiAgICBmbGV4OiAwIDA7XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uYW5pbWF0aW9uLXRpbWVsaW5lLWhlYWRlciB7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtaGVhZGVyOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gNDhweCAtIDI4cHgpO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTUwcHg7XG4gICAgbGVmdDogMDtcbiAgICBtYXJnaW4tdG9wOiAyOHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAwJSwgOTglKTtcbiAgICB6LWluZGV4OiAwO1xuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGhzbCgwLCAwJSwgOTAlKTtcbn1cblxuLmFuaW1hdGlvbi1jb250cm9scyB7XG4gICAgZmxleDogMCAwIDE1MHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgcGFkZGluZy1yaWdodDogOHB4O1xufVxuXG4uYW5pbWF0aW9uLXRpbWVsaW5lLWN1cnJlbnQtdGltZSB7ZmxleDogMCAwIGF1dG87bGluZS1oZWlnaHQ6IDI4cHg7bWFyZ2luLXJpZ2h0OiA1cHg7fVxuLmFuaW1hdGlvbi1ncmlkLWhlYWRlciB7XG4gICAgZmxleDogMSAwIGF1dG87XG4gICAgei1pbmRleDogMTtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtYnVmZmVyLCAuYW5pbWF0aW9uLXRpbWVsaW5lLWJ1ZmZlci1oaW50IHtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwYWRkaW5nOiAwIDJweDtcbn1cblxuLmFuaW1hdGlvbi10aW1lbGluZS1idWZmZXI6ZW1wdHksIC5hbmltYXRpb24tdGltZWxpbmUtYnVmZmVyLWhpbnQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtYnVmZmVyOmVtcHR5IH4gLmFuaW1hdGlvbi10aW1lbGluZS1idWZmZXItaGludCB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgei1pbmRleDogMTAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5hbmltYXRpb24tdGltZS1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcbiAgICBvcGFjaXR5OiAwLjA1O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgei1pbmRleDogLTE7XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtZW5kID4gLmFuaW1hdGlvbi10aW1lLW92ZXJsYXkge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmFuaW1hdGlvbi1zY3J1YmJlciB7XG4gICAgb3BhY2l0eTogMTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMTUwcHg7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxMDNweCk7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDE1MHB4KTtcbiAgICB0b3A6IDEwM3B4O1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgaHNsYSg0LDkwJSw1OCUsMSk7XG4gICAgei1pbmRleDogMTtcbn1cblxuLmFuaW1hdGlvbi1zY3J1YmJlci1saW5lIHtcbiAgICB3aWR0aDogMTFweDtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50IDVweCwgaHNsYSg0LDkwJSw1OCUsMSkgNXB4LCBoc2xhKDQsOTAlLDU4JSwxKSA2cHgsIHRyYW5zcGFyZW50IDZweCk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogLTI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIGxlZnQ6IC02cHg7XG4gICAgcGFkZGluZzogMCA1cHg7XG4gICAgei1pbmRleDogMjtcbn1cblxuLmFuaW1hdGlvbi1zY3J1YmJlci1oZWFkIHtcbiAgICB3aWR0aDogN3B4O1xuICAgIGhlaWdodDogN3B4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDJweDtcbiAgICB0b3A6IDFweDtcbn1cblxuc3ZnLmFuaW1hdGlvbi10aW1lbGluZS1ncmlkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMTQwcHg7XG4gICAgdG9wOiA3NnB4O1xuICAgIHotaW5kZXg6IDA7XG59XG5cbnJlY3QuYW5pbWF0aW9uLXRpbWVsaW5lLWdyaWQtbGluZSB7XG4gICAgZmlsbDogaHNsYSgwLDAlLDkzJSwxKTtcbn1cblxuLmFuaW1hdGlvbi10aW1lbGluZS1yb3cgPiBzdmcuYW5pbWF0aW9uLXVpIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5hbmltYXRpb24tbm9kZS10aW1lbGluZSB7XG4gICAgZmxleC1ncm93OiAxO1xufVxuXG4uYW5pbWF0aW9uLW5vZGUtZGVzY3JpcHRpb24gPiBkaXYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbn1cblxuLmFuaW1hdGlvbi1ub2RlLXJlbW92ZWQge1xuICAgIC13ZWJraXQtZmlsdGVyOiBzYXR1cmF0ZSgwKTtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG5zdmcuYW5pbWF0aW9uLXVpIGc6Zmlyc3QtY2hpbGQge1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbi5hbmltYXRpb24tdGFpbC1pdGVyYXRpb25zIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi5hbmltYXRpb24ta2V5ZnJhbWUtc3RlcCBsaW5lIHtcbiAgICBzdHJva2Utd2lkdGg6IDI7XG4gICAgc3Ryb2tlLW9wYWNpdHk6IDAuMztcbn1cblxudGV4dC5hbmltYXRpb24tdGltZWxpbmUtZ3JpZC1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIGZpbGw6ICM1YTVhNWE7XG4gICAgdGV4dC1hbmNob3I6IG1pZGRsZTtcbn1cblxuLmFuaW1hdGlvbi10aW1lbGluZS1yb3dzLCAuYW5pbWF0aW9uLXRpbWVsaW5lLXJvd3MtaGludCB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgei1pbmRleDogMTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi5hbmltYXRpb24tdGltZWxpbmUtcm93cy1oaW50IHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uYW5pbWF0aW9uLXRpbWVsaW5lLWJ1ZmZlcjpub3QoOmVtcHR5KSB+IC5hbmltYXRpb24tdGltZWxpbmUtcm93czplbXB0eSB7XG4gICAgZmxleC1ncm93OiAwO1xufVxuXG4uYW5pbWF0aW9uLXRpbWVsaW5lLWJ1ZmZlcjpub3QoOmVtcHR5KSB+IC5hbmltYXRpb24tdGltZWxpbmUtcm93czplbXB0eSB+IC5hbmltYXRpb24tdGltZWxpbmUtcm93cy1oaW50IHtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIG1hcmdpbi1sZWZ0OiAxNTBweDtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4udG9vbGJhci5hbmltYXRpb24tY29udHJvbHMtdG9vbGJhciB7XG4gICAgZmxleDogMCAwIGF1dG87XG59XG5cbi5hbmltYXRpb24tbm9kZS1yb3cuYW5pbWF0aW9uLW5vZGUtc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMjE2LCA3MSUsIDUzJSwgMC4wOCk7XG59XG5cbi5hbmltYXRpb24tbm9kZS1zZWxlY3RlZCA+IC5hbmltYXRpb24tbm9kZS1kZXNjcmlwdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VGRjRGRDtcbn1cblxuLmFuaW1hdGlvbi10aW1lbGluZS1lbXB0eS1tZXNzYWdlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDIzMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDMycHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDQ0cHgpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5hbmltYXRpb24tYnVmZmVyLXByZXZpZXcge1xuICAgIGhlaWdodDogNDBweDtcbiAgICBtYXJnaW46IDRweCAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGZsZXg6IDEgMTtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgbWF4LXdpZHRoOiAxMDBweDtcbiAgICBhbmltYXRpb246IG5ld0dyb3VwQW5pbSAyMDBtcztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5hbmltYXRpb24tYnVmZmVyLXByZXZpZXctYW5pbWF0aW9uIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4IDAgMCAycHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGJhY2tncm91bmQ6IGhzbGEoMjE5LCAxMDAlLCA2NiUsIDAuMjcpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0E3QTdBNztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5hbmltYXRpb24tYnVmZmVyLXByZXZpZXc6bm90KC5zZWxlY3RlZCk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMjE3LDkwJSw5MiUsMSk7XG59XG5cbi5hbmltYXRpb24tYnVmZmVyLXByZXZpZXcuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi5hbmltYXRpb24tcGF1c2VkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLDAlLDcwJSwwLjUpO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5hbmltYXRpb24tcGF1c2VkOmJlZm9yZSwgLmFuaW1hdGlvbi1wYXVzZWQ6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgYmFja2dyb3VuZDogaHNsKDAsIDEwMCUsIDEwMCUpO1xuICAgIHdpZHRoOiA3cHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW46IDJweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xufVxuXG4uYW5pbWF0aW9uLWJ1ZmZlci1wcmV2aWV3LnBhdXNlZCAuYW5pbWF0aW9uLXBhdXNlZCB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmFuaW1hdGlvbi1idWZmZXItcHJldmlldy5zZWxlY3RlZCA+IHN2ZyA+IGxpbmUge1xuICAgIHN0cm9rZTogd2hpdGUgIWltcG9ydGFudDtcbn1cblxuLmFuaW1hdGlvbi1idWZmZXItcHJldmlldyA+IHN2ZyA+IGxpbmUge1xuICAgIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG5Aa2V5ZnJhbWVzIG5ld0dyb3VwQW5pbSB7XG4gICAgZnJvbSB7XG4gICAgICAgIC13ZWJraXQtY2xpcC1wYXRoOiBwb2x5Z29uKDAlIDAlLCAwJSAxMDAlLCAwJSAxMDAlLCAwJSAwJSk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC1jbGlwLXBhdGg6IHBvbHlnb24oMCUgMCUsIDAlIDEwMCUsIDEwMCUgMTAwJSwgMTAwJSAwJSk7XG4gICAgfVxufVxuXG4uYW5pbWF0aW9uLXBsYXliYWNrLXJhdGUtY29udHJvbCB7XG4gICAgbWFyZ2luOiA0cHggMCA0cHggMnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEyMHB4O1xufVxuXG4uYW5pbWF0aW9uLXBsYXliYWNrLXJhdGUtYnV0dG9uOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDtcbn1cblxuLmFuaW1hdGlvbi1wbGF5YmFjay1yYXRlLWJ1dHRvbjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDtcbn1cblxuLmFuaW1hdGlvbi1wbGF5YmFjay1yYXRlLWJ1dHRvbiB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xuICAgIHBhZGRpbmc6IDFweCA0cHg7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgZmxleDogMSAwIGF1dG87XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmFuaW1hdGlvbi1wbGF5YmFjay1yYXRlLWJ1dHRvbjpub3QoLnNlbGVjdGVkKTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogaHNsKDIxMSwgMTAwJSwgOTUlKTtcbn1cblxuLmFuaW1hdGlvbi1wbGF5YmFjay1yYXRlLWJ1dHRvbi5zZWxlY3RlZCB7XG4gICAgY29sb3I6IGhzbCgwLCAxMDAlLCAxMDAlKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4uYW5pbWF0aW9uLXBsYXliYWNrLXJhdGUtYnV0dG9uLnNlbGVjdGVkOmZpcnN0LWNoaWxkIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjE3LCA4OSUsIDEwMCUpO1xufVxuXG4uYW5pbWF0aW9uLXJlbW92ZS1idXR0b24sIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogLTNweDtcbiAgICByaWdodDogLTNweDtcbiAgICBiYWNrZ3JvdW5kOiAjN0I3QjdCO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgaGVpZ2h0OiAxNnB4O1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDRweCAwIHJnYigxODUsIDE4NSwgMTg1KTtcbiAgICB6LWluZGV4OiAxMDA7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBjb2xvcjogd2hpdGU7XG59XG5cbi5hbmltYXRpb24tcmVtb3ZlLWJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogIzU4NTg1ODtcbn1cblxuLmFuaW1hdGlvbi1idWZmZXItcHJldmlldzpob3ZlciAuYW5pbWF0aW9uLXJlbW92ZS1idXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qIyBzb3VyY2VVUkw9YW5pbWF0aW9uL2FuaW1hdGlvblRpbWVsaW5lLmNzcyAqLyI7J3VzZSBzdHJpY3QnO2NvbnN0IEVMTElQU0lTPSdcdTIwMjYnO2NvbnN0IE5CU1A9J1x4YTAnO2NvbnN0IFBBU1NfVEhSRVNIT0xEPTAuNzU7Y29uc3QgUkFUSU5HUz17UEFTUzp7bGFiZWw6J3Bhc3MnLG1pblNjb3JlOlBBU1NfVEhSRVNIT0xEfSxBVkVSQUdFOntsYWJlbDonYXZlcmFnZScsbWluU2NvcmU6MC40NX0sRkFJTDp7bGFiZWw6J2ZhaWwnfSxFUlJPUjp7bGFiZWw6J2Vycm9yJ30sfTtjbGFzcyBVdGlse3N0YXRpYyBnZXQgUEFTU19USFJFU0hPTEQoKXtyZXR1cm4gUEFTU19USFJFU0hPTEQ7fQpzdGF0aWMgZ2V0IE1TX0RJU1BMQVlfVkFMVUUoKXtyZXR1cm5gJTEwZCR7TkJTUH1tc2A7fQpzdGF0aWMgZm9ybWF0RGlzcGxheVZhbHVlKGRpc3BsYXlWYWx1ZSl7aWYodHlwZW9mIGRpc3BsYXlWYWx1ZT09PSdzdHJpbmcnKXJldHVybiBkaXNwbGF5VmFsdWU7aWYoIWRpc3BsYXlWYWx1ZSlyZXR1cm4nJztjb25zdCByZXBsYWNlbWVudFJlZ2V4PS8lKFswLTldKihcLlswLTldKyk/ZHxzKS87Y29uc3QgdGVtcGxhdGU9KGRpc3BsYXlWYWx1ZVswXSk7aWYodHlwZW9mIHRlbXBsYXRlIT09J3N0cmluZycpe3JldHVybidVTktOT1dOJzt9CmxldCBvdXRwdXQ9dGVtcGxhdGU7Zm9yKGNvbnN0IHJlcGxhY2VtZW50IG9mIGRpc3BsYXlWYWx1ZS5zbGljZSgxKSl7aWYoIXJlcGxhY2VtZW50UmVnZXgudGVzdChvdXRwdXQpKXtjb25zb2xlLndhcm4oJ1RvbyBtYW55IHJlcGxhY2VtZW50cyBnaXZlbicpO2JyZWFrO30Kb3V0cHV0PW91dHB1dC5yZXBsYWNlKHJlcGxhY2VtZW50UmVnZXgsbWF0Y2g9Pntjb25zdCBncmFudWxhcml0eT1OdW1iZXIobWF0Y2gubWF0Y2goL1swLTkuXSsvKSl8fDE7cmV0dXJuIG1hdGNoPT09JyVzJz9yZXBsYWNlbWVudC50b0xvY2FsZVN0cmluZygpOihNYXRoLnJvdW5kKE51bWJlcihyZXBsYWNlbWVudCkvZ3JhbnVsYXJpdHkpKmdyYW51bGFyaXR5KS50b0xvY2FsZVN0cmluZygpO30pO30KaWYocmVwbGFjZW1lbnRSZWdleC50ZXN0KG91dHB1dCkpe2NvbnNvbGUud2FybignTm90IGVub3VnaCByZXBsYWNlbWVudHMgZ2l2ZW4nKTt9CnJldHVybiBvdXRwdXQ7fQpzdGF0aWMgc2hvd0FzUGFzc2VkKGF1ZGl0KXtzd2l0Y2goYXVkaXQuc2NvcmVEaXNwbGF5TW9kZSl7Y2FzZSdtYW51YWwnOmNhc2Unbm90LWFwcGxpY2FibGUnOnJldHVybiB0cnVlO2Nhc2UnZXJyb3InOmNhc2UnaW5mb3JtYXRpdmUnOnJldHVybiBmYWxzZTtjYXNlJ251bWVyaWMnOmNhc2UnYmluYXJ5JzpkZWZhdWx0OnJldHVybiBOdW1iZXIoYXVkaXQuc2NvcmUpPT09MTt9fQpzdGF0aWMgY2FsY3VsYXRlUmF0aW5nKHNjb3JlLHNjb3JlRGlzcGxheU1vZGUpe2lmKHNjb3JlRGlzcGxheU1vZGU9PT0nbWFudWFsJ3x8c2NvcmVEaXNwbGF5TW9kZT09PSdub3QtYXBwbGljYWJsZScpe3JldHVybiBSQVRJTkdTLlBBU1MubGFiZWw7fWVsc2UgaWYoc2NvcmVEaXNwbGF5TW9kZT09PSdlcnJvcicpe3JldHVybiBSQVRJTkdTLkVSUk9SLmxhYmVsO31lbHNlIGlmKHNjb3JlPT09bnVsbCl7cmV0dXJuIFJBVElOR1MuRkFJTC5sYWJlbDt9CmxldCByYXRpbmc9UkFUSU5HUy5GQUlMLmxhYmVsO2lmKHNjb3JlPj1SQVRJTkdTLlBBU1MubWluU2NvcmUpe3JhdGluZz1SQVRJTkdTLlBBU1MubGFiZWw7fWVsc2UgaWYoc2NvcmU+PVJBVElOR1MuQVZFUkFHRS5taW5TY29yZSl7cmF0aW5nPVJBVElOR1MuQVZFUkFHRS5sYWJlbDt9CnJldHVybiByYXRpbmc7fQpzdGF0aWMgZm9ybWF0TnVtYmVyKG51bWJlcixncmFudWxhcml0eT0wLjEpe2NvbnN0IGNvYXJzZVZhbHVlPU1hdGgucm91bmQobnVtYmVyL2dyYW51bGFyaXR5KSpncmFudWxhcml0eTtyZXR1cm4gY29hcnNlVmFsdWUudG9Mb2NhbGVTdHJpbmcoKTt9CnN0YXRpYyBmb3JtYXRCeXRlc1RvS0Ioc2l6ZSxncmFudWxhcml0eT0wLjEpe2NvbnN0IGticz0oTWF0aC5yb3VuZChzaXplLzEwMjQvZ3JhbnVsYXJpdHkpKmdyYW51bGFyaXR5KS50b0xvY2FsZVN0cmluZygpO3JldHVybmAke2tic30ke05CU1B9S0JgO30Kc3RhdGljIGZvcm1hdE1pbGxpc2Vjb25kcyhtcyxncmFudWxhcml0eT0xMCl7Y29uc3QgY29hcnNlVGltZT1NYXRoLnJvdW5kKG1zL2dyYW51bGFyaXR5KSpncmFudWxhcml0eTtyZXR1cm5gJHtjb2Fyc2VUaW1lLnRvTG9jYWxlU3RyaW5nKCl9JHtOQlNQfW1zYDt9CnN0YXRpYyBmb3JtYXRTZWNvbmRzKG1zLGdyYW51bGFyaXR5PTAuMSl7Y29uc3QgY29hcnNlVGltZT1NYXRoLnJvdW5kKG1zLzEwMDAvZ3JhbnVsYXJpdHkpKmdyYW51bGFyaXR5O3JldHVybmAke2NvYXJzZVRpbWUudG9Mb2NhbGVTdHJpbmcoKX0ke05CU1B9c2A7fQpzdGF0aWMgZm9ybWF0RGF0ZVRpbWUoZGF0ZSl7Y29uc3Qgb3B0aW9ucz17bW9udGg6J3Nob3J0JyxkYXk6J251bWVyaWMnLHllYXI6J251bWVyaWMnLGhvdXI6J251bWVyaWMnLG1pbnV0ZTonbnVtZXJpYycsdGltZVpvbmVOYW1lOidzaG9ydCcsfTtsZXQgZm9ybWF0dGVyPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsb3B0aW9ucyk7Y29uc3QgdHo9Zm9ybWF0dGVyLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO2lmKCF0enx8dHoudG9Mb3dlckNhc2UoKT09PSdldGMvdW5rbm93bicpe29wdGlvbnMudGltZVpvbmU9J1VUQyc7Zm9ybWF0dGVyPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsb3B0aW9ucyk7fQpyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZShkYXRlKSk7fQpzdGF0aWMgZm9ybWF0RHVyYXRpb24odGltZUluTWlsbGlzZWNvbmRzKXtsZXQgdGltZUluU2Vjb25kcz10aW1lSW5NaWxsaXNlY29uZHMvMTAwMDtpZihNYXRoLnJvdW5kKHRpbWVJblNlY29uZHMpPT09MCl7cmV0dXJuJ05vbmUnO30KY29uc3QgcGFydHM9W107Y29uc3QgdW5pdExhYmVscz0oe2Q6NjAqNjAqMjQsaDo2MCo2MCxtOjYwLHM6MSx9KTtPYmplY3Qua2V5cyh1bml0TGFiZWxzKS5mb3JFYWNoKGxhYmVsPT57Y29uc3QgdW5pdD11bml0TGFiZWxzW2xhYmVsXTtjb25zdCBudW1iZXJPZlVuaXRzPU1hdGguZmxvb3IodGltZUluU2Vjb25kcy91bml0KTtpZihudW1iZXJPZlVuaXRzPjApe3RpbWVJblNlY29uZHMtPW51bWJlck9mVW5pdHMqdW5pdDtwYXJ0cy5wdXNoKGAke251bWJlck9mVW5pdHN9XHhhMCR7bGFiZWx9YCk7fX0pO3JldHVybiBwYXJ0cy5qb2luKCcgJyk7fQpzdGF0aWMgZ2V0VVJMRGlzcGxheU5hbWUocGFyc2VkVXJsLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e251bVBhdGhQYXJ0czp1bmRlZmluZWQscHJlc2VydmVRdWVyeTp1bmRlZmluZWQscHJlc2VydmVIb3N0OnVuZGVmaW5lZH07Y29uc3QgbnVtUGF0aFBhcnRzPW9wdGlvbnMubnVtUGF0aFBhcnRzIT09dW5kZWZpbmVkP29wdGlvbnMubnVtUGF0aFBhcnRzOjI7Y29uc3QgcHJlc2VydmVRdWVyeT1vcHRpb25zLnByZXNlcnZlUXVlcnkhPT11bmRlZmluZWQ/b3B0aW9ucy5wcmVzZXJ2ZVF1ZXJ5OnRydWU7Y29uc3QgcHJlc2VydmVIb3N0PW9wdGlvbnMucHJlc2VydmVIb3N0fHxmYWxzZTtsZXQgbmFtZTtpZihwYXJzZWRVcmwucHJvdG9jb2w9PT0nYWJvdXQ6J3x8cGFyc2VkVXJsLnByb3RvY29sPT09J2RhdGE6Jyl7bmFtZT1wYXJzZWRVcmwuaHJlZjt9ZWxzZXtuYW1lPXBhcnNlZFVybC5wYXRobmFtZTtjb25zdCBwYXJ0cz1uYW1lLnNwbGl0KCcvJykuZmlsdGVyKHBhcnQ9PnBhcnQubGVuZ3RoKTtpZihudW1QYXRoUGFydHMmJnBhcnRzLmxlbmd0aD5udW1QYXRoUGFydHMpe25hbWU9RUxMSVBTSVMrcGFydHMuc2xpY2UoLTEqbnVtUGF0aFBhcnRzKS5qb2luKCcvJyk7fQppZihwcmVzZXJ2ZUhvc3Qpe25hbWU9YCR7cGFyc2VkVXJsLmhvc3R9LyR7bmFtZS5yZXBsYWNlKC9eXC8vLCAnJyl9YDt9CmlmKHByZXNlcnZlUXVlcnkpe25hbWU9YCR7bmFtZX0ke3BhcnNlZFVybC5zZWFyY2h9YDt9fQpjb25zdCBNQVhfTEVOR1RIPTY0O25hbWU9bmFtZS5yZXBsYWNlKC8oW2EtZjAtOV17N30pW2EtZjAtOV17MTN9W2EtZjAtOV0qL2csYCQxJHtFTExJUFNJU31gKTtuYW1lPW5hbWUucmVwbGFjZSgvKFthLXpBLVowLTktX117OX0pKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qWzAtOV0pW2EtekEtWjAtOS1fXXsxMCx9L2csYCQxJHtFTExJUFNJU31gKTtuYW1lPW5hbWUucmVwbGFjZSgvKFxkezN9KVxkezYsfS9nLGAkMSR7RUxMSVBTSVN9YCk7bmFtZT1uYW1lLnJlcGxhY2UoL1x1MjAyNisvZyxFTExJUFNJUyk7aWYobmFtZS5sZW5ndGg+TUFYX0xFTkdUSCYmbmFtZS5pbmNsdWRlcygnPycpKXtuYW1lPW5hbWUucmVwbGFjZSgvXD8oW149XSopKD0pPy4qLyxgPyQxJDIke0VMTElQU0lTfWApO2lmKG5hbWUubGVuZ3RoPk1BWF9MRU5HVEgpe25hbWU9bmFtZS5yZXBsYWNlKC9cPy4qLyxgPyR7RUxMSVBTSVN9YCk7fX0KaWYobmFtZS5sZW5ndGg+TUFYX0xFTkdUSCl7Y29uc3QgZG90SW5kZXg9bmFtZS5sYXN0SW5kZXhPZignLicpO2lmKGRvdEluZGV4Pj0wKXtuYW1lPW5hbWUuc2xpY2UoMCxNQVhfTEVOR1RILTEtKG5hbWUubGVuZ3RoLWRvdEluZGV4KSkrYCR7RUxMSVBTSVN9JHtuYW1lLnNsaWNlKGRvdEluZGV4KX1gO31lbHNle25hbWU9bmFtZS5zbGljZSgwLE1BWF9MRU5HVEgtMSkrRUxMSVBTSVM7fX0KcmV0dXJuIG5hbWU7fQpzdGF0aWMgcGFyc2VVUkwodXJsKXtjb25zdCBwYXJzZWRVcmw9bmV3IFVSTCh1cmwpO3JldHVybntmaWxlOlV0aWwuZ2V0VVJMRGlzcGxheU5hbWUocGFyc2VkVXJsKSxob3N0bmFtZTpwYXJzZWRVcmwuaG9zdG5hbWUsb3JpZ2luOnBhcnNlZFVybC5vcmlnaW4sfTt9CnN0YXRpYyBjaGFpbkR1cmF0aW9uKHN0YXJ0VGltZSxlbmRUaW1lKXtyZXR1cm4gVXRpbC5mb3JtYXROdW1iZXIoKGVuZFRpbWUtc3RhcnRUaW1lKSoxMDAwKTt9CnN0YXRpYyBnZXRFbnZpcm9ubWVudERpc3BsYXlWYWx1ZXMoc2V0dGluZ3Mpe2NvbnN0IGVtdWxhdGlvbkRlc2M9VXRpbC5nZXRFbXVsYXRpb25EZXNjcmlwdGlvbnMoc2V0dGluZ3MpO3JldHVyblt7bmFtZTonRGV2aWNlJyxkZXNjcmlwdGlvbjplbXVsYXRpb25EZXNjLmRldmljZUVtdWxhdGlvbix9LHtuYW1lOidOZXR3b3JrIHRocm90dGxpbmcnLGRlc2NyaXB0aW9uOmVtdWxhdGlvbkRlc2MubmV0d29ya1Rocm90dGxpbmcsfSx7bmFtZTonQ1BVIHRocm90dGxpbmcnLGRlc2NyaXB0aW9uOmVtdWxhdGlvbkRlc2MuY3B1VGhyb3R0bGluZyx9LF07fQpzdGF0aWMgZ2V0RW11bGF0aW9uRGVzY3JpcHRpb25zKHNldHRpbmdzKXtsZXQgY3B1VGhyb3R0bGluZztsZXQgbmV0d29ya1Rocm90dGxpbmc7bGV0IHN1bW1hcnk7Y29uc3QgdGhyb3R0bGluZz1zZXR0aW5ncy50aHJvdHRsaW5nO3N3aXRjaChzZXR0aW5ncy50aHJvdHRsaW5nTWV0aG9kKXtjYXNlJ3Byb3ZpZGVkJzpjcHVUaHJvdHRsaW5nPSdQcm92aWRlZCBieSBlbnZpcm9ubWVudCc7bmV0d29ya1Rocm90dGxpbmc9J1Byb3ZpZGVkIGJ5IGVudmlyb25tZW50JztzdW1tYXJ5PSdObyB0aHJvdHRsaW5nIGFwcGxpZWQnO2JyZWFrO2Nhc2UnZGV2dG9vbHMnOntjb25zdHtjcHVTbG93ZG93bk11bHRpcGxpZXIscmVxdWVzdExhdGVuY3lNc309dGhyb3R0bGluZztjcHVUaHJvdHRsaW5nPWAke1V0aWwuZm9ybWF0TnVtYmVyKGNwdVNsb3dkb3duTXVsdGlwbGllcil9eCBzbG93ZG93biAoRGV2VG9vbHMpYDtuZXR3b3JrVGhyb3R0bGluZz1gJHtVdGlsLmZvcm1hdE51bWJlcihyZXF1ZXN0TGF0ZW5jeU1zKX0ke05CU1B9bXMgSFRUUCBSVFQsIGArYCR7VXRpbC5mb3JtYXROdW1iZXIodGhyb3R0bGluZy5kb3dubG9hZFRocm91Z2hwdXRLYnBzKX0ke05CU1B9S2JwcyBkb3duLCBgK2Ake1V0aWwuZm9ybWF0TnVtYmVyKHRocm90dGxpbmcudXBsb2FkVGhyb3VnaHB1dEticHMpfSR7TkJTUH1LYnBzIHVwIChEZXZUb29scylgO3N1bW1hcnk9J1Rocm90dGxlZCBGYXN0IDNHIG5ldHdvcmsnO2JyZWFrO30KY2FzZSdzaW11bGF0ZSc6e2NvbnN0e2NwdVNsb3dkb3duTXVsdGlwbGllcixydHRNcyx0aHJvdWdocHV0S2Jwc309dGhyb3R0bGluZztjcHVUaHJvdHRsaW5nPWAke1V0aWwuZm9ybWF0TnVtYmVyKGNwdVNsb3dkb3duTXVsdGlwbGllcil9eCBzbG93ZG93biAoU2ltdWxhdGVkKWA7bmV0d29ya1Rocm90dGxpbmc9YCR7VXRpbC5mb3JtYXROdW1iZXIocnR0TXMpfSR7TkJTUH1tcyBUQ1AgUlRULCBgK2Ake1V0aWwuZm9ybWF0TnVtYmVyKHRocm91Z2hwdXRLYnBzKX0ke05CU1B9S2JwcyB0aHJvdWdocHV0IChTaW11bGF0ZWQpYDtzdW1tYXJ5PSdTaW11bGF0ZWQgRmFzdCAzRyBuZXR3b3JrJzticmVhazt9CmRlZmF1bHQ6Y3B1VGhyb3R0bGluZz0nVW5rbm93bic7bmV0d29ya1Rocm90dGxpbmc9J1Vua25vd24nO3N1bW1hcnk9J1Vua25vd24nO30KY29uc3QgZGV2aWNlRW11bGF0aW9uPXNldHRpbmdzLmRpc2FibGVEZXZpY2VFbXVsYXRpb24/J05vIGVtdWxhdGlvbic6J0VtdWxhdGVkIE5leHVzIDVYJztyZXR1cm57ZGV2aWNlRW11bGF0aW9uLGNwdVRocm90dGxpbmcsbmV0d29ya1Rocm90dGxpbmcsc3VtbWFyeTpgJHtkZXZpY2VFbXVsYXRpb259LCAke3N1bW1hcnl9YCx9O319CmlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyYmbW9kdWxlLmV4cG9ydHMpe21vZHVsZS5leHBvcnRzPVV0aWw7fWVsc2V7c2VsZi5VdGlsPVV0aWw7fTsndXNlIHN0cmljdCc7Y2xhc3MgRE9Ne2NvbnN0cnVjdG9yKGRvY3VtZW50KXt0aGlzLl9kb2N1bWVudD1kb2N1bWVudDt9CmNyZWF0ZUVsZW1lbnQobmFtZSxjbGFzc05hbWUsYXR0cnM9e30pe2NvbnN0IGVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtpZihjbGFzc05hbWUpe2VsZW1lbnQuY2xhc3NOYW1lPWNsYXNzTmFtZTt9Ck9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleT0+e2NvbnN0IHZhbHVlPWF0dHJzW2tleV07aWYodHlwZW9mIHZhbHVlIT09J3VuZGVmaW5lZCcpe2VsZW1lbnQuc2V0QXR0cmlidXRlKGtleSx2YWx1ZSk7fX0pO3JldHVybiBlbGVtZW50O30KY3JlYXRlRnJhZ21lbnQoKXtyZXR1cm4gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO30KY3JlYXRlQ2hpbGRPZihwYXJlbnRFbGVtLGVsZW1lbnROYW1lLGNsYXNzTmFtZSxhdHRycyl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUsY2xhc3NOYW1lLGF0dHJzKTtwYXJlbnRFbGVtLmFwcGVuZENoaWxkKGVsZW1lbnQpO3JldHVybiBlbGVtZW50O30KY2xvbmVUZW1wbGF0ZShzZWxlY3Rvcixjb250ZXh0KXtjb25zdCB0ZW1wbGF0ZT0oY29udGV4dC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSk7aWYoIXRlbXBsYXRlKXt0aHJvdyBuZXcgRXJyb3IoYFRlbXBsYXRlIG5vdCBmb3VuZDogdGVtcGxhdGUke3NlbGVjdG9yfWApO30KY29uc3QgY2xvbmU9dGhpcy5fZG9jdW1lbnQuaW1wb3J0Tm9kZSh0ZW1wbGF0ZS5jb250ZW50LHRydWUpO2lmKHRlbXBsYXRlLmhhc0F0dHJpYnV0ZSgnZGF0YS1zdGFtcGVkJykpe3RoaXMuZmluZEFsbCgnc3R5bGUnLGNsb25lKS5mb3JFYWNoKHN0eWxlPT5zdHlsZS5yZW1vdmUoKSk7fQp0ZW1wbGF0ZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhbXBlZCcsJ3RydWUnKTtyZXR1cm4gY2xvbmU7fQpyZXNldFRlbXBsYXRlcygpe3RoaXMuZmluZEFsbCgndGVtcGxhdGVbZGF0YS1zdGFtcGVkXScsdGhpcy5fZG9jdW1lbnQpLmZvckVhY2godD0+e3QucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXN0YW1wZWQnKTt9KTt9CmNvbnZlcnRNYXJrZG93bkxpbmtTbmlwcGV0cyh0ZXh0KXtjb25zdCBlbGVtZW50PXRoaXMuY3JlYXRlRWxlbWVudCgnc3BhbicpO2NvbnN0IHBhcnRzPXRleHQuc3BsaXQoL1xbKFteXF1dKj8pXF1cKChodHRwcz86XC9cLy4qPylcKS9nKTt3aGlsZShwYXJ0cy5sZW5ndGgpe2NvbnN0W3ByZWFtYmxlVGV4dCxsaW5rVGV4dCxsaW5rSHJlZl09cGFydHMuc3BsaWNlKDAsMyk7ZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwcmVhbWJsZVRleHQpKTtpZihsaW5rVGV4dCYmbGlua0hyZWYpe2NvbnN0IGE9KHRoaXMuY3JlYXRlRWxlbWVudCgnYScpKTthLnJlbD0nbm9vcGVuZXInO2EudGFyZ2V0PSdfYmxhbmsnO2EudGV4dENvbnRlbnQ9bGlua1RleHQ7YS5ocmVmPShuZXcgVVJMKGxpbmtIcmVmKSkuaHJlZjtlbGVtZW50LmFwcGVuZENoaWxkKGEpO319CnJldHVybiBlbGVtZW50O30KY29udmVydE1hcmtkb3duQ29kZVNuaXBwZXRzKHRleHQpe2NvbnN0IGVsZW1lbnQ9dGhpcy5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Y29uc3QgcGFydHM9dGV4dC5zcGxpdCgvYCguKj8pYC9nKTt3aGlsZShwYXJ0cy5sZW5ndGgpe2NvbnN0W3ByZWFtYmxlVGV4dCxjb2RlVGV4dF09cGFydHMuc3BsaWNlKDAsMik7ZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwcmVhbWJsZVRleHQpKTtpZihjb2RlVGV4dCl7Y29uc3QgcHJlPSh0aGlzLmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKSk7cHJlLnRleHRDb250ZW50PWNvZGVUZXh0O2VsZW1lbnQuYXBwZW5kQ2hpbGQocHJlKTt9fQpyZXR1cm4gZWxlbWVudDt9CmRvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50O30KaXNEZXZUb29scygpe3JldHVybiEhdGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxoLWRldnRvb2xzJyk7fQpmaW5kKHF1ZXJ5LGNvbnRleHQpe2NvbnN0IHJlc3VsdD1jb250ZXh0LnF1ZXJ5U2VsZWN0b3IocXVlcnkpO2lmKHJlc3VsdD09PW51bGwpe3Rocm93IG5ldyBFcnJvcihgcXVlcnkgJHtxdWVyeX0gbm90IGZvdW5kYCk7fQpyZXR1cm4gcmVzdWx0O30KZmluZEFsbChxdWVyeSxjb250ZXh0KXtyZXR1cm4gQXJyYXkuZnJvbShjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpKTt9fQppZih0eXBlb2YgbW9kdWxlIT09J3VuZGVmaW5lZCcmJm1vZHVsZS5leHBvcnRzKXttb2R1bGUuZXhwb3J0cz1ET007fWVsc2V7c2VsZi5ET009RE9NO307J3VzZSBzdHJpY3QnO2NsYXNzIENhdGVnb3J5UmVuZGVyZXJ7Y29uc3RydWN0b3IoZG9tLGRldGFpbHNSZW5kZXJlcil7dGhpcy5kb209ZG9tO3RoaXMuZGV0YWlsc1JlbmRlcmVyPWRldGFpbHNSZW5kZXJlcjt0aGlzLnRlbXBsYXRlQ29udGV4dD10aGlzLmRvbS5kb2N1bWVudCgpO3RoaXMuZGV0YWlsc1JlbmRlcmVyLnNldFRlbXBsYXRlQ29udGV4dCh0aGlzLnRlbXBsYXRlQ29udGV4dCk7fQpyZW5kZXJBdWRpdChhdWRpdCxpbmRleCl7Y29uc3QgdG1wbD10aGlzLmRvbS5jbG9uZVRlbXBsYXRlKCcjdG1wbC1saC1hdWRpdCcsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO3JldHVybiB0aGlzLnBvcHVsYXRlQXVkaXRWYWx1ZXMoYXVkaXQsaW5kZXgsdG1wbCk7fQpwb3B1bGF0ZUF1ZGl0VmFsdWVzKGF1ZGl0LGluZGV4LHRtcGwpe2NvbnN0IGF1ZGl0RWw9dGhpcy5kb20uZmluZCgnLmxoLWF1ZGl0Jyx0bXBsKTthdWRpdEVsLmlkPWF1ZGl0LnJlc3VsdC5pZDtjb25zdCBzY29yZURpc3BsYXlNb2RlPWF1ZGl0LnJlc3VsdC5zY29yZURpc3BsYXlNb2RlO2lmKGF1ZGl0LnJlc3VsdC5kaXNwbGF5VmFsdWUpe2NvbnN0IGRpc3BsYXlWYWx1ZT1VdGlsLmZvcm1hdERpc3BsYXlWYWx1ZShhdWRpdC5yZXN1bHQuZGlzcGxheVZhbHVlKTt0aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCcsYXVkaXRFbCkudGV4dENvbnRlbnQ9ZGlzcGxheVZhbHVlO30KY29uc3QgdGl0bGVFbD10aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX3RpdGxlJyxhdWRpdEVsKTt0aXRsZUVsLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnZlcnRNYXJrZG93bkNvZGVTbmlwcGV0cyhhdWRpdC5yZXN1bHQudGl0bGUpKTt0aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX2Rlc2NyaXB0aW9uJyxhdWRpdEVsKS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jb252ZXJ0TWFya2Rvd25MaW5rU25pcHBldHMoYXVkaXQucmVzdWx0LmRlc2NyaXB0aW9uKSk7Y29uc3QgaGVhZGVyPSh0aGlzLmRvbS5maW5kKCdkZXRhaWxzJyxhdWRpdEVsKSk7aWYoYXVkaXQucmVzdWx0LmRldGFpbHMmJmF1ZGl0LnJlc3VsdC5kZXRhaWxzLnR5cGUpe2NvbnN0IGVsZW09dGhpcy5kZXRhaWxzUmVuZGVyZXIucmVuZGVyKGF1ZGl0LnJlc3VsdC5kZXRhaWxzKTtlbGVtLmNsYXNzTGlzdC5hZGQoJ2xoLWRldGFpbHMnKTtoZWFkZXIuYXBwZW5kQ2hpbGQoZWxlbSk7fQp0aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX2luZGV4JyxhdWRpdEVsKS50ZXh0Q29udGVudD1gJHtpbmRleCArIDF9YDt0aGlzLmRvbS5maW5kKCcubGgtY2hldnJvbi1jb250YWluZXInLGF1ZGl0RWwpLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUNoZXZyb24oKSk7dGhpcy5fc2V0UmF0aW5nQ2xhc3MoYXVkaXRFbCxhdWRpdC5yZXN1bHQuc2NvcmUsc2NvcmVEaXNwbGF5TW9kZSk7aWYoYXVkaXQucmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT0nZXJyb3InKXthdWRpdEVsLmNsYXNzTGlzdC5hZGQoYGxoLWF1ZGl0LS1lcnJvcmApO2NvbnN0IHRleHRFbD10aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCcsYXVkaXRFbCk7dGV4dEVsLnRleHRDb250ZW50PSdFcnJvciEnO3RleHRFbC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwLWJvdW5kYXJ5Jyk7Y29uc3QgdG9vbHRpcD10aGlzLmRvbS5jcmVhdGVDaGlsZE9mKHRleHRFbCwnZGl2JywndG9vbHRpcCB0b29sdGlwLS1lcnJvcicpO3Rvb2x0aXAudGV4dENvbnRlbnQ9YXVkaXQucmVzdWx0LmVycm9yTWVzc2FnZXx8J1JlcG9ydCBlcnJvcjogbm8gYXVkaXQgaW5mb3JtYXRpb24nO31lbHNlIGlmKGF1ZGl0LnJlc3VsdC5leHBsYW5hdGlvbil7Y29uc3QgZXhwbEVsPXRoaXMuZG9tLmNyZWF0ZUNoaWxkT2YodGl0bGVFbCwnZGl2JywnbGgtYXVkaXQtZXhwbGFuYXRpb24nKTtleHBsRWwudGV4dENvbnRlbnQ9YXVkaXQucmVzdWx0LmV4cGxhbmF0aW9uO30KY29uc3Qgd2FybmluZ3M9YXVkaXQucmVzdWx0Lndhcm5pbmdzO2lmKCF3YXJuaW5nc3x8d2FybmluZ3MubGVuZ3RoPT09MClyZXR1cm4gYXVkaXRFbDtjb25zdCB3YXJuaW5nc0VsPXRoaXMuZG9tLmNyZWF0ZUNoaWxkT2YodGl0bGVFbCwnZGl2JywnbGgtd2FybmluZ3MnKTtpZih3YXJuaW5ncy5sZW5ndGg9PT0xKXt3YXJuaW5nc0VsLnRleHRDb250ZW50PWBXYXJuaW5nOiAke3dhcm5pbmdzLmpvaW4oJycpfWA7fWVsc2V7d2FybmluZ3NFbC50ZXh0Q29udGVudD0nV2FybmluZ3M6ICc7Y29uc3Qgd2FybmluZ3NVbD10aGlzLmRvbS5jcmVhdGVDaGlsZE9mKHdhcm5pbmdzRWwsJ3VsJyk7Zm9yKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3Mpe2NvbnN0IGl0ZW09dGhpcy5kb20uY3JlYXRlQ2hpbGRPZih3YXJuaW5nc1VsLCdsaScpO2l0ZW0udGV4dENvbnRlbnQ9d2FybmluZzt9fQpyZXR1cm4gYXVkaXRFbDt9Cl9jcmVhdGVDaGV2cm9uKCl7Y29uc3QgY2hldnJvblRtcGw9dGhpcy5kb20uY2xvbmVUZW1wbGF0ZSgnI3RtcGwtbGgtY2hldnJvbicsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGNoZXZyb25FbD10aGlzLmRvbS5maW5kKCcubGgtY2hldnJvbicsY2hldnJvblRtcGwpO3JldHVybiBjaGV2cm9uRWw7fQpfc2V0UmF0aW5nQ2xhc3MoZWxlbWVudCxzY29yZSxzY29yZURpc3BsYXlNb2RlKXtjb25zdCByYXRpbmc9VXRpbC5jYWxjdWxhdGVSYXRpbmcoc2NvcmUsc2NvcmVEaXNwbGF5TW9kZSk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBsaC1hdWRpdC0tJHtyYXRpbmd9YCxgbGgtYXVkaXQtLSR7c2NvcmVEaXNwbGF5TW9kZX1gKTtyZXR1cm4gZWxlbWVudDt9CnJlbmRlckNhdGVnb3J5SGVhZGVyKGNhdGVnb3J5KXtjb25zdCB0bXBsPXRoaXMuZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLWNhdGVnb3J5LWhlYWRlcicsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGdhdWdlQ29udGFpbmVyRWw9dGhpcy5kb20uZmluZCgnLmxoLXNjb3JlX19nYXVnZScsdG1wbCk7Y29uc3QgZ2F1Z2VFbD10aGlzLnJlbmRlclNjb3JlR2F1Z2UoY2F0ZWdvcnkpO2dhdWdlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoZ2F1Z2VFbCk7dGhpcy5kb20uZmluZCgnLmxoLWNhdGVnb3J5LWhlYWRlcl9fdGl0bGUnLHRtcGwpLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnZlcnRNYXJrZG93bkNvZGVTbmlwcGV0cyhjYXRlZ29yeS50aXRsZSkpO2lmKGNhdGVnb3J5LmRlc2NyaXB0aW9uKXtjb25zdCBkZXNjRWw9dGhpcy5kb20uY29udmVydE1hcmtkb3duTGlua1NuaXBwZXRzKGNhdGVnb3J5LmRlc2NyaXB0aW9uKTt0aGlzLmRvbS5maW5kKCcubGgtY2F0ZWdvcnktaGVhZGVyX19kZXNjcmlwdGlvbicsdG1wbCkuYXBwZW5kQ2hpbGQoZGVzY0VsKTt9CnJldHVybih0bXBsLmZpcnN0RWxlbWVudENoaWxkKTt9CnJlbmRlckF1ZGl0R3JvdXAoZ3JvdXAsb3B0cyl7Y29uc3QgZXhwYW5kYWJsZT1vcHRzLmV4cGFuZGFibGU7Y29uc3QgZ3JvdXBFbD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KGV4cGFuZGFibGU/J2RldGFpbHMnOidkaXYnLCdsaC1hdWRpdC1ncm91cCcpO2NvbnN0IHN1bW1tYXJ5RWw9dGhpcy5kb20uY3JlYXRlQ2hpbGRPZihncm91cEVsLCdzdW1tYXJ5JywnbGgtYXVkaXQtZ3JvdXBfX3N1bW1hcnknKTtjb25zdCBoZWFkZXJFbD10aGlzLmRvbS5jcmVhdGVDaGlsZE9mKHN1bW1tYXJ5RWwsJ2RpdicsJ2xoLWF1ZGl0LWdyb3VwX19oZWFkZXInKTtjb25zdCBpdGVtQ291bnRFbD10aGlzLmRvbS5jcmVhdGVDaGlsZE9mKHN1bW1tYXJ5RWwsJ2RpdicsJ2xoLWF1ZGl0LWdyb3VwX19pdGVtY291bnQnKTtpZihleHBhbmRhYmxlKXtjb25zdCBjaGV2cm9uRWw9c3VtbW1hcnlFbC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVDaGV2cm9uKCkpO2NoZXZyb25FbC50aXRsZT0nU2hvdyBhdWRpdHMnO30KaWYoZ3JvdXAuZGVzY3JpcHRpb24pe2NvbnN0IGF1ZGl0R3JvdXBEZXNjcmlwdGlvbj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCdkaXYnLCdsaC1hdWRpdC1ncm91cF9fZGVzY3JpcHRpb24nKTthdWRpdEdyb3VwRGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udmVydE1hcmtkb3duTGlua1NuaXBwZXRzKGdyb3VwLmRlc2NyaXB0aW9uKSk7Z3JvdXBFbC5hcHBlbmRDaGlsZChhdWRpdEdyb3VwRGVzY3JpcHRpb24pO30KaGVhZGVyRWwudGV4dENvbnRlbnQ9Z3JvdXAudGl0bGU7aWYob3B0cy5pdGVtQ291bnQpe2l0ZW1Db3VudEVsLnRleHRDb250ZW50PWAke29wdHMuaXRlbUNvdW50fSBhdWRpdHNgO30KcmV0dXJuIGdyb3VwRWw7fQpfZ2V0VG90YWxBdWRpdHNMZW5ndGgoZWxlbWVudHMpe2NvbnN0IHNjcmF0Y2g9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgnZGl2Jyk7ZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KXtzY3JhdGNoLmFwcGVuZENoaWxkKGVsZW1lbnQpO30pO2NvbnN0IHN1YkF1ZGl0cz1zY3JhdGNoLnF1ZXJ5U2VsZWN0b3JBbGwoJy5saC1hdWRpdCcpO2lmKHN1YkF1ZGl0cy5sZW5ndGgpe3JldHVybiBzdWJBdWRpdHMubGVuZ3RoO31lbHNle3JldHVybiBlbGVtZW50cy5sZW5ndGg7fX0KX3JlbmRlckZhaWxlZEF1ZGl0c1NlY3Rpb24oZWxlbWVudHMpe2NvbnN0IGZhaWxlZEVsZW09dGhpcy5kb20uY3JlYXRlRWxlbWVudCgnZGl2Jyk7ZmFpbGVkRWxlbS5jbGFzc0xpc3QuYWRkKCdsaC1mYWlsZWQtYXVkaXRzJyk7ZWxlbWVudHMuZm9yRWFjaChlbGVtPT5mYWlsZWRFbGVtLmFwcGVuZENoaWxkKGVsZW0pKTtyZXR1cm4gZmFpbGVkRWxlbTt9CnJlbmRlclBhc3NlZEF1ZGl0c1NlY3Rpb24oZWxlbWVudHMpe2NvbnN0IHBhc3NlZEVsZW09dGhpcy5yZW5kZXJBdWRpdEdyb3VwKHt0aXRsZTpgUGFzc2VkIGF1ZGl0c2AsfSx7ZXhwYW5kYWJsZTp0cnVlLGl0ZW1Db3VudDp0aGlzLl9nZXRUb3RhbEF1ZGl0c0xlbmd0aChlbGVtZW50cyl9KTtwYXNzZWRFbGVtLmNsYXNzTGlzdC5hZGQoJ2xoLXBhc3NlZC1hdWRpdHMnKTtlbGVtZW50cy5mb3JFYWNoKGVsZW09PnBhc3NlZEVsZW0uYXBwZW5kQ2hpbGQoZWxlbSkpO3JldHVybiBwYXNzZWRFbGVtO30KX3JlbmRlck5vdEFwcGxpY2FibGVBdWRpdHNTZWN0aW9uKGVsZW1lbnRzKXtjb25zdCBub3RBcHBsaWNhYmxlRWxlbT10aGlzLnJlbmRlckF1ZGl0R3JvdXAoe3RpdGxlOmBOb3QgYXBwbGljYWJsZWAsfSx7ZXhwYW5kYWJsZTp0cnVlLGl0ZW1Db3VudDp0aGlzLl9nZXRUb3RhbEF1ZGl0c0xlbmd0aChlbGVtZW50cyl9KTtub3RBcHBsaWNhYmxlRWxlbS5jbGFzc0xpc3QuYWRkKCdsaC1hdWRpdC1ncm91cC0tbm90LWFwcGxpY2FibGUnKTtlbGVtZW50cy5mb3JFYWNoKGVsZW09Pm5vdEFwcGxpY2FibGVFbGVtLmFwcGVuZENoaWxkKGVsZW0pKTtyZXR1cm4gbm90QXBwbGljYWJsZUVsZW07fQpfcmVuZGVyTWFudWFsQXVkaXRzKG1hbnVhbEF1ZGl0cyxtYW51YWxEZXNjcmlwdGlvbil7Y29uc3QgZ3JvdXA9e3RpdGxlOidBZGRpdGlvbmFsIGl0ZW1zIHRvIG1hbnVhbGx5IGNoZWNrJyxkZXNjcmlwdGlvbjptYW51YWxEZXNjcmlwdGlvbn07Y29uc3QgYXVkaXRHcm91cEVsZW09dGhpcy5yZW5kZXJBdWRpdEdyb3VwKGdyb3VwLHtleHBhbmRhYmxlOnRydWUsaXRlbUNvdW50Om1hbnVhbEF1ZGl0cy5sZW5ndGh9KTthdWRpdEdyb3VwRWxlbS5jbGFzc0xpc3QuYWRkKCdsaC1hdWRpdC1ncm91cC0tbWFudWFsJyk7bWFudWFsQXVkaXRzLmZvckVhY2goKGF1ZGl0LGkpPT57YXVkaXRHcm91cEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJBdWRpdChhdWRpdCxpKSk7fSk7cmV0dXJuIGF1ZGl0R3JvdXBFbGVtO30Kc2V0VGVtcGxhdGVDb250ZXh0KGNvbnRleHQpe3RoaXMudGVtcGxhdGVDb250ZXh0PWNvbnRleHQ7dGhpcy5kZXRhaWxzUmVuZGVyZXIuc2V0VGVtcGxhdGVDb250ZXh0KGNvbnRleHQpO30KcmVuZGVyU2NvcmVHYXVnZShjYXRlZ29yeSl7Y29uc3QgdG1wbD10aGlzLmRvbS5jbG9uZVRlbXBsYXRlKCcjdG1wbC1saC1nYXVnZScsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IHdyYXBwZXI9KHRoaXMuZG9tLmZpbmQoJy5saC1nYXVnZV9fd3JhcHBlcicsdG1wbCkpO3dyYXBwZXIuaHJlZj1gIyR7Y2F0ZWdvcnkuaWR9YDt3cmFwcGVyLmNsYXNzTGlzdC5hZGQoYGxoLWdhdWdlX193cmFwcGVyLS0ke1V0aWwuY2FsY3VsYXRlUmF0aW5nKGNhdGVnb3J5LnNjb3JlKX1gKTtjb25zdCBudW1lcmljU2NvcmU9TnVtYmVyKGNhdGVnb3J5LnNjb3JlKTtjb25zdCBnYXVnZT10aGlzLmRvbS5maW5kKCcubGgtZ2F1Z2UnLHRtcGwpO2NvbnN0IGdhdWdlQXJjPWdhdWdlLnF1ZXJ5U2VsZWN0b3IoJy5saC1nYXVnZS1hcmMnKTtpZihnYXVnZUFyYyl7Z2F1Z2VBcmMuc3R5bGUuc3Ryb2tlRGFzaGFycmF5PWAke251bWVyaWNTY29yZSAqIDMyOX0gMzI5YDt9CmNvbnN0IHNjb3JlT3V0T2YxMDA9TWF0aC5yb3VuZChudW1lcmljU2NvcmUqMTAwKTtjb25zdCBwZXJjZW50YWdlRWw9dGhpcy5kb20uZmluZCgnLmxoLWdhdWdlX19wZXJjZW50YWdlJyx0bXBsKTtwZXJjZW50YWdlRWwudGV4dENvbnRlbnQ9c2NvcmVPdXRPZjEwMC50b1N0cmluZygpO2lmKGNhdGVnb3J5LnNjb3JlPT09bnVsbCl7cGVyY2VudGFnZUVsLnRleHRDb250ZW50PSc/JztwZXJjZW50YWdlRWwudGl0bGU9J0Vycm9ycyBvY2N1cnJlZCB3aGlsZSBhdWRpdGluZyc7fQp0aGlzLmRvbS5maW5kKCcubGgtZ2F1Z2VfX2xhYmVsJyx0bXBsKS50ZXh0Q29udGVudD1jYXRlZ29yeS50aXRsZTtyZXR1cm4gdG1wbDt9CnJlbmRlcihjYXRlZ29yeSxncm91cERlZmluaXRpb25zKXtjb25zdCBlbGVtZW50PXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLWNhdGVnb3J5Jyk7dGhpcy5jcmVhdGVQZXJtYWxpbmtTcGFuKGVsZW1lbnQsY2F0ZWdvcnkuaWQpO2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJDYXRlZ29yeUhlYWRlcihjYXRlZ29yeSkpO2NvbnN0IGF1ZGl0UmVmcz1jYXRlZ29yeS5hdWRpdFJlZnM7Y29uc3QgbWFudWFsQXVkaXRzPWF1ZGl0UmVmcy5maWx0ZXIoYXVkaXQ9PmF1ZGl0LnJlc3VsdC5zY29yZURpc3BsYXlNb2RlPT09J21hbnVhbCcpO2NvbnN0IG5vbk1hbnVhbEF1ZGl0cz1hdWRpdFJlZnMuZmlsdGVyKGF1ZGl0PT4hbWFudWFsQXVkaXRzLmluY2x1ZGVzKGF1ZGl0KSk7Y29uc3QgYXVkaXRzR3JvdXBlZEJ5R3JvdXA9e307Y29uc3QgYXVkaXRzVW5ncm91cGVkPXtwYXNzZWQ6W10sZmFpbGVkOltdLG5vdEFwcGxpY2FibGU6W119O25vbk1hbnVhbEF1ZGl0cy5mb3JFYWNoKGF1ZGl0UmVmPT57bGV0IGdyb3VwO2lmKGF1ZGl0UmVmLmdyb3VwKXtjb25zdCBncm91cElkPWF1ZGl0UmVmLmdyb3VwO2lmKGF1ZGl0c0dyb3VwZWRCeUdyb3VwW2dyb3VwSWRdKXtncm91cD1hdWRpdHNHcm91cGVkQnlHcm91cFtncm91cElkXTt9ZWxzZXtncm91cD17cGFzc2VkOltdLGZhaWxlZDpbXSxub3RBcHBsaWNhYmxlOltdfTthdWRpdHNHcm91cGVkQnlHcm91cFtncm91cElkXT1ncm91cDt9fWVsc2V7Z3JvdXA9YXVkaXRzVW5ncm91cGVkO30KaWYoYXVkaXRSZWYucmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT0nbm90LWFwcGxpY2FibGUnKXtncm91cC5ub3RBcHBsaWNhYmxlLnB1c2goYXVkaXRSZWYpO31lbHNlIGlmKFV0aWwuc2hvd0FzUGFzc2VkKGF1ZGl0UmVmLnJlc3VsdCkpe2dyb3VwLnBhc3NlZC5wdXNoKGF1ZGl0UmVmKTt9ZWxzZXtncm91cC5mYWlsZWQucHVzaChhdWRpdFJlZik7fX0pO2NvbnN0IGZhaWxlZEVsZW1lbnRzPShbXSk7Y29uc3QgcGFzc2VkRWxlbWVudHM9KFtdKTtjb25zdCBub3RBcHBsaWNhYmxlRWxlbWVudHM9KFtdKTthdWRpdHNVbmdyb3VwZWQuZmFpbGVkLmZvckVhY2goKGF1ZGl0LGkpPT5mYWlsZWRFbGVtZW50cy5wdXNoKHRoaXMucmVuZGVyQXVkaXQoYXVkaXQsaSkpKTthdWRpdHNVbmdyb3VwZWQucGFzc2VkLmZvckVhY2goKGF1ZGl0LGkpPT5wYXNzZWRFbGVtZW50cy5wdXNoKHRoaXMucmVuZGVyQXVkaXQoYXVkaXQsaSkpKTthdWRpdHNVbmdyb3VwZWQubm90QXBwbGljYWJsZS5mb3JFYWNoKChhdWRpdCxpKT0+bm90QXBwbGljYWJsZUVsZW1lbnRzLnB1c2godGhpcy5yZW5kZXJBdWRpdChhdWRpdCxpKSkpO09iamVjdC5rZXlzKGF1ZGl0c0dyb3VwZWRCeUdyb3VwKS5mb3JFYWNoKGdyb3VwSWQ9PntpZighZ3JvdXBEZWZpbml0aW9ucylyZXR1cm47Y29uc3QgZ3JvdXA9Z3JvdXBEZWZpbml0aW9uc1tncm91cElkXTtjb25zdCBncm91cHM9YXVkaXRzR3JvdXBlZEJ5R3JvdXBbZ3JvdXBJZF07aWYoZ3JvdXBzLmZhaWxlZC5sZW5ndGgpe2NvbnN0IGF1ZGl0R3JvdXBFbGVtPXRoaXMucmVuZGVyQXVkaXRHcm91cChncm91cCx7ZXhwYW5kYWJsZTpmYWxzZX0pO2dyb3Vwcy5mYWlsZWQuZm9yRWFjaCgoaXRlbSxpKT0+YXVkaXRHcm91cEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJBdWRpdChpdGVtLGkpKSk7YXVkaXRHcm91cEVsZW0uY2xhc3NMaXN0LmFkZCgnbGgtYXVkaXQtZ3JvdXAtLXVuYWRvcm5lZCcpO2ZhaWxlZEVsZW1lbnRzLnB1c2goYXVkaXRHcm91cEVsZW0pO30KaWYoZ3JvdXBzLnBhc3NlZC5sZW5ndGgpe2NvbnN0IGF1ZGl0R3JvdXBFbGVtPXRoaXMucmVuZGVyQXVkaXRHcm91cChncm91cCx7ZXhwYW5kYWJsZTp0cnVlfSk7Z3JvdXBzLnBhc3NlZC5mb3JFYWNoKChpdGVtLGkpPT5hdWRpdEdyb3VwRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlckF1ZGl0KGl0ZW0saSkpKTthdWRpdEdyb3VwRWxlbS5jbGFzc0xpc3QuYWRkKCdsaC1hdWRpdC1ncm91cC0tdW5hZG9ybmVkJyk7cGFzc2VkRWxlbWVudHMucHVzaChhdWRpdEdyb3VwRWxlbSk7fQppZihncm91cHMubm90QXBwbGljYWJsZS5sZW5ndGgpe2NvbnN0IGF1ZGl0R3JvdXBFbGVtPXRoaXMucmVuZGVyQXVkaXRHcm91cChncm91cCx7ZXhwYW5kYWJsZTp0cnVlfSk7Z3JvdXBzLm5vdEFwcGxpY2FibGUuZm9yRWFjaCgoaXRlbSxpKT0+YXVkaXRHcm91cEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJBdWRpdChpdGVtLGkpKSk7YXVkaXRHcm91cEVsZW0uY2xhc3NMaXN0LmFkZCgnbGgtYXVkaXQtZ3JvdXAtLXVuYWRvcm5lZCcpO25vdEFwcGxpY2FibGVFbGVtZW50cy5wdXNoKGF1ZGl0R3JvdXBFbGVtKTt9fSk7aWYoZmFpbGVkRWxlbWVudHMubGVuZ3RoKXtjb25zdCBmYWlsZWRFbGVtPXRoaXMuX3JlbmRlckZhaWxlZEF1ZGl0c1NlY3Rpb24oZmFpbGVkRWxlbWVudHMpO2VsZW1lbnQuYXBwZW5kQ2hpbGQoZmFpbGVkRWxlbSk7fQppZihtYW51YWxBdWRpdHMubGVuZ3RoKXtjb25zdCBtYW51YWxFbD10aGlzLl9yZW5kZXJNYW51YWxBdWRpdHMobWFudWFsQXVkaXRzLGNhdGVnb3J5Lm1hbnVhbERlc2NyaXB0aW9uKTtlbGVtZW50LmFwcGVuZENoaWxkKG1hbnVhbEVsKTt9CmlmKHBhc3NlZEVsZW1lbnRzLmxlbmd0aCl7Y29uc3QgcGFzc2VkRWxlbT10aGlzLnJlbmRlclBhc3NlZEF1ZGl0c1NlY3Rpb24ocGFzc2VkRWxlbWVudHMpO2VsZW1lbnQuYXBwZW5kQ2hpbGQocGFzc2VkRWxlbSk7fQppZihub3RBcHBsaWNhYmxlRWxlbWVudHMubGVuZ3RoKXtjb25zdCBub3RBcHBsaWNhYmxlRWxlbT10aGlzLl9yZW5kZXJOb3RBcHBsaWNhYmxlQXVkaXRzU2VjdGlvbihub3RBcHBsaWNhYmxlRWxlbWVudHMpO2VsZW1lbnQuYXBwZW5kQ2hpbGQobm90QXBwbGljYWJsZUVsZW0pO30KcmV0dXJuIGVsZW1lbnQ7fQpjcmVhdGVQZXJtYWxpbmtTcGFuKGVsZW1lbnQsaWQpe2NvbnN0IHBlcm1hbGlua0VsPXRoaXMuZG9tLmNyZWF0ZUNoaWxkT2YoZWxlbWVudCwnc3BhbicsJ2xoLXBlcm1hbGluaycpO3Blcm1hbGlua0VsLmlkPWlkO319CmlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyYmbW9kdWxlLmV4cG9ydHMpe21vZHVsZS5leHBvcnRzPUNhdGVnb3J5UmVuZGVyZXI7fWVsc2V7c2VsZi5DYXRlZ29yeVJlbmRlcmVyPUNhdGVnb3J5UmVuZGVyZXI7fTsndXNlIHN0cmljdCc7Y2xhc3MgUGVyZm9ybWFuY2VDYXRlZ29yeVJlbmRlcmVyIGV4dGVuZHMgQ2F0ZWdvcnlSZW5kZXJlcntfcmVuZGVyTWV0cmljKGF1ZGl0KXtjb25zdCB0bXBsPXRoaXMuZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLW1ldHJpYycsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGVsZW1lbnQ9dGhpcy5kb20uZmluZCgnLmxoLW1ldHJpYycsdG1wbCk7ZWxlbWVudC5pZD1hdWRpdC5yZXN1bHQuaWQ7Y29uc3QgcmF0aW5nPVV0aWwuY2FsY3VsYXRlUmF0aW5nKGF1ZGl0LnJlc3VsdC5zY29yZSxhdWRpdC5yZXN1bHQuc2NvcmVEaXNwbGF5TW9kZSk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBsaC1tZXRyaWMtLSR7cmF0aW5nfWApO2NvbnN0IHRpdGxlRWw9dGhpcy5kb20uZmluZCgnLmxoLW1ldHJpY19fdGl0bGUnLHRtcGwpO3RpdGxlRWwudGV4dENvbnRlbnQ9YXVkaXQucmVzdWx0LnRpdGxlO2NvbnN0IHZhbHVlRWw9dGhpcy5kb20uZmluZCgnLmxoLW1ldHJpY19fdmFsdWUnLHRtcGwpO3ZhbHVlRWwudGV4dENvbnRlbnQ9VXRpbC5mb3JtYXREaXNwbGF5VmFsdWUoYXVkaXQucmVzdWx0LmRpc3BsYXlWYWx1ZSk7Y29uc3QgZGVzY3JpcHRpb25FbD10aGlzLmRvbS5maW5kKCcubGgtbWV0cmljX19kZXNjcmlwdGlvbicsdG1wbCk7ZGVzY3JpcHRpb25FbC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jb252ZXJ0TWFya2Rvd25MaW5rU25pcHBldHMoYXVkaXQucmVzdWx0LmRlc2NyaXB0aW9uKSk7aWYoYXVkaXQucmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT0nZXJyb3InKXtkZXNjcmlwdGlvbkVsLnRleHRDb250ZW50PScnO3ZhbHVlRWwudGV4dENvbnRlbnQ9J0Vycm9yISc7Y29uc3QgdG9vbHRpcD10aGlzLmRvbS5jcmVhdGVDaGlsZE9mKGRlc2NyaXB0aW9uRWwsJ3NwYW4nKTt0b29sdGlwLnRleHRDb250ZW50PWF1ZGl0LnJlc3VsdC5lcnJvck1lc3NhZ2V8fCdSZXBvcnQgZXJyb3I6IG5vIG1ldHJpYyBpbmZvcm1hdGlvbic7fQpyZXR1cm4gZWxlbWVudDt9Cl9yZW5kZXJPcHBvcnR1bml0eShhdWRpdCxpbmRleCxzY2FsZSl7Y29uc3Qgb3BwVG1wbD10aGlzLmRvbS5jbG9uZVRlbXBsYXRlKCcjdG1wbC1saC1vcHBvcnR1bml0eScsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGVsZW1lbnQ9dGhpcy5wb3B1bGF0ZUF1ZGl0VmFsdWVzKGF1ZGl0LGluZGV4LG9wcFRtcGwpO2VsZW1lbnQuaWQ9YXVkaXQucmVzdWx0LmlkO2lmKCFhdWRpdC5yZXN1bHQuZGV0YWlsc3x8YXVkaXQucmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT0nZXJyb3InKXtyZXR1cm4gZWxlbWVudDt9CmNvbnN0IGRldGFpbHM9KGF1ZGl0LnJlc3VsdC5kZXRhaWxzKTtpZihkZXRhaWxzLnR5cGUhPT0nb3Bwb3J0dW5pdHknKXtyZXR1cm4gZWxlbWVudDt9CmNvbnN0IGRpc3BsYXlFbD10aGlzLmRvbS5maW5kKCcubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCcsZWxlbWVudCk7Y29uc3Qgc3BhcmtsaW5lV2lkdGhQY3Q9YCR7ZGV0YWlscy5vdmVyYWxsU2F2aW5nc01zIC8gc2NhbGUgKiAxMDB9JWA7dGhpcy5kb20uZmluZCgnLmxoLXNwYXJrbGluZV9fYmFyJyxlbGVtZW50KS5zdHlsZS53aWR0aD1zcGFya2xpbmVXaWR0aFBjdDtkaXNwbGF5RWwudGV4dENvbnRlbnQ9VXRpbC5mb3JtYXRTZWNvbmRzKGRldGFpbHMub3ZlcmFsbFNhdmluZ3NNcywwLjAxKTtpZihhdWRpdC5yZXN1bHQuZGlzcGxheVZhbHVlKXtjb25zdCBkaXNwbGF5VmFsdWU9VXRpbC5mb3JtYXREaXNwbGF5VmFsdWUoYXVkaXQucmVzdWx0LmRpc3BsYXlWYWx1ZSk7dGhpcy5kb20uZmluZCgnLmxoLWxvYWQtb3Bwb3J0dW5pdHlfX3NwYXJrbGluZScsZWxlbWVudCkudGl0bGU9ZGlzcGxheVZhbHVlO2Rpc3BsYXlFbC50aXRsZT1kaXNwbGF5VmFsdWU7fQpyZXR1cm4gZWxlbWVudDt9Cl9nZXRXYXN0ZWRNcyhhdWRpdCl7aWYoYXVkaXQucmVzdWx0LmRldGFpbHMmJmF1ZGl0LnJlc3VsdC5kZXRhaWxzLnR5cGU9PT0nb3Bwb3J0dW5pdHknKXtjb25zdCBkZXRhaWxzPShhdWRpdC5yZXN1bHQuZGV0YWlscyk7aWYodHlwZW9mIGRldGFpbHMub3ZlcmFsbFNhdmluZ3NNcyE9PSdudW1iZXInKXt0aHJvdyBuZXcgRXJyb3IoJ25vbi1vcHBvcnR1bml0eSBkZXRhaWxzIHBhc3NlZCB0byBfZ2V0V2FzdGVkTXMnKTt9CnJldHVybiBkZXRhaWxzLm92ZXJhbGxTYXZpbmdzTXM7fWVsc2V7cmV0dXJuIE51bWJlci5NSU5fVkFMVUU7fX0KcmVuZGVyKGNhdGVnb3J5LGdyb3Vwcyl7Y29uc3QgZWxlbWVudD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCdkaXYnLCdsaC1jYXRlZ29yeScpO3RoaXMuY3JlYXRlUGVybWFsaW5rU3BhbihlbGVtZW50LGNhdGVnb3J5LmlkKTtlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyQ2F0ZWdvcnlIZWFkZXIoY2F0ZWdvcnkpKTtjb25zdCBtZXRyaWNBdWRpdHM9Y2F0ZWdvcnkuYXVkaXRSZWZzLmZpbHRlcihhdWRpdD0+YXVkaXQuZ3JvdXA9PT0nbWV0cmljcycpO2NvbnN0IG1ldHJpY0F1ZGl0c0VsPXRoaXMucmVuZGVyQXVkaXRHcm91cChncm91cHNbJ21ldHJpY3MnXSx7ZXhwYW5kYWJsZTpmYWxzZX0pO2NvbnN0IGtleU1ldHJpY3M9bWV0cmljQXVkaXRzLmZpbHRlcihhPT5hLndlaWdodD49Myk7Y29uc3Qgb3RoZXJNZXRyaWNzPW1ldHJpY0F1ZGl0cy5maWx0ZXIoYT0+YS53ZWlnaHQ8Myk7Y29uc3QgbWV0cmljc0JveGVzRWw9dGhpcy5kb20uY3JlYXRlQ2hpbGRPZihtZXRyaWNBdWRpdHNFbCwnZGl2JywnbGgtbWV0cmljLWNvbnRhaW5lcicpO2NvbnN0IG1ldHJpY3NDb2x1bW4xRWw9dGhpcy5kb20uY3JlYXRlQ2hpbGRPZihtZXRyaWNzQm94ZXNFbCwnZGl2JywnbGgtbWV0cmljLWNvbHVtbicpO2NvbnN0IG1ldHJpY3NDb2x1bW4yRWw9dGhpcy5kb20uY3JlYXRlQ2hpbGRPZihtZXRyaWNzQm94ZXNFbCwnZGl2JywnbGgtbWV0cmljLWNvbHVtbicpO2tleU1ldHJpY3MuZm9yRWFjaChpdGVtPT57bWV0cmljc0NvbHVtbjFFbC5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJNZXRyaWMoaXRlbSkpO30pO290aGVyTWV0cmljcy5mb3JFYWNoKGl0ZW09PnttZXRyaWNzQ29sdW1uMkVsLmFwcGVuZENoaWxkKHRoaXMuX3JlbmRlck1ldHJpYyhpdGVtKSk7fSk7Y29uc3QgZXN0VmFsdWVzRWw9dGhpcy5kb20uY3JlYXRlQ2hpbGRPZihtZXRyaWNzQ29sdW1uMkVsLCdkaXYnLCdsaC1tZXRyaWNzX19kaXNjbGFpbWVyIGxoLW1ldHJpY3NfX2Rpc2NsYWltZXInKTtlc3RWYWx1ZXNFbC50ZXh0Q29udGVudD0nVmFsdWVzIGFyZSBlc3RpbWF0ZWQgYW5kIG1heSB2YXJ5Lic7bWV0cmljQXVkaXRzRWwuY2xhc3NMaXN0LmFkZCgnbGgtYXVkaXQtZ3JvdXAtLW1ldHJpY3MnKTtlbGVtZW50LmFwcGVuZENoaWxkKG1ldHJpY0F1ZGl0c0VsKTtjb25zdCB0aW1lbGluZUVsPXRoaXMuZG9tLmNyZWF0ZUNoaWxkT2YoZWxlbWVudCwnZGl2JywnbGgtZmlsbXN0cmlwLWNvbnRhaW5lcicpO2NvbnN0IHRodW1ibmFpbEF1ZGl0PWNhdGVnb3J5LmF1ZGl0UmVmcy5maW5kKGF1ZGl0PT5hdWRpdC5pZD09PSdzY3JlZW5zaG90LXRodW1ibmFpbHMnKTtjb25zdCB0aHVtYm5haWxSZXN1bHQ9dGh1bWJuYWlsQXVkaXQmJnRodW1ibmFpbEF1ZGl0LnJlc3VsdDtpZih0aHVtYm5haWxSZXN1bHQmJnRodW1ibmFpbFJlc3VsdC5kZXRhaWxzKXt0aW1lbGluZUVsLmlkPXRodW1ibmFpbFJlc3VsdC5pZDtjb25zdCBmaWxtc3RyaXBFbD10aGlzLmRldGFpbHNSZW5kZXJlci5yZW5kZXIodGh1bWJuYWlsUmVzdWx0LmRldGFpbHMpO3RpbWVsaW5lRWwuYXBwZW5kQ2hpbGQoZmlsbXN0cmlwRWwpO30KY29uc3Qgb3Bwb3J0dW5pdHlBdWRpdHM9Y2F0ZWdvcnkuYXVkaXRSZWZzLmZpbHRlcihhdWRpdD0+YXVkaXQuZ3JvdXA9PT0nbG9hZC1vcHBvcnR1bml0aWVzJyYmIVV0aWwuc2hvd0FzUGFzc2VkKGF1ZGl0LnJlc3VsdCkpLnNvcnQoKGF1ZGl0QSxhdWRpdEIpPT50aGlzLl9nZXRXYXN0ZWRNcyhhdWRpdEIpLXRoaXMuX2dldFdhc3RlZE1zKGF1ZGl0QSkpO2lmKG9wcG9ydHVuaXR5QXVkaXRzLmxlbmd0aCl7Y29uc3QgbWluaW11bVNjYWxlPTIwMDA7Y29uc3Qgd2FzdGVkTXNWYWx1ZXM9b3Bwb3J0dW5pdHlBdWRpdHMubWFwKGF1ZGl0PT50aGlzLl9nZXRXYXN0ZWRNcyhhdWRpdCkpO2NvbnN0IG1heFdhc3RlPU1hdGgubWF4KC4uLndhc3RlZE1zVmFsdWVzKTtjb25zdCBzY2FsZT1NYXRoLm1heChNYXRoLmNlaWwobWF4V2FzdGUvMTAwMCkqMTAwMCxtaW5pbXVtU2NhbGUpO2NvbnN0IGdyb3VwRWw9dGhpcy5yZW5kZXJBdWRpdEdyb3VwKGdyb3Vwc1snbG9hZC1vcHBvcnR1bml0aWVzJ10se2V4cGFuZGFibGU6ZmFsc2V9KTtjb25zdCB0bXBsPXRoaXMuZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLW9wcG9ydHVuaXR5LWhlYWRlcicsdGhpcy50ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGhlYWRlckVsPXRoaXMuZG9tLmZpbmQoJy5saC1sb2FkLW9wcG9ydHVuaXR5X19oZWFkZXInLHRtcGwpO2dyb3VwRWwuYXBwZW5kQ2hpbGQoaGVhZGVyRWwpO29wcG9ydHVuaXR5QXVkaXRzLmZvckVhY2goKGl0ZW0saSk9Pmdyb3VwRWwuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyT3Bwb3J0dW5pdHkoaXRlbSxpLHNjYWxlKSkpO2dyb3VwRWwuY2xhc3NMaXN0LmFkZCgnbGgtYXVkaXQtZ3JvdXAtLW9wcG9ydHVuaXRpZXMnKTtlbGVtZW50LmFwcGVuZENoaWxkKGdyb3VwRWwpO30KY29uc3QgZGlhZ25vc3RpY0F1ZGl0cz1jYXRlZ29yeS5hdWRpdFJlZnMuZmlsdGVyKGF1ZGl0PT5hdWRpdC5ncm91cD09PSdkaWFnbm9zdGljcycmJiFVdGlsLnNob3dBc1Bhc3NlZChhdWRpdC5yZXN1bHQpKS5zb3J0KChhLGIpPT57Y29uc3Qgc2NvcmVBPWEucmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT0naW5mb3JtYXRpdmUnPzEwMDpOdW1iZXIoYS5yZXN1bHQuc2NvcmUpO2NvbnN0IHNjb3JlQj1iLnJlc3VsdC5zY29yZURpc3BsYXlNb2RlPT09J2luZm9ybWF0aXZlJz8xMDA6TnVtYmVyKGIucmVzdWx0LnNjb3JlKTtyZXR1cm4gc2NvcmVBLXNjb3JlQjt9KTtpZihkaWFnbm9zdGljQXVkaXRzLmxlbmd0aCl7Y29uc3QgZ3JvdXBFbD10aGlzLnJlbmRlckF1ZGl0R3JvdXAoZ3JvdXBzWydkaWFnbm9zdGljcyddLHtleHBhbmRhYmxlOmZhbHNlfSk7ZGlhZ25vc3RpY0F1ZGl0cy5mb3JFYWNoKChpdGVtLGkpPT5ncm91cEVsLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyQXVkaXQoaXRlbSxpKSkpO2dyb3VwRWwuY2xhc3NMaXN0LmFkZCgnbGgtYXVkaXQtZ3JvdXAtLWRpYWdub3N0aWNzJyk7ZWxlbWVudC5hcHBlbmRDaGlsZChncm91cEVsKTt9CmNvbnN0IHBhc3NlZEVsZW1lbnRzPWNhdGVnb3J5LmF1ZGl0UmVmcy5maWx0ZXIoYXVkaXQ9PihhdWRpdC5ncm91cD09PSdsb2FkLW9wcG9ydHVuaXRpZXMnfHxhdWRpdC5ncm91cD09PSdkaWFnbm9zdGljcycpJiZVdGlsLnNob3dBc1Bhc3NlZChhdWRpdC5yZXN1bHQpKS5tYXAoKGF1ZGl0LGkpPT50aGlzLnJlbmRlckF1ZGl0KGF1ZGl0LGkpKTtpZighcGFzc2VkRWxlbWVudHMubGVuZ3RoKXJldHVybiBlbGVtZW50O2NvbnN0IHBhc3NlZEVsZW09dGhpcy5yZW5kZXJQYXNzZWRBdWRpdHNTZWN0aW9uKHBhc3NlZEVsZW1lbnRzKTtlbGVtZW50LmFwcGVuZENoaWxkKHBhc3NlZEVsZW0pO3JldHVybiBlbGVtZW50O319CmlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyYmbW9kdWxlLmV4cG9ydHMpe21vZHVsZS5leHBvcnRzPVBlcmZvcm1hbmNlQ2F0ZWdvcnlSZW5kZXJlcjt9ZWxzZXtzZWxmLlBlcmZvcm1hbmNlQ2F0ZWdvcnlSZW5kZXJlcj1QZXJmb3JtYW5jZUNhdGVnb3J5UmVuZGVyZXI7fTsndXNlIHN0cmljdCc7Y29uc3QgVVJMX1BSRUZJWEVTPVsnaHR0cDovLycsJ2h0dHBzOi8vJywnZGF0YTonXTtjbGFzcyBEZXRhaWxzUmVuZGVyZXJ7Y29uc3RydWN0b3IoZG9tKXt0aGlzLl9kb209ZG9tO3RoaXMuX3RlbXBsYXRlQ29udGV4dDt9CnNldFRlbXBsYXRlQ29udGV4dChjb250ZXh0KXt0aGlzLl90ZW1wbGF0ZUNvbnRleHQ9Y29udGV4dDt9CnJlbmRlcihkZXRhaWxzKXtzd2l0Y2goZGV0YWlscy50eXBlKXtjYXNlJ3RleHQnOnJldHVybiB0aGlzLl9yZW5kZXJUZXh0KChkZXRhaWxzKSk7Y2FzZSd1cmwnOnJldHVybiB0aGlzLl9yZW5kZXJUZXh0VVJMKChkZXRhaWxzKSk7Y2FzZSdieXRlcyc6cmV0dXJuIHRoaXMuX3JlbmRlckJ5dGVzKChkZXRhaWxzKSk7Y2FzZSdtcyc6cmV0dXJuIHRoaXMuX3JlbmRlck1pbGxpc2Vjb25kcygoZGV0YWlscykpO2Nhc2UnbGluayc6cmV0dXJuIHRoaXMuX3JlbmRlckxpbmsoKGRldGFpbHMpKTtjYXNlJ3RodW1ibmFpbCc6cmV0dXJuIHRoaXMuX3JlbmRlclRodW1ibmFpbCgoZGV0YWlscykpO2Nhc2UnZmlsbXN0cmlwJzpyZXR1cm4gdGhpcy5fcmVuZGVyRmlsbXN0cmlwKChkZXRhaWxzKSk7Y2FzZSd0YWJsZSc6cmV0dXJuIHRoaXMuX3JlbmRlclRhYmxlKChkZXRhaWxzKSk7Y2FzZSdjb2RlJzpyZXR1cm4gdGhpcy5fcmVuZGVyQ29kZSgoZGV0YWlscykpO2Nhc2Unbm9kZSc6cmV0dXJuIHRoaXMucmVuZGVyTm9kZSgoZGV0YWlscykpO2Nhc2UnY3JpdGljYWxyZXF1ZXN0Y2hhaW4nOnJldHVybiBDcml0aWNhbFJlcXVlc3RDaGFpblJlbmRlcmVyLnJlbmRlcih0aGlzLl9kb20sdGhpcy5fdGVtcGxhdGVDb250ZXh0LChkZXRhaWxzKSk7Y2FzZSdvcHBvcnR1bml0eSc6cmV0dXJuIHRoaXMuX3JlbmRlck9wcG9ydHVuaXR5VGFibGUoZGV0YWlscyk7ZGVmYXVsdDp7dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGU6ICR7ZGV0YWlscy50eXBlfWApO319fQpfcmVuZGVyQnl0ZXMoZGV0YWlscyl7Y29uc3QgdmFsdWU9VXRpbC5mb3JtYXRCeXRlc1RvS0IoZGV0YWlscy52YWx1ZSxkZXRhaWxzLmdyYW51bGFyaXR5KTtyZXR1cm4gdGhpcy5fcmVuZGVyVGV4dCh7dmFsdWV9KTt9Cl9yZW5kZXJNaWxsaXNlY29uZHMoZGV0YWlscyl7bGV0IHZhbHVlPVV0aWwuZm9ybWF0TWlsbGlzZWNvbmRzKGRldGFpbHMudmFsdWUsZGV0YWlscy5ncmFudWxhcml0eSk7aWYoZGV0YWlscy5kaXNwbGF5VW5pdD09PSdkdXJhdGlvbicpe3ZhbHVlPVV0aWwuZm9ybWF0RHVyYXRpb24oZGV0YWlscy52YWx1ZSk7fQpyZXR1cm4gdGhpcy5fcmVuZGVyVGV4dCh7dmFsdWV9KTt9Cl9yZW5kZXJUZXh0VVJMKHRleHQpe2NvbnN0IHVybD10ZXh0LnZhbHVlO2xldCBkaXNwbGF5ZWRQYXRoO2xldCBkaXNwbGF5ZWRIb3N0O2xldCB0aXRsZTt0cnl7Y29uc3QgcGFyc2VkPVV0aWwucGFyc2VVUkwodXJsKTtkaXNwbGF5ZWRQYXRoPXBhcnNlZC5maWxlPT09Jy8nP3BhcnNlZC5vcmlnaW46cGFyc2VkLmZpbGU7ZGlzcGxheWVkSG9zdD1wYXJzZWQuZmlsZT09PScvJz8nJzpgKCR7cGFyc2VkLmhvc3RuYW1lfSlgO3RpdGxlPXVybDt9Y2F0Y2goZSl7aWYoIWUubmFtZS5zdGFydHNXaXRoKCdUeXBlRXJyb3InKSl7dGhyb3cgZTt9CmRpc3BsYXllZFBhdGg9dXJsO30KY29uc3QgZWxlbWVudD0odGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLXRleHRfX3VybCcpKTtlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3JlbmRlclRleHQoe3ZhbHVlOmRpc3BsYXllZFBhdGgsfSkpO2lmKGRpc3BsYXllZEhvc3Qpe2NvbnN0IGhvc3RFbGVtPXRoaXMuX3JlbmRlclRleHQoe3ZhbHVlOmRpc3BsYXllZEhvc3QsfSk7aG9zdEVsZW0uY2xhc3NMaXN0LmFkZCgnbGgtdGV4dF9fdXJsLWhvc3QnKTtlbGVtZW50LmFwcGVuZENoaWxkKGhvc3RFbGVtKTt9CmlmKHRpdGxlKWVsZW1lbnQudGl0bGU9dXJsO3JldHVybiBlbGVtZW50O30KX3JlbmRlckxpbmsoZGV0YWlscyl7Y29uc3QgYWxsb3dlZFByb3RvY29scz1bJ2h0dHBzOicsJ2h0dHA6J107Y29uc3QgdXJsPW5ldyBVUkwoZGV0YWlscy51cmwpO2lmKCFhbGxvd2VkUHJvdG9jb2xzLmluY2x1ZGVzKHVybC5wcm90b2NvbCkpe3JldHVybiB0aGlzLl9yZW5kZXJUZXh0KHt2YWx1ZTpkZXRhaWxzLnRleHQsfSk7fQpjb25zdCBhPSh0aGlzLl9kb20uY3JlYXRlRWxlbWVudCgnYScpKTthLnJlbD0nbm9vcGVuZXInO2EudGFyZ2V0PSdfYmxhbmsnO2EudGV4dENvbnRlbnQ9ZGV0YWlscy50ZXh0O2EuaHJlZj11cmwuaHJlZjtyZXR1cm4gYTt9Cl9yZW5kZXJUZXh0KHRleHQpe2NvbnN0IGVsZW1lbnQ9dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLXRleHQnKTtlbGVtZW50LnRleHRDb250ZW50PXRleHQudmFsdWU7cmV0dXJuIGVsZW1lbnQ7fQpfcmVuZGVyVGh1bWJuYWlsKGRldGFpbHMpe2NvbnN0IGVsZW1lbnQ9KHRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdpbWcnLCdsaC10aHVtYm5haWwnKSk7Y29uc3Qgc3RyVmFsdWU9ZGV0YWlscy52YWx1ZTtlbGVtZW50LnNyYz1zdHJWYWx1ZTtlbGVtZW50LnRpdGxlPXN0clZhbHVlO2VsZW1lbnQuYWx0PScnO3JldHVybiBlbGVtZW50O30KX3JlbmRlclRhYmxlKGRldGFpbHMpe2lmKCFkZXRhaWxzLml0ZW1zLmxlbmd0aClyZXR1cm4gdGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCB0YWJsZUVsZW09dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJywnbGgtdGFibGUnKTtjb25zdCB0aGVhZEVsZW09dGhpcy5fZG9tLmNyZWF0ZUNoaWxkT2YodGFibGVFbGVtLCd0aGVhZCcpO2NvbnN0IHRoZWFkVHJFbGVtPXRoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHRoZWFkRWxlbSwndHInKTtmb3IoY29uc3QgaGVhZGluZyBvZiBkZXRhaWxzLmhlYWRpbmdzKXtjb25zdCBpdGVtVHlwZT1oZWFkaW5nLml0ZW1UeXBlfHwndGV4dCc7Y29uc3QgY2xhc3Nlcz1gbGgtdGFibGUtY29sdW1uLS0ke2l0ZW1UeXBlfWA7dGhpcy5fZG9tLmNyZWF0ZUNoaWxkT2YodGhlYWRUckVsZW0sJ3RoJyxjbGFzc2VzKS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlcih7dHlwZTondGV4dCcsdmFsdWU6aGVhZGluZy50ZXh0fHwnJyx9KSk7fQpjb25zdCB0Ym9keUVsZW09dGhpcy5fZG9tLmNyZWF0ZUNoaWxkT2YodGFibGVFbGVtLCd0Ym9keScpO2Zvcihjb25zdCByb3cgb2YgZGV0YWlscy5pdGVtcyl7Y29uc3Qgcm93RWxlbT10aGlzLl9kb20uY3JlYXRlQ2hpbGRPZih0Ym9keUVsZW0sJ3RyJyk7Zm9yKGNvbnN0IGhlYWRpbmcgb2YgZGV0YWlscy5oZWFkaW5ncyl7Y29uc3Qga2V5PShoZWFkaW5nLmtleSk7Y29uc3QgdmFsdWU9KHJvd1trZXldKTtpZih0eXBlb2YgdmFsdWU9PT0ndW5kZWZpbmVkJ3x8dmFsdWU9PT1udWxsKXt0aGlzLl9kb20uY3JlYXRlQ2hpbGRPZihyb3dFbGVtLCd0ZCcsJ2xoLXRhYmxlLWNvbHVtbi0tZW1wdHknKTtjb250aW51ZTt9CmlmKHZhbHVlLnR5cGUpe2NvbnN0IHZhbHVlQXNEZXRhaWxzPSh2YWx1ZSk7Y29uc3QgY2xhc3Nlcz1gbGgtdGFibGUtY29sdW1uLS0ke3ZhbHVlQXNEZXRhaWxzLnR5cGV9YDt0aGlzLl9kb20uY3JlYXRlQ2hpbGRPZihyb3dFbGVtLCd0ZCcsY2xhc3NlcykuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXIodmFsdWVBc0RldGFpbHMpKTtjb250aW51ZTt9CmNvbnN0IGl0ZW09e3ZhbHVlOih2YWx1ZSksdHlwZTpoZWFkaW5nLml0ZW1UeXBlLGRpc3BsYXlVbml0OmhlYWRpbmcuZGlzcGxheVVuaXQsZ3JhbnVsYXJpdHk6aGVhZGluZy5ncmFudWxhcml0eSx9O2NvbnN0IHZhbHVlVHlwZT12YWx1ZS50eXBlO2NvbnN0IGNsYXNzZXM9YGxoLXRhYmxlLWNvbHVtbi0tJHt2YWx1ZVR5cGUgfHwgaGVhZGluZy5pdGVtVHlwZX1gO3RoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHJvd0VsZW0sJ3RkJyxjbGFzc2VzKS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlcihpdGVtKSk7fX0KcmV0dXJuIHRhYmxlRWxlbTt9Cl9yZW5kZXJPcHBvcnR1bml0eVRhYmxlKGRldGFpbHMpe2lmKCFkZXRhaWxzLml0ZW1zLmxlbmd0aClyZXR1cm4gdGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCB0YWJsZUVsZW09dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJywnbGgtdGFibGUnKTtjb25zdCB0aGVhZEVsZW09dGhpcy5fZG9tLmNyZWF0ZUNoaWxkT2YodGFibGVFbGVtLCd0aGVhZCcpO2NvbnN0IHRoZWFkVHJFbGVtPXRoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHRoZWFkRWxlbSwndHInKTtmb3IoY29uc3QgaGVhZGluZyBvZiBkZXRhaWxzLmhlYWRpbmdzKXtjb25zdCB2YWx1ZVR5cGU9aGVhZGluZy52YWx1ZVR5cGV8fCd0ZXh0Jztjb25zdCBjbGFzc2VzPWBsaC10YWJsZS1jb2x1bW4tLSR7dmFsdWVUeXBlfWA7Y29uc3QgbGFiZWxFbD10aGlzLl9kb20uY3JlYXRlRWxlbWVudCgnZGl2JywnbGgtdGV4dCcpO2xhYmVsRWwudGV4dENvbnRlbnQ9aGVhZGluZy5sYWJlbDt0aGlzLl9kb20uY3JlYXRlQ2hpbGRPZih0aGVhZFRyRWxlbSwndGgnLGNsYXNzZXMpLmFwcGVuZENoaWxkKGxhYmVsRWwpO30KY29uc3QgdGJvZHlFbGVtPXRoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHRhYmxlRWxlbSwndGJvZHknKTtmb3IoY29uc3Qgcm93IG9mIGRldGFpbHMuaXRlbXMpe2NvbnN0IHJvd0VsZW09dGhpcy5fZG9tLmNyZWF0ZUNoaWxkT2YodGJvZHlFbGVtLCd0cicpO2Zvcihjb25zdCBoZWFkaW5nIG9mIGRldGFpbHMuaGVhZGluZ3Mpe2NvbnN0IGtleT0oaGVhZGluZy5rZXkpO2NvbnN0IHZhbHVlPXJvd1trZXldO2lmKHR5cGVvZiB2YWx1ZT09PSd1bmRlZmluZWQnfHx2YWx1ZT09PW51bGwpe3RoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHJvd0VsZW0sJ3RkJywnbGgtdGFibGUtY29sdW1uLS1lbXB0eScpO2NvbnRpbnVlO30KY29uc3QgdmFsdWVUeXBlPWhlYWRpbmcudmFsdWVUeXBlO2xldCBpdGVtRWxlbWVudDtzd2l0Y2godmFsdWVUeXBlKXtjYXNlJ3VybCc6e2NvbnN0IHN0clZhbHVlPSh2YWx1ZSk7aWYoVVJMX1BSRUZJWEVTLnNvbWUocHJlZml4PT5zdHJWYWx1ZS5zdGFydHNXaXRoKHByZWZpeCkpKXtpdGVtRWxlbWVudD10aGlzLl9yZW5kZXJUZXh0VVJMKHt2YWx1ZTpzdHJWYWx1ZX0pO31lbHNle2NvbnN0IGNvZGVWYWx1ZT0odmFsdWUpO2l0ZW1FbGVtZW50PXRoaXMuX3JlbmRlckNvZGUoe3ZhbHVlOmNvZGVWYWx1ZX0pO30KYnJlYWs7fQpjYXNlJ3RpbWVzcGFuTXMnOntjb25zdCBudW1WYWx1ZT0odmFsdWUpO2l0ZW1FbGVtZW50PXRoaXMuX3JlbmRlck1pbGxpc2Vjb25kcyh7dmFsdWU6bnVtVmFsdWV9KTticmVhazt9CmNhc2UnYnl0ZXMnOntjb25zdCBudW1WYWx1ZT0odmFsdWUpO2l0ZW1FbGVtZW50PXRoaXMuX3JlbmRlckJ5dGVzKHt2YWx1ZTpudW1WYWx1ZSxncmFudWxhcml0eToxfSk7YnJlYWs7fQpjYXNlJ3RodW1ibmFpbCc6e2NvbnN0IHN0clZhbHVlPSh2YWx1ZSk7aXRlbUVsZW1lbnQ9dGhpcy5fcmVuZGVyVGh1bWJuYWlsKHt2YWx1ZTpzdHJWYWx1ZX0pO2JyZWFrO30KZGVmYXVsdDp7dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHZhbHVlVHlwZTogJHt2YWx1ZVR5cGV9YCk7fX0KY29uc3QgY2xhc3Nlcz1gbGgtdGFibGUtY29sdW1uLS0ke3ZhbHVlVHlwZX1gO3RoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKHJvd0VsZW0sJ3RkJyxjbGFzc2VzKS5hcHBlbmRDaGlsZChpdGVtRWxlbWVudCk7fX0KcmV0dXJuIHRhYmxlRWxlbTt9CnJlbmRlck5vZGUoaXRlbSl7Y29uc3QgZWxlbWVudD0odGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCdsaC1ub2RlJykpO2lmKGl0ZW0uc25pcHBldCl7ZWxlbWVudC50ZXh0Q29udGVudD1pdGVtLnNuaXBwZXQ7fQppZihpdGVtLnNlbGVjdG9yKXtlbGVtZW50LnRpdGxlPWl0ZW0uc2VsZWN0b3I7fQppZihpdGVtLnBhdGgpZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGF0aCcsaXRlbS5wYXRoKTtpZihpdGVtLnNlbGVjdG9yKWVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXNlbGVjdG9yJyxpdGVtLnNlbGVjdG9yKTtpZihpdGVtLnNuaXBwZXQpZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc25pcHBldCcsaXRlbS5zbmlwcGV0KTtyZXR1cm4gZWxlbWVudDt9Cl9yZW5kZXJGaWxtc3RyaXAoZGV0YWlscyl7Y29uc3QgZmlsbXN0cmlwRWw9dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLWZpbG1zdHJpcCcpO2Zvcihjb25zdCB0aHVtYm5haWwgb2YgZGV0YWlscy5pdGVtcyl7Y29uc3QgZnJhbWVFbD10aGlzLl9kb20uY3JlYXRlQ2hpbGRPZihmaWxtc3RyaXBFbCwnZGl2JywnbGgtZmlsbXN0cmlwX19mcmFtZScpO3RoaXMuX2RvbS5jcmVhdGVDaGlsZE9mKGZyYW1lRWwsJ2ltZycsJ2xoLWZpbG1zdHJpcF9fdGh1bWJuYWlsJyx7c3JjOmBkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCR7dGh1bWJuYWlsLmRhdGF9YCxhbHQ6YFNjcmVlbnNob3RgLH0pO30KcmV0dXJuIGZpbG1zdHJpcEVsO30KX3JlbmRlckNvZGUoZGV0YWlscyl7Y29uc3QgcHJlPXRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdwcmUnLCdsaC1jb2RlJyk7cHJlLnRleHRDb250ZW50PShkZXRhaWxzLnZhbHVlKTtyZXR1cm4gcHJlO319CmlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyYmbW9kdWxlLmV4cG9ydHMpe21vZHVsZS5leHBvcnRzPURldGFpbHNSZW5kZXJlcjt9ZWxzZXtzZWxmLkRldGFpbHNSZW5kZXJlcj1EZXRhaWxzUmVuZGVyZXI7fTsndXNlIHN0cmljdCc7Y2xhc3MgQ3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlcntzdGF0aWMgaW5pdFRyZWUodHJlZSl7bGV0IHN0YXJ0VGltZT0wO2NvbnN0IHJvb3ROb2Rlcz1PYmplY3Qua2V5cyh0cmVlKTtpZihyb290Tm9kZXMubGVuZ3RoPjApe2NvbnN0IG5vZGU9dHJlZVtyb290Tm9kZXNbMF1dO3N0YXJ0VGltZT1ub2RlLnJlcXVlc3Quc3RhcnRUaW1lO30KcmV0dXJue3RyZWUsc3RhcnRUaW1lLHRyYW5zZmVyU2l6ZTowfTt9CnN0YXRpYyBjcmVhdGVTZWdtZW50KHBhcmVudCxpZCxzdGFydFRpbWUsdHJhbnNmZXJTaXplLHRyZWVNYXJrZXJzLHBhcmVudElzTGFzdENoaWxkKXtjb25zdCBub2RlPXBhcmVudFtpZF07Y29uc3Qgc2libGluZ3M9T2JqZWN0LmtleXMocGFyZW50KTtjb25zdCBpc0xhc3RDaGlsZD1zaWJsaW5ncy5pbmRleE9mKGlkKT09PShzaWJsaW5ncy5sZW5ndGgtMSk7Y29uc3QgaGFzQ2hpbGRyZW49T2JqZWN0LmtleXMobm9kZS5jaGlsZHJlbikubGVuZ3RoPjA7Y29uc3QgbmV3VHJlZU1hcmtlcnM9QXJyYXkuaXNBcnJheSh0cmVlTWFya2Vycyk/dHJlZU1hcmtlcnMuc2xpY2UoMCk6W107aWYodHlwZW9mIHBhcmVudElzTGFzdENoaWxkIT09J3VuZGVmaW5lZCcpe25ld1RyZWVNYXJrZXJzLnB1c2goIXBhcmVudElzTGFzdENoaWxkKTt9CnJldHVybntub2RlLGlzTGFzdENoaWxkLGhhc0NoaWxkcmVuLHN0YXJ0VGltZSx0cmFuc2ZlclNpemU6dHJhbnNmZXJTaXplK25vZGUucmVxdWVzdC50cmFuc2ZlclNpemUsdHJlZU1hcmtlcnM6bmV3VHJlZU1hcmtlcnMsfTt9CnN0YXRpYyBjcmVhdGVDaGFpbk5vZGUoZG9tLHRtcGwsc2VnbWVudCl7Y29uc3QgY2hhaW5zRWw9ZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLWNyY19fY2hhaW5zJyx0bXBsKTtkb20uZmluZCgnLmNyYy1ub2RlJyxjaGFpbnNFbCkuc2V0QXR0cmlidXRlKCd0aXRsZScsc2VnbWVudC5ub2RlLnJlcXVlc3QudXJsKTtjb25zdCB0cmVlTWFya2VFbD1kb20uZmluZCgnLmNyYy1ub2RlX190cmVlLW1hcmtlcicsY2hhaW5zRWwpO3NlZ21lbnQudHJlZU1hcmtlcnMuZm9yRWFjaChzZXBhcmF0b3I9PntpZihzZXBhcmF0b3Ipe3RyZWVNYXJrZUVsLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCdzcGFuJywndHJlZS1tYXJrZXIgdmVydCcpKTt0cmVlTWFya2VFbC5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgnc3BhbicsJ3RyZWUtbWFya2VyJykpO31lbHNle3RyZWVNYXJrZUVsLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCdzcGFuJywndHJlZS1tYXJrZXInKSk7dHJlZU1hcmtlRWwuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCd0cmVlLW1hcmtlcicpKTt9fSk7aWYoc2VnbWVudC5pc0xhc3RDaGlsZCl7dHJlZU1hcmtlRWwuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCd0cmVlLW1hcmtlciB1cC1yaWdodCcpKTt0cmVlTWFya2VFbC5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgnc3BhbicsJ3RyZWUtbWFya2VyIHJpZ2h0JykpO31lbHNle3RyZWVNYXJrZUVsLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCdzcGFuJywndHJlZS1tYXJrZXIgdmVydC1yaWdodCcpKTt0cmVlTWFya2VFbC5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgnc3BhbicsJ3RyZWUtbWFya2VyIHJpZ2h0JykpO30KaWYoc2VnbWVudC5oYXNDaGlsZHJlbil7dHJlZU1hcmtlRWwuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCd0cmVlLW1hcmtlciBob3Jpei1kb3duJykpO31lbHNle3RyZWVNYXJrZUVsLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCdzcGFuJywndHJlZS1tYXJrZXIgcmlnaHQnKSk7fQpjb25zdHtmaWxlLGhvc3RuYW1lfT1VdGlsLnBhcnNlVVJMKHNlZ21lbnQubm9kZS5yZXF1ZXN0LnVybCk7Y29uc3QgdHJlZXZhbEVsPWRvbS5maW5kKCcuY3JjLW5vZGVfX3RyZWUtdmFsdWUnLGNoYWluc0VsKTtkb20uZmluZCgnLmNyYy1ub2RlX190cmVlLWZpbGUnLHRyZWV2YWxFbCkudGV4dENvbnRlbnQ9YCR7ZmlsZX1gO2RvbS5maW5kKCcuY3JjLW5vZGVfX3RyZWUtaG9zdG5hbWUnLHRyZWV2YWxFbCkudGV4dENvbnRlbnQ9aG9zdG5hbWU/YCgke2hvc3RuYW1lfSlgOicnO2lmKCFzZWdtZW50Lmhhc0NoaWxkcmVuKXtjb25zdCBzcGFuPWRvbS5jcmVhdGVFbGVtZW50KCdzcGFuJywnY3JjLW5vZGVfX2NoYWluLWR1cmF0aW9uJyk7c3Bhbi50ZXh0Q29udGVudD0nIC0gJytVdGlsLmNoYWluRHVyYXRpb24oc2VnbWVudC5ub2RlLnJlcXVlc3Quc3RhcnRUaW1lLHNlZ21lbnQubm9kZS5yZXF1ZXN0LmVuZFRpbWUpKydtcywgJztjb25zdCBzcGFuMj1kb20uY3JlYXRlRWxlbWVudCgnc3BhbicsJ2NyYy1ub2RlX19jaGFpbi1kdXJhdGlvbicpO3NwYW4yLnRleHRDb250ZW50PVV0aWwuZm9ybWF0Qnl0ZXNUb0tCKHNlZ21lbnQubm9kZS5yZXF1ZXN0LnRyYW5zZmVyU2l6ZSwwLjAxKTt0cmVldmFsRWwuYXBwZW5kQ2hpbGQoc3Bhbik7dHJlZXZhbEVsLmFwcGVuZENoaWxkKHNwYW4yKTt9CnJldHVybiBjaGFpbnNFbDt9CnN0YXRpYyBidWlsZFRyZWUoZG9tLHRtcGwsc2VnbWVudCxlbGVtLGRldGFpbHMpe2VsZW0uYXBwZW5kQ2hpbGQoQ3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlci5jcmVhdGVDaGFpbk5vZGUoZG9tLHRtcGwsc2VnbWVudCkpO2Zvcihjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2VnbWVudC5ub2RlLmNoaWxkcmVuKSl7Y29uc3QgY2hpbGRTZWdtZW50PUNyaXRpY2FsUmVxdWVzdENoYWluUmVuZGVyZXIuY3JlYXRlU2VnbWVudChzZWdtZW50Lm5vZGUuY2hpbGRyZW4sa2V5LHNlZ21lbnQuc3RhcnRUaW1lLHNlZ21lbnQudHJhbnNmZXJTaXplLHNlZ21lbnQudHJlZU1hcmtlcnMsc2VnbWVudC5pc0xhc3RDaGlsZCk7Q3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlci5idWlsZFRyZWUoZG9tLHRtcGwsY2hpbGRTZWdtZW50LGVsZW0sZGV0YWlscyk7fX0Kc3RhdGljIHJlbmRlcihkb20sdGVtcGxhdGVDb250ZXh0LGRldGFpbHMpe2NvbnN0IHRtcGw9ZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLWNyYycsdGVtcGxhdGVDb250ZXh0KTtjb25zdCBjb250YWluZXJFbD1kb20uZmluZCgnLmxoLWNyYycsdG1wbCk7ZG9tLmZpbmQoJy5saC1jcmNfX2xvbmdlc3RfZHVyYXRpb24nLHRtcGwpLnRleHRDb250ZW50PVV0aWwuZm9ybWF0TnVtYmVyKGRldGFpbHMubG9uZ2VzdENoYWluLmR1cmF0aW9uKSsnbXMnO2RvbS5maW5kKCcubGgtY3JjX19sb25nZXN0X2xlbmd0aCcsdG1wbCkudGV4dENvbnRlbnQ9ZGV0YWlscy5sb25nZXN0Q2hhaW4ubGVuZ3RoLnRvU3RyaW5nKCk7ZG9tLmZpbmQoJy5saC1jcmNfX2xvbmdlc3RfdHJhbnNmZXJzaXplJyx0bXBsKS50ZXh0Q29udGVudD1VdGlsLmZvcm1hdEJ5dGVzVG9LQihkZXRhaWxzLmxvbmdlc3RDaGFpbi50cmFuc2ZlclNpemUpO2NvbnN0IHJvb3Q9Q3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlci5pbml0VHJlZShkZXRhaWxzLmNoYWlucyk7Zm9yKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb290LnRyZWUpKXtjb25zdCBzZWdtZW50PUNyaXRpY2FsUmVxdWVzdENoYWluUmVuZGVyZXIuY3JlYXRlU2VnbWVudChyb290LnRyZWUsa2V5LHJvb3Quc3RhcnRUaW1lLHJvb3QudHJhbnNmZXJTaXplKTtDcml0aWNhbFJlcXVlc3RDaGFpblJlbmRlcmVyLmJ1aWxkVHJlZShkb20sdG1wbCxzZWdtZW50LGNvbnRhaW5lckVsLGRldGFpbHMpO30KcmV0dXJuIGRvbS5maW5kKCcubGgtY3JjLWNvbnRhaW5lcicsdG1wbCk7fX0KaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnJiZtb2R1bGUuZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9Q3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlcjt9ZWxzZXtzZWxmLkNyaXRpY2FsUmVxdWVzdENoYWluUmVuZGVyZXI9Q3JpdGljYWxSZXF1ZXN0Q2hhaW5SZW5kZXJlcjt9Oyd1c2Ugc3RyaWN0JztjbGFzcyBSZXBvcnRSZW5kZXJlcntjb25zdHJ1Y3Rvcihkb20pe3RoaXMuX2RvbT1kb207dGhpcy5fdGVtcGxhdGVDb250ZXh0PXRoaXMuX2RvbS5kb2N1bWVudCgpO30KcmVuZGVyUmVwb3J0KHJlcG9ydCxjb250YWluZXIpe2NvbnN0IGNsb25lPShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcG9ydCkpKTtpZih0eXBlb2YgY2xvbmUuY2F0ZWdvcmllcyE9PSdvYmplY3QnKXRocm93IG5ldyBFcnJvcignTm8gY2F0ZWdvcmllcyBwcm92aWRlZC4nKTtjbG9uZS5yZXBvcnRDYXRlZ29yaWVzPU9iamVjdC52YWx1ZXMoY2xvbmUuY2F0ZWdvcmllcyk7UmVwb3J0UmVuZGVyZXIuc21vb3NoQXVkaXRSZXN1bHRzSW50b0NhdGVnb3JpZXMoY2xvbmUuYXVkaXRzLGNsb25lLnJlcG9ydENhdGVnb3JpZXMpO2NvbnRhaW5lci50ZXh0Q29udGVudD0nJztjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUmVwb3J0KGNsb25lKSk7cmV0dXJuKGNvbnRhaW5lcik7fQpzZXRUZW1wbGF0ZUNvbnRleHQoY29udGV4dCl7dGhpcy5fdGVtcGxhdGVDb250ZXh0PWNvbnRleHQ7fQpfcmVuZGVyUmVwb3J0SGVhZGVyKHJlcG9ydCl7Y29uc3QgZWw9dGhpcy5fZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLWhlYWRpbmcnLHRoaXMuX3RlbXBsYXRlQ29udGV4dCk7Y29uc3QgZG9tRnJhZ21lbnQ9dGhpcy5fZG9tLmNsb25lVGVtcGxhdGUoJyN0bXBsLWxoLXNjb3Jlcy13cmFwcGVyJyx0aGlzLl90ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IHBsYWNlaG9sZGVyPXRoaXMuX2RvbS5maW5kKCcubGgtc2NvcmVzLXdyYXBwZXItcGxhY2Vob2xkZXInLGVsKTsocGxhY2Vob2xkZXIucGFyZW50Tm9kZSkucmVwbGFjZUNoaWxkKGRvbUZyYWdtZW50LHBsYWNlaG9sZGVyKTt0aGlzLl9kb20uZmluZCgnLmxoLWNvbmZpZ19fdGltZXN0YW1wJyxlbCkudGV4dENvbnRlbnQ9VXRpbC5mb3JtYXREYXRlVGltZShyZXBvcnQuZmV0Y2hUaW1lKTt0aGlzLl9kb20uZmluZCgnLmxoLXByb2R1Y3QtaW5mb19fdmVyc2lvbicsZWwpLnRleHRDb250ZW50PXJlcG9ydC5saWdodGhvdXNlVmVyc2lvbjtjb25zdCBtZXRhZGF0YVVybD0odGhpcy5fZG9tLmZpbmQoJy5saC1tZXRhZGF0YV9fdXJsJyxlbCkpO2NvbnN0IHRvb2xiYXJVcmw9KHRoaXMuX2RvbS5maW5kKCcubGgtdG9vbGJhcl9fdXJsJyxlbCkpO21ldGFkYXRhVXJsLmhyZWY9bWV0YWRhdGFVcmwudGV4dENvbnRlbnQ9cmVwb3J0LmZpbmFsVXJsO3Rvb2xiYXJVcmwuaHJlZj10b29sYmFyVXJsLnRleHRDb250ZW50PXJlcG9ydC5maW5hbFVybDtjb25zdCBlbXVsYXRpb25EZXNjcmlwdGlvbnM9VXRpbC5nZXRFbXVsYXRpb25EZXNjcmlwdGlvbnMocmVwb3J0LmNvbmZpZ1NldHRpbmdzfHx7fSk7dGhpcy5fZG9tLmZpbmQoJy5saC1jb25maWdfX2VtdWxhdGlvbicsZWwpLnRleHRDb250ZW50PWVtdWxhdGlvbkRlc2NyaXB0aW9ucy5zdW1tYXJ5O3JldHVybiBlbDt9Cl9yZW5kZXJSZXBvcnRTaG9ydEhlYWRlcigpe2NvbnN0IHNob3J0SGVhZGVyQ29udGFpbmVyPXRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdkaXYnLCdsaC1oZWFkZXItY29udGFpbmVyJyk7Y29uc3Qgd3JhcHBlcj10aGlzLl9kb20uY2xvbmVUZW1wbGF0ZSgnI3RtcGwtbGgtc2NvcmVzLXdyYXBwZXInLHRoaXMuX3RlbXBsYXRlQ29udGV4dCk7c2hvcnRIZWFkZXJDb250YWluZXIuYXBwZW5kQ2hpbGQod3JhcHBlcik7cmV0dXJuIHNob3J0SGVhZGVyQ29udGFpbmVyO30KX3JlbmRlclJlcG9ydEZvb3RlcihyZXBvcnQpe2NvbnN0IGZvb3Rlcj10aGlzLl9kb20uY2xvbmVUZW1wbGF0ZSgnI3RtcGwtbGgtZm9vdGVyJyx0aGlzLl90ZW1wbGF0ZUNvbnRleHQpO2NvbnN0IGVudj10aGlzLl9kb20uZmluZCgnLmxoLWVudl9faXRlbXMnLGZvb3Rlcik7ZW52LmlkPSdydW50aW1lLXNldHRpbmdzJztjb25zdCBlbnZWYWx1ZXM9VXRpbC5nZXRFbnZpcm9ubWVudERpc3BsYXlWYWx1ZXMocmVwb3J0LmNvbmZpZ1NldHRpbmdzfHx7fSk7W3tuYW1lOidVUkwnLGRlc2NyaXB0aW9uOnJlcG9ydC5maW5hbFVybH0se25hbWU6J0ZldGNoIHRpbWUnLGRlc2NyaXB0aW9uOlV0aWwuZm9ybWF0RGF0ZVRpbWUocmVwb3J0LmZldGNoVGltZSl9LC4uLmVudlZhbHVlcyx7bmFtZTonVXNlciBhZ2VudCcsZGVzY3JpcHRpb246cmVwb3J0LnVzZXJBZ2VudH0sXS5mb3JFYWNoKHJ1bnRpbWU9Pntjb25zdCBpdGVtPXRoaXMuX2RvbS5jbG9uZVRlbXBsYXRlKCcjdG1wbC1saC1lbnZfX2l0ZW1zJyxlbnYpO3RoaXMuX2RvbS5maW5kKCcubGgtZW52X19uYW1lJyxpdGVtKS50ZXh0Q29udGVudD1gJHtydW50aW1lLm5hbWV9OmA7dGhpcy5fZG9tLmZpbmQoJy5saC1lbnZfX2Rlc2NyaXB0aW9uJyxpdGVtKS50ZXh0Q29udGVudD1ydW50aW1lLmRlc2NyaXB0aW9uO2Vudi5hcHBlbmRDaGlsZChpdGVtKTt9KTt0aGlzLl9kb20uZmluZCgnLmxoLWZvb3Rlcl9fdmVyc2lvbicsZm9vdGVyKS50ZXh0Q29udGVudD1yZXBvcnQubGlnaHRob3VzZVZlcnNpb247cmV0dXJuIGZvb3Rlcjt9Cl9yZW5kZXJSZXBvcnRXYXJuaW5ncyhyZXBvcnQpe2lmKCFyZXBvcnQucnVuV2FybmluZ3N8fHJlcG9ydC5ydW5XYXJuaW5ncy5sZW5ndGg9PT0wKXtyZXR1cm4gdGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO30KY29uc3QgY29udGFpbmVyPXRoaXMuX2RvbS5jbG9uZVRlbXBsYXRlKCcjdG1wbC1saC13YXJuaW5ncy0tdG9wbGV2ZWwnLHRoaXMuX3RlbXBsYXRlQ29udGV4dCk7Y29uc3Qgd2FybmluZ3M9dGhpcy5fZG9tLmZpbmQoJ3VsJyxjb250YWluZXIpO2Zvcihjb25zdCB3YXJuaW5nU3RyaW5nIG9mIHJlcG9ydC5ydW5XYXJuaW5ncyl7Y29uc3Qgd2FybmluZz13YXJuaW5ncy5hcHBlbmRDaGlsZCh0aGlzLl9kb20uY3JlYXRlRWxlbWVudCgnbGknKSk7d2FybmluZy50ZXh0Q29udGVudD13YXJuaW5nU3RyaW5nO30KcmV0dXJuIGNvbnRhaW5lcjt9Cl9yZW5kZXJSZXBvcnQocmVwb3J0KXtsZXQgaGVhZGVyO2NvbnN0IGhlYWRlckNvbnRhaW5lcj10aGlzLl9kb20uY3JlYXRlRWxlbWVudCgnZGl2Jyk7aWYodGhpcy5fZG9tLmlzRGV2VG9vbHMoKSl7aGVhZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xoLWhlYWRlci1wbGFpbicpO2hlYWRlcj10aGlzLl9yZW5kZXJSZXBvcnRTaG9ydEhlYWRlcigpO31lbHNle2hlYWRlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdsaC1oZWFkZXItc3RpY2t5Jyk7aGVhZGVyPXRoaXMuX3JlbmRlclJlcG9ydEhlYWRlcihyZXBvcnQpO30KaGVhZGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGhlYWRlcik7Y29uc3Qgc2NvcmVzQ29udGFpbmVyPXRoaXMuX2RvbS5maW5kKCcubGgtc2NvcmVzLWNvbnRhaW5lcicsaGVhZGVyQ29udGFpbmVyKTtjb25zdCBjb250YWluZXI9dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLWNvbnRhaW5lcicpO2NvbnN0IHJlcG9ydFNlY3Rpb249Y29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdkaXYnLCdsaC1yZXBvcnQnKSk7cmVwb3J0U2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJSZXBvcnRXYXJuaW5ncyhyZXBvcnQpKTtsZXQgc2NvcmVIZWFkZXI7Y29uc3QgaXNTb2xvQ2F0ZWdvcnk9cmVwb3J0LnJlcG9ydENhdGVnb3JpZXMubGVuZ3RoPT09MTtpZighaXNTb2xvQ2F0ZWdvcnkpe3Njb3JlSGVhZGVyPXRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdkaXYnLCdsaC1zY29yZXMtaGVhZGVyJyk7fWVsc2V7aGVhZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xoLWhlYWRlci0tc29sby1jYXRlZ29yeScpO30KY29uc3QgZGV0YWlsc1JlbmRlcmVyPW5ldyBEZXRhaWxzUmVuZGVyZXIodGhpcy5fZG9tKTtjb25zdCBjYXRlZ29yeVJlbmRlcmVyPW5ldyBDYXRlZ29yeVJlbmRlcmVyKHRoaXMuX2RvbSxkZXRhaWxzUmVuZGVyZXIpO2NhdGVnb3J5UmVuZGVyZXIuc2V0VGVtcGxhdGVDb250ZXh0KHRoaXMuX3RlbXBsYXRlQ29udGV4dCk7Y29uc3QgcGVyZkNhdGVnb3J5UmVuZGVyZXI9bmV3IFBlcmZvcm1hbmNlQ2F0ZWdvcnlSZW5kZXJlcih0aGlzLl9kb20sZGV0YWlsc1JlbmRlcmVyKTtwZXJmQ2F0ZWdvcnlSZW5kZXJlci5zZXRUZW1wbGF0ZUNvbnRleHQodGhpcy5fdGVtcGxhdGVDb250ZXh0KTtjb25zdCBjYXRlZ29yaWVzPXJlcG9ydFNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2xoLWNhdGVnb3JpZXMnKSk7Zm9yKGNvbnN0IGNhdGVnb3J5IG9mIHJlcG9ydC5yZXBvcnRDYXRlZ29yaWVzKXtpZihzY29yZUhlYWRlcil7c2NvcmVIZWFkZXIuYXBwZW5kQ2hpbGQoY2F0ZWdvcnlSZW5kZXJlci5yZW5kZXJTY29yZUdhdWdlKGNhdGVnb3J5KSk7fQpsZXQgcmVuZGVyZXI9Y2F0ZWdvcnlSZW5kZXJlcjtpZihjYXRlZ29yeS5pZD09PSdwZXJmb3JtYW5jZScpe3JlbmRlcmVyPXBlcmZDYXRlZ29yeVJlbmRlcmVyO30KY2F0ZWdvcmllcy5hcHBlbmRDaGlsZChyZW5kZXJlci5yZW5kZXIoY2F0ZWdvcnkscmVwb3J0LmNhdGVnb3J5R3JvdXBzKSk7fQppZihzY29yZUhlYWRlcil7Y29uc3Qgc2NvcmVTY2FsZT10aGlzLl9kb20uY2xvbmVUZW1wbGF0ZSgnI3RtcGwtbGgtc2NvcmVzY2FsZScsdGhpcy5fdGVtcGxhdGVDb250ZXh0KTtzY29yZXNDb250YWluZXIuYXBwZW5kQ2hpbGQoc2NvcmVIZWFkZXIpO3Njb3Jlc0NvbnRhaW5lci5hcHBlbmRDaGlsZChzY29yZVNjYWxlKTt9CnJlcG9ydFNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUmVwb3J0Rm9vdGVyKHJlcG9ydCkpO2NvbnN0IHJlcG9ydEZyYWdtZW50PXRoaXMuX2RvbS5jcmVhdGVGcmFnbWVudCgpO3JlcG9ydEZyYWdtZW50LmFwcGVuZENoaWxkKGhlYWRlckNvbnRhaW5lcik7cmVwb3J0RnJhZ21lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtyZXR1cm4gcmVwb3J0RnJhZ21lbnQ7fQpzdGF0aWMgc21vb3NoQXVkaXRSZXN1bHRzSW50b0NhdGVnb3JpZXMoYXVkaXRzLHJlcG9ydENhdGVnb3JpZXMpe2Zvcihjb25zdCBjYXRlZ29yeSBvZiByZXBvcnRDYXRlZ29yaWVzKXtjYXRlZ29yeS5hdWRpdFJlZnMuZm9yRWFjaChhdWRpdE1ldGE9Pntjb25zdCByZXN1bHQ9YXVkaXRzW2F1ZGl0TWV0YS5pZF07YXVkaXRNZXRhLnJlc3VsdD1yZXN1bHQ7fSk7fX19CmlmKHR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJyYmbW9kdWxlLmV4cG9ydHMpe21vZHVsZS5leHBvcnRzPVJlcG9ydFJlbmRlcmVyO31lbHNle3NlbGYuUmVwb3J0UmVuZGVyZXI9UmVwb3J0UmVuZGVyZXI7fTtBdWRpdHMyLlJhZGlvU2V0dGluZz1jbGFzc3tjb25zdHJ1Y3RvcihvcHRpb25zLHNldHRpbmcpe3RoaXMuX3NldHRpbmc9c2V0dGluZzt0aGlzLl9vcHRpb25zPW9wdGlvbnM7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2F1ZGl0czItcmFkaW8tZ3JvdXAnKTt0aGlzLl9yYWRpb0VsZW1lbnRzPVtdO2Zvcihjb25zdCBvcHRpb24gb2YgdGhpcy5fb3B0aW9ucyl7Y29uc3QgZnJhZ21lbnQ9VUkuRnJhZ21lbnQuYnVpbGRgCiAgICAgICAgPGxhYmVsICQ9ImxhYmVsIiBjbGFzcz0iYXVkaXRzMi1yYWRpbyI+CiAgICAgICAgICA8aW5wdXQgJD0iaW5wdXQiIHR5cGU9InJhZGlvIiB2YWx1ZT0ke29wdGlvbi52YWx1ZX0gbmFtZT0ke3NldHRpbmcubmFtZX0+CiAgICAgICAgICAke29wdGlvbi5sYWJlbH0KICAgICAgICA8L2xhYmVsPgogICAgICBgO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudC5lbGVtZW50KCkpO2lmKG9wdGlvbi50aXRsZSkKVUkuVG9vbHRpcC5pbnN0YWxsKGZyYWdtZW50LiQoJ2xhYmVsJyksb3B0aW9uLnRpdGxlKTtjb25zdCByYWRpb0VsZW1lbnQ9ZnJhZ21lbnQuJCgnaW5wdXQnKTtyYWRpb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyx0aGlzLl92YWx1ZUNoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5fcmFkaW9FbGVtZW50cy5wdXNoKHJhZGlvRWxlbWVudCk7fQp0aGlzLl9pZ25vcmVDaGFuZ2VFdmVudHM9ZmFsc2U7dGhpcy5fc2VsZWN0ZWRJbmRleD0tMTtzZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3NldHRpbmdDaGFuZ2VkLHRoaXMpO3RoaXMuX3NldHRpbmdDaGFuZ2VkKCk7fQpfdXBkYXRlVUkoKXt0aGlzLl9pZ25vcmVDaGFuZ2VFdmVudHM9dHJ1ZTt0aGlzLl9yYWRpb0VsZW1lbnRzW3RoaXMuX3NlbGVjdGVkSW5kZXhdLmNoZWNrZWQ9dHJ1ZTt0aGlzLl9pZ25vcmVDaGFuZ2VFdmVudHM9ZmFsc2U7fQpfc2V0dGluZ0NoYW5nZWQoKXtjb25zdCB2YWx1ZT10aGlzLl9zZXR0aW5nLmdldCgpO3RoaXMuX3NlbGVjdGVkSW5kZXg9dGhpcy5fb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24udmFsdWU9PT12YWx1ZSk7dGhpcy5fdXBkYXRlVUkoKTt9Cl92YWx1ZUNoYW5nZWQoZXZlbnQpe2lmKHRoaXMuX2lnbm9yZUNoYW5nZUV2ZW50cykKcmV0dXJuO2NvbnN0IHNlbGVjdGVkUmFkaW89dGhpcy5fcmFkaW9FbGVtZW50cy5maW5kKHJhZGlvPT5yYWRpby5jaGVja2VkKTt0aGlzLl9zZXR0aW5nLnNldChzZWxlY3RlZFJhZGlvLnZhbHVlKTt9fTs7QXVkaXRzMi5BdWRpdHMyUGFuZWw9Y2xhc3MgZXh0ZW5kcyBVSS5QYW5lbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCdhdWRpdHMyJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdhdWRpdHMyL2xpZ2h0aG91c2UvcmVwb3J0LXN0eWxlcy5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2F1ZGl0czIvYXVkaXRzMlBhbmVsLmNzcycpO3RoaXMuX3Byb3RvY29sU2VydmljZT1uZXcgQXVkaXRzMi5Qcm90b2NvbFNlcnZpY2UoKTt0aGlzLl9jb250cm9sbGVyPW5ldyBBdWRpdHMyLkF1ZGl0Q29udHJvbGxlcih0aGlzLl9wcm90b2NvbFNlcnZpY2UpO3RoaXMuX3N0YXJ0Vmlldz1uZXcgQXVkaXRzMi5TdGFydFZpZXcodGhpcy5fY29udHJvbGxlcik7dGhpcy5fc3RhdHVzVmlldz1uZXcgQXVkaXRzMi5TdGF0dXNWaWV3KHRoaXMuX2NvbnRyb2xsZXIpO3RoaXMuX3VuYXVkaXRhYmxlRXhwbGFuYXRpb249bnVsbDt0aGlzLl9jYWNoZWRSZW5kZXJlZFJlcG9ydHM9bmV3IE1hcCgpO3RoaXMuX2Ryb3BUYXJnZXQ9bmV3IFVJLkRyb3BUYXJnZXQodGhpcy5jb250ZW50RWxlbWVudCxbVUkuRHJvcFRhcmdldC5UeXBlLkZpbGVdLENvbW1vbi5VSVN0cmluZygnRHJvcCBhdWRpdCBmaWxlIGhlcmUnKSx0aGlzLl9oYW5kbGVEcm9wLmJpbmQodGhpcykpO3RoaXMuX2NvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcihBdWRpdHMyLkV2ZW50cy5QYWdlQXVkaXRhYmlsaXR5Q2hhbmdlZCx0aGlzLl9yZWZyZXNoU3RhcnRBdWRpdFVJLmJpbmQodGhpcykpO3RoaXMuX2NvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcihBdWRpdHMyLkV2ZW50cy5BdWRpdFByb2dyZXNzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoU3RhdHVzVUkuYmluZCh0aGlzKSk7dGhpcy5fY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKEF1ZGl0czIuRXZlbnRzLlJlcXVlc3RBdWRpdFN0YXJ0LHRoaXMuX3N0YXJ0QXVkaXQuYmluZCh0aGlzKSk7dGhpcy5fY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKEF1ZGl0czIuRXZlbnRzLlJlcXVlc3RBdWRpdENhbmNlbCx0aGlzLl9jYW5jZWxBdWRpdC5iaW5kKHRoaXMpKTt0aGlzLl9yZW5kZXJUb29sYmFyKCk7dGhpcy5fYXVkaXRSZXN1bHRzRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdhdWRpdHMyLXJlc3VsdHMtY29udGFpbmVyJyk7dGhpcy5fcmVuZGVyU3RhcnRWaWV3KCk7dGhpcy5fY29udHJvbGxlci5yZWNvbXB1dGVQYWdlQXVkaXRhYmlsaXR5KCk7fQpfcmVmcmVzaFN0YXJ0QXVkaXRVSShldnQpe3RoaXMuX3VuYXVkaXRhYmxlRXhwbGFuYXRpb249ZXZ0LmRhdGEuaGVscFRleHQ7dGhpcy5fc3RhcnRWaWV3LnNldFVuYXVkaXRhYmxlRXhwbGFuYXRpb24oZXZ0LmRhdGEuaGVscFRleHQpO3RoaXMuX3N0YXJ0Vmlldy5zZXRTdGFydEJ1dHRvbkVuYWJsZWQoIWV2dC5kYXRhLmhlbHBUZXh0KTt9Cl9yZWZyZXNoU3RhdHVzVUkoZXZ0KXt0aGlzLl9zdGF0dXNWaWV3LnVwZGF0ZVN0YXR1cyhldnQuZGF0YS5tZXNzYWdlKTt9Cl9yZWZyZXNoVG9vbGJhclVJKCl7dGhpcy5fZG93bmxvYWRCdXR0b24uc2V0RW5hYmxlZCh0aGlzLl9yZXBvcnRTZWxlY3Rvci5oYXNDdXJyZW50U2VsZWN0aW9uKCkpO3RoaXMuX2NsZWFyQnV0dG9uLnNldEVuYWJsZWQodGhpcy5fcmVwb3J0U2VsZWN0b3IuaGFzSXRlbXMoKSk7fQpfY2xlYXJBbGwoKXt0aGlzLl9yZXBvcnRTZWxlY3Rvci5jbGVhckFsbCgpO3RoaXMuX3JlbmRlclN0YXJ0VmlldygpO3RoaXMuX3JlZnJlc2hUb29sYmFyVUkoKTt9Cl9kb3dubG9hZFNlbGVjdGVkKCl7dGhpcy5fcmVwb3J0U2VsZWN0b3IuZG93bmxvYWRTZWxlY3RlZCgpO30KX3JlbmRlclRvb2xiYXIoKXtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLHRoaXMuZWxlbWVudCk7dGhpcy5fbmV3QnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUGVyZm9ybSBhbiBhdWRpdFx1MjAyNicpLCdsYXJnZWljb24tYWRkJyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9uZXdCdXR0b24pO3RoaXMuX25ld0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3JlbmRlclN0YXJ0Vmlldy5iaW5kKHRoaXMpKTt0aGlzLl9kb3dubG9hZEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0Rvd25sb2FkIHJlcG9ydCcpLCdsYXJnZWljb24tZG93bmxvYWQnKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2Rvd25sb2FkQnV0dG9uKTt0aGlzLl9kb3dubG9hZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2Rvd25sb2FkU2VsZWN0ZWQuYmluZCh0aGlzKSk7dG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTt0aGlzLl9yZXBvcnRTZWxlY3Rvcj1uZXcgQXVkaXRzMi5SZXBvcnRTZWxlY3RvcigoKT0+dGhpcy5fcmVuZGVyU3RhcnRWaWV3KCkpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcmVwb3J0U2VsZWN0b3IuY29tYm9Cb3goKSk7dGhpcy5fY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBhbGwnKSwnbGFyZ2VpY29uLWNsZWFyJyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jbGVhckJ1dHRvbik7dGhpcy5fY2xlYXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9jbGVhckFsbC5iaW5kKHRoaXMpKTt0aGlzLl9yZWZyZXNoVG9vbGJhclVJKCk7fQpfcmVuZGVyU3RhcnRWaWV3KCl7dGhpcy5fYXVkaXRSZXN1bHRzRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3N0YXR1c1ZpZXcuaGlkZSgpO3RoaXMuX3JlcG9ydFNlbGVjdG9yLnNlbGVjdE5ld0F1ZGl0KCk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdpbi1wcm9ncmVzcycsZmFsc2UpO3RoaXMuX3N0YXJ0Vmlldy5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX3N0YXJ0Vmlldy5zZXRVbmF1ZGl0YWJsZUV4cGxhbmF0aW9uKHRoaXMuX3VuYXVkaXRhYmxlRXhwbGFuYXRpb24pO3RoaXMuX3N0YXJ0Vmlldy5zZXRTdGFydEJ1dHRvbkVuYWJsZWQoIXRoaXMuX3VuYXVkaXRhYmxlRXhwbGFuYXRpb24pO2lmKCF0aGlzLl91bmF1ZGl0YWJsZUV4cGxhbmF0aW9uKQp0aGlzLl9zdGFydFZpZXcuZm9jdXNTdGFydEJ1dHRvbigpO3RoaXMuX25ld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9yZWZyZXNoVG9vbGJhclVJKCk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZENoaWxkKHRoaXMuX3N0YXJ0Vmlldyk7fQpfcmVuZGVyU3RhdHVzVmlldyhpbnNwZWN0ZWRVUkwpe3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaW4tcHJvZ3Jlc3MnLHRydWUpO3RoaXMuX3N0YXR1c1ZpZXcuc2V0SW5zcGVjdGVkVVJMKGluc3BlY3RlZFVSTCk7dGhpcy5fc3RhdHVzVmlldy5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO30KX3JlbmRlclJlcG9ydChsaWdodGhvdXNlUmVzdWx0LGFydGlmYWN0cyl7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdpbi1wcm9ncmVzcycsZmFsc2UpO3RoaXMuX3N0YXJ0Vmlldy5oaWRlV2lkZ2V0KCk7dGhpcy5fc3RhdHVzVmlldy5oaWRlKCk7dGhpcy5fYXVkaXRSZXN1bHRzRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX25ld0J1dHRvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMuX3JlZnJlc2hUb29sYmFyVUkoKTtjb25zdCBjYWNoZWRSZW5kZXJlZFJlcG9ydD10aGlzLl9jYWNoZWRSZW5kZXJlZFJlcG9ydHMuZ2V0KGxpZ2h0aG91c2VSZXN1bHQpO2lmKGNhY2hlZFJlbmRlcmVkUmVwb3J0KXt0aGlzLl9hdWRpdFJlc3VsdHNFbGVtZW50LmFwcGVuZENoaWxkKGNhY2hlZFJlbmRlcmVkUmVwb3J0KTtyZXR1cm47fQpjb25zdCByZXBvcnRDb250YWluZXI9dGhpcy5fYXVkaXRSZXN1bHRzRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbGgtdmFycyBsaC1yb290IGxoLWRldnRvb2xzJyk7Y29uc3QgZG9tPW5ldyBET00oKHRoaXMuX2F1ZGl0UmVzdWx0c0VsZW1lbnQub3duZXJEb2N1bWVudCkpO2NvbnN0IGRldGFpbHNSZW5kZXJlcj1uZXcgQXVkaXRzMi5EZXRhaWxzUmVuZGVyZXIoZG9tKTtjb25zdCBjYXRlZ29yeVJlbmRlcmVyPW5ldyBDYXRlZ29yeVJlbmRlcmVyKGRvbSxkZXRhaWxzUmVuZGVyZXIpO2NvbnN0IHJlbmRlcmVyPW5ldyBBdWRpdHMyLlJlcG9ydFJlbmRlcmVyKGRvbSxjYXRlZ29yeVJlbmRlcmVyKTtjb25zdCB0ZW1wbGF0ZXNIVE1MPVJ1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWydhdWRpdHMyL2xpZ2h0aG91c2UvdGVtcGxhdGVzLmh0bWwnXTtjb25zdCB0ZW1wbGF0ZXNET009bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZXNIVE1MLCd0ZXh0L2h0bWwnKTtpZighdGVtcGxhdGVzRE9NKQpyZXR1cm47cmVuZGVyZXIuc2V0VGVtcGxhdGVDb250ZXh0KHRlbXBsYXRlc0RPTSk7Y29uc3QgZWw9cmVuZGVyZXIucmVuZGVyUmVwb3J0KGxpZ2h0aG91c2VSZXN1bHQscmVwb3J0Q29udGFpbmVyKTtBdWRpdHMyLlJlcG9ydFJlbmRlcmVyLmFkZFZpZXdUcmFjZUJ1dHRvbihlbCxhcnRpZmFjdHMpO3RoaXMuX2NhY2hlZFJlbmRlcmVkUmVwb3J0cy5zZXQobGlnaHRob3VzZVJlc3VsdCxyZXBvcnRDb250YWluZXIpO30KX2J1aWxkUmVwb3J0VUkobGlnaHRob3VzZVJlc3VsdCxhcnRpZmFjdHMpe2lmKGxpZ2h0aG91c2VSZXN1bHQ9PT1udWxsKQpyZXR1cm47Y29uc3Qgb3B0aW9uRWxlbWVudD1uZXcgQXVkaXRzMi5SZXBvcnRTZWxlY3Rvci5JdGVtKGxpZ2h0aG91c2VSZXN1bHQsKCk9PnRoaXMuX3JlbmRlclJlcG9ydChsaWdodGhvdXNlUmVzdWx0LGFydGlmYWN0cyksdGhpcy5fcmVuZGVyU3RhcnRWaWV3LmJpbmQodGhpcykpO3RoaXMuX3JlcG9ydFNlbGVjdG9yLnByZXBlbmQob3B0aW9uRWxlbWVudCk7dGhpcy5fcmVmcmVzaFRvb2xiYXJVSSgpO3RoaXMuX3JlbmRlclJlcG9ydChsaWdodGhvdXNlUmVzdWx0KTt9Cl9oYW5kbGVEcm9wKGRhdGFUcmFuc2Zlcil7Y29uc3QgaXRlbXM9ZGF0YVRyYW5zZmVyLml0ZW1zO2lmKCFpdGVtcy5sZW5ndGgpCnJldHVybjtjb25zdCBpdGVtPWl0ZW1zWzBdO2lmKGl0ZW0ua2luZD09PSdmaWxlJyl7Y29uc3QgZW50cnk9aXRlbXNbMF0ud2Via2l0R2V0QXNFbnRyeSgpO2lmKCFlbnRyeS5pc0ZpbGUpCnJldHVybjtlbnRyeS5maWxlKGZpbGU9Pntjb25zdCByZWFkZXI9bmV3IEZpbGVSZWFkZXIoKTtyZWFkZXIub25sb2FkPSgpPT50aGlzLl9sb2FkZWRGcm9tRmlsZSgocmVhZGVyLnJlc3VsdCkpO3JlYWRlci5yZWFkQXNUZXh0KGZpbGUpO30pO319Cl9sb2FkZWRGcm9tRmlsZShyZXBvcnQpe2NvbnN0IGRhdGE9SlNPTi5wYXJzZShyZXBvcnQpO2lmKCFkYXRhWydsaWdodGhvdXNlVmVyc2lvbiddKQpyZXR1cm47dGhpcy5fYnVpbGRSZXBvcnRVSSgoZGF0YSkpO30KYXN5bmMgX3N0YXJ0QXVkaXQoKXtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLkF1ZGl0czJTdGFydGVkKTt0cnl7Y29uc3QgaW5zcGVjdGVkVVJMPWF3YWl0IHRoaXMuX2NvbnRyb2xsZXIuZ2V0SW5zcGVjdGVkVVJMKHtmb3JjZTp0cnVlfSk7Y29uc3QgY2F0ZWdvcnlJRHM9dGhpcy5fY29udHJvbGxlci5nZXRDYXRlZ29yeUlEcygpO2NvbnN0IGZsYWdzPXRoaXMuX2NvbnRyb2xsZXIuZ2V0RmxhZ3MoKTthd2FpdCB0aGlzLl9zZXR1cEVtdWxhdGlvbkFuZFByb3RvY29sQ29ubmVjdGlvbigpO3RoaXMuX3JlbmRlclN0YXR1c1ZpZXcoaW5zcGVjdGVkVVJMKTtjb25zdCBsaWdodGhvdXNlUmVzcG9uc2U9YXdhaXQgdGhpcy5fcHJvdG9jb2xTZXJ2aWNlLnN0YXJ0TGlnaHRob3VzZShpbnNwZWN0ZWRVUkwsY2F0ZWdvcnlJRHMsZmxhZ3MpO2lmKGxpZ2h0aG91c2VSZXNwb25zZSYmbGlnaHRob3VzZVJlc3BvbnNlLmZhdGFsKXtjb25zdCBlcnJvcj1uZXcgRXJyb3IobGlnaHRob3VzZVJlc3BvbnNlLm1lc3NhZ2UpO2Vycm9yLnN0YWNrPWxpZ2h0aG91c2VSZXNwb25zZS5zdGFjazt0aHJvdyBlcnJvcjt9CmlmKCFsaWdodGhvdXNlUmVzcG9uc2UpCnRocm93IG5ldyBFcnJvcignQXVkaXRpbmcgZmFpbGVkIHRvIHByb2R1Y2UgYSByZXN1bHQnKTtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLkF1ZGl0czJGaW5pc2hlZCk7YXdhaXQgdGhpcy5fcmVzZXRFbXVsYXRpb25BbmRQcm90b2NvbENvbm5lY3Rpb24oKTt0aGlzLl9idWlsZFJlcG9ydFVJKGxpZ2h0aG91c2VSZXNwb25zZS5saHIsbGlnaHRob3VzZVJlc3BvbnNlLmFydGlmYWN0cyk7fWNhdGNoKGVycil7aWYoZXJyIGluc3RhbmNlb2YgRXJyb3IpCnRoaXMuX3N0YXR1c1ZpZXcucmVuZGVyQnVnUmVwb3J0KGVycik7fX0KYXN5bmMgX2NhbmNlbEF1ZGl0KCl7dGhpcy5fc3RhdHVzVmlldy51cGRhdGVTdGF0dXMobHNgQ2FuY2VsbGluZ2ApO2F3YWl0IHRoaXMuX3Jlc2V0RW11bGF0aW9uQW5kUHJvdG9jb2xDb25uZWN0aW9uKCk7dGhpcy5fcmVuZGVyU3RhcnRWaWV3KCk7fQphc3luYyBfc2V0dXBFbXVsYXRpb25BbmRQcm90b2NvbENvbm5lY3Rpb24oKXtjb25zdCBmbGFncz10aGlzLl9jb250cm9sbGVyLmdldEZsYWdzKCk7Y29uc3QgZW11bGF0aW9uTW9kZWw9c2VsZi5zaW5nbGV0b24oRW11bGF0aW9uLkRldmljZU1vZGVNb2RlbCk7dGhpcy5fZW11bGF0aW9uRW5hYmxlZEJlZm9yZT1lbXVsYXRpb25Nb2RlbC5lbmFibGVkU2V0dGluZygpLmdldCgpO3RoaXMuX2VtdWxhdGlvbk91dGxpbmVFbmFibGVkQmVmb3JlPWVtdWxhdGlvbk1vZGVsLmRldmljZU91dGxpbmVTZXR0aW5nKCkuZ2V0KCk7ZW11bGF0aW9uTW9kZWwudG9vbGJhckNvbnRyb2xzRW5hYmxlZFNldHRpbmcoKS5zZXQoZmFsc2UpO2lmKGZsYWdzLmRpc2FibGVEZXZpY2VFbXVsYXRpb24pe2VtdWxhdGlvbk1vZGVsLmVuYWJsZWRTZXR0aW5nKCkuc2V0KGZhbHNlKTtlbXVsYXRpb25Nb2RlbC5kZXZpY2VPdXRsaW5lU2V0dGluZygpLnNldChmYWxzZSk7ZW11bGF0aW9uTW9kZWwuZW11bGF0ZShFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsLlR5cGUuTm9uZSxudWxsLG51bGwpO31lbHNle2VtdWxhdGlvbk1vZGVsLmVuYWJsZWRTZXR0aW5nKCkuc2V0KHRydWUpO2VtdWxhdGlvbk1vZGVsLmRldmljZU91dGxpbmVTZXR0aW5nKCkuc2V0KHRydWUpO2Zvcihjb25zdCBkZXZpY2Ugb2YgRW11bGF0aW9uLkVtdWxhdGVkRGV2aWNlc0xpc3QuaW5zdGFuY2UoKS5zdGFuZGFyZCgpKXtpZihkZXZpY2UudGl0bGU9PT0nTmV4dXMgNVgnKQplbXVsYXRpb25Nb2RlbC5lbXVsYXRlKEVtdWxhdGlvbi5EZXZpY2VNb2RlTW9kZWwuVHlwZS5EZXZpY2UsZGV2aWNlLGRldmljZS5tb2Rlc1swXSwxKTt9fQphd2FpdCB0aGlzLl9wcm90b2NvbFNlcnZpY2UuYXR0YWNoKCk7dGhpcy5faXNMSEF0dGFjaGVkPXRydWU7fQphc3luYyBfcmVzZXRFbXVsYXRpb25BbmRQcm90b2NvbENvbm5lY3Rpb24oKXtpZighdGhpcy5faXNMSEF0dGFjaGVkKQpyZXR1cm47dGhpcy5faXNMSEF0dGFjaGVkPWZhbHNlO2F3YWl0IHRoaXMuX3Byb3RvY29sU2VydmljZS5kZXRhY2goKTtjb25zdCBlbXVsYXRpb25Nb2RlbD1zZWxmLnNpbmdsZXRvbihFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsKTtlbXVsYXRpb25Nb2RlbC5lbmFibGVkU2V0dGluZygpLnNldCh0aGlzLl9lbXVsYXRpb25FbmFibGVkQmVmb3JlKTtlbXVsYXRpb25Nb2RlbC5kZXZpY2VPdXRsaW5lU2V0dGluZygpLnNldCh0aGlzLl9lbXVsYXRpb25PdXRsaW5lRW5hYmxlZEJlZm9yZSk7ZW11bGF0aW9uTW9kZWwudG9vbGJhckNvbnRyb2xzRW5hYmxlZFNldHRpbmcoKS5zZXQodHJ1ZSk7RW11bGF0aW9uLkluc3BlY3RlZFBhZ2VQbGFjZWhvbGRlci5pbnN0YW5jZSgpLnVwZGF0ZSh0cnVlKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtjb25zdCBpbnNwZWN0ZWRVUkw9YXdhaXQgdGhpcy5fY29udHJvbGxlci5nZXRJbnNwZWN0ZWRVUkwoKTthd2FpdCByZXNvdXJjZVRyZWVNb2RlbC5uYXZpZ2F0ZShpbnNwZWN0ZWRVUkwpO319OztBdWRpdHMyLkF1ZGl0Q29udHJvbGxlcj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IocHJvdG9jb2xTZXJ2aWNlKXtzdXBlcigpO3Byb3RvY29sU2VydmljZS5yZWdpc3RlclN0YXR1c0NhbGxiYWNrKG1lc3NhZ2U9PnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEF1ZGl0czIuRXZlbnRzLkF1ZGl0UHJvZ3Jlc3NDaGFuZ2VkLHttZXNzYWdlfSkpO2Zvcihjb25zdCBwcmVzZXQgb2YgQXVkaXRzMi5QcmVzZXRzKQpwcmVzZXQuc2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlY29tcHV0ZVBhZ2VBdWRpdGFiaWxpdHkuYmluZCh0aGlzKSk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuU2VydmljZVdvcmtlck1hbmFnZXIsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzLnJlY29tcHV0ZVBhZ2VBdWRpdGFiaWxpdHksdGhpcyk7fQptb2RlbEFkZGVkKHNlcnZpY2VXb3JrZXJNYW5hZ2VyKXtpZih0aGlzLl9tYW5hZ2VyKQpyZXR1cm47dGhpcy5fbWFuYWdlcj1zZXJ2aWNlV29ya2VyTWFuYWdlcjt0aGlzLl9zZXJ2aWNlV29ya2VyTGlzdGVuZXJzPVt0aGlzLl9tYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25VcGRhdGVkLHRoaXMucmVjb21wdXRlUGFnZUF1ZGl0YWJpbGl0eSx0aGlzKSx0aGlzLl9tYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25EZWxldGVkLHRoaXMucmVjb21wdXRlUGFnZUF1ZGl0YWJpbGl0eSx0aGlzKSxdO3RoaXMucmVjb21wdXRlUGFnZUF1ZGl0YWJpbGl0eSgpO30KbW9kZWxSZW1vdmVkKHNlcnZpY2VXb3JrZXJNYW5hZ2VyKXtpZih0aGlzLl9tYW5hZ2VyIT09c2VydmljZVdvcmtlck1hbmFnZXIpCnJldHVybjtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fc2VydmljZVdvcmtlckxpc3RlbmVycyk7dGhpcy5fbWFuYWdlcj1udWxsO3RoaXMucmVjb21wdXRlUGFnZUF1ZGl0YWJpbGl0eSgpO30KX2hhc0FjdGl2ZVNlcnZpY2VXb3JrZXIoKXtpZighdGhpcy5fbWFuYWdlcikKcmV0dXJuIGZhbHNlO2NvbnN0IG1haW5UYXJnZXQ9dGhpcy5fbWFuYWdlci50YXJnZXQoKTtpZighbWFpblRhcmdldCkKcmV0dXJuIGZhbHNlO2NvbnN0IGluc3BlY3RlZFVSTD1tYWluVGFyZ2V0Lmluc3BlY3RlZFVSTCgpLmFzUGFyc2VkVVJMKCk7Y29uc3QgaW5zcGVjdGVkT3JpZ2luPWluc3BlY3RlZFVSTCYmaW5zcGVjdGVkVVJMLnNlY3VyaXR5T3JpZ2luKCk7Zm9yKGNvbnN0IHJlZ2lzdHJhdGlvbiBvZiB0aGlzLl9tYW5hZ2VyLnJlZ2lzdHJhdGlvbnMoKS52YWx1ZXMoKSl7aWYocmVnaXN0cmF0aW9uLnNlY3VyaXR5T3JpZ2luIT09aW5zcGVjdGVkT3JpZ2luKQpjb250aW51ZTtmb3IoY29uc3QgdmVyc2lvbiBvZiByZWdpc3RyYXRpb24udmVyc2lvbnMudmFsdWVzKCkpe2lmKHZlcnNpb24uY29udHJvbGxlZENsaWVudHMubGVuZ3RoPjEpCnJldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9Cl9oYXNBdExlYXN0T25lQ2F0ZWdvcnkoKXtyZXR1cm4gQXVkaXRzMi5QcmVzZXRzLnNvbWUocHJlc2V0PT5wcmVzZXQuc2V0dGluZy5nZXQoKSk7fQpfdW5hdWRpdGFibGVQYWdlTWVzc2FnZSgpe2lmKCF0aGlzLl9tYW5hZ2VyKQpyZXR1cm4gbnVsbDtjb25zdCBtYWluVGFyZ2V0PXRoaXMuX21hbmFnZXIudGFyZ2V0KCk7Y29uc3QgaW5zcGVjdGVkVVJMPW1haW5UYXJnZXQmJm1haW5UYXJnZXQuaW5zcGVjdGVkVVJMKCk7aWYoaW5zcGVjdGVkVVJMJiYhL14oaHR0cHxjaHJvbWUtZXh0ZW5zaW9uKS8udGVzdChpbnNwZWN0ZWRVUkwpKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdDYW4gb25seSBhdWRpdCBIVFRQL0hUVFBTIHBhZ2VzIGFuZCBDaHJvbWUgZXh0ZW5zaW9ucy4gJysnTmF2aWdhdGUgdG8gYSBkaWZmZXJlbnQgcGFnZSB0byBzdGFydCBhbiBhdWRpdC4nKTt9CmlmKCFIb3N0LmlzVW5kZXJUZXN0KCkmJiFSdW50aW1lLnF1ZXJ5UGFyYW0oJ2Nhbl9kb2NrJykpCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0NhbiBvbmx5IGF1ZGl0IHRhYnMuIE5hdmlnYXRlIHRvIHRoaXMgcGFnZSBpbiBhIHNlcGFyYXRlIHRhYiB0byBzdGFydCBhbiBhdWRpdC4nKTtyZXR1cm4gbnVsbDt9CmFzeW5jIF9ldmFsdWF0ZUluc3BlY3RlZFVSTCgpe2NvbnN0IG1haW5UYXJnZXQ9dGhpcy5fbWFuYWdlci50YXJnZXQoKTtjb25zdCBydW50aW1lTW9kZWw9bWFpblRhcmdldC5tb2RlbChTREsuUnVudGltZU1vZGVsKTtjb25zdCBleGVjdXRpb25Db250ZXh0PXJ1bnRpbWVNb2RlbCYmcnVudGltZU1vZGVsLmRlZmF1bHRFeGVjdXRpb25Db250ZXh0KCk7bGV0IGluc3BlY3RlZFVSTD1tYWluVGFyZ2V0Lmluc3BlY3RlZFVSTCgpO2lmKCFleGVjdXRpb25Db250ZXh0KQpyZXR1cm4gaW5zcGVjdGVkVVJMO3RyeXtjb25zdCByZXN1bHQ9YXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSh7ZXhwcmVzc2lvbjond2luZG93LmxvY2F0aW9uLmhyZWYnLG9iamVjdEdyb3VwOidhdWRpdHMnLGluY2x1ZGVDb21tYW5kTGluZUFQSTpmYWxzZSxzaWxlbnQ6ZmFsc2UscmV0dXJuQnlWYWx1ZTp0cnVlLGdlbmVyYXRlUHJldmlldzpmYWxzZX0sZmFsc2UsZmFsc2UpO2lmKCFyZXN1bHQuZXhjZXB0aW9uRGV0YWlscyYmcmVzdWx0Lm9iamVjdCl7aW5zcGVjdGVkVVJMPXJlc3VsdC5vYmplY3QudmFsdWU7cmVzdWx0Lm9iamVjdC5yZWxlYXNlKCk7fX1jYXRjaChlcnIpe2NvbnNvbGUuZXJyb3IoZXJyKTt9CnJldHVybiBpbnNwZWN0ZWRVUkw7fQpnZXRGbGFncygpe2NvbnN0IGZsYWdzPXt9O2Zvcihjb25zdCBydW50aW1lU2V0dGluZyBvZiBBdWRpdHMyLlJ1bnRpbWVTZXR0aW5ncykKcnVudGltZVNldHRpbmcuc2V0RmxhZ3MoZmxhZ3MscnVudGltZVNldHRpbmcuc2V0dGluZy5nZXQoKSk7cmV0dXJuIGZsYWdzO30KZ2V0Q2F0ZWdvcnlJRHMoKXtjb25zdCBjYXRlZ29yeUlEcz1bXTtmb3IoY29uc3QgcHJlc2V0IG9mIEF1ZGl0czIuUHJlc2V0cyl7aWYocHJlc2V0LnNldHRpbmcuZ2V0KCkpCmNhdGVnb3J5SURzLnB1c2gocHJlc2V0LmNvbmZpZ0lEKTt9CnJldHVybiBjYXRlZ29yeUlEczt9CmFzeW5jIGdldEluc3BlY3RlZFVSTChvcHRpb25zKXtpZihvcHRpb25zJiZvcHRpb25zLmZvcmNlfHwhdGhpcy5faW5zcGVjdGVkVVJMKQp0aGlzLl9pbnNwZWN0ZWRVUkw9YXdhaXQgdGhpcy5fZXZhbHVhdGVJbnNwZWN0ZWRVUkwoKTtyZXR1cm4gdGhpcy5faW5zcGVjdGVkVVJMO30KcmVjb21wdXRlUGFnZUF1ZGl0YWJpbGl0eSgpe2NvbnN0IGhhc0FjdGl2ZVNlcnZpY2VXb3JrZXI9dGhpcy5faGFzQWN0aXZlU2VydmljZVdvcmtlcigpO2NvbnN0IGhhc0F0TGVhc3RPbmVDYXRlZ29yeT10aGlzLl9oYXNBdExlYXN0T25lQ2F0ZWdvcnkoKTtjb25zdCB1bmF1ZGl0YWJsZVBhZ2VNZXNzYWdlPXRoaXMuX3VuYXVkaXRhYmxlUGFnZU1lc3NhZ2UoKTtsZXQgaGVscFRleHQ9Jyc7aWYoaGFzQWN0aXZlU2VydmljZVdvcmtlcil7aGVscFRleHQ9Q29tbW9uLlVJU3RyaW5nKCdNdWx0aXBsZSB0YWJzIGFyZSBiZWluZyBjb250cm9sbGVkIGJ5IHRoZSBzYW1lIHNlcnZpY2Ugd29ya2VyLiAnKydDbG9zZSB5b3VyIG90aGVyIHRhYnMgb24gdGhlIHNhbWUgb3JpZ2luIHRvIGF1ZGl0IHRoaXMgcGFnZS4nKTt9ZWxzZSBpZighaGFzQXRMZWFzdE9uZUNhdGVnb3J5KXtoZWxwVGV4dD1Db21tb24uVUlTdHJpbmcoJ0F0IGxlYXN0IG9uZSBjYXRlZ29yeSBtdXN0IGJlIHNlbGVjdGVkLicpO31lbHNlIGlmKHVuYXVkaXRhYmxlUGFnZU1lc3NhZ2Upe2hlbHBUZXh0PXVuYXVkaXRhYmxlUGFnZU1lc3NhZ2U7fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhBdWRpdHMyLkV2ZW50cy5QYWdlQXVkaXRhYmlsaXR5Q2hhbmdlZCx7aGVscFRleHR9KTt9fTtBdWRpdHMyLlByZXNldDtBdWRpdHMyLlByZXNldHM9W3tzZXR0aW5nOkNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdhdWRpdHMyLmNhdF9wZXJmJyx0cnVlKSxjb25maWdJRDoncGVyZm9ybWFuY2UnLHRpdGxlOidQZXJmb3JtYW5jZScsZGVzY3JpcHRpb246J0hvdyBsb25nIGRvZXMgdGhpcyBhcHAgdGFrZSB0byBzaG93IGNvbnRlbnQgYW5kIGJlY29tZSB1c2FibGUnfSx7c2V0dGluZzpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnYXVkaXRzMi5jYXRfcHdhJyx0cnVlKSxjb25maWdJRDoncHdhJyx0aXRsZTonUHJvZ3Jlc3NpdmUgV2ViIEFwcCcsZGVzY3JpcHRpb246J0RvZXMgdGhpcyBwYWdlIG1lZXQgdGhlIHN0YW5kYXJkIG9mIGEgUHJvZ3Jlc3NpdmUgV2ViIEFwcCd9LHtzZXR0aW5nOkNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdhdWRpdHMyLmNhdF9iZXN0X3ByYWN0aWNlcycsdHJ1ZSksY29uZmlnSUQ6J2Jlc3QtcHJhY3RpY2VzJyx0aXRsZTonQmVzdCBwcmFjdGljZXMnLGRlc2NyaXB0aW9uOidEb2VzIHRoaXMgcGFnZSBmb2xsb3cgYmVzdCBwcmFjdGljZXMgZm9yIG1vZGVybiB3ZWIgZGV2ZWxvcG1lbnQnfSx7c2V0dGluZzpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnYXVkaXRzMi5jYXRfYTExeScsdHJ1ZSksY29uZmlnSUQ6J2FjY2Vzc2liaWxpdHknLHRpdGxlOidBY2Nlc3NpYmlsaXR5JyxkZXNjcmlwdGlvbjonSXMgdGhpcyBwYWdlIHVzYWJsZSBieSBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMgb3IgaW1wYWlybWVudHMnfSx7c2V0dGluZzpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnYXVkaXRzMi5jYXRfc2VvJyx0cnVlKSxjb25maWdJRDonc2VvJyx0aXRsZTonU0VPJyxkZXNjcmlwdGlvbjonSXMgdGhpcyBwYWdlIG9wdGltaXplZCBmb3Igc2VhcmNoIGVuZ2luZSByZXN1bHRzIHJhbmtpbmcnfSxdO0F1ZGl0czIuUnVudGltZVNldHRpbmc7QXVkaXRzMi5SdW50aW1lU2V0dGluZ3M9W3tzZXR0aW5nOkNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdhdWRpdHMyLmRldmljZV90eXBlJywnbW9iaWxlJyksZGVzY3JpcHRpb246bHNgQXBwbHkgbW9iaWxlIGVtdWxhdGlvbiBkdXJpbmcgYXVkaXRpbmdgLHNldEZsYWdzOihmbGFncyx2YWx1ZSk9PntmbGFncy5kaXNhYmxlRGV2aWNlRW11bGF0aW9uPXZhbHVlPT09J2Rlc2t0b3AnO30sb3B0aW9uczpbe2xhYmVsOmxzYE1vYmlsZWAsdmFsdWU6J21vYmlsZSd9LHtsYWJlbDpsc2BEZXNrdG9wYCx2YWx1ZTonZGVza3RvcCd9LF0sfSx7c2V0dGluZzpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnYXVkaXRzMi50aHJvdHRsaW5nJywnZGVmYXVsdCcpLHNldEZsYWdzOihmbGFncyx2YWx1ZSk9Pntzd2l0Y2godmFsdWUpe2Nhc2UnZGV2dG9vbHMnOmZsYWdzLnRocm90dGxpbmdNZXRob2Q9J2RldnRvb2xzJzticmVhaztjYXNlJ29mZic6ZmxhZ3MudGhyb3R0bGluZ01ldGhvZD0ncHJvdmlkZWQnO2JyZWFrO2RlZmF1bHQ6ZmxhZ3MudGhyb3R0bGluZ01ldGhvZD0nc2ltdWxhdGUnO319LG9wdGlvbnM6W3tsYWJlbDpsc2BTaW11bGF0ZWQgRmFzdCAzRywgNHggQ1BVIFNsb3dkb3duYCx2YWx1ZTonZGVmYXVsdCcsdGl0bGU6J1Rocm90dGxpbmcgaXMgc2ltdWxhdGVkLCByZXN1bHRpbmcgaW4gZmFzdGVyIGF1ZGl0IHJ1bnMgd2l0aCBzaW1pbGFyIG1lYXN1cmVtZW50IGFjY3VyYWN5J30se2xhYmVsOmxzYEFwcGxpZWQgRmFzdCAzRywgNHggQ1BVIFNsb3dkb3duYCx2YWx1ZTonZGV2dG9vbHMnLHRpdGxlOidUeXBpY2FsIERldlRvb2xzIHRocm90dGxpbmcsIHdpdGggYWN0dWFsIHRyYWZmaWMgc2hhcGluZyBhbmQgQ1BVIHNsb3dkb3duIGFwcGxpZWQnfSx7bGFiZWw6bHNgTm8gdGhyb3R0bGluZ2AsdmFsdWU6J29mZicsdGl0bGU6J05vIG5ldHdvcmsgb3IgQ1BVIHRocm90dGxpbmcgdXNlZC4gKFVzZWZ1bCB3aGVuIG5vdCBldmFsdWF0aW5nIHBlcmZvcm1hbmNlKSd9LF0sfSx7c2V0dGluZzpDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnYXVkaXRzMi5jbGVhcl9zdG9yYWdlJyx0cnVlKSx0aXRsZTpsc2BDbGVhciBzdG9yYWdlYCxkZXNjcmlwdGlvbjpsc2BSZXNldCBzdG9yYWdlIChsb2NhbFN0b3JhZ2UsIEluZGV4ZWREQiwgZXRjKSBiZWZvcmUgYXVkaXRpbmcuIChHb29kIGZvciBwZXJmb3JtYW5jZSAmIFBXQSB0ZXN0aW5nKWAsc2V0RmxhZ3M6KGZsYWdzLHZhbHVlKT0+e2ZsYWdzLmRpc2FibGVTdG9yYWdlUmVzZXQ9IXZhbHVlO30sfSxdO0F1ZGl0czIuRXZlbnRzPXtQYWdlQXVkaXRhYmlsaXR5Q2hhbmdlZDpTeW1ib2woJ1BhZ2VBdWRpdGFiaWxpdHlDaGFuZ2VkJyksQXVkaXRQcm9ncmVzc0NoYW5nZWQ6U3ltYm9sKCdBdWRpdFByb2dyZXNzQ2hhbmdlZCcpLFJlcXVlc3RBdWRpdFN0YXJ0OlN5bWJvbCgnUmVxdWVzdEF1ZGl0U3RhcnQnKSxSZXF1ZXN0QXVkaXRDYW5jZWw6U3ltYm9sKCdSZXF1ZXN0QXVkaXRDYW5jZWwnKSx9OztBdWRpdHMyLlJlcG9ydFNlbGVjdG9yPWNsYXNze2NvbnN0cnVjdG9yKHJlbmRlck5ld0F1ZGl0Vmlldyl7dGhpcy5fcmVuZGVyTmV3QXVkaXRWaWV3PXJlbmRlck5ld0F1ZGl0Vmlldzt0aGlzLl9uZXdBdWRpdEl0ZW09Y3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7dGhpcy5fY29tYm9Cb3g9bmV3IFVJLlRvb2xiYXJDb21ib0JveCh0aGlzLl9oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKSwnYXVkaXRzMi1yZXBvcnQnKTt0aGlzLl9jb21ib0JveC5zZXRUaXRsZShsc2BSZXBvcnRzYCk7dGhpcy5fY29tYm9Cb3guc2V0TWF4V2lkdGgoMTgwKTt0aGlzLl9jb21ib0JveC5zZXRNaW5XaWR0aCgxNDApO3RoaXMuX2l0ZW1CeU9wdGlvbkVsZW1lbnQ9bmV3IE1hcCgpO3RoaXMuX3NldEVtcHR5U3RhdGUoKTt9Cl9zZXRFbXB0eVN0YXRlKCl7dGhpcy5fY29tYm9Cb3guc2VsZWN0RWxlbWVudCgpLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fY29tYm9Cb3guc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fbmV3QXVkaXRJdGVtPWNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO3RoaXMuX25ld0F1ZGl0SXRlbS5sYWJlbD1Db21tb24uVUlTdHJpbmcoJyhuZXcgYXVkaXQpJyk7dGhpcy5fY29tYm9Cb3guc2VsZWN0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRoaXMuX25ld0F1ZGl0SXRlbSk7dGhpcy5fY29tYm9Cb3guc2VsZWN0KHRoaXMuX25ld0F1ZGl0SXRlbSk7fQpfaGFuZGxlQ2hhbmdlKGV2ZW50KXtjb25zdCBpdGVtPXRoaXMuX3NlbGVjdGVkSXRlbSgpO2lmKGl0ZW0pCml0ZW0uc2VsZWN0KCk7ZWxzZQp0aGlzLl9yZW5kZXJOZXdBdWRpdFZpZXcoKTt9Cl9zZWxlY3RlZEl0ZW0oKXtjb25zdCBvcHRpb249dGhpcy5fY29tYm9Cb3guc2VsZWN0ZWRPcHRpb24oKTtyZXR1cm4gdGhpcy5faXRlbUJ5T3B0aW9uRWxlbWVudC5nZXQob3B0aW9uKTt9Cmhhc0N1cnJlbnRTZWxlY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3NlbGVjdGVkSXRlbSgpO30KaGFzSXRlbXMoKXtyZXR1cm4gdGhpcy5faXRlbUJ5T3B0aW9uRWxlbWVudC5zaXplPjA7fQpjb21ib0JveCgpe3JldHVybiB0aGlzLl9jb21ib0JveDt9CnByZXBlbmQoaXRlbSl7Y29uc3Qgb3B0aW9uRWw9aXRlbS5vcHRpb25FbGVtZW50KCk7Y29uc3Qgc2VsZWN0RWw9dGhpcy5fY29tYm9Cb3guc2VsZWN0RWxlbWVudCgpO3RoaXMuX2l0ZW1CeU9wdGlvbkVsZW1lbnQuc2V0KG9wdGlvbkVsLGl0ZW0pO3NlbGVjdEVsLmluc2VydEJlZm9yZShvcHRpb25FbCxzZWxlY3RFbC5maXJzdEVsZW1lbnRDaGlsZCk7dGhpcy5fY29tYm9Cb3guc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9jb21ib0JveC5zZWxlY3Qob3B0aW9uRWwpO2l0ZW0uc2VsZWN0KCk7fQpjbGVhckFsbCgpe2Zvcihjb25zdCBlbGVtIG9mIHRoaXMuX2NvbWJvQm94Lm9wdGlvbnMoKSl7aWYoZWxlbT09PXRoaXMuX25ld0F1ZGl0SXRlbSkKY29udGludWU7dGhpcy5faXRlbUJ5T3B0aW9uRWxlbWVudC5nZXQoZWxlbSkuZGVsZXRlKCk7dGhpcy5faXRlbUJ5T3B0aW9uRWxlbWVudC5kZWxldGUoZWxlbSk7fQp0aGlzLl9zZXRFbXB0eVN0YXRlKCk7fQpkb3dubG9hZFNlbGVjdGVkKCl7Y29uc3QgaXRlbT10aGlzLl9zZWxlY3RlZEl0ZW0oKTtpZihpdGVtKQppdGVtLmRvd25sb2FkKCk7fQpzZWxlY3ROZXdBdWRpdCgpe3RoaXMuX2NvbWJvQm94LnNlbGVjdCh0aGlzLl9uZXdBdWRpdEl0ZW0pO319O0F1ZGl0czIuUmVwb3J0U2VsZWN0b3IuSXRlbT1jbGFzc3tjb25zdHJ1Y3RvcihsaWdodGhvdXNlUmVzdWx0LHJlbmRlclJlcG9ydCxzaG93TGFuZGluZ0NhbGxiYWNrKXt0aGlzLl9saWdodGhvdXNlUmVzdWx0PWxpZ2h0aG91c2VSZXN1bHQ7dGhpcy5fcmVuZGVyUmVwb3J0PXJlbmRlclJlcG9ydDt0aGlzLl9zaG93TGFuZGluZ0NhbGxiYWNrPXNob3dMYW5kaW5nQ2FsbGJhY2s7Y29uc3QgdXJsPW5ldyBDb21tb24uUGFyc2VkVVJMKGxpZ2h0aG91c2VSZXN1bHQuZmluYWxVcmwpO2NvbnN0IHRpbWVzdGFtcD1saWdodGhvdXNlUmVzdWx0LmZldGNoVGltZTt0aGlzLl9lbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO3RoaXMuX2VsZW1lbnQubGFiZWw9YCR7bmV3IERhdGUodGltZXN0YW1wKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0gLSAke3VybC5kb21haW4oKX1gO30Kc2VsZWN0KCl7dGhpcy5fcmVuZGVyUmVwb3J0KCk7fQpvcHRpb25FbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQ7fQpkZWxldGUoKXtpZih0aGlzLl9lbGVtZW50KQp0aGlzLl9lbGVtZW50LnJlbW92ZSgpO3RoaXMuX3Nob3dMYW5kaW5nQ2FsbGJhY2soKTt9CmRvd25sb2FkKCl7Y29uc3QgZG9tYWluPW5ldyBDb21tb24uUGFyc2VkVVJMKHRoaXMuX2xpZ2h0aG91c2VSZXN1bHQuZmluYWxVcmwpLmRvbWFpbigpO2NvbnN0IHNhbml0aXplZERvbWFpbj1kb21haW4ucmVwbGFjZSgvW15hLXowLTkuLV0rL2dpLCdfJyk7Y29uc3QgdGltZXN0YW1wPXRoaXMuX2xpZ2h0aG91c2VSZXN1bHQuZmV0Y2hUaW1lO2NvbnN0IGZpbGVOYW1lPWAke3Nhbml0aXplZERvbWFpbn0tJHtuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPODYwMUNvbXBhY3QoKX0uanNvbmA7V29ya3NwYWNlLmZpbGVNYW5hZ2VyLnNhdmUoZmlsZU5hbWUsSlNPTi5zdHJpbmdpZnkodGhpcy5fbGlnaHRob3VzZVJlc3VsdCksdHJ1ZSk7fX07O0F1ZGl0czIuUmVwb3J0UmVuZGVyZXI9Y2xhc3MgZXh0ZW5kcyBSZXBvcnRSZW5kZXJlcntzdGF0aWMgYWRkVmlld1RyYWNlQnV0dG9uKGVsLGFydGlmYWN0cyl7aWYoIWFydGlmYWN0c3x8IWFydGlmYWN0cy50cmFjZXN8fCFhcnRpZmFjdHMudHJhY2VzLmRlZmF1bHRQYXNzKQpyZXR1cm47Y29uc3QgZGVmYXVsdFBhc3NUcmFjZT1hcnRpZmFjdHMudHJhY2VzLmRlZmF1bHRQYXNzO2NvbnN0IHRpbWVsaW5lQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdWaWV3IFRyYWNlJyksb25WaWV3VHJhY2VDbGljaywndmlldy10cmFjZScpO2VsLnF1ZXJ5U2VsZWN0b3IoJy5saC1tZXRyaWMtY29sdW1uJykuYXBwZW5kQ2hpbGQodGltZWxpbmVCdXR0b24pO3JldHVybiBlbDthc3luYyBmdW5jdGlvbiBvblZpZXdUcmFjZUNsaWNrKCl7YXdhaXQgVUkuaW5zcGVjdG9yVmlldy5zaG93UGFuZWwoJ3RpbWVsaW5lJyk7VGltZWxpbmUuVGltZWxpbmVQYW5lbC5pbnN0YW5jZSgpLmxvYWRGcm9tRXZlbnRzKGRlZmF1bHRQYXNzVHJhY2UudHJhY2VFdmVudHMpO319fTtjbGFzcyBSZXBvcnRVSUZlYXR1cmVze2luaXRGZWF0dXJlcyhyZXBvcnQpe319CkF1ZGl0czIuRGV0YWlsc1JlbmRlcmVyPWNsYXNzIGV4dGVuZHMgRGV0YWlsc1JlbmRlcmVye2NvbnN0cnVjdG9yKGRvbSl7c3VwZXIoZG9tKTt0aGlzLl9vbkxvYWRQcm9taXNlPW51bGw7fQpyZW5kZXJOb2RlKGl0ZW0pe2NvbnN0IGVsZW1lbnQ9c3VwZXIucmVuZGVyTm9kZShpdGVtKTt0aGlzLl9yZXBsYWNlV2l0aERlZmVycmVkTm9kZUJsb2NrKGVsZW1lbnQsaXRlbSk7cmV0dXJuIGVsZW1lbnQ7fQphc3luYyBfcmVwbGFjZVdpdGhEZWZlcnJlZE5vZGVCbG9jayhvcmlnRWxlbWVudCxkZXRhaWxzSXRlbSl7Y29uc3QgbWFpblRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7aWYoIXRoaXMuX29uTG9hZFByb21pc2Upe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPW1haW5UYXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTt0aGlzLl9vbkxvYWRQcm9taXNlPXJlc291cmNlVHJlZU1vZGVsLm9uY2UoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5Mb2FkKTt9CmF3YWl0IHRoaXMuX29uTG9hZFByb21pc2U7Y29uc3QgZG9tTW9kZWw9bWFpblRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpO2lmKCFkZXRhaWxzSXRlbS5wYXRoKQpyZXR1cm47Y29uc3Qgbm9kZUlkPWF3YWl0IGRvbU1vZGVsLnB1c2hOb2RlQnlQYXRoVG9Gcm9udGVuZChkZXRhaWxzSXRlbS5wYXRoKTtpZighbm9kZUlkKQpyZXR1cm47Y29uc3Qgbm9kZT1kb21Nb2RlbC5ub2RlRm9ySWQobm9kZUlkKTtpZighbm9kZSkKcmV0dXJuO2NvbnN0IGVsZW1lbnQ9YXdhaXQgQ29tbW9uLkxpbmtpZmllci5saW5raWZ5KG5vZGUsKHt0aXRsZTpkZXRhaWxzSXRlbS5zbmlwcGV0fSkpO29yaWdFbGVtZW50LnRpdGxlPScnO29yaWdFbGVtZW50LnRleHRDb250ZW50PScnO29yaWdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO319OztBdWRpdHMyLlN0YXJ0Vmlldz1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcihjb250cm9sbGVyKXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnYXVkaXRzMi9hdWRpdHMyU3RhcnRWaWV3LmNzcycpO3RoaXMuX2NvbnRyb2xsZXI9Y29udHJvbGxlcjt0aGlzLl9yZW5kZXIoKTt9Cl9wb3B1bGF0ZVJ1bnRpbWVTZXR0aW5nQXNSYWRpbyhzZXR0aW5nTmFtZSxwYXJlbnRFbGVtZW50KXtjb25zdCBydW50aW1lU2V0dGluZz1BdWRpdHMyLlJ1bnRpbWVTZXR0aW5ncy5maW5kKGl0ZW09Pml0ZW0uc2V0dGluZy5uYW1lPT09c2V0dGluZ05hbWUpO2lmKCFydW50aW1lU2V0dGluZ3x8IXJ1bnRpbWVTZXR0aW5nLm9wdGlvbnMpCnRocm93IG5ldyBFcnJvcihgJHtzZXR0aW5nTmFtZX0gaXMgbm90IGEgc2V0dGluZyB3aXRoIG9wdGlvbnNgKTtjb25zdCBjb250cm9sPW5ldyBBdWRpdHMyLlJhZGlvU2V0dGluZyhydW50aW1lU2V0dGluZy5vcHRpb25zLHJ1bnRpbWVTZXR0aW5nLnNldHRpbmcpO2NvbnRyb2wuZWxlbWVudC50aXRsZT1ydW50aW1lU2V0dGluZy5kZXNjcmlwdGlvbjtwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRyb2wuZWxlbWVudCk7fQpfcG9wdWxhdGVSdW50aW1lU2V0dGluZ0FzQ2hlY2tib3goc2V0dGluZ05hbWUscGFyZW50RWxlbWVudCl7Y29uc3QgcnVudGltZVNldHRpbmc9QXVkaXRzMi5SdW50aW1lU2V0dGluZ3MuZmluZChpdGVtPT5pdGVtLnNldHRpbmcubmFtZT09PXNldHRpbmdOYW1lKTtpZighcnVudGltZVNldHRpbmd8fCFydW50aW1lU2V0dGluZy50aXRsZSkKdGhyb3cgbmV3IEVycm9yKGAke3NldHRpbmdOYW1lfSBpcyBub3QgYSBzZXR0aW5nIHdpdGggYSB0aXRsZWApO3J1bnRpbWVTZXR0aW5nLnNldHRpbmcuc2V0VGl0bGUocnVudGltZVNldHRpbmcudGl0bGUpO2NvbnN0IGNvbnRyb2w9bmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3gocnVudGltZVNldHRpbmcuc2V0dGluZyxydW50aW1lU2V0dGluZy5kZXNjcmlwdGlvbik7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250cm9sLmVsZW1lbnQpO30KX3BvcHVsYXRlRm9ybUNvbnRyb2xzKGZyYWdtZW50KXtjb25zdCBkZXZpY2VUeXBlRm9ybUVsZW1lbnRzPWZyYWdtZW50LiQoJ2RldmljZS10eXBlLWZvcm0tZWxlbWVudHMnKTt0aGlzLl9wb3B1bGF0ZVJ1bnRpbWVTZXR0aW5nQXNSYWRpbygnYXVkaXRzMi5kZXZpY2VfdHlwZScsZGV2aWNlVHlwZUZvcm1FbGVtZW50cyk7Y29uc3QgY2F0ZWdvcnlGb3JtRWxlbWVudHM9ZnJhZ21lbnQuJCgnY2F0ZWdvcmllcy1mb3JtLWVsZW1lbnRzJyk7Zm9yKGNvbnN0IHByZXNldCBvZiBBdWRpdHMyLlByZXNldHMpe3ByZXNldC5zZXR0aW5nLnNldFRpdGxlKHByZXNldC50aXRsZSk7Y29uc3QgY2hlY2tib3g9bmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3gocHJlc2V0LnNldHRpbmcpO2NvbnN0IHJvdz1jYXRlZ29yeUZvcm1FbGVtZW50cy5jcmVhdGVDaGlsZCgnZGl2JywndmJveCBhdWRpdHMyLWxhdW5jaGVyLXJvdycpO3Jvdy50aXRsZT1wcmVzZXQuZGVzY3JpcHRpb247cm93LmFwcGVuZENoaWxkKGNoZWNrYm94LmVsZW1lbnQpO30KY29uc3QgdGhyb3R0bGluZ0Zvcm1FbGVtZW50cz1mcmFnbWVudC4kKCd0aHJvdHRsaW5nLWZvcm0tZWxlbWVudHMnKTt0aGlzLl9wb3B1bGF0ZVJ1bnRpbWVTZXR0aW5nQXNSYWRpbygnYXVkaXRzMi50aHJvdHRsaW5nJyx0aHJvdHRsaW5nRm9ybUVsZW1lbnRzKTtjb25zdCBvdGhlckZvcm1FbGVtZW50cz1mcmFnbWVudC4kKCdvdGhlci1mb3JtLWVsZW1lbnRzJyk7dGhpcy5fcG9wdWxhdGVSdW50aW1lU2V0dGluZ0FzQ2hlY2tib3goJ2F1ZGl0czIuY2xlYXJfc3RvcmFnZScsb3RoZXJGb3JtRWxlbWVudHMpO30KX3JlbmRlcigpe3RoaXMuX3N0YXJ0QnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24obHNgUnVuIGF1ZGl0c2AsKCk9PnRoaXMuX2NvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEF1ZGl0czIuRXZlbnRzLlJlcXVlc3RBdWRpdFN0YXJ0KSwnYXVkaXRzMi1zdGFydC1idXR0b24nLHRydWUpO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX3N0YXJ0QnV0dG9uKTtjb25zdCBkZXZpY2VJY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tcGhvbmUnKTtjb25zdCBjYXRlZ29yaWVzSWNvbj1VSS5JY29uLmNyZWF0ZSgnbGFyZ2VpY29uLWNoZWNrbWFyaycpO2NvbnN0IHRocm90dGxpbmdJY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tc2V0dGluZ3MtZ2VhcicpO2NvbnN0IGZyYWdtZW50PVVJLkZyYWdtZW50LmJ1aWxkYAogICAgICA8ZGl2IGNsYXNzPSJ2Ym94IGF1ZGl0czItc3RhcnQtdmlldyI+CiAgICAgICAgPGhlYWRlcj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItbG9nbyI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLXN0YXJ0LXZpZXctdGV4dCI+CiAgICAgICAgICAgIDxoMj5BdWRpdHM8L2gyPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZGVudGlmeSBhbmQgZml4IGNvbW1vbiBwcm9ibGVtcyB0aGF0IGFmZmVjdCB5b3VyIHNpdGUncyBwZXJmb3JtYW5jZSwgYWNjZXNzaWJpbGl0eSwgYW5kIHVzZXIgZXhwZXJpZW5jZS4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGluayIgJD0ibGVhcm4tbW9yZSI+TGVhcm4gbW9yZTwvYT4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgPGZvcm0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1zZWN0aW9uLWxhYmVsIj4KICAgICAgICAgICAgICA8aT4ke2RldmljZUljb259PC9pPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItaWNvbi1sYWJlbCI+RGV2aWNlPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tZWxlbWVudHMiICQ9ImRldmljZS10eXBlLWZvcm0tZWxlbWVudHMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1zZWN0aW9uLWxhYmVsIj4KICAgICAgICAgICAgICA8aT4ke2NhdGVnb3JpZXNJY29ufTwvaT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWljb24tbGFiZWwiPkF1ZGl0czwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXVkaXRzMi1mb3JtLWVsZW1lbnRzIiAkPSJjYXRlZ29yaWVzLWZvcm0tZWxlbWVudHMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1zZWN0aW9uLWxhYmVsIj4KICAgICAgICAgICAgICA8aT4ke3Rocm90dGxpbmdJY29ufTwvaT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWljb24tbGFiZWwiPlRocm90dGxpbmc8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1lbGVtZW50cyIgJD0idGhyb3R0bGluZy1mb3JtLWVsZW1lbnRzIj48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYXVkaXRzMi1mb3JtLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tc2VjdGlvbi1sYWJlbCI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1lbGVtZW50cyIgJD0ib3RoZXItZm9ybS1lbGVtZW50cyI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItZm9ybS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXVkaXRzMi1mb3JtLXNlY3Rpb24tbGFiZWwiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLWZvcm0tZWxlbWVudHMgYXVkaXRzMi1zdGFydC1idXR0b24tY29udGFpbmVyIGhib3giPgogICAgICAgICAgICAgICR7dGhpcy5fc3RhcnRCdXR0b259CiAgICAgICAgICAgICAgPGRpdiAkPSJoZWxwLXRleHQiIGNsYXNzPSJhdWRpdHMyLWhlbHAtdGV4dCBoaWRkZW4iPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZm9ybT4KICAgICAgPC9kaXY+CiAgICBgO3RoaXMuX2hlbHBUZXh0PWZyYWdtZW50LiQoJ2hlbHAtdGV4dCcpO2NvbnN0IGxlYXJuTW9yZUxpbms9ZnJhZ21lbnQuJCgnbGVhcm4tbW9yZScpO2xlYXJuTW9yZUxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKCdodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS8nKSk7dGhpcy5fcG9wdWxhdGVGb3JtQ29udHJvbHMoZnJhZ21lbnQpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQuZWxlbWVudCgpKTt0aGlzLmNvbnRlbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93PSdhdXRvJzt9CmZvY3VzU3RhcnRCdXR0b24oKXt0aGlzLl9zdGFydEJ1dHRvbi5mb2N1cygpO30Kc2V0U3RhcnRCdXR0b25FbmFibGVkKGlzRW5hYmxlZCl7aWYodGhpcy5faGVscFRleHQpCnRoaXMuX2hlbHBUZXh0LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsaXNFbmFibGVkKTtpZih0aGlzLl9zdGFydEJ1dHRvbikKdGhpcy5fc3RhcnRCdXR0b24uZGlzYWJsZWQ9IWlzRW5hYmxlZDt9CnNldFVuYXVkaXRhYmxlRXhwbGFuYXRpb24odGV4dCl7aWYodGhpcy5faGVscFRleHQpCnRoaXMuX2hlbHBUZXh0LnRleHRDb250ZW50PXRleHQ7fX07O0F1ZGl0czIuU3RhdHVzVmlldz1jbGFzc3tjb25zdHJ1Y3Rvcihjb250cm9sbGVyKXt0aGlzLl9jb250cm9sbGVyPWNvbnRyb2xsZXI7dGhpcy5fc3RhdHVzVmlldz1udWxsO3RoaXMuX3N0YXR1c0hlYWRlcj1udWxsO3RoaXMuX3Byb2dyZXNzV3JhcHBlcj1udWxsO3RoaXMuX3Byb2dyZXNzQmFyPW51bGw7dGhpcy5fc3RhdHVzVGV4dD1udWxsO3RoaXMuX2luc3BlY3RlZFVSTD0nJzt0aGlzLl90ZXh0Q2hhbmdlZEF0PTA7dGhpcy5fZmFzdEZhY3RzUXVldWVkPUF1ZGl0czIuU3RhdHVzVmlldy5GYXN0RmFjdHMuc2xpY2UoKTt0aGlzLl9jdXJyZW50UGhhc2U9bnVsbDt0aGlzLl9zY2hlZHVsZWRUZXh0Q2hhbmdlVGltZW91dD1udWxsO3RoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dD1udWxsO3RoaXMuX2RpYWxvZz1uZXcgVUkuRGlhbG9nKCk7dGhpcy5fZGlhbG9nLnNldERpbW1lZCh0cnVlKTt0aGlzLl9kaWFsb2cuc2V0Q2xvc2VPbkVzY2FwZShmYWxzZSk7dGhpcy5fZGlhbG9nLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKGV2ZW50PT5ldmVudC5jb25zdW1lKHRydWUpKTt0aGlzLl9yZW5kZXIoKTt9Cl9yZW5kZXIoKXtjb25zdCBkaWFsb2dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLl9kaWFsb2cuY29udGVudEVsZW1lbnQsJ2F1ZGl0czIvYXVkaXRzMkRpYWxvZy5jc3MnKTtjb25zdCBhdWRpdHNWaWV3RWxlbWVudD1kaWFsb2dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdhdWRpdHMyLXZpZXcgdmJveCcpO2NvbnN0IGNhbmNlbEJ1dHRvbj1VSS5jcmVhdGVUZXh0QnV0dG9uKGxzYENhbmNlbGAsdGhpcy5fY2FuY2VsLmJpbmQodGhpcykpO2NvbnN0IGZyYWdtZW50PVVJLkZyYWdtZW50LmJ1aWxkYAogICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLXZpZXcgdmJveCI+CiAgICAgICAgPGgyICQ9InN0YXR1cy1oZWFkZXIiPkF1ZGl0aW5nIHlvdXIgd2ViIHBhZ2VcdTIwMjY8L2gyPgogICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItc3RhdHVzIHZib3giICQ9InN0YXR1cy12aWV3Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItcHJvZ3Jlc3Mtd3JhcHBlciIgJD0icHJvZ3Jlc3Mtd3JhcHBlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF1ZGl0czItcHJvZ3Jlc3MtYmFyIiAkPSJwcm9ncmVzcy1iYXIiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdWRpdHMyLXN0YXR1cy10ZXh0IiAkPSJzdGF0dXMtdGV4dCI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgJHtjYW5jZWxCdXR0b259CiAgICAgIDwvZGl2PgogICAgYDthdWRpdHNWaWV3RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudC5lbGVtZW50KCkpO2F1ZGl0c1ZpZXdFbGVtZW50LnRhYkluZGV4PTA7dGhpcy5fc3RhdHVzVmlldz1mcmFnbWVudC4kKCdzdGF0dXMtdmlldycpO3RoaXMuX3N0YXR1c0hlYWRlcj1mcmFnbWVudC4kKCdzdGF0dXMtaGVhZGVyJyk7dGhpcy5fcHJvZ3Jlc3NXcmFwcGVyPWZyYWdtZW50LiQoJ3Byb2dyZXNzLXdyYXBwZXInKTt0aGlzLl9wcm9ncmVzc0Jhcj1mcmFnbWVudC4kKCdwcm9ncmVzcy1iYXInKTt0aGlzLl9zdGF0dXNUZXh0PWZyYWdtZW50LiQoJ3N0YXR1cy10ZXh0Jyk7dGhpcy5fZGlhbG9nLnNldERlZmF1bHRGb2N1c2VkRWxlbWVudChjYW5jZWxCdXR0b24pO3RoaXMuX2RpYWxvZy5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5TZXRFeGFjdFdpZHRoTWF4SGVpZ2h0KTt0aGlzLl9kaWFsb2cuc2V0TWF4Q29udGVudFNpemUobmV3IFVJLlNpemUoNTAwLDQwMCkpO30KX3Jlc2V0KCl7dGhpcy5fcmVzZXRQcm9ncmVzc0JhckNsYXNzZXMoKTtjbGVhclRpbWVvdXQodGhpcy5fc2NoZWR1bGVkRmFzdEZhY3RUaW1lb3V0KTt0aGlzLl90ZXh0Q2hhbmdlZEF0PTA7dGhpcy5fZmFzdEZhY3RzUXVldWVkPUF1ZGl0czIuU3RhdHVzVmlldy5GYXN0RmFjdHMuc2xpY2UoKTt0aGlzLl9jdXJyZW50UGhhc2U9bnVsbDt0aGlzLl9zY2hlZHVsZWRUZXh0Q2hhbmdlVGltZW91dD1udWxsO3RoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dD1udWxsO30Kc2hvdyhkaWFsb2dSZW5kZXJFbGVtZW50KXt0aGlzLl9yZXNldCgpO3RoaXMudXBkYXRlU3RhdHVzKGxzYExvYWRpbmdcdTIwMjZgKTtjb25zdCBwYXJzZWRVUkw9dGhpcy5faW5zcGVjdGVkVVJMLmFzUGFyc2VkVVJMKCk7Y29uc3QgcGFnZUhvc3Q9cGFyc2VkVVJMJiZwYXJzZWRVUkwuaG9zdDtjb25zdCBzdGF0dXNIZWFkZXI9cGFnZUhvc3Q/bHNgQXVkaXRpbmcgJHtwYWdlSG9zdH1gOmxzYEF1ZGl0aW5nIHlvdXIgd2ViIHBhZ2VgO3RoaXMuX3N0YXR1c0hlYWRlci50ZXh0Q29udGVudD1gJHtzdGF0dXNIZWFkZXJ9XHUyMDI2YDt0aGlzLl9kaWFsb2cuc2hvdyhkaWFsb2dSZW5kZXJFbGVtZW50KTt9CmhpZGUoKXtpZih0aGlzLl9kaWFsb2cuaXNTaG93aW5nKCkpCnRoaXMuX2RpYWxvZy5oaWRlKCk7fQpzZXRJbnNwZWN0ZWRVUkwodXJsPScnKXt0aGlzLl9pbnNwZWN0ZWRVUkw9dXJsO30KdXBkYXRlU3RhdHVzKG1lc3NhZ2Upe2lmKCFtZXNzYWdlfHwhdGhpcy5fc3RhdHVzVGV4dCkKcmV0dXJuO2lmKG1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ2FuY2VsJykpe3RoaXMuX2NvbW1pdFRleHRDaGFuZ2UoQ29tbW9uLlVJU3RyaW5nKCdDYW5jZWxsaW5nXHUyMDI2JykpO2NsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRGYXN0RmFjdFRpbWVvdXQpO3JldHVybjt9CmNvbnN0IG5leHRQaGFzZT10aGlzLl9nZXRQaGFzZUZvck1lc3NhZ2UobWVzc2FnZSk7aWYoIW5leHRQaGFzZSYmIXRoaXMuX2N1cnJlbnRQaGFzZSl7dGhpcy5fY29tbWl0VGV4dENoYW5nZShDb21tb24uVUlTdHJpbmcoJ0xpZ2h0aG91c2UgaXMgd2FybWluZyB1cFx1MjAyNicpKTtjbGVhclRpbWVvdXQodGhpcy5fc2NoZWR1bGVkRmFzdEZhY3RUaW1lb3V0KTt9ZWxzZSBpZihuZXh0UGhhc2UmJighdGhpcy5fY3VycmVudFBoYXNlfHx0aGlzLl9jdXJyZW50UGhhc2Uub3JkZXI8bmV4dFBoYXNlLm9yZGVyKSl7dGhpcy5fY3VycmVudFBoYXNlPW5leHRQaGFzZTt0aGlzLl9zY2hlZHVsZVRleHRDaGFuZ2UodGhpcy5fZ2V0TWVzc2FnZUZvclBoYXNlKG5leHRQaGFzZSkpO3RoaXMuX3NjaGVkdWxlRmFzdEZhY3RDaGVjaygpO3RoaXMuX3Jlc2V0UHJvZ3Jlc3NCYXJDbGFzc2VzKCk7dGhpcy5fcHJvZ3Jlc3NCYXIuY2xhc3NMaXN0LmFkZChuZXh0UGhhc2UucHJvZ3Jlc3NCYXJDbGFzcyk7fX0KX2NhbmNlbCgpe3RoaXMuX2NvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEF1ZGl0czIuRXZlbnRzLlJlcXVlc3RBdWRpdENhbmNlbCk7fQpfZ2V0TWVzc2FnZUZvclBoYXNlKHBoYXNlKXtpZihwaGFzZS5tZXNzYWdlKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKHBoYXNlLm1lc3NhZ2UpO2NvbnN0IGRldmljZVR5cGU9QXVkaXRzMi5SdW50aW1lU2V0dGluZ3MuZmluZChpdGVtPT5pdGVtLnNldHRpbmcubmFtZT09PSdhdWRpdHMyLmRldmljZV90eXBlJykuc2V0dGluZy5nZXQoKTtjb25zdCB0aHJvdHRsaW5nPUF1ZGl0czIuUnVudGltZVNldHRpbmdzLmZpbmQoaXRlbT0+aXRlbS5zZXR0aW5nLm5hbWU9PT0nYXVkaXRzMi50aHJvdHRsaW5nJykuc2V0dGluZy5nZXQoKTtjb25zdCBtYXRjaD1BdWRpdHMyLlN0YXR1c1ZpZXcuTG9hZGluZ01lc3NhZ2VzLmZpbmQoaXRlbT0+e3JldHVybiBpdGVtLmRldmljZVR5cGU9PT1kZXZpY2VUeXBlJiZpdGVtLnRocm90dGxpbmc9PT10aHJvdHRsaW5nO30pO3JldHVybiBtYXRjaD9sc2Ake21hdGNoLm1lc3NhZ2V9YDpsc2BMaWdodGhvdXNlIGlzIGxvYWRpbmcgeW91ciBwYWdlYDt9Cl9nZXRQaGFzZUZvck1lc3NhZ2UobWVzc2FnZSl7cmV0dXJuIEF1ZGl0czIuU3RhdHVzVmlldy5TdGF0dXNQaGFzZXMuZmluZChwaGFzZT0+bWVzc2FnZS5zdGFydHNXaXRoKHBoYXNlLnN0YXR1c01lc3NhZ2VQcmVmaXgpKTt9Cl9yZXNldFByb2dyZXNzQmFyQ2xhc3Nlcygpe2lmKCF0aGlzLl9wcm9ncmVzc0JhcikKcmV0dXJuO3RoaXMuX3Byb2dyZXNzQmFyLmNsYXNzTmFtZT0nYXVkaXRzMi1wcm9ncmVzcy1iYXInO30KX3NjaGVkdWxlRmFzdEZhY3RDaGVjaygpe2lmKCF0aGlzLl9jdXJyZW50UGhhc2V8fHRoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dCkKcmV0dXJuO3RoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dD1zZXRUaW1lb3V0KCgpPT57dGhpcy5fdXBkYXRlRmFzdEZhY3RJZk5lY2Vzc2FyeSgpO3RoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dD1udWxsO3RoaXMuX3NjaGVkdWxlRmFzdEZhY3RDaGVjaygpO30sMTAwKTt9Cl91cGRhdGVGYXN0RmFjdElmTmVjZXNzYXJ5KCl7Y29uc3Qgbm93PXBlcmZvcm1hbmNlLm5vdygpO2lmKG5vdy10aGlzLl90ZXh0Q2hhbmdlZEF0PEF1ZGl0czIuU3RhdHVzVmlldy5mYXN0RmFjdFJvdGF0aW9uSW50ZXJ2YWwpCnJldHVybjtpZighdGhpcy5fZmFzdEZhY3RzUXVldWVkLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGZhc3RGYWN0SW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuX2Zhc3RGYWN0c1F1ZXVlZC5sZW5ndGgpO3RoaXMuX3NjaGVkdWxlVGV4dENoYW5nZShsc2BcdWQ4M2RcdWRjYTEgJHt0aGlzLl9mYXN0RmFjdHNRdWV1ZWRbZmFzdEZhY3RJbmRleF19YCk7dGhpcy5fZmFzdEZhY3RzUXVldWVkLnNwbGljZShmYXN0RmFjdEluZGV4LDEpO30KX2NvbW1pdFRleHRDaGFuZ2UodGV4dCl7aWYoIXRoaXMuX3N0YXR1c1RleHQpCnJldHVybjt0aGlzLl90ZXh0Q2hhbmdlZEF0PXBlcmZvcm1hbmNlLm5vdygpO3RoaXMuX3N0YXR1c1RleHQudGV4dENvbnRlbnQ9dGV4dDt9Cl9zY2hlZHVsZVRleHRDaGFuZ2UodGV4dCl7aWYodGhpcy5fc2NoZWR1bGVkVGV4dENoYW5nZVRpbWVvdXQpCmNsZWFyVGltZW91dCh0aGlzLl9zY2hlZHVsZWRUZXh0Q2hhbmdlVGltZW91dCk7Y29uc3QgbXNTaW5jZUxhc3RDaGFuZ2U9cGVyZm9ybWFuY2Uubm93KCktdGhpcy5fdGV4dENoYW5nZWRBdDtjb25zdCBtc1RvVGV4dENoYW5nZT1BdWRpdHMyLlN0YXR1c1ZpZXcubWluaW11bVRleHRWaXNpYmlsaXR5RHVyYXRpb24tbXNTaW5jZUxhc3RDaGFuZ2U7dGhpcy5fc2NoZWR1bGVkVGV4dENoYW5nZVRpbWVvdXQ9c2V0VGltZW91dCgoKT0+e3RoaXMuX2NvbW1pdFRleHRDaGFuZ2UodGV4dCk7fSxNYXRoLm1heChtc1RvVGV4dENoYW5nZSwwKSk7fQpyZW5kZXJCdWdSZXBvcnQoZXJyKXtjb25zb2xlLmVycm9yKGVycik7Y2xlYXJUaW1lb3V0KHRoaXMuX3NjaGVkdWxlZEZhc3RGYWN0VGltZW91dCk7Y2xlYXJUaW1lb3V0KHRoaXMuX3NjaGVkdWxlZFRleHRDaGFuZ2VUaW1lb3V0KTt0aGlzLl9yZXNldFByb2dyZXNzQmFyQ2xhc3NlcygpO3RoaXMuX3Byb2dyZXNzQmFyLmNsYXNzTGlzdC5hZGQoJ2Vycm9yZWQnKTt0aGlzLl9jb21taXRUZXh0Q2hhbmdlKCcnKTt0aGlzLl9zdGF0dXNUZXh0LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ0FoLCBzb3JyeSEgV2UgcmFuIGludG8gYW4gZXJyb3I6ICcpKTt0aGlzLl9zdGF0dXNUZXh0LmNyZWF0ZUNoaWxkKCdlbScpLmNyZWF0ZVRleHRDaGlsZChlcnIubWVzc2FnZSk7aWYoQXVkaXRzMi5TdGF0dXNWaWV3Lktub3duQnVnUGF0dGVybnMuc29tZShwYXR0ZXJuPT5wYXR0ZXJuLnRlc3QoZXJyLm1lc3NhZ2UpKSl7Y29uc3QgbWVzc2FnZT1Db21tb24uVUlTdHJpbmcoJ1RyeSB0byBuYXZpZ2F0ZSB0byB0aGUgVVJMIGluIGEgZnJlc2ggQ2hyb21lIHByb2ZpbGUgd2l0aG91dCBhbnkgb3RoZXIgdGFicyBvciAnKydleHRlbnNpb25zIG9wZW4gYW5kIHRyeSBhZ2Fpbi4nKTt0aGlzLl9zdGF0dXNUZXh0LmNyZWF0ZUNoaWxkKCdwJykuY3JlYXRlVGV4dENoaWxkKG1lc3NhZ2UpO31lbHNle3RoaXMuX3JlbmRlckJ1Z1JlcG9ydExpbmsoZXJyLHRoaXMuX2luc3BlY3RlZFVSTCk7fX0KX3JlbmRlckJ1Z1JlcG9ydExpbmsoZXJyLGF1ZGl0VVJMKXtjb25zdCBiYXNlVVJJPSdodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL2xpZ2h0aG91c2UvaXNzdWVzL25ldz8nO2NvbnN0IHRpdGxlPWVuY29kZVVSSSgndGl0bGU9RGV2VG9vbHMgRXJyb3I6ICcrZXJyLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNjApKTtjb25zdCBpc3N1ZUJvZHk9YAoqKkluaXRpYWwgVVJMKio6ICR7YXVkaXRVUkx9CioqQ2hyb21lIFZlcnNpb24qKjogJHtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhcUyspLylbMV19CioqRXJyb3IgTWVzc2FnZSoqOiAke2Vyci5tZXNzYWdlfQoqKlN0YWNrIFRyYWNlKio6ClxgXGBcYAoke2Vyci5zdGFja30KXGBcYFxgCiAgICBgO2NvbnN0IGJvZHk9JyZib2R5PScrZW5jb2RlVVJJQ29tcG9uZW50KGlzc3VlQm9keS50cmltKCkpO2NvbnN0IHJlcG9ydEVycm9yRWw9VUkuWExpbmsuY3JlYXRlKGJhc2VVUkkrdGl0bGUrYm9keSxDb21tb24uVUlTdHJpbmcoJ1JlcG9ydCB0aGlzIGJ1ZycpLCdhdWRpdHMyLWxpbmsgYXVkaXRzMi1yZXBvcnQtZXJyb3InKTt0aGlzLl9zdGF0dXNUZXh0LmFwcGVuZENoaWxkKHJlcG9ydEVycm9yRWwpO319O0F1ZGl0czIuU3RhdHVzVmlldy5Lbm93bkJ1Z1BhdHRlcm5zPVsvUEFSU0lOR19QUk9CTEVNLywvRE9DVU1FTlRfUkVRVUVTVC8sL1JFQURfRkFJTEVELywvVFJBQ0lOR19BTFJFQURZX1NUQVJURUQvLC9eWW91IG11c3QgcHJvdmlkZSBhIHVybCB0byB0aGUgcnVubmVyLywvXllvdSBwcm9iYWJseSBoYXZlIG11bHRpcGxlIHRhYnMgb3Blbi8sXTtBdWRpdHMyLlN0YXR1c1ZpZXcuU3RhdHVzUGhhc2VzPVt7aWQ6J2xvYWRpbmcnLHByb2dyZXNzQmFyQ2xhc3M6J2xvYWRpbmcnLHN0YXR1c01lc3NhZ2VQcmVmaXg6J0xvYWRpbmcgcGFnZScsb3JkZXI6MTAsfSx7aWQ6J2dhdGhlcmluZycscHJvZ3Jlc3NCYXJDbGFzczonZ2F0aGVyaW5nJyxtZXNzYWdlOidMaWdodGhvdXNlIGlzIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFnZSB0byBjb21wdXRlIHlvdXIgc2NvcmUuJyxzdGF0dXNNZXNzYWdlUHJlZml4OidSZXRyaWV2aW5nJyxvcmRlcjoyMCx9LHtpZDonYXVkaXRpbmcnLHByb2dyZXNzQmFyQ2xhc3M6J2F1ZGl0aW5nJyxtZXNzYWdlOidBbG1vc3QgdGhlcmUhIExpZ2h0aG91c2UgaXMgbm93IGdlbmVyYXRpbmcgeW91ciBvd24gc3BlY2lhbCBwcmV0dHkgcmVwb3J0IScsc3RhdHVzTWVzc2FnZVByZWZpeDonRXZhbHVhdGluZycsb3JkZXI6MzAsfV07QXVkaXRzMi5TdGF0dXNWaWV3LkxvYWRpbmdNZXNzYWdlcz1be2RldmljZVR5cGU6J21vYmlsZScsdGhyb3R0bGluZzonb24nLG1lc3NhZ2U6J0xpZ2h0aG91c2UgaXMgbG9hZGluZyB5b3VyIHBhZ2Ugd2l0aCB0aHJvdHRsaW5nIHRvIG1lYXN1cmUgcGVyZm9ybWFuY2Ugb24gYSBtb2JpbGUgZGV2aWNlIG9uIDNHLicsfSx7ZGV2aWNlVHlwZTonZGVza3RvcCcsdGhyb3R0bGluZzonb24nLG1lc3NhZ2U6J0xpZ2h0aG91c2UgaXMgbG9hZGluZyB5b3VyIHBhZ2Ugd2l0aCB0aHJvdHRsaW5nIHRvIG1lYXN1cmUgcGVyZm9ybWFuY2Ugb24gYSBzbG93IGRlc2t0b3Agb24gM0cuJyx9LHtkZXZpY2VUeXBlOidtb2JpbGUnLHRocm90dGxpbmc6J29mZicsbWVzc2FnZTonTGlnaHRob3VzZSBpcyBsb2FkaW5nIHlvdXIgcGFnZSB3aXRoIG1vYmlsZSBlbXVsYXRpb24uJyx9LHtkZXZpY2VUeXBlOidkZXNrdG9wJyx0aHJvdHRsaW5nOidvZmYnLG1lc3NhZ2U6J0xpZ2h0aG91c2UgaXMgbG9hZGluZyB5b3VyIHBhZ2UuJyx9LF07QXVkaXRzMi5TdGF0dXNWaWV3LkZhc3RGYWN0cz1bJzFNQiB0YWtlcyBhIG1pbmltdW0gb2YgNSBzZWNvbmRzIHRvIGRvd25sb2FkIG9uIGEgdHlwaWNhbCAzRyBjb25uZWN0aW9uIFtTb3VyY2U6IFdlYlBhZ2VUZXN0IGFuZCBEZXZUb29scyAzRyBkZWZpbml0aW9uXS4nLCdSZWJ1aWxkaW5nIFBpbnRlcmVzdCBwYWdlcyBmb3IgcGVyZm9ybWFuY2UgaW5jcmVhc2VkIGNvbnZlcnNpb24gcmF0ZXMgYnkgMTUlIFtTb3VyY2U6IFdQTyBTdGF0c10nLCdCQkMgaGFzIHNlZW4gYSBsb3NzIG9mIDEwJSBvZiB0aGVpciB1c2VycyBmb3IgZXZlcnkgZXh0cmEgc2Vjb25kIG9mIHBhZ2UgbG9hZCBbU291cmNlOiBXUE8gU3RhdHNdJywnQnkgcmVkdWNpbmcgdGhlIHJlc3BvbnNlIHNpemUgb2YgSlNPTiBuZWVkZWQgZm9yIGRpc3BsYXlpbmcgY29tbWVudHMsIEluc3RhZ3JhbSBzYXcgaW5jcmVhc2VkIGltcHJlc3Npb25zIFtTb3VyY2U6IFdQTyBTdGF0c10nLCdXYWxtYXJ0IHNhdyBhIDElIGluY3JlYXNlIGluIHJldmVudWUgZm9yIGV2ZXJ5IDEwMG1zIGltcHJvdmVtZW50IGluIHBhZ2UgbG9hZCBbU291cmNlOiBXUE8gU3RhdHNdJywnSWYgYSBzaXRlIHRha2VzID4xIHNlY29uZCB0byBiZWNvbWUgaW50ZXJhY3RpdmUsIHVzZXJzIGxvc2UgYXR0ZW50aW9uLCBhbmQgdGhlaXIgcGVyY2VwdGlvbiBvZiBjb21wbGV0aW5nIHRoZSBwYWdlIHRhc2sgaXMgYnJva2VuIFtTb3VyY2U6IEdvb2dsZSBEZXZlbG9wZXJzIEJsb2ddJywnNzUlIG9mIGdsb2JhbCBtb2JpbGUgdXNlcnMgaW4gMjAxNiB3ZXJlIG9uIDJHIG9yIDNHIFtTb3VyY2U6IEdTTUEgTW9iaWxlXScsJ1RoZSBhdmVyYWdlIHVzZXIgZGV2aWNlIGNvc3RzIGxlc3MgdGhhbiAyMDAgVVNELiBbU291cmNlOiBJbnRlcm5hdGlvbmFsIERhdGEgQ29ycG9yYXRpb25dJywnNTMlIG9mIGFsbCBzaXRlIHZpc2l0cyBhcmUgYWJhbmRvbmVkIGlmIHBhZ2UgbG9hZCB0YWtlcyBtb3JlIHRoYW4gMyBzZWNvbmRzIFtTb3VyY2U6IEdvb2dsZSBEb3VibGVDbGljayBibG9nXScsJzE5IHNlY29uZHMgaXMgdGhlIGF2ZXJhZ2UgdGltZSBhIG1vYmlsZSB3ZWIgcGFnZSB0YWtlcyB0byBsb2FkIG9uIGEgM0cgY29ubmVjdGlvbiBbU291cmNlOiBHb29nbGUgRG91YmxlQ2xpY2sgYmxvZ10nLCcxNCBzZWNvbmRzIGlzIHRoZSBhdmVyYWdlIHRpbWUgYSBtb2JpbGUgd2ViIHBhZ2UgdGFrZXMgdG8gbG9hZCBvbiBhIDRHIGNvbm5lY3Rpb24gW1NvdXJjZTogR29vZ2xlIERvdWJsZUNsaWNrIGJsb2ddJywnNzAlIG9mIG1vYmlsZSBwYWdlcyB0YWtlIG5lYXJseSA3IHNlY29uZHMgZm9yIHRoZSB2aXN1YWwgY29udGVudCBhYm92ZSB0aGUgZm9sZCB0byBkaXNwbGF5IG9uIHRoZSBzY3JlZW4uIFtTb3VyY2U6IFRoaW5rIHdpdGggR29vZ2xlXScsJ0FzIHBhZ2UgbG9hZCB0aW1lIGluY3JlYXNlcyBmcm9tIG9uZSBzZWNvbmQgdG8gc2V2ZW4gc2Vjb25kcywgdGhlIHByb2JhYmlsaXR5IG9mIGEgbW9iaWxlIHNpdGUgdmlzaXRvciBib3VuY2luZyBpbmNyZWFzZXMgMTEzJS4gW1NvdXJjZTogVGhpbmsgd2l0aCBHb29nbGVdJywnQXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvbiBhIHBhZ2UgaW5jcmVhc2VzIGZyb20gNDAwIHRvIDYsMDAwLCB0aGUgcHJvYmFiaWxpdHkgb2YgY29udmVyc2lvbiBkcm9wcyA5NSUuIFtTb3VyY2U6IFRoaW5rIHdpdGggR29vZ2xlXScsJzcwJSBvZiBtb2JpbGUgcGFnZXMgd2VpZ2ggb3ZlciAxTUIsIDM2JSBvdmVyIDJNQiwgYW5kIDEyJSBvdmVyIDRNQi4gW1NvdXJjZTogVGhpbmsgd2l0aCBHb29nbGVdJywnTGlnaHRob3VzZSBvbmx5IHNpbXVsYXRlcyBtb2JpbGUgcGVyZm9ybWFuY2U7IHRvIG1lYXN1cmUgcGVyZm9ybWFuY2Ugb24gYSByZWFsIGRldmljZSwgdHJ5IFdlYlBhZ2VUZXN0Lm9yZyBbU291cmNlOiBMaWdodGhvdXNlIHRlYW1dJyxdO0F1ZGl0czIuU3RhdHVzVmlldy5mYXN0RmFjdFJvdGF0aW9uSW50ZXJ2YWw9NjAwMDtBdWRpdHMyLlN0YXR1c1ZpZXcubWluaW11bVRleHRWaXNpYmlsaXR5RHVyYXRpb249MzAwMDs7QXVkaXRzMi5Qcm90b2NvbFNlcnZpY2U9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9yYXdDb25uZWN0aW9uPW51bGw7dGhpcy5fYmFja2VuZD1udWxsO3RoaXMuX2JhY2tlbmRQcm9taXNlPW51bGw7dGhpcy5fc3RhdHVzPW51bGw7fQphdHRhY2goKXtyZXR1cm4gSW5zcGVjdG9yTWFpbi5pbnRlcmNlcHRNYWluQ29ubmVjdGlvbih0aGlzLl9kaXNwYXRjaFByb3RvY29sTWVzc2FnZS5iaW5kKHRoaXMpKS50aGVuKHJhd0Nvbm5lY3Rpb249Pnt0aGlzLl9yYXdDb25uZWN0aW9uPXJhd0Nvbm5lY3Rpb247fSk7fQpzdGFydExpZ2h0aG91c2UoYXVkaXRVUkwsY2F0ZWdvcnlJRHMsZmxhZ3Mpe3JldHVybiB0aGlzLl9zZW5kKCdzdGFydCcse3VybDphdWRpdFVSTCxjYXRlZ29yeUlEcyxmbGFnc30pO30KZGV0YWNoKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuX3NlbmQoJ3N0b3AnKSkudGhlbigoKT0+dGhpcy5fYmFja2VuZC5kaXNwb3NlKCkpLnRoZW4oKCk9PntkZWxldGUgdGhpcy5fYmFja2VuZDtkZWxldGUgdGhpcy5fYmFja2VuZFByb21pc2U7cmV0dXJuIHRoaXMuX3Jhd0Nvbm5lY3Rpb24uZGlzY29ubmVjdCgpO30pO30KcmVnaXN0ZXJTdGF0dXNDYWxsYmFjayhjYWxsYmFjayl7dGhpcy5fc3RhdHVzPWNhbGxiYWNrO30KX2Rpc3BhdGNoUHJvdG9jb2xNZXNzYWdlKG1lc3NhZ2Upe3RoaXMuX3NlbmQoJ2Rpc3BhdGNoUHJvdG9jb2xNZXNzYWdlJyx7bWVzc2FnZTptZXNzYWdlfSk7fQpfaW5pdFdvcmtlcigpe3RoaXMuX2JhY2tlbmRQcm9taXNlPVNlcnZpY2VzLnNlcnZpY2VNYW5hZ2VyLmNyZWF0ZUFwcFNlcnZpY2UoJ2F1ZGl0czJfd29ya2VyJywnQXVkaXRzMlNlcnZpY2UnKS50aGVuKGJhY2tlbmQ9PntpZih0aGlzLl9iYWNrZW5kKQpyZXR1cm47dGhpcy5fYmFja2VuZD1iYWNrZW5kO3RoaXMuX2JhY2tlbmQub24oJ3N0YXR1c1VwZGF0ZScscmVzdWx0PT50aGlzLl9zdGF0dXMocmVzdWx0Lm1lc3NhZ2UpKTt0aGlzLl9iYWNrZW5kLm9uKCdzZW5kUHJvdG9jb2xNZXNzYWdlJyxyZXN1bHQ9PnRoaXMuX3NlbmRQcm90b2NvbE1lc3NhZ2UocmVzdWx0Lm1lc3NhZ2UpKTt9KTt9Cl9zZW5kUHJvdG9jb2xNZXNzYWdlKG1lc3NhZ2Upe3RoaXMuX3Jhd0Nvbm5lY3Rpb24uc2VuZE1lc3NhZ2UobWVzc2FnZSk7fQpfc2VuZChtZXRob2QscGFyYW1zKXtpZighdGhpcy5fYmFja2VuZFByb21pc2UpCnRoaXMuX2luaXRXb3JrZXIoKTtyZXR1cm4gdGhpcy5fYmFja2VuZFByb21pc2UudGhlbihfPT50aGlzLl9iYWNrZW5kLnNlbmQobWV0aG9kLHBhcmFtcykpO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1siYXVkaXRzMi9hdWRpdHMyRGlhbG9nLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5hdWRpdHMyLXZpZXcge1xuICAgIC0tdmlldy1ob3Jpem9udGFsLW1hcmdpbjogMjBweDtcbiAgICBtYXJnaW46IDdweCB2YXIoLS12aWV3LWhvcml6b250YWwtbWFyZ2luKTtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbn1cblxuLmF1ZGl0czItdmlldyBoMiB7XG4gICAgY29sb3I6ICM2NjY7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZsZXg6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmF1ZGl0czItdmlldyBidXR0b24ge1xuICAgIHotaW5kZXg6IDEwO1xufVxuXG4uYXVkaXRzMi1zdGF0dXMge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsZXg6IGF1dG87XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBjb2xvcjogIzY2Njtcbn1cblxuLmF1ZGl0czItc3RhdHVzLXRleHQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtaW4taGVpZ2h0OiA1MHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uYXVkaXRzMi1wcm9ncmVzcy13cmFwcGVyIHtcbiAgICB3aWR0aDogY2FsYygxMDAlICsgMiAqIHZhcigtLXZpZXctaG9yaXpvbnRhbC1tYXJnaW4pKTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFGNUZFO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDEwcHg7XG59XG5cbi5hdWRpdHMyLXByb2dyZXNzLWJhciB7XG4gICAgd2lkdGg6IDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjMDM5QkU1O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzO1xuICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIC0tcHJvZ3Jlc3MtYmFyLWxvYWRpbmctZHVyYXRpb246IDQ1cztcbiAgICAtLXByb2dyZXNzLWJhci1nYXRoZXJpbmctZHVyYXRpb246IDEycztcbiAgICAtLXByb2dyZXNzLWJhci1nYXRoZXJpbmctcGVyY2VudDogNzAlO1xuICAgIC0tcHJvZ3Jlc3MtYmFyLWF1ZGl0aW5nLWR1cmF0aW9uOiA1cztcbiAgICAtLXByb2dyZXNzLWJhci1hdWRpdGluZy1wZXJjZW50OiA5NSU7XG59XG5cbi5hdWRpdHMyLXByb2dyZXNzLWJhci5lcnJvcmVkIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjRTUwMzAzO1xufVxuXG4uYXVkaXRzMi1wcm9ncmVzcy1iYXIubG9hZGluZyB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wcm9ncmVzcy1iYXItbG9hZGluZy1kdXJhdGlvbik7XG4gICAgYW5pbWF0aW9uLW5hbWU6IHByb2dyZXNzQmFyTG9hZGluZztcbn1cblxuQGtleWZyYW1lcyBwcm9ncmVzc0JhckxvYWRpbmcge1xuICAwJSB7IHdpZHRoOiAwJTsgfVxuICAxMDAlIHsgd2lkdGg6IHZhcigtLXByb2dyZXNzLWJhci1nYXRoZXJpbmctcGVyY2VudCk7IH1cbn1cblxuLmF1ZGl0czItcHJvZ3Jlc3MtYmFyLmdhdGhlcmluZyB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wcm9ncmVzcy1iYXItZ2F0aGVyaW5nLWR1cmF0aW9uKTtcbiAgICBhbmltYXRpb24tbmFtZTogcHJvZ3Jlc3NCYXJHYXRoZXJpbmc7XG59XG5cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NCYXJHYXRoZXJpbmcge1xuICAwJSB7IHdpZHRoOiB2YXIoLS1wcm9ncmVzcy1iYXItZ2F0aGVyaW5nLXBlcmNlbnQpOyB9XG4gIDEwMCUgeyB3aWR0aDogdmFyKC0tcHJvZ3Jlc3MtYmFyLWF1ZGl0aW5nLXBlcmNlbnQpOyB9XG59XG5cbi5hdWRpdHMyLXByb2dyZXNzLWJhci5hdWRpdGluZyB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wcm9ncmVzcy1iYXItYXVkaXRpbmctZHVyYXRpb24pO1xuICAgIGFuaW1hdGlvbi1uYW1lOiBwcm9ncmVzc0JhckF1ZGl0aW5nO1xufVxuXG5Aa2V5ZnJhbWVzIHByb2dyZXNzQmFyQXVkaXRpbmcge1xuICAwJSB7IHdpZHRoOiB2YXIoLS1wcm9ncmVzcy1iYXItYXVkaXRpbmctcGVyY2VudCk7IH1cbiAgMTAwJSB7IHdpZHRoOiA5OSU7IH1cbn1cblxuLmF1ZGl0czItcmVwb3J0LWVycm9yIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tdG9wOiA1cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9YXVkaXRzMi9hdWRpdHMyRGlhbG9nLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImF1ZGl0czIvYXVkaXRzMlN0YXJ0Vmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uYXVkaXRzMi1zdGFydC12aWV3IHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMThweDtcbn1cblxuLmF1ZGl0czItc3RhcnQtdmlldyBoZWFkZXIge1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5hdWRpdHMyLWxvZ28ge1xuICAgIHdpZHRoOiAxNTBweDtcbiAgICBoZWlnaHQ6IDE1MHB4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAgIG1hcmdpbi1yaWdodDogMjBweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2F1ZGl0c19sb2dvLnN2Zyk7XG59XG5cbi5hdWRpdHMyLXN0YXJ0LXZpZXctdGV4dCB7XG4gIGNvbG9yOiAjNzU3NTc1O1xuICBtYXJnaW4tdG9wOiAyNHB4O1xufVxuXG4uYXVkaXRzMi1zdGFydC12aWV3LXRleHQgaDIge1xuICBjb2xvcjogYmxhY2s7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cblxuLmF1ZGl0czItc3RhcnQtdmlldy10ZXh0IHAge1xuICBtYXJnaW4tdG9wOiAwO1xufVxuXG4uYXVkaXRzMi1zdGFydC12aWV3IGZvcm0ge1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG5cbi5hdWRpdHMyLWZvcm0tc2VjdGlvbiB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJlYmViO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiAxNnB4IDhweDtcbn1cblxuLmF1ZGl0czItZm9ybS1zZWN0aW9uOmxhc3QtY2hpbGQge1xuICBib3JkZXItdG9wOiBub25lO1xuICBwYWRkaW5nLXRvcDogMDtcbn1cblxuLmF1ZGl0czItZm9ybS1zZWN0aW9uLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgd2lkdGg6IDE2MHB4O1xufVxuXG4uYXVkaXRzMi1mb3JtLXNlY3Rpb24tbGFiZWwgaSB7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5hdWRpdHMyLWljb24tbGFiZWwge1xuICBtYXJnaW46IDAgMTRweDtcbn1cblxuLmF1ZGl0czItZm9ybS1zZWN0aW9uLWxhYmVsIGkgc3BhbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMnB4O1xufVxuXG4uYXVkaXRzMi1mb3JtLXNlY3Rpb24tbGFiZWwgc3Bhbi5sYXJnZWljb24tY2hlY2ttYXJrIHtcbiAgdG9wOiAtNHB4O1xufVxuXG4uYXVkaXRzMi1yYWRpbyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG5cbi5hdWRpdHMyLXJhZGlvOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYXVkaXRzMi1zdGFydC1idXR0b24tY29udGFpbmVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmF1ZGl0czItc3RhcnQtYnV0dG9uIHtcbiAgbWF4LXdpZHRoOiAxMDBweDtcbn1cblxuLmF1ZGl0czItc3RhcnQtdmlldyAudG9vbGJhci1kcm9wZG93bi1hcnJvdyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5hdWRpdHMyLWxhdW5jaGVyLXJvdyB7XG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XG59XG5cbi5hdWRpdHMyLWxhdW5jaGVyLXJvdzpsYXN0LW9mLXR5cGUge1xuICBwYWRkaW5nLWJvdHRvbTogMDtcbn1cblxuLmF1ZGl0czItbGF1bmNoZXItcm93IC5kaW1tZWQge1xuICBwYWRkaW5nLWxlZnQ6IDIycHg7XG59XG5cbi5hdWRpdHMyLWhlbHAtdGV4dCB7XG4gIGNvbG9yOiByZWQ7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4vKiMgc291cmNlVVJMPWF1ZGl0czIvYXVkaXRzMlN0YXJ0Vmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJhdWRpdHMyL2F1ZGl0czJQYW5lbC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4udG9vbGJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xufVxuXG4ubGgtcm9vdCB7XG4gIC0tcmVwb3J0LW1lbnUtd2lkdGg6IDA7XG4gIHVzZXItc2VsZWN0OiB0ZXh0O1xuICAtLWxoLWJnLWNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saC1iZy1jb2xvcik7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmxoLXJvb3Qge1xuICAtLWhlYWRlci1iZy1jb2xvcjogaHNsKDAsIDAlLCAyMCUpO1xuICAtLWxoLXRhYmxlLWhlYWRlci1iZzogaHNsKDAsIDAlLCAyMCUpO1xuICAtLWRpc3BsYXktdmFsdWUtZ3JheTogaHNsKDAsIDAlLCA2NiUpO1xuICAtLW1lZGl1bS03NS1ncmF5OiBoc2woMCwgMCUsIDY2JSk7XG5cbiAgLS1zdWJoZWFkZXItY29sb3I6IGhzbCgyMTAsIDE1JSwgODAlKTtcbiAgLS1saC1iZy1jb2xvcjogaHNsKDAsIDAlLCAxNCUpO1xuICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiBoc2woMCwgMCUsIDY2JSk7XG4gIC0tcmVwb3J0LXNlY29uZGFyeS1ib3JkZXItY29sb3I6IGhzbCgwLCAwJSwgOCUpO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5saC1yb290IC5saC1nYXVnZSB7XG4gIC0tY2lyY2xlLWJhY2tncm91bmQ6IGhzbCgwLCAwJSwgMjclKTtcbiAgLS1pbnNldC1jb2xvcjogdmFyKC0tbGgtYmctY29sb3IpO1xufVxuXG4ubGgtcm9vdCAubGgtY29udGFpbmVyIHtcbiAgd29yZC13cmFwOiBub3JtYWw7XG59XG5cbi5saC1yb290IHByZSB7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbn1cblxuLyogZm9yIFZpZXcgVHJhY2UgYnV0dG9uICovXG4ubGgtYXVkaXQtZ3JvdXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5idXR0b24udmlldy10cmFjZSB7XG4gIG1hcmdpbjogMTBweDtcbn1cblxuLmF1ZGl0czItcmVzdWx0cy1jb250YWluZXIge1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8qIFRPRE8ocGh1bGNlKTogcmVtb3ZlIHRoZSBiZWxvdyBvbiBuZXh0IExIIHJvbGwgKi9cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubGgtc2NvcmVzLXdyYXBwZXJfX2JhY2tncm91bmQsIC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmxoLXNjb3Jlcy13cmFwcGVyX19zaGFkb3cge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1saC1iZy1jb2xvcikgIWltcG9ydGFudDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubGgtZ2F1Z2VfX2xhYmVsIHtcbiAgY29sb3I6IGhzbCgyMTAsIDE1JSwgODAlKTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubGgtcm9vdCAubGgtYXVkaXQgYSwgLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubGgtZm9vdGVyIGEge1xuICBjb2xvcjogaHNsKDIxMCwgOTAlLCA2MCUpO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5saC1sb2FkLW9wcG9ydHVuaXR5X19oZWFkZXIgLmxoLWxvYWQtb3Bwb3J0dW5pdHlfX2NvbCB7XG4gIGJhY2tncm91bmQ6IGhzbCgwLCAwJSwgMjAlKTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubGgtY3JjIC5jcmMtbm9kZV9fdHJlZS1ob3N0bmFtZSB7XG4gIGNvbG9yOiBoc2woMCwgMCUsIDY2JSk7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmxoLWF1ZGl0LWdyb3VwX19oZWFkZXI6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAwJSwgODAlKTtcbiAgZmlsdGVyOiBpbnZlcnQoMSk7XG59XG4vKiMgc291cmNlVVJMPWF1ZGl0czIvYXVkaXRzMlBhbmVsLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImF1ZGl0czIvbGlnaHRob3VzZS9yZXBvcnQtc3R5bGVzLmNzcyJdPSIvKipcbiAqIEBsaWNlbnNlIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4ubGgtdmFycyB7XG4gIC0tdGV4dC1mb250LWZhbWlseTogUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAtLW1vbm9zcGFjZS1mb250LWZhbWlseTogJ01lbmxvJywgJ2RlamF2dSBzYW5zIG1vbm8nLCAnQ29uc29sYXMnLCAnTHVjaWRhIENvbnNvbGUnLCBtb25vc3BhY2U7XG4gIC0tYm9keS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtLWJvZHktZm9udC1zaXplOiAxNHB4O1xuICAtLWJvZHktbGluZS1oZWlnaHQ6IDE4cHg7XG4gIC0tc3ViaGVhZGVyLWZvbnQtc2l6ZTogMTRweDtcbiAgLS1zdWJoZWFkZXItbGluZS1oZWlnaHQ6IDIwcHg7XG4gIC0tc3ViaGVhZGVyLWNvbG9yOiBoc2woMjA2LCA2JSwgMjUlKTtcbiAgLS1oZWFkZXItYmctY29sb3I6ICNmMWYzZjQ7XG4gIC0taGVhZGVyLWZvbnQtc2l6ZTogMjBweDtcbiAgLS1oZWFkZXItbGluZS1oZWlnaHQ6IDI0cHg7XG4gIC0tdGl0bGUtZm9udC1zaXplOiAyNHB4O1xuICAtLXRpdGxlLWxpbmUtaGVpZ2h0OiAyOHB4O1xuICAtLWNhcHRpb24tZm9udC1zaXplOiAxMnB4O1xuICAtLWNhcHRpb24tbGluZS1oZWlnaHQ6IDE2cHg7XG4gIC0tZGVmYXVsdC1wYWRkaW5nOiAxMnB4O1xuICAtLXNlY3Rpb24tcGFkZGluZzogMTZweDtcbiAgLS1zZWN0aW9uLWluZGVudDogMTZweDtcbiAgLS1hdWRpdC1ncm91cC1pbmRlbnQ6IDE2cHg7XG4gIC0tYXVkaXQtaXRlbS1nYXA6IDVweDtcbiAgLS1hdWRpdC1pbmRlbnQ6IDE2cHg7XG4gIC0tdGV4dC1pbmRlbnQ6IDhweDtcbiAgLS1leHBhbmRhYmxlLWluZGVudDogMjBweDtcbiAgLS1zZWNvbmRhcnktdGV4dC1jb2xvcjogIzU2NTY1NjtcbiAgLyotLWFjY2VudC1jb2xvcjogIzM4NzlkOTsqL1xuICAtLWZhaWwtY29sb3I6IGhzbCgxLCA3MyUsIDQ1JSk7XG4gIC0tYXZlcmFnZS1jb2xvcjogaHNsKDMxLCAxMDAlLCA0NSUpOyAvKiBtZCBvcmFuZ2UgODAwICovXG4gIC0tcGFzcy1jb2xvcjogaHNsKDEzOSwgNzAlLCAzMCUpO1xuICAtLWluZm9ybWF0aXZlLWNvbG9yOiAjMGM1MGM3O1xuICAtLW1lZGl1bS03NS1ncmF5OiAjNzU3NTc1O1xuICAtLW1lZGl1bS01MC1ncmF5OiBoc2woMjEwLCAxNyUsIDk4JSk7XG4gIC0tbWVkaXVtLTEwMC1ncmF5OiBoc2woMjAwLCAxMiUsIDk1JSk7XG4gIC0td2FybmluZy1jb2xvcjogI2ZmYWIwMDsgLyogbWQgYW1iZXIgYTcwMCAqL1xuICAtLXJlcG9ydC1ib3JkZXItY29sb3I6ICNjY2M7XG4gIC0tcmVwb3J0LXNlY29uZGFyeS1ib3JkZXItY29sb3I6ICNlYmViZWI7XG4gIC0tbWV0cmljLXRpbWVsaW5lLXJ1bGUtY29sb3I6ICNiM2IzYjM7XG4gIC0tZGlzcGxheS12YWx1ZS1ncmF5OiBoc2woMjE2LCA1JSwgMzklKTtcbiAgLS1yZXBvcnQtd2lkdGg6IGNhbGMoNjAgKiB2YXIoLS1ib2R5LWZvbnQtc2l6ZSkpO1xuICAtLXJlcG9ydC1jb250ZW50LXdpZHRoOiBjYWxjKHZhcigtLXJlcG9ydC13aWR0aCkpO1xuICAtLXJlcG9ydC1oZWFkZXItaGVpZ2h0OiAxNjFweDtcbiAgLS1yZXBvcnQtaGVhZGVyLWNvbG9yOiAjMjAyMTI0O1xuICAtLW5hdml0ZW0tZm9udC1zaXplOiB2YXIoLS1ib2R5LWZvbnQtc2l6ZSk7XG4gIC0tbmF2aXRlbS1saW5lLWhlaWdodDogdmFyKC0tYm9keS1saW5lLWhlaWdodCk7XG4gIC0tbmF2aXRlbS1ocGFkZGluZzogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICAtLW5hdml0ZW0tdnBhZGRpbmc6IGNhbGModmFyKC0tbmF2aXRlbS1saW5lLWhlaWdodCkgLyAyKTtcbiAgLS1saC1zY29yZS1oaWdobGlnaHQtYmc6IGhzbGEoMCwgMCUsIDkwJSwgMC4yKTtcbiAgLS1saC1zY29yZS1pY29uLWJhY2tncm91bmQtc2l6ZTogMjRweDtcbiAgLS1saC1zY29yZS1tYXJnaW46IDEycHg7XG4gIC0tbGgtdGFibGUtaGVhZGVyLWJnOiAjZjhmOWZhO1xuICAtLWxoLXRhYmxlLWhpZ2xpZ2h0LWJnOiBoc2xhKDAsIDAlLCA3NSUsIDAuMSk7XG4gIC0tbGgtc3BhcmtsaW5lLWhlaWdodDogNXB4O1xuICAtLWxoLXNwYXJrbGluZS10aGluLWhlaWdodDogM3B4O1xuICAtLWxoLWZpbG1zdHJpcC10aHVtYm5haWwtd2lkdGg6IDYwcHg7XG4gIC0tbGgtc2NvcmUtaWNvbi13aWR0aDogY2FsYyh2YXIoLS1ib2R5LWZvbnQtc2l6ZSkgLyAxNCAqIDE2KTtcbiAgLS1saC1jYXRlZ29yeS1zY29yZS13aWR0aDogY2FsYyg1ICogdmFyKC0tYm9keS1mb250LXNpemUpKTtcbiAgLS1saC1hdWRpdC12cGFkZGluZzogOHB4O1xuICAtLWxoLWF1ZGl0LWluZGV4LXdpZHRoOiAxOHB4O1xuICAtLWxoLWF1ZGl0LWhnYXA6IDEycHg7XG4gIC0tbGgtYXVkaXQtZ3JvdXAtdnBhZGRpbmc6IDhweDtcbiAgLS1saC1zZWN0aW9uLXZwYWRkaW5nOiAxMnB4O1xuICAtLWNoZXZyb24tc2l6ZTogMTJweDtcblxuICAvKiBWb29kb28gbWFnaWMgaGVyZSB0byBnZXQgbmFycm93IGNvbHVtbnMuIDAgZG9lc24ndCBzaXplIHRoZSBjb2x1bW4gbGlrZSBvdXIgZnJpZW5kIDFweCBkb2VzICovXG4gIC0tYnl0ZXMtY29sLXdpZHRoOiAxcHg7XG5cbiAgLS1wYXNzLWljb24tdXJsOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNDggNDhcIj48dGl0bGU+Y2hlY2s8L3RpdGxlPjxwYXRoIGZpbGw9XCJoc2woMTM5LCA3MCUsIDMwJSlcIiBkPVwiTTI0IDRDMTIuOTUgNCA0IDEyLjk1IDQgMjRjMCAxMS4wNCA4Ljk1IDIwIDIwIDIwIDExLjA0IDAgMjAtOC45NiAyMC0yMCAwLTExLjA1LTguOTYtMjAtMjAtMjB6bS00IDMwTDEwIDI0bDIuODMtMi44M0wyMCAyOC4zNGwxNS4xNy0xNS4xN0wzOCAxNiAyMCAzNHpcIi8+PC9zdmc+Jyk7XG4gIC0tYXZlcmFnZS1pY29uLXVybDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+PHRpdGxlPmluZm88L3RpdGxlPjxwYXRoIGZpbGw9XCJoc2woMzEsIDEwMCUsIDQ1JSlcIiBkPVwiTTI0IDRDMTIuOTUgNCA0IDEyLjk1IDQgMjRzOC45NSAyMCAyMCAyMCAyMC04Ljk1IDIwLTIwUzM1LjA1IDQgMjQgNHptMiAzMGgtNFYyMmg0djEyem0wLTE2aC00di00aDR2NHpcIi8+PC9zdmc+Jyk7XG4gIC0tZmFpbC1pY29uLXVybDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+PHRpdGxlPndhcm48L3RpdGxlPjxwYXRoIGZpbGw9XCJoc2woMSwgNzMlLCA0NSUpXCIgZD1cIk0yIDQyaDQ0TDI0IDQgMiA0MnptMjQtNmgtNHYtNGg0djR6bTAtOGgtNHYtOGg0djh6XCIvPjwvc3ZnPicpO1xuXG4gIC0tYXYtdGltZXItaWNvbi11cmw6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCI+PHBhdGggZD1cIk0wIDBoNDh2NDhIMHpcIiBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTIyIDM0YzAgMS4xLjkgMiAyIDJzMi0uOSAyLTItLjktMi0yLTItMiAuOS0yIDJ6bTAtMjh2OGg0di0zLjg0YzYuNzguOTcgMTIgNi43OSAxMiAxMy44NCAwIDcuNzMtNi4yNyAxNC0xNCAxNHMtMTQtNi4yNy0xNC0xNGMwLTMuMzYgMS4xOC02LjQzIDMuMTUtOC44NUwyNCAyNmwyLjgzLTIuODMtMTMuNi0xMy42LS4wMi4wNEM4Ljg0IDEyLjg5IDYgMTguMTEgNiAyNGMwIDkuOTQgOC4wNCAxOCAxNy45OSAxOFM0MiAzMy45NCA0MiAyNCAzMy45NCA2IDIzLjk5IDZIMjJ6bTE0IDE4YzAtMS4xLS45LTItMi0ycy0yIC45LTIgMiAuOSAyIDIgMiAyLS45IDItMnptLTI0IDBjMCAxLjEuOSAyIDIgMnMyLS45IDItMi0uOS0yLTItMi0yIC45LTIgMnpcIiBmaWxsPVwiaHNsKDIxNiwgNSUsIDM5JSlcIi8+PC9zdmc+Jyk7XG4gIC0tcGhvdG8tZmlsdGVyLWljb24tdXJsOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiPjxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoNDh2NDhIMFYwelwiLz48cGF0aCBkPVwiTTM4LjA0IDIwdjE4SDEwVjEwaDE4VjZIMTAuMDRjLTIuMiAwLTQgMS44LTQgNHYyOGMwIDIuMiAxLjggNCA0IDRoMjhjMi4yIDAgNC0xLjggNC00VjIwaC00ek0zNCAyMGwxLjg4LTQuMTJMNDAgMTRsLTQuMTItMS44OEwzNCA4bC0xLjg4IDQuMTJMMjggMTRsNC4xMiAxLjg4em0tNy41IDEuNUwyNCAxNmwtMi41IDUuNUwxNiAyNGw1LjUgMi41TDI0IDMybDIuNS01LjVMMzIgMjR6XCIgZmlsbD1cImhzbCgyMTYsIDUlLCAzOSUpXCIvPjwvc3ZnPicpO1xuICAtLXZpc2liaWxpdHktaWNvbi11cmw6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCI+PHBhdGggZD1cIk0wIDBoNDh2NDhIMHpcIiBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTI0IDlDMTQgOSA1LjQ2IDE1LjIyIDIgMjRjMy40NiA4Ljc4IDEyIDE1IDIyIDE1IDEwLjAxIDAgMTguNTQtNi4yMiAyMi0xNS0zLjQ2LTguNzgtMTEuOTktMTUtMjItMTV6bTAgMjVjLTUuNTIgMC0xMC00LjQ4LTEwLTEwczQuNDgtMTAgMTAtMTAgMTAgNC40OCAxMCAxMC00LjQ4IDEwLTEwIDEwem0wLTE2Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2IDYtMi42OSA2LTYtMi42OS02LTYtNnpcIiBmaWxsPVwiaHNsKDIxNiwgNSUsIDM5JSlcIi8+PC9zdmc+Jyk7XG4gIC0tY2hlY2stY2lyY2xlLWljb24tdXJsOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiPjxwYXRoIGQ9XCJNMCAwaDQ4djQ4SDB6XCIgZmlsbD1cIm5vbmVcIi8+PHBhdGggZD1cIk0yNCA0QzEyLjk1IDQgNCAxMi45NSA0IDI0YzAgMTEuMDQgOC45NSAyMCAyMCAyMCAxMS4wNCAwIDIwLTguOTYgMjAtMjAgMC0xMS4wNS04Ljk2LTIwLTIwLTIwem0tNCAzMEwxMCAyNGwyLjgzLTIuODNMMjAgMjguMzRsMTUuMTctMTUuMTdMMzggMTYgMjAgMzR6XCIgZmlsbD1cImhzbCgyMTYsIDUlLCAzOSUpXCIvPjwvc3ZnPicpO1xuICAtLWNoZWNrLWljb24tdXJsOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiPjxwYXRoIGQ9XCJNMCAwaDQ4djQ4SDB6XCIgZmlsbD1cIm5vbmVcIi8+PHBhdGggZD1cIk0xOCAzMi4zNEw5LjY2IDI0bC0yLjgzIDIuODNMMTggMzhsMjQtMjQtMi44My0yLjgzelwiLz48L3N2Zz4nKTtcbiAgLS1zZWFyY2gtaWNvbi11cmw6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCI+PHBhdGggZD1cIk0zMSAyOGgtMS41OWwtLjU1LS41NUMzMC44MiAyNS4xOCAzMiAyMi4yMyAzMiAxOWMwLTcuMTgtNS44Mi0xMy0xMy0xM1M2IDExLjgyIDYgMTlzNS44MiAxMyAxMyAxM2MzLjIzIDAgNi4xOC0xLjE4IDguNDUtMy4xM2wuNTUuNTVWMzFsMTAgOS45OEw0MC45OCAzOCAzMSAyOHptLTEyIDBhOSA5IDAgMSAxIC4wMDEtMTguMDAxQTkgOSAwIDAgMSAxOSAyOHpcIiBmaWxsPVwiaHNsKDIxNiwgNSUsIDM5JSlcIi8+PHBhdGggZD1cIk0wIDBoNDh2NDhIMHpcIiBmaWxsPVwibm9uZVwiIC8+PC9zdmc+Jyk7XG4gIC0tcmVtb3ZlLWNpcmNsZS1pY29uLXVybDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIGhlaWdodD1cIjI0XCIgd2lkdGg9XCIyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPjxwYXRoIGQ9XCJNNyAxMXYyaDEwdi0ySDd6bTUtOUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6XCIgZmlsbD1cImhzbCgyMTYsIDUlLCAzOSUpXCIvPjwvc3ZnPicpO1xufVxuXG4ubGgtdmFycy5saC1kZXZ0b29scyB7XG4gIC0tdGV4dC1mb250LWZhbWlseTogJy5TRk5TRGlzcGxheS1SZWd1bGFyJywgJ0hlbHZldGljYSBOZXVlJywgJ0x1Y2lkYSBHcmFuZGUnLCBzYW5zLXNlcmlmO1xuICAtLW1vbm9zcGFjZS1mb250LWZhbWlseTogJ01lbmxvJywgJ2RlamF2dSBzYW5zIG1vbm8nLCAnQ29uc29sYXMnLCAnTHVjaWRhIENvbnNvbGUnLCBtb25vc3BhY2U7XG4gIC0tYm9keS1mb250LXNpemU6IDEycHg7XG4gIC0tYm9keS1saW5lLWhlaWdodDogMTZweDtcbiAgLS1zdWJoZWFkZXItZm9udC1zaXplOiAxNHB4O1xuICAtLXN1YmhlYWRlci1saW5lLWhlaWdodDogMThweDtcbiAgLS1oZWFkZXItZm9udC1zaXplOiAxNnB4O1xuICAtLWhlYWRlci1saW5lLWhlaWdodDogMjBweDtcbiAgLS10aXRsZS1mb250LXNpemU6IDIwcHg7XG4gIC0tdGl0bGUtbGluZS1oZWlnaHQ6IDI0cHg7XG4gIC0tY2FwdGlvbi1mb250LXNpemU6IDExcHg7XG4gIC0tY2FwdGlvbi1saW5lLWhlaWdodDogMTRweDtcbiAgLS1kZWZhdWx0LXBhZGRpbmc6IDEycHg7XG4gIC0tc2VjdGlvbi1wYWRkaW5nOiAxMnB4O1xuICAtLXNlY3Rpb24taW5kZW50OiA4cHg7XG4gIC0tYXVkaXQtZ3JvdXAtaW5kZW50OiAxNnB4O1xuICAtLWF1ZGl0LWluZGVudDogMTZweDtcbiAgLS1leHBhbmRhYmxlLWluZGVudDogMTZweDtcblxuICAtLWxoLWF1ZGl0LXZwYWRkaW5nOiA0cHg7XG4gIC0tbGgtYXVkaXQtaGdhcDogMTJweDtcbiAgLS1saC1hdWRpdC1ncm91cC12cGFkZGluZzogMTJweDtcbiAgLS1saC1zZWN0aW9uLXZwYWRkaW5nOiA4cHg7XG59XG5cbkBrZXlmcmFtZXMgZmFkZUluIHtcbiAgMCUgeyBvcGFjaXR5OiAwO31cbiAgMTAwJSB7IG9wYWNpdHk6IDAuNjt9XG59XG5cbi5saC1yb290ICoge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4ubGgtcm9vdCB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS10ZXh0LWZvbnQtZmFtaWx5KTtcbiAgZm9udC1zaXplOiB2YXIoLS1ib2R5LWZvbnQtc2l6ZSk7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLWJvZHktbGluZS1oZWlnaHQpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1ib2R5LWJhY2tncm91bmQtY29sb3IpO1xuICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDtcbn1cblxuLmxoLXJvb3QgOmZvY3VzIHtcbiAgICBvdXRsaW5lOiAtd2Via2l0LWZvY3VzLXJpbmctY29sb3IgYXV0byAzcHg7XG59XG4ubGgtcm9vdCBzdW1tYXJ5OmZvY3VzIHtcbiAgICBvdXRsaW5lOiAxcHggc29saWQgaHNsKDIxNywgODklLCA2MSUpO1xufVxuXG5cbi5saC1yb290IFtoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubGgtYXVkaXQtZ3JvdXAgYSxcbi5saC1jYXRlZ29yeS1oZWFkZXJfX2Rlc2NyaXB0aW9uIGEge1xuICBjb2xvcjogIzBjNTBjNztcbn1cblxuXG4ubGgtYXVkaXRfX2Rlc2NyaXB0aW9uLFxuLmxoLWxvYWQtb3Bwb3J0dW5pdHlfX2Rlc2NyaXB0aW9uLFxuLmxoLWRldGFpbHMge1xuICAtLWlubmVyLWF1ZGl0LWxlZnQtcGFkZGluZzogY2FsYyh2YXIoLS10ZXh0LWluZGVudCkgKyB2YXIoLS1saC1hdWRpdC1pbmRleC13aWR0aCkgKyAyICogdmFyKC0tYXVkaXQtaXRlbS1nYXApKTtcbiAgLS1pbm5lci1hdWRpdC1yaWdodC1wYWRkaW5nOiBjYWxjKHZhcigtLXRleHQtaW5kZW50KSArIDJweCk7XG4gIG1hcmdpbi1sZWZ0OiB2YXIoLS1pbm5lci1hdWRpdC1sZWZ0LXBhZGRpbmcpO1xuICBtYXJnaW4tcmlnaHQ6IHZhcigtLWlubmVyLWF1ZGl0LXJpZ2h0LXBhZGRpbmcpO1xufVxuXG4ubGgtZGV0YWlscyB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LXBhZGRpbmcpO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LXBhZGRpbmcpO1xuICAvKiB3aGF0ZXZlciB0aGUgLmxoLWRldGFpbHMgc2lkZSBtYXJnaW5zIGFyZSAqL1xuICB3aWR0aDogY2FsYygxMDAlIC0gdmFyKC0taW5uZXItYXVkaXQtbGVmdC1wYWRkaW5nKSAtIHZhcigtLWlubmVyLWF1ZGl0LXJpZ2h0LXBhZGRpbmcpKTtcbn1cblxuLmxoLWRldGFpbHMuZmxleCAubGgtY29kZSB7XG4gIG1heC13aWR0aDogNzAlO1xufVxuXG4vKiBSZXBvcnQgaGVhZGVyICovXG5cbi5yZXBvcnQtaWNvbiB7XG4gIG9wYWNpdHk6IDAuNztcbn1cbi5yZXBvcnQtaWNvbjpob3ZlciB7XG4gIG9wYWNpdHk6IDE7XG59XG4ucmVwb3J0LWljb25bZGlzYWJsZWRdIHtcbiAgb3BhY2l0eTogMC4zO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnJlcG9ydC1pY29uLS1zaGFyZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIi8+PHBhdGggZD1cIk0xOCAxNi4wOGMtLjc2IDAtMS40NC4zLTEuOTYuNzdMOC45MSAxMi43Yy4wNS0uMjMuMDktLjQ2LjA5LS43cy0uMDQtLjQ3LS4wOS0uN2w3LjA1LTQuMTFjLjU0LjUgMS4yNS44MSAyLjA0LjgxIDEuNjYgMCAzLTEuMzQgMy0zcy0xLjM0LTMtMy0zLTMgMS4zNC0zIDNjMCAuMjQuMDQuNDcuMDkuN0w4LjA0IDkuODFDNy41IDkuMzEgNi43OSA5IDYgOWMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgM2MuNzkgMCAxLjUtLjMxIDIuMDQtLjgxbDcuMTIgNC4xNmMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjYxIDEuMzEgMi45MiAyLjkyIDIuOTIgMS42MSAwIDIuOTItMS4zMSAyLjkyLTIuOTJzLTEuMzEtMi45Mi0yLjkyLTIuOTJ6XCIvPjwvc3ZnPicpO1xufVxuLnJlcG9ydC1pY29uLS1wcmludCB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTkgOEg1Yy0xLjY2IDAtMyAxLjM0LTMgM3Y2aDR2NGgxMnYtNGg0di02YzAtMS42Ni0xLjM0LTMtMy0zem0tMyAxMUg4di01aDh2NXptMy03Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bS0xLTlINnY0aDEyVjN6XCIvPjxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIi8+PC9zdmc+Jyk7XG59XG4ucmVwb3J0LWljb24tLWNvcHkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPjxwYXRoIGQ9XCJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6XCIvPjwvc3ZnPicpO1xufVxuLnJlcG9ydC1pY29uLS1vcGVuIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz48cGF0aCBkPVwiTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHpcIi8+PC9zdmc+Jyk7XG59XG4ucmVwb3J0LWljb24tLWRvd25sb2FkIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCIvPjxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+PC9zdmc+Jyk7XG59XG5cbi8qIE5vZGUgKi9cbi5saC1ub2RlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vc3BhY2UtZm9udC1mYW1pbHkpO1xuICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuICBjb2xvcjogaHNsKDE3NCwgMTAwJSwgMjclKTtcbn1cbi5saC1ub2RlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiBoc2woMCwgMCUsIDk4JSk7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxuXG4vKiBTY29yZSAqL1xuXG4ubGgtYXVkaXRfX3Njb3JlLWljb24ge1xuICBtYXJnaW4tbGVmdDogdmFyKC0tbGgtc2NvcmUtbWFyZ2luKTtcbiAgd2lkdGg6IHZhcigtLWxoLXNjb3JlLWljb24td2lkdGgpO1xuICBoZWlnaHQ6IHZhcigtLWxoLXNjb3JlLWljb24td2lkdGgpO1xuICBiYWNrZ3JvdW5kOiBub25lIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIC8gY29udGFpbjtcbn1cblxuLmxoLWF1ZGl0LS1wYXNzIC5saC1hdWRpdF9fZGlzcGxheS10ZXh0IHtcbiAgY29sb3I6IHZhcigtLXBhc3MtY29sb3IpO1xufVxuLmxoLWF1ZGl0LS1wYXNzIC5saC1hdWRpdF9fc2NvcmUtaWNvbiB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXBhc3MtaWNvbi11cmwpO1xufVxuXG4ubGgtYXVkaXQtLWF2ZXJhZ2UgLmxoLWF1ZGl0X19kaXNwbGF5LXRleHQge1xuICBjb2xvcjogdmFyKC0tYXZlcmFnZS1jb2xvcik7XG59XG4ubGgtYXVkaXQtLWF2ZXJhZ2UgLmxoLWF1ZGl0X19zY29yZS1pY29uIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tYXZlcmFnZS1pY29uLXVybCk7XG59XG5cbi5saC1hdWRpdC0tZmFpbCAubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCB7XG4gIGNvbG9yOiB2YXIoLS1mYWlsLWNvbG9yKTtcbn1cbi5saC1hdWRpdC0tZmFpbCAubGgtYXVkaXRfX3Njb3JlLWljb24ge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1mYWlsLWljb24tdXJsKTtcbn1cblxuLmxoLWF1ZGl0LS1pbmZvcm1hdGl2ZSAubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCB7XG4gIGNvbG9yOiB2YXIoLS1kaXNwbGF5LXZhbHVlLWdyYXkpO1xufVxuXG4ubGgtYXVkaXQtLWluZm9ybWF0aXZlIC5saC1hdWRpdF9fc2NvcmUtaWNvbixcbi5saC1hdWRpdC0tbWFudWFsIC5saC1hdWRpdF9fc2NvcmUtaWNvbiB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cbi5saC1hdWRpdC0tZXJyb3IgLmxoLWF1ZGl0X19zY29yZS1pY29uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmxoLWNhdGVnb3J5LWhlYWRlcl9fZGVzY3JpcHRpb24sXG4ubGgtYXVkaXRfX2Rlc2NyaXB0aW9uICAge1xuICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpO1xufVxuXG4ubGgtY2F0ZWdvcnktaGVhZGVyX19kZXNjcmlwdGlvbiAge1xuICBmb250LXNpemU6IHZhcigtLWJvZHktZm9udC1zaXplKTtcbiAgbWFyZ2luOiBjYWxjKHZhcigtLWRlZmF1bHQtcGFkZGluZykgLyAyKSAwIHZhcigtLWRlZmF1bHQtcGFkZGluZyk7XG59XG5cblxuLmxoLWF1ZGl0X19pbmRleCxcbi5saC1hdWRpdF9fdGl0bGUsXG4ubGgtYXVkaXRfX2Rpc3BsYXktdGV4dCxcbi5saC1hdWRpdF9fc2NvcmUtaWNvbixcbi5saC1sb2FkLW9wcG9ydHVuaXR5X19zcGFya2xpbmUsXG4ubGgtY2hldnJvbi1jb250YWluZXIge1xuICBtYXJnaW46IDAgdmFyKC0tYXVkaXQtaXRlbS1nYXApO1xufVxuLmxoLWF1ZGl0X19pbmRleCB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xufVxuLmxoLWNoZXZyb24tY29udGFpbmVyIHtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xufVxuXG5cbi5saC1hdWRpdF9faGVhZGVyIC5saC1hdWRpdF9faW5kZXgge1xuICB3aWR0aDogdmFyKC0tbGgtYXVkaXQtaW5kZXgtd2lkdGgpO1xufVxuXG4ubGgtYXVkaXRfX3RpdGxlIHtcbiAgZmxleDogMTtcbn1cblxuLyogRXhwYW5kYWJsZSBEZXRhaWxzIChBdWRpdCBHcm91cHMsIEF1ZGl0cykgKi9cbi5saC1hdWRpdF9faGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZzogdmFyKC0tbGgtYXVkaXQtdnBhZGRpbmcpIHZhcigtLXRleHQtaW5kZW50KTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4ubGgtYXVkaXQtLWxvYWQtb3Bwb3J0dW5pdHkgLmxoLWF1ZGl0X19oZWFkZXIge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmxoLWF1ZGl0X19oZWFkZXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOUZBO1xufVxuXG4ubGgtYXVkaXQtZ3JvdXBfX3N1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIsXG4ubGgtZXhwYW5kYWJsZS1kZXRhaWxzX19zdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4vKiBQZXJmIE1ldHJpYyAqL1xuXG4ubGgtbWV0cmljLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5saC1tZXRyaWMtY29sdW1uIHtcbiAgZmxleDogMTtcbn1cbi5saC1tZXRyaWMtY29sdW1uOmZpcnN0LW9mLXR5cGUge1xuICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG59XG5cbi5saC1tZXRyaWMge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcmVwb3J0LXNlY29uZGFyeS1ib3JkZXItY29sb3IpO1xufVxuXG4ubGgtbWV0cmljX19pbm5lcndyYXAge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIHBhZGRpbmc6IDExcHggdmFyKC0tdGV4dC1pbmRlbnQpO1xufVxuXG4ubGgtbWV0cmljX19kZXRhaWxzIHtcbiAgb3JkZXI6IC0xO1xufVxuXG4ubGgtbWV0cmljX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICBsaW5lLWhlaWdodDogdmFyKC0tYm9keS1saW5lLWhlaWdodCk7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5saC1tZXRyaWNfX25hbWUge1xuICBmbGV4OiAxO1xufVxuXG4ubGgtbWV0cmljc19fZGlzY2xhaW1lciB7XG4gIGNvbG9yOiB2YXIoLS1tZWRpdW0tNzUtZ3JheSk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBtYXJnaW46IHZhcigtLWxoLXNlY3Rpb24tdnBhZGRpbmcpIDA7XG4gIHBhZGRpbmc6IDAgdmFyKC0tdGV4dC1pbmRlbnQpO1xufVxuXG4ubGgtbWV0cmljX19kZXNjcmlwdGlvbiB7XG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7XG59XG5cbi5saC1tZXRyaWNfX3ZhbHVlIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLyogTm8gd3JhcHBpbmcgYmV0d2VlbiBtZXRyaWMgdmFsdWUgYW5kIHRoZSBpY29uICovXG59XG5cblxuLmxoLW1ldHJpYyAubGgtbWV0cmljX192YWx1ZTo6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgd2lkdGg6IHZhcigtLWxoLXNjb3JlLWljb24td2lkdGgpO1xuICBoZWlnaHQ6IHZhcigtLWxoLXNjb3JlLWljb24td2lkdGgpO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICBtYXJnaW4tbGVmdDogY2FsYyh2YXIoLS1ib2R5LWZvbnQtc2l6ZSkgLyAyKTtcbn1cblxuLmxoLW1ldHJpYy0tcGFzcyAubGgtbWV0cmljX192YWx1ZSB7XG4gIGNvbG9yOiB2YXIoLS1wYXNzLWNvbG9yKTtcbn1cbi5saC1tZXRyaWMtLXBhc3MgLmxoLW1ldHJpY19fdmFsdWU6OmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tcGFzcy1pY29uLXVybCkgbm8tcmVwZWF0IDUwJSA1MCU7XG59XG5cblxuLmxoLW1ldHJpYy0tYXZlcmFnZSAubGgtbWV0cmljX192YWx1ZSB7XG4gIGNvbG9yOiB2YXIoLS1hdmVyYWdlLWNvbG9yKTtcbn1cbi5saC1tZXRyaWMtLWF2ZXJhZ2UgLmxoLW1ldHJpY19fdmFsdWU6OmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYXZlcmFnZS1pY29uLXVybCkgbm8tcmVwZWF0IDUwJSA1MCU7XG59XG5cblxuLmxoLW1ldHJpYy0tZmFpbCAubGgtbWV0cmljX192YWx1ZSB7XG4gIGNvbG9yOiB2YXIoLS1mYWlsLWNvbG9yKTtcbn1cbi5saC1tZXRyaWMtLWZhaWwgLmxoLW1ldHJpY19fdmFsdWU6OmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZmFpbC1pY29uLXVybCkgbm8tcmVwZWF0IDUwJSA1MCU7XG59XG5cbi5saC1tZXRyaWMtLWVycm9yIC5saC1tZXRyaWNfX3ZhbHVlLFxuLmxoLW1ldHJpYy0tZXJyb3IgLmxoLW1ldHJpY19fZGVzY3JpcHRpb24ge1xuICBjb2xvcjogdmFyKC0tZmFpbC1jb2xvcik7XG59XG5cbi8qIEhpZGUgaWNvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgKi9cbi5saC1tZXRyaWMtLWVycm9yIC5saC1tZXRyaWNfX3ZhbHVlOjphZnRlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIFBlcmYgbG9hZCBvcHBvcnR1bml0eSAqL1xuXG4ubGgtbG9hZC1vcHBvcnR1bml0eV9fY29scyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuXG4ubGgtbG9hZC1vcHBvcnR1bml0eV9faGVhZGVyIC5saC1sb2FkLW9wcG9ydHVuaXR5X19jb2wge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZWRpdW0tNTAtZ3JheSk7XG4gIGNvbG9yOiB2YXIoLS1tZWRpdW0tNzUtZ3JheSk7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogdW5zZXQ7XG4gIGxpbmUtaGVpZ2h0OiBjYWxjKDIuMyAqIHZhcigtLWJvZHktZm9udC1zaXplKSk7XG59XG5cbi5saC1sb2FkLW9wcG9ydHVuaXR5X19jb2wge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi5saC1sb2FkLW9wcG9ydHVuaXR5X19jb2wtLW9uZSB7XG4gIGZsZXg6IDU7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xufVxuLmxoLWxvYWQtb3Bwb3J0dW5pdHlfX2NvbC0tdHdvIHtcbiAgZmxleDogNDtcbn1cblxuLmxoLWF1ZGl0LS1sb2FkLW9wcG9ydHVuaXR5IC5saC1hdWRpdF9fZGlzcGxheS10ZXh0IHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZsZXg6IDAgMCBjYWxjKDMgKiB2YXIoLS1ib2R5LWZvbnQtc2l6ZSkpO1xufVxuXG5cbi8qIFNwYXJrbGluZSAqL1xuXG4ubGgtbG9hZC1vcHBvcnR1bml0eV9fc3BhcmtsaW5lIHtcbiAgZmxleDogMTtcbiAgbWFyZ2luLXRvcDogY2FsYygodmFyKC0tYm9keS1saW5lLWhlaWdodCkgLSB2YXIoLS1saC1zcGFya2xpbmUtaGVpZ2h0KSkgLyAyKTtcbn1cblxuLmxoLXNwYXJrbGluZSB7XG4gIGhlaWdodDogdmFyKC0tbGgtc3BhcmtsaW5lLWhlaWdodCk7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubGgtc3BhcmtsaW5lX19iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsb2F0OiByaWdodDtcbn1cblxuLmxoLWF1ZGl0LS1wYXNzIC5saC1zcGFya2xpbmVfX2JhciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXBhc3MtY29sb3IpO1xufVxuXG4ubGgtYXVkaXQtLWF2ZXJhZ2UgLmxoLXNwYXJrbGluZV9fYmFyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tYXZlcmFnZS1jb2xvcik7XG59XG5cbi5saC1hdWRpdC0tZmFpbCAubGgtc3BhcmtsaW5lX19iYXIge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1mYWlsLWNvbG9yKTtcbn1cblxuXG5cbi8qIEZpbG1zdHJpcCAqL1xuXG4ubGgtZmlsbXN0cmlwLWNvbnRhaW5lciB7XG4gIHBhZGRpbmc6IDAgdmFyKC0tZXhwYW5kYWJsZS1pbmRlbnQpO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuXG4ubGgtZmlsbXN0cmlwIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBwYWRkaW5nLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1wYWRkaW5nKTtcbn1cblxuLmxoLWZpbG1zdHJpcF9fZnJhbWUge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubGgtZmlsbXN0cmlwX190aHVtYm5haWwge1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1yZXBvcnQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7XG4gIG1heC1oZWlnaHQ6IDEwMHB4O1xuICBtYXgtd2lkdGg6IDYwcHg7XG59XG5cbi8qIEF1ZGl0ICovXG5cbi5saC1hdWRpdCB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1yZXBvcnQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7XG59XG5cbi5saC1hdWRpdDpsYXN0LWNoaWxkICB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5saC1hdWRpdC0tZXJyb3IgLmxoLWF1ZGl0X19kaXNwbGF5LXRleHQge1xuICBjb2xvcjogdmFyKC0tZmFpbC1jb2xvcik7XG59XG5cbi8qIEF1ZGl0IEdyb3VwICovXG5cbi5saC1hdWRpdC1ncm91cCB7XG4gIHBhZGRpbmc6IHZhcigtLWxoLWF1ZGl0LWdyb3VwLXZwYWRkaW5nKSAwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcmVwb3J0LXNlY29uZGFyeS1ib3JkZXItY29sb3IpO1xufVxuXG4ubGgtYXVkaXQtZ3JvdXA6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5saC1hdWRpdC1ncm91cF9faGVhZGVyIHtcbiAgZm9udC1zaXplOiB2YXIoLS1zdWJoZWFkZXItZm9udC1zaXplKTtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLXN1YmhlYWRlci1saW5lLWhlaWdodCk7XG4gIGNvbG9yOiB2YXIoLS1zdWJoZWFkZXItY29sb3IpO1xuICBmbGV4OiAxO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmxoLWF1ZGl0LWdyb3VwX19oZWFkZXI6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xuICB3aWR0aDogY2FsYyh2YXIoLS1zdWJoZWFkZXItZm9udC1zaXplKSAvIDE0ICogMjQpO1xuICBoZWlnaHQ6IGNhbGModmFyKC0tc3ViaGVhZGVyLWZvbnQtc2l6ZSkgLyAxNCAqIDI0KTtcbiAgbWFyZ2luLXJpZ2h0OiBjYWxjKHZhcigtLXN1YmhlYWRlci1mb250LXNpemUpIC8gMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLW1lZGl1bS0xMDAtZ3JheSkgbm9uZSBuby1yZXBlYXQgY2VudGVyIC8gMTZweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8qIEExMXkvU2VvIGdyb3VwcyB3aXRoaW4gUGFzc2VkIGRvbid0IGdldCBhbiBpY29uICovXG4ubGgtYXVkaXQtZ3JvdXAtLXVuYWRvcm5lZCAubGgtYXVkaXQtZ3JvdXBfX2hlYWRlcjo6YmVmb3JlIHtcbiAgY29udGVudDogbm9uZTtcbn1cblxuXG4ubGgtYXVkaXQtZ3JvdXAtLW1hbnVhbCAubGgtYXVkaXQtZ3JvdXBfX2hlYWRlcjo6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tc2VhcmNoLWljb24tdXJsKTtcbn1cbi5saC1wYXNzZWQtYXVkaXRzIC5saC1hdWRpdC1ncm91cF9faGVhZGVyOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1jaGVjay1pY29uLXVybCk7XG59XG4ubGgtYXVkaXQtZ3JvdXAtLWRpYWdub3N0aWNzIC5saC1hdWRpdC1ncm91cF9faGVhZGVyOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1zZWFyY2gtaWNvbi11cmwpO1xufVxuLmxoLWF1ZGl0LWdyb3VwLS1vcHBvcnR1bml0aWVzIC5saC1hdWRpdC1ncm91cF9faGVhZGVyOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1waG90by1maWx0ZXItaWNvbi11cmwpO1xufVxuLmxoLWF1ZGl0LWdyb3VwLS1tZXRyaWNzIC5saC1hdWRpdC1ncm91cF9faGVhZGVyOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1hdi10aW1lci1pY29uLXVybCk7XG59XG4ubGgtYXVkaXQtZ3JvdXAtLW5vdC1hcHBsaWNhYmxlIC5saC1hdWRpdC1ncm91cF9faGVhZGVyOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yZW1vdmUtY2lyY2xlLWljb24tdXJsKTtcbn1cblxuLyogUmVtb3ZpbmcgdG9vIG11Y2ggd2hpdGVzcGFjZSAqL1xuLmxoLWF1ZGl0LWdyb3VwLS1tZXRyaWNzIHtcbiAgbWFyZ2luLXRvcDogLTI4cHg7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5saC1hdWRpdC1ncm91cF9fc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgcGFkZGluZy1yaWdodDogdmFyKC0tdGV4dC1pbmRlbnQpO1xufVxuXG4ubGgtYXVkaXQtZ3JvdXBfX2l0ZW1jb3VudCB7XG4gIGNvbG9yOiB2YXIoLS1kaXNwbGF5LXZhbHVlLWdyYXkpO1xuICBtYXJnaW46IDAgMTBweDtcbn1cblxuLmxoLWF1ZGl0LWdyb3VwX19kZXNjcmlwdGlvbiB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICBjb2xvcjogdmFyKC0tbWVkaXVtLTc1LWdyYXkpO1xuICBtYXJnaW46IHZhcigtLWxoLWF1ZGl0LWdyb3VwLXZwYWRkaW5nKSAwO1xufVxuXG4ubGgtYXVkaXQtZ3JvdXAtLXVuYWRvcm5lZCAubGgtYXVkaXQtZ3JvdXBfX2Rlc2NyaXB0aW9uIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuLmxoLWF1ZGl0LWV4cGxhbmF0aW9uIHtcbiAgbWFyZ2luOiB2YXIoLS1saC1hdWRpdC12cGFkZGluZykgMCBjYWxjKHZhcigtLWxoLWF1ZGl0LXZwYWRkaW5nKSAvIDIpO1xuICBsaW5lLWhlaWdodDogdmFyKC0tY2FwdGlvbi1saW5lLWhlaWdodCk7XG59XG5cbi5saC1hdWRpdC0tZmFpbCAubGgtYXVkaXQtZXhwbGFuYXRpb24ge1xuICBjb2xvcjogdmFyKC0tZmFpbC1jb2xvcik7XG59XG5cbi8qIFJlcG9ydCAqL1xuXG4ubGgtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgbWF4LXdpZHRoOiB2YXIoLS1yZXBvcnQtY29udGVudC13aWR0aCk7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgbWFyZ2luOiAwIGF1dG87XG59XG5cbi5saC1oZWFkZXItc3RpY2t5IHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgdG9wOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgei1pbmRleDogMjtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbn1cbi5saC1oZWFkZXItcGxhaW4ge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1zZWN0aW9uLXBhZGRpbmcpO1xufVxuXG4ubGgtaGVhZGVyLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgbWF4LXdpZHRoOiB2YXIoLS1yZXBvcnQtY29udGVudC13aWR0aCk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xufVxuXG4ubGgtcmVwb3J0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbkBtZWRpYSBzY3JlZW4ge1xuICAubGgtcmVwb3J0IHtcbiAgICB3aWR0aDogdmFyKC0tcmVwb3J0LXdpZHRoKTtcbiAgfVxufVxuXG4ubGgtZXhjZXB0aW9uIHtcbiAgZm9udC1zaXplOiBsYXJnZTtcbn1cblxuLmxoLWNvZGUge1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICBtYXJnaW4tdG9wOiAwO1xuICBmb250LXNpemU6IDg1JTtcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcbn1cblxuLmxoLXdhcm5pbmdzIHtcbiAgLS1pdGVtLW1hcmdpbjogY2FsYyh2YXIoLS1ib2R5LWxpbmUtaGVpZ2h0KSAvIDYpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hdmVyYWdlLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBtYXJnaW46IHZhcigtLWxoLWF1ZGl0LXZwYWRkaW5nKSAwO1xuICBwYWRkaW5nOiBjYWxjKHZhcigtLWxoLWF1ZGl0LXZwYWRkaW5nKSAvIDIpIHZhcigtLWxoLWF1ZGl0LXZwYWRkaW5nKTtcbn1cblxuLmxoLXdhcm5pbmdzLS10b3BsZXZlbCB7XG4gIC0taXRlbS1tYXJnaW46IGNhbGModmFyKC0taGVhZGVyLWxpbmUtaGVpZ2h0KSAvIDQpO1xuICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpO1xuICBtYXJnaW46IHZhcigtLXNlY3Rpb24tcGFkZGluZyk7XG4gIHBhZGRpbmc6IHZhcigtLXNlY3Rpb24tcGFkZGluZyk7XG59XG4ubGgtd2FybmluZ3MgdWwge1xuICBwYWRkaW5nLWxlZnQ6IGNhbGModmFyKC0tc2VjdGlvbi1wYWRkaW5nKSAqIDIpO1xuICBtYXJnaW46IDA7XG59XG4ubGgtd2FybmluZ3MgbGkge1xuICBtYXJnaW46IHZhcigtLWl0ZW0tbWFyZ2luKSAwO1xufVxuLmxoLXdhcm5pbmdzIGxpOmxhc3Qtb2YtdHlwZSB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5saC1zY29yZXMtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiB2YXIoLS1zZWN0aW9uLWluZGVudCkgY2FsYyh2YXIoLS1zZWN0aW9uLWluZGVudCkgLyAyKSBjYWxjKHZhcigtLXNlY3Rpb24taW5kZW50KSAqIDIpO1xufVxuLmxoLXNjb3Jlcy1oZWFkZXJfX3NvbG8ge1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IDA7XG59XG5cbi5saC1zY29yZXNjYWxlIHtcbiAgY29sb3I6IHZhcigtLW1lZGl1bS03NS1ncmF5KTtcbiAgcGFkZGluZzogMCBjYWxjKHZhcigtLXNlY3Rpb24taW5kZW50KSAqIDEuNSkgMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDtcbiAgd2lsbC1jaGFuZ2U6IG9wYWNpdHk7IC8qIG9wYWNpdHkgaXMgY2hhbmdlZCBvbiBzY3JvbGwgKi9cbn1cblxuLmxoLXNjb3Jlc2NhbGUtcmFuZ2Uge1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cblxuLmxoLXNjb3Jlc2NhbGUtcmFuZ2U6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xuICB3aWR0aDogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICBoZWlnaHQ6IGNhbGModmFyKC0tYm9keS1mb250LXNpemUpICogLjYwKTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMCA1cHg7XG59XG5cbi5saC1zY29yZXNjYWxlLXJhbmdlLS1wYXNzOjpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXNzLWNvbG9yKTtcbn1cblxuLmxoLXNjb3Jlc2NhbGUtcmFuZ2UtLWF2ZXJhZ2U6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWF2ZXJhZ2UtY29sb3IpO1xufVxuXG4ubGgtc2NvcmVzY2FsZS1yYW5nZS0tZmFpbDo6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFpbC1jb2xvcik7XG59XG5cbi8qIEhpZGUgY2F0ZWdvcnkgc2NvcmUgZ2F1YWdlcyBpZiBpdCdzIGEgc2luZ2xlIGNhdGVnb3J5IHJlcG9ydCAqL1xuLmxoLWhlYWRlci0tc29sby1jYXRlZ29yeSAubGgtc2NvcmVzLXdyYXBwZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG5cbi5saC1jYXRlZ29yaWVzIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5saC1jYXRlZ29yeSB7XG4gIC0tY2lyY2xlLXNpemU6IGNhbGMoMi41ICogdmFyKC0taGVhZGVyLWZvbnQtc2l6ZSkpO1xuXG4gIHBhZGRpbmc6IHZhcigtLXNlY3Rpb24tcGFkZGluZyk7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1yZXBvcnQtYm9yZGVyLWNvbG9yKTtcbn1cblxuLmxoLWNhdGVnb3J5OmZpcnN0LW9mLXR5cGUge1xuICBwYWRkaW5nLXRvcDogY2FsYygyICogdmFyKC0tc2VjdGlvbi1wYWRkaW5nKSk7XG4gIGJvcmRlcjogbm9uZTtcbn1cblxuLyogc2VjdGlvbiBoYXNoIGxpbmsganVtcCBzaG91bGQgcHJlc2VydmUgZml4ZWQgaGVhZGVyXG4gICBodHRwczovL2Nzcy10cmlja3MuY29tL2hhc2gtdGFnLWxpbmtzLXBhZGRpbmcvXG4qL1xuLmxoLWNhdGVnb3J5ID4gLmxoLXBlcm1hbGluayB7XG4gIG1hcmdpbi10b3A6IGNhbGMoKHZhcigtLXJlcG9ydC1oZWFkZXItaGVpZ2h0KSArIHZhcigtLWRlZmF1bHQtcGFkZGluZykpICogLTEpO1xuICBwYWRkaW5nLWJvdHRvbTogY2FsYyh2YXIoLS1yZXBvcnQtaGVhZGVyLWhlaWdodCkgKyB2YXIoLS1kZWZhdWx0LXBhZGRpbmcpKTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmxoLWNhdGVnb3J5LWhlYWRlciB7XG4gIGZvbnQtc2l6ZTogdmFyKC0taGVhZGVyLWZvbnQtc2l6ZSk7XG4gIG1pbi1oZWlnaHQ6IHZhcigtLWNpcmNsZS1zaXplKTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tbGgtc2VjdGlvbi12cGFkZGluZyk7XG59XG5cbi5saC1jYXRlZ29yeS1oZWFkZXJfX3RpdGxlIHtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG59XG5cbi5saC1jYXRlZ29yeS1oZWFkZXIgLmxoLXNjb3JlX19nYXVnZSAubGgtZ2F1Z2VfX2xhYmVsIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4ubGgtY2F0ZWdvcnktaGVhZGVyIC5saC1zY29yZV9fZ2F1Z2Uge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5saC1jYXRlZ29yeSAubGgtc2NvcmVfX2dhdWdlIHtcbiAgbWFyZ2luLWxlZnQ6IHZhcigtLXNlY3Rpb24taW5kZW50KTtcbn1cblxuLmxoLWNhdGVnb3J5LWhlYWRlciAubGgtYXVkaXRfX3RpdGxlIHtcbiAgZm9udC1zaXplOiB2YXIoLS1oZWFkZXItZm9udC1zaXplKTtcbiAgbGluZS1oZWlnaHQ6IHZhcigtLWhlYWRlci1saW5lLWhlaWdodCk7XG59XG5cbi5saC1wYXNzZWQtYXVkaXRzW29wZW5dIHN1bW1hcnkubGgtcGFzc2VkLWF1ZGl0cy1zdW1tYXJ5IHtcbiAgbWFyZ2luLWJvdHRvbTogY2FsYyh2YXIoLS1kZWZhdWx0LXBhZGRpbmcpICogMik7XG59XG5cbnN1bW1hcnkubGgtcGFzc2VkLWF1ZGl0cy1zdW1tYXJ5IHtcbiAgbWFyZ2luOiBjYWxjKHZhcigtLWRlZmF1bHQtcGFkZGluZykgKiAyKSB2YXIoLS1kZWZhdWx0LXBhZGRpbmcpO1xuICBtYXJnaW4tbGVmdDogdmFyKC0tZGVmYXVsdC1wYWRkaW5nKTtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jbGgtbG9nIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO1xuICBjb2xvcjogI2ZmZjtcbiAgbWluLWhlaWdodDogNDhweDtcbiAgbWluLXdpZHRoOiAyODhweDtcbiAgcGFkZGluZzogMTZweCAyNHB4O1xuICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIG1hcmdpbjogMTJweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7XG4gIG9wYWNpdHk6IDA7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDM7XG59XG5cbiNsaC1sb2cuc2hvdyB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbn1cblxuLyogOTY0IGZpdHMgdGhlIG1pbi13aWR0aCBvZiB0aGUgZmlsbXN0cmlwICovXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5NjRweCkge1xuICAubGgtcmVwb3J0IHtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDQwMHB4O1xuICB9XG59XG5cbkBtZWRpYSBwcmludCB7XG4gIGJvZHkge1xuICAgIC13ZWJraXQtcHJpbnQtY29sb3ItYWRqdXN0OiBleGFjdDsgLyogcHJpbnQgYmFja2dyb3VuZCBjb2xvcnMgKi9cbiAgfVxuICAubGgtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuICAubGgtcmVwb3J0IHtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgfVxuICAubGgtY2F0ZWdvcmllcyB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4ubGgtdGFibGUge1xuICAtLWltYWdlLXByZXZpZXctc2l6ZTogMjRweDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbn1cblxuLmxoLXRhYmxlIHRoZWFkIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tbGgtdGFibGUtaGVhZGVyLWJnKTtcbn1cbi5saC10YWJsZSB0aGVhZCB0aCB7XG4gIGNvbG9yOiB2YXIoLS1tZWRpdW0tNzUtZ3JheSk7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG5cbi5saC10YWJsZSB0Ym9keSB0cjpudGgtY2hpbGQoZXZlbikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saC10YWJsZS1oaWdsaWdodC1iZyk7XG59XG5cbi5saC10YWJsZSB0aCxcbi5saC10YWJsZSB0ZCB7XG4gIHBhZGRpbmc6IDhweCA2cHg7XG59XG5cbi5saC10YWJsZS1jb2x1bW4tLXRleHQsXG4ubGgtdGFibGUtY29sdW1uLS1ieXRlcyxcbi5saC10YWJsZS1jb2x1bW4tLXRpbWVzcGFuTXMsXG4ubGgtdGFibGUtY29sdW1uLS1tcyB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4ubGgtdGFibGUtY29sdW1uLS10aHVtYm5haWwge1xuICB3aWR0aDogY2FsYyh2YXIoLS1pbWFnZS1wcmV2aWV3LXNpemUpICogMik7XG59XG5cbi5saC10YWJsZS1jb2x1bW4tLXVybCB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG1pbi13aWR0aDogMjUwcHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1heC13aWR0aDogMDtcbn1cblxuLyogS2VlcCBieXRlcyBjb2x1bW5zIG5hcnJvdyBpZiB0aGV5IGZvbGxvdyB0aGUgVVJMIGNvbHVtbiAqL1xuLmxoLXRhYmxlLWNvbHVtbi0tdXJsICsgdGgubGgtdGFibGUtY29sdW1uLS1ieXRlcyxcbi5saC10YWJsZS1jb2x1bW4tLXVybCArIC5saC10YWJsZS1jb2x1bW4tLWJ5dGVzICsgdGgubGgtdGFibGUtY29sdW1uLS1ieXRlcyB7XG4gIHdpZHRoOiB2YXIoLS1ieXRlcy1jb2wtd2lkdGgpO1xufVxuXG4ubGgtdGFibGUtY29sdW1uLS1jb2RlIHtcbiAgbWF4LXdpZHRoOiB2YXIoLS11cmwtY29sLW1heC13aWR0aCk7XG59XG5cbi5saC10ZXh0X191cmwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLmxoLXRleHRfX3VybDpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZCAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb24tc2tpcC1pbms6IGF1dG87XG59XG5cbi5saC10ZXh0X191cmwgPiAubGgtdGV4dCwgLmxoLXRleHRfX3VybC1ob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ubGgtdGV4dF9fdXJsLWhvc3Qge1xuICBtYXJnaW4tbGVmdDogY2FsYyh2YXIoLS1ib2R5LWZvbnQtc2l6ZSkgLyAyKTtcbiAgb3BhY2l0eTogMC42O1xuICBmb250LXNpemU6IDkwJVxufVxuXG4ubGgtdGh1bWJuYWlsIHtcbiAgaGVpZ2h0OiB2YXIoLS1pbWFnZS1wcmV2aWV3LXNpemUpO1xuICB3aWR0aDogdmFyKC0taW1hZ2UtcHJldmlldy1zaXplKTtcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLyogQ2hldnJvblxuICAgaHR0cHM6Ly9jb2RlcGVuLmlvL3BhdWxpcmlzaC9wZW4vTG16RW1LXG4gKi9cbi5saC1jaGV2cm9uIHtcbiAgLS1jaGV2cm9uLWFuZ2xlOiA0MmRlZztcbiAgd2lkdGg6IHZhcigtLWNoZXZyb24tc2l6ZSk7XG4gIGhlaWdodDogdmFyKC0tY2hldnJvbi1zaXplKTtcbiAgbWFyZ2luLXRvcDogY2FsYygodmFyKC0tYm9keS1saW5lLWhlaWdodCkgLSAxMnB4KSAvIDIpO1xufVxuXG4ubGgtY2hldnJvbl9fbGluZXMge1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC40cztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKHZhcigtLWJvZHktbGluZS1oZWlnaHQpKTtcbn1cbi5saC1jaGV2cm9uX19saW5lIHtcbiBzdHJva2U6IHZhcigtLWRpc3BsYXktdmFsdWUtZ3JheSk7XG4gc3Ryb2tlLXdpZHRoOiB2YXIoLS1jaGV2cm9uLXNpemUpO1xuIHN0cm9rZS1saW5lY2FwOiBzcXVhcmU7XG4gdHJhbnNmb3JtLW9yaWdpbjogNTAlO1xuIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWNoZXZyb24tYW5nbGUpKTtcbiB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMzAwbXMsIHN0cm9rZSAzMDBtcztcbn1cblxuLmxoLWF1ZGl0LWdyb3VwID4gLmxoLWF1ZGl0LWdyb3VwX19zdW1tYXJ5ID4gLmxoLWNoZXZyb24gLmxoLWNoZXZyb25fX2xpbmUtcmlnaHQsXG4ubGgtYXVkaXQtZ3JvdXBbb3Blbl0gPiAubGgtYXVkaXQtZ3JvdXBfX3N1bW1hcnkgPiAubGgtY2hldnJvbiAubGgtY2hldnJvbl9fbGluZS1sZWZ0LFxuLmxoLWF1ZGl0ID4gLmxoLWV4cGFuZGFibGUtZGV0YWlscyAubGgtY2hldnJvbl9fbGluZS1yaWdodCxcbi5saC1hdWRpdCA+IC5saC1leHBhbmRhYmxlLWRldGFpbHNbb3Blbl0gLmxoLWNoZXZyb25fX2xpbmUtbGVmdCB7XG4gdHJhbnNmb3JtOiByb3RhdGUoY2FsYyh2YXIoLS1jaGV2cm9uLWFuZ2xlKSAqIC0xKSk7XG59XG5cbi5saC1hdWRpdC1ncm91cFtvcGVuXSA+IC5saC1hdWRpdC1ncm91cF9fc3VtbWFyeSA+IC5saC1jaGV2cm9uIC5saC1jaGV2cm9uX19saW5lLXJpZ2h0LFxuLmxoLWF1ZGl0ID4gLmxoLWV4cGFuZGFibGUtZGV0YWlsc1tvcGVuXSAubGgtY2hldnJvbl9fbGluZS1yaWdodCB7XG4gIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWNoZXZyb24tYW5nbGUpKTtcbn1cblxuLmxoLWF1ZGl0LWdyb3VwW29wZW5dID4gLmxoLWF1ZGl0LWdyb3VwX19zdW1tYXJ5ID4gLmxoLWNoZXZyb24gLmxoLWNoZXZyb25fX2xpbmVzLFxuLmxoLWF1ZGl0ID4gLmxoLWV4cGFuZGFibGUtZGV0YWlsc1tvcGVuXSAubGgtY2hldnJvbl9fbGluZXMge1xuIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKHZhcigtLWNoZXZyb24tc2l6ZSkgKiAtMSkpO1xufVxuXG5cblxuLyogVG9vbHRpcCAqL1xuLnRvb2x0aXAtYm91bmRhcnkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi50b29sdGlwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBub25lOyAvKiBEb24ndCByZXRhaW4gdGhlc2UgbGF5ZXJzIHdoZW4gbm90IG5lZWRlZCAqL1xuICBvcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICBtaW4td2lkdGg6IDI0NnB4O1xuICBtYXgtd2lkdGg6IDI3NXB4O1xuICBwYWRkaW5nOiAxNXB4O1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIHRleHQtYWxpZ246IGluaXRpYWw7XG59XG4vKiBzaHJpbmsgdG9vbHRpcHMgdG8gbm90IGJlIGN1dG9mZiBvbiBsZWZ0IGVkZ2Ugb2YgbmFycm93IHZpZXdwb3J0c1xuICAgNDV2dyBpcyBjaG9zZW4gdG8gYmUgfj0gd2lkdGggb2YgdGhlIGxlZnQgY29sdW1uIG9mIG1ldHJpY3NcbiovXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1MzVweCkge1xuICAudG9vbHRpcCB7XG4gICAgbWluLXdpZHRoOiA0NXZ3O1xuICAgIHBhZGRpbmc6IDN2dztcbiAgfVxufVxuXG4udG9vbHRpcC1ib3VuZGFyeTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNGOEY5RkE7XG59XG5cbi50b29sdGlwLWJvdW5kYXJ5OmhvdmVyIC50b29sdGlwIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGFuaW1hdGlvbjogZmFkZUluVG9vbHRpcCAyNTBtcztcbiAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7XG4gIGFuaW1hdGlvbi1kZWxheTogODUwbXM7XG4gIGJvdHRvbTogMTAwJTtcbiAgei1pbmRleDogMTtcbiAgd2lsbC1jaGFuZ2U6IG9wYWNpdHk7XG4gIHJpZ2h0OiAwO1xufVxuXG4udG9vbHRpcDo6YmVmb3JlIHtcbiAgY29udGVudDogXCJcIjtcbiAgYm9yZGVyOiBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLXdpZHRoOiAxMHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogLTIwcHg7XG4gIHJpZ2h0OiA2cHg7XG4gIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG5Aa2V5ZnJhbWVzIGZhZGVJblRvb2x0aXAge1xuICAwJSB7IG9wYWNpdHk6IDA7IH1cbiAgNzUlIHsgb3BhY2l0eTogMTsgfVxuICAxMDAlIHsgb3BhY2l0eTogMTsgIGZpbHRlcjogZHJvcC1zaGFkb3coMXB4IDBweCAxcHggI2FhYSkgZHJvcC1zaGFkb3coMHB4IDJweCA0cHggaHNsYSgyMDYsIDYlLCAyNSUsIDAuMTUpKTsgfVxufVxuXG4vKiMgc291cmNlVVJMPWF1ZGl0czIvbGlnaHRob3VzZS9yZXBvcnQtc3R5bGVzLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImF1ZGl0czIvbGlnaHRob3VzZS90ZW1wbGF0ZXMuaHRtbCJdPSI8IS0tIExpZ2h0aG91c2UgcnVuIHdhcm5pbmdzIC0tPlxuPHRlbXBsYXRlIGlkPVwidG1wbC1saC13YXJuaW5ncy0tdG9wbGV2ZWxcIj5cbiAgPGRpdiBjbGFzcz1cImxoLXdhcm5pbmdzIGxoLXdhcm5pbmdzLS10b3BsZXZlbFwiPlxuICAgIDxzdHJvbmc+VGhlcmUgd2VyZSBpc3N1ZXMgYWZmZWN0aW5nIHRoaXMgcnVuIG9mIExpZ2h0aG91c2U6PC9zdHJvbmc+XG4gICAgPHVsPjwvdWw+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPCEtLSBMaWdodGhvdXNlIHNjb3JlIHNjYWxlIC0tPlxuPHRlbXBsYXRlIGlkPVwidG1wbC1saC1zY29yZXNjYWxlXCI+XG4gIDxkaXYgY2xhc3M9XCJsaC1zY29yZXNjYWxlXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJsaC1zY29yZXNjYWxlLWxhYmVsXCI+U2NvcmUgc2NhbGU6PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGgtc2NvcmVzY2FsZS1yYW5nZSBsaC1zY29yZXNjYWxlLXJhbmdlLS1mYWlsXCI+MC00NDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImxoLXNjb3Jlc2NhbGUtcmFuZ2UgbGgtc2NvcmVzY2FsZS1yYW5nZS0tYXZlcmFnZVwiPjQ1LTc0PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwibGgtc2NvcmVzY2FsZS1yYW5nZSBsaC1zY29yZXNjYWxlLXJhbmdlLS1wYXNzXCI+NzUtMTAwPC9zcGFuPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjwhLS0gVG9nZ2xlIGFycm93IGNoZXZyb24gLS0+XG48dGVtcGxhdGUgaWQ9XCJ0bXBsLWxoLWNoZXZyb25cIj5cbiAgPHN2ZyBjbGFzcz1cImxoLWNoZXZyb25cIiB0aXRsZT1cIlNlZSBhdWRpdHNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgIHZpZXdib3g9XCIwIDAgMTAwIDEwMFwiPlxuICAgIDxnIGNsYXNzPVwibGgtY2hldnJvbl9fbGluZXNcIj5cbiAgICAgIDxwYXRoIGNsYXNzPVwibGgtY2hldnJvbl9fbGluZSBsaC1jaGV2cm9uX19saW5lLWxlZnRcIiBkPVwiTTEwIDUwaDQwXCIgc3Ryb2tlPVwiIzcwNzE3M1wiLz5cbiAgICAgIDxwYXRoIGNsYXNzPVwibGgtY2hldnJvbl9fbGluZSBsaC1jaGV2cm9uX19saW5lLXJpZ2h0XCIgZD1cIk05MCA1MEg1MFwiIHN0cm9rZT1cIiM3MDcxNzNcIi8+XG4gICAgPC9nPlxuICA8L3N2Zz5cbjwvdGVtcGxhdGU+XG5cbjwhLS0gTGlnaHRob3VzZSBjYXRlZ29yeSBoZWFkZXIgLS0+XG48dGVtcGxhdGUgaWQ9XCJ0bXBsLWxoLWNhdGVnb3J5LWhlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwibGgtY2F0ZWdvcnktaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImxoLXNjb3JlX19nYXVnZVwiPjwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwibGgtY2F0ZWdvcnktaGVhZGVyX190aXRsZVwiPjwvc3Bhbj5cbiAgICA8ZGl2IGNsYXNzPVwibGgtY2F0ZWdvcnktaGVhZGVyX19kZXNjcmlwdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjwhLS0gTGlnaHRob3VzZSBhdWRpdCAtLT5cbjx0ZW1wbGF0ZSBpZD1cInRtcGwtbGgtYXVkaXRcIj5cbiAgPGRpdiBjbGFzcz1cImxoLWF1ZGl0XCI+XG4gICAgPGRldGFpbHMgY2xhc3M9XCJsaC1leHBhbmRhYmxlLWRldGFpbHNcIj5cbiAgICAgIDxzdW1tYXJ5IGNsYXNzPVwibGgtYXVkaXRfX2hlYWRlciBsaC1leHBhbmRhYmxlLWRldGFpbHNfX3N1bW1hcnlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsaC1hdWRpdF9faW5kZXhcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGgtYXVkaXRfX3RpdGxlXCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxoLWF1ZGl0X19kaXNwbGF5LXRleHRcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaC1hdWRpdF9fc2NvcmUtaWNvblwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGgtY2hldnJvbi1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaC1hdWRpdF9fZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICA8L2RldGFpbHM+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPCEtLSBMaWdodGhvdXNlIHBlcmYgbWV0cmljIC0tPlxuPHRlbXBsYXRlIGlkPVwidG1wbC1saC1tZXRyaWNcIj5cbiAgPGRpdiBjbGFzcz1cImxoLW1ldHJpY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsaC1tZXRyaWNfX2lubmVyd3JhcCB0b29sdGlwLWJvdW5kYXJ5XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImxoLW1ldHJpY19fdGl0bGVcIj48L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwibGgtbWV0cmljX192YWx1ZVwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxoLW1ldHJpY19fZGVzY3JpcHRpb24gdG9vbHRpcFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjwhLS0gTGlnaHRob3VzZSBwZXJmIG9wcG9ydHVuaXR5IC0tPlxuPHRlbXBsYXRlIGlkPVwidG1wbC1saC1vcHBvcnR1bml0eVwiPlxuICA8ZGl2IGNsYXNzPVwibGgtYXVkaXQgbGgtYXVkaXQtLWxvYWQtb3Bwb3J0dW5pdHlcIj5cbiAgICA8ZGV0YWlscyBjbGFzcz1cImxoLWV4cGFuZGFibGUtZGV0YWlsc1wiPlxuICAgICAgPHN1bW1hcnkgY2xhc3M9XCJsaC1hdWRpdF9faGVhZGVyIGxoLWV4cGFuZGFibGUtZGV0YWlsc19fc3VtbWFyeVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGgtbG9hZC1vcHBvcnR1bml0eV9fY29sc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaC1sb2FkLW9wcG9ydHVuaXR5X19jb2wgbGgtbG9hZC1vcHBvcnR1bml0eV9fY29sLS1vbmVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGgtYXVkaXRfX2luZGV4XCI+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxoLWF1ZGl0X190aXRsZVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaC1sb2FkLW9wcG9ydHVuaXR5X19jb2wgbGgtbG9hZC1vcHBvcnR1bml0eV9fY29sLS10d29cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaC1sb2FkLW9wcG9ydHVuaXR5X19zcGFya2xpbmVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxoLXNwYXJrbGluZVwiPjxkaXYgY2xhc3M9XCJsaC1zcGFya2xpbmVfX2JhclwiPjwvZGl2PjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGgtYXVkaXRfX2Rpc3BsYXktdGV4dFwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxoLWNoZXZyb24tY29udGFpbmVyXCIgdGl0bGU9XCJTZWUgcmVzb3VyY2VzXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPGRpdiBjbGFzcz1cImxoLWF1ZGl0X19kZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgIDwvZGV0YWlscz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG5cbjwhLS0gTGlnaHRob3VzZSBwZXJmIG9wcG9ydHVuaXR5IGhlYWRlciAtLT5cbjx0ZW1wbGF0ZSBpZD1cInRtcGwtbGgtb3Bwb3J0dW5pdHktaGVhZGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJsaC1sb2FkLW9wcG9ydHVuaXR5X19oZWFkZXIgbGgtbG9hZC1vcHBvcnR1bml0eV9fY29sc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsaC1sb2FkLW9wcG9ydHVuaXR5X19jb2wgbGgtbG9hZC1vcHBvcnR1bml0eV9fY29sLS1vbmVcIj5cbiAgICAgIFJlc291cmNlIHRvIG9wdGltaXplXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxoLWxvYWQtb3Bwb3J0dW5pdHlfX2NvbCBsaC1sb2FkLW9wcG9ydHVuaXR5X19jb2wtLXR3b1wiPlxuICAgICAgRXN0aW1hdGVkIFNhdmluZ3NcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG5cbjwhLS0gTGlnaHRob3VzZSBzY29yZSBjb250YWluZXIgLS0+XG48dGVtcGxhdGUgaWQ9XCJ0bXBsLWxoLXNjb3Jlcy13cmFwcGVyXCI+XG4gIDxzdHlsZT5cbiAgICAubGgtc2NvcmVzLXdyYXBwZXJfX2JhY2tncm91bmQsXG4gICAgLmxoLXNjb3Jlcy13cmFwcGVyX19zaGFkb3cge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgfVxuICAgIC5saC1zY29yZXMtd3JhcHBlcl9fc2hhZG93IHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMikgMHB4IDNweCAwcHggLTJweFxuICAgIH1cbiAgICAubGgtc2NvcmVzLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogY2FsYyh2YXIoLS1zZWN0aW9uLWluZGVudCkgLyAyKTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgPC9zdHlsZT5cbiAgPGRpdiBjbGFzcz1cImxoLXNjb3Jlcy13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImxoLXNjb3Jlcy1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaC1zY29yZXMtd3JhcHBlcl9fYmFja2dyb3VuZFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxoLXNjb3Jlcy13cmFwcGVyX19zaGFkb3dcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG5cbjwhLS0gTGlnaHRob3VzZSBoZWFkZXIgLS0+XG48dGVtcGxhdGUgaWQ9XCJ0bXBsLWxoLWhlYWRpbmdcIj5cbiAgPHN0eWxlPlxuICAgIDpyb290IHtcbiAgICAgIC0tcmVwb3J0LWhlYWRlci1vdmVybGFwLXRvcDogMzBweDtcbiAgICB9XG4gICAgLmxoLWhlYWRlci1iZyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oZWFkZXItYmctY29sb3IpO1xuICAgICAgaGVpZ2h0OiB2YXIoLS1yZXBvcnQtaGVhZGVyLWhlaWdodCk7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xuICAgIH1cbiAgICAubGgtbGlnaHRob3VzZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IHZhcigtLXJlcG9ydC1oZWFkZXItaGVpZ2h0KTtcbiAgICAgIHJpZ2h0OiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGNhbGModmFyKC0tcmVwb3J0LWNvbnRlbnQtd2lkdGgpIC8gMiksIC0xMDAlLCAwKTtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7XG4gICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIH1cbiAgICAubGgtaGVhZGVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiB2YXIoLS1yZXBvcnQtaGVhZGVyLWhlaWdodCk7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7IC8qIHN1cHBvcnQgdGV4dC1vdmVyZmxvdyBvbiB1cmwgKi9cbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgLmxoLW1ldGFkYXRhIHtcbiAgICAgIGZsZXg6IDEgMSAwO1xuICAgICAgcGFkZGluZzogY2FsYyh2YXIoLS1zZWN0aW9uLXBhZGRpbmcpIC8gMik7XG4gICAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNlY3Rpb24taW5kZW50KTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJlcG9ydC1oZWFkZXItY29sb3IpO1xuICAgICAgei1pbmRleDogMTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgLmxoLW1ldGFkYXRhX19yZXN1bHRzIHtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLmxoLW1ldGFkYXRhX191cmwge1xuICAgICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICB9XG4gICAgLmxoLXNjb3Jlcy13cmFwcGVyIHtcbiAgICAgIG1hcmdpbi10b3A6IC0zMHB4O1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDFweCk7XG4gICAgfVxuICAgIC5saC1zY29yZXMtd3JhcHBlcl9fc2hhZG93IHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5saC1zY29yZXMtd3JhcHBlcl9fYmFja2dyb3VuZCxcbiAgICAubGgtc2NvcmVzLXdyYXBwZXJfX3NoYWRvdyB7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIHdpbGwtY2hhbmdlOiBvcGFjaXR5LCB0cmFuc2Zvcm07XG4gICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gICAgfVxuXG4gICAgLmxoLXByb2R1Y3QtaW5mbywgLmxoLXRvb2xiYXJfX21ldGFkYXRhIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgY29sb3I6ICM1RjYzNjk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZm9udC1zaXplOiBjYWxjKHZhcigtLWJvZHktZm9udC1zaXplKSAqIDAuOSk7XG4gICAgICBtYXJnaW4tbGVmdDogdmFyKC0tc2VjdGlvbi1pbmRlbnQpO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgIHdpbGwtY2hhbmdlOiBvcGFjaXR5O1xuICAgIH1cbiAgICAubGgtcHJvZHVjdC1pbmZvX19pY29uIHtcbiAgICAgIGhlaWdodDogMjBweDtcbiAgICAgIG1hcmdpbi1yaWdodDogdmFyKC0tZGVmYXVsdC1wYWRkaW5nKTtcbiAgICB9XG4gICAgLmxoLXRvb2xiYXIge1xuICAgICAgaGVpZ2h0OiA1MHB4O1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAyNXB4O1xuICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogY2FsYygxMDAlIC0gNzBweCk7ICAvKiBnaXZlIHJvb20gZm9yIGV4cG9ydCAqL1xuICAgIH1cbiAgICAubGgtdG9vbGJhcl9fbWV0YWRhdGEge1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5saC10b29sYmFyX191cmwge1xuICAgICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIH1cbiAgICAubGgtZXhwb3J0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiB2YXIoLS1zZWN0aW9uLWluZGVudCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gICAgICB0b3A6IGNhbGModmFyKC0tc2VjdGlvbi1wYWRkaW5nKSAvIDIpO1xuICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgfVxuICAgIC5saC1leHBvcnRfX2J1dHRvbiB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RhZGFkYTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICB3aWR0aDogNDhweDtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlO1xuICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICB9XG4gICAgLmxoLWV4cG9ydF9fYnV0dG9uOmZvY3VzLFxuICAgIC5saC1leHBvcnRfX2J1dHRvbi5hY3RpdmUge1xuICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAzcHggI2NjYztcbiAgICB9XG4gICAgLmxoLWV4cG9ydF9fYnV0dG9uLmFjdGl2ZSArIC5saC1leHBvcnRfX2Ryb3Bkb3duIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBjbGlwOiByZWN0KDAsIDE2NHB4LCAyMDBweCwgMCk7XG4gICAgfVxuICAgIC5saC1leHBvcnRfX2Ryb3Bkb3duIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1yZXBvcnQtYm9yZGVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIHBhZGRpbmc6IGNhbGModmFyKC0tZGVmYXVsdC1wYWRkaW5nKSAvIDIpIDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0b3A6IDM2cHg7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggM3B4ICNjY2M7XG4gICAgICBtaW4td2lkdGg6IDEyNXB4O1xuICAgICAgY2xpcDogcmVjdCgwLCAxNjRweCwgMCwgMCk7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDIwMG1zIGN1YmljLWJlemllcigwLDAsMC4yLDEpO1xuICAgIH1cbiAgICAubGgtZXhwb3J0X19kcm9wZG93biBhIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBwYWRkaW5nOiAwIDEycHg7XG4gICAgICBsaW5lLWhlaWdodDogMjtcbiAgICB9XG4gICAgLmxoLWV4cG9ydF9fZHJvcGRvd24gYTpob3ZlcixcbiAgICAubGgtZXhwb3J0X19kcm9wZG93biBhOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgIH1cbiAgICAubGgtZXhwb3J0X19kcm9wZG93biAucmVwb3J0LWljb24ge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1MCU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDE4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIHRleHQtaW5kZW50OiAxOHB4O1xuICAgIH1cbiAgICAvKiBjb3B5IGljb24gbmVlZHMgc2xpZ2h0IGFkanVzdG1lbnRzIHRvIGxvb2sgZ3JlYXQgKi9cbiAgICAubGgtZXhwb3J0X19kcm9wZG93biAucmVwb3J0LWljb24tLWNvcHkge1xuICAgICAgYmFja2dyb3VuZC1zaXplOiAxNnB4O1xuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogOXB4IDUwJTtcbiAgICB9XG4gICAgLyogc2F2ZS1hcy1naXN0IG9wdGlvbiBoaWRkZW4gaW4gcmVwb3J0ICovXG4gICAgLmxoLWV4cG9ydF9fZHJvcGRvd24gLmxoLWV4cG9ydC0tZ2lzdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAubGgtY29uZmlnIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7XG4gICAgfVxuICAgIC5saC1jb25maWdfX3RpbWVzdGFtcCB7XG4gICAgICBmb250LXNpemU6IHZhcigtLWNhcHRpb24tZm9udC1zaXplKTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICBhLmxoLWNvbmZpZ19fZW11bGF0aW9uIHtcbiAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5NjRweCkge1xuICAgICAgLmxoLWV4cG9ydF9fZHJvcGRvd24ge1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgbGVmdDogaW5pdGlhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgQG1lZGlhIHByaW50IHtcbiAgICAgIC5saC1oZWFkZXIge1xuICAgICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgIH1cbiAgICB9XG4vKlxuICAgIFRPRE86IEVuYWJsZSBhbmltYXRpbmcgdGhlIGNsb3Vkc1xuICAgIC5saC1saWdodGhvdXNlX19jbG91ZHMge1xuICAgICAgYW5pbWF0aW9uOiBwYW5hY3Jvc3MgMzBzIGxpbmVhciBpbmZpbml0ZTtcbiAgICAgIGFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWQ7XG4gICAgfVxuICAgIEBrZXlmcmFtZXMgcGFuYWNyb3NzIHtcbiAgICAgIDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCk7IH1cbiAgICAgIDc3JSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNjgwcHgpOyB9XG4gICAgICA3Ny4wMDAxJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxOTVweCk7IH1cbiAgICAgIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMHB4KTsgfVxuICAgIH0gKi9cbiAgPC9zdHlsZT5cbiAgPGRpdiBjbGFzcz1cImxoLWhlYWRlci1iZ1wiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGgtbGlnaHRob3VzZVwiPlxuICAgIDxzdmcgd2lkdGg9XCIyMTdcIiBoZWlnaHQ9XCIxNDhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XG4gICAgICA8ZGVmcz5cbiAgICAgICAgPG1hc2sgaWQ9XCJhXCIgeD1cIi01NlwiIHk9XCItNTRcIiB3aWR0aD1cIjI4NFwiIGhlaWdodD1cIjIwMlwiIG1hc2tVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0tNTYtNTRoMjg0djIwMkgtNTZ6XCIgZmlsbD1cIiNmZmZcIi8+XG4gICAgICAgIDwvbWFzaz5cbiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwiYlwiIHgxPVwiLTUyNS4xNlwiIHkxPVwiNTYwLjA4XCIgeDI9XCItNTI0LjIzXCIgeTI9XCI1NjAuMDhcIiBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCg5MSAwIDAgLTc3IDQ3Nzk3IDQzMTgxKVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxuICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiI2YxZjNmNFwiLz5cbiAgICAgICAgICA8c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiNmZmZcIi8+XG4gICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XG4gICAgICA8L2RlZnM+XG4gICAgICA8ZyBtYXNrPVwidXJsKCNhKVwiPlxuICAgICAgICA8cGF0aCBkPVwiTTk1IDQ3aDI0djJIOTV6XCIgZmlsbD1cIiNlYzU1NDhcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNOTggNDloMTh2MTFIOTh6XCIgZmlsbD1cIiNmYmMyMWJcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNOTUgNTloMjR2N0g5NXpcIiBmaWxsPVwiI2VjNTU0OFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk05Ny42MyA2NmgxOS43NGwyLjYzIDQ3SDk1elwiIGZpbGw9XCIjZmZmXCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTEwNyAzOGExMCAxMCAwIDAgMSAxMCAxMHYxSDk3di0xYTEwIDEwIDAgMCAxIDEwLTEwek05Ni43NyA4Mi4yM2wyMS0xMC43LjYzIDExLjg3LTIyLjMxIDExLjg3ek05NSAxMTAuOEwxMTkuMSA5OGwuOSAxNEg5NXpcIiBmaWxsPVwiI2VjNTU0OFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0wIDE0OGExNzcuNTggMTc3LjU4IDAgMCAxIDIxNyAwelwiIGZpbGw9XCIjZThlYWVkXCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTEwMyA0OWE1IDUgMCAwIDEgNSA1IDUgNSAwIDAgMS01IDUgNSA1IDAgMCAxLTUtNSA1IDUgMCAwIDEgNS01elwiIGZpbGw9XCIjZmVmMGM4XCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTcgMTZsOTEgMzMuMTh2MTBMNyA5M3pcIiBmaWxsPVwidXJsKCNiKVwiLz5cbiAgICAgIDwvZz5cbiAgICAgIDxnIG1hc2s9XCJ1cmwoI2EpXCIgY2xhc3M9XCJsaC1saWdodGhvdXNlX19jbG91ZHNcIj5cbiAgICAgICAgPHBhdGggZD1cIk02MCAuMTlBOS43NyA5Ljc3IDAgMCAxIDYxLjkzIDBhOS40NCA5LjQ0IDAgMCAxIDkuMjQgNy44M0E3LjI0IDcuMjQgMCAwIDEgNzkgMTQuNDV2LjczQTcuMzcgNy4zNyAwIDAgMSA3Ni4yIDIxaC0zMWE3LjQ0IDcuNDQgMCAwIDEtMS4yLTQuMDkgNy4zMSA3LjMxIDAgMCAxIDcuMjYtNy4zNiA2Ljg0IDYuODQgMCAwIDEgMS4yOC4xdi0uMTFBOS41MSA5LjUxIDAgMCAxIDYwIC4xOW03OS43OCAyMi4zMWgtMTcuOWE0LjM3IDQuMzcgMCAwIDEtLjYzLTIuMjUgNC4yIDQuMiAwIDAgMSA0LjE2LTQuMjUgNC4zNyA0LjM3IDAgMCAxIC43Mi4wNlYxNmE1LjM1IDUuMzUgMCAwIDEgMTAuNjQtMWguMzNhNC4yIDQuMiAwIDAgMSA0LjE1IDQuMjUgNC4yOSA0LjI5IDAgMCAxLTEuNDcgMy4yNXpNMTYzIDYyaC0yNC4xNWE1LjEgNS4xIDAgMCAxLS44NS0yLjgxIDUuNjUgNS42NSAwIDAgMSA2LjU5LTUuMTl2LS4wOGE3LjA3IDcuMDcgMCAwIDEgNy4yNC02LjkyIDcuMTUgNy4xNSAwIDAgMSA3LjE3IDUuNjRoLjQ0YTUuNDYgNS40NiAwIDAgMSA1LjYgNS4zMkE1LjE5IDUuMTkgMCAwIDEgMTYzIDYyelwiIGZpbGw9XCIjZmZmXCIvPlxuICAgICAgPC9nPlxuICAgIDwvc3ZnPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibGgtaGVhZGVyLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJsaC1oZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaC1tZXRhZGF0YVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGgtbWV0YWRhdGFfX3Jlc3VsdHNcIj48YSBocmVmPVwiXCIgY2xhc3M9XCJsaC1tZXRhZGF0YV9fdXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXJcIj48L2E+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaC1jb25maWdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxoLWNvbmZpZ19fdGltZXN0YW1wXCI+PC9zcGFuPlxuICAgICAgICAgIDxhIGhyZWY9XCIjcnVudGltZS1zZXR0aW5nc1wiIGNsYXNzPVwibGgtY29uZmlnX19lbXVsYXRpb25cIj48L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibGgtc2NvcmVzLXdyYXBwZXItcGxhY2Vob2xkZXJcIj48L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsaC10b29sYmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGgtcHJvZHVjdC1pbmZvXCI+XG4gICAgICAgIDxpbWcgc3JjPVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FJQUFBRDhHTzJqQUFBRGprbEVRVlI0QVdJMDhQL0hRRXZBUXJ4U1FLdmxFQ2ZMRllYeDc1eENZMnFtaDg5R2JOdk9NamIzdjlqT09seG5GV3hqMjA2ZWJRM2I3cTZxK3oxck5hZ3U4L3p2UFNaQUNBQUJwZVVBQTBtaU1nVTdTQTdKakNyYUZHd1p3RUNPd3ZMNzVkV2pzS2dXQkt0eDBqdldvK3ZrQkFGYkFDQ2tCeU1QNm5NbjQ4K0FWZ1hCMmZ6U0N3c3YyMi9sTUdsVWhtSjBBRTdCSDhkeVVVRGJVRWdONlJ6SlJTZWFQeGhkUllSMEluZWwrN0hkNWxCaUZwa01BeEFDYzAzOTQvLzlDNHZvRkhEaUFBR0xwdU9YZWJkZmRIZmN0Z3dKS2FaUkxSS3k2SXRyU2lzNlJCblZCZ0d0Ykh5S1RFbUpIUW9FWG9CQ0U1QkNyRGVBMm9nTVVJR0RBS0VCREVoVXF3Z01xQllEalc0RFF6bXVmZlZkcWZmNDIvWlFZWXFWY01YR1pzTVB5Q3NIM2x5SlNldHh2RWF4QVFYZGpSMUhqZndDZElTN2xvMkRaa2UyNlFlK01YTzEyT1drR1QwTzZvRTd2TUdrTW5rWXc0YU4xS1FnTUtFeGhYcXN3ZmlvdjQrYTdNUTExWFBuYnIvNXFwS2xnQUNBQVFqOTRMdTI3MWJOOURVZWNRYXNJWmxOekc3MmxsUkFBS0ppQWkrL0JTSHJTRmpSdlFoZzNERUtFcUpoMDh0c21MVHg1OTcrZjZlbnI0Y2MyWnBrNTdwaWhmWDI0ZFc3UkhjT0xMVWJKWWhKU2wwRXJRQ0k5QlZYSC9Yck85N1Fhc3V2UVFTaUVDYTBCclFDSUlKcDZYOVQvcjhRRzZMNzFXWVNxQ29JSUdvMkJaRFVCblMvRDlFQTlOdW4xaVl2Yk0wTUZFeElEUVJvS0ZhdGMxWjZ6cm01dVdlT2JKb3RxMEJHVjlGdVFCV3E1YTRGdzNQUHo4NDhyWkhzdFpTdUE1RldBRlNNUDJuT3BwT09HcGw2cWg5UENTZzBJRnlIS2pTUXlETlFIVHJ1MnQ3NU5PRWUwZnNmMjQ2b0FtRmtJNnZDZG5XdmJRRlFGQ0t4OHZDc3dWOFRyRExpRExnSDROcjdSQXROc3JDOWQ4c2ZrN2I4bHM0aWdkTnk4Q1FLQUlTbHNCMEZqWmZkM0xmcDE1NXRmOGZLSTRCeFpaSWovb1RkVkVBSUFjSkZPQ216YXVIRzcxSTcvcmRyZVVBZ0FxcERQMDVmREFSQ0FRUUFSd0VJQlFTVnhxMEZ5YUx2Wlp0ZXZwSGE4V0h3OGNmdDZjcHhscThlQUp0SWhuU2JXRGY5NTF5eDN5MTNPcVV1dTVxeUdna3hDZ0dGaDljRGloREdiVGE2QnF2VDFsV21yYXYzYm10MlpNSjRtVTZUR2dJQzREQnpjdi9KcUFhdTFXaHpTdDN4OUl4ay80SmsvOEo0WnJyVmlGTUE0VzZBNytXSzh4Y1ZqdnlyT21WRDBGYkFYb2tjVDQ4cit4VnFMS3Z1SllibXBOYWRubHAzbXB1ZkpIT2UvR1hrdE0rcjA5YlQ4a0VkcTlCUllBYkdTZ3pQN2xsODJVNzFNYytaRm9vWGd3QUFBQUJKUlU1RXJrSmdnZz09XCIgYWx0PVwiXCIgY2xhc3M9XCJsaC1wcm9kdWN0LWluZm9fX2ljb25cIiAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxoLXByb2R1Y3QtaW5mb19fbmFtZVwiPkxpZ2h0aG91c2U8L3NwYW4+Jm5ic3A7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGgtcHJvZHVjdC1pbmZvX192ZXJzaW9uXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaC10b29sYmFyX19tZXRhZGF0YVwiPlxuICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJsaC10b29sYmFyX191cmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPjwvYT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsaC10b2dnbGUtYXJyb3dcIiB0aXRsZT1cIlNlZSByZXBvcnQncyBydW50aW1lIHNldHRpbmdzXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibGgtZXhwb3J0XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwicmVwb3J0LWljb24gcmVwb3J0LWljb24tLXNoYXJlIGxoLWV4cG9ydF9fYnV0dG9uXCIgdGl0bGU9XCJFeHBvcnQgcmVwb3J0XCI+PC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwibGgtZXhwb3J0X19kcm9wZG93blwiPlxuICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwicmVwb3J0LWljb24gcmVwb3J0LWljb24tLXByaW50XCIgZGF0YS1hY3Rpb249XCJwcmludC1zdW1tYXJ5XCI+UHJpbnQgU3VtbWFyeTwvYT5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInJlcG9ydC1pY29uIHJlcG9ydC1pY29uLS1wcmludFwiIGRhdGEtYWN0aW9uPVwicHJpbnQtZXhwYW5kZWRcIj5QcmludCBFeHBhbmRlZDwvYT5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInJlcG9ydC1pY29uIHJlcG9ydC1pY29uLS1jb3B5XCIgZGF0YS1hY3Rpb249XCJjb3B5XCI+Q29weSBKU09OPC9hPlxuICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwicmVwb3J0LWljb24gcmVwb3J0LWljb24tLWRvd25sb2FkXCIgZGF0YS1hY3Rpb249XCJzYXZlLWh0bWxcIj5TYXZlIGFzIEhUTUw8L2E+XG4gICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJyZXBvcnQtaWNvbiByZXBvcnQtaWNvbi0tZG93bmxvYWRcIiBkYXRhLWFjdGlvbj1cInNhdmUtanNvblwiPlNhdmUgYXMgSlNPTjwvYT5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInJlcG9ydC1pY29uIHJlcG9ydC1pY29uLS1vcGVuIGxoLWV4cG9ydC0tdmlld2VyXCIgZGF0YS1hY3Rpb249XCJvcGVuLXZpZXdlclwiPk9wZW4gaW4gVmlld2VyPC9hPlxuICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwicmVwb3J0LWljb24gcmVwb3J0LWljb24tLW9wZW4gbGgtZXhwb3J0LS1naXN0XCIgZGF0YS1hY3Rpb249XCJzYXZlLWdpc3RcIj5TYXZlIGFzIEdpc3Q8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cblxuPCEtLSBMaWdodGhvdXNlIGZvb3RlciAtLT5cbjx0ZW1wbGF0ZSBpZD1cInRtcGwtbGgtZm9vdGVyXCI+XG4gIDxzdHlsZT5cbiAgICAubGgtZm9vdGVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhlYWRlci1iZy1jb2xvcik7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcmVwb3J0LXNlY29uZGFyeS1ib3JkZXItY29sb3IpO1xuICAgICAgcGFkZGluZzogdmFyKC0tc2VjdGlvbi1pbmRlbnQpIGNhbGModmFyKC0tZGVmYXVsdC1wYWRkaW5nKSAqIDIpO1xuICAgIH1cbiAgICAubGgtZm9vdGVyIC5saC1nZW5lcmF0ZWQge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXJlcG9ydC1ib3JkZXItY29sb3IpO1xuICAgICAgcGFkZGluZy10b3A6IHZhcigtLWRlZmF1bHQtcGFkZGluZyk7XG4gICAgfVxuICAgIC5saC1lbnYge1xuICAgICAgcGFkZGluZzogdmFyKC0tZGVmYXVsdC1wYWRkaW5nKSAwO1xuICAgIH1cbiAgICAubGgtZW52X19pdGVtcyB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gICAgfVxuICAgIHNwYW4ubGgtZW52X19uYW1lIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTtcbiAgICB9XG4gICAgc3Bhbi5saC1lbnZfX2Rlc2NyaXB0aW9uIHtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vc3BhY2UtZm9udC1mYW1pbHkpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1jYXB0aW9uLWZvbnQtc2l6ZSk7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxmb290ZXIgY2xhc3M9XCJsaC1mb290ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGgtZW52XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGgtZW52X190aXRsZVwiPlJ1bnRpbWUgc2V0dGluZ3M8L2Rpdj5cbiAgICAgIDx1bCBjbGFzcz1cImxoLWVudl9faXRlbXNcIj5cbiAgICAgICAgPHRlbXBsYXRlIGlkPVwidG1wbC1saC1lbnZfX2l0ZW1zXCI+XG4gICAgICAgICAgPGxpIGNsYXNzPVwibGgtZW52X19pdGVtXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxoLWVudl9fbmFtZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGgtZW52X19kZXNjcmlwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsaC1nZW5lcmF0ZWRcIj5cbiAgICAgIEdlbmVyYXRlZCBieSA8Yj5MaWdodGhvdXNlPC9iPiA8c3BhbiBjbGFzcz1cImxoLWZvb3Rlcl9fdmVyc2lvblwiPjwvc3Bhbj4gfFxuICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvTGlnaHRob3VzZS9pc3N1ZXNcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPkZpbGUgYW4gaXNzdWU8L2E+XG4gICAgPC9kaXY+XG4gIDwvZm9vdGVyPlxuPC90ZW1wbGF0ZT5cblxuPCEtLSBMaWdodGhvdXNlIHNjb3JlIGdhdWdlIC0tPlxuPHRlbXBsYXRlIGlkPVwidG1wbC1saC1nYXVnZVwiPlxuICA8c3R5bGU+XG4gICAgLmxoLWdhdWdlX193cmFwcGVyIHtcbiAgICAgIC0tY2lyY2xlLXNpemU6IGNhbGMoMyAqIHZhcigtLWhlYWRlci1mb250LXNpemUpKTtcbiAgICAgIC0tY2lyY2xlLXNpemUtaGFsZjogY2FsYyh2YXIoLS1jaXJjbGUtc2l6ZSkgLyAyKTtcbiAgICAgIC0tY2lyY2xlLWJhY2tncm91bmQ6IGhzbCgyMTYsIDEyJSwgOTIlKTtcbiAgICAgIC0tY2lyY2xlLWJvcmRlci13aWR0aDogOTtcbiAgICAgIC0taW5zZXQtc2l6ZTogY2FsYyh2YXIoLS1jaXJjbGUtc2l6ZSkgLSAyICogdmFyKC0tY2lyY2xlLWJvcmRlci13aWR0aCkpO1xuICAgICAgLS10cmFuc2l0aW9uLWxlbmd0aDogMXM7XG4gICAgfVxuXG4gICAgLmxoLWdhdWdlX193cmFwcGVyLS1wYXNzLFxuICAgIC5saC1nYXVnZV9fd3JhcHBlci0tcGFzcyAubGgtZ2F1Z2Uge1xuICAgICAgLS1jaXJjbGUtY29sb3I6IHZhcigtLXBhc3MtY29sb3IpO1xuICAgICAgY29sb3I6IHZhcigtLWNpcmNsZS1jb2xvcik7XG4gICAgfVxuXG4gICAgLmxoLWdhdWdlX193cmFwcGVyLS1hdmVyYWdlLFxuICAgIC5saC1nYXVnZV9fd3JhcHBlci0tYXZlcmFnZSAubGgtZ2F1Z2Uge1xuICAgICAgLS1jaXJjbGUtY29sb3I6IHZhcigtLWF2ZXJhZ2UtY29sb3IpO1xuICAgICAgY29sb3I6IHZhcigtLWNpcmNsZS1jb2xvcik7XG4gICAgfVxuXG4gICAgLmxoLWdhdWdlX193cmFwcGVyLS1mYWlsLFxuICAgIC5saC1nYXVnZV9fd3JhcHBlci0tZmFpbCAubGgtZ2F1Z2Uge1xuICAgICAgLS1jaXJjbGUtY29sb3I6IHZhcigtLWZhaWwtY29sb3IpO1xuICAgICAgY29sb3I6IHZhcigtLWNpcmNsZS1jb2xvcik7XG4gICAgfVxuXG4gICAgLmxoLWdhdWdlIHtcbiAgICAgICAgbWF4LXdpZHRoOiAzNjBweDtcbiAgICAgICAgbWF4LWhlaWdodDogMzYwcHg7XG4gICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcbiAgICAgICAgd2lkdGg6IHZhcigtLWNpcmNsZS1zaXplKTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jaXJjbGUtc2l6ZSk7XG4gICAgfVxuXG4gICAgLmxoLWdhdWdlLWJhc2Uge1xuICAgICAgICBmaWxsOiBub25lO1xuICAgICAgICBzdHJva2U6IHZhcigtLWNpcmNsZS1iYWNrZ3JvdW5kKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiB2YXIoLS1jaXJjbGUtYm9yZGVyLXdpZHRoKTtcbiAgICB9XG4gICAgLmxoLWdhdWdlLWFyYyB7XG4gICAgICAgIGZpbGw6IG5vbmU7XG4gICAgICAgIHN0cm9rZTogdmFyKC0tY2lyY2xlLWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiB2YXIoLS1jaXJjbGUtYm9yZGVyLXdpZHRoKTtcbiAgICAgICAgYW5pbWF0aW9uOiBsb2FkLWdhdWdlIHZhcigtLXRyYW5zaXRpb24tbGVuZ3RoKSBlYXNlIGZvcndhcmRzO1xuICAgICAgICBhbmltYXRpb24tZGVsYXk6IDI1MG1zO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgbG9hZC1nYXVnZSB7XG4gICAgICBmcm9tIHsgc3Ryb2tlLWRhc2hhcnJheTogMCAzMjk7IH1cbiAgICB9XG5cbiAgICAubGgtZ2F1Z2VfX3BlcmNlbnRhZ2Uge1xuICAgICAgLS1zcGFjZXI6IGNhbGMoKHZhcigtLWNpcmNsZS1zaXplKSAtIHZhcigtLWluc2V0LXNpemUpKSAvIDIpO1xuICAgICAgd2lkdGg6IHZhcigtLWluc2V0LXNpemUpO1xuICAgICAgaGVpZ2h0OiB2YXIoLS1pbnNldC1zaXplKTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhlYWRlci1mb250LXNpemUpO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgdG9wOiBjYWxjKHZhcigtLWNpcmNsZS1zaXplKSAvIDMpO1xuICAgIH1cblxuICAgIC5saC1nYXVnZV9fd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogYXV0bztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICAgLyogQ29udGFpbiB0aGUgbGF5b3V0IHN0eWxlIHBhaW50ICYgbGF5ZXJzIGR1cmluZyBhbmltYXRpb24qL1xuICAgICAgY29udGFpbjogY29udGVudDtcbiAgICAgIHdpbGwtY2hhbmdlOiBvcGFjaXR5OyAvKiBPbmx5IHVzaW5nIGZvciBsYXllciBwcm9tb3Rpb24gKi9cbiAgICB9XG5cbiAgICAubGgtZ2F1Z2VfX2xhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tYm9keS1mb250LXNpemUpO1xuICAgICAgbGluZS1oZWlnaHQ6IHZhcigtLWJvZHktbGluZS1oZWlnaHQpO1xuICAgICAgbWFyZ2luLXRvcDogY2FsYygwLjUgKiB2YXIoLS1ib2R5LWxpbmUtaGVpZ2h0KSk7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBjb2xvcjogYmxhY2s7XG4gICAgfVxuXG4gIDwvc3R5bGU+XG4gIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJsaC1nYXVnZV9fd3JhcHBlclwiPlxuICAgIDxzdmcgdmlld0JveD1cIjAgMCAxMjAgMTIwXCIgY2xhc3M9XCJsaC1nYXVnZVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPlxuICAgICAgPGNpcmNsZSBjbGFzcz1cImxoLWdhdWdlLWJhc2VcIiByPVwiNTNcIiBjeD1cIjYwXCIgY3k9XCI2MFwiPjwvY2lyY2xlPlxuICAgICAgPGNpcmNsZSBjbGFzcz1cImxoLWdhdWdlLWFyY1wiIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAgNjAgNjApXCIgc3Ryb2tlLWRhc2hhcnJheT1cIjAgMzI5XCIgc3Ryb2tlLWRhc2hvZmZzZXQ9XCIwXCIgcj1cIjUzXCIgY3g9XCI2MFwiIGN5PVwiNjBcIj48L2NpcmNsZT5cbiAgICA8L3N2Zz5cbiAgICA8ZGl2IGNsYXNzPVwibGgtZ2F1Z2VfX3BlcmNlbnRhZ2VcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGgtZ2F1Z2VfX2xhYmVsXCI+PC9kaXY+XG4gIDwvYT5cbjwvdGVtcGxhdGU+XG5cbjwhLS0gTGlnaHRob3VzZSBjcnRpaWNhbCByZXF1ZXN0IGNoYWlucyBjb21wb25lbnQgLS0+XG48dGVtcGxhdGUgaWQ9XCJ0bXBsLWxoLWNyY1wiPlxuICA8ZGl2IGNsYXNzPVwibGgtY3JjLWNvbnRhaW5lclwiPlxuICAgIDxzdHlsZT5cbiAgICAgIC5saC1jcmMgLnRyZWUtbWFya2VyIHtcbiAgICAgICAgd2lkdGg6IDEycHg7XG4gICAgICAgIGhlaWdodDogMjZweDtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcbiAgICAgIH1cbiAgICAgIC5saC1jcmMgLmhvcml6LWRvd24ge1xuICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjI2XCIgdmlld0JveD1cIjAgMCAxNiAyNlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48ZyBmaWxsPVwiJTIzRDhEOEQ4XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxwYXRoIGQ9XCJNMTYgMTJ2MkgtMnYtMnpcIi8+PHBhdGggZD1cIk05IDEydjE0SDdWMTJ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICAgIH1cbiAgICAgIC5saC1jcmMgLnJpZ2h0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIyNlwiIHZpZXdCb3g9XCIwIDAgMTYgMjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xNiAxMnYySDB2LTJ6XCIgZmlsbD1cIiUyM0Q4RDhEOFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIi8+PC9zdmc+Jyk7XG4gICAgICB9XG4gICAgICAubGgtY3JjIC51cC1yaWdodCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDE2IDI2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNyAwaDJ2MTRIN3ptMiAxMmg3djJIOXpcIiBmaWxsPVwiJTIzRDhEOEQ4XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiLz48L3N2Zz4nKTtcbiAgICAgIH1cbiAgICAgIC5saC1jcmMgLnZlcnQtcmlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjI2XCIgdmlld0JveD1cIjAgMCAxNiAyNlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTcgMGgydjI3SDd6bTIgMTJoN3YySDl6XCIgZmlsbD1cIiUyM0Q4RDhEOFwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIi8+PC9zdmc+Jyk7XG4gICAgICB9XG4gICAgICAubGgtY3JjIC52ZXJ0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIyNlwiIHZpZXdCb3g9XCIwIDAgMTYgMjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk03IDBoMnYyNkg3elwiIGZpbGw9XCIlMjNEOEQ4RDhcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIvPjwvc3ZnPicpO1xuICAgICAgfVxuICAgICAgLmxoLWNyYyAuY3JjLXRyZWUge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgfVxuICAgICAgLmxoLWNyYyAuY3JjLW5vZGUge1xuICAgICAgICBoZWlnaHQ6IDI2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuICAgICAgLmxoLWNyYyAuY3JjLW5vZGVfX3RyZWUtdmFsdWUge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgIH1cbiAgICAgIC5saC1jcmMgLmNyYy1ub2RlX19jaGFpbi1kdXJhdGlvbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICB9XG4gICAgICAubGgtY3JjIC5jcmMtbm9kZV9fdHJlZS1ob3N0bmFtZSB7XG4gICAgICAgIGNvbG9yOiAjNTk1OTU5O1xuICAgICAgfVxuICAgICAgLmxoLWNyYyAuY3JjLWluaXRpYWwtbmF2IHtcbiAgICAgICAgY29sb3I6ICM1OTU5NTk7XG4gICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXY+XG4gICAgICBMb25nZXN0IGNoYWluOiA8YiBjbGFzcz1cImxoLWNyY19fbG9uZ2VzdF9kdXJhdGlvblwiPjwhLS0gZmlsbCBtZTogbG9uZ2VzdENoYWluLmR1cmF0aW9uIC0tPjwvYj5cbiAgICAgIG92ZXIgPGIgY2xhc3M9XCJsaC1jcmNfX2xvbmdlc3RfbGVuZ3RoXCI+PCEtLSBmaWxsIG1lOiBsb25nZXN0Q2hhaW4ubGVuZ3RoIC0tPjwvYj4gcmVxdWVzdHMsIHRvdGFsbGluZ1xuICAgICAgPGIgY2xhc3M9XCJsaC1jcmNfX2xvbmdlc3RfdHJhbnNmZXJzaXplXCI+PCEtLSBmaWxsIG1lOiBsb25nZXN0Q2hhaW4ubGVuZ3RoIC0tPjwvYj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGgtY3JjXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3JjLWluaXRpYWwtbmF2XCI+SW5pdGlhbCBOYXZpZ2F0aW9uPC9kaXY+XG4gICAgICA8IS0tIHN0YW1wIGZvciBlYWNoIGNoYWluIC0tPlxuICAgICAgPHRlbXBsYXRlIGlkPVwidG1wbC1saC1jcmNfX2NoYWluc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3JjLW5vZGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyYy1ub2RlX190cmVlLW1hcmtlclwiPlxuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JjLW5vZGVfX3RyZWUtdmFsdWVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JjLW5vZGVfX3RyZWUtZmlsZVwiPjwhLS0gZmlsbCBtZTogbm9kZS5yZXF1ZXN0LnVybC5maWxlIC0tPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JjLW5vZGVfX3RyZWUtaG9zdG5hbWVcIj4oPCEtLSBmaWxsIG1lOiBub2RlLnJlcXVlc3QudXJsLmhvc3QgLS0+KTwvc3Bhbj5cblxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbi8qIyBzb3VyY2VVUkw9YXVkaXRzMi9saWdodGhvdXNlL3RlbXBsYXRlcy5odG1sICovIjtCcm93c2VyQ29uc29sZS5Ccm93c2VyQ29uc29sZT1jbGFzc3thcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsb2JqZWN0KXtjb25zdCBjb25zb2xlTWVzc2FnZT0ob2JqZWN0KTtjb25zdCByZXF1ZXN0PUJyb3dzZXJTREsuTmV0d29ya0xvZy5yZXF1ZXN0Rm9yQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO2lmKHJlcXVlc3QmJlNESy5OZXR3b3JrTWFuYWdlci5jYW5SZXBsYXlSZXF1ZXN0KHJlcXVlc3QpKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVwbGF5IFhIUicpLFNESy5OZXR3b3JrTWFuYWdlci5yZXBsYXlSZXF1ZXN0LmJpbmQobnVsbCxyZXF1ZXN0KSk7fX0KcmVuZGVyKG9iamVjdCxvcHRpb25zKXtjb25zdCBjb25zb2xlTWVzc2FnZT0ob2JqZWN0KTtjb25zdCByZXF1ZXN0PUJyb3dzZXJTREsuTmV0d29ya0xvZy5yZXF1ZXN0Rm9yQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO2xldCBtZXNzYWdlRWxlbWVudD1udWxsO2lmKHJlcXVlc3Qpe21lc3NhZ2VFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtpZihjb25zb2xlTWVzc2FnZS5sZXZlbD09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3Ipe21lc3NhZ2VFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChyZXF1ZXN0LnJlcXVlc3RNZXRob2QrJyAnKTttZXNzYWdlRWxlbWVudC5hcHBlbmRDaGlsZChDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5UmV2ZWFsYWJsZShyZXF1ZXN0LHJlcXVlc3QudXJsKCkscmVxdWVzdC51cmwoKSkpO2lmKHJlcXVlc3QuZmFpbGVkKQptZXNzYWdlRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGRyZW4oJyAnLHJlcXVlc3QubG9jYWxpemVkRmFpbERlc2NyaXB0aW9uKTtpZihyZXF1ZXN0LnN0YXR1c0NvZGUhPT0wKQptZXNzYWdlRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGRyZW4oJyAnLFN0cmluZyhyZXF1ZXN0LnN0YXR1c0NvZGUpKTtpZihyZXF1ZXN0LnN0YXR1c1RleHQpCm1lc3NhZ2VFbGVtZW50LmNyZWF0ZVRleHRDaGlsZHJlbignICgnLHJlcXVlc3Quc3RhdHVzVGV4dCwnKScpO31lbHNle2NvbnN0IGZyYWdtZW50PUNvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLmxpbmtpZnlXaXRoQ3VzdG9tTGlua2lmaWVyKGNvbnNvbGVNZXNzYWdlLm1lc3NhZ2VUZXh0LHRpdGxlPT5Db21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5UmV2ZWFsYWJsZSgocmVxdWVzdCksdGl0bGUscmVxdWVzdC51cmwoKSkpO21lc3NhZ2VFbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTt9fQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChtZXNzYWdlRWxlbWVudCkpO319OztCcm93c2VyRGVidWdnZXIuRE9NQnJlYWtwb2ludHNTaWRlYmFyUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2Jyb3dzZXJfZGVidWdnZXIvZG9tQnJlYWtwb2ludHNTaWRlYmFyUGFuZS5jc3MnKTt0aGlzLl9saXN0RWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdicmVha3BvaW50LWxpc3QgaGlkZGVuJyk7dGhpcy5fZW1wdHlFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2dyYXktaW5mby1tZXNzYWdlJyk7dGhpcy5fZW1wdHlFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gYnJlYWtwb2ludHMnKTt0aGlzLl9pdGVtcz1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRE9NRGVidWdnZXJNb2RlbCxTREsuRE9NRGVidWdnZXJNb2RlbC5FdmVudHMuRE9NQnJlYWtwb2ludEFkZGVkLHRoaXMuX2JyZWFrcG9pbnRBZGRlZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5ET01EZWJ1Z2dlck1vZGVsLFNESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cy5ET01CcmVha3BvaW50VG9nZ2xlZCx0aGlzLl9icmVha3BvaW50VG9nZ2xlZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5ET01EZWJ1Z2dlck1vZGVsLFNESy5ET01EZWJ1Z2dlck1vZGVsLkV2ZW50cy5ET01CcmVha3BvaW50c1JlbW92ZWQsdGhpcy5fYnJlYWtwb2ludHNSZW1vdmVkLHRoaXMpO2Zvcihjb25zdCBkb21EZWJ1Z2dlck1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRE9NRGVidWdnZXJNb2RlbCkpe2RvbURlYnVnZ2VyTW9kZWwucmV0cmlldmVET01CcmVha3BvaW50cygpO2Zvcihjb25zdCBicmVha3BvaW50IG9mIGRvbURlYnVnZ2VyTW9kZWwuZG9tQnJlYWtwb2ludHMoKSkKdGhpcy5fYWRkQnJlYWtwb2ludChicmVha3BvaW50KTt9CnRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudD1udWxsO3RoaXMuX3VwZGF0ZSgpO30KX2JyZWFrcG9pbnRBZGRlZChldmVudCl7dGhpcy5fYWRkQnJlYWtwb2ludCgoZXZlbnQuZGF0YSkpO30KX2JyZWFrcG9pbnRUb2dnbGVkKGV2ZW50KXtjb25zdCBicmVha3BvaW50PShldmVudC5kYXRhKTtjb25zdCBpdGVtPXRoaXMuX2l0ZW1zLmdldChicmVha3BvaW50KTtpZihpdGVtKQppdGVtLmNoZWNrYm94LmNoZWNrZWQ9YnJlYWtwb2ludC5lbmFibGVkO30KX2JyZWFrcG9pbnRzUmVtb3ZlZChldmVudCl7Y29uc3QgYnJlYWtwb2ludHM9KGV2ZW50LmRhdGEpO2Zvcihjb25zdCBicmVha3BvaW50IG9mIGJyZWFrcG9pbnRzKXtjb25zdCBpdGVtPXRoaXMuX2l0ZW1zLmdldChicmVha3BvaW50KTtpZihpdGVtKXt0aGlzLl9pdGVtcy5kZWxldGUoYnJlYWtwb2ludCk7dGhpcy5fbGlzdEVsZW1lbnQucmVtb3ZlQ2hpbGQoaXRlbS5lbGVtZW50KTt9fQppZighdGhpcy5fbGlzdEVsZW1lbnQuZmlyc3RDaGlsZCl7dGhpcy5fZW1wdHlFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO3RoaXMuX2xpc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO319Cl9hZGRCcmVha3BvaW50KGJyZWFrcG9pbnQpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnYnJlYWtwb2ludC1lbnRyeScpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51LmJpbmQodGhpcyxicmVha3BvaW50KSx0cnVlKTtjb25zdCBjaGVja2JveExhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKCcnLGJyZWFrcG9pbnQuZW5hYmxlZCk7Y29uc3QgY2hlY2tib3hFbGVtZW50PWNoZWNrYm94TGFiZWwuY2hlY2tib3hFbGVtZW50O2NoZWNrYm94RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fY2hlY2tib3hDbGlja2VkLmJpbmQodGhpcyxicmVha3BvaW50KSxmYWxzZSk7ZWxlbWVudC5hcHBlbmRDaGlsZChjaGVja2JveExhYmVsKTtjb25zdCBsYWJlbEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZG9tLWJyZWFrcG9pbnQnKTtlbGVtZW50LmFwcGVuZENoaWxkKGxhYmVsRWxlbWVudCk7Y29uc3QgbGlua2lmaWVkTm9kZT1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdtb25vc3BhY2UnKTtsaW5raWZpZWROb2RlLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztsYWJlbEVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua2lmaWVkTm9kZSk7Q29tbW9uLkxpbmtpZmllci5saW5raWZ5KGJyZWFrcG9pbnQubm9kZSkudGhlbihsaW5raWZpZWQ9PmxpbmtpZmllZE5vZGUuYXBwZW5kQ2hpbGQobGlua2lmaWVkKSk7Y29uc3QgZGVzY3JpcHRpb249Y3JlYXRlRWxlbWVudCgnZGl2Jyk7ZGVzY3JpcHRpb24udGV4dENvbnRlbnQ9QnJvd3NlckRlYnVnZ2VyLkRPTUJyZWFrcG9pbnRzU2lkZWJhclBhbmUuQnJlYWtwb2ludFR5cGVMYWJlbHMuZ2V0KGJyZWFrcG9pbnQudHlwZSk7bGFiZWxFbGVtZW50LmFwcGVuZENoaWxkKGRlc2NyaXB0aW9uKTtjb25zdCBpdGVtPXticmVha3BvaW50OmJyZWFrcG9pbnQsZWxlbWVudDplbGVtZW50LGNoZWNrYm94OmNoZWNrYm94RWxlbWVudH07ZWxlbWVudC5faXRlbT1pdGVtO3RoaXMuX2l0ZW1zLnNldChicmVha3BvaW50LGl0ZW0pO2xldCBjdXJyZW50RWxlbWVudD10aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkO3doaWxlKGN1cnJlbnRFbGVtZW50KXtpZihjdXJyZW50RWxlbWVudC5faXRlbSYmY3VycmVudEVsZW1lbnQuX2l0ZW0uYnJlYWtwb2ludC50eXBlPGJyZWFrcG9pbnQudHlwZSkKYnJlYWs7Y3VycmVudEVsZW1lbnQ9Y3VycmVudEVsZW1lbnQubmV4dFNpYmxpbmc7fQp0aGlzLl9saXN0RWxlbWVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCxjdXJyZW50RWxlbWVudCk7dGhpcy5fZW1wdHlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX2xpc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO30KX2NvbnRleHRNZW51KGJyZWFrcG9pbnQsZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVtb3ZlIGJyZWFrcG9pbnQnKSwoKT0+e2JyZWFrcG9pbnQuZG9tRGVidWdnZXJNb2RlbC5yZW1vdmVET01CcmVha3BvaW50KGJyZWFrcG9pbnQubm9kZSxicmVha3BvaW50LnR5cGUpO30pO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlbW92ZSBhbGwgRE9NIGJyZWFrcG9pbnRzJyksKCk9PnticmVha3BvaW50LmRvbURlYnVnZ2VyTW9kZWwucmVtb3ZlQWxsRE9NQnJlYWtwb2ludHMoKTt9KTtjb250ZXh0TWVudS5zaG93KCk7fQpfY2hlY2tib3hDbGlja2VkKGJyZWFrcG9pbnQpe2NvbnN0IGl0ZW09dGhpcy5faXRlbXMuZ2V0KGJyZWFrcG9pbnQpO2lmKCFpdGVtKQpyZXR1cm47YnJlYWtwb2ludC5kb21EZWJ1Z2dlck1vZGVsLnRvZ2dsZURPTUJyZWFrcG9pbnQoYnJlYWtwb2ludCxpdGVtLmNoZWNrYm94LmNoZWNrZWQpO30KZmxhdm9yQ2hhbmdlZChvYmplY3Qpe3RoaXMuX3VwZGF0ZSgpO30KX3VwZGF0ZSgpe2NvbnN0IGRldGFpbHM9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyk7aWYoIWRldGFpbHN8fCFkZXRhaWxzLmF1eERhdGF8fGRldGFpbHMucmVhc29uIT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uRE9NKXtpZih0aGlzLl9oaWdobGlnaHRlZEVsZW1lbnQpe3RoaXMuX2hpZ2hsaWdodGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdicmVha3BvaW50LWhpdCcpO2RlbGV0ZSB0aGlzLl9oaWdobGlnaHRlZEVsZW1lbnQ7fQpyZXR1cm47fQpjb25zdCBkb21EZWJ1Z2dlck1vZGVsPWRldGFpbHMuZGVidWdnZXJNb2RlbC50YXJnZXQoKS5tb2RlbChTREsuRE9NRGVidWdnZXJNb2RlbCk7aWYoIWRvbURlYnVnZ2VyTW9kZWwpCnJldHVybjtjb25zdCBkYXRhPWRvbURlYnVnZ2VyTW9kZWwucmVzb2x2ZURPTUJyZWFrcG9pbnREYXRhKChkZXRhaWxzLmF1eERhdGEpKTtpZighZGF0YSkKcmV0dXJuO2xldCBlbGVtZW50PW51bGw7Zm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5faXRlbXMudmFsdWVzKCkpe2lmKGl0ZW0uYnJlYWtwb2ludC5ub2RlPT09ZGF0YS5ub2RlJiZpdGVtLmJyZWFrcG9pbnQudHlwZT09PWRhdGEudHlwZSkKZWxlbWVudD1pdGVtLmVsZW1lbnQ7fQppZighZWxlbWVudCkKcmV0dXJuO1VJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KCdzb3VyY2VzLmRvbUJyZWFrcG9pbnRzJyk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdicmVha3BvaW50LWhpdCcpO3RoaXMuX2hpZ2hsaWdodGVkRWxlbWVudD1lbGVtZW50O319O0Jyb3dzZXJEZWJ1Z2dlci5ET01CcmVha3BvaW50c1NpZGViYXJQYW5lLkl0ZW07QnJvd3NlckRlYnVnZ2VyLkRPTUJyZWFrcG9pbnRzU2lkZWJhclBhbmUuQnJlYWtwb2ludFR5cGVMYWJlbHM9bmV3IE1hcChbW1NESy5ET01EZWJ1Z2dlck1vZGVsLkRPTUJyZWFrcG9pbnQuVHlwZS5TdWJ0cmVlTW9kaWZpZWQsQ29tbW9uLlVJU3RyaW5nKCdTdWJ0cmVlIG1vZGlmaWVkJyldLFtTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50LlR5cGUuQXR0cmlidXRlTW9kaWZpZWQsQ29tbW9uLlVJU3RyaW5nKCdBdHRyaWJ1dGUgbW9kaWZpZWQnKV0sW1NESy5ET01EZWJ1Z2dlck1vZGVsLkRPTUJyZWFrcG9pbnQuVHlwZS5Ob2RlUmVtb3ZlZCxDb21tb24uVUlTdHJpbmcoJ05vZGUgcmVtb3ZlZCcpXSxdKTtCcm93c2VyRGVidWdnZXIuRE9NQnJlYWtwb2ludHNTaWRlYmFyUGFuZS5Db250ZXh0TWVudVByb3ZpZGVyPWNsYXNze2FwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSxvYmplY3Qpe2NvbnN0IG5vZGU9KG9iamVjdCk7aWYobm9kZS5wc2V1ZG9UeXBlKCkpCnJldHVybjtjb25zdCBkb21EZWJ1Z2dlck1vZGVsPW5vZGUuZG9tTW9kZWwoKS50YXJnZXQoKS5tb2RlbChTREsuRE9NRGVidWdnZXJNb2RlbCk7aWYoIWRvbURlYnVnZ2VyTW9kZWwpCnJldHVybjtmdW5jdGlvbiB0b2dnbGVCcmVha3BvaW50KHR5cGUpe2lmKGRvbURlYnVnZ2VyTW9kZWwuaGFzRE9NQnJlYWtwb2ludChub2RlLHR5cGUpKQpkb21EZWJ1Z2dlck1vZGVsLnJlbW92ZURPTUJyZWFrcG9pbnQobm9kZSx0eXBlKTtlbHNlCmRvbURlYnVnZ2VyTW9kZWwuc2V0RE9NQnJlYWtwb2ludChub2RlLHR5cGUpO30KY29uc3QgYnJlYWtwb2ludHNNZW51PWNvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnQnJlYWsgb24nKSk7Zm9yKGNvbnN0IGtleSBpbiBTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50LlR5cGUpe2NvbnN0IHR5cGU9U0RLLkRPTURlYnVnZ2VyTW9kZWwuRE9NQnJlYWtwb2ludC5UeXBlW2tleV07Y29uc3QgbGFiZWw9U291cmNlcy5EZWJ1Z2dlclBhdXNlZE1lc3NhZ2UuQnJlYWtwb2ludFR5cGVOb3Vucy5nZXQodHlwZSk7YnJlYWtwb2ludHNNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKGxhYmVsLHRvZ2dsZUJyZWFrcG9pbnQuYmluZChudWxsLHR5cGUpLGRvbURlYnVnZ2VyTW9kZWwuaGFzRE9NQnJlYWtwb2ludChub2RlLHR5cGUpKTt9fX07O0Jyb3dzZXJEZWJ1Z2dlci5FdmVudExpc3RlbmVyQnJlYWtwb2ludHNTaWRlYmFyUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLl9jYXRlZ29yaWVzVHJlZU91dGxpbmU9bmV3IFVJLlRyZWVPdXRsaW5lSW5TaGFkb3coKTt0aGlzLl9jYXRlZ29yaWVzVHJlZU91dGxpbmUuZWxlbWVudC50YWJJbmRleD0wO3RoaXMuX2NhdGVnb3JpZXNUcmVlT3V0bGluZS5yZWdpc3RlclJlcXVpcmVkQ1NTKCdicm93c2VyX2RlYnVnZ2VyL2V2ZW50TGlzdGVuZXJCcmVha3BvaW50cy5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NhdGVnb3JpZXNUcmVlT3V0bGluZS5lbGVtZW50KTt0aGlzLl9jYXRlZ29yaWVzPW5ldyBNYXAoKTtjb25zdCBjYXRlZ29yaWVzPVNESy5kb21EZWJ1Z2dlck1hbmFnZXIuZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzKCkubWFwKGJyZWFrcG9pbnQ9PmJyZWFrcG9pbnQuY2F0ZWdvcnkoKSk7Y2F0ZWdvcmllcy5zb3J0KCk7Zm9yKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXMpe2lmKCF0aGlzLl9jYXRlZ29yaWVzLmhhcyhjYXRlZ29yeSkpCnRoaXMuX2NyZWF0ZUNhdGVnb3J5KGNhdGVnb3J5KTt9CnRoaXMuX2JyZWFrcG9pbnRzPW5ldyBNYXAoKTtmb3IoY29uc3QgYnJlYWtwb2ludCBvZiBTREsuZG9tRGVidWdnZXJNYW5hZ2VyLmV2ZW50TGlzdGVuZXJCcmVha3BvaW50cygpKQp0aGlzLl9jcmVhdGVCcmVha3BvaW50KGJyZWFrcG9pbnQpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyUGF1c2VkLHRoaXMuX3VwZGF0ZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclJlc3VtZWQsdGhpcy5fdXBkYXRlLHRoaXMpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLlRhcmdldCx0aGlzLl91cGRhdGUsdGhpcyk7fQpfY3JlYXRlQ2F0ZWdvcnkobmFtZSl7Y29uc3QgbGFiZWxOb2RlPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKG5hbWUpO2xhYmVsTm9kZS5jaGVja2JveEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2NhdGVnb3J5Q2hlY2tib3hDbGlja2VkLmJpbmQodGhpcyxuYW1lKSx0cnVlKTtjb25zdCB0cmVlRWxlbWVudD1uZXcgVUkuVHJlZUVsZW1lbnQobGFiZWxOb2RlKTt0cmVlRWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO3RoaXMuX2NhdGVnb3JpZXNUcmVlT3V0bGluZS5hcHBlbmRDaGlsZCh0cmVlRWxlbWVudCk7dGhpcy5fY2F0ZWdvcmllcy5zZXQobmFtZSx7ZWxlbWVudDp0cmVlRWxlbWVudCxjaGVja2JveDpsYWJlbE5vZGUuY2hlY2tib3hFbGVtZW50fSk7fQpfY3JlYXRlQnJlYWtwb2ludChicmVha3BvaW50KXtjb25zdCBsYWJlbE5vZGU9VUkuQ2hlY2tib3hMYWJlbC5jcmVhdGUoYnJlYWtwb2ludC50aXRsZSgpKTtsYWJlbE5vZGUuY2xhc3NMaXN0LmFkZCgnc291cmNlLWNvZGUnKTtsYWJlbE5vZGUuY2hlY2tib3hFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9icmVha3BvaW50Q2hlY2tib3hDbGlja2VkLmJpbmQodGhpcyxicmVha3BvaW50KSx0cnVlKTtjb25zdCB0cmVlRWxlbWVudD1uZXcgVUkuVHJlZUVsZW1lbnQobGFiZWxOb2RlKTt0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JyZWFrcG9pbnQtaGl0LW1hcmtlcicpO3RyZWVFbGVtZW50LnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fY2F0ZWdvcmllcy5nZXQoYnJlYWtwb2ludC5jYXRlZ29yeSgpKS5lbGVtZW50LmFwcGVuZENoaWxkKHRyZWVFbGVtZW50KTt0aGlzLl9icmVha3BvaW50cy5zZXQoYnJlYWtwb2ludCx7ZWxlbWVudDp0cmVlRWxlbWVudCxjaGVja2JveDpsYWJlbE5vZGUuY2hlY2tib3hFbGVtZW50fSk7fQpfdXBkYXRlKCl7Y29uc3QgdGFyZ2V0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5UYXJnZXQpO2NvbnN0IGRlYnVnZ2VyTW9kZWw9dGFyZ2V0P3RhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk6bnVsbDtjb25zdCBkZXRhaWxzPWRlYnVnZ2VyTW9kZWw/ZGVidWdnZXJNb2RlbC5kZWJ1Z2dlclBhdXNlZERldGFpbHMoKTpudWxsO2lmKCFkZXRhaWxzfHxkZXRhaWxzLnJlYXNvbiE9PVNESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uLkV2ZW50TGlzdGVuZXJ8fCFkZXRhaWxzLmF1eERhdGEpe2lmKHRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudCl7dGhpcy5faGlnaGxpZ2h0ZWRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2JyZWFrcG9pbnQtaGl0Jyk7ZGVsZXRlIHRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudDt9CnJldHVybjt9CmNvbnN0IGJyZWFrcG9pbnQ9U0RLLmRvbURlYnVnZ2VyTWFuYWdlci5yZXNvbHZlRXZlbnRMaXN0ZW5lckJyZWFrcG9pbnQoKGRldGFpbHMuYXV4RGF0YSkpO2lmKCFicmVha3BvaW50KQpyZXR1cm47VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ3NvdXJjZXMuZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzJyk7dGhpcy5fY2F0ZWdvcmllcy5nZXQoYnJlYWtwb2ludC5jYXRlZ29yeSgpKS5lbGVtZW50LmV4cGFuZCgpO3RoaXMuX2hpZ2hsaWdodGVkRWxlbWVudD10aGlzLl9icmVha3BvaW50cy5nZXQoYnJlYWtwb2ludCkuZWxlbWVudC5saXN0SXRlbUVsZW1lbnQ7dGhpcy5faGlnaGxpZ2h0ZWRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2JyZWFrcG9pbnQtaGl0Jyk7fQpfY2F0ZWdvcnlDaGVja2JveENsaWNrZWQoY2F0ZWdvcnkpe2NvbnN0IGl0ZW09dGhpcy5fY2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnkpO2NvbnN0IGVuYWJsZWQ9aXRlbS5jaGVja2JveC5jaGVja2VkO2Zvcihjb25zdCBicmVha3BvaW50IG9mIHRoaXMuX2JyZWFrcG9pbnRzLmtleXMoKSl7aWYoYnJlYWtwb2ludC5jYXRlZ29yeSgpPT09Y2F0ZWdvcnkpe2JyZWFrcG9pbnQuc2V0RW5hYmxlZChlbmFibGVkKTt0aGlzLl9icmVha3BvaW50cy5nZXQoYnJlYWtwb2ludCkuY2hlY2tib3guY2hlY2tlZD1lbmFibGVkO319fQpfYnJlYWtwb2ludENoZWNrYm94Q2xpY2tlZChicmVha3BvaW50KXtjb25zdCBpdGVtPXRoaXMuX2JyZWFrcG9pbnRzLmdldChicmVha3BvaW50KTticmVha3BvaW50LnNldEVuYWJsZWQoaXRlbS5jaGVja2JveC5jaGVja2VkKTtsZXQgaGFzRW5hYmxlZD1mYWxzZTtsZXQgaGFzRGlzYWJsZWQ9ZmFsc2U7Zm9yKGNvbnN0IG90aGVyIG9mIHRoaXMuX2JyZWFrcG9pbnRzLmtleXMoKSl7aWYob3RoZXIuY2F0ZWdvcnkoKT09PWJyZWFrcG9pbnQuY2F0ZWdvcnkoKSl7aWYob3RoZXIuZW5hYmxlZCgpKQpoYXNFbmFibGVkPXRydWU7ZWxzZQpoYXNEaXNhYmxlZD10cnVlO319CmNvbnN0IGNoZWNrYm94PXRoaXMuX2NhdGVnb3JpZXMuZ2V0KGJyZWFrcG9pbnQuY2F0ZWdvcnkoKSkuY2hlY2tib3g7Y2hlY2tib3guY2hlY2tlZD1oYXNFbmFibGVkO2NoZWNrYm94LmluZGV0ZXJtaW5hdGU9aGFzRW5hYmxlZCYmaGFzRGlzYWJsZWQ7fX07QnJvd3NlckRlYnVnZ2VyLkV2ZW50TGlzdGVuZXJCcmVha3BvaW50c1NpZGViYXJQYW5lLkl0ZW07O0Jyb3dzZXJEZWJ1Z2dlci5PYmplY3RFdmVudExpc3RlbmVyc1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fcmVmcmVzaEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1JlZnJlc2gnKSwnbGFyZ2VpY29uLXJlZnJlc2gnKTt0aGlzLl9yZWZyZXNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fcmVmcmVzaENsaWNrLHRoaXMpO3RoaXMuX3JlZnJlc2hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3PW5ldyBFdmVudExpc3RlbmVycy5FdmVudExpc3RlbmVyc1ZpZXcodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7dGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3LnNob3codGhpcy5lbGVtZW50KTt9CnRvb2xiYXJJdGVtcygpe3JldHVyblt0aGlzLl9yZWZyZXNoQnV0dG9uXTt9CnVwZGF0ZSgpe2lmKHRoaXMuX2xhc3RSZXF1ZXN0ZWRDb250ZXh0KXt0aGlzLl9sYXN0UmVxdWVzdGVkQ29udGV4dC5ydW50aW1lTW9kZWwucmVsZWFzZU9iamVjdEdyb3VwKEJyb3dzZXJEZWJ1Z2dlci5PYmplY3RFdmVudExpc3RlbmVyc1NpZGViYXJQYW5lLl9vYmplY3RHcm91cE5hbWUpO2RlbGV0ZSB0aGlzLl9sYXN0UmVxdWVzdGVkQ29udGV4dDt9CmNvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKCFleGVjdXRpb25Db250ZXh0KXt0aGlzLl9ldmVudExpc3RlbmVyc1ZpZXcucmVzZXQoKTt0aGlzLl9ldmVudExpc3RlbmVyc1ZpZXcuYWRkRW1wdHlIb2xkZXJJZk5lZWRlZCgpO3JldHVybjt9CnRoaXMuX2xhc3RSZXF1ZXN0ZWRDb250ZXh0PWV4ZWN1dGlvbkNvbnRleHQ7UHJvbWlzZS5hbGwoW3RoaXMuX3dpbmRvd09iamVjdEluQ29udGV4dChleGVjdXRpb25Db250ZXh0KV0pLnRoZW4odGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3LmFkZE9iamVjdHMuYmluZCh0aGlzLl9ldmVudExpc3RlbmVyc1ZpZXcpKTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5FeGVjdXRpb25Db250ZXh0LHRoaXMudXBkYXRlLHRoaXMpO3RoaXMuX3JlZnJlc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTt0aGlzLnVwZGF0ZSgpO30Kd2lsbEhpZGUoKXtzdXBlci53aWxsSGlkZSgpO1VJLmNvbnRleHQucmVtb3ZlRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkV4ZWN1dGlvbkNvbnRleHQsdGhpcy51cGRhdGUsdGhpcyk7dGhpcy5fcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt9Cl93aW5kb3dPYmplY3RJbkNvbnRleHQoZXhlY3V0aW9uQ29udGV4dCl7cmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoe2V4cHJlc3Npb246J3NlbGYnLG9iamVjdEdyb3VwOkJyb3dzZXJEZWJ1Z2dlci5PYmplY3RFdmVudExpc3RlbmVyc1NpZGViYXJQYW5lLl9vYmplY3RHcm91cE5hbWUsaW5jbHVkZUNvbW1hbmRMaW5lQVBJOmZhbHNlLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6ZmFsc2UsZ2VuZXJhdGVQcmV2aWV3OmZhbHNlfSxmYWxzZSxmYWxzZSkudGhlbihyZXN1bHQ9PnJlc3VsdC5vYmplY3QmJiFyZXN1bHQuZXhjZXB0aW9uRGV0YWlscz9yZXN1bHQub2JqZWN0Om51bGwpO30KX3JlZnJlc2hDbGljayhldmVudCl7ZXZlbnQuZGF0YS5jb25zdW1lKCk7dGhpcy51cGRhdGUoKTt9fTtCcm93c2VyRGVidWdnZXIuT2JqZWN0RXZlbnRMaXN0ZW5lcnNTaWRlYmFyUGFuZS5fb2JqZWN0R3JvdXBOYW1lPSdvYmplY3QtZXZlbnQtbGlzdGVuZXJzLXNpZGViYXItcGFuZSc7O0Jyb3dzZXJEZWJ1Z2dlci5YSFJCcmVha3BvaW50c1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnYnJvd3Nlcl9kZWJ1Z2dlci94aHJCcmVha3BvaW50c1NpZGViYXJQYW5lLmNzcycpO3RoaXMuX2xpc3RFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JyZWFrcG9pbnQtbGlzdCBoaWRkZW4nKTt0aGlzLl9lbXB0eUVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZ3JheS1pbmZvLW1lc3NhZ2UnKTt0aGlzLl9lbXB0eUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdObyBicmVha3BvaW50cycpO3RoaXMuX2JyZWFrcG9pbnRFbGVtZW50cz1uZXcgTWFwKCk7dGhpcy5fYWRkQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQWRkIGJyZWFrcG9pbnQnKSwnbGFyZ2VpY29uLWFkZCcpO3RoaXMuX2FkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2FkZEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSk7dGhpcy5fZW1wdHlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9lbXB0eUVsZW1lbnRDb250ZXh0TWVudS5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX3Jlc3RvcmVCcmVha3BvaW50cygpO3RoaXMuX3VwZGF0ZSgpO30KdG9vbGJhckl0ZW1zKCl7cmV0dXJuW3RoaXMuX2FkZEJ1dHRvbl07fQpfZW1wdHlFbGVtZW50Q29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQWRkIGJyZWFrcG9pbnQnKSx0aGlzLl9hZGRCdXR0b25DbGlja2VkLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9hZGRCdXR0b25DbGlja2VkKCl7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ3NvdXJjZXMueGhyQnJlYWtwb2ludHMnKTtjb25zdCBpbnB1dEVsZW1lbnRDb250YWluZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygncCcsJ2JyZWFrcG9pbnQtY29uZGl0aW9uJyk7aW5wdXRFbGVtZW50Q29udGFpbmVyLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQnJlYWsgd2hlbiBVUkwgY29udGFpbnM6Jyk7Y29uc3QgaW5wdXRFbGVtZW50PWlucHV0RWxlbWVudENvbnRhaW5lci5jcmVhdGVDaGlsZCgnc3BhbicsJ2JyZWFrcG9pbnQtY29uZGl0aW9uLWlucHV0Jyk7dGhpcy5fYWRkTGlzdEVsZW1lbnQoaW5wdXRFbGVtZW50Q29udGFpbmVyLCh0aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkKSk7ZnVuY3Rpb24gZmluaXNoRWRpdGluZyhhY2NlcHQsZSx0ZXh0KXt0aGlzLl9yZW1vdmVMaXN0RWxlbWVudChpbnB1dEVsZW1lbnRDb250YWluZXIpO2lmKGFjY2VwdCl7U0RLLmRvbURlYnVnZ2VyTWFuYWdlci5hZGRYSFJCcmVha3BvaW50KHRleHQsdHJ1ZSk7dGhpcy5fc2V0QnJlYWtwb2ludCh0ZXh0LHRydWUpO319CmNvbnN0IGNvbmZpZz1uZXcgVUkuSW5wbGFjZUVkaXRvci5Db25maWcoZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsdHJ1ZSksZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsZmFsc2UpKTtVSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyhpbnB1dEVsZW1lbnQsY29uZmlnKTt9Cl9zZXRCcmVha3BvaW50KHVybCxlbmFibGVkKXtpZih0aGlzLl9icmVha3BvaW50RWxlbWVudHMuaGFzKHVybCkpe3RoaXMuX2JyZWFrcG9pbnRFbGVtZW50cy5nZXQodXJsKS5fY2hlY2tib3hFbGVtZW50LmNoZWNrZWQ9ZW5hYmxlZDtyZXR1cm47fQpjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2JyZWFrcG9pbnQtZW50cnknKTtlbGVtZW50Ll91cmw9dXJsO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51LmJpbmQodGhpcyx1cmwpLHRydWUpO2NvbnN0IHRpdGxlPXVybD9Db21tb24uVUlTdHJpbmcoJ1VSTCBjb250YWlucyAiJXMiJyx1cmwpOkNvbW1vbi5VSVN0cmluZygnQW55IFhIUiBvciBmZXRjaCcpO2NvbnN0IGxhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKHRpdGxlLGVuYWJsZWQpO2VsZW1lbnQuYXBwZW5kQ2hpbGQobGFiZWwpO2xhYmVsLmNoZWNrYm94RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fY2hlY2tib3hDbGlja2VkLmJpbmQodGhpcyx1cmwpLGZhbHNlKTtlbGVtZW50Ll9jaGVja2JveEVsZW1lbnQ9bGFiZWwuY2hlY2tib3hFbGVtZW50O2xhYmVsLmNsYXNzTGlzdC5hZGQoJ2N1cnNvci1hdXRvJyk7bGFiZWwudGV4dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX2xhYmVsQ2xpY2tlZC5iaW5kKHRoaXMsdXJsKSxmYWxzZSk7bGV0IGN1cnJlbnRFbGVtZW50PSh0aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkKTt3aGlsZShjdXJyZW50RWxlbWVudCl7aWYoY3VycmVudEVsZW1lbnQuX3VybCYmY3VycmVudEVsZW1lbnQuX3VybDxlbGVtZW50Ll91cmwpCmJyZWFrO2N1cnJlbnRFbGVtZW50PShjdXJyZW50RWxlbWVudC5uZXh0U2libGluZyk7fQp0aGlzLl9hZGRMaXN0RWxlbWVudChlbGVtZW50LGN1cnJlbnRFbGVtZW50KTt0aGlzLl9icmVha3BvaW50RWxlbWVudHMuc2V0KHVybCxlbGVtZW50KTt9Cl9yZW1vdmVCcmVha3BvaW50KHVybCl7Y29uc3QgZWxlbWVudD10aGlzLl9icmVha3BvaW50RWxlbWVudHMuZ2V0KHVybCk7aWYoIWVsZW1lbnQpCnJldHVybjt0aGlzLl9yZW1vdmVMaXN0RWxlbWVudChlbGVtZW50KTt0aGlzLl9icmVha3BvaW50RWxlbWVudHMuZGVsZXRlKHVybCk7fQpfYWRkTGlzdEVsZW1lbnQoZWxlbWVudCxiZWZvcmVOb2RlKXt0aGlzLl9saXN0RWxlbWVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCxiZWZvcmVOb2RlKTt0aGlzLl9lbXB0eUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5fbGlzdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7fQpfcmVtb3ZlTGlzdEVsZW1lbnQoZWxlbWVudCl7dGhpcy5fbGlzdEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7aWYoIXRoaXMuX2xpc3RFbGVtZW50LmZpcnN0Q2hpbGQpe3RoaXMuX2VtcHR5RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLl9saXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt9fQpfY29udGV4dE1lbnUodXJsLGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2Z1bmN0aW9uIHJlbW92ZUJyZWFrcG9pbnQoKXtTREsuZG9tRGVidWdnZXJNYW5hZ2VyLnJlbW92ZVhIUkJyZWFrcG9pbnQodXJsKTt0aGlzLl9yZW1vdmVCcmVha3BvaW50KHVybCk7fQpmdW5jdGlvbiByZW1vdmVBbGxCcmVha3BvaW50cygpe2Zvcihjb25zdCB1cmwgb2YgdGhpcy5fYnJlYWtwb2ludEVsZW1lbnRzLmtleXMoKSl7U0RLLmRvbURlYnVnZ2VyTWFuYWdlci5yZW1vdmVYSFJCcmVha3BvaW50KHVybCk7dGhpcy5fcmVtb3ZlQnJlYWtwb2ludCh1cmwpO319CmNvbnN0IHJlbW92ZUFsbFRpdGxlPUNvbW1vbi5VSVN0cmluZygnUmVtb3ZlIGFsbCBicmVha3BvaW50cycpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0FkZCBicmVha3BvaW50JyksdGhpcy5fYWRkQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgYnJlYWtwb2ludCcpLHJlbW92ZUJyZWFrcG9pbnQuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKHJlbW92ZUFsbFRpdGxlLHJlbW92ZUFsbEJyZWFrcG9pbnRzLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9jaGVja2JveENsaWNrZWQodXJsLGV2ZW50KXtTREsuZG9tRGVidWdnZXJNYW5hZ2VyLnRvZ2dsZVhIUkJyZWFrcG9pbnQodXJsLGV2ZW50LnRhcmdldC5jaGVja2VkKTt9Cl9sYWJlbENsaWNrZWQodXJsKXtjb25zdCBlbGVtZW50PXRoaXMuX2JyZWFrcG9pbnRFbGVtZW50cy5nZXQodXJsKXx8bnVsbDtjb25zdCBpbnB1dEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2JyZWFrcG9pbnQtY29uZGl0aW9uJyk7aW5wdXRFbGVtZW50LnRleHRDb250ZW50PXVybDt0aGlzLl9saXN0RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXRFbGVtZW50LGVsZW1lbnQpO2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7ZnVuY3Rpb24gZmluaXNoRWRpdGluZyhhY2NlcHQsZSx0ZXh0KXt0aGlzLl9yZW1vdmVMaXN0RWxlbWVudChpbnB1dEVsZW1lbnQpO2lmKGFjY2VwdCl7U0RLLmRvbURlYnVnZ2VyTWFuYWdlci5yZW1vdmVYSFJCcmVha3BvaW50KHVybCk7dGhpcy5fcmVtb3ZlQnJlYWtwb2ludCh1cmwpO2NvbnN0IGVuYWJsZWQ9ZWxlbWVudD9lbGVtZW50Ll9jaGVja2JveEVsZW1lbnQuY2hlY2tlZDp0cnVlO1NESy5kb21EZWJ1Z2dlck1hbmFnZXIuYWRkWEhSQnJlYWtwb2ludCh0ZXh0LGVuYWJsZWQpO3RoaXMuX3NldEJyZWFrcG9pbnQodGV4dCxlbmFibGVkKTt9ZWxzZXtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO319ClVJLklucGxhY2VFZGl0b3Iuc3RhcnRFZGl0aW5nKGlucHV0RWxlbWVudCxuZXcgVUkuSW5wbGFjZUVkaXRvci5Db25maWcoZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsdHJ1ZSksZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsZmFsc2UpKSk7fQpmbGF2b3JDaGFuZ2VkKG9iamVjdCl7dGhpcy5fdXBkYXRlKCk7fQpfdXBkYXRlKCl7Y29uc3QgZGV0YWlscz1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzKTtpZighZGV0YWlsc3x8ZGV0YWlscy5yZWFzb24hPT1TREsuRGVidWdnZXJNb2RlbC5CcmVha1JlYXNvbi5YSFIpe2lmKHRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudCl7dGhpcy5faGlnaGxpZ2h0ZWRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2JyZWFrcG9pbnQtaGl0Jyk7ZGVsZXRlIHRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudDt9CnJldHVybjt9CmNvbnN0IHVybD1kZXRhaWxzLmF1eERhdGFbJ2JyZWFrcG9pbnRVUkwnXTtjb25zdCBlbGVtZW50PXRoaXMuX2JyZWFrcG9pbnRFbGVtZW50cy5nZXQodXJsKTtpZighZWxlbWVudCkKcmV0dXJuO1VJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KCdzb3VyY2VzLnhockJyZWFrcG9pbnRzJyk7ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdicmVha3BvaW50LWhpdCcpO3RoaXMuX2hpZ2hsaWdodGVkRWxlbWVudD1lbGVtZW50O30KX3Jlc3RvcmVCcmVha3BvaW50cygpe2NvbnN0IGJyZWFrcG9pbnRzPVNESy5kb21EZWJ1Z2dlck1hbmFnZXIueGhyQnJlYWtwb2ludHMoKTtmb3IoY29uc3QgdXJsIG9mIGJyZWFrcG9pbnRzLmtleXMoKSkKdGhpcy5fc2V0QnJlYWtwb2ludCh1cmwsYnJlYWtwb2ludHMuZ2V0KHVybCkpO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1siYnJvd3Nlcl9kZWJ1Z2dlci9kb21CcmVha3BvaW50c1NpZGViYXJQYW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5icmVha3BvaW50LWxpc3Qge1xuICAgIHBhZGRpbmctYm90dG9tOiAzcHg7XG59XG5cbi5icmVha3BvaW50LWxpc3QgLmRvbS1icmVha3BvaW50ID4gZGl2IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4uYnJlYWtwb2ludC1lbnRyeSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcGFkZGluZzogMnB4IDA7XG59XG5cbi5icmVha3BvaW50LWxpc3QgLmJyZWFrcG9pbnQtZW50cnk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi5icmVha3BvaW50LWhpdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxOTQpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5icmVha3BvaW50LWhpdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDQ2LCA5OCUsIDIyJSk7XG4gICAgY29sb3I6ICNjY2M7XG59XG5cbi8qIyBzb3VyY2VVUkw9YnJvd3Nlcl9kZWJ1Z2dlci9kb21CcmVha3BvaW50c1NpZGViYXJQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImJyb3dzZXJfZGVidWdnZXIvZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMnB4IDRweDtcbiAgICBtaW4taGVpZ2h0OiAxOHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBtYXJnaW4tbGVmdDogMTRweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5wYXJlbnQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcHg7XG59XG5cbi50cmVlLW91dGxpbmUgbGk6bm90KC5wYXJlbnQpOjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5icmVha3BvaW50LWhpdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxOTQpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5icmVha3BvaW50LWhpdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDQ2LCA5OCUsIDIyJSk7XG4gICAgY29sb3I6ICNjY2M7XG59XG5cbi5icmVha3BvaW50LWhpdCAuYnJlYWtwb2ludC1oaXQtbWFya2VyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDE5NCk7XG4gICAgaGVpZ2h0OiAxOHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IC0zMHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogLTRweDtcbiAgICB6LWluZGV4OiAtMTtcbn1cblxuLyojIHNvdXJjZVVSTD1icm93c2VyX2RlYnVnZ2VyL2V2ZW50TGlzdGVuZXJCcmVha3BvaW50cy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJicm93c2VyX2RlYnVnZ2VyL3hockJyZWFrcG9pbnRzU2lkZWJhclBhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmJyZWFrcG9pbnQtbGlzdCB7XG4gICAgcGFkZGluZy1ib3R0b206IDNweDtcbn1cblxuLmJyZWFrcG9pbnQtbGlzdCAuZWRpdGluZy5iZWluZy1lZGl0ZWQge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmJyZWFrcG9pbnQtY29uZGl0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAyM3B4O1xuICAgIG1hcmdpbi1yaWdodDogOHB4O1xufVxuXG4uYnJlYWtwb2ludC1jb25kaXRpb24taW5wdXQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDY2JSwgNjYlLCA2NiUpO1xufVxuXG4uYnJlYWtwb2ludC1lbnRyeSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBwYWRkaW5nOiAycHggMDtcbn1cblxuLmJyZWFrcG9pbnQtbGlzdCAuYnJlYWtwb2ludC1lbnRyeTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbn1cblxuLmJyZWFrcG9pbnQtZW50cnkgW2lzPWR0LWNoZWNrYm94XSB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uYnJlYWtwb2ludC1oaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMTk0KTtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAuYnJlYWtwb2ludC1oaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCg0NiwgOTglLCAyMiUpO1xuICAgIGNvbG9yOiAjY2NjO1xufVxuXG4vKiMgc291cmNlVVJMPWJyb3dzZXJfZGVidWdnZXIveGhyQnJlYWtwb2ludHNTaWRlYmFyUGFuZS5jc3MgKi8iO0NoYW5nZXMuQ2hhbmdlc0hpZ2hsaWdodGVyPWZ1bmN0aW9uKGNvbmZpZyxwYXJzZXJDb25maWcpe2NvbnN0IGRpZmZSb3dzPXBhcnNlckNvbmZpZy5kaWZmUm93cztjb25zdCBiYXNlbGluZUxpbmVzPXBhcnNlckNvbmZpZy5iYXNlbGluZUxpbmVzO2NvbnN0IGN1cnJlbnRMaW5lcz1wYXJzZXJDb25maWcuY3VycmVudExpbmVzO2NvbnN0IHN5bnRheEhpZ2hsaWdodE1vZGU9Q29kZU1pcnJvci5nZXRNb2RlKHt9LHBhcnNlckNvbmZpZy5taW1lVHlwZSk7ZnVuY3Rpb24gZmFzdEZvcndhcmQoc3RhdGUsYmFzZWxpbmVMaW5lTnVtYmVyLGN1cnJlbnRMaW5lTnVtYmVyKXtpZihiYXNlbGluZUxpbmVOdW1iZXI+c3RhdGUuYmFzZWxpbmVMaW5lTnVtYmVyKXtmYXN0Rm9yd2FyZFN5bnRheEhpZ2hsaWdodGVyKHN0YXRlLmJhc2VsaW5lU3ludGF4U3RhdGUsc3RhdGUuYmFzZWxpbmVMaW5lTnVtYmVyLGJhc2VsaW5lTGluZU51bWJlcixiYXNlbGluZUxpbmVzKTtzdGF0ZS5iYXNlbGluZUxpbmVOdW1iZXI9YmFzZWxpbmVMaW5lTnVtYmVyO30KaWYoY3VycmVudExpbmVOdW1iZXI+c3RhdGUuY3VycmVudExpbmVOdW1iZXIpe2Zhc3RGb3J3YXJkU3ludGF4SGlnaGxpZ2h0ZXIoc3RhdGUuY3VycmVudFN5bnRheFN0YXRlLHN0YXRlLmN1cnJlbnRMaW5lTnVtYmVyLGN1cnJlbnRMaW5lTnVtYmVyLGN1cnJlbnRMaW5lcyk7c3RhdGUuY3VycmVudExpbmVOdW1iZXI9Y3VycmVudExpbmVOdW1iZXI7fX0KZnVuY3Rpb24gZmFzdEZvcndhcmRTeW50YXhIaWdobGlnaHRlcihzeW50YXhTdGF0ZSxmcm9tLHRvLGxpbmVzKXtsZXQgbGluZU51bWJlcj1mcm9tO3doaWxlKGxpbmVOdW1iZXI8dG8mJmxpbmVOdW1iZXI8bGluZXMubGVuZ3RoKXtjb25zdCBzdHJlYW09bmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKGxpbmVzW2xpbmVOdW1iZXJdKTtpZihzdHJlYW0uZW9sKCkmJnN5bnRheEhpZ2hsaWdodE1vZGUuYmxhbmtMaW5lKQpzeW50YXhIaWdobGlnaHRNb2RlLmJsYW5rTGluZShzeW50YXhTdGF0ZSk7d2hpbGUoIXN0cmVhbS5lb2woKSl7c3ludGF4SGlnaGxpZ2h0TW9kZS50b2tlbihzdHJlYW0sc3ludGF4U3RhdGUpO3N0cmVhbS5zdGFydD1zdHJlYW0ucG9zO30KbGluZU51bWJlcisrO319CnJldHVybntzdGFydFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJue3Jvd051bWJlcjowLGRpZmZUb2tlbkluZGV4OjAsY3VycmVudExpbmVOdW1iZXI6MCxiYXNlbGluZUxpbmVOdW1iZXI6MCxjdXJyZW50U3ludGF4U3RhdGU6Q29kZU1pcnJvci5zdGFydFN0YXRlKHN5bnRheEhpZ2hsaWdodE1vZGUpLGJhc2VsaW5lU3ludGF4U3RhdGU6Q29kZU1pcnJvci5zdGFydFN0YXRlKHN5bnRheEhpZ2hsaWdodE1vZGUpLHN5bnRheFBvc2l0aW9uOjAsZGlmZlBvc2l0aW9uOjAsc3ludGF4U3R5bGU6JycsZGlmZlN0eWxlOicnfTt9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7Y29uc3QgZGlmZlJvdz1kaWZmUm93c1tzdGF0ZS5yb3dOdW1iZXJdO2lmKCFkaWZmUm93KXtzdHJlYW0ubmV4dCgpO3JldHVybicnO30KZmFzdEZvcndhcmQoc3RhdGUsZGlmZlJvdy5iYXNlbGluZUxpbmVOdW1iZXItMSxkaWZmUm93LmN1cnJlbnRMaW5lTnVtYmVyLTEpO2xldCBjbGFzc2VzPScnO2lmKHN0cmVhbS5wb3M9PT0wKQpjbGFzc2VzKz0nIGxpbmUtYmFja2dyb3VuZC0nK2RpZmZSb3cudHlwZSsnIGxpbmUtJytkaWZmUm93LnR5cGU7Y29uc3Qgc3ludGF4SGlnaGxpZ2h0ZXJOZWVkc1JlZnJlc2g9c3RhdGUuZGlmZlBvc2l0aW9uPj1zdGF0ZS5zeW50YXhQb3NpdGlvbjtpZihzdGF0ZS5kaWZmUG9zaXRpb248PXN0YXRlLnN5bnRheFBvc2l0aW9uKXtzdGF0ZS5kaWZmUG9zaXRpb24rPWRpZmZSb3cudG9rZW5zW3N0YXRlLmRpZmZUb2tlbkluZGV4XS50ZXh0Lmxlbmd0aDtzdGF0ZS5kaWZmU3R5bGU9ZGlmZlJvdy50b2tlbnNbc3RhdGUuZGlmZlRva2VuSW5kZXhdLmNsYXNzTmFtZTtzdGF0ZS5kaWZmVG9rZW5JbmRleCsrO30KaWYoc3ludGF4SGlnaGxpZ2h0ZXJOZWVkc1JlZnJlc2gpe2lmKGRpZmZSb3cudHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbnx8ZGlmZlJvdy50eXBlPT09Q2hhbmdlcy5DaGFuZ2VzVmlldy5Sb3dUeXBlLkFkZGl0aW9ufHxkaWZmUm93LnR5cGU9PT1DaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRXF1YWwpe3N0YXRlLnN5bnRheFN0eWxlPXN5bnRheEhpZ2hsaWdodE1vZGUudG9rZW4oc3RyZWFtLGRpZmZSb3cudHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbj9zdGF0ZS5iYXNlbGluZVN5bnRheFN0YXRlOnN0YXRlLmN1cnJlbnRTeW50YXhTdGF0ZSk7c3RhdGUuc3ludGF4UG9zaXRpb249c3RyZWFtLnBvczt9ZWxzZXtzdGF0ZS5zeW50YXhTdHlsZT0nJztzdGF0ZS5zeW50YXhQb3NpdGlvbj1JbmZpbml0eTt9fQpzdHJlYW0ucG9zPU1hdGgubWluKHN0YXRlLnN5bnRheFBvc2l0aW9uLHN0YXRlLmRpZmZQb3NpdGlvbik7Y2xhc3Nlcys9JyAnK3N0YXRlLnN5bnRheFN0eWxlO2NsYXNzZXMrPScgJytzdGF0ZS5kaWZmU3R5bGU7aWYoc3RyZWFtLmVvbCgpKXtzdGF0ZS5yb3dOdW1iZXIrKztpZihkaWZmUm93LnR5cGU9PT1DaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRGVsZXRpb24pCnN0YXRlLmJhc2VsaW5lTGluZU51bWJlcisrO2Vsc2UKc3RhdGUuY3VycmVudExpbmVOdW1iZXIrKztzdGF0ZS5kaWZmUG9zaXRpb249MDtzdGF0ZS5zeW50YXhQb3NpdGlvbj0wO3N0YXRlLmRpZmZUb2tlbkluZGV4PTA7fQpyZXR1cm4gY2xhc3Nlczt9LGJsYW5rTGluZTpmdW5jdGlvbihzdGF0ZSl7Y29uc3QgZGlmZlJvdz1kaWZmUm93c1tzdGF0ZS5yb3dOdW1iZXJdO3N0YXRlLnJvd051bWJlcisrO3N0YXRlLnN5bnRheFBvc2l0aW9uPTA7c3RhdGUuZGlmZlBvc2l0aW9uPTA7c3RhdGUuZGlmZlRva2VuSW5kZXg9MDtpZighZGlmZlJvdykKcmV0dXJuJyc7bGV0IHN0eWxlPScnO2lmKHN5bnRheEhpZ2hsaWdodE1vZGUuYmxhbmtMaW5lKXtpZihkaWZmUm93LnR5cGU9PT1DaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRXF1YWx8fGRpZmZSb3cudHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5BZGRpdGlvbil7c3R5bGU9c3ludGF4SGlnaGxpZ2h0TW9kZS5ibGFua0xpbmUoc3RhdGUuY3VycmVudFN5bnRheFN0YXRlKTtzdGF0ZS5jdXJyZW50TGluZU51bWJlcisrO31lbHNlIGlmKGRpZmZSb3cudHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbil7c3R5bGU9c3ludGF4SGlnaGxpZ2h0TW9kZS5ibGFua0xpbmUoc3RhdGUuYmFzZWxpbmVTeW50YXhTdGF0ZSk7c3RhdGUuYmFzZWxpbmVMaW5lTnVtYmVyKys7fX0KcmV0dXJuIHN0eWxlKycgbGluZS1iYWNrZ3JvdW5kLScrZGlmZlJvdy50eXBlKycgbGluZS0nK2RpZmZSb3cudHlwZTt9LGNvcHlTdGF0ZTpmdW5jdGlvbihzdGF0ZSl7Y29uc3QgbmV3U3RhdGU9T2JqZWN0LmFzc2lnbih7fSxzdGF0ZSk7bmV3U3RhdGUuY3VycmVudFN5bnRheFN0YXRlPUNvZGVNaXJyb3IuY29weVN0YXRlKHN5bnRheEhpZ2hsaWdodE1vZGUsc3RhdGUuY3VycmVudFN5bnRheFN0YXRlKTtuZXdTdGF0ZS5iYXNlbGluZVN5bnRheFN0YXRlPUNvZGVNaXJyb3IuY29weVN0YXRlKHN5bnRheEhpZ2hsaWdodE1vZGUsc3RhdGUuYmFzZWxpbmVTeW50YXhTdGF0ZSk7cmV0dXJuKG5ld1N0YXRlKTt9fTt9O0NoYW5nZXMuQ2hhbmdlc0hpZ2hsaWdodGVyLkRpZmZTdGF0ZTtDb2RlTWlycm9yLmRlZmluZU1vZGUoJ2RldnRvb2xzLWRpZmYnLENoYW5nZXMuQ2hhbmdlc0hpZ2hsaWdodGVyKTs7Q2hhbmdlcy5DaGFuZ2VzVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2NoYW5nZXMvY2hhbmdlc1ZpZXcuY3NzJyk7Y29uc3Qgc3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KHRydWUsZmFsc2UpO2NvbnN0IG1haW5XaWRnZXQ9bmV3IFVJLldpZGdldCgpO3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQobWFpbldpZGdldCk7c3BsaXRXaWRnZXQuc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9lbXB0eVdpZGdldD1uZXcgVUkuRW1wdHlXaWRnZXQoJycpO3RoaXMuX2VtcHR5V2lkZ2V0LnNob3cobWFpbldpZGdldC5lbGVtZW50KTt0aGlzLl93b3Jrc3BhY2VEaWZmPVdvcmtzcGFjZURpZmYud29ya3NwYWNlRGlmZigpO3RoaXMuX2NoYW5nZXNTaWRlYmFyPW5ldyBDaGFuZ2VzLkNoYW5nZXNTaWRlYmFyKHRoaXMuX3dvcmtzcGFjZURpZmYpO3RoaXMuX2NoYW5nZXNTaWRlYmFyLmFkZEV2ZW50TGlzdGVuZXIoQ2hhbmdlcy5DaGFuZ2VzU2lkZWJhci5FdmVudHMuU2VsZWN0ZWRVSVNvdXJjZUNvZGVDaGFuZ2VkLHRoaXMuX3NlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZCx0aGlzKTtzcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuX2NoYW5nZXNTaWRlYmFyKTt0aGlzLl9zZWxlY3RlZFVJU291cmNlQ29kZT1udWxsO3RoaXMuX2RpZmZSb3dzPVtdO3RoaXMuX21heExpbmVEaWdpdHM9MTt0aGlzLl9lZGl0b3I9bmV3IFRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3Ioe2xpbmVOdW1iZXJzOnRydWUsbGluZVdyYXBwaW5nOmZhbHNlLG1heEhpZ2hsaWdodExlbmd0aDpJbmZpbml0eX0pO3RoaXMuX2VkaXRvci5zZXRSZWFkT25seSh0cnVlKTt0aGlzLl9lZGl0b3Iuc2hvdyhtYWluV2lkZ2V0LmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2VkaXRvci1jb250YWluZXInKSk7dGhpcy5fZWRpdG9yLmhpZGVXaWRnZXQoKTt0aGlzLl9lZGl0b3IuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fY2xpY2suYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignY2hhbmdlcy10b29sYmFyJyxtYWluV2lkZ2V0LmVsZW1lbnQpO2NvbnN0IHJldmVydEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1JldmVydCBhbGwgY2hhbmdlcycpLCdsYXJnZWljb24tdW5kbycpO3JldmVydEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3JldmVydC5iaW5kKHRoaXMpKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHJldmVydEJ1dHRvbik7dGhpcy5fZGlmZlN0YXRzPW5ldyBVSS5Ub29sYmFyVGV4dCgnJyk7dGhpcy5fdG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9kaWZmU3RhdHMpO3RoaXMuX3Rvb2xiYXIuc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5faGlkZURpZmYobHNgTm8gY2hhbmdlc2ApO3RoaXMuX3NlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZCgpO30KX3NlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZCgpe3RoaXMuX3JldmVhbFVJU291cmNlQ29kZSh0aGlzLl9jaGFuZ2VzU2lkZWJhci5zZWxlY3RlZFVJU291cmNlQ29kZSgpKTt9Cl9yZXZlcnQoKXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGU7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuO3RoaXMuX3dvcmtzcGFjZURpZmYucmV2ZXJ0VG9PcmlnaW5hbCh1aVNvdXJjZUNvZGUpO30KX2NsaWNrKGV2ZW50KXtjb25zdCBzZWxlY3Rpb249dGhpcy5fZWRpdG9yLnNlbGVjdGlvbigpO2lmKCFzZWxlY3Rpb24uaXNFbXB0eSgpKQpyZXR1cm47Y29uc3Qgcm93PXRoaXMuX2RpZmZSb3dzW3NlbGVjdGlvbi5zdGFydExpbmVdO0NvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGUudWlMb2NhdGlvbihyb3cuY3VycmVudExpbmVOdW1iZXItMSxzZWxlY3Rpb24uc3RhcnRDb2x1bW4pLGZhbHNlKTtldmVudC5jb25zdW1lKHRydWUpO30KX3JldmVhbFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2lmKHRoaXMuX3NlbGVjdGVkVUlTb3VyY2VDb2RlPT09dWlTb3VyY2VDb2RlKQpyZXR1cm47aWYodGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGUpCnRoaXMuX3dvcmtzcGFjZURpZmYudW5zdWJzY3JpYmVGcm9tRGlmZkNoYW5nZSh0aGlzLl9zZWxlY3RlZFVJU291cmNlQ29kZSx0aGlzLl9yZWZyZXNoRGlmZix0aGlzKTtpZih1aVNvdXJjZUNvZGUmJnRoaXMuaXNTaG93aW5nKCkpCnRoaXMuX3dvcmtzcGFjZURpZmYuc3Vic2NyaWJlVG9EaWZmQ2hhbmdlKHVpU291cmNlQ29kZSx0aGlzLl9yZWZyZXNoRGlmZix0aGlzKTt0aGlzLl9zZWxlY3RlZFVJU291cmNlQ29kZT11aVNvdXJjZUNvZGU7dGhpcy5fcmVmcmVzaERpZmYoKTt9Cndhc1Nob3duKCl7dGhpcy5fcmVmcmVzaERpZmYoKTt9Cl9yZWZyZXNoRGlmZigpe2lmKCF0aGlzLmlzU2hvd2luZygpKQpyZXR1cm47aWYoIXRoaXMuX3NlbGVjdGVkVUlTb3VyY2VDb2RlKXt0aGlzLl9yZW5kZXJEaWZmUm93cyhudWxsKTtyZXR1cm47fQpjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGU7aWYoIXVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzVGV4dFR5cGUoKSl7dGhpcy5faGlkZURpZmYobHNgQmluYXJ5IGRhdGFgKTtyZXR1cm47fQp0aGlzLl93b3Jrc3BhY2VEaWZmLnJlcXVlc3REaWZmKHVpU291cmNlQ29kZSkudGhlbihkaWZmPT57aWYodGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGUhPT11aVNvdXJjZUNvZGUpCnJldHVybjt0aGlzLl9yZW5kZXJEaWZmUm93cyhkaWZmKTt9KTt9Cl9oaWRlRGlmZihtZXNzYWdlKXt0aGlzLl9kaWZmU3RhdHMuc2V0VGV4dCgnJyk7dGhpcy5fdG9vbGJhci5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9lZGl0b3IuaGlkZVdpZGdldCgpO3RoaXMuX2VtcHR5V2lkZ2V0LnRleHQ9bWVzc2FnZTt0aGlzLl9lbXB0eVdpZGdldC5zaG93V2lkZ2V0KCk7fQpfcmVuZGVyRGlmZlJvd3MoZGlmZil7dGhpcy5fZGlmZlJvd3M9W107aWYoIWRpZmZ8fChkaWZmLmxlbmd0aD09PTEmJmRpZmZbMF1bMF09PT1EaWZmLkRpZmYuT3BlcmF0aW9uLkVxdWFsKSl7dGhpcy5faGlkZURpZmYobHNgTm8gY2hhbmdlc2ApO3JldHVybjt9CmxldCBpbnNlcnRpb25zPTA7bGV0IGRlbGV0aW9ucz0wO2xldCBjdXJyZW50TGluZU51bWJlcj0wO2xldCBiYXNlbGluZUxpbmVOdW1iZXI9MDtjb25zdCBwYWRkaW5nTGluZXM9Mztjb25zdCBvcmlnaW5hbExpbmVzPVtdO2NvbnN0IGN1cnJlbnRMaW5lcz1bXTtmb3IobGV0IGk9MDtpPGRpZmYubGVuZ3RoOysraSl7Y29uc3QgdG9rZW49ZGlmZltpXTtzd2l0Y2godG9rZW5bMF0pe2Nhc2UgRGlmZi5EaWZmLk9wZXJhdGlvbi5FcXVhbDp0aGlzLl9kaWZmUm93cy5wdXNoQWxsKGNyZWF0ZUVxdWFsUm93cyh0b2tlblsxXSxpPT09MCxpPT09ZGlmZi5sZW5ndGgtMSkpO29yaWdpbmFsTGluZXMucHVzaEFsbCh0b2tlblsxXSk7Y3VycmVudExpbmVzLnB1c2hBbGwodG9rZW5bMV0pO2JyZWFrO2Nhc2UgRGlmZi5EaWZmLk9wZXJhdGlvbi5JbnNlcnQ6Zm9yKGNvbnN0IGxpbmUgb2YgdG9rZW5bMV0pCnRoaXMuX2RpZmZSb3dzLnB1c2goY3JlYXRlUm93KGxpbmUsQ2hhbmdlcy5DaGFuZ2VzVmlldy5Sb3dUeXBlLkFkZGl0aW9uKSk7aW5zZXJ0aW9ucys9dG9rZW5bMV0ubGVuZ3RoO2N1cnJlbnRMaW5lcy5wdXNoQWxsKHRva2VuWzFdKTticmVhaztjYXNlIERpZmYuRGlmZi5PcGVyYXRpb24uRGVsZXRlOmRlbGV0aW9ucys9dG9rZW5bMV0ubGVuZ3RoO29yaWdpbmFsTGluZXMucHVzaEFsbCh0b2tlblsxXSk7aWYoZGlmZltpKzFdJiZkaWZmW2krMV1bMF09PT1EaWZmLkRpZmYuT3BlcmF0aW9uLkluc2VydCl7aSsrO3RoaXMuX2RpZmZSb3dzLnB1c2hBbGwoY3JlYXRlTW9kaWZ5Um93cyh0b2tlblsxXS5qb2luKCdcbicpLGRpZmZbaV1bMV0uam9pbignXG4nKSkpO2luc2VydGlvbnMrPWRpZmZbaV1bMV0ubGVuZ3RoO2N1cnJlbnRMaW5lcy5wdXNoQWxsKGRpZmZbaV1bMV0pO31lbHNle2Zvcihjb25zdCBsaW5lIG9mIHRva2VuWzFdKQp0aGlzLl9kaWZmUm93cy5wdXNoKGNyZWF0ZVJvdyhsaW5lLENoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbikpO30KYnJlYWs7fX0KdGhpcy5fbWF4TGluZURpZ2l0cz1NYXRoLmNlaWwoTWF0aC5sb2cxMChNYXRoLm1heChjdXJyZW50TGluZU51bWJlcixiYXNlbGluZUxpbmVOdW1iZXIpKSk7dGhpcy5fZGlmZlN0YXRzLnNldFRleHQoQ29tbW9uLlVJU3RyaW5nKCclZCBpbnNlcnRpb24lcyAoKyksICVkIGRlbGV0aW9uJXMgKC0pJyxpbnNlcnRpb25zLGluc2VydGlvbnMhPT0xPydzJzonJyxkZWxldGlvbnMsZGVsZXRpb25zIT09MT8ncyc6JycpKTt0aGlzLl90b29sYmFyLnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fZW1wdHlXaWRnZXQuaGlkZVdpZGdldCgpO3RoaXMuX2VkaXRvci5vcGVyYXRpb24oKCk9Pnt0aGlzLl9lZGl0b3Iuc2hvd1dpZGdldCgpO3RoaXMuX2VkaXRvci5zZXRIaWdobGlnaHRNb2RlKHtuYW1lOidkZXZ0b29scy1kaWZmJyxkaWZmUm93czp0aGlzLl9kaWZmUm93cyxtaW1lVHlwZToodGhpcy5fc2VsZWN0ZWRVSVNvdXJjZUNvZGUpLm1pbWVUeXBlKCksYmFzZWxpbmVMaW5lczpvcmlnaW5hbExpbmVzLGN1cnJlbnRMaW5lczpjdXJyZW50TGluZXN9KTt0aGlzLl9lZGl0b3Iuc2V0VGV4dCh0aGlzLl9kaWZmUm93cy5tYXAocm93PT5yb3cudG9rZW5zLm1hcCh0PT50LnRleHQpLmpvaW4oJycpKS5qb2luKCdcbicpKTt0aGlzLl9lZGl0b3Iuc2V0TGluZU51bWJlckZvcm1hdHRlcih0aGlzLl9saW5lRm9ybWF0dGVyLmJpbmQodGhpcykpO30pO2Z1bmN0aW9uIGNyZWF0ZUVxdWFsUm93cyhsaW5lcyxhdFN0YXJ0LGF0RW5kKXtjb25zdCBlcXVhbFJvd3M9W107aWYoIWF0U3RhcnQpe2ZvcihsZXQgaT0wO2k8cGFkZGluZ0xpbmVzJiZpPGxpbmVzLmxlbmd0aDtpKyspCmVxdWFsUm93cy5wdXNoKGNyZWF0ZVJvdyhsaW5lc1tpXSxDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRXF1YWwpKTtpZihsaW5lcy5sZW5ndGg+cGFkZGluZ0xpbmVzKjIrMSYmIWF0RW5kKXtlcXVhbFJvd3MucHVzaChjcmVhdGVSb3coQ29tbW9uLlVJU3RyaW5nKCcoIFx1MjAyNiBTa2lwcGluZyAnKSsobGluZXMubGVuZ3RoLXBhZGRpbmdMaW5lcyoyKSsKQ29tbW9uLlVJU3RyaW5nKCcgbWF0Y2hpbmcgbGluZXMgXHUyMDI2ICknKSxDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuU3BhY2VyKSk7fX0KaWYoIWF0RW5kKXtjb25zdCBzdGFydD1NYXRoLm1heChsaW5lcy5sZW5ndGgtcGFkZGluZ0xpbmVzLTEsYXRTdGFydD8wOnBhZGRpbmdMaW5lcyk7bGV0IHNraXA9bGluZXMubGVuZ3RoLXBhZGRpbmdMaW5lcy0xO2lmKCFhdFN0YXJ0KQpza2lwLT1wYWRkaW5nTGluZXM7aWYoc2tpcD4wKXtiYXNlbGluZUxpbmVOdW1iZXIrPXNraXA7Y3VycmVudExpbmVOdW1iZXIrPXNraXA7fQpmb3IobGV0IGk9c3RhcnQ7aTxsaW5lcy5sZW5ndGg7aSsrKQplcXVhbFJvd3MucHVzaChjcmVhdGVSb3cobGluZXNbaV0sQ2hhbmdlcy5DaGFuZ2VzVmlldy5Sb3dUeXBlLkVxdWFsKSk7fQpyZXR1cm4gZXF1YWxSb3dzO30KZnVuY3Rpb24gY3JlYXRlTW9kaWZ5Um93cyhiZWZvcmUsYWZ0ZXIpe2NvbnN0IGludGVybmFsRGlmZj1EaWZmLkRpZmYuY2hhckRpZmYoYmVmb3JlLGFmdGVyLHRydWUpO2NvbnN0IGRlbGV0aW9uUm93cz1bY3JlYXRlUm93KCcnLENoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbildO2NvbnN0IGluc2VydGlvblJvd3M9W2NyZWF0ZVJvdygnJyxDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuQWRkaXRpb24pXTtmb3IoY29uc3QgdG9rZW4gb2YgaW50ZXJuYWxEaWZmKXtjb25zdCB0ZXh0PXRva2VuWzFdO2NvbnN0IHR5cGU9dG9rZW5bMF07Y29uc3QgY2xhc3NOYW1lPXR5cGU9PT1EaWZmLkRpZmYuT3BlcmF0aW9uLkVxdWFsPycnOidpbm5lci1kaWZmJztjb25zdCBsaW5lcz10ZXh0LnNwbGl0KCdcbicpO2ZvcihsZXQgaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoaT4wJiZ0eXBlIT09RGlmZi5EaWZmLk9wZXJhdGlvbi5JbnNlcnQpCmRlbGV0aW9uUm93cy5wdXNoKGNyZWF0ZVJvdygnJyxDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRGVsZXRpb24pKTtpZihpPjAmJnR5cGUhPT1EaWZmLkRpZmYuT3BlcmF0aW9uLkRlbGV0ZSkKaW5zZXJ0aW9uUm93cy5wdXNoKGNyZWF0ZVJvdygnJyxDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuQWRkaXRpb24pKTtpZighbGluZXNbaV0pCmNvbnRpbnVlO2lmKHR5cGUhPT1EaWZmLkRpZmYuT3BlcmF0aW9uLkluc2VydCkKZGVsZXRpb25Sb3dzW2RlbGV0aW9uUm93cy5sZW5ndGgtMV0udG9rZW5zLnB1c2goe3RleHQ6bGluZXNbaV0sY2xhc3NOYW1lfSk7aWYodHlwZSE9PURpZmYuRGlmZi5PcGVyYXRpb24uRGVsZXRlKQppbnNlcnRpb25Sb3dzW2luc2VydGlvblJvd3MubGVuZ3RoLTFdLnRva2Vucy5wdXNoKHt0ZXh0OmxpbmVzW2ldLGNsYXNzTmFtZX0pO319CnJldHVybiBkZWxldGlvblJvd3MuY29uY2F0KGluc2VydGlvblJvd3MpO30KZnVuY3Rpb24gY3JlYXRlUm93KHRleHQsdHlwZSl7aWYodHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5BZGRpdGlvbikKY3VycmVudExpbmVOdW1iZXIrKztpZih0eXBlPT09Q2hhbmdlcy5DaGFuZ2VzVmlldy5Sb3dUeXBlLkRlbGV0aW9uKQpiYXNlbGluZUxpbmVOdW1iZXIrKztpZih0eXBlPT09Q2hhbmdlcy5DaGFuZ2VzVmlldy5Sb3dUeXBlLkVxdWFsKXtiYXNlbGluZUxpbmVOdW1iZXIrKztjdXJyZW50TGluZU51bWJlcisrO30KcmV0dXJue2Jhc2VsaW5lTGluZU51bWJlcixjdXJyZW50TGluZU51bWJlcix0b2tlbnM6dGV4dD9be3RleHQsY2xhc3NOYW1lOidpbm5lci1kaWZmJ31dOltdLHR5cGV9O319Cl9saW5lRm9ybWF0dGVyKGxpbmVOdW1iZXIpe2NvbnN0IHJvdz10aGlzLl9kaWZmUm93c1tsaW5lTnVtYmVyLTFdO2xldCBzaG93QmFzZU51bWJlcj1yb3cudHlwZT09PUNoYW5nZXMuQ2hhbmdlc1ZpZXcuUm93VHlwZS5EZWxldGlvbjtsZXQgc2hvd0N1cnJlbnROdW1iZXI9cm93LnR5cGU9PT1DaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuQWRkaXRpb247aWYocm93LnR5cGU9PT1DaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGUuRXF1YWwpe3Nob3dCYXNlTnVtYmVyPXRydWU7c2hvd0N1cnJlbnROdW1iZXI9dHJ1ZTt9CmNvbnN0IGJhc2U9c2hvd0Jhc2VOdW1iZXI/bnVtYmVyVG9TdHJpbmdXaXRoU3BhY2VzUGFkZGluZyhyb3cuYmFzZWxpbmVMaW5lTnVtYmVyLHRoaXMuX21heExpbmVEaWdpdHMpOnNwYWNlc1BhZGRpbmcodGhpcy5fbWF4TGluZURpZ2l0cyk7Y29uc3QgY3VycmVudD1zaG93Q3VycmVudE51bWJlcj9udW1iZXJUb1N0cmluZ1dpdGhTcGFjZXNQYWRkaW5nKHJvdy5jdXJyZW50TGluZU51bWJlcix0aGlzLl9tYXhMaW5lRGlnaXRzKTpzcGFjZXNQYWRkaW5nKHRoaXMuX21heExpbmVEaWdpdHMpO3JldHVybiBiYXNlK3NwYWNlc1BhZGRpbmcoMSkrY3VycmVudDt9fTtDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvdztDaGFuZ2VzLkNoYW5nZXNWaWV3LlJvd1R5cGU9e0RlbGV0aW9uOidkZWxldGlvbicsQWRkaXRpb246J2FkZGl0aW9uJyxFcXVhbDonZXF1YWwnLFNwYWNlcjonc3BhY2VyJ307Q2hhbmdlcy5DaGFuZ2VzVmlldy5EaWZmVUlMb2NhdGlvblJldmVhbGVyPWNsYXNze2FzeW5jIHJldmVhbChkaWZmVUlMb2NhdGlvbixvbWl0Rm9jdXMpe2lmKCEoZGlmZlVJTG9jYXRpb24gaW5zdGFuY2VvZiBXb3Jrc3BhY2VEaWZmLkRpZmZVSUxvY2F0aW9uKSkKdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvcjogbm90IGEgZGlmZiB1aSBsb2NhdGlvbicpO2NvbnN0IGNoYW5nZXNWaWV3PXNlbGYucnVudGltZS5zaGFyZWRJbnN0YW5jZShDaGFuZ2VzLkNoYW5nZXNWaWV3KTthd2FpdCBVSS52aWV3TWFuYWdlci5zaG93VmlldygnY2hhbmdlcy5jaGFuZ2VzJyk7Y2hhbmdlc1ZpZXcuX2NoYW5nZXNTaWRlYmFyLnNlbGVjdFVJU291cmNlQ29kZShkaWZmVUlMb2NhdGlvbi51aVNvdXJjZUNvZGUsb21pdEZvY3VzKTt9fTs7Q2hhbmdlcy5DaGFuZ2VzU2lkZWJhcj1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VEaWZmKXtzdXBlcigpO3RoaXMuX3RyZWVvdXRsaW5lPW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7dGhpcy5fdHJlZW91dGxpbmUucmVnaXN0ZXJSZXF1aXJlZENTUygnY2hhbmdlcy9jaGFuZ2VzU2lkZWJhci5jc3MnKTt0aGlzLl90cmVlb3V0bGluZS5zZXRDb21wYXJhdG9yKChhLGIpPT5hLnRpdGxlQXNUZXh0KCkuY29tcGFyZVRvKGIudGl0bGVBc1RleHQoKSkpO3RoaXMuX3RyZWVvdXRsaW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRTZWxlY3RlZCx0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLHRoaXMpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90cmVlb3V0bGluZS5lbGVtZW50KTt0aGlzLl90cmVlRWxlbWVudHM9bmV3IE1hcCgpO3RoaXMuX3dvcmtzcGFjZURpZmY9d29ya3NwYWNlRGlmZjt0aGlzLl93b3Jrc3BhY2VEaWZmLm1vZGlmaWVkVUlTb3VyY2VDb2RlcygpLmZvckVhY2godGhpcy5fYWRkVUlTb3VyY2VDb2RlLmJpbmQodGhpcykpO3RoaXMuX3dvcmtzcGFjZURpZmYuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2VEaWZmLkV2ZW50cy5Nb2RpZmllZFN0YXR1c0NoYW5nZWQsdGhpcy5fdWlTb3VyY2VDb2RlTW9maWVkU3RhdHVzQ2hhbmdlZCx0aGlzKTt9CnNlbGVjdFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUsb21pdEZvY3VzKXtjb25zdCB0cmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudHMuZ2V0KHVpU291cmNlQ29kZSk7aWYoIXRyZWVFbGVtZW50KQpyZXR1cm47dHJlZUVsZW1lbnQuc2VsZWN0KG9taXRGb2N1cyk7fQpzZWxlY3RlZFVJU291cmNlQ29kZSgpe3JldHVybiB0aGlzLl90cmVlb3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50P3RoaXMuX3RyZWVvdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQudWlTb3VyY2VDb2RlOm51bGw7fQpfc2VsZWN0aW9uQ2hhbmdlZCgpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKENoYW5nZXMuQ2hhbmdlc1NpZGViYXIuRXZlbnRzLlNlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZCk7fQpfdWlTb3VyY2VDb2RlTW9maWVkU3RhdHVzQ2hhbmdlZChldmVudCl7aWYoZXZlbnQuZGF0YS5pc01vZGlmaWVkKQp0aGlzLl9hZGRVSVNvdXJjZUNvZGUoZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO2Vsc2UKdGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2RlKGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKTt9Cl9yZW1vdmVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtjb25zdCB0cmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudHMuZ2V0KHVpU291cmNlQ29kZSk7dGhpcy5fdHJlZUVsZW1lbnRzLmRlbGV0ZSh1aVNvdXJjZUNvZGUpO2lmKHRoaXMuX3RyZWVvdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQ9PT10cmVlRWxlbWVudCl7Y29uc3QgbmV4dEVsZW1lbnRUb1NlbGVjdD10cmVlRWxlbWVudC5wcmV2aW91c1NpYmxpbmd8fHRyZWVFbGVtZW50Lm5leHRTaWJsaW5nO2lmKG5leHRFbGVtZW50VG9TZWxlY3Qpe25leHRFbGVtZW50VG9TZWxlY3Quc2VsZWN0KHRydWUpO31lbHNle3RyZWVFbGVtZW50LmRlc2VsZWN0KCk7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlZCgpO319CnRoaXMuX3RyZWVvdXRsaW5lLnJlbW92ZUNoaWxkKHRyZWVFbGVtZW50KTt0cmVlRWxlbWVudC5kaXNwb3NlKCk7fQpfYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgdHJlZUVsZW1lbnQ9bmV3IENoYW5nZXMuQ2hhbmdlc1NpZGViYXIuVUlTb3VyY2VDb2RlVHJlZUVsZW1lbnQodWlTb3VyY2VDb2RlKTt0aGlzLl90cmVlRWxlbWVudHMuc2V0KHVpU291cmNlQ29kZSx0cmVlRWxlbWVudCk7dGhpcy5fdHJlZW91dGxpbmUuYXBwZW5kQ2hpbGQodHJlZUVsZW1lbnQpO2lmKCF0aGlzLl90cmVlb3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50KQp0cmVlRWxlbWVudC5zZWxlY3QodHJ1ZSk7fX07Q2hhbmdlcy5DaGFuZ2VzU2lkZWJhci5FdmVudHM9e1NlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZDpTeW1ib2woJ1NlbGVjdGVkVUlTb3VyY2VDb2RlQ2hhbmdlZCcpfTtDaGFuZ2VzLkNoYW5nZXNTaWRlYmFyLlVJU291cmNlQ29kZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3IodWlTb3VyY2VDb2RlKXtzdXBlcigpO3RoaXMudWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0b3ItJyt1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5uYW1lKCkrJy10cmVlLWl0ZW0nKTtsZXQgaWNvblR5cGU9J2xhcmdlaWNvbi1uYXZpZ2F0b3ItZmlsZSc7aWYodGhpcy51aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLlNuaXBwZXQpCmljb25UeXBlPSdsYXJnZWljb24tbmF2aWdhdG9yLXNuaXBwZXQnO2NvbnN0IGRlZmF1bHRJY29uPVVJLkljb24uY3JlYXRlKGljb25UeXBlLCdpY29uJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2RlZmF1bHRJY29uXSk7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLlRpdGxlQ2hhbmdlZCx0aGlzLl91cGRhdGVUaXRsZSx0aGlzKSx1aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdGhpcy5fdXBkYXRlVGl0bGUsdGhpcyksdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcy5fdXBkYXRlVGl0bGUsdGhpcyldO3RoaXMuX3VwZGF0ZVRpdGxlKCk7fQpfdXBkYXRlVGl0bGUoKXtsZXQgdGl0bGVUZXh0PXRoaXMudWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKCk7aWYodGhpcy51aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKQp0aXRsZVRleHQ9JyonK3RpdGxlVGV4dDt0aGlzLnRpdGxlPXRpdGxlVGV4dDtsZXQgdG9vbHRpcD10aGlzLnVpU291cmNlQ29kZS51cmwoKTtpZih0aGlzLnVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzRnJvbVNvdXJjZU1hcCgpKQp0b29sdGlwPUNvbW1vbi5VSVN0cmluZygnJXMgKGZyb20gc291cmNlIG1hcCknLHRoaXMudWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKCkpO3RoaXMudG9vbHRpcD10b29sdGlwO30KZGlzcG9zZSgpe0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7fX07O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjaGFuZ2VzL2NoYW5nZXNWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuLmluc2VydGlvbi1wb2ludC1tYWlue1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmluc2VydGlvbi1wb2ludC1zaWRlYmFyIHtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cbi5lZGl0b3ItY29udGFpbmVye1xuICAgIGZsZXg6IDE7XG59XG5cbjpmb2N1cy5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICBjb2xvcjogI0ZGRjtcbn1cblxuLkNvZGVNaXJyb3ItbGluZXM6bm90KDphY3RpdmUpIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbn1cblxuLkNvZGVNaXJyb3ItbGluZTpob3ZlciB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMjU1LDAuMDUpO1xufVxuXG4uQ29kZU1pcnJvciAuQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZC5zcGFjZXIge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMjU1LCAwLjEpO1xufVxuXG4uQ29kZU1pcnJvciAuZXF1YWwgPiBzcGFuID4gc3BhbiB7XG4gICAgb3BhY2l0eTogLjU7XG59XG5cbi5Db2RlTWlycm9yIC5Db2RlTWlycm9yLXNlbGVjdGVkdGV4dDpub3QoLkNvZGVNaXJyb3ItcGVyc2lzdC1oaWdobGlnaHQpIHtcbiAgICBvcGFjaXR5OiAxLjA7XG59XG5cbi5Db2RlTWlycm9yIC5Db2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kLmFkZGl0aW9uLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMTQ0LCA1NSUsIDQ5JSwgLjIpO1xufVxuXG4uQ29kZU1pcnJvciAuQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZC5kZWxldGlvbiwgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwgLjIpO1xufVxuXG4uQ29kZU1pcnJvciAuYWRkaXRpb24gLmNtLWlubmVyLWRpZmY6bm90KC5Db2RlTWlycm9yLXNlbGVjdGVkdGV4dCksIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgxNDQsIDU1JSwgNDklLCAuMyk7XG59XG5cbi5Db2RlTWlycm9yIC5kZWxldGlvbiAuY20taW5uZXItZGlmZjpub3QoLkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0KSwgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwgLjMpO1xufVxuXG4uY2hhbmdlcy10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG59XG5cbi8qIyBzb3VyY2VVUkw9Y2hhbmdlcy9jaGFuZ2VzVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjaGFuZ2VzL2NoYW5nZXNTaWRlYmFyLmNzcyJdPSJsaSAuaWNvbiB7XG4gIG1hcmdpbjogLTNweCAtNXB4IC0zcHggLTVweDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCBoc2woMCwgMCUsIDUwJSksIGhzbCgwLCAwJSwgNzAlKSk7XG59XG5cbi50cmVlLW91dGxpbmUgbGkge1xuICBtaW4taGVpZ2h0OiAyMHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOmhvdmVyOm5vdCguc2VsZWN0ZWQpIC5zZWxlY3Rpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NiwgMTIxLCAyMTcsIDAuMSk7XG59XG5cbi5uYXZpZ2F0b3ItZnMtdHJlZS1pdGVtIC5pY29ue1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCgyOCwgNzUlLCA1MCUpLCBoc2woMjgsIDc1JSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3Itc20tc2NyaXB0LXRyZWUtaXRlbSAuaWNvbixcbi5uYXZpZ2F0b3Itc2NyaXB0LXRyZWUtaXRlbSAuaWNvbixcbi5uYXZpZ2F0b3Itc25pcHBldC10cmVlLWl0ZW0gLmljb24ge1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCg0OCwgNzAlLCA1MCUpLCBoc2woNDgsIDcwJSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3Itc20tc3R5bGVzaGVldC10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLXN0eWxlc2hlZXQtdHJlZS1pdGVtIC5pY29uIHtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCBoc2woMjU2LCA1MCUsIDUwJSksIGhzbCgyNTYsIDUwJSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3ItaW1hZ2UtdHJlZS1pdGVtIC5pY29uLFxuLm5hdmlnYXRvci1mb250LXRyZWUtaXRlbSAuaWNvbiB7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDEwOSwgMzMlLCA1MCUpLCBoc2woMTA5LCAzMyUsIDcwJSkpO1xufVxuLyojIHNvdXJjZVVSTD1jaGFuZ2VzL2NoYW5nZXNTaWRlYmFyLmNzcyAqLyI7UHJvdG9jb2xNb25pdG9yLlByb3RvY29sTW9uaXRvcj1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLl9ub2Rlcz1bXTt0aGlzLl9yZWNvcmRpbmdMaXN0ZW5lcnM9bnVsbDt0aGlzLl9zdGFydGVkPWZhbHNlO3RoaXMuX3N0YXJ0VGltZT0wO3RoaXMuX25vZGVGb3JJZD17fTt0aGlzLl9maWx0ZXI9bm9kZT0+dHJ1ZTt0aGlzLl9jb2x1bW5zPVt7aWQ6J21ldGhvZCcsdGl0bGU6bHNgTWV0aG9kYCx2aXNpYmxlOnRydWUsc29ydGFibGU6dHJ1ZSx3ZWlnaHQ6NjB9LHtpZDonZGlyZWN0aW9uJyx0aXRsZTpsc2BEaXJlY3Rpb25gLHZpc2libGU6ZmFsc2Usc29ydGFibGU6dHJ1ZSxoaWRlYWJsZTp0cnVlLHdlaWdodDozMH0se2lkOidyZXF1ZXN0Jyx0aXRsZTpsc2BSZXF1ZXN0YCx2aXNpYmxlOnRydWUsaGlkZWFibGU6dHJ1ZSx3ZWlnaHQ6NjB9LHtpZDoncmVzcG9uc2UnLHRpdGxlOmxzYFJlc3BvbnNlYCx2aXNpYmxlOnRydWUsaGlkZWFibGU6dHJ1ZSx3ZWlnaHQ6NjB9LHtpZDondGltZXN0YW1wJyx0aXRsZTpsc2BUaW1lc3RhbXBgLHZpc2libGU6ZmFsc2Usc29ydGFibGU6dHJ1ZSxoaWRlYWJsZTp0cnVlLHdlaWdodDozMH1dO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncHJvdG9jb2xfbW9uaXRvci9wcm90b2NvbE1vbml0b3IuY3NzJyk7Y29uc3QgdG9wVG9vbGJhcj1uZXcgVUkuVG9vbGJhcigncHJvdG9jb2wtbW9uaXRvci10b29sYmFyJyx0aGlzLmNvbnRlbnRFbGVtZW50KTtjb25zdCByZWNvcmRCdXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUobHNgUmVjb3JkYCwnbGFyZ2VpY29uLXN0YXJ0LXJlY29yZGluZycsJ2xhcmdlaWNvbi1zdG9wLXJlY29yZGluZycpO3JlY29yZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT57cmVjb3JkQnV0dG9uLnNldFRvZ2dsZWQoIXJlY29yZEJ1dHRvbi50b2dnbGVkKCkpO3RoaXMuX3NldFJlY29yZGluZyhyZWNvcmRCdXR0b24udG9nZ2xlZCgpKTt9KTtyZWNvcmRCdXR0b24uc2V0VG9nZ2xlV2l0aFJlZENvbG9yKHRydWUpO3RvcFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0ocmVjb3JkQnV0dG9uKTtyZWNvcmRCdXR0b24uc2V0VG9nZ2xlZCh0cnVlKTtjb25zdCBjbGVhckJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihsc2BDbGVhciBhbGxgLCdsYXJnZWljb24tY2xlYXInKTtjbGVhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT57dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKS5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX25vZGVzPVtdO3RoaXMuX25vZGVGb3JJZD17fTt9KTt0b3BUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGNsZWFyQnV0dG9uKTtjb25zdCBzcGxpdD1uZXcgVUkuU3BsaXRXaWRnZXQodHJ1ZSx0cnVlLCdwcm90b2NvbC1tb25pdG9yLXBhbmVsLXNwbGl0JywyNTApO3NwbGl0LnNob3codGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5fZGF0YUdyaWQ9bmV3IERhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQodGhpcy5fY29sdW1ucyk7dGhpcy5fZGF0YUdyaWQuZWxlbWVudC5zdHlsZS5mbGV4PScxJzt0aGlzLl9pbmZvV2lkZ2V0PW5ldyBQcm90b2NvbE1vbml0b3IuUHJvdG9jb2xNb25pdG9yLkluZm9XaWRnZXQoKTtzcGxpdC5zZXRNYWluV2lkZ2V0KHRoaXMuX2RhdGFHcmlkLmFzV2lkZ2V0KCkpO3NwbGl0LnNldFNpZGViYXJXaWRnZXQodGhpcy5faW5mb1dpZGdldCk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU2VsZWN0ZWROb2RlLGV2ZW50PT50aGlzLl9pbmZvV2lkZ2V0LnJlbmRlcihldmVudC5kYXRhLmRhdGEpKTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5EZXNlbGVjdGVkTm9kZSxldmVudD0+dGhpcy5faW5mb1dpZGdldC5yZW5kZXIobnVsbCkpO3RoaXMuX2RhdGFHcmlkLnNldEhlYWRlckNvbnRleHRNZW51Q2FsbGJhY2sodGhpcy5faW5uZXJIZWFkZXJDb250ZXh0TWVudS5iaW5kKHRoaXMpKTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5Tb3J0aW5nQ2hhbmdlZCx0aGlzLl9zb3J0RGF0YUdyaWQuYmluZCh0aGlzKSk7dGhpcy5fZGF0YUdyaWQuc2V0U3RpY2tUb0JvdHRvbSh0cnVlKTt0aGlzLl9kYXRhR3JpZC5zb3J0Tm9kZXMoRGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZC5OdW1lcmljQ29tcGFyYXRvci5iaW5kKG51bGwsJ3RpbWVzdGFtcCcpLGZhbHNlKTt0aGlzLl91cGRhdGVDb2x1bW5WaXNpYmlsaXR5KCk7Y29uc3Qga2V5cz1bJ21ldGhvZCcsJ3JlcXVlc3QnLCdyZXNwb25zZScsJ2RpcmVjdGlvbiddO3RoaXMuX2ZpbHRlclBhcnNlcj1uZXcgVGV4dFV0aWxzLkZpbHRlclBhcnNlcihrZXlzKTt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlcj1uZXcgVUkuRmlsdGVyU3VnZ2VzdGlvbkJ1aWxkZXIoa2V5cyk7dGhpcy5fdGV4dEZpbHRlclVJPW5ldyBVSS5Ub29sYmFySW5wdXQobHNgRmlsdGVyYCwxLC4yLCcnLHRoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmNvbXBsZXRpb25zLmJpbmQodGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIpKTt0aGlzLl90ZXh0RmlsdGVyVUkuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsZXZlbnQ9Pntjb25zdCBxdWVyeT0oZXZlbnQuZGF0YSk7Y29uc3QgZmlsdGVycz10aGlzLl9maWx0ZXJQYXJzZXIucGFyc2UocXVlcnkpO3RoaXMuX2ZpbHRlcj1ub2RlPT57Zm9yKGNvbnN0e2tleSx0ZXh0LG5lZ2F0aXZlfW9mIGZpbHRlcnMpe2lmKCEoa2V5IGluIG5vZGUuZGF0YSl8fCF0ZXh0KQpjb250aW51ZTtjb25zdCBmb3VuZD1KU09OLnN0cmluZ2lmeShub2RlLmRhdGFba2V5XSkuaW5kZXhPZih0ZXh0KSE9PS0xO2lmKGZvdW5kPT09bmVnYXRpdmUpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO307dGhpcy5fZmlsdGVyTm9kZXMoKTt9KTt0b3BUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3RleHRGaWx0ZXJVSSk7fQpfZmlsdGVyTm9kZXMoKXtmb3IoY29uc3Qgbm9kZSBvZiB0aGlzLl9ub2Rlcyl7aWYodGhpcy5fZmlsdGVyKG5vZGUpKXtpZighbm9kZS5wYXJlbnQpCnRoaXMuX2RhdGFHcmlkLmluc2VydENoaWxkKG5vZGUpO31lbHNle25vZGUucmVtb3ZlKCk7fX19Cl9pbm5lckhlYWRlckNvbnRleHRNZW51KGNvbnRleHRNZW51KXtjb25zdCBjb2x1bW5Db25maWdzPXRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbHVtbkNvbmZpZz0+Y29sdW1uQ29uZmlnLmhpZGVhYmxlKTtmb3IoY29uc3QgY29sdW1uQ29uZmlnIG9mIGNvbHVtbkNvbmZpZ3Mpe2NvbnRleHRNZW51LmhlYWRlclNlY3Rpb24oKS5hcHBlbmRDaGVja2JveEl0ZW0oY29sdW1uQ29uZmlnLnRpdGxlLHRoaXMuX3RvZ2dsZUNvbHVtblZpc2liaWxpdHkuYmluZCh0aGlzLGNvbHVtbkNvbmZpZyksY29sdW1uQ29uZmlnLnZpc2libGUpO30KY29udGV4dE1lbnUuc2hvdygpO30KX3RvZ2dsZUNvbHVtblZpc2liaWxpdHkoY29sdW1uQ29uZmlnKXtjb2x1bW5Db25maWcudmlzaWJsZT0hY29sdW1uQ29uZmlnLnZpc2libGU7dGhpcy5fdXBkYXRlQ29sdW1uVmlzaWJpbGl0eSgpO30KX3VwZGF0ZUNvbHVtblZpc2liaWxpdHkoKXtjb25zdCB2aXNpYmxlQ29sdW1ucz0oe30pO2Zvcihjb25zdCBjb2x1bW5Db25maWcgb2YgdGhpcy5fY29sdW1ucykKdmlzaWJsZUNvbHVtbnNbY29sdW1uQ29uZmlnLmlkXT1jb2x1bW5Db25maWcudmlzaWJsZTt0aGlzLl9kYXRhR3JpZC5zZXRDb2x1bW5zVmlzaWJsaXR5KHZpc2libGVDb2x1bW5zKTt9Cl9zb3J0RGF0YUdyaWQoKXtjb25zdCBzb3J0Q29sdW1uSWQ9dGhpcy5fZGF0YUdyaWQuc29ydENvbHVtbklkKCk7aWYoIXNvcnRDb2x1bW5JZCkKcmV0dXJuO2xldCBjb2x1bW5Jc051bWVyaWM9dHJ1ZTtzd2l0Y2goc29ydENvbHVtbklkKXtjYXNlJ21ldGhvZCc6Y2FzZSdkaXJlY3Rpb24nOmNvbHVtbklzTnVtZXJpYz1mYWxzZTticmVhazt9CmNvbnN0IGNvbXBhcmF0b3I9Y29sdW1uSXNOdW1lcmljP0RhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQuTnVtZXJpY0NvbXBhcmF0b3I6RGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZC5TdHJpbmdDb21wYXJhdG9yO3RoaXMuX2RhdGFHcmlkLnNvcnROb2Rlcyhjb21wYXJhdG9yLmJpbmQobnVsbCxzb3J0Q29sdW1uSWQpLCF0aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpKTt9Cndhc1Nob3duKCl7aWYodGhpcy5fc3RhcnRlZCkKcmV0dXJuO3RoaXMuX3N0YXJ0ZWQ9dHJ1ZTt0aGlzLl9zdGFydFRpbWU9RGF0ZS5ub3coKTt0aGlzLl9zZXRSZWNvcmRpbmcodHJ1ZSk7fQpfc2V0UmVjb3JkaW5nKHJlY29yZGluZyl7aWYodGhpcy5fcmVjb3JkaW5nTGlzdGVuZXJzKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fcmVjb3JkaW5nTGlzdGVuZXJzKTt0aGlzLl9yZWNvcmRpbmdMaXN0ZW5lcnM9bnVsbDt9CmlmKHJlY29yZGluZyl7dGhpcy5fcmVjb3JkaW5nTGlzdGVuZXJzPVtTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihQcm90b2NvbC5UYXJnZXRCYXNlLkV2ZW50cy5NZXNzYWdlUmVjZWl2ZWQsdGhpcy5fbWVzc2FnZVJlY2lldmVkLHRoaXMpLFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFByb3RvY29sLlRhcmdldEJhc2UuRXZlbnRzLk1lc3NhZ2VTZW50LHRoaXMuX21lc3NhZ2VTZW50LHRoaXMpXTt9fQpfbWVzc2FnZVJlY2lldmVkKGV2ZW50KXtjb25zdCBtZXNzYWdlPWV2ZW50LmRhdGEubWVzc2FnZTtpZignaWQnaW4gbWVzc2FnZSl7Y29uc3Qgbm9kZT10aGlzLl9ub2RlRm9ySWRbbWVzc2FnZS5pZF07aWYoIW5vZGUpCnJldHVybjtub2RlLmRhdGEucmVzcG9uc2U9bWVzc2FnZS5yZXN1bHQ7bm9kZS5yZWZyZXNoKCk7aWYodGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlPT09bm9kZSkKdGhpcy5faW5mb1dpZGdldC5yZW5kZXIobm9kZS5kYXRhKTtyZXR1cm47fQpjb25zdCBub2RlPW5ldyBQcm90b2NvbE1vbml0b3IuUHJvdG9jb2xNb25pdG9yLlByb3RvY29sTm9kZSh7bWV0aG9kOm1lc3NhZ2UubWV0aG9kLGRpcmVjdGlvbjoncmVjaWV2ZWQnLHJlc3BvbnNlOm1lc3NhZ2UucGFyYW1zLHRpbWVzdGFtcDpEYXRlLm5vdygpLXRoaXMuX3N0YXJ0VGltZSxyZXF1ZXN0OicnfSk7dGhpcy5fbm9kZXMucHVzaChub2RlKTtpZih0aGlzLl9maWx0ZXIobm9kZSkpCnRoaXMuX2RhdGFHcmlkLmluc2VydENoaWxkKG5vZGUpO30KX21lc3NhZ2VTZW50KGV2ZW50KXtjb25zdCBtZXNzYWdlPWV2ZW50LmRhdGE7Y29uc3Qgbm9kZT1uZXcgUHJvdG9jb2xNb25pdG9yLlByb3RvY29sTW9uaXRvci5Qcm90b2NvbE5vZGUoe21ldGhvZDptZXNzYWdlLm1ldGhvZCxkaXJlY3Rpb246J3NlbnQnLHJlcXVlc3Q6bWVzc2FnZS5wYXJhbXMsdGltZXN0YW1wOkRhdGUubm93KCktdGhpcy5fc3RhcnRUaW1lLHJlc3BvbnNlOicocGVuZGluZyknLGlkOm1lc3NhZ2UuaWR9KTt0aGlzLl9ub2RlRm9ySWRbbWVzc2FnZS5pZF09bm9kZTt0aGlzLl9ub2Rlcy5wdXNoKG5vZGUpO2lmKHRoaXMuX2ZpbHRlcihub2RlKSkKdGhpcy5fZGF0YUdyaWQuaW5zZXJ0Q2hpbGQobm9kZSk7fX07UHJvdG9jb2xNb25pdG9yLlByb3RvY29sTW9uaXRvci5Qcm90b2NvbE5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZXtjb25zdHJ1Y3RvcihkYXRhKXtzdXBlcihkYXRhKTt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe3N3aXRjaChjb2x1bW5JZCl7Y2FzZSdyZXNwb25zZSc6aWYoIXRoaXMuZGF0YVtjb2x1bW5JZF0mJnRoaXMuZGF0YS5kaXJlY3Rpb249PT0nc2VuZCcpe2NvbnN0IGNlbGw9dGhpcy5jcmVhdGVURChjb2x1bW5JZCk7Y2VsbC50ZXh0Q29udGVudD0nKHBlbmRpbmcpJztyZXR1cm4gY2VsbDt9CmNhc2UncmVxdWVzdCc6e2NvbnN0IGNlbGw9dGhpcy5jcmVhdGVURChjb2x1bW5JZCk7Y29uc3Qgb2JqPVNESy5SZW1vdGVPYmplY3QuZnJvbUxvY2FsT2JqZWN0KHRoaXMuZGF0YVtjb2x1bW5JZF0pO2NlbGwudGV4dENvbnRlbnQ9b2JqLmRlc2NyaXB0aW9uLnRyaW1FbmQoNTApO2NlbGwuY2xhc3NMaXN0LmFkZCgnc291cmNlLWNvZGUnKTtyZXR1cm4gY2VsbDt9CmNhc2UndGltZXN0YW1wJzp7Y29uc3QgY2VsbD10aGlzLmNyZWF0ZVREKGNvbHVtbklkKTtjZWxsLnRleHRDb250ZW50PWxzYCR7dGhpcy5kYXRhW2NvbHVtbklkXX0gbXNgO3JldHVybiBjZWxsO319CnJldHVybiBzdXBlci5jcmVhdGVDZWxsKGNvbHVtbklkKTt9CmVsZW1lbnQoKXtjb25zdCBlbGVtZW50PXN1cGVyLmVsZW1lbnQoKTtlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Byb3RvY29sLW1lc3NhZ2Utc2VudCcsdGhpcy5kYXRhLmRpcmVjdGlvbj09PSdzZW50Jyk7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdwcm90b2NvbC1tZXNzYWdlLXJlY2lldmVkJyx0aGlzLmRhdGEuZGlyZWN0aW9uIT09J3NlbnQnKTtyZXR1cm4gZWxlbWVudDt9fTtQcm90b2NvbE1vbml0b3IuUHJvdG9jb2xNb25pdG9yLkluZm9XaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl90YWJiZWRQYW5lPW5ldyBVSS5UYWJiZWRQYW5lKCk7dGhpcy5fdGFiYmVkUGFuZS5hcHBlbmRUYWIoJ3JlcXVlc3QnLCdSZXF1ZXN0JyxuZXcgVUkuV2lkZ2V0KCkpO3RoaXMuX3RhYmJlZFBhbmUuYXBwZW5kVGFiKCdyZXNwb25zZScsJ1Jlc3BvbnNlJyxuZXcgVUkuV2lkZ2V0KCkpO3RoaXMuX3RhYmJlZFBhbmUuc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYigncmVzcG9uc2UnKTt0aGlzLnJlbmRlcihudWxsKTt9CnJlbmRlcihkYXRhKXtjb25zdCByZXF1ZXN0RW5hYmxlZD1kYXRhJiZkYXRhLmRpcmVjdGlvbj09PSdzZW50Jzt0aGlzLl90YWJiZWRQYW5lLnNldFRhYkVuYWJsZWQoJ3JlcXVlc3QnLCEhcmVxdWVzdEVuYWJsZWQpO2lmKCFkYXRhKXt0aGlzLl90YWJiZWRQYW5lLmNoYW5nZVRhYlZpZXcoJ3JlcXVlc3QnLG5ldyBVSS5FbXB0eVdpZGdldChsc2BObyBtZXNzYWdlIHNlbGVjdGVkYCkpO3RoaXMuX3RhYmJlZFBhbmUuY2hhbmdlVGFiVmlldygncmVzcG9uc2UnLG5ldyBVSS5FbXB0eVdpZGdldChsc2BObyBtZXNzYWdlIHNlbGVjdGVkYCkpO3JldHVybjt9CmlmKCFyZXF1ZXN0RW5hYmxlZCkKdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIoJ3Jlc3BvbnNlJyk7dGhpcy5fdGFiYmVkUGFuZS5jaGFuZ2VUYWJWaWV3KCdyZXF1ZXN0JyxTb3VyY2VGcmFtZS5KU09OVmlldy5jcmVhdGVWaWV3U3luYyhkYXRhLnJlcXVlc3QpKTt0aGlzLl90YWJiZWRQYW5lLmNoYW5nZVRhYlZpZXcoJ3Jlc3BvbnNlJyxTb3VyY2VGcmFtZS5KU09OVmlldy5jcmVhdGVWaWV3U3luYyhkYXRhLnJlc3BvbnNlKSk7fX07O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm90b2NvbF9tb25pdG9yL3Byb3RvY29sTW9uaXRvci5jc3MiXT0iLmRhdGEtZ3JpZCB7XG4gICAgYm9yZGVyOiBub25lO1xufVxuLmRhdGEtZ3JpZCB7XG4gICAgZmxleDogYXV0bztcbiAgICBib3JkZXI6IG5vbmU7XG59XG5cbi5kYXRhLWdyaWQgLmRhdGEge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG59XG5cbi5kYXRhLWdyaWQgdGQge1xuICAgIC8qIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjOyAqL1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjY2NjO1xufVxuXG4uZGF0YS1ncmlkIHRyLnNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVmO1xufVxuXG4uZGF0YS1ncmlkIHRoIHtcbiAgICBib3JkZXItbGVmdC1jb2xvcjogI2NjYztcbn1cblxuLnByb3RvY29sLW1lc3NhZ2Utc2VudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDI4MSwgNjQlLCA5NSUpO1xufVxuXG4ucHJvdG9jb2wtbW9uaXRvci10b29sYmFyIHtcbiAgICBib3JkZXItYm90dG9tOnZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLyojIHNvdXJjZVVSTD1wcm90b2NvbF9tb25pdG9yL3Byb3RvY29sTW9uaXRvci5jc3MgKi8iOyhmdW5jdGlvbihnbG9iYWwsZmFjdG9yeSl7dHlwZW9mIGV4cG9ydHM9PT0nb2JqZWN0JyYmdHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnP21vZHVsZS5leHBvcnRzPWZhY3RvcnkoKTp0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJyYmZGVmaW5lLmFtZD9kZWZpbmUoZmFjdG9yeSk6KGdsb2JhbC5Db2RlTWlycm9yPWZhY3RvcnkoKSk7fSh0aGlzLChmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgdXNlckFnZW50PW5hdmlnYXRvci51c2VyQWdlbnQ7dmFyIHBsYXRmb3JtPW5hdmlnYXRvci5wbGF0Zm9ybTt2YXIgZ2Vja289L2dlY2tvXC9cZC9pLnRlc3QodXNlckFnZW50KTt2YXIgaWVfdXB0bzEwPS9NU0lFIFxkLy50ZXN0KHVzZXJBZ2VudCk7dmFyIGllXzExdXA9L1RyaWRlbnRcLyg/Ols3LTldfFxkezIsfSlcLi4qcnY6KFxkKykvLmV4ZWModXNlckFnZW50KTt2YXIgZWRnZT0vRWRnZVwvKFxkKykvLmV4ZWModXNlckFnZW50KTt2YXIgaWU9aWVfdXB0bzEwfHxpZV8xMXVwfHxlZGdlO3ZhciBpZV92ZXJzaW9uPWllJiYoaWVfdXB0bzEwP2RvY3VtZW50LmRvY3VtZW50TW9kZXx8NjorKGVkZ2V8fGllXzExdXApWzFdKTt2YXIgd2Via2l0PSFlZGdlJiYvV2ViS2l0XC8vLnRlc3QodXNlckFnZW50KTt2YXIgcXR3ZWJraXQ9d2Via2l0JiYvUXRcL1xkK1wuXGQrLy50ZXN0KHVzZXJBZ2VudCk7dmFyIGNocm9tZT0hZWRnZSYmL0Nocm9tZVwvLy50ZXN0KHVzZXJBZ2VudCk7dmFyIHByZXN0bz0vT3BlcmFcLy8udGVzdCh1c2VyQWdlbnQpO3ZhciBzYWZhcmk9L0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpO3ZhciBtYWNfZ2VNb3VudGFpbkxpb249L01hYyBPUyBYIDFcZFxEKFs4LTldfFxkXGQpXEQvLnRlc3QodXNlckFnZW50KTt2YXIgcGhhbnRvbT0vUGhhbnRvbUpTLy50ZXN0KHVzZXJBZ2VudCk7dmFyIGlvcz0hZWRnZSYmL0FwcGxlV2ViS2l0Ly50ZXN0KHVzZXJBZ2VudCkmJi9Nb2JpbGVcL1x3Ky8udGVzdCh1c2VyQWdlbnQpO3ZhciBhbmRyb2lkPS9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCk7dmFyIG1vYmlsZT1pb3N8fGFuZHJvaWR8fC93ZWJPU3xCbGFja0JlcnJ5fE9wZXJhIE1pbml8T3BlcmEgTW9iaXxJRU1vYmlsZS9pLnRlc3QodXNlckFnZW50KTt2YXIgbWFjPWlvc3x8L01hYy8udGVzdChwbGF0Zm9ybSk7dmFyIGNocm9tZU9TPS9cYkNyT1NcYi8udGVzdCh1c2VyQWdlbnQpO3ZhciB3aW5kb3dzPS93aW4vaS50ZXN0KHBsYXRmb3JtKTt2YXIgcHJlc3RvX3ZlcnNpb249cHJlc3RvJiZ1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCpcLlxkKikvKTtpZihwcmVzdG9fdmVyc2lvbil7cHJlc3RvX3ZlcnNpb249TnVtYmVyKHByZXN0b192ZXJzaW9uWzFdKTt9CmlmKHByZXN0b192ZXJzaW9uJiZwcmVzdG9fdmVyc2lvbj49MTUpe3ByZXN0bz1mYWxzZTt3ZWJraXQ9dHJ1ZTt9CnZhciBmbGlwQ3RybENtZD1tYWMmJihxdHdlYmtpdHx8cHJlc3RvJiYocHJlc3RvX3ZlcnNpb249PW51bGx8fHByZXN0b192ZXJzaW9uPDEyLjExKSk7dmFyIGNhcHR1cmVSaWdodENsaWNrPWdlY2tvfHwoaWUmJmllX3ZlcnNpb24+PTkpO2Z1bmN0aW9uIGNsYXNzVGVzdChjbHMpe3JldHVybiBuZXcgUmVnRXhwKCIoXnxcXHMpIitjbHMrIig/OiR8XFxzKVxccyoiKX0KdmFyIHJtQ2xhc3M9ZnVuY3Rpb24obm9kZSxjbHMpe3ZhciBjdXJyZW50PW5vZGUuY2xhc3NOYW1lO3ZhciBtYXRjaD1jbGFzc1Rlc3QoY2xzKS5leGVjKGN1cnJlbnQpO2lmKG1hdGNoKXt2YXIgYWZ0ZXI9Y3VycmVudC5zbGljZShtYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGgpO25vZGUuY2xhc3NOYW1lPWN1cnJlbnQuc2xpY2UoMCxtYXRjaC5pbmRleCkrKGFmdGVyP21hdGNoWzFdK2FmdGVyOiIiKTt9fTtmdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlKXtmb3IodmFyIGNvdW50PWUuY2hpbGROb2Rlcy5sZW5ndGg7Y291bnQ+MDstLWNvdW50KQp7ZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO30KcmV0dXJuIGV9CmZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHBhcmVudCxlKXtyZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGFyZW50KS5hcHBlbmRDaGlsZChlKX0KZnVuY3Rpb24gZWx0KHRhZyxjb250ZW50LGNsYXNzTmFtZSxzdHlsZSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO2lmKGNsYXNzTmFtZSl7ZS5jbGFzc05hbWU9Y2xhc3NOYW1lO30KaWYoc3R5bGUpe2Uuc3R5bGUuY3NzVGV4dD1zdHlsZTt9CmlmKHR5cGVvZiBjb250ZW50PT0ic3RyaW5nIil7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7fQplbHNlIGlmKGNvbnRlbnQpe2Zvcih2YXIgaT0wO2k8Y29udGVudC5sZW5ndGg7KytpKXtlLmFwcGVuZENoaWxkKGNvbnRlbnRbaV0pO319CnJldHVybiBlfQpmdW5jdGlvbiBlbHRQKHRhZyxjb250ZW50LGNsYXNzTmFtZSxzdHlsZSl7dmFyIGU9ZWx0KHRhZyxjb250ZW50LGNsYXNzTmFtZSxzdHlsZSk7ZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJwcmVzZW50YXRpb24iKTtyZXR1cm4gZX0KdmFyIHJhbmdlO2lmKGRvY3VtZW50LmNyZWF0ZVJhbmdlKXtyYW5nZT1mdW5jdGlvbihub2RlLHN0YXJ0LGVuZCxlbmROb2RlKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO3Iuc2V0RW5kKGVuZE5vZGV8fG5vZGUsZW5kKTtyLnNldFN0YXJ0KG5vZGUsc3RhcnQpO3JldHVybiByfTt9CmVsc2V7cmFuZ2U9ZnVuY3Rpb24obm9kZSxzdGFydCxlbmQpe3ZhciByPWRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7dHJ5e3IubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTt9CmNhdGNoKGUpe3JldHVybiByfQpyLmNvbGxhcHNlKHRydWUpO3IubW92ZUVuZCgiY2hhcmFjdGVyIixlbmQpO3IubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLHN0YXJ0KTtyZXR1cm4gcn07fQpmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsY2hpbGQpe2lmKGNoaWxkLm5vZGVUeXBlPT0zKQp7Y2hpbGQ9Y2hpbGQucGFyZW50Tm9kZTt9CmlmKHBhcmVudC5jb250YWlucykKe3JldHVybiBwYXJlbnQuY29udGFpbnMoY2hpbGQpfQpkb3tpZihjaGlsZC5ub2RlVHlwZT09MTEpe2NoaWxkPWNoaWxkLmhvc3Q7fQppZihjaGlsZD09cGFyZW50KXtyZXR1cm4gdHJ1ZX19d2hpbGUoY2hpbGQ9Y2hpbGQucGFyZW50Tm9kZSl9CmZ1bmN0aW9uIGFjdGl2ZUVsdCgpe3ZhciBhY3RpdmVFbGVtZW50O3RyeXthY3RpdmVFbGVtZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7fWNhdGNoKGUpe2FjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuYm9keXx8bnVsbDt9CndoaWxlKGFjdGl2ZUVsZW1lbnQmJmFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdCYmYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQpCnthY3RpdmVFbGVtZW50PWFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O30KcmV0dXJuIGFjdGl2ZUVsZW1lbnR9CmZ1bmN0aW9uIGFkZENsYXNzKG5vZGUsY2xzKXt2YXIgY3VycmVudD1ub2RlLmNsYXNzTmFtZTtpZighY2xhc3NUZXN0KGNscykudGVzdChjdXJyZW50KSl7bm9kZS5jbGFzc05hbWUrPShjdXJyZW50PyIgIjoiIikrY2xzO319CmZ1bmN0aW9uIGpvaW5DbGFzc2VzKGEsYil7dmFyIGFzPWEuc3BsaXQoIiAiKTtmb3IodmFyIGk9MDtpPGFzLmxlbmd0aDtpKyspCntpZihhc1tpXSYmIWNsYXNzVGVzdChhc1tpXSkudGVzdChiKSl7Yis9IiAiK2FzW2ldO319CnJldHVybiBifQp2YXIgc2VsZWN0SW5wdXQ9ZnVuY3Rpb24obm9kZSl7bm9kZS5zZWxlY3QoKTt9O2lmKGlvcykKe3NlbGVjdElucHV0PWZ1bmN0aW9uKG5vZGUpe25vZGUuc2VsZWN0aW9uU3RhcnQ9MDtub2RlLnNlbGVjdGlvbkVuZD1ub2RlLnZhbHVlLmxlbmd0aDt9O30KZWxzZSBpZihpZSkKe3NlbGVjdElucHV0PWZ1bmN0aW9uKG5vZGUpe3RyeXtub2RlLnNlbGVjdCgpO31jYXRjaChfZSl7fX07fQpmdW5jdGlvbiBiaW5kKGYpe3ZhciBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZi5hcHBseShudWxsLGFyZ3MpfX0KZnVuY3Rpb24gY29weU9iaihvYmosdGFyZ2V0LG92ZXJ3cml0ZSl7aWYoIXRhcmdldCl7dGFyZ2V0PXt9O30KZm9yKHZhciBwcm9wIGluIG9iaikKe2lmKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSYmKG92ZXJ3cml0ZSE9PWZhbHNlfHwhdGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSkKe3RhcmdldFtwcm9wXT1vYmpbcHJvcF07fX0KcmV0dXJuIHRhcmdldH0KZnVuY3Rpb24gY291bnRDb2x1bW4oc3RyaW5nLGVuZCx0YWJTaXplLHN0YXJ0SW5kZXgsc3RhcnRWYWx1ZSl7aWYoZW5kPT1udWxsKXtlbmQ9c3RyaW5nLnNlYXJjaCgvW15cc1x1MDBhMF0vKTtpZihlbmQ9PS0xKXtlbmQ9c3RyaW5nLmxlbmd0aDt9fQpmb3IodmFyIGk9c3RhcnRJbmRleHx8MCxuPXN0YXJ0VmFsdWV8fDA7Oyl7dmFyIG5leHRUYWI9c3RyaW5nLmluZGV4T2YoIlx0IixpKTtpZihuZXh0VGFiPDB8fG5leHRUYWI+PWVuZCkKe3JldHVybiBuKyhlbmQtaSl9Cm4rPW5leHRUYWItaTtuKz10YWJTaXplLShuJXRhYlNpemUpO2k9bmV4dFRhYisxO319CnZhciBEZWxheWVkPWZ1bmN0aW9uKCl7dGhpcy5pZD1udWxsO307RGVsYXllZC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG1zLGYpe2NsZWFyVGltZW91dCh0aGlzLmlkKTt0aGlzLmlkPXNldFRpbWVvdXQoZixtcyk7fTtmdW5jdGlvbiBpbmRleE9mKGFycmF5LGVsdCl7Zm9yKHZhciBpPTA7aTxhcnJheS5sZW5ndGg7KytpKQp7aWYoYXJyYXlbaV09PWVsdCl7cmV0dXJuIGl9fQpyZXR1cm4tMX0KdmFyIHNjcm9sbGVyR2FwPTMwO3ZhciBQYXNzPXt0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJDb2RlTWlycm9yLlBhc3MifX07dmFyIHNlbF9kb250U2Nyb2xsPXtzY3JvbGw6ZmFsc2V9O3ZhciBzZWxfbW91c2U9e29yaWdpbjoiKm1vdXNlIn07dmFyIHNlbF9tb3ZlPXtvcmlnaW46Iittb3ZlIn07ZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsZ29hbCx0YWJTaXplKXtmb3IodmFyIHBvcz0wLGNvbD0wOzspe3ZhciBuZXh0VGFiPXN0cmluZy5pbmRleE9mKCJcdCIscG9zKTtpZihuZXh0VGFiPT0tMSl7bmV4dFRhYj1zdHJpbmcubGVuZ3RoO30KdmFyIHNraXBwZWQ9bmV4dFRhYi1wb3M7aWYobmV4dFRhYj09c3RyaW5nLmxlbmd0aHx8Y29sK3NraXBwZWQ+PWdvYWwpCntyZXR1cm4gcG9zK01hdGgubWluKHNraXBwZWQsZ29hbC1jb2wpfQpjb2wrPW5leHRUYWItcG9zO2NvbCs9dGFiU2l6ZS0oY29sJXRhYlNpemUpO3Bvcz1uZXh0VGFiKzE7aWYoY29sPj1nb2FsKXtyZXR1cm4gcG9zfX19CnZhciBzcGFjZVN0cnM9WyIiXTtmdW5jdGlvbiBzcGFjZVN0cihuKXt3aGlsZShzcGFjZVN0cnMubGVuZ3RoPD1uKQp7c3BhY2VTdHJzLnB1c2gobHN0KHNwYWNlU3RycykrIiAiKTt9CnJldHVybiBzcGFjZVN0cnNbbl19CmZ1bmN0aW9uIGxzdChhcnIpe3JldHVybiBhcnJbYXJyLmxlbmd0aC0xXX0KZnVuY3Rpb24gbWFwKGFycmF5LGYpe3ZhciBvdXQ9W107Zm9yKHZhciBpPTA7aTxhcnJheS5sZW5ndGg7aSsrKXtvdXRbaV09ZihhcnJheVtpXSxpKTt9CnJldHVybiBvdXR9CmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnJheSx2YWx1ZSxzY29yZSl7dmFyIHBvcz0wLHByaW9yaXR5PXNjb3JlKHZhbHVlKTt3aGlsZShwb3M8YXJyYXkubGVuZ3RoJiZzY29yZShhcnJheVtwb3NdKTw9cHJpb3JpdHkpe3BvcysrO30KYXJyYXkuc3BsaWNlKHBvcywwLHZhbHVlKTt9CmZ1bmN0aW9uIG5vdGhpbmcoKXt9CmZ1bmN0aW9uIGNyZWF0ZU9iaihiYXNlLHByb3BzKXt2YXIgaW5zdDtpZihPYmplY3QuY3JlYXRlKXtpbnN0PU9iamVjdC5jcmVhdGUoYmFzZSk7fWVsc2V7bm90aGluZy5wcm90b3R5cGU9YmFzZTtpbnN0PW5ldyBub3RoaW5nKCk7fQppZihwcm9wcyl7Y29weU9iaihwcm9wcyxpbnN0KTt9CnJldHVybiBpbnN0fQp2YXIgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXI9L1tcdTAwZGZcdTA1ODdcdTA1OTAtXHUwNWY0XHUwNjAwLVx1MDZmZlx1MzA0MC1cdTMwOWZcdTMwYTAtXHUzMGZmXHUzNDAwLVx1NGRiNVx1NGUwMC1cdTlmY2NcdWFjMDAtXHVkN2FmXS87ZnVuY3Rpb24gaXNXb3JkQ2hhckJhc2ljKGNoKXtyZXR1cm4vXHcvLnRlc3QoY2gpfHxjaD4iXHg4MCImJihjaC50b1VwcGVyQ2FzZSgpIT1jaC50b0xvd2VyQ2FzZSgpfHxub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhci50ZXN0KGNoKSl9CmZ1bmN0aW9uIGlzV29yZENoYXIoY2gsaGVscGVyKXtpZighaGVscGVyKXtyZXR1cm4gaXNXb3JkQ2hhckJhc2ljKGNoKX0KaWYoaGVscGVyLnNvdXJjZS5pbmRleE9mKCJcXHciKT4tMSYmaXNXb3JkQ2hhckJhc2ljKGNoKSl7cmV0dXJuIHRydWV9CnJldHVybiBoZWxwZXIudGVzdChjaCl9CmZ1bmN0aW9uIGlzRW1wdHkob2JqKXtmb3IodmFyIG4gaW4gb2JqKXtpZihvYmouaGFzT3duUHJvcGVydHkobikmJm9ialtuXSl7cmV0dXJuIGZhbHNlfX0KcmV0dXJuIHRydWV9CnZhciBleHRlbmRpbmdDaGFycz0vW1x1MDMwMC1cdTAzNmZcdTA0ODMtXHUwNDg5XHUwNTkxLVx1MDViZFx1MDViZlx1MDVjMVx1MDVjMlx1MDVjNFx1MDVjNVx1MDVjN1x1MDYxMC1cdTA2MWFcdTA2NGItXHUwNjVlXHUwNjcwXHUwNmQ2LVx1MDZkY1x1MDZkZS1cdTA2ZTRcdTA2ZTdcdTA2ZThcdTA2ZWEtXHUwNmVkXHUwNzExXHUwNzMwLVx1MDc0YVx1MDdhNi1cdTA3YjBcdTA3ZWItXHUwN2YzXHUwODE2LVx1MDgxOVx1MDgxYi1cdTA4MjNcdTA4MjUtXHUwODI3XHUwODI5LVx1MDgyZFx1MDkwMC1cdTA5MDJcdTA5M2NcdTA5NDEtXHUwOTQ4XHUwOTRkXHUwOTUxLVx1MDk1NVx1MDk2Mlx1MDk2M1x1MDk4MVx1MDliY1x1MDliZVx1MDljMS1cdTA5YzRcdTA5Y2RcdTA5ZDdcdTA5ZTJcdTA5ZTNcdTBhMDFcdTBhMDJcdTBhM2NcdTBhNDFcdTBhNDJcdTBhNDdcdTBhNDhcdTBhNGItXHUwYTRkXHUwYTUxXHUwYTcwXHUwYTcxXHUwYTc1XHUwYTgxXHUwYTgyXHUwYWJjXHUwYWMxLVx1MGFjNVx1MGFjN1x1MGFjOFx1MGFjZFx1MGFlMlx1MGFlM1x1MGIwMVx1MGIzY1x1MGIzZVx1MGIzZlx1MGI0MS1cdTBiNDRcdTBiNGRcdTBiNTZcdTBiNTdcdTBiNjJcdTBiNjNcdTBiODJcdTBiYmVcdTBiYzBcdTBiY2RcdTBiZDdcdTBjM2UtXHUwYzQwXHUwYzQ2LVx1MGM0OFx1MGM0YS1cdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjJcdTBjNjNcdTBjYmNcdTBjYmZcdTBjYzJcdTBjYzZcdTBjY2NcdTBjY2RcdTBjZDVcdTBjZDZcdTBjZTJcdTBjZTNcdTBkM2VcdTBkNDEtXHUwZDQ0XHUwZDRkXHUwZDU3XHUwZDYyXHUwZDYzXHUwZGNhXHUwZGNmXHUwZGQyLVx1MGRkNFx1MGRkNlx1MGRkZlx1MGUzMVx1MGUzNC1cdTBlM2FcdTBlNDctXHUwZTRlXHUwZWIxXHUwZWI0LVx1MGViOVx1MGViYlx1MGViY1x1MGVjOC1cdTBlY2RcdTBmMThcdTBmMTlcdTBmMzVcdTBmMzdcdTBmMzlcdTBmNzEtXHUwZjdlXHUwZjgwLVx1MGY4NFx1MGY4Nlx1MGY4N1x1MGY5MC1cdTBmOTdcdTBmOTktXHUwZmJjXHUwZmM2XHUxMDJkLVx1MTAzMFx1MTAzMi1cdTEwMzdcdTEwMzlcdTEwM2FcdTEwM2RcdTEwM2VcdTEwNThcdTEwNTlcdTEwNWUtXHUxMDYwXHUxMDcxLVx1MTA3NFx1MTA4Mlx1MTA4NVx1MTA4Nlx1MTA4ZFx1MTA5ZFx1MTM1Zlx1MTcxMi1cdTE3MTRcdTE3MzItXHUxNzM0XHUxNzUyXHUxNzUzXHUxNzcyXHUxNzczXHUxN2I3LVx1MTdiZFx1MTdjNlx1MTdjOS1cdTE3ZDNcdTE3ZGRcdTE4MGItXHUxODBkXHUxOGE5XHUxOTIwLVx1MTkyMlx1MTkyN1x1MTkyOFx1MTkzMlx1MTkzOS1cdTE5M2JcdTFhMTdcdTFhMThcdTFhNTZcdTFhNTgtXHUxYTVlXHUxYTYwXHUxYTYyXHUxYTY1LVx1MWE2Y1x1MWE3My1cdTFhN2NcdTFhN2ZcdTFiMDAtXHUxYjAzXHUxYjM0XHUxYjM2LVx1MWIzYVx1MWIzY1x1MWI0Mlx1MWI2Yi1cdTFiNzNcdTFiODBcdTFiODFcdTFiYTItXHUxYmE1XHUxYmE4XHUxYmE5XHUxYzJjLVx1MWMzM1x1MWMzNlx1MWMzN1x1MWNkMC1cdTFjZDJcdTFjZDQtXHUxY2UwXHUxY2UyLVx1MWNlOFx1MWNlZFx1MWRjMC1cdTFkZTZcdTFkZmQtXHUxZGZmXHUyMDBjXHUyMDBkXHUyMGQwLVx1MjBmMFx1MmNlZi1cdTJjZjFcdTJkZTAtXHUyZGZmXHUzMDJhLVx1MzAyZlx1MzA5OVx1MzA5YVx1YTY2Zi1cdWE2NzJcdWE2N2NcdWE2N2RcdWE2ZjBcdWE2ZjFcdWE4MDJcdWE4MDZcdWE4MGJcdWE4MjVcdWE4MjZcdWE4YzRcdWE4ZTAtXHVhOGYxXHVhOTI2LVx1YTkyZFx1YTk0Ny1cdWE5NTFcdWE5ODAtXHVhOTgyXHVhOWIzXHVhOWI2LVx1YTliOVx1YTliY1x1YWEyOS1cdWFhMmVcdWFhMzFcdWFhMzJcdWFhMzVcdWFhMzZcdWFhNDNcdWFhNGNcdWFhYjBcdWFhYjItXHVhYWI0XHVhYWI3XHVhYWI4XHVhYWJlXHVhYWJmXHVhYWMxXHVhYmU1XHVhYmU4XHVhYmVkXHVkYzAwLVx1ZGZmZlx1ZmIxZVx1ZmUwMC1cdWZlMGZcdWZlMjAtXHVmZTI2XHVmZjllXHVmZjlmXS87ZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNoKXtyZXR1cm4gY2guY2hhckNvZGVBdCgwKT49NzY4JiZleHRlbmRpbmdDaGFycy50ZXN0KGNoKX0KZnVuY3Rpb24gc2tpcEV4dGVuZGluZ0NoYXJzKHN0cixwb3MsZGlyKXt3aGlsZSgoZGlyPDA/cG9zPjA6cG9zPHN0ci5sZW5ndGgpJiZpc0V4dGVuZGluZ0NoYXIoc3RyLmNoYXJBdChwb3MpKSl7cG9zKz1kaXI7fQpyZXR1cm4gcG9zfQpmdW5jdGlvbiBmaW5kRmlyc3QocHJlZCxmcm9tLHRvKXt2YXIgZGlyPWZyb20+dG8/LTE6MTtmb3IoOzspe2lmKGZyb209PXRvKXtyZXR1cm4gZnJvbX0KdmFyIG1pZEY9KGZyb20rdG8pLzIsbWlkPWRpcjwwP01hdGguY2VpbChtaWRGKTpNYXRoLmZsb29yKG1pZEYpO2lmKG1pZD09ZnJvbSl7cmV0dXJuIHByZWQobWlkKT9mcm9tOnRvfQppZihwcmVkKG1pZCkpe3RvPW1pZDt9CmVsc2V7ZnJvbT1taWQrZGlyO319fQpmdW5jdGlvbiBEaXNwbGF5KHBsYWNlLGRvYyxpbnB1dCl7dmFyIGQ9dGhpczt0aGlzLmlucHV0PWlucHV0O2Quc2Nyb2xsYmFyRmlsbGVyPWVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIiKTtkLnNjcm9sbGJhckZpbGxlci5zZXRBdHRyaWJ1dGUoImNtLW5vdC1jb250ZW50IiwidHJ1ZSIpO2QuZ3V0dGVyRmlsbGVyPWVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLWd1dHRlci1maWxsZXIiKTtkLmd1dHRlckZpbGxlci5zZXRBdHRyaWJ1dGUoImNtLW5vdC1jb250ZW50IiwidHJ1ZSIpO2QubGluZURpdj1lbHRQKCJkaXYiLG51bGwsIkNvZGVNaXJyb3ItY29kZSIpO2Quc2VsZWN0aW9uRGl2PWVsdCgiZGl2IixudWxsLG51bGwsInBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMSIpO2QuY3Vyc29yRGl2PWVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLWN1cnNvcnMiKTtkLm1lYXN1cmU9ZWx0KCJkaXYiLG51bGwsIkNvZGVNaXJyb3ItbWVhc3VyZSIpO2QubGluZU1lYXN1cmU9ZWx0KCJkaXYiLG51bGwsIkNvZGVNaXJyb3ItbWVhc3VyZSIpO2QubGluZVNwYWNlPWVsdFAoImRpdiIsW2QubWVhc3VyZSxkLmxpbmVNZWFzdXJlLGQuc2VsZWN0aW9uRGl2LGQuY3Vyc29yRGl2LGQubGluZURpdl0sbnVsbCwicG9zaXRpb246IHJlbGF0aXZlOyBvdXRsaW5lOiBub25lIik7dmFyIGxpbmVzPWVsdFAoImRpdiIsW2QubGluZVNwYWNlXSwiQ29kZU1pcnJvci1saW5lcyIpO2QubW92ZXI9ZWx0KCJkaXYiLFtsaW5lc10sbnVsbCwicG9zaXRpb246IHJlbGF0aXZlIik7ZC5zaXplcj1lbHQoImRpdiIsW2QubW92ZXJdLCJDb2RlTWlycm9yLXNpemVyIik7ZC5zaXplcldpZHRoPW51bGw7ZC5oZWlnaHRGb3JjZXI9ZWx0KCJkaXYiLG51bGwsbnVsbCwicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6ICIrc2Nyb2xsZXJHYXArInB4OyB3aWR0aDogMXB4OyIpO2QuZ3V0dGVycz1lbHQoImRpdiIsbnVsbCwiQ29kZU1pcnJvci1ndXR0ZXJzIik7ZC5saW5lR3V0dGVyPW51bGw7ZC5zY3JvbGxlcj1lbHQoImRpdiIsW2Quc2l6ZXIsZC5oZWlnaHRGb3JjZXIsZC5ndXR0ZXJzXSwiQ29kZU1pcnJvci1zY3JvbGwiKTtkLnNjcm9sbGVyLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCItMSIpO2Qud3JhcHBlcj1lbHQoImRpdiIsW2Quc2Nyb2xsYmFyRmlsbGVyLGQuZ3V0dGVyRmlsbGVyLGQuc2Nyb2xsZXJdLCJDb2RlTWlycm9yIik7aWYoaWUmJmllX3ZlcnNpb248OCl7ZC5ndXR0ZXJzLnN0eWxlLnpJbmRleD0tMTtkLnNjcm9sbGVyLnN0eWxlLnBhZGRpbmdSaWdodD0wO30KaWYoIXdlYmtpdCYmIShnZWNrbyYmbW9iaWxlKSl7ZC5zY3JvbGxlci5kcmFnZ2FibGU9dHJ1ZTt9CmlmKHBsYWNlKXtpZihwbGFjZS5hcHBlbmRDaGlsZCl7cGxhY2UuYXBwZW5kQ2hpbGQoZC53cmFwcGVyKTt9CmVsc2V7cGxhY2UoZC53cmFwcGVyKTt9fQpkLnZpZXdGcm9tPWQudmlld1RvPWRvYy5maXJzdDtkLnJlcG9ydGVkVmlld0Zyb209ZC5yZXBvcnRlZFZpZXdUbz1kb2MuZmlyc3Q7ZC52aWV3PVtdO2QucmVuZGVyZWRWaWV3PW51bGw7ZC5leHRlcm5hbE1lYXN1cmVkPW51bGw7ZC52aWV3T2Zmc2V0PTA7ZC5sYXN0V3JhcEhlaWdodD1kLmxhc3RXcmFwV2lkdGg9MDtkLnVwZGF0ZUxpbmVOdW1iZXJzPW51bGw7ZC5uYXRpdmVCYXJXaWR0aD1kLmJhckhlaWdodD1kLmJhcldpZHRoPTA7ZC5zY3JvbGxiYXJzQ2xpcHBlZD1mYWxzZTtkLmxpbmVOdW1XaWR0aD1kLmxpbmVOdW1Jbm5lcldpZHRoPWQubGluZU51bUNoYXJzPW51bGw7ZC5hbGlnbldpZGdldHM9ZmFsc2U7ZC5jYWNoZWRDaGFyV2lkdGg9ZC5jYWNoZWRUZXh0SGVpZ2h0PWQuY2FjaGVkUGFkZGluZ0g9bnVsbDtkLm1heExpbmU9bnVsbDtkLm1heExpbmVMZW5ndGg9MDtkLm1heExpbmVDaGFuZ2VkPWZhbHNlO2Qud2hlZWxEWD1kLndoZWVsRFk9ZC53aGVlbFN0YXJ0WD1kLndoZWVsU3RhcnRZPW51bGw7ZC5zaGlmdD1mYWxzZTtkLnNlbEZvckNvbnRleHRNZW51PW51bGw7ZC5hY3RpdmVUb3VjaD1udWxsO2lucHV0LmluaXQoZCk7fQpmdW5jdGlvbiBnZXRMaW5lKGRvYyxuKXtuLT1kb2MuZmlyc3Q7aWYobjwwfHxuPj1kb2Muc2l6ZSl7dGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyBsaW5lICIrKG4rZG9jLmZpcnN0KSsiIGluIHRoZSBkb2N1bWVudC4iKX0KdmFyIGNodW5rPWRvYzt3aGlsZSghY2h1bmsubGluZXMpe2Zvcih2YXIgaT0wOzsrK2kpe3ZhciBjaGlsZD1jaHVuay5jaGlsZHJlbltpXSxzej1jaGlsZC5jaHVua1NpemUoKTtpZihuPHN6KXtjaHVuaz1jaGlsZDticmVha30Kbi09c3o7fX0KcmV0dXJuIGNodW5rLmxpbmVzW25dfQpmdW5jdGlvbiBnZXRCZXR3ZWVuKGRvYyxzdGFydCxlbmQpe3ZhciBvdXQ9W10sbj1zdGFydC5saW5lO2RvYy5pdGVyKHN0YXJ0LmxpbmUsZW5kLmxpbmUrMSxmdW5jdGlvbihsaW5lKXt2YXIgdGV4dD1saW5lLnRleHQ7aWYobj09ZW5kLmxpbmUpe3RleHQ9dGV4dC5zbGljZSgwLGVuZC5jaCk7fQppZihuPT1zdGFydC5saW5lKXt0ZXh0PXRleHQuc2xpY2Uoc3RhcnQuY2gpO30Kb3V0LnB1c2godGV4dCk7KytuO30pO3JldHVybiBvdXR9CmZ1bmN0aW9uIGdldExpbmVzKGRvYyxmcm9tLHRvKXt2YXIgb3V0PVtdO2RvYy5pdGVyKGZyb20sdG8sZnVuY3Rpb24obGluZSl7b3V0LnB1c2gobGluZS50ZXh0KTt9KTtyZXR1cm4gb3V0fQpmdW5jdGlvbiB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsaGVpZ2h0KXt2YXIgZGlmZj1oZWlnaHQtbGluZS5oZWlnaHQ7aWYoZGlmZil7Zm9yKHZhciBuPWxpbmU7bjtuPW4ucGFyZW50KXtuLmhlaWdodCs9ZGlmZjt9fX0KZnVuY3Rpb24gbGluZU5vKGxpbmUpe2lmKGxpbmUucGFyZW50PT1udWxsKXtyZXR1cm4gbnVsbH0KdmFyIGN1cj1saW5lLnBhcmVudCxubz1pbmRleE9mKGN1ci5saW5lcyxsaW5lKTtmb3IodmFyIGNodW5rPWN1ci5wYXJlbnQ7Y2h1bms7Y3VyPWNodW5rLGNodW5rPWNodW5rLnBhcmVudCl7Zm9yKHZhciBpPTA7OysraSl7aWYoY2h1bmsuY2hpbGRyZW5baV09PWN1cil7YnJlYWt9Cm5vKz1jaHVuay5jaGlsZHJlbltpXS5jaHVua1NpemUoKTt9fQpyZXR1cm4gbm8rY3VyLmZpcnN0fQpmdW5jdGlvbiBsaW5lQXRIZWlnaHQoY2h1bmssaCl7dmFyIG49Y2h1bmsuZmlyc3Q7b3V0ZXI6ZG97Zm9yKHZhciBpJDE9MDtpJDE8Y2h1bmsuY2hpbGRyZW4ubGVuZ3RoOysraSQxKXt2YXIgY2hpbGQ9Y2h1bmsuY2hpbGRyZW5baSQxXSxjaD1jaGlsZC5oZWlnaHQ7aWYoaDxjaCl7Y2h1bms9Y2hpbGQ7Y29udGludWUgb3V0ZXJ9CmgtPWNoO24rPWNoaWxkLmNodW5rU2l6ZSgpO30KcmV0dXJuIG59d2hpbGUoIWNodW5rLmxpbmVzKQp2YXIgaT0wO2Zvcig7aTxjaHVuay5saW5lcy5sZW5ndGg7KytpKXt2YXIgbGluZT1jaHVuay5saW5lc1tpXSxsaD1saW5lLmhlaWdodDtpZihoPGxoKXticmVha30KaC09bGg7fQpyZXR1cm4gbitpfQpmdW5jdGlvbiBpc0xpbmUoZG9jLGwpe3JldHVybiBsPj1kb2MuZmlyc3QmJmw8ZG9jLmZpcnN0K2RvYy5zaXplfQpmdW5jdGlvbiBsaW5lTnVtYmVyRm9yKG9wdGlvbnMsaSl7cmV0dXJuIFN0cmluZyhvcHRpb25zLmxpbmVOdW1iZXJGb3JtYXR0ZXIoaStvcHRpb25zLmZpcnN0TGluZU51bWJlcikpfQpmdW5jdGlvbiBQb3MobGluZSxjaCxzdGlja3kpe2lmKHN0aWNreT09PXZvaWQgMClzdGlja3k9bnVsbDtpZighKHRoaXMgaW5zdGFuY2VvZiBQb3MpKXtyZXR1cm4gbmV3IFBvcyhsaW5lLGNoLHN0aWNreSl9CnRoaXMubGluZT1saW5lO3RoaXMuY2g9Y2g7dGhpcy5zdGlja3k9c3RpY2t5O30KZnVuY3Rpb24gY21wKGEsYil7cmV0dXJuIGEubGluZS1iLmxpbmV8fGEuY2gtYi5jaH0KZnVuY3Rpb24gZXF1YWxDdXJzb3JQb3MoYSxiKXtyZXR1cm4gYS5zdGlja3k9PWIuc3RpY2t5JiZjbXAoYSxiKT09MH0KZnVuY3Rpb24gY29weVBvcyh4KXtyZXR1cm4gUG9zKHgubGluZSx4LmNoKX0KZnVuY3Rpb24gbWF4UG9zKGEsYil7cmV0dXJuIGNtcChhLGIpPDA/YjphfQpmdW5jdGlvbiBtaW5Qb3MoYSxiKXtyZXR1cm4gY21wKGEsYik8MD9hOmJ9CmZ1bmN0aW9uIGNsaXBMaW5lKGRvYyxuKXtyZXR1cm4gTWF0aC5tYXgoZG9jLmZpcnN0LE1hdGgubWluKG4sZG9jLmZpcnN0K2RvYy5zaXplLTEpKX0KZnVuY3Rpb24gY2xpcFBvcyhkb2MscG9zKXtpZihwb3MubGluZTxkb2MuZmlyc3Qpe3JldHVybiBQb3MoZG9jLmZpcnN0LDApfQp2YXIgbGFzdD1kb2MuZmlyc3QrZG9jLnNpemUtMTtpZihwb3MubGluZT5sYXN0KXtyZXR1cm4gUG9zKGxhc3QsZ2V0TGluZShkb2MsbGFzdCkudGV4dC5sZW5ndGgpfQpyZXR1cm4gY2xpcFRvTGVuKHBvcyxnZXRMaW5lKGRvYyxwb3MubGluZSkudGV4dC5sZW5ndGgpfQpmdW5jdGlvbiBjbGlwVG9MZW4ocG9zLGxpbmVsZW4pe3ZhciBjaD1wb3MuY2g7aWYoY2g9PW51bGx8fGNoPmxpbmVsZW4pe3JldHVybiBQb3MocG9zLmxpbmUsbGluZWxlbil9CmVsc2UgaWYoY2g8MCl7cmV0dXJuIFBvcyhwb3MubGluZSwwKX0KZWxzZXtyZXR1cm4gcG9zfX0KZnVuY3Rpb24gY2xpcFBvc0FycmF5KGRvYyxhcnJheSl7dmFyIG91dD1bXTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe291dFtpXT1jbGlwUG9zKGRvYyxhcnJheVtpXSk7fQpyZXR1cm4gb3V0fQp2YXIgc2F3UmVhZE9ubHlTcGFucz1mYWxzZTt2YXIgc2F3Q29sbGFwc2VkU3BhbnM9ZmFsc2U7ZnVuY3Rpb24gc2VlUmVhZE9ubHlTcGFucygpe3Nhd1JlYWRPbmx5U3BhbnM9dHJ1ZTt9CmZ1bmN0aW9uIHNlZUNvbGxhcHNlZFNwYW5zKCl7c2F3Q29sbGFwc2VkU3BhbnM9dHJ1ZTt9CmZ1bmN0aW9uIE1hcmtlZFNwYW4obWFya2VyLGZyb20sdG8pe3RoaXMubWFya2VyPW1hcmtlcjt0aGlzLmZyb209ZnJvbTt0aGlzLnRvPXRvO30KZnVuY3Rpb24gZ2V0TWFya2VkU3BhbkZvcihzcGFucyxtYXJrZXIpe2lmKHNwYW5zKXtmb3IodmFyIGk9MDtpPHNwYW5zLmxlbmd0aDsrK2kpe3ZhciBzcGFuPXNwYW5zW2ldO2lmKHNwYW4ubWFya2VyPT1tYXJrZXIpe3JldHVybiBzcGFufX19fQpmdW5jdGlvbiByZW1vdmVNYXJrZWRTcGFuKHNwYW5zLHNwYW4pe3ZhciByO2Zvcih2YXIgaT0wO2k8c3BhbnMubGVuZ3RoOysraSkKe2lmKHNwYW5zW2ldIT1zcGFuKXsocnx8KHI9W10pKS5wdXNoKHNwYW5zW2ldKTt9fQpyZXR1cm4gcn0KZnVuY3Rpb24gYWRkTWFya2VkU3BhbihsaW5lLHNwYW4pe2xpbmUubWFya2VkU3BhbnM9bGluZS5tYXJrZWRTcGFucz9saW5lLm1hcmtlZFNwYW5zLmNvbmNhdChbc3Bhbl0pOltzcGFuXTtzcGFuLm1hcmtlci5hdHRhY2hMaW5lKGxpbmUpO30KZnVuY3Rpb24gbWFya2VkU3BhbnNCZWZvcmUob2xkLHN0YXJ0Q2gsaXNJbnNlcnQpe3ZhciBudztpZihvbGQpe2Zvcih2YXIgaT0wO2k8b2xkLmxlbmd0aDsrK2kpe3ZhciBzcGFuPW9sZFtpXSxtYXJrZXI9c3Bhbi5tYXJrZXI7dmFyIHN0YXJ0c0JlZm9yZT1zcGFuLmZyb209PW51bGx8fChtYXJrZXIuaW5jbHVzaXZlTGVmdD9zcGFuLmZyb208PXN0YXJ0Q2g6c3Bhbi5mcm9tPHN0YXJ0Q2gpO2lmKHN0YXJ0c0JlZm9yZXx8c3Bhbi5mcm9tPT1zdGFydENoJiZtYXJrZXIudHlwZT09ImJvb2ttYXJrIiYmKCFpc0luc2VydHx8IXNwYW4ubWFya2VyLmluc2VydExlZnQpKXt2YXIgZW5kc0FmdGVyPXNwYW4udG89PW51bGx8fChtYXJrZXIuaW5jbHVzaXZlUmlnaHQ/c3Bhbi50bz49c3RhcnRDaDpzcGFuLnRvPnN0YXJ0Q2gpOyhud3x8KG53PVtdKSkucHVzaChuZXcgTWFya2VkU3BhbihtYXJrZXIsc3Bhbi5mcm9tLGVuZHNBZnRlcj9udWxsOnNwYW4udG8pKTt9fX0KcmV0dXJuIG53fQpmdW5jdGlvbiBtYXJrZWRTcGFuc0FmdGVyKG9sZCxlbmRDaCxpc0luc2VydCl7dmFyIG53O2lmKG9sZCl7Zm9yKHZhciBpPTA7aTxvbGQubGVuZ3RoOysraSl7dmFyIHNwYW49b2xkW2ldLG1hcmtlcj1zcGFuLm1hcmtlcjt2YXIgZW5kc0FmdGVyPXNwYW4udG89PW51bGx8fChtYXJrZXIuaW5jbHVzaXZlUmlnaHQ/c3Bhbi50bz49ZW5kQ2g6c3Bhbi50bz5lbmRDaCk7aWYoZW5kc0FmdGVyfHxzcGFuLmZyb209PWVuZENoJiZtYXJrZXIudHlwZT09ImJvb2ttYXJrIiYmKCFpc0luc2VydHx8c3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpe3ZhciBzdGFydHNCZWZvcmU9c3Bhbi5mcm9tPT1udWxsfHwobWFya2VyLmluY2x1c2l2ZUxlZnQ/c3Bhbi5mcm9tPD1lbmRDaDpzcGFuLmZyb208ZW5kQ2gpOyhud3x8KG53PVtdKSkucHVzaChuZXcgTWFya2VkU3BhbihtYXJrZXIsc3RhcnRzQmVmb3JlP251bGw6c3Bhbi5mcm9tLWVuZENoLHNwYW4udG89PW51bGw/bnVsbDpzcGFuLnRvLWVuZENoKSk7fX19CnJldHVybiBud30KZnVuY3Rpb24gc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsY2hhbmdlKXtpZihjaGFuZ2UuZnVsbCl7cmV0dXJuIG51bGx9CnZhciBvbGRGaXJzdD1pc0xpbmUoZG9jLGNoYW5nZS5mcm9tLmxpbmUpJiZnZXRMaW5lKGRvYyxjaGFuZ2UuZnJvbS5saW5lKS5tYXJrZWRTcGFuczt2YXIgb2xkTGFzdD1pc0xpbmUoZG9jLGNoYW5nZS50by5saW5lKSYmZ2V0TGluZShkb2MsY2hhbmdlLnRvLmxpbmUpLm1hcmtlZFNwYW5zO2lmKCFvbGRGaXJzdCYmIW9sZExhc3Qpe3JldHVybiBudWxsfQp2YXIgc3RhcnRDaD1jaGFuZ2UuZnJvbS5jaCxlbmRDaD1jaGFuZ2UudG8uY2gsaXNJbnNlcnQ9Y21wKGNoYW5nZS5mcm9tLGNoYW5nZS50byk9PTA7dmFyIGZpcnN0PW1hcmtlZFNwYW5zQmVmb3JlKG9sZEZpcnN0LHN0YXJ0Q2gsaXNJbnNlcnQpO3ZhciBsYXN0PW1hcmtlZFNwYW5zQWZ0ZXIob2xkTGFzdCxlbmRDaCxpc0luc2VydCk7dmFyIHNhbWVMaW5lPWNoYW5nZS50ZXh0Lmxlbmd0aD09MSxvZmZzZXQ9bHN0KGNoYW5nZS50ZXh0KS5sZW5ndGgrKHNhbWVMaW5lP3N0YXJ0Q2g6MCk7aWYoZmlyc3Qpe2Zvcih2YXIgaT0wO2k8Zmlyc3QubGVuZ3RoOysraSl7dmFyIHNwYW49Zmlyc3RbaV07aWYoc3Bhbi50bz09bnVsbCl7dmFyIGZvdW5kPWdldE1hcmtlZFNwYW5Gb3IobGFzdCxzcGFuLm1hcmtlcik7aWYoIWZvdW5kKXtzcGFuLnRvPXN0YXJ0Q2g7fQplbHNlIGlmKHNhbWVMaW5lKXtzcGFuLnRvPWZvdW5kLnRvPT1udWxsP251bGw6Zm91bmQudG8rb2Zmc2V0O319fX0KaWYobGFzdCl7Zm9yKHZhciBpJDE9MDtpJDE8bGFzdC5sZW5ndGg7KytpJDEpe3ZhciBzcGFuJDE9bGFzdFtpJDFdO2lmKHNwYW4kMS50byE9bnVsbCl7c3BhbiQxLnRvKz1vZmZzZXQ7fQppZihzcGFuJDEuZnJvbT09bnVsbCl7dmFyIGZvdW5kJDE9Z2V0TWFya2VkU3BhbkZvcihmaXJzdCxzcGFuJDEubWFya2VyKTtpZighZm91bmQkMSl7c3BhbiQxLmZyb209b2Zmc2V0O2lmKHNhbWVMaW5lKXsoZmlyc3R8fChmaXJzdD1bXSkpLnB1c2goc3BhbiQxKTt9fX1lbHNle3NwYW4kMS5mcm9tKz1vZmZzZXQ7aWYoc2FtZUxpbmUpeyhmaXJzdHx8KGZpcnN0PVtdKSkucHVzaChzcGFuJDEpO319fX0KaWYoZmlyc3Qpe2ZpcnN0PWNsZWFyRW1wdHlTcGFucyhmaXJzdCk7fQppZihsYXN0JiZsYXN0IT1maXJzdCl7bGFzdD1jbGVhckVtcHR5U3BhbnMobGFzdCk7fQp2YXIgbmV3TWFya2Vycz1bZmlyc3RdO2lmKCFzYW1lTGluZSl7dmFyIGdhcD1jaGFuZ2UudGV4dC5sZW5ndGgtMixnYXBNYXJrZXJzO2lmKGdhcD4wJiZmaXJzdCkKe2Zvcih2YXIgaSQyPTA7aSQyPGZpcnN0Lmxlbmd0aDsrK2kkMikKe2lmKGZpcnN0W2kkMl0udG89PW51bGwpCnsoZ2FwTWFya2Vyc3x8KGdhcE1hcmtlcnM9W10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKGZpcnN0W2kkMl0ubWFya2VyLG51bGwsbnVsbCkpO319fQpmb3IodmFyIGkkMz0wO2kkMzxnYXA7KytpJDMpCntuZXdNYXJrZXJzLnB1c2goZ2FwTWFya2Vycyk7fQpuZXdNYXJrZXJzLnB1c2gobGFzdCk7fQpyZXR1cm4gbmV3TWFya2Vyc30KZnVuY3Rpb24gY2xlYXJFbXB0eVNwYW5zKHNwYW5zKXtmb3IodmFyIGk9MDtpPHNwYW5zLmxlbmd0aDsrK2kpe3ZhciBzcGFuPXNwYW5zW2ldO2lmKHNwYW4uZnJvbSE9bnVsbCYmc3Bhbi5mcm9tPT1zcGFuLnRvJiZzcGFuLm1hcmtlci5jbGVhcldoZW5FbXB0eSE9PWZhbHNlKQp7c3BhbnMuc3BsaWNlKGktLSwxKTt9fQppZighc3BhbnMubGVuZ3RoKXtyZXR1cm4gbnVsbH0KcmV0dXJuIHNwYW5zfQpmdW5jdGlvbiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsZnJvbSx0byl7dmFyIG1hcmtlcnM9bnVsbDtkb2MuaXRlcihmcm9tLmxpbmUsdG8ubGluZSsxLGZ1bmN0aW9uKGxpbmUpe2lmKGxpbmUubWFya2VkU3BhbnMpe2Zvcih2YXIgaT0wO2k8bGluZS5tYXJrZWRTcGFucy5sZW5ndGg7KytpKXt2YXIgbWFyaz1saW5lLm1hcmtlZFNwYW5zW2ldLm1hcmtlcjtpZihtYXJrLnJlYWRPbmx5JiYoIW1hcmtlcnN8fGluZGV4T2YobWFya2VycyxtYXJrKT09LTEpKQp7KG1hcmtlcnN8fChtYXJrZXJzPVtdKSkucHVzaChtYXJrKTt9fX19KTtpZighbWFya2Vycyl7cmV0dXJuIG51bGx9CnZhciBwYXJ0cz1be2Zyb206ZnJvbSx0bzp0b31dO2Zvcih2YXIgaT0wO2k8bWFya2Vycy5sZW5ndGg7KytpKXt2YXIgbWs9bWFya2Vyc1tpXSxtPW1rLmZpbmQoMCk7Zm9yKHZhciBqPTA7ajxwYXJ0cy5sZW5ndGg7KytqKXt2YXIgcD1wYXJ0c1tqXTtpZihjbXAocC50byxtLmZyb20pPDB8fGNtcChwLmZyb20sbS50byk+MCl7Y29udGludWV9CnZhciBuZXdQYXJ0cz1baiwxXSxkZnJvbT1jbXAocC5mcm9tLG0uZnJvbSksZHRvPWNtcChwLnRvLG0udG8pO2lmKGRmcm9tPDB8fCFtay5pbmNsdXNpdmVMZWZ0JiYhZGZyb20pCntuZXdQYXJ0cy5wdXNoKHtmcm9tOnAuZnJvbSx0bzptLmZyb219KTt9CmlmKGR0bz4wfHwhbWsuaW5jbHVzaXZlUmlnaHQmJiFkdG8pCntuZXdQYXJ0cy5wdXNoKHtmcm9tOm0udG8sdG86cC50b30pO30KcGFydHMuc3BsaWNlLmFwcGx5KHBhcnRzLG5ld1BhcnRzKTtqKz1uZXdQYXJ0cy5sZW5ndGgtMzt9fQpyZXR1cm4gcGFydHN9CmZ1bmN0aW9uIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpe3ZhciBzcGFucz1saW5lLm1hcmtlZFNwYW5zO2lmKCFzcGFucyl7cmV0dXJufQpmb3IodmFyIGk9MDtpPHNwYW5zLmxlbmd0aDsrK2kpCntzcGFuc1tpXS5tYXJrZXIuZGV0YWNoTGluZShsaW5lKTt9CmxpbmUubWFya2VkU3BhbnM9bnVsbDt9CmZ1bmN0aW9uIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsc3BhbnMpe2lmKCFzcGFucyl7cmV0dXJufQpmb3IodmFyIGk9MDtpPHNwYW5zLmxlbmd0aDsrK2kpCntzcGFuc1tpXS5tYXJrZXIuYXR0YWNoTGluZShsaW5lKTt9CmxpbmUubWFya2VkU3BhbnM9c3BhbnM7fQpmdW5jdGlvbiBleHRyYUxlZnQobWFya2VyKXtyZXR1cm4gbWFya2VyLmluY2x1c2l2ZUxlZnQ/LTE6MH0KZnVuY3Rpb24gZXh0cmFSaWdodChtYXJrZXIpe3JldHVybiBtYXJrZXIuaW5jbHVzaXZlUmlnaHQ/MTowfQpmdW5jdGlvbiBjb21wYXJlQ29sbGFwc2VkTWFya2VycyhhLGIpe3ZhciBsZW5EaWZmPWEubGluZXMubGVuZ3RoLWIubGluZXMubGVuZ3RoO2lmKGxlbkRpZmYhPTApe3JldHVybiBsZW5EaWZmfQp2YXIgYVBvcz1hLmZpbmQoKSxiUG9zPWIuZmluZCgpO3ZhciBmcm9tQ21wPWNtcChhUG9zLmZyb20sYlBvcy5mcm9tKXx8ZXh0cmFMZWZ0KGEpLWV4dHJhTGVmdChiKTtpZihmcm9tQ21wKXtyZXR1cm4tZnJvbUNtcH0KdmFyIHRvQ21wPWNtcChhUG9zLnRvLGJQb3MudG8pfHxleHRyYVJpZ2h0KGEpLWV4dHJhUmlnaHQoYik7aWYodG9DbXApe3JldHVybiB0b0NtcH0KcmV0dXJuIGIuaWQtYS5pZH0KZnVuY3Rpb24gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLHN0YXJ0KXt2YXIgc3BzPXNhd0NvbGxhcHNlZFNwYW5zJiZsaW5lLm1hcmtlZFNwYW5zLGZvdW5kO2lmKHNwcyl7Zm9yKHZhciBzcD0odm9pZCAwKSxpPTA7aTxzcHMubGVuZ3RoOysraSl7c3A9c3BzW2ldO2lmKHNwLm1hcmtlci5jb2xsYXBzZWQmJihzdGFydD9zcC5mcm9tOnNwLnRvKT09bnVsbCYmKCFmb3VuZHx8Y29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoZm91bmQsc3AubWFya2VyKTwwKSkKe2ZvdW5kPXNwLm1hcmtlcjt9fX0KcmV0dXJuIGZvdW5kfQpmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKXtyZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLHRydWUpfQpmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSl7cmV0dXJuIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSxmYWxzZSl9CmZ1bmN0aW9uIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLGxpbmVObyQkMSxmcm9tLHRvLG1hcmtlcil7dmFyIGxpbmU9Z2V0TGluZShkb2MsbGluZU5vJCQxKTt2YXIgc3BzPXNhd0NvbGxhcHNlZFNwYW5zJiZsaW5lLm1hcmtlZFNwYW5zO2lmKHNwcyl7Zm9yKHZhciBpPTA7aTxzcHMubGVuZ3RoOysraSl7dmFyIHNwPXNwc1tpXTtpZighc3AubWFya2VyLmNvbGxhcHNlZCl7Y29udGludWV9CnZhciBmb3VuZD1zcC5tYXJrZXIuZmluZCgwKTt2YXIgZnJvbUNtcD1jbXAoZm91bmQuZnJvbSxmcm9tKXx8ZXh0cmFMZWZ0KHNwLm1hcmtlciktZXh0cmFMZWZ0KG1hcmtlcik7dmFyIHRvQ21wPWNtcChmb3VuZC50byx0byl8fGV4dHJhUmlnaHQoc3AubWFya2VyKS1leHRyYVJpZ2h0KG1hcmtlcik7aWYoZnJvbUNtcD49MCYmdG9DbXA8PTB8fGZyb21DbXA8PTAmJnRvQ21wPj0wKXtjb250aW51ZX0KaWYoZnJvbUNtcDw9MCYmKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCYmbWFya2VyLmluY2x1c2l2ZUxlZnQ/Y21wKGZvdW5kLnRvLGZyb20pPj0wOmNtcChmb3VuZC50byxmcm9tKT4wKXx8ZnJvbUNtcD49MCYmKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCYmbWFya2VyLmluY2x1c2l2ZUxlZnQ/Y21wKGZvdW5kLmZyb20sdG8pPD0wOmNtcChmb3VuZC5mcm9tLHRvKTwwKSkKe3JldHVybiB0cnVlfX19fQpmdW5jdGlvbiB2aXN1YWxMaW5lKGxpbmUpe3ZhciBtZXJnZWQ7d2hpbGUobWVyZ2VkPWNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpKQp7bGluZT1tZXJnZWQuZmluZCgtMSx0cnVlKS5saW5lO30KcmV0dXJuIGxpbmV9CmZ1bmN0aW9uIHZpc3VhbExpbmVFbmQobGluZSl7dmFyIG1lcmdlZDt3aGlsZShtZXJnZWQ9Y29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKQp7bGluZT1tZXJnZWQuZmluZCgxLHRydWUpLmxpbmU7fQpyZXR1cm4gbGluZX0KZnVuY3Rpb24gdmlzdWFsTGluZUNvbnRpbnVlZChsaW5lKXt2YXIgbWVyZ2VkLGxpbmVzO3doaWxlKG1lcmdlZD1jb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpe2xpbmU9bWVyZ2VkLmZpbmQoMSx0cnVlKS5saW5lOyhsaW5lc3x8KGxpbmVzPVtdKSkucHVzaChsaW5lKTt9CnJldHVybiBsaW5lc30KZnVuY3Rpb24gdmlzdWFsTGluZU5vKGRvYyxsaW5lTil7dmFyIGxpbmU9Z2V0TGluZShkb2MsbGluZU4pLHZpcz12aXN1YWxMaW5lKGxpbmUpO2lmKGxpbmU9PXZpcyl7cmV0dXJuIGxpbmVOfQpyZXR1cm4gbGluZU5vKHZpcyl9CmZ1bmN0aW9uIHZpc3VhbExpbmVFbmRObyhkb2MsbGluZU4pe2lmKGxpbmVOPmRvYy5sYXN0TGluZSgpKXtyZXR1cm4gbGluZU59CnZhciBsaW5lPWdldExpbmUoZG9jLGxpbmVOKSxtZXJnZWQ7aWYoIWxpbmVJc0hpZGRlbihkb2MsbGluZSkpe3JldHVybiBsaW5lTn0Kd2hpbGUobWVyZ2VkPWNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkKe2xpbmU9bWVyZ2VkLmZpbmQoMSx0cnVlKS5saW5lO30KcmV0dXJuIGxpbmVObyhsaW5lKSsxfQpmdW5jdGlvbiBsaW5lSXNIaWRkZW4oZG9jLGxpbmUpe3ZhciBzcHM9c2F3Q29sbGFwc2VkU3BhbnMmJmxpbmUubWFya2VkU3BhbnM7aWYoc3BzKXtmb3IodmFyIHNwPSh2b2lkIDApLGk9MDtpPHNwcy5sZW5ndGg7KytpKXtzcD1zcHNbaV07aWYoIXNwLm1hcmtlci5jb2xsYXBzZWQpe2NvbnRpbnVlfQppZihzcC5mcm9tPT1udWxsKXtyZXR1cm4gdHJ1ZX0KaWYoc3AubWFya2VyLndpZGdldE5vZGUpe2NvbnRpbnVlfQppZihzcC5mcm9tPT0wJiZzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCYmbGluZUlzSGlkZGVuSW5uZXIoZG9jLGxpbmUsc3ApKQp7cmV0dXJuIHRydWV9fX19CmZ1bmN0aW9uIGxpbmVJc0hpZGRlbklubmVyKGRvYyxsaW5lLHNwYW4pe2lmKHNwYW4udG89PW51bGwpe3ZhciBlbmQ9c3Bhbi5tYXJrZXIuZmluZCgxLHRydWUpO3JldHVybiBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsZW5kLmxpbmUsZ2V0TWFya2VkU3BhbkZvcihlbmQubGluZS5tYXJrZWRTcGFucyxzcGFuLm1hcmtlcikpfQppZihzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCYmc3Bhbi50bz09bGluZS50ZXh0Lmxlbmd0aCkKe3JldHVybiB0cnVlfQpmb3IodmFyIHNwPSh2b2lkIDApLGk9MDtpPGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOysraSl7c3A9bGluZS5tYXJrZWRTcGFuc1tpXTtpZihzcC5tYXJrZXIuY29sbGFwc2VkJiYhc3AubWFya2VyLndpZGdldE5vZGUmJnNwLmZyb209PXNwYW4udG8mJihzcC50bz09bnVsbHx8c3AudG8hPXNwYW4uZnJvbSkmJihzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdHx8c3Bhbi5tYXJrZXIuaW5jbHVzaXZlUmlnaHQpJiZsaW5lSXNIaWRkZW5Jbm5lcihkb2MsbGluZSxzcCkpe3JldHVybiB0cnVlfX19CmZ1bmN0aW9uIGhlaWdodEF0TGluZShsaW5lT2JqKXtsaW5lT2JqPXZpc3VhbExpbmUobGluZU9iaik7dmFyIGg9MCxjaHVuaz1saW5lT2JqLnBhcmVudDtmb3IodmFyIGk9MDtpPGNodW5rLmxpbmVzLmxlbmd0aDsrK2kpe3ZhciBsaW5lPWNodW5rLmxpbmVzW2ldO2lmKGxpbmU9PWxpbmVPYmope2JyZWFrfQplbHNle2grPWxpbmUuaGVpZ2h0O319CmZvcih2YXIgcD1jaHVuay5wYXJlbnQ7cDtjaHVuaz1wLHA9Y2h1bmsucGFyZW50KXtmb3IodmFyIGkkMT0wO2kkMTxwLmNoaWxkcmVuLmxlbmd0aDsrK2kkMSl7dmFyIGN1cj1wLmNoaWxkcmVuW2kkMV07aWYoY3VyPT1jaHVuayl7YnJlYWt9CmVsc2V7aCs9Y3VyLmhlaWdodDt9fX0KcmV0dXJuIGh9CmZ1bmN0aW9uIGxpbmVMZW5ndGgobGluZSl7aWYobGluZS5oZWlnaHQ9PTApe3JldHVybiAwfQp2YXIgbGVuPWxpbmUudGV4dC5sZW5ndGgsbWVyZ2VkLGN1cj1saW5lO3doaWxlKG1lcmdlZD1jb2xsYXBzZWRTcGFuQXRTdGFydChjdXIpKXt2YXIgZm91bmQ9bWVyZ2VkLmZpbmQoMCx0cnVlKTtjdXI9Zm91bmQuZnJvbS5saW5lO2xlbis9Zm91bmQuZnJvbS5jaC1mb3VuZC50by5jaDt9CmN1cj1saW5lO3doaWxlKG1lcmdlZD1jb2xsYXBzZWRTcGFuQXRFbmQoY3VyKSl7dmFyIGZvdW5kJDE9bWVyZ2VkLmZpbmQoMCx0cnVlKTtsZW4tPWN1ci50ZXh0Lmxlbmd0aC1mb3VuZCQxLmZyb20uY2g7Y3VyPWZvdW5kJDEudG8ubGluZTtsZW4rPWN1ci50ZXh0Lmxlbmd0aC1mb3VuZCQxLnRvLmNoO30KcmV0dXJuIGxlbn0KZnVuY3Rpb24gZmluZE1heExpbmUoY20pe3ZhciBkPWNtLmRpc3BsYXksZG9jPWNtLmRvYztkLm1heExpbmU9Z2V0TGluZShkb2MsZG9jLmZpcnN0KTtkLm1heExpbmVMZW5ndGg9bGluZUxlbmd0aChkLm1heExpbmUpO2QubWF4TGluZUNoYW5nZWQ9dHJ1ZTtkb2MuaXRlcihmdW5jdGlvbihsaW5lKXt2YXIgbGVuPWxpbmVMZW5ndGgobGluZSk7aWYobGVuPmQubWF4TGluZUxlbmd0aCl7ZC5tYXhMaW5lTGVuZ3RoPWxlbjtkLm1heExpbmU9bGluZTt9fSk7fQpmdW5jdGlvbiBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLGZyb20sdG8sZil7aWYoIW9yZGVyKXtyZXR1cm4gZihmcm9tLHRvLCJsdHIiLDApfQp2YXIgZm91bmQ9ZmFsc2U7Zm9yKHZhciBpPTA7aTxvcmRlci5sZW5ndGg7KytpKXt2YXIgcGFydD1vcmRlcltpXTtpZihwYXJ0LmZyb208dG8mJnBhcnQudG8+ZnJvbXx8ZnJvbT09dG8mJnBhcnQudG89PWZyb20pe2YoTWF0aC5tYXgocGFydC5mcm9tLGZyb20pLE1hdGgubWluKHBhcnQudG8sdG8pLHBhcnQubGV2ZWw9PTE/InJ0bCI6Imx0ciIsaSk7Zm91bmQ9dHJ1ZTt9fQppZighZm91bmQpe2YoZnJvbSx0bywibHRyIik7fX0KdmFyIGJpZGlPdGhlcj1udWxsO2Z1bmN0aW9uIGdldEJpZGlQYXJ0QXQob3JkZXIsY2gsc3RpY2t5KXt2YXIgZm91bmQ7YmlkaU90aGVyPW51bGw7Zm9yKHZhciBpPTA7aTxvcmRlci5sZW5ndGg7KytpKXt2YXIgY3VyPW9yZGVyW2ldO2lmKGN1ci5mcm9tPGNoJiZjdXIudG8+Y2gpe3JldHVybiBpfQppZihjdXIudG89PWNoKXtpZihjdXIuZnJvbSE9Y3VyLnRvJiZzdGlja3k9PSJiZWZvcmUiKXtmb3VuZD1pO30KZWxzZXtiaWRpT3RoZXI9aTt9fQppZihjdXIuZnJvbT09Y2gpe2lmKGN1ci5mcm9tIT1jdXIudG8mJnN0aWNreSE9ImJlZm9yZSIpe2ZvdW5kPWk7fQplbHNle2JpZGlPdGhlcj1pO319fQpyZXR1cm4gZm91bmQhPW51bGw/Zm91bmQ6YmlkaU90aGVyfQp2YXIgYmlkaU9yZGVyaW5nPShmdW5jdGlvbigpe3ZhciBsb3dUeXBlcz0iYmJiYmJiYmJidHN0d3NiYmJiYmJiYmJiYmJiYnNzc3R3Tk4lJSVOTk5OTk4sTixOMTExMTExMTExMU5OTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTExMTk5OTmJiYmJiYnNiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYixOJSUlJU5OTk5MTk5OTk4lJTExTkxOTk4xTE5OTk5OTExMTExMTExMTExMTExMTExMTExMTExOTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE4iO3ZhciBhcmFiaWNUeXBlcz0ibm5ubm5uTk5yJSVyLHJOTm1tbW1tbW1tbW1tcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybW1tbW1tbW1tbW1tbW1tbW1tbW1tbm5ubm5ubm5ubiVubnJycm1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1uTm1tbW1tbXJybW1ObW1tbXJyMTExMTExMTExMSI7ZnVuY3Rpb24gY2hhclR5cGUoY29kZSl7aWYoY29kZTw9MHhmNyl7cmV0dXJuIGxvd1R5cGVzLmNoYXJBdChjb2RlKX0KZWxzZSBpZigweDU5MDw9Y29kZSYmY29kZTw9MHg1ZjQpe3JldHVybiJSIn0KZWxzZSBpZigweDYwMDw9Y29kZSYmY29kZTw9MHg2Zjkpe3JldHVybiBhcmFiaWNUeXBlcy5jaGFyQXQoY29kZS0weDYwMCl9CmVsc2UgaWYoMHg2ZWU8PWNvZGUmJmNvZGU8PTB4OGFjKXtyZXR1cm4iciJ9CmVsc2UgaWYoMHgyMDAwPD1jb2RlJiZjb2RlPD0weDIwMGIpe3JldHVybiJ3In0KZWxzZSBpZihjb2RlPT0weDIwMGMpe3JldHVybiJiIn0KZWxzZXtyZXR1cm4iTCJ9fQp2YXIgYmlkaVJFPS9bXHUwNTkwLVx1MDVmNFx1MDYwMC1cdTA2ZmZcdTA3MDAtXHUwOGFjXS87dmFyIGlzTmV1dHJhbD0vW3N0d05dLyxpc1N0cm9uZz0vW0xScl0vLGNvdW50c0FzTGVmdD0vW0xiMW5dLyxjb3VudHNBc051bT0vWzFuXS87ZnVuY3Rpb24gQmlkaVNwYW4obGV2ZWwsZnJvbSx0byl7dGhpcy5sZXZlbD1sZXZlbDt0aGlzLmZyb209ZnJvbTt0aGlzLnRvPXRvO30KcmV0dXJuIGZ1bmN0aW9uKHN0cixkaXJlY3Rpb24pe3ZhciBvdXRlclR5cGU9ZGlyZWN0aW9uPT0ibHRyIj8iTCI6IlIiO2lmKHN0ci5sZW5ndGg9PTB8fGRpcmVjdGlvbj09Imx0ciImJiFiaWRpUkUudGVzdChzdHIpKXtyZXR1cm4gZmFsc2V9CnZhciBsZW49c3RyLmxlbmd0aCx0eXBlcz1bXTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpCnt0eXBlcy5wdXNoKGNoYXJUeXBlKHN0ci5jaGFyQ29kZUF0KGkpKSk7fQpmb3IodmFyIGkkMT0wLHByZXY9b3V0ZXJUeXBlO2kkMTxsZW47KytpJDEpe3ZhciB0eXBlPXR5cGVzW2kkMV07aWYodHlwZT09Im0iKXt0eXBlc1tpJDFdPXByZXY7fQplbHNle3ByZXY9dHlwZTt9fQpmb3IodmFyIGkkMj0wLGN1cj1vdXRlclR5cGU7aSQyPGxlbjsrK2kkMil7dmFyIHR5cGUkMT10eXBlc1tpJDJdO2lmKHR5cGUkMT09IjEiJiZjdXI9PSJyIil7dHlwZXNbaSQyXT0ibiI7fQplbHNlIGlmKGlzU3Ryb25nLnRlc3QodHlwZSQxKSl7Y3VyPXR5cGUkMTtpZih0eXBlJDE9PSJyIil7dHlwZXNbaSQyXT0iUiI7fX19CmZvcih2YXIgaSQzPTEscHJldiQxPXR5cGVzWzBdO2kkMzxsZW4tMTsrK2kkMyl7dmFyIHR5cGUkMj10eXBlc1tpJDNdO2lmKHR5cGUkMj09IisiJiZwcmV2JDE9PSIxIiYmdHlwZXNbaSQzKzFdPT0iMSIpe3R5cGVzW2kkM109IjEiO30KZWxzZSBpZih0eXBlJDI9PSIsIiYmcHJldiQxPT10eXBlc1tpJDMrMV0mJihwcmV2JDE9PSIxInx8cHJldiQxPT0ibiIpKXt0eXBlc1tpJDNdPXByZXYkMTt9CnByZXYkMT10eXBlJDI7fQpmb3IodmFyIGkkND0wO2kkNDxsZW47KytpJDQpe3ZhciB0eXBlJDM9dHlwZXNbaSQ0XTtpZih0eXBlJDM9PSIsIil7dHlwZXNbaSQ0XT0iTiI7fQplbHNlIGlmKHR5cGUkMz09IiUiKXt2YXIgZW5kPSh2b2lkIDApO2ZvcihlbmQ9aSQ0KzE7ZW5kPGxlbiYmdHlwZXNbZW5kXT09IiUiOysrZW5kKXt9CnZhciByZXBsYWNlPShpJDQmJnR5cGVzW2kkNC0xXT09IiEiKXx8KGVuZDxsZW4mJnR5cGVzW2VuZF09PSIxIik/IjEiOiJOIjtmb3IodmFyIGo9aSQ0O2o8ZW5kOysrail7dHlwZXNbal09cmVwbGFjZTt9CmkkND1lbmQtMTt9fQpmb3IodmFyIGkkNT0wLGN1ciQxPW91dGVyVHlwZTtpJDU8bGVuOysraSQ1KXt2YXIgdHlwZSQ0PXR5cGVzW2kkNV07aWYoY3VyJDE9PSJMIiYmdHlwZSQ0PT0iMSIpe3R5cGVzW2kkNV09IkwiO30KZWxzZSBpZihpc1N0cm9uZy50ZXN0KHR5cGUkNCkpe2N1ciQxPXR5cGUkNDt9fQpmb3IodmFyIGkkNj0wO2kkNjxsZW47KytpJDYpe2lmKGlzTmV1dHJhbC50ZXN0KHR5cGVzW2kkNl0pKXt2YXIgZW5kJDE9KHZvaWQgMCk7Zm9yKGVuZCQxPWkkNisxO2VuZCQxPGxlbiYmaXNOZXV0cmFsLnRlc3QodHlwZXNbZW5kJDFdKTsrK2VuZCQxKXt9CnZhciBiZWZvcmU9KGkkNj90eXBlc1tpJDYtMV06b3V0ZXJUeXBlKT09IkwiO3ZhciBhZnRlcj0oZW5kJDE8bGVuP3R5cGVzW2VuZCQxXTpvdXRlclR5cGUpPT0iTCI7dmFyIHJlcGxhY2UkMT1iZWZvcmU9PWFmdGVyPyhiZWZvcmU/IkwiOiJSIik6b3V0ZXJUeXBlO2Zvcih2YXIgaiQxPWkkNjtqJDE8ZW5kJDE7KytqJDEpe3R5cGVzW2okMV09cmVwbGFjZSQxO30KaSQ2PWVuZCQxLTE7fX0KdmFyIG9yZGVyPVtdLG07Zm9yKHZhciBpJDc9MDtpJDc8bGVuOyl7aWYoY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaSQ3XSkpe3ZhciBzdGFydD1pJDc7Zm9yKCsraSQ3O2kkNzxsZW4mJmNvdW50c0FzTGVmdC50ZXN0KHR5cGVzW2kkN10pOysraSQ3KXt9Cm9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKDAsc3RhcnQsaSQ3KSk7fWVsc2V7dmFyIHBvcz1pJDcsYXQ9b3JkZXIubGVuZ3RoO2ZvcigrK2kkNztpJDc8bGVuJiZ0eXBlc1tpJDddIT0iTCI7KytpJDcpe30KZm9yKHZhciBqJDI9cG9zO2okMjxpJDc7KXtpZihjb3VudHNBc051bS50ZXN0KHR5cGVzW2okMl0pKXtpZihwb3M8aiQyKXtvcmRlci5zcGxpY2UoYXQsMCxuZXcgQmlkaVNwYW4oMSxwb3MsaiQyKSk7fQp2YXIgbnN0YXJ0PWokMjtmb3IoKytqJDI7aiQyPGkkNyYmY291bnRzQXNOdW0udGVzdCh0eXBlc1tqJDJdKTsrK2okMil7fQpvcmRlci5zcGxpY2UoYXQsMCxuZXcgQmlkaVNwYW4oMixuc3RhcnQsaiQyKSk7cG9zPWokMjt9ZWxzZXsrK2okMjt9fQppZihwb3M8aSQ3KXtvcmRlci5zcGxpY2UoYXQsMCxuZXcgQmlkaVNwYW4oMSxwb3MsaSQ3KSk7fX19CmlmKGRpcmVjdGlvbj09Imx0ciIpe2lmKG9yZGVyWzBdLmxldmVsPT0xJiYobT1zdHIubWF0Y2goL15ccysvKSkpe29yZGVyWzBdLmZyb209bVswXS5sZW5ndGg7b3JkZXIudW5zaGlmdChuZXcgQmlkaVNwYW4oMCwwLG1bMF0ubGVuZ3RoKSk7fQppZihsc3Qob3JkZXIpLmxldmVsPT0xJiYobT1zdHIubWF0Y2goL1xzKyQvKSkpe2xzdChvcmRlcikudG8tPW1bMF0ubGVuZ3RoO29yZGVyLnB1c2gobmV3IEJpZGlTcGFuKDAsbGVuLW1bMF0ubGVuZ3RoLGxlbikpO319CnJldHVybiBkaXJlY3Rpb249PSJydGwiP29yZGVyLnJldmVyc2UoKTpvcmRlcn19KSgpO2Z1bmN0aW9uIGdldE9yZGVyKGxpbmUsZGlyZWN0aW9uKXt2YXIgb3JkZXI9bGluZS5vcmRlcjtpZihvcmRlcj09bnVsbCl7b3JkZXI9bGluZS5vcmRlcj1iaWRpT3JkZXJpbmcobGluZS50ZXh0LGRpcmVjdGlvbik7fQpyZXR1cm4gb3JkZXJ9CnZhciBub0hhbmRsZXJzPVtdO3ZhciBvbj1mdW5jdGlvbihlbWl0dGVyLHR5cGUsZil7aWYoZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKXtlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxmLGZhbHNlKTt9ZWxzZSBpZihlbWl0dGVyLmF0dGFjaEV2ZW50KXtlbWl0dGVyLmF0dGFjaEV2ZW50KCJvbiIrdHlwZSxmKTt9ZWxzZXt2YXIgbWFwJCQxPWVtaXR0ZXIuX2hhbmRsZXJzfHwoZW1pdHRlci5faGFuZGxlcnM9e30pO21hcCQkMVt0eXBlXT0obWFwJCQxW3R5cGVdfHxub0hhbmRsZXJzKS5jb25jYXQoZik7fX07ZnVuY3Rpb24gZ2V0SGFuZGxlcnMoZW1pdHRlcix0eXBlKXtyZXR1cm4gZW1pdHRlci5faGFuZGxlcnMmJmVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdfHxub0hhbmRsZXJzfQpmdW5jdGlvbiBvZmYoZW1pdHRlcix0eXBlLGYpe2lmKGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcil7ZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsZixmYWxzZSk7fWVsc2UgaWYoZW1pdHRlci5kZXRhY2hFdmVudCl7ZW1pdHRlci5kZXRhY2hFdmVudCgib24iK3R5cGUsZik7fWVsc2V7dmFyIG1hcCQkMT1lbWl0dGVyLl9oYW5kbGVycyxhcnI9bWFwJCQxJiZtYXAkJDFbdHlwZV07aWYoYXJyKXt2YXIgaW5kZXg9aW5kZXhPZihhcnIsZik7aWYoaW5kZXg+LTEpCnttYXAkJDFbdHlwZV09YXJyLnNsaWNlKDAsaW5kZXgpLmNvbmNhdChhcnIuc2xpY2UoaW5kZXgrMSkpO319fX0KZnVuY3Rpb24gc2lnbmFsKGVtaXR0ZXIsdHlwZSl7dmFyIGhhbmRsZXJzPWdldEhhbmRsZXJzKGVtaXR0ZXIsdHlwZSk7aWYoIWhhbmRsZXJzLmxlbmd0aCl7cmV0dXJufQp2YXIgYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7Zm9yKHZhciBpPTA7aTxoYW5kbGVycy5sZW5ndGg7KytpKXtoYW5kbGVyc1tpXS5hcHBseShudWxsLGFyZ3MpO319CmZ1bmN0aW9uIHNpZ25hbERPTUV2ZW50KGNtLGUsb3ZlcnJpZGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIikKe2U9e3R5cGU6ZSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD10cnVlO319O30Kc2lnbmFsKGNtLG92ZXJyaWRlfHxlLnR5cGUsY20sZSk7cmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKXx8ZS5jb2RlbWlycm9ySWdub3JlfQpmdW5jdGlvbiBzaWduYWxDdXJzb3JBY3Rpdml0eShjbSl7dmFyIGFycj1jbS5faGFuZGxlcnMmJmNtLl9oYW5kbGVycy5jdXJzb3JBY3Rpdml0eTtpZighYXJyKXtyZXR1cm59CnZhciBzZXQ9Y20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVyc3x8KGNtLmN1ck9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnM9W10pO2Zvcih2YXIgaT0wO2k8YXJyLmxlbmd0aDsrK2kpe2lmKGluZGV4T2Yoc2V0LGFycltpXSk9PS0xKQp7c2V0LnB1c2goYXJyW2ldKTt9fX0KZnVuY3Rpb24gaGFzSGFuZGxlcihlbWl0dGVyLHR5cGUpe3JldHVybiBnZXRIYW5kbGVycyhlbWl0dGVyLHR5cGUpLmxlbmd0aD4wfQpmdW5jdGlvbiBldmVudE1peGluKGN0b3Ipe2N0b3IucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHR5cGUsZil7b24odGhpcyx0eXBlLGYpO307Y3Rvci5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKHR5cGUsZil7b2ZmKHRoaXMsdHlwZSxmKTt9O30KZnVuY3Rpb24gZV9wcmV2ZW50RGVmYXVsdChlKXtpZihlLnByZXZlbnREZWZhdWx0KXtlLnByZXZlbnREZWZhdWx0KCk7fQplbHNle2UucmV0dXJuVmFsdWU9ZmFsc2U7fX0KZnVuY3Rpb24gZV9zdG9wUHJvcGFnYXRpb24oZSl7aWYoZS5zdG9wUHJvcGFnYXRpb24pe2Uuc3RvcFByb3BhZ2F0aW9uKCk7fQplbHNle2UuY2FuY2VsQnViYmxlPXRydWU7fX0KZnVuY3Rpb24gZV9kZWZhdWx0UHJldmVudGVkKGUpe3JldHVybiBlLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/ZS5kZWZhdWx0UHJldmVudGVkOmUucmV0dXJuVmFsdWU9PWZhbHNlfQpmdW5jdGlvbiBlX3N0b3AoZSl7ZV9wcmV2ZW50RGVmYXVsdChlKTtlX3N0b3BQcm9wYWdhdGlvbihlKTt9CmZ1bmN0aW9uIGVfdGFyZ2V0KGUpe3JldHVybiBlLnRhcmdldHx8ZS5zcmNFbGVtZW50fQpmdW5jdGlvbiBlX2J1dHRvbihlKXt2YXIgYj1lLndoaWNoO2lmKGI9PW51bGwpe2lmKGUuYnV0dG9uJjEpe2I9MTt9CmVsc2UgaWYoZS5idXR0b24mMil7Yj0zO30KZWxzZSBpZihlLmJ1dHRvbiY0KXtiPTI7fX0KaWYobWFjJiZlLmN0cmxLZXkmJmI9PTEpe2I9Mzt9CnJldHVybiBifQp2YXIgZHJhZ0FuZERyb3A9ZnVuY3Rpb24oKXtpZihpZSYmaWVfdmVyc2lvbjw5KXtyZXR1cm4gZmFsc2V9CnZhciBkaXY9ZWx0KCdkaXYnKTtyZXR1cm4iZHJhZ2dhYmxlImluIGRpdnx8ImRyYWdEcm9wImluIGRpdn0oKTt2YXIgendzcFN1cHBvcnRlZDtmdW5jdGlvbiB6ZXJvV2lkdGhFbGVtZW50KG1lYXN1cmUpe2lmKHp3c3BTdXBwb3J0ZWQ9PW51bGwpe3ZhciB0ZXN0PWVsdCgic3BhbiIsIlx1MjAwYiIpO3JlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsZWx0KCJzcGFuIixbdGVzdCxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpXSkpO2lmKG1lYXN1cmUuZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQhPTApCnt6d3NwU3VwcG9ydGVkPXRlc3Qub2Zmc2V0V2lkdGg8PTEmJnRlc3Qub2Zmc2V0SGVpZ2h0PjImJiEoaWUmJmllX3ZlcnNpb248OCk7fX0KdmFyIG5vZGU9endzcFN1cHBvcnRlZD9lbHQoInNwYW4iLCJcdTIwMGIiKTplbHQoInNwYW4iLCJcdTAwYTAiLG51bGwsImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDFweDsgbWFyZ2luLXJpZ2h0OiAtMXB4Iik7bm9kZS5zZXRBdHRyaWJ1dGUoImNtLXRleHQiLCIiKTtyZXR1cm4gbm9kZX0KdmFyIGJhZEJpZGlSZWN0cztmdW5jdGlvbiBoYXNCYWRCaWRpUmVjdHMobWVhc3VyZSl7aWYoYmFkQmlkaVJlY3RzIT1udWxsKXtyZXR1cm4gYmFkQmlkaVJlY3RzfQp2YXIgdHh0PXJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkFcdTA2MmVBIikpO3ZhciByMD1yYW5nZSh0eHQsMCwxKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgcjE9cmFuZ2UodHh0LDEsMikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmVtb3ZlQ2hpbGRyZW4obWVhc3VyZSk7aWYoIXIwfHxyMC5sZWZ0PT1yMC5yaWdodCl7cmV0dXJuIGZhbHNlfQpyZXR1cm4gYmFkQmlkaVJlY3RzPShyMS5yaWdodC1yMC5yaWdodDwzKX0KdmFyIHNwbGl0TGluZXNBdXRvPSJcblxuYiIuc3BsaXQoL1xuLykubGVuZ3RoIT0zP2Z1bmN0aW9uKHN0cmluZyl7dmFyIHBvcz0wLHJlc3VsdD1bXSxsPXN0cmluZy5sZW5ndGg7d2hpbGUocG9zPD1sKXt2YXIgbmw9c3RyaW5nLmluZGV4T2YoIlxuIixwb3MpO2lmKG5sPT0tMSl7bmw9c3RyaW5nLmxlbmd0aDt9CnZhciBsaW5lPXN0cmluZy5zbGljZShwb3Msc3RyaW5nLmNoYXJBdChubC0xKT09IlxyIj9ubC0xOm5sKTt2YXIgcnQ9bGluZS5pbmRleE9mKCJcciIpO2lmKHJ0IT0tMSl7cmVzdWx0LnB1c2gobGluZS5zbGljZSgwLHJ0KSk7cG9zKz1ydCsxO31lbHNle3Jlc3VsdC5wdXNoKGxpbmUpO3Bvcz1ubCsxO319CnJldHVybiByZXN1bHR9OmZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgvXHJcbj98XG4vKTt9O3ZhciBoYXNTZWxlY3Rpb249d2luZG93LmdldFNlbGVjdGlvbj9mdW5jdGlvbih0ZSl7dHJ5e3JldHVybiB0ZS5zZWxlY3Rpb25TdGFydCE9dGUuc2VsZWN0aW9uRW5kfQpjYXRjaChlKXtyZXR1cm4gZmFsc2V9fTpmdW5jdGlvbih0ZSl7dmFyIHJhbmdlJCQxO3RyeXtyYW5nZSQkMT10ZS5vd25lckRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO30KY2F0Y2goZSl7fQppZighcmFuZ2UkJDF8fHJhbmdlJCQxLnBhcmVudEVsZW1lbnQoKSE9dGUpe3JldHVybiBmYWxzZX0KcmV0dXJuIHJhbmdlJCQxLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLHJhbmdlJCQxKSE9MH07dmFyIGhhc0NvcHlFdmVudD0oZnVuY3Rpb24oKXt2YXIgZT1lbHQoImRpdiIpO2lmKCJvbmNvcHkiaW4gZSl7cmV0dXJuIHRydWV9CmUuc2V0QXR0cmlidXRlKCJvbmNvcHkiLCJyZXR1cm47Iik7cmV0dXJuIHR5cGVvZiBlLm9uY29weT09ImZ1bmN0aW9uIn0pKCk7dmFyIGJhZFpvb21lZFJlY3RzPW51bGw7ZnVuY3Rpb24gaGFzQmFkWm9vbWVkUmVjdHMobWVhc3VyZSl7aWYoYmFkWm9vbWVkUmVjdHMhPW51bGwpe3JldHVybiBiYWRab29tZWRSZWN0c30KdmFyIG5vZGU9cmVtb3ZlQ2hpbGRyZW5BbmRBZGQobWVhc3VyZSxlbHQoInNwYW4iLCJ4IikpO3ZhciBub3JtYWw9bm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgZnJvbVJhbmdlPXJhbmdlKG5vZGUsMCwxKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gYmFkWm9vbWVkUmVjdHM9TWF0aC5hYnMobm9ybWFsLmxlZnQtZnJvbVJhbmdlLmxlZnQpPjF9CnZhciBtb2Rlcz17fTt2YXIgbWltZU1vZGVzPXt9O2Z1bmN0aW9uIGRlZmluZU1vZGUobmFtZSxtb2RlKXtpZihhcmd1bWVudHMubGVuZ3RoPjIpCnttb2RlLmRlcGVuZGVuY2llcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7fQptb2Rlc1tuYW1lXT1tb2RlO30KZnVuY3Rpb24gZGVmaW5lTUlNRShtaW1lLHNwZWMpe21pbWVNb2Rlc1ttaW1lXT1zcGVjO30KZnVuY3Rpb24gcmVzb2x2ZU1vZGUoc3BlYyl7aWYodHlwZW9mIHNwZWM9PSJzdHJpbmciJiZtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYykpe3NwZWM9bWltZU1vZGVzW3NwZWNdO31lbHNlIGlmKHNwZWMmJnR5cGVvZiBzcGVjLm5hbWU9PSJzdHJpbmciJiZtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSl7dmFyIGZvdW5kPW1pbWVNb2Rlc1tzcGVjLm5hbWVdO2lmKHR5cGVvZiBmb3VuZD09InN0cmluZyIpe2ZvdW5kPXtuYW1lOmZvdW5kfTt9CnNwZWM9Y3JlYXRlT2JqKGZvdW5kLHNwZWMpO3NwZWMubmFtZT1mb3VuZC5uYW1lO31lbHNlIGlmKHR5cGVvZiBzcGVjPT0ic3RyaW5nIiYmL15bXHdcLV0rXC9bXHdcLV0rXCt4bWwkLy50ZXN0KHNwZWMpKXtyZXR1cm4gcmVzb2x2ZU1vZGUoImFwcGxpY2F0aW9uL3htbCIpfWVsc2UgaWYodHlwZW9mIHNwZWM9PSJzdHJpbmciJiYvXltcd1wtXStcL1tcd1wtXStcK2pzb24kLy50ZXN0KHNwZWMpKXtyZXR1cm4gcmVzb2x2ZU1vZGUoImFwcGxpY2F0aW9uL2pzb24iKX0KaWYodHlwZW9mIHNwZWM9PSJzdHJpbmciKXtyZXR1cm57bmFtZTpzcGVjfX0KZWxzZXtyZXR1cm4gc3BlY3x8e25hbWU6Im51bGwifX19CmZ1bmN0aW9uIGdldE1vZGUob3B0aW9ucyxzcGVjKXtzcGVjPXJlc29sdmVNb2RlKHNwZWMpO3ZhciBtZmFjdG9yeT1tb2Rlc1tzcGVjLm5hbWVdO2lmKCFtZmFjdG9yeSl7cmV0dXJuIGdldE1vZGUob3B0aW9ucywidGV4dC9wbGFpbiIpfQp2YXIgbW9kZU9iaj1tZmFjdG9yeShvcHRpb25zLHNwZWMpO2lmKG1vZGVFeHRlbnNpb25zLmhhc093blByb3BlcnR5KHNwZWMubmFtZSkpe3ZhciBleHRzPW1vZGVFeHRlbnNpb25zW3NwZWMubmFtZV07Zm9yKHZhciBwcm9wIGluIGV4dHMpe2lmKCFleHRzLmhhc093blByb3BlcnR5KHByb3ApKXtjb250aW51ZX0KaWYobW9kZU9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSl7bW9kZU9ialsiXyIrcHJvcF09bW9kZU9ialtwcm9wXTt9Cm1vZGVPYmpbcHJvcF09ZXh0c1twcm9wXTt9fQptb2RlT2JqLm5hbWU9c3BlYy5uYW1lO2lmKHNwZWMuaGVscGVyVHlwZSl7bW9kZU9iai5oZWxwZXJUeXBlPXNwZWMuaGVscGVyVHlwZTt9CmlmKHNwZWMubW9kZVByb3BzKXtmb3IodmFyIHByb3AkMSBpbiBzcGVjLm1vZGVQcm9wcykKe21vZGVPYmpbcHJvcCQxXT1zcGVjLm1vZGVQcm9wc1twcm9wJDFdO319CnJldHVybiBtb2RlT2JqfQp2YXIgbW9kZUV4dGVuc2lvbnM9e307ZnVuY3Rpb24gZXh0ZW5kTW9kZShtb2RlLHByb3BlcnRpZXMpe3ZhciBleHRzPW1vZGVFeHRlbnNpb25zLmhhc093blByb3BlcnR5KG1vZGUpP21vZGVFeHRlbnNpb25zW21vZGVdOihtb2RlRXh0ZW5zaW9uc1ttb2RlXT17fSk7Y29weU9iaihwcm9wZXJ0aWVzLGV4dHMpO30KZnVuY3Rpb24gY29weVN0YXRlKG1vZGUsc3RhdGUpe2lmKHN0YXRlPT09dHJ1ZSl7cmV0dXJuIHN0YXRlfQppZihtb2RlLmNvcHlTdGF0ZSl7cmV0dXJuIG1vZGUuY29weVN0YXRlKHN0YXRlKX0KdmFyIG5zdGF0ZT17fTtmb3IodmFyIG4gaW4gc3RhdGUpe3ZhciB2YWw9c3RhdGVbbl07aWYodmFsIGluc3RhbmNlb2YgQXJyYXkpe3ZhbD12YWwuY29uY2F0KFtdKTt9Cm5zdGF0ZVtuXT12YWw7fQpyZXR1cm4gbnN0YXRlfQpmdW5jdGlvbiBpbm5lck1vZGUobW9kZSxzdGF0ZSl7dmFyIGluZm87d2hpbGUobW9kZS5pbm5lck1vZGUpe2luZm89bW9kZS5pbm5lck1vZGUoc3RhdGUpO2lmKCFpbmZvfHxpbmZvLm1vZGU9PW1vZGUpe2JyZWFrfQpzdGF0ZT1pbmZvLnN0YXRlO21vZGU9aW5mby5tb2RlO30KcmV0dXJuIGluZm98fHttb2RlOm1vZGUsc3RhdGU6c3RhdGV9fQpmdW5jdGlvbiBzdGFydFN0YXRlKG1vZGUsYTEsYTIpe3JldHVybiBtb2RlLnN0YXJ0U3RhdGU/bW9kZS5zdGFydFN0YXRlKGExLGEyKTp0cnVlfQp2YXIgU3RyaW5nU3RyZWFtPWZ1bmN0aW9uKHN0cmluZyx0YWJTaXplLGxpbmVPcmFjbGUpe3RoaXMucG9zPXRoaXMuc3RhcnQ9MDt0aGlzLnN0cmluZz1zdHJpbmc7dGhpcy50YWJTaXplPXRhYlNpemV8fDg7dGhpcy5sYXN0Q29sdW1uUG9zPXRoaXMubGFzdENvbHVtblZhbHVlPTA7dGhpcy5saW5lU3RhcnQ9MDt0aGlzLmxpbmVPcmFjbGU9bGluZU9yYWNsZTt9O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuZW9sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLnN0cmluZy5sZW5ndGh9O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuc29sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zPT10aGlzLmxpbmVTdGFydH07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcyl8fHVuZGVmaW5lZH07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3M8dGhpcy5zdHJpbmcubGVuZ3RoKQp7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKX19O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0PWZ1bmN0aW9uKG1hdGNoKXt2YXIgY2g9dGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTt2YXIgb2s7aWYodHlwZW9mIG1hdGNoPT0ic3RyaW5nIil7b2s9Y2g9PW1hdGNoO30KZWxzZXtvaz1jaCYmKG1hdGNoLnRlc3Q/bWF0Y2gudGVzdChjaCk6bWF0Y2goY2gpKTt9CmlmKG9rKXsrK3RoaXMucG9zO3JldHVybiBjaH19O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuZWF0V2hpbGU9ZnVuY3Rpb24obWF0Y2gpe3ZhciBzdGFydD10aGlzLnBvczt3aGlsZSh0aGlzLmVhdChtYXRjaCkpe30KcmV0dXJuIHRoaXMucG9zPnN0YXJ0fTtTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmVhdFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBzdGFydD10aGlzLnBvczt3aGlsZSgvW1xzXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSl7Kyt0aGlzJDEucG9zO30KcmV0dXJuIHRoaXMucG9zPnN0YXJ0fTtTdHJpbmdTdHJlYW0ucHJvdG90eXBlLnNraXBUb0VuZD1mdW5jdGlvbigpe3RoaXMucG9zPXRoaXMuc3RyaW5nLmxlbmd0aDt9O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuc2tpcFRvPWZ1bmN0aW9uKGNoKXt2YXIgZm91bmQ9dGhpcy5zdHJpbmcuaW5kZXhPZihjaCx0aGlzLnBvcyk7aWYoZm91bmQ+LTEpe3RoaXMucG9zPWZvdW5kO3JldHVybiB0cnVlfX07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5iYWNrVXA9ZnVuY3Rpb24obil7dGhpcy5wb3MtPW47fTtTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmNvbHVtbj1mdW5jdGlvbigpe2lmKHRoaXMubGFzdENvbHVtblBvczx0aGlzLnN0YXJ0KXt0aGlzLmxhc3RDb2x1bW5WYWx1ZT1jb3VudENvbHVtbih0aGlzLnN0cmluZyx0aGlzLnN0YXJ0LHRoaXMudGFiU2l6ZSx0aGlzLmxhc3RDb2x1bW5Qb3MsdGhpcy5sYXN0Q29sdW1uVmFsdWUpO3RoaXMubGFzdENvbHVtblBvcz10aGlzLnN0YXJ0O30KcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlLSh0aGlzLmxpbmVTdGFydD9jb3VudENvbHVtbih0aGlzLnN0cmluZyx0aGlzLmxpbmVTdGFydCx0aGlzLnRhYlNpemUpOjApfTtTdHJpbmdTdHJlYW0ucHJvdG90eXBlLmluZGVudGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLG51bGwsdGhpcy50YWJTaXplKS0KKHRoaXMubGluZVN0YXJ0P2NvdW50Q29sdW1uKHRoaXMuc3RyaW5nLHRoaXMubGluZVN0YXJ0LHRoaXMudGFiU2l6ZSk6MCl9O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24ocGF0dGVybixjb25zdW1lLGNhc2VJbnNlbnNpdGl2ZSl7aWYodHlwZW9mIHBhdHRlcm49PSJzdHJpbmciKXt2YXIgY2FzZWQ9ZnVuY3Rpb24oc3RyKXtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlP3N0ci50b0xvd2VyQ2FzZSgpOnN0cjt9O3ZhciBzdWJzdHI9dGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLHBhdHRlcm4ubGVuZ3RoKTtpZihjYXNlZChzdWJzdHIpPT1jYXNlZChwYXR0ZXJuKSl7aWYoY29uc3VtZSE9PWZhbHNlKXt0aGlzLnBvcys9cGF0dGVybi5sZW5ndGg7fQpyZXR1cm4gdHJ1ZX19ZWxzZXt2YXIgbWF0Y2g9dGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pO2lmKG1hdGNoJiZtYXRjaC5pbmRleD4wKXtyZXR1cm4gbnVsbH0KaWYobWF0Y2gmJmNvbnN1bWUhPT1mYWxzZSl7dGhpcy5wb3MrPW1hdGNoWzBdLmxlbmd0aDt9CnJldHVybiBtYXRjaH19O1N0cmluZ1N0cmVhbS5wcm90b3R5cGUuY3VycmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LHRoaXMucG9zKX07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5oaWRlRmlyc3RDaGFycz1mdW5jdGlvbihuLGlubmVyKXt0aGlzLmxpbmVTdGFydCs9bjt0cnl7cmV0dXJuIGlubmVyKCl9CmZpbmFsbHl7dGhpcy5saW5lU3RhcnQtPW47fX07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5sb29rQWhlYWQ9ZnVuY3Rpb24obil7dmFyIG9yYWNsZT10aGlzLmxpbmVPcmFjbGU7cmV0dXJuIG9yYWNsZSYmb3JhY2xlLmxvb2tBaGVhZChuKX07U3RyaW5nU3RyZWFtLnByb3RvdHlwZS5iYXNlVG9rZW49ZnVuY3Rpb24oKXt2YXIgb3JhY2xlPXRoaXMubGluZU9yYWNsZTtyZXR1cm4gb3JhY2xlJiZvcmFjbGUuYmFzZVRva2VuKHRoaXMucG9zKX07dmFyIFNhdmVkQ29udGV4dD1mdW5jdGlvbihzdGF0ZSxsb29rQWhlYWQpe3RoaXMuc3RhdGU9c3RhdGU7dGhpcy5sb29rQWhlYWQ9bG9va0FoZWFkO307dmFyIENvbnRleHQ9ZnVuY3Rpb24oZG9jLHN0YXRlLGxpbmUsbG9va0FoZWFkKXt0aGlzLnN0YXRlPXN0YXRlO3RoaXMuZG9jPWRvYzt0aGlzLmxpbmU9bGluZTt0aGlzLm1heExvb2tBaGVhZD1sb29rQWhlYWR8fDA7dGhpcy5iYXNlVG9rZW5zPW51bGw7dGhpcy5iYXNlVG9rZW5Qb3M9MTt9O0NvbnRleHQucHJvdG90eXBlLmxvb2tBaGVhZD1mdW5jdGlvbihuKXt2YXIgbGluZT10aGlzLmRvYy5nZXRMaW5lKHRoaXMubGluZStuKTtpZihsaW5lIT1udWxsJiZuPnRoaXMubWF4TG9va0FoZWFkKXt0aGlzLm1heExvb2tBaGVhZD1uO30KcmV0dXJuIGxpbmV9O0NvbnRleHQucHJvdG90eXBlLmJhc2VUb2tlbj1mdW5jdGlvbihuKXt2YXIgdGhpcyQxPXRoaXM7aWYoIXRoaXMuYmFzZVRva2Vucyl7cmV0dXJuIG51bGx9CndoaWxlKHRoaXMuYmFzZVRva2Vuc1t0aGlzLmJhc2VUb2tlblBvc108PW4pCnt0aGlzJDEuYmFzZVRva2VuUG9zKz0yO30KdmFyIHR5cGU9dGhpcy5iYXNlVG9rZW5zW3RoaXMuYmFzZVRva2VuUG9zKzFdO3JldHVybnt0eXBlOnR5cGUmJnR5cGUucmVwbGFjZSgvKCB8XilvdmVybGF5IC4qLywiIiksc2l6ZTp0aGlzLmJhc2VUb2tlbnNbdGhpcy5iYXNlVG9rZW5Qb3NdLW59fTtDb250ZXh0LnByb3RvdHlwZS5uZXh0TGluZT1mdW5jdGlvbigpe3RoaXMubGluZSsrO2lmKHRoaXMubWF4TG9va0FoZWFkPjApe3RoaXMubWF4TG9va0FoZWFkLS07fX07Q29udGV4dC5mcm9tU2F2ZWQ9ZnVuY3Rpb24oZG9jLHNhdmVkLGxpbmUpe2lmKHNhdmVkIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0KQp7cmV0dXJuIG5ldyBDb250ZXh0KGRvYyxjb3B5U3RhdGUoZG9jLm1vZGUsc2F2ZWQuc3RhdGUpLGxpbmUsc2F2ZWQubG9va0FoZWFkKX0KZWxzZQp7cmV0dXJuIG5ldyBDb250ZXh0KGRvYyxjb3B5U3RhdGUoZG9jLm1vZGUsc2F2ZWQpLGxpbmUpfX07Q29udGV4dC5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbihjb3B5KXt2YXIgc3RhdGU9Y29weSE9PWZhbHNlP2NvcHlTdGF0ZSh0aGlzLmRvYy5tb2RlLHRoaXMuc3RhdGUpOnRoaXMuc3RhdGU7cmV0dXJuIHRoaXMubWF4TG9va0FoZWFkPjA/bmV3IFNhdmVkQ29udGV4dChzdGF0ZSx0aGlzLm1heExvb2tBaGVhZCk6c3RhdGV9O2Z1bmN0aW9uIGhpZ2hsaWdodExpbmUoY20sbGluZSxjb250ZXh0LGZvcmNlVG9FbmQpe3ZhciBzdD1bY20uc3RhdGUubW9kZUdlbl0sbGluZUNsYXNzZXM9e307cnVuTW9kZShjbSxsaW5lLnRleHQsY20uZG9jLm1vZGUsY29udGV4dCxmdW5jdGlvbihlbmQsc3R5bGUpe3JldHVybiBzdC5wdXNoKGVuZCxzdHlsZSk7fSxsaW5lQ2xhc3Nlcyxmb3JjZVRvRW5kKTt2YXIgc3RhdGU9Y29udGV4dC5zdGF0ZTt2YXIgbG9vcD1mdW5jdGlvbihvKXtjb250ZXh0LmJhc2VUb2tlbnM9c3Q7dmFyIG92ZXJsYXk9Y20uc3RhdGUub3ZlcmxheXNbb10saT0xLGF0PTA7Y29udGV4dC5zdGF0ZT10cnVlO3J1bk1vZGUoY20sbGluZS50ZXh0LG92ZXJsYXkubW9kZSxjb250ZXh0LGZ1bmN0aW9uKGVuZCxzdHlsZSl7dmFyIHN0YXJ0PWk7d2hpbGUoYXQ8ZW5kKXt2YXIgaV9lbmQ9c3RbaV07aWYoaV9lbmQ+ZW5kKQp7c3Quc3BsaWNlKGksMSxlbmQsc3RbaSsxXSxpX2VuZCk7fQppKz0yO2F0PU1hdGgubWluKGVuZCxpX2VuZCk7fQppZighc3R5bGUpe3JldHVybn0KaWYob3ZlcmxheS5vcGFxdWUpe3N0LnNwbGljZShzdGFydCxpLXN0YXJ0LGVuZCwib3ZlcmxheSAiK3N0eWxlKTtpPXN0YXJ0KzI7fWVsc2V7Zm9yKDtzdGFydDxpO3N0YXJ0Kz0yKXt2YXIgY3VyPXN0W3N0YXJ0KzFdO3N0W3N0YXJ0KzFdPShjdXI/Y3VyKyIgIjoiIikrIm92ZXJsYXkgIitzdHlsZTt9fX0sbGluZUNsYXNzZXMpO2NvbnRleHQuc3RhdGU9c3RhdGU7Y29udGV4dC5iYXNlVG9rZW5zPW51bGw7Y29udGV4dC5iYXNlVG9rZW5Qb3M9MTt9O2Zvcih2YXIgbz0wO288Y20uc3RhdGUub3ZlcmxheXMubGVuZ3RoOysrbylsb29wKG8pO3JldHVybntzdHlsZXM6c3QsY2xhc3NlczpsaW5lQ2xhc3Nlcy5iZ0NsYXNzfHxsaW5lQ2xhc3Nlcy50ZXh0Q2xhc3M/bGluZUNsYXNzZXM6bnVsbH19CmZ1bmN0aW9uIGdldExpbmVTdHlsZXMoY20sbGluZSx1cGRhdGVGcm9udGllcil7aWYoIWxpbmUuc3R5bGVzfHxsaW5lLnN0eWxlc1swXSE9Y20uc3RhdGUubW9kZUdlbil7dmFyIGNvbnRleHQ9Z2V0Q29udGV4dEJlZm9yZShjbSxsaW5lTm8obGluZSkpO3ZhciByZXNldFN0YXRlPWxpbmUudGV4dC5sZW5ndGg+Y20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGgmJmNvcHlTdGF0ZShjbS5kb2MubW9kZSxjb250ZXh0LnN0YXRlKTt2YXIgcmVzdWx0PWhpZ2hsaWdodExpbmUoY20sbGluZSxjb250ZXh0KTtpZihyZXNldFN0YXRlKXtjb250ZXh0LnN0YXRlPXJlc2V0U3RhdGU7fQpsaW5lLnN0YXRlQWZ0ZXI9Y29udGV4dC5zYXZlKCFyZXNldFN0YXRlKTtsaW5lLnN0eWxlcz1yZXN1bHQuc3R5bGVzO2lmKHJlc3VsdC5jbGFzc2VzKXtsaW5lLnN0eWxlQ2xhc3Nlcz1yZXN1bHQuY2xhc3Nlczt9CmVsc2UgaWYobGluZS5zdHlsZUNsYXNzZXMpe2xpbmUuc3R5bGVDbGFzc2VzPW51bGw7fQppZih1cGRhdGVGcm9udGllcj09PWNtLmRvYy5oaWdobGlnaHRGcm9udGllcikKe2NtLmRvYy5tb2RlRnJvbnRpZXI9TWF0aC5tYXgoY20uZG9jLm1vZGVGcm9udGllciwrK2NtLmRvYy5oaWdobGlnaHRGcm9udGllcik7fX0KcmV0dXJuIGxpbmUuc3R5bGVzfQpmdW5jdGlvbiBnZXRDb250ZXh0QmVmb3JlKGNtLG4scHJlY2lzZSl7dmFyIGRvYz1jbS5kb2MsZGlzcGxheT1jbS5kaXNwbGF5O2lmKCFkb2MubW9kZS5zdGFydFN0YXRlKXtyZXR1cm4gbmV3IENvbnRleHQoZG9jLHRydWUsbil9CnZhciBzdGFydD1maW5kU3RhcnRMaW5lKGNtLG4scHJlY2lzZSk7dmFyIHNhdmVkPXN0YXJ0PmRvYy5maXJzdCYmZ2V0TGluZShkb2Msc3RhcnQtMSkuc3RhdGVBZnRlcjt2YXIgY29udGV4dD1zYXZlZD9Db250ZXh0LmZyb21TYXZlZChkb2Msc2F2ZWQsc3RhcnQpOm5ldyBDb250ZXh0KGRvYyxzdGFydFN0YXRlKGRvYy5tb2RlKSxzdGFydCk7ZG9jLml0ZXIoc3RhcnQsbixmdW5jdGlvbihsaW5lKXtwcm9jZXNzTGluZShjbSxsaW5lLnRleHQsY29udGV4dCk7dmFyIHBvcz1jb250ZXh0LmxpbmU7bGluZS5zdGF0ZUFmdGVyPXBvcz09bi0xfHxwb3MlNT09MHx8cG9zPj1kaXNwbGF5LnZpZXdGcm9tJiZwb3M8ZGlzcGxheS52aWV3VG8/Y29udGV4dC5zYXZlKCk6bnVsbDtjb250ZXh0Lm5leHRMaW5lKCk7fSk7aWYocHJlY2lzZSl7ZG9jLm1vZGVGcm9udGllcj1jb250ZXh0LmxpbmU7fQpyZXR1cm4gY29udGV4dH0KZnVuY3Rpb24gcHJvY2Vzc0xpbmUoY20sdGV4dCxjb250ZXh0LHN0YXJ0QXQpe3ZhciBtb2RlPWNtLmRvYy5tb2RlO3ZhciBzdHJlYW09bmV3IFN0cmluZ1N0cmVhbSh0ZXh0LGNtLm9wdGlvbnMudGFiU2l6ZSxjb250ZXh0KTtzdHJlYW0uc3RhcnQ9c3RyZWFtLnBvcz1zdGFydEF0fHwwO2lmKHRleHQ9PSIiKXtjYWxsQmxhbmtMaW5lKG1vZGUsY29udGV4dC5zdGF0ZSk7fQp3aGlsZSghc3RyZWFtLmVvbCgpKXtyZWFkVG9rZW4obW9kZSxzdHJlYW0sY29udGV4dC5zdGF0ZSk7c3RyZWFtLnN0YXJ0PXN0cmVhbS5wb3M7fX0KZnVuY3Rpb24gY2FsbEJsYW5rTGluZShtb2RlLHN0YXRlKXtpZihtb2RlLmJsYW5rTGluZSl7cmV0dXJuIG1vZGUuYmxhbmtMaW5lKHN0YXRlKX0KaWYoIW1vZGUuaW5uZXJNb2RlKXtyZXR1cm59CnZhciBpbm5lcj1pbm5lck1vZGUobW9kZSxzdGF0ZSk7aWYoaW5uZXIubW9kZS5ibGFua0xpbmUpe3JldHVybiBpbm5lci5tb2RlLmJsYW5rTGluZShpbm5lci5zdGF0ZSl9fQpmdW5jdGlvbiByZWFkVG9rZW4obW9kZSxzdHJlYW0sc3RhdGUsaW5uZXIpe2Zvcih2YXIgaT0wO2k8MTA7aSsrKXtpZihpbm5lcil7aW5uZXJbMF09aW5uZXJNb2RlKG1vZGUsc3RhdGUpLm1vZGU7fQp2YXIgc3R5bGU9bW9kZS50b2tlbihzdHJlYW0sc3RhdGUpO2lmKHN0cmVhbS5wb3M+c3RyZWFtLnN0YXJ0KXtyZXR1cm4gc3R5bGV9fQp0aHJvdyBuZXcgRXJyb3IoIk1vZGUgIittb2RlLm5hbWUrIiBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uIil9CnZhciBUb2tlbj1mdW5jdGlvbihzdHJlYW0sdHlwZSxzdGF0ZSl7dGhpcy5zdGFydD1zdHJlYW0uc3RhcnQ7dGhpcy5lbmQ9c3RyZWFtLnBvczt0aGlzLnN0cmluZz1zdHJlYW0uY3VycmVudCgpO3RoaXMudHlwZT10eXBlfHxudWxsO3RoaXMuc3RhdGU9c3RhdGU7fTtmdW5jdGlvbiB0YWtlVG9rZW4oY20scG9zLHByZWNpc2UsYXNBcnJheSl7dmFyIGRvYz1jbS5kb2MsbW9kZT1kb2MubW9kZSxzdHlsZTtwb3M9Y2xpcFBvcyhkb2MscG9zKTt2YXIgbGluZT1nZXRMaW5lKGRvYyxwb3MubGluZSksY29udGV4dD1nZXRDb250ZXh0QmVmb3JlKGNtLHBvcy5saW5lLHByZWNpc2UpO3ZhciBzdHJlYW09bmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsY20ub3B0aW9ucy50YWJTaXplLGNvbnRleHQpLHRva2VucztpZihhc0FycmF5KXt0b2tlbnM9W107fQp3aGlsZSgoYXNBcnJheXx8c3RyZWFtLnBvczxwb3MuY2gpJiYhc3RyZWFtLmVvbCgpKXtzdHJlYW0uc3RhcnQ9c3RyZWFtLnBvcztzdHlsZT1yZWFkVG9rZW4obW9kZSxzdHJlYW0sY29udGV4dC5zdGF0ZSk7aWYoYXNBcnJheSl7dG9rZW5zLnB1c2gobmV3IFRva2VuKHN0cmVhbSxzdHlsZSxjb3B5U3RhdGUoZG9jLm1vZGUsY29udGV4dC5zdGF0ZSkpKTt9fQpyZXR1cm4gYXNBcnJheT90b2tlbnM6bmV3IFRva2VuKHN0cmVhbSxzdHlsZSxjb250ZXh0LnN0YXRlKX0KZnVuY3Rpb24gZXh0cmFjdExpbmVDbGFzc2VzKHR5cGUsb3V0cHV0KXtpZih0eXBlKXtmb3IoOzspe3ZhciBsaW5lQ2xhc3M9dHlwZS5tYXRjaCgvKD86XnxccyspbGluZS0oYmFja2dyb3VuZC0pPyhcUyspLyk7aWYoIWxpbmVDbGFzcyl7YnJlYWt9CnR5cGU9dHlwZS5zbGljZSgwLGxpbmVDbGFzcy5pbmRleCkrdHlwZS5zbGljZShsaW5lQ2xhc3MuaW5kZXgrbGluZUNsYXNzWzBdLmxlbmd0aCk7dmFyIHByb3A9bGluZUNsYXNzWzFdPyJiZ0NsYXNzIjoidGV4dENsYXNzIjtpZihvdXRwdXRbcHJvcF09PW51bGwpCntvdXRwdXRbcHJvcF09bGluZUNsYXNzWzJdO30KZWxzZSBpZighKG5ldyBSZWdFeHAoIig/Ol58XHMpIitsaW5lQ2xhc3NbMl0rIig/OiR8XHMpIikpLnRlc3Qob3V0cHV0W3Byb3BdKSkKe291dHB1dFtwcm9wXSs9IiAiK2xpbmVDbGFzc1syXTt9fX0KcmV0dXJuIHR5cGV9CmZ1bmN0aW9uIHJ1bk1vZGUoY20sdGV4dCxtb2RlLGNvbnRleHQsZixsaW5lQ2xhc3Nlcyxmb3JjZVRvRW5kKXt2YXIgZmxhdHRlblNwYW5zPW1vZGUuZmxhdHRlblNwYW5zO2lmKGZsYXR0ZW5TcGFucz09bnVsbCl7ZmxhdHRlblNwYW5zPWNtLm9wdGlvbnMuZmxhdHRlblNwYW5zO30KdmFyIGN1clN0YXJ0PTAsY3VyU3R5bGU9bnVsbDt2YXIgc3RyZWFtPW5ldyBTdHJpbmdTdHJlYW0odGV4dCxjbS5vcHRpb25zLnRhYlNpemUsY29udGV4dCksc3R5bGU7dmFyIGlubmVyPWNtLm9wdGlvbnMuYWRkTW9kZUNsYXNzJiZbbnVsbF07aWYodGV4dD09IiIpe2V4dHJhY3RMaW5lQ2xhc3NlcyhjYWxsQmxhbmtMaW5lKG1vZGUsY29udGV4dC5zdGF0ZSksbGluZUNsYXNzZXMpO30Kd2hpbGUoIXN0cmVhbS5lb2woKSl7aWYoc3RyZWFtLnBvcz5jbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCl7ZmxhdHRlblNwYW5zPWZhbHNlO2lmKGZvcmNlVG9FbmQpe3Byb2Nlc3NMaW5lKGNtLHRleHQsY29udGV4dCxzdHJlYW0ucG9zKTt9CnN0cmVhbS5wb3M9dGV4dC5sZW5ndGg7c3R5bGU9bnVsbDt9ZWxzZXtzdHlsZT1leHRyYWN0TGluZUNsYXNzZXMocmVhZFRva2VuKG1vZGUsc3RyZWFtLGNvbnRleHQuc3RhdGUsaW5uZXIpLGxpbmVDbGFzc2VzKTt9CmlmKGlubmVyKXt2YXIgbU5hbWU9aW5uZXJbMF0ubmFtZTtpZihtTmFtZSl7c3R5bGU9Im0tIisoc3R5bGU/bU5hbWUrIiAiK3N0eWxlOm1OYW1lKTt9fQppZighZmxhdHRlblNwYW5zfHxjdXJTdHlsZSE9c3R5bGUpe3doaWxlKGN1clN0YXJ0PHN0cmVhbS5zdGFydCl7Y3VyU3RhcnQ9TWF0aC5taW4oc3RyZWFtLnN0YXJ0LGN1clN0YXJ0KzUwMDApO2YoY3VyU3RhcnQsY3VyU3R5bGUpO30KY3VyU3R5bGU9c3R5bGU7fQpzdHJlYW0uc3RhcnQ9c3RyZWFtLnBvczt9CndoaWxlKGN1clN0YXJ0PHN0cmVhbS5wb3Mpe3ZhciBwb3M9TWF0aC5taW4oc3RyZWFtLnBvcyxjdXJTdGFydCs1MDAwKTtmKHBvcyxjdXJTdHlsZSk7Y3VyU3RhcnQ9cG9zO319CmZ1bmN0aW9uIGZpbmRTdGFydExpbmUoY20sbixwcmVjaXNlKXt2YXIgbWluaW5kZW50LG1pbmxpbmUsZG9jPWNtLmRvYzt2YXIgbGltPXByZWNpc2U/LTE6bi0oY20uZG9jLm1vZGUuaW5uZXJNb2RlPzEwMDA6MTAwKTtmb3IodmFyIHNlYXJjaD1uO3NlYXJjaD5saW07LS1zZWFyY2gpe2lmKHNlYXJjaDw9ZG9jLmZpcnN0KXtyZXR1cm4gZG9jLmZpcnN0fQp2YXIgbGluZT1nZXRMaW5lKGRvYyxzZWFyY2gtMSksYWZ0ZXI9bGluZS5zdGF0ZUFmdGVyO2lmKGFmdGVyJiYoIXByZWNpc2V8fHNlYXJjaCsoYWZ0ZXIgaW5zdGFuY2VvZiBTYXZlZENvbnRleHQ/YWZ0ZXIubG9va0FoZWFkOjApPD1kb2MubW9kZUZyb250aWVyKSkKe3JldHVybiBzZWFyY2h9CnZhciBpbmRlbnRlZD1jb3VudENvbHVtbihsaW5lLnRleHQsbnVsbCxjbS5vcHRpb25zLnRhYlNpemUpO2lmKG1pbmxpbmU9PW51bGx8fG1pbmluZGVudD5pbmRlbnRlZCl7bWlubGluZT1zZWFyY2gtMTttaW5pbmRlbnQ9aW5kZW50ZWQ7fX0KcmV0dXJuIG1pbmxpbmV9CmZ1bmN0aW9uIHJldHJlYXRGcm9udGllcihkb2Msbil7ZG9jLm1vZGVGcm9udGllcj1NYXRoLm1pbihkb2MubW9kZUZyb250aWVyLG4pO2lmKGRvYy5oaWdobGlnaHRGcm9udGllcjxuLTEwKXtyZXR1cm59CnZhciBzdGFydD1kb2MuZmlyc3Q7Zm9yKHZhciBsaW5lPW4tMTtsaW5lPnN0YXJ0O2xpbmUtLSl7dmFyIHNhdmVkPWdldExpbmUoZG9jLGxpbmUpLnN0YXRlQWZ0ZXI7aWYoc2F2ZWQmJighKHNhdmVkIGluc3RhbmNlb2YgU2F2ZWRDb250ZXh0KXx8bGluZStzYXZlZC5sb29rQWhlYWQ8bikpe3N0YXJ0PWxpbmUrMTticmVha319CmRvYy5oaWdobGlnaHRGcm9udGllcj1NYXRoLm1pbihkb2MuaGlnaGxpZ2h0RnJvbnRpZXIsc3RhcnQpO30KdmFyIExpbmU9ZnVuY3Rpb24odGV4dCxtYXJrZWRTcGFucyxlc3RpbWF0ZUhlaWdodCl7dGhpcy50ZXh0PXRleHQ7YXR0YWNoTWFya2VkU3BhbnModGhpcyxtYXJrZWRTcGFucyk7dGhpcy5oZWlnaHQ9ZXN0aW1hdGVIZWlnaHQ/ZXN0aW1hdGVIZWlnaHQodGhpcyk6MTt9O0xpbmUucHJvdG90eXBlLmxpbmVObz1mdW5jdGlvbigpe3JldHVybiBsaW5lTm8odGhpcyl9O2V2ZW50TWl4aW4oTGluZSk7ZnVuY3Rpb24gdXBkYXRlTGluZShsaW5lLHRleHQsbWFya2VkU3BhbnMsZXN0aW1hdGVIZWlnaHQpe2xpbmUudGV4dD10ZXh0O2lmKGxpbmUuc3RhdGVBZnRlcil7bGluZS5zdGF0ZUFmdGVyPW51bGw7fQppZihsaW5lLnN0eWxlcyl7bGluZS5zdHlsZXM9bnVsbDt9CmlmKGxpbmUub3JkZXIhPW51bGwpe2xpbmUub3JkZXI9bnVsbDt9CmRldGFjaE1hcmtlZFNwYW5zKGxpbmUpO2F0dGFjaE1hcmtlZFNwYW5zKGxpbmUsbWFya2VkU3BhbnMpO3ZhciBlc3RIZWlnaHQ9ZXN0aW1hdGVIZWlnaHQ/ZXN0aW1hdGVIZWlnaHQobGluZSk6MTtpZihlc3RIZWlnaHQhPWxpbmUuaGVpZ2h0KXt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsZXN0SGVpZ2h0KTt9fQpmdW5jdGlvbiBjbGVhblVwTGluZShsaW5lKXtsaW5lLnBhcmVudD1udWxsO2RldGFjaE1hcmtlZFNwYW5zKGxpbmUpO30KdmFyIHN0eWxlVG9DbGFzc0NhY2hlPXt9O3ZhciBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlPXt9O2Z1bmN0aW9uIGludGVycHJldFRva2VuU3R5bGUoc3R5bGUsb3B0aW9ucyl7aWYoIXN0eWxlfHwvXlxzKiQvLnRlc3Qoc3R5bGUpKXtyZXR1cm4gbnVsbH0KdmFyIGNhY2hlPW9wdGlvbnMuYWRkTW9kZUNsYXNzP3N0eWxlVG9DbGFzc0NhY2hlV2l0aE1vZGU6c3R5bGVUb0NsYXNzQ2FjaGU7cmV0dXJuIGNhY2hlW3N0eWxlXXx8KGNhY2hlW3N0eWxlXT1zdHlsZS5yZXBsYWNlKC9cUysvZywiY20tJCYiKSl9CmZ1bmN0aW9uIGJ1aWxkTGluZUNvbnRlbnQoY20sbGluZVZpZXcpe3ZhciBjb250ZW50PWVsdFAoInNwYW4iLG51bGwsbnVsbCx3ZWJraXQ/InBhZGRpbmctcmlnaHQ6IC4xcHgiOm51bGwpO3ZhciBidWlsZGVyPXtwcmU6ZWx0UCgicHJlIixbY29udGVudF0sIkNvZGVNaXJyb3ItbGluZSIpLGNvbnRlbnQ6Y29udGVudCxjb2w6MCxwb3M6MCxjbTpjbSx0cmFpbGluZ1NwYWNlOmZhbHNlLHNwbGl0U3BhY2VzOihpZXx8d2Via2l0KSYmY20uZ2V0T3B0aW9uKCJsaW5lV3JhcHBpbmciKX07bGluZVZpZXcubWVhc3VyZT17fTtmb3IodmFyIGk9MDtpPD0obGluZVZpZXcucmVzdD9saW5lVmlldy5yZXN0Lmxlbmd0aDowKTtpKyspe3ZhciBsaW5lPWk/bGluZVZpZXcucmVzdFtpLTFdOmxpbmVWaWV3LmxpbmUsb3JkZXI9KHZvaWQgMCk7YnVpbGRlci5wb3M9MDtidWlsZGVyLmFkZFRva2VuPWJ1aWxkVG9rZW47aWYoaGFzQmFkQmlkaVJlY3RzKGNtLmRpc3BsYXkubWVhc3VyZSkmJihvcmRlcj1nZXRPcmRlcihsaW5lLGNtLmRvYy5kaXJlY3Rpb24pKSkKe2J1aWxkZXIuYWRkVG9rZW49YnVpbGRUb2tlbkJhZEJpZGkoYnVpbGRlci5hZGRUb2tlbixvcmRlcik7fQpidWlsZGVyLm1hcD1bXTt2YXIgYWxsb3dGcm9udGllclVwZGF0ZT1saW5lVmlldyE9Y20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkJiZsaW5lTm8obGluZSk7aW5zZXJ0TGluZUNvbnRlbnQobGluZSxidWlsZGVyLGdldExpbmVTdHlsZXMoY20sbGluZSxhbGxvd0Zyb250aWVyVXBkYXRlKSk7aWYobGluZS5zdHlsZUNsYXNzZXMpe2lmKGxpbmUuc3R5bGVDbGFzc2VzLmJnQ2xhc3MpCntidWlsZGVyLmJnQ2xhc3M9am9pbkNsYXNzZXMobGluZS5zdHlsZUNsYXNzZXMuYmdDbGFzcyxidWlsZGVyLmJnQ2xhc3N8fCIiKTt9CmlmKGxpbmUuc3R5bGVDbGFzc2VzLnRleHRDbGFzcykKe2J1aWxkZXIudGV4dENsYXNzPWpvaW5DbGFzc2VzKGxpbmUuc3R5bGVDbGFzc2VzLnRleHRDbGFzcyxidWlsZGVyLnRleHRDbGFzc3x8IiIpO319CmlmKGJ1aWxkZXIubWFwLmxlbmd0aD09MCkKe2J1aWxkZXIubWFwLnB1c2goMCwwLGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZCh6ZXJvV2lkdGhFbGVtZW50KGNtLmRpc3BsYXkubWVhc3VyZSkpKTt9CmlmKGk9PTApe2xpbmVWaWV3Lm1lYXN1cmUubWFwPWJ1aWxkZXIubWFwO2xpbmVWaWV3Lm1lYXN1cmUuY2FjaGU9e307fWVsc2V7KGxpbmVWaWV3Lm1lYXN1cmUubWFwc3x8KGxpbmVWaWV3Lm1lYXN1cmUubWFwcz1bXSkpLnB1c2goYnVpbGRlci5tYXApOyhsaW5lVmlldy5tZWFzdXJlLmNhY2hlc3x8KGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzPVtdKSkucHVzaCh7fSk7fX0KaWYod2Via2l0KXt2YXIgbGFzdD1idWlsZGVyLmNvbnRlbnQubGFzdENoaWxkO2lmKC9cYmNtLXRhYlxiLy50ZXN0KGxhc3QuY2xhc3NOYW1lKXx8KGxhc3QucXVlcnlTZWxlY3RvciYmbGFzdC5xdWVyeVNlbGVjdG9yKCIuY20tdGFiIikpKQp7YnVpbGRlci5jb250ZW50LmNsYXNzTmFtZT0iY20tdGFiLXdyYXAtaGFjayI7fX0Kc2lnbmFsKGNtLCJyZW5kZXJMaW5lIixjbSxsaW5lVmlldy5saW5lLGJ1aWxkZXIucHJlKTtpZihidWlsZGVyLnByZS5jbGFzc05hbWUpCntidWlsZGVyLnRleHRDbGFzcz1qb2luQ2xhc3NlcyhidWlsZGVyLnByZS5jbGFzc05hbWUsYnVpbGRlci50ZXh0Q2xhc3N8fCIiKTt9CnJldHVybiBidWlsZGVyfQpmdW5jdGlvbiBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlcihjaCl7dmFyIHRva2VuPWVsdCgic3BhbiIsIlx1MjAyMiIsImNtLWludmFsaWRjaGFyIik7dG9rZW4udGl0bGU9IlxcdSIrY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7dG9rZW4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0b2tlbi50aXRsZSk7cmV0dXJuIHRva2VufQpmdW5jdGlvbiBidWlsZFRva2VuKGJ1aWxkZXIsdGV4dCxzdHlsZSxzdGFydFN0eWxlLGVuZFN0eWxlLHRpdGxlLGNzcyl7aWYoIXRleHQpe3JldHVybn0KdmFyIGRpc3BsYXlUZXh0PWJ1aWxkZXIuc3BsaXRTcGFjZXM/c3BsaXRTcGFjZXModGV4dCxidWlsZGVyLnRyYWlsaW5nU3BhY2UpOnRleHQ7dmFyIHNwZWNpYWw9YnVpbGRlci5jbS5zdGF0ZS5zcGVjaWFsQ2hhcnMsbXVzdFdyYXA9ZmFsc2U7dmFyIGNvbnRlbnQ7aWYoIXNwZWNpYWwudGVzdCh0ZXh0KSl7YnVpbGRlci5jb2wrPXRleHQubGVuZ3RoO2NvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlzcGxheVRleHQpO2J1aWxkZXIubWFwLnB1c2goYnVpbGRlci5wb3MsYnVpbGRlci5wb3MrdGV4dC5sZW5ndGgsY29udGVudCk7aWYoaWUmJmllX3ZlcnNpb248OSl7bXVzdFdyYXA9dHJ1ZTt9CmJ1aWxkZXIucG9zKz10ZXh0Lmxlbmd0aDt9ZWxzZXtjb250ZW50PWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt2YXIgcG9zPTA7d2hpbGUodHJ1ZSl7c3BlY2lhbC5sYXN0SW5kZXg9cG9zO3ZhciBtPXNwZWNpYWwuZXhlYyh0ZXh0KTt2YXIgc2tpcHBlZD1tP20uaW5kZXgtcG9zOnRleHQubGVuZ3RoLXBvcztpZihza2lwcGVkKXt2YXIgdHh0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXlUZXh0LnNsaWNlKHBvcyxwb3Mrc2tpcHBlZCkpO2lmKGllJiZpZV92ZXJzaW9uPDkpe2NvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIixbdHh0XSkpO30KZWxzZXtjb250ZW50LmFwcGVuZENoaWxkKHR4dCk7fQpidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLGJ1aWxkZXIucG9zK3NraXBwZWQsdHh0KTtidWlsZGVyLmNvbCs9c2tpcHBlZDtidWlsZGVyLnBvcys9c2tpcHBlZDt9CmlmKCFtKXticmVha30KcG9zKz1za2lwcGVkKzE7dmFyIHR4dCQxPSh2b2lkIDApO2lmKG1bMF09PSJcdCIpe3ZhciB0YWJTaXplPWJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLHRhYldpZHRoPXRhYlNpemUtYnVpbGRlci5jb2wldGFiU2l6ZTt0eHQkMT1jb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsc3BhY2VTdHIodGFiV2lkdGgpLCJjbS10YWIiKSk7dHh0JDEuc2V0QXR0cmlidXRlKCJyb2xlIiwicHJlc2VudGF0aW9uIik7dHh0JDEuc2V0QXR0cmlidXRlKCJjbS10ZXh0IiwiXHQiKTtidWlsZGVyLmNvbCs9dGFiV2lkdGg7fWVsc2UgaWYobVswXT09IlxyInx8bVswXT09IlxuIil7dHh0JDE9Y29udGVudC5hcHBlbmRDaGlsZChlbHQoInNwYW4iLG1bMF09PSJcciI/Ilx1MjQwZCI6Ilx1MjQyNCIsImNtLWludmFsaWRjaGFyIikpO3R4dCQxLnNldEF0dHJpYnV0ZSgiY20tdGV4dCIsbVswXSk7YnVpbGRlci5jb2wrPTE7fWVsc2V7dHh0JDE9YnVpbGRlci5jbS5vcHRpb25zLnNwZWNpYWxDaGFyUGxhY2Vob2xkZXIobVswXSk7dHh0JDEuc2V0QXR0cmlidXRlKCJjbS10ZXh0IixtWzBdKTtpZihpZSYmaWVfdmVyc2lvbjw5KXtjb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsW3R4dCQxXSkpO30KZWxzZXtjb250ZW50LmFwcGVuZENoaWxkKHR4dCQxKTt9CmJ1aWxkZXIuY29sKz0xO30KYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcyxidWlsZGVyLnBvcysxLHR4dCQxKTtidWlsZGVyLnBvcysrO319CmJ1aWxkZXIudHJhaWxpbmdTcGFjZT1kaXNwbGF5VGV4dC5jaGFyQ29kZUF0KHRleHQubGVuZ3RoLTEpPT0zMjtpZihzdHlsZXx8c3RhcnRTdHlsZXx8ZW5kU3R5bGV8fG11c3RXcmFwfHxjc3Mpe3ZhciBmdWxsU3R5bGU9c3R5bGV8fCIiO2lmKHN0YXJ0U3R5bGUpe2Z1bGxTdHlsZSs9c3RhcnRTdHlsZTt9CmlmKGVuZFN0eWxlKXtmdWxsU3R5bGUrPWVuZFN0eWxlO30KdmFyIHRva2VuPWVsdCgic3BhbiIsW2NvbnRlbnRdLGZ1bGxTdHlsZSxjc3MpO2lmKHRpdGxlKXt0b2tlbi50aXRsZT10aXRsZTt9CnJldHVybiBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQodG9rZW4pfQpidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7fQpmdW5jdGlvbiBzcGxpdFNwYWNlcyh0ZXh0LHRyYWlsaW5nQmVmb3JlKXtpZih0ZXh0Lmxlbmd0aD4xJiYhLyAgLy50ZXN0KHRleHQpKXtyZXR1cm4gdGV4dH0KdmFyIHNwYWNlQmVmb3JlPXRyYWlsaW5nQmVmb3JlLHJlc3VsdD0iIjtmb3IodmFyIGk9MDtpPHRleHQubGVuZ3RoO2krKyl7dmFyIGNoPXRleHQuY2hhckF0KGkpO2lmKGNoPT0iICImJnNwYWNlQmVmb3JlJiYoaT09dGV4dC5sZW5ndGgtMXx8dGV4dC5jaGFyQ29kZUF0KGkrMSk9PTMyKSkKe2NoPSJcdTAwYTAiO30KcmVzdWx0Kz1jaDtzcGFjZUJlZm9yZT1jaD09IiAiO30KcmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYnVpbGRUb2tlbkJhZEJpZGkoaW5uZXIsb3JkZXIpe3JldHVybiBmdW5jdGlvbihidWlsZGVyLHRleHQsc3R5bGUsc3RhcnRTdHlsZSxlbmRTdHlsZSx0aXRsZSxjc3Mpe3N0eWxlPXN0eWxlP3N0eWxlKyIgY20tZm9yY2UtYm9yZGVyIjoiY20tZm9yY2UtYm9yZGVyIjt2YXIgc3RhcnQ9YnVpbGRlci5wb3MsZW5kPXN0YXJ0K3RleHQubGVuZ3RoO2Zvcig7Oyl7dmFyIHBhcnQ9KHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxvcmRlci5sZW5ndGg7aSsrKXtwYXJ0PW9yZGVyW2ldO2lmKHBhcnQudG8+c3RhcnQmJnBhcnQuZnJvbTw9c3RhcnQpe2JyZWFrfX0KaWYocGFydC50bz49ZW5kKXtyZXR1cm4gaW5uZXIoYnVpbGRlcix0ZXh0LHN0eWxlLHN0YXJ0U3R5bGUsZW5kU3R5bGUsdGl0bGUsY3NzKX0KaW5uZXIoYnVpbGRlcix0ZXh0LnNsaWNlKDAscGFydC50by1zdGFydCksc3R5bGUsc3RhcnRTdHlsZSxudWxsLHRpdGxlLGNzcyk7c3RhcnRTdHlsZT1udWxsO3RleHQ9dGV4dC5zbGljZShwYXJ0LnRvLXN0YXJ0KTtzdGFydD1wYXJ0LnRvO319fQpmdW5jdGlvbiBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlcixzaXplLG1hcmtlcixpZ25vcmVXaWRnZXQpe3ZhciB3aWRnZXQ9IWlnbm9yZVdpZGdldCYmbWFya2VyLndpZGdldE5vZGU7aWYod2lkZ2V0KXtidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLGJ1aWxkZXIucG9zK3NpemUsd2lkZ2V0KTt9CmlmKCFpZ25vcmVXaWRnZXQmJmJ1aWxkZXIuY20uZGlzcGxheS5pbnB1dC5uZWVkc0NvbnRlbnRBdHRyaWJ1dGUpe2lmKCF3aWRnZXQpCnt3aWRnZXQ9YnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7fQp3aWRnZXQuc2V0QXR0cmlidXRlKCJjbS1tYXJrZXIiLG1hcmtlci5pZCk7fQppZih3aWRnZXQpe2J1aWxkZXIuY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKHdpZGdldCk7YnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHdpZGdldCk7fQpidWlsZGVyLnBvcys9c2l6ZTtidWlsZGVyLnRyYWlsaW5nU3BhY2U9ZmFsc2U7fQpmdW5jdGlvbiBpbnNlcnRMaW5lQ29udGVudChsaW5lLGJ1aWxkZXIsc3R5bGVzKXt2YXIgc3BhbnM9bGluZS5tYXJrZWRTcGFucyxhbGxUZXh0PWxpbmUudGV4dCxhdD0wO2lmKCFzcGFucyl7Zm9yKHZhciBpJDE9MTtpJDE8c3R5bGVzLmxlbmd0aDtpJDErPTIpCntidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsYWxsVGV4dC5zbGljZShhdCxhdD1zdHlsZXNbaSQxXSksaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZXNbaSQxKzFdLGJ1aWxkZXIuY20ub3B0aW9ucykpO30KcmV0dXJufQp2YXIgbGVuPWFsbFRleHQubGVuZ3RoLHBvcz0wLGk9MSx0ZXh0PSIiLHN0eWxlLGNzczt2YXIgbmV4dENoYW5nZT0wLHNwYW5TdHlsZSxzcGFuRW5kU3R5bGUsc3BhblN0YXJ0U3R5bGUsdGl0bGUsY29sbGFwc2VkO2Zvcig7Oyl7aWYobmV4dENoYW5nZT09cG9zKXtzcGFuU3R5bGU9c3BhbkVuZFN0eWxlPXNwYW5TdGFydFN0eWxlPXRpdGxlPWNzcz0iIjtjb2xsYXBzZWQ9bnVsbDtuZXh0Q2hhbmdlPUluZmluaXR5O3ZhciBmb3VuZEJvb2ttYXJrcz1bXSxlbmRTdHlsZXM9KHZvaWQgMCk7Zm9yKHZhciBqPTA7ajxzcGFucy5sZW5ndGg7KytqKXt2YXIgc3A9c3BhbnNbal0sbT1zcC5tYXJrZXI7aWYobS50eXBlPT0iYm9va21hcmsiJiZzcC5mcm9tPT1wb3MmJm0ud2lkZ2V0Tm9kZSl7Zm91bmRCb29rbWFya3MucHVzaChtKTt9ZWxzZSBpZihzcC5mcm9tPD1wb3MmJihzcC50bz09bnVsbHx8c3AudG8+cG9zfHxtLmNvbGxhcHNlZCYmc3AudG89PXBvcyYmc3AuZnJvbT09cG9zKSl7aWYoc3AudG8hPW51bGwmJnNwLnRvIT1wb3MmJm5leHRDaGFuZ2U+c3AudG8pe25leHRDaGFuZ2U9c3AudG87c3BhbkVuZFN0eWxlPSIiO30KaWYobS5jbGFzc05hbWUpe3NwYW5TdHlsZSs9IiAiK20uY2xhc3NOYW1lO30KaWYobS5jc3Mpe2Nzcz0oY3NzP2NzcysiOyI6IiIpK20uY3NzO30KaWYobS5zdGFydFN0eWxlJiZzcC5mcm9tPT1wb3Mpe3NwYW5TdGFydFN0eWxlKz0iICIrbS5zdGFydFN0eWxlO30KaWYobS5lbmRTdHlsZSYmc3AudG89PW5leHRDaGFuZ2UpeyhlbmRTdHlsZXN8fChlbmRTdHlsZXM9W10pKS5wdXNoKG0uZW5kU3R5bGUsc3AudG8pO30KaWYobS50aXRsZSYmIXRpdGxlKXt0aXRsZT1tLnRpdGxlO30KaWYobS5jb2xsYXBzZWQmJighY29sbGFwc2VkfHxjb21wYXJlQ29sbGFwc2VkTWFya2Vycyhjb2xsYXBzZWQubWFya2VyLG0pPDApKQp7Y29sbGFwc2VkPXNwO319ZWxzZSBpZihzcC5mcm9tPnBvcyYmbmV4dENoYW5nZT5zcC5mcm9tKXtuZXh0Q2hhbmdlPXNwLmZyb207fX0KaWYoZW5kU3R5bGVzKXtmb3IodmFyIGokMT0wO2okMTxlbmRTdHlsZXMubGVuZ3RoO2okMSs9MikKe2lmKGVuZFN0eWxlc1tqJDErMV09PW5leHRDaGFuZ2Upe3NwYW5FbmRTdHlsZSs9IiAiK2VuZFN0eWxlc1tqJDFdO319fQppZighY29sbGFwc2VkfHxjb2xsYXBzZWQuZnJvbT09cG9zKXtmb3IodmFyIGokMj0wO2okMjxmb3VuZEJvb2ttYXJrcy5sZW5ndGg7KytqJDIpCntidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwwLGZvdW5kQm9va21hcmtzW2okMl0pO319CmlmKGNvbGxhcHNlZCYmKGNvbGxhcHNlZC5mcm9tfHwwKT09cG9zKXtidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwoY29sbGFwc2VkLnRvPT1udWxsP2xlbisxOmNvbGxhcHNlZC50byktcG9zLGNvbGxhcHNlZC5tYXJrZXIsY29sbGFwc2VkLmZyb209PW51bGwpO2lmKGNvbGxhcHNlZC50bz09bnVsbCl7cmV0dXJufQppZihjb2xsYXBzZWQudG89PXBvcyl7Y29sbGFwc2VkPWZhbHNlO319fQppZihwb3M+PWxlbil7YnJlYWt9CnZhciB1cHRvPU1hdGgubWluKGxlbixuZXh0Q2hhbmdlKTt3aGlsZSh0cnVlKXtpZih0ZXh0KXt2YXIgZW5kPXBvcyt0ZXh0Lmxlbmd0aDtpZighY29sbGFwc2VkKXt2YXIgdG9rZW5UZXh0PWVuZD51cHRvP3RleHQuc2xpY2UoMCx1cHRvLXBvcyk6dGV4dDtidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsdG9rZW5UZXh0LHN0eWxlP3N0eWxlK3NwYW5TdHlsZTpzcGFuU3R5bGUsc3BhblN0YXJ0U3R5bGUscG9zK3Rva2VuVGV4dC5sZW5ndGg9PW5leHRDaGFuZ2U/c3BhbkVuZFN0eWxlOiIiLHRpdGxlLGNzcyk7fQppZihlbmQ+PXVwdG8pe3RleHQ9dGV4dC5zbGljZSh1cHRvLXBvcyk7cG9zPXVwdG87YnJlYWt9CnBvcz1lbmQ7c3BhblN0YXJ0U3R5bGU9IiI7fQp0ZXh0PWFsbFRleHQuc2xpY2UoYXQsYXQ9c3R5bGVzW2krK10pO3N0eWxlPWludGVycHJldFRva2VuU3R5bGUoc3R5bGVzW2krK10sYnVpbGRlci5jbS5vcHRpb25zKTt9fX0KZnVuY3Rpb24gTGluZVZpZXcoZG9jLGxpbmUsbGluZU4pe3RoaXMubGluZT1saW5lO3RoaXMucmVzdD12aXN1YWxMaW5lQ29udGludWVkKGxpbmUpO3RoaXMuc2l6ZT10aGlzLnJlc3Q/bGluZU5vKGxzdCh0aGlzLnJlc3QpKS1saW5lTisxOjE7dGhpcy5ub2RlPXRoaXMudGV4dD1udWxsO3RoaXMuaGlkZGVuPWxpbmVJc0hpZGRlbihkb2MsbGluZSk7fQpmdW5jdGlvbiBidWlsZFZpZXdBcnJheShjbSxmcm9tLHRvKXt2YXIgYXJyYXk9W10sbmV4dFBvcztmb3IodmFyIHBvcz1mcm9tO3Bvczx0bztwb3M9bmV4dFBvcyl7dmFyIHZpZXc9bmV3IExpbmVWaWV3KGNtLmRvYyxnZXRMaW5lKGNtLmRvYyxwb3MpLHBvcyk7bmV4dFBvcz1wb3Mrdmlldy5zaXplO2FycmF5LnB1c2godmlldyk7fQpyZXR1cm4gYXJyYXl9CnZhciBvcGVyYXRpb25Hcm91cD1udWxsO2Z1bmN0aW9uIHB1c2hPcGVyYXRpb24ob3Ape2lmKG9wZXJhdGlvbkdyb3VwKXtvcGVyYXRpb25Hcm91cC5vcHMucHVzaChvcCk7fWVsc2V7b3Aub3duc0dyb3VwPW9wZXJhdGlvbkdyb3VwPXtvcHM6W29wXSxkZWxheWVkQ2FsbGJhY2tzOltdfTt9fQpmdW5jdGlvbiBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKXt2YXIgY2FsbGJhY2tzPWdyb3VwLmRlbGF5ZWRDYWxsYmFja3MsaT0wO2Rve2Zvcig7aTxjYWxsYmFja3MubGVuZ3RoO2krKykKe2NhbGxiYWNrc1tpXS5jYWxsKG51bGwpO30KZm9yKHZhciBqPTA7ajxncm91cC5vcHMubGVuZ3RoO2orKyl7dmFyIG9wPWdyb3VwLm9wc1tqXTtpZihvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzKQp7d2hpbGUob3AuY3Vyc29yQWN0aXZpdHlDYWxsZWQ8b3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycy5sZW5ndGgpCntvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzW29wLmN1cnNvckFjdGl2aXR5Q2FsbGVkKytdLmNhbGwobnVsbCxvcC5jbSk7fX19fXdoaWxlKGk8Y2FsbGJhY2tzLmxlbmd0aCl9CmZ1bmN0aW9uIGZpbmlzaE9wZXJhdGlvbihvcCxlbmRDYil7dmFyIGdyb3VwPW9wLm93bnNHcm91cDtpZighZ3JvdXApe3JldHVybn0KdHJ5e2ZpcmVDYWxsYmFja3NGb3JPcHMoZ3JvdXApO30KZmluYWxseXtvcGVyYXRpb25Hcm91cD1udWxsO2VuZENiKGdyb3VwKTt9fQp2YXIgb3JwaGFuRGVsYXllZENhbGxiYWNrcz1udWxsO2Z1bmN0aW9uIHNpZ25hbExhdGVyKGVtaXR0ZXIsdHlwZSl7dmFyIGFycj1nZXRIYW5kbGVycyhlbWl0dGVyLHR5cGUpO2lmKCFhcnIubGVuZ3RoKXtyZXR1cm59CnZhciBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSxsaXN0O2lmKG9wZXJhdGlvbkdyb3VwKXtsaXN0PW9wZXJhdGlvbkdyb3VwLmRlbGF5ZWRDYWxsYmFja3M7fWVsc2UgaWYob3JwaGFuRGVsYXllZENhbGxiYWNrcyl7bGlzdD1vcnBoYW5EZWxheWVkQ2FsbGJhY2tzO31lbHNle2xpc3Q9b3JwaGFuRGVsYXllZENhbGxiYWNrcz1bXTtzZXRUaW1lb3V0KGZpcmVPcnBoYW5EZWxheWVkLDApO30KdmFyIGxvb3A9ZnVuY3Rpb24oaSl7bGlzdC5wdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIGFycltpXS5hcHBseShudWxsLGFyZ3MpO30pO307Zm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSkKbG9vcChpKTt9CmZ1bmN0aW9uIGZpcmVPcnBoYW5EZWxheWVkKCl7dmFyIGRlbGF5ZWQ9b3JwaGFuRGVsYXllZENhbGxiYWNrcztvcnBoYW5EZWxheWVkQ2FsbGJhY2tzPW51bGw7Zm9yKHZhciBpPTA7aTxkZWxheWVkLmxlbmd0aDsrK2kpe2RlbGF5ZWRbaV0oKTt9fQpmdW5jdGlvbiB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSxsaW5lVmlldyxsaW5lTixkaW1zKXtmb3IodmFyIGo9MDtqPGxpbmVWaWV3LmNoYW5nZXMubGVuZ3RoO2orKyl7dmFyIHR5cGU9bGluZVZpZXcuY2hhbmdlc1tqXTtpZih0eXBlPT0idGV4dCIpe3VwZGF0ZUxpbmVUZXh0KGNtLGxpbmVWaWV3KTt9CmVsc2UgaWYodHlwZT09Imd1dHRlciIpe3VwZGF0ZUxpbmVHdXR0ZXIoY20sbGluZVZpZXcsbGluZU4sZGltcyk7fQplbHNlIGlmKHR5cGU9PSJjbGFzcyIpe3VwZGF0ZUxpbmVDbGFzc2VzKGNtLGxpbmVWaWV3KTt9CmVsc2UgaWYodHlwZT09IndpZGdldCIpe3VwZGF0ZUxpbmVXaWRnZXRzKGNtLGxpbmVWaWV3LGRpbXMpO319CmxpbmVWaWV3LmNoYW5nZXM9bnVsbDt9CmZ1bmN0aW9uIGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KXtpZihsaW5lVmlldy5ub2RlPT1saW5lVmlldy50ZXh0KXtsaW5lVmlldy5ub2RlPWVsdCgiZGl2IixudWxsLG51bGwsInBvc2l0aW9uOiByZWxhdGl2ZSIpO2lmKGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZSkKe2xpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobGluZVZpZXcubm9kZSxsaW5lVmlldy50ZXh0KTt9CmxpbmVWaWV3Lm5vZGUuYXBwZW5kQ2hpbGQobGluZVZpZXcudGV4dCk7aWYoaWUmJmllX3ZlcnNpb248OCl7bGluZVZpZXcubm9kZS5zdHlsZS56SW5kZXg9Mjt9fQpyZXR1cm4gbGluZVZpZXcubm9kZX0KZnVuY3Rpb24gdXBkYXRlTGluZUJhY2tncm91bmQoY20sbGluZVZpZXcpe3ZhciBjbHM9bGluZVZpZXcuYmdDbGFzcz9saW5lVmlldy5iZ0NsYXNzKyIgIisobGluZVZpZXcubGluZS5iZ0NsYXNzfHwiIik6bGluZVZpZXcubGluZS5iZ0NsYXNzO2lmKGNscyl7Y2xzKz0iIENvZGVNaXJyb3ItbGluZWJhY2tncm91bmQiO30KaWYobGluZVZpZXcuYmFja2dyb3VuZCl7aWYoY2xzKXtsaW5lVmlldy5iYWNrZ3JvdW5kLmNsYXNzTmFtZT1jbHM7fQplbHNle2xpbmVWaWV3LmJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5iYWNrZ3JvdW5kKTtsaW5lVmlldy5iYWNrZ3JvdW5kPW51bGw7fX1lbHNlIGlmKGNscyl7dmFyIHdyYXA9ZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpO2xpbmVWaWV3LmJhY2tncm91bmQ9d3JhcC5pbnNlcnRCZWZvcmUoZWx0KCJkaXYiLG51bGwsY2xzKSx3cmFwLmZpcnN0Q2hpbGQpO2NtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShsaW5lVmlldy5iYWNrZ3JvdW5kKTt9fQpmdW5jdGlvbiBnZXRMaW5lQ29udGVudChjbSxsaW5lVmlldyl7dmFyIGV4dD1jbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7aWYoZXh0JiZleHQubGluZT09bGluZVZpZXcubGluZSl7Y20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkPW51bGw7bGluZVZpZXcubWVhc3VyZT1leHQubWVhc3VyZTtyZXR1cm4gZXh0LmJ1aWx0fQpyZXR1cm4gYnVpbGRMaW5lQ29udGVudChjbSxsaW5lVmlldyl9CmZ1bmN0aW9uIHVwZGF0ZUxpbmVUZXh0KGNtLGxpbmVWaWV3KXt2YXIgY2xzPWxpbmVWaWV3LnRleHQuY2xhc3NOYW1lO3ZhciBidWlsdD1nZXRMaW5lQ29udGVudChjbSxsaW5lVmlldyk7aWYobGluZVZpZXcudGV4dD09bGluZVZpZXcubm9kZSl7bGluZVZpZXcubm9kZT1idWlsdC5wcmU7fQpsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1aWx0LnByZSxsaW5lVmlldy50ZXh0KTtsaW5lVmlldy50ZXh0PWJ1aWx0LnByZTtpZihidWlsdC5iZ0NsYXNzIT1saW5lVmlldy5iZ0NsYXNzfHxidWlsdC50ZXh0Q2xhc3MhPWxpbmVWaWV3LnRleHRDbGFzcyl7bGluZVZpZXcuYmdDbGFzcz1idWlsdC5iZ0NsYXNzO2xpbmVWaWV3LnRleHRDbGFzcz1idWlsdC50ZXh0Q2xhc3M7dXBkYXRlTGluZUNsYXNzZXMoY20sbGluZVZpZXcpO31lbHNlIGlmKGNscyl7bGluZVZpZXcudGV4dC5jbGFzc05hbWU9Y2xzO319CmZ1bmN0aW9uIHVwZGF0ZUxpbmVDbGFzc2VzKGNtLGxpbmVWaWV3KXt1cGRhdGVMaW5lQmFja2dyb3VuZChjbSxsaW5lVmlldyk7aWYobGluZVZpZXcubGluZS53cmFwQ2xhc3MpCntlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykuY2xhc3NOYW1lPWxpbmVWaWV3LmxpbmUud3JhcENsYXNzO30KZWxzZSBpZihsaW5lVmlldy5ub2RlIT1saW5lVmlldy50ZXh0KQp7bGluZVZpZXcubm9kZS5jbGFzc05hbWU9IiI7fQp2YXIgdGV4dENsYXNzPWxpbmVWaWV3LnRleHRDbGFzcz9saW5lVmlldy50ZXh0Q2xhc3MrIiAiKyhsaW5lVmlldy5saW5lLnRleHRDbGFzc3x8IiIpOmxpbmVWaWV3LmxpbmUudGV4dENsYXNzO2xpbmVWaWV3LnRleHQuY2xhc3NOYW1lPXRleHRDbGFzc3x8IiI7fQpmdW5jdGlvbiB1cGRhdGVMaW5lR3V0dGVyKGNtLGxpbmVWaWV3LGxpbmVOLGRpbXMpe2lmKGxpbmVWaWV3Lmd1dHRlcil7bGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXIpO2xpbmVWaWV3Lmd1dHRlcj1udWxsO30KaWYobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCl7bGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kKTtsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kPW51bGw7fQppZihsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzKXt2YXIgd3JhcD1lbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7bGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZD1lbHQoImRpdiIsbnVsbCwiQ29kZU1pcnJvci1ndXR0ZXItYmFja2dyb3VuZCAiK2xpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MsKCJsZWZ0OiAiKyhjbS5vcHRpb25zLmZpeGVkR3V0dGVyP2RpbXMuZml4ZWRQb3M6LWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkrInB4OyB3aWR0aDogIisoZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSsicHgiKSk7Y20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpO3dyYXAuaW5zZXJ0QmVmb3JlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQsbGluZVZpZXcudGV4dCk7fQp2YXIgbWFya2Vycz1saW5lVmlldy5saW5lLmd1dHRlck1hcmtlcnM7aWYoY20ub3B0aW9ucy5saW5lTnVtYmVyc3x8bWFya2Vycyl7dmFyIHdyYXAkMT1lbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7dmFyIGd1dHRlcldyYXA9bGluZVZpZXcuZ3V0dGVyPWVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLWd1dHRlci13cmFwcGVyIiwoImxlZnQ6ICIrKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXI/ZGltcy5maXhlZFBvczotZGltcy5ndXR0ZXJUb3RhbFdpZHRoKSsicHgiKSk7Y20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKGd1dHRlcldyYXApO3dyYXAkMS5pbnNlcnRCZWZvcmUoZ3V0dGVyV3JhcCxsaW5lVmlldy50ZXh0KTtpZihsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzKQp7Z3V0dGVyV3JhcC5jbGFzc05hbWUrPSIgIitsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzO30KaWYoY20ub3B0aW9ucy5saW5lTnVtYmVycyYmKCFtYXJrZXJzfHwhbWFya2Vyc1siQ29kZU1pcnJvci1saW5lbnVtYmVycyJdKSkKe2xpbmVWaWV3LmxpbmVOdW1iZXI9Z3V0dGVyV3JhcC5hcHBlbmRDaGlsZChlbHQoImRpdiIsbGluZU51bWJlckZvcihjbS5vcHRpb25zLGxpbmVOKSwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsKCJsZWZ0OiAiKyhkaW1zLmd1dHRlckxlZnRbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSkrInB4OyB3aWR0aDogIisoY20uZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCkrInB4IikpKTt9CmlmKG1hcmtlcnMpe2Zvcih2YXIgaz0wO2s8Y20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsrK2spe3ZhciBpZD1jbS5vcHRpb25zLmd1dHRlcnNba10sZm91bmQ9bWFya2Vycy5oYXNPd25Qcm9wZXJ0eShpZCkmJm1hcmtlcnNbaWRdO2lmKGZvdW5kKQp7Z3V0dGVyV3JhcC5hcHBlbmRDaGlsZChlbHQoImRpdiIsW2ZvdW5kXSwiQ29kZU1pcnJvci1ndXR0ZXItZWx0IiwoImxlZnQ6ICIrKGRpbXMuZ3V0dGVyTGVmdFtpZF0pKyJweDsgd2lkdGg6ICIrKGRpbXMuZ3V0dGVyV2lkdGhbaWRdKSsicHgiKSkpO319fX19CmZ1bmN0aW9uIHVwZGF0ZUxpbmVXaWRnZXRzKGNtLGxpbmVWaWV3LGRpbXMpe2lmKGxpbmVWaWV3LmFsaWduYWJsZSl7bGluZVZpZXcuYWxpZ25hYmxlPW51bGw7fQpmb3IodmFyIG5vZGU9bGluZVZpZXcubm9kZS5maXJzdENoaWxkLG5leHQ9KHZvaWQgMCk7bm9kZTtub2RlPW5leHQpe25leHQ9bm9kZS5uZXh0U2libGluZztpZihub2RlLmNsYXNzTmFtZT09IkNvZGVNaXJyb3ItbGluZXdpZGdldCIpCntsaW5lVmlldy5ub2RlLnJlbW92ZUNoaWxkKG5vZGUpO319Cmluc2VydExpbmVXaWRnZXRzKGNtLGxpbmVWaWV3LGRpbXMpO30KZnVuY3Rpb24gYnVpbGRMaW5lRWxlbWVudChjbSxsaW5lVmlldyxsaW5lTixkaW1zKXt2YXIgYnVpbHQ9Z2V0TGluZUNvbnRlbnQoY20sbGluZVZpZXcpO2xpbmVWaWV3LnRleHQ9bGluZVZpZXcubm9kZT1idWlsdC5wcmU7aWYoYnVpbHQuYmdDbGFzcyl7bGluZVZpZXcuYmdDbGFzcz1idWlsdC5iZ0NsYXNzO30KaWYoYnVpbHQudGV4dENsYXNzKXtsaW5lVmlldy50ZXh0Q2xhc3M9YnVpbHQudGV4dENsYXNzO30KdXBkYXRlTGluZUNsYXNzZXMoY20sbGluZVZpZXcpO3VwZGF0ZUxpbmVHdXR0ZXIoY20sbGluZVZpZXcsbGluZU4sZGltcyk7aW5zZXJ0TGluZVdpZGdldHMoY20sbGluZVZpZXcsZGltcyk7cmV0dXJuIGxpbmVWaWV3Lm5vZGV9CmZ1bmN0aW9uIGluc2VydExpbmVXaWRnZXRzKGNtLGxpbmVWaWV3LGRpbXMpe2luc2VydExpbmVXaWRnZXRzRm9yKGNtLGxpbmVWaWV3LmxpbmUsbGluZVZpZXcsZGltcyx0cnVlKTtpZihsaW5lVmlldy5yZXN0KXtmb3IodmFyIGk9MDtpPGxpbmVWaWV3LnJlc3QubGVuZ3RoO2krKykKe2luc2VydExpbmVXaWRnZXRzRm9yKGNtLGxpbmVWaWV3LnJlc3RbaV0sbGluZVZpZXcsZGltcyxmYWxzZSk7fX19CmZ1bmN0aW9uIGluc2VydExpbmVXaWRnZXRzRm9yKGNtLGxpbmUsbGluZVZpZXcsZGltcyxhbGxvd0Fib3ZlKXtpZighbGluZS53aWRnZXRzKXtyZXR1cm59CnZhciB3cmFwPWVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KTtmb3IodmFyIGk9MCx3cz1saW5lLndpZGdldHM7aTx3cy5sZW5ndGg7KytpKXt2YXIgd2lkZ2V0PXdzW2ldLG5vZGU9ZWx0KCJkaXYiLFt3aWRnZXQubm9kZV0sIkNvZGVNaXJyb3ItbGluZXdpZGdldCIpO2lmKCF3aWRnZXQuaGFuZGxlTW91c2VFdmVudHMpe25vZGUuc2V0QXR0cmlidXRlKCJjbS1pZ25vcmUtZXZlbnRzIiwidHJ1ZSIpO30KcG9zaXRpb25MaW5lV2lkZ2V0KHdpZGdldCxub2RlLGxpbmVWaWV3LGRpbXMpO2NtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKTtpZihhbGxvd0Fib3ZlJiZ3aWRnZXQuYWJvdmUpCnt3cmFwLmluc2VydEJlZm9yZShub2RlLGxpbmVWaWV3Lmd1dHRlcnx8bGluZVZpZXcudGV4dCk7fQplbHNlCnt3cmFwLmFwcGVuZENoaWxkKG5vZGUpO30Kc2lnbmFsTGF0ZXIod2lkZ2V0LCJyZWRyYXciKTt9fQpmdW5jdGlvbiBwb3NpdGlvbkxpbmVXaWRnZXQod2lkZ2V0LG5vZGUsbGluZVZpZXcsZGltcyl7aWYod2lkZ2V0Lm5vSFNjcm9sbCl7KGxpbmVWaWV3LmFsaWduYWJsZXx8KGxpbmVWaWV3LmFsaWduYWJsZT1bXSkpLnB1c2gobm9kZSk7dmFyIHdpZHRoPWRpbXMud3JhcHBlcldpZHRoO25vZGUuc3R5bGUubGVmdD1kaW1zLmZpeGVkUG9zKyJweCI7aWYoIXdpZGdldC5jb3Zlckd1dHRlcil7d2lkdGgtPWRpbXMuZ3V0dGVyVG90YWxXaWR0aDtub2RlLnN0eWxlLnBhZGRpbmdMZWZ0PWRpbXMuZ3V0dGVyVG90YWxXaWR0aCsicHgiO30Kbm9kZS5zdHlsZS53aWR0aD13aWR0aCsicHgiO30KaWYod2lkZ2V0LmNvdmVyR3V0dGVyKXtub2RlLnN0eWxlLnpJbmRleD01O25vZGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjtpZighd2lkZ2V0Lm5vSFNjcm9sbCl7bm9kZS5zdHlsZS5tYXJnaW5MZWZ0PS1kaW1zLmd1dHRlclRvdGFsV2lkdGgrInB4Ijt9fX0KZnVuY3Rpb24gd2lkZ2V0SGVpZ2h0KHdpZGdldCl7aWYod2lkZ2V0LmhlaWdodCE9bnVsbCl7cmV0dXJuIHdpZGdldC5oZWlnaHR9CnZhciBjbT13aWRnZXQuZG9jLmNtO2lmKCFjbSl7cmV0dXJuIDB9CmlmKCFjb250YWlucyhkb2N1bWVudC5ib2R5LHdpZGdldC5ub2RlKSl7dmFyIHBhcmVudFN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IjtpZih3aWRnZXQuY292ZXJHdXR0ZXIpCntwYXJlbnRTdHlsZSs9Im1hcmdpbi1sZWZ0OiAtIitjbS5kaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgrInB4OyI7fQppZih3aWRnZXQubm9IU2Nyb2xsKQp7cGFyZW50U3R5bGUrPSJ3aWR0aDogIitjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGgrInB4OyI7fQpyZW1vdmVDaGlsZHJlbkFuZEFkZChjbS5kaXNwbGF5Lm1lYXN1cmUsZWx0KCJkaXYiLFt3aWRnZXQubm9kZV0sbnVsbCxwYXJlbnRTdHlsZSkpO30KcmV0dXJuIHdpZGdldC5oZWlnaHQ9d2lkZ2V0Lm5vZGUucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHR9CmZ1bmN0aW9uIGV2ZW50SW5XaWRnZXQoZGlzcGxheSxlKXtmb3IodmFyIG49ZV90YXJnZXQoZSk7biE9ZGlzcGxheS53cmFwcGVyO249bi5wYXJlbnROb2RlKXtpZighbnx8KG4ubm9kZVR5cGU9PTEmJm4uZ2V0QXR0cmlidXRlKCJjbS1pZ25vcmUtZXZlbnRzIik9PSJ0cnVlIil8fChuLnBhcmVudE5vZGU9PWRpc3BsYXkuc2l6ZXImJm4hPWRpc3BsYXkubW92ZXIpKQp7cmV0dXJuIHRydWV9fX0KZnVuY3Rpb24gcGFkZGluZ1RvcChkaXNwbGF5KXtyZXR1cm4gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0VG9wfQpmdW5jdGlvbiBwYWRkaW5nVmVydChkaXNwbGF5KXtyZXR1cm4gZGlzcGxheS5tb3Zlci5vZmZzZXRIZWlnaHQtZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0SGVpZ2h0fQpmdW5jdGlvbiBwYWRkaW5nSChkaXNwbGF5KXtpZihkaXNwbGF5LmNhY2hlZFBhZGRpbmdIKXtyZXR1cm4gZGlzcGxheS5jYWNoZWRQYWRkaW5nSH0KdmFyIGU9cmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLGVsdCgicHJlIiwieCIpKTt2YXIgc3R5bGU9d2luZG93LmdldENvbXB1dGVkU3R5bGU/d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk6ZS5jdXJyZW50U3R5bGU7dmFyIGRhdGE9e2xlZnQ6cGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQpLHJpZ2h0OnBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCl9O2lmKCFpc05hTihkYXRhLmxlZnQpJiYhaXNOYU4oZGF0YS5yaWdodCkpe2Rpc3BsYXkuY2FjaGVkUGFkZGluZ0g9ZGF0YTt9CnJldHVybiBkYXRhfQpmdW5jdGlvbiBzY3JvbGxHYXAoY20pe3JldHVybiBzY3JvbGxlckdhcC1jbS5kaXNwbGF5Lm5hdGl2ZUJhcldpZHRofQpmdW5jdGlvbiBkaXNwbGF5V2lkdGgoY20pe3JldHVybiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLXNjcm9sbEdhcChjbSktY20uZGlzcGxheS5iYXJXaWR0aH0KZnVuY3Rpb24gZGlzcGxheUhlaWdodChjbSl7cmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LXNjcm9sbEdhcChjbSktY20uZGlzcGxheS5iYXJIZWlnaHR9CmZ1bmN0aW9uIGVuc3VyZUxpbmVIZWlnaHRzKGNtLGxpbmVWaWV3LHJlY3Qpe3ZhciB3cmFwcGluZz1jbS5vcHRpb25zLmxpbmVXcmFwcGluZzt2YXIgY3VyV2lkdGg9d3JhcHBpbmcmJmRpc3BsYXlXaWR0aChjbSk7aWYoIWxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0c3x8d3JhcHBpbmcmJmxpbmVWaWV3Lm1lYXN1cmUud2lkdGghPWN1cldpZHRoKXt2YXIgaGVpZ2h0cz1saW5lVmlldy5tZWFzdXJlLmhlaWdodHM9W107aWYod3JhcHBpbmcpe2xpbmVWaWV3Lm1lYXN1cmUud2lkdGg9Y3VyV2lkdGg7dmFyIHJlY3RzPWxpbmVWaWV3LnRleHQuZmlyc3RDaGlsZC5nZXRDbGllbnRSZWN0cygpO2Zvcih2YXIgaT0wO2k8cmVjdHMubGVuZ3RoLTE7aSsrKXt2YXIgY3VyPXJlY3RzW2ldLG5leHQ9cmVjdHNbaSsxXTtpZihNYXRoLmFicyhjdXIuYm90dG9tLW5leHQuYm90dG9tKT4yKQp7aGVpZ2h0cy5wdXNoKChjdXIuYm90dG9tK25leHQudG9wKS8yLXJlY3QudG9wKTt9fX0KaGVpZ2h0cy5wdXNoKHJlY3QuYm90dG9tLXJlY3QudG9wKTt9fQpmdW5jdGlvbiBtYXBGcm9tTGluZVZpZXcobGluZVZpZXcsbGluZSxsaW5lTil7aWYobGluZVZpZXcubGluZT09bGluZSkKe3JldHVybnttYXA6bGluZVZpZXcubWVhc3VyZS5tYXAsY2FjaGU6bGluZVZpZXcubWVhc3VyZS5jYWNoZX19CmZvcih2YXIgaT0wO2k8bGluZVZpZXcucmVzdC5sZW5ndGg7aSsrKQp7aWYobGluZVZpZXcucmVzdFtpXT09bGluZSkKe3JldHVybnttYXA6bGluZVZpZXcubWVhc3VyZS5tYXBzW2ldLGNhY2hlOmxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzW2ldfX19CmZvcih2YXIgaSQxPTA7aSQxPGxpbmVWaWV3LnJlc3QubGVuZ3RoO2kkMSsrKQp7aWYobGluZU5vKGxpbmVWaWV3LnJlc3RbaSQxXSk+bGluZU4pCntyZXR1cm57bWFwOmxpbmVWaWV3Lm1lYXN1cmUubWFwc1tpJDFdLGNhY2hlOmxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzW2kkMV0sYmVmb3JlOnRydWV9fX19CmZ1bmN0aW9uIHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sbGluZSl7bGluZT12aXN1YWxMaW5lKGxpbmUpO3ZhciBsaW5lTj1saW5lTm8obGluZSk7dmFyIHZpZXc9Y20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkPW5ldyBMaW5lVmlldyhjbS5kb2MsbGluZSxsaW5lTik7dmlldy5saW5lTj1saW5lTjt2YXIgYnVpbHQ9dmlldy5idWlsdD1idWlsZExpbmVDb250ZW50KGNtLHZpZXcpO3ZpZXcudGV4dD1idWlsdC5wcmU7cmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5saW5lTWVhc3VyZSxidWlsdC5wcmUpO3JldHVybiB2aWV3fQpmdW5jdGlvbiBtZWFzdXJlQ2hhcihjbSxsaW5lLGNoLGJpYXMpe3JldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSxsaW5lKSxjaCxiaWFzKX0KZnVuY3Rpb24gZmluZFZpZXdGb3JMaW5lKGNtLGxpbmVOKXtpZihsaW5lTj49Y20uZGlzcGxheS52aWV3RnJvbSYmbGluZU48Y20uZGlzcGxheS52aWV3VG8pCntyZXR1cm4gY20uZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sbGluZU4pXX0KdmFyIGV4dD1jbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7aWYoZXh0JiZsaW5lTj49ZXh0LmxpbmVOJiZsaW5lTjxleHQubGluZU4rZXh0LnNpemUpCntyZXR1cm4gZXh0fX0KZnVuY3Rpb24gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLGxpbmUpe3ZhciBsaW5lTj1saW5lTm8obGluZSk7dmFyIHZpZXc9ZmluZFZpZXdGb3JMaW5lKGNtLGxpbmVOKTtpZih2aWV3JiYhdmlldy50ZXh0KXt2aWV3PW51bGw7fWVsc2UgaWYodmlldyYmdmlldy5jaGFuZ2VzKXt1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSx2aWV3LGxpbmVOLGdldERpbWVuc2lvbnMoY20pKTtjbS5jdXJPcC5mb3JjZVVwZGF0ZT10cnVlO30KaWYoIXZpZXcpCnt2aWV3PXVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sbGluZSk7fQp2YXIgaW5mbz1tYXBGcm9tTGluZVZpZXcodmlldyxsaW5lLGxpbmVOKTtyZXR1cm57bGluZTpsaW5lLHZpZXc6dmlldyxyZWN0Om51bGwsbWFwOmluZm8ubWFwLGNhY2hlOmluZm8uY2FjaGUsYmVmb3JlOmluZm8uYmVmb3JlLGhhc0hlaWdodHM6ZmFsc2V9fQpmdW5jdGlvbiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXBhcmVkLGNoLGJpYXMsdmFySGVpZ2h0KXtpZihwcmVwYXJlZC5iZWZvcmUpe2NoPS0xO30KdmFyIGtleT1jaCsoYmlhc3x8IiIpLGZvdW5kO2lmKHByZXBhcmVkLmNhY2hlLmhhc093blByb3BlcnR5KGtleSkpe2ZvdW5kPXByZXBhcmVkLmNhY2hlW2tleV07fWVsc2V7aWYoIXByZXBhcmVkLnJlY3QpCntwcmVwYXJlZC5yZWN0PXByZXBhcmVkLnZpZXcudGV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt9CmlmKCFwcmVwYXJlZC5oYXNIZWlnaHRzKXtlbnN1cmVMaW5lSGVpZ2h0cyhjbSxwcmVwYXJlZC52aWV3LHByZXBhcmVkLnJlY3QpO3ByZXBhcmVkLmhhc0hlaWdodHM9dHJ1ZTt9CmZvdW5kPW1lYXN1cmVDaGFySW5uZXIoY20scHJlcGFyZWQsY2gsYmlhcyk7aWYoIWZvdW5kLmJvZ3VzKXtwcmVwYXJlZC5jYWNoZVtrZXldPWZvdW5kO319CnJldHVybntsZWZ0OmZvdW5kLmxlZnQscmlnaHQ6Zm91bmQucmlnaHQsdG9wOnZhckhlaWdodD9mb3VuZC5ydG9wOmZvdW5kLnRvcCxib3R0b206dmFySGVpZ2h0P2ZvdW5kLnJib3R0b206Zm91bmQuYm90dG9tfX0KdmFyIG51bGxSZWN0PXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MH07ZnVuY3Rpb24gbm9kZUFuZE9mZnNldEluTGluZU1hcChtYXAkJDEsY2gsYmlhcyl7dmFyIG5vZGUsc3RhcnQsZW5kLGNvbGxhcHNlLG1TdGFydCxtRW5kO2Zvcih2YXIgaT0wO2k8bWFwJCQxLmxlbmd0aDtpKz0zKXttU3RhcnQ9bWFwJCQxW2ldO21FbmQ9bWFwJCQxW2krMV07aWYoY2g8bVN0YXJ0KXtzdGFydD0wO2VuZD0xO2NvbGxhcHNlPSJsZWZ0Ijt9ZWxzZSBpZihjaDxtRW5kKXtzdGFydD1jaC1tU3RhcnQ7ZW5kPXN0YXJ0KzE7fWVsc2UgaWYoaT09bWFwJCQxLmxlbmd0aC0zfHxjaD09bUVuZCYmbWFwJCQxW2krM10+Y2gpe2VuZD1tRW5kLW1TdGFydDtzdGFydD1lbmQtMTtpZihjaD49bUVuZCl7Y29sbGFwc2U9InJpZ2h0Ijt9fQppZihzdGFydCE9bnVsbCl7bm9kZT1tYXAkJDFbaSsyXTtpZihtU3RhcnQ9PW1FbmQmJmJpYXM9PShub2RlLmluc2VydExlZnQ/ImxlZnQiOiJyaWdodCIpKQp7Y29sbGFwc2U9Ymlhczt9CmlmKGJpYXM9PSJsZWZ0IiYmc3RhcnQ9PTApCnt3aGlsZShpJiZtYXAkJDFbaS0yXT09bWFwJCQxW2ktM10mJm1hcCQkMVtpLTFdLmluc2VydExlZnQpe25vZGU9bWFwJCQxWyhpLT0zKSsyXTtjb2xsYXBzZT0ibGVmdCI7fX0KaWYoYmlhcz09InJpZ2h0IiYmc3RhcnQ9PW1FbmQtbVN0YXJ0KQp7d2hpbGUoaTxtYXAkJDEubGVuZ3RoLTMmJm1hcCQkMVtpKzNdPT1tYXAkJDFbaSs0XSYmIW1hcCQkMVtpKzVdLmluc2VydExlZnQpe25vZGU9bWFwJCQxWyhpKz0zKSsyXTtjb2xsYXBzZT0icmlnaHQiO319CmJyZWFrfX0KcmV0dXJue25vZGU6bm9kZSxzdGFydDpzdGFydCxlbmQ6ZW5kLGNvbGxhcHNlOmNvbGxhcHNlLGNvdmVyU3RhcnQ6bVN0YXJ0LGNvdmVyRW5kOm1FbmR9fQpmdW5jdGlvbiBnZXRVc2VmdWxSZWN0KHJlY3RzLGJpYXMpe3ZhciByZWN0PW51bGxSZWN0O2lmKGJpYXM9PSJsZWZ0Iil7Zm9yKHZhciBpPTA7aTxyZWN0cy5sZW5ndGg7aSsrKXtpZigocmVjdD1yZWN0c1tpXSkubGVmdCE9cmVjdC5yaWdodCl7YnJlYWt9fX1lbHNle2Zvcih2YXIgaSQxPXJlY3RzLmxlbmd0aC0xO2kkMT49MDtpJDEtLSl7aWYoKHJlY3Q9cmVjdHNbaSQxXSkubGVmdCE9cmVjdC5yaWdodCl7YnJlYWt9fX0KcmV0dXJuIHJlY3R9CmZ1bmN0aW9uIG1lYXN1cmVDaGFySW5uZXIoY20scHJlcGFyZWQsY2gsYmlhcyl7dmFyIHBsYWNlPW5vZGVBbmRPZmZzZXRJbkxpbmVNYXAocHJlcGFyZWQubWFwLGNoLGJpYXMpO3ZhciBub2RlPXBsYWNlLm5vZGUsc3RhcnQ9cGxhY2Uuc3RhcnQsZW5kPXBsYWNlLmVuZCxjb2xsYXBzZT1wbGFjZS5jb2xsYXBzZTt2YXIgcmVjdDtpZihub2RlLm5vZGVUeXBlPT0zKXtmb3IodmFyIGkkMT0wO2kkMTw0O2kkMSsrKXt3aGlsZShzdGFydCYmaXNFeHRlbmRpbmdDaGFyKHByZXBhcmVkLmxpbmUudGV4dC5jaGFyQXQocGxhY2UuY292ZXJTdGFydCtzdGFydCkpKXstLXN0YXJ0O30Kd2hpbGUocGxhY2UuY292ZXJTdGFydCtlbmQ8cGxhY2UuY292ZXJFbmQmJmlzRXh0ZW5kaW5nQ2hhcihwcmVwYXJlZC5saW5lLnRleHQuY2hhckF0KHBsYWNlLmNvdmVyU3RhcnQrZW5kKSkpeysrZW5kO30KaWYoaWUmJmllX3ZlcnNpb248OSYmc3RhcnQ9PTAmJmVuZD09cGxhY2UuY292ZXJFbmQtcGxhY2UuY292ZXJTdGFydCkKe3JlY3Q9bm9kZS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO30KZWxzZQp7cmVjdD1nZXRVc2VmdWxSZWN0KHJhbmdlKG5vZGUsc3RhcnQsZW5kKS5nZXRDbGllbnRSZWN0cygpLGJpYXMpO30KaWYocmVjdC5sZWZ0fHxyZWN0LnJpZ2h0fHxzdGFydD09MCl7YnJlYWt9CmVuZD1zdGFydDtzdGFydD1zdGFydC0xO2NvbGxhcHNlPSJyaWdodCI7fQppZihpZSYmaWVfdmVyc2lvbjwxMSl7cmVjdD1tYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKGNtLmRpc3BsYXkubWVhc3VyZSxyZWN0KTt9fWVsc2V7aWYoc3RhcnQ+MCl7Y29sbGFwc2U9Ymlhcz0icmlnaHQiO30KdmFyIHJlY3RzO2lmKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nJiYocmVjdHM9bm9kZS5nZXRDbGllbnRSZWN0cygpKS5sZW5ndGg+MSkKe3JlY3Q9cmVjdHNbYmlhcz09InJpZ2h0Ij9yZWN0cy5sZW5ndGgtMTowXTt9CmVsc2UKe3JlY3Q9bm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt9fQppZihpZSYmaWVfdmVyc2lvbjw5JiYhc3RhcnQmJighcmVjdHx8IXJlY3QubGVmdCYmIXJlY3QucmlnaHQpKXt2YXIgclNwYW49bm9kZS5wYXJlbnROb2RlLmdldENsaWVudFJlY3RzKClbMF07aWYoclNwYW4pCntyZWN0PXtsZWZ0OnJTcGFuLmxlZnQscmlnaHQ6clNwYW4ubGVmdCtjaGFyV2lkdGgoY20uZGlzcGxheSksdG9wOnJTcGFuLnRvcCxib3R0b206clNwYW4uYm90dG9tfTt9CmVsc2UKe3JlY3Q9bnVsbFJlY3Q7fX0KdmFyIHJ0b3A9cmVjdC50b3AtcHJlcGFyZWQucmVjdC50b3AscmJvdD1yZWN0LmJvdHRvbS1wcmVwYXJlZC5yZWN0LnRvcDt2YXIgbWlkPShydG9wK3Jib3QpLzI7dmFyIGhlaWdodHM9cHJlcGFyZWQudmlldy5tZWFzdXJlLmhlaWdodHM7dmFyIGk9MDtmb3IoO2k8aGVpZ2h0cy5sZW5ndGgtMTtpKyspCntpZihtaWQ8aGVpZ2h0c1tpXSl7YnJlYWt9fQp2YXIgdG9wPWk/aGVpZ2h0c1tpLTFdOjAsYm90PWhlaWdodHNbaV07dmFyIHJlc3VsdD17bGVmdDooY29sbGFwc2U9PSJyaWdodCI/cmVjdC5yaWdodDpyZWN0LmxlZnQpLXByZXBhcmVkLnJlY3QubGVmdCxyaWdodDooY29sbGFwc2U9PSJsZWZ0Ij9yZWN0LmxlZnQ6cmVjdC5yaWdodCktcHJlcGFyZWQucmVjdC5sZWZ0LHRvcDp0b3AsYm90dG9tOmJvdH07aWYoIXJlY3QubGVmdCYmIXJlY3QucmlnaHQpe3Jlc3VsdC5ib2d1cz10cnVlO30KaWYoIWNtLm9wdGlvbnMuc2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSl7cmVzdWx0LnJ0b3A9cnRvcDtyZXN1bHQucmJvdHRvbT1yYm90O30KcmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gbWF5YmVVcGRhdGVSZWN0Rm9yWm9vbWluZyhtZWFzdXJlLHJlY3Qpe2lmKCF3aW5kb3cuc2NyZWVufHxzY3JlZW4ubG9naWNhbFhEUEk9PW51bGx8fHNjcmVlbi5sb2dpY2FsWERQST09c2NyZWVuLmRldmljZVhEUEl8fCFoYXNCYWRab29tZWRSZWN0cyhtZWFzdXJlKSkKe3JldHVybiByZWN0fQp2YXIgc2NhbGVYPXNjcmVlbi5sb2dpY2FsWERQSS9zY3JlZW4uZGV2aWNlWERQSTt2YXIgc2NhbGVZPXNjcmVlbi5sb2dpY2FsWURQSS9zY3JlZW4uZGV2aWNlWURQSTtyZXR1cm57bGVmdDpyZWN0LmxlZnQqc2NhbGVYLHJpZ2h0OnJlY3QucmlnaHQqc2NhbGVYLHRvcDpyZWN0LnRvcCpzY2FsZVksYm90dG9tOnJlY3QuYm90dG9tKnNjYWxlWX19CmZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IobGluZVZpZXcpe2lmKGxpbmVWaWV3Lm1lYXN1cmUpe2xpbmVWaWV3Lm1lYXN1cmUuY2FjaGU9e307bGluZVZpZXcubWVhc3VyZS5oZWlnaHRzPW51bGw7aWYobGluZVZpZXcucmVzdCl7Zm9yKHZhciBpPTA7aTxsaW5lVmlldy5yZXN0Lmxlbmd0aDtpKyspCntsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXT17fTt9fX19CmZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUoY20pe2NtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlPW51bGw7cmVtb3ZlQ2hpbGRyZW4oY20uZGlzcGxheS5saW5lTWVhc3VyZSk7Zm9yKHZhciBpPTA7aTxjbS5kaXNwbGF5LnZpZXcubGVuZ3RoO2krKykKe2NsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IoY20uZGlzcGxheS52aWV3W2ldKTt9fQpmdW5jdGlvbiBjbGVhckNhY2hlcyhjbSl7Y2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZShjbSk7Y20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGg9Y20uZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0PWNtLmRpc3BsYXkuY2FjaGVkUGFkZGluZ0g9bnVsbDtpZighY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpe2NtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQ9dHJ1ZTt9CmNtLmRpc3BsYXkubGluZU51bUNoYXJzPW51bGw7fQpmdW5jdGlvbiBwYWdlU2Nyb2xsWCgpe2lmKGNocm9tZSYmYW5kcm9pZCl7cmV0dXJuLShkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5tYXJnaW5MZWZ0KSl9CnJldHVybiB3aW5kb3cucGFnZVhPZmZzZXR8fChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnR9CmZ1bmN0aW9uIHBhZ2VTY3JvbGxZKCl7aWYoY2hyb21lJiZhbmRyb2lkKXtyZXR1cm4tKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkubWFyZ2luVG9wKSl9CnJldHVybiB3aW5kb3cucGFnZVlPZmZzZXR8fChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcH0KZnVuY3Rpb24gd2lkZ2V0VG9wSGVpZ2h0KGxpbmVPYmope3ZhciBoZWlnaHQ9MDtpZihsaW5lT2JqLndpZGdldHMpe2Zvcih2YXIgaT0wO2k8bGluZU9iai53aWRnZXRzLmxlbmd0aDsrK2kpe2lmKGxpbmVPYmoud2lkZ2V0c1tpXS5hYm92ZSkKe2hlaWdodCs9d2lkZ2V0SGVpZ2h0KGxpbmVPYmoud2lkZ2V0c1tpXSk7fX19CnJldHVybiBoZWlnaHR9CmZ1bmN0aW9uIGludG9Db29yZFN5c3RlbShjbSxsaW5lT2JqLHJlY3QsY29udGV4dCxpbmNsdWRlV2lkZ2V0cyl7aWYoIWluY2x1ZGVXaWRnZXRzKXt2YXIgaGVpZ2h0PXdpZGdldFRvcEhlaWdodChsaW5lT2JqKTtyZWN0LnRvcCs9aGVpZ2h0O3JlY3QuYm90dG9tKz1oZWlnaHQ7fQppZihjb250ZXh0PT0ibGluZSIpe3JldHVybiByZWN0fQppZighY29udGV4dCl7Y29udGV4dD0ibG9jYWwiO30KdmFyIHlPZmY9aGVpZ2h0QXRMaW5lKGxpbmVPYmopO2lmKGNvbnRleHQ9PSJsb2NhbCIpe3lPZmYrPXBhZGRpbmdUb3AoY20uZGlzcGxheSk7fQplbHNle3lPZmYtPWNtLmRpc3BsYXkudmlld09mZnNldDt9CmlmKGNvbnRleHQ9PSJwYWdlInx8Y29udGV4dD09IndpbmRvdyIpe3ZhciBsT2ZmPWNtLmRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3lPZmYrPWxPZmYudG9wKyhjb250ZXh0PT0id2luZG93Ij8wOnBhZ2VTY3JvbGxZKCkpO3ZhciB4T2ZmPWxPZmYubGVmdCsoY29udGV4dD09IndpbmRvdyI/MDpwYWdlU2Nyb2xsWCgpKTtyZWN0LmxlZnQrPXhPZmY7cmVjdC5yaWdodCs9eE9mZjt9CnJlY3QudG9wKz15T2ZmO3JlY3QuYm90dG9tKz15T2ZmO3JldHVybiByZWN0fQpmdW5jdGlvbiBmcm9tQ29vcmRTeXN0ZW0oY20sY29vcmRzLGNvbnRleHQpe2lmKGNvbnRleHQ9PSJkaXYiKXtyZXR1cm4gY29vcmRzfQp2YXIgbGVmdD1jb29yZHMubGVmdCx0b3A9Y29vcmRzLnRvcDtpZihjb250ZXh0PT0icGFnZSIpe2xlZnQtPXBhZ2VTY3JvbGxYKCk7dG9wLT1wYWdlU2Nyb2xsWSgpO31lbHNlIGlmKGNvbnRleHQ9PSJsb2NhbCJ8fCFjb250ZXh0KXt2YXIgbG9jYWxCb3g9Y20uZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZWZ0Kz1sb2NhbEJveC5sZWZ0O3RvcCs9bG9jYWxCb3gudG9wO30KdmFyIGxpbmVTcGFjZUJveD1jbS5kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57bGVmdDpsZWZ0LWxpbmVTcGFjZUJveC5sZWZ0LHRvcDp0b3AtbGluZVNwYWNlQm94LnRvcH19CmZ1bmN0aW9uIGNoYXJDb29yZHMoY20scG9zLGNvbnRleHQsbGluZU9iaixiaWFzKXtpZighbGluZU9iail7bGluZU9iaj1nZXRMaW5lKGNtLmRvYyxwb3MubGluZSk7fQpyZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLGxpbmVPYmosbWVhc3VyZUNoYXIoY20sbGluZU9iaixwb3MuY2gsYmlhcyksY29udGV4dCl9CmZ1bmN0aW9uIGN1cnNvckNvb3JkcyhjbSxwb3MsY29udGV4dCxsaW5lT2JqLHByZXBhcmVkTWVhc3VyZSx2YXJIZWlnaHQpe2xpbmVPYmo9bGluZU9ianx8Z2V0TGluZShjbS5kb2MscG9zLmxpbmUpO2lmKCFwcmVwYXJlZE1lYXN1cmUpe3ByZXBhcmVkTWVhc3VyZT1wcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sbGluZU9iaik7fQpmdW5jdGlvbiBnZXQoY2gscmlnaHQpe3ZhciBtPW1lYXN1cmVDaGFyUHJlcGFyZWQoY20scHJlcGFyZWRNZWFzdXJlLGNoLHJpZ2h0PyJyaWdodCI6ImxlZnQiLHZhckhlaWdodCk7aWYocmlnaHQpe20ubGVmdD1tLnJpZ2h0O31lbHNle20ucmlnaHQ9bS5sZWZ0O30KcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSxsaW5lT2JqLG0sY29udGV4dCl9CnZhciBvcmRlcj1nZXRPcmRlcihsaW5lT2JqLGNtLmRvYy5kaXJlY3Rpb24pLGNoPXBvcy5jaCxzdGlja3k9cG9zLnN0aWNreTtpZihjaD49bGluZU9iai50ZXh0Lmxlbmd0aCl7Y2g9bGluZU9iai50ZXh0Lmxlbmd0aDtzdGlja3k9ImJlZm9yZSI7fWVsc2UgaWYoY2g8PTApe2NoPTA7c3RpY2t5PSJhZnRlciI7fQppZighb3JkZXIpe3JldHVybiBnZXQoc3RpY2t5PT0iYmVmb3JlIj9jaC0xOmNoLHN0aWNreT09ImJlZm9yZSIpfQpmdW5jdGlvbiBnZXRCaWRpKGNoLHBhcnRQb3MsaW52ZXJ0KXt2YXIgcGFydD1vcmRlcltwYXJ0UG9zXSxyaWdodD1wYXJ0LmxldmVsPT0xO3JldHVybiBnZXQoaW52ZXJ0P2NoLTE6Y2gscmlnaHQhPWludmVydCl9CnZhciBwYXJ0UG9zPWdldEJpZGlQYXJ0QXQob3JkZXIsY2gsc3RpY2t5KTt2YXIgb3RoZXI9YmlkaU90aGVyO3ZhciB2YWw9Z2V0QmlkaShjaCxwYXJ0UG9zLHN0aWNreT09ImJlZm9yZSIpO2lmKG90aGVyIT1udWxsKXt2YWwub3RoZXI9Z2V0QmlkaShjaCxvdGhlcixzdGlja3khPSJiZWZvcmUiKTt9CnJldHVybiB2YWx9CmZ1bmN0aW9uIGVzdGltYXRlQ29vcmRzKGNtLHBvcyl7dmFyIGxlZnQ9MDtwb3M9Y2xpcFBvcyhjbS5kb2MscG9zKTtpZighY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpe2xlZnQ9Y2hhcldpZHRoKGNtLmRpc3BsYXkpKnBvcy5jaDt9CnZhciBsaW5lT2JqPWdldExpbmUoY20uZG9jLHBvcy5saW5lKTt2YXIgdG9wPWhlaWdodEF0TGluZShsaW5lT2JqKStwYWRkaW5nVG9wKGNtLmRpc3BsYXkpO3JldHVybntsZWZ0OmxlZnQscmlnaHQ6bGVmdCx0b3A6dG9wLGJvdHRvbTp0b3ArbGluZU9iai5oZWlnaHR9fQpmdW5jdGlvbiBQb3NXaXRoSW5mbyhsaW5lLGNoLHN0aWNreSxvdXRzaWRlLHhSZWwpe3ZhciBwb3M9UG9zKGxpbmUsY2gsc3RpY2t5KTtwb3MueFJlbD14UmVsO2lmKG91dHNpZGUpe3Bvcy5vdXRzaWRlPXRydWU7fQpyZXR1cm4gcG9zfQpmdW5jdGlvbiBjb29yZHNDaGFyKGNtLHgseSl7dmFyIGRvYz1jbS5kb2M7eSs9Y20uZGlzcGxheS52aWV3T2Zmc2V0O2lmKHk8MCl7cmV0dXJuIFBvc1dpdGhJbmZvKGRvYy5maXJzdCwwLG51bGwsdHJ1ZSwtMSl9CnZhciBsaW5lTj1saW5lQXRIZWlnaHQoZG9jLHkpLGxhc3Q9ZG9jLmZpcnN0K2RvYy5zaXplLTE7aWYobGluZU4+bGFzdCkKe3JldHVybiBQb3NXaXRoSW5mbyhkb2MuZmlyc3QrZG9jLnNpemUtMSxnZXRMaW5lKGRvYyxsYXN0KS50ZXh0Lmxlbmd0aCxudWxsLHRydWUsMSl9CmlmKHg8MCl7eD0wO30KdmFyIGxpbmVPYmo9Z2V0TGluZShkb2MsbGluZU4pO2Zvcig7Oyl7dmFyIGZvdW5kPWNvb3Jkc0NoYXJJbm5lcihjbSxsaW5lT2JqLGxpbmVOLHgseSk7dmFyIG1lcmdlZD1jb2xsYXBzZWRTcGFuQXRFbmQobGluZU9iaik7dmFyIG1lcmdlZFBvcz1tZXJnZWQmJm1lcmdlZC5maW5kKDAsdHJ1ZSk7aWYobWVyZ2VkJiYoZm91bmQuY2g+bWVyZ2VkUG9zLmZyb20uY2h8fGZvdW5kLmNoPT1tZXJnZWRQb3MuZnJvbS5jaCYmZm91bmQueFJlbD4wKSkKe2xpbmVOPWxpbmVObyhsaW5lT2JqPW1lcmdlZFBvcy50by5saW5lKTt9CmVsc2UKe3JldHVybiBmb3VuZH19fQpmdW5jdGlvbiB3cmFwcGVkTGluZUV4dGVudChjbSxsaW5lT2JqLHByZXBhcmVkTWVhc3VyZSx5KXt5LT13aWRnZXRUb3BIZWlnaHQobGluZU9iaik7dmFyIGVuZD1saW5lT2JqLnRleHQubGVuZ3RoO3ZhciBiZWdpbj1maW5kRmlyc3QoZnVuY3Rpb24oY2gpe3JldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXBhcmVkTWVhc3VyZSxjaC0xKS5ib3R0b208PXk7fSxlbmQsMCk7ZW5kPWZpbmRGaXJzdChmdW5jdGlvbihjaCl7cmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20scHJlcGFyZWRNZWFzdXJlLGNoKS50b3A+eTt9LGJlZ2luLGVuZCk7cmV0dXJue2JlZ2luOmJlZ2luLGVuZDplbmR9fQpmdW5jdGlvbiB3cmFwcGVkTGluZUV4dGVudENoYXIoY20sbGluZU9iaixwcmVwYXJlZE1lYXN1cmUsdGFyZ2V0KXtpZighcHJlcGFyZWRNZWFzdXJlKXtwcmVwYXJlZE1lYXN1cmU9cHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLGxpbmVPYmopO30KdmFyIHRhcmdldFRvcD1pbnRvQ29vcmRTeXN0ZW0oY20sbGluZU9iaixtZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXBhcmVkTWVhc3VyZSx0YXJnZXQpLCJsaW5lIikudG9wO3JldHVybiB3cmFwcGVkTGluZUV4dGVudChjbSxsaW5lT2JqLHByZXBhcmVkTWVhc3VyZSx0YXJnZXRUb3ApfQpmdW5jdGlvbiBib3hJc0FmdGVyKGJveCx4LHksbGVmdCl7cmV0dXJuIGJveC5ib3R0b208PXk/ZmFsc2U6Ym94LnRvcD55P3RydWU6KGxlZnQ/Ym94LmxlZnQ6Ym94LnJpZ2h0KT54fQpmdW5jdGlvbiBjb29yZHNDaGFySW5uZXIoY20sbGluZU9iaixsaW5lTm8kJDEseCx5KXt5LT1oZWlnaHRBdExpbmUobGluZU9iaik7dmFyIHByZXBhcmVkTWVhc3VyZT1wcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sbGluZU9iaik7dmFyIHdpZGdldEhlaWdodCQkMT13aWRnZXRUb3BIZWlnaHQobGluZU9iaik7dmFyIGJlZ2luPTAsZW5kPWxpbmVPYmoudGV4dC5sZW5ndGgsbHRyPXRydWU7dmFyIG9yZGVyPWdldE9yZGVyKGxpbmVPYmosY20uZG9jLmRpcmVjdGlvbik7aWYob3JkZXIpe3ZhciBwYXJ0PShjbS5vcHRpb25zLmxpbmVXcmFwcGluZz9jb29yZHNCaWRpUGFydFdyYXBwZWQ6Y29vcmRzQmlkaVBhcnQpCihjbSxsaW5lT2JqLGxpbmVObyQkMSxwcmVwYXJlZE1lYXN1cmUsb3JkZXIseCx5KTtsdHI9cGFydC5sZXZlbCE9MTtiZWdpbj1sdHI/cGFydC5mcm9tOnBhcnQudG8tMTtlbmQ9bHRyP3BhcnQudG86cGFydC5mcm9tLTE7fQp2YXIgY2hBcm91bmQ9bnVsbCxib3hBcm91bmQ9bnVsbDt2YXIgY2g9ZmluZEZpcnN0KGZ1bmN0aW9uKGNoKXt2YXIgYm94PW1lYXN1cmVDaGFyUHJlcGFyZWQoY20scHJlcGFyZWRNZWFzdXJlLGNoKTtib3gudG9wKz13aWRnZXRIZWlnaHQkJDE7Ym94LmJvdHRvbSs9d2lkZ2V0SGVpZ2h0JCQxO2lmKCFib3hJc0FmdGVyKGJveCx4LHksZmFsc2UpKXtyZXR1cm4gZmFsc2V9CmlmKGJveC50b3A8PXkmJmJveC5sZWZ0PD14KXtjaEFyb3VuZD1jaDtib3hBcm91bmQ9Ym94O30KcmV0dXJuIHRydWV9LGJlZ2luLGVuZCk7dmFyIGJhc2VYLHN0aWNreSxvdXRzaWRlPWZhbHNlO2lmKGJveEFyb3VuZCl7dmFyIGF0TGVmdD14LWJveEFyb3VuZC5sZWZ0PGJveEFyb3VuZC5yaWdodC14LGF0U3RhcnQ9YXRMZWZ0PT1sdHI7Y2g9Y2hBcm91bmQrKGF0U3RhcnQ/MDoxKTtzdGlja3k9YXRTdGFydD8iYWZ0ZXIiOiJiZWZvcmUiO2Jhc2VYPWF0TGVmdD9ib3hBcm91bmQubGVmdDpib3hBcm91bmQucmlnaHQ7fWVsc2V7aWYoIWx0ciYmKGNoPT1lbmR8fGNoPT1iZWdpbikpe2NoKys7fQpzdGlja3k9Y2g9PTA/ImFmdGVyIjpjaD09bGluZU9iai50ZXh0Lmxlbmd0aD8iYmVmb3JlIjoobWVhc3VyZUNoYXJQcmVwYXJlZChjbSxwcmVwYXJlZE1lYXN1cmUsY2gtKGx0cj8xOjApKS5ib3R0b20rd2lkZ2V0SGVpZ2h0JCQxPD15KT09bHRyPyJhZnRlciI6ImJlZm9yZSI7dmFyIGNvb3Jkcz1jdXJzb3JDb29yZHMoY20sUG9zKGxpbmVObyQkMSxjaCxzdGlja3kpLCJsaW5lIixsaW5lT2JqLHByZXBhcmVkTWVhc3VyZSk7YmFzZVg9Y29vcmRzLmxlZnQ7b3V0c2lkZT15PGNvb3Jkcy50b3B8fHk+PWNvb3Jkcy5ib3R0b207fQpjaD1za2lwRXh0ZW5kaW5nQ2hhcnMobGluZU9iai50ZXh0LGNoLDEpO3JldHVybiBQb3NXaXRoSW5mbyhsaW5lTm8kJDEsY2gsc3RpY2t5LG91dHNpZGUseC1iYXNlWCl9CmZ1bmN0aW9uIGNvb3Jkc0JpZGlQYXJ0KGNtLGxpbmVPYmosbGluZU5vJCQxLHByZXBhcmVkTWVhc3VyZSxvcmRlcix4LHkpe3ZhciBpbmRleD1maW5kRmlyc3QoZnVuY3Rpb24oaSl7dmFyIHBhcnQ9b3JkZXJbaV0sbHRyPXBhcnQubGV2ZWwhPTE7cmV0dXJuIGJveElzQWZ0ZXIoY3Vyc29yQ29vcmRzKGNtLFBvcyhsaW5lTm8kJDEsbHRyP3BhcnQudG86cGFydC5mcm9tLGx0cj8iYmVmb3JlIjoiYWZ0ZXIiKSwibGluZSIsbGluZU9iaixwcmVwYXJlZE1lYXN1cmUpLHgseSx0cnVlKX0sMCxvcmRlci5sZW5ndGgtMSk7dmFyIHBhcnQ9b3JkZXJbaW5kZXhdO2lmKGluZGV4PjApe3ZhciBsdHI9cGFydC5sZXZlbCE9MTt2YXIgc3RhcnQ9Y3Vyc29yQ29vcmRzKGNtLFBvcyhsaW5lTm8kJDEsbHRyP3BhcnQuZnJvbTpwYXJ0LnRvLGx0cj8iYWZ0ZXIiOiJiZWZvcmUiKSwibGluZSIsbGluZU9iaixwcmVwYXJlZE1lYXN1cmUpO2lmKGJveElzQWZ0ZXIoc3RhcnQseCx5LHRydWUpJiZzdGFydC50b3A+eSkKe3BhcnQ9b3JkZXJbaW5kZXgtMV07fX0KcmV0dXJuIHBhcnR9CmZ1bmN0aW9uIGNvb3Jkc0JpZGlQYXJ0V3JhcHBlZChjbSxsaW5lT2JqLF9saW5lTm8scHJlcGFyZWRNZWFzdXJlLG9yZGVyLHgseSl7dmFyIHJlZj13cmFwcGVkTGluZUV4dGVudChjbSxsaW5lT2JqLHByZXBhcmVkTWVhc3VyZSx5KTt2YXIgYmVnaW49cmVmLmJlZ2luO3ZhciBlbmQ9cmVmLmVuZDtpZigvXHMvLnRlc3QobGluZU9iai50ZXh0LmNoYXJBdChlbmQtMSkpKXtlbmQtLTt9CnZhciBwYXJ0PW51bGwsY2xvc2VzdERpc3Q9bnVsbDtmb3IodmFyIGk9MDtpPG9yZGVyLmxlbmd0aDtpKyspe3ZhciBwPW9yZGVyW2ldO2lmKHAuZnJvbT49ZW5kfHxwLnRvPD1iZWdpbil7Y29udGludWV9CnZhciBsdHI9cC5sZXZlbCE9MTt2YXIgZW5kWD1tZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXBhcmVkTWVhc3VyZSxsdHI/TWF0aC5taW4oZW5kLHAudG8pLTE6TWF0aC5tYXgoYmVnaW4scC5mcm9tKSkucmlnaHQ7dmFyIGRpc3Q9ZW5kWDx4P3gtZW5kWCsxZTk6ZW5kWC14O2lmKCFwYXJ0fHxjbG9zZXN0RGlzdD5kaXN0KXtwYXJ0PXA7Y2xvc2VzdERpc3Q9ZGlzdDt9fQppZighcGFydCl7cGFydD1vcmRlcltvcmRlci5sZW5ndGgtMV07fQppZihwYXJ0LmZyb208YmVnaW4pe3BhcnQ9e2Zyb206YmVnaW4sdG86cGFydC50byxsZXZlbDpwYXJ0LmxldmVsfTt9CmlmKHBhcnQudG8+ZW5kKXtwYXJ0PXtmcm9tOnBhcnQuZnJvbSx0bzplbmQsbGV2ZWw6cGFydC5sZXZlbH07fQpyZXR1cm4gcGFydH0KdmFyIG1lYXN1cmVUZXh0O2Z1bmN0aW9uIHRleHRIZWlnaHQoZGlzcGxheSl7aWYoZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0IT1udWxsKXtyZXR1cm4gZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0fQppZihtZWFzdXJlVGV4dD09bnVsbCl7bWVhc3VyZVRleHQ9ZWx0KCJwcmUiKTtmb3IodmFyIGk9MDtpPDQ5OysraSl7bWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIngiKSk7bWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZWx0KCJiciIpKTt9Cm1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ4IikpO30KcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLG1lYXN1cmVUZXh0KTt2YXIgaGVpZ2h0PW1lYXN1cmVUZXh0Lm9mZnNldEhlaWdodC81MDtpZihoZWlnaHQ+Myl7ZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0PWhlaWdodDt9CnJlbW92ZUNoaWxkcmVuKGRpc3BsYXkubWVhc3VyZSk7cmV0dXJuIGhlaWdodHx8MX0KZnVuY3Rpb24gY2hhcldpZHRoKGRpc3BsYXkpe2lmKGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoIT1udWxsKXtyZXR1cm4gZGlzcGxheS5jYWNoZWRDaGFyV2lkdGh9CnZhciBhbmNob3I9ZWx0KCJzcGFuIiwieHh4eHh4eHh4eCIpO3ZhciBwcmU9ZWx0KCJwcmUiLFthbmNob3JdKTtyZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUscHJlKTt2YXIgcmVjdD1hbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksd2lkdGg9KHJlY3QucmlnaHQtcmVjdC5sZWZ0KS8xMDtpZih3aWR0aD4yKXtkaXNwbGF5LmNhY2hlZENoYXJXaWR0aD13aWR0aDt9CnJldHVybiB3aWR0aHx8MTB9CmZ1bmN0aW9uIGdldERpbWVuc2lvbnMoY20pe3ZhciBkPWNtLmRpc3BsYXksbGVmdD17fSx3aWR0aD17fTt2YXIgZ3V0dGVyTGVmdD1kLmd1dHRlcnMuY2xpZW50TGVmdDtmb3IodmFyIG49ZC5ndXR0ZXJzLmZpcnN0Q2hpbGQsaT0wO247bj1uLm5leHRTaWJsaW5nLCsraSl7bGVmdFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dPW4ub2Zmc2V0TGVmdCtuLmNsaWVudExlZnQrZ3V0dGVyTGVmdDt3aWR0aFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dPW4uY2xpZW50V2lkdGg7fQpyZXR1cm57Zml4ZWRQb3M6Y29tcGVuc2F0ZUZvckhTY3JvbGwoZCksZ3V0dGVyVG90YWxXaWR0aDpkLmd1dHRlcnMub2Zmc2V0V2lkdGgsZ3V0dGVyTGVmdDpsZWZ0LGd1dHRlcldpZHRoOndpZHRoLHdyYXBwZXJXaWR0aDpkLndyYXBwZXIuY2xpZW50V2lkdGh9fQpmdW5jdGlvbiBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KXtyZXR1cm4gZGlzcGxheS5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0KZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pe3ZhciB0aD10ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLHdyYXBwaW5nPWNtLm9wdGlvbnMubGluZVdyYXBwaW5nO3ZhciBwZXJMaW5lPXdyYXBwaW5nJiZNYXRoLm1heCg1LGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgvY2hhcldpZHRoKGNtLmRpc3BsYXkpLTMpO3JldHVybiBmdW5jdGlvbihsaW5lKXtpZihsaW5lSXNIaWRkZW4oY20uZG9jLGxpbmUpKXtyZXR1cm4gMH0KdmFyIHdpZGdldHNIZWlnaHQ9MDtpZihsaW5lLndpZGdldHMpe2Zvcih2YXIgaT0wO2k8bGluZS53aWRnZXRzLmxlbmd0aDtpKyspe2lmKGxpbmUud2lkZ2V0c1tpXS5oZWlnaHQpe3dpZGdldHNIZWlnaHQrPWxpbmUud2lkZ2V0c1tpXS5oZWlnaHQ7fX19CmlmKHdyYXBwaW5nKQp7cmV0dXJuIHdpZGdldHNIZWlnaHQrKE1hdGguY2VpbChsaW5lLnRleHQubGVuZ3RoL3BlckxpbmUpfHwxKSp0aH0KZWxzZQp7cmV0dXJuIHdpZGdldHNIZWlnaHQrdGh9fX0KZnVuY3Rpb24gZXN0aW1hdGVMaW5lSGVpZ2h0cyhjbSl7dmFyIGRvYz1jbS5kb2MsZXN0PWVzdGltYXRlSGVpZ2h0KGNtKTtkb2MuaXRlcihmdW5jdGlvbihsaW5lKXt2YXIgZXN0SGVpZ2h0PWVzdChsaW5lKTtpZihlc3RIZWlnaHQhPWxpbmUuaGVpZ2h0KXt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsZXN0SGVpZ2h0KTt9fSk7fQpmdW5jdGlvbiBwb3NGcm9tTW91c2UoY20sZSxsaWJlcmFsLGZvclJlY3Qpe3ZhciBkaXNwbGF5PWNtLmRpc3BsYXk7aWYoIWxpYmVyYWwmJmVfdGFyZ2V0KGUpLmdldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiKT09InRydWUiKXtyZXR1cm4gbnVsbH0KdmFyIHgseSxzcGFjZT1kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0cnl7eD1lLmNsaWVudFgtc3BhY2UubGVmdDt5PWUuY2xpZW50WS1zcGFjZS50b3A7fQpjYXRjaChlKXtyZXR1cm4gbnVsbH0KdmFyIGNvb3Jkcz1jb29yZHNDaGFyKGNtLHgseSksbGluZTtpZihmb3JSZWN0JiZjb29yZHMueFJlbD09MSYmKGxpbmU9Z2V0TGluZShjbS5kb2MsY29vcmRzLmxpbmUpLnRleHQpLmxlbmd0aD09Y29vcmRzLmNoKXt2YXIgY29sRGlmZj1jb3VudENvbHVtbihsaW5lLGxpbmUubGVuZ3RoLGNtLm9wdGlvbnMudGFiU2l6ZSktbGluZS5sZW5ndGg7Y29vcmRzPVBvcyhjb29yZHMubGluZSxNYXRoLm1heCgwLE1hdGgucm91bmQoKHgtcGFkZGluZ0goY20uZGlzcGxheSkubGVmdCkvY2hhcldpZHRoKGNtLmRpc3BsYXkpKS1jb2xEaWZmKSk7fQpyZXR1cm4gY29vcmRzfQpmdW5jdGlvbiBmaW5kVmlld0luZGV4KGNtLG4pe2lmKG4+PWNtLmRpc3BsYXkudmlld1RvKXtyZXR1cm4gbnVsbH0Kbi09Y20uZGlzcGxheS52aWV3RnJvbTtpZihuPDApe3JldHVybiBudWxsfQp2YXIgdmlldz1jbS5kaXNwbGF5LnZpZXc7Zm9yKHZhciBpPTA7aTx2aWV3Lmxlbmd0aDtpKyspe24tPXZpZXdbaV0uc2l6ZTtpZihuPDApe3JldHVybiBpfX19CmZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbihjbSl7Y20uZGlzcGxheS5pbnB1dC5zaG93U2VsZWN0aW9uKGNtLmRpc3BsYXkuaW5wdXQucHJlcGFyZVNlbGVjdGlvbigpKTt9CmZ1bmN0aW9uIHByZXBhcmVTZWxlY3Rpb24oY20scHJpbWFyeSl7aWYocHJpbWFyeT09PXZvaWQgMClwcmltYXJ5PXRydWU7dmFyIGRvYz1jbS5kb2MscmVzdWx0PXt9O3ZhciBjdXJGcmFnbWVudD1yZXN1bHQuY3Vyc29ycz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIHNlbEZyYWdtZW50PXJlc3VsdC5zZWxlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Zvcih2YXIgaT0wO2k8ZG9jLnNlbC5yYW5nZXMubGVuZ3RoO2krKyl7aWYoIXByaW1hcnkmJmk9PWRvYy5zZWwucHJpbUluZGV4KXtjb250aW51ZX0KdmFyIHJhbmdlJCQxPWRvYy5zZWwucmFuZ2VzW2ldO2lmKHJhbmdlJCQxLmZyb20oKS5saW5lPj1jbS5kaXNwbGF5LnZpZXdUb3x8cmFuZ2UkJDEudG8oKS5saW5lPGNtLmRpc3BsYXkudmlld0Zyb20pe2NvbnRpbnVlfQp2YXIgY29sbGFwc2VkPXJhbmdlJCQxLmVtcHR5KCk7aWYoY29sbGFwc2VkfHxjbS5vcHRpb25zLnNob3dDdXJzb3JXaGVuU2VsZWN0aW5nKQp7ZHJhd1NlbGVjdGlvbkN1cnNvcihjbSxyYW5nZSQkMS5oZWFkLGN1ckZyYWdtZW50KTt9CmlmKCFjb2xsYXBzZWQpCntkcmF3U2VsZWN0aW9uUmFuZ2UoY20scmFuZ2UkJDEsc2VsRnJhZ21lbnQpO319CnJldHVybiByZXN1bHR9CmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20saGVhZCxvdXRwdXQpe3ZhciBwb3M9Y3Vyc29yQ29vcmRzKGNtLGhlYWQsImRpdiIsbnVsbCxudWxsLCFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpO3ZhciBjdXJzb3I9b3V0cHV0LmFwcGVuZENoaWxkKGVsdCgiZGl2IiwiXHUwMGEwIiwiQ29kZU1pcnJvci1jdXJzb3IiKSk7Y3Vyc29yLnN0eWxlLmxlZnQ9cG9zLmxlZnQrInB4IjtjdXJzb3Iuc3R5bGUudG9wPXBvcy50b3ArInB4IjtjdXJzb3Iuc3R5bGUuaGVpZ2h0PU1hdGgubWF4KDAscG9zLmJvdHRvbS1wb3MudG9wKSpjbS5vcHRpb25zLmN1cnNvckhlaWdodCsicHgiO2lmKHBvcy5vdGhlcil7dmFyIG90aGVyQ3Vyc29yPW91dHB1dC5hcHBlbmRDaGlsZChlbHQoImRpdiIsIlx1MDBhMCIsIkNvZGVNaXJyb3ItY3Vyc29yIENvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yIikpO290aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXk9IiI7b3RoZXJDdXJzb3Iuc3R5bGUubGVmdD1wb3Mub3RoZXIubGVmdCsicHgiO290aGVyQ3Vyc29yLnN0eWxlLnRvcD1wb3Mub3RoZXIudG9wKyJweCI7b3RoZXJDdXJzb3Iuc3R5bGUuaGVpZ2h0PShwb3Mub3RoZXIuYm90dG9tLXBvcy5vdGhlci50b3ApKi44NSsicHgiO319CmZ1bmN0aW9uIGNtcENvb3JkcyhhLGIpe3JldHVybiBhLnRvcC1iLnRvcHx8YS5sZWZ0LWIubGVmdH0KZnVuY3Rpb24gZHJhd1NlbGVjdGlvblJhbmdlKGNtLHJhbmdlJCQxLG91dHB1dCl7dmFyIGRpc3BsYXk9Y20uZGlzcGxheSxkb2M9Y20uZG9jO3ZhciBmcmFnbWVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIHBhZGRpbmc9cGFkZGluZ0goY20uZGlzcGxheSksbGVmdFNpZGU9cGFkZGluZy5sZWZ0O3ZhciByaWdodFNpZGU9TWF0aC5tYXgoZGlzcGxheS5zaXplcldpZHRoLGRpc3BsYXlXaWR0aChjbSktZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0KS1wYWRkaW5nLnJpZ2h0O3ZhciBkb2NMVFI9ZG9jLmRpcmVjdGlvbj09Imx0ciI7ZnVuY3Rpb24gYWRkKGxlZnQsdG9wLHdpZHRoLGJvdHRvbSl7aWYodG9wPDApe3RvcD0wO30KdG9wPU1hdGgucm91bmQodG9wKTtib3R0b209TWF0aC5yb3VuZChib3R0b20pO2ZyYWdtZW50LmFwcGVuZENoaWxkKGVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLXNlbGVjdGVkIiwoInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogIitsZWZ0KyJweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAiK3RvcCsicHg7IHdpZHRoOiAiKyh3aWR0aD09bnVsbD9yaWdodFNpZGUtbGVmdDp3aWR0aCkrInB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICIrKGJvdHRvbS10b3ApKyJweCIpKSk7fQpmdW5jdGlvbiBkcmF3Rm9yTGluZShsaW5lLGZyb21BcmcsdG9Bcmcpe3ZhciBsaW5lT2JqPWdldExpbmUoZG9jLGxpbmUpO3ZhciBsaW5lTGVuPWxpbmVPYmoudGV4dC5sZW5ndGg7dmFyIHN0YXJ0LGVuZDtmdW5jdGlvbiBjb29yZHMoY2gsYmlhcyl7cmV0dXJuIGNoYXJDb29yZHMoY20sUG9zKGxpbmUsY2gpLCJkaXYiLGxpbmVPYmosYmlhcyl9CmZ1bmN0aW9uIHdyYXBYKHBvcyxkaXIsc2lkZSl7dmFyIGV4dGVudD13cmFwcGVkTGluZUV4dGVudENoYXIoY20sbGluZU9iaixudWxsLHBvcyk7dmFyIHByb3A9KGRpcj09Imx0ciIpPT0oc2lkZT09ImFmdGVyIik/ImxlZnQiOiJyaWdodCI7dmFyIGNoPXNpZGU9PSJhZnRlciI/ZXh0ZW50LmJlZ2luOmV4dGVudC5lbmQtKC9ccy8udGVzdChsaW5lT2JqLnRleHQuY2hhckF0KGV4dGVudC5lbmQtMSkpPzI6MSk7cmV0dXJuIGNvb3JkcyhjaCxwcm9wKVtwcm9wXX0KdmFyIG9yZGVyPWdldE9yZGVyKGxpbmVPYmosZG9jLmRpcmVjdGlvbik7aXRlcmF0ZUJpZGlTZWN0aW9ucyhvcmRlcixmcm9tQXJnfHwwLHRvQXJnPT1udWxsP2xpbmVMZW46dG9BcmcsZnVuY3Rpb24oZnJvbSx0byxkaXIsaSl7dmFyIGx0cj1kaXI9PSJsdHIiO3ZhciBmcm9tUG9zPWNvb3Jkcyhmcm9tLGx0cj8ibGVmdCI6InJpZ2h0Iik7dmFyIHRvUG9zPWNvb3Jkcyh0by0xLGx0cj8icmlnaHQiOiJsZWZ0Iik7dmFyIG9wZW5TdGFydD1mcm9tQXJnPT1udWxsJiZmcm9tPT0wLG9wZW5FbmQ9dG9Bcmc9PW51bGwmJnRvPT1saW5lTGVuO3ZhciBmaXJzdD1pPT0wLGxhc3Q9IW9yZGVyfHxpPT1vcmRlci5sZW5ndGgtMTtpZih0b1Bvcy50b3AtZnJvbVBvcy50b3A8PTMpe3ZhciBvcGVuTGVmdD0oZG9jTFRSP29wZW5TdGFydDpvcGVuRW5kKSYmZmlyc3Q7dmFyIG9wZW5SaWdodD0oZG9jTFRSP29wZW5FbmQ6b3BlblN0YXJ0KSYmbGFzdDt2YXIgbGVmdD1vcGVuTGVmdD9sZWZ0U2lkZToobHRyP2Zyb21Qb3M6dG9Qb3MpLmxlZnQ7dmFyIHJpZ2h0PW9wZW5SaWdodD9yaWdodFNpZGU6KGx0cj90b1Bvczpmcm9tUG9zKS5yaWdodDthZGQobGVmdCxmcm9tUG9zLnRvcCxyaWdodC1sZWZ0LGZyb21Qb3MuYm90dG9tKTt9ZWxzZXt2YXIgdG9wTGVmdCx0b3BSaWdodCxib3RMZWZ0LGJvdFJpZ2h0O2lmKGx0cil7dG9wTGVmdD1kb2NMVFImJm9wZW5TdGFydCYmZmlyc3Q/bGVmdFNpZGU6ZnJvbVBvcy5sZWZ0O3RvcFJpZ2h0PWRvY0xUUj9yaWdodFNpZGU6d3JhcFgoZnJvbSxkaXIsImJlZm9yZSIpO2JvdExlZnQ9ZG9jTFRSP2xlZnRTaWRlOndyYXBYKHRvLGRpciwiYWZ0ZXIiKTtib3RSaWdodD1kb2NMVFImJm9wZW5FbmQmJmxhc3Q/cmlnaHRTaWRlOnRvUG9zLnJpZ2h0O31lbHNle3RvcExlZnQ9IWRvY0xUUj9sZWZ0U2lkZTp3cmFwWChmcm9tLGRpciwiYmVmb3JlIik7dG9wUmlnaHQ9IWRvY0xUUiYmb3BlblN0YXJ0JiZmaXJzdD9yaWdodFNpZGU6ZnJvbVBvcy5yaWdodDtib3RMZWZ0PSFkb2NMVFImJm9wZW5FbmQmJmxhc3Q/bGVmdFNpZGU6dG9Qb3MubGVmdDtib3RSaWdodD0hZG9jTFRSP3JpZ2h0U2lkZTp3cmFwWCh0byxkaXIsImFmdGVyIik7fQphZGQodG9wTGVmdCxmcm9tUG9zLnRvcCx0b3BSaWdodC10b3BMZWZ0LGZyb21Qb3MuYm90dG9tKTtpZihmcm9tUG9zLmJvdHRvbTx0b1Bvcy50b3Ape2FkZChsZWZ0U2lkZSxmcm9tUG9zLmJvdHRvbSxudWxsLHRvUG9zLnRvcCk7fQphZGQoYm90TGVmdCx0b1Bvcy50b3AsYm90UmlnaHQtYm90TGVmdCx0b1Bvcy5ib3R0b20pO30KaWYoIXN0YXJ0fHxjbXBDb29yZHMoZnJvbVBvcyxzdGFydCk8MCl7c3RhcnQ9ZnJvbVBvczt9CmlmKGNtcENvb3Jkcyh0b1BvcyxzdGFydCk8MCl7c3RhcnQ9dG9Qb3M7fQppZighZW5kfHxjbXBDb29yZHMoZnJvbVBvcyxlbmQpPDApe2VuZD1mcm9tUG9zO30KaWYoY21wQ29vcmRzKHRvUG9zLGVuZCk8MCl7ZW5kPXRvUG9zO319KTtyZXR1cm57c3RhcnQ6c3RhcnQsZW5kOmVuZH19CnZhciBzRnJvbT1yYW5nZSQkMS5mcm9tKCksc1RvPXJhbmdlJCQxLnRvKCk7aWYoc0Zyb20ubGluZT09c1RvLmxpbmUpe2RyYXdGb3JMaW5lKHNGcm9tLmxpbmUsc0Zyb20uY2gsc1RvLmNoKTt9ZWxzZXt2YXIgZnJvbUxpbmU9Z2V0TGluZShkb2Msc0Zyb20ubGluZSksdG9MaW5lPWdldExpbmUoZG9jLHNUby5saW5lKTt2YXIgc2luZ2xlVkxpbmU9dmlzdWFsTGluZShmcm9tTGluZSk9PXZpc3VhbExpbmUodG9MaW5lKTt2YXIgbGVmdEVuZD1kcmF3Rm9yTGluZShzRnJvbS5saW5lLHNGcm9tLmNoLHNpbmdsZVZMaW5lP2Zyb21MaW5lLnRleHQubGVuZ3RoKzE6bnVsbCkuZW5kO3ZhciByaWdodFN0YXJ0PWRyYXdGb3JMaW5lKHNUby5saW5lLHNpbmdsZVZMaW5lPzA6bnVsbCxzVG8uY2gpLnN0YXJ0O2lmKHNpbmdsZVZMaW5lKXtpZihsZWZ0RW5kLnRvcDxyaWdodFN0YXJ0LnRvcC0yKXthZGQobGVmdEVuZC5yaWdodCxsZWZ0RW5kLnRvcCxudWxsLGxlZnRFbmQuYm90dG9tKTthZGQobGVmdFNpZGUscmlnaHRTdGFydC50b3AscmlnaHRTdGFydC5sZWZ0LHJpZ2h0U3RhcnQuYm90dG9tKTt9ZWxzZXthZGQobGVmdEVuZC5yaWdodCxsZWZ0RW5kLnRvcCxyaWdodFN0YXJ0LmxlZnQtbGVmdEVuZC5yaWdodCxsZWZ0RW5kLmJvdHRvbSk7fX0KaWYobGVmdEVuZC5ib3R0b208cmlnaHRTdGFydC50b3ApCnthZGQobGVmdFNpZGUsbGVmdEVuZC5ib3R0b20sbnVsbCxyaWdodFN0YXJ0LnRvcCk7fX0Kb3V0cHV0LmFwcGVuZENoaWxkKGZyYWdtZW50KTt9CmZ1bmN0aW9uIHJlc3RhcnRCbGluayhjbSl7aWYoIWNtLnN0YXRlLmZvY3VzZWQpe3JldHVybn0KdmFyIGRpc3BsYXk9Y20uZGlzcGxheTtjbGVhckludGVydmFsKGRpc3BsYXkuYmxpbmtlcik7dmFyIG9uPXRydWU7ZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eT0iIjtpZihjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZT4wKQp7ZGlzcGxheS5ibGlua2VyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7cmV0dXJuIGRpc3BsYXkuY3Vyc29yRGl2LnN0eWxlLnZpc2liaWxpdHk9KG9uPSFvbik/IiI6ImhpZGRlbiI7fSxjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSk7fQplbHNlIGlmKGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlPDApCntkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO319CmZ1bmN0aW9uIGVuc3VyZUZvY3VzKGNtKXtpZighY20uc3RhdGUuZm9jdXNlZCl7Y20uZGlzcGxheS5pbnB1dC5mb2N1cygpO29uRm9jdXMoY20pO319CmZ1bmN0aW9uIGRlbGF5Qmx1ckV2ZW50KGNtKXtjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudD10cnVlO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCl7Y20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQ9ZmFsc2U7b25CbHVyKGNtKTt9fSwxMDApO30KZnVuY3Rpb24gb25Gb2N1cyhjbSxlKXtpZihjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCl7Y20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQ9ZmFsc2U7fQppZihjbS5vcHRpb25zLnJlYWRPbmx5PT0ibm9jdXJzb3IiKXtyZXR1cm59CmlmKCFjbS5zdGF0ZS5mb2N1c2VkKXtzaWduYWwoY20sImZvY3VzIixjbSxlKTtjbS5zdGF0ZS5mb2N1c2VkPXRydWU7YWRkQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCJDb2RlTWlycm9yLWZvY3VzZWQiKTtpZighY20uY3VyT3AmJmNtLmRpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnUhPWNtLmRvYy5zZWwpe2NtLmRpc3BsYXkuaW5wdXQucmVzZXQoKTtpZih3ZWJraXQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gY20uZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKTt9LDIwKTt9fQpjbS5kaXNwbGF5LmlucHV0LnJlY2VpdmVkRm9jdXMoKTt9CnJlc3RhcnRCbGluayhjbSk7fQpmdW5jdGlvbiBvbkJsdXIoY20sZSl7aWYoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQpe3JldHVybn0KaWYoY20uc3RhdGUuZm9jdXNlZCl7c2lnbmFsKGNtLCJibHVyIixjbSxlKTtjbS5zdGF0ZS5mb2N1c2VkPWZhbHNlO3JtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCJDb2RlTWlycm9yLWZvY3VzZWQiKTt9CmNsZWFySW50ZXJ2YWwoY20uZGlzcGxheS5ibGlua2VyKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIWNtLnN0YXRlLmZvY3VzZWQpe2NtLmRpc3BsYXkuc2hpZnQ9ZmFsc2U7fX0sMTUwKTt9CmZ1bmN0aW9uIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKXt2YXIgZGlzcGxheT1jbS5kaXNwbGF5O3ZhciBwcmV2Qm90dG9tPWRpc3BsYXkubGluZURpdi5vZmZzZXRUb3A7Zm9yKHZhciBpPTA7aTxkaXNwbGF5LnZpZXcubGVuZ3RoO2krKyl7dmFyIGN1cj1kaXNwbGF5LnZpZXdbaV0saGVpZ2h0PSh2b2lkIDApO2lmKGN1ci5oaWRkZW4pe2NvbnRpbnVlfQppZihpZSYmaWVfdmVyc2lvbjw4KXt2YXIgYm90PWN1ci5ub2RlLm9mZnNldFRvcCtjdXIubm9kZS5vZmZzZXRIZWlnaHQ7aGVpZ2h0PWJvdC1wcmV2Qm90dG9tO3ByZXZCb3R0b209Ym90O31lbHNle3ZhciBib3g9Y3VyLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aGVpZ2h0PWJveC5ib3R0b20tYm94LnRvcDt9CnZhciBkaWZmPWN1ci5saW5lLmhlaWdodC1oZWlnaHQ7aWYoaGVpZ2h0PDIpe2hlaWdodD10ZXh0SGVpZ2h0KGRpc3BsYXkpO30KaWYoZGlmZj4uMDA1fHxkaWZmPC0uMDA1KXt1cGRhdGVMaW5lSGVpZ2h0KGN1ci5saW5lLGhlaWdodCk7dXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5saW5lKTtpZihjdXIucmVzdCl7Zm9yKHZhciBqPTA7ajxjdXIucmVzdC5sZW5ndGg7aisrKQp7dXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5yZXN0W2pdKTt9fX19fQpmdW5jdGlvbiB1cGRhdGVXaWRnZXRIZWlnaHQobGluZSl7aWYobGluZS53aWRnZXRzKXtmb3IodmFyIGk9MDtpPGxpbmUud2lkZ2V0cy5sZW5ndGg7KytpKXt2YXIgdz1saW5lLndpZGdldHNbaV0scGFyZW50PXcubm9kZS5wYXJlbnROb2RlO2lmKHBhcmVudCl7dy5oZWlnaHQ9cGFyZW50Lm9mZnNldEhlaWdodDt9fX19CmZ1bmN0aW9uIHZpc2libGVMaW5lcyhkaXNwbGF5LGRvYyx2aWV3cG9ydCl7dmFyIHRvcD12aWV3cG9ydCYmdmlld3BvcnQudG9wIT1udWxsP01hdGgubWF4KDAsdmlld3BvcnQudG9wKTpkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcDt0b3A9TWF0aC5mbG9vcih0b3AtcGFkZGluZ1RvcChkaXNwbGF5KSk7dmFyIGJvdHRvbT12aWV3cG9ydCYmdmlld3BvcnQuYm90dG9tIT1udWxsP3ZpZXdwb3J0LmJvdHRvbTp0b3ArZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDt2YXIgZnJvbT1saW5lQXRIZWlnaHQoZG9jLHRvcCksdG89bGluZUF0SGVpZ2h0KGRvYyxib3R0b20pO2lmKHZpZXdwb3J0JiZ2aWV3cG9ydC5lbnN1cmUpe3ZhciBlbnN1cmVGcm9tPXZpZXdwb3J0LmVuc3VyZS5mcm9tLmxpbmUsZW5zdXJlVG89dmlld3BvcnQuZW5zdXJlLnRvLmxpbmU7aWYoZW5zdXJlRnJvbTxmcm9tKXtmcm9tPWVuc3VyZUZyb207dG89bGluZUF0SGVpZ2h0KGRvYyxoZWlnaHRBdExpbmUoZ2V0TGluZShkb2MsZW5zdXJlRnJvbSkpK2Rpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQpO31lbHNlIGlmKE1hdGgubWluKGVuc3VyZVRvLGRvYy5sYXN0TGluZSgpKT49dG8pe2Zyb209bGluZUF0SGVpZ2h0KGRvYyxoZWlnaHRBdExpbmUoZ2V0TGluZShkb2MsZW5zdXJlVG8pKS1kaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0KTt0bz1lbnN1cmVUbzt9fQpyZXR1cm57ZnJvbTpmcm9tLHRvOk1hdGgubWF4KHRvLGZyb20rMSl9fQpmdW5jdGlvbiBhbGlnbkhvcml6b250YWxseShjbSl7dmFyIGRpc3BsYXk9Y20uZGlzcGxheSx2aWV3PWRpc3BsYXkudmlldztpZighZGlzcGxheS5hbGlnbldpZGdldHMmJighZGlzcGxheS5ndXR0ZXJzLmZpcnN0Q2hpbGR8fCFjbS5vcHRpb25zLmZpeGVkR3V0dGVyKSl7cmV0dXJufQp2YXIgY29tcD1jb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KS1kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQrY20uZG9jLnNjcm9sbExlZnQ7dmFyIGd1dHRlclc9ZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoLGxlZnQ9Y29tcCsicHgiO2Zvcih2YXIgaT0wO2k8dmlldy5sZW5ndGg7aSsrKXtpZighdmlld1tpXS5oaWRkZW4pe2lmKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpe2lmKHZpZXdbaV0uZ3V0dGVyKQp7dmlld1tpXS5ndXR0ZXIuc3R5bGUubGVmdD1sZWZ0O30KaWYodmlld1tpXS5ndXR0ZXJCYWNrZ3JvdW5kKQp7dmlld1tpXS5ndXR0ZXJCYWNrZ3JvdW5kLnN0eWxlLmxlZnQ9bGVmdDt9fQp2YXIgYWxpZ249dmlld1tpXS5hbGlnbmFibGU7aWYoYWxpZ24pe2Zvcih2YXIgaj0wO2o8YWxpZ24ubGVuZ3RoO2orKykKe2FsaWduW2pdLnN0eWxlLmxlZnQ9bGVmdDt9fX19CmlmKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpCntkaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdD0oY29tcCtndXR0ZXJXKSsicHgiO319CmZ1bmN0aW9uIG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKXtpZighY20ub3B0aW9ucy5saW5lTnVtYmVycyl7cmV0dXJuIGZhbHNlfQp2YXIgZG9jPWNtLmRvYyxsYXN0PWxpbmVOdW1iZXJGb3IoY20ub3B0aW9ucyxkb2MuZmlyc3QrZG9jLnNpemUtMSksZGlzcGxheT1jbS5kaXNwbGF5O2lmKGxhc3QubGVuZ3RoIT1kaXNwbGF5LmxpbmVOdW1DaGFycyl7dmFyIHRlc3Q9ZGlzcGxheS5tZWFzdXJlLmFwcGVuZENoaWxkKGVsdCgiZGl2IixbZWx0KCJkaXYiLGxhc3QpXSwiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIpKTt2YXIgaW5uZXJXPXRlc3QuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCxwYWRkaW5nPXRlc3Qub2Zmc2V0V2lkdGgtaW5uZXJXO2Rpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aD0iIjtkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoPU1hdGgubWF4KGlubmVyVyxkaXNwbGF5LmxpbmVHdXR0ZXIub2Zmc2V0V2lkdGgtcGFkZGluZykrMTtkaXNwbGF5LmxpbmVOdW1XaWR0aD1kaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoK3BhZGRpbmc7ZGlzcGxheS5saW5lTnVtQ2hhcnM9ZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aD9sYXN0Lmxlbmd0aDotMTtkaXNwbGF5LmxpbmVHdXR0ZXIuc3R5bGUud2lkdGg9ZGlzcGxheS5saW5lTnVtV2lkdGgrInB4Ijt1cGRhdGVHdXR0ZXJTcGFjZShjbSk7cmV0dXJuIHRydWV9CnJldHVybiBmYWxzZX0KZnVuY3Rpb24gbWF5YmVTY3JvbGxXaW5kb3coY20scmVjdCl7aWYoc2lnbmFsRE9NRXZlbnQoY20sInNjcm9sbEN1cnNvckludG9WaWV3Iikpe3JldHVybn0KdmFyIGRpc3BsYXk9Y20uZGlzcGxheSxib3g9ZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkb1Njcm9sbD1udWxsO2lmKHJlY3QudG9wK2JveC50b3A8MCl7ZG9TY3JvbGw9dHJ1ZTt9CmVsc2UgaWYocmVjdC5ib3R0b20rYm94LnRvcD4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSl7ZG9TY3JvbGw9ZmFsc2U7fQppZihkb1Njcm9sbCE9bnVsbCYmIXBoYW50b20pe3ZhciBzY3JvbGxOb2RlPWVsdCgiZGl2IiwiXHUyMDBiIixudWxsLCgicG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogIisocmVjdC50b3AtZGlzcGxheS52aWV3T2Zmc2V0LXBhZGRpbmdUb3AoY20uZGlzcGxheSkpKyJweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICIrKHJlY3QuYm90dG9tLXJlY3QudG9wK3Njcm9sbEdhcChjbSkrZGlzcGxheS5iYXJIZWlnaHQpKyJweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAiKyhyZWN0LmxlZnQpKyJweDsgd2lkdGg6ICIrKE1hdGgubWF4KDIscmVjdC5yaWdodC1yZWN0LmxlZnQpKSsicHg7IikpO2NtLmRpc3BsYXkubGluZVNwYWNlLmFwcGVuZENoaWxkKHNjcm9sbE5vZGUpO3Njcm9sbE5vZGUuc2Nyb2xsSW50b1ZpZXcoZG9TY3JvbGwpO2NtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKHNjcm9sbE5vZGUpO319CmZ1bmN0aW9uIHNjcm9sbFBvc0ludG9WaWV3KGNtLHBvcyxlbmQsbWFyZ2luKXtpZihtYXJnaW49PW51bGwpe21hcmdpbj0wO30KdmFyIHJlY3Q7aWYoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nJiZwb3M9PWVuZCl7cG9zPXBvcy5jaD9Qb3MocG9zLmxpbmUscG9zLnN0aWNreT09ImJlZm9yZSI/cG9zLmNoLTE6cG9zLmNoLCJhZnRlciIpOnBvcztlbmQ9cG9zLnN0aWNreT09ImJlZm9yZSI/UG9zKHBvcy5saW5lLHBvcy5jaCsxLCJiZWZvcmUiKTpwb3M7fQpmb3IodmFyIGxpbWl0PTA7bGltaXQ8NTtsaW1pdCsrKXt2YXIgY2hhbmdlZD1mYWxzZTt2YXIgY29vcmRzPWN1cnNvckNvb3JkcyhjbSxwb3MpO3ZhciBlbmRDb29yZHM9IWVuZHx8ZW5kPT1wb3M/Y29vcmRzOmN1cnNvckNvb3JkcyhjbSxlbmQpO3JlY3Q9e2xlZnQ6TWF0aC5taW4oY29vcmRzLmxlZnQsZW5kQ29vcmRzLmxlZnQpLHRvcDpNYXRoLm1pbihjb29yZHMudG9wLGVuZENvb3Jkcy50b3ApLW1hcmdpbixyaWdodDpNYXRoLm1heChjb29yZHMubGVmdCxlbmRDb29yZHMubGVmdCksYm90dG9tOk1hdGgubWF4KGNvb3Jkcy5ib3R0b20sZW5kQ29vcmRzLmJvdHRvbSkrbWFyZ2lufTt2YXIgc2Nyb2xsUG9zPWNhbGN1bGF0ZVNjcm9sbFBvcyhjbSxyZWN0KTt2YXIgc3RhcnRUb3A9Y20uZG9jLnNjcm9sbFRvcCxzdGFydExlZnQ9Y20uZG9jLnNjcm9sbExlZnQ7aWYoc2Nyb2xsUG9zLnNjcm9sbFRvcCE9bnVsbCl7dXBkYXRlU2Nyb2xsVG9wKGNtLHNjcm9sbFBvcy5zY3JvbGxUb3ApO2lmKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3Atc3RhcnRUb3ApPjEpe2NoYW5nZWQ9dHJ1ZTt9fQppZihzY3JvbGxQb3Muc2Nyb2xsTGVmdCE9bnVsbCl7c2V0U2Nyb2xsTGVmdChjbSxzY3JvbGxQb3Muc2Nyb2xsTGVmdCk7aWYoTWF0aC5hYnMoY20uZG9jLnNjcm9sbExlZnQtc3RhcnRMZWZ0KT4xKXtjaGFuZ2VkPXRydWU7fX0KaWYoIWNoYW5nZWQpe2JyZWFrfX0KcmV0dXJuIHJlY3R9CmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KGNtLHJlY3Qpe3ZhciBzY3JvbGxQb3M9Y2FsY3VsYXRlU2Nyb2xsUG9zKGNtLHJlY3QpO2lmKHNjcm9sbFBvcy5zY3JvbGxUb3AhPW51bGwpe3VwZGF0ZVNjcm9sbFRvcChjbSxzY3JvbGxQb3Muc2Nyb2xsVG9wKTt9CmlmKHNjcm9sbFBvcy5zY3JvbGxMZWZ0IT1udWxsKXtzZXRTY3JvbGxMZWZ0KGNtLHNjcm9sbFBvcy5zY3JvbGxMZWZ0KTt9fQpmdW5jdGlvbiBjYWxjdWxhdGVTY3JvbGxQb3MoY20scmVjdCl7dmFyIGRpc3BsYXk9Y20uZGlzcGxheSxzbmFwTWFyZ2luPXRleHRIZWlnaHQoY20uZGlzcGxheSk7aWYocmVjdC50b3A8MCl7cmVjdC50b3A9MDt9CnZhciBzY3JlZW50b3A9Y20uY3VyT3AmJmNtLmN1ck9wLnNjcm9sbFRvcCE9bnVsbD9jbS5jdXJPcC5zY3JvbGxUb3A6ZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7dmFyIHNjcmVlbj1kaXNwbGF5SGVpZ2h0KGNtKSxyZXN1bHQ9e307aWYocmVjdC5ib3R0b20tcmVjdC50b3A+c2NyZWVuKXtyZWN0LmJvdHRvbT1yZWN0LnRvcCtzY3JlZW47fQp2YXIgZG9jQm90dG9tPWNtLmRvYy5oZWlnaHQrcGFkZGluZ1ZlcnQoZGlzcGxheSk7dmFyIGF0VG9wPXJlY3QudG9wPHNuYXBNYXJnaW4sYXRCb3R0b209cmVjdC5ib3R0b20+ZG9jQm90dG9tLXNuYXBNYXJnaW47aWYocmVjdC50b3A8c2NyZWVudG9wKXtyZXN1bHQuc2Nyb2xsVG9wPWF0VG9wPzA6cmVjdC50b3A7fWVsc2UgaWYocmVjdC5ib3R0b20+c2NyZWVudG9wK3NjcmVlbil7dmFyIG5ld1RvcD1NYXRoLm1pbihyZWN0LnRvcCwoYXRCb3R0b20/ZG9jQm90dG9tOnJlY3QuYm90dG9tKS1zY3JlZW4pO2lmKG5ld1RvcCE9c2NyZWVudG9wKXtyZXN1bHQuc2Nyb2xsVG9wPW5ld1RvcDt9fQp2YXIgc2NyZWVubGVmdD1jbS5jdXJPcCYmY20uY3VyT3Auc2Nyb2xsTGVmdCE9bnVsbD9jbS5jdXJPcC5zY3JvbGxMZWZ0OmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdDt2YXIgc2NyZWVudz1kaXNwbGF5V2lkdGgoY20pLShjbS5vcHRpb25zLmZpeGVkR3V0dGVyP2Rpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDowKTt2YXIgdG9vV2lkZT1yZWN0LnJpZ2h0LXJlY3QubGVmdD5zY3JlZW53O2lmKHRvb1dpZGUpe3JlY3QucmlnaHQ9cmVjdC5sZWZ0K3NjcmVlbnc7fQppZihyZWN0LmxlZnQ8MTApCntyZXN1bHQuc2Nyb2xsTGVmdD0wO30KZWxzZSBpZihyZWN0LmxlZnQ8c2NyZWVubGVmdCkKe3Jlc3VsdC5zY3JvbGxMZWZ0PU1hdGgubWF4KDAscmVjdC5sZWZ0LSh0b29XaWRlPzA6MTApKTt9CmVsc2UgaWYocmVjdC5yaWdodD5zY3JlZW53K3NjcmVlbmxlZnQtMykKe3Jlc3VsdC5zY3JvbGxMZWZ0PXJlY3QucmlnaHQrKHRvb1dpZGU/MDoxMCktc2NyZWVudzt9CnJldHVybiByZXN1bHR9CmZ1bmN0aW9uIGFkZFRvU2Nyb2xsVG9wKGNtLHRvcCl7aWYodG9wPT1udWxsKXtyZXR1cm59CnJlc29sdmVTY3JvbGxUb1BvcyhjbSk7Y20uY3VyT3Auc2Nyb2xsVG9wPShjbS5jdXJPcC5zY3JvbGxUb3A9PW51bGw/Y20uZG9jLnNjcm9sbFRvcDpjbS5jdXJPcC5zY3JvbGxUb3ApK3RvcDt9CmZ1bmN0aW9uIGVuc3VyZUN1cnNvclZpc2libGUoY20pe3Jlc29sdmVTY3JvbGxUb1BvcyhjbSk7dmFyIGN1cj1jbS5nZXRDdXJzb3IoKTtjbS5jdXJPcC5zY3JvbGxUb1Bvcz17ZnJvbTpjdXIsdG86Y3VyLG1hcmdpbjpjbS5vcHRpb25zLmN1cnNvclNjcm9sbE1hcmdpbn07fQpmdW5jdGlvbiBzY3JvbGxUb0Nvb3JkcyhjbSx4LHkpe2lmKHghPW51bGx8fHkhPW51bGwpe3Jlc29sdmVTY3JvbGxUb1BvcyhjbSk7fQppZih4IT1udWxsKXtjbS5jdXJPcC5zY3JvbGxMZWZ0PXg7fQppZih5IT1udWxsKXtjbS5jdXJPcC5zY3JvbGxUb3A9eTt9fQpmdW5jdGlvbiBzY3JvbGxUb1JhbmdlKGNtLHJhbmdlJCQxKXtyZXNvbHZlU2Nyb2xsVG9Qb3MoY20pO2NtLmN1ck9wLnNjcm9sbFRvUG9zPXJhbmdlJCQxO30KZnVuY3Rpb24gcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKXt2YXIgcmFuZ2UkJDE9Y20uY3VyT3Auc2Nyb2xsVG9Qb3M7aWYocmFuZ2UkJDEpe2NtLmN1ck9wLnNjcm9sbFRvUG9zPW51bGw7dmFyIGZyb209ZXN0aW1hdGVDb29yZHMoY20scmFuZ2UkJDEuZnJvbSksdG89ZXN0aW1hdGVDb29yZHMoY20scmFuZ2UkJDEudG8pO3Njcm9sbFRvQ29vcmRzUmFuZ2UoY20sZnJvbSx0byxyYW5nZSQkMS5tYXJnaW4pO319CmZ1bmN0aW9uIHNjcm9sbFRvQ29vcmRzUmFuZ2UoY20sZnJvbSx0byxtYXJnaW4pe3ZhciBzUG9zPWNhbGN1bGF0ZVNjcm9sbFBvcyhjbSx7bGVmdDpNYXRoLm1pbihmcm9tLmxlZnQsdG8ubGVmdCksdG9wOk1hdGgubWluKGZyb20udG9wLHRvLnRvcCktbWFyZ2luLHJpZ2h0Ok1hdGgubWF4KGZyb20ucmlnaHQsdG8ucmlnaHQpLGJvdHRvbTpNYXRoLm1heChmcm9tLmJvdHRvbSx0by5ib3R0b20pK21hcmdpbn0pO3Njcm9sbFRvQ29vcmRzKGNtLHNQb3Muc2Nyb2xsTGVmdCxzUG9zLnNjcm9sbFRvcCk7fQpmdW5jdGlvbiB1cGRhdGVTY3JvbGxUb3AoY20sdmFsKXtpZihNYXRoLmFicyhjbS5kb2Muc2Nyb2xsVG9wLXZhbCk8Mil7cmV0dXJufQppZighZ2Vja28pe3VwZGF0ZURpc3BsYXlTaW1wbGUoY20se3RvcDp2YWx9KTt9CnNldFNjcm9sbFRvcChjbSx2YWwsdHJ1ZSk7aWYoZ2Vja28pe3VwZGF0ZURpc3BsYXlTaW1wbGUoY20pO30Kc3RhcnRXb3JrZXIoY20sMTAwKTt9CmZ1bmN0aW9uIHNldFNjcm9sbFRvcChjbSx2YWwsZm9yY2VTY3JvbGwpe3ZhbD1NYXRoLm1pbihjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbEhlaWdodC1jbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudEhlaWdodCx2YWwpO2lmKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wPT12YWwmJiFmb3JjZVNjcm9sbCl7cmV0dXJufQpjbS5kb2Muc2Nyb2xsVG9wPXZhbDtjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKHZhbCk7aWYoY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AhPXZhbCl7Y20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A9dmFsO319CmZ1bmN0aW9uIHNldFNjcm9sbExlZnQoY20sdmFsLGlzU2Nyb2xsZXIsZm9yY2VTY3JvbGwpe3ZhbD1NYXRoLm1pbih2YWwsY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxXaWR0aC1jbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoKTtpZigoaXNTY3JvbGxlcj92YWw9PWNtLmRvYy5zY3JvbGxMZWZ0Ok1hdGguYWJzKGNtLmRvYy5zY3JvbGxMZWZ0LXZhbCk8MikmJiFmb3JjZVNjcm9sbCl7cmV0dXJufQpjbS5kb2Muc2Nyb2xsTGVmdD12YWw7YWxpZ25Ib3Jpem9udGFsbHkoY20pO2lmKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCE9dmFsKXtjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQ9dmFsO30KY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbExlZnQodmFsKTt9CmZ1bmN0aW9uIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKXt2YXIgZD1jbS5kaXNwbGF5LGd1dHRlclc9ZC5ndXR0ZXJzLm9mZnNldFdpZHRoO3ZhciBkb2NIPU1hdGgucm91bmQoY20uZG9jLmhlaWdodCtwYWRkaW5nVmVydChjbS5kaXNwbGF5KSk7cmV0dXJue2NsaWVudEhlaWdodDpkLnNjcm9sbGVyLmNsaWVudEhlaWdodCx2aWV3SGVpZ2h0OmQud3JhcHBlci5jbGllbnRIZWlnaHQsc2Nyb2xsV2lkdGg6ZC5zY3JvbGxlci5zY3JvbGxXaWR0aCxjbGllbnRXaWR0aDpkLnNjcm9sbGVyLmNsaWVudFdpZHRoLHZpZXdXaWR0aDpkLndyYXBwZXIuY2xpZW50V2lkdGgsYmFyTGVmdDpjbS5vcHRpb25zLmZpeGVkR3V0dGVyP2d1dHRlclc6MCxkb2NIZWlnaHQ6ZG9jSCxzY3JvbGxIZWlnaHQ6ZG9jSCtzY3JvbGxHYXAoY20pK2QuYmFySGVpZ2h0LG5hdGl2ZUJhcldpZHRoOmQubmF0aXZlQmFyV2lkdGgsZ3V0dGVyV2lkdGg6Z3V0dGVyV319CnZhciBOYXRpdmVTY3JvbGxiYXJzPWZ1bmN0aW9uKHBsYWNlLHNjcm9sbCxjbSl7dGhpcy5jbT1jbTt2YXIgdmVydD10aGlzLnZlcnQ9ZWx0KCJkaXYiLFtlbHQoImRpdiIsbnVsbCxudWxsLCJtaW4td2lkdGg6IDFweCIpXSwiQ29kZU1pcnJvci12c2Nyb2xsYmFyIik7dmFyIGhvcml6PXRoaXMuaG9yaXo9ZWx0KCJkaXYiLFtlbHQoImRpdiIsbnVsbCxudWxsLCJoZWlnaHQ6IDEwMCU7IG1pbi1oZWlnaHQ6IDFweCIpXSwiQ29kZU1pcnJvci1oc2Nyb2xsYmFyIik7cGxhY2UodmVydCk7cGxhY2UoaG9yaXopO29uKHZlcnQsInNjcm9sbCIsZnVuY3Rpb24oKXtpZih2ZXJ0LmNsaWVudEhlaWdodCl7c2Nyb2xsKHZlcnQuc2Nyb2xsVG9wLCJ2ZXJ0aWNhbCIpO319KTtvbihob3Jpeiwic2Nyb2xsIixmdW5jdGlvbigpe2lmKGhvcml6LmNsaWVudFdpZHRoKXtzY3JvbGwoaG9yaXouc2Nyb2xsTGVmdCwiaG9yaXpvbnRhbCIpO319KTt0aGlzLmNoZWNrZWRaZXJvV2lkdGg9ZmFsc2U7aWYoaWUmJmllX3ZlcnNpb248OCl7dGhpcy5ob3Jpei5zdHlsZS5taW5IZWlnaHQ9dGhpcy52ZXJ0LnN0eWxlLm1pbldpZHRoPSIxOHB4Ijt9fTtOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24obWVhc3VyZSl7dmFyIG5lZWRzSD1tZWFzdXJlLnNjcm9sbFdpZHRoPm1lYXN1cmUuY2xpZW50V2lkdGgrMTt2YXIgbmVlZHNWPW1lYXN1cmUuc2Nyb2xsSGVpZ2h0Pm1lYXN1cmUuY2xpZW50SGVpZ2h0KzE7dmFyIHNXaWR0aD1tZWFzdXJlLm5hdGl2ZUJhcldpZHRoO2lmKG5lZWRzVil7dGhpcy52ZXJ0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLnZlcnQuc3R5bGUuYm90dG9tPW5lZWRzSD9zV2lkdGgrInB4IjoiMCI7dmFyIHRvdGFsSGVpZ2h0PW1lYXN1cmUudmlld0hlaWdodC0obmVlZHNIP3NXaWR0aDowKTt0aGlzLnZlcnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9TWF0aC5tYXgoMCxtZWFzdXJlLnNjcm9sbEhlaWdodC1tZWFzdXJlLmNsaWVudEhlaWdodCt0b3RhbEhlaWdodCkrInB4Ijt9ZWxzZXt0aGlzLnZlcnQuc3R5bGUuZGlzcGxheT0iIjt0aGlzLnZlcnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9IjAiO30KaWYobmVlZHNIKXt0aGlzLmhvcml6LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmhvcml6LnN0eWxlLnJpZ2h0PW5lZWRzVj9zV2lkdGgrInB4IjoiMCI7dGhpcy5ob3Jpei5zdHlsZS5sZWZ0PW1lYXN1cmUuYmFyTGVmdCsicHgiO3ZhciB0b3RhbFdpZHRoPW1lYXN1cmUudmlld1dpZHRoLW1lYXN1cmUuYmFyTGVmdC0obmVlZHNWP3NXaWR0aDowKTt0aGlzLmhvcml6LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9TWF0aC5tYXgoMCxtZWFzdXJlLnNjcm9sbFdpZHRoLW1lYXN1cmUuY2xpZW50V2lkdGgrdG90YWxXaWR0aCkrInB4Ijt9ZWxzZXt0aGlzLmhvcml6LnN0eWxlLmRpc3BsYXk9IiI7dGhpcy5ob3Jpei5maXJzdENoaWxkLnN0eWxlLndpZHRoPSIwIjt9CmlmKCF0aGlzLmNoZWNrZWRaZXJvV2lkdGgmJm1lYXN1cmUuY2xpZW50SGVpZ2h0PjApe2lmKHNXaWR0aD09MCl7dGhpcy56ZXJvV2lkdGhIYWNrKCk7fQp0aGlzLmNoZWNrZWRaZXJvV2lkdGg9dHJ1ZTt9CnJldHVybntyaWdodDpuZWVkc1Y/c1dpZHRoOjAsYm90dG9tOm5lZWRzSD9zV2lkdGg6MH19O05hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24ocG9zKXtpZih0aGlzLmhvcml6LnNjcm9sbExlZnQhPXBvcyl7dGhpcy5ob3Jpei5zY3JvbGxMZWZ0PXBvczt9CmlmKHRoaXMuZGlzYWJsZUhvcml6KXt0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLmhvcml6LHRoaXMuZGlzYWJsZUhvcml6LCJob3JpeiIpO319O05hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLnNldFNjcm9sbFRvcD1mdW5jdGlvbihwb3Mpe2lmKHRoaXMudmVydC5zY3JvbGxUb3AhPXBvcyl7dGhpcy52ZXJ0LnNjcm9sbFRvcD1wb3M7fQppZih0aGlzLmRpc2FibGVWZXJ0KXt0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLnZlcnQsdGhpcy5kaXNhYmxlVmVydCwidmVydCIpO319O05hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLnplcm9XaWR0aEhhY2s9ZnVuY3Rpb24oKXt2YXIgdz1tYWMmJiFtYWNfZ2VNb3VudGFpbkxpb24/IjEycHgiOiIxOHB4Ijt0aGlzLmhvcml6LnN0eWxlLmhlaWdodD10aGlzLnZlcnQuc3R5bGUud2lkdGg9dzt0aGlzLmhvcml6LnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy52ZXJ0LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiO3RoaXMuZGlzYWJsZUhvcml6PW5ldyBEZWxheWVkO3RoaXMuZGlzYWJsZVZlcnQ9bmV3IERlbGF5ZWQ7fTtOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZS5lbmFibGVaZXJvV2lkdGhCYXI9ZnVuY3Rpb24oYmFyLGRlbGF5LHR5cGUpe2Jhci5zdHlsZS5wb2ludGVyRXZlbnRzPSJhdXRvIjtmdW5jdGlvbiBtYXliZURpc2FibGUoKXt2YXIgYm94PWJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgZWx0JCQxPXR5cGU9PSJ2ZXJ0Ij9kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGJveC5yaWdodC0xLChib3gudG9wK2JveC5ib3R0b20pLzIpOmRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoKGJveC5yaWdodCtib3gubGVmdCkvMixib3guYm90dG9tLTEpO2lmKGVsdCQkMSE9YmFyKXtiYXIuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSI7fQplbHNle2RlbGF5LnNldCgxMDAwLG1heWJlRGlzYWJsZSk7fX0KZGVsYXkuc2V0KDEwMDAsbWF5YmVEaXNhYmxlKTt9O05hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHBhcmVudD10aGlzLmhvcml6LnBhcmVudE5vZGU7cGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuaG9yaXopO3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzLnZlcnQpO307dmFyIE51bGxTY3JvbGxiYXJzPWZ1bmN0aW9uKCl7fTtOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJue2JvdHRvbTowLHJpZ2h0OjB9fTtOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe307TnVsbFNjcm9sbGJhcnMucHJvdG90eXBlLnNldFNjcm9sbFRvcD1mdW5jdGlvbigpe307TnVsbFNjcm9sbGJhcnMucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzKGNtLG1lYXN1cmUpe2lmKCFtZWFzdXJlKXttZWFzdXJlPW1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTt9CnZhciBzdGFydFdpZHRoPWNtLmRpc3BsYXkuYmFyV2lkdGgsc3RhcnRIZWlnaHQ9Y20uZGlzcGxheS5iYXJIZWlnaHQ7dXBkYXRlU2Nyb2xsYmFyc0lubmVyKGNtLG1lYXN1cmUpO2Zvcih2YXIgaT0wO2k8NCYmc3RhcnRXaWR0aCE9Y20uZGlzcGxheS5iYXJXaWR0aHx8c3RhcnRIZWlnaHQhPWNtLmRpc3BsYXkuYmFySGVpZ2h0O2krKyl7aWYoc3RhcnRXaWR0aCE9Y20uZGlzcGxheS5iYXJXaWR0aCYmY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpCnt1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7fQp1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pKTtzdGFydFdpZHRoPWNtLmRpc3BsYXkuYmFyV2lkdGg7c3RhcnRIZWlnaHQ9Y20uZGlzcGxheS5iYXJIZWlnaHQ7fX0KZnVuY3Rpb24gdXBkYXRlU2Nyb2xsYmFyc0lubmVyKGNtLG1lYXN1cmUpe3ZhciBkPWNtLmRpc3BsYXk7dmFyIHNpemVzPWQuc2Nyb2xsYmFycy51cGRhdGUobWVhc3VyZSk7ZC5zaXplci5zdHlsZS5wYWRkaW5nUmlnaHQ9KGQuYmFyV2lkdGg9c2l6ZXMucmlnaHQpKyJweCI7ZC5zaXplci5zdHlsZS5wYWRkaW5nQm90dG9tPShkLmJhckhlaWdodD1zaXplcy5ib3R0b20pKyJweCI7ZC5oZWlnaHRGb3JjZXIuc3R5bGUuYm9yZGVyQm90dG9tPXNpemVzLmJvdHRvbSsicHggc29saWQgdHJhbnNwYXJlbnQiO2lmKHNpemVzLnJpZ2h0JiZzaXplcy5ib3R0b20pe2Quc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5oZWlnaHQ9c2l6ZXMuYm90dG9tKyJweCI7ZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUud2lkdGg9c2l6ZXMucmlnaHQrInB4Ijt9ZWxzZXtkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5PSIiO30KaWYoc2l6ZXMuYm90dG9tJiZjbS5vcHRpb25zLmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyJiZjbS5vcHRpb25zLmZpeGVkR3V0dGVyKXtkLmd1dHRlckZpbGxlci5zdHlsZS5kaXNwbGF5PSJibG9jayI7ZC5ndXR0ZXJGaWxsZXIuc3R5bGUuaGVpZ2h0PXNpemVzLmJvdHRvbSsicHgiO2QuZ3V0dGVyRmlsbGVyLnN0eWxlLndpZHRoPW1lYXN1cmUuZ3V0dGVyV2lkdGgrInB4Ijt9ZWxzZXtkLmd1dHRlckZpbGxlci5zdHlsZS5kaXNwbGF5PSIiO319CnZhciBzY3JvbGxiYXJNb2RlbD17Im5hdGl2ZSI6TmF0aXZlU2Nyb2xsYmFycywibnVsbCI6TnVsbFNjcm9sbGJhcnN9O2Z1bmN0aW9uIGluaXRTY3JvbGxiYXJzKGNtKXtpZihjbS5kaXNwbGF5LnNjcm9sbGJhcnMpe2NtLmRpc3BsYXkuc2Nyb2xsYmFycy5jbGVhcigpO2lmKGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcykKe3JtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcyk7fX0KY20uZGlzcGxheS5zY3JvbGxiYXJzPW5ldyBzY3JvbGxiYXJNb2RlbFtjbS5vcHRpb25zLnNjcm9sbGJhclN0eWxlXShmdW5jdGlvbihub2RlKXtjbS5kaXNwbGF5LndyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsY20uZGlzcGxheS5zY3JvbGxiYXJGaWxsZXIpO29uKG5vZGUsIm1vdXNlZG93biIsZnVuY3Rpb24oKXtpZihjbS5zdGF0ZS5mb2N1c2VkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTt9LDApO319KTtub2RlLnNldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiLCJ0cnVlIik7fSxmdW5jdGlvbihwb3MsYXhpcyl7aWYoYXhpcz09Imhvcml6b250YWwiKXtzZXRTY3JvbGxMZWZ0KGNtLHBvcyk7fQplbHNle3VwZGF0ZVNjcm9sbFRvcChjbSxwb3MpO319LGNtKTtpZihjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpCnthZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKTt9fQp2YXIgbmV4dE9wSWQ9MDtmdW5jdGlvbiBzdGFydE9wZXJhdGlvbihjbSl7Y20uY3VyT3A9e2NtOmNtLHZpZXdDaGFuZ2VkOmZhbHNlLHN0YXJ0SGVpZ2h0OmNtLmRvYy5oZWlnaHQsZm9yY2VVcGRhdGU6ZmFsc2UsdXBkYXRlSW5wdXQ6bnVsbCx0eXBpbmc6ZmFsc2UsY2hhbmdlT2JqczpudWxsLGN1cnNvckFjdGl2aXR5SGFuZGxlcnM6bnVsbCxjdXJzb3JBY3Rpdml0eUNhbGxlZDowLHNlbGVjdGlvbkNoYW5nZWQ6ZmFsc2UsdXBkYXRlTWF4TGluZTpmYWxzZSxzY3JvbGxMZWZ0Om51bGwsc2Nyb2xsVG9wOm51bGwsc2Nyb2xsVG9Qb3M6bnVsbCxmb2N1czpmYWxzZSxpZDorK25leHRPcElkfTtwdXNoT3BlcmF0aW9uKGNtLmN1ck9wKTt9CmZ1bmN0aW9uIGVuZE9wZXJhdGlvbihjbSl7dmFyIG9wPWNtLmN1ck9wO2ZpbmlzaE9wZXJhdGlvbihvcCxmdW5jdGlvbihncm91cCl7Zm9yKHZhciBpPTA7aTxncm91cC5vcHMubGVuZ3RoO2krKykKe2dyb3VwLm9wc1tpXS5jbS5jdXJPcD1udWxsO30KZW5kT3BlcmF0aW9ucyhncm91cCk7fSk7fQpmdW5jdGlvbiBlbmRPcGVyYXRpb25zKGdyb3VwKXt2YXIgb3BzPWdyb3VwLm9wcztmb3IodmFyIGk9MDtpPG9wcy5sZW5ndGg7aSsrKQp7ZW5kT3BlcmF0aW9uX1IxKG9wc1tpXSk7fQpmb3IodmFyIGkkMT0wO2kkMTxvcHMubGVuZ3RoO2kkMSsrKQp7ZW5kT3BlcmF0aW9uX1cxKG9wc1tpJDFdKTt9CmZvcih2YXIgaSQyPTA7aSQyPG9wcy5sZW5ndGg7aSQyKyspCntlbmRPcGVyYXRpb25fUjIob3BzW2kkMl0pO30KZm9yKHZhciBpJDM9MDtpJDM8b3BzLmxlbmd0aDtpJDMrKykKe2VuZE9wZXJhdGlvbl9XMihvcHNbaSQzXSk7fQpmb3IodmFyIGkkND0wO2kkNDxvcHMubGVuZ3RoO2kkNCsrKQp7ZW5kT3BlcmF0aW9uX2ZpbmlzaChvcHNbaSQ0XSk7fX0KZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1IxKG9wKXt2YXIgY209b3AuY20sZGlzcGxheT1jbS5kaXNwbGF5O21heWJlQ2xpcFNjcm9sbGJhcnMoY20pO2lmKG9wLnVwZGF0ZU1heExpbmUpe2ZpbmRNYXhMaW5lKGNtKTt9Cm9wLm11c3RVcGRhdGU9b3Audmlld0NoYW5nZWR8fG9wLmZvcmNlVXBkYXRlfHxvcC5zY3JvbGxUb3AhPW51bGx8fG9wLnNjcm9sbFRvUG9zJiYob3Auc2Nyb2xsVG9Qb3MuZnJvbS5saW5lPGRpc3BsYXkudmlld0Zyb218fG9wLnNjcm9sbFRvUG9zLnRvLmxpbmU+PWRpc3BsYXkudmlld1RvKXx8ZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCYmY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7b3AudXBkYXRlPW9wLm11c3RVcGRhdGUmJm5ldyBEaXNwbGF5VXBkYXRlKGNtLG9wLm11c3RVcGRhdGUmJnt0b3A6b3Auc2Nyb2xsVG9wLGVuc3VyZTpvcC5zY3JvbGxUb1Bvc30sb3AuZm9yY2VVcGRhdGUpO30KZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cxKG9wKXtvcC51cGRhdGVkRGlzcGxheT1vcC5tdXN0VXBkYXRlJiZ1cGRhdGVEaXNwbGF5SWZOZWVkZWQob3AuY20sb3AudXBkYXRlKTt9CmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMihvcCl7dmFyIGNtPW9wLmNtLGRpc3BsYXk9Y20uZGlzcGxheTtpZihvcC51cGRhdGVkRGlzcGxheSl7dXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pO30Kb3AuYmFyTWVhc3VyZT1tZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSk7aWYoZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCYmIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKXtvcC5hZGp1c3RXaWR0aFRvPW1lYXN1cmVDaGFyKGNtLGRpc3BsYXkubWF4TGluZSxkaXNwbGF5Lm1heExpbmUudGV4dC5sZW5ndGgpLmxlZnQrMztjbS5kaXNwbGF5LnNpemVyV2lkdGg9b3AuYWRqdXN0V2lkdGhUbztvcC5iYXJNZWFzdXJlLnNjcm9sbFdpZHRoPU1hdGgubWF4KGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgsZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0K29wLmFkanVzdFdpZHRoVG8rc2Nyb2xsR2FwKGNtKStjbS5kaXNwbGF5LmJhcldpZHRoKTtvcC5tYXhTY3JvbGxMZWZ0PU1hdGgubWF4KDAsZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0K29wLmFkanVzdFdpZHRoVG8tZGlzcGxheVdpZHRoKGNtKSk7fQppZihvcC51cGRhdGVkRGlzcGxheXx8b3Auc2VsZWN0aW9uQ2hhbmdlZCkKe29wLnByZXBhcmVkU2VsZWN0aW9uPWRpc3BsYXkuaW5wdXQucHJlcGFyZVNlbGVjdGlvbigpO319CmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9XMihvcCl7dmFyIGNtPW9wLmNtO2lmKG9wLmFkanVzdFdpZHRoVG8hPW51bGwpe2NtLmRpc3BsYXkuc2l6ZXIuc3R5bGUubWluV2lkdGg9b3AuYWRqdXN0V2lkdGhUbysicHgiO2lmKG9wLm1heFNjcm9sbExlZnQ8Y20uZG9jLnNjcm9sbExlZnQpCntzZXRTY3JvbGxMZWZ0KGNtLE1hdGgubWluKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCxvcC5tYXhTY3JvbGxMZWZ0KSx0cnVlKTt9CmNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQ9ZmFsc2U7fQp2YXIgdGFrZUZvY3VzPW9wLmZvY3VzJiZvcC5mb2N1cz09YWN0aXZlRWx0KCk7aWYob3AucHJlcGFyZWRTZWxlY3Rpb24pCntjbS5kaXNwbGF5LmlucHV0LnNob3dTZWxlY3Rpb24ob3AucHJlcGFyZWRTZWxlY3Rpb24sdGFrZUZvY3VzKTt9CmlmKG9wLnVwZGF0ZWREaXNwbGF5fHxvcC5zdGFydEhlaWdodCE9Y20uZG9jLmhlaWdodCkKe3VwZGF0ZVNjcm9sbGJhcnMoY20sb3AuYmFyTWVhc3VyZSk7fQppZihvcC51cGRhdGVkRGlzcGxheSkKe3NldERvY3VtZW50SGVpZ2h0KGNtLG9wLmJhck1lYXN1cmUpO30KaWYob3Auc2VsZWN0aW9uQ2hhbmdlZCl7cmVzdGFydEJsaW5rKGNtKTt9CmlmKGNtLnN0YXRlLmZvY3VzZWQmJm9wLnVwZGF0ZUlucHV0KQp7Y20uZGlzcGxheS5pbnB1dC5yZXNldChvcC50eXBpbmcpO30KaWYodGFrZUZvY3VzKXtlbnN1cmVGb2N1cyhvcC5jbSk7fX0KZnVuY3Rpb24gZW5kT3BlcmF0aW9uX2ZpbmlzaChvcCl7dmFyIGNtPW9wLmNtLGRpc3BsYXk9Y20uZGlzcGxheSxkb2M9Y20uZG9jO2lmKG9wLnVwZGF0ZWREaXNwbGF5KXtwb3N0VXBkYXRlRGlzcGxheShjbSxvcC51cGRhdGUpO30KaWYoZGlzcGxheS53aGVlbFN0YXJ0WCE9bnVsbCYmKG9wLnNjcm9sbFRvcCE9bnVsbHx8b3Auc2Nyb2xsTGVmdCE9bnVsbHx8b3Auc2Nyb2xsVG9Qb3MpKQp7ZGlzcGxheS53aGVlbFN0YXJ0WD1kaXNwbGF5LndoZWVsU3RhcnRZPW51bGw7fQppZihvcC5zY3JvbGxUb3AhPW51bGwpe3NldFNjcm9sbFRvcChjbSxvcC5zY3JvbGxUb3Asb3AuZm9yY2VTY3JvbGwpO30KaWYob3Auc2Nyb2xsTGVmdCE9bnVsbCl7c2V0U2Nyb2xsTGVmdChjbSxvcC5zY3JvbGxMZWZ0LHRydWUsdHJ1ZSk7fQppZihvcC5zY3JvbGxUb1Bvcyl7dmFyIHJlY3Q9c2Nyb2xsUG9zSW50b1ZpZXcoY20sY2xpcFBvcyhkb2Msb3Auc2Nyb2xsVG9Qb3MuZnJvbSksY2xpcFBvcyhkb2Msb3Auc2Nyb2xsVG9Qb3MudG8pLG9wLnNjcm9sbFRvUG9zLm1hcmdpbik7bWF5YmVTY3JvbGxXaW5kb3coY20scmVjdCk7fQp2YXIgaGlkZGVuPW9wLm1heWJlSGlkZGVuTWFya2Vycyx1bmhpZGRlbj1vcC5tYXliZVVuaGlkZGVuTWFya2VycztpZihoaWRkZW4pe2Zvcih2YXIgaT0wO2k8aGlkZGVuLmxlbmd0aDsrK2kpCntpZighaGlkZGVuW2ldLmxpbmVzLmxlbmd0aCl7c2lnbmFsKGhpZGRlbltpXSwiaGlkZSIpO319fQppZih1bmhpZGRlbil7Zm9yKHZhciBpJDE9MDtpJDE8dW5oaWRkZW4ubGVuZ3RoOysraSQxKQp7aWYodW5oaWRkZW5baSQxXS5saW5lcy5sZW5ndGgpe3NpZ25hbCh1bmhpZGRlbltpJDFdLCJ1bmhpZGUiKTt9fX0KaWYoZGlzcGxheS53cmFwcGVyLm9mZnNldEhlaWdodCkKe2RvYy5zY3JvbGxUb3A9Y20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7fQppZihvcC5jaGFuZ2VPYmpzKQp7c2lnbmFsKGNtLCJjaGFuZ2VzIixjbSxvcC5jaGFuZ2VPYmpzKTt9CmlmKG9wLnVwZGF0ZSkKe29wLnVwZGF0ZS5maW5pc2goKTt9fQpmdW5jdGlvbiBydW5Jbk9wKGNtLGYpe2lmKGNtLmN1ck9wKXtyZXR1cm4gZigpfQpzdGFydE9wZXJhdGlvbihjbSk7dHJ5e3JldHVybiBmKCl9CmZpbmFsbHl7ZW5kT3BlcmF0aW9uKGNtKTt9fQpmdW5jdGlvbiBvcGVyYXRpb24oY20sZil7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoY20uY3VyT3Ape3JldHVybiBmLmFwcGx5KGNtLGFyZ3VtZW50cyl9CnN0YXJ0T3BlcmF0aW9uKGNtKTt0cnl7cmV0dXJuIGYuYXBwbHkoY20sYXJndW1lbnRzKX0KZmluYWxseXtlbmRPcGVyYXRpb24oY20pO319fQpmdW5jdGlvbiBtZXRob2RPcChmKXtyZXR1cm4gZnVuY3Rpb24oKXtpZih0aGlzLmN1ck9wKXtyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CnN0YXJ0T3BlcmF0aW9uKHRoaXMpO3RyeXtyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CmZpbmFsbHl7ZW5kT3BlcmF0aW9uKHRoaXMpO319fQpmdW5jdGlvbiBkb2NNZXRob2RPcChmKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgY209dGhpcy5jbTtpZighY218fGNtLmN1ck9wKXtyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CnN0YXJ0T3BlcmF0aW9uKGNtKTt0cnl7cmV0dXJuIGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfQpmaW5hbGx5e2VuZE9wZXJhdGlvbihjbSk7fX19CmZ1bmN0aW9uIHJlZ0NoYW5nZShjbSxmcm9tLHRvLGxlbmRpZmYpe2lmKGZyb209PW51bGwpe2Zyb209Y20uZG9jLmZpcnN0O30KaWYodG89PW51bGwpe3RvPWNtLmRvYy5maXJzdCtjbS5kb2Muc2l6ZTt9CmlmKCFsZW5kaWZmKXtsZW5kaWZmPTA7fQp2YXIgZGlzcGxheT1jbS5kaXNwbGF5O2lmKGxlbmRpZmYmJnRvPGRpc3BsYXkudmlld1RvJiYoZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycz09bnVsbHx8ZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycz5mcm9tKSkKe2Rpc3BsYXkudXBkYXRlTGluZU51bWJlcnM9ZnJvbTt9CmNtLmN1ck9wLnZpZXdDaGFuZ2VkPXRydWU7aWYoZnJvbT49ZGlzcGxheS52aWV3VG8pe2lmKHNhd0NvbGxhcHNlZFNwYW5zJiZ2aXN1YWxMaW5lTm8oY20uZG9jLGZyb20pPGRpc3BsYXkudmlld1RvKQp7cmVzZXRWaWV3KGNtKTt9fWVsc2UgaWYodG88PWRpc3BsYXkudmlld0Zyb20pe2lmKHNhd0NvbGxhcHNlZFNwYW5zJiZ2aXN1YWxMaW5lRW5kTm8oY20uZG9jLHRvK2xlbmRpZmYpPmRpc3BsYXkudmlld0Zyb20pe3Jlc2V0VmlldyhjbSk7fWVsc2V7ZGlzcGxheS52aWV3RnJvbSs9bGVuZGlmZjtkaXNwbGF5LnZpZXdUbys9bGVuZGlmZjt9fWVsc2UgaWYoZnJvbTw9ZGlzcGxheS52aWV3RnJvbSYmdG8+PWRpc3BsYXkudmlld1RvKXtyZXNldFZpZXcoY20pO31lbHNlIGlmKGZyb208PWRpc3BsYXkudmlld0Zyb20pe3ZhciBjdXQ9dmlld0N1dHRpbmdQb2ludChjbSx0byx0bytsZW5kaWZmLDEpO2lmKGN1dCl7ZGlzcGxheS52aWV3PWRpc3BsYXkudmlldy5zbGljZShjdXQuaW5kZXgpO2Rpc3BsYXkudmlld0Zyb209Y3V0LmxpbmVOO2Rpc3BsYXkudmlld1RvKz1sZW5kaWZmO31lbHNle3Jlc2V0VmlldyhjbSk7fX1lbHNlIGlmKHRvPj1kaXNwbGF5LnZpZXdUbyl7dmFyIGN1dCQxPXZpZXdDdXR0aW5nUG9pbnQoY20sZnJvbSxmcm9tLC0xKTtpZihjdXQkMSl7ZGlzcGxheS52aWV3PWRpc3BsYXkudmlldy5zbGljZSgwLGN1dCQxLmluZGV4KTtkaXNwbGF5LnZpZXdUbz1jdXQkMS5saW5lTjt9ZWxzZXtyZXNldFZpZXcoY20pO319ZWxzZXt2YXIgY3V0VG9wPXZpZXdDdXR0aW5nUG9pbnQoY20sZnJvbSxmcm9tLC0xKTt2YXIgY3V0Qm90PXZpZXdDdXR0aW5nUG9pbnQoY20sdG8sdG8rbGVuZGlmZiwxKTtpZihjdXRUb3AmJmN1dEJvdCl7ZGlzcGxheS52aWV3PWRpc3BsYXkudmlldy5zbGljZSgwLGN1dFRvcC5pbmRleCkuY29uY2F0KGJ1aWxkVmlld0FycmF5KGNtLGN1dFRvcC5saW5lTixjdXRCb3QubGluZU4pKS5jb25jYXQoZGlzcGxheS52aWV3LnNsaWNlKGN1dEJvdC5pbmRleCkpO2Rpc3BsYXkudmlld1RvKz1sZW5kaWZmO31lbHNle3Jlc2V0VmlldyhjbSk7fX0KdmFyIGV4dD1kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ7aWYoZXh0KXtpZih0bzxleHQubGluZU4pCntleHQubGluZU4rPWxlbmRpZmY7fQplbHNlIGlmKGZyb208ZXh0LmxpbmVOK2V4dC5zaXplKQp7ZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkPW51bGw7fX19CmZ1bmN0aW9uIHJlZ0xpbmVDaGFuZ2UoY20sbGluZSx0eXBlKXtjbS5jdXJPcC52aWV3Q2hhbmdlZD10cnVlO3ZhciBkaXNwbGF5PWNtLmRpc3BsYXksZXh0PWNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZDtpZihleHQmJmxpbmU+PWV4dC5saW5lTiYmbGluZTxleHQubGluZU4rZXh0LnNpemUpCntkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQ9bnVsbDt9CmlmKGxpbmU8ZGlzcGxheS52aWV3RnJvbXx8bGluZT49ZGlzcGxheS52aWV3VG8pe3JldHVybn0KdmFyIGxpbmVWaWV3PWRpc3BsYXkudmlld1tmaW5kVmlld0luZGV4KGNtLGxpbmUpXTtpZihsaW5lVmlldy5ub2RlPT1udWxsKXtyZXR1cm59CnZhciBhcnI9bGluZVZpZXcuY2hhbmdlc3x8KGxpbmVWaWV3LmNoYW5nZXM9W10pO2lmKGluZGV4T2YoYXJyLHR5cGUpPT0tMSl7YXJyLnB1c2godHlwZSk7fX0KZnVuY3Rpb24gcmVzZXRWaWV3KGNtKXtjbS5kaXNwbGF5LnZpZXdGcm9tPWNtLmRpc3BsYXkudmlld1RvPWNtLmRvYy5maXJzdDtjbS5kaXNwbGF5LnZpZXc9W107Y20uZGlzcGxheS52aWV3T2Zmc2V0PTA7fQpmdW5jdGlvbiB2aWV3Q3V0dGluZ1BvaW50KGNtLG9sZE4sbmV3TixkaXIpe3ZhciBpbmRleD1maW5kVmlld0luZGV4KGNtLG9sZE4pLGRpZmYsdmlldz1jbS5kaXNwbGF5LnZpZXc7aWYoIXNhd0NvbGxhcHNlZFNwYW5zfHxuZXdOPT1jbS5kb2MuZmlyc3QrY20uZG9jLnNpemUpCntyZXR1cm57aW5kZXg6aW5kZXgsbGluZU46bmV3Tn19CnZhciBuPWNtLmRpc3BsYXkudmlld0Zyb207Zm9yKHZhciBpPTA7aTxpbmRleDtpKyspCntuKz12aWV3W2ldLnNpemU7fQppZihuIT1vbGROKXtpZihkaXI+MCl7aWYoaW5kZXg9PXZpZXcubGVuZ3RoLTEpe3JldHVybiBudWxsfQpkaWZmPShuK3ZpZXdbaW5kZXhdLnNpemUpLW9sZE47aW5kZXgrKzt9ZWxzZXtkaWZmPW4tb2xkTjt9Cm9sZE4rPWRpZmY7bmV3Tis9ZGlmZjt9CndoaWxlKHZpc3VhbExpbmVObyhjbS5kb2MsbmV3TikhPW5ld04pe2lmKGluZGV4PT0oZGlyPDA/MDp2aWV3Lmxlbmd0aC0xKSl7cmV0dXJuIG51bGx9Cm5ld04rPWRpcip2aWV3W2luZGV4LShkaXI8MD8xOjApXS5zaXplO2luZGV4Kz1kaXI7fQpyZXR1cm57aW5kZXg6aW5kZXgsbGluZU46bmV3Tn19CmZ1bmN0aW9uIGFkanVzdFZpZXcoY20sZnJvbSx0byl7dmFyIGRpc3BsYXk9Y20uZGlzcGxheSx2aWV3PWRpc3BsYXkudmlldztpZih2aWV3Lmxlbmd0aD09MHx8ZnJvbT49ZGlzcGxheS52aWV3VG98fHRvPD1kaXNwbGF5LnZpZXdGcm9tKXtkaXNwbGF5LnZpZXc9YnVpbGRWaWV3QXJyYXkoY20sZnJvbSx0byk7ZGlzcGxheS52aWV3RnJvbT1mcm9tO31lbHNle2lmKGRpc3BsYXkudmlld0Zyb20+ZnJvbSkKe2Rpc3BsYXkudmlldz1idWlsZFZpZXdBcnJheShjbSxmcm9tLGRpc3BsYXkudmlld0Zyb20pLmNvbmNhdChkaXNwbGF5LnZpZXcpO30KZWxzZSBpZihkaXNwbGF5LnZpZXdGcm9tPGZyb20pCntkaXNwbGF5LnZpZXc9ZGlzcGxheS52aWV3LnNsaWNlKGZpbmRWaWV3SW5kZXgoY20sZnJvbSkpO30KZGlzcGxheS52aWV3RnJvbT1mcm9tO2lmKGRpc3BsYXkudmlld1RvPHRvKQp7ZGlzcGxheS52aWV3PWRpc3BsYXkudmlldy5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sZGlzcGxheS52aWV3VG8sdG8pKTt9CmVsc2UgaWYoZGlzcGxheS52aWV3VG8+dG8pCntkaXNwbGF5LnZpZXc9ZGlzcGxheS52aWV3LnNsaWNlKDAsZmluZFZpZXdJbmRleChjbSx0bykpO319CmRpc3BsYXkudmlld1RvPXRvO30KZnVuY3Rpb24gY291bnREaXJ0eVZpZXcoY20pe3ZhciB2aWV3PWNtLmRpc3BsYXkudmlldyxkaXJ0eT0wO2Zvcih2YXIgaT0wO2k8dmlldy5sZW5ndGg7aSsrKXt2YXIgbGluZVZpZXc9dmlld1tpXTtpZighbGluZVZpZXcuaGlkZGVuJiYoIWxpbmVWaWV3Lm5vZGV8fGxpbmVWaWV3LmNoYW5nZXMpKXsrK2RpcnR5O319CnJldHVybiBkaXJ0eX0KZnVuY3Rpb24gc3RhcnRXb3JrZXIoY20sdGltZSl7aWYoY20uZG9jLmhpZ2hsaWdodEZyb250aWVyPGNtLmRpc3BsYXkudmlld1RvKQp7Y20uc3RhdGUuaGlnaGxpZ2h0LnNldCh0aW1lLGJpbmQoaGlnaGxpZ2h0V29ya2VyLGNtKSk7fX0KZnVuY3Rpb24gaGlnaGxpZ2h0V29ya2VyKGNtKXt2YXIgZG9jPWNtLmRvYztpZihkb2MuaGlnaGxpZ2h0RnJvbnRpZXI+PWNtLmRpc3BsYXkudmlld1RvKXtyZXR1cm59CnZhciBlbmQ9K25ldyBEYXRlK2NtLm9wdGlvbnMud29ya1RpbWU7dmFyIGNvbnRleHQ9Z2V0Q29udGV4dEJlZm9yZShjbSxkb2MuaGlnaGxpZ2h0RnJvbnRpZXIpO3ZhciBjaGFuZ2VkTGluZXM9W107ZG9jLml0ZXIoY29udGV4dC5saW5lLE1hdGgubWluKGRvYy5maXJzdCtkb2Muc2l6ZSxjbS5kaXNwbGF5LnZpZXdUbys1MDApLGZ1bmN0aW9uKGxpbmUpe2lmKGNvbnRleHQubGluZT49Y20uZGlzcGxheS52aWV3RnJvbSl7dmFyIG9sZFN0eWxlcz1saW5lLnN0eWxlczt2YXIgcmVzZXRTdGF0ZT1saW5lLnRleHQubGVuZ3RoPmNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoP2NvcHlTdGF0ZShkb2MubW9kZSxjb250ZXh0LnN0YXRlKTpudWxsO3ZhciBoaWdobGlnaHRlZD1oaWdobGlnaHRMaW5lKGNtLGxpbmUsY29udGV4dCx0cnVlKTtpZihyZXNldFN0YXRlKXtjb250ZXh0LnN0YXRlPXJlc2V0U3RhdGU7fQpsaW5lLnN0eWxlcz1oaWdobGlnaHRlZC5zdHlsZXM7dmFyIG9sZENscz1saW5lLnN0eWxlQ2xhc3NlcyxuZXdDbHM9aGlnaGxpZ2h0ZWQuY2xhc3NlcztpZihuZXdDbHMpe2xpbmUuc3R5bGVDbGFzc2VzPW5ld0Nsczt9CmVsc2UgaWYob2xkQ2xzKXtsaW5lLnN0eWxlQ2xhc3Nlcz1udWxsO30KdmFyIGlzY2hhbmdlPSFvbGRTdHlsZXN8fG9sZFN0eWxlcy5sZW5ndGghPWxpbmUuc3R5bGVzLmxlbmd0aHx8b2xkQ2xzIT1uZXdDbHMmJighb2xkQ2xzfHwhbmV3Q2xzfHxvbGRDbHMuYmdDbGFzcyE9bmV3Q2xzLmJnQ2xhc3N8fG9sZENscy50ZXh0Q2xhc3MhPW5ld0Nscy50ZXh0Q2xhc3MpO2Zvcih2YXIgaT0wOyFpc2NoYW5nZSYmaTxvbGRTdHlsZXMubGVuZ3RoOysraSl7aXNjaGFuZ2U9b2xkU3R5bGVzW2ldIT1saW5lLnN0eWxlc1tpXTt9CmlmKGlzY2hhbmdlKXtjaGFuZ2VkTGluZXMucHVzaChjb250ZXh0LmxpbmUpO30KbGluZS5zdGF0ZUFmdGVyPWNvbnRleHQuc2F2ZSgpO2NvbnRleHQubmV4dExpbmUoKTt9ZWxzZXtpZihsaW5lLnRleHQubGVuZ3RoPD1jbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCkKe3Byb2Nlc3NMaW5lKGNtLGxpbmUudGV4dCxjb250ZXh0KTt9CmxpbmUuc3RhdGVBZnRlcj1jb250ZXh0LmxpbmUlNT09MD9jb250ZXh0LnNhdmUoKTpudWxsO2NvbnRleHQubmV4dExpbmUoKTt9CmlmKCtuZXcgRGF0ZT5lbmQpe3N0YXJ0V29ya2VyKGNtLGNtLm9wdGlvbnMud29ya0RlbGF5KTtyZXR1cm4gdHJ1ZX19KTtkb2MuaGlnaGxpZ2h0RnJvbnRpZXI9Y29udGV4dC5saW5lO2RvYy5tb2RlRnJvbnRpZXI9TWF0aC5tYXgoZG9jLm1vZGVGcm9udGllcixjb250ZXh0LmxpbmUpO2lmKGNoYW5nZWRMaW5lcy5sZW5ndGgpe3J1bkluT3AoY20sZnVuY3Rpb24oKXtmb3IodmFyIGk9MDtpPGNoYW5nZWRMaW5lcy5sZW5ndGg7aSsrKQp7cmVnTGluZUNoYW5nZShjbSxjaGFuZ2VkTGluZXNbaV0sInRleHQiKTt9fSk7fX0KdmFyIERpc3BsYXlVcGRhdGU9ZnVuY3Rpb24oY20sdmlld3BvcnQsZm9yY2Upe3ZhciBkaXNwbGF5PWNtLmRpc3BsYXk7dGhpcy52aWV3cG9ydD12aWV3cG9ydDt0aGlzLnZpc2libGU9dmlzaWJsZUxpbmVzKGRpc3BsYXksY20uZG9jLHZpZXdwb3J0KTt0aGlzLmVkaXRvcklzSGlkZGVuPSFkaXNwbGF5LndyYXBwZXIub2Zmc2V0V2lkdGg7dGhpcy53cmFwcGVySGVpZ2h0PWRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7dGhpcy53cmFwcGVyV2lkdGg9ZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoO3RoaXMub2xkRGlzcGxheVdpZHRoPWRpc3BsYXlXaWR0aChjbSk7dGhpcy5mb3JjZT1mb3JjZTt0aGlzLmRpbXM9Z2V0RGltZW5zaW9ucyhjbSk7dGhpcy5ldmVudHM9W107fTtEaXNwbGF5VXBkYXRlLnByb3RvdHlwZS5zaWduYWw9ZnVuY3Rpb24oZW1pdHRlcix0eXBlKXtpZihoYXNIYW5kbGVyKGVtaXR0ZXIsdHlwZSkpCnt0aGlzLmV2ZW50cy5wdXNoKGFyZ3VtZW50cyk7fX07RGlzcGxheVVwZGF0ZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO2Zvcih2YXIgaT0wO2k8dGhpcy5ldmVudHMubGVuZ3RoO2krKykKe3NpZ25hbC5hcHBseShudWxsLHRoaXMkMS5ldmVudHNbaV0pO319O2Z1bmN0aW9uIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pe3ZhciBkaXNwbGF5PWNtLmRpc3BsYXk7aWYoIWRpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQmJmRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGgpe2Rpc3BsYXkubmF0aXZlQmFyV2lkdGg9ZGlzcGxheS5zY3JvbGxlci5vZmZzZXRXaWR0aC1kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoO2Rpc3BsYXkuaGVpZ2h0Rm9yY2VyLnN0eWxlLmhlaWdodD1zY3JvbGxHYXAoY20pKyJweCI7ZGlzcGxheS5zaXplci5zdHlsZS5tYXJnaW5Cb3R0b209LWRpc3BsYXkubmF0aXZlQmFyV2lkdGgrInB4IjtkaXNwbGF5LnNpemVyLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGg9c2Nyb2xsR2FwKGNtKSsicHgiO2Rpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQ9dHJ1ZTt9fQpmdW5jdGlvbiBzZWxlY3Rpb25TbmFwc2hvdChjbSl7aWYoY20uaGFzRm9jdXMoKSl7cmV0dXJuIG51bGx9CnZhciBhY3RpdmU9YWN0aXZlRWx0KCk7aWYoIWFjdGl2ZXx8IWNvbnRhaW5zKGNtLmRpc3BsYXkubGluZURpdixhY3RpdmUpKXtyZXR1cm4gbnVsbH0KdmFyIHJlc3VsdD17YWN0aXZlRWx0OmFjdGl2ZX07aWYod2luZG93LmdldFNlbGVjdGlvbil7dmFyIHNlbD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoc2VsLmFuY2hvck5vZGUmJnNlbC5leHRlbmQmJmNvbnRhaW5zKGNtLmRpc3BsYXkubGluZURpdixzZWwuYW5jaG9yTm9kZSkpe3Jlc3VsdC5hbmNob3JOb2RlPXNlbC5hbmNob3JOb2RlO3Jlc3VsdC5hbmNob3JPZmZzZXQ9c2VsLmFuY2hvck9mZnNldDtyZXN1bHQuZm9jdXNOb2RlPXNlbC5mb2N1c05vZGU7cmVzdWx0LmZvY3VzT2Zmc2V0PXNlbC5mb2N1c09mZnNldDt9fQpyZXR1cm4gcmVzdWx0fQpmdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHNuYXBzaG90KXtpZighc25hcHNob3R8fCFzbmFwc2hvdC5hY3RpdmVFbHR8fHNuYXBzaG90LmFjdGl2ZUVsdD09YWN0aXZlRWx0KCkpe3JldHVybn0Kc25hcHNob3QuYWN0aXZlRWx0LmZvY3VzKCk7aWYoc25hcHNob3QuYW5jaG9yTm9kZSYmY29udGFpbnMoZG9jdW1lbnQuYm9keSxzbmFwc2hvdC5hbmNob3JOb2RlKSYmY29udGFpbnMoZG9jdW1lbnQuYm9keSxzbmFwc2hvdC5mb2N1c05vZGUpKXt2YXIgc2VsPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSxyYW5nZSQkMT1kb2N1bWVudC5jcmVhdGVSYW5nZSgpO3JhbmdlJCQxLnNldEVuZChzbmFwc2hvdC5hbmNob3JOb2RlLHNuYXBzaG90LmFuY2hvck9mZnNldCk7cmFuZ2UkJDEuY29sbGFwc2UoZmFsc2UpO3NlbC5yZW1vdmVBbGxSYW5nZXMoKTtzZWwuYWRkUmFuZ2UocmFuZ2UkJDEpO3NlbC5leHRlbmQoc25hcHNob3QuZm9jdXNOb2RlLHNuYXBzaG90LmZvY3VzT2Zmc2V0KTt9fQpmdW5jdGlvbiB1cGRhdGVEaXNwbGF5SWZOZWVkZWQoY20sdXBkYXRlKXt2YXIgZGlzcGxheT1jbS5kaXNwbGF5LGRvYz1jbS5kb2M7aWYodXBkYXRlLmVkaXRvcklzSGlkZGVuKXtyZXNldFZpZXcoY20pO3JldHVybiBmYWxzZX0KaWYoIXVwZGF0ZS5mb3JjZSYmdXBkYXRlLnZpc2libGUuZnJvbT49ZGlzcGxheS52aWV3RnJvbSYmdXBkYXRlLnZpc2libGUudG88PWRpc3BsYXkudmlld1RvJiYoZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycz09bnVsbHx8ZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycz49ZGlzcGxheS52aWV3VG8pJiZkaXNwbGF5LnJlbmRlcmVkVmlldz09ZGlzcGxheS52aWV3JiZjb3VudERpcnR5VmlldyhjbSk9PTApCntyZXR1cm4gZmFsc2V9CmlmKG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSl7cmVzZXRWaWV3KGNtKTt1cGRhdGUuZGltcz1nZXREaW1lbnNpb25zKGNtKTt9CnZhciBlbmQ9ZG9jLmZpcnN0K2RvYy5zaXplO3ZhciBmcm9tPU1hdGgubWF4KHVwZGF0ZS52aXNpYmxlLmZyb20tY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbixkb2MuZmlyc3QpO3ZhciB0bz1NYXRoLm1pbihlbmQsdXBkYXRlLnZpc2libGUudG8rY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbik7aWYoZGlzcGxheS52aWV3RnJvbTxmcm9tJiZmcm9tLWRpc3BsYXkudmlld0Zyb208MjApe2Zyb209TWF0aC5tYXgoZG9jLmZpcnN0LGRpc3BsYXkudmlld0Zyb20pO30KaWYoZGlzcGxheS52aWV3VG8+dG8mJmRpc3BsYXkudmlld1RvLXRvPDIwKXt0bz1NYXRoLm1pbihlbmQsZGlzcGxheS52aWV3VG8pO30KaWYoc2F3Q29sbGFwc2VkU3BhbnMpe2Zyb209dmlzdWFsTGluZU5vKGNtLmRvYyxmcm9tKTt0bz12aXN1YWxMaW5lRW5kTm8oY20uZG9jLHRvKTt9CnZhciBkaWZmZXJlbnQ9ZnJvbSE9ZGlzcGxheS52aWV3RnJvbXx8dG8hPWRpc3BsYXkudmlld1RvfHxkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0IT11cGRhdGUud3JhcHBlckhlaWdodHx8ZGlzcGxheS5sYXN0V3JhcFdpZHRoIT11cGRhdGUud3JhcHBlcldpZHRoO2FkanVzdFZpZXcoY20sZnJvbSx0byk7ZGlzcGxheS52aWV3T2Zmc2V0PWhlaWdodEF0TGluZShnZXRMaW5lKGNtLmRvYyxkaXNwbGF5LnZpZXdGcm9tKSk7Y20uZGlzcGxheS5tb3Zlci5zdHlsZS50b3A9ZGlzcGxheS52aWV3T2Zmc2V0KyJweCI7dmFyIHRvVXBkYXRlPWNvdW50RGlydHlWaWV3KGNtKTtpZighZGlmZmVyZW50JiZ0b1VwZGF0ZT09MCYmIXVwZGF0ZS5mb3JjZSYmZGlzcGxheS5yZW5kZXJlZFZpZXc9PWRpc3BsYXkudmlldyYmKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnM9PW51bGx8fGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnM+PWRpc3BsYXkudmlld1RvKSkKe3JldHVybiBmYWxzZX0KdmFyIHNlbFNuYXBzaG90PXNlbGVjdGlvblNuYXBzaG90KGNtKTtpZih0b1VwZGF0ZT40KXtkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheT0ibm9uZSI7fQpwYXRjaERpc3BsYXkoY20sZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyx1cGRhdGUuZGltcyk7aWYodG9VcGRhdGU+NCl7ZGlzcGxheS5saW5lRGl2LnN0eWxlLmRpc3BsYXk9IiI7fQpkaXNwbGF5LnJlbmRlcmVkVmlldz1kaXNwbGF5LnZpZXc7cmVzdG9yZVNlbGVjdGlvbihzZWxTbmFwc2hvdCk7cmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5jdXJzb3JEaXYpO3JlbW92ZUNoaWxkcmVuKGRpc3BsYXkuc2VsZWN0aW9uRGl2KTtkaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0PWRpc3BsYXkuc2l6ZXIuc3R5bGUubWluSGVpZ2h0PTA7aWYoZGlmZmVyZW50KXtkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0PXVwZGF0ZS53cmFwcGVySGVpZ2h0O2Rpc3BsYXkubGFzdFdyYXBXaWR0aD11cGRhdGUud3JhcHBlcldpZHRoO3N0YXJ0V29ya2VyKGNtLDQwMCk7fQpkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzPW51bGw7cmV0dXJuIHRydWV9CmZ1bmN0aW9uIHBvc3RVcGRhdGVEaXNwbGF5KGNtLHVwZGF0ZSl7dmFyIHZpZXdwb3J0PXVwZGF0ZS52aWV3cG9ydDtmb3IodmFyIGZpcnN0PXRydWU7O2ZpcnN0PWZhbHNlKXtpZighZmlyc3R8fCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZ3x8dXBkYXRlLm9sZERpc3BsYXlXaWR0aD09ZGlzcGxheVdpZHRoKGNtKSl7aWYodmlld3BvcnQmJnZpZXdwb3J0LnRvcCE9bnVsbCkKe3ZpZXdwb3J0PXt0b3A6TWF0aC5taW4oY20uZG9jLmhlaWdodCtwYWRkaW5nVmVydChjbS5kaXNwbGF5KS1kaXNwbGF5SGVpZ2h0KGNtKSx2aWV3cG9ydC50b3ApfTt9CnVwZGF0ZS52aXNpYmxlPXZpc2libGVMaW5lcyhjbS5kaXNwbGF5LGNtLmRvYyx2aWV3cG9ydCk7aWYodXBkYXRlLnZpc2libGUuZnJvbT49Y20uZGlzcGxheS52aWV3RnJvbSYmdXBkYXRlLnZpc2libGUudG88PWNtLmRpc3BsYXkudmlld1RvKQp7YnJlYWt9fQppZighdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLHVwZGF0ZSkpe2JyZWFrfQp1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7dmFyIGJhck1lYXN1cmU9bWVhc3VyZUZvclNjcm9sbGJhcnMoY20pO3VwZGF0ZVNlbGVjdGlvbihjbSk7dXBkYXRlU2Nyb2xsYmFycyhjbSxiYXJNZWFzdXJlKTtzZXREb2N1bWVudEhlaWdodChjbSxiYXJNZWFzdXJlKTt1cGRhdGUuZm9yY2U9ZmFsc2U7fQp1cGRhdGUuc2lnbmFsKGNtLCJ1cGRhdGUiLGNtKTtpZihjbS5kaXNwbGF5LnZpZXdGcm9tIT1jbS5kaXNwbGF5LnJlcG9ydGVkVmlld0Zyb218fGNtLmRpc3BsYXkudmlld1RvIT1jbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvKXt1cGRhdGUuc2lnbmFsKGNtLCJ2aWV3cG9ydENoYW5nZSIsY20sY20uZGlzcGxheS52aWV3RnJvbSxjbS5kaXNwbGF5LnZpZXdUbyk7Y20uZGlzcGxheS5yZXBvcnRlZFZpZXdGcm9tPWNtLmRpc3BsYXkudmlld0Zyb207Y20uZGlzcGxheS5yZXBvcnRlZFZpZXdUbz1jbS5kaXNwbGF5LnZpZXdUbzt9fQpmdW5jdGlvbiB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLHZpZXdwb3J0KXt2YXIgdXBkYXRlPW5ldyBEaXNwbGF5VXBkYXRlKGNtLHZpZXdwb3J0KTtpZih1cGRhdGVEaXNwbGF5SWZOZWVkZWQoY20sdXBkYXRlKSl7dXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pO3Bvc3RVcGRhdGVEaXNwbGF5KGNtLHVwZGF0ZSk7dmFyIGJhck1lYXN1cmU9bWVhc3VyZUZvclNjcm9sbGJhcnMoY20pO3VwZGF0ZVNlbGVjdGlvbihjbSk7dXBkYXRlU2Nyb2xsYmFycyhjbSxiYXJNZWFzdXJlKTtzZXREb2N1bWVudEhlaWdodChjbSxiYXJNZWFzdXJlKTt1cGRhdGUuZmluaXNoKCk7fX0KZnVuY3Rpb24gcGF0Y2hEaXNwbGF5KGNtLHVwZGF0ZU51bWJlcnNGcm9tLGRpbXMpe3ZhciBkaXNwbGF5PWNtLmRpc3BsYXksbGluZU51bWJlcnM9Y20ub3B0aW9ucy5saW5lTnVtYmVyczt2YXIgY29udGFpbmVyPWRpc3BsYXkubGluZURpdixjdXI9Y29udGFpbmVyLmZpcnN0Q2hpbGQ7ZnVuY3Rpb24gcm0obm9kZSl7dmFyIG5leHQ9bm9kZS5uZXh0U2libGluZztpZih3ZWJraXQmJm1hYyYmY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQ9PW5vZGUpCntub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiO30KZWxzZQp7bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO30KcmV0dXJuIG5leHR9CnZhciB2aWV3PWRpc3BsYXkudmlldyxsaW5lTj1kaXNwbGF5LnZpZXdGcm9tO2Zvcih2YXIgaT0wO2k8dmlldy5sZW5ndGg7aSsrKXt2YXIgbGluZVZpZXc9dmlld1tpXTtpZihsaW5lVmlldy5oaWRkZW4pe31lbHNlIGlmKCFsaW5lVmlldy5ub2RlfHxsaW5lVmlldy5ub2RlLnBhcmVudE5vZGUhPWNvbnRhaW5lcil7dmFyIG5vZGU9YnVpbGRMaW5lRWxlbWVudChjbSxsaW5lVmlldyxsaW5lTixkaW1zKTtjb250YWluZXIuaW5zZXJ0QmVmb3JlKG5vZGUsY3VyKTt9ZWxzZXt3aGlsZShjdXIhPWxpbmVWaWV3Lm5vZGUpe2N1cj1ybShjdXIpO30KdmFyIHVwZGF0ZU51bWJlcj1saW5lTnVtYmVycyYmdXBkYXRlTnVtYmVyc0Zyb20hPW51bGwmJnVwZGF0ZU51bWJlcnNGcm9tPD1saW5lTiYmbGluZVZpZXcubGluZU51bWJlcjtpZihsaW5lVmlldy5jaGFuZ2VzKXtpZihpbmRleE9mKGxpbmVWaWV3LmNoYW5nZXMsImd1dHRlciIpPi0xKXt1cGRhdGVOdW1iZXI9ZmFsc2U7fQp1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSxsaW5lVmlldyxsaW5lTixkaW1zKTt9CmlmKHVwZGF0ZU51bWJlcil7cmVtb3ZlQ2hpbGRyZW4obGluZVZpZXcubGluZU51bWJlcik7bGluZVZpZXcubGluZU51bWJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsbGluZU4pKSk7fQpjdXI9bGluZVZpZXcubm9kZS5uZXh0U2libGluZzt9CmxpbmVOKz1saW5lVmlldy5zaXplO30Kd2hpbGUoY3VyKXtjdXI9cm0oY3VyKTt9fQpmdW5jdGlvbiB1cGRhdGVHdXR0ZXJTcGFjZShjbSl7dmFyIHdpZHRoPWNtLmRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDtjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQ9d2lkdGgrInB4Ijt9CmZ1bmN0aW9uIHNldERvY3VtZW50SGVpZ2h0KGNtLG1lYXN1cmUpe2NtLmRpc3BsYXkuc2l6ZXIuc3R5bGUubWluSGVpZ2h0PW1lYXN1cmUuZG9jSGVpZ2h0KyJweCI7Y20uZGlzcGxheS5oZWlnaHRGb3JjZXIuc3R5bGUudG9wPW1lYXN1cmUuZG9jSGVpZ2h0KyJweCI7Y20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmhlaWdodD0obWVhc3VyZS5kb2NIZWlnaHQrY20uZGlzcGxheS5iYXJIZWlnaHQrc2Nyb2xsR2FwKGNtKSkrInB4Ijt9CmZ1bmN0aW9uIHVwZGF0ZUd1dHRlcnMoY20pe3ZhciBndXR0ZXJzPWNtLmRpc3BsYXkuZ3V0dGVycyxzcGVjcz1jbS5vcHRpb25zLmd1dHRlcnM7cmVtb3ZlQ2hpbGRyZW4oZ3V0dGVycyk7dmFyIGk9MDtmb3IoO2k8c3BlY3MubGVuZ3RoOysraSl7dmFyIGd1dHRlckNsYXNzPXNwZWNzW2ldO3ZhciBnRWx0PWd1dHRlcnMuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLG51bGwsIkNvZGVNaXJyb3ItZ3V0dGVyICIrZ3V0dGVyQ2xhc3MpKTtpZihndXR0ZXJDbGFzcz09IkNvZGVNaXJyb3ItbGluZW51bWJlcnMiKXtjbS5kaXNwbGF5LmxpbmVHdXR0ZXI9Z0VsdDtnRWx0LnN0eWxlLndpZHRoPShjbS5kaXNwbGF5LmxpbmVOdW1XaWR0aHx8MSkrInB4Ijt9fQpndXR0ZXJzLnN0eWxlLmRpc3BsYXk9aT8iIjoibm9uZSI7dXBkYXRlR3V0dGVyU3BhY2UoY20pO30KZnVuY3Rpb24gc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKG9wdGlvbnMpe3ZhciBmb3VuZD1pbmRleE9mKG9wdGlvbnMuZ3V0dGVycywiQ29kZU1pcnJvci1saW5lbnVtYmVycyIpO2lmKGZvdW5kPT0tMSYmb3B0aW9ucy5saW5lTnVtYmVycyl7b3B0aW9ucy5ndXR0ZXJzPW9wdGlvbnMuZ3V0dGVycy5jb25jYXQoWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pO31lbHNlIGlmKGZvdW5kPi0xJiYhb3B0aW9ucy5saW5lTnVtYmVycyl7b3B0aW9ucy5ndXR0ZXJzPW9wdGlvbnMuZ3V0dGVycy5zbGljZSgwKTtvcHRpb25zLmd1dHRlcnMuc3BsaWNlKGZvdW5kLDEpO319CnZhciB3aGVlbFNhbXBsZXM9MDt2YXIgd2hlZWxQaXhlbHNQZXJVbml0PW51bGw7aWYoaWUpe3doZWVsUGl4ZWxzUGVyVW5pdD0tLjUzO30KZWxzZSBpZihnZWNrbyl7d2hlZWxQaXhlbHNQZXJVbml0PTE1O30KZWxzZSBpZihjaHJvbWUpe3doZWVsUGl4ZWxzUGVyVW5pdD0tLjc7fQplbHNlIGlmKHNhZmFyaSl7d2hlZWxQaXhlbHNQZXJVbml0PS0xLzM7fQpmdW5jdGlvbiB3aGVlbEV2ZW50RGVsdGEoZSl7dmFyIGR4PWUud2hlZWxEZWx0YVgsZHk9ZS53aGVlbERlbHRhWTtpZihkeD09bnVsbCYmZS5kZXRhaWwmJmUuYXhpcz09ZS5IT1JJWk9OVEFMX0FYSVMpe2R4PWUuZGV0YWlsO30KaWYoZHk9PW51bGwmJmUuZGV0YWlsJiZlLmF4aXM9PWUuVkVSVElDQUxfQVhJUyl7ZHk9ZS5kZXRhaWw7fQplbHNlIGlmKGR5PT1udWxsKXtkeT1lLndoZWVsRGVsdGE7fQpyZXR1cm57eDpkeCx5OmR5fX0KZnVuY3Rpb24gd2hlZWxFdmVudFBpeGVscyhlKXt2YXIgZGVsdGE9d2hlZWxFdmVudERlbHRhKGUpO2RlbHRhLngqPXdoZWVsUGl4ZWxzUGVyVW5pdDtkZWx0YS55Kj13aGVlbFBpeGVsc1BlclVuaXQ7cmV0dXJuIGRlbHRhfQpmdW5jdGlvbiBvblNjcm9sbFdoZWVsKGNtLGUpe3ZhciBkZWx0YT13aGVlbEV2ZW50RGVsdGEoZSksZHg9ZGVsdGEueCxkeT1kZWx0YS55O3ZhciBkaXNwbGF5PWNtLmRpc3BsYXksc2Nyb2xsPWRpc3BsYXkuc2Nyb2xsZXI7dmFyIGNhblNjcm9sbFg9c2Nyb2xsLnNjcm9sbFdpZHRoPnNjcm9sbC5jbGllbnRXaWR0aDt2YXIgY2FuU2Nyb2xsWT1zY3JvbGwuc2Nyb2xsSGVpZ2h0PnNjcm9sbC5jbGllbnRIZWlnaHQ7aWYoIShkeCYmY2FuU2Nyb2xsWHx8ZHkmJmNhblNjcm9sbFkpKXtyZXR1cm59CmlmKGR5JiZtYWMmJndlYmtpdCl7b3V0ZXI6Zm9yKHZhciBjdXI9ZS50YXJnZXQsdmlldz1kaXNwbGF5LnZpZXc7Y3VyIT1zY3JvbGw7Y3VyPWN1ci5wYXJlbnROb2RlKXtmb3IodmFyIGk9MDtpPHZpZXcubGVuZ3RoO2krKyl7aWYodmlld1tpXS5ub2RlPT1jdXIpe2NtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0PWN1cjticmVhayBvdXRlcn19fX0KaWYoZHgmJiFnZWNrbyYmIXByZXN0byYmd2hlZWxQaXhlbHNQZXJVbml0IT1udWxsKXtpZihkeSYmY2FuU2Nyb2xsWSkKe3VwZGF0ZVNjcm9sbFRvcChjbSxNYXRoLm1heCgwLHNjcm9sbC5zY3JvbGxUb3ArZHkqd2hlZWxQaXhlbHNQZXJVbml0KSk7fQpzZXRTY3JvbGxMZWZ0KGNtLE1hdGgubWF4KDAsc2Nyb2xsLnNjcm9sbExlZnQrZHgqd2hlZWxQaXhlbHNQZXJVbml0KSk7aWYoIWR5fHwoZHkmJmNhblNjcm9sbFkpKQp7ZV9wcmV2ZW50RGVmYXVsdChlKTt9CmRpc3BsYXkud2hlZWxTdGFydFg9bnVsbDtyZXR1cm59CmlmKGR5JiZ3aGVlbFBpeGVsc1BlclVuaXQhPW51bGwpe3ZhciBwaXhlbHM9ZHkqd2hlZWxQaXhlbHNQZXJVbml0O3ZhciB0b3A9Y20uZG9jLnNjcm9sbFRvcCxib3Q9dG9wK2Rpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7aWYocGl4ZWxzPDApe3RvcD1NYXRoLm1heCgwLHRvcCtwaXhlbHMtNTApO30KZWxzZXtib3Q9TWF0aC5taW4oY20uZG9jLmhlaWdodCxib3QrcGl4ZWxzKzUwKTt9CnVwZGF0ZURpc3BsYXlTaW1wbGUoY20se3RvcDp0b3AsYm90dG9tOmJvdH0pO30KaWYod2hlZWxTYW1wbGVzPDIwKXtpZihkaXNwbGF5LndoZWVsU3RhcnRYPT1udWxsKXtkaXNwbGF5LndoZWVsU3RhcnRYPXNjcm9sbC5zY3JvbGxMZWZ0O2Rpc3BsYXkud2hlZWxTdGFydFk9c2Nyb2xsLnNjcm9sbFRvcDtkaXNwbGF5LndoZWVsRFg9ZHg7ZGlzcGxheS53aGVlbERZPWR5O3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihkaXNwbGF5LndoZWVsU3RhcnRYPT1udWxsKXtyZXR1cm59CnZhciBtb3ZlZFg9c2Nyb2xsLnNjcm9sbExlZnQtZGlzcGxheS53aGVlbFN0YXJ0WDt2YXIgbW92ZWRZPXNjcm9sbC5zY3JvbGxUb3AtZGlzcGxheS53aGVlbFN0YXJ0WTt2YXIgc2FtcGxlPShtb3ZlZFkmJmRpc3BsYXkud2hlZWxEWSYmbW92ZWRZL2Rpc3BsYXkud2hlZWxEWSl8fChtb3ZlZFgmJmRpc3BsYXkud2hlZWxEWCYmbW92ZWRYL2Rpc3BsYXkud2hlZWxEWCk7ZGlzcGxheS53aGVlbFN0YXJ0WD1kaXNwbGF5LndoZWVsU3RhcnRZPW51bGw7aWYoIXNhbXBsZSl7cmV0dXJufQp3aGVlbFBpeGVsc1BlclVuaXQ9KHdoZWVsUGl4ZWxzUGVyVW5pdCp3aGVlbFNhbXBsZXMrc2FtcGxlKS8od2hlZWxTYW1wbGVzKzEpOysrd2hlZWxTYW1wbGVzO30sMjAwKTt9ZWxzZXtkaXNwbGF5LndoZWVsRFgrPWR4O2Rpc3BsYXkud2hlZWxEWSs9ZHk7fX19CnZhciBTZWxlY3Rpb249ZnVuY3Rpb24ocmFuZ2VzLHByaW1JbmRleCl7dGhpcy5yYW5nZXM9cmFuZ2VzO3RoaXMucHJpbUluZGV4PXByaW1JbmRleDt9O1NlbGVjdGlvbi5wcm90b3R5cGUucHJpbWFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmdlc1t0aGlzLnByaW1JbmRleF19O1NlbGVjdGlvbi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKG90aGVyKXt2YXIgdGhpcyQxPXRoaXM7aWYob3RoZXI9PXRoaXMpe3JldHVybiB0cnVlfQppZihvdGhlci5wcmltSW5kZXghPXRoaXMucHJpbUluZGV4fHxvdGhlci5yYW5nZXMubGVuZ3RoIT10aGlzLnJhbmdlcy5sZW5ndGgpe3JldHVybiBmYWxzZX0KZm9yKHZhciBpPTA7aTx0aGlzLnJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgaGVyZT10aGlzJDEucmFuZ2VzW2ldLHRoZXJlPW90aGVyLnJhbmdlc1tpXTtpZighZXF1YWxDdXJzb3JQb3MoaGVyZS5hbmNob3IsdGhlcmUuYW5jaG9yKXx8IWVxdWFsQ3Vyc29yUG9zKGhlcmUuaGVhZCx0aGVyZS5oZWFkKSl7cmV0dXJuIGZhbHNlfX0KcmV0dXJuIHRydWV9O1NlbGVjdGlvbi5wcm90b3R5cGUuZGVlcENvcHk9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG91dD1bXTtmb3IodmFyIGk9MDtpPHRoaXMucmFuZ2VzLmxlbmd0aDtpKyspCntvdXRbaV09bmV3IFJhbmdlKGNvcHlQb3ModGhpcyQxLnJhbmdlc1tpXS5hbmNob3IpLGNvcHlQb3ModGhpcyQxLnJhbmdlc1tpXS5oZWFkKSk7fQpyZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsdGhpcy5wcmltSW5kZXgpfTtTZWxlY3Rpb24ucHJvdG90eXBlLnNvbWV0aGluZ1NlbGVjdGVkPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO2Zvcih2YXIgaT0wO2k8dGhpcy5yYW5nZXMubGVuZ3RoO2krKykKe2lmKCF0aGlzJDEucmFuZ2VzW2ldLmVtcHR5KCkpe3JldHVybiB0cnVlfX0KcmV0dXJuIGZhbHNlfTtTZWxlY3Rpb24ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHBvcyxlbmQpe3ZhciB0aGlzJDE9dGhpcztpZighZW5kKXtlbmQ9cG9zO30KZm9yKHZhciBpPTA7aTx0aGlzLnJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgcmFuZ2U9dGhpcyQxLnJhbmdlc1tpXTtpZihjbXAoZW5kLHJhbmdlLmZyb20oKSk+PTAmJmNtcChwb3MscmFuZ2UudG8oKSk8PTApCntyZXR1cm4gaX19CnJldHVybi0xfTt2YXIgUmFuZ2U9ZnVuY3Rpb24oYW5jaG9yLGhlYWQpe3RoaXMuYW5jaG9yPWFuY2hvcjt0aGlzLmhlYWQ9aGVhZDt9O1JhbmdlLnByb3RvdHlwZS5mcm9tPWZ1bmN0aW9uKCl7cmV0dXJuIG1pblBvcyh0aGlzLmFuY2hvcix0aGlzLmhlYWQpfTtSYW5nZS5wcm90b3R5cGUudG89ZnVuY3Rpb24oKXtyZXR1cm4gbWF4UG9zKHRoaXMuYW5jaG9yLHRoaXMuaGVhZCl9O1JhbmdlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWQubGluZT09dGhpcy5hbmNob3IubGluZSYmdGhpcy5oZWFkLmNoPT10aGlzLmFuY2hvci5jaH07ZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcyxwcmltSW5kZXgpe3ZhciBwcmltPXJhbmdlc1twcmltSW5kZXhdO3Jhbmdlcy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGNtcChhLmZyb20oKSxiLmZyb20oKSk7fSk7cHJpbUluZGV4PWluZGV4T2YocmFuZ2VzLHByaW0pO2Zvcih2YXIgaT0xO2k8cmFuZ2VzLmxlbmd0aDtpKyspe3ZhciBjdXI9cmFuZ2VzW2ldLHByZXY9cmFuZ2VzW2ktMV07aWYoY21wKHByZXYudG8oKSxjdXIuZnJvbSgpKT49MCl7dmFyIGZyb209bWluUG9zKHByZXYuZnJvbSgpLGN1ci5mcm9tKCkpLHRvPW1heFBvcyhwcmV2LnRvKCksY3VyLnRvKCkpO3ZhciBpbnY9cHJldi5lbXB0eSgpP2N1ci5mcm9tKCk9PWN1ci5oZWFkOnByZXYuZnJvbSgpPT1wcmV2LmhlYWQ7aWYoaTw9cHJpbUluZGV4KXstLXByaW1JbmRleDt9CnJhbmdlcy5zcGxpY2UoLS1pLDIsbmV3IFJhbmdlKGludj90bzpmcm9tLGludj9mcm9tOnRvKSk7fX0KcmV0dXJuIG5ldyBTZWxlY3Rpb24ocmFuZ2VzLHByaW1JbmRleCl9CmZ1bmN0aW9uIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsaGVhZCl7cmV0dXJuIG5ldyBTZWxlY3Rpb24oW25ldyBSYW5nZShhbmNob3IsaGVhZHx8YW5jaG9yKV0sMCl9CmZ1bmN0aW9uIGNoYW5nZUVuZChjaGFuZ2Upe2lmKCFjaGFuZ2UudGV4dCl7cmV0dXJuIGNoYW5nZS50b30KcmV0dXJuIFBvcyhjaGFuZ2UuZnJvbS5saW5lK2NoYW5nZS50ZXh0Lmxlbmd0aC0xLGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoKyhjaGFuZ2UudGV4dC5sZW5ndGg9PTE/Y2hhbmdlLmZyb20uY2g6MCkpfQpmdW5jdGlvbiBhZGp1c3RGb3JDaGFuZ2UocG9zLGNoYW5nZSl7aWYoY21wKHBvcyxjaGFuZ2UuZnJvbSk8MCl7cmV0dXJuIHBvc30KaWYoY21wKHBvcyxjaGFuZ2UudG8pPD0wKXtyZXR1cm4gY2hhbmdlRW5kKGNoYW5nZSl9CnZhciBsaW5lPXBvcy5saW5lK2NoYW5nZS50ZXh0Lmxlbmd0aC0oY2hhbmdlLnRvLmxpbmUtY2hhbmdlLmZyb20ubGluZSktMSxjaD1wb3MuY2g7aWYocG9zLmxpbmU9PWNoYW5nZS50by5saW5lKXtjaCs9Y2hhbmdlRW5kKGNoYW5nZSkuY2gtY2hhbmdlLnRvLmNoO30KcmV0dXJuIFBvcyhsaW5lLGNoKX0KZnVuY3Rpb24gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYyxjaGFuZ2Upe3ZhciBvdXQ9W107Zm9yKHZhciBpPTA7aTxkb2Muc2VsLnJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgcmFuZ2U9ZG9jLnNlbC5yYW5nZXNbaV07b3V0LnB1c2gobmV3IFJhbmdlKGFkanVzdEZvckNoYW5nZShyYW5nZS5hbmNob3IsY2hhbmdlKSxhZGp1c3RGb3JDaGFuZ2UocmFuZ2UuaGVhZCxjaGFuZ2UpKSk7fQpyZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKG91dCxkb2Muc2VsLnByaW1JbmRleCl9CmZ1bmN0aW9uIG9mZnNldFBvcyhwb3Msb2xkLG53KXtpZihwb3MubGluZT09b2xkLmxpbmUpCntyZXR1cm4gUG9zKG53LmxpbmUscG9zLmNoLW9sZC5jaCtudy5jaCl9CmVsc2UKe3JldHVybiBQb3MobncubGluZSsocG9zLmxpbmUtb2xkLmxpbmUpLHBvcy5jaCl9fQpmdW5jdGlvbiBjb21wdXRlUmVwbGFjZWRTZWwoZG9jLGNoYW5nZXMsaGludCl7dmFyIG91dD1bXTt2YXIgb2xkUHJldj1Qb3MoZG9jLmZpcnN0LDApLG5ld1ByZXY9b2xkUHJldjtmb3IodmFyIGk9MDtpPGNoYW5nZXMubGVuZ3RoO2krKyl7dmFyIGNoYW5nZT1jaGFuZ2VzW2ldO3ZhciBmcm9tPW9mZnNldFBvcyhjaGFuZ2UuZnJvbSxvbGRQcmV2LG5ld1ByZXYpO3ZhciB0bz1vZmZzZXRQb3MoY2hhbmdlRW5kKGNoYW5nZSksb2xkUHJldixuZXdQcmV2KTtvbGRQcmV2PWNoYW5nZS50bztuZXdQcmV2PXRvO2lmKGhpbnQ9PSJhcm91bmQiKXt2YXIgcmFuZ2U9ZG9jLnNlbC5yYW5nZXNbaV0saW52PWNtcChyYW5nZS5oZWFkLHJhbmdlLmFuY2hvcik8MDtvdXRbaV09bmV3IFJhbmdlKGludj90bzpmcm9tLGludj9mcm9tOnRvKTt9ZWxzZXtvdXRbaV09bmV3IFJhbmdlKGZyb20sZnJvbSk7fX0KcmV0dXJuIG5ldyBTZWxlY3Rpb24ob3V0LGRvYy5zZWwucHJpbUluZGV4KX0KZnVuY3Rpb24gbG9hZE1vZGUoY20pe2NtLmRvYy5tb2RlPWdldE1vZGUoY20ub3B0aW9ucyxjbS5kb2MubW9kZU9wdGlvbik7cmVzZXRNb2RlU3RhdGUoY20pO30KZnVuY3Rpb24gcmVzZXRNb2RlU3RhdGUoY20pe2NtLmRvYy5pdGVyKGZ1bmN0aW9uKGxpbmUpe2lmKGxpbmUuc3RhdGVBZnRlcil7bGluZS5zdGF0ZUFmdGVyPW51bGw7fQppZihsaW5lLnN0eWxlcyl7bGluZS5zdHlsZXM9bnVsbDt9fSk7Y20uZG9jLm1vZGVGcm9udGllcj1jbS5kb2MuaGlnaGxpZ2h0RnJvbnRpZXI9Y20uZG9jLmZpcnN0O3N0YXJ0V29ya2VyKGNtLDEwMCk7Y20uc3RhdGUubW9kZUdlbisrO2lmKGNtLmN1ck9wKXtyZWdDaGFuZ2UoY20pO319CmZ1bmN0aW9uIGlzV2hvbGVMaW5lVXBkYXRlKGRvYyxjaGFuZ2Upe3JldHVybiBjaGFuZ2UuZnJvbS5jaD09MCYmY2hhbmdlLnRvLmNoPT0wJiZsc3QoY2hhbmdlLnRleHQpPT0iIiYmKCFkb2MuY218fGRvYy5jbS5vcHRpb25zLndob2xlTGluZVVwZGF0ZUJlZm9yZSl9CmZ1bmN0aW9uIHVwZGF0ZURvYyhkb2MsY2hhbmdlLG1hcmtlZFNwYW5zLGVzdGltYXRlSGVpZ2h0JCQxKXtmdW5jdGlvbiBzcGFuc0ZvcihuKXtyZXR1cm4gbWFya2VkU3BhbnM/bWFya2VkU3BhbnNbbl06bnVsbH0KZnVuY3Rpb24gdXBkYXRlKGxpbmUsdGV4dCxzcGFucyl7dXBkYXRlTGluZShsaW5lLHRleHQsc3BhbnMsZXN0aW1hdGVIZWlnaHQkJDEpO3NpZ25hbExhdGVyKGxpbmUsImNoYW5nZSIsbGluZSxjaGFuZ2UpO30KZnVuY3Rpb24gbGluZXNGb3Ioc3RhcnQsZW5kKXt2YXIgcmVzdWx0PVtdO2Zvcih2YXIgaT1zdGFydDtpPGVuZDsrK2kpCntyZXN1bHQucHVzaChuZXcgTGluZSh0ZXh0W2ldLHNwYW5zRm9yKGkpLGVzdGltYXRlSGVpZ2h0JCQxKSk7fQpyZXR1cm4gcmVzdWx0fQp2YXIgZnJvbT1jaGFuZ2UuZnJvbSx0bz1jaGFuZ2UudG8sdGV4dD1jaGFuZ2UudGV4dDt2YXIgZmlyc3RMaW5lPWdldExpbmUoZG9jLGZyb20ubGluZSksbGFzdExpbmU9Z2V0TGluZShkb2MsdG8ubGluZSk7dmFyIGxhc3RUZXh0PWxzdCh0ZXh0KSxsYXN0U3BhbnM9c3BhbnNGb3IodGV4dC5sZW5ndGgtMSksbmxpbmVzPXRvLmxpbmUtZnJvbS5saW5lO2lmKGNoYW5nZS5mdWxsKXtkb2MuaW5zZXJ0KDAsbGluZXNGb3IoMCx0ZXh0Lmxlbmd0aCkpO2RvYy5yZW1vdmUodGV4dC5sZW5ndGgsZG9jLnNpemUtdGV4dC5sZW5ndGgpO31lbHNlIGlmKGlzV2hvbGVMaW5lVXBkYXRlKGRvYyxjaGFuZ2UpKXt2YXIgYWRkZWQ9bGluZXNGb3IoMCx0ZXh0Lmxlbmd0aC0xKTt1cGRhdGUobGFzdExpbmUsbGFzdExpbmUudGV4dCxsYXN0U3BhbnMpO2lmKG5saW5lcyl7ZG9jLnJlbW92ZShmcm9tLmxpbmUsbmxpbmVzKTt9CmlmKGFkZGVkLmxlbmd0aCl7ZG9jLmluc2VydChmcm9tLmxpbmUsYWRkZWQpO319ZWxzZSBpZihmaXJzdExpbmU9PWxhc3RMaW5lKXtpZih0ZXh0Lmxlbmd0aD09MSl7dXBkYXRlKGZpcnN0TGluZSxmaXJzdExpbmUudGV4dC5zbGljZSgwLGZyb20uY2gpK2xhc3RUZXh0K2ZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSxsYXN0U3BhbnMpO31lbHNle3ZhciBhZGRlZCQxPWxpbmVzRm9yKDEsdGV4dC5sZW5ndGgtMSk7YWRkZWQkMS5wdXNoKG5ldyBMaW5lKGxhc3RUZXh0K2ZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSxsYXN0U3BhbnMsZXN0aW1hdGVIZWlnaHQkJDEpKTt1cGRhdGUoZmlyc3RMaW5lLGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsZnJvbS5jaCkrdGV4dFswXSxzcGFuc0ZvcigwKSk7ZG9jLmluc2VydChmcm9tLmxpbmUrMSxhZGRlZCQxKTt9fWVsc2UgaWYodGV4dC5sZW5ndGg9PTEpe3VwZGF0ZShmaXJzdExpbmUsZmlyc3RMaW5lLnRleHQuc2xpY2UoMCxmcm9tLmNoKSt0ZXh0WzBdK2xhc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLHNwYW5zRm9yKDApKTtkb2MucmVtb3ZlKGZyb20ubGluZSsxLG5saW5lcyk7fWVsc2V7dXBkYXRlKGZpcnN0TGluZSxmaXJzdExpbmUudGV4dC5zbGljZSgwLGZyb20uY2gpK3RleHRbMF0sc3BhbnNGb3IoMCkpO3VwZGF0ZShsYXN0TGluZSxsYXN0VGV4dCtsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSxsYXN0U3BhbnMpO3ZhciBhZGRlZCQyPWxpbmVzRm9yKDEsdGV4dC5sZW5ndGgtMSk7aWYobmxpbmVzPjEpe2RvYy5yZW1vdmUoZnJvbS5saW5lKzEsbmxpbmVzLTEpO30KZG9jLmluc2VydChmcm9tLmxpbmUrMSxhZGRlZCQyKTt9CnNpZ25hbExhdGVyKGRvYywiY2hhbmdlIixkb2MsY2hhbmdlKTt9CmZ1bmN0aW9uIGxpbmtlZERvY3MoZG9jLGYsc2hhcmVkSGlzdE9ubHkpe2Z1bmN0aW9uIHByb3BhZ2F0ZShkb2Msc2tpcCxzaGFyZWRIaXN0KXtpZihkb2MubGlua2VkKXtmb3IodmFyIGk9MDtpPGRvYy5saW5rZWQubGVuZ3RoOysraSl7dmFyIHJlbD1kb2MubGlua2VkW2ldO2lmKHJlbC5kb2M9PXNraXApe2NvbnRpbnVlfQp2YXIgc2hhcmVkPXNoYXJlZEhpc3QmJnJlbC5zaGFyZWRIaXN0O2lmKHNoYXJlZEhpc3RPbmx5JiYhc2hhcmVkKXtjb250aW51ZX0KZihyZWwuZG9jLHNoYXJlZCk7cHJvcGFnYXRlKHJlbC5kb2MsZG9jLHNoYXJlZCk7fX19CnByb3BhZ2F0ZShkb2MsbnVsbCx0cnVlKTt9CmZ1bmN0aW9uIGF0dGFjaERvYyhjbSxkb2Mpe2lmKGRvYy5jbSl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIGRvY3VtZW50IGlzIGFscmVhZHkgaW4gdXNlLiIpfQpjbS5kb2M9ZG9jO2RvYy5jbT1jbTtlc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKTtsb2FkTW9kZShjbSk7c2V0RGlyZWN0aW9uQ2xhc3MoY20pO2lmKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyl7ZmluZE1heExpbmUoY20pO30KY20ub3B0aW9ucy5tb2RlPWRvYy5tb2RlT3B0aW9uO3JlZ0NoYW5nZShjbSk7fQpmdW5jdGlvbiBzZXREaXJlY3Rpb25DbGFzcyhjbSl7KGNtLmRvYy5kaXJlY3Rpb249PSJydGwiP2FkZENsYXNzOnJtQ2xhc3MpKGNtLmRpc3BsYXkubGluZURpdiwiQ29kZU1pcnJvci1ydGwiKTt9CmZ1bmN0aW9uIGRpcmVjdGlvbkNoYW5nZWQoY20pe3J1bkluT3AoY20sZnVuY3Rpb24oKXtzZXREaXJlY3Rpb25DbGFzcyhjbSk7cmVnQ2hhbmdlKGNtKTt9KTt9CmZ1bmN0aW9uIEhpc3Rvcnkoc3RhcnRHZW4pe3RoaXMuZG9uZT1bXTt0aGlzLnVuZG9uZT1bXTt0aGlzLnVuZG9EZXB0aD1JbmZpbml0eTt0aGlzLmxhc3RNb2RUaW1lPXRoaXMubGFzdFNlbFRpbWU9MDt0aGlzLmxhc3RPcD10aGlzLmxhc3RTZWxPcD1udWxsO3RoaXMubGFzdE9yaWdpbj10aGlzLmxhc3RTZWxPcmlnaW49bnVsbDt0aGlzLmdlbmVyYXRpb249dGhpcy5tYXhHZW5lcmF0aW9uPXN0YXJ0R2VufHwxO30KZnVuY3Rpb24gaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLGNoYW5nZSl7dmFyIGhpc3RDaGFuZ2U9e2Zyb206Y29weVBvcyhjaGFuZ2UuZnJvbSksdG86Y2hhbmdlRW5kKGNoYW5nZSksdGV4dDpnZXRCZXR3ZWVuKGRvYyxjaGFuZ2UuZnJvbSxjaGFuZ2UudG8pfTthdHRhY2hMb2NhbFNwYW5zKGRvYyxoaXN0Q2hhbmdlLGNoYW5nZS5mcm9tLmxpbmUsY2hhbmdlLnRvLmxpbmUrMSk7bGlua2VkRG9jcyhkb2MsZnVuY3Rpb24oZG9jKXtyZXR1cm4gYXR0YWNoTG9jYWxTcGFucyhkb2MsaGlzdENoYW5nZSxjaGFuZ2UuZnJvbS5saW5lLGNoYW5nZS50by5saW5lKzEpO30sdHJ1ZSk7cmV0dXJuIGhpc3RDaGFuZ2V9CmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uRXZlbnRzKGFycmF5KXt3aGlsZShhcnJheS5sZW5ndGgpe3ZhciBsYXN0PWxzdChhcnJheSk7aWYobGFzdC5yYW5nZXMpe2FycmF5LnBvcCgpO30KZWxzZXticmVha319fQpmdW5jdGlvbiBsYXN0Q2hhbmdlRXZlbnQoaGlzdCxmb3JjZSl7aWYoZm9yY2Upe2NsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QuZG9uZSk7cmV0dXJuIGxzdChoaXN0LmRvbmUpfWVsc2UgaWYoaGlzdC5kb25lLmxlbmd0aCYmIWxzdChoaXN0LmRvbmUpLnJhbmdlcyl7cmV0dXJuIGxzdChoaXN0LmRvbmUpfWVsc2UgaWYoaGlzdC5kb25lLmxlbmd0aD4xJiYhaGlzdC5kb25lW2hpc3QuZG9uZS5sZW5ndGgtMl0ucmFuZ2VzKXtoaXN0LmRvbmUucG9wKCk7cmV0dXJuIGxzdChoaXN0LmRvbmUpfX0KZnVuY3Rpb24gYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYyxjaGFuZ2Usc2VsQWZ0ZXIsb3BJZCl7dmFyIGhpc3Q9ZG9jLmhpc3Rvcnk7aGlzdC51bmRvbmUubGVuZ3RoPTA7dmFyIHRpbWU9K25ldyBEYXRlLGN1cjt2YXIgbGFzdDtpZigoaGlzdC5sYXN0T3A9PW9wSWR8fGhpc3QubGFzdE9yaWdpbj09Y2hhbmdlLm9yaWdpbiYmY2hhbmdlLm9yaWdpbiYmKChjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKT09IisiJiZkb2MuY20mJmhpc3QubGFzdE1vZFRpbWU+dGltZS1kb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSl8fGNoYW5nZS5vcmlnaW4uY2hhckF0KDApPT0iKiIpKSYmKGN1cj1sYXN0Q2hhbmdlRXZlbnQoaGlzdCxoaXN0Lmxhc3RPcD09b3BJZCkpKXtsYXN0PWxzdChjdXIuY2hhbmdlcyk7aWYoY21wKGNoYW5nZS5mcm9tLGNoYW5nZS50byk9PTAmJmNtcChjaGFuZ2UuZnJvbSxsYXN0LnRvKT09MCl7bGFzdC50bz1jaGFuZ2VFbmQoY2hhbmdlKTt9ZWxzZXtjdXIuY2hhbmdlcy5wdXNoKGhpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYyxjaGFuZ2UpKTt9fWVsc2V7dmFyIGJlZm9yZT1sc3QoaGlzdC5kb25lKTtpZighYmVmb3JlfHwhYmVmb3JlLnJhbmdlcykKe3B1c2hTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLnNlbCxoaXN0LmRvbmUpO30KY3VyPXtjaGFuZ2VzOltoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsY2hhbmdlKV0sZ2VuZXJhdGlvbjpoaXN0LmdlbmVyYXRpb259O2hpc3QuZG9uZS5wdXNoKGN1cik7d2hpbGUoaGlzdC5kb25lLmxlbmd0aD5oaXN0LnVuZG9EZXB0aCl7aGlzdC5kb25lLnNoaWZ0KCk7aWYoIWhpc3QuZG9uZVswXS5yYW5nZXMpe2hpc3QuZG9uZS5zaGlmdCgpO319fQpoaXN0LmRvbmUucHVzaChzZWxBZnRlcik7aGlzdC5nZW5lcmF0aW9uPSsraGlzdC5tYXhHZW5lcmF0aW9uO2hpc3QubGFzdE1vZFRpbWU9aGlzdC5sYXN0U2VsVGltZT10aW1lO2hpc3QubGFzdE9wPWhpc3QubGFzdFNlbE9wPW9wSWQ7aGlzdC5sYXN0T3JpZ2luPWhpc3QubGFzdFNlbE9yaWdpbj1jaGFuZ2Uub3JpZ2luO2lmKCFsYXN0KXtzaWduYWwoZG9jLCJoaXN0b3J5QWRkZWQiKTt9fQpmdW5jdGlvbiBzZWxlY3Rpb25FdmVudENhbkJlTWVyZ2VkKGRvYyxvcmlnaW4scHJldixzZWwpe3ZhciBjaD1vcmlnaW4uY2hhckF0KDApO3JldHVybiBjaD09IioifHxjaD09IisiJiZwcmV2LnJhbmdlcy5sZW5ndGg9PXNlbC5yYW5nZXMubGVuZ3RoJiZwcmV2LnNvbWV0aGluZ1NlbGVjdGVkKCk9PXNlbC5zb21ldGhpbmdTZWxlY3RlZCgpJiZuZXcgRGF0ZS1kb2MuaGlzdG9yeS5sYXN0U2VsVGltZTw9KGRvYy5jbT9kb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheTo1MDApfQpmdW5jdGlvbiBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLHNlbCxvcElkLG9wdGlvbnMpe3ZhciBoaXN0PWRvYy5oaXN0b3J5LG9yaWdpbj1vcHRpb25zJiZvcHRpb25zLm9yaWdpbjtpZihvcElkPT1oaXN0Lmxhc3RTZWxPcHx8KG9yaWdpbiYmaGlzdC5sYXN0U2VsT3JpZ2luPT1vcmlnaW4mJihoaXN0Lmxhc3RNb2RUaW1lPT1oaXN0Lmxhc3RTZWxUaW1lJiZoaXN0Lmxhc3RPcmlnaW49PW9yaWdpbnx8c2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2Msb3JpZ2luLGxzdChoaXN0LmRvbmUpLHNlbCkpKSkKe2hpc3QuZG9uZVtoaXN0LmRvbmUubGVuZ3RoLTFdPXNlbDt9CmVsc2UKe3B1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsLGhpc3QuZG9uZSk7fQpoaXN0Lmxhc3RTZWxUaW1lPStuZXcgRGF0ZTtoaXN0Lmxhc3RTZWxPcmlnaW49b3JpZ2luO2hpc3QubGFzdFNlbE9wPW9wSWQ7aWYob3B0aW9ucyYmb3B0aW9ucy5jbGVhclJlZG8hPT1mYWxzZSkKe2NsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QudW5kb25lKTt9fQpmdW5jdGlvbiBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbCxkZXN0KXt2YXIgdG9wPWxzdChkZXN0KTtpZighKHRvcCYmdG9wLnJhbmdlcyYmdG9wLmVxdWFscyhzZWwpKSkKe2Rlc3QucHVzaChzZWwpO319CmZ1bmN0aW9uIGF0dGFjaExvY2FsU3BhbnMoZG9jLGNoYW5nZSxmcm9tLHRvKXt2YXIgZXhpc3Rpbmc9Y2hhbmdlWyJzcGFuc18iK2RvYy5pZF0sbj0wO2RvYy5pdGVyKE1hdGgubWF4KGRvYy5maXJzdCxmcm9tKSxNYXRoLm1pbihkb2MuZmlyc3QrZG9jLnNpemUsdG8pLGZ1bmN0aW9uKGxpbmUpe2lmKGxpbmUubWFya2VkU3BhbnMpCnsoZXhpc3Rpbmd8fChleGlzdGluZz1jaGFuZ2VbInNwYW5zXyIrZG9jLmlkXT17fSkpW25dPWxpbmUubWFya2VkU3BhbnM7fQorK247fSk7fQpmdW5jdGlvbiByZW1vdmVDbGVhcmVkU3BhbnMoc3BhbnMpe2lmKCFzcGFucyl7cmV0dXJuIG51bGx9CnZhciBvdXQ7Zm9yKHZhciBpPTA7aTxzcGFucy5sZW5ndGg7KytpKXtpZihzcGFuc1tpXS5tYXJrZXIuZXhwbGljaXRseUNsZWFyZWQpe2lmKCFvdXQpe291dD1zcGFucy5zbGljZSgwLGkpO319CmVsc2UgaWYob3V0KXtvdXQucHVzaChzcGFuc1tpXSk7fX0KcmV0dXJuIW91dD9zcGFuczpvdXQubGVuZ3RoP291dDpudWxsfQpmdW5jdGlvbiBnZXRPbGRTcGFucyhkb2MsY2hhbmdlKXt2YXIgZm91bmQ9Y2hhbmdlWyJzcGFuc18iK2RvYy5pZF07aWYoIWZvdW5kKXtyZXR1cm4gbnVsbH0KdmFyIG53PVtdO2Zvcih2YXIgaT0wO2k8Y2hhbmdlLnRleHQubGVuZ3RoOysraSkKe253LnB1c2gocmVtb3ZlQ2xlYXJlZFNwYW5zKGZvdW5kW2ldKSk7fQpyZXR1cm4gbnd9CmZ1bmN0aW9uIG1lcmdlT2xkU3BhbnMoZG9jLGNoYW5nZSl7dmFyIG9sZD1nZXRPbGRTcGFucyhkb2MsY2hhbmdlKTt2YXIgc3RyZXRjaGVkPXN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLGNoYW5nZSk7aWYoIW9sZCl7cmV0dXJuIHN0cmV0Y2hlZH0KaWYoIXN0cmV0Y2hlZCl7cmV0dXJuIG9sZH0KZm9yKHZhciBpPTA7aTxvbGQubGVuZ3RoOysraSl7dmFyIG9sZEN1cj1vbGRbaV0sc3RyZXRjaEN1cj1zdHJldGNoZWRbaV07aWYob2xkQ3VyJiZzdHJldGNoQ3VyKXtzcGFuczpmb3IodmFyIGo9MDtqPHN0cmV0Y2hDdXIubGVuZ3RoOysrail7dmFyIHNwYW49c3RyZXRjaEN1cltqXTtmb3IodmFyIGs9MDtrPG9sZEN1ci5sZW5ndGg7KytrKQp7aWYob2xkQ3VyW2tdLm1hcmtlcj09c3Bhbi5tYXJrZXIpe2NvbnRpbnVlIHNwYW5zfX0Kb2xkQ3VyLnB1c2goc3Bhbik7fX1lbHNlIGlmKHN0cmV0Y2hDdXIpe29sZFtpXT1zdHJldGNoQ3VyO319CnJldHVybiBvbGR9CmZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLG5ld0dyb3VwLGluc3RhbnRpYXRlU2VsKXt2YXIgY29weT1bXTtmb3IodmFyIGk9MDtpPGV2ZW50cy5sZW5ndGg7KytpKXt2YXIgZXZlbnQ9ZXZlbnRzW2ldO2lmKGV2ZW50LnJhbmdlcyl7Y29weS5wdXNoKGluc3RhbnRpYXRlU2VsP1NlbGVjdGlvbi5wcm90b3R5cGUuZGVlcENvcHkuY2FsbChldmVudCk6ZXZlbnQpO2NvbnRpbnVlfQp2YXIgY2hhbmdlcz1ldmVudC5jaGFuZ2VzLG5ld0NoYW5nZXM9W107Y29weS5wdXNoKHtjaGFuZ2VzOm5ld0NoYW5nZXN9KTtmb3IodmFyIGo9MDtqPGNoYW5nZXMubGVuZ3RoOysrail7dmFyIGNoYW5nZT1jaGFuZ2VzW2pdLG09KHZvaWQgMCk7bmV3Q2hhbmdlcy5wdXNoKHtmcm9tOmNoYW5nZS5mcm9tLHRvOmNoYW5nZS50byx0ZXh0OmNoYW5nZS50ZXh0fSk7aWYobmV3R3JvdXApe2Zvcih2YXIgcHJvcCBpbiBjaGFuZ2Upe2lmKG09cHJvcC5tYXRjaCgvXnNwYW5zXyhcZCspJC8pKXtpZihpbmRleE9mKG5ld0dyb3VwLE51bWJlcihtWzFdKSk+LTEpe2xzdChuZXdDaGFuZ2VzKVtwcm9wXT1jaGFuZ2VbcHJvcF07ZGVsZXRlIGNoYW5nZVtwcm9wXTt9fX19fX0KcmV0dXJuIGNvcHl9CmZ1bmN0aW9uIGV4dGVuZFJhbmdlKHJhbmdlLGhlYWQsb3RoZXIsZXh0ZW5kKXtpZihleHRlbmQpe3ZhciBhbmNob3I9cmFuZ2UuYW5jaG9yO2lmKG90aGVyKXt2YXIgcG9zQmVmb3JlPWNtcChoZWFkLGFuY2hvcik8MDtpZihwb3NCZWZvcmUhPShjbXAob3RoZXIsYW5jaG9yKTwwKSl7YW5jaG9yPWhlYWQ7aGVhZD1vdGhlcjt9ZWxzZSBpZihwb3NCZWZvcmUhPShjbXAoaGVhZCxvdGhlcik8MCkpe2hlYWQ9b3RoZXI7fX0KcmV0dXJuIG5ldyBSYW5nZShhbmNob3IsaGVhZCl9ZWxzZXtyZXR1cm4gbmV3IFJhbmdlKG90aGVyfHxoZWFkLGhlYWQpfX0KZnVuY3Rpb24gZXh0ZW5kU2VsZWN0aW9uKGRvYyxoZWFkLG90aGVyLG9wdGlvbnMsZXh0ZW5kKXtpZihleHRlbmQ9PW51bGwpe2V4dGVuZD1kb2MuY20mJihkb2MuY20uZGlzcGxheS5zaGlmdHx8ZG9jLmV4dGVuZCk7fQpzZXRTZWxlY3Rpb24oZG9jLG5ldyBTZWxlY3Rpb24oW2V4dGVuZFJhbmdlKGRvYy5zZWwucHJpbWFyeSgpLGhlYWQsb3RoZXIsZXh0ZW5kKV0sMCksb3B0aW9ucyk7fQpmdW5jdGlvbiBleHRlbmRTZWxlY3Rpb25zKGRvYyxoZWFkcyxvcHRpb25zKXt2YXIgb3V0PVtdO3ZhciBleHRlbmQ9ZG9jLmNtJiYoZG9jLmNtLmRpc3BsYXkuc2hpZnR8fGRvYy5leHRlbmQpO2Zvcih2YXIgaT0wO2k8ZG9jLnNlbC5yYW5nZXMubGVuZ3RoO2krKykKe291dFtpXT1leHRlbmRSYW5nZShkb2Muc2VsLnJhbmdlc1tpXSxoZWFkc1tpXSxudWxsLGV4dGVuZCk7fQp2YXIgbmV3U2VsPW5vcm1hbGl6ZVNlbGVjdGlvbihvdXQsZG9jLnNlbC5wcmltSW5kZXgpO3NldFNlbGVjdGlvbihkb2MsbmV3U2VsLG9wdGlvbnMpO30KZnVuY3Rpb24gcmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsaSxyYW5nZSxvcHRpb25zKXt2YXIgcmFuZ2VzPWRvYy5zZWwucmFuZ2VzLnNsaWNlKDApO3Jhbmdlc1tpXT1yYW5nZTtzZXRTZWxlY3Rpb24oZG9jLG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMsZG9jLnNlbC5wcmltSW5kZXgpLG9wdGlvbnMpO30KZnVuY3Rpb24gc2V0U2ltcGxlU2VsZWN0aW9uKGRvYyxhbmNob3IsaGVhZCxvcHRpb25zKXtzZXRTZWxlY3Rpb24oZG9jLHNpbXBsZVNlbGVjdGlvbihhbmNob3IsaGVhZCksb3B0aW9ucyk7fQpmdW5jdGlvbiBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLHNlbCxvcHRpb25zKXt2YXIgb2JqPXtyYW5nZXM6c2VsLnJhbmdlcyx1cGRhdGU6ZnVuY3Rpb24ocmFuZ2VzKXt2YXIgdGhpcyQxPXRoaXM7dGhpcy5yYW5nZXM9W107Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKykKe3RoaXMkMS5yYW5nZXNbaV09bmV3IFJhbmdlKGNsaXBQb3MoZG9jLHJhbmdlc1tpXS5hbmNob3IpLGNsaXBQb3MoZG9jLHJhbmdlc1tpXS5oZWFkKSk7fX0sb3JpZ2luOm9wdGlvbnMmJm9wdGlvbnMub3JpZ2lufTtzaWduYWwoZG9jLCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiLGRvYyxvYmopO2lmKGRvYy5jbSl7c2lnbmFsKGRvYy5jbSwiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIixkb2MuY20sb2JqKTt9CmlmKG9iai5yYW5nZXMhPXNlbC5yYW5nZXMpe3JldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob2JqLnJhbmdlcyxvYmoucmFuZ2VzLmxlbmd0aC0xKX0KZWxzZXtyZXR1cm4gc2VsfX0KZnVuY3Rpb24gc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkoZG9jLHNlbCxvcHRpb25zKXt2YXIgZG9uZT1kb2MuaGlzdG9yeS5kb25lLGxhc3Q9bHN0KGRvbmUpO2lmKGxhc3QmJmxhc3QucmFuZ2VzKXtkb25lW2RvbmUubGVuZ3RoLTFdPXNlbDtzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLHNlbCxvcHRpb25zKTt9ZWxzZXtzZXRTZWxlY3Rpb24oZG9jLHNlbCxvcHRpb25zKTt9fQpmdW5jdGlvbiBzZXRTZWxlY3Rpb24oZG9jLHNlbCxvcHRpb25zKXtzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLHNlbCxvcHRpb25zKTthZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLGRvYy5zZWwsZG9jLmNtP2RvYy5jbS5jdXJPcC5pZDpOYU4sb3B0aW9ucyk7fQpmdW5jdGlvbiBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLHNlbCxvcHRpb25zKXtpZihoYXNIYW5kbGVyKGRvYywiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIil8fGRvYy5jbSYmaGFzSGFuZGxlcihkb2MuY20sImJlZm9yZVNlbGVjdGlvbkNoYW5nZSIpKQp7c2VsPWZpbHRlclNlbGVjdGlvbkNoYW5nZShkb2Msc2VsLG9wdGlvbnMpO30KdmFyIGJpYXM9b3B0aW9ucyYmb3B0aW9ucy5iaWFzfHwoY21wKHNlbC5wcmltYXJ5KCkuaGVhZCxkb2Muc2VsLnByaW1hcnkoKS5oZWFkKTwwPy0xOjEpO3NldFNlbGVjdGlvbklubmVyKGRvYyxza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLHNlbCxiaWFzLHRydWUpKTtpZighKG9wdGlvbnMmJm9wdGlvbnMuc2Nyb2xsPT09ZmFsc2UpJiZkb2MuY20pCntlbnN1cmVDdXJzb3JWaXNpYmxlKGRvYy5jbSk7fX0KZnVuY3Rpb24gc2V0U2VsZWN0aW9uSW5uZXIoZG9jLHNlbCl7aWYoc2VsLmVxdWFscyhkb2Muc2VsKSl7cmV0dXJufQpkb2Muc2VsPXNlbDtpZihkb2MuY20pe2RvYy5jbS5jdXJPcC51cGRhdGVJbnB1dD1kb2MuY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZD10cnVlO3NpZ25hbEN1cnNvckFjdGl2aXR5KGRvYy5jbSk7fQpzaWduYWxMYXRlcihkb2MsImN1cnNvckFjdGl2aXR5Iixkb2MpO30KZnVuY3Rpb24gcmVDaGVja1NlbGVjdGlvbihkb2Mpe3NldFNlbGVjdGlvbklubmVyKGRvYyxza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLGRvYy5zZWwsbnVsbCxmYWxzZSkpO30KZnVuY3Rpb24gc2tpcEF0b21pY0luU2VsZWN0aW9uKGRvYyxzZWwsYmlhcyxtYXlDbGVhcil7dmFyIG91dDtmb3IodmFyIGk9MDtpPHNlbC5yYW5nZXMubGVuZ3RoO2krKyl7dmFyIHJhbmdlPXNlbC5yYW5nZXNbaV07dmFyIG9sZD1zZWwucmFuZ2VzLmxlbmd0aD09ZG9jLnNlbC5yYW5nZXMubGVuZ3RoJiZkb2Muc2VsLnJhbmdlc1tpXTt2YXIgbmV3QW5jaG9yPXNraXBBdG9taWMoZG9jLHJhbmdlLmFuY2hvcixvbGQmJm9sZC5hbmNob3IsYmlhcyxtYXlDbGVhcik7dmFyIG5ld0hlYWQ9c2tpcEF0b21pYyhkb2MscmFuZ2UuaGVhZCxvbGQmJm9sZC5oZWFkLGJpYXMsbWF5Q2xlYXIpO2lmKG91dHx8bmV3QW5jaG9yIT1yYW5nZS5hbmNob3J8fG5ld0hlYWQhPXJhbmdlLmhlYWQpe2lmKCFvdXQpe291dD1zZWwucmFuZ2VzLnNsaWNlKDAsaSk7fQpvdXRbaV09bmV3IFJhbmdlKG5ld0FuY2hvcixuZXdIZWFkKTt9fQpyZXR1cm4gb3V0P25vcm1hbGl6ZVNlbGVjdGlvbihvdXQsc2VsLnByaW1JbmRleCk6c2VsfQpmdW5jdGlvbiBza2lwQXRvbWljSW5uZXIoZG9jLHBvcyxvbGRQb3MsZGlyLG1heUNsZWFyKXt2YXIgbGluZT1nZXRMaW5lKGRvYyxwb3MubGluZSk7aWYobGluZS5tYXJrZWRTcGFucyl7Zm9yKHZhciBpPTA7aTxsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsrK2kpe3ZhciBzcD1saW5lLm1hcmtlZFNwYW5zW2ldLG09c3AubWFya2VyO2lmKChzcC5mcm9tPT1udWxsfHwobS5pbmNsdXNpdmVMZWZ0P3NwLmZyb208PXBvcy5jaDpzcC5mcm9tPHBvcy5jaCkpJiYoc3AudG89PW51bGx8fChtLmluY2x1c2l2ZVJpZ2h0P3NwLnRvPj1wb3MuY2g6c3AudG8+cG9zLmNoKSkpe2lmKG1heUNsZWFyKXtzaWduYWwobSwiYmVmb3JlQ3Vyc29yRW50ZXIiKTtpZihtLmV4cGxpY2l0bHlDbGVhcmVkKXtpZighbGluZS5tYXJrZWRTcGFucyl7YnJlYWt9CmVsc2V7LS1pO2NvbnRpbnVlfX19CmlmKCFtLmF0b21pYyl7Y29udGludWV9CmlmKG9sZFBvcyl7dmFyIG5lYXI9bS5maW5kKGRpcjwwPzE6LTEpLGRpZmY9KHZvaWQgMCk7aWYoZGlyPDA/bS5pbmNsdXNpdmVSaWdodDptLmluY2x1c2l2ZUxlZnQpCntuZWFyPW1vdmVQb3MoZG9jLG5lYXIsLWRpcixuZWFyJiZuZWFyLmxpbmU9PXBvcy5saW5lP2xpbmU6bnVsbCk7fQppZihuZWFyJiZuZWFyLmxpbmU9PXBvcy5saW5lJiYoZGlmZj1jbXAobmVhcixvbGRQb3MpKSYmKGRpcjwwP2RpZmY8MDpkaWZmPjApKQp7cmV0dXJuIHNraXBBdG9taWNJbm5lcihkb2MsbmVhcixwb3MsZGlyLG1heUNsZWFyKX19CnZhciBmYXI9bS5maW5kKGRpcjwwPy0xOjEpO2lmKGRpcjwwP20uaW5jbHVzaXZlTGVmdDptLmluY2x1c2l2ZVJpZ2h0KQp7ZmFyPW1vdmVQb3MoZG9jLGZhcixkaXIsZmFyLmxpbmU9PXBvcy5saW5lP2xpbmU6bnVsbCk7fQpyZXR1cm4gZmFyP3NraXBBdG9taWNJbm5lcihkb2MsZmFyLHBvcyxkaXIsbWF5Q2xlYXIpOm51bGx9fX0KcmV0dXJuIHBvc30KZnVuY3Rpb24gc2tpcEF0b21pYyhkb2MscG9zLG9sZFBvcyxiaWFzLG1heUNsZWFyKXt2YXIgZGlyPWJpYXN8fDE7dmFyIGZvdW5kPXNraXBBdG9taWNJbm5lcihkb2MscG9zLG9sZFBvcyxkaXIsbWF5Q2xlYXIpfHwoIW1heUNsZWFyJiZza2lwQXRvbWljSW5uZXIoZG9jLHBvcyxvbGRQb3MsZGlyLHRydWUpKXx8c2tpcEF0b21pY0lubmVyKGRvYyxwb3Msb2xkUG9zLC1kaXIsbWF5Q2xlYXIpfHwoIW1heUNsZWFyJiZza2lwQXRvbWljSW5uZXIoZG9jLHBvcyxvbGRQb3MsLWRpcix0cnVlKSk7aWYoIWZvdW5kKXtkb2MuY2FudEVkaXQ9dHJ1ZTtyZXR1cm4gUG9zKGRvYy5maXJzdCwwKX0KcmV0dXJuIGZvdW5kfQpmdW5jdGlvbiBtb3ZlUG9zKGRvYyxwb3MsZGlyLGxpbmUpe2lmKGRpcjwwJiZwb3MuY2g9PTApe2lmKHBvcy5saW5lPmRvYy5maXJzdCl7cmV0dXJuIGNsaXBQb3MoZG9jLFBvcyhwb3MubGluZS0xKSl9CmVsc2V7cmV0dXJuIG51bGx9fWVsc2UgaWYoZGlyPjAmJnBvcy5jaD09KGxpbmV8fGdldExpbmUoZG9jLHBvcy5saW5lKSkudGV4dC5sZW5ndGgpe2lmKHBvcy5saW5lPGRvYy5maXJzdCtkb2Muc2l6ZS0xKXtyZXR1cm4gUG9zKHBvcy5saW5lKzEsMCl9CmVsc2V7cmV0dXJuIG51bGx9fWVsc2V7cmV0dXJuIG5ldyBQb3MocG9zLmxpbmUscG9zLmNoK2Rpcil9fQpmdW5jdGlvbiBzZWxlY3RBbGwoY20pe2NtLnNldFNlbGVjdGlvbihQb3MoY20uZmlyc3RMaW5lKCksMCksUG9zKGNtLmxhc3RMaW5lKCkpLHNlbF9kb250U2Nyb2xsKTt9CmZ1bmN0aW9uIGZpbHRlckNoYW5nZShkb2MsY2hhbmdlLHVwZGF0ZSl7dmFyIG9iaj17Y2FuY2VsZWQ6ZmFsc2UsZnJvbTpjaGFuZ2UuZnJvbSx0bzpjaGFuZ2UudG8sdGV4dDpjaGFuZ2UudGV4dCxvcmlnaW46Y2hhbmdlLm9yaWdpbixjYW5jZWw6ZnVuY3Rpb24oKXtyZXR1cm4gb2JqLmNhbmNlbGVkPXRydWU7fX07aWYodXBkYXRlKXtvYmoudXBkYXRlPWZ1bmN0aW9uKGZyb20sdG8sdGV4dCxvcmlnaW4pe2lmKGZyb20pe29iai5mcm9tPWNsaXBQb3MoZG9jLGZyb20pO30KaWYodG8pe29iai50bz1jbGlwUG9zKGRvYyx0byk7fQppZih0ZXh0KXtvYmoudGV4dD10ZXh0O30KaWYob3JpZ2luIT09dW5kZWZpbmVkKXtvYmoub3JpZ2luPW9yaWdpbjt9fTt9CnNpZ25hbChkb2MsImJlZm9yZUNoYW5nZSIsZG9jLG9iaik7aWYoZG9jLmNtKXtzaWduYWwoZG9jLmNtLCJiZWZvcmVDaGFuZ2UiLGRvYy5jbSxvYmopO30KaWYob2JqLmNhbmNlbGVkKXtyZXR1cm4gbnVsbH0KcmV0dXJue2Zyb206b2JqLmZyb20sdG86b2JqLnRvLHRleHQ6b2JqLnRleHQsb3JpZ2luOm9iai5vcmlnaW59fQpmdW5jdGlvbiBtYWtlQ2hhbmdlKGRvYyxjaGFuZ2UsaWdub3JlUmVhZE9ubHkpe2lmKGRvYy5jbSl7aWYoIWRvYy5jbS5jdXJPcCl7cmV0dXJuIG9wZXJhdGlvbihkb2MuY20sbWFrZUNoYW5nZSkoZG9jLGNoYW5nZSxpZ25vcmVSZWFkT25seSl9CmlmKGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzKXtyZXR1cm59fQppZihoYXNIYW5kbGVyKGRvYywiYmVmb3JlQ2hhbmdlIil8fGRvYy5jbSYmaGFzSGFuZGxlcihkb2MuY20sImJlZm9yZUNoYW5nZSIpKXtjaGFuZ2U9ZmlsdGVyQ2hhbmdlKGRvYyxjaGFuZ2UsdHJ1ZSk7aWYoIWNoYW5nZSl7cmV0dXJufX0KdmFyIHNwbGl0PXNhd1JlYWRPbmx5U3BhbnMmJiFpZ25vcmVSZWFkT25seSYmcmVtb3ZlUmVhZE9ubHlSYW5nZXMoZG9jLGNoYW5nZS5mcm9tLGNoYW5nZS50byk7aWYoc3BsaXQpe2Zvcih2YXIgaT1zcGxpdC5sZW5ndGgtMTtpPj0wOy0taSkKe21ha2VDaGFuZ2VJbm5lcihkb2Mse2Zyb206c3BsaXRbaV0uZnJvbSx0bzpzcGxpdFtpXS50byx0ZXh0Omk/WyIiXTpjaGFuZ2UudGV4dCxvcmlnaW46Y2hhbmdlLm9yaWdpbn0pO319ZWxzZXttYWtlQ2hhbmdlSW5uZXIoZG9jLGNoYW5nZSk7fX0KZnVuY3Rpb24gbWFrZUNoYW5nZUlubmVyKGRvYyxjaGFuZ2Upe2lmKGNoYW5nZS50ZXh0Lmxlbmd0aD09MSYmY2hhbmdlLnRleHRbMF09PSIiJiZjbXAoY2hhbmdlLmZyb20sY2hhbmdlLnRvKT09MCl7cmV0dXJufQp2YXIgc2VsQWZ0ZXI9Y29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYyxjaGFuZ2UpO2FkZENoYW5nZVRvSGlzdG9yeShkb2MsY2hhbmdlLHNlbEFmdGVyLGRvYy5jbT9kb2MuY20uY3VyT3AuaWQ6TmFOKTttYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYyxjaGFuZ2Usc2VsQWZ0ZXIsc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsY2hhbmdlKSk7dmFyIHJlYmFzZWQ9W107bGlua2VkRG9jcyhkb2MsZnVuY3Rpb24oZG9jLHNoYXJlZEhpc3Qpe2lmKCFzaGFyZWRIaXN0JiZpbmRleE9mKHJlYmFzZWQsZG9jLmhpc3RvcnkpPT0tMSl7cmViYXNlSGlzdChkb2MuaGlzdG9yeSxjaGFuZ2UpO3JlYmFzZWQucHVzaChkb2MuaGlzdG9yeSk7fQptYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYyxjaGFuZ2UsbnVsbCxzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYyxjaGFuZ2UpKTt9KTt9CmZ1bmN0aW9uIG1ha2VDaGFuZ2VGcm9tSGlzdG9yeShkb2MsdHlwZSxhbGxvd1NlbGVjdGlvbk9ubHkpe2lmKGRvYy5jbSYmZG9jLmNtLnN0YXRlLnN1cHByZXNzRWRpdHMmJiFhbGxvd1NlbGVjdGlvbk9ubHkpe3JldHVybn0KdmFyIGhpc3Q9ZG9jLmhpc3RvcnksZXZlbnQsc2VsQWZ0ZXI9ZG9jLnNlbDt2YXIgc291cmNlPXR5cGU9PSJ1bmRvIj9oaXN0LmRvbmU6aGlzdC51bmRvbmUsZGVzdD10eXBlPT0idW5kbyI/aGlzdC51bmRvbmU6aGlzdC5kb25lO3ZhciBpPTA7Zm9yKDtpPHNvdXJjZS5sZW5ndGg7aSsrKXtldmVudD1zb3VyY2VbaV07aWYoYWxsb3dTZWxlY3Rpb25Pbmx5P2V2ZW50LnJhbmdlcyYmIWV2ZW50LmVxdWFscyhkb2Muc2VsKTohZXZlbnQucmFuZ2VzKQp7YnJlYWt9fQppZihpPT1zb3VyY2UubGVuZ3RoKXtyZXR1cm59Cmhpc3QubGFzdE9yaWdpbj1oaXN0Lmxhc3RTZWxPcmlnaW49bnVsbDtmb3IoOzspe2V2ZW50PXNvdXJjZS5wb3AoKTtpZihldmVudC5yYW5nZXMpe3B1c2hTZWxlY3Rpb25Ub0hpc3RvcnkoZXZlbnQsZGVzdCk7aWYoYWxsb3dTZWxlY3Rpb25Pbmx5JiYhZXZlbnQuZXF1YWxzKGRvYy5zZWwpKXtzZXRTZWxlY3Rpb24oZG9jLGV2ZW50LHtjbGVhclJlZG86ZmFsc2V9KTtyZXR1cm59CnNlbEFmdGVyPWV2ZW50O30KZWxzZXticmVha319CnZhciBhbnRpQ2hhbmdlcz1bXTtwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbEFmdGVyLGRlc3QpO2Rlc3QucHVzaCh7Y2hhbmdlczphbnRpQ2hhbmdlcyxnZW5lcmF0aW9uOmhpc3QuZ2VuZXJhdGlvbn0pO2hpc3QuZ2VuZXJhdGlvbj1ldmVudC5nZW5lcmF0aW9ufHwrK2hpc3QubWF4R2VuZXJhdGlvbjt2YXIgZmlsdGVyPWhhc0hhbmRsZXIoZG9jLCJiZWZvcmVDaGFuZ2UiKXx8ZG9jLmNtJiZoYXNIYW5kbGVyKGRvYy5jbSwiYmVmb3JlQ2hhbmdlIik7dmFyIGxvb3A9ZnVuY3Rpb24oaSl7dmFyIGNoYW5nZT1ldmVudC5jaGFuZ2VzW2ldO2NoYW5nZS5vcmlnaW49dHlwZTtpZihmaWx0ZXImJiFmaWx0ZXJDaGFuZ2UoZG9jLGNoYW5nZSxmYWxzZSkpe3NvdXJjZS5sZW5ndGg9MDtyZXR1cm57fX0KYW50aUNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsY2hhbmdlKSk7dmFyIGFmdGVyPWk/Y29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYyxjaGFuZ2UpOmxzdChzb3VyY2UpO21ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLGNoYW5nZSxhZnRlcixtZXJnZU9sZFNwYW5zKGRvYyxjaGFuZ2UpKTtpZighaSYmZG9jLmNtKXtkb2MuY20uc2Nyb2xsSW50b1ZpZXcoe2Zyb206Y2hhbmdlLmZyb20sdG86Y2hhbmdlRW5kKGNoYW5nZSl9KTt9CnZhciByZWJhc2VkPVtdO2xpbmtlZERvY3MoZG9jLGZ1bmN0aW9uKGRvYyxzaGFyZWRIaXN0KXtpZighc2hhcmVkSGlzdCYmaW5kZXhPZihyZWJhc2VkLGRvYy5oaXN0b3J5KT09LTEpe3JlYmFzZUhpc3QoZG9jLmhpc3RvcnksY2hhbmdlKTtyZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpO30KbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsY2hhbmdlLG51bGwsbWVyZ2VPbGRTcGFucyhkb2MsY2hhbmdlKSk7fSk7fTtmb3IodmFyIGkkMT1ldmVudC5jaGFuZ2VzLmxlbmd0aC0xO2kkMT49MDstLWkkMSl7dmFyIHJldHVybmVkPWxvb3AoaSQxKTtpZihyZXR1cm5lZClyZXR1cm4gcmV0dXJuZWQudjt9fQpmdW5jdGlvbiBzaGlmdERvYyhkb2MsZGlzdGFuY2Upe2lmKGRpc3RhbmNlPT0wKXtyZXR1cm59CmRvYy5maXJzdCs9ZGlzdGFuY2U7ZG9jLnNlbD1uZXcgU2VsZWN0aW9uKG1hcChkb2Muc2VsLnJhbmdlcyxmdW5jdGlvbihyYW5nZSl7cmV0dXJuIG5ldyBSYW5nZShQb3MocmFuZ2UuYW5jaG9yLmxpbmUrZGlzdGFuY2UscmFuZ2UuYW5jaG9yLmNoKSxQb3MocmFuZ2UuaGVhZC5saW5lK2Rpc3RhbmNlLHJhbmdlLmhlYWQuY2gpKTt9KSxkb2Muc2VsLnByaW1JbmRleCk7aWYoZG9jLmNtKXtyZWdDaGFuZ2UoZG9jLmNtLGRvYy5maXJzdCxkb2MuZmlyc3QtZGlzdGFuY2UsZGlzdGFuY2UpO2Zvcih2YXIgZD1kb2MuY20uZGlzcGxheSxsPWQudmlld0Zyb207bDxkLnZpZXdUbztsKyspCntyZWdMaW5lQ2hhbmdlKGRvYy5jbSxsLCJndXR0ZXIiKTt9fX0KZnVuY3Rpb24gbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsY2hhbmdlLHNlbEFmdGVyLHNwYW5zKXtpZihkb2MuY20mJiFkb2MuY20uY3VyT3ApCntyZXR1cm4gb3BlcmF0aW9uKGRvYy5jbSxtYWtlQ2hhbmdlU2luZ2xlRG9jKShkb2MsY2hhbmdlLHNlbEFmdGVyLHNwYW5zKX0KaWYoY2hhbmdlLnRvLmxpbmU8ZG9jLmZpcnN0KXtzaGlmdERvYyhkb2MsY2hhbmdlLnRleHQubGVuZ3RoLTEtKGNoYW5nZS50by5saW5lLWNoYW5nZS5mcm9tLmxpbmUpKTtyZXR1cm59CmlmKGNoYW5nZS5mcm9tLmxpbmU+ZG9jLmxhc3RMaW5lKCkpe3JldHVybn0KaWYoY2hhbmdlLmZyb20ubGluZTxkb2MuZmlyc3Qpe3ZhciBzaGlmdD1jaGFuZ2UudGV4dC5sZW5ndGgtMS0oZG9jLmZpcnN0LWNoYW5nZS5mcm9tLmxpbmUpO3NoaWZ0RG9jKGRvYyxzaGlmdCk7Y2hhbmdlPXtmcm9tOlBvcyhkb2MuZmlyc3QsMCksdG86UG9zKGNoYW5nZS50by5saW5lK3NoaWZ0LGNoYW5nZS50by5jaCksdGV4dDpbbHN0KGNoYW5nZS50ZXh0KV0sb3JpZ2luOmNoYW5nZS5vcmlnaW59O30KdmFyIGxhc3Q9ZG9jLmxhc3RMaW5lKCk7aWYoY2hhbmdlLnRvLmxpbmU+bGFzdCl7Y2hhbmdlPXtmcm9tOmNoYW5nZS5mcm9tLHRvOlBvcyhsYXN0LGdldExpbmUoZG9jLGxhc3QpLnRleHQubGVuZ3RoKSx0ZXh0OltjaGFuZ2UudGV4dFswXV0sb3JpZ2luOmNoYW5nZS5vcmlnaW59O30KY2hhbmdlLnJlbW92ZWQ9Z2V0QmV0d2Vlbihkb2MsY2hhbmdlLmZyb20sY2hhbmdlLnRvKTtpZighc2VsQWZ0ZXIpe3NlbEFmdGVyPWNvbXB1dGVTZWxBZnRlckNoYW5nZShkb2MsY2hhbmdlKTt9CmlmKGRvYy5jbSl7bWFrZUNoYW5nZVNpbmdsZURvY0luRWRpdG9yKGRvYy5jbSxjaGFuZ2Usc3BhbnMpO30KZWxzZXt1cGRhdGVEb2MoZG9jLGNoYW5nZSxzcGFucyk7fQpzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLHNlbEFmdGVyLHNlbF9kb250U2Nyb2xsKTt9CmZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihjbSxjaGFuZ2Usc3BhbnMpe3ZhciBkb2M9Y20uZG9jLGRpc3BsYXk9Y20uZGlzcGxheSxmcm9tPWNoYW5nZS5mcm9tLHRvPWNoYW5nZS50bzt2YXIgcmVjb21wdXRlTWF4TGVuZ3RoPWZhbHNlLGNoZWNrV2lkdGhTdGFydD1mcm9tLmxpbmU7aWYoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKXtjaGVja1dpZHRoU3RhcnQ9bGluZU5vKHZpc3VhbExpbmUoZ2V0TGluZShkb2MsZnJvbS5saW5lKSkpO2RvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCx0by5saW5lKzEsZnVuY3Rpb24obGluZSl7aWYobGluZT09ZGlzcGxheS5tYXhMaW5lKXtyZWNvbXB1dGVNYXhMZW5ndGg9dHJ1ZTtyZXR1cm4gdHJ1ZX19KTt9CmlmKGRvYy5zZWwuY29udGFpbnMoY2hhbmdlLmZyb20sY2hhbmdlLnRvKT4tMSkKe3NpZ25hbEN1cnNvckFjdGl2aXR5KGNtKTt9CnVwZGF0ZURvYyhkb2MsY2hhbmdlLHNwYW5zLGVzdGltYXRlSGVpZ2h0KGNtKSk7aWYoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKXtkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsZnJvbS5saW5lK2NoYW5nZS50ZXh0Lmxlbmd0aCxmdW5jdGlvbihsaW5lKXt2YXIgbGVuPWxpbmVMZW5ndGgobGluZSk7aWYobGVuPmRpc3BsYXkubWF4TGluZUxlbmd0aCl7ZGlzcGxheS5tYXhMaW5lPWxpbmU7ZGlzcGxheS5tYXhMaW5lTGVuZ3RoPWxlbjtkaXNwbGF5Lm1heExpbmVDaGFuZ2VkPXRydWU7cmVjb21wdXRlTWF4TGVuZ3RoPWZhbHNlO319KTtpZihyZWNvbXB1dGVNYXhMZW5ndGgpe2NtLmN1ck9wLnVwZGF0ZU1heExpbmU9dHJ1ZTt9fQpyZXRyZWF0RnJvbnRpZXIoZG9jLGZyb20ubGluZSk7c3RhcnRXb3JrZXIoY20sNDAwKTt2YXIgbGVuZGlmZj1jaGFuZ2UudGV4dC5sZW5ndGgtKHRvLmxpbmUtZnJvbS5saW5lKS0xO2lmKGNoYW5nZS5mdWxsKQp7cmVnQ2hhbmdlKGNtKTt9CmVsc2UgaWYoZnJvbS5saW5lPT10by5saW5lJiZjaGFuZ2UudGV4dC5sZW5ndGg9PTEmJiFpc1dob2xlTGluZVVwZGF0ZShjbS5kb2MsY2hhbmdlKSkKe3JlZ0xpbmVDaGFuZ2UoY20sZnJvbS5saW5lLCJ0ZXh0Iik7fQplbHNlCntyZWdDaGFuZ2UoY20sZnJvbS5saW5lLHRvLmxpbmUrMSxsZW5kaWZmKTt9CnZhciBjaGFuZ2VzSGFuZGxlcj1oYXNIYW5kbGVyKGNtLCJjaGFuZ2VzIiksY2hhbmdlSGFuZGxlcj1oYXNIYW5kbGVyKGNtLCJjaGFuZ2UiKTtpZihjaGFuZ2VIYW5kbGVyfHxjaGFuZ2VzSGFuZGxlcil7dmFyIG9iaj17ZnJvbTpmcm9tLHRvOnRvLHRleHQ6Y2hhbmdlLnRleHQscmVtb3ZlZDpjaGFuZ2UucmVtb3ZlZCxvcmlnaW46Y2hhbmdlLm9yaWdpbn07aWYoY2hhbmdlSGFuZGxlcil7c2lnbmFsTGF0ZXIoY20sImNoYW5nZSIsY20sb2JqKTt9CmlmKGNoYW5nZXNIYW5kbGVyKXsoY20uY3VyT3AuY2hhbmdlT2Jqc3x8KGNtLmN1ck9wLmNoYW5nZU9ianM9W10pKS5wdXNoKG9iaik7fX0KY20uZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudT1udWxsO30KZnVuY3Rpb24gcmVwbGFjZVJhbmdlKGRvYyxjb2RlLGZyb20sdG8sb3JpZ2luKXtpZighdG8pe3RvPWZyb207fQppZihjbXAodG8sZnJvbSk8MCl7dmFyIGFzc2lnbjsoYXNzaWduPVt0byxmcm9tXSxmcm9tPWFzc2lnblswXSx0bz1hc3NpZ25bMV0pO30KaWYodHlwZW9mIGNvZGU9PSJzdHJpbmciKXtjb2RlPWRvYy5zcGxpdExpbmVzKGNvZGUpO30KbWFrZUNoYW5nZShkb2Mse2Zyb206ZnJvbSx0bzp0byx0ZXh0OmNvZGUsb3JpZ2luOm9yaWdpbn0pO30KZnVuY3Rpb24gcmViYXNlSGlzdFNlbFNpbmdsZShwb3MsZnJvbSx0byxkaWZmKXtpZih0bzxwb3MubGluZSl7cG9zLmxpbmUrPWRpZmY7fWVsc2UgaWYoZnJvbTxwb3MubGluZSl7cG9zLmxpbmU9ZnJvbTtwb3MuY2g9MDt9fQpmdW5jdGlvbiByZWJhc2VIaXN0QXJyYXkoYXJyYXksZnJvbSx0byxkaWZmKXtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDsrK2kpe3ZhciBzdWI9YXJyYXlbaV0sb2s9dHJ1ZTtpZihzdWIucmFuZ2VzKXtpZighc3ViLmNvcGllZCl7c3ViPWFycmF5W2ldPXN1Yi5kZWVwQ29weSgpO3N1Yi5jb3BpZWQ9dHJ1ZTt9CmZvcih2YXIgaj0wO2o8c3ViLnJhbmdlcy5sZW5ndGg7aisrKXtyZWJhc2VIaXN0U2VsU2luZ2xlKHN1Yi5yYW5nZXNbal0uYW5jaG9yLGZyb20sdG8sZGlmZik7cmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmhlYWQsZnJvbSx0byxkaWZmKTt9CmNvbnRpbnVlfQpmb3IodmFyIGokMT0wO2okMTxzdWIuY2hhbmdlcy5sZW5ndGg7KytqJDEpe3ZhciBjdXI9c3ViLmNoYW5nZXNbaiQxXTtpZih0bzxjdXIuZnJvbS5saW5lKXtjdXIuZnJvbT1Qb3MoY3VyLmZyb20ubGluZStkaWZmLGN1ci5mcm9tLmNoKTtjdXIudG89UG9zKGN1ci50by5saW5lK2RpZmYsY3VyLnRvLmNoKTt9ZWxzZSBpZihmcm9tPD1jdXIudG8ubGluZSl7b2s9ZmFsc2U7YnJlYWt9fQppZighb2spe2FycmF5LnNwbGljZSgwLGkrMSk7aT0wO319fQpmdW5jdGlvbiByZWJhc2VIaXN0KGhpc3QsY2hhbmdlKXt2YXIgZnJvbT1jaGFuZ2UuZnJvbS5saW5lLHRvPWNoYW5nZS50by5saW5lLGRpZmY9Y2hhbmdlLnRleHQubGVuZ3RoLSh0by1mcm9tKS0xO3JlYmFzZUhpc3RBcnJheShoaXN0LmRvbmUsZnJvbSx0byxkaWZmKTtyZWJhc2VIaXN0QXJyYXkoaGlzdC51bmRvbmUsZnJvbSx0byxkaWZmKTt9CmZ1bmN0aW9uIGNoYW5nZUxpbmUoZG9jLGhhbmRsZSxjaGFuZ2VUeXBlLG9wKXt2YXIgbm89aGFuZGxlLGxpbmU9aGFuZGxlO2lmKHR5cGVvZiBoYW5kbGU9PSJudW1iZXIiKXtsaW5lPWdldExpbmUoZG9jLGNsaXBMaW5lKGRvYyxoYW5kbGUpKTt9CmVsc2V7bm89bGluZU5vKGhhbmRsZSk7fQppZihubz09bnVsbCl7cmV0dXJuIG51bGx9CmlmKG9wKGxpbmUsbm8pJiZkb2MuY20pe3JlZ0xpbmVDaGFuZ2UoZG9jLmNtLG5vLGNoYW5nZVR5cGUpO30KcmV0dXJuIGxpbmV9CmZ1bmN0aW9uIExlYWZDaHVuayhsaW5lcyl7dmFyIHRoaXMkMT10aGlzO3RoaXMubGluZXM9bGluZXM7dGhpcy5wYXJlbnQ9bnVsbDt2YXIgaGVpZ2h0PTA7Zm9yKHZhciBpPTA7aTxsaW5lcy5sZW5ndGg7KytpKXtsaW5lc1tpXS5wYXJlbnQ9dGhpcyQxO2hlaWdodCs9bGluZXNbaV0uaGVpZ2h0O30KdGhpcy5oZWlnaHQ9aGVpZ2h0O30KTGVhZkNodW5rLnByb3RvdHlwZT17Y2h1bmtTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGluZXMubGVuZ3RofSxyZW1vdmVJbm5lcjpmdW5jdGlvbihhdCxuKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBpPWF0LGU9YXQrbjtpPGU7KytpKXt2YXIgbGluZT10aGlzJDEubGluZXNbaV07dGhpcyQxLmhlaWdodC09bGluZS5oZWlnaHQ7Y2xlYW5VcExpbmUobGluZSk7c2lnbmFsTGF0ZXIobGluZSwiZGVsZXRlIik7fQp0aGlzLmxpbmVzLnNwbGljZShhdCxuKTt9LGNvbGxhcHNlOmZ1bmN0aW9uKGxpbmVzKXtsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLHRoaXMubGluZXMpO30saW5zZXJ0SW5uZXI6ZnVuY3Rpb24oYXQsbGluZXMsaGVpZ2h0KXt2YXIgdGhpcyQxPXRoaXM7dGhpcy5oZWlnaHQrPWhlaWdodDt0aGlzLmxpbmVzPXRoaXMubGluZXMuc2xpY2UoMCxhdCkuY29uY2F0KGxpbmVzKS5jb25jYXQodGhpcy5saW5lcy5zbGljZShhdCkpO2Zvcih2YXIgaT0wO2k8bGluZXMubGVuZ3RoOysraSl7bGluZXNbaV0ucGFyZW50PXRoaXMkMTt9fSxpdGVyTjpmdW5jdGlvbihhdCxuLG9wKXt2YXIgdGhpcyQxPXRoaXM7Zm9yKHZhciBlPWF0K247YXQ8ZTsrK2F0KQp7aWYob3AodGhpcyQxLmxpbmVzW2F0XSkpe3JldHVybiB0cnVlfX19fTtmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbil7dmFyIHRoaXMkMT10aGlzO3RoaXMuY2hpbGRyZW49Y2hpbGRyZW47dmFyIHNpemU9MCxoZWlnaHQ9MDtmb3IodmFyIGk9MDtpPGNoaWxkcmVuLmxlbmd0aDsrK2kpe3ZhciBjaD1jaGlsZHJlbltpXTtzaXplKz1jaC5jaHVua1NpemUoKTtoZWlnaHQrPWNoLmhlaWdodDtjaC5wYXJlbnQ9dGhpcyQxO30KdGhpcy5zaXplPXNpemU7dGhpcy5oZWlnaHQ9aGVpZ2h0O3RoaXMucGFyZW50PW51bGw7fQpCcmFuY2hDaHVuay5wcm90b3R5cGU9e2NodW5rU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemV9LHJlbW92ZUlubmVyOmZ1bmN0aW9uKGF0LG4pe3ZhciB0aGlzJDE9dGhpczt0aGlzLnNpemUtPW47Zm9yKHZhciBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsrK2kpe3ZhciBjaGlsZD10aGlzJDEuY2hpbGRyZW5baV0sc3o9Y2hpbGQuY2h1bmtTaXplKCk7aWYoYXQ8c3ope3ZhciBybT1NYXRoLm1pbihuLHN6LWF0KSxvbGRIZWlnaHQ9Y2hpbGQuaGVpZ2h0O2NoaWxkLnJlbW92ZUlubmVyKGF0LHJtKTt0aGlzJDEuaGVpZ2h0LT1vbGRIZWlnaHQtY2hpbGQuaGVpZ2h0O2lmKHN6PT1ybSl7dGhpcyQxLmNoaWxkcmVuLnNwbGljZShpLS0sMSk7Y2hpbGQucGFyZW50PW51bGw7fQppZigobi09cm0pPT0wKXticmVha30KYXQ9MDt9ZWxzZXthdC09c3o7fX0KaWYodGhpcy5zaXplLW48MjUmJih0aGlzLmNoaWxkcmVuLmxlbmd0aD4xfHwhKHRoaXMuY2hpbGRyZW5bMF1pbnN0YW5jZW9mIExlYWZDaHVuaykpKXt2YXIgbGluZXM9W107dGhpcy5jb2xsYXBzZShsaW5lcyk7dGhpcy5jaGlsZHJlbj1bbmV3IExlYWZDaHVuayhsaW5lcyldO3RoaXMuY2hpbGRyZW5bMF0ucGFyZW50PXRoaXM7fX0sY29sbGFwc2U6ZnVuY3Rpb24obGluZXMpe3ZhciB0aGlzJDE9dGhpcztmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSl7dGhpcyQxLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKTt9fSxpbnNlcnRJbm5lcjpmdW5jdGlvbihhdCxsaW5lcyxoZWlnaHQpe3ZhciB0aGlzJDE9dGhpczt0aGlzLnNpemUrPWxpbmVzLmxlbmd0aDt0aGlzLmhlaWdodCs9aGVpZ2h0O2Zvcih2YXIgaT0wO2k8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KytpKXt2YXIgY2hpbGQ9dGhpcyQxLmNoaWxkcmVuW2ldLHN6PWNoaWxkLmNodW5rU2l6ZSgpO2lmKGF0PD1zeil7Y2hpbGQuaW5zZXJ0SW5uZXIoYXQsbGluZXMsaGVpZ2h0KTtpZihjaGlsZC5saW5lcyYmY2hpbGQubGluZXMubGVuZ3RoPjUwKXt2YXIgcmVtYWluaW5nPWNoaWxkLmxpbmVzLmxlbmd0aCUyNSsyNTtmb3IodmFyIHBvcz1yZW1haW5pbmc7cG9zPGNoaWxkLmxpbmVzLmxlbmd0aDspe3ZhciBsZWFmPW5ldyBMZWFmQ2h1bmsoY2hpbGQubGluZXMuc2xpY2UocG9zLHBvcys9MjUpKTtjaGlsZC5oZWlnaHQtPWxlYWYuaGVpZ2h0O3RoaXMkMS5jaGlsZHJlbi5zcGxpY2UoKytpLDAsbGVhZik7bGVhZi5wYXJlbnQ9dGhpcyQxO30KY2hpbGQubGluZXM9Y2hpbGQubGluZXMuc2xpY2UoMCxyZW1haW5pbmcpO3RoaXMkMS5tYXliZVNwaWxsKCk7fQpicmVha30KYXQtPXN6O319LG1heWJlU3BpbGw6ZnVuY3Rpb24oKXtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aDw9MTApe3JldHVybn0KdmFyIG1lPXRoaXM7ZG97dmFyIHNwaWxsZWQ9bWUuY2hpbGRyZW4uc3BsaWNlKG1lLmNoaWxkcmVuLmxlbmd0aC01LDUpO3ZhciBzaWJsaW5nPW5ldyBCcmFuY2hDaHVuayhzcGlsbGVkKTtpZighbWUucGFyZW50KXt2YXIgY29weT1uZXcgQnJhbmNoQ2h1bmsobWUuY2hpbGRyZW4pO2NvcHkucGFyZW50PW1lO21lLmNoaWxkcmVuPVtjb3B5LHNpYmxpbmddO21lPWNvcHk7fWVsc2V7bWUuc2l6ZS09c2libGluZy5zaXplO21lLmhlaWdodC09c2libGluZy5oZWlnaHQ7dmFyIG15SW5kZXg9aW5kZXhPZihtZS5wYXJlbnQuY2hpbGRyZW4sbWUpO21lLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UobXlJbmRleCsxLDAsc2libGluZyk7fQpzaWJsaW5nLnBhcmVudD1tZS5wYXJlbnQ7fXdoaWxlKG1lLmNoaWxkcmVuLmxlbmd0aD4xMCkKbWUucGFyZW50Lm1heWJlU3BpbGwoKTt9LGl0ZXJOOmZ1bmN0aW9uKGF0LG4sb3Ape3ZhciB0aGlzJDE9dGhpcztmb3IodmFyIGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSl7dmFyIGNoaWxkPXRoaXMkMS5jaGlsZHJlbltpXSxzej1jaGlsZC5jaHVua1NpemUoKTtpZihhdDxzeil7dmFyIHVzZWQ9TWF0aC5taW4obixzei1hdCk7aWYoY2hpbGQuaXRlck4oYXQsdXNlZCxvcCkpe3JldHVybiB0cnVlfQppZigobi09dXNlZCk9PTApe2JyZWFrfQphdD0wO31lbHNle2F0LT1zejt9fX19O3ZhciBMaW5lV2lkZ2V0PWZ1bmN0aW9uKGRvYyxub2RlLG9wdGlvbnMpe3ZhciB0aGlzJDE9dGhpcztpZihvcHRpb25zKXtmb3IodmFyIG9wdCBpbiBvcHRpb25zKXtpZihvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpCnt0aGlzJDFbb3B0XT1vcHRpb25zW29wdF07fX19CnRoaXMuZG9jPWRvYzt0aGlzLm5vZGU9bm9kZTt9O0xpbmVXaWRnZXQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO3ZhciBjbT10aGlzLmRvYy5jbSx3cz10aGlzLmxpbmUud2lkZ2V0cyxsaW5lPXRoaXMubGluZSxubz1saW5lTm8obGluZSk7aWYobm89PW51bGx8fCF3cyl7cmV0dXJufQpmb3IodmFyIGk9MDtpPHdzLmxlbmd0aDsrK2kpe2lmKHdzW2ldPT10aGlzJDEpe3dzLnNwbGljZShpLS0sMSk7fX0KaWYoIXdzLmxlbmd0aCl7bGluZS53aWRnZXRzPW51bGw7fQp2YXIgaGVpZ2h0PXdpZGdldEhlaWdodCh0aGlzKTt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsTWF0aC5tYXgoMCxsaW5lLmhlaWdodC1oZWlnaHQpKTtpZihjbSl7cnVuSW5PcChjbSxmdW5jdGlvbigpe2FkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sbGluZSwtaGVpZ2h0KTtyZWdMaW5lQ2hhbmdlKGNtLG5vLCJ3aWRnZXQiKTt9KTtzaWduYWxMYXRlcihjbSwibGluZVdpZGdldENsZWFyZWQiLGNtLHRoaXMsbm8pO319O0xpbmVXaWRnZXQucHJvdG90eXBlLmNoYW5nZWQ9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG9sZEg9dGhpcy5oZWlnaHQsY209dGhpcy5kb2MuY20sbGluZT10aGlzLmxpbmU7dGhpcy5oZWlnaHQ9bnVsbDt2YXIgZGlmZj13aWRnZXRIZWlnaHQodGhpcyktb2xkSDtpZighZGlmZil7cmV0dXJufQp1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsbGluZS5oZWlnaHQrZGlmZik7aWYoY20pe3J1bkluT3AoY20sZnVuY3Rpb24oKXtjbS5jdXJPcC5mb3JjZVVwZGF0ZT10cnVlO2FkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sbGluZSxkaWZmKTtzaWduYWxMYXRlcihjbSwibGluZVdpZGdldENoYW5nZWQiLGNtLHRoaXMkMSxsaW5lTm8obGluZSkpO30pO319O2V2ZW50TWl4aW4oTGluZVdpZGdldCk7ZnVuY3Rpb24gYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSxsaW5lLGRpZmYpe2lmKGhlaWdodEF0TGluZShsaW5lKTwoKGNtLmN1ck9wJiZjbS5jdXJPcC5zY3JvbGxUb3ApfHxjbS5kb2Muc2Nyb2xsVG9wKSkKe2FkZFRvU2Nyb2xsVG9wKGNtLGRpZmYpO319CmZ1bmN0aW9uIGFkZExpbmVXaWRnZXQoZG9jLGhhbmRsZSxub2RlLG9wdGlvbnMpe3ZhciB3aWRnZXQ9bmV3IExpbmVXaWRnZXQoZG9jLG5vZGUsb3B0aW9ucyk7dmFyIGNtPWRvYy5jbTtpZihjbSYmd2lkZ2V0Lm5vSFNjcm9sbCl7Y20uZGlzcGxheS5hbGlnbldpZGdldHM9dHJ1ZTt9CmNoYW5nZUxpbmUoZG9jLGhhbmRsZSwid2lkZ2V0IixmdW5jdGlvbihsaW5lKXt2YXIgd2lkZ2V0cz1saW5lLndpZGdldHN8fChsaW5lLndpZGdldHM9W10pO2lmKHdpZGdldC5pbnNlcnRBdD09bnVsbCl7d2lkZ2V0cy5wdXNoKHdpZGdldCk7fQplbHNle3dpZGdldHMuc3BsaWNlKE1hdGgubWluKHdpZGdldHMubGVuZ3RoLTEsTWF0aC5tYXgoMCx3aWRnZXQuaW5zZXJ0QXQpKSwwLHdpZGdldCk7fQp3aWRnZXQubGluZT1saW5lO2lmKGNtJiYhbGluZUlzSGlkZGVuKGRvYyxsaW5lKSl7dmFyIGFib3ZlVmlzaWJsZT1oZWlnaHRBdExpbmUobGluZSk8ZG9jLnNjcm9sbFRvcDt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsbGluZS5oZWlnaHQrd2lkZ2V0SGVpZ2h0KHdpZGdldCkpO2lmKGFib3ZlVmlzaWJsZSl7YWRkVG9TY3JvbGxUb3AoY20sd2lkZ2V0LmhlaWdodCk7fQpjbS5jdXJPcC5mb3JjZVVwZGF0ZT10cnVlO30KcmV0dXJuIHRydWV9KTtzaWduYWxMYXRlcihjbSwibGluZVdpZGdldEFkZGVkIixjbSx3aWRnZXQsdHlwZW9mIGhhbmRsZT09Im51bWJlciI/aGFuZGxlOmxpbmVObyhoYW5kbGUpKTtyZXR1cm4gd2lkZ2V0fQp2YXIgbmV4dE1hcmtlcklkPTA7dmFyIFRleHRNYXJrZXI9ZnVuY3Rpb24oZG9jLHR5cGUpe3RoaXMubGluZXM9W107dGhpcy50eXBlPXR5cGU7dGhpcy5kb2M9ZG9jO3RoaXMuaWQ9KytuZXh0TWFya2VySWQ7fTtUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpcztpZih0aGlzLmV4cGxpY2l0bHlDbGVhcmVkKXtyZXR1cm59CnZhciBjbT10aGlzLmRvYy5jbSx3aXRoT3A9Y20mJiFjbS5jdXJPcDtpZih3aXRoT3Ape3N0YXJ0T3BlcmF0aW9uKGNtKTt9CmlmKGhhc0hhbmRsZXIodGhpcywiY2xlYXIiKSl7dmFyIGZvdW5kPXRoaXMuZmluZCgpO2lmKGZvdW5kKXtzaWduYWxMYXRlcih0aGlzLCJjbGVhciIsZm91bmQuZnJvbSxmb3VuZC50byk7fX0KdmFyIG1pbj1udWxsLG1heD1udWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5saW5lcy5sZW5ndGg7KytpKXt2YXIgbGluZT10aGlzJDEubGluZXNbaV07dmFyIHNwYW49Z2V0TWFya2VkU3BhbkZvcihsaW5lLm1hcmtlZFNwYW5zLHRoaXMkMSk7aWYoY20mJiF0aGlzJDEuY29sbGFwc2VkKXtyZWdMaW5lQ2hhbmdlKGNtLGxpbmVObyhsaW5lKSwidGV4dCIpO30KZWxzZSBpZihjbSl7aWYoc3Bhbi50byE9bnVsbCl7bWF4PWxpbmVObyhsaW5lKTt9CmlmKHNwYW4uZnJvbSE9bnVsbCl7bWluPWxpbmVObyhsaW5lKTt9fQpsaW5lLm1hcmtlZFNwYW5zPXJlbW92ZU1hcmtlZFNwYW4obGluZS5tYXJrZWRTcGFucyxzcGFuKTtpZihzcGFuLmZyb209PW51bGwmJnRoaXMkMS5jb2xsYXBzZWQmJiFsaW5lSXNIaWRkZW4odGhpcyQxLmRvYyxsaW5lKSYmY20pCnt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsdGV4dEhlaWdodChjbS5kaXNwbGF5KSk7fX0KaWYoY20mJnRoaXMuY29sbGFwc2VkJiYhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpe2Zvcih2YXIgaSQxPTA7aSQxPHRoaXMubGluZXMubGVuZ3RoOysraSQxKXt2YXIgdmlzdWFsPXZpc3VhbExpbmUodGhpcyQxLmxpbmVzW2kkMV0pLGxlbj1saW5lTGVuZ3RoKHZpc3VhbCk7aWYobGVuPmNtLmRpc3BsYXkubWF4TGluZUxlbmd0aCl7Y20uZGlzcGxheS5tYXhMaW5lPXZpc3VhbDtjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGg9bGVuO2NtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQ9dHJ1ZTt9fX0KaWYobWluIT1udWxsJiZjbSYmdGhpcy5jb2xsYXBzZWQpe3JlZ0NoYW5nZShjbSxtaW4sbWF4KzEpO30KdGhpcy5saW5lcy5sZW5ndGg9MDt0aGlzLmV4cGxpY2l0bHlDbGVhcmVkPXRydWU7aWYodGhpcy5hdG9taWMmJnRoaXMuZG9jLmNhbnRFZGl0KXt0aGlzLmRvYy5jYW50RWRpdD1mYWxzZTtpZihjbSl7cmVDaGVja1NlbGVjdGlvbihjbS5kb2MpO319CmlmKGNtKXtzaWduYWxMYXRlcihjbSwibWFya2VyQ2xlYXJlZCIsY20sdGhpcyxtaW4sbWF4KTt9CmlmKHdpdGhPcCl7ZW5kT3BlcmF0aW9uKGNtKTt9CmlmKHRoaXMucGFyZW50KXt0aGlzLnBhcmVudC5jbGVhcigpO319O1RleHRNYXJrZXIucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24oc2lkZSxsaW5lT2JqKXt2YXIgdGhpcyQxPXRoaXM7aWYoc2lkZT09bnVsbCYmdGhpcy50eXBlPT0iYm9va21hcmsiKXtzaWRlPTE7fQp2YXIgZnJvbSx0bztmb3IodmFyIGk9MDtpPHRoaXMubGluZXMubGVuZ3RoOysraSl7dmFyIGxpbmU9dGhpcyQxLmxpbmVzW2ldO3ZhciBzcGFuPWdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucyx0aGlzJDEpO2lmKHNwYW4uZnJvbSE9bnVsbCl7ZnJvbT1Qb3MobGluZU9iaj9saW5lOmxpbmVObyhsaW5lKSxzcGFuLmZyb20pO2lmKHNpZGU9PS0xKXtyZXR1cm4gZnJvbX19CmlmKHNwYW4udG8hPW51bGwpe3RvPVBvcyhsaW5lT2JqP2xpbmU6bGluZU5vKGxpbmUpLHNwYW4udG8pO2lmKHNpZGU9PTEpe3JldHVybiB0b319fQpyZXR1cm4gZnJvbSYme2Zyb206ZnJvbSx0bzp0b319O1RleHRNYXJrZXIucHJvdG90eXBlLmNoYW5nZWQ9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7dmFyIHBvcz10aGlzLmZpbmQoLTEsdHJ1ZSksd2lkZ2V0PXRoaXMsY209dGhpcy5kb2MuY207aWYoIXBvc3x8IWNtKXtyZXR1cm59CnJ1bkluT3AoY20sZnVuY3Rpb24oKXt2YXIgbGluZT1wb3MubGluZSxsaW5lTj1saW5lTm8ocG9zLmxpbmUpO3ZhciB2aWV3PWZpbmRWaWV3Rm9yTGluZShjbSxsaW5lTik7aWYodmlldyl7Y2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcih2aWV3KTtjbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkPWNtLmN1ck9wLmZvcmNlVXBkYXRlPXRydWU7fQpjbS5jdXJPcC51cGRhdGVNYXhMaW5lPXRydWU7aWYoIWxpbmVJc0hpZGRlbih3aWRnZXQuZG9jLGxpbmUpJiZ3aWRnZXQuaGVpZ2h0IT1udWxsKXt2YXIgb2xkSGVpZ2h0PXdpZGdldC5oZWlnaHQ7d2lkZ2V0LmhlaWdodD1udWxsO3ZhciBkSGVpZ2h0PXdpZGdldEhlaWdodCh3aWRnZXQpLW9sZEhlaWdodDtpZihkSGVpZ2h0KQp7dXBkYXRlTGluZUhlaWdodChsaW5lLGxpbmUuaGVpZ2h0K2RIZWlnaHQpO319CnNpZ25hbExhdGVyKGNtLCJtYXJrZXJDaGFuZ2VkIixjbSx0aGlzJDEpO30pO307VGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZT1mdW5jdGlvbihsaW5lKXtpZighdGhpcy5saW5lcy5sZW5ndGgmJnRoaXMuZG9jLmNtKXt2YXIgb3A9dGhpcy5kb2MuY20uY3VyT3A7aWYoIW9wLm1heWJlSGlkZGVuTWFya2Vyc3x8aW5kZXhPZihvcC5tYXliZUhpZGRlbk1hcmtlcnMsdGhpcyk9PS0xKQp7KG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzfHwob3AubWF5YmVVbmhpZGRlbk1hcmtlcnM9W10pKS5wdXNoKHRoaXMpO319CnRoaXMubGluZXMucHVzaChsaW5lKTt9O1RleHRNYXJrZXIucHJvdG90eXBlLmRldGFjaExpbmU9ZnVuY3Rpb24obGluZSl7dGhpcy5saW5lcy5zcGxpY2UoaW5kZXhPZih0aGlzLmxpbmVzLGxpbmUpLDEpO2lmKCF0aGlzLmxpbmVzLmxlbmd0aCYmdGhpcy5kb2MuY20pe3ZhciBvcD10aGlzLmRvYy5jbS5jdXJPcDsob3AubWF5YmVIaWRkZW5NYXJrZXJzfHwob3AubWF5YmVIaWRkZW5NYXJrZXJzPVtdKSkucHVzaCh0aGlzKTt9fTtldmVudE1peGluKFRleHRNYXJrZXIpO2Z1bmN0aW9uIG1hcmtUZXh0KGRvYyxmcm9tLHRvLG9wdGlvbnMsdHlwZSl7aWYob3B0aW9ucyYmb3B0aW9ucy5zaGFyZWQpe3JldHVybiBtYXJrVGV4dFNoYXJlZChkb2MsZnJvbSx0byxvcHRpb25zLHR5cGUpfQppZihkb2MuY20mJiFkb2MuY20uY3VyT3Ape3JldHVybiBvcGVyYXRpb24oZG9jLmNtLG1hcmtUZXh0KShkb2MsZnJvbSx0byxvcHRpb25zLHR5cGUpfQp2YXIgbWFya2VyPW5ldyBUZXh0TWFya2VyKGRvYyx0eXBlKSxkaWZmPWNtcChmcm9tLHRvKTtpZihvcHRpb25zKXtjb3B5T2JqKG9wdGlvbnMsbWFya2VyLGZhbHNlKTt9CmlmKGRpZmY+MHx8ZGlmZj09MCYmbWFya2VyLmNsZWFyV2hlbkVtcHR5IT09ZmFsc2UpCntyZXR1cm4gbWFya2VyfQppZihtYXJrZXIucmVwbGFjZWRXaXRoKXttYXJrZXIuY29sbGFwc2VkPXRydWU7bWFya2VyLndpZGdldE5vZGU9ZWx0UCgic3BhbiIsW21hcmtlci5yZXBsYWNlZFdpdGhdLCJDb2RlTWlycm9yLXdpZGdldCIpO2lmKCFvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzKXttYXJrZXIud2lkZ2V0Tm9kZS5zZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiLCJ0cnVlIik7fQppZihvcHRpb25zLmluc2VydExlZnQpe21hcmtlci53aWRnZXROb2RlLmluc2VydExlZnQ9dHJ1ZTt9fQppZihtYXJrZXIuY29sbGFwc2VkKXtpZihjb25mbGljdGluZ0NvbGxhcHNlZFJhbmdlKGRvYyxmcm9tLmxpbmUsZnJvbSx0byxtYXJrZXIpfHxmcm9tLmxpbmUhPXRvLmxpbmUmJmNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLHRvLmxpbmUsZnJvbSx0byxtYXJrZXIpKQp7dGhyb3cgbmV3IEVycm9yKCJJbnNlcnRpbmcgY29sbGFwc2VkIG1hcmtlciBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgYW4gZXhpc3Rpbmcgb25lIil9CnNlZUNvbGxhcHNlZFNwYW5zKCk7fQppZihtYXJrZXIuYWRkVG9IaXN0b3J5KQp7YWRkQ2hhbmdlVG9IaXN0b3J5KGRvYyx7ZnJvbTpmcm9tLHRvOnRvLG9yaWdpbjoibWFya1RleHQifSxkb2Muc2VsLE5hTik7fQp2YXIgY3VyTGluZT1mcm9tLmxpbmUsY209ZG9jLmNtLHVwZGF0ZU1heExpbmU7ZG9jLml0ZXIoY3VyTGluZSx0by5saW5lKzEsZnVuY3Rpb24obGluZSl7aWYoY20mJm1hcmtlci5jb2xsYXBzZWQmJiFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyYmdmlzdWFsTGluZShsaW5lKT09Y20uZGlzcGxheS5tYXhMaW5lKQp7dXBkYXRlTWF4TGluZT10cnVlO30KaWYobWFya2VyLmNvbGxhcHNlZCYmY3VyTGluZSE9ZnJvbS5saW5lKXt1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsMCk7fQphZGRNYXJrZWRTcGFuKGxpbmUsbmV3IE1hcmtlZFNwYW4obWFya2VyLGN1ckxpbmU9PWZyb20ubGluZT9mcm9tLmNoOm51bGwsY3VyTGluZT09dG8ubGluZT90by5jaDpudWxsKSk7KytjdXJMaW5lO30pO2lmKG1hcmtlci5jb2xsYXBzZWQpe2RvYy5pdGVyKGZyb20ubGluZSx0by5saW5lKzEsZnVuY3Rpb24obGluZSl7aWYobGluZUlzSGlkZGVuKGRvYyxsaW5lKSl7dXBkYXRlTGluZUhlaWdodChsaW5lLDApO319KTt9CmlmKG1hcmtlci5jbGVhck9uRW50ZXIpe29uKG1hcmtlciwiYmVmb3JlQ3Vyc29yRW50ZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG1hcmtlci5jbGVhcigpO30pO30KaWYobWFya2VyLnJlYWRPbmx5KXtzZWVSZWFkT25seVNwYW5zKCk7aWYoZG9jLmhpc3RvcnkuZG9uZS5sZW5ndGh8fGRvYy5oaXN0b3J5LnVuZG9uZS5sZW5ndGgpCntkb2MuY2xlYXJIaXN0b3J5KCk7fX0KaWYobWFya2VyLmNvbGxhcHNlZCl7bWFya2VyLmlkPSsrbmV4dE1hcmtlcklkO21hcmtlci5hdG9taWM9dHJ1ZTt9CmlmKGNtKXtpZih1cGRhdGVNYXhMaW5lKXtjbS5jdXJPcC51cGRhdGVNYXhMaW5lPXRydWU7fQppZihtYXJrZXIuY29sbGFwc2VkKQp7cmVnQ2hhbmdlKGNtLGZyb20ubGluZSx0by5saW5lKzEpO30KZWxzZSBpZihtYXJrZXIuY2xhc3NOYW1lfHxtYXJrZXIudGl0bGV8fG1hcmtlci5zdGFydFN0eWxlfHxtYXJrZXIuZW5kU3R5bGV8fG1hcmtlci5jc3MpCntmb3IodmFyIGk9ZnJvbS5saW5lO2k8PXRvLmxpbmU7aSsrKXtyZWdMaW5lQ2hhbmdlKGNtLGksInRleHQiKTt9fQppZihtYXJrZXIuYXRvbWljKXtyZUNoZWNrU2VsZWN0aW9uKGNtLmRvYyk7fQpzaWduYWxMYXRlcihjbSwibWFya2VyQWRkZWQiLGNtLG1hcmtlcik7fQpyZXR1cm4gbWFya2VyfQp2YXIgU2hhcmVkVGV4dE1hcmtlcj1mdW5jdGlvbihtYXJrZXJzLHByaW1hcnkpe3ZhciB0aGlzJDE9dGhpczt0aGlzLm1hcmtlcnM9bWFya2Vyczt0aGlzLnByaW1hcnk9cHJpbWFyeTtmb3IodmFyIGk9MDtpPG1hcmtlcnMubGVuZ3RoOysraSkKe21hcmtlcnNbaV0ucGFyZW50PXRoaXMkMTt9fTtTaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpcztpZih0aGlzLmV4cGxpY2l0bHlDbGVhcmVkKXtyZXR1cm59CnRoaXMuZXhwbGljaXRseUNsZWFyZWQ9dHJ1ZTtmb3IodmFyIGk9MDtpPHRoaXMubWFya2Vycy5sZW5ndGg7KytpKQp7dGhpcyQxLm1hcmtlcnNbaV0uY2xlYXIoKTt9CnNpZ25hbExhdGVyKHRoaXMsImNsZWFyIik7fTtTaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHNpZGUsbGluZU9iail7cmV0dXJuIHRoaXMucHJpbWFyeS5maW5kKHNpZGUsbGluZU9iail9O2V2ZW50TWl4aW4oU2hhcmVkVGV4dE1hcmtlcik7ZnVuY3Rpb24gbWFya1RleHRTaGFyZWQoZG9jLGZyb20sdG8sb3B0aW9ucyx0eXBlKXtvcHRpb25zPWNvcHlPYmoob3B0aW9ucyk7b3B0aW9ucy5zaGFyZWQ9ZmFsc2U7dmFyIG1hcmtlcnM9W21hcmtUZXh0KGRvYyxmcm9tLHRvLG9wdGlvbnMsdHlwZSldLHByaW1hcnk9bWFya2Vyc1swXTt2YXIgd2lkZ2V0PW9wdGlvbnMud2lkZ2V0Tm9kZTtsaW5rZWREb2NzKGRvYyxmdW5jdGlvbihkb2Mpe2lmKHdpZGdldCl7b3B0aW9ucy53aWRnZXROb2RlPXdpZGdldC5jbG9uZU5vZGUodHJ1ZSk7fQptYXJrZXJzLnB1c2gobWFya1RleHQoZG9jLGNsaXBQb3MoZG9jLGZyb20pLGNsaXBQb3MoZG9jLHRvKSxvcHRpb25zLHR5cGUpKTtmb3IodmFyIGk9MDtpPGRvYy5saW5rZWQubGVuZ3RoOysraSkKe2lmKGRvYy5saW5rZWRbaV0uaXNQYXJlbnQpe3JldHVybn19CnByaW1hcnk9bHN0KG1hcmtlcnMpO30pO3JldHVybiBuZXcgU2hhcmVkVGV4dE1hcmtlcihtYXJrZXJzLHByaW1hcnkpfQpmdW5jdGlvbiBmaW5kU2hhcmVkTWFya2Vycyhkb2Mpe3JldHVybiBkb2MuZmluZE1hcmtzKFBvcyhkb2MuZmlyc3QsMCksZG9jLmNsaXBQb3MoUG9zKGRvYy5sYXN0TGluZSgpKSksZnVuY3Rpb24obSl7cmV0dXJuIG0ucGFyZW50O30pfQpmdW5jdGlvbiBjb3B5U2hhcmVkTWFya2Vycyhkb2MsbWFya2Vycyl7Zm9yKHZhciBpPTA7aTxtYXJrZXJzLmxlbmd0aDtpKyspe3ZhciBtYXJrZXI9bWFya2Vyc1tpXSxwb3M9bWFya2VyLmZpbmQoKTt2YXIgbUZyb209ZG9jLmNsaXBQb3MocG9zLmZyb20pLG1Ubz1kb2MuY2xpcFBvcyhwb3MudG8pO2lmKGNtcChtRnJvbSxtVG8pKXt2YXIgc3ViTWFyaz1tYXJrVGV4dChkb2MsbUZyb20sbVRvLG1hcmtlci5wcmltYXJ5LG1hcmtlci5wcmltYXJ5LnR5cGUpO21hcmtlci5tYXJrZXJzLnB1c2goc3ViTWFyayk7c3ViTWFyay5wYXJlbnQ9bWFya2VyO319fQpmdW5jdGlvbiBkZXRhY2hTaGFyZWRNYXJrZXJzKG1hcmtlcnMpe3ZhciBsb29wPWZ1bmN0aW9uKGkpe3ZhciBtYXJrZXI9bWFya2Vyc1tpXSxsaW5rZWQ9W21hcmtlci5wcmltYXJ5LmRvY107bGlua2VkRG9jcyhtYXJrZXIucHJpbWFyeS5kb2MsZnVuY3Rpb24oZCl7cmV0dXJuIGxpbmtlZC5wdXNoKGQpO30pO2Zvcih2YXIgaj0wO2o8bWFya2VyLm1hcmtlcnMubGVuZ3RoO2orKyl7dmFyIHN1Yk1hcmtlcj1tYXJrZXIubWFya2Vyc1tqXTtpZihpbmRleE9mKGxpbmtlZCxzdWJNYXJrZXIuZG9jKT09LTEpe3N1Yk1hcmtlci5wYXJlbnQ9bnVsbDttYXJrZXIubWFya2Vycy5zcGxpY2Uoai0tLDEpO319fTtmb3IodmFyIGk9MDtpPG1hcmtlcnMubGVuZ3RoO2krKylsb29wKGkpO30KdmFyIG5leHREb2NJZD0wO3ZhciBEb2M9ZnVuY3Rpb24odGV4dCxtb2RlLGZpcnN0TGluZSxsaW5lU2VwLGRpcmVjdGlvbil7aWYoISh0aGlzIGluc3RhbmNlb2YgRG9jKSl7cmV0dXJuIG5ldyBEb2ModGV4dCxtb2RlLGZpcnN0TGluZSxsaW5lU2VwLGRpcmVjdGlvbil9CmlmKGZpcnN0TGluZT09bnVsbCl7Zmlyc3RMaW5lPTA7fQpCcmFuY2hDaHVuay5jYWxsKHRoaXMsW25ldyBMZWFmQ2h1bmsoW25ldyBMaW5lKCIiLG51bGwpXSldKTt0aGlzLmZpcnN0PWZpcnN0TGluZTt0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbExlZnQ9MDt0aGlzLmNhbnRFZGl0PWZhbHNlO3RoaXMuY2xlYW5HZW5lcmF0aW9uPTE7dGhpcy5tb2RlRnJvbnRpZXI9dGhpcy5oaWdobGlnaHRGcm9udGllcj1maXJzdExpbmU7dmFyIHN0YXJ0PVBvcyhmaXJzdExpbmUsMCk7dGhpcy5zZWw9c2ltcGxlU2VsZWN0aW9uKHN0YXJ0KTt0aGlzLmhpc3Rvcnk9bmV3IEhpc3RvcnkobnVsbCk7dGhpcy5pZD0rK25leHREb2NJZDt0aGlzLm1vZGVPcHRpb249bW9kZTt0aGlzLmxpbmVTZXA9bGluZVNlcDt0aGlzLmRpcmVjdGlvbj0oZGlyZWN0aW9uPT0icnRsIik/InJ0bCI6Imx0ciI7dGhpcy5leHRlbmQ9ZmFsc2U7aWYodHlwZW9mIHRleHQ9PSJzdHJpbmciKXt0ZXh0PXRoaXMuc3BsaXRMaW5lcyh0ZXh0KTt9CnVwZGF0ZURvYyh0aGlzLHtmcm9tOnN0YXJ0LHRvOnN0YXJ0LHRleHQ6dGV4dH0pO3NldFNlbGVjdGlvbih0aGlzLHNpbXBsZVNlbGVjdGlvbihzdGFydCksc2VsX2RvbnRTY3JvbGwpO307RG9jLnByb3RvdHlwZT1jcmVhdGVPYmooQnJhbmNoQ2h1bmsucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpEb2MsaXRlcjpmdW5jdGlvbihmcm9tLHRvLG9wKXtpZihvcCl7dGhpcy5pdGVyTihmcm9tLXRoaXMuZmlyc3QsdG8tZnJvbSxvcCk7fQplbHNle3RoaXMuaXRlck4odGhpcy5maXJzdCx0aGlzLmZpcnN0K3RoaXMuc2l6ZSxmcm9tKTt9fSxpbnNlcnQ6ZnVuY3Rpb24oYXQsbGluZXMpe3ZhciBoZWlnaHQ9MDtmb3IodmFyIGk9MDtpPGxpbmVzLmxlbmd0aDsrK2kpe2hlaWdodCs9bGluZXNbaV0uaGVpZ2h0O30KdGhpcy5pbnNlcnRJbm5lcihhdC10aGlzLmZpcnN0LGxpbmVzLGhlaWdodCk7fSxyZW1vdmU6ZnVuY3Rpb24oYXQsbil7dGhpcy5yZW1vdmVJbm5lcihhdC10aGlzLmZpcnN0LG4pO30sZ2V0VmFsdWU6ZnVuY3Rpb24obGluZVNlcCl7dmFyIGxpbmVzPWdldExpbmVzKHRoaXMsdGhpcy5maXJzdCx0aGlzLmZpcnN0K3RoaXMuc2l6ZSk7aWYobGluZVNlcD09PWZhbHNlKXtyZXR1cm4gbGluZXN9CnJldHVybiBsaW5lcy5qb2luKGxpbmVTZXB8fHRoaXMubGluZVNlcGFyYXRvcigpKX0sc2V0VmFsdWU6ZG9jTWV0aG9kT3AoZnVuY3Rpb24oY29kZSl7dmFyIHRvcD1Qb3ModGhpcy5maXJzdCwwKSxsYXN0PXRoaXMuZmlyc3QrdGhpcy5zaXplLTE7bWFrZUNoYW5nZSh0aGlzLHtmcm9tOnRvcCx0bzpQb3MobGFzdCxnZXRMaW5lKHRoaXMsbGFzdCkudGV4dC5sZW5ndGgpLHRleHQ6dGhpcy5zcGxpdExpbmVzKGNvZGUpLG9yaWdpbjoic2V0VmFsdWUiLGZ1bGw6dHJ1ZX0sdHJ1ZSk7aWYodGhpcy5jbSl7c2Nyb2xsVG9Db29yZHModGhpcy5jbSwwLDApO30Kc2V0U2VsZWN0aW9uKHRoaXMsc2ltcGxlU2VsZWN0aW9uKHRvcCksc2VsX2RvbnRTY3JvbGwpO30pLHJlcGxhY2VSYW5nZTpmdW5jdGlvbihjb2RlLGZyb20sdG8sb3JpZ2luKXtmcm9tPWNsaXBQb3ModGhpcyxmcm9tKTt0bz10bz9jbGlwUG9zKHRoaXMsdG8pOmZyb207cmVwbGFjZVJhbmdlKHRoaXMsY29kZSxmcm9tLHRvLG9yaWdpbik7fSxnZXRSYW5nZTpmdW5jdGlvbihmcm9tLHRvLGxpbmVTZXApe3ZhciBsaW5lcz1nZXRCZXR3ZWVuKHRoaXMsY2xpcFBvcyh0aGlzLGZyb20pLGNsaXBQb3ModGhpcyx0bykpO2lmKGxpbmVTZXA9PT1mYWxzZSl7cmV0dXJuIGxpbmVzfQpyZXR1cm4gbGluZXMuam9pbihsaW5lU2VwfHx0aGlzLmxpbmVTZXBhcmF0b3IoKSl9LGdldExpbmU6ZnVuY3Rpb24obGluZSl7dmFyIGw9dGhpcy5nZXRMaW5lSGFuZGxlKGxpbmUpO3JldHVybiBsJiZsLnRleHR9LGdldExpbmVIYW5kbGU6ZnVuY3Rpb24obGluZSl7aWYoaXNMaW5lKHRoaXMsbGluZSkpe3JldHVybiBnZXRMaW5lKHRoaXMsbGluZSl9fSxnZXRMaW5lTnVtYmVyOmZ1bmN0aW9uKGxpbmUpe3JldHVybiBsaW5lTm8obGluZSl9LGdldExpbmVIYW5kbGVWaXN1YWxTdGFydDpmdW5jdGlvbihsaW5lKXtpZih0eXBlb2YgbGluZT09Im51bWJlciIpe2xpbmU9Z2V0TGluZSh0aGlzLGxpbmUpO30KcmV0dXJuIHZpc3VhbExpbmUobGluZSl9LGxpbmVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemV9LGZpcnN0TGluZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpcnN0fSxsYXN0TGluZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpcnN0K3RoaXMuc2l6ZS0xfSxjbGlwUG9zOmZ1bmN0aW9uKHBvcyl7cmV0dXJuIGNsaXBQb3ModGhpcyxwb3MpfSxnZXRDdXJzb3I6ZnVuY3Rpb24oc3RhcnQpe3ZhciByYW5nZSQkMT10aGlzLnNlbC5wcmltYXJ5KCkscG9zO2lmKHN0YXJ0PT1udWxsfHxzdGFydD09ImhlYWQiKXtwb3M9cmFuZ2UkJDEuaGVhZDt9CmVsc2UgaWYoc3RhcnQ9PSJhbmNob3IiKXtwb3M9cmFuZ2UkJDEuYW5jaG9yO30KZWxzZSBpZihzdGFydD09ImVuZCJ8fHN0YXJ0PT0idG8ifHxzdGFydD09PWZhbHNlKXtwb3M9cmFuZ2UkJDEudG8oKTt9CmVsc2V7cG9zPXJhbmdlJCQxLmZyb20oKTt9CnJldHVybiBwb3N9LGxpc3RTZWxlY3Rpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsLnJhbmdlc30sc29tZXRoaW5nU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWwuc29tZXRoaW5nU2VsZWN0ZWQoKX0sc2V0Q3Vyc29yOmRvY01ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsY2gsb3B0aW9ucyl7c2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsY2xpcFBvcyh0aGlzLHR5cGVvZiBsaW5lPT0ibnVtYmVyIj9Qb3MobGluZSxjaHx8MCk6bGluZSksbnVsbCxvcHRpb25zKTt9KSxzZXRTZWxlY3Rpb246ZG9jTWV0aG9kT3AoZnVuY3Rpb24oYW5jaG9yLGhlYWQsb3B0aW9ucyl7c2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsY2xpcFBvcyh0aGlzLGFuY2hvciksY2xpcFBvcyh0aGlzLGhlYWR8fGFuY2hvciksb3B0aW9ucyk7fSksZXh0ZW5kU2VsZWN0aW9uOmRvY01ldGhvZE9wKGZ1bmN0aW9uKGhlYWQsb3RoZXIsb3B0aW9ucyl7ZXh0ZW5kU2VsZWN0aW9uKHRoaXMsY2xpcFBvcyh0aGlzLGhlYWQpLG90aGVyJiZjbGlwUG9zKHRoaXMsb3RoZXIpLG9wdGlvbnMpO30pLGV4dGVuZFNlbGVjdGlvbnM6ZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZHMsb3B0aW9ucyl7ZXh0ZW5kU2VsZWN0aW9ucyh0aGlzLGNsaXBQb3NBcnJheSh0aGlzLGhlYWRzKSxvcHRpb25zKTt9KSxleHRlbmRTZWxlY3Rpb25zQnk6ZG9jTWV0aG9kT3AoZnVuY3Rpb24oZixvcHRpb25zKXt2YXIgaGVhZHM9bWFwKHRoaXMuc2VsLnJhbmdlcyxmKTtleHRlbmRTZWxlY3Rpb25zKHRoaXMsY2xpcFBvc0FycmF5KHRoaXMsaGVhZHMpLG9wdGlvbnMpO30pLHNldFNlbGVjdGlvbnM6ZG9jTWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2VzLHByaW1hcnksb3B0aW9ucyl7dmFyIHRoaXMkMT10aGlzO2lmKCFyYW5nZXMubGVuZ3RoKXtyZXR1cm59CnZhciBvdXQ9W107Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKykKe291dFtpXT1uZXcgUmFuZ2UoY2xpcFBvcyh0aGlzJDEscmFuZ2VzW2ldLmFuY2hvciksY2xpcFBvcyh0aGlzJDEscmFuZ2VzW2ldLmhlYWQpKTt9CmlmKHByaW1hcnk9PW51bGwpe3ByaW1hcnk9TWF0aC5taW4ocmFuZ2VzLmxlbmd0aC0xLHRoaXMuc2VsLnByaW1JbmRleCk7fQpzZXRTZWxlY3Rpb24odGhpcyxub3JtYWxpemVTZWxlY3Rpb24ob3V0LHByaW1hcnkpLG9wdGlvbnMpO30pLGFkZFNlbGVjdGlvbjpkb2NNZXRob2RPcChmdW5jdGlvbihhbmNob3IsaGVhZCxvcHRpb25zKXt2YXIgcmFuZ2VzPXRoaXMuc2VsLnJhbmdlcy5zbGljZSgwKTtyYW5nZXMucHVzaChuZXcgUmFuZ2UoY2xpcFBvcyh0aGlzLGFuY2hvciksY2xpcFBvcyh0aGlzLGhlYWR8fGFuY2hvcikpKTtzZXRTZWxlY3Rpb24odGhpcyxub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLHJhbmdlcy5sZW5ndGgtMSksb3B0aW9ucyk7fSksZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGxpbmVTZXApe3ZhciB0aGlzJDE9dGhpczt2YXIgcmFuZ2VzPXRoaXMuc2VsLnJhbmdlcyxsaW5lcztmb3IodmFyIGk9MDtpPHJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgc2VsPWdldEJldHdlZW4odGhpcyQxLHJhbmdlc1tpXS5mcm9tKCkscmFuZ2VzW2ldLnRvKCkpO2xpbmVzPWxpbmVzP2xpbmVzLmNvbmNhdChzZWwpOnNlbDt9CmlmKGxpbmVTZXA9PT1mYWxzZSl7cmV0dXJuIGxpbmVzfQplbHNle3JldHVybiBsaW5lcy5qb2luKGxpbmVTZXB8fHRoaXMubGluZVNlcGFyYXRvcigpKX19LGdldFNlbGVjdGlvbnM6ZnVuY3Rpb24obGluZVNlcCl7dmFyIHRoaXMkMT10aGlzO3ZhciBwYXJ0cz1bXSxyYW5nZXM9dGhpcy5zZWwucmFuZ2VzO2Zvcih2YXIgaT0wO2k8cmFuZ2VzLmxlbmd0aDtpKyspe3ZhciBzZWw9Z2V0QmV0d2Vlbih0aGlzJDEscmFuZ2VzW2ldLmZyb20oKSxyYW5nZXNbaV0udG8oKSk7aWYobGluZVNlcCE9PWZhbHNlKXtzZWw9c2VsLmpvaW4obGluZVNlcHx8dGhpcyQxLmxpbmVTZXBhcmF0b3IoKSk7fQpwYXJ0c1tpXT1zZWw7fQpyZXR1cm4gcGFydHN9LHJlcGxhY2VTZWxlY3Rpb246ZnVuY3Rpb24oY29kZSxjb2xsYXBzZSxvcmlnaW4pe3ZhciBkdXA9W107Zm9yKHZhciBpPTA7aTx0aGlzLnNlbC5yYW5nZXMubGVuZ3RoO2krKykKe2R1cFtpXT1jb2RlO30KdGhpcy5yZXBsYWNlU2VsZWN0aW9ucyhkdXAsY29sbGFwc2Usb3JpZ2lufHwiK2lucHV0Iik7fSxyZXBsYWNlU2VsZWN0aW9uczpkb2NNZXRob2RPcChmdW5jdGlvbihjb2RlLGNvbGxhcHNlLG9yaWdpbil7dmFyIHRoaXMkMT10aGlzO3ZhciBjaGFuZ2VzPVtdLHNlbD10aGlzLnNlbDtmb3IodmFyIGk9MDtpPHNlbC5yYW5nZXMubGVuZ3RoO2krKyl7dmFyIHJhbmdlJCQxPXNlbC5yYW5nZXNbaV07Y2hhbmdlc1tpXT17ZnJvbTpyYW5nZSQkMS5mcm9tKCksdG86cmFuZ2UkJDEudG8oKSx0ZXh0OnRoaXMkMS5zcGxpdExpbmVzKGNvZGVbaV0pLG9yaWdpbjpvcmlnaW59O30KdmFyIG5ld1NlbD1jb2xsYXBzZSYmY29sbGFwc2UhPSJlbmQiJiZjb21wdXRlUmVwbGFjZWRTZWwodGhpcyxjaGFuZ2VzLGNvbGxhcHNlKTtmb3IodmFyIGkkMT1jaGFuZ2VzLmxlbmd0aC0xO2kkMT49MDtpJDEtLSkKe21ha2VDaGFuZ2UodGhpcyQxLGNoYW5nZXNbaSQxXSk7fQppZihuZXdTZWwpe3NldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KHRoaXMsbmV3U2VsKTt9CmVsc2UgaWYodGhpcy5jbSl7ZW5zdXJlQ3Vyc29yVmlzaWJsZSh0aGlzLmNtKTt9fSksdW5kbzpkb2NNZXRob2RPcChmdW5jdGlvbigpe21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCJ1bmRvIik7fSkscmVkbzpkb2NNZXRob2RPcChmdW5jdGlvbigpe21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCJyZWRvIik7fSksdW5kb1NlbGVjdGlvbjpkb2NNZXRob2RPcChmdW5jdGlvbigpe21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCJ1bmRvIix0cnVlKTt9KSxyZWRvU2VsZWN0aW9uOmRvY01ldGhvZE9wKGZ1bmN0aW9uKCl7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsInJlZG8iLHRydWUpO30pLHNldEV4dGVuZGluZzpmdW5jdGlvbih2YWwpe3RoaXMuZXh0ZW5kPXZhbDt9LGdldEV4dGVuZGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4dGVuZH0saGlzdG9yeVNpemU6ZnVuY3Rpb24oKXt2YXIgaGlzdD10aGlzLmhpc3RvcnksZG9uZT0wLHVuZG9uZT0wO2Zvcih2YXIgaT0wO2k8aGlzdC5kb25lLmxlbmd0aDtpKyspe2lmKCFoaXN0LmRvbmVbaV0ucmFuZ2VzKXsrK2RvbmU7fX0KZm9yKHZhciBpJDE9MDtpJDE8aGlzdC51bmRvbmUubGVuZ3RoO2kkMSsrKXtpZighaGlzdC51bmRvbmVbaSQxXS5yYW5nZXMpeysrdW5kb25lO319CnJldHVybnt1bmRvOmRvbmUscmVkbzp1bmRvbmV9fSxjbGVhckhpc3Rvcnk6ZnVuY3Rpb24oKXt0aGlzLmhpc3Rvcnk9bmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pO30sbWFya0NsZWFuOmZ1bmN0aW9uKCl7dGhpcy5jbGVhbkdlbmVyYXRpb249dGhpcy5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpO30sY2hhbmdlR2VuZXJhdGlvbjpmdW5jdGlvbihmb3JjZVNwbGl0KXtpZihmb3JjZVNwbGl0KQp7dGhpcy5oaXN0b3J5Lmxhc3RPcD10aGlzLmhpc3RvcnkubGFzdFNlbE9wPXRoaXMuaGlzdG9yeS5sYXN0T3JpZ2luPW51bGw7fQpyZXR1cm4gdGhpcy5oaXN0b3J5LmdlbmVyYXRpb259LGlzQ2xlYW46ZnVuY3Rpb24oZ2VuKXtyZXR1cm4gdGhpcy5oaXN0b3J5LmdlbmVyYXRpb249PShnZW58fHRoaXMuY2xlYW5HZW5lcmF0aW9uKX0sZ2V0SGlzdG9yeTpmdW5jdGlvbigpe3JldHVybntkb25lOmNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LmRvbmUpLHVuZG9uZTpjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUpfX0sc2V0SGlzdG9yeTpmdW5jdGlvbihoaXN0RGF0YSl7dmFyIGhpc3Q9dGhpcy5oaXN0b3J5PW5ldyBIaXN0b3J5KHRoaXMuaGlzdG9yeS5tYXhHZW5lcmF0aW9uKTtoaXN0LmRvbmU9Y29weUhpc3RvcnlBcnJheShoaXN0RGF0YS5kb25lLnNsaWNlKDApLG51bGwsdHJ1ZSk7aGlzdC51bmRvbmU9Y29weUhpc3RvcnlBcnJheShoaXN0RGF0YS51bmRvbmUuc2xpY2UoMCksbnVsbCx0cnVlKTt9LHNldEd1dHRlck1hcmtlcjpkb2NNZXRob2RPcChmdW5jdGlvbihsaW5lLGd1dHRlcklELHZhbHVlKXtyZXR1cm4gY2hhbmdlTGluZSh0aGlzLGxpbmUsImd1dHRlciIsZnVuY3Rpb24obGluZSl7dmFyIG1hcmtlcnM9bGluZS5ndXR0ZXJNYXJrZXJzfHwobGluZS5ndXR0ZXJNYXJrZXJzPXt9KTttYXJrZXJzW2d1dHRlcklEXT12YWx1ZTtpZighdmFsdWUmJmlzRW1wdHkobWFya2Vycykpe2xpbmUuZ3V0dGVyTWFya2Vycz1udWxsO30KcmV0dXJuIHRydWV9KX0pLGNsZWFyR3V0dGVyOmRvY01ldGhvZE9wKGZ1bmN0aW9uKGd1dHRlcklEKXt2YXIgdGhpcyQxPXRoaXM7dGhpcy5pdGVyKGZ1bmN0aW9uKGxpbmUpe2lmKGxpbmUuZ3V0dGVyTWFya2VycyYmbGluZS5ndXR0ZXJNYXJrZXJzW2d1dHRlcklEXSl7Y2hhbmdlTGluZSh0aGlzJDEsbGluZSwiZ3V0dGVyIixmdW5jdGlvbigpe2xpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF09bnVsbDtpZihpc0VtcHR5KGxpbmUuZ3V0dGVyTWFya2Vycykpe2xpbmUuZ3V0dGVyTWFya2Vycz1udWxsO30KcmV0dXJuIHRydWV9KTt9fSk7fSksbGluZUluZm86ZnVuY3Rpb24obGluZSl7dmFyIG47aWYodHlwZW9mIGxpbmU9PSJudW1iZXIiKXtpZighaXNMaW5lKHRoaXMsbGluZSkpe3JldHVybiBudWxsfQpuPWxpbmU7bGluZT1nZXRMaW5lKHRoaXMsbGluZSk7aWYoIWxpbmUpe3JldHVybiBudWxsfX1lbHNle249bGluZU5vKGxpbmUpO2lmKG49PW51bGwpe3JldHVybiBudWxsfX0KcmV0dXJue2xpbmU6bixoYW5kbGU6bGluZSx0ZXh0OmxpbmUudGV4dCxndXR0ZXJNYXJrZXJzOmxpbmUuZ3V0dGVyTWFya2Vycyx0ZXh0Q2xhc3M6bGluZS50ZXh0Q2xhc3MsYmdDbGFzczpsaW5lLmJnQ2xhc3Msd3JhcENsYXNzOmxpbmUud3JhcENsYXNzLHdpZGdldHM6bGluZS53aWRnZXRzfX0sYWRkTGluZUNsYXNzOmRvY01ldGhvZE9wKGZ1bmN0aW9uKGhhbmRsZSx3aGVyZSxjbHMpe3JldHVybiBjaGFuZ2VMaW5lKHRoaXMsaGFuZGxlLHdoZXJlPT0iZ3V0dGVyIj8iZ3V0dGVyIjoiY2xhc3MiLGZ1bmN0aW9uKGxpbmUpe3ZhciBwcm9wPXdoZXJlPT0idGV4dCI/InRleHRDbGFzcyI6d2hlcmU9PSJiYWNrZ3JvdW5kIj8iYmdDbGFzcyI6d2hlcmU9PSJndXR0ZXIiPyJndXR0ZXJDbGFzcyI6IndyYXBDbGFzcyI7aWYoIWxpbmVbcHJvcF0pe2xpbmVbcHJvcF09Y2xzO30KZWxzZSBpZihjbGFzc1Rlc3QoY2xzKS50ZXN0KGxpbmVbcHJvcF0pKXtyZXR1cm4gZmFsc2V9CmVsc2V7bGluZVtwcm9wXSs9IiAiK2Nsczt9CnJldHVybiB0cnVlfSl9KSxyZW1vdmVMaW5lQ2xhc3M6ZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLHdoZXJlLGNscyl7cmV0dXJuIGNoYW5nZUxpbmUodGhpcyxoYW5kbGUsd2hlcmU9PSJndXR0ZXIiPyJndXR0ZXIiOiJjbGFzcyIsZnVuY3Rpb24obGluZSl7dmFyIHByb3A9d2hlcmU9PSJ0ZXh0Ij8idGV4dENsYXNzIjp3aGVyZT09ImJhY2tncm91bmQiPyJiZ0NsYXNzIjp3aGVyZT09Imd1dHRlciI/Imd1dHRlckNsYXNzIjoid3JhcENsYXNzIjt2YXIgY3VyPWxpbmVbcHJvcF07aWYoIWN1cil7cmV0dXJuIGZhbHNlfQplbHNlIGlmKGNscz09bnVsbCl7bGluZVtwcm9wXT1udWxsO30KZWxzZXt2YXIgZm91bmQ9Y3VyLm1hdGNoKGNsYXNzVGVzdChjbHMpKTtpZighZm91bmQpe3JldHVybiBmYWxzZX0KdmFyIGVuZD1mb3VuZC5pbmRleCtmb3VuZFswXS5sZW5ndGg7bGluZVtwcm9wXT1jdXIuc2xpY2UoMCxmb3VuZC5pbmRleCkrKCFmb3VuZC5pbmRleHx8ZW5kPT1jdXIubGVuZ3RoPyIiOiIgIikrY3VyLnNsaWNlKGVuZCl8fG51bGw7fQpyZXR1cm4gdHJ1ZX0pfSksYWRkTGluZVdpZGdldDpkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsbm9kZSxvcHRpb25zKXtyZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLGhhbmRsZSxub2RlLG9wdGlvbnMpfSkscmVtb3ZlTGluZVdpZGdldDpmdW5jdGlvbih3aWRnZXQpe3dpZGdldC5jbGVhcigpO30sbWFya1RleHQ6ZnVuY3Rpb24oZnJvbSx0byxvcHRpb25zKXtyZXR1cm4gbWFya1RleHQodGhpcyxjbGlwUG9zKHRoaXMsZnJvbSksY2xpcFBvcyh0aGlzLHRvKSxvcHRpb25zLG9wdGlvbnMmJm9wdGlvbnMudHlwZXx8InJhbmdlIil9LHNldEJvb2ttYXJrOmZ1bmN0aW9uKHBvcyxvcHRpb25zKXt2YXIgcmVhbE9wdHM9e3JlcGxhY2VkV2l0aDpvcHRpb25zJiYob3B0aW9ucy5ub2RlVHlwZT09bnVsbD9vcHRpb25zLndpZGdldDpvcHRpb25zKSxpbnNlcnRMZWZ0Om9wdGlvbnMmJm9wdGlvbnMuaW5zZXJ0TGVmdCxjbGVhcldoZW5FbXB0eTpmYWxzZSxzaGFyZWQ6b3B0aW9ucyYmb3B0aW9ucy5zaGFyZWQsaGFuZGxlTW91c2VFdmVudHM6b3B0aW9ucyYmb3B0aW9ucy5oYW5kbGVNb3VzZUV2ZW50c307cG9zPWNsaXBQb3ModGhpcyxwb3MpO3JldHVybiBtYXJrVGV4dCh0aGlzLHBvcyxwb3MscmVhbE9wdHMsImJvb2ttYXJrIil9LGZpbmRNYXJrc0F0OmZ1bmN0aW9uKHBvcyl7cG9zPWNsaXBQb3ModGhpcyxwb3MpO3ZhciBtYXJrZXJzPVtdLHNwYW5zPWdldExpbmUodGhpcyxwb3MubGluZSkubWFya2VkU3BhbnM7aWYoc3BhbnMpe2Zvcih2YXIgaT0wO2k8c3BhbnMubGVuZ3RoOysraSl7dmFyIHNwYW49c3BhbnNbaV07aWYoKHNwYW4uZnJvbT09bnVsbHx8c3Bhbi5mcm9tPD1wb3MuY2gpJiYoc3Bhbi50bz09bnVsbHx8c3Bhbi50bz49cG9zLmNoKSkKe21hcmtlcnMucHVzaChzcGFuLm1hcmtlci5wYXJlbnR8fHNwYW4ubWFya2VyKTt9fX0KcmV0dXJuIG1hcmtlcnN9LGZpbmRNYXJrczpmdW5jdGlvbihmcm9tLHRvLGZpbHRlcil7ZnJvbT1jbGlwUG9zKHRoaXMsZnJvbSk7dG89Y2xpcFBvcyh0aGlzLHRvKTt2YXIgZm91bmQ9W10sbGluZU5vJCQxPWZyb20ubGluZTt0aGlzLml0ZXIoZnJvbS5saW5lLHRvLmxpbmUrMSxmdW5jdGlvbihsaW5lKXt2YXIgc3BhbnM9bGluZS5tYXJrZWRTcGFucztpZihzcGFucyl7Zm9yKHZhciBpPTA7aTxzcGFucy5sZW5ndGg7aSsrKXt2YXIgc3Bhbj1zcGFuc1tpXTtpZighKHNwYW4udG8hPW51bGwmJmxpbmVObyQkMT09ZnJvbS5saW5lJiZmcm9tLmNoPj1zcGFuLnRvfHxzcGFuLmZyb209PW51bGwmJmxpbmVObyQkMSE9ZnJvbS5saW5lfHxzcGFuLmZyb20hPW51bGwmJmxpbmVObyQkMT09dG8ubGluZSYmc3Bhbi5mcm9tPj10by5jaCkmJighZmlsdGVyfHxmaWx0ZXIoc3Bhbi5tYXJrZXIpKSkKe2ZvdW5kLnB1c2goc3Bhbi5tYXJrZXIucGFyZW50fHxzcGFuLm1hcmtlcik7fX19CisrbGluZU5vJCQxO30pO3JldHVybiBmb3VuZH0sZ2V0QWxsTWFya3M6ZnVuY3Rpb24oKXt2YXIgbWFya2Vycz1bXTt0aGlzLml0ZXIoZnVuY3Rpb24obGluZSl7dmFyIHNwcz1saW5lLm1hcmtlZFNwYW5zO2lmKHNwcyl7Zm9yKHZhciBpPTA7aTxzcHMubGVuZ3RoOysraSkKe2lmKHNwc1tpXS5mcm9tIT1udWxsKXttYXJrZXJzLnB1c2goc3BzW2ldLm1hcmtlcik7fX19fSk7cmV0dXJuIG1hcmtlcnN9LHBvc0Zyb21JbmRleDpmdW5jdGlvbihvZmYpe3ZhciBjaCxsaW5lTm8kJDE9dGhpcy5maXJzdCxzZXBTaXplPXRoaXMubGluZVNlcGFyYXRvcigpLmxlbmd0aDt0aGlzLml0ZXIoZnVuY3Rpb24obGluZSl7dmFyIHN6PWxpbmUudGV4dC5sZW5ndGgrc2VwU2l6ZTtpZihzej5vZmYpe2NoPW9mZjtyZXR1cm4gdHJ1ZX0Kb2ZmLT1zejsrK2xpbmVObyQkMTt9KTtyZXR1cm4gY2xpcFBvcyh0aGlzLFBvcyhsaW5lTm8kJDEsY2gpKX0saW5kZXhGcm9tUG9zOmZ1bmN0aW9uKGNvb3Jkcyl7Y29vcmRzPWNsaXBQb3ModGhpcyxjb29yZHMpO3ZhciBpbmRleD1jb29yZHMuY2g7aWYoY29vcmRzLmxpbmU8dGhpcy5maXJzdHx8Y29vcmRzLmNoPDApe3JldHVybiAwfQp2YXIgc2VwU2l6ZT10aGlzLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGg7dGhpcy5pdGVyKHRoaXMuZmlyc3QsY29vcmRzLmxpbmUsZnVuY3Rpb24obGluZSl7aW5kZXgrPWxpbmUudGV4dC5sZW5ndGgrc2VwU2l6ZTt9KTtyZXR1cm4gaW5kZXh9LGNvcHk6ZnVuY3Rpb24oY29weUhpc3Rvcnkpe3ZhciBkb2M9bmV3IERvYyhnZXRMaW5lcyh0aGlzLHRoaXMuZmlyc3QsdGhpcy5maXJzdCt0aGlzLnNpemUpLHRoaXMubW9kZU9wdGlvbix0aGlzLmZpcnN0LHRoaXMubGluZVNlcCx0aGlzLmRpcmVjdGlvbik7ZG9jLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcDtkb2Muc2Nyb2xsTGVmdD10aGlzLnNjcm9sbExlZnQ7ZG9jLnNlbD10aGlzLnNlbDtkb2MuZXh0ZW5kPWZhbHNlO2lmKGNvcHlIaXN0b3J5KXtkb2MuaGlzdG9yeS51bmRvRGVwdGg9dGhpcy5oaXN0b3J5LnVuZG9EZXB0aDtkb2Muc2V0SGlzdG9yeSh0aGlzLmdldEhpc3RvcnkoKSk7fQpyZXR1cm4gZG9jfSxsaW5rZWREb2M6ZnVuY3Rpb24ob3B0aW9ucyl7aWYoIW9wdGlvbnMpe29wdGlvbnM9e307fQp2YXIgZnJvbT10aGlzLmZpcnN0LHRvPXRoaXMuZmlyc3QrdGhpcy5zaXplO2lmKG9wdGlvbnMuZnJvbSE9bnVsbCYmb3B0aW9ucy5mcm9tPmZyb20pe2Zyb209b3B0aW9ucy5mcm9tO30KaWYob3B0aW9ucy50byE9bnVsbCYmb3B0aW9ucy50bzx0byl7dG89b3B0aW9ucy50bzt9CnZhciBjb3B5PW5ldyBEb2MoZ2V0TGluZXModGhpcyxmcm9tLHRvKSxvcHRpb25zLm1vZGV8fHRoaXMubW9kZU9wdGlvbixmcm9tLHRoaXMubGluZVNlcCx0aGlzLmRpcmVjdGlvbik7aWYob3B0aW9ucy5zaGFyZWRIaXN0KXtjb3B5Lmhpc3Rvcnk9dGhpcy5oaXN0b3J5O30odGhpcy5saW5rZWR8fCh0aGlzLmxpbmtlZD1bXSkpLnB1c2goe2RvYzpjb3B5LHNoYXJlZEhpc3Q6b3B0aW9ucy5zaGFyZWRIaXN0fSk7Y29weS5saW5rZWQ9W3tkb2M6dGhpcyxpc1BhcmVudDp0cnVlLHNoYXJlZEhpc3Q6b3B0aW9ucy5zaGFyZWRIaXN0fV07Y29weVNoYXJlZE1hcmtlcnMoY29weSxmaW5kU2hhcmVkTWFya2Vycyh0aGlzKSk7cmV0dXJuIGNvcHl9LHVubGlua0RvYzpmdW5jdGlvbihvdGhlcil7dmFyIHRoaXMkMT10aGlzO2lmKG90aGVyIGluc3RhbmNlb2YgQ29kZU1pcnJvciQxKXtvdGhlcj1vdGhlci5kb2M7fQppZih0aGlzLmxpbmtlZCl7Zm9yKHZhciBpPTA7aTx0aGlzLmxpbmtlZC5sZW5ndGg7KytpKXt2YXIgbGluaz10aGlzJDEubGlua2VkW2ldO2lmKGxpbmsuZG9jIT1vdGhlcil7Y29udGludWV9CnRoaXMkMS5saW5rZWQuc3BsaWNlKGksMSk7b3RoZXIudW5saW5rRG9jKHRoaXMkMSk7ZGV0YWNoU2hhcmVkTWFya2VycyhmaW5kU2hhcmVkTWFya2Vycyh0aGlzJDEpKTticmVha319CmlmKG90aGVyLmhpc3Rvcnk9PXRoaXMuaGlzdG9yeSl7dmFyIHNwbGl0SWRzPVtvdGhlci5pZF07bGlua2VkRG9jcyhvdGhlcixmdW5jdGlvbihkb2Mpe3JldHVybiBzcGxpdElkcy5wdXNoKGRvYy5pZCk7fSx0cnVlKTtvdGhlci5oaXN0b3J5PW5ldyBIaXN0b3J5KG51bGwpO290aGVyLmhpc3RvcnkuZG9uZT1jb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lLHNwbGl0SWRzKTtvdGhlci5oaXN0b3J5LnVuZG9uZT1jb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUsc3BsaXRJZHMpO319LGl0ZXJMaW5rZWREb2NzOmZ1bmN0aW9uKGYpe2xpbmtlZERvY3ModGhpcyxmKTt9LGdldE1vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb2RlfSxnZXRFZGl0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbX0sc3BsaXRMaW5lczpmdW5jdGlvbihzdHIpe2lmKHRoaXMubGluZVNlcCl7cmV0dXJuIHN0ci5zcGxpdCh0aGlzLmxpbmVTZXApfQpyZXR1cm4gc3BsaXRMaW5lc0F1dG8oc3RyKX0sbGluZVNlcGFyYXRvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVTZXB8fCJcbiJ9LHNldERpcmVjdGlvbjpkb2NNZXRob2RPcChmdW5jdGlvbihkaXIpe2lmKGRpciE9InJ0bCIpe2Rpcj0ibHRyIjt9CmlmKGRpcj09dGhpcy5kaXJlY3Rpb24pe3JldHVybn0KdGhpcy5kaXJlY3Rpb249ZGlyO3RoaXMuaXRlcihmdW5jdGlvbihsaW5lKXtyZXR1cm4gbGluZS5vcmRlcj1udWxsO30pO2lmKHRoaXMuY20pe2RpcmVjdGlvbkNoYW5nZWQodGhpcy5jbSk7fX0pfSk7RG9jLnByb3RvdHlwZS5lYWNoTGluZT1Eb2MucHJvdG90eXBlLml0ZXI7dmFyIGxhc3REcm9wPTA7ZnVuY3Rpb24gb25Ecm9wKGUpe3ZhciBjbT10aGlzO2NsZWFyRHJhZ0N1cnNvcihjbSk7aWYoc2lnbmFsRE9NRXZlbnQoY20sZSl8fGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSxlKSkKe3JldHVybn0KZV9wcmV2ZW50RGVmYXVsdChlKTtpZihpZSl7bGFzdERyb3A9K25ldyBEYXRlO30KdmFyIHBvcz1wb3NGcm9tTW91c2UoY20sZSx0cnVlKSxmaWxlcz1lLmRhdGFUcmFuc2Zlci5maWxlcztpZighcG9zfHxjbS5pc1JlYWRPbmx5KCkpe3JldHVybn0KaWYoZmlsZXMmJmZpbGVzLmxlbmd0aCYmd2luZG93LkZpbGVSZWFkZXImJndpbmRvdy5GaWxlKXt2YXIgbj1maWxlcy5sZW5ndGgsdGV4dD1BcnJheShuKSxyZWFkPTA7dmFyIGxvYWRGaWxlPWZ1bmN0aW9uKGZpbGUsaSl7aWYoY20ub3B0aW9ucy5hbGxvd0Ryb3BGaWxlVHlwZXMmJmluZGV4T2YoY20ub3B0aW9ucy5hbGxvd0Ryb3BGaWxlVHlwZXMsZmlsZS50eXBlKT09LTEpCntyZXR1cm59CnZhciByZWFkZXI9bmV3IEZpbGVSZWFkZXI7cmVhZGVyLm9ubG9hZD1vcGVyYXRpb24oY20sZnVuY3Rpb24oKXt2YXIgY29udGVudD1yZWFkZXIucmVzdWx0O2lmKC9bXHgwMC1ceDA4XHgwZS1ceDFmXXsyfS8udGVzdChjb250ZW50KSl7Y29udGVudD0iIjt9CnRleHRbaV09Y29udGVudDtpZigrK3JlYWQ9PW4pe3Bvcz1jbGlwUG9zKGNtLmRvYyxwb3MpO3ZhciBjaGFuZ2U9e2Zyb206cG9zLHRvOnBvcyx0ZXh0OmNtLmRvYy5zcGxpdExpbmVzKHRleHQuam9pbihjbS5kb2MubGluZVNlcGFyYXRvcigpKSksb3JpZ2luOiJwYXN0ZSJ9O21ha2VDaGFuZ2UoY20uZG9jLGNoYW5nZSk7c2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkoY20uZG9jLHNpbXBsZVNlbGVjdGlvbihwb3MsY2hhbmdlRW5kKGNoYW5nZSkpKTt9fSk7cmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7fTtmb3IodmFyIGk9MDtpPG47KytpKXtsb2FkRmlsZShmaWxlc1tpXSxpKTt9fWVsc2V7aWYoY20uc3RhdGUuZHJhZ2dpbmdUZXh0JiZjbS5kb2Muc2VsLmNvbnRhaW5zKHBvcyk+LTEpe2NtLnN0YXRlLmRyYWdnaW5nVGV4dChlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTt9LDIwKTtyZXR1cm59CnRyeXt2YXIgdGV4dCQxPWUuZGF0YVRyYW5zZmVyLmdldERhdGEoIlRleHQiKTtpZih0ZXh0JDEpe3ZhciBzZWxlY3RlZDtpZihjbS5zdGF0ZS5kcmFnZ2luZ1RleHQmJiFjbS5zdGF0ZS5kcmFnZ2luZ1RleHQuY29weSkKe3NlbGVjdGVkPWNtLmxpc3RTZWxlY3Rpb25zKCk7fQpzZXRTZWxlY3Rpb25Ob1VuZG8oY20uZG9jLHNpbXBsZVNlbGVjdGlvbihwb3MscG9zKSk7aWYoc2VsZWN0ZWQpe2Zvcih2YXIgaSQxPTA7aSQxPHNlbGVjdGVkLmxlbmd0aDsrK2kkMSkKe3JlcGxhY2VSYW5nZShjbS5kb2MsIiIsc2VsZWN0ZWRbaSQxXS5hbmNob3Isc2VsZWN0ZWRbaSQxXS5oZWFkLCJkcmFnIik7fX0KY20ucmVwbGFjZVNlbGVjdGlvbih0ZXh0JDEsImFyb3VuZCIsInBhc3RlIik7Y20uZGlzcGxheS5pbnB1dC5mb2N1cygpO319CmNhdGNoKGUpe319fQpmdW5jdGlvbiBvbkRyYWdTdGFydChjbSxlKXtpZihpZSYmKCFjbS5zdGF0ZS5kcmFnZ2luZ1RleHR8fCtuZXcgRGF0ZS1sYXN0RHJvcDwxMDApKXtlX3N0b3AoZSk7cmV0dXJufQppZihzaWduYWxET01FdmVudChjbSxlKXx8ZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LGUpKXtyZXR1cm59CmUuZGF0YVRyYW5zZmVyLnNldERhdGEoIlRleHQiLGNtLmdldFNlbGVjdGlvbigpKTtlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJjb3B5TW92ZSI7aWYoZS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlJiYhc2FmYXJpKXt2YXIgaW1nPWVsdCgiaW1nIixudWxsLG51bGwsInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyIpO2ltZy5zcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09IjtpZihwcmVzdG8pe2ltZy53aWR0aD1pbWcuaGVpZ2h0PTE7Y20uZGlzcGxheS53cmFwcGVyLmFwcGVuZENoaWxkKGltZyk7aW1nLl90b3A9aW1nLm9mZnNldFRvcDt9CmUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShpbWcsMCwwKTtpZihwcmVzdG8pe2ltZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGltZyk7fX19CmZ1bmN0aW9uIG9uRHJhZ092ZXIoY20sZSl7dmFyIHBvcz1wb3NGcm9tTW91c2UoY20sZSk7aWYoIXBvcyl7cmV0dXJufQp2YXIgZnJhZz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ZHJhd1NlbGVjdGlvbkN1cnNvcihjbSxwb3MsZnJhZyk7aWYoIWNtLmRpc3BsYXkuZHJhZ0N1cnNvcil7Y20uZGlzcGxheS5kcmFnQ3Vyc29yPWVsdCgiZGl2IixudWxsLCJDb2RlTWlycm9yLWN1cnNvcnMgQ29kZU1pcnJvci1kcmFnY3Vyc29ycyIpO2NtLmRpc3BsYXkubGluZVNwYWNlLmluc2VydEJlZm9yZShjbS5kaXNwbGF5LmRyYWdDdXJzb3IsY20uZGlzcGxheS5jdXJzb3JEaXYpO30KcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5kcmFnQ3Vyc29yLGZyYWcpO30KZnVuY3Rpb24gY2xlYXJEcmFnQ3Vyc29yKGNtKXtpZihjbS5kaXNwbGF5LmRyYWdDdXJzb3Ipe2NtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKGNtLmRpc3BsYXkuZHJhZ0N1cnNvcik7Y20uZGlzcGxheS5kcmFnQ3Vyc29yPW51bGw7fX0KZnVuY3Rpb24gZm9yRWFjaENvZGVNaXJyb3IoZil7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpe3JldHVybn0KdmFyIGJ5Q2xhc3M9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiQ29kZU1pcnJvciIpO2Zvcih2YXIgaT0wO2k8YnlDbGFzcy5sZW5ndGg7aSsrKXt2YXIgY209YnlDbGFzc1tpXS5Db2RlTWlycm9yO2lmKGNtKXtmKGNtKTt9fX0KdmFyIGdsb2JhbHNSZWdpc3RlcmVkPWZhbHNlO2Z1bmN0aW9uIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCl7aWYoZ2xvYmFsc1JlZ2lzdGVyZWQpe3JldHVybn0KcmVnaXN0ZXJHbG9iYWxIYW5kbGVycygpO2dsb2JhbHNSZWdpc3RlcmVkPXRydWU7fQpmdW5jdGlvbiByZWdpc3Rlckdsb2JhbEhhbmRsZXJzKCl7dmFyIHJlc2l6ZVRpbWVyO29uKHdpbmRvdywicmVzaXplIixmdW5jdGlvbigpe2lmKHJlc2l6ZVRpbWVyPT1udWxsKXtyZXNpemVUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmVzaXplVGltZXI9bnVsbDtmb3JFYWNoQ29kZU1pcnJvcihvblJlc2l6ZSk7fSwxMDApO319KTtvbih3aW5kb3csImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGZvckVhY2hDb2RlTWlycm9yKG9uQmx1cik7fSk7fQpmdW5jdGlvbiBvblJlc2l6ZShjbSl7dmFyIGQ9Y20uZGlzcGxheTtpZihkLmxhc3RXcmFwSGVpZ2h0PT1kLndyYXBwZXIuY2xpZW50SGVpZ2h0JiZkLmxhc3RXcmFwV2lkdGg9PWQud3JhcHBlci5jbGllbnRXaWR0aCkKe3JldHVybn0KZC5jYWNoZWRDaGFyV2lkdGg9ZC5jYWNoZWRUZXh0SGVpZ2h0PWQuY2FjaGVkUGFkZGluZ0g9bnVsbDtkLnNjcm9sbGJhcnNDbGlwcGVkPWZhbHNlO2NtLnNldFNpemUoKTt9CnZhciBrZXlOYW1lcz17MzoiRW50ZXIiLDg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkN0cmwiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJMZWZ0IiwzODoiVXAiLDM5OiJSaWdodCIsNDA6IkRvd24iLDQ0OiJQcmludFNjcm4iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDU5OiI7Iiw2MToiPSIsOTE6Ik1vZCIsOTI6Ik1vZCIsOTM6Ik1vZCIsMTA2OiIqIiwxMDc6Ij0iLDEwOToiLSIsMTEwOiIuIiwxMTE6Ii8iLDEyNzoiRGVsZXRlIiwxNzM6Ii0iLDE4NjoiOyIsMTg3OiI9IiwxODg6IiwiLDE4OToiLSIsMTkwOiIuIiwxOTE6Ii8iLDE5MjoiYCIsMjE5OiJbIiwyMjA6IlxcIiwyMjE6Il0iLDIyMjoiJyIsNjMyMzI6IlVwIiw2MzIzMzoiRG93biIsNjMyMzQ6IkxlZnQiLDYzMjM1OiJSaWdodCIsNjMyNzI6IkRlbGV0ZSIsNjMyNzM6IkhvbWUiLDYzMjc1OiJFbmQiLDYzMjc2OiJQYWdlVXAiLDYzMjc3OiJQYWdlRG93biIsNjMzMDI6Ikluc2VydCJ9O2Zvcih2YXIgaT0wO2k8MTA7aSsrKXtrZXlOYW1lc1tpKzQ4XT1rZXlOYW1lc1tpKzk2XT1TdHJpbmcoaSk7fQpmb3IodmFyIGkkMT02NTtpJDE8PTkwO2kkMSsrKXtrZXlOYW1lc1tpJDFdPVN0cmluZy5mcm9tQ2hhckNvZGUoaSQxKTt9CmZvcih2YXIgaSQyPTE7aSQyPD0xMjtpJDIrKyl7a2V5TmFtZXNbaSQyKzExMV09a2V5TmFtZXNbaSQyKzYzMjM1XT0iRiIraSQyO30KdmFyIGtleU1hcD17fTtrZXlNYXAuYmFzaWM9eyJMZWZ0IjoiZ29DaGFyTGVmdCIsIlJpZ2h0IjoiZ29DaGFyUmlnaHQiLCJVcCI6ImdvTGluZVVwIiwiRG93biI6ImdvTGluZURvd24iLCJFbmQiOiJnb0xpbmVFbmQiLCJIb21lIjoiZ29MaW5lU3RhcnRTbWFydCIsIlBhZ2VVcCI6ImdvUGFnZVVwIiwiUGFnZURvd24iOiJnb1BhZ2VEb3duIiwiRGVsZXRlIjoiZGVsQ2hhckFmdGVyIiwiQmFja3NwYWNlIjoiZGVsQ2hhckJlZm9yZSIsIlNoaWZ0LUJhY2tzcGFjZSI6ImRlbENoYXJCZWZvcmUiLCJUYWIiOiJkZWZhdWx0VGFiIiwiU2hpZnQtVGFiIjoiaW5kZW50QXV0byIsIkVudGVyIjoibmV3bGluZUFuZEluZGVudCIsIkluc2VydCI6InRvZ2dsZU92ZXJ3cml0ZSIsIkVzYyI6InNpbmdsZVNlbGVjdGlvbiJ9O2tleU1hcC5wY0RlZmF1bHQ9eyJDdHJsLUEiOiJzZWxlY3RBbGwiLCJDdHJsLUQiOiJkZWxldGVMaW5lIiwiQ3RybC1aIjoidW5kbyIsIlNoaWZ0LUN0cmwtWiI6InJlZG8iLCJDdHJsLVkiOiJyZWRvIiwiQ3RybC1Ib21lIjoiZ29Eb2NTdGFydCIsIkN0cmwtRW5kIjoiZ29Eb2NFbmQiLCJDdHJsLVVwIjoiZ29MaW5lVXAiLCJDdHJsLURvd24iOiJnb0xpbmVEb3duIiwiQ3RybC1MZWZ0IjoiZ29Hcm91cExlZnQiLCJDdHJsLVJpZ2h0IjoiZ29Hcm91cFJpZ2h0IiwiQWx0LUxlZnQiOiJnb0xpbmVTdGFydCIsIkFsdC1SaWdodCI6ImdvTGluZUVuZCIsIkN0cmwtQmFja3NwYWNlIjoiZGVsR3JvdXBCZWZvcmUiLCJDdHJsLURlbGV0ZSI6ImRlbEdyb3VwQWZ0ZXIiLCJDdHJsLVMiOiJzYXZlIiwiQ3RybC1GIjoiZmluZCIsIkN0cmwtRyI6ImZpbmROZXh0IiwiU2hpZnQtQ3RybC1HIjoiZmluZFByZXYiLCJTaGlmdC1DdHJsLUYiOiJyZXBsYWNlIiwiU2hpZnQtQ3RybC1SIjoicmVwbGFjZUFsbCIsIkN0cmwtWyI6ImluZGVudExlc3MiLCJDdHJsLV0iOiJpbmRlbnRNb3JlIiwiQ3RybC1VIjoidW5kb1NlbGVjdGlvbiIsIlNoaWZ0LUN0cmwtVSI6InJlZG9TZWxlY3Rpb24iLCJBbHQtVSI6InJlZG9TZWxlY3Rpb24iLGZhbGx0aHJvdWdoOiJiYXNpYyJ9O2tleU1hcC5lbWFjc3k9eyJDdHJsLUYiOiJnb0NoYXJSaWdodCIsIkN0cmwtQiI6ImdvQ2hhckxlZnQiLCJDdHJsLVAiOiJnb0xpbmVVcCIsIkN0cmwtTiI6ImdvTGluZURvd24iLCJBbHQtRiI6ImdvV29yZFJpZ2h0IiwiQWx0LUIiOiJnb1dvcmRMZWZ0IiwiQ3RybC1BIjoiZ29MaW5lU3RhcnQiLCJDdHJsLUUiOiJnb0xpbmVFbmQiLCJDdHJsLVYiOiJnb1BhZ2VEb3duIiwiU2hpZnQtQ3RybC1WIjoiZ29QYWdlVXAiLCJDdHJsLUQiOiJkZWxDaGFyQWZ0ZXIiLCJDdHJsLUgiOiJkZWxDaGFyQmVmb3JlIiwiQWx0LUQiOiJkZWxXb3JkQWZ0ZXIiLCJBbHQtQmFja3NwYWNlIjoiZGVsV29yZEJlZm9yZSIsIkN0cmwtSyI6ImtpbGxMaW5lIiwiQ3RybC1UIjoidHJhbnNwb3NlQ2hhcnMiLCJDdHJsLU8iOiJvcGVuTGluZSJ9O2tleU1hcC5tYWNEZWZhdWx0PXsiQ21kLUEiOiJzZWxlY3RBbGwiLCJDbWQtRCI6ImRlbGV0ZUxpbmUiLCJDbWQtWiI6InVuZG8iLCJTaGlmdC1DbWQtWiI6InJlZG8iLCJDbWQtWSI6InJlZG8iLCJDbWQtSG9tZSI6ImdvRG9jU3RhcnQiLCJDbWQtVXAiOiJnb0RvY1N0YXJ0IiwiQ21kLUVuZCI6ImdvRG9jRW5kIiwiQ21kLURvd24iOiJnb0RvY0VuZCIsIkFsdC1MZWZ0IjoiZ29Hcm91cExlZnQiLCJBbHQtUmlnaHQiOiJnb0dyb3VwUmlnaHQiLCJDbWQtTGVmdCI6ImdvTGluZUxlZnQiLCJDbWQtUmlnaHQiOiJnb0xpbmVSaWdodCIsIkFsdC1CYWNrc3BhY2UiOiJkZWxHcm91cEJlZm9yZSIsIkN0cmwtQWx0LUJhY2tzcGFjZSI6ImRlbEdyb3VwQWZ0ZXIiLCJBbHQtRGVsZXRlIjoiZGVsR3JvdXBBZnRlciIsIkNtZC1TIjoic2F2ZSIsIkNtZC1GIjoiZmluZCIsIkNtZC1HIjoiZmluZE5leHQiLCJTaGlmdC1DbWQtRyI6ImZpbmRQcmV2IiwiQ21kLUFsdC1GIjoicmVwbGFjZSIsIlNoaWZ0LUNtZC1BbHQtRiI6InJlcGxhY2VBbGwiLCJDbWQtWyI6ImluZGVudExlc3MiLCJDbWQtXSI6ImluZGVudE1vcmUiLCJDbWQtQmFja3NwYWNlIjoiZGVsV3JhcHBlZExpbmVMZWZ0IiwiQ21kLURlbGV0ZSI6ImRlbFdyYXBwZWRMaW5lUmlnaHQiLCJDbWQtVSI6InVuZG9TZWxlY3Rpb24iLCJTaGlmdC1DbWQtVSI6InJlZG9TZWxlY3Rpb24iLCJDdHJsLVVwIjoiZ29Eb2NTdGFydCIsIkN0cmwtRG93biI6ImdvRG9jRW5kIixmYWxsdGhyb3VnaDpbImJhc2ljIiwiZW1hY3N5Il19O2tleU1hcFsiZGVmYXVsdCJdPW1hYz9rZXlNYXAubWFjRGVmYXVsdDprZXlNYXAucGNEZWZhdWx0O2Z1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSl7dmFyIHBhcnRzPW5hbWUuc3BsaXQoLy0oPyEkKS8pO25hbWU9cGFydHNbcGFydHMubGVuZ3RoLTFdO3ZhciBhbHQsY3RybCxzaGlmdCxjbWQ7Zm9yKHZhciBpPTA7aTxwYXJ0cy5sZW5ndGgtMTtpKyspe3ZhciBtb2Q9cGFydHNbaV07aWYoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKXtjbWQ9dHJ1ZTt9CmVsc2UgaWYoL15hKGx0KT8kL2kudGVzdChtb2QpKXthbHQ9dHJ1ZTt9CmVsc2UgaWYoL14oY3xjdHJsfGNvbnRyb2wpJC9pLnRlc3QobW9kKSl7Y3RybD10cnVlO30KZWxzZSBpZigvXnMoaGlmdCk/JC9pLnRlc3QobW9kKSl7c2hpZnQ9dHJ1ZTt9CmVsc2V7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogIittb2QpfX0KaWYoYWx0KXtuYW1lPSJBbHQtIituYW1lO30KaWYoY3RybCl7bmFtZT0iQ3RybC0iK25hbWU7fQppZihjbWQpe25hbWU9IkNtZC0iK25hbWU7fQppZihzaGlmdCl7bmFtZT0iU2hpZnQtIituYW1lO30KcmV0dXJuIG5hbWV9CmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU1hcChrZXltYXApe3ZhciBjb3B5PXt9O2Zvcih2YXIga2V5bmFtZSBpbiBrZXltYXApe2lmKGtleW1hcC5oYXNPd25Qcm9wZXJ0eShrZXluYW1lKSl7dmFyIHZhbHVlPWtleW1hcFtrZXluYW1lXTtpZigvXihuYW1lfGZhbGx0aHJvdWdofChkZXxhdCl0YWNoKSQvLnRlc3Qoa2V5bmFtZSkpe2NvbnRpbnVlfQppZih2YWx1ZT09Ii4uLiIpe2RlbGV0ZSBrZXltYXBba2V5bmFtZV07Y29udGludWV9CnZhciBrZXlzPW1hcChrZXluYW1lLnNwbGl0KCIgIiksbm9ybWFsaXplS2V5TmFtZSk7Zm9yKHZhciBpPTA7aTxrZXlzLmxlbmd0aDtpKyspe3ZhciB2YWw9KHZvaWQgMCksbmFtZT0odm9pZCAwKTtpZihpPT1rZXlzLmxlbmd0aC0xKXtuYW1lPWtleXMuam9pbigiICIpO3ZhbD12YWx1ZTt9ZWxzZXtuYW1lPWtleXMuc2xpY2UoMCxpKzEpLmpvaW4oIiAiKTt2YWw9Ii4uLiI7fQp2YXIgcHJldj1jb3B5W25hbWVdO2lmKCFwcmV2KXtjb3B5W25hbWVdPXZhbDt9CmVsc2UgaWYocHJldiE9dmFsKXt0aHJvdyBuZXcgRXJyb3IoIkluY29uc2lzdGVudCBiaW5kaW5ncyBmb3IgIituYW1lKX19CmRlbGV0ZSBrZXltYXBba2V5bmFtZV07fX0KZm9yKHZhciBwcm9wIGluIGNvcHkpe2tleW1hcFtwcm9wXT1jb3B5W3Byb3BdO30KcmV0dXJuIGtleW1hcH0KZnVuY3Rpb24gbG9va3VwS2V5KGtleSxtYXAkJDEsaGFuZGxlLGNvbnRleHQpe21hcCQkMT1nZXRLZXlNYXAobWFwJCQxKTt2YXIgZm91bmQ9bWFwJCQxLmNhbGw/bWFwJCQxLmNhbGwoa2V5LGNvbnRleHQpOm1hcCQkMVtrZXldO2lmKGZvdW5kPT09ZmFsc2Upe3JldHVybiJub3RoaW5nIn0KaWYoZm91bmQ9PT0iLi4uIil7cmV0dXJuIm11bHRpIn0KaWYoZm91bmQhPW51bGwmJmhhbmRsZShmb3VuZCkpe3JldHVybiJoYW5kbGVkIn0KaWYobWFwJCQxLmZhbGx0aHJvdWdoKXtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWFwJCQxLmZhbGx0aHJvdWdoKSE9IltvYmplY3QgQXJyYXldIikKe3JldHVybiBsb29rdXBLZXkoa2V5LG1hcCQkMS5mYWxsdGhyb3VnaCxoYW5kbGUsY29udGV4dCl9CmZvcih2YXIgaT0wO2k8bWFwJCQxLmZhbGx0aHJvdWdoLmxlbmd0aDtpKyspe3ZhciByZXN1bHQ9bG9va3VwS2V5KGtleSxtYXAkJDEuZmFsbHRocm91Z2hbaV0saGFuZGxlLGNvbnRleHQpO2lmKHJlc3VsdCl7cmV0dXJuIHJlc3VsdH19fX0KZnVuY3Rpb24gaXNNb2RpZmllcktleSh2YWx1ZSl7dmFyIG5hbWU9dHlwZW9mIHZhbHVlPT0ic3RyaW5nIj92YWx1ZTprZXlOYW1lc1t2YWx1ZS5rZXlDb2RlXTtyZXR1cm4gbmFtZT09IkN0cmwifHxuYW1lPT0iQWx0Inx8bmFtZT09IlNoaWZ0Inx8bmFtZT09Ik1vZCJ9CmZ1bmN0aW9uIGFkZE1vZGlmaWVyTmFtZXMobmFtZSxldmVudCxub1NoaWZ0KXt2YXIgYmFzZT1uYW1lO2lmKGV2ZW50LmFsdEtleSYmYmFzZSE9IkFsdCIpe25hbWU9IkFsdC0iK25hbWU7fQppZigoZmxpcEN0cmxDbWQ/ZXZlbnQubWV0YUtleTpldmVudC5jdHJsS2V5KSYmYmFzZSE9IkN0cmwiKXtuYW1lPSJDdHJsLSIrbmFtZTt9CmlmKChmbGlwQ3RybENtZD9ldmVudC5jdHJsS2V5OmV2ZW50Lm1ldGFLZXkpJiZiYXNlIT0iQ21kIil7bmFtZT0iQ21kLSIrbmFtZTt9CmlmKCFub1NoaWZ0JiZldmVudC5zaGlmdEtleSYmYmFzZSE9IlNoaWZ0Iil7bmFtZT0iU2hpZnQtIituYW1lO30KcmV0dXJuIG5hbWV9CmZ1bmN0aW9uIGtleU5hbWUoZXZlbnQsbm9TaGlmdCl7aWYocHJlc3RvJiZldmVudC5rZXlDb2RlPT0zNCYmZXZlbnRbImNoYXIiXSl7cmV0dXJuIGZhbHNlfQp2YXIgbmFtZT1rZXlOYW1lc1tldmVudC5rZXlDb2RlXTtpZihuYW1lPT1udWxsfHxldmVudC5hbHRHcmFwaEtleSl7cmV0dXJuIGZhbHNlfQpyZXR1cm4gYWRkTW9kaWZpZXJOYW1lcyhuYW1lLGV2ZW50LG5vU2hpZnQpfQpmdW5jdGlvbiBnZXRLZXlNYXAodmFsKXtyZXR1cm4gdHlwZW9mIHZhbD09InN0cmluZyI/a2V5TWFwW3ZhbF06dmFsfQpmdW5jdGlvbiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLGNvbXB1dGUpe3ZhciByYW5nZXM9Y20uZG9jLnNlbC5yYW5nZXMsa2lsbD1bXTtmb3IodmFyIGk9MDtpPHJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgdG9LaWxsPWNvbXB1dGUocmFuZ2VzW2ldKTt3aGlsZShraWxsLmxlbmd0aCYmY21wKHRvS2lsbC5mcm9tLGxzdChraWxsKS50byk8PTApe3ZhciByZXBsYWNlZD1raWxsLnBvcCgpO2lmKGNtcChyZXBsYWNlZC5mcm9tLHRvS2lsbC5mcm9tKTwwKXt0b0tpbGwuZnJvbT1yZXBsYWNlZC5mcm9tO2JyZWFrfX0Ka2lsbC5wdXNoKHRvS2lsbCk7fQpydW5Jbk9wKGNtLGZ1bmN0aW9uKCl7Zm9yKHZhciBpPWtpbGwubGVuZ3RoLTE7aT49MDtpLS0pCntyZXBsYWNlUmFuZ2UoY20uZG9jLCIiLGtpbGxbaV0uZnJvbSxraWxsW2ldLnRvLCIrZGVsZXRlIik7fQplbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTt9KTt9CmZ1bmN0aW9uIG1vdmVDaGFyTG9naWNhbGx5KGxpbmUsY2gsZGlyKXt2YXIgdGFyZ2V0PXNraXBFeHRlbmRpbmdDaGFycyhsaW5lLnRleHQsY2grZGlyLGRpcik7cmV0dXJuIHRhcmdldDwwfHx0YXJnZXQ+bGluZS50ZXh0Lmxlbmd0aD9udWxsOnRhcmdldH0KZnVuY3Rpb24gbW92ZUxvZ2ljYWxseShsaW5lLHN0YXJ0LGRpcil7dmFyIGNoPW1vdmVDaGFyTG9naWNhbGx5KGxpbmUsc3RhcnQuY2gsZGlyKTtyZXR1cm4gY2g9PW51bGw/bnVsbDpuZXcgUG9zKHN0YXJ0LmxpbmUsY2gsZGlyPDA/ImFmdGVyIjoiYmVmb3JlIil9CmZ1bmN0aW9uIGVuZE9mTGluZSh2aXN1YWxseSxjbSxsaW5lT2JqLGxpbmVObyxkaXIpe2lmKHZpc3VhbGx5KXt2YXIgb3JkZXI9Z2V0T3JkZXIobGluZU9iaixjbS5kb2MuZGlyZWN0aW9uKTtpZihvcmRlcil7dmFyIHBhcnQ9ZGlyPDA/bHN0KG9yZGVyKTpvcmRlclswXTt2YXIgbW92ZUluU3RvcmFnZU9yZGVyPShkaXI8MCk9PShwYXJ0LmxldmVsPT0xKTt2YXIgc3RpY2t5PW1vdmVJblN0b3JhZ2VPcmRlcj8iYWZ0ZXIiOiJiZWZvcmUiO3ZhciBjaDtpZihwYXJ0LmxldmVsPjB8fGNtLmRvYy5kaXJlY3Rpb249PSJydGwiKXt2YXIgcHJlcD1wcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sbGluZU9iaik7Y2g9ZGlyPDA/bGluZU9iai50ZXh0Lmxlbmd0aC0xOjA7dmFyIHRhcmdldFRvcD1tZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXAsY2gpLnRvcDtjaD1maW5kRmlyc3QoZnVuY3Rpb24oY2gpe3JldHVybiBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLHByZXAsY2gpLnRvcD09dGFyZ2V0VG9wO30sKGRpcjwwKT09KHBhcnQubGV2ZWw9PTEpP3BhcnQuZnJvbTpwYXJ0LnRvLTEsY2gpO2lmKHN0aWNreT09ImJlZm9yZSIpe2NoPW1vdmVDaGFyTG9naWNhbGx5KGxpbmVPYmosY2gsMSk7fX1lbHNle2NoPWRpcjwwP3BhcnQudG86cGFydC5mcm9tO30KcmV0dXJuIG5ldyBQb3MobGluZU5vLGNoLHN0aWNreSl9fQpyZXR1cm4gbmV3IFBvcyhsaW5lTm8sZGlyPDA/bGluZU9iai50ZXh0Lmxlbmd0aDowLGRpcjwwPyJiZWZvcmUiOiJhZnRlciIpfQpmdW5jdGlvbiBtb3ZlVmlzdWFsbHkoY20sbGluZSxzdGFydCxkaXIpe3ZhciBiaWRpPWdldE9yZGVyKGxpbmUsY20uZG9jLmRpcmVjdGlvbik7aWYoIWJpZGkpe3JldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsc3RhcnQsZGlyKX0KaWYoc3RhcnQuY2g+PWxpbmUudGV4dC5sZW5ndGgpe3N0YXJ0LmNoPWxpbmUudGV4dC5sZW5ndGg7c3RhcnQuc3RpY2t5PSJiZWZvcmUiO31lbHNlIGlmKHN0YXJ0LmNoPD0wKXtzdGFydC5jaD0wO3N0YXJ0LnN0aWNreT0iYWZ0ZXIiO30KdmFyIHBhcnRQb3M9Z2V0QmlkaVBhcnRBdChiaWRpLHN0YXJ0LmNoLHN0YXJ0LnN0aWNreSkscGFydD1iaWRpW3BhcnRQb3NdO2lmKGNtLmRvYy5kaXJlY3Rpb249PSJsdHIiJiZwYXJ0LmxldmVsJTI9PTAmJihkaXI+MD9wYXJ0LnRvPnN0YXJ0LmNoOnBhcnQuZnJvbTxzdGFydC5jaCkpe3JldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsc3RhcnQsZGlyKX0KdmFyIG12PWZ1bmN0aW9uKHBvcyxkaXIpe3JldHVybiBtb3ZlQ2hhckxvZ2ljYWxseShsaW5lLHBvcyBpbnN0YW5jZW9mIFBvcz9wb3MuY2g6cG9zLGRpcik7fTt2YXIgcHJlcDt2YXIgZ2V0V3JhcHBlZExpbmVFeHRlbnQ9ZnVuY3Rpb24oY2gpe2lmKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyl7cmV0dXJue2JlZ2luOjAsZW5kOmxpbmUudGV4dC5sZW5ndGh9fQpwcmVwPXByZXB8fHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSxsaW5lKTtyZXR1cm4gd3JhcHBlZExpbmVFeHRlbnRDaGFyKGNtLGxpbmUscHJlcCxjaCl9O3ZhciB3cmFwcGVkTGluZUV4dGVudD1nZXRXcmFwcGVkTGluZUV4dGVudChzdGFydC5zdGlja3k9PSJiZWZvcmUiP212KHN0YXJ0LC0xKTpzdGFydC5jaCk7aWYoY20uZG9jLmRpcmVjdGlvbj09InJ0bCJ8fHBhcnQubGV2ZWw9PTEpe3ZhciBtb3ZlSW5TdG9yYWdlT3JkZXI9KHBhcnQubGV2ZWw9PTEpPT0oZGlyPDApO3ZhciBjaD1tdihzdGFydCxtb3ZlSW5TdG9yYWdlT3JkZXI/MTotMSk7aWYoY2ghPW51bGwmJighbW92ZUluU3RvcmFnZU9yZGVyP2NoPj1wYXJ0LmZyb20mJmNoPj13cmFwcGVkTGluZUV4dGVudC5iZWdpbjpjaDw9cGFydC50byYmY2g8PXdyYXBwZWRMaW5lRXh0ZW50LmVuZCkpe3ZhciBzdGlja3k9bW92ZUluU3RvcmFnZU9yZGVyPyJiZWZvcmUiOiJhZnRlciI7cmV0dXJuIG5ldyBQb3Moc3RhcnQubGluZSxjaCxzdGlja3kpfX0KdmFyIHNlYXJjaEluVmlzdWFsTGluZT1mdW5jdGlvbihwYXJ0UG9zLGRpcix3cmFwcGVkTGluZUV4dGVudCl7dmFyIGdldFJlcz1mdW5jdGlvbihjaCxtb3ZlSW5TdG9yYWdlT3JkZXIpe3JldHVybiBtb3ZlSW5TdG9yYWdlT3JkZXI/bmV3IFBvcyhzdGFydC5saW5lLG12KGNoLDEpLCJiZWZvcmUiKTpuZXcgUG9zKHN0YXJ0LmxpbmUsY2gsImFmdGVyIik7fTtmb3IoO3BhcnRQb3M+PTAmJnBhcnRQb3M8YmlkaS5sZW5ndGg7cGFydFBvcys9ZGlyKXt2YXIgcGFydD1iaWRpW3BhcnRQb3NdO3ZhciBtb3ZlSW5TdG9yYWdlT3JkZXI9KGRpcj4wKT09KHBhcnQubGV2ZWwhPTEpO3ZhciBjaD1tb3ZlSW5TdG9yYWdlT3JkZXI/d3JhcHBlZExpbmVFeHRlbnQuYmVnaW46bXYod3JhcHBlZExpbmVFeHRlbnQuZW5kLC0xKTtpZihwYXJ0LmZyb208PWNoJiZjaDxwYXJ0LnRvKXtyZXR1cm4gZ2V0UmVzKGNoLG1vdmVJblN0b3JhZ2VPcmRlcil9CmNoPW1vdmVJblN0b3JhZ2VPcmRlcj9wYXJ0LmZyb206bXYocGFydC50bywtMSk7aWYod3JhcHBlZExpbmVFeHRlbnQuYmVnaW48PWNoJiZjaDx3cmFwcGVkTGluZUV4dGVudC5lbmQpe3JldHVybiBnZXRSZXMoY2gsbW92ZUluU3RvcmFnZU9yZGVyKX19fTt2YXIgcmVzPXNlYXJjaEluVmlzdWFsTGluZShwYXJ0UG9zK2RpcixkaXIsd3JhcHBlZExpbmVFeHRlbnQpO2lmKHJlcyl7cmV0dXJuIHJlc30KdmFyIG5leHRDaD1kaXI+MD93cmFwcGVkTGluZUV4dGVudC5lbmQ6bXYod3JhcHBlZExpbmVFeHRlbnQuYmVnaW4sLTEpO2lmKG5leHRDaCE9bnVsbCYmIShkaXI+MCYmbmV4dENoPT1saW5lLnRleHQubGVuZ3RoKSl7cmVzPXNlYXJjaEluVmlzdWFsTGluZShkaXI+MD8wOmJpZGkubGVuZ3RoLTEsZGlyLGdldFdyYXBwZWRMaW5lRXh0ZW50KG5leHRDaCkpO2lmKHJlcyl7cmV0dXJuIHJlc319CnJldHVybiBudWxsfQp2YXIgY29tbWFuZHM9e3NlbGVjdEFsbDpzZWxlY3RBbGwsc2luZ2xlU2VsZWN0aW9uOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uc2V0U2VsZWN0aW9uKGNtLmdldEN1cnNvcigiYW5jaG9yIiksY20uZ2V0Q3Vyc29yKCJoZWFkIiksc2VsX2RvbnRTY3JvbGwpO30sa2lsbExpbmU6ZnVuY3Rpb24oY20pe3JldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLGZ1bmN0aW9uKHJhbmdlKXtpZihyYW5nZS5lbXB0eSgpKXt2YXIgbGVuPWdldExpbmUoY20uZG9jLHJhbmdlLmhlYWQubGluZSkudGV4dC5sZW5ndGg7aWYocmFuZ2UuaGVhZC5jaD09bGVuJiZyYW5nZS5oZWFkLmxpbmU8Y20ubGFzdExpbmUoKSkKe3JldHVybntmcm9tOnJhbmdlLmhlYWQsdG86UG9zKHJhbmdlLmhlYWQubGluZSsxLDApfX0KZWxzZQp7cmV0dXJue2Zyb206cmFuZ2UuaGVhZCx0bzpQb3MocmFuZ2UuaGVhZC5saW5lLGxlbil9fX1lbHNle3JldHVybntmcm9tOnJhbmdlLmZyb20oKSx0bzpyYW5nZS50bygpfX19KTt9LGRlbGV0ZUxpbmU6ZnVuY3Rpb24oY20pe3JldHVybiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLGZ1bmN0aW9uKHJhbmdlKXtyZXR1cm4oe2Zyb206UG9zKHJhbmdlLmZyb20oKS5saW5lLDApLHRvOmNsaXBQb3MoY20uZG9jLFBvcyhyYW5nZS50bygpLmxpbmUrMSwwKSl9KTt9KTt9LGRlbExpbmVMZWZ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSxmdW5jdGlvbihyYW5nZSl7cmV0dXJuKHtmcm9tOlBvcyhyYW5nZS5mcm9tKCkubGluZSwwKSx0bzpyYW5nZS5mcm9tKCl9KTt9KTt9LGRlbFdyYXBwZWRMaW5lTGVmdDpmdW5jdGlvbihjbSl7cmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sZnVuY3Rpb24ocmFuZ2Upe3ZhciB0b3A9Y20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCJkaXYiKS50b3ArNTt2YXIgbGVmdFBvcz1jbS5jb29yZHNDaGFyKHtsZWZ0OjAsdG9wOnRvcH0sImRpdiIpO3JldHVybntmcm9tOmxlZnRQb3MsdG86cmFuZ2UuZnJvbSgpfX0pO30sZGVsV3JhcHBlZExpbmVSaWdodDpmdW5jdGlvbihjbSl7cmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sZnVuY3Rpb24ocmFuZ2Upe3ZhciB0b3A9Y20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCJkaXYiKS50b3ArNTt2YXIgcmlnaHRQb3M9Y20uY29vcmRzQ2hhcih7bGVmdDpjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGgrMTAwLHRvcDp0b3B9LCJkaXYiKTtyZXR1cm57ZnJvbTpyYW5nZS5mcm9tKCksdG86cmlnaHRQb3N9fSk7fSx1bmRvOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20udW5kbygpO30scmVkbzpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLnJlZG8oKTt9LHVuZG9TZWxlY3Rpb246ZnVuY3Rpb24oY20pe3JldHVybiBjbS51bmRvU2VsZWN0aW9uKCk7fSxyZWRvU2VsZWN0aW9uOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ucmVkb1NlbGVjdGlvbigpO30sZ29Eb2NTdGFydDpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoY20uZmlyc3RMaW5lKCksMCkpO30sZ29Eb2NFbmQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmxhc3RMaW5lKCkpKTt9LGdvTGluZVN0YXJ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlKXtyZXR1cm4gbGluZVN0YXJ0KGNtLHJhbmdlLmhlYWQubGluZSk7fSx7b3JpZ2luOiIrbW92ZSIsYmlhczoxfSk7fSxnb0xpbmVTdGFydFNtYXJ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlKXtyZXR1cm4gbGluZVN0YXJ0U21hcnQoY20scmFuZ2UuaGVhZCk7fSx7b3JpZ2luOiIrbW92ZSIsYmlhczoxfSk7fSxnb0xpbmVFbmQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2Upe3JldHVybiBsaW5lRW5kKGNtLHJhbmdlLmhlYWQubGluZSk7fSx7b3JpZ2luOiIrbW92ZSIsYmlhczotMX0pO30sZ29MaW5lUmlnaHQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2Upe3ZhciB0b3A9Y20uY3Vyc29yQ29vcmRzKHJhbmdlLmhlYWQsImRpdiIpLnRvcCs1O3JldHVybiBjbS5jb29yZHNDaGFyKHtsZWZ0OmNtLmRpc3BsYXkubGluZURpdi5vZmZzZXRXaWR0aCsxMDAsdG9wOnRvcH0sImRpdiIpfSxzZWxfbW92ZSk7fSxnb0xpbmVMZWZ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlKXt2YXIgdG9wPWNtLmN1cnNvckNvb3JkcyhyYW5nZS5oZWFkLCJkaXYiKS50b3ArNTtyZXR1cm4gY20uY29vcmRzQ2hhcih7bGVmdDowLHRvcDp0b3B9LCJkaXYiKX0sc2VsX21vdmUpO30sZ29MaW5lTGVmdFNtYXJ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlKXt2YXIgdG9wPWNtLmN1cnNvckNvb3JkcyhyYW5nZS5oZWFkLCJkaXYiKS50b3ArNTt2YXIgcG9zPWNtLmNvb3Jkc0NoYXIoe2xlZnQ6MCx0b3A6dG9wfSwiZGl2Iik7aWYocG9zLmNoPGNtLmdldExpbmUocG9zLmxpbmUpLnNlYXJjaCgvXFMvKSl7cmV0dXJuIGxpbmVTdGFydFNtYXJ0KGNtLHJhbmdlLmhlYWQpfQpyZXR1cm4gcG9zfSxzZWxfbW92ZSk7fSxnb0xpbmVVcDpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLm1vdmVWKC0xLCJsaW5lIik7fSxnb0xpbmVEb3duOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ubW92ZVYoMSwibGluZSIpO30sZ29QYWdlVXA6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5tb3ZlVigtMSwicGFnZSIpO30sZ29QYWdlRG93bjpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLm1vdmVWKDEsInBhZ2UiKTt9LGdvQ2hhckxlZnQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5tb3ZlSCgtMSwiY2hhciIpO30sZ29DaGFyUmlnaHQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5tb3ZlSCgxLCJjaGFyIik7fSxnb0NvbHVtbkxlZnQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5tb3ZlSCgtMSwiY29sdW1uIik7fSxnb0NvbHVtblJpZ2h0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ubW92ZUgoMSwiY29sdW1uIik7fSxnb1dvcmRMZWZ0OmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ubW92ZUgoLTEsIndvcmQiKTt9LGdvR3JvdXBSaWdodDpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLm1vdmVIKDEsImdyb3VwIik7fSxnb0dyb3VwTGVmdDpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLm1vdmVIKC0xLCJncm91cCIpO30sZ29Xb3JkUmlnaHQ6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5tb3ZlSCgxLCJ3b3JkIik7fSxkZWxDaGFyQmVmb3JlOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZGVsZXRlSCgtMSwiY2hhciIpO30sZGVsQ2hhckFmdGVyOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZGVsZXRlSCgxLCJjaGFyIik7fSxkZWxXb3JkQmVmb3JlOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZGVsZXRlSCgtMSwid29yZCIpO30sZGVsV29yZEFmdGVyOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZGVsZXRlSCgxLCJ3b3JkIik7fSxkZWxHcm91cEJlZm9yZTpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLmRlbGV0ZUgoLTEsImdyb3VwIik7fSxkZWxHcm91cEFmdGVyOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20uZGVsZXRlSCgxLCJncm91cCIpO30saW5kZW50QXV0bzpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLmluZGVudFNlbGVjdGlvbigic21hcnQiKTt9LGluZGVudE1vcmU6ZnVuY3Rpb24oY20pe3JldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpO30saW5kZW50TGVzczpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLmluZGVudFNlbGVjdGlvbigic3VidHJhY3QiKTt9LGluc2VydFRhYjpmdW5jdGlvbihjbSl7cmV0dXJuIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlx0Iik7fSxpbnNlcnRTb2Z0VGFiOmZ1bmN0aW9uKGNtKXt2YXIgc3BhY2VzPVtdLHJhbmdlcz1jbS5saXN0U2VsZWN0aW9ucygpLHRhYlNpemU9Y20ub3B0aW9ucy50YWJTaXplO2Zvcih2YXIgaT0wO2k8cmFuZ2VzLmxlbmd0aDtpKyspe3ZhciBwb3M9cmFuZ2VzW2ldLmZyb20oKTt2YXIgY29sPWNvdW50Q29sdW1uKGNtLmdldExpbmUocG9zLmxpbmUpLHBvcy5jaCx0YWJTaXplKTtzcGFjZXMucHVzaChzcGFjZVN0cih0YWJTaXplLWNvbCV0YWJTaXplKSk7fQpjbS5yZXBsYWNlU2VsZWN0aW9ucyhzcGFjZXMpO30sZGVmYXVsdFRhYjpmdW5jdGlvbihjbSl7aWYoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSl7Y20uaW5kZW50U2VsZWN0aW9uKCJhZGQiKTt9CmVsc2V7Y20uZXhlY0NvbW1hbmQoImluc2VydFRhYiIpO319LHRyYW5zcG9zZUNoYXJzOmZ1bmN0aW9uKGNtKXtyZXR1cm4gcnVuSW5PcChjbSxmdW5jdGlvbigpe3ZhciByYW5nZXM9Y20ubGlzdFNlbGVjdGlvbnMoKSxuZXdTZWw9W107Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7aWYoIXJhbmdlc1tpXS5lbXB0eSgpKXtjb250aW51ZX0KdmFyIGN1cj1yYW5nZXNbaV0uaGVhZCxsaW5lPWdldExpbmUoY20uZG9jLGN1ci5saW5lKS50ZXh0O2lmKGxpbmUpe2lmKGN1ci5jaD09bGluZS5sZW5ndGgpe2N1cj1uZXcgUG9zKGN1ci5saW5lLGN1ci5jaC0xKTt9CmlmKGN1ci5jaD4wKXtjdXI9bmV3IFBvcyhjdXIubGluZSxjdXIuY2grMSk7Y20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KGN1ci5jaC0xKStsaW5lLmNoYXJBdChjdXIuY2gtMiksUG9zKGN1ci5saW5lLGN1ci5jaC0yKSxjdXIsIit0cmFuc3Bvc2UiKTt9ZWxzZSBpZihjdXIubGluZT5jbS5kb2MuZmlyc3Qpe3ZhciBwcmV2PWdldExpbmUoY20uZG9jLGN1ci5saW5lLTEpLnRleHQ7aWYocHJldil7Y3VyPW5ldyBQb3MoY3VyLmxpbmUsMSk7Y20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KDApK2NtLmRvYy5saW5lU2VwYXJhdG9yKCkrCnByZXYuY2hhckF0KHByZXYubGVuZ3RoLTEpLFBvcyhjdXIubGluZS0xLHByZXYubGVuZ3RoLTEpLGN1ciwiK3RyYW5zcG9zZSIpO319fQpuZXdTZWwucHVzaChuZXcgUmFuZ2UoY3VyLGN1cikpO30KY20uc2V0U2VsZWN0aW9ucyhuZXdTZWwpO30pO30sbmV3bGluZUFuZEluZGVudDpmdW5jdGlvbihjbSl7cmV0dXJuIHJ1bkluT3AoY20sZnVuY3Rpb24oKXt2YXIgc2Vscz1jbS5saXN0U2VsZWN0aW9ucygpO2Zvcih2YXIgaT1zZWxzLmxlbmd0aC0xO2k+PTA7aS0tKQp7Y20ucmVwbGFjZVJhbmdlKGNtLmRvYy5saW5lU2VwYXJhdG9yKCksc2Vsc1tpXS5hbmNob3Isc2Vsc1tpXS5oZWFkLCIraW5wdXQiKTt9CnNlbHM9Y20ubGlzdFNlbGVjdGlvbnMoKTtmb3IodmFyIGkkMT0wO2kkMTxzZWxzLmxlbmd0aDtpJDErKykKe2NtLmluZGVudExpbmUoc2Vsc1tpJDFdLmZyb20oKS5saW5lLG51bGwsdHJ1ZSk7fQplbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTt9KTt9LG9wZW5MaW5lOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ucmVwbGFjZVNlbGVjdGlvbigiXG4iLCJzdGFydCIpO30sdG9nZ2xlT3ZlcndyaXRlOmZ1bmN0aW9uKGNtKXtyZXR1cm4gY20udG9nZ2xlT3ZlcndyaXRlKCk7fX07ZnVuY3Rpb24gbGluZVN0YXJ0KGNtLGxpbmVOKXt2YXIgbGluZT1nZXRMaW5lKGNtLmRvYyxsaW5lTik7dmFyIHZpc3VhbD12aXN1YWxMaW5lKGxpbmUpO2lmKHZpc3VhbCE9bGluZSl7bGluZU49bGluZU5vKHZpc3VhbCk7fQpyZXR1cm4gZW5kT2ZMaW5lKHRydWUsY20sdmlzdWFsLGxpbmVOLDEpfQpmdW5jdGlvbiBsaW5lRW5kKGNtLGxpbmVOKXt2YXIgbGluZT1nZXRMaW5lKGNtLmRvYyxsaW5lTik7dmFyIHZpc3VhbD12aXN1YWxMaW5lRW5kKGxpbmUpO2lmKHZpc3VhbCE9bGluZSl7bGluZU49bGluZU5vKHZpc3VhbCk7fQpyZXR1cm4gZW5kT2ZMaW5lKHRydWUsY20sbGluZSxsaW5lTiwtMSl9CmZ1bmN0aW9uIGxpbmVTdGFydFNtYXJ0KGNtLHBvcyl7dmFyIHN0YXJ0PWxpbmVTdGFydChjbSxwb3MubGluZSk7dmFyIGxpbmU9Z2V0TGluZShjbS5kb2Msc3RhcnQubGluZSk7dmFyIG9yZGVyPWdldE9yZGVyKGxpbmUsY20uZG9jLmRpcmVjdGlvbik7aWYoIW9yZGVyfHxvcmRlclswXS5sZXZlbD09MCl7dmFyIGZpcnN0Tm9uV1M9TWF0aC5tYXgoMCxsaW5lLnRleHQuc2VhcmNoKC9cUy8pKTt2YXIgaW5XUz1wb3MubGluZT09c3RhcnQubGluZSYmcG9zLmNoPD1maXJzdE5vbldTJiZwb3MuY2g7cmV0dXJuIFBvcyhzdGFydC5saW5lLGluV1M/MDpmaXJzdE5vbldTLHN0YXJ0LnN0aWNreSl9CnJldHVybiBzdGFydH0KZnVuY3Rpb24gZG9IYW5kbGVCaW5kaW5nKGNtLGJvdW5kLGRyb3BTaGlmdCl7aWYodHlwZW9mIGJvdW5kPT0ic3RyaW5nIil7Ym91bmQ9Y29tbWFuZHNbYm91bmRdO2lmKCFib3VuZCl7cmV0dXJuIGZhbHNlfX0KY20uZGlzcGxheS5pbnB1dC5lbnN1cmVQb2xsZWQoKTt2YXIgcHJldlNoaWZ0PWNtLmRpc3BsYXkuc2hpZnQsZG9uZT1mYWxzZTt0cnl7aWYoY20uaXNSZWFkT25seSgpKXtjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzPXRydWU7fQppZihkcm9wU2hpZnQpe2NtLmRpc3BsYXkuc2hpZnQ9ZmFsc2U7fQpkb25lPWJvdW5kKGNtKSE9UGFzczt9ZmluYWxseXtjbS5kaXNwbGF5LnNoaWZ0PXByZXZTaGlmdDtjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzPWZhbHNlO30KcmV0dXJuIGRvbmV9CmZ1bmN0aW9uIGxvb2t1cEtleUZvckVkaXRvcihjbSxuYW1lLGhhbmRsZSl7Zm9yKHZhciBpPTA7aTxjbS5zdGF0ZS5rZXlNYXBzLmxlbmd0aDtpKyspe3ZhciByZXN1bHQ9bG9va3VwS2V5KG5hbWUsY20uc3RhdGUua2V5TWFwc1tpXSxoYW5kbGUsY20pO2lmKHJlc3VsdCl7cmV0dXJuIHJlc3VsdH19CnJldHVybihjbS5vcHRpb25zLmV4dHJhS2V5cyYmbG9va3VwS2V5KG5hbWUsY20ub3B0aW9ucy5leHRyYUtleXMsaGFuZGxlLGNtKSl8fGxvb2t1cEtleShuYW1lLGNtLm9wdGlvbnMua2V5TWFwLGhhbmRsZSxjbSl9CnZhciBzdG9wU2VxPW5ldyBEZWxheWVkO2Z1bmN0aW9uIGRpc3BhdGNoS2V5KGNtLG5hbWUsZSxoYW5kbGUpe3ZhciBzZXE9Y20uc3RhdGUua2V5U2VxO2lmKHNlcSl7aWYoaXNNb2RpZmllcktleShuYW1lKSl7cmV0dXJuImhhbmRsZWQifQppZigvXCckLy50ZXN0KG5hbWUpKQp7Y20uc3RhdGUua2V5U2VxPW51bGw7fQplbHNlCntzdG9wU2VxLnNldCg1MCxmdW5jdGlvbigpe2lmKGNtLnN0YXRlLmtleVNlcT09c2VxKXtjbS5zdGF0ZS5rZXlTZXE9bnVsbDtjbS5kaXNwbGF5LmlucHV0LnJlc2V0KCk7fX0pO30KaWYoZGlzcGF0Y2hLZXlJbm5lcihjbSxzZXErIiAiK25hbWUsZSxoYW5kbGUpKXtyZXR1cm4gdHJ1ZX19CnJldHVybiBkaXNwYXRjaEtleUlubmVyKGNtLG5hbWUsZSxoYW5kbGUpfQpmdW5jdGlvbiBkaXNwYXRjaEtleUlubmVyKGNtLG5hbWUsZSxoYW5kbGUpe3ZhciByZXN1bHQ9bG9va3VwS2V5Rm9yRWRpdG9yKGNtLG5hbWUsaGFuZGxlKTtpZihyZXN1bHQ9PSJtdWx0aSIpCntjbS5zdGF0ZS5rZXlTZXE9bmFtZTt9CmlmKHJlc3VsdD09ImhhbmRsZWQiKQp7c2lnbmFsTGF0ZXIoY20sImtleUhhbmRsZWQiLGNtLG5hbWUsZSk7fQppZihyZXN1bHQ9PSJoYW5kbGVkInx8cmVzdWx0PT0ibXVsdGkiKXtlX3ByZXZlbnREZWZhdWx0KGUpO3Jlc3RhcnRCbGluayhjbSk7fQpyZXR1cm4hIXJlc3VsdH0KZnVuY3Rpb24gaGFuZGxlS2V5QmluZGluZyhjbSxlKXt2YXIgbmFtZT1rZXlOYW1lKGUsdHJ1ZSk7aWYoIW5hbWUpe3JldHVybiBmYWxzZX0KaWYoZS5zaGlmdEtleSYmIWNtLnN0YXRlLmtleVNlcSl7cmV0dXJuIGRpc3BhdGNoS2V5KGNtLCJTaGlmdC0iK25hbWUsZSxmdW5jdGlvbihiKXtyZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLGIsdHJ1ZSk7fSl8fGRpc3BhdGNoS2V5KGNtLG5hbWUsZSxmdW5jdGlvbihiKXtpZih0eXBlb2YgYj09InN0cmluZyI/L15nb1tBLVpdLy50ZXN0KGIpOmIubW90aW9uKQp7cmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSxiKX19KX1lbHNle3JldHVybiBkaXNwYXRjaEtleShjbSxuYW1lLGUsZnVuY3Rpb24oYil7cmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSxiKTt9KX19CmZ1bmN0aW9uIGhhbmRsZUNoYXJCaW5kaW5nKGNtLGUsY2gpe3JldHVybiBkaXNwYXRjaEtleShjbSwiJyIrY2grIiciLGUsZnVuY3Rpb24oYil7cmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSxiLHRydWUpO30pfQp2YXIgbGFzdFN0b3BwZWRLZXk9bnVsbDtmdW5jdGlvbiBvbktleURvd24oZSl7dmFyIGNtPXRoaXM7Y20uY3VyT3AuZm9jdXM9YWN0aXZlRWx0KCk7aWYoc2lnbmFsRE9NRXZlbnQoY20sZSkpe3JldHVybn0KaWYoaWUmJmllX3ZlcnNpb248MTEmJmUua2V5Q29kZT09Mjcpe2UucmV0dXJuVmFsdWU9ZmFsc2U7fQp2YXIgY29kZT1lLmtleUNvZGU7Y20uZGlzcGxheS5zaGlmdD1jb2RlPT0xNnx8ZS5zaGlmdEtleTt2YXIgaGFuZGxlZD1oYW5kbGVLZXlCaW5kaW5nKGNtLGUpO2lmKHByZXN0byl7bGFzdFN0b3BwZWRLZXk9aGFuZGxlZD9jb2RlOm51bGw7aWYoIWhhbmRsZWQmJmNvZGU9PTg4JiYhaGFzQ29weUV2ZW50JiYobWFjP2UubWV0YUtleTplLmN0cmxLZXkpKQp7Y20ucmVwbGFjZVNlbGVjdGlvbigiIixudWxsLCJjdXQiKTt9fQppZihjb2RlPT0xOCYmIS9cYkNvZGVNaXJyb3ItY3Jvc3NoYWlyXGIvLnRlc3QoY20uZGlzcGxheS5saW5lRGl2LmNsYXNzTmFtZSkpCntzaG93Q3Jvc3NIYWlyKGNtKTt9fQpmdW5jdGlvbiBzaG93Q3Jvc3NIYWlyKGNtKXt2YXIgbGluZURpdj1jbS5kaXNwbGF5LmxpbmVEaXY7YWRkQ2xhc3MobGluZURpdiwiQ29kZU1pcnJvci1jcm9zc2hhaXIiKTtmdW5jdGlvbiB1cChlKXtpZihlLmtleUNvZGU9PTE4fHwhZS5hbHRLZXkpe3JtQ2xhc3MobGluZURpdiwiQ29kZU1pcnJvci1jcm9zc2hhaXIiKTtvZmYoZG9jdW1lbnQsImtleXVwIix1cCk7b2ZmKGRvY3VtZW50LCJtb3VzZW92ZXIiLHVwKTt9fQpvbihkb2N1bWVudCwia2V5dXAiLHVwKTtvbihkb2N1bWVudCwibW91c2VvdmVyIix1cCk7fQpmdW5jdGlvbiBvbktleVVwKGUpe2lmKGUua2V5Q29kZT09MTYpe3RoaXMuZG9jLnNlbC5zaGlmdD1mYWxzZTt9CnNpZ25hbERPTUV2ZW50KHRoaXMsZSk7fQpmdW5jdGlvbiBvbktleVByZXNzKGUpe3ZhciBjbT10aGlzO2lmKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSxlKXx8c2lnbmFsRE9NRXZlbnQoY20sZSl8fGUuY3RybEtleSYmIWUuYWx0S2V5fHxtYWMmJmUubWV0YUtleSl7cmV0dXJufQp2YXIga2V5Q29kZT1lLmtleUNvZGUsY2hhckNvZGU9ZS5jaGFyQ29kZTtpZihwcmVzdG8mJmtleUNvZGU9PWxhc3RTdG9wcGVkS2V5KXtsYXN0U3RvcHBlZEtleT1udWxsO2VfcHJldmVudERlZmF1bHQoZSk7cmV0dXJufQppZigocHJlc3RvJiYoIWUud2hpY2h8fGUud2hpY2g8MTApKSYmaGFuZGxlS2V5QmluZGluZyhjbSxlKSl7cmV0dXJufQp2YXIgY2g9U3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZT09bnVsbD9rZXlDb2RlOmNoYXJDb2RlKTtpZihjaD09Ilx4MDgiKXtyZXR1cm59CmlmKGhhbmRsZUNoYXJCaW5kaW5nKGNtLGUsY2gpKXtyZXR1cm59CmNtLmRpc3BsYXkuaW5wdXQub25LZXlQcmVzcyhlKTt9CnZhciBET1VCTEVDTElDS19ERUxBWT00MDA7dmFyIFBhc3RDbGljaz1mdW5jdGlvbih0aW1lLHBvcyxidXR0b24pe3RoaXMudGltZT10aW1lO3RoaXMucG9zPXBvczt0aGlzLmJ1dHRvbj1idXR0b247fTtQYXN0Q2xpY2sucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odGltZSxwb3MsYnV0dG9uKXtyZXR1cm4gdGhpcy50aW1lK0RPVUJMRUNMSUNLX0RFTEFZPnRpbWUmJmNtcChwb3MsdGhpcy5wb3MpPT0wJiZidXR0b249PXRoaXMuYnV0dG9ufTt2YXIgbGFzdENsaWNrO3ZhciBsYXN0RG91YmxlQ2xpY2s7ZnVuY3Rpb24gY2xpY2tSZXBlYXQocG9zLGJ1dHRvbil7dmFyIG5vdz0rbmV3IERhdGU7aWYobGFzdERvdWJsZUNsaWNrJiZsYXN0RG91YmxlQ2xpY2suY29tcGFyZShub3cscG9zLGJ1dHRvbikpe2xhc3RDbGljaz1sYXN0RG91YmxlQ2xpY2s9bnVsbDtyZXR1cm4idHJpcGxlIn1lbHNlIGlmKGxhc3RDbGljayYmbGFzdENsaWNrLmNvbXBhcmUobm93LHBvcyxidXR0b24pKXtsYXN0RG91YmxlQ2xpY2s9bmV3IFBhc3RDbGljayhub3cscG9zLGJ1dHRvbik7bGFzdENsaWNrPW51bGw7cmV0dXJuImRvdWJsZSJ9ZWxzZXtsYXN0Q2xpY2s9bmV3IFBhc3RDbGljayhub3cscG9zLGJ1dHRvbik7bGFzdERvdWJsZUNsaWNrPW51bGw7cmV0dXJuInNpbmdsZSJ9fQpmdW5jdGlvbiBvbk1vdXNlRG93bihlKXt2YXIgY209dGhpcyxkaXNwbGF5PWNtLmRpc3BsYXk7aWYoc2lnbmFsRE9NRXZlbnQoY20sZSl8fGRpc3BsYXkuYWN0aXZlVG91Y2gmJmRpc3BsYXkuaW5wdXQuc3VwcG9ydHNUb3VjaCgpKXtyZXR1cm59CmRpc3BsYXkuaW5wdXQuZW5zdXJlUG9sbGVkKCk7ZGlzcGxheS5zaGlmdD1lLnNoaWZ0S2V5O2lmKGV2ZW50SW5XaWRnZXQoZGlzcGxheSxlKSl7aWYoIXdlYmtpdCl7ZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGU9ZmFsc2U7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZT10cnVlO30sMTAwKTt9CnJldHVybn0KaWYoY2xpY2tJbkd1dHRlcihjbSxlKSl7cmV0dXJufQp2YXIgcG9zPXBvc0Zyb21Nb3VzZShjbSxlKSxidXR0b249ZV9idXR0b24oZSkscmVwZWF0PXBvcz9jbGlja1JlcGVhdChwb3MsYnV0dG9uKToic2luZ2xlIjt3aW5kb3cuZm9jdXMoKTtpZihidXR0b249PTEmJmNtLnN0YXRlLnNlbGVjdGluZ1RleHQpCntjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0KGUpO30KaWYocG9zJiZoYW5kbGVNYXBwZWRCdXR0b24oY20sYnV0dG9uLHBvcyxyZXBlYXQsZSkpe3JldHVybn0KaWYoYnV0dG9uPT0xKXtpZihwb3Mpe2xlZnRCdXR0b25Eb3duKGNtLHBvcyxyZXBlYXQsZSk7fQplbHNlIGlmKGVfdGFyZ2V0KGUpPT1kaXNwbGF5LnNjcm9sbGVyKXtlX3ByZXZlbnREZWZhdWx0KGUpO319ZWxzZSBpZihidXR0b249PTIpe2lmKHBvcyl7ZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYyxwb3MpO30Kc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBkaXNwbGF5LmlucHV0LmZvY3VzKCk7fSwyMCk7fWVsc2UgaWYoYnV0dG9uPT0zKXtpZihjYXB0dXJlUmlnaHRDbGljayl7b25Db250ZXh0TWVudShjbSxlKTt9CmVsc2V7ZGVsYXlCbHVyRXZlbnQoY20pO319fQpmdW5jdGlvbiBoYW5kbGVNYXBwZWRCdXR0b24oY20sYnV0dG9uLHBvcyxyZXBlYXQsZXZlbnQpe3ZhciBuYW1lPSJDbGljayI7aWYocmVwZWF0PT0iZG91YmxlIil7bmFtZT0iRG91YmxlIituYW1lO30KZWxzZSBpZihyZXBlYXQ9PSJ0cmlwbGUiKXtuYW1lPSJUcmlwbGUiK25hbWU7fQpuYW1lPShidXR0b249PTE/IkxlZnQiOmJ1dHRvbj09Mj8iTWlkZGxlIjoiUmlnaHQiKStuYW1lO3JldHVybiBkaXNwYXRjaEtleShjbSxhZGRNb2RpZmllck5hbWVzKG5hbWUsZXZlbnQpLGV2ZW50LGZ1bmN0aW9uKGJvdW5kKXtpZih0eXBlb2YgYm91bmQ9PSJzdHJpbmciKXtib3VuZD1jb21tYW5kc1tib3VuZF07fQppZighYm91bmQpe3JldHVybiBmYWxzZX0KdmFyIGRvbmU9ZmFsc2U7dHJ5e2lmKGNtLmlzUmVhZE9ubHkoKSl7Y20uc3RhdGUuc3VwcHJlc3NFZGl0cz10cnVlO30KZG9uZT1ib3VuZChjbSxwb3MpIT1QYXNzO31maW5hbGx5e2NtLnN0YXRlLnN1cHByZXNzRWRpdHM9ZmFsc2U7fQpyZXR1cm4gZG9uZX0pfQpmdW5jdGlvbiBjb25maWd1cmVNb3VzZShjbSxyZXBlYXQsZXZlbnQpe3ZhciBvcHRpb249Y20uZ2V0T3B0aW9uKCJjb25maWd1cmVNb3VzZSIpO3ZhciB2YWx1ZT1vcHRpb24/b3B0aW9uKGNtLHJlcGVhdCxldmVudCk6e307aWYodmFsdWUudW5pdD09bnVsbCl7dmFyIHJlY3Q9Y2hyb21lT1M/ZXZlbnQuc2hpZnRLZXkmJmV2ZW50Lm1ldGFLZXk6ZXZlbnQuYWx0S2V5O3ZhbHVlLnVuaXQ9cmVjdD8icmVjdGFuZ2xlIjpyZXBlYXQ9PSJzaW5nbGUiPyJjaGFyIjpyZXBlYXQ9PSJkb3VibGUiPyJ3b3JkIjoibGluZSI7fQppZih2YWx1ZS5leHRlbmQ9PW51bGx8fGNtLmRvYy5leHRlbmQpe3ZhbHVlLmV4dGVuZD1jbS5kb2MuZXh0ZW5kfHxldmVudC5zaGlmdEtleTt9CmlmKHZhbHVlLmFkZE5ldz09bnVsbCl7dmFsdWUuYWRkTmV3PW1hYz9ldmVudC5tZXRhS2V5OmV2ZW50LmN0cmxLZXk7fQppZih2YWx1ZS5tb3ZlT25EcmFnPT1udWxsKXt2YWx1ZS5tb3ZlT25EcmFnPSEobWFjP2V2ZW50LmFsdEtleTpldmVudC5jdHJsS2V5KTt9CnJldHVybiB2YWx1ZX0KZnVuY3Rpb24gbGVmdEJ1dHRvbkRvd24oY20scG9zLHJlcGVhdCxldmVudCl7aWYoaWUpe3NldFRpbWVvdXQoYmluZChlbnN1cmVGb2N1cyxjbSksMCk7fQplbHNle2NtLmN1ck9wLmZvY3VzPWFjdGl2ZUVsdCgpO30KdmFyIGJlaGF2aW9yPWNvbmZpZ3VyZU1vdXNlKGNtLHJlcGVhdCxldmVudCk7dmFyIHNlbD1jbS5kb2Muc2VsLGNvbnRhaW5lZDtpZihjbS5vcHRpb25zLmRyYWdEcm9wJiZkcmFnQW5kRHJvcCYmIWNtLmlzUmVhZE9ubHkoKSYmcmVwZWF0PT0ic2luZ2xlIiYmKGNvbnRhaW5lZD1zZWwuY29udGFpbnMocG9zKSk+LTEmJihjbXAoKGNvbnRhaW5lZD1zZWwucmFuZ2VzW2NvbnRhaW5lZF0pLmZyb20oKSxwb3MpPDB8fHBvcy54UmVsPjApJiYoY21wKGNvbnRhaW5lZC50bygpLHBvcyk+MHx8cG9zLnhSZWw8MCkpCntsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLGV2ZW50LHBvcyxiZWhhdmlvcik7fQplbHNlCntsZWZ0QnV0dG9uU2VsZWN0KGNtLGV2ZW50LHBvcyxiZWhhdmlvcik7fX0KZnVuY3Rpb24gbGVmdEJ1dHRvblN0YXJ0RHJhZyhjbSxldmVudCxwb3MsYmVoYXZpb3Ipe3ZhciBkaXNwbGF5PWNtLmRpc3BsYXksbW92ZWQ9ZmFsc2U7dmFyIGRyYWdFbmQ9b3BlcmF0aW9uKGNtLGZ1bmN0aW9uKGUpe2lmKHdlYmtpdCl7ZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGU9ZmFsc2U7fQpjbS5zdGF0ZS5kcmFnZ2luZ1RleHQ9ZmFsc2U7b2ZmKGRvY3VtZW50LCJtb3VzZXVwIixkcmFnRW5kKTtvZmYoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbW91c2VNb3ZlKTtvZmYoZGlzcGxheS5zY3JvbGxlciwiZHJhZ3N0YXJ0IixkcmFnU3RhcnQpO29mZihkaXNwbGF5LnNjcm9sbGVyLCJkcm9wIixkcmFnRW5kKTtpZighbW92ZWQpe2VfcHJldmVudERlZmF1bHQoZSk7aWYoIWJlaGF2aW9yLmFkZE5ldykKe2V4dGVuZFNlbGVjdGlvbihjbS5kb2MscG9zLG51bGwsbnVsbCxiZWhhdmlvci5leHRlbmQpO30KaWYod2Via2l0fHxpZSYmaWVfdmVyc2lvbj09OSkKe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmZvY3VzKCk7ZGlzcGxheS5pbnB1dC5mb2N1cygpO30sMjApO30KZWxzZQp7ZGlzcGxheS5pbnB1dC5mb2N1cygpO319fSk7dmFyIG1vdXNlTW92ZT1mdW5jdGlvbihlMil7bW92ZWQ9bW92ZWR8fE1hdGguYWJzKGV2ZW50LmNsaWVudFgtZTIuY2xpZW50WCkrTWF0aC5hYnMoZXZlbnQuY2xpZW50WS1lMi5jbGllbnRZKT49MTA7fTt2YXIgZHJhZ1N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG1vdmVkPXRydWU7fTtpZih3ZWJraXQpe2Rpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlPXRydWU7fQpjbS5zdGF0ZS5kcmFnZ2luZ1RleHQ9ZHJhZ0VuZDtkcmFnRW5kLmNvcHk9IWJlaGF2aW9yLm1vdmVPbkRyYWc7aWYoZGlzcGxheS5zY3JvbGxlci5kcmFnRHJvcCl7ZGlzcGxheS5zY3JvbGxlci5kcmFnRHJvcCgpO30Kb24oZG9jdW1lbnQsIm1vdXNldXAiLGRyYWdFbmQpO29uKGRvY3VtZW50LCJtb3VzZW1vdmUiLG1vdXNlTW92ZSk7b24oZGlzcGxheS5zY3JvbGxlciwiZHJhZ3N0YXJ0IixkcmFnU3RhcnQpO29uKGRpc3BsYXkuc2Nyb2xsZXIsImRyb3AiLGRyYWdFbmQpO2RlbGF5Qmx1ckV2ZW50KGNtKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGRpc3BsYXkuaW5wdXQuZm9jdXMoKTt9LDIwKTt9CmZ1bmN0aW9uIHJhbmdlRm9yVW5pdChjbSxwb3MsdW5pdCl7aWYodW5pdD09ImNoYXIiKXtyZXR1cm4gbmV3IFJhbmdlKHBvcyxwb3MpfQppZih1bml0PT0id29yZCIpe3JldHVybiBjbS5maW5kV29yZEF0KHBvcyl9CmlmKHVuaXQ9PSJsaW5lIil7cmV0dXJuIG5ldyBSYW5nZShQb3MocG9zLmxpbmUsMCksY2xpcFBvcyhjbS5kb2MsUG9zKHBvcy5saW5lKzEsMCkpKX0KdmFyIHJlc3VsdD11bml0KGNtLHBvcyk7cmV0dXJuIG5ldyBSYW5nZShyZXN1bHQuZnJvbSxyZXN1bHQudG8pfQpmdW5jdGlvbiBsZWZ0QnV0dG9uU2VsZWN0KGNtLGV2ZW50LHN0YXJ0LGJlaGF2aW9yKXt2YXIgZGlzcGxheT1jbS5kaXNwbGF5LGRvYz1jbS5kb2M7ZV9wcmV2ZW50RGVmYXVsdChldmVudCk7dmFyIG91clJhbmdlLG91ckluZGV4LHN0YXJ0U2VsPWRvYy5zZWwscmFuZ2VzPXN0YXJ0U2VsLnJhbmdlcztpZihiZWhhdmlvci5hZGROZXcmJiFiZWhhdmlvci5leHRlbmQpe291ckluZGV4PWRvYy5zZWwuY29udGFpbnMoc3RhcnQpO2lmKG91ckluZGV4Pi0xKQp7b3VyUmFuZ2U9cmFuZ2VzW291ckluZGV4XTt9CmVsc2UKe291clJhbmdlPW5ldyBSYW5nZShzdGFydCxzdGFydCk7fX1lbHNle291clJhbmdlPWRvYy5zZWwucHJpbWFyeSgpO291ckluZGV4PWRvYy5zZWwucHJpbUluZGV4O30KaWYoYmVoYXZpb3IudW5pdD09InJlY3RhbmdsZSIpe2lmKCFiZWhhdmlvci5hZGROZXcpe291clJhbmdlPW5ldyBSYW5nZShzdGFydCxzdGFydCk7fQpzdGFydD1wb3NGcm9tTW91c2UoY20sZXZlbnQsdHJ1ZSx0cnVlKTtvdXJJbmRleD0tMTt9ZWxzZXt2YXIgcmFuZ2UkJDE9cmFuZ2VGb3JVbml0KGNtLHN0YXJ0LGJlaGF2aW9yLnVuaXQpO2lmKGJlaGF2aW9yLmV4dGVuZCkKe291clJhbmdlPWV4dGVuZFJhbmdlKG91clJhbmdlLHJhbmdlJCQxLmFuY2hvcixyYW5nZSQkMS5oZWFkLGJlaGF2aW9yLmV4dGVuZCk7fQplbHNlCntvdXJSYW5nZT1yYW5nZSQkMTt9fQppZighYmVoYXZpb3IuYWRkTmV3KXtvdXJJbmRleD0wO3NldFNlbGVjdGlvbihkb2MsbmV3IFNlbGVjdGlvbihbb3VyUmFuZ2VdLDApLHNlbF9tb3VzZSk7c3RhcnRTZWw9ZG9jLnNlbDt9ZWxzZSBpZihvdXJJbmRleD09LTEpe291ckluZGV4PXJhbmdlcy5sZW5ndGg7c2V0U2VsZWN0aW9uKGRvYyxub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLmNvbmNhdChbb3VyUmFuZ2VdKSxvdXJJbmRleCkse3Njcm9sbDpmYWxzZSxvcmlnaW46Iiptb3VzZSJ9KTt9ZWxzZSBpZihyYW5nZXMubGVuZ3RoPjEmJnJhbmdlc1tvdXJJbmRleF0uZW1wdHkoKSYmYmVoYXZpb3IudW5pdD09ImNoYXIiJiYhYmVoYXZpb3IuZXh0ZW5kKXtzZXRTZWxlY3Rpb24oZG9jLG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMuc2xpY2UoMCxvdXJJbmRleCkuY29uY2F0KHJhbmdlcy5zbGljZShvdXJJbmRleCsxKSksMCkse3Njcm9sbDpmYWxzZSxvcmlnaW46Iiptb3VzZSJ9KTtzdGFydFNlbD1kb2Muc2VsO31lbHNle3JlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLG91ckluZGV4LG91clJhbmdlLHNlbF9tb3VzZSk7fQp2YXIgbGFzdFBvcz1zdGFydDtmdW5jdGlvbiBleHRlbmRUbyhwb3Mpe2lmKGNtcChsYXN0UG9zLHBvcyk9PTApe3JldHVybn0KbGFzdFBvcz1wb3M7aWYoYmVoYXZpb3IudW5pdD09InJlY3RhbmdsZSIpe3ZhciByYW5nZXM9W10sdGFiU2l6ZT1jbS5vcHRpb25zLnRhYlNpemU7dmFyIHN0YXJ0Q29sPWNvdW50Q29sdW1uKGdldExpbmUoZG9jLHN0YXJ0LmxpbmUpLnRleHQsc3RhcnQuY2gsdGFiU2l6ZSk7dmFyIHBvc0NvbD1jb3VudENvbHVtbihnZXRMaW5lKGRvYyxwb3MubGluZSkudGV4dCxwb3MuY2gsdGFiU2l6ZSk7dmFyIGxlZnQ9TWF0aC5taW4oc3RhcnRDb2wscG9zQ29sKSxyaWdodD1NYXRoLm1heChzdGFydENvbCxwb3NDb2wpO2Zvcih2YXIgbGluZT1NYXRoLm1pbihzdGFydC5saW5lLHBvcy5saW5lKSxlbmQ9TWF0aC5taW4oY20ubGFzdExpbmUoKSxNYXRoLm1heChzdGFydC5saW5lLHBvcy5saW5lKSk7bGluZTw9ZW5kO2xpbmUrKyl7dmFyIHRleHQ9Z2V0TGluZShkb2MsbGluZSkudGV4dCxsZWZ0UG9zPWZpbmRDb2x1bW4odGV4dCxsZWZ0LHRhYlNpemUpO2lmKGxlZnQ9PXJpZ2h0KQp7cmFuZ2VzLnB1c2gobmV3IFJhbmdlKFBvcyhsaW5lLGxlZnRQb3MpLFBvcyhsaW5lLGxlZnRQb3MpKSk7fQplbHNlIGlmKHRleHQubGVuZ3RoPmxlZnRQb3MpCntyYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsbGVmdFBvcyksUG9zKGxpbmUsZmluZENvbHVtbih0ZXh0LHJpZ2h0LHRhYlNpemUpKSkpO319CmlmKCFyYW5nZXMubGVuZ3RoKXtyYW5nZXMucHVzaChuZXcgUmFuZ2Uoc3RhcnQsc3RhcnQpKTt9CnNldFNlbGVjdGlvbihkb2Msbm9ybWFsaXplU2VsZWN0aW9uKHN0YXJ0U2VsLnJhbmdlcy5zbGljZSgwLG91ckluZGV4KS5jb25jYXQocmFuZ2VzKSxvdXJJbmRleCkse29yaWdpbjoiKm1vdXNlIixzY3JvbGw6ZmFsc2V9KTtjbS5zY3JvbGxJbnRvVmlldyhwb3MpO31lbHNle3ZhciBvbGRSYW5nZT1vdXJSYW5nZTt2YXIgcmFuZ2UkJDE9cmFuZ2VGb3JVbml0KGNtLHBvcyxiZWhhdmlvci51bml0KTt2YXIgYW5jaG9yPW9sZFJhbmdlLmFuY2hvcixoZWFkO2lmKGNtcChyYW5nZSQkMS5hbmNob3IsYW5jaG9yKT4wKXtoZWFkPXJhbmdlJCQxLmhlYWQ7YW5jaG9yPW1pblBvcyhvbGRSYW5nZS5mcm9tKCkscmFuZ2UkJDEuYW5jaG9yKTt9ZWxzZXtoZWFkPXJhbmdlJCQxLmFuY2hvcjthbmNob3I9bWF4UG9zKG9sZFJhbmdlLnRvKCkscmFuZ2UkJDEuaGVhZCk7fQp2YXIgcmFuZ2VzJDE9c3RhcnRTZWwucmFuZ2VzLnNsaWNlKDApO3JhbmdlcyQxW291ckluZGV4XT1iaWRpU2ltcGxpZnkoY20sbmV3IFJhbmdlKGNsaXBQb3MoZG9jLGFuY2hvciksaGVhZCkpO3NldFNlbGVjdGlvbihkb2Msbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcyQxLG91ckluZGV4KSxzZWxfbW91c2UpO319CnZhciBlZGl0b3JTaXplPWRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgY291bnRlcj0wO2Z1bmN0aW9uIGV4dGVuZChlKXt2YXIgY3VyQ291bnQ9Kytjb3VudGVyO3ZhciBjdXI9cG9zRnJvbU1vdXNlKGNtLGUsdHJ1ZSxiZWhhdmlvci51bml0PT0icmVjdGFuZ2xlIik7aWYoIWN1cil7cmV0dXJufQppZihjbXAoY3VyLGxhc3RQb3MpIT0wKXtjbS5jdXJPcC5mb2N1cz1hY3RpdmVFbHQoKTtleHRlbmRUbyhjdXIpO3ZhciB2aXNpYmxlPXZpc2libGVMaW5lcyhkaXNwbGF5LGRvYyk7aWYoY3VyLmxpbmU+PXZpc2libGUudG98fGN1ci5saW5lPHZpc2libGUuZnJvbSkKe3NldFRpbWVvdXQob3BlcmF0aW9uKGNtLGZ1bmN0aW9uKCl7aWYoY291bnRlcj09Y3VyQ291bnQpe2V4dGVuZChlKTt9fSksMTUwKTt9fWVsc2V7dmFyIG91dHNpZGU9ZS5jbGllbnRZPGVkaXRvclNpemUudG9wPy0yMDplLmNsaWVudFk+ZWRpdG9yU2l6ZS5ib3R0b20/MjA6MDtpZihvdXRzaWRlKXtzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSxmdW5jdGlvbigpe2lmKGNvdW50ZXIhPWN1ckNvdW50KXtyZXR1cm59CmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wKz1vdXRzaWRlO2V4dGVuZChlKTt9KSw1MCk7fX19CmZ1bmN0aW9uIGRvbmUoZSl7Y20uc3RhdGUuc2VsZWN0aW5nVGV4dD1mYWxzZTtjb3VudGVyPUluZmluaXR5O2VfcHJldmVudERlZmF1bHQoZSk7ZGlzcGxheS5pbnB1dC5mb2N1cygpO29mZihkb2N1bWVudCwibW91c2Vtb3ZlIixtb3ZlKTtvZmYoZG9jdW1lbnQsIm1vdXNldXAiLHVwKTtkb2MuaGlzdG9yeS5sYXN0U2VsT3JpZ2luPW51bGw7fQp2YXIgbW92ZT1vcGVyYXRpb24oY20sZnVuY3Rpb24oZSl7aWYoIWVfYnV0dG9uKGUpKXtkb25lKGUpO30KZWxzZXtleHRlbmQoZSk7fX0pO3ZhciB1cD1vcGVyYXRpb24oY20sZG9uZSk7Y20uc3RhdGUuc2VsZWN0aW5nVGV4dD11cDtvbihkb2N1bWVudCwibW91c2Vtb3ZlIixtb3ZlKTtvbihkb2N1bWVudCwibW91c2V1cCIsdXApO30KZnVuY3Rpb24gYmlkaVNpbXBsaWZ5KGNtLHJhbmdlJCQxKXt2YXIgYW5jaG9yPXJhbmdlJCQxLmFuY2hvcjt2YXIgaGVhZD1yYW5nZSQkMS5oZWFkO3ZhciBhbmNob3JMaW5lPWdldExpbmUoY20uZG9jLGFuY2hvci5saW5lKTtpZihjbXAoYW5jaG9yLGhlYWQpPT0wJiZhbmNob3Iuc3RpY2t5PT1oZWFkLnN0aWNreSl7cmV0dXJuIHJhbmdlJCQxfQp2YXIgb3JkZXI9Z2V0T3JkZXIoYW5jaG9yTGluZSk7aWYoIW9yZGVyKXtyZXR1cm4gcmFuZ2UkJDF9CnZhciBpbmRleD1nZXRCaWRpUGFydEF0KG9yZGVyLGFuY2hvci5jaCxhbmNob3Iuc3RpY2t5KSxwYXJ0PW9yZGVyW2luZGV4XTtpZihwYXJ0LmZyb20hPWFuY2hvci5jaCYmcGFydC50byE9YW5jaG9yLmNoKXtyZXR1cm4gcmFuZ2UkJDF9CnZhciBib3VuZGFyeT1pbmRleCsoKHBhcnQuZnJvbT09YW5jaG9yLmNoKT09KHBhcnQubGV2ZWwhPTEpPzA6MSk7aWYoYm91bmRhcnk9PTB8fGJvdW5kYXJ5PT1vcmRlci5sZW5ndGgpe3JldHVybiByYW5nZSQkMX0KdmFyIGxlZnRTaWRlO2lmKGhlYWQubGluZSE9YW5jaG9yLmxpbmUpe2xlZnRTaWRlPShoZWFkLmxpbmUtYW5jaG9yLmxpbmUpKihjbS5kb2MuZGlyZWN0aW9uPT0ibHRyIj8xOi0xKT4wO31lbHNle3ZhciBoZWFkSW5kZXg9Z2V0QmlkaVBhcnRBdChvcmRlcixoZWFkLmNoLGhlYWQuc3RpY2t5KTt2YXIgZGlyPWhlYWRJbmRleC1pbmRleHx8KGhlYWQuY2gtYW5jaG9yLmNoKSoocGFydC5sZXZlbD09MT8tMToxKTtpZihoZWFkSW5kZXg9PWJvdW5kYXJ5LTF8fGhlYWRJbmRleD09Ym91bmRhcnkpCntsZWZ0U2lkZT1kaXI8MDt9CmVsc2UKe2xlZnRTaWRlPWRpcj4wO319CnZhciB1c2VQYXJ0PW9yZGVyW2JvdW5kYXJ5KyhsZWZ0U2lkZT8tMTowKV07dmFyIGZyb209bGVmdFNpZGU9PSh1c2VQYXJ0LmxldmVsPT0xKTt2YXIgY2g9ZnJvbT91c2VQYXJ0LmZyb206dXNlUGFydC50byxzdGlja3k9ZnJvbT8iYWZ0ZXIiOiJiZWZvcmUiO3JldHVybiBhbmNob3IuY2g9PWNoJiZhbmNob3Iuc3RpY2t5PT1zdGlja3k/cmFuZ2UkJDE6bmV3IFJhbmdlKG5ldyBQb3MoYW5jaG9yLmxpbmUsY2gsc3RpY2t5KSxoZWFkKX0KZnVuY3Rpb24gZ3V0dGVyRXZlbnQoY20sZSx0eXBlLHByZXZlbnQpe3ZhciBtWCxtWTtpZihlLnRvdWNoZXMpe21YPWUudG91Y2hlc1swXS5jbGllbnRYO21ZPWUudG91Y2hlc1swXS5jbGllbnRZO31lbHNle3RyeXttWD1lLmNsaWVudFg7bVk9ZS5jbGllbnRZO30KY2F0Y2goZSl7cmV0dXJuIGZhbHNlfX0KaWYobVg+PU1hdGguZmxvb3IoY20uZGlzcGxheS5ndXR0ZXJzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSl7cmV0dXJuIGZhbHNlfQppZihwcmV2ZW50KXtlX3ByZXZlbnREZWZhdWx0KGUpO30KdmFyIGRpc3BsYXk9Y20uZGlzcGxheTt2YXIgbGluZUJveD1kaXNwbGF5LmxpbmVEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYobVk+bGluZUJveC5ib3R0b218fCFoYXNIYW5kbGVyKGNtLHR5cGUpKXtyZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpfQptWS09bGluZUJveC50b3AtZGlzcGxheS52aWV3T2Zmc2V0O2Zvcih2YXIgaT0wO2k8Y20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsrK2kpe3ZhciBnPWRpc3BsYXkuZ3V0dGVycy5jaGlsZE5vZGVzW2ldO2lmKGcmJmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ+PW1YKXt2YXIgbGluZT1saW5lQXRIZWlnaHQoY20uZG9jLG1ZKTt2YXIgZ3V0dGVyPWNtLm9wdGlvbnMuZ3V0dGVyc1tpXTtzaWduYWwoY20sdHlwZSxjbSxsaW5lLGd1dHRlcixlKTtyZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpfX19CmZ1bmN0aW9uIGNsaWNrSW5HdXR0ZXIoY20sZSl7cmV0dXJuIGd1dHRlckV2ZW50KGNtLGUsImd1dHRlckNsaWNrIix0cnVlKX0KZnVuY3Rpb24gb25Db250ZXh0TWVudShjbSxlKXtpZihldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksZSl8fGNvbnRleHRNZW51SW5HdXR0ZXIoY20sZSkpe3JldHVybn0KaWYoc2lnbmFsRE9NRXZlbnQoY20sZSwiY29udGV4dG1lbnUiKSl7cmV0dXJufQpjbS5kaXNwbGF5LmlucHV0Lm9uQ29udGV4dE1lbnUoZSk7fQpmdW5jdGlvbiBjb250ZXh0TWVudUluR3V0dGVyKGNtLGUpe2lmKCFoYXNIYW5kbGVyKGNtLCJndXR0ZXJDb250ZXh0TWVudSIpKXtyZXR1cm4gZmFsc2V9CnJldHVybiBndXR0ZXJFdmVudChjbSxlLCJndXR0ZXJDb250ZXh0TWVudSIsZmFsc2UpfQpmdW5jdGlvbiB0aGVtZUNoYW5nZWQoY20pe2NtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWU9Y20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZS5yZXBsYWNlKC9ccypjbS1zLVxTKy9nLCIiKSsKY20ub3B0aW9ucy50aGVtZS5yZXBsYWNlKC8oXnxccylccyovZywiIGNtLXMtIik7Y2xlYXJDYWNoZXMoY20pO30KdmFyIEluaXQ9e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkNvZGVNaXJyb3IuSW5pdCJ9fTt2YXIgZGVmYXVsdHM9e307dmFyIG9wdGlvbkhhbmRsZXJzPXt9O2Z1bmN0aW9uIGRlZmluZU9wdGlvbnMoQ29kZU1pcnJvcil7dmFyIG9wdGlvbkhhbmRsZXJzPUNvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnM7ZnVuY3Rpb24gb3B0aW9uKG5hbWUsZGVmbHQsaGFuZGxlLG5vdE9uSW5pdCl7Q29kZU1pcnJvci5kZWZhdWx0c1tuYW1lXT1kZWZsdDtpZihoYW5kbGUpe29wdGlvbkhhbmRsZXJzW25hbWVdPW5vdE9uSW5pdD9mdW5jdGlvbihjbSx2YWwsb2xkKXtpZihvbGQhPUluaXQpe2hhbmRsZShjbSx2YWwsb2xkKTt9fTpoYW5kbGU7fX0KQ29kZU1pcnJvci5kZWZpbmVPcHRpb249b3B0aW9uO0NvZGVNaXJyb3IuSW5pdD1Jbml0O29wdGlvbigidmFsdWUiLCIiLGZ1bmN0aW9uKGNtLHZhbCl7cmV0dXJuIGNtLnNldFZhbHVlKHZhbCk7fSx0cnVlKTtvcHRpb24oIm1vZGUiLG51bGwsZnVuY3Rpb24oY20sdmFsKXtjbS5kb2MubW9kZU9wdGlvbj12YWw7bG9hZE1vZGUoY20pO30sdHJ1ZSk7b3B0aW9uKCJpbmRlbnRVbml0IiwyLGxvYWRNb2RlLHRydWUpO29wdGlvbigiaW5kZW50V2l0aFRhYnMiLGZhbHNlKTtvcHRpb24oInNtYXJ0SW5kZW50Iix0cnVlKTtvcHRpb24oInRhYlNpemUiLDQsZnVuY3Rpb24oY20pe3Jlc2V0TW9kZVN0YXRlKGNtKTtjbGVhckNhY2hlcyhjbSk7cmVnQ2hhbmdlKGNtKTt9LHRydWUpO29wdGlvbigibGluZVNlcGFyYXRvciIsbnVsbCxmdW5jdGlvbihjbSx2YWwpe2NtLmRvYy5saW5lU2VwPXZhbDtpZighdmFsKXtyZXR1cm59CnZhciBuZXdCcmVha3M9W10sbGluZU5vPWNtLmRvYy5maXJzdDtjbS5kb2MuaXRlcihmdW5jdGlvbihsaW5lKXtmb3IodmFyIHBvcz0wOzspe3ZhciBmb3VuZD1saW5lLnRleHQuaW5kZXhPZih2YWwscG9zKTtpZihmb3VuZD09LTEpe2JyZWFrfQpwb3M9Zm91bmQrdmFsLmxlbmd0aDtuZXdCcmVha3MucHVzaChQb3MobGluZU5vLGZvdW5kKSk7fQpsaW5lTm8rKzt9KTtmb3IodmFyIGk9bmV3QnJlYWtzLmxlbmd0aC0xO2k+PTA7aS0tKQp7cmVwbGFjZVJhbmdlKGNtLmRvYyx2YWwsbmV3QnJlYWtzW2ldLFBvcyhuZXdCcmVha3NbaV0ubGluZSxuZXdCcmVha3NbaV0uY2grdmFsLmxlbmd0aCkpO319KTtvcHRpb24oInNwZWNpYWxDaGFycyIsL1tcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYxY1x1MjAwYi1cdTIwMGZcdTIwMjhcdTIwMjlcdWZlZmZdL2csZnVuY3Rpb24oY20sdmFsLG9sZCl7Y20uc3RhdGUuc3BlY2lhbENoYXJzPW5ldyBSZWdFeHAodmFsLnNvdXJjZSsodmFsLnRlc3QoIlx0Iik/IiI6InxcdCIpLCJnIik7aWYob2xkIT1Jbml0KXtjbS5yZWZyZXNoKCk7fX0pO29wdGlvbigic3BlY2lhbENoYXJQbGFjZWhvbGRlciIsZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIsZnVuY3Rpb24oY20pe3JldHVybiBjbS5yZWZyZXNoKCk7fSx0cnVlKTtvcHRpb24oImVsZWN0cmljQ2hhcnMiLHRydWUpO29wdGlvbigiaW5wdXRTdHlsZSIsbW9iaWxlPyJjb250ZW50ZWRpdGFibGUiOiJ0ZXh0YXJlYSIsZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoImlucHV0U3R5bGUgY2FuIG5vdCAoeWV0KSBiZSBjaGFuZ2VkIGluIGEgcnVubmluZyBlZGl0b3IiKX0sdHJ1ZSk7b3B0aW9uKCJzcGVsbGNoZWNrIixmYWxzZSxmdW5jdGlvbihjbSx2YWwpe3JldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjaz12YWw7fSx0cnVlKTtvcHRpb24oInJ0bE1vdmVWaXN1YWxseSIsIXdpbmRvd3MpO29wdGlvbigid2hvbGVMaW5lVXBkYXRlQmVmb3JlIix0cnVlKTtvcHRpb24oInRoZW1lIiwiZGVmYXVsdCIsZnVuY3Rpb24oY20pe3RoZW1lQ2hhbmdlZChjbSk7Z3V0dGVyc0NoYW5nZWQoY20pO30sdHJ1ZSk7b3B0aW9uKCJrZXlNYXAiLCJkZWZhdWx0IixmdW5jdGlvbihjbSx2YWwsb2xkKXt2YXIgbmV4dD1nZXRLZXlNYXAodmFsKTt2YXIgcHJldj1vbGQhPUluaXQmJmdldEtleU1hcChvbGQpO2lmKHByZXYmJnByZXYuZGV0YWNoKXtwcmV2LmRldGFjaChjbSxuZXh0KTt9CmlmKG5leHQuYXR0YWNoKXtuZXh0LmF0dGFjaChjbSxwcmV2fHxudWxsKTt9fSk7b3B0aW9uKCJleHRyYUtleXMiLG51bGwpO29wdGlvbigiY29uZmlndXJlTW91c2UiLG51bGwpO29wdGlvbigibGluZVdyYXBwaW5nIixmYWxzZSx3cmFwcGluZ0NoYW5nZWQsdHJ1ZSk7b3B0aW9uKCJndXR0ZXJzIixbXSxmdW5jdGlvbihjbSl7c2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpO2d1dHRlcnNDaGFuZ2VkKGNtKTt9LHRydWUpO29wdGlvbigiZml4ZWRHdXR0ZXIiLHRydWUsZnVuY3Rpb24oY20sdmFsKXtjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdD12YWw/Y29tcGVuc2F0ZUZvckhTY3JvbGwoY20uZGlzcGxheSkrInB4IjoiMCI7Y20ucmVmcmVzaCgpO30sdHJ1ZSk7b3B0aW9uKCJjb3Zlckd1dHRlck5leHRUb1Njcm9sbGJhciIsZmFsc2UsZnVuY3Rpb24oY20pe3JldHVybiB1cGRhdGVTY3JvbGxiYXJzKGNtKTt9LHRydWUpO29wdGlvbigic2Nyb2xsYmFyU3R5bGUiLCJuYXRpdmUiLGZ1bmN0aW9uKGNtKXtpbml0U2Nyb2xsYmFycyhjbSk7dXBkYXRlU2Nyb2xsYmFycyhjbSk7Y20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChjbS5kb2Muc2Nyb2xsVG9wKTtjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsTGVmdChjbS5kb2Muc2Nyb2xsTGVmdCk7fSx0cnVlKTtvcHRpb24oImxpbmVOdW1iZXJzIixmYWxzZSxmdW5jdGlvbihjbSl7c2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpO2d1dHRlcnNDaGFuZ2VkKGNtKTt9LHRydWUpO29wdGlvbigiZmlyc3RMaW5lTnVtYmVyIiwxLGd1dHRlcnNDaGFuZ2VkLHRydWUpO29wdGlvbigibGluZU51bWJlckZvcm1hdHRlciIsZnVuY3Rpb24oaW50ZWdlcil7cmV0dXJuIGludGVnZXI7fSxndXR0ZXJzQ2hhbmdlZCx0cnVlKTtvcHRpb24oInNob3dDdXJzb3JXaGVuU2VsZWN0aW5nIixmYWxzZSx1cGRhdGVTZWxlY3Rpb24sdHJ1ZSk7b3B0aW9uKCJyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUiLHRydWUpO29wdGlvbigibGluZVdpc2VDb3B5Q3V0Iix0cnVlKTtvcHRpb24oInBhc3RlTGluZXNQZXJTZWxlY3Rpb24iLHRydWUpO29wdGlvbigicmVhZE9ubHkiLGZhbHNlLGZ1bmN0aW9uKGNtLHZhbCl7aWYodmFsPT0ibm9jdXJzb3IiKXtvbkJsdXIoY20pO2NtLmRpc3BsYXkuaW5wdXQuYmx1cigpO30KY20uZGlzcGxheS5pbnB1dC5yZWFkT25seUNoYW5nZWQodmFsKTt9KTtvcHRpb24oImRpc2FibGVJbnB1dCIsZmFsc2UsZnVuY3Rpb24oY20sdmFsKXtpZighdmFsKXtjbS5kaXNwbGF5LmlucHV0LnJlc2V0KCk7fX0sdHJ1ZSk7b3B0aW9uKCJkcmFnRHJvcCIsdHJ1ZSxkcmFnRHJvcENoYW5nZWQpO29wdGlvbigiYWxsb3dEcm9wRmlsZVR5cGVzIixudWxsKTtvcHRpb24oImN1cnNvckJsaW5rUmF0ZSIsNTMwKTtvcHRpb24oImN1cnNvclNjcm9sbE1hcmdpbiIsMCk7b3B0aW9uKCJjdXJzb3JIZWlnaHQiLDEsdXBkYXRlU2VsZWN0aW9uLHRydWUpO29wdGlvbigic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSIsdHJ1ZSx1cGRhdGVTZWxlY3Rpb24sdHJ1ZSk7b3B0aW9uKCJ3b3JrVGltZSIsMTAwKTtvcHRpb24oIndvcmtEZWxheSIsMTAwKTtvcHRpb24oImZsYXR0ZW5TcGFucyIsdHJ1ZSxyZXNldE1vZGVTdGF0ZSx0cnVlKTtvcHRpb24oImFkZE1vZGVDbGFzcyIsZmFsc2UscmVzZXRNb2RlU3RhdGUsdHJ1ZSk7b3B0aW9uKCJwb2xsSW50ZXJ2YWwiLDEwMCk7b3B0aW9uKCJ1bmRvRGVwdGgiLDIwMCxmdW5jdGlvbihjbSx2YWwpe3JldHVybiBjbS5kb2MuaGlzdG9yeS51bmRvRGVwdGg9dmFsO30pO29wdGlvbigiaGlzdG9yeUV2ZW50RGVsYXkiLDEyNTApO29wdGlvbigidmlld3BvcnRNYXJnaW4iLDEwLGZ1bmN0aW9uKGNtKXtyZXR1cm4gY20ucmVmcmVzaCgpO30sdHJ1ZSk7b3B0aW9uKCJtYXhIaWdobGlnaHRMZW5ndGgiLDEwMDAwLHJlc2V0TW9kZVN0YXRlLHRydWUpO29wdGlvbigibW92ZUlucHV0V2l0aEN1cnNvciIsdHJ1ZSxmdW5jdGlvbihjbSx2YWwpe2lmKCF2YWwpe2NtLmRpc3BsYXkuaW5wdXQucmVzZXRQb3NpdGlvbigpO319KTtvcHRpb24oInRhYmluZGV4IixudWxsLGZ1bmN0aW9uKGNtLHZhbCl7cmV0dXJuIGNtLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKS50YWJJbmRleD12YWx8fCIiO30pO29wdGlvbigiYXV0b2ZvY3VzIixudWxsKTtvcHRpb24oImRpcmVjdGlvbiIsImx0ciIsZnVuY3Rpb24oY20sdmFsKXtyZXR1cm4gY20uZG9jLnNldERpcmVjdGlvbih2YWwpO30sdHJ1ZSk7fQpmdW5jdGlvbiBndXR0ZXJzQ2hhbmdlZChjbSl7dXBkYXRlR3V0dGVycyhjbSk7cmVnQ2hhbmdlKGNtKTthbGlnbkhvcml6b250YWxseShjbSk7fQpmdW5jdGlvbiBkcmFnRHJvcENoYW5nZWQoY20sdmFsdWUsb2xkKXt2YXIgd2FzT249b2xkJiZvbGQhPUluaXQ7aWYoIXZhbHVlIT0hd2FzT24pe3ZhciBmdW5jcz1jbS5kaXNwbGF5LmRyYWdGdW5jdGlvbnM7dmFyIHRvZ2dsZT12YWx1ZT9vbjpvZmY7dG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsImRyYWdzdGFydCIsZnVuY3Muc3RhcnQpO3RvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCJkcmFnZW50ZXIiLGZ1bmNzLmVudGVyKTt0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwiZHJhZ292ZXIiLGZ1bmNzLm92ZXIpO3RvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCJkcmFnbGVhdmUiLGZ1bmNzLmxlYXZlKTt0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwiZHJvcCIsZnVuY3MuZHJvcCk7fX0KZnVuY3Rpb24gd3JhcHBpbmdDaGFuZ2VkKGNtKXtpZihjbS5vcHRpb25zLmxpbmVXcmFwcGluZyl7YWRkQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCJDb2RlTWlycm9yLXdyYXAiKTtjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoPSIiO2NtLmRpc3BsYXkuc2l6ZXJXaWR0aD1udWxsO31lbHNle3JtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCJDb2RlTWlycm9yLXdyYXAiKTtmaW5kTWF4TGluZShjbSk7fQplc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKTtyZWdDaGFuZ2UoY20pO2NsZWFyQ2FjaGVzKGNtKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHVwZGF0ZVNjcm9sbGJhcnMoY20pO30sMTAwKTt9CmZ1bmN0aW9uIENvZGVNaXJyb3IkMShwbGFjZSxvcHRpb25zKXt2YXIgdGhpcyQxPXRoaXM7aWYoISh0aGlzIGluc3RhbmNlb2YgQ29kZU1pcnJvciQxKSl7cmV0dXJuIG5ldyBDb2RlTWlycm9yJDEocGxhY2Usb3B0aW9ucyl9CnRoaXMub3B0aW9ucz1vcHRpb25zPW9wdGlvbnM/Y29weU9iaihvcHRpb25zKTp7fTtjb3B5T2JqKGRlZmF1bHRzLG9wdGlvbnMsZmFsc2UpO3NldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhvcHRpb25zKTt2YXIgZG9jPW9wdGlvbnMudmFsdWU7aWYodHlwZW9mIGRvYz09InN0cmluZyIpe2RvYz1uZXcgRG9jKGRvYyxvcHRpb25zLm1vZGUsbnVsbCxvcHRpb25zLmxpbmVTZXBhcmF0b3Isb3B0aW9ucy5kaXJlY3Rpb24pO30KdGhpcy5kb2M9ZG9jO3ZhciBpbnB1dD1uZXcgQ29kZU1pcnJvciQxLmlucHV0U3R5bGVzW29wdGlvbnMuaW5wdXRTdHlsZV0odGhpcyk7dmFyIGRpc3BsYXk9dGhpcy5kaXNwbGF5PW5ldyBEaXNwbGF5KHBsYWNlLGRvYyxpbnB1dCk7ZGlzcGxheS53cmFwcGVyLkNvZGVNaXJyb3I9dGhpczt1cGRhdGVHdXR0ZXJzKHRoaXMpO3RoZW1lQ2hhbmdlZCh0aGlzKTtpZihvcHRpb25zLmxpbmVXcmFwcGluZykKe3RoaXMuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSs9IiBDb2RlTWlycm9yLXdyYXAiO30KaW5pdFNjcm9sbGJhcnModGhpcyk7dGhpcy5zdGF0ZT17a2V5TWFwczpbXSxvdmVybGF5czpbXSxtb2RlR2VuOjAsb3ZlcndyaXRlOmZhbHNlLGRlbGF5aW5nQmx1ckV2ZW50OmZhbHNlLGZvY3VzZWQ6ZmFsc2Usc3VwcHJlc3NFZGl0czpmYWxzZSxwYXN0ZUluY29taW5nOmZhbHNlLGN1dEluY29taW5nOmZhbHNlLHNlbGVjdGluZ1RleHQ6ZmFsc2UsZHJhZ2dpbmdUZXh0OmZhbHNlLGhpZ2hsaWdodDpuZXcgRGVsYXllZCgpLGtleVNlcTpudWxsLHNwZWNpYWxDaGFyczpudWxsfTtpZihvcHRpb25zLmF1dG9mb2N1cyYmIW1vYmlsZSl7ZGlzcGxheS5pbnB1dC5mb2N1cygpO30KaWYoaWUmJmllX3ZlcnNpb248MTEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyQxLmRpc3BsYXkuaW5wdXQucmVzZXQodHJ1ZSk7fSwyMCk7fQpyZWdpc3RlckV2ZW50SGFuZGxlcnModGhpcyk7ZW5zdXJlR2xvYmFsSGFuZGxlcnMoKTtzdGFydE9wZXJhdGlvbih0aGlzKTt0aGlzLmN1ck9wLmZvcmNlVXBkYXRlPXRydWU7YXR0YWNoRG9jKHRoaXMsZG9jKTtpZigob3B0aW9ucy5hdXRvZm9jdXMmJiFtb2JpbGUpfHx0aGlzLmhhc0ZvY3VzKCkpCntzZXRUaW1lb3V0KGJpbmQob25Gb2N1cyx0aGlzKSwyMCk7fQplbHNlCntvbkJsdXIodGhpcyk7fQpmb3IodmFyIG9wdCBpbiBvcHRpb25IYW5kbGVycyl7aWYob3B0aW9uSGFuZGxlcnMuaGFzT3duUHJvcGVydHkob3B0KSkKe29wdGlvbkhhbmRsZXJzW29wdF0odGhpcyQxLG9wdGlvbnNbb3B0XSxJbml0KTt9fQptYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aCh0aGlzKTtpZihvcHRpb25zLmZpbmlzaEluaXQpe29wdGlvbnMuZmluaXNoSW5pdCh0aGlzKTt9CmZvcih2YXIgaT0wO2k8aW5pdEhvb2tzLmxlbmd0aDsrK2kpe2luaXRIb29rc1tpXSh0aGlzJDEpO30KZW5kT3BlcmF0aW9uKHRoaXMpO2lmKHdlYmtpdCYmb3B0aW9ucy5saW5lV3JhcHBpbmcmJmdldENvbXB1dGVkU3R5bGUoZGlzcGxheS5saW5lRGl2KS50ZXh0UmVuZGVyaW5nPT0ib3B0aW1pemVsZWdpYmlsaXR5IikKe2Rpc3BsYXkubGluZURpdi5zdHlsZS50ZXh0UmVuZGVyaW5nPSJhdXRvIjt9fQpDb2RlTWlycm9yJDEuZGVmYXVsdHM9ZGVmYXVsdHM7Q29kZU1pcnJvciQxLm9wdGlvbkhhbmRsZXJzPW9wdGlvbkhhbmRsZXJzO2Z1bmN0aW9uIHJlZ2lzdGVyRXZlbnRIYW5kbGVycyhjbSl7dmFyIGQ9Y20uZGlzcGxheTtvbihkLnNjcm9sbGVyLCJtb3VzZWRvd24iLG9wZXJhdGlvbihjbSxvbk1vdXNlRG93bikpO2lmKGllJiZpZV92ZXJzaW9uPDExKQp7b24oZC5zY3JvbGxlciwiZGJsY2xpY2siLG9wZXJhdGlvbihjbSxmdW5jdGlvbihlKXtpZihzaWduYWxET01FdmVudChjbSxlKSl7cmV0dXJufQp2YXIgcG9zPXBvc0Zyb21Nb3VzZShjbSxlKTtpZighcG9zfHxjbGlja0luR3V0dGVyKGNtLGUpfHxldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksZSkpe3JldHVybn0KZV9wcmV2ZW50RGVmYXVsdChlKTt2YXIgd29yZD1jbS5maW5kV29yZEF0KHBvcyk7ZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYyx3b3JkLmFuY2hvcix3b3JkLmhlYWQpO30pKTt9CmVsc2UKe29uKGQuc2Nyb2xsZXIsImRibGNsaWNrIixmdW5jdGlvbihlKXtyZXR1cm4gc2lnbmFsRE9NRXZlbnQoY20sZSl8fGVfcHJldmVudERlZmF1bHQoZSk7fSk7fQppZighY2FwdHVyZVJpZ2h0Q2xpY2spe29uKGQuc2Nyb2xsZXIsImNvbnRleHRtZW51IixmdW5jdGlvbihlKXtyZXR1cm4gb25Db250ZXh0TWVudShjbSxlKTt9KTt9CnZhciB0b3VjaEZpbmlzaGVkLHByZXZUb3VjaD17ZW5kOjB9O2Z1bmN0aW9uIGZpbmlzaFRvdWNoKCl7aWYoZC5hY3RpdmVUb3VjaCl7dG91Y2hGaW5pc2hlZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGQuYWN0aXZlVG91Y2g9bnVsbDt9LDEwMDApO3ByZXZUb3VjaD1kLmFjdGl2ZVRvdWNoO3ByZXZUb3VjaC5lbmQ9K25ldyBEYXRlO319CmZ1bmN0aW9uIGlzTW91c2VMaWtlVG91Y2hFdmVudChlKXtpZihlLnRvdWNoZXMubGVuZ3RoIT0xKXtyZXR1cm4gZmFsc2V9CnZhciB0b3VjaD1lLnRvdWNoZXNbMF07cmV0dXJuIHRvdWNoLnJhZGl1c1g8PTEmJnRvdWNoLnJhZGl1c1k8PTF9CmZ1bmN0aW9uIGZhckF3YXkodG91Y2gsb3RoZXIpe2lmKG90aGVyLmxlZnQ9PW51bGwpe3JldHVybiB0cnVlfQp2YXIgZHg9b3RoZXIubGVmdC10b3VjaC5sZWZ0LGR5PW90aGVyLnRvcC10b3VjaC50b3A7cmV0dXJuIGR4KmR4K2R5KmR5PjIwKjIwfQpvbihkLnNjcm9sbGVyLCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihlKXtpZighc2lnbmFsRE9NRXZlbnQoY20sZSkmJiFpc01vdXNlTGlrZVRvdWNoRXZlbnQoZSkmJiFjbGlja0luR3V0dGVyKGNtLGUpKXtkLmlucHV0LmVuc3VyZVBvbGxlZCgpO2NsZWFyVGltZW91dCh0b3VjaEZpbmlzaGVkKTt2YXIgbm93PStuZXcgRGF0ZTtkLmFjdGl2ZVRvdWNoPXtzdGFydDpub3csbW92ZWQ6ZmFsc2UscHJldjpub3ctcHJldlRvdWNoLmVuZDw9MzAwP3ByZXZUb3VjaDpudWxsfTtpZihlLnRvdWNoZXMubGVuZ3RoPT0xKXtkLmFjdGl2ZVRvdWNoLmxlZnQ9ZS50b3VjaGVzWzBdLnBhZ2VYO2QuYWN0aXZlVG91Y2gudG9wPWUudG91Y2hlc1swXS5wYWdlWTt9fX0pO29uKGQuc2Nyb2xsZXIsInRvdWNobW92ZSIsZnVuY3Rpb24oKXtpZihkLmFjdGl2ZVRvdWNoKXtkLmFjdGl2ZVRvdWNoLm1vdmVkPXRydWU7fX0pO29uKGQuc2Nyb2xsZXIsInRvdWNoZW5kIixmdW5jdGlvbihlKXt2YXIgdG91Y2g9ZC5hY3RpdmVUb3VjaDtpZih0b3VjaCYmIWV2ZW50SW5XaWRnZXQoZCxlKSYmdG91Y2gubGVmdCE9bnVsbCYmIXRvdWNoLm1vdmVkJiZuZXcgRGF0ZS10b3VjaC5zdGFydDwzMDApe3ZhciBwb3M9Y20uY29vcmRzQ2hhcihkLmFjdGl2ZVRvdWNoLCJwYWdlIikscmFuZ2U7aWYoIXRvdWNoLnByZXZ8fGZhckF3YXkodG91Y2gsdG91Y2gucHJldikpCntyYW5nZT1uZXcgUmFuZ2UocG9zLHBvcyk7fQplbHNlIGlmKCF0b3VjaC5wcmV2LnByZXZ8fGZhckF3YXkodG91Y2gsdG91Y2gucHJldi5wcmV2KSkKe3JhbmdlPWNtLmZpbmRXb3JkQXQocG9zKTt9CmVsc2UKe3JhbmdlPW5ldyBSYW5nZShQb3MocG9zLmxpbmUsMCksY2xpcFBvcyhjbS5kb2MsUG9zKHBvcy5saW5lKzEsMCkpKTt9CmNtLnNldFNlbGVjdGlvbihyYW5nZS5hbmNob3IscmFuZ2UuaGVhZCk7Y20uZm9jdXMoKTtlX3ByZXZlbnREZWZhdWx0KGUpO30KZmluaXNoVG91Y2goKTt9KTtvbihkLnNjcm9sbGVyLCJ0b3VjaGNhbmNlbCIsZmluaXNoVG91Y2gpO29uKGQuc2Nyb2xsZXIsInNjcm9sbCIsZnVuY3Rpb24oKXtpZihkLnNjcm9sbGVyLmNsaWVudEhlaWdodCl7dXBkYXRlU2Nyb2xsVG9wKGNtLGQuc2Nyb2xsZXIuc2Nyb2xsVG9wKTtzZXRTY3JvbGxMZWZ0KGNtLGQuc2Nyb2xsZXIuc2Nyb2xsTGVmdCx0cnVlKTtzaWduYWwoY20sInNjcm9sbCIsY20pO319KTtvbihkLnNjcm9sbGVyLCJtb3VzZXdoZWVsIixmdW5jdGlvbihlKXtyZXR1cm4gb25TY3JvbGxXaGVlbChjbSxlKTt9KTtvbihkLnNjcm9sbGVyLCJET01Nb3VzZVNjcm9sbCIsZnVuY3Rpb24oZSl7cmV0dXJuIG9uU2Nyb2xsV2hlZWwoY20sZSk7fSk7b24oZC53cmFwcGVyLCJzY3JvbGwiLGZ1bmN0aW9uKCl7cmV0dXJuIGQud3JhcHBlci5zY3JvbGxUb3A9ZC53cmFwcGVyLnNjcm9sbExlZnQ9MDt9KTtkLmRyYWdGdW5jdGlvbnM9e2VudGVyOmZ1bmN0aW9uKGUpe2lmKCFzaWduYWxET01FdmVudChjbSxlKSl7ZV9zdG9wKGUpO319LG92ZXI6ZnVuY3Rpb24oZSl7aWYoIXNpZ25hbERPTUV2ZW50KGNtLGUpKXtvbkRyYWdPdmVyKGNtLGUpO2Vfc3RvcChlKTt9fSxzdGFydDpmdW5jdGlvbihlKXtyZXR1cm4gb25EcmFnU3RhcnQoY20sZSk7fSxkcm9wOm9wZXJhdGlvbihjbSxvbkRyb3ApLGxlYXZlOmZ1bmN0aW9uKGUpe2lmKCFzaWduYWxET01FdmVudChjbSxlKSl7Y2xlYXJEcmFnQ3Vyc29yKGNtKTt9fX07dmFyIGlucD1kLmlucHV0LmdldEZpZWxkKCk7b24oaW5wLCJrZXl1cCIsZnVuY3Rpb24oZSl7cmV0dXJuIG9uS2V5VXAuY2FsbChjbSxlKTt9KTtvbihpbnAsImtleWRvd24iLG9wZXJhdGlvbihjbSxvbktleURvd24pKTtvbihpbnAsImtleXByZXNzIixvcGVyYXRpb24oY20sb25LZXlQcmVzcykpO29uKGlucCwiZm9jdXMiLGZ1bmN0aW9uKGUpe3JldHVybiBvbkZvY3VzKGNtLGUpO30pO29uKGlucCwiYmx1ciIsZnVuY3Rpb24oZSl7cmV0dXJuIG9uQmx1cihjbSxlKTt9KTt9CnZhciBpbml0SG9va3M9W107Q29kZU1pcnJvciQxLmRlZmluZUluaXRIb29rPWZ1bmN0aW9uKGYpe3JldHVybiBpbml0SG9va3MucHVzaChmKTt9O2Z1bmN0aW9uIGluZGVudExpbmUoY20sbixob3csYWdncmVzc2l2ZSl7dmFyIGRvYz1jbS5kb2Msc3RhdGU7aWYoaG93PT1udWxsKXtob3c9ImFkZCI7fQppZihob3c9PSJzbWFydCIpe2lmKCFkb2MubW9kZS5pbmRlbnQpe2hvdz0icHJldiI7fQplbHNle3N0YXRlPWdldENvbnRleHRCZWZvcmUoY20sbikuc3RhdGU7fX0KdmFyIHRhYlNpemU9Y20ub3B0aW9ucy50YWJTaXplO3ZhciBsaW5lPWdldExpbmUoZG9jLG4pLGN1clNwYWNlPWNvdW50Q29sdW1uKGxpbmUudGV4dCxudWxsLHRhYlNpemUpO2lmKGxpbmUuc3RhdGVBZnRlcil7bGluZS5zdGF0ZUFmdGVyPW51bGw7fQp2YXIgY3VyU3BhY2VTdHJpbmc9bGluZS50ZXh0Lm1hdGNoKC9eXHMqLylbMF0saW5kZW50YXRpb247aWYoIWFnZ3Jlc3NpdmUmJiEvXFMvLnRlc3QobGluZS50ZXh0KSl7aW5kZW50YXRpb249MDtob3c9Im5vdCI7fWVsc2UgaWYoaG93PT0ic21hcnQiKXtpbmRlbnRhdGlvbj1kb2MubW9kZS5pbmRlbnQoc3RhdGUsbGluZS50ZXh0LnNsaWNlKGN1clNwYWNlU3RyaW5nLmxlbmd0aCksbGluZS50ZXh0KTtpZihpbmRlbnRhdGlvbj09UGFzc3x8aW5kZW50YXRpb24+MTUwKXtpZighYWdncmVzc2l2ZSl7cmV0dXJufQpob3c9InByZXYiO319CmlmKGhvdz09InByZXYiKXtpZihuPmRvYy5maXJzdCl7aW5kZW50YXRpb249Y291bnRDb2x1bW4oZ2V0TGluZShkb2Msbi0xKS50ZXh0LG51bGwsdGFiU2l6ZSk7fQplbHNle2luZGVudGF0aW9uPTA7fX1lbHNlIGlmKGhvdz09ImFkZCIpe2luZGVudGF0aW9uPWN1clNwYWNlK2NtLm9wdGlvbnMuaW5kZW50VW5pdDt9ZWxzZSBpZihob3c9PSJzdWJ0cmFjdCIpe2luZGVudGF0aW9uPWN1clNwYWNlLWNtLm9wdGlvbnMuaW5kZW50VW5pdDt9ZWxzZSBpZih0eXBlb2YgaG93PT0ibnVtYmVyIil7aW5kZW50YXRpb249Y3VyU3BhY2UraG93O30KaW5kZW50YXRpb249TWF0aC5tYXgoMCxpbmRlbnRhdGlvbik7dmFyIGluZGVudFN0cmluZz0iIixwb3M9MDtpZihjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKQp7Zm9yKHZhciBpPU1hdGguZmxvb3IoaW5kZW50YXRpb24vdGFiU2l6ZSk7aTstLWkpe3Bvcys9dGFiU2l6ZTtpbmRlbnRTdHJpbmcrPSJcdCI7fX0KaWYocG9zPGluZGVudGF0aW9uKXtpbmRlbnRTdHJpbmcrPXNwYWNlU3RyKGluZGVudGF0aW9uLXBvcyk7fQppZihpbmRlbnRTdHJpbmchPWN1clNwYWNlU3RyaW5nKXtyZXBsYWNlUmFuZ2UoZG9jLGluZGVudFN0cmluZyxQb3MobiwwKSxQb3MobixjdXJTcGFjZVN0cmluZy5sZW5ndGgpLCIraW5wdXQiKTtsaW5lLnN0YXRlQWZ0ZXI9bnVsbDtyZXR1cm4gdHJ1ZX1lbHNle2Zvcih2YXIgaSQxPTA7aSQxPGRvYy5zZWwucmFuZ2VzLmxlbmd0aDtpJDErKyl7dmFyIHJhbmdlPWRvYy5zZWwucmFuZ2VzW2kkMV07aWYocmFuZ2UuaGVhZC5saW5lPT1uJiZyYW5nZS5oZWFkLmNoPGN1clNwYWNlU3RyaW5nLmxlbmd0aCl7dmFyIHBvcyQxPVBvcyhuLGN1clNwYWNlU3RyaW5nLmxlbmd0aCk7cmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsaSQxLG5ldyBSYW5nZShwb3MkMSxwb3MkMSkpO2JyZWFrfX19fQp2YXIgbGFzdENvcGllZD1udWxsO2Z1bmN0aW9uIHNldExhc3RDb3BpZWQobmV3TGFzdENvcGllZCl7bGFzdENvcGllZD1uZXdMYXN0Q29waWVkO30KZnVuY3Rpb24gYXBwbHlUZXh0SW5wdXQoY20saW5zZXJ0ZWQsZGVsZXRlZCxzZWwsb3JpZ2luKXt2YXIgZG9jPWNtLmRvYztjbS5kaXNwbGF5LnNoaWZ0PWZhbHNlO2lmKCFzZWwpe3NlbD1kb2Muc2VsO30KdmFyIHBhc3RlPWNtLnN0YXRlLnBhc3RlSW5jb21pbmd8fG9yaWdpbj09InBhc3RlIjt2YXIgdGV4dExpbmVzPXNwbGl0TGluZXNBdXRvKGluc2VydGVkKSxtdWx0aVBhc3RlPW51bGw7aWYocGFzdGUmJnNlbC5yYW5nZXMubGVuZ3RoPjEpe2lmKGxhc3RDb3BpZWQmJmxhc3RDb3BpZWQudGV4dC5qb2luKCJcbiIpPT1pbnNlcnRlZCl7aWYoc2VsLnJhbmdlcy5sZW5ndGglbGFzdENvcGllZC50ZXh0Lmxlbmd0aD09MCl7bXVsdGlQYXN0ZT1bXTtmb3IodmFyIGk9MDtpPGxhc3RDb3BpZWQudGV4dC5sZW5ndGg7aSsrKQp7bXVsdGlQYXN0ZS5wdXNoKGRvYy5zcGxpdExpbmVzKGxhc3RDb3BpZWQudGV4dFtpXSkpO319fWVsc2UgaWYodGV4dExpbmVzLmxlbmd0aD09c2VsLnJhbmdlcy5sZW5ndGgmJmNtLm9wdGlvbnMucGFzdGVMaW5lc1BlclNlbGVjdGlvbil7bXVsdGlQYXN0ZT1tYXAodGV4dExpbmVzLGZ1bmN0aW9uKGwpe3JldHVybltsXTt9KTt9fQp2YXIgdXBkYXRlSW5wdXQ7Zm9yKHZhciBpJDE9c2VsLnJhbmdlcy5sZW5ndGgtMTtpJDE+PTA7aSQxLS0pe3ZhciByYW5nZSQkMT1zZWwucmFuZ2VzW2kkMV07dmFyIGZyb209cmFuZ2UkJDEuZnJvbSgpLHRvPXJhbmdlJCQxLnRvKCk7aWYocmFuZ2UkJDEuZW1wdHkoKSl7aWYoZGVsZXRlZCYmZGVsZXRlZD4wKQp7ZnJvbT1Qb3MoZnJvbS5saW5lLGZyb20uY2gtZGVsZXRlZCk7fQplbHNlIGlmKGNtLnN0YXRlLm92ZXJ3cml0ZSYmIXBhc3RlKQp7dG89UG9zKHRvLmxpbmUsTWF0aC5taW4oZ2V0TGluZShkb2MsdG8ubGluZSkudGV4dC5sZW5ndGgsdG8uY2grbHN0KHRleHRMaW5lcykubGVuZ3RoKSk7fQplbHNlIGlmKGxhc3RDb3BpZWQmJmxhc3RDb3BpZWQubGluZVdpc2UmJmxhc3RDb3BpZWQudGV4dC5qb2luKCJcbiIpPT1pbnNlcnRlZCkKe2Zyb209dG89UG9zKGZyb20ubGluZSwwKTt9fQp1cGRhdGVJbnB1dD1jbS5jdXJPcC51cGRhdGVJbnB1dDt2YXIgY2hhbmdlRXZlbnQ9e2Zyb206ZnJvbSx0bzp0byx0ZXh0Om11bHRpUGFzdGU/bXVsdGlQYXN0ZVtpJDElbXVsdGlQYXN0ZS5sZW5ndGhdOnRleHRMaW5lcyxvcmlnaW46b3JpZ2lufHwocGFzdGU/InBhc3RlIjpjbS5zdGF0ZS5jdXRJbmNvbWluZz8iY3V0IjoiK2lucHV0Iil9O21ha2VDaGFuZ2UoY20uZG9jLGNoYW5nZUV2ZW50KTtzaWduYWxMYXRlcihjbSwiaW5wdXRSZWFkIixjbSxjaGFuZ2VFdmVudCk7fQppZihpbnNlcnRlZCYmIXBhc3RlKQp7dHJpZ2dlckVsZWN0cmljKGNtLGluc2VydGVkKTt9CmVuc3VyZUN1cnNvclZpc2libGUoY20pO2NtLmN1ck9wLnVwZGF0ZUlucHV0PXVwZGF0ZUlucHV0O2NtLmN1ck9wLnR5cGluZz10cnVlO2NtLnN0YXRlLnBhc3RlSW5jb21pbmc9Y20uc3RhdGUuY3V0SW5jb21pbmc9ZmFsc2U7fQpmdW5jdGlvbiBoYW5kbGVQYXN0ZShlLGNtKXt2YXIgcGFzdGVkPWUuY2xpcGJvYXJkRGF0YSYmZS5jbGlwYm9hcmREYXRhLmdldERhdGEoIlRleHQiKTtpZihwYXN0ZWQpe2UucHJldmVudERlZmF1bHQoKTtpZighY20uaXNSZWFkT25seSgpJiYhY20ub3B0aW9ucy5kaXNhYmxlSW5wdXQpCntydW5Jbk9wKGNtLGZ1bmN0aW9uKCl7cmV0dXJuIGFwcGx5VGV4dElucHV0KGNtLHBhc3RlZCwwLG51bGwsInBhc3RlIik7fSk7fQpyZXR1cm4gdHJ1ZX19CmZ1bmN0aW9uIHRyaWdnZXJFbGVjdHJpYyhjbSxpbnNlcnRlZCl7aWYoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFyc3x8IWNtLm9wdGlvbnMuc21hcnRJbmRlbnQpe3JldHVybn0KdmFyIHNlbD1jbS5kb2Muc2VsO2Zvcih2YXIgaT1zZWwucmFuZ2VzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgcmFuZ2UkJDE9c2VsLnJhbmdlc1tpXTtpZihyYW5nZSQkMS5oZWFkLmNoPjEwMHx8KGkmJnNlbC5yYW5nZXNbaS0xXS5oZWFkLmxpbmU9PXJhbmdlJCQxLmhlYWQubGluZSkpe2NvbnRpbnVlfQp2YXIgbW9kZT1jbS5nZXRNb2RlQXQocmFuZ2UkJDEuaGVhZCk7dmFyIGluZGVudGVkPWZhbHNlO2lmKG1vZGUuZWxlY3RyaWNDaGFycyl7Zm9yKHZhciBqPTA7ajxtb2RlLmVsZWN0cmljQ2hhcnMubGVuZ3RoO2orKykKe2lmKGluc2VydGVkLmluZGV4T2YobW9kZS5lbGVjdHJpY0NoYXJzLmNoYXJBdChqKSk+LTEpe2luZGVudGVkPWluZGVudExpbmUoY20scmFuZ2UkJDEuaGVhZC5saW5lLCJzbWFydCIpO2JyZWFrfX19ZWxzZSBpZihtb2RlLmVsZWN0cmljSW5wdXQpe2lmKG1vZGUuZWxlY3RyaWNJbnB1dC50ZXN0KGdldExpbmUoY20uZG9jLHJhbmdlJCQxLmhlYWQubGluZSkudGV4dC5zbGljZSgwLHJhbmdlJCQxLmhlYWQuY2gpKSkKe2luZGVudGVkPWluZGVudExpbmUoY20scmFuZ2UkJDEuaGVhZC5saW5lLCJzbWFydCIpO319CmlmKGluZGVudGVkKXtzaWduYWxMYXRlcihjbSwiZWxlY3RyaWNJbnB1dCIsY20scmFuZ2UkJDEuaGVhZC5saW5lKTt9fX0KZnVuY3Rpb24gY29weWFibGVSYW5nZXMoY20pe3ZhciB0ZXh0PVtdLHJhbmdlcz1bXTtmb3IodmFyIGk9MDtpPGNtLmRvYy5zZWwucmFuZ2VzLmxlbmd0aDtpKyspe3ZhciBsaW5lPWNtLmRvYy5zZWwucmFuZ2VzW2ldLmhlYWQubGluZTt2YXIgbGluZVJhbmdlPXthbmNob3I6UG9zKGxpbmUsMCksaGVhZDpQb3MobGluZSsxLDApfTtyYW5nZXMucHVzaChsaW5lUmFuZ2UpO3RleHQucHVzaChjbS5nZXRSYW5nZShsaW5lUmFuZ2UuYW5jaG9yLGxpbmVSYW5nZS5oZWFkKSk7fQpyZXR1cm57dGV4dDp0ZXh0LHJhbmdlczpyYW5nZXN9fQpmdW5jdGlvbiBkaXNhYmxlQnJvd3Nlck1hZ2ljKGZpZWxkLHNwZWxsY2hlY2spe2ZpZWxkLnNldEF0dHJpYnV0ZSgiYXV0b2NvcnJlY3QiLCJvZmYiKTtmaWVsZC5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIik7ZmllbGQuc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwhIXNwZWxsY2hlY2spO30KZnVuY3Rpb24gaGlkZGVuVGV4dGFyZWEoKXt2YXIgdGU9ZWx0KCJ0ZXh0YXJlYSIsbnVsbCxudWxsLCJwb3NpdGlvbjogYWJzb2x1dGU7IGJvdHRvbTogLTFlbTsgcGFkZGluZzogMDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxZW07IG91dGxpbmU6IG5vbmUiKTt2YXIgZGl2PWVsdCgiZGl2IixbdGVdLG51bGwsIm92ZXJmbG93OiBoaWRkZW47IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDNweDsgaGVpZ2h0OiAwcHg7Iik7aWYod2Via2l0KXt0ZS5zdHlsZS53aWR0aD0iMTAwMHB4Ijt9CmVsc2V7dGUuc2V0QXR0cmlidXRlKCJ3cmFwIiwib2ZmIik7fQppZihpb3Mpe3RlLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkIGJsYWNrIjt9CmRpc2FibGVCcm93c2VyTWFnaWModGUpO3JldHVybiBkaXZ9CnZhciBhZGRFZGl0b3JNZXRob2RzPWZ1bmN0aW9uKENvZGVNaXJyb3Ipe3ZhciBvcHRpb25IYW5kbGVycz1Db2RlTWlycm9yLm9wdGlvbkhhbmRsZXJzO3ZhciBoZWxwZXJzPUNvZGVNaXJyb3IuaGVscGVycz17fTtDb2RlTWlycm9yLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Q29kZU1pcnJvcixmb2N1czpmdW5jdGlvbigpe3dpbmRvdy5mb2N1cygpO3RoaXMuZGlzcGxheS5pbnB1dC5mb2N1cygpO30sc2V0T3B0aW9uOmZ1bmN0aW9uKG9wdGlvbix2YWx1ZSl7dmFyIG9wdGlvbnM9dGhpcy5vcHRpb25zLG9sZD1vcHRpb25zW29wdGlvbl07aWYob3B0aW9uc1tvcHRpb25dPT12YWx1ZSYmb3B0aW9uIT0ibW9kZSIpe3JldHVybn0Kb3B0aW9uc1tvcHRpb25dPXZhbHVlO2lmKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpCntvcGVyYXRpb24odGhpcyxvcHRpb25IYW5kbGVyc1tvcHRpb25dKSh0aGlzLHZhbHVlLG9sZCk7fQpzaWduYWwodGhpcywib3B0aW9uQ2hhbmdlIix0aGlzLG9wdGlvbik7fSxnZXRPcHRpb246ZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gdGhpcy5vcHRpb25zW29wdGlvbl19LGdldERvYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY30sYWRkS2V5TWFwOmZ1bmN0aW9uKG1hcCQkMSxib3R0b20pe3RoaXMuc3RhdGUua2V5TWFwc1tib3R0b20/InB1c2giOiJ1bnNoaWZ0Il0oZ2V0S2V5TWFwKG1hcCQkMSkpO30scmVtb3ZlS2V5TWFwOmZ1bmN0aW9uKG1hcCQkMSl7dmFyIG1hcHM9dGhpcy5zdGF0ZS5rZXlNYXBzO2Zvcih2YXIgaT0wO2k8bWFwcy5sZW5ndGg7KytpKQp7aWYobWFwc1tpXT09bWFwJCQxfHxtYXBzW2ldLm5hbWU9PW1hcCQkMSl7bWFwcy5zcGxpY2UoaSwxKTtyZXR1cm4gdHJ1ZX19fSxhZGRPdmVybGF5Om1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMsb3B0aW9ucyl7dmFyIG1vZGU9c3BlYy50b2tlbj9zcGVjOkNvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsc3BlYyk7aWYobW9kZS5zdGFydFN0YXRlKXt0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXlzIG1heSBub3QgYmUgc3RhdGVmdWwuIil9Cmluc2VydFNvcnRlZCh0aGlzLnN0YXRlLm92ZXJsYXlzLHttb2RlOm1vZGUsbW9kZVNwZWM6c3BlYyxvcGFxdWU6b3B0aW9ucyYmb3B0aW9ucy5vcGFxdWUscHJpb3JpdHk6KG9wdGlvbnMmJm9wdGlvbnMucHJpb3JpdHkpfHwwfSxmdW5jdGlvbihvdmVybGF5KXtyZXR1cm4gb3ZlcmxheS5wcmlvcml0eTt9KTt0aGlzLnN0YXRlLm1vZGVHZW4rKztyZWdDaGFuZ2UodGhpcyk7fSkscmVtb3ZlT3ZlcmxheTptZXRob2RPcChmdW5jdGlvbihzcGVjKXt2YXIgdGhpcyQxPXRoaXM7dmFyIG92ZXJsYXlzPXRoaXMuc3RhdGUub3ZlcmxheXM7Zm9yKHZhciBpPTA7aTxvdmVybGF5cy5sZW5ndGg7KytpKXt2YXIgY3VyPW92ZXJsYXlzW2ldLm1vZGVTcGVjO2lmKGN1cj09c3BlY3x8dHlwZW9mIHNwZWM9PSJzdHJpbmciJiZjdXIubmFtZT09c3BlYyl7b3ZlcmxheXMuc3BsaWNlKGksMSk7dGhpcyQxLnN0YXRlLm1vZGVHZW4rKztyZWdDaGFuZ2UodGhpcyQxKTtyZXR1cm59fX0pLGluZGVudExpbmU6bWV0aG9kT3AoZnVuY3Rpb24obixkaXIsYWdncmVzc2l2ZSl7aWYodHlwZW9mIGRpciE9InN0cmluZyImJnR5cGVvZiBkaXIhPSJudW1iZXIiKXtpZihkaXI9PW51bGwpe2Rpcj10aGlzLm9wdGlvbnMuc21hcnRJbmRlbnQ/InNtYXJ0IjoicHJldiI7fQplbHNle2Rpcj1kaXI/ImFkZCI6InN1YnRyYWN0Ijt9fQppZihpc0xpbmUodGhpcy5kb2Msbikpe2luZGVudExpbmUodGhpcyxuLGRpcixhZ2dyZXNzaXZlKTt9fSksaW5kZW50U2VsZWN0aW9uOm1ldGhvZE9wKGZ1bmN0aW9uKGhvdyl7dmFyIHRoaXMkMT10aGlzO3ZhciByYW5nZXM9dGhpcy5kb2Muc2VsLnJhbmdlcyxlbmQ9LTE7Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7dmFyIHJhbmdlJCQxPXJhbmdlc1tpXTtpZighcmFuZ2UkJDEuZW1wdHkoKSl7dmFyIGZyb209cmFuZ2UkJDEuZnJvbSgpLHRvPXJhbmdlJCQxLnRvKCk7dmFyIHN0YXJ0PU1hdGgubWF4KGVuZCxmcm9tLmxpbmUpO2VuZD1NYXRoLm1pbih0aGlzJDEubGFzdExpbmUoKSx0by5saW5lLSh0by5jaD8wOjEpKSsxO2Zvcih2YXIgaj1zdGFydDtqPGVuZDsrK2opCntpbmRlbnRMaW5lKHRoaXMkMSxqLGhvdyk7fQp2YXIgbmV3UmFuZ2VzPXRoaXMkMS5kb2Muc2VsLnJhbmdlcztpZihmcm9tLmNoPT0wJiZyYW5nZXMubGVuZ3RoPT1uZXdSYW5nZXMubGVuZ3RoJiZuZXdSYW5nZXNbaV0uZnJvbSgpLmNoPjApCntyZXBsYWNlT25lU2VsZWN0aW9uKHRoaXMkMS5kb2MsaSxuZXcgUmFuZ2UoZnJvbSxuZXdSYW5nZXNbaV0udG8oKSksc2VsX2RvbnRTY3JvbGwpO319ZWxzZSBpZihyYW5nZSQkMS5oZWFkLmxpbmU+ZW5kKXtpbmRlbnRMaW5lKHRoaXMkMSxyYW5nZSQkMS5oZWFkLmxpbmUsaG93LHRydWUpO2VuZD1yYW5nZSQkMS5oZWFkLmxpbmU7aWYoaT09dGhpcyQxLmRvYy5zZWwucHJpbUluZGV4KXtlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMkMSk7fX19fSksZ2V0VG9rZW5BdDpmdW5jdGlvbihwb3MscHJlY2lzZSl7cmV0dXJuIHRha2VUb2tlbih0aGlzLHBvcyxwcmVjaXNlKX0sZ2V0TGluZVRva2VuczpmdW5jdGlvbihsaW5lLHByZWNpc2Upe3JldHVybiB0YWtlVG9rZW4odGhpcyxQb3MobGluZSkscHJlY2lzZSx0cnVlKX0sZ2V0VG9rZW5UeXBlQXQ6ZnVuY3Rpb24ocG9zKXtwb3M9Y2xpcFBvcyh0aGlzLmRvYyxwb3MpO3ZhciBzdHlsZXM9Z2V0TGluZVN0eWxlcyh0aGlzLGdldExpbmUodGhpcy5kb2MscG9zLmxpbmUpKTt2YXIgYmVmb3JlPTAsYWZ0ZXI9KHN0eWxlcy5sZW5ndGgtMSkvMixjaD1wb3MuY2g7dmFyIHR5cGU7aWYoY2g9PTApe3R5cGU9c3R5bGVzWzJdO30KZWxzZXtmb3IoOzspe3ZhciBtaWQ9KGJlZm9yZSthZnRlcik+PjE7aWYoKG1pZD9zdHlsZXNbbWlkKjItMV06MCk+PWNoKXthZnRlcj1taWQ7fQplbHNlIGlmKHN0eWxlc1ttaWQqMisxXTxjaCl7YmVmb3JlPW1pZCsxO30KZWxzZXt0eXBlPXN0eWxlc1ttaWQqMisyXTticmVha319fQp2YXIgY3V0PXR5cGU/dHlwZS5pbmRleE9mKCJvdmVybGF5ICIpOi0xO3JldHVybiBjdXQ8MD90eXBlOmN1dD09MD9udWxsOnR5cGUuc2xpY2UoMCxjdXQtMSl9LGdldE1vZGVBdDpmdW5jdGlvbihwb3Mpe3ZhciBtb2RlPXRoaXMuZG9jLm1vZGU7aWYoIW1vZGUuaW5uZXJNb2RlKXtyZXR1cm4gbW9kZX0KcmV0dXJuIENvZGVNaXJyb3IuaW5uZXJNb2RlKG1vZGUsdGhpcy5nZXRUb2tlbkF0KHBvcykuc3RhdGUpLm1vZGV9LGdldEhlbHBlcjpmdW5jdGlvbihwb3MsdHlwZSl7cmV0dXJuIHRoaXMuZ2V0SGVscGVycyhwb3MsdHlwZSlbMF19LGdldEhlbHBlcnM6ZnVuY3Rpb24ocG9zLHR5cGUpe3ZhciB0aGlzJDE9dGhpczt2YXIgZm91bmQ9W107aWYoIWhlbHBlcnMuaGFzT3duUHJvcGVydHkodHlwZSkpe3JldHVybiBmb3VuZH0KdmFyIGhlbHA9aGVscGVyc1t0eXBlXSxtb2RlPXRoaXMuZ2V0TW9kZUF0KHBvcyk7aWYodHlwZW9mIG1vZGVbdHlwZV09PSJzdHJpbmciKXtpZihoZWxwW21vZGVbdHlwZV1dKXtmb3VuZC5wdXNoKGhlbHBbbW9kZVt0eXBlXV0pO319ZWxzZSBpZihtb2RlW3R5cGVdKXtmb3IodmFyIGk9MDtpPG1vZGVbdHlwZV0ubGVuZ3RoO2krKyl7dmFyIHZhbD1oZWxwW21vZGVbdHlwZV1baV1dO2lmKHZhbCl7Zm91bmQucHVzaCh2YWwpO319fWVsc2UgaWYobW9kZS5oZWxwZXJUeXBlJiZoZWxwW21vZGUuaGVscGVyVHlwZV0pe2ZvdW5kLnB1c2goaGVscFttb2RlLmhlbHBlclR5cGVdKTt9ZWxzZSBpZihoZWxwW21vZGUubmFtZV0pe2ZvdW5kLnB1c2goaGVscFttb2RlLm5hbWVdKTt9CmZvcih2YXIgaSQxPTA7aSQxPGhlbHAuX2dsb2JhbC5sZW5ndGg7aSQxKyspe3ZhciBjdXI9aGVscC5fZ2xvYmFsW2kkMV07aWYoY3VyLnByZWQobW9kZSx0aGlzJDEpJiZpbmRleE9mKGZvdW5kLGN1ci52YWwpPT0tMSkKe2ZvdW5kLnB1c2goY3VyLnZhbCk7fX0KcmV0dXJuIGZvdW5kfSxnZXRTdGF0ZUFmdGVyOmZ1bmN0aW9uKGxpbmUscHJlY2lzZSl7dmFyIGRvYz10aGlzLmRvYztsaW5lPWNsaXBMaW5lKGRvYyxsaW5lPT1udWxsP2RvYy5maXJzdCtkb2Muc2l6ZS0xOmxpbmUpO3JldHVybiBnZXRDb250ZXh0QmVmb3JlKHRoaXMsbGluZSsxLHByZWNpc2UpLnN0YXRlfSxjdXJzb3JDb29yZHM6ZnVuY3Rpb24oc3RhcnQsbW9kZSl7dmFyIHBvcyxyYW5nZSQkMT10aGlzLmRvYy5zZWwucHJpbWFyeSgpO2lmKHN0YXJ0PT1udWxsKXtwb3M9cmFuZ2UkJDEuaGVhZDt9CmVsc2UgaWYodHlwZW9mIHN0YXJ0PT0ib2JqZWN0Iil7cG9zPWNsaXBQb3ModGhpcy5kb2Msc3RhcnQpO30KZWxzZXtwb3M9c3RhcnQ/cmFuZ2UkJDEuZnJvbSgpOnJhbmdlJCQxLnRvKCk7fQpyZXR1cm4gY3Vyc29yQ29vcmRzKHRoaXMscG9zLG1vZGV8fCJwYWdlIil9LGNoYXJDb29yZHM6ZnVuY3Rpb24ocG9zLG1vZGUpe3JldHVybiBjaGFyQ29vcmRzKHRoaXMsY2xpcFBvcyh0aGlzLmRvYyxwb3MpLG1vZGV8fCJwYWdlIil9LGNvb3Jkc0NoYXI6ZnVuY3Rpb24oY29vcmRzLG1vZGUpe2Nvb3Jkcz1mcm9tQ29vcmRTeXN0ZW0odGhpcyxjb29yZHMsbW9kZXx8InBhZ2UiKTtyZXR1cm4gY29vcmRzQ2hhcih0aGlzLGNvb3Jkcy5sZWZ0LGNvb3Jkcy50b3ApfSxsaW5lQXRIZWlnaHQ6ZnVuY3Rpb24oaGVpZ2h0LG1vZGUpe2hlaWdodD1mcm9tQ29vcmRTeXN0ZW0odGhpcyx7dG9wOmhlaWdodCxsZWZ0OjB9LG1vZGV8fCJwYWdlIikudG9wO3JldHVybiBsaW5lQXRIZWlnaHQodGhpcy5kb2MsaGVpZ2h0K3RoaXMuZGlzcGxheS52aWV3T2Zmc2V0KX0saGVpZ2h0QXRMaW5lOmZ1bmN0aW9uKGxpbmUsbW9kZSxpbmNsdWRlV2lkZ2V0cyl7dmFyIGVuZD1mYWxzZSxsaW5lT2JqO2lmKHR5cGVvZiBsaW5lPT0ibnVtYmVyIil7dmFyIGxhc3Q9dGhpcy5kb2MuZmlyc3QrdGhpcy5kb2Muc2l6ZS0xO2lmKGxpbmU8dGhpcy5kb2MuZmlyc3Qpe2xpbmU9dGhpcy5kb2MuZmlyc3Q7fQplbHNlIGlmKGxpbmU+bGFzdCl7bGluZT1sYXN0O2VuZD10cnVlO30KbGluZU9iaj1nZXRMaW5lKHRoaXMuZG9jLGxpbmUpO31lbHNle2xpbmVPYmo9bGluZTt9CnJldHVybiBpbnRvQ29vcmRTeXN0ZW0odGhpcyxsaW5lT2JqLHt0b3A6MCxsZWZ0OjB9LG1vZGV8fCJwYWdlIixpbmNsdWRlV2lkZ2V0c3x8ZW5kKS50b3ArCihlbmQ/dGhpcy5kb2MuaGVpZ2h0LWhlaWdodEF0TGluZShsaW5lT2JqKTowKX0sZGVmYXVsdFRleHRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpfSxkZWZhdWx0Q2hhcldpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIGNoYXJXaWR0aCh0aGlzLmRpc3BsYXkpfSxnZXRWaWV3cG9ydDpmdW5jdGlvbigpe3JldHVybntmcm9tOnRoaXMuZGlzcGxheS52aWV3RnJvbSx0bzp0aGlzLmRpc3BsYXkudmlld1RvfX0sYWRkV2lkZ2V0OmZ1bmN0aW9uKHBvcyxub2RlLHNjcm9sbCx2ZXJ0LGhvcml6KXt2YXIgZGlzcGxheT10aGlzLmRpc3BsYXk7cG9zPWN1cnNvckNvb3Jkcyh0aGlzLGNsaXBQb3ModGhpcy5kb2MscG9zKSk7dmFyIHRvcD1wb3MuYm90dG9tLGxlZnQ9cG9zLmxlZnQ7bm9kZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO25vZGUuc2V0QXR0cmlidXRlKCJjbS1pZ25vcmUtZXZlbnRzIiwidHJ1ZSIpO3RoaXMuZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKG5vZGUpO2Rpc3BsYXkuc2l6ZXIuYXBwZW5kQ2hpbGQobm9kZSk7aWYodmVydD09Im92ZXIiKXt0b3A9cG9zLnRvcDt9ZWxzZSBpZih2ZXJ0PT0iYWJvdmUifHx2ZXJ0PT0ibmVhciIpe3ZhciB2c3BhY2U9TWF0aC5tYXgoZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCx0aGlzLmRvYy5oZWlnaHQpLGhzcGFjZT1NYXRoLm1heChkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoLGRpc3BsYXkubGluZVNwYWNlLmNsaWVudFdpZHRoKTtpZigodmVydD09J2Fib3ZlJ3x8cG9zLmJvdHRvbStub2RlLm9mZnNldEhlaWdodD52c3BhY2UpJiZwb3MudG9wPm5vZGUub2Zmc2V0SGVpZ2h0KQp7dG9wPXBvcy50b3Atbm9kZS5vZmZzZXRIZWlnaHQ7fQplbHNlIGlmKHBvcy5ib3R0b20rbm9kZS5vZmZzZXRIZWlnaHQ8PXZzcGFjZSkKe3RvcD1wb3MuYm90dG9tO30KaWYobGVmdCtub2RlLm9mZnNldFdpZHRoPmhzcGFjZSkKe2xlZnQ9aHNwYWNlLW5vZGUub2Zmc2V0V2lkdGg7fX0Kbm9kZS5zdHlsZS50b3A9dG9wKyJweCI7bm9kZS5zdHlsZS5sZWZ0PW5vZGUuc3R5bGUucmlnaHQ9IiI7aWYoaG9yaXo9PSJyaWdodCIpe2xlZnQ9ZGlzcGxheS5zaXplci5jbGllbnRXaWR0aC1ub2RlLm9mZnNldFdpZHRoO25vZGUuc3R5bGUucmlnaHQ9IjBweCI7fWVsc2V7aWYoaG9yaXo9PSJsZWZ0Iil7bGVmdD0wO30KZWxzZSBpZihob3Jpej09Im1pZGRsZSIpe2xlZnQ9KGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGgtbm9kZS5vZmZzZXRXaWR0aCkvMjt9Cm5vZGUuc3R5bGUubGVmdD1sZWZ0KyJweCI7fQppZihzY3JvbGwpCntzY3JvbGxJbnRvVmlldyh0aGlzLHtsZWZ0OmxlZnQsdG9wOnRvcCxyaWdodDpsZWZ0K25vZGUub2Zmc2V0V2lkdGgsYm90dG9tOnRvcCtub2RlLm9mZnNldEhlaWdodH0pO319LHRyaWdnZXJPbktleURvd246bWV0aG9kT3Aob25LZXlEb3duKSx0cmlnZ2VyT25LZXlQcmVzczptZXRob2RPcChvbktleVByZXNzKSx0cmlnZ2VyT25LZXlVcDpvbktleVVwLHRyaWdnZXJPbk1vdXNlRG93bjptZXRob2RPcChvbk1vdXNlRG93biksZXhlY0NvbW1hbmQ6ZnVuY3Rpb24oY21kKXtpZihjb21tYW5kcy5oYXNPd25Qcm9wZXJ0eShjbWQpKQp7cmV0dXJuIGNvbW1hbmRzW2NtZF0uY2FsbChudWxsLHRoaXMpfX0sdHJpZ2dlckVsZWN0cmljOm1ldGhvZE9wKGZ1bmN0aW9uKHRleHQpe3RyaWdnZXJFbGVjdHJpYyh0aGlzLHRleHQpO30pLGZpbmRQb3NIOmZ1bmN0aW9uKGZyb20sYW1vdW50LHVuaXQsdmlzdWFsbHkpe3ZhciB0aGlzJDE9dGhpczt2YXIgZGlyPTE7aWYoYW1vdW50PDApe2Rpcj0tMTthbW91bnQ9LWFtb3VudDt9CnZhciBjdXI9Y2xpcFBvcyh0aGlzLmRvYyxmcm9tKTtmb3IodmFyIGk9MDtpPGFtb3VudDsrK2kpe2N1cj1maW5kUG9zSCh0aGlzJDEuZG9jLGN1cixkaXIsdW5pdCx2aXN1YWxseSk7aWYoY3VyLmhpdFNpZGUpe2JyZWFrfX0KcmV0dXJuIGN1cn0sbW92ZUg6bWV0aG9kT3AoZnVuY3Rpb24oZGlyLHVuaXQpe3ZhciB0aGlzJDE9dGhpczt0aGlzLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSQkMSl7aWYodGhpcyQxLmRpc3BsYXkuc2hpZnR8fHRoaXMkMS5kb2MuZXh0ZW5kfHxyYW5nZSQkMS5lbXB0eSgpKQp7cmV0dXJuIGZpbmRQb3NIKHRoaXMkMS5kb2MscmFuZ2UkJDEuaGVhZCxkaXIsdW5pdCx0aGlzJDEub3B0aW9ucy5ydGxNb3ZlVmlzdWFsbHkpfQplbHNlCntyZXR1cm4gZGlyPDA/cmFuZ2UkJDEuZnJvbSgpOnJhbmdlJCQxLnRvKCl9fSxzZWxfbW92ZSk7fSksZGVsZXRlSDptZXRob2RPcChmdW5jdGlvbihkaXIsdW5pdCl7dmFyIHNlbD10aGlzLmRvYy5zZWwsZG9jPXRoaXMuZG9jO2lmKHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpKQp7ZG9jLnJlcGxhY2VTZWxlY3Rpb24oIiIsbnVsbCwiK2RlbGV0ZSIpO30KZWxzZQp7ZGVsZXRlTmVhclNlbGVjdGlvbih0aGlzLGZ1bmN0aW9uKHJhbmdlJCQxKXt2YXIgb3RoZXI9ZmluZFBvc0goZG9jLHJhbmdlJCQxLmhlYWQsZGlyLHVuaXQsZmFsc2UpO3JldHVybiBkaXI8MD97ZnJvbTpvdGhlcix0bzpyYW5nZSQkMS5oZWFkfTp7ZnJvbTpyYW5nZSQkMS5oZWFkLHRvOm90aGVyfX0pO319KSxmaW5kUG9zVjpmdW5jdGlvbihmcm9tLGFtb3VudCx1bml0LGdvYWxDb2x1bW4pe3ZhciB0aGlzJDE9dGhpczt2YXIgZGlyPTEseD1nb2FsQ29sdW1uO2lmKGFtb3VudDwwKXtkaXI9LTE7YW1vdW50PS1hbW91bnQ7fQp2YXIgY3VyPWNsaXBQb3ModGhpcy5kb2MsZnJvbSk7Zm9yKHZhciBpPTA7aTxhbW91bnQ7KytpKXt2YXIgY29vcmRzPWN1cnNvckNvb3Jkcyh0aGlzJDEsY3VyLCJkaXYiKTtpZih4PT1udWxsKXt4PWNvb3Jkcy5sZWZ0O30KZWxzZXtjb29yZHMubGVmdD14O30KY3VyPWZpbmRQb3NWKHRoaXMkMSxjb29yZHMsZGlyLHVuaXQpO2lmKGN1ci5oaXRTaWRlKXticmVha319CnJldHVybiBjdXJ9LG1vdmVWOm1ldGhvZE9wKGZ1bmN0aW9uKGRpcix1bml0KXt2YXIgdGhpcyQxPXRoaXM7dmFyIGRvYz10aGlzLmRvYyxnb2Fscz1bXTt2YXIgY29sbGFwc2U9IXRoaXMuZGlzcGxheS5zaGlmdCYmIWRvYy5leHRlbmQmJmRvYy5zZWwuc29tZXRoaW5nU2VsZWN0ZWQoKTtkb2MuZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlJCQxKXtpZihjb2xsYXBzZSkKe3JldHVybiBkaXI8MD9yYW5nZSQkMS5mcm9tKCk6cmFuZ2UkJDEudG8oKX0KdmFyIGhlYWRQb3M9Y3Vyc29yQ29vcmRzKHRoaXMkMSxyYW5nZSQkMS5oZWFkLCJkaXYiKTtpZihyYW5nZSQkMS5nb2FsQ29sdW1uIT1udWxsKXtoZWFkUG9zLmxlZnQ9cmFuZ2UkJDEuZ29hbENvbHVtbjt9CmdvYWxzLnB1c2goaGVhZFBvcy5sZWZ0KTt2YXIgcG9zPWZpbmRQb3NWKHRoaXMkMSxoZWFkUG9zLGRpcix1bml0KTtpZih1bml0PT0icGFnZSImJnJhbmdlJCQxPT1kb2Muc2VsLnByaW1hcnkoKSkKe2FkZFRvU2Nyb2xsVG9wKHRoaXMkMSxjaGFyQ29vcmRzKHRoaXMkMSxwb3MsImRpdiIpLnRvcC1oZWFkUG9zLnRvcCk7fQpyZXR1cm4gcG9zfSxzZWxfbW92ZSk7aWYoZ29hbHMubGVuZ3RoKXtmb3IodmFyIGk9MDtpPGRvYy5zZWwucmFuZ2VzLmxlbmd0aDtpKyspCntkb2Muc2VsLnJhbmdlc1tpXS5nb2FsQ29sdW1uPWdvYWxzW2ldO319fSksZmluZFdvcmRBdDpmdW5jdGlvbihwb3Mpe3ZhciBkb2M9dGhpcy5kb2MsbGluZT1nZXRMaW5lKGRvYyxwb3MubGluZSkudGV4dDt2YXIgc3RhcnQ9cG9zLmNoLGVuZD1wb3MuY2g7aWYobGluZSl7dmFyIGhlbHBlcj10aGlzLmdldEhlbHBlcihwb3MsIndvcmRDaGFycyIpO2lmKChwb3Muc3RpY2t5PT0iYmVmb3JlInx8ZW5kPT1saW5lLmxlbmd0aCkmJnN0YXJ0KXstLXN0YXJ0O31lbHNleysrZW5kO30KdmFyIHN0YXJ0Q2hhcj1saW5lLmNoYXJBdChzdGFydCk7dmFyIGNoZWNrPWlzV29yZENoYXIoc3RhcnRDaGFyLGhlbHBlcik/ZnVuY3Rpb24oY2gpe3JldHVybiBpc1dvcmRDaGFyKGNoLGhlbHBlcik7fTovXHMvLnRlc3Qoc3RhcnRDaGFyKT9mdW5jdGlvbihjaCl7cmV0dXJuL1xzLy50ZXN0KGNoKTt9OmZ1bmN0aW9uKGNoKXtyZXR1cm4oIS9ccy8udGVzdChjaCkmJiFpc1dvcmRDaGFyKGNoKSk7fTt3aGlsZShzdGFydD4wJiZjaGVjayhsaW5lLmNoYXJBdChzdGFydC0xKSkpey0tc3RhcnQ7fQp3aGlsZShlbmQ8bGluZS5sZW5ndGgmJmNoZWNrKGxpbmUuY2hhckF0KGVuZCkpKXsrK2VuZDt9fQpyZXR1cm4gbmV3IFJhbmdlKFBvcyhwb3MubGluZSxzdGFydCksUG9zKHBvcy5saW5lLGVuZCkpfSx0b2dnbGVPdmVyd3JpdGU6ZnVuY3Rpb24odmFsdWUpe2lmKHZhbHVlIT1udWxsJiZ2YWx1ZT09dGhpcy5zdGF0ZS5vdmVyd3JpdGUpe3JldHVybn0KaWYodGhpcy5zdGF0ZS5vdmVyd3JpdGU9IXRoaXMuc3RhdGUub3ZlcndyaXRlKQp7YWRkQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwiQ29kZU1pcnJvci1vdmVyd3JpdGUiKTt9CmVsc2UKe3JtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwiQ29kZU1pcnJvci1vdmVyd3JpdGUiKTt9CnNpZ25hbCh0aGlzLCJvdmVyd3JpdGVUb2dnbGUiLHRoaXMsdGhpcy5zdGF0ZS5vdmVyd3JpdGUpO30saGFzRm9jdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCk9PWFjdGl2ZUVsdCgpfSxpc1JlYWRPbmx5OmZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5vcHRpb25zLnJlYWRPbmx5fHx0aGlzLmRvYy5jYW50RWRpdCl9LHNjcm9sbFRvOm1ldGhvZE9wKGZ1bmN0aW9uKHgseSl7c2Nyb2xsVG9Db29yZHModGhpcyx4LHkpO30pLGdldFNjcm9sbEluZm86ZnVuY3Rpb24oKXt2YXIgc2Nyb2xsZXI9dGhpcy5kaXNwbGF5LnNjcm9sbGVyO3JldHVybntsZWZ0OnNjcm9sbGVyLnNjcm9sbExlZnQsdG9wOnNjcm9sbGVyLnNjcm9sbFRvcCxoZWlnaHQ6c2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0LXNjcm9sbEdhcCh0aGlzKS10aGlzLmRpc3BsYXkuYmFySGVpZ2h0LHdpZHRoOnNjcm9sbGVyLnNjcm9sbFdpZHRoLXNjcm9sbEdhcCh0aGlzKS10aGlzLmRpc3BsYXkuYmFyV2lkdGgsY2xpZW50SGVpZ2h0OmRpc3BsYXlIZWlnaHQodGhpcyksY2xpZW50V2lkdGg6ZGlzcGxheVdpZHRoKHRoaXMpfX0sc2Nyb2xsSW50b1ZpZXc6bWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2UkJDEsbWFyZ2luKXtpZihyYW5nZSQkMT09bnVsbCl7cmFuZ2UkJDE9e2Zyb206dGhpcy5kb2Muc2VsLnByaW1hcnkoKS5oZWFkLHRvOm51bGx9O2lmKG1hcmdpbj09bnVsbCl7bWFyZ2luPXRoaXMub3B0aW9ucy5jdXJzb3JTY3JvbGxNYXJnaW47fX1lbHNlIGlmKHR5cGVvZiByYW5nZSQkMT09Im51bWJlciIpe3JhbmdlJCQxPXtmcm9tOlBvcyhyYW5nZSQkMSwwKSx0bzpudWxsfTt9ZWxzZSBpZihyYW5nZSQkMS5mcm9tPT1udWxsKXtyYW5nZSQkMT17ZnJvbTpyYW5nZSQkMSx0bzpudWxsfTt9CmlmKCFyYW5nZSQkMS50byl7cmFuZ2UkJDEudG89cmFuZ2UkJDEuZnJvbTt9CnJhbmdlJCQxLm1hcmdpbj1tYXJnaW58fDA7aWYocmFuZ2UkJDEuZnJvbS5saW5lIT1udWxsKXtzY3JvbGxUb1JhbmdlKHRoaXMscmFuZ2UkJDEpO31lbHNle3Njcm9sbFRvQ29vcmRzUmFuZ2UodGhpcyxyYW5nZSQkMS5mcm9tLHJhbmdlJCQxLnRvLHJhbmdlJCQxLm1hcmdpbik7fX0pLHNldFNpemU6bWV0aG9kT3AoZnVuY3Rpb24od2lkdGgsaGVpZ2h0KXt2YXIgdGhpcyQxPXRoaXM7dmFyIGludGVycHJldD1mdW5jdGlvbih2YWwpe3JldHVybiB0eXBlb2YgdmFsPT0ibnVtYmVyInx8L15cZCskLy50ZXN0KFN0cmluZyh2YWwpKT92YWwrInB4Ijp2YWw7fTtpZih3aWR0aCE9bnVsbCl7dGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUud2lkdGg9aW50ZXJwcmV0KHdpZHRoKTt9CmlmKGhlaWdodCE9bnVsbCl7dGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUuaGVpZ2h0PWludGVycHJldChoZWlnaHQpO30KaWYodGhpcy5vcHRpb25zLmxpbmVXcmFwcGluZyl7Y2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZSh0aGlzKTt9CnZhciBsaW5lTm8kJDE9dGhpcy5kaXNwbGF5LnZpZXdGcm9tO3RoaXMuZG9jLml0ZXIobGluZU5vJCQxLHRoaXMuZGlzcGxheS52aWV3VG8sZnVuY3Rpb24obGluZSl7aWYobGluZS53aWRnZXRzKXtmb3IodmFyIGk9MDtpPGxpbmUud2lkZ2V0cy5sZW5ndGg7aSsrKQp7aWYobGluZS53aWRnZXRzW2ldLm5vSFNjcm9sbCl7cmVnTGluZUNoYW5nZSh0aGlzJDEsbGluZU5vJCQxLCJ3aWRnZXQiKTticmVha319fQorK2xpbmVObyQkMTt9KTt0aGlzLmN1ck9wLmZvcmNlVXBkYXRlPXRydWU7c2lnbmFsKHRoaXMsInJlZnJlc2giLHRoaXMpO30pLG9wZXJhdGlvbjpmdW5jdGlvbihmKXtyZXR1cm4gcnVuSW5PcCh0aGlzLGYpfSxzdGFydE9wZXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiBzdGFydE9wZXJhdGlvbih0aGlzKX0sZW5kT3BlcmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGVuZE9wZXJhdGlvbih0aGlzKX0scmVmcmVzaDptZXRob2RPcChmdW5jdGlvbigpe3ZhciBvbGRIZWlnaHQ9dGhpcy5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQ7cmVnQ2hhbmdlKHRoaXMpO3RoaXMuY3VyT3AuZm9yY2VVcGRhdGU9dHJ1ZTtjbGVhckNhY2hlcyh0aGlzKTtzY3JvbGxUb0Nvb3Jkcyh0aGlzLHRoaXMuZG9jLnNjcm9sbExlZnQsdGhpcy5kb2Muc2Nyb2xsVG9wKTt1cGRhdGVHdXR0ZXJTcGFjZSh0aGlzKTtpZihvbGRIZWlnaHQ9PW51bGx8fE1hdGguYWJzKG9sZEhlaWdodC10ZXh0SGVpZ2h0KHRoaXMuZGlzcGxheSkpPi41KQp7ZXN0aW1hdGVMaW5lSGVpZ2h0cyh0aGlzKTt9CnNpZ25hbCh0aGlzLCJyZWZyZXNoIix0aGlzKTt9KSxzd2FwRG9jOm1ldGhvZE9wKGZ1bmN0aW9uKGRvYyl7dmFyIG9sZD10aGlzLmRvYztvbGQuY209bnVsbDthdHRhY2hEb2ModGhpcyxkb2MpO2NsZWFyQ2FjaGVzKHRoaXMpO3RoaXMuZGlzcGxheS5pbnB1dC5yZXNldCgpO3Njcm9sbFRvQ29vcmRzKHRoaXMsZG9jLnNjcm9sbExlZnQsZG9jLnNjcm9sbFRvcCk7dGhpcy5jdXJPcC5mb3JjZVNjcm9sbD10cnVlO3NpZ25hbExhdGVyKHRoaXMsInN3YXBEb2MiLHRoaXMsb2xkKTtyZXR1cm4gb2xkfSksZ2V0SW5wdXRGaWVsZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKX0sZ2V0V3JhcHBlckVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LndyYXBwZXJ9LGdldFNjcm9sbGVyRWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3BsYXkuc2Nyb2xsZXJ9LGdldEd1dHRlckVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5Lmd1dHRlcnN9fTtldmVudE1peGluKENvZGVNaXJyb3IpO0NvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXI9ZnVuY3Rpb24odHlwZSxuYW1lLHZhbHVlKXtpZighaGVscGVycy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSl7aGVscGVyc1t0eXBlXT1Db2RlTWlycm9yW3R5cGVdPXtfZ2xvYmFsOltdfTt9CmhlbHBlcnNbdHlwZV1bbmFtZV09dmFsdWU7fTtDb2RlTWlycm9yLnJlZ2lzdGVyR2xvYmFsSGVscGVyPWZ1bmN0aW9uKHR5cGUsbmFtZSxwcmVkaWNhdGUsdmFsdWUpe0NvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIodHlwZSxuYW1lLHZhbHVlKTtoZWxwZXJzW3R5cGVdLl9nbG9iYWwucHVzaCh7cHJlZDpwcmVkaWNhdGUsdmFsOnZhbHVlfSk7fTt9O2Z1bmN0aW9uIGZpbmRQb3NIKGRvYyxwb3MsZGlyLHVuaXQsdmlzdWFsbHkpe3ZhciBvbGRQb3M9cG9zO3ZhciBvcmlnRGlyPWRpcjt2YXIgbGluZU9iaj1nZXRMaW5lKGRvYyxwb3MubGluZSk7ZnVuY3Rpb24gZmluZE5leHRMaW5lKCl7dmFyIGw9cG9zLmxpbmUrZGlyO2lmKGw8ZG9jLmZpcnN0fHxsPj1kb2MuZmlyc3QrZG9jLnNpemUpe3JldHVybiBmYWxzZX0KcG9zPW5ldyBQb3MobCxwb3MuY2gscG9zLnN0aWNreSk7cmV0dXJuIGxpbmVPYmo9Z2V0TGluZShkb2MsbCl9CmZ1bmN0aW9uIG1vdmVPbmNlKGJvdW5kVG9MaW5lKXt2YXIgbmV4dDtpZih2aXN1YWxseSl7bmV4dD1tb3ZlVmlzdWFsbHkoZG9jLmNtLGxpbmVPYmoscG9zLGRpcik7fWVsc2V7bmV4dD1tb3ZlTG9naWNhbGx5KGxpbmVPYmoscG9zLGRpcik7fQppZihuZXh0PT1udWxsKXtpZighYm91bmRUb0xpbmUmJmZpbmROZXh0TGluZSgpKQp7cG9zPWVuZE9mTGluZSh2aXN1YWxseSxkb2MuY20sbGluZU9iaixwb3MubGluZSxkaXIpO30KZWxzZQp7cmV0dXJuIGZhbHNlfX1lbHNle3Bvcz1uZXh0O30KcmV0dXJuIHRydWV9CmlmKHVuaXQ9PSJjaGFyIil7bW92ZU9uY2UoKTt9ZWxzZSBpZih1bml0PT0iY29sdW1uIil7bW92ZU9uY2UodHJ1ZSk7fWVsc2UgaWYodW5pdD09IndvcmQifHx1bml0PT0iZ3JvdXAiKXt2YXIgc2F3VHlwZT1udWxsLGdyb3VwPXVuaXQ9PSJncm91cCI7dmFyIGhlbHBlcj1kb2MuY20mJmRvYy5jbS5nZXRIZWxwZXIocG9zLCJ3b3JkQ2hhcnMiKTtmb3IodmFyIGZpcnN0PXRydWU7O2ZpcnN0PWZhbHNlKXtpZihkaXI8MCYmIW1vdmVPbmNlKCFmaXJzdCkpe2JyZWFrfQp2YXIgY3VyPWxpbmVPYmoudGV4dC5jaGFyQXQocG9zLmNoKXx8IlxuIjt2YXIgdHlwZT1pc1dvcmRDaGFyKGN1cixoZWxwZXIpPyJ3Ijpncm91cCYmY3VyPT0iXG4iPyJuIjohZ3JvdXB8fC9ccy8udGVzdChjdXIpP251bGw6InAiO2lmKGdyb3VwJiYhZmlyc3QmJiF0eXBlKXt0eXBlPSJzIjt9CmlmKHNhd1R5cGUmJnNhd1R5cGUhPXR5cGUpe2lmKGRpcjwwKXtkaXI9MTttb3ZlT25jZSgpO3Bvcy5zdGlja3k9ImFmdGVyIjt9CmJyZWFrfQppZih0eXBlKXtzYXdUeXBlPXR5cGU7fQppZihkaXI+MCYmIW1vdmVPbmNlKCFmaXJzdCkpe2JyZWFrfX19CnZhciByZXN1bHQ9c2tpcEF0b21pYyhkb2MscG9zLG9sZFBvcyxvcmlnRGlyLHRydWUpO2lmKGVxdWFsQ3Vyc29yUG9zKG9sZFBvcyxyZXN1bHQpKXtyZXN1bHQuaGl0U2lkZT10cnVlO30KcmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gZmluZFBvc1YoY20scG9zLGRpcix1bml0KXt2YXIgZG9jPWNtLmRvYyx4PXBvcy5sZWZ0LHk7aWYodW5pdD09InBhZ2UiKXt2YXIgcGFnZVNpemU9TWF0aC5taW4oY20uZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCx3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpO3ZhciBtb3ZlQW1vdW50PU1hdGgubWF4KHBhZ2VTaXplLS41KnRleHRIZWlnaHQoY20uZGlzcGxheSksMyk7eT0oZGlyPjA/cG9zLmJvdHRvbTpwb3MudG9wKStkaXIqbW92ZUFtb3VudDt9ZWxzZSBpZih1bml0PT0ibGluZSIpe3k9ZGlyPjA/cG9zLmJvdHRvbSszOnBvcy50b3AtMzt9CnZhciB0YXJnZXQ7Zm9yKDs7KXt0YXJnZXQ9Y29vcmRzQ2hhcihjbSx4LHkpO2lmKCF0YXJnZXQub3V0c2lkZSl7YnJlYWt9CmlmKGRpcjwwP3k8PTA6eT49ZG9jLmhlaWdodCl7dGFyZ2V0LmhpdFNpZGU9dHJ1ZTticmVha30KeSs9ZGlyKjU7fQpyZXR1cm4gdGFyZ2V0fQp2YXIgQ29udGVudEVkaXRhYmxlSW5wdXQ9ZnVuY3Rpb24oY20pe3RoaXMuY209Y207dGhpcy5sYXN0QW5jaG9yTm9kZT10aGlzLmxhc3RBbmNob3JPZmZzZXQ9dGhpcy5sYXN0Rm9jdXNOb2RlPXRoaXMubGFzdEZvY3VzT2Zmc2V0PW51bGw7dGhpcy5wb2xsaW5nPW5ldyBEZWxheWVkKCk7dGhpcy5jb21wb3Npbmc9bnVsbDt0aGlzLmdyYWNlUGVyaW9kPWZhbHNlO3RoaXMucmVhZERPTVRpbWVvdXQ9bnVsbDt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGRpc3BsYXkpe3ZhciB0aGlzJDE9dGhpczt2YXIgaW5wdXQ9dGhpcyxjbT1pbnB1dC5jbTt2YXIgZGl2PWlucHV0LmRpdj1kaXNwbGF5LmxpbmVEaXY7ZGlzYWJsZUJyb3dzZXJNYWdpYyhkaXYsY20ub3B0aW9ucy5zcGVsbGNoZWNrKTtvbihkaXYsInBhc3RlIixmdW5jdGlvbihlKXtpZihzaWduYWxET01FdmVudChjbSxlKXx8aGFuZGxlUGFzdGUoZSxjbSkpe3JldHVybn0KaWYoaWVfdmVyc2lvbjw9MTEpe3NldFRpbWVvdXQob3BlcmF0aW9uKGNtLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMkMS51cGRhdGVGcm9tRE9NKCk7fSksMjApO319KTtvbihkaXYsImNvbXBvc2l0aW9uc3RhcnQiLGZ1bmN0aW9uKGUpe3RoaXMkMS5jb21wb3Npbmc9e2RhdGE6ZS5kYXRhLGRvbmU6ZmFsc2V9O30pO29uKGRpdiwiY29tcG9zaXRpb251cGRhdGUiLGZ1bmN0aW9uKGUpe2lmKCF0aGlzJDEuY29tcG9zaW5nKXt0aGlzJDEuY29tcG9zaW5nPXtkYXRhOmUuZGF0YSxkb25lOmZhbHNlfTt9fSk7b24oZGl2LCJjb21wb3NpdGlvbmVuZCIsZnVuY3Rpb24oZSl7aWYodGhpcyQxLmNvbXBvc2luZyl7aWYoZS5kYXRhIT10aGlzJDEuY29tcG9zaW5nLmRhdGEpe3RoaXMkMS5yZWFkRnJvbURPTVNvb24oKTt9CnRoaXMkMS5jb21wb3NpbmcuZG9uZT10cnVlO319KTtvbihkaXYsInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIGlucHV0LmZvcmNlQ29tcG9zaXRpb25FbmQoKTt9KTtvbihkaXYsImlucHV0IixmdW5jdGlvbigpe2lmKCF0aGlzJDEuY29tcG9zaW5nKXt0aGlzJDEucmVhZEZyb21ET01Tb29uKCk7fX0pO2Z1bmN0aW9uIG9uQ29weUN1dChlKXtpZihzaWduYWxET01FdmVudChjbSxlKSl7cmV0dXJufQppZihjbS5zb21ldGhpbmdTZWxlY3RlZCgpKXtzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTpmYWxzZSx0ZXh0OmNtLmdldFNlbGVjdGlvbnMoKX0pO2lmKGUudHlwZT09ImN1dCIpe2NtLnJlcGxhY2VTZWxlY3Rpb24oIiIsbnVsbCwiY3V0Iik7fX1lbHNlIGlmKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCl7cmV0dXJufWVsc2V7dmFyIHJhbmdlcz1jb3B5YWJsZVJhbmdlcyhjbSk7c2V0TGFzdENvcGllZCh7bGluZVdpc2U6dHJ1ZSx0ZXh0OnJhbmdlcy50ZXh0fSk7aWYoZS50eXBlPT0iY3V0Iil7Y20ub3BlcmF0aW9uKGZ1bmN0aW9uKCl7Y20uc2V0U2VsZWN0aW9ucyhyYW5nZXMucmFuZ2VzLDAsc2VsX2RvbnRTY3JvbGwpO2NtLnJlcGxhY2VTZWxlY3Rpb24oIiIsbnVsbCwiY3V0Iik7fSk7fX0KaWYoZS5jbGlwYm9hcmREYXRhKXtlLmNsaXBib2FyZERhdGEuY2xlYXJEYXRhKCk7dmFyIGNvbnRlbnQ9bGFzdENvcGllZC50ZXh0LmpvaW4oIlxuIik7ZS5jbGlwYm9hcmREYXRhLnNldERhdGEoIlRleHQiLGNvbnRlbnQpO2lmKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik9PWNvbnRlbnQpe2UucHJldmVudERlZmF1bHQoKTtyZXR1cm59fQp2YXIga2x1ZGdlPWhpZGRlblRleHRhcmVhKCksdGU9a2x1ZGdlLmZpcnN0Q2hpbGQ7Y20uZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKGtsdWRnZSxjbS5kaXNwbGF5LmxpbmVTcGFjZS5maXJzdENoaWxkKTt0ZS52YWx1ZT1sYXN0Q29waWVkLnRleHQuam9pbigiXG4iKTt2YXIgaGFkRm9jdXM9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtzZWxlY3RJbnB1dCh0ZSk7c2V0VGltZW91dChmdW5jdGlvbigpe2NtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKGtsdWRnZSk7aGFkRm9jdXMuZm9jdXMoKTtpZihoYWRGb2N1cz09ZGl2KXtpbnB1dC5zaG93UHJpbWFyeVNlbGVjdGlvbigpO319LDUwKTt9Cm9uKGRpdiwiY29weSIsb25Db3B5Q3V0KTtvbihkaXYsImN1dCIsb25Db3B5Q3V0KTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5wcmVwYXJlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHJlc3VsdD1wcmVwYXJlU2VsZWN0aW9uKHRoaXMuY20sZmFsc2UpO3Jlc3VsdC5mb2N1cz10aGlzLmNtLnN0YXRlLmZvY3VzZWQ7cmV0dXJuIHJlc3VsdH07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNob3dTZWxlY3Rpb249ZnVuY3Rpb24oaW5mbyx0YWtlRm9jdXMpe2lmKCFpbmZvfHwhdGhpcy5jbS5kaXNwbGF5LnZpZXcubGVuZ3RoKXtyZXR1cm59CmlmKGluZm8uZm9jdXN8fHRha2VGb2N1cyl7dGhpcy5zaG93UHJpbWFyeVNlbGVjdGlvbigpO30KdGhpcy5zaG93TXVsdGlwbGVTZWxlY3Rpb25zKGluZm8pO307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNob3dQcmltYXJ5U2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHNlbD13aW5kb3cuZ2V0U2VsZWN0aW9uKCksY209dGhpcy5jbSxwcmltPWNtLmRvYy5zZWwucHJpbWFyeSgpO3ZhciBmcm9tPXByaW0uZnJvbSgpLHRvPXByaW0udG8oKTtpZihjbS5kaXNwbGF5LnZpZXdUbz09Y20uZGlzcGxheS52aWV3RnJvbXx8ZnJvbS5saW5lPj1jbS5kaXNwbGF5LnZpZXdUb3x8dG8ubGluZTxjbS5kaXNwbGF5LnZpZXdGcm9tKXtzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7cmV0dXJufQp2YXIgY3VyQW5jaG9yPWRvbVRvUG9zKGNtLHNlbC5hbmNob3JOb2RlLHNlbC5hbmNob3JPZmZzZXQpO3ZhciBjdXJGb2N1cz1kb21Ub1BvcyhjbSxzZWwuZm9jdXNOb2RlLHNlbC5mb2N1c09mZnNldCk7aWYoY3VyQW5jaG9yJiYhY3VyQW5jaG9yLmJhZCYmY3VyRm9jdXMmJiFjdXJGb2N1cy5iYWQmJmNtcChtaW5Qb3MoY3VyQW5jaG9yLGN1ckZvY3VzKSxmcm9tKT09MCYmY21wKG1heFBvcyhjdXJBbmNob3IsY3VyRm9jdXMpLHRvKT09MCkKe3JldHVybn0KdmFyIHZpZXc9Y20uZGlzcGxheS52aWV3O3ZhciBzdGFydD0oZnJvbS5saW5lPj1jbS5kaXNwbGF5LnZpZXdGcm9tJiZwb3NUb0RPTShjbSxmcm9tKSl8fHtub2RlOnZpZXdbMF0ubWVhc3VyZS5tYXBbMl0sb2Zmc2V0OjB9O3ZhciBlbmQ9dG8ubGluZTxjbS5kaXNwbGF5LnZpZXdUbyYmcG9zVG9ET00oY20sdG8pO2lmKCFlbmQpe3ZhciBtZWFzdXJlPXZpZXdbdmlldy5sZW5ndGgtMV0ubWVhc3VyZTt2YXIgbWFwJCQxPW1lYXN1cmUubWFwcz9tZWFzdXJlLm1hcHNbbWVhc3VyZS5tYXBzLmxlbmd0aC0xXTptZWFzdXJlLm1hcDtlbmQ9e25vZGU6bWFwJCQxW21hcCQkMS5sZW5ndGgtMV0sb2Zmc2V0Om1hcCQkMVttYXAkJDEubGVuZ3RoLTJdLW1hcCQkMVttYXAkJDEubGVuZ3RoLTNdfTt9CmlmKCFzdGFydHx8IWVuZCl7c2VsLnJlbW92ZUFsbFJhbmdlcygpO3JldHVybn0KdmFyIG9sZD1zZWwucmFuZ2VDb3VudCYmc2VsLmdldFJhbmdlQXQoMCkscm5nO3RyeXtybmc9cmFuZ2Uoc3RhcnQubm9kZSxzdGFydC5vZmZzZXQsZW5kLm9mZnNldCxlbmQubm9kZSk7fQpjYXRjaChlKXt9CmlmKHJuZyl7aWYoIWdlY2tvJiZjbS5zdGF0ZS5mb2N1c2VkKXtzZWwuY29sbGFwc2Uoc3RhcnQubm9kZSxzdGFydC5vZmZzZXQpO2lmKCFybmcuY29sbGFwc2VkKXtzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7c2VsLmFkZFJhbmdlKHJuZyk7fX1lbHNle3NlbC5yZW1vdmVBbGxSYW5nZXMoKTtzZWwuYWRkUmFuZ2Uocm5nKTt9CmlmKG9sZCYmc2VsLmFuY2hvck5vZGU9PW51bGwpe3NlbC5hZGRSYW5nZShvbGQpO30KZWxzZSBpZihnZWNrbyl7dGhpcy5zdGFydEdyYWNlUGVyaW9kKCk7fX0KdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpO307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnN0YXJ0R3JhY2VQZXJpb2Q9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMuZ3JhY2VQZXJpb2QpO3RoaXMuZ3JhY2VQZXJpb2Q9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMkMS5ncmFjZVBlcmlvZD1mYWxzZTtpZih0aGlzJDEuc2VsZWN0aW9uQ2hhbmdlZCgpKQp7dGhpcyQxLmNtLm9wZXJhdGlvbihmdW5jdGlvbigpe3JldHVybiB0aGlzJDEuY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZD10cnVlO30pO319LDIwKTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zaG93TXVsdGlwbGVTZWxlY3Rpb25zPWZ1bmN0aW9uKGluZm8pe3JlbW92ZUNoaWxkcmVuQW5kQWRkKHRoaXMuY20uZGlzcGxheS5jdXJzb3JEaXYsaW5mby5jdXJzb3JzKTtyZW1vdmVDaGlsZHJlbkFuZEFkZCh0aGlzLmNtLmRpc3BsYXkuc2VsZWN0aW9uRGl2LGluZm8uc2VsZWN0aW9uKTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZW1lbWJlclNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBzZWw9d2luZG93LmdldFNlbGVjdGlvbigpO3RoaXMubGFzdEFuY2hvck5vZGU9c2VsLmFuY2hvck5vZGU7dGhpcy5sYXN0QW5jaG9yT2Zmc2V0PXNlbC5hbmNob3JPZmZzZXQ7dGhpcy5sYXN0Rm9jdXNOb2RlPXNlbC5mb2N1c05vZGU7dGhpcy5sYXN0Rm9jdXNPZmZzZXQ9c2VsLmZvY3VzT2Zmc2V0O307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnNlbGVjdGlvbkluRWRpdG9yPWZ1bmN0aW9uKCl7dmFyIHNlbD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoIXNlbC5yYW5nZUNvdW50KXtyZXR1cm4gZmFsc2V9CnZhciBub2RlPXNlbC5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO3JldHVybiBjb250YWlucyh0aGlzLmRpdixub2RlKX07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7aWYodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5IT0ibm9jdXJzb3IiKXtpZighdGhpcy5zZWxlY3Rpb25JbkVkaXRvcigpKQp7dGhpcy5zaG93U2VsZWN0aW9uKHRoaXMucHJlcGFyZVNlbGVjdGlvbigpLHRydWUpO30KdGhpcy5kaXYuZm9jdXMoKTt9fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuYmx1cj1mdW5jdGlvbigpe3RoaXMuZGl2LmJsdXIoKTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5nZXRGaWVsZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdn07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnN1cHBvcnRzVG91Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnJlY2VpdmVkRm9jdXM9ZnVuY3Rpb24oKXt2YXIgaW5wdXQ9dGhpcztpZih0aGlzLnNlbGVjdGlvbkluRWRpdG9yKCkpCnt0aGlzLnBvbGxTZWxlY3Rpb24oKTt9CmVsc2UKe3J1bkluT3AodGhpcy5jbSxmdW5jdGlvbigpe3JldHVybiBpbnB1dC5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkPXRydWU7fSk7fQpmdW5jdGlvbiBwb2xsKCl7aWYoaW5wdXQuY20uc3RhdGUuZm9jdXNlZCl7aW5wdXQucG9sbFNlbGVjdGlvbigpO2lucHV0LnBvbGxpbmcuc2V0KGlucHV0LmNtLm9wdGlvbnMucG9sbEludGVydmFsLHBvbGwpO319CnRoaXMucG9sbGluZy5zZXQodGhpcy5jbS5vcHRpb25zLnBvbGxJbnRlcnZhbCxwb2xsKTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5zZWxlY3Rpb25DaGFuZ2VkPWZ1bmN0aW9uKCl7dmFyIHNlbD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHNlbC5hbmNob3JOb2RlIT10aGlzLmxhc3RBbmNob3JOb2RlfHxzZWwuYW5jaG9yT2Zmc2V0IT10aGlzLmxhc3RBbmNob3JPZmZzZXR8fHNlbC5mb2N1c05vZGUhPXRoaXMubGFzdEZvY3VzTm9kZXx8c2VsLmZvY3VzT2Zmc2V0IT10aGlzLmxhc3RGb2N1c09mZnNldH07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnBvbGxTZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLnJlYWRET01UaW1lb3V0IT1udWxsfHx0aGlzLmdyYWNlUGVyaW9kfHwhdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCkpe3JldHVybn0KdmFyIHNlbD13aW5kb3cuZ2V0U2VsZWN0aW9uKCksY209dGhpcy5jbTtpZihhbmRyb2lkJiZjaHJvbWUmJnRoaXMuY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aCYmaXNJbkd1dHRlcihzZWwuYW5jaG9yTm9kZSkpe3RoaXMuY20udHJpZ2dlck9uS2V5RG93bih7dHlwZToia2V5ZG93biIsa2V5Q29kZTo4LHByZXZlbnREZWZhdWx0Ok1hdGguYWJzfSk7dGhpcy5ibHVyKCk7dGhpcy5mb2N1cygpO3JldHVybn0KaWYodGhpcy5jb21wb3Npbmcpe3JldHVybn0KdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpO3ZhciBhbmNob3I9ZG9tVG9Qb3MoY20sc2VsLmFuY2hvck5vZGUsc2VsLmFuY2hvck9mZnNldCk7dmFyIGhlYWQ9ZG9tVG9Qb3MoY20sc2VsLmZvY3VzTm9kZSxzZWwuZm9jdXNPZmZzZXQpO2lmKGFuY2hvciYmaGVhZCl7cnVuSW5PcChjbSxmdW5jdGlvbigpe3NldFNlbGVjdGlvbihjbS5kb2Msc2ltcGxlU2VsZWN0aW9uKGFuY2hvcixoZWFkKSxzZWxfZG9udFNjcm9sbCk7aWYoYW5jaG9yLmJhZHx8aGVhZC5iYWQpe2NtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQ9dHJ1ZTt9fSk7fX07Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLnBvbGxDb250ZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFkRE9NVGltZW91dCE9bnVsbCl7Y2xlYXJUaW1lb3V0KHRoaXMucmVhZERPTVRpbWVvdXQpO3RoaXMucmVhZERPTVRpbWVvdXQ9bnVsbDt9CnZhciBjbT10aGlzLmNtLGRpc3BsYXk9Y20uZGlzcGxheSxzZWw9Y20uZG9jLnNlbC5wcmltYXJ5KCk7dmFyIGZyb209c2VsLmZyb20oKSx0bz1zZWwudG8oKTtpZihmcm9tLmNoPT0wJiZmcm9tLmxpbmU+Y20uZmlyc3RMaW5lKCkpCntmcm9tPVBvcyhmcm9tLmxpbmUtMSxnZXRMaW5lKGNtLmRvYyxmcm9tLmxpbmUtMSkubGVuZ3RoKTt9CmlmKHRvLmNoPT1nZXRMaW5lKGNtLmRvYyx0by5saW5lKS50ZXh0Lmxlbmd0aCYmdG8ubGluZTxjbS5sYXN0TGluZSgpKQp7dG89UG9zKHRvLmxpbmUrMSwwKTt9CmlmKGZyb20ubGluZTxkaXNwbGF5LnZpZXdGcm9tfHx0by5saW5lPmRpc3BsYXkudmlld1RvLTEpe3JldHVybiBmYWxzZX0KdmFyIGZyb21JbmRleCxmcm9tTGluZSxmcm9tTm9kZTtpZihmcm9tLmxpbmU9PWRpc3BsYXkudmlld0Zyb218fChmcm9tSW5kZXg9ZmluZFZpZXdJbmRleChjbSxmcm9tLmxpbmUpKT09MCl7ZnJvbUxpbmU9bGluZU5vKGRpc3BsYXkudmlld1swXS5saW5lKTtmcm9tTm9kZT1kaXNwbGF5LnZpZXdbMF0ubm9kZTt9ZWxzZXtmcm9tTGluZT1saW5lTm8oZGlzcGxheS52aWV3W2Zyb21JbmRleF0ubGluZSk7ZnJvbU5vZGU9ZGlzcGxheS52aWV3W2Zyb21JbmRleC0xXS5ub2RlLm5leHRTaWJsaW5nO30KdmFyIHRvSW5kZXg9ZmluZFZpZXdJbmRleChjbSx0by5saW5lKTt2YXIgdG9MaW5lLHRvTm9kZTtpZih0b0luZGV4PT1kaXNwbGF5LnZpZXcubGVuZ3RoLTEpe3RvTGluZT1kaXNwbGF5LnZpZXdUby0xO3RvTm9kZT1kaXNwbGF5LmxpbmVEaXYubGFzdENoaWxkO31lbHNle3RvTGluZT1saW5lTm8oZGlzcGxheS52aWV3W3RvSW5kZXgrMV0ubGluZSktMTt0b05vZGU9ZGlzcGxheS52aWV3W3RvSW5kZXgrMV0ubm9kZS5wcmV2aW91c1NpYmxpbmc7fQppZighZnJvbU5vZGUpe3JldHVybiBmYWxzZX0KdmFyIG5ld1RleHQ9Y20uZG9jLnNwbGl0TGluZXMoZG9tVGV4dEJldHdlZW4oY20sZnJvbU5vZGUsdG9Ob2RlLGZyb21MaW5lLHRvTGluZSkpO3ZhciBvbGRUZXh0PWdldEJldHdlZW4oY20uZG9jLFBvcyhmcm9tTGluZSwwKSxQb3ModG9MaW5lLGdldExpbmUoY20uZG9jLHRvTGluZSkudGV4dC5sZW5ndGgpKTt3aGlsZShuZXdUZXh0Lmxlbmd0aD4xJiZvbGRUZXh0Lmxlbmd0aD4xKXtpZihsc3QobmV3VGV4dCk9PWxzdChvbGRUZXh0KSl7bmV3VGV4dC5wb3AoKTtvbGRUZXh0LnBvcCgpO3RvTGluZS0tO30KZWxzZSBpZihuZXdUZXh0WzBdPT1vbGRUZXh0WzBdKXtuZXdUZXh0LnNoaWZ0KCk7b2xkVGV4dC5zaGlmdCgpO2Zyb21MaW5lKys7fQplbHNle2JyZWFrfX0KdmFyIGN1dEZyb250PTAsY3V0RW5kPTA7dmFyIG5ld1RvcD1uZXdUZXh0WzBdLG9sZFRvcD1vbGRUZXh0WzBdLG1heEN1dEZyb250PU1hdGgubWluKG5ld1RvcC5sZW5ndGgsb2xkVG9wLmxlbmd0aCk7d2hpbGUoY3V0RnJvbnQ8bWF4Q3V0RnJvbnQmJm5ld1RvcC5jaGFyQ29kZUF0KGN1dEZyb250KT09b2xkVG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpKQp7KytjdXRGcm9udDt9CnZhciBuZXdCb3Q9bHN0KG5ld1RleHQpLG9sZEJvdD1sc3Qob2xkVGV4dCk7dmFyIG1heEN1dEVuZD1NYXRoLm1pbihuZXdCb3QubGVuZ3RoLShuZXdUZXh0Lmxlbmd0aD09MT9jdXRGcm9udDowKSxvbGRCb3QubGVuZ3RoLShvbGRUZXh0Lmxlbmd0aD09MT9jdXRGcm9udDowKSk7d2hpbGUoY3V0RW5kPG1heEN1dEVuZCYmbmV3Qm90LmNoYXJDb2RlQXQobmV3Qm90Lmxlbmd0aC1jdXRFbmQtMSk9PW9sZEJvdC5jaGFyQ29kZUF0KG9sZEJvdC5sZW5ndGgtY3V0RW5kLTEpKQp7KytjdXRFbmQ7fQppZihuZXdUZXh0Lmxlbmd0aD09MSYmb2xkVGV4dC5sZW5ndGg9PTEmJmZyb21MaW5lPT1mcm9tLmxpbmUpe3doaWxlKGN1dEZyb250JiZjdXRGcm9udD5mcm9tLmNoJiZuZXdCb3QuY2hhckNvZGVBdChuZXdCb3QubGVuZ3RoLWN1dEVuZC0xKT09b2xkQm90LmNoYXJDb2RlQXQob2xkQm90Lmxlbmd0aC1jdXRFbmQtMSkpe2N1dEZyb250LS07Y3V0RW5kKys7fX0KbmV3VGV4dFtuZXdUZXh0Lmxlbmd0aC0xXT1uZXdCb3Quc2xpY2UoMCxuZXdCb3QubGVuZ3RoLWN1dEVuZCkucmVwbGFjZSgvXlx1MjAwYisvLCIiKTtuZXdUZXh0WzBdPW5ld1RleHRbMF0uc2xpY2UoY3V0RnJvbnQpLnJlcGxhY2UoL1x1MjAwYiskLywiIik7dmFyIGNoRnJvbT1Qb3MoZnJvbUxpbmUsY3V0RnJvbnQpO3ZhciBjaFRvPVBvcyh0b0xpbmUsb2xkVGV4dC5sZW5ndGg/bHN0KG9sZFRleHQpLmxlbmd0aC1jdXRFbmQ6MCk7aWYobmV3VGV4dC5sZW5ndGg+MXx8bmV3VGV4dFswXXx8Y21wKGNoRnJvbSxjaFRvKSl7cmVwbGFjZVJhbmdlKGNtLmRvYyxuZXdUZXh0LGNoRnJvbSxjaFRvLCIraW5wdXQiKTtyZXR1cm4gdHJ1ZX19O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5lbnN1cmVQb2xsZWQ9ZnVuY3Rpb24oKXt0aGlzLmZvcmNlQ29tcG9zaXRpb25FbmQoKTt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuZm9yY2VDb21wb3NpdGlvbkVuZCgpO307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLmZvcmNlQ29tcG9zaXRpb25FbmQ9ZnVuY3Rpb24oKXtpZighdGhpcy5jb21wb3Npbmcpe3JldHVybn0KY2xlYXJUaW1lb3V0KHRoaXMucmVhZERPTVRpbWVvdXQpO3RoaXMuY29tcG9zaW5nPW51bGw7dGhpcy51cGRhdGVGcm9tRE9NKCk7dGhpcy5kaXYuYmx1cigpO3RoaXMuZGl2LmZvY3VzKCk7fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVhZEZyb21ET01Tb29uPWZ1bmN0aW9uKCl7dmFyIHRoaXMkMT10aGlzO2lmKHRoaXMucmVhZERPTVRpbWVvdXQhPW51bGwpe3JldHVybn0KdGhpcy5yZWFkRE9NVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcyQxLnJlYWRET01UaW1lb3V0PW51bGw7aWYodGhpcyQxLmNvbXBvc2luZyl7aWYodGhpcyQxLmNvbXBvc2luZy5kb25lKXt0aGlzJDEuY29tcG9zaW5nPW51bGw7fQplbHNle3JldHVybn19CnRoaXMkMS51cGRhdGVGcm9tRE9NKCk7fSw4MCk7fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUudXBkYXRlRnJvbURPTT1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpcztpZih0aGlzLmNtLmlzUmVhZE9ubHkoKXx8IXRoaXMucG9sbENvbnRlbnQoKSkKe3J1bkluT3AodGhpcy5jbSxmdW5jdGlvbigpe3JldHVybiByZWdDaGFuZ2UodGhpcyQxLmNtKTt9KTt9fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUuc2V0VW5lZGl0YWJsZT1mdW5jdGlvbihub2RlKXtub2RlLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiO307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24oZSl7aWYoZS5jaGFyQ29kZT09MCl7cmV0dXJufQplLnByZXZlbnREZWZhdWx0KCk7aWYoIXRoaXMuY20uaXNSZWFkT25seSgpKQp7b3BlcmF0aW9uKHRoaXMuY20sYXBwbHlUZXh0SW5wdXQpKHRoaXMuY20sU3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlPT1udWxsP2Uua2V5Q29kZTplLmNoYXJDb2RlKSwwKTt9fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUucmVhZE9ubHlDaGFuZ2VkPWZ1bmN0aW9uKHZhbCl7dGhpcy5kaXYuY29udGVudEVkaXRhYmxlPVN0cmluZyh2YWwhPSJub2N1cnNvciIpO307Q29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlLm9uQ29udGV4dE1lbnU9ZnVuY3Rpb24oKXt9O0NvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7fTtDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUubmVlZHNDb250ZW50QXR0cmlidXRlPXRydWU7ZnVuY3Rpb24gcG9zVG9ET00oY20scG9zKXt2YXIgdmlldz1maW5kVmlld0ZvckxpbmUoY20scG9zLmxpbmUpO2lmKCF2aWV3fHx2aWV3LmhpZGRlbil7cmV0dXJuIG51bGx9CnZhciBsaW5lPWdldExpbmUoY20uZG9jLHBvcy5saW5lKTt2YXIgaW5mbz1tYXBGcm9tTGluZVZpZXcodmlldyxsaW5lLHBvcy5saW5lKTt2YXIgb3JkZXI9Z2V0T3JkZXIobGluZSxjbS5kb2MuZGlyZWN0aW9uKSxzaWRlPSJsZWZ0IjtpZihvcmRlcil7dmFyIHBhcnRQb3M9Z2V0QmlkaVBhcnRBdChvcmRlcixwb3MuY2gpO3NpZGU9cGFydFBvcyUyPyJyaWdodCI6ImxlZnQiO30KdmFyIHJlc3VsdD1ub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKGluZm8ubWFwLHBvcy5jaCxzaWRlKTtyZXN1bHQub2Zmc2V0PXJlc3VsdC5jb2xsYXBzZT09InJpZ2h0Ij9yZXN1bHQuZW5kOnJlc3VsdC5zdGFydDtyZXR1cm4gcmVzdWx0fQpmdW5jdGlvbiBpc0luR3V0dGVyKG5vZGUpe2Zvcih2YXIgc2Nhbj1ub2RlO3NjYW47c2Nhbj1zY2FuLnBhcmVudE5vZGUpCntpZigvQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlci8udGVzdChzY2FuLmNsYXNzTmFtZSkpe3JldHVybiB0cnVlfX0KcmV0dXJuIGZhbHNlfQpmdW5jdGlvbiBiYWRQb3MocG9zLGJhZCl7aWYoYmFkKXtwb3MuYmFkPXRydWU7fXJldHVybiBwb3N9CmZ1bmN0aW9uIGRvbVRleHRCZXR3ZWVuKGNtLGZyb20sdG8sZnJvbUxpbmUsdG9MaW5lKXt2YXIgdGV4dD0iIixjbG9zaW5nPWZhbHNlLGxpbmVTZXA9Y20uZG9jLmxpbmVTZXBhcmF0b3IoKTtmdW5jdGlvbiByZWNvZ25pemVNYXJrZXIoaWQpe3JldHVybiBmdW5jdGlvbihtYXJrZXIpe3JldHVybiBtYXJrZXIuaWQ9PWlkO319CmZ1bmN0aW9uIGNsb3NlKCl7aWYoY2xvc2luZyl7dGV4dCs9bGluZVNlcDtjbG9zaW5nPWZhbHNlO319CmZ1bmN0aW9uIGFkZFRleHQoc3RyKXtpZihzdHIpe2Nsb3NlKCk7dGV4dCs9c3RyO319CmZ1bmN0aW9uIHdhbGsobm9kZSl7aWYobm9kZS5ub2RlVHlwZT09MSl7dmFyIGNtVGV4dD1ub2RlLmdldEF0dHJpYnV0ZSgiY20tdGV4dCIpO2lmKGNtVGV4dCE9bnVsbCl7YWRkVGV4dChjbVRleHR8fG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSgvXHUyMDBiL2csIiIpKTtyZXR1cm59CnZhciBtYXJrZXJJRD1ub2RlLmdldEF0dHJpYnV0ZSgiY20tbWFya2VyIikscmFuZ2UkJDE7aWYobWFya2VySUQpe3ZhciBmb3VuZD1jbS5maW5kTWFya3MoUG9zKGZyb21MaW5lLDApLFBvcyh0b0xpbmUrMSwwKSxyZWNvZ25pemVNYXJrZXIoK21hcmtlcklEKSk7aWYoZm91bmQubGVuZ3RoJiYocmFuZ2UkJDE9Zm91bmRbMF0uZmluZCgwKSkpCnthZGRUZXh0KGdldEJldHdlZW4oY20uZG9jLHJhbmdlJCQxLmZyb20scmFuZ2UkJDEudG8pLmpvaW4obGluZVNlcCkpO30KcmV0dXJufQppZihub2RlLmdldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIik9PSJmYWxzZSIpe3JldHVybn0KdmFyIGlzQmxvY2s9L14ocHJlfGRpdnxwKSQvaS50ZXN0KG5vZGUubm9kZU5hbWUpO2lmKGlzQmxvY2spe2Nsb3NlKCk7fQpmb3IodmFyIGk9MDtpPG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7aSsrKQp7d2Fsayhub2RlLmNoaWxkTm9kZXNbaV0pO30KaWYoaXNCbG9jayl7Y2xvc2luZz10cnVlO319ZWxzZSBpZihub2RlLm5vZGVUeXBlPT0zKXthZGRUZXh0KG5vZGUubm9kZVZhbHVlKTt9fQpmb3IoOzspe3dhbGsoZnJvbSk7aWYoZnJvbT09dG8pe2JyZWFrfQpmcm9tPWZyb20ubmV4dFNpYmxpbmc7fQpyZXR1cm4gdGV4dH0KZnVuY3Rpb24gZG9tVG9Qb3MoY20sbm9kZSxvZmZzZXQpe3ZhciBsaW5lTm9kZTtpZihub2RlPT1jbS5kaXNwbGF5LmxpbmVEaXYpe2xpbmVOb2RlPWNtLmRpc3BsYXkubGluZURpdi5jaGlsZE5vZGVzW29mZnNldF07aWYoIWxpbmVOb2RlKXtyZXR1cm4gYmFkUG9zKGNtLmNsaXBQb3MoUG9zKGNtLmRpc3BsYXkudmlld1RvLTEpKSx0cnVlKX0Kbm9kZT1udWxsO29mZnNldD0wO31lbHNle2ZvcihsaW5lTm9kZT1ub2RlOztsaW5lTm9kZT1saW5lTm9kZS5wYXJlbnROb2RlKXtpZighbGluZU5vZGV8fGxpbmVOb2RlPT1jbS5kaXNwbGF5LmxpbmVEaXYpe3JldHVybiBudWxsfQppZihsaW5lTm9kZS5wYXJlbnROb2RlJiZsaW5lTm9kZS5wYXJlbnROb2RlPT1jbS5kaXNwbGF5LmxpbmVEaXYpe2JyZWFrfX19CmZvcih2YXIgaT0wO2k8Y20uZGlzcGxheS52aWV3Lmxlbmd0aDtpKyspe3ZhciBsaW5lVmlldz1jbS5kaXNwbGF5LnZpZXdbaV07aWYobGluZVZpZXcubm9kZT09bGluZU5vZGUpCntyZXR1cm4gbG9jYXRlTm9kZUluTGluZVZpZXcobGluZVZpZXcsbm9kZSxvZmZzZXQpfX19CmZ1bmN0aW9uIGxvY2F0ZU5vZGVJbkxpbmVWaWV3KGxpbmVWaWV3LG5vZGUsb2Zmc2V0KXt2YXIgd3JhcHBlcj1saW5lVmlldy50ZXh0LmZpcnN0Q2hpbGQsYmFkPWZhbHNlO2lmKCFub2RlfHwhY29udGFpbnMod3JhcHBlcixub2RlKSl7cmV0dXJuIGJhZFBvcyhQb3MobGluZU5vKGxpbmVWaWV3LmxpbmUpLDApLHRydWUpfQppZihub2RlPT13cmFwcGVyKXtiYWQ9dHJ1ZTtub2RlPXdyYXBwZXIuY2hpbGROb2Rlc1tvZmZzZXRdO29mZnNldD0wO2lmKCFub2RlKXt2YXIgbGluZT1saW5lVmlldy5yZXN0P2xzdChsaW5lVmlldy5yZXN0KTpsaW5lVmlldy5saW5lO3JldHVybiBiYWRQb3MoUG9zKGxpbmVObyhsaW5lKSxsaW5lLnRleHQubGVuZ3RoKSxiYWQpfX0KdmFyIHRleHROb2RlPW5vZGUubm9kZVR5cGU9PTM/bm9kZTpudWxsLHRvcE5vZGU9bm9kZTtpZighdGV4dE5vZGUmJm5vZGUuY2hpbGROb2Rlcy5sZW5ndGg9PTEmJm5vZGUuZmlyc3RDaGlsZC5ub2RlVHlwZT09Myl7dGV4dE5vZGU9bm9kZS5maXJzdENoaWxkO2lmKG9mZnNldCl7b2Zmc2V0PXRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGg7fX0Kd2hpbGUodG9wTm9kZS5wYXJlbnROb2RlIT13cmFwcGVyKXt0b3BOb2RlPXRvcE5vZGUucGFyZW50Tm9kZTt9CnZhciBtZWFzdXJlPWxpbmVWaWV3Lm1lYXN1cmUsbWFwcz1tZWFzdXJlLm1hcHM7ZnVuY3Rpb24gZmluZCh0ZXh0Tm9kZSx0b3BOb2RlLG9mZnNldCl7Zm9yKHZhciBpPS0xO2k8KG1hcHM/bWFwcy5sZW5ndGg6MCk7aSsrKXt2YXIgbWFwJCQxPWk8MD9tZWFzdXJlLm1hcDptYXBzW2ldO2Zvcih2YXIgaj0wO2o8bWFwJCQxLmxlbmd0aDtqKz0zKXt2YXIgY3VyTm9kZT1tYXAkJDFbaisyXTtpZihjdXJOb2RlPT10ZXh0Tm9kZXx8Y3VyTm9kZT09dG9wTm9kZSl7dmFyIGxpbmU9bGluZU5vKGk8MD9saW5lVmlldy5saW5lOmxpbmVWaWV3LnJlc3RbaV0pO3ZhciBjaD1tYXAkJDFbal0rb2Zmc2V0O2lmKG9mZnNldDwwfHxjdXJOb2RlIT10ZXh0Tm9kZSl7Y2g9bWFwJCQxW2orKG9mZnNldD8xOjApXTt9CnJldHVybiBQb3MobGluZSxjaCl9fX19CnZhciBmb3VuZD1maW5kKHRleHROb2RlLHRvcE5vZGUsb2Zmc2V0KTtpZihmb3VuZCl7cmV0dXJuIGJhZFBvcyhmb3VuZCxiYWQpfQpmb3IodmFyIGFmdGVyPXRvcE5vZGUubmV4dFNpYmxpbmcsZGlzdD10ZXh0Tm9kZT90ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoLW9mZnNldDowO2FmdGVyO2FmdGVyPWFmdGVyLm5leHRTaWJsaW5nKXtmb3VuZD1maW5kKGFmdGVyLGFmdGVyLmZpcnN0Q2hpbGQsMCk7aWYoZm91bmQpCntyZXR1cm4gYmFkUG9zKFBvcyhmb3VuZC5saW5lLGZvdW5kLmNoLWRpc3QpLGJhZCl9CmVsc2UKe2Rpc3QrPWFmdGVyLnRleHRDb250ZW50Lmxlbmd0aDt9fQpmb3IodmFyIGJlZm9yZT10b3BOb2RlLnByZXZpb3VzU2libGluZyxkaXN0JDE9b2Zmc2V0O2JlZm9yZTtiZWZvcmU9YmVmb3JlLnByZXZpb3VzU2libGluZyl7Zm91bmQ9ZmluZChiZWZvcmUsYmVmb3JlLmZpcnN0Q2hpbGQsLTEpO2lmKGZvdW5kKQp7cmV0dXJuIGJhZFBvcyhQb3MoZm91bmQubGluZSxmb3VuZC5jaCtkaXN0JDEpLGJhZCl9CmVsc2UKe2Rpc3QkMSs9YmVmb3JlLnRleHRDb250ZW50Lmxlbmd0aDt9fX0KdmFyIFRleHRhcmVhSW5wdXQ9ZnVuY3Rpb24oY20pe3RoaXMuY209Y207dGhpcy5wcmV2SW5wdXQ9IiI7dGhpcy5wb2xsaW5nRmFzdD1mYWxzZTt0aGlzLnBvbGxpbmc9bmV3IERlbGF5ZWQoKTt0aGlzLmhhc1NlbGVjdGlvbj1mYWxzZTt0aGlzLmNvbXBvc2luZz1udWxsO307VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihkaXNwbGF5KXt2YXIgdGhpcyQxPXRoaXM7dmFyIGlucHV0PXRoaXMsY209dGhpcy5jbTt2YXIgZGl2PXRoaXMud3JhcHBlcj1oaWRkZW5UZXh0YXJlYSgpO3ZhciB0ZT10aGlzLnRleHRhcmVhPWRpdi5maXJzdENoaWxkO2Rpc3BsYXkud3JhcHBlci5pbnNlcnRCZWZvcmUoZGl2LGRpc3BsYXkud3JhcHBlci5maXJzdENoaWxkKTtpZihpb3Mpe3RlLnN0eWxlLndpZHRoPSIwcHgiO30Kb24odGUsImlucHV0IixmdW5jdGlvbigpe2lmKGllJiZpZV92ZXJzaW9uPj05JiZ0aGlzJDEuaGFzU2VsZWN0aW9uKXt0aGlzJDEuaGFzU2VsZWN0aW9uPW51bGw7fQppbnB1dC5wb2xsKCk7fSk7b24odGUsInBhc3RlIixmdW5jdGlvbihlKXtpZihzaWduYWxET01FdmVudChjbSxlKXx8aGFuZGxlUGFzdGUoZSxjbSkpe3JldHVybn0KY20uc3RhdGUucGFzdGVJbmNvbWluZz10cnVlO2lucHV0LmZhc3RQb2xsKCk7fSk7ZnVuY3Rpb24gcHJlcGFyZUNvcHlDdXQoZSl7aWYoc2lnbmFsRE9NRXZlbnQoY20sZSkpe3JldHVybn0KaWYoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSl7c2V0TGFzdENvcGllZCh7bGluZVdpc2U6ZmFsc2UsdGV4dDpjbS5nZXRTZWxlY3Rpb25zKCl9KTt9ZWxzZSBpZighY20ub3B0aW9ucy5saW5lV2lzZUNvcHlDdXQpe3JldHVybn1lbHNle3ZhciByYW5nZXM9Y29weWFibGVSYW5nZXMoY20pO3NldExhc3RDb3BpZWQoe2xpbmVXaXNlOnRydWUsdGV4dDpyYW5nZXMudGV4dH0pO2lmKGUudHlwZT09ImN1dCIpe2NtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcyxudWxsLHNlbF9kb250U2Nyb2xsKTt9ZWxzZXtpbnB1dC5wcmV2SW5wdXQ9IiI7dGUudmFsdWU9cmFuZ2VzLnRleHQuam9pbigiXG4iKTtzZWxlY3RJbnB1dCh0ZSk7fX0KaWYoZS50eXBlPT0iY3V0Iil7Y20uc3RhdGUuY3V0SW5jb21pbmc9dHJ1ZTt9fQpvbih0ZSwiY3V0IixwcmVwYXJlQ29weUN1dCk7b24odGUsImNvcHkiLHByZXBhcmVDb3B5Q3V0KTtvbihkaXNwbGF5LnNjcm9sbGVyLCJwYXN0ZSIsZnVuY3Rpb24oZSl7aWYoZXZlbnRJbldpZGdldChkaXNwbGF5LGUpfHxzaWduYWxET01FdmVudChjbSxlKSl7cmV0dXJufQpjbS5zdGF0ZS5wYXN0ZUluY29taW5nPXRydWU7aW5wdXQuZm9jdXMoKTt9KTtvbihkaXNwbGF5LmxpbmVTcGFjZSwic2VsZWN0c3RhcnQiLGZ1bmN0aW9uKGUpe2lmKCFldmVudEluV2lkZ2V0KGRpc3BsYXksZSkpe2VfcHJldmVudERlZmF1bHQoZSk7fX0pO29uKHRlLCJjb21wb3NpdGlvbnN0YXJ0IixmdW5jdGlvbigpe3ZhciBzdGFydD1jbS5nZXRDdXJzb3IoImZyb20iKTtpZihpbnB1dC5jb21wb3Npbmcpe2lucHV0LmNvbXBvc2luZy5yYW5nZS5jbGVhcigpO30KaW5wdXQuY29tcG9zaW5nPXtzdGFydDpzdGFydCxyYW5nZTpjbS5tYXJrVGV4dChzdGFydCxjbS5nZXRDdXJzb3IoInRvIikse2NsYXNzTmFtZToiQ29kZU1pcnJvci1jb21wb3NpbmcifSl9O30pO29uKHRlLCJjb21wb3NpdGlvbmVuZCIsZnVuY3Rpb24oKXtpZihpbnB1dC5jb21wb3Npbmcpe2lucHV0LnBvbGwoKTtpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKTtpbnB1dC5jb21wb3Npbmc9bnVsbDt9fSk7fTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5wcmVwYXJlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGNtPXRoaXMuY20sZGlzcGxheT1jbS5kaXNwbGF5LGRvYz1jbS5kb2M7dmFyIHJlc3VsdD1wcmVwYXJlU2VsZWN0aW9uKGNtKTtpZihjbS5vcHRpb25zLm1vdmVJbnB1dFdpdGhDdXJzb3Ipe3ZhciBoZWFkUG9zPWN1cnNvckNvb3JkcyhjbSxkb2Muc2VsLnByaW1hcnkoKS5oZWFkLCJkaXYiKTt2YXIgd3JhcE9mZj1kaXNwbGF5LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbGluZU9mZj1kaXNwbGF5LmxpbmVEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmVzdWx0LnRlVG9wPU1hdGgubWF4KDAsTWF0aC5taW4oZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodC0xMCxoZWFkUG9zLnRvcCtsaW5lT2ZmLnRvcC13cmFwT2ZmLnRvcCkpO3Jlc3VsdC50ZUxlZnQ9TWF0aC5tYXgoMCxNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGgtMTAsaGVhZFBvcy5sZWZ0K2xpbmVPZmYubGVmdC13cmFwT2ZmLmxlZnQpKTt9CnJldHVybiByZXN1bHR9O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLnNob3dTZWxlY3Rpb249ZnVuY3Rpb24oZHJhd24pe3ZhciBjbT10aGlzLmNtLGRpc3BsYXk9Y20uZGlzcGxheTtyZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5LmN1cnNvckRpdixkcmF3bi5jdXJzb3JzKTtyZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5LnNlbGVjdGlvbkRpdixkcmF3bi5zZWxlY3Rpb24pO2lmKGRyYXduLnRlVG9wIT1udWxsKXt0aGlzLndyYXBwZXIuc3R5bGUudG9wPWRyYXduLnRlVG9wKyJweCI7dGhpcy53cmFwcGVyLnN0eWxlLmxlZnQ9ZHJhd24udGVMZWZ0KyJweCI7fX07VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24odHlwaW5nKXtpZih0aGlzLmNvbnRleHRNZW51UGVuZGluZ3x8dGhpcy5jb21wb3Npbmcpe3JldHVybn0KdmFyIGNtPXRoaXMuY207aWYoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSl7dGhpcy5wcmV2SW5wdXQ9IiI7dmFyIGNvbnRlbnQ9Y20uZ2V0U2VsZWN0aW9uKCk7dGhpcy50ZXh0YXJlYS52YWx1ZT1jb250ZW50O2lmKGNtLnN0YXRlLmZvY3VzZWQpe3NlbGVjdElucHV0KHRoaXMudGV4dGFyZWEpO30KaWYoaWUmJmllX3ZlcnNpb24+PTkpe3RoaXMuaGFzU2VsZWN0aW9uPWNvbnRlbnQ7fX1lbHNlIGlmKCF0eXBpbmcpe3RoaXMucHJldklucHV0PXRoaXMudGV4dGFyZWEudmFsdWU9IiI7aWYoaWUmJmllX3ZlcnNpb24+PTkpe3RoaXMuaGFzU2VsZWN0aW9uPW51bGw7fX19O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLmdldEZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dGFyZWF9O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLnN1cHBvcnRzVG91Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7aWYodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5IT0ibm9jdXJzb3IiJiYoIW1vYmlsZXx8YWN0aXZlRWx0KCkhPXRoaXMudGV4dGFyZWEpKXt0cnl7dGhpcy50ZXh0YXJlYS5mb2N1cygpO30KY2F0Y2goZSl7fX19O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLmJsdXI9ZnVuY3Rpb24oKXt0aGlzLnRleHRhcmVhLmJsdXIoKTt9O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlc2V0UG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLndyYXBwZXIuc3R5bGUudG9wPXRoaXMud3JhcHBlci5zdHlsZS5sZWZ0PTA7fTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5yZWNlaXZlZEZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5zbG93UG9sbCgpO307VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc2xvd1BvbGw9ZnVuY3Rpb24oKXt2YXIgdGhpcyQxPXRoaXM7aWYodGhpcy5wb2xsaW5nRmFzdCl7cmV0dXJufQp0aGlzLnBvbGxpbmcuc2V0KHRoaXMuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsZnVuY3Rpb24oKXt0aGlzJDEucG9sbCgpO2lmKHRoaXMkMS5jbS5zdGF0ZS5mb2N1c2VkKXt0aGlzJDEuc2xvd1BvbGwoKTt9fSk7fTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5mYXN0UG9sbD1mdW5jdGlvbigpe3ZhciBtaXNzZWQ9ZmFsc2UsaW5wdXQ9dGhpcztpbnB1dC5wb2xsaW5nRmFzdD10cnVlO2Z1bmN0aW9uIHAoKXt2YXIgY2hhbmdlZD1pbnB1dC5wb2xsKCk7aWYoIWNoYW5nZWQmJiFtaXNzZWQpe21pc3NlZD10cnVlO2lucHV0LnBvbGxpbmcuc2V0KDYwLHApO30KZWxzZXtpbnB1dC5wb2xsaW5nRmFzdD1mYWxzZTtpbnB1dC5zbG93UG9sbCgpO319CmlucHV0LnBvbGxpbmcuc2V0KDIwLHApO307VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUucG9sbD1mdW5jdGlvbigpe3ZhciB0aGlzJDE9dGhpczt2YXIgY209dGhpcy5jbSxpbnB1dD10aGlzLnRleHRhcmVhLHByZXZJbnB1dD10aGlzLnByZXZJbnB1dDtpZih0aGlzLmNvbnRleHRNZW51UGVuZGluZ3x8IWNtLnN0YXRlLmZvY3VzZWR8fChoYXNTZWxlY3Rpb24oaW5wdXQpJiYhcHJldklucHV0JiYhdGhpcy5jb21wb3NpbmcpfHxjbS5pc1JlYWRPbmx5KCl8fGNtLm9wdGlvbnMuZGlzYWJsZUlucHV0fHxjbS5zdGF0ZS5rZXlTZXEpCntyZXR1cm4gZmFsc2V9CnZhciB0ZXh0PWlucHV0LnZhbHVlO2lmKHRleHQ9PXByZXZJbnB1dCYmIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpe3JldHVybiBmYWxzZX0KaWYoaWUmJmllX3ZlcnNpb24+PTkmJnRoaXMuaGFzU2VsZWN0aW9uPT09dGV4dHx8bWFjJiYvW1x1ZjcwMC1cdWY3ZmZdLy50ZXN0KHRleHQpKXtjbS5kaXNwbGF5LmlucHV0LnJlc2V0KCk7cmV0dXJuIGZhbHNlfQppZihjbS5kb2Muc2VsPT1jbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51KXt2YXIgZmlyc3Q9dGV4dC5jaGFyQ29kZUF0KDApO2lmKGZpcnN0PT0weDIwMGImJiFwcmV2SW5wdXQpe3ByZXZJbnB1dD0iXHUyMDBiIjt9CmlmKGZpcnN0PT0weDIxZGEpe3RoaXMucmVzZXQoKTtyZXR1cm4gdGhpcy5jbS5leGVjQ29tbWFuZCgidW5kbyIpfX0KdmFyIHNhbWU9MCxsPU1hdGgubWluKHByZXZJbnB1dC5sZW5ndGgsdGV4dC5sZW5ndGgpO3doaWxlKHNhbWU8bCYmcHJldklucHV0LmNoYXJDb2RlQXQoc2FtZSk9PXRleHQuY2hhckNvZGVBdChzYW1lKSl7KytzYW1lO30KcnVuSW5PcChjbSxmdW5jdGlvbigpe2FwcGx5VGV4dElucHV0KGNtLHRleHQuc2xpY2Uoc2FtZSkscHJldklucHV0Lmxlbmd0aC1zYW1lLG51bGwsdGhpcyQxLmNvbXBvc2luZz8iKmNvbXBvc2UiOm51bGwpO2lmKHRleHQubGVuZ3RoPjEwMDB8fHRleHQuaW5kZXhPZigiXG4iKT4tMSl7aW5wdXQudmFsdWU9dGhpcyQxLnByZXZJbnB1dD0iIjt9CmVsc2V7dGhpcyQxLnByZXZJbnB1dD10ZXh0O30KaWYodGhpcyQxLmNvbXBvc2luZyl7dGhpcyQxLmNvbXBvc2luZy5yYW5nZS5jbGVhcigpO3RoaXMkMS5jb21wb3NpbmcucmFuZ2U9Y20ubWFya1RleHQodGhpcyQxLmNvbXBvc2luZy5zdGFydCxjbS5nZXRDdXJzb3IoInRvIikse2NsYXNzTmFtZToiQ29kZU1pcnJvci1jb21wb3NpbmcifSk7fX0pO3JldHVybiB0cnVlfTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5lbnN1cmVQb2xsZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvbGxpbmdGYXN0JiZ0aGlzLnBvbGwoKSl7dGhpcy5wb2xsaW5nRmFzdD1mYWxzZTt9fTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5vbktleVByZXNzPWZ1bmN0aW9uKCl7aWYoaWUmJmllX3ZlcnNpb24+PTkpe3RoaXMuaGFzU2VsZWN0aW9uPW51bGw7fQp0aGlzLmZhc3RQb2xsKCk7fTtUZXh0YXJlYUlucHV0LnByb3RvdHlwZS5vbkNvbnRleHRNZW51PWZ1bmN0aW9uKGUpe3ZhciBpbnB1dD10aGlzLGNtPWlucHV0LmNtLGRpc3BsYXk9Y20uZGlzcGxheSx0ZT1pbnB1dC50ZXh0YXJlYTt2YXIgcG9zPXBvc0Zyb21Nb3VzZShjbSxlKSxzY3JvbGxQb3M9ZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7aWYoIXBvc3x8cHJlc3RvKXtyZXR1cm59CnZhciByZXNldD1jbS5vcHRpb25zLnJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudTtpZihyZXNldCYmY20uZG9jLnNlbC5jb250YWlucyhwb3MpPT0tMSkKe29wZXJhdGlvbihjbSxzZXRTZWxlY3Rpb24pKGNtLmRvYyxzaW1wbGVTZWxlY3Rpb24ocG9zKSxzZWxfZG9udFNjcm9sbCk7fQp2YXIgb2xkQ1NTPXRlLnN0eWxlLmNzc1RleHQsb2xkV3JhcHBlckNTUz1pbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQ7aW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGUiO3ZhciB3cmFwcGVyQm94PWlucHV0LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4O1xuICAgICAgdG9wOiAiKyhlLmNsaWVudFktd3JhcHBlckJveC50b3AtNSkrInB4OyBsZWZ0OiAiKyhlLmNsaWVudFgtd3JhcHBlckJveC5sZWZ0LTUpKyJweDtcbiAgICAgIHotaW5kZXg6IDEwMDA7IGJhY2tncm91bmQ6ICIrKGllPyJyZ2JhKDI1NSwgMjU1LCAyNTUsIC4wNSkiOiJ0cmFuc3BhcmVudCIpKyI7XG4gICAgICBvdXRsaW5lOiBub25lOyBib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpOyI7dmFyIG9sZFNjcm9sbFk7aWYod2Via2l0KXtvbGRTY3JvbGxZPXdpbmRvdy5zY3JvbGxZO30KZGlzcGxheS5pbnB1dC5mb2N1cygpO2lmKHdlYmtpdCl7d2luZG93LnNjcm9sbFRvKG51bGwsb2xkU2Nyb2xsWSk7fQpkaXNwbGF5LmlucHV0LnJlc2V0KCk7aWYoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpe3RlLnZhbHVlPWlucHV0LnByZXZJbnB1dD0iICI7fQppbnB1dC5jb250ZXh0TWVudVBlbmRpbmc9dHJ1ZTtkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51PWNtLmRvYy5zZWw7Y2xlYXJUaW1lb3V0KGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsKTtmdW5jdGlvbiBwcmVwYXJlU2VsZWN0QWxsSGFjaygpe2lmKHRlLnNlbGVjdGlvblN0YXJ0IT1udWxsKXt2YXIgc2VsZWN0ZWQ9Y20uc29tZXRoaW5nU2VsZWN0ZWQoKTt2YXIgZXh0dmFsPSJcdTIwMGIiKyhzZWxlY3RlZD90ZS52YWx1ZToiIik7dGUudmFsdWU9Ilx1MjFkYSI7dGUudmFsdWU9ZXh0dmFsO2lucHV0LnByZXZJbnB1dD1zZWxlY3RlZD8iIjoiXHUyMDBiIjt0ZS5zZWxlY3Rpb25TdGFydD0xO3RlLnNlbGVjdGlvbkVuZD1leHR2YWwubGVuZ3RoO2Rpc3BsYXkuc2VsRm9yQ29udGV4dE1lbnU9Y20uZG9jLnNlbDt9fQpmdW5jdGlvbiByZWhpZGUoKXtpbnB1dC5jb250ZXh0TWVudVBlbmRpbmc9ZmFsc2U7aW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0PW9sZFdyYXBwZXJDU1M7dGUuc3R5bGUuY3NzVGV4dD1vbGRDU1M7aWYoaWUmJmllX3ZlcnNpb248OSl7ZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcD1zY3JvbGxQb3MpO30KaWYodGUuc2VsZWN0aW9uU3RhcnQhPW51bGwpe2lmKCFpZXx8KGllJiZpZV92ZXJzaW9uPDkpKXtwcmVwYXJlU2VsZWN0QWxsSGFjaygpO30KdmFyIGk9MCxwb2xsPWZ1bmN0aW9uKCl7aWYoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudT09Y20uZG9jLnNlbCYmdGUuc2VsZWN0aW9uU3RhcnQ9PTAmJnRlLnNlbGVjdGlvbkVuZD4wJiZpbnB1dC5wcmV2SW5wdXQ9PSJcdTIwMGIiKXtvcGVyYXRpb24oY20sc2VsZWN0QWxsKShjbSk7fWVsc2UgaWYoaSsrPDEwKXtkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbD1zZXRUaW1lb3V0KHBvbGwsNTAwKTt9ZWxzZXtkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51PW51bGw7ZGlzcGxheS5pbnB1dC5yZXNldCgpO319O2Rpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsPXNldFRpbWVvdXQocG9sbCwyMDApO319CmlmKGllJiZpZV92ZXJzaW9uPj05KXtwcmVwYXJlU2VsZWN0QWxsSGFjaygpO30KaWYoY2FwdHVyZVJpZ2h0Q2xpY2spe2Vfc3RvcChlKTt2YXIgbW91c2V1cD1mdW5jdGlvbigpe29mZih3aW5kb3csIm1vdXNldXAiLG1vdXNldXApO3NldFRpbWVvdXQocmVoaWRlLDIwKTt9O29uKHdpbmRvdywibW91c2V1cCIsbW91c2V1cCk7fWVsc2V7c2V0VGltZW91dChyZWhpZGUsNTApO319O1RleHRhcmVhSW5wdXQucHJvdG90eXBlLnJlYWRPbmx5Q2hhbmdlZD1mdW5jdGlvbih2YWwpe2lmKCF2YWwpe3RoaXMucmVzZXQoKTt9CnRoaXMudGV4dGFyZWEuZGlzYWJsZWQ9dmFsPT0ibm9jdXJzb3IiO307VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUuc2V0VW5lZGl0YWJsZT1mdW5jdGlvbigpe307VGV4dGFyZWFJbnB1dC5wcm90b3R5cGUubmVlZHNDb250ZW50QXR0cmlidXRlPWZhbHNlO2Z1bmN0aW9uIGZyb21UZXh0QXJlYSh0ZXh0YXJlYSxvcHRpb25zKXtvcHRpb25zPW9wdGlvbnM/Y29weU9iaihvcHRpb25zKTp7fTtvcHRpb25zLnZhbHVlPXRleHRhcmVhLnZhbHVlO2lmKCFvcHRpb25zLnRhYmluZGV4JiZ0ZXh0YXJlYS50YWJJbmRleCkKe29wdGlvbnMudGFiaW5kZXg9dGV4dGFyZWEudGFiSW5kZXg7fQppZighb3B0aW9ucy5wbGFjZWhvbGRlciYmdGV4dGFyZWEucGxhY2Vob2xkZXIpCntvcHRpb25zLnBsYWNlaG9sZGVyPXRleHRhcmVhLnBsYWNlaG9sZGVyO30KaWYob3B0aW9ucy5hdXRvZm9jdXM9PW51bGwpe3ZhciBoYXNGb2N1cz1hY3RpdmVFbHQoKTtvcHRpb25zLmF1dG9mb2N1cz1oYXNGb2N1cz09dGV4dGFyZWF8fHRleHRhcmVhLmdldEF0dHJpYnV0ZSgiYXV0b2ZvY3VzIikhPW51bGwmJmhhc0ZvY3VzPT1kb2N1bWVudC5ib2R5O30KZnVuY3Rpb24gc2F2ZSgpe3RleHRhcmVhLnZhbHVlPWNtLmdldFZhbHVlKCk7fQp2YXIgcmVhbFN1Ym1pdDtpZih0ZXh0YXJlYS5mb3JtKXtvbih0ZXh0YXJlYS5mb3JtLCJzdWJtaXQiLHNhdmUpO2lmKCFvcHRpb25zLmxlYXZlU3VibWl0TWV0aG9kQWxvbmUpe3ZhciBmb3JtPXRleHRhcmVhLmZvcm07cmVhbFN1Ym1pdD1mb3JtLnN1Ym1pdDt0cnl7dmFyIHdyYXBwZWRTdWJtaXQ9Zm9ybS5zdWJtaXQ9ZnVuY3Rpb24oKXtzYXZlKCk7Zm9ybS5zdWJtaXQ9cmVhbFN1Ym1pdDtmb3JtLnN1Ym1pdCgpO2Zvcm0uc3VibWl0PXdyYXBwZWRTdWJtaXQ7fTt9Y2F0Y2goZSl7fX19Cm9wdGlvbnMuZmluaXNoSW5pdD1mdW5jdGlvbihjbSl7Y20uc2F2ZT1zYXZlO2NtLmdldFRleHRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRleHRhcmVhO307Y20udG9UZXh0QXJlYT1mdW5jdGlvbigpe2NtLnRvVGV4dEFyZWE9aXNOYU47c2F2ZSgpO3RleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGV4dGFyZWEuc3R5bGUuZGlzcGxheT0iIjtpZih0ZXh0YXJlYS5mb3JtKXtvZmYodGV4dGFyZWEuZm9ybSwic3VibWl0IixzYXZlKTtpZih0eXBlb2YgdGV4dGFyZWEuZm9ybS5zdWJtaXQ9PSJmdW5jdGlvbiIpCnt0ZXh0YXJlYS5mb3JtLnN1Ym1pdD1yZWFsU3VibWl0O319fTt9O3RleHRhcmVhLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3ZhciBjbT1Db2RlTWlycm9yJDEoZnVuY3Rpb24obm9kZSl7cmV0dXJuIHRleHRhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsdGV4dGFyZWEubmV4dFNpYmxpbmcpO30sb3B0aW9ucyk7cmV0dXJuIGNtfQpmdW5jdGlvbiBhZGRMZWdhY3lQcm9wcyhDb2RlTWlycm9yKXtDb2RlTWlycm9yLm9mZj1vZmY7Q29kZU1pcnJvci5vbj1vbjtDb2RlTWlycm9yLndoZWVsRXZlbnRQaXhlbHM9d2hlZWxFdmVudFBpeGVscztDb2RlTWlycm9yLkRvYz1Eb2M7Q29kZU1pcnJvci5zcGxpdExpbmVzPXNwbGl0TGluZXNBdXRvO0NvZGVNaXJyb3IuY291bnRDb2x1bW49Y291bnRDb2x1bW47Q29kZU1pcnJvci5maW5kQ29sdW1uPWZpbmRDb2x1bW47Q29kZU1pcnJvci5pc1dvcmRDaGFyPWlzV29yZENoYXJCYXNpYztDb2RlTWlycm9yLlBhc3M9UGFzcztDb2RlTWlycm9yLnNpZ25hbD1zaWduYWw7Q29kZU1pcnJvci5MaW5lPUxpbmU7Q29kZU1pcnJvci5jaGFuZ2VFbmQ9Y2hhbmdlRW5kO0NvZGVNaXJyb3Iuc2Nyb2xsYmFyTW9kZWw9c2Nyb2xsYmFyTW9kZWw7Q29kZU1pcnJvci5Qb3M9UG9zO0NvZGVNaXJyb3IuY21wUG9zPWNtcDtDb2RlTWlycm9yLm1vZGVzPW1vZGVzO0NvZGVNaXJyb3IubWltZU1vZGVzPW1pbWVNb2RlcztDb2RlTWlycm9yLnJlc29sdmVNb2RlPXJlc29sdmVNb2RlO0NvZGVNaXJyb3IuZ2V0TW9kZT1nZXRNb2RlO0NvZGVNaXJyb3IubW9kZUV4dGVuc2lvbnM9bW9kZUV4dGVuc2lvbnM7Q29kZU1pcnJvci5leHRlbmRNb2RlPWV4dGVuZE1vZGU7Q29kZU1pcnJvci5jb3B5U3RhdGU9Y29weVN0YXRlO0NvZGVNaXJyb3Iuc3RhcnRTdGF0ZT1zdGFydFN0YXRlO0NvZGVNaXJyb3IuaW5uZXJNb2RlPWlubmVyTW9kZTtDb2RlTWlycm9yLmNvbW1hbmRzPWNvbW1hbmRzO0NvZGVNaXJyb3Iua2V5TWFwPWtleU1hcDtDb2RlTWlycm9yLmtleU5hbWU9a2V5TmFtZTtDb2RlTWlycm9yLmlzTW9kaWZpZXJLZXk9aXNNb2RpZmllcktleTtDb2RlTWlycm9yLmxvb2t1cEtleT1sb29rdXBLZXk7Q29kZU1pcnJvci5ub3JtYWxpemVLZXlNYXA9bm9ybWFsaXplS2V5TWFwO0NvZGVNaXJyb3IuU3RyaW5nU3RyZWFtPVN0cmluZ1N0cmVhbTtDb2RlTWlycm9yLlNoYXJlZFRleHRNYXJrZXI9U2hhcmVkVGV4dE1hcmtlcjtDb2RlTWlycm9yLlRleHRNYXJrZXI9VGV4dE1hcmtlcjtDb2RlTWlycm9yLkxpbmVXaWRnZXQ9TGluZVdpZGdldDtDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQ9ZV9wcmV2ZW50RGVmYXVsdDtDb2RlTWlycm9yLmVfc3RvcFByb3BhZ2F0aW9uPWVfc3RvcFByb3BhZ2F0aW9uO0NvZGVNaXJyb3IuZV9zdG9wPWVfc3RvcDtDb2RlTWlycm9yLmFkZENsYXNzPWFkZENsYXNzO0NvZGVNaXJyb3IuY29udGFpbnM9Y29udGFpbnM7Q29kZU1pcnJvci5ybUNsYXNzPXJtQ2xhc3M7Q29kZU1pcnJvci5rZXlOYW1lcz1rZXlOYW1lczt9CmRlZmluZU9wdGlvbnMoQ29kZU1pcnJvciQxKTthZGRFZGl0b3JNZXRob2RzKENvZGVNaXJyb3IkMSk7dmFyIGRvbnREZWxlZ2F0ZT0iaXRlciBpbnNlcnQgcmVtb3ZlIGNvcHkgZ2V0RWRpdG9yIGNvbnN0cnVjdG9yIi5zcGxpdCgiICIpO2Zvcih2YXIgcHJvcCBpbiBEb2MucHJvdG90eXBlKXtpZihEb2MucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApJiZpbmRleE9mKGRvbnREZWxlZ2F0ZSxwcm9wKTwwKQp7Q29kZU1pcnJvciQxLnByb3RvdHlwZVtwcm9wXT0oZnVuY3Rpb24obWV0aG9kKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMuZG9jLGFyZ3VtZW50cyl9fSkoRG9jLnByb3RvdHlwZVtwcm9wXSk7fX0KZXZlbnRNaXhpbihEb2MpO0NvZGVNaXJyb3IkMS5pbnB1dFN0eWxlcz17InRleHRhcmVhIjpUZXh0YXJlYUlucHV0LCJjb250ZW50ZWRpdGFibGUiOkNvbnRlbnRFZGl0YWJsZUlucHV0fTtDb2RlTWlycm9yJDEuZGVmaW5lTW9kZT1mdW5jdGlvbihuYW1lKXtpZighQ29kZU1pcnJvciQxLmRlZmF1bHRzLm1vZGUmJm5hbWUhPSJudWxsIil7Q29kZU1pcnJvciQxLmRlZmF1bHRzLm1vZGU9bmFtZTt9CmRlZmluZU1vZGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO307Q29kZU1pcnJvciQxLmRlZmluZU1JTUU9ZGVmaW5lTUlNRTtDb2RlTWlycm9yJDEuZGVmaW5lTW9kZSgibnVsbCIsZnVuY3Rpb24oKXtyZXR1cm4oe3Rva2VuOmZ1bmN0aW9uKHN0cmVhbSl7cmV0dXJuIHN0cmVhbS5za2lwVG9FbmQoKTt9fSk7fSk7Q29kZU1pcnJvciQxLmRlZmluZU1JTUUoInRleHQvcGxhaW4iLCJudWxsIik7Q29kZU1pcnJvciQxLmRlZmluZUV4dGVuc2lvbj1mdW5jdGlvbihuYW1lLGZ1bmMpe0NvZGVNaXJyb3IkMS5wcm90b3R5cGVbbmFtZV09ZnVuYzt9O0NvZGVNaXJyb3IkMS5kZWZpbmVEb2NFeHRlbnNpb249ZnVuY3Rpb24obmFtZSxmdW5jKXtEb2MucHJvdG90eXBlW25hbWVdPWZ1bmM7fTtDb2RlTWlycm9yJDEuZnJvbVRleHRBcmVhPWZyb21UZXh0QXJlYTthZGRMZWdhY3lQcm9wcyhDb2RlTWlycm9yJDEpO0NvZGVNaXJyb3IkMS52ZXJzaW9uPSI1LjMxLjEiO3JldHVybiBDb2RlTWlycm9yJDE7fSkpKTs7KGZ1bmN0aW9uKG1vZCl7aWYodHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IikKbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCkKZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSxtb2QpO2Vsc2UKbW9kKENvZGVNaXJyb3IpO30pKGZ1bmN0aW9uKENvZGVNaXJyb3IpeyJ1c2Ugc3RyaWN0IjtDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGU9ZnVuY3Rpb24ob3V0ZXIpe3ZhciBvdGhlcnM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2Z1bmN0aW9uIGluZGV4T2Yoc3RyaW5nLHBhdHRlcm4sZnJvbSxyZXR1cm5FbmQpe2lmKHR5cGVvZiBwYXR0ZXJuPT0ic3RyaW5nIil7dmFyIGZvdW5kPXN0cmluZy5pbmRleE9mKHBhdHRlcm4sZnJvbSk7cmV0dXJuIHJldHVybkVuZCYmZm91bmQ+LTE/Zm91bmQrcGF0dGVybi5sZW5ndGg6Zm91bmQ7fQp2YXIgbT1wYXR0ZXJuLmV4ZWMoZnJvbT9zdHJpbmcuc2xpY2UoZnJvbSk6c3RyaW5nKTtyZXR1cm4gbT9tLmluZGV4K2Zyb20rKHJldHVybkVuZD9tWzBdLmxlbmd0aDowKTotMTt9CnJldHVybntzdGFydFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJue291dGVyOkNvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdXRlciksaW5uZXJBY3RpdmU6bnVsbCxpbm5lcjpudWxsfTt9LGNvcHlTdGF0ZTpmdW5jdGlvbihzdGF0ZSl7cmV0dXJue291dGVyOkNvZGVNaXJyb3IuY29weVN0YXRlKG91dGVyLHN0YXRlLm91dGVyKSxpbm5lckFjdGl2ZTpzdGF0ZS5pbm5lckFjdGl2ZSxpbm5lcjpzdGF0ZS5pbm5lckFjdGl2ZSYmQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUuaW5uZXJBY3RpdmUubW9kZSxzdGF0ZS5pbm5lcil9O30sdG9rZW46ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXtpZighc3RhdGUuaW5uZXJBY3RpdmUpe3ZhciBjdXRPZmY9SW5maW5pdHksb2xkQ29udGVudD1zdHJlYW0uc3RyaW5nO2Zvcih2YXIgaT0wO2k8b3RoZXJzLmxlbmd0aDsrK2kpe3ZhciBvdGhlcj1vdGhlcnNbaV07dmFyIGZvdW5kPWluZGV4T2Yob2xkQ29udGVudCxvdGhlci5vcGVuLHN0cmVhbS5wb3MpO2lmKGZvdW5kPT1zdHJlYW0ucG9zKXtpZighb3RoZXIucGFyc2VEZWxpbWl0ZXJzKXN0cmVhbS5tYXRjaChvdGhlci5vcGVuKTtzdGF0ZS5pbm5lckFjdGl2ZT1vdGhlcjtzdGF0ZS5pbm5lcj1Db2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSxvdXRlci5pbmRlbnQ/b3V0ZXIuaW5kZW50KHN0YXRlLm91dGVyLCIiKTowKTtyZXR1cm4gb3RoZXIuZGVsaW1TdHlsZSYmKG90aGVyLmRlbGltU3R5bGUrIiAiK290aGVyLmRlbGltU3R5bGUrIi1vcGVuIik7fWVsc2UgaWYoZm91bmQhPS0xJiZmb3VuZDxjdXRPZmYpe2N1dE9mZj1mb3VuZDt9fQppZihjdXRPZmYhPUluZmluaXR5KXN0cmVhbS5zdHJpbmc9b2xkQ29udGVudC5zbGljZSgwLGN1dE9mZik7dmFyIG91dGVyVG9rZW49b3V0ZXIudG9rZW4oc3RyZWFtLHN0YXRlLm91dGVyKTtpZihjdXRPZmYhPUluZmluaXR5KXN0cmVhbS5zdHJpbmc9b2xkQ29udGVudDtyZXR1cm4gb3V0ZXJUb2tlbjt9ZWxzZXt2YXIgY3VySW5uZXI9c3RhdGUuaW5uZXJBY3RpdmUsb2xkQ29udGVudD1zdHJlYW0uc3RyaW5nO2lmKCFjdXJJbm5lci5jbG9zZSYmc3RyZWFtLnNvbCgpKXtzdGF0ZS5pbm5lckFjdGl2ZT1zdGF0ZS5pbm5lcj1udWxsO3JldHVybiB0aGlzLnRva2VuKHN0cmVhbSxzdGF0ZSk7fQp2YXIgZm91bmQ9Y3VySW5uZXIuY2xvc2U/aW5kZXhPZihvbGRDb250ZW50LGN1cklubmVyLmNsb3NlLHN0cmVhbS5wb3MsY3VySW5uZXIucGFyc2VEZWxpbWl0ZXJzKTotMTtpZihmb3VuZD09c3RyZWFtLnBvcyYmIWN1cklubmVyLnBhcnNlRGVsaW1pdGVycyl7c3RyZWFtLm1hdGNoKGN1cklubmVyLmNsb3NlKTtzdGF0ZS5pbm5lckFjdGl2ZT1zdGF0ZS5pbm5lcj1udWxsO3JldHVybiBjdXJJbm5lci5kZWxpbVN0eWxlJiYoY3VySW5uZXIuZGVsaW1TdHlsZSsiICIrY3VySW5uZXIuZGVsaW1TdHlsZSsiLWNsb3NlIik7fQppZihmb3VuZD4tMSlzdHJlYW0uc3RyaW5nPW9sZENvbnRlbnQuc2xpY2UoMCxmb3VuZCk7dmFyIGlubmVyVG9rZW49Y3VySW5uZXIubW9kZS50b2tlbihzdHJlYW0sc3RhdGUuaW5uZXIpO2lmKGZvdW5kPi0xKXN0cmVhbS5zdHJpbmc9b2xkQ29udGVudDtpZihmb3VuZD09c3RyZWFtLnBvcyYmY3VySW5uZXIucGFyc2VEZWxpbWl0ZXJzKQpzdGF0ZS5pbm5lckFjdGl2ZT1zdGF0ZS5pbm5lcj1udWxsO2lmKGN1cklubmVyLmlubmVyU3R5bGUpe2lmKGlubmVyVG9rZW4paW5uZXJUb2tlbj1pbm5lclRva2VuKyIgIitjdXJJbm5lci5pbm5lclN0eWxlO2Vsc2UgaW5uZXJUb2tlbj1jdXJJbm5lci5pbm5lclN0eWxlO30KcmV0dXJuIGlubmVyVG9rZW47fX0saW5kZW50OmZ1bmN0aW9uKHN0YXRlLHRleHRBZnRlcil7dmFyIG1vZGU9c3RhdGUuaW5uZXJBY3RpdmU/c3RhdGUuaW5uZXJBY3RpdmUubW9kZTpvdXRlcjtpZighbW9kZS5pbmRlbnQpcmV0dXJuIENvZGVNaXJyb3IuUGFzcztyZXR1cm4gbW9kZS5pbmRlbnQoc3RhdGUuaW5uZXJBY3RpdmU/c3RhdGUuaW5uZXI6c3RhdGUub3V0ZXIsdGV4dEFmdGVyKTt9LGJsYW5rTGluZTpmdW5jdGlvbihzdGF0ZSl7dmFyIG1vZGU9c3RhdGUuaW5uZXJBY3RpdmU/c3RhdGUuaW5uZXJBY3RpdmUubW9kZTpvdXRlcjtpZihtb2RlLmJsYW5rTGluZSl7bW9kZS5ibGFua0xpbmUoc3RhdGUuaW5uZXJBY3RpdmU/c3RhdGUuaW5uZXI6c3RhdGUub3V0ZXIpO30KaWYoIXN0YXRlLmlubmVyQWN0aXZlKXtmb3IodmFyIGk9MDtpPG90aGVycy5sZW5ndGg7KytpKXt2YXIgb3RoZXI9b3RoZXJzW2ldO2lmKG90aGVyLm9wZW49PT0iXG4iKXtzdGF0ZS5pbm5lckFjdGl2ZT1vdGhlcjtzdGF0ZS5pbm5lcj1Db2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSxtb2RlLmluZGVudD9tb2RlLmluZGVudChzdGF0ZS5vdXRlciwiIik6MCk7fX19ZWxzZSBpZihzdGF0ZS5pbm5lckFjdGl2ZS5jbG9zZT09PSJcbiIpe3N0YXRlLmlubmVyQWN0aXZlPXN0YXRlLmlubmVyPW51bGw7fX0sZWxlY3RyaWNDaGFyczpvdXRlci5lbGVjdHJpY0NoYXJzLGlubmVyTW9kZTpmdW5jdGlvbihzdGF0ZSl7cmV0dXJuIHN0YXRlLmlubmVyP3tzdGF0ZTpzdGF0ZS5pbm5lcixtb2RlOnN0YXRlLmlubmVyQWN0aXZlLm1vZGV9OntzdGF0ZTpzdGF0ZS5vdXRlcixtb2RlOm91dGVyfTt9fTt9O30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7dmFyIGllX2x0OD0vTVNJRSBcZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGRvY3VtZW50LmRvY3VtZW50TW9kZT09bnVsbHx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDgpO3ZhciBQb3M9Q29kZU1pcnJvci5Qb3M7dmFyIG1hdGNoaW5nPXsiKCI6Iik+IiwiKSI6Iig8IiwiWyI6Il0+IiwiXSI6Ils8IiwieyI6In0+IiwifSI6Ins8In07ZnVuY3Rpb24gZmluZE1hdGNoaW5nQnJhY2tldChjbSx3aGVyZSxjb25maWcpe3ZhciBsaW5lPWNtLmdldExpbmVIYW5kbGUod2hlcmUubGluZSkscG9zPXdoZXJlLmNoLTE7dmFyIGFmdGVyQ3Vyc29yPWNvbmZpZyYmY29uZmlnLmFmdGVyQ3Vyc29yCmlmKGFmdGVyQ3Vyc29yPT1udWxsKQphZnRlckN1cnNvcj0vKF58ICljbS1mYXQtY3Vyc29yKCR8ICkvLnRlc3QoY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5jbGFzc05hbWUpCnZhciBtYXRjaD0oIWFmdGVyQ3Vyc29yJiZwb3M+PTAmJm1hdGNoaW5nW2xpbmUudGV4dC5jaGFyQXQocG9zKV0pfHxtYXRjaGluZ1tsaW5lLnRleHQuY2hhckF0KCsrcG9zKV07aWYoIW1hdGNoKXJldHVybiBudWxsO3ZhciBkaXI9bWF0Y2guY2hhckF0KDEpPT0iPiI/MTotMTtpZihjb25maWcmJmNvbmZpZy5zdHJpY3QmJihkaXI+MCkhPShwb3M9PXdoZXJlLmNoKSlyZXR1cm4gbnVsbDt2YXIgc3R5bGU9Y20uZ2V0VG9rZW5UeXBlQXQoUG9zKHdoZXJlLmxpbmUscG9zKzEpKTt2YXIgZm91bmQ9c2NhbkZvckJyYWNrZXQoY20sUG9zKHdoZXJlLmxpbmUscG9zKyhkaXI+MD8xOjApKSxkaXIsc3R5bGV8fG51bGwsY29uZmlnKTtpZihmb3VuZD09bnVsbClyZXR1cm4gbnVsbDtyZXR1cm57ZnJvbTpQb3Mod2hlcmUubGluZSxwb3MpLHRvOmZvdW5kJiZmb3VuZC5wb3MsbWF0Y2g6Zm91bmQmJmZvdW5kLmNoPT1tYXRjaC5jaGFyQXQoMCksZm9yd2FyZDpkaXI+MH07fQpmdW5jdGlvbiBzY2FuRm9yQnJhY2tldChjbSx3aGVyZSxkaXIsc3R5bGUsY29uZmlnKXt2YXIgbWF4U2Nhbkxlbj0oY29uZmlnJiZjb25maWcubWF4U2NhbkxpbmVMZW5ndGgpfHwxMDAwMDt2YXIgbWF4U2NhbkxpbmVzPShjb25maWcmJmNvbmZpZy5tYXhTY2FuTGluZXMpfHwxMDAwO3ZhciBzdGFjaz1bXTt2YXIgcmU9Y29uZmlnJiZjb25maWcuYnJhY2tldFJlZ2V4P2NvbmZpZy5icmFja2V0UmVnZXg6L1soKXt9W1xdXS87dmFyIGxpbmVFbmQ9ZGlyPjA/TWF0aC5taW4od2hlcmUubGluZSttYXhTY2FuTGluZXMsY20ubGFzdExpbmUoKSsxKTpNYXRoLm1heChjbS5maXJzdExpbmUoKS0xLHdoZXJlLmxpbmUtbWF4U2NhbkxpbmVzKTtmb3IodmFyIGxpbmVObz13aGVyZS5saW5lO2xpbmVObyE9bGluZUVuZDtsaW5lTm8rPWRpcil7dmFyIGxpbmU9Y20uZ2V0TGluZShsaW5lTm8pO2lmKCFsaW5lKWNvbnRpbnVlO3ZhciBwb3M9ZGlyPjA/MDpsaW5lLmxlbmd0aC0xLGVuZD1kaXI+MD9saW5lLmxlbmd0aDotMTtpZihsaW5lLmxlbmd0aD5tYXhTY2FuTGVuKWNvbnRpbnVlO2lmKGxpbmVObz09d2hlcmUubGluZSlwb3M9d2hlcmUuY2gtKGRpcjwwPzE6MCk7Zm9yKDtwb3MhPWVuZDtwb3MrPWRpcil7dmFyIGNoPWxpbmUuY2hhckF0KHBvcyk7aWYocmUudGVzdChjaCkmJihzdHlsZT09PXVuZGVmaW5lZHx8Y20uZ2V0VG9rZW5UeXBlQXQoUG9zKGxpbmVObyxwb3MrMSkpPT1zdHlsZSkpe3ZhciBtYXRjaD1tYXRjaGluZ1tjaF07aWYoKG1hdGNoLmNoYXJBdCgxKT09Ij4iKT09KGRpcj4wKSlzdGFjay5wdXNoKGNoKTtlbHNlIGlmKCFzdGFjay5sZW5ndGgpcmV0dXJue3BvczpQb3MobGluZU5vLHBvcyksY2g6Y2h9O2Vsc2Ugc3RhY2sucG9wKCk7fX19CnJldHVybiBsaW5lTm8tZGlyPT0oZGlyPjA/Y20ubGFzdExpbmUoKTpjbS5maXJzdExpbmUoKSk/ZmFsc2U6bnVsbDt9CmZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoY20sYXV0b2NsZWFyLGNvbmZpZyl7dmFyIG1heEhpZ2hsaWdodExlbj1jbS5zdGF0ZS5tYXRjaEJyYWNrZXRzLm1heEhpZ2hsaWdodExpbmVMZW5ndGh8fDEwMDA7dmFyIG1hcmtzPVtdLHJhbmdlcz1jbS5saXN0U2VsZWN0aW9ucygpO2Zvcih2YXIgaT0wO2k8cmFuZ2VzLmxlbmd0aDtpKyspe3ZhciBtYXRjaD1yYW5nZXNbaV0uZW1wdHkoKSYmZmluZE1hdGNoaW5nQnJhY2tldChjbSxyYW5nZXNbaV0uaGVhZCxjb25maWcpO2lmKG1hdGNoJiZjbS5nZXRMaW5lKG1hdGNoLmZyb20ubGluZSkubGVuZ3RoPD1tYXhIaWdobGlnaHRMZW4pe3ZhciBzdHlsZT1tYXRjaC5tYXRjaD8iQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQiOiJDb2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCI7bWFya3MucHVzaChjbS5tYXJrVGV4dChtYXRjaC5mcm9tLFBvcyhtYXRjaC5mcm9tLmxpbmUsbWF0Y2guZnJvbS5jaCsxKSx7Y2xhc3NOYW1lOnN0eWxlfSkpO2lmKG1hdGNoLnRvJiZjbS5nZXRMaW5lKG1hdGNoLnRvLmxpbmUpLmxlbmd0aDw9bWF4SGlnaGxpZ2h0TGVuKQptYXJrcy5wdXNoKGNtLm1hcmtUZXh0KG1hdGNoLnRvLFBvcyhtYXRjaC50by5saW5lLG1hdGNoLnRvLmNoKzEpLHtjbGFzc05hbWU6c3R5bGV9KSk7fX0KaWYobWFya3MubGVuZ3RoKXtpZihpZV9sdDgmJmNtLnN0YXRlLmZvY3VzZWQpY20uZm9jdXMoKTt2YXIgY2xlYXI9ZnVuY3Rpb24oKXtjbS5vcGVyYXRpb24oZnVuY3Rpb24oKXtmb3IodmFyIGk9MDtpPG1hcmtzLmxlbmd0aDtpKyspbWFya3NbaV0uY2xlYXIoKTt9KTt9O2lmKGF1dG9jbGVhcilzZXRUaW1lb3V0KGNsZWFyLDgwMCk7ZWxzZSByZXR1cm4gY2xlYXI7fX0KdmFyIGN1cnJlbnRseUhpZ2hsaWdodGVkPW51bGw7ZnVuY3Rpb24gZG9NYXRjaEJyYWNrZXRzKGNtKXtjbS5vcGVyYXRpb24oZnVuY3Rpb24oKXtpZihjdXJyZW50bHlIaWdobGlnaHRlZCl7Y3VycmVudGx5SGlnaGxpZ2h0ZWQoKTtjdXJyZW50bHlIaWdobGlnaHRlZD1udWxsO30KY3VycmVudGx5SGlnaGxpZ2h0ZWQ9bWF0Y2hCcmFja2V0cyhjbSxmYWxzZSxjbS5zdGF0ZS5tYXRjaEJyYWNrZXRzKTt9KTt9CkNvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJtYXRjaEJyYWNrZXRzIixmYWxzZSxmdW5jdGlvbihjbSx2YWwsb2xkKXtpZihvbGQmJm9sZCE9Q29kZU1pcnJvci5Jbml0KXtjbS5vZmYoImN1cnNvckFjdGl2aXR5Iixkb01hdGNoQnJhY2tldHMpO2lmKGN1cnJlbnRseUhpZ2hsaWdodGVkKXtjdXJyZW50bHlIaWdobGlnaHRlZCgpO2N1cnJlbnRseUhpZ2hsaWdodGVkPW51bGw7fX0KaWYodmFsKXtjbS5zdGF0ZS5tYXRjaEJyYWNrZXRzPXR5cGVvZiB2YWw9PSJvYmplY3QiP3ZhbDp7fTtjbS5vbigiY3Vyc29yQWN0aXZpdHkiLGRvTWF0Y2hCcmFja2V0cyk7fX0pO0NvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJtYXRjaEJyYWNrZXRzIixmdW5jdGlvbigpe21hdGNoQnJhY2tldHModGhpcyx0cnVlKTt9KTtDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiZmluZE1hdGNoaW5nQnJhY2tldCIsZnVuY3Rpb24ocG9zLGNvbmZpZyxvbGRDb25maWcpe2lmKG9sZENvbmZpZ3x8dHlwZW9mIGNvbmZpZz09ImJvb2xlYW4iKXtpZighb2xkQ29uZmlnKXtjb25maWc9Y29uZmlnP3tzdHJpY3Q6dHJ1ZX06bnVsbH1lbHNle29sZENvbmZpZy5zdHJpY3Q9Y29uZmlnCmNvbmZpZz1vbGRDb25maWd9fQpyZXR1cm4gZmluZE1hdGNoaW5nQnJhY2tldCh0aGlzLHBvcyxjb25maWcpfSk7Q29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oInNjYW5Gb3JCcmFja2V0IixmdW5jdGlvbihwb3MsZGlyLHN0eWxlLGNvbmZpZyl7cmV0dXJuIHNjYW5Gb3JCcmFja2V0KHRoaXMscG9zLGRpcixzdHlsZSxjb25maWcpO30pO30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7dmFyIGRlZmF1bHRzPXtwYWlyczoiKClbXXt9JydcIlwiIix0cmlwbGVzOiIiLGV4cGxvZGU6Iltde30ifTt2YXIgUG9zPUNvZGVNaXJyb3IuUG9zO0NvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJhdXRvQ2xvc2VCcmFja2V0cyIsZmFsc2UsZnVuY3Rpb24oY20sdmFsLG9sZCl7aWYob2xkJiZvbGQhPUNvZGVNaXJyb3IuSW5pdCl7Y20ucmVtb3ZlS2V5TWFwKGtleU1hcCk7Y20uc3RhdGUuY2xvc2VCcmFja2V0cz1udWxsO30KaWYodmFsKXtlbnN1cmVCb3VuZChnZXRPcHRpb24odmFsLCJwYWlycyIpKQpjbS5zdGF0ZS5jbG9zZUJyYWNrZXRzPXZhbDtjbS5hZGRLZXlNYXAoa2V5TWFwKTt9fSk7ZnVuY3Rpb24gZ2V0T3B0aW9uKGNvbmYsbmFtZSl7aWYobmFtZT09InBhaXJzIiYmdHlwZW9mIGNvbmY9PSJzdHJpbmciKXJldHVybiBjb25mO2lmKHR5cGVvZiBjb25mPT0ib2JqZWN0IiYmY29uZltuYW1lXSE9bnVsbClyZXR1cm4gY29uZltuYW1lXTtyZXR1cm4gZGVmYXVsdHNbbmFtZV07fQp2YXIga2V5TWFwPXtCYWNrc3BhY2U6aGFuZGxlQmFja3NwYWNlLEVudGVyOmhhbmRsZUVudGVyfTtmdW5jdGlvbiBlbnN1cmVCb3VuZChjaGFycyl7Zm9yKHZhciBpPTA7aTxjaGFycy5sZW5ndGg7aSsrKXt2YXIgY2g9Y2hhcnMuY2hhckF0KGkpLGtleT0iJyIrY2grIiciCmlmKCFrZXlNYXBba2V5XSlrZXlNYXBba2V5XT1oYW5kbGVyKGNoKX19CmVuc3VyZUJvdW5kKGRlZmF1bHRzLnBhaXJzKyJgIikKZnVuY3Rpb24gaGFuZGxlcihjaCl7cmV0dXJuIGZ1bmN0aW9uKGNtKXtyZXR1cm4gaGFuZGxlQ2hhcihjbSxjaCk7fTt9CmZ1bmN0aW9uIGdldENvbmZpZyhjbSl7dmFyIGRlZmx0PWNtLnN0YXRlLmNsb3NlQnJhY2tldHM7aWYoIWRlZmx0fHxkZWZsdC5vdmVycmlkZSlyZXR1cm4gZGVmbHQ7dmFyIG1vZGU9Y20uZ2V0TW9kZUF0KGNtLmdldEN1cnNvcigpKTtyZXR1cm4gbW9kZS5jbG9zZUJyYWNrZXRzfHxkZWZsdDt9CmZ1bmN0aW9uIGhhbmRsZUJhY2tzcGFjZShjbSl7dmFyIGNvbmY9Z2V0Q29uZmlnKGNtKTtpZighY29uZnx8Y20uZ2V0T3B0aW9uKCJkaXNhYmxlSW5wdXQiKSlyZXR1cm4gQ29kZU1pcnJvci5QYXNzO3ZhciBwYWlycz1nZXRPcHRpb24oY29uZiwicGFpcnMiKTt2YXIgcmFuZ2VzPWNtLmxpc3RTZWxlY3Rpb25zKCk7Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7aWYoIXJhbmdlc1tpXS5lbXB0eSgpKXJldHVybiBDb2RlTWlycm9yLlBhc3M7dmFyIGFyb3VuZD1jaGFyc0Fyb3VuZChjbSxyYW5nZXNbaV0uaGVhZCk7aWYoIWFyb3VuZHx8cGFpcnMuaW5kZXhPZihhcm91bmQpJTIhPTApcmV0dXJuIENvZGVNaXJyb3IuUGFzczt9CmZvcih2YXIgaT1yYW5nZXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBjdXI9cmFuZ2VzW2ldLmhlYWQ7Y20ucmVwbGFjZVJhbmdlKCIiLFBvcyhjdXIubGluZSxjdXIuY2gtMSksUG9zKGN1ci5saW5lLGN1ci5jaCsxKSwiK2RlbGV0ZSIpO319CmZ1bmN0aW9uIGhhbmRsZUVudGVyKGNtKXt2YXIgY29uZj1nZXRDb25maWcoY20pO3ZhciBleHBsb2RlPWNvbmYmJmdldE9wdGlvbihjb25mLCJleHBsb2RlIik7aWYoIWV4cGxvZGV8fGNtLmdldE9wdGlvbigiZGlzYWJsZUlucHV0IikpcmV0dXJuIENvZGVNaXJyb3IuUGFzczt2YXIgcmFuZ2VzPWNtLmxpc3RTZWxlY3Rpb25zKCk7Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7aWYoIXJhbmdlc1tpXS5lbXB0eSgpKXJldHVybiBDb2RlTWlycm9yLlBhc3M7dmFyIGFyb3VuZD1jaGFyc0Fyb3VuZChjbSxyYW5nZXNbaV0uaGVhZCk7aWYoIWFyb3VuZHx8ZXhwbG9kZS5pbmRleE9mKGFyb3VuZCklMiE9MClyZXR1cm4gQ29kZU1pcnJvci5QYXNzO30KY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCl7dmFyIGxpbmVzZXA9Y20ubGluZVNlcGFyYXRvcigpfHwiXG4iO2NtLnJlcGxhY2VTZWxlY3Rpb24obGluZXNlcCtsaW5lc2VwLG51bGwpO2NtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7cmFuZ2VzPWNtLmxpc3RTZWxlY3Rpb25zKCk7Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7dmFyIGxpbmU9cmFuZ2VzW2ldLmhlYWQubGluZTtjbS5pbmRlbnRMaW5lKGxpbmUsbnVsbCx0cnVlKTtjbS5pbmRlbnRMaW5lKGxpbmUrMSxudWxsLHRydWUpO319KTt9CmZ1bmN0aW9uIGNvbnRyYWN0U2VsZWN0aW9uKHNlbCl7dmFyIGludmVydGVkPUNvZGVNaXJyb3IuY21wUG9zKHNlbC5hbmNob3Isc2VsLmhlYWQpPjA7cmV0dXJue2FuY2hvcjpuZXcgUG9zKHNlbC5hbmNob3IubGluZSxzZWwuYW5jaG9yLmNoKyhpbnZlcnRlZD8tMToxKSksaGVhZDpuZXcgUG9zKHNlbC5oZWFkLmxpbmUsc2VsLmhlYWQuY2grKGludmVydGVkPzE6LTEpKX07fQpmdW5jdGlvbiBoYW5kbGVDaGFyKGNtLGNoKXt2YXIgY29uZj1nZXRDb25maWcoY20pO2lmKCFjb25mfHxjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKXJldHVybiBDb2RlTWlycm9yLlBhc3M7dmFyIHBhaXJzPWdldE9wdGlvbihjb25mLCJwYWlycyIpO3ZhciBwb3M9cGFpcnMuaW5kZXhPZihjaCk7aWYocG9zPT0tMSlyZXR1cm4gQ29kZU1pcnJvci5QYXNzO3ZhciB0cmlwbGVzPWdldE9wdGlvbihjb25mLCJ0cmlwbGVzIik7dmFyIGlkZW50aWNhbD1wYWlycy5jaGFyQXQocG9zKzEpPT1jaDt2YXIgcmFuZ2VzPWNtLmxpc3RTZWxlY3Rpb25zKCk7dmFyIG9wZW5pbmc9cG9zJTI9PTA7dmFyIHR5cGU7Zm9yKHZhciBpPTA7aTxyYW5nZXMubGVuZ3RoO2krKyl7dmFyIHJhbmdlPXJhbmdlc1tpXSxjdXI9cmFuZ2UuaGVhZCxjdXJUeXBlO3ZhciBuZXh0PWNtLmdldFJhbmdlKGN1cixQb3MoY3VyLmxpbmUsY3VyLmNoKzEpKTtpZihvcGVuaW5nJiYhcmFuZ2UuZW1wdHkoKSl7Y3VyVHlwZT0ic3Vycm91bmQiO31lbHNlIGlmKChpZGVudGljYWx8fCFvcGVuaW5nKSYmbmV4dD09Y2gpe2lmKGlkZW50aWNhbCYmc3RyaW5nU3RhcnRzQWZ0ZXIoY20sY3VyKSkKY3VyVHlwZT0iYm90aCI7ZWxzZSBpZih0cmlwbGVzLmluZGV4T2YoY2gpPj0wJiZjbS5nZXRSYW5nZShjdXIsUG9zKGN1ci5saW5lLGN1ci5jaCszKSk9PWNoK2NoK2NoKQpjdXJUeXBlPSJza2lwVGhyZWUiO2Vsc2UKY3VyVHlwZT0ic2tpcCI7fWVsc2UgaWYoaWRlbnRpY2FsJiZjdXIuY2g+MSYmdHJpcGxlcy5pbmRleE9mKGNoKT49MCYmY20uZ2V0UmFuZ2UoUG9zKGN1ci5saW5lLGN1ci5jaC0yKSxjdXIpPT1jaCtjaCYmKGN1ci5jaDw9Mnx8Y20uZ2V0UmFuZ2UoUG9zKGN1ci5saW5lLGN1ci5jaC0zKSxQb3MoY3VyLmxpbmUsY3VyLmNoLTIpKSE9Y2gpKXtjdXJUeXBlPSJhZGRGb3VyIjt9ZWxzZSBpZihpZGVudGljYWwpe3ZhciBwcmV2PWN1ci5jaD09MD8iICI6Y20uZ2V0UmFuZ2UoUG9zKGN1ci5saW5lLGN1ci5jaC0xKSxjdXIpCmlmKCFDb2RlTWlycm9yLmlzV29yZENoYXIobmV4dCkmJnByZXYhPWNoJiYhQ29kZU1pcnJvci5pc1dvcmRDaGFyKHByZXYpKWN1clR5cGU9ImJvdGgiO2Vsc2UgcmV0dXJuIENvZGVNaXJyb3IuUGFzczt9ZWxzZSBpZihvcGVuaW5nJiYoY20uZ2V0TGluZShjdXIubGluZSkubGVuZ3RoPT1jdXIuY2h8fGlzQ2xvc2luZ0JyYWNrZXQobmV4dCxwYWlycyl8fC9ccy8udGVzdChuZXh0KSkpe2N1clR5cGU9ImJvdGgiO31lbHNle3JldHVybiBDb2RlTWlycm9yLlBhc3M7fQppZighdHlwZSl0eXBlPWN1clR5cGU7ZWxzZSBpZih0eXBlIT1jdXJUeXBlKXJldHVybiBDb2RlTWlycm9yLlBhc3M7fQp2YXIgbGVmdD1wb3MlMj9wYWlycy5jaGFyQXQocG9zLTEpOmNoO3ZhciByaWdodD1wb3MlMj9jaDpwYWlycy5jaGFyQXQocG9zKzEpO2NtLm9wZXJhdGlvbihmdW5jdGlvbigpe2lmKHR5cGU9PSJza2lwIil7Y20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7fWVsc2UgaWYodHlwZT09InNraXBUaHJlZSIpe2Zvcih2YXIgaT0wO2k8MztpKyspCmNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpO31lbHNlIGlmKHR5cGU9PSJzdXJyb3VuZCIpe3ZhciBzZWxzPWNtLmdldFNlbGVjdGlvbnMoKTtmb3IodmFyIGk9MDtpPHNlbHMubGVuZ3RoO2krKykKc2Vsc1tpXT1sZWZ0K3NlbHNbaV0rcmlnaHQ7Y20ucmVwbGFjZVNlbGVjdGlvbnMoc2VscywiYXJvdW5kIik7c2Vscz1jbS5saXN0U2VsZWN0aW9ucygpLnNsaWNlKCk7Zm9yKHZhciBpPTA7aTxzZWxzLmxlbmd0aDtpKyspCnNlbHNbaV09Y29udHJhY3RTZWxlY3Rpb24oc2Vsc1tpXSk7Y20uc2V0U2VsZWN0aW9ucyhzZWxzKTt9ZWxzZSBpZih0eXBlPT0iYm90aCIpe2NtLnJlcGxhY2VTZWxlY3Rpb24obGVmdCtyaWdodCxudWxsKTtjbS50cmlnZ2VyRWxlY3RyaWMobGVmdCtyaWdodCk7Y20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTt9ZWxzZSBpZih0eXBlPT0iYWRkRm91ciIpe2NtLnJlcGxhY2VTZWxlY3Rpb24obGVmdCtsZWZ0K2xlZnQrbGVmdCwiYmVmb3JlIik7Y20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7fX0pO30KZnVuY3Rpb24gaXNDbG9zaW5nQnJhY2tldChjaCxwYWlycyl7dmFyIHBvcz1wYWlycy5sYXN0SW5kZXhPZihjaCk7cmV0dXJuIHBvcz4tMSYmcG9zJTI9PTE7fQpmdW5jdGlvbiBjaGFyc0Fyb3VuZChjbSxwb3Mpe3ZhciBzdHI9Y20uZ2V0UmFuZ2UoUG9zKHBvcy5saW5lLHBvcy5jaC0xKSxQb3MocG9zLmxpbmUscG9zLmNoKzEpKTtyZXR1cm4gc3RyLmxlbmd0aD09Mj9zdHI6bnVsbDt9CmZ1bmN0aW9uIHN0cmluZ1N0YXJ0c0FmdGVyKGNtLHBvcyl7dmFyIHRva2VuPWNtLmdldFRva2VuQXQoUG9zKHBvcy5saW5lLHBvcy5jaCsxKSkKcmV0dXJuL1xic3RyaW5nLy50ZXN0KHRva2VuLnR5cGUpJiZ0b2tlbi5zdGFydD09cG9zLmNoJiYocG9zLmNoPT0wfHwhL1xic3RyaW5nLy50ZXN0KGNtLmdldFRva2VuVHlwZUF0KHBvcykpKX19KTs7KGZ1bmN0aW9uKG1vZCl7aWYodHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IikKbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCkKZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSxtb2QpO2Vsc2UKbW9kKENvZGVNaXJyb3IpO30pKGZ1bmN0aW9uKENvZGVNaXJyb3IpeyJ1c2Ugc3RyaWN0IjtDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic3R5bGVTZWxlY3RlZFRleHQiLGZhbHNlLGZ1bmN0aW9uKGNtLHZhbCxvbGQpe3ZhciBwcmV2PW9sZCYmb2xkIT1Db2RlTWlycm9yLkluaXQ7aWYodmFsJiYhcHJldil7Y20uc3RhdGUubWFya2VkU2VsZWN0aW9uPVtdO2NtLnN0YXRlLm1hcmtlZFNlbGVjdGlvblN0eWxlPXR5cGVvZiB2YWw9PSJzdHJpbmciP3ZhbDoiQ29kZU1pcnJvci1zZWxlY3RlZHRleHQiO3Jlc2V0KGNtKTtjbS5vbigiY3Vyc29yQWN0aXZpdHkiLG9uQ3Vyc29yQWN0aXZpdHkpO2NtLm9uKCJjaGFuZ2UiLG9uQ2hhbmdlKTt9ZWxzZSBpZighdmFsJiZwcmV2KXtjbS5vZmYoImN1cnNvckFjdGl2aXR5IixvbkN1cnNvckFjdGl2aXR5KTtjbS5vZmYoImNoYW5nZSIsb25DaGFuZ2UpO2NsZWFyKGNtKTtjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb249Y20uc3RhdGUubWFya2VkU2VsZWN0aW9uU3R5bGU9bnVsbDt9fSk7ZnVuY3Rpb24gb25DdXJzb3JBY3Rpdml0eShjbSl7aWYoY20uc3RhdGUubWFya2VkU2VsZWN0aW9uKQpjbS5vcGVyYXRpb24oZnVuY3Rpb24oKXt1cGRhdGUoY20pO30pO30KZnVuY3Rpb24gb25DaGFuZ2UoY20pe2lmKGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbiYmY20uc3RhdGUubWFya2VkU2VsZWN0aW9uLmxlbmd0aCkKY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCl7Y2xlYXIoY20pO30pO30KdmFyIENIVU5LX1NJWkU9ODt2YXIgUG9zPUNvZGVNaXJyb3IuUG9zO3ZhciBjbXA9Q29kZU1pcnJvci5jbXBQb3M7ZnVuY3Rpb24gY292ZXJSYW5nZShjbSxmcm9tLHRvLGFkZEF0KXtpZihjbXAoZnJvbSx0byk9PTApcmV0dXJuO3ZhciBhcnJheT1jbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247dmFyIGNscz1jbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZTtmb3IodmFyIGxpbmU9ZnJvbS5saW5lOzspe3ZhciBzdGFydD1saW5lPT1mcm9tLmxpbmU/ZnJvbTpQb3MobGluZSwwKTt2YXIgZW5kTGluZT1saW5lK0NIVU5LX1NJWkUsYXRFbmQ9ZW5kTGluZT49dG8ubGluZTt2YXIgZW5kPWF0RW5kP3RvOlBvcyhlbmRMaW5lLDApO3ZhciBtYXJrPWNtLm1hcmtUZXh0KHN0YXJ0LGVuZCx7Y2xhc3NOYW1lOmNsc30pO2lmKGFkZEF0PT1udWxsKWFycmF5LnB1c2gobWFyayk7ZWxzZSBhcnJheS5zcGxpY2UoYWRkQXQrKywwLG1hcmspO2lmKGF0RW5kKWJyZWFrO2xpbmU9ZW5kTGluZTt9fQpmdW5jdGlvbiBjbGVhcihjbSl7dmFyIGFycmF5PWNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbjtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDsrK2kpYXJyYXlbaV0uY2xlYXIoKTthcnJheS5sZW5ndGg9MDt9CmZ1bmN0aW9uIHJlc2V0KGNtKXtjbGVhcihjbSk7dmFyIHJhbmdlcz1jbS5saXN0U2VsZWN0aW9ucygpO2Zvcih2YXIgaT0wO2k8cmFuZ2VzLmxlbmd0aDtpKyspCmNvdmVyUmFuZ2UoY20scmFuZ2VzW2ldLmZyb20oKSxyYW5nZXNbaV0udG8oKSk7fQpmdW5jdGlvbiB1cGRhdGUoY20pe2lmKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKXJldHVybiBjbGVhcihjbSk7aWYoY20ubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGg+MSlyZXR1cm4gcmVzZXQoY20pO3ZhciBmcm9tPWNtLmdldEN1cnNvcigic3RhcnQiKSx0bz1jbS5nZXRDdXJzb3IoImVuZCIpO3ZhciBhcnJheT1jbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247aWYoIWFycmF5Lmxlbmd0aClyZXR1cm4gY292ZXJSYW5nZShjbSxmcm9tLHRvKTt2YXIgY292ZXJTdGFydD1hcnJheVswXS5maW5kKCksY292ZXJFbmQ9YXJyYXlbYXJyYXkubGVuZ3RoLTFdLmZpbmQoKTtpZighY292ZXJTdGFydHx8IWNvdmVyRW5kfHx0by5saW5lLWZyb20ubGluZTw9Q0hVTktfU0laRXx8Y21wKGZyb20sY292ZXJFbmQudG8pPj0wfHxjbXAodG8sY292ZXJTdGFydC5mcm9tKTw9MCkKcmV0dXJuIHJlc2V0KGNtKTt3aGlsZShjbXAoZnJvbSxjb3ZlclN0YXJ0LmZyb20pPjApe2FycmF5LnNoaWZ0KCkuY2xlYXIoKTtjb3ZlclN0YXJ0PWFycmF5WzBdLmZpbmQoKTt9CmlmKGNtcChmcm9tLGNvdmVyU3RhcnQuZnJvbSk8MCl7aWYoY292ZXJTdGFydC50by5saW5lLWZyb20ubGluZTxDSFVOS19TSVpFKXthcnJheS5zaGlmdCgpLmNsZWFyKCk7Y292ZXJSYW5nZShjbSxmcm9tLGNvdmVyU3RhcnQudG8sMCk7fWVsc2V7Y292ZXJSYW5nZShjbSxmcm9tLGNvdmVyU3RhcnQuZnJvbSwwKTt9fQp3aGlsZShjbXAodG8sY292ZXJFbmQudG8pPDApe2FycmF5LnBvcCgpLmNsZWFyKCk7Y292ZXJFbmQ9YXJyYXlbYXJyYXkubGVuZ3RoLTFdLmZpbmQoKTt9CmlmKGNtcCh0byxjb3ZlckVuZC50byk+MCl7aWYodG8ubGluZS1jb3ZlckVuZC5mcm9tLmxpbmU8Q0hVTktfU0laRSl7YXJyYXkucG9wKCkuY2xlYXIoKTtjb3ZlclJhbmdlKGNtLGNvdmVyRW5kLmZyb20sdG8pO31lbHNle2NvdmVyUmFuZ2UoY20sY292ZXJFbmQudG8sdG8pO319fX0pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO3ZhciBub09wdGlvbnM9e307dmFyIG5vbldTPS9bXlxzXHUwMGEwXS87dmFyIFBvcz1Db2RlTWlycm9yLlBvcztmdW5jdGlvbiBmaXJzdE5vbldTKHN0cil7dmFyIGZvdW5kPXN0ci5zZWFyY2gobm9uV1MpO3JldHVybiBmb3VuZD09LTE/MDpmb3VuZDt9CkNvZGVNaXJyb3IuY29tbWFuZHMudG9nZ2xlQ29tbWVudD1mdW5jdGlvbihjbSl7Y20udG9nZ2xlQ29tbWVudCgpO307Q29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oInRvZ2dsZUNvbW1lbnQiLGZ1bmN0aW9uKG9wdGlvbnMpe2lmKCFvcHRpb25zKW9wdGlvbnM9bm9PcHRpb25zO3ZhciBjbT10aGlzO3ZhciBtaW5MaW5lPUluZmluaXR5LHJhbmdlcz10aGlzLmxpc3RTZWxlY3Rpb25zKCksbW9kZT1udWxsO2Zvcih2YXIgaT1yYW5nZXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBmcm9tPXJhbmdlc1tpXS5mcm9tKCksdG89cmFuZ2VzW2ldLnRvKCk7aWYoZnJvbS5saW5lPj1taW5MaW5lKWNvbnRpbnVlO2lmKHRvLmxpbmU+PW1pbkxpbmUpdG89UG9zKG1pbkxpbmUsMCk7bWluTGluZT1mcm9tLmxpbmU7aWYobW9kZT09bnVsbCl7aWYoY20udW5jb21tZW50KGZyb20sdG8sb3B0aW9ucykpbW9kZT0idW4iO2Vsc2V7Y20ubGluZUNvbW1lbnQoZnJvbSx0byxvcHRpb25zKTttb2RlPSJsaW5lIjt9fWVsc2UgaWYobW9kZT09InVuIil7Y20udW5jb21tZW50KGZyb20sdG8sb3B0aW9ucyk7fWVsc2V7Y20ubGluZUNvbW1lbnQoZnJvbSx0byxvcHRpb25zKTt9fX0pO2Z1bmN0aW9uIHByb2JhYmx5SW5zaWRlU3RyaW5nKGNtLHBvcyxsaW5lKXtyZXR1cm4vXGJzdHJpbmdcYi8udGVzdChjbS5nZXRUb2tlblR5cGVBdChQb3MocG9zLmxpbmUsMCkpKSYmIS9eW1wnXCJcYF0vLnRlc3QobGluZSl9CmZ1bmN0aW9uIGdldE1vZGUoY20scG9zKXt2YXIgbW9kZT1jbS5nZXRNb2RlKCkKcmV0dXJuIG1vZGUudXNlSW5uZXJDb21tZW50cz09PWZhbHNlfHwhbW9kZS5pbm5lck1vZGU/bW9kZTpjbS5nZXRNb2RlQXQocG9zKX0KQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImxpbmVDb21tZW50IixmdW5jdGlvbihmcm9tLHRvLG9wdGlvbnMpe2lmKCFvcHRpb25zKW9wdGlvbnM9bm9PcHRpb25zO3ZhciBzZWxmPXRoaXMsbW9kZT1nZXRNb2RlKHNlbGYsZnJvbSk7dmFyIGZpcnN0TGluZT1zZWxmLmdldExpbmUoZnJvbS5saW5lKTtpZihmaXJzdExpbmU9PW51bGx8fHByb2JhYmx5SW5zaWRlU3RyaW5nKHNlbGYsZnJvbSxmaXJzdExpbmUpKXJldHVybjt2YXIgY29tbWVudFN0cmluZz1vcHRpb25zLmxpbmVDb21tZW50fHxtb2RlLmxpbmVDb21tZW50O2lmKCFjb21tZW50U3RyaW5nKXtpZihvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0fHxtb2RlLmJsb2NrQ29tbWVudFN0YXJ0KXtvcHRpb25zLmZ1bGxMaW5lcz10cnVlO3NlbGYuYmxvY2tDb21tZW50KGZyb20sdG8sb3B0aW9ucyk7fQpyZXR1cm47fQp2YXIgZW5kPU1hdGgubWluKHRvLmNoIT0wfHx0by5saW5lPT1mcm9tLmxpbmU/dG8ubGluZSsxOnRvLmxpbmUsc2VsZi5sYXN0TGluZSgpKzEpO3ZhciBwYWQ9b3B0aW9ucy5wYWRkaW5nPT1udWxsPyIgIjpvcHRpb25zLnBhZGRpbmc7dmFyIGJsYW5rTGluZXM9b3B0aW9ucy5jb21tZW50QmxhbmtMaW5lc3x8ZnJvbS5saW5lPT10by5saW5lO3NlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCl7aWYob3B0aW9ucy5pbmRlbnQpe3ZhciBiYXNlU3RyaW5nPW51bGw7Zm9yKHZhciBpPWZyb20ubGluZTtpPGVuZDsrK2kpe3ZhciBsaW5lPXNlbGYuZ2V0TGluZShpKTt2YXIgd2hpdGVzcGFjZT1saW5lLnNsaWNlKDAsZmlyc3ROb25XUyhsaW5lKSk7aWYoYmFzZVN0cmluZz09bnVsbHx8YmFzZVN0cmluZy5sZW5ndGg+d2hpdGVzcGFjZS5sZW5ndGgpe2Jhc2VTdHJpbmc9d2hpdGVzcGFjZTt9fQpmb3IodmFyIGk9ZnJvbS5saW5lO2k8ZW5kOysraSl7dmFyIGxpbmU9c2VsZi5nZXRMaW5lKGkpLGN1dD1iYXNlU3RyaW5nLmxlbmd0aDtpZighYmxhbmtMaW5lcyYmIW5vbldTLnRlc3QobGluZSkpY29udGludWU7aWYobGluZS5zbGljZSgwLGN1dCkhPWJhc2VTdHJpbmcpY3V0PWZpcnN0Tm9uV1MobGluZSk7c2VsZi5yZXBsYWNlUmFuZ2UoYmFzZVN0cmluZytjb21tZW50U3RyaW5nK3BhZCxQb3MoaSwwKSxQb3MoaSxjdXQpKTt9fWVsc2V7Zm9yKHZhciBpPWZyb20ubGluZTtpPGVuZDsrK2kpe2lmKGJsYW5rTGluZXN8fG5vbldTLnRlc3Qoc2VsZi5nZXRMaW5lKGkpKSkKc2VsZi5yZXBsYWNlUmFuZ2UoY29tbWVudFN0cmluZytwYWQsUG9zKGksMCkpO319fSk7fSk7Q29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImJsb2NrQ29tbWVudCIsZnVuY3Rpb24oZnJvbSx0byxvcHRpb25zKXtpZighb3B0aW9ucylvcHRpb25zPW5vT3B0aW9uczt2YXIgc2VsZj10aGlzLG1vZGU9Z2V0TW9kZShzZWxmLGZyb20pO3ZhciBzdGFydFN0cmluZz1vcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0fHxtb2RlLmJsb2NrQ29tbWVudFN0YXJ0O3ZhciBlbmRTdHJpbmc9b3B0aW9ucy5ibG9ja0NvbW1lbnRFbmR8fG1vZGUuYmxvY2tDb21tZW50RW5kO2lmKCFzdGFydFN0cmluZ3x8IWVuZFN0cmluZyl7aWYoKG9wdGlvbnMubGluZUNvbW1lbnR8fG1vZGUubGluZUNvbW1lbnQpJiZvcHRpb25zLmZ1bGxMaW5lcyE9ZmFsc2UpCnNlbGYubGluZUNvbW1lbnQoZnJvbSx0byxvcHRpb25zKTtyZXR1cm47fQppZigvXGJjb21tZW50XGIvLnRlc3Qoc2VsZi5nZXRUb2tlblR5cGVBdChQb3MoZnJvbS5saW5lLDApKSkpcmV0dXJuCnZhciBlbmQ9TWF0aC5taW4odG8ubGluZSxzZWxmLmxhc3RMaW5lKCkpO2lmKGVuZCE9ZnJvbS5saW5lJiZ0by5jaD09MCYmbm9uV1MudGVzdChzZWxmLmdldExpbmUoZW5kKSkpLS1lbmQ7dmFyIHBhZD1vcHRpb25zLnBhZGRpbmc9PW51bGw/IiAiOm9wdGlvbnMucGFkZGluZztpZihmcm9tLmxpbmU+ZW5kKXJldHVybjtzZWxmLm9wZXJhdGlvbihmdW5jdGlvbigpe2lmKG9wdGlvbnMuZnVsbExpbmVzIT1mYWxzZSl7dmFyIGxhc3RMaW5lSGFzVGV4dD1ub25XUy50ZXN0KHNlbGYuZ2V0TGluZShlbmQpKTtzZWxmLnJlcGxhY2VSYW5nZShwYWQrZW5kU3RyaW5nLFBvcyhlbmQpKTtzZWxmLnJlcGxhY2VSYW5nZShzdGFydFN0cmluZytwYWQsUG9zKGZyb20ubGluZSwwKSk7dmFyIGxlYWQ9b3B0aW9ucy5ibG9ja0NvbW1lbnRMZWFkfHxtb2RlLmJsb2NrQ29tbWVudExlYWQ7aWYobGVhZCE9bnVsbClmb3IodmFyIGk9ZnJvbS5saW5lKzE7aTw9ZW5kOysraSkKaWYoaSE9ZW5kfHxsYXN0TGluZUhhc1RleHQpCnNlbGYucmVwbGFjZVJhbmdlKGxlYWQrcGFkLFBvcyhpLDApKTt9ZWxzZXtzZWxmLnJlcGxhY2VSYW5nZShlbmRTdHJpbmcsdG8pO3NlbGYucmVwbGFjZVJhbmdlKHN0YXJ0U3RyaW5nLGZyb20pO319KTt9KTtDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigidW5jb21tZW50IixmdW5jdGlvbihmcm9tLHRvLG9wdGlvbnMpe2lmKCFvcHRpb25zKW9wdGlvbnM9bm9PcHRpb25zO3ZhciBzZWxmPXRoaXMsbW9kZT1nZXRNb2RlKHNlbGYsZnJvbSk7dmFyIGVuZD1NYXRoLm1pbih0by5jaCE9MHx8dG8ubGluZT09ZnJvbS5saW5lP3RvLmxpbmU6dG8ubGluZS0xLHNlbGYubGFzdExpbmUoKSksc3RhcnQ9TWF0aC5taW4oZnJvbS5saW5lLGVuZCk7dmFyIGxpbmVTdHJpbmc9b3B0aW9ucy5saW5lQ29tbWVudHx8bW9kZS5saW5lQ29tbWVudCxsaW5lcz1bXTt2YXIgcGFkPW9wdGlvbnMucGFkZGluZz09bnVsbD8iICI6b3B0aW9ucy5wYWRkaW5nLGRpZFNvbWV0aGluZztsaW5lQ29tbWVudDp7aWYoIWxpbmVTdHJpbmcpYnJlYWsgbGluZUNvbW1lbnQ7Zm9yKHZhciBpPXN0YXJ0O2k8PWVuZDsrK2kpe3ZhciBsaW5lPXNlbGYuZ2V0TGluZShpKTt2YXIgZm91bmQ9bGluZS5pbmRleE9mKGxpbmVTdHJpbmcpO2lmKGZvdW5kPi0xJiYhL2NvbW1lbnQvLnRlc3Qoc2VsZi5nZXRUb2tlblR5cGVBdChQb3MoaSxmb3VuZCsxKSkpKWZvdW5kPS0xO2lmKGZvdW5kPT0tMSYmbm9uV1MudGVzdChsaW5lKSlicmVhayBsaW5lQ29tbWVudDtpZihmb3VuZD4tMSYmbm9uV1MudGVzdChsaW5lLnNsaWNlKDAsZm91bmQpKSlicmVhayBsaW5lQ29tbWVudDtsaW5lcy5wdXNoKGxpbmUpO30Kc2VsZi5vcGVyYXRpb24oZnVuY3Rpb24oKXtmb3IodmFyIGk9c3RhcnQ7aTw9ZW5kOysraSl7dmFyIGxpbmU9bGluZXNbaS1zdGFydF07dmFyIHBvcz1saW5lLmluZGV4T2YobGluZVN0cmluZyksZW5kUG9zPXBvcytsaW5lU3RyaW5nLmxlbmd0aDtpZihwb3M8MCljb250aW51ZTtpZihsaW5lLnNsaWNlKGVuZFBvcyxlbmRQb3MrcGFkLmxlbmd0aCk9PXBhZCllbmRQb3MrPXBhZC5sZW5ndGg7ZGlkU29tZXRoaW5nPXRydWU7c2VsZi5yZXBsYWNlUmFuZ2UoIiIsUG9zKGkscG9zKSxQb3MoaSxlbmRQb3MpKTt9fSk7aWYoZGlkU29tZXRoaW5nKXJldHVybiB0cnVlO30KdmFyIHN0YXJ0U3RyaW5nPW9wdGlvbnMuYmxvY2tDb21tZW50U3RhcnR8fG1vZGUuYmxvY2tDb21tZW50U3RhcnQ7dmFyIGVuZFN0cmluZz1vcHRpb25zLmJsb2NrQ29tbWVudEVuZHx8bW9kZS5ibG9ja0NvbW1lbnRFbmQ7aWYoIXN0YXJ0U3RyaW5nfHwhZW5kU3RyaW5nKXJldHVybiBmYWxzZTt2YXIgbGVhZD1vcHRpb25zLmJsb2NrQ29tbWVudExlYWR8fG1vZGUuYmxvY2tDb21tZW50TGVhZDt2YXIgc3RhcnRMaW5lPXNlbGYuZ2V0TGluZShzdGFydCksb3Blbj1zdGFydExpbmUuaW5kZXhPZihzdGFydFN0cmluZykKaWYob3Blbj09LTEpcmV0dXJuIGZhbHNlCnZhciBlbmRMaW5lPWVuZD09c3RhcnQ/c3RhcnRMaW5lOnNlbGYuZ2V0TGluZShlbmQpCnZhciBjbG9zZT1lbmRMaW5lLmluZGV4T2YoZW5kU3RyaW5nLGVuZD09c3RhcnQ/b3BlbitzdGFydFN0cmluZy5sZW5ndGg6MCk7dmFyIGluc2lkZVN0YXJ0PVBvcyhzdGFydCxvcGVuKzEpLGluc2lkZUVuZD1Qb3MoZW5kLGNsb3NlKzEpCmlmKGNsb3NlPT0tMXx8IS9jb21tZW50Ly50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoaW5zaWRlU3RhcnQpKXx8IS9jb21tZW50Ly50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoaW5zaWRlRW5kKSl8fHNlbGYuZ2V0UmFuZ2UoaW5zaWRlU3RhcnQsaW5zaWRlRW5kLCJcbiIpLmluZGV4T2YoZW5kU3RyaW5nKT4tMSkKcmV0dXJuIGZhbHNlO3ZhciBsYXN0U3RhcnQ9c3RhcnRMaW5lLmxhc3RJbmRleE9mKHN0YXJ0U3RyaW5nLGZyb20uY2gpO3ZhciBmaXJzdEVuZD1sYXN0U3RhcnQ9PS0xPy0xOnN0YXJ0TGluZS5zbGljZSgwLGZyb20uY2gpLmluZGV4T2YoZW5kU3RyaW5nLGxhc3RTdGFydCtzdGFydFN0cmluZy5sZW5ndGgpO2lmKGxhc3RTdGFydCE9LTEmJmZpcnN0RW5kIT0tMSYmZmlyc3RFbmQrZW5kU3RyaW5nLmxlbmd0aCE9ZnJvbS5jaClyZXR1cm4gZmFsc2U7Zmlyc3RFbmQ9ZW5kTGluZS5pbmRleE9mKGVuZFN0cmluZyx0by5jaCk7dmFyIGFsbW9zdExhc3RTdGFydD1lbmRMaW5lLnNsaWNlKHRvLmNoKS5sYXN0SW5kZXhPZihzdGFydFN0cmluZyxmaXJzdEVuZC10by5jaCk7bGFzdFN0YXJ0PShmaXJzdEVuZD09LTF8fGFsbW9zdExhc3RTdGFydD09LTEpPy0xOnRvLmNoK2FsbW9zdExhc3RTdGFydDtpZihmaXJzdEVuZCE9LTEmJmxhc3RTdGFydCE9LTEmJmxhc3RTdGFydCE9dG8uY2gpcmV0dXJuIGZhbHNlO3NlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCl7c2VsZi5yZXBsYWNlUmFuZ2UoIiIsUG9zKGVuZCxjbG9zZS0ocGFkJiZlbmRMaW5lLnNsaWNlKGNsb3NlLXBhZC5sZW5ndGgsY2xvc2UpPT1wYWQ/cGFkLmxlbmd0aDowKSksUG9zKGVuZCxjbG9zZStlbmRTdHJpbmcubGVuZ3RoKSk7dmFyIG9wZW5FbmQ9b3BlbitzdGFydFN0cmluZy5sZW5ndGg7aWYocGFkJiZzdGFydExpbmUuc2xpY2Uob3BlbkVuZCxvcGVuRW5kK3BhZC5sZW5ndGgpPT1wYWQpb3BlbkVuZCs9cGFkLmxlbmd0aDtzZWxmLnJlcGxhY2VSYW5nZSgiIixQb3Moc3RhcnQsb3BlbiksUG9zKHN0YXJ0LG9wZW5FbmQpKTtpZihsZWFkKWZvcih2YXIgaT1zdGFydCsxO2k8PWVuZDsrK2kpe3ZhciBsaW5lPXNlbGYuZ2V0TGluZShpKSxmb3VuZD1saW5lLmluZGV4T2YobGVhZCk7aWYoZm91bmQ9PS0xfHxub25XUy50ZXN0KGxpbmUuc2xpY2UoMCxmb3VuZCkpKWNvbnRpbnVlO3ZhciBmb3VuZEVuZD1mb3VuZCtsZWFkLmxlbmd0aDtpZihwYWQmJmxpbmUuc2xpY2UoZm91bmRFbmQsZm91bmRFbmQrcGFkLmxlbmd0aCk9PXBhZClmb3VuZEVuZCs9cGFkLmxlbmd0aDtzZWxmLnJlcGxhY2VSYW5nZSgiIixQb3MoaSxmb3VuZCksUG9zKGksZm91bmRFbmQpKTt9fSk7cmV0dXJuIHRydWU7fSk7fSk7OyhmdW5jdGlvbihtb2Qpe2lmKHR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCIpCm1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpCmRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sbW9kKTtlbHNlCm1vZChDb2RlTWlycm9yKTt9KShmdW5jdGlvbihDb2RlTWlycm9yKXsidXNlIHN0cmljdCI7Q29kZU1pcnJvci5vdmVybGF5TW9kZT1mdW5jdGlvbihiYXNlLG92ZXJsYXksY29tYmluZSl7cmV0dXJue3N0YXJ0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm57YmFzZTpDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZSksb3ZlcmxheTpDb2RlTWlycm9yLnN0YXJ0U3RhdGUob3ZlcmxheSksYmFzZVBvczowLGJhc2VDdXI6bnVsbCxvdmVybGF5UG9zOjAsb3ZlcmxheUN1cjpudWxsLHN0cmVhbVNlZW46bnVsbH07fSxjb3B5U3RhdGU6ZnVuY3Rpb24oc3RhdGUpe3JldHVybntiYXNlOkNvZGVNaXJyb3IuY29weVN0YXRlKGJhc2Usc3RhdGUuYmFzZSksb3ZlcmxheTpDb2RlTWlycm9yLmNvcHlTdGF0ZShvdmVybGF5LHN0YXRlLm92ZXJsYXkpLGJhc2VQb3M6c3RhdGUuYmFzZVBvcyxiYXNlQ3VyOm51bGwsb3ZlcmxheVBvczpzdGF0ZS5vdmVybGF5UG9zLG92ZXJsYXlDdXI6bnVsbH07fSx0b2tlbjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpe2lmKHN0cmVhbSE9c3RhdGUuc3RyZWFtU2Vlbnx8TWF0aC5taW4oc3RhdGUuYmFzZVBvcyxzdGF0ZS5vdmVybGF5UG9zKTxzdHJlYW0uc3RhcnQpe3N0YXRlLnN0cmVhbVNlZW49c3RyZWFtO3N0YXRlLmJhc2VQb3M9c3RhdGUub3ZlcmxheVBvcz1zdHJlYW0uc3RhcnQ7fQppZihzdHJlYW0uc3RhcnQ9PXN0YXRlLmJhc2VQb3Mpe3N0YXRlLmJhc2VDdXI9YmFzZS50b2tlbihzdHJlYW0sc3RhdGUuYmFzZSk7c3RhdGUuYmFzZVBvcz1zdHJlYW0ucG9zO30KaWYoc3RyZWFtLnN0YXJ0PT1zdGF0ZS5vdmVybGF5UG9zKXtzdHJlYW0ucG9zPXN0cmVhbS5zdGFydDtzdGF0ZS5vdmVybGF5Q3VyPW92ZXJsYXkudG9rZW4oc3RyZWFtLHN0YXRlLm92ZXJsYXkpO3N0YXRlLm92ZXJsYXlQb3M9c3RyZWFtLnBvczt9CnN0cmVhbS5wb3M9TWF0aC5taW4oc3RhdGUuYmFzZVBvcyxzdGF0ZS5vdmVybGF5UG9zKTtpZihzdGF0ZS5vdmVybGF5Q3VyPT1udWxsKXJldHVybiBzdGF0ZS5iYXNlQ3VyO2Vsc2UgaWYoc3RhdGUuYmFzZUN1ciE9bnVsbCYmc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zfHxjb21iaW5lJiZzdGF0ZS5vdmVybGF5LmNvbWJpbmVUb2tlbnM9PW51bGwpCnJldHVybiBzdGF0ZS5iYXNlQ3VyKyIgIitzdGF0ZS5vdmVybGF5Q3VyO2Vsc2UgcmV0dXJuIHN0YXRlLm92ZXJsYXlDdXI7fSxpbmRlbnQ6YmFzZS5pbmRlbnQmJmZ1bmN0aW9uKHN0YXRlLHRleHRBZnRlcil7cmV0dXJuIGJhc2UuaW5kZW50KHN0YXRlLmJhc2UsdGV4dEFmdGVyKTt9LGVsZWN0cmljQ2hhcnM6YmFzZS5lbGVjdHJpY0NoYXJzLGlubmVyTW9kZTpmdW5jdGlvbihzdGF0ZSl7cmV0dXJue3N0YXRlOnN0YXRlLmJhc2UsbW9kZTpiYXNlfTt9LGJsYW5rTGluZTpmdW5jdGlvbihzdGF0ZSl7dmFyIGJhc2VUb2tlbixvdmVybGF5VG9rZW47aWYoYmFzZS5ibGFua0xpbmUpYmFzZVRva2VuPWJhc2UuYmxhbmtMaW5lKHN0YXRlLmJhc2UpO2lmKG92ZXJsYXkuYmxhbmtMaW5lKW92ZXJsYXlUb2tlbj1vdmVybGF5LmJsYW5rTGluZShzdGF0ZS5vdmVybGF5KTtyZXR1cm4gb3ZlcmxheVRva2VuPT1udWxsP2Jhc2VUb2tlbjooY29tYmluZSYmYmFzZVRva2VuIT1udWxsP2Jhc2VUb2tlbisiICIrb3ZlcmxheVRva2VuOm92ZXJsYXlUb2tlbik7fX07fTt9KTs7KGZ1bmN0aW9uKG1vZCl7aWYodHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IikKbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCkKZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSxtb2QpO2Vsc2UKbW9kKENvZGVNaXJyb3IpO30pKGZ1bmN0aW9uKENvZGVNaXJyb3IpeyJ1c2Ugc3RyaWN0Ijt2YXIgV1JBUF9DTEFTUz0iQ29kZU1pcnJvci1hY3RpdmVsaW5lIjt2YXIgQkFDS19DTEFTUz0iQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQiO3ZhciBHVVRUX0NMQVNTPSJDb2RlTWlycm9yLWFjdGl2ZWxpbmUtZ3V0dGVyIjtDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic3R5bGVBY3RpdmVMaW5lIixmYWxzZSxmdW5jdGlvbihjbSx2YWwsb2xkKXt2YXIgcHJldj1vbGQ9PUNvZGVNaXJyb3IuSW5pdD9mYWxzZTpvbGQ7aWYodmFsPT1wcmV2KXJldHVybgppZihwcmV2KXtjbS5vZmYoImJlZm9yZVNlbGVjdGlvbkNoYW5nZSIsc2VsZWN0aW9uQ2hhbmdlKTtjbGVhckFjdGl2ZUxpbmVzKGNtKTtkZWxldGUgY20uc3RhdGUuYWN0aXZlTGluZXM7fQppZih2YWwpe2NtLnN0YXRlLmFjdGl2ZUxpbmVzPVtdO3VwZGF0ZUFjdGl2ZUxpbmVzKGNtLGNtLmxpc3RTZWxlY3Rpb25zKCkpO2NtLm9uKCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiLHNlbGVjdGlvbkNoYW5nZSk7fX0pO2Z1bmN0aW9uIGNsZWFyQWN0aXZlTGluZXMoY20pe2Zvcih2YXIgaT0wO2k8Y20uc3RhdGUuYWN0aXZlTGluZXMubGVuZ3RoO2krKyl7Y20ucmVtb3ZlTGluZUNsYXNzKGNtLnN0YXRlLmFjdGl2ZUxpbmVzW2ldLCJ3cmFwIixXUkFQX0NMQVNTKTtjbS5yZW1vdmVMaW5lQ2xhc3MoY20uc3RhdGUuYWN0aXZlTGluZXNbaV0sImJhY2tncm91bmQiLEJBQ0tfQ0xBU1MpO2NtLnJlbW92ZUxpbmVDbGFzcyhjbS5zdGF0ZS5hY3RpdmVMaW5lc1tpXSwiZ3V0dGVyIixHVVRUX0NMQVNTKTt9fQpmdW5jdGlvbiBzYW1lQXJyYXkoYSxiKXtpZihhLmxlbmd0aCE9Yi5sZW5ndGgpcmV0dXJuIGZhbHNlO2Zvcih2YXIgaT0wO2k8YS5sZW5ndGg7aSsrKQppZihhW2ldIT1iW2ldKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9CmZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUxpbmVzKGNtLHJhbmdlcyl7dmFyIGFjdGl2ZT1bXTtmb3IodmFyIGk9MDtpPHJhbmdlcy5sZW5ndGg7aSsrKXt2YXIgcmFuZ2U9cmFuZ2VzW2ldO3ZhciBvcHRpb249Y20uZ2V0T3B0aW9uKCJzdHlsZUFjdGl2ZUxpbmUiKTtpZih0eXBlb2Ygb3B0aW9uPT0ib2JqZWN0IiYmb3B0aW9uLm5vbkVtcHR5P3JhbmdlLmFuY2hvci5saW5lIT1yYW5nZS5oZWFkLmxpbmU6IXJhbmdlLmVtcHR5KCkpCmNvbnRpbnVlCnZhciBsaW5lPWNtLmdldExpbmVIYW5kbGVWaXN1YWxTdGFydChyYW5nZS5oZWFkLmxpbmUpO2lmKGFjdGl2ZVthY3RpdmUubGVuZ3RoLTFdIT1saW5lKWFjdGl2ZS5wdXNoKGxpbmUpO30KaWYoc2FtZUFycmF5KGNtLnN0YXRlLmFjdGl2ZUxpbmVzLGFjdGl2ZSkpcmV0dXJuO2NtLm9wZXJhdGlvbihmdW5jdGlvbigpe2NsZWFyQWN0aXZlTGluZXMoY20pO2Zvcih2YXIgaT0wO2k8YWN0aXZlLmxlbmd0aDtpKyspe2NtLmFkZExpbmVDbGFzcyhhY3RpdmVbaV0sIndyYXAiLFdSQVBfQ0xBU1MpO2NtLmFkZExpbmVDbGFzcyhhY3RpdmVbaV0sImJhY2tncm91bmQiLEJBQ0tfQ0xBU1MpO2NtLmFkZExpbmVDbGFzcyhhY3RpdmVbaV0sImd1dHRlciIsR1VUVF9DTEFTUyk7fQpjbS5zdGF0ZS5hY3RpdmVMaW5lcz1hY3RpdmU7fSk7fQpmdW5jdGlvbiBzZWxlY3Rpb25DaGFuZ2UoY20sc2VsKXt1cGRhdGVBY3RpdmVMaW5lcyhjbSxzZWwucmFuZ2VzKTt9fSk7O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjbS9jb2RlbWlycm9yLmNzcyJdPSIvKiBTVE9QICovXG5cbi8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBjb250YWlucyBzdHlsZXMgcmVsYXRlZCB0byB0aGUgbWVjaGFuaWNzIG9mXG4gICB0aGUgZWRpdG9yLiBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHRvdWNoIHRoZW0uICovXG5cbiAgIC5Db2RlTWlycm9yIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgfVxuXG4gIC5Db2RlTWlycm9yLXNjcm9sbCB7XG4gICAgb3ZlcmZsb3c6IHNjcm9sbCAhaW1wb3J0YW50OyAvKiBUaGluZ3Mgd2lsbCBicmVhayBpZiB0aGlzIGlzIG92ZXJyaWRkZW4gKi9cbiAgICAvKiAzMHB4IGlzIHRoZSBtYWdpYyBtYXJnaW4gdXNlZCB0byBoaWRlIHRoZSBlbGVtZW50J3MgcmVhbCBzY3JvbGxiYXJzICovXG4gICAgLyogU2VlIG92ZXJmbG93OiBoaWRkZW4gaW4gLkNvZGVNaXJyb3IgKi9cbiAgICBtYXJnaW4tYm90dG9tOiAtMzBweDsgbWFyZ2luLXJpZ2h0OiAtMzBweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMzBweDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3V0bGluZTogbm9uZTsgLyogUHJldmVudCBkcmFnZ2luZyBmcm9tIGhpZ2hsaWdodGluZyB0aGUgZWxlbWVudCAqL1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuICAuQ29kZU1pcnJvci1zaXplciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJvcmRlci1yaWdodDogMzBweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIC8qIFRoZSBmYWtlLCB2aXNpYmxlIHNjcm9sbGJhcnMuIFVzZWQgdG8gZm9yY2UgcmVkcmF3IGR1cmluZyBzY3JvbGxpbmdcbiAgICAgYmVmb3JlIGFjdHVhbCBzY3JvbGxpbmcgaGFwcGVucywgdGh1cyBwcmV2ZW50aW5nIHNoYWtpbmcgYW5kXG4gICAgIGZsaWNrZXJpbmcgYXJ0aWZhY3RzLiAqL1xuICAuQ29kZU1pcnJvci12c2Nyb2xsYmFyLCAuQ29kZU1pcnJvci1oc2Nyb2xsYmFyLCAuQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyLCAuQ29kZU1pcnJvci1ndXR0ZXItZmlsbGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNjtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gIC5Db2RlTWlycm9yLXZzY3JvbGxiYXIge1xuICAgIHJpZ2h0OiAwOyB0b3A6IDA7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICAuQ29kZU1pcnJvci1oc2Nyb2xsYmFyIHtcbiAgICBib3R0b206IDA7IGxlZnQ6IDA7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbiAgfVxuICAuQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyIHtcbiAgICByaWdodDogMDsgYm90dG9tOiAwO1xuICB9XG4gIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIge1xuICAgIGxlZnQ6IDA7IGJvdHRvbTogMDtcbiAgfVxuXG4gIC5Db2RlTWlycm9yLWd1dHRlcnMge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwO1xuICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogMztcbiAgfVxuICAuQ29kZU1pcnJvci1ndXR0ZXIge1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIG1hcmdpbi1ib3R0b206IC0zMHB4O1xuICB9XG4gIC5Db2RlTWlycm9yLWd1dHRlci13cmFwcGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogNDtcbiAgICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7IGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiA0O1xuICB9XG4gIC5Db2RlTWlycm9yLWd1dHRlci1lbHQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgei1pbmRleDogNDtcbiAgfVxuICAuQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlciA6OnNlbGVjdGlvbiB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50IH1cbiAgLkNvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXIgOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50IH1cblxuICAuQ29kZU1pcnJvci1saW5lcyB7XG4gICAgY3Vyc29yOiB0ZXh0O1xuICAgIG1pbi1oZWlnaHQ6IDFweDsgLyogcHJldmVudHMgY29sbGFwc2luZyBiZWZvcmUgZmlyc3QgZHJhdyAqL1xuICB9XG4gIC5Db2RlTWlycm9yIHByZSB7XG4gICAgLyogUmVzZXQgc29tZSBzdHlsZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgcGFnZSBtaWdodCBoYXZlIHNldCAqL1xuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOyBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci13aWR0aDogMDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC13cmFwOiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgei1pbmRleDogMjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtd2Via2l0LWZvbnQtdmFyaWFudC1saWdhdHVyZXM6IGNvbnRleHR1YWw7XG4gICAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29udGV4dHVhbDtcbiAgfVxuICAuQ29kZU1pcnJvci13cmFwIHByZSB7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gIH1cblxuICAuQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiAwO1xuICB9XG5cbiAgLkNvZGVNaXJyb3ItbGluZXdpZGdldCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDI7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gIH1cblxuICAuQ29kZU1pcnJvci13aWRnZXQge31cblxuICAuQ29kZU1pcnJvci1ydGwgcHJlIHsgZGlyZWN0aW9uOiBydGw7IH1cblxuICAuQ29kZU1pcnJvci1jb2RlIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5cbiAgLyogRm9yY2UgY29udGVudC1ib3ggc2l6aW5nIGZvciB0aGUgZWxlbWVudHMgd2hlcmUgd2UgZXhwZWN0IGl0ICovXG4gIC5Db2RlTWlycm9yLXNjcm9sbCxcbiAgLkNvZGVNaXJyb3Itc2l6ZXIsXG4gIC5Db2RlTWlycm9yLWd1dHRlcixcbiAgLkNvZGVNaXJyb3ItZ3V0dGVycyxcbiAgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgfVxuXG4gIC5Db2RlTWlycm9yLW1lYXN1cmUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIH1cblxuICAuQ29kZU1pcnJvci1jdXJzb3Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuICAuQ29kZU1pcnJvci1tZWFzdXJlIHByZSB7IHBvc2l0aW9uOiBzdGF0aWM7IH1cblxuICBkaXYuQ29kZU1pcnJvci1jdXJzb3JzIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDM7XG4gIH1cbiAgZGl2LkNvZGVNaXJyb3ItZHJhZ2N1cnNvcnMge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cblxuICAuQ29kZU1pcnJvci1mb2N1c2VkIGRpdi5Db2RlTWlycm9yLWN1cnNvcnMge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cblxuICAuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNkOWQ5ZDk7IH1cbiAgLkNvZGVNaXJyb3ItZm9jdXNlZCAuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNkN2Q0ZjA7IH1cbiAgLkNvZGVNaXJyb3ItY3Jvc3NoYWlyIHsgY3Vyc29yOiBjcm9zc2hhaXI7IH1cbiAgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNkN2Q0ZjA7IH1cbiAgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNkN2Q0ZjA7IH1cblxuICAuY20tc2VhcmNoaW5nIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDAsIC40KTtcbiAgfVxuXG4gIC8qIFVzZWQgdG8gZm9yY2UgYSBib3JkZXIgbW9kZWwgZm9yIGEgbm9kZSAqL1xuICAuY20tZm9yY2UtYm9yZGVyIHsgcGFkZGluZy1yaWdodDogLjFweDsgfVxuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgLyogSGlkZSB0aGUgY3Vyc29yIHdoZW4gcHJpbnRpbmcgKi9cbiAgICAuQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1jdXJzb3JzIHtcbiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gIH1cblxuICAvKiBTZWUgaXNzdWUgIzI5MDEgKi9cbiAgLmNtLXRhYi13cmFwLWhhY2s6YWZ0ZXIgeyBjb250ZW50OiAnJzsgfVxuXG4gIC8qIEhlbHAgdXNlcnMgdXNlIG1hcmtzZWxlY3Rpb24gdG8gc2FmZWx5IHN0eWxlIHRleHQgYmFja2dyb3VuZCAqL1xuICBzcGFuLkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0IHsgYmFja2dyb3VuZDogbm9uZTsgfVxuXG4vKiMgc291cmNlVVJMPWNtL2NvZGVtaXJyb3IuY3NzICovIjtDb2xvclBpY2tlci5Db250cmFzdEluZm89Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9oc3ZhPW51bGw7dGhpcy5fZmdDb2xvcj1udWxsO3RoaXMuX2JnQ29sb3I9bnVsbDt0aGlzLl9jb250cmFzdFJhdGlvPW51bGw7dGhpcy5fY29udHJhc3RSYXRpb1RocmVzaG9sZHM9bnVsbDt0aGlzLl9jb2xvclN0cmluZz0nJzt0aGlzLl9pc051bGw9dHJ1ZTt9CnVwZGF0ZShjb250cmFzdEluZm8pe3RoaXMuX2lzTnVsbD10cnVlO3RoaXMuX2NvbnRyYXN0UmF0aW89bnVsbDt0aGlzLl9jb250cmFzdFJhdGlvVGhyZXNob2xkcz1udWxsO3RoaXMuX2JnQ29sb3I9bnVsbDtpZihjb250cmFzdEluZm8uY29tcHV0ZWRGb250U2l6ZSYmY29udHJhc3RJbmZvLmNvbXB1dGVkRm9udFdlaWdodCYmY29udHJhc3RJbmZvLmNvbXB1dGVkQm9keUZvbnRTaXplKXt0aGlzLl9pc051bGw9ZmFsc2U7Y29uc3QgaXNMYXJnZUZvbnQ9Q29sb3JQaWNrZXIuQ29udHJhc3RJbmZvLmNvbXB1dGVJc0xhcmdlRm9udChjb250cmFzdEluZm8uY29tcHV0ZWRGb250U2l6ZSxjb250cmFzdEluZm8uY29tcHV0ZWRGb250V2VpZ2h0LGNvbnRyYXN0SW5mby5jb21wdXRlZEJvZHlGb250U2l6ZSk7dGhpcy5fY29udHJhc3RSYXRpb1RocmVzaG9sZHM9Q29sb3JQaWNrZXIuQ29udHJhc3RJbmZvLl9Db250cmFzdFRocmVzaG9sZHNbKGlzTGFyZ2VGb250PydsYXJnZUZvbnQnOidub3JtYWxGb250JyldO30KaWYoY29udHJhc3RJbmZvLmJhY2tncm91bmRDb2xvcnMmJmNvbnRyYXN0SW5mby5iYWNrZ3JvdW5kQ29sb3JzLmxlbmd0aD09PTEpe2NvbnN0IGJnQ29sb3JUZXh0PWNvbnRyYXN0SW5mby5iYWNrZ3JvdW5kQ29sb3JzWzBdO2NvbnN0IGJnQ29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGJnQ29sb3JUZXh0KTtpZihiZ0NvbG9yKQp0aGlzLl9zZXRCZ0NvbG9ySW50ZXJuYWwoYmdDb2xvcik7fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhDb2xvclBpY2tlci5Db250cmFzdEluZm8uRXZlbnRzLkNvbnRyYXN0SW5mb1VwZGF0ZWQpO30KaXNOdWxsKCl7cmV0dXJuIHRoaXMuX2lzTnVsbDt9CnNldENvbG9yKGhzdmEsY29sb3JTdHJpbmcpe3RoaXMuX2hzdmE9aHN2YTt0aGlzLl9mZ0NvbG9yPUNvbW1vbi5Db2xvci5mcm9tSFNWQShoc3ZhKTt0aGlzLl9jb2xvclN0cmluZz1jb2xvclN0cmluZzt0aGlzLl91cGRhdGVDb250cmFzdFJhdGlvKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29sb3JQaWNrZXIuQ29udHJhc3RJbmZvLkV2ZW50cy5Db250cmFzdEluZm9VcGRhdGVkKTt9CmNvbnRyYXN0UmF0aW8oKXtyZXR1cm4gdGhpcy5fY29udHJhc3RSYXRpbzt9CmNvbG9yU3RyaW5nKCl7cmV0dXJuIHRoaXMuX2NvbG9yU3RyaW5nO30KaHN2YSgpe3JldHVybiB0aGlzLl9oc3ZhO30Kc2V0QmdDb2xvcihiZ0NvbG9yKXt0aGlzLl9zZXRCZ0NvbG9ySW50ZXJuYWwoYmdDb2xvcik7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29sb3JQaWNrZXIuQ29udHJhc3RJbmZvLkV2ZW50cy5Db250cmFzdEluZm9VcGRhdGVkKTt9Cl9zZXRCZ0NvbG9ySW50ZXJuYWwoYmdDb2xvcil7dGhpcy5fYmdDb2xvcj1iZ0NvbG9yO2lmKCF0aGlzLl9mZ0NvbG9yKQpyZXR1cm47Y29uc3QgZmdSR0JBPXRoaXMuX2ZnQ29sb3IucmdiYSgpO2lmKGJnQ29sb3IuaGFzQWxwaGEpe2NvbnN0IGJsZW5kZWRSR0JBPVtdO0NvbW1vbi5Db2xvci5ibGVuZENvbG9ycyhiZ0NvbG9yLnJnYmEoKSxmZ1JHQkEsYmxlbmRlZFJHQkEpO3RoaXMuX2JnQ29sb3I9bmV3IENvbW1vbi5Db2xvcihibGVuZGVkUkdCQSxDb21tb24uQ29sb3IuRm9ybWF0LlJHQkEpO30KdGhpcy5fY29udHJhc3RSYXRpbz1Db21tb24uQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpbyhmZ1JHQkEsdGhpcy5fYmdDb2xvci5yZ2JhKCkpO30KYmdDb2xvcigpe3JldHVybiB0aGlzLl9iZ0NvbG9yO30KX3VwZGF0ZUNvbnRyYXN0UmF0aW8oKXtpZighdGhpcy5fYmdDb2xvcnx8IXRoaXMuX2ZnQ29sb3IpCnJldHVybjt0aGlzLl9jb250cmFzdFJhdGlvPUNvbW1vbi5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvKHRoaXMuX2ZnQ29sb3IucmdiYSgpLHRoaXMuX2JnQ29sb3IucmdiYSgpKTt9CmNvbnRyYXN0UmF0aW9UaHJlc2hvbGQobGV2ZWwpe2lmKCF0aGlzLl9jb250cmFzdFJhdGlvVGhyZXNob2xkcykKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX2NvbnRyYXN0UmF0aW9UaHJlc2hvbGRzW2xldmVsXTt9CnN0YXRpYyBjb21wdXRlSXNMYXJnZUZvbnQoZm9udFNpemUsZm9udFdlaWdodCxib2R5Rm9udFNpemUpe2NvbnN0IGJvbGRXZWlnaHRzPVsnYm9sZCcsJ2JvbGRlcicsJzYwMCcsJzcwMCcsJzgwMCcsJzkwMCddO2NvbnN0IGZvbnRTaXplUHg9cGFyc2VGbG9hdChmb250U2l6ZS5yZXBsYWNlKCdweCcsJycpKTtjb25zdCBpc0JvbGQ9KGJvbGRXZWlnaHRzLmluZGV4T2YoZm9udFdlaWdodCkhPT0tMSk7Y29uc3QgZm9udFNpemVQdD1mb250U2l6ZVB4KjcyLzk2O2lmKGlzQm9sZCkKcmV0dXJuIGZvbnRTaXplUHQ+PTE0O2Vsc2UKcmV0dXJuIGZvbnRTaXplUHQ+PTE4O319O0NvbG9yUGlja2VyLkNvbnRyYXN0SW5mby5FdmVudHM9e0NvbnRyYXN0SW5mb1VwZGF0ZWQ6U3ltYm9sKCdDb250cmFzdEluZm9VcGRhdGVkJyl9O0NvbG9yUGlja2VyLkNvbnRyYXN0SW5mby5fQ29udHJhc3RUaHJlc2hvbGRzPXtsYXJnZUZvbnQ6e2FhOjMuMCxhYWE6NC41fSxub3JtYWxGb250OnthYTo0LjUsYWFhOjcuMH19OztDb2xvclBpY2tlci5Db250cmFzdE92ZXJsYXk9Y2xhc3N7Y29uc3RydWN0b3IoY29udHJhc3RJbmZvLGNvbG9yRWxlbWVudCl7dGhpcy5fY29udHJhc3RJbmZvPWNvbnRyYXN0SW5mbzt0aGlzLl92aXNpYmxlPWZhbHNlO2NvbnN0IGNvbnRyYXN0UmF0aW9TVkc9Y29sb3JFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdzdmcnLCdzcGVjdHJ1bS1jb250cmFzdC1jb250YWluZXIgZmlsbCcpO3RoaXMuX2NvbnRyYXN0UmF0aW9MaW5lPWNvbnRyYXN0UmF0aW9TVkcuY3JlYXRlU1ZHQ2hpbGQoJ3BhdGgnLCdzcGVjdHJ1bS1jb250cmFzdC1saW5lJyk7dGhpcy5fd2lkdGg9MDt0aGlzLl9oZWlnaHQ9MDt0aGlzLl9jb250cmFzdFJhdGlvTGluZUJ1aWxkZXI9bmV3IENvbG9yUGlja2VyLkNvbnRyYXN0UmF0aW9MaW5lQnVpbGRlcih0aGlzLl9jb250cmFzdEluZm8pO3RoaXMuX2NvbnRyYXN0UmF0aW9MaW5lVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDApO3RoaXMuX2RyYXdDb250cmFzdFJhdGlvTGluZUJvdW5kPXRoaXMuX2RyYXdDb250cmFzdFJhdGlvTGluZS5iaW5kKHRoaXMpO3RoaXMuX2NvbnRyYXN0SW5mby5hZGRFdmVudExpc3RlbmVyKENvbG9yUGlja2VyLkNvbnRyYXN0SW5mby5FdmVudHMuQ29udHJhc3RJbmZvVXBkYXRlZCx0aGlzLl91cGRhdGUuYmluZCh0aGlzKSk7fQpfdXBkYXRlKCl7aWYoIXRoaXMuX3Zpc2libGV8fHRoaXMuX2NvbnRyYXN0SW5mby5pc051bGwoKXx8IXRoaXMuX2NvbnRyYXN0SW5mby5jb250cmFzdFJhdGlvKCkpCnJldHVybjt0aGlzLl9jb250cmFzdFJhdGlvTGluZVRocm90dGxlci5zY2hlZHVsZSh0aGlzLl9kcmF3Q29udHJhc3RSYXRpb0xpbmVCb3VuZCk7fQpzZXREaW1lbnNpb25zKHdpZHRoLGhlaWdodCl7dGhpcy5fd2lkdGg9d2lkdGg7dGhpcy5faGVpZ2h0PWhlaWdodDt0aGlzLl91cGRhdGUoKTt9CnNldFZpc2libGUodmlzaWJsZSl7dGhpcy5fdmlzaWJsZT12aXNpYmxlO3RoaXMuX2NvbnRyYXN0UmF0aW9MaW5lLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXZpc2libGUpO3RoaXMuX3VwZGF0ZSgpO30KX2RyYXdDb250cmFzdFJhdGlvTGluZSgpe2NvbnN0IHBhdGg9dGhpcy5fY29udHJhc3RSYXRpb0xpbmVCdWlsZGVyLmRyYXdDb250cmFzdFJhdGlvTGluZSh0aGlzLl93aWR0aCx0aGlzLl9oZWlnaHQpO2lmKHBhdGgpCnRoaXMuX2NvbnRyYXN0UmF0aW9MaW5lLnNldEF0dHJpYnV0ZSgnZCcscGF0aCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319O0NvbG9yUGlja2VyLkNvbnRyYXN0UmF0aW9MaW5lQnVpbGRlcj1jbGFzc3tjb25zdHJ1Y3Rvcihjb250cmFzdEluZm8pe3RoaXMuX2NvbnRyYXN0SW5mbz1jb250cmFzdEluZm87dGhpcy5fYmdDb2xvckZvclByZXZpb3VzTGluZT1udWxsO3RoaXMuX2h1ZUZvclByZXZpb3VzTGluZT0wO3RoaXMuX2FscGhhRm9yUHJldmlvdXNMaW5lPTA7fQpkcmF3Q29udHJhc3RSYXRpb0xpbmUod2lkdGgsaGVpZ2h0KXtjb25zdCByZXF1aXJlZENvbnRyYXN0PXRoaXMuX2NvbnRyYXN0SW5mby5jb250cmFzdFJhdGlvVGhyZXNob2xkKCdhYScpO2lmKCF3aWR0aHx8IWhlaWdodHx8IXJlcXVpcmVkQ29udHJhc3QpCnJldHVybiBudWxsO2NvbnN0IGRTPTAuMDI7Y29uc3QgZXBzaWxvbj0wLjAwMDI7Y29uc3QgSD0wO2NvbnN0IFM9MTtjb25zdCBWPTI7Y29uc3QgQT0zO2NvbnN0IGhzdmE9dGhpcy5fY29udHJhc3RJbmZvLmhzdmEoKTtjb25zdCBiZ0NvbG9yPXRoaXMuX2NvbnRyYXN0SW5mby5iZ0NvbG9yKCk7aWYoIWhzdmF8fCFiZ0NvbG9yKQpyZXR1cm4gbnVsbDtjb25zdCBiZ0NvbG9yU3RyaW5nPWJnQ29sb3IuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTtpZihoc3ZhW0hdPT09dGhpcy5faHVlRm9yUHJldmlvdXNMaW5lJiZoc3ZhW0FdPT09dGhpcy5fYWxwaGFGb3JQcmV2aW91c0xpbmUmJmJnQ29sb3JTdHJpbmc9PT10aGlzLl9iZ0NvbG9yRm9yUHJldmlvdXNMaW5lKQpyZXR1cm4gbnVsbDtjb25zdCBmZ1JHQkE9W107Q29tbW9uLkNvbG9yLmhzdmEycmdiYShoc3ZhLGZnUkdCQSk7Y29uc3QgYmdSR0JBPWJnQ29sb3IucmdiYSgpO2NvbnN0IGJnTHVtaW5hbmNlPUNvbW1vbi5Db2xvci5sdW1pbmFuY2UoYmdSR0JBKTtjb25zdCBibGVuZGVkUkdCQT1bXTtDb21tb24uQ29sb3IuYmxlbmRDb2xvcnMoZmdSR0JBLGJnUkdCQSxibGVuZGVkUkdCQSk7Y29uc3QgZmdMdW1pbmFuY2U9Q29tbW9uLkNvbG9yLmx1bWluYW5jZShibGVuZGVkUkdCQSk7Y29uc3QgZmdJc0xpZ2h0ZXI9ZmdMdW1pbmFuY2U+YmdMdW1pbmFuY2U7Y29uc3QgZGVzaXJlZEx1bWluYW5jZT1Db21tb24uQ29sb3IuZGVzaXJlZEx1bWluYW5jZShiZ0x1bWluYW5jZSxyZXF1aXJlZENvbnRyYXN0LGZnSXNMaWdodGVyKTtsZXQgbGFzdFY9aHN2YVtWXTtsZXQgY3VycmVudFNsb3BlPTA7Y29uc3QgY2FuZGlkYXRlSFNWQT1baHN2YVtIXSwwLDAsaHN2YVtBXV07bGV0IHBhdGhCdWlsZGVyPVtdO2NvbnN0IGNhbmRpZGF0ZVJHQkE9W107Q29tbW9uLkNvbG9yLmhzdmEycmdiYShjYW5kaWRhdGVIU1ZBLGNhbmRpZGF0ZVJHQkEpO0NvbW1vbi5Db2xvci5ibGVuZENvbG9ycyhjYW5kaWRhdGVSR0JBLGJnUkdCQSxibGVuZGVkUkdCQSk7ZnVuY3Rpb24gdXBkYXRlQ2FuZGlkYXRlQW5kQ29tcHV0ZURlbHRhKGluZGV4LHgpe2NhbmRpZGF0ZUhTVkFbaW5kZXhdPXg7Q29tbW9uLkNvbG9yLmhzdmEycmdiYShjYW5kaWRhdGVIU1ZBLGNhbmRpZGF0ZVJHQkEpO0NvbW1vbi5Db2xvci5ibGVuZENvbG9ycyhjYW5kaWRhdGVSR0JBLGJnUkdCQSxibGVuZGVkUkdCQSk7cmV0dXJuIENvbW1vbi5Db2xvci5sdW1pbmFuY2UoYmxlbmRlZFJHQkEpLWRlc2lyZWRMdW1pbmFuY2U7fQpmdW5jdGlvbiBhcHByb2FjaChpbmRleCl7bGV0IHg9Y2FuZGlkYXRlSFNWQVtpbmRleF07bGV0IG11bHRpcGxpZXI9MTtsZXQgZEx1bWluYW5jZT11cGRhdGVDYW5kaWRhdGVBbmRDb21wdXRlRGVsdGEoaW5kZXgseCk7bGV0IHByZXZpb3VzU2lnbj1NYXRoLnNpZ24oZEx1bWluYW5jZSk7Zm9yKGxldCBndWFyZD0xMDA7Z3VhcmQ7Z3VhcmQtLSl7aWYoTWF0aC5hYnMoZEx1bWluYW5jZSk8ZXBzaWxvbikKcmV0dXJuIHg7Y29uc3Qgc2lnbj1NYXRoLnNpZ24oZEx1bWluYW5jZSk7aWYoc2lnbiE9PXByZXZpb3VzU2lnbil7bXVsdGlwbGllci89MjtwcmV2aW91c1NpZ249c2lnbjt9ZWxzZSBpZih4PDB8fHg+MSl7cmV0dXJuIG51bGw7fQp4Kz1tdWx0aXBsaWVyKihpbmRleD09PVY/LWRMdW1pbmFuY2U6ZEx1bWluYW5jZSk7ZEx1bWluYW5jZT11cGRhdGVDYW5kaWRhdGVBbmRDb21wdXRlRGVsdGEoaW5kZXgseCk7fQpjb25zb2xlLmVycm9yKCdMb29wIGV4aXRlZCB1bmV4cGVjdGVkbHknKTtyZXR1cm4gbnVsbDt9CmxldCBzO2ZvcihzPTA7czwxK2RTO3MrPWRTKXtzPU1hdGgubWluKDEscyk7Y2FuZGlkYXRlSFNWQVtTXT1zO2NhbmRpZGF0ZUhTVkFbVl09bGFzdFYrY3VycmVudFNsb3BlKmRTO2NvbnN0IHY9YXBwcm9hY2goVik7aWYodj09PW51bGwpCmJyZWFrO2N1cnJlbnRTbG9wZT1zPT09MD8wOih2LWxhc3RWKS9kUztsYXN0Vj12O3BhdGhCdWlsZGVyLnB1c2gocGF0aEJ1aWxkZXIubGVuZ3RoPydMJzonTScpO3BhdGhCdWlsZGVyLnB1c2goKHMqd2lkdGgpLnRvRml4ZWQoMikpO3BhdGhCdWlsZGVyLnB1c2goKCgxLXYpKmhlaWdodCkudG9GaXhlZCgyKSk7fQppZihzPDErZFMpe3MtPWRTO2NhbmRpZGF0ZUhTVkFbVl09MTtzPWFwcHJvYWNoKFMpO2lmKHMhPT1udWxsKQpwYXRoQnVpbGRlcj1wYXRoQnVpbGRlci5jb25jYXQoWydMJywocyp3aWR0aCkudG9GaXhlZCgyKSwnLTAuMSddKTt9CnRoaXMuX2JnQ29sb3JGb3JQcmV2aW91c0xpbmU9YmdDb2xvclN0cmluZzt0aGlzLl9odWVGb3JQcmV2aW91c0xpbmU9aHN2YVtIXTt0aGlzLl9hbHBoYUZvclByZXZpb3VzTGluZT1oc3ZhW0FdO3JldHVybiBwYXRoQnVpbGRlci5qb2luKCcgJyk7fX07O0NvbG9yUGlja2VyLkNvbnRyYXN0RGV0YWlscz1jbGFzc3tjb25zdHJ1Y3Rvcihjb250cmFzdEluZm8sY29udGVudEVsZW1lbnQsdG9nZ2xlTWFpbkNvbG9yUGlja2VyQ2FsbGJhY2ssZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2spe3RoaXMuX2NvbnRyYXN0SW5mbz1jb250cmFzdEluZm87dGhpcy5fZWxlbWVudD1jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyBjb2xsYXBzZWQnKTt0aGlzLl90b2dnbGVNYWluQ29sb3JQaWNrZXI9dG9nZ2xlTWFpbkNvbG9yUGlja2VyQ2FsbGJhY2s7dGhpcy5fZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2s9ZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2s7dGhpcy5fZXhwYW5kZWQ9ZmFsc2U7dGhpcy5fcGFzc2VzQUE9dHJ1ZTt0aGlzLl9jb250cmFzdFVua25vd249ZmFsc2U7dGhpcy5fdmlzaWJsZT1mYWxzZTtjb25zdCBjb250cmFzdFZhbHVlUm93PXRoaXMuX2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO2NvbnRyYXN0VmFsdWVSb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3RvcFJvd0NsaWNrZWQuYmluZCh0aGlzKSk7Y29uc3QgY29udHJhc3RWYWx1ZVJvd0NvbnRlbnRzPWNvbnRyYXN0VmFsdWVSb3cuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbnRhaW5lcicpO2NvbnRyYXN0VmFsdWVSb3dDb250ZW50cy5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdDb250cmFzdCByYXRpbycpKTt0aGlzLl9jb250cmFzdFZhbHVlQnViYmxlPWNvbnRyYXN0VmFsdWVSb3dDb250ZW50cy5jcmVhdGVDaGlsZCgnc3BhbicsJ2NvbnRyYXN0LWRldGFpbHMtdmFsdWUnKTt0aGlzLl9jb250cmFzdFZhbHVlPXRoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGUuY3JlYXRlQ2hpbGQoJ3NwYW4nKTt0aGlzLl9jb250cmFzdFZhbHVlQnViYmxlSWNvbnM9W107dGhpcy5fY29udHJhc3RWYWx1ZUJ1YmJsZUljb25zLnB1c2godGhpcy5fY29udHJhc3RWYWx1ZUJ1YmJsZS5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLWNoZWNrbWFyay1zcXVhcmUnKSkpO3RoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGVJY29ucy5wdXNoKHRoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGUuYXBwZW5kQ2hpbGQoVUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jaGVja21hcmstYmVoaW5kJykpKTt0aGlzLl9jb250cmFzdFZhbHVlQnViYmxlSWNvbnMucHVzaCh0aGlzLl9jb250cmFzdFZhbHVlQnViYmxlLmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tbm8nKSkpO3RoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGVJY29ucy5mb3JFYWNoKGJ1dHRvbj0+YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxldmVudD0+e0NvbG9yUGlja2VyLkNvbnRyYXN0RGV0YWlscy5fc2hvd0hlbHAoKTtldmVudC5jb25zdW1lKGZhbHNlKTt9KSk7Y29uc3QgZXhwYW5kVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignZXhwYW5kJyxjb250cmFzdFZhbHVlUm93Q29udGVudHMpO3RoaXMuX2V4cGFuZEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1Nob3cgbW9yZScpLCdzbWFsbGljb24tZXhwYW5kLW1vcmUnKTt0aGlzLl9leHBhbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9leHBhbmRCdXR0b25DbGlja2VkLmJpbmQodGhpcykpO1VJLkFSSUFVdGlscy5zZXRFeHBhbmRlZCh0aGlzLl9leHBhbmRCdXR0b24uZWxlbWVudCxmYWxzZSk7ZXhwYW5kVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9leHBhbmRCdXR0b24pO3RoaXMuX2V4cGFuZGVkRGV0YWlscz10aGlzLl9lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdleHBhbmRlZC1kZXRhaWxzJyk7dGhpcy5fZXhwYW5kZWREZXRhaWxzLmlkPSdleHBhbmRlZC1jb250cmFzdC1kZXRhaWxzJztVSS5BUklBVXRpbHMuc2V0Q29udHJvbHModGhpcy5fZXhwYW5kQnV0dG9uLmVsZW1lbnQsdGhpcy5fZXhwYW5kZWREZXRhaWxzKTt0aGlzLl9jb250cmFzdFRocmVzaG9sZHM9dGhpcy5fZXhwYW5kZWREZXRhaWxzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb250cmFzdC10aHJlc2hvbGRzJyk7dGhpcy5fY29udHJhc3RBQT10aGlzLl9jb250cmFzdFRocmVzaG9sZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbnRyYXN0LXRocmVzaG9sZCcpO3RoaXMuX2NvbnRyYXN0UGFzc0ZhaWxBQT10aGlzLl9jb250cmFzdEFBLmNyZWF0ZUNoaWxkKCdzcGFuJywnY29udHJhc3QtcGFzcy1mYWlsJyk7dGhpcy5fY29udHJhc3RBQUE9dGhpcy5fY29udHJhc3RUaHJlc2hvbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb250cmFzdC10aHJlc2hvbGQnKTt0aGlzLl9jb250cmFzdFBhc3NGYWlsQUFBPXRoaXMuX2NvbnRyYXN0QUFBLmNyZWF0ZUNoaWxkKCdzcGFuJywnY29udHJhc3QtcGFzcy1mYWlsJyk7dGhpcy5fY2hvb3NlQmdDb2xvcj10aGlzLl9leHBhbmRlZERldGFpbHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvbnRyYXN0LWNob29zZS1iZy1jb2xvcicpO3RoaXMuX2Nob29zZUJnQ29sb3IudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdQaWNrIGJhY2tncm91bmQgY29sb3InKTtjb25zdCBiZ0NvbG9yQ29udGFpbmVyPXRoaXMuX2V4cGFuZGVkRGV0YWlscy5jcmVhdGVDaGlsZCgnZGl2JywnYmFja2dyb3VuZC1jb2xvcicpO2NvbnN0IHBpY2tlclRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3NwZWN0cnVtLWV5ZS1kcm9wcGVyJyxiZ0NvbG9yQ29udGFpbmVyKTt0aGlzLl9iZ0NvbG9yUGlja2VyQnV0dG9uPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKENvbW1vbi5VSVN0cmluZygnVG9nZ2xlIGJhY2tncm91bmQgY29sb3IgcGlja2VyJyksJ2xhcmdlaWNvbi1leWVkcm9wcGVyJyk7dGhpcy5fYmdDb2xvclBpY2tlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3RvZ2dsZUJhY2tncm91bmRDb2xvclBpY2tlci5iaW5kKHRoaXMsdW5kZWZpbmVkKSk7cGlja2VyVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9iZ0NvbG9yUGlja2VyQnV0dG9uKTt0aGlzLl9iZ0NvbG9yUGlja2VkQm91bmQ9dGhpcy5fYmdDb2xvclBpY2tlZC5iaW5kKHRoaXMpO3RoaXMuX2JnQ29sb3JTd2F0Y2g9bmV3IENvbG9yUGlja2VyLkNvbnRyYXN0RGV0YWlscy5Td2F0Y2goYmdDb2xvckNvbnRhaW5lcik7dGhpcy5fY29udHJhc3RJbmZvLmFkZEV2ZW50TGlzdGVuZXIoQ29sb3JQaWNrZXIuQ29udHJhc3RJbmZvLkV2ZW50cy5Db250cmFzdEluZm9VcGRhdGVkLHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTt9Cl91cGRhdGUoKXtpZih0aGlzLl9jb250cmFzdEluZm8uaXNOdWxsKCkpe3RoaXMuc2V0VmlzaWJsZShmYWxzZSk7cmV0dXJuO30KdGhpcy5zZXRWaXNpYmxlKHRydWUpO2NvbnN0IGNvbnRyYXN0UmF0aW89dGhpcy5fY29udHJhc3RJbmZvLmNvbnRyYXN0UmF0aW8oKTtjb25zdCBiZ0NvbG9yPXRoaXMuX2NvbnRyYXN0SW5mby5iZ0NvbG9yKCk7aWYoIWNvbnRyYXN0UmF0aW98fCFiZ0NvbG9yKXt0aGlzLl9jb250cmFzdFVua25vd249dHJ1ZTt0aGlzLl9jb250cmFzdFZhbHVlLnRleHRDb250ZW50PScnO3RoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGUuY2xhc3NMaXN0LmFkZCgnY29udHJhc3QtdW5rbm93bicpO3RoaXMuX2Nob29zZUJnQ29sb3IuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5fY29udHJhc3RUaHJlc2hvbGRzLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3JldHVybjt9CnRoaXMuX2NvbnRyYXN0VW5rbm93bj1mYWxzZTt0aGlzLl9jaG9vc2VCZ0NvbG9yLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX2NvbnRyYXN0VGhyZXNob2xkcy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLl9jb250cmFzdFZhbHVlQnViYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbnRyYXN0LXVua25vd24nKTt0aGlzLl9jb250cmFzdFZhbHVlLnRleHRDb250ZW50PWNvbnRyYXN0UmF0aW8udG9GaXhlZCgyKTt0aGlzLl9iZ0NvbG9yU3dhdGNoLnNldEJhY2tncm91bmRDb2xvcihiZ0NvbG9yKTt0aGlzLl9iZ0NvbG9yU3dhdGNoLnNldFRleHRDb2xvcih0aGlzLl9jb250cmFzdEluZm8uY29sb3JTdHJpbmcoKSk7Y29uc3QgYWE9dGhpcy5fY29udHJhc3RJbmZvLmNvbnRyYXN0UmF0aW9UaHJlc2hvbGQoJ2FhJyk7dGhpcy5fcGFzc2VzQUE9dGhpcy5fY29udHJhc3RJbmZvLmNvbnRyYXN0UmF0aW8oKT49YWE7dGhpcy5fY29udHJhc3RQYXNzRmFpbEFBLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgbGFiZWxBQT10aGlzLl9jb250cmFzdFBhc3NGYWlsQUEuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdjb250cmFzdC1saW5rLWxhYmVsJyk7bGFiZWxBQS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0FBJyk7dGhpcy5fY29udHJhc3RQYXNzRmFpbEFBLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCc6ICVzJyxhYS50b0ZpeGVkKDEpKTtpZih0aGlzLl9wYXNzZXNBQSkKdGhpcy5fY29udHJhc3RQYXNzRmFpbEFBLmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tY2hlY2ttYXJrLXNxdWFyZScpKTtlbHNlCnRoaXMuX2NvbnRyYXN0UGFzc0ZhaWxBQS5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLW5vJykpO2NvbnN0IGFhYT10aGlzLl9jb250cmFzdEluZm8uY29udHJhc3RSYXRpb1RocmVzaG9sZCgnYWFhJyk7Y29uc3QgcGFzc2VzQUFBPXRoaXMuX2NvbnRyYXN0SW5mby5jb250cmFzdFJhdGlvKCk+PWFhYTt0aGlzLl9jb250cmFzdFBhc3NGYWlsQUFBLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgbGFiZWxBQUE9dGhpcy5fY29udHJhc3RQYXNzRmFpbEFBQS5jcmVhdGVDaGlsZCgnc3BhbicsJ2NvbnRyYXN0LWxpbmstbGFiZWwnKTtsYWJlbEFBQS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0FBQScpO3RoaXMuX2NvbnRyYXN0UGFzc0ZhaWxBQUEuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJzogJXMnLGFhYS50b0ZpeGVkKDEpKTtpZihwYXNzZXNBQUEpCnRoaXMuX2NvbnRyYXN0UGFzc0ZhaWxBQUEuYXBwZW5kQ2hpbGQoVUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jaGVja21hcmstc3F1YXJlJykpO2Vsc2UKdGhpcy5fY29udHJhc3RQYXNzRmFpbEFBQS5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLW5vJykpO1tsYWJlbEFBLGxhYmVsQUFBXS5mb3JFYWNoKGU9PmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT5Db2xvclBpY2tlci5Db250cmFzdERldGFpbHMuX3Nob3dIZWxwKCkpKTt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2NvbnRyYXN0LWZhaWwnLCF0aGlzLl9wYXNzZXNBQSk7dGhpcy5fY29udHJhc3RWYWx1ZUJ1YmJsZS5jbGFzc0xpc3QudG9nZ2xlKCdjb250cmFzdC1hYScsdGhpcy5fcGFzc2VzQUEpO3RoaXMuX2NvbnRyYXN0VmFsdWVCdWJibGUuY2xhc3NMaXN0LnRvZ2dsZSgnY29udHJhc3QtYWFhJyxwYXNzZXNBQUEpO30Kc3RhdGljIF9zaG93SGVscCgpe0luc3BlY3RvckZyb250ZW5kSG9zdC5vcGVuSW5OZXdUYWIoJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmxlLXN0eWxlcyNjb2xvcl9hbmRfY29udHJhc3QnKTt9CnNldFZpc2libGUodmlzaWJsZSl7dGhpcy5fdmlzaWJsZT12aXNpYmxlO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdmlzaWJsZSk7fQp2aXNpYmxlKCl7cmV0dXJuIHRoaXMuX3Zpc2libGU7fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQ7fQpfZXhwYW5kQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy5fY29udHJhc3RWYWx1ZUJ1YmJsZS5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5lbXB0eSgpO3RoaXMuX3RvZ2dsZUV4cGFuZGVkKCk7fQpfdG9wUm93Q2xpY2tlZChldmVudCl7dGhpcy5fY29udHJhc3RWYWx1ZUJ1YmJsZS5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5lbXB0eSgpO3RoaXMuX3RvZ2dsZUV4cGFuZGVkKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl90b2dnbGVFeHBhbmRlZCgpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZDtVSS5BUklBVXRpbHMuc2V0RXhwYW5kZWQodGhpcy5fZXhwYW5kQnV0dG9uLmVsZW1lbnQsdGhpcy5fZXhwYW5kZWQpO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJywhdGhpcy5fZXhwYW5kZWQpO2lmKHRoaXMuX2V4cGFuZGVkKXt0aGlzLl90b2dnbGVNYWluQ29sb3JQaWNrZXIoZmFsc2UpO3RoaXMuX2V4cGFuZEJ1dHRvbi5zZXRHbHlwaCgnc21hbGxpY29uLWV4cGFuZC1sZXNzJyk7dGhpcy5fZXhwYW5kQnV0dG9uLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnU2hvdyBsZXNzJykpO2lmKHRoaXMuX2NvbnRyYXN0VW5rbm93bikKdGhpcy5fdG9nZ2xlQmFja2dyb3VuZENvbG9yUGlja2VyKHRydWUpO31lbHNle3RoaXMuX3RvZ2dsZUJhY2tncm91bmRDb2xvclBpY2tlcihmYWxzZSk7dGhpcy5fZXhwYW5kQnV0dG9uLnNldEdseXBoKCdzbWFsbGljb24tZXhwYW5kLW1vcmUnKTt0aGlzLl9leHBhbmRCdXR0b24uc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdTaG93IG1vcmUnKSk7fQp0aGlzLl9leHBhbmRlZENoYW5nZWRDYWxsYmFjaygpO30KY29sbGFwc2UoKXt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7dGhpcy5fdG9nZ2xlQmFja2dyb3VuZENvbG9yUGlja2VyKGZhbHNlKTt0aGlzLl90b2dnbGVNYWluQ29sb3JQaWNrZXIoZmFsc2UpO30KZXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5fZXhwYW5kZWQ7fQpfdG9nZ2xlQmFja2dyb3VuZENvbG9yUGlja2VyKGVuYWJsZWQpe2lmKGVuYWJsZWQ9PT11bmRlZmluZWQpCmVuYWJsZWQ9IXRoaXMuX2JnQ29sb3JQaWNrZXJCdXR0b24udG9nZ2xlZCgpO3RoaXMuX2JnQ29sb3JQaWNrZXJCdXR0b24uc2V0VG9nZ2xlZChlbmFibGVkKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RXllRHJvcHBlckFjdGl2ZShlbmFibGVkKTtpZihlbmFibGVkKXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5FeWVEcm9wcGVyUGlja2VkQ29sb3IsdGhpcy5fYmdDb2xvclBpY2tlZEJvdW5kKTt9ZWxzZXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5FeWVEcm9wcGVyUGlja2VkQ29sb3IsdGhpcy5fYmdDb2xvclBpY2tlZEJvdW5kKTt9fQpfYmdDb2xvclBpY2tlZChldmVudCl7Y29uc3QgcmdiQ29sb3I9KGV2ZW50LmRhdGEpO2NvbnN0IHJnYmE9W3JnYkNvbG9yLnIscmdiQ29sb3IuZyxyZ2JDb2xvci5iLChyZ2JDb2xvci5hLzIuNTV8MCkvMTAwXTtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IuZnJvbVJHQkEocmdiYSk7dGhpcy5fY29udHJhc3RJbmZvLnNldEJnQ29sb3IoY29sb3IpO3RoaXMuX3RvZ2dsZUJhY2tncm91bmRDb2xvclBpY2tlcihmYWxzZSk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmJyaW5nVG9Gcm9udCgpO319O0NvbG9yUGlja2VyLkNvbnRyYXN0RGV0YWlscy5Td2F0Y2g9Y2xhc3N7Y29uc3RydWN0b3IocGFyZW50RWxlbWVudCl7dGhpcy5fcGFyZW50RWxlbWVudD1wYXJlbnRFbGVtZW50O3RoaXMuX3N3YXRjaEVsZW1lbnQ9cGFyZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N3YXRjaCBjb250cmFzdCBzd2F0Y2gtaW5uZXItd2hpdGUnKTt0aGlzLl9zd2F0Y2hJbm5lckVsZW1lbnQ9dGhpcy5fc3dhdGNoRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N3YXRjaC1pbm5lcicpO3RoaXMuX3RleHRQcmV2aWV3PXRoaXMuX3N3YXRjaEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RleHQtcHJldmlldycpO3RoaXMuX3RleHRQcmV2aWV3LnRleHRDb250ZW50PSdBYSc7fQpzZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3Ipe3RoaXMuX3N3YXRjaElubmVyRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kPShjb2xvci5hc1N0cmluZyhDb21tb24uQ29sb3IuRm9ybWF0LlJHQkEpKTt0aGlzLl9zd2F0Y2hFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3N3YXRjaC1pbm5lci13aGl0ZScsY29sb3IuaHNsYSgpWzJdPjAuOSk7fQpzZXRUZXh0Q29sb3IoY29sb3JTdHJpbmcpe3RoaXMuX3RleHRQcmV2aWV3LnN0eWxlLmNvbG9yPWNvbG9yU3RyaW5nO319OztDb2xvclBpY2tlci5TcGVjdHJ1bT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtmdW5jdGlvbiBhcHBlbmRTd2l0Y2hlckljb24ocGFyZW50RWxlbWVudCl7Y29uc3QgaWNvbj1wYXJlbnRFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdzdmcnKTtpY29uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywxNik7aWNvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywxNik7Y29uc3QgcGF0aD1pY29uLmNyZWF0ZVNWR0NoaWxkKCdwYXRoJyk7cGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCdNNSw2IEwxMSw2IEw4LDIgWiBNNSwxMCBMMTEsMTAgTDgsMTQgWicpO3JldHVybiBpY29uO30Kc3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdjb2xvcl9waWNrZXIvc3BlY3RydW0uY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC50YWJJbmRleD0wO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2NvbG9yRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1jb2xvcicpO3RoaXMuX2NvbG9yRHJhZ0VsZW1lbnQ9dGhpcy5fY29sb3JFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1zYXQgZmlsbCcpLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS12YWwgZmlsbCcpLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1kcmFnZ2VyJyk7dGhpcy5fZHJhZ1g9MDt0aGlzLl9kcmFnWT0wO2NvbnN0IHRvb2xzQ29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NwZWN0cnVtLXRvb2xzJyk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignc3BlY3RydW0tZXllLWRyb3BwZXInLHRvb2xzQ29udGFpbmVyKTt0aGlzLl9jb2xvclBpY2tlckJ1dHRvbj1uZXcgVUkuVG9vbGJhclRvZ2dsZShDb21tb24uVUlTdHJpbmcoJ1RvZ2dsZSBjb2xvciBwaWNrZXInKSwnbGFyZ2VpY29uLWV5ZWRyb3BwZXInKTt0aGlzLl9jb2xvclBpY2tlckJ1dHRvbi5zZXRUb2dnbGVkKHRydWUpO3RoaXMuX2NvbG9yUGlja2VyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fdG9nZ2xlQ29sb3JQaWNrZXIuYmluZCh0aGlzLHVuZGVmaW5lZCkpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fY29sb3JQaWNrZXJCdXR0b24pO3RoaXMuX3N3YXRjaD1uZXcgQ29sb3JQaWNrZXIuU3BlY3RydW0uU3dhdGNoKHRvb2xzQ29udGFpbmVyKTt0aGlzLl9odWVFbGVtZW50PXRvb2xzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1odWUnKTt0aGlzLl9odWVTbGlkZXI9dGhpcy5faHVlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tc2xpZGVyJyk7dGhpcy5fYWxwaGFFbGVtZW50PXRvb2xzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1hbHBoYScpO3RoaXMuX2FscGhhRWxlbWVudEJhY2tncm91bmQ9dGhpcy5fYWxwaGFFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1hbHBoYS1iYWNrZ3JvdW5kJyk7dGhpcy5fYWxwaGFTbGlkZXI9dGhpcy5fYWxwaGFFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1zbGlkZXInKTtjb25zdCBkaXNwbGF5U3dpdGNoZXI9dG9vbHNDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NwZWN0cnVtLWRpc3BsYXktc3dpdGNoZXIgc3BlY3RydW0tc3dpdGNoZXInKTthcHBlbmRTd2l0Y2hlckljb24oZGlzcGxheVN3aXRjaGVyKTtkaXNwbGF5U3dpdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2Zvcm1hdFZpZXdTd2l0Y2guYmluZCh0aGlzKSk7dGhpcy5fZGlzcGxheUNvbnRhaW5lcj10b29sc0NvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tdGV4dCBzb3VyY2UtY29kZScpO3RoaXMuX3RleHRWYWx1ZXM9W107Zm9yKGxldCBpPTA7aTw0OysraSl7Y29uc3QgaW5wdXRWYWx1ZT1VSS5jcmVhdGVJbnB1dCgnc3BlY3RydW0tdGV4dC12YWx1ZScpO3RoaXMuX2Rpc3BsYXlDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXRWYWx1ZSk7aW5wdXRWYWx1ZS5tYXhMZW5ndGg9NDt0aGlzLl90ZXh0VmFsdWVzLnB1c2goaW5wdXRWYWx1ZSk7aW5wdXRWYWx1ZS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9pbnB1dENoYW5nZWQuYmluZCh0aGlzKSxmYWxzZSk7aW5wdXRWYWx1ZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsdGhpcy5faW5wdXRDaGFuZ2VkLmJpbmQodGhpcyksZmFsc2UpO2lucHV0VmFsdWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsdGhpcy5faW5wdXRDaGFuZ2VkLmJpbmQodGhpcyksZmFsc2UpO30KdGhpcy5fdGV4dExhYmVscz10aGlzLl9kaXNwbGF5Q29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS10ZXh0LWxhYmVsJyk7dGhpcy5faGV4Q29udGFpbmVyPXRvb2xzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS10ZXh0IHNwZWN0cnVtLXRleHQtaGV4IHNvdXJjZS1jb2RlJyk7dGhpcy5faGV4VmFsdWU9VUkuY3JlYXRlSW5wdXQoJ3NwZWN0cnVtLXRleHQtdmFsdWUnKTt0aGlzLl9oZXhDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5faGV4VmFsdWUpO3RoaXMuX2hleFZhbHVlLm1heExlbmd0aD05O3RoaXMuX2hleFZhbHVlLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2lucHV0Q2hhbmdlZC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9oZXhWYWx1ZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsdGhpcy5faW5wdXRDaGFuZ2VkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2hleFZhbHVlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLHRoaXMuX2lucHV0Q2hhbmdlZC5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCBsYWJlbD10aGlzLl9oZXhDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NwZWN0cnVtLXRleHQtbGFiZWwnKTtsYWJlbC50ZXh0Q29udGVudD0nSEVYJztVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0aGlzLl9odWVFbGVtZW50LGRyYWdTdGFydC5iaW5kKHRoaXMscG9zaXRpb25IdWUuYmluZCh0aGlzKSkscG9zaXRpb25IdWUuYmluZCh0aGlzKSxudWxsLCdwb2ludGVyJywnZGVmYXVsdCcpO1VJLmluc3RhbGxEcmFnSGFuZGxlKHRoaXMuX2FscGhhRWxlbWVudCxkcmFnU3RhcnQuYmluZCh0aGlzLHBvc2l0aW9uQWxwaGEuYmluZCh0aGlzKSkscG9zaXRpb25BbHBoYS5iaW5kKHRoaXMpLG51bGwsJ3BvaW50ZXInLCdkZWZhdWx0Jyk7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5fY29sb3JFbGVtZW50LGRyYWdTdGFydC5iaW5kKHRoaXMscG9zaXRpb25Db2xvci5iaW5kKHRoaXMpKSxwb3NpdGlvbkNvbG9yLmJpbmQodGhpcyksbnVsbCwncG9pbnRlcicsJ2RlZmF1bHQnKTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgnY29sb3JDb250cmFzdFJhdGlvJykpe2NvbnN0IGJvdW5kVG9nZ2xlQ29sb3JQaWNrZXI9dGhpcy5fdG9nZ2xlQ29sb3JQaWNrZXIuYmluZCh0aGlzKTtjb25zdCBib3VuZENvbnRyYXN0UGFuZWxFeHBhbmRlZD10aGlzLl9jb250cmFzdFBhbmVsRXhwYW5kZWQuYmluZCh0aGlzKTt0aGlzLl9jb250cmFzdEluZm89bmV3IENvbG9yUGlja2VyLkNvbnRyYXN0SW5mbygpO3RoaXMuX2NvbnRyYXN0T3ZlcmxheT1uZXcgQ29sb3JQaWNrZXIuQ29udHJhc3RPdmVybGF5KHRoaXMuX2NvbnRyYXN0SW5mbyx0aGlzLl9jb2xvckVsZW1lbnQpO3RoaXMuX2NvbnRyYXN0RGV0YWlscz1uZXcgQ29sb3JQaWNrZXIuQ29udHJhc3REZXRhaWxzKHRoaXMuX2NvbnRyYXN0SW5mbyx0aGlzLmNvbnRlbnRFbGVtZW50LGJvdW5kVG9nZ2xlQ29sb3JQaWNrZXIsYm91bmRDb250cmFzdFBhbmVsRXhwYW5kZWQpO30KdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BhbGV0dGVzLWVuYWJsZWQnLCdmbGV4LW5vbmUnKTt0aGlzLl9wYWxldHRlcz1uZXcgTWFwKCk7dGhpcy5fcGFsZXR0ZVBhbmVsPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BhbGV0dGUtcGFuZWwnKTt0aGlzLl9wYWxldHRlUGFuZWxTaG93aW5nPWZhbHNlO3RoaXMuX3BhbGV0dGVTZWN0aW9uQ29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NwZWN0cnVtLXBhbGV0dGUtY29udGFpbmVyJyk7dGhpcy5fcGFsZXR0ZUNvbnRhaW5lcj10aGlzLl9wYWxldHRlU2VjdGlvbkNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tcGFsZXR0ZScpO3RoaXMuX3BhbGV0dGVDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX3Nob3dQYWxldHRlQ29sb3JDb250ZXh0TWVudS5iaW5kKHRoaXMsLTEpKTt0aGlzLl9zaGFkZXNDb250YWluZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncGFsZXR0ZS1jb2xvci1zaGFkZXMgaGlkZGVuJyk7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5fcGFsZXR0ZUNvbnRhaW5lcix0aGlzLl9wYWxldHRlRHJhZ1N0YXJ0LmJpbmQodGhpcyksdGhpcy5fcGFsZXR0ZURyYWcuYmluZCh0aGlzKSx0aGlzLl9wYWxldHRlRHJhZ0VuZC5iaW5kKHRoaXMpLCdkZWZhdWx0Jyk7Y29uc3QgcGFsZXR0ZVN3aXRjaGVyPXRoaXMuX3BhbGV0dGVTZWN0aW9uQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1wYWxldHRlLXN3aXRjaGVyIHNwZWN0cnVtLXN3aXRjaGVyJyk7YXBwZW5kU3dpdGNoZXJJY29uKHBhbGV0dGVTd2l0Y2hlcik7cGFsZXR0ZVN3aXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl90b2dnbGVQYWxldHRlUGFuZWwuYmluZCh0aGlzLHRydWUpKTt0aGlzLl9kZWxldGVJY29uVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignZGVsZXRlLWNvbG9yLXRvb2xiYXInKTt0aGlzLl9kZWxldGVCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oJycsJ2xhcmdlaWNvbi10cmFzaC1iaW4nKTt0aGlzLl9kZWxldGVJY29uVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9kZWxldGVCdXR0b24pO2NvbnN0IG92ZXJsYXk9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tb3ZlcmxheSBmaWxsJyk7b3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fdG9nZ2xlUGFsZXR0ZVBhbmVsLmJpbmQodGhpcyxmYWxzZSkpO3RoaXMuX2FkZENvbG9yVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignYWRkLWNvbG9yLXRvb2xiYXInKTtjb25zdCBhZGRDb2xvckJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0FkZCB0byBwYWxldHRlJyksJ2xhcmdlaWNvbi1hZGQnKTthZGRDb2xvckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2FkZENvbG9yVG9DdXN0b21QYWxldHRlLHRoaXMpO3RoaXMuX2FkZENvbG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShhZGRDb2xvckJ1dHRvbik7dGhpcy5fY29sb3JQaWNrZWRCb3VuZD10aGlzLl9jb2xvclBpY2tlZC5iaW5kKHRoaXMpO3RoaXMuX2xvYWRQYWxldHRlcygpO25ldyBDb2xvclBpY2tlci5TcGVjdHJ1bS5QYWxldHRlR2VuZXJhdG9yKHBhbGV0dGU9PntpZihwYWxldHRlLmNvbG9ycy5sZW5ndGgpCnRoaXMuYWRkUGFsZXR0ZShwYWxldHRlKTtlbHNlIGlmKHRoaXMuX3NlbGVjdGVkQ29sb3JQYWxldHRlLmdldCgpPT09cGFsZXR0ZS50aXRsZSkKdGhpcy5fcGFsZXR0ZVNlbGVjdGVkKENvbG9yUGlja2VyLlNwZWN0cnVtLk1hdGVyaWFsUGFsZXR0ZSk7fSk7ZnVuY3Rpb24gZHJhZ1N0YXJ0KGNhbGxiYWNrLGV2ZW50KXt0aGlzLl9odWVBbHBoYUxlZnQ9dGhpcy5faHVlRWxlbWVudC50b3RhbE9mZnNldExlZnQoKTt0aGlzLl9jb2xvck9mZnNldD10aGlzLl9jb2xvckVsZW1lbnQudG90YWxPZmZzZXQoKTtjYWxsYmFjayhldmVudCk7cmV0dXJuIHRydWU7fQpmdW5jdGlvbiBwb3NpdGlvbkh1ZShldmVudCl7Y29uc3QgaHN2YT10aGlzLl9oc3Yuc2xpY2UoKTtoc3ZhWzBdPU51bWJlci5jb25zdHJhaW4oMS0oZXZlbnQueC10aGlzLl9odWVBbHBoYUxlZnQpL3RoaXMuX2h1ZUFscGhhV2lkdGgsMCwxKTt0aGlzLl9pbm5lclNldENvbG9yKGhzdmEsJycsdW5kZWZpbmVkLHVuZGVmaW5lZCxDb2xvclBpY2tlci5TcGVjdHJ1bS5fQ2hhbmdlU291cmNlLk90aGVyKTt9CmZ1bmN0aW9uIHBvc2l0aW9uQWxwaGEoZXZlbnQpe2NvbnN0IG5ld0FscGhhPU1hdGgucm91bmQoKGV2ZW50LngtdGhpcy5faHVlQWxwaGFMZWZ0KS90aGlzLl9odWVBbHBoYVdpZHRoKjEwMCkvMTAwO2NvbnN0IGhzdmE9dGhpcy5faHN2LnNsaWNlKCk7aHN2YVszXT1OdW1iZXIuY29uc3RyYWluKG5ld0FscGhhLDAsMSk7dGhpcy5faW5uZXJTZXRDb2xvcihoc3ZhLCcnLHVuZGVmaW5lZCx1bmRlZmluZWQsQ29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZS5PdGhlcik7fQpmdW5jdGlvbiBwb3NpdGlvbkNvbG9yKGV2ZW50KXtjb25zdCBoc3ZhPXRoaXMuX2hzdi5zbGljZSgpO2hzdmFbMV09TnVtYmVyLmNvbnN0cmFpbigoZXZlbnQueC10aGlzLl9jb2xvck9mZnNldC5sZWZ0KS90aGlzLmRyYWdXaWR0aCwwLDEpO2hzdmFbMl09TnVtYmVyLmNvbnN0cmFpbigxLShldmVudC55LXRoaXMuX2NvbG9yT2Zmc2V0LnRvcCkvdGhpcy5kcmFnSGVpZ2h0LDAsMSk7dGhpcy5faW5uZXJTZXRDb2xvcihoc3ZhLCcnLHVuZGVmaW5lZCx1bmRlZmluZWQsQ29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZS5PdGhlcik7fX0KX2NvbnRyYXN0UGFuZWxFeHBhbmRlZCgpe2lmKHRoaXMuX2NvbnRyYXN0RGV0YWlscy5leHBhbmRlZCgpKQp0aGlzLl9jb250cmFzdE92ZXJsYXkuc2V0VmlzaWJsZSh0cnVlKTtlbHNlCnRoaXMuX2NvbnRyYXN0T3ZlcmxheS5zZXRWaXNpYmxlKGZhbHNlKTt0aGlzLl9yZXNpemVGb3JTZWxlY3RlZFBhbGV0dGUodHJ1ZSk7fQpfdXBkYXRlUGFsZXR0ZVBhbmVsKCl7dGhpcy5fcGFsZXR0ZVBhbmVsLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgdGl0bGU9dGhpcy5fcGFsZXR0ZVBhbmVsLmNyZWF0ZUNoaWxkKCdkaXYnLCdwYWxldHRlLXRpdGxlJyk7dGl0bGUudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdDb2xvciBQYWxldHRlcycpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJycsdGhpcy5fcGFsZXR0ZVBhbmVsKTtjb25zdCBjbG9zZUJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbignUmV0dXJuIHRvIGNvbG9yIHBpY2tlcicsJ2xhcmdlaWNvbi1kZWxldGUnKTtjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3RvZ2dsZVBhbGV0dGVQYW5lbC5iaW5kKHRoaXMsZmFsc2UpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGNsb3NlQnV0dG9uKTtmb3IoY29uc3QgcGFsZXR0ZSBvZiB0aGlzLl9wYWxldHRlcy52YWx1ZXMoKSkKdGhpcy5fcGFsZXR0ZVBhbmVsLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVByZXZpZXdQYWxldHRlRWxlbWVudChwYWxldHRlKSk7fQpfdG9nZ2xlUGFsZXR0ZVBhbmVsKHNob3cpe2lmKHRoaXMuX3BhbGV0dGVQYW5lbFNob3dpbmc9PT1zaG93KQpyZXR1cm47aWYoc2hvdykKdGhpcy5fdXBkYXRlUGFsZXR0ZVBhbmVsKCk7dGhpcy5fZm9jdXMoKTt0aGlzLl9wYWxldHRlUGFuZWxTaG93aW5nPXNob3c7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdwYWxldHRlLXBhbmVsLXNob3dpbmcnLHNob3cpO30KX2ZvY3VzKCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5jb250ZW50RWxlbWVudC5mb2N1cygpO30KX2NyZWF0ZVBhbGV0dGVDb2xvcihjb2xvclRleHQsY29sb3JOYW1lLGFuaW1hdGlvbkRlbGF5KXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3NwZWN0cnVtLXBhbGV0dGUtY29sb3InKTtlbGVtZW50LnN0eWxlLmJhY2tncm91bmQ9U3RyaW5nLnNwcmludGYoJ2xpbmVhci1ncmFkaWVudCglcywgJXMpLCB1cmwoSW1hZ2VzL2NoZWNrZXIucG5nKScsY29sb3JUZXh0LGNvbG9yVGV4dCk7aWYoYW5pbWF0aW9uRGVsYXkpCmVsZW1lbnQuYW5pbWF0ZShbe29wYWNpdHk6MH0se29wYWNpdHk6MX1dLHtkdXJhdGlvbjoxMDAsZGVsYXk6YW5pbWF0aW9uRGVsYXksZmlsbDonYmFja3dhcmRzJ30pO2VsZW1lbnQudGl0bGU9Y29sb3JOYW1lfHxjb2xvclRleHQ7cmV0dXJuIGVsZW1lbnQ7fQpfc2hvd1BhbGV0dGUocGFsZXR0ZSxhbmltYXRlLGV2ZW50KXt0aGlzLl9yZXNpemVGb3JTZWxlY3RlZFBhbGV0dGUoKTt0aGlzLl9wYWxldHRlQ29udGFpbmVyLnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxwYWxldHRlLmNvbG9ycy5sZW5ndGg7aSsrKXtjb25zdCBhbmltYXRpb25EZWxheT1hbmltYXRlP2kqMTAwL3BhbGV0dGUuY29sb3JzLmxlbmd0aDowO2NvbnN0IGNvbG9yRWxlbWVudD10aGlzLl9jcmVhdGVQYWxldHRlQ29sb3IocGFsZXR0ZS5jb2xvcnNbaV0scGFsZXR0ZS5jb2xvck5hbWVzW2ldLGFuaW1hdGlvbkRlbGF5KTtjb2xvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9wYWxldHRlQ29sb3JTZWxlY3RlZC5iaW5kKHRoaXMscGFsZXR0ZS5jb2xvcnNbaV0scGFsZXR0ZS5jb2xvck5hbWVzW2ldLHBhbGV0dGUubWF0Y2hVc2VyRm9ybWF0KSk7aWYocGFsZXR0ZS5tdXRhYmxlKXtjb2xvckVsZW1lbnQuX19tdXRhYmxlPXRydWU7Y29sb3JFbGVtZW50Ll9fY29sb3I9cGFsZXR0ZS5jb2xvcnNbaV07Y29sb3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9zaG93UGFsZXR0ZUNvbG9yQ29udGV4dE1lbnUuYmluZCh0aGlzLGkpKTt9ZWxzZSBpZihwYWxldHRlPT09Q29sb3JQaWNrZXIuU3BlY3RydW0uTWF0ZXJpYWxQYWxldHRlKXtjb2xvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGFzLW1hdGVyaWFsLXNoYWRlcycpO2xldCBzaGFkb3c9Y29sb3JFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzcGVjdHJ1bS1wYWxldHRlLWNvbG9yIHNwZWN0cnVtLXBhbGV0dGUtY29sb3Itc2hhZG93Jyk7c2hhZG93LnN0eWxlLmJhY2tncm91bmQ9cGFsZXR0ZS5jb2xvcnNbaV07c2hhZG93PWNvbG9yRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tcGFsZXR0ZS1jb2xvciBzcGVjdHJ1bS1wYWxldHRlLWNvbG9yLXNoYWRvdycpO3NoYWRvdy5zdHlsZS5iYWNrZ3JvdW5kPXBhbGV0dGUuY29sb3JzW2ldO2NvbG9yRWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcocGFsZXR0ZS5jb2xvcnNbaV0rJy4gTG9uZy1jbGljayB0byBzaG93IGFsdGVybmF0ZSBzaGFkZXMuJyk7bmV3IFVJLkxvbmdDbGlja0NvbnRyb2xsZXIoY29sb3JFbGVtZW50LHRoaXMuX3Nob3dMaWdodG5lc3NTaGFkZXMuYmluZCh0aGlzLGNvbG9yRWxlbWVudCxwYWxldHRlLmNvbG9yc1tpXSkpO30KdGhpcy5fcGFsZXR0ZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjb2xvckVsZW1lbnQpO30KdGhpcy5fcGFsZXR0ZUNvbnRhaW5lck11dGFibGU9cGFsZXR0ZS5tdXRhYmxlO2lmKHBhbGV0dGUubXV0YWJsZSl7dGhpcy5fcGFsZXR0ZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9hZGRDb2xvclRvb2xiYXIuZWxlbWVudCk7dGhpcy5fcGFsZXR0ZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9kZWxldGVJY29uVG9vbGJhci5lbGVtZW50KTt9ZWxzZXt0aGlzLl9hZGRDb2xvclRvb2xiYXIuZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9kZWxldGVJY29uVG9vbGJhci5lbGVtZW50LnJlbW92ZSgpO30KdGhpcy5fdG9nZ2xlUGFsZXR0ZVBhbmVsKGZhbHNlKTt0aGlzLl9mb2N1cygpO30KX3Nob3dMaWdodG5lc3NTaGFkZXMoY29sb3JFbGVtZW50LGNvbG9yVGV4dCxldmVudCl7ZnVuY3Rpb24gY2xvc2VMaWdodG5lc3NTaGFkZXMoZWxlbWVudCl7dGhpcy5fc2hhZGVzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc3BlY3RydW0tc2hhZGVzLXNob3duJyk7dGhpcy5fc2hhZGVzQ29udGFpbmVyLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9zaGFkZXNDbG9zZUhhbmRsZXIsdHJ1ZSk7ZGVsZXRlIHRoaXMuX3NoYWRlc0Nsb3NlSGFuZGxlcjt9CmlmKHRoaXMuX3NoYWRlc0Nsb3NlSGFuZGxlcikKdGhpcy5fc2hhZGVzQ2xvc2VIYW5kbGVyKCk7dGhpcy5fc2hhZGVzQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO3RoaXMuX3NoYWRlc0NvbnRhaW5lci5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3NoYWRlc0NvbnRhaW5lci5hbmltYXRlKFt7dHJhbnNmb3JtOidzY2FsZVkoMCknLG9wYWNpdHk6JzAnfSx7dHJhbnNmb3JtOidzY2FsZVkoMSknLG9wYWNpdHk6JzEnfV0se2R1cmF0aW9uOjIwMCxlYXNpbmc6J2N1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknfSk7bGV0IHNoYWRlc1RvcD10aGlzLl9wYWxldHRlQ29udGFpbmVyLm9mZnNldFRvcCtjb2xvckVsZW1lbnQub2Zmc2V0VG9wK2NvbG9yRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFRvcDtpZih0aGlzLl9jb250cmFzdERldGFpbHMmJnRoaXMuX2NvbnRyYXN0RGV0YWlscy52aXNpYmxlKCkpCnNoYWRlc1RvcCs9dGhpcy5fY29udHJhc3REZXRhaWxzLmVsZW1lbnQoKS5vZmZzZXRIZWlnaHQ7dGhpcy5fc2hhZGVzQ29udGFpbmVyLnN0eWxlLnRvcD1zaGFkZXNUb3ArJ3B4Jzt0aGlzLl9zaGFkZXNDb250YWluZXIuc3R5bGUubGVmdD1jb2xvckVsZW1lbnQub2Zmc2V0TGVmdCsncHgnO2NvbG9yRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzcGVjdHJ1bS1zaGFkZXMtc2hvd24nKTtjb25zdCBzaGFkZXM9Q29sb3JQaWNrZXIuU3BlY3RydW0uTWF0ZXJpYWxQYWxldHRlU2hhZGVzW2NvbG9yVGV4dF07Zm9yKGxldCBpPXNoYWRlcy5sZW5ndGgtMTtpPj0wO2ktLSl7Y29uc3Qgc2hhZGVFbGVtZW50PXRoaXMuX2NyZWF0ZVBhbGV0dGVDb2xvcihzaGFkZXNbaV0sdW5kZWZpbmVkLGkqMjAwL3NoYWRlcy5sZW5ndGgrMTAwKTtzaGFkZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9wYWxldHRlQ29sb3JTZWxlY3RlZC5iaW5kKHRoaXMsc2hhZGVzW2ldLHNoYWRlc1tpXSxmYWxzZSkpO3RoaXMuX3NoYWRlc0NvbnRhaW5lci5hcHBlbmRDaGlsZChzaGFkZUVsZW1lbnQpO30KdGhpcy5fc2hhZGVzQ29udGFpbmVyLmZvY3VzKCk7dGhpcy5fc2hhZGVzQ2xvc2VIYW5kbGVyPWNsb3NlTGlnaHRuZXNzU2hhZGVzLmJpbmQodGhpcyxjb2xvckVsZW1lbnQpO3RoaXMuX3NoYWRlc0NvbnRhaW5lci5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fc2hhZGVzQ2xvc2VIYW5kbGVyLHRydWUpO30KX3Nsb3RJbmRleEZvckV2ZW50KGUpe2NvbnN0IGxvY2FsWD1lLnBhZ2VYLXRoaXMuX3BhbGV0dGVDb250YWluZXIudG90YWxPZmZzZXRMZWZ0KCk7Y29uc3QgbG9jYWxZPWUucGFnZVktdGhpcy5fcGFsZXR0ZUNvbnRhaW5lci50b3RhbE9mZnNldFRvcCgpO2NvbnN0IGNvbD1NYXRoLm1pbihsb2NhbFgvQ29sb3JQaWNrZXIuU3BlY3RydW0uX2NvbG9yQ2hpcFNpemV8MCxDb2xvclBpY2tlci5TcGVjdHJ1bS5faXRlbXNQZXJQYWxldHRlUm93LTEpO2NvbnN0IHJvdz0obG9jYWxZL0NvbG9yUGlja2VyLlNwZWN0cnVtLl9jb2xvckNoaXBTaXplKXwwO3JldHVybiBNYXRoLm1pbihyb3cqQ29sb3JQaWNrZXIuU3BlY3RydW0uX2l0ZW1zUGVyUGFsZXR0ZVJvdytjb2wsdGhpcy5fY3VzdG9tUGFsZXR0ZVNldHRpbmcuZ2V0KCkuY29sb3JzLmxlbmd0aC0xKTt9Cl9pc0RyYWdnaW5nVG9CaW4oZSl7cmV0dXJuIGUucGFnZVg+dGhpcy5fZGVsZXRlSWNvblRvb2xiYXIuZWxlbWVudC50b3RhbE9mZnNldExlZnQoKTt9Cl9wYWxldHRlRHJhZ1N0YXJ0KGUpe2NvbnN0IGVsZW1lbnQ9ZS5kZWVwRWxlbWVudEZyb21Qb2ludCgpO2lmKCFlbGVtZW50fHwhZWxlbWVudC5fX211dGFibGUpCnJldHVybiBmYWxzZTtjb25zdCBpbmRleD10aGlzLl9zbG90SW5kZXhGb3JFdmVudChlKTt0aGlzLl9kcmFnRWxlbWVudD1lbGVtZW50O3RoaXMuX2RyYWdIb3RTcG90WD1lLnBhZ2VYLShpbmRleCVDb2xvclBpY2tlci5TcGVjdHJ1bS5faXRlbXNQZXJQYWxldHRlUm93KSpDb2xvclBpY2tlci5TcGVjdHJ1bS5fY29sb3JDaGlwU2l6ZTt0aGlzLl9kcmFnSG90U3BvdFk9ZS5wYWdlWS0oaW5kZXgvQ29sb3JQaWNrZXIuU3BlY3RydW0uX2l0ZW1zUGVyUGFsZXR0ZVJvd3wwKSpDb2xvclBpY2tlci5TcGVjdHJ1bS5fY29sb3JDaGlwU2l6ZTtyZXR1cm4gdHJ1ZTt9Cl9wYWxldHRlRHJhZyhlKXtpZihlLnBhZ2VYPHRoaXMuX3BhbGV0dGVDb250YWluZXIudG90YWxPZmZzZXRMZWZ0KCl8fGUucGFnZVk8dGhpcy5fcGFsZXR0ZUNvbnRhaW5lci50b3RhbE9mZnNldFRvcCgpKQpyZXR1cm47Y29uc3QgbmV3SW5kZXg9dGhpcy5fc2xvdEluZGV4Rm9yRXZlbnQoZSk7Y29uc3Qgb2Zmc2V0WD1lLnBhZ2VYLShuZXdJbmRleCVDb2xvclBpY2tlci5TcGVjdHJ1bS5faXRlbXNQZXJQYWxldHRlUm93KSpDb2xvclBpY2tlci5TcGVjdHJ1bS5fY29sb3JDaGlwU2l6ZTtjb25zdCBvZmZzZXRZPWUucGFnZVktKG5ld0luZGV4L0NvbG9yUGlja2VyLlNwZWN0cnVtLl9pdGVtc1BlclBhbGV0dGVSb3d8MCkqQ29sb3JQaWNrZXIuU3BlY3RydW0uX2NvbG9yQ2hpcFNpemU7Y29uc3QgaXNEZWxldGluZz10aGlzLl9pc0RyYWdnaW5nVG9CaW4oZSk7dGhpcy5fZGVsZXRlSWNvblRvb2xiYXIuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO3RoaXMuX2RlbGV0ZUljb25Ub29sYmFyLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGVsZXRlLWNvbG9yLXRvb2xiYXItYWN0aXZlJyxpc0RlbGV0aW5nKTtjb25zdCBkcmFnRWxlbWVudFRyYW5zZm9ybT0ndHJhbnNsYXRlWCgnKyhvZmZzZXRYLXRoaXMuX2RyYWdIb3RTcG90WCkrJ3B4KSB0cmFuc2xhdGVZKCcrKG9mZnNldFktdGhpcy5fZHJhZ0hvdFNwb3RZKSsncHgpJzt0aGlzLl9kcmFnRWxlbWVudC5zdHlsZS50cmFuc2Zvcm09aXNEZWxldGluZz9kcmFnRWxlbWVudFRyYW5zZm9ybSsnIHNjYWxlKDAuOCknOmRyYWdFbGVtZW50VHJhbnNmb3JtO2NvbnN0IGNoaWxkcmVuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX3BhbGV0dGVDb250YWluZXIuY2hpbGRyZW4pO2NvbnN0IGluZGV4PWNoaWxkcmVuLmluZGV4T2YodGhpcy5fZHJhZ0VsZW1lbnQpO2NvbnN0IHN3YXRjaE9mZnNldHM9bmV3IE1hcCgpO2Zvcihjb25zdCBzd2F0Y2ggb2YgY2hpbGRyZW4pCnN3YXRjaE9mZnNldHMuc2V0KHN3YXRjaCxzd2F0Y2gudG90YWxPZmZzZXQoKSk7aWYoaW5kZXghPT1uZXdJbmRleCkKdGhpcy5fcGFsZXR0ZUNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5fZHJhZ0VsZW1lbnQsY2hpbGRyZW5bbmV3SW5kZXg+aW5kZXg/bmV3SW5kZXgrMTpuZXdJbmRleF0pO2Zvcihjb25zdCBzd2F0Y2ggb2YgY2hpbGRyZW4pe2lmKHN3YXRjaD09PXRoaXMuX2RyYWdFbGVtZW50KQpjb250aW51ZTtjb25zdCBiZWZvcmU9c3dhdGNoT2Zmc2V0cy5nZXQoc3dhdGNoKTtjb25zdCBhZnRlcj1zd2F0Y2gudG90YWxPZmZzZXQoKTtpZihiZWZvcmUubGVmdCE9PWFmdGVyLmxlZnR8fGJlZm9yZS50b3AhPT1hZnRlci50b3Ape3N3YXRjaC5hbmltYXRlKFt7dHJhbnNmb3JtOid0cmFuc2xhdGVYKCcrKGJlZm9yZS5sZWZ0LWFmdGVyLmxlZnQpKydweCkgdHJhbnNsYXRlWSgnKyhiZWZvcmUudG9wLWFmdGVyLnRvcCkrJ3B4KSd9LHt0cmFuc2Zvcm06J25vbmUnfV0se2R1cmF0aW9uOjEwMCxlYXNpbmc6J2N1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJ30pO319fQpfcGFsZXR0ZURyYWdFbmQoZSl7aWYodGhpcy5faXNEcmFnZ2luZ1RvQmluKGUpKQp0aGlzLl9kcmFnRWxlbWVudC5yZW1vdmUoKTt0aGlzLl9kcmFnRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNmb3JtJyk7Y29uc3QgY2hpbGRyZW49dGhpcy5fcGFsZXR0ZUNvbnRhaW5lci5jaGlsZHJlbjtjb25zdCBjb2xvcnM9W107Zm9yKGxldCBpPTA7aTxjaGlsZHJlbi5sZW5ndGg7KytpKXtpZihjaGlsZHJlbltpXS5fX2NvbG9yKQpjb2xvcnMucHVzaChjaGlsZHJlbltpXS5fX2NvbG9yKTt9CmNvbnN0IHBhbGV0dGU9dGhpcy5fY3VzdG9tUGFsZXR0ZVNldHRpbmcuZ2V0KCk7cGFsZXR0ZS5jb2xvcnM9Y29sb3JzO3RoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nLnNldChwYWxldHRlKTt0aGlzLl9zaG93UGFsZXR0ZSh0aGlzLl9jdXN0b21QYWxldHRlU2V0dGluZy5nZXQoKSxmYWxzZSk7dGhpcy5fZGVsZXRlSWNvblRvb2xiYXIuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2luZycpO3RoaXMuX2RlbGV0ZUljb25Ub29sYmFyLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZGVsZXRlLWNvbG9yLXRvb2xiYXItYWN0aXZlJyk7fQpfbG9hZFBhbGV0dGVzKCl7dGhpcy5fcGFsZXR0ZXMuc2V0KENvbG9yUGlja2VyLlNwZWN0cnVtLk1hdGVyaWFsUGFsZXR0ZS50aXRsZSxDb2xvclBpY2tlci5TcGVjdHJ1bS5NYXRlcmlhbFBhbGV0dGUpO2NvbnN0IGRlZmF1bHRDdXN0b21QYWxldHRlPXt0aXRsZTonQ3VzdG9tJyxjb2xvcnM6W10sY29sb3JOYW1lczpbXSxtdXRhYmxlOnRydWV9O3RoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdjdXN0b21Db2xvclBhbGV0dGUnLGRlZmF1bHRDdXN0b21QYWxldHRlKTtjb25zdCBjdXN0b21QYWxldHRlPXRoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nLmdldCgpO2N1c3RvbVBhbGV0dGUuY29sb3JOYW1lcz1jdXN0b21QYWxldHRlLmNvbG9yTmFtZXN8fFtdO3RoaXMuX3BhbGV0dGVzLnNldChjdXN0b21QYWxldHRlLnRpdGxlLGN1c3RvbVBhbGV0dGUpO3RoaXMuX3NlbGVjdGVkQ29sb3JQYWxldHRlPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzZWxlY3RlZENvbG9yUGFsZXR0ZScsQ29sb3JQaWNrZXIuU3BlY3RydW0uR2VuZXJhdGVkUGFsZXR0ZVRpdGxlKTtjb25zdCBwYWxldHRlPXRoaXMuX3BhbGV0dGVzLmdldCh0aGlzLl9zZWxlY3RlZENvbG9yUGFsZXR0ZS5nZXQoKSk7aWYocGFsZXR0ZSkKdGhpcy5fc2hvd1BhbGV0dGUocGFsZXR0ZSx0cnVlKTt9CmFkZFBhbGV0dGUocGFsZXR0ZSl7dGhpcy5fcGFsZXR0ZXMuc2V0KHBhbGV0dGUudGl0bGUscGFsZXR0ZSk7aWYodGhpcy5fc2VsZWN0ZWRDb2xvclBhbGV0dGUuZ2V0KCk9PT1wYWxldHRlLnRpdGxlKQp0aGlzLl9zaG93UGFsZXR0ZShwYWxldHRlLHRydWUpO30KX2NyZWF0ZVByZXZpZXdQYWxldHRlRWxlbWVudChwYWxldHRlKXtjb25zdCBjb2xvcnNQZXJQcmV2aWV3Um93PTU7Y29uc3QgcHJldmlld0VsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywncGFsZXR0ZS1wcmV2aWV3Jyk7Y29uc3QgdGl0bGVFbGVtZW50PXByZXZpZXdFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwYWxldHRlLXByZXZpZXctdGl0bGUnKTt0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9cGFsZXR0ZS50aXRsZTtsZXQgaTtmb3IoaT0wO2k8Y29sb3JzUGVyUHJldmlld1JvdyYmaTxwYWxldHRlLmNvbG9ycy5sZW5ndGg7aSsrKQpwcmV2aWV3RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVQYWxldHRlQ29sb3IocGFsZXR0ZS5jb2xvcnNbaV0scGFsZXR0ZS5jb2xvck5hbWVzW2ldKSk7Zm9yKDtpPGNvbG9yc1BlclByZXZpZXdSb3c7aSsrKQpwcmV2aWV3RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3BlY3RydW0tcGFsZXR0ZS1jb2xvciBlbXB0eS1jb2xvcicpO3ByZXZpZXdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9wYWxldHRlU2VsZWN0ZWQuYmluZCh0aGlzLHBhbGV0dGUpKTtyZXR1cm4gcHJldmlld0VsZW1lbnQ7fQpfcGFsZXR0ZVNlbGVjdGVkKHBhbGV0dGUpe3RoaXMuX3NlbGVjdGVkQ29sb3JQYWxldHRlLnNldChwYWxldHRlLnRpdGxlKTt0aGlzLl9zaG93UGFsZXR0ZShwYWxldHRlLHRydWUpO30KX3Jlc2l6ZUZvclNlbGVjdGVkUGFsZXR0ZShmb3JjZSl7Y29uc3QgcGFsZXR0ZT10aGlzLl9wYWxldHRlcy5nZXQodGhpcy5fc2VsZWN0ZWRDb2xvclBhbGV0dGUuZ2V0KCkpO2lmKCFwYWxldHRlKQpyZXR1cm47bGV0IG51bUNvbG9ycz1wYWxldHRlLmNvbG9ycy5sZW5ndGg7aWYocGFsZXR0ZT09PXRoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nLmdldCgpKQpudW1Db2xvcnMrKztjb25zdCByb3dzTmVlZGVkPU1hdGgubWF4KDEsTWF0aC5jZWlsKG51bUNvbG9ycy9Db2xvclBpY2tlci5TcGVjdHJ1bS5faXRlbXNQZXJQYWxldHRlUm93KSk7aWYodGhpcy5fbnVtUGFsZXR0ZVJvd3NTaG93bj09PXJvd3NOZWVkZWQmJiFmb3JjZSkKcmV0dXJuO3RoaXMuX251bVBhbGV0dGVSb3dzU2hvd249cm93c05lZWRlZDtjb25zdCBwYWxldHRlQ29sb3JIZWlnaHQ9MTI7Y29uc3QgcGFsZXR0ZU1hcmdpbj0xMjtsZXQgcGFsZXR0ZVRvcD0yMzY7aWYodGhpcy5fY29udHJhc3REZXRhaWxzJiZ0aGlzLl9jb250cmFzdERldGFpbHMudmlzaWJsZSgpKXtpZih0aGlzLl9jb250cmFzdERldGFpbHMuZXhwYW5kZWQoKSkKcGFsZXR0ZVRvcCs9Nzg7ZWxzZQpwYWxldHRlVG9wKz0zNjt9CnRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9KHBhbGV0dGVUb3ArcGFsZXR0ZU1hcmdpbisocGFsZXR0ZUNvbG9ySGVpZ2h0K3BhbGV0dGVNYXJnaW4pKnJvd3NOZWVkZWQpKydweCc7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29sb3JQaWNrZXIuU3BlY3RydW0uRXZlbnRzLlNpemVDaGFuZ2VkKTt9Cl9wYWxldHRlQ29sb3JTZWxlY3RlZChjb2xvclRleHQsY29sb3JOYW1lLG1hdGNoVXNlckZvcm1hdCl7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGNvbG9yVGV4dCk7aWYoIWNvbG9yKQpyZXR1cm47dGhpcy5faW5uZXJTZXRDb2xvcihjb2xvci5oc3ZhKCksY29sb3JUZXh0LGNvbG9yTmFtZSxtYXRjaFVzZXJGb3JtYXQ/dGhpcy5fY29sb3JGb3JtYXQ6Y29sb3IuZm9ybWF0KCksQ29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZS5PdGhlcik7fQpfYWRkQ29sb3JUb0N1c3RvbVBhbGV0dGUoZXZlbnQpe2NvbnN0IHBhbGV0dGU9dGhpcy5fY3VzdG9tUGFsZXR0ZVNldHRpbmcuZ2V0KCk7cGFsZXR0ZS5jb2xvcnMucHVzaCh0aGlzLmNvbG9yU3RyaW5nKCkpO3RoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nLnNldChwYWxldHRlKTt0aGlzLl9zaG93UGFsZXR0ZSh0aGlzLl9jdXN0b21QYWxldHRlU2V0dGluZy5nZXQoKSxmYWxzZSk7fQpfc2hvd1BhbGV0dGVDb2xvckNvbnRleHRNZW51KGNvbG9ySW5kZXgsZXZlbnQpe2lmKCF0aGlzLl9wYWxldHRlQ29udGFpbmVyTXV0YWJsZSkKcmV0dXJuO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7aWYoY29sb3JJbmRleCE9PS0xKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgY29sb3InKSx0aGlzLl9kZWxldGVQYWxldHRlQ29sb3JzLmJpbmQodGhpcyxjb2xvckluZGV4LGZhbHNlKSk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVtb3ZlIGFsbCB0byB0aGUgcmlnaHQnKSx0aGlzLl9kZWxldGVQYWxldHRlQ29sb3JzLmJpbmQodGhpcyxjb2xvckluZGV4LHRydWUpKTt9CmNvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NsZWFyIHBhbGV0dGUnKSx0aGlzLl9kZWxldGVQYWxldHRlQ29sb3JzLmJpbmQodGhpcywtMSx0cnVlKSk7Y29udGV4dE1lbnUuc2hvdygpO30KX2RlbGV0ZVBhbGV0dGVDb2xvcnMoY29sb3JJbmRleCx0b1JpZ2h0KXtjb25zdCBwYWxldHRlPXRoaXMuX2N1c3RvbVBhbGV0dGVTZXR0aW5nLmdldCgpO2lmKHRvUmlnaHQpCnBhbGV0dGUuY29sb3JzLnNwbGljZShjb2xvckluZGV4KzEscGFsZXR0ZS5jb2xvcnMubGVuZ3RoLWNvbG9ySW5kZXgtMSk7ZWxzZQpwYWxldHRlLmNvbG9ycy5zcGxpY2UoY29sb3JJbmRleCwxKTt0aGlzLl9jdXN0b21QYWxldHRlU2V0dGluZy5zZXQocGFsZXR0ZSk7dGhpcy5fc2hvd1BhbGV0dGUodGhpcy5fY3VzdG9tUGFsZXR0ZVNldHRpbmcuZ2V0KCksZmFsc2UpO30Kc2V0Q29sb3IoY29sb3IsY29sb3JGb3JtYXQpe3RoaXMuX29yaWdpbmFsRm9ybWF0PWNvbG9yRm9ybWF0O3RoaXMuX2lubmVyU2V0Q29sb3IoY29sb3IuaHN2YSgpLCcnLHVuZGVmaW5lZCxjb2xvckZvcm1hdCxDb2xvclBpY2tlci5TcGVjdHJ1bS5fQ2hhbmdlU291cmNlLk1vZGVsKTt9CnNldENvbnRyYXN0SW5mbyhjb250cmFzdEluZm8pe2lmKCF0aGlzLl9jb250cmFzdEluZm8pCnJldHVybjt0aGlzLl9jb250cmFzdEluZm8udXBkYXRlKGNvbnRyYXN0SW5mbyk7aWYodGhpcy5fY29udHJhc3REZXRhaWxzLnZpc2libGUoKSkKdGhpcy5fcmVzaXplRm9yU2VsZWN0ZWRQYWxldHRlKHRydWUpO30KX2lubmVyU2V0Q29sb3IoaHN2YSxjb2xvclN0cmluZyxjb2xvck5hbWUsY29sb3JGb3JtYXQsY2hhbmdlU291cmNlKXtpZihoc3ZhIT09dW5kZWZpbmVkKQp0aGlzLl9oc3Y9aHN2YTt0aGlzLl9jb2xvck5hbWU9Y29sb3JOYW1lO2lmKGNvbG9yU3RyaW5nIT09dW5kZWZpbmVkKQp0aGlzLl9jb2xvclN0cmluZz1jb2xvclN0cmluZztpZihjb2xvckZvcm1hdCE9PXVuZGVmaW5lZCl7Y29uc3QgY2Y9Q29tbW9uLkNvbG9yLkZvcm1hdDtjb25zb2xlLmFzc2VydChjb2xvckZvcm1hdCE9PWNmLk9yaWdpbmFsLCdTcGVjdHJ1bVwncyBjb2xvciBmb3JtYXQgY2Fubm90IGJlIE9yaWdpbmFsJyk7aWYoY29sb3JGb3JtYXQ9PT1jZi5SR0JBKQpjb2xvckZvcm1hdD1jZi5SR0I7ZWxzZSBpZihjb2xvckZvcm1hdD09PWNmLkhTTEEpCmNvbG9yRm9ybWF0PWNmLkhTTDtlbHNlIGlmKGNvbG9yRm9ybWF0PT09Y2YuSEVYQSkKY29sb3JGb3JtYXQ9Y2YuSEVYO2Vsc2UgaWYoY29sb3JGb3JtYXQ9PT1jZi5TaG9ydEhFWEEpCmNvbG9yRm9ybWF0PWNmLlNob3J0SEVYO3RoaXMuX2NvbG9yRm9ybWF0PWNvbG9yRm9ybWF0O30KaWYoaHN2YSYmdGhpcy5fY29udHJhc3RJbmZvKQp0aGlzLl9jb250cmFzdEluZm8uc2V0Q29sb3IoaHN2YSx0aGlzLmNvbG9yU3RyaW5nKCkpO3RoaXMuX3VwZGF0ZUhlbHBlckxvY2F0aW9ucygpO3RoaXMuX3VwZGF0ZVVJKCk7aWYoY2hhbmdlU291cmNlIT09Q29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZS5JbnB1dCkKdGhpcy5fdXBkYXRlSW5wdXQoKTtpZihjaGFuZ2VTb3VyY2UhPT1Db2xvclBpY2tlci5TcGVjdHJ1bS5fQ2hhbmdlU291cmNlLk1vZGVsKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhDb2xvclBpY2tlci5TcGVjdHJ1bS5FdmVudHMuQ29sb3JDaGFuZ2VkLHRoaXMuY29sb3JTdHJpbmcoKSk7fQpfY29sb3IoKXtyZXR1cm4gQ29tbW9uLkNvbG9yLmZyb21IU1ZBKHRoaXMuX2hzdik7fQpjb2xvck5hbWUoKXtyZXR1cm4gdGhpcy5fY29sb3JOYW1lO30KY29sb3JTdHJpbmcoKXtpZih0aGlzLl9jb2xvclN0cmluZykKcmV0dXJuIHRoaXMuX2NvbG9yU3RyaW5nO2NvbnN0IGNmPUNvbW1vbi5Db2xvci5Gb3JtYXQ7Y29uc3QgY29sb3I9dGhpcy5fY29sb3IoKTtsZXQgY29sb3JTdHJpbmc9Y29sb3IuYXNTdHJpbmcodGhpcy5fY29sb3JGb3JtYXQpO2lmKGNvbG9yU3RyaW5nKQpyZXR1cm4gY29sb3JTdHJpbmc7aWYodGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5OaWNrbmFtZSkKY29sb3JTdHJpbmc9Y29sb3IuYXNTdHJpbmcoY29sb3IuaGFzQWxwaGEoKT9jZi5IRVhBOmNmLkhFWCk7ZWxzZSBpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLlNob3J0SEVYKQpjb2xvclN0cmluZz1jb2xvci5hc1N0cmluZyhjb2xvci5kZXRlY3RIRVhGb3JtYXQoKSk7ZWxzZSBpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLkhFWCkKY29sb3JTdHJpbmc9Y29sb3IuYXNTdHJpbmcoY2YuSEVYQSk7ZWxzZSBpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLkhTTCkKY29sb3JTdHJpbmc9Y29sb3IuYXNTdHJpbmcoY2YuSFNMQSk7ZWxzZQpjb2xvclN0cmluZz1jb2xvci5hc1N0cmluZyhjZi5SR0JBKTtjb25zb2xlLmFzc2VydChjb2xvclN0cmluZyk7cmV0dXJuIGNvbG9yU3RyaW5nfHwnJzt9Cl91cGRhdGVIZWxwZXJMb2NhdGlvbnMoKXtjb25zdCBoPXRoaXMuX2hzdlswXTtjb25zdCBzPXRoaXMuX2hzdlsxXTtjb25zdCB2PXRoaXMuX2hzdlsyXTtjb25zdCBhbHBoYT10aGlzLl9oc3ZbM107dGhpcy5fZHJhZ1g9cyp0aGlzLmRyYWdXaWR0aDt0aGlzLl9kcmFnWT10aGlzLmRyYWdIZWlnaHQtKHYqdGhpcy5kcmFnSGVpZ2h0KTtjb25zdCBkcmFnWD1NYXRoLm1heCgtdGhpcy5fY29sb3JEcmFnRWxlbWVudEhlaWdodCxNYXRoLm1pbih0aGlzLmRyYWdXaWR0aC10aGlzLl9jb2xvckRyYWdFbGVtZW50SGVpZ2h0LHRoaXMuX2RyYWdYLXRoaXMuX2NvbG9yRHJhZ0VsZW1lbnRIZWlnaHQpKTtjb25zdCBkcmFnWT1NYXRoLm1heCgtdGhpcy5fY29sb3JEcmFnRWxlbWVudEhlaWdodCxNYXRoLm1pbih0aGlzLmRyYWdIZWlnaHQtdGhpcy5fY29sb3JEcmFnRWxlbWVudEhlaWdodCx0aGlzLl9kcmFnWS10aGlzLl9jb2xvckRyYWdFbGVtZW50SGVpZ2h0KSk7dGhpcy5fY29sb3JEcmFnRWxlbWVudC5wb3NpdGlvbkF0KGRyYWdYLGRyYWdZKTtjb25zdCBodWVTbGlkZVg9KDEtaCkqdGhpcy5faHVlQWxwaGFXaWR0aC10aGlzLnNsaWRlSGVscGVyV2lkdGg7dGhpcy5faHVlU2xpZGVyLnN0eWxlLmxlZnQ9aHVlU2xpZGVYKydweCc7Y29uc3QgYWxwaGFTbGlkZVg9YWxwaGEqdGhpcy5faHVlQWxwaGFXaWR0aC10aGlzLnNsaWRlSGVscGVyV2lkdGg7dGhpcy5fYWxwaGFTbGlkZXIuc3R5bGUubGVmdD1hbHBoYVNsaWRlWCsncHgnO30KX3VwZGF0ZUlucHV0KCl7Y29uc3QgY2Y9Q29tbW9uLkNvbG9yLkZvcm1hdDtpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLkhFWHx8dGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5TaG9ydEhFWHx8dGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5OaWNrbmFtZSl7dGhpcy5faGV4Q29udGFpbmVyLmhpZGRlbj1mYWxzZTt0aGlzLl9kaXNwbGF5Q29udGFpbmVyLmhpZGRlbj10cnVlO2lmKHRoaXMuX2NvbG9yRm9ybWF0PT09Y2YuU2hvcnRIRVgpe3RoaXMuX2hleFZhbHVlLnZhbHVlPXRoaXMuX2NvbG9yKCkuYXNTdHJpbmcodGhpcy5fY29sb3IoKS5kZXRlY3RIRVhGb3JtYXQoKSk7fWVsc2V7dGhpcy5faGV4VmFsdWUudmFsdWU9dGhpcy5fY29sb3IoKS5hc1N0cmluZyh0aGlzLl9jb2xvcigpLmhhc0FscGhhKCk/Y2YuSEVYQTpjZi5IRVgpO319ZWxzZXt0aGlzLl9oZXhDb250YWluZXIuaGlkZGVuPXRydWU7dGhpcy5fZGlzcGxheUNvbnRhaW5lci5oaWRkZW49ZmFsc2U7Y29uc3QgaXNSZ2I9dGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5SR0I7dGhpcy5fdGV4dExhYmVscy50ZXh0Q29udGVudD1pc1JnYj8nUkdCQSc6J0hTTEEnO2NvbnN0IGNvbG9yVmFsdWVzPWlzUmdiP3RoaXMuX2NvbG9yKCkuY2Fub25pY2FsUkdCQSgpOnRoaXMuX2NvbG9yKCkuY2Fub25pY2FsSFNMQSgpO2ZvcihsZXQgaT0wO2k8MzsrK2kpe3RoaXMuX3RleHRWYWx1ZXNbaV0udmFsdWU9Y29sb3JWYWx1ZXNbaV07aWYoIWlzUmdiJiYoaT09PTF8fGk9PT0yKSkKdGhpcy5fdGV4dFZhbHVlc1tpXS52YWx1ZSs9JyUnO30KdGhpcy5fdGV4dFZhbHVlc1szXS52YWx1ZT1NYXRoLnJvdW5kKGNvbG9yVmFsdWVzWzNdKjEwMCkvMTAwO319Cl91cGRhdGVVSSgpe2NvbnN0IGg9Q29tbW9uLkNvbG9yLmZyb21IU1ZBKFt0aGlzLl9oc3ZbMF0sMSwxLDFdKTt0aGlzLl9jb2xvckVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yPShoLmFzU3RyaW5nKENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCKSk7aWYodGhpcy5fY29udHJhc3RPdmVybGF5KQp0aGlzLl9jb250cmFzdE92ZXJsYXkuc2V0RGltZW5zaW9ucyh0aGlzLmRyYWdXaWR0aCx0aGlzLmRyYWdIZWlnaHQpO3RoaXMuX3N3YXRjaC5zZXRDb2xvcih0aGlzLl9jb2xvcigpLHRoaXMuY29sb3JTdHJpbmcoKSk7dGhpcy5fY29sb3JEcmFnRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9KHRoaXMuX2NvbG9yKCkuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKSk7Y29uc3Qgbm9BbHBoYT1Db21tb24uQ29sb3IuZnJvbUhTVkEodGhpcy5faHN2LnNsaWNlKDAsMykuY29uY2F0KDEpKTt0aGlzLl9hbHBoYUVsZW1lbnRCYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRJbWFnZT1TdHJpbmcuc3ByaW50ZignbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsMCwwLDApLCAlcyknLG5vQWxwaGEuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0IpKTt9Cl9mb3JtYXRWaWV3U3dpdGNoKCl7Y29uc3QgY2Y9Q29tbW9uLkNvbG9yLkZvcm1hdDtsZXQgZm9ybWF0PWNmLlJHQjtpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLlJHQikKZm9ybWF0PWNmLkhTTDtlbHNlIGlmKHRoaXMuX2NvbG9yRm9ybWF0PT09Y2YuSFNMKQpmb3JtYXQ9KHRoaXMuX29yaWdpbmFsRm9ybWF0PT09Y2YuU2hvcnRIRVh8fHRoaXMuX29yaWdpbmFsRm9ybWF0PT09Y2YuU2hvcnRIRVhBKT9jZi5TaG9ydEhFWDpjZi5IRVg7dGhpcy5faW5uZXJTZXRDb2xvcih1bmRlZmluZWQsJycsdW5kZWZpbmVkLGZvcm1hdCxDb2xvclBpY2tlci5TcGVjdHJ1bS5fQ2hhbmdlU291cmNlLk90aGVyKTt9Cl9pbnB1dENoYW5nZWQoZXZlbnQpe2Z1bmN0aW9uIGVsZW1lbnRWYWx1ZShlbGVtZW50KXtyZXR1cm4gZWxlbWVudC52YWx1ZTt9CmNvbnN0IGlucHV0RWxlbWVudD0oZXZlbnQuY3VycmVudFRhcmdldCk7Y29uc3QgbmV3VmFsdWU9VUkuY3JlYXRlUmVwbGFjZW1lbnRTdHJpbmcoaW5wdXRFbGVtZW50LnZhbHVlLGV2ZW50KTtpZihuZXdWYWx1ZSl7aW5wdXRFbGVtZW50LnZhbHVlPW5ld1ZhbHVlO2lucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydD0wO2lucHV0RWxlbWVudC5zZWxlY3Rpb25FbmQ9bmV3VmFsdWUubGVuZ3RoO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fQpjb25zdCBjZj1Db21tb24uQ29sb3IuRm9ybWF0O2xldCBjb2xvclN0cmluZztpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLk5pY2tuYW1lfHx0aGlzLl9jb2xvckZvcm1hdD09PWNmLkhFWHx8dGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5TaG9ydEhFWCl7Y29sb3JTdHJpbmc9dGhpcy5faGV4VmFsdWUudmFsdWU7fWVsc2V7Y29uc3QgZm9ybWF0PXRoaXMuX2NvbG9yRm9ybWF0PT09Y2YuUkdCPydyZ2JhJzonaHNsYSc7Y29uc3QgdmFsdWVzPXRoaXMuX3RleHRWYWx1ZXMubWFwKGVsZW1lbnRWYWx1ZSkuam9pbignLCAnKTtjb2xvclN0cmluZz1TdHJpbmcuc3ByaW50ZignJXMoJXMpJyxmb3JtYXQsdmFsdWVzKTt9CmNvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShjb2xvclN0cmluZyk7aWYoIWNvbG9yKQpyZXR1cm47bGV0IGNvbG9yRm9ybWF0PXVuZGVmaW5lZDtpZih0aGlzLl9jb2xvckZvcm1hdD09PWNmLkhFWHx8dGhpcy5fY29sb3JGb3JtYXQ9PT1jZi5TaG9ydEhFWCkKY29sb3JGb3JtYXQ9Y29sb3IuZGV0ZWN0SEVYRm9ybWF0KCk7dGhpcy5faW5uZXJTZXRDb2xvcihjb2xvci5oc3ZhKCksY29sb3JTdHJpbmcsdW5kZWZpbmVkLGNvbG9yRm9ybWF0LENvbG9yUGlja2VyLlNwZWN0cnVtLl9DaGFuZ2VTb3VyY2UuSW5wdXQpO30Kd2FzU2hvd24oKXt0aGlzLl9odWVBbHBoYVdpZHRoPXRoaXMuX2h1ZUVsZW1lbnQub2Zmc2V0V2lkdGg7dGhpcy5zbGlkZUhlbHBlcldpZHRoPXRoaXMuX2h1ZVNsaWRlci5vZmZzZXRXaWR0aC8yO3RoaXMuZHJhZ1dpZHRoPXRoaXMuX2NvbG9yRWxlbWVudC5vZmZzZXRXaWR0aDt0aGlzLmRyYWdIZWlnaHQ9dGhpcy5fY29sb3JFbGVtZW50Lm9mZnNldEhlaWdodDt0aGlzLl9jb2xvckRyYWdFbGVtZW50SGVpZ2h0PXRoaXMuX2NvbG9yRHJhZ0VsZW1lbnQub2Zmc2V0SGVpZ2h0LzI7dGhpcy5faW5uZXJTZXRDb2xvcih1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsQ29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZS5Nb2RlbCk7dGhpcy5fdG9nZ2xlQ29sb3JQaWNrZXIodHJ1ZSk7fQp3aWxsSGlkZSgpe3RoaXMuX3RvZ2dsZUNvbG9yUGlja2VyKGZhbHNlKTt9Cl90b2dnbGVDb2xvclBpY2tlcihlbmFibGVkLGV2ZW50KXtpZihlbmFibGVkPT09dW5kZWZpbmVkKQplbmFibGVkPSF0aGlzLl9jb2xvclBpY2tlckJ1dHRvbi50b2dnbGVkKCk7dGhpcy5fY29sb3JQaWNrZXJCdXR0b24uc2V0VG9nZ2xlZChlbmFibGVkKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RXllRHJvcHBlckFjdGl2ZShlbmFibGVkKTtpZihlbmFibGVkKXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yRnJvbnRlbmRIb3N0QVBJLkV2ZW50cy5FeWVEcm9wcGVyUGlja2VkQ29sb3IsdGhpcy5fY29sb3JQaWNrZWRCb3VuZCk7fWVsc2V7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmV2ZW50cy5yZW1vdmVFdmVudExpc3RlbmVyKEluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5FdmVudHMuRXllRHJvcHBlclBpY2tlZENvbG9yLHRoaXMuX2NvbG9yUGlja2VkQm91bmQpO319Cl9jb2xvclBpY2tlZChldmVudCl7Y29uc3QgcmdiQ29sb3I9KGV2ZW50LmRhdGEpO2NvbnN0IHJnYmE9W3JnYkNvbG9yLnIscmdiQ29sb3IuZyxyZ2JDb2xvci5iLChyZ2JDb2xvci5hLzIuNTV8MCkvMTAwXTtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IuZnJvbVJHQkEocmdiYSk7dGhpcy5faW5uZXJTZXRDb2xvcihjb2xvci5oc3ZhKCksJycsdW5kZWZpbmVkLHVuZGVmaW5lZCxDb2xvclBpY2tlci5TcGVjdHJ1bS5fQ2hhbmdlU291cmNlLk90aGVyKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuYnJpbmdUb0Zyb250KCk7fX07Q29sb3JQaWNrZXIuU3BlY3RydW0uX0NoYW5nZVNvdXJjZT17SW5wdXQ6J0lucHV0JyxNb2RlbDonTW9kZWwnLE90aGVyOidPdGhlcid9O0NvbG9yUGlja2VyLlNwZWN0cnVtLkV2ZW50cz17Q29sb3JDaGFuZ2VkOlN5bWJvbCgnQ29sb3JDaGFuZ2VkJyksU2l6ZUNoYW5nZWQ6U3ltYm9sKCdTaXplQ2hhbmdlZCcpfTtDb2xvclBpY2tlci5TcGVjdHJ1bS5fY29sb3JDaGlwU2l6ZT0yNDtDb2xvclBpY2tlci5TcGVjdHJ1bS5faXRlbXNQZXJQYWxldHRlUm93PTg7Q29sb3JQaWNrZXIuU3BlY3RydW0uUGFsZXR0ZTtDb2xvclBpY2tlci5TcGVjdHJ1bS5HZW5lcmF0ZWRQYWxldHRlVGl0bGU9J1BhZ2UgY29sb3JzJztDb2xvclBpY2tlci5TcGVjdHJ1bS5QYWxldHRlR2VuZXJhdG9yPWNsYXNze2NvbnN0cnVjdG9yKGNhbGxiYWNrKXt0aGlzLl9jYWxsYmFjaz1jYWxsYmFjazt0aGlzLl9mcmVxdWVuY3lNYXA9bmV3IE1hcCgpO2NvbnN0IHN0eWxlc2hlZXRQcm9taXNlcz1bXTtmb3IoY29uc3QgY3NzTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5DU1NNb2RlbCkpe2Zvcihjb25zdCBzdHlsZXNoZWV0IG9mIGNzc01vZGVsLmFsbFN0eWxlU2hlZXRzKCkpCnN0eWxlc2hlZXRQcm9taXNlcy5wdXNoKHRoaXMuX3Byb2Nlc3NTdHlsZXNoZWV0KHN0eWxlc2hlZXQpKTt9ClByb21pc2UuYWxsKHN0eWxlc2hlZXRQcm9taXNlcykuY2F0Y2hFeGNlcHRpb24obnVsbCkudGhlbih0aGlzLl9maW5pc2guYmluZCh0aGlzKSk7fQpfZnJlcXVlbmN5Q29tcGFyYXRvcihhLGIpe3JldHVybiB0aGlzLl9mcmVxdWVuY3lNYXAuZ2V0KGIpLXRoaXMuX2ZyZXF1ZW5jeU1hcC5nZXQoYSk7fQpfZmluaXNoKCl7ZnVuY3Rpb24gaHVlQ29tcGFyYXRvcihhLGIpe2NvbnN0IGhzdmE9cGFsZXR0ZUNvbG9ycy5nZXQoYSkuaHN2YSgpO2NvbnN0IGhzdmI9cGFsZXR0ZUNvbG9ycy5nZXQoYikuaHN2YSgpO2lmKGhzdmJbMV08MC4xMiYmaHN2YVsxXTwwLjEyKQpyZXR1cm4gaHN2YlsyXSpoc3ZiWzNdLWhzdmFbMl0qaHN2YVszXTtpZihoc3ZiWzFdPDAuMTIpCnJldHVybi0xO2lmKGhzdmFbMV08MC4xMikKcmV0dXJuIDE7aWYoaHN2YlswXT09PWhzdmFbMF0pCnJldHVybiBoc3ZiWzFdKmhzdmJbM10taHN2YVsxXSpoc3ZhWzNdO3JldHVybihoc3ZiWzBdKzAuOTQpJTEtKGhzdmFbMF0rMC45NCklMTt9CmxldCBjb2xvcnM9dGhpcy5fZnJlcXVlbmN5TWFwLmtleXNBcnJheSgpO2NvbG9ycz1jb2xvcnMuc29ydCh0aGlzLl9mcmVxdWVuY3lDb21wYXJhdG9yLmJpbmQodGhpcykpO2NvbnN0IHBhbGV0dGVDb2xvcnM9bmV3IE1hcCgpO2NvbnN0IGNvbG9yc1BlclJvdz0yNDt3aGlsZShwYWxldHRlQ29sb3JzLnNpemU8Y29sb3JzUGVyUm93JiZjb2xvcnMubGVuZ3RoKXtjb25zdCBjb2xvclRleHQ9Y29sb3JzLnNoaWZ0KCk7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGNvbG9yVGV4dCk7aWYoIWNvbG9yfHxjb2xvci5uaWNrbmFtZSgpPT09J3doaXRlJ3x8Y29sb3Iubmlja25hbWUoKT09PSdibGFjaycpCmNvbnRpbnVlO3BhbGV0dGVDb2xvcnMuc2V0KGNvbG9yVGV4dCxjb2xvcik7fQp0aGlzLl9jYWxsYmFjayh7dGl0bGU6Q29sb3JQaWNrZXIuU3BlY3RydW0uR2VuZXJhdGVkUGFsZXR0ZVRpdGxlLGNvbG9yczpwYWxldHRlQ29sb3JzLmtleXNBcnJheSgpLnNvcnQoaHVlQ29tcGFyYXRvciksY29sb3JOYW1lczpbXSxtdXRhYmxlOmZhbHNlfSk7fQphc3luYyBfcHJvY2Vzc1N0eWxlc2hlZXQoc3R5bGVzaGVldCl7bGV0IHRleHQ9YXdhaXQgc3R5bGVzaGVldC5yZXF1ZXN0Q29udGVudCgpfHwnJzt0ZXh0PXRleHQudG9Mb3dlckNhc2UoKTtjb25zdCByZWdleFJlc3VsdD10ZXh0Lm1hdGNoKC8oKD86cmdifGhzbClhP1woW14pXStcKXwjWzAtOWEtZl17Nn18I1swLTlhLWZdezN9KS9nKXx8W107Zm9yKGNvbnN0IGMgb2YgcmVnZXhSZXN1bHQpe2xldCBmcmVxdWVuY3k9dGhpcy5fZnJlcXVlbmN5TWFwLmdldChjKXx8MDt0aGlzLl9mcmVxdWVuY3lNYXAuc2V0KGMsKytmcmVxdWVuY3kpO319fTtDb2xvclBpY2tlci5TcGVjdHJ1bS5NYXRlcmlhbFBhbGV0dGVTaGFkZXM9eycjRjQ0MzM2JzpbJyNGRkVCRUUnLCcjRkZDREQyJywnI0VGOUE5QScsJyNFNTczNzMnLCcjRUY1MzUwJywnI0Y0NDMzNicsJyNFNTM5MzUnLCcjRDMyRjJGJywnI0M2MjgyOCcsJyNCNzFDMUMnXSwnI0U5MUU2Myc6WycjRkNFNEVDJywnI0Y4QkJEMCcsJyNGNDhGQjEnLCcjRjA2MjkyJywnI0VDNDA3QScsJyNFOTFFNjMnLCcjRDgxQjYwJywnI0MyMTg1QicsJyNBRDE0NTcnLCcjODgwRTRGJ10sJyM5QzI3QjAnOlsnI0YzRTVGNScsJyNFMUJFRTcnLCcjQ0U5M0Q4JywnI0JBNjhDOCcsJyNBQjQ3QkMnLCcjOUMyN0IwJywnIzhFMjRBQScsJyM3QjFGQTInLCcjNkExQjlBJywnIzRBMTQ4QyddLCcjNjczQUI3JzpbJyNFREU3RjYnLCcjRDFDNEU5JywnI0IzOUREQicsJyM5NTc1Q0QnLCcjN0U1N0MyJywnIzY3M0FCNycsJyM1RTM1QjEnLCcjNTEyREE4JywnIzQ1MjdBMCcsJyMzMTFCOTInXSwnIzNGNTFCNSc6WycjRThFQUY2JywnI0M1Q0FFOScsJyM5RkE4REEnLCcjNzk4NkNCJywnIzVDNkJDMCcsJyMzRjUxQjUnLCcjMzk0OUFCJywnIzMwM0Y5RicsJyMyODM1OTMnLCcjMUEyMzdFJ10sJyMyMTk2RjMnOlsnI0UzRjJGRCcsJyNCQkRFRkInLCcjOTBDQUY5JywnIzY0QjVGNicsJyM0MkE1RjUnLCcjMjE5NkYzJywnIzFFODhFNScsJyMxOTc2RDInLCcjMTU2NUMwJywnIzBENDdBMSddLCcjMDNBOUY0JzpbJyNFMUY1RkUnLCcjQjNFNUZDJywnIzgxRDRGQScsJyM0RkMzRjcnLCcjMjlCNkY2JywnIzAzQTlGNCcsJyMwMzlCRTUnLCcjMDI4OEQxJywnIzAyNzdCRCcsJyMwMTU3OUInXSwnIzAwQkNENCc6WycjRTBGN0ZBJywnI0IyRUJGMicsJyM4MERFRUEnLCcjNEREMEUxJywnIzI2QzZEQScsJyMwMEJDRDQnLCcjMDBBQ0MxJywnIzAwOTdBNycsJyMwMDgzOEYnLCcjMDA2MDY0J10sJyMwMDk2ODgnOlsnI0UwRjJGMScsJyNCMkRGREInLCcjODBDQkM0JywnIzREQjZBQycsJyMyNkE2OUEnLCcjMDA5Njg4JywnIzAwODk3QicsJyMwMDc5NkInLCcjMDA2OTVDJywnIzAwNEQ0MCddLCcjNENBRjUwJzpbJyNFOEY1RTknLCcjQzhFNkM5JywnI0E1RDZBNycsJyM4MUM3ODQnLCcjNjZCQjZBJywnIzRDQUY1MCcsJyM0M0EwNDcnLCcjMzg4RTNDJywnIzJFN0QzMicsJyMxQjVFMjAnXSwnIzhCQzM0QSc6WycjRjFGOEU5JywnI0RDRURDOCcsJyNDNUUxQTUnLCcjQUVENTgxJywnIzlDQ0M2NScsJyM4QkMzNEEnLCcjN0NCMzQyJywnIzY4OUYzOCcsJyM1NThCMkYnLCcjMzM2OTFFJ10sJyNDRERDMzknOlsnI0Y5RkJFNycsJyNGMEY0QzMnLCcjRTZFRTlDJywnI0RDRTc3NScsJyNENEUxNTcnLCcjQ0REQzM5JywnI0MwQ0EzMycsJyNBRkI0MkInLCcjOUU5RDI0JywnIzgyNzcxNyddLCcjRkZFQjNCJzpbJyNGRkZERTcnLCcjRkZGOUM0JywnI0ZGRjU5RCcsJyNGRkYxNzYnLCcjRkZFRTU4JywnI0ZGRUIzQicsJyNGREQ4MzUnLCcjRkJDMDJEJywnI0Y5QTgyNScsJyNGNTdGMTcnXSwnI0ZGQzEwNyc6WycjRkZGOEUxJywnI0ZGRUNCMycsJyNGRkUwODInLCcjRkZENTRGJywnI0ZGQ0EyOCcsJyNGRkMxMDcnLCcjRkZCMzAwJywnI0ZGQTAwMCcsJyNGRjhGMDAnLCcjRkY2RjAwJ10sJyNGRjk4MDAnOlsnI0ZGRjNFMCcsJyNGRkUwQjInLCcjRkZDQzgwJywnI0ZGQjc0RCcsJyNGRkE3MjYnLCcjRkY5ODAwJywnI0ZCOEMwMCcsJyNGNTdDMDAnLCcjRUY2QzAwJywnI0U2NTEwMCddLCcjRkY1NzIyJzpbJyNGQkU5RTcnLCcjRkZDQ0JDJywnI0ZGQUI5MScsJyNGRjhBNjUnLCcjRkY3MDQzJywnI0ZGNTcyMicsJyNGNDUxMUUnLCcjRTY0QTE5JywnI0Q4NDMxNScsJyNCRjM2MEMnXSwnIzc5NTU0OCc6WycjRUZFQkU5JywnI0Q3Q0NDOCcsJyNCQ0FBQTQnLCcjQTE4ODdGJywnIzhENkU2MycsJyM3OTU1NDgnLCcjNkQ0QzQxJywnIzVENDAzNycsJyM0RTM0MkUnLCcjM0UyNzIzJ10sJyM5RTlFOUUnOlsnI0ZBRkFGQScsJyNGNUY1RjUnLCcjRUVFRUVFJywnI0UwRTBFMCcsJyNCREJEQkQnLCcjOUU5RTlFJywnIzc1NzU3NScsJyM2MTYxNjEnLCcjNDI0MjQyJywnIzIxMjEyMSddLCcjNjA3RDhCJzpbJyNFQ0VGRjEnLCcjQ0ZEOERDJywnI0IwQkVDNScsJyM5MEE0QUUnLCcjNzg5MDlDJywnIzYwN0Q4QicsJyM1NDZFN0EnLCcjNDU1QTY0JywnIzM3NDc0RicsJyMyNjMyMzgnXX07Q29sb3JQaWNrZXIuU3BlY3RydW0uTWF0ZXJpYWxQYWxldHRlPXt0aXRsZTonTWF0ZXJpYWwnLG11dGFibGU6ZmFsc2UsbWF0Y2hVc2VyRm9ybWF0OnRydWUsY29sb3JzOk9iamVjdC5rZXlzKENvbG9yUGlja2VyLlNwZWN0cnVtLk1hdGVyaWFsUGFsZXR0ZVNoYWRlcyksY29sb3JOYW1lczpbXX07Q29sb3JQaWNrZXIuU3BlY3RydW0uU3dhdGNoPWNsYXNze2NvbnN0cnVjdG9yKHBhcmVudEVsZW1lbnQpe3RoaXMuX2NvbG9yU3RyaW5nO2NvbnN0IHN3YXRjaEVsZW1lbnQ9cGFyZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N3YXRjaCcpO3RoaXMuX3N3YXRjaElubmVyRWxlbWVudD1zd2F0Y2hFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc3dhdGNoLWlubmVyJyk7dGhpcy5fc3dhdGNoT3ZlcmxheUVsZW1lbnQ9c3dhdGNoRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N3YXRjaC1vdmVybGF5Jyk7dGhpcy5fc3dhdGNoT3ZlcmxheUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uQ29weUljb25DbGljay5iaW5kKHRoaXMpKTt0aGlzLl9zd2F0Y2hPdmVybGF5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsdGhpcy5fb25Db3B5SWNvbk1vdXNlb3V0LmJpbmQodGhpcykpO3RoaXMuX3N3YXRjaENvcHlJY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tY29weScsJ2NvcHktY29sb3ItaWNvbicpO3RoaXMuX3N3YXRjaENvcHlJY29uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnQ29weSBjb2xvciB0byBjbGlwYm9hcmQnKTt0aGlzLl9zd2F0Y2hPdmVybGF5RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zd2F0Y2hDb3B5SWNvbik7fQpzZXRDb2xvcihjb2xvcixjb2xvclN0cmluZyl7dGhpcy5fc3dhdGNoSW5uZXJFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcj0oY29sb3IuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKSk7dGhpcy5fc3dhdGNoSW5uZXJFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3N3YXRjaC1pbm5lci13aGl0ZScsY29sb3IuaHNsYSgpWzJdPjAuOSk7dGhpcy5fY29sb3JTdHJpbmc9Y29sb3JTdHJpbmd8fG51bGw7aWYoY29sb3JTdHJpbmcpCnRoaXMuX3N3YXRjaE92ZXJsYXlFbGVtZW50LmhpZGRlbj1mYWxzZTtlbHNlCnRoaXMuX3N3YXRjaE92ZXJsYXlFbGVtZW50LmhpZGRlbj10cnVlO30KX29uQ29weUljb25DbGljaygpe3RoaXMuX3N3YXRjaENvcHlJY29uLnNldEljb25UeXBlKCdsYXJnZWljb24tY2hlY2ttYXJrJyk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KHRoaXMuX2NvbG9yU3RyaW5nKTt9Cl9vbkNvcHlJY29uTW91c2VvdXQoKXt0aGlzLl9zd2F0Y2hDb3B5SWNvbi5zZXRJY29uVHlwZSgnbGFyZ2VpY29uLWNvcHknKTt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNvbG9yX3BpY2tlci9zcGVjdHJ1bS5jc3MiXT0iLyogaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9zcGVjdHJ1bSAqL1xuOmhvc3Qge1xuICAgIHdpZHRoOiAyMzJweDtcbiAgICBoZWlnaHQ6IDI0MHB4O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuOmhvc3QtY29udGV4dCgucGFsZXR0ZXMtZW5hYmxlZCkge1xuICAgIGhlaWdodDogMzE5cHg7XG59XG5cbjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGJsdWU7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uc3BlY3RydW0tY29sb3Ige1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMjMycHg7XG4gICAgaGVpZ2h0OiAxMjRweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHggMnB4IDAgMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5zcGVjdHJ1bS10b29scyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMTExcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLnNwZWN0cnVtLWRpc3BsYXktdmFsdWUge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmctbGVmdDogMnB4O1xufVxuXG4uc3BlY3RydW0taHVlIHtcbiAgICB0b3A6IDE2cHg7XG59XG5cbi5zcGVjdHJ1bS1hbHBoYSB7XG4gICAgdG9wOiAzNXB4O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvY2hlY2tlci5wbmcpO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMXB4O1xufVxuXG4uc3BlY3RydW0tYWxwaGEtYmFja2dyb3VuZCB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuLnNwZWN0cnVtLWh1ZSwgLnNwZWN0cnVtLWFscGhhIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogODZweDtcbiAgICB3aWR0aDogMTMwcHg7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuLnNwZWN0cnVtLWRyYWdnZXIsXG4uc3BlY3RydW0tc2xpZGVyIHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uc3BlY3RydW0tc2F0LFxuLi10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB3aGl0ZSwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7XG59XG5cbi5zcGVjdHJ1bS12YWwsXG4uLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCBibGFjaywgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7XG59XG5cbi5zcGVjdHJ1bS1odWUge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAjZmYwMDAwIDAlLCAjZmZmZjAwIDE3JSwgIzAwZmYwMCAzMyUsICMwMGZmZmYgNTAlLCAjMDAwMGZmIDY3JSwgI2ZmMDBmZiA4MyUsICNmZjAwMDAgMTAwJSk7XG59XG5cbi5zcGVjdHJ1bS1kcmFnZ2VyIHtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGhlaWdodDogMTJweDtcbiAgICB3aWR0aDogMTJweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCB3aGl0ZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGJhY2tncm91bmQ6IGJsYWNrO1xuICAgIGJveC1zaGFkb3c6IDAgMCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7XG59XG5cbi5zcGVjdHJ1bS1zbGlkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IC0xcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxM3B4O1xuICAgIGhlaWdodDogMTNweDtcbiAgICBib3JkZXItcmFkaXVzOiAxM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDgsIDI0OCwgMjQ4KTtcbiAgICBib3gtc2hhZG93OiAwIDFweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMzcpO1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTExcHg7XG4gICAgdG9wOiAwO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBjb2xvcjogIzMzMztcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG4gICAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyB7XG4gICAgaGVpZ2h0OiA3OHB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1kZXRhaWxzLmNvbGxhcHNlZCB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1kZXRhaWxzIGRpdi50b29sYmFyLmV4cGFuZCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiA2cHg7XG4gICAgdG9wOiA2cHg7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyAudG9vbGJhci1zdGF0ZS1vbiBbaXM9dWktaWNvbl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTtcbn1cblxuLnNwZWN0cnVtLWNvbnRyYXN0LWRldGFpbHMudmlzaWJsZSB7XG4gICAgZGlzcGxheTogaW5pdGlhbDtcbn1cblxuLnNwZWN0cnVtLWNvbnRyYXN0LWRldGFpbHMgZGl2LmNvbnRhaW5lciB7XG4gICAgbWFyZ2luOiAxMHB4O1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscy5jb2xsYXBzZWQgLmV4cGFuZGVkLWRldGFpbHMge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1kZXRhaWxzIC5leHBhbmRlZC1kZXRhaWxzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbjogMTJweCAxMnB4IDAgNHB4O1xufVxuXG4uY29udHJhc3QtcGFzcy1mYWlsIHtcbiAgICBtYXJnaW4tbGVmdDogMC41ZW07XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1kZXRhaWxzIC5jb250cmFzdC1jaG9vc2UtYmctY29sb3IsXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyAuY29udHJhc3QtdGhyZXNob2xkcyB7XG4gICAgd2lkdGg6IDE0NXB4O1xufVxuXG4uY29udHJhc3QtY2hvb3NlLWJnLWNvbG9yIHtcbiAgICBtYXJnaW46IDhweCAwIDAgNXB4O1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLmNvbnRyYXN0LWxpbmstbGFiZWwge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmNvbnRyYXN0LWxpbmstbGFiZWw6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyAuYmFja2dyb3VuZC1jb2xvciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGZsZXg6IG5vbmU7XG4gICAgcmlnaHQ6IDEycHg7XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1kZXRhaWxzIC5zcGVjdHJ1bS1leWUtZHJvcHBlciB7XG4gICAgdG9wOiAycHg7XG4gICAgcmlnaHQ6IDM0cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IGF1dG87XG59XG5cbi5jb250cmFzdC10aHJlc2hvbGQtdmFsdWUge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uY29udHJhc3QtbGluayB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuNWVtO1xufVxuXG4uY29udHJhc3QtZGV0YWlscy12YWx1ZSB7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgbWFyZ2luOiAxcHggNXB4O1xuICAgIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4uY29udHJhc3QtZGV0YWlscy12YWx1ZSBbaXM9dWktaWNvbl0ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xufVxuXG5baXM9dWktaWNvbl0uc21hbGxpY29uLW5vIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG59XG5cbi5jb250cmFzdC1wYXNzLWZhaWwgc3Bhbltpcz11aS1pY29uXSB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbn1cblxuW2lzPXVpLWljb25dLnNtYWxsaWNvbi1jaGVja21hcmstc3F1YXJlLFxuW2lzPXVpLWljb25dLnNtYWxsaWNvbi1jaGVja21hcmstYmVoaW5kIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBiMDZmO1xufVxuXG4uc3BlY3RydW0tY29udHJhc3QtZGV0YWlscyAuY29udHJhc3QtZGV0YWlscy12YWx1ZS5jb250cmFzdC11bmtub3duIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBjb2xvcjogIzMzMztcbiAgICB3aWR0aDogM2VtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNvbnRyYXN0LWRldGFpbHMtdmFsdWUgLnNtYWxsaWNvbi1jaGVja21hcmstYmVoaW5kIHtcbiAgICBtYXJnaW4tbGVmdDogLTZweDtcbn1cblxuLnNwZWN0cnVtLWNvbnRyYXN0LWRldGFpbHMuY29udHJhc3QtZmFpbCAuY29udHJhc3QtZGV0YWlscy12YWx1ZSAuc21hbGxpY29uLW5vLFxuLmNvbnRyYXN0LWRldGFpbHMtdmFsdWUuY29udHJhc3QtYWEgLnNtYWxsaWNvbi1jaGVja21hcmstc3F1YXJlLFxuLmNvbnRyYXN0LWRldGFpbHMtdmFsdWUuY29udHJhc3QtYWFhIC5zbWFsbGljb24tY2hlY2ttYXJrLWJlaGluZCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5cbi5jb250cmFzdC1kZXRhaWxzLXZhbHVlIC5zbWFsbGljb24tbm8sXG4uY29udHJhc3QtZGV0YWlscy12YWx1ZSAuc21hbGxpY29uLWNoZWNrbWFyay1zcXVhcmUsXG4uY29udHJhc3QtZGV0YWlscy12YWx1ZSAuc21hbGxpY29uLWNoZWNrbWFyay1iZWhpbmQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnN3YXRjaCB7XG4gICAgd2lkdGg6IDMycHg7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxNXB4O1xuICAgIGxlZnQ6IDQ0cHg7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9jaGVja2VyLnBuZyk7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbn1cblxuLnN3YXRjaC1pbm5lcixcbi5zd2F0Y2gtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbn1cblxuLnN3YXRjaC1pbm5lci13aGl0ZSB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbn1cblxuLnN3YXRjaC1vdmVybGF5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMDtcbiAgICBwYWRkaW5nOiA0cHg7XG59XG5cbi5zd2F0Y2gtb3ZlcmxheTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMyk7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLnN3YXRjaC1vdmVybGF5OmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuNSk7XG59XG5cbi5jb3B5LWNvbG9yLWljb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG4uc3BlY3RydW0tdGV4dCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNjBweDtcbiAgICBsZWZ0OiAxNnB4O1xufVxuXG4uc3BlY3RydW0tdGV4dC12YWx1ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiA0MHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWluYWN0aXZlLXNoYWRvdyk7XG59XG5cbi5zcGVjdHJ1bS10ZXh0LWxhYmVsIHtcbiAgICBsZXR0ZXItc3BhY2luZzogMzkuNXB4O1xuICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjb2xvcjogIzk2OTY5NjtcbiAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICB3aWR0aDogMTc0cHg7XG59XG5cbi5zcGVjdHJ1bS10ZXh0LWhleCA+IC5zcGVjdHJ1bS10ZXh0LXZhbHVlIHtcbiAgICB3aWR0aDogMTc4cHg7XG59XG5cbi5zcGVjdHJ1bS10ZXh0LWhleCA+IC5zcGVjdHJ1bS10ZXh0LWxhYmVsIHtcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZS12YWx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDY1LCA3NSwgMjE3KTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgbWFyZ2luLXRvcDogMTJweDtcbiAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgICB3aWR0aDogMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uc3BlY3RydW0tc3dpdGNoZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgcGFkZGluZzogMnB4O1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5zcGVjdHJ1bS1zd2l0Y2hlciB7XG4gICAgLXdlYmtpdC1maWx0ZXI6IGludmVydCg2MCUpO1xufVxuXG4uc3BlY3RydW0tZGlzcGxheS1zd2l0Y2hlciB7XG4gICAgdG9wOiA3MnB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMTBweDtcbn1cblxuLnNwZWN0cnVtLXN3aXRjaGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFRUVFO1xufVxuXG4uc3BlY3RydW0tZXllLWRyb3BwZXIge1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogOHB4O1xuICAgIHRvcDogMTdweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5zcGVjdHJ1bS1wYWxldHRlLWNvbnRhaW5lciB7XG4gICAgYm9yZGVyLXRvcDogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiA2cHggMjRweCA2cHggNnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgd2lkdGg6IDE5OHB4O1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZS1jb2xvciB7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIGZsZXg6IDAgMCAxMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW46IDZweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMXB4ICFpbXBvcnRhbnQ7XG4gICAgei1pbmRleDogMTQ7XG59XG5cbi5zcGVjdHJ1bS1wYWxldHRlLWNvbG9yOmhvdmVyOm5vdCguc3BlY3RydW0tc2hhZGVzLXNob3duKSA+IC5zcGVjdHJ1bS1wYWxldHRlLWNvbG9yLXNoYWRvdyB7XG4gICAgb3BhY2l0eTogMC4yO1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZS1jb2xvcjpob3Zlcjpub3QoLnNwZWN0cnVtLXNoYWRlcy1zaG93bikgPiAuc3BlY3RydW0tcGFsZXR0ZS1jb2xvci1zaGFkb3c6Zmlyc3QtY2hpbGQge1xuICAgIG9wYWNpdHk6IDAuNjtcbiAgICB0b3A6IC0zcHg7XG4gICAgbGVmdDogMXB4O1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZS1jb2xvci1zaGFkb3cge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB0b3A6IC01cHg7XG4gICAgbGVmdDogM3B4O1xufVxuXG4ucGFsZXR0ZS1jb2xvci1zaGFkZXMge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBoZWlnaHQ6IDIyOHB4O1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLCAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgei1pbmRleDogMTQ7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IDBweCAyMjhweDtcbiAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtOHB4O1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZSA+IC5zcGVjdHJ1bS1wYWxldHRlLWNvbG9yLnNwZWN0cnVtLXNoYWRlcy1zaG93biB7XG4gICAgei1pbmRleDogMTU7XG59XG5cbi5wYWxldHRlLWNvbG9yLXNoYWRlcyA+IC5zcGVjdHJ1bS1wYWxldHRlLWNvbG9yIHtcbiAgICBtYXJnaW46IDhweCAwIDAgMDtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIHdpZHRoOiAxMnB4O1xufVxuXG4uc3BlY3RydW0tcGFsZXR0ZSA+IC5zcGVjdHJ1bS1wYWxldHRlLWNvbG9yIHtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICB6LWluZGV4OiAxMztcbn1cblxuLnNwZWN0cnVtLXBhbGV0dGUgPiAuc3BlY3RydW0tcGFsZXR0ZS1jb2xvci5lbXB0eS1jb2xvciB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLnNwZWN0cnVtLXBhbGV0dGUgPiAuc3BlY3RydW0tcGFsZXR0ZS1jb2xvcjpub3QoLmVtcHR5LWNvbG9yKTpub3QoLmhhcy1tYXRlcmlhbC1zaGFkZXMpOmhvdmVyLFxuLnBhbGV0dGUtY29sb3Itc2hhZGVzID4gLnNwZWN0cnVtLXBhbGV0dGUtY29sb3I6bm90KC5lbXB0eS1jb2xvcik6aG92ZXIge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSk7XG59XG5cbi5hZGQtY29sb3ItdG9vbGJhciB7XG4gICAgbWFyZ2luLWxlZnQ6IC0zcHg7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbn1cblxuLnNwZWN0cnVtLXBhbGV0dGUtc3dpdGNoZXIge1xuICAgIHJpZ2h0OiAxMHB4O1xuICAgIHRvcDogMDtcbiAgICBtYXJnaW4tdG9wOiA5cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ucGFsZXR0ZS1wYW5lbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHotaW5kZXg6IDE0O1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSwgdmlzaWJpbGl0eSAwcyAyMDBtcztcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuXG4ucGFsZXR0ZS1wYW5lbC1zaG93aW5nID4gLnBhbGV0dGUtcGFuZWwge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0xMDAlICsgMTA0cHgpKTtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG4ucGFsZXR0ZS1wYW5lbCA+IGRpdi50b29sYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDZweDtcbiAgICB0b3A6IDZweDtcbn1cblxuLnBhbGV0dGUtcGFuZWwgPiBkaXY6bm90KC50b29sYmFyKSB7XG4gICAgZmxleDogMCAwIDM4cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xuICAgIHBhZGRpbmc6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5wYWxldHRlLXBhbmVsID4gZGl2LnBhbGV0dGUtdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICBjb2xvcjogIzMzMztcbiAgICBmbGV4LWJhc2lzOiA0MHB4O1xufVxuXG5kaXYucGFsZXR0ZS1wcmV2aWV3IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnBhbGV0dGUtcHJldmlldy10aXRsZSB7XG4gICAgZmxleDogMCAwIDg0cHg7XG59XG5cbi5wYWxldHRlLXByZXZpZXcgPiAuc3BlY3RydW0tcGFsZXR0ZS1jb2xvciB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xufVxuXG4ucGFsZXR0ZS1wcmV2aWV3OmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xufVxuXG4uc3BlY3RydW0tb3ZlcmxheSB7XG4gICAgei1pbmRleDogMTM7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDAlLCAwLjUpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSwgdmlzaWJpbGl0eSAwcyAxMDBtcztcbn1cblxuLnBhbGV0dGUtcGFuZWwtc2hvd2luZyA+IC5zcGVjdHJ1bS1vdmVybGF5IHtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiAwcztcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbi5zcGVjdHJ1bS1jb250cmFzdC1jb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLnNwZWN0cnVtLWNvbnRyYXN0LWxpbmUsXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5zcGVjdHJ1bS1jb250cmFzdC1saW5lIHtcbiAgICBmaWxsOiBub25lO1xuICAgIHN0cm9rZTogd2hpdGU7XG4gICAgb3BhY2l0eTogMC43O1xuICAgIHN0cm9rZS13aWR0aDogMS41cHg7XG59XG5cbi5kZWxldGUtY29sb3ItdG9vbGJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRvcDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB6LWluZGV4OiAzO1xuICAgIHdpZHRoOiAzNnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcbiAgICBib3R0b206IDJweDtcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4O1xufVxuXG5Aa2V5ZnJhbWVzIHNob3dEZWxldGVUb29sYmFyIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cblxuLmRlbGV0ZS1jb2xvci10b29sYmFyLmRyYWdnaW5nIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIGFuaW1hdGlvbjogc2hvd0RlbGV0ZVRvb2xiYXIgMTAwbXMgMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkgYmFja3dhcmRzO1xufVxuXG4uZGVsZXRlLWNvbG9yLXRvb2xiYXItYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnN3YXRjaC5jb250cmFzdCB7XG4gICAgd2lkdGg6IDMwcHg7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDBweDtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvY2hlY2tlci5wbmcpO1xuICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc3dhdGNoLmNvbnRyYXN0IC5zd2F0Y2gtb3ZlcmxheSB7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmJhY2tncm91bmQtY29sb3IgLnRleHQtcHJldmlldyB7XG4gICAgY29sb3I6IGJsYWNrO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZy1ib3R0b206IDJweDtcbn1cblxuLnN3YXRjaC5jb250cmFzdCBbaXM9dWktaWNvbl0ge1xuICAgIG1hcmdpbjogLTJweDtcbn1cblxuYnV0dG9uLmJhY2tncm91bmQtY29sb3ItcGlja2VyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogIDA7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwO1xufVxuXG5idXR0b24uYmFja2dyb3VuZC1jb2xvci1waWNrZXIuYWN0aXZlIFtpcz11aS1pY29uXS5sYXJnZWljb24tZXllZHJvcHBlci5pY29uLW1hc2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTgsIDgxJSwgNTklKTtcbn1cblxuYnV0dG9uLmJhY2tncm91bmQtY29sb3ItcGlja2VyOmhvdmVyIFtpcz11aS1pY29uXS5sYXJnZWljb24tZXllZHJvcHBlci5pY29uLW1hc2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG5cbi8qIyBzb3VyY2VVUkw9Y29sb3JfcGlja2VyL3NwZWN0cnVtLmNzcyAqLyI7Q29uc29sZS5Db25zb2xlQ29udGV4dFNlbGVjdG9yPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5faXRlbXM9bmV3IFVJLkxpc3RNb2RlbCgpO3RoaXMuX2Ryb3BEb3duPW5ldyBVSS5Tb2Z0RHJvcERvd24odGhpcy5faXRlbXMsdGhpcyk7dGhpcy5fZHJvcERvd24uc2V0Um93SGVpZ2h0KDM2KTt0aGlzLl90b29sYmFySXRlbT1uZXcgVUkuVG9vbGJhckl0ZW0odGhpcy5fZHJvcERvd24uZWxlbWVudCk7dGhpcy5fdG9vbGJhckl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fdG9vbGJhckl0ZW0uc2V0VGl0bGUobHNgSmF2YVNjcmlwdCBjb250ZXh0c2ApO3RoaXMuX2l0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoVUkuTGlzdE1vZGVsLkV2ZW50cy5JdGVtc1JlcGxhY2VkLCgpPT50aGlzLl90b29sYmFySXRlbS5zZXRFbmFibGVkKCEhdGhpcy5faXRlbXMubGVuZ3RoKSk7dGhpcy5fYmFkZ2VQb29sRm9yRXhlY3V0aW9uQ29udGV4dD1uZXcgTWFwKCk7dGhpcy5fdG9vbGJhckl0ZW0uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sYmFyLWhhcy1kcm9wZG93bicpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q3JlYXRlZCx0aGlzLl9vbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q2hhbmdlZCx0aGlzLl9vbkV4ZWN1dGlvbkNvbnRleHRDaGFuZ2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJ1bnRpbWVNb2RlbCxTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0RGVzdHJveWVkLHRoaXMuX29uRXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbCxTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkZyYW1lTmF2aWdhdGVkLHRoaXMuX2ZyYW1lTmF2aWdhdGVkLHRoaXMpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkV4ZWN1dGlvbkNvbnRleHQsdGhpcy5fZXhlY3V0aW9uQ29udGV4dENoYW5nZWRFeHRlcm5hbGx5LHRoaXMpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lLHRoaXMuX2NhbGxGcmFtZVNlbGVjdGVkSW5VSSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNESy5SdW50aW1lTW9kZWwsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbCxTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuQ2FsbEZyYW1lU2VsZWN0ZWQsdGhpcy5fY2FsbEZyYW1lU2VsZWN0ZWRJbk1vZGVsLHRoaXMpO30KdG9vbGJhckl0ZW0oKXtyZXR1cm4gdGhpcy5fdG9vbGJhckl0ZW07fQpoaWdobGlnaHRlZEl0ZW1DaGFuZ2VkKGZyb20sdG8sZnJvbUVsZW1lbnQsdG9FbGVtZW50KXtTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7aWYodG8mJnRvLmZyYW1lSWQpe2NvbnN0IG92ZXJsYXlNb2RlbD10by50YXJnZXQoKS5tb2RlbChTREsuT3ZlcmxheU1vZGVsKTtpZihvdmVybGF5TW9kZWwpCm92ZXJsYXlNb2RlbC5oaWdobGlnaHRGcmFtZSh0by5mcmFtZUlkKTt9CmlmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZCcpO2lmKHRvRWxlbWVudCkKdG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7fQp0aXRsZUZvcihleGVjdXRpb25Db250ZXh0KXtjb25zdCB0YXJnZXQ9ZXhlY3V0aW9uQ29udGV4dC50YXJnZXQoKTtsZXQgbGFiZWw9ZXhlY3V0aW9uQ29udGV4dC5sYWJlbCgpP3RhcmdldC5kZWNvcmF0ZUxhYmVsKGV4ZWN1dGlvbkNvbnRleHQubGFiZWwoKSk6Jyc7aWYoZXhlY3V0aW9uQ29udGV4dC5mcmFtZUlkKXtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtjb25zdCBmcmFtZT1yZXNvdXJjZVRyZWVNb2RlbCYmcmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JJZChleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpO2lmKGZyYW1lKQpsYWJlbD1sYWJlbHx8ZnJhbWUuZGlzcGxheU5hbWUoKTt9CmxhYmVsPWxhYmVsfHxleGVjdXRpb25Db250ZXh0Lm9yaWdpbjtyZXR1cm4gbGFiZWw7fQpfZGVwdGhGb3IoZXhlY3V0aW9uQ29udGV4dCl7bGV0IHRhcmdldD1leGVjdXRpb25Db250ZXh0LnRhcmdldCgpO2xldCBkZXB0aD0wO2lmKCFleGVjdXRpb25Db250ZXh0LmlzRGVmYXVsdCkKZGVwdGgrKztpZihleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2xldCBmcmFtZT1yZXNvdXJjZVRyZWVNb2RlbCYmcmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JJZChleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpO3doaWxlKGZyYW1lKXtmcmFtZT1mcmFtZS5wYXJlbnRGcmFtZXx8ZnJhbWUuY3Jvc3NUYXJnZXRQYXJlbnRGcmFtZSgpO2lmKGZyYW1lKXtkZXB0aCsrO3RhcmdldD1mcmFtZS5yZXNvdXJjZVRyZWVNb2RlbCgpLnRhcmdldCgpO319fQpsZXQgdGFyZ2V0RGVwdGg9MDt3aGlsZSh0YXJnZXQucGFyZW50VGFyZ2V0KCkpe2lmKHRhcmdldC5wYXJlbnRUYXJnZXQoKS5oYXNKU0NhcGFiaWxpdHkoKSl7dGFyZ2V0RGVwdGgrKzt9ZWxzZXt0YXJnZXREZXB0aD0wO2JyZWFrO30KdGFyZ2V0PXRhcmdldC5wYXJlbnRUYXJnZXQoKTt9CmRlcHRoKz10YXJnZXREZXB0aDtyZXR1cm4gZGVwdGg7fQpfYmFkZ2VGb3IoZXhlY3V0aW9uQ29udGV4dCl7aWYoIWV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZHx8IWV4ZWN1dGlvbkNvbnRleHQuaXNEZWZhdWx0KQpyZXR1cm4gbnVsbDtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1leGVjdXRpb25Db250ZXh0LnRhcmdldCgpLm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7Y29uc3QgZnJhbWU9cmVzb3VyY2VUcmVlTW9kZWwmJnJlc291cmNlVHJlZU1vZGVsLmZyYW1lRm9ySWQoZXhlY3V0aW9uQ29udGV4dC5mcmFtZUlkKTtpZighZnJhbWUpCnJldHVybiBudWxsO2NvbnN0IGJhZGdlUG9vbD1uZXcgUHJvZHVjdFJlZ2lzdHJ5LkJhZGdlUG9vbCgpO3RoaXMuX2JhZGdlUG9vbEZvckV4ZWN1dGlvbkNvbnRleHQuc2V0KGV4ZWN1dGlvbkNvbnRleHQsYmFkZ2VQb29sKTtyZXR1cm4gYmFkZ2VQb29sLmJhZGdlRm9yRnJhbWUoZnJhbWUpO30KX2Rpc3Bvc2VFeGVjdXRpb25Db250ZXh0QmFkZ2UoZXhlY3V0aW9uQ29udGV4dCl7Y29uc3QgYmFkZ2VQb29sPXRoaXMuX2JhZGdlUG9vbEZvckV4ZWN1dGlvbkNvbnRleHQuZ2V0KGV4ZWN1dGlvbkNvbnRleHQpO2lmKCFiYWRnZVBvb2wpCnJldHVybjtiYWRnZVBvb2wucmVzZXQoKTt0aGlzLl9iYWRnZVBvb2xGb3JFeGVjdXRpb25Db250ZXh0LmRlbGV0ZShleGVjdXRpb25Db250ZXh0KTt9Cl9leGVjdXRpb25Db250ZXh0Q3JlYXRlZChleGVjdXRpb25Db250ZXh0KXtpZighZXhlY3V0aW9uQ29udGV4dC50YXJnZXQoKS5oYXNKU0NhcGFiaWxpdHkoKSkKcmV0dXJuO3RoaXMuX2l0ZW1zLmluc2VydFdpdGhDb21wYXJhdG9yKGV4ZWN1dGlvbkNvbnRleHQsZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWwuZXhlY3V0aW9uQ29udGV4dENvbXBhcmF0b3IoKSk7aWYoZXhlY3V0aW9uQ29udGV4dD09PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KSkKdGhpcy5fZHJvcERvd24uc2VsZWN0SXRlbShleGVjdXRpb25Db250ZXh0KTt9Cl9vbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGV2ZW50KXtjb25zdCBleGVjdXRpb25Db250ZXh0PShldmVudC5kYXRhKTt0aGlzLl9leGVjdXRpb25Db250ZXh0Q3JlYXRlZChleGVjdXRpb25Db250ZXh0KTt9Cl9vbkV4ZWN1dGlvbkNvbnRleHRDaGFuZ2VkKGV2ZW50KXtjb25zdCBleGVjdXRpb25Db250ZXh0PShldmVudC5kYXRhKTtpZih0aGlzLl9pdGVtcy5pbmRleE9mKGV4ZWN1dGlvbkNvbnRleHQpPT09LTEpCnJldHVybjt0aGlzLl9leGVjdXRpb25Db250ZXh0RGVzdHJveWVkKGV4ZWN1dGlvbkNvbnRleHQpO3RoaXMuX2V4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGV4ZWN1dGlvbkNvbnRleHQpO30KX2V4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQoZXhlY3V0aW9uQ29udGV4dCl7Y29uc3QgaW5kZXg9dGhpcy5faXRlbXMuaW5kZXhPZihleGVjdXRpb25Db250ZXh0KTtpZihpbmRleD09PS0xKQpyZXR1cm47dGhpcy5fZGlzcG9zZUV4ZWN1dGlvbkNvbnRleHRCYWRnZShleGVjdXRpb25Db250ZXh0KTt0aGlzLl9pdGVtcy5yZW1vdmUoaW5kZXgpO30KX29uRXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZChldmVudCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD0oZXZlbnQuZGF0YSk7dGhpcy5fZXhlY3V0aW9uQ29udGV4dERlc3Ryb3llZChleGVjdXRpb25Db250ZXh0KTt9Cl9leGVjdXRpb25Db250ZXh0Q2hhbmdlZEV4dGVybmFsbHkoZXZlbnQpe2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9KGV2ZW50LmRhdGEpO3RoaXMuX2Ryb3BEb3duLnNlbGVjdEl0ZW0oZXhlY3V0aW9uQ29udGV4dCk7fQpfaXNUb3BDb250ZXh0KGV4ZWN1dGlvbkNvbnRleHQpe2lmKCFleGVjdXRpb25Db250ZXh0fHwhZXhlY3V0aW9uQ29udGV4dC5pc0RlZmF1bHQpCnJldHVybiBmYWxzZTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1leGVjdXRpb25Db250ZXh0LnRhcmdldCgpLm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7Y29uc3QgZnJhbWU9ZXhlY3V0aW9uQ29udGV4dC5mcmFtZUlkJiZyZXNvdXJjZVRyZWVNb2RlbCYmcmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JJZChleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpO2lmKCFmcmFtZSkKcmV0dXJuIGZhbHNlO3JldHVybiBmcmFtZS5pc1RvcEZyYW1lKCk7fQpfaGFzVG9wQ29udGV4dCgpe3JldHVybiB0aGlzLl9pdGVtcy5zb21lKGV4ZWN1dGlvbkNvbnRleHQ9PnRoaXMuX2lzVG9wQ29udGV4dChleGVjdXRpb25Db250ZXh0KSk7fQptb2RlbEFkZGVkKHJ1bnRpbWVNb2RlbCl7cnVudGltZU1vZGVsLmV4ZWN1dGlvbkNvbnRleHRzKCkuZm9yRWFjaCh0aGlzLl9leGVjdXRpb25Db250ZXh0Q3JlYXRlZCx0aGlzKTt9Cm1vZGVsUmVtb3ZlZChydW50aW1lTW9kZWwpe2ZvcihsZXQgaT10aGlzLl9pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSl7aWYodGhpcy5faXRlbXMuYXQoaSkucnVudGltZU1vZGVsPT09cnVudGltZU1vZGVsKQp0aGlzLl9leGVjdXRpb25Db250ZXh0RGVzdHJveWVkKHRoaXMuX2l0ZW1zLmF0KGkpKTt9fQpjcmVhdGVFbGVtZW50Rm9ySXRlbShpdGVtKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKGVsZW1lbnQsJ2NvbnNvbGUvY29uc29sZUNvbnRleHRTZWxlY3Rvci5jc3MnKTtjb25zdCB0aXRsZT1zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aXRsZScpO3RpdGxlLmNyZWF0ZVRleHRDaGlsZCh0aGlzLnRpdGxlRm9yKGl0ZW0pLnRyaW1FbmQoMTAwKSk7Y29uc3Qgc3ViVGl0bGU9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2Jywnc3VidGl0bGUnKTtjb25zdCBiYWRnZUVsZW1lbnQ9dGhpcy5fYmFkZ2VGb3IoaXRlbSk7aWYoYmFkZ2VFbGVtZW50KXtiYWRnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmFkZ2UnKTtzdWJUaXRsZS5hcHBlbmRDaGlsZChiYWRnZUVsZW1lbnQpO30Kc3ViVGl0bGUuY3JlYXRlVGV4dENoaWxkKHRoaXMuX3N1YnRpdGxlRm9yKGl0ZW0pKTtlbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0PSg4K3RoaXMuX2RlcHRoRm9yKGl0ZW0pKjE1KSsncHgnO3JldHVybiBlbGVtZW50O30KX3N1YnRpdGxlRm9yKGV4ZWN1dGlvbkNvbnRleHQpe2NvbnN0IHRhcmdldD1leGVjdXRpb25Db250ZXh0LnRhcmdldCgpO2xldCBmcmFtZTtpZihleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpe2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2ZyYW1lPXJlc291cmNlVHJlZU1vZGVsJiZyZXNvdXJjZVRyZWVNb2RlbC5mcmFtZUZvcklkKGV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZCk7fQppZihleGVjdXRpb25Db250ZXh0Lm9yaWdpbi5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJykpCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0V4dGVuc2lvbicpO2lmKCFmcmFtZXx8IWZyYW1lLnBhcmVudEZyYW1lfHxmcmFtZS5wYXJlbnRGcmFtZS5zZWN1cml0eU9yaWdpbiE9PWV4ZWN1dGlvbkNvbnRleHQub3JpZ2luKXtjb25zdCB1cmw9ZXhlY3V0aW9uQ29udGV4dC5vcmlnaW4uYXNQYXJzZWRVUkwoKTtpZih1cmwpCnJldHVybiB1cmwuZG9tYWluKCk7fQppZihmcmFtZSl7Y29uc3QgY2FsbEZyYW1lPWZyYW1lLmZpbmRDcmVhdGlvbkNhbGxGcmFtZShjYWxsRnJhbWU9PiEhY2FsbEZyYW1lLnVybCk7aWYoY2FsbEZyYW1lKQpyZXR1cm4gbmV3IENvbW1vbi5QYXJzZWRVUkwoY2FsbEZyYW1lLnVybCkuZG9tYWluKCk7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnSUZyYW1lJyk7fQpyZXR1cm4nJzt9CmlzSXRlbVNlbGVjdGFibGUoaXRlbSl7Y29uc3QgY2FsbEZyYW1lPWl0ZW0uZGVidWdnZXJNb2RlbC5zZWxlY3RlZENhbGxGcmFtZSgpO2NvbnN0IGNhbGxGcmFtZUNvbnRleHQ9Y2FsbEZyYW1lJiZjYWxsRnJhbWUuc2NyaXB0LmV4ZWN1dGlvbkNvbnRleHQoKTtyZXR1cm4hY2FsbEZyYW1lQ29udGV4dHx8aXRlbT09PWNhbGxGcmFtZUNvbnRleHQ7fQppdGVtU2VsZWN0ZWQoaXRlbSl7dGhpcy5fdG9vbGJhckl0ZW0uZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd3YXJuaW5nJywhdGhpcy5faXNUb3BDb250ZXh0KGl0ZW0pJiZ0aGlzLl9oYXNUb3BDb250ZXh0KCkpO1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0LGl0ZW0pO30KX2NhbGxGcmFtZVNlbGVjdGVkSW5VSSgpe2NvbnN0IGNhbGxGcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUpO2NvbnN0IGNhbGxGcmFtZUNvbnRleHQ9Y2FsbEZyYW1lJiZjYWxsRnJhbWUuc2NyaXB0LmV4ZWN1dGlvbkNvbnRleHQoKTtpZihjYWxsRnJhbWVDb250ZXh0KQpVSS5jb250ZXh0LnNldEZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCxjYWxsRnJhbWVDb250ZXh0KTt9Cl9jYWxsRnJhbWVTZWxlY3RlZEluTW9kZWwoZXZlbnQpe2NvbnN0IGRlYnVnZ2VyTW9kZWw9KGV2ZW50LmRhdGEpO2Zvcihjb25zdCBleGVjdXRpb25Db250ZXh0IG9mIHRoaXMuX2l0ZW1zKXtpZihleGVjdXRpb25Db250ZXh0LmRlYnVnZ2VyTW9kZWw9PT1kZWJ1Z2dlck1vZGVsKXt0aGlzLl9kaXNwb3NlRXhlY3V0aW9uQ29udGV4dEJhZGdlKGV4ZWN1dGlvbkNvbnRleHQpO3RoaXMuX2Ryb3BEb3duLnJlZnJlc2hJdGVtKGV4ZWN1dGlvbkNvbnRleHQpO319fQpfZnJhbWVOYXZpZ2F0ZWQoZXZlbnQpe2NvbnN0IGZyYW1lPShldmVudC5kYXRhKTtjb25zdCBydW50aW1lTW9kZWw9ZnJhbWUucmVzb3VyY2VUcmVlTW9kZWwoKS50YXJnZXQoKS5tb2RlbChTREsuUnVudGltZU1vZGVsKTtpZighcnVudGltZU1vZGVsKQpyZXR1cm47Zm9yKGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgb2YgcnVudGltZU1vZGVsLmV4ZWN1dGlvbkNvbnRleHRzKCkpe2lmKGZyYW1lLmlkPT09ZXhlY3V0aW9uQ29udGV4dC5mcmFtZUlkKXt0aGlzLl9kaXNwb3NlRXhlY3V0aW9uQ29udGV4dEJhZGdlKGV4ZWN1dGlvbkNvbnRleHQpO3RoaXMuX2Ryb3BEb3duLnJlZnJlc2hJdGVtKGV4ZWN1dGlvbkNvbnRleHQpO319fX07O0NvbnNvbGUuQ29uc29sZUZpbHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihuYW1lLHBhcnNlZEZpbHRlcnMsZXhlY3V0aW9uQ29udGV4dCxsZXZlbHNNYXNrKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnBhcnNlZEZpbHRlcnM9cGFyc2VkRmlsdGVyczt0aGlzLmV4ZWN1dGlvbkNvbnRleHQ9ZXhlY3V0aW9uQ29udGV4dDt0aGlzLmxldmVsc01hc2s9bGV2ZWxzTWFza3x8Q29uc29sZS5Db25zb2xlRmlsdGVyLmRlZmF1bHRMZXZlbHNGaWx0ZXJWYWx1ZSgpO30Kc3RhdGljIGFsbExldmVsc0ZpbHRlclZhbHVlKCl7Y29uc3QgcmVzdWx0PXt9O2Zvcihjb25zdCBuYW1lIG9mIE9iamVjdC52YWx1ZXMoU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCkpCnJlc3VsdFtuYW1lXT10cnVlO3JldHVybiByZXN1bHQ7fQpzdGF0aWMgZGVmYXVsdExldmVsc0ZpbHRlclZhbHVlKCl7Y29uc3QgcmVzdWx0PUNvbnNvbGUuQ29uc29sZUZpbHRlci5hbGxMZXZlbHNGaWx0ZXJWYWx1ZSgpO3Jlc3VsdFtTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLlZlcmJvc2VdPWZhbHNlO3JldHVybiByZXN1bHQ7fQpzdGF0aWMgc2luZ2xlTGV2ZWxNYXNrKGxldmVsKXtjb25zdCByZXN1bHQ9e307cmVzdWx0W2xldmVsXT10cnVlO3JldHVybiByZXN1bHQ7fQpjbG9uZSgpe2NvbnN0IHBhcnNlZEZpbHRlcnM9dGhpcy5wYXJzZWRGaWx0ZXJzLm1hcChUZXh0VXRpbHMuRmlsdGVyUGFyc2VyLmNsb25lRmlsdGVyKTtjb25zdCBsZXZlbHNNYXNrPU9iamVjdC5hc3NpZ24oe30sdGhpcy5sZXZlbHNNYXNrKTtyZXR1cm4gbmV3IENvbnNvbGUuQ29uc29sZUZpbHRlcih0aGlzLm5hbWUscGFyc2VkRmlsdGVycyx0aGlzLmV4ZWN1dGlvbkNvbnRleHQsbGV2ZWxzTWFzayk7fQpzaG91bGRCZVZpc2libGUodmlld01lc3NhZ2Upe2NvbnN0IG1lc3NhZ2U9dmlld01lc3NhZ2UuY29uc29sZU1lc3NhZ2UoKTtpZih0aGlzLmV4ZWN1dGlvbkNvbnRleHQmJih0aGlzLmV4ZWN1dGlvbkNvbnRleHQucnVudGltZU1vZGVsIT09bWVzc2FnZS5ydW50aW1lTW9kZWwoKXx8dGhpcy5leGVjdXRpb25Db250ZXh0LmlkIT09bWVzc2FnZS5leGVjdXRpb25Db250ZXh0SWQpKQpyZXR1cm4gZmFsc2U7aWYobWVzc2FnZS50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkNvbW1hbmR8fG1lc3NhZ2UudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5SZXN1bHR8fG1lc3NhZ2UuaXNHcm91cE1lc3NhZ2UoKSkKcmV0dXJuIHRydWU7aWYobWVzc2FnZS5sZXZlbCYmIXRoaXMubGV2ZWxzTWFza1sobWVzc2FnZS5sZXZlbCldKQpyZXR1cm4gZmFsc2U7Zm9yKGNvbnN0IGZpbHRlciBvZiB0aGlzLnBhcnNlZEZpbHRlcnMpe2lmKCFmaWx0ZXIua2V5KXtpZihmaWx0ZXIucmVnZXgmJnZpZXdNZXNzYWdlLm1hdGNoZXNGaWx0ZXJSZWdleChmaWx0ZXIucmVnZXgpPT09ZmlsdGVyLm5lZ2F0aXZlKQpyZXR1cm4gZmFsc2U7aWYoZmlsdGVyLnRleHQmJnZpZXdNZXNzYWdlLm1hdGNoZXNGaWx0ZXJUZXh0KGZpbHRlci50ZXh0KT09PWZpbHRlci5uZWdhdGl2ZSkKcmV0dXJuIGZhbHNlO31lbHNle3N3aXRjaChmaWx0ZXIua2V5KXtjYXNlIENvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlLkNvbnRleHQ6aWYoIXBhc3Nlc0ZpbHRlcihmaWx0ZXIsbWVzc2FnZS5jb250ZXh0LGZhbHNlKSkKcmV0dXJuIGZhbHNlO2JyZWFrO2Nhc2UgQ29uc29sZS5Db25zb2xlRmlsdGVyLkZpbHRlclR5cGUuU291cmNlOmNvbnN0IHNvdXJjZU5hbWVGb3JNZXNzYWdlPW1lc3NhZ2Uuc291cmNlP1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlRGlzcGxheU5hbWUuZ2V0KChtZXNzYWdlLnNvdXJjZSkpOm1lc3NhZ2Uuc291cmNlO2lmKCFwYXNzZXNGaWx0ZXIoZmlsdGVyLHNvdXJjZU5hbWVGb3JNZXNzYWdlLHRydWUpKQpyZXR1cm4gZmFsc2U7YnJlYWs7Y2FzZSBDb25zb2xlLkNvbnNvbGVGaWx0ZXIuRmlsdGVyVHlwZS5Vcmw6aWYoIXBhc3Nlc0ZpbHRlcihmaWx0ZXIsbWVzc2FnZS51cmwsZmFsc2UpKQpyZXR1cm4gZmFsc2U7YnJlYWs7fX19CnJldHVybiB0cnVlO2Z1bmN0aW9uIHBhc3Nlc0ZpbHRlcihmaWx0ZXIsdmFsdWUsZXhhY3RNYXRjaCl7aWYoIWZpbHRlci50ZXh0KQpyZXR1cm4hIXZhbHVlPT09ZmlsdGVyLm5lZ2F0aXZlO2lmKCF2YWx1ZSkKcmV0dXJuIWZpbHRlci50ZXh0PT09IWZpbHRlci5uZWdhdGl2ZTtjb25zdCBmaWx0ZXJUZXh0PShmaWx0ZXIudGV4dCkudG9Mb3dlckNhc2UoKTtjb25zdCBsb3dlckNhc2VWYWx1ZT12YWx1ZS50b0xvd2VyQ2FzZSgpO2lmKGV4YWN0TWF0Y2gmJihsb3dlckNhc2VWYWx1ZT09PWZpbHRlclRleHQpPT09ZmlsdGVyLm5lZ2F0aXZlKQpyZXR1cm4gZmFsc2U7aWYoIWV4YWN0TWF0Y2gmJmxvd2VyQ2FzZVZhbHVlLmluY2x1ZGVzKGZpbHRlclRleHQpPT09ZmlsdGVyLm5lZ2F0aXZlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWU7fX19O0NvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlPXtDb250ZXh0Oidjb250ZXh0JyxTb3VyY2U6J3NvdXJjZScsVXJsOid1cmwnfTs7Q29uc29sZS5Db25zb2xlUGluUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2NvbnNvbGUvY29uc29sZVBpblBhbmUuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXBpbnMnLCdtb25vc3BhY2UnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9jb250ZXh0TWVudUV2ZW50RmlyZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fcGlucz1uZXcgU2V0KCk7fQpfY29udGV4dE1lbnVFdmVudEZpcmVkKGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnN0IHRhcmdldD1ldmVudC5kZWVwRWxlbWVudEZyb21Qb2ludCgpO2lmKHRhcmdldCl7Y29uc3QgdGFyZ2V0UGluRWxlbWVudD10YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnY29uc29sZS1waW4nKTtpZih0YXJnZXRQaW5FbGVtZW50KXtjb25zdCB0YXJnZXRQaW49dGFyZ2V0UGluRWxlbWVudFtDb25zb2xlLkNvbnNvbGVQaW4uX1BpblN5bWJvbF07Y29udGV4dE1lbnUuZWRpdFNlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYEVkaXQgcGluYCx0YXJnZXRQaW4uZm9jdXMuYmluZCh0YXJnZXRQaW4pKTtjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgUmVtb3ZlIHBpbmAsdGhpcy5fcmVtb3ZlUGluLmJpbmQodGhpcyx0YXJnZXRQaW4pKTt9fQpjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgUmVtb3ZlIGFsbCBwaW5zYCx0aGlzLl9yZW1vdmVBbGxQaW5zLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9yZW1vdmVBbGxQaW5zKCl7Zm9yKGNvbnN0IHBpbiBvZiB0aGlzLl9waW5zKQp0aGlzLl9yZW1vdmVQaW4ocGluKTt9Cl9yZW1vdmVQaW4ocGluKXtwaW4uZWxlbWVudCgpLnJlbW92ZSgpO3RoaXMuX3BpbnMuZGVsZXRlKHBpbik7fQphZGRQaW4oZXhwcmVzc2lvbil7Y29uc3QgcGluPW5ldyBDb25zb2xlLkNvbnNvbGVQaW4oZXhwcmVzc2lvbix0aGlzLl9yZW1vdmVQaW4uYmluZCh0aGlzKSk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChwaW4uZWxlbWVudCgpKTt0aGlzLl9waW5zLmFkZChwaW4pO3Bpbi5mb2N1cygpO319O0NvbnNvbGUuQ29uc29sZVBpbj1jbGFzc3tjb25zdHJ1Y3RvcihleHByZXNzaW9uLG9uUmVtb3ZlKXtjb25zdCBkZWxldGVQaW5JY29uPVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tY3Jvc3MnLCdjb25zb2xlLWRlbGV0ZS1waW4nKTtkZWxldGVQaW5JY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+b25SZW1vdmUodGhpcykpO2NvbnN0IGZyYWdtZW50PVVJLkZyYWdtZW50LmJ1aWxkYAogICAgPGRpdiBjbGFzcz0nY29uc29sZS1waW4nPgogICAgICAke2RlbGV0ZVBpbkljb259CiAgICAgIDxkaXYgY2xhc3M9J2NvbnNvbGUtcGluLW5hbWUnICQ9J25hbWUnPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSdjb25zb2xlLXBpbi1wcmV2aWV3Jz4ke2xzYG5vdCBhdmFpbGFibGVgfTwvZGl2PgogICAgPC9kaXY+YDt0aGlzLl9waW5FbGVtZW50PWZyYWdtZW50LmVsZW1lbnQoKTtjb25zdCBuYW1lRWxlbWVudD1mcmFnbWVudC4kKCduYW1lJyk7bmFtZUVsZW1lbnQudGl0bGU9ZXhwcmVzc2lvbjt0aGlzLl9waW5FbGVtZW50W0NvbnNvbGUuQ29uc29sZVBpbi5fUGluU3ltYm9sXT10aGlzO3RoaXMuX2VkaXRvcj1udWxsO3RoaXMuX2VkaXRvclByb21pc2U9c2VsZi5ydW50aW1lLmV4dGVuc2lvbihVSS5UZXh0RWRpdG9yRmFjdG9yeSkuaW5zdGFuY2UoKS50aGVuKGZhY3Rvcnk9Pnt0aGlzLl9lZGl0b3I9ZmFjdG9yeS5jcmVhdGVFZGl0b3Ioe2xpbmVOdW1iZXJzOmZhbHNlLGxpbmVXcmFwcGluZzp0cnVlLG1pbWVUeXBlOidqYXZhc2NyaXB0JyxhdXRvSGVpZ2h0OnRydWUscGxhY2Vob2xkZXI6bHNgRXhwcmVzc2lvbmB9KTt0aGlzLl9lZGl0b3Iud2lkZ2V0KCkuc2hvdyhuYW1lRWxlbWVudCk7dGhpcy5fZWRpdG9yLndpZGdldCgpLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS1waW4tZWRpdG9yJyk7dGhpcy5fZWRpdG9yLndpZGdldCgpLmVsZW1lbnQudGFiSW5kZXg9LTE7dGhpcy5fZWRpdG9yLnNldFRleHQoZXhwcmVzc2lvbik7dGhpcy5fZWRpdG9yLndpZGdldCgpLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihldmVudC5rZXk9PT0nVGFiJykKZXZlbnQuY29uc3VtZSgpO30sdHJ1ZSk7fSk7fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX3BpbkVsZW1lbnQ7fQphc3luYyBmb2N1cygpe2F3YWl0IHRoaXMuX2VkaXRvclByb21pc2U7dGhpcy5fZWRpdG9yLndpZGdldCgpLmZvY3VzKCk7dGhpcy5fZWRpdG9yLnNldFNlbGVjdGlvbihUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihJbmZpbml0eSxJbmZpbml0eSkpO319O0NvbnNvbGUuQ29uc29sZVBpbi5fUGluU3ltYm9sPVN5bWJvbCgncGluU3ltYm9sJyk7O0NvbnNvbGUuQ29uc29sZVNpZGViYXI9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGJhZGdlUG9vbCl7c3VwZXIodHJ1ZSk7dGhpcy5zZXRNaW5pbXVtU2l6ZSgxMjUsMCk7dGhpcy5fdHJlZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMuX3RyZWUucmVnaXN0ZXJSZXF1aXJlZENTUygnY29uc29sZS9jb25zb2xlU2lkZWJhci5jc3MnKTt0aGlzLl90cmVlLmFkZEV2ZW50TGlzdGVuZXIoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRTZWxlY3RlZCx0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdHJlZS5lbGVtZW50KTt0aGlzLl9zZWxlY3RlZFRyZWVFbGVtZW50PW51bGw7dGhpcy5fdHJlZUVsZW1lbnRzPVtdO2NvbnN0IHNlbGVjdGVkRmlsdGVyU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnY29uc29sZS5zaWRlYmFyU2VsZWN0ZWRGaWx0ZXInLG51bGwpO2NvbnN0IExldmVscz1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsO2NvbnN0IGNvbnNvbGVBUElQYXJzZWRGaWx0ZXJzPVt7a2V5OkNvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlLlNvdXJjZSx0ZXh0OlNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkNvbnNvbGVBUEksbmVnYXRpdmU6ZmFsc2V9XTt0aGlzLl9hcHBlbmRHcm91cChDb25zb2xlLkNvbnNvbGVTaWRlYmFyLl9ncm91cFNpbmd1bGFyTmFtZS5BbGwsW10sQ29uc29sZS5Db25zb2xlRmlsdGVyLmFsbExldmVsc0ZpbHRlclZhbHVlKCksVUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tbGlzdCcpLGJhZGdlUG9vbCxzZWxlY3RlZEZpbHRlclNldHRpbmcpO3RoaXMuX2FwcGVuZEdyb3VwKENvbnNvbGUuQ29uc29sZVNpZGViYXIuX2dyb3VwU2luZ3VsYXJOYW1lLkNvbnNvbGVBUEksY29uc29sZUFQSVBhcnNlZEZpbHRlcnMsQ29uc29sZS5Db25zb2xlRmlsdGVyLmFsbExldmVsc0ZpbHRlclZhbHVlKCksVUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tYWNjb3VudC1jaXJjbGUnKSxiYWRnZVBvb2wsc2VsZWN0ZWRGaWx0ZXJTZXR0aW5nKTt0aGlzLl9hcHBlbmRHcm91cChDb25zb2xlLkNvbnNvbGVTaWRlYmFyLl9ncm91cFNpbmd1bGFyTmFtZS5FcnJvcixbXSxDb25zb2xlLkNvbnNvbGVGaWx0ZXIuc2luZ2xlTGV2ZWxNYXNrKExldmVscy5FcnJvciksVUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tZXJyb3ItY2lyY2xlJyksYmFkZ2VQb29sLHNlbGVjdGVkRmlsdGVyU2V0dGluZyk7dGhpcy5fYXBwZW5kR3JvdXAoQ29uc29sZS5Db25zb2xlU2lkZWJhci5fZ3JvdXBTaW5ndWxhck5hbWUuV2FybmluZyxbXSxDb25zb2xlLkNvbnNvbGVGaWx0ZXIuc2luZ2xlTGV2ZWxNYXNrKExldmVscy5XYXJuaW5nKSxVSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi13YXJuaW5nLXRyaWFuZ2xlJyksYmFkZ2VQb29sLHNlbGVjdGVkRmlsdGVyU2V0dGluZyk7dGhpcy5fYXBwZW5kR3JvdXAoQ29uc29sZS5Db25zb2xlU2lkZWJhci5fZ3JvdXBTaW5ndWxhck5hbWUuSW5mbyxbXSxDb25zb2xlLkNvbnNvbGVGaWx0ZXIuc2luZ2xlTGV2ZWxNYXNrKExldmVscy5JbmZvKSxVSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1pbmZvLWNpcmNsZScpLGJhZGdlUG9vbCxzZWxlY3RlZEZpbHRlclNldHRpbmcpO3RoaXMuX2FwcGVuZEdyb3VwKENvbnNvbGUuQ29uc29sZVNpZGViYXIuX2dyb3VwU2luZ3VsYXJOYW1lLlZlcmJvc2UsW10sQ29uc29sZS5Db25zb2xlRmlsdGVyLnNpbmdsZUxldmVsTWFzayhMZXZlbHMuVmVyYm9zZSksVUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tYnVnJyksYmFkZ2VQb29sLHNlbGVjdGVkRmlsdGVyU2V0dGluZyk7Y29uc3Qgc2VsZWN0ZWRUcmVlRWxlbWVudE5hbWU9c2VsZWN0ZWRGaWx0ZXJTZXR0aW5nLmdldCgpO2NvbnN0IGRlZmF1bHRUcmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudHMuZmluZCh4PT54Lm5hbWUoKT09PXNlbGVjdGVkVHJlZUVsZW1lbnROYW1lKXx8dGhpcy5fdHJlZUVsZW1lbnRzWzBdO2RlZmF1bHRUcmVlRWxlbWVudC5zZWxlY3QoKTt9Cl9hcHBlbmRHcm91cChuYW1lLHBhcnNlZEZpbHRlcnMsbGV2ZWxzTWFzayxpY29uLGJhZGdlUG9vbCxzZWxlY3RlZEZpbHRlclNldHRpbmcpe2NvbnN0IGZpbHRlcj1uZXcgQ29uc29sZS5Db25zb2xlRmlsdGVyKG5hbWUscGFyc2VkRmlsdGVycyxudWxsLGxldmVsc01hc2spO2NvbnN0IHRyZWVFbGVtZW50PW5ldyBDb25zb2xlLkNvbnNvbGVTaWRlYmFyLkZpbHRlclRyZWVFbGVtZW50KGZpbHRlcixpY29uLGJhZGdlUG9vbCxzZWxlY3RlZEZpbHRlclNldHRpbmcpO3RoaXMuX3RyZWUuYXBwZW5kQ2hpbGQodHJlZUVsZW1lbnQpO3RoaXMuX3RyZWVFbGVtZW50cy5wdXNoKHRyZWVFbGVtZW50KTt9CmNsZWFyKCl7Zm9yKGNvbnN0IHRyZWVFbGVtZW50IG9mIHRoaXMuX3RyZWVFbGVtZW50cykKdHJlZUVsZW1lbnQuY2xlYXIoKTt9Cm9uTWVzc2FnZUFkZGVkKHZpZXdNZXNzYWdlKXtmb3IoY29uc3QgdHJlZUVsZW1lbnQgb2YgdGhpcy5fdHJlZUVsZW1lbnRzKQp0cmVlRWxlbWVudC5vbk1lc3NhZ2VBZGRlZCh2aWV3TWVzc2FnZSk7fQpzaG91bGRCZVZpc2libGUodmlld01lc3NhZ2Upe2lmKCF0aGlzLl9zZWxlY3RlZFRyZWVFbGVtZW50KQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRUcmVlRWxlbWVudC5fZmlsdGVyLnNob3VsZEJlVmlzaWJsZSh2aWV3TWVzc2FnZSk7fQpfc2VsZWN0aW9uQ2hhbmdlZChldmVudCl7dGhpcy5fc2VsZWN0ZWRUcmVlRWxlbWVudD0oZXZlbnQuZGF0YSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29uc29sZS5Db25zb2xlU2lkZWJhci5FdmVudHMuRmlsdGVyU2VsZWN0ZWQpO319O0NvbnNvbGUuQ29uc29sZVNpZGViYXIuRXZlbnRzPXtGaWx0ZXJTZWxlY3RlZDpTeW1ib2woJ0ZpbHRlclNlbGVjdGVkJyl9O0NvbnNvbGUuQ29uc29sZVNpZGViYXIuVVJMR3JvdXBUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKGZpbHRlcixiYWRnZSl7c3VwZXIoZmlsdGVyLm5hbWUpO3RoaXMuX2ZpbHRlcj1maWx0ZXI7dGhpcy5fY291bnRFbGVtZW50PXRoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnY291bnQnKTtjb25zdCBsZWFkaW5nSWNvbnM9W1VJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbmF2aWdhdG9yLWZpbGUnKV07aWYoYmFkZ2UpCmxlYWRpbmdJY29ucy5wdXNoKGJhZGdlKTt0aGlzLnNldExlYWRpbmdJY29ucyhsZWFkaW5nSWNvbnMpO3RoaXMuX21lc3NhZ2VDb3VudD0wO30KaW5jcmVtZW50QW5kVXBkYXRlQ291bnRlcigpe3RoaXMuX21lc3NhZ2VDb3VudCsrO3RoaXMuX2NvdW50RWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9tZXNzYWdlQ291bnQ7fX07Q29uc29sZS5Db25zb2xlU2lkZWJhci5GaWx0ZXJUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKGZpbHRlcixpY29uLGJhZGdlUG9vbCxzZWxlY3RlZEZpbHRlclNldHRpbmcpe3N1cGVyKGZpbHRlci5uYW1lKTt0aGlzLl9maWx0ZXI9ZmlsdGVyO3RoaXMuX2JhZGdlUG9vbD1iYWRnZVBvb2w7dGhpcy5fc2VsZWN0ZWRGaWx0ZXJTZXR0aW5nPXNlbGVjdGVkRmlsdGVyU2V0dGluZzt0aGlzLl91cmxUcmVlRWxlbWVudHM9bmV3IE1hcCgpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtpY29uXSk7dGhpcy5fbWVzc2FnZUNvdW50PTA7dGhpcy5fdXBkYXRlQ291bnRlcigpO30KY2xlYXIoKXt0aGlzLl91cmxUcmVlRWxlbWVudHMuY2xlYXIoKTt0aGlzLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fbWVzc2FnZUNvdW50PTA7dGhpcy5fdXBkYXRlQ291bnRlcigpO30KbmFtZSgpe3JldHVybiB0aGlzLl9maWx0ZXIubmFtZTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXt0aGlzLl9zZWxlY3RlZEZpbHRlclNldHRpbmcuc2V0KHRoaXMuX2ZpbHRlci5uYW1lKTtyZXR1cm4gc3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO30KX3VwZGF0ZUNvdW50ZXIoKXtjb25zdCBwcmVmaXg9dGhpcy5fbWVzc2FnZUNvdW50P3RoaXMuX21lc3NhZ2VDb3VudDpDb21tb24uVUlTdHJpbmcoJ05vJyk7Y29uc3QgcGx1cmFsaXplZE5hbWU9dGhpcy5fbWVzc2FnZUNvdW50PT09MT90aGlzLl9maWx0ZXIubmFtZTpDb25zb2xlLkNvbnNvbGVTaWRlYmFyLl9ncm91cFBsdXJhbE5hbWVNYXAuZ2V0KHRoaXMuX2ZpbHRlci5uYW1lKTt0aGlzLnRpdGxlPWAke3ByZWZpeH0gJHtwbHVyYWxpemVkTmFtZX1gO3RoaXMuc2V0RXhwYW5kYWJsZSghIXRoaXMuY2hpbGRDb3VudCgpKTt9Cm9uTWVzc2FnZUFkZGVkKHZpZXdNZXNzYWdlKXtjb25zdCBtZXNzYWdlPXZpZXdNZXNzYWdlLmNvbnNvbGVNZXNzYWdlKCk7Y29uc3Qgc2hvdWxkSW5jcmVtZW50Q291bnRlcj1tZXNzYWdlLnR5cGUhPT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuQ29tbWFuZCYmbWVzc2FnZS50eXBlIT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlJlc3VsdCYmIW1lc3NhZ2UuaXNHcm91cE1lc3NhZ2UoKTtpZighdGhpcy5fZmlsdGVyLnNob3VsZEJlVmlzaWJsZSh2aWV3TWVzc2FnZSl8fCFzaG91bGRJbmNyZW1lbnRDb3VudGVyKQpyZXR1cm47Y29uc3QgY2hpbGQ9dGhpcy5fY2hpbGRFbGVtZW50KG1lc3NhZ2UudXJsKTtjaGlsZC5pbmNyZW1lbnRBbmRVcGRhdGVDb3VudGVyKCk7dGhpcy5fbWVzc2FnZUNvdW50Kys7dGhpcy5fdXBkYXRlQ291bnRlcigpO30KX2NoaWxkRWxlbWVudCh1cmwpe2NvbnN0IHVybFZhbHVlPXVybHx8bnVsbDtsZXQgY2hpbGQ9dGhpcy5fdXJsVHJlZUVsZW1lbnRzLmdldCh1cmxWYWx1ZSk7aWYoY2hpbGQpCnJldHVybiBjaGlsZDtjb25zdCBmaWx0ZXI9dGhpcy5fZmlsdGVyLmNsb25lKCk7Y29uc3QgcGFyc2VkVVJMPXVybFZhbHVlP3VybFZhbHVlLmFzUGFyc2VkVVJMKCk6bnVsbDtpZih1cmxWYWx1ZSkKZmlsdGVyLm5hbWU9cGFyc2VkVVJMP3BhcnNlZFVSTC5kaXNwbGF5TmFtZTp1cmxWYWx1ZTtlbHNlCmZpbHRlci5uYW1lPUNvbW1vbi5VSVN0cmluZygnPG90aGVyPicpO2ZpbHRlci5wYXJzZWRGaWx0ZXJzLnB1c2goe2tleTpDb25zb2xlLkNvbnNvbGVGaWx0ZXIuRmlsdGVyVHlwZS5VcmwsdGV4dDp1cmxWYWx1ZSxuZWdhdGl2ZTpmYWxzZX0pO2NvbnN0IGJhZGdlPXBhcnNlZFVSTD90aGlzLl9iYWRnZVBvb2wuYmFkZ2VGb3JVUkwocGFyc2VkVVJMKTpudWxsO2NoaWxkPW5ldyBDb25zb2xlLkNvbnNvbGVTaWRlYmFyLlVSTEdyb3VwVHJlZUVsZW1lbnQoZmlsdGVyLGJhZGdlKTtpZih1cmxWYWx1ZSkKY2hpbGQudG9vbHRpcD11cmxWYWx1ZTt0aGlzLl91cmxUcmVlRWxlbWVudHMuc2V0KHVybFZhbHVlLGNoaWxkKTt0aGlzLmFwcGVuZENoaWxkKGNoaWxkKTtyZXR1cm4gY2hpbGQ7fX07Q29uc29sZS5Db25zb2xlU2lkZWJhci5fZ3JvdXBTaW5ndWxhck5hbWU9e0NvbnNvbGVBUEk6Q29tbW9uLlVJU3RyaW5nKCd1c2VyIG1lc3NhZ2UnKSxBbGw6Q29tbW9uLlVJU3RyaW5nKCdtZXNzYWdlJyksRXJyb3I6Q29tbW9uLlVJU3RyaW5nKCdlcnJvcicpLFdhcm5pbmc6Q29tbW9uLlVJU3RyaW5nKCd3YXJuaW5nJyksSW5mbzpDb21tb24uVUlTdHJpbmcoJ2luZm8nKSxWZXJib3NlOkNvbW1vbi5VSVN0cmluZygndmVyYm9zZScpfTtDb25zb2xlLkNvbnNvbGVTaWRlYmFyLl9ncm91cFBsdXJhbE5hbWVNYXA9bmV3IE1hcChbW0NvbnNvbGUuQ29uc29sZVNpZGViYXIuX2dyb3VwU2luZ3VsYXJOYW1lLkNvbnNvbGVBUEksQ29tbW9uLlVJU3RyaW5nKCd1c2VyIG1lc3NhZ2VzJyldLFtDb25zb2xlLkNvbnNvbGVTaWRlYmFyLl9ncm91cFNpbmd1bGFyTmFtZS5BbGwsQ29tbW9uLlVJU3RyaW5nKCdtZXNzYWdlcycpXSxbQ29uc29sZS5Db25zb2xlU2lkZWJhci5fZ3JvdXBTaW5ndWxhck5hbWUuRXJyb3IsQ29tbW9uLlVJU3RyaW5nKCdlcnJvcnMnKV0sW0NvbnNvbGUuQ29uc29sZVNpZGViYXIuX2dyb3VwU2luZ3VsYXJOYW1lLldhcm5pbmcsQ29tbW9uLlVJU3RyaW5nKCd3YXJuaW5ncycpXSxbQ29uc29sZS5Db25zb2xlU2lkZWJhci5fZ3JvdXBTaW5ndWxhck5hbWUuSW5mbyxDb21tb24uVUlTdHJpbmcoJ2luZm8nKV0sW0NvbnNvbGUuQ29uc29sZVNpZGViYXIuX2dyb3VwU2luZ3VsYXJOYW1lLlZlcmJvc2UsQ29tbW9uLlVJU3RyaW5nKCd2ZXJib3NlJyldXSk7O0NvbnNvbGUuQ29uc29sZVZpZXdwb3J0PWNsYXNze2NvbnN0cnVjdG9yKHByb3ZpZGVyKXt0aGlzLmVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5lbGVtZW50LnN0eWxlLm92ZXJmbG93PSdhdXRvJzt0aGlzLl90b3BHYXBFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fdG9wR2FwRWxlbWVudC5zdHlsZS5oZWlnaHQ9JzBweCc7dGhpcy5fdG9wR2FwRWxlbWVudC5zdHlsZS5jb2xvcj0ndHJhbnNwYXJlbnQnO3RoaXMuX2NvbnRlbnRFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fYm90dG9tR2FwRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuX2JvdHRvbUdhcEVsZW1lbnQuc3R5bGUuaGVpZ2h0PScwcHgnO3RoaXMuX2JvdHRvbUdhcEVsZW1lbnQuc3R5bGUuY29sb3I9J3RyYW5zcGFyZW50Jzt0aGlzLl90b3BHYXBFbGVtZW50LnRleHRDb250ZW50PSdcdUZFRkYnO3RoaXMuX2JvdHRvbUdhcEVsZW1lbnQudGV4dENvbnRlbnQ9J1x1RkVGRic7dGhpcy5fcHJvdmlkZXI9cHJvdmlkZXI7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLHRoaXMuX29uQ29weS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0Jyx0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9maXJzdEFjdGl2ZUluZGV4PS0xO3RoaXMuX2xhc3RBY3RpdmVJbmRleD0tMTt0aGlzLl9yZW5kZXJlZEl0ZW1zPVtdO3RoaXMuX2FuY2hvclNlbGVjdGlvbj1udWxsO3RoaXMuX2hlYWRTZWxlY3Rpb249bnVsbDt0aGlzLl9pdGVtQ291bnQ9MDt0aGlzLl9jdW11bGF0aXZlSGVpZ2h0cz1uZXcgSW50MzJBcnJheSgwKTt0aGlzLl9tdXRlQ29weUhhbmRsZXI9ZmFsc2U7dGhpcy5fb2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5yZWZyZXNoLmJpbmQodGhpcykpO3RoaXMuX29ic2VydmVyQ29uZmlnPXtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9O30Kc3RpY2tUb0JvdHRvbSgpe3JldHVybiB0aGlzLl9zdGlja1RvQm90dG9tO30Kc2V0U3RpY2tUb0JvdHRvbSh2YWx1ZSl7dGhpcy5fc3RpY2tUb0JvdHRvbT12YWx1ZTtpZih0aGlzLl9zdGlja1RvQm90dG9tKQp0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuX2NvbnRlbnRFbGVtZW50LHRoaXMuX29ic2VydmVyQ29uZmlnKTtlbHNlCnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKTt9CmNvcHlXaXRoU3R5bGVzKCl7dGhpcy5fbXV0ZUNvcHlIYW5kbGVyPXRydWU7dGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTt0aGlzLl9tdXRlQ29weUhhbmRsZXI9ZmFsc2U7fQpfb25Db3B5KGV2ZW50KXtpZih0aGlzLl9tdXRlQ29weUhhbmRsZXIpCnJldHVybjtjb25zdCB0ZXh0PXRoaXMuX3NlbGVjdGVkVGV4dCgpO2lmKCF0ZXh0KQpyZXR1cm47ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLHRleHQpO30KX29uRHJhZ1N0YXJ0KGV2ZW50KXtjb25zdCB0ZXh0PXRoaXMuX3NlbGVjdGVkVGV4dCgpO2lmKCF0ZXh0KQpyZXR1cm4gZmFsc2U7ZXZlbnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO2V2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJyx0ZXh0KTtldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0nY29weSc7cmV0dXJuIHRydWU7fQpjb250ZW50RWxlbWVudCgpe3JldHVybiB0aGlzLl9jb250ZW50RWxlbWVudDt9CmludmFsaWRhdGUoKXtkZWxldGUgdGhpcy5fY2FjaGVkUHJvdmlkZXJFbGVtZW50czt0aGlzLl9pdGVtQ291bnQ9dGhpcy5fcHJvdmlkZXIuaXRlbUNvdW50KCk7dGhpcy5fcmVidWlsZEN1bXVsYXRpdmVIZWlnaHRzKCk7dGhpcy5yZWZyZXNoKCk7fQpfcHJvdmlkZXJFbGVtZW50KGluZGV4KXtpZighdGhpcy5fY2FjaGVkUHJvdmlkZXJFbGVtZW50cykKdGhpcy5fY2FjaGVkUHJvdmlkZXJFbGVtZW50cz1uZXcgQXJyYXkodGhpcy5faXRlbUNvdW50KTtsZXQgZWxlbWVudD10aGlzLl9jYWNoZWRQcm92aWRlckVsZW1lbnRzW2luZGV4XTtpZighZWxlbWVudCl7ZWxlbWVudD10aGlzLl9wcm92aWRlci5pdGVtRWxlbWVudChpbmRleCk7dGhpcy5fY2FjaGVkUHJvdmlkZXJFbGVtZW50c1tpbmRleF09ZWxlbWVudDt9CnJldHVybiBlbGVtZW50O30KX3JlYnVpbGRDdW11bGF0aXZlSGVpZ2h0cygpe2NvbnN0IGZpcnN0QWN0aXZlSW5kZXg9dGhpcy5fZmlyc3RBY3RpdmVJbmRleDtjb25zdCBsYXN0QWN0aXZlSW5kZXg9dGhpcy5fbGFzdEFjdGl2ZUluZGV4O2xldCBoZWlnaHQ9MDt0aGlzLl9jdW11bGF0aXZlSGVpZ2h0cz1uZXcgSW50MzJBcnJheSh0aGlzLl9pdGVtQ291bnQpO2ZvcihsZXQgaT0wO2k8dGhpcy5faXRlbUNvdW50OysraSl7aWYoZmlyc3RBY3RpdmVJbmRleDw9aSYmaS1maXJzdEFjdGl2ZUluZGV4PHRoaXMuX3JlbmRlcmVkSXRlbXMubGVuZ3RoJiZpPD1sYXN0QWN0aXZlSW5kZXgpCmhlaWdodCs9dGhpcy5fcmVuZGVyZWRJdGVtc1tpLWZpcnN0QWN0aXZlSW5kZXhdLmVsZW1lbnQoKS5vZmZzZXRIZWlnaHQ7ZWxzZQpoZWlnaHQrPXRoaXMuX3Byb3ZpZGVyLmZhc3RIZWlnaHQoaSk7dGhpcy5fY3VtdWxhdGl2ZUhlaWdodHNbaV09aGVpZ2h0O319Cl9yZWJ1aWxkQ3VtdWxhdGl2ZUhlaWdodHNJZk5lZWRlZCgpe2ZvcihsZXQgaT0wO2k8dGhpcy5fcmVuZGVyZWRJdGVtcy5sZW5ndGg7KytpKXtjb25zdCBjYWNoZWRJdGVtSGVpZ2h0PXRoaXMuX2NhY2hlZEl0ZW1IZWlnaHQodGhpcy5fZmlyc3RBY3RpdmVJbmRleCtpKTtpZihNYXRoLmFicyhjYWNoZWRJdGVtSGVpZ2h0LXRoaXMuX3JlbmRlcmVkSXRlbXNbaV0uZWxlbWVudCgpLm9mZnNldEhlaWdodCk+MSl7dGhpcy5fcmVidWlsZEN1bXVsYXRpdmVIZWlnaHRzKCk7YnJlYWs7fX19Cl9jYWNoZWRJdGVtSGVpZ2h0KGluZGV4KXtyZXR1cm4gaW5kZXg9PT0wP3RoaXMuX2N1bXVsYXRpdmVIZWlnaHRzWzBdOnRoaXMuX2N1bXVsYXRpdmVIZWlnaHRzW2luZGV4XS10aGlzLl9jdW11bGF0aXZlSGVpZ2h0c1tpbmRleC0xXTt9Cl9pc1NlbGVjdGlvbkJhY2t3YXJkcyhzZWxlY3Rpb24pe2lmKCFzZWxlY3Rpb258fCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkKcmV0dXJuIGZhbHNlO2NvbnN0IHJhbmdlPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmFuZ2Uuc2V0U3RhcnQoc2VsZWN0aW9uLmFuY2hvck5vZGUsc2VsZWN0aW9uLmFuY2hvck9mZnNldCk7cmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbi5mb2N1c05vZGUsc2VsZWN0aW9uLmZvY3VzT2Zmc2V0KTtyZXR1cm4gcmFuZ2UuY29sbGFwc2VkO30KX2NyZWF0ZVNlbGVjdGlvbk1vZGVsKGl0ZW1JbmRleCxub2RlLG9mZnNldCl7cmV0dXJue2l0ZW06aXRlbUluZGV4LG5vZGU6bm9kZSxvZmZzZXQ6b2Zmc2V0fTt9Cl91cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb24pe2NvbnN0IHJhbmdlPXNlbGVjdGlvbiYmc2VsZWN0aW9uLnJhbmdlQ291bnQ/c2VsZWN0aW9uLmdldFJhbmdlQXQoMCk6bnVsbDtpZighcmFuZ2V8fHNlbGVjdGlvbi5pc0NvbGxhcHNlZHx8IXRoaXMuZWxlbWVudC5oYXNTZWxlY3Rpb24oKSl7dGhpcy5faGVhZFNlbGVjdGlvbj1udWxsO3RoaXMuX2FuY2hvclNlbGVjdGlvbj1udWxsO3JldHVybiBmYWxzZTt9CmxldCBmaXJzdFNlbGVjdGVkPU51bWJlci5NQVhfVkFMVUU7bGV0IGxhc3RTZWxlY3RlZD0tMTtsZXQgaGFzVmlzaWJsZVNlbGVjdGlvbj1mYWxzZTtmb3IobGV0IGk9MDtpPHRoaXMuX3JlbmRlcmVkSXRlbXMubGVuZ3RoOysraSl7aWYocmFuZ2UuaW50ZXJzZWN0c05vZGUodGhpcy5fcmVuZGVyZWRJdGVtc1tpXS5lbGVtZW50KCkpKXtjb25zdCBpbmRleD1pK3RoaXMuX2ZpcnN0QWN0aXZlSW5kZXg7Zmlyc3RTZWxlY3RlZD1NYXRoLm1pbihmaXJzdFNlbGVjdGVkLGluZGV4KTtsYXN0U2VsZWN0ZWQ9TWF0aC5tYXgobGFzdFNlbGVjdGVkLGluZGV4KTtoYXNWaXNpYmxlU2VsZWN0aW9uPXRydWU7fX0KaWYoaGFzVmlzaWJsZVNlbGVjdGlvbil7Zmlyc3RTZWxlY3RlZD10aGlzLl9jcmVhdGVTZWxlY3Rpb25Nb2RlbChmaXJzdFNlbGVjdGVkLChyYW5nZS5zdGFydENvbnRhaW5lcikscmFuZ2Uuc3RhcnRPZmZzZXQpO2xhc3RTZWxlY3RlZD10aGlzLl9jcmVhdGVTZWxlY3Rpb25Nb2RlbChsYXN0U2VsZWN0ZWQsKHJhbmdlLmVuZENvbnRhaW5lcikscmFuZ2UuZW5kT2Zmc2V0KTt9CmNvbnN0IHRvcE92ZXJsYXA9cmFuZ2UuaW50ZXJzZWN0c05vZGUodGhpcy5fdG9wR2FwRWxlbWVudCkmJnRoaXMuX3RvcEdhcEVsZW1lbnQuX2FjdGl2ZTtjb25zdCBib3R0b21PdmVybGFwPXJhbmdlLmludGVyc2VjdHNOb2RlKHRoaXMuX2JvdHRvbUdhcEVsZW1lbnQpJiZ0aGlzLl9ib3R0b21HYXBFbGVtZW50Ll9hY3RpdmU7aWYoIXRvcE92ZXJsYXAmJiFib3R0b21PdmVybGFwJiYhaGFzVmlzaWJsZVNlbGVjdGlvbil7dGhpcy5faGVhZFNlbGVjdGlvbj1udWxsO3RoaXMuX2FuY2hvclNlbGVjdGlvbj1udWxsO3JldHVybiBmYWxzZTt9CmlmKCF0aGlzLl9hbmNob3JTZWxlY3Rpb258fCF0aGlzLl9oZWFkU2VsZWN0aW9uKXt0aGlzLl9hbmNob3JTZWxlY3Rpb249dGhpcy5fY3JlYXRlU2VsZWN0aW9uTW9kZWwoMCx0aGlzLmVsZW1lbnQsMCk7dGhpcy5faGVhZFNlbGVjdGlvbj10aGlzLl9jcmVhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLl9pdGVtQ291bnQtMSx0aGlzLmVsZW1lbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuLmxlbmd0aCk7dGhpcy5fc2VsZWN0aW9uSXNCYWNrd2FyZD1mYWxzZTt9CmNvbnN0IGlzQmFja3dhcmQ9dGhpcy5faXNTZWxlY3Rpb25CYWNrd2FyZHMoc2VsZWN0aW9uKTtjb25zdCBzdGFydFNlbGVjdGlvbj10aGlzLl9zZWxlY3Rpb25Jc0JhY2t3YXJkP3RoaXMuX2hlYWRTZWxlY3Rpb246dGhpcy5fYW5jaG9yU2VsZWN0aW9uO2NvbnN0IGVuZFNlbGVjdGlvbj10aGlzLl9zZWxlY3Rpb25Jc0JhY2t3YXJkP3RoaXMuX2FuY2hvclNlbGVjdGlvbjp0aGlzLl9oZWFkU2VsZWN0aW9uO2lmKHRvcE92ZXJsYXAmJmJvdHRvbU92ZXJsYXAmJmhhc1Zpc2libGVTZWxlY3Rpb24pe2ZpcnN0U2VsZWN0ZWQ9Zmlyc3RTZWxlY3RlZC5pdGVtPHN0YXJ0U2VsZWN0aW9uLml0ZW0/Zmlyc3RTZWxlY3RlZDpzdGFydFNlbGVjdGlvbjtsYXN0U2VsZWN0ZWQ9bGFzdFNlbGVjdGVkLml0ZW0+ZW5kU2VsZWN0aW9uLml0ZW0/bGFzdFNlbGVjdGVkOmVuZFNlbGVjdGlvbjt9ZWxzZSBpZighaGFzVmlzaWJsZVNlbGVjdGlvbil7Zmlyc3RTZWxlY3RlZD1zdGFydFNlbGVjdGlvbjtsYXN0U2VsZWN0ZWQ9ZW5kU2VsZWN0aW9uO31lbHNlIGlmKHRvcE92ZXJsYXApe2ZpcnN0U2VsZWN0ZWQ9aXNCYWNrd2FyZD90aGlzLl9oZWFkU2VsZWN0aW9uOnRoaXMuX2FuY2hvclNlbGVjdGlvbjt9ZWxzZSBpZihib3R0b21PdmVybGFwKXtsYXN0U2VsZWN0ZWQ9aXNCYWNrd2FyZD90aGlzLl9hbmNob3JTZWxlY3Rpb246dGhpcy5faGVhZFNlbGVjdGlvbjt9CmlmKGlzQmFja3dhcmQpe3RoaXMuX2FuY2hvclNlbGVjdGlvbj1sYXN0U2VsZWN0ZWQ7dGhpcy5faGVhZFNlbGVjdGlvbj1maXJzdFNlbGVjdGVkO31lbHNle3RoaXMuX2FuY2hvclNlbGVjdGlvbj1maXJzdFNlbGVjdGVkO3RoaXMuX2hlYWRTZWxlY3Rpb249bGFzdFNlbGVjdGVkO30KdGhpcy5fc2VsZWN0aW9uSXNCYWNrd2FyZD1pc0JhY2t3YXJkO3JldHVybiB0cnVlO30KX3Jlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uKXtsZXQgYW5jaG9yRWxlbWVudD1udWxsO2xldCBhbmNob3JPZmZzZXQ7aWYodGhpcy5fZmlyc3RBY3RpdmVJbmRleDw9dGhpcy5fYW5jaG9yU2VsZWN0aW9uLml0ZW0mJnRoaXMuX2FuY2hvclNlbGVjdGlvbi5pdGVtPD10aGlzLl9sYXN0QWN0aXZlSW5kZXgpe2FuY2hvckVsZW1lbnQ9dGhpcy5fYW5jaG9yU2VsZWN0aW9uLm5vZGU7YW5jaG9yT2Zmc2V0PXRoaXMuX2FuY2hvclNlbGVjdGlvbi5vZmZzZXQ7fWVsc2V7aWYodGhpcy5fYW5jaG9yU2VsZWN0aW9uLml0ZW08dGhpcy5fZmlyc3RBY3RpdmVJbmRleCkKYW5jaG9yRWxlbWVudD10aGlzLl90b3BHYXBFbGVtZW50O2Vsc2UgaWYodGhpcy5fYW5jaG9yU2VsZWN0aW9uLml0ZW0+dGhpcy5fbGFzdEFjdGl2ZUluZGV4KQphbmNob3JFbGVtZW50PXRoaXMuX2JvdHRvbUdhcEVsZW1lbnQ7YW5jaG9yT2Zmc2V0PXRoaXMuX3NlbGVjdGlvbklzQmFja3dhcmQ/MTowO30KbGV0IGhlYWRFbGVtZW50PW51bGw7bGV0IGhlYWRPZmZzZXQ7aWYodGhpcy5fZmlyc3RBY3RpdmVJbmRleDw9dGhpcy5faGVhZFNlbGVjdGlvbi5pdGVtJiZ0aGlzLl9oZWFkU2VsZWN0aW9uLml0ZW08PXRoaXMuX2xhc3RBY3RpdmVJbmRleCl7aGVhZEVsZW1lbnQ9dGhpcy5faGVhZFNlbGVjdGlvbi5ub2RlO2hlYWRPZmZzZXQ9dGhpcy5faGVhZFNlbGVjdGlvbi5vZmZzZXQ7fWVsc2V7aWYodGhpcy5faGVhZFNlbGVjdGlvbi5pdGVtPHRoaXMuX2ZpcnN0QWN0aXZlSW5kZXgpCmhlYWRFbGVtZW50PXRoaXMuX3RvcEdhcEVsZW1lbnQ7ZWxzZSBpZih0aGlzLl9oZWFkU2VsZWN0aW9uLml0ZW0+dGhpcy5fbGFzdEFjdGl2ZUluZGV4KQpoZWFkRWxlbWVudD10aGlzLl9ib3R0b21HYXBFbGVtZW50O2hlYWRPZmZzZXQ9dGhpcy5fc2VsZWN0aW9uSXNCYWNrd2FyZD8wOjE7fQpzZWxlY3Rpb24uc2V0QmFzZUFuZEV4dGVudChhbmNob3JFbGVtZW50LGFuY2hvck9mZnNldCxoZWFkRWxlbWVudCxoZWFkT2Zmc2V0KTt9CnJlZnJlc2goKXt0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7dGhpcy5faW5uZXJSZWZyZXNoKCk7aWYodGhpcy5fc3RpY2tUb0JvdHRvbSkKdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9jb250ZW50RWxlbWVudCx0aGlzLl9vYnNlcnZlckNvbmZpZyk7fQpfaW5uZXJSZWZyZXNoKCl7aWYoIXRoaXMuX3Zpc2libGVIZWlnaHQoKSkKcmV0dXJuO2lmKCF0aGlzLl9pdGVtQ291bnQpe2ZvcihsZXQgaT0wO2k8dGhpcy5fcmVuZGVyZWRJdGVtcy5sZW5ndGg7KytpKQp0aGlzLl9yZW5kZXJlZEl0ZW1zW2ldLndpbGxIaWRlKCk7dGhpcy5fcmVuZGVyZWRJdGVtcz1bXTt0aGlzLl9jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3RvcEdhcEVsZW1lbnQuc3R5bGUuaGVpZ2h0PScwcHgnO3RoaXMuX2JvdHRvbUdhcEVsZW1lbnQuc3R5bGUuaGVpZ2h0PScwcHgnO3RoaXMuX2ZpcnN0QWN0aXZlSW5kZXg9LTE7dGhpcy5fbGFzdEFjdGl2ZUluZGV4PS0xO3JldHVybjt9CmNvbnN0IHNlbGVjdGlvbj10aGlzLmVsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCk7Y29uc3Qgc2hvdWxkUmVzdG9yZVNlbGVjdGlvbj10aGlzLl91cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb24pO2NvbnN0IHZpc2libGVGcm9tPXRoaXMuZWxlbWVudC5zY3JvbGxUb3A7Y29uc3QgdmlzaWJsZUhlaWdodD10aGlzLl92aXNpYmxlSGVpZ2h0KCk7Y29uc3QgYWN0aXZlSGVpZ2h0PXZpc2libGVIZWlnaHQqMjt0aGlzLl9yZWJ1aWxkQ3VtdWxhdGl2ZUhlaWdodHNJZk5lZWRlZCgpO2lmKHRoaXMuX3N0aWNrVG9Cb3R0b20pe3RoaXMuX2ZpcnN0QWN0aXZlSW5kZXg9TWF0aC5tYXgodGhpcy5faXRlbUNvdW50LU1hdGguY2VpbChhY3RpdmVIZWlnaHQvdGhpcy5fcHJvdmlkZXIubWluaW11bVJvd0hlaWdodCgpKSwwKTt0aGlzLl9sYXN0QWN0aXZlSW5kZXg9dGhpcy5faXRlbUNvdW50LTE7fWVsc2V7dGhpcy5fZmlyc3RBY3RpdmVJbmRleD1NYXRoLm1heCh0aGlzLl9jdW11bGF0aXZlSGVpZ2h0cy5sb3dlckJvdW5kKHZpc2libGVGcm9tKzEtKGFjdGl2ZUhlaWdodC12aXNpYmxlSGVpZ2h0KS8yKSwwKTt0aGlzLl9sYXN0QWN0aXZlSW5kZXg9dGhpcy5fZmlyc3RBY3RpdmVJbmRleCtNYXRoLmNlaWwoYWN0aXZlSGVpZ2h0L3RoaXMuX3Byb3ZpZGVyLm1pbmltdW1Sb3dIZWlnaHQoKSktMTt0aGlzLl9sYXN0QWN0aXZlSW5kZXg9TWF0aC5taW4odGhpcy5fbGFzdEFjdGl2ZUluZGV4LHRoaXMuX2l0ZW1Db3VudC0xKTt9CmNvbnN0IHRvcEdhcEhlaWdodD10aGlzLl9jdW11bGF0aXZlSGVpZ2h0c1t0aGlzLl9maXJzdEFjdGl2ZUluZGV4LTFdfHwwO2NvbnN0IGJvdHRvbUdhcEhlaWdodD10aGlzLl9jdW11bGF0aXZlSGVpZ2h0c1t0aGlzLl9jdW11bGF0aXZlSGVpZ2h0cy5sZW5ndGgtMV0tdGhpcy5fY3VtdWxhdGl2ZUhlaWdodHNbdGhpcy5fbGFzdEFjdGl2ZUluZGV4XTtmdW5jdGlvbiBwcmVwYXJlKCl7dGhpcy5fdG9wR2FwRWxlbWVudC5zdHlsZS5oZWlnaHQ9dG9wR2FwSGVpZ2h0KydweCc7dGhpcy5fYm90dG9tR2FwRWxlbWVudC5zdHlsZS5oZWlnaHQ9Ym90dG9tR2FwSGVpZ2h0KydweCc7dGhpcy5fdG9wR2FwRWxlbWVudC5fYWN0aXZlPSEhdG9wR2FwSGVpZ2h0O3RoaXMuX2JvdHRvbUdhcEVsZW1lbnQuX2FjdGl2ZT0hIWJvdHRvbUdhcEhlaWdodDt0aGlzLl9jb250ZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywnMTAwMDAwMDBweCcpO30KdGhpcy5fcGFydGlhbFZpZXdwb3J0VXBkYXRlKHByZXBhcmUuYmluZCh0aGlzKSk7dGhpcy5fY29udGVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO2lmKHNob3VsZFJlc3RvcmVTZWxlY3Rpb24pCnRoaXMuX3Jlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uKTtpZih0aGlzLl9zdGlja1RvQm90dG9tKQp0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wPTEwMDAwMDAwO30KX3BhcnRpYWxWaWV3cG9ydFVwZGF0ZShwcmVwYXJlKXtjb25zdCBpdGVtc1RvUmVuZGVyPW5ldyBTZXQoKTtmb3IobGV0IGk9dGhpcy5fZmlyc3RBY3RpdmVJbmRleDtpPD10aGlzLl9sYXN0QWN0aXZlSW5kZXg7KytpKQppdGVtc1RvUmVuZGVyLmFkZCh0aGlzLl9wcm92aWRlckVsZW1lbnQoaSkpO2NvbnN0IHdpbGxCZUhpZGRlbj10aGlzLl9yZW5kZXJlZEl0ZW1zLmZpbHRlcihpdGVtPT4haXRlbXNUb1JlbmRlci5oYXMoaXRlbSkpO2ZvcihsZXQgaT0wO2k8d2lsbEJlSGlkZGVuLmxlbmd0aDsrK2kpCndpbGxCZUhpZGRlbltpXS53aWxsSGlkZSgpO3ByZXBhcmUoKTtmb3IobGV0IGk9MDtpPHdpbGxCZUhpZGRlbi5sZW5ndGg7KytpKQp3aWxsQmVIaWRkZW5baV0uZWxlbWVudCgpLnJlbW92ZSgpO2NvbnN0IHdhc1Nob3duPVtdO2xldCBhbmNob3I9dGhpcy5fY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZDtmb3IoY29uc3Qgdmlld3BvcnRFbGVtZW50IG9mIGl0ZW1zVG9SZW5kZXIpe2NvbnN0IGVsZW1lbnQ9dmlld3BvcnRFbGVtZW50LmVsZW1lbnQoKTtpZihlbGVtZW50IT09YW5jaG9yKXtjb25zdCBzaG91bGRDYWxsV2FzU2hvd249IWVsZW1lbnQucGFyZW50RWxlbWVudDtpZihzaG91bGRDYWxsV2FzU2hvd24pCndhc1Nob3duLnB1c2godmlld3BvcnRFbGVtZW50KTt0aGlzLl9jb250ZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCxhbmNob3IpO31lbHNle2FuY2hvcj1hbmNob3IubmV4dFNpYmxpbmc7fX0KZm9yKGxldCBpPTA7aTx3YXNTaG93bi5sZW5ndGg7KytpKQp3YXNTaG93bltpXS53YXNTaG93bigpO3RoaXMuX3JlbmRlcmVkSXRlbXM9QXJyYXkuZnJvbShpdGVtc1RvUmVuZGVyKTt9Cl9zZWxlY3RlZFRleHQoKXt0aGlzLl91cGRhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLmVsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCkpO2lmKCF0aGlzLl9oZWFkU2VsZWN0aW9ufHwhdGhpcy5fYW5jaG9yU2VsZWN0aW9uKQpyZXR1cm4gbnVsbDtsZXQgc3RhcnRTZWxlY3Rpb249bnVsbDtsZXQgZW5kU2VsZWN0aW9uPW51bGw7aWYodGhpcy5fc2VsZWN0aW9uSXNCYWNrd2FyZCl7c3RhcnRTZWxlY3Rpb249dGhpcy5faGVhZFNlbGVjdGlvbjtlbmRTZWxlY3Rpb249dGhpcy5fYW5jaG9yU2VsZWN0aW9uO31lbHNle3N0YXJ0U2VsZWN0aW9uPXRoaXMuX2FuY2hvclNlbGVjdGlvbjtlbmRTZWxlY3Rpb249dGhpcy5faGVhZFNlbGVjdGlvbjt9CmNvbnN0IHRleHRMaW5lcz1bXTtmb3IobGV0IGk9c3RhcnRTZWxlY3Rpb24uaXRlbTtpPD1lbmRTZWxlY3Rpb24uaXRlbTsrK2kpe2NvbnN0IGVsZW1lbnQ9dGhpcy5fcHJvdmlkZXJFbGVtZW50KGkpLmVsZW1lbnQoKTtjb25zdCBsaW5lQ29udGVudD1lbGVtZW50LmNoaWxkVGV4dE5vZGVzKCkubWFwKENvbXBvbmVudHMuTGlua2lmaWVyLnVudHJ1bmNhdGVkTm9kZVRleHQpLmpvaW4oJycpO3RleHRMaW5lcy5wdXNoKGxpbmVDb250ZW50KTt9CmNvbnN0IGVuZFNlbGVjdGlvbkVsZW1lbnQ9dGhpcy5fcHJvdmlkZXJFbGVtZW50KGVuZFNlbGVjdGlvbi5pdGVtKS5lbGVtZW50KCk7aWYoZW5kU2VsZWN0aW9uLm5vZGUmJmVuZFNlbGVjdGlvbi5ub2RlLmlzU2VsZk9yRGVzY2VuZGFudChlbmRTZWxlY3Rpb25FbGVtZW50KSl7Y29uc3QgaXRlbVRleHRPZmZzZXQ9dGhpcy5fdGV4dE9mZnNldEluTm9kZShlbmRTZWxlY3Rpb25FbGVtZW50LGVuZFNlbGVjdGlvbi5ub2RlLGVuZFNlbGVjdGlvbi5vZmZzZXQpO3RleHRMaW5lc1t0ZXh0TGluZXMubGVuZ3RoLTFdPXRleHRMaW5lcy5wZWVrTGFzdCgpLnN1YnN0cmluZygwLGl0ZW1UZXh0T2Zmc2V0KTt9CmNvbnN0IHN0YXJ0U2VsZWN0aW9uRWxlbWVudD10aGlzLl9wcm92aWRlckVsZW1lbnQoc3RhcnRTZWxlY3Rpb24uaXRlbSkuZWxlbWVudCgpO2lmKHN0YXJ0U2VsZWN0aW9uLm5vZGUmJnN0YXJ0U2VsZWN0aW9uLm5vZGUuaXNTZWxmT3JEZXNjZW5kYW50KHN0YXJ0U2VsZWN0aW9uRWxlbWVudCkpe2NvbnN0IGl0ZW1UZXh0T2Zmc2V0PXRoaXMuX3RleHRPZmZzZXRJbk5vZGUoc3RhcnRTZWxlY3Rpb25FbGVtZW50LHN0YXJ0U2VsZWN0aW9uLm5vZGUsc3RhcnRTZWxlY3Rpb24ub2Zmc2V0KTt0ZXh0TGluZXNbMF09dGV4dExpbmVzWzBdLnN1YnN0cmluZyhpdGVtVGV4dE9mZnNldCk7fQpyZXR1cm4gdGV4dExpbmVzLmpvaW4oJ1xuJyk7fQpfdGV4dE9mZnNldEluTm9kZShpdGVtRWxlbWVudCxzZWxlY3Rpb25Ob2RlLG9mZnNldCl7aWYoc2VsZWN0aW9uTm9kZS5ub2RlVHlwZSE9PU5vZGUuVEVYVF9OT0RFKXtpZihvZmZzZXQ8c2VsZWN0aW9uTm9kZS5jaGlsZE5vZGVzLmxlbmd0aCl7c2VsZWN0aW9uTm9kZT0oc2VsZWN0aW9uTm9kZS5jaGlsZE5vZGVzLml0ZW0ob2Zmc2V0KSk7b2Zmc2V0PTA7fWVsc2V7b2Zmc2V0PXNlbGVjdGlvbk5vZGUudGV4dENvbnRlbnQubGVuZ3RoO319CmxldCBjaGFycz0wO2xldCBub2RlPWl0ZW1FbGVtZW50O3doaWxlKChub2RlPW5vZGUudHJhdmVyc2VOZXh0Tm9kZShpdGVtRWxlbWVudCkpJiZub2RlIT09c2VsZWN0aW9uTm9kZSl7aWYobm9kZS5ub2RlVHlwZSE9PU5vZGUuVEVYVF9OT0RFfHxub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWU9PT0nU1RZTEUnfHxub2RlLnBhcmVudEVsZW1lbnQubm9kZU5hbWU9PT0nU0NSSVBUJykKY29udGludWU7Y2hhcnMrPUNvbXBvbmVudHMuTGlua2lmaWVyLnVudHJ1bmNhdGVkTm9kZVRleHQobm9kZSkubGVuZ3RoO30KY29uc3QgdW50cnVuY2F0ZWRDb250YWluZXJMZW5ndGg9Q29tcG9uZW50cy5MaW5raWZpZXIudW50cnVuY2F0ZWROb2RlVGV4dChzZWxlY3Rpb25Ob2RlKS5sZW5ndGg7aWYob2Zmc2V0PjAmJnVudHJ1bmNhdGVkQ29udGFpbmVyTGVuZ3RoIT09c2VsZWN0aW9uTm9kZS50ZXh0Q29udGVudC5sZW5ndGgpCm9mZnNldD11bnRydW5jYXRlZENvbnRhaW5lckxlbmd0aDtyZXR1cm4gY2hhcnMrb2Zmc2V0O30KX29uU2Nyb2xsKGV2ZW50KXt0aGlzLnJlZnJlc2goKTt9CmZpcnN0VmlzaWJsZUluZGV4KCl7aWYoIXRoaXMuX2N1bXVsYXRpdmVIZWlnaHRzLmxlbmd0aCkKcmV0dXJuLTE7dGhpcy5fcmVidWlsZEN1bXVsYXRpdmVIZWlnaHRzSWZOZWVkZWQoKTtyZXR1cm4gdGhpcy5fY3VtdWxhdGl2ZUhlaWdodHMubG93ZXJCb3VuZCh0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKzEpO30KbGFzdFZpc2libGVJbmRleCgpe2lmKCF0aGlzLl9jdW11bGF0aXZlSGVpZ2h0cy5sZW5ndGgpCnJldHVybi0xO3RoaXMuX3JlYnVpbGRDdW11bGF0aXZlSGVpZ2h0c0lmTmVlZGVkKCk7Y29uc3Qgc2Nyb2xsQm90dG9tPXRoaXMuZWxlbWVudC5zY3JvbGxUb3ArdGhpcy5lbGVtZW50LmNsaWVudEhlaWdodDtjb25zdCByaWdodD10aGlzLl9pdGVtQ291bnQtMTtyZXR1cm4gdGhpcy5fY3VtdWxhdGl2ZUhlaWdodHMubG93ZXJCb3VuZChzY3JvbGxCb3R0b20sdW5kZWZpbmVkLHVuZGVmaW5lZCxyaWdodCk7fQpyZW5kZXJlZEVsZW1lbnRBdChpbmRleCl7aWYoaW5kZXg8dGhpcy5fZmlyc3RBY3RpdmVJbmRleCkKcmV0dXJuIG51bGw7aWYoaW5kZXg+dGhpcy5fbGFzdEFjdGl2ZUluZGV4KQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleC10aGlzLl9maXJzdEFjdGl2ZUluZGV4XS5lbGVtZW50KCk7fQpzY3JvbGxJdGVtSW50b1ZpZXcoaW5kZXgsbWFrZUxhc3Qpe2NvbnN0IGZpcnN0VmlzaWJsZUluZGV4PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgoKTtjb25zdCBsYXN0VmlzaWJsZUluZGV4PXRoaXMubGFzdFZpc2libGVJbmRleCgpO2lmKGluZGV4PmZpcnN0VmlzaWJsZUluZGV4JiZpbmRleDxsYXN0VmlzaWJsZUluZGV4KQpyZXR1cm47aWYobWFrZUxhc3QpCnRoaXMuZm9yY2VTY3JvbGxJdGVtVG9CZUxhc3QoaW5kZXgpO2Vsc2UgaWYoaW5kZXg8PWZpcnN0VmlzaWJsZUluZGV4KQp0aGlzLmZvcmNlU2Nyb2xsSXRlbVRvQmVGaXJzdChpbmRleCk7ZWxzZSBpZihpbmRleD49bGFzdFZpc2libGVJbmRleCkKdGhpcy5mb3JjZVNjcm9sbEl0ZW1Ub0JlTGFzdChpbmRleCk7fQpmb3JjZVNjcm9sbEl0ZW1Ub0JlRmlyc3QoaW5kZXgpe2NvbnNvbGUuYXNzZXJ0KGluZGV4Pj0wJiZpbmRleDx0aGlzLl9pdGVtQ291bnQsJ0Nhbm5vdCBzY3JvbGwgaXRlbSBhdCBpbnZhbGlkIGluZGV4Jyk7dGhpcy5zZXRTdGlja1RvQm90dG9tKGZhbHNlKTt0aGlzLl9yZWJ1aWxkQ3VtdWxhdGl2ZUhlaWdodHNJZk5lZWRlZCgpO3RoaXMuZWxlbWVudC5zY3JvbGxUb3A9aW5kZXg+MD90aGlzLl9jdW11bGF0aXZlSGVpZ2h0c1tpbmRleC0xXTowO2lmKHRoaXMuZWxlbWVudC5pc1Njcm9sbGVkVG9Cb3R0b20oKSkKdGhpcy5zZXRTdGlja1RvQm90dG9tKHRydWUpO3RoaXMucmVmcmVzaCgpO30KZm9yY2VTY3JvbGxJdGVtVG9CZUxhc3QoaW5kZXgpe2NvbnNvbGUuYXNzZXJ0KGluZGV4Pj0wJiZpbmRleDx0aGlzLl9pdGVtQ291bnQsJ0Nhbm5vdCBzY3JvbGwgaXRlbSBhdCBpbnZhbGlkIGluZGV4Jyk7dGhpcy5zZXRTdGlja1RvQm90dG9tKGZhbHNlKTt0aGlzLl9yZWJ1aWxkQ3VtdWxhdGl2ZUhlaWdodHNJZk5lZWRlZCgpO3RoaXMuZWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fY3VtdWxhdGl2ZUhlaWdodHNbaW5kZXhdLXRoaXMuX3Zpc2libGVIZWlnaHQoKTtpZih0aGlzLmVsZW1lbnQuaXNTY3JvbGxlZFRvQm90dG9tKCkpCnRoaXMuc2V0U3RpY2tUb0JvdHRvbSh0cnVlKTt0aGlzLnJlZnJlc2goKTt9Cl92aXNpYmxlSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7fX07Q29uc29sZS5Db25zb2xlVmlld3BvcnRQcm92aWRlcj1mdW5jdGlvbigpe307Q29uc29sZS5Db25zb2xlVmlld3BvcnRQcm92aWRlci5wcm90b3R5cGU9e2Zhc3RIZWlnaHQoaW5kZXgpe3JldHVybiAwO30saXRlbUNvdW50KCl7cmV0dXJuIDA7fSxtaW5pbXVtUm93SGVpZ2h0KCl7cmV0dXJuIDA7fSxpdGVtRWxlbWVudChpbmRleCl7cmV0dXJuIG51bGw7fX07Q29uc29sZS5Db25zb2xlVmlld3BvcnRFbGVtZW50PWZ1bmN0aW9uKCl7fTtDb25zb2xlLkNvbnNvbGVWaWV3cG9ydEVsZW1lbnQucHJvdG90eXBlPXt3aWxsSGlkZSgpe30sd2FzU2hvd24oKXt9LGVsZW1lbnQoKXt9LH07O0NvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlPWNsYXNze2NvbnN0cnVjdG9yKGNvbnNvbGVNZXNzYWdlLGxpbmtpZmllcixiYWRnZVBvb2wsbmVzdGluZ0xldmVsKXt0aGlzLl9tZXNzYWdlPWNvbnNvbGVNZXNzYWdlO3RoaXMuX2xpbmtpZmllcj1saW5raWZpZXI7dGhpcy5fYmFkZ2VQb29sPWJhZGdlUG9vbDt0aGlzLl9yZXBlYXRDb3VudD0xO3RoaXMuX2Nsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQ9MDt0aGlzLl9uZXN0aW5nTGV2ZWw9bmVzdGluZ0xldmVsO3RoaXMuX2RhdGFHcmlkPW51bGw7dGhpcy5fcHJldmlld0Zvcm1hdHRlcj1uZXcgT2JqZWN0VUkuUmVtb3RlT2JqZWN0UHJldmlld0Zvcm1hdHRlcigpO3RoaXMuX3NlYXJjaFJlZ2V4PW51bGw7dGhpcy5fbWVzc2FnZUxldmVsSWNvbj1udWxsO30KZWxlbWVudCgpe3JldHVybiB0aGlzLnRvTWVzc2FnZUVsZW1lbnQoKTt9CmFzeW5jIGNvbXBsZXRlRWxlbWVudEZvclRlc3QoKXtjb25zdCBlbGVtZW50PXRoaXMudG9NZXNzYWdlRWxlbWVudCgpO2lmKHRoaXMuX2NvbXBsZXRlRWxlbWVudEZvclRlc3RQcm9taXNlKQphd2FpdCB0aGlzLl9jb21wbGV0ZUVsZW1lbnRGb3JUZXN0UHJvbWlzZTtyZXR1cm4gZWxlbWVudDt9Cndhc1Nob3duKCl7aWYodGhpcy5fZGF0YUdyaWQpCnRoaXMuX2RhdGFHcmlkLnVwZGF0ZVdpZHRocygpO3RoaXMuX2lzVmlzaWJsZT10cnVlO30Kb25SZXNpemUoKXtpZighdGhpcy5faXNWaXNpYmxlKQpyZXR1cm47aWYodGhpcy5fZGF0YUdyaWQpCnRoaXMuX2RhdGFHcmlkLm9uUmVzaXplKCk7fQp3aWxsSGlkZSgpe3RoaXMuX2lzVmlzaWJsZT1mYWxzZTt0aGlzLl9jYWNoZWRIZWlnaHQ9dGhpcy5jb250ZW50RWxlbWVudCgpLm9mZnNldEhlaWdodDt9CmZhc3RIZWlnaHQoKXtpZih0aGlzLl9jYWNoZWRIZWlnaHQpCnJldHVybiB0aGlzLl9jYWNoZWRIZWlnaHQ7Y29uc3QgZGVmYXVsdENvbnNvbGVSb3dIZWlnaHQ9MTk7aWYodGhpcy5fbWVzc2FnZS50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlRhYmxlKXtjb25zdCB0YWJsZT10aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnNbMF07aWYodGFibGUmJnRhYmxlLnByZXZpZXcpCnJldHVybiBkZWZhdWx0Q29uc29sZVJvd0hlaWdodCp0YWJsZS5wcmV2aWV3LnByb3BlcnRpZXMubGVuZ3RoO30KcmV0dXJuIGRlZmF1bHRDb25zb2xlUm93SGVpZ2h0O30KY29uc29sZU1lc3NhZ2UoKXtyZXR1cm4gdGhpcy5fbWVzc2FnZTt9Cl9idWlsZFRhYmxlTWVzc2FnZSgpe2NvbnN0IGZvcm1hdHRlZE1lc3NhZ2U9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ3NvdXJjZS1jb2RlJyk7Y29uc3QgYW5jaG9yRWxlbWVudD10aGlzLl9idWlsZE1lc3NhZ2VBbmNob3IoKTtpZihhbmNob3JFbGVtZW50KQpmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZENoaWxkKGFuY2hvckVsZW1lbnQpO2NvbnN0IGJhZGdlRWxlbWVudD10aGlzLl9idWlsZE1lc3NhZ2VCYWRnZSgpO2lmKGJhZGdlRWxlbWVudCkKZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmRDaGlsZChiYWRnZUVsZW1lbnQpO2xldCB0YWJsZT10aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnMmJnRoaXMuX21lc3NhZ2UucGFyYW1ldGVycy5sZW5ndGg/dGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzWzBdOm51bGw7aWYodGFibGUpCnRhYmxlPXRoaXMuX3BhcmFtZXRlclRvUmVtb3RlT2JqZWN0KHRhYmxlKTtpZighdGFibGV8fCF0YWJsZS5wcmV2aWV3KQpyZXR1cm4gZm9ybWF0dGVkTWVzc2FnZTtjb25zdCByYXdWYWx1ZUNvbHVtblN5bWJvbD1TeW1ib2woJ3Jhd1ZhbHVlQ29sdW1uJyk7Y29uc3QgY29sdW1uTmFtZXM9W107Y29uc3QgcHJldmlldz10YWJsZS5wcmV2aWV3O2NvbnN0IHJvd3M9W107Zm9yKGxldCBpPTA7aTxwcmV2aWV3LnByb3BlcnRpZXMubGVuZ3RoOysraSl7Y29uc3Qgcm93UHJvcGVydHk9cHJldmlldy5wcm9wZXJ0aWVzW2ldO2xldCByb3dTdWJQcm9wZXJ0aWVzO2lmKHJvd1Byb3BlcnR5LnZhbHVlUHJldmlldykKcm93U3ViUHJvcGVydGllcz1yb3dQcm9wZXJ0eS52YWx1ZVByZXZpZXcucHJvcGVydGllcztlbHNlIGlmKHJvd1Byb3BlcnR5LnZhbHVlKQpyb3dTdWJQcm9wZXJ0aWVzPVt7bmFtZTpyYXdWYWx1ZUNvbHVtblN5bWJvbCx0eXBlOnJvd1Byb3BlcnR5LnR5cGUsdmFsdWU6cm93UHJvcGVydHkudmFsdWV9XTtlbHNlCmNvbnRpbnVlO2NvbnN0IHJvd1ZhbHVlPXt9O2NvbnN0IG1heENvbHVtbnNUb1JlbmRlcj0yMDtmb3IobGV0IGo9MDtqPHJvd1N1YlByb3BlcnRpZXMubGVuZ3RoOysrail7Y29uc3QgY2VsbFByb3BlcnR5PXJvd1N1YlByb3BlcnRpZXNbal07bGV0IGNvbHVtblJlbmRlcmVkPWNvbHVtbk5hbWVzLmluZGV4T2YoY2VsbFByb3BlcnR5Lm5hbWUpIT09LTE7aWYoIWNvbHVtblJlbmRlcmVkKXtpZihjb2x1bW5OYW1lcy5sZW5ndGg9PT1tYXhDb2x1bW5zVG9SZW5kZXIpCmNvbnRpbnVlO2NvbHVtblJlbmRlcmVkPXRydWU7Y29sdW1uTmFtZXMucHVzaChjZWxsUHJvcGVydHkubmFtZSk7fQppZihjb2x1bW5SZW5kZXJlZCl7Y29uc3QgY2VsbEVsZW1lbnQ9dGhpcy5fcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3Nvcih0YWJsZSxbcm93UHJvcGVydHksY2VsbFByb3BlcnR5XSk7Y2VsbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS1tZXNzYWdlLW5vd3JhcC1iZWxvdycpO3Jvd1ZhbHVlW2NlbGxQcm9wZXJ0eS5uYW1lXT1jZWxsRWxlbWVudDt9fQpyb3dzLnB1c2goW3Jvd1Byb3BlcnR5Lm5hbWUscm93VmFsdWVdKTt9CmNvbnN0IGZsYXRWYWx1ZXM9W107Zm9yKGxldCBpPTA7aTxyb3dzLmxlbmd0aDsrK2kpe2NvbnN0IHJvd05hbWU9cm93c1tpXVswXTtjb25zdCByb3dWYWx1ZT1yb3dzW2ldWzFdO2ZsYXRWYWx1ZXMucHVzaChyb3dOYW1lKTtmb3IobGV0IGo9MDtqPGNvbHVtbk5hbWVzLmxlbmd0aDsrK2opCmZsYXRWYWx1ZXMucHVzaChyb3dWYWx1ZVtjb2x1bW5OYW1lc1tqXV0pO30KY29sdW1uTmFtZXMudW5zaGlmdChDb21tb24uVUlTdHJpbmcoJyhpbmRleCknKSk7Y29uc3QgY29sdW1uRGlzcGxheU5hbWVzPWNvbHVtbk5hbWVzLm1hcChuYW1lPT5uYW1lPT09cmF3VmFsdWVDb2x1bW5TeW1ib2w/Q29tbW9uLlVJU3RyaW5nKCdWYWx1ZScpOm5hbWUpO2lmKGZsYXRWYWx1ZXMubGVuZ3RoKXt0aGlzLl9kYXRhR3JpZD1EYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkLmNyZWF0ZShjb2x1bW5EaXNwbGF5TmFtZXMsZmxhdFZhbHVlcyk7dGhpcy5fZGF0YUdyaWQuc2V0U3RyaXBlZCh0cnVlKTtjb25zdCBmb3JtYXR0ZWRSZXN1bHQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2NvbnNvbGUtbWVzc2FnZS10ZXh0Jyk7Y29uc3QgdGFibGVFbGVtZW50PWZvcm1hdHRlZFJlc3VsdC5jcmVhdGVDaGlsZCgnZGl2JywnY29uc29sZS1tZXNzYWdlLWZvcm1hdHRlZC10YWJsZScpO2NvbnN0IGRhdGFHcmlkQ29udGFpbmVyPXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO3RhYmxlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9mb3JtYXRQYXJhbWV0ZXIodGFibGUsdHJ1ZSxmYWxzZSkpO2RhdGFHcmlkQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2RhdGFHcmlkLmVsZW1lbnQpO2Zvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kQ2hpbGQoZm9ybWF0dGVkUmVzdWx0KTt0aGlzLl9kYXRhR3JpZC5yZW5kZXJJbmxpbmUoKTt9CnJldHVybiBmb3JtYXR0ZWRNZXNzYWdlO30KX2J1aWxkTWVzc2FnZSgpe2xldCBtZXNzYWdlRWxlbWVudDtsZXQgbWVzc2FnZVRleHQ9dGhpcy5fbWVzc2FnZS5tZXNzYWdlVGV4dDtpZih0aGlzLl9tZXNzYWdlLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkNvbnNvbGVBUEkpe3N3aXRjaCh0aGlzLl9tZXNzYWdlLnR5cGUpe2Nhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlRyYWNlOm1lc3NhZ2VFbGVtZW50PXRoaXMuX2Zvcm1hdCh0aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnN8fFsnY29uc29sZS50cmFjZSddKTticmVhaztjYXNlIFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5DbGVhcjptZXNzYWdlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnY29uc29sZS1pbmZvJyk7aWYoQ29tbW9uLm1vZHVsZVNldHRpbmcoJ3ByZXNlcnZlQ29uc29sZUxvZycpLmdldCgpKQptZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ2NvbnNvbGUuY2xlYXIoKSB3YXMgcHJldmVudGVkIGR1ZSB0byBcJ1ByZXNlcnZlIGxvZ1wnJyk7ZWxzZQptZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0NvbnNvbGUgd2FzIGNsZWFyZWQnKTttZXNzYWdlRWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0NsZWFyIGFsbCBtZXNzYWdlcyB3aXRoICcrVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dFRpdGxlRm9yQWN0aW9uKCdjb25zb2xlLmNsZWFyJykpO2JyZWFrO2Nhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkFzc2VydDp7bGV0IGFyZ3M9W0NvbW1vbi5VSVN0cmluZygnQXNzZXJ0aW9uIGZhaWxlZDonKV07aWYodGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzKQphcmdzPWFyZ3MuY29uY2F0KHRoaXMuX21lc3NhZ2UucGFyYW1ldGVycyk7bWVzc2FnZUVsZW1lbnQ9dGhpcy5fZm9ybWF0KGFyZ3MpO2JyZWFrO30KY2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuRGlyOntjb25zdCBvYmo9dGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzP3RoaXMuX21lc3NhZ2UucGFyYW1ldGVyc1swXTp1bmRlZmluZWQ7Y29uc3QgYXJncz1bJyVPJyxvYmpdO21lc3NhZ2VFbGVtZW50PXRoaXMuX2Zvcm1hdChhcmdzKTticmVhazt9CmNhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlByb2ZpbGU6Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuUHJvZmlsZUVuZDptZXNzYWdlRWxlbWVudD10aGlzLl9mb3JtYXQoW21lc3NhZ2VUZXh0XSk7YnJlYWs7ZGVmYXVsdDp7aWYodGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzJiZ0aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnMubGVuZ3RoPT09MSYmdGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzWzBdLnR5cGU9PT0nc3RyaW5nJykKbWVzc2FnZUVsZW1lbnQ9dGhpcy5fdHJ5Rm9ybWF0QXNFcnJvcigodGhpcy5fbWVzc2FnZS5wYXJhbWV0ZXJzWzBdLnZhbHVlKSk7Y29uc3QgYXJncz10aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnN8fFttZXNzYWdlVGV4dF07bWVzc2FnZUVsZW1lbnQ9bWVzc2FnZUVsZW1lbnR8fHRoaXMuX2Zvcm1hdChhcmdzKTt9fX1lbHNle2xldCByZW5kZXJlZD1mYWxzZTt0aGlzLl9jb21wbGV0ZUVsZW1lbnRGb3JUZXN0UHJvbWlzZT1udWxsO2Zvcihjb25zdCBleHRlbnNpb24gb2Ygc2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoQ29tbW9uLlJlbmRlcmVyLHRoaXMuX21lc3NhZ2UpKXtpZihleHRlbnNpb24uZGVzY3JpcHRvcigpWydzb3VyY2UnXT09PXRoaXMuX21lc3NhZ2Uuc291cmNlKXttZXNzYWdlRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bGV0IGNhbGxiYWNrO3RoaXMuX2NvbXBsZXRlRWxlbWVudEZvclRlc3RQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9PmNhbGxiYWNrPWZ1bGZpbGwpO2V4dGVuc2lvbi5pbnN0YW5jZSgpLnRoZW4ocmVuZGVyZXI9PntyZW5kZXJlci5yZW5kZXIodGhpcy5fbWVzc2FnZSkudGhlbihlbGVtZW50PT5tZXNzYWdlRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50fHx0aGlzLl9mb3JtYXQoW21lc3NhZ2VUZXh0XSkpKS50aGVuKGNhbGxiYWNrKTt9KTtyZW5kZXJlZD10cnVlO2JyZWFrO319CmlmKCFyZW5kZXJlZCl7Y29uc3QgbWVzc2FnZUluUGFyYW1ldGVycz10aGlzLl9tZXNzYWdlLnBhcmFtZXRlcnMmJm1lc3NhZ2VUZXh0PT09KHRoaXMuX21lc3NhZ2UucGFyYW1ldGVyc1swXSk7aWYodGhpcy5fbWVzc2FnZS5zb3VyY2U9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5WaW9sYXRpb24pCm1lc3NhZ2VUZXh0PUNvbW1vbi5VSVN0cmluZygnW1Zpb2xhdGlvbl0gJXMnLG1lc3NhZ2VUZXh0KTtlbHNlIGlmKHRoaXMuX21lc3NhZ2Uuc291cmNlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuSW50ZXJ2ZW50aW9uKQptZXNzYWdlVGV4dD1Db21tb24uVUlTdHJpbmcoJ1tJbnRlcnZlbnRpb25dICVzJyxtZXNzYWdlVGV4dCk7ZWxzZSBpZih0aGlzLl9tZXNzYWdlLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkRlcHJlY2F0aW9uKQptZXNzYWdlVGV4dD1Db21tb24uVUlTdHJpbmcoJ1tEZXByZWNhdGlvbl0gJXMnLG1lc3NhZ2VUZXh0KTtjb25zdCBhcmdzPXRoaXMuX21lc3NhZ2UucGFyYW1ldGVyc3x8W21lc3NhZ2VUZXh0XTtpZihtZXNzYWdlSW5QYXJhbWV0ZXJzKQphcmdzWzBdPW1lc3NhZ2VUZXh0O21lc3NhZ2VFbGVtZW50PXRoaXMuX2Zvcm1hdChhcmdzKTt9fQptZXNzYWdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLW1lc3NhZ2UtdGV4dCcpO2NvbnN0IGZvcm1hdHRlZE1lc3NhZ2U9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ3NvdXJjZS1jb2RlJyk7Y29uc3QgYW5jaG9yRWxlbWVudD10aGlzLl9idWlsZE1lc3NhZ2VBbmNob3IoKTtpZihhbmNob3JFbGVtZW50KQpmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZENoaWxkKGFuY2hvckVsZW1lbnQpO2NvbnN0IGJhZGdlRWxlbWVudD10aGlzLl9idWlsZE1lc3NhZ2VCYWRnZSgpO2lmKGJhZGdlRWxlbWVudCkKZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmRDaGlsZChiYWRnZUVsZW1lbnQpO2Zvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kQ2hpbGQobWVzc2FnZUVsZW1lbnQpO3JldHVybiBmb3JtYXR0ZWRNZXNzYWdlO30KX2J1aWxkTWVzc2FnZUFuY2hvcigpe2xldCBhbmNob3JFbGVtZW50PW51bGw7aWYodGhpcy5fbWVzc2FnZS5zY3JpcHRJZCl7YW5jaG9yRWxlbWVudD10aGlzLl9saW5raWZ5U2NyaXB0SWQodGhpcy5fbWVzc2FnZS5zY3JpcHRJZCx0aGlzLl9tZXNzYWdlLnVybHx8JycsdGhpcy5fbWVzc2FnZS5saW5lLHRoaXMuX21lc3NhZ2UuY29sdW1uKTt9ZWxzZSBpZih0aGlzLl9tZXNzYWdlLnN0YWNrVHJhY2UmJnRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZS5jYWxsRnJhbWVzLmxlbmd0aCl7YW5jaG9yRWxlbWVudD10aGlzLl9saW5raWZ5U3RhY2tUcmFjZVRvcEZyYW1lKHRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZSk7fWVsc2UgaWYodGhpcy5fbWVzc2FnZS51cmwmJnRoaXMuX21lc3NhZ2UudXJsIT09J3VuZGVmaW5lZCcpe2FuY2hvckVsZW1lbnQ9dGhpcy5fbGlua2lmeUxvY2F0aW9uKHRoaXMuX21lc3NhZ2UudXJsLHRoaXMuX21lc3NhZ2UubGluZSx0aGlzLl9tZXNzYWdlLmNvbHVtbik7fQppZihhbmNob3JFbGVtZW50KXtjb25zdCBhbmNob3JXcmFwcGVyRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnY29uc29sZS1tZXNzYWdlLWFuY2hvcicpO2FuY2hvcldyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGFuY2hvckVsZW1lbnQpO2FuY2hvcldyYXBwZXJFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnICcpO3JldHVybiBhbmNob3JXcmFwcGVyRWxlbWVudDt9CnJldHVybiBudWxsO30KX2J1aWxkTWVzc2FnZUJhZGdlKCl7Y29uc3QgYmFkZ2VFbGVtZW50PXRoaXMuX2JhZGdlRWxlbWVudCgpO2lmKCFiYWRnZUVsZW1lbnQpCnJldHVybiBudWxsO2JhZGdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLW1lc3NhZ2UtYmFkZ2UnKTtyZXR1cm4gYmFkZ2VFbGVtZW50O30KX2JhZGdlRWxlbWVudCgpe2lmKHRoaXMuX21lc3NhZ2UuX3VybCkKcmV0dXJuIHRoaXMuX2JhZGdlUG9vbC5iYWRnZUZvclVSTChuZXcgQ29tbW9uLlBhcnNlZFVSTCh0aGlzLl9tZXNzYWdlLl91cmwpKTtpZih0aGlzLl9tZXNzYWdlLnN0YWNrVHJhY2Upe2xldCBzdGFja1RyYWNlPXRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZTt3aGlsZShzdGFja1RyYWNlKXtmb3IoY29uc3QgY2FsbEZyYW1lIG9mIHRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZS5jYWxsRnJhbWVzKXtpZihjYWxsRnJhbWUudXJsKQpyZXR1cm4gdGhpcy5fYmFkZ2VQb29sLmJhZGdlRm9yVVJMKG5ldyBDb21tb24uUGFyc2VkVVJMKGNhbGxGcmFtZS51cmwpKTt9CnN0YWNrVHJhY2U9c3RhY2tUcmFjZS5wYXJlbnQ7fX0KaWYoIXRoaXMuX21lc3NhZ2UuZXhlY3V0aW9uQ29udGV4dElkKQpyZXR1cm4gbnVsbDtjb25zdCBydW50aW1lTW9kZWw9dGhpcy5fbWVzc2FnZS5ydW50aW1lTW9kZWwoKTtpZighcnVudGltZU1vZGVsKQpyZXR1cm4gbnVsbDtjb25zdCBleGVjdXRpb25Db250ZXh0PXJ1bnRpbWVNb2RlbC5leGVjdXRpb25Db250ZXh0KHRoaXMuX21lc3NhZ2UuZXhlY3V0aW9uQ29udGV4dElkKTtpZighZXhlY3V0aW9uQ29udGV4dHx8IWV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZCkKcmV0dXJuIG51bGw7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9ZXhlY3V0aW9uQ29udGV4dC50YXJnZXQoKS5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKCFyZXNvdXJjZVRyZWVNb2RlbCkKcmV0dXJuIG51bGw7Y29uc3QgZnJhbWU9cmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JJZChleGVjdXRpb25Db250ZXh0LmZyYW1lSWQpO2lmKCFmcmFtZXx8IWZyYW1lLnBhcmVudEZyYW1lKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fYmFkZ2VQb29sLmJhZGdlRm9yRnJhbWUoZnJhbWUpO30KX2J1aWxkTWVzc2FnZVdpdGhTdGFja1RyYWNlKCl7Y29uc3QgdG9nZ2xlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdjb25zb2xlLW1lc3NhZ2Utc3RhY2stdHJhY2UtdG9nZ2xlJyk7Y29uc3QgY29udGVudEVsZW1lbnQ9dG9nZ2xlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uc29sZS1tZXNzYWdlLXN0YWNrLXRyYWNlLXdyYXBwZXInKTtjb25zdCBtZXNzYWdlRWxlbWVudD10aGlzLl9idWlsZE1lc3NhZ2UoKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdHJpYW5nbGUtcmlnaHQnLCdjb25zb2xlLW1lc3NhZ2UtZXhwYW5kLWljb24nKTtjb25zdCBjbGlja2FibGVFbGVtZW50PWNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTtjbGlja2FibGVFbGVtZW50LmFwcGVuZENoaWxkKGljb24pO2NsaWNrYWJsZUVsZW1lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZUVsZW1lbnQpO2NvbnN0IHN0YWNrVHJhY2VFbGVtZW50PWNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTtjb25zdCBzdGFja1RyYWNlUHJldmlldz1Db21wb25lbnRzLkpTUHJlc2VudGF0aW9uVXRpbHMuYnVpbGRTdGFja1RyYWNlUHJldmlld0NvbnRlbnRzKHRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkudGFyZ2V0KCksdGhpcy5fbGlua2lmaWVyLHRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZSk7c3RhY2tUcmFjZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RhY2tUcmFjZVByZXZpZXcpO3N0YWNrVHJhY2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO2Z1bmN0aW9uIGV4cGFuZFN0YWNrVHJhY2UoZXhwYW5kKXtpY29uLnNldEljb25UeXBlKGV4cGFuZD8nc21hbGxpY29uLXRyaWFuZ2xlLWRvd24nOidzbWFsbGljb24tdHJpYW5nbGUtcmlnaHQnKTtzdGFja1RyYWNlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFleHBhbmQpO30KZnVuY3Rpb24gdG9nZ2xlU3RhY2tUcmFjZShldmVudCl7aWYoZXZlbnQudGFyZ2V0Lmhhc1NlbGVjdGlvbigpKQpyZXR1cm47ZXhwYW5kU3RhY2tUcmFjZShzdGFja1RyYWNlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpKTtldmVudC5jb25zdW1lKCk7fQpjbGlja2FibGVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0b2dnbGVTdGFja1RyYWNlLGZhbHNlKTtpZih0aGlzLl9tZXNzYWdlLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuVHJhY2UpCmV4cGFuZFN0YWNrVHJhY2UodHJ1ZSk7dG9nZ2xlRWxlbWVudC5fZXhwYW5kU3RhY2tUcmFjZUZvclRlc3Q9ZXhwYW5kU3RhY2tUcmFjZS5iaW5kKG51bGwsdHJ1ZSk7cmV0dXJuIHRvZ2dsZUVsZW1lbnQ7fQpfbGlua2lmeUxvY2F0aW9uKHVybCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7aWYoIXRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9saW5raWZpZXIubGlua2lmeVNjcmlwdExvY2F0aW9uKHRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkudGFyZ2V0KCksbnVsbCx1cmwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO30KX2xpbmtpZnlTdGFja1RyYWNlVG9wRnJhbWUoc3RhY2tUcmFjZSl7aWYoIXRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9saW5raWZpZXIubGlua2lmeVN0YWNrVHJhY2VUb3BGcmFtZSh0aGlzLl9tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpLnRhcmdldCgpLHN0YWNrVHJhY2UpO30KX2xpbmtpZnlTY3JpcHRJZChzY3JpcHRJZCx1cmwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2lmKCF0aGlzLl9tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fbGlua2lmaWVyLmxpbmtpZnlTY3JpcHRMb2NhdGlvbih0aGlzLl9tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpLnRhcmdldCgpLHNjcmlwdElkLHVybCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fQpfcGFyYW1ldGVyVG9SZW1vdGVPYmplY3QocGFyYW1ldGVyKXtpZihwYXJhbWV0ZXIgaW5zdGFuY2VvZiBTREsuUmVtb3RlT2JqZWN0KQpyZXR1cm4gcGFyYW1ldGVyO2NvbnN0IHJ1bnRpbWVNb2RlbD10aGlzLl9tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpO2lmKCFydW50aW1lTW9kZWwpCnJldHVybiBTREsuUmVtb3RlT2JqZWN0LmZyb21Mb2NhbE9iamVjdChwYXJhbWV0ZXIpO2lmKHR5cGVvZiBwYXJhbWV0ZXI9PT0nb2JqZWN0JykKcmV0dXJuIHJ1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QocGFyYW1ldGVyKTtyZXR1cm4gcnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdEZyb21QcmltaXRpdmVWYWx1ZShwYXJhbWV0ZXIpO30KX2Zvcm1hdChyYXdQYXJhbWV0ZXJzKXtjb25zdCBmb3JtYXR0ZWRSZXN1bHQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO2lmKCFyYXdQYXJhbWV0ZXJzLmxlbmd0aCkKcmV0dXJuIGZvcm1hdHRlZFJlc3VsdDtsZXQgcGFyYW1ldGVycz1bXTtmb3IobGV0IGk9MDtpPHJhd1BhcmFtZXRlcnMubGVuZ3RoOysraSkKcGFyYW1ldGVyc1tpXT10aGlzLl9wYXJhbWV0ZXJUb1JlbW90ZU9iamVjdChyYXdQYXJhbWV0ZXJzW2ldKTtjb25zdCBzaG91bGRGb3JtYXRNZXNzYWdlPVNESy5SZW1vdGVPYmplY3QudHlwZSgoKHBhcmFtZXRlcnMpKVswXSk9PT0nc3RyaW5nJyYmKHRoaXMuX21lc3NhZ2UudHlwZSE9PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5SZXN1bHR8fHRoaXMuX21lc3NhZ2UubGV2ZWw9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yKTtpZihzaG91bGRGb3JtYXRNZXNzYWdlKXtjb25zdCByZXN1bHQ9dGhpcy5fZm9ybWF0V2l0aFN1YnN0aXR1dGlvblN0cmluZygocGFyYW1ldGVyc1swXS5kZXNjcmlwdGlvbikscGFyYW1ldGVycy5zbGljZSgxKSxmb3JtYXR0ZWRSZXN1bHQpO3BhcmFtZXRlcnM9cmVzdWx0LnVudXNlZFN1YnN0aXR1dGlvbnM7aWYocGFyYW1ldGVycy5sZW5ndGgpCmZvcm1hdHRlZFJlc3VsdC5jcmVhdGVUZXh0Q2hpbGQoJyAnKTt9CmZvcihsZXQgaT0wO2k8cGFyYW1ldGVycy5sZW5ndGg7KytpKXtpZihzaG91bGRGb3JtYXRNZXNzYWdlJiZwYXJhbWV0ZXJzW2ldLnR5cGU9PT0nc3RyaW5nJykKZm9ybWF0dGVkUmVzdWx0LmFwcGVuZENoaWxkKENvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLl9saW5raWZ5U3RyaW5nQXNGcmFnbWVudChwYXJhbWV0ZXJzW2ldLmRlc2NyaXB0aW9uKSk7ZWxzZQpmb3JtYXR0ZWRSZXN1bHQuYXBwZW5kQ2hpbGQodGhpcy5fZm9ybWF0UGFyYW1ldGVyKHBhcmFtZXRlcnNbaV0sZmFsc2UsdHJ1ZSkpO2lmKGk8cGFyYW1ldGVycy5sZW5ndGgtMSkKZm9ybWF0dGVkUmVzdWx0LmNyZWF0ZVRleHRDaGlsZCgnICcpO30KcmV0dXJuIGZvcm1hdHRlZFJlc3VsdDt9Cl9mb3JtYXRQYXJhbWV0ZXIob3V0cHV0LGZvcmNlT2JqZWN0Rm9ybWF0LGluY2x1ZGVQcmV2aWV3KXtpZihvdXRwdXQuY3VzdG9tUHJldmlldygpKQpyZXR1cm4obmV3IE9iamVjdFVJLkN1c3RvbVByZXZpZXdDb21wb25lbnQob3V0cHV0KSkuZWxlbWVudDtjb25zdCB0eXBlPWZvcmNlT2JqZWN0Rm9ybWF0PydvYmplY3QnOihvdXRwdXQuc3VidHlwZXx8b3V0cHV0LnR5cGUpO2xldCBlbGVtZW50O3N3aXRjaCh0eXBlKXtjYXNlJ2Vycm9yJzplbGVtZW50PXRoaXMuX2Zvcm1hdFBhcmFtZXRlckFzRXJyb3Iob3V0cHV0KTticmVhaztjYXNlJ2Z1bmN0aW9uJzplbGVtZW50PXRoaXMuX2Zvcm1hdFBhcmFtZXRlckFzRnVuY3Rpb24ob3V0cHV0LGluY2x1ZGVQcmV2aWV3KTticmVhaztjYXNlJ2FycmF5JzpjYXNlJ2FycmF5YnVmZmVyJzpjYXNlJ2Jsb2InOmNhc2UnZGF0YXZpZXcnOmNhc2UnZ2VuZXJhdG9yJzpjYXNlJ2l0ZXJhdG9yJzpjYXNlJ21hcCc6Y2FzZSdvYmplY3QnOmNhc2UncHJvbWlzZSc6Y2FzZSdwcm94eSc6Y2FzZSdzZXQnOmNhc2UndHlwZWRhcnJheSc6Y2FzZSd3ZWFrbWFwJzpjYXNlJ3dlYWtzZXQnOmVsZW1lbnQ9dGhpcy5fZm9ybWF0UGFyYW1ldGVyQXNPYmplY3Qob3V0cHV0LGluY2x1ZGVQcmV2aWV3KTticmVhaztjYXNlJ25vZGUnOmVsZW1lbnQ9b3V0cHV0LmlzTm9kZSgpP3RoaXMuX2Zvcm1hdFBhcmFtZXRlckFzTm9kZShvdXRwdXQpOnRoaXMuX2Zvcm1hdFBhcmFtZXRlckFzT2JqZWN0KG91dHB1dCxmYWxzZSk7YnJlYWs7Y2FzZSdzdHJpbmcnOmVsZW1lbnQ9dGhpcy5fZm9ybWF0UGFyYW1ldGVyQXNTdHJpbmcob3V0cHV0KTticmVhaztjYXNlJ2Jvb2xlYW4nOmNhc2UnZGF0ZSc6Y2FzZSdudWxsJzpjYXNlJ251bWJlcic6Y2FzZSdyZWdleHAnOmNhc2Unc3ltYm9sJzpjYXNlJ3VuZGVmaW5lZCc6Y2FzZSdiaWdpbnQnOmVsZW1lbnQ9dGhpcy5fZm9ybWF0UGFyYW1ldGVyQXNWYWx1ZShvdXRwdXQpO2JyZWFrO2RlZmF1bHQ6ZWxlbWVudD10aGlzLl9mb3JtYXRQYXJhbWV0ZXJBc1ZhbHVlKG91dHB1dCk7Y29uc29sZS5lcnJvcignVHJpZWQgdG8gZm9ybWF0IHJlbW90ZSBvYmplY3Qgb2YgdW5rbm93biB0eXBlLicpO30KZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvYmplY3QtdmFsdWUtJyt0eXBlKTtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NvdXJjZS1jb2RlJyk7cmV0dXJuIGVsZW1lbnQ7fQpfZm9ybWF0UGFyYW1ldGVyQXNWYWx1ZShvYmope2NvbnN0IHJlc3VsdD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7Y29uc3QgZGVzY3JpcHRpb249b2JqLmRlc2NyaXB0aW9ufHwnJztpZihkZXNjcmlwdGlvbi5sZW5ndGg+Q29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX01heFRva2VuaXphYmxlU3RyaW5nTGVuZ3RoKQpyZXN1bHQuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlRXhwYW5kYWJsZVRleHQoZGVzY3JpcHRpb24sQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX0xvbmdTdHJpbmdWaXNpYmxlTGVuZ3RoKSk7ZWxzZQpyZXN1bHQuY3JlYXRlVGV4dENoaWxkKGRlc2NyaXB0aW9uKTtpZihvYmoub2JqZWN0SWQpCnJlc3VsdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnVFdmVudEZpcmVkLmJpbmQodGhpcyxvYmopLGZhbHNlKTtyZXR1cm4gcmVzdWx0O30KX2Zvcm1hdFBhcmFtZXRlckFzT2JqZWN0KG9iaixpbmNsdWRlUHJldmlldyl7Y29uc3QgdGl0bGVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdjb25zb2xlLW9iamVjdCcpO2lmKGluY2x1ZGVQcmV2aWV3JiZvYmoucHJldmlldyl7dGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtb2JqZWN0LXByZXZpZXcnKTt0aGlzLl9wcmV2aWV3Rm9ybWF0dGVyLmFwcGVuZE9iamVjdFByZXZpZXcodGl0bGVFbGVtZW50LG9iai5wcmV2aWV3LGZhbHNlKTt9ZWxzZSBpZihvYmoudHlwZT09PSdmdW5jdGlvbicpe2NvbnN0IGZ1bmN0aW9uRWxlbWVudD10aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5mb3JtYXRPYmplY3RBc0Z1bmN0aW9uKG9iaixmdW5jdGlvbkVsZW1lbnQsZmFsc2UpO3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvYmplY3QtdmFsdWUtZnVuY3Rpb24nKTt9ZWxzZXt0aXRsZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKG9iai5kZXNjcmlwdGlvbnx8JycpO30KaWYoIW9iai5oYXNDaGlsZHJlbnx8b2JqLmN1c3RvbVByZXZpZXcoKSkKcmV0dXJuIHRpdGxlRWxlbWVudDtjb25zdCBub3RlPXRpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC1zdGF0ZS1ub3RlIGluZm8tbm90ZScpO2lmKHRoaXMuX21lc3NhZ2UudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5RdWVyeU9iamVjdFJlc3VsdCkKbm90ZS50aXRsZT1sc2BUaGlzIHZhbHVlIHdpbGwgbm90IGJlIGNvbGxlY3RlZCB1bnRpbCBjb25zb2xlIGlzIGNsZWFyZWQuYDtlbHNlCm5vdGUudGl0bGU9bHNgVmFsdWUgYmVsb3cgd2FzIGV2YWx1YXRlZCBqdXN0IG5vdy5gO2NvbnN0IHNlY3Rpb249bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uKG9iaix0aXRsZUVsZW1lbnQsdGhpcy5fbGlua2lmaWVyKTtzZWN0aW9uLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS12aWV3LW9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24nKTtzZWN0aW9uLmVuYWJsZUNvbnRleHRNZW51KCk7cmV0dXJuIHNlY3Rpb24uZWxlbWVudDt9Cl9mb3JtYXRQYXJhbWV0ZXJBc0Z1bmN0aW9uKGZ1bmMsaW5jbHVkZVByZXZpZXcpe2NvbnN0IHJlc3VsdD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7U0RLLlJlbW90ZUZ1bmN0aW9uLm9iamVjdEFzRnVuY3Rpb24oZnVuYykudGFyZ2V0RnVuY3Rpb24oKS50aGVuKGZvcm1hdFRhcmdldEZ1bmN0aW9uLmJpbmQodGhpcykpO3JldHVybiByZXN1bHQ7ZnVuY3Rpb24gZm9ybWF0VGFyZ2V0RnVuY3Rpb24odGFyZ2V0RnVuY3Rpb24pe2NvbnN0IGZ1bmN0aW9uRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uZm9ybWF0T2JqZWN0QXNGdW5jdGlvbih0YXJnZXRGdW5jdGlvbixmdW5jdGlvbkVsZW1lbnQsdHJ1ZSxpbmNsdWRlUHJldmlldyk7cmVzdWx0LmFwcGVuZENoaWxkKGZ1bmN0aW9uRWxlbWVudCk7aWYodGFyZ2V0RnVuY3Rpb24hPT1mdW5jKXtjb25zdCBub3RlPXJlc3VsdC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC1pbmZvLXN0YXRlLW5vdGUnKTtub3RlLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnRnVuY3Rpb24gd2FzIHJlc29sdmVkIGZyb20gYm91bmQgZnVuY3Rpb24uJyk7fQpyZXN1bHQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51RXZlbnRGaXJlZC5iaW5kKHRoaXMsdGFyZ2V0RnVuY3Rpb24pLGZhbHNlKTt9fQpfY29udGV4dE1lbnVFdmVudEZpcmVkKG9iaixldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXMob2JqKTtjb250ZXh0TWVudS5zaG93KCk7fQpfcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3NvcihvYmplY3QscHJvcGVydHlQYXRoKXtjb25zdCBwcm9wZXJ0eT1wcm9wZXJ0eVBhdGgucGVla0xhc3QoKTtpZihwcm9wZXJ0eS50eXBlPT09J2FjY2Vzc29yJykKcmV0dXJuIHRoaXMuX2Zvcm1hdEFzQWNjZXNzb3JQcm9wZXJ0eShvYmplY3QscHJvcGVydHlQYXRoLm1hcChwcm9wZXJ0eT0+cHJvcGVydHkubmFtZSksZmFsc2UpO3JldHVybiB0aGlzLl9wcmV2aWV3Rm9ybWF0dGVyLnJlbmRlclByb3BlcnR5UHJldmlldyhwcm9wZXJ0eS50eXBlLChwcm9wZXJ0eS5zdWJ0eXBlKSxwcm9wZXJ0eS52YWx1ZSk7fQpfZm9ybWF0UGFyYW1ldGVyQXNOb2RlKHJlbW90ZU9iamVjdCl7Y29uc3QgcmVzdWx0PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBkb21Nb2RlbD1yZW1vdGVPYmplY3QucnVudGltZU1vZGVsKCkudGFyZ2V0KCkubW9kZWwoU0RLLkRPTU1vZGVsKTtpZighZG9tTW9kZWwpCnJldHVybiByZXN1bHQ7ZG9tTW9kZWwucHVzaE9iamVjdEFzTm9kZVRvRnJvbnRlbmQocmVtb3RlT2JqZWN0KS50aGVuKG5vZGU9PntpZighbm9kZSl7cmVzdWx0LmFwcGVuZENoaWxkKHRoaXMuX2Zvcm1hdFBhcmFtZXRlckFzT2JqZWN0KHJlbW90ZU9iamVjdCxmYWxzZSkpO3JldHVybjt9CkNvbW1vbi5SZW5kZXJlci5yZW5kZXIobm9kZSkudGhlbihyZW5kZXJlck5vZGU9PntpZihyZW5kZXJlck5vZGUpCnJlc3VsdC5hcHBlbmRDaGlsZChyZW5kZXJlck5vZGUpO2Vsc2UKcmVzdWx0LmFwcGVuZENoaWxkKHRoaXMuX2Zvcm1hdFBhcmFtZXRlckFzT2JqZWN0KHJlbW90ZU9iamVjdCxmYWxzZSkpO3RoaXMuX2Zvcm1hdHRlZFBhcmFtZXRlckFzTm9kZUZvclRlc3QoKTt9KTt9KTtyZXR1cm4gcmVzdWx0O30KX2Zvcm1hdHRlZFBhcmFtZXRlckFzTm9kZUZvclRlc3QoKXt9Cl9mb3JtYXRQYXJhbWV0ZXJBc1N0cmluZyhvdXRwdXQpe2NvbnN0IHNwYW49Y3JlYXRlRWxlbWVudCgnc3BhbicpO3NwYW4uYXBwZW5kQ2hpbGQoQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX2xpbmtpZnlTdHJpbmdBc0ZyYWdtZW50KG91dHB1dC5kZXNjcmlwdGlvbnx8JycpKTtjb25zdCByZXN1bHQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3Jlc3VsdC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC12YWx1ZS1zdHJpbmctcXVvdGUnKS50ZXh0Q29udGVudD0nIic7cmVzdWx0LmFwcGVuZENoaWxkKHNwYW4pO3Jlc3VsdC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC12YWx1ZS1zdHJpbmctcXVvdGUnKS50ZXh0Q29udGVudD0nIic7cmV0dXJuIHJlc3VsdDt9Cl9mb3JtYXRQYXJhbWV0ZXJBc0Vycm9yKG91dHB1dCl7Y29uc3QgcmVzdWx0PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBlcnJvclNwYW49dGhpcy5fdHJ5Rm9ybWF0QXNFcnJvcihvdXRwdXQuZGVzY3JpcHRpb258fCcnKTtyZXN1bHQuYXBwZW5kQ2hpbGQoZXJyb3JTcGFuP2Vycm9yU3BhbjpDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fbGlua2lmeVN0cmluZ0FzRnJhZ21lbnQob3V0cHV0LmRlc2NyaXB0aW9ufHwnJykpO3JldHVybiByZXN1bHQ7fQpfZm9ybWF0QXNBcnJheUVudHJ5KG91dHB1dCl7cmV0dXJuIHRoaXMuX3ByZXZpZXdGb3JtYXR0ZXIucmVuZGVyUHJvcGVydHlQcmV2aWV3KG91dHB1dC50eXBlLG91dHB1dC5zdWJ0eXBlLG91dHB1dC5kZXNjcmlwdGlvbik7fQpfZm9ybWF0QXNBY2Nlc3NvclByb3BlcnR5KG9iamVjdCxwcm9wZXJ0eVBhdGgsaXNBcnJheUVudHJ5KXtjb25zdCByb290RWxlbWVudD1PYmplY3RVSS5PYmplY3RQcm9wZXJ0eVRyZWVFbGVtZW50LmNyZWF0ZVJlbW90ZU9iamVjdEFjY2Vzc29yUHJvcGVydHlTcGFuKG9iamVjdCxwcm9wZXJ0eVBhdGgsb25JbnZva2VHZXR0ZXJDbGljay5iaW5kKHRoaXMpKTtmdW5jdGlvbiBvbkludm9rZUdldHRlckNsaWNrKHJlc3VsdCx3YXNUaHJvd24pe2lmKCFyZXN1bHQpCnJldHVybjtyb290RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2lmKHdhc1Rocm93bil7Y29uc3QgZWxlbWVudD1yb290RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO2VsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCc8ZXhjZXB0aW9uPicpO2VsZW1lbnQudGl0bGU9KHJlc3VsdC5kZXNjcmlwdGlvbik7fWVsc2UgaWYoaXNBcnJheUVudHJ5KXtyb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9mb3JtYXRBc0FycmF5RW50cnkocmVzdWx0KSk7fWVsc2V7Y29uc3QgbWF4TGVuZ3RoPTEwMDtjb25zdCB0eXBlPXJlc3VsdC50eXBlO2NvbnN0IHN1YnR5cGU9cmVzdWx0LnN1YnR5cGU7bGV0IGRlc2NyaXB0aW9uPScnO2lmKHR5cGUhPT0nZnVuY3Rpb24nJiZyZXN1bHQuZGVzY3JpcHRpb24pe2lmKHR5cGU9PT0nc3RyaW5nJ3x8c3VidHlwZT09PSdyZWdleHAnKQpkZXNjcmlwdGlvbj1yZXN1bHQuZGVzY3JpcHRpb24udHJpbU1pZGRsZShtYXhMZW5ndGgpO2Vsc2UKZGVzY3JpcHRpb249cmVzdWx0LmRlc2NyaXB0aW9uLnRyaW1FbmQobWF4TGVuZ3RoKTt9CnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3ByZXZpZXdGb3JtYXR0ZXIucmVuZGVyUHJvcGVydHlQcmV2aWV3KHR5cGUsc3VidHlwZSxkZXNjcmlwdGlvbikpO319CnJldHVybiByb290RWxlbWVudDt9Cl9mb3JtYXRXaXRoU3Vic3RpdHV0aW9uU3RyaW5nKGZvcm1hdCxwYXJhbWV0ZXJzLGZvcm1hdHRlZFJlc3VsdCl7Y29uc3QgZm9ybWF0dGVycz17fTtmdW5jdGlvbiBwYXJhbWV0ZXJGb3JtYXR0ZXIoZm9yY2UsaW5jbHVkZVByZXZpZXcsb2JqKXtyZXR1cm4gdGhpcy5fZm9ybWF0UGFyYW1ldGVyKG9iaixmb3JjZSxpbmNsdWRlUHJldmlldyk7fQpmdW5jdGlvbiBzdHJpbmdGb3JtYXR0ZXIob2JqKXtyZXR1cm4gb2JqLmRlc2NyaXB0aW9uO30KZnVuY3Rpb24gZmxvYXRGb3JtYXR0ZXIob2JqKXtpZih0eXBlb2Ygb2JqLnZhbHVlIT09J251bWJlcicpCnJldHVybidOYU4nO3JldHVybiBvYmoudmFsdWU7fQpmdW5jdGlvbiBpbnRlZ2VyRm9ybWF0dGVyKG9iail7aWYodHlwZW9mIG9iai52YWx1ZSE9PSdudW1iZXInKQpyZXR1cm4nTmFOJztyZXR1cm4gTWF0aC5mbG9vcihvYmoudmFsdWUpO30KZnVuY3Rpb24gYnlwYXNzRm9ybWF0dGVyKG9iail7cmV0dXJuKG9iaiBpbnN0YW5jZW9mIE5vZGUpP29iajonJzt9CmxldCBjdXJyZW50U3R5bGU9bnVsbDtmdW5jdGlvbiBzdHlsZUZvcm1hdHRlcihvYmope2N1cnJlbnRTdHlsZT17fTtjb25zdCBidWZmZXI9Y3JlYXRlRWxlbWVudCgnc3BhbicpO2J1ZmZlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJyxvYmouZGVzY3JpcHRpb24pO2ZvcihsZXQgaT0wO2k8YnVmZmVyLnN0eWxlLmxlbmd0aDtpKyspe2NvbnN0IHByb3BlcnR5PWJ1ZmZlci5zdHlsZVtpXTtpZihpc1doaXRlbGlzdGVkUHJvcGVydHkocHJvcGVydHkpKQpjdXJyZW50U3R5bGVbcHJvcGVydHldPWJ1ZmZlci5zdHlsZVtwcm9wZXJ0eV07fX0KZnVuY3Rpb24gaXNXaGl0ZWxpc3RlZFByb3BlcnR5KHByb3BlcnR5KXtjb25zdCBwcmVmaXhlcz1bJ2JhY2tncm91bmQnLCdib3JkZXInLCdjb2xvcicsJ2ZvbnQnLCdsaW5lJywnbWFyZ2luJywncGFkZGluZycsJ3RleHQnLCctd2Via2l0LWJhY2tncm91bmQnLCctd2Via2l0LWJvcmRlcicsJy13ZWJraXQtZm9udCcsJy13ZWJraXQtbWFyZ2luJywnLXdlYmtpdC1wYWRkaW5nJywnLXdlYmtpdC10ZXh0J107Zm9yKGxldCBpPTA7aTxwcmVmaXhlcy5sZW5ndGg7aSsrKXtpZihwcm9wZXJ0eS5zdGFydHNXaXRoKHByZWZpeGVzW2ldKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpmb3JtYXR0ZXJzLm89cGFyYW1ldGVyRm9ybWF0dGVyLmJpbmQodGhpcyxmYWxzZSx0cnVlKTtmb3JtYXR0ZXJzLnM9c3RyaW5nRm9ybWF0dGVyO2Zvcm1hdHRlcnMuZj1mbG9hdEZvcm1hdHRlcjtmb3JtYXR0ZXJzLmk9aW50ZWdlckZvcm1hdHRlcjtmb3JtYXR0ZXJzLmQ9aW50ZWdlckZvcm1hdHRlcjtmb3JtYXR0ZXJzLmM9c3R5bGVGb3JtYXR0ZXI7Zm9ybWF0dGVycy5PPXBhcmFtZXRlckZvcm1hdHRlci5iaW5kKHRoaXMsdHJ1ZSxmYWxzZSk7Zm9ybWF0dGVycy5fPWJ5cGFzc0Zvcm1hdHRlcjtmdW5jdGlvbiBhcHBlbmQoYSxiKXtpZihiIGluc3RhbmNlb2YgTm9kZSl7YS5hcHBlbmRDaGlsZChiKTtyZXR1cm4gYTt9CmlmKHR5cGVvZiBiPT09J3VuZGVmaW5lZCcpCnJldHVybiBhO2lmKCFjdXJyZW50U3R5bGUpe2EuYXBwZW5kQ2hpbGQoQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX2xpbmtpZnlTdHJpbmdBc0ZyYWdtZW50KFN0cmluZyhiKSkpO3JldHVybiBhO30KY29uc3QgbGluZXM9U3RyaW5nKGIpLnNwbGl0KCdcbicpO2ZvcihsZXQgaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7Y29uc3QgbGluZT1saW5lc1tpXTtjb25zdCBsaW5lRnJhZ21lbnQ9Q29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX2xpbmtpZnlTdHJpbmdBc0ZyYWdtZW50KGxpbmUpO2NvbnN0IHdyYXBwZXI9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3dyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2NvbnRhaW4nLCdwYWludCcpO3dyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCdpbmxpbmUtYmxvY2snKTt3cmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCcxMDAlJyk7d3JhcHBlci5hcHBlbmRDaGlsZChsaW5lRnJhZ21lbnQpO2FwcGx5Q3VycmVudFN0eWxlKHdyYXBwZXIpO2Zvcihjb25zdCBjaGlsZCBvZiB3cmFwcGVyLmNoaWxkcmVuKXtpZihjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2RldnRvb2xzLWxpbmsnKSkKdGhpcy5fYXBwbHlGb3JjZWRWaXNpYmxlU3R5bGUoY2hpbGQpO30KYS5hcHBlbmRDaGlsZCh3cmFwcGVyKTtpZihpPGxpbmVzLmxlbmd0aC0xKQphLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ2JyJykpO30KcmV0dXJuIGE7fQpmdW5jdGlvbiBhcHBseUN1cnJlbnRTdHlsZShlbGVtZW50KXtmb3IoY29uc3Qga2V5IGluIGN1cnJlbnRTdHlsZSkKZWxlbWVudC5zdHlsZVtrZXldPWN1cnJlbnRTdHlsZVtrZXldO30KcmV0dXJuIFN0cmluZy5mb3JtYXQoZm9ybWF0LHBhcmFtZXRlcnMsZm9ybWF0dGVycyxmb3JtYXR0ZWRSZXN1bHQsYXBwZW5kLmJpbmQodGhpcykpO30KX2FwcGx5Rm9yY2VkVmlzaWJsZVN0eWxlKGVsZW1lbnQpe2VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy13ZWJraXQtdGV4dC1zdHJva2UnLCcwJywnaW1wb3J0YW50Jyk7ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgndGV4dC1kZWNvcmF0aW9uJywndW5kZXJsaW5lJywnaW1wb3J0YW50Jyk7Y29uc3QgdGhlbWVkQ29sb3I9VUkudGhlbWVTdXBwb3J0LnBhdGNoQ29sb3JUZXh0KCdyZ2IoMzMlLCAzMyUsIDMzJSknLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO2VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2NvbG9yJyx0aGVtZWRDb2xvciwnaW1wb3J0YW50Jyk7bGV0IGJhY2tncm91bmRDb2xvcj0naHNsKDAsIDAlLCAxMDAlKSc7aWYodGhpcy5fbWVzc2FnZS5sZXZlbD09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3IpCmJhY2tncm91bmRDb2xvcj0naHNsKDAsIDEwMCUsIDk3JSknO2Vsc2UgaWYodGhpcy5fbWVzc2FnZS5sZXZlbD09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuV2FybmluZ3x8dGhpcy5fc2hvdWxkUmVuZGVyQXNXYXJuaW5nKCkpCmJhY2tncm91bmRDb2xvcj0naHNsKDUwLCAxMDAlLCA5NSUpJztjb25zdCB0aGVtZWRCYWNrZ3JvdW5kQ29sb3I9VUkudGhlbWVTdXBwb3J0LnBhdGNoQ29sb3JUZXh0KGJhY2tncm91bmRDb2xvcixVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5CYWNrZ3JvdW5kKTtlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWNvbG9yJyx0aGVtZWRCYWNrZ3JvdW5kQ29sb3IsJ2ltcG9ydGFudCcpO30KbWF0Y2hlc0ZpbHRlclJlZ2V4KHJlZ2V4T2JqZWN0KXtyZWdleE9iamVjdC5sYXN0SW5kZXg9MDtjb25zdCB0ZXh0PXRoaXMuY29udGVudEVsZW1lbnQoKS5kZWVwVGV4dENvbnRlbnQoKTtyZXR1cm4gcmVnZXhPYmplY3QudGVzdCh0ZXh0KTt9Cm1hdGNoZXNGaWx0ZXJUZXh0KGZpbHRlcil7Y29uc3QgdGV4dD10aGlzLmNvbnRlbnRFbGVtZW50KCkuZGVlcFRleHRDb250ZW50KCk7cmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIudG9Mb3dlckNhc2UoKSk7fQp1cGRhdGVUaW1lc3RhbXAoKXtpZighdGhpcy5fY29udGVudEVsZW1lbnQpCnJldHVybjtpZihDb21tb24ubW9kdWxlU2V0dGluZygnY29uc29sZVRpbWVzdGFtcHNFbmFibGVkJykuZ2V0KCkpe2lmKCF0aGlzLl90aW1lc3RhbXBFbGVtZW50KQp0aGlzLl90aW1lc3RhbXBFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdjb25zb2xlLXRpbWVzdGFtcCcpO3RoaXMuX3RpbWVzdGFtcEVsZW1lbnQudGV4dENvbnRlbnQ9Zm9ybWF0VGltZXN0YW1wKHRoaXMuX21lc3NhZ2UudGltZXN0YW1wLGZhbHNlKSsnICc7dGhpcy5fdGltZXN0YW1wRWxlbWVudC50aXRsZT1mb3JtYXRUaW1lc3RhbXAodGhpcy5fbWVzc2FnZS50aW1lc3RhbXAsdHJ1ZSk7dGhpcy5fY29udGVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX3RpbWVzdGFtcEVsZW1lbnQsdGhpcy5fY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCk7fWVsc2UgaWYodGhpcy5fdGltZXN0YW1wRWxlbWVudCl7dGhpcy5fdGltZXN0YW1wRWxlbWVudC5yZW1vdmUoKTtkZWxldGUgdGhpcy5fdGltZXN0YW1wRWxlbWVudDt9CmZ1bmN0aW9uIGZvcm1hdFRpbWVzdGFtcCh0aW1lc3RhbXAsZnVsbCl7Y29uc3QgZGF0ZT1uZXcgRGF0ZSh0aW1lc3RhbXApO2NvbnN0IHl5bW1kZD1kYXRlLmdldEZ1bGxZZWFyKCkrJy0nK2xlYWRaZXJvKGRhdGUuZ2V0TW9udGgoKSsxLDIpKyctJytsZWFkWmVybyhkYXRlLmdldERhdGUoKSwyKTtjb25zdCBoaG1tc3NmZmY9bGVhZFplcm8oZGF0ZS5nZXRIb3VycygpLDIpKyc6JytsZWFkWmVybyhkYXRlLmdldE1pbnV0ZXMoKSwyKSsnOicrCmxlYWRaZXJvKGRhdGUuZ2V0U2Vjb25kcygpLDIpKycuJytsZWFkWmVybyhkYXRlLmdldE1pbGxpc2Vjb25kcygpLDMpO3JldHVybiBmdWxsPyh5eW1tZGQrJyAnK2hobW1zc2ZmZik6aGhtbXNzZmZmO2Z1bmN0aW9uIGxlYWRaZXJvKHZhbHVlLGxlbmd0aCl7Y29uc3QgdmFsdWVTdHJpbmc9dmFsdWUudG9TdHJpbmcoKTtjb25zdCBwYWRkaW5nPWxlbmd0aC12YWx1ZVN0cmluZy5sZW5ndGg7cmV0dXJuIHBhZGRpbmc8PTA/dmFsdWVTdHJpbmc6JzAnLnJlcGVhdChwYWRkaW5nKSt2YWx1ZVN0cmluZzt9fX0KbmVzdGluZ0xldmVsKCl7cmV0dXJuIHRoaXMuX25lc3RpbmdMZXZlbDt9CnNldEluU2ltaWxhckdyb3VwKGluU2ltaWxhckdyb3VwLGlzTGFzdCl7dGhpcy5faW5TaW1pbGFyR3JvdXA9aW5TaW1pbGFyR3JvdXA7dGhpcy5fbGFzdEluU2ltaWxhckdyb3VwPWluU2ltaWxhckdyb3VwJiYhIWlzTGFzdDtpZih0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXImJiFpblNpbWlsYXJHcm91cCl7dGhpcy5fc2ltaWxhckdyb3VwTWFya2VyLnJlbW92ZSgpO3RoaXMuX3NpbWlsYXJHcm91cE1hcmtlcj1udWxsO31lbHNlIGlmKHRoaXMuX2VsZW1lbnQmJiF0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXImJmluU2ltaWxhckdyb3VwKXt0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnbmVzdGluZy1sZXZlbC1tYXJrZXInKTt0aGlzLl9lbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXIsdGhpcy5fZWxlbWVudC5maXJzdENoaWxkKTt0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXAtY2xvc2VkJyx0aGlzLl9sYXN0SW5TaW1pbGFyR3JvdXApO319CmlzTGFzdEluU2ltaWxhckdyb3VwKCl7cmV0dXJuIHRoaXMuX2luU2ltaWxhckdyb3VwJiZ0aGlzLl9sYXN0SW5TaW1pbGFyR3JvdXA7fQpyZXNldENsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQoKXtpZighdGhpcy5fY2xvc2VHcm91cERlY29yYXRpb25Db3VudCkKcmV0dXJuO3RoaXMuX2Nsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQ9MDt0aGlzLl91cGRhdGVDbG9zZUdyb3VwRGVjb3JhdGlvbnMoKTt9CmluY3JlbWVudENsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQoKXsrK3RoaXMuX2Nsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQ7dGhpcy5fdXBkYXRlQ2xvc2VHcm91cERlY29yYXRpb25zKCk7fQpfdXBkYXRlQ2xvc2VHcm91cERlY29yYXRpb25zKCl7aWYoIXRoaXMuX25lc3RpbmdMZXZlbE1hcmtlcnMpCnJldHVybjtmb3IobGV0IGk9MCxuPXRoaXMuX25lc3RpbmdMZXZlbE1hcmtlcnMubGVuZ3RoO2k8bjsrK2kpe2NvbnN0IG1hcmtlcj10aGlzLl9uZXN0aW5nTGV2ZWxNYXJrZXJzW2ldO21hcmtlci5jbGFzc0xpc3QudG9nZ2xlKCdncm91cC1jbG9zZWQnLG4taTw9dGhpcy5fY2xvc2VHcm91cERlY29yYXRpb25Db3VudCk7fX0KY29udGVudEVsZW1lbnQoKXtpZih0aGlzLl9jb250ZW50RWxlbWVudCkKcmV0dXJuIHRoaXMuX2NvbnRlbnRFbGVtZW50O2NvbnN0IGNvbnRlbnRFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2NvbnNvbGUtbWVzc2FnZScpO2lmKHRoaXMuX21lc3NhZ2VMZXZlbEljb24pCmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX21lc3NhZ2VMZXZlbEljb24pO3RoaXMuX2NvbnRlbnRFbGVtZW50PWNvbnRlbnRFbGVtZW50O2xldCBmb3JtYXR0ZWRNZXNzYWdlO2NvbnN0IHNob3VsZEluY2x1ZGVUcmFjZT0hIXRoaXMuX21lc3NhZ2Uuc3RhY2tUcmFjZSYmKHRoaXMuX21lc3NhZ2Uuc291cmNlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuTmV0d29ya3x8dGhpcy5fbWVzc2FnZS5zb3VyY2U9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5WaW9sYXRpb258fHRoaXMuX21lc3NhZ2UubGV2ZWw9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yfHx0aGlzLl9tZXNzYWdlLmxldmVsPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nfHx0aGlzLl9tZXNzYWdlLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuVHJhY2UpO2lmKHRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkmJnNob3VsZEluY2x1ZGVUcmFjZSkKZm9ybWF0dGVkTWVzc2FnZT10aGlzLl9idWlsZE1lc3NhZ2VXaXRoU3RhY2tUcmFjZSgpO2Vsc2UgaWYodGhpcy5fbWVzc2FnZS50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlRhYmxlKQpmb3JtYXR0ZWRNZXNzYWdlPXRoaXMuX2J1aWxkVGFibGVNZXNzYWdlKCk7ZWxzZQpmb3JtYXR0ZWRNZXNzYWdlPXRoaXMuX2J1aWxkTWVzc2FnZSgpO2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGZvcm1hdHRlZE1lc3NhZ2UpO3RoaXMudXBkYXRlVGltZXN0YW1wKCk7cmV0dXJuIHRoaXMuX2NvbnRlbnRFbGVtZW50O30KdG9NZXNzYWdlRWxlbWVudCgpe2lmKHRoaXMuX2VsZW1lbnQpCnJldHVybiB0aGlzLl9lbGVtZW50O3RoaXMuX2VsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy51cGRhdGVNZXNzYWdlRWxlbWVudCgpO3JldHVybiB0aGlzLl9lbGVtZW50O30KdXBkYXRlTWVzc2FnZUVsZW1lbnQoKXtpZighdGhpcy5fZWxlbWVudCkKcmV0dXJuO3RoaXMuX2VsZW1lbnQuY2xhc3NOYW1lPSdjb25zb2xlLW1lc3NhZ2Utd3JhcHBlcic7dGhpcy5fZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2lmKHRoaXMuX21lc3NhZ2UuaXNHcm91cFN0YXJ0TWVzc2FnZSgpKQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtZ3JvdXAtdGl0bGUnKTtpZih0aGlzLl9tZXNzYWdlLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkNvbnNvbGVBUEkpCnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS1mcm9tLWFwaScpO2lmKHRoaXMuX2luU2ltaWxhckdyb3VwKXt0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXI9dGhpcy5fZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbmVzdGluZy1sZXZlbC1tYXJrZXInKTt0aGlzLl9zaW1pbGFyR3JvdXBNYXJrZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXAtY2xvc2VkJyx0aGlzLl9sYXN0SW5TaW1pbGFyR3JvdXApO30KdGhpcy5fbmVzdGluZ0xldmVsTWFya2Vycz1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX25lc3RpbmdMZXZlbDsrK2kpCnRoaXMuX25lc3RpbmdMZXZlbE1hcmtlcnMucHVzaCh0aGlzLl9lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCduZXN0aW5nLWxldmVsLW1hcmtlcicpKTt0aGlzLl91cGRhdGVDbG9zZUdyb3VwRGVjb3JhdGlvbnMoKTt0aGlzLl9lbGVtZW50Lm1lc3NhZ2U9dGhpcztzd2l0Y2godGhpcy5fbWVzc2FnZS5sZXZlbCl7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLlZlcmJvc2U6dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXZlcmJvc2UtbGV2ZWwnKTt0aGlzLl91cGRhdGVNZXNzYWdlTGV2ZWxJY29uKCcnKTticmVhaztjYXNlIFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuSW5mbzp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtaW5mby1sZXZlbCcpO2lmKHRoaXMuX21lc3NhZ2UudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5TeXN0ZW0pCnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS1zeXN0ZW0tdHlwZScpO2JyZWFrO2Nhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nOnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29uc29sZS13YXJuaW5nLWxldmVsJyk7dGhpcy5fdXBkYXRlTWVzc2FnZUxldmVsSWNvbignc21hbGxpY29uLXdhcm5pbmcnKTticmVhaztjYXNlIFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3I6dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLWVycm9yLWxldmVsJyk7dGhpcy5fdXBkYXRlTWVzc2FnZUxldmVsSWNvbignc21hbGxpY29uLWVycm9yJyk7YnJlYWs7fQppZih0aGlzLl9zaG91bGRSZW5kZXJBc1dhcm5pbmcoKSkKdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXdhcm5pbmctbGV2ZWwnKTt0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsZW1lbnQoKSk7aWYodGhpcy5fcmVwZWF0Q291bnQ+MSkKdGhpcy5fc2hvd1JlcGVhdENvdW50RWxlbWVudCgpO30KX3Nob3VsZFJlbmRlckFzV2FybmluZygpe3JldHVybih0aGlzLl9tZXNzYWdlLmxldmVsPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5WZXJib3NlfHx0aGlzLl9tZXNzYWdlLmxldmVsPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5JbmZvKSYmKHRoaXMuX21lc3NhZ2Uuc291cmNlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VTb3VyY2UuVmlvbGF0aW9ufHx0aGlzLl9tZXNzYWdlLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkRlcHJlY2F0aW9ufHx0aGlzLl9tZXNzYWdlLnNvdXJjZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkludGVydmVudGlvbnx8dGhpcy5fbWVzc2FnZS5zb3VyY2U9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5SZWNvbW1lbmRhdGlvbik7fQpfdXBkYXRlTWVzc2FnZUxldmVsSWNvbihpY29uVHlwZSl7aWYoIWljb25UeXBlJiYhdGhpcy5fbWVzc2FnZUxldmVsSWNvbikKcmV0dXJuO2lmKGljb25UeXBlJiYhdGhpcy5fbWVzc2FnZUxldmVsSWNvbil7dGhpcy5fbWVzc2FnZUxldmVsSWNvbj1VSS5JY29uLmNyZWF0ZSgnJywnbWVzc2FnZS1sZXZlbC1pY29uJyk7aWYodGhpcy5fY29udGVudEVsZW1lbnQpCnRoaXMuX2NvbnRlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9tZXNzYWdlTGV2ZWxJY29uLHRoaXMuX2NvbnRlbnRFbGVtZW50LmZpcnN0Q2hpbGQpO30KdGhpcy5fbWVzc2FnZUxldmVsSWNvbi5zZXRJY29uVHlwZShpY29uVHlwZSk7fQpyZXBlYXRDb3VudCgpe3JldHVybiB0aGlzLl9yZXBlYXRDb3VudHx8MTt9CnJlc2V0SW5jcmVtZW50UmVwZWF0Q291bnQoKXt0aGlzLl9yZXBlYXRDb3VudD0xO2lmKCF0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQpCnJldHVybjt0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQucmVtb3ZlKCk7aWYodGhpcy5fY29udGVudEVsZW1lbnQpCnRoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3JlcGVhdGVkLW1lc3NhZ2UnKTtkZWxldGUgdGhpcy5fcmVwZWF0Q291bnRFbGVtZW50O30KaW5jcmVtZW50UmVwZWF0Q291bnQoKXt0aGlzLl9yZXBlYXRDb3VudCsrO3RoaXMuX3Nob3dSZXBlYXRDb3VudEVsZW1lbnQoKTt9CnNldFJlcGVhdENvdW50KHJlcGVhdENvdW50KXt0aGlzLl9yZXBlYXRDb3VudD1yZXBlYXRDb3VudDt0aGlzLl9zaG93UmVwZWF0Q291bnRFbGVtZW50KCk7fQpfc2hvd1JlcGVhdENvdW50RWxlbWVudCgpe2lmKCF0aGlzLl9lbGVtZW50KQpyZXR1cm47aWYoIXRoaXMuX3JlcGVhdENvdW50RWxlbWVudCl7dGhpcy5fcmVwZWF0Q291bnRFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2xhYmVsJywnY29uc29sZS1tZXNzYWdlLXJlcGVhdC1jb3VudCcsJ2R0LXNtYWxsLWJ1YmJsZScpO3N3aXRjaCh0aGlzLl9tZXNzYWdlLmxldmVsKXtjYXNlIFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuV2FybmluZzp0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQudHlwZT0nd2FybmluZyc7YnJlYWs7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yOnRoaXMuX3JlcGVhdENvdW50RWxlbWVudC50eXBlPSdlcnJvcic7YnJlYWs7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLlZlcmJvc2U6dGhpcy5fcmVwZWF0Q291bnRFbGVtZW50LnR5cGU9J3ZlcmJvc2UnO2JyZWFrO2RlZmF1bHQ6dGhpcy5fcmVwZWF0Q291bnRFbGVtZW50LnR5cGU9J2luZm8nO30KaWYodGhpcy5fc2hvdWxkUmVuZGVyQXNXYXJuaW5nKCkpCnRoaXMuX3JlcGVhdENvdW50RWxlbWVudC50eXBlPSd3YXJuaW5nJzt0aGlzLl9lbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQsdGhpcy5fY29udGVudEVsZW1lbnQpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JlcGVhdGVkLW1lc3NhZ2UnKTt9CnRoaXMuX3JlcGVhdENvdW50RWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9yZXBlYXRDb3VudDt9CmdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuX21lc3NhZ2UubWVzc2FnZVRleHQ7fQp0b0V4cG9ydFN0cmluZygpe2NvbnN0IGxpbmVzPVtdO2NvbnN0IG5vZGVzPXRoaXMuY29udGVudEVsZW1lbnQoKS5jaGlsZFRleHROb2RlcygpO2NvbnN0IG1lc3NhZ2VDb250ZW50PW5vZGVzLm1hcChDb21wb25lbnRzLkxpbmtpZmllci51bnRydW5jYXRlZE5vZGVUZXh0KS5qb2luKCcnKTtmb3IobGV0IGk9MDtpPHRoaXMucmVwZWF0Q291bnQoKTsrK2kpCmxpbmVzLnB1c2gobWVzc2FnZUNvbnRlbnQpO3JldHVybiBsaW5lcy5qb2luKCdcbicpO30Kc2V0U2VhcmNoUmVnZXgocmVnZXgpe2lmKHRoaXMuX3NlYXJjaEhpZ2xpZ2h0Tm9kZUNoYW5nZXMmJnRoaXMuX3NlYXJjaEhpZ2xpZ2h0Tm9kZUNoYW5nZXMubGVuZ3RoKQpVSS5yZXZlcnREb21DaGFuZ2VzKHRoaXMuX3NlYXJjaEhpZ2xpZ2h0Tm9kZUNoYW5nZXMpO3RoaXMuX3NlYXJjaFJlZ2V4PXJlZ2V4O3RoaXMuX3NlYXJjaEhpZ2hsaWdodE5vZGVzPVtdO3RoaXMuX3NlYXJjaEhpZ2xpZ2h0Tm9kZUNoYW5nZXM9W107aWYoIXRoaXMuX3NlYXJjaFJlZ2V4KQpyZXR1cm47Y29uc3QgdGV4dD10aGlzLmNvbnRlbnRFbGVtZW50KCkuZGVlcFRleHRDb250ZW50KCk7bGV0IG1hdGNoO3RoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleD0wO2NvbnN0IHNvdXJjZVJhbmdlcz1bXTt3aGlsZSgobWF0Y2g9dGhpcy5fc2VhcmNoUmVnZXguZXhlYyh0ZXh0KSkmJm1hdGNoWzBdKQpzb3VyY2VSYW5nZXMucHVzaChuZXcgVGV4dFV0aWxzLlNvdXJjZVJhbmdlKG1hdGNoLmluZGV4LG1hdGNoWzBdLmxlbmd0aCkpO2lmKHNvdXJjZVJhbmdlcy5sZW5ndGgpe3RoaXMuX3NlYXJjaEhpZ2hsaWdodE5vZGVzPVVJLmhpZ2hsaWdodFNlYXJjaFJlc3VsdHModGhpcy5jb250ZW50RWxlbWVudCgpLHNvdXJjZVJhbmdlcyx0aGlzLl9zZWFyY2hIaWdsaWdodE5vZGVDaGFuZ2VzKTt9fQpzZWFyY2hSZWdleCgpe3JldHVybiB0aGlzLl9zZWFyY2hSZWdleDt9CnNlYXJjaENvdW50KCl7cmV0dXJuIHRoaXMuX3NlYXJjaEhpZ2hsaWdodE5vZGVzLmxlbmd0aDt9CnNlYXJjaEhpZ2hsaWdodE5vZGUoaW5kZXgpe3JldHVybiB0aGlzLl9zZWFyY2hIaWdobGlnaHROb2Rlc1tpbmRleF07fQpfdHJ5Rm9ybWF0QXNFcnJvcihzdHJpbmcpe2Z1bmN0aW9uIHN0YXJ0c1dpdGgocHJlZml4KXtyZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgocHJlZml4KTt9CmNvbnN0IGVycm9yUHJlZml4ZXM9WydFdmFsRXJyb3InLCdSZWZlcmVuY2VFcnJvcicsJ1N5bnRheEVycm9yJywnVHlwZUVycm9yJywnUmFuZ2VFcnJvcicsJ0Vycm9yJywnVVJJRXJyb3InXTtpZighdGhpcy5fbWVzc2FnZS5ydW50aW1lTW9kZWwoKXx8IWVycm9yUHJlZml4ZXMuc29tZShzdGFydHNXaXRoKSkKcmV0dXJuIG51bGw7Y29uc3QgZGVidWdnZXJNb2RlbD10aGlzLl9tZXNzYWdlLnJ1bnRpbWVNb2RlbCgpLmRlYnVnZ2VyTW9kZWwoKTtjb25zdCBiYXNlVVJMPXRoaXMuX21lc3NhZ2UucnVudGltZU1vZGVsKCkudGFyZ2V0KCkuaW5zcGVjdGVkVVJMKCk7Y29uc3QgbGluZXM9c3RyaW5nLnNwbGl0KCdcbicpO2NvbnN0IGxpbmtzPVtdO2xldCBwb3NpdGlvbj0wO2ZvcihsZXQgaT0wO2k8bGluZXMubGVuZ3RoOysraSl7cG9zaXRpb24rPWk+MD9saW5lc1tpLTFdLmxlbmd0aCsxOjA7Y29uc3QgaXNDYWxsRnJhbWVMaW5lPS9eXHMqYXRccy8udGVzdChsaW5lc1tpXSk7aWYoIWlzQ2FsbEZyYW1lTGluZSYmbGlua3MubGVuZ3RoKQpyZXR1cm4gbnVsbDtpZighaXNDYWxsRnJhbWVMaW5lKQpjb250aW51ZTtsZXQgb3BlbkJyYWNrZXRJbmRleD0tMTtsZXQgY2xvc2VCcmFja2V0SW5kZXg9LTE7Y29uc3QgbWF0Y2g9L1woW15cKVwoXStcKS8uZXhlYyhsaW5lc1tpXSk7aWYobWF0Y2gpe29wZW5CcmFja2V0SW5kZXg9bWF0Y2guaW5kZXg7Y2xvc2VCcmFja2V0SW5kZXg9bWF0Y2guaW5kZXgrbWF0Y2hbMF0ubGVuZ3RoLTE7fQpjb25zdCBoYXNPcGVuQnJhY2tldD1vcGVuQnJhY2tldEluZGV4IT09LTE7Y29uc3QgbGVmdD1oYXNPcGVuQnJhY2tldD9vcGVuQnJhY2tldEluZGV4KzE6bGluZXNbaV0uaW5kZXhPZignYXQnKSszO2NvbnN0IHJpZ2h0PWhhc09wZW5CcmFja2V0P2Nsb3NlQnJhY2tldEluZGV4OmxpbmVzW2ldLmxlbmd0aDtjb25zdCBsaW5rQ2FuZGlkYXRlPWxpbmVzW2ldLnN1YnN0cmluZyhsZWZ0LHJpZ2h0KTtjb25zdCBzcGxpdFJlc3VsdD1Db21tb24uUGFyc2VkVVJMLnNwbGl0TGluZUFuZENvbHVtbihsaW5rQ2FuZGlkYXRlKTtpZighc3BsaXRSZXN1bHQpCnJldHVybiBudWxsO2lmKHNwbGl0UmVzdWx0LnVybD09PSc8YW5vbnltb3VzPicpCmNvbnRpbnVlO2xldCB1cmw9cGFyc2VPclNjcmlwdE1hdGNoKHNwbGl0UmVzdWx0LnVybCk7aWYoIXVybCYmQ29tbW9uLlBhcnNlZFVSTC5pc1JlbGF0aXZlVVJMKHNwbGl0UmVzdWx0LnVybCkpCnVybD1wYXJzZU9yU2NyaXB0TWF0Y2goQ29tbW9uLlBhcnNlZFVSTC5jb21wbGV0ZVVSTChiYXNlVVJMLHNwbGl0UmVzdWx0LnVybCkpO2lmKCF1cmwpCnJldHVybiBudWxsO2xpbmtzLnB1c2goe3VybDp1cmwscG9zaXRpb25MZWZ0OnBvc2l0aW9uK2xlZnQscG9zaXRpb25SaWdodDpwb3NpdGlvbityaWdodCxsaW5lTnVtYmVyOnNwbGl0UmVzdWx0LmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnNwbGl0UmVzdWx0LmNvbHVtbk51bWJlcn0pO30KaWYoIWxpbmtzLmxlbmd0aCkKcmV0dXJuIG51bGw7Y29uc3QgZm9ybWF0dGVkUmVzdWx0PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtsZXQgc3RhcnQ9MDtmb3IobGV0IGk9MDtpPGxpbmtzLmxlbmd0aDsrK2kpe2Zvcm1hdHRlZFJlc3VsdC5hcHBlbmRDaGlsZChDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fbGlua2lmeVN0cmluZ0FzRnJhZ21lbnQoc3RyaW5nLnN1YnN0cmluZyhzdGFydCxsaW5rc1tpXS5wb3NpdGlvbkxlZnQpKSk7Zm9ybWF0dGVkUmVzdWx0LmFwcGVuZENoaWxkKHRoaXMuX2xpbmtpZmllci5saW5raWZ5U2NyaXB0TG9jYXRpb24oZGVidWdnZXJNb2RlbC50YXJnZXQoKSxudWxsLGxpbmtzW2ldLnVybCxsaW5rc1tpXS5saW5lTnVtYmVyLGxpbmtzW2ldLmNvbHVtbk51bWJlcikpO3N0YXJ0PWxpbmtzW2ldLnBvc2l0aW9uUmlnaHQ7fQppZihzdGFydCE9PXN0cmluZy5sZW5ndGgpCmZvcm1hdHRlZFJlc3VsdC5hcHBlbmRDaGlsZChDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fbGlua2lmeVN0cmluZ0FzRnJhZ21lbnQoc3RyaW5nLnN1YnN0cmluZyhzdGFydCkpKTtyZXR1cm4gZm9ybWF0dGVkUmVzdWx0O2Z1bmN0aW9uIHBhcnNlT3JTY3JpcHRNYXRjaCh1cmwpe2lmKCF1cmwpCnJldHVybiBudWxsO2NvbnN0IHBhcnNlZFVSTD11cmwuYXNQYXJzZWRVUkwoKTtpZihwYXJzZWRVUkwpCnJldHVybiBwYXJzZWRVUkwudXJsO2lmKGRlYnVnZ2VyTW9kZWwuc2NyaXB0c0ZvclNvdXJjZVVSTCh1cmwpLmxlbmd0aCkKcmV0dXJuIHVybDtyZXR1cm4gbnVsbDt9fQpzdGF0aWMgbGlua2lmeVdpdGhDdXN0b21MaW5raWZpZXIoc3RyaW5nLGxpbmtpZmllcil7aWYoc3RyaW5nLmxlbmd0aD5Db25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fTWF4VG9rZW5pemFibGVTdHJpbmdMZW5ndGgpCnJldHVybiBVSS5jcmVhdGVFeHBhbmRhYmxlVGV4dChzdHJpbmcsQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX0xvbmdTdHJpbmdWaXNpYmxlTGVuZ3RoKTtjb25zdCBjb250YWluZXI9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2NvbnN0IHRva2Vucz10aGlzLl90b2tlbml6ZU1lc3NhZ2VUZXh0KHN0cmluZyk7Zm9yKGNvbnN0IHRva2VuIG9mIHRva2Vucyl7c3dpdGNoKHRva2VuLnR5cGUpe2Nhc2UndXJsJzp7Y29uc3QgcmVhbFVSTD0odG9rZW4udGV4dC5zdGFydHNXaXRoKCd3d3cuJyk/J2h0dHA6Ly8nK3Rva2VuLnRleHQ6dG9rZW4udGV4dCk7Y29uc3Qgc3BsaXRSZXN1bHQ9Q29tbW9uLlBhcnNlZFVSTC5zcGxpdExpbmVBbmRDb2x1bW4ocmVhbFVSTCk7bGV0IGxpbmtOb2RlO2lmKHNwbGl0UmVzdWx0KQpsaW5rTm9kZT1saW5raWZpZXIodG9rZW4udGV4dCxzcGxpdFJlc3VsdC51cmwsc3BsaXRSZXN1bHQubGluZU51bWJlcixzcGxpdFJlc3VsdC5jb2x1bW5OdW1iZXIpO2Vsc2UKbGlua05vZGU9bGlua2lmaWVyKHRva2VuLnRleHQsdG9rZW4udmFsdWUpO2NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rTm9kZSk7YnJlYWs7fQpkZWZhdWx0OmNvbnRhaW5lci5hcHBlbmRDaGlsZChjcmVhdGVUZXh0Tm9kZSh0b2tlbi50ZXh0KSk7YnJlYWs7fX0KcmV0dXJuIGNvbnRhaW5lcjt9CnN0YXRpYyBfbGlua2lmeVN0cmluZ0FzRnJhZ21lbnQoc3RyaW5nKXtyZXR1cm4gQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UubGlua2lmeVdpdGhDdXN0b21MaW5raWZpZXIoc3RyaW5nLCh0ZXh0LHVybCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik9PntyZXR1cm4gQ29tcG9uZW50cy5MaW5raWZpZXIubGlua2lmeVVSTCh1cmwse3RleHQsbGluZU51bWJlcixjb2x1bW5OdW1iZXJ9KTt9KTt9CnN0YXRpYyBfdG9rZW5pemVNZXNzYWdlVGV4dChzdHJpbmcpe2lmKCFDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fdG9rZW5pemVyUmVnZXhlcyl7Y29uc3QgY29udHJvbENvZGVzPSdcXHUwMDAwLVxcdTAwMjBcXHUwMDdmLVxcdTAwOWYnO2NvbnN0IGxpbmtTdHJpbmdSZWdleD1uZXcgUmVnRXhwKCcoPzpbYS16QS1aXVthLXpBLVowLTkrLi1dezIsfTpcXC9cXC98ZGF0YTp8d3d3XFwuKVteXFxzJytjb250cm9sQ29kZXMrJyJdezIsfVteXFxzJytjb250cm9sQ29kZXMrJyJcJyl9XFxdLDo7LiE/XScsJ3UnKTtjb25zdCBwYXRoTGluZVJlZ2V4PS8oPzpcL1tcd1wuLV0qKStcOltcZF0rLztjb25zdCB0aW1lUmVnZXg9L3Rvb2sgW1xkXSttcy87Y29uc3QgZXZlbnRSZWdleD0vJ1x3KycgZXZlbnQvO2NvbnN0IG1pbGVzdG9uZVJlZ2V4PS9cc01bNi03XVxkLztjb25zdCBhdXRvZmlsbFJlZ2V4PS9cKHN1Z2dlc3RlZDogXCJbXHctXStcIlwpLztjb25zdCBoYW5kbGVycz1uZXcgTWFwKCk7aGFuZGxlcnMuc2V0KGxpbmtTdHJpbmdSZWdleCwndXJsJyk7aGFuZGxlcnMuc2V0KHBhdGhMaW5lUmVnZXgsJ3VybCcpO2hhbmRsZXJzLnNldCh0aW1lUmVnZXgsJ3RpbWUnKTtoYW5kbGVycy5zZXQoZXZlbnRSZWdleCwnZXZlbnQnKTtoYW5kbGVycy5zZXQobWlsZXN0b25lUmVnZXgsJ21pbGVzdG9uZScpO2hhbmRsZXJzLnNldChhdXRvZmlsbFJlZ2V4LCdhdXRvZmlsbCcpO0NvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLl90b2tlbml6ZXJSZWdleGVzPUFycmF5LmZyb20oaGFuZGxlcnMua2V5cygpKTtDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fdG9rZW5pemVyVHlwZXM9QXJyYXkuZnJvbShoYW5kbGVycy52YWx1ZXMoKSk7fQppZihzdHJpbmcubGVuZ3RoPkNvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLl9NYXhUb2tlbml6YWJsZVN0cmluZ0xlbmd0aCkKcmV0dXJuW3t0ZXh0OnN0cmluZyx0eXBlOnVuZGVmaW5lZH1dO2NvbnN0IHJlc3VsdHM9VGV4dFV0aWxzLlRleHRVdGlscy5zcGxpdFN0cmluZ0J5UmVnZXhlcyhzdHJpbmcsQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX3Rva2VuaXplclJlZ2V4ZXMpO3JldHVybiByZXN1bHRzLm1hcChyZXN1bHQ9Pih7dGV4dDpyZXN1bHQudmFsdWUsdHlwZTpDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZS5fdG9rZW5pemVyVHlwZXNbcmVzdWx0LnJlZ2V4SW5kZXhdfSkpO30KZ3JvdXBLZXkoKXtpZighdGhpcy5fZ3JvdXBLZXkpCnRoaXMuX2dyb3VwS2V5PXRoaXMuX21lc3NhZ2UuZ3JvdXBDYXRlZ29yeUtleSgpKyc6Jyt0aGlzLmdyb3VwVGl0bGUoKTtyZXR1cm4gdGhpcy5fZ3JvdXBLZXk7fQpncm91cFRpdGxlKCl7Y29uc3QgdG9rZW5zPUNvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLl90b2tlbml6ZU1lc3NhZ2VUZXh0KHRoaXMuX21lc3NhZ2UubWVzc2FnZVRleHQpO2NvbnN0IHJlc3VsdD10b2tlbnMucmVkdWNlKChhY2MsdG9rZW4pPT57bGV0IHRleHQ9dG9rZW4udGV4dDtpZih0b2tlbi50eXBlPT09J3VybCcpCnRleHQ9Q29tbW9uLlVJU3RyaW5nKCc8VVJMPicpO2Vsc2UgaWYodG9rZW4udHlwZT09PSd0aW1lJykKdGV4dD1Db21tb24uVUlTdHJpbmcoJ3Rvb2sgPE4+bXMnKTtlbHNlIGlmKHRva2VuLnR5cGU9PT0nZXZlbnQnKQp0ZXh0PUNvbW1vbi5VSVN0cmluZygnPHNvbWU+IGV2ZW50Jyk7ZWxzZSBpZih0b2tlbi50eXBlPT09J21pbGVzdG9uZScpCnRleHQ9Q29tbW9uLlVJU3RyaW5nKCcgTTxYWD4nKTtlbHNlIGlmKHRva2VuLnR5cGU9PT0nYXV0b2ZpbGwnKQp0ZXh0PUNvbW1vbi5VSVN0cmluZygnPGF0dHJpYnV0ZT4nKTtyZXR1cm4gYWNjK3RleHQ7fSwnJyk7cmV0dXJuIHJlc3VsdC5yZXBsYWNlKC9bJV1vL2csJycpO319O0NvbnNvbGUuQ29uc29sZUdyb3VwVmlld01lc3NhZ2U9Y2xhc3MgZXh0ZW5kcyBDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZXtjb25zdHJ1Y3Rvcihjb25zb2xlTWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCl7Y29uc29sZS5hc3NlcnQoY29uc29sZU1lc3NhZ2UuaXNHcm91cFN0YXJ0TWVzc2FnZSgpKTtzdXBlcihjb25zb2xlTWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCk7dGhpcy5fY29sbGFwc2VkPWNvbnNvbGVNZXNzYWdlLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuU3RhcnRHcm91cENvbGxhcHNlZDt0aGlzLl9leHBhbmRHcm91cEljb249bnVsbDt9CnNldENvbGxhcHNlZChjb2xsYXBzZWQpe3RoaXMuX2NvbGxhcHNlZD1jb2xsYXBzZWQ7aWYodGhpcy5fZXhwYW5kR3JvdXBJY29uKQp0aGlzLl9leHBhbmRHcm91cEljb24uc2V0SWNvblR5cGUodGhpcy5fY29sbGFwc2VkPydzbWFsbGljb24tdHJpYW5nbGUtcmlnaHQnOidzbWFsbGljb24tdHJpYW5nbGUtZG93bicpO30KY29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuX2NvbGxhcHNlZDt9CnRvTWVzc2FnZUVsZW1lbnQoKXtpZighdGhpcy5fZWxlbWVudCl7c3VwZXIudG9NZXNzYWdlRWxlbWVudCgpO3RoaXMuX2V4cGFuZEdyb3VwSWNvbj1VSS5JY29uLmNyZWF0ZSgnJywnZXhwYW5kLWdyb3VwLWljb24nKTtpZih0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQpCnRoaXMuX3JlcGVhdENvdW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5fZXhwYW5kR3JvdXBJY29uLHRoaXMuX3JlcGVhdENvdW50RWxlbWVudC5maXJzdENoaWxkKTtlbHNlCnRoaXMuX2VsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2V4cGFuZEdyb3VwSWNvbix0aGlzLl9jb250ZW50RWxlbWVudCk7dGhpcy5zZXRDb2xsYXBzZWQodGhpcy5fY29sbGFwc2VkKTt9CnJldHVybiB0aGlzLl9lbGVtZW50O30KX3Nob3dSZXBlYXRDb3VudEVsZW1lbnQoKXtzdXBlci5fc2hvd1JlcGVhdENvdW50RWxlbWVudCgpO2lmKHRoaXMuX3JlcGVhdENvdW50RWxlbWVudCYmdGhpcy5fZXhwYW5kR3JvdXBJY29uKQp0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2V4cGFuZEdyb3VwSWNvbix0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQuZmlyc3RDaGlsZCk7fX07Q29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuTWF4TGVuZ3RoRm9yTGlua3M9NDA7Q29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuX01heFRva2VuaXphYmxlU3RyaW5nTGVuZ3RoPTEwMDAwO0NvbnNvbGUuQ29uc29sZVZpZXdNZXNzYWdlLl9Mb25nU3RyaW5nVmlzaWJsZUxlbmd0aD01MDAwOztDb25zb2xlLkNvbnNvbGVQcm9tcHQ9Y2xhc3MgZXh0ZW5kcyBVSS5XaWRnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2FkZENvbXBsZXRpb25zRnJvbUhpc3Rvcnk9dHJ1ZTt0aGlzLl9oaXN0b3J5PW5ldyBDb25zb2xlLkNvbnNvbGVIaXN0b3J5TWFuYWdlcigpO3RoaXMuX2luaXRpYWxUZXh0PScnO3RoaXMuX2VkaXRvcj1udWxsO3RoaXMuX2lzQmVsb3dQcm9tcHRFbmFibGVkPVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdjb25zb2xlQmVsb3dQcm9tcHQnKTt0aGlzLl9lYWdlclByZXZpZXdFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2NvbnNvbGUtZWFnZXItcHJldmlldycpO3RoaXMuX3RleHRDaGFuZ2VUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMTUwKTt0aGlzLl9mb3JtYXR0ZXI9bmV3IE9iamVjdFVJLlJlbW90ZU9iamVjdFByZXZpZXdGb3JtYXR0ZXIoKTt0aGlzLl9yZXF1ZXN0UHJldmlld0JvdW5kPXRoaXMuX3JlcXVlc3RQcmV2aWV3LmJpbmQodGhpcyk7dGhpcy5faW5uZXJQcmV2aWV3RWxlbWVudD10aGlzLl9lYWdlclByZXZpZXdFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25zb2xlLWVhZ2VyLWlubmVyLXByZXZpZXcnKTt0aGlzLl9lYWdlclByZXZpZXdFbGVtZW50LmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tY29tbWFuZC1yZXN1bHQnLCdwcmV2aWV3LXJlc3VsdC1pY29uJykpO3RoaXMuX2VhZ2VyRXZhbFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ2NvbnNvbGVFYWdlckV2YWwnKTt0aGlzLl9lYWdlckV2YWxTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2VhZ2VyU2V0dGluZ0NoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5fZWFnZXJQcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCF0aGlzLl9lYWdlckV2YWxTZXR0aW5nLmdldCgpKTtjb25zdCBwaW5zRW5hYmxlZD1SdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgncGlubmVkRXhwcmVzc2lvbnMnKTtpZihwaW5zRW5hYmxlZCkKdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0PScyMHB4Jzt0aGlzLmVsZW1lbnQudGFiSW5kZXg9MDt0aGlzLl9wcmV2aWV3UmVxdWVzdEZvclRlc3Q9bnVsbDt0aGlzLl9kZWZhdWx0QXV0b2NvbXBsZXRlQ29uZmlnPW51bGw7c2VsZi5ydW50aW1lLmV4dGVuc2lvbihVSS5UZXh0RWRpdG9yRmFjdG9yeSkuaW5zdGFuY2UoKS50aGVuKGdvdEZhY3RvcnkuYmluZCh0aGlzKSk7ZnVuY3Rpb24gZ290RmFjdG9yeShmYWN0b3J5KXt0aGlzLl9lZGl0b3I9ZmFjdG9yeS5jcmVhdGVFZGl0b3Ioe2xpbmVOdW1iZXJzOmZhbHNlLGxpbmVXcmFwcGluZzp0cnVlLG1pbWVUeXBlOidqYXZhc2NyaXB0JyxhdXRvSGVpZ2h0OnRydWV9KTt0aGlzLl9kZWZhdWx0QXV0b2NvbXBsZXRlQ29uZmlnPU9iamVjdFVJLkphdmFTY3JpcHRBdXRvY29tcGxldGVDb25maWcuY3JlYXRlQ29uZmlnRm9yRWRpdG9yKHRoaXMuX2VkaXRvcik7dGhpcy5fZWRpdG9yLmNvbmZpZ3VyZUF1dG9jb21wbGV0ZShPYmplY3QuYXNzaWduKHt9LHRoaXMuX2RlZmF1bHRBdXRvY29tcGxldGVDb25maWcse3N1Z2dlc3Rpb25zQ2FsbGJhY2s6dGhpcy5fd29yZHNXaXRoUXVlcnkuYmluZCh0aGlzKSxhbmNob3JCZWhhdmlvcjp0aGlzLl9pc0JlbG93UHJvbXB0RW5hYmxlZD9VSS5HbGFzc1BhbmUuQW5jaG9yQmVoYXZpb3IuUHJlZmVyVG9wOlVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJCb3R0b219KSk7dGhpcy5fZWRpdG9yLndpZGdldCgpLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fZWRpdG9yS2V5RG93bi5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2VkaXRvci53aWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGV4dEVkaXRvci5FdmVudHMuVGV4dENoYW5nZWQsdGhpcy5fb25UZXh0Q2hhbmdlZCx0aGlzKTt0aGlzLl9lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihVSS5UZXh0RWRpdG9yLkV2ZW50cy5TdWdnZXN0aW9uQ2hhbmdlZCx0aGlzLl9vblRleHRDaGFuZ2VkLHRoaXMpO2lmKHBpbnNFbmFibGVkKXtjb25zdCBwaW5CdXR0b249dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnY29tbWFuZC1waW4tYnV0dG9uJyk7cGluQnV0dG9uLnRpdGxlPWxzYFBpbiBleHByZXNzaW9uYDtwaW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoQ29uc29sZS5Db25zb2xlUHJvbXB0LkV2ZW50cy5FeHByZXNzaW9uUGlubmVkLHRoaXMudGV4dCgpKTt9KTt9CmlmKHRoaXMuX2lzQmVsb3dQcm9tcHRFbmFibGVkKQp0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZWFnZXJQcmV2aWV3RWxlbWVudCk7dGhpcy5zZXRUZXh0KHRoaXMuX2luaXRpYWxUZXh0KTtkZWxldGUgdGhpcy5faW5pdGlhbFRleHQ7aWYodGhpcy5oYXNGb2N1cygpKQp0aGlzLmZvY3VzKCk7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTt0aGlzLl9lZGl0b3Iud2lkZ2V0KCkuZWxlbWVudC50YWJJbmRleD0tMTt0aGlzLl9lZGl0b3JTZXRGb3JUZXN0KCk7fX0KX2VhZ2VyU2V0dGluZ0NoYW5nZWQoKXtjb25zdCBlbmFibGVkPXRoaXMuX2VhZ2VyRXZhbFNldHRpbmcuZ2V0KCk7dGhpcy5fZWFnZXJQcmV2aWV3RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFlbmFibGVkKTtpZihlbmFibGVkKQp0aGlzLl9yZXF1ZXN0UHJldmlldygpO30KYmVsb3dFZGl0b3JFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VhZ2VyUHJldmlld0VsZW1lbnQ7fQpfb25UZXh0Q2hhbmdlZCgpe2lmKHRoaXMuX2lzQmVsb3dQcm9tcHRFbmFibGVkJiZ0aGlzLl9lYWdlckV2YWxTZXR0aW5nLmdldCgpKXtjb25zdCBhc1Nvb25Bc1Bvc3NpYmxlPSF0aGlzLl9lZGl0b3IudGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpO3RoaXMuX3ByZXZpZXdSZXF1ZXN0Rm9yVGVzdD10aGlzLl90ZXh0Q2hhbmdlVGhyb3R0bGVyLnNjaGVkdWxlKHRoaXMuX3JlcXVlc3RQcmV2aWV3Qm91bmQsYXNTb29uQXNQb3NzaWJsZSk7fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhDb25zb2xlLkNvbnNvbGVQcm9tcHQuRXZlbnRzLlRleHRDaGFuZ2VkKTt9CmFzeW5jIF9yZXF1ZXN0UHJldmlldygpe2NvbnN0IHRleHQ9dGhpcy5fZWRpdG9yLnRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKS50cmltKCk7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoIWV4ZWN1dGlvbkNvbnRleHR8fCF0ZXh0fHx0ZXh0Lmxlbmd0aD5Db25zb2xlLkNvbnNvbGVQcm9tcHQuX01heExlbmd0aEZvckV2YWx1YXRpb24pe3RoaXMuX2lubmVyUHJldmlld0VsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtyZXR1cm47fQpjb25zdCBvcHRpb25zPXtleHByZXNzaW9uOlNESy5SdW50aW1lTW9kZWwud3JhcE9iamVjdExpdGVyYWxFeHByZXNzaW9uSWZOZWVkZWQodGV4dCksaW5jbHVkZUNvbW1hbmRMaW5lQVBJOnRydWUsZ2VuZXJhdGVQcmV2aWV3OnRydWUsdGhyb3dPblNpZGVFZmZlY3Q6dHJ1ZSx0aW1lb3V0OjUwMH07Y29uc3QgcmVzdWx0PWF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUob3B0aW9ucyx0cnVlLGZhbHNlKTt0aGlzLl9pbm5lclByZXZpZXdFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7aWYocmVzdWx0LmVycm9yKQpyZXR1cm47aWYocmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMpe2NvbnN0IGV4Y2VwdGlvbj1yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24uZGVzY3JpcHRpb247aWYoZXhjZXB0aW9uLnN0YXJ0c1dpdGgoJ1R5cGVFcnJvcjogJykpCnRoaXMuX2lubmVyUHJldmlld0VsZW1lbnQudGV4dENvbnRlbnQ9ZXhjZXB0aW9uO3JldHVybjt9CmNvbnN0e3ByZXZpZXcsdHlwZSxzdWJ0eXBlLGRlc2NyaXB0aW9ufT1yZXN1bHQub2JqZWN0O2lmKHByZXZpZXcmJnR5cGU9PT0nb2JqZWN0JyYmc3VidHlwZSE9PSdub2RlJyl7dGhpcy5fZm9ybWF0dGVyLmFwcGVuZE9iamVjdFByZXZpZXcodGhpcy5faW5uZXJQcmV2aWV3RWxlbWVudCxwcmV2aWV3LGZhbHNlKTt9ZWxzZXtjb25zdCBub25PYmplY3RQcmV2aWV3PXRoaXMuX2Zvcm1hdHRlci5yZW5kZXJQcm9wZXJ0eVByZXZpZXcodHlwZSxzdWJ0eXBlLGRlc2NyaXB0aW9uLnRyaW1FbmQoNDAwKSk7dGhpcy5faW5uZXJQcmV2aWV3RWxlbWVudC5hcHBlbmRDaGlsZChub25PYmplY3RQcmV2aWV3KTt9CmlmKHRoaXMuX2lubmVyUHJldmlld0VsZW1lbnQuZGVlcFRleHRDb250ZW50KCk9PT10aGlzLl9lZGl0b3IudGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpLnRyaW0oKSkKdGhpcy5faW5uZXJQcmV2aWV3RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO30KaGlzdG9yeSgpe3JldHVybiB0aGlzLl9oaXN0b3J5O30KY2xlYXJBdXRvY29tcGxldGUoKXtpZih0aGlzLl9lZGl0b3IpCnRoaXMuX2VkaXRvci5jbGVhckF1dG9jb21wbGV0ZSgpO30KX2lzQ2FyZXRBdEVuZE9mUHJvbXB0KCl7cmV0dXJuISF0aGlzLl9lZGl0b3ImJnRoaXMuX2VkaXRvci5zZWxlY3Rpb24oKS5jb2xsYXBzZVRvRW5kKCkuZXF1YWwodGhpcy5fZWRpdG9yLmZ1bGxSYW5nZSgpLmNvbGxhcHNlVG9FbmQoKSk7fQptb3ZlQ2FyZXRUb0VuZE9mUHJvbXB0KCl7aWYodGhpcy5fZWRpdG9yKQp0aGlzLl9lZGl0b3Iuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKEluZmluaXR5LEluZmluaXR5KSk7fQpzZXRUZXh0KHRleHQpe2lmKHRoaXMuX2VkaXRvcikKdGhpcy5fZWRpdG9yLnNldFRleHQodGV4dCk7ZWxzZQp0aGlzLl9pbml0aWFsVGV4dD10ZXh0O3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKENvbnNvbGUuQ29uc29sZVByb21wdC5FdmVudHMuVGV4dENoYW5nZWQpO30KdGV4dCgpe3JldHVybiB0aGlzLl9lZGl0b3I/dGhpcy5fZWRpdG9yLnRleHQoKTp0aGlzLl9pbml0aWFsVGV4dDt9CnNldEFkZENvbXBsZXRpb25zRnJvbUhpc3RvcnkodmFsdWUpe3RoaXMuX2FkZENvbXBsZXRpb25zRnJvbUhpc3Rvcnk9dmFsdWU7fQpfZWRpdG9yS2V5RG93bihldmVudCl7Y29uc3Qga2V5Ym9hcmRFdmVudD0oZXZlbnQpO2xldCBuZXdUZXh0O2xldCBpc1ByZXZpb3VzO2NvbnN0IHNlbGVjdGlvbj10aGlzLl9lZGl0b3Iuc2VsZWN0aW9uKCk7Y29uc3QgY3Vyc29yWT10aGlzLl9lZGl0b3IudmlzdWFsQ29vcmRpbmF0ZXMoc2VsZWN0aW9uLmVuZExpbmUsc2VsZWN0aW9uLmVuZENvbHVtbikueTtzd2l0Y2goa2V5Ym9hcmRFdmVudC5rZXlDb2RlKXtjYXNlIFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5VcC5jb2RlOmNvbnN0IHN0YXJ0WT10aGlzLl9lZGl0b3IudmlzdWFsQ29vcmRpbmF0ZXMoMCwwKS55O2lmKGtleWJvYXJkRXZlbnQuc2hpZnRLZXl8fCFzZWxlY3Rpb24uaXNFbXB0eSgpfHxjdXJzb3JZIT09c3RhcnRZKQpicmVhaztuZXdUZXh0PXRoaXMuX2hpc3RvcnkucHJldmlvdXModGhpcy50ZXh0KCkpO2lzUHJldmlvdXM9dHJ1ZTticmVhaztjYXNlIFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Eb3duLmNvZGU6Y29uc3QgZnVsbFJhbmdlPXRoaXMuX2VkaXRvci5mdWxsUmFuZ2UoKTtjb25zdCBlbmRZPXRoaXMuX2VkaXRvci52aXN1YWxDb29yZGluYXRlcyhmdWxsUmFuZ2UuZW5kTGluZSxmdWxsUmFuZ2UuZW5kQ29sdW1uKS55O2lmKGtleWJvYXJkRXZlbnQuc2hpZnRLZXl8fCFzZWxlY3Rpb24uaXNFbXB0eSgpfHxjdXJzb3JZIT09ZW5kWSkKYnJlYWs7bmV3VGV4dD10aGlzLl9oaXN0b3J5Lm5leHQoKTticmVhaztjYXNlIFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5QLmNvZGU6aWYoSG9zdC5pc01hYygpJiZrZXlib2FyZEV2ZW50LmN0cmxLZXkmJiFrZXlib2FyZEV2ZW50Lm1ldGFLZXkmJiFrZXlib2FyZEV2ZW50LmFsdEtleSYmIWtleWJvYXJkRXZlbnQuc2hpZnRLZXkpe25ld1RleHQ9dGhpcy5faGlzdG9yeS5wcmV2aW91cyh0aGlzLnRleHQoKSk7aXNQcmV2aW91cz10cnVlO30KYnJlYWs7Y2FzZSBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuTi5jb2RlOmlmKEhvc3QuaXNNYWMoKSYma2V5Ym9hcmRFdmVudC5jdHJsS2V5JiYha2V5Ym9hcmRFdmVudC5tZXRhS2V5JiYha2V5Ym9hcmRFdmVudC5hbHRLZXkmJiFrZXlib2FyZEV2ZW50LnNoaWZ0S2V5KQpuZXdUZXh0PXRoaXMuX2hpc3RvcnkubmV4dCgpO2JyZWFrO2Nhc2UgVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVudGVyLmNvZGU6dGhpcy5fZW50ZXJLZXlQcmVzc2VkKGtleWJvYXJkRXZlbnQpO2JyZWFrO2Nhc2UgVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlRhYi5jb2RlOmlmKCF0aGlzLnRleHQoKSkKa2V5Ym9hcmRFdmVudC5jb25zdW1lKCk7YnJlYWs7fQppZihuZXdUZXh0PT09dW5kZWZpbmVkKQpyZXR1cm47a2V5Ym9hcmRFdmVudC5jb25zdW1lKHRydWUpO3RoaXMuc2V0VGV4dChuZXdUZXh0KTtpZihpc1ByZXZpb3VzKQp0aGlzLl9lZGl0b3Iuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKDAsSW5maW5pdHkpKTtlbHNlCnRoaXMubW92ZUNhcmV0VG9FbmRPZlByb21wdCgpO30KYXN5bmMgX2VudGVyS2V5UHJlc3NlZChldmVudCl7aWYoZXZlbnQuYWx0S2V5fHxldmVudC5jdHJsS2V5fHxldmVudC5zaGlmdEtleSkKcmV0dXJuO2V2ZW50LmNvbnN1bWUodHJ1ZSk7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO2NvbnN0IHN0cj10aGlzLnRleHQoKTtpZighc3RyLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGN1cnJlbnRFeGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighdGhpcy5faXNDYXJldEF0RW5kT2ZQcm9tcHQoKXx8IWN1cnJlbnRFeGVjdXRpb25Db250ZXh0KXt0aGlzLl9hcHBlbmRDb21tYW5kKHN0cix0cnVlKTtyZXR1cm47fQpjb25zdCByZXN1bHQ9YXdhaXQgY3VycmVudEV4ZWN1dGlvbkNvbnRleHQucnVudGltZU1vZGVsLmNvbXBpbGVTY3JpcHQoc3RyLCcnLGZhbHNlLGN1cnJlbnRFeGVjdXRpb25Db250ZXh0LmlkKTtpZihzdHIhPT10aGlzLnRleHQoKSkKcmV0dXJuO2NvbnN0IGV4Y2VwdGlvbkRldGFpbHM9cmVzdWx0LmV4Y2VwdGlvbkRldGFpbHM7aWYoZXhjZXB0aW9uRGV0YWlscyYmKGV4Y2VwdGlvbkRldGFpbHMuZXhjZXB0aW9uLmRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1N5bnRheEVycm9yOiBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpfHxleGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbi5kZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdTeW50YXhFcnJvcjogVW50ZXJtaW5hdGVkIHRlbXBsYXRlIGxpdGVyYWwnKSkpe3RoaXMuX2VkaXRvci5uZXdsaW5lQW5kSW5kZW50KCk7dGhpcy5fZW50ZXJQcm9jZXNzZWRGb3JUZXN0KCk7cmV0dXJuO30KYXdhaXQgdGhpcy5fYXBwZW5kQ29tbWFuZChzdHIsdHJ1ZSk7dGhpcy5fZW50ZXJQcm9jZXNzZWRGb3JUZXN0KCk7fQphc3luYyBfYXBwZW5kQ29tbWFuZCh0ZXh0LHVzZUNvbW1hbmRMaW5lQVBJKXt0aGlzLnNldFRleHQoJycpO2NvbnN0IGN1cnJlbnRFeGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZihjdXJyZW50RXhlY3V0aW9uQ29udGV4dCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1jdXJyZW50RXhlY3V0aW9uQ29udGV4dDtjb25zdCBtZXNzYWdlPVNESy5jb25zb2xlTW9kZWwuYWRkQ29tbWFuZE1lc3NhZ2UoZXhlY3V0aW9uQ29udGV4dCx0ZXh0KTt0ZXh0PVNESy5SdW50aW1lTW9kZWwud3JhcE9iamVjdExpdGVyYWxFeHByZXNzaW9uSWZOZWVkZWQodGV4dCk7bGV0IHByZXByb2Nlc3NlZD1mYWxzZTtpZih0ZXh0LmluZGV4T2YoJ2F3YWl0JykhPT0tMSl7Y29uc3QgcHJlcHJvY2Vzc2VkVGV4dD1hd2FpdCBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLnByZXByb2Nlc3NUb3BMZXZlbEF3YWl0RXhwcmVzc2lvbnModGV4dCk7cHJlcHJvY2Vzc2VkPSEhcHJlcHJvY2Vzc2VkVGV4dDt0ZXh0PXByZXByb2Nlc3NlZFRleHR8fHRleHQ7fQpTREsuY29uc29sZU1vZGVsLmV2YWx1YXRlQ29tbWFuZEluQ29uc29sZShleGVjdXRpb25Db250ZXh0LG1lc3NhZ2UsdGV4dCx1c2VDb21tYW5kTGluZUFQSSxwcmVwcm9jZXNzZWQpO2lmKENvbnNvbGUuQ29uc29sZVBhbmVsLmluc3RhbmNlKCkuaXNTaG93aW5nKCkpCkhvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQ29tbWFuZEV2YWx1YXRlZEluQ29uc29sZVBhbmVsKTt9fQpfZW50ZXJQcm9jZXNzZWRGb3JUZXN0KCl7fQpfaGlzdG9yeUNvbXBsZXRpb25zKHByZWZpeCxmb3JjZSl7Y29uc3QgdGV4dD10aGlzLnRleHQoKTtpZighdGhpcy5fYWRkQ29tcGxldGlvbnNGcm9tSGlzdG9yeXx8IXRoaXMuX2lzQ2FyZXRBdEVuZE9mUHJvbXB0KCl8fCghdGV4dCYmIWZvcmNlKSkKcmV0dXJuW107Y29uc3QgcmVzdWx0PVtdO2NvbnN0IHNldD1uZXcgU2V0KCk7Y29uc3QgZGF0YT10aGlzLl9oaXN0b3J5Lmhpc3RvcnlEYXRhKCk7Zm9yKGxldCBpPWRhdGEubGVuZ3RoLTE7aT49MCYmcmVzdWx0Lmxlbmd0aDw1MDstLWkpe2NvbnN0IGl0ZW09ZGF0YVtpXTtpZighaXRlbS5zdGFydHNXaXRoKHRleHQpKQpjb250aW51ZTtpZihzZXQuaGFzKGl0ZW0pKQpjb250aW51ZTtzZXQuYWRkKGl0ZW0pO3Jlc3VsdC5wdXNoKHt0ZXh0Oml0ZW0uc3Vic3RyaW5nKHRleHQubGVuZ3RoLXByZWZpeC5sZW5ndGgpLGljb25UeXBlOidzbWFsbGljb24tdGV4dC1wcm9tcHQnLGlzU2Vjb25kYXJ5OnRydWV9KTt9CnJldHVybiByZXN1bHQ7fQpmb2N1cygpe2lmKHRoaXMuX2VkaXRvcikKdGhpcy5fZWRpdG9yLndpZGdldCgpLmZvY3VzKCk7ZWxzZQp0aGlzLmVsZW1lbnQuZm9jdXMoKTt9CmFzeW5jIF93b3Jkc1dpdGhRdWVyeShxdWVyeVJhbmdlLHN1YnN0aXR1dGVSYW5nZSxmb3JjZSl7Y29uc3QgcXVlcnk9dGhpcy5fZWRpdG9yLnRleHQocXVlcnlSYW5nZSk7Y29uc3Qgd29yZHM9YXdhaXQgdGhpcy5fZGVmYXVsdEF1dG9jb21wbGV0ZUNvbmZpZy5zdWdnZXN0aW9uc0NhbGxiYWNrKHF1ZXJ5UmFuZ2Usc3Vic3RpdHV0ZVJhbmdlLGZvcmNlKTtjb25zdCBoaXN0b3J5V29yZHM9dGhpcy5faGlzdG9yeUNvbXBsZXRpb25zKHF1ZXJ5LGZvcmNlKTtyZXR1cm4gd29yZHMuY29uY2F0KGhpc3RvcnlXb3Jkcyk7fQpfZWRpdG9yU2V0Rm9yVGVzdCgpe319O0NvbnNvbGUuQ29uc29sZVByb21wdC5fTWF4TGVuZ3RoRm9yRXZhbHVhdGlvbj0yMDAwO0NvbnNvbGUuQ29uc29sZUhpc3RvcnlNYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1bXTt0aGlzLl9oaXN0b3J5T2Zmc2V0PTE7fQpoaXN0b3J5RGF0YSgpe3JldHVybiB0aGlzLl9kYXRhO30Kc2V0SGlzdG9yeURhdGEoZGF0YSl7dGhpcy5fZGF0YT1kYXRhLnNsaWNlKCk7dGhpcy5faGlzdG9yeU9mZnNldD0xO30KcHVzaEhpc3RvcnlJdGVtKHRleHQpe2lmKHRoaXMuX3VuY29tbWl0dGVkSXNUb3Ape3RoaXMuX2RhdGEucG9wKCk7ZGVsZXRlIHRoaXMuX3VuY29tbWl0dGVkSXNUb3A7fQp0aGlzLl9oaXN0b3J5T2Zmc2V0PTE7aWYodGV4dD09PXRoaXMuX2N1cnJlbnRIaXN0b3J5SXRlbSgpKQpyZXR1cm47dGhpcy5fZGF0YS5wdXNoKHRleHQpO30KX3B1c2hDdXJyZW50VGV4dChjdXJyZW50VGV4dCl7aWYodGhpcy5fdW5jb21taXR0ZWRJc1RvcCkKdGhpcy5fZGF0YS5wb3AoKTt0aGlzLl91bmNvbW1pdHRlZElzVG9wPXRydWU7dGhpcy5fZGF0YS5wdXNoKGN1cnJlbnRUZXh0KTt9CnByZXZpb3VzKGN1cnJlbnRUZXh0KXtpZih0aGlzLl9oaXN0b3J5T2Zmc2V0PnRoaXMuX2RhdGEubGVuZ3RoKQpyZXR1cm4gdW5kZWZpbmVkO2lmKHRoaXMuX2hpc3RvcnlPZmZzZXQ9PT0xKQp0aGlzLl9wdXNoQ3VycmVudFRleHQoY3VycmVudFRleHQpOysrdGhpcy5faGlzdG9yeU9mZnNldDtyZXR1cm4gdGhpcy5fY3VycmVudEhpc3RvcnlJdGVtKCk7fQpuZXh0KCl7aWYodGhpcy5faGlzdG9yeU9mZnNldD09PTEpCnJldHVybiB1bmRlZmluZWQ7LS10aGlzLl9oaXN0b3J5T2Zmc2V0O3JldHVybiB0aGlzLl9jdXJyZW50SGlzdG9yeUl0ZW0oKTt9Cl9jdXJyZW50SGlzdG9yeUl0ZW0oKXtyZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aC10aGlzLl9oaXN0b3J5T2Zmc2V0XTt9fTtDb25zb2xlLkNvbnNvbGVQcm9tcHQuRXZlbnRzPXtFeHByZXNzaW9uUGlubmVkOlN5bWJvbCgnRXhwcmVzc2lvblBpbm5lZCcpLFRleHRDaGFuZ2VkOlN5bWJvbCgnVGV4dENoYW5nZWQnKX07O0NvbnNvbGUuQ29uc29sZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLnNldE1pbmltdW1TaXplKDAsMzUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnY29uc29sZS9jb25zb2xlVmlldy5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ29iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MnKTt0aGlzLl9zZWFyY2hhYmxlVmlldz1uZXcgVUkuU2VhcmNoYWJsZVZpZXcodGhpcyk7dGhpcy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXNlYXJjaGFibGUtdmlldycpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNldFBsYWNlaG9sZGVyKENvbW1vbi5VSVN0cmluZygnRmluZCBzdHJpbmcgaW4gbG9ncycpKTt0aGlzLl9zZWFyY2hhYmxlVmlldy5zZXRNaW5pbWFsU2VhcmNoUXVlcnlTaXplKDApO3RoaXMuX2JhZGdlUG9vbD1uZXcgUHJvZHVjdFJlZ2lzdHJ5LkJhZGdlUG9vbCgpO3RoaXMuX3NpZGViYXI9bmV3IENvbnNvbGUuQ29uc29sZVNpZGViYXIodGhpcy5fYmFkZ2VQb29sKTt0aGlzLl9zaWRlYmFyLmFkZEV2ZW50TGlzdGVuZXIoQ29uc29sZS5Db25zb2xlU2lkZWJhci5FdmVudHMuRmlsdGVyU2VsZWN0ZWQsdGhpcy5fb25GaWx0ZXJDaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuX2lzU2lkZWJhck9wZW49ZmFsc2U7dGhpcy5fZmlsdGVyPW5ldyBDb25zb2xlLkNvbnNvbGVWaWV3RmlsdGVyKHRoaXMuX29uRmlsdGVyQ2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl9pc0JlbG93UHJvbXB0RW5hYmxlZD1SdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgnY29uc29sZUJlbG93UHJvbXB0Jyk7Y29uc3QgY29uc29sZVRvb2xiYXJDb250YWluZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjb25zb2xlLXRvb2xiYXItY29udGFpbmVyJyk7dGhpcy5fc3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KHRydWUsZmFsc2UsJ2NvbnNvbGUuc2lkZWJhci53aWR0aCcsMTAwKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX3NlYXJjaGFibGVWaWV3KTt0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuX3NpZGViYXIpO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9zcGxpdFdpZGdldC5oaWRlU2lkZWJhcigpO3RoaXMuX3NwbGl0V2lkZ2V0LmVuYWJsZVNob3dNb2RlU2F2aW5nKCk7dGhpcy5faXNTaWRlYmFyT3Blbj10aGlzLl9zcGxpdFdpZGdldC5zaG93TW9kZSgpPT09VUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuQm90aDtpZih0aGlzLl9pc1NpZGViYXJPcGVuKQp0aGlzLl9maWx0ZXIuX2xldmVsTWVudUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9zcGxpdFdpZGdldC5hZGRFdmVudExpc3RlbmVyKFVJLlNwbGl0V2lkZ2V0LkV2ZW50cy5TaG93TW9kZUNoYW5nZWQsZXZlbnQ9Pnt0aGlzLl9pc1NpZGViYXJPcGVuPWV2ZW50LmRhdGE9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Cb3RoO3RoaXMuX2ZpbHRlci5fbGV2ZWxNZW51QnV0dG9uLnNldEVuYWJsZWQoIXRoaXMuX2lzU2lkZWJhck9wZW4pO3RoaXMuX29uRmlsdGVyQ2hhbmdlZCgpO30pO3RoaXMuX2NvbnRlbnRzRWxlbWVudD10aGlzLl9zZWFyY2hhYmxlVmlldy5lbGVtZW50O3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXZpZXcnKTt0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzPVtdO3RoaXMuX2hpZGRlbkJ5RmlsdGVyQ291bnQ9MDt0aGlzLl9zaG91bGRCZUhpZGRlbkNhY2hlPW5ldyBTZXQoKTt0aGlzLl9ncm91cGFibGVNZXNzYWdlcz1uZXcgTWFwKCk7dGhpcy5fZ3JvdXBhYmxlTWVzc2FnZVRpdGxlPW5ldyBNYXAoKTt0aGlzLl9yZWdleE1hdGNoUmFuZ2VzPVtdO3RoaXMuX2NvbnNvbGVDb250ZXh0U2VsZWN0b3I9bmV3IENvbnNvbGUuQ29uc29sZUNvbnRleHRTZWxlY3RvcigpO3RoaXMuX2ZpbHRlclN0YXR1c1RleHQ9bmV3IFVJLlRvb2xiYXJUZXh0KCk7dGhpcy5fZmlsdGVyU3RhdHVzVGV4dC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RpbW1lZCcpO3RoaXMuX3Nob3dTZXR0aW5nc1BhbmVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdjb25zb2xlU2hvd1NldHRpbmdzVG9vbGJhcicsZmFsc2UpO3RoaXMuX3Nob3dTZXR0aW5nc1BhbmVCdXR0b249bmV3IFVJLlRvb2xiYXJTZXR0aW5nVG9nZ2xlKHRoaXMuX3Nob3dTZXR0aW5nc1BhbmVTZXR0aW5nLCdsYXJnZWljb24tc2V0dGluZ3MtZ2VhcicsQ29tbW9uLlVJU3RyaW5nKCdDb25zb2xlIHNldHRpbmdzJykpO3RoaXMuX3Byb2dyZXNzVG9vbGJhckl0ZW09bmV3IFVJLlRvb2xiYXJJdGVtKGNyZWF0ZUVsZW1lbnQoJ2RpdicpKTt0aGlzLl9ncm91cFNpbWlsYXJTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdjb25zb2xlR3JvdXBTaW1pbGFyJyk7dGhpcy5fZ3JvdXBTaW1pbGFyU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+dGhpcy5fdXBkYXRlTWVzc2FnZUxpc3QoKSk7Y29uc3QgZ3JvdXBTaW1pbGFyVG9nZ2xlPW5ldyBVSS5Ub29sYmFyU2V0dGluZ0NoZWNrYm94KHRoaXMuX2dyb3VwU2ltaWxhclNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdHcm91cCBzaW1pbGFyJykpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ2NvbnNvbGUtbWFpbi10b29sYmFyJyxjb25zb2xlVG9vbGJhckNvbnRhaW5lcik7Y29uc3QgcmlnaHRUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLGNvbnNvbGVUb29sYmFyQ29udGFpbmVyKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3NwbGl0V2lkZ2V0LmNyZWF0ZVNob3dIaWRlU2lkZWJhckJ1dHRvbignY29uc29sZSBzaWRlYmFyJykpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24oKFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignY29uc29sZS5jbGVhcicpKSkpO3Rvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jb25zb2xlQ29udGV4dFNlbGVjdG9yLnRvb2xiYXJJdGVtKCkpO3Rvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9maWx0ZXIuX3RleHRGaWx0ZXJVSSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9maWx0ZXIuX2xldmVsTWVudUJ1dHRvbik7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShncm91cFNpbWlsYXJUb2dnbGUpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcHJvZ3Jlc3NUb29sYmFySXRlbSk7cmlnaHRUb29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3JpZ2h0VG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9maWx0ZXJTdGF0dXNUZXh0KTtyaWdodFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fc2hvd1NldHRpbmdzUGFuZUJ1dHRvbik7dGhpcy5fcHJlc2VydmVMb2dDaGVja2JveD1uZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveChDb21tb24ubW9kdWxlU2V0dGluZygncHJlc2VydmVDb25zb2xlTG9nJyksQ29tbW9uLlVJU3RyaW5nKCdEbyBub3QgY2xlYXIgbG9nIG9uIHBhZ2UgcmVsb2FkIC8gbmF2aWdhdGlvbicpLENvbW1vbi5VSVN0cmluZygnUHJlc2VydmUgbG9nJykpO3RoaXMuX2hpZGVOZXR3b3JrTWVzc2FnZXNDaGVja2JveD1uZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveCh0aGlzLl9maWx0ZXIuX2hpZGVOZXR3b3JrTWVzc2FnZXNTZXR0aW5nLHRoaXMuX2ZpbHRlci5faGlkZU5ldHdvcmtNZXNzYWdlc1NldHRpbmcudGl0bGUoKSxDb21tb24uVUlTdHJpbmcoJ0hpZGUgbmV0d29yaycpKTtjb25zdCBmaWx0ZXJCeUV4ZWN1dGlvbkNvbnRleHRDaGVja2JveD1uZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveCh0aGlzLl9maWx0ZXIuX2ZpbHRlckJ5RXhlY3V0aW9uQ29udGV4dFNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdPbmx5IHNob3cgbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0ICh0b3AsIGlmcmFtZSwgd29ya2VyLCBleHRlbnNpb24pJyksQ29tbW9uLlVJU3RyaW5nKCdTZWxlY3RlZCBjb250ZXh0IG9ubHknKSk7Y29uc3QgbW9uaXRvcmluZ1hIUkVuYWJsZWRTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdtb25pdG9yaW5nWEhSRW5hYmxlZCcpO3RoaXMuX3RpbWVzdGFtcHNTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdjb25zb2xlVGltZXN0YW1wc0VuYWJsZWQnKTt0aGlzLl9jb25zb2xlSGlzdG9yeUF1dG9jb21wbGV0ZVNldHRpbmc9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2NvbnNvbGVIaXN0b3J5QXV0b2NvbXBsZXRlJyk7Y29uc3Qgc2V0dGluZ3NQYW5lPW5ldyBVSS5IQm94KCk7c2V0dGluZ3NQYW5lLnNob3codGhpcy5fY29udGVudHNFbGVtZW50KTtzZXR0aW5nc1BhbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXNldHRpbmdzLXBhbmUnKTtjb25zdCBzZXR0aW5nc1Rvb2xiYXJMZWZ0PW5ldyBVSS5Ub29sYmFyKCcnLHNldHRpbmdzUGFuZS5lbGVtZW50KTtzZXR0aW5nc1Rvb2xiYXJMZWZ0Lm1ha2VWZXJ0aWNhbCgpO3NldHRpbmdzVG9vbGJhckxlZnQuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5faGlkZU5ldHdvcmtNZXNzYWdlc0NoZWNrYm94KTtzZXR0aW5nc1Rvb2xiYXJMZWZ0LmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3ByZXNlcnZlTG9nQ2hlY2tib3gpO3NldHRpbmdzVG9vbGJhckxlZnQuYXBwZW5kVG9vbGJhckl0ZW0oZmlsdGVyQnlFeGVjdXRpb25Db250ZXh0Q2hlY2tib3gpO2NvbnN0IHNldHRpbmdzVG9vbGJhclJpZ2h0PW5ldyBVSS5Ub29sYmFyKCcnLHNldHRpbmdzUGFuZS5lbGVtZW50KTtzZXR0aW5nc1Rvb2xiYXJSaWdodC5tYWtlVmVydGljYWwoKTtzZXR0aW5nc1Rvb2xiYXJSaWdodC5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveChtb25pdG9yaW5nWEhSRW5hYmxlZFNldHRpbmcpKTtpZih0aGlzLl9pc0JlbG93UHJvbXB0RW5hYmxlZCl7Y29uc3QgZWFnZXJFdmFsQ2hlY2tib3g9bmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3goQ29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ2NvbnNvbGVFYWdlckV2YWwnKSxsc2BFYWdlcmx5IGV2YWx1YXRlIHRleHQgaW4gdGhlIHByb21wdGApO3NldHRpbmdzVG9vbGJhclJpZ2h0LmFwcGVuZFRvb2xiYXJJdGVtKGVhZ2VyRXZhbENoZWNrYm94KTt9ZWxzZXtzZXR0aW5nc1Rvb2xiYXJSaWdodC5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveCh0aGlzLl90aW1lc3RhbXBzU2V0dGluZykpO30Kc2V0dGluZ3NUb29sYmFyUmlnaHQuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3godGhpcy5fY29uc29sZUhpc3RvcnlBdXRvY29tcGxldGVTZXR0aW5nKSk7aWYoIXRoaXMuX3Nob3dTZXR0aW5nc1BhbmVTZXR0aW5nLmdldCgpKQpzZXR0aW5nc1BhbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0aGlzLl9zaG93U2V0dGluZ3NQYW5lU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+c2V0dGluZ3NQYW5lLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdGhpcy5fc2hvd1NldHRpbmdzUGFuZVNldHRpbmcuZ2V0KCkpKTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgncGlubmVkRXhwcmVzc2lvbnMnKSl7dGhpcy5fcGluUGFuZT1uZXcgQ29uc29sZS5Db25zb2xlUGluUGFuZSgpO3RoaXMuX3BpblBhbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLXZpZXctcGlucGFuZScpO3RoaXMuX3BpblBhbmUuc2hvdyh0aGlzLl9jb250ZW50c0VsZW1lbnQpO30KdGhpcy5fdmlld3BvcnQ9bmV3IENvbnNvbGUuQ29uc29sZVZpZXdwb3J0KHRoaXMpO3RoaXMuX3ZpZXdwb3J0LnNldFN0aWNrVG9Cb3R0b20odHJ1ZSk7dGhpcy5fdmlld3BvcnQuY29udGVudEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCdjb25zb2xlLWdyb3VwJywnY29uc29sZS1ncm91cC1tZXNzYWdlcycpO3RoaXMuX2NvbnRlbnRzRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl92aWV3cG9ydC5lbGVtZW50KTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQ9dGhpcy5fdmlld3BvcnQuZWxlbWVudDt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuaWQ9J2NvbnNvbGUtbWVzc2FnZXMnO3RoaXMuX21lc3NhZ2VzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtb25vc3BhY2UnKTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX21lc3NhZ2VzQ2xpY2tlZC5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX21lc3NhZ2VzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsdGhpcy5fbWVzc2FnZXNQYXN0ZWQuYmluZCh0aGlzKSx0cnVlKTt0aGlzLl92aWV3cG9ydFRocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcig1MCk7dGhpcy5fdG9wR3JvdXA9Q29uc29sZS5Db25zb2xlR3JvdXAuY3JlYXRlVG9wR3JvdXAoKTt0aGlzLl9jdXJyZW50R3JvdXA9dGhpcy5fdG9wR3JvdXA7dGhpcy5fcHJvbXB0RWxlbWVudD10aGlzLl9tZXNzYWdlc0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NvdXJjZS1jb2RlJyk7Y29uc3QgcHJvbXB0SWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXRleHQtcHJvbXB0JywnY29uc29sZS1wcm9tcHQtaWNvbicpO3RoaXMuX3Byb21wdEVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvbXB0SWNvbik7dGhpcy5fcHJvbXB0RWxlbWVudC5pZD0nY29uc29sZS1wcm9tcHQnO2NvbnN0IHNlbGVjdEFsbEZpeGVyPXRoaXMuX21lc3NhZ2VzRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY29uc29sZS12aWV3LWZpeC1zZWxlY3QtYWxsJyk7c2VsZWN0QWxsRml4ZXIudGV4dENvbnRlbnQ9Jy4nO3RoaXMuX3JlZ2lzdGVyU2hvcnRjdXRzKCk7dGhpcy5fbWVzc2FnZXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9oYW5kbGVDb250ZXh0TWVudUV2ZW50LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2UuTWF4TGVuZ3RoRm9yTGlua3MpO3RoaXMuX2NvbnNvbGVNZXNzYWdlcz1bXTt0aGlzLl92aWV3TWVzc2FnZVN5bWJvbD1TeW1ib2woJ3ZpZXdNZXNzYWdlJyk7dGhpcy5fY29uc29sZUhpc3RvcnlTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ2NvbnNvbGVIaXN0b3J5JyxbXSk7dGhpcy5fcHJvbXB0PW5ldyBDb25zb2xlLkNvbnNvbGVQcm9tcHQoKTt0aGlzLl9wcm9tcHQuc2hvdyh0aGlzLl9wcm9tcHRFbGVtZW50KTt0aGlzLl9wcm9tcHQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9wcm9tcHRLZXlEb3duLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fcHJvbXB0LmFkZEV2ZW50TGlzdGVuZXIoQ29uc29sZS5Db25zb2xlUHJvbXB0LkV2ZW50cy5FeHByZXNzaW9uUGlubmVkLHRoaXMuX3Byb21wdEV4cHJlc3Npb25QaW5uZWQsdGhpcyk7dGhpcy5fcHJvbXB0LmFkZEV2ZW50TGlzdGVuZXIoQ29uc29sZS5Db25zb2xlUHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCx0aGlzLl9wcm9tcHRUZXh0Q2hhbmdlZCx0aGlzKTt0aGlzLl9jb25zb2xlSGlzdG9yeUF1dG9jb21wbGV0ZVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fY29uc29sZUhpc3RvcnlBdXRvY29tcGxldGVDaGFuZ2VkLHRoaXMpO2NvbnN0IGhpc3RvcnlEYXRhPXRoaXMuX2NvbnNvbGVIaXN0b3J5U2V0dGluZy5nZXQoKTt0aGlzLl9wcm9tcHQuaGlzdG9yeSgpLnNldEhpc3RvcnlEYXRhKGhpc3RvcnlEYXRhKTt0aGlzLl9jb25zb2xlSGlzdG9yeUF1dG9jb21wbGV0ZUNoYW5nZWQoKTt0aGlzLl91cGRhdGVGaWx0ZXJTdGF0dXMoKTt0aGlzLl90aW1lc3RhbXBzU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9jb25zb2xlVGltZXN0YW1wc1NldHRpbmdDaGFuZ2VkLHRoaXMpO3RoaXMuX3JlZ2lzdGVyV2l0aE1lc3NhZ2VTaW5rKCk7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRXhlY3V0aW9uQ29udGV4dCx0aGlzLl9leGVjdXRpb25Db250ZXh0Q2hhbmdlZCx0aGlzKTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxldmVudD0+dGhpcy5fdXBkYXRlU3RpY2tUb0JvdHRvbU9uTW91c2VEb3duKGV2ZW50LmJ1dHRvbj09PTIpLGZhbHNlKTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fdXBkYXRlU3RpY2tUb0JvdHRvbU9uTW91c2VVcC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsdGhpcy5fdXBkYXRlU3RpY2tUb0JvdHRvbU9uTW91c2VVcC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9tZXNzYWdlc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLHRoaXMuX3VwZGF0ZVN0aWNrVG9Cb3R0b21PbldoZWVsLmJpbmQodGhpcyksZmFsc2UpO1NESy5jb25zb2xlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5Db25zb2xlQ2xlYXJlZCx0aGlzLl9jb25zb2xlQ2xlYXJlZCx0aGlzKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLHRoaXMuX29uQ29uc29sZU1lc3NhZ2VBZGRlZCx0aGlzKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZVVwZGF0ZWQsdGhpcy5fb25Db25zb2xlTWVzc2FnZVVwZGF0ZWQsdGhpcyk7U0RLLmNvbnNvbGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLkNvbW1hbmRFdmFsdWF0ZWQsdGhpcy5fY29tbWFuZEV2YWx1YXRlZCx0aGlzKTtTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCkuZm9yRWFjaCh0aGlzLl9hZGRDb25zb2xlTWVzc2FnZSx0aGlzKTt9CnN0YXRpYyBpbnN0YW5jZSgpe2lmKCFDb25zb2xlLkNvbnNvbGVWaWV3Ll9pbnN0YW5jZSkKQ29uc29sZS5Db25zb2xlVmlldy5faW5zdGFuY2U9bmV3IENvbnNvbGUuQ29uc29sZVZpZXcoKTtyZXR1cm4gQ29uc29sZS5Db25zb2xlVmlldy5faW5zdGFuY2U7fQpzdGF0aWMgY2xlYXJDb25zb2xlKCl7U0RLLmNvbnNvbGVNb2RlbC5yZXF1ZXN0Q2xlYXJNZXNzYWdlcygpO30KX29uRmlsdGVyQ2hhbmdlZCgpe3RoaXMuX2ZpbHRlci5fY3VycmVudEZpbHRlci5sZXZlbHNNYXNrPXRoaXMuX2lzU2lkZWJhck9wZW4/Q29uc29sZS5Db25zb2xlRmlsdGVyLmFsbExldmVsc0ZpbHRlclZhbHVlKCk6dGhpcy5fZmlsdGVyLl9tZXNzYWdlTGV2ZWxGaWx0ZXJzU2V0dGluZy5nZXQoKTt0aGlzLl9jYW5jZWxCdWlsZEhpZGRlbkNhY2hlKCk7aWYodGhpcy5faW1tZWRpYXRlbHlGaWx0ZXJNZXNzYWdlc0ZvclRlc3Qpe2Zvcihjb25zdCB2aWV3TWVzc2FnZSBvZiB0aGlzLl9jb25zb2xlTWVzc2FnZXMpCnRoaXMuX2NvbXB1dGVTaG91bGRNZXNzYWdlQmVWaXNpYmxlKHZpZXdNZXNzYWdlKTt0aGlzLl91cGRhdGVNZXNzYWdlTGlzdCgpO3JldHVybjt9CnRoaXMuX2J1aWxkSGlkZGVuQ2FjaGUoMCx0aGlzLl9jb25zb2xlTWVzc2FnZXMuc2xpY2UoKSk7fQpfc2V0SW1tZWRpYXRlbHlGaWx0ZXJNZXNzYWdlc0ZvclRlc3QoKXt0aGlzLl9pbW1lZGlhdGVseUZpbHRlck1lc3NhZ2VzRm9yVGVzdD10cnVlO30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc2VhcmNoYWJsZVZpZXc7fQpfY2xlYXJIaXN0b3J5KCl7dGhpcy5fY29uc29sZUhpc3RvcnlTZXR0aW5nLnNldChbXSk7dGhpcy5fcHJvbXB0Lmhpc3RvcnkoKS5zZXRIaXN0b3J5RGF0YShbXSk7fQpfY29uc29sZUhpc3RvcnlBdXRvY29tcGxldGVDaGFuZ2VkKCl7dGhpcy5fcHJvbXB0LnNldEFkZENvbXBsZXRpb25zRnJvbUhpc3RvcnkodGhpcy5fY29uc29sZUhpc3RvcnlBdXRvY29tcGxldGVTZXR0aW5nLmdldCgpKTt9Cml0ZW1Db3VudCgpe3JldHVybiB0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzLmxlbmd0aDt9Cml0ZW1FbGVtZW50KGluZGV4KXtyZXR1cm4gdGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlc1tpbmRleF07fQpmYXN0SGVpZ2h0KGluZGV4KXtyZXR1cm4gdGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlc1tpbmRleF0uZmFzdEhlaWdodCgpO30KbWluaW11bVJvd0hlaWdodCgpe3JldHVybiAxNjt9Cl9yZWdpc3RlcldpdGhNZXNzYWdlU2luaygpe0NvbW1vbi5jb25zb2xlLm1lc3NhZ2VzKCkuZm9yRWFjaCh0aGlzLl9hZGRTaW5rTWVzc2FnZSx0aGlzKTtDb21tb24uY29uc29sZS5hZGRFdmVudExpc3RlbmVyKENvbW1vbi5Db25zb2xlLkV2ZW50cy5NZXNzYWdlQWRkZWQsbWVzc2FnZUFkZGVkLHRoaXMpO2Z1bmN0aW9uIG1lc3NhZ2VBZGRlZChldmVudCl7dGhpcy5fYWRkU2lua01lc3NhZ2UoKGV2ZW50LmRhdGEpKTt9fQpfYWRkU2lua01lc3NhZ2UobWVzc2FnZSl7bGV0IGxldmVsPVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuVmVyYm9zZTtzd2l0Y2gobWVzc2FnZS5sZXZlbCl7Y2FzZSBDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuSW5mbzpsZXZlbD1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkluZm87YnJlYWs7Y2FzZSBDb21tb24uQ29uc29sZS5NZXNzYWdlTGV2ZWwuRXJyb3I6bGV2ZWw9U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5FcnJvcjticmVhaztjYXNlIENvbW1vbi5Db25zb2xlLk1lc3NhZ2VMZXZlbC5XYXJuaW5nOmxldmVsPVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuV2FybmluZzticmVhazt9CmNvbnN0IGNvbnNvbGVNZXNzYWdlPW5ldyBTREsuQ29uc29sZU1lc3NhZ2UobnVsbCxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5PdGhlcixsZXZlbCxtZXNzYWdlLnRleHQsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlN5c3RlbSx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLG1lc3NhZ2UudGltZXN0YW1wKTt0aGlzLl9hZGRDb25zb2xlTWVzc2FnZShjb25zb2xlTWVzc2FnZSk7fQpfY29uc29sZVRpbWVzdGFtcHNTZXR0aW5nQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZU1lc3NhZ2VMaXN0KCk7dGhpcy5fY29uc29sZU1lc3NhZ2VzLmZvckVhY2godmlld01lc3NhZ2U9PnZpZXdNZXNzYWdlLnVwZGF0ZVRpbWVzdGFtcCgpKTt0aGlzLl9ncm91cGFibGVNZXNzYWdlVGl0bGUuZm9yRWFjaCh2aWV3TWVzc2FnZT0+dmlld01lc3NhZ2UudXBkYXRlVGltZXN0YW1wKCkpO30KX2V4ZWN1dGlvbkNvbnRleHRDaGFuZ2VkKCl7dGhpcy5fcHJvbXB0LmNsZWFyQXV0b2NvbXBsZXRlKCk7fQp3aWxsSGlkZSgpe3RoaXMuX2hpZGVQcm9tcHRTdWdnZXN0Qm94KCk7fQp3YXNTaG93bigpe3RoaXMuX3ZpZXdwb3J0LnJlZnJlc2goKTt9CmZvY3VzKCl7aWYoIXRoaXMuX3Byb21wdC5oYXNGb2N1cygpKXtjb25zdCBvbGRTY3JvbGxUb3A9dGhpcy5fdmlld3BvcnQuZWxlbWVudC5zY3JvbGxUb3A7dGhpcy5fcHJvbXB0LmZvY3VzKCk7dGhpcy5fdmlld3BvcnQuZWxlbWVudC5zY3JvbGxUb3A9b2xkU2Nyb2xsVG9wO319CnJlc3RvcmVTY3JvbGxQb3NpdGlvbnMoKXtpZih0aGlzLl92aWV3cG9ydC5zdGlja1RvQm90dG9tKCkpCnRoaXMuX2ltbWVkaWF0ZWx5U2Nyb2xsVG9Cb3R0b20oKTtlbHNlCnN1cGVyLnJlc3RvcmVTY3JvbGxQb3NpdGlvbnMoKTt9Cm9uUmVzaXplKCl7dGhpcy5fc2NoZWR1bGVWaWV3cG9ydFJlZnJlc2goKTt0aGlzLl9oaWRlUHJvbXB0U3VnZ2VzdEJveCgpO2lmKHRoaXMuX3ZpZXdwb3J0LnN0aWNrVG9Cb3R0b20oKSkKdGhpcy5faW1tZWRpYXRlbHlTY3JvbGxUb0JvdHRvbSgpO2ZvcihsZXQgaT0wO2k8dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlcy5sZW5ndGg7KytpKQp0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzW2ldLm9uUmVzaXplKCk7fQpfaGlkZVByb21wdFN1Z2dlc3RCb3goKXt0aGlzLl9wcm9tcHQuY2xlYXJBdXRvY29tcGxldGUoKTt9Cl9pbnZhbGlkYXRlVmlld3BvcnQoKXtpZih0aGlzLl9tdXRlVmlld3BvcnRVcGRhdGVzKXt0aGlzLl9tYXliZURpcnR5V2hpbGVNdXRlZD10cnVlO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmlmKHRoaXMuX25lZWRzRnVsbFVwZGF0ZSl7dGhpcy5fdXBkYXRlTWVzc2FnZUxpc3QoKTtkZWxldGUgdGhpcy5fbmVlZHNGdWxsVXBkYXRlO31lbHNle3RoaXMuX3ZpZXdwb3J0LmludmFsaWRhdGUoKTt9CnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt9Cl9zY2hlZHVsZVZpZXdwb3J0UmVmcmVzaCgpe2lmKHRoaXMuX211dGVWaWV3cG9ydFVwZGF0ZXMpe3RoaXMuX21heWJlRGlydHlXaGlsZU11dGVkPXRydWU7dGhpcy5fc2NoZWR1bGVWaWV3cG9ydFJlZnJlc2hGb3JUZXN0KHRydWUpO3JldHVybjt9ZWxzZXt0aGlzLl9zY2hlZHVsZVZpZXdwb3J0UmVmcmVzaEZvclRlc3QoZmFsc2UpO30KdGhpcy5fc2NoZWR1bGVkUmVmcmVzaFByb21pc2VGb3JUZXN0PXRoaXMuX3ZpZXdwb3J0VGhyb3R0bGVyLnNjaGVkdWxlKHRoaXMuX2ludmFsaWRhdGVWaWV3cG9ydC5iaW5kKHRoaXMpKTt9Cl9zY2hlZHVsZVZpZXdwb3J0UmVmcmVzaEZvclRlc3QobXV0ZWQpe30KX2ltbWVkaWF0ZWx5U2Nyb2xsVG9Cb3R0b20oKXt0aGlzLl92aWV3cG9ydC5zZXRTdGlja1RvQm90dG9tKHRydWUpO3RoaXMuX3Byb21wdEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7fQpfdXBkYXRlRmlsdGVyU3RhdHVzKCl7aWYodGhpcy5faGlkZGVuQnlGaWx0ZXJDb3VudD09PXRoaXMuX2xhc3RTaG93bkhpZGRlbkJ5RmlsdGVyQ291bnQpCnJldHVybjt0aGlzLl9maWx0ZXJTdGF0dXNUZXh0LnNldFRleHQoQ29tbW9uLlVJU3RyaW5nKHRoaXMuX2hpZGRlbkJ5RmlsdGVyQ291bnQrJyBoaWRkZW4nKSk7dGhpcy5fZmlsdGVyU3RhdHVzVGV4dC5zZXRWaXNpYmxlKCEhdGhpcy5faGlkZGVuQnlGaWx0ZXJDb3VudCk7dGhpcy5fbGFzdFNob3duSGlkZGVuQnlGaWx0ZXJDb3VudD10aGlzLl9oaWRkZW5CeUZpbHRlckNvdW50O30KX29uQ29uc29sZU1lc3NhZ2VBZGRlZChldmVudCl7Y29uc3QgbWVzc2FnZT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkQ29uc29sZU1lc3NhZ2UobWVzc2FnZSk7fQpfYWRkQ29uc29sZU1lc3NhZ2UobWVzc2FnZSl7Y29uc3Qgdmlld01lc3NhZ2U9dGhpcy5fY3JlYXRlVmlld01lc3NhZ2UobWVzc2FnZSk7bWVzc2FnZVt0aGlzLl92aWV3TWVzc2FnZVN5bWJvbF09dmlld01lc3NhZ2U7aWYobWVzc2FnZS50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkNvbW1hbmR8fG1lc3NhZ2UudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5SZXN1bHQpe2NvbnN0IGxhc3RNZXNzYWdlPXRoaXMuX2NvbnNvbGVNZXNzYWdlcy5wZWVrTGFzdCgpO3ZpZXdNZXNzYWdlW0NvbnNvbGUuQ29uc29sZVZpZXcuX21lc3NhZ2VTb3J0aW5nVGltZVN5bWJvbF09bGFzdE1lc3NhZ2U/bGFzdE1lc3NhZ2VbQ29uc29sZS5Db25zb2xlVmlldy5fbWVzc2FnZVNvcnRpbmdUaW1lU3ltYm9sXTowO31lbHNle3ZpZXdNZXNzYWdlW0NvbnNvbGUuQ29uc29sZVZpZXcuX21lc3NhZ2VTb3J0aW5nVGltZVN5bWJvbF09dmlld01lc3NhZ2UuY29uc29sZU1lc3NhZ2UoKS50aW1lc3RhbXA7fQpsZXQgaW5zZXJ0QXQ7aWYoIXRoaXMuX2NvbnNvbGVNZXNzYWdlcy5sZW5ndGh8fHRpbWVDb21wYXJhdG9yKHZpZXdNZXNzYWdlLHRoaXMuX2NvbnNvbGVNZXNzYWdlc1t0aGlzLl9jb25zb2xlTWVzc2FnZXMubGVuZ3RoLTFdKT4wKQppbnNlcnRBdD10aGlzLl9jb25zb2xlTWVzc2FnZXMubGVuZ3RoO2Vsc2UKaW5zZXJ0QXQ9dGhpcy5fY29uc29sZU1lc3NhZ2VzLnVwcGVyQm91bmQodmlld01lc3NhZ2UsdGltZUNvbXBhcmF0b3IpO2NvbnN0IGluc2VydGVkSW5NaWRkbGU9aW5zZXJ0QXQ8dGhpcy5fY29uc29sZU1lc3NhZ2VzLmxlbmd0aDt0aGlzLl9jb25zb2xlTWVzc2FnZXMuc3BsaWNlKGluc2VydEF0LDAsdmlld01lc3NhZ2UpO3RoaXMuX2ZpbHRlci5vbk1lc3NhZ2VBZGRlZChtZXNzYWdlKTt0aGlzLl9zaWRlYmFyLm9uTWVzc2FnZUFkZGVkKHZpZXdNZXNzYWdlKTtsZXQgc2hvdWxkR29JbnRvR3JvdXA9ZmFsc2U7aWYobWVzc2FnZS5pc0dyb3VwYWJsZSgpKXtjb25zdCBncm91cEtleT12aWV3TWVzc2FnZS5ncm91cEtleSgpO3Nob3VsZEdvSW50b0dyb3VwPXRoaXMuX2dyb3VwU2ltaWxhclNldHRpbmcuZ2V0KCkmJnRoaXMuX2dyb3VwYWJsZU1lc3NhZ2VzLmhhcyhncm91cEtleSk7bGV0IGxpc3Q9dGhpcy5fZ3JvdXBhYmxlTWVzc2FnZXMuZ2V0KGdyb3VwS2V5KTtpZighbGlzdCl7bGlzdD1bXTt0aGlzLl9ncm91cGFibGVNZXNzYWdlcy5zZXQoZ3JvdXBLZXksbGlzdCk7fQpsaXN0LnB1c2godmlld01lc3NhZ2UpO30KdGhpcy5fY29tcHV0ZVNob3VsZE1lc3NhZ2VCZVZpc2libGUodmlld01lc3NhZ2UpO2lmKCFzaG91bGRHb0ludG9Hcm91cCYmIWluc2VydGVkSW5NaWRkbGUpe3RoaXMuX2FwcGVuZE1lc3NhZ2VUb0VuZCh2aWV3TWVzc2FnZSk7dGhpcy5fdXBkYXRlRmlsdGVyU3RhdHVzKCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMubGVuZ3RoKTt9ZWxzZXt0aGlzLl9uZWVkc0Z1bGxVcGRhdGU9dHJ1ZTt9CnRoaXMuX3NjaGVkdWxlVmlld3BvcnRSZWZyZXNoKCk7dGhpcy5fY29uc29sZU1lc3NhZ2VBZGRlZEZvclRlc3Qodmlld01lc3NhZ2UpO2Z1bmN0aW9uIHRpbWVDb21wYXJhdG9yKHZpZXdNZXNzYWdlMSx2aWV3TWVzc2FnZTIpe3JldHVybiB2aWV3TWVzc2FnZTFbQ29uc29sZS5Db25zb2xlVmlldy5fbWVzc2FnZVNvcnRpbmdUaW1lU3ltYm9sXS0Kdmlld01lc3NhZ2UyW0NvbnNvbGUuQ29uc29sZVZpZXcuX21lc3NhZ2VTb3J0aW5nVGltZVN5bWJvbF07fX0KX29uQ29uc29sZU1lc3NhZ2VVcGRhdGVkKGV2ZW50KXtjb25zdCBtZXNzYWdlPShldmVudC5kYXRhKTtjb25zdCB2aWV3TWVzc2FnZT1tZXNzYWdlW3RoaXMuX3ZpZXdNZXNzYWdlU3ltYm9sXTtpZih2aWV3TWVzc2FnZSl7dmlld01lc3NhZ2UudXBkYXRlTWVzc2FnZUVsZW1lbnQoKTt0aGlzLl91cGRhdGVNZXNzYWdlTGlzdCgpO319Cl9jb25zb2xlTWVzc2FnZUFkZGVkRm9yVGVzdCh2aWV3TWVzc2FnZSl7fQpfc2hvdWxkTWVzc2FnZUJlVmlzaWJsZSh2aWV3TWVzc2FnZSl7cmV0dXJuIXRoaXMuX3Nob3VsZEJlSGlkZGVuQ2FjaGUuaGFzKHZpZXdNZXNzYWdlKTt9Cl9jb21wdXRlU2hvdWxkTWVzc2FnZUJlVmlzaWJsZSh2aWV3TWVzc2FnZSl7aWYodGhpcy5fZmlsdGVyLnNob3VsZEJlVmlzaWJsZSh2aWV3TWVzc2FnZSkmJighdGhpcy5faXNTaWRlYmFyT3Blbnx8dGhpcy5fc2lkZWJhci5zaG91bGRCZVZpc2libGUodmlld01lc3NhZ2UpKSkKdGhpcy5fc2hvdWxkQmVIaWRkZW5DYWNoZS5kZWxldGUodmlld01lc3NhZ2UpO2Vsc2UKdGhpcy5fc2hvdWxkQmVIaWRkZW5DYWNoZS5hZGQodmlld01lc3NhZ2UpO30KX2FwcGVuZE1lc3NhZ2VUb0VuZCh2aWV3TWVzc2FnZSxwcmV2ZW50Q29sbGFwc2Upe2lmKCF0aGlzLl9zaG91bGRNZXNzYWdlQmVWaXNpYmxlKHZpZXdNZXNzYWdlKSl7dGhpcy5faGlkZGVuQnlGaWx0ZXJDb3VudCsrO3JldHVybjt9CmlmKCFwcmV2ZW50Q29sbGFwc2UmJnRoaXMuX3RyeVRvQ29sbGFwc2VNZXNzYWdlcyh2aWV3TWVzc2FnZSx0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzLnBlZWtMYXN0KCkpKQpyZXR1cm47Y29uc3QgbGFzdE1lc3NhZ2U9dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlcy5wZWVrTGFzdCgpO2lmKHZpZXdNZXNzYWdlLmNvbnNvbGVNZXNzYWdlKCkudHlwZT09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5FbmRHcm91cCl7aWYobGFzdE1lc3NhZ2UmJiF0aGlzLl9jdXJyZW50R3JvdXAubWVzc2FnZXNIaWRkZW4oKSkKbGFzdE1lc3NhZ2UuaW5jcmVtZW50Q2xvc2VHcm91cERlY29yYXRpb25Db3VudCgpO3RoaXMuX2N1cnJlbnRHcm91cD10aGlzLl9jdXJyZW50R3JvdXAucGFyZW50R3JvdXAoKXx8dGhpcy5fY3VycmVudEdyb3VwO3JldHVybjt9CmlmKCF0aGlzLl9jdXJyZW50R3JvdXAubWVzc2FnZXNIaWRkZW4oKSl7Y29uc3Qgb3JpZ2luYXRpbmdNZXNzYWdlPXZpZXdNZXNzYWdlLmNvbnNvbGVNZXNzYWdlKCkub3JpZ2luYXRpbmdNZXNzYWdlKCk7aWYobGFzdE1lc3NhZ2UmJm9yaWdpbmF0aW5nTWVzc2FnZSYmbGFzdE1lc3NhZ2UuY29uc29sZU1lc3NhZ2UoKT09PW9yaWdpbmF0aW5nTWVzc2FnZSkKbGFzdE1lc3NhZ2UudG9NZXNzYWdlRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtYWRqYWNlbnQtdXNlci1jb21tYW5kLXJlc3VsdCcpO3RoaXMuX3Zpc2libGVWaWV3TWVzc2FnZXMucHVzaCh2aWV3TWVzc2FnZSk7dGhpcy5fc2VhcmNoTWVzc2FnZSh0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzLmxlbmd0aC0xKTt9CmlmKHZpZXdNZXNzYWdlLmNvbnNvbGVNZXNzYWdlKCkuaXNHcm91cFN0YXJ0TWVzc2FnZSgpKQp0aGlzLl9jdXJyZW50R3JvdXA9bmV3IENvbnNvbGUuQ29uc29sZUdyb3VwKHRoaXMuX2N1cnJlbnRHcm91cCx2aWV3TWVzc2FnZSk7dGhpcy5fbWVzc2FnZUFwcGVuZGVkRm9yVGVzdHMoKTt9Cl9tZXNzYWdlQXBwZW5kZWRGb3JUZXN0cygpe30KX2NyZWF0ZVZpZXdNZXNzYWdlKG1lc3NhZ2Upe2NvbnN0IG5lc3RpbmdMZXZlbD10aGlzLl9jdXJyZW50R3JvdXAubmVzdGluZ0xldmVsKCk7c3dpdGNoKG1lc3NhZ2UudHlwZSl7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuQ29tbWFuZDpyZXR1cm4gbmV3IENvbnNvbGUuQ29uc29sZUNvbW1hbmQobWVzc2FnZSx0aGlzLl9saW5raWZpZXIsdGhpcy5fYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCk7Y2FzZSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuUmVzdWx0OnJldHVybiBuZXcgQ29uc29sZS5Db25zb2xlQ29tbWFuZFJlc3VsdChtZXNzYWdlLHRoaXMuX2xpbmtpZmllcix0aGlzLl9iYWRnZVBvb2wsbmVzdGluZ0xldmVsKTtjYXNlIFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5TdGFydEdyb3VwQ29sbGFwc2VkOmNhc2UgU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlN0YXJ0R3JvdXA6cmV0dXJuIG5ldyBDb25zb2xlLkNvbnNvbGVHcm91cFZpZXdNZXNzYWdlKG1lc3NhZ2UsdGhpcy5fbGlua2lmaWVyLHRoaXMuX2JhZGdlUG9vbCxuZXN0aW5nTGV2ZWwpO2RlZmF1bHQ6cmV0dXJuIG5ldyBDb25zb2xlLkNvbnNvbGVWaWV3TWVzc2FnZShtZXNzYWdlLHRoaXMuX2xpbmtpZmllcix0aGlzLl9iYWRnZVBvb2wsbmVzdGluZ0xldmVsKTt9fQpfY29uc29sZUNsZWFyZWQoKXt0aGlzLl9jYW5jZWxCdWlsZEhpZGRlbkNhY2hlKCk7dGhpcy5fY3VycmVudE1hdGNoUmFuZ2VJbmRleD0tMTt0aGlzLl9jb25zb2xlTWVzc2FnZXM9W107dGhpcy5fZ3JvdXBhYmxlTWVzc2FnZXMuY2xlYXIoKTt0aGlzLl9ncm91cGFibGVNZXNzYWdlVGl0bGUuY2xlYXIoKTt0aGlzLl9zaWRlYmFyLmNsZWFyKCk7dGhpcy5fdXBkYXRlTWVzc2FnZUxpc3QoKTt0aGlzLl9oaWRlUHJvbXB0U3VnZ2VzdEJveCgpO3RoaXMuX3ZpZXdwb3J0LnNldFN0aWNrVG9Cb3R0b20odHJ1ZSk7dGhpcy5fbGlua2lmaWVyLnJlc2V0KCk7dGhpcy5fYmFkZ2VQb29sLnJlc2V0KCk7dGhpcy5fZmlsdGVyLmNsZWFyKCk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtpZihldmVudC50YXJnZXQuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMuX3Byb21wdEVsZW1lbnQpKXtjb250ZXh0TWVudS5zaG93KCk7cmV0dXJuO30KY29uc3Qgc291cmNlRWxlbWVudD1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnY29uc29sZS1tZXNzYWdlLXdyYXBwZXInKTtjb25zdCBjb25zb2xlTWVzc2FnZT1zb3VyY2VFbGVtZW50P3NvdXJjZUVsZW1lbnQubWVzc2FnZS5jb25zb2xlTWVzc2FnZSgpOm51bGw7aWYoY29uc29sZU1lc3NhZ2UmJmNvbnNvbGVNZXNzYWdlLnVybCl7Y29uc3QgbWVudVRpdGxlPWxzYEhpZGUgbWVzc2FnZXMgZnJvbSAke25ldyBDb21tb24uUGFyc2VkVVJMKGNvbnNvbGVNZXNzYWdlLnVybCkuZGlzcGxheU5hbWV9YDtjb250ZXh0TWVudS5oZWFkZXJTZWN0aW9uKCkuYXBwZW5kSXRlbShtZW51VGl0bGUsdGhpcy5fZmlsdGVyLmFkZE1lc3NhZ2VVUkxGaWx0ZXIuYmluZCh0aGlzLl9maWx0ZXIsY29uc29sZU1lc3NhZ2UudXJsKSk7fQpjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEFjdGlvbignY29uc29sZS5jbGVhcicpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQWN0aW9uKCdjb25zb2xlLmNsZWFyLmhpc3RvcnknKTtjb250ZXh0TWVudS5zYXZlU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTYXZlIGFzLi4uJyksdGhpcy5fc2F2ZUNvbnNvbGUuYmluZCh0aGlzKSk7aWYodGhpcy5lbGVtZW50Lmhhc1NlbGVjdGlvbigpKXtjb250ZXh0TWVudS5jbGlwYm9hcmRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgdmlzaWJsZSBzdHlsZWQgc2VsZWN0aW9uJyksdGhpcy5fdmlld3BvcnQuY29weVdpdGhTdHlsZXMuYmluZCh0aGlzLl92aWV3cG9ydCkpO30KaWYoY29uc29sZU1lc3NhZ2UpCmNvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyhjb25zb2xlTWVzc2FnZSk7Y29udGV4dE1lbnUuc2hvdygpO30KYXN5bmMgX3NhdmVDb25zb2xlKCl7Y29uc3QgdXJsPVNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5pbnNwZWN0ZWRVUkwoKTtjb25zdCBwYXJzZWRVUkw9dXJsLmFzUGFyc2VkVVJMKCk7Y29uc3QgZmlsZW5hbWU9U3RyaW5nLnNwcmludGYoJyVzLSVkLmxvZycscGFyc2VkVVJMP3BhcnNlZFVSTC5ob3N0Oidjb25zb2xlJyxEYXRlLm5vdygpKTtjb25zdCBzdHJlYW09bmV3IEJpbmRpbmdzLkZpbGVPdXRwdXRTdHJlYW0oKTtjb25zdCBwcm9ncmVzc0luZGljYXRvcj1uZXcgVUkuUHJvZ3Jlc3NJbmRpY2F0b3IoKTtwcm9ncmVzc0luZGljYXRvci5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ1dyaXRpbmcgZmlsZeKApicpKTtwcm9ncmVzc0luZGljYXRvci5zZXRUb3RhbFdvcmsodGhpcy5pdGVtQ291bnQoKSk7Y29uc3QgY2h1bmtTaXplPTM1MDtpZighYXdhaXQgc3RyZWFtLm9wZW4oZmlsZW5hbWUpKQpyZXR1cm47dGhpcy5fcHJvZ3Jlc3NUb29sYmFySXRlbS5lbGVtZW50LmFwcGVuZENoaWxkKHByb2dyZXNzSW5kaWNhdG9yLmVsZW1lbnQpO2xldCBtZXNzYWdlSW5kZXg9MDt3aGlsZShtZXNzYWdlSW5kZXg8dGhpcy5pdGVtQ291bnQoKSYmIXByb2dyZXNzSW5kaWNhdG9yLmlzQ2FuY2VsZWQoKSl7Y29uc3QgbWVzc2FnZUNvbnRlbnRzPVtdO2xldCBpO2ZvcihpPTA7aTxjaHVua1NpemUmJmkrbWVzc2FnZUluZGV4PHRoaXMuaXRlbUNvdW50KCk7KytpKXtjb25zdCBtZXNzYWdlPXRoaXMuaXRlbUVsZW1lbnQobWVzc2FnZUluZGV4K2kpO21lc3NhZ2VDb250ZW50cy5wdXNoKG1lc3NhZ2UudG9FeHBvcnRTdHJpbmcoKSk7fQptZXNzYWdlSW5kZXgrPWk7YXdhaXQgc3RyZWFtLndyaXRlKG1lc3NhZ2VDb250ZW50cy5qb2luKCdcbicpKydcbicpO3Byb2dyZXNzSW5kaWNhdG9yLnNldFdvcmtlZChtZXNzYWdlSW5kZXgpO30Kc3RyZWFtLmNsb3NlKCk7cHJvZ3Jlc3NJbmRpY2F0b3IuZG9uZSgpO30KX3RyeVRvQ29sbGFwc2VNZXNzYWdlcyh2aWV3TWVzc2FnZSxsYXN0TWVzc2FnZSl7Y29uc3QgdGltZXN0YW1wc1Nob3duPXRoaXMuX3RpbWVzdGFtcHNTZXR0aW5nLmdldCgpO2lmKCF0aW1lc3RhbXBzU2hvd24mJmxhc3RNZXNzYWdlJiYhdmlld01lc3NhZ2UuY29uc29sZU1lc3NhZ2UoKS5pc0dyb3VwTWVzc2FnZSgpJiZ2aWV3TWVzc2FnZS5jb25zb2xlTWVzc2FnZSgpLmlzRXF1YWwobGFzdE1lc3NhZ2UuY29uc29sZU1lc3NhZ2UoKSkpe2xhc3RNZXNzYWdlLmluY3JlbWVudFJlcGVhdENvdW50KCk7aWYodmlld01lc3NhZ2UuaXNMYXN0SW5TaW1pbGFyR3JvdXAoKSkKbGFzdE1lc3NhZ2Uuc2V0SW5TaW1pbGFyR3JvdXAodHJ1ZSx0cnVlKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9Cl9idWlsZEhpZGRlbkNhY2hlKHN0YXJ0SW5kZXgsdmlld01lc3NhZ2VzKXtjb25zdCBzdGFydFRpbWU9RGF0ZS5ub3coKTtsZXQgaTtmb3IoaT1zdGFydEluZGV4O2k8dmlld01lc3NhZ2VzLmxlbmd0aDsrK2kpe3RoaXMuX2NvbXB1dGVTaG91bGRNZXNzYWdlQmVWaXNpYmxlKHZpZXdNZXNzYWdlc1tpXSk7aWYoaSUxMD09PTAmJkRhdGUubm93KCktc3RhcnRUaW1lPjEyKQpicmVhazt9CmlmKGk9PT12aWV3TWVzc2FnZXMubGVuZ3RoKXt0aGlzLl91cGRhdGVNZXNzYWdlTGlzdCgpO3JldHVybjt9CnRoaXMuX2J1aWxkSGlkZGVuQ2FjaGVUaW1lb3V0PXRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fYnVpbGRIaWRkZW5DYWNoZS5iaW5kKHRoaXMsaSx2aWV3TWVzc2FnZXMpKTt9Cl9jYW5jZWxCdWlsZEhpZGRlbkNhY2hlKCl7dGhpcy5fc2hvdWxkQmVIaWRkZW5DYWNoZS5jbGVhcigpO2lmKHRoaXMuX2J1aWxkSGlkZGVuQ2FjaGVUaW1lb3V0KXt0aGlzLmVsZW1lbnQud2luZG93KCkuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYnVpbGRIaWRkZW5DYWNoZVRpbWVvdXQpO2RlbGV0ZSB0aGlzLl9idWlsZEhpZGRlbkNhY2hlVGltZW91dDt9fQpfdXBkYXRlTWVzc2FnZUxpc3QoKXt0aGlzLl90b3BHcm91cD1Db25zb2xlLkNvbnNvbGVHcm91cC5jcmVhdGVUb3BHcm91cCgpO3RoaXMuX2N1cnJlbnRHcm91cD10aGlzLl90b3BHcm91cDt0aGlzLl9yZWdleE1hdGNoUmFuZ2VzPVtdO3RoaXMuX2hpZGRlbkJ5RmlsdGVyQ291bnQ9MDtmb3IobGV0IGk9MDtpPHRoaXMuX3Zpc2libGVWaWV3TWVzc2FnZXMubGVuZ3RoOysraSl7dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlc1tpXS5yZXNldENsb3NlR3JvdXBEZWNvcmF0aW9uQ291bnQoKTt0aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzW2ldLnJlc2V0SW5jcmVtZW50UmVwZWF0Q291bnQoKTt9CnRoaXMuX3Zpc2libGVWaWV3TWVzc2FnZXM9W107aWYodGhpcy5fZ3JvdXBTaW1pbGFyU2V0dGluZy5nZXQoKSl7dGhpcy5fYWRkR3JvdXBhYmxlTWVzc2FnZXNUb0VuZCgpO31lbHNle2ZvcihsZXQgaT0wO2k8dGhpcy5fY29uc29sZU1lc3NhZ2VzLmxlbmd0aDsrK2kpe3RoaXMuX2NvbnNvbGVNZXNzYWdlc1tpXS5zZXRJblNpbWlsYXJHcm91cChmYWxzZSk7dGhpcy5fYXBwZW5kTWVzc2FnZVRvRW5kKHRoaXMuX2NvbnNvbGVNZXNzYWdlc1tpXSk7fX0KdGhpcy5fdXBkYXRlRmlsdGVyU3RhdHVzKCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMubGVuZ3RoKTt0aGlzLl92aWV3cG9ydC5pbnZhbGlkYXRlKCk7fQpfYWRkR3JvdXBhYmxlTWVzc2FnZXNUb0VuZCgpe2NvbnN0IGFscmVhZHlBZGRlZD1uZXcgU2V0KCk7Y29uc3QgcHJvY2Vzc2VkR3JvdXBLZXlzPW5ldyBTZXQoKTtmb3IobGV0IGk9MDtpPHRoaXMuX2NvbnNvbGVNZXNzYWdlcy5sZW5ndGg7KytpKXtjb25zdCB2aWV3TWVzc2FnZT10aGlzLl9jb25zb2xlTWVzc2FnZXNbaV07Y29uc3QgbWVzc2FnZT12aWV3TWVzc2FnZS5jb25zb2xlTWVzc2FnZSgpO2lmKGFscmVhZHlBZGRlZC5oYXMobWVzc2FnZSkpCmNvbnRpbnVlO2lmKCFtZXNzYWdlLmlzR3JvdXBhYmxlKCkpe3RoaXMuX2FwcGVuZE1lc3NhZ2VUb0VuZCh2aWV3TWVzc2FnZSk7YWxyZWFkeUFkZGVkLmFkZChtZXNzYWdlKTtjb250aW51ZTt9CmNvbnN0IGtleT12aWV3TWVzc2FnZS5ncm91cEtleSgpO2NvbnN0IHZpZXdNZXNzYWdlc0luR3JvdXA9dGhpcy5fZ3JvdXBhYmxlTWVzc2FnZXMuZ2V0KGtleSk7aWYoIXZpZXdNZXNzYWdlc0luR3JvdXB8fHZpZXdNZXNzYWdlc0luR3JvdXAubGVuZ3RoPDUpe3ZpZXdNZXNzYWdlLnNldEluU2ltaWxhckdyb3VwKGZhbHNlKTt0aGlzLl9hcHBlbmRNZXNzYWdlVG9FbmQodmlld01lc3NhZ2UpO2FscmVhZHlBZGRlZC5hZGQobWVzc2FnZSk7Y29udGludWU7fQppZihwcm9jZXNzZWRHcm91cEtleXMuaGFzKGtleSkpCmNvbnRpbnVlO2lmKCF2aWV3TWVzc2FnZXNJbkdyb3VwLmZpbmQoeD0+dGhpcy5fc2hvdWxkTWVzc2FnZUJlVmlzaWJsZSh4KSkpe2FscmVhZHlBZGRlZC5hZGRBbGwodmlld01lc3NhZ2VzSW5Hcm91cCk7cHJvY2Vzc2VkR3JvdXBLZXlzLmFkZChrZXkpO2NvbnRpbnVlO30KbGV0IHN0YXJ0R3JvdXBWaWV3TWVzc2FnZT10aGlzLl9ncm91cGFibGVNZXNzYWdlVGl0bGUuZ2V0KGtleSk7aWYoIXN0YXJ0R3JvdXBWaWV3TWVzc2FnZSl7Y29uc3Qgc3RhcnRHcm91cE1lc3NhZ2U9bmV3IFNESy5Db25zb2xlTWVzc2FnZShudWxsLG1lc3NhZ2Uuc291cmNlLG1lc3NhZ2UubGV2ZWwsdmlld01lc3NhZ2UuZ3JvdXBUaXRsZSgpLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5TdGFydEdyb3VwQ29sbGFwc2VkKTtzdGFydEdyb3VwVmlld01lc3NhZ2U9dGhpcy5fY3JlYXRlVmlld01lc3NhZ2Uoc3RhcnRHcm91cE1lc3NhZ2UpO3RoaXMuX2dyb3VwYWJsZU1lc3NhZ2VUaXRsZS5zZXQoa2V5LHN0YXJ0R3JvdXBWaWV3TWVzc2FnZSk7fQpzdGFydEdyb3VwVmlld01lc3NhZ2Uuc2V0UmVwZWF0Q291bnQodmlld01lc3NhZ2VzSW5Hcm91cC5sZW5ndGgpO3RoaXMuX2FwcGVuZE1lc3NhZ2VUb0VuZChzdGFydEdyb3VwVmlld01lc3NhZ2UpO2Zvcihjb25zdCB2aWV3TWVzc2FnZUluR3JvdXAgb2Ygdmlld01lc3NhZ2VzSW5Hcm91cCl7dmlld01lc3NhZ2VJbkdyb3VwLnNldEluU2ltaWxhckdyb3VwKHRydWUsdmlld01lc3NhZ2VzSW5Hcm91cC5wZWVrTGFzdCgpPT09dmlld01lc3NhZ2VJbkdyb3VwKTt0aGlzLl9hcHBlbmRNZXNzYWdlVG9FbmQodmlld01lc3NhZ2VJbkdyb3VwLHRydWUpO2FscmVhZHlBZGRlZC5hZGQodmlld01lc3NhZ2VJbkdyb3VwLmNvbnNvbGVNZXNzYWdlKCkpO30KY29uc3QgZW5kR3JvdXBNZXNzYWdlPW5ldyBTREsuQ29uc29sZU1lc3NhZ2UobnVsbCxtZXNzYWdlLnNvdXJjZSxtZXNzYWdlLmxldmVsLG1lc3NhZ2UubWVzc2FnZVRleHQsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLkVuZEdyb3VwKTt0aGlzLl9hcHBlbmRNZXNzYWdlVG9FbmQodGhpcy5fY3JlYXRlVmlld01lc3NhZ2UoZW5kR3JvdXBNZXNzYWdlKSk7fX0KX21lc3NhZ2VzQ2xpY2tlZChldmVudCl7Y29uc3QgdGFyZ2V0PShldmVudC50YXJnZXQpO2lmKCF0aGlzLl9tZXNzYWdlc0VsZW1lbnQuaGFzU2VsZWN0aW9uKCkpe2NvbnN0IGNsaWNrZWRPdXRzaWRlTWVzc2FnZUxpc3Q9dGFyZ2V0PT09dGhpcy5fbWVzc2FnZXNFbGVtZW50fHx0aGlzLl9wcm9tcHQuYmVsb3dFZGl0b3JFbGVtZW50KCkuaXNTZWxmT3JBbmNlc3Rvcih0YXJnZXQpO2lmKGNsaWNrZWRPdXRzaWRlTWVzc2FnZUxpc3QpCnRoaXMuX3Byb21wdC5tb3ZlQ2FyZXRUb0VuZE9mUHJvbXB0KCk7dGhpcy5mb2N1cygpO30KY29uc3QgZ3JvdXBNZXNzYWdlPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdjb25zb2xlLWdyb3VwLXRpdGxlJyk7aWYoIWdyb3VwTWVzc2FnZSkKcmV0dXJuO2NvbnN0IGNvbnNvbGVHcm91cFZpZXdNZXNzYWdlPWdyb3VwTWVzc2FnZS5tZXNzYWdlO2NvbnNvbGVHcm91cFZpZXdNZXNzYWdlLnNldENvbGxhcHNlZCghY29uc29sZUdyb3VwVmlld01lc3NhZ2UuY29sbGFwc2VkKCkpO3RoaXMuX3VwZGF0ZU1lc3NhZ2VMaXN0KCk7fQpfbWVzc2FnZXNQYXN0ZWQoZXZlbnQpe2lmKFVJLmlzRWRpdGluZygpKQpyZXR1cm47dGhpcy5fcHJvbXB0LmZvY3VzKCk7fQpfcmVnaXN0ZXJTaG9ydGN1dHMoKXt0aGlzLl9zaG9ydGN1dHM9e307Y29uc3Qgc2hvcnRjdXQ9VUkuS2V5Ym9hcmRTaG9ydGN1dDtjb25zdCBzZWN0aW9uPVVJLnNob3J0Y3V0c1NjcmVlbi5zZWN0aW9uKENvbW1vbi5VSVN0cmluZygnQ29uc29sZScpKTtjb25zdCBzaG9ydGN1dEw9c2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ2wnLFVJLktleWJvYXJkU2hvcnRjdXQuTW9kaWZpZXJzLkN0cmwpO2xldCBrZXlzPVtzaG9ydGN1dExdO2lmKEhvc3QuaXNNYWMoKSl7Y29uc3Qgc2hvcnRjdXRLPXNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCdrJyxVSS5LZXlib2FyZFNob3J0Y3V0Lk1vZGlmaWVycy5NZXRhKTtrZXlzLnVuc2hpZnQoc2hvcnRjdXRLKTt9CnNlY3Rpb24uYWRkQWx0ZXJuYXRlS2V5cyhrZXlzLENvbW1vbi5VSVN0cmluZygnQ2xlYXIgY29uc29sZScpKTtrZXlzPVtzaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihzaG9ydGN1dC5LZXlzLlRhYiksc2hvcnRjdXQubWFrZURlc2NyaXB0b3Ioc2hvcnRjdXQuS2V5cy5SaWdodCldO3NlY3Rpb24uYWRkUmVsYXRlZEtleXMoa2V5cyxDb21tb24uVUlTdHJpbmcoJ0FjY2VwdCBzdWdnZXN0aW9uJykpO2NvbnN0IHNob3J0Y3V0VT1zaG9ydGN1dC5tYWtlRGVzY3JpcHRvcigndScsVUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybCk7dGhpcy5fc2hvcnRjdXRzW3Nob3J0Y3V0VS5rZXldPXRoaXMuX2NsZWFyUHJvbXB0QmFja3dhcmRzLmJpbmQodGhpcyk7c2VjdGlvbi5hZGRBbHRlcm5hdGVLZXlzKFtzaG9ydGN1dFVdLENvbW1vbi5VSVN0cmluZygnQ2xlYXIgY29uc29sZSBwcm9tcHQnKSk7a2V5cz1bc2hvcnRjdXQubWFrZURlc2NyaXB0b3Ioc2hvcnRjdXQuS2V5cy5Eb3duKSxzaG9ydGN1dC5tYWtlRGVzY3JpcHRvcihzaG9ydGN1dC5LZXlzLlVwKV07c2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhrZXlzLENvbW1vbi5VSVN0cmluZygnTmV4dC9wcmV2aW91cyBsaW5lJykpO2lmKEhvc3QuaXNNYWMoKSl7a2V5cz1bc2hvcnRjdXQubWFrZURlc2NyaXB0b3IoJ04nLHNob3J0Y3V0Lk1vZGlmaWVycy5BbHQpLHNob3J0Y3V0Lm1ha2VEZXNjcmlwdG9yKCdQJyxzaG9ydGN1dC5Nb2RpZmllcnMuQWx0KV07c2VjdGlvbi5hZGRSZWxhdGVkS2V5cyhrZXlzLENvbW1vbi5VSVN0cmluZygnTmV4dC9wcmV2aW91cyBjb21tYW5kJykpO30Kc2VjdGlvbi5hZGRLZXkoc2hvcnRjdXQubWFrZURlc2NyaXB0b3Ioc2hvcnRjdXQuS2V5cy5FbnRlciksQ29tbW9uLlVJU3RyaW5nKCdFeGVjdXRlIGNvbW1hbmQnKSk7fQpfY2xlYXJQcm9tcHRCYWNrd2FyZHMoKXt0aGlzLl9wcm9tcHQuc2V0VGV4dCgnJyk7fQpfcHJvbXB0S2V5RG93bihldmVudCl7Y29uc3Qga2V5Ym9hcmRFdmVudD0oZXZlbnQpO2lmKGtleWJvYXJkRXZlbnQua2V5PT09J1BhZ2VVcCcpe3RoaXMuX3VwZGF0ZVN0aWNrVG9Cb3R0b21PbldoZWVsKCk7cmV0dXJuO30KY29uc3Qgc2hvcnRjdXQ9VUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5RnJvbUV2ZW50KGtleWJvYXJkRXZlbnQpO2NvbnN0IGhhbmRsZXI9dGhpcy5fc2hvcnRjdXRzW3Nob3J0Y3V0XTtpZihoYW5kbGVyKXtoYW5kbGVyKCk7a2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO319Cl9wcmludFJlc3VsdChyZXN1bHQsb3JpZ2luYXRpbmdDb25zb2xlTWVzc2FnZSxleGNlcHRpb25EZXRhaWxzKXtpZighcmVzdWx0KQpyZXR1cm47Y29uc3QgbGV2ZWw9ISFleGNlcHRpb25EZXRhaWxzP1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuRXJyb3I6U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5JbmZvO2xldCBtZXNzYWdlO2lmKCFleGNlcHRpb25EZXRhaWxzKXttZXNzYWdlPW5ldyBTREsuQ29uc29sZU1lc3NhZ2UocmVzdWx0LnJ1bnRpbWVNb2RlbCgpLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkpTLGxldmVsLCcnLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlVHlwZS5SZXN1bHQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsW3Jlc3VsdF0pO31lbHNle21lc3NhZ2U9U0RLLkNvbnNvbGVNZXNzYWdlLmZyb21FeGNlcHRpb24ocmVzdWx0LnJ1bnRpbWVNb2RlbCgpLGV4Y2VwdGlvbkRldGFpbHMsU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlJlc3VsdCx1bmRlZmluZWQsdW5kZWZpbmVkKTt9Cm1lc3NhZ2Uuc2V0T3JpZ2luYXRpbmdNZXNzYWdlKG9yaWdpbmF0aW5nQ29uc29sZU1lc3NhZ2UpO1NESy5jb25zb2xlTW9kZWwuYWRkTWVzc2FnZShtZXNzYWdlKTt9Cl9jb21tYW5kRXZhbHVhdGVkKGV2ZW50KXtjb25zdCBkYXRhPShldmVudC5kYXRhKTt0aGlzLl9wcm9tcHQuaGlzdG9yeSgpLnB1c2hIaXN0b3J5SXRlbShkYXRhLmNvbW1hbmRNZXNzYWdlLm1lc3NhZ2VUZXh0KTt0aGlzLl9jb25zb2xlSGlzdG9yeVNldHRpbmcuc2V0KHRoaXMuX3Byb21wdC5oaXN0b3J5KCkuaGlzdG9yeURhdGEoKS5zbGljZSgtQ29uc29sZS5Db25zb2xlVmlldy5wZXJzaXN0ZWRIaXN0b3J5U2l6ZSkpO3RoaXMuX3ByaW50UmVzdWx0KGRhdGEucmVzdWx0LGRhdGEuY29tbWFuZE1lc3NhZ2UsZGF0YS5leGNlcHRpb25EZXRhaWxzKTt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7cmV0dXJuW3RoaXMuX21lc3NhZ2VzRWxlbWVudF07fQpzZWFyY2hDYW5jZWxlZCgpe3RoaXMuX2NsZWFudXBBZnRlclNlYXJjaCgpO2ZvcihsZXQgaT0wO2k8dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlcy5sZW5ndGg7KytpKXtjb25zdCBtZXNzYWdlPXRoaXMuX3Zpc2libGVWaWV3TWVzc2FnZXNbaV07bWVzc2FnZS5zZXRTZWFyY2hSZWdleChudWxsKTt9CnRoaXMuX2N1cnJlbnRNYXRjaFJhbmdlSW5kZXg9LTE7dGhpcy5fcmVnZXhNYXRjaFJhbmdlcz1bXTtkZWxldGUgdGhpcy5fc2VhcmNoUmVnZXg7dGhpcy5fdmlld3BvcnQucmVmcmVzaCgpO30KcGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXt0aGlzLnNlYXJjaENhbmNlbGVkKCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KDApO3RoaXMuX3NlYXJjaFJlZ2V4PXNlYXJjaENvbmZpZy50b1NlYXJjaFJlZ2V4KHRydWUpO3RoaXMuX3JlZ2V4TWF0Y2hSYW5nZXM9W107dGhpcy5fY3VycmVudE1hdGNoUmFuZ2VJbmRleD0tMTtpZihzaG91bGRKdW1wKQp0aGlzLl9zZWFyY2hTaG91bGRKdW1wQmFja3dhcmRzPSEhanVtcEJhY2t3YXJkczt0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvcj1uZXcgVUkuUHJvZ3Jlc3NJbmRpY2F0b3IoKTt0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvci5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ1NlYXJjaGluZ+KApicpKTt0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvci5zZXRUb3RhbFdvcmsodGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlcy5sZW5ndGgpO3RoaXMuX3Byb2dyZXNzVG9vbGJhckl0ZW0uZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvci5lbGVtZW50KTt0aGlzLl9pbm5lclNlYXJjaCgwKTt9Cl9jbGVhbnVwQWZ0ZXJTZWFyY2goKXtkZWxldGUgdGhpcy5fc2VhcmNoU2hvdWxkSnVtcEJhY2t3YXJkcztpZih0aGlzLl9pbm5lclNlYXJjaFRpbWVvdXRJZCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2lubmVyU2VhcmNoVGltZW91dElkKTtkZWxldGUgdGhpcy5faW5uZXJTZWFyY2hUaW1lb3V0SWQ7fQppZih0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvcil7dGhpcy5fc2VhcmNoUHJvZ3Jlc3NJbmRpY2F0b3IuZG9uZSgpO2RlbGV0ZSB0aGlzLl9zZWFyY2hQcm9ncmVzc0luZGljYXRvcjt9fQpfc2VhcmNoRmluaXNoZWRGb3JUZXN0cygpe30KX2lubmVyU2VhcmNoKGluZGV4KXtkZWxldGUgdGhpcy5faW5uZXJTZWFyY2hUaW1lb3V0SWQ7aWYodGhpcy5fc2VhcmNoUHJvZ3Jlc3NJbmRpY2F0b3IuaXNDYW5jZWxlZCgpKXt0aGlzLl9jbGVhbnVwQWZ0ZXJTZWFyY2goKTtyZXR1cm47fQpjb25zdCBzdGFydFRpbWU9RGF0ZS5ub3coKTtmb3IoO2luZGV4PHRoaXMuX3Zpc2libGVWaWV3TWVzc2FnZXMubGVuZ3RoJiZEYXRlLm5vdygpLXN0YXJ0VGltZTwxMDA7KytpbmRleCkKdGhpcy5fc2VhcmNoTWVzc2FnZShpbmRleCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMubGVuZ3RoKTtpZih0eXBlb2YgdGhpcy5fc2VhcmNoU2hvdWxkSnVtcEJhY2t3YXJkcyE9PSd1bmRlZmluZWQnJiZ0aGlzLl9yZWdleE1hdGNoUmFuZ2VzLmxlbmd0aCl7dGhpcy5fanVtcFRvTWF0Y2godGhpcy5fc2VhcmNoU2hvdWxkSnVtcEJhY2t3YXJkcz8tMTowKTtkZWxldGUgdGhpcy5fc2VhcmNoU2hvdWxkSnVtcEJhY2t3YXJkczt9CmlmKGluZGV4PT09dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlcy5sZW5ndGgpe3RoaXMuX2NsZWFudXBBZnRlclNlYXJjaCgpO3NldFRpbWVvdXQodGhpcy5fc2VhcmNoRmluaXNoZWRGb3JUZXN0cy5iaW5kKHRoaXMpLDApO3JldHVybjt9CnRoaXMuX2lubmVyU2VhcmNoVGltZW91dElkPXNldFRpbWVvdXQodGhpcy5faW5uZXJTZWFyY2guYmluZCh0aGlzLGluZGV4KSwxMDApO3RoaXMuX3NlYXJjaFByb2dyZXNzSW5kaWNhdG9yLnNldFdvcmtlZChpbmRleCk7fQpfc2VhcmNoTWVzc2FnZShpbmRleCl7Y29uc3QgbWVzc2FnZT10aGlzLl92aXNpYmxlVmlld01lc3NhZ2VzW2luZGV4XTttZXNzYWdlLnNldFNlYXJjaFJlZ2V4KHRoaXMuX3NlYXJjaFJlZ2V4KTtmb3IobGV0IGk9MDtpPG1lc3NhZ2Uuc2VhcmNoQ291bnQoKTsrK2kpCnRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMucHVzaCh7bWVzc2FnZUluZGV4OmluZGV4LG1hdGNoSW5kZXg6aX0pO30KanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpe3RoaXMuX2p1bXBUb01hdGNoKHRoaXMuX2N1cnJlbnRNYXRjaFJhbmdlSW5kZXgrMSk7fQpqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpe3RoaXMuX2p1bXBUb01hdGNoKHRoaXMuX2N1cnJlbnRNYXRjaFJhbmdlSW5kZXgtMSk7fQpzdXBwb3J0c0Nhc2VTZW5zaXRpdmVTZWFyY2goKXtyZXR1cm4gdHJ1ZTt9CnN1cHBvcnRzUmVnZXhTZWFyY2goKXtyZXR1cm4gdHJ1ZTt9Cl9qdW1wVG9NYXRjaChpbmRleCl7aWYoIXRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMubGVuZ3RoKQpyZXR1cm47bGV0IG1hdGNoUmFuZ2U7aWYodGhpcy5fY3VycmVudE1hdGNoUmFuZ2VJbmRleD49MCl7bWF0Y2hSYW5nZT10aGlzLl9yZWdleE1hdGNoUmFuZ2VzW3RoaXMuX2N1cnJlbnRNYXRjaFJhbmdlSW5kZXhdO2NvbnN0IG1lc3NhZ2U9dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlc1ttYXRjaFJhbmdlLm1lc3NhZ2VJbmRleF07bWVzc2FnZS5zZWFyY2hIaWdobGlnaHROb2RlKG1hdGNoUmFuZ2UubWF0Y2hJbmRleCkuY2xhc3NMaXN0LnJlbW92ZShVSS5oaWdobGlnaHRlZEN1cnJlbnRTZWFyY2hSZXN1bHRDbGFzc05hbWUpO30KaW5kZXg9bW9kKGluZGV4LHRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXMubGVuZ3RoKTt0aGlzLl9jdXJyZW50TWF0Y2hSYW5nZUluZGV4PWluZGV4O3RoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZUN1cnJlbnRNYXRjaEluZGV4KGluZGV4KTttYXRjaFJhbmdlPXRoaXMuX3JlZ2V4TWF0Y2hSYW5nZXNbaW5kZXhdO2NvbnN0IG1lc3NhZ2U9dGhpcy5fdmlzaWJsZVZpZXdNZXNzYWdlc1ttYXRjaFJhbmdlLm1lc3NhZ2VJbmRleF07Y29uc3QgaGlnaGxpZ2h0Tm9kZT1tZXNzYWdlLnNlYXJjaEhpZ2hsaWdodE5vZGUobWF0Y2hSYW5nZS5tYXRjaEluZGV4KTtoaWdobGlnaHROb2RlLmNsYXNzTGlzdC5hZGQoVUkuaGlnaGxpZ2h0ZWRDdXJyZW50U2VhcmNoUmVzdWx0Q2xhc3NOYW1lKTt0aGlzLl92aWV3cG9ydC5zY3JvbGxJdGVtSW50b1ZpZXcobWF0Y2hSYW5nZS5tZXNzYWdlSW5kZXgpO2hpZ2hsaWdodE5vZGUuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO30KX3VwZGF0ZVN0aWNrVG9Cb3R0b21Pbk1vdXNlRG93bihpc1JpZ2h0Q2xpY2spe3RoaXMuX211dGVWaWV3cG9ydFVwZGF0ZXM9IWlzUmlnaHRDbGljazt0aGlzLl92aWV3cG9ydC5zZXRTdGlja1RvQm90dG9tKGZhbHNlKTtpZih0aGlzLl93YWl0Rm9yU2Nyb2xsVGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3dhaXRGb3JTY3JvbGxUaW1lb3V0KTtkZWxldGUgdGhpcy5fd2FpdEZvclNjcm9sbFRpbWVvdXQ7fX0KX3VwZGF0ZVN0aWNrVG9Cb3R0b21Pbk1vdXNlVXAoKXtpZighdGhpcy5fbXV0ZVZpZXdwb3J0VXBkYXRlcykKcmV0dXJuO3RoaXMuX3dhaXRGb3JTY3JvbGxUaW1lb3V0PXNldFRpbWVvdXQodXBkYXRlVmlld3BvcnRTdGF0ZS5iaW5kKHRoaXMpLDIwMCk7ZnVuY3Rpb24gdXBkYXRlVmlld3BvcnRTdGF0ZSgpe3RoaXMuX211dGVWaWV3cG9ydFVwZGF0ZXM9ZmFsc2U7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fdmlld3BvcnQuc2V0U3RpY2tUb0JvdHRvbSh0aGlzLl9pc1Njcm9sbGVkVG9Cb3R0b20oKSk7aWYodGhpcy5fbWF5YmVEaXJ0eVdoaWxlTXV0ZWQpe3RoaXMuX3NjaGVkdWxlVmlld3BvcnRSZWZyZXNoKCk7ZGVsZXRlIHRoaXMuX21heWJlRGlydHlXaGlsZU11dGVkO30KZGVsZXRlIHRoaXMuX3dhaXRGb3JTY3JvbGxUaW1lb3V0O3RoaXMuX3VwZGF0ZVZpZXdwb3J0U3RpY2tpbmVzc0ZvclRlc3QoKTt9fQpfdXBkYXRlVmlld3BvcnRTdGlja2luZXNzRm9yVGVzdCgpe30KX3VwZGF0ZVN0aWNrVG9Cb3R0b21PbldoZWVsKCl7dGhpcy5fdXBkYXRlU3RpY2tUb0JvdHRvbU9uTW91c2VEb3duKCk7dGhpcy5fdXBkYXRlU3RpY2tUb0JvdHRvbU9uTW91c2VVcCgpO30KX3Byb21wdEV4cHJlc3Npb25QaW5uZWQoZXZlbnQpe2NvbnN0IHRleHQ9KGV2ZW50LmRhdGEpO3RoaXMuX3BpblBhbmUuYWRkUGluKHRleHQpO30KX3Byb21wdFRleHRDaGFuZ2VkKCl7dGhpcy5fdmlld3BvcnQuc2V0U3RpY2tUb0JvdHRvbSh0aGlzLl9pc1Njcm9sbGVkVG9Cb3R0b20oKSk7dGhpcy5fcHJvbXB0VGV4dENoYW5nZWRGb3JUZXN0KCk7fQpfcHJvbXB0VGV4dENoYW5nZWRGb3JUZXN0KCl7fQpfaXNTY3JvbGxlZFRvQm90dG9tKCl7aWYoIXRoaXMuX2lzQmVsb3dQcm9tcHRFbmFibGVkKQpyZXR1cm4gdGhpcy5fbWVzc2FnZXNFbGVtZW50LmlzU2Nyb2xsZWRUb0JvdHRvbSgpO2NvbnN0IGRpc3RhbmNlVG9Qcm9tcHRFZGl0b3JCb3R0b209dGhpcy5fbWVzc2FnZXNFbGVtZW50LnNjcm9sbEhlaWdodC10aGlzLl9tZXNzYWdlc0VsZW1lbnQuc2Nyb2xsVG9wLQp0aGlzLl9tZXNzYWdlc0VsZW1lbnQuY2xpZW50SGVpZ2h0LXRoaXMuX3Byb21wdC5iZWxvd0VkaXRvckVsZW1lbnQoKS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGRpc3RhbmNlVG9Qcm9tcHRFZGl0b3JCb3R0b208PTI7fX07Q29uc29sZS5Db25zb2xlVmlldy5wZXJzaXN0ZWRIaXN0b3J5U2l6ZT0zMDA7Q29uc29sZS5Db25zb2xlVmlld0ZpbHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihmaWx0ZXJDaGFuZ2VkQ2FsbGJhY2spe3RoaXMuX2ZpbHRlckNoYW5nZWQ9ZmlsdGVyQ2hhbmdlZENhbGxiYWNrO3RoaXMuX21lc3NhZ2VMZXZlbEZpbHRlcnNTZXR0aW5nPUNvbnNvbGUuQ29uc29sZVZpZXdGaWx0ZXIubGV2ZWxGaWx0ZXJTZXR0aW5nKCk7dGhpcy5faGlkZU5ldHdvcmtNZXNzYWdlc1NldHRpbmc9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2hpZGVOZXR3b3JrTWVzc2FnZXMnKTt0aGlzLl9maWx0ZXJCeUV4ZWN1dGlvbkNvbnRleHRTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzZWxlY3RlZENvbnRleHRGaWx0ZXJFbmFibGVkJyk7dGhpcy5fbWVzc2FnZUxldmVsRmlsdGVyc1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fb25GaWx0ZXJDaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuX2hpZGVOZXR3b3JrTWVzc2FnZXNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX29uRmlsdGVyQ2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl9maWx0ZXJCeUV4ZWN1dGlvbkNvbnRleHRTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX29uRmlsdGVyQ2hhbmdlZC5iaW5kKHRoaXMpKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5FeGVjdXRpb25Db250ZXh0LHRoaXMuX29uRmlsdGVyQ2hhbmdlZCx0aGlzKTtjb25zdCBmaWx0ZXJLZXlzPU9iamVjdC52YWx1ZXMoQ29uc29sZS5Db25zb2xlRmlsdGVyLkZpbHRlclR5cGUpO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyPW5ldyBVSS5GaWx0ZXJTdWdnZXN0aW9uQnVpbGRlcihmaWx0ZXJLZXlzKTt0aGlzLl90ZXh0RmlsdGVyVUk9bmV3IFVJLlRvb2xiYXJJbnB1dChDb21tb24uVUlTdHJpbmcoJ0ZpbHRlcicpLDAuMiwxLENvbW1vbi5VSVN0cmluZygnZS5nLiAvZXZlbnRcXGQvIC1jZG4gdXJsOmEuY29tJyksdGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuY29tcGxldGlvbnMuYmluZCh0aGlzLl9zdWdnZXN0aW9uQnVpbGRlcikpO3RoaXMuX3RleHRGaWx0ZXJTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdjb25zb2xlLnRleHRGaWx0ZXInLCcnKTtpZih0aGlzLl90ZXh0RmlsdGVyU2V0dGluZy5nZXQoKSkKdGhpcy5fdGV4dEZpbHRlclVJLnNldFZhbHVlKHRoaXMuX3RleHRGaWx0ZXJTZXR0aW5nLmdldCgpKTt0aGlzLl90ZXh0RmlsdGVyVUkuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsKCk9Pnt0aGlzLl90ZXh0RmlsdGVyU2V0dGluZy5zZXQodGhpcy5fdGV4dEZpbHRlclVJLnZhbHVlKCkpO3RoaXMuX29uRmlsdGVyQ2hhbmdlZCgpO30pO3RoaXMuX2ZpbHRlclBhcnNlcj1uZXcgVGV4dFV0aWxzLkZpbHRlclBhcnNlcihmaWx0ZXJLZXlzKTt0aGlzLl9jdXJyZW50RmlsdGVyPW5ldyBDb25zb2xlLkNvbnNvbGVGaWx0ZXIoJycsW10sbnVsbCx0aGlzLl9tZXNzYWdlTGV2ZWxGaWx0ZXJzU2V0dGluZy5nZXQoKSk7dGhpcy5fdXBkYXRlQ3VycmVudEZpbHRlcigpO3RoaXMuX2xldmVsTGFiZWxzPXt9O3RoaXMuX2xldmVsTGFiZWxzW1NESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuVmVyYm9zZV09Q29tbW9uLlVJU3RyaW5nKCdWZXJib3NlJyk7dGhpcy5fbGV2ZWxMYWJlbHNbU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbC5JbmZvXT1Db21tb24uVUlTdHJpbmcoJ0luZm8nKTt0aGlzLl9sZXZlbExhYmVsc1tTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLldhcm5pbmddPUNvbW1vbi5VSVN0cmluZygnV2FybmluZ3MnKTt0aGlzLl9sZXZlbExhYmVsc1tTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsLkVycm9yXT1Db21tb24uVUlTdHJpbmcoJ0Vycm9ycycpO3RoaXMuX2xldmVsTWVudUJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihsc2BMb2cgbGV2ZWxzYCk7dGhpcy5fbGV2ZWxNZW51QnV0dG9uLnR1cm5JbnRvU2VsZWN0KCk7dGhpcy5fbGV2ZWxNZW51QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fc2hvd0xldmVsQ29udGV4dE1lbnUuYmluZCh0aGlzKSk7dGhpcy5fdXBkYXRlTGV2ZWxNZW51QnV0dG9uVGV4dCgpO3RoaXMuX21lc3NhZ2VMZXZlbEZpbHRlcnNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZUxldmVsTWVudUJ1dHRvblRleHQuYmluZCh0aGlzKSk7fQpvbk1lc3NhZ2VBZGRlZChtZXNzYWdlKXtpZihtZXNzYWdlLnR5cGU9PT1TREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuQ29tbWFuZHx8bWVzc2FnZS50eXBlPT09U0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VUeXBlLlJlc3VsdHx8bWVzc2FnZS5pc0dyb3VwTWVzc2FnZSgpKQpyZXR1cm47aWYobWVzc2FnZS5jb250ZXh0KQp0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKENvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlLkNvbnRleHQsbWVzc2FnZS5jb250ZXh0KTtpZihtZXNzYWdlLnNvdXJjZSkKdGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShDb25zb2xlLkNvbnNvbGVGaWx0ZXIuRmlsdGVyVHlwZS5Tb3VyY2UsbWVzc2FnZS5zb3VyY2UpO2lmKG1lc3NhZ2UudXJsKQp0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKENvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlLlVybCxtZXNzYWdlLnVybCk7fQpzdGF0aWMgbGV2ZWxGaWx0ZXJTZXR0aW5nKCl7cmV0dXJuIENvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdtZXNzYWdlTGV2ZWxGaWx0ZXJzJyxDb25zb2xlLkNvbnNvbGVGaWx0ZXIuZGVmYXVsdExldmVsc0ZpbHRlclZhbHVlKCkpO30KX3VwZGF0ZUN1cnJlbnRGaWx0ZXIoKXtjb25zdCBwYXJzZWRGaWx0ZXJzPXRoaXMuX2ZpbHRlclBhcnNlci5wYXJzZSh0aGlzLl90ZXh0RmlsdGVyVUkudmFsdWUoKSk7aWYodGhpcy5faGlkZU5ldHdvcmtNZXNzYWdlc1NldHRpbmcuZ2V0KCkpe3BhcnNlZEZpbHRlcnMucHVzaCh7a2V5OkNvbnNvbGUuQ29uc29sZUZpbHRlci5GaWx0ZXJUeXBlLlNvdXJjZSx0ZXh0OlNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLk5ldHdvcmssbmVnYXRpdmU6dHJ1ZX0pO30KdGhpcy5fY3VycmVudEZpbHRlci5leGVjdXRpb25Db250ZXh0PXRoaXMuX2ZpbHRlckJ5RXhlY3V0aW9uQ29udGV4dFNldHRpbmcuZ2V0KCk/VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpOm51bGw7dGhpcy5fY3VycmVudEZpbHRlci5wYXJzZWRGaWx0ZXJzPXBhcnNlZEZpbHRlcnM7dGhpcy5fY3VycmVudEZpbHRlci5sZXZlbHNNYXNrPXRoaXMuX21lc3NhZ2VMZXZlbEZpbHRlcnNTZXR0aW5nLmdldCgpO30KX29uRmlsdGVyQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZUN1cnJlbnRGaWx0ZXIoKTt0aGlzLl9maWx0ZXJDaGFuZ2VkKCk7fQpfdXBkYXRlTGV2ZWxNZW51QnV0dG9uVGV4dCgpe2xldCBpc0FsbD10cnVlO2xldCBpc0RlZmF1bHQ9dHJ1ZTtjb25zdCBhbGxWYWx1ZT1Db25zb2xlLkNvbnNvbGVGaWx0ZXIuYWxsTGV2ZWxzRmlsdGVyVmFsdWUoKTtjb25zdCBkZWZhdWx0VmFsdWU9Q29uc29sZS5Db25zb2xlRmlsdGVyLmRlZmF1bHRMZXZlbHNGaWx0ZXJWYWx1ZSgpO2xldCB0ZXh0PW51bGw7Y29uc3QgbGV2ZWxzPXRoaXMuX21lc3NhZ2VMZXZlbEZpbHRlcnNTZXR0aW5nLmdldCgpO2Zvcihjb25zdCBuYW1lIG9mIE9iamVjdC52YWx1ZXMoU0RLLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCkpe2lzQWxsPWlzQWxsJiZsZXZlbHNbbmFtZV09PT1hbGxWYWx1ZVtuYW1lXTtpc0RlZmF1bHQ9aXNEZWZhdWx0JiZsZXZlbHNbbmFtZV09PT1kZWZhdWx0VmFsdWVbbmFtZV07aWYobGV2ZWxzW25hbWVdKQp0ZXh0PXRleHQ/Q29tbW9uLlVJU3RyaW5nKCdDdXN0b20gbGV2ZWxzJyk6Q29tbW9uLlVJU3RyaW5nKCclcyBvbmx5Jyx0aGlzLl9sZXZlbExhYmVsc1tuYW1lXSk7fQppZihpc0FsbCkKdGV4dD1Db21tb24uVUlTdHJpbmcoJ0FsbCBsZXZlbHMnKTtlbHNlIGlmKGlzRGVmYXVsdCkKdGV4dD1Db21tb24uVUlTdHJpbmcoJ0RlZmF1bHQgbGV2ZWxzJyk7ZWxzZQp0ZXh0PXRleHR8fENvbW1vbi5VSVN0cmluZygnSGlkZSBhbGwnKTt0aGlzLl9sZXZlbE1lbnVCdXR0b24uZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd3YXJuaW5nJywhaXNBbGwmJiFpc0RlZmF1bHQpO3RoaXMuX2xldmVsTWVudUJ1dHRvbi5zZXRUZXh0KHRleHQpO30KX3Nob3dMZXZlbENvbnRleHRNZW51KGV2ZW50KXtjb25zdCBtb3VzZUV2ZW50PShldmVudC5kYXRhKTtjb25zdCBzZXR0aW5nPXRoaXMuX21lc3NhZ2VMZXZlbEZpbHRlcnNTZXR0aW5nO2NvbnN0IGxldmVscz1zZXR0aW5nLmdldCgpO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShtb3VzZUV2ZW50LHRydWUsdGhpcy5fbGV2ZWxNZW51QnV0dG9uLmVsZW1lbnQudG90YWxPZmZzZXRMZWZ0KCksdGhpcy5fbGV2ZWxNZW51QnV0dG9uLmVsZW1lbnQudG90YWxPZmZzZXRUb3AoKSt0aGlzLl9sZXZlbE1lbnVCdXR0b24uZWxlbWVudC5vZmZzZXRIZWlnaHQpO2NvbnRleHRNZW51LmhlYWRlclNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRGVmYXVsdCcpLCgpPT5zZXR0aW5nLnNldChDb25zb2xlLkNvbnNvbGVGaWx0ZXIuZGVmYXVsdExldmVsc0ZpbHRlclZhbHVlKCkpKTtmb3IoY29uc3QgbGV2ZWwgaW4gdGhpcy5fbGV2ZWxMYWJlbHMpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKHRoaXMuX2xldmVsTGFiZWxzW2xldmVsXSx0b2dnbGVTaG93TGV2ZWwuYmluZChudWxsLGxldmVsKSxsZXZlbHNbbGV2ZWxdKTt9CmNvbnRleHRNZW51LnNob3coKTtmdW5jdGlvbiB0b2dnbGVTaG93TGV2ZWwobGV2ZWwpe2xldmVsc1tsZXZlbF09IWxldmVsc1tsZXZlbF07c2V0dGluZy5zZXQobGV2ZWxzKTt9fQphZGRNZXNzYWdlVVJMRmlsdGVyKHVybCl7aWYoIXVybCkKcmV0dXJuO2NvbnN0IHN1ZmZpeD10aGlzLl90ZXh0RmlsdGVyVUkudmFsdWUoKT9gICR7dGhpcy5fdGV4dEZpbHRlclVJLnZhbHVlKCl9YDonJzt0aGlzLl90ZXh0RmlsdGVyVUkuc2V0VmFsdWUoYC11cmw6JHt1cmx9JHtzdWZmaXh9YCk7dGhpcy5fdGV4dEZpbHRlclNldHRpbmcuc2V0KHRoaXMuX3RleHRGaWx0ZXJVSS52YWx1ZSgpKTt0aGlzLl9vbkZpbHRlckNoYW5nZWQoKTt9CnNob3VsZEJlVmlzaWJsZSh2aWV3TWVzc2FnZSl7cmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXIuc2hvdWxkQmVWaXNpYmxlKHZpZXdNZXNzYWdlKTt9CmNsZWFyKCl7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuY2xlYXIoKTt9CnJlc2V0KCl7dGhpcy5fbWVzc2FnZUxldmVsRmlsdGVyc1NldHRpbmcuc2V0KENvbnNvbGUuQ29uc29sZUZpbHRlci5kZWZhdWx0TGV2ZWxzRmlsdGVyVmFsdWUoKSk7dGhpcy5fZmlsdGVyQnlFeGVjdXRpb25Db250ZXh0U2V0dGluZy5zZXQoZmFsc2UpO3RoaXMuX2hpZGVOZXR3b3JrTWVzc2FnZXNTZXR0aW5nLnNldChmYWxzZSk7dGhpcy5fdGV4dEZpbHRlclVJLnNldFZhbHVlKCcnKTt0aGlzLl9vbkZpbHRlckNoYW5nZWQoKTt9fTtDb25zb2xlLkNvbnNvbGVDb21tYW5kPWNsYXNzIGV4dGVuZHMgQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2V7Y29uc3RydWN0b3IobWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCl7c3VwZXIobWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCk7fQpjb250ZW50RWxlbWVudCgpe2lmKCF0aGlzLl9jb250ZW50RWxlbWVudCl7dGhpcy5fY29udGVudEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnY29uc29sZS11c2VyLWNvbW1hbmQnKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdXNlci1jb21tYW5kJywnY29tbWFuZC1yZXN1bHQtaWNvbicpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGljb24pO3RoaXMuX2NvbnRlbnRFbGVtZW50Lm1lc3NhZ2U9dGhpczt0aGlzLl9mb3JtYXR0ZWRDb21tYW5kPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdzb3VyY2UtY29kZScpO3RoaXMuX2Zvcm1hdHRlZENvbW1hbmQudGV4dENvbnRlbnQ9dGhpcy50ZXh0LnJlcGxhY2VDb250cm9sQ2hhcmFjdGVycygpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2Zvcm1hdHRlZENvbW1hbmQpO2lmKHRoaXMuX2Zvcm1hdHRlZENvbW1hbmQudGV4dENvbnRlbnQubGVuZ3RoPENvbnNvbGUuQ29uc29sZUNvbW1hbmQuTWF4TGVuZ3RoVG9JZ25vcmVIaWdobGlnaHRlcil7Y29uc3QgamF2YXNjcmlwdFN5bnRheEhpZ2hsaWdodGVyPW5ldyBVSS5TeW50YXhIaWdobGlnaHRlcigndGV4dC9qYXZhc2NyaXB0Jyx0cnVlKTtqYXZhc2NyaXB0U3ludGF4SGlnaGxpZ2h0ZXIuc3ludGF4SGlnaGxpZ2h0Tm9kZSh0aGlzLl9mb3JtYXR0ZWRDb21tYW5kKS50aGVuKHRoaXMuX3VwZGF0ZVNlYXJjaC5iaW5kKHRoaXMpKTt9ZWxzZXt0aGlzLl91cGRhdGVTZWFyY2goKTt9CnRoaXMudXBkYXRlVGltZXN0YW1wKCk7fQpyZXR1cm4gdGhpcy5fY29udGVudEVsZW1lbnQ7fQpfdXBkYXRlU2VhcmNoKCl7dGhpcy5zZXRTZWFyY2hSZWdleCh0aGlzLnNlYXJjaFJlZ2V4KCkpO319O0NvbnNvbGUuQ29uc29sZUNvbW1hbmQuTWF4TGVuZ3RoVG9JZ25vcmVIaWdobGlnaHRlcj0xMDAwMDtDb25zb2xlLkNvbnNvbGVDb21tYW5kUmVzdWx0PWNsYXNzIGV4dGVuZHMgQ29uc29sZS5Db25zb2xlVmlld01lc3NhZ2V7Y29uc3RydWN0b3IobWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCl7c3VwZXIobWVzc2FnZSxsaW5raWZpZXIsYmFkZ2VQb29sLG5lc3RpbmdMZXZlbCk7fQpjb250ZW50RWxlbWVudCgpe2NvbnN0IGVsZW1lbnQ9c3VwZXIuY29udGVudEVsZW1lbnQoKTtpZighZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnNvbGUtdXNlci1jb21tYW5kLXJlc3VsdCcpKXtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtdXNlci1jb21tYW5kLXJlc3VsdCcpO2lmKHRoaXMuY29uc29sZU1lc3NhZ2UoKS5sZXZlbD09PVNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuSW5mbyl7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLWNvbW1hbmQtcmVzdWx0JywnY29tbWFuZC1yZXN1bHQtaWNvbicpO2VsZW1lbnQuaW5zZXJ0QmVmb3JlKGljb24sZWxlbWVudC5maXJzdENoaWxkKTt9fQpyZXR1cm4gZWxlbWVudDt9fTtDb25zb2xlLkNvbnNvbGVHcm91cD1jbGFzc3tjb25zdHJ1Y3RvcihwYXJlbnRHcm91cCxncm91cE1lc3NhZ2Upe3RoaXMuX3BhcmVudEdyb3VwPXBhcmVudEdyb3VwO3RoaXMuX25lc3RpbmdMZXZlbD1wYXJlbnRHcm91cD9wYXJlbnRHcm91cC5uZXN0aW5nTGV2ZWwoKSsxOjA7dGhpcy5fbWVzc2FnZXNIaWRkZW49Z3JvdXBNZXNzYWdlJiZncm91cE1lc3NhZ2UuY29sbGFwc2VkKCl8fHRoaXMuX3BhcmVudEdyb3VwJiZ0aGlzLl9wYXJlbnRHcm91cC5tZXNzYWdlc0hpZGRlbigpO30Kc3RhdGljIGNyZWF0ZVRvcEdyb3VwKCl7cmV0dXJuIG5ldyBDb25zb2xlLkNvbnNvbGVHcm91cChudWxsLG51bGwpO30KbWVzc2FnZXNIaWRkZW4oKXtyZXR1cm4gdGhpcy5fbWVzc2FnZXNIaWRkZW47fQpuZXN0aW5nTGV2ZWwoKXtyZXR1cm4gdGhpcy5fbmVzdGluZ0xldmVsO30KcGFyZW50R3JvdXAoKXtyZXR1cm4gdGhpcy5fcGFyZW50R3JvdXA7fX07Q29uc29sZS5Db25zb2xlVmlldy5BY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7c3dpdGNoKGFjdGlvbklkKXtjYXNlJ2NvbnNvbGUuc2hvdyc6SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmJyaW5nVG9Gcm9udCgpO0NvbW1vbi5jb25zb2xlLnNob3coKTtyZXR1cm4gdHJ1ZTtjYXNlJ2NvbnNvbGUuY2xlYXInOkNvbnNvbGUuQ29uc29sZVZpZXcuY2xlYXJDb25zb2xlKCk7cmV0dXJuIHRydWU7Y2FzZSdjb25zb2xlLmNsZWFyLmhpc3RvcnknOkNvbnNvbGUuQ29uc29sZVZpZXcuaW5zdGFuY2UoKS5fY2xlYXJIaXN0b3J5KCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fX07Q29uc29sZS5Db25zb2xlVmlldy5SZWdleE1hdGNoUmFuZ2U7Q29uc29sZS5Db25zb2xlVmlldy5fbWVzc2FnZVNvcnRpbmdUaW1lU3ltYm9sPVN5bWJvbCgnbWVzc2FnZVNvcnRpbmdUaW1lJyk7O0NvbnNvbGUuQ29uc29sZVBhbmVsPWNsYXNzIGV4dGVuZHMgVUkuUGFuZWx7Y29uc3RydWN0b3IoKXtzdXBlcignY29uc29sZScpO3RoaXMuX3ZpZXc9Q29uc29sZS5Db25zb2xlVmlldy5pbnN0YW5jZSgpO30Kc3RhdGljIGluc3RhbmNlKCl7cmV0dXJuKHNlbGYucnVudGltZS5zaGFyZWRJbnN0YW5jZShDb25zb2xlLkNvbnNvbGVQYW5lbCkpO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO2NvbnN0IHdyYXBwZXI9Q29uc29sZS5Db25zb2xlUGFuZWwuV3JhcHBlclZpZXcuX2luc3RhbmNlO2lmKHdyYXBwZXImJndyYXBwZXIuaXNTaG93aW5nKCkpClVJLmluc3BlY3RvclZpZXcuc2V0RHJhd2VyTWluaW1pemVkKHRydWUpO3RoaXMuX3ZpZXcuc2hvdyh0aGlzLmVsZW1lbnQpO30Kd2lsbEhpZGUoKXtzdXBlci53aWxsSGlkZSgpO1VJLmluc3BlY3RvclZpZXcuc2V0RHJhd2VyTWluaW1pemVkKGZhbHNlKTtpZihDb25zb2xlLkNvbnNvbGVQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2UpCkNvbnNvbGUuQ29uc29sZVBhbmVsLldyYXBwZXJWaWV3Ll9pbnN0YW5jZS5fc2hvd1ZpZXdJbldyYXBwZXIoKTt9CnNlYXJjaGFibGVWaWV3KCl7cmV0dXJuIENvbnNvbGUuQ29uc29sZVZpZXcuaW5zdGFuY2UoKS5zZWFyY2hhYmxlVmlldygpO319O0NvbnNvbGUuQ29uc29sZVBhbmVsLldyYXBwZXJWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnNvbGUtdmlldy13cmFwcGVyJyk7Q29uc29sZS5Db25zb2xlUGFuZWwuV3JhcHBlclZpZXcuX2luc3RhbmNlPXRoaXM7dGhpcy5fdmlldz1Db25zb2xlLkNvbnNvbGVWaWV3Lmluc3RhbmNlKCk7fQp3YXNTaG93bigpe2lmKCFDb25zb2xlLkNvbnNvbGVQYW5lbC5pbnN0YW5jZSgpLmlzU2hvd2luZygpKQp0aGlzLl9zaG93Vmlld0luV3JhcHBlcigpO2Vsc2UKVUkuaW5zcGVjdG9yVmlldy5zZXREcmF3ZXJNaW5pbWl6ZWQodHJ1ZSk7fQp3aWxsSGlkZSgpe1VJLmluc3BlY3RvclZpZXcuc2V0RHJhd2VyTWluaW1pemVkKGZhbHNlKTt9Cl9zaG93Vmlld0luV3JhcHBlcigpe3RoaXMuX3ZpZXcuc2hvdyh0aGlzLmVsZW1lbnQpO319O0NvbnNvbGUuQ29uc29sZVBhbmVsLkNvbnNvbGVSZXZlYWxlcj1jbGFzc3tyZXZlYWwob2JqZWN0KXtjb25zdCBjb25zb2xlVmlldz1Db25zb2xlLkNvbnNvbGVWaWV3Lmluc3RhbmNlKCk7aWYoY29uc29sZVZpZXcuaXNTaG93aW5nKCkpe2NvbnNvbGVWaWV3LmZvY3VzKCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KVUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ2NvbnNvbGUtdmlldycpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNvbnNvbGUvY29uc29sZUNvbnRleHRTZWxlY3Rvci5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgcGFkZGluZzogMnB4IDFweCAycHggMnB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGhlaWdodDogMzZweDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLnRpdGxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGZsZXgtZ3JvdzogMDtcbn1cblxuLmJhZGdlIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAxNXB4O1xufVxuXG4uc3VidGl0bGUge1xuICAgIGNvbG9yOiAjOTk5O1xuICAgIG1hcmdpbi1yaWdodDogM3B4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZmxleC1ncm93OiAwO1xufVxuXG46aG9zdCguaGlnaGxpZ2h0ZWQpIC5zdWJ0aXRsZSB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9Y29uc29sZS9jb25zb2xlQ29udGV4dFNlbGVjdG9yLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNvbnNvbGUvY29uc29sZVBpblBhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmNvbnNvbGUtcGlucyB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIGJhY2tncm91bmQ6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG4uY29uc29sZS1waW5zOm5vdCg6ZW1wdHkpIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xuICBwYWRkaW5nOiA1cHggMjhweCAwIDI0cHg7XG59XG5cbi5jb25zb2xlLXBpbiB7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB1c2VyLXNlbGVjdDogdGV4dDtcbiAgZmxleDogbm9uZTtcbiAgcGFkZGluZy1ib3R0b206IDZweDtcbn1cblxuLmNvbnNvbGUtcGluOm5vdCg6bGFzdC1jaGlsZCkge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U0ZTRlNDtcbn1cblxuLmNvbnNvbGUtcGluLW5hbWUge1xuICBtYXJnaW4tbGVmdDogLTRweDtcbiAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5jb25zb2xlLXBpbi1uYW1lLFxuLmNvbnNvbGUtcGluLXByZXZpZXcge1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jb25zb2xlLWRlbGV0ZS1waW4ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICBsZWZ0OiAtMTZweDtcbiAgb3BhY2l0eTogMC41O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jb25zb2xlLWRlbGV0ZS1waW46aG92ZXIge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29uc29sZS1waW4tbmFtZTpmb2N1cy13aXRoaW4ge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3gtc2hhZG93OiB2YXIoLS1mb2N1cy1yaW5nLWFjdGl2ZS1zaGFkb3cpO1xufVxuXG4uY29uc29sZS1waW4tbmFtZTpub3QoOmZvY3VzLXdpdGhpbik6bm90KDpob3Zlcikge1xuICBvcGFjaXR5OiAwLjY7XG59XG5cbi8qIyBzb3VyY2VVUkw9Y29uc29sZS9jb25zb2xlUGluUGFuZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjb25zb2xlL2NvbnNvbGVTaWRlYmFyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG59XG5cbi50cmVlLW91dGxpbmUtZGlzY2xvc3VyZSB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctbGVmdDogNnB4O1xufVxuXG4uY291bnQge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgbWFyZ2luOiAwIDhweDtcbn1cblxuW2lzPXVpLWljb25dIHtcbiAgICBtYXJnaW46IDAgNXB4O1xufVxuXG5baXM9dWktaWNvbl0uaWNvbi13YXJuaW5nIHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbGEoNDgsIDEwMCUsIDUwJSwgMSksIGhzbGEoNDgsIDcwJSwgNTAlLCAxKSk7XG59XG5cbmxpIHtcbiAgICBoZWlnaHQ6IDI0cHg7XG59XG5cbmxpIC5sYXJnZWljb24tbmF2aWdhdG9yLWZpbGUge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDQ4LCA3MCUsIDUwJSksIGhzbCg0OCwgNzAlLCA3MCUpKTtcbiAgICBtYXJnaW46IDA7XG59XG5cbmxpIC5sYXJnZWljb24tbmF2aWdhdG9yLWZvbGRlciB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCBoc2woMjEwLCA4MiUsIDY1JSksIGhzbCgyMTAsIDgyJSwgODAlKSk7XG4gICAgbWFyZ2luOiAtM3B4IC0zcHggMCAtNXB4O1xufVxuXG4udHJlZS1lbGVtZW50LXRpdGxlIHtcbiAgICBmbGV4LXNocmluazogMTAwO1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOmhvdmVyOm5vdCguc2VsZWN0ZWQpIC5zZWxlY3Rpb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTYsIDEyMSwgMjE3LCAwLjEpO1xufVxuXG4vKiMgc291cmNlVVJMPWNvbnNvbGUvY29uc29sZVNpZGViYXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY29uc29sZS9jb25zb2xlVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChDKSAyMDA5IEFudGhvbnkgUmljYXVkIDxyaWtAd2Via2l0Lm9yZz5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqXG4gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIChcIkFwcGxlXCIpIG5vciB0aGUgbmFtZXMgb2ZcbiAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLmNvbnNvbGUtdmlldyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmNvbnNvbGUtdG9vbGJhci1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmNvbnNvbGUtbWFpbi10b29sYmFyIHtcbiAgICBmbGV4OiAxIDEgYXV0bztcbn1cblxuLmNvbnNvbGUtdG9vbGJhci1jb250YWluZXIgPiAudG9vbGJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xufVxuXG4uY29uc29sZS12aWV3LXdyYXBwZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi5jb25zb2xlLXZpZXctZml4LXNlbGVjdC1hbGwge1xuICAgIGhlaWdodDogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uY29uc29sZS1zZXR0aW5ncy1wYW5lIHtcbiAgICBmbGV4OiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLmNvbnNvbGUtc2V0dGluZ3MtcGFuZSAudG9vbGJhciB7XG4gICAgZmxleDogMSAxO1xufVxuXG4jY29uc29sZS1tZXNzYWdlcyB7XG4gICAgZmxleDogMSAxO1xuICAgIHBhZGRpbmc6IDJweCAwO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xufVxuXG4jY29uc29sZS1wcm9tcHQge1xuICAgIGNsZWFyOiByaWdodDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwIDIycHggMCAyMHB4O1xuICAgIG1pbi1oZWlnaHQ6IDE4cHg7ICAvKiBTeW5jIHdpdGggQ29uc29sZVZpZXdNZXNzYWdlLmpzICovXG59XG5cbiNjb25zb2xlLXByb21wdCAuQ29kZU1pcnJvciB7XG4gICAgcGFkZGluZzogM3B4IDAgMXB4IDA7XG59XG5cbiNjb25zb2xlLXByb21wdCAuQ29kZU1pcnJvci1saW5lIHtcbiAgICBwYWRkaW5nLXRvcDogMDtcbn1cblxuI2NvbnNvbGUtcHJvbXB0IC5Db2RlTWlycm9yLWxpbmVzIHtcbiAgICBwYWRkaW5nLXRvcDogMDtcbn1cblxuI2NvbnNvbGUtcHJvbXB0IC5jb25zb2xlLXByb21wdC1pY29uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogLTEzcHg7XG4gICAgdG9wOiA1cHg7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZSxcbi5jb25zb2xlLXVzZXItY29tbWFuZCB7XG4gICAgY2xlYXI6IHJpZ2h0O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBwYWRkaW5nOiAzcHggMjJweCAxcHggMDtcbiAgICBtYXJnaW4tbGVmdDogMjRweDtcbiAgICBtaW4taGVpZ2h0OiAxOHB4OyAgLyogU3luYyB3aXRoIENvbnNvbGVWaWV3TWVzc2FnZS5qcyAqL1xuICAgIGZsZXg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZSA+ICoge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5jb25zb2xlLXRpbWVzdGFtcCB7XG4gICAgY29sb3I6IGdyYXk7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBmbGV4OiBub25lO1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xufVxuXG4ubWVzc2FnZS1sZXZlbC1pY29uLCAuY29tbWFuZC1yZXN1bHQtaWNvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IC0xN3B4O1xuICAgIHRvcDogNHB4O1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2UtcmVwZWF0LWNvdW50IHtcbiAgICBtYXJnaW46IDJweCAwIDAgMTBweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4ucmVwZWF0ZWQtbWVzc2FnZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDRweDtcbn1cblxuLnJlcGVhdGVkLW1lc3NhZ2UgLm1lc3NhZ2UtbGV2ZWwtaWNvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnJlcGVhdGVkLW1lc3NhZ2UgLmNvbnNvbGUtbWVzc2FnZS1zdGFjay10cmFjZS10b2dnbGUsXG4ucmVwZWF0ZWQtbWVzc2FnZSA+IC5jb25zb2xlLW1lc3NhZ2UtdGV4dCB7XG4gICAgZmxleDogMTtcbn1cblxuLmNvbnNvbGUtZXJyb3ItbGV2ZWwgLnJlcGVhdGVkLW1lc3NhZ2UsXG4uY29uc29sZS13YXJuaW5nLWxldmVsIC5yZXBlYXRlZC1tZXNzYWdlLFxuLmNvbnNvbGUtdmVyYm9zZS1sZXZlbCAucmVwZWF0ZWQtbWVzc2FnZSxcbi5jb25zb2xlLWluZm8tbGV2ZWwgLnJlcGVhdGVkLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5jb25zb2xlLWluZm8ge1xuICAgIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIHBhZGRpbmctYm90dG9tOiAycHg7XG59XG5cbi5jb25zb2xlLWdyb3VwIC5jb25zb2xlLWdyb3VwID4gLmNvbnNvbGUtZ3JvdXAtbWVzc2FnZXMge1xuICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xufVxuXG4uY29uc29sZS1ncm91cC10aXRsZS5jb25zb2xlLWZyb20tYXBpIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtdGl0bGUgLmNvbnNvbGUtbWVzc2FnZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEycHg7XG59XG5cbi5leHBhbmQtZ3JvdXAtaWNvbiB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBmbGV4OiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogMTBweDtcbiAgICB0b3A6IDVweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtdGl0bGUgLm1lc3NhZ2UtbGV2ZWwtaWNvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS1yZXBlYXQtY291bnQgLmV4cGFuZC1ncm91cC1pY29uIHtcbiAgICBsZWZ0OiAycHg7XG4gICAgdG9wOiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS13cmFwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjQwLCAyNDAsIDI0MCk7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2Utd3JhcHBlci5jb25zb2xlLWFkamFjZW50LXVzZXItY29tbWFuZC1yZXN1bHQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2Utd3JhcHBlci5jb25zb2xlLWVycm9yLWxldmVsIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgaHNsKDAsIDEwMCUsIDkyJSk7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGhzbCgwLCAxMDAlLCA5MiUpO1xuICAgIG1hcmdpbi10b3A6IC0xcHg7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2Utd3JhcHBlci5jb25zb2xlLXdhcm5pbmctbGV2ZWwge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBoc2woNTAsIDEwMCUsIDg4JSk7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGhzbCg1MCwgMTAwJSwgODglKTtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xufVxuXG4uY29uc29sZS1tZXNzYWdlLXdyYXBwZXIgLm5lc3RpbmctbGV2ZWwtbWFya2VyIHtcbiAgICB3aWR0aDogMTRweDtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYTVhNWE1O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tYm90dG9tOiAtMXB4O1xufVxuXG4uY29uc29sZS1tZXNzYWdlLXdyYXBwZXI6bGFzdC1jaGlsZCAubmVzdGluZy1sZXZlbC1tYXJrZXI6OmJlZm9yZSxcbi5jb25zb2xlLW1lc3NhZ2Utd3JhcHBlciAubmVzdGluZy1sZXZlbC1tYXJrZXIuZ3JvdXAtY2xvc2VkOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2Utd3JhcHBlciAubmVzdGluZy1sZXZlbC1tYXJrZXI6OmJlZm9yZSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhNWE1YTU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAxMDAlO1xuICAgIHdpZHRoOiAzcHg7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5jb25zb2xlLWVycm9yLWxldmVsIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMTAwJSwgOTclKTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuY29uc29sZS1lcnJvci1sZXZlbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDEwMCUsIDglKTtcbn1cblxuLmNvbnNvbGUtd2FybmluZy1sZXZlbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDUwLCAxMDAlLCA5NSUpO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jb25zb2xlLXdhcm5pbmctbGV2ZWwge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCg1MCwgMTAwJSwgMTAlKTtcbn1cblxuLmNvbnNvbGUtd2FybmluZy1sZXZlbCAuY29uc29sZS1tZXNzYWdlLXRleHQge1xuICAgIGNvbG9yOiBoc2woMzksIDEwMCUsIDE4JSk7XG59XG5cbi5jb25zb2xlLWVycm9yLWxldmVsIC5jb25zb2xlLW1lc3NhZ2UtdGV4dCxcbi5jb25zb2xlLWVycm9yLWxldmVsIC5jb25zb2xlLXZpZXctb2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbiB7XG4gICAgY29sb3I6IHJlZCAhaW1wb3J0YW50O1xufVxuXG4uY29uc29sZS1zeXN0ZW0tdHlwZS5jb25zb2xlLWluZm8tbGV2ZWwge1xuICAgIGNvbG9yOiBibHVlO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jb25zb2xlLWVycm9yLWxldmVsIC5jb25zb2xlLW1lc3NhZ2UtdGV4dCxcbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmNvbnNvbGUtZXJyb3ItbGV2ZWwgLmNvbnNvbGUtdmlldy1vYmplY3QtcHJvcGVydGllcy1zZWN0aW9uIHtcbiAgICBjb2xvcjogaHNsKDAsIDEwMCUsIDc1JSkgIWltcG9ydGFudDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuY29uc29sZS12ZXJib3NlLWxldmVsOm5vdCguY29uc29sZS13YXJuaW5nLWxldmVsKSAuY29uc29sZS1tZXNzYWdlLXRleHQsXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jb25zb2xlLXN5c3RlbS10eXBlLmNvbnNvbGUtaW5mby1sZXZlbCB7XG4gICAgY29sb3I6IGhzbCgyMjAsIDEwMCUsIDY1JSkgIWltcG9ydGFudDtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS5jb25zb2xlLXdhcm5pbmctbGV2ZWwge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1MCwgMjI0KTtcbn1cblxuI2NvbnNvbGUtbWVzc2FnZXMgLmxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4jY29uc29sZS1tZXNzYWdlcyAubGluayxcbiNjb25zb2xlLW1lc3NhZ2VzIC5kZXZ0b29scy1saW5rIHtcbiAgICBjb2xvcjogcmdiKDMzJSwgMzMlLCAzMyUpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7XG59XG5cbiNjb25zb2xlLW1lc3NhZ2VzIC5saW5rOmhvdmVyLFxuI2NvbnNvbGUtbWVzc2FnZXMgLmRldnRvb2xzLWxpbms6aG92ZXIge1xuICAgIGNvbG9yOiByZ2IoMTUlLCAxNSUsIDE1JSk7XG59XG5cbi5jb25zb2xlLWdyb3VwLW1lc3NhZ2VzIC5zZWN0aW9uIHtcbiAgICBtYXJnaW46IDAgMCAwIDEycHggIWltcG9ydGFudDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtbWVzc2FnZXMgLnNlY3Rpb24gPiAuaGVhZGVyIHtcbiAgICBwYWRkaW5nOiAwIDhweCAwIDA7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWluLWhlaWdodDogMDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtbWVzc2FnZXMgLnNlY3Rpb24gPiAuaGVhZGVyOjpiZWZvcmUge1xuICAgIG1hcmdpbi1sZWZ0OiAtMTJweDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtbWVzc2FnZXMgLnNlY3Rpb24gPiAuaGVhZGVyIC50aXRsZSB7XG4gICAgY29sb3I6ICMyMjI7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBsaW5lLWhlaWdodDogMTNweDtcbn1cblxuLmNvbnNvbGUtZ3JvdXAtbWVzc2FnZXMgLnNlY3Rpb24gLnByb3BlcnRpZXMgbGkgLmluZm8ge1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgIGNvbG9yOiByZ2IoNjAlLCA2MCUsIDYwJSk7XG59XG5cbi5jb25zb2xlLW9iamVjdC1wcmV2aWV3IHtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5jb25zb2xlLW9iamVjdC1wcmV2aWV3IC5uYW1lIHtcbiAgICAvKiBGb2xsb3dzIC5zZWN0aW9uIC5wcm9wZXJ0aWVzIC5uYW1lLCAuZXZlbnQtcHJvcGVydGllcyAubmFtZSAqL1xuICAgIGNvbG9yOiByZ2IoMTM2LCAxOSwgMTQ1KTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS10ZXh0IC5vYmplY3QtdmFsdWUtc3RyaW5nLFxuLmNvbnNvbGUtbWVzc2FnZS10ZXh0IC5vYmplY3QtdmFsdWUtcmVnZXhwLFxuLmNvbnNvbGUtbWVzc2FnZS10ZXh0IC5vYmplY3QtdmFsdWUtc3ltYm9sIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuXG4uY29uc29sZS1tZXNzYWdlLWZvcm1hdHRlZC10YWJsZSB7XG4gICAgY2xlYXI6IGJvdGg7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2UtYW5jaG9yIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG59XG5cbi5jb25zb2xlLW1lc3NhZ2UtYmFkZ2Uge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xufVxuXG4uY29uc29sZS1tZXNzYWdlLW5vd3JhcC1iZWxvdyxcbi5jb25zb2xlLW1lc3NhZ2Utbm93cmFwLWJlbG93IGRpdixcbi5jb25zb2xlLW1lc3NhZ2Utbm93cmFwLWJlbG93IHNwYW4ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXAgIWltcG9ydGFudDtcbn1cblxuLm9iamVjdC1zdGF0ZS1ub3RlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDExcHg7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIGxpbmUtaGVpZ2h0OiAxM3B4O1xuICAgIG1hcmdpbjogMCA2cHg7XG4gICAgZm9udC1zaXplOiA5cHg7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLm9iamVjdC1zdGF0ZS1ub3RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjMwLCAxMDAlLCA4MCUpO1xufVxuXG4uaW5mby1ub3RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTc5LCAyMDMsIDI0Nyk7XG59XG5cbi5pbmZvLW5vdGU6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCJpXCI7XG59XG5cbi5jb25zb2xlLXZpZXctb2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbjpub3QoLmV4cGFuZGVkKSAuaW5mby1ub3RlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uY29uc29sZS12aWV3LW9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24ge1xuICAgIHBhZGRpbmc6IDBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICAgIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmNvbnNvbGUtb2JqZWN0IHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuXG4uY29uc29sZS1tZXNzYWdlLXN0YWNrLXRyYWNlLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuXG4uY29uc29sZS1tZXNzYWdlLXN0YWNrLXRyYWNlLXdyYXBwZXIge1xuICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS1zdGFjay10cmFjZS13cmFwcGVyID4gKiB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmNvbnNvbGUtbWVzc2FnZS1leHBhbmQtaWNvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogLTJweDtcbn1cblxuLmNvbnNvbGUtc2VhcmNoYWJsZS12aWV3IHtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuXG4uY29uc29sZS1lYWdlci1wcmV2aWV3IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMnB4O1xuICAgIG9wYWNpdHk6IDAuNjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiAxNXB4O1xufVxuXG4uY29uc29sZS1lYWdlci1pbm5lci1wcmV2aWV3IHtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uY29uc29sZS1lYWdlci1pbm5lci1wcmV2aWV3ICoge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jb25zb2xlLWVhZ2VyLWlubmVyLXByZXZpZXc6ZW1wdHksXG4uY29uc29sZS1lYWdlci1pbm5lci1wcmV2aWV3OmVtcHR5ICsgLnByZXZpZXctcmVzdWx0LWljb24ge1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5wcmV2aWV3LXJlc3VsdC1pY29uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogLTEzcHg7XG4gICAgdG9wOiAxcHg7XG59XG5cbi5jb25zb2xlLXZpZXctcGlucGFuZSB7XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXgtaGVpZ2h0OiAyMDBweDtcbn1cblxuLmNvbW1hbmQtcGluLWJ1dHRvbjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnXFwxZjRjYyc7XG59XG5cbi5jb21tYW5kLXBpbi1idXR0b24ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxcHg7XG4gICAgcmlnaHQ6IC00MHB4O1xuICAgIG9wYWNpdHk6IDA7XG4gICAgd2lkdGg6IDQwcHg7XG59XG5cbiNjb25zb2xlLXByb21wdDpob3ZlciAuY29tbWFuZC1waW4tYnV0dG9uIHtcbiAgICBvcGFjaXR5OiAwLjEyO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kICNjb25zb2xlLXByb21wdDpob3ZlciAuY29tbWFuZC1waW4tYnV0dG9uIHtcbiAgICBvcGFjaXR5OiAwLjI1O1xufVxuXG4jY29uc29sZS1wcm9tcHQ6aG92ZXIgLmNvbW1hbmQtcGluLWJ1dHRvbjpob3ZlciB7XG4gICAgb3BhY2l0eTogMC42O1xufVxuXG4vKiMgc291cmNlVVJMPWNvbnNvbGUvY29uc29sZVZpZXcuY3NzICovIjtDb29raWVUYWJsZS5Db29raWVzVGFibGU9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHNhdmVDYWxsYmFjayxyZWZyZXNoQ2FsbGJhY2ssc2VsZWN0ZWRDYWxsYmFjayxkZWxldGVDYWxsYmFjayl7c3VwZXIoKTt0aGlzLl9zYXZlQ2FsbGJhY2s9c2F2ZUNhbGxiYWNrO3RoaXMuX3JlZnJlc2hDYWxsYmFjaz1yZWZyZXNoQ2FsbGJhY2s7dGhpcy5fZGVsZXRlQ2FsbGJhY2s9ZGVsZXRlQ2FsbGJhY2s7Y29uc3QgZWRpdGFibGU9ISFzYXZlQ2FsbGJhY2s7Y29uc3QgY29sdW1ucz0oW3tpZDonbmFtZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdOYW1lJyksc29ydGFibGU6dHJ1ZSxkaXNjbG9zdXJlOmVkaXRhYmxlLHNvcnQ6RGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuQXNjZW5kaW5nLGxvbmdUZXh0OnRydWUsd2VpZ2h0OjI0LGVkaXRhYmxlOmVkaXRhYmxlfSx7aWQ6J3ZhbHVlJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ZhbHVlJyksc29ydGFibGU6dHJ1ZSxsb25nVGV4dDp0cnVlLHdlaWdodDozNCxlZGl0YWJsZTplZGl0YWJsZX0se2lkOidkb21haW4nLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnRG9tYWluJyksc29ydGFibGU6dHJ1ZSx3ZWlnaHQ6NyxlZGl0YWJsZTplZGl0YWJsZX0se2lkOidwYXRoJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1BhdGgnKSxzb3J0YWJsZTp0cnVlLHdlaWdodDo3LGVkaXRhYmxlOmVkaXRhYmxlfSx7aWQ6J2V4cGlyZXMnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnRXhwaXJlcyAvIE1heC1BZ2UnKSxzb3J0YWJsZTp0cnVlLHdlaWdodDo3LGVkaXRhYmxlOmVkaXRhYmxlfSx7aWQ6J3NpemUnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnU2l6ZScpLHNvcnRhYmxlOnRydWUsYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uUmlnaHQsd2VpZ2h0Ojd9LHtpZDonaHR0cE9ubHknLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnSFRUUCcpLHNvcnRhYmxlOnRydWUsYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uQ2VudGVyLHdlaWdodDo3fSx7aWQ6J3NlY3VyZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTZWN1cmUnKSxzb3J0YWJsZTp0cnVlLGFsaWduOkRhdGFHcmlkLkRhdGFHcmlkLkFsaWduLkNlbnRlcix3ZWlnaHQ6N30se2lkOidzYW1lU2l0ZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTYW1lU2l0ZScpLHNvcnRhYmxlOnRydWUsYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uQ2VudGVyLHdlaWdodDo3fV0pO2lmKGVkaXRhYmxlKXt0aGlzLl9kYXRhR3JpZD1uZXcgRGF0YUdyaWQuRGF0YUdyaWQoY29sdW1ucyx0aGlzLl9vblVwZGF0ZUNvb2tpZS5iaW5kKHRoaXMpLHRoaXMuX29uRGVsZXRlQ29va2llLmJpbmQodGhpcykscmVmcmVzaENhbGxiYWNrKTt9ZWxzZXt0aGlzLl9kYXRhR3JpZD1uZXcgRGF0YUdyaWQuRGF0YUdyaWQoY29sdW1ucyk7fQp0aGlzLl9kYXRhR3JpZC5zZXRTdHJpcGVkKHRydWUpO3RoaXMuX2RhdGFHcmlkLnNldE5hbWUoJ2Nvb2tpZXNUYWJsZScpO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDaGFuZ2VkLHRoaXMuX3JlYnVpbGRUYWJsZSx0aGlzKTtpZihzZWxlY3RlZENhbGxiYWNrKQp0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5TZWxlY3RlZE5vZGUsc2VsZWN0ZWRDYWxsYmFjayx0aGlzKTt0aGlzLl9sYXN0RWRpdGVkQ29sdW1uSWQ9bnVsbDt0aGlzLl9kYXRhR3JpZC5hc1dpZGdldCgpLnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9kYXRhPVtdO3RoaXMuX2Nvb2tpZURvbWFpbj0nJzt9CnNldENvb2tpZXMoY29va2llcyl7dGhpcy5zZXRDb29raWVGb2xkZXJzKFt7Y29va2llczpjb29raWVzfV0pO30Kc2V0Q29va2llRm9sZGVycyhjb29raWVGb2xkZXJzKXt0aGlzLl9kYXRhPWNvb2tpZUZvbGRlcnM7dGhpcy5fcmVidWlsZFRhYmxlKCk7fQpzZXRDb29raWVEb21haW4oY29va2llRG9tYWluKXt0aGlzLl9jb29raWVEb21haW49Y29va2llRG9tYWluO30Kc2VsZWN0ZWRDb29raWUoKXtjb25zdCBub2RlPXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTtyZXR1cm4gbm9kZT9ub2RlLmNvb2tpZTpudWxsO30KX2dldFNlbGVjdGlvbkNvb2tpZXMoKXtjb25zdCBub2RlPXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTtjb25zdCBuZXh0TmVpZ2hib3I9bm9kZSYmbm9kZS50cmF2ZXJzZU5leHROb2RlKHRydWUpO2NvbnN0IHByZXZpb3VzTmVpZ2hib3I9bm9kZSYmbm9kZS50cmF2ZXJzZVByZXZpb3VzTm9kZSh0cnVlKTtyZXR1cm57Y3VycmVudDpub2RlJiZub2RlLmNvb2tpZSxuZWlnaGJvcjoobmV4dE5laWdoYm9yJiZuZXh0TmVpZ2hib3IuY29va2llKXx8KHByZXZpb3VzTmVpZ2hib3ImJnByZXZpb3VzTmVpZ2hib3IuY29va2llKX07fQp3aWxsSGlkZSgpe3RoaXMuX2xhc3RFZGl0ZWRDb2x1bW5JZD1udWxsO30KX2ZpbmRTZWxlY3RlZENvb2tpZShzZWxlY3Rpb25Db29raWVzLGNvb2tpZXMpe2lmKCFjb29raWVzKQpyZXR1cm4gbnVsbDtjb25zdCBjdXJyZW50PXNlbGVjdGlvbkNvb2tpZXMuY3VycmVudDtjb25zdCBmb3VuZEN1cnJlbnQ9Y29va2llcy5maW5kKGNvb2tpZT0+dGhpcy5faXNTYW1lQ29va2llKGNvb2tpZSxjdXJyZW50KSk7aWYoZm91bmRDdXJyZW50KQpyZXR1cm4gZm91bmRDdXJyZW50O2NvbnN0IG5laWdoYm9yPXNlbGVjdGlvbkNvb2tpZXMubmVpZ2hib3I7Y29uc3QgZm91bmROZWlnaGJvcj1jb29raWVzLmZpbmQoY29va2llPT50aGlzLl9pc1NhbWVDb29raWUoY29va2llLG5laWdoYm9yKSk7aWYoZm91bmROZWlnaGJvcikKcmV0dXJuIGZvdW5kTmVpZ2hib3I7cmV0dXJuIG51bGw7fQpfaXNTYW1lQ29va2llKGNvb2tpZUEsY29va2llQil7cmV0dXJuISFjb29raWVCJiZjb29raWVCLm5hbWUoKT09PWNvb2tpZUEubmFtZSgpJiZjb29raWVCLmRvbWFpbigpPT09Y29va2llQS5kb21haW4oKSYmY29va2llQi5wYXRoKCk9PT1jb29raWVBLnBhdGgoKTt9Cl9yZWJ1aWxkVGFibGUoKXtjb25zdCBzZWxlY3Rpb25Db29raWVzPXRoaXMuX2dldFNlbGVjdGlvbkNvb2tpZXMoKTtjb25zdCBsYXN0RWRpdGVkQ29sdW1uSWQ9dGhpcy5fbGFzdEVkaXRlZENvbHVtbklkO3RoaXMuX2xhc3RFZGl0ZWRDb2x1bW5JZD1udWxsO3RoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTtmb3IobGV0IGk9MDtpPHRoaXMuX2RhdGEubGVuZ3RoOysraSl7Y29uc3QgaXRlbT10aGlzLl9kYXRhW2ldO2NvbnN0IHNlbGVjdGVkQ29va2llPXRoaXMuX2ZpbmRTZWxlY3RlZENvb2tpZShzZWxlY3Rpb25Db29raWVzLGl0ZW0uY29va2llcyk7aWYoaXRlbS5mb2xkZXJOYW1lKXtjb25zdCBncm91cERhdGE9e25hbWU6aXRlbS5mb2xkZXJOYW1lLHZhbHVlOicnLGRvbWFpbjonJyxwYXRoOicnLGV4cGlyZXM6Jycsc2l6ZTp0aGlzLl90b3RhbFNpemUoaXRlbS5jb29raWVzKSxodHRwT25seTonJyxzZWN1cmU6Jycsc2FtZVNpdGU6Jyd9O2NvbnN0IGdyb3VwTm9kZT1uZXcgRGF0YUdyaWQuRGF0YUdyaWROb2RlKGdyb3VwRGF0YSk7Z3JvdXBOb2RlLnNlbGVjdGFibGU9dHJ1ZTt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmFwcGVuZENoaWxkKGdyb3VwTm9kZSk7Z3JvdXBOb2RlLmVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCdyb3ctZ3JvdXAnKTt0aGlzLl9wb3B1bGF0ZU5vZGUoZ3JvdXBOb2RlLGl0ZW0uY29va2llcyxzZWxlY3RlZENvb2tpZSxsYXN0RWRpdGVkQ29sdW1uSWQpO2dyb3VwTm9kZS5leHBhbmQoKTt9ZWxzZXt0aGlzLl9wb3B1bGF0ZU5vZGUodGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKSxpdGVtLmNvb2tpZXMsc2VsZWN0ZWRDb29raWUsbGFzdEVkaXRlZENvbHVtbklkKTt9fQppZihzZWxlY3Rpb25Db29raWVzLmN1cnJlbnQmJmxhc3RFZGl0ZWRDb2x1bW5JZCYmIXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZSkKdGhpcy5fYWRkSW5hY3RpdmVOb2RlKHRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCksc2VsZWN0aW9uQ29va2llcy5jdXJyZW50LGxhc3RFZGl0ZWRDb2x1bW5JZCk7aWYodGhpcy5fc2F2ZUNhbGxiYWNrKQp0aGlzLl9kYXRhR3JpZC5hZGRDcmVhdGlvbk5vZGUoZmFsc2UpO30KX3BvcHVsYXRlTm9kZShwYXJlbnROb2RlLGNvb2tpZXMsc2VsZWN0ZWRDb29raWUsbGFzdEVkaXRlZENvbHVtbklkKXtwYXJlbnROb2RlLnJlbW92ZUNoaWxkcmVuKCk7aWYoIWNvb2tpZXMpCnJldHVybjt0aGlzLl9zb3J0Q29va2llcyhjb29raWVzKTtmb3IobGV0IGk9MDtpPGNvb2tpZXMubGVuZ3RoOysraSl7Y29uc3QgY29va2llPWNvb2tpZXNbaV07Y29uc3QgY29va2llTm9kZT10aGlzLl9jcmVhdGVHcmlkTm9kZShjb29raWUpO3BhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY29va2llTm9kZSk7aWYodGhpcy5faXNTYW1lQ29va2llKGNvb2tpZSxzZWxlY3RlZENvb2tpZSkpe2Nvb2tpZU5vZGUuc2VsZWN0KCk7aWYobGFzdEVkaXRlZENvbHVtbklkIT09bnVsbCkKdGhpcy5fZGF0YUdyaWQuc3RhcnRFZGl0aW5nTmV4dEVkaXRhYmxlQ29sdW1uT2ZEYXRhR3JpZE5vZGUoY29va2llTm9kZSxsYXN0RWRpdGVkQ29sdW1uSWQpO319fQpfYWRkSW5hY3RpdmVOb2RlKHBhcmVudE5vZGUsY29va2llLGVkaXRlZENvbHVtbklkKXtjb25zdCBjb29raWVOb2RlPXRoaXMuX2NyZWF0ZUdyaWROb2RlKGNvb2tpZSk7cGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjb29raWVOb2RlKTtjb29raWVOb2RlLnNlbGVjdCgpO2Nvb2tpZU5vZGUuc2V0SW5hY3RpdmUodHJ1ZSk7aWYoZWRpdGVkQ29sdW1uSWQhPT1udWxsKQp0aGlzLl9kYXRhR3JpZC5zdGFydEVkaXRpbmdOZXh0RWRpdGFibGVDb2x1bW5PZkRhdGFHcmlkTm9kZShjb29raWVOb2RlLGVkaXRlZENvbHVtbklkKTt9Cl90b3RhbFNpemUoY29va2llcyl7bGV0IHRvdGFsU2l6ZT0wO2ZvcihsZXQgaT0wO2Nvb2tpZXMmJmk8Y29va2llcy5sZW5ndGg7KytpKQp0b3RhbFNpemUrPWNvb2tpZXNbaV0uc2l6ZSgpO3JldHVybiB0b3RhbFNpemU7fQpfc29ydENvb2tpZXMoY29va2llcyl7Y29uc3Qgc29ydERpcmVjdGlvbj10aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpPzE6LTE7ZnVuY3Rpb24gZ2V0VmFsdWUoY29va2llLHByb3BlcnR5KXtyZXR1cm4gdHlwZW9mIGNvb2tpZVtwcm9wZXJ0eV09PT0nZnVuY3Rpb24nP1N0cmluZyhjb29raWVbcHJvcGVydHldKCkpOlN0cmluZyhjb29raWUubmFtZSgpKTt9CmZ1bmN0aW9uIGNvbXBhcmVUbyhwcm9wZXJ0eSxjb29raWUxLGNvb2tpZTIpe3JldHVybiBzb3J0RGlyZWN0aW9uKmdldFZhbHVlKGNvb2tpZTEscHJvcGVydHkpLmNvbXBhcmVUbyhnZXRWYWx1ZShjb29raWUyLHByb3BlcnR5KSk7fQpmdW5jdGlvbiBudW1iZXJDb21wYXJlKGNvb2tpZTEsY29va2llMil7cmV0dXJuIHNvcnREaXJlY3Rpb24qKGNvb2tpZTEuc2l6ZSgpLWNvb2tpZTIuc2l6ZSgpKTt9CmZ1bmN0aW9uIGV4cGlyZXNDb21wYXJlKGNvb2tpZTEsY29va2llMil7aWYoY29va2llMS5zZXNzaW9uKCkhPT1jb29raWUyLnNlc3Npb24oKSkKcmV0dXJuIHNvcnREaXJlY3Rpb24qKGNvb2tpZTEuc2Vzc2lvbigpPzE6LTEpO2lmKGNvb2tpZTEuc2Vzc2lvbigpKQpyZXR1cm4gMDtpZihjb29raWUxLm1heEFnZSgpJiZjb29raWUyLm1heEFnZSgpKQpyZXR1cm4gc29ydERpcmVjdGlvbiooY29va2llMS5tYXhBZ2UoKS1jb29raWUyLm1heEFnZSgpKTtpZihjb29raWUxLmV4cGlyZXMoKSYmY29va2llMi5leHBpcmVzKCkpCnJldHVybiBzb3J0RGlyZWN0aW9uKihjb29raWUxLmV4cGlyZXMoKS1jb29raWUyLmV4cGlyZXMoKSk7cmV0dXJuIHNvcnREaXJlY3Rpb24qKGNvb2tpZTEuZXhwaXJlcygpPzE6LTEpO30KbGV0IGNvbXBhcmF0b3I7Y29uc3QgY29sdW1uSWQ9dGhpcy5fZGF0YUdyaWQuc29ydENvbHVtbklkKCl8fCduYW1lJztpZihjb2x1bW5JZD09PSdleHBpcmVzJykKY29tcGFyYXRvcj1leHBpcmVzQ29tcGFyZTtlbHNlIGlmKGNvbHVtbklkPT09J3NpemUnKQpjb21wYXJhdG9yPW51bWJlckNvbXBhcmU7ZWxzZQpjb21wYXJhdG9yPWNvbXBhcmVUby5iaW5kKG51bGwsY29sdW1uSWQpO2Nvb2tpZXMuc29ydChjb21wYXJhdG9yKTt9Cl9jcmVhdGVHcmlkTm9kZShjb29raWUpe2NvbnN0IGRhdGE9e307ZGF0YS5uYW1lPWNvb2tpZS5uYW1lKCk7ZGF0YS52YWx1ZT1jb29raWUudmFsdWUoKTtpZihjb29raWUudHlwZSgpPT09U0RLLkNvb2tpZS5UeXBlLlJlcXVlc3Qpe2RhdGEuZG9tYWluPUNvbW1vbi5VSVN0cmluZygnTi9BJyk7ZGF0YS5wYXRoPUNvbW1vbi5VSVN0cmluZygnTi9BJyk7ZGF0YS5leHBpcmVzPUNvbW1vbi5VSVN0cmluZygnTi9BJyk7fWVsc2V7ZGF0YS5kb21haW49Y29va2llLmRvbWFpbigpfHwnJztkYXRhLnBhdGg9Y29va2llLnBhdGgoKXx8Jyc7aWYoY29va2llLm1heEFnZSgpKQpkYXRhLmV4cGlyZXM9TnVtYmVyLnNlY29uZHNUb1N0cmluZyhwYXJzZUludChjb29raWUubWF4QWdlKCksMTApKTtlbHNlIGlmKGNvb2tpZS5leHBpcmVzKCkpCmRhdGEuZXhwaXJlcz1uZXcgRGF0ZShjb29raWUuZXhwaXJlcygpKS50b0lTT1N0cmluZygpO2Vsc2UKZGF0YS5leHBpcmVzPUNvb2tpZVRhYmxlLkNvb2tpZXNUYWJsZS5fZXhwaXJlc1Nlc3Npb25WYWx1ZTt9CmRhdGEuc2l6ZT1jb29raWUuc2l6ZSgpO2NvbnN0IGNoZWNrbWFyaz0nXHUyNzEzJztkYXRhLmh0dHBPbmx5PShjb29raWUuaHR0cE9ubHkoKT9jaGVja21hcms6JycpO2RhdGEuc2VjdXJlPShjb29raWUuc2VjdXJlKCk/Y2hlY2ttYXJrOicnKTtkYXRhLnNhbWVTaXRlPWNvb2tpZS5zYW1lU2l0ZSgpfHwnJztjb25zdCBub2RlPW5ldyBEYXRhR3JpZC5EYXRhR3JpZE5vZGUoZGF0YSk7bm9kZS5jb29raWU9Y29va2llO25vZGUuc2VsZWN0YWJsZT10cnVlO3JldHVybiBub2RlO30KX29uRGVsZXRlQ29va2llKG5vZGUpe2lmKG5vZGUuY29va2llJiZ0aGlzLl9kZWxldGVDYWxsYmFjaykKdGhpcy5fZGVsZXRlQ2FsbGJhY2sobm9kZS5jb29raWUsKCk9PnRoaXMuX3JlZnJlc2goKSk7fQpfb25VcGRhdGVDb29raWUoZWRpdGluZ05vZGUsY29sdW1uSWRlbnRpZmllcixvbGRUZXh0LG5ld1RleHQpe3RoaXMuX2xhc3RFZGl0ZWRDb2x1bW5JZD1jb2x1bW5JZGVudGlmaWVyO3RoaXMuX3NldERlZmF1bHRzKGVkaXRpbmdOb2RlKTtpZih0aGlzLl9pc1ZhbGlkQ29va2llRGF0YShlZGl0aW5nTm9kZS5kYXRhKSkKdGhpcy5fc2F2ZU5vZGUoZWRpdGluZ05vZGUpO2Vsc2UKZWRpdGluZ05vZGUuc2V0RGlydHkodHJ1ZSk7fQpfc2V0RGVmYXVsdHMobm9kZSl7aWYobm9kZS5kYXRhLm5hbWU9PT1udWxsKQpub2RlLmRhdGEubmFtZT0nJztpZihub2RlLmRhdGEudmFsdWU9PT1udWxsKQpub2RlLmRhdGEudmFsdWU9Jyc7aWYobm9kZS5kYXRhLmRvbWFpbj09PW51bGwpCm5vZGUuZGF0YS5kb21haW49dGhpcy5fY29va2llRG9tYWluO2lmKG5vZGUuZGF0YS5wYXRoPT09bnVsbCkKbm9kZS5kYXRhLnBhdGg9Jy8nO2lmKG5vZGUuZGF0YS5leHBpcmVzPT09bnVsbCkKbm9kZS5kYXRhLmV4cGlyZXM9Q29va2llVGFibGUuQ29va2llc1RhYmxlLl9leHBpcmVzU2Vzc2lvblZhbHVlO30KX3NhdmVOb2RlKG5vZGUpe2NvbnN0IG9sZENvb2tpZT1ub2RlLmNvb2tpZTtjb25zdCBuZXdDb29raWU9dGhpcy5fY3JlYXRlQ29va2llRnJvbURhdGEobm9kZS5kYXRhKTtub2RlLmNvb2tpZT1uZXdDb29raWU7dGhpcy5fc2F2ZUNhbGxiYWNrKG5ld0Nvb2tpZSxvbGRDb29raWUpLnRoZW4oc3VjY2Vzcz0+e2lmKHN1Y2Nlc3MpCnRoaXMuX3JlZnJlc2goKTtlbHNlCm5vZGUuc2V0RGlydHkodHJ1ZSk7fSk7fQpfY3JlYXRlQ29va2llRnJvbURhdGEoZGF0YSl7Y29uc3QgY29va2llPW5ldyBTREsuQ29va2llKGRhdGEubmFtZSxkYXRhLnZhbHVlLG51bGwpO2Nvb2tpZS5hZGRBdHRyaWJ1dGUoJ2RvbWFpbicsZGF0YS5kb21haW4pO2Nvb2tpZS5hZGRBdHRyaWJ1dGUoJ3BhdGgnLGRhdGEucGF0aCk7aWYoZGF0YS5leHBpcmVzJiZkYXRhLmV4cGlyZXMhPT1Db29raWVUYWJsZS5Db29raWVzVGFibGUuX2V4cGlyZXNTZXNzaW9uVmFsdWUpCmNvb2tpZS5hZGRBdHRyaWJ1dGUoJ2V4cGlyZXMnLChuZXcgRGF0ZShkYXRhLmV4cGlyZXMpKS50b1VUQ1N0cmluZygpKTtpZihkYXRhLmh0dHBPbmx5KQpjb29raWUuYWRkQXR0cmlidXRlKCdodHRwT25seScpO2lmKGRhdGEuc2VjdXJlKQpjb29raWUuYWRkQXR0cmlidXRlKCdzZWN1cmUnKTtpZihkYXRhLnNhbWVTaXRlKQpjb29raWUuYWRkQXR0cmlidXRlKCdzYW1lU2l0ZScsZGF0YS5zYW1lU2l0ZSk7Y29va2llLnNldFNpemUoZGF0YS5uYW1lLmxlbmd0aCtkYXRhLnZhbHVlLmxlbmd0aCk7cmV0dXJuIGNvb2tpZTt9Cl9pc1ZhbGlkQ29va2llRGF0YShkYXRhKXtyZXR1cm4oZGF0YS5uYW1lfHxkYXRhLnZhbHVlKSYmdGhpcy5faXNWYWxpZERvbWFpbihkYXRhLmRvbWFpbikmJnRoaXMuX2lzVmFsaWRQYXRoKGRhdGEucGF0aCkmJnRoaXMuX2lzVmFsaWREYXRlKGRhdGEuZXhwaXJlcyk7fQpfaXNWYWxpZERvbWFpbihkb21haW4pe2lmKCFkb21haW4pCnJldHVybiB0cnVlO2NvbnN0IHBhcnNlZFVSTD0oJ2h0dHA6Ly8nK2RvbWFpbikuYXNQYXJzZWRVUkwoKTtyZXR1cm4hIXBhcnNlZFVSTCYmcGFyc2VkVVJMLmRvbWFpbigpPT09ZG9tYWluO30KX2lzVmFsaWRQYXRoKHBhdGgpe2NvbnN0IHBhcnNlZFVSTD0oJ2h0dHA6Ly9leGFtcGxlLmNvbScrcGF0aCkuYXNQYXJzZWRVUkwoKTtyZXR1cm4hIXBhcnNlZFVSTCYmcGFyc2VkVVJMLnBhdGg9PT1wYXRoO30KX2lzVmFsaWREYXRlKGRhdGUpe3JldHVybiBkYXRlPT09Jyd8fGRhdGU9PT1Db29raWVUYWJsZS5Db29raWVzVGFibGUuX2V4cGlyZXNTZXNzaW9uVmFsdWV8fCFpc05hTihEYXRlLnBhcnNlKGRhdGUpKTt9Cl9yZWZyZXNoKCl7aWYodGhpcy5fcmVmcmVzaENhbGxiYWNrKQp0aGlzLl9yZWZyZXNoQ2FsbGJhY2soKTt9fTtDb29raWVUYWJsZS5Db29raWVzVGFibGUuX2V4cGlyZXNTZXNzaW9uVmFsdWU9Q29tbW9uLlVJU3RyaW5nKCdTZXNzaW9uJyk7O0NvdmVyYWdlLlJhbmdlVXNlQ291bnQ7Q292ZXJhZ2UuQ292ZXJhZ2VTZWdtZW50O0NvdmVyYWdlLkNvdmVyYWdlVHlwZT17Q1NTOigxPDwwKSxKYXZhU2NyaXB0OigxPDwxKSxKYXZhU2NyaXB0Q29hcnNlOigxPDwyKSx9O0NvdmVyYWdlLkNvdmVyYWdlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX2NwdVByb2ZpbGVyTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5DUFVQcm9maWxlck1vZGVsKTt0aGlzLl9jc3NNb2RlbD10YXJnZXQubW9kZWwoU0RLLkNTU01vZGVsKTt0aGlzLl9kZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7dGhpcy5fY292ZXJhZ2VCeVVSTD1uZXcgTWFwKCk7dGhpcy5fY292ZXJhZ2VCeUNvbnRlbnRQcm92aWRlcj1uZXcgTWFwKCk7dGhpcy5fYmVzdEVmZm9ydENvdmVyYWdlUHJvbWlzZT1udWxsO30Kc3RhcnQoKXtpZih0aGlzLl9jc3NNb2RlbCl7dGhpcy5fY2xlYXJDU1MoKTt0aGlzLl9jc3NNb2RlbC5zdGFydENvdmVyYWdlKCk7fQppZih0aGlzLl9jcHVQcm9maWxlck1vZGVsKXt0aGlzLl9iZXN0RWZmb3J0Q292ZXJhZ2VQcm9taXNlPXRoaXMuX2NwdVByb2ZpbGVyTW9kZWwuYmVzdEVmZm9ydENvdmVyYWdlKCk7dGhpcy5fY3B1UHJvZmlsZXJNb2RlbC5zdGFydFByZWNpc2VDb3ZlcmFnZSgpO30KcmV0dXJuISEodGhpcy5fY3NzTW9kZWx8fHRoaXMuX2NwdVByb2ZpbGVyTW9kZWwpO30Kc3RvcCgpe2NvbnN0IHBvbGxQcm9taXNlPXRoaXMucG9sbCgpO2lmKHRoaXMuX2NwdVByb2ZpbGVyTW9kZWwpCnRoaXMuX2NwdVByb2ZpbGVyTW9kZWwuc3RvcFByZWNpc2VDb3ZlcmFnZSgpO2lmKHRoaXMuX2Nzc01vZGVsKQp0aGlzLl9jc3NNb2RlbC5zdG9wQ292ZXJhZ2UoKTtyZXR1cm4gcG9sbFByb21pc2U7fQpyZXNldCgpe3RoaXMuX2NvdmVyYWdlQnlVUkw9bmV3IE1hcCgpO3RoaXMuX2NvdmVyYWdlQnlDb250ZW50UHJvdmlkZXI9bmV3IE1hcCgpO30KYXN5bmMgcG9sbCgpe2NvbnN0IHVwZGF0ZXM9YXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuX3Rha2VDU1NDb3ZlcmFnZSgpLHRoaXMuX3Rha2VKU0NvdmVyYWdlKCldKTtyZXR1cm4gdXBkYXRlc1swXS5jb25jYXQodXBkYXRlc1sxXSk7fQplbnRyaWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fY292ZXJhZ2VCeVVSTC52YWx1ZXMoKSk7fQp1c2FnZUZvclJhbmdlKGNvbnRlbnRQcm92aWRlcixzdGFydE9mZnNldCxlbmRPZmZzZXQpe2NvbnN0IGNvdmVyYWdlSW5mbz10aGlzLl9jb3ZlcmFnZUJ5Q29udGVudFByb3ZpZGVyLmdldChjb250ZW50UHJvdmlkZXIpO3JldHVybiBjb3ZlcmFnZUluZm8mJmNvdmVyYWdlSW5mby51c2FnZUZvclJhbmdlKHN0YXJ0T2Zmc2V0LGVuZE9mZnNldCk7fQpfY2xlYXJDU1MoKXtmb3IoY29uc3QgZW50cnkgb2YgdGhpcy5fY292ZXJhZ2VCeUNvbnRlbnRQcm92aWRlci52YWx1ZXMoKSl7aWYoZW50cnkudHlwZSgpIT09Q292ZXJhZ2UuQ292ZXJhZ2VUeXBlLkNTUykKY29udGludWU7Y29uc3QgY29udGVudFByb3ZpZGVyPShlbnRyeS5jb250ZW50UHJvdmlkZXIoKSk7dGhpcy5fY292ZXJhZ2VCeUNvbnRlbnRQcm92aWRlci5kZWxldGUoY29udGVudFByb3ZpZGVyKTtjb25zdCBrZXk9YCR7Y29udGVudFByb3ZpZGVyLnN0YXJ0TGluZX06JHtjb250ZW50UHJvdmlkZXIuc3RhcnRDb2x1bW59YDtjb25zdCB1cmxFbnRyeT10aGlzLl9jb3ZlcmFnZUJ5VVJMLmdldChlbnRyeS51cmwoKSk7aWYoIXVybEVudHJ5fHwhdXJsRW50cnkuX2NvdmVyYWdlSW5mb0J5TG9jYXRpb24uZGVsZXRlKGtleSkpCmNvbnRpbnVlO3VybEVudHJ5Ll9zaXplLT1lbnRyeS5fc2l6ZTt1cmxFbnRyeS5fdXNlZFNpemUtPWVudHJ5Ll91c2VkU2l6ZTtpZighdXJsRW50cnkuX2NvdmVyYWdlSW5mb0J5TG9jYXRpb24uc2l6ZSkKdGhpcy5fY292ZXJhZ2VCeVVSTC5kZWxldGUoZW50cnkudXJsKCkpO319CmFzeW5jIF90YWtlSlNDb3ZlcmFnZSgpe2lmKCF0aGlzLl9jcHVQcm9maWxlck1vZGVsKQpyZXR1cm5bXTtsZXQgcmF3Q292ZXJhZ2VEYXRhPWF3YWl0IHRoaXMuX2NwdVByb2ZpbGVyTW9kZWwudGFrZVByZWNpc2VDb3ZlcmFnZSgpO2lmKHRoaXMuX2Jlc3RFZmZvcnRDb3ZlcmFnZVByb21pc2Upe2NvbnN0IGJlc3RFZmZvcnRDb3ZlcmFnZT1hd2FpdCB0aGlzLl9iZXN0RWZmb3J0Q292ZXJhZ2VQcm9taXNlO3RoaXMuX2Jlc3RFZmZvcnRDb3ZlcmFnZVByb21pc2U9bnVsbDtyYXdDb3ZlcmFnZURhdGE9YmVzdEVmZm9ydENvdmVyYWdlLmNvbmNhdChyYXdDb3ZlcmFnZURhdGEpO30KcmV0dXJuIHRoaXMuX3Byb2Nlc3NKU0NvdmVyYWdlKHJhd0NvdmVyYWdlRGF0YSk7fQpfcHJvY2Vzc0pTQ292ZXJhZ2Uoc2NyaXB0c0NvdmVyYWdlKXtjb25zdCB1cGRhdGVkRW50cmllcz1bXTtmb3IoY29uc3QgZW50cnkgb2Ygc2NyaXB0c0NvdmVyYWdlKXtjb25zdCBzY3JpcHQ9dGhpcy5fZGVidWdnZXJNb2RlbC5zY3JpcHRGb3JJZChlbnRyeS5zY3JpcHRJZCk7aWYoIXNjcmlwdCkKY29udGludWU7Y29uc3QgcmFuZ2VzPVtdO2xldCB0eXBlPUNvdmVyYWdlLkNvdmVyYWdlVHlwZS5KYXZhU2NyaXB0O2Zvcihjb25zdCBmdW5jIG9mIGVudHJ5LmZ1bmN0aW9ucyl7aWYoZnVuYy5pc0Jsb2NrQ292ZXJhZ2U9PT1mYWxzZSYmIShmdW5jLnJhbmdlcy5sZW5ndGg9PT0xJiYhZnVuYy5yYW5nZXNbMF0uY291bnQpKQp0eXBlfD1Db3ZlcmFnZS5Db3ZlcmFnZVR5cGUuSmF2YVNjcmlwdENvYXJzZTtmb3IoY29uc3QgcmFuZ2Ugb2YgZnVuYy5yYW5nZXMpCnJhbmdlcy5wdXNoKHJhbmdlKTt9CmNvbnN0IHN1YmVudHJ5PXRoaXMuX2FkZENvdmVyYWdlKHNjcmlwdCxzY3JpcHQuY29udGVudExlbmd0aCxzY3JpcHQubGluZU9mZnNldCxzY3JpcHQuY29sdW1uT2Zmc2V0LHJhbmdlcyx0eXBlKTtpZihzdWJlbnRyeSkKdXBkYXRlZEVudHJpZXMucHVzaChzdWJlbnRyeSk7fQpyZXR1cm4gdXBkYXRlZEVudHJpZXM7fQphc3luYyBfdGFrZUNTU0NvdmVyYWdlKCl7aWYoIXRoaXMuX2Nzc01vZGVsKQpyZXR1cm5bXTtjb25zdCByYXdDb3ZlcmFnZURhdGE9YXdhaXQgdGhpcy5fY3NzTW9kZWwudGFrZUNvdmVyYWdlRGVsdGEoKTtyZXR1cm4gdGhpcy5fcHJvY2Vzc0NTU0NvdmVyYWdlKHJhd0NvdmVyYWdlRGF0YSk7fQpfcHJvY2Vzc0NTU0NvdmVyYWdlKHJ1bGVVc2FnZUxpc3Qpe2NvbnN0IHVwZGF0ZWRFbnRyaWVzPVtdO2NvbnN0IHJ1bGVzQnlTdHlsZVNoZWV0PW5ldyBNYXAoKTtmb3IoY29uc3QgcnVsZSBvZiBydWxlVXNhZ2VMaXN0KXtjb25zdCBzdHlsZVNoZWV0SGVhZGVyPXRoaXMuX2Nzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChydWxlLnN0eWxlU2hlZXRJZCk7aWYoIXN0eWxlU2hlZXRIZWFkZXIpCmNvbnRpbnVlO2xldCByYW5nZXM9cnVsZXNCeVN0eWxlU2hlZXQuZ2V0KHN0eWxlU2hlZXRIZWFkZXIpO2lmKCFyYW5nZXMpe3Jhbmdlcz1bXTtydWxlc0J5U3R5bGVTaGVldC5zZXQoc3R5bGVTaGVldEhlYWRlcixyYW5nZXMpO30KcmFuZ2VzLnB1c2goe3N0YXJ0T2Zmc2V0OnJ1bGUuc3RhcnRPZmZzZXQsZW5kT2Zmc2V0OnJ1bGUuZW5kT2Zmc2V0LGNvdW50Ok51bWJlcihydWxlLnVzZWQpfSk7fQpmb3IoY29uc3QgZW50cnkgb2YgcnVsZXNCeVN0eWxlU2hlZXQpe2NvbnN0IHN0eWxlU2hlZXRIZWFkZXI9KGVudHJ5WzBdKTtjb25zdCByYW5nZXM9KGVudHJ5WzFdKTtjb25zdCBzdWJlbnRyeT10aGlzLl9hZGRDb3ZlcmFnZShzdHlsZVNoZWV0SGVhZGVyLHN0eWxlU2hlZXRIZWFkZXIuY29udGVudExlbmd0aCxzdHlsZVNoZWV0SGVhZGVyLnN0YXJ0TGluZSxzdHlsZVNoZWV0SGVhZGVyLnN0YXJ0Q29sdW1uLHJhbmdlcyxDb3ZlcmFnZS5Db3ZlcmFnZVR5cGUuQ1NTKTtpZihzdWJlbnRyeSkKdXBkYXRlZEVudHJpZXMucHVzaChzdWJlbnRyeSk7fQpyZXR1cm4gdXBkYXRlZEVudHJpZXM7fQpzdGF0aWMgX2NvbnZlcnRUb0Rpc2pvaW50U2VnbWVudHMocmFuZ2VzKXtyYW5nZXMuc29ydCgoYSxiKT0+YS5zdGFydE9mZnNldC1iLnN0YXJ0T2Zmc2V0KTtjb25zdCByZXN1bHQ9W107Y29uc3Qgc3RhY2s9W107Zm9yKGNvbnN0IGVudHJ5IG9mIHJhbmdlcyl7bGV0IHRvcD1zdGFjay5wZWVrTGFzdCgpO3doaWxlKHRvcCYmdG9wLmVuZE9mZnNldDw9ZW50cnkuc3RhcnRPZmZzZXQpe2FwcGVuZCh0b3AuZW5kT2Zmc2V0LHRvcC5jb3VudCk7c3RhY2sucG9wKCk7dG9wPXN0YWNrLnBlZWtMYXN0KCk7fQphcHBlbmQoZW50cnkuc3RhcnRPZmZzZXQsdG9wP3RvcC5jb3VudDp1bmRlZmluZWQpO3N0YWNrLnB1c2goZW50cnkpO30Kd2hpbGUoc3RhY2subGVuZ3RoKXtjb25zdCB0b3A9c3RhY2sucG9wKCk7YXBwZW5kKHRvcC5lbmRPZmZzZXQsdG9wLmNvdW50KTt9CmZ1bmN0aW9uIGFwcGVuZChlbmQsY291bnQpe2NvbnN0IGxhc3Q9cmVzdWx0LnBlZWtMYXN0KCk7aWYobGFzdCl7aWYobGFzdC5lbmQ9PT1lbmQpCnJldHVybjtpZihsYXN0LmNvdW50PT09Y291bnQpe2xhc3QuZW5kPWVuZDtyZXR1cm47fX0KcmVzdWx0LnB1c2goe2VuZDplbmQsY291bnQ6Y291bnR9KTt9CnJldHVybiByZXN1bHQ7fQpfYWRkQ292ZXJhZ2UoY29udGVudFByb3ZpZGVyLGNvbnRlbnRMZW5ndGgsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uLHJhbmdlcyx0eXBlKXtjb25zdCB1cmw9Y29udGVudFByb3ZpZGVyLmNvbnRlbnRVUkwoKTtpZighdXJsKQpyZXR1cm4gbnVsbDtsZXQgdXJsQ292ZXJhZ2U9dGhpcy5fY292ZXJhZ2VCeVVSTC5nZXQodXJsKTtpZighdXJsQ292ZXJhZ2Upe3VybENvdmVyYWdlPW5ldyBDb3ZlcmFnZS5VUkxDb3ZlcmFnZUluZm8odXJsKTt0aGlzLl9jb3ZlcmFnZUJ5VVJMLnNldCh1cmwsdXJsQ292ZXJhZ2UpO30KY29uc3QgY292ZXJhZ2VJbmZvPXVybENvdmVyYWdlLl9lbnN1cmVFbnRyeShjb250ZW50UHJvdmlkZXIsY29udGVudExlbmd0aCxzdGFydExpbmUsc3RhcnRDb2x1bW4sdHlwZSk7dGhpcy5fY292ZXJhZ2VCeUNvbnRlbnRQcm92aWRlci5zZXQoY29udGVudFByb3ZpZGVyLGNvdmVyYWdlSW5mbyk7Y29uc3Qgc2VnbWVudHM9Q292ZXJhZ2UuQ292ZXJhZ2VNb2RlbC5fY29udmVydFRvRGlzam9pbnRTZWdtZW50cyhyYW5nZXMpO2lmKHNlZ21lbnRzLmxlbmd0aCYmc2VnbWVudHMucGVla0xhc3QoKS5lbmQ8Y29udGVudExlbmd0aCkKc2VnbWVudHMucHVzaCh7ZW5kOmNvbnRlbnRMZW5ndGh9KTtjb25zdCBvbGRVc2VkU2l6ZT1jb3ZlcmFnZUluZm8uX3VzZWRTaXplO2NvdmVyYWdlSW5mby5tZXJnZUNvdmVyYWdlKHNlZ21lbnRzKTtpZihjb3ZlcmFnZUluZm8uX3VzZWRTaXplPT09b2xkVXNlZFNpemUpCnJldHVybiBudWxsO3VybENvdmVyYWdlLl91c2VkU2l6ZSs9Y292ZXJhZ2VJbmZvLl91c2VkU2l6ZS1vbGRVc2VkU2l6ZTtyZXR1cm4gY292ZXJhZ2VJbmZvO319O0NvdmVyYWdlLlVSTENvdmVyYWdlSW5mbz1jbGFzc3tjb25zdHJ1Y3Rvcih1cmwpe3RoaXMuX3VybD11cmw7dGhpcy5fY292ZXJhZ2VJbmZvQnlMb2NhdGlvbj1uZXcgTWFwKCk7dGhpcy5fc2l6ZT0wO3RoaXMuX3VzZWRTaXplPTA7dGhpcy5fdHlwZTt0aGlzLl9pc0NvbnRlbnRTY3JpcHQ9ZmFsc2U7fQp1cmwoKXtyZXR1cm4gdGhpcy5fdXJsO30KdHlwZSgpe3JldHVybiB0aGlzLl90eXBlO30Kc2l6ZSgpe3JldHVybiB0aGlzLl9zaXplO30KdXNlZFNpemUoKXtyZXR1cm4gdGhpcy5fdXNlZFNpemU7fQp1bnVzZWRTaXplKCl7cmV0dXJuIHRoaXMuX3NpemUtdGhpcy5fdXNlZFNpemU7fQppc0NvbnRlbnRTY3JpcHQoKXtyZXR1cm4gdGhpcy5faXNDb250ZW50U2NyaXB0O30KX2Vuc3VyZUVudHJ5KGNvbnRlbnRQcm92aWRlcixjb250ZW50TGVuZ3RoLGxpbmVPZmZzZXQsY29sdW1uT2Zmc2V0LHR5cGUpe2NvbnN0IGtleT1gJHtsaW5lT2Zmc2V0fToke2NvbHVtbk9mZnNldH1gO2xldCBlbnRyeT10aGlzLl9jb3ZlcmFnZUluZm9CeUxvY2F0aW9uLmdldChrZXkpO2lmKCh0eXBlJkNvdmVyYWdlLkNvdmVyYWdlVHlwZS5KYXZhU2NyaXB0KSYmIXRoaXMuX2NvdmVyYWdlSW5mb0J5TG9jYXRpb24uc2l6ZSkKdGhpcy5faXNDb250ZW50U2NyaXB0PShjb250ZW50UHJvdmlkZXIpLmlzQ29udGVudFNjcmlwdCgpO3RoaXMuX3R5cGV8PXR5cGU7aWYoZW50cnkpe2VudHJ5Ll9jb3ZlcmFnZVR5cGV8PXR5cGU7cmV0dXJuIGVudHJ5O30KaWYoKHR5cGUmQ292ZXJhZ2UuQ292ZXJhZ2VUeXBlLkphdmFTY3JpcHQpJiYhdGhpcy5fY292ZXJhZ2VJbmZvQnlMb2NhdGlvbi5zaXplKQp0aGlzLl9pc0NvbnRlbnRTY3JpcHQ9KGNvbnRlbnRQcm92aWRlcikuaXNDb250ZW50U2NyaXB0KCk7ZW50cnk9bmV3IENvdmVyYWdlLkNvdmVyYWdlSW5mbyhjb250ZW50UHJvdmlkZXIsY29udGVudExlbmd0aCx0eXBlKTt0aGlzLl9jb3ZlcmFnZUluZm9CeUxvY2F0aW9uLnNldChrZXksZW50cnkpO3RoaXMuX3NpemUrPWNvbnRlbnRMZW5ndGg7cmV0dXJuIGVudHJ5O319O0NvdmVyYWdlLkNvdmVyYWdlSW5mbz1jbGFzc3tjb25zdHJ1Y3Rvcihjb250ZW50UHJvdmlkZXIsc2l6ZSx0eXBlKXt0aGlzLl9jb250ZW50UHJvdmlkZXI9Y29udGVudFByb3ZpZGVyO3RoaXMuX3NpemU9c2l6ZTt0aGlzLl91c2VkU2l6ZT0wO3RoaXMuX2NvdmVyYWdlVHlwZT10eXBlO3RoaXMuX3NlZ21lbnRzPVtdO30KY29udGVudFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRQcm92aWRlcjt9CnVybCgpe3JldHVybiB0aGlzLl9jb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpO30KdHlwZSgpe3JldHVybiB0aGlzLl9jb3ZlcmFnZVR5cGU7fQptZXJnZUNvdmVyYWdlKHNlZ21lbnRzKXt0aGlzLl9zZWdtZW50cz1Db3ZlcmFnZS5Db3ZlcmFnZUluZm8uX21lcmdlQ292ZXJhZ2UodGhpcy5fc2VnbWVudHMsc2VnbWVudHMpO3RoaXMuX3VwZGF0ZVN0YXRzKCk7fQp1c2FnZUZvclJhbmdlKHN0YXJ0LGVuZCl7bGV0IGluZGV4PXRoaXMuX3NlZ21lbnRzLnVwcGVyQm91bmQoc3RhcnQsKHBvc2l0aW9uLHNlZ21lbnQpPT5wb3NpdGlvbi1zZWdtZW50LmVuZCk7Zm9yKDtpbmRleDx0aGlzLl9zZWdtZW50cy5sZW5ndGgmJnRoaXMuX3NlZ21lbnRzW2luZGV4XS5lbmQ8ZW5kOysraW5kZXgpe2lmKHRoaXMuX3NlZ21lbnRzW2luZGV4XS5jb3VudCkKcmV0dXJuIHRydWU7fQpyZXR1cm4gaW5kZXg8dGhpcy5fc2VnbWVudHMubGVuZ3RoJiYhIXRoaXMuX3NlZ21lbnRzW2luZGV4XS5jb3VudDt9CnN0YXRpYyBfbWVyZ2VDb3ZlcmFnZShzZWdtZW50c0Esc2VnbWVudHNCKXtjb25zdCByZXN1bHQ9W107bGV0IGluZGV4QT0wO2xldCBpbmRleEI9MDt3aGlsZShpbmRleEE8c2VnbWVudHNBLmxlbmd0aCYmaW5kZXhCPHNlZ21lbnRzQi5sZW5ndGgpe2NvbnN0IGE9c2VnbWVudHNBW2luZGV4QV07Y29uc3QgYj1zZWdtZW50c0JbaW5kZXhCXTtjb25zdCBjb3VudD10eXBlb2YgYS5jb3VudD09PSdudW1iZXInfHx0eXBlb2YgYi5jb3VudD09PSdudW1iZXInPyhhLmNvdW50fHwwKSsoYi5jb3VudHx8MCk6dW5kZWZpbmVkO2NvbnN0IGVuZD1NYXRoLm1pbihhLmVuZCxiLmVuZCk7Y29uc3QgbGFzdD1yZXN1bHQucGVla0xhc3QoKTtpZighbGFzdHx8bGFzdC5jb3VudCE9PWNvdW50KQpyZXN1bHQucHVzaCh7ZW5kOmVuZCxjb3VudDpjb3VudH0pO2Vsc2UKbGFzdC5lbmQ9ZW5kO2lmKGEuZW5kPD1iLmVuZCkKaW5kZXhBKys7aWYoYS5lbmQ+PWIuZW5kKQppbmRleEIrKzt9CmZvcig7aW5kZXhBPHNlZ21lbnRzQS5sZW5ndGg7aW5kZXhBKyspCnJlc3VsdC5wdXNoKHNlZ21lbnRzQVtpbmRleEFdKTtmb3IoO2luZGV4QjxzZWdtZW50c0IubGVuZ3RoO2luZGV4QisrKQpyZXN1bHQucHVzaChzZWdtZW50c0JbaW5kZXhCXSk7cmV0dXJuIHJlc3VsdDt9Cl91cGRhdGVTdGF0cygpe3RoaXMuX3VzZWRTaXplPTA7bGV0IGxhc3Q9MDtmb3IoY29uc3Qgc2VnbWVudCBvZiB0aGlzLl9zZWdtZW50cyl7aWYoc2VnbWVudC5jb3VudCkKdGhpcy5fdXNlZFNpemUrPXNlZ21lbnQuZW5kLWxhc3Q7bGFzdD1zZWdtZW50LmVuZDt9fX07O0NvdmVyYWdlLkNvdmVyYWdlTGlzdFZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGZpbHRlckNhbGxiYWNrKXtzdXBlcih0cnVlKTt0aGlzLl9ub2RlRm9yQ292ZXJhZ2VJbmZvPW5ldyBNYXAoKTt0aGlzLl9maWx0ZXJDYWxsYmFjaz1maWx0ZXJDYWxsYmFjazt0aGlzLl9oaWdobGlnaHRSZWdFeHA9bnVsbDt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2NvdmVyYWdlL2NvdmVyYWdlTGlzdFZpZXcuY3NzJyk7Y29uc3QgY29sdW1ucz1be2lkOid1cmwnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnVVJMJyksd2lkdGg6JzI1MHB4JyxmaXhlZFdpZHRoOmZhbHNlLHNvcnRhYmxlOnRydWV9LHtpZDondHlwZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUeXBlJyksd2lkdGg6JzQ1cHgnLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0YWJsZTp0cnVlfSx7aWQ6J3NpemUnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnVG90YWwgQnl0ZXMnKSx3aWR0aDonNjBweCcsZml4ZWRXaWR0aDp0cnVlLHNvcnRhYmxlOnRydWUsYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uUmlnaHR9LHtpZDondW51c2VkU2l6ZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdVbnVzZWQgQnl0ZXMnKSx3aWR0aDonMTAwcHgnLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0YWJsZTp0cnVlLGFsaWduOkRhdGFHcmlkLkRhdGFHcmlkLkFsaWduLlJpZ2h0LHNvcnQ6RGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuRGVzY2VuZGluZ30se2lkOidiYXJzJyx0aXRsZTonJyx3aWR0aDonMjUwcHgnLGZpeGVkV2lkdGg6ZmFsc2Usc29ydGFibGU6dHJ1ZX1dO3RoaXMuX2RhdGFHcmlkPW5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkKGNvbHVtbnMpO3RoaXMuX2RhdGFHcmlkLnNldFJlc2l6ZU1ldGhvZChEYXRhR3JpZC5EYXRhR3JpZC5SZXNpemVNZXRob2QuTGFzdCk7dGhpcy5fZGF0YUdyaWQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGV4LWF1dG8nKTt0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5PcGVuZWROb2RlLHRoaXMuX29uT3BlbmVkTm9kZSx0aGlzKTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5Tb3J0aW5nQ2hhbmdlZCx0aGlzLl9zb3J0aW5nQ2hhbmdlZCx0aGlzKTtjb25zdCBkYXRhR3JpZFdpZGdldD10aGlzLl9kYXRhR3JpZC5hc1dpZGdldCgpO2RhdGFHcmlkV2lkZ2V0LnNob3codGhpcy5jb250ZW50RWxlbWVudCk7fQp1cGRhdGUoY292ZXJhZ2VJbmZvKXtsZXQgaGFkVXBkYXRlcz1mYWxzZTtjb25zdCBtYXhTaXplPWNvdmVyYWdlSW5mby5yZWR1Y2UoKGFjYyxlbnRyeSk9Pk1hdGgubWF4KGFjYyxlbnRyeS5zaXplKCkpLDApO2NvbnN0IHJvb3ROb2RlPXRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCk7Zm9yKGNvbnN0IGVudHJ5IG9mIGNvdmVyYWdlSW5mbyl7bGV0IG5vZGU9dGhpcy5fbm9kZUZvckNvdmVyYWdlSW5mby5nZXQoZW50cnkpO2lmKG5vZGUpe2lmKHRoaXMuX2ZpbHRlckNhbGxiYWNrKG5vZGUuX2NvdmVyYWdlSW5mbykpCmhhZFVwZGF0ZXM9bm9kZS5fcmVmcmVzaElmTmVlZGVkKG1heFNpemUpfHxoYWRVcGRhdGVzO2NvbnRpbnVlO30Kbm9kZT1uZXcgQ292ZXJhZ2UuQ292ZXJhZ2VMaXN0Vmlldy5HcmlkTm9kZShlbnRyeSxtYXhTaXplKTt0aGlzLl9ub2RlRm9yQ292ZXJhZ2VJbmZvLnNldChlbnRyeSxub2RlKTtpZih0aGlzLl9maWx0ZXJDYWxsYmFjayhub2RlLl9jb3ZlcmFnZUluZm8pKXtyb290Tm9kZS5hcHBlbmRDaGlsZChub2RlKTtoYWRVcGRhdGVzPXRydWU7fX0KaWYoaGFkVXBkYXRlcykKdGhpcy5fc29ydGluZ0NoYW5nZWQoKTt9CnJlc2V0KCl7dGhpcy5fbm9kZUZvckNvdmVyYWdlSW5mby5jbGVhcigpO3RoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTt9CnVwZGF0ZUZpbHRlckFuZEhpZ2hsaWdodChoaWdobGlnaHRSZWdFeHApe3RoaXMuX2hpZ2hsaWdodFJlZ0V4cD1oaWdobGlnaHRSZWdFeHA7bGV0IGhhZFRyZWVVcGRhdGVzPWZhbHNlO2Zvcihjb25zdCBub2RlIG9mIHRoaXMuX25vZGVGb3JDb3ZlcmFnZUluZm8udmFsdWVzKCkpe2NvbnN0IHNob3VsZEJlVmlzaWJsZT10aGlzLl9maWx0ZXJDYWxsYmFjayhub2RlLl9jb3ZlcmFnZUluZm8pO2NvbnN0IGlzVmlzaWJsZT0hIW5vZGUucGFyZW50O2lmKHNob3VsZEJlVmlzaWJsZSkKbm9kZS5fc2V0SGlnaGxpZ2h0KHRoaXMuX2hpZ2hsaWdodFJlZ0V4cCk7aWYoc2hvdWxkQmVWaXNpYmxlPT09aXNWaXNpYmxlKQpjb250aW51ZTtoYWRUcmVlVXBkYXRlcz10cnVlO2lmKCFzaG91bGRCZVZpc2libGUpCm5vZGUucmVtb3ZlKCk7ZWxzZQp0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmFwcGVuZENoaWxkKG5vZGUpO30KaWYoaGFkVHJlZVVwZGF0ZXMpCnRoaXMuX3NvcnRpbmdDaGFuZ2VkKCk7fQpfb25PcGVuZWROb2RlKCl7dGhpcy5fcmV2ZWFsU291cmNlRm9yU2VsZWN0ZWROb2RlKCk7fQpfb25LZXlEb3duKGV2ZW50KXtpZighaXNFbnRlcktleShldmVudCkpCnJldHVybjtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX3JldmVhbFNvdXJjZUZvclNlbGVjdGVkTm9kZSgpO30KYXN5bmMgX3JldmVhbFNvdXJjZUZvclNlbGVjdGVkTm9kZSgpe2NvbnN0IG5vZGU9dGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlO2lmKCFub2RlKQpyZXR1cm47Y29uc3QgY292ZXJhZ2VJbmZvPShub2RlKS5fY292ZXJhZ2VJbmZvO2xldCBzb3VyY2VDb2RlPVdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2RlRm9yVVJMKGNvdmVyYWdlSW5mby51cmwoKSk7aWYoIXNvdXJjZUNvZGUpCnJldHVybjtjb25zdCBjb250ZW50PWF3YWl0IHNvdXJjZUNvZGUucmVxdWVzdENvbnRlbnQoKTtpZihUZXh0VXRpbHMuaXNNaW5pZmllZChjb250ZW50KSl7Y29uc3QgZm9ybWF0RGF0YT1hd2FpdCBTb3VyY2VzLnNvdXJjZUZvcm1hdHRlci5mb3JtYXQoc291cmNlQ29kZSk7c291cmNlQ29kZT1mb3JtYXREYXRhLmZvcm1hdHRlZFNvdXJjZUNvZGU7fQppZih0aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGUhPT1ub2RlKQpyZXR1cm47Q29tbW9uLlJldmVhbGVyLnJldmVhbChzb3VyY2VDb2RlKTt9Cl9zb3J0aW5nQ2hhbmdlZCgpe2NvbnN0IGNvbHVtbklkPXRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2lmKCFjb2x1bW5JZCkKcmV0dXJuO2xldCBzb3J0RnVuY3Rpb247c3dpdGNoKGNvbHVtbklkKXtjYXNlJ3VybCc6c29ydEZ1bmN0aW9uPWNvbXBhcmVVUkw7YnJlYWs7Y2FzZSd0eXBlJzpzb3J0RnVuY3Rpb249Y29tcGFyZVR5cGU7YnJlYWs7Y2FzZSdzaXplJzpzb3J0RnVuY3Rpb249Y29tcGFyZU51bWVyaWNGaWVsZC5iaW5kKG51bGwsJ3NpemUnKTticmVhaztjYXNlJ2JhcnMnOmNhc2UndW51c2VkU2l6ZSc6c29ydEZ1bmN0aW9uPWNvbXBhcmVOdW1lcmljRmllbGQuYmluZChudWxsLCd1bnVzZWRTaXplJyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmFzc2VydChmYWxzZSwnVW5rbm93biBzb3J0IGZpZWxkOiAnK2NvbHVtbklkKTtyZXR1cm47fQp0aGlzLl9kYXRhR3JpZC5zb3J0Tm9kZXMoc29ydEZ1bmN0aW9uLCF0aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpKTtmdW5jdGlvbiBjb21wYXJlVVJMKGEsYil7Y29uc3Qgbm9kZUE9KGEpO2NvbnN0IG5vZGVCPShiKTtyZXR1cm4gbm9kZUEuX3VybC5sb2NhbGVDb21wYXJlKG5vZGVCLl91cmwpO30KZnVuY3Rpb24gY29tcGFyZU51bWVyaWNGaWVsZChmaWVsZE5hbWUsYSxiKXtjb25zdCBub2RlQT0oYSk7Y29uc3Qgbm9kZUI9KGIpO3JldHVybiBub2RlQS5fY292ZXJhZ2VJbmZvW2ZpZWxkTmFtZV0oKS1ub2RlQi5fY292ZXJhZ2VJbmZvW2ZpZWxkTmFtZV0oKXx8Y29tcGFyZVVSTChhLGIpO30KZnVuY3Rpb24gY29tcGFyZVR5cGUoYSxiKXtjb25zdCBub2RlQT0oYSk7Y29uc3Qgbm9kZUI9KGIpO2NvbnN0IHR5cGVBPUNvdmVyYWdlLkNvdmVyYWdlTGlzdFZpZXcuX3R5cGVUb1N0cmluZyhub2RlQS5fY292ZXJhZ2VJbmZvLnR5cGUoKSk7Y29uc3QgdHlwZUI9Q292ZXJhZ2UuQ292ZXJhZ2VMaXN0Vmlldy5fdHlwZVRvU3RyaW5nKG5vZGVCLl9jb3ZlcmFnZUluZm8udHlwZSgpKTtyZXR1cm4gdHlwZUEubG9jYWxlQ29tcGFyZSh0eXBlQil8fGNvbXBhcmVVUkwoYSxiKTt9fQpzdGF0aWMgX3R5cGVUb1N0cmluZyh0eXBlKXtjb25zdCB0eXBlcz1bXTtpZih0eXBlJkNvdmVyYWdlLkNvdmVyYWdlVHlwZS5DU1MpCnR5cGVzLnB1c2goQ29tbW9uLlVJU3RyaW5nKCdDU1MnKSk7aWYodHlwZSZDb3ZlcmFnZS5Db3ZlcmFnZVR5cGUuSmF2YVNjcmlwdENvYXJzZSkKdHlwZXMucHVzaChDb21tb24uVUlTdHJpbmcoJ0pTIChjb2Fyc2UpJykpO2Vsc2UgaWYodHlwZSZDb3ZlcmFnZS5Db3ZlcmFnZVR5cGUuSmF2YVNjcmlwdCkKdHlwZXMucHVzaChDb21tb24uVUlTdHJpbmcoJ0pTJykpO3JldHVybiB0eXBlcy5qb2luKCcrJyk7fX07Q292ZXJhZ2UuQ292ZXJhZ2VMaXN0Vmlldy5HcmlkTm9kZT1jbGFzcyBleHRlbmRzIERhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKGNvdmVyYWdlSW5mbyxtYXhTaXplKXtzdXBlcigpO3RoaXMuX2NvdmVyYWdlSW5mbz1jb3ZlcmFnZUluZm87dGhpcy5fbGFzdFVzZWRTaXplO3RoaXMuX3VybD1jb3ZlcmFnZUluZm8udXJsKCk7dGhpcy5fbWF4U2l6ZT1tYXhTaXplO3RoaXMuX2hpZ2hsaWdodERPTUNoYW5nZXM9W107dGhpcy5faGlnaGxpZ2h0UmVnRXhwPW51bGw7fQpfc2V0SGlnaGxpZ2h0KGhpZ2hsaWdodFJlZ0V4cCl7aWYodGhpcy5faGlnaGxpZ2h0UmVnRXhwPT09aGlnaGxpZ2h0UmVnRXhwKQpyZXR1cm47dGhpcy5faGlnaGxpZ2h0UmVnRXhwPWhpZ2hsaWdodFJlZ0V4cDt0aGlzLnJlZnJlc2goKTt9Cl9yZWZyZXNoSWZOZWVkZWQobWF4U2l6ZSl7aWYodGhpcy5fbGFzdFVzZWRTaXplPT09dGhpcy5fY292ZXJhZ2VJbmZvLnVzZWRTaXplKCkmJm1heFNpemU9PT10aGlzLl9tYXhTaXplKQpyZXR1cm4gZmFsc2U7dGhpcy5fbGFzdFVzZWRTaXplPXRoaXMuX2NvdmVyYWdlSW5mby51c2VkU2l6ZSgpO3RoaXMuX21heFNpemU9bWF4U2l6ZTt0aGlzLnJlZnJlc2goKTtyZXR1cm4gdHJ1ZTt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2NvbnN0IGNlbGw9dGhpcy5jcmVhdGVURChjb2x1bW5JZCk7c3dpdGNoKGNvbHVtbklkKXtjYXNlJ3VybCc6Y2VsbC50aXRsZT10aGlzLl91cmw7Y29uc3Qgb3V0ZXI9Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywndXJsLW91dGVyJyk7Y29uc3QgcHJlZml4PW91dGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCd1cmwtcHJlZml4Jyk7Y29uc3Qgc3VmZml4PW91dGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCd1cmwtc3VmZml4Jyk7Y29uc3Qgc3BsaXRVUkw9L14oLiopKFwvW14vXSopJC8uZXhlYyh0aGlzLl91cmwpO3ByZWZpeC50ZXh0Q29udGVudD1zcGxpdFVSTD9zcGxpdFVSTFsxXTp0aGlzLl91cmw7c3VmZml4LnRleHRDb250ZW50PXNwbGl0VVJMP3NwbGl0VVJMWzJdOicnO2lmKHRoaXMuX2hpZ2hsaWdodFJlZ0V4cCkKdGhpcy5faGlnaGxpZ2h0KG91dGVyLHRoaXMuX3VybCk7YnJlYWs7Y2FzZSd0eXBlJzpjZWxsLnRleHRDb250ZW50PUNvdmVyYWdlLkNvdmVyYWdlTGlzdFZpZXcuX3R5cGVUb1N0cmluZyh0aGlzLl9jb3ZlcmFnZUluZm8udHlwZSgpKTtpZih0aGlzLl9jb3ZlcmFnZUluZm8udHlwZSgpJkNvdmVyYWdlLkNvdmVyYWdlVHlwZS5KYXZhU2NyaXB0Q29hcnNlKQpjZWxsLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnSlMgY292ZXJhZ2UgaXMgZnVuY3Rpb24tbGV2ZWwgb25seS4gUmVsb2FkIHRoZSBwYWdlIGZvciBibG9jay1sZXZlbCBjb3ZlcmFnZS4nKTticmVhaztjYXNlJ3NpemUnOmNlbGwudGV4dENvbnRlbnQ9TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodGhpcy5fY292ZXJhZ2VJbmZvLnNpemUoKXx8MCk7YnJlYWs7Y2FzZSd1bnVzZWRTaXplJzpjb25zdCB1bnVzZWRTaXplPXRoaXMuX2NvdmVyYWdlSW5mby51bnVzZWRTaXplKCl8fDA7Y29uc3QgdW51c2VkU2l6ZVNwYW49Y2VsbC5jcmVhdGVDaGlsZCgnc3BhbicpO2NvbnN0IHVudXNlZFBlcmNlbnRzU3Bhbj1jZWxsLmNyZWF0ZUNoaWxkKCdzcGFuJywncGVyY2VudC12YWx1ZScpO3VudXNlZFNpemVTcGFuLnRleHRDb250ZW50PU51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHVudXNlZFNpemUpO3VudXNlZFBlcmNlbnRzU3Bhbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyUuMWZceGEwJSUnLHVudXNlZFNpemUvdGhpcy5fY292ZXJhZ2VJbmZvLnNpemUoKSoxMDApO2JyZWFrO2Nhc2UnYmFycyc6Y29uc3QgYmFyQ29udGFpbmVyPWNlbGwuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Jhci1jb250YWluZXInKTtjb25zdCB1bnVzZWRTaXplQmFyPWJhckNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYmFyIGJhci11bnVzZWQtc2l6ZScpO3VudXNlZFNpemVCYXIuc3R5bGUud2lkdGg9KDEwMCp0aGlzLl9jb3ZlcmFnZUluZm8udW51c2VkU2l6ZSgpL3RoaXMuX21heFNpemUpLnRvRml4ZWQoNCkrJyUnO2NvbnN0IHVzZWRTaXplQmFyPWJhckNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYmFyIGJhci11c2VkLXNpemUnKTt1c2VkU2l6ZUJhci5zdHlsZS53aWR0aD0oMTAwKnRoaXMuX2NvdmVyYWdlSW5mby51c2VkU2l6ZSgpL3RoaXMuX21heFNpemUpLnRvRml4ZWQoNCkrJyUnO30KcmV0dXJuIGNlbGw7fQpfaGlnaGxpZ2h0KGVsZW1lbnQsdGV4dENvbnRlbnQpe2NvbnN0IG1hdGNoZXM9dGhpcy5faGlnaGxpZ2h0UmVnRXhwLmV4ZWModGV4dENvbnRlbnQpO2lmKCFtYXRjaGVzfHwhbWF0Y2hlcy5sZW5ndGgpCnJldHVybjtjb25zdCByYW5nZT1uZXcgVGV4dFV0aWxzLlNvdXJjZVJhbmdlKG1hdGNoZXMuaW5kZXgsbWF0Y2hlc1swXS5sZW5ndGgpO1VJLmhpZ2hsaWdodFJhbmdlc1dpdGhTdHlsZUNsYXNzKGVsZW1lbnQsW3JhbmdlXSwnZmlsdGVyLWhpZ2hsaWdodCcpO319OztDb3ZlcmFnZS5Db3ZlcmFnZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5fbW9kZWw9bnVsbDt0aGlzLl9wb2xsVGltZXI7dGhpcy5fZGVjb3JhdGlvbk1hbmFnZXI9bnVsbDt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1udWxsO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnY292ZXJhZ2UvY292ZXJhZ2VWaWV3LmNzcycpO2NvbnN0IHRvb2xiYXJDb250YWluZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY292ZXJhZ2UtdG9vbGJhci1jb250YWluZXInKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCdjb3ZlcmFnZS10b29sYmFyJyx0b29sYmFyQ29udGFpbmVyKTt0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignY292ZXJhZ2UudG9nZ2xlLXJlY29yZGluZycpKTt0aGlzLl90b2dnbGVSZWNvcmRCdXR0b249VUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3RvZ2dsZVJlY29yZEJ1dHRvbik7Y29uc3QgbWFpblRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7aWYobWFpblRhcmdldCYmbWFpblRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpKXtjb25zdCBzdGFydFdpdGhSZWxvYWRBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignY292ZXJhZ2Uuc3RhcnQtd2l0aC1yZWxvYWQnKSk7dGhpcy5fc3RhcnRXaXRoUmVsb2FkQnV0dG9uPVVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHN0YXJ0V2l0aFJlbG9hZEFjdGlvbik7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9zdGFydFdpdGhSZWxvYWRCdXR0b24pO30KdGhpcy5fY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBhbGwnKSwnbGFyZ2VpY29uLWNsZWFyJyk7dGhpcy5fY2xlYXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9jbGVhci5iaW5kKHRoaXMpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2NsZWFyQnV0dG9uKTt0aGlzLl90ZXh0RmlsdGVyUmVnRXhwPW51bGw7dG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTt0aGlzLl9maWx0ZXJJbnB1dD1uZXcgVUkuVG9vbGJhcklucHV0KENvbW1vbi5VSVN0cmluZygnVVJMIGZpbHRlcicpLDAuNCwxKTt0aGlzLl9maWx0ZXJJbnB1dC5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9maWx0ZXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJJbnB1dC5FdmVudC5UZXh0Q2hhbmdlZCx0aGlzLl9vbkZpbHRlckNoYW5nZWQsdGhpcyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9maWx0ZXJJbnB1dCk7dG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTt0aGlzLl9zaG93Q29udGVudFNjcmlwdHNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzaG93Q29udGVudFNjcmlwdHMnLGZhbHNlKTt0aGlzLl9zaG93Q29udGVudFNjcmlwdHNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX29uRmlsdGVyQ2hhbmdlZCx0aGlzKTtjb25zdCBjb250ZW50U2NyaXB0c0NoZWNrYm94PW5ldyBVSS5Ub29sYmFyU2V0dGluZ0NoZWNrYm94KHRoaXMuX3Nob3dDb250ZW50U2NyaXB0c1NldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdJbmNsdWRlIGV4dGVuc2lvbiBjb250ZW50IHNjcmlwdHMnKSxDb21tb24uVUlTdHJpbmcoJ0NvbnRlbnQgc2NyaXB0cycpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGNvbnRlbnRTY3JpcHRzQ2hlY2tib3gpO3RoaXMuX2NvdmVyYWdlUmVzdWx0c0VsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY292ZXJhZ2UtcmVzdWx0cycpO3RoaXMuX2xhbmRpbmdQYWdlPXRoaXMuX2J1aWxkTGFuZGluZ1BhZ2UoKTt0aGlzLl9saXN0Vmlldz1uZXcgQ292ZXJhZ2UuQ292ZXJhZ2VMaXN0Vmlldyh0aGlzLl9pc1Zpc2libGUuYmluZCh0aGlzLGZhbHNlKSk7dGhpcy5fc3RhdHVzVG9vbGJhckVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY292ZXJhZ2UtdG9vbGJhci1zdW1tYXJ5Jyk7dGhpcy5fc3RhdHVzTWVzc2FnZUVsZW1lbnQ9dGhpcy5fc3RhdHVzVG9vbGJhckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NvdmVyYWdlLW1lc3NhZ2UnKTt0aGlzLl9sYW5kaW5nUGFnZS5zaG93KHRoaXMuX2NvdmVyYWdlUmVzdWx0c0VsZW1lbnQpO30KX2J1aWxkTGFuZGluZ1BhZ2UoKXtjb25zdCByZWNvcmRCdXR0b249VUkuY3JlYXRlSW5saW5lQnV0dG9uKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHRoaXMuX3RvZ2dsZVJlY29yZEFjdGlvbikpO2NvbnN0IHdpZGdldD1uZXcgVUkuVkJveCgpO2xldCBtZXNzYWdlO2lmKHRoaXMuX3N0YXJ0V2l0aFJlbG9hZEJ1dHRvbil7Y29uc3QgcmVsb2FkQnV0dG9uPVVJLmNyZWF0ZUlubGluZUJ1dHRvbihVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbkZvcklkKCdjb3ZlcmFnZS5zdGFydC13aXRoLXJlbG9hZCcpKTttZXNzYWdlPVVJLmZvcm1hdExvY2FsaXplZCgnQ2xpY2sgdGhlIHJlY29yZCBidXR0b24gJXMgdG8gc3RhcnQgY2FwdHVyaW5nIGNvdmVyYWdlLlxuJysnQ2xpY2sgdGhlIHJlbG9hZCBidXR0b24gJXMgdG8gcmVsb2FkIGFuZCBzdGFydCBjYXB0dXJpbmcgY292ZXJhZ2UuJyxbcmVjb3JkQnV0dG9uLHJlbG9hZEJ1dHRvbl0pO31lbHNle21lc3NhZ2U9VUkuZm9ybWF0TG9jYWxpemVkKCdDbGljayB0aGUgcmVjb3JkIGJ1dHRvbiAlcyB0byBzdGFydCBjYXB0dXJpbmcgY292ZXJhZ2UuJyxbcmVjb3JkQnV0dG9uXSk7fQptZXNzYWdlLmNsYXNzTGlzdC5hZGQoJ21lc3NhZ2UnKTt3aWRnZXQuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZSk7d2lkZ2V0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGFuZGluZy1wYWdlJyk7cmV0dXJuIHdpZGdldDt9Cl9jbGVhcigpe3RoaXMuX21vZGVsPW51bGw7dGhpcy5fcmVzZXQoKTt9Cl9yZXNldCgpe2lmKHRoaXMuX2RlY29yYXRpb25NYW5hZ2VyKXt0aGlzLl9kZWNvcmF0aW9uTWFuYWdlci5kaXNwb3NlKCk7dGhpcy5fZGVjb3JhdGlvbk1hbmFnZXI9bnVsbDt9CnRoaXMuX2xpc3RWaWV3LnJlc2V0KCk7dGhpcy5fbGlzdFZpZXcuZGV0YWNoKCk7dGhpcy5fbGFuZGluZ1BhZ2Uuc2hvdyh0aGlzLl9jb3ZlcmFnZVJlc3VsdHNFbGVtZW50KTt0aGlzLl9zdGF0dXNNZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD0nJzt0aGlzLl9maWx0ZXJJbnB1dC5zZXRFbmFibGVkKGZhbHNlKTt9Cl90b2dnbGVSZWNvcmRpbmcoKXtjb25zdCBlbmFibGU9IXRoaXMuX3RvZ2dsZVJlY29yZEFjdGlvbi50b2dnbGVkKCk7aWYoZW5hYmxlKQp0aGlzLl9zdGFydFJlY29yZGluZyhmYWxzZSk7ZWxzZQp0aGlzLl9zdG9wUmVjb3JkaW5nKCk7fQpfc3RhcnRSZWNvcmRpbmcocmVsb2FkKXt0aGlzLl9yZXNldCgpO2NvbnN0IG1haW5UYXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO2lmKCFtYWluVGFyZ2V0KQpyZXR1cm47aWYoIXRoaXMuX21vZGVsfHxyZWxvYWQpCnRoaXMuX21vZGVsPW5ldyBDb3ZlcmFnZS5Db3ZlcmFnZU1vZGVsKG1haW5UYXJnZXQpO0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uQ292ZXJhZ2VTdGFydGVkKTtpZighdGhpcy5fbW9kZWwuc3RhcnQoKSkKcmV0dXJuO3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsPShtYWluVGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCkpO2lmKHRoaXMuX3Jlc291cmNlVHJlZU1vZGVsKXt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMuX29uTWFpbkZyYW1lTmF2aWdhdGVkLHRoaXMpO30KdGhpcy5fZGVjb3JhdGlvbk1hbmFnZXI9bmV3IENvdmVyYWdlLkNvdmVyYWdlRGVjb3JhdGlvbk1hbmFnZXIodGhpcy5fbW9kZWwpO3RoaXMuX3RvZ2dsZVJlY29yZEFjdGlvbi5zZXRUb2dnbGVkKHRydWUpO3RoaXMuX2NsZWFyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO2lmKHRoaXMuX3N0YXJ0V2l0aFJlbG9hZEJ1dHRvbikKdGhpcy5fc3RhcnRXaXRoUmVsb2FkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX2ZpbHRlcklucHV0LnNldEVuYWJsZWQodHJ1ZSk7aWYodGhpcy5fbGFuZGluZ1BhZ2UuaXNTaG93aW5nKCkpCnRoaXMuX2xhbmRpbmdQYWdlLmRldGFjaCgpO3RoaXMuX2xpc3RWaWV3LnNob3codGhpcy5fY292ZXJhZ2VSZXN1bHRzRWxlbWVudCk7aWYocmVsb2FkJiZ0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbCkKdGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwucmVsb2FkUGFnZSgpO2Vsc2UKdGhpcy5fcG9sbCgpO30KYXN5bmMgX3BvbGwoKXtkZWxldGUgdGhpcy5fcG9sbFRpbWVyO2NvbnN0IHVwZGF0ZXM9YXdhaXQgdGhpcy5fbW9kZWwucG9sbCgpO3RoaXMuX3VwZGF0ZVZpZXdzKHVwZGF0ZXMpO3RoaXMuX3BvbGxUaW1lcj1zZXRUaW1lb3V0KCgpPT50aGlzLl9wb2xsKCksNzAwKTt9CmFzeW5jIF9zdG9wUmVjb3JkaW5nKCl7aWYodGhpcy5fcG9sbFRpbWVyKXtjbGVhclRpbWVvdXQodGhpcy5fcG9sbFRpbWVyKTtkZWxldGUgdGhpcy5fcG9sbFRpbWVyO30KaWYodGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwpe3RoaXMuX3Jlc291cmNlVHJlZU1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fb25NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcyk7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWw9bnVsbDt9CmNvbnN0IHVwZGF0ZWRFbnRyaWVzPWF3YWl0IHRoaXMuX21vZGVsLnN0b3AoKTt0aGlzLl91cGRhdGVWaWV3cyh1cGRhdGVkRW50cmllcyk7dGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnNldFRvZ2dsZWQoZmFsc2UpO2lmKHRoaXMuX3N0YXJ0V2l0aFJlbG9hZEJ1dHRvbikKdGhpcy5fc3RhcnRXaXRoUmVsb2FkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fY2xlYXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTt9Cl9vbk1haW5GcmFtZU5hdmlnYXRlZCgpe3RoaXMuX21vZGVsLnJlc2V0KCk7dGhpcy5fZGVjb3JhdGlvbk1hbmFnZXIucmVzZXQoKTt0aGlzLl9saXN0Vmlldy5yZXNldCgpO3RoaXMuX3BvbGwoKTt9CmFzeW5jIF91cGRhdGVWaWV3cyh1cGRhdGVkRW50cmllcyl7dGhpcy5fdXBkYXRlU3RhdHMoKTt0aGlzLl9saXN0Vmlldy51cGRhdGUodGhpcy5fbW9kZWwuZW50cmllcygpKTt0aGlzLl9kZWNvcmF0aW9uTWFuYWdlci51cGRhdGUodXBkYXRlZEVudHJpZXMpO30KX3VwZGF0ZVN0YXRzKCl7bGV0IHRvdGFsPTA7bGV0IHVudXNlZD0wO2Zvcihjb25zdCBpbmZvIG9mIHRoaXMuX21vZGVsLmVudHJpZXMoKSl7aWYoIXRoaXMuX2lzVmlzaWJsZSh0cnVlLGluZm8pKQpjb250aW51ZTt0b3RhbCs9aW5mby5zaXplKCk7dW51c2VkKz1pbmZvLnVudXNlZFNpemUoKTt9CmNvbnN0IHBlcmNlbnRVbnVzZWQ9dG90YWw/TWF0aC5yb3VuZCgxMDAqdW51c2VkL3RvdGFsKTowO3RoaXMuX3N0YXR1c01lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnJXMgb2YgJXMgYnl0ZXMgYXJlIG5vdCB1c2VkLiAoJWQlJSknLE51bWJlci5ieXRlc1RvU3RyaW5nKHVudXNlZCksTnVtYmVyLmJ5dGVzVG9TdHJpbmcodG90YWwpLHBlcmNlbnRVbnVzZWQpO30KX29uRmlsdGVyQ2hhbmdlZCgpe2lmKCF0aGlzLl9saXN0VmlldykKcmV0dXJuO2NvbnN0IHRleHQ9dGhpcy5fZmlsdGVySW5wdXQudmFsdWUoKTt0aGlzLl90ZXh0RmlsdGVyUmVnRXhwPXRleHQ/Y3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgodGV4dCwnaScpOm51bGw7dGhpcy5fbGlzdFZpZXcudXBkYXRlRmlsdGVyQW5kSGlnaGxpZ2h0KHRoaXMuX3RleHRGaWx0ZXJSZWdFeHApO3RoaXMuX3VwZGF0ZVN0YXRzKCk7fQpfaXNWaXNpYmxlKGlnbm9yZVRleHRGaWx0ZXIsY292ZXJhZ2VJbmZvKXtjb25zdCB1cmw9Y292ZXJhZ2VJbmZvLnVybCgpO2lmKHVybC5zdGFydHNXaXRoKENvdmVyYWdlLkNvdmVyYWdlVmlldy5fZXh0ZW5zaW9uQmluZGluZ3NVUkxQcmVmaXgpKQpyZXR1cm4gZmFsc2U7aWYoY292ZXJhZ2VJbmZvLmlzQ29udGVudFNjcmlwdCgpJiYhdGhpcy5fc2hvd0NvbnRlbnRTY3JpcHRzU2V0dGluZy5nZXQoKSkKcmV0dXJuIGZhbHNlO3JldHVybiBpZ25vcmVUZXh0RmlsdGVyfHwhdGhpcy5fdGV4dEZpbHRlclJlZ0V4cHx8dGhpcy5fdGV4dEZpbHRlclJlZ0V4cC50ZXN0KHVybCk7fX07Q292ZXJhZ2UuQ292ZXJhZ2VWaWV3Ll9leHRlbnNpb25CaW5kaW5nc1VSTFByZWZpeD0nZXh0ZW5zaW9uczo6JztDb3ZlcmFnZS5Db3ZlcmFnZVZpZXcuQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2NvbnN0IGNvdmVyYWdlVmlld0lkPSdjb3ZlcmFnZSc7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoY292ZXJhZ2VWaWV3SWQpLnRoZW4oKCk9PlVJLnZpZXdNYW5hZ2VyLnZpZXcoY292ZXJhZ2VWaWV3SWQpLndpZGdldCgpKS50aGVuKHdpZGdldD0+dGhpcy5faW5uZXJIYW5kbGVBY3Rpb24oKHdpZGdldCksYWN0aW9uSWQpKTtyZXR1cm4gdHJ1ZTt9Cl9pbm5lckhhbmRsZUFjdGlvbihjb3ZlcmFnZVZpZXcsYWN0aW9uSWQpe3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdjb3ZlcmFnZS50b2dnbGUtcmVjb3JkaW5nJzpjb3ZlcmFnZVZpZXcuX3RvZ2dsZVJlY29yZGluZygpO2JyZWFrO2Nhc2UnY292ZXJhZ2Uuc3RhcnQtd2l0aC1yZWxvYWQnOmNvdmVyYWdlVmlldy5fc3RhcnRSZWNvcmRpbmcodHJ1ZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmFzc2VydChmYWxzZSxgVW5rbm93biBhY3Rpb246ICR7YWN0aW9uSWR9YCk7fX19OztDb3ZlcmFnZS5SYXdMb2NhdGlvbjtDb3ZlcmFnZS5Db3ZlcmFnZURlY29yYXRpb25NYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKGNvdmVyYWdlTW9kZWwpe3RoaXMuX2NvdmVyYWdlTW9kZWw9Y292ZXJhZ2VNb2RlbDt0aGlzLl90ZXh0QnlQcm92aWRlcj1uZXcgTWFwKCk7dGhpcy5fdWlTb3VyY2VDb2RlQnlDb250ZW50UHJvdmlkZXI9bmV3IE11bHRpbWFwKCk7dGhpcy5fZG9jdW1lbnRVSVNvdWNlQ29kZVRvU3R5bGVzaGVldHM9bmV3IFdlYWtNYXAoKTtmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIFdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2RlcygpKQp1aVNvdXJjZUNvZGUuYWRkTGluZURlY29yYXRpb24oMCxDb3ZlcmFnZS5Db3ZlcmFnZURlY29yYXRpb25NYW5hZ2VyLl9kZWNvcmF0b3JUeXBlLHRoaXMpO1dvcmtzcGFjZS53b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVBZGRlZCx0aGlzLl9vblVJU291cmNlQ29kZUFkZGVkLHRoaXMpO30KcmVzZXQoKXtmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIFdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2RlcygpKQp1aVNvdXJjZUNvZGUucmVtb3ZlRGVjb3JhdGlvbnNGb3JUeXBlKENvdmVyYWdlLkNvdmVyYWdlRGVjb3JhdGlvbk1hbmFnZXIuX2RlY29yYXRvclR5cGUpO30KZGlzcG9zZSgpe3RoaXMucmVzZXQoKTtXb3Jrc3BhY2Uud29ya3NwYWNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlQWRkZWQsdGhpcy5fb25VSVNvdXJjZUNvZGVBZGRlZCx0aGlzKTt9CnVwZGF0ZSh1cGRhdGVkRW50cmllcyl7Zm9yKGNvbnN0IGVudHJ5IG9mIHVwZGF0ZWRFbnRyaWVzKXtmb3IoY29uc3QgdWlTb3VyY2VDb2RlIG9mIHRoaXMuX3VpU291cmNlQ29kZUJ5Q29udGVudFByb3ZpZGVyLmdldChlbnRyeS5jb250ZW50UHJvdmlkZXIoKSkpe3VpU291cmNlQ29kZS5yZW1vdmVEZWNvcmF0aW9uc0ZvclR5cGUoQ292ZXJhZ2UuQ292ZXJhZ2VEZWNvcmF0aW9uTWFuYWdlci5fZGVjb3JhdG9yVHlwZSk7dWlTb3VyY2VDb2RlLmFkZExpbmVEZWNvcmF0aW9uKDAsQ292ZXJhZ2UuQ292ZXJhZ2VEZWNvcmF0aW9uTWFuYWdlci5fZGVjb3JhdG9yVHlwZSx0aGlzKTt9fX0KYXN5bmMgdXNhZ2VCeUxpbmUodWlTb3VyY2VDb2RlKXtjb25zdCByZXN1bHQ9W107Y29uc3Qgc291cmNlVGV4dD1uZXcgVGV4dFV0aWxzLlRleHQodWlTb3VyY2VDb2RlLmNvbnRlbnQoKXx8JycpO2F3YWl0IHRoaXMuX3VwZGF0ZVRleHRzKHVpU291cmNlQ29kZSxzb3VyY2VUZXh0KTtjb25zdCBsaW5lRW5kaW5ncz1zb3VyY2VUZXh0LmxpbmVFbmRpbmdzKCk7Zm9yKGxldCBsaW5lPTA7bGluZTxzb3VyY2VUZXh0LmxpbmVDb3VudCgpOysrbGluZSl7Y29uc3QgbGluZUxlbmd0aD1saW5lRW5kaW5nc1tsaW5lXS0obGluZT9saW5lRW5kaW5nc1tsaW5lLTFdOjApLTE7aWYoIWxpbmVMZW5ndGgpe3Jlc3VsdC5wdXNoKHVuZGVmaW5lZCk7Y29udGludWU7fQpjb25zdCBzdGFydExvY2F0aW9ucz10aGlzLl9yYXdMb2NhdGlvbnNGb3JTb3VyY2VMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZSwwKTtjb25zdCBlbmRMb2NhdGlvbnM9dGhpcy5fcmF3TG9jYXRpb25zRm9yU291cmNlTG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmUsbGluZUxlbmd0aCk7bGV0IHVzZWQ9dW5kZWZpbmVkO2ZvcihsZXQgc3RhcnRJbmRleD0wLGVuZEluZGV4PTA7c3RhcnRJbmRleDxzdGFydExvY2F0aW9ucy5sZW5ndGg7KytzdGFydEluZGV4KXtjb25zdCBzdGFydD1zdGFydExvY2F0aW9uc1tzdGFydEluZGV4XTt3aGlsZShlbmRJbmRleDxlbmRMb2NhdGlvbnMubGVuZ3RoJiZDb3ZlcmFnZS5Db3ZlcmFnZURlY29yYXRpb25NYW5hZ2VyLl9jb21wYXJlTG9jYXRpb25zKHN0YXJ0LGVuZExvY2F0aW9uc1tlbmRJbmRleF0pPj0wKQorK2VuZEluZGV4O2lmKGVuZEluZGV4Pj1lbmRMb2NhdGlvbnMubGVuZ3RofHxlbmRMb2NhdGlvbnNbZW5kSW5kZXhdLmlkIT09c3RhcnQuaWQpCmNvbnRpbnVlO2NvbnN0IGVuZD1lbmRMb2NhdGlvbnNbZW5kSW5kZXgrK107Y29uc3QgdGV4dD10aGlzLl90ZXh0QnlQcm92aWRlci5nZXQoZW5kLmNvbnRlbnRQcm92aWRlcik7aWYoIXRleHQpCmNvbnRpbnVlO2NvbnN0IHRleHRWYWx1ZT10ZXh0LnZhbHVlKCk7bGV0IHN0YXJ0T2Zmc2V0PU1hdGgubWluKHRleHQub2Zmc2V0RnJvbVBvc2l0aW9uKHN0YXJ0LmxpbmUsc3RhcnQuY29sdW1uKSx0ZXh0VmFsdWUubGVuZ3RoLTEpO2xldCBlbmRPZmZzZXQ9TWF0aC5taW4odGV4dC5vZmZzZXRGcm9tUG9zaXRpb24oZW5kLmxpbmUsZW5kLmNvbHVtbiksdGV4dFZhbHVlLmxlbmd0aC0xKTt3aGlsZShzdGFydE9mZnNldDw9ZW5kT2Zmc2V0JiYvXHMvLnRlc3QodGV4dFZhbHVlW3N0YXJ0T2Zmc2V0XSkpCisrc3RhcnRPZmZzZXQ7d2hpbGUoc3RhcnRPZmZzZXQ8PWVuZE9mZnNldCYmL1xzLy50ZXN0KHRleHRWYWx1ZVtlbmRPZmZzZXRdKSkKLS1lbmRPZmZzZXQ7aWYoc3RhcnRPZmZzZXQ8PWVuZE9mZnNldCkKdXNlZD10aGlzLl9jb3ZlcmFnZU1vZGVsLnVzYWdlRm9yUmFuZ2UoZW5kLmNvbnRlbnRQcm92aWRlcixzdGFydE9mZnNldCxlbmRPZmZzZXQpO2lmKHVzZWQpCmJyZWFrO30KcmVzdWx0LnB1c2godXNlZCk7fQpyZXR1cm4gcmVzdWx0O30KX3VwZGF0ZVRleHRzKHVpU291cmNlQ29kZSx0ZXh0KXtjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGxpbmU9MDtsaW5lPHRleHQubGluZUNvdW50KCk7KytsaW5lKXtmb3IoY29uc3QgZW50cnkgb2YgdGhpcy5fcmF3TG9jYXRpb25zRm9yU291cmNlTG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmUsMCkpe2lmKHRoaXMuX3RleHRCeVByb3ZpZGVyLmhhcyhlbnRyeS5jb250ZW50UHJvdmlkZXIpKQpjb250aW51ZTt0aGlzLl90ZXh0QnlQcm92aWRlci5zZXQoZW50cnkuY29udGVudFByb3ZpZGVyLG51bGwpO3RoaXMuX3VpU291cmNlQ29kZUJ5Q29udGVudFByb3ZpZGVyLnNldChlbnRyeS5jb250ZW50UHJvdmlkZXIsdWlTb3VyY2VDb2RlKTtwcm9taXNlcy5wdXNoKHRoaXMuX3VwZGF0ZVRleHRGb3JQcm92aWRlcihlbnRyeS5jb250ZW50UHJvdmlkZXIpKTt9fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30KYXN5bmMgX3VwZGF0ZVRleHRGb3JQcm92aWRlcihjb250ZW50UHJvdmlkZXIpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgY29udGVudFByb3ZpZGVyLnJlcXVlc3RDb250ZW50KCk7dGhpcy5fdGV4dEJ5UHJvdmlkZXIuc2V0KGNvbnRlbnRQcm92aWRlcixuZXcgVGV4dFV0aWxzLlRleHQoY29udGVudCkpO30KX3Jhd0xvY2F0aW9uc0ZvclNvdXJjZUxvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lLGNvbHVtbil7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGNvbnRlbnRUeXBlPXVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpO2lmKGNvbnRlbnRUeXBlLmhhc1NjcmlwdHMoKSl7bGV0IGxvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZSxjb2x1bW4pO2lmKGxvY2F0aW9uJiZsb2NhdGlvbi5zY3JpcHQoKSl7Y29uc3Qgc2NyaXB0PWxvY2F0aW9uLnNjcmlwdCgpO2lmKHNjcmlwdC5pc0lubGluZVNjcmlwdCgpJiZjb250ZW50VHlwZS5pc0RvY3VtZW50KCkpe2lmKGNvbXBhcmVQb3NpdGlvbnMoc2NyaXB0LmxpbmVPZmZzZXQsc2NyaXB0LmNvbHVtbk9mZnNldCxsb2NhdGlvbi5saW5lTnVtYmVyLGxvY2F0aW9uLmNvbHVtbk51bWJlcik+MHx8Y29tcGFyZVBvc2l0aW9ucyhzY3JpcHQuZW5kTGluZSxzY3JpcHQuZW5kQ29sdW1uLGxvY2F0aW9uLmxpbmVOdW1iZXIsbG9jYXRpb24uY29sdW1uTnVtYmVyKTw9MCl7bG9jYXRpb249bnVsbDt9ZWxzZXtsb2NhdGlvbi5saW5lTnVtYmVyLT1zY3JpcHQubGluZU9mZnNldDtpZighbG9jYXRpb24ubGluZU51bWJlcikKbG9jYXRpb24uY29sdW1uTnVtYmVyLT1zY3JpcHQuY29sdW1uT2Zmc2V0O319CmlmKGxvY2F0aW9uKXtyZXN1bHQucHVzaCh7aWQ6YGpzOiR7bG9jYXRpb24uc2NyaXB0SWR9YCxjb250ZW50UHJvdmlkZXI6bG9jYXRpb24uc2NyaXB0KCksbGluZTpsb2NhdGlvbi5saW5lTnVtYmVyLGNvbHVtbjpsb2NhdGlvbi5jb2x1bW5OdW1iZXJ9KTt9fX0KaWYoY29udGVudFR5cGUuaXNTdHlsZVNoZWV0KCl8fGNvbnRlbnRUeXBlLmlzRG9jdW1lbnQoKSl7Y29uc3QgcmF3U3R5bGVMb2NhdGlvbnM9Y29udGVudFR5cGUuaXNEb2N1bWVudCgpP3RoaXMuX2RvY3VtZW50VUlMb2NhdGlvblRvQ1NTUmF3TG9jYXRpb25zKHVpU291cmNlQ29kZSxsaW5lLGNvbHVtbik6QmluZGluZ3MuY3NzV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbnMobmV3IFdvcmtzcGFjZS5VSUxvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lLGNvbHVtbikpO2Zvcihjb25zdCBsb2NhdGlvbiBvZiByYXdTdHlsZUxvY2F0aW9ucyl7Y29uc3QgaGVhZGVyPWxvY2F0aW9uLmhlYWRlcigpO2lmKCFoZWFkZXIpCmNvbnRpbnVlO2lmKGhlYWRlci5pc0lubGluZSYmY29udGVudFR5cGUuaXNEb2N1bWVudCgpKXtsb2NhdGlvbi5saW5lTnVtYmVyLT1oZWFkZXIuc3RhcnRMaW5lO2lmKCFsb2NhdGlvbi5saW5lTnVtYmVyKQpsb2NhdGlvbi5jb2x1bW5OdW1iZXItPWhlYWRlci5zdGFydENvbHVtbjt9CnJlc3VsdC5wdXNoKHtpZDpgY3NzOiR7bG9jYXRpb24uc3R5bGVTaGVldElkfWAsY29udGVudFByb3ZpZGVyOmxvY2F0aW9uLmhlYWRlcigpLGxpbmU6bG9jYXRpb24ubGluZU51bWJlcixjb2x1bW46bG9jYXRpb24uY29sdW1uTnVtYmVyfSk7fX0KcmVzdWx0LnNvcnQoQ292ZXJhZ2UuQ292ZXJhZ2VEZWNvcmF0aW9uTWFuYWdlci5fY29tcGFyZUxvY2F0aW9ucyk7ZnVuY3Rpb24gY29tcGFyZVBvc2l0aW9ucyhhTGluZSxhQ29sdW1uLGJMaW5lLGJDb2x1bW4pe3JldHVybiBhTGluZS1iTGluZXx8YUNvbHVtbi1iQ29sdW1uO30KcmV0dXJuIHJlc3VsdDt9Cl9kb2N1bWVudFVJTG9jYXRpb25Ub0NTU1Jhd0xvY2F0aW9ucyh1aVNvdXJjZUNvZGUsbGluZSxjb2x1bW4pe2xldCBzdHlsZXNoZWV0cz10aGlzLl9kb2N1bWVudFVJU291Y2VDb2RlVG9TdHlsZXNoZWV0cy5nZXQodWlTb3VyY2VDb2RlKTtpZighc3R5bGVzaGVldHMpe3N0eWxlc2hlZXRzPVtdO2NvbnN0IGNzc01vZGVsPXRoaXMuX2NvdmVyYWdlTW9kZWwudGFyZ2V0KCkubW9kZWwoU0RLLkNTU01vZGVsKTtpZighY3NzTW9kZWwpCnJldHVybltdO2Zvcihjb25zdCBoZWFkZXJJZCBvZiBjc3NNb2RlbC5zdHlsZVNoZWV0SWRzRm9yVVJMKHVpU291cmNlQ29kZS51cmwoKSkpe2NvbnN0IGhlYWRlcj1jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQoaGVhZGVySWQpO2lmKGhlYWRlcikKc3R5bGVzaGVldHMucHVzaChoZWFkZXIpO30Kc3R5bGVzaGVldHMuc29ydChzdHlsZXNoZWV0Q29tcGFyYXRvcik7dGhpcy5fZG9jdW1lbnRVSVNvdWNlQ29kZVRvU3R5bGVzaGVldHMuc2V0KHVpU291cmNlQ29kZSxzdHlsZXNoZWV0cyk7fQpjb25zdCBlbmRJbmRleD1zdHlsZXNoZWV0cy51cHBlckJvdW5kKHVuZGVmaW5lZCwodW51c2VkLGhlYWRlcik9PmxpbmUtaGVhZGVyLnN0YXJ0TGluZXx8Y29sdW1uLWhlYWRlci5zdGFydENvbHVtbik7aWYoIWVuZEluZGV4KQpyZXR1cm5bXTtjb25zdCBsb2NhdGlvbnM9W107Y29uc3QgbGFzdD1zdHlsZXNoZWV0c1tlbmRJbmRleC0xXTtmb3IobGV0IGluZGV4PWVuZEluZGV4LTE7aW5kZXg+PTAmJnN0eWxlc2hlZXRzW2luZGV4XS5zdGFydExpbmU9PT1sYXN0LnN0YXJ0TGluZSYmc3R5bGVzaGVldHNbaW5kZXhdLnN0YXJ0Q29sdW1uPT09bGFzdC5zdGFydENvbHVtbjstLWluZGV4KQpsb2NhdGlvbnMucHVzaChuZXcgU0RLLkNTU0xvY2F0aW9uKHN0eWxlc2hlZXRzW2luZGV4XSxsaW5lLGNvbHVtbikpO3JldHVybiBsb2NhdGlvbnM7ZnVuY3Rpb24gc3R5bGVzaGVldENvbXBhcmF0b3IoYSxiKXtyZXR1cm4gYS5zdGFydExpbmUtYi5zdGFydExpbmV8fGEuc3RhcnRDb2x1bW4tYi5zdGFydENvbHVtbnx8YS5pZC5sb2NhbGVDb21wYXJlKGIuaWQpO319CnN0YXRpYyBfY29tcGFyZUxvY2F0aW9ucyhhLGIpe3JldHVybiBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCl8fGEubGluZS1iLmxpbmV8fGEuY29sdW1uLWIuY29sdW1uO30KX29uVUlTb3VyY2VDb2RlQWRkZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7dWlTb3VyY2VDb2RlLmFkZExpbmVEZWNvcmF0aW9uKDAsQ292ZXJhZ2UuQ292ZXJhZ2VEZWNvcmF0aW9uTWFuYWdlci5fZGVjb3JhdG9yVHlwZSx0aGlzKTt9fTtDb3ZlcmFnZS5Db3ZlcmFnZURlY29yYXRpb25NYW5hZ2VyLl9kZWNvcmF0b3JUeXBlPSdjb3ZlcmFnZSc7Q292ZXJhZ2UuQ292ZXJhZ2VWaWV3LkxpbmVEZWNvcmF0b3I9Y2xhc3N7ZGVjb3JhdGUodWlTb3VyY2VDb2RlLHRleHRFZGl0b3Ipe2NvbnN0IGRlY29yYXRpb25zPXVpU291cmNlQ29kZS5kZWNvcmF0aW9uc0ZvclR5cGUoQ292ZXJhZ2UuQ292ZXJhZ2VEZWNvcmF0aW9uTWFuYWdlci5fZGVjb3JhdG9yVHlwZSk7aWYoIWRlY29yYXRpb25zfHwhZGVjb3JhdGlvbnMuc2l6ZSl7dGV4dEVkaXRvci51bmluc3RhbGxHdXR0ZXIoQ292ZXJhZ2UuQ292ZXJhZ2VWaWV3LkxpbmVEZWNvcmF0b3IuX2d1dHRlclR5cGUpO3JldHVybjt9CmNvbnN0IGRlY29yYXRpb25NYW5hZ2VyPShkZWNvcmF0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWUuZGF0YSgpKTtkZWNvcmF0aW9uTWFuYWdlci51c2FnZUJ5TGluZSh1aVNvdXJjZUNvZGUpLnRoZW4obGluZVVzYWdlPT57dGV4dEVkaXRvci5vcGVyYXRpb24oKCk9PnRoaXMuX2lubmVyRGVjb3JhdGUodGV4dEVkaXRvcixsaW5lVXNhZ2UpKTt9KTt9Cl9pbm5lckRlY29yYXRlKHRleHRFZGl0b3IsbGluZVVzYWdlKXtjb25zdCBndXR0ZXJUeXBlPUNvdmVyYWdlLkNvdmVyYWdlVmlldy5MaW5lRGVjb3JhdG9yLl9ndXR0ZXJUeXBlO3RleHRFZGl0b3IudW5pbnN0YWxsR3V0dGVyKGd1dHRlclR5cGUpO3RleHRFZGl0b3IuaW5zdGFsbEd1dHRlcihndXR0ZXJUeXBlLGZhbHNlKTtmb3IobGV0IGxpbmU9MDtsaW5lPGxpbmVVc2FnZS5sZW5ndGg7KytsaW5lKXtpZih0eXBlb2YgbGluZVVzYWdlW2xpbmVdIT09J2Jvb2xlYW4nKQpjb250aW51ZTtjb25zdCBjbGFzc05hbWU9bGluZVVzYWdlW2xpbmVdPyd0ZXh0LWVkaXRvci1jb3ZlcmFnZS11c2VkLW1hcmtlcic6J3RleHQtZWRpdG9yLWNvdmVyYWdlLXVudXNlZC1tYXJrZXInO3RleHRFZGl0b3Iuc2V0R3V0dGVyRGVjb3JhdGlvbihsaW5lLGd1dHRlclR5cGUsY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JyxjbGFzc05hbWUpKTt9fX07Q292ZXJhZ2UuQ292ZXJhZ2VWaWV3LkxpbmVEZWNvcmF0b3IuX2d1dHRlclR5cGU9J0NvZGVNaXJyb3ItZ3V0dGVyLWNvdmVyYWdlJzs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNvdmVyYWdlL2NvdmVyYWdlTGlzdFZpZXcuY3NzIl09Ii5kYXRhLWdyaWQge1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5kYXRhLWdyaWQgdGQgLnVybC1vdXRlciB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uZGF0YS1ncmlkIHRkIC51cmwtb3V0ZXIgLmZpbHRlci1oaWdobGlnaHQge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmRhdGEtZ3JpZCB0ZCAudXJsLXByZWZpeCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5kYXRhLWdyaWQgdGQgLnVybC1zdWZmaXgge1xuICBmbGV4OiBub25lO1xufVxuXG4uZGF0YS1ncmlkIHRkIC5iYXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogOHB4O1xufVxuXG4uZGF0YS1ncmlkIC5zZWxlY3RlZCB0ZCAuYmFyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHdoaXRlIHNvbGlkO1xuICBib3JkZXItYm90dG9tOiAxcHggd2hpdGUgc29saWQ7XG59XG5cbi5kYXRhLWdyaWQgLnNlbGVjdGVkIHRkIC5iYXI6bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1yaWdodDogMXB4IHdoaXRlIHNvbGlkO1xufVxuXG4uZGF0YS1ncmlkIC5zZWxlY3RlZCB0ZCAuYmFyOmZpcnN0LWNoaWxkIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCB3aGl0ZSBzb2xpZDtcbn1cblxuLmRhdGEtZ3JpZCB0ZCAuYmFyLWNvbnRhaW5lciB7XG59XG5cbi5kYXRhLWdyaWQgdGQgLmJhci11bnVzZWQtc2l6ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFNTczNzM7XG59XG5cbi5kYXRhLWdyaWQgdGQgLmJhci11c2VkLXNpemUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODFDNzg0O1xufVxuXG4uZGF0YS1ncmlkIHRkIC5wZXJjZW50LXZhbHVlIHtcbiAgY29sb3I6ICM4ODg7XG4gIHdpZHRoOiA0NXB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXRhLWdyaWQ6Zm9jdXMgdHIuc2VsZWN0ZWQgc3Bhbi5wZXJjZW50LXZhbHVlIHtcbiAgY29sb3I6ICNlZWU7XG59XG5cbi8qIyBzb3VyY2VVUkw9Y292ZXJhZ2UvY292ZXJhZ2VMaXN0Vmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJjb3ZlcmFnZS9jb3ZlcmFnZVZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uY292ZXJhZ2UtdG9vbGJhci1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7XG4gICAgZmxleDogMCAwO1xufVxuXG4uY292ZXJhZ2UtdG9vbGJhciB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uY292ZXJhZ2UtdG9vbGJhci1zdW1tYXJ5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjO1xuICAgIHBhZGRpbmctbGVmdDogNXB4O1xuICAgIGZsZXg6IDAgMCAxOXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xufVxuXG4uY292ZXJhZ2UtdG9vbGJhci1zdW1tYXJ5IC5jb3ZlcmFnZS1tZXNzYWdlIHtcbiAgICBwYWRkaW5nLXRvcDogMnB4O1xuICAgIHBhZGRpbmctbGVmdDogMWV4O1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmNvdmVyYWdlLXJlc3VsdHMge1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4ubGFuZGluZy1wYWdlIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogIGNlbnRlcjtcbiAgICBwYWRkaW5nOiAyMHB4O1xufVxuXG4ubGFuZGluZy1wYWdlIC5tZXNzYWdlIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG59XG5cbi8qIyBzb3VyY2VVUkw9Y292ZXJhZ2UvY292ZXJhZ2VWaWV3LmNzcyAqLyI7RGF0YUdyaWQuRGF0YUdyaWQ9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGNvbHVtbnNBcnJheSxlZGl0Q2FsbGJhY2ssZGVsZXRlQ2FsbGJhY2sscmVmcmVzaENhbGxiYWNrKXtzdXBlcigpO3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdkYXRhLWdyaWQnKTtVSS5hcHBlbmRTdHlsZSh0aGlzLmVsZW1lbnQsJ2RhdGFfZ3JpZC9kYXRhR3JpZC5jc3MnKTt0aGlzLmVsZW1lbnQudGFiSW5kZXg9MDt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fa2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51LmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fZWRpdENhbGxiYWNrPWVkaXRDYWxsYmFjazt0aGlzLl9kZWxldGVDYWxsYmFjaz1kZWxldGVDYWxsYmFjazt0aGlzLl9yZWZyZXNoQ2FsbGJhY2s9cmVmcmVzaENhbGxiYWNrO2NvbnN0IGhlYWRlckNvbnRhaW5lcj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci1jb250YWluZXInKTt0aGlzLl9oZWFkZXJUYWJsZT1oZWFkZXJDb250YWluZXIuY3JlYXRlQ2hpbGQoJ3RhYmxlJywnaGVhZGVyJyk7dGhpcy5faGVhZGVyVGFibGVIZWFkZXJzPXt9O3RoaXMuX3Njcm9sbENvbnRhaW5lcj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RhdGEtY29udGFpbmVyJyk7dGhpcy5fZGF0YVRhYmxlPXRoaXMuX3Njcm9sbENvbnRhaW5lci5jcmVhdGVDaGlsZCgndGFibGUnLCdkYXRhJyk7aWYoZWRpdENhbGxiYWNrKQp0aGlzLl9kYXRhVGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX29uZGJsY2xpY2suYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZGF0YVRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fbW91c2VEb3duSW5EYXRhVGFibGUuYmluZCh0aGlzKSk7dGhpcy5fZGF0YVRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9jbGlja0luRGF0YVRhYmxlLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5faW5saW5lPWZhbHNlO3RoaXMuX2NvbHVtbnNBcnJheT1bXTt0aGlzLl9jb2x1bW5zPXt9O3RoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXk9Y29sdW1uc0FycmF5O2NvbHVtbnNBcnJheS5mb3JFYWNoKGNvbHVtbj0+dGhpcy5faW5uZXJBZGRDb2x1bW4oY29sdW1uKSk7dGhpcy5fY2VsbENsYXNzPW51bGw7dGhpcy5faGVhZGVyVGFibGVDb2x1bW5Hcm91cD10aGlzLl9oZWFkZXJUYWJsZS5jcmVhdGVDaGlsZCgnY29sZ3JvdXAnKTt0aGlzLl9oZWFkZXJUYWJsZUJvZHk9dGhpcy5faGVhZGVyVGFibGUuY3JlYXRlQ2hpbGQoJ3Rib2R5Jyk7dGhpcy5faGVhZGVyUm93PXRoaXMuX2hlYWRlclRhYmxlQm9keS5jcmVhdGVDaGlsZCgndHInKTt0aGlzLl9kYXRhVGFibGVDb2x1bW5Hcm91cD10aGlzLl9kYXRhVGFibGUuY3JlYXRlQ2hpbGQoJ2NvbGdyb3VwJyk7dGhpcy5kYXRhVGFibGVCb2R5PXRoaXMuX2RhdGFUYWJsZS5jcmVhdGVDaGlsZCgndGJvZHknKTt0aGlzLl90b3BGaWxsZXJSb3c9dGhpcy5kYXRhVGFibGVCb2R5LmNyZWF0ZUNoaWxkKCd0cicsJ2RhdGEtZ3JpZC1maWxsZXItcm93IHJldmVhbGVkJyk7dGhpcy5fYm90dG9tRmlsbGVyUm93PXRoaXMuZGF0YVRhYmxlQm9keS5jcmVhdGVDaGlsZCgndHInLCdkYXRhLWdyaWQtZmlsbGVyLXJvdyByZXZlYWxlZCcpO3RoaXMuc2V0VmVydGljYWxQYWRkaW5nKDAsMCk7dGhpcy5fcmVmcmVzaEhlYWRlcigpO3RoaXMuX2VkaXRpbmc9ZmFsc2U7dGhpcy5zZWxlY3RlZE5vZGU9bnVsbDt0aGlzLmV4cGFuZE5vZGVzV2hlbkFycm93aW5nPWZhbHNlO3RoaXMuc2V0Um9vdE5vZGUoKG5ldyBEYXRhR3JpZC5EYXRhR3JpZE5vZGUoKSkpO3RoaXMuaW5kZW50V2lkdGg9MTU7dGhpcy5fcmVzaXplcnM9W107dGhpcy5fY29sdW1uV2lkdGhzSW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5fY29ybmVyV2lkdGg9RGF0YUdyaWQuRGF0YUdyaWQuQ29ybmVyV2lkdGg7dGhpcy5fcmVzaXplTWV0aG9kPURhdGFHcmlkLkRhdGFHcmlkLlJlc2l6ZU1ldGhvZC5OZWFyZXN0O3RoaXMuX2hlYWRlckNvbnRleHRNZW51Q2FsbGJhY2s9bnVsbDt0aGlzLl9yb3dDb250ZXh0TWVudUNhbGxiYWNrPW51bGw7fQpzdGF0aWMgc2V0RWxlbWVudFRleHQoZWxlbWVudCxuZXdUZXh0LGxvbmdUZXh0KXtpZihsb25nVGV4dCYmbmV3VGV4dC5sZW5ndGg+MTAwMCl7ZWxlbWVudC50ZXh0Q29udGVudD1uZXdUZXh0LnRyaW1FbmQoMTAwMCk7ZWxlbWVudC50aXRsZT1uZXdUZXh0O2VsZW1lbnRbRGF0YUdyaWQuRGF0YUdyaWQuX2xvbmdUZXh0U3ltYm9sXT1uZXdUZXh0O31lbHNle2VsZW1lbnQudGV4dENvbnRlbnQ9bmV3VGV4dDtlbGVtZW50LnRpdGxlPScnO2VsZW1lbnRbRGF0YUdyaWQuRGF0YUdyaWQuX2xvbmdUZXh0U3ltYm9sXT11bmRlZmluZWQ7fX0Kc2V0U3RyaXBlZChpc1N0cmlwZWQpe3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdzdHJpcGVkLWRhdGEtZ3JpZCcsaXNTdHJpcGVkKTt9CmhlYWRlclRhYmxlQm9keSgpe3JldHVybiB0aGlzLl9oZWFkZXJUYWJsZUJvZHk7fQpfaW5uZXJBZGRDb2x1bW4oY29sdW1uLHBvc2l0aW9uKXtjb25zdCBjb2x1bW5JZD1jb2x1bW4uaWQ7aWYoY29sdW1uSWQgaW4gdGhpcy5fY29sdW1ucykKdGhpcy5faW5uZXJSZW1vdmVDb2x1bW4oY29sdW1uSWQpO2lmKHBvc2l0aW9uPT09dW5kZWZpbmVkKQpwb3NpdGlvbj10aGlzLl9jb2x1bW5zQXJyYXkubGVuZ3RoO3RoaXMuX2NvbHVtbnNBcnJheS5zcGxpY2UocG9zaXRpb24sMCxjb2x1bW4pO3RoaXMuX2NvbHVtbnNbY29sdW1uSWRdPWNvbHVtbjtpZihjb2x1bW4uZGlzY2xvc3VyZSkKdGhpcy5kaXNjbG9zdXJlQ29sdW1uSWQ9Y29sdW1uSWQ7Y29uc3QgY2VsbD1jcmVhdGVFbGVtZW50KCd0aCcpO2NlbGwuY2xhc3NOYW1lPWNvbHVtbklkKyctY29sdW1uJztjZWxsW0RhdGFHcmlkLkRhdGFHcmlkLl9jb2x1bW5JZFN5bWJvbF09Y29sdW1uSWQ7dGhpcy5faGVhZGVyVGFibGVIZWFkZXJzW2NvbHVtbklkXT1jZWxsO2NvbnN0IGRpdj1jcmVhdGVFbGVtZW50KCdkaXYnKTtpZihjb2x1bW4udGl0bGVET01GcmFnbWVudCkKZGl2LmFwcGVuZENoaWxkKGNvbHVtbi50aXRsZURPTUZyYWdtZW50KTtlbHNlCmRpdi50ZXh0Q29udGVudD1jb2x1bW4udGl0bGU7Y2VsbC5hcHBlbmRDaGlsZChkaXYpO2lmKGNvbHVtbi5zb3J0KXtjZWxsLmNsYXNzTGlzdC5hZGQoY29sdW1uLnNvcnQpO3RoaXMuX3NvcnRDb2x1bW5DZWxsPWNlbGw7fQppZihjb2x1bW4uc29ydGFibGUpe2NlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2NsaWNrSW5IZWFkZXJDZWxsLmJpbmQodGhpcyksZmFsc2UpO2NlbGwuY2xhc3NMaXN0LmFkZCgnc29ydGFibGUnKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCcnLCdzb3J0LW9yZGVyLWljb24nKTtjZWxsLmNyZWF0ZUNoaWxkKCdkaXYnLCdzb3J0LW9yZGVyLWljb24tY29udGFpbmVyJykuYXBwZW5kQ2hpbGQoaWNvbik7Y2VsbFtEYXRhR3JpZC5EYXRhR3JpZC5fc29ydEljb25TeW1ib2xdPWljb247fX0KYWRkQ29sdW1uKGNvbHVtbixwb3NpdGlvbil7dGhpcy5faW5uZXJBZGRDb2x1bW4oY29sdW1uLHBvc2l0aW9uKTt9Cl9pbm5lclJlbW92ZUNvbHVtbihjb2x1bW5JZCl7Y29uc3QgY29sdW1uPXRoaXMuX2NvbHVtbnNbY29sdW1uSWRdO2lmKCFjb2x1bW4pCnJldHVybjtkZWxldGUgdGhpcy5fY29sdW1uc1tjb2x1bW5JZF07Y29uc3QgaW5kZXg9dGhpcy5fY29sdW1uc0FycmF5LmZpbmRJbmRleChjb2x1bW5Db25maWc9PmNvbHVtbkNvbmZpZy5pZD09PWNvbHVtbklkKTt0aGlzLl9jb2x1bW5zQXJyYXkuc3BsaWNlKGluZGV4LDEpO2NvbnN0IGNlbGw9dGhpcy5faGVhZGVyVGFibGVIZWFkZXJzW2NvbHVtbklkXTtpZihjZWxsLnBhcmVudEVsZW1lbnQpCmNlbGwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChjZWxsKTtkZWxldGUgdGhpcy5faGVhZGVyVGFibGVIZWFkZXJzW2NvbHVtbklkXTt9CnJlbW92ZUNvbHVtbihjb2x1bW5JZCl7dGhpcy5faW5uZXJSZW1vdmVDb2x1bW4oY29sdW1uSWQpO30Kc2V0Q2VsbENsYXNzKGNlbGxDbGFzcyl7dGhpcy5fY2VsbENsYXNzPWNlbGxDbGFzczt9Cl9yZWZyZXNoSGVhZGVyKCl7dGhpcy5faGVhZGVyVGFibGVDb2x1bW5Hcm91cC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2RhdGFUYWJsZUNvbHVtbkdyb3VwLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5faGVhZGVyUm93LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fdG9wRmlsbGVyUm93LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fYm90dG9tRmlsbGVyUm93LnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTx0aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aDsrK2kpe2NvbnN0IGNvbHVtbj10aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5W2ldO2NvbnN0IGNvbHVtbklkPWNvbHVtbi5pZDtjb25zdCBoZWFkZXJDb2x1bW49dGhpcy5faGVhZGVyVGFibGVDb2x1bW5Hcm91cC5jcmVhdGVDaGlsZCgnY29sJyk7Y29uc3QgZGF0YUNvbHVtbj10aGlzLl9kYXRhVGFibGVDb2x1bW5Hcm91cC5jcmVhdGVDaGlsZCgnY29sJyk7aWYoY29sdW1uLndpZHRoKXtoZWFkZXJDb2x1bW4uc3R5bGUud2lkdGg9Y29sdW1uLndpZHRoO2RhdGFDb2x1bW4uc3R5bGUud2lkdGg9Y29sdW1uLndpZHRoO30KdGhpcy5faGVhZGVyUm93LmFwcGVuZENoaWxkKHRoaXMuX2hlYWRlclRhYmxlSGVhZGVyc1tjb2x1bW5JZF0pO3RoaXMuX3RvcEZpbGxlclJvdy5jcmVhdGVDaGlsZCgndGQnLCd0b3AtZmlsbGVyLXRkJyk7dGhpcy5fYm90dG9tRmlsbGVyUm93LmNyZWF0ZUNoaWxkKCd0ZCcsJ2JvdHRvbS1maWxsZXItdGQnKVtEYXRhR3JpZC5EYXRhR3JpZC5fY29sdW1uSWRTeW1ib2xdPWNvbHVtbklkO30KdGhpcy5faGVhZGVyUm93LmNyZWF0ZUNoaWxkKCd0aCcsJ2Nvcm5lcicpO3RoaXMuX3RvcEZpbGxlclJvdy5jcmVhdGVDaGlsZCgndGQnLCdjb3JuZXInKS5jbGFzc0xpc3QuYWRkKCd0b3AtZmlsbGVyLXRkJyk7dGhpcy5fYm90dG9tRmlsbGVyUm93LmNyZWF0ZUNoaWxkKCd0ZCcsJ2Nvcm5lcicpLmNsYXNzTGlzdC5hZGQoJ2JvdHRvbS1maWxsZXItdGQnKTt0aGlzLl9oZWFkZXJUYWJsZUNvbHVtbkdyb3VwLmNyZWF0ZUNoaWxkKCdjb2wnLCdjb3JuZXInKTt0aGlzLl9kYXRhVGFibGVDb2x1bW5Hcm91cC5jcmVhdGVDaGlsZCgnY29sJywnY29ybmVyJyk7fQpzZXRWZXJ0aWNhbFBhZGRpbmcodG9wLGJvdHRvbSl7Y29uc3QgdG9wUHg9dG9wKydweCc7Y29uc3QgYm90dG9tUHg9KHRvcHx8Ym90dG9tKT9ib3R0b20rJ3B4JzonYXV0byc7aWYodGhpcy5fdG9wRmlsbGVyUm93LnN0eWxlLmhlaWdodD09PXRvcFB4JiZ0aGlzLl9ib3R0b21GaWxsZXJSb3cuc3R5bGUuaGVpZ2h0PT09Ym90dG9tUHgpCnJldHVybjt0aGlzLl90b3BGaWxsZXJSb3cuc3R5bGUuaGVpZ2h0PXRvcFB4O3RoaXMuX2JvdHRvbUZpbGxlclJvdy5zdHlsZS5oZWlnaHQ9Ym90dG9tUHg7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlBhZGRpbmdDaGFuZ2VkKTt9CnNldFJvb3ROb2RlKHJvb3ROb2RlKXtpZih0aGlzLl9yb290Tm9kZSl7dGhpcy5fcm9vdE5vZGUucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9yb290Tm9kZS5kYXRhR3JpZD1udWxsO3RoaXMuX3Jvb3ROb2RlLl9pc1Jvb3Q9ZmFsc2U7fQp0aGlzLl9yb290Tm9kZT1yb290Tm9kZTtyb290Tm9kZS5faXNSb290PXRydWU7cm9vdE5vZGUuc2V0SGFzQ2hpbGRyZW4oZmFsc2UpO3Jvb3ROb2RlLl9leHBhbmRlZD10cnVlO3Jvb3ROb2RlLl9yZXZlYWxlZD10cnVlO3Jvb3ROb2RlLnNlbGVjdGFibGU9ZmFsc2U7cm9vdE5vZGUuZGF0YUdyaWQ9dGhpczt9CnJvb3ROb2RlKCl7cmV0dXJuIHRoaXMuX3Jvb3ROb2RlO30KX29uZGJsY2xpY2soZXZlbnQpe2lmKHRoaXMuX2VkaXRpbmd8fHRoaXMuX2VkaXRpbmdOb2RlKQpyZXR1cm47Y29uc3QgY29sdW1uSWQ9dGhpcy5jb2x1bW5JZEZyb21Ob2RlKChldmVudC50YXJnZXQpKTtpZighY29sdW1uSWR8fCF0aGlzLl9jb2x1bW5zW2NvbHVtbklkXS5lZGl0YWJsZSkKcmV0dXJuO3RoaXMuX3N0YXJ0RWRpdGluZygoZXZlbnQudGFyZ2V0KSk7fQpfc3RhcnRFZGl0aW5nQ29sdW1uT2ZEYXRhR3JpZE5vZGUobm9kZSxjZWxsSW5kZXgpe3RoaXMuX2VkaXRpbmc9dHJ1ZTt0aGlzLl9lZGl0aW5nTm9kZT1ub2RlO3RoaXMuX2VkaXRpbmdOb2RlLnNlbGVjdCgpO2NvbnN0IGVsZW1lbnQ9dGhpcy5fZWRpdGluZ05vZGUuX2VsZW1lbnQuY2hpbGRyZW5bY2VsbEluZGV4XTtVSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyhlbGVtZW50LHRoaXMuX3N0YXJ0RWRpdGluZ0NvbmZpZyhlbGVtZW50KSk7ZWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50KTt9CnN0YXJ0RWRpdGluZ05leHRFZGl0YWJsZUNvbHVtbk9mRGF0YUdyaWROb2RlKG5vZGUsY29sdW1uSWRlbnRpZmllcil7Y29uc3QgY29sdW1uPXRoaXMuX2NvbHVtbnNbY29sdW1uSWRlbnRpZmllcl07Y29uc3QgY2VsbEluZGV4PXRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXkuaW5kZXhPZihjb2x1bW4pO2NvbnN0IG5leHRFZGl0YWJsZUNvbHVtbj10aGlzLl9uZXh0RWRpdGFibGVDb2x1bW4oY2VsbEluZGV4KTtpZihuZXh0RWRpdGFibGVDb2x1bW4hPT0tMSkKdGhpcy5fc3RhcnRFZGl0aW5nQ29sdW1uT2ZEYXRhR3JpZE5vZGUobm9kZSxuZXh0RWRpdGFibGVDb2x1bW4pO30KX3N0YXJ0RWRpdGluZyh0YXJnZXQpe2NvbnN0IGVsZW1lbnQ9KHRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aE5vZGVOYW1lKCd0ZCcpKTtpZighZWxlbWVudCkKcmV0dXJuO3RoaXMuX2VkaXRpbmdOb2RlPXRoaXMuZGF0YUdyaWROb2RlRnJvbU5vZGUodGFyZ2V0KTtpZighdGhpcy5fZWRpdGluZ05vZGUpe2lmKCF0aGlzLmNyZWF0aW9uTm9kZSkKcmV0dXJuO3RoaXMuX2VkaXRpbmdOb2RlPXRoaXMuY3JlYXRpb25Ob2RlO30KaWYodGhpcy5fZWRpdGluZ05vZGUuaXNDcmVhdGlvbk5vZGUpe3RoaXMuX3N0YXJ0RWRpdGluZ0NvbHVtbk9mRGF0YUdyaWROb2RlKHRoaXMuX2VkaXRpbmdOb2RlLHRoaXMuX25leHRFZGl0YWJsZUNvbHVtbigtMSkpO3JldHVybjt9CnRoaXMuX2VkaXRpbmc9dHJ1ZTtpZihlbGVtZW50W0RhdGFHcmlkLkRhdGFHcmlkLl9sb25nVGV4dFN5bWJvbF0pCmVsZW1lbnQudGV4dENvbnRlbnQ9ZWxlbWVudFtEYXRhR3JpZC5EYXRhR3JpZC5fbG9uZ1RleHRTeW1ib2xdO1VJLklucGxhY2VFZGl0b3Iuc3RhcnRFZGl0aW5nKGVsZW1lbnQsdGhpcy5fc3RhcnRFZGl0aW5nQ29uZmlnKGVsZW1lbnQpKTtlbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpLnNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnQpO30KcmVuZGVySW5saW5lKCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lubGluZScpO3RoaXMuX2Nvcm5lcldpZHRoPTA7dGhpcy5faW5saW5lPXRydWU7dGhpcy51cGRhdGVXaWR0aHMoKTt9Cl9zdGFydEVkaXRpbmdDb25maWcoZWxlbWVudCl7cmV0dXJuIG5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyh0aGlzLl9lZGl0aW5nQ29tbWl0dGVkLmJpbmQodGhpcyksdGhpcy5fZWRpdGluZ0NhbmNlbGxlZC5iaW5kKHRoaXMpKTt9Cl9lZGl0aW5nQ29tbWl0dGVkKGVsZW1lbnQsbmV3VGV4dCxvbGRUZXh0LGNvbnRleHQsbW92ZURpcmVjdGlvbil7Y29uc3QgY29sdW1uSWQ9dGhpcy5jb2x1bW5JZEZyb21Ob2RlKGVsZW1lbnQpO2lmKCFjb2x1bW5JZCl7dGhpcy5fZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50KTtyZXR1cm47fQpjb25zdCBjb2x1bW49dGhpcy5fY29sdW1uc1tjb2x1bW5JZF07Y29uc3QgY2VsbEluZGV4PXRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXkuaW5kZXhPZihjb2x1bW4pO2NvbnN0IHRleHRCZWZvcmVFZGl0aW5nPSh0aGlzLl9lZGl0aW5nTm9kZS5kYXRhW2NvbHVtbklkXXx8JycpO2NvbnN0IGN1cnJlbnRFZGl0aW5nTm9kZT10aGlzLl9lZGl0aW5nTm9kZTtmdW5jdGlvbiBtb3ZlVG9OZXh0SWZOZWVkZWQod2FzQ2hhbmdlKXtpZighbW92ZURpcmVjdGlvbikKcmV0dXJuO2lmKG1vdmVEaXJlY3Rpb249PT0nZm9yd2FyZCcpe2NvbnN0IGZpcnN0RWRpdGFibGVDb2x1bW49dGhpcy5fbmV4dEVkaXRhYmxlQ29sdW1uKC0xKTtpZihjdXJyZW50RWRpdGluZ05vZGUuaXNDcmVhdGlvbk5vZGUmJmNlbGxJbmRleD09PWZpcnN0RWRpdGFibGVDb2x1bW4mJiF3YXNDaGFuZ2UpCnJldHVybjtjb25zdCBuZXh0RWRpdGFibGVDb2x1bW49dGhpcy5fbmV4dEVkaXRhYmxlQ29sdW1uKGNlbGxJbmRleCk7aWYobmV4dEVkaXRhYmxlQ29sdW1uIT09LTEpe3RoaXMuX3N0YXJ0RWRpdGluZ0NvbHVtbk9mRGF0YUdyaWROb2RlKGN1cnJlbnRFZGl0aW5nTm9kZSxuZXh0RWRpdGFibGVDb2x1bW4pO3JldHVybjt9CmNvbnN0IG5leHREYXRhR3JpZE5vZGU9Y3VycmVudEVkaXRpbmdOb2RlLnRyYXZlcnNlTmV4dE5vZGUodHJ1ZSxudWxsLHRydWUpO2lmKG5leHREYXRhR3JpZE5vZGUpe3RoaXMuX3N0YXJ0RWRpdGluZ0NvbHVtbk9mRGF0YUdyaWROb2RlKG5leHREYXRhR3JpZE5vZGUsZmlyc3RFZGl0YWJsZUNvbHVtbik7cmV0dXJuO30KaWYoY3VycmVudEVkaXRpbmdOb2RlLmlzQ3JlYXRpb25Ob2RlJiZ3YXNDaGFuZ2Upe3RoaXMuYWRkQ3JlYXRpb25Ob2RlKGZhbHNlKTt0aGlzLl9zdGFydEVkaXRpbmdDb2x1bW5PZkRhdGFHcmlkTm9kZSh0aGlzLmNyZWF0aW9uTm9kZSxmaXJzdEVkaXRhYmxlQ29sdW1uKTtyZXR1cm47fQpyZXR1cm47fQppZihtb3ZlRGlyZWN0aW9uPT09J2JhY2t3YXJkJyl7Y29uc3QgcHJldkVkaXRhYmxlQ29sdW1uPXRoaXMuX25leHRFZGl0YWJsZUNvbHVtbihjZWxsSW5kZXgsdHJ1ZSk7aWYocHJldkVkaXRhYmxlQ29sdW1uIT09LTEpe3RoaXMuX3N0YXJ0RWRpdGluZ0NvbHVtbk9mRGF0YUdyaWROb2RlKGN1cnJlbnRFZGl0aW5nTm9kZSxwcmV2RWRpdGFibGVDb2x1bW4pO3JldHVybjt9CmNvbnN0IGxhc3RFZGl0YWJsZUNvbHVtbj10aGlzLl9uZXh0RWRpdGFibGVDb2x1bW4odGhpcy5fdmlzaWJsZUNvbHVtbnNBcnJheS5sZW5ndGgsdHJ1ZSk7Y29uc3QgbmV4dERhdGFHcmlkTm9kZT1jdXJyZW50RWRpdGluZ05vZGUudHJhdmVyc2VQcmV2aW91c05vZGUodHJ1ZSx0cnVlKTtpZihuZXh0RGF0YUdyaWROb2RlKQp0aGlzLl9zdGFydEVkaXRpbmdDb2x1bW5PZkRhdGFHcmlkTm9kZShuZXh0RGF0YUdyaWROb2RlLGxhc3RFZGl0YWJsZUNvbHVtbik7cmV0dXJuO319CkRhdGFHcmlkLkRhdGFHcmlkLnNldEVsZW1lbnRUZXh0KGVsZW1lbnQsbmV3VGV4dCwhIWNvbHVtbi5sb25nVGV4dCk7aWYodGV4dEJlZm9yZUVkaXRpbmc9PT1uZXdUZXh0KXt0aGlzLl9lZGl0aW5nQ2FuY2VsbGVkKGVsZW1lbnQpO21vdmVUb05leHRJZk5lZWRlZC5jYWxsKHRoaXMsZmFsc2UpO3JldHVybjt9CnRoaXMuX2VkaXRpbmdOb2RlLmRhdGFbY29sdW1uSWRdPW5ld1RleHQ7dGhpcy5fZWRpdENhbGxiYWNrKHRoaXMuX2VkaXRpbmdOb2RlLGNvbHVtbklkLHRleHRCZWZvcmVFZGl0aW5nLG5ld1RleHQpO2lmKHRoaXMuX2VkaXRpbmdOb2RlLmlzQ3JlYXRpb25Ob2RlKQp0aGlzLmFkZENyZWF0aW9uTm9kZShmYWxzZSk7dGhpcy5fZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50KTttb3ZlVG9OZXh0SWZOZWVkZWQuY2FsbCh0aGlzLHRydWUpO30KX2VkaXRpbmdDYW5jZWxsZWQoZWxlbWVudCl7dGhpcy5fZWRpdGluZz1mYWxzZTt0aGlzLl9lZGl0aW5nTm9kZT1udWxsO30KX25leHRFZGl0YWJsZUNvbHVtbihjZWxsSW5kZXgsbW92ZUJhY2t3YXJkKXtjb25zdCBpbmNyZW1lbnQ9bW92ZUJhY2t3YXJkPy0xOjE7Y29uc3QgY29sdW1ucz10aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5O2ZvcihsZXQgaT1jZWxsSW5kZXgraW5jcmVtZW50OyhpPj0wKSYmKGk8Y29sdW1ucy5sZW5ndGgpO2krPWluY3JlbWVudCl7aWYoY29sdW1uc1tpXS5lZGl0YWJsZSkKcmV0dXJuIGk7fQpyZXR1cm4tMTt9CnNvcnRDb2x1bW5JZCgpe2lmKCF0aGlzLl9zb3J0Q29sdW1uQ2VsbCkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX3NvcnRDb2x1bW5DZWxsW0RhdGFHcmlkLkRhdGFHcmlkLl9jb2x1bW5JZFN5bWJvbF07fQpzb3J0T3JkZXIoKXtpZighdGhpcy5fc29ydENvbHVtbkNlbGx8fHRoaXMuX3NvcnRDb2x1bW5DZWxsLmNsYXNzTGlzdC5jb250YWlucyhEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5Bc2NlbmRpbmcpKQpyZXR1cm4gRGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuQXNjZW5kaW5nO2lmKHRoaXMuX3NvcnRDb2x1bW5DZWxsLmNsYXNzTGlzdC5jb250YWlucyhEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5EZXNjZW5kaW5nKSkKcmV0dXJuIERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmc7cmV0dXJuIG51bGw7fQppc1NvcnRPcmRlckFzY2VuZGluZygpe3JldHVybiF0aGlzLl9zb3J0Q29sdW1uQ2VsbHx8dGhpcy5fc29ydENvbHVtbkNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZyk7fQpfYXV0b1NpemVXaWR0aHMod2lkdGhzLG1pblBlcmNlbnQsbWF4UGVyY2VudCl7aWYobWluUGVyY2VudCkKbWluUGVyY2VudD1NYXRoLm1pbihtaW5QZXJjZW50LE1hdGguZmxvb3IoMTAwL3dpZHRocy5sZW5ndGgpKTtsZXQgdG90YWxXaWR0aD0wO2ZvcihsZXQgaT0wO2k8d2lkdGhzLmxlbmd0aDsrK2kpCnRvdGFsV2lkdGgrPXdpZHRoc1tpXTtsZXQgdG90YWxQZXJjZW50V2lkdGg9MDtmb3IobGV0IGk9MDtpPHdpZHRocy5sZW5ndGg7KytpKXtsZXQgd2lkdGg9TWF0aC5yb3VuZCgxMDAqd2lkdGhzW2ldL3RvdGFsV2lkdGgpO2lmKG1pblBlcmNlbnQmJndpZHRoPG1pblBlcmNlbnQpCndpZHRoPW1pblBlcmNlbnQ7ZWxzZSBpZihtYXhQZXJjZW50JiZ3aWR0aD5tYXhQZXJjZW50KQp3aWR0aD1tYXhQZXJjZW50O3RvdGFsUGVyY2VudFdpZHRoKz13aWR0aDt3aWR0aHNbaV09d2lkdGg7fQpsZXQgcmVjb3VwUGVyY2VudD10b3RhbFBlcmNlbnRXaWR0aC0xMDA7d2hpbGUobWluUGVyY2VudCYmcmVjb3VwUGVyY2VudD4wKXtmb3IobGV0IGk9MDtpPHdpZHRocy5sZW5ndGg7KytpKXtpZih3aWR0aHNbaV0+bWluUGVyY2VudCl7LS13aWR0aHNbaV07LS1yZWNvdXBQZXJjZW50O2lmKCFyZWNvdXBQZXJjZW50KQpicmVhazt9fX0Kd2hpbGUobWF4UGVyY2VudCYmcmVjb3VwUGVyY2VudDwwKXtmb3IobGV0IGk9MDtpPHdpZHRocy5sZW5ndGg7KytpKXtpZih3aWR0aHNbaV08bWF4UGVyY2VudCl7Kyt3aWR0aHNbaV07KytyZWNvdXBQZXJjZW50O2lmKCFyZWNvdXBQZXJjZW50KQpicmVhazt9fX0KcmV0dXJuIHdpZHRoczt9CmF1dG9TaXplQ29sdW1ucyhtaW5QZXJjZW50LG1heFBlcmNlbnQsbWF4RGVzY2VudExldmVsKXtsZXQgd2lkdGhzPVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fY29sdW1uc0FycmF5Lmxlbmd0aDsrK2kpCndpZHRocy5wdXNoKCh0aGlzLl9jb2x1bW5zQXJyYXlbaV0udGl0bGV8fCcnKS5sZW5ndGgpO21heERlc2NlbnRMZXZlbD1tYXhEZXNjZW50TGV2ZWx8fDA7Y29uc3QgY2hpbGRyZW49dGhpcy5fZW51bWVyYXRlQ2hpbGRyZW4odGhpcy5fcm9vdE5vZGUsW10sbWF4RGVzY2VudExldmVsKzEpO2ZvcihsZXQgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSl7Y29uc3Qgbm9kZT1jaGlsZHJlbltpXTtmb3IobGV0IGo9MDtqPHRoaXMuX2NvbHVtbnNBcnJheS5sZW5ndGg7KytqKXtjb25zdCB0ZXh0PW5vZGUuZGF0YVt0aGlzLl9jb2x1bW5zQXJyYXlbal0uaWRdO2lmKHRleHQubGVuZ3RoPndpZHRoc1tqXSkKd2lkdGhzW2pdPXRleHQubGVuZ3RoO319CndpZHRocz10aGlzLl9hdXRvU2l6ZVdpZHRocyh3aWR0aHMsbWluUGVyY2VudCxtYXhQZXJjZW50KTtmb3IobGV0IGk9MDtpPHRoaXMuX2NvbHVtbnNBcnJheS5sZW5ndGg7KytpKQp0aGlzLl9jb2x1bW5zQXJyYXlbaV0ud2VpZ2h0PXdpZHRoc1tpXTt0aGlzLl9jb2x1bW5XaWR0aHNJbml0aWFsaXplZD1mYWxzZTt0aGlzLnVwZGF0ZVdpZHRocygpO30KX2VudW1lcmF0ZUNoaWxkcmVuKHJvb3ROb2RlLHJlc3VsdCxtYXhMZXZlbCl7aWYoIXJvb3ROb2RlLl9pc1Jvb3QpCnJlc3VsdC5wdXNoKHJvb3ROb2RlKTtpZighbWF4TGV2ZWwpCnJldHVybltdO2ZvcihsZXQgaT0wO2k8cm9vdE5vZGUuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5fZW51bWVyYXRlQ2hpbGRyZW4ocm9vdE5vZGUuY2hpbGRyZW5baV0scmVzdWx0LG1heExldmVsLTEpO3JldHVybiByZXN1bHQ7fQpvblJlc2l6ZSgpe3RoaXMudXBkYXRlV2lkdGhzKCk7fQp1cGRhdGVXaWR0aHMoKXtpZighdGhpcy5fY29sdW1uV2lkdGhzSW5pdGlhbGl6ZWQmJnRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCl7Y29uc3QgdGFibGVXaWR0aD10aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGgtdGhpcy5fY29ybmVyV2lkdGg7Y29uc3QgY2VsbHM9dGhpcy5faGVhZGVyVGFibGVCb2R5LnJvd3NbMF0uY2VsbHM7Y29uc3QgbnVtQ29sdW1ucz1jZWxscy5sZW5ndGgtMTtmb3IobGV0IGk9MDtpPG51bUNvbHVtbnM7aSsrKXtjb25zdCBjb2x1bW49dGhpcy5fdmlzaWJsZUNvbHVtbnNBcnJheVtpXTtpZighY29sdW1uLndlaWdodCkKY29sdW1uLndlaWdodD0xMDAqY2VsbHNbaV0ub2Zmc2V0V2lkdGgvdGFibGVXaWR0aHx8MTA7fQp0aGlzLl9jb2x1bW5XaWR0aHNJbml0aWFsaXplZD10cnVlO30KdGhpcy5fYXBwbHlDb2x1bW5XZWlnaHRzKCk7fQpzZXROYW1lKG5hbWUpe3RoaXMuX2NvbHVtbldlaWdodHNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdkYXRhR3JpZC0nK25hbWUrJy1jb2x1bW5XZWlnaHRzJyx7fSk7dGhpcy5fbG9hZENvbHVtbldlaWdodHMoKTt9Cl9sb2FkQ29sdW1uV2VpZ2h0cygpe2lmKCF0aGlzLl9jb2x1bW5XZWlnaHRzU2V0dGluZykKcmV0dXJuO2NvbnN0IHdlaWdodHM9dGhpcy5fY29sdW1uV2VpZ2h0c1NldHRpbmcuZ2V0KCk7Zm9yKGxldCBpPTA7aTx0aGlzLl9jb2x1bW5zQXJyYXkubGVuZ3RoOysraSl7Y29uc3QgY29sdW1uPXRoaXMuX2NvbHVtbnNBcnJheVtpXTtjb25zdCB3ZWlnaHQ9d2VpZ2h0c1tjb2x1bW4uaWRdO2lmKHdlaWdodCkKY29sdW1uLndlaWdodD13ZWlnaHQ7fQp0aGlzLl9hcHBseUNvbHVtbldlaWdodHMoKTt9Cl9zYXZlQ29sdW1uV2VpZ2h0cygpe2lmKCF0aGlzLl9jb2x1bW5XZWlnaHRzU2V0dGluZykKcmV0dXJuO2NvbnN0IHdlaWdodHM9e307Zm9yKGxldCBpPTA7aTx0aGlzLl9jb2x1bW5zQXJyYXkubGVuZ3RoOysraSl7Y29uc3QgY29sdW1uPXRoaXMuX2NvbHVtbnNBcnJheVtpXTt3ZWlnaHRzW2NvbHVtbi5pZF09Y29sdW1uLndlaWdodDt9CnRoaXMuX2NvbHVtbldlaWdodHNTZXR0aW5nLnNldCh3ZWlnaHRzKTt9Cndhc1Nob3duKCl7dGhpcy5fbG9hZENvbHVtbldlaWdodHMoKTt9CndpbGxIaWRlKCl7fQpfYXBwbHlDb2x1bW5XZWlnaHRzKCl7bGV0IHRhYmxlV2lkdGg9dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoLXRoaXMuX2Nvcm5lcldpZHRoO2lmKHRhYmxlV2lkdGg8PTApCnJldHVybjtsZXQgc3VtT2ZXZWlnaHRzPTAuMDtjb25zdCBmaXhlZENvbHVtbldpZHRocz1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoOysraSl7Y29uc3QgY29sdW1uPXRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXlbaV07aWYoY29sdW1uLmZpeGVkV2lkdGgpe2NvbnN0IHdpZHRoPXRoaXMuX2hlYWRlclRhYmxlQ29sdW1uR3JvdXAuY2hpbGRyZW5baV1bRGF0YUdyaWQuRGF0YUdyaWQuX3ByZWZlcnJlZFdpZHRoU3ltYm9sXXx8dGhpcy5faGVhZGVyVGFibGVCb2R5LnJvd3NbMF0uY2VsbHNbaV0ub2Zmc2V0V2lkdGg7Zml4ZWRDb2x1bW5XaWR0aHNbaV09d2lkdGg7dGFibGVXaWR0aC09d2lkdGg7fWVsc2V7c3VtT2ZXZWlnaHRzKz10aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5W2ldLndlaWdodDt9fQpsZXQgc3VtPTA7bGV0IGxhc3RPZmZzZXQ9MDtmb3IobGV0IGk9MDtpPHRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoOysraSl7Y29uc3QgY29sdW1uPXRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXlbaV07bGV0IHdpZHRoO2lmKGNvbHVtbi5maXhlZFdpZHRoKXt3aWR0aD1maXhlZENvbHVtbldpZHRoc1tpXTt9ZWxzZXtzdW0rPWNvbHVtbi53ZWlnaHQ7Y29uc3Qgb2Zmc2V0PShzdW0qdGFibGVXaWR0aC9zdW1PZldlaWdodHMpfDA7d2lkdGg9b2Zmc2V0LWxhc3RPZmZzZXQ7bGFzdE9mZnNldD1vZmZzZXQ7fQp0aGlzLl9zZXRQcmVmZXJyZWRXaWR0aChpLHdpZHRoKTt9CnRoaXMuX3Bvc2l0aW9uUmVzaXplcnMoKTt9CnNldENvbHVtbnNWaXNpYmxpdHkoY29sdW1uc1Zpc2liaWxpdHkpe3RoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXk9W107Zm9yKGxldCBpPTA7aTx0aGlzLl9jb2x1bW5zQXJyYXkubGVuZ3RoOysraSl7Y29uc3QgY29sdW1uPXRoaXMuX2NvbHVtbnNBcnJheVtpXTtpZihjb2x1bW5zVmlzaWJpbGl0eVtjb2x1bW4uaWRdKQp0aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5LnB1c2goY29sdW1uKTt9CnRoaXMuX3JlZnJlc2hIZWFkZXIoKTt0aGlzLl9hcHBseUNvbHVtbldlaWdodHMoKTtjb25zdCBub2Rlcz10aGlzLl9lbnVtZXJhdGVDaGlsZHJlbih0aGlzLnJvb3ROb2RlKCksW10sLTEpO2ZvcihsZXQgaT0wO2k8bm9kZXMubGVuZ3RoOysraSkKbm9kZXNbaV0ucmVmcmVzaCgpO30KZ2V0IHNjcm9sbENvbnRhaW5lcigpe3JldHVybiB0aGlzLl9zY3JvbGxDb250YWluZXI7fQpfcG9zaXRpb25SZXNpemVycygpe2NvbnN0IGhlYWRlclRhYmxlQ29sdW1ucz10aGlzLl9oZWFkZXJUYWJsZUNvbHVtbkdyb3VwLmNoaWxkcmVuO2NvbnN0IG51bUNvbHVtbnM9aGVhZGVyVGFibGVDb2x1bW5zLmxlbmd0aC0xO2NvbnN0IGxlZnQ9W107Y29uc3QgcmVzaXplcnM9dGhpcy5fcmVzaXplcnM7d2hpbGUocmVzaXplcnMubGVuZ3RoPm51bUNvbHVtbnMtMSkKcmVzaXplcnMucG9wKCkucmVtb3ZlKCk7Zm9yKGxldCBpPTA7aTxudW1Db2x1bW5zLTE7aSsrKXtsZWZ0W2ldPShsZWZ0W2ktMV18fDApK3RoaXMuX2hlYWRlclRhYmxlQm9keS5yb3dzWzBdLmNlbGxzW2ldLm9mZnNldFdpZHRoO30KZm9yKGxldCBpPTA7aTxudW1Db2x1bW5zLTE7aSsrKXtsZXQgcmVzaXplcj1yZXNpemVyc1tpXTtpZighcmVzaXplcil7cmVzaXplcj1jcmVhdGVFbGVtZW50KCdkaXYnKTtyZXNpemVyLl9faW5kZXg9aTtyZXNpemVyLmNsYXNzTGlzdC5hZGQoJ2RhdGEtZ3JpZC1yZXNpemVyJyk7VUkuaW5zdGFsbERyYWdIYW5kbGUocmVzaXplcix0aGlzLl9zdGFydFJlc2l6ZXJEcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX3Jlc2l6ZXJEcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX2VuZFJlc2l6ZXJEcmFnZ2luZy5iaW5kKHRoaXMpLCdjb2wtcmVzaXplJyk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHJlc2l6ZXIpO3Jlc2l6ZXJzLnB1c2gocmVzaXplcik7fQppZihyZXNpemVyLl9fcG9zaXRpb24hPT1sZWZ0W2ldKXtyZXNpemVyLl9fcG9zaXRpb249bGVmdFtpXTtyZXNpemVyLnN0eWxlLmxlZnQ9bGVmdFtpXSsncHgnO319fQphZGRDcmVhdGlvbk5vZGUoaGFzQ2hpbGRyZW4pe2lmKHRoaXMuY3JlYXRpb25Ob2RlKQp0aGlzLmNyZWF0aW9uTm9kZS5tYWtlTm9ybWFsKCk7Y29uc3QgZW1wdHlEYXRhPXt9O2Zvcihjb25zdCBjb2x1bW4gaW4gdGhpcy5fY29sdW1ucykKZW1wdHlEYXRhW2NvbHVtbl09bnVsbDt0aGlzLmNyZWF0aW9uTm9kZT1uZXcgRGF0YUdyaWQuQ3JlYXRpb25EYXRhR3JpZE5vZGUoZW1wdHlEYXRhLGhhc0NoaWxkcmVuKTt0aGlzLnJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGlvbk5vZGUpO30KX2tleURvd24oZXZlbnQpe2lmKCF0aGlzLnNlbGVjdGVkTm9kZXx8ZXZlbnQuc2hpZnRLZXl8fGV2ZW50Lm1ldGFLZXl8fGV2ZW50LmN0cmxLZXl8fHRoaXMuX2VkaXRpbmcpCnJldHVybjtsZXQgaGFuZGxlZD1mYWxzZTtsZXQgbmV4dFNlbGVjdGVkTm9kZTtpZihldmVudC5rZXk9PT0nQXJyb3dVcCcmJiFldmVudC5hbHRLZXkpe25leHRTZWxlY3RlZE5vZGU9dGhpcy5zZWxlY3RlZE5vZGUudHJhdmVyc2VQcmV2aW91c05vZGUodHJ1ZSk7d2hpbGUobmV4dFNlbGVjdGVkTm9kZSYmIW5leHRTZWxlY3RlZE5vZGUuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkTm9kZT1uZXh0U2VsZWN0ZWROb2RlLnRyYXZlcnNlUHJldmlvdXNOb2RlKHRydWUpO2hhbmRsZWQ9bmV4dFNlbGVjdGVkTm9kZT90cnVlOmZhbHNlO31lbHNlIGlmKGV2ZW50LmtleT09PSdBcnJvd0Rvd24nJiYhZXZlbnQuYWx0S2V5KXtuZXh0U2VsZWN0ZWROb2RlPXRoaXMuc2VsZWN0ZWROb2RlLnRyYXZlcnNlTmV4dE5vZGUodHJ1ZSk7d2hpbGUobmV4dFNlbGVjdGVkTm9kZSYmIW5leHRTZWxlY3RlZE5vZGUuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkTm9kZT1uZXh0U2VsZWN0ZWROb2RlLnRyYXZlcnNlTmV4dE5vZGUodHJ1ZSk7aGFuZGxlZD1uZXh0U2VsZWN0ZWROb2RlP3RydWU6ZmFsc2U7fWVsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93TGVmdCcpe2lmKHRoaXMuc2VsZWN0ZWROb2RlLmV4cGFuZGVkKXtpZihldmVudC5hbHRLZXkpCnRoaXMuc2VsZWN0ZWROb2RlLmNvbGxhcHNlUmVjdXJzaXZlbHkoKTtlbHNlCnRoaXMuc2VsZWN0ZWROb2RlLmNvbGxhcHNlKCk7aGFuZGxlZD10cnVlO31lbHNlIGlmKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCYmIXRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudC5faXNSb290KXtoYW5kbGVkPXRydWU7aWYodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50LnNlbGVjdGFibGUpe25leHRTZWxlY3RlZE5vZGU9dGhpcy5zZWxlY3RlZE5vZGUucGFyZW50O2hhbmRsZWQ9bmV4dFNlbGVjdGVkTm9kZT90cnVlOmZhbHNlO31lbHNlIGlmKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCl7dGhpcy5zZWxlY3RlZE5vZGUucGFyZW50LmNvbGxhcHNlKCk7fX19ZWxzZSBpZihldmVudC5rZXk9PT0nQXJyb3dSaWdodCcpe2lmKCF0aGlzLnNlbGVjdGVkTm9kZS5yZXZlYWxlZCl7dGhpcy5zZWxlY3RlZE5vZGUucmV2ZWFsKCk7aGFuZGxlZD10cnVlO31lbHNlIGlmKHRoaXMuc2VsZWN0ZWROb2RlLmhhc0NoaWxkcmVuKCkpe2hhbmRsZWQ9dHJ1ZTtpZih0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmRlZCl7bmV4dFNlbGVjdGVkTm9kZT10aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlblswXTtoYW5kbGVkPW5leHRTZWxlY3RlZE5vZGU/dHJ1ZTpmYWxzZTt9ZWxzZXtpZihldmVudC5hbHRLZXkpCnRoaXMuc2VsZWN0ZWROb2RlLmV4cGFuZFJlY3Vyc2l2ZWx5KCk7ZWxzZQp0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmQoKTt9fX1lbHNlIGlmKGV2ZW50LmtleUNvZGU9PT04fHxldmVudC5rZXlDb2RlPT09NDYpe2lmKHRoaXMuX2RlbGV0ZUNhbGxiYWNrKXtoYW5kbGVkPXRydWU7dGhpcy5fZGVsZXRlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZE5vZGUpO319ZWxzZSBpZihpc0VudGVyS2V5KGV2ZW50KSl7aWYodGhpcy5fZWRpdENhbGxiYWNrKXtoYW5kbGVkPXRydWU7dGhpcy5fc3RhcnRFZGl0aW5nKHRoaXMuc2VsZWN0ZWROb2RlLl9lbGVtZW50LmNoaWxkcmVuW3RoaXMuX25leHRFZGl0YWJsZUNvbHVtbigtMSldKTt9ZWxzZXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuT3BlbmVkTm9kZSx0aGlzLnNlbGVjdGVkTm9kZSk7fX0KaWYobmV4dFNlbGVjdGVkTm9kZSl7bmV4dFNlbGVjdGVkTm9kZS5yZXZlYWwoKTtuZXh0U2VsZWN0ZWROb2RlLnNlbGVjdCgpO30KaWYoaGFuZGxlZCkKZXZlbnQuY29uc3VtZSh0cnVlKTt9CnVwZGF0ZVNlbGVjdGlvbkJlZm9yZVJlbW92YWwocm9vdCxvbmx5QWZmZWN0c1N1YnRyZWUpe2xldCBhbmNlc3Rvcj10aGlzLnNlbGVjdGVkTm9kZTt3aGlsZShhbmNlc3RvciYmYW5jZXN0b3IhPT1yb290KQphbmNlc3Rvcj1hbmNlc3Rvci5wYXJlbnQ7aWYoIWFuY2VzdG9yKQpyZXR1cm47bGV0IG5leHRTZWxlY3RlZE5vZGU7Zm9yKGFuY2VzdG9yPXJvb3Q7YW5jZXN0b3ImJiFhbmNlc3Rvci5uZXh0U2libGluZzthbmNlc3Rvcj1hbmNlc3Rvci5wYXJlbnQpe30KaWYoYW5jZXN0b3IpCm5leHRTZWxlY3RlZE5vZGU9YW5jZXN0b3IubmV4dFNpYmxpbmc7d2hpbGUobmV4dFNlbGVjdGVkTm9kZSYmIW5leHRTZWxlY3RlZE5vZGUuc2VsZWN0YWJsZSkKbmV4dFNlbGVjdGVkTm9kZT1uZXh0U2VsZWN0ZWROb2RlLnRyYXZlcnNlTmV4dE5vZGUodHJ1ZSk7aWYoIW5leHRTZWxlY3RlZE5vZGV8fG5leHRTZWxlY3RlZE5vZGUuaXNDcmVhdGlvbk5vZGUpe25leHRTZWxlY3RlZE5vZGU9cm9vdC50cmF2ZXJzZVByZXZpb3VzTm9kZSh0cnVlKTt3aGlsZShuZXh0U2VsZWN0ZWROb2RlJiYhbmV4dFNlbGVjdGVkTm9kZS5zZWxlY3RhYmxlKQpuZXh0U2VsZWN0ZWROb2RlPW5leHRTZWxlY3RlZE5vZGUudHJhdmVyc2VQcmV2aW91c05vZGUodHJ1ZSk7fQppZihuZXh0U2VsZWN0ZWROb2RlKXtuZXh0U2VsZWN0ZWROb2RlLnJldmVhbCgpO25leHRTZWxlY3RlZE5vZGUuc2VsZWN0KCk7fWVsc2V7dGhpcy5zZWxlY3RlZE5vZGUuZGVzZWxlY3QoKTt9fQpkYXRhR3JpZE5vZGVGcm9tTm9kZSh0YXJnZXQpe2NvbnN0IHJvd0VsZW1lbnQ9dGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWUoJ3RyJyk7cmV0dXJuIHJvd0VsZW1lbnQmJnJvd0VsZW1lbnQuX2RhdGFHcmlkTm9kZTt9CmNvbHVtbklkRnJvbU5vZGUodGFyZ2V0KXtjb25zdCBjZWxsRWxlbWVudD10YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZSgndGQnKTtyZXR1cm4gY2VsbEVsZW1lbnQmJmNlbGxFbGVtZW50W0RhdGFHcmlkLkRhdGFHcmlkLl9jb2x1bW5JZFN5bWJvbF07fQpfY2xpY2tJbkhlYWRlckNlbGwoZXZlbnQpe2NvbnN0IGNlbGw9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWUoJ3RoJyk7aWYoIWNlbGx8fChjZWxsW0RhdGFHcmlkLkRhdGFHcmlkLl9jb2x1bW5JZFN5bWJvbF09PT11bmRlZmluZWQpfHwhY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NvcnRhYmxlJykpCnJldHVybjtsZXQgc29ydE9yZGVyPURhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZztpZigoY2VsbD09PXRoaXMuX3NvcnRDb2x1bW5DZWxsKSYmdGhpcy5pc1NvcnRPcmRlckFzY2VuZGluZygpKQpzb3J0T3JkZXI9RGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuRGVzY2VuZGluZztpZih0aGlzLl9zb3J0Q29sdW1uQ2VsbCkKdGhpcy5fc29ydENvbHVtbkNlbGwuY2xhc3NMaXN0LnJlbW92ZShEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5Bc2NlbmRpbmcsRGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuRGVzY2VuZGluZyk7dGhpcy5fc29ydENvbHVtbkNlbGw9Y2VsbDtjZWxsLmNsYXNzTGlzdC5hZGQoc29ydE9yZGVyKTtjb25zdCBpY29uPWNlbGxbRGF0YUdyaWQuRGF0YUdyaWQuX3NvcnRJY29uU3ltYm9sXTtpY29uLnNldEljb25UeXBlKHNvcnRPcmRlcj09PURhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZz8nc21hbGxpY29uLXRyaWFuZ2xlLXVwJzonc21hbGxpY29uLXRyaWFuZ2xlLWRvd24nKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU29ydGluZ0NoYW5nZWQpO30KbWFya0NvbHVtbkFzU29ydGVkQnkoY29sdW1uSWQsc29ydE9yZGVyKXtpZih0aGlzLl9zb3J0Q29sdW1uQ2VsbCkKdGhpcy5fc29ydENvbHVtbkNlbGwuY2xhc3NMaXN0LnJlbW92ZShEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5Bc2NlbmRpbmcsRGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuRGVzY2VuZGluZyk7dGhpcy5fc29ydENvbHVtbkNlbGw9dGhpcy5faGVhZGVyVGFibGVIZWFkZXJzW2NvbHVtbklkXTt0aGlzLl9zb3J0Q29sdW1uQ2VsbC5jbGFzc0xpc3QuYWRkKHNvcnRPcmRlcik7fQpoZWFkZXJUYWJsZUhlYWRlcihjb2x1bW5JZCl7cmV0dXJuIHRoaXMuX2hlYWRlclRhYmxlSGVhZGVyc1tjb2x1bW5JZF07fQpfbW91c2VEb3duSW5EYXRhVGFibGUoZXZlbnQpe2NvbnN0IHRhcmdldD0oZXZlbnQudGFyZ2V0KTtjb25zdCBncmlkTm9kZT10aGlzLmRhdGFHcmlkTm9kZUZyb21Ob2RlKHRhcmdldCk7aWYoIWdyaWROb2RlfHwhZ3JpZE5vZGUuc2VsZWN0YWJsZXx8Z3JpZE5vZGUuaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCkpCnJldHVybjtjb25zdCBjb2x1bW5JZD10aGlzLmNvbHVtbklkRnJvbU5vZGUodGFyZ2V0KTtpZihjb2x1bW5JZCYmdGhpcy5fY29sdW1uc1tjb2x1bW5JZF0ubm9uU2VsZWN0YWJsZSkKcmV0dXJuO2lmKGV2ZW50Lm1ldGFLZXkpe2lmKGdyaWROb2RlLnNlbGVjdGVkKQpncmlkTm9kZS5kZXNlbGVjdCgpO2Vsc2UKZ3JpZE5vZGUuc2VsZWN0KCk7fWVsc2V7Z3JpZE5vZGUuc2VsZWN0KCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLk9wZW5lZE5vZGUsZ3JpZE5vZGUpO319CnNldEhlYWRlckNvbnRleHRNZW51Q2FsbGJhY2soY2FsbGJhY2spe3RoaXMuX2hlYWRlckNvbnRleHRNZW51Q2FsbGJhY2s9Y2FsbGJhY2s7fQpzZXRSb3dDb250ZXh0TWVudUNhbGxiYWNrKGNhbGxiYWNrKXt0aGlzLl9yb3dDb250ZXh0TWVudUNhbGxiYWNrPWNhbGxiYWNrO30KX2NvbnRleHRNZW51KGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnN0IHRhcmdldD0oZXZlbnQudGFyZ2V0KTtpZih0YXJnZXQuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMuX2hlYWRlclRhYmxlQm9keSkpe2lmKHRoaXMuX2hlYWRlckNvbnRleHRNZW51Q2FsbGJhY2spCnRoaXMuX2hlYWRlckNvbnRleHRNZW51Q2FsbGJhY2soY29udGV4dE1lbnUpO3JldHVybjt9CmNvbnN0IGdyaWROb2RlPXRoaXMuZGF0YUdyaWROb2RlRnJvbU5vZGUodGFyZ2V0KTtpZih0aGlzLl9yZWZyZXNoQ2FsbGJhY2smJighZ3JpZE5vZGV8fGdyaWROb2RlIT09dGhpcy5jcmVhdGlvbk5vZGUpKQpjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZWZyZXNoJyksdGhpcy5fcmVmcmVzaENhbGxiYWNrLmJpbmQodGhpcykpO2lmKGdyaWROb2RlJiZncmlkTm9kZS5zZWxlY3RhYmxlJiYhZ3JpZE5vZGUuaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCkpe2lmKHRoaXMuX2VkaXRDYWxsYmFjayl7aWYoZ3JpZE5vZGU9PT10aGlzLmNyZWF0aW9uTm9kZSl7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQWRkIG5ldycpLHRoaXMuX3N0YXJ0RWRpdGluZy5iaW5kKHRoaXMsdGFyZ2V0KSk7fWVsc2V7Y29uc3QgY29sdW1uSWQ9dGhpcy5jb2x1bW5JZEZyb21Ob2RlKHRhcmdldCk7aWYoY29sdW1uSWQmJnRoaXMuX2NvbHVtbnNbY29sdW1uSWRdLmVkaXRhYmxlKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdFZGl0ICIlcyInLHRoaXMuX2NvbHVtbnNbY29sdW1uSWRdLnRpdGxlKSx0aGlzLl9zdGFydEVkaXRpbmcuYmluZCh0aGlzLHRhcmdldCkpO319fQppZih0aGlzLl9kZWxldGVDYWxsYmFjayYmZ3JpZE5vZGUhPT10aGlzLmNyZWF0aW9uTm9kZSkKY29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRGVsZXRlJyksdGhpcy5fZGVsZXRlQ2FsbGJhY2suYmluZCh0aGlzLGdyaWROb2RlKSk7aWYodGhpcy5fcm93Q29udGV4dE1lbnVDYWxsYmFjaykKdGhpcy5fcm93Q29udGV4dE1lbnVDYWxsYmFjayhjb250ZXh0TWVudSxncmlkTm9kZSk7fQpjb250ZXh0TWVudS5zaG93KCk7fQpfY2xpY2tJbkRhdGFUYWJsZShldmVudCl7Y29uc3QgZ3JpZE5vZGU9dGhpcy5kYXRhR3JpZE5vZGVGcm9tTm9kZSgoZXZlbnQudGFyZ2V0KSk7aWYoIWdyaWROb2RlfHwhZ3JpZE5vZGUuaGFzQ2hpbGRyZW4oKXx8IWdyaWROb2RlLmlzRXZlbnRXaXRoaW5EaXNjbG9zdXJlVHJpYW5nbGUoZXZlbnQpKQpyZXR1cm47aWYoZ3JpZE5vZGUuZXhwYW5kZWQpe2lmKGV2ZW50LmFsdEtleSkKZ3JpZE5vZGUuY29sbGFwc2VSZWN1cnNpdmVseSgpO2Vsc2UKZ3JpZE5vZGUuY29sbGFwc2UoKTt9ZWxzZXtpZihldmVudC5hbHRLZXkpCmdyaWROb2RlLmV4cGFuZFJlY3Vyc2l2ZWx5KCk7ZWxzZQpncmlkTm9kZS5leHBhbmQoKTt9fQpzZXRSZXNpemVNZXRob2QobWV0aG9kKXt0aGlzLl9yZXNpemVNZXRob2Q9bWV0aG9kO30KX3N0YXJ0UmVzaXplckRyYWdnaW5nKGV2ZW50KXt0aGlzLl9jdXJyZW50UmVzaXplcj1ldmVudC50YXJnZXQ7cmV0dXJuIHRydWU7fQpfZW5kUmVzaXplckRyYWdnaW5nKCl7dGhpcy5fY3VycmVudFJlc2l6ZXI9bnVsbDt0aGlzLl9zYXZlQ29sdW1uV2VpZ2h0cygpO30KX3Jlc2l6ZXJEcmFnZ2luZyhldmVudCl7Y29uc3QgcmVzaXplcj10aGlzLl9jdXJyZW50UmVzaXplcjtpZighcmVzaXplcikKcmV0dXJuO2xldCBkcmFnUG9pbnQ9ZXZlbnQuY2xpZW50WC10aGlzLmVsZW1lbnQudG90YWxPZmZzZXRMZWZ0KCk7Y29uc3QgZmlyc3RSb3dDZWxscz10aGlzLl9oZWFkZXJUYWJsZUJvZHkucm93c1swXS5jZWxscztsZXQgbGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uPTA7bGV0IGxlZnRDZWxsSW5kZXg9cmVzaXplci5fX2luZGV4O2xldCByaWdodENlbGxJbmRleD1sZWZ0Q2VsbEluZGV4KzE7Zm9yKGxldCBpPTA7aTxsZWZ0Q2VsbEluZGV4O2krKykKbGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uKz1maXJzdFJvd0NlbGxzW2ldLm9mZnNldFdpZHRoO2lmKHRoaXMuX3Jlc2l6ZU1ldGhvZD09PURhdGFHcmlkLkRhdGFHcmlkLlJlc2l6ZU1ldGhvZC5MYXN0KXtyaWdodENlbGxJbmRleD10aGlzLl9yZXNpemVycy5sZW5ndGg7fWVsc2UgaWYodGhpcy5fcmVzaXplTWV0aG9kPT09RGF0YUdyaWQuRGF0YUdyaWQuUmVzaXplTWV0aG9kLkZpcnN0KXtsZWZ0RWRnZU9mUHJldmlvdXNDb2x1bW4rPWZpcnN0Um93Q2VsbHNbbGVmdENlbGxJbmRleF0ub2Zmc2V0V2lkdGgtZmlyc3RSb3dDZWxsc1swXS5vZmZzZXRXaWR0aDtsZWZ0Q2VsbEluZGV4PTA7fQpjb25zdCByaWdodEVkZ2VPZk5leHRDb2x1bW49bGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uK2ZpcnN0Um93Q2VsbHNbbGVmdENlbGxJbmRleF0ub2Zmc2V0V2lkdGgrZmlyc3RSb3dDZWxsc1tyaWdodENlbGxJbmRleF0ub2Zmc2V0V2lkdGg7Y29uc3QgbGVmdE1pbmltdW09bGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uK0RhdGFHcmlkLkRhdGFHcmlkLkNvbHVtblJlc2l6ZVBhZGRpbmc7Y29uc3QgcmlnaHRNYXhpbXVtPXJpZ2h0RWRnZU9mTmV4dENvbHVtbi1EYXRhR3JpZC5EYXRhR3JpZC5Db2x1bW5SZXNpemVQYWRkaW5nO2lmKGxlZnRNaW5pbXVtPnJpZ2h0TWF4aW11bSkKcmV0dXJuO2RyYWdQb2ludD1OdW1iZXIuY29uc3RyYWluKGRyYWdQb2ludCxsZWZ0TWluaW11bSxyaWdodE1heGltdW0pO2NvbnN0IHBvc2l0aW9uPShkcmFnUG9pbnQtRGF0YUdyaWQuRGF0YUdyaWQuQ2VudGVyUmVzaXplck92ZXJCb3JkZXJBZGp1c3RtZW50KTtyZXNpemVyLl9fcG9zaXRpb249cG9zaXRpb247cmVzaXplci5zdHlsZS5sZWZ0PXBvc2l0aW9uKydweCc7dGhpcy5fc2V0UHJlZmVycmVkV2lkdGgobGVmdENlbGxJbmRleCxkcmFnUG9pbnQtbGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uKTt0aGlzLl9zZXRQcmVmZXJyZWRXaWR0aChyaWdodENlbGxJbmRleCxyaWdodEVkZ2VPZk5leHRDb2x1bW4tZHJhZ1BvaW50KTtjb25zdCBsZWZ0Q29sdW1uPXRoaXMuX3Zpc2libGVDb2x1bW5zQXJyYXlbbGVmdENlbGxJbmRleF07Y29uc3QgcmlnaHRDb2x1bW49dGhpcy5fdmlzaWJsZUNvbHVtbnNBcnJheVtyaWdodENlbGxJbmRleF07aWYobGVmdENvbHVtbi53ZWlnaHR8fHJpZ2h0Q29sdW1uLndlaWdodCl7Y29uc3Qgc3VtT2ZXZWlnaHRzPWxlZnRDb2x1bW4ud2VpZ2h0K3JpZ2h0Q29sdW1uLndlaWdodDtjb25zdCBkZWx0YT1yaWdodEVkZ2VPZk5leHRDb2x1bW4tbGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uO2xlZnRDb2x1bW4ud2VpZ2h0PShkcmFnUG9pbnQtbGVmdEVkZ2VPZlByZXZpb3VzQ29sdW1uKSpzdW1PZldlaWdodHMvZGVsdGE7cmlnaHRDb2x1bW4ud2VpZ2h0PShyaWdodEVkZ2VPZk5leHRDb2x1bW4tZHJhZ1BvaW50KSpzdW1PZldlaWdodHMvZGVsdGE7fQp0aGlzLl9wb3NpdGlvblJlc2l6ZXJzKCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9Cl9zZXRQcmVmZXJyZWRXaWR0aChjb2x1bW5JbmRleCx3aWR0aCl7Y29uc3QgcHhXaWR0aD13aWR0aCsncHgnO3RoaXMuX2hlYWRlclRhYmxlQ29sdW1uR3JvdXAuY2hpbGRyZW5bY29sdW1uSW5kZXhdW0RhdGFHcmlkLkRhdGFHcmlkLl9wcmVmZXJyZWRXaWR0aFN5bWJvbF09d2lkdGg7dGhpcy5faGVhZGVyVGFibGVDb2x1bW5Hcm91cC5jaGlsZHJlbltjb2x1bW5JbmRleF0uc3R5bGUud2lkdGg9cHhXaWR0aDt0aGlzLl9kYXRhVGFibGVDb2x1bW5Hcm91cC5jaGlsZHJlbltjb2x1bW5JbmRleF0uc3R5bGUud2lkdGg9cHhXaWR0aDt9CmNvbHVtbk9mZnNldChjb2x1bW5JZCl7aWYoIXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCkKcmV0dXJuIDA7Zm9yKGxldCBpPTE7aTx0aGlzLl92aXNpYmxlQ29sdW1uc0FycmF5Lmxlbmd0aDsrK2kpe2lmKGNvbHVtbklkPT09dGhpcy5fdmlzaWJsZUNvbHVtbnNBcnJheVtpXS5pZCl7aWYodGhpcy5fcmVzaXplcnNbaS0xXSkKcmV0dXJuIHRoaXMuX3Jlc2l6ZXJzW2ktMV0uX19wb3NpdGlvbjt9fQpyZXR1cm4gMDt9CmFzV2lkZ2V0KCl7aWYoIXRoaXMuX2RhdGFHcmlkV2lkZ2V0KQp0aGlzLl9kYXRhR3JpZFdpZGdldD1uZXcgRGF0YUdyaWQuRGF0YUdyaWRXaWRnZXQodGhpcyk7cmV0dXJuIHRoaXMuX2RhdGFHcmlkV2lkZ2V0O30KdG9wRmlsbGVyUm93RWxlbWVudCgpe3JldHVybiB0aGlzLl90b3BGaWxsZXJSb3c7fX07RGF0YUdyaWQuRGF0YUdyaWQuQ29ybmVyV2lkdGg9MTQ7RGF0YUdyaWQuRGF0YUdyaWQuQ29sdW1uRGVzY3JpcHRvcjtEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHM9e1NlbGVjdGVkTm9kZTpTeW1ib2woJ1NlbGVjdGVkTm9kZScpLERlc2VsZWN0ZWROb2RlOlN5bWJvbCgnRGVzZWxlY3RlZE5vZGUnKSxPcGVuZWROb2RlOlN5bWJvbCgnT3BlbmVkTm9kZScpLFNvcnRpbmdDaGFuZ2VkOlN5bWJvbCgnU29ydGluZ0NoYW5nZWQnKSxQYWRkaW5nQ2hhbmdlZDpTeW1ib2woJ1BhZGRpbmdDaGFuZ2VkJyksfTtEYXRhR3JpZC5EYXRhR3JpZC5PcmRlcj17QXNjZW5kaW5nOidzb3J0LWFzY2VuZGluZycsRGVzY2VuZGluZzonc29ydC1kZXNjZW5kaW5nJ307RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ249e0NlbnRlcjonY2VudGVyJyxSaWdodDoncmlnaHQnfTtEYXRhR3JpZC5EYXRhR3JpZC5fcHJlZmVycmVkV2lkdGhTeW1ib2w9U3ltYm9sKCdwcmVmZXJyZWRXaWR0aCcpO0RhdGFHcmlkLkRhdGFHcmlkLl9jb2x1bW5JZFN5bWJvbD1TeW1ib2woJ2NvbHVtbklkJyk7RGF0YUdyaWQuRGF0YUdyaWQuX3NvcnRJY29uU3ltYm9sPVN5bWJvbCgnc29ydEljb24nKTtEYXRhR3JpZC5EYXRhR3JpZC5fbG9uZ1RleHRTeW1ib2w9U3ltYm9sKCdsb25nVGV4dCcpO0RhdGFHcmlkLkRhdGFHcmlkLkNvbHVtblJlc2l6ZVBhZGRpbmc9MjQ7RGF0YUdyaWQuRGF0YUdyaWQuQ2VudGVyUmVzaXplck92ZXJCb3JkZXJBZGp1c3RtZW50PTM7RGF0YUdyaWQuRGF0YUdyaWQuUmVzaXplTWV0aG9kPXtOZWFyZXN0OiduZWFyZXN0JyxGaXJzdDonZmlyc3QnLExhc3Q6J2xhc3QnfTtEYXRhR3JpZC5EYXRhR3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGRhdGEsaGFzQ2hpbGRyZW4pe3N1cGVyKCk7dGhpcy5fZWxlbWVudD1udWxsO3RoaXMuX2V4cGFuZGVkPWZhbHNlO3RoaXMuX3NlbGVjdGVkPWZhbHNlO3RoaXMuX2RpcnR5PWZhbHNlO3RoaXMuX2luYWN0aXZlPWZhbHNlO3RoaXMuX2RlcHRoO3RoaXMuX3JldmVhbGVkO3RoaXMuX2F0dGFjaGVkPWZhbHNlO3RoaXMuX3NhdmVkUG9zaXRpb249bnVsbDt0aGlzLl9zaG91bGRSZWZyZXNoQ2hpbGRyZW49dHJ1ZTt0aGlzLl9kYXRhPWRhdGF8fHt9O3RoaXMuX2hhc0NoaWxkcmVuPWhhc0NoaWxkcmVufHxmYWxzZTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuZGF0YUdyaWQ9bnVsbDt0aGlzLnBhcmVudD1udWxsO3RoaXMucHJldmlvdXNTaWJsaW5nPW51bGw7dGhpcy5uZXh0U2libGluZz1udWxsO3RoaXMuZGlzY2xvc3VyZVRvZ2dsZVdpZHRoPTEwO3RoaXMuc2VsZWN0YWJsZT10cnVlO3RoaXMuX2lzUm9vdD1mYWxzZTt9CmVsZW1lbnQoKXtpZighdGhpcy5fZWxlbWVudCl7Y29uc3QgZWxlbWVudD10aGlzLmNyZWF0ZUVsZW1lbnQoKTt0aGlzLmNyZWF0ZUNlbGxzKGVsZW1lbnQpO30KcmV0dXJuKHRoaXMuX2VsZW1lbnQpO30KY3JlYXRlRWxlbWVudCgpe3RoaXMuX2VsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygndHInLCdkYXRhLWdyaWQtZGF0YS1ncmlkLW5vZGUnKTt0aGlzLl9lbGVtZW50Ll9kYXRhR3JpZE5vZGU9dGhpcztpZih0aGlzLl9oYXNDaGlsZHJlbikKdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYXJlbnQnKTtpZih0aGlzLmV4cGFuZGVkKQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7aWYodGhpcy5zZWxlY3RlZCkKdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO2lmKHRoaXMucmV2ZWFsZWQpCnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTtpZih0aGlzLmRpcnR5KQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RpcnR5Jyk7aWYodGhpcy5pbmFjdGl2ZSkKdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpbmFjdGl2ZScpO3JldHVybiB0aGlzLl9lbGVtZW50O30KZXhpc3RpbmdFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnR8fG51bGw7fQpyZXNldEVsZW1lbnQoKXt0aGlzLl9lbGVtZW50PW51bGw7fQpjcmVhdGVDZWxscyhlbGVtZW50KXtlbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgY29sdW1uc0FycmF5PXRoaXMuZGF0YUdyaWQuX3Zpc2libGVDb2x1bW5zQXJyYXk7Zm9yKGxldCBpPTA7aTxjb2x1bW5zQXJyYXkubGVuZ3RoOysraSkKZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbGwoY29sdW1uc0FycmF5W2ldLmlkKSk7ZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVURFdpdGhDbGFzcygnY29ybmVyJykpO30KZ2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YTt9CnNldCBkYXRhKHgpe3RoaXMuX2RhdGE9eHx8e307dGhpcy5yZWZyZXNoKCk7fQpnZXQgcmV2ZWFsZWQoKXtpZih0aGlzLl9yZXZlYWxlZCE9PXVuZGVmaW5lZCkKcmV0dXJuIHRoaXMuX3JldmVhbGVkO2xldCBjdXJyZW50QW5jZXN0b3I9dGhpcy5wYXJlbnQ7d2hpbGUoY3VycmVudEFuY2VzdG9yJiYhY3VycmVudEFuY2VzdG9yLl9pc1Jvb3Qpe2lmKCFjdXJyZW50QW5jZXN0b3IuZXhwYW5kZWQpe3RoaXMuX3JldmVhbGVkPWZhbHNlO3JldHVybiBmYWxzZTt9CmN1cnJlbnRBbmNlc3Rvcj1jdXJyZW50QW5jZXN0b3IucGFyZW50O30KdGhpcy5yZXZlYWxlZD10cnVlO3JldHVybiB0cnVlO30Kc2V0IHJldmVhbGVkKHgpe2lmKHRoaXMuX3JldmVhbGVkPT09eCkKcmV0dXJuO3RoaXMuX3JldmVhbGVkPXg7aWYodGhpcy5fZWxlbWVudCkKdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdyZXZlYWxlZCcsdGhpcy5fcmV2ZWFsZWQpO2ZvcihsZXQgaT0wO2k8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KytpKQp0aGlzLmNoaWxkcmVuW2ldLnJldmVhbGVkPXgmJnRoaXMuZXhwYW5kZWQ7fQppc0RpcnR5KCl7cmV0dXJuIHRoaXMuX2RpcnR5O30Kc2V0RGlydHkoZGlydHkpe2lmKHRoaXMuX2RpcnR5PT09ZGlydHkpCnJldHVybjt0aGlzLl9kaXJ0eT1kaXJ0eTtpZighdGhpcy5fZWxlbWVudCkKcmV0dXJuO2lmKGRpcnR5KQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RpcnR5Jyk7ZWxzZQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RpcnR5Jyk7fQppc0luYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2luYWN0aXZlO30Kc2V0SW5hY3RpdmUoaW5hY3RpdmUpe2lmKHRoaXMuX2luYWN0aXZlPT09aW5hY3RpdmUpCnJldHVybjt0aGlzLl9pbmFjdGl2ZT1pbmFjdGl2ZTtpZighdGhpcy5fZWxlbWVudCkKcmV0dXJuO2lmKGluYWN0aXZlKQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2luYWN0aXZlJyk7ZWxzZQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2luYWN0aXZlJyk7fQpoYXNDaGlsZHJlbigpe3JldHVybiB0aGlzLl9oYXNDaGlsZHJlbjt9CnNldEhhc0NoaWxkcmVuKHgpe2lmKHRoaXMuX2hhc0NoaWxkcmVuPT09eCkKcmV0dXJuO3RoaXMuX2hhc0NoaWxkcmVuPXg7aWYoIXRoaXMuX2VsZW1lbnQpCnJldHVybjt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3BhcmVudCcsdGhpcy5faGFzQ2hpbGRyZW4pO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZXhwYW5kZWQnLHRoaXMuX2hhc0NoaWxkcmVuJiZ0aGlzLmV4cGFuZGVkKTt9CmdldCBkZXB0aCgpe2lmKHRoaXMuX2RlcHRoIT09dW5kZWZpbmVkKQpyZXR1cm4gdGhpcy5fZGVwdGg7aWYodGhpcy5wYXJlbnQmJiF0aGlzLnBhcmVudC5faXNSb290KQp0aGlzLl9kZXB0aD10aGlzLnBhcmVudC5kZXB0aCsxO2Vsc2UKdGhpcy5fZGVwdGg9MDtyZXR1cm4gdGhpcy5fZGVwdGg7fQpnZXQgbGVmdFBhZGRpbmcoKXtyZXR1cm4gdGhpcy5kZXB0aCp0aGlzLmRhdGFHcmlkLmluZGVudFdpZHRoO30KZ2V0IHNob3VsZFJlZnJlc2hDaGlsZHJlbigpe3JldHVybiB0aGlzLl9zaG91bGRSZWZyZXNoQ2hpbGRyZW47fQpzZXQgc2hvdWxkUmVmcmVzaENoaWxkcmVuKHgpe3RoaXMuX3Nob3VsZFJlZnJlc2hDaGlsZHJlbj14O2lmKHgmJnRoaXMuZXhwYW5kZWQpCnRoaXMuZXhwYW5kKCk7fQpnZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7fQpzZXQgc2VsZWN0ZWQoeCl7aWYoeCkKdGhpcy5zZWxlY3QoKTtlbHNlCnRoaXMuZGVzZWxlY3QoKTt9CmdldCBleHBhbmRlZCgpe3JldHVybiB0aGlzLl9leHBhbmRlZDt9CnNldCBleHBhbmRlZCh4KXtpZih4KQp0aGlzLmV4cGFuZCgpO2Vsc2UKdGhpcy5jb2xsYXBzZSgpO30KcmVmcmVzaCgpe2lmKCF0aGlzLmRhdGFHcmlkKQp0aGlzLl9lbGVtZW50PW51bGw7aWYoIXRoaXMuX2VsZW1lbnQpCnJldHVybjt0aGlzLmNyZWF0ZUNlbGxzKHRoaXMuX2VsZW1lbnQpO30KX2NyZWF0ZVREV2l0aENsYXNzKGNsYXNzTmFtZSl7Y29uc3QgY2VsbD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCd0ZCcsY2xhc3NOYW1lKTtjb25zdCBjZWxsQ2xhc3M9dGhpcy5kYXRhR3JpZC5fY2VsbENsYXNzO2lmKGNlbGxDbGFzcykKY2VsbC5jbGFzc0xpc3QuYWRkKGNlbGxDbGFzcyk7cmV0dXJuIGNlbGw7fQpjcmVhdGVURChjb2x1bW5JZCl7Y29uc3QgY2VsbD10aGlzLl9jcmVhdGVURFdpdGhDbGFzcyhjb2x1bW5JZCsnLWNvbHVtbicpO2NlbGxbRGF0YUdyaWQuRGF0YUdyaWQuX2NvbHVtbklkU3ltYm9sXT1jb2x1bW5JZDtjb25zdCBhbGlnbm1lbnQ9dGhpcy5kYXRhR3JpZC5fY29sdW1uc1tjb2x1bW5JZF0uYWxpZ247aWYoYWxpZ25tZW50KQpjZWxsLmNsYXNzTGlzdC5hZGQoYWxpZ25tZW50KTtpZihjb2x1bW5JZD09PXRoaXMuZGF0YUdyaWQuZGlzY2xvc3VyZUNvbHVtbklkKXtjZWxsLmNsYXNzTGlzdC5hZGQoJ2Rpc2Nsb3N1cmUnKTtpZih0aGlzLmxlZnRQYWRkaW5nKQpjZWxsLnN0eWxlLnNldFByb3BlcnR5KCdwYWRkaW5nLWxlZnQnLHRoaXMubGVmdFBhZGRpbmcrJ3B4Jyk7fQpyZXR1cm4gY2VsbDt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2NvbnN0IGNlbGw9dGhpcy5jcmVhdGVURChjb2x1bW5JZCk7Y29uc3QgZGF0YT10aGlzLmRhdGFbY29sdW1uSWRdO2lmKGRhdGEgaW5zdGFuY2VvZiBOb2RlKQpjZWxsLmFwcGVuZENoaWxkKGRhdGEpO2Vsc2UgaWYoZGF0YSE9PW51bGwpCkRhdGFHcmlkLkRhdGFHcmlkLnNldEVsZW1lbnRUZXh0KGNlbGwsKGRhdGEpLCEhdGhpcy5kYXRhR3JpZC5fY29sdW1uc1tjb2x1bW5JZF0ubG9uZ1RleHQpO3JldHVybiBjZWxsO30Kbm9kZVNlbGZIZWlnaHQoKXtyZXR1cm4gMjA7fQphcHBlbmRDaGlsZChjaGlsZCl7dGhpcy5pbnNlcnRDaGlsZChjaGlsZCx0aGlzLmNoaWxkcmVuLmxlbmd0aCk7fQpyZXNldE5vZGUob25seUNhY2hlcyl7ZGVsZXRlIHRoaXMuX2RlcHRoO2RlbGV0ZSB0aGlzLl9yZXZlYWxlZDtpZihvbmx5Q2FjaGVzKQpyZXR1cm47aWYodGhpcy5wcmV2aW91c1NpYmxpbmcpCnRoaXMucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nPXRoaXMubmV4dFNpYmxpbmc7aWYodGhpcy5uZXh0U2libGluZykKdGhpcy5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc7dGhpcy5kYXRhR3JpZD1udWxsO3RoaXMucGFyZW50PW51bGw7dGhpcy5uZXh0U2libGluZz1udWxsO3RoaXMucHJldmlvdXNTaWJsaW5nPW51bGw7dGhpcy5fYXR0YWNoZWQ9ZmFsc2U7fQppbnNlcnRDaGlsZChjaGlsZCxpbmRleCl7aWYoIWNoaWxkKQp0aHJvdydpbnNlcnRDaGlsZDogTm9kZSBjYW5cJ3QgYmUgdW5kZWZpbmVkIG9yIG51bGwuJztpZihjaGlsZC5wYXJlbnQ9PT10aGlzKXtjb25zdCBjdXJyZW50SW5kZXg9dGhpcy5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTtpZihjdXJyZW50SW5kZXg8MCkKY29uc29sZS5hc3NlcnQoZmFsc2UsJ0luY29uc2lzdGVudCBEYXRhR3JpZCBzdGF0ZScpO2lmKGN1cnJlbnRJbmRleD09PWluZGV4KQpyZXR1cm47aWYoY3VycmVudEluZGV4PGluZGV4KQotLWluZGV4O30KY2hpbGQucmVtb3ZlKCk7dGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsMCxjaGlsZCk7dGhpcy5zZXRIYXNDaGlsZHJlbih0cnVlKTtjaGlsZC5wYXJlbnQ9dGhpcztjaGlsZC5kYXRhR3JpZD10aGlzLmRhdGFHcmlkO2NoaWxkLnJlY2FsY3VsYXRlU2libGluZ3MoaW5kZXgpO2NoaWxkLl9zaG91bGRSZWZyZXNoQ2hpbGRyZW49dHJ1ZTtsZXQgY3VycmVudD1jaGlsZC5jaGlsZHJlblswXTt3aGlsZShjdXJyZW50KXtjdXJyZW50LnJlc2V0Tm9kZSh0cnVlKTtjdXJyZW50LmRhdGFHcmlkPXRoaXMuZGF0YUdyaWQ7Y3VycmVudC5fYXR0YWNoZWQ9ZmFsc2U7Y3VycmVudC5fc2hvdWxkUmVmcmVzaENoaWxkcmVuPXRydWU7Y3VycmVudD1jdXJyZW50LnRyYXZlcnNlTmV4dE5vZGUoZmFsc2UsY2hpbGQsdHJ1ZSk7fQppZih0aGlzLmV4cGFuZGVkKQpjaGlsZC5fYXR0YWNoKCk7aWYoIXRoaXMucmV2ZWFsZWQpCmNoaWxkLnJldmVhbGVkPWZhbHNlO30KcmVtb3ZlKCl7aWYodGhpcy5wYXJlbnQpCnRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO30KcmVtb3ZlQ2hpbGQoY2hpbGQpe2lmKCFjaGlsZCkKdGhyb3cncmVtb3ZlQ2hpbGQ6IE5vZGUgY2FuXCd0IGJlIHVuZGVmaW5lZCBvciBudWxsLic7aWYoY2hpbGQucGFyZW50IT09dGhpcykKdGhyb3cncmVtb3ZlQ2hpbGQ6IE5vZGUgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLic7aWYodGhpcy5kYXRhR3JpZCkKdGhpcy5kYXRhR3JpZC51cGRhdGVTZWxlY3Rpb25CZWZvcmVSZW1vdmFsKGNoaWxkLGZhbHNlKTtjaGlsZC5fZGV0YWNoKCk7Y2hpbGQucmVzZXROb2RlKCk7dGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQsdHJ1ZSk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg8PTApCnRoaXMuc2V0SGFzQ2hpbGRyZW4oZmFsc2UpO30KcmVtb3ZlQ2hpbGRyZW4oKXtpZih0aGlzLmRhdGFHcmlkKQp0aGlzLmRhdGFHcmlkLnVwZGF0ZVNlbGVjdGlvbkJlZm9yZVJlbW92YWwodGhpcyx0cnVlKTtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSl7Y29uc3QgY2hpbGQ9dGhpcy5jaGlsZHJlbltpXTtjaGlsZC5fZGV0YWNoKCk7Y2hpbGQucmVzZXROb2RlKCk7fQp0aGlzLmNoaWxkcmVuPVtdO3RoaXMuc2V0SGFzQ2hpbGRyZW4oZmFsc2UpO30KcmVjYWxjdWxhdGVTaWJsaW5ncyhteUluZGV4KXtpZighdGhpcy5wYXJlbnQpCnJldHVybjtjb25zdCBwcmV2aW91c0NoaWxkPXRoaXMucGFyZW50LmNoaWxkcmVuW215SW5kZXgtMV18fG51bGw7aWYocHJldmlvdXNDaGlsZCkKcHJldmlvdXNDaGlsZC5uZXh0U2libGluZz10aGlzO3RoaXMucHJldmlvdXNTaWJsaW5nPXByZXZpb3VzQ2hpbGQ7Y29uc3QgbmV4dENoaWxkPXRoaXMucGFyZW50LmNoaWxkcmVuW215SW5kZXgrMV18fG51bGw7aWYobmV4dENoaWxkKQpuZXh0Q2hpbGQucHJldmlvdXNTaWJsaW5nPXRoaXM7dGhpcy5uZXh0U2libGluZz1uZXh0Q2hpbGQ7fQpjb2xsYXBzZSgpe2lmKHRoaXMuX2lzUm9vdCkKcmV0dXJuO2lmKHRoaXMuX2VsZW1lbnQpCnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTt0aGlzLl9leHBhbmRlZD1mYWxzZTtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5jaGlsZHJlbltpXS5yZXZlYWxlZD1mYWxzZTt9CmNvbGxhcHNlUmVjdXJzaXZlbHkoKXtsZXQgaXRlbT10aGlzO3doaWxlKGl0ZW0pe2lmKGl0ZW0uZXhwYW5kZWQpCml0ZW0uY29sbGFwc2UoKTtpdGVtPWl0ZW0udHJhdmVyc2VOZXh0Tm9kZShmYWxzZSx0aGlzLHRydWUpO319CnBvcHVsYXRlKCl7fQpleHBhbmQoKXtpZighdGhpcy5faGFzQ2hpbGRyZW58fHRoaXMuZXhwYW5kZWQpCnJldHVybjtpZih0aGlzLl9pc1Jvb3QpCnJldHVybjtpZih0aGlzLnJldmVhbGVkJiYhdGhpcy5fc2hvdWxkUmVmcmVzaENoaWxkcmVuKXtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5jaGlsZHJlbltpXS5yZXZlYWxlZD10cnVlO30KaWYodGhpcy5fc2hvdWxkUmVmcmVzaENoaWxkcmVuKXtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5jaGlsZHJlbltpXS5fZGV0YWNoKCk7dGhpcy5wb3B1bGF0ZSgpO2lmKHRoaXMuX2F0dGFjaGVkKXtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSl7Y29uc3QgY2hpbGQ9dGhpcy5jaGlsZHJlbltpXTtpZih0aGlzLnJldmVhbGVkKQpjaGlsZC5yZXZlYWxlZD10cnVlO2NoaWxkLl9hdHRhY2goKTt9fQp0aGlzLl9zaG91bGRSZWZyZXNoQ2hpbGRyZW49ZmFsc2U7fQppZih0aGlzLl9lbGVtZW50KQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7dGhpcy5fZXhwYW5kZWQ9dHJ1ZTt9CmV4cGFuZFJlY3Vyc2l2ZWx5KCl7bGV0IGl0ZW09dGhpczt3aGlsZShpdGVtKXtpdGVtLmV4cGFuZCgpO2l0ZW09aXRlbS50cmF2ZXJzZU5leHROb2RlKGZhbHNlLHRoaXMpO319CnJldmVhbCgpe2lmKHRoaXMuX2lzUm9vdCkKcmV0dXJuO2xldCBjdXJyZW50QW5jZXN0b3I9dGhpcy5wYXJlbnQ7d2hpbGUoY3VycmVudEFuY2VzdG9yJiYhY3VycmVudEFuY2VzdG9yLl9pc1Jvb3Qpe2lmKCFjdXJyZW50QW5jZXN0b3IuZXhwYW5kZWQpCmN1cnJlbnRBbmNlc3Rvci5leHBhbmQoKTtjdXJyZW50QW5jZXN0b3I9Y3VycmVudEFuY2VzdG9yLnBhcmVudDt9CnRoaXMuZWxlbWVudCgpLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoZmFsc2UpO30Kc2VsZWN0KHN1cHJlc3NTZWxlY3RlZEV2ZW50KXtpZighdGhpcy5kYXRhR3JpZHx8IXRoaXMuc2VsZWN0YWJsZXx8dGhpcy5zZWxlY3RlZCkKcmV0dXJuO2lmKHRoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlKQp0aGlzLmRhdGFHcmlkLnNlbGVjdGVkTm9kZS5kZXNlbGVjdCgpO3RoaXMuX3NlbGVjdGVkPXRydWU7dGhpcy5kYXRhR3JpZC5zZWxlY3RlZE5vZGU9dGhpcztpZih0aGlzLl9lbGVtZW50KQp0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7aWYoIXN1cHJlc3NTZWxlY3RlZEV2ZW50KQp0aGlzLmRhdGFHcmlkLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU2VsZWN0ZWROb2RlLHRoaXMpO30KcmV2ZWFsQW5kU2VsZWN0KCl7aWYodGhpcy5faXNSb290KQpyZXR1cm47dGhpcy5yZXZlYWwoKTt0aGlzLnNlbGVjdCgpO30KZGVzZWxlY3Qoc3VwcmVzc0Rlc2VsZWN0ZWRFdmVudCl7aWYoIXRoaXMuZGF0YUdyaWR8fHRoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlIT09dGhpc3x8IXRoaXMuc2VsZWN0ZWQpCnJldHVybjt0aGlzLl9zZWxlY3RlZD1mYWxzZTt0aGlzLmRhdGFHcmlkLnNlbGVjdGVkTm9kZT1udWxsO2lmKHRoaXMuX2VsZW1lbnQpCnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtpZighc3VwcmVzc0Rlc2VsZWN0ZWRFdmVudCkKdGhpcy5kYXRhR3JpZC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLkRlc2VsZWN0ZWROb2RlKTt9CnRyYXZlcnNlTmV4dE5vZGUoc2tpcEhpZGRlbixzdGF5V2l0aGluLGRvbnRQb3B1bGF0ZSxpbmZvKXtpZighZG9udFBvcHVsYXRlJiZ0aGlzLl9oYXNDaGlsZHJlbikKdGhpcy5wb3B1bGF0ZSgpO2lmKGluZm8pCmluZm8uZGVwdGhDaGFuZ2U9MDtsZXQgbm9kZT0oIXNraXBIaWRkZW58fHRoaXMucmV2ZWFsZWQpP3RoaXMuY2hpbGRyZW5bMF06bnVsbDtpZihub2RlJiYoIXNraXBIaWRkZW58fHRoaXMuZXhwYW5kZWQpKXtpZihpbmZvKQppbmZvLmRlcHRoQ2hhbmdlPTE7cmV0dXJuIG5vZGU7fQppZih0aGlzPT09c3RheVdpdGhpbikKcmV0dXJuIG51bGw7bm9kZT0oIXNraXBIaWRkZW58fHRoaXMucmV2ZWFsZWQpP3RoaXMubmV4dFNpYmxpbmc6bnVsbDtpZihub2RlKQpyZXR1cm4gbm9kZTtub2RlPXRoaXM7d2hpbGUobm9kZSYmIW5vZGUuX2lzUm9vdCYmISgoIXNraXBIaWRkZW58fG5vZGUucmV2ZWFsZWQpP25vZGUubmV4dFNpYmxpbmc6bnVsbCkmJm5vZGUucGFyZW50IT09c3RheVdpdGhpbil7aWYoaW5mbykKaW5mby5kZXB0aENoYW5nZS09MTtub2RlPW5vZGUucGFyZW50O30KaWYoIW5vZGUpCnJldHVybiBudWxsO3JldHVybighc2tpcEhpZGRlbnx8bm9kZS5yZXZlYWxlZCk/bm9kZS5uZXh0U2libGluZzpudWxsO30KdHJhdmVyc2VQcmV2aW91c05vZGUoc2tpcEhpZGRlbixkb250UG9wdWxhdGUpe2xldCBub2RlPSghc2tpcEhpZGRlbnx8dGhpcy5yZXZlYWxlZCk/dGhpcy5wcmV2aW91c1NpYmxpbmc6bnVsbDtpZighZG9udFBvcHVsYXRlJiZub2RlJiZub2RlLl9oYXNDaGlsZHJlbikKbm9kZS5wb3B1bGF0ZSgpO3doaWxlKG5vZGUmJigoIXNraXBIaWRkZW58fChub2RlLnJldmVhbGVkJiZub2RlLmV4cGFuZGVkKSk/bm9kZS5jaGlsZHJlbltub2RlLmNoaWxkcmVuLmxlbmd0aC0xXTpudWxsKSl7aWYoIWRvbnRQb3B1bGF0ZSYmbm9kZS5faGFzQ2hpbGRyZW4pCm5vZGUucG9wdWxhdGUoKTtub2RlPSgoIXNraXBIaWRkZW58fChub2RlLnJldmVhbGVkJiZub2RlLmV4cGFuZGVkKSk/bm9kZS5jaGlsZHJlbltub2RlLmNoaWxkcmVuLmxlbmd0aC0xXTpudWxsKTt9CmlmKG5vZGUpCnJldHVybiBub2RlO2lmKCF0aGlzLnBhcmVudHx8dGhpcy5wYXJlbnQuX2lzUm9vdCkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMucGFyZW50O30KaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCl7aWYoIXRoaXMuX2hhc0NoaWxkcmVuKQpyZXR1cm4gZmFsc2U7Y29uc3QgY2VsbD1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhOb2RlTmFtZSgndGQnKTtpZighY2VsbHx8IWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNjbG9zdXJlJykpCnJldHVybiBmYWxzZTtjb25zdCBsZWZ0PWNlbGwudG90YWxPZmZzZXRMZWZ0KCkrdGhpcy5sZWZ0UGFkZGluZztyZXR1cm4gZXZlbnQucGFnZVg+PWxlZnQmJmV2ZW50LnBhZ2VYPD1sZWZ0K3RoaXMuZGlzY2xvc3VyZVRvZ2dsZVdpZHRoO30KX2F0dGFjaCgpe2lmKCF0aGlzLmRhdGFHcmlkfHx0aGlzLl9hdHRhY2hlZCkKcmV0dXJuO3RoaXMuX2F0dGFjaGVkPXRydWU7Y29uc3QgcHJldmlvdXNOb2RlPXRoaXMudHJhdmVyc2VQcmV2aW91c05vZGUodHJ1ZSx0cnVlKTtjb25zdCBwcmV2aW91c0VsZW1lbnQ9cHJldmlvdXNOb2RlP3ByZXZpb3VzTm9kZS5lbGVtZW50KCk6dGhpcy5kYXRhR3JpZC5fdG9wRmlsbGVyUm93O3RoaXMuZGF0YUdyaWQuZGF0YVRhYmxlQm9keS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50KCkscHJldmlvdXNFbGVtZW50Lm5leHRTaWJsaW5nKTtpZih0aGlzLmV4cGFuZGVkKXtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5jaGlsZHJlbltpXS5fYXR0YWNoKCk7fX0KX2RldGFjaCgpe2lmKCF0aGlzLl9hdHRhY2hlZCkKcmV0dXJuO3RoaXMuX2F0dGFjaGVkPWZhbHNlO2lmKHRoaXMuX2VsZW1lbnQpCnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7Zm9yKGxldCBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsrK2kpCnRoaXMuY2hpbGRyZW5baV0uX2RldGFjaCgpO30Kc2F2ZVBvc2l0aW9uKCl7aWYodGhpcy5fc2F2ZWRQb3NpdGlvbikKcmV0dXJuO2lmKCF0aGlzLnBhcmVudCkKdGhyb3cnc2F2ZVBvc2l0aW9uOiBOb2RlIG11c3QgaGF2ZSBhIHBhcmVudC4nO3RoaXMuX3NhdmVkUG9zaXRpb249e3BhcmVudDp0aGlzLnBhcmVudCxpbmRleDp0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpfTt9CnJlc3RvcmVQb3NpdGlvbigpe2lmKCF0aGlzLl9zYXZlZFBvc2l0aW9uKQpyZXR1cm47aWYodGhpcy5wYXJlbnQhPT10aGlzLl9zYXZlZFBvc2l0aW9uLnBhcmVudCkKdGhpcy5fc2F2ZWRQb3NpdGlvbi5wYXJlbnQuaW5zZXJ0Q2hpbGQodGhpcyx0aGlzLl9zYXZlZFBvc2l0aW9uLmluZGV4KTt0aGlzLl9zYXZlZFBvc2l0aW9uPW51bGw7fX07RGF0YUdyaWQuQ3JlYXRpb25EYXRhR3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5EYXRhR3JpZE5vZGV7Y29uc3RydWN0b3IoZGF0YSxoYXNDaGlsZHJlbil7c3VwZXIoZGF0YSxoYXNDaGlsZHJlbik7dGhpcy5pc0NyZWF0aW9uTm9kZT10cnVlO30KbWFrZU5vcm1hbCgpe3RoaXMuaXNDcmVhdGlvbk5vZGU9ZmFsc2U7fX07RGF0YUdyaWQuRGF0YUdyaWRXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGRhdGFHcmlkKXtzdXBlcigpO3RoaXMuX2RhdGFHcmlkPWRhdGFHcmlkO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkYXRhR3JpZC5lbGVtZW50KTt9Cndhc1Nob3duKCl7dGhpcy5fZGF0YUdyaWQud2FzU2hvd24oKTt9CndpbGxIaWRlKCl7dGhpcy5fZGF0YUdyaWQud2lsbEhpZGUoKTt9Cm9uUmVzaXplKCl7dGhpcy5fZGF0YUdyaWQub25SZXNpemUoKTt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7cmV0dXJuW3RoaXMuX2RhdGFHcmlkLl9zY3JvbGxDb250YWluZXJdO30KZGV0YWNoQ2hpbGRXaWRnZXRzKCl7c3VwZXIuZGV0YWNoQ2hpbGRXaWRnZXRzKCk7Zm9yKGNvbnN0IGRhdGFHcmlkIG9mIHRoaXMuX2RhdGFHcmlkcykKdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKGRhdGFHcmlkLmVsZW1lbnQpO3RoaXMuX2RhdGFHcmlkcz1bXTt9fTs7RGF0YUdyaWQuVmlld3BvcnREYXRhR3JpZD1jbGFzcyBleHRlbmRzIERhdGFHcmlkLkRhdGFHcmlke2NvbnN0cnVjdG9yKGNvbHVtbnNBcnJheSxlZGl0Q2FsbGJhY2ssZGVsZXRlQ2FsbGJhY2sscmVmcmVzaENhbGxiYWNrKXtzdXBlcihjb2x1bW5zQXJyYXksZWRpdENhbGxiYWNrLGRlbGV0ZUNhbGxiYWNrLHJlZnJlc2hDYWxsYmFjayk7dGhpcy5fb25TY3JvbGxCb3VuZD10aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpO3RoaXMuX3Njcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX29uU2Nyb2xsQm91bmQsdHJ1ZSk7dGhpcy5fdmlzaWJsZU5vZGVzPVtdO3RoaXMuX2lubGluZT1mYWxzZTt0aGlzLl9zdGlja1RvQm90dG9tPWZhbHNlO3RoaXMuX3VwZGF0ZUlzRnJvbVVzZXI9ZmFsc2U7dGhpcy5fbGFzdFNjcm9sbFRvcD0wO3RoaXMuX2ZpcnN0VmlzaWJsZUlzU3RyaXBlZD1mYWxzZTt0aGlzLl9pc1N0cmlwZWQ9ZmFsc2U7dGhpcy5zZXRSb290Tm9kZShuZXcgRGF0YUdyaWQuVmlld3BvcnREYXRhR3JpZE5vZGUoKSk7fQpzZXRTdHJpcGVkKHN0cmlwZWQpe3RoaXMuX2lzU3RyaXBlZD1zdHJpcGVkO2xldCBzdGFydHNXaXRoT2RkPXRydWU7aWYodGhpcy5fdmlzaWJsZU5vZGVzLmxlbmd0aCl7Y29uc3QgYWxsQ2hpbGRyZW49dGhpcy5yb290Tm9kZSgpLmZsYXRDaGlsZHJlbigpO3N0YXJ0c1dpdGhPZGQ9ISEoYWxsQ2hpbGRyZW4uaW5kZXhPZih0aGlzLl92aXNpYmxlTm9kZXNbMF0pKTt9CnRoaXMuX3VwZGF0ZVN0cmlwZXNDbGFzcyhzdGFydHNXaXRoT2RkKTt9Cl91cGRhdGVTdHJpcGVzQ2xhc3Moc3RhcnRzV2l0aE9kZCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3N0cmlwZWQtZGF0YS1ncmlkJywhc3RhcnRzV2l0aE9kZCYmdGhpcy5faXNTdHJpcGVkKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc3RyaXBlZC1kYXRhLWdyaWQtc3RhcnRzLXdpdGgtb2RkJyxzdGFydHNXaXRoT2RkJiZ0aGlzLl9pc1N0cmlwZWQpO30Kc2V0U2Nyb2xsQ29udGFpbmVyKHNjcm9sbENvbnRhaW5lcil7dGhpcy5fc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fb25TY3JvbGxCb3VuZCx0cnVlKTt0aGlzLl9zY3JvbGxDb250YWluZXI9c2Nyb2xsQ29udGFpbmVyO3RoaXMuX3Njcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX29uU2Nyb2xsQm91bmQsdHJ1ZSk7fQpvblJlc2l6ZSgpe2lmKHRoaXMuX3N0aWNrVG9Cb3R0b20pCnRoaXMuX3Njcm9sbENvbnRhaW5lci5zY3JvbGxUb3A9dGhpcy5fc2Nyb2xsQ29udGFpbmVyLnNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxDb250YWluZXIuY2xpZW50SGVpZ2h0O3RoaXMuc2NoZWR1bGVVcGRhdGUoKTtzdXBlci5vblJlc2l6ZSgpO30Kc2V0U3RpY2tUb0JvdHRvbShzdGljayl7dGhpcy5fc3RpY2tUb0JvdHRvbT1zdGljazt9Cl9vblNjcm9sbChldmVudCl7dGhpcy5fc3RpY2tUb0JvdHRvbT10aGlzLl9zY3JvbGxDb250YWluZXIuaXNTY3JvbGxlZFRvQm90dG9tKCk7aWYodGhpcy5fbGFzdFNjcm9sbFRvcCE9PXRoaXMuX3Njcm9sbENvbnRhaW5lci5zY3JvbGxUb3ApCnRoaXMuc2NoZWR1bGVVcGRhdGUodHJ1ZSk7fQpzY2hlZHVsZVVwZGF0ZVN0cnVjdHVyZSgpe3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9CnNjaGVkdWxlVXBkYXRlKGlzRnJvbVVzZXIpe2lmKHRoaXMuX3N0aWNrVG9Cb3R0b20mJmlzRnJvbVVzZXIpCnRoaXMuX3N0aWNrVG9Cb3R0b209dGhpcy5fc2Nyb2xsQ29udGFpbmVyLmlzU2Nyb2xsZWRUb0JvdHRvbSgpO3RoaXMuX3VwZGF0ZUlzRnJvbVVzZXI9dGhpcy5fdXBkYXRlSXNGcm9tVXNlcnx8aXNGcm9tVXNlcjtpZih0aGlzLl91cGRhdGVBbmltYXRpb25GcmFtZUlkKQpyZXR1cm47dGhpcy5fdXBkYXRlQW5pbWF0aW9uRnJhbWVJZD10aGlzLmVsZW1lbnQud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTt9CnVwZGF0ZUluc3RhbnRseSgpe3RoaXMuX3VwZGF0ZSgpO30KcmVuZGVySW5saW5lKCl7dGhpcy5faW5saW5lPXRydWU7c3VwZXIucmVuZGVySW5saW5lKCk7dGhpcy5fdXBkYXRlKCk7fQpfY2FsY3VsYXRlVmlzaWJsZU5vZGVzKGNsaWVudEhlaWdodCxzY3JvbGxUb3Ape2NvbnN0IG5vZGVzPXRoaXMucm9vdE5vZGUoKS5mbGF0Q2hpbGRyZW4oKTtpZih0aGlzLl9pbmxpbmUpCnJldHVybnt0b3BQYWRkaW5nOjAsYm90dG9tUGFkZGluZzowLGNvbnRlbnRIZWlnaHQ6MCx2aXNpYmxlTm9kZXM6bm9kZXMsb2Zmc2V0OjB9O2NvbnN0IHNpemU9bm9kZXMubGVuZ3RoO2xldCBpPTA7bGV0IHk9MDtmb3IoO2k8c2l6ZSYmeStub2Rlc1tpXS5ub2RlU2VsZkhlaWdodCgpPHNjcm9sbFRvcDsrK2kpCnkrPW5vZGVzW2ldLm5vZGVTZWxmSGVpZ2h0KCk7Y29uc3Qgc3RhcnQ9aTtjb25zdCB0b3BQYWRkaW5nPXk7Zm9yKDtpPHNpemUmJnk8c2Nyb2xsVG9wK2NsaWVudEhlaWdodDsrK2kpCnkrPW5vZGVzW2ldLm5vZGVTZWxmSGVpZ2h0KCk7Y29uc3QgZW5kPWk7bGV0IGJvdHRvbVBhZGRpbmc9MDtmb3IoO2k8c2l6ZTsrK2kpCmJvdHRvbVBhZGRpbmcrPW5vZGVzW2ldLm5vZGVTZWxmSGVpZ2h0KCk7cmV0dXJue3RvcFBhZGRpbmc6dG9wUGFkZGluZyxib3R0b21QYWRkaW5nOmJvdHRvbVBhZGRpbmcsY29udGVudEhlaWdodDp5LXRvcFBhZGRpbmcsdmlzaWJsZU5vZGVzOm5vZGVzLnNsaWNlKHN0YXJ0LGVuZCksb2Zmc2V0OnN0YXJ0fTt9Cl9jb250ZW50SGVpZ2h0KCl7Y29uc3Qgbm9kZXM9dGhpcy5yb290Tm9kZSgpLmZsYXRDaGlsZHJlbigpO2xldCByZXN1bHQ9MDtmb3IobGV0IGk9MCxzaXplPW5vZGVzLmxlbmd0aDtpPHNpemU7KytpKQpyZXN1bHQrPW5vZGVzW2ldLm5vZGVTZWxmSGVpZ2h0KCk7cmV0dXJuIHJlc3VsdDt9Cl91cGRhdGUoKXtpZih0aGlzLl91cGRhdGVBbmltYXRpb25GcmFtZUlkKXt0aGlzLmVsZW1lbnQud2luZG93KCkuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdXBkYXRlQW5pbWF0aW9uRnJhbWVJZCk7ZGVsZXRlIHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkZyYW1lSWQ7fQpjb25zdCBjbGllbnRIZWlnaHQ9dGhpcy5fc2Nyb2xsQ29udGFpbmVyLmNsaWVudEhlaWdodDtsZXQgc2Nyb2xsVG9wPXRoaXMuX3Njcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7Y29uc3QgY3VycmVudFNjcm9sbFRvcD1zY3JvbGxUb3A7Y29uc3QgbWF4U2Nyb2xsVG9wPU1hdGgubWF4KDAsdGhpcy5fY29udGVudEhlaWdodCgpLWNsaWVudEhlaWdodCk7aWYoIXRoaXMuX3VwZGF0ZUlzRnJvbVVzZXImJnRoaXMuX3N0aWNrVG9Cb3R0b20pCnNjcm9sbFRvcD1tYXhTY3JvbGxUb3A7dGhpcy5fdXBkYXRlSXNGcm9tVXNlcj1mYWxzZTtzY3JvbGxUb3A9TWF0aC5taW4obWF4U2Nyb2xsVG9wLHNjcm9sbFRvcCk7Y29uc3Qgdmlld3BvcnRTdGF0ZT10aGlzLl9jYWxjdWxhdGVWaXNpYmxlTm9kZXMoY2xpZW50SGVpZ2h0LHNjcm9sbFRvcCk7Y29uc3QgdmlzaWJsZU5vZGVzPXZpZXdwb3J0U3RhdGUudmlzaWJsZU5vZGVzO2NvbnN0IHZpc2libGVOb2Rlc1NldD1uZXcgU2V0KHZpc2libGVOb2Rlcyk7Zm9yKGxldCBpPTA7aTx0aGlzLl92aXNpYmxlTm9kZXMubGVuZ3RoOysraSl7Y29uc3Qgb2xkTm9kZT10aGlzLl92aXNpYmxlTm9kZXNbaV07aWYoIXZpc2libGVOb2Rlc1NldC5oYXMob2xkTm9kZSkmJm9sZE5vZGUuYXR0YWNoZWQoKSl7Y29uc3QgZWxlbWVudD1vbGROb2RlLmV4aXN0aW5nRWxlbWVudCgpO2VsZW1lbnQucmVtb3ZlKCk7fX0KbGV0IHByZXZpb3VzRWxlbWVudD10aGlzLnRvcEZpbGxlclJvd0VsZW1lbnQoKTtjb25zdCB0Qm9keT10aGlzLmRhdGFUYWJsZUJvZHk7bGV0IG9mZnNldD12aWV3cG9ydFN0YXRlLm9mZnNldDtpZih2aXNpYmxlTm9kZXMubGVuZ3RoKXtjb25zdCBub2Rlcz10aGlzLnJvb3ROb2RlKCkuZmxhdENoaWxkcmVuKCk7Y29uc3QgaW5kZXg9bm9kZXMuaW5kZXhPZih2aXNpYmxlTm9kZXNbMF0pO3RoaXMuX3VwZGF0ZVN0cmlwZXNDbGFzcyghIShpbmRleCUyKSk7aWYodGhpcy5fc3RpY2tUb0JvdHRvbSYmaW5kZXghPT0tMSYmISEoaW5kZXglMikhPT10aGlzLl9maXJzdFZpc2libGVJc1N0cmlwZWQpCm9mZnNldCs9MTt9CnRoaXMuX2ZpcnN0VmlzaWJsZUlzU3RyaXBlZD0hIShvZmZzZXQlMik7Zm9yKGxldCBpPTA7aTx2aXNpYmxlTm9kZXMubGVuZ3RoOysraSl7Y29uc3Qgbm9kZT12aXNpYmxlTm9kZXNbaV07Y29uc3QgZWxlbWVudD1ub2RlLmVsZW1lbnQoKTtub2RlLnNldFN0cmlwZWQoKG9mZnNldCtpKSUyPT09MCk7aWYoZWxlbWVudCE9PXByZXZpb3VzRWxlbWVudC5uZXh0U2libGluZykKdEJvZHkuaW5zZXJ0QmVmb3JlKGVsZW1lbnQscHJldmlvdXNFbGVtZW50Lm5leHRTaWJsaW5nKTtub2RlLnJldmVhbGVkPXRydWU7cHJldmlvdXNFbGVtZW50PWVsZW1lbnQ7fQp0aGlzLnNldFZlcnRpY2FsUGFkZGluZyh2aWV3cG9ydFN0YXRlLnRvcFBhZGRpbmcsdmlld3BvcnRTdGF0ZS5ib3R0b21QYWRkaW5nKTt0aGlzLl9sYXN0U2Nyb2xsVG9wPXNjcm9sbFRvcDtpZihzY3JvbGxUb3AhPT1jdXJyZW50U2Nyb2xsVG9wKQp0aGlzLl9zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wPXNjcm9sbFRvcDtjb25zdCBjb250ZW50Rml0cz12aWV3cG9ydFN0YXRlLmNvbnRlbnRIZWlnaHQ8PWNsaWVudEhlaWdodCYmdmlld3BvcnRTdGF0ZS50b3BQYWRkaW5nK3ZpZXdwb3J0U3RhdGUuYm90dG9tUGFkZGluZz09PTA7aWYoY29udGVudEZpdHMhPT10aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXRhLWdyaWQtZml0cy12aWV3cG9ydCcpKXt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGF0YS1ncmlkLWZpdHMtdmlld3BvcnQnLGNvbnRlbnRGaXRzKTt0aGlzLnVwZGF0ZVdpZHRocygpO30KdGhpcy5fdmlzaWJsZU5vZGVzPXZpc2libGVOb2Rlczt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhEYXRhR3JpZC5WaWV3cG9ydERhdGFHcmlkLkV2ZW50cy5WaWV3cG9ydENhbGN1bGF0ZWQpO30KX3JldmVhbFZpZXdwb3J0Tm9kZShub2RlKXtjb25zdCBub2Rlcz10aGlzLnJvb3ROb2RlKCkuZmxhdENoaWxkcmVuKCk7Y29uc3QgaW5kZXg9bm9kZXMuaW5kZXhPZihub2RlKTtpZihpbmRleD09PS0xKQpyZXR1cm47bGV0IGZyb21ZPTA7Zm9yKGxldCBpPTA7aTxpbmRleDsrK2kpCmZyb21ZKz1ub2Rlc1tpXS5ub2RlU2VsZkhlaWdodCgpO2NvbnN0IHRvWT1mcm9tWStub2RlLm5vZGVTZWxmSGVpZ2h0KCk7bGV0IHNjcm9sbFRvcD10aGlzLl9zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wO2lmKHNjcm9sbFRvcD5mcm9tWSl7c2Nyb2xsVG9wPWZyb21ZO3RoaXMuX3N0aWNrVG9Cb3R0b209ZmFsc2U7fWVsc2UgaWYoc2Nyb2xsVG9wK3RoaXMuX3Njcm9sbENvbnRhaW5lci5vZmZzZXRIZWlnaHQ8dG9ZKXtzY3JvbGxUb3A9dG9ZLXRoaXMuX3Njcm9sbENvbnRhaW5lci5vZmZzZXRIZWlnaHQ7fQp0aGlzLl9zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wPXNjcm9sbFRvcDt9fTtEYXRhR3JpZC5WaWV3cG9ydERhdGFHcmlkLkV2ZW50cz17Vmlld3BvcnRDYWxjdWxhdGVkOlN5bWJvbCgnVmlld3BvcnRDYWxjdWxhdGVkJyl9O0RhdGFHcmlkLlZpZXdwb3J0RGF0YUdyaWROb2RlPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuRGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKGRhdGEsaGFzQ2hpbGRyZW4pe3N1cGVyKGRhdGEsaGFzQ2hpbGRyZW4pO3RoaXMuX3N0YWxlPWZhbHNlO3RoaXMuX2ZsYXROb2Rlcz1udWxsO3RoaXMuX2lzU3RyaXBlZD1mYWxzZTt9CmVsZW1lbnQoKXtjb25zdCBleGlzdGluZ0VsZW1lbnQ9dGhpcy5leGlzdGluZ0VsZW1lbnQoKTtjb25zdCBlbGVtZW50PWV4aXN0aW5nRWxlbWVudHx8dGhpcy5jcmVhdGVFbGVtZW50KCk7aWYoIWV4aXN0aW5nRWxlbWVudHx8dGhpcy5fc3RhbGUpe3RoaXMuY3JlYXRlQ2VsbHMoZWxlbWVudCk7dGhpcy5fc3RhbGU9ZmFsc2U7fQpyZXR1cm4gZWxlbWVudDt9CnNldFN0cmlwZWQoaXNTdHJpcGVkKXt0aGlzLl9pc1N0cmlwZWQ9aXNTdHJpcGVkO3RoaXMuZWxlbWVudCgpLmNsYXNzTGlzdC50b2dnbGUoJ29kZCcsaXNTdHJpcGVkKTt9CmlzU3RyaXBlZCgpe3JldHVybiB0aGlzLl9pc1N0cmlwZWQ7fQpjbGVhckZsYXROb2Rlcygpe3RoaXMuX2ZsYXROb2Rlcz1udWxsO2NvbnN0IHBhcmVudD0odGhpcy5wYXJlbnQpO2lmKHBhcmVudCkKcGFyZW50LmNsZWFyRmxhdE5vZGVzKCk7fQpmbGF0Q2hpbGRyZW4oKXtpZih0aGlzLl9mbGF0Tm9kZXMpCnJldHVybiB0aGlzLl9mbGF0Tm9kZXM7Y29uc3QgZmxhdE5vZGVzPVtdO2NvbnN0IGNoaWxkcmVuPVt0aGlzLmNoaWxkcmVuXTtjb25zdCBjb3VudGVycz1bMF07bGV0IGRlcHRoPTA7d2hpbGUoZGVwdGg+PTApe2lmKGNoaWxkcmVuW2RlcHRoXS5sZW5ndGg8PWNvdW50ZXJzW2RlcHRoXSl7ZGVwdGgtLTtjb250aW51ZTt9CmNvbnN0IG5vZGU9Y2hpbGRyZW5bZGVwdGhdW2NvdW50ZXJzW2RlcHRoXSsrXTtmbGF0Tm9kZXMucHVzaChub2RlKTtpZihub2RlLl9leHBhbmRlZCYmbm9kZS5jaGlsZHJlbi5sZW5ndGgpe2RlcHRoKys7Y2hpbGRyZW5bZGVwdGhdPW5vZGUuY2hpbGRyZW47Y291bnRlcnNbZGVwdGhdPTA7fX0KdGhpcy5fZmxhdE5vZGVzPWZsYXROb2RlcztyZXR1cm4gZmxhdE5vZGVzO30KaW5zZXJ0Q2hpbGQoY2hpbGQsaW5kZXgpe3RoaXMuY2xlYXJGbGF0Tm9kZXMoKTtpZihjaGlsZC5wYXJlbnQ9PT10aGlzKXtjb25zdCBjdXJyZW50SW5kZXg9dGhpcy5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTtpZihjdXJyZW50SW5kZXg8MCkKY29uc29sZS5hc3NlcnQoZmFsc2UsJ0luY29uc2lzdGVudCBEYXRhR3JpZCBzdGF0ZScpO2lmKGN1cnJlbnRJbmRleD09PWluZGV4KQpyZXR1cm47aWYoY3VycmVudEluZGV4PGluZGV4KQotLWluZGV4O30KY2hpbGQucmVtb3ZlKCk7Y2hpbGQucGFyZW50PXRoaXM7Y2hpbGQuZGF0YUdyaWQ9dGhpcy5kYXRhR3JpZDtpZighdGhpcy5jaGlsZHJlbi5sZW5ndGgpCnRoaXMuc2V0SGFzQ2hpbGRyZW4odHJ1ZSk7dGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsMCxjaGlsZCk7Y2hpbGQucmVjYWxjdWxhdGVTaWJsaW5ncyhpbmRleCk7aWYodGhpcy5fZXhwYW5kZWQpCnRoaXMuZGF0YUdyaWQuc2NoZWR1bGVVcGRhdGVTdHJ1Y3R1cmUoKTt9CnJlbW92ZUNoaWxkKGNoaWxkKXt0aGlzLmNsZWFyRmxhdE5vZGVzKCk7aWYodGhpcy5kYXRhR3JpZCkKdGhpcy5kYXRhR3JpZC51cGRhdGVTZWxlY3Rpb25CZWZvcmVSZW1vdmFsKGNoaWxkLGZhbHNlKTtpZihjaGlsZC5wcmV2aW91c1NpYmxpbmcpCmNoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZz1jaGlsZC5uZXh0U2libGluZztpZihjaGlsZC5uZXh0U2libGluZykKY2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nPWNoaWxkLnByZXZpb3VzU2libGluZztpZihjaGlsZC5wYXJlbnQhPT10aGlzKQp0aHJvdydyZW1vdmVDaGlsZDogTm9kZSBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuJzt0aGlzLmNoaWxkcmVuLnJlbW92ZShjaGlsZCx0cnVlKTtjaGlsZC5fdW5saW5rKCk7aWYoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKQp0aGlzLnNldEhhc0NoaWxkcmVuKGZhbHNlKTtpZih0aGlzLl9leHBhbmRlZCkKdGhpcy5kYXRhR3JpZC5zY2hlZHVsZVVwZGF0ZVN0cnVjdHVyZSgpO30KcmVtb3ZlQ2hpbGRyZW4oKXt0aGlzLmNsZWFyRmxhdE5vZGVzKCk7aWYodGhpcy5kYXRhR3JpZCkKdGhpcy5kYXRhR3JpZC51cGRhdGVTZWxlY3Rpb25CZWZvcmVSZW1vdmFsKHRoaXMsdHJ1ZSk7Zm9yKGxldCBpPTA7aTx0aGlzLmNoaWxkcmVuLmxlbmd0aDsrK2kpCnRoaXMuY2hpbGRyZW5baV0uX3VubGluaygpO3RoaXMuY2hpbGRyZW49W107aWYodGhpcy5fZXhwYW5kZWQpCnRoaXMuZGF0YUdyaWQuc2NoZWR1bGVVcGRhdGVTdHJ1Y3R1cmUoKTt9Cl91bmxpbmsoKXtpZih0aGlzLmF0dGFjaGVkKCkpCnRoaXMuZXhpc3RpbmdFbGVtZW50KCkucmVtb3ZlKCk7dGhpcy5yZXNldE5vZGUoKTt9CmNvbGxhcHNlKCl7aWYoIXRoaXMuX2V4cGFuZGVkKQpyZXR1cm47dGhpcy5jbGVhckZsYXROb2RlcygpO3RoaXMuX2V4cGFuZGVkPWZhbHNlO2lmKHRoaXMuZXhpc3RpbmdFbGVtZW50KCkpCnRoaXMuZXhpc3RpbmdFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTt0aGlzLmRhdGFHcmlkLnNjaGVkdWxlVXBkYXRlU3RydWN0dXJlKCk7fQpleHBhbmQoKXtpZih0aGlzLl9leHBhbmRlZCkKcmV0dXJuO3RoaXMuZGF0YUdyaWQuX3N0aWNrVG9Cb3R0b209ZmFsc2U7dGhpcy5jbGVhckZsYXROb2RlcygpO3N1cGVyLmV4cGFuZCgpO3RoaXMuZGF0YUdyaWQuc2NoZWR1bGVVcGRhdGVTdHJ1Y3R1cmUoKTt9CmF0dGFjaGVkKCl7cmV0dXJuISEodGhpcy5kYXRhR3JpZCYmdGhpcy5leGlzdGluZ0VsZW1lbnQoKSYmdGhpcy5leGlzdGluZ0VsZW1lbnQoKS5wYXJlbnRFbGVtZW50KTt9CnJlZnJlc2goKXtpZih0aGlzLmF0dGFjaGVkKCkpe3RoaXMuX3N0YWxlPXRydWU7dGhpcy5kYXRhR3JpZC5zY2hlZHVsZVVwZGF0ZSgpO31lbHNle3RoaXMucmVzZXRFbGVtZW50KCk7fX0KcmV2ZWFsKCl7dGhpcy5kYXRhR3JpZC5fcmV2ZWFsVmlld3BvcnROb2RlKHRoaXMpO30KcmVjYWxjdWxhdGVTaWJsaW5ncyhpbmRleCl7dGhpcy5jbGVhckZsYXROb2RlcygpO3N1cGVyLnJlY2FsY3VsYXRlU2libGluZ3MoaW5kZXgpO319OztEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuVmlld3BvcnREYXRhR3JpZHtjb25zdHJ1Y3Rvcihjb2x1bW5zQXJyYXksZWRpdENhbGxiYWNrLGRlbGV0ZUNhbGxiYWNrLHJlZnJlc2hDYWxsYmFjayl7c3VwZXIoY29sdW1uc0FycmF5LGVkaXRDYWxsYmFjayxkZWxldGVDYWxsYmFjayxyZWZyZXNoQ2FsbGJhY2spO3RoaXMuX3NvcnRpbmdGdW5jdGlvbj1EYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkLlRyaXZpYWxDb21wYXJhdG9yO3RoaXMuc2V0Um9vdE5vZGUoKG5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZSgpKSk7fQpzdGF0aWMgVHJpdmlhbENvbXBhcmF0b3IoYSxiKXtyZXR1cm4gMDt9CnN0YXRpYyBOdW1lcmljQ29tcGFyYXRvcihjb2x1bW5JZCxhLGIpe2NvbnN0IGFWYWx1ZT1hLmRhdGFbY29sdW1uSWRdO2NvbnN0IGJWYWx1ZT1iLmRhdGFbY29sdW1uSWRdO2NvbnN0IGFOdW1iZXI9TnVtYmVyKGFWYWx1ZSBpbnN0YW5jZW9mIE5vZGU/YVZhbHVlLnRleHRDb250ZW50OmFWYWx1ZSk7Y29uc3QgYk51bWJlcj1OdW1iZXIoYlZhbHVlIGluc3RhbmNlb2YgTm9kZT9iVmFsdWUudGV4dENvbnRlbnQ6YlZhbHVlKTtyZXR1cm4gYU51bWJlcjxiTnVtYmVyPy0xOihhTnVtYmVyPmJOdW1iZXI/MTowKTt9CnN0YXRpYyBTdHJpbmdDb21wYXJhdG9yKGNvbHVtbklkLGEsYil7Y29uc3QgYVZhbHVlPWEuZGF0YVtjb2x1bW5JZF07Y29uc3QgYlZhbHVlPWIuZGF0YVtjb2x1bW5JZF07Y29uc3QgYVN0cmluZz1hVmFsdWUgaW5zdGFuY2VvZiBOb2RlP2FWYWx1ZS50ZXh0Q29udGVudDpTdHJpbmcoYVZhbHVlKTtjb25zdCBiU3RyaW5nPWJWYWx1ZSBpbnN0YW5jZW9mIE5vZGU/YlZhbHVlLnRleHRDb250ZW50OlN0cmluZyhiVmFsdWUpO3JldHVybiBhU3RyaW5nPGJTdHJpbmc/LTE6KGFTdHJpbmc+YlN0cmluZz8xOjApO30Kc3RhdGljIENvbXBhcmF0b3IoY29tcGFyYXRvcixyZXZlcnNlTW9kZSxhLGIpe3JldHVybiByZXZlcnNlTW9kZT9jb21wYXJhdG9yKGIsYSk6Y29tcGFyYXRvcihhLGIpO30Kc3RhdGljIGNyZWF0ZShjb2x1bW5OYW1lcyx2YWx1ZXMpe2NvbnN0IG51bUNvbHVtbnM9Y29sdW1uTmFtZXMubGVuZ3RoO2lmKCFudW1Db2x1bW5zKQpyZXR1cm4gbnVsbDtjb25zdCBjb2x1bW5zPShbXSk7Zm9yKGxldCBpPTA7aTxjb2x1bW5OYW1lcy5sZW5ndGg7KytpKQpjb2x1bW5zLnB1c2goe2lkOlN0cmluZyhpKSx0aXRsZTpjb2x1bW5OYW1lc1tpXSx3aWR0aDpjb2x1bW5OYW1lc1tpXS5sZW5ndGgsc29ydGFibGU6dHJ1ZX0pO2NvbnN0IG5vZGVzPVtdO2ZvcihsZXQgaT0wO2k8dmFsdWVzLmxlbmd0aC9udW1Db2x1bW5zOysraSl7Y29uc3QgZGF0YT17fTtmb3IobGV0IGo9MDtqPGNvbHVtbk5hbWVzLmxlbmd0aDsrK2opCmRhdGFbal09dmFsdWVzW251bUNvbHVtbnMqaStqXTtjb25zdCBub2RlPW5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZShkYXRhKTtub2RlLnNlbGVjdGFibGU9ZmFsc2U7bm9kZXMucHVzaChub2RlKTt9CmNvbnN0IGRhdGFHcmlkPW5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkKGNvbHVtbnMpO2NvbnN0IGxlbmd0aD1ub2Rlcy5sZW5ndGg7Y29uc3Qgcm9vdE5vZGU9ZGF0YUdyaWQucm9vdE5vZGUoKTtmb3IobGV0IGk9MDtpPGxlbmd0aDsrK2kpCnJvb3ROb2RlLmFwcGVuZENoaWxkKG5vZGVzW2ldKTtkYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5Tb3J0aW5nQ2hhbmdlZCxzb3J0RGF0YUdyaWQpO2Z1bmN0aW9uIHNvcnREYXRhR3JpZCgpe2NvbnN0IG5vZGVzPWRhdGFHcmlkLnJvb3ROb2RlKCkuY2hpbGRyZW47Y29uc3Qgc29ydENvbHVtbklkPWRhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2lmKCFzb3J0Q29sdW1uSWQpCnJldHVybjtsZXQgY29sdW1uSXNOdW1lcmljPXRydWU7Zm9yKGxldCBpPTA7aTxub2Rlcy5sZW5ndGg7aSsrKXtjb25zdCB2YWx1ZT1ub2Rlc1tpXS5kYXRhW3NvcnRDb2x1bW5JZF07aWYoaXNOYU4odmFsdWUgaW5zdGFuY2VvZiBOb2RlP3ZhbHVlLnRleHRDb250ZW50OnZhbHVlKSl7Y29sdW1uSXNOdW1lcmljPWZhbHNlO2JyZWFrO319CmNvbnN0IGNvbXBhcmF0b3I9Y29sdW1uSXNOdW1lcmljP0RhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQuTnVtZXJpY0NvbXBhcmF0b3I6RGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZC5TdHJpbmdDb21wYXJhdG9yO2RhdGFHcmlkLnNvcnROb2Rlcyhjb21wYXJhdG9yLmJpbmQobnVsbCxzb3J0Q29sdW1uSWQpLCFkYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpKTt9CnJldHVybiBkYXRhR3JpZDt9Cmluc2VydENoaWxkKG5vZGUpe2NvbnN0IHJvb3Q9KHRoaXMucm9vdE5vZGUoKSk7cm9vdC5pbnNlcnRDaGlsZE9yZGVyZWQobm9kZSk7fQpzb3J0Tm9kZXMoY29tcGFyYXRvcixyZXZlcnNlTW9kZSl7dGhpcy5fc29ydGluZ0Z1bmN0aW9uPURhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQuQ29tcGFyYXRvci5iaW5kKG51bGwsY29tcGFyYXRvcixyZXZlcnNlTW9kZSk7dGhpcy5yb290Tm9kZSgpLnJlY2FsY3VsYXRlU2libGluZ3MoMCk7dGhpcy5yb290Tm9kZSgpLl9zb3J0Q2hpbGRyZW4ocmV2ZXJzZU1vZGUpO3RoaXMuc2NoZWR1bGVVcGRhdGVTdHJ1Y3R1cmUoKTt9fTtEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZT1jbGFzcyBleHRlbmRzIERhdGFHcmlkLlZpZXdwb3J0RGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKGRhdGEsaGFzQ2hpbGRyZW4pe3N1cGVyKGRhdGEsaGFzQ2hpbGRyZW4pO30KaW5zZXJ0Q2hpbGRPcmRlcmVkKG5vZGUpe3RoaXMuaW5zZXJ0Q2hpbGQobm9kZSx0aGlzLmNoaWxkcmVuLnVwcGVyQm91bmQobm9kZSx0aGlzLmRhdGFHcmlkLl9zb3J0aW5nRnVuY3Rpb24pKTt9Cl9zb3J0Q2hpbGRyZW4oKXt0aGlzLmNoaWxkcmVuLnNvcnQodGhpcy5kYXRhR3JpZC5fc29ydGluZ0Z1bmN0aW9uKTtmb3IobGV0IGk9MDtpPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5jaGlsZHJlbltpXS5yZWNhbGN1bGF0ZVNpYmxpbmdzKGkpO2Zvcihjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKQpjaGlsZC5fc29ydENoaWxkcmVuKCk7fX07O0RhdGFHcmlkLlNob3dNb3JlRGF0YUdyaWROb2RlPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuRGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKGNhbGxiYWNrLHN0YXJ0UG9zaXRpb24sZW5kUG9zaXRpb24sY2h1bmtTaXplKXtzdXBlcih7c3VtbWFyeVJvdzp0cnVlfSxmYWxzZSk7dGhpcy5fY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5fc3RhcnRQb3NpdGlvbj1zdGFydFBvc2l0aW9uO3RoaXMuX2VuZFBvc2l0aW9uPWVuZFBvc2l0aW9uO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5zaG93TmV4dD1jcmVhdGVFbGVtZW50KCdidXR0b24nKTt0aGlzLnNob3dOZXh0LnNldEF0dHJpYnV0ZSgndHlwZScsJ2J1dHRvbicpO3RoaXMuc2hvd05leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3Nob3dOZXh0Q2h1bmsuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5zaG93TmV4dC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Nob3cgJWQgYmVmb3JlJyx0aGlzLl9jaHVua1NpemUpO3RoaXMuc2hvd0FsbD1jcmVhdGVFbGVtZW50KCdidXR0b24nKTt0aGlzLnNob3dBbGwuc2V0QXR0cmlidXRlKCd0eXBlJywnYnV0dG9uJyk7dGhpcy5zaG93QWxsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9zaG93QWxsLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuc2hvd0xhc3Q9Y3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7dGhpcy5zaG93TGFzdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCdidXR0b24nKTt0aGlzLnNob3dMYXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9zaG93TGFzdENodW5rLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuc2hvd0xhc3QudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93ICVkIGFmdGVyJyx0aGlzLl9jaHVua1NpemUpO3RoaXMuX3VwZGF0ZUxhYmVscygpO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt9Cl9zaG93TmV4dENodW5rKCl7dGhpcy5fY2FsbGJhY2sodGhpcy5fc3RhcnRQb3NpdGlvbix0aGlzLl9zdGFydFBvc2l0aW9uK3RoaXMuX2NodW5rU2l6ZSk7fQpfc2hvd0FsbCgpe3RoaXMuX2NhbGxiYWNrKHRoaXMuX3N0YXJ0UG9zaXRpb24sdGhpcy5fZW5kUG9zaXRpb24pO30KX3Nob3dMYXN0Q2h1bmsoKXt0aGlzLl9jYWxsYmFjayh0aGlzLl9lbmRQb3NpdGlvbi10aGlzLl9jaHVua1NpemUsdGhpcy5fZW5kUG9zaXRpb24pO30KX3VwZGF0ZUxhYmVscygpe2NvbnN0IHRvdGFsU2l6ZT10aGlzLl9lbmRQb3NpdGlvbi10aGlzLl9zdGFydFBvc2l0aW9uO2lmKHRvdGFsU2l6ZT50aGlzLl9jaHVua1NpemUpe3RoaXMuc2hvd05leHQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5zaG93TGFzdC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt9ZWxzZXt0aGlzLnNob3dOZXh0LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuc2hvd0xhc3QuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fQp0aGlzLnNob3dBbGwudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IGFsbCAlZCcsdG90YWxTaXplKTt9CmNyZWF0ZUNlbGxzKGVsZW1lbnQpe3RoaXMuX2hhc0NlbGxzPWZhbHNlO3N1cGVyLmNyZWF0ZUNlbGxzKGVsZW1lbnQpO30KY3JlYXRlQ2VsbChjb2x1bW5JZGVudGlmaWVyKXtjb25zdCBjZWxsPXRoaXMuY3JlYXRlVEQoY29sdW1uSWRlbnRpZmllcik7aWYoIXRoaXMuX2hhc0NlbGxzKXt0aGlzLl9oYXNDZWxscz10cnVlO2lmKHRoaXMuZGVwdGgpCmNlbGwuc3R5bGUuc2V0UHJvcGVydHkoJ3BhZGRpbmctbGVmdCcsKHRoaXMuZGVwdGgqdGhpcy5kYXRhR3JpZC5pbmRlbnRXaWR0aCkrJ3B4Jyk7Y2VsbC5hcHBlbmRDaGlsZCh0aGlzLnNob3dOZXh0KTtjZWxsLmFwcGVuZENoaWxkKHRoaXMuc2hvd0FsbCk7Y2VsbC5hcHBlbmRDaGlsZCh0aGlzLnNob3dMYXN0KTt9CnJldHVybiBjZWxsO30Kc2V0U3RhcnRQb3NpdGlvbihmcm9tKXt0aGlzLl9zdGFydFBvc2l0aW9uPWZyb207dGhpcy5fdXBkYXRlTGFiZWxzKCk7fQpzZXRFbmRQb3NpdGlvbih0byl7dGhpcy5fZW5kUG9zaXRpb249dG87dGhpcy5fdXBkYXRlTGFiZWxzKCk7fQpub2RlU2VsZkhlaWdodCgpe3JldHVybiA0MDt9CmRpc3Bvc2UoKXt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImRhdGFfZ3JpZC9kYXRhR3JpZC5jc3MiXT0iLmRhdGEtZ3JpZCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7XG4gICAgbGluZS1oZWlnaHQ6IDEyMCU7XG59XG5cbi5kYXRhLWdyaWQgdGFibGUge1xuICAgIHRhYmxlLWxheW91dDogZml4ZWQ7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi5kYXRhLWdyaWQgLmhlYWRlci1jb250YWluZXIsXG4uZGF0YS1ncmlkIC5kYXRhLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG4uZGF0YS1ncmlkIC5oZWFkZXItY29udGFpbmVyIHtcbiAgICB0b3A6IDA7XG4gICAgaGVpZ2h0OiAyMXB4O1xufVxuXG4uZGF0YS1ncmlkIC5kYXRhLWNvbnRhaW5lciB7XG4gICAgdG9wOiAyMXB4O1xuICAgIGJvdHRvbTogMDtcbiAgICBvdmVyZmxvdy15OiBvdmVybGF5O1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTtcbn1cblxuLmRhdGEtZ3JpZC5pbmxpbmUgLmhlYWRlci1jb250YWluZXIsXG4uZGF0YS1ncmlkLmlubGluZSAuZGF0YS1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG59XG5cbi5kYXRhLWdyaWQuaW5saW5lIC5jb3JuZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5wbGF0Zm9ybS1tYWMgLmRhdGEtZ3JpZCAuY29ybmVyLFxuLmRhdGEtZ3JpZC5kYXRhLWdyaWQtZml0cy12aWV3cG9ydCAuY29ybmVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGF0YS1ncmlkIC5jb3JuZXIge1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIGJvcmRlci1sZWZ0OiAwIG5vbmUgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbn1cblxuLmRhdGEtZ3JpZCAudG9wLWZpbGxlci10ZCxcbi5kYXRhLWdyaWQgLmJvdHRvbS1maWxsZXItdGQge1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbn1cblxuLmRhdGEtZ3JpZCB0YWJsZS5kYXRhIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci10b3A6IDAgbm9uZSB0cmFuc3BhcmVudDtcbiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xufVxuXG4uZGF0YS1ncmlkLmlubGluZSB0YWJsZS5kYXRhIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xufVxuXG4uZGF0YS1ncmlkIHRhYmxlLmRhdGEgdHIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgaGVpZ2h0OiAyMHB4O1xufVxuXG4uZGF0YS1ncmlkIHRhYmxlLmRhdGEgdHIucmV2ZWFsZWQge1xuICAgIGRpc3BsYXk6IHRhYmxlLXJvdztcbn1cblxuLnN0cmlwZWQtZGF0YS1ncmlkIC5yZXZlYWxlZC5kYXRhLWdyaWQtZGF0YS1ncmlkLW5vZGU6bnRoLWNoaWxkKG9kZCksXG4uc3RyaXBlZC1kYXRhLWdyaWQtc3RhcnRzLXdpdGgtb2RkIC5yZXZlYWxlZC5kYXRhLWdyaWQtZGF0YS1ncmlkLW5vZGU6bnRoLWNoaWxkKGV2ZW4pIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjE0LCA3MCUsIDk3JSk7XG59XG5cbi5kYXRhLWdyaWQgdGQsXG4uZGF0YS1ncmlkIHRoIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgaGVpZ2h0OiAxOHB4O1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FhYTtcbiAgICBwYWRkaW5nOiAxcHggNHB4O1xufVxuXG4uZGF0YS1ncmlkIHRoOmZpcnN0LWNoaWxkLFxuLmRhdGEtZ3JpZCB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLmRhdGEtZ3JpZCB0ZCB7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4uZGF0YS1ncmlkIHRoIHtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRhdGEtZ3JpZCB0ZCA+IGRpdixcbi5kYXRhLWdyaWQgdGggPiBkaXYge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRhdGEtZ3JpZCB0ZC5lZGl0aW5nID4gZGl2IHtcbiAgICB0ZXh0LW92ZXJmbG93OiBjbGlwO1xufVxuXG4uZGF0YS1ncmlkIC5jZW50ZXIge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmRhdGEtZ3JpZCAucmlnaHQge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4uZGF0YS1ncmlkIHRoLnNvcnRhYmxlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kYXRhLWdyaWQgdGguc29ydGFibGU6YWN0aXZlOjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG5cbi5kYXRhLWdyaWQgdGggLnNvcnQtb3JkZXItaWNvbi1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDFweDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDFweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5kYXRhLWdyaWQgdGggLnNvcnQtb3JkZXItaWNvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogLTJweDtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGF0YS1ncmlkIHRoLnNvcnQtYXNjZW5kaW5nIC5zb3J0LW9yZGVyLWljb24sXG4uZGF0YS1ncmlkIHRoLnNvcnQtZGVzY2VuZGluZyAuc29ydC1vcmRlci1pY29uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmRhdGEtZ3JpZCB0aC5zb3J0YWJsZTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLCAwJSwgOTAlLCAxKTtcbn1cblxuLmRhdGEtZ3JpZCBidXR0b24ge1xuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uZGF0YS1ncmlkIHRkLmRpc2Nsb3N1cmU6OmJlZm9yZSB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChJbWFnZXMvdHJlZW91dGxpbmVUcmlhbmdsZXMucG5nKTtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IDAgMDtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMzJweCAyNHB4O1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiA4cHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTtcbn1cblxuLmRhdGEtZ3JpZCB0cjpub3QoLnBhcmVudCkgdGQuZGlzY2xvc3VyZTo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuQG1lZGlhICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuMSkge1xuLmRhdGEtZ3JpZCB0ci5wYXJlbnQgdGQuZGlzY2xvc3VyZTo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChJbWFnZXMvdHJlZW91dGxpbmVUcmlhbmdsZXNfMngucG5nKTtcbn1cbn0gLyogbWVkaWEgKi9cblxuLmRhdGEtZ3JpZCB0ci5leHBhbmRlZCB0ZC5kaXNjbG9zdXJlOjpiZWZvcmUge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogLTE2cHggMDtcbn1cblxuLmRhdGEtZ3JpZCB0YWJsZS5kYXRhIHRyLnJldmVhbGVkLnNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEyLCAyMTIsIDIxMik7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5kYXRhLWdyaWQ6Zm9jdXMgdGFibGUuZGF0YSB0ci5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbn1cblxuLmRhdGEtZ3JpZDpmb2N1cyB0ci5zZWxlY3RlZCAuZGV2dG9vbHMtbGluayB7XG4gICAgY29sb3I6IHZhcigtLXNlbGVjdGlvbi1mZy1jb2xvcik7XG59XG5cbi5kYXRhLWdyaWQ6Zm9jdXMgdHIucGFyZW50LnNlbGVjdGVkIHRkLmRpc2Nsb3N1cmU6OmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IDAgMDtcbn1cblxuLmRhdGEtZ3JpZDpmb2N1cyB0ci5leHBhbmRlZC5zZWxlY3RlZCB0ZC5kaXNjbG9zdXJlOjpiZWZvcmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1mZy1jb2xvcik7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAtMTZweCAwO1xufVxuXG4uZGF0YS1ncmlkIHRyLmluYWN0aXZlIHtcbiAgICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLmRhdGEtZ3JpZCB0ci5kaXJ0eSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDEwMCUsIDkyJSk7XG4gICAgY29sb3I6IHJlZDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG59XG5cbi5kYXRhLWdyaWQ6Zm9jdXMgdHIuc2VsZWN0ZWQuZGlydHkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgwLCAxMDAlLCA3MCUpO1xufVxuXG4uZGF0YS1ncmlkLXJlc2l6ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiA1cHg7XG4gICAgei1pbmRleDogNTAwO1xufVxuXG4vKiMgc291cmNlVVJMPWRhdGFfZ3JpZC9kYXRhR3JpZC5jc3MgKi8iO0RldmljZXMuRGV2aWNlc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdkZXZpY2VzL2RldmljZXNWaWV3LmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGV2aWNlcy12aWV3Jyk7Y29uc3QgaGJveD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoYm94IGRldmljZXMtY29udGFpbmVyJyk7Y29uc3Qgc2lkZWJhcj1oYm94LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2VzLXNpZGViYXInKTtzaWRlYmFyLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2VzLXZpZXctdGl0bGUnKS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdEZXZpY2VzJykpO3RoaXMuX3NpZGViYXJMaXN0PXNpZGViYXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZXMtc2lkZWJhci1saXN0Jyk7dGhpcy5fZGlzY292ZXJ5Vmlldz1uZXcgRGV2aWNlcy5EZXZpY2VzVmlldy5EaXNjb3ZlcnlWaWV3KCk7dGhpcy5fc2lkZWJhckxpc3RTcGFjZXI9dGhpcy5fc2lkZWJhckxpc3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZXMtc2lkZWJhci1zcGFjZXInKTt0aGlzLl9kaXNjb3ZlcnlMaXN0SXRlbT10aGlzLl9zaWRlYmFyTGlzdC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlcy1zaWRlYmFyLWl0ZW0nKTt0aGlzLl9kaXNjb3ZlcnlMaXN0SXRlbS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1NldHRpbmdzJyk7dGhpcy5fZGlzY292ZXJ5TGlzdEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3NlbGVjdFNpZGViYXJMaXN0SXRlbS5iaW5kKHRoaXMsdGhpcy5fZGlzY292ZXJ5TGlzdEl0ZW0sdGhpcy5fZGlzY292ZXJ5VmlldykpO3RoaXMuX3ZpZXdCeUlkPW5ldyBNYXAoKTt0aGlzLl9kZXZpY2VzPVtdO3RoaXMuX2xpc3RJdGVtQnlJZD1uZXcgTWFwKCk7dGhpcy5fc2VsZWN0ZWRMaXN0SXRlbT1udWxsO3RoaXMuX3Zpc2libGVWaWV3PW51bGw7dGhpcy5fdmlld0NvbnRhaW5lcj1oYm94LmNyZWF0ZUNoaWxkKCdkaXYnLCdmbGV4LWF1dG8gdmJveCcpO2NvbnN0IGRpc2NvdmVyeUZvb3Rlcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2VzLWZvb3RlcicpO3RoaXMuX2RldmljZUNvdW50U3Bhbj1kaXNjb3ZlcnlGb290ZXIuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtkaXNjb3ZlcnlGb290ZXIuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyBSZWFkICcpO2Rpc2NvdmVyeUZvb3Rlci5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUoJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nocm9tZS1kZXZlbG9wZXItdG9vbHMvZG9jcy9yZW1vdGUtZGVidWdnaW5nJyxDb21tb24uVUlTdHJpbmcoJ3JlbW90ZSBkZWJ1Z2dpbmcgZG9jdW1lbnRhdGlvbicpKSk7ZGlzY292ZXJ5Rm9vdGVyLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7dGhpcy5fdXBkYXRlRm9vdGVyKCk7dGhpcy5fc2VsZWN0U2lkZWJhckxpc3RJdGVtKHRoaXMuX2Rpc2NvdmVyeUxpc3RJdGVtLHRoaXMuX2Rpc2NvdmVyeVZpZXcpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRldmljZXNVcGRhdGVkLHRoaXMuX2RldmljZXNVcGRhdGVkLHRoaXMpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMuX2RldmljZXNEaXNjb3ZlcnlDb25maWdDaGFuZ2VkLHRoaXMpO0luc3BlY3RvckZyb250ZW5kSG9zdC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEkuRXZlbnRzLkRldmljZXNQb3J0Rm9yd2FyZGluZ1N0YXR1c0NoYW5nZWQsdGhpcy5fZGV2aWNlc1BvcnRGb3J3YXJkaW5nU3RhdHVzQ2hhbmdlZCx0aGlzKTt0aGlzLmNvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5jb250ZW50RWxlbWVudCk7fQpzdGF0aWMgX2luc3RhbmNlKCl7aWYoIURldmljZXMuRGV2aWNlc1ZpZXcuX2luc3RhbmNlT2JqZWN0KQpEZXZpY2VzLkRldmljZXNWaWV3Ll9pbnN0YW5jZU9iamVjdD1uZXcgRGV2aWNlcy5EZXZpY2VzVmlldygpO3JldHVybiBEZXZpY2VzLkRldmljZXNWaWV3Ll9pbnN0YW5jZU9iamVjdDt9Cl9zZWxlY3RTaWRlYmFyTGlzdEl0ZW0obGlzdEl0ZW0sdmlldyl7aWYodGhpcy5fc2VsZWN0ZWRMaXN0SXRlbT09PWxpc3RJdGVtKQpyZXR1cm47aWYodGhpcy5fc2VsZWN0ZWRMaXN0SXRlbSl7dGhpcy5fc2VsZWN0ZWRMaXN0SXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO3RoaXMuX3Zpc2libGVWaWV3LmRldGFjaCgpO30KdGhpcy5fdmlzaWJsZVZpZXc9dmlldzt0aGlzLl9zZWxlY3RlZExpc3RJdGVtPWxpc3RJdGVtO3RoaXMuX3Zpc2libGVWaWV3LnNob3codGhpcy5fdmlld0NvbnRhaW5lcik7dGhpcy5fc2VsZWN0ZWRMaXN0SXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO30KX2RldmljZXNVcGRhdGVkKGV2ZW50KXt0aGlzLl9kZXZpY2VzPShldmVudC5kYXRhKS5zbGljZSgpLmZpbHRlcihkPT5kLmFkYlNlcmlhbC50b1VwcGVyQ2FzZSgpIT09J1dFQlJUQycmJmQuYWRiU2VyaWFsLnRvVXBwZXJDYXNlKCkhPT0nTE9DQUxIT1NUJyk7Zm9yKGNvbnN0IGRldmljZSBvZiB0aGlzLl9kZXZpY2VzKXtpZighZGV2aWNlLmFkYkNvbm5lY3RlZCkKZGV2aWNlLmFkYk1vZGVsPUNvbW1vbi5VSVN0cmluZygnVW5rbm93bicpO30KY29uc3QgaWRzPW5ldyBTZXQoKTtmb3IoY29uc3QgZGV2aWNlIG9mIHRoaXMuX2RldmljZXMpCmlkcy5hZGQoZGV2aWNlLmlkKTtsZXQgc2VsZWN0ZWRSZW1vdmVkPWZhbHNlO2Zvcihjb25zdCBkZXZpY2VJZCBvZiB0aGlzLl92aWV3QnlJZC5rZXlzKCkpe2lmKCFpZHMuaGFzKGRldmljZUlkKSl7Y29uc3QgbGlzdEl0ZW09KHRoaXMuX2xpc3RJdGVtQnlJZC5nZXQoZGV2aWNlSWQpKTt0aGlzLl9saXN0SXRlbUJ5SWQucmVtb3ZlKGRldmljZUlkKTt0aGlzLl92aWV3QnlJZC5yZW1vdmUoZGV2aWNlSWQpO2xpc3RJdGVtLnJlbW92ZSgpO2lmKGxpc3RJdGVtPT09dGhpcy5fc2VsZWN0ZWRMaXN0SXRlbSkKc2VsZWN0ZWRSZW1vdmVkPXRydWU7fX0KZm9yKGNvbnN0IGRldmljZSBvZiB0aGlzLl9kZXZpY2VzKXtsZXQgdmlldz10aGlzLl92aWV3QnlJZC5nZXQoZGV2aWNlLmlkKTtsZXQgbGlzdEl0ZW09dGhpcy5fbGlzdEl0ZW1CeUlkLmdldChkZXZpY2UuaWQpO2lmKCF2aWV3KXt2aWV3PW5ldyBEZXZpY2VzLkRldmljZXNWaWV3LkRldmljZVZpZXcoKTt0aGlzLl92aWV3QnlJZC5zZXQoZGV2aWNlLmlkLHZpZXcpO2xpc3RJdGVtPXRoaXMuX2NyZWF0ZVNpZGViYXJMaXN0SXRlbSh2aWV3KTt0aGlzLl9saXN0SXRlbUJ5SWQuc2V0KGRldmljZS5pZCxsaXN0SXRlbSk7dGhpcy5fc2lkZWJhckxpc3QuaW5zZXJ0QmVmb3JlKGxpc3RJdGVtLHRoaXMuX3NpZGViYXJMaXN0U3BhY2VyKTt9Cmxpc3RJdGVtLl90aXRsZS50ZXh0Q29udGVudD1kZXZpY2UuYWRiTW9kZWw7bGlzdEl0ZW0uX3N0YXR1cy50ZXh0Q29udGVudD1kZXZpY2UuYWRiQ29ubmVjdGVkP0NvbW1vbi5VSVN0cmluZygnQ29ubmVjdGVkJyk6Q29tbW9uLlVJU3RyaW5nKCdQZW5kaW5nIEF1dGhvcml6YXRpb24nKTtsaXN0SXRlbS5jbGFzc0xpc3QudG9nZ2xlKCdkZXZpY2UtY29ubmVjdGVkJyxkZXZpY2UuYWRiQ29ubmVjdGVkKTt2aWV3LnVwZGF0ZShkZXZpY2UpO30KaWYoc2VsZWN0ZWRSZW1vdmVkKQp0aGlzLl9zZWxlY3RTaWRlYmFyTGlzdEl0ZW0odGhpcy5fZGlzY292ZXJ5TGlzdEl0ZW0sdGhpcy5fZGlzY292ZXJ5Vmlldyk7dGhpcy5fdXBkYXRlRm9vdGVyKCk7fQpfY3JlYXRlU2lkZWJhckxpc3RJdGVtKHZpZXcpe2NvbnN0IGxpc3RJdGVtPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RldmljZXMtc2lkZWJhci1pdGVtJyk7bGlzdEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3NlbGVjdFNpZGViYXJMaXN0SXRlbS5iaW5kKHRoaXMsbGlzdEl0ZW0sdmlldykpO2xpc3RJdGVtLl90aXRsZT1saXN0SXRlbS5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlcy1zaWRlYmFyLWl0ZW0tdGl0bGUnKTtsaXN0SXRlbS5fc3RhdHVzPWxpc3RJdGVtLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2VzLXNpZGViYXItaXRlbS1zdGF0dXMnKTtyZXR1cm4gbGlzdEl0ZW07fQpfZGV2aWNlc0Rpc2NvdmVyeUNvbmZpZ0NoYW5nZWQoZXZlbnQpe2NvbnN0IGNvbmZpZz0oZXZlbnQuZGF0YSk7dGhpcy5fZGlzY292ZXJ5Vmlldy5kaXNjb3ZlcnlDb25maWdDaGFuZ2VkKGNvbmZpZyk7fQpfZGV2aWNlc1BvcnRGb3J3YXJkaW5nU3RhdHVzQ2hhbmdlZChldmVudCl7Y29uc3Qgc3RhdHVzPShldmVudC5kYXRhKTtmb3IoY29uc3QgZGV2aWNlSWQgaW4gc3RhdHVzKXtjb25zdCB2aWV3PXRoaXMuX3ZpZXdCeUlkLmdldChkZXZpY2VJZCk7aWYodmlldykKdmlldy5wb3J0Rm9yd2FyZGluZ1N0YXR1c0NoYW5nZWQoc3RhdHVzW2RldmljZUlkXSk7fQpmb3IoY29uc3QgZGV2aWNlSWQgb2YgdGhpcy5fdmlld0J5SWQua2V5cygpKXtjb25zdCB2aWV3PXRoaXMuX3ZpZXdCeUlkLmdldChkZXZpY2VJZCk7aWYodmlldyYmIShkZXZpY2VJZCBpbiBzdGF0dXMpKQp2aWV3LnBvcnRGb3J3YXJkaW5nU3RhdHVzQ2hhbmdlZCh7cG9ydHM6e30sYnJvd3NlcklkOicnfSk7fX0KX3VwZGF0ZUZvb3Rlcigpe3RoaXMuX2RldmljZUNvdW50U3Bhbi50ZXh0Q29udGVudD0hdGhpcy5fZGV2aWNlcy5sZW5ndGg/Q29tbW9uLlVJU3RyaW5nKCdObyBkZXZpY2VzIGRldGVjdGVkLicpOnRoaXMuX2RldmljZXMubGVuZ3RoPT09MT9Db21tb24uVUlTdHJpbmcoJzEgZGV2aWNlIGRldGVjdGVkLicpOkNvbW1vbi5VSVN0cmluZygnJWQgZGV2aWNlcyBkZXRlY3RlZC4nLHRoaXMuX2RldmljZXMubGVuZ3RoKTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RGV2aWNlc1VwZGF0ZXNFbmFibGVkKHRydWUpO30Kd2lsbEhpZGUoKXtzdXBlci53aWxsSGlkZSgpO0luc3BlY3RvckZyb250ZW5kSG9zdC5zZXREZXZpY2VzVXBkYXRlc0VuYWJsZWQoZmFsc2UpO319O0RldmljZXMuRGV2aWNlc1ZpZXcuRGlzY292ZXJ5Vmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuc2V0TWluaW11bVNpemUoMTAwLDEwMCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2NvdmVyeS12aWV3Jyk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaGJveCBkZXZpY2UtdGV4dC1yb3cnKS5jcmVhdGVDaGlsZCgnZGl2Jywndmlldy10aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnU2V0dGluZ3MnKTtjb25zdCBkaXNjb3ZlclVzYkRldmljZXNDaGVja2JveD1VSS5DaGVja2JveExhYmVsLmNyZWF0ZShDb21tb24uVUlTdHJpbmcoJ0Rpc2NvdmVyIFVTQiBkZXZpY2VzJykpO2Rpc2NvdmVyVXNiRGV2aWNlc0NoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VzYi1jaGVja2JveCcpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkaXNjb3ZlclVzYkRldmljZXNDaGVja2JveCk7dGhpcy5fZGlzY292ZXJVc2JEZXZpY2VzQ2hlY2tib3g9ZGlzY292ZXJVc2JEZXZpY2VzQ2hlY2tib3guY2hlY2tib3hFbGVtZW50O3RoaXMuX2Rpc2NvdmVyVXNiRGV2aWNlc0NoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e3RoaXMuX2NvbmZpZy5kaXNjb3ZlclVzYkRldmljZXM9dGhpcy5fZGlzY292ZXJVc2JEZXZpY2VzQ2hlY2tib3guY2hlY2tlZDtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2V0RGV2aWNlc0Rpc2NvdmVyeUNvbmZpZyh0aGlzLl9jb25maWcpO30sZmFsc2UpO2NvbnN0IGhlbHA9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkaXNjb3ZlcnktaGVscCcpO2hlbHAuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05lZWQgaGVscD8gUmVhZCBDaHJvbWUgJyk7aGVscC5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUoJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nocm9tZS1kZXZlbG9wZXItdG9vbHMvZG9jcy9yZW1vdGUtZGVidWdnaW5nJyxDb21tb24uVUlTdHJpbmcoJ3JlbW90ZSBkZWJ1Z2dpbmcgZG9jdW1lbnRhdGlvbi4nKSkpO3RoaXMuX2NvbmZpZzt0aGlzLl9wb3J0Rm9yd2FyZGluZ1ZpZXc9bmV3IERldmljZXMuRGV2aWNlc1ZpZXcuUG9ydEZvcndhcmRpbmdWaWV3KChlbmFibGVkLGNvbmZpZyk9Pnt0aGlzLl9jb25maWcucG9ydEZvcndhcmRpbmdFbmFibGVkPWVuYWJsZWQ7dGhpcy5fY29uZmlnLnBvcnRGb3J3YXJkaW5nQ29uZmlnPXt9O2Zvcihjb25zdCBydWxlIG9mIGNvbmZpZykKdGhpcy5fY29uZmlnLnBvcnRGb3J3YXJkaW5nQ29uZmlnW3J1bGUucG9ydF09cnVsZS5hZGRyZXNzO0luc3BlY3RvckZyb250ZW5kSG9zdC5zZXREZXZpY2VzRGlzY292ZXJ5Q29uZmlnKHRoaXMuX2NvbmZpZyk7fSk7dGhpcy5fcG9ydEZvcndhcmRpbmdWaWV3LnNob3codGhpcy5lbGVtZW50KTt9CmRpc2NvdmVyeUNvbmZpZ0NoYW5nZWQoY29uZmlnKXt0aGlzLl9jb25maWc9Y29uZmlnO3RoaXMuX2Rpc2NvdmVyVXNiRGV2aWNlc0NoZWNrYm94LmNoZWNrZWQ9Y29uZmlnLmRpc2NvdmVyVXNiRGV2aWNlczt0aGlzLl9wb3J0Rm9yd2FyZGluZ1ZpZXcuZGlzY292ZXJ5Q29uZmlnQ2hhbmdlZChjb25maWcucG9ydEZvcndhcmRpbmdFbmFibGVkLGNvbmZpZy5wb3J0Rm9yd2FyZGluZ0NvbmZpZyk7fX07RGV2aWNlcy5EZXZpY2VzVmlldy5Qb3J0Rm9yd2FyZGluZ1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGNhbGxiYWNrKXtzdXBlcigpO3RoaXMuX2NhbGxiYWNrPWNhbGxiYWNrO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwb3J0LWZvcndhcmRpbmctdmlldycpO2NvbnN0IHBvcnRGb3J3YXJkaW5nSGVhZGVyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncG9ydC1mb3J3YXJkaW5nLWhlYWRlcicpO2NvbnN0IHBvcnRGb3J3YXJkaW5nRW5hYmxlZENoZWNrYm94PVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKENvbW1vbi5VSVN0cmluZygnUG9ydCBmb3J3YXJkaW5nJykpO3BvcnRGb3J3YXJkaW5nRW5hYmxlZENoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3BvcnQtZm9yd2FyZGluZy1jaGVja2JveCcpO3BvcnRGb3J3YXJkaW5nSGVhZGVyLmFwcGVuZENoaWxkKHBvcnRGb3J3YXJkaW5nRW5hYmxlZENoZWNrYm94KTt0aGlzLl9wb3J0Rm9yd2FyZGluZ0VuYWJsZWRDaGVja2JveD1wb3J0Rm9yd2FyZGluZ0VuYWJsZWRDaGVja2JveC5jaGVja2JveEVsZW1lbnQ7dGhpcy5fcG9ydEZvcndhcmRpbmdFbmFibGVkQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCBwb3J0Rm9yd2FyZGluZ0Zvb3Rlcj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BvcnQtZm9yd2FyZGluZy1mb290ZXInKTtwb3J0Rm9yd2FyZGluZ0Zvb3Rlci5jcmVhdGVDaGlsZCgnc3BhbicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRGVmaW5lIHRoZSBsaXN0ZW5pbmcgcG9ydCBvbiB5b3VyIGRldmljZSB0aGF0IG1hcHMgdG8gYSBwb3J0IGFjY2Vzc2libGUgZnJvbSB5b3VyIGRldmVsb3BtZW50IG1hY2hpbmUuICcpO3BvcnRGb3J3YXJkaW5nRm9vdGVyLmFwcGVuZENoaWxkKFVJLlhMaW5rLmNyZWF0ZSgnaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9kZXZ0b29scy9kb2NzL3JlbW90ZS1kZWJ1Z2dpbmcjcG9ydC1mb3J3YXJkaW5nJyxDb21tb24uVUlTdHJpbmcoJ0xlYXJuIG1vcmUnKSkpO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5yZWdpc3RlclJlcXVpcmVkQ1NTKCdkZXZpY2VzL2RldmljZXNWaWV3LmNzcycpO3RoaXMuX2xpc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwb3J0LWZvcndhcmRpbmctbGlzdCcpO2NvbnN0IHBsYWNlaG9sZGVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3BvcnQtZm9yd2FyZGluZy1saXN0LWVtcHR5Jyk7cGxhY2Vob2xkZXIudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdObyBydWxlcycpO3RoaXMuX2xpc3Quc2V0RW1wdHlQbGFjZWhvbGRlcihwbGFjZWhvbGRlcik7dGhpcy5fbGlzdC5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fZWRpdG9yPW51bGw7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgcnVsZScpLHRoaXMuX2FkZFJ1bGVCdXR0b25DbGlja2VkLmJpbmQodGhpcyksJ2FkZC1ydWxlLWJ1dHRvbicpKTt0aGlzLl9wb3J0Rm9yd2FyZGluZ0NvbmZpZz1bXTt9Cl91cGRhdGUoKXt0aGlzLl9jYWxsYmFjay5jYWxsKG51bGwsdGhpcy5fcG9ydEZvcndhcmRpbmdFbmFibGVkQ2hlY2tib3guY2hlY2tlZCx0aGlzLl9wb3J0Rm9yd2FyZGluZ0NvbmZpZyk7fQpfYWRkUnVsZUJ1dHRvbkNsaWNrZWQoKXt0aGlzLl9saXN0LmFkZE5ld0l0ZW0odGhpcy5fcG9ydEZvcndhcmRpbmdDb25maWcubGVuZ3RoLHtwb3J0OicnLGFkZHJlc3M6Jyd9KTt9CmRpc2NvdmVyeUNvbmZpZ0NoYW5nZWQocG9ydEZvcndhcmRpbmdFbmFibGVkLHBvcnRGb3J3YXJkaW5nQ29uZmlnKXt0aGlzLl9wb3J0Rm9yd2FyZGluZ0VuYWJsZWRDaGVja2JveC5jaGVja2VkPXBvcnRGb3J3YXJkaW5nRW5hYmxlZDt0aGlzLl9wb3J0Rm9yd2FyZGluZ0NvbmZpZz1bXTt0aGlzLl9saXN0LmNsZWFyKCk7Zm9yKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwb3J0Rm9yd2FyZGluZ0NvbmZpZykpe2NvbnN0IHJ1bGU9KHtwb3J0OmtleSxhZGRyZXNzOnBvcnRGb3J3YXJkaW5nQ29uZmlnW2tleV19KTt0aGlzLl9wb3J0Rm9yd2FyZGluZ0NvbmZpZy5wdXNoKHJ1bGUpO3RoaXMuX2xpc3QuYXBwZW5kSXRlbShydWxlLHRydWUpO319CnJlbmRlckl0ZW0ocnVsZSxlZGl0YWJsZSl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdwb3J0LWZvcndhcmRpbmctbGlzdC1pdGVtJyk7Y29uc3QgcG9ydD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwb3J0LWZvcndhcmRpbmctdmFsdWUgcG9ydC1mb3J3YXJkaW5nLXBvcnQnKTtwb3J0LmNyZWF0ZUNoaWxkKCdzcGFuJywncG9ydC1sb2NhbGhvc3QnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ2xvY2FsaG9zdDonKTtwb3J0LmNyZWF0ZVRleHRDaGlsZChydWxlLnBvcnQpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BvcnQtZm9yd2FyZGluZy1zZXBhcmF0b3InKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwb3J0LWZvcndhcmRpbmctdmFsdWUnKS50ZXh0Q29udGVudD1ydWxlLmFkZHJlc3M7cmV0dXJuIGVsZW1lbnQ7fQpyZW1vdmVJdGVtUmVxdWVzdGVkKHJ1bGUsaW5kZXgpe3RoaXMuX3BvcnRGb3J3YXJkaW5nQ29uZmlnLnNwbGljZShpbmRleCwxKTt0aGlzLl9saXN0LnJlbW92ZUl0ZW0oaW5kZXgpO3RoaXMuX3VwZGF0ZSgpO30KY29tbWl0RWRpdChydWxlLGVkaXRvcixpc05ldyl7cnVsZS5wb3J0PWVkaXRvci5jb250cm9sKCdwb3J0JykudmFsdWUudHJpbSgpO3J1bGUuYWRkcmVzcz1lZGl0b3IuY29udHJvbCgnYWRkcmVzcycpLnZhbHVlLnRyaW0oKTtpZihpc05ldykKdGhpcy5fcG9ydEZvcndhcmRpbmdDb25maWcucHVzaChydWxlKTt0aGlzLl91cGRhdGUoKTt9CmJlZ2luRWRpdChydWxlKXtjb25zdCBlZGl0b3I9dGhpcy5fY3JlYXRlRWRpdG9yKCk7ZWRpdG9yLmNvbnRyb2woJ3BvcnQnKS52YWx1ZT1ydWxlLnBvcnQ7ZWRpdG9yLmNvbnRyb2woJ2FkZHJlc3MnKS52YWx1ZT1ydWxlLmFkZHJlc3M7cmV0dXJuIGVkaXRvcjt9Cl9jcmVhdGVFZGl0b3IoKXtpZih0aGlzLl9lZGl0b3IpCnJldHVybiB0aGlzLl9lZGl0b3I7Y29uc3QgZWRpdG9yPW5ldyBVSS5MaXN0V2lkZ2V0LkVkaXRvcigpO3RoaXMuX2VkaXRvcj1lZGl0b3I7Y29uc3QgY29udGVudD1lZGl0b3IuY29udGVudEVsZW1lbnQoKTtjb25zdCBmaWVsZHM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywncG9ydC1mb3J3YXJkaW5nLWVkaXQtcm93Jyk7ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdwb3J0LWZvcndhcmRpbmctdmFsdWUgcG9ydC1mb3J3YXJkaW5nLXBvcnQnKS5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlSW5wdXQoJ3BvcnQnLCd0ZXh0JywnRGV2aWNlIHBvcnQgKDMzMzMpJyxwb3J0VmFsaWRhdG9yLmJpbmQodGhpcykpKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BvcnQtZm9yd2FyZGluZy1zZXBhcmF0b3IgcG9ydC1mb3J3YXJkaW5nLXNlcGFyYXRvci1pbnZpc2libGUnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BvcnQtZm9yd2FyZGluZy12YWx1ZScpLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgnYWRkcmVzcycsJ3RleHQnLCdMb2NhbCBhZGRyZXNzIChkZXYuZXhhbXBsZS5jb3JwOjMzMzMpJyxhZGRyZXNzVmFsaWRhdG9yKSk7cmV0dXJuIGVkaXRvcjtmdW5jdGlvbiBwb3J0VmFsaWRhdG9yKHJ1bGUsaW5kZXgsaW5wdXQpe2NvbnN0IHZhbHVlPWlucHV0LnZhbHVlLnRyaW0oKTtjb25zdCBtYXRjaD12YWx1ZS5tYXRjaCgvXihcZCspJC8pO2lmKCFtYXRjaCkKcmV0dXJuIGZhbHNlO2NvbnN0IHBvcnQ9cGFyc2VJbnQobWF0Y2hbMV0sMTApO2lmKHBvcnQ8MTAyNHx8cG9ydD42NTUzNSkKcmV0dXJuIGZhbHNlO2ZvcihsZXQgaT0wO2k8dGhpcy5fcG9ydEZvcndhcmRpbmdDb25maWcubGVuZ3RoOysraSl7aWYoaSE9PWluZGV4JiZ0aGlzLl9wb3J0Rm9yd2FyZGluZ0NvbmZpZ1tpXS5wb3J0PT09dmFsdWUpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30KZnVuY3Rpb24gYWRkcmVzc1ZhbGlkYXRvcihydWxlLGluZGV4LGlucHV0KXtjb25zdCBtYXRjaD1pbnB1dC52YWx1ZS50cmltKCkubWF0Y2goL14oW2EtekEtWjAtOVwuXC1fXSspOihcZCspJC8pO2lmKCFtYXRjaCkKcmV0dXJuIGZhbHNlO2NvbnN0IHBvcnQ9cGFyc2VJbnQobWF0Y2hbMl0sMTApO3JldHVybiBwb3J0PD02NTUzNTt9fX07RGV2aWNlcy5EZXZpY2VzVmlldy5EZXZpY2VWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5zZXRNaW5pbXVtU2l6ZSgxMDAsMTAwKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RldmljZS12aWV3Jyk7Y29uc3QgdG9wUm93PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hib3ggZGV2aWNlLXRleHQtcm93Jyk7dGhpcy5fZGV2aWNlVGl0bGU9dG9wUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCd2aWV3LXRpdGxlJyk7dGhpcy5fZGV2aWNlU2VyaWFsPXRvcFJvdy5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLXNlcmlhbCcpO3RoaXMuX3BvcnRTdGF0dXM9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLXBvcnQtc3RhdHVzIGhpZGRlbicpO3RoaXMuX2RldmljZU9mZmxpbmU9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fZGV2aWNlT2ZmbGluZS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1BlbmRpbmcgYXV0aGVudGljYXRpb246IHBsZWFzZSBhY2NlcHQgZGVidWdnaW5nIHNlc3Npb24gb24gdGhlIGRldmljZS4nKTt0aGlzLl9ub0Jyb3dzZXJzPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuX25vQnJvd3NlcnMudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdObyBicm93c2VycyBkZXRlY3RlZC4nKTt0aGlzLl9icm93c2Vycz10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtYnJvd3Nlci1saXN0IHZib3gnKTt0aGlzLl9icm93c2VyQnlJZD1uZXcgTWFwKCk7dGhpcy5fY2FjaGVkUG9ydFN0YXR1cz1udWxsO3RoaXMuX2RldmljZT1udWxsO30KdXBkYXRlKGRldmljZSl7aWYoIXRoaXMuX2RldmljZXx8dGhpcy5fZGV2aWNlLmFkYk1vZGVsIT09ZGV2aWNlLmFkYk1vZGVsKQp0aGlzLl9kZXZpY2VUaXRsZS50ZXh0Q29udGVudD1kZXZpY2UuYWRiTW9kZWw7aWYoIXRoaXMuX2RldmljZXx8dGhpcy5fZGV2aWNlLmFkYlNlcmlhbCE9PWRldmljZS5hZGJTZXJpYWwpCnRoaXMuX2RldmljZVNlcmlhbC50ZXh0Q29udGVudD0nIycrZGV2aWNlLmFkYlNlcmlhbDt0aGlzLl9kZXZpY2VPZmZsaW5lLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsZGV2aWNlLmFkYkNvbm5lY3RlZCk7dGhpcy5fbm9Ccm93c2Vycy5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFkZXZpY2UuYWRiQ29ubmVjdGVkfHwhIWRldmljZS5icm93c2Vycy5sZW5ndGgpO3RoaXMuX2Jyb3dzZXJzLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIWRldmljZS5hZGJDb25uZWN0ZWR8fCFkZXZpY2UuYnJvd3NlcnMubGVuZ3RoKTtjb25zdCBicm93c2VySWRzPW5ldyBTZXQoKTtmb3IoY29uc3QgYnJvd3NlciBvZiBkZXZpY2UuYnJvd3NlcnMpCmJyb3dzZXJJZHMuYWRkKGJyb3dzZXIuaWQpO2Zvcihjb25zdCBicm93c2VySWQgb2YgdGhpcy5fYnJvd3NlckJ5SWQua2V5cygpKXtpZighYnJvd3Nlcklkcy5oYXMoYnJvd3NlcklkKSl7dGhpcy5fYnJvd3NlckJ5SWQuZ2V0KGJyb3dzZXJJZCkuZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9icm93c2VyQnlJZC5yZW1vdmUoYnJvd3NlcklkKTt9fQpmb3IoY29uc3QgYnJvd3NlciBvZiBkZXZpY2UuYnJvd3NlcnMpe2xldCBzZWN0aW9uPXRoaXMuX2Jyb3dzZXJCeUlkLmdldChicm93c2VyLmlkKTtpZighc2VjdGlvbil7c2VjdGlvbj10aGlzLl9jcmVhdGVCcm93c2VyU2VjdGlvbigpO3RoaXMuX2Jyb3dzZXJCeUlkLnNldChicm93c2VyLmlkLHNlY3Rpb24pO3RoaXMuX2Jyb3dzZXJzLmFwcGVuZENoaWxkKHNlY3Rpb24uZWxlbWVudCk7fQp0aGlzLl91cGRhdGVCcm93c2VyU2VjdGlvbihzZWN0aW9uLGJyb3dzZXIpO30KdGhpcy5fZGV2aWNlPWRldmljZTt9Cl9jcmVhdGVCcm93c2VyU2VjdGlvbigpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndmJveCBmbGV4LW5vbmUnKTtjb25zdCB0b3BSb3c9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnJyk7Y29uc3QgdGl0bGU9dG9wUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtYnJvd3Nlci10aXRsZScpO2NvbnN0IG5ld1RhYlJvdz1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtYnJvd3Nlci1uZXctdGFiJyk7bmV3VGFiUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCcnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05ldyB0YWI6Jyk7Y29uc3QgbmV3VGFiSW5wdXQ9VUkuY3JlYXRlSW5wdXQoJycsJ3RleHQnKTtuZXdUYWJSb3cuYXBwZW5kQ2hpbGQobmV3VGFiSW5wdXQpO25ld1RhYklucHV0LnBsYWNlaG9sZGVyPUNvbW1vbi5VSVN0cmluZygnRW50ZXIgVVJMJyk7bmV3VGFiSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsbmV3VGFiS2V5RG93bixmYWxzZSk7Y29uc3QgbmV3VGFiQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdPcGVuJyksb3Blbk5ld1RhYik7bmV3VGFiUm93LmFwcGVuZENoaWxkKG5ld1RhYkJ1dHRvbik7Y29uc3QgcGFnZXM9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLXBhZ2UtbGlzdCB2Ym94Jyk7Y29uc3Qgdmlld01vcmU9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV2aWNlLXZpZXctbW9yZScpO3ZpZXdNb3JlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx2aWV3TW9yZUNsaWNrLGZhbHNlKTt1cGRhdGVWaWV3TW9yZVRpdGxlKCk7Y29uc3Qgc2VjdGlvbj17YnJvd3NlcjpudWxsLGVsZW1lbnQ6ZWxlbWVudCx0aXRsZTp0aXRsZSxwYWdlczpwYWdlcyx2aWV3TW9yZTp2aWV3TW9yZSxuZXdUYWI6bmV3VGFiUm93LHBhZ2VTZWN0aW9uczpuZXcgTWFwKCl9O3JldHVybiBzZWN0aW9uO2Z1bmN0aW9uIHZpZXdNb3JlQ2xpY2soKXtwYWdlcy5jbGFzc0xpc3QudG9nZ2xlKCdkZXZpY2Utdmlldy1tb3JlLXRvZ2dsZWQnKTt1cGRhdGVWaWV3TW9yZVRpdGxlKCk7fQpmdW5jdGlvbiB1cGRhdGVWaWV3TW9yZVRpdGxlKCl7dmlld01vcmUudGV4dENvbnRlbnQ9cGFnZXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdkZXZpY2Utdmlldy1tb3JlLXRvZ2dsZWQnKT9Db21tb24uVUlTdHJpbmcoJ1ZpZXcgbGVzcyB0YWJzXHUyMDI2Jyk6Q29tbW9uLlVJU3RyaW5nKCdWaWV3IG1vcmUgdGFic1x1MjAyNicpO30KZnVuY3Rpb24gbmV3VGFiS2V5RG93bihldmVudCl7aWYoZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQuY29uc3VtZSh0cnVlKTtvcGVuTmV3VGFiKCk7fX0KZnVuY3Rpb24gb3Blbk5ld1RhYigpe2lmKHNlY3Rpb24uYnJvd3Nlcil7SW5zcGVjdG9yRnJvbnRlbmRIb3N0Lm9wZW5SZW1vdGVQYWdlKHNlY3Rpb24uYnJvd3Nlci5pZCxuZXdUYWJJbnB1dC52YWx1ZS50cmltKCl8fCdhYm91dDpibGFuaycpO25ld1RhYklucHV0LnZhbHVlPScnO319fQpfdXBkYXRlQnJvd3NlclNlY3Rpb24oc2VjdGlvbixicm93c2VyKXtpZighc2VjdGlvbi5icm93c2VyfHxzZWN0aW9uLmJyb3dzZXIuYWRiQnJvd3Nlck5hbWUhPT1icm93c2VyLmFkYkJyb3dzZXJOYW1lfHxzZWN0aW9uLmJyb3dzZXIuYWRiQnJvd3NlclZlcnNpb24hPT1icm93c2VyLmFkYkJyb3dzZXJWZXJzaW9uKXtpZihicm93c2VyLmFkYkJyb3dzZXJWZXJzaW9uKQpzZWN0aW9uLnRpdGxlLnRleHRDb250ZW50PVN0cmluZy5zcHJpbnRmKCclcyAoJXMpJyxicm93c2VyLmFkYkJyb3dzZXJOYW1lLGJyb3dzZXIuYWRiQnJvd3NlclZlcnNpb24pO2Vsc2UKc2VjdGlvbi50aXRsZS50ZXh0Q29udGVudD1icm93c2VyLmFkYkJyb3dzZXJOYW1lO30KY29uc3QgcGFnZUlkcz1uZXcgU2V0KCk7Zm9yKGNvbnN0IHBhZ2Ugb2YgYnJvd3Nlci5wYWdlcykKcGFnZUlkcy5hZGQocGFnZS5pZCk7Zm9yKGNvbnN0IHBhZ2VJZCBvZiBzZWN0aW9uLnBhZ2VTZWN0aW9ucy5rZXlzKCkpe2lmKCFwYWdlSWRzLmhhcyhwYWdlSWQpKXtzZWN0aW9uLnBhZ2VTZWN0aW9ucy5nZXQocGFnZUlkKS5lbGVtZW50LnJlbW92ZSgpO3NlY3Rpb24ucGFnZVNlY3Rpb25zLnJlbW92ZShwYWdlSWQpO319CmZvcihsZXQgaW5kZXg9MDtpbmRleDxicm93c2VyLnBhZ2VzLmxlbmd0aDsrK2luZGV4KXtjb25zdCBwYWdlPWJyb3dzZXIucGFnZXNbaW5kZXhdO2xldCBwYWdlU2VjdGlvbj1zZWN0aW9uLnBhZ2VTZWN0aW9ucy5nZXQocGFnZS5pZCk7aWYoIXBhZ2VTZWN0aW9uKXtwYWdlU2VjdGlvbj10aGlzLl9jcmVhdGVQYWdlU2VjdGlvbigpO3NlY3Rpb24ucGFnZVNlY3Rpb25zLnNldChwYWdlLmlkLHBhZ2VTZWN0aW9uKTtzZWN0aW9uLnBhZ2VzLmFwcGVuZENoaWxkKHBhZ2VTZWN0aW9uLmVsZW1lbnQpO30KdGhpcy5fdXBkYXRlUGFnZVNlY3Rpb24ocGFnZVNlY3Rpb24scGFnZSk7aWYoIWluZGV4JiZzZWN0aW9uLnBhZ2VzLmZpcnN0Q2hpbGQhPT1wYWdlU2VjdGlvbi5lbGVtZW50KQpzZWN0aW9uLnBhZ2VzLmluc2VydEJlZm9yZShwYWdlU2VjdGlvbi5lbGVtZW50LHNlY3Rpb24ucGFnZXMuZmlyc3RDaGlsZCk7fQpjb25zdCBrVmlld01vcmVDb3VudD0zO2ZvcihsZXQgaW5kZXg9MCxlbGVtZW50PXNlY3Rpb24ucGFnZXMuZmlyc3RDaGlsZDtlbGVtZW50O2VsZW1lbnQ9ZWxlbWVudC5uZXh0U2libGluZywrK2luZGV4KQplbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2RldmljZS12aWV3LW1vcmUtcGFnZScsaW5kZXg+PWtWaWV3TW9yZUNvdW50KTtzZWN0aW9uLnZpZXdNb3JlLmNsYXNzTGlzdC50b2dnbGUoJ2RldmljZS1uZWVkcy12aWV3LW1vcmUnLGJyb3dzZXIucGFnZXMubGVuZ3RoPmtWaWV3TW9yZUNvdW50KTtzZWN0aW9uLm5ld1RhYi5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFicm93c2VyLmFkYkJyb3dzZXJDaHJvbWVWZXJzaW9uKTtzZWN0aW9uLmJyb3dzZXI9YnJvd3Nlcjt9Cl9jcmVhdGVQYWdlU2VjdGlvbigpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndmJveCcpO2NvbnN0IHRpdGxlUm93PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1wYWdlLXRpdGxlLXJvdycpO2NvbnN0IHRpdGxlPXRpdGxlUm93LmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtcGFnZS10aXRsZScpO2NvbnN0IGluc3BlY3Q9VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0luc3BlY3QnKSxkb0FjdGlvbi5iaW5kKG51bGwsJ2luc3BlY3QnKSk7dGl0bGVSb3cuYXBwZW5kQ2hpbGQoaW5zcGVjdCk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhck1lbnVCdXR0b24oYXBwZW5kQWN0aW9ucykpO3RpdGxlUm93LmFwcGVuZENoaWxkKHRvb2xiYXIuZWxlbWVudCk7Y29uc3QgdXJsPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2RldmljZS1wYWdlLXVybCcpO2NvbnN0IHNlY3Rpb249e3BhZ2U6bnVsbCxlbGVtZW50OmVsZW1lbnQsdGl0bGU6dGl0bGUsdXJsOnVybCxpbnNwZWN0Omluc3BlY3R9O3JldHVybiBzZWN0aW9uO2Z1bmN0aW9uIGFwcGVuZEFjdGlvbnMoY29udGV4dE1lbnUpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlbG9hZCcpLGRvQWN0aW9uLmJpbmQobnVsbCwncmVsb2FkJykpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0ZvY3VzJyksZG9BY3Rpb24uYmluZChudWxsLCdhY3RpdmF0ZScpKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDbG9zZScpLGRvQWN0aW9uLmJpbmQobnVsbCwnY2xvc2UnKSk7fQpmdW5jdGlvbiBkb0FjdGlvbihhY3Rpb24pe2lmKHNlY3Rpb24ucGFnZSkKSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnBlcmZvcm1BY3Rpb25PblJlbW90ZVBhZ2Uoc2VjdGlvbi5wYWdlLmlkLGFjdGlvbik7fX0KX3VwZGF0ZVBhZ2VTZWN0aW9uKHNlY3Rpb24scGFnZSl7aWYoIXNlY3Rpb24ucGFnZXx8c2VjdGlvbi5wYWdlLm5hbWUhPT1wYWdlLm5hbWUpe3NlY3Rpb24udGl0bGUudGV4dENvbnRlbnQ9cGFnZS5uYW1lO3NlY3Rpb24udGl0bGUudGl0bGU9cGFnZS5uYW1lO30KaWYoIXNlY3Rpb24ucGFnZXx8c2VjdGlvbi5wYWdlLnVybCE9PXBhZ2UudXJsKXtzZWN0aW9uLnVybC50ZXh0Q29udGVudD0nJztzZWN0aW9uLnVybC5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUocGFnZS51cmwpKTt9CnNlY3Rpb24uaW5zcGVjdC5kaXNhYmxlZD1wYWdlLmF0dGFjaGVkO3NlY3Rpb24ucGFnZT1wYWdlO30KcG9ydEZvcndhcmRpbmdTdGF0dXNDaGFuZ2VkKHN0YXR1cyl7Y29uc3QganNvbj1KU09OLnN0cmluZ2lmeShzdGF0dXMpO2lmKGpzb249PT10aGlzLl9jYWNoZWRQb3J0U3RhdHVzKQpyZXR1cm47dGhpcy5fY2FjaGVkUG9ydFN0YXR1cz1qc29uO3RoaXMuX3BvcnRTdGF0dXMucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9wb3J0U3RhdHVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdkZXZpY2UtcG9ydC1zdGF0dXMtdGV4dCcpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUG9ydCBGb3J3YXJkaW5nOicpO2NvbnN0IGNvbm5lY3RlZD1bXTtjb25zdCB0cmFuc2llbnQ9W107Y29uc3QgZXJyb3I9W107bGV0IGVtcHR5PXRydWU7Zm9yKGNvbnN0IHBvcnQgaW4gc3RhdHVzLnBvcnRzKXtpZighc3RhdHVzLnBvcnRzLmhhc093blByb3BlcnR5KHBvcnQpKQpjb250aW51ZTtlbXB0eT1mYWxzZTtjb25zdCBwb3J0U3RhdHVzPXN0YXR1cy5wb3J0c1twb3J0XTtjb25zdCBwb3J0TnVtYmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RldmljZS12aWV3LXBvcnQtbnVtYmVyIG1vbm9zcGFjZScpO3BvcnROdW1iZXIudGV4dENvbnRlbnQ9JzonK3BvcnQ7aWYocG9ydFN0YXR1cz49MCkKdGhpcy5fcG9ydFN0YXR1cy5hcHBlbmRDaGlsZChwb3J0TnVtYmVyKTtlbHNlCnRoaXMuX3BvcnRTdGF0dXMuaW5zZXJ0QmVmb3JlKHBvcnROdW1iZXIsdGhpcy5fcG9ydFN0YXR1cy5maXJzdENoaWxkKTtjb25zdCBwb3J0SWNvbj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdkZXZpY2Utdmlldy1wb3J0LWljb24nKTtpZihwb3J0U3RhdHVzPj0wKXtjb25uZWN0ZWQucHVzaChwb3J0KTt9ZWxzZSBpZihwb3J0U3RhdHVzPT09LTF8fHBvcnRTdGF0dXM9PT0tMil7cG9ydEljb24uY2xhc3NMaXN0LmFkZCgnZGV2aWNlLXZpZXctcG9ydC1pY29uLXRyYW5zaWVudCcpO3RyYW5zaWVudC5wdXNoKHBvcnQpO31lbHNlIGlmKHBvcnRTdGF0dXM8MCl7cG9ydEljb24uY2xhc3NMaXN0LmFkZCgnZGV2aWNlLXZpZXctcG9ydC1pY29uLWVycm9yJyk7ZXJyb3IucHVzaChwb3J0KTt9CnRoaXMuX3BvcnRTdGF0dXMuaW5zZXJ0QmVmb3JlKHBvcnRJY29uLHBvcnROdW1iZXIpO30KY29uc3QgdGl0bGU9W107aWYoY29ubmVjdGVkLmxlbmd0aCkKdGl0bGUucHVzaChDb21tb24uVUlTdHJpbmcoJ0Nvbm5lY3RlZDogJXMnLGNvbm5lY3RlZC5qb2luKCcsICcpKSk7aWYodHJhbnNpZW50Lmxlbmd0aCkKdGl0bGUucHVzaChDb21tb24uVUlTdHJpbmcoJ1RyYW5zaWVudDogJXMnLHRyYW5zaWVudC5qb2luKCcsICcpKSk7aWYoZXJyb3IubGVuZ3RoKQp0aXRsZS5wdXNoKENvbW1vbi5VSVN0cmluZygnRXJyb3I6ICVzJyxlcnJvci5qb2luKCcsICcpKSk7dGhpcy5fcG9ydFN0YXR1cy50aXRsZT10aXRsZS5qb2luKCc7ICcpO3RoaXMuX3BvcnRTdGF0dXMuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyxlbXB0eSk7fX07RGV2aWNlcy5EZXZpY2VzVmlldy5Ccm93c2VyU2VjdGlvbjtEZXZpY2VzLkRldmljZXNWaWV3LlBhZ2VTZWN0aW9uOztSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZGV2aWNlcy9kZXZpY2VzVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmRldmljZXMtY29udGFpbmVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5kZXZpY2VzLXNpZGViYXIge1xuICAgIGZsZXg6IDAgMCAxNTBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgcGFkZGluZy10b3A6IDE1cHg7XG59XG5cbi5kZXZpY2VzLXNpZGViYXItbGlzdCB7XG4gICAgZmxleDogbm9uZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG59XG5cbi5kZXZpY2VzLXNpZGViYXItaXRlbSB7XG4gICAgY29sb3I6ICMyMjIgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggNnB4IDZweCAxNnB4O1xuICAgIGZsZXg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLmRldmljZXMtc2lkZWJhci1pdGVtLnNlbGVjdGVkIHtcbiAgICBib3JkZXItbGVmdDogNnB4IHNvbGlkICM2NjYgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5kZXZpY2VzLXNpZGViYXItaXRlbS1zdGF0dXM6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlxcMjVjZlwiO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBjb2xvcjogcmVkO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cblxuLmRldmljZXMtc2lkZWJhci1pdGVtLmRldmljZS1jb25uZWN0ZWQgLmRldmljZXMtc2lkZWJhci1pdGVtLXN0YXR1czpiZWZvcmUge1xuICAgIGNvbG9yOiBncmVlbjtcbn1cblxuLmRldmljZXMtc2lkZWJhci1zcGFjZXIge1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5kZXZpY2VzLXZpZXctdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBtYXJnaW46IDAgMCAxNXB4IDE1cHg7XG4gICAgcGFkZGluZy10b3A6IDFweDtcbn1cblxuLnZpZXctdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uZGV2aWNlcy1mb290ZXIge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2RjZGNkO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGZsZXg6IG5vbmU7XG4gICAgcGFkZGluZzogM3B4IDEwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRldmljZXMtZm9vdGVyID4gc3BhbiB7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxuLmRpc2NvdmVyeS12aWV3IHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBwYWRkaW5nOiAxNXB4IDE1cHggMHB4IDBweDtcbn1cblxuLmRpc2NvdmVyeS12aWV3ID4gKiB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLnVzYi1jaGVja2JveCB7XG4gICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4uYWRkLXJ1bGUtYnV0dG9uIHtcbiAgICBtYXJnaW46IDEwcHggMjVweDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xufVxuXG4uZGlzY292ZXJ5LWhlbHAge1xuICAgIG1hcmdpbjogNXB4IDAgMjVweCAyNXB4O1xufVxuXG4uZGlzY292ZXJ5LWhlbHAgPiBzcGFuIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLWxpc3Qge1xuICAgIG1hcmdpbjogMTBweCAwIDAgMjVweDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5wb3J0LWZvcndhcmRpbmctbGlzdC1lbXB0eSB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLWxpc3QtaXRlbSB7XG4gICAgcGFkZGluZzogM3B4IDVweCAzcHggNXB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGZsZXg6IGF1dG8gMSAxO1xufVxuXG4ubGlzdC1pdGVtIC5wb3J0LWZvcndhcmRpbmctdmFsdWUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBjb2xvcjogIzIyMjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLXZhbHVlIHtcbiAgICBmbGV4OiAzIDEgMDtcbn1cblxuLnBvcnQtZm9yd2FyZGluZy12YWx1ZS5wb3J0LWZvcndhcmRpbmctcG9ydCB7XG4gICAgZmxleDogMSAxIDA7XG59XG5cbi5wb3J0LWxvY2FsaG9zdCB7XG4gICAgY29sb3I6ICNhYWE7XG59XG5cbi5wb3J0LWZvcndhcmRpbmctc2VwYXJhdG9yIHtcbiAgICBmbGV4OiAwIDAgMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzEsIDIzMSwgMjMxKTtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luOiAwIDRweDtcbn1cblxuLnBvcnQtZm9yd2FyZGluZy1zZXBhcmF0b3ItaW52aXNpYmxlIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5wb3J0LWZvcndhcmRpbmctZWRpdC1yb3cge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbjogNnB4IDVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLWVkaXQtcm93IGlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxuXG4ucG9ydC1mb3J3YXJkaW5nLWZvb3RlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW46IDE1cHggMCAwIDI1cHg7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbn1cblxuLnBvcnQtZm9yd2FyZGluZy1mb290ZXIgPiAqIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLmFkZC1uZXR3b3JrLXRhcmdldC1idXR0b24ge1xuICAgIG1hcmdpbjogMTBweCAyNXB4O1xuICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG59XG5cbi5uZXR3b3JrLWRpc2NvdmVyeS1saXN0IHtcbiAgICBtYXJnaW46IDEwcHggMCAwIDI1cHg7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktbGlzdC1lbXB0eSB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktbGlzdC1pdGVtIHtcbiAgICBwYWRkaW5nOiAzcHggNXB4IDNweCA1cHg7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxleDogYXV0byAxIDE7XG59XG5cbi5saXN0LWl0ZW0gLm5ldHdvcmstZGlzY292ZXJ5LXZhbHVlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgY29sb3I6ICMyMjI7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LXZhbHVlIHtcbiAgICBmbGV4OiAzIDEgMDtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LWVkaXQtcm93IHtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDZweCA1cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLm5ldHdvcmstZGlzY292ZXJ5LWVkaXQtcm93IGlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktZm9vdGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbjogMTVweCAwIDAgMjVweDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xufVxuXG4ubmV0d29yay1kaXNjb3ZlcnktZm9vdGVyID4gKiB7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxuXG4uZGV2aWNlLXZpZXcge1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgZmxleDogYXV0bztcbn1cblxuLmRldmljZS10ZXh0LXJvdyB7XG4gICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgIG1hcmdpbi1yaWdodDogMjVweDtcbn1cblxuLmRldmljZS1zZXJpYWwge1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmRldmljZS1icm93c2VyLWxpc3Qge1xuICAgIGZsZXg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xufVxuXG4uZGV2aWNlLWJyb3dzZXItbGlzdCA+IGRpdiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLmRldmljZS1icm93c2VyLXRpdGxlIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG59XG5cbi5kZXZpY2UtYnJvd3Nlci1uZXctdGFiIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW46IDEwcHggMCAwIDEwcHg7XG59XG5cbi5kZXZpY2UtYnJvd3Nlci1uZXctdGFiID4gZGl2IHtcbiAgICBmb250LXNpemU6IDEzcHg7XG59XG5cbi5kZXZpY2UtYnJvd3Nlci1uZXctdGFiID4gaW5wdXQge1xuICAgIG1hcmdpbjogMCAxMHB4O1xufVxuXG4uZGV2aWNlLXBhZ2UtbGlzdCB7XG4gICAgbWFyZ2luOiAxMHB4IDAgMCAxMHB4O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmRldmljZS1wYWdlLWxpc3QgPiBkaXYge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgcGFkZGluZzogNXB4IDA7XG59XG5cbi5kZXZpY2UtcGFnZS1saXN0Om5vdCguZGV2aWNlLXZpZXctbW9yZS10b2dnbGVkKSA+IGRpdi5kZXZpY2Utdmlldy1tb3JlLXBhZ2Uge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZXZpY2UtcGFnZS10aXRsZS1yb3cge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZGV2aWNlLXBhZ2UtdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRldmljZS1wYWdlLXRpdGxlLXJvdyAudG9vbGJhciB7XG4gICAgbWFyZ2luLWxlZnQ6IDNweDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmRldmljZS1wYWdlLXRpdGxlLXJvdyAudG9vbGJhcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDAsIDAlLCA5MCUpO1xufVxuXG4uZGV2aWNlLXBhZ2UtdXJsIHtcbiAgICBtYXJnaW46IDNweCAxMDBweCAzcHggMDtcbn1cblxuLmRldmljZS1wYWdlLXVybCBhIHtcbiAgICBjb2xvcjogIzc3NztcbiAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7XG59XG5cbi5kZXZpY2Utdmlldy1tb3JlIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgY29sb3I6IHJnYigxNywgODUsIDIwNCk7XG4gICAgbWFyZ2luOiA1cHggMCAwIDEwcHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRldmljZS12aWV3LW1vcmUuZGV2aWNlLW5lZWRzLXZpZXctbW9yZSAge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uZGV2aWNlLXBvcnQtc3RhdHVzIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgbWFyZ2luOiAxMHB4IDAgMCAxMHB4O1xufVxuXG4uZGV2aWNlLXBvcnQtc3RhdHVzLXRleHQge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbn1cblxuLmRldmljZS12aWV3LXBvcnQtaWNvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JlZW47XG4gICAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgd2lkdGg6IDEycHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMnB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5kZXZpY2Utdmlldy1wb3J0LW51bWJlciB7XG4gICAgbWFyZ2luOiAwIDEwcHggMCAycHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmRldmljZS12aWV3LXBvcnQtaWNvbi5kZXZpY2Utdmlldy1wb3J0LWljb24tZXJyb3Ige1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbn1cblxuLmRldmljZS12aWV3LXBvcnQtaWNvbi5kZXZpY2Utdmlldy1wb3J0LWljb24tdHJhbnNpZW50IHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogb3JhbmdlO1xufVxuXG4vKiMgc291cmNlVVJMPWRldmljZXMvZGV2aWNlc1ZpZXcuY3NzICovIjtEaWZmLkRpZmY9e2NoYXJEaWZmOmZ1bmN0aW9uKHRleHQxLHRleHQyLGNsZWFudXApe2NvbnN0IGRpZmZlcj1uZXcgZGlmZl9tYXRjaF9wYXRjaCgpO2NvbnN0IGRpZmY9ZGlmZmVyLmRpZmZfbWFpbih0ZXh0MSx0ZXh0Mik7aWYoY2xlYW51cCkKZGlmZmVyLmRpZmZfY2xlYW51cFNlbWFudGljKGRpZmYpO3JldHVybiBkaWZmO30sbGluZURpZmY6ZnVuY3Rpb24obGluZXMxLGxpbmVzMil7Y29uc3QgaWRNYXA9bmV3IENvbW1vbi5DaGFyYWN0ZXJJZE1hcCgpO2NvbnN0IHRleHQxPWxpbmVzMS5tYXAobGluZT0+aWRNYXAudG9DaGFyKGxpbmUpKS5qb2luKCcnKTtjb25zdCB0ZXh0Mj1saW5lczIubWFwKGxpbmU9PmlkTWFwLnRvQ2hhcihsaW5lKSkuam9pbignJyk7Y29uc3QgZGlmZj1EaWZmLkRpZmYuY2hhckRpZmYodGV4dDEsdGV4dDIpO2NvbnN0IGxpbmVEaWZmPVtdO2ZvcihsZXQgaT0wO2k8ZGlmZi5sZW5ndGg7aSsrKXtjb25zdCBsaW5lcz1bXTtmb3IobGV0IGo9MDtqPGRpZmZbaV1bMV0ubGVuZ3RoO2orKykKbGluZXMucHVzaChpZE1hcC5mcm9tQ2hhcihkaWZmW2ldWzFdW2pdKSk7bGluZURpZmYucHVzaCh7MDpkaWZmW2ldWzBdLDE6bGluZXN9KTt9CnJldHVybiBsaW5lRGlmZjt9LGNvbnZlcnRUb0VkaXREaWZmOmZ1bmN0aW9uKGRpZmYpe2NvbnN0IG5vcm1hbGl6ZWQ9W107bGV0IGFkZGVkPTA7bGV0IHJlbW92ZWQ9MDtmb3IobGV0IGk9MDtpPGRpZmYubGVuZ3RoOysraSl7Y29uc3QgdG9rZW49ZGlmZltpXTtpZih0b2tlblswXT09PURpZmYuRGlmZi5PcGVyYXRpb24uRXF1YWwpe2ZsdXNoKCk7bm9ybWFsaXplZC5wdXNoKFtEaWZmLkRpZmYuT3BlcmF0aW9uLkVxdWFsLHRva2VuWzFdLmxlbmd0aF0pO31lbHNlIGlmKHRva2VuWzBdPT09RGlmZi5EaWZmLk9wZXJhdGlvbi5EZWxldGUpe3JlbW92ZWQrPXRva2VuWzFdLmxlbmd0aDt9ZWxzZXthZGRlZCs9dG9rZW5bMV0ubGVuZ3RoO319CmZsdXNoKCk7cmV0dXJuIG5vcm1hbGl6ZWQ7ZnVuY3Rpb24gZmx1c2goKXtpZihhZGRlZCYmcmVtb3ZlZCl7Y29uc3QgbWluPU1hdGgubWluKGFkZGVkLHJlbW92ZWQpO25vcm1hbGl6ZWQucHVzaChbRGlmZi5EaWZmLk9wZXJhdGlvbi5FZGl0LG1pbl0pO2FkZGVkLT1taW47cmVtb3ZlZC09bWluO30KaWYoYWRkZWR8fHJlbW92ZWQpe2NvbnN0IGJhbGFuY2U9YWRkZWQtcmVtb3ZlZDtjb25zdCB0eXBlPWJhbGFuY2U8MD9EaWZmLkRpZmYuT3BlcmF0aW9uLkRlbGV0ZTpEaWZmLkRpZmYuT3BlcmF0aW9uLkluc2VydDtub3JtYWxpemVkLnB1c2goW3R5cGUsTWF0aC5hYnMoYmFsYW5jZSldKTthZGRlZD0wO3JlbW92ZWQ9MDt9fX19O0RpZmYuRGlmZi5PcGVyYXRpb249e0VxdWFsOjAsSW5zZXJ0OjEsRGVsZXRlOi0xLEVkaXQ6Mn07RGlmZi5EaWZmLkRpZmZBcnJheTs7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGlmZl9tYXRjaF9wYXRjaCgpe3RoaXMuRGlmZl9UaW1lb3V0PTE7dGhpcy5EaWZmX0VkaXRDb3N0PTQ7dGhpcy5NYXRjaF9UaHJlc2hvbGQ9MC41O3RoaXMuTWF0Y2hfRGlzdGFuY2U9MUUzO3RoaXMuUGF0Y2hfRGVsZXRlVGhyZXNob2xkPTAuNTt0aGlzLlBhdGNoX01hcmdpbj00O3RoaXMuTWF0Y2hfTWF4Qml0cz0zMn0KZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9tYWluPWZ1bmN0aW9uKGEsYixjLGQpeyJ1bmRlZmluZWQiPT10eXBlb2YgZCYmKGQ9MD49dGhpcy5EaWZmX1RpbWVvdXQ/TnVtYmVyLk1BWF9WQUxVRToobmV3IERhdGUpLmdldFRpbWUoKSsxRTMqdGhpcy5EaWZmX1RpbWVvdXQpO2lmKG51bGw9PWF8fG51bGw9PWIpdGhyb3cgRXJyb3IoIk51bGwgaW5wdXQuIChkaWZmX21haW4pIik7aWYoYT09YilyZXR1cm4gYT9bWzAsYV1dOltdOyJ1bmRlZmluZWQiPT10eXBlb2YgYyYmKGM9ITApO3ZhciBlPWMsZj10aGlzLmRpZmZfY29tbW9uUHJlZml4KGEsYik7Yz1hLnN1YnN0cmluZygwLGYpO2E9YS5zdWJzdHJpbmcoZik7Yj1iLnN1YnN0cmluZyhmKTt2YXIgZj10aGlzLmRpZmZfY29tbW9uU3VmZml4KGEsYiksZz1hLnN1YnN0cmluZyhhLmxlbmd0aC1mKTthPWEuc3Vic3RyaW5nKDAsYS5sZW5ndGgtZik7Yj1iLnN1YnN0cmluZygwLGIubGVuZ3RoLWYpO2E9dGhpcy5kaWZmX2NvbXB1dGVfKGEsYixlLGQpO2MmJmEudW5zaGlmdChbMCxjXSk7ZyYmYS5wdXNoKFswLGddKTt0aGlzLmRpZmZfY2xlYW51cE1lcmdlKGEpO3JldHVybiBhfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbXB1dGVfPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFhKXJldHVybltbMSxiXV07aWYoIWIpcmV0dXJuW1stMSxhXV07dmFyIGU9YS5sZW5ndGg+Yi5sZW5ndGg/YTpiLGY9YS5sZW5ndGg+Yi5sZW5ndGg/YjphLGc9ZS5pbmRleE9mKGYpO3JldHVybi0xIT1nPyhjPVtbMSxlLnN1YnN0cmluZygwLGcpXSxbMCxmXSxbMSxlLnN1YnN0cmluZyhnK2YubGVuZ3RoKV1dLGEubGVuZ3RoPmIubGVuZ3RoJiYoY1swXVswXT1jWzJdWzBdPS0xKSxjKToxPT1mLmxlbmd0aD9bWy0xLGFdLFsxLGJdXTooZT10aGlzLmRpZmZfaGFsZk1hdGNoXyhhLGIpKT8oZj1lWzBdLGE9ZVsxXSxnPWVbMl0sYj1lWzNdLGU9ZVs0XSxmPXRoaXMuZGlmZl9tYWluKGYsZyxjLGQpLGM9dGhpcy5kaWZmX21haW4oYSxiLGMsZCksZi5jb25jYXQoW1swLGVdXSxjKSk6YyYmMTAwPGEubGVuZ3RoJiYxMDA8Yi5sZW5ndGg/dGhpcy5kaWZmX2xpbmVNb2RlXyhhLGIsZCk6dGhpcy5kaWZmX2Jpc2VjdF8oYSxiLGQpfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2xpbmVNb2RlXz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5kaWZmX2xpbmVzVG9DaGFyc18oYSxiKTthPWQuY2hhcnMxO2I9ZC5jaGFyczI7ZD1kLmxpbmVBcnJheTthPXRoaXMuZGlmZl9tYWluKGEsYiwhMSxjKTt0aGlzLmRpZmZfY2hhcnNUb0xpbmVzXyhhLGQpO3RoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWMoYSk7YS5wdXNoKFswLCIiXSk7Zm9yKHZhciBlPWQ9Yj0wLGY9IiIsZz0iIjtiPGEubGVuZ3RoOyl7c3dpdGNoKGFbYl1bMF0pe2Nhc2UgMTplKys7Zys9YVtiXVsxXTticmVhaztjYXNlLTE6ZCsrO2YrPWFbYl1bMV07YnJlYWs7Y2FzZSAwOmlmKDE8PWQmJjE8PWUpe2Euc3BsaWNlKGItZC1lLGQrZSk7Yj1iLWQtZTtkPXRoaXMuZGlmZl9tYWluKGYsZywhMSxjKTtmb3IoZT1kLmxlbmd0aC0xOzA8PWU7ZS0tKWEuc3BsaWNlKGIsMCxkW2VdKTtiKz1kLmxlbmd0aH1kPWU9MDtnPWY9IiJ9YisrfWEucG9wKCk7cmV0dXJuIGF9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0Xz1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWEubGVuZ3RoLGU9Yi5sZW5ndGgsZj1NYXRoLmNlaWwoKGQrZSkvMiksZz1mLGg9MipmLGo9QXJyYXkoaCksaT1BcnJheShoKSxrPTA7azxoO2srKylqW2tdPS0xLGlba109LTE7altnKzFdPTA7aVtnKzFdPTA7Zm9yKHZhciBrPWQtZSxxPTAhPWslMixyPTAsdD0wLHA9MCx3PTAsdj0wO3Y8ZiYmISgobmV3IERhdGUpLmdldFRpbWUoKT5jKTt2Kyspe2Zvcih2YXIgbj0tdityO248PXYtdDtuKz0yKXt2YXIgbD1nK24sbTttPW49PS12fHxuIT12JiZqW2wtMV08altsKzFdP2pbbCsxXTpqW2wtMV0rMTtmb3IodmFyIHM9bS1uO208ZCYmczxlJiZhLmNoYXJBdChtKT09Yi5jaGFyQXQocyk7KW0rKyxzKys7altsXT1tO2lmKG0+ZCl0Kz0yO2Vsc2UgaWYocz5lKXIrPTI7ZWxzZSBpZihxJiYobD1nK2stbiwwPD1sJiZsPGgmJi0xIT1pW2xdKSl7dmFyIHU9ZC1pW2xdO2lmKG0+PXUpcmV0dXJuIHRoaXMuZGlmZl9iaXNlY3RTcGxpdF8oYSxiLG0scyxjKX19Zm9yKG49LXYrcDtuPD12LXc7bis9Mil7bD1nK247dT1uPT0tdnx8biE9diYmaVtsLTFdPGlbbCsxXT9pW2wrMV06aVtsLTFdKzE7Zm9yKG09dS1uO3U8ZCYmbTxlJiZhLmNoYXJBdChkLXUtMSk9PWIuY2hhckF0KGUtbS0xKTspdSsrLG0rKztpW2xdPXU7aWYodT5kKXcrPTI7ZWxzZSBpZihtPmUpcCs9MjtlbHNlIGlmKCFxJiYobD1nK2stbiwwPD1sJiYobDxoJiYtMSE9altsXSkmJihtPWpbbF0scz1nK20tbCx1PWQtdSxtPj11KSkpcmV0dXJuIHRoaXMuZGlmZl9iaXNlY3RTcGxpdF8oYSxiLG0scyxjKX19cmV0dXJuW1stMSxhXSxbMSxiXV19O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0U3BsaXRfPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5zdWJzdHJpbmcoMCxjKSxnPWIuc3Vic3RyaW5nKDAsZCk7YT1hLnN1YnN0cmluZyhjKTtiPWIuc3Vic3RyaW5nKGQpO2Y9dGhpcy5kaWZmX21haW4oZixnLCExLGUpO2U9dGhpcy5kaWZmX21haW4oYSxiLCExLGUpO3JldHVybiBmLmNvbmNhdChlKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9saW5lc1RvQ2hhcnNfPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtmb3IodmFyIGI9IiIsYz0wLGY9LTEsZz1kLmxlbmd0aDtmPGEubGVuZ3RoLTE7KXtmPWEuaW5kZXhPZigiXG4iLGMpOy0xPT1mJiYoZj1hLmxlbmd0aC0xKTt2YXIgcj1hLnN1YnN0cmluZyhjLGYrMSksYz1mKzE7KGUuaGFzT3duUHJvcGVydHk/ZS5oYXNPd25Qcm9wZXJ0eShyKTp2b2lkIDAhPT1lW3JdKT9iKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pOihiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGcpLGVbcl09ZyxkW2crK109cil9cmV0dXJuIGJ9dmFyIGQ9W10sZT17fTtkWzBdPSIiO3ZhciBmPWMoYSksZz1jKGIpO3JldHVybntjaGFyczE6ZixjaGFyczI6ZyxsaW5lQXJyYXk6ZH19O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY2hhcnNUb0xpbmVzXz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXtmb3IodmFyIGQ9YVtjXVsxXSxlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyllW2ZdPWJbZC5jaGFyQ29kZUF0KGYpXTthW2NdWzFdPWUuam9pbigiIil9fTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbW1vblByZWZpeD1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYnx8YS5jaGFyQXQoMCkhPWIuY2hhckF0KDApKXJldHVybiAwO2Zvcih2YXIgYz0wLGQ9TWF0aC5taW4oYS5sZW5ndGgsYi5sZW5ndGgpLGU9ZCxmPTA7YzxlOylhLnN1YnN0cmluZyhmLGUpPT1iLnN1YnN0cmluZyhmLGUpP2Y9Yz1lOmQ9ZSxlPU1hdGguZmxvb3IoKGQtYykvMitjKTtyZXR1cm4gZX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9jb21tb25TdWZmaXg9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT1iLmNoYXJBdChiLmxlbmd0aC0xKSlyZXR1cm4gMDtmb3IodmFyIGM9MCxkPU1hdGgubWluKGEubGVuZ3RoLGIubGVuZ3RoKSxlPWQsZj0wO2M8ZTspYS5zdWJzdHJpbmcoYS5sZW5ndGgtZSxhLmxlbmd0aC1mKT09Yi5zdWJzdHJpbmcoYi5sZW5ndGgtZSxiLmxlbmd0aC1mKT9mPWM9ZTpkPWUsZT1NYXRoLmZsb29yKChkLWMpLzIrYyk7cmV0dXJuIGV9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY29tbW9uT3ZlcmxhcF89ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPWIubGVuZ3RoO2lmKDA9PWN8fDA9PWQpcmV0dXJuIDA7Yz5kP2E9YS5zdWJzdHJpbmcoYy1kKTpjPGQmJihiPWIuc3Vic3RyaW5nKDAsYykpO2M9TWF0aC5taW4oYyxkKTtpZihhPT1iKXJldHVybiBjO2Zvcih2YXIgZD0wLGU9MTs7KXt2YXIgZj1hLnN1YnN0cmluZyhjLWUpLGY9Yi5pbmRleE9mKGYpO2lmKC0xPT1mKXJldHVybiBkO2UrPWY7aWYoMD09Znx8YS5zdWJzdHJpbmcoYy1lKT09Yi5zdWJzdHJpbmcoMCxlKSlkPWUsZSsrfX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9oYWxmTWF0Y2hfPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIsYyl7Zm9yKHZhciBkPWEuc3Vic3RyaW5nKGMsYytNYXRoLmZsb29yKGEubGVuZ3RoLzQpKSxlPS0xLGc9IiIsaCxqLG4sbDstMSE9KGU9Yi5pbmRleE9mKGQsZSsxKSk7KXt2YXIgbT1mLmRpZmZfY29tbW9uUHJlZml4KGEuc3Vic3RyaW5nKGMpLGIuc3Vic3RyaW5nKGUpKSxzPWYuZGlmZl9jb21tb25TdWZmaXgoYS5zdWJzdHJpbmcoMCxjKSxiLnN1YnN0cmluZygwLGUpKTtnLmxlbmd0aDxzK20mJihnPWIuc3Vic3RyaW5nKGUtcyxlKStiLnN1YnN0cmluZyhlLGUrbSksaD1hLnN1YnN0cmluZygwLGMtcyksaj1hLnN1YnN0cmluZyhjK20pLG49Yi5zdWJzdHJpbmcoMCxlLXMpLGw9Yi5zdWJzdHJpbmcoZSttKSl9cmV0dXJuIDIqZy5sZW5ndGg+PWEubGVuZ3RoP1toLGosbixsLGddOm51bGx9aWYoMD49dGhpcy5EaWZmX1RpbWVvdXQpcmV0dXJuIG51bGw7dmFyIGQ9YS5sZW5ndGg+Yi5sZW5ndGg/YTpiLGU9YS5sZW5ndGg+Yi5sZW5ndGg/YjphO2lmKDQ+ZC5sZW5ndGh8fDIqZS5sZW5ndGg8ZC5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGY9dGhpcyxnPWMoZCxlLE1hdGguY2VpbChkLmxlbmd0aC80KSksZD1jKGQsZSxNYXRoLmNlaWwoZC5sZW5ndGgvMikpLGg7aWYoIWcmJiFkKXJldHVybiBudWxsO2g9ZD9nP2dbNF0ubGVuZ3RoPmRbNF0ubGVuZ3RoP2c6ZDpkOmc7dmFyIGo7YS5sZW5ndGg+Yi5sZW5ndGg/KGc9aFswXSxkPWhbMV0sZT1oWzJdLGo9aFszXSk6KGU9aFswXSxqPWhbMV0sZz1oWzJdLGQ9aFszXSk7aD1oWzRdO3JldHVybltnLGQsZSxqLGhdfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpYz1mdW5jdGlvbihhKXtmb3IodmFyIGI9ITEsYz1bXSxkPTAsZT1udWxsLGY9MCxnPTAsaD0wLGo9MCxpPTA7ZjxhLmxlbmd0aDspMD09YVtmXVswXT8oY1tkKytdPWYsZz1qLGg9aSxpPWo9MCxlPWFbZl1bMV0pOigxPT1hW2ZdWzBdP2orPWFbZl1bMV0ubGVuZ3RoOmkrPWFbZl1bMV0ubGVuZ3RoLGUmJihlLmxlbmd0aDw9TWF0aC5tYXgoZyxoKSYmZS5sZW5ndGg8PU1hdGgubWF4KGosaSkpJiYoYS5zcGxpY2UoY1tkLTFdLDAsWy0xLGVdKSxhW2NbZC0xXSsxXVswXT0xLGQtLSxkLS0sZj0wPGQ/Y1tkLTFdOi0xLGk9aj1oPWc9MCxlPW51bGwsYj0hMCkpLGYrKztiJiZ0aGlzLmRpZmZfY2xlYW51cE1lcmdlKGEpO3RoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyhhKTtmb3IoZj0xO2Y8YS5sZW5ndGg7KXtpZigtMT09YVtmLTFdWzBdJiYxPT1hW2ZdWzBdKXtiPWFbZi0xXVsxXTtjPWFbZl1bMV07ZD10aGlzLmRpZmZfY29tbW9uT3ZlcmxhcF8oYixjKTtlPXRoaXMuZGlmZl9jb21tb25PdmVybGFwXyhjLGIpO2lmKGQ+PWUpe2lmKGQ+PWIubGVuZ3RoLzJ8fGQ+PWMubGVuZ3RoLzIpYS5zcGxpY2UoZiwwLFswLGMuc3Vic3RyaW5nKDAsZCldKSxhW2YtMV1bMV09Yi5zdWJzdHJpbmcoMCxiLmxlbmd0aC1kKSxhW2YrMV1bMV09Yy5zdWJzdHJpbmcoZCksZisrfWVsc2UgaWYoZT49Yi5sZW5ndGgvMnx8ZT49Yy5sZW5ndGgvMilhLnNwbGljZShmLDAsWzAsYi5zdWJzdHJpbmcoMCxlKV0pLGFbZi0xXVswXT0xLGFbZi0xXVsxXT1jLnN1YnN0cmluZygwLGMubGVuZ3RoLWUpLGFbZisxXVswXT0tMSxhW2YrMV1bMV09Yi5zdWJzdHJpbmcoZSksZisrO2YrK31mKyt9fTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpY0xvc3NsZXNzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXtpZighYXx8IWIpcmV0dXJuIDY7dmFyIGM9YS5jaGFyQXQoYS5sZW5ndGgtMSksZD1iLmNoYXJBdCgwKSxlPWMubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8pLGY9ZC5tYXRjaChkaWZmX21hdGNoX3BhdGNoLm5vbkFscGhhTnVtZXJpY1JlZ2V4XyksZz1lJiZjLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4XyksaD1mJiZkLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4XyksYz1nJiZjLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2gubGluZWJyZWFrUmVnZXhfKSxkPWgmJmQubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5saW5lYnJlYWtSZWdleF8pLGk9YyYmYS5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZUVuZFJlZ2V4Xyksaj1kJiZiLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2guYmxhbmtsaW5lU3RhcnRSZWdleF8pO3JldHVybiBpfHxqPzU6Y3x8ZD80OmUmJiFnJiZoPzM6Z3x8aD8yOmV8fGY/MTowfWZvcih2YXIgYz0xO2M8YS5sZW5ndGgtMTspe2lmKDA9PWFbYy0xXVswXSYmMD09YVtjKzFdWzBdKXt2YXIgZD1hW2MtMV1bMV0sZT1hW2NdWzFdLGY9YVtjKzFdWzFdLGc9dGhpcy5kaWZmX2NvbW1vblN1ZmZpeChkLGUpO2lmKGcpdmFyIGg9ZS5zdWJzdHJpbmcoZS5sZW5ndGgtZyksZD1kLnN1YnN0cmluZygwLGQubGVuZ3RoLWcpLGU9aCtlLnN1YnN0cmluZygwLGUubGVuZ3RoLWcpLGY9aCtmO2Zvcih2YXIgZz1kLGg9ZSxqPWYsaT1iKGQsZSkrYihlLGYpO2UuY2hhckF0KDApPT09Zi5jaGFyQXQoMCk7KXt2YXIgZD1kK2UuY2hhckF0KDApLGU9ZS5zdWJzdHJpbmcoMSkrZi5jaGFyQXQoMCksZj1mLnN1YnN0cmluZygxKSxrPWIoZCxlKStiKGUsZik7az49aSYmKGk9ayxnPWQsaD1lLGo9Zil9YVtjLTFdWzFdIT1nJiYoZz9hW2MtMV1bMV09ZzooYS5zcGxpY2UoYy0xLDEpLGMtLSksYVtjXVsxXT1oLGo/YVtjKzFdWzFdPWo6KGEuc3BsaWNlKGMrMSwxKSxjLS0pKX1jKyt9fTtkaWZmX21hdGNoX3BhdGNoLm5vbkFscGhhTnVtZXJpY1JlZ2V4Xz0vW15hLXpBLVowLTldLztkaWZmX21hdGNoX3BhdGNoLndoaXRlc3BhY2VSZWdleF89L1xzLztkaWZmX21hdGNoX3BhdGNoLmxpbmVicmVha1JlZ2V4Xz0vW1xyXG5dLztkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZUVuZFJlZ2V4Xz0vXG5ccj9cbiQvO2RpZmZfbWF0Y2hfcGF0Y2guYmxhbmtsaW5lU3RhcnRSZWdleF89L15ccj9cblxyP1xuLztkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBFZmZpY2llbmN5PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMSxjPVtdLGQ9MCxlPW51bGwsZj0wLGc9ITEsaD0hMSxqPSExLGk9ITE7ZjxhLmxlbmd0aDspe2lmKDA9PWFbZl1bMF0pYVtmXVsxXS5sZW5ndGg8dGhpcy5EaWZmX0VkaXRDb3N0JiYoanx8aSk/KGNbZCsrXT1mLGc9aixoPWksZT1hW2ZdWzFdKTooZD0wLGU9bnVsbCksaj1pPSExO2Vsc2UgaWYoLTE9PWFbZl1bMF0/aT0hMDpqPSEwLGUmJihnJiZoJiZqJiZpfHxlLmxlbmd0aDx0aGlzLkRpZmZfRWRpdENvc3QvMiYmMz09ZytoK2oraSkpYS5zcGxpY2UoY1tkLTFdLDAsWy0xLGVdKSxhW2NbZC0xXSsxXVswXT0xLGQtLSxlPW51bGwsZyYmaD8oaj1pPSEwLGQ9MCk6KGQtLSxmPTA8ZD9jW2QtMV06LTEsaj1pPSExKSxiPSEwO2YrK31iJiZ0aGlzLmRpZmZfY2xlYW51cE1lcmdlKGEpfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBNZXJnZT1mdW5jdGlvbihhKXthLnB1c2goWzAsIiJdKTtmb3IodmFyIGI9MCxjPTAsZD0wLGU9IiIsZj0iIixnO2I8YS5sZW5ndGg7KXN3aXRjaChhW2JdWzBdKXtjYXNlIDE6ZCsrO2YrPWFbYl1bMV07YisrO2JyZWFrO2Nhc2UtMTpjKys7ZSs9YVtiXVsxXTtiKys7YnJlYWs7Y2FzZSAwOjE8YytkPygwIT09YyYmMCE9PWQmJihnPXRoaXMuZGlmZl9jb21tb25QcmVmaXgoZixlKSwwIT09ZyYmKDA8Yi1jLWQmJjA9PWFbYi1jLWQtMV1bMF0/YVtiLWMtZC0xXVsxXSs9Zi5zdWJzdHJpbmcoMCxnKTooYS5zcGxpY2UoMCwwLFswLGYuc3Vic3RyaW5nKDAsZyldKSxiKyspLGY9Zi5zdWJzdHJpbmcoZyksZT1lLnN1YnN0cmluZyhnKSksZz10aGlzLmRpZmZfY29tbW9uU3VmZml4KGYsZSksMCE9PWcmJihhW2JdWzFdPWYuc3Vic3RyaW5nKGYubGVuZ3RoLWcpK2FbYl1bMV0sZj1mLnN1YnN0cmluZygwLGYubGVuZ3RoLQpnKSxlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtZykpKSwwPT09Yz9hLnNwbGljZShiLWQsYytkLFsxLGZdKTowPT09ZD9hLnNwbGljZShiLWMsYytkLFstMSxlXSk6YS5zcGxpY2UoYi1jLWQsYytkLFstMSxlXSxbMSxmXSksYj1iLWMtZCsoYz8xOjApKyhkPzE6MCkrMSk6MCE9PWImJjA9PWFbYi0xXVswXT8oYVtiLTFdWzFdKz1hW2JdWzFdLGEuc3BsaWNlKGIsMSkpOmIrKyxjPWQ9MCxmPWU9IiJ9IiI9PT1hW2EubGVuZ3RoLTFdWzFdJiZhLnBvcCgpO2M9ITE7Zm9yKGI9MTtiPGEubGVuZ3RoLTE7KTA9PWFbYi0xXVswXSYmMD09YVtiKzFdWzBdJiYoYVtiXVsxXS5zdWJzdHJpbmcoYVtiXVsxXS5sZW5ndGgtYVtiLTFdWzFdLmxlbmd0aCk9PWFbYi0xXVsxXT8oYVtiXVsxXT1hW2ItMV1bMV0rYVtiXVsxXS5zdWJzdHJpbmcoMCxhW2JdWzFdLmxlbmd0aC1hW2ItMV1bMV0ubGVuZ3RoKSxhW2IrMV1bMV09YVtiLTFdWzFdK2FbYisxXVsxXSxhLnNwbGljZShiLTEsMSksYz0hMCk6YVtiXVsxXS5zdWJzdHJpbmcoMCxhW2IrMV1bMV0ubGVuZ3RoKT09YVtiKzFdWzFdJiYoYVtiLTFdWzFdKz1hW2IrMV1bMV0sYVtiXVsxXT1hW2JdWzFdLnN1YnN0cmluZyhhW2IrMV1bMV0ubGVuZ3RoKSthW2IrMV1bMV0sYS5zcGxpY2UoYisxLDEpLGM9ITApKSxiKys7YyYmdGhpcy5kaWZmX2NsZWFudXBNZXJnZShhKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl94SW5kZXg9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9MCxlPTAsZj0wLGc7Zm9yKGc9MDtnPGEubGVuZ3RoO2crKyl7MSE9PWFbZ11bMF0mJihjKz1hW2ddWzFdLmxlbmd0aCk7LTEhPT1hW2ddWzBdJiYoZCs9YVtnXVsxXS5sZW5ndGgpO2lmKGM+YilicmVhaztlPWM7Zj1kfXJldHVybiBhLmxlbmd0aCE9ZyYmLTE9PT1hW2ddWzBdP2Y6ZisoYi1lKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9wcmV0dHlIdG1sPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPS8mL2csZD0vPC9nLGU9Lz4vZyxmPS9cbi9nLGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIGg9YVtnXVswXSxqPWFbZ11bMV0saj1qLnJlcGxhY2UoYywiJmFtcDsiKS5yZXBsYWNlKGQsIiZsdDsiKS5yZXBsYWNlKGUsIiZndDsiKS5yZXBsYWNlKGYsIiZwYXJhOzxicj4iKTtzd2l0Y2goaCl7Y2FzZSAxOmJbZ109JzxpbnMgc3R5bGU9ImJhY2tncm91bmQ6I2U2ZmZlNjsiPicraisiPC9pbnM+IjticmVhaztjYXNlLTE6YltnXT0nPGRlbCBzdHlsZT0iYmFja2dyb3VuZDojZmZlNmU2OyI+JytqKyI8L2RlbD4iO2JyZWFrO2Nhc2UgMDpiW2ddPSI8c3Bhbj4iK2orIjwvc3Bhbj4ifX1yZXR1cm4gYi5qb2luKCIiKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl90ZXh0MT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKTEhPT1hW2NdWzBdJiYoYltjXT1hW2NdWzFdKTtyZXR1cm4gYi5qb2luKCIiKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl90ZXh0Mj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKS0xIT09YVtjXVswXSYmKGJbY109YVtjXVsxXSk7cmV0dXJuIGIuam9pbigiIil9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfbGV2ZW5zaHRlaW49ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGQ9MCxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBmPWFbZV1bMF0sZz1hW2VdWzFdO3N3aXRjaChmKXtjYXNlIDE6Yys9Zy5sZW5ndGg7YnJlYWs7Y2FzZS0xOmQrPWcubGVuZ3RoO2JyZWFrO2Nhc2UgMDpiKz1NYXRoLm1heChjLGQpLGQ9Yz0wfX1yZXR1cm4gYis9TWF0aC5tYXgoYyxkKX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl90b0RlbHRhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspc3dpdGNoKGFbY11bMF0pe2Nhc2UgMTpiW2NdPSIrIitlbmNvZGVVUkkoYVtjXVsxXSk7YnJlYWs7Y2FzZS0xOmJbY109Ii0iK2FbY11bMV0ubGVuZ3RoO2JyZWFrO2Nhc2UgMDpiW2NdPSI9IithW2NdWzFdLmxlbmd0aH1yZXR1cm4gYi5qb2luKCJcdCIpLnJlcGxhY2UoLyUyMC9nLCIgIil9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfZnJvbURlbHRhPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MCxlPTAsZj1iLnNwbGl0KC9cdC9nKSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPWZbZ10uc3Vic3RyaW5nKDEpO3N3aXRjaChmW2ddLmNoYXJBdCgwKSl7Y2FzZSIrIjp0cnl7Y1tkKytdPVsxLGRlY29kZVVSSShoKV19Y2F0Y2goail7dGhyb3cgRXJyb3IoIklsbGVnYWwgZXNjYXBlIGluIGRpZmZfZnJvbURlbHRhOiAiK2gpO31icmVhaztjYXNlIi0iOmNhc2UiPSI6dmFyIGk9cGFyc2VJbnQoaCwxMCk7aWYoaXNOYU4oaSl8fDA+aSl0aHJvdyBFcnJvcigiSW52YWxpZCBudW1iZXIgaW4gZGlmZl9mcm9tRGVsdGE6ICIraCk7aD1hLnN1YnN0cmluZyhlLGUrPWkpOyI9Ij09ZltnXS5jaGFyQXQoMCk/Y1tkKytdPVswLGhdOmNbZCsrXT1bLTEsaF07YnJlYWs7ZGVmYXVsdDppZihmW2ddKXRocm93IEVycm9yKCJJbnZhbGlkIGRpZmYgb3BlcmF0aW9uIGluIGRpZmZfZnJvbURlbHRhOiAiKwpmW2ddKTt9fWlmKGUhPWEubGVuZ3RoKXRocm93IEVycm9yKCJEZWx0YSBsZW5ndGggKCIrZSsiKSBkb2VzIG5vdCBlcXVhbCBzb3VyY2UgdGV4dCBsZW5ndGggKCIrYS5sZW5ndGgrIikuIik7cmV0dXJuIGN9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLm1hdGNoX21haW49ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PWF8fG51bGw9PWJ8fG51bGw9PWMpdGhyb3cgRXJyb3IoIk51bGwgaW5wdXQuIChtYXRjaF9tYWluKSIpO2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjLGEubGVuZ3RoKSk7cmV0dXJuIGE9PWI/MDphLmxlbmd0aD9hLnN1YnN0cmluZyhjLGMrYi5sZW5ndGgpPT1iP2M6dGhpcy5tYXRjaF9iaXRhcF8oYSxiLGMpOi0xfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5tYXRjaF9iaXRhcF89ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSxkKXt2YXIgZT1hL2IubGVuZ3RoLGc9TWF0aC5hYnMoYy1kKTtyZXR1cm4hZi5NYXRjaF9EaXN0YW5jZT9nPzE6ZTplK2cvZi5NYXRjaF9EaXN0YW5jZX1pZihiLmxlbmd0aD50aGlzLk1hdGNoX01heEJpdHMpdGhyb3cgRXJyb3IoIlBhdHRlcm4gdG9vIGxvbmcgZm9yIHRoaXMgYnJvd3Nlci4iKTt2YXIgZT10aGlzLm1hdGNoX2FscGhhYmV0XyhiKSxmPXRoaXMsZz10aGlzLk1hdGNoX1RocmVzaG9sZCxoPWEuaW5kZXhPZihiLGMpOy0xIT1oJiYoZz1NYXRoLm1pbihkKDAsaCksZyksaD1hLmxhc3RJbmRleE9mKGIsYytiLmxlbmd0aCksLTEhPWgmJihnPU1hdGgubWluKGQoMCxoKSxnKSkpO2Zvcih2YXIgaj0xPDxiLmxlbmd0aC0xLGg9LTEsaSxrLHE9Yi5sZW5ndGgrYS5sZW5ndGgscix0PTA7dDxiLmxlbmd0aDt0Kyspe2k9MDtmb3Ioaz1xO2k8azspZCh0LGMrCmspPD1nP2k9azpxPWssaz1NYXRoLmZsb29yKChxLWkpLzIraSk7cT1rO2k9TWF0aC5tYXgoMSxjLWsrMSk7dmFyIHA9TWF0aC5taW4oYytrLGEubGVuZ3RoKStiLmxlbmd0aDtrPUFycmF5KHArMik7Zm9yKGtbcCsxXT0oMTw8dCktMTtwPj1pO3AtLSl7dmFyIHc9ZVthLmNoYXJBdChwLTEpXTtrW3BdPTA9PT10PyhrW3ArMV08PDF8MSkmdzooa1twKzFdPDwxfDEpJnd8KChyW3ArMV18cltwXSk8PDF8MSl8cltwKzFdO2lmKGtbcF0maiYmKHc9ZCh0LHAtMSksdzw9ZykpaWYoZz13LGg9cC0xLGg+YylpPU1hdGgubWF4KDEsMipjLWgpO2Vsc2UgYnJlYWt9aWYoZCh0KzEsYyk+ZylicmVhaztyPWt9cmV0dXJuIGh9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLm1hdGNoX2FscGhhYmV0Xz1mdW5jdGlvbihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYS5jaGFyQXQoYyldPTA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliW2EuY2hhckF0KGMpXXw9MTw8YS5sZW5ndGgtYy0xO3JldHVybiBifTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hZGRDb250ZXh0Xz1mdW5jdGlvbihhLGIpe2lmKDAhPWIubGVuZ3RoKXtmb3IodmFyIGM9Yi5zdWJzdHJpbmcoYS5zdGFydDIsYS5zdGFydDIrYS5sZW5ndGgxKSxkPTA7Yi5pbmRleE9mKGMpIT1iLmxhc3RJbmRleE9mKGMpJiZjLmxlbmd0aDx0aGlzLk1hdGNoX01heEJpdHMtdGhpcy5QYXRjaF9NYXJnaW4tdGhpcy5QYXRjaF9NYXJnaW47KWQrPXRoaXMuUGF0Y2hfTWFyZ2luLGM9Yi5zdWJzdHJpbmcoYS5zdGFydDItZCxhLnN0YXJ0MithLmxlbmd0aDErZCk7ZCs9dGhpcy5QYXRjaF9NYXJnaW47KGM9Yi5zdWJzdHJpbmcoYS5zdGFydDItZCxhLnN0YXJ0MikpJiZhLmRpZmZzLnVuc2hpZnQoWzAsY10pOyhkPWIuc3Vic3RyaW5nKGEuc3RhcnQyK2EubGVuZ3RoMSxhLnN0YXJ0MithLmxlbmd0aDErZCkpJiZhLmRpZmZzLnB1c2goWzAsZF0pO2Euc3RhcnQxLT1jLmxlbmd0aDthLnN0YXJ0Mi09Yy5sZW5ndGg7YS5sZW5ndGgxKz1jLmxlbmd0aCtkLmxlbmd0aDthLmxlbmd0aDIrPWMubGVuZ3RoK2QubGVuZ3RofX07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfbWFrZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYic3RyaW5nIj09dHlwZW9mIGImJiJ1bmRlZmluZWQiPT10eXBlb2YgYylkPWEsYj10aGlzLmRpZmZfbWFpbihkLGIsITApLDI8Yi5sZW5ndGgmJih0aGlzLmRpZmZfY2xlYW51cFNlbWFudGljKGIpLHRoaXMuZGlmZl9jbGVhbnVwRWZmaWNpZW5jeShiKSk7ZWxzZSBpZihhJiYib2JqZWN0Ij09dHlwZW9mIGEmJiJ1bmRlZmluZWQiPT10eXBlb2YgYiYmInVuZGVmaW5lZCI9PXR5cGVvZiBjKWI9YSxkPXRoaXMuZGlmZl90ZXh0MShiKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYSYmYiYmIm9iamVjdCI9PXR5cGVvZiBiJiYidW5kZWZpbmVkIj09dHlwZW9mIGMpZD1hO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBhJiYic3RyaW5nIj09dHlwZW9mIGImJmMmJiJvYmplY3QiPT10eXBlb2YgYylkPWEsYj1jO2Vsc2UgdGhyb3cgRXJyb3IoIlVua25vd24gY2FsbCBmb3JtYXQgdG8gcGF0Y2hfbWFrZS4iKTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuW107Yz1bXTthPW5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iajtmb3IodmFyIGU9MCxmPTAsZz0wLGg9ZCxqPTA7ajxiLmxlbmd0aDtqKyspe3ZhciBpPWJbal1bMF0saz1iW2pdWzFdOyFlJiYwIT09aSYmKGEuc3RhcnQxPWYsYS5zdGFydDI9Zyk7c3dpdGNoKGkpe2Nhc2UgMTphLmRpZmZzW2UrK109YltqXTthLmxlbmd0aDIrPWsubGVuZ3RoO2Q9ZC5zdWJzdHJpbmcoMCxnKStrK2Quc3Vic3RyaW5nKGcpO2JyZWFrO2Nhc2UtMTphLmxlbmd0aDErPWsubGVuZ3RoO2EuZGlmZnNbZSsrXT1iW2pdO2Q9ZC5zdWJzdHJpbmcoMCxnKStkLnN1YnN0cmluZyhnK2subGVuZ3RoKTticmVhaztjYXNlIDA6ay5sZW5ndGg8PTIqdGhpcy5QYXRjaF9NYXJnaW4mJmUmJmIubGVuZ3RoIT1qKzE/KGEuZGlmZnNbZSsrXT1iW2pdLGEubGVuZ3RoMSs9ay5sZW5ndGgsYS5sZW5ndGgyKz1rLmxlbmd0aCk6ay5sZW5ndGg+PTIqdGhpcy5QYXRjaF9NYXJnaW4mJmUmJih0aGlzLnBhdGNoX2FkZENvbnRleHRfKGEsaCksYy5wdXNoKGEpLGE9bmV3IGRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqLGU9MCxoPWQsZj1nKX0xIT09aSYmKGYrPWsubGVuZ3RoKTstMSE9PWkmJihnKz1rLmxlbmd0aCl9ZSYmKHRoaXMucGF0Y2hfYWRkQ29udGV4dF8oYSxoKSxjLnB1c2goYSkpO3JldHVybiBjfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9kZWVwQ29weT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdLGU9bmV3IGRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqO2UuZGlmZnM9W107Zm9yKHZhciBmPTA7ZjxkLmRpZmZzLmxlbmd0aDtmKyspZS5kaWZmc1tmXT1kLmRpZmZzW2ZdLnNsaWNlKCk7ZS5zdGFydDE9ZC5zdGFydDE7ZS5zdGFydDI9ZC5zdGFydDI7ZS5sZW5ndGgxPWQubGVuZ3RoMTtlLmxlbmd0aDI9ZC5sZW5ndGgyO2JbY109ZX1yZXR1cm4gYn07ZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfYXBwbHk9ZnVuY3Rpb24oYSxiKXtpZigwPT1hLmxlbmd0aClyZXR1cm5bYixbXV07YT10aGlzLnBhdGNoX2RlZXBDb3B5KGEpO3ZhciBjPXRoaXMucGF0Y2hfYWRkUGFkZGluZyhhKTtiPWMrYitjO3RoaXMucGF0Y2hfc3BsaXRNYXgoYSk7Zm9yKHZhciBkPTAsZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspe3ZhciBnPWFbZl0uc3RhcnQyK2QsaD10aGlzLmRpZmZfdGV4dDEoYVtmXS5kaWZmcyksaixpPS0xO2lmKGgubGVuZ3RoPnRoaXMuTWF0Y2hfTWF4Qml0cyl7aWYoaj10aGlzLm1hdGNoX21haW4oYixoLnN1YnN0cmluZygwLHRoaXMuTWF0Y2hfTWF4Qml0cyksZyksLTEhPWomJihpPXRoaXMubWF0Y2hfbWFpbihiLGguc3Vic3RyaW5nKGgubGVuZ3RoLXRoaXMuTWF0Y2hfTWF4Qml0cyksZytoLmxlbmd0aC10aGlzLk1hdGNoX01heEJpdHMpLC0xPT1pfHxqPj1pKSlqPS0xfWVsc2Ugaj10aGlzLm1hdGNoX21haW4oYixoLGcpO2lmKC0xPT1qKWVbZl09ITEsZC09YVtmXS5sZW5ndGgyLWFbZl0ubGVuZ3RoMTtlbHNlIGlmKGVbZl09ITAsZD1qLWcsZz0tMT09aT9iLnN1YnN0cmluZyhqLGoraC5sZW5ndGgpOmIuc3Vic3RyaW5nKGosaSt0aGlzLk1hdGNoX01heEJpdHMpLGg9PWcpYj1iLnN1YnN0cmluZygwLGopK3RoaXMuZGlmZl90ZXh0MihhW2ZdLmRpZmZzKStiLnN1YnN0cmluZyhqK2gubGVuZ3RoKTtlbHNlIGlmKGc9dGhpcy5kaWZmX21haW4oaCxnLCExKSxoLmxlbmd0aD50aGlzLk1hdGNoX01heEJpdHMmJnRoaXMuZGlmZl9sZXZlbnNodGVpbihnKS9oLmxlbmd0aD50aGlzLlBhdGNoX0RlbGV0ZVRocmVzaG9sZCllW2ZdPSExO2Vsc2V7dGhpcy5kaWZmX2NsZWFudXBTZW1hbnRpY0xvc3NsZXNzKGcpO2Zvcih2YXIgaD0wLGssaT0wO2k8YVtmXS5kaWZmcy5sZW5ndGg7aSsrKXt2YXIgcT1hW2ZdLmRpZmZzW2ldOzAhPT1xWzBdJiYoaz10aGlzLmRpZmZfeEluZGV4KGcsaCkpOzE9PT1xWzBdP2I9Yi5zdWJzdHJpbmcoMCxqK2spK3FbMV0rYi5zdWJzdHJpbmcoaitrKTotMT09PXFbMF0mJihiPWIuc3Vic3RyaW5nKDAsaitrKStiLnN1YnN0cmluZyhqK3RoaXMuZGlmZl94SW5kZXgoZyxoK3FbMV0ubGVuZ3RoKSkpOy0xIT09cVswXSYmKGgrPXFbMV0ubGVuZ3RoKX19fWI9Yi5zdWJzdHJpbmcoYy5sZW5ndGgsYi5sZW5ndGgtYy5sZW5ndGgpO3JldHVybltiLGVdfTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hZGRQYWRkaW5nPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLlBhdGNoX01hcmdpbixjPSIiLGQ9MTtkPD1iO2QrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGQpO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXS5zdGFydDErPWIsYVtkXS5zdGFydDIrPWI7dmFyIGQ9YVswXSxlPWQuZGlmZnM7aWYoMD09ZS5sZW5ndGh8fDAhPWVbMF1bMF0pZS51bnNoaWZ0KFswLGNdKSxkLnN0YXJ0MS09YixkLnN0YXJ0Mi09YixkLmxlbmd0aDErPWIsZC5sZW5ndGgyKz1iO2Vsc2UgaWYoYj5lWzBdWzFdLmxlbmd0aCl7dmFyIGY9Yi1lWzBdWzFdLmxlbmd0aDtlWzBdWzFdPWMuc3Vic3RyaW5nKGVbMF1bMV0ubGVuZ3RoKStlWzBdWzFdO2Quc3RhcnQxLT1mO2Quc3RhcnQyLT1mO2QubGVuZ3RoMSs9ZjtkLmxlbmd0aDIrPWZ9ZD1hW2EubGVuZ3RoLTFdO2U9ZC5kaWZmczswPT1lLmxlbmd0aHx8MCE9ZVtlLmxlbmd0aC0xXVswXT8oZS5wdXNoKFswLGNdKSxkLmxlbmd0aDErPWIsZC5sZW5ndGgyKz1iKTpiPmVbZS5sZW5ndGgtMV1bMV0ubGVuZ3RoJiYoZj1iLWVbZS5sZW5ndGgtMV1bMV0ubGVuZ3RoLGVbZS5sZW5ndGgtMV1bMV0rPWMuc3Vic3RyaW5nKDAsZiksZC5sZW5ndGgxKz1mLGQubGVuZ3RoMis9Zik7cmV0dXJuIGN9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX3NwbGl0TWF4PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLk1hdGNoX01heEJpdHMsYz0wO2M8YS5sZW5ndGg7YysrKWlmKCEoYVtjXS5sZW5ndGgxPD1iKSl7dmFyIGQ9YVtjXTthLnNwbGljZShjLS0sMSk7Zm9yKHZhciBlPWQuc3RhcnQxLGY9ZC5zdGFydDIsZz0iIjswIT09ZC5kaWZmcy5sZW5ndGg7KXt2YXIgaD1uZXcgZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmosaj0hMDtoLnN0YXJ0MT1lLWcubGVuZ3RoO2guc3RhcnQyPWYtZy5sZW5ndGg7IiIhPT1nJiYoaC5sZW5ndGgxPWgubGVuZ3RoMj1nLmxlbmd0aCxoLmRpZmZzLnB1c2goWzAsZ10pKTtmb3IoOzAhPT1kLmRpZmZzLmxlbmd0aCYmaC5sZW5ndGgxPGItdGhpcy5QYXRjaF9NYXJnaW47KXt2YXIgZz1kLmRpZmZzWzBdWzBdLGk9ZC5kaWZmc1swXVsxXTsxPT09Zz8oaC5sZW5ndGgyKz1pLmxlbmd0aCxmKz1pLmxlbmd0aCxoLmRpZmZzLnB1c2goZC5kaWZmcy5zaGlmdCgpKSxqPSExKTotMT09PWcmJjE9PWguZGlmZnMubGVuZ3RoJiYwPT1oLmRpZmZzWzBdWzBdJiZpLmxlbmd0aD4yKmI/KGgubGVuZ3RoMSs9aS5sZW5ndGgsZSs9aS5sZW5ndGgsaj0hMSxoLmRpZmZzLnB1c2goW2csaV0pLGQuZGlmZnMuc2hpZnQoKSk6KGk9aS5zdWJzdHJpbmcoMCxiLWgubGVuZ3RoMS10aGlzLlBhdGNoX01hcmdpbiksaC5sZW5ndGgxKz1pLmxlbmd0aCxlKz1pLmxlbmd0aCwwPT09Zz8oaC5sZW5ndGgyKz1pLmxlbmd0aCxmKz1pLmxlbmd0aCk6aj0hMSxoLmRpZmZzLnB1c2goW2csaV0pLGk9PWQuZGlmZnNbMF1bMV0/ZC5kaWZmcy5zaGlmdCgpOmQuZGlmZnNbMF1bMV09ZC5kaWZmc1swXVsxXS5zdWJzdHJpbmcoaS5sZW5ndGgpKX1nPXRoaXMuZGlmZl90ZXh0MihoLmRpZmZzKTtnPWcuc3Vic3RyaW5nKGcubGVuZ3RoLXRoaXMuUGF0Y2hfTWFyZ2luKTtpPXRoaXMuZGlmZl90ZXh0MShkLmRpZmZzKS5zdWJzdHJpbmcoMCx0aGlzLlBhdGNoX01hcmdpbik7IiIhPT1pJiYoaC5sZW5ndGgxKz1pLmxlbmd0aCxoLmxlbmd0aDIrPWkubGVuZ3RoLDAhPT1oLmRpZmZzLmxlbmd0aCYmMD09PWguZGlmZnNbaC5kaWZmcy5sZW5ndGgtMV1bMF0/aC5kaWZmc1toLmRpZmZzLmxlbmd0aC0xXVsxXSs9aTpoLmRpZmZzLnB1c2goWzAsaV0pKTtqfHxhLnNwbGljZSgrK2MsMCxoKX19fTtkaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF90b1RleHQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliW2NdPWFbY107cmV0dXJuIGIuam9pbigiIil9O2RpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX2Zyb21UZXh0PWZ1bmN0aW9uKGEpe3ZhciBiPVtdO2lmKCFhKXJldHVybiBiO2E9YS5zcGxpdCgiXG4iKTtmb3IodmFyIGM9MCxkPS9eQEAgLShcZCspLD8oXGQqKSBcKyhcZCspLD8oXGQqKSBAQCQvO2M8YS5sZW5ndGg7KXt2YXIgZT1hW2NdLm1hdGNoKGQpO2lmKCFlKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGNoIHN0cmluZzogIithW2NdKTt2YXIgZj1uZXcgZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo7Yi5wdXNoKGYpO2Yuc3RhcnQxPXBhcnNlSW50KGVbMV0sMTApOyIiPT09ZVsyXT8oZi5zdGFydDEtLSxmLmxlbmd0aDE9MSk6IjAiPT1lWzJdP2YubGVuZ3RoMT0wOihmLnN0YXJ0MS0tLGYubGVuZ3RoMT1wYXJzZUludChlWzJdLDEwKSk7Zi5zdGFydDI9cGFyc2VJbnQoZVszXSwxMCk7IiI9PT1lWzRdPyhmLnN0YXJ0Mi0tLGYubGVuZ3RoMj0xKToiMCI9PWVbNF0/Zi5sZW5ndGgyPTA6KGYuc3RhcnQyLS0sZi5sZW5ndGgyPXBhcnNlSW50KGVbNF0sMTApKTtmb3IoYysrO2M8YS5sZW5ndGg7KXtlPWFbY10uY2hhckF0KDApO3RyeXt2YXIgZz1kZWNvZGVVUkkoYVtjXS5zdWJzdHJpbmcoMSkpfWNhdGNoKGgpe3Rocm93IEVycm9yKCJJbGxlZ2FsIGVzY2FwZSBpbiBwYXRjaF9mcm9tVGV4dDogIitnKTt9aWYoIi0iPT1lKWYuZGlmZnMucHVzaChbLTEsZ10pO2Vsc2UgaWYoIisiPT1lKWYuZGlmZnMucHVzaChbMSxnXSk7ZWxzZSBpZigiICI9PWUpZi5kaWZmcy5wdXNoKFswLGddKTtlbHNlIGlmKCJAIj09ZSlicmVhaztlbHNlIGlmKCIiIT09ZSl0aHJvdyBFcnJvcignSW52YWxpZCBwYXRjaCBtb2RlICInK2UrJyIgaW46ICcrZyk7YysrfX1yZXR1cm4gYn07ZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo9ZnVuY3Rpb24oKXt0aGlzLmRpZmZzPVtdO3RoaXMuc3RhcnQyPXRoaXMuc3RhcnQxPW51bGw7dGhpcy5sZW5ndGgyPXRoaXMubGVuZ3RoMT0wfTtkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iai5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYSxiO2E9MD09PXRoaXMubGVuZ3RoMT90aGlzLnN0YXJ0MSsiLDAiOjE9PXRoaXMubGVuZ3RoMT90aGlzLnN0YXJ0MSsxOnRoaXMuc3RhcnQxKzErIiwiK3RoaXMubGVuZ3RoMTtiPTA9PT10aGlzLmxlbmd0aDI/dGhpcy5zdGFydDIrIiwwIjoxPT10aGlzLmxlbmd0aDI/dGhpcy5zdGFydDIrMTp0aGlzLnN0YXJ0MisxKyIsIit0aGlzLmxlbmd0aDI7YT1bIkBAIC0iK2ErIiArIitiKyIgQEBcbiJdO3ZhciBjO2ZvcihiPTA7Yjx0aGlzLmRpZmZzLmxlbmd0aDtiKyspe3N3aXRjaCh0aGlzLmRpZmZzW2JdWzBdKXtjYXNlIDE6Yz0iKyI7YnJlYWs7Y2FzZS0xOmM9Ii0iO2JyZWFrO2Nhc2UgMDpjPSIgIn1hW2IrMV09YytlbmNvZGVVUkkodGhpcy5kaWZmc1tiXVsxXSkrIlxuIn1yZXR1cm4gYS5qb2luKCIiKS5yZXBsYWNlKC8lMjAvZywiICIpfTt0aGlzLmRpZmZfbWF0Y2hfcGF0Y2g9ZGlmZl9tYXRjaF9wYXRjaDt0aGlzLkRJRkZfREVMRVRFPS0xO3RoaXMuRElGRl9JTlNFUlQ9MTt0aGlzLkRJRkZfRVFVQUw9MDt9KSgpO0VsZW1lbnRzLkluc3BlY3RFbGVtZW50TW9kZUNvbnRyb2xsZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl90b2dnbGVTZWFyY2hBY3Rpb249VUkuYWN0aW9uUmVnaXN0cnkuYWN0aW9uKCdlbGVtZW50cy50b2dnbGUtZWxlbWVudC1zZWFyY2gnKTt0aGlzLl9tb2RlPVByb3RvY29sLk92ZXJsYXkuSW5zcGVjdE1vZGUuTm9uZTtTREsudGFyZ2V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5TdXNwZW5kU3RhdGVDaGFuZ2VkLHRoaXMuX3N1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuT3ZlcmxheU1vZGVsLFNESy5PdmVybGF5TW9kZWwuRXZlbnRzLlNjcmVlbnNob3RSZXF1ZXN0ZWQsKCk9PnRoaXMuX3NldE1vZGUoUHJvdG9jb2wuT3ZlcmxheS5JbnNwZWN0TW9kZS5Ob25lKSk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuT3ZlcmxheU1vZGVsLHRoaXMpO30KbW9kZWxBZGRlZChvdmVybGF5TW9kZWwpe2lmKHRoaXMuX21vZGU9PT1Qcm90b2NvbC5PdmVybGF5Lkluc3BlY3RNb2RlLk5vbmUpCnJldHVybjtvdmVybGF5TW9kZWwuc2V0SW5zcGVjdE1vZGUodGhpcy5fbW9kZSk7fQptb2RlbFJlbW92ZWQob3ZlcmxheU1vZGVsKXt9CmlzSW5JbnNwZWN0RWxlbWVudE1vZGUoKXtyZXR1cm4gdGhpcy5fbW9kZT09PVByb3RvY29sLk92ZXJsYXkuSW5zcGVjdE1vZGUuU2VhcmNoRm9yTm9kZXx8dGhpcy5fbW9kZT09PVByb3RvY29sLk92ZXJsYXkuSW5zcGVjdE1vZGUuU2VhcmNoRm9yVUFTaGFkb3dET007fQpzdG9wSW5zcGVjdGlvbigpe2lmKHRoaXMuX21vZGUmJnRoaXMuX21vZGUhPT1Qcm90b2NvbC5PdmVybGF5Lkluc3BlY3RNb2RlLk5vbmUpCnRoaXMuX3RvZ2dsZUluc3BlY3RNb2RlKCk7fQpfdG9nZ2xlSW5zcGVjdE1vZGUoKXtpZihTREsudGFyZ2V0TWFuYWdlci5hbGxUYXJnZXRzU3VzcGVuZGVkKCkpCnJldHVybjtsZXQgbW9kZTtpZih0aGlzLmlzSW5JbnNwZWN0RWxlbWVudE1vZGUoKSl7bW9kZT1Qcm90b2NvbC5PdmVybGF5Lkluc3BlY3RNb2RlLk5vbmU7fWVsc2V7bW9kZT1Db21tb24ubW9kdWxlU2V0dGluZygnc2hvd1VBU2hhZG93RE9NJykuZ2V0KCk/UHJvdG9jb2wuT3ZlcmxheS5JbnNwZWN0TW9kZS5TZWFyY2hGb3JVQVNoYWRvd0RPTTpQcm90b2NvbC5PdmVybGF5Lkluc3BlY3RNb2RlLlNlYXJjaEZvck5vZGU7fQp0aGlzLl9zZXRNb2RlKG1vZGUpO30KX3NldE1vZGUobW9kZSl7dGhpcy5fbW9kZT1tb2RlO2Zvcihjb25zdCBvdmVybGF5TW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5PdmVybGF5TW9kZWwpKQpvdmVybGF5TW9kZWwuc2V0SW5zcGVjdE1vZGUobW9kZSk7dGhpcy5fdG9nZ2xlU2VhcmNoQWN0aW9uLnNldFRvZ2dsZWQodGhpcy5pc0luSW5zcGVjdEVsZW1lbnRNb2RlKCkpO30KX3N1c3BlbmRTdGF0ZUNoYW5nZWQoKXtpZighU0RLLnRhcmdldE1hbmFnZXIuYWxsVGFyZ2V0c1N1c3BlbmRlZCgpKQpyZXR1cm47dGhpcy5fbW9kZT1Qcm90b2NvbC5PdmVybGF5Lkluc3BlY3RNb2RlLk5vbmU7dGhpcy5fdG9nZ2xlU2VhcmNoQWN0aW9uLnNldFRvZ2dsZWQoZmFsc2UpO319O0VsZW1lbnRzLkluc3BlY3RFbGVtZW50TW9kZUNvbnRyb2xsZXIuVG9nZ2xlU2VhcmNoQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2lmKCFFbGVtZW50cy5pbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyKQpyZXR1cm4gZmFsc2U7RWxlbWVudHMuaW5zcGVjdEVsZW1lbnRNb2RlQ29udHJvbGxlci5fdG9nZ2xlSW5zcGVjdE1vZGUoKTtyZXR1cm4gdHJ1ZTt9fTtFbGVtZW50cy5pbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyPVJ1bnRpbWUucXVlcnlQYXJhbSgnaXNTaGFyZWRXb3JrZXInKT9udWxsOm5ldyBFbGVtZW50cy5JbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyKCk7O0VsZW1lbnRzLkJlemllclBvcG92ZXJJY29uPWNsYXNze2NvbnN0cnVjdG9yKHRyZWVFbGVtZW50LHN3YXRjaFBvcG92ZXJIZWxwZXIsc3dhdGNoKXt0aGlzLl90cmVlRWxlbWVudD10cmVlRWxlbWVudDt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyPXN3YXRjaFBvcG92ZXJIZWxwZXI7dGhpcy5fc3dhdGNoPXN3YXRjaDt0aGlzLl9zd2F0Y2guaWNvbkVsZW1lbnQoKS50aXRsZT1Db21tb24uVUlTdHJpbmcoJ09wZW4gY3ViaWMgYmV6aWVyIGVkaXRvci4nKTt0aGlzLl9zd2F0Y2guaWNvbkVsZW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faWNvbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3N3YXRjaC5pY29uRWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LmNvbnN1bWUoKSxmYWxzZSk7dGhpcy5fYm91bmRCZXppZXJDaGFuZ2VkPXRoaXMuX2JlemllckNoYW5nZWQuYmluZCh0aGlzKTt0aGlzLl9ib3VuZE9uU2Nyb2xsPXRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7fQpfaWNvbkNsaWNrKGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO2lmKHRoaXMuX3N3YXRjaFBvcG92ZXJIZWxwZXIuaXNTaG93aW5nKCkpe3RoaXMuX3N3YXRjaFBvcG92ZXJIZWxwZXIuaGlkZSh0cnVlKTtyZXR1cm47fQp0aGlzLl9iZXppZXJFZGl0b3I9bmV3IElubGluZUVkaXRvci5CZXppZXJFZGl0b3IoKTtsZXQgY3ViaWNCZXppZXI9VUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIucGFyc2UodGhpcy5fc3dhdGNoLmJlemllclRleHQoKSk7aWYoIWN1YmljQmV6aWVyKXtjdWJpY0Jlemllcj0oVUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIucGFyc2UoJ2xpbmVhcicpKTt9CnRoaXMuX2JlemllckVkaXRvci5zZXRCZXppZXIoY3ViaWNCZXppZXIpO3RoaXMuX2JlemllckVkaXRvci5hZGRFdmVudExpc3RlbmVyKElubGluZUVkaXRvci5CZXppZXJFZGl0b3IuRXZlbnRzLkJlemllckNoYW5nZWQsdGhpcy5fYm91bmRCZXppZXJDaGFuZ2VkKTt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLnNob3codGhpcy5fYmV6aWVyRWRpdG9yLHRoaXMuX3N3YXRjaC5pY29uRWxlbWVudCgpLHRoaXMuX29uUG9wb3ZlckhpZGRlbi5iaW5kKHRoaXMpKTt0aGlzLl9zY3JvbGxlckVsZW1lbnQ9dGhpcy5fc3dhdGNoLmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3N0eWxlLXBhbmVzLXdyYXBwZXInKTtpZih0aGlzLl9zY3JvbGxlckVsZW1lbnQpCnRoaXMuX3Njcm9sbGVyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX2JvdW5kT25TY3JvbGwsZmFsc2UpO3RoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0PXRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5LnByb3BlcnR5VGV4dDt0aGlzLl90cmVlRWxlbWVudC5wYXJlbnRQYW5lKCkuc2V0RWRpdGluZ1N0eWxlKHRydWUpO2NvbnN0IHVpTG9jYXRpb249QmluZGluZ3MuY3NzV29ya3NwYWNlQmluZGluZy5wcm9wZXJ0eVVJTG9jYXRpb24odGhpcy5fdHJlZUVsZW1lbnQucHJvcGVydHksZmFsc2UpO2lmKHVpTG9jYXRpb24pCkNvbW1vbi5SZXZlYWxlci5yZXZlYWwodWlMb2NhdGlvbix0cnVlKTt9Cl9iZXppZXJDaGFuZ2VkKGV2ZW50KXt0aGlzLl9zd2F0Y2guc2V0QmV6aWVyVGV4dCgoZXZlbnQuZGF0YSkpO3RoaXMuX3RyZWVFbGVtZW50LmFwcGx5U3R5bGVUZXh0KHRoaXMuX3RyZWVFbGVtZW50LnJlbmRlcmVkUHJvcGVydHlUZXh0KCksZmFsc2UpO30KX29uU2Nyb2xsKGV2ZW50KXt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLnJlcG9zaXRpb24oKTt9Cl9vblBvcG92ZXJIaWRkZW4oY29tbWl0RWRpdCl7aWYodGhpcy5fc2Nyb2xsZXJFbGVtZW50KQp0aGlzLl9zY3JvbGxlckVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLl9ib3VuZE9uU2Nyb2xsLGZhbHNlKTt0aGlzLl9iZXppZXJFZGl0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihJbmxpbmVFZGl0b3IuQmV6aWVyRWRpdG9yLkV2ZW50cy5CZXppZXJDaGFuZ2VkLHRoaXMuX2JvdW5kQmV6aWVyQ2hhbmdlZCk7ZGVsZXRlIHRoaXMuX2JlemllckVkaXRvcjtjb25zdCBwcm9wZXJ0eVRleHQ9Y29tbWl0RWRpdD90aGlzLl90cmVlRWxlbWVudC5yZW5kZXJlZFByb3BlcnR5VGV4dCgpOnRoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0O3RoaXMuX3RyZWVFbGVtZW50LmFwcGx5U3R5bGVUZXh0KHByb3BlcnR5VGV4dCx0cnVlKTt0aGlzLl90cmVlRWxlbWVudC5wYXJlbnRQYW5lKCkuc2V0RWRpdGluZ1N0eWxlKGZhbHNlKTtkZWxldGUgdGhpcy5fb3JpZ2luYWxQcm9wZXJ0eVRleHQ7fX07RWxlbWVudHMuQ29sb3JTd2F0Y2hQb3BvdmVySWNvbj1jbGFzc3tjb25zdHJ1Y3Rvcih0cmVlRWxlbWVudCxzd2F0Y2hQb3BvdmVySGVscGVyLHN3YXRjaCl7dGhpcy5fdHJlZUVsZW1lbnQ9dHJlZUVsZW1lbnQ7dGhpcy5fdHJlZUVsZW1lbnRbRWxlbWVudHMuQ29sb3JTd2F0Y2hQb3BvdmVySWNvbi5fdHJlZUVsZW1lbnRTeW1ib2xdPXRoaXM7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlcj1zd2F0Y2hQb3BvdmVySGVscGVyO3RoaXMuX3N3YXRjaD1zd2F0Y2g7Y29uc3Qgc2hpZnRDbGlja01lc3NhZ2U9Q29tbW9uLlVJU3RyaW5nKCdTaGlmdCArIENsaWNrIHRvIGNoYW5nZSBjb2xvciBmb3JtYXQuJyk7dGhpcy5fc3dhdGNoLmljb25FbGVtZW50KCkudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdPcGVuIGNvbG9yIHBpY2tlci4gJXMnLHNoaWZ0Q2xpY2tNZXNzYWdlKTt0aGlzLl9zd2F0Y2guaWNvbkVsZW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faWNvbkNsaWNrLmJpbmQodGhpcykpO3RoaXMuX3N3YXRjaC5pY29uRWxlbWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LmNvbnN1bWUoKSxmYWxzZSk7dGhpcy5fY29udHJhc3RJbmZvPW51bGw7dGhpcy5fYm91bmRTcGVjdHJ1bUNoYW5nZWQ9dGhpcy5fc3BlY3RydW1DaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fYm91bmRPblNjcm9sbD10aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpO30KX2dlbmVyYXRlQ1NTVmFyaWFibGVzUGFsZXR0ZSgpe2NvbnN0IG1hdGNoZWRTdHlsZXM9dGhpcy5fdHJlZUVsZW1lbnQubWF0Y2hlZFN0eWxlcygpO2NvbnN0IHN0eWxlPXRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5Lm93bmVyU3R5bGU7Y29uc3QgY3NzVmFyaWFibGVzPW1hdGNoZWRTdHlsZXMuYXZhaWxhYmxlQ1NTVmFyaWFibGVzKHN0eWxlKTtjb25zdCBjb2xvcnM9W107Y29uc3QgY29sb3JOYW1lcz1bXTtmb3IoY29uc3QgY3NzVmFyaWFibGUgb2YgY3NzVmFyaWFibGVzKXtpZihjc3NWYXJpYWJsZT09PXRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5Lm5hbWUpCmNvbnRpbnVlO2NvbnN0IHZhbHVlPW1hdGNoZWRTdHlsZXMuY29tcHV0ZUNTU1ZhcmlhYmxlKHN0eWxlLGNzc1ZhcmlhYmxlKTtpZighdmFsdWUpCmNvbnRpbnVlO2NvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5wYXJzZSh2YWx1ZSk7aWYoIWNvbG9yKQpjb250aW51ZTtjb2xvcnMucHVzaCh2YWx1ZSk7Y29sb3JOYW1lcy5wdXNoKGNzc1ZhcmlhYmxlKTt9CnJldHVybnt0aXRsZTonQ1NTIFZhcmlhYmxlcycsbXV0YWJsZTpmYWxzZSxtYXRjaFVzZXJGb3JtYXQ6dHJ1ZSxjb2xvcnM6Y29sb3JzLGNvbG9yTmFtZXM6Y29sb3JOYW1lc307fQpzdGF0aWMgZm9yVHJlZUVsZW1lbnQodHJlZUVsZW1lbnQpe3JldHVybiB0cmVlRWxlbWVudFtFbGVtZW50cy5Db2xvclN3YXRjaFBvcG92ZXJJY29uLl90cmVlRWxlbWVudFN5bWJvbF18fG51bGw7fQpzZXRDb250cmFzdEluZm8oY29udHJhc3RJbmZvKXt0aGlzLl9jb250cmFzdEluZm89Y29udHJhc3RJbmZvO2lmKHRoaXMuX3NwZWN0cnVtKQp0aGlzLl9zcGVjdHJ1bS5zZXRDb250cmFzdEluZm8oY29udHJhc3RJbmZvKTt9Cl9pY29uQ2xpY2soZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7dGhpcy5zaG93UG9wb3ZlcigpO30Kc2hvd1BvcG92ZXIoKXtpZih0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLmlzU2hvd2luZygpKXt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLmhpZGUodHJ1ZSk7cmV0dXJuO30KY29uc3QgY29sb3I9dGhpcy5fc3dhdGNoLmNvbG9yKCk7bGV0IGZvcm1hdD10aGlzLl9zd2F0Y2guZm9ybWF0KCk7aWYoZm9ybWF0PT09Q29tbW9uLkNvbG9yLkZvcm1hdC5PcmlnaW5hbCkKZm9ybWF0PWNvbG9yLmZvcm1hdCgpO3RoaXMuX3NwZWN0cnVtPW5ldyBDb2xvclBpY2tlci5TcGVjdHJ1bSgpO3RoaXMuX3NwZWN0cnVtLnNldENvbG9yKGNvbG9yLGZvcm1hdCk7dGhpcy5fc3BlY3RydW0uYWRkUGFsZXR0ZSh0aGlzLl9nZW5lcmF0ZUNTU1ZhcmlhYmxlc1BhbGV0dGUoKSk7aWYodGhpcy5fY29udHJhc3RJbmZvKQp0aGlzLl9zcGVjdHJ1bS5zZXRDb250cmFzdEluZm8odGhpcy5fY29udHJhc3RJbmZvKTt0aGlzLl9zcGVjdHJ1bS5hZGRFdmVudExpc3RlbmVyKENvbG9yUGlja2VyLlNwZWN0cnVtLkV2ZW50cy5TaXplQ2hhbmdlZCx0aGlzLl9zcGVjdHJ1bVJlc2l6ZWQsdGhpcyk7dGhpcy5fc3BlY3RydW0uYWRkRXZlbnRMaXN0ZW5lcihDb2xvclBpY2tlci5TcGVjdHJ1bS5FdmVudHMuQ29sb3JDaGFuZ2VkLHRoaXMuX2JvdW5kU3BlY3RydW1DaGFuZ2VkKTt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLnNob3codGhpcy5fc3BlY3RydW0sdGhpcy5fc3dhdGNoLmljb25FbGVtZW50KCksdGhpcy5fb25Qb3BvdmVySGlkZGVuLmJpbmQodGhpcykpO3RoaXMuX3Njcm9sbGVyRWxlbWVudD10aGlzLl9zd2F0Y2guZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnc3R5bGUtcGFuZXMtd3JhcHBlcicpO2lmKHRoaXMuX3Njcm9sbGVyRWxlbWVudCkKdGhpcy5fc2Nyb2xsZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fYm91bmRPblNjcm9sbCxmYWxzZSk7dGhpcy5fb3JpZ2luYWxQcm9wZXJ0eVRleHQ9dGhpcy5fdHJlZUVsZW1lbnQucHJvcGVydHkucHJvcGVydHlUZXh0O3RoaXMuX3RyZWVFbGVtZW50LnBhcmVudFBhbmUoKS5zZXRFZGl0aW5nU3R5bGUodHJ1ZSk7Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnByb3BlcnR5VUlMb2NhdGlvbih0aGlzLl90cmVlRWxlbWVudC5wcm9wZXJ0eSxmYWxzZSk7aWYodWlMb2NhdGlvbikKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1aUxvY2F0aW9uLHRydWUpO30KX3NwZWN0cnVtUmVzaXplZChldmVudCl7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5yZXBvc2l0aW9uKCk7fQpfc3BlY3RydW1DaGFuZ2VkKGV2ZW50KXtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IucGFyc2UoKGV2ZW50LmRhdGEpKTtpZighY29sb3IpCnJldHVybjt0aGlzLl9zd2F0Y2guc2V0Q29sb3IoY29sb3IpO2NvbnN0IGNvbG9yTmFtZT10aGlzLl9zcGVjdHJ1bS5jb2xvck5hbWUoKTtpZihjb2xvck5hbWUmJmNvbG9yTmFtZS5zdGFydHNXaXRoKCctLScpKQp0aGlzLl9zd2F0Y2guc2V0VGV4dChgdmFyKCR7Y29sb3JOYW1lfSlgKTt0aGlzLl90cmVlRWxlbWVudC5hcHBseVN0eWxlVGV4dCh0aGlzLl90cmVlRWxlbWVudC5yZW5kZXJlZFByb3BlcnR5VGV4dCgpLGZhbHNlKTt9Cl9vblNjcm9sbChldmVudCl7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5yZXBvc2l0aW9uKCk7fQpfb25Qb3BvdmVySGlkZGVuKGNvbW1pdEVkaXQpe2lmKHRoaXMuX3Njcm9sbGVyRWxlbWVudCkKdGhpcy5fc2Nyb2xsZXJFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fYm91bmRPblNjcm9sbCxmYWxzZSk7dGhpcy5fc3BlY3RydW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihDb2xvclBpY2tlci5TcGVjdHJ1bS5FdmVudHMuQ29sb3JDaGFuZ2VkLHRoaXMuX2JvdW5kU3BlY3RydW1DaGFuZ2VkKTtkZWxldGUgdGhpcy5fc3BlY3RydW07Y29uc3QgcHJvcGVydHlUZXh0PWNvbW1pdEVkaXQ/dGhpcy5fdHJlZUVsZW1lbnQucmVuZGVyZWRQcm9wZXJ0eVRleHQoKTp0aGlzLl9vcmlnaW5hbFByb3BlcnR5VGV4dDt0aGlzLl90cmVlRWxlbWVudC5hcHBseVN0eWxlVGV4dChwcm9wZXJ0eVRleHQsdHJ1ZSk7dGhpcy5fdHJlZUVsZW1lbnQucGFyZW50UGFuZSgpLnNldEVkaXRpbmdTdHlsZShmYWxzZSk7ZGVsZXRlIHRoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0O319O0VsZW1lbnRzLkNvbG9yU3dhdGNoUG9wb3Zlckljb24uX3RyZWVFbGVtZW50U3ltYm9sPVN5bWJvbCgnRWxlbWVudHMuQ29sb3JTd2F0Y2hQb3BvdmVySWNvbi5fdHJlZUVsZW1lbnRTeW1ib2wnKTtFbGVtZW50cy5TaGFkb3dTd2F0Y2hQb3BvdmVySGVscGVyPWNsYXNze2NvbnN0cnVjdG9yKHRyZWVFbGVtZW50LHN3YXRjaFBvcG92ZXJIZWxwZXIsc2hhZG93U3dhdGNoKXt0aGlzLl90cmVlRWxlbWVudD10cmVlRWxlbWVudDt0aGlzLl90cmVlRWxlbWVudFtFbGVtZW50cy5TaGFkb3dTd2F0Y2hQb3BvdmVySGVscGVyLl90cmVlRWxlbWVudFN5bWJvbF09dGhpczt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyPXN3YXRjaFBvcG92ZXJIZWxwZXI7dGhpcy5fc2hhZG93U3dhdGNoPXNoYWRvd1N3YXRjaDt0aGlzLl9pY29uRWxlbWVudD1zaGFkb3dTd2F0Y2guaWNvbkVsZW1lbnQoKTt0aGlzLl9pY29uRWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ09wZW4gc2hhZG93IGVkaXRvci4nKTt0aGlzLl9pY29uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faWNvbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2ljb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LmNvbnN1bWUoKSxmYWxzZSk7dGhpcy5fYm91bmRTaGFkb3dDaGFuZ2VkPXRoaXMuX3NoYWRvd0NoYW5nZWQuYmluZCh0aGlzKTt0aGlzLl9ib3VuZE9uU2Nyb2xsPXRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7fQpzdGF0aWMgZm9yVHJlZUVsZW1lbnQodHJlZUVsZW1lbnQpe3JldHVybiB0cmVlRWxlbWVudFtFbGVtZW50cy5TaGFkb3dTd2F0Y2hQb3BvdmVySGVscGVyLl90cmVlRWxlbWVudFN5bWJvbF18fG51bGw7fQpfaWNvbkNsaWNrKGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuc2hvd1BvcG92ZXIoKTt9CnNob3dQb3BvdmVyKCl7aWYodGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5pc1Nob3dpbmcoKSl7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5oaWRlKHRydWUpO3JldHVybjt9CnRoaXMuX2Nzc1NoYWRvd0VkaXRvcj1uZXcgSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvcigpO3RoaXMuX2Nzc1NoYWRvd0VkaXRvci5zZXRNb2RlbCh0aGlzLl9zaGFkb3dTd2F0Y2gubW9kZWwoKSk7dGhpcy5fY3NzU2hhZG93RWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5FdmVudHMuU2hhZG93Q2hhbmdlZCx0aGlzLl9ib3VuZFNoYWRvd0NoYW5nZWQpO3RoaXMuX3N3YXRjaFBvcG92ZXJIZWxwZXIuc2hvdyh0aGlzLl9jc3NTaGFkb3dFZGl0b3IsdGhpcy5faWNvbkVsZW1lbnQsdGhpcy5fb25Qb3BvdmVySGlkZGVuLmJpbmQodGhpcykpO3RoaXMuX3Njcm9sbGVyRWxlbWVudD10aGlzLl9pY29uRWxlbWVudC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdzdHlsZS1wYW5lcy13cmFwcGVyJyk7aWYodGhpcy5fc2Nyb2xsZXJFbGVtZW50KQp0aGlzLl9zY3JvbGxlckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLl9ib3VuZE9uU2Nyb2xsLGZhbHNlKTt0aGlzLl9vcmlnaW5hbFByb3BlcnR5VGV4dD10aGlzLl90cmVlRWxlbWVudC5wcm9wZXJ0eS5wcm9wZXJ0eVRleHQ7dGhpcy5fdHJlZUVsZW1lbnQucGFyZW50UGFuZSgpLnNldEVkaXRpbmdTdHlsZSh0cnVlKTtjb25zdCB1aUxvY2F0aW9uPUJpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmcucHJvcGVydHlVSUxvY2F0aW9uKHRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5LGZhbHNlKTtpZih1aUxvY2F0aW9uKQpDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHVpTG9jYXRpb24sdHJ1ZSk7fQpfc2hhZG93Q2hhbmdlZChldmVudCl7dGhpcy5fc2hhZG93U3dhdGNoLnNldENTU1NoYWRvdygoZXZlbnQuZGF0YSkpO3RoaXMuX3RyZWVFbGVtZW50LmFwcGx5U3R5bGVUZXh0KHRoaXMuX3RyZWVFbGVtZW50LnJlbmRlcmVkUHJvcGVydHlUZXh0KCksZmFsc2UpO30KX29uU2Nyb2xsKGV2ZW50KXt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLnJlcG9zaXRpb24oKTt9Cl9vblBvcG92ZXJIaWRkZW4oY29tbWl0RWRpdCl7aWYodGhpcy5fc2Nyb2xsZXJFbGVtZW50KQp0aGlzLl9zY3JvbGxlckVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLl9ib3VuZE9uU2Nyb2xsLGZhbHNlKTt0aGlzLl9jc3NTaGFkb3dFZGl0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLkV2ZW50cy5TaGFkb3dDaGFuZ2VkLHRoaXMuX2JvdW5kU2hhZG93Q2hhbmdlZCk7ZGVsZXRlIHRoaXMuX2Nzc1NoYWRvd0VkaXRvcjtjb25zdCBwcm9wZXJ0eVRleHQ9Y29tbWl0RWRpdD90aGlzLl90cmVlRWxlbWVudC5yZW5kZXJlZFByb3BlcnR5VGV4dCgpOnRoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0O3RoaXMuX3RyZWVFbGVtZW50LmFwcGx5U3R5bGVUZXh0KHByb3BlcnR5VGV4dCx0cnVlKTt0aGlzLl90cmVlRWxlbWVudC5wYXJlbnRQYW5lKCkuc2V0RWRpdGluZ1N0eWxlKGZhbHNlKTtkZWxldGUgdGhpcy5fb3JpZ2luYWxQcm9wZXJ0eVRleHQ7fX07RWxlbWVudHMuU2hhZG93U3dhdGNoUG9wb3ZlckhlbHBlci5fdHJlZUVsZW1lbnRTeW1ib2w9U3ltYm9sKCdFbGVtZW50cy5TaGFkb3dTd2F0Y2hQb3BvdmVySGVscGVyLl90cmVlRWxlbWVudFN5bWJvbCcpOztFbGVtZW50cy5Db21wdXRlZFN0eWxlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9ub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTt0aGlzLl9jc3NNb2RlbD1udWxsO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtdO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkRPTU5vZGUsdGhpcy5fb25Ob2RlQ2hhbmdlZCx0aGlzKTt9Cm5vZGUoKXtyZXR1cm4gdGhpcy5fbm9kZTt9CmNzc01vZGVsKCl7cmV0dXJuIHRoaXMuX2Nzc01vZGVsJiZ0aGlzLl9jc3NNb2RlbC5pc0VuYWJsZWQoKT90aGlzLl9jc3NNb2RlbDpudWxsO30KX29uTm9kZUNoYW5nZWQoZXZlbnQpe3RoaXMuX25vZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3VwZGF0ZU1vZGVsKHRoaXMuX25vZGU/dGhpcy5fbm9kZS5kb21Nb2RlbCgpLmNzc01vZGVsKCk6bnVsbCk7dGhpcy5fb25Db21wdXRlZFN0eWxlQ2hhbmdlZChudWxsKTt9Cl91cGRhdGVNb2RlbChjc3NNb2RlbCl7aWYodGhpcy5fY3NzTW9kZWw9PT1jc3NNb2RlbCkKcmV0dXJuO0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl9ldmVudExpc3RlbmVycyk7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7Y29uc3QgZG9tTW9kZWw9Y3NzTW9kZWw/Y3NzTW9kZWwuZG9tTW9kZWwoKTpudWxsO2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPWNzc01vZGVsP2Nzc01vZGVsLnRhcmdldCgpLm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk6bnVsbDtpZihjc3NNb2RlbCYmZG9tTW9kZWwmJnJlc291cmNlVHJlZU1vZGVsKXt0aGlzLl9ldmVudExpc3RlbmVycz1bY3NzTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ1NTTW9kZWwuRXZlbnRzLlN0eWxlU2hlZXRBZGRlZCx0aGlzLl9vbkNvbXB1dGVkU3R5bGVDaGFuZ2VkLHRoaXMpLGNzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0UmVtb3ZlZCx0aGlzLl9vbkNvbXB1dGVkU3R5bGVDaGFuZ2VkLHRoaXMpLGNzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5TdHlsZVNoZWV0Q2hhbmdlZCx0aGlzLl9vbkNvbXB1dGVkU3R5bGVDaGFuZ2VkLHRoaXMpLGNzc01vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNTU01vZGVsLkV2ZW50cy5Gb250c1VwZGF0ZWQsdGhpcy5fb25Db21wdXRlZFN0eWxlQ2hhbmdlZCx0aGlzKSxjc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuTWVkaWFRdWVyeVJlc3VsdENoYW5nZWQsdGhpcy5fb25Db21wdXRlZFN0eWxlQ2hhbmdlZCx0aGlzKSxjc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuUHNldWRvU3RhdGVGb3JjZWQsdGhpcy5fb25Db21wdXRlZFN0eWxlQ2hhbmdlZCx0aGlzKSxjc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuTW9kZWxXYXNFbmFibGVkLHRoaXMuX29uQ29tcHV0ZWRTdHlsZUNoYW5nZWQsdGhpcyksZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkRPTU11dGF0ZWQsdGhpcy5fb25ET01Nb2RlbENoYW5nZWQsdGhpcykscmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkZyYW1lUmVzaXplZCx0aGlzLl9vbkZyYW1lUmVzaXplZCx0aGlzKSxdO319Cl9vbkNvbXB1dGVkU3R5bGVDaGFuZ2VkKGV2ZW50KXtkZWxldGUgdGhpcy5fY29tcHV0ZWRTdHlsZVByb21pc2U7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoRWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsLkV2ZW50cy5Db21wdXRlZFN0eWxlQ2hhbmdlZCxldmVudD9ldmVudC5kYXRhOm51bGwpO30KX29uRE9NTW9kZWxDaGFuZ2VkKGV2ZW50KXtjb25zdCBub2RlPShldmVudC5kYXRhKTtpZighdGhpcy5fbm9kZXx8dGhpcy5fbm9kZSE9PW5vZGUmJm5vZGUucGFyZW50Tm9kZSE9PXRoaXMuX25vZGUucGFyZW50Tm9kZSYmIW5vZGUuaXNBbmNlc3Rvcih0aGlzLl9ub2RlKSkKcmV0dXJuO3RoaXMuX29uQ29tcHV0ZWRTdHlsZUNoYW5nZWQobnVsbCk7fQpfb25GcmFtZVJlc2l6ZWQoZXZlbnQpe2Z1bmN0aW9uIHJlZnJlc2hDb250ZW50cygpe3RoaXMuX29uQ29tcHV0ZWRTdHlsZUNoYW5nZWQobnVsbCk7ZGVsZXRlIHRoaXMuX2ZyYW1lUmVzaXplZFRpbWVyO30KaWYodGhpcy5fZnJhbWVSZXNpemVkVGltZXIpCmNsZWFyVGltZW91dCh0aGlzLl9mcmFtZVJlc2l6ZWRUaW1lcik7dGhpcy5fZnJhbWVSZXNpemVkVGltZXI9c2V0VGltZW91dChyZWZyZXNoQ29udGVudHMuYmluZCh0aGlzKSwxMDApO30KX2VsZW1lbnROb2RlKCl7cmV0dXJuIHRoaXMubm9kZSgpP3RoaXMubm9kZSgpLmVuY2xvc2luZ0VsZW1lbnRPclNlbGYoKTpudWxsO30KZmV0Y2hDb21wdXRlZFN0eWxlKCl7Y29uc3QgZWxlbWVudE5vZGU9dGhpcy5fZWxlbWVudE5vZGUoKTtjb25zdCBjc3NNb2RlbD10aGlzLmNzc01vZGVsKCk7aWYoIWVsZW1lbnROb2RlfHwhY3NzTW9kZWwpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtpZighdGhpcy5fY29tcHV0ZWRTdHlsZVByb21pc2Upe3RoaXMuX2NvbXB1dGVkU3R5bGVQcm9taXNlPWNzc01vZGVsLmNvbXB1dGVkU3R5bGVQcm9taXNlKGVsZW1lbnROb2RlLmlkKS50aGVuKHZlcmlmeU91dGRhdGVkLmJpbmQodGhpcyxlbGVtZW50Tm9kZSkpO30KcmV0dXJuIHRoaXMuX2NvbXB1dGVkU3R5bGVQcm9taXNlO2Z1bmN0aW9uIHZlcmlmeU91dGRhdGVkKGVsZW1lbnROb2RlLHN0eWxlKXtyZXR1cm4gZWxlbWVudE5vZGU9PT10aGlzLl9lbGVtZW50Tm9kZSgpJiZzdHlsZT9uZXcgRWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsLkNvbXB1dGVkU3R5bGUoZWxlbWVudE5vZGUsc3R5bGUpOihudWxsKTt9fX07RWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsLkV2ZW50cz17Q29tcHV0ZWRTdHlsZUNoYW5nZWQ6U3ltYm9sKCdDb21wdXRlZFN0eWxlQ2hhbmdlZCcpfTtFbGVtZW50cy5Db21wdXRlZFN0eWxlTW9kZWwuQ29tcHV0ZWRTdHlsZT1jbGFzc3tjb25zdHJ1Y3Rvcihub2RlLGNvbXB1dGVkU3R5bGUpe3RoaXMubm9kZT1ub2RlO3RoaXMuY29tcHV0ZWRTdHlsZT1jb21wdXRlZFN0eWxlO319OztFbGVtZW50cy5ET01MaW5raWZpZXI9e307RWxlbWVudHMuRE9NTGlua2lmaWVyLmRlY29yYXRlTm9kZUxhYmVsPWZ1bmN0aW9uKG5vZGUscGFyZW50RWxlbWVudCx0b29sdGlwQ29udGVudCl7Y29uc3Qgb3JpZ2luYWxOb2RlPW5vZGU7Y29uc3QgaXNQc2V1ZG89bm9kZS5ub2RlVHlwZSgpPT09Tm9kZS5FTEVNRU5UX05PREUmJm5vZGUucHNldWRvVHlwZSgpO2lmKGlzUHNldWRvJiZub2RlLnBhcmVudE5vZGUpCm5vZGU9bm9kZS5wYXJlbnROb2RlO2xldCB0aXRsZT1ub2RlLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpO2NvbnN0IG5hbWVFbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdub2RlLWxhYmVsLW5hbWUnKTtuYW1lRWxlbWVudC50ZXh0Q29udGVudD10aXRsZTtjb25zdCBpZEF0dHJpYnV0ZT1ub2RlLmdldEF0dHJpYnV0ZSgnaWQnKTtpZihpZEF0dHJpYnV0ZSl7Y29uc3QgaWRFbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdub2RlLWxhYmVsLWlkJyk7Y29uc3QgcGFydD0nIycraWRBdHRyaWJ1dGU7dGl0bGUrPXBhcnQ7aWRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChwYXJ0KTtuYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdleHRyYScpO30KY29uc3QgY2xhc3NBdHRyaWJ1dGU9bm9kZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7aWYoY2xhc3NBdHRyaWJ1dGUpe2NvbnN0IGNsYXNzZXM9Y2xhc3NBdHRyaWJ1dGUuc3BsaXQoL1xzKy8pO2NvbnN0IGZvdW5kQ2xhc3Nlcz17fTtpZihjbGFzc2VzLmxlbmd0aCl7Y29uc3QgY2xhc3Nlc0VsZW1lbnQ9cGFyZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2V4dHJhIG5vZGUtbGFiZWwtY2xhc3MnKTtmb3IobGV0IGk9MDtpPGNsYXNzZXMubGVuZ3RoOysraSl7Y29uc3QgY2xhc3NOYW1lPWNsYXNzZXNbaV07aWYoY2xhc3NOYW1lJiYhKGNsYXNzTmFtZSBpbiBmb3VuZENsYXNzZXMpKXtjb25zdCBwYXJ0PScuJytjbGFzc05hbWU7dGl0bGUrPXBhcnQ7Y2xhc3Nlc0VsZW1lbnQuY3JlYXRlVGV4dENoaWxkKHBhcnQpO2ZvdW5kQ2xhc3Nlc1tjbGFzc05hbWVdPXRydWU7fX19fQppZihpc1BzZXVkbyl7Y29uc3QgcHNldWRvRWxlbWVudD1wYXJlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnZXh0cmEgbm9kZS1sYWJlbC1wc2V1ZG8nKTtjb25zdCBwc2V1ZG9UZXh0PSc6Oicrb3JpZ2luYWxOb2RlLnBzZXVkb1R5cGUoKTtwc2V1ZG9FbGVtZW50LmNyZWF0ZVRleHRDaGlsZChwc2V1ZG9UZXh0KTt0aXRsZSs9cHNldWRvVGV4dDt9CnBhcmVudEVsZW1lbnQudGl0bGU9dG9vbHRpcENvbnRlbnR8fHRpdGxlO307RWxlbWVudHMuRE9NTGlua2lmaWVyLmxpbmtpZnlOb2RlUmVmZXJlbmNlPWZ1bmN0aW9uKG5vZGUsdG9vbHRpcENvbnRlbnQpe2lmKCFub2RlKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUoQ29tbW9uLlVJU3RyaW5nKCc8bm9kZT4nKSk7Y29uc3Qgcm9vdD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnbW9ub3NwYWNlJyk7Y29uc3Qgc2hhZG93Um9vdD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMocm9vdCwnZWxlbWVudHMvZG9tTGlua2lmaWVyLmNzcycpO2NvbnN0IGxpbms9c2hhZG93Um9vdC5jcmVhdGVDaGlsZCgnZGl2Jywnbm9kZS1saW5rJyk7RWxlbWVudHMuRE9NTGlua2lmaWVyLmRlY29yYXRlTm9kZUxhYmVsKG5vZGUsbGluayx0b29sdGlwQ29udGVudCk7bGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PkNvbW1vbi5SZXZlYWxlci5yZXZlYWwobm9kZSxmYWxzZSkmJmZhbHNlLGZhbHNlKTtsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3Zlcicsbm9kZS5oaWdobGlnaHQuYmluZChub2RlLHVuZGVmaW5lZCx1bmRlZmluZWQpLGZhbHNlKTtsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCgpPT5TREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCksZmFsc2UpO3JldHVybiByb290O307RWxlbWVudHMuRE9NTGlua2lmaWVyLmxpbmtpZnlEZWZlcnJlZE5vZGVSZWZlcmVuY2U9ZnVuY3Rpb24oZGVmZXJyZWROb2RlKXtjb25zdCByb290PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHJvb3QsJ2VsZW1lbnRzL2RvbUxpbmtpZmllci5jc3MnKTtjb25zdCBsaW5rPXNoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ25vZGUtbGluaycpO2xpbmsuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTtsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxkZWZlcnJlZE5vZGUucmVzb2x2ZS5iaW5kKGRlZmVycmVkTm9kZSxvbkRlZmVycmVkTm9kZVJlc29sdmVkKSxmYWxzZSk7bGluay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGU9PmUuY29uc3VtZSgpLGZhbHNlKTtmdW5jdGlvbiBvbkRlZmVycmVkTm9kZVJlc29sdmVkKG5vZGUpe0NvbW1vbi5SZXZlYWxlci5yZXZlYWwobm9kZSk7fQpyZXR1cm4gcm9vdDt9O0VsZW1lbnRzLkRPTUxpbmtpZmllci5MaW5raWZpZXI9Y2xhc3N7bGlua2lmeShvYmplY3Qsb3B0aW9ucyl7aWYob2JqZWN0IGluc3RhbmNlb2YgU0RLLkRPTU5vZGUpCnJldHVybiBFbGVtZW50cy5ET01MaW5raWZpZXIubGlua2lmeU5vZGVSZWZlcmVuY2Uob2JqZWN0LG9wdGlvbnM/b3B0aW9ucy50aXRsZTp1bmRlZmluZWQpO2lmKG9iamVjdCBpbnN0YW5jZW9mIFNESy5EZWZlcnJlZERPTU5vZGUpCnJldHVybiBFbGVtZW50cy5ET01MaW5raWZpZXIubGlua2lmeURlZmVycmVkTm9kZVJlZmVyZW5jZShvYmplY3QpO3Rocm93IG5ldyBFcnJvcignQ2FuXCd0IGxpbmtpZnkgbm9uLW5vZGUnKTt9fTs7RWxlbWVudHMuRE9NUGF0aD17fTtFbGVtZW50cy5ET01QYXRoLmZ1bGxRdWFsaWZpZWRTZWxlY3Rvcj1mdW5jdGlvbihub2RlLGp1c3RTZWxlY3Rvcil7aWYobm9kZS5ub2RlVHlwZSgpIT09Tm9kZS5FTEVNRU5UX05PREUpCnJldHVybiBub2RlLmxvY2FsTmFtZSgpfHxub2RlLm5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gRWxlbWVudHMuRE9NUGF0aC5jc3NQYXRoKG5vZGUsanVzdFNlbGVjdG9yKTt9O0VsZW1lbnRzLkRPTVBhdGguY3NzUGF0aD1mdW5jdGlvbihub2RlLG9wdGltaXplZCl7aWYobm9kZS5ub2RlVHlwZSgpIT09Tm9kZS5FTEVNRU5UX05PREUpCnJldHVybicnO2NvbnN0IHN0ZXBzPVtdO2xldCBjb250ZXh0Tm9kZT1ub2RlO3doaWxlKGNvbnRleHROb2RlKXtjb25zdCBzdGVwPUVsZW1lbnRzLkRPTVBhdGguX2Nzc1BhdGhTdGVwKGNvbnRleHROb2RlLCEhb3B0aW1pemVkLGNvbnRleHROb2RlPT09bm9kZSk7aWYoIXN0ZXApCmJyZWFrO3N0ZXBzLnB1c2goc3RlcCk7aWYoc3RlcC5vcHRpbWl6ZWQpCmJyZWFrO2NvbnRleHROb2RlPWNvbnRleHROb2RlLnBhcmVudE5vZGU7fQpzdGVwcy5yZXZlcnNlKCk7cmV0dXJuIHN0ZXBzLmpvaW4oJyA+ICcpO307RWxlbWVudHMuRE9NUGF0aC5fY3NzUGF0aFN0ZXA9ZnVuY3Rpb24obm9kZSxvcHRpbWl6ZWQsaXNUYXJnZXROb2RlKXtpZihub2RlLm5vZGVUeXBlKCkhPT1Ob2RlLkVMRU1FTlRfTk9ERSkKcmV0dXJuIG51bGw7Y29uc3QgaWQ9bm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7aWYob3B0aW1pemVkKXtpZihpZCkKcmV0dXJuIG5ldyBFbGVtZW50cy5ET01QYXRoLlN0ZXAoaWRTZWxlY3RvcihpZCksdHJ1ZSk7Y29uc3Qgbm9kZU5hbWVMb3dlcj1ub2RlLm5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKTtpZihub2RlTmFtZUxvd2VyPT09J2JvZHknfHxub2RlTmFtZUxvd2VyPT09J2hlYWQnfHxub2RlTmFtZUxvd2VyPT09J2h0bWwnKQpyZXR1cm4gbmV3IEVsZW1lbnRzLkRPTVBhdGguU3RlcChub2RlLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpLHRydWUpO30KY29uc3Qgbm9kZU5hbWU9bm9kZS5ub2RlTmFtZUluQ29ycmVjdENhc2UoKTtpZihpZCkKcmV0dXJuIG5ldyBFbGVtZW50cy5ET01QYXRoLlN0ZXAobm9kZU5hbWUraWRTZWxlY3RvcihpZCksdHJ1ZSk7Y29uc3QgcGFyZW50PW5vZGUucGFyZW50Tm9kZTtpZighcGFyZW50fHxwYXJlbnQubm9kZVR5cGUoKT09PU5vZGUuRE9DVU1FTlRfTk9ERSkKcmV0dXJuIG5ldyBFbGVtZW50cy5ET01QYXRoLlN0ZXAobm9kZU5hbWUsdHJ1ZSk7ZnVuY3Rpb24gcHJlZml4ZWRFbGVtZW50Q2xhc3NOYW1lcyhub2RlKXtjb25zdCBjbGFzc0F0dHJpYnV0ZT1ub2RlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKTtpZighY2xhc3NBdHRyaWJ1dGUpCnJldHVybltdO3JldHVybiBjbGFzc0F0dHJpYnV0ZS5zcGxpdCgvXHMrL2cpLmZpbHRlcihCb29sZWFuKS5tYXAoZnVuY3Rpb24obmFtZSl7cmV0dXJuJyQnK25hbWU7fSk7fQpmdW5jdGlvbiBpZFNlbGVjdG9yKGlkKXtyZXR1cm4nIycrZXNjYXBlSWRlbnRpZmllcklmTmVlZGVkKGlkKTt9CmZ1bmN0aW9uIGVzY2FwZUlkZW50aWZpZXJJZk5lZWRlZChpZGVudCl7aWYoaXNDU1NJZGVudGlmaWVyKGlkZW50KSkKcmV0dXJuIGlkZW50O2NvbnN0IHNob3VsZEVzY2FwZUZpcnN0PS9eKD86WzAtOV18LVswLTktXT8pLy50ZXN0KGlkZW50KTtjb25zdCBsYXN0SW5kZXg9aWRlbnQubGVuZ3RoLTE7cmV0dXJuIGlkZW50LnJlcGxhY2UoLy4vZyxmdW5jdGlvbihjLGkpe3JldHVybigoc2hvdWxkRXNjYXBlRmlyc3QmJmk9PT0wKXx8IWlzQ1NTSWRlbnRDaGFyKGMpKT9lc2NhcGVBc2NpaUNoYXIoYyxpPT09bGFzdEluZGV4KTpjO30pO30KZnVuY3Rpb24gZXNjYXBlQXNjaWlDaGFyKGMsaXNMYXN0KXtyZXR1cm4nXFwnK3RvSGV4Qnl0ZShjKSsoaXNMYXN0PycnOicgJyk7fQpmdW5jdGlvbiB0b0hleEJ5dGUoYyl7bGV0IGhleEJ5dGU9Yy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtpZihoZXhCeXRlLmxlbmd0aD09PTEpCmhleEJ5dGU9JzAnK2hleEJ5dGU7cmV0dXJuIGhleEJ5dGU7fQpmdW5jdGlvbiBpc0NTU0lkZW50Q2hhcihjKXtpZigvW2EtekEtWjAtOV8tXS8udGVzdChjKSkKcmV0dXJuIHRydWU7cmV0dXJuIGMuY2hhckNvZGVBdCgwKT49MHhBMDt9CmZ1bmN0aW9uIGlzQ1NTSWRlbnRpZmllcih2YWx1ZSl7cmV0dXJuL14tezAsMn1bYS16QS1aX11bYS16QS1aMC05Xy1dKiQvLnRlc3QodmFsdWUpO30KY29uc3QgcHJlZml4ZWRPd25DbGFzc05hbWVzQXJyYXk9cHJlZml4ZWRFbGVtZW50Q2xhc3NOYW1lcyhub2RlKTtsZXQgbmVlZHNDbGFzc05hbWVzPWZhbHNlO2xldCBuZWVkc050aENoaWxkPWZhbHNlO2xldCBvd25JbmRleD0tMTtsZXQgZWxlbWVudEluZGV4PS0xO2NvbnN0IHNpYmxpbmdzPXBhcmVudC5jaGlsZHJlbigpO2ZvcihsZXQgaT0wOyhvd25JbmRleD09PS0xfHwhbmVlZHNOdGhDaGlsZCkmJmk8c2libGluZ3MubGVuZ3RoOysraSl7Y29uc3Qgc2libGluZz1zaWJsaW5nc1tpXTtpZihzaWJsaW5nLm5vZGVUeXBlKCkhPT1Ob2RlLkVMRU1FTlRfTk9ERSkKY29udGludWU7ZWxlbWVudEluZGV4Kz0xO2lmKHNpYmxpbmc9PT1ub2RlKXtvd25JbmRleD1lbGVtZW50SW5kZXg7Y29udGludWU7fQppZihuZWVkc050aENoaWxkKQpjb250aW51ZTtpZihzaWJsaW5nLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpIT09bm9kZU5hbWUpCmNvbnRpbnVlO25lZWRzQ2xhc3NOYW1lcz10cnVlO2NvbnN0IG93bkNsYXNzTmFtZXM9bmV3IFNldChwcmVmaXhlZE93bkNsYXNzTmFtZXNBcnJheSk7aWYoIW93bkNsYXNzTmFtZXMuc2l6ZSl7bmVlZHNOdGhDaGlsZD10cnVlO2NvbnRpbnVlO30KY29uc3Qgc2libGluZ0NsYXNzTmFtZXNBcnJheT1wcmVmaXhlZEVsZW1lbnRDbGFzc05hbWVzKHNpYmxpbmcpO2ZvcihsZXQgaj0wO2o8c2libGluZ0NsYXNzTmFtZXNBcnJheS5sZW5ndGg7KytqKXtjb25zdCBzaWJsaW5nQ2xhc3M9c2libGluZ0NsYXNzTmFtZXNBcnJheVtqXTtpZighb3duQ2xhc3NOYW1lcy5oYXMoc2libGluZ0NsYXNzKSkKY29udGludWU7b3duQ2xhc3NOYW1lcy5kZWxldGUoc2libGluZ0NsYXNzKTtpZighb3duQ2xhc3NOYW1lcy5zaXplKXtuZWVkc050aENoaWxkPXRydWU7YnJlYWs7fX19CmxldCByZXN1bHQ9bm9kZU5hbWU7aWYoaXNUYXJnZXROb2RlJiZub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09J2lucHV0JyYmbm9kZS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSYmIW5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpJiYhbm9kZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpCnJlc3VsdCs9J1t0eXBlPSInK25vZGUuZ2V0QXR0cmlidXRlKCd0eXBlJykrJyJdJztpZihuZWVkc050aENoaWxkKXtyZXN1bHQrPSc6bnRoLWNoaWxkKCcrKG93bkluZGV4KzEpKycpJzt9ZWxzZSBpZihuZWVkc0NsYXNzTmFtZXMpe2Zvcihjb25zdCBwcmVmaXhlZE5hbWUgb2YgcHJlZml4ZWRPd25DbGFzc05hbWVzQXJyYXkpCnJlc3VsdCs9Jy4nK2VzY2FwZUlkZW50aWZpZXJJZk5lZWRlZChwcmVmaXhlZE5hbWUuc3Vic3RyKDEpKTt9CnJldHVybiBuZXcgRWxlbWVudHMuRE9NUGF0aC5TdGVwKHJlc3VsdCxmYWxzZSk7fTtFbGVtZW50cy5ET01QYXRoLnhQYXRoPWZ1bmN0aW9uKG5vZGUsb3B0aW1pemVkKXtpZihub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkRPQ1VNRU5UX05PREUpCnJldHVybicvJztjb25zdCBzdGVwcz1bXTtsZXQgY29udGV4dE5vZGU9bm9kZTt3aGlsZShjb250ZXh0Tm9kZSl7Y29uc3Qgc3RlcD1FbGVtZW50cy5ET01QYXRoLl94UGF0aFZhbHVlKGNvbnRleHROb2RlLG9wdGltaXplZCk7aWYoIXN0ZXApCmJyZWFrO3N0ZXBzLnB1c2goc3RlcCk7aWYoc3RlcC5vcHRpbWl6ZWQpCmJyZWFrO2NvbnRleHROb2RlPWNvbnRleHROb2RlLnBhcmVudE5vZGU7fQpzdGVwcy5yZXZlcnNlKCk7cmV0dXJuKHN0ZXBzLmxlbmd0aCYmc3RlcHNbMF0ub3B0aW1pemVkPycnOicvJykrc3RlcHMuam9pbignLycpO307RWxlbWVudHMuRE9NUGF0aC5feFBhdGhWYWx1ZT1mdW5jdGlvbihub2RlLG9wdGltaXplZCl7bGV0IG93blZhbHVlO2NvbnN0IG93bkluZGV4PUVsZW1lbnRzLkRPTVBhdGguX3hQYXRoSW5kZXgobm9kZSk7aWYob3duSW5kZXg9PT0tMSkKcmV0dXJuIG51bGw7c3dpdGNoKG5vZGUubm9kZVR5cGUoKSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTppZihvcHRpbWl6ZWQmJm5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpKQpyZXR1cm4gbmV3IEVsZW1lbnRzLkRPTVBhdGguU3RlcCgnLy8qW0BpZD0iJytub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSsnIl0nLHRydWUpO293blZhbHVlPW5vZGUubG9jYWxOYW1lKCk7YnJlYWs7Y2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFOm93blZhbHVlPSdAJytub2RlLm5vZGVOYW1lKCk7YnJlYWs7Y2FzZSBOb2RlLlRFWFRfTk9ERTpjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOm93blZhbHVlPSd0ZXh0KCknO2JyZWFrO2Nhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6b3duVmFsdWU9J3Byb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oKSc7YnJlYWs7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpvd25WYWx1ZT0nY29tbWVudCgpJzticmVhaztjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTpvd25WYWx1ZT0nJzticmVhaztkZWZhdWx0Om93blZhbHVlPScnO2JyZWFrO30KaWYob3duSW5kZXg+MCkKb3duVmFsdWUrPSdbJytvd25JbmRleCsnXSc7cmV0dXJuIG5ldyBFbGVtZW50cy5ET01QYXRoLlN0ZXAob3duVmFsdWUsbm9kZS5ub2RlVHlwZSgpPT09Tm9kZS5ET0NVTUVOVF9OT0RFKTt9O0VsZW1lbnRzLkRPTVBhdGguX3hQYXRoSW5kZXg9ZnVuY3Rpb24obm9kZSl7ZnVuY3Rpb24gYXJlTm9kZXNTaW1pbGFyKGxlZnQscmlnaHQpe2lmKGxlZnQ9PT1yaWdodCkKcmV0dXJuIHRydWU7aWYobGVmdC5ub2RlVHlwZSgpPT09Tm9kZS5FTEVNRU5UX05PREUmJnJpZ2h0Lm5vZGVUeXBlKCk9PT1Ob2RlLkVMRU1FTlRfTk9ERSkKcmV0dXJuIGxlZnQubG9jYWxOYW1lKCk9PT1yaWdodC5sb2NhbE5hbWUoKTtpZihsZWZ0Lm5vZGVUeXBlKCk9PT1yaWdodC5ub2RlVHlwZSgpKQpyZXR1cm4gdHJ1ZTtjb25zdCBsZWZ0VHlwZT1sZWZ0Lm5vZGVUeXBlKCk9PT1Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERT9Ob2RlLlRFWFRfTk9ERTpsZWZ0Lm5vZGVUeXBlKCk7Y29uc3QgcmlnaHRUeXBlPXJpZ2h0Lm5vZGVUeXBlKCk9PT1Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERT9Ob2RlLlRFWFRfTk9ERTpyaWdodC5ub2RlVHlwZSgpO3JldHVybiBsZWZ0VHlwZT09PXJpZ2h0VHlwZTt9CmNvbnN0IHNpYmxpbmdzPW5vZGUucGFyZW50Tm9kZT9ub2RlLnBhcmVudE5vZGUuY2hpbGRyZW4oKTpudWxsO2lmKCFzaWJsaW5ncykKcmV0dXJuIDA7bGV0IGhhc1NhbWVOYW1lZEVsZW1lbnRzO2ZvcihsZXQgaT0wO2k8c2libGluZ3MubGVuZ3RoOysraSl7aWYoYXJlTm9kZXNTaW1pbGFyKG5vZGUsc2libGluZ3NbaV0pJiZzaWJsaW5nc1tpXSE9PW5vZGUpe2hhc1NhbWVOYW1lZEVsZW1lbnRzPXRydWU7YnJlYWs7fX0KaWYoIWhhc1NhbWVOYW1lZEVsZW1lbnRzKQpyZXR1cm4gMDtsZXQgb3duSW5kZXg9MTtmb3IobGV0IGk9MDtpPHNpYmxpbmdzLmxlbmd0aDsrK2kpe2lmKGFyZU5vZGVzU2ltaWxhcihub2RlLHNpYmxpbmdzW2ldKSl7aWYoc2libGluZ3NbaV09PT1ub2RlKQpyZXR1cm4gb3duSW5kZXg7Kytvd25JbmRleDt9fQpyZXR1cm4tMTt9O0VsZW1lbnRzLkRPTVBhdGguU3RlcD1jbGFzc3tjb25zdHJ1Y3Rvcih2YWx1ZSxvcHRpbWl6ZWQpe3RoaXMudmFsdWU9dmFsdWU7dGhpcy5vcHRpbWl6ZWQ9b3B0aW1pemVkfHxmYWxzZTt9CnRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudmFsdWU7fX07O0VsZW1lbnRzLkVsZW1lbnRzQnJlYWRjcnVtYnM9Y2xhc3MgZXh0ZW5kcyBVSS5IQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9icmVhZGNydW1icy5jc3MnKTt0aGlzLmNydW1ic0VsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY3J1bWJzJyk7dGhpcy5jcnVtYnNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fbW91c2VNb3ZlZEluQ3J1bWJzLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuY3J1bWJzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9tb3VzZU1vdmVkT3V0T2ZDcnVtYnMuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbm9kZVN5bWJvbD1TeW1ib2woJ25vZGUnKTt9Cndhc1Nob3duKCl7dGhpcy51cGRhdGUoKTt9CnVwZGF0ZU5vZGVzKG5vZGVzKXtpZighbm9kZXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgY3J1bWJzPXRoaXMuY3J1bWJzRWxlbWVudDtmb3IobGV0IGNydW1iPWNydW1icy5maXJzdENoaWxkO2NydW1iO2NydW1iPWNydW1iLm5leHRTaWJsaW5nKXtpZihub2Rlcy5pbmRleE9mKGNydW1iW3RoaXMuX25vZGVTeW1ib2xdKSE9PS0xKXt0aGlzLnVwZGF0ZSh0cnVlKTtyZXR1cm47fX19CnNldFNlbGVjdGVkTm9kZShub2RlKXt0aGlzLl9jdXJyZW50RE9NTm9kZT1ub2RlO3RoaXMuY3J1bWJzRWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlKCkpO30KX21vdXNlTW92ZWRJbkNydW1icyhldmVudCl7Y29uc3Qgbm9kZVVuZGVyTW91c2U9ZXZlbnQudGFyZ2V0O2NvbnN0IGNydW1iRWxlbWVudD1ub2RlVW5kZXJNb3VzZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdjcnVtYicpO2NvbnN0IG5vZGU9KGNydW1iRWxlbWVudD9jcnVtYkVsZW1lbnRbdGhpcy5fbm9kZVN5bWJvbF06bnVsbCk7aWYobm9kZSkKbm9kZS5oaWdobGlnaHQoKTt9Cl9tb3VzZU1vdmVkT3V0T2ZDcnVtYnMoZXZlbnQpe2lmKHRoaXMuX2N1cnJlbnRET01Ob2RlKQpTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7fQpfb25DbGlja0NydW1iKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2xldCBjcnVtYj0oZXZlbnQuY3VycmVudFRhcmdldCk7aWYoIWNydW1iLmNsYXNzTGlzdC5jb250YWlucygnY29sbGFwc2VkJykpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEVsZW1lbnRzLkVsZW1lbnRzQnJlYWRjcnVtYnMuRXZlbnRzLk5vZGVTZWxlY3RlZCxjcnVtYlt0aGlzLl9ub2RlU3ltYm9sXSk7cmV0dXJuO30KaWYoY3J1bWI9PT10aGlzLmNydW1ic0VsZW1lbnQuZmlyc3RDaGlsZCl7bGV0IGN1cnJlbnRDcnVtYj1jcnVtYjt3aGlsZShjdXJyZW50Q3J1bWIpe2NvbnN0IGhpZGRlbj1jdXJyZW50Q3J1bWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKTtjb25zdCBjb2xsYXBzZWQ9Y3VycmVudENydW1iLmNsYXNzTGlzdC5jb250YWlucygnY29sbGFwc2VkJyk7aWYoIWhpZGRlbiYmIWNvbGxhcHNlZCkKYnJlYWs7Y3J1bWI9Y3VycmVudENydW1iO2N1cnJlbnRDcnVtYj1jdXJyZW50Q3J1bWIubmV4dFNpYmxpbmdFbGVtZW50O319CnRoaXMudXBkYXRlU2l6ZXMoY3J1bWIpO30KX2RldGVybWluZUVsZW1lbnRUaXRsZShkb21Ob2RlKXtzd2l0Y2goZG9tTm9kZS5ub2RlVHlwZSgpKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmlmKGRvbU5vZGUucHNldWRvVHlwZSgpKQpyZXR1cm4nOjonK2RvbU5vZGUucHNldWRvVHlwZSgpO3JldHVybiBudWxsO2Nhc2UgTm9kZS5URVhUX05PREU6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnKHRleHQpJyk7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpyZXR1cm4nPCEtLT4nO2Nhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6cmV0dXJuJzwhZG9jdHlwZT4nO2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOnJldHVybiBkb21Ob2RlLnNoYWRvd1Jvb3RUeXBlKCk/JyNzaGFkb3ctcm9vdCc6ZG9tTm9kZS5ub2RlTmFtZUluQ29ycmVjdENhc2UoKTtkZWZhdWx0OnJldHVybiBkb21Ob2RlLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpO319CnVwZGF0ZShmb3JjZSl7aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtjb25zdCBjdXJyZW50RE9NTm9kZT10aGlzLl9jdXJyZW50RE9NTm9kZTtjb25zdCBjcnVtYnM9dGhpcy5jcnVtYnNFbGVtZW50O2xldCBoYW5kbGVkPWZhbHNlO2xldCBjcnVtYj1jcnVtYnMuZmlyc3RDaGlsZDt3aGlsZShjcnVtYil7aWYoY3J1bWJbdGhpcy5fbm9kZVN5bWJvbF09PT1jdXJyZW50RE9NTm9kZSl7Y3J1bWIuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtoYW5kbGVkPXRydWU7fWVsc2V7Y3J1bWIuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTt9CmNydW1iPWNydW1iLm5leHRTaWJsaW5nO30KaWYoaGFuZGxlZCYmIWZvcmNlKXt0aGlzLnVwZGF0ZVNpemVzKCk7cmV0dXJuO30KY3J1bWJzLnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGxldCBjdXJyZW50PWN1cnJlbnRET01Ob2RlO2N1cnJlbnQ7Y3VycmVudD1jdXJyZW50LnBhcmVudE5vZGUpe2lmKGN1cnJlbnQubm9kZVR5cGUoKT09PU5vZGUuRE9DVU1FTlRfTk9ERSkKY29udGludWU7Y3J1bWI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2NydW1iJyk7Y3J1bWJbdGhpcy5fbm9kZVN5bWJvbF09Y3VycmVudDtjcnVtYi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX29uQ2xpY2tDcnVtYi5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCBjcnVtYlRpdGxlPXRoaXMuX2RldGVybWluZUVsZW1lbnRUaXRsZShjdXJyZW50KTtpZihjcnVtYlRpdGxlKXtjb25zdCBuYW1lRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9Y3J1bWJUaXRsZTtjcnVtYi5hcHBlbmRDaGlsZChuYW1lRWxlbWVudCk7Y3J1bWIudGl0bGU9Y3J1bWJUaXRsZTt9ZWxzZXtFbGVtZW50cy5ET01MaW5raWZpZXIuZGVjb3JhdGVOb2RlTGFiZWwoY3VycmVudCxjcnVtYik7fQppZihjdXJyZW50PT09Y3VycmVudERPTU5vZGUpCmNydW1iLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7Y3J1bWJzLmluc2VydEJlZm9yZShjcnVtYixjcnVtYnMuZmlyc3RDaGlsZCk7fQp0aGlzLnVwZGF0ZVNpemVzKCk7fQpfcmVzZXRDcnVtYlN0eWxlc0FuZEZpbmRTZWxlY3Rpb25zKGZvY3VzZWRDcnVtYil7Y29uc3QgY3J1bWJzPXRoaXMuY3J1bWJzRWxlbWVudDtsZXQgc2VsZWN0ZWRJbmRleD0wO2xldCBmb2N1c2VkSW5kZXg9MDtsZXQgc2VsZWN0ZWRDcnVtYj1udWxsO2ZvcihsZXQgaT0wO2k8Y3J1bWJzLmNoaWxkTm9kZXMubGVuZ3RoOysraSl7Y29uc3QgY3J1bWI9Y3J1bWJzLmNoaWxkcmVuW2ldO2lmKCFzZWxlY3RlZENydW1iJiZjcnVtYi5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkJykpe3NlbGVjdGVkQ3J1bWI9Y3J1bWI7c2VsZWN0ZWRJbmRleD1pO30KaWYoY3J1bWI9PT1mb2N1c2VkQ3J1bWIpCmZvY3VzZWRJbmRleD1pO2NydW1iLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbXBhY3QnLCdjb2xsYXBzZWQnLCdoaWRkZW4nKTt9CnJldHVybntzZWxlY3RlZEluZGV4OnNlbGVjdGVkSW5kZXgsZm9jdXNlZEluZGV4OmZvY3VzZWRJbmRleCxzZWxlY3RlZENydW1iOnNlbGVjdGVkQ3J1bWJ9O30KX21lYXN1cmVFbGVtZW50U2l6ZXMoKXtjb25zdCBjcnVtYnM9dGhpcy5jcnVtYnNFbGVtZW50O2NvbnN0IGNvbGxhcHNlZEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2NydW1iIGNvbGxhcHNlZCcpO2NydW1icy5pbnNlcnRCZWZvcmUoY29sbGFwc2VkRWxlbWVudCxjcnVtYnMuZmlyc3RDaGlsZCk7Y29uc3QgYXZhaWxhYmxlPWNydW1icy5vZmZzZXRXaWR0aDtjb25zdCBjb2xsYXBzZWQ9Y29sbGFwc2VkRWxlbWVudC5vZmZzZXRXaWR0aDtjb25zdCBub3JtYWxTaXplcz1bXTtmb3IobGV0IGk9MTtpPGNydW1icy5jaGlsZE5vZGVzLmxlbmd0aDsrK2kpe2NvbnN0IGNydW1iPWNydW1icy5jaGlsZE5vZGVzW2ldO25vcm1hbFNpemVzW2ktMV09Y3J1bWIub2Zmc2V0V2lkdGg7fQpjcnVtYnMucmVtb3ZlQ2hpbGQoY29sbGFwc2VkRWxlbWVudCk7Y29uc3QgY29tcGFjdFNpemVzPVtdO2ZvcihsZXQgaT0wO2k8Y3J1bWJzLmNoaWxkTm9kZXMubGVuZ3RoOysraSl7Y29uc3QgY3J1bWI9Y3J1bWJzLmNoaWxkTm9kZXNbaV07Y3J1bWIuY2xhc3NMaXN0LmFkZCgnY29tcGFjdCcpO30KZm9yKGxldCBpPTA7aTxjcnVtYnMuY2hpbGROb2Rlcy5sZW5ndGg7KytpKXtjb25zdCBjcnVtYj1jcnVtYnMuY2hpbGROb2Rlc1tpXTtjb21wYWN0U2l6ZXNbaV09Y3J1bWIub2Zmc2V0V2lkdGg7fQpmb3IobGV0IGk9MDtpPGNydW1icy5jaGlsZE5vZGVzLmxlbmd0aDsrK2kpe2NvbnN0IGNydW1iPWNydW1icy5jaGlsZE5vZGVzW2ldO2NydW1iLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbXBhY3QnLCdjb2xsYXBzZWQnKTt9CnJldHVybntub3JtYWw6bm9ybWFsU2l6ZXMsY29tcGFjdDpjb21wYWN0U2l6ZXMsY29sbGFwc2VkOmNvbGxhcHNlZCxhdmFpbGFibGU6YXZhaWxhYmxlfTt9CnVwZGF0ZVNpemVzKGZvY3VzZWRDcnVtYil7aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtjb25zdCBjcnVtYnM9dGhpcy5jcnVtYnNFbGVtZW50O2lmKCFjcnVtYnMuZmlyc3RDaGlsZCkKcmV0dXJuO2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5fcmVzZXRDcnVtYlN0eWxlc0FuZEZpbmRTZWxlY3Rpb25zKGZvY3VzZWRDcnVtYik7Y29uc3Qgc2l6ZXM9dGhpcy5fbWVhc3VyZUVsZW1lbnRTaXplcygpO2NvbnN0IHNlbGVjdGVkSW5kZXg9c2VsZWN0aW9ucy5zZWxlY3RlZEluZGV4O2NvbnN0IGZvY3VzZWRJbmRleD1zZWxlY3Rpb25zLmZvY3VzZWRJbmRleDtjb25zdCBzZWxlY3RlZENydW1iPXNlbGVjdGlvbnMuc2VsZWN0ZWRDcnVtYjtmdW5jdGlvbiBjcnVtYnNBcmVTbWFsbGVyVGhhbkNvbnRhaW5lcigpe2xldCB0b3RhbFNpemU9MDtmb3IobGV0IGk9MDtpPGNydW1icy5jaGlsZE5vZGVzLmxlbmd0aDsrK2kpe2NvbnN0IGNydW1iPWNydW1icy5jaGlsZE5vZGVzW2ldO2lmKGNydW1iLmNsYXNzTGlzdC5jb250YWlucygnaGlkZGVuJykpCmNvbnRpbnVlO2lmKGNydW1iLmNsYXNzTGlzdC5jb250YWlucygnY29sbGFwc2VkJykpe3RvdGFsU2l6ZSs9c2l6ZXMuY29sbGFwc2VkO2NvbnRpbnVlO30KdG90YWxTaXplKz1jcnVtYi5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbXBhY3QnKT9zaXplcy5jb21wYWN0W2ldOnNpemVzLm5vcm1hbFtpXTt9CmNvbnN0IHJpZ2h0UGFkZGluZz0xMDtyZXR1cm4gdG90YWxTaXplK3JpZ2h0UGFkZGluZzxzaXplcy5hdmFpbGFibGU7fQppZihjcnVtYnNBcmVTbWFsbGVyVGhhbkNvbnRhaW5lcigpKQpyZXR1cm47Y29uc3QgQm90aFNpZGVzPTA7Y29uc3QgQW5jZXN0b3JTaWRlPS0xO2NvbnN0IENoaWxkU2lkZT0xO2Z1bmN0aW9uIG1ha2VDcnVtYnNTbWFsbGVyKHNocmlua2luZ0Z1bmN0aW9uLGRpcmVjdGlvbil7Y29uc3Qgc2lnbmlmaWNhbnRDcnVtYj1mb2N1c2VkQ3J1bWJ8fHNlbGVjdGVkQ3J1bWI7Y29uc3Qgc2lnbmlmaWNhbnRJbmRleD1zaWduaWZpY2FudENydW1iPT09c2VsZWN0ZWRDcnVtYj9zZWxlY3RlZEluZGV4OmZvY3VzZWRJbmRleDtmdW5jdGlvbiBzaHJpbmtDcnVtYkF0SW5kZXgoaW5kZXgpe2NvbnN0IHNocmlua0NydW1iPWNydW1icy5jaGlsZHJlbltpbmRleF07aWYoc2hyaW5rQ3J1bWImJnNocmlua0NydW1iIT09c2lnbmlmaWNhbnRDcnVtYikKc2hyaW5raW5nRnVuY3Rpb24oc2hyaW5rQ3J1bWIpO2lmKGNydW1ic0FyZVNtYWxsZXJUaGFuQ29udGFpbmVyKCkpCnJldHVybiB0cnVlO3JldHVybiBmYWxzZTt9CmlmKGRpcmVjdGlvbil7bGV0IGluZGV4PShkaXJlY3Rpb24+MD8wOmNydW1icy5jaGlsZE5vZGVzLmxlbmd0aC0xKTt3aGlsZShpbmRleCE9PXNpZ25pZmljYW50SW5kZXgpe2lmKHNocmlua0NydW1iQXRJbmRleChpbmRleCkpCnJldHVybiB0cnVlO2luZGV4Kz0oZGlyZWN0aW9uPjA/MTotMSk7fX1lbHNle2xldCBzdGFydEluZGV4PTA7bGV0IGVuZEluZGV4PWNydW1icy5jaGlsZE5vZGVzLmxlbmd0aC0xO3doaWxlKHN0YXJ0SW5kZXghPT1zaWduaWZpY2FudEluZGV4fHxlbmRJbmRleCE9PXNpZ25pZmljYW50SW5kZXgpe2NvbnN0IHN0YXJ0RGlzdGFuY2U9c2lnbmlmaWNhbnRJbmRleC1zdGFydEluZGV4O2NvbnN0IGVuZERpc3RhbmNlPWVuZEluZGV4LXNpZ25pZmljYW50SW5kZXg7bGV0IGluZGV4O2lmKHN0YXJ0RGlzdGFuY2U+PWVuZERpc3RhbmNlKQppbmRleD1zdGFydEluZGV4Kys7ZWxzZQppbmRleD1lbmRJbmRleC0tO2lmKHNocmlua0NydW1iQXRJbmRleChpbmRleCkpCnJldHVybiB0cnVlO319CnJldHVybiBmYWxzZTt9CmZ1bmN0aW9uIGNvYWxlc2NlQ29sbGFwc2VkQ3J1bWJzKCl7bGV0IGNydW1iPWNydW1icy5maXJzdENoaWxkO2xldCBjb2xsYXBzZWRSdW49ZmFsc2U7bGV0IG5ld1N0YXJ0TmVlZGVkPWZhbHNlO2xldCBuZXdFbmROZWVkZWQ9ZmFsc2U7d2hpbGUoY3J1bWIpe2NvbnN0IGhpZGRlbj1jcnVtYi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpO2lmKCFoaWRkZW4pe2NvbnN0IGNvbGxhcHNlZD1jcnVtYi5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbGxhcHNlZCcpO2lmKGNvbGxhcHNlZFJ1biYmY29sbGFwc2VkKXtjcnVtYi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtjcnVtYi5jbGFzc0xpc3QucmVtb3ZlKCdjb21wYWN0Jyk7Y3J1bWIuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7aWYoY3J1bWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzdGFydCcpKXtjcnVtYi5jbGFzc0xpc3QucmVtb3ZlKCdzdGFydCcpO25ld1N0YXJ0TmVlZGVkPXRydWU7fQppZihjcnVtYi5jbGFzc0xpc3QuY29udGFpbnMoJ2VuZCcpKXtjcnVtYi5jbGFzc0xpc3QucmVtb3ZlKCdlbmQnKTtuZXdFbmROZWVkZWQ9dHJ1ZTt9CmNvbnRpbnVlO30KY29sbGFwc2VkUnVuPWNvbGxhcHNlZDtpZihuZXdFbmROZWVkZWQpe25ld0VuZE5lZWRlZD1mYWxzZTtjcnVtYi5jbGFzc0xpc3QuYWRkKCdlbmQnKTt9fWVsc2V7Y29sbGFwc2VkUnVuPXRydWU7fQpjcnVtYj1jcnVtYi5uZXh0U2libGluZzt9CmlmKG5ld1N0YXJ0TmVlZGVkKXtjcnVtYj1jcnVtYnMubGFzdENoaWxkO3doaWxlKGNydW1iKXtpZighY3J1bWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSl7Y3J1bWIuY2xhc3NMaXN0LmFkZCgnc3RhcnQnKTticmVhazt9CmNydW1iPWNydW1iLnByZXZpb3VzU2libGluZzt9fX0KZnVuY3Rpb24gY29tcGFjdChjcnVtYil7aWYoY3J1bWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSkKcmV0dXJuO2NydW1iLmNsYXNzTGlzdC5hZGQoJ2NvbXBhY3QnKTt9CmZ1bmN0aW9uIGNvbGxhcHNlKGNydW1iLGRvbnRDb2FsZXNjZSl7aWYoY3J1bWIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSkKcmV0dXJuO2NydW1iLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlZCcpO2NydW1iLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbXBhY3QnKTtpZighZG9udENvYWxlc2NlKQpjb2FsZXNjZUNvbGxhcHNlZENydW1icygpO30KaWYoIWZvY3VzZWRDcnVtYil7aWYobWFrZUNydW1ic1NtYWxsZXIoY29tcGFjdCxDaGlsZFNpZGUpKQpyZXR1cm47aWYobWFrZUNydW1ic1NtYWxsZXIoY29sbGFwc2UsQ2hpbGRTaWRlKSkKcmV0dXJuO30KaWYobWFrZUNydW1ic1NtYWxsZXIoY29tcGFjdCxmb2N1c2VkQ3J1bWI/Qm90aFNpZGVzOkFuY2VzdG9yU2lkZSkpCnJldHVybjtpZihtYWtlQ3J1bWJzU21hbGxlcihjb2xsYXBzZSxmb2N1c2VkQ3J1bWI/Qm90aFNpZGVzOkFuY2VzdG9yU2lkZSkpCnJldHVybjtpZighc2VsZWN0ZWRDcnVtYikKcmV0dXJuO2NvbXBhY3Qoc2VsZWN0ZWRDcnVtYik7aWYoY3J1bWJzQXJlU21hbGxlclRoYW5Db250YWluZXIoKSkKcmV0dXJuO2NvbGxhcHNlKHNlbGVjdGVkQ3J1bWIsdHJ1ZSk7fX07RWxlbWVudHMuRWxlbWVudHNCcmVhZGNydW1icy5FdmVudHM9e05vZGVTZWxlY3RlZDpTeW1ib2woJ05vZGVTZWxlY3RlZCcpfTs7RWxlbWVudHMuRWxlbWVudHNTaWRlYmFyUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxleC1ub25lJyk7dGhpcy5fY29tcHV0ZWRTdHlsZU1vZGVsPW5ldyBFbGVtZW50cy5Db21wdXRlZFN0eWxlTW9kZWwoKTt0aGlzLl9jb21wdXRlZFN0eWxlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihFbGVtZW50cy5Db21wdXRlZFN0eWxlTW9kZWwuRXZlbnRzLkNvbXB1dGVkU3R5bGVDaGFuZ2VkLHRoaXMub25DU1NNb2RlbENoYW5nZWQsdGhpcyk7dGhpcy5fdXBkYXRlVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDEwMCk7dGhpcy5fdXBkYXRlV2hlblZpc2libGU9ZmFsc2U7fQpub2RlKCl7cmV0dXJuIHRoaXMuX2NvbXB1dGVkU3R5bGVNb2RlbC5ub2RlKCk7fQpjc3NNb2RlbCgpe3JldHVybiB0aGlzLl9jb21wdXRlZFN0eWxlTW9kZWwuY3NzTW9kZWwoKTt9CmRvVXBkYXRlKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KdXBkYXRlKCl7dGhpcy5fdXBkYXRlV2hlblZpc2libGU9IXRoaXMuaXNTaG93aW5nKCk7aWYodGhpcy5fdXBkYXRlV2hlblZpc2libGUpCnJldHVybjt0aGlzLl91cGRhdGVUaHJvdHRsZXIuc2NoZWR1bGUoaW5uZXJVcGRhdGUuYmluZCh0aGlzKSk7ZnVuY3Rpb24gaW5uZXJVcGRhdGUoKXtyZXR1cm4gdGhpcy5pc1Nob3dpbmcoKT90aGlzLmRvVXBkYXRlKCk6UHJvbWlzZS5yZXNvbHZlKCk7fX0Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO2lmKHRoaXMuX3VwZGF0ZVdoZW5WaXNpYmxlKQp0aGlzLnVwZGF0ZSgpO30Kb25DU1NNb2RlbENoYW5nZWQoZXZlbnQpe319OztFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Iobm9kZSxlbGVtZW50Q2xvc2VUYWcpe3N1cGVyKCk7dGhpcy5fbm9kZT1ub2RlO3RoaXMuX2d1dHRlckNvbnRhaW5lcj10aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZ3V0dGVyLWNvbnRhaW5lcicpO3RoaXMuX2d1dHRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fc2hvd0NvbnRleHRNZW51LmJpbmQodGhpcykpO2NvbnN0IGd1dHRlck1lbnVJY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbWVudScsJ2d1dHRlci1tZW51LWljb24nKTt0aGlzLl9ndXR0ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoZ3V0dGVyTWVudUljb24pO3RoaXMuX2RlY29yYXRpb25zRWxlbWVudD10aGlzLl9ndXR0ZXJDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hpZGRlbicpO3RoaXMuX2VsZW1lbnRDbG9zZVRhZz1lbGVtZW50Q2xvc2VUYWc7aWYodGhpcy5fbm9kZS5ub2RlVHlwZSgpPT09Tm9kZS5FTEVNRU5UX05PREUmJiFlbGVtZW50Q2xvc2VUYWcpCnRoaXMuX2NhbkFkZEF0dHJpYnV0ZXM9dHJ1ZTt0aGlzLl9zZWFyY2hRdWVyeT1udWxsO3RoaXMuX2V4cGFuZGVkQ2hpbGRyZW5MaW1pdD1FbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkluaXRpYWxDaGlsZHJlbkxpbWl0O3RoaXMuX2RlY29yYXRpb25zVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDEwMCk7fQpzdGF0aWMgYW5pbWF0ZU9uRE9NVXBkYXRlKHRyZWVFbGVtZW50KXtjb25zdCB0YWdOYW1lPXRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2Via2l0LWh0bWwtdGFnLW5hbWUnKTtVSS5ydW5DU1NBbmltYXRpb25PbmNlKHRhZ05hbWV8fHRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudCwnZG9tLXVwZGF0ZS1oaWdobGlnaHQnKTt9CnN0YXRpYyB2aXNpYmxlU2hhZG93Um9vdHMobm9kZSl7bGV0IHJvb3RzPW5vZGUuc2hhZG93Um9vdHMoKTtpZihyb290cy5sZW5ndGgmJiFDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd1VBU2hhZG93RE9NJykuZ2V0KCkpCnJvb3RzPXJvb3RzLmZpbHRlcihmaWx0ZXIpO2Z1bmN0aW9uIGZpbHRlcihyb290KXtyZXR1cm4gcm9vdC5zaGFkb3dSb290VHlwZSgpIT09U0RLLkRPTU5vZGUuU2hhZG93Um9vdFR5cGVzLlVzZXJBZ2VudDt9CnJldHVybiByb290czt9CnN0YXRpYyBjYW5TaG93SW5saW5lVGV4dChub2RlKXtpZihub2RlLmNvbnRlbnREb2N1bWVudCgpfHxub2RlLmltcG9ydGVkRG9jdW1lbnQoKXx8bm9kZS50ZW1wbGF0ZUNvbnRlbnQoKXx8RWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudC52aXNpYmxlU2hhZG93Um9vdHMobm9kZSkubGVuZ3RofHxub2RlLmhhc1BzZXVkb0VsZW1lbnRzKCkpCnJldHVybiBmYWxzZTtpZihub2RlLm5vZGVUeXBlKCkhPT1Ob2RlLkVMRU1FTlRfTk9ERSkKcmV0dXJuIGZhbHNlO2lmKCFub2RlLmZpcnN0Q2hpbGR8fG5vZGUuZmlyc3RDaGlsZCE9PW5vZGUubGFzdENoaWxkfHxub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUoKSE9PU5vZGUuVEVYVF9OT0RFKQpyZXR1cm4gZmFsc2U7Y29uc3QgdGV4dENoaWxkPW5vZGUuZmlyc3RDaGlsZDtjb25zdCBtYXhJbmxpbmVUZXh0Q2hpbGRMZW5ndGg9ODA7aWYodGV4dENoaWxkLm5vZGVWYWx1ZSgpLmxlbmd0aDxtYXhJbmxpbmVUZXh0Q2hpbGRMZW5ndGgpCnJldHVybiB0cnVlO3JldHVybiBmYWxzZTt9CnN0YXRpYyBwb3B1bGF0ZUZvcmNlZFBzZXVkb1N0YXRlSXRlbXMoY29udGV4dE1lbnUsbm9kZSl7Y29uc3QgcHNldWRvQ2xhc3Nlcz1bJ2FjdGl2ZScsJ2hvdmVyJywnZm9jdXMnLCd2aXNpdGVkJywnZm9jdXMtd2l0aGluJ107dHJ5e2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJzpmb2N1cy12aXNpYmxlJyk7cHNldWRvQ2xhc3Nlcy5wdXNoKCdmb2N1cy12aXNpYmxlJyk7fWNhdGNoKGUpe30KY29uc3QgZm9yY2VkUHNldWRvU3RhdGU9bm9kZS5kb21Nb2RlbCgpLmNzc01vZGVsKCkucHNldWRvU3RhdGUobm9kZSk7Y29uc3Qgc3RhdGVNZW51PWNvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnRm9yY2Ugc3RhdGUnKSk7Zm9yKGxldCBpPTA7aTxwc2V1ZG9DbGFzc2VzLmxlbmd0aDsrK2kpe2NvbnN0IHBzZXVkb0NsYXNzRm9yY2VkPWZvcmNlZFBzZXVkb1N0YXRlLmluZGV4T2YocHNldWRvQ2xhc3Nlc1tpXSk+PTA7c3RhdGVNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKCc6Jytwc2V1ZG9DbGFzc2VzW2ldLHNldFBzZXVkb1N0YXRlQ2FsbGJhY2suYmluZChudWxsLHBzZXVkb0NsYXNzZXNbaV0sIXBzZXVkb0NsYXNzRm9yY2VkKSxwc2V1ZG9DbGFzc0ZvcmNlZCxmYWxzZSk7fQpmdW5jdGlvbiBzZXRQc2V1ZG9TdGF0ZUNhbGxiYWNrKHBzZXVkb1N0YXRlLGVuYWJsZWQpe25vZGUuZG9tTW9kZWwoKS5jc3NNb2RlbCgpLmZvcmNlUHNldWRvU3RhdGUobm9kZSxwc2V1ZG9TdGF0ZSxlbmFibGVkKTt9fQppc0Nsb3NpbmdUYWcoKXtyZXR1cm4hIXRoaXMuX2VsZW1lbnRDbG9zZVRhZzt9Cm5vZGUoKXtyZXR1cm4gdGhpcy5fbm9kZTt9CmlzRWRpdGluZygpe3JldHVybiEhdGhpcy5fZWRpdGluZzt9CmhpZ2hsaWdodFNlYXJjaFJlc3VsdHMoc2VhcmNoUXVlcnkpe2lmKHRoaXMuX3NlYXJjaFF1ZXJ5IT09c2VhcmNoUXVlcnkpCnRoaXMuX2hpZGVTZWFyY2hIaWdobGlnaHQoKTt0aGlzLl9zZWFyY2hRdWVyeT1zZWFyY2hRdWVyeTt0aGlzLl9zZWFyY2hIaWdobGlnaHRzVmlzaWJsZT10cnVlO3RoaXMudXBkYXRlVGl0bGUobnVsbCx0cnVlKTt9CmhpZGVTZWFyY2hIaWdobGlnaHRzKCl7ZGVsZXRlIHRoaXMuX3NlYXJjaEhpZ2hsaWdodHNWaXNpYmxlO3RoaXMuX2hpZGVTZWFyY2hIaWdobGlnaHQoKTt9Cl9oaWRlU2VhcmNoSGlnaGxpZ2h0KCl7aWYoIXRoaXMuX2hpZ2hsaWdodFJlc3VsdCkKcmV0dXJuO2Z1bmN0aW9uIHVwZGF0ZUVudHJ5SGlkZShlbnRyeSl7c3dpdGNoKGVudHJ5LnR5cGUpe2Nhc2UnYWRkZWQnOmVudHJ5Lm5vZGUucmVtb3ZlKCk7YnJlYWs7Y2FzZSdjaGFuZ2VkJzplbnRyeS5ub2RlLnRleHRDb250ZW50PWVudHJ5Lm9sZFRleHQ7YnJlYWs7fX0KZm9yKGxldCBpPSh0aGlzLl9oaWdobGlnaHRSZXN1bHQubGVuZ3RoLTEpO2k+PTA7LS1pKQp1cGRhdGVFbnRyeUhpZGUodGhpcy5faGlnaGxpZ2h0UmVzdWx0W2ldKTtkZWxldGUgdGhpcy5faGlnaGxpZ2h0UmVzdWx0O30Kc2V0SW5DbGlwYm9hcmQoaW5DbGlwYm9hcmQpe2lmKHRoaXMuX2luQ2xpcGJvYXJkPT09aW5DbGlwYm9hcmQpCnJldHVybjt0aGlzLl9pbkNsaXBib2FyZD1pbkNsaXBib2FyZDt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdpbi1jbGlwYm9hcmQnLGluQ2xpcGJvYXJkKTt9CmdldCBob3ZlcmVkKCl7cmV0dXJuIHRoaXMuX2hvdmVyZWQ7fQpzZXQgaG92ZXJlZCh4KXtpZih0aGlzLl9ob3ZlcmVkPT09eCkKcmV0dXJuO3RoaXMuX2hvdmVyZWQ9eDtpZih0aGlzLmxpc3RJdGVtRWxlbWVudCl7aWYoeCl7dGhpcy5fY3JlYXRlU2VsZWN0aW9uKCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaG92ZXJlZCcpO31lbHNle3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hvdmVyZWQnKTt9fX0KZXhwYW5kZWRDaGlsZHJlbkxpbWl0KCl7cmV0dXJuIHRoaXMuX2V4cGFuZGVkQ2hpbGRyZW5MaW1pdDt9CnNldEV4cGFuZGVkQ2hpbGRyZW5MaW1pdChleHBhbmRlZENoaWxkcmVuTGltaXQpe3RoaXMuX2V4cGFuZGVkQ2hpbGRyZW5MaW1pdD1leHBhbmRlZENoaWxkcmVuTGltaXQ7fQpfY3JlYXRlU2VsZWN0aW9uKCl7Y29uc3QgbGlzdEl0ZW1FbGVtZW50PXRoaXMubGlzdEl0ZW1FbGVtZW50O2lmKCFsaXN0SXRlbUVsZW1lbnQpCnJldHVybjtpZighdGhpcy5zZWxlY3Rpb25FbGVtZW50KXt0aGlzLnNlbGVjdGlvbkVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5zZWxlY3Rpb25FbGVtZW50LmNsYXNzTmFtZT0nc2VsZWN0aW9uIGZpbGwnO3RoaXMuc2VsZWN0aW9uRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWFyZ2luLWxlZnQnLCgtdGhpcy5fY29tcHV0ZUxlZnRJbmRlbnQoKSkrJ3B4Jyk7bGlzdEl0ZW1FbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLnNlbGVjdGlvbkVsZW1lbnQsbGlzdEl0ZW1FbGVtZW50LmZpcnN0Q2hpbGQpO319Cl9jcmVhdGVIaW50KCl7aWYodGhpcy5saXN0SXRlbUVsZW1lbnQmJiF0aGlzLl9oaW50RWxlbWVudCl7dGhpcy5faGludEVsZW1lbnQ9dGhpcy5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdzZWxlY3RlZC1oaW50Jyk7dGhpcy5faGludEVsZW1lbnQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdVc2UgJDAgaW4gdGhlIGNvbnNvbGUgdG8gcmVmZXIgdG8gdGhpcyBlbGVtZW50LicpO319Cm9uYmluZCgpe2lmKCF0aGlzLl9lbGVtZW50Q2xvc2VUYWcpCnRoaXMuX25vZGVbdGhpcy50cmVlT3V0bGluZS50cmVlRWxlbWVudFN5bWJvbCgpXT10aGlzO30Kb251bmJpbmQoKXtpZih0aGlzLl9ub2RlW3RoaXMudHJlZU91dGxpbmUudHJlZUVsZW1lbnRTeW1ib2woKV09PT10aGlzKQp0aGlzLl9ub2RlW3RoaXMudHJlZU91dGxpbmUudHJlZUVsZW1lbnRTeW1ib2woKV09bnVsbDt9Cm9uYXR0YWNoKCl7aWYodGhpcy5faG92ZXJlZCl7dGhpcy5fY3JlYXRlU2VsZWN0aW9uKCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaG92ZXJlZCcpO30KdGhpcy51cGRhdGVUaXRsZSgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmRyYWdnYWJsZT10cnVlO30Kb25wb3B1bGF0ZSgpe3RoaXMudHJlZU91dGxpbmUucG9wdWxhdGVUcmVlRWxlbWVudCh0aGlzKTt9CmV4cGFuZFJlY3Vyc2l2ZWx5KCl7dGhpcy5fbm9kZS5nZXRTdWJ0cmVlKC0xLHRydWUpLnRoZW4oVUkuVHJlZUVsZW1lbnQucHJvdG90eXBlLmV4cGFuZFJlY3Vyc2l2ZWx5LmJpbmQodGhpcyxOdW1iZXIuTUFYX1ZBTFVFKSk7fQpvbmV4cGFuZCgpe2lmKHRoaXMuX2VsZW1lbnRDbG9zZVRhZykKcmV0dXJuO3RoaXMudXBkYXRlVGl0bGUoKTt9Cm9uY29sbGFwc2UoKXtpZih0aGlzLl9lbGVtZW50Q2xvc2VUYWcpCnJldHVybjt0aGlzLnVwZGF0ZVRpdGxlKCk7fQpzZWxlY3Qob21pdEZvY3VzLHNlbGVjdGVkQnlVc2VyKXtpZih0aGlzLl9lZGl0aW5nKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHN1cGVyLnNlbGVjdChvbWl0Rm9jdXMsc2VsZWN0ZWRCeVVzZXIpO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3RoaXMudHJlZU91dGxpbmUuc3VwcHJlc3NSZXZlYWxBbmRTZWxlY3Q9dHJ1ZTt0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdERPTU5vZGUodGhpcy5fbm9kZSxzZWxlY3RlZEJ5VXNlcik7aWYoc2VsZWN0ZWRCeVVzZXIpe3RoaXMuX25vZGUuaGlnaGxpZ2h0KCk7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5DaGFuZ2VJbnNwZWN0ZWROb2RlSW5FbGVtZW50c1BhbmVsKTt9CnRoaXMuX2NyZWF0ZVNlbGVjdGlvbigpO3RoaXMuX2NyZWF0ZUhpbnQoKTt0aGlzLnRyZWVPdXRsaW5lLnN1cHByZXNzUmV2ZWFsQW5kU2VsZWN0PWZhbHNlO3JldHVybiB0cnVlO30Kb25kZWxldGUoKXtjb25zdCBzdGFydFRhZ1RyZWVFbGVtZW50PXRoaXMudHJlZU91dGxpbmUuZmluZFRyZWVFbGVtZW50KHRoaXMuX25vZGUpO3N0YXJ0VGFnVHJlZUVsZW1lbnQ/c3RhcnRUYWdUcmVlRWxlbWVudC5yZW1vdmUoKTp0aGlzLnJlbW92ZSgpO3JldHVybiB0cnVlO30Kb25lbnRlcigpe2lmKHRoaXMuX2VkaXRpbmcpCnJldHVybiBmYWxzZTt0aGlzLl9zdGFydEVkaXRpbmcoKTtyZXR1cm4gdHJ1ZTt9CnNlbGVjdE9uTW91c2VEb3duKGV2ZW50KXtzdXBlci5zZWxlY3RPbk1vdXNlRG93bihldmVudCk7aWYodGhpcy5fZWRpdGluZykKcmV0dXJuO2lmKGV2ZW50LmRldGFpbD49MikKZXZlbnQucHJldmVudERlZmF1bHQoKTt9Cm9uZGJsY2xpY2soZXZlbnQpe2lmKHRoaXMuX2VkaXRpbmd8fHRoaXMuX2VsZW1lbnRDbG9zZVRhZykKcmV0dXJuIGZhbHNlO2lmKHRoaXMuX3N0YXJ0RWRpdGluZ1RhcmdldCgoZXZlbnQudGFyZ2V0KSkpCnJldHVybiBmYWxzZTtpZih0aGlzLmlzRXhwYW5kYWJsZSgpJiYhdGhpcy5leHBhbmRlZCkKdGhpcy5leHBhbmQoKTtyZXR1cm4gZmFsc2U7fQpoYXNFZGl0YWJsZU5vZGUoKXtyZXR1cm4hdGhpcy5fbm9kZS5pc1NoYWRvd1Jvb3QoKSYmIXRoaXMuX25vZGUuYW5jZXN0b3JVc2VyQWdlbnRTaGFkb3dSb290KCk7fQpfaW5zZXJ0SW5MYXN0QXR0cmlidXRlUG9zaXRpb24odGFnLG5vZGUpe2lmKHRhZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd3ZWJraXQtaHRtbC1hdHRyaWJ1dGUnKS5sZW5ndGg+MCl7dGFnLmluc2VydEJlZm9yZShub2RlLHRhZy5sYXN0Q2hpbGQpO31lbHNle2NvbnN0IG5vZGVOYW1lPXRhZy50ZXh0Q29udGVudC5tYXRjaCgvXjwoLio/KT4kLylbMV07dGFnLnRleHRDb250ZW50PScnO3RhZy5jcmVhdGVUZXh0Q2hpbGQoJzwnK25vZGVOYW1lKTt0YWcuYXBwZW5kQ2hpbGQobm9kZSk7dGFnLmNyZWF0ZVRleHRDaGlsZCgnPicpO319Cl9zdGFydEVkaXRpbmdUYXJnZXQoZXZlbnRUYXJnZXQpe2lmKHRoaXMudHJlZU91dGxpbmUuc2VsZWN0ZWRET01Ob2RlKCkhPT10aGlzLl9ub2RlKQpyZXR1cm4gZmFsc2U7aWYodGhpcy5fbm9kZS5ub2RlVHlwZSgpIT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX25vZGUubm9kZVR5cGUoKSE9PU5vZGUuVEVYVF9OT0RFKQpyZXR1cm4gZmFsc2U7Y29uc3QgdGV4dE5vZGU9ZXZlbnRUYXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnd2Via2l0LWh0bWwtdGV4dC1ub2RlJyk7aWYodGV4dE5vZGUpCnJldHVybiB0aGlzLl9zdGFydEVkaXRpbmdUZXh0Tm9kZSh0ZXh0Tm9kZSk7Y29uc3QgYXR0cmlidXRlPWV2ZW50VGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZScpO2lmKGF0dHJpYnV0ZSkKcmV0dXJuIHRoaXMuX3N0YXJ0RWRpdGluZ0F0dHJpYnV0ZShhdHRyaWJ1dGUsZXZlbnRUYXJnZXQpO2NvbnN0IHRhZ05hbWU9ZXZlbnRUYXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnd2Via2l0LWh0bWwtdGFnLW5hbWUnKTtpZih0YWdOYW1lKQpyZXR1cm4gdGhpcy5fc3RhcnRFZGl0aW5nVGFnTmFtZSh0YWdOYW1lKTtjb25zdCBuZXdBdHRyaWJ1dGU9ZXZlbnRUYXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnYWRkLWF0dHJpYnV0ZScpO2lmKG5ld0F0dHJpYnV0ZSkKcmV0dXJuIHRoaXMuX2FkZE5ld0F0dHJpYnV0ZSgpO3JldHVybiBmYWxzZTt9Cl9zaG93Q29udGV4dE1lbnUoZXZlbnQpe3RoaXMudHJlZU91dGxpbmUuc2hvd0NvbnRleHRNZW51KHRoaXMsZXZlbnQpO30KcG9wdWxhdGVUYWdDb250ZXh0TWVudShjb250ZXh0TWVudSxldmVudCl7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fZWxlbWVudENsb3NlVGFnP3RoaXMudHJlZU91dGxpbmUuZmluZFRyZWVFbGVtZW50KHRoaXMuX25vZGUpOnRoaXM7Y29udGV4dE1lbnUuZWRpdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQWRkIGF0dHJpYnV0ZScpLHRyZWVFbGVtZW50Ll9hZGROZXdBdHRyaWJ1dGUuYmluZCh0cmVlRWxlbWVudCkpO2NvbnN0IGF0dHJpYnV0ZT1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnd2Via2l0LWh0bWwtYXR0cmlidXRlJyk7Y29uc3QgbmV3QXR0cmlidXRlPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdhZGQtYXR0cmlidXRlJyk7aWYoYXR0cmlidXRlJiYhbmV3QXR0cmlidXRlKXtjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdFZGl0IGF0dHJpYnV0ZScpLHRoaXMuX3N0YXJ0RWRpdGluZ0F0dHJpYnV0ZS5iaW5kKHRoaXMsYXR0cmlidXRlLGV2ZW50LnRhcmdldCkpO30KdGhpcy5wb3B1bGF0ZU5vZGVDb250ZXh0TWVudShjb250ZXh0TWVudSk7RWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudC5wb3B1bGF0ZUZvcmNlZFBzZXVkb1N0YXRlSXRlbXMoY29udGV4dE1lbnUsdHJlZUVsZW1lbnQubm9kZSgpKTt0aGlzLnBvcHVsYXRlU2Nyb2xsSW50b1ZpZXcoY29udGV4dE1lbnUpO2NvbnRleHRNZW51LnZpZXdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0ZvY3VzJyksYXN5bmMoKT0+e2F3YWl0IHRoaXMuX25vZGUuZm9jdXMoKTt9KTt9CnBvcHVsYXRlU2Nyb2xsSW50b1ZpZXcoY29udGV4dE1lbnUpe2NvbnRleHRNZW51LnZpZXdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1Njcm9sbCBpbnRvIHZpZXcnKSwoKT0+dGhpcy5fbm9kZS5zY3JvbGxJbnRvVmlldygpKTt9CnBvcHVsYXRlVGV4dENvbnRleHRNZW51KGNvbnRleHRNZW51LHRleHROb2RlKXtpZighdGhpcy5fZWRpdGluZyl7Y29udGV4dE1lbnUuZWRpdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRWRpdCB0ZXh0JyksdGhpcy5fc3RhcnRFZGl0aW5nVGV4dE5vZGUuYmluZCh0aGlzLHRleHROb2RlKSk7fQp0aGlzLnBvcHVsYXRlTm9kZUNvbnRleHRNZW51KGNvbnRleHRNZW51KTt9CnBvcHVsYXRlTm9kZUNvbnRleHRNZW51KGNvbnRleHRNZW51KXtjb25zdCBpc0VkaXRhYmxlPXRoaXMuaGFzRWRpdGFibGVOb2RlKCk7aWYoaXNFZGl0YWJsZSYmIXRoaXMuX2VkaXRpbmcpCmNvbnRleHRNZW51LmVkaXRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0VkaXQgYXMgSFRNTCcpLHRoaXMuX2VkaXRBc0hUTUwuYmluZCh0aGlzKSk7Y29uc3QgaXNTaGFkb3dSb290PXRoaXMuX25vZGUuaXNTaGFkb3dSb290KCk7Y29uc3QgY29weU1lbnU9Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weScpKTtjb25zdCBjcmVhdGVTaG9ydGN1dD1VSS5LZXlib2FyZFNob3J0Y3V0LnNob3J0Y3V0VG9TdHJpbmc7Y29uc3QgbW9kaWZpZXI9VUkuS2V5Ym9hcmRTaG9ydGN1dC5Nb2RpZmllcnMuQ3RybE9yTWV0YTtjb25zdCB0cmVlT3V0bGluZT10aGlzLnRyZWVPdXRsaW5lO2xldCBtZW51SXRlbTtsZXQgc2VjdGlvbjtpZighaXNTaGFkb3dSb290KXtzZWN0aW9uPWNvcHlNZW51LnNlY3Rpb24oKTttZW51SXRlbT1zZWN0aW9uLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IG91dGVySFRNTCcpLHRyZWVPdXRsaW5lLnBlcmZvcm1Db3B5T3JDdXQuYmluZCh0cmVlT3V0bGluZSxmYWxzZSx0aGlzLl9ub2RlKSk7bWVudUl0ZW0uc2V0U2hvcnRjdXQoY3JlYXRlU2hvcnRjdXQoJ1YnLG1vZGlmaWVyKSk7fQppZih0aGlzLl9ub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkVMRU1FTlRfTk9ERSkKc2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBzZWxlY3RvcicpLHRoaXMuX2NvcHlDU1NQYXRoLmJpbmQodGhpcykpO2lmKCFpc1NoYWRvd1Jvb3QpCnNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgWFBhdGgnKSx0aGlzLl9jb3B5WFBhdGguYmluZCh0aGlzKSk7aWYoIWlzU2hhZG93Um9vdCl7bWVudUl0ZW09Y29weU1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDdXQgZWxlbWVudCcpLHRyZWVPdXRsaW5lLnBlcmZvcm1Db3B5T3JDdXQuYmluZCh0cmVlT3V0bGluZSx0cnVlLHRoaXMuX25vZGUpLCF0aGlzLmhhc0VkaXRhYmxlTm9kZSgpKTttZW51SXRlbS5zZXRTaG9ydGN1dChjcmVhdGVTaG9ydGN1dCgnWCcsbW9kaWZpZXIpKTttZW51SXRlbT1jb3B5TWVudS5jbGlwYm9hcmRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgZWxlbWVudCcpLHRyZWVPdXRsaW5lLnBlcmZvcm1Db3B5T3JDdXQuYmluZCh0cmVlT3V0bGluZSxmYWxzZSx0aGlzLl9ub2RlKSk7bWVudUl0ZW0uc2V0U2hvcnRjdXQoY3JlYXRlU2hvcnRjdXQoJ0MnLG1vZGlmaWVyKSk7bWVudUl0ZW09Y29weU1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdQYXN0ZSBlbGVtZW50JyksdHJlZU91dGxpbmUucGFzdGVOb2RlLmJpbmQodHJlZU91dGxpbmUsdGhpcy5fbm9kZSksIXRyZWVPdXRsaW5lLmNhblBhc3RlKHRoaXMuX25vZGUpKTttZW51SXRlbS5zZXRTaG9ydGN1dChjcmVhdGVTaG9ydGN1dCgnVicsbW9kaWZpZXIpKTt9Cm1lbnVJdGVtPWNvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShDb21tb24uVUlTdHJpbmcoJ0hpZGUgZWxlbWVudCcpLHRyZWVPdXRsaW5lLnRvZ2dsZUhpZGVFbGVtZW50LmJpbmQodHJlZU91dGxpbmUsdGhpcy5fbm9kZSksdHJlZU91dGxpbmUuaXNUb2dnbGVkVG9IaWRkZW4odGhpcy5fbm9kZSkpO21lbnVJdGVtLnNldFNob3J0Y3V0KFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXRUaXRsZUZvckFjdGlvbignZWxlbWVudHMuaGlkZS1lbGVtZW50JykpO2lmKGlzRWRpdGFibGUpCmNvbnRleHRNZW51LmVkaXRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0RlbGV0ZSBlbGVtZW50JyksdGhpcy5yZW1vdmUuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUudmlld1NlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYEV4cGFuZCByZWN1cnNpdmVseWAsdGhpcy5leHBhbmRSZWN1cnNpdmVseS5iaW5kKHRoaXMpKTtjb250ZXh0TWVudS52aWV3U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgQ29sbGFwc2UgY2hpbGRyZW5gLHRoaXMuY29sbGFwc2VDaGlsZHJlbi5iaW5kKHRoaXMpKTt9Cl9zdGFydEVkaXRpbmcoKXtpZih0aGlzLnRyZWVPdXRsaW5lLnNlbGVjdGVkRE9NTm9kZSgpIT09dGhpcy5fbm9kZSkKcmV0dXJuO2NvbnN0IGxpc3RJdGVtPXRoaXMubGlzdEl0ZW1FbGVtZW50O2lmKHRoaXMuX2NhbkFkZEF0dHJpYnV0ZXMpe2NvbnN0IGF0dHJpYnV0ZT1saXN0SXRlbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd3ZWJraXQtaHRtbC1hdHRyaWJ1dGUnKVswXTtpZihhdHRyaWJ1dGUpe3JldHVybiB0aGlzLl9zdGFydEVkaXRpbmdBdHRyaWJ1dGUoYXR0cmlidXRlLGF0dHJpYnV0ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd3ZWJraXQtaHRtbC1hdHRyaWJ1dGUtdmFsdWUnKVswXSk7fQpyZXR1cm4gdGhpcy5fYWRkTmV3QXR0cmlidXRlKCk7fQppZih0aGlzLl9ub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLlRFWFRfTk9ERSl7Y29uc3QgdGV4dE5vZGU9bGlzdEl0ZW0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnd2Via2l0LWh0bWwtdGV4dC1ub2RlJylbMF07aWYodGV4dE5vZGUpCnJldHVybiB0aGlzLl9zdGFydEVkaXRpbmdUZXh0Tm9kZSh0ZXh0Tm9kZSk7cmV0dXJuO319Cl9hZGROZXdBdHRyaWJ1dGUoKXtjb25zdCBjb250YWluZXI9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3RoaXMuX2J1aWxkQXR0cmlidXRlRE9NKGNvbnRhaW5lciwnICcsJycsbnVsbCk7Y29uc3QgYXR0cj1jb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7YXR0ci5zdHlsZS5tYXJnaW5MZWZ0PScycHgnO2F0dHIuc3R5bGUubWFyZ2luUmlnaHQ9JzJweCc7Y29uc3QgdGFnPXRoaXMubGlzdEl0ZW1FbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dlYmtpdC1odG1sLXRhZycpWzBdO3RoaXMuX2luc2VydEluTGFzdEF0dHJpYnV0ZVBvc2l0aW9uKHRhZyxhdHRyKTthdHRyLnNjcm9sbEludG9WaWV3SWZOZWVkZWQodHJ1ZSk7cmV0dXJuIHRoaXMuX3N0YXJ0RWRpdGluZ0F0dHJpYnV0ZShhdHRyLGF0dHIpO30KX3RyaWdnZXJFZGl0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpe2NvbnN0IGF0dHJpYnV0ZUVsZW1lbnRzPXRoaXMubGlzdEl0ZW1FbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS1uYW1lJyk7Zm9yKGxldCBpPTAsbGVuPWF0dHJpYnV0ZUVsZW1lbnRzLmxlbmd0aDtpPGxlbjsrK2kpe2lmKGF0dHJpYnV0ZUVsZW1lbnRzW2ldLnRleHRDb250ZW50PT09YXR0cmlidXRlTmFtZSl7Zm9yKGxldCBlbGVtPWF0dHJpYnV0ZUVsZW1lbnRzW2ldLm5leHRTaWJsaW5nO2VsZW07ZWxlbT1lbGVtLm5leHRTaWJsaW5nKXtpZihlbGVtLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpCmNvbnRpbnVlO2lmKGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCd3ZWJraXQtaHRtbC1hdHRyaWJ1dGUtdmFsdWUnKSkKcmV0dXJuIHRoaXMuX3N0YXJ0RWRpdGluZ0F0dHJpYnV0ZShlbGVtLnBhcmVudE5vZGUsZWxlbSk7fX19fQpfc3RhcnRFZGl0aW5nQXR0cmlidXRlKGF0dHJpYnV0ZSxlbGVtZW50Rm9yU2VsZWN0aW9uKXtjb25zb2xlLmFzc2VydCh0aGlzLmxpc3RJdGVtRWxlbWVudC5pc0FuY2VzdG9yKGF0dHJpYnV0ZSkpO2lmKFVJLmlzQmVpbmdFZGl0ZWQoYXR0cmlidXRlKSkKcmV0dXJuIHRydWU7Y29uc3QgYXR0cmlidXRlTmFtZUVsZW1lbnQ9YXR0cmlidXRlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS1uYW1lJylbMF07aWYoIWF0dHJpYnV0ZU5hbWVFbGVtZW50KQpyZXR1cm4gZmFsc2U7Y29uc3QgYXR0cmlidXRlTmFtZT1hdHRyaWJ1dGVOYW1lRWxlbWVudC50ZXh0Q29udGVudDtjb25zdCBhdHRyaWJ1dGVWYWx1ZUVsZW1lbnQ9YXR0cmlidXRlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS12YWx1ZScpWzBdO2VsZW1lbnRGb3JTZWxlY3Rpb249YXR0cmlidXRlVmFsdWVFbGVtZW50LmlzQW5jZXN0b3IoZWxlbWVudEZvclNlbGVjdGlvbik/YXR0cmlidXRlVmFsdWVFbGVtZW50OmVsZW1lbnRGb3JTZWxlY3Rpb247ZnVuY3Rpb24gcmVtb3ZlWmVyb1dpZHRoU3BhY2VSZWN1cnNpdmUobm9kZSl7aWYobm9kZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtub2RlLm5vZGVWYWx1ZT1ub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKC9cdTIwMEIvZywnJyk7cmV0dXJuO30KaWYobm9kZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKQpyZXR1cm47Zm9yKGxldCBjaGlsZD1ub2RlLmZpcnN0Q2hpbGQ7Y2hpbGQ7Y2hpbGQ9Y2hpbGQubmV4dFNpYmxpbmcpCnJlbW92ZVplcm9XaWR0aFNwYWNlUmVjdXJzaXZlKGNoaWxkKTt9CmNvbnN0IGF0dHJpYnV0ZVZhbHVlPWF0dHJpYnV0ZU5hbWUmJmF0dHJpYnV0ZVZhbHVlRWxlbWVudD90aGlzLl9ub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTp1bmRlZmluZWQ7aWYoYXR0cmlidXRlVmFsdWUhPT11bmRlZmluZWQpe2F0dHJpYnV0ZVZhbHVlRWxlbWVudC5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKGF0dHJpYnV0ZVZhbHVlLENvbW1vbi5VSVN0cmluZygnPHZhbHVlIGlzIHRvbyBsYXJnZSB0byBlZGl0PicpKTt9CnJlbW92ZVplcm9XaWR0aFNwYWNlUmVjdXJzaXZlKGF0dHJpYnV0ZSk7Y29uc3QgY29uZmlnPW5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyh0aGlzLl9hdHRyaWJ1dGVFZGl0aW5nQ29tbWl0dGVkLmJpbmQodGhpcyksdGhpcy5fZWRpdGluZ0NhbmNlbGxlZC5iaW5kKHRoaXMpLGF0dHJpYnV0ZU5hbWUpO2Z1bmN0aW9uIHBvc3RLZXlEb3duRmluaXNoSGFuZGxlcihldmVudCl7VUkuaGFuZGxlRWxlbWVudFZhbHVlTW9kaWZpY2F0aW9ucyhldmVudCxhdHRyaWJ1dGUpO3JldHVybicnO30KaWYoIWF0dHJpYnV0ZVZhbHVlRWxlbWVudC50ZXh0Q29udGVudC5hc1BhcnNlZFVSTCgpKQpjb25maWcuc2V0UG9zdEtleWRvd25GaW5pc2hIYW5kbGVyKHBvc3RLZXlEb3duRmluaXNoSGFuZGxlcik7dGhpcy5fZWRpdGluZz1VSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyhhdHRyaWJ1dGUsY29uZmlnKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50Rm9yU2VsZWN0aW9uKTtyZXR1cm4gdHJ1ZTt9Cl9zdGFydEVkaXRpbmdUZXh0Tm9kZSh0ZXh0Tm9kZUVsZW1lbnQpe2lmKFVJLmlzQmVpbmdFZGl0ZWQodGV4dE5vZGVFbGVtZW50KSkKcmV0dXJuIHRydWU7bGV0IHRleHROb2RlPXRoaXMuX25vZGU7aWYodGV4dE5vZGUubm9kZVR5cGUoKT09PU5vZGUuRUxFTUVOVF9OT0RFJiZ0ZXh0Tm9kZS5maXJzdENoaWxkKQp0ZXh0Tm9kZT10ZXh0Tm9kZS5maXJzdENoaWxkO2NvbnN0IGNvbnRhaW5lcj10ZXh0Tm9kZUVsZW1lbnQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnd2Via2l0LWh0bWwtdGV4dC1ub2RlJyk7aWYoY29udGFpbmVyKQpjb250YWluZXIudGV4dENvbnRlbnQ9dGV4dE5vZGUubm9kZVZhbHVlKCk7Y29uc3QgY29uZmlnPW5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyh0aGlzLl90ZXh0Tm9kZUVkaXRpbmdDb21taXR0ZWQuYmluZCh0aGlzLHRleHROb2RlKSx0aGlzLl9lZGl0aW5nQ2FuY2VsbGVkLmJpbmQodGhpcykpO3RoaXMuX2VkaXRpbmc9VUkuSW5wbGFjZUVkaXRvci5zdGFydEVkaXRpbmcodGV4dE5vZGVFbGVtZW50LGNvbmZpZyk7dGhpcy5saXN0SXRlbUVsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCkuc2VsZWN0QWxsQ2hpbGRyZW4odGV4dE5vZGVFbGVtZW50KTtyZXR1cm4gdHJ1ZTt9Cl9zdGFydEVkaXRpbmdUYWdOYW1lKHRhZ05hbWVFbGVtZW50KXtpZighdGFnTmFtZUVsZW1lbnQpe3RhZ05hbWVFbGVtZW50PXRoaXMubGlzdEl0ZW1FbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dlYmtpdC1odG1sLXRhZy1uYW1lJylbMF07aWYoIXRhZ05hbWVFbGVtZW50KQpyZXR1cm4gZmFsc2U7fQpjb25zdCB0YWdOYW1lPXRhZ05hbWVFbGVtZW50LnRleHRDb250ZW50O2lmKEVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuRWRpdFRhZ0JsYWNrbGlzdC5oYXModGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkKcmV0dXJuIGZhbHNlO2lmKFVJLmlzQmVpbmdFZGl0ZWQodGFnTmFtZUVsZW1lbnQpKQpyZXR1cm4gdHJ1ZTtjb25zdCBjbG9zaW5nVGFnRWxlbWVudD10aGlzLl9kaXN0aW5jdENsb3NpbmdUYWdFbGVtZW50KCk7ZnVuY3Rpb24ga2V5dXBMaXN0ZW5lcihldmVudCl7aWYoY2xvc2luZ1RhZ0VsZW1lbnQpCmNsb3NpbmdUYWdFbGVtZW50LnRleHRDb250ZW50PSc8LycrdGFnTmFtZUVsZW1lbnQudGV4dENvbnRlbnQrJz4nO30KY29uc3Qga2V5ZG93bkxpc3RlbmVyPWV2ZW50PT57aWYoZXZlbnQua2V5IT09JyAnKQpyZXR1cm47dGhpcy5fZWRpdGluZy5jb21taXQoKTtldmVudC5jb25zdW1lKHRydWUpO307ZnVuY3Rpb24gZWRpdGluZ0NvbWl0dGVkKGVsZW1lbnQsbmV3VGFnTmFtZSl7dGFnTmFtZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLGtleXVwTGlzdGVuZXIsZmFsc2UpO3RhZ05hbWVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGtleWRvd25MaXN0ZW5lcixmYWxzZSk7dGhpcy5fdGFnTmFtZUVkaXRpbmdDb21taXR0ZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO30KZnVuY3Rpb24gZWRpdGluZ0NhbmNlbGxlZCgpe3RhZ05hbWVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJyxrZXl1cExpc3RlbmVyLGZhbHNlKTt0YWdOYW1lRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJyxrZXlkb3duTGlzdGVuZXIsZmFsc2UpO3RoaXMuX2VkaXRpbmdDYW5jZWxsZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO30KdGFnTmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLGtleXVwTGlzdGVuZXIsZmFsc2UpO3RhZ05hbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGtleWRvd25MaXN0ZW5lcixmYWxzZSk7Y29uc3QgY29uZmlnPW5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyhlZGl0aW5nQ29taXR0ZWQuYmluZCh0aGlzKSxlZGl0aW5nQ2FuY2VsbGVkLmJpbmQodGhpcyksdGFnTmFtZSk7dGhpcy5fZWRpdGluZz1VSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyh0YWdOYW1lRWxlbWVudCxjb25maWcpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpLnNlbGVjdEFsbENoaWxkcmVuKHRhZ05hbWVFbGVtZW50KTtyZXR1cm4gdHJ1ZTt9Cl9zdGFydEVkaXRpbmdBc0hUTUwoY29tbWl0Q2FsbGJhY2ssZGlzcG9zZUNhbGxiYWNrLG1heWJlSW5pdGlhbFZhbHVlKXtpZihtYXliZUluaXRpYWxWYWx1ZT09PW51bGwpCnJldHVybjtsZXQgaW5pdGlhbFZhbHVlPW1heWJlSW5pdGlhbFZhbHVlO2lmKHRoaXMuX2VkaXRpbmcpCnJldHVybjtmdW5jdGlvbiBjb25zdW1lKGV2ZW50KXtpZihldmVudC5ldmVudFBoYXNlPT09RXZlbnQuQVRfVEFSR0VUKQpldmVudC5jb25zdW1lKHRydWUpO30KaW5pdGlhbFZhbHVlPXRoaXMuX2NvbnZlcnRXaGl0ZXNwYWNlVG9FbnRpdGllcyhpbml0aWFsVmFsdWUpLnRleHQ7dGhpcy5faHRtbEVkaXRFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuX2h0bWxFZGl0RWxlbWVudC5jbGFzc05hbWU9J3NvdXJjZS1jb2RlIGVsZW1lbnRzLXRyZWUtZWRpdG9yJztsZXQgY2hpbGQ9dGhpcy5saXN0SXRlbUVsZW1lbnQuZmlyc3RDaGlsZDt3aGlsZShjaGlsZCl7Y2hpbGQuc3R5bGUuZGlzcGxheT0nbm9uZSc7Y2hpbGQ9Y2hpbGQubmV4dFNpYmxpbmc7fQppZih0aGlzLmNoaWxkcmVuTGlzdEVsZW1lbnQpCnRoaXMuY2hpbGRyZW5MaXN0RWxlbWVudC5zdHlsZS5kaXNwbGF5PSdub25lJzt0aGlzLmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9odG1sRWRpdEVsZW1lbnQpO3RoaXMudHJlZU91dGxpbmUuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGNvbnN1bWUsZmFsc2UpO3NlbGYucnVudGltZS5leHRlbnNpb24oVUkuVGV4dEVkaXRvckZhY3RvcnkpLmluc3RhbmNlKCkudGhlbihnb3RGYWN0b3J5LmJpbmQodGhpcykpO2Z1bmN0aW9uIGdvdEZhY3RvcnkoZmFjdG9yeSl7Y29uc3QgZWRpdG9yPWZhY3RvcnkuY3JlYXRlRWRpdG9yKHtsaW5lTnVtYmVyczpmYWxzZSxsaW5lV3JhcHBpbmc6Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2RvbVdvcmRXcmFwJykuZ2V0KCksbWltZVR5cGU6J3RleHQvaHRtbCcsYXV0b0hlaWdodDpmYWxzZSxwYWRCb3R0b206ZmFsc2V9KTt0aGlzLl9lZGl0aW5nPXtjb21taXQ6Y29tbWl0LmJpbmQodGhpcyksY2FuY2VsOmRpc3Bvc2UuYmluZCh0aGlzKSxlZGl0b3I6ZWRpdG9yLHJlc2l6ZTpyZXNpemUuYmluZCh0aGlzKX07cmVzaXplLmNhbGwodGhpcyk7ZWRpdG9yLndpZGdldCgpLnNob3codGhpcy5faHRtbEVkaXRFbGVtZW50KTtlZGl0b3Iuc2V0VGV4dChpbml0aWFsVmFsdWUpO2VkaXRvci53aWRnZXQoKS5mb2N1cygpO2VkaXRvci53aWRnZXQoKS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLGV2ZW50PT57aWYoZXZlbnQucmVsYXRlZFRhcmdldCkKdGhpcy5fZWRpdGluZy5jb21taXQoKTt9LHRydWUpO2VkaXRvci53aWRnZXQoKS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGtleWRvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLnRyZWVPdXRsaW5lLnNldE11bHRpbGluZUVkaXRpbmcodGhpcy5fZWRpdGluZyk7fQpmdW5jdGlvbiByZXNpemUoKXt0aGlzLl9odG1sRWRpdEVsZW1lbnQuc3R5bGUud2lkdGg9dGhpcy50cmVlT3V0bGluZS52aXNpYmxlV2lkdGgoKS10aGlzLl9jb21wdXRlTGVmdEluZGVudCgpLTMwKydweCc7dGhpcy5fZWRpdGluZy5lZGl0b3Iub25SZXNpemUoKTt9CmZ1bmN0aW9uIGNvbW1pdCgpe2NvbW1pdENhbGxiYWNrKGluaXRpYWxWYWx1ZSx0aGlzLl9lZGl0aW5nLmVkaXRvci50ZXh0KCkpO2Rpc3Bvc2UuY2FsbCh0aGlzKTt9CmZ1bmN0aW9uIGRpc3Bvc2UoKXt0aGlzLl9lZGl0aW5nLmVkaXRvci53aWRnZXQoKS5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLHRoaXMuX2VkaXRpbmcuY29tbWl0LHRydWUpO3RoaXMuX2VkaXRpbmcuZWRpdG9yLndpZGdldCgpLmRldGFjaCgpO2RlbGV0ZSB0aGlzLl9lZGl0aW5nO3RoaXMubGlzdEl0ZW1FbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX2h0bWxFZGl0RWxlbWVudCk7ZGVsZXRlIHRoaXMuX2h0bWxFZGl0RWxlbWVudDtpZih0aGlzLmNoaWxkcmVuTGlzdEVsZW1lbnQpCnRoaXMuY2hpbGRyZW5MaXN0RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO2xldCBjaGlsZD10aGlzLmxpc3RJdGVtRWxlbWVudC5maXJzdENoaWxkO3doaWxlKGNoaWxkKXtjaGlsZC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO2NoaWxkPWNoaWxkLm5leHRTaWJsaW5nO30KaWYodGhpcy50cmVlT3V0bGluZSl7dGhpcy50cmVlT3V0bGluZS5zZXRNdWx0aWxpbmVFZGl0aW5nKG51bGwpO3RoaXMudHJlZU91dGxpbmUuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGNvbnN1bWUsZmFsc2UpO3RoaXMudHJlZU91dGxpbmUuZm9jdXMoKTt9CmRpc3Bvc2VDYWxsYmFjaygpO30KZnVuY3Rpb24ga2V5ZG93bihldmVudCl7Y29uc3QgaXNNZXRhT3JDdHJsPVVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKChldmVudCkpJiYhZXZlbnQuYWx0S2V5JiYhZXZlbnQuc2hpZnRLZXk7aWYoaXNFbnRlcktleShldmVudCkmJihpc01ldGFPckN0cmx8fGV2ZW50LmlzTWV0YU9yQ3RybEZvclRlc3QpKXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX2VkaXRpbmcuY29tbWl0KCk7fWVsc2UgaWYoZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Fc2MuY29kZXx8ZXZlbnQua2V5PT09J0VzY2FwZScpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7dGhpcy5fZWRpdGluZy5jYW5jZWwoKTt9fX0KX2F0dHJpYnV0ZUVkaXRpbmdDb21taXR0ZWQoZWxlbWVudCxuZXdUZXh0LG9sZFRleHQsYXR0cmlidXRlTmFtZSxtb3ZlRGlyZWN0aW9uKXtkZWxldGUgdGhpcy5fZWRpdGluZztjb25zdCB0cmVlT3V0bGluZT10aGlzLnRyZWVPdXRsaW5lO2Z1bmN0aW9uIG1vdmVUb05leHRBdHRyaWJ1dGVJZk5lZWRlZChlcnJvcil7aWYoZXJyb3IpCnRoaXMuX2VkaXRpbmdDYW5jZWxsZWQoZWxlbWVudCxhdHRyaWJ1dGVOYW1lKTtpZighbW92ZURpcmVjdGlvbikKcmV0dXJuO3RyZWVPdXRsaW5lLnJ1blBlbmRpbmdVcGRhdGVzKCk7dHJlZU91dGxpbmUuZm9jdXMoKTtjb25zdCBhdHRyaWJ1dGVzPXRoaXMuX25vZGUuYXR0cmlidXRlcygpO2ZvcihsZXQgaT0wO2k8YXR0cmlidXRlcy5sZW5ndGg7KytpKXtpZihhdHRyaWJ1dGVzW2ldLm5hbWUhPT1hdHRyaWJ1dGVOYW1lKQpjb250aW51ZTtpZihtb3ZlRGlyZWN0aW9uPT09J2JhY2t3YXJkJyl7aWYoaT09PTApCnRoaXMuX3N0YXJ0RWRpdGluZ1RhZ05hbWUoKTtlbHNlCnRoaXMuX3RyaWdnZXJFZGl0QXR0cmlidXRlKGF0dHJpYnV0ZXNbaS0xXS5uYW1lKTt9ZWxzZXtpZihpPT09YXR0cmlidXRlcy5sZW5ndGgtMSkKdGhpcy5fYWRkTmV3QXR0cmlidXRlKCk7ZWxzZQp0aGlzLl90cmlnZ2VyRWRpdEF0dHJpYnV0ZShhdHRyaWJ1dGVzW2krMV0ubmFtZSk7fQpyZXR1cm47fQppZihtb3ZlRGlyZWN0aW9uPT09J2JhY2t3YXJkJyl7aWYobmV3VGV4dD09PScgJyl7aWYoYXR0cmlidXRlcy5sZW5ndGg+MCkKdGhpcy5fdHJpZ2dlckVkaXRBdHRyaWJ1dGUoYXR0cmlidXRlc1thdHRyaWJ1dGVzLmxlbmd0aC0xXS5uYW1lKTt9ZWxzZXtpZihhdHRyaWJ1dGVzLmxlbmd0aD4xKQp0aGlzLl90cmlnZ2VyRWRpdEF0dHJpYnV0ZShhdHRyaWJ1dGVzW2F0dHJpYnV0ZXMubGVuZ3RoLTJdLm5hbWUpO319ZWxzZSBpZihtb3ZlRGlyZWN0aW9uPT09J2ZvcndhcmQnKXtpZighbmV3VGV4dC5pc1doaXRlc3BhY2UoKSkKdGhpcy5fYWRkTmV3QXR0cmlidXRlKCk7ZWxzZQp0aGlzLl9zdGFydEVkaXRpbmdUYWdOYW1lKCk7fX0KaWYoKGF0dHJpYnV0ZU5hbWUudHJpbSgpfHxuZXdUZXh0LnRyaW0oKSkmJm9sZFRleHQhPT1uZXdUZXh0KXt0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLG5ld1RleHQsbW92ZVRvTmV4dEF0dHJpYnV0ZUlmTmVlZGVkLmJpbmQodGhpcykpO3JldHVybjt9CnRoaXMudXBkYXRlVGl0bGUoKTttb3ZlVG9OZXh0QXR0cmlidXRlSWZOZWVkZWQuY2FsbCh0aGlzKTt9Cl90YWdOYW1lRWRpdGluZ0NvbW1pdHRlZChlbGVtZW50LG5ld1RleHQsb2xkVGV4dCx0YWdOYW1lLG1vdmVEaXJlY3Rpb24pe2RlbGV0ZSB0aGlzLl9lZGl0aW5nO2NvbnN0IHNlbGY9dGhpcztmdW5jdGlvbiBjYW5jZWwoKXtjb25zdCBjbG9zaW5nVGFnRWxlbWVudD1zZWxmLl9kaXN0aW5jdENsb3NpbmdUYWdFbGVtZW50KCk7aWYoY2xvc2luZ1RhZ0VsZW1lbnQpCmNsb3NpbmdUYWdFbGVtZW50LnRleHRDb250ZW50PSc8LycrdGFnTmFtZSsnPic7c2VsZi5fZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50LHRhZ05hbWUpO21vdmVUb05leHRBdHRyaWJ1dGVJZk5lZWRlZC5jYWxsKHNlbGYpO30KZnVuY3Rpb24gbW92ZVRvTmV4dEF0dHJpYnV0ZUlmTmVlZGVkKCl7aWYobW92ZURpcmVjdGlvbiE9PSdmb3J3YXJkJyl7dGhpcy5fYWRkTmV3QXR0cmlidXRlKCk7cmV0dXJuO30KY29uc3QgYXR0cmlidXRlcz10aGlzLl9ub2RlLmF0dHJpYnV0ZXMoKTtpZihhdHRyaWJ1dGVzLmxlbmd0aD4wKQp0aGlzLl90cmlnZ2VyRWRpdEF0dHJpYnV0ZShhdHRyaWJ1dGVzWzBdLm5hbWUpO2Vsc2UKdGhpcy5fYWRkTmV3QXR0cmlidXRlKCk7fQpuZXdUZXh0PW5ld1RleHQudHJpbSgpO2lmKG5ld1RleHQ9PT1vbGRUZXh0KXtjYW5jZWwoKTtyZXR1cm47fQpjb25zdCB0cmVlT3V0bGluZT10aGlzLnRyZWVPdXRsaW5lO2NvbnN0IHdhc0V4cGFuZGVkPXRoaXMuZXhwYW5kZWQ7dGhpcy5fbm9kZS5zZXROb2RlTmFtZShuZXdUZXh0LChlcnJvcixuZXdOb2RlKT0+e2lmKGVycm9yfHwhbmV3Tm9kZSl7Y2FuY2VsKCk7cmV0dXJuO30KY29uc3QgbmV3VHJlZUl0ZW09dHJlZU91dGxpbmUuc2VsZWN0Tm9kZUFmdGVyRWRpdCh3YXNFeHBhbmRlZCxlcnJvcixuZXdOb2RlKTttb3ZlVG9OZXh0QXR0cmlidXRlSWZOZWVkZWQuY2FsbChuZXdUcmVlSXRlbSk7fSk7fQpfdGV4dE5vZGVFZGl0aW5nQ29tbWl0dGVkKHRleHROb2RlLGVsZW1lbnQsbmV3VGV4dCl7ZGVsZXRlIHRoaXMuX2VkaXRpbmc7ZnVuY3Rpb24gY2FsbGJhY2soKXt0aGlzLnVwZGF0ZVRpdGxlKCk7fQp0ZXh0Tm9kZS5zZXROb2RlVmFsdWUobmV3VGV4dCxjYWxsYmFjay5iaW5kKHRoaXMpKTt9Cl9lZGl0aW5nQ2FuY2VsbGVkKGVsZW1lbnQsY29udGV4dCl7ZGVsZXRlIHRoaXMuX2VkaXRpbmc7dGhpcy51cGRhdGVUaXRsZSgpO30KX2Rpc3RpbmN0Q2xvc2luZ1RhZ0VsZW1lbnQoKXtpZih0aGlzLmV4cGFuZGVkKXtjb25zdCBjbG9zZXJzPXRoaXMuY2hpbGRyZW5MaXN0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2xvc2UnKTtyZXR1cm4gY2xvc2Vyc1tjbG9zZXJzLmxlbmd0aC0xXTt9CmNvbnN0IHRhZ3M9dGhpcy5saXN0SXRlbUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnd2Via2l0LWh0bWwtdGFnJyk7cmV0dXJuKHRhZ3MubGVuZ3RoPT09MT9udWxsOnRhZ3NbdGFncy5sZW5ndGgtMV0pO30KdXBkYXRlVGl0bGUodXBkYXRlUmVjb3JkLG9ubHlTZWFyY2hRdWVyeUNoYW5nZWQpe2lmKHRoaXMuX2VkaXRpbmcpCnJldHVybjtpZihvbmx5U2VhcmNoUXVlcnlDaGFuZ2VkKXt0aGlzLl9oaWRlU2VhcmNoSGlnaGxpZ2h0KCk7fWVsc2V7Y29uc3Qgbm9kZUluZm89dGhpcy5fbm9kZVRpdGxlSW5mbyh1cGRhdGVSZWNvcmR8fG51bGwpO2lmKHRoaXMuX25vZGUubm9kZVR5cGUoKT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmdGhpcy5fbm9kZS5pc0luU2hhZG93VHJlZSgpJiZ0aGlzLl9ub2RlLnNoYWRvd1Jvb3RUeXBlKCkpe3RoaXMuY2hpbGRyZW5MaXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaGFkb3ctcm9vdCcpO2xldCBkZXB0aD00O2ZvcihsZXQgbm9kZT10aGlzLl9ub2RlO2RlcHRoJiZub2RlO25vZGU9bm9kZS5wYXJlbnROb2RlKXtpZihub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpCmRlcHRoLS07fQppZighZGVwdGgpCnRoaXMuY2hpbGRyZW5MaXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaGFkb3ctcm9vdC1kZWVwJyk7ZWxzZQp0aGlzLmNoaWxkcmVuTGlzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2hhZG93LXJvb3QtZGVwdGgtJytkZXB0aCk7fQpjb25zdCBoaWdobGlnaHRFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtoaWdobGlnaHRFbGVtZW50LmNsYXNzTmFtZT0naGlnaGxpZ2h0JztoaWdobGlnaHRFbGVtZW50LmFwcGVuZENoaWxkKG5vZGVJbmZvKTt0aGlzLnRpdGxlPWhpZ2hsaWdodEVsZW1lbnQ7dGhpcy51cGRhdGVEZWNvcmF0aW9ucygpO3RoaXMubGlzdEl0ZW1FbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9ndXR0ZXJDb250YWluZXIsdGhpcy5saXN0SXRlbUVsZW1lbnQuZmlyc3RDaGlsZCk7ZGVsZXRlIHRoaXMuX2hpZ2hsaWdodFJlc3VsdDtkZWxldGUgdGhpcy5zZWxlY3Rpb25FbGVtZW50O2RlbGV0ZSB0aGlzLl9oaW50RWxlbWVudDtpZih0aGlzLnNlbGVjdGVkKXt0aGlzLl9jcmVhdGVTZWxlY3Rpb24oKTt0aGlzLl9jcmVhdGVIaW50KCk7fX0KdGhpcy5faGlnaGxpZ2h0U2VhcmNoUmVzdWx0cygpO30KX2NvbXB1dGVMZWZ0SW5kZW50KCl7bGV0IHRyZWVFbGVtZW50PXRoaXMucGFyZW50O2xldCBkZXB0aD0wO3doaWxlKHRyZWVFbGVtZW50IT09bnVsbCl7ZGVwdGgrKzt0cmVlRWxlbWVudD10cmVlRWxlbWVudC5wYXJlbnQ7fQpyZXR1cm4gMTIqKGRlcHRoLTIpKyh0aGlzLmlzRXhwYW5kYWJsZSgpPzE6MTIpO30KdXBkYXRlRGVjb3JhdGlvbnMoKXt0aGlzLl9ndXR0ZXJDb250YWluZXIuc3R5bGUubGVmdD0oLXRoaXMuX2NvbXB1dGVMZWZ0SW5kZW50KCkpKydweCc7aWYodGhpcy5pc0Nsb3NpbmdUYWcoKSkKcmV0dXJuO2lmKHRoaXMuX25vZGUubm9kZVR5cGUoKSE9PU5vZGUuRUxFTUVOVF9OT0RFKQpyZXR1cm47dGhpcy5fZGVjb3JhdGlvbnNUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlRGVjb3JhdGlvbnNJbnRlcm5hbC5iaW5kKHRoaXMpKTt9Cl91cGRhdGVEZWNvcmF0aW9uc0ludGVybmFsKCl7aWYoIXRoaXMudHJlZU91dGxpbmUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBub2RlPXRoaXMuX25vZGU7aWYoIXRoaXMudHJlZU91dGxpbmUuX2RlY29yYXRvckV4dGVuc2lvbnMpCnRoaXMudHJlZU91dGxpbmUuX2RlY29yYXRvckV4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoRWxlbWVudHMuTWFya2VyRGVjb3JhdG9yKTtjb25zdCBtYXJrZXJUb0V4dGVuc2lvbj1uZXcgTWFwKCk7Zm9yKGxldCBpPTA7aTx0aGlzLnRyZWVPdXRsaW5lLl9kZWNvcmF0b3JFeHRlbnNpb25zLmxlbmd0aDsrK2kpe21hcmtlclRvRXh0ZW5zaW9uLnNldCh0aGlzLnRyZWVPdXRsaW5lLl9kZWNvcmF0b3JFeHRlbnNpb25zW2ldLmRlc2NyaXB0b3IoKVsnbWFya2VyJ10sdGhpcy50cmVlT3V0bGluZS5fZGVjb3JhdG9yRXh0ZW5zaW9uc1tpXSk7fQpjb25zdCBwcm9taXNlcz1bXTtjb25zdCBkZWNvcmF0aW9ucz1bXTtjb25zdCBkZXNjZW5kYW50RGVjb3JhdGlvbnM9W107bm9kZS50cmF2ZXJzZU1hcmtlcnModmlzaXRvcik7ZnVuY3Rpb24gdmlzaXRvcihuLG1hcmtlcil7Y29uc3QgZXh0ZW5zaW9uPW1hcmtlclRvRXh0ZW5zaW9uLmdldChtYXJrZXIpO2lmKCFleHRlbnNpb24pCnJldHVybjtwcm9taXNlcy5wdXNoKGV4dGVuc2lvbi5pbnN0YW5jZSgpLnRoZW4oY29sbGVjdERlY29yYXRpb24uYmluZChudWxsLG4pKSk7fQpmdW5jdGlvbiBjb2xsZWN0RGVjb3JhdGlvbihuLGRlY29yYXRvcil7Y29uc3QgZGVjb3JhdGlvbj1kZWNvcmF0b3IuZGVjb3JhdGUobik7aWYoIWRlY29yYXRpb24pCnJldHVybjsobj09PW5vZGU/ZGVjb3JhdGlvbnM6ZGVzY2VuZGFudERlY29yYXRpb25zKS5wdXNoKGRlY29yYXRpb24pO30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKHVwZGF0ZURlY29yYXRpb25zVUkuYmluZCh0aGlzKSk7ZnVuY3Rpb24gdXBkYXRlRGVjb3JhdGlvbnNVSSgpe3RoaXMuX2RlY29yYXRpb25zRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2RlY29yYXRpb25zRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0aGlzLl9ndXR0ZXJDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnaGFzLWRlY29yYXRpb25zJyxkZWNvcmF0aW9ucy5sZW5ndGh8fGRlc2NlbmRhbnREZWNvcmF0aW9ucy5sZW5ndGgpO2lmKCFkZWNvcmF0aW9ucy5sZW5ndGgmJiFkZXNjZW5kYW50RGVjb3JhdGlvbnMubGVuZ3RoKQpyZXR1cm47Y29uc3QgY29sb3JzPW5ldyBTZXQoKTtjb25zdCB0aXRsZXM9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgZGVjb3JhdGlvbnMpe2NvbnN0IHRpdGxlRWxlbWVudD10aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicpO3RpdGxlRWxlbWVudC50ZXh0Q29udGVudD1kZWNvcmF0aW9uLnRpdGxlO2NvbG9ycy5hZGQoZGVjb3JhdGlvbi5jb2xvcik7fQppZih0aGlzLmV4cGFuZGVkJiYhZGVjb3JhdGlvbnMubGVuZ3RoKQpyZXR1cm47Y29uc3QgZGVzY2VuZGFudENvbG9ycz1uZXcgU2V0KCk7aWYoZGVzY2VuZGFudERlY29yYXRpb25zLmxlbmd0aCl7bGV0IGVsZW1lbnQ9dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnKTtlbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQ2hpbGRyZW46Jyk7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgZGVzY2VuZGFudERlY29yYXRpb25zKXtlbGVtZW50PXRpdGxlcy5jcmVhdGVDaGlsZCgnZGl2Jyk7ZWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0PScxNXB4JztlbGVtZW50LnRleHRDb250ZW50PWRlY29yYXRpb24udGl0bGU7ZGVzY2VuZGFudENvbG9ycy5hZGQoZGVjb3JhdGlvbi5jb2xvcik7fX0KbGV0IG9mZnNldD0wO3Byb2Nlc3NDb2xvcnMuY2FsbCh0aGlzLGNvbG9ycywnZWxlbWVudHMtZ3V0dGVyLWRlY29yYXRpb24nKTtpZighdGhpcy5leHBhbmRlZCkKcHJvY2Vzc0NvbG9ycy5jYWxsKHRoaXMsZGVzY2VuZGFudENvbG9ycywnZWxlbWVudHMtZ3V0dGVyLWRlY29yYXRpb24gZWxlbWVudHMtaGFzLWRlY29yYXRlZC1jaGlsZHJlbicpO1VJLlRvb2x0aXAuaW5zdGFsbCh0aGlzLl9kZWNvcmF0aW9uc0VsZW1lbnQsdGl0bGVzKTtmdW5jdGlvbiBwcm9jZXNzQ29sb3JzKGNvbG9ycyxjbGFzc05hbWUpe2Zvcihjb25zdCBjb2xvciBvZiBjb2xvcnMpe2NvbnN0IGNoaWxkPXRoaXMuX2RlY29yYXRpb25zRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JyxjbGFzc05hbWUpO3RoaXMuX2RlY29yYXRpb25zRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtjaGlsZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y29sb3I7Y2hpbGQuc3R5bGUuYm9yZGVyQ29sb3I9Y29sb3I7aWYob2Zmc2V0KQpjaGlsZC5zdHlsZS5tYXJnaW5MZWZ0PW9mZnNldCsncHgnO29mZnNldCs9Mzt9fX19Cl9idWlsZEF0dHJpYnV0ZURPTShwYXJlbnRFbGVtZW50LG5hbWUsdmFsdWUsdXBkYXRlUmVjb3JkLGZvcmNlVmFsdWUsbm9kZSl7Y29uc3QgY2xvc2luZ1B1bmN0dWF0aW9uUmVnZXg9L1tcLzs6XClcXVx9XS9nO2xldCBoaWdobGlnaHRJbmRleD0wO2xldCBoaWdobGlnaHRDb3VudDtsZXQgYWRkaXRpb25hbEhpZ2hsaWdodE9mZnNldD0wO2xldCByZXN1bHQ7ZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gscmVwbGFjZU9mZnNldCl7d2hpbGUoaGlnaGxpZ2h0SW5kZXg8aGlnaGxpZ2h0Q291bnQmJnJlc3VsdC5lbnRpdHlSYW5nZXNbaGlnaGxpZ2h0SW5kZXhdLm9mZnNldDxyZXBsYWNlT2Zmc2V0KXtyZXN1bHQuZW50aXR5UmFuZ2VzW2hpZ2hsaWdodEluZGV4XS5vZmZzZXQrPWFkZGl0aW9uYWxIaWdobGlnaHRPZmZzZXQ7KytoaWdobGlnaHRJbmRleDt9CmFkZGl0aW9uYWxIaWdobGlnaHRPZmZzZXQrPTE7cmV0dXJuIG1hdGNoKydcdTIwMEInO30KZnVuY3Rpb24gc2V0VmFsdWVXaXRoRW50aXRpZXMoZWxlbWVudCx2YWx1ZSl7cmVzdWx0PXRoaXMuX2NvbnZlcnRXaGl0ZXNwYWNlVG9FbnRpdGllcyh2YWx1ZSk7aGlnaGxpZ2h0Q291bnQ9cmVzdWx0LmVudGl0eVJhbmdlcy5sZW5ndGg7dmFsdWU9cmVzdWx0LnRleHQucmVwbGFjZShjbG9zaW5nUHVuY3R1YXRpb25SZWdleCxyZXBsYWNlcik7d2hpbGUoaGlnaGxpZ2h0SW5kZXg8aGlnaGxpZ2h0Q291bnQpe3Jlc3VsdC5lbnRpdHlSYW5nZXNbaGlnaGxpZ2h0SW5kZXhdLm9mZnNldCs9YWRkaXRpb25hbEhpZ2hsaWdodE9mZnNldDsrK2hpZ2hsaWdodEluZGV4O30KZWxlbWVudC5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKHZhbHVlKTtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyhlbGVtZW50LHJlc3VsdC5lbnRpdHlSYW5nZXMsJ3dlYmtpdC1odG1sLWVudGl0eS12YWx1ZScpO30KY29uc3QgaGFzVGV4dD0oZm9yY2VWYWx1ZXx8dmFsdWUubGVuZ3RoPjApO2NvbnN0IGF0dHJTcGFuRWxlbWVudD1wYXJlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnd2Via2l0LWh0bWwtYXR0cmlidXRlJyk7Y29uc3QgYXR0ck5hbWVFbGVtZW50PWF0dHJTcGFuRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS1uYW1lJyk7YXR0ck5hbWVFbGVtZW50LnRleHRDb250ZW50PW5hbWU7aWYoaGFzVGV4dCkKYXR0clNwYW5FbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnPVx1MjAwQiInKTtjb25zdCBhdHRyVmFsdWVFbGVtZW50PWF0dHJTcGFuRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS12YWx1ZScpO2lmKHVwZGF0ZVJlY29yZCYmdXBkYXRlUmVjb3JkLmlzQXR0cmlidXRlTW9kaWZpZWQobmFtZSkpClVJLnJ1bkNTU0FuaW1hdGlvbk9uY2UoaGFzVGV4dD9hdHRyVmFsdWVFbGVtZW50OmF0dHJOYW1lRWxlbWVudCwnZG9tLXVwZGF0ZS1oaWdobGlnaHQnKTtmdW5jdGlvbiBsaW5raWZ5VmFsdWUodmFsdWUpe2NvbnN0IHJld3JpdHRlbkhyZWY9bm9kZS5yZXNvbHZlVVJMKHZhbHVlKTtpZihyZXdyaXR0ZW5IcmVmPT09bnVsbCl7Y29uc3Qgc3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7c2V0VmFsdWVXaXRoRW50aXRpZXMuY2FsbCh0aGlzLHNwYW4sdmFsdWUpO3JldHVybiBzcGFuO30KdmFsdWU9dmFsdWUucmVwbGFjZShjbG9zaW5nUHVuY3R1YXRpb25SZWdleCwnJCZcdTIwMEInKTtpZih2YWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpKQp2YWx1ZT12YWx1ZS50cmltTWlkZGxlKDYwKTtjb25zdCBsaW5rPW5vZGUubm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpPT09J2EnP1VJLlhMaW5rLmNyZWF0ZShyZXdyaXR0ZW5IcmVmLHZhbHVlLCcnLHRydWUpOkNvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwocmV3cml0dGVuSHJlZix7dGV4dDp2YWx1ZSxwcmV2ZW50Q2xpY2s6dHJ1ZX0pO2xpbmtbRWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudC5IcmVmU3ltYm9sXT1yZXdyaXR0ZW5IcmVmO3JldHVybiBsaW5rO30KY29uc3Qgbm9kZU5hbWU9bm9kZT9ub2RlLm5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKTonJztpZihub2RlTmFtZSYmKG5hbWU9PT0nc3JjJ3x8bmFtZT09PSdocmVmJykpCmF0dHJWYWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua2lmeVZhbHVlLmNhbGwodGhpcyx2YWx1ZSkpO2Vsc2UgaWYoKG5vZGVOYW1lPT09J2ltZyd8fG5vZGVOYW1lPT09J3NvdXJjZScpJiZuYW1lPT09J3NyY3NldCcpCmF0dHJWYWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua2lmeVNyY3NldC5jYWxsKHRoaXMsdmFsdWUpKTtlbHNlCnNldFZhbHVlV2l0aEVudGl0aWVzLmNhbGwodGhpcyxhdHRyVmFsdWVFbGVtZW50LHZhbHVlKTtpZihoYXNUZXh0KQphdHRyU3BhbkVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCciJyk7ZnVuY3Rpb24gbGlua2lmeVNyY3NldCh2YWx1ZSl7Y29uc3QgZnJhZ21lbnQ9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2xldCBpPTA7d2hpbGUodmFsdWUubGVuZ3RoKXtpZihpKys+MCkKZnJhZ21lbnQuY3JlYXRlVGV4dENoaWxkKCcgJyk7dmFsdWU9dmFsdWUudHJpbSgpO2xldCB1cmw9Jyc7bGV0IGRlc2NyaXB0b3I9Jyc7Y29uc3QgaW5kZXhPZlNwYWNlPXZhbHVlLnNlYXJjaCgvXHMvKTtpZihpbmRleE9mU3BhY2U9PT0tMSl7dXJsPXZhbHVlO31lbHNlIGlmKGluZGV4T2ZTcGFjZT4wJiZ2YWx1ZVtpbmRleE9mU3BhY2UtMV09PT0nLCcpe3VybD12YWx1ZS5zdWJzdHJpbmcoMCxpbmRleE9mU3BhY2UpO31lbHNle3VybD12YWx1ZS5zdWJzdHJpbmcoMCxpbmRleE9mU3BhY2UpO2NvbnN0IGluZGV4T2ZDb21tYT12YWx1ZS5pbmRleE9mKCcsJyxpbmRleE9mU3BhY2UpO2lmKGluZGV4T2ZDb21tYSE9PS0xKQpkZXNjcmlwdG9yPXZhbHVlLnN1YnN0cmluZyhpbmRleE9mU3BhY2UsaW5kZXhPZkNvbW1hKzEpO2Vsc2UKZGVzY3JpcHRvcj12YWx1ZS5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlKTt9CmlmKHVybCl7aWYodXJsLmVuZHNXaXRoKCcsJykpe2ZyYWdtZW50LmFwcGVuZENoaWxkKGxpbmtpZnlWYWx1ZS5jYWxsKHRoaXMsdXJsLnN1YnN0cmluZygwLHVybC5sZW5ndGgtMSkpKTtmcmFnbWVudC5jcmVhdGVUZXh0Q2hpbGQoJywnKTt9ZWxzZXtmcmFnbWVudC5hcHBlbmRDaGlsZChsaW5raWZ5VmFsdWUuY2FsbCh0aGlzLHVybCkpO319CmlmKGRlc2NyaXB0b3IpCmZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZChkZXNjcmlwdG9yKTt2YWx1ZT12YWx1ZS5zdWJzdHJpbmcodXJsLmxlbmd0aCtkZXNjcmlwdG9yLmxlbmd0aCk7fQpyZXR1cm4gZnJhZ21lbnQ7fX0KX2J1aWxkUHNldWRvRWxlbWVudERPTShwYXJlbnRFbGVtZW50LHBzZXVkb0VsZW1lbnROYW1lKXtjb25zdCBwc2V1ZG9FbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd3ZWJraXQtaHRtbC1wc2V1ZG8tZWxlbWVudCcpO3BzZXVkb0VsZW1lbnQudGV4dENvbnRlbnQ9Jzo6Jytwc2V1ZG9FbGVtZW50TmFtZTtwYXJlbnRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnXHUyMDBCJyk7fQpfYnVpbGRUYWdET00ocGFyZW50RWxlbWVudCx0YWdOYW1lLGlzQ2xvc2luZ1RhZyxpc0Rpc3RpbmN0VHJlZUVsZW1lbnQsdXBkYXRlUmVjb3JkKXtjb25zdCBub2RlPXRoaXMuX25vZGU7Y29uc3QgY2xhc3Nlcz1bJ3dlYmtpdC1odG1sLXRhZyddO2lmKGlzQ2xvc2luZ1RhZyYmaXNEaXN0aW5jdFRyZWVFbGVtZW50KQpjbGFzc2VzLnB1c2goJ2Nsb3NlJyk7Y29uc3QgdGFnRWxlbWVudD1wYXJlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyxjbGFzc2VzLmpvaW4oJyAnKSk7dGFnRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJzwnKTtjb25zdCB0YWdOYW1lRWxlbWVudD10YWdFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyxpc0Nsb3NpbmdUYWc/J3dlYmtpdC1odG1sLWNsb3NlLXRhZy1uYW1lJzond2Via2l0LWh0bWwtdGFnLW5hbWUnKTt0YWdOYW1lRWxlbWVudC50ZXh0Q29udGVudD0oaXNDbG9zaW5nVGFnPycvJzonJykrdGFnTmFtZTtpZighaXNDbG9zaW5nVGFnKXtpZihub2RlLmhhc0F0dHJpYnV0ZXMoKSl7Y29uc3QgYXR0cmlidXRlcz1ub2RlLmF0dHJpYnV0ZXMoKTtmb3IobGV0IGk9MDtpPGF0dHJpYnV0ZXMubGVuZ3RoOysraSl7Y29uc3QgYXR0cj1hdHRyaWJ1dGVzW2ldO3RhZ0VsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCcgJyk7dGhpcy5fYnVpbGRBdHRyaWJ1dGVET00odGFnRWxlbWVudCxhdHRyLm5hbWUsYXR0ci52YWx1ZSx1cGRhdGVSZWNvcmQsZmFsc2Usbm9kZSk7fX0KaWYodXBkYXRlUmVjb3JkKXtsZXQgaGFzVXBkYXRlcz11cGRhdGVSZWNvcmQuaGFzUmVtb3ZlZEF0dHJpYnV0ZXMoKXx8dXBkYXRlUmVjb3JkLmhhc1JlbW92ZWRDaGlsZHJlbigpO2hhc1VwZGF0ZXN8PSF0aGlzLmV4cGFuZGVkJiZ1cGRhdGVSZWNvcmQuaGFzQ2hhbmdlZENoaWxkcmVuKCk7aWYoaGFzVXBkYXRlcykKVUkucnVuQ1NTQW5pbWF0aW9uT25jZSh0YWdOYW1lRWxlbWVudCwnZG9tLXVwZGF0ZS1oaWdobGlnaHQnKTt9fQp0YWdFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnPicpO3BhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCdcdTIwMEInKTt9Cl9jb252ZXJ0V2hpdGVzcGFjZVRvRW50aXRpZXModGV4dCl7bGV0IHJlc3VsdD0nJztsZXQgbGFzdEluZGV4QWZ0ZXJFbnRpdHk9MDtjb25zdCBlbnRpdHlSYW5nZXM9W107Y29uc3QgY2hhclRvRW50aXR5PUVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuTWFwcGVkQ2hhclRvRW50aXR5O2ZvcihsZXQgaT0wLHNpemU9dGV4dC5sZW5ndGg7aTxzaXplOysraSl7Y29uc3QgY2hhcj10ZXh0LmNoYXJBdChpKTtpZihjaGFyVG9FbnRpdHlbY2hhcl0pe3Jlc3VsdCs9dGV4dC5zdWJzdHJpbmcobGFzdEluZGV4QWZ0ZXJFbnRpdHksaSk7Y29uc3QgZW50aXR5VmFsdWU9JyYnK2NoYXJUb0VudGl0eVtjaGFyXSsnOyc7ZW50aXR5UmFuZ2VzLnB1c2goe29mZnNldDpyZXN1bHQubGVuZ3RoLGxlbmd0aDplbnRpdHlWYWx1ZS5sZW5ndGh9KTtyZXN1bHQrPWVudGl0eVZhbHVlO2xhc3RJbmRleEFmdGVyRW50aXR5PWkrMTt9fQppZihyZXN1bHQpCnJlc3VsdCs9dGV4dC5zdWJzdHJpbmcobGFzdEluZGV4QWZ0ZXJFbnRpdHkpO3JldHVybnt0ZXh0OnJlc3VsdHx8dGV4dCxlbnRpdHlSYW5nZXM6ZW50aXR5UmFuZ2VzfTt9Cl9ub2RlVGl0bGVJbmZvKHVwZGF0ZVJlY29yZCl7Y29uc3Qgbm9kZT10aGlzLl9ub2RlO2NvbnN0IHRpdGxlRE9NPWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtzd2l0Y2gobm9kZS5ub2RlVHlwZSgpKXtjYXNlIE5vZGUuQVRUUklCVVRFX05PREU6dGhpcy5fYnVpbGRBdHRyaWJ1dGVET00odGl0bGVET00sKG5vZGUubmFtZSksKG5vZGUudmFsdWUpLHVwZGF0ZVJlY29yZCx0cnVlKTticmVhaztjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNvbnN0IHBzZXVkb1R5cGU9bm9kZS5wc2V1ZG9UeXBlKCk7aWYocHNldWRvVHlwZSl7dGhpcy5fYnVpbGRQc2V1ZG9FbGVtZW50RE9NKHRpdGxlRE9NLHBzZXVkb1R5cGUpO2JyZWFrO30KY29uc3QgdGFnTmFtZT1ub2RlLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpO2lmKHRoaXMuX2VsZW1lbnRDbG9zZVRhZyl7dGhpcy5fYnVpbGRUYWdET00odGl0bGVET00sdGFnTmFtZSx0cnVlLHRydWUsdXBkYXRlUmVjb3JkKTticmVhazt9CnRoaXMuX2J1aWxkVGFnRE9NKHRpdGxlRE9NLHRhZ05hbWUsZmFsc2UsZmFsc2UsdXBkYXRlUmVjb3JkKTtpZih0aGlzLmlzRXhwYW5kYWJsZSgpKXtpZighdGhpcy5leHBhbmRlZCl7Y29uc3QgdGV4dE5vZGVFbGVtZW50PXRpdGxlRE9NLmNyZWF0ZUNoaWxkKCdzcGFuJywnd2Via2l0LWh0bWwtdGV4dC1ub2RlIGJvZ3VzJyk7dGV4dE5vZGVFbGVtZW50LnRleHRDb250ZW50PSdcdTIwMjYnO3RpdGxlRE9NLmNyZWF0ZVRleHRDaGlsZCgnXHUyMDBCJyk7dGhpcy5fYnVpbGRUYWdET00odGl0bGVET00sdGFnTmFtZSx0cnVlLGZhbHNlLHVwZGF0ZVJlY29yZCk7fQpicmVhazt9CmlmKEVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuY2FuU2hvd0lubGluZVRleHQobm9kZSkpe2NvbnN0IHRleHROb2RlRWxlbWVudD10aXRsZURPTS5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLXRleHQtbm9kZScpO2NvbnN0IHJlc3VsdD10aGlzLl9jb252ZXJ0V2hpdGVzcGFjZVRvRW50aXRpZXMobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSgpKTt0ZXh0Tm9kZUVsZW1lbnQudGV4dENvbnRlbnQ9cmVzdWx0LnRleHQ7VUkuaGlnaGxpZ2h0UmFuZ2VzV2l0aFN0eWxlQ2xhc3ModGV4dE5vZGVFbGVtZW50LHJlc3VsdC5lbnRpdHlSYW5nZXMsJ3dlYmtpdC1odG1sLWVudGl0eS12YWx1ZScpO3RpdGxlRE9NLmNyZWF0ZVRleHRDaGlsZCgnXHUyMDBCJyk7dGhpcy5fYnVpbGRUYWdET00odGl0bGVET00sdGFnTmFtZSx0cnVlLGZhbHNlLHVwZGF0ZVJlY29yZCk7aWYodXBkYXRlUmVjb3JkJiZ1cGRhdGVSZWNvcmQuaGFzQ2hhbmdlZENoaWxkcmVuKCkpClVJLnJ1bkNTU0FuaW1hdGlvbk9uY2UodGV4dE5vZGVFbGVtZW50LCdkb20tdXBkYXRlLWhpZ2hsaWdodCcpO2lmKHVwZGF0ZVJlY29yZCYmdXBkYXRlUmVjb3JkLmlzQ2hhckRhdGFNb2RpZmllZCgpKQpVSS5ydW5DU1NBbmltYXRpb25PbmNlKHRleHROb2RlRWxlbWVudCwnZG9tLXVwZGF0ZS1oaWdobGlnaHQnKTticmVhazt9CmlmKHRoaXMudHJlZU91dGxpbmUuaXNYTUxNaW1lVHlwZXx8IUVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuRm9yYmlkZGVuQ2xvc2luZ1RhZ0VsZW1lbnRzLmhhcyh0YWdOYW1lKSkKdGhpcy5fYnVpbGRUYWdET00odGl0bGVET00sdGFnTmFtZSx0cnVlLGZhbHNlLHVwZGF0ZVJlY29yZCk7YnJlYWs7Y2FzZSBOb2RlLlRFWFRfTk9ERTppZihub2RlLnBhcmVudE5vZGUmJm5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSgpLnRvTG93ZXJDYXNlKCk9PT0nc2NyaXB0Jyl7Y29uc3QgbmV3Tm9kZT10aXRsZURPTS5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLXRleHQtbm9kZSB3ZWJraXQtaHRtbC1qcy1ub2RlJyk7Y29uc3QgdGV4dD1ub2RlLm5vZGVWYWx1ZSgpO25ld05vZGUudGV4dENvbnRlbnQ9dGV4dC5zdGFydHNXaXRoKCdcbicpP3RleHQuc3Vic3RyaW5nKDEpOnRleHQ7Y29uc3QgamF2YXNjcmlwdFN5bnRheEhpZ2hsaWdodGVyPW5ldyBVSS5TeW50YXhIaWdobGlnaHRlcigndGV4dC9qYXZhc2NyaXB0Jyx0cnVlKTtqYXZhc2NyaXB0U3ludGF4SGlnaGxpZ2h0ZXIuc3ludGF4SGlnaGxpZ2h0Tm9kZShuZXdOb2RlKS50aGVuKHVwZGF0ZVNlYXJjaEhpZ2hsaWdodC5iaW5kKHRoaXMpKTt9ZWxzZSBpZihub2RlLnBhcmVudE5vZGUmJm5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSgpLnRvTG93ZXJDYXNlKCk9PT0nc3R5bGUnKXtjb25zdCBuZXdOb2RlPXRpdGxlRE9NLmNyZWF0ZUNoaWxkKCdzcGFuJywnd2Via2l0LWh0bWwtdGV4dC1ub2RlIHdlYmtpdC1odG1sLWNzcy1ub2RlJyk7Y29uc3QgdGV4dD1ub2RlLm5vZGVWYWx1ZSgpO25ld05vZGUudGV4dENvbnRlbnQ9dGV4dC5zdGFydHNXaXRoKCdcbicpP3RleHQuc3Vic3RyaW5nKDEpOnRleHQ7Y29uc3QgY3NzU3ludGF4SGlnaGxpZ2h0ZXI9bmV3IFVJLlN5bnRheEhpZ2hsaWdodGVyKCd0ZXh0L2NzcycsdHJ1ZSk7Y3NzU3ludGF4SGlnaGxpZ2h0ZXIuc3ludGF4SGlnaGxpZ2h0Tm9kZShuZXdOb2RlKS50aGVuKHVwZGF0ZVNlYXJjaEhpZ2hsaWdodC5iaW5kKHRoaXMpKTt9ZWxzZXt0aXRsZURPTS5jcmVhdGVUZXh0Q2hpbGQoJyInKTtjb25zdCB0ZXh0Tm9kZUVsZW1lbnQ9dGl0bGVET00uY3JlYXRlQ2hpbGQoJ3NwYW4nLCd3ZWJraXQtaHRtbC10ZXh0LW5vZGUnKTtjb25zdCByZXN1bHQ9dGhpcy5fY29udmVydFdoaXRlc3BhY2VUb0VudGl0aWVzKG5vZGUubm9kZVZhbHVlKCkpO3RleHROb2RlRWxlbWVudC50ZXh0Q29udGVudD1yZXN1bHQudGV4dDtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyh0ZXh0Tm9kZUVsZW1lbnQscmVzdWx0LmVudGl0eVJhbmdlcywnd2Via2l0LWh0bWwtZW50aXR5LXZhbHVlJyk7dGl0bGVET00uY3JlYXRlVGV4dENoaWxkKCciJyk7aWYodXBkYXRlUmVjb3JkJiZ1cGRhdGVSZWNvcmQuaXNDaGFyRGF0YU1vZGlmaWVkKCkpClVJLnJ1bkNTU0FuaW1hdGlvbk9uY2UodGV4dE5vZGVFbGVtZW50LCdkb20tdXBkYXRlLWhpZ2hsaWdodCcpO30KYnJlYWs7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpjb25zdCBjb21tZW50RWxlbWVudD10aXRsZURPTS5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLWNvbW1lbnQnKTtjb21tZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJzwhLS0nK25vZGUubm9kZVZhbHVlKCkrJy0tPicpO2JyZWFrO2Nhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6Y29uc3QgZG9jVHlwZUVsZW1lbnQ9dGl0bGVET00uY3JlYXRlQ2hpbGQoJ3NwYW4nLCd3ZWJraXQtaHRtbC1kb2N0eXBlJyk7ZG9jVHlwZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCc8IWRvY3R5cGUgJytub2RlLm5vZGVOYW1lKCkpO2lmKG5vZGUucHVibGljSWQpe2RvY1R5cGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnIFBVQkxJQyAiJytub2RlLnB1YmxpY0lkKyciJyk7aWYobm9kZS5zeXN0ZW1JZCkKZG9jVHlwZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCcgIicrbm9kZS5zeXN0ZW1JZCsnIicpO31lbHNlIGlmKG5vZGUuc3lzdGVtSWQpe2RvY1R5cGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnIFNZU1RFTSAiJytub2RlLnN5c3RlbUlkKyciJyk7fQppZihub2RlLmludGVybmFsU3Vic2V0KQpkb2NUeXBlRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJyBbJytub2RlLmludGVybmFsU3Vic2V0KyddJyk7ZG9jVHlwZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCc+Jyk7YnJlYWs7Y2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERTpjb25zdCBjZGF0YUVsZW1lbnQ9dGl0bGVET00uY3JlYXRlQ2hpbGQoJ3NwYW4nLCd3ZWJraXQtaHRtbC10ZXh0LW5vZGUnKTtjZGF0YUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCc8IVtDREFUQVsnK25vZGUubm9kZVZhbHVlKCkrJ11dPicpO2JyZWFrO2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmNvbnN0IGZyYWdtZW50RWxlbWVudD10aXRsZURPTS5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLWZyYWdtZW50Jyk7ZnJhZ21lbnRFbGVtZW50LnRleHRDb250ZW50PW5vZGUubm9kZU5hbWVJbkNvcnJlY3RDYXNlKCkuY29sbGFwc2VXaGl0ZXNwYWNlKCk7YnJlYWs7ZGVmYXVsdDp0aXRsZURPTS5jcmVhdGVUZXh0Q2hpbGQobm9kZS5ub2RlTmFtZUluQ29ycmVjdENhc2UoKS5jb2xsYXBzZVdoaXRlc3BhY2UoKSk7fQpmdW5jdGlvbiB1cGRhdGVTZWFyY2hIaWdobGlnaHQoKXtkZWxldGUgdGhpcy5faGlnaGxpZ2h0UmVzdWx0O3RoaXMuX2hpZ2hsaWdodFNlYXJjaFJlc3VsdHMoKTt9CnJldHVybiB0aXRsZURPTTt9CnJlbW92ZSgpe2lmKHRoaXMuX25vZGUucHNldWRvVHlwZSgpKQpyZXR1cm47Y29uc3QgcGFyZW50RWxlbWVudD10aGlzLnBhcmVudDtpZighcGFyZW50RWxlbWVudCkKcmV0dXJuO2lmKCF0aGlzLl9ub2RlLnBhcmVudE5vZGV8fHRoaXMuX25vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSgpPT09Tm9kZS5ET0NVTUVOVF9OT0RFKQpyZXR1cm47dGhpcy5fbm9kZS5yZW1vdmVOb2RlKCk7fQp0b2dnbGVFZGl0QXNIVE1MKGNhbGxiYWNrLHN0YXJ0RWRpdGluZyl7aWYodGhpcy5fZWRpdGluZyYmdGhpcy5faHRtbEVkaXRFbGVtZW50KXt0aGlzLl9lZGl0aW5nLmNvbW1pdCgpO3JldHVybjt9CmlmKHN0YXJ0RWRpdGluZz09PWZhbHNlKQpyZXR1cm47ZnVuY3Rpb24gc2VsZWN0Tm9kZShlcnJvcil7aWYoY2FsbGJhY2spCmNhbGxiYWNrKCFlcnJvcik7fQpmdW5jdGlvbiBjb21taXRDaGFuZ2UoaW5pdGlhbFZhbHVlLHZhbHVlKXtpZihpbml0aWFsVmFsdWUhPT12YWx1ZSkKbm9kZS5zZXRPdXRlckhUTUwodmFsdWUsc2VsZWN0Tm9kZSk7fQpmdW5jdGlvbiBkaXNwb3NlQ2FsbGJhY2soKXtpZihjYWxsYmFjaykKY2FsbGJhY2soZmFsc2UpO30KY29uc3Qgbm9kZT10aGlzLl9ub2RlO25vZGUuZ2V0T3V0ZXJIVE1MKCkudGhlbih0aGlzLl9zdGFydEVkaXRpbmdBc0hUTUwuYmluZCh0aGlzLGNvbW1pdENoYW5nZSxkaXNwb3NlQ2FsbGJhY2spKTt9Cl9jb3B5Q1NTUGF0aCgpe0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChFbGVtZW50cy5ET01QYXRoLmNzc1BhdGgodGhpcy5fbm9kZSx0cnVlKSk7fQpfY29weVhQYXRoKCl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KEVsZW1lbnRzLkRPTVBhdGgueFBhdGgodGhpcy5fbm9kZSx0cnVlKSk7fQpfaGlnaGxpZ2h0U2VhcmNoUmVzdWx0cygpe2lmKCF0aGlzLl9zZWFyY2hRdWVyeXx8IXRoaXMuX3NlYXJjaEhpZ2hsaWdodHNWaXNpYmxlKQpyZXR1cm47dGhpcy5faGlkZVNlYXJjaEhpZ2hsaWdodCgpO2NvbnN0IHRleHQ9dGhpcy5saXN0SXRlbUVsZW1lbnQudGV4dENvbnRlbnQ7Y29uc3QgcmVnZXhPYmplY3Q9Y3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgodGhpcy5fc2VhcmNoUXVlcnksJ2dpJyk7bGV0IG1hdGNoPXJlZ2V4T2JqZWN0LmV4ZWModGV4dCk7Y29uc3QgbWF0Y2hSYW5nZXM9W107d2hpbGUobWF0Y2gpe21hdGNoUmFuZ2VzLnB1c2gobmV3IFRleHRVdGlscy5Tb3VyY2VSYW5nZShtYXRjaC5pbmRleCxtYXRjaFswXS5sZW5ndGgpKTttYXRjaD1yZWdleE9iamVjdC5leGVjKHRleHQpO30KaWYoIW1hdGNoUmFuZ2VzLmxlbmd0aCkKbWF0Y2hSYW5nZXMucHVzaChuZXcgVGV4dFV0aWxzLlNvdXJjZVJhbmdlKDAsdGV4dC5sZW5ndGgpKTt0aGlzLl9oaWdobGlnaHRSZXN1bHQ9W107VUkuaGlnaGxpZ2h0U2VhcmNoUmVzdWx0cyh0aGlzLmxpc3RJdGVtRWxlbWVudCxtYXRjaFJhbmdlcyx0aGlzLl9oaWdobGlnaHRSZXN1bHQpO30KX2VkaXRBc0hUTUwoKXtjb25zdCBwcm9taXNlPUNvbW1vbi5SZXZlYWxlci5yZXZlYWwodGhpcy5ub2RlKCkpO3Byb21pc2UudGhlbigoKT0+VUkuYWN0aW9uUmVnaXN0cnkuYWN0aW9uKCdlbGVtZW50cy5lZGl0LWFzLWh0bWwnKS5leGVjdXRlKCkpO319O0VsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuSHJlZlN5bWJvbD1TeW1ib2woJ0VsZW1lbnRzVHJlZUVsZW1lbnQuSHJlZicpO0VsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuSW5pdGlhbENoaWxkcmVuTGltaXQ9NTAwO0VsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuRm9yYmlkZGVuQ2xvc2luZ1RhZ0VsZW1lbnRzPW5ldyBTZXQoWydhcmVhJywnYmFzZScsJ2Jhc2Vmb250JywnYnInLCdjYW52YXMnLCdjb2wnLCdjb21tYW5kJywnZW1iZWQnLCdmcmFtZScsJ2hyJywnaW1nJywnaW5wdXQnLCdrZXlnZW4nLCdsaW5rJywnbWVudWl0ZW0nLCdtZXRhJywncGFyYW0nLCdzb3VyY2UnLCd0cmFjaycsJ3diciddKTtFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkVkaXRUYWdCbGFja2xpc3Q9bmV3IFNldChbJ2h0bWwnLCdoZWFkJywnYm9keSddKTtFbGVtZW50cy5NdWx0aWxpbmVFZGl0b3JDb250cm9sbGVyOztFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lPWNsYXNzIGV4dGVuZHMgVUkuVHJlZU91dGxpbmV7Y29uc3RydWN0b3Iob21pdFJvb3RET01Ob2RlLHNlbGVjdEVuYWJsZWQpe3N1cGVyKCk7dGhpcy5fdHJlZUVsZW1lbnRTeW1ib2w9U3ltYm9sKCd0cmVlRWxlbWVudCcpO2NvbnN0IHNoYWRvd0NvbnRhaW5lcj1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLl9zaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyhzaGFkb3dDb250YWluZXIsJ2VsZW1lbnRzL2VsZW1lbnRzVHJlZU91dGxpbmUuY3NzJyk7Y29uc3Qgb3V0bGluZURpc2Nsb3N1cmVFbGVtZW50PXRoaXMuX3NoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ2VsZW1lbnRzLWRpc2Nsb3N1cmUnKTt0aGlzLl9lbGVtZW50PXRoaXMuZWxlbWVudDt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2VsZW1lbnRzLXRyZWUtb3V0bGluZScsJ3NvdXJjZS1jb2RlJyk7VUkuQVJJQVV0aWxzLnNldEFjY2Vzc2libGVOYW1lKHRoaXMuX2VsZW1lbnQsQ29tbW9uLlVJU3RyaW5nKCdQYWdlIERPTScpKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fb25tb3VzZWRvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX29ubW91c2Vtb3ZlLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsdGhpcy5fb25tb3VzZWxlYXZlLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0Jyx0aGlzLl9vbmRyYWdzdGFydC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJyx0aGlzLl9vbmRyYWdvdmVyLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJyx0aGlzLl9vbmRyYWdsZWF2ZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLHRoaXMuX29uZHJvcC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLHRoaXMuX29uZHJhZ2VuZC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9jb250ZXh0TWVudUV2ZW50RmlyZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGlwYm9hcmQtYmVmb3JlY29weScsdGhpcy5fb25CZWZvcmVDb3B5LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpcGJvYXJkLWNvcHknLHRoaXMuX29uQ29weU9yQ3V0LmJpbmQodGhpcyxmYWxzZSksZmFsc2UpO3RoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpcGJvYXJkLWN1dCcsdGhpcy5fb25Db3B5T3JDdXQuYmluZCh0aGlzLHRydWUpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaXBib2FyZC1wYXN0ZScsdGhpcy5fb25QYXN0ZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTtvdXRsaW5lRGlzY2xvc3VyZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7dGhpcy5lbGVtZW50PXNoYWRvd0NvbnRhaW5lcjt0aGlzLl9pbmNsdWRlUm9vdERPTU5vZGU9IW9taXRSb290RE9NTm9kZTt0aGlzLl9zZWxlY3RFbmFibGVkPXNlbGVjdEVuYWJsZWQ7dGhpcy5fcm9vdERPTU5vZGU9bnVsbDt0aGlzLl9zZWxlY3RlZERPTU5vZGU9bnVsbDt0aGlzLl92aXNpYmxlPWZhbHNlO3RoaXMuX3BvcG92ZXJIZWxwZXI9bmV3IFVJLlBvcG92ZXJIZWxwZXIodGhpcy5fZWxlbWVudCx0aGlzLl9nZXRQb3BvdmVyUmVxdWVzdC5iaW5kKHRoaXMpKTt0aGlzLl9wb3BvdmVySGVscGVyLnNldEhhc1BhZGRpbmcodHJ1ZSk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXRUaW1lb3V0KDAsMTAwKTt0aGlzLl91cGRhdGVSZWNvcmRzPW5ldyBNYXAoKTt0aGlzLl90cmVlRWxlbWVudHNCZWluZ1VwZGF0ZWQ9bmV3IFNldCgpO3RoaXMuX3Nob3dIVE1MQ29tbWVudHNTZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93SFRNTENvbW1lbnRzJyk7dGhpcy5fc2hvd0hUTUxDb21tZW50c1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fb25TaG93SFRNTENvbW1lbnRzQ2hhbmdlLmJpbmQodGhpcykpO30Kc3RhdGljIGZvckRPTU1vZGVsKGRvbU1vZGVsKXtyZXR1cm4gZG9tTW9kZWxbRWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5fdHJlZU91dGxpbmVTeW1ib2xdfHxudWxsO30KX29uU2hvd0hUTUxDb21tZW50c0NoYW5nZSgpe2NvbnN0IHNlbGVjdGVkTm9kZT10aGlzLnNlbGVjdGVkRE9NTm9kZSgpO2lmKHNlbGVjdGVkTm9kZSYmc2VsZWN0ZWROb2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkNPTU1FTlRfTk9ERSYmIXRoaXMuX3Nob3dIVE1MQ29tbWVudHNTZXR0aW5nLmdldCgpKQp0aGlzLnNlbGVjdERPTU5vZGUoc2VsZWN0ZWROb2RlLnBhcmVudE5vZGUpO3RoaXMudXBkYXRlKCk7fQp0cmVlRWxlbWVudFN5bWJvbCgpe3JldHVybiB0aGlzLl90cmVlRWxlbWVudFN5bWJvbDt9CnNldFdvcmRXcmFwKHdyYXApe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZWxlbWVudHMtdHJlZS1ub3dyYXAnLCF3cmFwKTt9CnNldE11bHRpbGluZUVkaXRpbmcobXVsdGlsaW5lRWRpdGluZyl7dGhpcy5fbXVsdGlsaW5lRWRpdGluZz1tdWx0aWxpbmVFZGl0aW5nO30KdmlzaWJsZVdpZHRoKCl7cmV0dXJuIHRoaXMuX3Zpc2libGVXaWR0aDt9CnNldFZpc2libGVXaWR0aCh3aWR0aCl7dGhpcy5fdmlzaWJsZVdpZHRoPXdpZHRoO2lmKHRoaXMuX211bHRpbGluZUVkaXRpbmcpCnRoaXMuX211bHRpbGluZUVkaXRpbmcucmVzaXplKCk7fQpfc2V0Q2xpcGJvYXJkRGF0YShkYXRhKXtpZih0aGlzLl9jbGlwYm9hcmROb2RlRGF0YSl7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5maW5kVHJlZUVsZW1lbnQodGhpcy5fY2xpcGJvYXJkTm9kZURhdGEubm9kZSk7aWYodHJlZUVsZW1lbnQpCnRyZWVFbGVtZW50LnNldEluQ2xpcGJvYXJkKGZhbHNlKTtkZWxldGUgdGhpcy5fY2xpcGJvYXJkTm9kZURhdGE7fQppZihkYXRhKXtjb25zdCB0cmVlRWxlbWVudD10aGlzLmZpbmRUcmVlRWxlbWVudChkYXRhLm5vZGUpO2lmKHRyZWVFbGVtZW50KQp0cmVlRWxlbWVudC5zZXRJbkNsaXBib2FyZCh0cnVlKTt0aGlzLl9jbGlwYm9hcmROb2RlRGF0YT1kYXRhO319CnJlc2V0Q2xpcGJvYXJkSWZOZWVkZWQocmVtb3ZlZE5vZGUpe2lmKHRoaXMuX2NsaXBib2FyZE5vZGVEYXRhJiZ0aGlzLl9jbGlwYm9hcmROb2RlRGF0YS5ub2RlPT09cmVtb3ZlZE5vZGUpCnRoaXMuX3NldENsaXBib2FyZERhdGEobnVsbCk7fQpfb25CZWZvcmVDb3B5KGV2ZW50KXtldmVudC5oYW5kbGVkPXRydWU7fQpfb25Db3B5T3JDdXQoaXNDdXQsZXZlbnQpe3RoaXMuX3NldENsaXBib2FyZERhdGEobnVsbCk7Y29uc3Qgb3JpZ2luYWxFdmVudD1ldmVudFsnb3JpZ2luYWwnXTtpZihvcmlnaW5hbEV2ZW50LnRhcmdldC5oYXNTZWxlY3Rpb24oKSkKcmV0dXJuO2lmKFVJLmlzRWRpdGluZygpKQpyZXR1cm47Y29uc3QgdGFyZ2V0Tm9kZT10aGlzLnNlbGVjdGVkRE9NTm9kZSgpO2lmKCF0YXJnZXROb2RlKQpyZXR1cm47b3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO2V2ZW50LmhhbmRsZWQ9dHJ1ZTt0aGlzLnBlcmZvcm1Db3B5T3JDdXQoaXNDdXQsdGFyZ2V0Tm9kZSk7fQpwZXJmb3JtQ29weU9yQ3V0KGlzQ3V0LG5vZGUpe2lmKGlzQ3V0JiYobm9kZS5pc1NoYWRvd1Jvb3QoKXx8bm9kZS5hbmNlc3RvclVzZXJBZ2VudFNoYWRvd1Jvb3QoKSkpCnJldHVybjtub2RlLmNvcHlOb2RlKCk7dGhpcy5fc2V0Q2xpcGJvYXJkRGF0YSh7bm9kZTpub2RlLGlzQ3V0OmlzQ3V0fSk7fQpjYW5QYXN0ZSh0YXJnZXROb2RlKXtpZih0YXJnZXROb2RlLmlzU2hhZG93Um9vdCgpfHx0YXJnZXROb2RlLmFuY2VzdG9yVXNlckFnZW50U2hhZG93Um9vdCgpKQpyZXR1cm4gZmFsc2U7aWYoIXRoaXMuX2NsaXBib2FyZE5vZGVEYXRhKQpyZXR1cm4gZmFsc2U7Y29uc3Qgbm9kZT10aGlzLl9jbGlwYm9hcmROb2RlRGF0YS5ub2RlO2lmKHRoaXMuX2NsaXBib2FyZE5vZGVEYXRhLmlzQ3V0JiYobm9kZT09PXRhcmdldE5vZGV8fG5vZGUuaXNBbmNlc3Rvcih0YXJnZXROb2RlKSkpCnJldHVybiBmYWxzZTtpZih0YXJnZXROb2RlLmRvbU1vZGVsKCkhPT1ub2RlLmRvbU1vZGVsKCkpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9CnBhc3RlTm9kZSh0YXJnZXROb2RlKXtpZih0aGlzLmNhblBhc3RlKHRhcmdldE5vZGUpKQp0aGlzLl9wZXJmb3JtUGFzdGUodGFyZ2V0Tm9kZSk7fQpfb25QYXN0ZShldmVudCl7aWYoVUkuaXNFZGl0aW5nKCkpCnJldHVybjtjb25zdCB0YXJnZXROb2RlPXRoaXMuc2VsZWN0ZWRET01Ob2RlKCk7aWYoIXRhcmdldE5vZGV8fCF0aGlzLmNhblBhc3RlKHRhcmdldE5vZGUpKQpyZXR1cm47ZXZlbnQuaGFuZGxlZD10cnVlO3RoaXMuX3BlcmZvcm1QYXN0ZSh0YXJnZXROb2RlKTt9Cl9wZXJmb3JtUGFzdGUodGFyZ2V0Tm9kZSl7aWYodGhpcy5fY2xpcGJvYXJkTm9kZURhdGEuaXNDdXQpe3RoaXMuX2NsaXBib2FyZE5vZGVEYXRhLm5vZGUubW92ZVRvKHRhcmdldE5vZGUsbnVsbCxleHBhbmRDYWxsYmFjay5iaW5kKHRoaXMpKTt0aGlzLl9zZXRDbGlwYm9hcmREYXRhKG51bGwpO31lbHNle3RoaXMuX2NsaXBib2FyZE5vZGVEYXRhLm5vZGUuY29weVRvKHRhcmdldE5vZGUsbnVsbCxleHBhbmRDYWxsYmFjay5iaW5kKHRoaXMpKTt9CmZ1bmN0aW9uIGV4cGFuZENhbGxiYWNrKGVycm9yLG5vZGVJZCl7aWYoZXJyb3IpCnJldHVybjtjb25zdCBwYXN0ZWROb2RlPXRhcmdldE5vZGUuZG9tTW9kZWwoKS5ub2RlRm9ySWQobm9kZUlkKTtpZighcGFzdGVkTm9kZSkKcmV0dXJuO3RoaXMuc2VsZWN0RE9NTm9kZShwYXN0ZWROb2RlKTt9fQpzZXRWaXNpYmxlKHZpc2libGUpe3RoaXMuX3Zpc2libGU9dmlzaWJsZTtpZighdGhpcy5fdmlzaWJsZSl7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO2lmKHRoaXMuX211bHRpbGluZUVkaXRpbmcpCnRoaXMuX211bHRpbGluZUVkaXRpbmcuY2FuY2VsKCk7cmV0dXJuO30KdGhpcy5ydW5QZW5kaW5nVXBkYXRlcygpO2lmKHRoaXMuX3NlbGVjdGVkRE9NTm9kZSkKdGhpcy5fcmV2ZWFsQW5kU2VsZWN0Tm9kZSh0aGlzLl9zZWxlY3RlZERPTU5vZGUsZmFsc2UpO30KZ2V0IHJvb3RET01Ob2RlKCl7cmV0dXJuIHRoaXMuX3Jvb3RET01Ob2RlO30Kc2V0IHJvb3RET01Ob2RlKHgpe2lmKHRoaXMuX3Jvb3RET01Ob2RlPT09eCkKcmV0dXJuO3RoaXMuX3Jvb3RET01Ob2RlPXg7dGhpcy5faXNYTUxNaW1lVHlwZT14JiZ4LmlzWE1MTm9kZSgpO3RoaXMudXBkYXRlKCk7fQpnZXQgaXNYTUxNaW1lVHlwZSgpe3JldHVybiB0aGlzLl9pc1hNTE1pbWVUeXBlO30Kc2VsZWN0ZWRET01Ob2RlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkRE9NTm9kZTt9CnNlbGVjdERPTU5vZGUobm9kZSxmb2N1cyl7aWYodGhpcy5fc2VsZWN0ZWRET01Ob2RlPT09bm9kZSl7dGhpcy5fcmV2ZWFsQW5kU2VsZWN0Tm9kZShub2RlLCFmb2N1cyk7cmV0dXJuO30KdGhpcy5fc2VsZWN0ZWRET01Ob2RlPW5vZGU7dGhpcy5fcmV2ZWFsQW5kU2VsZWN0Tm9kZShub2RlLCFmb2N1cyk7aWYodGhpcy5fc2VsZWN0ZWRET01Ob2RlPT09bm9kZSkKdGhpcy5fc2VsZWN0ZWROb2RlQ2hhbmdlZCghIWZvY3VzKTt9CmVkaXRpbmcoKXtjb25zdCBub2RlPXRoaXMuc2VsZWN0ZWRET01Ob2RlKCk7aWYoIW5vZGUpCnJldHVybiBmYWxzZTtjb25zdCB0cmVlRWxlbWVudD10aGlzLmZpbmRUcmVlRWxlbWVudChub2RlKTtpZighdHJlZUVsZW1lbnQpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJlZUVsZW1lbnQuaXNFZGl0aW5nKCl8fGZhbHNlO30KdXBkYXRlKCl7Y29uc3Qgc2VsZWN0ZWROb2RlPXRoaXMuc2VsZWN0ZWRET01Ob2RlKCk7dGhpcy5yZW1vdmVDaGlsZHJlbigpO2lmKCF0aGlzLnJvb3RET01Ob2RlKQpyZXR1cm47aWYodGhpcy5faW5jbHVkZVJvb3RET01Ob2RlKXtjb25zdCB0cmVlRWxlbWVudD10aGlzLl9jcmVhdGVFbGVtZW50VHJlZUVsZW1lbnQodGhpcy5yb290RE9NTm9kZSk7dGhpcy5hcHBlbmRDaGlsZCh0cmVlRWxlbWVudCk7fWVsc2V7Y29uc3QgY2hpbGRyZW49dGhpcy5fdmlzaWJsZUNoaWxkcmVuKHRoaXMucm9vdERPTU5vZGUpO2Zvcihjb25zdCBjaGlsZCBvZiBjaGlsZHJlbil7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fY3JlYXRlRWxlbWVudFRyZWVFbGVtZW50KGNoaWxkKTt0aGlzLmFwcGVuZENoaWxkKHRyZWVFbGVtZW50KTt9fQppZihzZWxlY3RlZE5vZGUpCnRoaXMuX3JldmVhbEFuZFNlbGVjdE5vZGUoc2VsZWN0ZWROb2RlLHRydWUpO30KX3NlbGVjdGVkTm9kZUNoYW5nZWQoZm9jdXMpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuRXZlbnRzLlNlbGVjdGVkTm9kZUNoYW5nZWQse25vZGU6dGhpcy5fc2VsZWN0ZWRET01Ob2RlLGZvY3VzOmZvY3VzfSk7fQpfZmlyZUVsZW1lbnRzVHJlZVVwZGF0ZWQobm9kZXMpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKEVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRzVHJlZVVwZGF0ZWQsbm9kZXMpO30KZmluZFRyZWVFbGVtZW50KG5vZGUpe2xldCB0cmVlRWxlbWVudD10aGlzLl9sb29rVXBUcmVlRWxlbWVudChub2RlKTtpZighdHJlZUVsZW1lbnQmJm5vZGUubm9kZVR5cGUoKT09PU5vZGUuVEVYVF9OT0RFKXt0cmVlRWxlbWVudD10aGlzLl9sb29rVXBUcmVlRWxlbWVudChub2RlLnBhcmVudE5vZGUpO30KcmV0dXJuKHRyZWVFbGVtZW50KTt9Cl9sb29rVXBUcmVlRWxlbWVudChub2RlKXtpZighbm9kZSkKcmV0dXJuIG51bGw7Y29uc3QgY2FjaGVkRWxlbWVudD1ub2RlW3RoaXMuX3RyZWVFbGVtZW50U3ltYm9sXTtpZihjYWNoZWRFbGVtZW50KQpyZXR1cm4gY2FjaGVkRWxlbWVudDtjb25zdCBhbmNlc3RvcnM9W107bGV0IGN1cnJlbnROb2RlO2ZvcihjdXJyZW50Tm9kZT1ub2RlLnBhcmVudE5vZGU7Y3VycmVudE5vZGU7Y3VycmVudE5vZGU9Y3VycmVudE5vZGUucGFyZW50Tm9kZSl7YW5jZXN0b3JzLnB1c2goY3VycmVudE5vZGUpO2lmKGN1cnJlbnROb2RlW3RoaXMuX3RyZWVFbGVtZW50U3ltYm9sXSkKYnJlYWs7fQppZighY3VycmVudE5vZGUpCnJldHVybiBudWxsO2ZvcihsZXQgaT1hbmNlc3RvcnMubGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IHRyZWVFbGVtZW50PWFuY2VzdG9yc1tpXVt0aGlzLl90cmVlRWxlbWVudFN5bWJvbF07aWYodHJlZUVsZW1lbnQpCnRyZWVFbGVtZW50Lm9ucG9wdWxhdGUoKTt9CnJldHVybiBub2RlW3RoaXMuX3RyZWVFbGVtZW50U3ltYm9sXTt9CmNyZWF0ZVRyZWVFbGVtZW50Rm9yKG5vZGUpe2xldCB0cmVlRWxlbWVudD10aGlzLmZpbmRUcmVlRWxlbWVudChub2RlKTtpZih0cmVlRWxlbWVudCkKcmV0dXJuIHRyZWVFbGVtZW50O2lmKCFub2RlLnBhcmVudE5vZGUpCnJldHVybiBudWxsO3RyZWVFbGVtZW50PXRoaXMuY3JlYXRlVHJlZUVsZW1lbnRGb3Iobm9kZS5wYXJlbnROb2RlKTtyZXR1cm4gdHJlZUVsZW1lbnQ/dGhpcy5fc2hvd0NoaWxkKHRyZWVFbGVtZW50LG5vZGUpOm51bGw7fQpzZXQgc3VwcHJlc3NSZXZlYWxBbmRTZWxlY3QoeCl7aWYodGhpcy5fc3VwcHJlc3NSZXZlYWxBbmRTZWxlY3Q9PT14KQpyZXR1cm47dGhpcy5fc3VwcHJlc3NSZXZlYWxBbmRTZWxlY3Q9eDt9Cl9yZXZlYWxBbmRTZWxlY3ROb2RlKG5vZGUsb21pdEZvY3VzKXtpZih0aGlzLl9zdXBwcmVzc1JldmVhbEFuZFNlbGVjdCkKcmV0dXJuO2lmKCF0aGlzLl9pbmNsdWRlUm9vdERPTU5vZGUmJm5vZGU9PT10aGlzLnJvb3RET01Ob2RlJiZ0aGlzLnJvb3RET01Ob2RlKQpub2RlPXRoaXMucm9vdERPTU5vZGUuZmlyc3RDaGlsZDtpZighbm9kZSkKcmV0dXJuO2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuY3JlYXRlVHJlZUVsZW1lbnRGb3Iobm9kZSk7aWYoIXRyZWVFbGVtZW50KQpyZXR1cm47dHJlZUVsZW1lbnQucmV2ZWFsQW5kU2VsZWN0KG9taXRGb2N1cyk7fQpfdHJlZUVsZW1lbnRGcm9tRXZlbnQoZXZlbnQpe2NvbnN0IHNjcm9sbENvbnRhaW5lcj10aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudDtjb25zdCB4PXNjcm9sbENvbnRhaW5lci50b3RhbE9mZnNldExlZnQoKStzY3JvbGxDb250YWluZXIub2Zmc2V0V2lkdGgtMzY7Y29uc3QgeT1ldmVudC5wYWdlWTtjb25zdCBlbGVtZW50VW5kZXJNb3VzZT10aGlzLnRyZWVFbGVtZW50RnJvbVBvaW50KHgseSk7Y29uc3QgZWxlbWVudEFib3ZlTW91c2U9dGhpcy50cmVlRWxlbWVudEZyb21Qb2ludCh4LHktMik7bGV0IGVsZW1lbnQ7aWYoZWxlbWVudFVuZGVyTW91c2U9PT1lbGVtZW50QWJvdmVNb3VzZSkKZWxlbWVudD1lbGVtZW50VW5kZXJNb3VzZTtlbHNlCmVsZW1lbnQ9dGhpcy50cmVlRWxlbWVudEZyb21Qb2ludCh4LHkrMik7cmV0dXJuIGVsZW1lbnQ7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2xldCBsaW5rPWV2ZW50LnRhcmdldDt3aGlsZShsaW5rJiYhbGlua1tFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkhyZWZTeW1ib2xdKQpsaW5rPWxpbmsucGFyZW50RWxlbWVudE9yU2hhZG93SG9zdCgpO2lmKCFsaW5rKQpyZXR1cm4gbnVsbDtyZXR1cm57Ym94OmxpbmsuYm94SW5XaW5kb3coKSxzaG93OmFzeW5jIHBvcG92ZXI9Pntjb25zdCBsaXN0SXRlbT1saW5rLmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWUoJ2xpJyk7Y29uc3Qgbm9kZT0obGlzdEl0ZW0udHJlZUVsZW1lbnQpLm5vZGUoKTtjb25zdCBwcmVjb21wdXRlZEZlYXR1cmVzPWF3YWl0IHRoaXMuX2xvYWREaW1lbnNpb25zRm9yTm9kZShub2RlKTtjb25zdCBwcmV2aWV3PWF3YWl0IEJyb3dzZXJDb21wb25lbnRzLkltYWdlUHJldmlldy5idWlsZChub2RlLmRvbU1vZGVsKCkudGFyZ2V0KCksbGlua1tFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkhyZWZTeW1ib2xdLHRydWUscHJlY29tcHV0ZWRGZWF0dXJlcyk7aWYocHJldmlldykKcG9wb3Zlci5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChwcmV2aWV3KTtyZXR1cm4hIXByZXZpZXc7fX07fQphc3luYyBfbG9hZERpbWVuc2lvbnNGb3JOb2RlKG5vZGUpe2lmKCFub2RlLm5vZGVOYW1lKCl8fG5vZGUubm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpIT09J2ltZycpCnJldHVybjtjb25zdCBvYmplY3Q9YXdhaXQgbm9kZS5yZXNvbHZlVG9PYmplY3QoJycpO2lmKCFvYmplY3QpCnJldHVybjtjb25zdCBwcm9taXNlPW9iamVjdC5jYWxsRnVuY3Rpb25KU09OUHJvbWlzZShmZWF0dXJlcyx1bmRlZmluZWQpO29iamVjdC5yZWxlYXNlKCk7cmV0dXJuIHByb21pc2U7ZnVuY3Rpb24gZmVhdHVyZXMoKXtyZXR1cm57b2Zmc2V0V2lkdGg6dGhpcy5vZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQ6dGhpcy5vZmZzZXRIZWlnaHQsbmF0dXJhbFdpZHRoOnRoaXMubmF0dXJhbFdpZHRoLG5hdHVyYWxIZWlnaHQ6dGhpcy5uYXR1cmFsSGVpZ2h0LGN1cnJlbnRTcmM6dGhpcy5jdXJyZW50U3JjfTt9fQpfb25tb3VzZWRvd24oZXZlbnQpe2NvbnN0IGVsZW1lbnQ9dGhpcy5fdHJlZUVsZW1lbnRGcm9tRXZlbnQoZXZlbnQpO2lmKCFlbGVtZW50fHxlbGVtZW50LmlzRXZlbnRXaXRoaW5EaXNjbG9zdXJlVHJpYW5nbGUoZXZlbnQpKQpyZXR1cm47ZWxlbWVudC5zZWxlY3QoKTt9CnNldEhvdmVyRWZmZWN0KHRyZWVFbGVtZW50KXtpZih0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50PT09dHJlZUVsZW1lbnQpCnJldHVybjtpZih0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50KXt0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50LmhvdmVyZWQ9ZmFsc2U7ZGVsZXRlIHRoaXMuX3ByZXZpb3VzSG92ZXJlZEVsZW1lbnQ7fQppZih0cmVlRWxlbWVudCl7dHJlZUVsZW1lbnQuaG92ZXJlZD10cnVlO3RoaXMuX3ByZXZpb3VzSG92ZXJlZEVsZW1lbnQ9dHJlZUVsZW1lbnQ7fX0KX29ubW91c2Vtb3ZlKGV2ZW50KXtjb25zdCBlbGVtZW50PXRoaXMuX3RyZWVFbGVtZW50RnJvbUV2ZW50KGV2ZW50KTtpZihlbGVtZW50JiZ0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50PT09ZWxlbWVudCkKcmV0dXJuO3RoaXMuc2V0SG92ZXJFZmZlY3QoZWxlbWVudCk7aWYoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQpe2VsZW1lbnQubm9kZSgpLmRvbU1vZGVsKCkub3ZlcmxheU1vZGVsKCkuaGlnaGxpZ2h0RE9NTm9kZVdpdGhDb25maWcoZWxlbWVudC5ub2RlKCkuaWQse21vZGU6J2FsbCcsc2hvd0luZm86IVVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKGV2ZW50KX0pO3JldHVybjt9CmlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlNob3J0Y3V0VHJlZUVsZW1lbnQpe2VsZW1lbnQuZG9tTW9kZWwoKS5vdmVybGF5TW9kZWwoKS5oaWdobGlnaHRET01Ob2RlV2l0aENvbmZpZyh1bmRlZmluZWQse21vZGU6J2FsbCcsc2hvd0luZm86IVVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKGV2ZW50KX0sZWxlbWVudC5iYWNrZW5kTm9kZUlkKCkpO319Cl9vbm1vdXNlbGVhdmUoZXZlbnQpe3RoaXMuc2V0SG92ZXJFZmZlY3QobnVsbCk7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO30KX29uZHJhZ3N0YXJ0KGV2ZW50KXtpZihldmVudC50YXJnZXQuaGFzU2VsZWN0aW9uKCkpCnJldHVybiBmYWxzZTtpZihldmVudC50YXJnZXQubm9kZU5hbWU9PT0nQScpCnJldHVybiBmYWxzZTtjb25zdCB0cmVlRWxlbWVudD10aGlzLl92YWxpZERyYWdTb3VyY2VPclRhcmdldCh0aGlzLl90cmVlRWxlbWVudEZyb21FdmVudChldmVudCkpO2lmKCF0cmVlRWxlbWVudCkKcmV0dXJuIGZhbHNlO2lmKHRyZWVFbGVtZW50Lm5vZGUoKS5ub2RlTmFtZSgpPT09J0JPRFknfHx0cmVlRWxlbWVudC5ub2RlKCkubm9kZU5hbWUoKT09PSdIRUFEJykKcmV0dXJuIGZhbHNlO2V2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJyx0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQudGV4dENvbnRlbnQucmVwbGFjZSgvXHUyMDBiL2csJycpKTtldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0nY29weU1vdmUnO3RoaXMuX3RyZWVFbGVtZW50QmVpbmdEcmFnZ2VkPXRyZWVFbGVtZW50O1NESy5PdmVybGF5TW9kZWwuaGlkZURPTU5vZGVIaWdobGlnaHQoKTtyZXR1cm4gdHJ1ZTt9Cl9vbmRyYWdvdmVyKGV2ZW50KXtpZighdGhpcy5fdHJlZUVsZW1lbnRCZWluZ0RyYWdnZWQpCnJldHVybiBmYWxzZTtjb25zdCB0cmVlRWxlbWVudD10aGlzLl92YWxpZERyYWdTb3VyY2VPclRhcmdldCh0aGlzLl90cmVlRWxlbWVudEZyb21FdmVudChldmVudCkpO2lmKCF0cmVlRWxlbWVudCkKcmV0dXJuIGZhbHNlO2xldCBub2RlPXRyZWVFbGVtZW50Lm5vZGUoKTt3aGlsZShub2RlKXtpZihub2RlPT09dGhpcy5fdHJlZUVsZW1lbnRCZWluZ0RyYWdnZWQuX25vZGUpCnJldHVybiBmYWxzZTtub2RlPW5vZGUucGFyZW50Tm9kZTt9CnRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlbGVtZW50cy1kcmFnLW92ZXInKTt0aGlzLl9kcmFnT3ZlclRyZWVFbGVtZW50PXRyZWVFbGVtZW50O2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9J21vdmUnO3JldHVybiBmYWxzZTt9Cl9vbmRyYWdsZWF2ZShldmVudCl7dGhpcy5fY2xlYXJEcmFnT3ZlclRyZWVFbGVtZW50TWFya2VyKCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fQpfdmFsaWREcmFnU291cmNlT3JUYXJnZXQodHJlZUVsZW1lbnQpe2lmKCF0cmVlRWxlbWVudCkKcmV0dXJuIG51bGw7aWYoISh0cmVlRWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQpKQpyZXR1cm4gbnVsbDtjb25zdCBlbGVtZW50c1RyZWVFbGVtZW50PSh0cmVlRWxlbWVudCk7Y29uc3Qgbm9kZT1lbGVtZW50c1RyZWVFbGVtZW50Lm5vZGUoKTtpZighbm9kZS5wYXJlbnROb2RlfHxub2RlLnBhcmVudE5vZGUubm9kZVR5cGUoKSE9PU5vZGUuRUxFTUVOVF9OT0RFKQpyZXR1cm4gbnVsbDtyZXR1cm4gZWxlbWVudHNUcmVlRWxlbWVudDt9Cl9vbmRyb3AoZXZlbnQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fdHJlZUVsZW1lbnRGcm9tRXZlbnQoZXZlbnQpO2lmKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudCkKdGhpcy5fZG9Nb3ZlKHRyZWVFbGVtZW50KTt9Cl9kb01vdmUodHJlZUVsZW1lbnQpe2lmKCF0aGlzLl90cmVlRWxlbWVudEJlaW5nRHJhZ2dlZCkKcmV0dXJuO2xldCBwYXJlbnROb2RlO2xldCBhbmNob3JOb2RlO2lmKHRyZWVFbGVtZW50LmlzQ2xvc2luZ1RhZygpKXtwYXJlbnROb2RlPXRyZWVFbGVtZW50Lm5vZGUoKTt9ZWxzZXtjb25zdCBkcmFnVGFyZ2V0Tm9kZT10cmVlRWxlbWVudC5ub2RlKCk7cGFyZW50Tm9kZT1kcmFnVGFyZ2V0Tm9kZS5wYXJlbnROb2RlO2FuY2hvck5vZGU9ZHJhZ1RhcmdldE5vZGU7fQpjb25zdCB3YXNFeHBhbmRlZD10aGlzLl90cmVlRWxlbWVudEJlaW5nRHJhZ2dlZC5leHBhbmRlZDt0aGlzLl90cmVlRWxlbWVudEJlaW5nRHJhZ2dlZC5fbm9kZS5tb3ZlVG8ocGFyZW50Tm9kZSxhbmNob3JOb2RlLHRoaXMuc2VsZWN0Tm9kZUFmdGVyRWRpdC5iaW5kKHRoaXMsd2FzRXhwYW5kZWQpKTtkZWxldGUgdGhpcy5fdHJlZUVsZW1lbnRCZWluZ0RyYWdnZWQ7fQpfb25kcmFnZW5kKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2NsZWFyRHJhZ092ZXJUcmVlRWxlbWVudE1hcmtlcigpO2RlbGV0ZSB0aGlzLl90cmVlRWxlbWVudEJlaW5nRHJhZ2dlZDt9Cl9jbGVhckRyYWdPdmVyVHJlZUVsZW1lbnRNYXJrZXIoKXtpZih0aGlzLl9kcmFnT3ZlclRyZWVFbGVtZW50KXt0aGlzLl9kcmFnT3ZlclRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdlbGVtZW50cy1kcmFnLW92ZXInKTtkZWxldGUgdGhpcy5fZHJhZ092ZXJUcmVlRWxlbWVudDt9fQpfY29udGV4dE1lbnVFdmVudEZpcmVkKGV2ZW50KXtjb25zdCB0cmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudEZyb21FdmVudChldmVudCk7aWYodHJlZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50KQp0aGlzLnNob3dDb250ZXh0TWVudSh0cmVlRWxlbWVudCxldmVudCk7fQpzaG93Q29udGV4dE1lbnUodHJlZUVsZW1lbnQsZXZlbnQpe2lmKFVJLmlzRWRpdGluZygpKQpyZXR1cm47Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb25zdCBpc1BzZXVkb0VsZW1lbnQ9ISF0cmVlRWxlbWVudC5ub2RlKCkucHNldWRvVHlwZSgpO2NvbnN0IGlzVGFnPXRyZWVFbGVtZW50Lm5vZGUoKS5ub2RlVHlwZSgpPT09Tm9kZS5FTEVNRU5UX05PREUmJiFpc1BzZXVkb0VsZW1lbnQ7bGV0IHRleHROb2RlPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCd3ZWJraXQtaHRtbC10ZXh0LW5vZGUnKTtpZih0ZXh0Tm9kZSYmdGV4dE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdib2d1cycpKQp0ZXh0Tm9kZT1udWxsO2NvbnN0IGNvbW1lbnROb2RlPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCd3ZWJraXQtaHRtbC1jb21tZW50Jyk7aWYodGV4dE5vZGUpCnRyZWVFbGVtZW50LnBvcHVsYXRlVGV4dENvbnRleHRNZW51KGNvbnRleHRNZW51LHRleHROb2RlKTtlbHNlIGlmKGlzVGFnKQp0cmVlRWxlbWVudC5wb3B1bGF0ZVRhZ0NvbnRleHRNZW51KGNvbnRleHRNZW51LGV2ZW50KTtlbHNlIGlmKGNvbW1lbnROb2RlKQp0cmVlRWxlbWVudC5wb3B1bGF0ZU5vZGVDb250ZXh0TWVudShjb250ZXh0TWVudSk7ZWxzZSBpZihpc1BzZXVkb0VsZW1lbnQpCnRyZWVFbGVtZW50LnBvcHVsYXRlU2Nyb2xsSW50b1ZpZXcoY29udGV4dE1lbnUpO2NvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyh0cmVlRWxlbWVudC5ub2RlKCkpO2NvbnRleHRNZW51LnNob3coKTt9CnJ1blBlbmRpbmdVcGRhdGVzKCl7dGhpcy5fdXBkYXRlTW9kaWZpZWROb2RlcygpO30KX29uS2V5RG93bihldmVudCl7Y29uc3Qga2V5Ym9hcmRFdmVudD0oZXZlbnQpO2lmKFVJLmlzRWRpdGluZygpKQpyZXR1cm47Y29uc3Qgbm9kZT10aGlzLnNlbGVjdGVkRE9NTm9kZSgpO2lmKCFub2RlKQpyZXR1cm47Y29uc3QgdHJlZUVsZW1lbnQ9bm9kZVt0aGlzLl90cmVlRWxlbWVudFN5bWJvbF07aWYoIXRyZWVFbGVtZW50KQpyZXR1cm47aWYoVUkuS2V5Ym9hcmRTaG9ydGN1dC5ldmVudEhhc0N0cmxPck1ldGEoa2V5Ym9hcmRFdmVudCkmJm5vZGUucGFyZW50Tm9kZSl7aWYoa2V5Ym9hcmRFdmVudC5rZXk9PT0nQXJyb3dVcCcmJm5vZGUucHJldmlvdXNTaWJsaW5nKXtub2RlLm1vdmVUbyhub2RlLnBhcmVudE5vZGUsbm9kZS5wcmV2aW91c1NpYmxpbmcsdGhpcy5zZWxlY3ROb2RlQWZ0ZXJFZGl0LmJpbmQodGhpcyx0cmVlRWxlbWVudC5leHBhbmRlZCkpO2tleWJvYXJkRXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQppZihrZXlib2FyZEV2ZW50LmtleT09PSdBcnJvd0Rvd24nJiZub2RlLm5leHRTaWJsaW5nKXtub2RlLm1vdmVUbyhub2RlLnBhcmVudE5vZGUsbm9kZS5uZXh0U2libGluZy5uZXh0U2libGluZyx0aGlzLnNlbGVjdE5vZGVBZnRlckVkaXQuYmluZCh0aGlzLHRyZWVFbGVtZW50LmV4cGFuZGVkKSk7a2V5Ym9hcmRFdmVudC5jb25zdW1lKHRydWUpO3JldHVybjt9fX0KdG9nZ2xlRWRpdEFzSFRNTChub2RlLHN0YXJ0RWRpdGluZyxjYWxsYmFjayl7Y29uc3QgdHJlZUVsZW1lbnQ9bm9kZVt0aGlzLl90cmVlRWxlbWVudFN5bWJvbF07aWYoIXRyZWVFbGVtZW50fHwhdHJlZUVsZW1lbnQuaGFzRWRpdGFibGVOb2RlKCkpCnJldHVybjtpZihub2RlLnBzZXVkb1R5cGUoKSkKcmV0dXJuO2NvbnN0IHBhcmVudE5vZGU9bm9kZS5wYXJlbnROb2RlO2NvbnN0IGluZGV4PW5vZGUuaW5kZXg7Y29uc3Qgd2FzRXhwYW5kZWQ9dHJlZUVsZW1lbnQuZXhwYW5kZWQ7dHJlZUVsZW1lbnQudG9nZ2xlRWRpdEFzSFRNTChlZGl0aW5nRmluaXNoZWQuYmluZCh0aGlzKSxzdGFydEVkaXRpbmcpO2Z1bmN0aW9uIGVkaXRpbmdGaW5pc2hlZChzdWNjZXNzKXtpZihjYWxsYmFjaykKY2FsbGJhY2soKTtpZighc3VjY2VzcykKcmV0dXJuO3RoaXMucnVuUGVuZGluZ1VwZGF0ZXMoKTtjb25zdCBuZXdOb2RlPXBhcmVudE5vZGU/cGFyZW50Tm9kZS5jaGlsZHJlbigpW2luZGV4XXx8cGFyZW50Tm9kZTpudWxsO2lmKCFuZXdOb2RlKQpyZXR1cm47dGhpcy5zZWxlY3RET01Ob2RlKG5ld05vZGUsdHJ1ZSk7aWYod2FzRXhwYW5kZWQpe2NvbnN0IG5ld1RyZWVJdGVtPXRoaXMuZmluZFRyZWVFbGVtZW50KG5ld05vZGUpO2lmKG5ld1RyZWVJdGVtKQpuZXdUcmVlSXRlbS5leHBhbmQoKTt9fX0Kc2VsZWN0Tm9kZUFmdGVyRWRpdCh3YXNFeHBhbmRlZCxlcnJvcixuZXdOb2RlKXtpZihlcnJvcikKcmV0dXJuIG51bGw7dGhpcy5ydW5QZW5kaW5nVXBkYXRlcygpO2lmKCFuZXdOb2RlKQpyZXR1cm4gbnVsbDt0aGlzLnNlbGVjdERPTU5vZGUobmV3Tm9kZSx0cnVlKTtjb25zdCBuZXdUcmVlSXRlbT10aGlzLmZpbmRUcmVlRWxlbWVudChuZXdOb2RlKTtpZih3YXNFeHBhbmRlZCl7aWYobmV3VHJlZUl0ZW0pCm5ld1RyZWVJdGVtLmV4cGFuZCgpO30KcmV0dXJuIG5ld1RyZWVJdGVtO30KYXN5bmMgdG9nZ2xlSGlkZUVsZW1lbnQobm9kZSl7Y29uc3QgcHNldWRvVHlwZT1ub2RlLnBzZXVkb1R5cGUoKTtjb25zdCBlZmZlY3RpdmVOb2RlPXBzZXVkb1R5cGU/bm9kZS5wYXJlbnROb2RlOm5vZGU7aWYoIWVmZmVjdGl2ZU5vZGUpCnJldHVybjtjb25zdCBoaWRkZW49bm9kZS5tYXJrZXIoJ2hpZGRlbi1tYXJrZXInKTtjb25zdCBvYmplY3Q9YXdhaXQgZWZmZWN0aXZlTm9kZS5yZXNvbHZlVG9PYmplY3QoJycpO2lmKCFvYmplY3QpCnJldHVybjtjb25zdCByZXN1bHQ9b2JqZWN0LmNhbGxGdW5jdGlvbih0b2dnbGVDbGFzc0FuZEluamVjdFN0eWxlUnVsZSxbe3ZhbHVlOnBzZXVkb1R5cGV9LHt2YWx1ZTohaGlkZGVufV0pO29iamVjdC5yZWxlYXNlKCk7bm9kZS5zZXRNYXJrZXIoJ2hpZGRlbi1tYXJrZXInLGhpZGRlbj9udWxsOnRydWUpO3JldHVybiByZXN1bHQ7ZnVuY3Rpb24gdG9nZ2xlQ2xhc3NBbmRJbmplY3RTdHlsZVJ1bGUocHNldWRvVHlwZSxoaWRkZW4pe2NvbnN0IGNsYXNzTmFtZVByZWZpeD0nX193ZWItaW5zcGVjdG9yLWhpZGUnO2NvbnN0IGNsYXNzTmFtZVN1ZmZpeD0nLXNob3J0Y3V0X18nO2NvbnN0IHN0eWxlVGFnSWQ9J19fd2ViLWluc3BlY3Rvci1oaWRlLXNob3J0Y3V0LXN0eWxlX18nO2NvbnN0IHNlbGVjdG9ycz1bXTtzZWxlY3RvcnMucHVzaCgnLl9fd2ViLWluc3BlY3Rvci1oaWRlLXNob3J0Y3V0X18nKTtzZWxlY3RvcnMucHVzaCgnLl9fd2ViLWluc3BlY3Rvci1oaWRlLXNob3J0Y3V0X18gKicpO3NlbGVjdG9ycy5wdXNoKCcuX193ZWItaW5zcGVjdG9yLWhpZGViZWZvcmUtc2hvcnRjdXRfXzo6YmVmb3JlJyk7c2VsZWN0b3JzLnB1c2goJy5fX3dlYi1pbnNwZWN0b3ItaGlkZWFmdGVyLXNob3J0Y3V0X186OmFmdGVyJyk7Y29uc3Qgc2VsZWN0b3I9c2VsZWN0b3JzLmpvaW4oJywgJyk7Y29uc3QgcnVsZUJvZHk9JyAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsnO2NvbnN0IHJ1bGU9J1xuJytzZWxlY3RvcisnXG57XG4nK3J1bGVCb2R5Kydcbn1cbic7Y29uc3QgY2xhc3NOYW1lPWNsYXNzTmFtZVByZWZpeCsocHNldWRvVHlwZXx8JycpK2NsYXNzTmFtZVN1ZmZpeDt0aGlzLmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLGhpZGRlbik7bGV0IGxvY2FsUm9vdD10aGlzO3doaWxlKGxvY2FsUm9vdC5wYXJlbnROb2RlKQpsb2NhbFJvb3Q9bG9jYWxSb290LnBhcmVudE5vZGU7aWYobG9jYWxSb290Lm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKQpsb2NhbFJvb3Q9ZG9jdW1lbnQuaGVhZDtsZXQgc3R5bGU9bG9jYWxSb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlIycrc3R5bGVUYWdJZCk7aWYoc3R5bGUpCnJldHVybjtzdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlLmlkPXN0eWxlVGFnSWQ7c3R5bGUudHlwZT0ndGV4dC9jc3MnO3N0eWxlLnRleHRDb250ZW50PXJ1bGU7bG9jYWxSb290LmFwcGVuZENoaWxkKHN0eWxlKTt9fQppc1RvZ2dsZWRUb0hpZGRlbihub2RlKXtyZXR1cm4hIW5vZGUubWFya2VyKCdoaWRkZW4tbWFya2VyJyk7fQpfcmVzZXQoKXt0aGlzLnJvb3RET01Ob2RlPW51bGw7dGhpcy5zZWxlY3RET01Ob2RlKG51bGwsZmFsc2UpO3RoaXMuX3BvcG92ZXJIZWxwZXIuaGlkZVBvcG92ZXIoKTtkZWxldGUgdGhpcy5fY2xpcGJvYXJkTm9kZURhdGE7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO3RoaXMuX3VwZGF0ZVJlY29yZHMuY2xlYXIoKTt9CndpcmVUb0RPTU1vZGVsKGRvbU1vZGVsKXtkb21Nb2RlbFtFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLl90cmVlT3V0bGluZVN5bWJvbF09dGhpcztkb21Nb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5ET01Nb2RlbC5FdmVudHMuTWFya2Vyc0NoYW5nZWQsdGhpcy5fbWFya2Vyc0NoYW5nZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVJbnNlcnRlZCx0aGlzLl9ub2RlSW5zZXJ0ZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVSZW1vdmVkLHRoaXMuX25vZGVSZW1vdmVkLHRoaXMpO2RvbU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkRPTU1vZGVsLkV2ZW50cy5BdHRyTW9kaWZpZWQsdGhpcy5fYXR0cmlidXRlTW9kaWZpZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJSZW1vdmVkLHRoaXMuX2F0dHJpYnV0ZVJlbW92ZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkNoYXJhY3RlckRhdGFNb2RpZmllZCx0aGlzLl9jaGFyYWN0ZXJEYXRhTW9kaWZpZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkRvY3VtZW50VXBkYXRlZCx0aGlzLl9kb2N1bWVudFVwZGF0ZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkNoaWxkTm9kZUNvdW50VXBkYXRlZCx0aGlzLl9jaGlsZE5vZGVDb3VudFVwZGF0ZWQsdGhpcyk7ZG9tTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkRpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkLHRoaXMuX2Rpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkLHRoaXMpO30KdW53aXJlRnJvbURPTU1vZGVsKGRvbU1vZGVsKXtkb21Nb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5ET01Nb2RlbC5FdmVudHMuTWFya2Vyc0NoYW5nZWQsdGhpcy5fbWFya2Vyc0NoYW5nZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVJbnNlcnRlZCx0aGlzLl9ub2RlSW5zZXJ0ZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLk5vZGVSZW1vdmVkLHRoaXMuX25vZGVSZW1vdmVkLHRoaXMpO2RvbU1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkRPTU1vZGVsLkV2ZW50cy5BdHRyTW9kaWZpZWQsdGhpcy5fYXR0cmlidXRlTW9kaWZpZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJSZW1vdmVkLHRoaXMuX2F0dHJpYnV0ZVJlbW92ZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkNoYXJhY3RlckRhdGFNb2RpZmllZCx0aGlzLl9jaGFyYWN0ZXJEYXRhTW9kaWZpZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkRvY3VtZW50VXBkYXRlZCx0aGlzLl9kb2N1bWVudFVwZGF0ZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkNoaWxkTm9kZUNvdW50VXBkYXRlZCx0aGlzLl9jaGlsZE5vZGVDb3VudFVwZGF0ZWQsdGhpcyk7ZG9tTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRE9NTW9kZWwuRXZlbnRzLkRpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkLHRoaXMuX2Rpc3RyaWJ1dGVkTm9kZXNDaGFuZ2VkLHRoaXMpO2RlbGV0ZSBkb21Nb2RlbFtFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLl90cmVlT3V0bGluZVN5bWJvbF07fQpfYWRkVXBkYXRlUmVjb3JkKG5vZGUpe2xldCByZWNvcmQ9dGhpcy5fdXBkYXRlUmVjb3Jkcy5nZXQobm9kZSk7aWYoIXJlY29yZCl7cmVjb3JkPW5ldyBFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlVwZGF0ZVJlY29yZCgpO3RoaXMuX3VwZGF0ZVJlY29yZHMuc2V0KG5vZGUscmVjb3JkKTt9CnJldHVybiByZWNvcmQ7fQpfdXBkYXRlUmVjb3JkRm9ySGlnaGxpZ2h0KG5vZGUpe2lmKCF0aGlzLl92aXNpYmxlKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fdXBkYXRlUmVjb3Jkcy5nZXQobm9kZSl8fG51bGw7fQpfZG9jdW1lbnRVcGRhdGVkKGV2ZW50KXtjb25zdCBkb21Nb2RlbD0oZXZlbnQuZGF0YSk7dGhpcy5fcmVzZXQoKTtpZihkb21Nb2RlbC5leGlzdGluZ0RvY3VtZW50KCkpCnRoaXMucm9vdERPTU5vZGU9ZG9tTW9kZWwuZXhpc3RpbmdEb2N1bWVudCgpO30KX2F0dHJpYnV0ZU1vZGlmaWVkKGV2ZW50KXtjb25zdCBub2RlPShldmVudC5kYXRhLm5vZGUpO3RoaXMuX2FkZFVwZGF0ZVJlY29yZChub2RlKS5hdHRyaWJ1dGVNb2RpZmllZChldmVudC5kYXRhLm5hbWUpO3RoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZXNTb29uKCk7fQpfYXR0cmlidXRlUmVtb3ZlZChldmVudCl7Y29uc3Qgbm9kZT0oZXZlbnQuZGF0YS5ub2RlKTt0aGlzLl9hZGRVcGRhdGVSZWNvcmQobm9kZSkuYXR0cmlidXRlUmVtb3ZlZChldmVudC5kYXRhLm5hbWUpO3RoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZXNTb29uKCk7fQpfY2hhcmFjdGVyRGF0YU1vZGlmaWVkKGV2ZW50KXtjb25zdCBub2RlPShldmVudC5kYXRhKTt0aGlzLl9hZGRVcGRhdGVSZWNvcmQobm9kZSkuY2hhckRhdGFNb2RpZmllZCgpO2lmKG5vZGUucGFyZW50Tm9kZSYmbm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQ9PT1ub2RlLnBhcmVudE5vZGUubGFzdENoaWxkKQp0aGlzLl9hZGRVcGRhdGVSZWNvcmQobm9kZS5wYXJlbnROb2RlKS5jaGlsZHJlbk1vZGlmaWVkKCk7dGhpcy5fdXBkYXRlTW9kaWZpZWROb2Rlc1Nvb24oKTt9Cl9ub2RlSW5zZXJ0ZWQoZXZlbnQpe2NvbnN0IG5vZGU9KGV2ZW50LmRhdGEpO3RoaXMuX2FkZFVwZGF0ZVJlY29yZCgobm9kZS5wYXJlbnROb2RlKSkubm9kZUluc2VydGVkKG5vZGUpO3RoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZXNTb29uKCk7fQpfbm9kZVJlbW92ZWQoZXZlbnQpe2NvbnN0IG5vZGU9KGV2ZW50LmRhdGEubm9kZSk7Y29uc3QgcGFyZW50Tm9kZT0oZXZlbnQuZGF0YS5wYXJlbnQpO3RoaXMucmVzZXRDbGlwYm9hcmRJZk5lZWRlZChub2RlKTt0aGlzLl9hZGRVcGRhdGVSZWNvcmQocGFyZW50Tm9kZSkubm9kZVJlbW92ZWQobm9kZSk7dGhpcy5fdXBkYXRlTW9kaWZpZWROb2Rlc1Nvb24oKTt9Cl9jaGlsZE5vZGVDb3VudFVwZGF0ZWQoZXZlbnQpe2NvbnN0IG5vZGU9KGV2ZW50LmRhdGEpO3RoaXMuX2FkZFVwZGF0ZVJlY29yZChub2RlKS5jaGlsZHJlbk1vZGlmaWVkKCk7dGhpcy5fdXBkYXRlTW9kaWZpZWROb2Rlc1Nvb24oKTt9Cl9kaXN0cmlidXRlZE5vZGVzQ2hhbmdlZChldmVudCl7Y29uc3Qgbm9kZT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkVXBkYXRlUmVjb3JkKG5vZGUpLmNoaWxkcmVuTW9kaWZpZWQoKTt0aGlzLl91cGRhdGVNb2RpZmllZE5vZGVzU29vbigpO30KX3VwZGF0ZU1vZGlmaWVkTm9kZXNTb29uKCl7aWYoIXRoaXMuX3VwZGF0ZVJlY29yZHMuc2l6ZSkKcmV0dXJuO2lmKHRoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZXNUaW1lb3V0KQpyZXR1cm47dGhpcy5fdXBkYXRlTW9kaWZpZWROb2Rlc1RpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl91cGRhdGVNb2RpZmllZE5vZGVzLmJpbmQodGhpcyksNTApO30KX3VwZGF0ZU1vZGlmaWVkTm9kZXMoKXtpZih0aGlzLl91cGRhdGVNb2RpZmllZE5vZGVzVGltZW91dCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZXNUaW1lb3V0KTtkZWxldGUgdGhpcy5fdXBkYXRlTW9kaWZpZWROb2Rlc1RpbWVvdXQ7fQpjb25zdCB1cGRhdGVkTm9kZXM9dGhpcy5fdXBkYXRlUmVjb3Jkcy5rZXlzQXJyYXkoKTtjb25zdCBoaWRlUGFuZWxXaGlsZVVwZGF0aW5nPXVwZGF0ZWROb2Rlcy5sZW5ndGg+MTA7bGV0IHRyZWVPdXRsaW5lQ29udGFpbmVyRWxlbWVudDtsZXQgb3JpZ2luYWxTY3JvbGxUb3A7aWYoaGlkZVBhbmVsV2hpbGVVcGRhdGluZyl7dHJlZU91dGxpbmVDb250YWluZXJFbGVtZW50PXRoaXMuZWxlbWVudC5wYXJlbnROb2RlO29yaWdpbmFsU2Nyb2xsVG9wPXRyZWVPdXRsaW5lQ29udGFpbmVyRWxlbWVudD90cmVlT3V0bGluZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wOjA7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt9CmlmKHRoaXMuX3Jvb3RET01Ob2RlJiZ0aGlzLl91cGRhdGVSZWNvcmRzLmdldCh0aGlzLl9yb290RE9NTm9kZSkmJnRoaXMuX3VwZGF0ZVJlY29yZHMuZ2V0KHRoaXMuX3Jvb3RET01Ob2RlKS5oYXNDaGFuZ2VkQ2hpbGRyZW4oKSl7dGhpcy51cGRhdGUoKTt9ZWxzZXtmb3IoY29uc3Qgbm9kZSBvZiB0aGlzLl91cGRhdGVSZWNvcmRzLmtleXMoKSl7aWYodGhpcy5fdXBkYXRlUmVjb3Jkcy5nZXQobm9kZSkuaGFzQ2hhbmdlZENoaWxkcmVuKCkpCnRoaXMuX3VwZGF0ZU1vZGlmaWVkUGFyZW50Tm9kZShub2RlKTtlbHNlCnRoaXMuX3VwZGF0ZU1vZGlmaWVkTm9kZShub2RlKTt9fQppZihoaWRlUGFuZWxXaGlsZVVwZGF0aW5nKXt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2lmKG9yaWdpbmFsU2Nyb2xsVG9wKQp0cmVlT3V0bGluZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wPW9yaWdpbmFsU2Nyb2xsVG9wO30KdGhpcy5fdXBkYXRlUmVjb3Jkcy5jbGVhcigpO3RoaXMuX2ZpcmVFbGVtZW50c1RyZWVVcGRhdGVkKHVwZGF0ZWROb2Rlcyk7fQpfdXBkYXRlTW9kaWZpZWROb2RlKG5vZGUpe2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuZmluZFRyZWVFbGVtZW50KG5vZGUpO2lmKHRyZWVFbGVtZW50KQp0cmVlRWxlbWVudC51cGRhdGVUaXRsZSh0aGlzLl91cGRhdGVSZWNvcmRGb3JIaWdobGlnaHQobm9kZSkpO30KX3VwZGF0ZU1vZGlmaWVkUGFyZW50Tm9kZShub2RlKXtjb25zdCBwYXJlbnRUcmVlRWxlbWVudD10aGlzLmZpbmRUcmVlRWxlbWVudChub2RlKTtpZihwYXJlbnRUcmVlRWxlbWVudCl7cGFyZW50VHJlZUVsZW1lbnQuc2V0RXhwYW5kYWJsZSh0aGlzLl9oYXNWaXNpYmxlQ2hpbGRyZW4obm9kZSkpO3BhcmVudFRyZWVFbGVtZW50LnVwZGF0ZVRpdGxlKHRoaXMuX3VwZGF0ZVJlY29yZEZvckhpZ2hsaWdodChub2RlKSk7aWYocGFyZW50VHJlZUVsZW1lbnQucG9wdWxhdGVkKQp0aGlzLl91cGRhdGVDaGlsZHJlbihwYXJlbnRUcmVlRWxlbWVudCk7fX0KcG9wdWxhdGVUcmVlRWxlbWVudCh0cmVlRWxlbWVudCl7aWYodHJlZUVsZW1lbnQuY2hpbGRDb3VudCgpfHwhdHJlZUVsZW1lbnQuaXNFeHBhbmRhYmxlKCkpCnJldHVybjt0cmVlRWxlbWVudC5ub2RlKCkuZ2V0Q2hpbGROb2RlcygoKT0+e3RyZWVFbGVtZW50LnBvcHVsYXRlZD10cnVlO3RoaXMuX3VwZGF0ZU1vZGlmaWVkUGFyZW50Tm9kZSh0cmVlRWxlbWVudC5ub2RlKCkpO30pO30KX2NyZWF0ZUVsZW1lbnRUcmVlRWxlbWVudChub2RlLGNsb3NpbmdUYWcpe2NvbnN0IHRyZWVFbGVtZW50PW5ldyBFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50KG5vZGUsY2xvc2luZ1RhZyk7dHJlZUVsZW1lbnQuc2V0RXhwYW5kYWJsZSghY2xvc2luZ1RhZyYmdGhpcy5faGFzVmlzaWJsZUNoaWxkcmVuKG5vZGUpKTtpZihub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmbm9kZS5wYXJlbnROb2RlJiZub2RlLnBhcmVudE5vZGUubm9kZVR5cGUoKT09PU5vZGUuRE9DVU1FTlRfTk9ERSYmIW5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlKQp0cmVlRWxlbWVudC5zZXRDb2xsYXBzaWJsZShmYWxzZSk7dHJlZUVsZW1lbnQuc2VsZWN0YWJsZT10aGlzLl9zZWxlY3RFbmFibGVkO3JldHVybiB0cmVlRWxlbWVudDt9Cl9zaG93Q2hpbGQodHJlZUVsZW1lbnQsY2hpbGQpe2lmKHRyZWVFbGVtZW50LmlzQ2xvc2luZ1RhZygpKQpyZXR1cm4gbnVsbDtjb25zdCBpbmRleD10aGlzLl92aXNpYmxlQ2hpbGRyZW4odHJlZUVsZW1lbnQubm9kZSgpKS5pbmRleE9mKGNoaWxkKTtpZihpbmRleD09PS0xKQpyZXR1cm4gbnVsbDtpZihpbmRleD49dHJlZUVsZW1lbnQuZXhwYW5kZWRDaGlsZHJlbkxpbWl0KCkpCnRoaXMuc2V0RXhwYW5kZWRDaGlsZHJlbkxpbWl0KHRyZWVFbGVtZW50LGluZGV4KzEpO3JldHVybih0cmVlRWxlbWVudC5jaGlsZEF0KGluZGV4KSk7fQpfdmlzaWJsZUNoaWxkcmVuKG5vZGUpe2xldCB2aXNpYmxlQ2hpbGRyZW49RWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudC52aXNpYmxlU2hhZG93Um9vdHMobm9kZSk7Y29uc3QgY29udGVudERvY3VtZW50PW5vZGUuY29udGVudERvY3VtZW50KCk7aWYoY29udGVudERvY3VtZW50KQp2aXNpYmxlQ2hpbGRyZW4ucHVzaChjb250ZW50RG9jdW1lbnQpO2NvbnN0IGltcG9ydGVkRG9jdW1lbnQ9bm9kZS5pbXBvcnRlZERvY3VtZW50KCk7aWYoaW1wb3J0ZWREb2N1bWVudCkKdmlzaWJsZUNoaWxkcmVuLnB1c2goaW1wb3J0ZWREb2N1bWVudCk7Y29uc3QgdGVtcGxhdGVDb250ZW50PW5vZGUudGVtcGxhdGVDb250ZW50KCk7aWYodGVtcGxhdGVDb250ZW50KQp2aXNpYmxlQ2hpbGRyZW4ucHVzaCh0ZW1wbGF0ZUNvbnRlbnQpO2NvbnN0IGJlZm9yZVBzZXVkb0VsZW1lbnQ9bm9kZS5iZWZvcmVQc2V1ZG9FbGVtZW50KCk7aWYoYmVmb3JlUHNldWRvRWxlbWVudCkKdmlzaWJsZUNoaWxkcmVuLnB1c2goYmVmb3JlUHNldWRvRWxlbWVudCk7aWYobm9kZS5jaGlsZE5vZGVDb3VudCgpKXtsZXQgY2hpbGRyZW49bm9kZS5jaGlsZHJlbigpO2lmKCF0aGlzLl9zaG93SFRNTENvbW1lbnRzU2V0dGluZy5nZXQoKSkKY2hpbGRyZW49Y2hpbGRyZW4uZmlsdGVyKG49Pm4ubm9kZVR5cGUoKSE9PU5vZGUuQ09NTUVOVF9OT0RFKTt2aXNpYmxlQ2hpbGRyZW49dmlzaWJsZUNoaWxkcmVuLmNvbmNhdChjaGlsZHJlbik7fQpjb25zdCBhZnRlclBzZXVkb0VsZW1lbnQ9bm9kZS5hZnRlclBzZXVkb0VsZW1lbnQoKTtpZihhZnRlclBzZXVkb0VsZW1lbnQpCnZpc2libGVDaGlsZHJlbi5wdXNoKGFmdGVyUHNldWRvRWxlbWVudCk7cmV0dXJuIHZpc2libGVDaGlsZHJlbjt9Cl9oYXNWaXNpYmxlQ2hpbGRyZW4obm9kZSl7aWYobm9kZS5pc0lmcmFtZSgpJiZSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgnb29waWZJbmxpbmVET00nKSkKcmV0dXJuIHRydWU7aWYobm9kZS5jb250ZW50RG9jdW1lbnQoKSkKcmV0dXJuIHRydWU7aWYobm9kZS5pbXBvcnRlZERvY3VtZW50KCkpCnJldHVybiB0cnVlO2lmKG5vZGUudGVtcGxhdGVDb250ZW50KCkpCnJldHVybiB0cnVlO2lmKEVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQudmlzaWJsZVNoYWRvd1Jvb3RzKG5vZGUpLmxlbmd0aCkKcmV0dXJuIHRydWU7aWYobm9kZS5oYXNQc2V1ZG9FbGVtZW50cygpKQpyZXR1cm4gdHJ1ZTtpZihub2RlLmlzSW5zZXJ0aW9uUG9pbnQoKSkKcmV0dXJuIHRydWU7cmV0dXJuISFub2RlLmNoaWxkTm9kZUNvdW50KCkmJiFFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LmNhblNob3dJbmxpbmVUZXh0KG5vZGUpO30KX2NyZWF0ZUV4cGFuZEFsbEJ1dHRvblRyZWVFbGVtZW50KHRyZWVFbGVtZW50KXtjb25zdCBidXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbignJyxoYW5kbGVMb2FkQWxsQ2hpbGRyZW4uYmluZCh0aGlzKSk7YnV0dG9uLnZhbHVlPScnO2NvbnN0IGV4cGFuZEFsbEJ1dHRvbkVsZW1lbnQ9bmV3IFVJLlRyZWVFbGVtZW50KGJ1dHRvbik7ZXhwYW5kQWxsQnV0dG9uRWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO2V4cGFuZEFsbEJ1dHRvbkVsZW1lbnQuZXhwYW5kQWxsQnV0dG9uPXRydWU7ZXhwYW5kQWxsQnV0dG9uRWxlbWVudC5idXR0b249YnV0dG9uO3JldHVybiBleHBhbmRBbGxCdXR0b25FbGVtZW50O2Z1bmN0aW9uIGhhbmRsZUxvYWRBbGxDaGlsZHJlbihldmVudCl7Y29uc3QgdmlzaWJsZUNoaWxkQ291bnQ9dGhpcy5fdmlzaWJsZUNoaWxkcmVuKHRyZWVFbGVtZW50Lm5vZGUoKSkubGVuZ3RoO3RoaXMuc2V0RXhwYW5kZWRDaGlsZHJlbkxpbWl0KHRyZWVFbGVtZW50LE1hdGgubWF4KHZpc2libGVDaGlsZENvdW50LHRyZWVFbGVtZW50LmV4cGFuZGVkQ2hpbGRyZW5MaW1pdCgpK0VsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuSW5pdGlhbENoaWxkcmVuTGltaXQpKTtldmVudC5jb25zdW1lKCk7fX0Kc2V0RXhwYW5kZWRDaGlsZHJlbkxpbWl0KHRyZWVFbGVtZW50LGV4cGFuZGVkQ2hpbGRyZW5MaW1pdCl7aWYodHJlZUVsZW1lbnQuZXhwYW5kZWRDaGlsZHJlbkxpbWl0KCk9PT1leHBhbmRlZENoaWxkcmVuTGltaXQpCnJldHVybjt0cmVlRWxlbWVudC5zZXRFeHBhbmRlZENoaWxkcmVuTGltaXQoZXhwYW5kZWRDaGlsZHJlbkxpbWl0KTtpZih0cmVlRWxlbWVudC50cmVlT3V0bGluZSYmIXRoaXMuX3RyZWVFbGVtZW50c0JlaW5nVXBkYXRlZC5oYXModHJlZUVsZW1lbnQpKQp0aGlzLl91cGRhdGVNb2RpZmllZFBhcmVudE5vZGUodHJlZUVsZW1lbnQubm9kZSgpKTt9Cl91cGRhdGVDaGlsZHJlbih0cmVlRWxlbWVudCl7aWYoIXRyZWVFbGVtZW50LmlzRXhwYW5kYWJsZSgpKXtjb25zdCBzZWxlY3RlZFRyZWVFbGVtZW50PXRyZWVFbGVtZW50LnRyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQ7aWYoc2VsZWN0ZWRUcmVlRWxlbWVudCYmc2VsZWN0ZWRUcmVlRWxlbWVudC5oYXNBbmNlc3Rvcih0cmVlRWxlbWVudCkpCnRyZWVFbGVtZW50LnNlbGVjdCh0cnVlKTt0cmVlRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3JldHVybjt9CmNvbnNvbGUuYXNzZXJ0KCF0cmVlRWxlbWVudC5pc0Nsb3NpbmdUYWcoKSk7dGhpcy5faW5uZXJVcGRhdGVDaGlsZHJlbih0cmVlRWxlbWVudCk7fQppbnNlcnRDaGlsZEVsZW1lbnQodHJlZUVsZW1lbnQsY2hpbGQsaW5kZXgsY2xvc2luZ1RhZyl7Y29uc3QgbmV3RWxlbWVudD10aGlzLl9jcmVhdGVFbGVtZW50VHJlZUVsZW1lbnQoY2hpbGQsY2xvc2luZ1RhZyk7dHJlZUVsZW1lbnQuaW5zZXJ0Q2hpbGQobmV3RWxlbWVudCxpbmRleCk7cmV0dXJuIG5ld0VsZW1lbnQ7fQpfbW92ZUNoaWxkKHRyZWVFbGVtZW50LGNoaWxkLHRhcmdldEluZGV4KXtpZih0cmVlRWxlbWVudC5pbmRleE9mQ2hpbGQoY2hpbGQpPT09dGFyZ2V0SW5kZXgpCnJldHVybjtjb25zdCB3YXNTZWxlY3RlZD1jaGlsZC5zZWxlY3RlZDtpZihjaGlsZC5wYXJlbnQpCmNoaWxkLnBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7dHJlZUVsZW1lbnQuaW5zZXJ0Q2hpbGQoY2hpbGQsdGFyZ2V0SW5kZXgpO2lmKHdhc1NlbGVjdGVkKQpjaGlsZC5zZWxlY3QoKTt9Cl9pbm5lclVwZGF0ZUNoaWxkcmVuKHRyZWVFbGVtZW50KXtpZih0aGlzLl90cmVlRWxlbWVudHNCZWluZ1VwZGF0ZWQuaGFzKHRyZWVFbGVtZW50KSkKcmV0dXJuO3RoaXMuX3RyZWVFbGVtZW50c0JlaW5nVXBkYXRlZC5hZGQodHJlZUVsZW1lbnQpO2NvbnN0IG5vZGU9dHJlZUVsZW1lbnQubm9kZSgpO2NvbnN0IHZpc2libGVDaGlsZHJlbj10aGlzLl92aXNpYmxlQ2hpbGRyZW4obm9kZSk7Y29uc3QgdmlzaWJsZUNoaWxkcmVuU2V0PW5ldyBTZXQodmlzaWJsZUNoaWxkcmVuKTtjb25zdCBleGlzdGluZ1RyZWVFbGVtZW50cz1uZXcgTWFwKCk7Zm9yKGxldCBpPXRyZWVFbGVtZW50LmNoaWxkQ291bnQoKS0xO2k+PTA7LS1pKXtjb25zdCBleGlzdGluZ1RyZWVFbGVtZW50PXRyZWVFbGVtZW50LmNoaWxkQXQoaSk7aWYoIShleGlzdGluZ1RyZWVFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudCkpe3RyZWVFbGVtZW50LnJlbW92ZUNoaWxkQXRJbmRleChpKTtjb250aW51ZTt9CmNvbnN0IGVsZW1lbnRzVHJlZUVsZW1lbnQ9KGV4aXN0aW5nVHJlZUVsZW1lbnQpO2NvbnN0IGV4aXN0aW5nTm9kZT1lbGVtZW50c1RyZWVFbGVtZW50Lm5vZGUoKTtpZih2aXNpYmxlQ2hpbGRyZW5TZXQuaGFzKGV4aXN0aW5nTm9kZSkpe2V4aXN0aW5nVHJlZUVsZW1lbnRzLnNldChleGlzdGluZ05vZGUsZXhpc3RpbmdUcmVlRWxlbWVudCk7Y29udGludWU7fQp0cmVlRWxlbWVudC5yZW1vdmVDaGlsZEF0SW5kZXgoaSk7fQpmb3IobGV0IGk9MDtpPHZpc2libGVDaGlsZHJlbi5sZW5ndGgmJmk8dHJlZUVsZW1lbnQuZXhwYW5kZWRDaGlsZHJlbkxpbWl0KCk7KytpKXtjb25zdCBjaGlsZD12aXNpYmxlQ2hpbGRyZW5baV07Y29uc3QgZXhpc3RpbmdUcmVlRWxlbWVudD1leGlzdGluZ1RyZWVFbGVtZW50cy5nZXQoY2hpbGQpfHx0aGlzLmZpbmRUcmVlRWxlbWVudChjaGlsZCk7aWYoZXhpc3RpbmdUcmVlRWxlbWVudCYmZXhpc3RpbmdUcmVlRWxlbWVudCE9PXRyZWVFbGVtZW50KXt0aGlzLl9tb3ZlQ2hpbGQodHJlZUVsZW1lbnQsZXhpc3RpbmdUcmVlRWxlbWVudCxpKTt9ZWxzZXtjb25zdCBuZXdFbGVtZW50PXRoaXMuaW5zZXJ0Q2hpbGRFbGVtZW50KHRyZWVFbGVtZW50LGNoaWxkLGkpO2lmKHRoaXMuX3VwZGF0ZVJlY29yZEZvckhpZ2hsaWdodChub2RlKSYmdHJlZUVsZW1lbnQuZXhwYW5kZWQpCkVsZW1lbnRzLkVsZW1lbnRzVHJlZUVsZW1lbnQuYW5pbWF0ZU9uRE9NVXBkYXRlKG5ld0VsZW1lbnQpO2lmKHRyZWVFbGVtZW50LmNoaWxkQ291bnQoKT50cmVlRWxlbWVudC5leHBhbmRlZENoaWxkcmVuTGltaXQoKSkKdGhpcy5zZXRFeHBhbmRlZENoaWxkcmVuTGltaXQodHJlZUVsZW1lbnQsdHJlZUVsZW1lbnQuZXhwYW5kZWRDaGlsZHJlbkxpbWl0KCkrMSk7fX0KY29uc3QgZXhwYW5kZWRDaGlsZENvdW50PXRyZWVFbGVtZW50LmNoaWxkQ291bnQoKTtpZih2aXNpYmxlQ2hpbGRyZW4ubGVuZ3RoPmV4cGFuZGVkQ2hpbGRDb3VudCl7Y29uc3QgdGFyZ2V0QnV0dG9uSW5kZXg9ZXhwYW5kZWRDaGlsZENvdW50O2lmKCF0cmVlRWxlbWVudC5leHBhbmRBbGxCdXR0b25FbGVtZW50KQp0cmVlRWxlbWVudC5leHBhbmRBbGxCdXR0b25FbGVtZW50PXRoaXMuX2NyZWF0ZUV4cGFuZEFsbEJ1dHRvblRyZWVFbGVtZW50KHRyZWVFbGVtZW50KTt0cmVlRWxlbWVudC5pbnNlcnRDaGlsZCh0cmVlRWxlbWVudC5leHBhbmRBbGxCdXR0b25FbGVtZW50LHRhcmdldEJ1dHRvbkluZGV4KTt0cmVlRWxlbWVudC5leHBhbmRBbGxCdXR0b25FbGVtZW50LmJ1dHRvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Nob3cgQWxsIE5vZGVzICglZCBNb3JlKScsdmlzaWJsZUNoaWxkcmVuLmxlbmd0aC1leHBhbmRlZENoaWxkQ291bnQpO31lbHNlIGlmKHRyZWVFbGVtZW50LmV4cGFuZEFsbEJ1dHRvbkVsZW1lbnQpe2RlbGV0ZSB0cmVlRWxlbWVudC5leHBhbmRBbGxCdXR0b25FbGVtZW50O30KaWYobm9kZS5pc0luc2VydGlvblBvaW50KCkpe2Zvcihjb25zdCBkaXN0cmlidXRlZE5vZGUgb2Ygbm9kZS5kaXN0cmlidXRlZE5vZGVzKCkpCnRyZWVFbGVtZW50LmFwcGVuZENoaWxkKG5ldyBFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlNob3J0Y3V0VHJlZUVsZW1lbnQoZGlzdHJpYnV0ZWROb2RlKSk7fQppZihub2RlLm5vZGVUeXBlKCk9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdHJlZUVsZW1lbnQuaXNFeHBhbmRhYmxlKCkpCnRoaXMuaW5zZXJ0Q2hpbGRFbGVtZW50KHRyZWVFbGVtZW50LG5vZGUsdHJlZUVsZW1lbnQuY2hpbGRDb3VudCgpLHRydWUpO3RoaXMuX3RyZWVFbGVtZW50c0JlaW5nVXBkYXRlZC5kZWxldGUodHJlZUVsZW1lbnQpO30KX21hcmtlcnNDaGFuZ2VkKGV2ZW50KXtjb25zdCBub2RlPShldmVudC5kYXRhKTtjb25zdCB0cmVlRWxlbWVudD1ub2RlW3RoaXMuX3RyZWVFbGVtZW50U3ltYm9sXTtpZih0cmVlRWxlbWVudCkKdHJlZUVsZW1lbnQudXBkYXRlRGVjb3JhdGlvbnMoKTt9fTtFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLl90cmVlT3V0bGluZVN5bWJvbD1TeW1ib2woJ3RyZWVPdXRsaW5lJyk7RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5DbGlwYm9hcmREYXRhO0VsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuRXZlbnRzPXtTZWxlY3RlZE5vZGVDaGFuZ2VkOlN5bWJvbCgnU2VsZWN0ZWROb2RlQ2hhbmdlZCcpLEVsZW1lbnRzVHJlZVVwZGF0ZWQ6U3ltYm9sKCdFbGVtZW50c1RyZWVVcGRhdGVkJyl9O0VsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuTWFwcGVkQ2hhclRvRW50aXR5PXsnXHUwMGEwJzonbmJzcCcsJ1x1MDA5Myc6JyMxNDcnLCdcdTAwYWQnOidzaHknLCdcdTIwMDInOidlbnNwJywnXHUyMDAzJzonZW1zcCcsJ1x1MjAwOSc6J3RoaW5zcCcsJ1x1MjAwYSc6JyM4MjAyJywnXHUyMDBiJzonIzgyMDMnLCdcdTIwMGMnOid6d25qJywnXHUyMDBkJzonendqJywnXHUyMDBlJzonbHJtJywnXHUyMDBmJzoncmxtJywnXHUyMDJhJzonIzgyMzQnLCdcdTIwMmInOicjODIzNScsJ1x1MjAyYyc6JyM4MjM2JywnXHUyMDJkJzonIzgyMzcnLCdcdTIwMmUnOicjODIzOCcsJ1x1ZmVmZic6JyM2NTI3OSd9O0VsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuVXBkYXRlUmVjb3JkPWNsYXNze2F0dHJpYnV0ZU1vZGlmaWVkKGF0dHJOYW1lKXtpZih0aGlzLl9yZW1vdmVkQXR0cmlidXRlcyYmdGhpcy5fcmVtb3ZlZEF0dHJpYnV0ZXMuaGFzKGF0dHJOYW1lKSkKdGhpcy5fcmVtb3ZlZEF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJOYW1lKTtpZighdGhpcy5fbW9kaWZpZWRBdHRyaWJ1dGVzKQp0aGlzLl9tb2RpZmllZEF0dHJpYnV0ZXM9KG5ldyBTZXQoKSk7dGhpcy5fbW9kaWZpZWRBdHRyaWJ1dGVzLmFkZChhdHRyTmFtZSk7fQphdHRyaWJ1dGVSZW1vdmVkKGF0dHJOYW1lKXtpZih0aGlzLl9tb2RpZmllZEF0dHJpYnV0ZXMmJnRoaXMuX21vZGlmaWVkQXR0cmlidXRlcy5oYXMoYXR0ck5hbWUpKQp0aGlzLl9tb2RpZmllZEF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJOYW1lKTtpZighdGhpcy5fcmVtb3ZlZEF0dHJpYnV0ZXMpCnRoaXMuX3JlbW92ZWRBdHRyaWJ1dGVzPShuZXcgU2V0KCkpO3RoaXMuX3JlbW92ZWRBdHRyaWJ1dGVzLmFkZChhdHRyTmFtZSk7fQpub2RlSW5zZXJ0ZWQobm9kZSl7dGhpcy5faGFzQ2hhbmdlZENoaWxkcmVuPXRydWU7fQpub2RlUmVtb3ZlZChub2RlKXt0aGlzLl9oYXNDaGFuZ2VkQ2hpbGRyZW49dHJ1ZTt0aGlzLl9oYXNSZW1vdmVkQ2hpbGRyZW49dHJ1ZTt9CmNoYXJEYXRhTW9kaWZpZWQoKXt0aGlzLl9jaGFyRGF0YU1vZGlmaWVkPXRydWU7fQpjaGlsZHJlbk1vZGlmaWVkKCl7dGhpcy5faGFzQ2hhbmdlZENoaWxkcmVuPXRydWU7fQppc0F0dHJpYnV0ZU1vZGlmaWVkKGF0dHJpYnV0ZU5hbWUpe3JldHVybiB0aGlzLl9tb2RpZmllZEF0dHJpYnV0ZXMmJnRoaXMuX21vZGlmaWVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSk7fQpoYXNSZW1vdmVkQXR0cmlidXRlcygpe3JldHVybiEhdGhpcy5fcmVtb3ZlZEF0dHJpYnV0ZXMmJiEhdGhpcy5fcmVtb3ZlZEF0dHJpYnV0ZXMuc2l6ZTt9CmlzQ2hhckRhdGFNb2RpZmllZCgpe3JldHVybiEhdGhpcy5fY2hhckRhdGFNb2RpZmllZDt9Cmhhc0NoYW5nZWRDaGlsZHJlbigpe3JldHVybiEhdGhpcy5faGFzQ2hhbmdlZENoaWxkcmVuO30KaGFzUmVtb3ZlZENoaWxkcmVuKCl7cmV0dXJuISF0aGlzLl9oYXNSZW1vdmVkQ2hpbGRyZW47fX07RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5SZW5kZXJlcj1jbGFzc3tyZW5kZXIob2JqZWN0KXtyZXR1cm4gbmV3IFByb21pc2UocmVuZGVyUHJvbWlzZSk7ZnVuY3Rpb24gcmVuZGVyUHJvbWlzZShyZXNvbHZlLHJlamVjdCl7aWYob2JqZWN0IGluc3RhbmNlb2YgU0RLLkRPTU5vZGUpCm9uTm9kZVJlc29sdmVkKChvYmplY3QpKTtlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFNESy5EZWZlcnJlZERPTU5vZGUpCigob2JqZWN0KSkucmVzb2x2ZShvbk5vZGVSZXNvbHZlZCk7ZWxzZQpyZWplY3QobmV3IEVycm9yKCdDYW5cJ3QgcmV2ZWFsIG5vdCBhIG5vZGUuJykpO2Z1bmN0aW9uIG9uTm9kZVJlc29sdmVkKG5vZGUpe2lmKCFub2RlKXtyZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSBub2RlLicpKTtyZXR1cm47fQpjb25zdCB0cmVlT3V0bGluZT1uZXcgRWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZShmYWxzZSxmYWxzZSk7dHJlZU91dGxpbmUucm9vdERPTU5vZGU9bm9kZTtpZighdHJlZU91dGxpbmUuZmlyc3RDaGlsZCgpLmlzRXhwYW5kYWJsZSgpKQp0cmVlT3V0bGluZS5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaW5nbGUtbm9kZScpO3RyZWVPdXRsaW5lLnNldFZpc2libGUodHJ1ZSk7dHJlZU91dGxpbmUuZWxlbWVudC50cmVlRWxlbWVudEZvclRlc3Q9dHJlZU91dGxpbmUuZmlyc3RDaGlsZCgpO3Jlc29sdmUodHJlZU91dGxpbmUuZWxlbWVudCk7fX19fTtFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLlNob3J0Y3V0VHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3Rvcihub2RlU2hvcnRjdXQpe3N1cGVyKCcnKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VsZWN0aW9uIGZpbGwnKTtjb25zdCB0aXRsZT10aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2VsZW1lbnRzLXRyZWUtc2hvcnRjdXQtdGl0bGUnKTtsZXQgdGV4dD1ub2RlU2hvcnRjdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihub2RlU2hvcnRjdXQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkKdGV4dD0nPCcrdGV4dCsnPic7dGl0bGUudGV4dENvbnRlbnQ9J1x1MjFBQSAnK3RleHQ7Y29uc3QgbGluaz1FbGVtZW50cy5ET01MaW5raWZpZXIubGlua2lmeURlZmVycmVkTm9kZVJlZmVyZW5jZShub2RlU2hvcnRjdXQuZGVmZXJyZWROb2RlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJyAnKTtsaW5rLmNsYXNzTGlzdC5hZGQoJ2VsZW1lbnRzLXRyZWUtc2hvcnRjdXQtbGluaycpO2xpbmsudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdyZXZlYWwnKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZChsaW5rKTt0aGlzLl9ub2RlU2hvcnRjdXQ9bm9kZVNob3J0Y3V0O30KZ2V0IGhvdmVyZWQoKXtyZXR1cm4gdGhpcy5faG92ZXJlZDt9CnNldCBob3ZlcmVkKHgpe2lmKHRoaXMuX2hvdmVyZWQ9PT14KQpyZXR1cm47dGhpcy5faG92ZXJlZD14O3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hvdmVyZWQnLHgpO30KYmFja2VuZE5vZGVJZCgpe3JldHVybiB0aGlzLl9ub2RlU2hvcnRjdXQuZGVmZXJyZWROb2RlLmJhY2tlbmROb2RlSWQoKTt9CmRvbU1vZGVsKCl7cmV0dXJuIHRoaXMuX25vZGVTaG9ydGN1dC5kZWZlcnJlZE5vZGUuZG9tTW9kZWwoKTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtpZighc2VsZWN0ZWRCeVVzZXIpCnJldHVybiB0cnVlO3RoaXMuX25vZGVTaG9ydGN1dC5kZWZlcnJlZE5vZGUuaGlnaGxpZ2h0KCk7dGhpcy5fbm9kZVNob3J0Y3V0LmRlZmVycmVkTm9kZS5yZXNvbHZlKHJlc29sdmVkLmJpbmQodGhpcykpO2Z1bmN0aW9uIHJlc29sdmVkKG5vZGUpe2lmKG5vZGUpe3RoaXMudHJlZU91dGxpbmUuX3NlbGVjdGVkRE9NTm9kZT1ub2RlO3RoaXMudHJlZU91dGxpbmUuX3NlbGVjdGVkTm9kZUNoYW5nZWQoKTt9fQpyZXR1cm4gdHJ1ZTt9fTs7RWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQ9Y2xhc3MgZXh0ZW5kcyBVSS5UaHJvdHRsZWRXaWRnZXR7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3Rvb2xiYXJJdGVtcz1bXTt0aGlzLl9zaG93Rm9yQW5jZXN0b3JzU2V0dGluZz1Db21tb24uc2V0dGluZ3MubW9kdWxlU2V0dGluZygnc2hvd0V2ZW50TGlzdGVuZXJzRm9yQW5jZXN0b3JzJyk7dGhpcy5fc2hvd0ZvckFuY2VzdG9yc1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7dGhpcy5fZGlzcGF0Y2hGaWx0ZXJCeVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2V2ZW50TGlzdGVuZXJEaXNwYXRjaEZpbHRlclR5cGUnLEVsZW1lbnRzLkV2ZW50TGlzdGVuZXJzV2lkZ2V0LkRpc3BhdGNoRmlsdGVyQnkuQWxsKTt0aGlzLl9kaXNwYXRjaEZpbHRlckJ5U2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTt0aGlzLl9zaG93RnJhbWV3b3JrTGlzdGVuZXJzU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnc2hvd0ZyYW1lb3drckxpc3RlbmVycycsdHJ1ZSk7dGhpcy5fc2hvd0ZyYW1ld29ya0xpc3RlbmVyc1NldHRpbmcuc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdGcmFtZXdvcmsgbGlzdGVuZXJzJykpO3RoaXMuX3Nob3dGcmFtZXdvcmtMaXN0ZW5lcnNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3Nob3dGcmFtZXdvcmtMaXN0ZW5lcnNDaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuX2V2ZW50TGlzdGVuZXJzVmlldz1uZXcgRXZlbnRMaXN0ZW5lcnMuRXZlbnRMaXN0ZW5lcnNWaWV3KHRoaXMudXBkYXRlLmJpbmQodGhpcykpO3RoaXMuX2V2ZW50TGlzdGVuZXJzVmlldy5zaG93KHRoaXMuZWxlbWVudCk7Y29uc3QgcmVmcmVzaEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1JlZnJlc2gnKSwnbGFyZ2VpY29uLXJlZnJlc2gnKTtyZWZyZXNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy51cGRhdGUuYmluZCh0aGlzKSk7dGhpcy5fdG9vbGJhckl0ZW1zLnB1c2gocmVmcmVzaEJ1dHRvbik7dGhpcy5fdG9vbGJhckl0ZW1zLnB1c2gobmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3godGhpcy5fc2hvd0ZvckFuY2VzdG9yc1NldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdTaG93IGxpc3RlbmVycyBvbiB0aGUgYW5jZXN0b3JzJyksQ29tbW9uLlVJU3RyaW5nKCdBbmNlc3RvcnMnKSkpO2NvbnN0IGRpc3BhdGNoRmlsdGVyPW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3godGhpcy5fb25EaXNwYXRjaEZpbHRlclR5cGVDaGFuZ2VkLmJpbmQodGhpcykpO2Z1bmN0aW9uIGFkZERpc3BhdGNoRmlsdGVyT3B0aW9uKG5hbWUsdmFsdWUpe2NvbnN0IG9wdGlvbj1kaXNwYXRjaEZpbHRlci5jcmVhdGVPcHRpb24obmFtZSwnJyx2YWx1ZSk7aWYodmFsdWU9PT10aGlzLl9kaXNwYXRjaEZpbHRlckJ5U2V0dGluZy5nZXQoKSkKZGlzcGF0Y2hGaWx0ZXIuc2VsZWN0KG9wdGlvbik7fQphZGREaXNwYXRjaEZpbHRlck9wdGlvbi5jYWxsKHRoaXMsQ29tbW9uLlVJU3RyaW5nKCdBbGwnKSxFbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5EaXNwYXRjaEZpbHRlckJ5LkFsbCk7YWRkRGlzcGF0Y2hGaWx0ZXJPcHRpb24uY2FsbCh0aGlzLENvbW1vbi5VSVN0cmluZygnUGFzc2l2ZScpLEVsZW1lbnRzLkV2ZW50TGlzdGVuZXJzV2lkZ2V0LkRpc3BhdGNoRmlsdGVyQnkuUGFzc2l2ZSk7YWRkRGlzcGF0Y2hGaWx0ZXJPcHRpb24uY2FsbCh0aGlzLENvbW1vbi5VSVN0cmluZygnQmxvY2tpbmcnKSxFbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5EaXNwYXRjaEZpbHRlckJ5LkJsb2NraW5nKTtkaXNwYXRjaEZpbHRlci5zZXRNYXhXaWR0aCgyMDApO3RoaXMuX3Rvb2xiYXJJdGVtcy5wdXNoKGRpc3BhdGNoRmlsdGVyKTt0aGlzLl90b29sYmFySXRlbXMucHVzaChuZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveCh0aGlzLl9zaG93RnJhbWV3b3JrTGlzdGVuZXJzU2V0dGluZyxDb21tb24uVUlTdHJpbmcoJ1Jlc29sdmUgZXZlbnQgbGlzdGVuZXJzIGJvdW5kIHdpdGggZnJhbWV3b3JrJykpKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLHRoaXMudXBkYXRlLHRoaXMpO3RoaXMudXBkYXRlKCk7fQpkb1VwZGF0ZSgpe2lmKHRoaXMuX2xhc3RSZXF1ZXN0ZWROb2RlKXt0aGlzLl9sYXN0UmVxdWVzdGVkTm9kZS5kb21Nb2RlbCgpLnJ1bnRpbWVNb2RlbCgpLnJlbGVhc2VPYmplY3RHcm91cChFbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5fb2JqZWN0R3JvdXBOYW1lKTtkZWxldGUgdGhpcy5fbGFzdFJlcXVlc3RlZE5vZGU7fQpjb25zdCBub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTtpZighbm9kZSl7dGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3LnJlc2V0KCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3LmFkZEVtcHR5SG9sZGVySWZOZWVkZWQoKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQp0aGlzLl9sYXN0UmVxdWVzdGVkTm9kZT1ub2RlO2NvbnN0IHNlbGVjdGVkTm9kZU9ubHk9IXRoaXMuX3Nob3dGb3JBbmNlc3RvcnNTZXR0aW5nLmdldCgpO2NvbnN0IHByb21pc2VzPVtdO3Byb21pc2VzLnB1c2gobm9kZS5yZXNvbHZlVG9PYmplY3QoRWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQuX29iamVjdEdyb3VwTmFtZSkpO2lmKCFzZWxlY3RlZE5vZGVPbmx5KXtsZXQgY3VycmVudE5vZGU9bm9kZS5wYXJlbnROb2RlO3doaWxlKGN1cnJlbnROb2RlKXtwcm9taXNlcy5wdXNoKGN1cnJlbnROb2RlLnJlc29sdmVUb09iamVjdChFbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5fb2JqZWN0R3JvdXBOYW1lKSk7Y3VycmVudE5vZGU9Y3VycmVudE5vZGUucGFyZW50Tm9kZTt9CnByb21pc2VzLnB1c2godGhpcy5fd2luZG93T2JqZWN0SW5Ob2RlQ29udGV4dChub2RlKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4odGhpcy5fZXZlbnRMaXN0ZW5lcnNWaWV3LmFkZE9iamVjdHMuYmluZCh0aGlzLl9ldmVudExpc3RlbmVyc1ZpZXcpKS50aGVuKHRoaXMuX3Nob3dGcmFtZXdvcmtMaXN0ZW5lcnNDaGFuZ2VkLmJpbmQodGhpcykpO30KdG9vbGJhckl0ZW1zKCl7cmV0dXJuIHRoaXMuX3Rvb2xiYXJJdGVtczt9Cl9vbkRpc3BhdGNoRmlsdGVyVHlwZUNoYW5nZWQoZXZlbnQpe3RoaXMuX2Rpc3BhdGNoRmlsdGVyQnlTZXR0aW5nLnNldChldmVudC50YXJnZXQudmFsdWUpO30KX3Nob3dGcmFtZXdvcmtMaXN0ZW5lcnNDaGFuZ2VkKCl7Y29uc3QgZGlzcGF0Y2hGaWx0ZXI9dGhpcy5fZGlzcGF0Y2hGaWx0ZXJCeVNldHRpbmcuZ2V0KCk7Y29uc3Qgc2hvd1Bhc3NpdmU9ZGlzcGF0Y2hGaWx0ZXI9PT1FbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5EaXNwYXRjaEZpbHRlckJ5LkFsbHx8ZGlzcGF0Y2hGaWx0ZXI9PT1FbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5EaXNwYXRjaEZpbHRlckJ5LlBhc3NpdmU7Y29uc3Qgc2hvd0Jsb2NraW5nPWRpc3BhdGNoRmlsdGVyPT09RWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQuRGlzcGF0Y2hGaWx0ZXJCeS5BbGx8fGRpc3BhdGNoRmlsdGVyPT09RWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQuRGlzcGF0Y2hGaWx0ZXJCeS5CbG9ja2luZzt0aGlzLl9ldmVudExpc3RlbmVyc1ZpZXcuc2hvd0ZyYW1ld29ya0xpc3RlbmVycyh0aGlzLl9zaG93RnJhbWV3b3JrTGlzdGVuZXJzU2V0dGluZy5nZXQoKSxzaG93UGFzc2l2ZSxzaG93QmxvY2tpbmcpO30KX3dpbmRvd09iamVjdEluTm9kZUNvbnRleHQobm9kZSl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dHM9bm9kZS5kb21Nb2RlbCgpLnJ1bnRpbWVNb2RlbCgpLmV4ZWN1dGlvbkNvbnRleHRzKCk7bGV0IGNvbnRleHQ9bnVsbDtpZihub2RlLmZyYW1lSWQoKSl7Zm9yKGxldCBpPTA7aTxleGVjdXRpb25Db250ZXh0cy5sZW5ndGg7KytpKXtjb25zdCBleGVjdXRpb25Db250ZXh0PWV4ZWN1dGlvbkNvbnRleHRzW2ldO2lmKGV4ZWN1dGlvbkNvbnRleHQuZnJhbWVJZD09PW5vZGUuZnJhbWVJZCgpJiZleGVjdXRpb25Db250ZXh0LmlzRGVmYXVsdCkKY29udGV4dD1leGVjdXRpb25Db250ZXh0O319ZWxzZXtjb250ZXh0PWV4ZWN1dGlvbkNvbnRleHRzWzBdO30KcmV0dXJuIGNvbnRleHQuZXZhbHVhdGUoe2V4cHJlc3Npb246J3NlbGYnLG9iamVjdEdyb3VwOkVsZW1lbnRzLkV2ZW50TGlzdGVuZXJzV2lkZ2V0Ll9vYmplY3RHcm91cE5hbWUsaW5jbHVkZUNvbW1hbmRMaW5lQVBJOmZhbHNlLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6ZmFsc2UsZ2VuZXJhdGVQcmV2aWV3OmZhbHNlfSxmYWxzZSxmYWxzZSkudGhlbihyZXN1bHQ9PnJlc3VsdC5vYmplY3R8fG51bGwpO30KX2V2ZW50TGlzdGVuZXJzQXJyaXZlZEZvclRlc3QoKXt9fTtFbGVtZW50cy5FdmVudExpc3RlbmVyc1dpZGdldC5EaXNwYXRjaEZpbHRlckJ5PXtBbGw6J0FsbCcsQmxvY2tpbmc6J0Jsb2NraW5nJyxQYXNzaXZlOidQYXNzaXZlJ307RWxlbWVudHMuRXZlbnRMaXN0ZW5lcnNXaWRnZXQuX29iamVjdEdyb3VwTmFtZT0nZXZlbnQtbGlzdGVuZXJzLXBhbmVsJzs7RWxlbWVudHMuTWFya2VyRGVjb3JhdG9yPWZ1bmN0aW9uKCl7fTtFbGVtZW50cy5NYXJrZXJEZWNvcmF0b3IucHJvdG90eXBlPXtkZWNvcmF0ZShub2RlKXt9fTtFbGVtZW50cy5HZW5lcmljRGVjb3JhdG9yPWNsYXNze2NvbnN0cnVjdG9yKGV4dGVuc2lvbil7dGhpcy5fdGl0bGU9Q29tbW9uLlVJU3RyaW5nKGV4dGVuc2lvbi50aXRsZSgpKTt0aGlzLl9jb2xvcj1leHRlbnNpb24uZGVzY3JpcHRvcigpWydjb2xvciddO30KZGVjb3JhdGUobm9kZSl7cmV0dXJue3RpdGxlOnRoaXMuX3RpdGxlLGNvbG9yOnRoaXMuX2NvbG9yfTt9fTs7RWxlbWVudHMuTWV0cmljc1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgRWxlbWVudHMuRWxlbWVudHNTaWRlYmFyUGFuZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9tZXRyaWNzU2lkZWJhclBhbmUuY3NzJyk7dGhpcy5faW5saW5lU3R5bGU9bnVsbDt9CmRvVXBkYXRlKCl7aWYodGhpcy5faXNFZGl0aW5nTWV0cmljcykKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IG5vZGU9dGhpcy5ub2RlKCk7Y29uc3QgY3NzTW9kZWw9dGhpcy5jc3NNb2RlbCgpO2lmKCFub2RlfHxub2RlLm5vZGVUeXBlKCkhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8IWNzc01vZGVsKXt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KZnVuY3Rpb24gY2FsbGJhY2soc3R5bGUpe2lmKCFzdHlsZXx8dGhpcy5ub2RlKCkhPT1ub2RlKQpyZXR1cm47dGhpcy5fdXBkYXRlTWV0cmljcyhzdHlsZSk7fQpmdW5jdGlvbiBpbmxpbmVTdHlsZUNhbGxiYWNrKGlubGluZVN0eWxlUmVzdWx0KXtpZihpbmxpbmVTdHlsZVJlc3VsdCYmdGhpcy5ub2RlKCk9PT1ub2RlKQp0aGlzLl9pbmxpbmVTdHlsZT1pbmxpbmVTdHlsZVJlc3VsdC5pbmxpbmVTdHlsZTt9CmNvbnN0IHByb21pc2VzPVtjc3NNb2RlbC5jb21wdXRlZFN0eWxlUHJvbWlzZShub2RlLmlkKS50aGVuKGNhbGxiYWNrLmJpbmQodGhpcykpLGNzc01vZGVsLmlubGluZVN0eWxlc1Byb21pc2Uobm9kZS5pZCkudGhlbihpbmxpbmVTdHlsZUNhbGxiYWNrLmJpbmQodGhpcykpXTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30Kb25DU1NNb2RlbENoYW5nZWQoKXt0aGlzLnVwZGF0ZSgpO30KX2dldFByb3BlcnR5VmFsdWVBc1B4KHN0eWxlLHByb3BlcnR5TmFtZSl7cmV0dXJuIE51bWJlcihzdHlsZS5nZXQocHJvcGVydHlOYW1lKS5yZXBsYWNlKC9weCQvLCcnKXx8MCk7fQpfZ2V0Qm94KGNvbXB1dGVkU3R5bGUsY29tcG9uZW50TmFtZSl7Y29uc3Qgc3VmZml4PWNvbXBvbmVudE5hbWU9PT0nYm9yZGVyJz8nLXdpZHRoJzonJztjb25zdCBsZWZ0PXRoaXMuX2dldFByb3BlcnR5VmFsdWVBc1B4KGNvbXB1dGVkU3R5bGUsY29tcG9uZW50TmFtZSsnLWxlZnQnK3N1ZmZpeCk7Y29uc3QgdG9wPXRoaXMuX2dldFByb3BlcnR5VmFsdWVBc1B4KGNvbXB1dGVkU3R5bGUsY29tcG9uZW50TmFtZSsnLXRvcCcrc3VmZml4KTtjb25zdCByaWdodD10aGlzLl9nZXRQcm9wZXJ0eVZhbHVlQXNQeChjb21wdXRlZFN0eWxlLGNvbXBvbmVudE5hbWUrJy1yaWdodCcrc3VmZml4KTtjb25zdCBib3R0b209dGhpcy5fZ2V0UHJvcGVydHlWYWx1ZUFzUHgoY29tcHV0ZWRTdHlsZSxjb21wb25lbnROYW1lKyctYm90dG9tJytzdWZmaXgpO3JldHVybntsZWZ0OmxlZnQsdG9wOnRvcCxyaWdodDpyaWdodCxib3R0b206Ym90dG9tfTt9Cl9oaWdobGlnaHRET01Ob2RlKHNob3dIaWdobGlnaHQsbW9kZSxldmVudCl7ZXZlbnQuY29uc3VtZSgpO2lmKHNob3dIaWdobGlnaHQmJnRoaXMubm9kZSgpKXtpZih0aGlzLl9oaWdobGlnaHRNb2RlPT09bW9kZSkKcmV0dXJuO3RoaXMuX2hpZ2hsaWdodE1vZGU9bW9kZTt0aGlzLm5vZGUoKS5oaWdobGlnaHQobW9kZSk7fWVsc2V7ZGVsZXRlIHRoaXMuX2hpZ2hsaWdodE1vZGU7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO30KZm9yKGxldCBpPTA7dGhpcy5fYm94RWxlbWVudHMmJmk8dGhpcy5fYm94RWxlbWVudHMubGVuZ3RoOysraSl7Y29uc3QgZWxlbWVudD10aGlzLl9ib3hFbGVtZW50c1tpXTtpZighdGhpcy5ub2RlKCl8fG1vZGU9PT0nYWxsJ3x8ZWxlbWVudC5fbmFtZT09PW1vZGUpCmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWVsZW1lbnQuX2JhY2tncm91bmRDb2xvcjtlbHNlCmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yPScnO319Cl91cGRhdGVNZXRyaWNzKHN0eWxlKXtjb25zdCBtZXRyaWNzRWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTttZXRyaWNzRWxlbWVudC5jbGFzc05hbWU9J21ldHJpY3MnO2NvbnN0IHNlbGY9dGhpcztmdW5jdGlvbiBjcmVhdGVCb3hQYXJ0RWxlbWVudChzdHlsZSxuYW1lLHNpZGUsc3VmZml4KXtjb25zdCBwcm9wZXJ0eU5hbWU9KG5hbWUhPT0ncG9zaXRpb24nP25hbWUrJy0nOicnKStzaWRlK3N1ZmZpeDtsZXQgdmFsdWU9c3R5bGUuZ2V0KHByb3BlcnR5TmFtZSk7aWYodmFsdWU9PT0nJ3x8KG5hbWUhPT0ncG9zaXRpb24nJiZ2YWx1ZT09PScwcHgnKSkKdmFsdWU9J1x1MjAxMic7ZWxzZSBpZihuYW1lPT09J3Bvc2l0aW9uJyYmdmFsdWU9PT0nYXV0bycpCnZhbHVlPSdcdTIwMTInO3ZhbHVlPXZhbHVlLnJlcGxhY2UoL3B4JC8sJycpO3ZhbHVlPU51bWJlci50b0ZpeGVkSWZGbG9hdGluZyh2YWx1ZSk7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtlbGVtZW50LmNsYXNzTmFtZT1zaWRlO2VsZW1lbnQudGV4dENvbnRlbnQ9dmFsdWU7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsdGhpcy5zdGFydEVkaXRpbmcuYmluZCh0aGlzLGVsZW1lbnQsbmFtZSxwcm9wZXJ0eU5hbWUsc3R5bGUpLGZhbHNlKTtyZXR1cm4gZWxlbWVudDt9CmZ1bmN0aW9uIGdldENvbnRlbnRBcmVhV2lkdGhQeChzdHlsZSl7bGV0IHdpZHRoPXN0eWxlLmdldCgnd2lkdGgnKS5yZXBsYWNlKC9weCQvLCcnKTtpZighaXNOYU4od2lkdGgpJiZzdHlsZS5nZXQoJ2JveC1zaXppbmcnKT09PSdib3JkZXItYm94Jyl7Y29uc3QgYm9yZGVyQm94PXNlbGYuX2dldEJveChzdHlsZSwnYm9yZGVyJyk7Y29uc3QgcGFkZGluZ0JveD1zZWxmLl9nZXRCb3goc3R5bGUsJ3BhZGRpbmcnKTt3aWR0aD13aWR0aC1ib3JkZXJCb3gubGVmdC1ib3JkZXJCb3gucmlnaHQtcGFkZGluZ0JveC5sZWZ0LXBhZGRpbmdCb3gucmlnaHQ7fQpyZXR1cm4gTnVtYmVyLnRvRml4ZWRJZkZsb2F0aW5nKHdpZHRoLnRvU3RyaW5nKCkpO30KZnVuY3Rpb24gZ2V0Q29udGVudEFyZWFIZWlnaHRQeChzdHlsZSl7bGV0IGhlaWdodD1zdHlsZS5nZXQoJ2hlaWdodCcpLnJlcGxhY2UoL3B4JC8sJycpO2lmKCFpc05hTihoZWlnaHQpJiZzdHlsZS5nZXQoJ2JveC1zaXppbmcnKT09PSdib3JkZXItYm94Jyl7Y29uc3QgYm9yZGVyQm94PXNlbGYuX2dldEJveChzdHlsZSwnYm9yZGVyJyk7Y29uc3QgcGFkZGluZ0JveD1zZWxmLl9nZXRCb3goc3R5bGUsJ3BhZGRpbmcnKTtoZWlnaHQ9aGVpZ2h0LWJvcmRlckJveC50b3AtYm9yZGVyQm94LmJvdHRvbS1wYWRkaW5nQm94LnRvcC1wYWRkaW5nQm94LmJvdHRvbTt9CnJldHVybiBOdW1iZXIudG9GaXhlZElmRmxvYXRpbmcoaGVpZ2h0LnRvU3RyaW5nKCkpO30KY29uc3Qgbm9NYXJnaW5EaXNwbGF5VHlwZT17J3RhYmxlLWNlbGwnOnRydWUsJ3RhYmxlLWNvbHVtbic6dHJ1ZSwndGFibGUtY29sdW1uLWdyb3VwJzp0cnVlLCd0YWJsZS1mb290ZXItZ3JvdXAnOnRydWUsJ3RhYmxlLWhlYWRlci1ncm91cCc6dHJ1ZSwndGFibGUtcm93Jzp0cnVlLCd0YWJsZS1yb3ctZ3JvdXAnOnRydWV9O2NvbnN0IG5vUGFkZGluZ0Rpc3BsYXlUeXBlPXsndGFibGUtY29sdW1uJzp0cnVlLCd0YWJsZS1jb2x1bW4tZ3JvdXAnOnRydWUsJ3RhYmxlLWZvb3Rlci1ncm91cCc6dHJ1ZSwndGFibGUtaGVhZGVyLWdyb3VwJzp0cnVlLCd0YWJsZS1yb3cnOnRydWUsJ3RhYmxlLXJvdy1ncm91cCc6dHJ1ZX07Y29uc3Qgbm9Qb3NpdGlvblR5cGU9eydzdGF0aWMnOnRydWV9O2NvbnN0IGJveGVzPVsnY29udGVudCcsJ3BhZGRpbmcnLCdib3JkZXInLCdtYXJnaW4nLCdwb3NpdGlvbiddO2NvbnN0IGJveENvbG9ycz1bQ29tbW9uLkNvbG9yLlBhZ2VIaWdobGlnaHQuQ29udGVudCxDb21tb24uQ29sb3IuUGFnZUhpZ2hsaWdodC5QYWRkaW5nLENvbW1vbi5Db2xvci5QYWdlSGlnaGxpZ2h0LkJvcmRlcixDb21tb24uQ29sb3IuUGFnZUhpZ2hsaWdodC5NYXJnaW4sQ29tbW9uLkNvbG9yLmZyb21SR0JBKFswLDAsMCwwXSldO2NvbnN0IGJveExhYmVscz1bQ29tbW9uLlVJU3RyaW5nKCdjb250ZW50JyksQ29tbW9uLlVJU3RyaW5nKCdwYWRkaW5nJyksQ29tbW9uLlVJU3RyaW5nKCdib3JkZXInKSxDb21tb24uVUlTdHJpbmcoJ21hcmdpbicpLENvbW1vbi5VSVN0cmluZygncG9zaXRpb24nKV07bGV0IHByZXZpb3VzQm94PW51bGw7dGhpcy5fYm94RWxlbWVudHM9W107Zm9yKGxldCBpPTA7aTxib3hlcy5sZW5ndGg7KytpKXtjb25zdCBuYW1lPWJveGVzW2ldO2lmKG5hbWU9PT0nbWFyZ2luJyYmbm9NYXJnaW5EaXNwbGF5VHlwZVtzdHlsZS5nZXQoJ2Rpc3BsYXknKV0pCmNvbnRpbnVlO2lmKG5hbWU9PT0ncGFkZGluZycmJm5vUGFkZGluZ0Rpc3BsYXlUeXBlW3N0eWxlLmdldCgnZGlzcGxheScpXSkKY29udGludWU7aWYobmFtZT09PSdwb3NpdGlvbicmJm5vUG9zaXRpb25UeXBlW3N0eWxlLmdldCgncG9zaXRpb24nKV0pCmNvbnRpbnVlO2NvbnN0IGJveEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Ym94RWxlbWVudC5jbGFzc05hbWU9bmFtZTtib3hFbGVtZW50Ll9iYWNrZ3JvdW5kQ29sb3I9Ym94Q29sb3JzW2ldLmFzU3RyaW5nKENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCQSk7Ym94RWxlbWVudC5fbmFtZT1uYW1lO2JveEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWJveEVsZW1lbnQuX2JhY2tncm91bmRDb2xvcjtib3hFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsdGhpcy5faGlnaGxpZ2h0RE9NTm9kZS5iaW5kKHRoaXMsdHJ1ZSxuYW1lPT09J3Bvc2l0aW9uJz8nYWxsJzpuYW1lKSxmYWxzZSk7dGhpcy5fYm94RWxlbWVudHMucHVzaChib3hFbGVtZW50KTtpZihuYW1lPT09J2NvbnRlbnQnKXtjb25zdCB3aWR0aEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3dpZHRoRWxlbWVudC50ZXh0Q29udGVudD1nZXRDb250ZW50QXJlYVdpZHRoUHgoc3R5bGUpO3dpZHRoRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsdGhpcy5zdGFydEVkaXRpbmcuYmluZCh0aGlzLHdpZHRoRWxlbWVudCwnd2lkdGgnLCd3aWR0aCcsc3R5bGUpLGZhbHNlKTtjb25zdCBoZWlnaHRFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtoZWlnaHRFbGVtZW50LnRleHRDb250ZW50PWdldENvbnRlbnRBcmVhSGVpZ2h0UHgoc3R5bGUpO2hlaWdodEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuc3RhcnRFZGl0aW5nLmJpbmQodGhpcyxoZWlnaHRFbGVtZW50LCdoZWlnaHQnLCdoZWlnaHQnLHN0eWxlKSxmYWxzZSk7Ym94RWxlbWVudC5hcHBlbmRDaGlsZCh3aWR0aEVsZW1lbnQpO2JveEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCcgXHUwMEQ3ICcpO2JveEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVpZ2h0RWxlbWVudCk7fWVsc2V7Y29uc3Qgc3VmZml4PShuYW1lPT09J2JvcmRlcic/Jy13aWR0aCc6JycpO2NvbnN0IGxhYmVsRWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtsYWJlbEVsZW1lbnQuY2xhc3NOYW1lPSdsYWJlbCc7bGFiZWxFbGVtZW50LnRleHRDb250ZW50PWJveExhYmVsc1tpXTtib3hFbGVtZW50LmFwcGVuZENoaWxkKGxhYmVsRWxlbWVudCk7Ym94RWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVCb3hQYXJ0RWxlbWVudC5jYWxsKHRoaXMsc3R5bGUsbmFtZSwndG9wJyxzdWZmaXgpKTtib3hFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ2JyJykpO2JveEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlQm94UGFydEVsZW1lbnQuY2FsbCh0aGlzLHN0eWxlLG5hbWUsJ2xlZnQnLHN1ZmZpeCkpO2lmKHByZXZpb3VzQm94KQpib3hFbGVtZW50LmFwcGVuZENoaWxkKHByZXZpb3VzQm94KTtib3hFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZUJveFBhcnRFbGVtZW50LmNhbGwodGhpcyxzdHlsZSxuYW1lLCdyaWdodCcsc3VmZml4KSk7Ym94RWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdicicpKTtib3hFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZUJveFBhcnRFbGVtZW50LmNhbGwodGhpcyxzdHlsZSxuYW1lLCdib3R0b20nLHN1ZmZpeCkpO30KcHJldmlvdXNCb3g9Ym94RWxlbWVudDt9Cm1ldHJpY3NFbGVtZW50LmFwcGVuZENoaWxkKHByZXZpb3VzQm94KTttZXRyaWNzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLHRoaXMuX2hpZ2hsaWdodERPTU5vZGUuYmluZCh0aGlzLGZhbHNlLCdhbGwnKSxmYWxzZSk7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0cmljc0VsZW1lbnQpO30Kc3RhcnRFZGl0aW5nKHRhcmdldEVsZW1lbnQsYm94LHN0eWxlUHJvcGVydHksY29tcHV0ZWRTdHlsZSl7aWYoVUkuaXNCZWluZ0VkaXRlZCh0YXJnZXRFbGVtZW50KSkKcmV0dXJuO2NvbnN0IGNvbnRleHQ9e2JveDpib3gsc3R5bGVQcm9wZXJ0eTpzdHlsZVByb3BlcnR5LGNvbXB1dGVkU3R5bGU6Y29tcHV0ZWRTdHlsZX07Y29uc3QgYm91bmRLZXlEb3duPXRoaXMuX2hhbmRsZUtleURvd24uYmluZCh0aGlzLGNvbnRleHQsc3R5bGVQcm9wZXJ0eSk7Y29udGV4dC5rZXlEb3duSGFuZGxlcj1ib3VuZEtleURvd247dGFyZ2V0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxib3VuZEtleURvd24sZmFsc2UpO3RoaXMuX2lzRWRpdGluZ01ldHJpY3M9dHJ1ZTtjb25zdCBjb25maWc9bmV3IFVJLklucGxhY2VFZGl0b3IuQ29uZmlnKHRoaXMuX2VkaXRpbmdDb21taXR0ZWQuYmluZCh0aGlzKSx0aGlzLmVkaXRpbmdDYW5jZWxsZWQuYmluZCh0aGlzKSxjb250ZXh0KTtVSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZyh0YXJnZXRFbGVtZW50LGNvbmZpZyk7dGFyZ2V0RWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbih0YXJnZXRFbGVtZW50KTt9Cl9oYW5kbGVLZXlEb3duKGNvbnRleHQsc3R5bGVQcm9wZXJ0eSxldmVudCl7Y29uc3QgZWxlbWVudD1ldmVudC5jdXJyZW50VGFyZ2V0O2Z1bmN0aW9uIGZpbmlzaEhhbmRsZXIob3JpZ2luYWxWYWx1ZSxyZXBsYWNlbWVudFN0cmluZyl7dGhpcy5fYXBwbHlVc2VySW5wdXQoZWxlbWVudCxyZXBsYWNlbWVudFN0cmluZyxvcmlnaW5hbFZhbHVlLGNvbnRleHQsZmFsc2UpO30KZnVuY3Rpb24gY3VzdG9tTnVtYmVySGFuZGxlcihwcmVmaXgsbnVtYmVyLHN1ZmZpeCl7aWYoc3R5bGVQcm9wZXJ0eSE9PSdtYXJnaW4nJiZudW1iZXI8MCkKbnVtYmVyPTA7cmV0dXJuIHByZWZpeCtudW1iZXIrc3VmZml4O30KVUkuaGFuZGxlRWxlbWVudFZhbHVlTW9kaWZpY2F0aW9ucyhldmVudCxlbGVtZW50LGZpbmlzaEhhbmRsZXIuYmluZCh0aGlzKSx1bmRlZmluZWQsY3VzdG9tTnVtYmVySGFuZGxlcik7fQplZGl0aW5nRW5kZWQoZWxlbWVudCxjb250ZXh0KXtkZWxldGUgdGhpcy5vcmlnaW5hbFByb3BlcnR5RGF0YTtkZWxldGUgdGhpcy5wcmV2aW91c1Byb3BlcnR5RGF0YUNhbmRpZGF0ZTtlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGNvbnRleHQua2V5RG93bkhhbmRsZXIsZmFsc2UpO2RlbGV0ZSB0aGlzLl9pc0VkaXRpbmdNZXRyaWNzO30KZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50LGNvbnRleHQpe2lmKCdvcmlnaW5hbFByb3BlcnR5RGF0YSdpbiB0aGlzJiZ0aGlzLl9pbmxpbmVTdHlsZSl7aWYoIXRoaXMub3JpZ2luYWxQcm9wZXJ0eURhdGEpe2NvbnN0IHBhc3RMYXN0U291cmNlUHJvcGVydHlJbmRleD10aGlzLl9pbmxpbmVTdHlsZS5wYXN0TGFzdFNvdXJjZVByb3BlcnR5SW5kZXgoKTtpZihwYXN0TGFzdFNvdXJjZVByb3BlcnR5SW5kZXgpCnRoaXMuX2lubGluZVN0eWxlLmFsbFByb3BlcnRpZXMoKVtwYXN0TGFzdFNvdXJjZVByb3BlcnR5SW5kZXgtMV0uc2V0VGV4dCgnJyxmYWxzZSk7fWVsc2V7dGhpcy5faW5saW5lU3R5bGUuYWxsUHJvcGVydGllcygpW3RoaXMub3JpZ2luYWxQcm9wZXJ0eURhdGEuaW5kZXhdLnNldFRleHQodGhpcy5vcmlnaW5hbFByb3BlcnR5RGF0YS5wcm9wZXJ0eVRleHQsZmFsc2UpO319CnRoaXMuZWRpdGluZ0VuZGVkKGVsZW1lbnQsY29udGV4dCk7dGhpcy51cGRhdGUoKTt9Cl9hcHBseVVzZXJJbnB1dChlbGVtZW50LHVzZXJJbnB1dCxwcmV2aW91c0NvbnRlbnQsY29udGV4dCxjb21taXRFZGl0b3Ipe2lmKCF0aGlzLl9pbmxpbmVTdHlsZSl7cmV0dXJuIHRoaXMuZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50LGNvbnRleHQpO30KaWYoY29tbWl0RWRpdG9yJiZ1c2VySW5wdXQ9PT1wcmV2aW91c0NvbnRlbnQpCnJldHVybiB0aGlzLmVkaXRpbmdDYW5jZWxsZWQoZWxlbWVudCxjb250ZXh0KTtpZihjb250ZXh0LmJveCE9PSdwb3NpdGlvbicmJighdXNlcklucHV0fHx1c2VySW5wdXQ9PT0nXHUyMDEyJykpCnVzZXJJbnB1dD0nMHB4JztlbHNlIGlmKGNvbnRleHQuYm94PT09J3Bvc2l0aW9uJyYmKCF1c2VySW5wdXR8fHVzZXJJbnB1dD09PSdcdTIwMTInKSkKdXNlcklucHV0PSdhdXRvJzt1c2VySW5wdXQ9dXNlcklucHV0LnRvTG93ZXJDYXNlKCk7aWYoL15cZCskLy50ZXN0KHVzZXJJbnB1dCkpCnVzZXJJbnB1dCs9J3B4Jztjb25zdCBzdHlsZVByb3BlcnR5PWNvbnRleHQuc3R5bGVQcm9wZXJ0eTtjb25zdCBjb21wdXRlZFN0eWxlPWNvbnRleHQuY29tcHV0ZWRTdHlsZTtpZihjb21wdXRlZFN0eWxlLmdldCgnYm94LXNpemluZycpPT09J2JvcmRlci1ib3gnJiYoc3R5bGVQcm9wZXJ0eT09PSd3aWR0aCd8fHN0eWxlUHJvcGVydHk9PT0naGVpZ2h0Jykpe2lmKCF1c2VySW5wdXQubWF0Y2goL3B4JC8pKXtDb21tb24uY29uc29sZS5lcnJvcignRm9yIGVsZW1lbnRzIHdpdGggYm94LXNpemluZzogYm9yZGVyLWJveCwgb25seSBhYnNvbHV0ZSBjb250ZW50IGFyZWEgZGltZW5zaW9ucyBjYW4gYmUgYXBwbGllZCcpO3JldHVybjt9CmNvbnN0IGJvcmRlckJveD10aGlzLl9nZXRCb3goY29tcHV0ZWRTdHlsZSwnYm9yZGVyJyk7Y29uc3QgcGFkZGluZ0JveD10aGlzLl9nZXRCb3goY29tcHV0ZWRTdHlsZSwncGFkZGluZycpO2xldCB1c2VyVmFsdWVQeD1OdW1iZXIodXNlcklucHV0LnJlcGxhY2UoL3B4JC8sJycpKTtpZihpc05hTih1c2VyVmFsdWVQeCkpCnJldHVybjtpZihzdHlsZVByb3BlcnR5PT09J3dpZHRoJykKdXNlclZhbHVlUHgrPWJvcmRlckJveC5sZWZ0K2JvcmRlckJveC5yaWdodCtwYWRkaW5nQm94LmxlZnQrcGFkZGluZ0JveC5yaWdodDtlbHNlCnVzZXJWYWx1ZVB4Kz1ib3JkZXJCb3gudG9wK2JvcmRlckJveC5ib3R0b20rcGFkZGluZ0JveC50b3ArcGFkZGluZ0JveC5ib3R0b207dXNlcklucHV0PXVzZXJWYWx1ZVB4KydweCc7fQp0aGlzLnByZXZpb3VzUHJvcGVydHlEYXRhQ2FuZGlkYXRlPW51bGw7Y29uc3QgYWxsUHJvcGVydGllcz10aGlzLl9pbmxpbmVTdHlsZS5hbGxQcm9wZXJ0aWVzKCk7Zm9yKGxldCBpPTA7aTxhbGxQcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3BlcnR5PWFsbFByb3BlcnRpZXNbaV07aWYocHJvcGVydHkubmFtZSE9PWNvbnRleHQuc3R5bGVQcm9wZXJ0eXx8IXByb3BlcnR5LmFjdGl2ZUluU3R5bGUoKSkKY29udGludWU7dGhpcy5wcmV2aW91c1Byb3BlcnR5RGF0YUNhbmRpZGF0ZT1wcm9wZXJ0eTtwcm9wZXJ0eS5zZXRWYWx1ZSh1c2VySW5wdXQsY29tbWl0RWRpdG9yLHRydWUsY2FsbGJhY2suYmluZCh0aGlzKSk7cmV0dXJuO30KdGhpcy5faW5saW5lU3R5bGUuYXBwZW5kUHJvcGVydHkoY29udGV4dC5zdHlsZVByb3BlcnR5LHVzZXJJbnB1dCxjYWxsYmFjay5iaW5kKHRoaXMpKTtmdW5jdGlvbiBjYWxsYmFjayhzdWNjZXNzKXtpZighc3VjY2VzcykKcmV0dXJuO2lmKCEoJ29yaWdpbmFsUHJvcGVydHlEYXRhJ2luIHRoaXMpKQp0aGlzLm9yaWdpbmFsUHJvcGVydHlEYXRhPXRoaXMucHJldmlvdXNQcm9wZXJ0eURhdGFDYW5kaWRhdGU7aWYodHlwZW9mIHRoaXMuX2hpZ2hsaWdodE1vZGUhPT0ndW5kZWZpbmVkJykKdGhpcy5ub2RlKCkuaGlnaGxpZ2h0KHRoaXMuX2hpZ2hsaWdodE1vZGUpO2lmKGNvbW1pdEVkaXRvcikKdGhpcy51cGRhdGUoKTt9fQpfZWRpdGluZ0NvbW1pdHRlZChlbGVtZW50LHVzZXJJbnB1dCxwcmV2aW91c0NvbnRlbnQsY29udGV4dCl7dGhpcy5lZGl0aW5nRW5kZWQoZWxlbWVudCxjb250ZXh0KTt0aGlzLl9hcHBseVVzZXJJbnB1dChlbGVtZW50LHVzZXJJbnB1dCxwcmV2aW91c0NvbnRlbnQsY29udGV4dCx0cnVlKTt9fTs7RWxlbWVudHMuUGxhdGZvcm1Gb250c1dpZGdldD1jbGFzcyBleHRlbmRzIFVJLlRocm90dGxlZFdpZGdldHtjb25zdHJ1Y3RvcihzaGFyZWRNb2RlbCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9wbGF0Zm9ybUZvbnRzV2lkZ2V0LmNzcycpO3RoaXMuX3NoYXJlZE1vZGVsPXNoYXJlZE1vZGVsO3RoaXMuX3NoYXJlZE1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoRWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsLkV2ZW50cy5Db21wdXRlZFN0eWxlQ2hhbmdlZCx0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLl9zZWN0aW9uVGl0bGU9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndGl0bGUnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BsYXRmb3JtLWZvbnRzJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWN0aW9uVGl0bGUpO3RoaXMuX3NlY3Rpb25UaXRsZS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1JlbmRlcmVkIEZvbnRzJyk7dGhpcy5fZm9udFN0YXRzU2VjdGlvbj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzdGF0cy1zZWN0aW9uJyk7fQpkb1VwZGF0ZSgpe2NvbnN0IGNzc01vZGVsPXRoaXMuX3NoYXJlZE1vZGVsLmNzc01vZGVsKCk7Y29uc3Qgbm9kZT10aGlzLl9zaGFyZWRNb2RlbC5ub2RlKCk7aWYoIW5vZGV8fCFjc3NNb2RlbCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBjc3NNb2RlbC5wbGF0Zm9ybUZvbnRzUHJvbWlzZShub2RlLmlkKS50aGVuKHRoaXMuX3JlZnJlc2hVSS5iaW5kKHRoaXMsbm9kZSkpO30KX3JlZnJlc2hVSShub2RlLHBsYXRmb3JtRm9udHMpe2lmKHRoaXMuX3NoYXJlZE1vZGVsLm5vZGUoKSE9PW5vZGUpCnJldHVybjt0aGlzLl9mb250U3RhdHNTZWN0aW9uLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgaXNFbXB0eVNlY3Rpb249IXBsYXRmb3JtRm9udHN8fCFwbGF0Zm9ybUZvbnRzLmxlbmd0aDt0aGlzLl9zZWN0aW9uVGl0bGUuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyxpc0VtcHR5U2VjdGlvbik7aWYoaXNFbXB0eVNlY3Rpb24pCnJldHVybjtwbGF0Zm9ybUZvbnRzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5nbHlwaENvdW50LWEuZ2x5cGhDb3VudDt9KTtmb3IobGV0IGk9MDtpPHBsYXRmb3JtRm9udHMubGVuZ3RoOysraSl7Y29uc3QgZm9udFN0YXRFbGVtZW50PXRoaXMuX2ZvbnRTdGF0c1NlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZvbnQtc3RhdHMtaXRlbScpO2NvbnN0IGZvbnROYW1lRWxlbWVudD1mb250U3RhdEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdmb250LW5hbWUnKTtmb250TmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9cGxhdGZvcm1Gb250c1tpXS5mYW1pbHlOYW1lO2NvbnN0IGZvbnREZWxpbWV0ZXJFbGVtZW50PWZvbnRTdGF0RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2ZvbnQtZGVsaW1ldGVyJyk7Zm9udERlbGltZXRlckVsZW1lbnQudGV4dENvbnRlbnQ9J1x1MjAxNCc7Y29uc3QgZm9udE9yaWdpbj1mb250U3RhdEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtmb250T3JpZ2luLnRleHRDb250ZW50PXBsYXRmb3JtRm9udHNbaV0uaXNDdXN0b21Gb250P0NvbW1vbi5VSVN0cmluZygnTmV0d29yayByZXNvdXJjZScpOkNvbW1vbi5VSVN0cmluZygnTG9jYWwgZmlsZScpO2NvbnN0IGZvbnRVc2FnZUVsZW1lbnQ9Zm9udFN0YXRFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnZm9udC11c2FnZScpO2NvbnN0IHVzYWdlPXBsYXRmb3JtRm9udHNbaV0uZ2x5cGhDb3VudDtmb250VXNhZ2VFbGVtZW50LnRleHRDb250ZW50PXVzYWdlPT09MT9Db21tb24uVUlTdHJpbmcoJyglZCBnbHlwaCknLHVzYWdlKTpDb21tb24uVUlTdHJpbmcoJyglZCBnbHlwaHMpJyx1c2FnZSk7fX19OztFbGVtZW50cy5Qcm9wZXJ0aWVzV2lkZ2V0PWNsYXNzIGV4dGVuZHMgVUkuVGhyb3R0bGVkV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9wcm9wZXJ0aWVzV2lkZ2V0LmNzcycpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRPTU1vZGVsLFNESy5ET01Nb2RlbC5FdmVudHMuQXR0ck1vZGlmaWVkLHRoaXMuX29uTm9kZUNoYW5nZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5ET01Nb2RlbCxTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJSZW1vdmVkLHRoaXMuX29uTm9kZUNoYW5nZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5ET01Nb2RlbCxTREsuRE9NTW9kZWwuRXZlbnRzLkNoYXJhY3RlckRhdGFNb2RpZmllZCx0aGlzLl9vbk5vZGVDaGFuZ2UsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRE9NTW9kZWwsU0RLLkRPTU1vZGVsLkV2ZW50cy5DaGlsZE5vZGVDb3VudFVwZGF0ZWQsdGhpcy5fb25Ob2RlQ2hhbmdlLHRoaXMpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkRPTU5vZGUsdGhpcy5fc2V0Tm9kZSx0aGlzKTt0aGlzLl9ub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTt0aGlzLnVwZGF0ZSgpO30KX3NldE5vZGUoZXZlbnQpe3RoaXMuX25vZGU9KGV2ZW50LmRhdGEpO3RoaXMudXBkYXRlKCk7fQpkb1VwZGF0ZSgpe2lmKHRoaXMuX2xhc3RSZXF1ZXN0ZWROb2RlKXt0aGlzLl9sYXN0UmVxdWVzdGVkTm9kZS5kb21Nb2RlbCgpLnJ1bnRpbWVNb2RlbCgpLnJlbGVhc2VPYmplY3RHcm91cChFbGVtZW50cy5Qcm9wZXJ0aWVzV2lkZ2V0Ll9vYmplY3RHcm91cE5hbWUpO2RlbGV0ZSB0aGlzLl9sYXN0UmVxdWVzdGVkTm9kZTt9CmlmKCF0aGlzLl9ub2RlKXt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5zZWN0aW9ucz1bXTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQp0aGlzLl9sYXN0UmVxdWVzdGVkTm9kZT10aGlzLl9ub2RlO3JldHVybiB0aGlzLl9ub2RlLnJlc29sdmVUb09iamVjdChFbGVtZW50cy5Qcm9wZXJ0aWVzV2lkZ2V0Ll9vYmplY3RHcm91cE5hbWUpLnRoZW4obm9kZVJlc29sdmVkLmJpbmQodGhpcykpO2Z1bmN0aW9uIG5vZGVSZXNvbHZlZChvYmplY3Qpe2lmKCFvYmplY3QpCnJldHVybjtmdW5jdGlvbiBwcm90b0xpc3QoKXtsZXQgcHJvdG89dGhpcztjb25zdCByZXN1bHQ9e19fcHJvdG9fXzpudWxsfTtsZXQgY291bnRlcj0xO3doaWxlKHByb3RvKXtyZXN1bHRbY291bnRlcisrXT1wcm90bztwcm90bz1wcm90by5fX3Byb3RvX187fQpyZXR1cm4gcmVzdWx0O30KY29uc3QgcHJvbWlzZT1vYmplY3QuY2FsbEZ1bmN0aW9uUHJvbWlzZShwcm90b0xpc3QpLnRoZW4obm9kZVByb3RvdHlwZXNSZWFkeS5iaW5kKHRoaXMpKTtvYmplY3QucmVsZWFzZSgpO3JldHVybiBwcm9taXNlO30KZnVuY3Rpb24gbm9kZVByb3RvdHlwZXNSZWFkeShyZXN1bHQpe2lmKCFyZXN1bHQub2JqZWN0fHxyZXN1bHQud2FzVGhyb3duKQpyZXR1cm47Y29uc3QgcHJvbWlzZT1yZXN1bHQub2JqZWN0LmdldE93blByb3BlcnRpZXNQcm9taXNlKGZhbHNlKS50aGVuKGZpbGxTZWN0aW9uLmJpbmQodGhpcykpO3Jlc3VsdC5vYmplY3QucmVsZWFzZSgpO3JldHVybiBwcm9taXNlO30KZnVuY3Rpb24gZmlsbFNlY3Rpb24ocmVzdWx0KXtpZighcmVzdWx0fHwhcmVzdWx0LnByb3BlcnRpZXMpCnJldHVybjtjb25zdCBwcm9wZXJ0aWVzPXJlc3VsdC5wcm9wZXJ0aWVzO2NvbnN0IGV4cGFuZGVkPVtdO2NvbnN0IHNlY3Rpb25zPXRoaXMuc2VjdGlvbnN8fFtdO2ZvcihsZXQgaT0wO2k8c2VjdGlvbnMubGVuZ3RoOysraSkKZXhwYW5kZWQucHVzaChzZWN0aW9uc1tpXS5leHBhbmRlZCk7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuc2VjdGlvbnM9W107Zm9yKGxldCBpPTA7aTxwcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2lmKCFwYXJzZUludChwcm9wZXJ0aWVzW2ldLm5hbWUsMTApKQpjb250aW51ZTtjb25zdCBwcm9wZXJ0eT1wcm9wZXJ0aWVzW2ldLnZhbHVlO2xldCB0aXRsZT1wcm9wZXJ0eS5kZXNjcmlwdGlvbjt0aXRsZT10aXRsZS5yZXBsYWNlKC9Qcm90b3R5cGUkLywnJyk7Y29uc3Qgc2VjdGlvbj1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24ocHJvcGVydHksdGl0bGUpO3NlY3Rpb24uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwcm9wZXJ0aWVzLXdpZGdldC1zZWN0aW9uJyk7dGhpcy5zZWN0aW9ucy5wdXNoKHNlY3Rpb24pO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VjdGlvbi5lbGVtZW50KTtpZihleHBhbmRlZFt0aGlzLnNlY3Rpb25zLmxlbmd0aC0xXSkKc2VjdGlvbi5leHBhbmQoKTtzZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRFeHBhbmRlZCx0aGlzLl9wcm9wZXJ0eUV4cGFuZGVkLHRoaXMpO319fQpfcHJvcGVydHlFeHBhbmRlZChldmVudCl7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5ET01Qcm9wZXJ0aWVzRXhwYW5kZWQpO2Zvcihjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpCnNlY3Rpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihVSS5UcmVlT3V0bGluZS5FdmVudHMuRWxlbWVudEV4cGFuZGVkLHRoaXMuX3Byb3BlcnR5RXhwYW5kZWQsdGhpcyk7fQpfb25Ob2RlQ2hhbmdlKGV2ZW50KXtpZighdGhpcy5fbm9kZSkKcmV0dXJuO2NvbnN0IGRhdGE9ZXZlbnQuZGF0YTtjb25zdCBub2RlPShkYXRhIGluc3RhbmNlb2YgU0RLLkRPTU5vZGU/ZGF0YTpkYXRhLm5vZGUpO2lmKHRoaXMuX25vZGUhPT1ub2RlKQpyZXR1cm47dGhpcy51cGRhdGUoKTt9fTtFbGVtZW50cy5Qcm9wZXJ0aWVzV2lkZ2V0Ll9vYmplY3RHcm91cE5hbWU9J3Byb3BlcnRpZXMtc2lkZWJhci1wYW5lJzs7RWxlbWVudHMuU3R5bGVQcm9wZXJ0eUhpZ2hsaWdodGVyPWNsYXNze2NvbnN0cnVjdG9yKHNzcCxjc3NQcm9wZXJ0eSl7dGhpcy5fc3R5bGVTaWRlYmFyUGFuZT1zc3A7dGhpcy5fY3NzUHJvcGVydHk9Y3NzUHJvcGVydHk7fQpwZXJmb3JtKCl7Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc3R5bGVTaWRlYmFyUGFuZS5hbGxTZWN0aW9ucygpKXtmb3IobGV0IHRyZWVFbGVtZW50PXNlY3Rpb24ucHJvcGVydGllc1RyZWVPdXRsaW5lLmZpcnN0Q2hpbGQoKTt0cmVlRWxlbWVudDt0cmVlRWxlbWVudD10cmVlRWxlbWVudC5uZXh0U2libGluZykKdHJlZUVsZW1lbnQub25wb3B1bGF0ZSgpO30KbGV0IGhpZ2hsaWdodFRyZWVFbGVtZW50PW51bGw7Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc3R5bGVTaWRlYmFyUGFuZS5hbGxTZWN0aW9ucygpKXtsZXQgdHJlZUVsZW1lbnQ9c2VjdGlvbi5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuZmlyc3RDaGlsZCgpO3doaWxlKHRyZWVFbGVtZW50JiYhaGlnaGxpZ2h0VHJlZUVsZW1lbnQpe2lmKHRyZWVFbGVtZW50LnByb3BlcnR5PT09dGhpcy5fY3NzUHJvcGVydHkpe2hpZ2hsaWdodFRyZWVFbGVtZW50PXRyZWVFbGVtZW50O2JyZWFrO30KdHJlZUVsZW1lbnQ9dHJlZUVsZW1lbnQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UsbnVsbCx0cnVlKTt9CmlmKGhpZ2hsaWdodFRyZWVFbGVtZW50KQpicmVhazt9CmlmKCFoaWdobGlnaHRUcmVlRWxlbWVudCkKcmV0dXJuO2hpZ2hsaWdodFRyZWVFbGVtZW50LnBhcmVudC5leHBhbmQoKTtoaWdobGlnaHRUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO2hpZ2hsaWdodFRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hbmltYXRlKFt7b2Zmc2V0OjAsYmFja2dyb3VuZENvbG9yOidyZ2JhKDI1NSwgMjU1LCAwLCAwLjIpJ30se29mZnNldDowLjEsYmFja2dyb3VuZENvbG9yOidyZ2JhKDI1NSwgMjU1LCAwLCAwLjcpJ30se29mZnNldDoxLGJhY2tncm91bmRDb2xvcjondHJhbnNwYXJlbnQnfV0se2R1cmF0aW9uOjIwMDAsZWFzaW5nOidjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSd9KTt9fTs7RWxlbWVudHMuU3R5bGVzU2lkZWJhclBhbmU9Y2xhc3MgZXh0ZW5kcyBFbGVtZW50cy5FbGVtZW50c1NpZGViYXJQYW5le2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLnNldE1pbmltdW1TaXplKDk2LDI2KTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2VsZW1lbnRzL3N0eWxlc1NpZGViYXJQYW5lLmNzcycpO3RoaXMuZWxlbWVudC50YWJJbmRleD0tMTtDb21tb24ubW9kdWxlU2V0dGluZygnY29sb3JGb3JtYXQnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTtDb21tb24ubW9kdWxlU2V0dGluZygndGV4dEVkaXRvckluZGVudCcpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMudXBkYXRlLmJpbmQodGhpcykpO3RoaXMuX2N1cnJlbnRUb29sYmFyUGFuZT1udWxsO3RoaXMuX2FuaW1hdGVkVG9vbGJhclBhbmU9bnVsbDt0aGlzLl9wZW5kaW5nV2lkZ2V0PW51bGw7dGhpcy5fcGVuZGluZ1dpZGdldFRvZ2dsZT1udWxsO3RoaXMuX3Rvb2xiYXJQYW5lRWxlbWVudD10aGlzLl9jcmVhdGVTdHlsZXNTaWRlYmFyVG9vbGJhcigpO3RoaXMuX25vTWF0Y2hlc0VsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZ3JheS1pbmZvLW1lc3NhZ2UgaGlkZGVuJyk7dGhpcy5fbm9NYXRjaGVzRWxlbWVudC50ZXh0Q29udGVudD1sc2BObyBtYXRjaGluZyBzZWxlY3RvciBvciBzdHlsZWA7dGhpcy5fc2VjdGlvbnNDb250YWluZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7VUkuQVJJQVV0aWxzLm1hcmtBc1RyZWUodGhpcy5fc2VjdGlvbnNDb250YWluZXIpO3RoaXMuX3NlY3Rpb25zQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX3NlY3Rpb25zQ29udGFpbmVyS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9zZWN0aW9uc0NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJyx0aGlzLl9zZWN0aW9uc0NvbnRhaW5lckZvY3VzQ2hhbmdlZC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9zZWN0aW9uc0NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsdGhpcy5fc2VjdGlvbnNDb250YWluZXJGb2N1c0NoYW5nZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlcj1uZXcgSW5saW5lRWRpdG9yLlN3YXRjaFBvcG92ZXJIZWxwZXIoKTt0aGlzLl9saW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKEVsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lLl9tYXhMaW5rTGVuZ3RoLHRydWUpO3RoaXMuX2RlY29yYXRvcj1udWxsO3RoaXMuX3VzZXJPcGVyYXRpb249ZmFsc2U7dGhpcy5faXNFZGl0aW5nU3R5bGU9ZmFsc2U7dGhpcy5fZmlsdGVyUmVnZXg9bnVsbDt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0eWxlcy1wYW5lJyk7dGhpcy5fc2VjdGlvbkJsb2Nrcz1bXTtFbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5faW5zdGFuY2U9dGhpcztVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLHRoaXMuZm9yY2VVcGRhdGUsdGhpcyk7dGhpcy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb3B5Jyx0aGlzLl9jbGlwYm9hcmRDb3B5LmJpbmQodGhpcykpO3RoaXMuX3Jlc2l6ZVRocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcigxMDApO30Kc3dhdGNoUG9wb3ZlckhlbHBlcigpe3JldHVybiB0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyO30Kc2V0VXNlck9wZXJhdGlvbih1c2VyT3BlcmF0aW9uKXt0aGlzLl91c2VyT3BlcmF0aW9uPXVzZXJPcGVyYXRpb247fQpzdGF0aWMgY3JlYXRlRXhjbGFtYXRpb25NYXJrKHByb3BlcnR5KXtjb25zdCBleGNsYW1hdGlvbkVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnbGFiZWwnLCdkdC1pY29uLWxhYmVsJyk7ZXhjbGFtYXRpb25FbGVtZW50LmNsYXNzTmFtZT0nZXhjbGFtYXRpb24tbWFyayc7aWYoIUVsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lLmlnbm9yZUVycm9yc0ZvclByb3BlcnR5KHByb3BlcnR5KSkKZXhjbGFtYXRpb25FbGVtZW50LnR5cGU9J3NtYWxsaWNvbi13YXJuaW5nJztleGNsYW1hdGlvbkVsZW1lbnQudGl0bGU9U0RLLmNzc01ldGFkYXRhKCkuaXNDU1NQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk/Q29tbW9uLlVJU3RyaW5nKCdJbnZhbGlkIHByb3BlcnR5IHZhbHVlJyk6Q29tbW9uLlVJU3RyaW5nKCdVbmtub3duIHByb3BlcnR5IG5hbWUnKTtyZXR1cm4gZXhjbGFtYXRpb25FbGVtZW50O30Kc3RhdGljIGlnbm9yZUVycm9yc0ZvclByb3BlcnR5KHByb3BlcnR5KXtmdW5jdGlvbiBoYXNVbmtub3duVmVuZG9yUHJlZml4KHN0cmluZyl7cmV0dXJuIXN0cmluZy5zdGFydHNXaXRoKCctd2Via2l0LScpJiYvXlstX11bXHdcZF0rLVx3Ly50ZXN0KHN0cmluZyk7fQpjb25zdCBuYW1lPXByb3BlcnR5Lm5hbWUudG9Mb3dlckNhc2UoKTtpZihuYW1lLmNoYXJBdCgwKT09PSdfJykKcmV0dXJuIHRydWU7aWYobmFtZT09PSdmaWx0ZXInKQpyZXR1cm4gdHJ1ZTtpZihuYW1lLnN0YXJ0c1dpdGgoJ3Njcm9sbGJhci0nKSkKcmV0dXJuIHRydWU7aWYoaGFzVW5rbm93blZlbmRvclByZWZpeChuYW1lKSkKcmV0dXJuIHRydWU7Y29uc3QgdmFsdWU9cHJvcGVydHkudmFsdWUudG9Mb3dlckNhc2UoKTtpZih2YWx1ZS5lbmRzV2l0aCgnXFw5JykpCnJldHVybiB0cnVlO2lmKGhhc1Vua25vd25WZW5kb3JQcmVmaXgodmFsdWUpKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2U7fQpzdGF0aWMgY3JlYXRlUHJvcGVydHlGaWx0ZXJFbGVtZW50KHBsYWNlaG9sZGVyLGNvbnRhaW5lcixmaWx0ZXJDYWxsYmFjayl7Y29uc3QgaW5wdXQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnaW5wdXQnKTtpbnB1dC5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjtmdW5jdGlvbiBzZWFyY2hIYW5kbGVyKCl7Y29uc3QgcmVnZXg9aW5wdXQudmFsdWU/bmV3IFJlZ0V4cChpbnB1dC52YWx1ZS5lc2NhcGVGb3JSZWdFeHAoKSwnaScpOm51bGw7ZmlsdGVyQ2FsbGJhY2socmVnZXgpO30KaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHNlYXJjaEhhbmRsZXIsZmFsc2UpO2Z1bmN0aW9uIGtleWRvd25IYW5kbGVyKGV2ZW50KXtpZihldmVudC5rZXkhPT0nRXNjYXBlJ3x8IWlucHV0LnZhbHVlKQpyZXR1cm47ZXZlbnQuY29uc3VtZSh0cnVlKTtpbnB1dC52YWx1ZT0nJztzZWFyY2hIYW5kbGVyKCk7fQppbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxrZXlkb3duSGFuZGxlcixmYWxzZSk7aW5wdXQuc2V0RmlsdGVyVmFsdWU9c2V0RmlsdGVyVmFsdWU7ZnVuY3Rpb24gc2V0RmlsdGVyVmFsdWUodmFsdWUpe2lucHV0LnZhbHVlPXZhbHVlO2lucHV0LmZvY3VzKCk7c2VhcmNoSGFuZGxlcigpO30KcmV0dXJuIGlucHV0O30KcmV2ZWFsUHJvcGVydHkoY3NzUHJvcGVydHkpe3RoaXMuX2RlY29yYXRvcj1uZXcgRWxlbWVudHMuU3R5bGVQcm9wZXJ0eUhpZ2hsaWdodGVyKHRoaXMsY3NzUHJvcGVydHkpO3RoaXMuX2RlY29yYXRvci5wZXJmb3JtKCk7dGhpcy51cGRhdGUoKTt9CmZvcmNlVXBkYXRlKCl7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5oaWRlKCk7dGhpcy5fcmVzZXRDYWNoZSgpO3RoaXMudXBkYXRlKCk7fQpfc2VjdGlvbnNDb250YWluZXJLZXlEb3duKGV2ZW50KXtjb25zdCBhY3RpdmVFbGVtZW50PXRoaXMuX3NlY3Rpb25zQ29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKTtpZighYWN0aXZlRWxlbWVudCkKcmV0dXJuO2NvbnN0IHNlY3Rpb249YWN0aXZlRWxlbWVudC5fc2VjdGlvbjtpZighc2VjdGlvbikKcmV0dXJuO3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6Y2FzZSdBcnJvd0xlZnQnOmNvbnN0IHNlY3Rpb25Ub0ZvY3VzPXNlY3Rpb24ucHJldmlvdXNTaWJsaW5nKCl8fHNlY3Rpb24ubGFzdFNpYmxpbmcoKTtzZWN0aW9uVG9Gb2N1cy5lbGVtZW50LmZvY3VzKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTticmVhaztjYXNlJ0Fycm93RG93bic6Y2FzZSdBcnJvd1JpZ2h0Jzp7Y29uc3Qgc2VjdGlvblRvRm9jdXM9c2VjdGlvbi5uZXh0U2libGluZygpfHxzZWN0aW9uLmZpcnN0U2libGluZygpO3NlY3Rpb25Ub0ZvY3VzLmVsZW1lbnQuZm9jdXMoKTtldmVudC5jb25zdW1lKHRydWUpO2JyZWFrO30KY2FzZSdIb21lJzpzZWN0aW9uLmZpcnN0U2libGluZygpLmVsZW1lbnQuZm9jdXMoKTtldmVudC5jb25zdW1lKHRydWUpO2JyZWFrO2Nhc2UnRW5kJzpzZWN0aW9uLmxhc3RTaWJsaW5nKCkuZWxlbWVudC5mb2N1cygpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7YnJlYWs7fX0KX3NlY3Rpb25zQ29udGFpbmVyRm9jdXNDaGFuZ2VkKCl7aWYodGhpcy5fc2VjdGlvbkJsb2Nrc1swXSYmdGhpcy5fc2VjdGlvbkJsb2Nrc1swXS5zZWN0aW9uc1swXSkKdGhpcy5fc2VjdGlvbkJsb2Nrc1swXS5zZWN0aW9uc1swXS5lbGVtZW50LnRhYkluZGV4PXRoaXMuX3NlY3Rpb25zQ29udGFpbmVyLmhhc0ZvY3VzKCk/LTE6MDt9Cl9vbkFkZEJ1dHRvbkxvbmdDbGljayhldmVudCl7Y29uc3QgY3NzTW9kZWw9dGhpcy5jc3NNb2RlbCgpO2lmKCFjc3NNb2RlbCkKcmV0dXJuO2NvbnN0IGhlYWRlcnM9Y3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlcnMoKS5maWx0ZXIoc3R5bGVTaGVldFJlc291cmNlSGVhZGVyKTtjb25zdCBjb250ZXh0TWVudURlc2NyaXB0b3JzPVtdO2ZvcihsZXQgaT0wO2k8aGVhZGVycy5sZW5ndGg7KytpKXtjb25zdCBoZWFkZXI9aGVhZGVyc1tpXTtjb25zdCBoYW5kbGVyPXRoaXMuX2NyZWF0ZU5ld1J1bGVJblN0eWxlU2hlZXQuYmluZCh0aGlzLGhlYWRlcik7Y29udGV4dE1lbnVEZXNjcmlwdG9ycy5wdXNoKHt0ZXh0OkJpbmRpbmdzLmRpc3BsYXlOYW1lRm9yVVJMKGhlYWRlci5yZXNvdXJjZVVSTCgpKSxoYW5kbGVyOmhhbmRsZXJ9KTt9CmNvbnRleHRNZW51RGVzY3JpcHRvcnMuc29ydChjb21wYXJlRGVzY3JpcHRvcnMpO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Zm9yKGxldCBpPTA7aTxjb250ZXh0TWVudURlc2NyaXB0b3JzLmxlbmd0aDsrK2kpe2NvbnN0IGRlc2NyaXB0b3I9Y29udGV4dE1lbnVEZXNjcmlwdG9yc1tpXTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oZGVzY3JpcHRvci50ZXh0LGRlc2NyaXB0b3IuaGFuZGxlcik7fQpjb250ZXh0TWVudS5mb290ZXJTZWN0aW9uKCkuYXBwZW5kSXRlbSgnaW5zcGVjdG9yLXN0eWxlc2hlZXQnLHRoaXMuX2NyZWF0ZU5ld1J1bGVJblZpYUluc3BlY3RvclN0eWxlU2hlZXQuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuc2hvdygpO2Z1bmN0aW9uIGNvbXBhcmVEZXNjcmlwdG9ycyhkZXNjcmlwdG9yMSxkZXNjcmlwdG9yMil7cmV0dXJuIFN0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yKGRlc2NyaXB0b3IxLnRleHQsZGVzY3JpcHRvcjIudGV4dCk7fQpmdW5jdGlvbiBzdHlsZVNoZWV0UmVzb3VyY2VIZWFkZXIoaGVhZGVyKXtyZXR1cm4haGVhZGVyLmlzVmlhSW5zcGVjdG9yKCkmJiFoZWFkZXIuaXNJbmxpbmUmJiEhaGVhZGVyLnJlc291cmNlVVJMKCk7fX0KX29uRmlsdGVyQ2hhbmdlZChyZWdleCl7dGhpcy5fZmlsdGVyUmVnZXg9cmVnZXg7dGhpcy5fdXBkYXRlRmlsdGVyKCk7fQpfcmVmcmVzaFVwZGF0ZShlZGl0ZWRTZWN0aW9uLGVkaXRlZFRyZWVFbGVtZW50KXtpZihlZGl0ZWRUcmVlRWxlbWVudCl7Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5hbGxTZWN0aW9ucygpKXtpZihzZWN0aW9uLmlzQmxhbmspCmNvbnRpbnVlO3NlY3Rpb24uX3VwZGF0ZVZhckZ1bmN0aW9ucyhlZGl0ZWRUcmVlRWxlbWVudCk7fX0KaWYodGhpcy5faXNFZGl0aW5nU3R5bGUpCnJldHVybjtjb25zdCBub2RlPXRoaXMubm9kZSgpO2lmKCFub2RlKQpyZXR1cm47Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5hbGxTZWN0aW9ucygpKXtpZihzZWN0aW9uLmlzQmxhbmspCmNvbnRpbnVlO3NlY3Rpb24udXBkYXRlKHNlY3Rpb249PT1lZGl0ZWRTZWN0aW9uKTt9CmlmKHRoaXMuX2ZpbHRlclJlZ2V4KQp0aGlzLl91cGRhdGVGaWx0ZXIoKTt0aGlzLl9ub2RlU3R5bGVzVXBkYXRlZEZvclRlc3Qobm9kZSxmYWxzZSk7fQpkb1VwZGF0ZSgpe3JldHVybiB0aGlzLl9mZXRjaE1hdGNoZWRDYXNjYWRlKCkudGhlbih0aGlzLl9pbm5lclJlYnVpbGRVcGRhdGUuYmluZCh0aGlzKSk7fQpvblJlc2l6ZSgpe3RoaXMuX3Jlc2l6ZVRocm90dGxlci5zY2hlZHVsZSh0aGlzLl9pbm5lclJlc2l6ZS5iaW5kKHRoaXMpKTt9Cl9pbm5lclJlc2l6ZSgpe2NvbnN0IHdpZHRoPXRoaXMuY29udGVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgrJ3B4Jzt0aGlzLmFsbFNlY3Rpb25zKCkuZm9yRWFjaChzZWN0aW9uPT5zZWN0aW9uLnByb3BlcnRpZXNUcmVlT3V0bGluZS5lbGVtZW50LnN0eWxlLndpZHRoPXdpZHRoKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpfcmVzZXRDYWNoZSgpe2lmKHRoaXMuY3NzTW9kZWwoKSkKdGhpcy5jc3NNb2RlbCgpLmRpc2NhcmRDYWNoZWRNYXRjaGVkQ2FzY2FkZSgpO30KX2ZldGNoTWF0Y2hlZENhc2NhZGUoKXtjb25zdCBub2RlPXRoaXMubm9kZSgpO2lmKCFub2RlfHwhdGhpcy5jc3NNb2RlbCgpKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7cmV0dXJuIHRoaXMuY3NzTW9kZWwoKS5jYWNoZWRNYXRjaGVkQ2FzY2FkZUZvck5vZGUobm9kZSkudGhlbih2YWxpZGF0ZVN0eWxlcy5iaW5kKHRoaXMpKTtmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlcyhtYXRjaGVkU3R5bGVzKXtyZXR1cm4gbWF0Y2hlZFN0eWxlcyYmbWF0Y2hlZFN0eWxlcy5ub2RlKCk9PT10aGlzLm5vZGUoKT9tYXRjaGVkU3R5bGVzOm51bGw7fX0Kc2V0RWRpdGluZ1N0eWxlKGVkaXRpbmcpe2lmKHRoaXMuX2lzRWRpdGluZ1N0eWxlPT09ZWRpdGluZykKcmV0dXJuO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtZWRpdGluZy1zdHlsZScsZWRpdGluZyk7dGhpcy5faXNFZGl0aW5nU3R5bGU9ZWRpdGluZzt9Cm9uQ1NTTW9kZWxDaGFuZ2VkKGV2ZW50KXtjb25zdCBlZGl0PWV2ZW50JiZldmVudC5kYXRhPyhldmVudC5kYXRhLmVkaXQpOm51bGw7aWYoZWRpdCl7Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5hbGxTZWN0aW9ucygpKQpzZWN0aW9uLl9zdHlsZVNoZWV0RWRpdGVkKGVkaXQpO3JldHVybjt9CmlmKHRoaXMuX3VzZXJPcGVyYXRpb258fHRoaXMuX2lzRWRpdGluZ1N0eWxlKQpyZXR1cm47dGhpcy5fcmVzZXRDYWNoZSgpO3RoaXMudXBkYXRlKCk7fQpfZm9jdXNlZFNlY3Rpb25JbmRleCgpe2xldCBpbmRleD0wO2Zvcihjb25zdCBibG9jayBvZiB0aGlzLl9zZWN0aW9uQmxvY2tzKXtmb3IoY29uc3Qgc2VjdGlvbiBvZiBibG9jay5zZWN0aW9ucyl7aWYoc2VjdGlvbi5lbGVtZW50Lmhhc0ZvY3VzKCkpCnJldHVybiBpbmRleDtpbmRleCsrO319CnJldHVybi0xO30KYXN5bmMgX2lubmVyUmVidWlsZFVwZGF0ZShtYXRjaGVkU3R5bGVzKXtjb25zdCBmb2N1c2VkSW5kZXg9dGhpcy5fZm9jdXNlZFNlY3Rpb25JbmRleCgpO3RoaXMuX2xpbmtpZmllci5yZXNldCgpO3RoaXMuX3NlY3Rpb25zQ29udGFpbmVyLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fc2VjdGlvbkJsb2Nrcz1bXTtjb25zdCBub2RlPXRoaXMubm9kZSgpO2lmKCFtYXRjaGVkU3R5bGVzfHwhbm9kZSl7dGhpcy5fbm9NYXRjaGVzRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtyZXR1cm47fQp0aGlzLl9zZWN0aW9uQmxvY2tzPWF3YWl0IHRoaXMuX3JlYnVpbGRTZWN0aW9uc0Zvck1hdGNoZWRTdHlsZVJ1bGVzKChtYXRjaGVkU3R5bGVzKSk7bGV0IHBzZXVkb1R5cGVzPVtdO2NvbnN0IGtleXM9bWF0Y2hlZFN0eWxlcy5wc2V1ZG9UeXBlcygpO2lmKGtleXMuZGVsZXRlKFByb3RvY29sLkRPTS5Qc2V1ZG9UeXBlLkJlZm9yZSkpCnBzZXVkb1R5cGVzLnB1c2goUHJvdG9jb2wuRE9NLlBzZXVkb1R5cGUuQmVmb3JlKTtwc2V1ZG9UeXBlcz1wc2V1ZG9UeXBlcy5jb25jYXQoa2V5cy52YWx1ZXNBcnJheSgpLnNvcnQoKSk7Zm9yKGNvbnN0IHBzZXVkb1R5cGUgb2YgcHNldWRvVHlwZXMpe2NvbnN0IGJsb2NrPUVsZW1lbnRzLlNlY3Rpb25CbG9jay5jcmVhdGVQc2V1ZG9UeXBlQmxvY2socHNldWRvVHlwZSk7Zm9yKGNvbnN0IHN0eWxlIG9mIG1hdGNoZWRTdHlsZXMucHNldWRvU3R5bGVzKHBzZXVkb1R5cGUpKXtjb25zdCBzZWN0aW9uPW5ldyBFbGVtZW50cy5TdHlsZVByb3BlcnRpZXNTZWN0aW9uKHRoaXMsbWF0Y2hlZFN0eWxlcyxzdHlsZSk7YmxvY2suc2VjdGlvbnMucHVzaChzZWN0aW9uKTt9CnRoaXMuX3NlY3Rpb25CbG9ja3MucHVzaChibG9jayk7fQpmb3IoY29uc3Qga2V5ZnJhbWVzUnVsZSBvZiBtYXRjaGVkU3R5bGVzLmtleWZyYW1lcygpKXtjb25zdCBibG9jaz1FbGVtZW50cy5TZWN0aW9uQmxvY2suY3JlYXRlS2V5ZnJhbWVzQmxvY2soa2V5ZnJhbWVzUnVsZS5uYW1lKCkudGV4dCk7Zm9yKGNvbnN0IGtleWZyYW1lIG9mIGtleWZyYW1lc1J1bGUua2V5ZnJhbWVzKCkpCmJsb2NrLnNlY3Rpb25zLnB1c2gobmV3IEVsZW1lbnRzLktleWZyYW1lUHJvcGVydGllc1NlY3Rpb24odGhpcyxtYXRjaGVkU3R5bGVzLGtleWZyYW1lLnN0eWxlKSk7dGhpcy5fc2VjdGlvbkJsb2Nrcy5wdXNoKGJsb2NrKTt9CmxldCBpbmRleD0wO2Zvcihjb25zdCBibG9jayBvZiB0aGlzLl9zZWN0aW9uQmxvY2tzKXtjb25zdCB0aXRsZUVsZW1lbnQ9YmxvY2sudGl0bGVFbGVtZW50KCk7aWYodGl0bGVFbGVtZW50KQp0aGlzLl9zZWN0aW9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO2Zvcihjb25zdCBzZWN0aW9uIG9mIGJsb2NrLnNlY3Rpb25zKXt0aGlzLl9zZWN0aW9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChzZWN0aW9uLmVsZW1lbnQpO2lmKGluZGV4PT09Zm9jdXNlZEluZGV4KQpzZWN0aW9uLmVsZW1lbnQuZm9jdXMoKTtpbmRleCsrO319CmlmKGZvY3VzZWRJbmRleD49aW5kZXgpCnRoaXMuX3NlY3Rpb25CbG9ja3NbMF0uc2VjdGlvbnNbMF0uZWxlbWVudC5mb2N1cygpO3RoaXMuX3NlY3Rpb25zQ29udGFpbmVyRm9jdXNDaGFuZ2VkKCk7aWYodGhpcy5fZmlsdGVyUmVnZXgpCnRoaXMuX3VwZGF0ZUZpbHRlcigpO2Vsc2UKdGhpcy5fbm9NYXRjaGVzRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLHRoaXMuX3NlY3Rpb25CbG9ja3MubGVuZ3RoPjApO3RoaXMuX25vZGVTdHlsZXNVcGRhdGVkRm9yVGVzdCgobm9kZSksdHJ1ZSk7aWYodGhpcy5fZGVjb3JhdG9yKXt0aGlzLl9kZWNvcmF0b3IucGVyZm9ybSgpO3RoaXMuX2RlY29yYXRvcj1udWxsO319Cl9ub2RlU3R5bGVzVXBkYXRlZEZvclRlc3Qobm9kZSxyZWJ1aWxkKXt9CmFzeW5jIF9yZWJ1aWxkU2VjdGlvbnNGb3JNYXRjaGVkU3R5bGVSdWxlcyhtYXRjaGVkU3R5bGVzKXtjb25zdCBibG9ja3M9W25ldyBFbGVtZW50cy5TZWN0aW9uQmxvY2sobnVsbCldO2xldCBsYXN0UGFyZW50Tm9kZT1udWxsO2Zvcihjb25zdCBzdHlsZSBvZiBtYXRjaGVkU3R5bGVzLm5vZGVTdHlsZXMoKSl7Y29uc3QgcGFyZW50Tm9kZT1tYXRjaGVkU3R5bGVzLmlzSW5oZXJpdGVkKHN0eWxlKT9tYXRjaGVkU3R5bGVzLm5vZGVGb3JTdHlsZShzdHlsZSk6bnVsbDtpZihwYXJlbnROb2RlJiZwYXJlbnROb2RlIT09bGFzdFBhcmVudE5vZGUpe2xhc3RQYXJlbnROb2RlPXBhcmVudE5vZGU7Y29uc3QgYmxvY2s9YXdhaXQgRWxlbWVudHMuU2VjdGlvbkJsb2NrLl9jcmVhdGVJbmhlcml0ZWROb2RlQmxvY2sobGFzdFBhcmVudE5vZGUpO2Jsb2Nrcy5wdXNoKGJsb2NrKTt9CmNvbnN0IHNlY3Rpb249bmV3IEVsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24odGhpcyxtYXRjaGVkU3R5bGVzLHN0eWxlKTtibG9ja3MucGVla0xhc3QoKS5zZWN0aW9ucy5wdXNoKHNlY3Rpb24pO30KcmV0dXJuIGJsb2Nrczt9CmFzeW5jIF9jcmVhdGVOZXdSdWxlSW5WaWFJbnNwZWN0b3JTdHlsZVNoZWV0KCl7Y29uc3QgY3NzTW9kZWw9dGhpcy5jc3NNb2RlbCgpO2NvbnN0IG5vZGU9dGhpcy5ub2RlKCk7aWYoIWNzc01vZGVsfHwhbm9kZSkKcmV0dXJuO3RoaXMuc2V0VXNlck9wZXJhdGlvbih0cnVlKTtjb25zdCBzdHlsZVNoZWV0SGVhZGVyPWF3YWl0IGNzc01vZGVsLnJlcXVlc3RWaWFJbnNwZWN0b3JTdHlsZXNoZWV0KChub2RlKSk7dGhpcy5zZXRVc2VyT3BlcmF0aW9uKGZhbHNlKTthd2FpdCB0aGlzLl9jcmVhdGVOZXdSdWxlSW5TdHlsZVNoZWV0KHN0eWxlU2hlZXRIZWFkZXIpO30KYXN5bmMgX2NyZWF0ZU5ld1J1bGVJblN0eWxlU2hlZXQoc3R5bGVTaGVldEhlYWRlcil7aWYoIXN0eWxlU2hlZXRIZWFkZXIpCnJldHVybjtjb25zdCB0ZXh0PWF3YWl0IHN0eWxlU2hlZXRIZWFkZXIucmVxdWVzdENvbnRlbnQoKXx8Jyc7Y29uc3QgbGluZXM9dGV4dC5zcGxpdCgnXG4nKTtjb25zdCByYW5nZT1UZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihsaW5lcy5sZW5ndGgtMSxsaW5lc1tsaW5lcy5sZW5ndGgtMV0ubGVuZ3RoKTt0aGlzLl9hZGRCbGFua1NlY3Rpb24odGhpcy5fc2VjdGlvbkJsb2Nrc1swXS5zZWN0aW9uc1swXSxzdHlsZVNoZWV0SGVhZGVyLmlkLHJhbmdlKTt9Cl9hZGRCbGFua1NlY3Rpb24oaW5zZXJ0QWZ0ZXJTZWN0aW9uLHN0eWxlU2hlZXRJZCxydWxlTG9jYXRpb24pe2NvbnN0IG5vZGU9dGhpcy5ub2RlKCk7Y29uc3QgYmxhbmtTZWN0aW9uPW5ldyBFbGVtZW50cy5CbGFua1N0eWxlUHJvcGVydGllc1NlY3Rpb24odGhpcyxpbnNlcnRBZnRlclNlY3Rpb24uX21hdGNoZWRTdHlsZXMsbm9kZT9ub2RlLnNpbXBsZVNlbGVjdG9yKCk6Jycsc3R5bGVTaGVldElkLHJ1bGVMb2NhdGlvbixpbnNlcnRBZnRlclNlY3Rpb24uX3N0eWxlKTt0aGlzLl9zZWN0aW9uc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoYmxhbmtTZWN0aW9uLmVsZW1lbnQsaW5zZXJ0QWZ0ZXJTZWN0aW9uLmVsZW1lbnQubmV4dFNpYmxpbmcpO2Zvcihjb25zdCBibG9jayBvZiB0aGlzLl9zZWN0aW9uQmxvY2tzKXtjb25zdCBpbmRleD1ibG9jay5zZWN0aW9ucy5pbmRleE9mKGluc2VydEFmdGVyU2VjdGlvbik7aWYoaW5kZXg9PT0tMSkKY29udGludWU7YmxvY2suc2VjdGlvbnMuc3BsaWNlKGluZGV4KzEsMCxibGFua1NlY3Rpb24pO2JsYW5rU2VjdGlvbi5zdGFydEVkaXRpbmdTZWxlY3RvcigpO319CnJlbW92ZVNlY3Rpb24oc2VjdGlvbil7Zm9yKGNvbnN0IGJsb2NrIG9mIHRoaXMuX3NlY3Rpb25CbG9ja3Mpe2NvbnN0IGluZGV4PWJsb2NrLnNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvbik7aWYoaW5kZXg9PT0tMSkKY29udGludWU7YmxvY2suc2VjdGlvbnMuc3BsaWNlKGluZGV4LDEpO3NlY3Rpb24uZWxlbWVudC5yZW1vdmUoKTt9fQpmaWx0ZXJSZWdleCgpe3JldHVybiB0aGlzLl9maWx0ZXJSZWdleDt9Cl91cGRhdGVGaWx0ZXIoKXtsZXQgaGFzQW55VmlzaWJsZUJsb2NrPWZhbHNlO2Zvcihjb25zdCBibG9jayBvZiB0aGlzLl9zZWN0aW9uQmxvY2tzKQpoYXNBbnlWaXNpYmxlQmxvY2t8PWJsb2NrLnVwZGF0ZUZpbHRlcigpO3RoaXMuX25vTWF0Y2hlc0VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyxoYXNBbnlWaXNpYmxlQmxvY2spO30Kd2lsbEhpZGUoKXt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLmhpZGUoKTtzdXBlci53aWxsSGlkZSgpO30KYWxsU2VjdGlvbnMoKXtsZXQgc2VjdGlvbnM9W107Zm9yKGNvbnN0IGJsb2NrIG9mIHRoaXMuX3NlY3Rpb25CbG9ja3MpCnNlY3Rpb25zPXNlY3Rpb25zLmNvbmNhdChibG9jay5zZWN0aW9ucyk7cmV0dXJuIHNlY3Rpb25zO30KX2NsaXBib2FyZENvcHkoZXZlbnQpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uU3R5bGVSdWxlQ29waWVkKTt9Cl9jcmVhdGVTdHlsZXNTaWRlYmFyVG9vbGJhcigpe2NvbnN0IGNvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzdHlsZXMtc2lkZWJhci1wYW5lLXRvb2xiYXItY29udGFpbmVyJyk7Y29uc3QgaGJveD1jb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hib3ggc3R5bGVzLXNpZGViYXItcGFuZS10b29sYmFyJyk7Y29uc3QgZmlsdGVyQ29udGFpbmVyRWxlbWVudD1oYm94LmNyZWF0ZUNoaWxkKCdkaXYnLCdzdHlsZXMtc2lkZWJhci1wYW5lLWZpbHRlci1ib3gnKTtjb25zdCBmaWx0ZXJJbnB1dD1FbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5jcmVhdGVQcm9wZXJ0eUZpbHRlckVsZW1lbnQobHNgRmlsdGVyYCxoYm94LHRoaXMuX29uRmlsdGVyQ2hhbmdlZC5iaW5kKHRoaXMpKTtVSS5BUklBVXRpbHMuc2V0QWNjZXNzaWJsZU5hbWUoZmlsdGVySW5wdXQsQ29tbW9uLlVJU3RyaW5nKCdGaWx0ZXIgU3R5bGVzJykpO2ZpbHRlckNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoZmlsdGVySW5wdXQpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3N0eWxlcy1wYW5lLXRvb2xiYXInLGhib3gpO3Rvb2xiYXIubWFrZVRvZ2dsZWRHcmF5KCk7dG9vbGJhci5hcHBlbmRMb2NhdGlvbkl0ZW1zKCdzdHlsZXMtc2lkZWJhcnBhbmUtdG9vbGJhcicpO2NvbnN0IHRvb2xiYXJQYW5lQ29udGFpbmVyPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc3R5bGVzLXNpZGViYXItdG9vbGJhci1wYW5lLWNvbnRhaW5lcicpO2NvbnN0IHRvb2xiYXJQYW5lQ29udGVudD10b29sYmFyUGFuZUNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnc3R5bGVzLXNpZGViYXItdG9vbGJhci1wYW5lJyk7cmV0dXJuIHRvb2xiYXJQYW5lQ29udGVudDt9CnNob3dUb29sYmFyUGFuZSh3aWRnZXQsdG9nZ2xlKXtpZih0aGlzLl9wZW5kaW5nV2lkZ2V0VG9nZ2xlKQp0aGlzLl9wZW5kaW5nV2lkZ2V0VG9nZ2xlLnNldFRvZ2dsZWQoZmFsc2UpO3RoaXMuX3BlbmRpbmdXaWRnZXRUb2dnbGU9dG9nZ2xlO2lmKHRoaXMuX2FuaW1hdGVkVG9vbGJhclBhbmUpCnRoaXMuX3BlbmRpbmdXaWRnZXQ9d2lkZ2V0O2Vsc2UKdGhpcy5fc3RhcnRUb29sYmFyUGFuZUFuaW1hdGlvbih3aWRnZXQpO2lmKHdpZGdldCYmdG9nZ2xlKQp0b2dnbGUuc2V0VG9nZ2xlZCh0cnVlKTt9Cl9zdGFydFRvb2xiYXJQYW5lQW5pbWF0aW9uKHdpZGdldCl7aWYod2lkZ2V0PT09dGhpcy5fY3VycmVudFRvb2xiYXJQYW5lKQpyZXR1cm47aWYod2lkZ2V0JiZ0aGlzLl9jdXJyZW50VG9vbGJhclBhbmUpe3RoaXMuX2N1cnJlbnRUb29sYmFyUGFuZS5kZXRhY2goKTt3aWRnZXQuc2hvdyh0aGlzLl90b29sYmFyUGFuZUVsZW1lbnQpO3RoaXMuX2N1cnJlbnRUb29sYmFyUGFuZT13aWRnZXQ7dGhpcy5fY3VycmVudFRvb2xiYXJQYW5lLmZvY3VzKCk7cmV0dXJuO30KdGhpcy5fYW5pbWF0ZWRUb29sYmFyUGFuZT13aWRnZXQ7aWYodGhpcy5fY3VycmVudFRvb2xiYXJQYW5lKQp0aGlzLl90b29sYmFyUGFuZUVsZW1lbnQuc3R5bGUuYW5pbWF0aW9uTmFtZT0nc3R5bGVzLWVsZW1lbnQtc3RhdGUtcGFuZS1zbGlkZW91dCc7ZWxzZSBpZih3aWRnZXQpCnRoaXMuX3Rvb2xiYXJQYW5lRWxlbWVudC5zdHlsZS5hbmltYXRpb25OYW1lPSdzdHlsZXMtZWxlbWVudC1zdGF0ZS1wYW5lLXNsaWRlaW4nO2lmKHdpZGdldCkKd2lkZ2V0LnNob3codGhpcy5fdG9vbGJhclBhbmVFbGVtZW50KTtjb25zdCBsaXN0ZW5lcj1vbkFuaW1hdGlvbkVuZC5iaW5kKHRoaXMpO3RoaXMuX3Rvb2xiYXJQYW5lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLGxpc3RlbmVyLGZhbHNlKTtmdW5jdGlvbiBvbkFuaW1hdGlvbkVuZCgpe3RoaXMuX3Rvb2xiYXJQYW5lRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnYW5pbWF0aW9uLW5hbWUnKTt0aGlzLl90b29sYmFyUGFuZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJyxsaXN0ZW5lcixmYWxzZSk7aWYodGhpcy5fY3VycmVudFRvb2xiYXJQYW5lKQp0aGlzLl9jdXJyZW50VG9vbGJhclBhbmUuZGV0YWNoKCk7dGhpcy5fY3VycmVudFRvb2xiYXJQYW5lPXRoaXMuX2FuaW1hdGVkVG9vbGJhclBhbmU7aWYodGhpcy5fY3VycmVudFRvb2xiYXJQYW5lKQp0aGlzLl9jdXJyZW50VG9vbGJhclBhbmUuZm9jdXMoKTt0aGlzLl9hbmltYXRlZFRvb2xiYXJQYW5lPW51bGw7aWYodGhpcy5fcGVuZGluZ1dpZGdldCl7dGhpcy5fc3RhcnRUb29sYmFyUGFuZUFuaW1hdGlvbih0aGlzLl9wZW5kaW5nV2lkZ2V0KTt0aGlzLl9wZW5kaW5nV2lkZ2V0PW51bGw7fX19fTtFbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5fbWF4TGlua0xlbmd0aD0zMDtFbGVtZW50cy5TZWN0aW9uQmxvY2s9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGVFbGVtZW50KXt0aGlzLl90aXRsZUVsZW1lbnQ9dGl0bGVFbGVtZW50O3RoaXMuc2VjdGlvbnM9W107fQpzdGF0aWMgY3JlYXRlUHNldWRvVHlwZUJsb2NrKHBzZXVkb1R5cGUpe2NvbnN0IHNlcGFyYXRvckVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7c2VwYXJhdG9yRWxlbWVudC5jbGFzc05hbWU9J3NpZGViYXItc2VwYXJhdG9yJztzZXBhcmF0b3JFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUHNldWRvIDo6JXMgZWxlbWVudCcscHNldWRvVHlwZSk7cmV0dXJuIG5ldyBFbGVtZW50cy5TZWN0aW9uQmxvY2soc2VwYXJhdG9yRWxlbWVudCk7fQpzdGF0aWMgY3JlYXRlS2V5ZnJhbWVzQmxvY2soa2V5ZnJhbWVzTmFtZSl7Y29uc3Qgc2VwYXJhdG9yRWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtzZXBhcmF0b3JFbGVtZW50LmNsYXNzTmFtZT0nc2lkZWJhci1zZXBhcmF0b3InO3NlcGFyYXRvckVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdAa2V5ZnJhbWVzICcra2V5ZnJhbWVzTmFtZSk7cmV0dXJuIG5ldyBFbGVtZW50cy5TZWN0aW9uQmxvY2soc2VwYXJhdG9yRWxlbWVudCk7fQpzdGF0aWMgYXN5bmMgX2NyZWF0ZUluaGVyaXRlZE5vZGVCbG9jayhub2RlKXtjb25zdCBzZXBhcmF0b3JFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3NlcGFyYXRvckVsZW1lbnQuY2xhc3NOYW1lPSdzaWRlYmFyLXNlcGFyYXRvcic7c2VwYXJhdG9yRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdJbmhlcml0ZWQgZnJvbScpKycgJyk7Y29uc3QgbGluaz1hd2FpdCBDb21tb24uTGlua2lmaWVyLmxpbmtpZnkobm9kZSk7c2VwYXJhdG9yRWxlbWVudC5hcHBlbmRDaGlsZChsaW5rKTtyZXR1cm4gbmV3IEVsZW1lbnRzLlNlY3Rpb25CbG9jayhzZXBhcmF0b3JFbGVtZW50KTt9CnVwZGF0ZUZpbHRlcigpe2xldCBoYXNBbnlWaXNpYmxlU2VjdGlvbj1mYWxzZTtmb3IoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKQpoYXNBbnlWaXNpYmxlU2VjdGlvbnw9c2VjdGlvbi5fdXBkYXRlRmlsdGVyKCk7aWYodGhpcy5fdGl0bGVFbGVtZW50KQp0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhaGFzQW55VmlzaWJsZVNlY3Rpb24pO3JldHVybiBoYXNBbnlWaXNpYmxlU2VjdGlvbjt9CnRpdGxlRWxlbWVudCgpe3JldHVybiB0aGlzLl90aXRsZUVsZW1lbnQ7fX07RWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihwYXJlbnRQYW5lLG1hdGNoZWRTdHlsZXMsc3R5bGUpe3RoaXMuX3BhcmVudFBhbmU9cGFyZW50UGFuZTt0aGlzLl9zdHlsZT1zdHlsZTt0aGlzLl9tYXRjaGVkU3R5bGVzPW1hdGNoZWRTdHlsZXM7dGhpcy5lZGl0YWJsZT0hIShzdHlsZS5zdHlsZVNoZWV0SWQmJnN0eWxlLnJhbmdlKTt0aGlzLl9ob3ZlclRpbWVyPW51bGw7dGhpcy5fd2lsbENhdXNlQ2FuY2VsRWRpdGluZz1mYWxzZTt0aGlzLl9mb3JjZVNob3dBbGw9ZmFsc2U7dGhpcy5fb3JpZ2luYWxQcm9wZXJ0aWVzQ291bnQ9c3R5bGUubGVhZGluZ1Byb3BlcnRpZXMoKS5sZW5ndGg7Y29uc3QgcnVsZT1zdHlsZS5wYXJlbnRSdWxlO3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdzdHlsZXMtc2VjdGlvbiBtYXRjaGVkLXN0eWxlcyBtb25vc3BhY2UnKTt0aGlzLmVsZW1lbnQudGFiSW5kZXg9LTE7VUkuQVJJQVV0aWxzLm1hcmtBc1RyZWVpdGVtKHRoaXMuZWxlbWVudCk7dGhpcy5fZWRpdGluZz1mYWxzZTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5fc2VjdGlvbj10aGlzO3RoaXMuX2lubmVyRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuX3RpdGxlRWxlbWVudD10aGlzLl9pbm5lckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3N0eWxlcy1zZWN0aW9uLXRpdGxlICcrKHJ1bGU/J3N0eWxlcy1zZWxlY3Rvcic6JycpKTt0aGlzLnByb3BlcnRpZXNUcmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMucHJvcGVydGllc1RyZWVPdXRsaW5lLnNldEZvY3VzYWJsZShmYWxzZSk7dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUucmVnaXN0ZXJSZXF1aXJlZENTUygnZWxlbWVudHMvc3R5bGVzU2VjdGlvblRyZWUuY3NzJyk7dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzdHlsZS1wcm9wZXJ0aWVzJywnbWF0Y2hlZC1zdHlsZXMnLCdtb25vc3BhY2UnKTt0aGlzLnByb3BlcnRpZXNUcmVlT3V0bGluZS5zZWN0aW9uPXRoaXM7dGhpcy5faW5uZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcGVydGllc1RyZWVPdXRsaW5lLmVsZW1lbnQpO3RoaXMuX3Nob3dBbGxCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbignJyx0aGlzLl9zaG93QWxsSXRlbXMuYmluZCh0aGlzKSwnc3R5bGVzLXNob3ctYWxsJyk7dGhpcy5faW5uZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3Nob3dBbGxCdXR0b24pO2NvbnN0IHNlbGVjdG9yQ29udGFpbmVyPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuX3NlbGVjdG9yRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnc2VsZWN0b3InKTt0aGlzLl9zZWxlY3RvckVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5faGVhZGVyVGV4dCgpO3NlbGVjdG9yQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3NlbGVjdG9yRWxlbWVudCk7dGhpcy5fc2VsZWN0b3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLHRoaXMuX29uTW91c2VFbnRlclNlbGVjdG9yLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3NlbGVjdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9vbk1vdXNlT3V0U2VsZWN0b3IuYmluZCh0aGlzKSxmYWxzZSk7Y29uc3Qgb3BlbkJyYWNlPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtvcGVuQnJhY2UudGV4dENvbnRlbnQ9JyB7JztzZWxlY3RvckNvbnRhaW5lci5hcHBlbmRDaGlsZChvcGVuQnJhY2UpO3NlbGVjdG9yQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5faGFuZGxlRW1wdHlTcGFjZU1vdXNlRG93bi5iaW5kKHRoaXMpLGZhbHNlKTtzZWxlY3RvckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faGFuZGxlU2VsZWN0b3JDb250YWluZXJDbGljay5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCBjbG9zZUJyYWNlPXRoaXMuX2lubmVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2lkZWJhci1wYW5lLWNsb3NpbmctYnJhY2UnKTtjbG9zZUJyYWNlLnRleHRDb250ZW50PSd9Jzt0aGlzLl9jcmVhdGVIb3Zlck1lbnVUb29sYmFyKGNsb3NlQnJhY2UpO3RoaXMuX3NlbGVjdG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faGFuZGxlU2VsZWN0b3JDbGljay5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9oYW5kbGVFbXB0eVNwYWNlTW91c2VEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faGFuZGxlRW1wdHlTcGFjZUNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9zZXRTZWN0aW9uSG92ZXJlZC5iaW5kKHRoaXMsZmFsc2UpLGZhbHNlKTtpZihydWxlKXtpZihydWxlLmlzVXNlckFnZW50KCl8fHJ1bGUuaXNJbmplY3RlZCgpKXt0aGlzLmVkaXRhYmxlPWZhbHNlO31lbHNle2lmKHJ1bGUuc3R5bGVTaGVldElkKXtjb25zdCBoZWFkZXI9cnVsZS5jc3NNb2RlbCgpLnN0eWxlU2hlZXRIZWFkZXJGb3JJZChydWxlLnN0eWxlU2hlZXRJZCk7dGhpcy5uYXZpZ2FibGU9IWhlYWRlci5pc0Fub255bW91c0lubGluZVN0eWxlU2hlZXQoKTt9fX0KdGhpcy5fbWVkaWFMaXN0RWxlbWVudD10aGlzLl90aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ21lZGlhLWxpc3QgbWVkaWEtbWF0Y2hlcycpO3RoaXMuX3NlbGVjdG9yUmVmRWxlbWVudD10aGlzLl90aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3N0eWxlcy1zZWN0aW9uLXN1YnRpdGxlJyk7dGhpcy5fdXBkYXRlTWVkaWFMaXN0KCk7dGhpcy5fdXBkYXRlUnVsZU9yaWdpbigpO3RoaXMuX3RpdGxlRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RvckNvbnRhaW5lcik7dGhpcy5fc2VsZWN0b3JDb250YWluZXI9c2VsZWN0b3JDb250YWluZXI7aWYodGhpcy5uYXZpZ2FibGUpCnRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXZpZ2FibGUnKTtpZighdGhpcy5lZGl0YWJsZSl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JlYWQtb25seScpO3RoaXMucHJvcGVydGllc1RyZWVPdXRsaW5lLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVhZC1vbmx5Jyk7fQpjb25zdCB0aHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMTAwKTt0aGlzLl9zY2hlZHVsZUhlaWdodFVwZGF0ZT0oKT0+dGhyb3R0bGVyLnNjaGVkdWxlKHRoaXMuX21hbnVhbGx5U2V0SGVpZ2h0LmJpbmQodGhpcykpO3RoaXMuX2hvdmVyYWJsZVNlbGVjdG9yc01vZGU9ZmFsc2U7dGhpcy5fbWFya1NlbGVjdG9yTWF0Y2hlcygpO3RoaXMub25wb3B1bGF0ZSgpO30Kc3RhdGljIGNyZWF0ZVJ1bGVPcmlnaW5Ob2RlKG1hdGNoZWRTdHlsZXMsbGlua2lmaWVyLHJ1bGUpe2lmKCFydWxlKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUoJycpO2xldCBydWxlTG9jYXRpb247aWYocnVsZSBpbnN0YW5jZW9mIFNESy5DU1NTdHlsZVJ1bGUpCnJ1bGVMb2NhdGlvbj1ydWxlLnN0eWxlLnJhbmdlO2Vsc2UgaWYocnVsZSBpbnN0YW5jZW9mIFNESy5DU1NLZXlmcmFtZVJ1bGUpCnJ1bGVMb2NhdGlvbj1ydWxlLmtleSgpLnJhbmdlO2NvbnN0IGhlYWRlcj1ydWxlLnN0eWxlU2hlZXRJZD9tYXRjaGVkU3R5bGVzLmNzc01vZGVsKCkuc3R5bGVTaGVldEhlYWRlckZvcklkKHJ1bGUuc3R5bGVTaGVldElkKTpudWxsO2lmKHJ1bGVMb2NhdGlvbiYmcnVsZS5zdHlsZVNoZWV0SWQmJmhlYWRlciYmIWhlYWRlci5pc0Fub255bW91c0lubGluZVN0eWxlU2hlZXQoKSl7cmV0dXJuIEVsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24uX2xpbmtpZnlSdWxlTG9jYXRpb24obWF0Y2hlZFN0eWxlcy5jc3NNb2RlbCgpLGxpbmtpZmllcixydWxlLnN0eWxlU2hlZXRJZCxydWxlTG9jYXRpb24pO30KaWYocnVsZS5pc1VzZXJBZ2VudCgpKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUoQ29tbW9uLlVJU3RyaW5nKCd1c2VyIGFnZW50IHN0eWxlc2hlZXQnKSk7aWYocnVsZS5pc0luamVjdGVkKCkpCnJldHVybiBjcmVhdGVUZXh0Tm9kZShDb21tb24uVUlTdHJpbmcoJ2luamVjdGVkIHN0eWxlc2hlZXQnKSk7aWYocnVsZS5pc1ZpYUluc3BlY3RvcigpKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUoQ29tbW9uLlVJU3RyaW5nKCd2aWEgaW5zcGVjdG9yJykpO2lmKGhlYWRlciYmaGVhZGVyLm93bmVyTm9kZSl7Y29uc3QgbGluaz1FbGVtZW50cy5ET01MaW5raWZpZXIubGlua2lmeURlZmVycmVkTm9kZVJlZmVyZW5jZShoZWFkZXIub3duZXJOb2RlKTtsaW5rLnRleHRDb250ZW50PSc8c3R5bGU+4oCmPC9zdHlsZT4nO3JldHVybiBsaW5rO30KcmV0dXJuIGNyZWF0ZVRleHROb2RlKCcnKTt9CnN0YXRpYyBfbGlua2lmeVJ1bGVMb2NhdGlvbihjc3NNb2RlbCxsaW5raWZpZXIsc3R5bGVTaGVldElkLHJ1bGVMb2NhdGlvbil7Y29uc3Qgc3R5bGVTaGVldEhlYWRlcj1jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQoc3R5bGVTaGVldElkKTtjb25zdCBsaW5lTnVtYmVyPXN0eWxlU2hlZXRIZWFkZXIubGluZU51bWJlckluU291cmNlKHJ1bGVMb2NhdGlvbi5zdGFydExpbmUpO2NvbnN0IGNvbHVtbk51bWJlcj1zdHlsZVNoZWV0SGVhZGVyLmNvbHVtbk51bWJlckluU291cmNlKHJ1bGVMb2NhdGlvbi5zdGFydExpbmUscnVsZUxvY2F0aW9uLnN0YXJ0Q29sdW1uKTtjb25zdCBtYXRjaGluZ1NlbGVjdG9yTG9jYXRpb249bmV3IFNESy5DU1NMb2NhdGlvbihzdHlsZVNoZWV0SGVhZGVyLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtyZXR1cm4gbGlua2lmaWVyLmxpbmtpZnlDU1NMb2NhdGlvbihtYXRjaGluZ1NlbGVjdG9yTG9jYXRpb24pO30KX29uS2V5RG93bihldmVudCl7aWYodGhpcy5fZWRpdGluZ3x8IXRoaXMuZWRpdGFibGV8fGV2ZW50LmFsdEtleXx8ZXZlbnQuY3RybEtleXx8ZXZlbnQubWV0YUtleSkKcmV0dXJuO3N3aXRjaChldmVudC5rZXkpe2Nhc2UnRW50ZXInOmNhc2UnICc6dGhpcy5fc3RhcnRFZGl0aW5nQXRGaXJzdFBvc2l0aW9uKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTticmVhaztkZWZhdWx0OmlmKGV2ZW50LmtleS5sZW5ndGg9PT0xKQp0aGlzLmFkZE5ld0JsYW5rUHJvcGVydHkoMCkuc3RhcnRFZGl0aW5nKCk7YnJlYWs7fX0KX3NldFNlY3Rpb25Ib3ZlcmVkKGlzSG92ZXJlZCl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3N0eWxlcy1wYW5lbC1ob3ZlcmVkJyxpc0hvdmVyZWQpO3RoaXMucHJvcGVydGllc1RyZWVPdXRsaW5lLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc3R5bGVzLXBhbmVsLWhvdmVyZWQnLGlzSG92ZXJlZCk7aWYodGhpcy5faG92ZXJhYmxlU2VsZWN0b3JzTW9kZSE9PWlzSG92ZXJlZCl7dGhpcy5faG92ZXJhYmxlU2VsZWN0b3JzTW9kZT1pc0hvdmVyZWQ7dGhpcy5fbWFya1NlbGVjdG9yTWF0Y2hlcygpO319Cl9vbk1vdXNlTW92ZShldmVudCl7Y29uc3QgaGFzQ3RybE9yTWV0YT1VSS5LZXlib2FyZFNob3J0Y3V0LmV2ZW50SGFzQ3RybE9yTWV0YSgoZXZlbnQpKTt0aGlzLl9zZXRTZWN0aW9uSG92ZXJlZChoYXNDdHJsT3JNZXRhKTt9Cl9jcmVhdGVIb3Zlck1lbnVUb29sYmFyKGNvbnRhaW5lcil7aWYoIXRoaXMuZWRpdGFibGUpCnJldHVybjtjb25zdCBpdGVtcz1bXTtjb25zdCB0ZXh0U2hhZG93QnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQWRkIHRleHQtc2hhZG93JyksJ2xhcmdlaWNvbi10ZXh0LXNoYWRvdycpO3RleHRTaGFkb3dCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9vbkluc2VydFNoYWRvd1Byb3BlcnR5Q2xpY2suYmluZCh0aGlzLCd0ZXh0LXNoYWRvdycpKTt0ZXh0U2hhZG93QnV0dG9uLmVsZW1lbnQudGFiSW5kZXg9LTE7aXRlbXMucHVzaCh0ZXh0U2hhZG93QnV0dG9uKTtjb25zdCBib3hTaGFkb3dCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgYm94LXNoYWRvdycpLCdsYXJnZWljb24tYm94LXNoYWRvdycpO2JveFNoYWRvd0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX29uSW5zZXJ0U2hhZG93UHJvcGVydHlDbGljay5iaW5kKHRoaXMsJ2JveC1zaGFkb3cnKSk7Ym94U2hhZG93QnV0dG9uLmVsZW1lbnQudGFiSW5kZXg9LTE7aXRlbXMucHVzaChib3hTaGFkb3dCdXR0b24pO2NvbnN0IGNvbG9yQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQWRkIGNvbG9yJyksJ2xhcmdlaWNvbi1mb3JlZ3JvdW5kLWNvbG9yJyk7Y29sb3JCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9vbkluc2VydENvbG9yUHJvcGVydHlDbGljayx0aGlzKTtjb2xvckJ1dHRvbi5lbGVtZW50LnRhYkluZGV4PS0xO2l0ZW1zLnB1c2goY29sb3JCdXR0b24pO2NvbnN0IGJhY2tncm91bmRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgYmFja2dyb3VuZC1jb2xvcicpLCdsYXJnZWljb24tYmFja2dyb3VuZC1jb2xvcicpO2JhY2tncm91bmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9vbkluc2VydEJhY2tncm91bmRDb2xvclByb3BlcnR5Q2xpY2ssdGhpcyk7YmFja2dyb3VuZEJ1dHRvbi5lbGVtZW50LnRhYkluZGV4PS0xO2l0ZW1zLnB1c2goYmFja2dyb3VuZEJ1dHRvbik7bGV0IG5ld1J1bGVCdXR0b249bnVsbDtpZih0aGlzLl9zdHlsZS5wYXJlbnRSdWxlKXtuZXdSdWxlQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnSW5zZXJ0IFN0eWxlIFJ1bGUgQmVsb3cnKSwnbGFyZ2VpY29uLWFkZCcpO25ld1J1bGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9vbk5ld1J1bGVDbGljayx0aGlzKTtuZXdSdWxlQnV0dG9uLmVsZW1lbnQudGFiSW5kZXg9LTE7aXRlbXMucHVzaChuZXdSdWxlQnV0dG9uKTt9CmNvbnN0IHNlY3Rpb25Ub29sYmFyPW5ldyBVSS5Ub29sYmFyKCdzaWRlYmFyLXBhbmUtc2VjdGlvbi10b29sYmFyJyxjb250YWluZXIpO2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSkKc2VjdGlvblRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oaXRlbXNbaV0pO2NvbnN0IG1lbnVCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oJycsJ2xhcmdlaWNvbi1tZW51Jyk7bWVudUJ1dHRvbi5lbGVtZW50LnRhYkluZGV4PS0xO3NlY3Rpb25Ub29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKG1lbnVCdXR0b24pO3NldEl0ZW1zVmlzaWJpbGl0eS5jYWxsKHRoaXMsaXRlbXMsZmFsc2UpO3NlY3Rpb25Ub29sYmFyLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsc2V0SXRlbXNWaXNpYmlsaXR5LmJpbmQodGhpcyxpdGVtcyx0cnVlKSk7c2VjdGlvblRvb2xiYXIuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyxzZXRJdGVtc1Zpc2liaWxpdHkuYmluZCh0aGlzLGl0ZW1zLGZhbHNlKSk7VUkuQVJJQVV0aWxzLm1hcmtBc0hpZGRlbihzZWN0aW9uVG9vbGJhci5lbGVtZW50KTtmdW5jdGlvbiBzZXRJdGVtc1Zpc2liaWxpdHkoaXRlbXMsdmFsdWUpe2ZvcihsZXQgaT0wO2k8aXRlbXMubGVuZ3RoOysraSkKaXRlbXNbaV0uc2V0VmlzaWJsZSh2YWx1ZSk7bWVudUJ1dHRvbi5zZXRWaXNpYmxlKCF2YWx1ZSk7aWYodGhpcy5faXNTQVNTU3R5bGUoKSkKbmV3UnVsZUJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTt9fQpfaXNTQVNTU3R5bGUoKXtjb25zdCBoZWFkZXI9dGhpcy5fc3R5bGUuc3R5bGVTaGVldElkP3RoaXMuX3N0eWxlLmNzc01vZGVsKCkuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuX3N0eWxlLnN0eWxlU2hlZXRJZCk6bnVsbDtpZighaGVhZGVyKQpyZXR1cm4gZmFsc2U7Y29uc3Qgc291cmNlTWFwPWhlYWRlci5jc3NNb2RlbCgpLnNvdXJjZU1hcE1hbmFnZXIoKS5zb3VyY2VNYXBGb3JDbGllbnQoaGVhZGVyKTtyZXR1cm4gc291cmNlTWFwP3NvdXJjZU1hcC5lZGl0YWJsZSgpOmZhbHNlO30Kc3R5bGUoKXtyZXR1cm4gdGhpcy5fc3R5bGU7fQpfaGVhZGVyVGV4dCgpe2NvbnN0IG5vZGU9dGhpcy5fbWF0Y2hlZFN0eWxlcy5ub2RlRm9yU3R5bGUodGhpcy5fc3R5bGUpO2lmKHRoaXMuX3N0eWxlLnR5cGU9PT1TREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLklubGluZSkKcmV0dXJuIHRoaXMuX21hdGNoZWRTdHlsZXMuaXNJbmhlcml0ZWQodGhpcy5fc3R5bGUpP0NvbW1vbi5VSVN0cmluZygnU3R5bGUgQXR0cmlidXRlJyk6J2VsZW1lbnQuc3R5bGUnO2lmKHRoaXMuX3N0eWxlLnR5cGU9PT1TREsuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLkF0dHJpYnV0ZXMpCnJldHVybiBub2RlLm5vZGVOYW1lSW5Db3JyZWN0Q2FzZSgpKydbJytDb21tb24uVUlTdHJpbmcoJ0F0dHJpYnV0ZXMgU3R5bGUnKSsnXSc7cmV0dXJuIHRoaXMuX3N0eWxlLnBhcmVudFJ1bGUuc2VsZWN0b3JUZXh0KCk7fQpfb25Nb3VzZU91dFNlbGVjdG9yKCl7aWYodGhpcy5faG92ZXJUaW1lcikKY2xlYXJUaW1lb3V0KHRoaXMuX2hvdmVyVGltZXIpO1NESy5PdmVybGF5TW9kZWwuaGlkZURPTU5vZGVIaWdobGlnaHQoKTt9Cl9vbk1vdXNlRW50ZXJTZWxlY3Rvcigpe2lmKHRoaXMuX2hvdmVyVGltZXIpCmNsZWFyVGltZW91dCh0aGlzLl9ob3ZlclRpbWVyKTt0aGlzLl9ob3ZlclRpbWVyPXNldFRpbWVvdXQodGhpcy5faGlnaGxpZ2h0LmJpbmQodGhpcyksMzAwKTt9Cl9oaWdobGlnaHQoKXtTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7Y29uc3Qgbm9kZT10aGlzLl9wYXJlbnRQYW5lLm5vZGUoKTtpZighbm9kZSkKcmV0dXJuO2NvbnN0IHNlbGVjdG9ycz10aGlzLl9zdHlsZS5wYXJlbnRSdWxlP3RoaXMuX3N0eWxlLnBhcmVudFJ1bGUuc2VsZWN0b3JUZXh0KCk6dW5kZWZpbmVkO25vZGUuZG9tTW9kZWwoKS5vdmVybGF5TW9kZWwoKS5oaWdobGlnaHRET01Ob2RlV2l0aENvbmZpZyhub2RlLmlkLHttb2RlOidhbGwnLHNob3dJbmZvOnVuZGVmaW5lZCxzZWxlY3RvcnM6c2VsZWN0b3JzfSk7fQpmaXJzdFNpYmxpbmcoKXtjb25zdCBwYXJlbnQ9dGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQ7aWYoIXBhcmVudCkKcmV0dXJuIG51bGw7bGV0IGNoaWxkRWxlbWVudD1wYXJlbnQuZmlyc3RDaGlsZDt3aGlsZShjaGlsZEVsZW1lbnQpe2lmKGNoaWxkRWxlbWVudC5fc2VjdGlvbikKcmV0dXJuIGNoaWxkRWxlbWVudC5fc2VjdGlvbjtjaGlsZEVsZW1lbnQ9Y2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nO30KcmV0dXJuIG51bGw7fQpsYXN0U2libGluZygpe2NvbnN0IHBhcmVudD10aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudDtpZighcGFyZW50KQpyZXR1cm4gbnVsbDtsZXQgY2hpbGRFbGVtZW50PXBhcmVudC5sYXN0Q2hpbGQ7d2hpbGUoY2hpbGRFbGVtZW50KXtpZihjaGlsZEVsZW1lbnQuX3NlY3Rpb24pCnJldHVybiBjaGlsZEVsZW1lbnQuX3NlY3Rpb247Y2hpbGRFbGVtZW50PWNoaWxkRWxlbWVudC5wcmV2aW91c1NpYmxpbmc7fQpyZXR1cm4gbnVsbDt9Cm5leHRTaWJsaW5nKCl7bGV0IGN1ckVsZW1lbnQ9dGhpcy5lbGVtZW50O2RvCmN1ckVsZW1lbnQ9Y3VyRWxlbWVudC5uZXh0U2libGluZzt3aGlsZShjdXJFbGVtZW50JiYhY3VyRWxlbWVudC5fc2VjdGlvbik7cmV0dXJuIGN1ckVsZW1lbnQ/Y3VyRWxlbWVudC5fc2VjdGlvbjpudWxsO30KcHJldmlvdXNTaWJsaW5nKCl7bGV0IGN1ckVsZW1lbnQ9dGhpcy5lbGVtZW50O2RvCmN1ckVsZW1lbnQ9Y3VyRWxlbWVudC5wcmV2aW91c1NpYmxpbmc7d2hpbGUoY3VyRWxlbWVudCYmIWN1ckVsZW1lbnQuX3NlY3Rpb24pO3JldHVybiBjdXJFbGVtZW50P2N1ckVsZW1lbnQuX3NlY3Rpb246bnVsbDt9Cl9vbk5ld1J1bGVDbGljayhldmVudCl7ZXZlbnQuZGF0YS5jb25zdW1lKCk7Y29uc3QgcnVsZT10aGlzLl9zdHlsZS5wYXJlbnRSdWxlO2NvbnN0IHJhbmdlPVRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKHJ1bGUuc3R5bGUucmFuZ2UuZW5kTGluZSxydWxlLnN0eWxlLnJhbmdlLmVuZENvbHVtbisxKTt0aGlzLl9wYXJlbnRQYW5lLl9hZGRCbGFua1NlY3Rpb24odGhpcywocnVsZS5zdHlsZVNoZWV0SWQpLHJhbmdlKTt9Cl9vbkluc2VydFNoYWRvd1Byb3BlcnR5Q2xpY2socHJvcGVydHlOYW1lLGV2ZW50KXtldmVudC5kYXRhLmNvbnN1bWUodHJ1ZSk7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5hZGROZXdCbGFua1Byb3BlcnR5KCk7dHJlZUVsZW1lbnQucHJvcGVydHkubmFtZT1wcm9wZXJ0eU5hbWU7dHJlZUVsZW1lbnQucHJvcGVydHkudmFsdWU9JzAgMCBibGFjayc7dHJlZUVsZW1lbnQudXBkYXRlVGl0bGUoKTtjb25zdCBzaGFkb3dTd2F0Y2hQb3BvdmVySGVscGVyPUVsZW1lbnRzLlNoYWRvd1N3YXRjaFBvcG92ZXJIZWxwZXIuZm9yVHJlZUVsZW1lbnQodHJlZUVsZW1lbnQpO2lmKHNoYWRvd1N3YXRjaFBvcG92ZXJIZWxwZXIpCnNoYWRvd1N3YXRjaFBvcG92ZXJIZWxwZXIuc2hvd1BvcG92ZXIoKTt9Cl9vbkluc2VydENvbG9yUHJvcGVydHlDbGljayhldmVudCl7ZXZlbnQuZGF0YS5jb25zdW1lKHRydWUpO2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuYWRkTmV3QmxhbmtQcm9wZXJ0eSgpO3RyZWVFbGVtZW50LnByb3BlcnR5Lm5hbWU9J2NvbG9yJzt0cmVlRWxlbWVudC5wcm9wZXJ0eS52YWx1ZT0nYmxhY2snO3RyZWVFbGVtZW50LnVwZGF0ZVRpdGxlKCk7Y29uc3QgY29sb3JTd2F0Y2g9RWxlbWVudHMuQ29sb3JTd2F0Y2hQb3BvdmVySWNvbi5mb3JUcmVlRWxlbWVudCh0cmVlRWxlbWVudCk7aWYoY29sb3JTd2F0Y2gpCmNvbG9yU3dhdGNoLnNob3dQb3BvdmVyKCk7fQpfb25JbnNlcnRCYWNrZ3JvdW5kQ29sb3JQcm9wZXJ0eUNsaWNrKGV2ZW50KXtldmVudC5kYXRhLmNvbnN1bWUodHJ1ZSk7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5hZGROZXdCbGFua1Byb3BlcnR5KCk7dHJlZUVsZW1lbnQucHJvcGVydHkubmFtZT0nYmFja2dyb3VuZC1jb2xvcic7dHJlZUVsZW1lbnQucHJvcGVydHkudmFsdWU9J3doaXRlJzt0cmVlRWxlbWVudC51cGRhdGVUaXRsZSgpO2NvbnN0IGNvbG9yU3dhdGNoPUVsZW1lbnRzLkNvbG9yU3dhdGNoUG9wb3Zlckljb24uZm9yVHJlZUVsZW1lbnQodHJlZUVsZW1lbnQpO2lmKGNvbG9yU3dhdGNoKQpjb2xvclN3YXRjaC5zaG93UG9wb3ZlcigpO30KX3N0eWxlU2hlZXRFZGl0ZWQoZWRpdCl7Y29uc3QgcnVsZT10aGlzLl9zdHlsZS5wYXJlbnRSdWxlO2lmKHJ1bGUpCnJ1bGUucmViYXNlKGVkaXQpO2Vsc2UKdGhpcy5fc3R5bGUucmViYXNlKGVkaXQpO3RoaXMuX3VwZGF0ZU1lZGlhTGlzdCgpO3RoaXMuX3VwZGF0ZVJ1bGVPcmlnaW4oKTt9Cl9jcmVhdGVNZWRpYUxpc3QobWVkaWFSdWxlcyl7Zm9yKGxldCBpPW1lZGlhUnVsZXMubGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IG1lZGlhPW1lZGlhUnVsZXNbaV07aWYoIW1lZGlhLnRleHQuaW5jbHVkZXMoJygnKSYmbWVkaWEudGV4dCE9PSdwcmludCcpCmNvbnRpbnVlO2NvbnN0IG1lZGlhRGF0YUVsZW1lbnQ9dGhpcy5fbWVkaWFMaXN0RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbWVkaWEnKTtjb25zdCBtZWRpYUNvbnRhaW5lckVsZW1lbnQ9bWVkaWFEYXRhRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO2NvbnN0IG1lZGlhVGV4dEVsZW1lbnQ9bWVkaWFDb250YWluZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnbWVkaWEtdGV4dCcpO3N3aXRjaChtZWRpYS5zb3VyY2Upe2Nhc2UgU0RLLkNTU01lZGlhLlNvdXJjZS5MSU5LRURfU0hFRVQ6Y2FzZSBTREsuQ1NTTWVkaWEuU291cmNlLklOTElORV9TSEVFVDptZWRpYVRleHRFbGVtZW50LnRleHRDb250ZW50PSdtZWRpYT0iJyttZWRpYS50ZXh0KyciJzticmVhaztjYXNlIFNESy5DU1NNZWRpYS5Tb3VyY2UuTUVESUFfUlVMRTpjb25zdCBkZWNvcmF0aW9uPW1lZGlhQ29udGFpbmVyRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO21lZGlhQ29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUoZGVjb3JhdGlvbixtZWRpYVRleHRFbGVtZW50KTtkZWNvcmF0aW9uLnRleHRDb250ZW50PSdAbWVkaWEgJzttZWRpYVRleHRFbGVtZW50LnRleHRDb250ZW50PW1lZGlhLnRleHQ7aWYobWVkaWEuc3R5bGVTaGVldElkKXttZWRpYURhdGFFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2VkaXRhYmxlLW1lZGlhJyk7bWVkaWFUZXh0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faGFuZGxlTWVkaWFSdWxlQ2xpY2suYmluZCh0aGlzLG1lZGlhLG1lZGlhVGV4dEVsZW1lbnQpLGZhbHNlKTt9CmJyZWFrO2Nhc2UgU0RLLkNTU01lZGlhLlNvdXJjZS5JTVBPUlRfUlVMRTptZWRpYVRleHRFbGVtZW50LnRleHRDb250ZW50PSdAaW1wb3J0ICcrbWVkaWEudGV4dDticmVhazt9fX0KX3VwZGF0ZU1lZGlhTGlzdCgpe3RoaXMuX21lZGlhTGlzdEVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtpZih0aGlzLl9zdHlsZS5wYXJlbnRSdWxlJiZ0aGlzLl9zdHlsZS5wYXJlbnRSdWxlIGluc3RhbmNlb2YgU0RLLkNTU1N0eWxlUnVsZSkKdGhpcy5fY3JlYXRlTWVkaWFMaXN0KHRoaXMuX3N0eWxlLnBhcmVudFJ1bGUubWVkaWEpO30KaXNQcm9wZXJ0eUluaGVyaXRlZChwcm9wZXJ0eU5hbWUpe2lmKHRoaXMuX21hdGNoZWRTdHlsZXMuaXNJbmhlcml0ZWQodGhpcy5fc3R5bGUpKXtyZXR1cm4hU0RLLmNzc01ldGFkYXRhKCkuaXNQcm9wZXJ0eUluaGVyaXRlZChwcm9wZXJ0eU5hbWUpO30KcmV0dXJuIGZhbHNlO30KbmV4dEVkaXRhYmxlU2libGluZygpe2xldCBjdXJTZWN0aW9uPXRoaXM7ZG8KY3VyU2VjdGlvbj1jdXJTZWN0aW9uLm5leHRTaWJsaW5nKCk7d2hpbGUoY3VyU2VjdGlvbiYmIWN1clNlY3Rpb24uZWRpdGFibGUpO2lmKCFjdXJTZWN0aW9uKXtjdXJTZWN0aW9uPXRoaXMuZmlyc3RTaWJsaW5nKCk7d2hpbGUoY3VyU2VjdGlvbiYmIWN1clNlY3Rpb24uZWRpdGFibGUpCmN1clNlY3Rpb249Y3VyU2VjdGlvbi5uZXh0U2libGluZygpO30KcmV0dXJuKGN1clNlY3Rpb24mJmN1clNlY3Rpb24uZWRpdGFibGUpP2N1clNlY3Rpb246bnVsbDt9CnByZXZpb3VzRWRpdGFibGVTaWJsaW5nKCl7bGV0IGN1clNlY3Rpb249dGhpcztkbwpjdXJTZWN0aW9uPWN1clNlY3Rpb24ucHJldmlvdXNTaWJsaW5nKCk7d2hpbGUoY3VyU2VjdGlvbiYmIWN1clNlY3Rpb24uZWRpdGFibGUpO2lmKCFjdXJTZWN0aW9uKXtjdXJTZWN0aW9uPXRoaXMubGFzdFNpYmxpbmcoKTt3aGlsZShjdXJTZWN0aW9uJiYhY3VyU2VjdGlvbi5lZGl0YWJsZSkKY3VyU2VjdGlvbj1jdXJTZWN0aW9uLnByZXZpb3VzU2libGluZygpO30KcmV0dXJuKGN1clNlY3Rpb24mJmN1clNlY3Rpb24uZWRpdGFibGUpP2N1clNlY3Rpb246bnVsbDt9CnJlZnJlc2hVcGRhdGUoZWRpdGVkVHJlZUVsZW1lbnQpe3RoaXMuX3BhcmVudFBhbmUuX3JlZnJlc2hVcGRhdGUodGhpcyxlZGl0ZWRUcmVlRWxlbWVudCk7fQpfdXBkYXRlVmFyRnVuY3Rpb25zKGVkaXRlZFRyZWVFbGVtZW50KXtsZXQgY2hpbGQ9dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuZmlyc3RDaGlsZCgpO3doaWxlKGNoaWxkKXtpZihjaGlsZCE9PWVkaXRlZFRyZWVFbGVtZW50KQpjaGlsZC51cGRhdGVUaXRsZUlmQ29tcHV0ZWRWYWx1ZUNoYW5nZWQoKTtjaGlsZD1jaGlsZC50cmF2ZXJzZU5leHRUcmVlRWxlbWVudChmYWxzZSxudWxsLHRydWUpO319CnVwZGF0ZShmdWxsKXt0aGlzLl9zZWxlY3RvckVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5faGVhZGVyVGV4dCgpO3RoaXMuX21hcmtTZWxlY3Rvck1hdGNoZXMoKTtpZihmdWxsKXt0aGlzLm9ucG9wdWxhdGUoKTt9ZWxzZXtsZXQgY2hpbGQ9dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuZmlyc3RDaGlsZCgpO3doaWxlKGNoaWxkKXtjaGlsZC5zZXRPdmVybG9hZGVkKHRoaXMuX2lzUHJvcGVydHlPdmVybG9hZGVkKGNoaWxkLnByb3BlcnR5KSk7Y2hpbGQ9Y2hpbGQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UsbnVsbCx0cnVlKTt9fX0KX3Nob3dBbGxJdGVtcyhldmVudCl7aWYoZXZlbnQpCmV2ZW50LmNvbnN1bWUoKTtpZih0aGlzLl9mb3JjZVNob3dBbGwpCnJldHVybjt0aGlzLl9mb3JjZVNob3dBbGw9dHJ1ZTt0aGlzLm9ucG9wdWxhdGUoKTt9Cm9ucG9wdWxhdGUoKXt0aGlzLnByb3BlcnRpZXNUcmVlT3V0bGluZS5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHN0eWxlPXRoaXMuX3N0eWxlO2xldCBjb3VudD0wO2NvbnN0IHByb3BlcnRpZXM9c3R5bGUubGVhZGluZ1Byb3BlcnRpZXMoKTtjb25zdCBtYXhQcm9wZXJ0aWVzPUVsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24uTWF4UHJvcGVydGllcytwcm9wZXJ0aWVzLmxlbmd0aC10aGlzLl9vcmlnaW5hbFByb3BlcnRpZXNDb3VudDtmb3IoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcyl7aWYoIXRoaXMuX2ZvcmNlU2hvd0FsbCYmY291bnQ+PW1heFByb3BlcnRpZXMpCmJyZWFrO2NvdW50Kys7Y29uc3QgaXNTaG9ydGhhbmQ9ISFzdHlsZS5sb25naGFuZFByb3BlcnRpZXMocHJvcGVydHkubmFtZSkubGVuZ3RoO2NvbnN0IGluaGVyaXRlZD10aGlzLmlzUHJvcGVydHlJbmhlcml0ZWQocHJvcGVydHkubmFtZSk7Y29uc3Qgb3ZlcmxvYWRlZD10aGlzLl9pc1Byb3BlcnR5T3ZlcmxvYWRlZChwcm9wZXJ0eSk7Y29uc3QgaXRlbT1uZXcgRWxlbWVudHMuU3R5bGVQcm9wZXJ0eVRyZWVFbGVtZW50KHRoaXMuX3BhcmVudFBhbmUsdGhpcy5fbWF0Y2hlZFN0eWxlcyxwcm9wZXJ0eSxpc1Nob3J0aGFuZCxpbmhlcml0ZWQsb3ZlcmxvYWRlZCxmYWxzZSk7dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuYXBwZW5kQ2hpbGQoaXRlbSk7fQppZihjb3VudDxwcm9wZXJ0aWVzLmxlbmd0aCl7dGhpcy5fc2hvd0FsbEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLl9zaG93QWxsQnV0dG9uLnRleHRDb250ZW50PWxzYFNob3cgQWxsIFByb3BlcnRpZXMgKCR7cHJvcGVydGllcy5sZW5ndGggLSBjb3VudH0gbW9yZSlgO31lbHNle3RoaXMuX3Nob3dBbGxCdXR0b24uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fX0KX2lzUHJvcGVydHlPdmVybG9hZGVkKHByb3BlcnR5KXtyZXR1cm4gdGhpcy5fbWF0Y2hlZFN0eWxlcy5wcm9wZXJ0eVN0YXRlKHByb3BlcnR5KT09PVNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZDt9Cl91cGRhdGVGaWx0ZXIoKXtsZXQgaGFzTWF0Y2hpbmdDaGlsZD1mYWxzZTt0aGlzLl9zaG93QWxsSXRlbXMoKTtmb3IoY29uc3QgY2hpbGQgb2YgdGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUucm9vdEVsZW1lbnQoKS5jaGlsZHJlbigpKQpoYXNNYXRjaGluZ0NoaWxkfD1jaGlsZC5fdXBkYXRlRmlsdGVyKCk7Y29uc3QgcmVnZXg9dGhpcy5fcGFyZW50UGFuZS5maWx0ZXJSZWdleCgpO2NvbnN0IGhpZGVSdWxlPSFoYXNNYXRjaGluZ0NoaWxkJiYhIXJlZ2V4JiYhcmVnZXgudGVzdCh0aGlzLmVsZW1lbnQuZGVlcFRleHRDb250ZW50KCkpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLGhpZGVSdWxlKTtpZighaGlkZVJ1bGUmJnRoaXMuX3N0eWxlLnBhcmVudFJ1bGUpCnRoaXMuX21hcmtTZWxlY3RvckhpZ2hsaWdodHMoKTtyZXR1cm4haGlkZVJ1bGU7fQpfbWFya1NlbGVjdG9yTWF0Y2hlcygpe2NvbnN0IHJ1bGU9dGhpcy5fc3R5bGUucGFyZW50UnVsZTtpZighcnVsZSkKcmV0dXJuO3RoaXMuX21lZGlhTGlzdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbWVkaWEtbWF0Y2hlcycsdGhpcy5fbWF0Y2hlZFN0eWxlcy5tZWRpYU1hdGNoZXModGhpcy5fc3R5bGUpKTtjb25zdCBzZWxlY3RvclRleHRzPXJ1bGUuc2VsZWN0b3JzLm1hcChzZWxlY3Rvcj0+c2VsZWN0b3IudGV4dCk7Y29uc3QgbWF0Y2hpbmdTZWxlY3RvckluZGV4ZXM9dGhpcy5fbWF0Y2hlZFN0eWxlcy5tYXRjaGluZ1NlbGVjdG9ycygocnVsZSkpO2NvbnN0IG1hdGNoaW5nU2VsZWN0b3JzPShuZXcgQXJyYXkoc2VsZWN0b3JUZXh0cy5sZW5ndGgpLmZpbGwoZmFsc2UpKTtmb3IoY29uc3QgbWF0Y2hpbmdJbmRleCBvZiBtYXRjaGluZ1NlbGVjdG9ySW5kZXhlcykKbWF0Y2hpbmdTZWxlY3RvcnNbbWF0Y2hpbmdJbmRleF09dHJ1ZTtpZih0aGlzLl9wYXJlbnRQYW5lLl9pc0VkaXRpbmdTdHlsZSkKcmV0dXJuO2NvbnN0IGZyYWdtZW50PXRoaXMuX2hvdmVyYWJsZVNlbGVjdG9yc01vZGU/dGhpcy5fcmVuZGVySG92ZXJhYmxlU2VsZWN0b3JzKHNlbGVjdG9yVGV4dHMsbWF0Y2hpbmdTZWxlY3RvcnMpOnRoaXMuX3JlbmRlclNpbXBsaWZpZWRTZWxlY3RvcnMoc2VsZWN0b3JUZXh0cyxtYXRjaGluZ1NlbGVjdG9ycyk7dGhpcy5fc2VsZWN0b3JFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fc2VsZWN0b3JFbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTt0aGlzLl9tYXJrU2VsZWN0b3JIaWdobGlnaHRzKCk7fQpfcmVuZGVySG92ZXJhYmxlU2VsZWN0b3JzKHNlbGVjdG9ycyxtYXRjaGluZ1NlbGVjdG9ycyl7Y29uc3QgZnJhZ21lbnQ9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZvcihsZXQgaT0wO2k8c2VsZWN0b3JzLmxlbmd0aDsrK2kpe2lmKGkpCmZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTtmcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVTZWxlY3RvckVsZW1lbnQoc2VsZWN0b3JzW2ldLG1hdGNoaW5nU2VsZWN0b3JzW2ldLGkpKTt9CnJldHVybiBmcmFnbWVudDt9Cl9jcmVhdGVTZWxlY3RvckVsZW1lbnQodGV4dCxpc01hdGNoaW5nLG5hdmlnYXRpb25JbmRleCl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnc2ltcGxlLXNlbGVjdG9yJyk7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdzZWxlY3Rvci1tYXRjaGVzJyxpc01hdGNoaW5nKTtpZih0eXBlb2YgbmF2aWdhdGlvbkluZGV4PT09J251bWJlcicpCmVsZW1lbnQuX3NlbGVjdG9ySW5kZXg9bmF2aWdhdGlvbkluZGV4O2VsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDtyZXR1cm4gZWxlbWVudDt9Cl9yZW5kZXJTaW1wbGlmaWVkU2VsZWN0b3JzKHNlbGVjdG9ycyxtYXRjaGluZ1NlbGVjdG9ycyl7Y29uc3QgZnJhZ21lbnQ9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2xldCBjdXJyZW50TWF0Y2hpbmc9ZmFsc2U7bGV0IHRleHQ9Jyc7Zm9yKGxldCBpPTA7aTxzZWxlY3RvcnMubGVuZ3RoOysraSl7aWYoY3VycmVudE1hdGNoaW5nIT09bWF0Y2hpbmdTZWxlY3RvcnNbaV0mJnRleHQpe2ZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdG9yRWxlbWVudCh0ZXh0LGN1cnJlbnRNYXRjaGluZykpO3RleHQ9Jyc7fQpjdXJyZW50TWF0Y2hpbmc9bWF0Y2hpbmdTZWxlY3RvcnNbaV07dGV4dCs9c2VsZWN0b3JzW2ldKyhpPT09c2VsZWN0b3JzLmxlbmd0aC0xPycnOicsICcpO30KaWYodGV4dCkKZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU2VsZWN0b3JFbGVtZW50KHRleHQsY3VycmVudE1hdGNoaW5nKSk7cmV0dXJuIGZyYWdtZW50O30KX21hcmtTZWxlY3RvckhpZ2hsaWdodHMoKXtjb25zdCBzZWxlY3RvcnM9dGhpcy5fc2VsZWN0b3JFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NpbXBsZS1zZWxlY3RvcicpO2NvbnN0IHJlZ2V4PXRoaXMuX3BhcmVudFBhbmUuZmlsdGVyUmVnZXgoKTtmb3IobGV0IGk9MDtpPHNlbGVjdG9ycy5sZW5ndGg7KytpKXtjb25zdCBzZWxlY3Rvck1hdGNoZXNGaWx0ZXI9ISFyZWdleCYmcmVnZXgudGVzdChzZWxlY3RvcnNbaV0udGV4dENvbnRlbnQpO3NlbGVjdG9yc1tpXS5jbGFzc0xpc3QudG9nZ2xlKCdmaWx0ZXItbWF0Y2gnLHNlbGVjdG9yTWF0Y2hlc0ZpbHRlcik7fX0KX2NoZWNrV2lsbENhbmNlbEVkaXRpbmcoKXtjb25zdCB3aWxsQ2F1c2VDYW5jZWxFZGl0aW5nPXRoaXMuX3dpbGxDYXVzZUNhbmNlbEVkaXRpbmc7dGhpcy5fd2lsbENhdXNlQ2FuY2VsRWRpdGluZz1mYWxzZTtyZXR1cm4gd2lsbENhdXNlQ2FuY2VsRWRpdGluZzt9Cl9oYW5kbGVTZWxlY3RvckNvbnRhaW5lckNsaWNrKGV2ZW50KXtpZih0aGlzLl9jaGVja1dpbGxDYW5jZWxFZGl0aW5nKCl8fCF0aGlzLmVkaXRhYmxlKQpyZXR1cm47aWYoZXZlbnQudGFyZ2V0PT09dGhpcy5fc2VsZWN0b3JDb250YWluZXIpe3RoaXMuYWRkTmV3QmxhbmtQcm9wZXJ0eSgwKS5zdGFydEVkaXRpbmcoKTtldmVudC5jb25zdW1lKHRydWUpO319CmFkZE5ld0JsYW5rUHJvcGVydHkoaW5kZXg9dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUucm9vdEVsZW1lbnQoKS5jaGlsZENvdW50KCkpe2NvbnN0IHByb3BlcnR5PXRoaXMuX3N0eWxlLm5ld0JsYW5rUHJvcGVydHkoaW5kZXgpO2NvbnN0IGl0ZW09bmV3IEVsZW1lbnRzLlN0eWxlUHJvcGVydHlUcmVlRWxlbWVudCh0aGlzLl9wYXJlbnRQYW5lLHRoaXMuX21hdGNoZWRTdHlsZXMscHJvcGVydHksZmFsc2UsZmFsc2UsZmFsc2UsdHJ1ZSk7dGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuaW5zZXJ0Q2hpbGQoaXRlbSxwcm9wZXJ0eS5pbmRleCk7cmV0dXJuIGl0ZW07fQpfaGFuZGxlRW1wdHlTcGFjZU1vdXNlRG93bigpe3RoaXMuX3dpbGxDYXVzZUNhbmNlbEVkaXRpbmc9dGhpcy5fcGFyZW50UGFuZS5faXNFZGl0aW5nU3R5bGU7fQpfaGFuZGxlRW1wdHlTcGFjZUNsaWNrKGV2ZW50KXtpZighdGhpcy5lZGl0YWJsZXx8dGhpcy5lbGVtZW50Lmhhc1NlbGVjdGlvbigpfHx0aGlzLl9jaGVja1dpbGxDYW5jZWxFZGl0aW5nKCkpCnJldHVybjtpZihldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXInKXx8dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncmVhZC1vbmx5Jyl8fGV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdtZWRpYScpKXtldmVudC5jb25zdW1lKCk7cmV0dXJuO30KY29uc3QgZGVlcFRhcmdldD1ldmVudC5kZWVwRWxlbWVudEZyb21Qb2ludCgpO2lmKGRlZXBUYXJnZXQudHJlZUVsZW1lbnQpCnRoaXMuYWRkTmV3QmxhbmtQcm9wZXJ0eShkZWVwVGFyZ2V0LnRyZWVFbGVtZW50LnByb3BlcnR5LmluZGV4KzEpLnN0YXJ0RWRpdGluZygpO2Vsc2UKdGhpcy5hZGROZXdCbGFua1Byb3BlcnR5KCkuc3RhcnRFZGl0aW5nKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9oYW5kbGVNZWRpYVJ1bGVDbGljayhtZWRpYSxlbGVtZW50LGV2ZW50KXtpZihVSS5pc0JlaW5nRWRpdGVkKGVsZW1lbnQpKQpyZXR1cm47aWYoVUkuS2V5Ym9hcmRTaG9ydGN1dC5ldmVudEhhc0N0cmxPck1ldGEoKGV2ZW50KSkmJnRoaXMubmF2aWdhYmxlKXtjb25zdCBsb2NhdGlvbj1tZWRpYS5yYXdMb2NhdGlvbigpO2lmKCFsb2NhdGlvbil7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQpjb25zdCB1aUxvY2F0aW9uPUJpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24obG9jYXRpb24pO2lmKHVpTG9jYXRpb24pCkNvbW1vbi5SZXZlYWxlci5yZXZlYWwodWlMb2NhdGlvbik7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQppZighdGhpcy5lZGl0YWJsZXx8dGhpcy5faXNTQVNTU3R5bGUoKSkKcmV0dXJuO2NvbnN0IGNvbmZpZz1uZXcgVUkuSW5wbGFjZUVkaXRvci5Db25maWcodGhpcy5fZWRpdGluZ01lZGlhQ29tbWl0dGVkLmJpbmQodGhpcyxtZWRpYSksdGhpcy5fZWRpdGluZ01lZGlhQ2FuY2VsbGVkLmJpbmQodGhpcyxlbGVtZW50KSx1bmRlZmluZWQsdGhpcy5fZWRpdGluZ01lZGlhQmx1ckhhbmRsZXIuYmluZCh0aGlzKSk7VUkuSW5wbGFjZUVkaXRvci5zdGFydEVkaXRpbmcoZWxlbWVudCxjb25maWcpO3RoaXMuc3RhcnRFZGl0aW5nKCk7ZWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50KTt0aGlzLl9wYXJlbnRQYW5lLnNldEVkaXRpbmdTdHlsZSh0cnVlKTtjb25zdCBwYXJlbnRNZWRpYUVsZW1lbnQ9ZWxlbWVudC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdtZWRpYScpO3BhcmVudE1lZGlhRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlZGl0aW5nLW1lZGlhJyk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9lZGl0aW5nTWVkaWFGaW5pc2hlZChlbGVtZW50KXt0aGlzLl9wYXJlbnRQYW5lLnNldEVkaXRpbmdTdHlsZShmYWxzZSk7Y29uc3QgcGFyZW50TWVkaWFFbGVtZW50PWVsZW1lbnQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnbWVkaWEnKTtwYXJlbnRNZWRpYUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZWRpdGluZy1tZWRpYScpO3RoaXMuc3RvcEVkaXRpbmcoKTt9Cl9lZGl0aW5nTWVkaWFDYW5jZWxsZWQoZWxlbWVudCl7dGhpcy5fZWRpdGluZ01lZGlhRmluaXNoZWQoZWxlbWVudCk7dGhpcy5fbWFya1NlbGVjdG9yTWF0Y2hlcygpO2VsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCkuY29sbGFwc2UoZWxlbWVudCwwKTt9Cl9lZGl0aW5nTWVkaWFCbHVySGFuZGxlcihlZGl0b3IsYmx1ckV2ZW50KXtyZXR1cm4gdHJ1ZTt9Cl9lZGl0aW5nTWVkaWFDb21taXR0ZWQobWVkaWEsZWxlbWVudCxuZXdDb250ZW50LG9sZENvbnRlbnQsY29udGV4dCxtb3ZlRGlyZWN0aW9uKXt0aGlzLl9wYXJlbnRQYW5lLnNldEVkaXRpbmdTdHlsZShmYWxzZSk7dGhpcy5fZWRpdGluZ01lZGlhRmluaXNoZWQoZWxlbWVudCk7aWYobmV3Q29udGVudCkKbmV3Q29udGVudD1uZXdDb250ZW50LnRyaW0oKTtmdW5jdGlvbiB1c2VyQ2FsbGJhY2soc3VjY2Vzcyl7aWYoc3VjY2Vzcyl7dGhpcy5fbWF0Y2hlZFN0eWxlcy5yZXNldEFjdGl2ZVByb3BlcnRpZXMoKTt0aGlzLl9wYXJlbnRQYW5lLl9yZWZyZXNoVXBkYXRlKHRoaXMpO30KdGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKGZhbHNlKTt0aGlzLl9lZGl0aW5nTWVkaWFUZXh0Q29tbWl0dGVkRm9yVGVzdCgpO30KdGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKHRydWUpO3RoaXMuX3BhcmVudFBhbmUuY3NzTW9kZWwoKS5zZXRNZWRpYVRleHQobWVkaWEuc3R5bGVTaGVldElkLG1lZGlhLnJhbmdlLG5ld0NvbnRlbnQpLnRoZW4odXNlckNhbGxiYWNrLmJpbmQodGhpcykpO30KX2VkaXRpbmdNZWRpYVRleHRDb21taXR0ZWRGb3JUZXN0KCl7fQpfaGFuZGxlU2VsZWN0b3JDbGljayhldmVudCl7aWYoVUkuS2V5Ym9hcmRTaG9ydGN1dC5ldmVudEhhc0N0cmxPck1ldGEoKGV2ZW50KSkmJnRoaXMubmF2aWdhYmxlJiZldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaW1wbGUtc2VsZWN0b3InKSl7dGhpcy5fbmF2aWdhdGVUb1NlbGVjdG9yU291cmNlKGV2ZW50LnRhcmdldC5fc2VsZWN0b3JJbmRleCx0cnVlKTtldmVudC5jb25zdW1lKHRydWUpO3JldHVybjt9CnRoaXMuX3N0YXJ0RWRpdGluZ0F0Rmlyc3RQb3NpdGlvbigpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfbmF2aWdhdGVUb1NlbGVjdG9yU291cmNlKGluZGV4LGZvY3VzKXtjb25zdCBjc3NNb2RlbD10aGlzLl9wYXJlbnRQYW5lLmNzc01vZGVsKCk7Y29uc3QgcnVsZT10aGlzLl9zdHlsZS5wYXJlbnRSdWxlO2NvbnN0IGhlYWRlcj1jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQoKHJ1bGUuc3R5bGVTaGVldElkKSk7aWYoIWhlYWRlcikKcmV0dXJuO2NvbnN0IHJhd0xvY2F0aW9uPW5ldyBTREsuQ1NTTG9jYXRpb24oaGVhZGVyLHJ1bGUubGluZU51bWJlckluU291cmNlKGluZGV4KSxydWxlLmNvbHVtbk51bWJlckluU291cmNlKGluZGV4KSk7Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTtpZih1aUxvY2F0aW9uKQpDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHVpTG9jYXRpb24sIWZvY3VzKTt9Cl9zdGFydEVkaXRpbmdBdEZpcnN0UG9zaXRpb24oKXtpZighdGhpcy5lZGl0YWJsZXx8dGhpcy5faXNTQVNTU3R5bGUoKSkKcmV0dXJuO2lmKCF0aGlzLl9zdHlsZS5wYXJlbnRSdWxlKXt0aGlzLm1vdmVFZGl0b3JGcm9tU2VsZWN0b3IoJ2ZvcndhcmQnKTtyZXR1cm47fQp0aGlzLnN0YXJ0RWRpdGluZ1NlbGVjdG9yKCk7fQpzdGFydEVkaXRpbmdTZWxlY3Rvcigpe2NvbnN0IGVsZW1lbnQ9dGhpcy5fc2VsZWN0b3JFbGVtZW50O2lmKFVJLmlzQmVpbmdFZGl0ZWQoZWxlbWVudCkpCnJldHVybjtlbGVtZW50LnNjcm9sbEludG9WaWV3SWZOZWVkZWQoZmFsc2UpO2VsZW1lbnQudGV4dENvbnRlbnQ9ZWxlbWVudC50ZXh0Q29udGVudC5yZXBsYWNlKC9ccysvZywnICcpLnRyaW0oKTtjb25zdCBjb25maWc9bmV3IFVJLklucGxhY2VFZGl0b3IuQ29uZmlnKHRoaXMuZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkLmJpbmQodGhpcyksdGhpcy5lZGl0aW5nU2VsZWN0b3JDYW5jZWxsZWQuYmluZCh0aGlzKSk7VUkuSW5wbGFjZUVkaXRvci5zdGFydEVkaXRpbmcodGhpcy5fc2VsZWN0b3JFbGVtZW50LGNvbmZpZyk7dGhpcy5zdGFydEVkaXRpbmcoKTtlbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpLnNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnQpO3RoaXMuX3BhcmVudFBhbmUuc2V0RWRpdGluZ1N0eWxlKHRydWUpO2lmKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaW1wbGUtc2VsZWN0b3InKSkKdGhpcy5fbmF2aWdhdGVUb1NlbGVjdG9yU291cmNlKDAsZmFsc2UpO30KbW92ZUVkaXRvckZyb21TZWxlY3Rvcihtb3ZlRGlyZWN0aW9uKXt0aGlzLl9tYXJrU2VsZWN0b3JNYXRjaGVzKCk7aWYoIW1vdmVEaXJlY3Rpb24pCnJldHVybjtpZihtb3ZlRGlyZWN0aW9uPT09J2ZvcndhcmQnKXtsZXQgZmlyc3RDaGlsZD10aGlzLnByb3BlcnRpZXNUcmVlT3V0bGluZS5maXJzdENoaWxkKCk7d2hpbGUoZmlyc3RDaGlsZCYmZmlyc3RDaGlsZC5pbmhlcml0ZWQoKSkKZmlyc3RDaGlsZD1maXJzdENoaWxkLm5leHRTaWJsaW5nO2lmKCFmaXJzdENoaWxkKQp0aGlzLmFkZE5ld0JsYW5rUHJvcGVydHkoKS5zdGFydEVkaXRpbmcoKTtlbHNlCmZpcnN0Q2hpbGQuc3RhcnRFZGl0aW5nKGZpcnN0Q2hpbGQubmFtZUVsZW1lbnQpO31lbHNle2NvbnN0IHByZXZpb3VzU2VjdGlvbj10aGlzLnByZXZpb3VzRWRpdGFibGVTaWJsaW5nKCk7aWYoIXByZXZpb3VzU2VjdGlvbikKcmV0dXJuO3ByZXZpb3VzU2VjdGlvbi5hZGROZXdCbGFua1Byb3BlcnR5KCkuc3RhcnRFZGl0aW5nKCk7fX0KZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkKGVsZW1lbnQsbmV3Q29udGVudCxvbGRDb250ZW50LGNvbnRleHQsbW92ZURpcmVjdGlvbil7dGhpcy5fZWRpdGluZ1NlbGVjdG9yRW5kZWQoKTtpZihuZXdDb250ZW50KQpuZXdDb250ZW50PW5ld0NvbnRlbnQudHJpbSgpO2lmKG5ld0NvbnRlbnQ9PT1vbGRDb250ZW50KXt0aGlzLl9zZWxlY3RvckVsZW1lbnQudGV4dENvbnRlbnQ9bmV3Q29udGVudDt0aGlzLm1vdmVFZGl0b3JGcm9tU2VsZWN0b3IobW92ZURpcmVjdGlvbik7cmV0dXJuO30KY29uc3QgcnVsZT10aGlzLl9zdHlsZS5wYXJlbnRSdWxlO2lmKCFydWxlKQpyZXR1cm47ZnVuY3Rpb24gaGVhZGVyVGV4dENvbW1pdHRlZCgpe3RoaXMuX3BhcmVudFBhbmUuc2V0VXNlck9wZXJhdGlvbihmYWxzZSk7dGhpcy5tb3ZlRWRpdG9yRnJvbVNlbGVjdG9yKG1vdmVEaXJlY3Rpb24pO3RoaXMuX2VkaXRpbmdTZWxlY3RvckNvbW1pdHRlZEZvclRlc3QoKTt9CnRoaXMuX3BhcmVudFBhbmUuc2V0VXNlck9wZXJhdGlvbih0cnVlKTt0aGlzLl9zZXRIZWFkZXJUZXh0KHJ1bGUsbmV3Q29udGVudCkudGhlbihoZWFkZXJUZXh0Q29tbWl0dGVkLmJpbmQodGhpcykpO30KX3NldEhlYWRlclRleHQocnVsZSxuZXdDb250ZW50KXtmdW5jdGlvbiBvblNlbGVjdG9yc1VwZGF0ZWQocnVsZSxzdWNjZXNzKXtpZighc3VjY2VzcykKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiB0aGlzLl9tYXRjaGVkU3R5bGVzLnJlY29tcHV0ZU1hdGNoaW5nU2VsZWN0b3JzKHJ1bGUpLnRoZW4odXBkYXRlU291cmNlUmFuZ2VzLmJpbmQodGhpcyxydWxlKSk7fQpmdW5jdGlvbiB1cGRhdGVTb3VyY2VSYW5nZXMocnVsZSl7Y29uc3QgZG9lc0FmZmVjdFNlbGVjdGVkTm9kZT10aGlzLl9tYXRjaGVkU3R5bGVzLm1hdGNoaW5nU2VsZWN0b3JzKHJ1bGUpLmxlbmd0aD4wO3RoaXMucHJvcGVydGllc1RyZWVPdXRsaW5lLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnbm8tYWZmZWN0JywhZG9lc0FmZmVjdFNlbGVjdGVkTm9kZSk7dGhpcy5fbWF0Y2hlZFN0eWxlcy5yZXNldEFjdGl2ZVByb3BlcnRpZXMoKTt0aGlzLl9wYXJlbnRQYW5lLl9yZWZyZXNoVXBkYXRlKHRoaXMpO30KY29uc29sZS5hc3NlcnQocnVsZSBpbnN0YW5jZW9mIFNESy5DU1NTdHlsZVJ1bGUpO2NvbnN0IG9sZFNlbGVjdG9yUmFuZ2U9cnVsZS5zZWxlY3RvclJhbmdlKCk7aWYoIW9sZFNlbGVjdG9yUmFuZ2UpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtyZXR1cm4gcnVsZS5zZXRTZWxlY3RvclRleHQobmV3Q29udGVudCkudGhlbihvblNlbGVjdG9yc1VwZGF0ZWQuYmluZCh0aGlzLChydWxlKSxvbGRTZWxlY3RvclJhbmdlKSk7fQpfZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkRm9yVGVzdCgpe30KX3VwZGF0ZVJ1bGVPcmlnaW4oKXt0aGlzLl9zZWxlY3RvclJlZkVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9zZWxlY3RvclJlZkVsZW1lbnQuYXBwZW5kQ2hpbGQoRWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVSdWxlT3JpZ2luTm9kZSh0aGlzLl9tYXRjaGVkU3R5bGVzLHRoaXMuX3BhcmVudFBhbmUuX2xpbmtpZmllcix0aGlzLl9zdHlsZS5wYXJlbnRSdWxlKSk7fQpfZWRpdGluZ1NlbGVjdG9yRW5kZWQoKXt0aGlzLl9wYXJlbnRQYW5lLnNldEVkaXRpbmdTdHlsZShmYWxzZSk7dGhpcy5zdG9wRWRpdGluZygpO30KZWRpdGluZ1NlbGVjdG9yQ2FuY2VsbGVkKCl7dGhpcy5fZWRpdGluZ1NlbGVjdG9yRW5kZWQoKTt0aGlzLl9tYXJrU2VsZWN0b3JNYXRjaGVzKCk7fQpzdGFydEVkaXRpbmcoKXt0aGlzLl9tYW51YWxseVNldEhlaWdodCgpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsdGhpcy5fc2NoZWR1bGVIZWlnaHRVcGRhdGUsdHJ1ZSk7dGhpcy5fZWRpdGluZz10cnVlO30KX21hbnVhbGx5U2V0SGVpZ2h0KCl7dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD0odGhpcy5faW5uZXJFbGVtZW50LmNsaWVudEhlaWdodCsxKSsncHgnO3RoaXMuZWxlbWVudC5zdHlsZS5jb250YWluPSdzdHJpY3QnO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CnN0b3BFZGl0aW5nKCl7dGhpcy5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdoZWlnaHQnKTt0aGlzLmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2NvbnRhaW4nKTt0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX3NjaGVkdWxlSGVpZ2h0VXBkYXRlLHRydWUpO3RoaXMuX2VkaXRpbmc9ZmFsc2U7aWYodGhpcy5fcGFyZW50UGFuZS5lbGVtZW50PT09dGhpcy5fcGFyZW50UGFuZS5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVlcEFjdGl2ZUVsZW1lbnQoKSkKdGhpcy5lbGVtZW50LmZvY3VzKCk7fX07RWxlbWVudHMuQmxhbmtTdHlsZVByb3BlcnRpZXNTZWN0aW9uPWNsYXNzIGV4dGVuZHMgRWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbntjb25zdHJ1Y3RvcihzdHlsZXNQYW5lLG1hdGNoZWRTdHlsZXMsZGVmYXVsdFNlbGVjdG9yVGV4dCxzdHlsZVNoZWV0SWQscnVsZUxvY2F0aW9uLGluc2VydEFmdGVyU3R5bGUpe2NvbnN0IGNzc01vZGVsPShzdHlsZXNQYW5lLmNzc01vZGVsKCkpO2NvbnN0IHJ1bGU9U0RLLkNTU1N0eWxlUnVsZS5jcmVhdGVEdW1teVJ1bGUoY3NzTW9kZWwsZGVmYXVsdFNlbGVjdG9yVGV4dCk7c3VwZXIoc3R5bGVzUGFuZSxtYXRjaGVkU3R5bGVzLHJ1bGUuc3R5bGUpO3RoaXMuX25vcm1hbD1mYWxzZTt0aGlzLl9ydWxlTG9jYXRpb249cnVsZUxvY2F0aW9uO3RoaXMuX3N0eWxlU2hlZXRJZD1zdHlsZVNoZWV0SWQ7dGhpcy5fc2VsZWN0b3JSZWZFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fc2VsZWN0b3JSZWZFbGVtZW50LmFwcGVuZENoaWxkKEVsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24uX2xpbmtpZnlSdWxlTG9jYXRpb24oY3NzTW9kZWwsdGhpcy5fcGFyZW50UGFuZS5fbGlua2lmaWVyLHN0eWxlU2hlZXRJZCx0aGlzLl9hY3R1YWxSdWxlTG9jYXRpb24oKSkpO2lmKGluc2VydEFmdGVyU3R5bGUmJmluc2VydEFmdGVyU3R5bGUucGFyZW50UnVsZSkKdGhpcy5fY3JlYXRlTWVkaWFMaXN0KGluc2VydEFmdGVyU3R5bGUucGFyZW50UnVsZS5tZWRpYSk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2JsYW5rLXNlY3Rpb24nKTt9Cl9hY3R1YWxSdWxlTG9jYXRpb24oKXtjb25zdCBwcmVmaXg9dGhpcy5fcnVsZVByZWZpeCgpO2NvbnN0IGxpbmVzPXByZWZpeC5zcGxpdCgnXG4nKTtjb25zdCBlZGl0UmFuZ2U9bmV3IFRleHRVdGlscy5UZXh0UmFuZ2UoMCwwLGxpbmVzLmxlbmd0aC0xLGxpbmVzLnBlZWtMYXN0KCkubGVuZ3RoKTtyZXR1cm4gdGhpcy5fcnVsZUxvY2F0aW9uLnJlYmFzZUFmdGVyVGV4dEVkaXQoVGV4dFV0aWxzLlRleHRSYW5nZS5jcmVhdGVGcm9tTG9jYXRpb24oMCwwKSxlZGl0UmFuZ2UpO30KX3J1bGVQcmVmaXgoKXtyZXR1cm4gdGhpcy5fcnVsZUxvY2F0aW9uLnN0YXJ0TGluZT09PTAmJnRoaXMuX3J1bGVMb2NhdGlvbi5zdGFydENvbHVtbj09PTA/Jyc6J1xuXG4nO30KZ2V0IGlzQmxhbmsoKXtyZXR1cm4hdGhpcy5fbm9ybWFsO30KZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkKGVsZW1lbnQsbmV3Q29udGVudCxvbGRDb250ZW50LGNvbnRleHQsbW92ZURpcmVjdGlvbil7aWYoIXRoaXMuaXNCbGFuayl7c3VwZXIuZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkKGVsZW1lbnQsbmV3Q29udGVudCxvbGRDb250ZW50LGNvbnRleHQsbW92ZURpcmVjdGlvbik7cmV0dXJuO30KZnVuY3Rpb24gb25SdWxlQWRkZWQobmV3UnVsZSl7aWYoIW5ld1J1bGUpe3RoaXMuZWRpdGluZ1NlbGVjdG9yQ2FuY2VsbGVkKCk7dGhpcy5fZWRpdGluZ1NlbGVjdG9yQ29tbWl0dGVkRm9yVGVzdCgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CnJldHVybiB0aGlzLl9tYXRjaGVkU3R5bGVzLmFkZE5ld1J1bGUobmV3UnVsZSx0aGlzLl9tYXRjaGVkU3R5bGVzLm5vZGUoKSkudGhlbihvbkFkZGVkVG9DYXNjYWRlLmJpbmQodGhpcyxuZXdSdWxlKSk7fQpmdW5jdGlvbiBvbkFkZGVkVG9DYXNjYWRlKG5ld1J1bGUpe2NvbnN0IGRvZXNTZWxlY3RvckFmZmVjdFNlbGVjdGVkTm9kZT10aGlzLl9tYXRjaGVkU3R5bGVzLm1hdGNoaW5nU2VsZWN0b3JzKG5ld1J1bGUpLmxlbmd0aD4wO3RoaXMuX21ha2VOb3JtYWwobmV3UnVsZSk7aWYoIWRvZXNTZWxlY3RvckFmZmVjdFNlbGVjdGVkTm9kZSkKdGhpcy5wcm9wZXJ0aWVzVHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCduby1hZmZlY3QnKTt0aGlzLl91cGRhdGVSdWxlT3JpZ2luKCk7dGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKGZhbHNlKTt0aGlzLl9lZGl0aW5nU2VsZWN0b3JFbmRlZCgpO2lmKHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50KQp0aGlzLm1vdmVFZGl0b3JGcm9tU2VsZWN0b3IobW92ZURpcmVjdGlvbik7dGhpcy5fbWFya1NlbGVjdG9yTWF0Y2hlcygpO3RoaXMuX2VkaXRpbmdTZWxlY3RvckNvbW1pdHRlZEZvclRlc3QoKTt9CmlmKG5ld0NvbnRlbnQpCm5ld0NvbnRlbnQ9bmV3Q29udGVudC50cmltKCk7dGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKHRydWUpO2NvbnN0IGNzc01vZGVsPXRoaXMuX3BhcmVudFBhbmUuY3NzTW9kZWwoKTtjb25zdCBydWxlVGV4dD10aGlzLl9ydWxlUHJlZml4KCkrbmV3Q29udGVudCsnIHt9Jztjc3NNb2RlbC5hZGRSdWxlKHRoaXMuX3N0eWxlU2hlZXRJZCxydWxlVGV4dCx0aGlzLl9ydWxlTG9jYXRpb24pLnRoZW4ob25SdWxlQWRkZWQuYmluZCh0aGlzKSk7fQplZGl0aW5nU2VsZWN0b3JDYW5jZWxsZWQoKXt0aGlzLl9wYXJlbnRQYW5lLnNldFVzZXJPcGVyYXRpb24oZmFsc2UpO2lmKCF0aGlzLmlzQmxhbmspe3N1cGVyLmVkaXRpbmdTZWxlY3RvckNhbmNlbGxlZCgpO3JldHVybjt9CnRoaXMuX2VkaXRpbmdTZWxlY3RvckVuZGVkKCk7dGhpcy5fcGFyZW50UGFuZS5yZW1vdmVTZWN0aW9uKHRoaXMpO30KX21ha2VOb3JtYWwobmV3UnVsZSl7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2JsYW5rLXNlY3Rpb24nKTt0aGlzLl9zdHlsZT1uZXdSdWxlLnN0eWxlO3RoaXMuX25vcm1hbD10cnVlO319O0VsZW1lbnRzLlN0eWxlUHJvcGVydGllc1NlY3Rpb24uTWF4UHJvcGVydGllcz01MDtFbGVtZW50cy5LZXlmcmFtZVByb3BlcnRpZXNTZWN0aW9uPWNsYXNzIGV4dGVuZHMgRWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbntjb25zdHJ1Y3RvcihzdHlsZXNQYW5lLG1hdGNoZWRTdHlsZXMsc3R5bGUpe3N1cGVyKHN0eWxlc1BhbmUsbWF0Y2hlZFN0eWxlcyxzdHlsZSk7dGhpcy5fc2VsZWN0b3JFbGVtZW50LmNsYXNzTmFtZT0na2V5ZnJhbWUta2V5Jzt9Cl9oZWFkZXJUZXh0KCl7cmV0dXJuIHRoaXMuX3N0eWxlLnBhcmVudFJ1bGUua2V5KCkudGV4dDt9Cl9zZXRIZWFkZXJUZXh0KHJ1bGUsbmV3Q29udGVudCl7ZnVuY3Rpb24gdXBkYXRlU291cmNlUmFuZ2VzKHN1Y2Nlc3Mpe2lmKCFzdWNjZXNzKQpyZXR1cm47dGhpcy5fcGFyZW50UGFuZS5fcmVmcmVzaFVwZGF0ZSh0aGlzKTt9CmNvbnNvbGUuYXNzZXJ0KHJ1bGUgaW5zdGFuY2VvZiBTREsuQ1NTS2V5ZnJhbWVSdWxlKTtjb25zdCBvbGRSYW5nZT1ydWxlLmtleSgpLnJhbmdlO2lmKCFvbGRSYW5nZSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBydWxlLnNldEtleVRleHQobmV3Q29udGVudCkudGhlbih1cGRhdGVTb3VyY2VSYW5nZXMuYmluZCh0aGlzKSk7fQppc1Byb3BlcnR5SW5oZXJpdGVkKHByb3BlcnR5TmFtZSl7cmV0dXJuIGZhbHNlO30KX2lzUHJvcGVydHlPdmVybG9hZGVkKHByb3BlcnR5KXtyZXR1cm4gZmFsc2U7fQpfbWFya1NlbGVjdG9ySGlnaGxpZ2h0cygpe30KX21hcmtTZWxlY3Rvck1hdGNoZXMoKXt0aGlzLl9zZWxlY3RvckVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5fc3R5bGUucGFyZW50UnVsZS5rZXkoKS50ZXh0O30KX2hpZ2hsaWdodCgpe319O0VsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lLkNTU1Byb3BlcnR5UHJvbXB0PWNsYXNzIGV4dGVuZHMgVUkuVGV4dFByb21wdHtjb25zdHJ1Y3Rvcih0cmVlRWxlbWVudCxpc0VkaXRpbmdOYW1lKXtzdXBlcigpO3RoaXMuaW5pdGlhbGl6ZSh0aGlzLl9idWlsZFByb3BlcnR5Q29tcGxldGlvbnMuYmluZCh0aGlzKSxVSS5TdHlsZVZhbHVlRGVsaW1pdGVycyk7dGhpcy5faXNDb2xvckF3YXJlPVNESy5jc3NNZXRhZGF0YSgpLmlzQ29sb3JBd2FyZVByb3BlcnR5KHRyZWVFbGVtZW50LnByb3BlcnR5Lm5hbWUpO3RoaXMuX2Nzc0NvbXBsZXRpb25zPVtdO2lmKGlzRWRpdGluZ05hbWUpe3RoaXMuX2Nzc0NvbXBsZXRpb25zPVNESy5jc3NNZXRhZGF0YSgpLmFsbFByb3BlcnRpZXMoKTtpZighdHJlZUVsZW1lbnQubm9kZSgpLmlzU1ZHTm9kZSgpKQp0aGlzLl9jc3NDb21wbGV0aW9ucz10aGlzLl9jc3NDb21wbGV0aW9ucy5maWx0ZXIocHJvcGVydHk9PiFTREsuY3NzTWV0YWRhdGEoKS5pc1NWR1Byb3BlcnR5KHByb3BlcnR5KSk7fWVsc2V7dGhpcy5fY3NzQ29tcGxldGlvbnM9U0RLLmNzc01ldGFkYXRhKCkucHJvcGVydHlWYWx1ZXModHJlZUVsZW1lbnQubmFtZUVsZW1lbnQudGV4dENvbnRlbnQpO30KdGhpcy5fdHJlZUVsZW1lbnQ9dHJlZUVsZW1lbnQ7dGhpcy5faXNFZGl0aW5nTmFtZT1pc0VkaXRpbmdOYW1lO3RoaXMuX2Nzc1ZhcmlhYmxlcz10cmVlRWxlbWVudC5tYXRjaGVkU3R5bGVzKCkuYXZhaWxhYmxlQ1NTVmFyaWFibGVzKHRyZWVFbGVtZW50LnByb3BlcnR5Lm93bmVyU3R5bGUpO2lmKHRoaXMuX2Nzc1ZhcmlhYmxlcy5sZW5ndGg8MTAwMCkKdGhpcy5fY3NzVmFyaWFibGVzLnNvcnQoU3RyaW5nLm5hdHVyYWxPcmRlckNvbXBhcmF0b3IpO2Vsc2UKdGhpcy5fY3NzVmFyaWFibGVzLnNvcnQoKTtpZighaXNFZGl0aW5nTmFtZSl7dGhpcy5kaXNhYmxlRGVmYXVsdFN1Z2dlc3Rpb25Gb3JFbXB0eUlucHV0KCk7aWYodHJlZUVsZW1lbnQmJnRyZWVFbGVtZW50LnZhbHVlRWxlbWVudCl7Y29uc3QgY3NzVmFsdWVUZXh0PXRyZWVFbGVtZW50LnZhbHVlRWxlbWVudC50ZXh0Q29udGVudDtpZihjc3NWYWx1ZVRleHQubWF0Y2goLyNbXGRhLWZdezMsNn0kL2kpKXt0aGlzLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnSW5jcmVtZW50L2RlY3JlbWVudCB3aXRoIG1vdXNld2hlZWwgb3IgdXAvZG93biBrZXlzLiAlczogUiDCsTEsIFNoaWZ0OiBHIMKxMSwgQWx0OiBCIMKxMScsSG9zdC5pc01hYygpPydDbWQnOidDdHJsJykpO31lbHNlIGlmKGNzc1ZhbHVlVGV4dC5tYXRjaCgvXGQrLykpe3RoaXMuc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdJbmNyZW1lbnQvZGVjcmVtZW50IHdpdGggbW91c2V3aGVlbCBvciB1cC9kb3duIGtleXMuICVzOiDCsTEwMCwgU2hpZnQ6IMKxMTAsIEFsdDogwrEwLjEnLEhvc3QuaXNNYWMoKT8nQ21kJzonQ3RybCcpKTt9fX19Cm9uS2V5RG93bihldmVudCl7c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdBcnJvd1VwJzpjYXNlJ0Fycm93RG93bic6Y2FzZSdQYWdlVXAnOmNhc2UnUGFnZURvd24nOmlmKHRoaXMuX2hhbmRsZU5hbWVPclZhbHVlVXBEb3duKGV2ZW50KSl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXR1cm47fQpicmVhaztjYXNlJ0VudGVyJzp0aGlzLnRhYktleVByZXNzZWQoKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybjt9CnN1cGVyLm9uS2V5RG93bihldmVudCk7fQpvbk1vdXNlV2hlZWwoZXZlbnQpe2lmKHRoaXMuX2hhbmRsZU5hbWVPclZhbHVlVXBEb3duKGV2ZW50KSl7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQpzdXBlci5vbk1vdXNlV2hlZWwoZXZlbnQpO30KdGFiS2V5UHJlc3NlZCgpe3RoaXMuYWNjZXB0QXV0b0NvbXBsZXRlKCk7cmV0dXJuIGZhbHNlO30KX2hhbmRsZU5hbWVPclZhbHVlVXBEb3duKGV2ZW50KXtmdW5jdGlvbiBmaW5pc2hIYW5kbGVyKG9yaWdpbmFsVmFsdWUscmVwbGFjZW1lbnRTdHJpbmcpe3RoaXMuX3RyZWVFbGVtZW50LmFwcGx5U3R5bGVUZXh0KHRoaXMuX3RyZWVFbGVtZW50Lm5hbWVFbGVtZW50LnRleHRDb250ZW50Kyc6ICcrdGhpcy5fdHJlZUVsZW1lbnQudmFsdWVFbGVtZW50LnRleHRDb250ZW50LGZhbHNlKTt9CmZ1bmN0aW9uIGN1c3RvbU51bWJlckhhbmRsZXIocHJlZml4LG51bWJlcixzdWZmaXgpe2lmKG51bWJlciE9PTAmJiFzdWZmaXgubGVuZ3RoJiZTREsuY3NzTWV0YWRhdGEoKS5pc0xlbmd0aFByb3BlcnR5KHRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5Lm5hbWUpKQpzdWZmaXg9J3B4JztyZXR1cm4gcHJlZml4K251bWJlcitzdWZmaXg7fQppZighdGhpcy5faXNFZGl0aW5nTmFtZSYmdGhpcy5fdHJlZUVsZW1lbnQudmFsdWVFbGVtZW50JiZVSS5oYW5kbGVFbGVtZW50VmFsdWVNb2RpZmljYXRpb25zKGV2ZW50LHRoaXMuX3RyZWVFbGVtZW50LnZhbHVlRWxlbWVudCxmaW5pc2hIYW5kbGVyLmJpbmQodGhpcyksdGhpcy5faXNWYWx1ZVN1Z2dlc3Rpb24uYmluZCh0aGlzKSxjdXN0b21OdW1iZXJIYW5kbGVyLmJpbmQodGhpcykpKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2U7fQpfaXNWYWx1ZVN1Z2dlc3Rpb24od29yZCl7aWYoIXdvcmQpCnJldHVybiBmYWxzZTt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gdGhpcy5fY3NzQ29tcGxldGlvbnMuaW5kZXhPZih3b3JkKSE9PS0xfHx3b3JkLnN0YXJ0c1dpdGgoJy0tJyk7fQpfYnVpbGRQcm9wZXJ0eUNvbXBsZXRpb25zKGV4cHJlc3Npb24scXVlcnksZm9yY2Upe2NvbnN0IGxvd2VyUXVlcnk9cXVlcnkudG9Mb3dlckNhc2UoKTtjb25zdCBlZGl0aW5nVmFyaWFibGU9IXRoaXMuX2lzRWRpdGluZ05hbWUmJmV4cHJlc3Npb24udHJpbSgpLmVuZHNXaXRoKCd2YXIoJyk7aWYoIXF1ZXJ5JiYhZm9yY2UmJiFlZGl0aW5nVmFyaWFibGUmJih0aGlzLl9pc0VkaXRpbmdOYW1lfHxleHByZXNzaW9uKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7Y29uc3QgcHJlZml4UmVzdWx0cz1bXTtjb25zdCBhbnl3aGVyZVJlc3VsdHM9W107aWYoIWVkaXRpbmdWYXJpYWJsZSkKdGhpcy5fY3NzQ29tcGxldGlvbnMuZm9yRWFjaChjb21wbGV0aW9uPT5maWx0ZXJDb21wbGV0aW9ucy5jYWxsKHRoaXMsY29tcGxldGlvbixmYWxzZSkpO2lmKHRoaXMuX2lzRWRpdGluZ05hbWV8fGVkaXRpbmdWYXJpYWJsZSkKdGhpcy5fY3NzVmFyaWFibGVzLmZvckVhY2godmFyaWFibGU9PmZpbHRlckNvbXBsZXRpb25zLmNhbGwodGhpcyx2YXJpYWJsZSx0cnVlKSk7Y29uc3QgcmVzdWx0cz1wcmVmaXhSZXN1bHRzLmNvbmNhdChhbnl3aGVyZVJlc3VsdHMpO2lmKCF0aGlzLl9pc0VkaXRpbmdOYW1lJiYhcmVzdWx0cy5sZW5ndGgmJnF1ZXJ5Lmxlbmd0aD4xJiYnIWltcG9ydGFudCcuc3RhcnRzV2l0aChsb3dlclF1ZXJ5KSkKcmVzdWx0cy5wdXNoKHt0ZXh0OichaW1wb3J0YW50J30pO2NvbnN0IHVzZXJFbnRlcmVkVGV4dD1xdWVyeS5yZXBsYWNlKCctJywnJyk7aWYodXNlckVudGVyZWRUZXh0JiYodXNlckVudGVyZWRUZXh0PT09dXNlckVudGVyZWRUZXh0LnRvVXBwZXJDYXNlKCkpKXtmb3IobGV0IGk9MDtpPHJlc3VsdHMubGVuZ3RoOysraSl7aWYoIXJlc3VsdHNbaV0udGV4dC5zdGFydHNXaXRoKCctLScpKQpyZXN1bHRzW2ldLnRleHQ9cmVzdWx0c1tpXS50ZXh0LnRvVXBwZXJDYXNlKCk7fX0KaWYoZWRpdGluZ1ZhcmlhYmxlKXtyZXN1bHRzLmZvckVhY2gocmVzdWx0PT57cmVzdWx0LnRpdGxlPXJlc3VsdC50ZXh0O3Jlc3VsdC50ZXh0Kz0nKSc7fSk7fQppZih0aGlzLl9pc0NvbG9yQXdhcmUmJiF0aGlzLl9pc0VkaXRpbmdOYW1lKXtyZXN1bHRzLnN0YWJsZVNvcnQoKGEsYik9PntpZighIWEuc3VidGl0bGVSZW5kZXJlcj09PSEhYi5zdWJ0aXRsZVJlbmRlcmVyKQpyZXR1cm4gMDtyZXR1cm4gYS5zdWJ0aXRsZVJlbmRlcmVyPy0xOjE7fSk7fQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO2Z1bmN0aW9uIGZpbHRlckNvbXBsZXRpb25zKGNvbXBsZXRpb24sdmFyaWFibGUpe2NvbnN0IGluZGV4PWNvbXBsZXRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGxvd2VyUXVlcnkpO2NvbnN0IHJlc3VsdD17dGV4dDpjb21wbGV0aW9ufTtpZih2YXJpYWJsZSl7Y29uc3QgY29tcHV0ZWRWYWx1ZT10aGlzLl90cmVlRWxlbWVudC5tYXRjaGVkU3R5bGVzKCkuY29tcHV0ZUNTU1ZhcmlhYmxlKHRoaXMuX3RyZWVFbGVtZW50LnByb3BlcnR5Lm93bmVyU3R5bGUsY29tcGxldGlvbik7aWYoY29tcHV0ZWRWYWx1ZSl7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGNvbXB1dGVkVmFsdWUpO2lmKGNvbG9yKQpyZXN1bHQuc3VidGl0bGVSZW5kZXJlcj1zd2F0Y2hSZW5kZXJlci5iaW5kKG51bGwsY29sb3IpO319CmlmKGluZGV4PT09MCl7cmVzdWx0LnByaW9yaXR5PXRoaXMuX2lzRWRpdGluZ05hbWU/U0RLLmNzc01ldGFkYXRhKCkucHJvcGVydHlVc2FnZVdlaWdodChjb21wbGV0aW9uKToxO3ByZWZpeFJlc3VsdHMucHVzaChyZXN1bHQpO31lbHNlIGlmKGluZGV4Pi0xKXthbnl3aGVyZVJlc3VsdHMucHVzaChyZXN1bHQpO319CmZ1bmN0aW9uIHN3YXRjaFJlbmRlcmVyKGNvbG9yKXtjb25zdCBzd2F0Y2g9SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLmNyZWF0ZSgpO3N3YXRjaC5oaWRlVGV4dCh0cnVlKTtzd2F0Y2guc2V0Q29sb3IoY29sb3IpO3N3YXRjaC5zdHlsZS5wb2ludGVyRXZlbnRzPSdub25lJztyZXR1cm4gc3dhdGNoO319fTtFbGVtZW50cy5TdHlsZXNTaWRlYmFyUHJvcGVydHlSZW5kZXJlcj1jbGFzc3tjb25zdHJ1Y3RvcihydWxlLG5vZGUsbmFtZSx2YWx1ZSl7dGhpcy5fcnVsZT1ydWxlO3RoaXMuX25vZGU9bm9kZTt0aGlzLl9wcm9wZXJ0eU5hbWU9bmFtZTt0aGlzLl9wcm9wZXJ0eVZhbHVlPXZhbHVlO3RoaXMuX2NvbG9ySGFuZGxlcj1udWxsO3RoaXMuX2JlemllckhhbmRsZXI9bnVsbDt0aGlzLl9zaGFkb3dIYW5kbGVyPW51bGw7dGhpcy5fdmFySGFuZGxlcj1jcmVhdGVUZXh0Tm9kZTt9CnNldENvbG9ySGFuZGxlcihoYW5kbGVyKXt0aGlzLl9jb2xvckhhbmRsZXI9aGFuZGxlcjt9CnNldEJlemllckhhbmRsZXIoaGFuZGxlcil7dGhpcy5fYmV6aWVySGFuZGxlcj1oYW5kbGVyO30Kc2V0U2hhZG93SGFuZGxlcihoYW5kbGVyKXt0aGlzLl9zaGFkb3dIYW5kbGVyPWhhbmRsZXI7fQpzZXRWYXJIYW5kbGVyKGhhbmRsZXIpe3RoaXMuX3ZhckhhbmRsZXI9aGFuZGxlcjt9CnJlbmRlck5hbWUoKXtjb25zdCBuYW1lRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bmFtZUVsZW1lbnQuY2xhc3NOYW1lPSd3ZWJraXQtY3NzLXByb3BlcnR5JztuYW1lRWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9wcm9wZXJ0eU5hbWU7bmFtZUVsZW1lbnQubm9ybWFsaXplKCk7cmV0dXJuIG5hbWVFbGVtZW50O30KcmVuZGVyVmFsdWUoKXtjb25zdCB2YWx1ZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3ZhbHVlRWxlbWVudC5jbGFzc05hbWU9J3ZhbHVlJztpZighdGhpcy5fcHJvcGVydHlWYWx1ZSkKcmV0dXJuIHZhbHVlRWxlbWVudDtpZih0aGlzLl9zaGFkb3dIYW5kbGVyJiYodGhpcy5fcHJvcGVydHlOYW1lPT09J2JveC1zaGFkb3cnfHx0aGlzLl9wcm9wZXJ0eU5hbWU9PT0ndGV4dC1zaGFkb3cnfHx0aGlzLl9wcm9wZXJ0eU5hbWU9PT0nLXdlYmtpdC1ib3gtc2hhZG93JykmJiFTREsuQ1NTTWV0YWRhdGEuVmFyaWFibGVSZWdleC50ZXN0KHRoaXMuX3Byb3BlcnR5VmFsdWUpKXt2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2hhZG93SGFuZGxlcih0aGlzLl9wcm9wZXJ0eVZhbHVlLHRoaXMuX3Byb3BlcnR5TmFtZSkpO3ZhbHVlRWxlbWVudC5ub3JtYWxpemUoKTtyZXR1cm4gdmFsdWVFbGVtZW50O30KY29uc3QgcmVnZXhlcz1bU0RLLkNTU01ldGFkYXRhLlZhcmlhYmxlUmVnZXgsU0RLLkNTU01ldGFkYXRhLlVSTFJlZ2V4XTtjb25zdCBwcm9jZXNzb3JzPVt0aGlzLl92YXJIYW5kbGVyLHRoaXMuX3Byb2Nlc3NVUkwuYmluZCh0aGlzKV07aWYodGhpcy5fYmV6aWVySGFuZGxlciYmU0RLLmNzc01ldGFkYXRhKCkuaXNCZXppZXJBd2FyZVByb3BlcnR5KHRoaXMuX3Byb3BlcnR5TmFtZSkpe3JlZ2V4ZXMucHVzaChVSS5HZW9tZXRyeS5DdWJpY0Jlemllci5SZWdleCk7cHJvY2Vzc29ycy5wdXNoKHRoaXMuX2JlemllckhhbmRsZXIpO30KaWYodGhpcy5fY29sb3JIYW5kbGVyJiZTREsuY3NzTWV0YWRhdGEoKS5pc0NvbG9yQXdhcmVQcm9wZXJ0eSh0aGlzLl9wcm9wZXJ0eU5hbWUpKXtyZWdleGVzLnB1c2goQ29tbW9uLkNvbG9yLlJlZ2V4KTtwcm9jZXNzb3JzLnB1c2godGhpcy5fY29sb3JIYW5kbGVyKTt9CmNvbnN0IHJlc3VsdHM9VGV4dFV0aWxzLlRleHRVdGlscy5zcGxpdFN0cmluZ0J5UmVnZXhlcyh0aGlzLl9wcm9wZXJ0eVZhbHVlLHJlZ2V4ZXMpO2ZvcihsZXQgaT0wO2k8cmVzdWx0cy5sZW5ndGg7aSsrKXtjb25zdCByZXN1bHQ9cmVzdWx0c1tpXTtjb25zdCBwcm9jZXNzb3I9cmVzdWx0LnJlZ2V4SW5kZXg9PT0tMT9jcmVhdGVUZXh0Tm9kZTpwcm9jZXNzb3JzW3Jlc3VsdC5yZWdleEluZGV4XTt2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvY2Vzc29yKHJlc3VsdC52YWx1ZSkpO30KdmFsdWVFbGVtZW50Lm5vcm1hbGl6ZSgpO3JldHVybiB2YWx1ZUVsZW1lbnQ7fQpfcHJvY2Vzc1VSTCh0ZXh0KXtsZXQgdXJsPXRleHQuc3Vic3RyaW5nKDQsdGV4dC5sZW5ndGgtMSkudHJpbSgpO2NvbnN0IGlzUXVvdGVkPS9eJy4qJyQvLnRlc3QodXJsKXx8L14iLioiJC8udGVzdCh1cmwpO2lmKGlzUXVvdGVkKQp1cmw9dXJsLnN1YnN0cmluZygxLHVybC5sZW5ndGgtMSk7Y29uc3QgY29udGFpbmVyPWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjb250YWluZXIuY3JlYXRlVGV4dENoaWxkKCd1cmwoJyk7bGV0IGhyZWZVcmw9bnVsbDtpZih0aGlzLl9ydWxlJiZ0aGlzLl9ydWxlLnJlc291cmNlVVJMKCkpCmhyZWZVcmw9Q29tbW9uLlBhcnNlZFVSTC5jb21wbGV0ZVVSTCh0aGlzLl9ydWxlLnJlc291cmNlVVJMKCksdXJsKTtlbHNlIGlmKHRoaXMuX25vZGUpCmhyZWZVcmw9dGhpcy5fbm9kZS5yZXNvbHZlVVJMKHVybCk7Y29udGFpbmVyLmFwcGVuZENoaWxkKENvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwoaHJlZlVybHx8dXJsLHt0ZXh0OnVybCxwcmV2ZW50Q2xpY2s6dHJ1ZX0pKTtjb250YWluZXIuY3JlYXRlVGV4dENoaWxkKCcpJyk7cmV0dXJuIGNvbnRhaW5lcjt9fTtFbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5CdXR0b25Qcm92aWRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2J1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ05ldyBTdHlsZSBSdWxlJyksJ2xhcmdlaWNvbi1hZGQnKTt0aGlzLl9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9jbGlja2VkLHRoaXMpO2NvbnN0IGxvbmdjbGlja1RyaWFuZ2xlPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbG9uZ2NsaWNrLXRyaWFuZ2xlJywnbG9uZy1jbGljay1nbHlwaCcpO3RoaXMuX2J1dHRvbi5lbGVtZW50LmFwcGVuZENoaWxkKGxvbmdjbGlja1RyaWFuZ2xlKTtuZXcgVUkuTG9uZ0NsaWNrQ29udHJvbGxlcih0aGlzLl9idXR0b24uZWxlbWVudCx0aGlzLl9sb25nQ2xpY2tlZC5iaW5kKHRoaXMpKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLG9uTm9kZUNoYW5nZWQuYmluZCh0aGlzKSk7b25Ob2RlQ2hhbmdlZC5jYWxsKHRoaXMpO2Z1bmN0aW9uIG9uTm9kZUNoYW5nZWQoKXtsZXQgbm9kZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRE9NTm9kZSk7bm9kZT1ub2RlP25vZGUuZW5jbG9zaW5nRWxlbWVudE9yU2VsZigpOm51bGw7dGhpcy5fYnV0dG9uLnNldEVuYWJsZWQoISFub2RlKTt9fQpfY2xpY2tlZChldmVudCl7RWxlbWVudHMuU3R5bGVzU2lkZWJhclBhbmUuX2luc3RhbmNlLl9jcmVhdGVOZXdSdWxlSW5WaWFJbnNwZWN0b3JTdHlsZVNoZWV0KCk7fQpfbG9uZ0NsaWNrZWQoZSl7RWxlbWVudHMuU3R5bGVzU2lkZWJhclBhbmUuX2luc3RhbmNlLl9vbkFkZEJ1dHRvbkxvbmdDbGljayhlKTt9Cml0ZW0oKXtyZXR1cm4gdGhpcy5fYnV0dG9uO319OztFbGVtZW50cy5TdHlsZVByb3BlcnR5VHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdHlsZXNQYW5lLG1hdGNoZWRTdHlsZXMscHJvcGVydHksaXNTaG9ydGhhbmQsaW5oZXJpdGVkLG92ZXJsb2FkZWQsbmV3UHJvcGVydHkpe3N1cGVyKCcnLGlzU2hvcnRoYW5kKTt0aGlzLl9zdHlsZT1wcm9wZXJ0eS5vd25lclN0eWxlO3RoaXMuX21hdGNoZWRTdHlsZXM9bWF0Y2hlZFN0eWxlczt0aGlzLnByb3BlcnR5PXByb3BlcnR5O3RoaXMuX2luaGVyaXRlZD1pbmhlcml0ZWQ7dGhpcy5fb3ZlcmxvYWRlZD1vdmVybG9hZGVkO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLl9wYXJlbnRQYW5lPXN0eWxlc1BhbmU7dGhpcy5pc1Nob3J0aGFuZD1pc1Nob3J0aGFuZDt0aGlzLl9hcHBseVN0eWxlVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDApO3RoaXMuX25ld1Byb3BlcnR5PW5ld1Byb3BlcnR5O2lmKHRoaXMuX25ld1Byb3BlcnR5KQp0aGlzLmxpc3RJdGVtRWxlbWVudC50ZXh0Q29udGVudD0nJzt0aGlzLl9leHBhbmRlZER1ZVRvRmlsdGVyPWZhbHNlO3RoaXMudmFsdWVFbGVtZW50PW51bGw7dGhpcy5uYW1lRWxlbWVudD1udWxsO3RoaXMuX2V4cGFuZEVsZW1lbnQ9bnVsbDt0aGlzLl9vcmlnaW5hbFByb3BlcnR5VGV4dD0nJzt0aGlzLl9wcm9tcHQ9bnVsbDt0aGlzLl9wcm9wZXJ0eUhhc0JlZW5FZGl0ZWRJbmNyZW1lbnRhbGx5PWZhbHNlO3RoaXMuX2xhc3RDb21wdXRlZFZhbHVlPW51bGw7fQptYXRjaGVkU3R5bGVzKCl7cmV0dXJuIHRoaXMuX21hdGNoZWRTdHlsZXM7fQpfZWRpdGFibGUoKXtyZXR1cm4hISh0aGlzLl9zdHlsZS5zdHlsZVNoZWV0SWQmJnRoaXMuX3N0eWxlLnJhbmdlKTt9CmluaGVyaXRlZCgpe3JldHVybiB0aGlzLl9pbmhlcml0ZWQ7fQpvdmVybG9hZGVkKCl7cmV0dXJuIHRoaXMuX292ZXJsb2FkZWQ7fQpzZXRPdmVybG9hZGVkKHgpe2lmKHg9PT10aGlzLl9vdmVybG9hZGVkKQpyZXR1cm47dGhpcy5fb3ZlcmxvYWRlZD14O3RoaXMuX3VwZGF0ZVN0YXRlKCk7fQpnZXQgbmFtZSgpe3JldHVybiB0aGlzLnByb3BlcnR5Lm5hbWU7fQpnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5wcm9wZXJ0eS52YWx1ZTt9Cl91cGRhdGVGaWx0ZXIoKXtjb25zdCByZWdleD10aGlzLl9wYXJlbnRQYW5lLmZpbHRlclJlZ2V4KCk7Y29uc3QgbWF0Y2hlcz0hIXJlZ2V4JiYocmVnZXgudGVzdCh0aGlzLnByb3BlcnR5Lm5hbWUpfHxyZWdleC50ZXN0KHRoaXMucHJvcGVydHkudmFsdWUpKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdmaWx0ZXItbWF0Y2gnLG1hdGNoZXMpO3RoaXMub25wb3B1bGF0ZSgpO2xldCBoYXNNYXRjaGluZ0NoaWxkcmVuPWZhbHNlO2ZvcihsZXQgaT0wO2k8dGhpcy5jaGlsZENvdW50KCk7KytpKQpoYXNNYXRjaGluZ0NoaWxkcmVufD10aGlzLmNoaWxkQXQoaSkuX3VwZGF0ZUZpbHRlcigpO2lmKCFyZWdleCl7aWYodGhpcy5fZXhwYW5kZWREdWVUb0ZpbHRlcikKdGhpcy5jb2xsYXBzZSgpO3RoaXMuX2V4cGFuZGVkRHVlVG9GaWx0ZXI9ZmFsc2U7fWVsc2UgaWYoaGFzTWF0Y2hpbmdDaGlsZHJlbiYmIXRoaXMuZXhwYW5kZWQpe3RoaXMuZXhwYW5kKCk7dGhpcy5fZXhwYW5kZWREdWVUb0ZpbHRlcj10cnVlO31lbHNlIGlmKCFoYXNNYXRjaGluZ0NoaWxkcmVuJiZ0aGlzLmV4cGFuZGVkJiZ0aGlzLl9leHBhbmRlZER1ZVRvRmlsdGVyKXt0aGlzLmNvbGxhcHNlKCk7dGhpcy5fZXhwYW5kZWREdWVUb0ZpbHRlcj1mYWxzZTt9CnJldHVybiBtYXRjaGVzO30KX3Byb2Nlc3NDb2xvcih0ZXh0KXtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IucGFyc2UodGV4dCk7aWYoIWNvbG9yKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUodGV4dCk7aWYoIXRoaXMuX2VkaXRhYmxlKCkpe2NvbnN0IHN3YXRjaD1JbmxpbmVFZGl0b3IuQ29sb3JTd2F0Y2guY3JlYXRlKCk7c3dhdGNoLnNldENvbG9yKGNvbG9yKTtyZXR1cm4gc3dhdGNoO30KY29uc3Qgc3dhdGNoUG9wb3ZlckhlbHBlcj10aGlzLl9wYXJlbnRQYW5lLnN3YXRjaFBvcG92ZXJIZWxwZXIoKTtjb25zdCBzd2F0Y2g9SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLmNyZWF0ZSgpO3N3YXRjaC5zZXRDb2xvcihjb2xvcik7c3dhdGNoLnNldEZvcm1hdChDb21tb24uQ29sb3IuZGV0ZWN0Q29sb3JGb3JtYXQoc3dhdGNoLmNvbG9yKCkpKTtjb25zdCBzd2F0Y2hJY29uPW5ldyBFbGVtZW50cy5Db2xvclN3YXRjaFBvcG92ZXJJY29uKHRoaXMsc3dhdGNoUG9wb3ZlckhlbHBlcixzd2F0Y2gpO2Z1bmN0aW9uIGNvbXB1dGVkQ2FsbGJhY2soY29udHJhc3RJbmZvKXtzd2F0Y2hJY29uLnNldENvbnRyYXN0SW5mbyhjb250cmFzdEluZm8pO30KaWYoUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ2NvbG9yQ29udHJhc3RSYXRpbycpJiZ0aGlzLnByb3BlcnR5Lm5hbWU9PT0nY29sb3InJiZ0aGlzLl9wYXJlbnRQYW5lLmNzc01vZGVsKCkmJnRoaXMubm9kZSgpKXtjb25zdCBjc3NNb2RlbD10aGlzLl9wYXJlbnRQYW5lLmNzc01vZGVsKCk7Y3NzTW9kZWwuYmFja2dyb3VuZENvbG9yc1Byb21pc2UodGhpcy5ub2RlKCkuaWQpLnRoZW4oY29tcHV0ZWRDYWxsYmFjayk7fQpyZXR1cm4gc3dhdGNoO30KX3Byb2Nlc3NWYXIodGV4dCl7Y29uc3QgY29tcHV0ZWRWYWx1ZT10aGlzLl9tYXRjaGVkU3R5bGVzLmNvbXB1dGVWYWx1ZSh0aGlzLl9zdHlsZSx0ZXh0KTtpZighY29tcHV0ZWRWYWx1ZSkKcmV0dXJuIGNyZWF0ZVRleHROb2RlKHRleHQpO2NvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShjb21wdXRlZFZhbHVlKTtpZighY29sb3Ipe2NvbnN0IG5vZGU9Y3JlYXRlRWxlbWVudCgnc3BhbicpO25vZGUudGV4dENvbnRlbnQ9dGV4dDtub2RlLnRpdGxlPWNvbXB1dGVkVmFsdWU7cmV0dXJuIG5vZGU7fQppZighdGhpcy5fZWRpdGFibGUoKSl7Y29uc3Qgc3dhdGNoPUlubGluZUVkaXRvci5Db2xvclN3YXRjaC5jcmVhdGUoKTtzd2F0Y2guc2V0VGV4dCh0ZXh0LGNvbXB1dGVkVmFsdWUpO3N3YXRjaC5zZXRDb2xvcihjb2xvcik7cmV0dXJuIHN3YXRjaDt9CmNvbnN0IHN3YXRjaFBvcG92ZXJIZWxwZXI9dGhpcy5fcGFyZW50UGFuZS5zd2F0Y2hQb3BvdmVySGVscGVyKCk7Y29uc3Qgc3dhdGNoPUlubGluZUVkaXRvci5Db2xvclN3YXRjaC5jcmVhdGUoKTtzd2F0Y2guc2V0Q29sb3IoY29sb3IpO3N3YXRjaC5zZXRGb3JtYXQoQ29tbW9uLkNvbG9yLmRldGVjdENvbG9yRm9ybWF0KHN3YXRjaC5jb2xvcigpKSk7c3dhdGNoLnNldFRleHQodGV4dCxjb21wdXRlZFZhbHVlKTtuZXcgRWxlbWVudHMuQ29sb3JTd2F0Y2hQb3BvdmVySWNvbih0aGlzLHN3YXRjaFBvcG92ZXJIZWxwZXIsc3dhdGNoKTtyZXR1cm4gc3dhdGNoO30KcmVuZGVyZWRQcm9wZXJ0eVRleHQoKXtyZXR1cm4gdGhpcy5uYW1lRWxlbWVudC50ZXh0Q29udGVudCsnOiAnK3RoaXMudmFsdWVFbGVtZW50LnRleHRDb250ZW50O30KX3Byb2Nlc3NCZXppZXIodGV4dCl7aWYoIXRoaXMuX2VkaXRhYmxlKCl8fCFVSS5HZW9tZXRyeS5DdWJpY0Jlemllci5wYXJzZSh0ZXh0KSkKcmV0dXJuIGNyZWF0ZVRleHROb2RlKHRleHQpO2NvbnN0IHN3YXRjaFBvcG92ZXJIZWxwZXI9dGhpcy5fcGFyZW50UGFuZS5zd2F0Y2hQb3BvdmVySGVscGVyKCk7Y29uc3Qgc3dhdGNoPUlubGluZUVkaXRvci5CZXppZXJTd2F0Y2guY3JlYXRlKCk7c3dhdGNoLnNldEJlemllclRleHQodGV4dCk7bmV3IEVsZW1lbnRzLkJlemllclBvcG92ZXJJY29uKHRoaXMsc3dhdGNoUG9wb3ZlckhlbHBlcixzd2F0Y2gpO3JldHVybiBzd2F0Y2g7fQpfcHJvY2Vzc1NoYWRvdyhwcm9wZXJ0eVZhbHVlLHByb3BlcnR5TmFtZSl7aWYoIXRoaXMuX2VkaXRhYmxlKCkpCnJldHVybiBjcmVhdGVUZXh0Tm9kZShwcm9wZXJ0eVZhbHVlKTtsZXQgc2hhZG93cztpZihwcm9wZXJ0eU5hbWU9PT0ndGV4dC1zaGFkb3cnKQpzaGFkb3dzPUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5wYXJzZVRleHRTaGFkb3cocHJvcGVydHlWYWx1ZSk7ZWxzZQpzaGFkb3dzPUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5wYXJzZUJveFNoYWRvdyhwcm9wZXJ0eVZhbHVlKTtpZighc2hhZG93cy5sZW5ndGgpCnJldHVybiBjcmVhdGVUZXh0Tm9kZShwcm9wZXJ0eVZhbHVlKTtjb25zdCBjb250YWluZXI9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2NvbnN0IHN3YXRjaFBvcG92ZXJIZWxwZXI9dGhpcy5fcGFyZW50UGFuZS5zd2F0Y2hQb3BvdmVySGVscGVyKCk7Zm9yKGxldCBpPTA7aTxzaGFkb3dzLmxlbmd0aDtpKyspe2lmKGkhPT0wKQpjb250YWluZXIuYXBwZW5kQ2hpbGQoY3JlYXRlVGV4dE5vZGUoJywgJykpO2NvbnN0IGNzc1NoYWRvd1N3YXRjaD1JbmxpbmVFZGl0b3IuQ1NTU2hhZG93U3dhdGNoLmNyZWF0ZSgpO2Nzc1NoYWRvd1N3YXRjaC5zZXRDU1NTaGFkb3coc2hhZG93c1tpXSk7bmV3IEVsZW1lbnRzLlNoYWRvd1N3YXRjaFBvcG92ZXJIZWxwZXIodGhpcyxzd2F0Y2hQb3BvdmVySGVscGVyLGNzc1NoYWRvd1N3YXRjaCk7Y29uc3QgY29sb3JTd2F0Y2g9Y3NzU2hhZG93U3dhdGNoLmNvbG9yU3dhdGNoKCk7aWYoY29sb3JTd2F0Y2gpCm5ldyBFbGVtZW50cy5Db2xvclN3YXRjaFBvcG92ZXJJY29uKHRoaXMsc3dhdGNoUG9wb3ZlckhlbHBlcixjb2xvclN3YXRjaCk7Y29udGFpbmVyLmFwcGVuZENoaWxkKGNzc1NoYWRvd1N3YXRjaCk7fQpyZXR1cm4gY29udGFpbmVyO30KX3VwZGF0ZVN0YXRlKCl7aWYoIXRoaXMubGlzdEl0ZW1FbGVtZW50KQpyZXR1cm47aWYodGhpcy5fc3R5bGUuaXNQcm9wZXJ0eUltcGxpY2l0KHRoaXMubmFtZSkpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ltcGxpY2l0Jyk7ZWxzZQp0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpbXBsaWNpdCcpO2NvbnN0IGhhc0lnbm9yYWJsZUVycm9yPSF0aGlzLnByb3BlcnR5LnBhcnNlZE9rJiZFbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5pZ25vcmVFcnJvcnNGb3JQcm9wZXJ0eSh0aGlzLnByb3BlcnR5KTtpZihoYXNJZ25vcmFibGVFcnJvcikKdGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGFzLWlnbm9yYWJsZS1lcnJvcicpO2Vsc2UKdGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWlnbm9yYWJsZS1lcnJvcicpO2lmKHRoaXMuaW5oZXJpdGVkKCkpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2luaGVyaXRlZCcpO2Vsc2UKdGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaW5oZXJpdGVkJyk7aWYodGhpcy5vdmVybG9hZGVkKCkpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ292ZXJsb2FkZWQnKTtlbHNlCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJsb2FkZWQnKTtpZih0aGlzLnByb3BlcnR5LmRpc2FibGVkKQp0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO2Vsc2UKdGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTt9Cm5vZGUoKXtyZXR1cm4gdGhpcy5fcGFyZW50UGFuZS5ub2RlKCk7fQpwYXJlbnRQYW5lKCl7cmV0dXJuIHRoaXMuX3BhcmVudFBhbmU7fQpzZWN0aW9uKCl7cmV0dXJuIHRoaXMudHJlZU91dGxpbmUmJnRoaXMudHJlZU91dGxpbmUuc2VjdGlvbjt9Cl91cGRhdGVQYW5lKCl7Y29uc3Qgc2VjdGlvbj10aGlzLnNlY3Rpb24oKTtpZihzZWN0aW9uKQpzZWN0aW9uLnJlZnJlc2hVcGRhdGUodGhpcyk7fQpfdG9nZ2xlRW5hYmxlZChldmVudCl7Y29uc3QgZGlzYWJsZWQ9IWV2ZW50LnRhcmdldC5jaGVja2VkO2NvbnN0IG9sZFN0eWxlUmFuZ2U9dGhpcy5fc3R5bGUucmFuZ2U7aWYoIW9sZFN0eWxlUmFuZ2UpCnJldHVybjtmdW5jdGlvbiBjYWxsYmFjayhzdWNjZXNzKXt0aGlzLl9wYXJlbnRQYW5lLnNldFVzZXJPcGVyYXRpb24oZmFsc2UpO2lmKCFzdWNjZXNzKQpyZXR1cm47dGhpcy5fbWF0Y2hlZFN0eWxlcy5yZXNldEFjdGl2ZVByb3BlcnRpZXMoKTt0aGlzLl91cGRhdGVQYW5lKCk7dGhpcy5zdHlsZVRleHRBcHBsaWVkRm9yVGVzdCgpO30KZXZlbnQuY29uc3VtZSgpO3RoaXMuX3BhcmVudFBhbmUuc2V0VXNlck9wZXJhdGlvbih0cnVlKTt0aGlzLnByb3BlcnR5LnNldERpc2FibGVkKGRpc2FibGVkKS50aGVuKGNhbGxiYWNrLmJpbmQodGhpcykpO30Kb25wb3B1bGF0ZSgpe2lmKHRoaXMuY2hpbGRDb3VudCgpfHwhdGhpcy5pc1Nob3J0aGFuZCkKcmV0dXJuO2NvbnN0IGxvbmdoYW5kUHJvcGVydGllcz10aGlzLl9zdHlsZS5sb25naGFuZFByb3BlcnRpZXModGhpcy5uYW1lKTtmb3IobGV0IGk9MDtpPGxvbmdoYW5kUHJvcGVydGllcy5sZW5ndGg7KytpKXtjb25zdCBuYW1lPWxvbmdoYW5kUHJvcGVydGllc1tpXS5uYW1lO2xldCBpbmhlcml0ZWQ9ZmFsc2U7bGV0IG92ZXJsb2FkZWQ9ZmFsc2U7Y29uc3Qgc2VjdGlvbj10aGlzLnNlY3Rpb24oKTtpZihzZWN0aW9uKXtpbmhlcml0ZWQ9c2VjdGlvbi5pc1Byb3BlcnR5SW5oZXJpdGVkKG5hbWUpO292ZXJsb2FkZWQ9dGhpcy5fbWF0Y2hlZFN0eWxlcy5wcm9wZXJ0eVN0YXRlKGxvbmdoYW5kUHJvcGVydGllc1tpXSk9PT1TREsuQ1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLk92ZXJsb2FkZWQ7fQpjb25zdCBpdGVtPW5ldyBFbGVtZW50cy5TdHlsZVByb3BlcnR5VHJlZUVsZW1lbnQodGhpcy5fcGFyZW50UGFuZSx0aGlzLl9tYXRjaGVkU3R5bGVzLGxvbmdoYW5kUHJvcGVydGllc1tpXSxmYWxzZSxpbmhlcml0ZWQsb3ZlcmxvYWRlZCxmYWxzZSk7dGhpcy5hcHBlbmRDaGlsZChpdGVtKTt9fQpvbmF0dGFjaCgpe3RoaXMudXBkYXRlVGl0bGUoKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGV2ZW50PT57aWYoZXZlbnQud2hpY2g9PT0xKQp0aGlzLl9wYXJlbnRQYW5lW0VsZW1lbnRzLlN0eWxlUHJvcGVydHlUcmVlRWxlbWVudC5BY3RpdmVTeW1ib2xdPXRoaXM7fSxmYWxzZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5fbW91c2VVcC5iaW5kKHRoaXMpKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZXZlbnQ9PntpZighZXZlbnQudGFyZ2V0Lmhhc1NlbGVjdGlvbigpJiZldmVudC50YXJnZXQhPT10aGlzLmxpc3RJdGVtRWxlbWVudCkKZXZlbnQuY29uc3VtZSh0cnVlKTt9KTt9Cm9uZXhwYW5kKCl7dGhpcy5fdXBkYXRlRXhwYW5kRWxlbWVudCgpO30Kb25jb2xsYXBzZSgpe3RoaXMuX3VwZGF0ZUV4cGFuZEVsZW1lbnQoKTt9Cl91cGRhdGVFeHBhbmRFbGVtZW50KCl7aWYoIXRoaXMuX2V4cGFuZEVsZW1lbnQpCnJldHVybjtpZih0aGlzLmV4cGFuZGVkKQp0aGlzLl9leHBhbmRFbGVtZW50LnNldEljb25UeXBlKCdzbWFsbGljb24tdHJpYW5nbGUtZG93bicpO2Vsc2UKdGhpcy5fZXhwYW5kRWxlbWVudC5zZXRJY29uVHlwZSgnc21hbGxpY29uLXRyaWFuZ2xlLXJpZ2h0Jyk7fQp1cGRhdGVUaXRsZUlmQ29tcHV0ZWRWYWx1ZUNoYW5nZWQoKXtjb25zdCBjb21wdXRlZFZhbHVlPXRoaXMuX21hdGNoZWRTdHlsZXMuY29tcHV0ZVZhbHVlKHRoaXMucHJvcGVydHkub3duZXJTdHlsZSx0aGlzLnByb3BlcnR5LnZhbHVlKTtpZihjb21wdXRlZFZhbHVlPT09dGhpcy5fbGFzdENvbXB1dGVkVmFsdWUpCnJldHVybjt0aGlzLl9sYXN0Q29tcHV0ZWRWYWx1ZT1jb21wdXRlZFZhbHVlO3RoaXMuX2lubmVyVXBkYXRlVGl0bGUoKTt9CnVwZGF0ZVRpdGxlKCl7dGhpcy5fbGFzdENvbXB1dGVkVmFsdWU9dGhpcy5fbWF0Y2hlZFN0eWxlcy5jb21wdXRlVmFsdWUodGhpcy5wcm9wZXJ0eS5vd25lclN0eWxlLHRoaXMucHJvcGVydHkudmFsdWUpO3RoaXMuX2lubmVyVXBkYXRlVGl0bGUoKTt9Cl9pbm5lclVwZGF0ZVRpdGxlKCl7dGhpcy5fdXBkYXRlU3RhdGUoKTtpZih0aGlzLmlzRXhwYW5kYWJsZSgpKQp0aGlzLl9leHBhbmRFbGVtZW50PVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdHJpYW5nbGUtcmlnaHQnLCdleHBhbmQtaWNvbicpO2Vsc2UKdGhpcy5fZXhwYW5kRWxlbWVudD1udWxsO2NvbnN0IHByb3BlcnR5UmVuZGVyZXI9bmV3IEVsZW1lbnRzLlN0eWxlc1NpZGViYXJQcm9wZXJ0eVJlbmRlcmVyKHRoaXMuX3N0eWxlLnBhcmVudFJ1bGUsdGhpcy5ub2RlKCksdGhpcy5uYW1lLHRoaXMudmFsdWUpO2lmKHRoaXMucHJvcGVydHkucGFyc2VkT2spe3Byb3BlcnR5UmVuZGVyZXIuc2V0VmFySGFuZGxlcih0aGlzLl9wcm9jZXNzVmFyLmJpbmQodGhpcykpO3Byb3BlcnR5UmVuZGVyZXIuc2V0Q29sb3JIYW5kbGVyKHRoaXMuX3Byb2Nlc3NDb2xvci5iaW5kKHRoaXMpKTtwcm9wZXJ0eVJlbmRlcmVyLnNldEJlemllckhhbmRsZXIodGhpcy5fcHJvY2Vzc0Jlemllci5iaW5kKHRoaXMpKTtwcm9wZXJ0eVJlbmRlcmVyLnNldFNoYWRvd0hhbmRsZXIodGhpcy5fcHJvY2Vzc1NoYWRvdy5iaW5kKHRoaXMpKTt9CnRoaXMubGlzdEl0ZW1FbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5uYW1lRWxlbWVudD1wcm9wZXJ0eVJlbmRlcmVyLnJlbmRlck5hbWUoKTtpZih0aGlzLnByb3BlcnR5Lm5hbWUuc3RhcnRzV2l0aCgnLS0nKSkKdGhpcy5uYW1lRWxlbWVudC50aXRsZT10aGlzLl9tYXRjaGVkU3R5bGVzLmNvbXB1dGVDU1NWYXJpYWJsZSh0aGlzLl9zdHlsZSx0aGlzLnByb3BlcnR5Lm5hbWUpfHwnJzt0aGlzLnZhbHVlRWxlbWVudD1wcm9wZXJ0eVJlbmRlcmVyLnJlbmRlclZhbHVlKCk7aWYoIXRoaXMudHJlZU91dGxpbmUpCnJldHVybjtjb25zdCBpbmRlbnQ9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JJbmRlbnQnKS5nZXQoKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N0eWxlcy1jbGlwYm9hcmQtb25seScpLmNyZWF0ZVRleHRDaGlsZChpbmRlbnQrKHRoaXMucHJvcGVydHkuZGlzYWJsZWQ/Jy8qICc6JycpKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm5hbWVFbGVtZW50KTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJzogJyk7aWYodGhpcy5fZXhwYW5kRWxlbWVudCkKdGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZXhwYW5kRWxlbWVudCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZUVsZW1lbnQpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnOycpO2lmKHRoaXMucHJvcGVydHkuZGlzYWJsZWQpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc3R5bGVzLWNsaXBib2FyZC1vbmx5JykuY3JlYXRlVGV4dENoaWxkKCcgKi8nKTtpZighdGhpcy5wcm9wZXJ0eS5wYXJzZWRPayl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbm90LXBhcnNlZC1vaycpO3RoaXMubGlzdEl0ZW1FbGVtZW50Lmluc2VydEJlZm9yZShFbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5jcmVhdGVFeGNsYW1hdGlvbk1hcmsodGhpcy5wcm9wZXJ0eSksdGhpcy5saXN0SXRlbUVsZW1lbnQuZmlyc3RDaGlsZCk7fQppZighdGhpcy5wcm9wZXJ0eS5hY3RpdmVJblN0eWxlKCkpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2luYWN0aXZlJyk7dGhpcy5fdXBkYXRlRmlsdGVyKCk7aWYodGhpcy5wcm9wZXJ0eS5wYXJzZWRPayYmdGhpcy5zZWN0aW9uKCkmJnRoaXMucGFyZW50LnJvb3Qpe2NvbnN0IGVuYWJsZWRDaGVja2JveEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnaW5wdXQnKTtlbmFibGVkQ2hlY2tib3hFbGVtZW50LmNsYXNzTmFtZT0nZW5hYmxlZC1idXR0b24nO2VuYWJsZWRDaGVja2JveEVsZW1lbnQudHlwZT0nY2hlY2tib3gnO2VuYWJsZWRDaGVja2JveEVsZW1lbnQuY2hlY2tlZD0hdGhpcy5wcm9wZXJ0eS5kaXNhYmxlZDtlbmFibGVkQ2hlY2tib3hFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZXZlbnQ9PmV2ZW50LmNvbnN1bWUoKSxmYWxzZSk7ZW5hYmxlZENoZWNrYm94RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fdG9nZ2xlRW5hYmxlZC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5pbnNlcnRCZWZvcmUoZW5hYmxlZENoZWNrYm94RWxlbWVudCx0aGlzLmxpc3RJdGVtRWxlbWVudC5maXJzdENoaWxkKTt9fQpfbW91c2VVcChldmVudCl7Y29uc3QgYWN0aXZlVHJlZUVsZW1lbnQ9dGhpcy5fcGFyZW50UGFuZVtFbGVtZW50cy5TdHlsZVByb3BlcnR5VHJlZUVsZW1lbnQuQWN0aXZlU3ltYm9sXTt0aGlzLl9wYXJlbnRQYW5lW0VsZW1lbnRzLlN0eWxlUHJvcGVydHlUcmVlRWxlbWVudC5BY3RpdmVTeW1ib2xdPW51bGw7aWYoYWN0aXZlVHJlZUVsZW1lbnQhPT10aGlzKQpyZXR1cm47aWYodGhpcy5saXN0SXRlbUVsZW1lbnQuaGFzU2VsZWN0aW9uKCkpCnJldHVybjtpZihVSS5pc0JlaW5nRWRpdGVkKChldmVudC50YXJnZXQpKSkKcmV0dXJuO2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYoZXZlbnQudGFyZ2V0PT09dGhpcy5saXN0SXRlbUVsZW1lbnQpCnJldHVybjtpZihVSS5LZXlib2FyZFNob3J0Y3V0LmV2ZW50SGFzQ3RybE9yTWV0YSgoZXZlbnQpKSYmdGhpcy5zZWN0aW9uKCkubmF2aWdhYmxlKXt0aGlzLl9uYXZpZ2F0ZVRvU291cmNlKChldmVudC50YXJnZXQpKTtyZXR1cm47fQp0aGlzLnN0YXJ0RWRpdGluZygoZXZlbnQudGFyZ2V0KSk7fQpfbmF2aWdhdGVUb1NvdXJjZShlbGVtZW50LG9taXRGb2N1cyl7aWYoIXRoaXMuc2VjdGlvbigpLm5hdmlnYWJsZSkKcmV0dXJuO2NvbnN0IHByb3BlcnR5TmFtZUNsaWNrZWQ9ZWxlbWVudD09PXRoaXMubmFtZUVsZW1lbnQ7Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnByb3BlcnR5VUlMb2NhdGlvbih0aGlzLnByb3BlcnR5LHByb3BlcnR5TmFtZUNsaWNrZWQpO2lmKHVpTG9jYXRpb24pCkNvbW1vbi5SZXZlYWxlci5yZXZlYWwodWlMb2NhdGlvbixvbWl0Rm9jdXMpO30Kc3RhcnRFZGl0aW5nKHNlbGVjdEVsZW1lbnQpe2lmKHRoaXMucGFyZW50LmlzU2hvcnRoYW5kKQpyZXR1cm47aWYodGhpcy5fZXhwYW5kRWxlbWVudCYmc2VsZWN0RWxlbWVudD09PXRoaXMuX2V4cGFuZEVsZW1lbnQpCnJldHVybjtjb25zdCBzZWN0aW9uPXRoaXMuc2VjdGlvbigpO2lmKHNlY3Rpb24mJiFzZWN0aW9uLmVkaXRhYmxlKQpyZXR1cm47aWYoc2VsZWN0RWxlbWVudCl7c2VsZWN0RWxlbWVudD1zZWxlY3RFbGVtZW50LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3dlYmtpdC1jc3MtcHJvcGVydHknKXx8c2VsZWN0RWxlbWVudC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCd2YWx1ZScpO30KaWYoIXNlbGVjdEVsZW1lbnQpCnNlbGVjdEVsZW1lbnQ9dGhpcy5uYW1lRWxlbWVudDtpZihVSS5pc0JlaW5nRWRpdGVkKHNlbGVjdEVsZW1lbnQpKQpyZXR1cm47Y29uc3QgaXNFZGl0aW5nTmFtZT1zZWxlY3RFbGVtZW50PT09dGhpcy5uYW1lRWxlbWVudDtpZighaXNFZGl0aW5nTmFtZSkKdGhpcy52YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQ9cmVzdG9yZVVSTHModGhpcy52YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQsdGhpcy52YWx1ZSk7ZnVuY3Rpb24gcmVzdG9yZVVSTHMoZmllbGRWYWx1ZSxtb2RlbFZhbHVlKXtjb25zdCB1cmxSZWdleD0vXGIodXJsXChbXildKlwpKS9nO2NvbnN0IHNwbGl0RmllbGRWYWx1ZT1maWVsZFZhbHVlLnNwbGl0KHVybFJlZ2V4KTtpZihzcGxpdEZpZWxkVmFsdWUubGVuZ3RoPT09MSkKcmV0dXJuIGZpZWxkVmFsdWU7Y29uc3QgbW9kZWxVcmxSZWdleD1uZXcgUmVnRXhwKHVybFJlZ2V4KTtmb3IobGV0IGk9MTtpPHNwbGl0RmllbGRWYWx1ZS5sZW5ndGg7aSs9Mil7Y29uc3QgbWF0Y2g9bW9kZWxVcmxSZWdleC5leGVjKG1vZGVsVmFsdWUpO2lmKG1hdGNoKQpzcGxpdEZpZWxkVmFsdWVbaV09bWF0Y2hbMF07fQpyZXR1cm4gc3BsaXRGaWVsZFZhbHVlLmpvaW4oJycpO30KY29uc3QgY29udGV4dD17ZXhwYW5kZWQ6dGhpcy5leHBhbmRlZCxoYXNDaGlsZHJlbjp0aGlzLmlzRXhwYW5kYWJsZSgpLGlzRWRpdGluZ05hbWU6aXNFZGl0aW5nTmFtZSxwcmV2aW91c0NvbnRlbnQ6c2VsZWN0RWxlbWVudC50ZXh0Q29udGVudH07dGhpcy5zZXRFeHBhbmRhYmxlKGZhbHNlKTtpZihzZWxlY3RFbGVtZW50LnBhcmVudEVsZW1lbnQpCnNlbGVjdEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjaGlsZC1lZGl0aW5nJyk7c2VsZWN0RWxlbWVudC50ZXh0Q29udGVudD1zZWxlY3RFbGVtZW50LnRleHRDb250ZW50O2Z1bmN0aW9uIHBhc3RlSGFuZGxlcihjb250ZXh0LGV2ZW50KXtjb25zdCBkYXRhPWV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgnVGV4dCcpO2lmKCFkYXRhKQpyZXR1cm47Y29uc3QgY29sb25JZHg9ZGF0YS5pbmRleE9mKCc6Jyk7aWYoY29sb25JZHg8MCkKcmV0dXJuO2NvbnN0IG5hbWU9ZGF0YS5zdWJzdHJpbmcoMCxjb2xvbklkeCkudHJpbSgpO2NvbnN0IHZhbHVlPWRhdGEuc3Vic3RyaW5nKGNvbG9uSWR4KzEpLnRyaW0oKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2lmKCEoJ29yaWdpbmFsTmFtZSdpbiBjb250ZXh0KSl7Y29udGV4dC5vcmlnaW5hbE5hbWU9dGhpcy5uYW1lRWxlbWVudC50ZXh0Q29udGVudDtjb250ZXh0Lm9yaWdpbmFsVmFsdWU9dGhpcy52YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQ7fQp0aGlzLnByb3BlcnR5Lm5hbWU9bmFtZTt0aGlzLnByb3BlcnR5LnZhbHVlPXZhbHVlO3RoaXMubmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bmFtZTt0aGlzLnZhbHVlRWxlbWVudC50ZXh0Q29udGVudD12YWx1ZTt0aGlzLm5hbWVFbGVtZW50Lm5vcm1hbGl6ZSgpO3RoaXMudmFsdWVFbGVtZW50Lm5vcm1hbGl6ZSgpO3RoaXMuX2VkaXRpbmdDb21taXR0ZWQoZXZlbnQudGFyZ2V0LnRleHRDb250ZW50LGNvbnRleHQsJ2ZvcndhcmQnKTt9CmZ1bmN0aW9uIGJsdXJMaXN0ZW5lcihjb250ZXh0LGV2ZW50KXtsZXQgdGV4dD1ldmVudC50YXJnZXQudGV4dENvbnRlbnQ7aWYoIWNvbnRleHQuaXNFZGl0aW5nTmFtZSkKdGV4dD10aGlzLnZhbHVlfHx0ZXh0O3RoaXMuX2VkaXRpbmdDb21taXR0ZWQodGV4dCxjb250ZXh0LCcnKTt9CnRoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0PXRoaXMucHJvcGVydHkucHJvcGVydHlUZXh0O3RoaXMuX3BhcmVudFBhbmUuc2V0RWRpdGluZ1N0eWxlKHRydWUpO2lmKHNlbGVjdEVsZW1lbnQucGFyZW50RWxlbWVudCkKc2VsZWN0RWxlbWVudC5wYXJlbnRFbGVtZW50LnNjcm9sbEludG9WaWV3SWZOZWVkZWQoZmFsc2UpO3RoaXMuX3Byb21wdD1uZXcgRWxlbWVudHMuU3R5bGVzU2lkZWJhclBhbmUuQ1NTUHJvcGVydHlQcm9tcHQodGhpcyxpc0VkaXRpbmdOYW1lKTt0aGlzLl9wcm9tcHQuc2V0QXV0b2NvbXBsZXRpb25UaW1lb3V0KDApO2lmKHNlY3Rpb24pCnNlY3Rpb24uc3RhcnRFZGl0aW5nKCk7aWYoIWlzRWRpdGluZ05hbWUmJighdGhpcy5fcGFyZW50UGFuZS5ub2RlKCkucHNldWRvVHlwZSgpfHx0aGlzLm5hbWUhPT0nY29udGVudCcpKQp0aGlzLl9wcm9tcHQuYWRkRXZlbnRMaXN0ZW5lcihVSS5UZXh0UHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCx0aGlzLl9hcHBseUZyZWVGbG93U3R5bGVUZXh0RWRpdC5iaW5kKHRoaXMpKTtjb25zdCBwcm94eUVsZW1lbnQ9dGhpcy5fcHJvbXB0LmF0dGFjaEFuZFN0YXJ0RWRpdGluZyhzZWxlY3RFbGVtZW50LGJsdXJMaXN0ZW5lci5iaW5kKHRoaXMsY29udGV4dCkpO3RoaXMuX25hdmlnYXRlVG9Tb3VyY2Uoc2VsZWN0RWxlbWVudCx0cnVlKTtwcm94eUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fZWRpdGluZ05hbWVWYWx1ZUtleURvd24uYmluZCh0aGlzLGNvbnRleHQpLGZhbHNlKTtwcm94eUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLHRoaXMuX2VkaXRpbmdOYW1lVmFsdWVLZXlQcmVzcy5iaW5kKHRoaXMsY29udGV4dCksZmFsc2UpO2lmKGlzRWRpdGluZ05hbWUpCnByb3h5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScscGFzdGVIYW5kbGVyLmJpbmQodGhpcyxjb250ZXh0KSxmYWxzZSk7c2VsZWN0RWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbihzZWxlY3RFbGVtZW50KTt9Cl9lZGl0aW5nTmFtZVZhbHVlS2V5RG93bihjb250ZXh0LGV2ZW50KXtpZihldmVudC5oYW5kbGVkKQpyZXR1cm47bGV0IHJlc3VsdDtpZihpc0VudGVyS2V5KGV2ZW50KSl7cmVzdWx0PSdmb3J3YXJkJzt9ZWxzZSBpZihldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVzYy5jb2RlfHxldmVudC5rZXk9PT0nRXNjYXBlJyl7cmVzdWx0PSdjYW5jZWwnO31lbHNlIGlmKCFjb250ZXh0LmlzRWRpdGluZ05hbWUmJnRoaXMuX25ld1Byb3BlcnR5JiZldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkJhY2tzcGFjZS5jb2RlKXtjb25zdCBzZWxlY3Rpb249ZXZlbnQudGFyZ2V0LmdldENvbXBvbmVudFNlbGVjdGlvbigpO2lmKHNlbGVjdGlvbi5pc0NvbGxhcHNlZCYmIXNlbGVjdGlvbi5mb2N1c09mZnNldCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtyZXN1bHQ9J2JhY2t3YXJkJzt9fWVsc2UgaWYoZXZlbnQua2V5PT09J1RhYicpe3Jlc3VsdD1ldmVudC5zaGlmdEtleT8nYmFja3dhcmQnOidmb3J3YXJkJztldmVudC5wcmV2ZW50RGVmYXVsdCgpO30KaWYocmVzdWx0KXtzd2l0Y2gocmVzdWx0KXtjYXNlJ2NhbmNlbCc6dGhpcy5lZGl0aW5nQ2FuY2VsbGVkKG51bGwsY29udGV4dCk7YnJlYWs7Y2FzZSdmb3J3YXJkJzpjYXNlJ2JhY2t3YXJkJzp0aGlzLl9lZGl0aW5nQ29tbWl0dGVkKGV2ZW50LnRhcmdldC50ZXh0Q29udGVudCxjb250ZXh0LHJlc3VsdCk7YnJlYWs7fQpldmVudC5jb25zdW1lKCk7cmV0dXJuO319Cl9lZGl0aW5nTmFtZVZhbHVlS2V5UHJlc3MoY29udGV4dCxldmVudCl7ZnVuY3Rpb24gc2hvdWxkQ29tbWl0VmFsdWVTZW1pY29sb24odGV4dCxjdXJzb3JQb3NpdGlvbil7bGV0IG9wZW5RdW90ZT0nJztmb3IobGV0IGk9MDtpPGN1cnNvclBvc2l0aW9uOysraSl7Y29uc3QgY2g9dGV4dFtpXTtpZihjaD09PSdcXCcmJm9wZW5RdW90ZSE9PScnKQorK2k7ZWxzZSBpZighb3BlblF1b3RlJiYoY2g9PT0nIid8fGNoPT09J1wnJykpCm9wZW5RdW90ZT1jaDtlbHNlIGlmKG9wZW5RdW90ZT09PWNoKQpvcGVuUXVvdGU9Jyc7fQpyZXR1cm4hb3BlblF1b3RlO30KY29uc3Qga2V5Q2hhcj1TdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKTtjb25zdCBpc0ZpZWxkSW5wdXRUZXJtaW5hdGVkPShjb250ZXh0LmlzRWRpdGluZ05hbWU/a2V5Q2hhcj09PSc6JzprZXlDaGFyPT09JzsnJiZzaG91bGRDb21taXRWYWx1ZVNlbWljb2xvbihldmVudC50YXJnZXQudGV4dENvbnRlbnQsZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkxlZnRPZmZzZXQoKSkpO2lmKGlzRmllbGRJbnB1dFRlcm1pbmF0ZWQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7dGhpcy5fZWRpdGluZ0NvbW1pdHRlZChldmVudC50YXJnZXQudGV4dENvbnRlbnQsY29udGV4dCwnZm9yd2FyZCcpO3JldHVybjt9fQphc3luYyBfYXBwbHlGcmVlRmxvd1N0eWxlVGV4dEVkaXQoKXtjb25zdCB2YWx1ZVRleHQ9dGhpcy5fcHJvbXB0LnRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKTtpZih2YWx1ZVRleHQuaW5kZXhPZignOycpPT09LTEpCmF3YWl0IHRoaXMuYXBwbHlTdHlsZVRleHQodGhpcy5uYW1lRWxlbWVudC50ZXh0Q29udGVudCsnOiAnK3ZhbHVlVGV4dCxmYWxzZSk7fQpraWNrRnJlZUZsb3dTdHlsZUVkaXRGb3JUZXN0KCl7cmV0dXJuIHRoaXMuX2FwcGx5RnJlZUZsb3dTdHlsZVRleHRFZGl0KCk7fQplZGl0aW5nRW5kZWQoY29udGV4dCl7dGhpcy5zZXRFeHBhbmRhYmxlKGNvbnRleHQuaGFzQ2hpbGRyZW4pO2lmKGNvbnRleHQuZXhwYW5kZWQpCnRoaXMuZXhwYW5kKCk7Y29uc3QgZWRpdGVkRWxlbWVudD1jb250ZXh0LmlzRWRpdGluZ05hbWU/dGhpcy5uYW1lRWxlbWVudDp0aGlzLnZhbHVlRWxlbWVudDtpZihlZGl0ZWRFbGVtZW50LnBhcmVudEVsZW1lbnQpCmVkaXRlZEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdjaGlsZC1lZGl0aW5nJyk7dGhpcy5fcGFyZW50UGFuZS5zZXRFZGl0aW5nU3R5bGUoZmFsc2UpO30KZWRpdGluZ0NhbmNlbGxlZChlbGVtZW50LGNvbnRleHQpe3RoaXMuX3JlbW92ZVByb21wdCgpO3RoaXMuX3JldmVydFN0eWxlVXBvbkVkaXRpbmdDYW5jZWxlZCgpO3RoaXMuZWRpdGluZ0VuZGVkKGNvbnRleHQpO30KX3JldmVydFN0eWxlVXBvbkVkaXRpbmdDYW5jZWxlZCgpe2lmKHRoaXMuX3Byb3BlcnR5SGFzQmVlbkVkaXRlZEluY3JlbWVudGFsbHkpe3RoaXMuYXBwbHlTdHlsZVRleHQodGhpcy5fb3JpZ2luYWxQcm9wZXJ0eVRleHQsZmFsc2UpO3RoaXMuX29yaWdpbmFsUHJvcGVydHlUZXh0PScnO31lbHNlIGlmKHRoaXMuX25ld1Byb3BlcnR5KXt0aGlzLnRyZWVPdXRsaW5lLnJlbW92ZUNoaWxkKHRoaXMpO31lbHNle3RoaXMudXBkYXRlVGl0bGUoKTt9fQpfZmluZFNpYmxpbmcobW92ZURpcmVjdGlvbil7bGV0IHRhcmdldD10aGlzO2RvCnRhcmdldD0obW92ZURpcmVjdGlvbj09PSdmb3J3YXJkJz90YXJnZXQubmV4dFNpYmxpbmc6dGFyZ2V0LnByZXZpb3VzU2libGluZyk7d2hpbGUodGFyZ2V0JiZ0YXJnZXQuaW5oZXJpdGVkKCkpO3JldHVybiB0YXJnZXQ7fQphc3luYyBfZWRpdGluZ0NvbW1pdHRlZCh1c2VySW5wdXQsY29udGV4dCxtb3ZlRGlyZWN0aW9uKXtjb25zdCBoYWRGb2N1cz10aGlzLl9wYXJlbnRQYW5lLmVsZW1lbnQuaGFzRm9jdXMoKTt0aGlzLl9yZW1vdmVQcm9tcHQoKTt0aGlzLmVkaXRpbmdFbmRlZChjb250ZXh0KTtjb25zdCBpc0VkaXRpbmdOYW1lPWNvbnRleHQuaXNFZGl0aW5nTmFtZTtsZXQgY3JlYXRlTmV3UHJvcGVydHksbW92ZVRvU2VsZWN0b3I7Y29uc3QgaXNEYXRhUGFzdGVkPSdvcmlnaW5hbE5hbWUnaW4gY29udGV4dDtjb25zdCBpc0RpcnR5VmlhUGFzdGU9aXNEYXRhUGFzdGVkJiYodGhpcy5uYW1lRWxlbWVudC50ZXh0Q29udGVudCE9PWNvbnRleHQub3JpZ2luYWxOYW1lfHx0aGlzLnZhbHVlRWxlbWVudC50ZXh0Q29udGVudCE9PWNvbnRleHQub3JpZ2luYWxWYWx1ZSk7Y29uc3QgaXNQcm9wZXJ0eVNwbGl0UGFzdGU9aXNEYXRhUGFzdGVkJiZpc0VkaXRpbmdOYW1lJiZ0aGlzLnZhbHVlRWxlbWVudC50ZXh0Q29udGVudCE9PWNvbnRleHQub3JpZ2luYWxWYWx1ZTtsZXQgbW92ZVRvPXRoaXM7Y29uc3QgbW92ZVRvT3RoZXI9KGlzRWRpdGluZ05hbWVeKG1vdmVEaXJlY3Rpb249PT0nZm9yd2FyZCcpKTtjb25zdCBhYmFuZG9uTmV3UHJvcGVydHk9dGhpcy5fbmV3UHJvcGVydHkmJiF1c2VySW5wdXQmJihtb3ZlVG9PdGhlcnx8aXNFZGl0aW5nTmFtZSk7aWYobW92ZURpcmVjdGlvbj09PSdmb3J3YXJkJyYmKCFpc0VkaXRpbmdOYW1lfHxpc1Byb3BlcnR5U3BsaXRQYXN0ZSl8fG1vdmVEaXJlY3Rpb249PT0nYmFja3dhcmQnJiZpc0VkaXRpbmdOYW1lKXttb3ZlVG89bW92ZVRvLl9maW5kU2libGluZyhtb3ZlRGlyZWN0aW9uKTtpZighbW92ZVRvKXtpZihtb3ZlRGlyZWN0aW9uPT09J2ZvcndhcmQnJiYoIXRoaXMuX25ld1Byb3BlcnR5fHx1c2VySW5wdXQpKQpjcmVhdGVOZXdQcm9wZXJ0eT10cnVlO2Vsc2UgaWYobW92ZURpcmVjdGlvbj09PSdiYWNrd2FyZCcpCm1vdmVUb1NlbGVjdG9yPXRydWU7fX0KbGV0IG1vdmVUb0luZGV4PW1vdmVUbyYmdGhpcy50cmVlT3V0bGluZT90aGlzLnRyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCkuaW5kZXhPZkNoaWxkKG1vdmVUbyk6LTE7Y29uc3QgYmxhbmtJbnB1dD11c2VySW5wdXQuaXNXaGl0ZXNwYWNlKCk7Y29uc3Qgc2hvdWxkQ29tbWl0TmV3UHJvcGVydHk9dGhpcy5fbmV3UHJvcGVydHkmJihpc1Byb3BlcnR5U3BsaXRQYXN0ZXx8bW92ZVRvT3RoZXJ8fCghbW92ZURpcmVjdGlvbiYmIWlzRWRpdGluZ05hbWUpfHwoaXNFZGl0aW5nTmFtZSYmYmxhbmtJbnB1dCkpO2NvbnN0IHNlY3Rpb249KHRoaXMuc2VjdGlvbigpKTtpZigoKHVzZXJJbnB1dCE9PWNvbnRleHQucHJldmlvdXNDb250ZW50fHxpc0RpcnR5VmlhUGFzdGUpJiYhdGhpcy5fbmV3UHJvcGVydHkpfHxzaG91bGRDb21taXROZXdQcm9wZXJ0eSl7aWYoaGFkRm9jdXMpCnRoaXMuX3BhcmVudFBhbmUuZWxlbWVudC5mb2N1cygpO2xldCBwcm9wZXJ0eVRleHQ7aWYoYmxhbmtJbnB1dHx8KHRoaXMuX25ld1Byb3BlcnR5JiZ0aGlzLnZhbHVlRWxlbWVudC50ZXh0Q29udGVudC5pc1doaXRlc3BhY2UoKSkpe3Byb3BlcnR5VGV4dD0nJzt9ZWxzZXtpZihpc0VkaXRpbmdOYW1lKQpwcm9wZXJ0eVRleHQ9dXNlcklucHV0Kyc6ICcrdGhpcy5wcm9wZXJ0eS52YWx1ZTtlbHNlCnByb3BlcnR5VGV4dD10aGlzLnByb3BlcnR5Lm5hbWUrJzogJyt1c2VySW5wdXQ7fQphd2FpdCB0aGlzLmFwcGx5U3R5bGVUZXh0KHByb3BlcnR5VGV4dCx0cnVlKTttb3ZlVG9OZXh0Q2FsbGJhY2suY2FsbCh0aGlzLHRoaXMuX25ld1Byb3BlcnR5LCFibGFua0lucHV0LHNlY3Rpb24pO31lbHNle2lmKGlzRWRpdGluZ05hbWUpCnRoaXMucHJvcGVydHkubmFtZT11c2VySW5wdXQ7ZWxzZQp0aGlzLnByb3BlcnR5LnZhbHVlPXVzZXJJbnB1dDtpZighaXNEYXRhUGFzdGVkJiYhdGhpcy5fbmV3UHJvcGVydHkpCnRoaXMudXBkYXRlVGl0bGUoKTttb3ZlVG9OZXh0Q2FsbGJhY2suY2FsbCh0aGlzLHRoaXMuX25ld1Byb3BlcnR5LGZhbHNlLHNlY3Rpb24pO30KZnVuY3Rpb24gbW92ZVRvTmV4dENhbGxiYWNrKGFscmVhZHlOZXcsdmFsdWVDaGFuZ2VkLHNlY3Rpb24pe2lmKCFtb3ZlRGlyZWN0aW9uKQpyZXR1cm47aWYobW92ZVRvJiZtb3ZlVG8ucGFyZW50KXttb3ZlVG8uc3RhcnRFZGl0aW5nKCFpc0VkaXRpbmdOYW1lP21vdmVUby5uYW1lRWxlbWVudDptb3ZlVG8udmFsdWVFbGVtZW50KTtyZXR1cm47fQppZihtb3ZlVG8mJiFtb3ZlVG8ucGFyZW50KXtjb25zdCByb290RWxlbWVudD1zZWN0aW9uLnByb3BlcnRpZXNUcmVlT3V0bGluZS5yb290RWxlbWVudCgpO2lmKG1vdmVEaXJlY3Rpb249PT0nZm9yd2FyZCcmJmJsYW5rSW5wdXQmJiFpc0VkaXRpbmdOYW1lKQotLW1vdmVUb0luZGV4O2lmKG1vdmVUb0luZGV4Pj1yb290RWxlbWVudC5jaGlsZENvdW50KCkmJiF0aGlzLl9uZXdQcm9wZXJ0eSl7Y3JlYXRlTmV3UHJvcGVydHk9dHJ1ZTt9ZWxzZXtjb25zdCB0cmVlRWxlbWVudD1tb3ZlVG9JbmRleD49MD9yb290RWxlbWVudC5jaGlsZEF0KG1vdmVUb0luZGV4KTpudWxsO2lmKHRyZWVFbGVtZW50KXtsZXQgZWxlbWVudFRvRWRpdD0haXNFZGl0aW5nTmFtZXx8aXNQcm9wZXJ0eVNwbGl0UGFzdGU/dHJlZUVsZW1lbnQubmFtZUVsZW1lbnQ6dHJlZUVsZW1lbnQudmFsdWVFbGVtZW50O2lmKGFscmVhZHlOZXcmJmJsYW5rSW5wdXQpCmVsZW1lbnRUb0VkaXQ9bW92ZURpcmVjdGlvbj09PSdmb3J3YXJkJz90cmVlRWxlbWVudC5uYW1lRWxlbWVudDp0cmVlRWxlbWVudC52YWx1ZUVsZW1lbnQ7dHJlZUVsZW1lbnQuc3RhcnRFZGl0aW5nKGVsZW1lbnRUb0VkaXQpO3JldHVybjt9ZWxzZSBpZighYWxyZWFkeU5ldyl7bW92ZVRvU2VsZWN0b3I9dHJ1ZTt9fX0KaWYoY3JlYXRlTmV3UHJvcGVydHkpe2lmKGFscmVhZHlOZXcmJiF2YWx1ZUNoYW5nZWQmJihpc0VkaXRpbmdOYW1lXihtb3ZlRGlyZWN0aW9uPT09J2JhY2t3YXJkJykpKQpyZXR1cm47c2VjdGlvbi5hZGROZXdCbGFua1Byb3BlcnR5KCkuc3RhcnRFZGl0aW5nKCk7cmV0dXJuO30KaWYoYWJhbmRvbk5ld1Byb3BlcnR5KXttb3ZlVG89dGhpcy5fZmluZFNpYmxpbmcobW92ZURpcmVjdGlvbik7Y29uc3Qgc2VjdGlvblRvRWRpdD0obW92ZVRvfHxtb3ZlRGlyZWN0aW9uPT09J2JhY2t3YXJkJyk/c2VjdGlvbjpzZWN0aW9uLm5leHRFZGl0YWJsZVNpYmxpbmcoKTtpZihzZWN0aW9uVG9FZGl0KXtpZihzZWN0aW9uVG9FZGl0LnN0eWxlKCkucGFyZW50UnVsZSkKc2VjdGlvblRvRWRpdC5zdGFydEVkaXRpbmdTZWxlY3RvcigpO2Vsc2UKc2VjdGlvblRvRWRpdC5tb3ZlRWRpdG9yRnJvbVNlbGVjdG9yKG1vdmVEaXJlY3Rpb24pO30KcmV0dXJuO30KaWYobW92ZVRvU2VsZWN0b3Ipe2lmKHNlY3Rpb24uc3R5bGUoKS5wYXJlbnRSdWxlKQpzZWN0aW9uLnN0YXJ0RWRpdGluZ1NlbGVjdG9yKCk7ZWxzZQpzZWN0aW9uLm1vdmVFZGl0b3JGcm9tU2VsZWN0b3IobW92ZURpcmVjdGlvbik7fX19Cl9yZW1vdmVQcm9tcHQoKXtpZih0aGlzLl9wcm9tcHQpe3RoaXMuX3Byb21wdC5kZXRhY2goKTt0aGlzLl9wcm9tcHQ9bnVsbDt9CmNvbnN0IHNlY3Rpb249dGhpcy5zZWN0aW9uKCk7aWYoc2VjdGlvbikKc2VjdGlvbi5zdG9wRWRpdGluZygpO30Kc3R5bGVUZXh0QXBwbGllZEZvclRlc3QoKXt9CmFwcGx5U3R5bGVUZXh0KHN0eWxlVGV4dCxtYWpvckNoYW5nZSl7cmV0dXJuIHRoaXMuX2FwcGx5U3R5bGVUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5faW5uZXJBcHBseVN0eWxlVGV4dC5iaW5kKHRoaXMsc3R5bGVUZXh0LG1ham9yQ2hhbmdlKSk7fQphc3luYyBfaW5uZXJBcHBseVN0eWxlVGV4dChzdHlsZVRleHQsbWFqb3JDaGFuZ2Upe2lmKCF0aGlzLnRyZWVPdXRsaW5lKQpyZXR1cm47Y29uc3Qgb2xkU3R5bGVSYW5nZT10aGlzLl9zdHlsZS5yYW5nZTtpZighb2xkU3R5bGVSYW5nZSkKcmV0dXJuO3N0eWxlVGV4dD1zdHlsZVRleHQucmVwbGFjZSgvXHMvZywnICcpLnRyaW0oKTtpZighc3R5bGVUZXh0Lmxlbmd0aCYmbWFqb3JDaGFuZ2UmJnRoaXMuX25ld1Byb3BlcnR5JiYhdGhpcy5fcHJvcGVydHlIYXNCZWVuRWRpdGVkSW5jcmVtZW50YWxseSl7dGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7cmV0dXJuO30KY29uc3QgY3VycmVudE5vZGU9dGhpcy5fcGFyZW50UGFuZS5ub2RlKCk7dGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKHRydWUpO2lmKHN0eWxlVGV4dC5sZW5ndGgmJiEvO1xzKiQvLnRlc3Qoc3R5bGVUZXh0KSkKc3R5bGVUZXh0Kz0nOyc7Y29uc3Qgb3ZlcndyaXRlUHJvcGVydHk9IXRoaXMuX25ld1Byb3BlcnR5fHx0aGlzLl9wcm9wZXJ0eUhhc0JlZW5FZGl0ZWRJbmNyZW1lbnRhbGx5O2xldCBzdWNjZXNzPWF3YWl0IHRoaXMucHJvcGVydHkuc2V0VGV4dChzdHlsZVRleHQsbWFqb3JDaGFuZ2Usb3ZlcndyaXRlUHJvcGVydHkpO2lmKHRoaXMuX3Byb3BlcnR5SGFzQmVlbkVkaXRlZEluY3JlbWVudGFsbHkmJm1ham9yQ2hhbmdlJiYhc3VjY2Vzcyl7bWFqb3JDaGFuZ2U9ZmFsc2U7c3VjY2Vzcz1hd2FpdCB0aGlzLnByb3BlcnR5LnNldFRleHQodGhpcy5fb3JpZ2luYWxQcm9wZXJ0eVRleHQsbWFqb3JDaGFuZ2Usb3ZlcndyaXRlUHJvcGVydHkpO30KdGhpcy5fcGFyZW50UGFuZS5zZXRVc2VyT3BlcmF0aW9uKGZhbHNlKTtpZighc3VjY2Vzcyl7aWYobWFqb3JDaGFuZ2Upe2lmKHRoaXMuX25ld1Byb3BlcnR5KQp0aGlzLnRyZWVPdXRsaW5lLnJlbW92ZUNoaWxkKHRoaXMpO2Vsc2UKdGhpcy51cGRhdGVUaXRsZSgpO30KdGhpcy5zdHlsZVRleHRBcHBsaWVkRm9yVGVzdCgpO3JldHVybjt9CnRoaXMuX21hdGNoZWRTdHlsZXMucmVzZXRBY3RpdmVQcm9wZXJ0aWVzKCk7dGhpcy5fcHJvcGVydHlIYXNCZWVuRWRpdGVkSW5jcmVtZW50YWxseT10cnVlO3RoaXMucHJvcGVydHk9dGhpcy5fc3R5bGUucHJvcGVydHlBdCh0aGlzLnByb3BlcnR5LmluZGV4KTtpZihjdXJyZW50Tm9kZT09PXRoaXMubm9kZSgpKQp0aGlzLl91cGRhdGVQYW5lKCk7dGhpcy5zdHlsZVRleHRBcHBsaWVkRm9yVGVzdCgpO30Kb25kYmxjbGljaygpe3JldHVybiB0cnVlO30KaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCl7cmV0dXJuIGV2ZW50LnRhcmdldD09PXRoaXMuX2V4cGFuZEVsZW1lbnQ7fX07RWxlbWVudHMuU3R5bGVQcm9wZXJ0eVRyZWVFbGVtZW50LkNvbnRleHQ7RWxlbWVudHMuU3R5bGVQcm9wZXJ0eVRyZWVFbGVtZW50LkFjdGl2ZVN5bWJvbD1TeW1ib2woJ0FjdGl2ZVN5bWJvbCcpOztFbGVtZW50cy5Db21wdXRlZFN0eWxlV2lkZ2V0PWNsYXNzIGV4dGVuZHMgVUkuVGhyb3R0bGVkV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9jb21wdXRlZFN0eWxlU2lkZWJhclBhbmUuY3NzJyk7dGhpcy5fYWx3YXlzU2hvd0NvbXB1dGVkUHJvcGVydGllcz17J2Rpc3BsYXknOnRydWUsJ2hlaWdodCc6dHJ1ZSwnd2lkdGgnOnRydWV9O3RoaXMuX2NvbXB1dGVkU3R5bGVNb2RlbD1uZXcgRWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsKCk7dGhpcy5fY29tcHV0ZWRTdHlsZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoRWxlbWVudHMuQ29tcHV0ZWRTdHlsZU1vZGVsLkV2ZW50cy5Db21wdXRlZFN0eWxlQ2hhbmdlZCx0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLl9zaG93SW5oZXJpdGVkQ29tcHV0ZWRTdHlsZVByb3BlcnRpZXNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzaG93SW5oZXJpdGVkQ29tcHV0ZWRTdHlsZVByb3BlcnRpZXMnLGZhbHNlKTt0aGlzLl9zaG93SW5oZXJpdGVkQ29tcHV0ZWRTdHlsZVByb3BlcnRpZXNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3Nob3dJbmhlcml0ZWRDb21wdXRlZFN0eWxlQ2hhbmdlZC5iaW5kKHRoaXMpKTtjb25zdCBoYm94PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hib3ggc3R5bGVzLXNpZGViYXItcGFuZS10b29sYmFyJyk7Y29uc3QgZmlsdGVyQ29udGFpbmVyRWxlbWVudD1oYm94LmNyZWF0ZUNoaWxkKCdkaXYnLCdzdHlsZXMtc2lkZWJhci1wYW5lLWZpbHRlci1ib3gnKTtjb25zdCBmaWx0ZXJJbnB1dD1FbGVtZW50cy5TdHlsZXNTaWRlYmFyUGFuZS5jcmVhdGVQcm9wZXJ0eUZpbHRlckVsZW1lbnQobHNgRmlsdGVyYCxoYm94LGZpbHRlckNhbGxiYWNrLmJpbmQodGhpcykpO1VJLkFSSUFVdGlscy5zZXRBY2Nlc3NpYmxlTmFtZShmaWx0ZXJJbnB1dCxDb21tb24uVUlTdHJpbmcoJ0ZpbHRlciBDb21wdXRlZCBTdHlsZXMnKSk7ZmlsdGVyQ29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZChmaWx0ZXJJbnB1dCk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQoZmlsdGVySW5wdXQpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3N0eWxlcy1wYW5lLXRvb2xiYXInLGhib3gpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3godGhpcy5fc2hvd0luaGVyaXRlZENvbXB1dGVkU3R5bGVQcm9wZXJ0aWVzU2V0dGluZyx1bmRlZmluZWQsQ29tbW9uLlVJU3RyaW5nKCdTaG93IGFsbCcpKSk7dGhpcy5fbm9NYXRjaGVzRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdncmF5LWluZm8tbWVzc2FnZScpO3RoaXMuX25vTWF0Y2hlc0VsZW1lbnQudGV4dENvbnRlbnQ9bHNgTm8gbWF0Y2hpbmcgcHJvcGVydHlgO3RoaXMuX3Byb3BlcnRpZXNPdXRsaW5lPW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7dGhpcy5fcHJvcGVydGllc091dGxpbmUuaGlkZU92ZXJmbG93KCk7dGhpcy5fcHJvcGVydGllc091dGxpbmUucmVnaXN0ZXJSZXF1aXJlZENTUygnZWxlbWVudHMvY29tcHV0ZWRTdHlsZVdpZGdldFRyZWUuY3NzJyk7dGhpcy5fcHJvcGVydGllc091dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtb25vc3BhY2UnLCdjb21wdXRlZC1wcm9wZXJ0aWVzJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wcm9wZXJ0aWVzT3V0bGluZS5lbGVtZW50KTt0aGlzLl9saW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKEVsZW1lbnRzLkNvbXB1dGVkU3R5bGVXaWRnZXQuX21heExpbmtMZW5ndGgpO2Z1bmN0aW9uIGZpbHRlckNhbGxiYWNrKHJlZ2V4KXt0aGlzLl9maWx0ZXJSZWdleD1yZWdleDt0aGlzLl91cGRhdGVGaWx0ZXIocmVnZXgpO30KY29uc3QgZm9udHNXaWRnZXQ9bmV3IEVsZW1lbnRzLlBsYXRmb3JtRm9udHNXaWRnZXQodGhpcy5fY29tcHV0ZWRTdHlsZU1vZGVsKTtmb250c1dpZGdldC5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO30KX3Nob3dJbmhlcml0ZWRDb21wdXRlZFN0eWxlQ2hhbmdlZCgpe3RoaXMudXBkYXRlKCk7fQpkb1VwZGF0ZSgpe2NvbnN0IHByb21pc2VzPVt0aGlzLl9jb21wdXRlZFN0eWxlTW9kZWwuZmV0Y2hDb21wdXRlZFN0eWxlKCksdGhpcy5fZmV0Y2hNYXRjaGVkQ2FzY2FkZSgpXTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnNwcmVhZCh0aGlzLl9pbm5lclJlYnVpbGRVcGRhdGUuYmluZCh0aGlzKSk7fQpfZmV0Y2hNYXRjaGVkQ2FzY2FkZSgpe2NvbnN0IG5vZGU9dGhpcy5fY29tcHV0ZWRTdHlsZU1vZGVsLm5vZGUoKTtpZighbm9kZXx8IXRoaXMuX2NvbXB1dGVkU3R5bGVNb2RlbC5jc3NNb2RlbCgpKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7cmV0dXJuIHRoaXMuX2NvbXB1dGVkU3R5bGVNb2RlbC5jc3NNb2RlbCgpLmNhY2hlZE1hdGNoZWRDYXNjYWRlRm9yTm9kZShub2RlKS50aGVuKHZhbGlkYXRlU3R5bGVzLmJpbmQodGhpcykpO2Z1bmN0aW9uIHZhbGlkYXRlU3R5bGVzKG1hdGNoZWRTdHlsZXMpe3JldHVybiBtYXRjaGVkU3R5bGVzJiZtYXRjaGVkU3R5bGVzLm5vZGUoKT09PXRoaXMuX2NvbXB1dGVkU3R5bGVNb2RlbC5ub2RlKCk/bWF0Y2hlZFN0eWxlczpudWxsO319Cl9wcm9jZXNzQ29sb3IodGV4dCl7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKHRleHQpO2lmKCFjb2xvcikKcmV0dXJuIGNyZWF0ZVRleHROb2RlKHRleHQpO2NvbnN0IHN3YXRjaD1JbmxpbmVFZGl0b3IuQ29sb3JTd2F0Y2guY3JlYXRlKCk7c3dhdGNoLnNldENvbG9yKGNvbG9yKTtzd2F0Y2guc2V0Rm9ybWF0KENvbW1vbi5Db2xvci5kZXRlY3RDb2xvckZvcm1hdChjb2xvcikpO3JldHVybiBzd2F0Y2g7fQpfaW5uZXJSZWJ1aWxkVXBkYXRlKG5vZGVTdHlsZSxtYXRjaGVkU3R5bGVzKXtjb25zdCBleHBhbmRlZFByb3BlcnRpZXM9bmV3IFNldCgpO2Zvcihjb25zdCB0cmVlRWxlbWVudCBvZiB0aGlzLl9wcm9wZXJ0aWVzT3V0bGluZS5yb290RWxlbWVudCgpLmNoaWxkcmVuKCkpe2lmKCF0cmVlRWxlbWVudC5leHBhbmRlZCkKY29udGludWU7Y29uc3QgcHJvcGVydHlOYW1lPXRyZWVFbGVtZW50W0VsZW1lbnRzLkNvbXB1dGVkU3R5bGVXaWRnZXQuX3Byb3BlcnR5U3ltYm9sXS5uYW1lO2V4cGFuZGVkUHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTt9CnRoaXMuX3Byb3BlcnRpZXNPdXRsaW5lLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fbGlua2lmaWVyLnJlc2V0KCk7Y29uc3QgY3NzTW9kZWw9dGhpcy5fY29tcHV0ZWRTdHlsZU1vZGVsLmNzc01vZGVsKCk7aWYoIW5vZGVTdHlsZXx8IW1hdGNoZWRTdHlsZXN8fCFjc3NNb2RlbCl7dGhpcy5fbm9NYXRjaGVzRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtyZXR1cm47fQpjb25zdCB1bmlxdWVQcm9wZXJ0aWVzPW5vZGVTdHlsZS5jb21wdXRlZFN0eWxlLmtleXNBcnJheSgpO3VuaXF1ZVByb3BlcnRpZXMuc29ydChwcm9wZXJ0eVNvcnRlcik7Y29uc3QgcHJvcGVydHlUcmFjZXM9dGhpcy5fY29tcHV0ZVByb3BlcnR5VHJhY2VzKG1hdGNoZWRTdHlsZXMpO2NvbnN0IGluaGVydGllZFByb3BlcnRpZXM9dGhpcy5fY29tcHV0ZUluaGVyaXRlZFByb3BlcnRpZXMobWF0Y2hlZFN0eWxlcyk7Y29uc3Qgc2hvd0luaGVyaXRlZD10aGlzLl9zaG93SW5oZXJpdGVkQ29tcHV0ZWRTdHlsZVByb3BlcnRpZXNTZXR0aW5nLmdldCgpO2ZvcihsZXQgaT0wO2k8dW5pcXVlUHJvcGVydGllcy5sZW5ndGg7KytpKXtjb25zdCBwcm9wZXJ0eU5hbWU9dW5pcXVlUHJvcGVydGllc1tpXTtjb25zdCBwcm9wZXJ0eVZhbHVlPW5vZGVTdHlsZS5jb21wdXRlZFN0eWxlLmdldChwcm9wZXJ0eU5hbWUpO2NvbnN0IGNhbm9uaWNhbE5hbWU9U0RLLmNzc01ldGFkYXRhKCkuY2Fub25pY2FsUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Y29uc3QgaW5oZXJpdGVkPSFpbmhlcnRpZWRQcm9wZXJ0aWVzLmhhcyhjYW5vbmljYWxOYW1lKTtpZighc2hvd0luaGVyaXRlZCYmaW5oZXJpdGVkJiYhKHByb3BlcnR5TmFtZSBpbiB0aGlzLl9hbHdheXNTaG93Q29tcHV0ZWRQcm9wZXJ0aWVzKSkKY29udGludWU7aWYoIXNob3dJbmhlcml0ZWQmJnByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCctLScpKQpjb250aW51ZTtpZihwcm9wZXJ0eU5hbWUhPT1jYW5vbmljYWxOYW1lJiZwcm9wZXJ0eVZhbHVlPT09bm9kZVN0eWxlLmNvbXB1dGVkU3R5bGUuZ2V0KGNhbm9uaWNhbE5hbWUpKQpjb250aW51ZTtjb25zdCBwcm9wZXJ0eUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7cHJvcGVydHlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbXB1dGVkLXN0eWxlLXByb3BlcnR5Jyk7cHJvcGVydHlFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2NvbXB1dGVkLXN0eWxlLXByb3BlcnR5LWluaGVyaXRlZCcsaW5oZXJpdGVkKTtjb25zdCByZW5kZXJlcj1uZXcgRWxlbWVudHMuU3R5bGVzU2lkZWJhclByb3BlcnR5UmVuZGVyZXIobnVsbCxub2RlU3R5bGUubm9kZSxwcm9wZXJ0eU5hbWUsKHByb3BlcnR5VmFsdWUpKTtyZW5kZXJlci5zZXRDb2xvckhhbmRsZXIodGhpcy5fcHJvY2Vzc0NvbG9yLmJpbmQodGhpcykpO2NvbnN0IHByb3BlcnR5TmFtZUVsZW1lbnQ9cmVuZGVyZXIucmVuZGVyTmFtZSgpO3Byb3BlcnR5TmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncHJvcGVydHktbmFtZScpO3Byb3BlcnR5RWxlbWVudC5hcHBlbmRDaGlsZChwcm9wZXJ0eU5hbWVFbGVtZW50KTtjb25zdCBjb2xvbj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnZGVsaW1ldGVyJyk7Y29sb24udGV4dENvbnRlbnQ9JzonO3Byb3BlcnR5TmFtZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY29sb24pO2NvbnN0IHByb3BlcnR5VmFsdWVFbGVtZW50PXByb3BlcnR5RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3Byb3BlcnR5LXZhbHVlJyk7Y29uc3QgcHJvcGVydHlWYWx1ZVRleHQ9cmVuZGVyZXIucmVuZGVyVmFsdWUoKTtwcm9wZXJ0eVZhbHVlVGV4dC5jbGFzc0xpc3QuYWRkKCdwcm9wZXJ0eS12YWx1ZS10ZXh0Jyk7cHJvcGVydHlWYWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvcGVydHlWYWx1ZVRleHQpO2NvbnN0IHNlbWljb2xvbj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnZGVsaW1ldGVyJyk7c2VtaWNvbG9uLnRleHRDb250ZW50PSc7Jztwcm9wZXJ0eVZhbHVlRWxlbWVudC5hcHBlbmRDaGlsZChzZW1pY29sb24pO2NvbnN0IHRyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudCgpO3RyZWVFbGVtZW50LnNlbGVjdGFibGU9ZmFsc2U7dHJlZUVsZW1lbnQudGl0bGU9cHJvcGVydHlFbGVtZW50O3RyZWVFbGVtZW50W0VsZW1lbnRzLkNvbXB1dGVkU3R5bGVXaWRnZXQuX3Byb3BlcnR5U3ltYm9sXT17bmFtZTpwcm9wZXJ0eU5hbWUsdmFsdWU6cHJvcGVydHlWYWx1ZX07Y29uc3QgaXNPZGQ9dGhpcy5fcHJvcGVydGllc091dGxpbmUucm9vdEVsZW1lbnQoKS5jaGlsZHJlbigpLmxlbmd0aCUyPT09MDt0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnb2RkLXJvdycsaXNPZGQpO3RoaXMuX3Byb3BlcnRpZXNPdXRsaW5lLmFwcGVuZENoaWxkKHRyZWVFbGVtZW50KTtjb25zdCB0cmFjZT1wcm9wZXJ0eVRyYWNlcy5nZXQocHJvcGVydHlOYW1lKTtpZih0cmFjZSl7Y29uc3QgYWN0aXZlUHJvcGVydHk9dGhpcy5fcmVuZGVyUHJvcGVydHlUcmFjZShjc3NNb2RlbCxtYXRjaGVkU3R5bGVzLG5vZGVTdHlsZS5ub2RlLHRyZWVFbGVtZW50LHRyYWNlKTt0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxlPT5lLmNvbnN1bWUoKSxmYWxzZSk7dHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyxlPT5lLmNvbnN1bWUoKSxmYWxzZSk7dHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxoYW5kbGVDbGljay5iaW5kKG51bGwsdHJlZUVsZW1lbnQpLGZhbHNlKTtjb25zdCBnb3RvU291cmNlRWxlbWVudD1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1hcnJvdy1pbi1jaXJjbGUnLCdnb3RvLXNvdXJjZS1pY29uJyk7Z290b1NvdXJjZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX25hdmlnYXRlVG9Tb3VyY2UuYmluZCh0aGlzLGFjdGl2ZVByb3BlcnR5KSk7cHJvcGVydHlWYWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZ290b1NvdXJjZUVsZW1lbnQpO2lmKGV4cGFuZGVkUHJvcGVydGllcy5oYXMocHJvcGVydHlOYW1lKSkKdHJlZUVsZW1lbnQuZXhwYW5kKCk7fX0KdGhpcy5fdXBkYXRlRmlsdGVyKHRoaXMuX2ZpbHRlclJlZ2V4KTtmdW5jdGlvbiBwcm9wZXJ0eVNvcnRlcihhLGIpe2lmKGEuc3RhcnRzV2l0aCgnLS0nKV5iLnN0YXJ0c1dpdGgoJy0tJykpCnJldHVybiBhLnN0YXJ0c1dpdGgoJy0tJyk/MTotMTtpZihhLnN0YXJ0c1dpdGgoJy13ZWJraXQnKV5iLnN0YXJ0c1dpdGgoJy13ZWJraXQnKSkKcmV0dXJuIGEuc3RhcnRzV2l0aCgnLXdlYmtpdCcpPzE6LTE7Y29uc3QgY2Fub25pY2FsMT1TREsuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUoYSk7Y29uc3QgY2Fub25pY2FsMj1TREsuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUoYik7cmV0dXJuIGNhbm9uaWNhbDEuY29tcGFyZVRvKGNhbm9uaWNhbDIpO30KZnVuY3Rpb24gaGFuZGxlQ2xpY2sodHJlZUVsZW1lbnQsZXZlbnQpe2lmKCF0cmVlRWxlbWVudC5leHBhbmRlZCkKdHJlZUVsZW1lbnQuZXhwYW5kKCk7ZWxzZQp0cmVlRWxlbWVudC5jb2xsYXBzZSgpO2V2ZW50LmNvbnN1bWUoKTt9fQpfbmF2aWdhdGVUb1NvdXJjZShjc3NQcm9wZXJ0eSxldmVudCl7Q29tbW9uLlJldmVhbGVyLnJldmVhbChjc3NQcm9wZXJ0eSk7ZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9yZW5kZXJQcm9wZXJ0eVRyYWNlKGNzc01vZGVsLG1hdGNoZWRTdHlsZXMsbm9kZSxyb290VHJlZUVsZW1lbnQsdHJhY2VkUHJvcGVydGllcyl7bGV0IGFjdGl2ZVByb3BlcnR5PW51bGw7Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHRyYWNlZFByb3BlcnRpZXMpe2NvbnN0IHRyYWNlPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RyYWNlLmNsYXNzTGlzdC5hZGQoJ3Byb3BlcnR5LXRyYWNlJyk7aWYobWF0Y2hlZFN0eWxlcy5wcm9wZXJ0eVN0YXRlKHByb3BlcnR5KT09PVNESy5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCkKdHJhY2UuY2xhc3NMaXN0LmFkZCgncHJvcGVydHktdHJhY2UtaW5hY3RpdmUnKTtlbHNlCmFjdGl2ZVByb3BlcnR5PXByb3BlcnR5O2NvbnN0IHJlbmRlcmVyPW5ldyBFbGVtZW50cy5TdHlsZXNTaWRlYmFyUHJvcGVydHlSZW5kZXJlcihudWxsLG5vZGUscHJvcGVydHkubmFtZSwocHJvcGVydHkudmFsdWUpKTtyZW5kZXJlci5zZXRDb2xvckhhbmRsZXIodGhpcy5fcHJvY2Vzc0NvbG9yLmJpbmQodGhpcykpO2NvbnN0IHZhbHVlRWxlbWVudD1yZW5kZXJlci5yZW5kZXJWYWx1ZSgpO3ZhbHVlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwcm9wZXJ0eS10cmFjZS12YWx1ZScpO3ZhbHVlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fbmF2aWdhdGVUb1NvdXJjZS5iaW5kKHRoaXMscHJvcGVydHkpLGZhbHNlKTtjb25zdCBnb3RvU291cmNlRWxlbWVudD1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1hcnJvdy1pbi1jaXJjbGUnLCdnb3RvLXNvdXJjZS1pY29uJyk7Z290b1NvdXJjZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX25hdmlnYXRlVG9Tb3VyY2UuYmluZCh0aGlzLHByb3BlcnR5KSk7dmFsdWVFbGVtZW50Lmluc2VydEJlZm9yZShnb3RvU291cmNlRWxlbWVudCx2YWx1ZUVsZW1lbnQuZmlyc3RDaGlsZCk7dHJhY2UuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTtjb25zdCBydWxlPXByb3BlcnR5Lm93bmVyU3R5bGUucGFyZW50UnVsZTtjb25zdCBzZWxlY3RvckVsZW1lbnQ9dHJhY2UuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdwcm9wZXJ0eS10cmFjZS1zZWxlY3RvcicpO3NlbGVjdG9yRWxlbWVudC50ZXh0Q29udGVudD1ydWxlP3J1bGUuc2VsZWN0b3JUZXh0KCk6J2VsZW1lbnQuc3R5bGUnO3NlbGVjdG9yRWxlbWVudC50aXRsZT1zZWxlY3RvckVsZW1lbnQudGV4dENvbnRlbnQ7aWYocnVsZSl7Y29uc3QgbGlua1NwYW49dHJhY2UuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd0cmFjZS1saW5rJyk7bGlua1NwYW4uYXBwZW5kQ2hpbGQoRWxlbWVudHMuU3R5bGVQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVSdWxlT3JpZ2luTm9kZShtYXRjaGVkU3R5bGVzLHRoaXMuX2xpbmtpZmllcixydWxlKSk7fQpjb25zdCB0cmFjZVRyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudCgpO3RyYWNlVHJlZUVsZW1lbnQudGl0bGU9dHJhY2U7dHJhY2VUcmVlRWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO3Jvb3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZCh0cmFjZVRyZWVFbGVtZW50KTt9CnJldHVybihhY3RpdmVQcm9wZXJ0eSk7fQpfY29tcHV0ZVByb3BlcnR5VHJhY2VzKG1hdGNoZWRTdHlsZXMpe2NvbnN0IHJlc3VsdD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHN0eWxlIG9mIG1hdGNoZWRTdHlsZXMubm9kZVN0eWxlcygpKXtjb25zdCBhbGxQcm9wZXJ0aWVzPXN0eWxlLmFsbFByb3BlcnRpZXMoKTtmb3IoY29uc3QgcHJvcGVydHkgb2YgYWxsUHJvcGVydGllcyl7aWYoIXByb3BlcnR5LmFjdGl2ZUluU3R5bGUoKXx8IW1hdGNoZWRTdHlsZXMucHJvcGVydHlTdGF0ZShwcm9wZXJ0eSkpCmNvbnRpbnVlO2lmKCFyZXN1bHQuaGFzKHByb3BlcnR5Lm5hbWUpKQpyZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUsW10pO3Jlc3VsdC5nZXQocHJvcGVydHkubmFtZSkucHVzaChwcm9wZXJ0eSk7fX0KcmV0dXJuIHJlc3VsdDt9Cl9jb21wdXRlSW5oZXJpdGVkUHJvcGVydGllcyhtYXRjaGVkU3R5bGVzKXtjb25zdCByZXN1bHQ9bmV3IFNldCgpO2Zvcihjb25zdCBzdHlsZSBvZiBtYXRjaGVkU3R5bGVzLm5vZGVTdHlsZXMoKSl7Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHN0eWxlLmFsbFByb3BlcnRpZXMoKSl7aWYoIW1hdGNoZWRTdHlsZXMucHJvcGVydHlTdGF0ZShwcm9wZXJ0eSkpCmNvbnRpbnVlO3Jlc3VsdC5hZGQoU0RLLmNzc01ldGFkYXRhKCkuY2Fub25pY2FsUHJvcGVydHlOYW1lKHByb3BlcnR5Lm5hbWUpKTt9fQpyZXR1cm4gcmVzdWx0O30KX3VwZGF0ZUZpbHRlcihyZWdleCl7Y29uc3QgY2hpbGRyZW49dGhpcy5fcHJvcGVydGllc091dGxpbmUucm9vdEVsZW1lbnQoKS5jaGlsZHJlbigpO2xldCBoYXNNYXRjaD1mYWxzZTtmb3IoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pe2NvbnN0IHByb3BlcnR5PWNoaWxkW0VsZW1lbnRzLkNvbXB1dGVkU3R5bGVXaWRnZXQuX3Byb3BlcnR5U3ltYm9sXTtjb25zdCBtYXRjaGVkPSFyZWdleHx8cmVnZXgudGVzdChwcm9wZXJ0eS5uYW1lKXx8cmVnZXgudGVzdChwcm9wZXJ0eS52YWx1ZSk7Y2hpbGQuaGlkZGVuPSFtYXRjaGVkO2hhc01hdGNofD1tYXRjaGVkO30KdGhpcy5fbm9NYXRjaGVzRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLGhhc01hdGNoKTt9fTtFbGVtZW50cy5Db21wdXRlZFN0eWxlV2lkZ2V0Ll9tYXhMaW5rTGVuZ3RoPTMwO0VsZW1lbnRzLkNvbXB1dGVkU3R5bGVXaWRnZXQuX3Byb3BlcnR5U3ltYm9sPVN5bWJvbCgncHJvcGVydHknKTs7RWxlbWVudHMuRWxlbWVudHNQYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKCl7c3VwZXIoJ2VsZW1lbnRzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdlbGVtZW50cy9lbGVtZW50c1BhbmVsLmNzcycpO3RoaXMuX3NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLHRydWUsJ2VsZW1lbnRzUGFuZWxTcGxpdFZpZXdTdGF0ZScsMzI1LDMyNSk7dGhpcy5fc3BsaXRXaWRnZXQuYWRkRXZlbnRMaXN0ZW5lcihVSS5TcGxpdFdpZGdldC5FdmVudHMuU2lkZWJhclNpemVDaGFuZ2VkLHRoaXMuX3VwZGF0ZVRyZWVPdXRsaW5lVmlzaWJsZVdpZHRoLmJpbmQodGhpcykpO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9zZWFyY2hhYmxlVmlldz1uZXcgVUkuU2VhcmNoYWJsZVZpZXcodGhpcyk7dGhpcy5fc2VhcmNoYWJsZVZpZXcuc2V0TWluaW11bVNpemUoMjUsMjgpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNldFBsYWNlaG9sZGVyKENvbW1vbi5VSVN0cmluZygnRmluZCBieSBzdHJpbmcsIHNlbGVjdG9yLCBvciBYUGF0aCcpKTtjb25zdCBzdGFja0VsZW1lbnQ9dGhpcy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudDt0aGlzLl9jb250ZW50RWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtjb25zdCBjcnVtYnNDb250YWluZXI9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7c3RhY2tFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRlbnRFbGVtZW50KTtzdGFja0VsZW1lbnQuYXBwZW5kQ2hpbGQoY3J1bWJzQ29udGFpbmVyKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX3NlYXJjaGFibGVWaWV3KTt0aGlzLl9zcGxpdE1vZGU9bnVsbDt0aGlzLl9jb250ZW50RWxlbWVudC5pZD0nZWxlbWVudHMtY29udGVudCc7aWYoQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2RvbVdvcmRXcmFwJykuZ2V0KCkpCnRoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2VsZW1lbnRzLXdyYXAnKTtDb21tb24ubW9kdWxlU2V0dGluZygnZG9tV29yZFdyYXAnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9kb21Xb3JkV3JhcFNldHRpbmdDaGFuZ2VkLmJpbmQodGhpcykpO2NydW1ic0NvbnRhaW5lci5pZD0nZWxlbWVudHMtY3J1bWJzJzt0aGlzLl9icmVhZGNydW1icz1uZXcgRWxlbWVudHMuRWxlbWVudHNCcmVhZGNydW1icygpO3RoaXMuX2JyZWFkY3J1bWJzLnNob3coY3J1bWJzQ29udGFpbmVyKTt0aGlzLl9icmVhZGNydW1icy5hZGRFdmVudExpc3RlbmVyKEVsZW1lbnRzLkVsZW1lbnRzQnJlYWRjcnVtYnMuRXZlbnRzLk5vZGVTZWxlY3RlZCx0aGlzLl9jcnVtYk5vZGVTZWxlY3RlZCx0aGlzKTt0aGlzLl9zdHlsZXNXaWRnZXQ9bmV3IEVsZW1lbnRzLlN0eWxlc1NpZGViYXJQYW5lKCk7dGhpcy5fY29tcHV0ZWRTdHlsZVdpZGdldD1uZXcgRWxlbWVudHMuQ29tcHV0ZWRTdHlsZVdpZGdldCgpO3RoaXMuX21ldHJpY3NXaWRnZXQ9bmV3IEVsZW1lbnRzLk1ldHJpY3NTaWRlYmFyUGFuZSgpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaWRlYmFyUG9zaXRpb24nKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGVTaWRlYmFyUG9zaXRpb24uYmluZCh0aGlzKSk7dGhpcy5fdXBkYXRlU2lkZWJhclBvc2l0aW9uKCk7dGhpcy5fdHJlZU91dGxpbmVzPVtdO3RoaXMuX3RyZWVPdXRsaW5lSGVhZGVycz1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuRE9NTW9kZWwsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuTmFtZUNoYW5nZWQsZXZlbnQ9PnRoaXMuX3RhcmdldE5hbWVDaGFuZ2VkKChldmVudC5kYXRhKSkpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93VUFTaGFkb3dET00nKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9zaG93VUFTaGFkb3dET01DaGFuZ2VkLmJpbmQodGhpcykpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRPTU1vZGVsLFNESy5ET01Nb2RlbC5FdmVudHMuRG9jdW1lbnRVcGRhdGVkLHRoaXMuX2RvY3VtZW50VXBkYXRlZEV2ZW50LHRoaXMpO0V4dGVuc2lvbnMuZXh0ZW5zaW9uU2VydmVyLmFkZEV2ZW50TGlzdGVuZXIoRXh0ZW5zaW9ucy5FeHRlbnNpb25TZXJ2ZXIuRXZlbnRzLlNpZGViYXJQYW5lQWRkZWQsdGhpcy5fZXh0ZW5zaW9uU2lkZWJhclBhbmVBZGRlZCx0aGlzKTt9CnN0YXRpYyBpbnN0YW5jZSgpe3JldHVybihzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoRWxlbWVudHMuRWxlbWVudHNQYW5lbCkpO30KX3JldmVhbFByb3BlcnR5KGNzc1Byb3BlcnR5KXtyZXR1cm4gdGhpcy5zaWRlYmFyUGFuZVZpZXcuc2hvd1ZpZXcodGhpcy5fc3R5bGVzVmlld1RvUmV2ZWFsKS50aGVuKCgpPT57dGhpcy5fc3R5bGVzV2lkZ2V0LnJldmVhbFByb3BlcnR5KChjc3NQcm9wZXJ0eSkpO30pO30KcmVzb2x2ZUxvY2F0aW9uKGxvY2F0aW9uTmFtZSl7cmV0dXJuIHRoaXMuc2lkZWJhclBhbmVWaWV3O30Kc2hvd1Rvb2xiYXJQYW5lKHdpZGdldCx0b2dnbGUpe3RoaXMuX3N0eWxlc1dpZGdldC5zaG93VG9vbGJhclBhbmUod2lkZ2V0LHRvZ2dsZSk7fQptb2RlbEFkZGVkKGRvbU1vZGVsKXtjb25zdCBwYXJlbnRNb2RlbD1kb21Nb2RlbC5wYXJlbnRNb2RlbCgpO2xldCB0cmVlT3V0bGluZT1wYXJlbnRNb2RlbD9FbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLmZvckRPTU1vZGVsKHBhcmVudE1vZGVsKTpudWxsO2lmKCF0cmVlT3V0bGluZSl7dHJlZU91dGxpbmU9bmV3IEVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUodHJ1ZSx0cnVlKTt0cmVlT3V0bGluZS5zZXRXb3JkV3JhcChDb21tb24ubW9kdWxlU2V0dGluZygnZG9tV29yZFdyYXAnKS5nZXQoKSk7dHJlZU91dGxpbmUuYWRkRXZlbnRMaXN0ZW5lcihFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLkV2ZW50cy5TZWxlY3RlZE5vZGVDaGFuZ2VkLHRoaXMuX3NlbGVjdGVkTm9kZUNoYW5nZWQsdGhpcyk7dHJlZU91dGxpbmUuYWRkRXZlbnRMaXN0ZW5lcihFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50c1RyZWVVcGRhdGVkLHRoaXMuX3VwZGF0ZUJyZWFkY3J1bWJJZk5lZWRlZCx0aGlzKTtuZXcgRWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudEhpZ2hsaWdodGVyKHRyZWVPdXRsaW5lKTt0aGlzLl90cmVlT3V0bGluZXMucHVzaCh0cmVlT3V0bGluZSk7aWYoZG9tTW9kZWwudGFyZ2V0KCkucGFyZW50VGFyZ2V0KCkpe3RoaXMuX3RyZWVPdXRsaW5lSGVhZGVycy5zZXQodHJlZU91dGxpbmUsY3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZWxlbWVudHMtdHJlZS1oZWFkZXInKSk7dGhpcy5fdGFyZ2V0TmFtZUNoYW5nZWQoZG9tTW9kZWwudGFyZ2V0KCkpO319CnRyZWVPdXRsaW5lLndpcmVUb0RPTU1vZGVsKGRvbU1vZGVsKTtpZih0aGlzLmlzU2hvd2luZygpKQp0aGlzLndhc1Nob3duKCk7fQptb2RlbFJlbW92ZWQoZG9tTW9kZWwpe2NvbnN0IHRyZWVPdXRsaW5lPUVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuZm9yRE9NTW9kZWwoZG9tTW9kZWwpO3RyZWVPdXRsaW5lLnVud2lyZUZyb21ET01Nb2RlbChkb21Nb2RlbCk7aWYoZG9tTW9kZWwucGFyZW50TW9kZWwoKSkKcmV0dXJuO3RoaXMuX3RyZWVPdXRsaW5lcy5yZW1vdmUodHJlZU91dGxpbmUpO2NvbnN0IGhlYWRlcj10aGlzLl90cmVlT3V0bGluZUhlYWRlcnMuZ2V0KHRyZWVPdXRsaW5lKTtpZihoZWFkZXIpCmhlYWRlci5yZW1vdmUoKTt0aGlzLl90cmVlT3V0bGluZUhlYWRlcnMuZGVsZXRlKHRyZWVPdXRsaW5lKTt0cmVlT3V0bGluZS5lbGVtZW50LnJlbW92ZSgpO30KX3RhcmdldE5hbWVDaGFuZ2VkKHRhcmdldCl7Y29uc3QgZG9tTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5ET01Nb2RlbCk7aWYoIWRvbU1vZGVsKQpyZXR1cm47Y29uc3QgdHJlZU91dGxpbmU9RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChkb21Nb2RlbCk7aWYoIXRyZWVPdXRsaW5lKQpyZXR1cm47Y29uc3QgaGVhZGVyPXRoaXMuX3RyZWVPdXRsaW5lSGVhZGVycy5nZXQodHJlZU91dGxpbmUpO2lmKCFoZWFkZXIpCnJldHVybjtoZWFkZXIucmVtb3ZlQ2hpbGRyZW4oKTtoZWFkZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2VsZW1lbnRzLXRyZWUtaGVhZGVyLWZyYW1lJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdGcmFtZScpO2hlYWRlci5hcHBlbmRDaGlsZChDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5VVJMKHRhcmdldC5pbnNwZWN0ZWRVUkwoKSx7dGV4dDp0YXJnZXQubmFtZSgpfSkpO30KX3VwZGF0ZVRyZWVPdXRsaW5lVmlzaWJsZVdpZHRoKCl7aWYoIXRoaXMuX3RyZWVPdXRsaW5lcy5sZW5ndGgpCnJldHVybjtsZXQgd2lkdGg9dGhpcy5fc3BsaXRXaWRnZXQuZWxlbWVudC5vZmZzZXRXaWR0aDtpZih0aGlzLl9zcGxpdFdpZGdldC5pc1ZlcnRpY2FsKCkpCndpZHRoLT10aGlzLl9zcGxpdFdpZGdldC5zaWRlYmFyU2l6ZSgpO2ZvcihsZXQgaT0wO2k8dGhpcy5fdHJlZU91dGxpbmVzLmxlbmd0aDsrK2kpCnRoaXMuX3RyZWVPdXRsaW5lc1tpXS5zZXRWaXNpYmxlV2lkdGgod2lkdGgpO3RoaXMuX2JyZWFkY3J1bWJzLnVwZGF0ZVNpemVzKCk7fQpmb2N1cygpe2lmKHRoaXMuX3RyZWVPdXRsaW5lcy5sZW5ndGgpCnRoaXMuX3RyZWVPdXRsaW5lc1swXS5mb2N1cygpO30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc2VhcmNoYWJsZVZpZXc7fQp3YXNTaG93bigpe1VJLmNvbnRleHQuc2V0Rmxhdm9yKEVsZW1lbnRzLkVsZW1lbnRzUGFuZWwsdGhpcyk7Zm9yKGxldCBpPTA7aTx0aGlzLl90cmVlT3V0bGluZXMubGVuZ3RoOysraSl7Y29uc3QgdHJlZU91dGxpbmU9dGhpcy5fdHJlZU91dGxpbmVzW2ldO2lmKHRyZWVPdXRsaW5lLmVsZW1lbnQucGFyZW50RWxlbWVudCE9PXRoaXMuX2NvbnRlbnRFbGVtZW50KXtjb25zdCBoZWFkZXI9dGhpcy5fdHJlZU91dGxpbmVIZWFkZXJzLmdldCh0cmVlT3V0bGluZSk7aWYoaGVhZGVyKQp0aGlzLl9jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXIpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRyZWVPdXRsaW5lLmVsZW1lbnQpO319CnN1cGVyLndhc1Nob3duKCk7dGhpcy5fYnJlYWRjcnVtYnMudXBkYXRlKCk7Y29uc3QgZG9tTW9kZWxzPVNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRE9NTW9kZWwpO2Zvcihjb25zdCBkb21Nb2RlbCBvZiBkb21Nb2RlbHMpe2lmKGRvbU1vZGVsLnBhcmVudE1vZGVsKCkpCmNvbnRpbnVlO2NvbnN0IHRyZWVPdXRsaW5lPUVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuZm9yRE9NTW9kZWwoZG9tTW9kZWwpO3RyZWVPdXRsaW5lLnNldFZpc2libGUodHJ1ZSk7aWYoIXRyZWVPdXRsaW5lLnJvb3RET01Ob2RlKXtpZihkb21Nb2RlbC5leGlzdGluZ0RvY3VtZW50KCkpe3RyZWVPdXRsaW5lLnJvb3RET01Ob2RlPWRvbU1vZGVsLmV4aXN0aW5nRG9jdW1lbnQoKTt0aGlzLl9kb2N1bWVudFVwZGF0ZWQoZG9tTW9kZWwpO31lbHNle2RvbU1vZGVsLnJlcXVlc3REb2N1bWVudCgpO319fX0Kd2lsbEhpZGUoKXtTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7Zm9yKGxldCBpPTA7aTx0aGlzLl90cmVlT3V0bGluZXMubGVuZ3RoOysraSl7Y29uc3QgdHJlZU91dGxpbmU9dGhpcy5fdHJlZU91dGxpbmVzW2ldO3RyZWVPdXRsaW5lLnNldFZpc2libGUoZmFsc2UpO3RoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRyZWVPdXRsaW5lLmVsZW1lbnQpO2NvbnN0IGhlYWRlcj10aGlzLl90cmVlT3V0bGluZUhlYWRlcnMuZ2V0KHRyZWVPdXRsaW5lKTtpZihoZWFkZXIpCnRoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGhlYWRlcik7fQppZih0aGlzLl9wb3BvdmVySGVscGVyKQp0aGlzLl9wb3BvdmVySGVscGVyLmhpZGVQb3BvdmVyKCk7c3VwZXIud2lsbEhpZGUoKTt9Cm9uUmVzaXplKCl7dGhpcy5lbGVtZW50LndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVTaWRlYmFyUG9zaXRpb24uYmluZCh0aGlzKSk7dGhpcy5fdXBkYXRlVHJlZU91dGxpbmVWaXNpYmxlV2lkdGgoKTt9Cl9zZWxlY3RlZE5vZGVDaGFuZ2VkKGV2ZW50KXtjb25zdCBzZWxlY3RlZE5vZGU9KGV2ZW50LmRhdGEubm9kZSk7Y29uc3QgZm9jdXM9KGV2ZW50LmRhdGEuZm9jdXMpO2Zvcihjb25zdCB0cmVlT3V0bGluZSBvZiB0aGlzLl90cmVlT3V0bGluZXMpe2lmKCFzZWxlY3RlZE5vZGV8fEVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuZm9yRE9NTW9kZWwoc2VsZWN0ZWROb2RlLmRvbU1vZGVsKCkpIT09dHJlZU91dGxpbmUpCnRyZWVPdXRsaW5lLnNlbGVjdERPTU5vZGUobnVsbCk7fQp0aGlzLl9icmVhZGNydW1icy5zZXRTZWxlY3RlZE5vZGUoc2VsZWN0ZWROb2RlKTtVSS5jb250ZXh0LnNldEZsYXZvcihTREsuRE9NTm9kZSxzZWxlY3RlZE5vZGUpO2lmKCFzZWxlY3RlZE5vZGUpCnJldHVybjtzZWxlY3RlZE5vZGUuc2V0QXNJbnNwZWN0ZWROb2RlKCk7aWYoZm9jdXMpe3RoaXMuX3NlbGVjdGVkTm9kZU9uUmVzZXQ9c2VsZWN0ZWROb2RlO3RoaXMuX2hhc05vbkRlZmF1bHRTZWxlY3RlZE5vZGU9dHJ1ZTt9CmNvbnN0IGV4ZWN1dGlvbkNvbnRleHRzPXNlbGVjdGVkTm9kZS5kb21Nb2RlbCgpLnJ1bnRpbWVNb2RlbCgpLmV4ZWN1dGlvbkNvbnRleHRzKCk7Y29uc3Qgbm9kZUZyYW1lSWQ9c2VsZWN0ZWROb2RlLmZyYW1lSWQoKTtmb3IoY29uc3QgY29udGV4dCBvZiBleGVjdXRpb25Db250ZXh0cyl7aWYoY29udGV4dC5mcmFtZUlkPT09bm9kZUZyYW1lSWQpe1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0LGNvbnRleHQpO2JyZWFrO319fQpfZG9jdW1lbnRVcGRhdGVkRXZlbnQoZXZlbnQpe2NvbnN0IGRvbU1vZGVsPShldmVudC5kYXRhKTt0aGlzLl9kb2N1bWVudFVwZGF0ZWQoZG9tTW9kZWwpO30KX2RvY3VtZW50VXBkYXRlZChkb21Nb2RlbCl7dGhpcy5fc2VhcmNoYWJsZVZpZXcucmVzZXRTZWFyY2goKTtpZighZG9tTW9kZWwuZXhpc3RpbmdEb2N1bWVudCgpKXtpZih0aGlzLmlzU2hvd2luZygpKQpkb21Nb2RlbC5yZXF1ZXN0RG9jdW1lbnQoKTtyZXR1cm47fQp0aGlzLl9oYXNOb25EZWZhdWx0U2VsZWN0ZWROb2RlPWZhbHNlO2lmKHRoaXMuX29taXREZWZhdWx0U2VsZWN0aW9uKQpyZXR1cm47Y29uc3Qgc2F2ZWRTZWxlY3RlZE5vZGVPblJlc2V0PXRoaXMuX3NlbGVjdGVkTm9kZU9uUmVzZXQ7cmVzdG9yZU5vZGUuY2FsbCh0aGlzLGRvbU1vZGVsLHRoaXMuX3NlbGVjdGVkTm9kZU9uUmVzZXQpO2FzeW5jIGZ1bmN0aW9uIHJlc3RvcmVOb2RlKGRvbU1vZGVsLHN0YWxlTm9kZSl7Y29uc3Qgbm9kZVBhdGg9c3RhbGVOb2RlP3N0YWxlTm9kZS5wYXRoKCk6bnVsbDtjb25zdCByZXN0b3JlZE5vZGVJZD1ub2RlUGF0aD9hd2FpdCBkb21Nb2RlbC5wdXNoTm9kZUJ5UGF0aFRvRnJvbnRlbmQobm9kZVBhdGgpOm51bGw7aWYoc2F2ZWRTZWxlY3RlZE5vZGVPblJlc2V0IT09dGhpcy5fc2VsZWN0ZWROb2RlT25SZXNldCkKcmV0dXJuO2xldCBub2RlPXJlc3RvcmVkTm9kZUlkP2RvbU1vZGVsLm5vZGVGb3JJZChyZXN0b3JlZE5vZGVJZCk6bnVsbDtpZighbm9kZSl7Y29uc3QgaW5zcGVjdGVkRG9jdW1lbnQ9ZG9tTW9kZWwuZXhpc3RpbmdEb2N1bWVudCgpO25vZGU9aW5zcGVjdGVkRG9jdW1lbnQ/aW5zcGVjdGVkRG9jdW1lbnQuYm9keXx8aW5zcGVjdGVkRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Om51bGw7fQp0aGlzLl9zZXREZWZhdWx0U2VsZWN0ZWROb2RlKG5vZGUpO3RoaXMuX2xhc3RTZWxlY3RlZE5vZGVTZWxlY3RlZEZvclRlc3QoKTt9fQpfbGFzdFNlbGVjdGVkTm9kZVNlbGVjdGVkRm9yVGVzdCgpe30KX3NldERlZmF1bHRTZWxlY3RlZE5vZGUobm9kZSl7aWYoIW5vZGV8fHRoaXMuX2hhc05vbkRlZmF1bHRTZWxlY3RlZE5vZGV8fHRoaXMuX3BlbmRpbmdOb2RlUmV2ZWFsKQpyZXR1cm47Y29uc3QgdHJlZU91dGxpbmU9RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChub2RlLmRvbU1vZGVsKCkpO2lmKCF0cmVlT3V0bGluZSkKcmV0dXJuO3RoaXMuc2VsZWN0RE9NTm9kZShub2RlKTtpZih0cmVlT3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50KQp0cmVlT3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50LmV4cGFuZCgpO30Kc2VhcmNoQ2FuY2VsZWQoKXtkZWxldGUgdGhpcy5fc2VhcmNoQ29uZmlnO3RoaXMuX2hpZGVTZWFyY2hIaWdobGlnaHRzKCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KDApO2RlbGV0ZSB0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg7ZGVsZXRlIHRoaXMuX3NlYXJjaFJlc3VsdHM7U0RLLkRPTU1vZGVsLmNhbmNlbFNlYXJjaCgpO30KcGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXtjb25zdCBxdWVyeT1zZWFyY2hDb25maWcucXVlcnk7Y29uc3Qgd2hpdGVzcGFjZVRyaW1tZWRRdWVyeT1xdWVyeS50cmltKCk7aWYoIXdoaXRlc3BhY2VUcmltbWVkUXVlcnkubGVuZ3RoKQpyZXR1cm47aWYoIXRoaXMuX3NlYXJjaENvbmZpZ3x8dGhpcy5fc2VhcmNoQ29uZmlnLnF1ZXJ5IT09cXVlcnkpCnRoaXMuc2VhcmNoQ2FuY2VsZWQoKTtlbHNlCnRoaXMuX2hpZGVTZWFyY2hIaWdobGlnaHRzKCk7dGhpcy5fc2VhcmNoQ29uZmlnPXNlYXJjaENvbmZpZztjb25zdCBzaG93VUFTaGFkb3dET009Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dVQVNoYWRvd0RPTScpLmdldCgpO2NvbnN0IGRvbU1vZGVscz1TREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRPTU1vZGVsKTtjb25zdCBwcm9taXNlcz1kb21Nb2RlbHMubWFwKGRvbU1vZGVsPT5kb21Nb2RlbC5wZXJmb3JtU2VhcmNoKHdoaXRlc3BhY2VUcmltbWVkUXVlcnksc2hvd1VBU2hhZG93RE9NKSk7UHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4ocmVzdWx0Q291bnRDYWxsYmFjay5iaW5kKHRoaXMpKTtmdW5jdGlvbiByZXN1bHRDb3VudENhbGxiYWNrKHJlc3VsdENvdW50cyl7dGhpcy5fc2VhcmNoUmVzdWx0cz1bXTtmb3IobGV0IGk9MDtpPHJlc3VsdENvdW50cy5sZW5ndGg7KytpKXtjb25zdCByZXN1bHRDb3VudD1yZXN1bHRDb3VudHNbaV07Zm9yKGxldCBqPTA7ajxyZXN1bHRDb3VudDsrK2opCnRoaXMuX3NlYXJjaFJlc3VsdHMucHVzaCh7ZG9tTW9kZWw6ZG9tTW9kZWxzW2ldLGluZGV4Omosbm9kZTp1bmRlZmluZWR9KTt9CnRoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudCh0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCk7aWYoIXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKQpyZXR1cm47aWYodGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4Pj10aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKdGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4PXVuZGVmaW5lZDtsZXQgaW5kZXg9dGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4O2lmKHNob3VsZEp1bXApe2lmKHRoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD09PXVuZGVmaW5lZCkKaW5kZXg9anVtcEJhY2t3YXJkcz8tMTowO2Vsc2UKaW5kZXg9anVtcEJhY2t3YXJkcz9pbmRleC0xOmluZGV4KzE7dGhpcy5fanVtcFRvU2VhcmNoUmVzdWx0KGluZGV4KTt9fX0KX2RvbVdvcmRXcmFwU2V0dGluZ0NoYW5nZWQoZXZlbnQpe3RoaXMuX2NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2VsZW1lbnRzLXdyYXAnLGV2ZW50LmRhdGEpO2ZvcihsZXQgaT0wO2k8dGhpcy5fdHJlZU91dGxpbmVzLmxlbmd0aDsrK2kpCnRoaXMuX3RyZWVPdXRsaW5lc1tpXS5zZXRXb3JkV3JhcCgoZXZlbnQuZGF0YSkpO30Kc3dpdGNoVG9BbmRGb2N1cyhub2RlKXt0aGlzLl9zZWFyY2hhYmxlVmlldy5jYW5jZWxTZWFyY2goKTtVSS52aWV3TWFuYWdlci5zaG93VmlldygnZWxlbWVudHMnKS50aGVuKCgpPT50aGlzLnNlbGVjdERPTU5vZGUobm9kZSx0cnVlKSk7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2xldCBsaW5rPWV2ZW50LnRhcmdldDt3aGlsZShsaW5rJiYhbGlua1tFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkhyZWZTeW1ib2xdKQpsaW5rPWxpbmsucGFyZW50RWxlbWVudE9yU2hhZG93SG9zdCgpO2lmKCFsaW5rKQpyZXR1cm4gbnVsbDtyZXR1cm57Ym94OmxpbmsuYm94SW5XaW5kb3coKSxzaG93OmFzeW5jIHBvcG92ZXI9Pntjb25zdCBub2RlPXRoaXMuc2VsZWN0ZWRET01Ob2RlKCk7aWYoIW5vZGUpCnJldHVybiBmYWxzZTtjb25zdCBwcmV2aWV3PWF3YWl0IEJyb3dzZXJDb21wb25lbnRzLkltYWdlUHJldmlldy5idWlsZChub2RlLmRvbU1vZGVsKCkudGFyZ2V0KCksbGlua1tFbGVtZW50cy5FbGVtZW50c1RyZWVFbGVtZW50LkhyZWZTeW1ib2xdLHRydWUpO2lmKHByZXZpZXcpCnBvcG92ZXIuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocHJldmlldyk7cmV0dXJuISFwcmV2aWV3O319O30KX2p1bXBUb1NlYXJjaFJlc3VsdChpbmRleCl7dGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4PShpbmRleCt0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkldGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGg7dGhpcy5faGlnaGxpZ2h0Q3VycmVudFNlYXJjaFJlc3VsdCgpO30KanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzKQpyZXR1cm47dGhpcy5wZXJmb3JtU2VhcmNoKHRoaXMuX3NlYXJjaENvbmZpZyx0cnVlKTt9Cmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCl7aWYoIXRoaXMuX3NlYXJjaFJlc3VsdHMpCnJldHVybjt0aGlzLnBlcmZvcm1TZWFyY2godGhpcy5fc2VhcmNoQ29uZmlnLHRydWUsdHJ1ZSk7fQpzdXBwb3J0c0Nhc2VTZW5zaXRpdmVTZWFyY2goKXtyZXR1cm4gZmFsc2U7fQpzdXBwb3J0c1JlZ2V4U2VhcmNoKCl7cmV0dXJuIGZhbHNlO30KX2hpZ2hsaWdodEN1cnJlbnRTZWFyY2hSZXN1bHQoKXtjb25zdCBpbmRleD10aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg7Y29uc3Qgc2VhcmNoUmVzdWx0cz10aGlzLl9zZWFyY2hSZXN1bHRzO2NvbnN0IHNlYXJjaFJlc3VsdD1zZWFyY2hSZXN1bHRzW2luZGV4XTt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVDdXJyZW50TWF0Y2hJbmRleChpbmRleCk7aWYoc2VhcmNoUmVzdWx0Lm5vZGU9PT1udWxsKQpyZXR1cm47aWYodHlwZW9mIHNlYXJjaFJlc3VsdC5ub2RlPT09J3VuZGVmaW5lZCcpe3NlYXJjaFJlc3VsdC5kb21Nb2RlbC5zZWFyY2hSZXN1bHQoc2VhcmNoUmVzdWx0LmluZGV4KS50aGVuKG5vZGU9PntzZWFyY2hSZXN1bHQubm9kZT1ub2RlO3RoaXMuX2hpZ2hsaWdodEN1cnJlbnRTZWFyY2hSZXN1bHQoKTt9KTtyZXR1cm47fQpjb25zdCB0cmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudEZvck5vZGUoc2VhcmNoUmVzdWx0Lm5vZGUpO3NlYXJjaFJlc3VsdC5ub2RlLnNjcm9sbEludG9WaWV3KCk7aWYodHJlZUVsZW1lbnQpe3RyZWVFbGVtZW50LmhpZ2hsaWdodFNlYXJjaFJlc3VsdHModGhpcy5fc2VhcmNoQ29uZmlnLnF1ZXJ5KTt0cmVlRWxlbWVudC5yZXZlYWwoKTtjb25zdCBtYXRjaGVzPXRyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFVJLmhpZ2hsaWdodGVkU2VhcmNoUmVzdWx0Q2xhc3NOYW1lKTtpZihtYXRjaGVzLmxlbmd0aCkKbWF0Y2hlc1swXS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKGZhbHNlKTt9fQpfaGlkZVNlYXJjaEhpZ2hsaWdodHMoKXtpZighdGhpcy5fc2VhcmNoUmVzdWx0c3x8IXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RofHx0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg9PT11bmRlZmluZWQpCnJldHVybjtjb25zdCBzZWFyY2hSZXN1bHQ9dGhpcy5fc2VhcmNoUmVzdWx0c1t0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXhdO2lmKCFzZWFyY2hSZXN1bHQubm9kZSkKcmV0dXJuO2NvbnN0IHRyZWVPdXRsaW5lPUVsZW1lbnRzLkVsZW1lbnRzVHJlZU91dGxpbmUuZm9yRE9NTW9kZWwoc2VhcmNoUmVzdWx0Lm5vZGUuZG9tTW9kZWwoKSk7Y29uc3QgdHJlZUVsZW1lbnQ9dHJlZU91dGxpbmUuZmluZFRyZWVFbGVtZW50KHNlYXJjaFJlc3VsdC5ub2RlKTtpZih0cmVlRWxlbWVudCkKdHJlZUVsZW1lbnQuaGlkZVNlYXJjaEhpZ2hsaWdodHMoKTt9CnNlbGVjdGVkRE9NTm9kZSgpe2ZvcihsZXQgaT0wO2k8dGhpcy5fdHJlZU91dGxpbmVzLmxlbmd0aDsrK2kpe2NvbnN0IHRyZWVPdXRsaW5lPXRoaXMuX3RyZWVPdXRsaW5lc1tpXTtpZih0cmVlT3V0bGluZS5zZWxlY3RlZERPTU5vZGUoKSkKcmV0dXJuIHRyZWVPdXRsaW5lLnNlbGVjdGVkRE9NTm9kZSgpO30KcmV0dXJuIG51bGw7fQpzZWxlY3RET01Ob2RlKG5vZGUsZm9jdXMpe2Zvcihjb25zdCB0cmVlT3V0bGluZSBvZiB0aGlzLl90cmVlT3V0bGluZXMpe2NvbnN0IG91dGxpbmU9RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChub2RlLmRvbU1vZGVsKCkpO2lmKG91dGxpbmU9PT10cmVlT3V0bGluZSkKdHJlZU91dGxpbmUuc2VsZWN0RE9NTm9kZShub2RlLGZvY3VzKTtlbHNlCnRyZWVPdXRsaW5lLnNlbGVjdERPTU5vZGUobnVsbCk7fX0KX3VwZGF0ZUJyZWFkY3J1bWJJZk5lZWRlZChldmVudCl7Y29uc3Qgbm9kZXM9KGV2ZW50LmRhdGEpO3RoaXMuX2JyZWFkY3J1bWJzLnVwZGF0ZU5vZGVzKG5vZGVzKTt9Cl9jcnVtYk5vZGVTZWxlY3RlZChldmVudCl7Y29uc3Qgbm9kZT0oZXZlbnQuZGF0YSk7dGhpcy5zZWxlY3RET01Ob2RlKG5vZGUsdHJ1ZSk7fQpfdHJlZU91dGxpbmVGb3JOb2RlKG5vZGUpe2lmKCFub2RlKQpyZXR1cm4gbnVsbDtyZXR1cm4gRWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChub2RlLmRvbU1vZGVsKCkpO30KX3RyZWVFbGVtZW50Rm9yTm9kZShub2RlKXtjb25zdCB0cmVlT3V0bGluZT10aGlzLl90cmVlT3V0bGluZUZvck5vZGUobm9kZSk7cmV0dXJuKHRyZWVPdXRsaW5lLmZpbmRUcmVlRWxlbWVudChub2RlKSk7fQpfbGVhdmVVc2VyQWdlbnRTaGFkb3dET00obm9kZSl7bGV0IHVzZXJBZ2VudFNoYWRvd1Jvb3Q7d2hpbGUoKHVzZXJBZ2VudFNoYWRvd1Jvb3Q9bm9kZS5hbmNlc3RvclVzZXJBZ2VudFNoYWRvd1Jvb3QoKSkmJnVzZXJBZ2VudFNoYWRvd1Jvb3QucGFyZW50Tm9kZSkKbm9kZT11c2VyQWdlbnRTaGFkb3dSb290LnBhcmVudE5vZGU7cmV0dXJuIG5vZGU7fQpyZXZlYWxBbmRTZWxlY3ROb2RlKG5vZGUsZm9jdXMpe2lmKEVsZW1lbnRzLmluc3BlY3RFbGVtZW50TW9kZUNvbnRyb2xsZXImJkVsZW1lbnRzLmluc3BlY3RFbGVtZW50TW9kZUNvbnRyb2xsZXIuaXNJbkluc3BlY3RFbGVtZW50TW9kZSgpKQpFbGVtZW50cy5pbnNwZWN0RWxlbWVudE1vZGVDb250cm9sbGVyLnN0b3BJbnNwZWN0aW9uKCk7dGhpcy5fb21pdERlZmF1bHRTZWxlY3Rpb249dHJ1ZTtub2RlPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdzaG93VUFTaGFkb3dET00nKS5nZXQoKT9ub2RlOnRoaXMuX2xlYXZlVXNlckFnZW50U2hhZG93RE9NKG5vZGUpO25vZGUuaGlnaGxpZ2h0Rm9yVHdvU2Vjb25kcygpO3JldHVybiBVSS52aWV3TWFuYWdlci5zaG93VmlldygnZWxlbWVudHMnLGZhbHNlLCFmb2N1cykudGhlbigoKT0+e3RoaXMuc2VsZWN0RE9NTm9kZShub2RlLGZvY3VzKTtkZWxldGUgdGhpcy5fb21pdERlZmF1bHRTZWxlY3Rpb247aWYoIXRoaXMuX25vdEZpcnN0SW5zcGVjdEVsZW1lbnQpe0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX2ZpcnN0SW5zcGVjdEVsZW1lbnROb2RlTmFtZUZvclRlc3Q9bm9kZS5ub2RlTmFtZSgpO0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX2ZpcnN0SW5zcGVjdEVsZW1lbnRDb21wbGV0ZWRGb3JUZXN0KCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0Lmluc3BlY3RFbGVtZW50Q29tcGxldGVkKCk7fQp0aGlzLl9ub3RGaXJzdEluc3BlY3RFbGVtZW50PXRydWU7fSk7fQpfc2hvd1VBU2hhZG93RE9NQ2hhbmdlZCgpe2ZvcihsZXQgaT0wO2k8dGhpcy5fdHJlZU91dGxpbmVzLmxlbmd0aDsrK2kpCnRoaXMuX3RyZWVPdXRsaW5lc1tpXS51cGRhdGUoKTt9Cl91cGRhdGVTaWRlYmFyUG9zaXRpb24oKXtpZih0aGlzLnNpZGViYXJQYW5lVmlldyYmdGhpcy5zaWRlYmFyUGFuZVZpZXcudGFiYmVkUGFuZSgpLnNob3VsZEhpZGVPbkRldGFjaCgpKQpyZXR1cm47bGV0IHNwbGl0TW9kZTtjb25zdCBwb3NpdGlvbj1Db21tb24ubW9kdWxlU2V0dGluZygnc2lkZWJhclBvc2l0aW9uJykuZ2V0KCk7aWYocG9zaXRpb249PT0ncmlnaHQnfHwocG9zaXRpb249PT0nYXV0bycmJlVJLmluc3BlY3RvclZpZXcuZWxlbWVudC5vZmZzZXRXaWR0aD42ODApKQpzcGxpdE1vZGU9RWxlbWVudHMuRWxlbWVudHNQYW5lbC5fc3BsaXRNb2RlLlZlcnRpY2FsO2Vsc2UgaWYoVUkuaW5zcGVjdG9yVmlldy5lbGVtZW50Lm9mZnNldFdpZHRoPjQxNSkKc3BsaXRNb2RlPUVsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX3NwbGl0TW9kZS5Ib3Jpem9udGFsO2Vsc2UKc3BsaXRNb2RlPUVsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX3NwbGl0TW9kZS5TbGltO2lmKHRoaXMuc2lkZWJhclBhbmVWaWV3JiZzcGxpdE1vZGU9PT10aGlzLl9zcGxpdE1vZGUpCnJldHVybjt0aGlzLl9zcGxpdE1vZGU9c3BsaXRNb2RlO2NvbnN0IGV4dGVuc2lvblNpZGViYXJQYW5lcz1FeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci5zaWRlYmFyUGFuZXMoKTtsZXQgbGFzdFNlbGVjdGVkVGFiSWQ9bnVsbDtpZih0aGlzLnNpZGViYXJQYW5lVmlldyl7bGFzdFNlbGVjdGVkVGFiSWQ9dGhpcy5zaWRlYmFyUGFuZVZpZXcudGFiYmVkUGFuZSgpLnNlbGVjdGVkVGFiSWQ7dGhpcy5zaWRlYmFyUGFuZVZpZXcudGFiYmVkUGFuZSgpLmRldGFjaCgpO3RoaXMuX3NwbGl0V2lkZ2V0LnVuaW5zdGFsbFJlc2l6ZXIodGhpcy5zaWRlYmFyUGFuZVZpZXcudGFiYmVkUGFuZSgpLmhlYWRlckVsZW1lbnQoKSk7fQp0aGlzLl9zcGxpdFdpZGdldC5zZXRWZXJ0aWNhbCh0aGlzLl9zcGxpdE1vZGU9PT1FbGVtZW50cy5FbGVtZW50c1BhbmVsLl9zcGxpdE1vZGUuVmVydGljYWwpO3RoaXMuc2hvd1Rvb2xiYXJQYW5lKG51bGwsbnVsbCk7Y29uc3QgbWF0Y2hlZFN0eWxlUGFuZXNXcmFwcGVyPW5ldyBVSS5WQm94KCk7bWF0Y2hlZFN0eWxlUGFuZXNXcmFwcGVyLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3R5bGUtcGFuZXMtd3JhcHBlcicpO3RoaXMuX3N0eWxlc1dpZGdldC5zaG93KG1hdGNoZWRTdHlsZVBhbmVzV3JhcHBlci5lbGVtZW50KTtjb25zdCBjb21wdXRlZFN0eWxlUGFuZXNXcmFwcGVyPW5ldyBVSS5WQm94KCk7Y29tcHV0ZWRTdHlsZVBhbmVzV3JhcHBlci5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0eWxlLXBhbmVzLXdyYXBwZXInKTt0aGlzLl9jb21wdXRlZFN0eWxlV2lkZ2V0LnNob3coY29tcHV0ZWRTdHlsZVBhbmVzV3JhcHBlci5lbGVtZW50KTtmdW5jdGlvbiBzaG93TWV0cmljcyhpbkNvbXB1dGVkU3R5bGUpe2lmKGluQ29tcHV0ZWRTdHlsZSkKdGhpcy5fbWV0cmljc1dpZGdldC5zaG93KGNvbXB1dGVkU3R5bGVQYW5lc1dyYXBwZXIuZWxlbWVudCx0aGlzLl9jb21wdXRlZFN0eWxlV2lkZ2V0LmVsZW1lbnQpO2Vsc2UKdGhpcy5fbWV0cmljc1dpZGdldC5zaG93KG1hdGNoZWRTdHlsZVBhbmVzV3JhcHBlci5lbGVtZW50KTt9CmZ1bmN0aW9uIHRhYlNlbGVjdGVkKGV2ZW50KXtjb25zdCB0YWJJZD0oZXZlbnQuZGF0YS50YWJJZCk7aWYodGFiSWQ9PT1Db21tb24uVUlTdHJpbmcoJ0NvbXB1dGVkJykpCnNob3dNZXRyaWNzLmNhbGwodGhpcyx0cnVlKTtlbHNlIGlmKHRhYklkPT09Q29tbW9uLlVJU3RyaW5nKCdTdHlsZXMnKSkKc2hvd01ldHJpY3MuY2FsbCh0aGlzLGZhbHNlKTt9CnRoaXMuc2lkZWJhclBhbmVWaWV3PVVJLnZpZXdNYW5hZ2VyLmNyZWF0ZVRhYmJlZExvY2F0aW9uKCgpPT5VSS52aWV3TWFuYWdlci5zaG93VmlldygnZWxlbWVudHMnKSk7Y29uc3QgdGFiYmVkUGFuZT10aGlzLnNpZGViYXJQYW5lVmlldy50YWJiZWRQYW5lKCk7aWYodGhpcy5fcG9wb3ZlckhlbHBlcikKdGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO3RoaXMuX3BvcG92ZXJIZWxwZXI9bmV3IFVJLlBvcG92ZXJIZWxwZXIodGFiYmVkUGFuZS5lbGVtZW50LHRoaXMuX2dldFBvcG92ZXJSZXF1ZXN0LmJpbmQodGhpcykpO3RoaXMuX3BvcG92ZXJIZWxwZXIuc2V0SGFzUGFkZGluZyh0cnVlKTt0aGlzLl9wb3BvdmVySGVscGVyLnNldFRpbWVvdXQoMCk7aWYodGhpcy5fc3BsaXRNb2RlIT09RWxlbWVudHMuRWxlbWVudHNQYW5lbC5fc3BsaXRNb2RlLlZlcnRpY2FsKQp0aGlzLl9zcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcih0YWJiZWRQYW5lLmhlYWRlckVsZW1lbnQoKSk7Y29uc3Qgc3R5bGVzVmlldz1uZXcgVUkuU2ltcGxlVmlldyhDb21tb24uVUlTdHJpbmcoJ1N0eWxlcycpKTt0aGlzLnNpZGViYXJQYW5lVmlldy5hcHBlbmRWaWV3KHN0eWxlc1ZpZXcpO2lmKHNwbGl0TW9kZT09PUVsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX3NwbGl0TW9kZS5Ib3Jpem9udGFsKXtzdHlsZXNWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxleC1hdXRvJyk7Y29uc3Qgc3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KHRydWUsdHJ1ZSwnc3R5bGVzUGFuZVNwbGl0Vmlld1N0YXRlJywyMTUpO3NwbGl0V2lkZ2V0LnNob3coc3R5bGVzVmlldy5lbGVtZW50KTtzcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KG1hdGNoZWRTdHlsZVBhbmVzV3JhcHBlcik7c3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldChjb21wdXRlZFN0eWxlUGFuZXNXcmFwcGVyKTt9ZWxzZXtzdHlsZXNWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxleC1hdXRvJyk7bWF0Y2hlZFN0eWxlUGFuZXNXcmFwcGVyLnNob3coc3R5bGVzVmlldy5lbGVtZW50KTtjb25zdCBjb21wdXRlZFZpZXc9bmV3IFVJLlNpbXBsZVZpZXcoQ29tbW9uLlVJU3RyaW5nKCdDb21wdXRlZCcpKTtjb21wdXRlZFZpZXcuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb21wb3NpdGUnLCdmaWxsJyk7Y29tcHV0ZWRTdHlsZVBhbmVzV3JhcHBlci5zaG93KGNvbXB1dGVkVmlldy5lbGVtZW50KTt0YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiU2VsZWN0ZWQsdGFiU2VsZWN0ZWQsdGhpcyk7dGhpcy5zaWRlYmFyUGFuZVZpZXcuYXBwZW5kVmlldyhjb21wdXRlZFZpZXcpO30KdGhpcy5fc3R5bGVzVmlld1RvUmV2ZWFsPXN0eWxlc1ZpZXc7c2hvd01ldHJpY3MuY2FsbCh0aGlzLHRoaXMuX3NwbGl0TW9kZT09PUVsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX3NwbGl0TW9kZS5Ib3Jpem9udGFsKTt0aGlzLnNpZGViYXJQYW5lVmlldy5hcHBlbmRBcHBsaWNhYmxlSXRlbXMoJ2VsZW1lbnRzLXNpZGViYXInKTtmb3IobGV0IGk9MDtpPGV4dGVuc2lvblNpZGViYXJQYW5lcy5sZW5ndGg7KytpKQp0aGlzLl9hZGRFeHRlbnNpb25TaWRlYmFyUGFuZShleHRlbnNpb25TaWRlYmFyUGFuZXNbaV0pO2lmKGxhc3RTZWxlY3RlZFRhYklkKQp0aGlzLnNpZGViYXJQYW5lVmlldy50YWJiZWRQYW5lKCkuc2VsZWN0VGFiKGxhc3RTZWxlY3RlZFRhYklkKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuc2lkZWJhclBhbmVWaWV3LnRhYmJlZFBhbmUoKSk7fQpfZXh0ZW5zaW9uU2lkZWJhclBhbmVBZGRlZChldmVudCl7Y29uc3QgcGFuZT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkRXh0ZW5zaW9uU2lkZWJhclBhbmUocGFuZSk7fQpfYWRkRXh0ZW5zaW9uU2lkZWJhclBhbmUocGFuZSl7aWYocGFuZS5wYW5lbE5hbWUoKT09PXRoaXMubmFtZSkKdGhpcy5zaWRlYmFyUGFuZVZpZXcuYXBwZW5kVmlldyhwYW5lKTt9fTtFbGVtZW50cy5FbGVtZW50c1BhbmVsLl9lbGVtZW50c1NpZGViYXJWaWV3VGl0bGVTeW1ib2w9U3ltYm9sKCd0aXRsZScpO0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX3NwbGl0TW9kZT17VmVydGljYWw6U3ltYm9sKCdWZXJ0aWNhbCcpLEhvcml6b250YWw6U3ltYm9sKCdIb3Jpem9udGFsJyksU2xpbTpTeW1ib2woJ1NsaW0nKSx9O0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX2ZpcnN0SW5zcGVjdEVsZW1lbnRDb21wbGV0ZWRGb3JUZXN0PWZ1bmN0aW9uKCl7fTtFbGVtZW50cy5FbGVtZW50c1BhbmVsLkNvbnRleHRNZW51UHJvdmlkZXI9Y2xhc3N7YXBwZW5kQXBwbGljYWJsZUl0ZW1zKGV2ZW50LGNvbnRleHRNZW51LG9iamVjdCl7aWYoIShvYmplY3QgaW5zdGFuY2VvZiBTREsuUmVtb3RlT2JqZWN0JiYoKG9iamVjdCkpLmlzTm9kZSgpKSYmIShvYmplY3QgaW5zdGFuY2VvZiBTREsuRE9NTm9kZSkmJiEob2JqZWN0IGluc3RhbmNlb2YgU0RLLkRlZmVycmVkRE9NTm9kZSkpCnJldHVybjtpZihFbGVtZW50cy5FbGVtZW50c1BhbmVsLmluc3RhbmNlKCkuZWxlbWVudC5pc0FuY2VzdG9yKChldmVudC50YXJnZXQpKSkKcmV0dXJuO2NvbnN0IGNvbW1hbmRDYWxsYmFjaz1Db21tb24uUmV2ZWFsZXIucmV2ZWFsLmJpbmQoQ29tbW9uLlJldmVhbGVyLG9iamVjdCk7Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZXZlYWwgaW4gRWxlbWVudHMgcGFuZWwnKSxjb21tYW5kQ2FsbGJhY2spO319O0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuRE9NTm9kZVJldmVhbGVyPWNsYXNze3JldmVhbChub2RlLG9taXRGb2N1cyl7Y29uc3QgcGFuZWw9RWxlbWVudHMuRWxlbWVudHNQYW5lbC5pbnN0YW5jZSgpO3BhbmVsLl9wZW5kaW5nTm9kZVJldmVhbD10cnVlO3JldHVybiBuZXcgUHJvbWlzZShyZXZlYWxQcm9taXNlKTtmdW5jdGlvbiByZXZlYWxQcm9taXNlKHJlc29sdmUscmVqZWN0KXtpZihub2RlIGluc3RhbmNlb2YgU0RLLkRPTU5vZGUpe29uTm9kZVJlc29sdmVkKChub2RlKSk7fWVsc2UgaWYobm9kZSBpbnN0YW5jZW9mIFNESy5EZWZlcnJlZERPTU5vZGUpeygobm9kZSkpLnJlc29sdmUob25Ob2RlUmVzb2x2ZWQpO31lbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBTREsuUmVtb3RlT2JqZWN0KXtjb25zdCBkb21Nb2RlbD0obm9kZSkucnVudGltZU1vZGVsKCkudGFyZ2V0KCkubW9kZWwoU0RLLkRPTU1vZGVsKTtpZihkb21Nb2RlbCkKZG9tTW9kZWwucHVzaE9iamVjdEFzTm9kZVRvRnJvbnRlbmQobm9kZSkudGhlbihvbk5vZGVSZXNvbHZlZCk7ZWxzZQpyZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSBhIG5vZGUgdG8gcmV2ZWFsLicpKTt9ZWxzZXtyZWplY3QobmV3IEVycm9yKCdDYW5cJ3QgcmV2ZWFsIGEgbm9uLW5vZGUuJykpO3BhbmVsLl9wZW5kaW5nTm9kZVJldmVhbD1mYWxzZTt9CmZ1bmN0aW9uIG9uTm9kZVJlc29sdmVkKHJlc29sdmVkTm9kZSl7cGFuZWwuX3BlbmRpbmdOb2RlUmV2ZWFsPWZhbHNlO2lmKHJlc29sdmVkTm9kZSl7cGFuZWwucmV2ZWFsQW5kU2VsZWN0Tm9kZShyZXNvbHZlZE5vZGUsIW9taXRGb2N1cykudGhlbihyZXNvbHZlKTtyZXR1cm47fQpyZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgcmVzb2x2ZSBub2RlIHRvIHJldmVhbC4nKSk7fX19fTtFbGVtZW50cy5FbGVtZW50c1BhbmVsLkNTU1Byb3BlcnR5UmV2ZWFsZXI9Y2xhc3N7cmV2ZWFsKHByb3BlcnR5KXtjb25zdCBwYW5lbD1FbGVtZW50cy5FbGVtZW50c1BhbmVsLmluc3RhbmNlKCk7cmV0dXJuIHBhbmVsLl9yZXZlYWxQcm9wZXJ0eSgocHJvcGVydHkpKTt9fTtFbGVtZW50cy5FbGVtZW50c0FjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTtpZighbm9kZSkKcmV0dXJuIHRydWU7Y29uc3QgdHJlZU91dGxpbmU9RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChub2RlLmRvbU1vZGVsKCkpO2lmKCF0cmVlT3V0bGluZSkKcmV0dXJuIHRydWU7c3dpdGNoKGFjdGlvbklkKXtjYXNlJ2VsZW1lbnRzLmhpZGUtZWxlbWVudCc6dHJlZU91dGxpbmUudG9nZ2xlSGlkZUVsZW1lbnQobm9kZSk7cmV0dXJuIHRydWU7Y2FzZSdlbGVtZW50cy5lZGl0LWFzLWh0bWwnOnRyZWVPdXRsaW5lLnRvZ2dsZUVkaXRBc0hUTUwobm9kZSk7cmV0dXJuIHRydWU7Y2FzZSdlbGVtZW50cy51bmRvJzppZihVSS5pc0VkaXRpbmcoKSkKcmV0dXJuIGZhbHNlO1NESy5kb21Nb2RlbFVuZG9TdGFjay51bmRvKCk7RWxlbWVudHMuRWxlbWVudHNQYW5lbC5pbnN0YW5jZSgpLl9zdHlsZXNXaWRnZXQuZm9yY2VVcGRhdGUoKTtyZXR1cm4gdHJ1ZTtjYXNlJ2VsZW1lbnRzLnJlZG8nOmlmKFVJLmlzRWRpdGluZygpKQpyZXR1cm4gZmFsc2U7U0RLLmRvbU1vZGVsVW5kb1N0YWNrLnJlZG8oKTtFbGVtZW50cy5FbGVtZW50c1BhbmVsLmluc3RhbmNlKCkuX3N0eWxlc1dpZGdldC5mb3JjZVVwZGF0ZSgpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319O0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuUHNldWRvU3RhdGVNYXJrZXJEZWNvcmF0b3I9Y2xhc3N7ZGVjb3JhdGUobm9kZSl7cmV0dXJue2NvbG9yOidvcmFuZ2UnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnRWxlbWVudCBzdGF0ZTogJXMnLCc6Jytub2RlLmRvbU1vZGVsKCkuY3NzTW9kZWwoKS5wc2V1ZG9TdGF0ZShub2RlKS5qb2luKCcsIDonKSl9O319OztFbGVtZW50cy5DbGFzc2VzUGFuZVdpZGdldD1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZWxlbWVudHMvY2xhc3Nlc1BhbmVXaWRnZXQuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc05hbWU9J3N0eWxlcy1lbGVtZW50LWNsYXNzZXMtcGFuZSc7Y29uc3QgY29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpdGxlLWNvbnRhaW5lcicpO3RoaXMuX2lucHV0PWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnbmV3LWNsYXNzLWlucHV0IG1vbm9zcGFjZScpO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX2lucHV0KTt0aGlzLl9jbGFzc2VzQ29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NvdXJjZS1jb2RlJyk7dGhpcy5fY2xhc3Nlc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdzdHlsZXMtZWxlbWVudC1jbGFzc2VzLWNvbnRhaW5lcicpO3RoaXMuX3Byb21wdD1uZXcgRWxlbWVudHMuQ2xhc3Nlc1BhbmVXaWRnZXQuQ2xhc3NOYW1lUHJvbXB0KHRoaXMuX25vZGVDbGFzc2VzLmJpbmQodGhpcykpO3RoaXMuX3Byb21wdC5zZXRBdXRvY29tcGxldGlvblRpbWVvdXQoMCk7dGhpcy5fcHJvbXB0LnJlbmRlckFzQmxvY2soKTtjb25zdCBwcm94eUVsZW1lbnQ9dGhpcy5fcHJvbXB0LmF0dGFjaCh0aGlzLl9pbnB1dCk7dGhpcy5fcHJvbXB0LnNldFBsYWNlaG9sZGVyKENvbW1vbi5VSVN0cmluZygnQWRkIG5ldyBjbGFzcycpKTt0aGlzLl9wcm9tcHQuYWRkRXZlbnRMaXN0ZW5lcihVSS5UZXh0UHJvbXB0LkV2ZW50cy5UZXh0Q2hhbmdlZCx0aGlzLl9vblRleHRDaGFuZ2VkLHRoaXMpO3Byb3h5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxmYWxzZSk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRE9NTW9kZWwsU0RLLkRPTU1vZGVsLkV2ZW50cy5ET01NdXRhdGVkLHRoaXMuX29uRE9NTXV0YXRlZCx0aGlzKTt0aGlzLl9tdXRhdGluZ05vZGVzPW5ldyBTZXQoKTt0aGlzLl9wZW5kaW5nTm9kZUNsYXNzZXM9bmV3IE1hcCgpO3RoaXMuX3VwZGF0ZU5vZGVUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMCk7dGhpcy5fcHJldmlvdXNUYXJnZXQ9bnVsbDtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLHRoaXMuX29uU2VsZWN0ZWROb2RlQ2hhbmdlZCx0aGlzKTt9Cl9zcGxpdFRleHRJbnRvQ2xhc3Nlcyh0ZXh0KXtyZXR1cm4gdGV4dC5zcGxpdCgvWy4sXHNdLykubWFwKGNsYXNzTmFtZT0+Y2xhc3NOYW1lLnRyaW0oKSkuZmlsdGVyKGNsYXNzTmFtZT0+Y2xhc3NOYW1lLmxlbmd0aCk7fQpfb25LZXlEb3duKGV2ZW50KXtpZighaXNFbnRlcktleShldmVudCkmJiFpc0VzY0tleShldmVudCkpCnJldHVybjtpZihpc0VudGVyS2V5KGV2ZW50KSl7ZXZlbnQuY29uc3VtZSgpO2lmKHRoaXMuX3Byb21wdC5hY2NlcHRBdXRvQ29tcGxldGUoKSkKcmV0dXJuO30KbGV0IHRleHQ9ZXZlbnQudGFyZ2V0LnRleHRDb250ZW50O2lmKGlzRXNjS2V5KGV2ZW50KSl7aWYoIXRleHQuaXNXaGl0ZXNwYWNlKCkpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7dGV4dD0nJzt9CnRoaXMuX3Byb21wdC5jbGVhckF1dG9jb21wbGV0ZSgpO2V2ZW50LnRhcmdldC50ZXh0Q29udGVudD0nJztjb25zdCBub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTtpZighbm9kZSkKcmV0dXJuO2NvbnN0IGNsYXNzTmFtZXM9dGhpcy5fc3BsaXRUZXh0SW50b0NsYXNzZXModGV4dCk7Zm9yKGNvbnN0IGNsYXNzTmFtZSBvZiBjbGFzc05hbWVzKQp0aGlzLl90b2dnbGVDbGFzcyhub2RlLGNsYXNzTmFtZSx0cnVlKTt0aGlzLl9pbnN0YWxsTm9kZUNsYXNzZXMobm9kZSk7dGhpcy5fdXBkYXRlKCk7fQpfb25UZXh0Q2hhbmdlZCgpe2NvbnN0IG5vZGU9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRPTU5vZGUpO2lmKCFub2RlKQpyZXR1cm47dGhpcy5faW5zdGFsbE5vZGVDbGFzc2VzKG5vZGUpO30KX29uRE9NTXV0YXRlZChldmVudCl7Y29uc3Qgbm9kZT0oZXZlbnQuZGF0YSk7aWYodGhpcy5fbXV0YXRpbmdOb2Rlcy5oYXMobm9kZSkpCnJldHVybjtkZWxldGUgbm9kZVtFbGVtZW50cy5DbGFzc2VzUGFuZVdpZGdldC5fY2xhc3Nlc1N5bWJvbF07dGhpcy5fdXBkYXRlKCk7fQpfb25TZWxlY3RlZE5vZGVDaGFuZ2VkKGV2ZW50KXtpZih0aGlzLl9wcmV2aW91c1RhcmdldCYmdGhpcy5fcHJvbXB0LnRleHQoKSl7dGhpcy5faW5wdXQudGV4dENvbnRlbnQ9Jyc7dGhpcy5faW5zdGFsbE5vZGVDbGFzc2VzKHRoaXMuX3ByZXZpb3VzVGFyZ2V0KTt9CnRoaXMuX3ByZXZpb3VzVGFyZ2V0PShldmVudC5kYXRhKTt0aGlzLl91cGRhdGUoKTt9Cndhc1Nob3duKCl7dGhpcy5fdXBkYXRlKCk7fQpfdXBkYXRlKCl7aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtsZXQgbm9kZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRE9NTm9kZSk7aWYobm9kZSkKbm9kZT1ub2RlLmVuY2xvc2luZ0VsZW1lbnRPclNlbGYoKTt0aGlzLl9jbGFzc2VzQ29udGFpbmVyLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5faW5wdXQuZGlzYWJsZWQ9IW5vZGU7aWYoIW5vZGUpCnJldHVybjtjb25zdCBjbGFzc2VzPXRoaXMuX25vZGVDbGFzc2VzKG5vZGUpO2NvbnN0IGtleXM9Y2xhc3Nlcy5rZXlzQXJyYXkoKTtrZXlzLnNvcnQoU3RyaW5nLmNhc2VJbnNlbnNldGl2ZUNvbXBhcmF0b3IpO2ZvcihsZXQgaT0wO2k8a2V5cy5sZW5ndGg7KytpKXtjb25zdCBjbGFzc05hbWU9a2V5c1tpXTtjb25zdCBsYWJlbD1VSS5DaGVja2JveExhYmVsLmNyZWF0ZShjbGFzc05hbWUsY2xhc3Nlcy5nZXQoY2xhc3NOYW1lKSk7bGFiZWwuY2xhc3NMaXN0LmFkZCgnbW9ub3NwYWNlJyk7bGFiZWwuY2hlY2tib3hFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyxjbGFzc05hbWUpLGZhbHNlKTt0aGlzLl9jbGFzc2VzQ29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTt9fQpfb25DbGljayhjbGFzc05hbWUsZXZlbnQpe2NvbnN0IG5vZGU9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRPTU5vZGUpO2lmKCFub2RlKQpyZXR1cm47Y29uc3QgZW5hYmxlZD1ldmVudC50YXJnZXQuY2hlY2tlZDt0aGlzLl90b2dnbGVDbGFzcyhub2RlLGNsYXNzTmFtZSxlbmFibGVkKTt0aGlzLl9pbnN0YWxsTm9kZUNsYXNzZXMobm9kZSk7fQpfbm9kZUNsYXNzZXMobm9kZSl7bGV0IHJlc3VsdD1ub2RlW0VsZW1lbnRzLkNsYXNzZXNQYW5lV2lkZ2V0Ll9jbGFzc2VzU3ltYm9sXTtpZighcmVzdWx0KXtjb25zdCBjbGFzc0F0dHJpYnV0ZT1ub2RlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKXx8Jyc7Y29uc3QgY2xhc3Nlcz1jbGFzc0F0dHJpYnV0ZS5zcGxpdCgvXHMvKTtyZXN1bHQ9bmV3IE1hcCgpO2ZvcihsZXQgaT0wO2k8Y2xhc3Nlcy5sZW5ndGg7KytpKXtjb25zdCBjbGFzc05hbWU9Y2xhc3Nlc1tpXS50cmltKCk7aWYoIWNsYXNzTmFtZS5sZW5ndGgpCmNvbnRpbnVlO3Jlc3VsdC5zZXQoY2xhc3NOYW1lLHRydWUpO30Kbm9kZVtFbGVtZW50cy5DbGFzc2VzUGFuZVdpZGdldC5fY2xhc3Nlc1N5bWJvbF09cmVzdWx0O30KcmV0dXJuIHJlc3VsdDt9Cl90b2dnbGVDbGFzcyhub2RlLGNsYXNzTmFtZSxlbmFibGVkKXtjb25zdCBjbGFzc2VzPXRoaXMuX25vZGVDbGFzc2VzKG5vZGUpO2NsYXNzZXMuc2V0KGNsYXNzTmFtZSxlbmFibGVkKTt9Cl9pbnN0YWxsTm9kZUNsYXNzZXMobm9kZSl7Y29uc3QgY2xhc3Nlcz10aGlzLl9ub2RlQ2xhc3Nlcyhub2RlKTtjb25zdCBhY3RpdmVDbGFzc2VzPW5ldyBTZXQoKTtmb3IoY29uc3QgY2xhc3NOYW1lIG9mIGNsYXNzZXMua2V5cygpKXtpZihjbGFzc2VzLmdldChjbGFzc05hbWUpKQphY3RpdmVDbGFzc2VzLmFkZChjbGFzc05hbWUpO30KY29uc3QgYWRkaXRpb25hbENsYXNzZXM9dGhpcy5fc3BsaXRUZXh0SW50b0NsYXNzZXModGhpcy5fcHJvbXB0LnRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKSk7Zm9yKGNvbnN0IGNsYXNzTmFtZSBvZiBhZGRpdGlvbmFsQ2xhc3NlcykKYWN0aXZlQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTtjb25zdCBuZXdDbGFzc2VzPWFjdGl2ZUNsYXNzZXMudmFsdWVzQXJyYXkoKTtuZXdDbGFzc2VzLnNvcnQoKTt0aGlzLl9wZW5kaW5nTm9kZUNsYXNzZXMuc2V0KG5vZGUsbmV3Q2xhc3Nlcy5qb2luKCcgJykpO3RoaXMuX3VwZGF0ZU5vZGVUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fZmx1c2hQZW5kaW5nQ2xhc3Nlcy5iaW5kKHRoaXMpKTt9Cl9mbHVzaFBlbmRpbmdDbGFzc2VzKCl7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGNvbnN0IG5vZGUgb2YgdGhpcy5fcGVuZGluZ05vZGVDbGFzc2VzLmtleXMoKSl7dGhpcy5fbXV0YXRpbmdOb2Rlcy5hZGQobm9kZSk7Y29uc3QgcHJvbWlzZT1ub2RlLnNldEF0dHJpYnV0ZVZhbHVlUHJvbWlzZSgnY2xhc3MnLHRoaXMuX3BlbmRpbmdOb2RlQ2xhc3Nlcy5nZXQobm9kZSkpLnRoZW4ob25DbGFzc1ZhbHVlVXBkYXRlZC5iaW5kKHRoaXMsbm9kZSkpO3Byb21pc2VzLnB1c2gocHJvbWlzZSk7fQp0aGlzLl9wZW5kaW5nTm9kZUNsYXNzZXMuY2xlYXIoKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO2Z1bmN0aW9uIG9uQ2xhc3NWYWx1ZVVwZGF0ZWQobm9kZSl7dGhpcy5fbXV0YXRpbmdOb2Rlcy5kZWxldGUobm9kZSk7fX19O0VsZW1lbnRzLkNsYXNzZXNQYW5lV2lkZ2V0Ll9jbGFzc2VzU3ltYm9sPVN5bWJvbCgnRWxlbWVudHMuQ2xhc3Nlc1BhbmVXaWRnZXQuX2NsYXNzZXNTeW1ib2wnKTtFbGVtZW50cy5DbGFzc2VzUGFuZVdpZGdldC5CdXR0b25Qcm92aWRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2J1dHRvbj1uZXcgVUkuVG9vbGJhclRvZ2dsZShDb21tb24uVUlTdHJpbmcoJ0VsZW1lbnQgQ2xhc3NlcycpLCcnKTt0aGlzLl9idXR0b24uc2V0VGV4dCgnLmNscycpO3RoaXMuX2J1dHRvbi5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vbm9zcGFjZScpO3RoaXMuX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2NsaWNrZWQsdGhpcyk7dGhpcy5fdmlldz1uZXcgRWxlbWVudHMuQ2xhc3Nlc1BhbmVXaWRnZXQoKTt9Cl9jbGlja2VkKCl7RWxlbWVudHMuRWxlbWVudHNQYW5lbC5pbnN0YW5jZSgpLnNob3dUb29sYmFyUGFuZSghdGhpcy5fdmlldy5pc1Nob3dpbmcoKT90aGlzLl92aWV3Om51bGwsdGhpcy5fYnV0dG9uKTt9Cml0ZW0oKXtyZXR1cm4gdGhpcy5fYnV0dG9uO319O0VsZW1lbnRzLkNsYXNzZXNQYW5lV2lkZ2V0LkNsYXNzTmFtZVByb21wdD1jbGFzcyBleHRlbmRzIFVJLlRleHRQcm9tcHR7Y29uc3RydWN0b3Iobm9kZUNsYXNzZXMpe3N1cGVyKCk7dGhpcy5fbm9kZUNsYXNzZXM9bm9kZUNsYXNzZXM7dGhpcy5pbml0aWFsaXplKHRoaXMuX2J1aWxkQ2xhc3NOYW1lQ29tcGxldGlvbnMuYmluZCh0aGlzKSwnICcpO3RoaXMuZGlzYWJsZURlZmF1bHRTdWdnZXN0aW9uRm9yRW1wdHlJbnB1dCgpO3RoaXMuX3NlbGVjdGVkRnJhbWVJZD0nJzt0aGlzLl9jbGFzc05hbWVzUHJvbWlzZT1udWxsO30KX2dldENsYXNzTmFtZXMoc2VsZWN0ZWROb2RlKXtjb25zdCBwcm9taXNlcz1bXTtjb25zdCBjb21wbGV0aW9ucz1uZXcgU2V0KCk7dGhpcy5fc2VsZWN0ZWRGcmFtZUlkPXNlbGVjdGVkTm9kZS5mcmFtZUlkKCk7Y29uc3QgY3NzTW9kZWw9c2VsZWN0ZWROb2RlLmRvbU1vZGVsKCkuY3NzTW9kZWwoKTtjb25zdCBhbGxTdHlsZVNoZWV0cz1jc3NNb2RlbC5hbGxTdHlsZVNoZWV0cygpO2Zvcihjb25zdCBzdHlsZXNoZWV0IG9mIGFsbFN0eWxlU2hlZXRzKXtpZihzdHlsZXNoZWV0LmZyYW1lSWQhPT10aGlzLl9zZWxlY3RlZEZyYW1lSWQpCmNvbnRpbnVlO2NvbnN0IGNzc1Byb21pc2U9Y3NzTW9kZWwuY2xhc3NOYW1lc1Byb21pc2Uoc3R5bGVzaGVldC5pZCkudGhlbihjbGFzc2VzPT5jb21wbGV0aW9ucy5hZGRBbGwoY2xhc3NlcykpO3Byb21pc2VzLnB1c2goY3NzUHJvbWlzZSk7fQpjb25zdCBkb21Qcm9taXNlPXNlbGVjdGVkTm9kZS5kb21Nb2RlbCgpLmNsYXNzTmFtZXNQcm9taXNlKHNlbGVjdGVkTm9kZS5vd25lckRvY3VtZW50LmlkKS50aGVuKGNsYXNzZXM9PmNvbXBsZXRpb25zLmFkZEFsbChjbGFzc2VzKSk7cHJvbWlzZXMucHVzaChkb21Qcm9taXNlKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCk9PmNvbXBsZXRpb25zLnZhbHVlc0FycmF5KCkpO30KX2J1aWxkQ2xhc3NOYW1lQ29tcGxldGlvbnMoZXhwcmVzc2lvbixwcmVmaXgsZm9yY2Upe2lmKCFwcmVmaXh8fGZvcmNlKQp0aGlzLl9jbGFzc05hbWVzUHJvbWlzZT1udWxsO2NvbnN0IHNlbGVjdGVkTm9kZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRE9NTm9kZSk7aWYoIXNlbGVjdGVkTm9kZXx8KCFwcmVmaXgmJiFmb3JjZSYmIWV4cHJlc3Npb24udHJpbSgpKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7aWYoIXRoaXMuX2NsYXNzTmFtZXNQcm9taXNlfHx0aGlzLl9zZWxlY3RlZEZyYW1lSWQhPT1zZWxlY3RlZE5vZGUuZnJhbWVJZCgpKQp0aGlzLl9jbGFzc05hbWVzUHJvbWlzZT10aGlzLl9nZXRDbGFzc05hbWVzKHNlbGVjdGVkTm9kZSk7cmV0dXJuIHRoaXMuX2NsYXNzTmFtZXNQcm9taXNlLnRoZW4oY29tcGxldGlvbnM9Pntjb25zdCBjbGFzc2VzTWFwPXRoaXMuX25vZGVDbGFzc2VzKChzZWxlY3RlZE5vZGUpKTtjb21wbGV0aW9ucz1jb21wbGV0aW9ucy5maWx0ZXIodmFsdWU9PiFjbGFzc2VzTWFwLmdldCh2YWx1ZSkpO2lmKHByZWZpeFswXT09PScuJykKY29tcGxldGlvbnM9Y29tcGxldGlvbnMubWFwKHZhbHVlPT4nLicrdmFsdWUpO3JldHVybiBjb21wbGV0aW9ucy5maWx0ZXIodmFsdWU9PnZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSkuc29ydCgpLm1hcChjb21wbGV0aW9uPT4oe3RleHQ6Y29tcGxldGlvbn0pKTt9KTt9fTs7RWxlbWVudHMuRWxlbWVudFN0YXRlUGFuZVdpZGdldD1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnZWxlbWVudHMvZWxlbWVudFN0YXRlUGFuZVdpZGdldC5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTmFtZT0nc3R5bGVzLWVsZW1lbnQtc3RhdGUtcGFuZSc7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JykuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnRm9yY2UgZWxlbWVudCBzdGF0ZScpKTtjb25zdCB0YWJsZT1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCd0YWJsZScsJ3NvdXJjZS1jb2RlJyk7Y29uc3QgaW5wdXRzPVtdO3RoaXMuX2lucHV0cz1pbnB1dHM7ZnVuY3Rpb24gY2xpY2tMaXN0ZW5lcihldmVudCl7Y29uc3Qgbm9kZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRE9NTm9kZSk7aWYoIW5vZGUpCnJldHVybjtub2RlLmRvbU1vZGVsKCkuY3NzTW9kZWwoKS5mb3JjZVBzZXVkb1N0YXRlKG5vZGUsZXZlbnQudGFyZ2V0LnN0YXRlLGV2ZW50LnRhcmdldC5jaGVja2VkKTt9CmZ1bmN0aW9uIGNyZWF0ZUNoZWNrYm94KHN0YXRlKXtjb25zdCB0ZD1jcmVhdGVFbGVtZW50KCd0ZCcpO2NvbnN0IGxhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKCc6JytzdGF0ZSk7Y29uc3QgaW5wdXQ9bGFiZWwuY2hlY2tib3hFbGVtZW50O2lucHV0LnN0YXRlPXN0YXRlO2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbGlja0xpc3RlbmVyLGZhbHNlKTtpbnB1dHMucHVzaChpbnB1dCk7dGQuYXBwZW5kQ2hpbGQobGFiZWwpO3JldHVybiB0ZDt9CmxldCB0cj10YWJsZS5jcmVhdGVDaGlsZCgndHInKTt0ci5hcHBlbmRDaGlsZChjcmVhdGVDaGVja2JveC5jYWxsKG51bGwsJ2FjdGl2ZScpKTt0ci5hcHBlbmRDaGlsZChjcmVhdGVDaGVja2JveC5jYWxsKG51bGwsJ2hvdmVyJykpO3RyPXRhYmxlLmNyZWF0ZUNoaWxkKCd0cicpO3RyLmFwcGVuZENoaWxkKGNyZWF0ZUNoZWNrYm94LmNhbGwobnVsbCwnZm9jdXMnKSk7dHIuYXBwZW5kQ2hpbGQoY3JlYXRlQ2hlY2tib3guY2FsbChudWxsLCd2aXNpdGVkJykpO3RyPXRhYmxlLmNyZWF0ZUNoaWxkKCd0cicpO3RyLmFwcGVuZENoaWxkKGNyZWF0ZUNoZWNrYm94LmNhbGwobnVsbCwnZm9jdXMtd2l0aGluJykpO3RyeXt0ci5xdWVyeVNlbGVjdG9yKCc6Zm9jdXMtdmlzaWJsZScpO3RyLmFwcGVuZENoaWxkKGNyZWF0ZUNoZWNrYm94LmNhbGwobnVsbCwnZm9jdXMtdmlzaWJsZScpKTt9Y2F0Y2goZSl7fQp0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRhYmxlKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5ET01Ob2RlLHRoaXMuX3VwZGF0ZSx0aGlzKTt9Cl91cGRhdGVNb2RlbChjc3NNb2RlbCl7aWYodGhpcy5fY3NzTW9kZWw9PT1jc3NNb2RlbCkKcmV0dXJuO2lmKHRoaXMuX2Nzc01vZGVsKQp0aGlzLl9jc3NNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuUHNldWRvU3RhdGVGb3JjZWQsdGhpcy5fdXBkYXRlLHRoaXMpO3RoaXMuX2Nzc01vZGVsPWNzc01vZGVsO2lmKHRoaXMuX2Nzc01vZGVsKQp0aGlzLl9jc3NNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5DU1NNb2RlbC5FdmVudHMuUHNldWRvU3RhdGVGb3JjZWQsdGhpcy5fdXBkYXRlLHRoaXMpO30Kd2FzU2hvd24oKXt0aGlzLl91cGRhdGUoKTt9Cl91cGRhdGUoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO2xldCBub2RlPVVJLmNvbnRleHQuZmxhdm9yKFNESy5ET01Ob2RlKTtpZihub2RlKQpub2RlPW5vZGUuZW5jbG9zaW5nRWxlbWVudE9yU2VsZigpO3RoaXMuX3VwZGF0ZU1vZGVsKG5vZGU/bm9kZS5kb21Nb2RlbCgpLmNzc01vZGVsKCk6bnVsbCk7aWYobm9kZSl7Y29uc3Qgbm9kZVBzZXVkb1N0YXRlPW5vZGUuZG9tTW9kZWwoKS5jc3NNb2RlbCgpLnBzZXVkb1N0YXRlKG5vZGUpO2Zvcihjb25zdCBpbnB1dCBvZiB0aGlzLl9pbnB1dHMpe2lucHV0LmRpc2FibGVkPSEhbm9kZS5wc2V1ZG9UeXBlKCk7aW5wdXQuY2hlY2tlZD1ub2RlUHNldWRvU3RhdGUuaW5kZXhPZihpbnB1dC5zdGF0ZSk+PTA7fX1lbHNle2Zvcihjb25zdCBpbnB1dCBvZiB0aGlzLl9pbnB1dHMpe2lucHV0LmRpc2FibGVkPXRydWU7aW5wdXQuY2hlY2tlZD1mYWxzZTt9fX19O0VsZW1lbnRzLkVsZW1lbnRTdGF0ZVBhbmVXaWRnZXQuQnV0dG9uUHJvdmlkZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9idXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUoQ29tbW9uLlVJU3RyaW5nKCdUb2dnbGUgRWxlbWVudCBTdGF0ZScpLCcnKTt0aGlzLl9idXR0b24uc2V0VGV4dChDb21tb24uVUlTdHJpbmcoJzpob3YnKSk7dGhpcy5fYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fY2xpY2tlZCx0aGlzKTt0aGlzLl9idXR0b24uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtb25vc3BhY2UnKTt0aGlzLl92aWV3PW5ldyBFbGVtZW50cy5FbGVtZW50U3RhdGVQYW5lV2lkZ2V0KCk7fQpfY2xpY2tlZCgpe0VsZW1lbnRzLkVsZW1lbnRzUGFuZWwuaW5zdGFuY2UoKS5zaG93VG9vbGJhclBhbmUoIXRoaXMuX3ZpZXcuaXNTaG93aW5nKCk/dGhpcy5fdmlldzpudWxsLHRoaXMuX2J1dHRvbik7fQppdGVtKCl7cmV0dXJuIHRoaXMuX2J1dHRvbjt9fTs7RWxlbWVudHMuRWxlbWVudHNUcmVlRWxlbWVudEhpZ2hsaWdodGVyPWNsYXNze2NvbnN0cnVjdG9yKHRyZWVPdXRsaW5lKXt0aGlzLl90aHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMTAwKTt0aGlzLl90cmVlT3V0bGluZT10cmVlT3V0bGluZTt0aGlzLl90cmVlT3V0bGluZS5hZGRFdmVudExpc3RlbmVyKFVJLlRyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50RXhwYW5kZWQsdGhpcy5fY2xlYXJTdGF0ZSx0aGlzKTt0aGlzLl90cmVlT3V0bGluZS5hZGRFdmVudExpc3RlbmVyKFVJLlRyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50Q29sbGFwc2VkLHRoaXMuX2NsZWFyU3RhdGUsdGhpcyk7dGhpcy5fdHJlZU91dGxpbmUuYWRkRXZlbnRMaXN0ZW5lcihFbGVtZW50cy5FbGVtZW50c1RyZWVPdXRsaW5lLkV2ZW50cy5TZWxlY3RlZE5vZGVDaGFuZ2VkLHRoaXMuX2NsZWFyU3RhdGUsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuT3ZlcmxheU1vZGVsLFNESy5PdmVybGF5TW9kZWwuRXZlbnRzLkhpZ2hsaWdodE5vZGVSZXF1ZXN0ZWQsdGhpcy5faGlnaGxpZ2h0Tm9kZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5PdmVybGF5TW9kZWwsU0RLLk92ZXJsYXlNb2RlbC5FdmVudHMuSW5zcGVjdE1vZGVXaWxsQmVUb2dnbGVkLHRoaXMuX2NsZWFyU3RhdGUsdGhpcyk7fQpfaGlnaGxpZ2h0Tm9kZShldmVudCl7aWYoIUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdoaWdobGlnaHROb2RlT25Ib3ZlckluT3ZlcmxheScpLmdldCgpKQpyZXR1cm47Y29uc3QgZG9tTm9kZT0oZXZlbnQuZGF0YSk7dGhpcy5fdGhyb3R0bGVyLnNjaGVkdWxlKGNhbGxiYWNrLmJpbmQodGhpcykpO3RoaXMuX3BlbmRpbmdIaWdobGlnaHROb2RlPXRoaXMuX3RyZWVPdXRsaW5lPT09RWxlbWVudHMuRWxlbWVudHNUcmVlT3V0bGluZS5mb3JET01Nb2RlbChkb21Ob2RlLmRvbU1vZGVsKCkpP2RvbU5vZGU6bnVsbDtmdW5jdGlvbiBjYWxsYmFjaygpe3RoaXMuX2hpZ2hsaWdodE5vZGVJbnRlcm5hbCh0aGlzLl9wZW5kaW5nSGlnaGxpZ2h0Tm9kZSk7ZGVsZXRlIHRoaXMuX3BlbmRpbmdIaWdobGlnaHROb2RlO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9fQpfaGlnaGxpZ2h0Tm9kZUludGVybmFsKG5vZGUpe3RoaXMuX2lzTW9kaWZ5aW5nVHJlZU91dGxpbmU9dHJ1ZTtsZXQgdHJlZUVsZW1lbnQ9bnVsbDtpZih0aGlzLl9jdXJyZW50SGlnaGxpZ2h0ZWRFbGVtZW50KXtsZXQgY3VycmVudFRyZWVFbGVtZW50PXRoaXMuX2N1cnJlbnRIaWdobGlnaHRlZEVsZW1lbnQ7d2hpbGUoY3VycmVudFRyZWVFbGVtZW50IT09dGhpcy5fYWxyZWFkeUV4cGFuZGVkUGFyZW50RWxlbWVudCl7aWYoY3VycmVudFRyZWVFbGVtZW50LmV4cGFuZGVkKQpjdXJyZW50VHJlZUVsZW1lbnQuY29sbGFwc2UoKTtjdXJyZW50VHJlZUVsZW1lbnQ9Y3VycmVudFRyZWVFbGVtZW50LnBhcmVudDt9fQpkZWxldGUgdGhpcy5fY3VycmVudEhpZ2hsaWdodGVkRWxlbWVudDtkZWxldGUgdGhpcy5fYWxyZWFkeUV4cGFuZGVkUGFyZW50RWxlbWVudDtpZihub2RlKXtsZXQgZGVlcGVzdEV4cGFuZGVkUGFyZW50PW5vZGU7Y29uc3QgdHJlZUVsZW1lbnRTeW1ib2w9dGhpcy5fdHJlZU91dGxpbmUudHJlZUVsZW1lbnRTeW1ib2woKTt3aGlsZShkZWVwZXN0RXhwYW5kZWRQYXJlbnQmJighZGVlcGVzdEV4cGFuZGVkUGFyZW50W3RyZWVFbGVtZW50U3ltYm9sXXx8IWRlZXBlc3RFeHBhbmRlZFBhcmVudFt0cmVlRWxlbWVudFN5bWJvbF0uZXhwYW5kZWQpKQpkZWVwZXN0RXhwYW5kZWRQYXJlbnQ9ZGVlcGVzdEV4cGFuZGVkUGFyZW50LnBhcmVudE5vZGU7dGhpcy5fYWxyZWFkeUV4cGFuZGVkUGFyZW50RWxlbWVudD1kZWVwZXN0RXhwYW5kZWRQYXJlbnQ/ZGVlcGVzdEV4cGFuZGVkUGFyZW50W3RyZWVFbGVtZW50U3ltYm9sXTp0aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpO3RyZWVFbGVtZW50PXRoaXMuX3RyZWVPdXRsaW5lLmNyZWF0ZVRyZWVFbGVtZW50Rm9yKG5vZGUpO30KdGhpcy5fY3VycmVudEhpZ2hsaWdodGVkRWxlbWVudD10cmVlRWxlbWVudDt0aGlzLl90cmVlT3V0bGluZS5zZXRIb3ZlckVmZmVjdCh0cmVlRWxlbWVudCk7aWYodHJlZUVsZW1lbnQpCnRyZWVFbGVtZW50LnJldmVhbCh0cnVlKTt0aGlzLl9pc01vZGlmeWluZ1RyZWVPdXRsaW5lPWZhbHNlO30KX2NsZWFyU3RhdGUoKXtpZih0aGlzLl9pc01vZGlmeWluZ1RyZWVPdXRsaW5lKQpyZXR1cm47ZGVsZXRlIHRoaXMuX2N1cnJlbnRIaWdobGlnaHRlZEVsZW1lbnQ7ZGVsZXRlIHRoaXMuX2FscmVhZHlFeHBhbmRlZFBhcmVudEVsZW1lbnQ7ZGVsZXRlIHRoaXMuX3BlbmRpbmdIaWdobGlnaHROb2RlO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZWxlbWVudHMvYnJlYWRjcnVtYnMuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmNydW1icyB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uY3J1bWJzIC5jcnVtYiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6IDAgN3B4O1xuICAgIGxpbmUtaGVpZ2h0OiAyM3B4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jcnVtYnMgLmNydW1iLmNvbGxhcHNlZCA+ICoge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jcnVtYnMgLmNydW1iLmNvbGxhcHNlZDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlxcMjAyNlwiO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uY3J1bWJzIC5jcnVtYi5jb21wYWN0IC5leHRyYSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmNydW1iLnNlbGVjdGVkLCAuY3J1bWI6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG4uY3J1bWI6bm90KC5zZWxlY3RlZCkgLm5vZGUtbGFiZWwtbmFtZSB7XG4gICAgY29sb3I6IHZhcigtLWRvbS10YWctbmFtZS1jb2xvcik7XG59XG5cbi5jcnVtYjpub3QoLnNlbGVjdGVkKSAubm9kZS1sYWJlbC1jbGFzcyB7XG4gICAgY29sb3I6IHZhcigtLWRvbS1hdHRyaWJ1dGUtbmFtZS1jb2xvcik7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvYnJlYWRjcnVtYnMuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZWxlbWVudHMvY2xhc3Nlc1BhbmVXaWRnZXQuY3NzIl09Ii8qKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zdHlsZXMtZWxlbWVudC1jbGFzc2VzLXBhbmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTg5LCAxODksIDE4OSk7XG4gICAgcGFkZGluZzogNnB4IDJweCAycHg7XG59XG5cbi5zdHlsZXMtZWxlbWVudC1jbGFzc2VzLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uc3R5bGVzLWVsZW1lbnQtY2xhc3Nlcy1wYW5lIGxhYmVsIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG59XG5cbi5zdHlsZXMtZWxlbWVudC1jbGFzc2VzLXBhbmUgLnRpdGxlLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZy1ib3R0b206IDJweDtcbn1cblxuLnN0eWxlcy1lbGVtZW50LWNsYXNzZXMtcGFuZSAubmV3LWNsYXNzLWlucHV0IHtcbiAgICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgIGxpbmUtaGVpZ2h0OiAxNXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDdweCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvY2xhc3Nlc1BhbmVXaWRnZXQuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZWxlbWVudHMvY29tcHV0ZWRTdHlsZVNpZGViYXJQYW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uY29tcHV0ZWQtcHJvcGVydGllcyB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLnN0eWxlcy1zaWRlYmFyLXBhbmUtdG9vbGJhciB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5zdHlsZXMtc2lkZWJhci1wYW5lLWZpbHRlci1ib3gge1xuICAgIGZsZXg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLnN0eWxlcy1zaWRlYmFyLXBhbmUtZmlsdGVyLWJveCA+IGlucHV0IHtcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIHBhZGRpbmctbGVmdDogNHB4O1xuICAgIG1hcmdpbjogM3B4O1xufVxuXG4uc3R5bGVzLXNpZGViYXItcGFuZS1maWx0ZXItYm94ID4gaW5wdXQ6Zm9jdXMsXG4uc3R5bGVzLXNpZGViYXItcGFuZS1maWx0ZXItYm94ID4gaW5wdXQ6bm90KDpwbGFjZWhvbGRlci1zaG93bikge1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWZvY3VzLXJpbmctYWN0aXZlLXNoYWRvdyk7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvY29tcHV0ZWRTdHlsZVNpZGViYXJQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL2NvbXB1dGVkU3R5bGVXaWRnZXRUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uY29tcHV0ZWQtc3R5bGUtcHJvcGVydHkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uY29tcHV0ZWQtc3R5bGUtcHJvcGVydHkgLnByb3BlcnR5LW5hbWUge1xuICAgIG1pbi13aWR0aDogNWVtO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleC1zaHJpbms6IDE7XG4gICAgZmxleC1iYXNpczogMTZlbTtcbiAgICBmbGV4LWdyb3c6IDE7XG59XG5cbi5jb21wdXRlZC1zdHlsZS1wcm9wZXJ0eSAucHJvcGVydHktdmFsdWUge1xuICAgIG1hcmdpbi1sZWZ0OiAyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgZmxleC1iYXNpczogNWVtO1xuICAgIGZsZXgtZ3JvdzogMTA7XG59XG5cbi5jb21wdXRlZC1zdHlsZS1wcm9wZXJ0eSAucHJvcGVydHktdmFsdWUtdGV4dCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLnRyZWUtb3V0bGluZSBsaTpob3ZlciAuZ290by1zb3VyY2UtaWNvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luLXRvcDogLTJweDtcbn1cblxuLmdvdG8tc291cmNlLWljb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1YTVhNWE7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogLTE2cHg7XG59XG5cbi5nb3RvLXNvdXJjZS1pY29uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xufVxuXG4uY29tcHV0ZWQtc3R5bGUtcHJvcGVydHktaW5oZXJpdGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi50cmFjZS1saW5rIHtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi5wcm9wZXJ0eS10cmFjZSB7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4LWdyb3c6IDE7XG59XG5cbi5wcm9wZXJ0eS10cmFjZS1zZWxlY3RvciB7XG4gICAgY29sb3I6IGdyYXk7XG4gICAgcGFkZGluZy1sZWZ0OiAyZW07XG59XG5cbi5wcm9wZXJ0eS10cmFjZS12YWx1ZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tbGVmdDogMmVtO1xufVxuXG4ucHJvcGVydHktdHJhY2UtaW5hY3RpdmUgLnByb3BlcnR5LXRyYWNlLXZhbHVlOjpiZWZvcmUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBjb250ZW50OiBcIi5cIjtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiA1cHg7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5vZGQtcm93IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTtcbn1cblxuLnRyZWUtb3V0bGluZSwgLnRyZWUtb3V0bGluZSBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjM1LCAyNDIsIDI1Mik7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOjpiZWZvcmUge1xuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG59XG5cbi5kZWxpbWV0ZXIge1xuICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmRlbGltZXRlcjo6c2VsZWN0aW9uIHtcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvY29tcHV0ZWRTdHlsZVdpZGdldFRyZWUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZWxlbWVudHMvZG9tTGlua2lmaWVyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxuXG4ubm9kZS1saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4ubm9kZS1sYWJlbC1uYW1lIHtcbiAgICBjb2xvcjogcmdiKDEzNiwgMTgsIDEyOCk7XG59XG5cbi5ub2RlLWxhYmVsLWNsYXNzLCAubm9kZS1sYWJlbC1wc2V1ZG8ge1xuICAgIGNvbG9yOiByZ2IoMTUzLCA2OSwgMCk7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvZG9tTGlua2lmaWVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL2VsZW1lbnRzUGFuZWwuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoQykgMjAwOSBBbnRob255IFJpY2F1ZCA8cmlrQHdlYmtpdC5vcmc+XG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKlxuICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoXCJBcHBsZVwiKSBub3IgdGhlIG5hbWVzIG9mXG4gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbiNlbGVtZW50cy1jb250ZW50IHtcbiAgICBmbGV4OiAxIDE7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcGFkZGluZzogMnB4IDAgMCAwO1xufVxuXG4jZWxlbWVudHMtY29udGVudDpub3QoLmVsZW1lbnRzLXdyYXApID4gZGl2IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWluLXdpZHRoOiAxMDAlO1xufVxuXG4jZWxlbWVudHMtY29udGVudC5lbGVtZW50cy13cmFwIHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbiNlbGVtZW50cy1jcnVtYnMge1xuICAgIGZsZXg6IDAgMCAyM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yKTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uc3R5bGUtcGFuZXMtd3JhcHBlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiBhdXRvO1xufVxuXG4uc3R5bGUtcGFuZXMtd3JhcHBlciA+IGRpdjpub3QoOmZpcnN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xufVxuXG4uZWxlbWVudHMtdHJlZS1oZWFkZXIge1xuICAgIGhlaWdodDogMjRweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZWxlbWVudHMtdHJlZS1oZWFkZXItZnJhbWUge1xuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD1lbGVtZW50cy9lbGVtZW50c1BhbmVsLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL2VsZW1lbnRTdGF0ZVBhbmVXaWRnZXQuY3NzIl09Ii8qKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zdHlsZXMtZWxlbWVudC1zdGF0ZS1wYW5lIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBhZGRpbmctbGVmdDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTg5LCAxODksIDE4OSk7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMnB4O1xufVxuXG4uc3R5bGVzLWVsZW1lbnQtc3RhdGUtcGFuZSA+IGRpdiB7XG4gICAgbWFyZ2luOiA4cHggNHB4IDZweDtcbn1cblxuLnN0eWxlcy1lbGVtZW50LXN0YXRlLXBhbmUgPiB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbi5zdHlsZXMtZWxlbWVudC1zdGF0ZS1wYW5lIHRkIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4vKiMgc291cmNlVVJMPWVsZW1lbnRzL2VsZW1lbnRTdGF0ZVBhbmVXaWRnZXQuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siZWxlbWVudHMvZWxlbWVudHNUcmVlT3V0bGluZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaSB7XG4gICAgLyoqIEtlZXAgbWFyZ2luLWxlZnQgJiBwYWRkaW5nLWxlZnQgaW4gc3luYyB3aXRoIEVsZW1lbnRzVHJlZUVsZW1lbnRzLnVwZGF0ZURlY29yYXRvcnMgKiovXG4gICAgcGFkZGluZzogMCAwIDAgMTRweDtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0ycHg7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxNXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNXB4O1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaS5wYXJlbnQge1xuICAgIC8qKiBLZWVwIGl0IGluIHN5bmMgd2l0aCBFbGVtZW50c1RyZWVFbGVtZW50cy51cGRhdGVEZWNvcmF0b3JzICoqL1xuICAgIG1hcmdpbi1sZWZ0OiAtMTNweDtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkgLnNlbGVjdGVkLWhpbnQ6YmVmb3JlIHtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgY29udGVudDogXCIgPT0gJDBcIjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaS5zZWxlY3RlZCAuc2VsZWN0ZWQtaGludDpiZWZvcmUge1xuICAgIG9wYWNpdHk6IDAuNjtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWluYWN0aXZlLWZnLWNvbG9yKTtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkuc2VsZWN0ZWQ6Zm9jdXMgLnNlbGVjdGVkLWhpbnQ6YmVmb3JlIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkucGFyZW50OjpiZWZvcmUge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpLnBhcmVudDo6YmVmb3JlIHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy90cmVlb3V0bGluZVRyaWFuZ2xlcy5wbmcpO1xuICAgIC13ZWJraXQtbWFzay1zaXplOiAzMnB4IDI0cHg7XG4gICAgY29udGVudDogJ1xcMDBhMFxcMDBhMCc7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgIG1hcmdpbi1yaWdodDogLTNweDtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkuYWx3YXlzLXBhcmVudDo6YmVmb3JlIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpLnBhcmVudDo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChJbWFnZXMvdHJlZW91dGxpbmVUcmlhbmdsZXNfMngucG5nKTtcbn1cbn0gLyogbWVkaWEgKi9cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkucGFyZW50OjpiZWZvcmUge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogMCAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3MjcyNzI7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpIC5zZWxlY3Rpb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgei1pbmRleDogLTE7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpLmhvdmVyZWQ6bm90KC5zZWxlY3RlZCkgLnNlbGVjdGlvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbGVmdDogM3B4O1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NiwgMTIxLCAyMTcsIDAuMSk7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaS5wYXJlbnQuZXhwYW5kZWQ6OmJlZm9yZSB7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAtMTZweCAwO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaS5zZWxlY3RlZCAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24taW5hY3RpdmUtYmctY29sb3IpO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBvbCB7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICAgIC8qKiBLZWVwIGl0IGluIHN5bmMgd2l0aCBFbGVtZW50c1RyZWVFbGVtZW50cy51cGRhdGVEZWNvcmF0b3JzICoqL1xuICAgIC13ZWJraXQtcGFkZGluZy1zdGFydDogMTJweDtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIG9sLmNoaWxkcmVuIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBvbC5jaGlsZHJlbi5leHBhbmRlZCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpIC53ZWJraXQtaHRtbC10YWcuY2xvc2Uge1xuICAgIG1hcmdpbi1sZWZ0OiAtMTJweDtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgPiBvbCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMDtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgbWluLXdpZHRoOiAxMDAlO1xuICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIG9sIGxpLnNlbGVjdGVkOmZvY3VzIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKTtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgb2wgbGkucGFyZW50LnNlbGVjdGVkOmZvY3VzOjpiZWZvcmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1mZy1jb2xvcik7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIG9sIGxpLnNlbGVjdGVkOmZvY3VzICoge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBvbCBsaS5zZWxlY3RlZDpmb2N1cyAuc2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xufVxuXG4uZWxlbWVudHMtdHJlZS1vdXRsaW5lIG9sLnNoYWRvdy1yb290LWRlcHRoLTQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG59XG5cbi5lbGVtZW50cy10cmVlLW91dGxpbmUgb2wuc2hhZG93LXJvb3QtZGVwdGgtMyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAzKTtcbn1cblxuLmVsZW1lbnRzLXRyZWUtb3V0bGluZSBvbC5zaGFkb3ctcm9vdC1kZXB0aC0yIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDIpO1xufVxuXG4uZWxlbWVudHMtdHJlZS1vdXRsaW5lIG9sLnNoYWRvdy1yb290LWRlcHRoLTEge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMSk7XG59XG5cbi5lbGVtZW50cy10cmVlLW91dGxpbmUgb2wuc2hhZG93LXJvb3QtZGVlcCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5lbGVtZW50cy10cmVlLWVkaXRvciB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSBsaS5lbGVtZW50cy1kcmFnLW92ZXIgLnNlbGVjdGlvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luLXRvcDogLTJweDtcbiAgICBib3JkZXItdG9wOiAycHggc29saWQgdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgbGkuaW4tY2xpcGJvYXJkIC5oaWdobGlnaHQge1xuICAgIG91dGxpbmU6IDFweCBkb3R0ZWQgZGFya2dyZXk7XG59XG5cbi5Db2RlTWlycm9yIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBoZWlnaHQ6IDMwMHB4ICFpbXBvcnRhbnQ7XG59XG5cbi5Db2RlTWlycm9yLWxpbmVzIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uQ29kZU1pcnJvciBwcmUge1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbmJ1dHRvbiwgaW5wdXQsIHNlbGVjdCB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG59XG5cbi5lZGl0aW5nIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1kcm9wLXNoYWRvdyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdGV4dC1vdmVyZmxvdzogY2xpcCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogMnB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtMnB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDJweDtcbiAgICBtYXJnaW4tcmlnaHQ6IC0ycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXB4O1xuICAgIG9wYWNpdHk6IDEuMCAhaW1wb3J0YW50O1xufVxuXG4uZWRpdGluZyxcbi5lZGl0aW5nICoge1xuICAgIGNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi5lZGl0aW5nIGJyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZWxlbWVudHMtZ3V0dGVyLWRlY29yYXRpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAycHg7XG4gICAgbWFyZ2luLXRvcDogMnB4O1xuICAgIGhlaWdodDogOXB4O1xuICAgIHdpZHRoOiA5cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIG9yYW5nZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBvcmFuZ2U7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZWxlbWVudHMtZ3V0dGVyLWRlY29yYXRpb24uZWxlbWVudHMtaGFzLWRlY29yYXRlZC1jaGlsZHJlbiB7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4uYWRkLWF0dHJpYnV0ZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDFweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uZWxlbWVudHMtdHJlZS1ub3dyYXAsIC5lbGVtZW50cy10cmVlLW5vd3JhcCAubGkge1xuICAgIHdoaXRlLXNwYWNlOiBwcmUgIWltcG9ydGFudDtcbn1cblxuLmVsZW1lbnRzLWRpc2Nsb3N1cmUgLmVsZW1lbnRzLXRyZWUtbm93cmFwIGxpIHtcbiAgICB3b3JkLXdyYXA6IG5vcm1hbDtcbn1cblxuLyogRE9NIHVwZGF0ZSBoaWdobGlnaHQgKi9cbkAtd2Via2l0LWtleWZyYW1lcyBkb20tdXBkYXRlLWhpZ2hsaWdodC1hbmltYXRpb24ge1xuICAgIGZyb20ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTU4LCA1NCwgMTUzKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgICA4MCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ1LCAyMTksIDI0NCk7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG4gICAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgZG9tLXVwZGF0ZS1oaWdobGlnaHQtYW5pbWF0aW9uLWRhcmsge1xuICAgIGZyb20ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTU4LCA1NCwgMTUzKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgICA4MCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xuICAgIH1cbn1cblxuLmRvbS11cGRhdGUtaGlnaGxpZ2h0IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogZG9tLXVwZGF0ZS1oaWdobGlnaHQtYW5pbWF0aW9uIDEuNHMgMSBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLmRvbS11cGRhdGUtaGlnaGxpZ2h0IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogZG9tLXVwZGF0ZS1oaWdobGlnaHQtYW5pbWF0aW9uLWRhcmsgMS40cyAxIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZS5zaW5nbGUtbm9kZSBsaSB7XG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XG59XG5cbi5lbGVtZW50cy10cmVlLXNob3J0Y3V0LXRpdGxlIHtcbiAgICBjb2xvcjogcmdiKDg3LCA4NywgODcpO1xufVxuXG5vbDpob3ZlciA+IGxpID4gLmVsZW1lbnRzLXRyZWUtc2hvcnRjdXQtbGluayB7XG4gICAgZGlzcGxheTogaW5pdGlhbDtcbn1cblxuLmVsZW1lbnRzLXRyZWUtc2hvcnRjdXQtbGluayB7XG4gICAgY29sb3I6IHJnYig4NywgODcsIDg3KTtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG5vbCBsaS5zZWxlY3RlZDpmb2N1cyAud2Via2l0LWh0bWwtdGFnLW5hbWUsXG5vbCBsaS5zZWxlY3RlZDpmb2N1cyAud2Via2l0LWh0bWwtY2xvc2UtdGFnLW5hbWUsXG5vbCBsaS5zZWxlY3RlZDpmb2N1cyAud2Via2l0LWh0bWwtYXR0cmlidXRlLXZhbHVlLFxub2wgbGkuc2VsZWN0ZWQ6Zm9jdXMgLmRldnRvb2xzLWxpbmsge1xuICAgIGNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tZmctY29sb3IpO1xufVxuXG4uZWxlbWVudHMtZGlzY2xvc3VyZSAuZ3V0dGVyLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG59XG5cbi5ndXR0ZXItbWVudS1pY29uIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZykgc2NhbGUoMC44KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTdweDtcbiAgICB0b3A6IC0zcHg7XG59XG5cbi5lbGVtZW50cy1kaXNjbG9zdXJlIGxpLnNlbGVjdGVkIC5ndXR0ZXItY29udGFpbmVyOm5vdCguaGFzLWRlY29yYXRpb25zKSAuZ3V0dGVyLW1lbnUtaWNvbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qKiBHdWlkZSBsaW5lICovXG5saS5zZWxlY3RlZCB7XG4gICAgei1pbmRleDogMDtcbn1cblxubGkuaG92ZXJlZDpub3QoLmFsd2F5cy1wYXJlbnQpICsgb2wuY2hpbGRyZW4sIC5lbGVtZW50cy10cmVlLW91dGxpbmUgb2wuc2hhZG93LXJvb3QsIGxpLnNlbGVjdGVkOm5vdCguYWx3YXlzLXBhcmVudCkgKyBvbC5jaGlsZHJlbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAtd2Via2l0LXBhZGRpbmctc3RhcnQ6IDZweDtcbiAgICBib3JkZXItd2lkdGg6IDFweDtcbiAgICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG59XG5cbmxpLmhvdmVyZWQ6bm90KC5hbHdheXMtcGFyZW50KSArIG9sLmNoaWxkcmVuOm5vdCguc2hhZG93LXJvb3QpIHtcbiAgICBib3JkZXItY29sb3I6IGhzbGEoMCwwJSwwJSwwLjEpO1xufVxuXG4uZWxlbWVudHMtdHJlZS1vdXRsaW5lIG9sLnNoYWRvdy1yb290IHtcbiAgICBib3JkZXItY29sb3I6IGhzbGEoMCwwJSw4MCUsMSk7XG59XG5cbmxpLnNlbGVjdGVkOm5vdCguYWx3YXlzLXBhcmVudCkgKyBvbC5jaGlsZHJlbiB7XG4gICAgYm9yZGVyLWNvbG9yOiBoc2xhKDIxNiw2OCUsODAlLDEpICFpbXBvcnRhbnQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvZWxlbWVudHNUcmVlT3V0bGluZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJlbGVtZW50cy9tZXRyaWNzU2lkZWJhclBhbmUuY3NzIl09Ii8qKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5tZXRyaWNzIHtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG1pbi1oZWlnaHQ6IHZhcigtLW1ldHJpY3MtaGVpZ2h0KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbjpob3N0IHtcbiAgICAtLW1ldHJpY3MtaGVpZ2h0OiAxOTBweDtcbiAgICBoZWlnaHQ6IHZhcigtLW1ldHJpY3MtaGVpZ2h0KTtcbiAgICBjb250YWluOiBzdHJpY3Q7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLm1ldHJpY3Mge1xuICAgIGNvbG9yOiAjMjIyO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5tZXRyaWNzID4gZGl2OmhvdmVyIHtcbiAgICBjb2xvcjogI2NjYztcbn1cblxuLm1ldHJpY3MgLmxhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XG4gICAgcGFkZGluZy1yaWdodDogMnB4O1xufVxuXG4ubWV0cmljcyAucG9zaXRpb24ge1xuICAgIGJvcmRlcjogMXB4IHJnYig2NiUsIDY2JSwgNjYlKSBkb3R0ZWQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAzcHg7XG4gICAgbWFyZ2luOiAzcHg7XG59XG5cbi5tZXRyaWNzIC5tYXJnaW4ge1xuICAgIGJvcmRlcjogMXB4IGRhc2hlZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgcGFkZGluZzogM3B4O1xuICAgIG1hcmdpbjogM3B4O1xufVxuXG4ubWV0cmljcyAuYm9yZGVyIHtcbiAgICBib3JkZXI6IDFweCBibGFjayBzb2xpZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgcGFkZGluZzogM3B4O1xuICAgIG1hcmdpbjogM3B4O1xufVxuXG4ubWV0cmljcyAucGFkZGluZyB7XG4gICAgYm9yZGVyOiAxcHggZ3JleSBkYXNoZWQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHBhZGRpbmc6IDNweDtcbiAgICBtYXJnaW46IDNweDtcbn1cblxuLm1ldHJpY3MgLmNvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgYm9yZGVyOiAxcHggZ3JheSBzb2xpZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgcGFkZGluZzogM3B4O1xuICAgIG1hcmdpbjogM3B4O1xuICAgIG1pbi13aWR0aDogODBweDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLm1ldHJpY3MgLmNvbnRlbnQgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ubWV0cmljcyAuZWRpdGluZyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi5tZXRyaWNzIC5sZWZ0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm1ldHJpY3MgLnJpZ2h0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm1ldHJpY3MgLnRvcCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ubWV0cmljcyAuYm90dG9tIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi8qIyBzb3VyY2VVUkw9ZWxlbWVudHMvbWV0cmljc1NpZGViYXJQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL3BsYXRmb3JtRm9udHNXaWRnZXQuY3NzIl09Ii8qKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4ucGxhdGZvcm0tZm9udHMge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uZm9udC1uYW1lIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmZvbnQtdXNhZ2Uge1xuICAgIGNvbG9yOiAjODg4O1xuICAgIHBhZGRpbmctbGVmdDogM3B4O1xufVxuXG4udGl0bGUge1xuICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XG4gICAgYm9yZGVyLWNvbG9yOiAjZGRkO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zdGF0cy1zZWN0aW9uIHtcbiAgICBtYXJnaW46IDVweCAwO1xufVxuXG4uZm9udC1zdGF0cy1pdGVtIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cblxuLmZvbnQtc3RhdHMtaXRlbSAuZm9udC1kZWxpbWV0ZXIge1xuICAgIG1hcmdpbjogMCAxZXggMCAxZXg7XG59XG5cblxuLyojIHNvdXJjZVVSTD1lbGVtZW50cy9wbGF0Zm9ybUZvbnRzV2lkZ2V0LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL3Byb3BlcnRpZXNXaWRnZXQuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wcm9wZXJ0aWVzLXdpZGdldC1zZWN0aW9uIHtcbiAgICBwYWRkaW5nOiAycHggMHB4IDJweCA1cHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD1lbGVtZW50cy9wcm9wZXJ0aWVzV2lkZ2V0LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL3N0eWxlc1NlY3Rpb25UcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50cmVlLW91dGxpbmUge1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi50cmVlLW91dGxpbmUgbGkubm90LXBhcnNlZC1vayB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi50cmVlLW91dGxpbmUgbGkuZmlsdGVyLW1hdGNoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAwLCAwLjUpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC50cmVlLW91dGxpbmUgbGkuZmlsdGVyLW1hdGNoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDEzMywgMTAwJSwgMzAlLCAwLjUpO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLm92ZXJsb2FkZWQuZmlsdGVyLW1hdGNoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAwLCAwLjI1KTtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAudHJlZS1vdXRsaW5lIGxpLm92ZXJsb2FkZWQuZmlsdGVyLW1hdGNoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDEzMywgMTAwJSwgMzAlLCAwLjI1KTtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5ub3QtcGFyc2VkLW9rIC5leGNsYW1hdGlvbi1tYXJrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBtYXJnaW46IDAgN3B4IDAgMDtcbiAgICB0b3A6IDFweDtcbiAgICBsZWZ0OiAtMzZweDsgLyogb3V0ZGVudCB0byBjb21wZW5zYXRlIGZvciB0aGUgdG9wLWxldmVsIHByb3BlcnR5IGluZGVudCAqL1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi50cmVlLW91dGxpbmUgbGkge1xuICAgIG1hcmdpbi1sZWZ0OiAxMnB4O1xuICAgIHBhZGRpbmctbGVmdDogMjJweDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGN1cnNvcjogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnRyZWUtb3V0bGluZSBsaTo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIC53ZWJraXQtY3NzLXByb3BlcnR5IHtcbiAgICBtYXJnaW4tbGVmdDogLTIycHg7IC8qIG91dGRlbnQgdGhlIGZpcnN0IGxpbmUgb2YgbG9uZ2hhbmQgcHJvcGVydGllcyAoaW4gYW4gZXhwYW5kZWQgc2hvcnRoYW5kKSB0byBjb21wZW5zYXRlIGZvciB0aGUgXCJwYWRkaW5nLWxlZnRcIiBzaGlmdCBpbiAudHJlZS1vdXRsaW5lIGxpICovXG59XG5cbi50cmVlLW91dGxpbmUgPiBsaSB7XG4gICAgcGFkZGluZy1sZWZ0OiAzOHB4O1xuICAgIGNsZWFyOiBib3RoO1xuICAgIG1pbi1oZWlnaHQ6IDE0cHg7XG59XG5cbi50cmVlLW91dGxpbmUgPiBsaSAud2Via2l0LWNzcy1wcm9wZXJ0eSB7XG4gICAgbWFyZ2luLWxlZnQ6IC0zOHB4OyAvKiBvdXRkZW50IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0b3AtbGV2ZWwgcHJvcGVydGllcyB0byBjb21wZW5zYXRlIGZvciB0aGUgXCJwYWRkaW5nLWxlZnRcIiBzaGlmdCBpbiAudHJlZS1vdXRsaW5lID4gbGkgKi9cbn1cblxuLnRyZWUtb3V0bGluZSA+IGxpLmNoaWxkLWVkaXRpbmcge1xuICAgIHBhZGRpbmctbGVmdDogOHB4O1xufVxuXG4udHJlZS1vdXRsaW5lID4gbGkuY2hpbGQtZWRpdGluZyAudGV4dC1wcm9tcHQge1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLnRyZWUtb3V0bGluZSA+IGxpLmNoaWxkLWVkaXRpbmcgLndlYmtpdC1jc3MtcHJvcGVydHkge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmNoaWxkLWVkaXRpbmcge1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZCAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWwgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG59XG5cbm9sOm5vdCgudHJlZS1vdXRsaW5lKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBtYXJnaW46IDA7XG4gICAgLXdlYmtpdC1wYWRkaW5nLXN0YXJ0OiAxMnB4O1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbm9sLmV4cGFuZGVkIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLnRyZWUtb3V0bGluZSBsaSAuaW5mbyB7XG4gICAgcGFkZGluZy10b3A6IDRweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogM3B4O1xufVxuXG4uZW5hYmxlZC1idXR0b24ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbWFyZ2luOiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG4gICAgd2lkdGg6IDE4cHg7XG4gICAgbGVmdDogLTQwcHg7IC8qIG9yaWdpbmFsIC0ycHggKyAoLTM4cHgpIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBsaW5lIG91dGRlbnQgKi9cbiAgICB0b3A6IDFweDtcbiAgICBoZWlnaHQ6IDEzcHg7XG59XG5cbi50cmVlLW91dGxpbmUgbGkuZWRpdGluZyAuZW5hYmxlZC1idXR0b24ge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLm92ZXJsb2FkZWQ6bm90KC5oYXMtaWdub3JhYmxlLWVycm9yKSxcbi5pbmFjdGl2ZSxcbi5kaXNhYmxlZCxcbi5ub3QtcGFyc2VkLW9rOm5vdCguaGFzLWlnbm9yYWJsZS1lcnJvcikge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xufVxuXG4uaGFzLWlnbm9yYWJsZS1lcnJvciAud2Via2l0LWNzcy1wcm9wZXJ0eSB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5pbXBsaWNpdCxcbi5pbmhlcml0ZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLmhhcy1pZ25vcmFibGUtZXJyb3Ige1xuICAgIGNvbG9yOiBncmF5O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmVkaXRpbmcge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIHRleHQtb3ZlcmZsb3c6IGNsaXA7XG59XG5cbi50cmVlLW91dGxpbmUgbGkuZWRpdGluZy1zdWItcGFydCB7XG4gICAgcGFkZGluZzogM3B4IDZweCA4cHggMThweDtcbiAgICBtYXJnaW46IC0xcHggLTZweCAtOHB4IC02cHg7XG4gICAgdGV4dC1vdmVyZmxvdzogY2xpcDtcbn1cblxuOmhvc3QtY29udGV4dCgubm8tYWZmZWN0KSAudHJlZS1vdXRsaW5lIGxpIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbjpob3N0LWNvbnRleHQoLm5vLWFmZmVjdCkgLnRyZWUtb3V0bGluZSBsaS5lZGl0aW5nIHtcbiAgICBvcGFjaXR5OiAxLjA7XG59XG5cbjpob3N0LWNvbnRleHQoLnN0eWxlcy1wYW5lbC1ob3ZlcmVkOm5vdCgucmVhZC1vbmx5KSkgLndlYmtpdC1jc3MtcHJvcGVydHk6aG92ZXIsXG46aG9zdC1jb250ZXh0KC5zdHlsZXMtcGFuZWwtaG92ZXJlZDpub3QoLnJlYWQtb25seSkpIC52YWx1ZTpob3ZlciB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uc3R5bGVzLWNsaXBib2FyZC1vbmx5IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDA7XG4gICAgb3BhY2l0eTogMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmNoaWxkLWVkaXRpbmcgLnN0eWxlcy1jbGlwYm9hcmQtb25seSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogTWF0Y2hlZCBzdHlsZXMgKi9cblxuOmhvc3QtY29udGV4dCgubWF0Y2hlZC1zdHlsZXMpIC50cmVlLW91dGxpbmUgbGkge1xuICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cbi5leHBhbmQtaWNvbiB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBtYXJnaW4tbGVmdDogLTZweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAtMnB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOm5vdCgucGFyZW50KSAuZXhwYW5kLWljb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbjpob3N0LWNvbnRleHQoLm1hdGNoZWQtc3R5bGVzOm5vdCgucmVhZC1vbmx5KTpob3ZlcikgLmVuYWJsZWQtYnV0dG9uIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG46aG9zdC1jb250ZXh0KC5tYXRjaGVkLXN0eWxlczpub3QoLnJlYWQtb25seSkpIC50cmVlLW91dGxpbmUgbGkuZGlzYWJsZWQgLmVuYWJsZWQtYnV0dG9uIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG46aG9zdC1jb250ZXh0KC5tYXRjaGVkLXN0eWxlcykgb2wuZXhwYW5kZWQge1xuICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xufVxuXG4vKiMgc291cmNlVVJMPWVsZW1lbnRzL3N0eWxlc1NlY3Rpb25UcmVlLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImVsZW1lbnRzL3N0eWxlc1NpZGViYXJQYW5lLmNzcyJdPSIvKipcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uc3R5bGVzLXNlY3Rpb24ge1xuICAgIG1pbi1oZWlnaHQ6IDE4cHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yKTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnN0eWxlcy1zZWN0aW9uID4gZGl2IHtcbiAgICBwYWRkaW5nOiAycHggMnB4IDRweCA0cHg7XG59XG5cbi5zdHlsZXMtc2VjdGlvbjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xufVxuXG4uc3R5bGVzLXNlY3Rpb24ucmVhZC1vbmx5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLnN0eWxlcy1zZWN0aW9uW2RhdGEta2V5Ym9hcmQtZm9jdXM9XCJ0cnVlXCJdOmZvY3VzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjE0LCA2NyUsIDk1JSk7XG59XG5cbi5zdHlsZXMtc2VjdGlvbi5yZWFkLW9ubHlbZGF0YS1rZXlib2FyZC1mb2N1cz1cInRydWVcIl06Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTUsIDI1JSwgOTElKTtcbn1cblxuLnN0eWxlcy1zZWN0aW9uIC5zaW1wbGUtc2VsZWN0b3IuZmlsdGVyLW1hdGNoIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAwLCAwLjUpO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5zdHlsZXMtc2VjdGlvbiAuc2ltcGxlLXNlbGVjdG9yLmZpbHRlci1tYXRjaCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgxMzMsIDEwMCUsIDMwJSwgMC41KTtcbn1cblxuLnNpZGViYXItcGFuZS1jbG9zaW5nLWJyYWNlIHtcbiAgICBjbGVhcjogYm90aDtcbn1cblxuLnN0eWxlcy1zZWN0aW9uLXRpdGxlIHtcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmc7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbi5zdHlsZXMtc2VjdGlvbi10aXRsZSAubWVkaWEtbGlzdCB7XG4gICAgY29sb3I6ICM4ODg7XG59XG5cbi5zdHlsZXMtc2VjdGlvbi10aXRsZSAubWVkaWEtbGlzdC5tZWRpYS1tYXRjaGVzIC5tZWRpYS5lZGl0YWJsZS1tZWRpYSB7XG4gICAgY29sb3I6ICMyMjI7XG59XG5cbi5zdHlsZXMtc2VjdGlvbi10aXRsZSAubWVkaWE6bm90KC5lZGl0aW5nLW1lZGlhKSxcbi5zdHlsZXMtc2VjdGlvbi10aXRsZSAubWVkaWE6bm90KC5lZGl0aW5nLW1lZGlhKSAuc3VidGl0bGUge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5zdHlsZXMtc2VjdGlvbi10aXRsZSAubWVkaWEgLnN1YnRpdGxlIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgY29sb3I6IHJnYig4NSwgODUsIDg1KTtcbn1cblxuLnN0eWxlcy1zZWN0aW9uLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogcmdiKDg1LCA4NSwgODUpO1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG59XG5cbi5zdHlsZXMtc2VjdGlvbiAuc3R5bGVzLXNlY3Rpb24tc3VidGl0bGUgLmRldnRvb2xzLWxpbmsge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uc3R5bGVzLXNlY3Rpb24gLnNlbGVjdG9yIHtcbiAgICBjb2xvcjogIzg4ODtcbn1cblxuLnN0eWxlcy1zZWN0aW9uIC5zaW1wbGUtc2VsZWN0b3Iuc2VsZWN0b3ItbWF0Y2hlcywgLnN0eWxlcy1zZWN0aW9uLmtleWZyYW1lLWtleSB7XG4gICAgY29sb3I6ICMyMjI7XG59XG5cbi5zdHlsZXMtc2VjdGlvbiAuZGV2dG9vbHMtbGluayB7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5zdHlsZXMtc2VjdGlvbiAuc3R5bGUtcHJvcGVydGllcyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDJweCA0cHggMCAwO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLnN0eWxlcy1zZWN0aW9uLm1hdGNoZWQtc3R5bGVzIC5zdHlsZS1wcm9wZXJ0aWVzIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG59XG5cbkBrZXlmcmFtZXMgc3R5bGVzLWVsZW1lbnQtc3RhdGUtcGFuZS1zbGlkZWluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgbWFyZ2luLXRvcDogLTYwcHg7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMHB4O1xuICAgIH1cbn1cblxuQGtleWZyYW1lcyBzdHlsZXMtZWxlbWVudC1zdGF0ZS1wYW5lLXNsaWRlb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMHB4O1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG1hcmdpbi10b3A6IC02MHB4O1xuICAgIH1cbn1cblxuLnN0eWxlcy1zaWRlYmFyLXRvb2xiYXItcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4xcztcbiAgICBhbmltYXRpb24tZGlyZWN0aW9uOiBub3JtYWw7XG59XG5cbi5zdHlsZXMtc2lkZWJhci10b29sYmFyLXBhbmUtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLnN0eWxlcy1zZWxlY3RvciB7XG4gICAgY3Vyc29yOiB0ZXh0O1xufVxuXG4uc3R5bGVzLXNpZGViYXItcGFuZS10b29sYmFyLWNvbnRhaW5lciB7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIHRvcDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4uc3R5bGVzLXNpZGViYXItcGFuZS10b29sYmFyIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLnN0eWxlcy1zaWRlYmFyLXBhbmUtZmlsdGVyLWJveCB7XG4gICAgZmxleDogYXV0bztcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4uc3R5bGVzLXNpZGViYXItcGFuZS1maWx0ZXItYm94ID4gaW5wdXQge1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgbWFyZ2luOiAzcHg7XG59XG5cbi5zdHlsZXMtc2lkZWJhci1wYW5lLWZpbHRlci1ib3ggPiBpbnB1dDpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZm9jdXMtcmluZy1pbmFjdGl2ZS1zaGFkb3cpO1xufVxuXG4uc3R5bGVzLXNpZGViYXItcGFuZS1maWx0ZXItYm94ID4gaW5wdXQ6Zm9jdXMsXG4uc3R5bGVzLXNpZGViYXItcGFuZS1maWx0ZXItYm94ID4gaW5wdXQ6bm90KDpwbGFjZWhvbGRlci1zaG93bikge1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWZvY3VzLXJpbmctYWN0aXZlLXNoYWRvdyk7XG59XG5cbi5zdHlsZXMtc2VjdGlvbi5zdHlsZXMtcGFuZWwtaG92ZXJlZDpub3QoLnJlYWQtb25seSkgc3Bhbi5zaW1wbGUtc2VsZWN0b3I6aG92ZXIsXG4uc3R5bGVzLXNlY3Rpb24uc3R5bGVzLXBhbmVsLWhvdmVyZWQ6bm90KC5yZWFkLW9ubHkpIC5tZWRpYS10ZXh0IDpob3ZlcntcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5zaWRlYmFyLXNlcGFyYXRvciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgcGFkZGluZzogMCA1cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xufVxuXG4uc2lkZWJhci1zZXBhcmF0b3IgPiBzcGFuLm1vbm9zcGFjZSB7XG4gICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMjU1LCAyNTUpO1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvcik7XG59XG5cbi5zaWRlYmFyLXBhbmUtc2VjdGlvbi10b29sYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XG4gICAgei1pbmRleDogMDtcbn1cblxuLnN0eWxlcy1zZWN0aW9uW2RhdGEta2V5Ym9hcmQtZm9jdXM9XCJ0cnVlXCJdOmZvY3VzIC5zaWRlYmFyLXBhbmUtc2VjdGlvbi10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDIxNCwgNjclLCA5NSUsIDAuOSk7XG59XG5cbi5zdHlsZXMtcGFuZTpub3QoLmlzLWVkaXRpbmctc3R5bGUpIC5zdHlsZXMtc2VjdGlvbi5tYXRjaGVkLXN0eWxlczpub3QoLnJlYWQtb25seSk6aG92ZXIgLnNpZGViYXItcGFuZS1zZWN0aW9uLXRvb2xiYXIge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi5zdHlsZXMtc2hvdy1hbGwge1xuICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWF4LXdpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlO1xufVxuXG4vKiMgc291cmNlVVJMPWVsZW1lbnRzL3N0eWxlc1NpZGViYXJQYW5lLmNzcyAqLyI7RXZlbnRMaXN0ZW5lcnMuRXZlbnRMaXN0ZW5lcnNSZXN1bHQ7RXZlbnRMaXN0ZW5lcnMuRXZlbnRMaXN0ZW5lcnNWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihjaGFuZ2VDYWxsYmFjayl7c3VwZXIoKTt0aGlzLl9jaGFuZ2VDYWxsYmFjaz1jaGFuZ2VDYWxsYmFjazt0aGlzLl90cmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMuX3RyZWVPdXRsaW5lLmhpZGVPdmVyZmxvdygpO3RoaXMuX3RyZWVPdXRsaW5lLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ29iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MnKTt0aGlzLl90cmVlT3V0bGluZS5yZWdpc3RlclJlcXVpcmVkQ1NTKCdldmVudF9saXN0ZW5lcnMvZXZlbnRMaXN0ZW5lcnNWaWV3LmNzcycpO3RoaXMuX3RyZWVPdXRsaW5lLnNldENvbXBhcmF0b3IoRXZlbnRMaXN0ZW5lcnMuRXZlbnRMaXN0ZW5lcnNUcmVlRWxlbWVudC5jb21wYXJhdG9yKTt0aGlzLl90cmVlT3V0bGluZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vbm9zcGFjZScpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90cmVlT3V0bGluZS5lbGVtZW50KTt0aGlzLl9lbXB0eUhvbGRlcj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdncmF5LWluZm8tbWVzc2FnZScpO3RoaXMuX2VtcHR5SG9sZGVyLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gZXZlbnQgbGlzdGVuZXJzJyk7dGhpcy5fbGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcigpO3RoaXMuX3RyZWVJdGVtTWFwPW5ldyBNYXAoKTt9CmFzeW5jIGFkZE9iamVjdHMob2JqZWN0cyl7dGhpcy5yZXNldCgpO2F3YWl0IFByb21pc2UuYWxsKG9iamVjdHMubWFwKG9iaj0+b2JqP3RoaXMuX2FkZE9iamVjdChvYmopOlByb21pc2UucmVzb2x2ZSgpKSk7dGhpcy5hZGRFbXB0eUhvbGRlcklmTmVlZGVkKCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnNBcnJpdmVkRm9yVGVzdCgpO30KX2FkZE9iamVjdChvYmplY3Qpe2xldCBldmVudExpc3RlbmVycztsZXQgZnJhbWV3b3JrRXZlbnRMaXN0ZW5lcnNPYmplY3Q9bnVsbDtjb25zdCBwcm9taXNlcz1bXTtjb25zdCBkb21EZWJ1Z2dlck1vZGVsPW9iamVjdC5ydW50aW1lTW9kZWwoKS50YXJnZXQoKS5tb2RlbChTREsuRE9NRGVidWdnZXJNb2RlbCk7aWYoZG9tRGVidWdnZXJNb2RlbCkKcHJvbWlzZXMucHVzaChkb21EZWJ1Z2dlck1vZGVsLmV2ZW50TGlzdGVuZXJzKG9iamVjdCkudGhlbihzdG9yZUV2ZW50TGlzdGVuZXJzKSk7cHJvbWlzZXMucHVzaChFdmVudExpc3RlbmVycy5mcmFtZXdvcmtFdmVudExpc3RlbmVycyhvYmplY3QpLnRoZW4oc3RvcmVGcmFtZXdvcmtFdmVudExpc3RlbmVyc09iamVjdCkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihtYXJrSW50ZXJuYWxFdmVudExpc3RlbmVycykudGhlbihhZGRFdmVudExpc3RlbmVycy5iaW5kKHRoaXMpKTtmdW5jdGlvbiBzdG9yZUV2ZW50TGlzdGVuZXJzKHJlc3VsdCl7ZXZlbnRMaXN0ZW5lcnM9cmVzdWx0O30KZnVuY3Rpb24gc3RvcmVGcmFtZXdvcmtFdmVudExpc3RlbmVyc09iamVjdChyZXN1bHQpe2ZyYW1ld29ya0V2ZW50TGlzdGVuZXJzT2JqZWN0PXJlc3VsdDt9CmZ1bmN0aW9uIG1hcmtJbnRlcm5hbEV2ZW50TGlzdGVuZXJzKCl7aWYoIWZyYW1ld29ya0V2ZW50TGlzdGVuZXJzT2JqZWN0LmludGVybmFsSGFuZGxlcnMpCnJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtyZXR1cm4gZnJhbWV3b3JrRXZlbnRMaXN0ZW5lcnNPYmplY3QuaW50ZXJuYWxIYW5kbGVycy5vYmplY3QoKS5jYWxsRnVuY3Rpb25KU09OUHJvbWlzZShpc0ludGVybmFsRXZlbnRMaXN0ZW5lcixldmVudExpc3RlbmVycy5tYXAoaGFuZGxlckFyZ3VtZW50KSkudGhlbihzZXRJc0ludGVybmFsKTtmdW5jdGlvbiBoYW5kbGVyQXJndW1lbnQobGlzdGVuZXIpe3JldHVybiBTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KGxpc3RlbmVyLmhhbmRsZXIoKSk7fQpmdW5jdGlvbiBpc0ludGVybmFsRXZlbnRMaXN0ZW5lcigpe2NvbnN0IGlzSW50ZXJuYWw9W107Y29uc3QgaW50ZXJuYWxIYW5kbGVyc1NldD1uZXcgU2V0KHRoaXMpO2Zvcihjb25zdCBoYW5kbGVyIG9mIGFyZ3VtZW50cykKaXNJbnRlcm5hbC5wdXNoKGludGVybmFsSGFuZGxlcnNTZXQuaGFzKGhhbmRsZXIpKTtyZXR1cm4gaXNJbnRlcm5hbDt9CmZ1bmN0aW9uIHNldElzSW50ZXJuYWwoaXNJbnRlcm5hbCl7Zm9yKGxldCBpPTA7aTxldmVudExpc3RlbmVycy5sZW5ndGg7KytpKXtpZihpc0ludGVybmFsW2ldKQpldmVudExpc3RlbmVyc1tpXS5tYXJrQXNGcmFtZXdvcmsoKTt9fX0KZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnMoKXt0aGlzLl9hZGRPYmplY3RFdmVudExpc3RlbmVycyhvYmplY3QsZXZlbnRMaXN0ZW5lcnMpO3RoaXMuX2FkZE9iamVjdEV2ZW50TGlzdGVuZXJzKG9iamVjdCxmcmFtZXdvcmtFdmVudExpc3RlbmVyc09iamVjdC5ldmVudExpc3RlbmVycyk7fX0KX2FkZE9iamVjdEV2ZW50TGlzdGVuZXJzKG9iamVjdCxldmVudExpc3RlbmVycyl7aWYoIWV2ZW50TGlzdGVuZXJzKQpyZXR1cm47Zm9yKGNvbnN0IGV2ZW50TGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnMpe2NvbnN0IHRyZWVJdGVtPXRoaXMuX2dldE9yQ3JlYXRlVHJlZUVsZW1lbnRGb3JUeXBlKGV2ZW50TGlzdGVuZXIudHlwZSgpKTt0cmVlSXRlbS5hZGRPYmplY3RFdmVudExpc3RlbmVyKGV2ZW50TGlzdGVuZXIsb2JqZWN0KTt9fQpzaG93RnJhbWV3b3JrTGlzdGVuZXJzKHNob3dGcmFtZXdvcmssc2hvd1Bhc3NpdmUsc2hvd0Jsb2NraW5nKXtjb25zdCBldmVudFR5cGVzPXRoaXMuX3RyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCkuY2hpbGRyZW4oKTtmb3IoY29uc3QgZXZlbnRUeXBlIG9mIGV2ZW50VHlwZXMpe2xldCBoaWRkZW5FdmVudFR5cGU9dHJ1ZTtmb3IoY29uc3QgbGlzdGVuZXJFbGVtZW50IG9mIGV2ZW50VHlwZS5jaGlsZHJlbigpKXtjb25zdCBsaXN0ZW5lck9yaWdpbj1saXN0ZW5lckVsZW1lbnQuZXZlbnRMaXN0ZW5lcigpLm9yaWdpbigpO2xldCBoaWRkZW49ZmFsc2U7aWYobGlzdGVuZXJPcmlnaW49PT1TREsuRXZlbnRMaXN0ZW5lci5PcmlnaW4uRnJhbWV3b3JrVXNlciYmIXNob3dGcmFtZXdvcmspCmhpZGRlbj10cnVlO2lmKGxpc3RlbmVyT3JpZ2luPT09U0RLLkV2ZW50TGlzdGVuZXIuT3JpZ2luLkZyYW1ld29yayYmc2hvd0ZyYW1ld29yaykKaGlkZGVuPXRydWU7aWYoIXNob3dQYXNzaXZlJiZsaXN0ZW5lckVsZW1lbnQuZXZlbnRMaXN0ZW5lcigpLnBhc3NpdmUoKSkKaGlkZGVuPXRydWU7aWYoIXNob3dCbG9ja2luZyYmIWxpc3RlbmVyRWxlbWVudC5ldmVudExpc3RlbmVyKCkucGFzc2l2ZSgpKQpoaWRkZW49dHJ1ZTtsaXN0ZW5lckVsZW1lbnQuaGlkZGVuPWhpZGRlbjtoaWRkZW5FdmVudFR5cGU9aGlkZGVuRXZlbnRUeXBlJiZoaWRkZW47fQpldmVudFR5cGUuaGlkZGVuPWhpZGRlbkV2ZW50VHlwZTt9fQpfZ2V0T3JDcmVhdGVUcmVlRWxlbWVudEZvclR5cGUodHlwZSl7bGV0IHRyZWVJdGVtPXRoaXMuX3RyZWVJdGVtTWFwLmdldCh0eXBlKTtpZighdHJlZUl0ZW0pe3RyZWVJdGVtPW5ldyBFdmVudExpc3RlbmVycy5FdmVudExpc3RlbmVyc1RyZWVFbGVtZW50KHR5cGUsdGhpcy5fbGlua2lmaWVyLHRoaXMuX2NoYW5nZUNhbGxiYWNrKTt0aGlzLl90cmVlSXRlbU1hcC5zZXQodHlwZSx0cmVlSXRlbSk7dHJlZUl0ZW0uaGlkZGVuPXRydWU7dGhpcy5fdHJlZU91dGxpbmUuYXBwZW5kQ2hpbGQodHJlZUl0ZW0pO30KdGhpcy5fZW1wdHlIb2xkZXIucmVtb3ZlKCk7cmV0dXJuIHRyZWVJdGVtO30KYWRkRW1wdHlIb2xkZXJJZk5lZWRlZCgpe2xldCBhbGxIaWRkZW49dHJ1ZTtmb3IoY29uc3QgZXZlbnRUeXBlIG9mIHRoaXMuX3RyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCkuY2hpbGRyZW4oKSl7ZXZlbnRUeXBlLmhpZGRlbj0hZXZlbnRUeXBlLmZpcnN0Q2hpbGQoKTthbGxIaWRkZW49YWxsSGlkZGVuJiZldmVudFR5cGUuaGlkZGVuO30KaWYoYWxsSGlkZGVuJiYhdGhpcy5fZW1wdHlIb2xkZXIucGFyZW50Tm9kZSkKdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2VtcHR5SG9sZGVyKTt9CnJlc2V0KCl7Y29uc3QgZXZlbnRUeXBlcz10aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpLmNoaWxkcmVuKCk7Zm9yKGNvbnN0IGV2ZW50VHlwZSBvZiBldmVudFR5cGVzKQpldmVudFR5cGUucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9saW5raWZpZXIucmVzZXQoKTt9Cl9ldmVudExpc3RlbmVyc0Fycml2ZWRGb3JUZXN0KCl7fX07RXZlbnRMaXN0ZW5lcnMuRXZlbnRMaXN0ZW5lcnNUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHR5cGUsbGlua2lmaWVyLGNoYW5nZUNhbGxiYWNrKXtzdXBlcih0eXBlKTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fbGlua2lmaWVyPWxpbmtpZmllcjt0aGlzLl9jaGFuZ2VDYWxsYmFjaz1jaGFuZ2VDYWxsYmFjazt9CnN0YXRpYyBjb21wYXJhdG9yKGVsZW1lbnQxLGVsZW1lbnQyKXtpZihlbGVtZW50MS50aXRsZT09PWVsZW1lbnQyLnRpdGxlKQpyZXR1cm4gMDtyZXR1cm4gZWxlbWVudDEudGl0bGU+ZWxlbWVudDIudGl0bGU/MTotMTt9CmFkZE9iamVjdEV2ZW50TGlzdGVuZXIoZXZlbnRMaXN0ZW5lcixvYmplY3Qpe2NvbnN0IHRyZWVFbGVtZW50PW5ldyBFdmVudExpc3RlbmVycy5PYmplY3RFdmVudExpc3RlbmVyQmFyKGV2ZW50TGlzdGVuZXIsb2JqZWN0LHRoaXMuX2xpbmtpZmllcix0aGlzLl9jaGFuZ2VDYWxsYmFjayk7dGhpcy5hcHBlbmRDaGlsZCgodHJlZUVsZW1lbnQpKTt9fTtFdmVudExpc3RlbmVycy5PYmplY3RFdmVudExpc3RlbmVyQmFyPWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3IoZXZlbnRMaXN0ZW5lcixvYmplY3QsbGlua2lmaWVyLGNoYW5nZUNhbGxiYWNrKXtzdXBlcignJyx0cnVlKTt0aGlzLl9ldmVudExpc3RlbmVyPWV2ZW50TGlzdGVuZXI7dGhpcy5lZGl0YWJsZT1mYWxzZTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fc2V0VGl0bGUob2JqZWN0LGxpbmtpZmllcik7dGhpcy5fY2hhbmdlQ2FsbGJhY2s9Y2hhbmdlQ2FsbGJhY2s7fQpvbnBvcHVsYXRlKCl7Y29uc3QgcHJvcGVydGllcz1bXTtjb25zdCBldmVudExpc3RlbmVyPXRoaXMuX2V2ZW50TGlzdGVuZXI7Y29uc3QgcnVudGltZU1vZGVsPWV2ZW50TGlzdGVuZXIuZG9tRGVidWdnZXJNb2RlbCgpLnJ1bnRpbWVNb2RlbCgpO3Byb3BlcnRpZXMucHVzaChydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlUHJvcGVydHlGcm9tUHJpbWl0aXZlVmFsdWUoJ3VzZUNhcHR1cmUnLGV2ZW50TGlzdGVuZXIudXNlQ2FwdHVyZSgpKSk7cHJvcGVydGllcy5wdXNoKHJ1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVQcm9wZXJ0eUZyb21QcmltaXRpdmVWYWx1ZSgncGFzc2l2ZScsZXZlbnRMaXN0ZW5lci5wYXNzaXZlKCkpKTtwcm9wZXJ0aWVzLnB1c2gocnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZVByb3BlcnR5RnJvbVByaW1pdGl2ZVZhbHVlKCdvbmNlJyxldmVudExpc3RlbmVyLm9uY2UoKSkpO2lmKHR5cGVvZiBldmVudExpc3RlbmVyLmhhbmRsZXIoKSE9PSd1bmRlZmluZWQnKQpwcm9wZXJ0aWVzLnB1c2gobmV3IFNESy5SZW1vdGVPYmplY3RQcm9wZXJ0eSgnaGFuZGxlcicsZXZlbnRMaXN0ZW5lci5oYW5kbGVyKCkpKTtPYmplY3RVSS5PYmplY3RQcm9wZXJ0eVRyZWVFbGVtZW50LnBvcHVsYXRlV2l0aFByb3BlcnRpZXModGhpcyxwcm9wZXJ0aWVzLFtdLHRydWUsbnVsbCk7fQpfc2V0VGl0bGUob2JqZWN0LGxpbmtpZmllcil7Y29uc3QgdGl0bGU9dGhpcy5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtjb25zdCBzdWJ0aXRsZT10aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2V2ZW50LWxpc3RlbmVyLXRyZWUtc3VidGl0bGUnKTtzdWJ0aXRsZS5hcHBlbmRDaGlsZChsaW5raWZpZXIubGlua2lmeVJhd0xvY2F0aW9uKHRoaXMuX2V2ZW50TGlzdGVuZXIubG9jYXRpb24oKSx0aGlzLl9ldmVudExpc3RlbmVyLnNvdXJjZVVSTCgpKSk7dGl0bGUuYXBwZW5kQ2hpbGQoT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uY3JlYXRlVmFsdWVFbGVtZW50KG9iamVjdCxmYWxzZSxmYWxzZSkpO2lmKHRoaXMuX2V2ZW50TGlzdGVuZXIuY2FuUmVtb3ZlKCkpe2NvbnN0IGRlbGV0ZUJ1dHRvbj10aXRsZS5jcmVhdGVDaGlsZCgnc3BhbicsJ2V2ZW50LWxpc3RlbmVyLWJ1dHRvbicpO2RlbGV0ZUJ1dHRvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1JlbW92ZScpO2RlbGV0ZUJ1dHRvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0RlbGV0ZSBldmVudCBsaXN0ZW5lcicpO2RlbGV0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycscmVtb3ZlTGlzdGVuZXIuYmluZCh0aGlzKSxmYWxzZSk7dGl0bGUuYXBwZW5kQ2hpbGQoZGVsZXRlQnV0dG9uKTt9CmlmKHRoaXMuX2V2ZW50TGlzdGVuZXIuaXNTY3JvbGxCbG9ja2luZ1R5cGUoKSYmdGhpcy5fZXZlbnRMaXN0ZW5lci5jYW5Ub2dnbGVQYXNzaXZlKCkpe2NvbnN0IHBhc3NpdmVCdXR0b249dGl0bGUuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdldmVudC1saXN0ZW5lci1idXR0b24nKTtwYXNzaXZlQnV0dG9uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVG9nZ2xlIFBhc3NpdmUnKTtwYXNzaXZlQnV0dG9uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnVG9nZ2xlIHdoZXRoZXIgZXZlbnQgbGlzdGVuZXIgaXMgcGFzc2l2ZSBvciBibG9ja2luZycpO3Bhc3NpdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRvZ2dsZVBhc3NpdmVMaXN0ZW5lci5iaW5kKHRoaXMpLGZhbHNlKTt0aXRsZS5hcHBlbmRDaGlsZChwYXNzaXZlQnV0dG9uKTt9CmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50KXtldmVudC5jb25zdW1lKCk7dGhpcy5fcmVtb3ZlTGlzdGVuZXJCYXIoKTt0aGlzLl9ldmVudExpc3RlbmVyLnJlbW92ZSgpO30KZnVuY3Rpb24gdG9nZ2xlUGFzc2l2ZUxpc3RlbmVyKGV2ZW50KXtldmVudC5jb25zdW1lKCk7dGhpcy5fZXZlbnRMaXN0ZW5lci50b2dnbGVQYXNzaXZlKCkudGhlbih0aGlzLl9jaGFuZ2VDYWxsYmFjaygpKTt9fQpfcmVtb3ZlTGlzdGVuZXJCYXIoKXtjb25zdCBwYXJlbnQ9dGhpcy5wYXJlbnQ7cGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO2lmKCFwYXJlbnQuY2hpbGRDb3VudCgpKQpwYXJlbnQuY29sbGFwc2UoKTtsZXQgYWxsSGlkZGVuPXRydWU7Zm9yKGxldCBpPTA7aTxwYXJlbnQuY2hpbGRDb3VudCgpOysraSl7aWYoIXBhcmVudC5jaGlsZEF0KGkpLmhpZGRlbikKYWxsSGlkZGVuPWZhbHNlO30KcGFyZW50LmhpZGRlbj1hbGxIaWRkZW47fQpldmVudExpc3RlbmVyKCl7cmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXI7fX07O0V2ZW50TGlzdGVuZXJzLkZyYW1ld29ya0V2ZW50TGlzdGVuZXJzT2JqZWN0O0V2ZW50TGlzdGVuZXJzLkV2ZW50TGlzdGVuZXJPYmplY3RJbkluc3BlY3RlZFBhZ2U7RXZlbnRMaXN0ZW5lcnMuZnJhbWV3b3JrRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24ob2JqZWN0KXtjb25zdCBkb21EZWJ1Z2dlck1vZGVsPW9iamVjdC5ydW50aW1lTW9kZWwoKS50YXJnZXQoKS5tb2RlbChTREsuRE9NRGVidWdnZXJNb2RlbCk7aWYoIWRvbURlYnVnZ2VyTW9kZWwpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKHtldmVudExpc3RlbmVyczpbXSxpbnRlcm5hbEhhbmRsZXJzOm51bGx9KSk7fQpjb25zdCBsaXN0ZW5lcnNSZXN1bHQ9KHtldmVudExpc3RlbmVyczpbXX0pO3JldHVybiBvYmplY3QuY2FsbEZ1bmN0aW9uUHJvbWlzZShmcmFtZXdvcmtFdmVudExpc3RlbmVycyx1bmRlZmluZWQpLnRoZW4oYXNzZXJ0Q2FsbEZ1bmN0aW9uUmVzdWx0KS50aGVuKGdldE93blByb3BlcnRpZXMpLnRoZW4oY3JlYXRlRXZlbnRMaXN0ZW5lcnMpLnRoZW4ocmV0dXJuUmVzdWx0KS5jYXRjaEV4Y2VwdGlvbihsaXN0ZW5lcnNSZXN1bHQpO2Z1bmN0aW9uIGdldE93blByb3BlcnRpZXMob2JqZWN0KXtyZXR1cm4gb2JqZWN0LmdldE93blByb3BlcnRpZXNQcm9taXNlKGZhbHNlKTt9CmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJzKHJlc3VsdCl7aWYoIXJlc3VsdC5wcm9wZXJ0aWVzKQp0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBwcm9wZXJ0aWVzIGlzIGVtcHR5Jyk7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHJlc3VsdC5wcm9wZXJ0aWVzKXtpZihwcm9wZXJ0eS5uYW1lPT09J2V2ZW50TGlzdGVuZXJzJyYmcHJvcGVydHkudmFsdWUpCnByb21pc2VzLnB1c2goY29udmVydFRvRXZlbnRMaXN0ZW5lcnMocHJvcGVydHkudmFsdWUpLnRoZW4oc3RvcmVFdmVudExpc3RlbmVycykpO2lmKHByb3BlcnR5Lm5hbWU9PT0naW50ZXJuYWxIYW5kbGVycycmJnByb3BlcnR5LnZhbHVlKQpwcm9taXNlcy5wdXNoKGNvbnZlcnRUb0ludGVybmFsSGFuZGxlcnMocHJvcGVydHkudmFsdWUpLnRoZW4oc3RvcmVJbnRlcm5hbEhhbmRsZXJzKSk7aWYocHJvcGVydHkubmFtZT09PSdlcnJvclN0cmluZycmJnByb3BlcnR5LnZhbHVlKQpwcmludEVycm9yU3RyaW5nKHByb3BlcnR5LnZhbHVlKTt9CnJldHVybihQcm9taXNlLmFsbChwcm9taXNlcykpO30KZnVuY3Rpb24gY29udmVydFRvRXZlbnRMaXN0ZW5lcnMocGFnZUV2ZW50TGlzdGVuZXJzT2JqZWN0KXtyZXR1cm4gU0RLLlJlbW90ZUFycmF5Lm9iamVjdEFzQXJyYXkocGFnZUV2ZW50TGlzdGVuZXJzT2JqZWN0KS5tYXAodG9FdmVudExpc3RlbmVyKS50aGVuKGZpbHRlck91dEVtcHR5T2JqZWN0cyk7ZnVuY3Rpb24gdG9FdmVudExpc3RlbmVyKGxpc3RlbmVyT2JqZWN0KXtsZXQgdHlwZTtsZXQgdXNlQ2FwdHVyZTtsZXQgcGFzc2l2ZTtsZXQgb25jZTtsZXQgaGFuZGxlcj1udWxsO2xldCBvcmlnaW5hbEhhbmRsZXI9bnVsbDtsZXQgbG9jYXRpb249bnVsbDtsZXQgcmVtb3ZlRnVuY3Rpb25PYmplY3Q9bnVsbDtjb25zdCBwcm9taXNlcz1bXTtwcm9taXNlcy5wdXNoKGxpc3RlbmVyT2JqZWN0LmNhbGxGdW5jdGlvbkpTT05Qcm9taXNlKHRydW5jYXRlUGFnZUV2ZW50TGlzdGVuZXIsdW5kZWZpbmVkKS50aGVuKHN0b3JlVHJ1bmNhdGVkTGlzdGVuZXIpKTtmdW5jdGlvbiB0cnVuY2F0ZVBhZ2VFdmVudExpc3RlbmVyKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHVzZUNhcHR1cmU6dGhpcy51c2VDYXB0dXJlLHBhc3NpdmU6dGhpcy5wYXNzaXZlLG9uY2U6dGhpcy5vbmNlfTt9CmZ1bmN0aW9uIHN0b3JlVHJ1bmNhdGVkTGlzdGVuZXIodHJ1bmNhdGVkTGlzdGVuZXIpe3R5cGU9dHJ1bmNhdGVkTGlzdGVuZXIudHlwZTt1c2VDYXB0dXJlPXRydW5jYXRlZExpc3RlbmVyLnVzZUNhcHR1cmU7cGFzc2l2ZT10cnVuY2F0ZWRMaXN0ZW5lci5wYXNzaXZlO29uY2U9dHJ1bmNhdGVkTGlzdGVuZXIub25jZTt9CnByb21pc2VzLnB1c2gobGlzdGVuZXJPYmplY3QuY2FsbEZ1bmN0aW9uUHJvbWlzZShoYW5kbGVyRnVuY3Rpb24pLnRoZW4oYXNzZXJ0Q2FsbEZ1bmN0aW9uUmVzdWx0KS50aGVuKHN0b3JlT3JpZ2luYWxIYW5kbGVyKS50aGVuKHRvVGFyZ2V0RnVuY3Rpb24pLnRoZW4oc3RvcmVGdW5jdGlvbldpdGhEZXRhaWxzKSk7ZnVuY3Rpb24gaGFuZGxlckZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlcjt9CmZ1bmN0aW9uIHN0b3JlT3JpZ2luYWxIYW5kbGVyKGZ1bmN0aW9uT2JqZWN0KXtvcmlnaW5hbEhhbmRsZXI9ZnVuY3Rpb25PYmplY3Q7cmV0dXJuIG9yaWdpbmFsSGFuZGxlcjt9CmZ1bmN0aW9uIHN0b3JlRnVuY3Rpb25XaXRoRGV0YWlscyhmdW5jdGlvbk9iamVjdCl7aGFuZGxlcj1mdW5jdGlvbk9iamVjdDtyZXR1cm4oZnVuY3Rpb25PYmplY3QuZGVidWdnZXJNb2RlbCgpLmZ1bmN0aW9uRGV0YWlsc1Byb21pc2UoZnVuY3Rpb25PYmplY3QpLnRoZW4oc3RvcmVGdW5jdGlvbkRldGFpbHMpKTt9CmZ1bmN0aW9uIHN0b3JlRnVuY3Rpb25EZXRhaWxzKGZ1bmN0aW9uRGV0YWlscyl7bG9jYXRpb249ZnVuY3Rpb25EZXRhaWxzP2Z1bmN0aW9uRGV0YWlscy5sb2NhdGlvbjpudWxsO30KcHJvbWlzZXMucHVzaChsaXN0ZW5lck9iamVjdC5jYWxsRnVuY3Rpb25Qcm9taXNlKGdldFJlbW92ZUZ1bmN0aW9uKS50aGVuKGFzc2VydENhbGxGdW5jdGlvblJlc3VsdCkudGhlbihzdG9yZVJlbW92ZUZ1bmN0aW9uKSk7ZnVuY3Rpb24gZ2V0UmVtb3ZlRnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmU7fQpmdW5jdGlvbiBzdG9yZVJlbW92ZUZ1bmN0aW9uKGZ1bmN0aW9uT2JqZWN0KXtpZihmdW5jdGlvbk9iamVjdC50eXBlIT09J2Z1bmN0aW9uJykKcmV0dXJuO3JlbW92ZUZ1bmN0aW9uT2JqZWN0PWZ1bmN0aW9uT2JqZWN0O30KcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGNyZWF0ZUV2ZW50TGlzdGVuZXIpLmNhdGNoRXhjZXB0aW9uKChudWxsKSk7ZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcigpe2lmKCFsb2NhdGlvbikKdGhyb3cgbmV3IEVycm9yKCdFbXB0eSBldmVudCBsaXN0ZW5lclwncyBsb2NhdGlvbicpO3JldHVybiBuZXcgU0RLLkV2ZW50TGlzdGVuZXIoKGRvbURlYnVnZ2VyTW9kZWwpLG9iamVjdCx0eXBlLHVzZUNhcHR1cmUscGFzc2l2ZSxvbmNlLGhhbmRsZXIsb3JpZ2luYWxIYW5kbGVyLGxvY2F0aW9uLHJlbW92ZUZ1bmN0aW9uT2JqZWN0LFNESy5FdmVudExpc3RlbmVyLk9yaWdpbi5GcmFtZXdvcmtVc2VyKTt9fX0KZnVuY3Rpb24gY29udmVydFRvSW50ZXJuYWxIYW5kbGVycyhwYWdlSW50ZXJuYWxIYW5kbGVyc09iamVjdCl7cmV0dXJuIFNESy5SZW1vdGVBcnJheS5vYmplY3RBc0FycmF5KHBhZ2VJbnRlcm5hbEhhbmRsZXJzT2JqZWN0KS5tYXAodG9UYXJnZXRGdW5jdGlvbikudGhlbihTREsuUmVtb3RlQXJyYXkuY3JlYXRlRnJvbVJlbW90ZU9iamVjdHMpO30KZnVuY3Rpb24gdG9UYXJnZXRGdW5jdGlvbihmdW5jdGlvbk9iamVjdCl7cmV0dXJuIFNESy5SZW1vdGVGdW5jdGlvbi5vYmplY3RBc0Z1bmN0aW9uKGZ1bmN0aW9uT2JqZWN0KS50YXJnZXRGdW5jdGlvbigpO30KZnVuY3Rpb24gc3RvcmVFdmVudExpc3RlbmVycyhldmVudExpc3RlbmVycyl7bGlzdGVuZXJzUmVzdWx0LmV2ZW50TGlzdGVuZXJzPWV2ZW50TGlzdGVuZXJzO30KZnVuY3Rpb24gc3RvcmVJbnRlcm5hbEhhbmRsZXJzKGludGVybmFsSGFuZGxlcnMpe2xpc3RlbmVyc1Jlc3VsdC5pbnRlcm5hbEhhbmRsZXJzPWludGVybmFsSGFuZGxlcnM7fQpmdW5jdGlvbiBwcmludEVycm9yU3RyaW5nKGVycm9yU3RyaW5nKXtDb21tb24uY29uc29sZS5lcnJvcihTdHJpbmcoZXJyb3JTdHJpbmcudmFsdWUpKTt9CmZ1bmN0aW9uIHJldHVyblJlc3VsdCgpe3JldHVybiBsaXN0ZW5lcnNSZXN1bHQ7fQpmdW5jdGlvbiBhc3NlcnRDYWxsRnVuY3Rpb25SZXN1bHQocmVzdWx0KXtpZihyZXN1bHQud2FzVGhyb3dufHwhcmVzdWx0Lm9iamVjdCkKdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb24gaW4gY2FsbEZ1bmN0aW9uIG9yIGVtcHR5IHJlc3VsdCcpO3JldHVybiByZXN1bHQub2JqZWN0O30KZnVuY3Rpb24gZmlsdGVyT3V0RW1wdHlPYmplY3RzKG9iamVjdHMpe3JldHVybiBvYmplY3RzLmZpbHRlcihmaWx0ZXJPdXRFbXB0eSk7ZnVuY3Rpb24gZmlsdGVyT3V0RW1wdHkob2JqZWN0KXtyZXR1cm4hIW9iamVjdDt9fQpmdW5jdGlvbiBmcmFtZXdvcmtFdmVudExpc3RlbmVycygpe2NvbnN0IGVycm9yTGluZXM9W107bGV0IGV2ZW50TGlzdGVuZXJzPVtdO2xldCBpbnRlcm5hbEhhbmRsZXJzPVtdO2xldCBmZXRjaGVycz1balF1ZXJ5RmV0Y2hlcl07dHJ5e2lmKHNlbGYuZGV2dG9vbHNGcmFtZXdvcmtFdmVudExpc3RlbmVycyYmaXNBcnJheUxpa2Uoc2VsZi5kZXZ0b29sc0ZyYW1ld29ya0V2ZW50TGlzdGVuZXJzKSkKZmV0Y2hlcnM9ZmV0Y2hlcnMuY29uY2F0KHNlbGYuZGV2dG9vbHNGcmFtZXdvcmtFdmVudExpc3RlbmVycyk7fWNhdGNoKGUpe2Vycm9yTGluZXMucHVzaCgnZGV2dG9vbHNGcmFtZXdvcmtFdmVudExpc3RlbmVycyBjYWxsIHByb2R1Y2VkIGVycm9yOiAnK3RvU3RyaW5nKGUpKTt9CmZvcihsZXQgaT0wO2k8ZmV0Y2hlcnMubGVuZ3RoOysraSl7dHJ5e2NvbnN0IGZldGNoZXJSZXN1bHQ9ZmV0Y2hlcnNbaV0odGhpcyk7aWYoZmV0Y2hlclJlc3VsdC5ldmVudExpc3RlbmVycyYmaXNBcnJheUxpa2UoZmV0Y2hlclJlc3VsdC5ldmVudExpc3RlbmVycykpe2V2ZW50TGlzdGVuZXJzPWV2ZW50TGlzdGVuZXJzLmNvbmNhdChmZXRjaGVyUmVzdWx0LmV2ZW50TGlzdGVuZXJzLm1hcChjaGVja0V2ZW50TGlzdGVuZXIpLmZpbHRlcihub25FbXB0eU9iamVjdCkpO30KaWYoZmV0Y2hlclJlc3VsdC5pbnRlcm5hbEhhbmRsZXJzJiZpc0FycmF5TGlrZShmZXRjaGVyUmVzdWx0LmludGVybmFsSGFuZGxlcnMpKXtpbnRlcm5hbEhhbmRsZXJzPWludGVybmFsSGFuZGxlcnMuY29uY2F0KGZldGNoZXJSZXN1bHQuaW50ZXJuYWxIYW5kbGVycy5tYXAoY2hlY2tJbnRlcm5hbEhhbmRsZXIpLmZpbHRlcihub25FbXB0eU9iamVjdCkpO319Y2F0Y2goZSl7ZXJyb3JMaW5lcy5wdXNoKCdmZXRjaGVyIGNhbGwgcHJvZHVjZWQgZXJyb3I6ICcrdG9TdHJpbmcoZSkpO319CmNvbnN0IHJlc3VsdD17ZXZlbnRMaXN0ZW5lcnM6ZXZlbnRMaXN0ZW5lcnN9O2lmKGludGVybmFsSGFuZGxlcnMubGVuZ3RoKQpyZXN1bHQuaW50ZXJuYWxIYW5kbGVycz1pbnRlcm5hbEhhbmRsZXJzO2lmKGVycm9yTGluZXMubGVuZ3RoKXtsZXQgZXJyb3JTdHJpbmc9J0ZyYW1ld29yayBFdmVudCBMaXN0ZW5lcnMgQVBJIEVycm9yczpcblx0JytlcnJvckxpbmVzLmpvaW4oJ1xuXHQnKTtlcnJvclN0cmluZz1lcnJvclN0cmluZy5zdWJzdHIoMCxlcnJvclN0cmluZy5sZW5ndGgtMSk7cmVzdWx0LmVycm9yU3RyaW5nPWVycm9yU3RyaW5nO30KcmV0dXJuIHJlc3VsdDtmdW5jdGlvbiBpc0FycmF5TGlrZShvYmope2lmKCFvYmp8fHR5cGVvZiBvYmohPT0nb2JqZWN0JykKcmV0dXJuIGZhbHNlO3RyeXtpZih0eXBlb2Ygb2JqLnNwbGljZT09PSdmdW5jdGlvbicpe2NvbnN0IGxlbj1vYmoubGVuZ3RoO3JldHVybiB0eXBlb2YgbGVuPT09J251bWJlcicmJihsZW4+Pj4wPT09bGVuJiYobGVuPjB8fDEvbGVuPjApKTt9fWNhdGNoKGUpe30KcmV0dXJuIGZhbHNlO30KZnVuY3Rpb24gY2hlY2tFdmVudExpc3RlbmVyKGV2ZW50TGlzdGVuZXIpe3RyeXtsZXQgZXJyb3JTdHJpbmc9Jyc7aWYoIWV2ZW50TGlzdGVuZXIpCmVycm9yU3RyaW5nKz0nZW1wdHkgZXZlbnQgbGlzdGVuZXIsICc7Y29uc3QgdHlwZT1ldmVudExpc3RlbmVyLnR5cGU7aWYoIXR5cGV8fCh0eXBlb2YgdHlwZSE9PSdzdHJpbmcnKSkKZXJyb3JTdHJpbmcrPSdldmVudCBsaXN0ZW5lclwncyB0eXBlIGlzblwndCBzdHJpbmcgb3IgZW1wdHksICc7Y29uc3QgdXNlQ2FwdHVyZT1ldmVudExpc3RlbmVyLnVzZUNhcHR1cmU7aWYodHlwZW9mIHVzZUNhcHR1cmUhPT0nYm9vbGVhbicpCmVycm9yU3RyaW5nKz0nZXZlbnQgbGlzdGVuZXJcJ3MgdXNlQ2FwdHVyZSBpc25cJ3QgYm9vbGVhbiBvciB1bmRlZmluZWQsICc7Y29uc3QgcGFzc2l2ZT1ldmVudExpc3RlbmVyLnBhc3NpdmU7aWYodHlwZW9mIHBhc3NpdmUhPT0nYm9vbGVhbicpCmVycm9yU3RyaW5nKz0nZXZlbnQgbGlzdGVuZXJcJ3MgcGFzc2l2ZSBpc25cJ3QgYm9vbGVhbiBvciB1bmRlZmluZWQsICc7Y29uc3Qgb25jZT1ldmVudExpc3RlbmVyLm9uY2U7aWYodHlwZW9mIG9uY2UhPT0nYm9vbGVhbicpCmVycm9yU3RyaW5nKz0nZXZlbnQgbGlzdGVuZXJcJ3Mgb25jZSBpc25cJ3QgYm9vbGVhbiBvciB1bmRlZmluZWQsICc7Y29uc3QgaGFuZGxlcj1ldmVudExpc3RlbmVyLmhhbmRsZXI7aWYoIWhhbmRsZXJ8fCh0eXBlb2YgaGFuZGxlciE9PSdmdW5jdGlvbicpKQplcnJvclN0cmluZys9J2V2ZW50IGxpc3RlbmVyXCdzIGhhbmRsZXIgaXNuXCd0IGEgZnVuY3Rpb24gb3IgZW1wdHksICc7Y29uc3QgcmVtb3ZlPWV2ZW50TGlzdGVuZXIucmVtb3ZlO2lmKHJlbW92ZSYmKHR5cGVvZiByZW1vdmUhPT0nZnVuY3Rpb24nKSkKZXJyb3JTdHJpbmcrPSdldmVudCBsaXN0ZW5lclwncyByZW1vdmUgaXNuXCd0IGEgZnVuY3Rpb24sICc7aWYoIWVycm9yU3RyaW5nKXtyZXR1cm57dHlwZTp0eXBlLHVzZUNhcHR1cmU6dXNlQ2FwdHVyZSxwYXNzaXZlOnBhc3NpdmUsb25jZTpvbmNlLGhhbmRsZXI6aGFuZGxlcixyZW1vdmU6cmVtb3ZlfTt9ZWxzZXtlcnJvckxpbmVzLnB1c2goZXJyb3JTdHJpbmcuc3Vic3RyKDAsZXJyb3JTdHJpbmcubGVuZ3RoLTIpKTtyZXR1cm4gbnVsbDt9fWNhdGNoKGUpe2Vycm9yTGluZXMucHVzaCh0b1N0cmluZyhlKSk7cmV0dXJuIG51bGw7fX0KZnVuY3Rpb24gY2hlY2tJbnRlcm5hbEhhbmRsZXIoaGFuZGxlcil7aWYoaGFuZGxlciYmKHR5cGVvZiBoYW5kbGVyPT09J2Z1bmN0aW9uJykpCnJldHVybiBoYW5kbGVyO2Vycm9yTGluZXMucHVzaCgnaW50ZXJuYWwgaGFuZGxlciBpc25cJ3QgYSBmdW5jdGlvbiBvciBlbXB0eScpO3JldHVybiBudWxsO30KZnVuY3Rpb24gdG9TdHJpbmcob2JqKXt0cnl7cmV0dXJuJycrb2JqO31jYXRjaChlKXtyZXR1cm4nPGVycm9yPic7fX0KZnVuY3Rpb24gbm9uRW1wdHlPYmplY3Qob2JqKXtyZXR1cm4hIW9iajt9CmZ1bmN0aW9uIGpRdWVyeUZldGNoZXIobm9kZSl7aWYoIW5vZGV8fCEobm9kZSBpbnN0YW5jZW9mIE5vZGUpKQpyZXR1cm57ZXZlbnRMaXN0ZW5lcnM6W119O2NvbnN0IGpRdWVyeT0od2luZG93WydqUXVlcnknXSk7aWYoIWpRdWVyeXx8IWpRdWVyeS5mbikKcmV0dXJue2V2ZW50TGlzdGVuZXJzOltdfTtjb25zdCBqUXVlcnlGdW5jdGlvbj0oalF1ZXJ5KTtjb25zdCBkYXRhPWpRdWVyeS5fZGF0YXx8alF1ZXJ5LmRhdGE7Y29uc3QgZXZlbnRMaXN0ZW5lcnM9W107Y29uc3QgaW50ZXJuYWxIYW5kbGVycz1bXTtpZih0eXBlb2YgZGF0YT09PSdmdW5jdGlvbicpe2NvbnN0IGV2ZW50cz1kYXRhKG5vZGUsJ2V2ZW50cycpO2Zvcihjb25zdCB0eXBlIGluIGV2ZW50cyl7Zm9yKGNvbnN0IGtleSBpbiBldmVudHNbdHlwZV0pe2NvbnN0IGZyYW1ld29ya0xpc3RlbmVyPWV2ZW50c1t0eXBlXVtrZXldO2lmKHR5cGVvZiBmcmFtZXdvcmtMaXN0ZW5lcj09PSdvYmplY3QnfHx0eXBlb2YgZnJhbWV3b3JrTGlzdGVuZXI9PT0nZnVuY3Rpb24nKXtjb25zdCBsaXN0ZW5lcj17aGFuZGxlcjpmcmFtZXdvcmtMaXN0ZW5lci5oYW5kbGVyfHxmcmFtZXdvcmtMaXN0ZW5lcix1c2VDYXB0dXJlOnRydWUscGFzc2l2ZTpmYWxzZSxvbmNlOmZhbHNlLHR5cGU6dHlwZX07bGlzdGVuZXIucmVtb3ZlPWpRdWVyeVJlbW92ZS5iaW5kKG5vZGUsZnJhbWV3b3JrTGlzdGVuZXIuc2VsZWN0b3IpO2V2ZW50TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO319fQpjb25zdCBub2RlRGF0YT1kYXRhKG5vZGUpO2lmKG5vZGVEYXRhJiZ0eXBlb2Ygbm9kZURhdGEuaGFuZGxlPT09J2Z1bmN0aW9uJykKaW50ZXJuYWxIYW5kbGVycy5wdXNoKG5vZGVEYXRhLmhhbmRsZSk7fQpjb25zdCBlbnRyeT1qUXVlcnlGdW5jdGlvbihub2RlKVswXTtpZihlbnRyeSl7Y29uc3QgZW50cnlFdmVudHM9ZW50cnlbJyRldmVudHMnXTtmb3IoY29uc3QgdHlwZSBpbiBlbnRyeUV2ZW50cyl7Y29uc3QgZXZlbnRzPWVudHJ5RXZlbnRzW3R5cGVdO2Zvcihjb25zdCBrZXkgaW4gZXZlbnRzKXtpZih0eXBlb2YgZXZlbnRzW2tleV09PT0nZnVuY3Rpb24nKXtjb25zdCBsaXN0ZW5lcj17aGFuZGxlcjpldmVudHNba2V5XSx1c2VDYXB0dXJlOnRydWUscGFzc2l2ZTpmYWxzZSxvbmNlOmZhbHNlLHR5cGU6dHlwZX07ZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7fX19CmlmKGVudHJ5JiZlbnRyeVsnJGhhbmRsZSddKQppbnRlcm5hbEhhbmRsZXJzLnB1c2goZW50cnlbJyRoYW5kbGUnXSk7fQpyZXR1cm57ZXZlbnRMaXN0ZW5lcnM6ZXZlbnRMaXN0ZW5lcnMsaW50ZXJuYWxIYW5kbGVyczppbnRlcm5hbEhhbmRsZXJzfTt9CmZ1bmN0aW9uIGpRdWVyeVJlbW92ZShzZWxlY3Rvcix0eXBlLGhhbmRsZXIpe2lmKCF0aGlzfHwhKHRoaXMgaW5zdGFuY2VvZiBOb2RlKSkKcmV0dXJuO2NvbnN0IG5vZGU9KHRoaXMpO2NvbnN0IGpRdWVyeT0od2luZG93WydqUXVlcnknXSk7aWYoIWpRdWVyeXx8IWpRdWVyeS5mbikKcmV0dXJuO2NvbnN0IGpRdWVyeUZ1bmN0aW9uPShqUXVlcnkpO2pRdWVyeUZ1bmN0aW9uKG5vZGUpLm9mZih0eXBlLHNlbGVjdG9yLGhhbmRsZXIpO319fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImV2ZW50X2xpc3RlbmVycy9ldmVudExpc3RlbmVyc1ZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnRyZWUtb3V0bGluZS1kaXNjbG9zdXJlIGxpIHtcbiAgICBwYWRkaW5nOiAycHggMCAwIDVweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGRpc3BsYXk6IGxpc3QtaXRlbTtcbiAgICBtaW4taGVpZ2h0OiAxN3B4O1xufVxuXG4udHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUgPiBsaSB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7XG59XG5cbi50cmVlLW91dGxpbmUtZGlzY2xvc3VyZSA+IGxpOmZpcnN0LW9mLXR5cGUge1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG59XG5cbi50cmVlLW91dGxpbmUtZGlzY2xvc3VyZSB7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1yaWdodDogM3B4O1xufVxuXG4udHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUgbGkucGFyZW50OjpiZWZvcmUge1xuICAgIHRvcDogMCAhaW1wb3J0YW50O1xufVxuXG4udHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUgLm5hbWUge1xuICAgIGNvbG9yOiByZ2IoMTM2LCAxOSwgMTQ1KTtcbn1cblxuLmV2ZW50LWxpc3RlbmVyLXRyZWUtc3VidGl0bGUge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xufVxuXG4uZXZlbnQtbGlzdGVuZXItYnV0dG9uIHtcbiAgICBwYWRkaW5nOiAwIDNweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzNjM2MzO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZXZlbnQtbGlzdGVuZXItYnV0dG9uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xufVxuXG4udHJlZS1vdXRsaW5lLWRpc2Nsb3N1cmUgbGk6aG92ZXIgLmV2ZW50LWxpc3RlbmVyLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lO1xufVxuXG4vKiMgc291cmNlVVJMPWV2ZW50X2xpc3RlbmVycy9ldmVudExpc3RlbmVyc1ZpZXcuY3NzICovIjtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3Rhc2tRdWV1ZT1bXTt0aGlzLl93b3JrZXJUYXNrcz1uZXcgTWFwKCk7fQpfY3JlYXRlV29ya2VyKCl7Y29uc3Qgd29ya2VyPW5ldyBDb21tb24uV29ya2VyKCdmb3JtYXR0ZXJfd29ya2VyJyk7d29ya2VyLm9ubWVzc2FnZT10aGlzLl9vbldvcmtlck1lc3NhZ2UuYmluZCh0aGlzLHdvcmtlcik7d29ya2VyLm9uZXJyb3I9dGhpcy5fb25Xb3JrZXJFcnJvci5iaW5kKHRoaXMsd29ya2VyKTtyZXR1cm4gd29ya2VyO30KX3Byb2Nlc3NOZXh0VGFzaygpe2lmKCF0aGlzLl90YXNrUXVldWUubGVuZ3RoKQpyZXR1cm47bGV0IGZyZWVXb3JrZXI9dGhpcy5fd29ya2VyVGFza3Mua2V5c0FycmF5KCkuZmluZCh3b3JrZXI9PiF0aGlzLl93b3JrZXJUYXNrcy5nZXQod29ya2VyKSk7aWYoIWZyZWVXb3JrZXImJnRoaXMuX3dvcmtlclRhc2tzLnNpemU8Rm9ybWF0dGVyLkZvcm1hdHRlcldvcmtlclBvb2wuTWF4V29ya2VycykKZnJlZVdvcmtlcj10aGlzLl9jcmVhdGVXb3JrZXIoKTtpZighZnJlZVdvcmtlcikKcmV0dXJuO2NvbnN0IHRhc2s9dGhpcy5fdGFza1F1ZXVlLnNoaWZ0KCk7dGhpcy5fd29ya2VyVGFza3Muc2V0KGZyZWVXb3JrZXIsdGFzayk7ZnJlZVdvcmtlci5wb3N0TWVzc2FnZSh7bWV0aG9kOnRhc2subWV0aG9kLHBhcmFtczp0YXNrLnBhcmFtc30pO30KX29uV29ya2VyTWVzc2FnZSh3b3JrZXIsZXZlbnQpe2NvbnN0IHRhc2s9dGhpcy5fd29ya2VyVGFza3MuZ2V0KHdvcmtlcik7aWYodGFzay5pc0NodW5rZWQmJmV2ZW50LmRhdGEmJiFldmVudC5kYXRhWydpc0xhc3RDaHVuayddKXt0YXNrLmNhbGxiYWNrKGV2ZW50LmRhdGEpO3JldHVybjt9CnRoaXMuX3dvcmtlclRhc2tzLnNldCh3b3JrZXIsbnVsbCk7dGhpcy5fcHJvY2Vzc05leHRUYXNrKCk7dGFzay5jYWxsYmFjayhldmVudC5kYXRhP2V2ZW50LmRhdGE6bnVsbCk7fQpfb25Xb3JrZXJFcnJvcih3b3JrZXIsZXZlbnQpe2NvbnNvbGUuZXJyb3IoZXZlbnQpO2NvbnN0IHRhc2s9dGhpcy5fd29ya2VyVGFza3MuZ2V0KHdvcmtlcik7d29ya2VyLnRlcm1pbmF0ZSgpO3RoaXMuX3dvcmtlclRhc2tzLmRlbGV0ZSh3b3JrZXIpO2NvbnN0IG5ld1dvcmtlcj10aGlzLl9jcmVhdGVXb3JrZXIoKTt0aGlzLl93b3JrZXJUYXNrcy5zZXQobmV3V29ya2VyLG51bGwpO3RoaXMuX3Byb2Nlc3NOZXh0VGFzaygpO3Rhc2suY2FsbGJhY2sobnVsbCk7fQpfcnVuQ2h1bmtlZFRhc2sobWV0aG9kTmFtZSxwYXJhbXMsY2FsbGJhY2spe2NvbnN0IHRhc2s9bmV3IEZvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLlRhc2sobWV0aG9kTmFtZSxwYXJhbXMsb25EYXRhLHRydWUpO3RoaXMuX3Rhc2tRdWV1ZS5wdXNoKHRhc2spO3RoaXMuX3Byb2Nlc3NOZXh0VGFzaygpO2Z1bmN0aW9uIG9uRGF0YShkYXRhKXtpZighZGF0YSl7Y2FsbGJhY2sodHJ1ZSxudWxsKTtyZXR1cm47fQpjb25zdCBpc0xhc3RDaHVuaz0hIWRhdGFbJ2lzTGFzdENodW5rJ107Y29uc3QgY2h1bms9ZGF0YVsnY2h1bmsnXTtjYWxsYmFjayhpc0xhc3RDaHVuayxjaHVuayk7fX0KX3J1blRhc2sobWV0aG9kTmFtZSxwYXJhbXMpe2xldCBjYWxsYmFjaztjb25zdCBwcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9PmNhbGxiYWNrPWZ1bGZpbGwpO2NvbnN0IHRhc2s9bmV3IEZvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLlRhc2sobWV0aG9kTmFtZSxwYXJhbXMsY2FsbGJhY2ssZmFsc2UpO3RoaXMuX3Rhc2tRdWV1ZS5wdXNoKHRhc2spO3RoaXMuX3Byb2Nlc3NOZXh0VGFzaygpO3JldHVybiBwcm9taXNlO30KcGFyc2VKU09OUmVsYXhlZChjb250ZW50KXtyZXR1cm4gdGhpcy5fcnVuVGFzaygncGFyc2VKU09OUmVsYXhlZCcse2NvbnRlbnQ6Y29udGVudH0pO30KcGFyc2VTQ1NTKGNvbnRlbnQpe3JldHVybiB0aGlzLl9ydW5UYXNrKCdwYXJzZVNDU1MnLHtjb250ZW50OmNvbnRlbnR9KS50aGVuKHJ1bGVzPT5ydWxlc3x8W10pO30KZm9ybWF0KG1pbWVUeXBlLGNvbnRlbnQsaW5kZW50U3RyaW5nKXtjb25zdCBwYXJhbWV0ZXJzPXttaW1lVHlwZTptaW1lVHlwZSxjb250ZW50OmNvbnRlbnQsaW5kZW50U3RyaW5nOmluZGVudFN0cmluZ307cmV0dXJuKHRoaXMuX3J1blRhc2soJ2Zvcm1hdCcscGFyYW1ldGVycykpO30KamF2YVNjcmlwdElkZW50aWZpZXJzKGNvbnRlbnQpe3JldHVybiB0aGlzLl9ydW5UYXNrKCdqYXZhU2NyaXB0SWRlbnRpZmllcnMnLHtjb250ZW50OmNvbnRlbnR9KS50aGVuKGlkcz0+aWRzfHxbXSk7fQpldmFsdWF0YWJsZUphdmFTY3JpcHRTdWJzdHJpbmcoY29udGVudCl7cmV0dXJuIHRoaXMuX3J1blRhc2soJ2V2YWx1YXRhYmxlSmF2YVNjcmlwdFN1YnN0cmluZycse2NvbnRlbnQ6Y29udGVudH0pLnRoZW4odGV4dD0+dGV4dHx8JycpO30KcHJlcHJvY2Vzc1RvcExldmVsQXdhaXRFeHByZXNzaW9ucyhjb250ZW50KXtyZXR1cm4gdGhpcy5fcnVuVGFzaygncHJlcHJvY2Vzc1RvcExldmVsQXdhaXRFeHByZXNzaW9ucycse2NvbnRlbnQ6Y29udGVudH0pLnRoZW4odGV4dD0+dGV4dHx8JycpO30KcGFyc2VDU1MoY29udGVudCxjYWxsYmFjayl7dGhpcy5fcnVuQ2h1bmtlZFRhc2soJ3BhcnNlQ1NTJyx7Y29udGVudDpjb250ZW50fSxvbkRhdGFDaHVuayk7ZnVuY3Rpb24gb25EYXRhQ2h1bmsoaXNMYXN0Q2h1bmssZGF0YSl7Y29uc3QgcnVsZXM9KGRhdGF8fFtdKTtjYWxsYmFjayhpc0xhc3RDaHVuayxydWxlcyk7fX0KamF2YVNjcmlwdE91dGxpbmUoY29udGVudCxjYWxsYmFjayl7dGhpcy5fcnVuQ2h1bmtlZFRhc2soJ2phdmFTY3JpcHRPdXRsaW5lJyx7Y29udGVudDpjb250ZW50fSxvbkRhdGFDaHVuayk7ZnVuY3Rpb24gb25EYXRhQ2h1bmsoaXNMYXN0Q2h1bmssZGF0YSl7Y29uc3QgaXRlbXM9KGRhdGF8fFtdKTtjYWxsYmFjayhpc0xhc3RDaHVuayxpdGVtcyk7fX0Kb3V0bGluZUZvck1pbWV0eXBlKGNvbnRlbnQsbWltZVR5cGUsY2FsbGJhY2spe3N3aXRjaChtaW1lVHlwZSl7Y2FzZSd0ZXh0L2h0bWwnOmNhc2UndGV4dC9qYXZhc2NyaXB0Jzp0aGlzLmphdmFTY3JpcHRPdXRsaW5lKGNvbnRlbnQsamF2YVNjcmlwdENhbGxiYWNrKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RleHQvY3NzJzp0aGlzLnBhcnNlQ1NTKGNvbnRlbnQsY3NzQ2FsbGJhY2spO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO2Z1bmN0aW9uIGphdmFTY3JpcHRDYWxsYmFjayhpc0xhc3RDaHVuayxpdGVtcyl7Y2FsbGJhY2soaXNMYXN0Q2h1bmssaXRlbXMubWFwKGl0ZW09Pih7bGluZTppdGVtLmxpbmUsY29sdW1uOml0ZW0uY29sdW1uLHRpdGxlOml0ZW0ubmFtZSxzdWJ0aXRsZTppdGVtLmFyZ3VtZW50c30pKSk7fQpmdW5jdGlvbiBjc3NDYWxsYmFjayhpc0xhc3RDaHVuayxydWxlcyl7Y2FsbGJhY2soaXNMYXN0Q2h1bmsscnVsZXMubWFwKHJ1bGU9Pih7bGluZTpydWxlLmxpbmVOdW1iZXIsY29sdW1uOnJ1bGUuY29sdW1uTnVtYmVyLHRpdGxlOnJ1bGUuc2VsZWN0b3JUZXh0fHxydWxlLmF0UnVsZX0pKSk7fX0KZmluZExhc3RFeHByZXNzaW9uKGNvbnRlbnQpe3JldHVybih0aGlzLl9ydW5UYXNrKCdmaW5kTGFzdEV4cHJlc3Npb24nLHtjb250ZW50fSkpO30KZmluZExhc3RGdW5jdGlvbkNhbGwoY29udGVudCl7cmV0dXJuKHRoaXMuX3J1blRhc2soJ2ZpbmRMYXN0RnVuY3Rpb25DYWxsJyx7Y29udGVudH0pKTt9CmFyZ3VtZW50c0xpc3QoY29udGVudCl7cmV0dXJuKHRoaXMuX3J1blRhc2soJ2FyZ3VtZW50c0xpc3QnLHtjb250ZW50fSkpO319O0Zvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLk1heFdvcmtlcnM9MjtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5UYXNrPWNsYXNze2NvbnN0cnVjdG9yKG1ldGhvZCxwYXJhbXMsY2FsbGJhY2ssaXNDaHVua2VkKXt0aGlzLm1ldGhvZD1tZXRob2Q7dGhpcy5wYXJhbXM9cGFyYW1zO3RoaXMuY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5pc0NodW5rZWQ9aXNDaHVua2VkO319O0Zvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLkZvcm1hdFJlc3VsdD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuY29udGVudDt0aGlzLm1hcHBpbmc7fX07Rm9ybWF0dGVyLkZvcm1hdHRlcldvcmtlclBvb2wuRm9ybWF0TWFwcGluZztGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5PdXRsaW5lSXRlbTtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5KU091dGxpbmVJdGVtPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5uYW1lO3RoaXMuYXJndW1lbnRzO3RoaXMubGluZTt0aGlzLmNvbHVtbjt9fTtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5UZXh0UmFuZ2U7Rm9ybWF0dGVyLkZvcm1hdHRlcldvcmtlclBvb2wuQ1NTUHJvcGVydHk9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLm5hbWU7dGhpcy5uYW1lUmFuZ2U7dGhpcy52YWx1ZTt0aGlzLnZhbHVlUmFuZ2U7dGhpcy5yYW5nZTt0aGlzLmRpc2FibGVkO319O0Zvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLkNTU1N0eWxlUnVsZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc2VsZWN0b3JUZXh0O3RoaXMuc3R5bGVSYW5nZTt0aGlzLmxpbmVOdW1iZXI7dGhpcy5jb2x1bW5OdW1iZXI7dGhpcy5wcm9wZXJ0aWVzO319O0Zvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLkNTU0F0UnVsZTtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5DU1NSdWxlO0Zvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sLlNDU1NQcm9wZXJ0eT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMucmFuZ2U7dGhpcy5uYW1lO3RoaXMudmFsdWU7dGhpcy5kaXNhYmxlZDt9fTtGb3JtYXR0ZXIuRm9ybWF0dGVyV29ya2VyUG9vbC5TQ1NTUnVsZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc2VsZWN0b3JzO3RoaXMucHJvcGVydGllczt0aGlzLnN0eWxlUmFuZ2U7fX07Rm9ybWF0dGVyLmZvcm1hdHRlcldvcmtlclBvb2w9ZnVuY3Rpb24oKXtpZighRm9ybWF0dGVyLl9mb3JtYXR0ZXJXb3JrZXJQb29sKQpGb3JtYXR0ZXIuX2Zvcm1hdHRlcldvcmtlclBvb2w9bmV3IEZvcm1hdHRlci5Gb3JtYXR0ZXJXb3JrZXJQb29sKCk7cmV0dXJuIEZvcm1hdHRlci5fZm9ybWF0dGVyV29ya2VyUG9vbDt9OztGb3JtYXR0ZXIuRm9ybWF0dGVyPWZ1bmN0aW9uKCl7fTtGb3JtYXR0ZXIuRm9ybWF0dGVyLmZvcm1hdD1mdW5jdGlvbihjb250ZW50VHlwZSxtaW1lVHlwZSxjb250ZW50LGNhbGxiYWNrKXtpZihjb250ZW50VHlwZS5pc0RvY3VtZW50T3JTY3JpcHRPclN0eWxlU2hlZXQoKSkKbmV3IEZvcm1hdHRlci5TY3JpcHRGb3JtYXR0ZXIobWltZVR5cGUsY29udGVudCxjYWxsYmFjayk7ZWxzZQpuZXcgRm9ybWF0dGVyLlNjcmlwdElkZW50aXR5Rm9ybWF0dGVyKG1pbWVUeXBlLGNvbnRlbnQsY2FsbGJhY2spO307Rm9ybWF0dGVyLkZvcm1hdHRlci5sb2NhdGlvblRvUG9zaXRpb249ZnVuY3Rpb24obGluZUVuZGluZ3MsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IHBvc2l0aW9uPWxpbmVOdW1iZXI/bGluZUVuZGluZ3NbbGluZU51bWJlci0xXSsxOjA7cmV0dXJuIHBvc2l0aW9uK2NvbHVtbk51bWJlcjt9O0Zvcm1hdHRlci5Gb3JtYXR0ZXIucG9zaXRpb25Ub0xvY2F0aW9uPWZ1bmN0aW9uKGxpbmVFbmRpbmdzLHBvc2l0aW9uKXtjb25zdCBsaW5lTnVtYmVyPWxpbmVFbmRpbmdzLnVwcGVyQm91bmQocG9zaXRpb24tMSk7bGV0IGNvbHVtbk51bWJlcjtpZighbGluZU51bWJlcikKY29sdW1uTnVtYmVyPXBvc2l0aW9uO2Vsc2UKY29sdW1uTnVtYmVyPXBvc2l0aW9uLWxpbmVFbmRpbmdzW2xpbmVOdW1iZXItMV0tMTtyZXR1cm5bbGluZU51bWJlcixjb2x1bW5OdW1iZXJdO307Rm9ybWF0dGVyLlNjcmlwdEZvcm1hdHRlcj1jbGFzc3tjb25zdHJ1Y3RvcihtaW1lVHlwZSxjb250ZW50LGNhbGxiYWNrKXtjb250ZW50PWNvbnRlbnQucmVwbGFjZSgvXHJcbj98W1xuXHUyMDI4XHUyMDI5XS9nLCdcbicpLnJlcGxhY2UoL15cdUZFRkYvLCcnKTt0aGlzLl9jYWxsYmFjaz1jYWxsYmFjazt0aGlzLl9vcmlnaW5hbENvbnRlbnQ9Y29udGVudDtGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmZvcm1hdChtaW1lVHlwZSxjb250ZW50LENvbW1vbi5tb2R1bGVTZXR0aW5nKCd0ZXh0RWRpdG9ySW5kZW50JykuZ2V0KCkpLnRoZW4odGhpcy5fZGlkRm9ybWF0Q29udGVudC5iaW5kKHRoaXMpKTt9Cl9kaWRGb3JtYXRDb250ZW50KGZvcm1hdFJlc3VsdCl7Y29uc3Qgc291cmNlTWFwcGluZz1uZXcgRm9ybWF0dGVyLkZvcm1hdHRlclNvdXJjZU1hcHBpbmdJbXBsKHRoaXMuX29yaWdpbmFsQ29udGVudC5jb21wdXRlTGluZUVuZGluZ3MoKSxmb3JtYXRSZXN1bHQuY29udGVudC5jb21wdXRlTGluZUVuZGluZ3MoKSxmb3JtYXRSZXN1bHQubWFwcGluZyk7dGhpcy5fY2FsbGJhY2soZm9ybWF0UmVzdWx0LmNvbnRlbnQsc291cmNlTWFwcGluZyk7fX07Rm9ybWF0dGVyLlNjcmlwdElkZW50aXR5Rm9ybWF0dGVyPWNsYXNze2NvbnN0cnVjdG9yKG1pbWVUeXBlLGNvbnRlbnQsY2FsbGJhY2spe2NhbGxiYWNrKGNvbnRlbnQsbmV3IEZvcm1hdHRlci5JZGVudGl0eUZvcm1hdHRlclNvdXJjZU1hcHBpbmcoKSk7fX07Rm9ybWF0dGVyLkZvcm1hdHRlclNvdXJjZU1hcHBpbmc9ZnVuY3Rpb24oKXt9O0Zvcm1hdHRlci5Gb3JtYXR0ZXJTb3VyY2VNYXBwaW5nLnByb3RvdHlwZT17b3JpZ2luYWxUb0Zvcm1hdHRlZChsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7fSxmb3JtYXR0ZWRUb09yaWdpbmFsKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt9fTtGb3JtYXR0ZXIuSWRlbnRpdHlGb3JtYXR0ZXJTb3VyY2VNYXBwaW5nPWNsYXNze29yaWdpbmFsVG9Gb3JtYXR0ZWQobGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybltsaW5lTnVtYmVyLGNvbHVtbk51bWJlcnx8MF07fQpmb3JtYXR0ZWRUb09yaWdpbmFsKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtyZXR1cm5bbGluZU51bWJlcixjb2x1bW5OdW1iZXJ8fDBdO319O0Zvcm1hdHRlci5Gb3JtYXR0ZXJTb3VyY2VNYXBwaW5nSW1wbD1jbGFzc3tjb25zdHJ1Y3RvcihvcmlnaW5hbExpbmVFbmRpbmdzLGZvcm1hdHRlZExpbmVFbmRpbmdzLG1hcHBpbmcpe3RoaXMuX29yaWdpbmFsTGluZUVuZGluZ3M9b3JpZ2luYWxMaW5lRW5kaW5nczt0aGlzLl9mb3JtYXR0ZWRMaW5lRW5kaW5ncz1mb3JtYXR0ZWRMaW5lRW5kaW5nczt0aGlzLl9tYXBwaW5nPW1hcHBpbmc7fQpvcmlnaW5hbFRvRm9ybWF0dGVkKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBvcmlnaW5hbFBvc2l0aW9uPUZvcm1hdHRlci5Gb3JtYXR0ZXIubG9jYXRpb25Ub1Bvc2l0aW9uKHRoaXMuX29yaWdpbmFsTGluZUVuZGluZ3MsbGluZU51bWJlcixjb2x1bW5OdW1iZXJ8fDApO2NvbnN0IGZvcm1hdHRlZFBvc2l0aW9uPXRoaXMuX2NvbnZlcnRQb3NpdGlvbih0aGlzLl9tYXBwaW5nLm9yaWdpbmFsLHRoaXMuX21hcHBpbmcuZm9ybWF0dGVkLG9yaWdpbmFsUG9zaXRpb258fDApO3JldHVybiBGb3JtYXR0ZXIuRm9ybWF0dGVyLnBvc2l0aW9uVG9Mb2NhdGlvbih0aGlzLl9mb3JtYXR0ZWRMaW5lRW5kaW5ncyxmb3JtYXR0ZWRQb3NpdGlvbik7fQpmb3JtYXR0ZWRUb09yaWdpbmFsKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBmb3JtYXR0ZWRQb3NpdGlvbj1Gb3JtYXR0ZXIuRm9ybWF0dGVyLmxvY2F0aW9uVG9Qb3NpdGlvbih0aGlzLl9mb3JtYXR0ZWRMaW5lRW5kaW5ncyxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcnx8MCk7Y29uc3Qgb3JpZ2luYWxQb3NpdGlvbj10aGlzLl9jb252ZXJ0UG9zaXRpb24odGhpcy5fbWFwcGluZy5mb3JtYXR0ZWQsdGhpcy5fbWFwcGluZy5vcmlnaW5hbCxmb3JtYXR0ZWRQb3NpdGlvbik7cmV0dXJuIEZvcm1hdHRlci5Gb3JtYXR0ZXIucG9zaXRpb25Ub0xvY2F0aW9uKHRoaXMuX29yaWdpbmFsTGluZUVuZGluZ3Msb3JpZ2luYWxQb3NpdGlvbnx8MCk7fQpfY29udmVydFBvc2l0aW9uKHBvc2l0aW9uczEscG9zaXRpb25zMixwb3NpdGlvbil7Y29uc3QgaW5kZXg9cG9zaXRpb25zMS51cHBlckJvdW5kKHBvc2l0aW9uKS0xO2xldCBjb252ZXJ0ZWRQb3NpdGlvbj1wb3NpdGlvbnMyW2luZGV4XStwb3NpdGlvbi1wb3NpdGlvbnMxW2luZGV4XTtpZihpbmRleDxwb3NpdGlvbnMyLmxlbmd0aC0xJiZjb252ZXJ0ZWRQb3NpdGlvbj5wb3NpdGlvbnMyW2luZGV4KzFdKQpjb252ZXJ0ZWRQb3NpdGlvbj1wb3NpdGlvbnMyW2luZGV4KzFdO3JldHVybiBjb252ZXJ0ZWRQb3NpdGlvbjt9fTs7SEFSSW1wb3J0ZXIuSEFSQmFzZT1jbGFzc3tjb25zdHJ1Y3RvcihkYXRhKXtpZighZGF0YXx8dHlwZW9mIGRhdGEhPT0nb2JqZWN0JykKdGhyb3cnRmlyc3QgcGFyYW1ldGVyIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCc7fQpzdGF0aWMgX3NhZmVEYXRlKGRhdGEpe2NvbnN0IGRhdGU9bmV3IERhdGUoZGF0YSk7aWYoIU51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpCnJldHVybiBkYXRlO3Rocm93J0ludmFsaWQgZGF0ZSBmb3JtYXQnO30Kc3RhdGljIF9zYWZlTnVtYmVyKGRhdGEpe2NvbnN0IHJlc3VsdD1OdW1iZXIoZGF0YSk7aWYoIU51bWJlci5pc05hTihyZXN1bHQpKQpyZXR1cm4gcmVzdWx0O3Rocm93J0Nhc3RpbmcgdG8gbnVtYmVyIHJlc3VsdHMgaW4gTmFOJzt9CnN0YXRpYyBfb3B0aW9uYWxOdW1iZXIoZGF0YSl7cmV0dXJuIGRhdGEhPT11bmRlZmluZWQ/SEFSSW1wb3J0ZXIuSEFSQmFzZS5fc2FmZU51bWJlcihkYXRhKTp1bmRlZmluZWQ7fQpzdGF0aWMgX29wdGlvbmFsU3RyaW5nKGRhdGEpe3JldHVybiBkYXRhIT09dW5kZWZpbmVkP1N0cmluZyhkYXRhKTp1bmRlZmluZWQ7fQpjdXN0b21Bc1N0cmluZyhuYW1lKXtjb25zdCB2YWx1ZT0odGhpcylbJ18nK25hbWVdO3JldHVybiB2YWx1ZSE9PXVuZGVmaW5lZD9TdHJpbmcodmFsdWUpOnVuZGVmaW5lZDt9CmN1c3RvbUFzTnVtYmVyKG5hbWUpe2xldCB2YWx1ZT0odGhpcylbJ18nK25hbWVdO2lmKHZhbHVlPT09dW5kZWZpbmVkKQpyZXR1cm47dmFsdWU9TnVtYmVyKHZhbHVlKTtpZihOdW1iZXIuaXNOYU4odmFsdWUpKQpyZXR1cm47cmV0dXJuIHZhbHVlO319O0hBUkltcG9ydGVyLkhBUlJvb3Q9Y2xhc3MgZXh0ZW5kcyBIQVJJbXBvcnRlci5IQVJCYXNle2NvbnN0cnVjdG9yKGRhdGEpe3N1cGVyKGRhdGEpO3RoaXMubG9nPW5ldyBIQVJJbXBvcnRlci5IQVJMb2coZGF0YVsnbG9nJ10pO319O0hBUkltcG9ydGVyLkhBUkxvZz1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy52ZXJzaW9uPVN0cmluZyhkYXRhWyd2ZXJzaW9uJ10pO3RoaXMuY3JlYXRvcj1uZXcgSEFSSW1wb3J0ZXIuSEFSQ3JlYXRvcihkYXRhWydjcmVhdG9yJ10pO3RoaXMuYnJvd3Nlcj1kYXRhWydicm93c2VyJ10/bmV3IEhBUkltcG9ydGVyLkhBUkNyZWF0b3IoZGF0YVsnYnJvd3NlciddKTp1bmRlZmluZWQ7dGhpcy5wYWdlcz1BcnJheS5pc0FycmF5KGRhdGFbJ3BhZ2VzJ10pP2RhdGFbJ3BhZ2VzJ10ubWFwKHBhZ2U9Pm5ldyBIQVJJbXBvcnRlci5IQVJQYWdlKHBhZ2UpKTpbXTtpZighQXJyYXkuaXNBcnJheShkYXRhWydlbnRyaWVzJ10pKQp0aHJvdydsb2cuZW50cmllcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSc7dGhpcy5lbnRyaWVzPWRhdGFbJ2VudHJpZXMnXS5tYXAoZW50cnk9Pm5ldyBIQVJJbXBvcnRlci5IQVJFbnRyeShlbnRyeSkpO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUkNyZWF0b3I9Y2xhc3MgZXh0ZW5kcyBIQVJJbXBvcnRlci5IQVJCYXNle2NvbnN0cnVjdG9yKGRhdGEpe3N1cGVyKGRhdGEpO3RoaXMubmFtZT1TdHJpbmcoZGF0YVsnbmFtZSddKTt0aGlzLnZlcnNpb249U3RyaW5nKGRhdGFbJ3ZlcnNpb24nXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7fX07SEFSSW1wb3J0ZXIuSEFSUGFnZT1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy5zdGFydGVkRGF0ZVRpbWU9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fc2FmZURhdGUoZGF0YVsnc3RhcnRlZERhdGVUaW1lJ10pO3RoaXMuaWQ9U3RyaW5nKGRhdGFbJ2lkJ10pO3RoaXMudGl0bGU9U3RyaW5nKGRhdGFbJ3RpdGxlJ10pO3RoaXMucGFnZVRpbWluZ3M9bmV3IEhBUkltcG9ydGVyLkhBUlBhZ2VUaW1pbmdzKGRhdGFbJ3BhZ2VUaW1pbmdzJ10pO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUlBhZ2VUaW1pbmdzPWNsYXNzIGV4dGVuZHMgSEFSSW1wb3J0ZXIuSEFSQmFzZXtjb25zdHJ1Y3RvcihkYXRhKXtzdXBlcihkYXRhKTt0aGlzLm9uQ29udGVudExvYWQ9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxOdW1iZXIoZGF0YVsnb25Db250ZW50TG9hZCddKTt0aGlzLm9uTG9hZD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbE51bWJlcihkYXRhWydvbkxvYWQnXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7fX07SEFSSW1wb3J0ZXIuSEFSRW50cnk9Y2xhc3MgZXh0ZW5kcyBIQVJJbXBvcnRlci5IQVJCYXNle2NvbnN0cnVjdG9yKGRhdGEpe3N1cGVyKGRhdGEpO3RoaXMucGFnZXJlZj1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydwYWdlcmVmJ10pO3RoaXMuc3RhcnRlZERhdGVUaW1lPUhBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVEYXRlKGRhdGFbJ3N0YXJ0ZWREYXRlVGltZSddKTt0aGlzLnRpbWU9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fc2FmZU51bWJlcihkYXRhWyd0aW1lJ10pO3RoaXMucmVxdWVzdD1uZXcgSEFSSW1wb3J0ZXIuSEFSUmVxdWVzdChkYXRhWydyZXF1ZXN0J10pO3RoaXMucmVzcG9uc2U9bmV3IEhBUkltcG9ydGVyLkhBUlJlc3BvbnNlKGRhdGFbJ3Jlc3BvbnNlJ10pO3RoaXMuY2FjaGU9e307dGhpcy50aW1pbmdzPW5ldyBIQVJJbXBvcnRlci5IQVJUaW1pbmdzKGRhdGFbJ3RpbWluZ3MnXSk7dGhpcy5zZXJ2ZXJJUEFkZHJlc3M9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxTdHJpbmcoZGF0YVsnc2VydmVySVBBZGRyZXNzJ10pO3RoaXMuY29ubmVjdGlvbj1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb25uZWN0aW9uJ10pO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO3RoaXMuX2Zyb21DYWNoZT1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydfZnJvbUNhY2hlJ10pO319O0hBUkltcG9ydGVyLkhBUlJlcXVlc3Q9Y2xhc3MgZXh0ZW5kcyBIQVJJbXBvcnRlci5IQVJCYXNle2NvbnN0cnVjdG9yKGRhdGEpe3N1cGVyKGRhdGEpO3RoaXMubWV0aG9kPVN0cmluZyhkYXRhWydtZXRob2QnXSk7dGhpcy51cmw9U3RyaW5nKGRhdGFbJ3VybCddKTt0aGlzLmh0dHBWZXJzaW9uPVN0cmluZyhkYXRhWydodHRwVmVyc2lvbiddKTt0aGlzLmNvb2tpZXM9QXJyYXkuaXNBcnJheShkYXRhWydjb29raWVzJ10pP2RhdGFbJ2Nvb2tpZXMnXS5tYXAoY29va2llPT5uZXcgSEFSSW1wb3J0ZXIuSEFSQ29va2llKGNvb2tpZSkpOltdO3RoaXMuaGVhZGVycz1BcnJheS5pc0FycmF5KGRhdGFbJ2hlYWRlcnMnXSk/ZGF0YVsnaGVhZGVycyddLm1hcChoZWFkZXI9Pm5ldyBIQVJJbXBvcnRlci5IQVJIZWFkZXIoaGVhZGVyKSk6W107dGhpcy5xdWVyeVN0cmluZz1BcnJheS5pc0FycmF5KGRhdGFbJ3F1ZXJ5U3RyaW5nJ10pP2RhdGFbJ3F1ZXJ5U3RyaW5nJ10ubWFwKHFzPT5uZXcgSEFSSW1wb3J0ZXIuSEFSUXVlcnlTdHJpbmcocXMpKTpbXTt0aGlzLnBvc3REYXRhPWRhdGFbJ3Bvc3REYXRhJ10/bmV3IEhBUkltcG9ydGVyLkhBUlBvc3REYXRhKGRhdGFbJ3Bvc3REYXRhJ10pOnVuZGVmaW5lZDt0aGlzLmhlYWRlcnNTaXplPUhBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVOdW1iZXIoZGF0YVsnaGVhZGVyc1NpemUnXSk7dGhpcy5ib2R5U2l6ZT1IQVJJbXBvcnRlci5IQVJCYXNlLl9zYWZlTnVtYmVyKGRhdGFbJ2JvZHlTaXplJ10pO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUlJlc3BvbnNlPWNsYXNzIGV4dGVuZHMgSEFSSW1wb3J0ZXIuSEFSQmFzZXtjb25zdHJ1Y3RvcihkYXRhKXtzdXBlcihkYXRhKTt0aGlzLnN0YXR1cz1IQVJJbXBvcnRlci5IQVJCYXNlLl9zYWZlTnVtYmVyKGRhdGFbJ3N0YXR1cyddKTt0aGlzLnN0YXR1c1RleHQ9U3RyaW5nKGRhdGFbJ3N0YXR1c1RleHQnXSk7dGhpcy5odHRwVmVyc2lvbj1TdHJpbmcoZGF0YVsnaHR0cFZlcnNpb24nXSk7dGhpcy5jb29raWVzPUFycmF5LmlzQXJyYXkoZGF0YVsnY29va2llcyddKT9kYXRhWydjb29raWVzJ10ubWFwKGNvb2tpZT0+bmV3IEhBUkltcG9ydGVyLkhBUkNvb2tpZShjb29raWUpKTpbXTt0aGlzLmhlYWRlcnM9QXJyYXkuaXNBcnJheShkYXRhWydoZWFkZXJzJ10pP2RhdGFbJ2hlYWRlcnMnXS5tYXAoaGVhZGVyPT5uZXcgSEFSSW1wb3J0ZXIuSEFSSGVhZGVyKGhlYWRlcikpOltdO3RoaXMuY29udGVudD1uZXcgSEFSSW1wb3J0ZXIuSEFSQ29udGVudChkYXRhWydjb250ZW50J10pO3RoaXMucmVkaXJlY3RVUkw9U3RyaW5nKGRhdGFbJ3JlZGlyZWN0VVJMJ10pO3RoaXMuaGVhZGVyc1NpemU9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fc2FmZU51bWJlcihkYXRhWydoZWFkZXJzU2l6ZSddKTt0aGlzLmJvZHlTaXplPUhBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVOdW1iZXIoZGF0YVsnYm9keVNpemUnXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7dGhpcy5fdHJhbnNmZXJTaXplPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsTnVtYmVyKGRhdGFbJ190cmFuc2ZlclNpemUnXSk7dGhpcy5fZXJyb3I9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxTdHJpbmcoZGF0YVsnX2Vycm9yJ10pO319O0hBUkltcG9ydGVyLkhBUkNvb2tpZT1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy5uYW1lPVN0cmluZyhkYXRhWyduYW1lJ10pO3RoaXMudmFsdWU9U3RyaW5nKGRhdGFbJ3ZhbHVlJ10pO3RoaXMucGF0aD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydwYXRoJ10pO3RoaXMuZG9tYWluPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2RvbWFpbiddKTt0aGlzLmV4cGlyZXM9ZGF0YVsnZXhwaXJlcyddP0hBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVEYXRlKGRhdGFbJ2V4cGlyZXMnXSk6dW5kZWZpbmVkO3RoaXMuaHR0cE9ubHk9ZGF0YVsnaHR0cE9ubHknXSE9PXVuZGVmaW5lZD8hIWRhdGFbJ2h0dHBPbmx5J106dW5kZWZpbmVkO3RoaXMuc2VjdXJlPWRhdGFbJ3NlY3VyZSddIT09dW5kZWZpbmVkPyEhZGF0YVsnc2VjdXJlJ106dW5kZWZpbmVkO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUkhlYWRlcj1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy5uYW1lPVN0cmluZyhkYXRhWyduYW1lJ10pO3RoaXMudmFsdWU9U3RyaW5nKGRhdGFbJ3ZhbHVlJ10pO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUlF1ZXJ5U3RyaW5nPWNsYXNzIGV4dGVuZHMgSEFSSW1wb3J0ZXIuSEFSQmFzZXtjb25zdHJ1Y3RvcihkYXRhKXtzdXBlcihkYXRhKTt0aGlzLm5hbWU9U3RyaW5nKGRhdGFbJ25hbWUnXSk7dGhpcy52YWx1ZT1TdHJpbmcoZGF0YVsndmFsdWUnXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7fX07SEFSSW1wb3J0ZXIuSEFSUG9zdERhdGE9Y2xhc3MgZXh0ZW5kcyBIQVJJbXBvcnRlci5IQVJCYXNle2NvbnN0cnVjdG9yKGRhdGEpe3N1cGVyKGRhdGEpO3RoaXMubWltZVR5cGU9U3RyaW5nKGRhdGFbJ21pbWVUeXBlJ10pO3RoaXMucGFyYW1zPUFycmF5LmlzQXJyYXkoZGF0YVsncGFyYW1zJ10pP2RhdGFbJ3BhcmFtcyddLm1hcChwYXJhbT0+bmV3IEhBUkltcG9ydGVyLkhBUlBhcmFtKHBhcmFtKSk6W107dGhpcy50ZXh0PVN0cmluZyhkYXRhWyd0ZXh0J10pO3RoaXMuY29tbWVudD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWydjb21tZW50J10pO319O0hBUkltcG9ydGVyLkhBUlBhcmFtPWNsYXNzIGV4dGVuZHMgSEFSSW1wb3J0ZXIuSEFSQmFzZXtjb25zdHJ1Y3RvcihkYXRhKXtzdXBlcihkYXRhKTt0aGlzLm5hbWU9U3RyaW5nKGRhdGFbJ25hbWUnXSk7dGhpcy52YWx1ZT1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWyd2YWx1ZSddKTt0aGlzLmZpbGVOYW1lPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2ZpbGVOYW1lJ10pO3RoaXMuY29udGVudFR5cGU9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxTdHJpbmcoZGF0YVsnY29udGVudFR5cGUnXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7fX07SEFSSW1wb3J0ZXIuSEFSQ29udGVudD1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy5zaXplPUhBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVOdW1iZXIoZGF0YVsnc2l6ZSddKTt0aGlzLmNvbXByZXNzaW9uPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsTnVtYmVyKGRhdGFbJ2NvbXByZXNzaW9uJ10pO3RoaXMubWltZVR5cGU9U3RyaW5nKGRhdGFbJ21pbWVUeXBlJ10pO3RoaXMudGV4dD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbFN0cmluZyhkYXRhWyd0ZXh0J10pO3RoaXMuZW5jb2Rpbmc9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxTdHJpbmcoZGF0YVsnZW5jb2RpbmcnXSk7dGhpcy5jb21tZW50PUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsU3RyaW5nKGRhdGFbJ2NvbW1lbnQnXSk7fX07SEFSSW1wb3J0ZXIuSEFSVGltaW5ncz1jbGFzcyBleHRlbmRzIEhBUkltcG9ydGVyLkhBUkJhc2V7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSk7dGhpcy5ibG9ja2VkPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsTnVtYmVyKGRhdGFbJ2Jsb2NrZWQnXSk7dGhpcy5kbnM9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxOdW1iZXIoZGF0YVsnZG5zJ10pO3RoaXMuY29ubmVjdD1IQVJJbXBvcnRlci5IQVJCYXNlLl9vcHRpb25hbE51bWJlcihkYXRhWydjb25uZWN0J10pO3RoaXMuc2VuZD1IQVJJbXBvcnRlci5IQVJCYXNlLl9zYWZlTnVtYmVyKGRhdGFbJ3NlbmQnXSk7dGhpcy53YWl0PUhBUkltcG9ydGVyLkhBUkJhc2UuX3NhZmVOdW1iZXIoZGF0YVsnd2FpdCddKTt0aGlzLnJlY2VpdmU9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fc2FmZU51bWJlcihkYXRhWydyZWNlaXZlJ10pO3RoaXMuc3NsPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsTnVtYmVyKGRhdGFbJ3NzbCddKTt0aGlzLmNvbW1lbnQ9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxTdHJpbmcoZGF0YVsnY29tbWVudCddKTt0aGlzLl9ibG9ja2VkX3F1ZXVlaW5nPUhBUkltcG9ydGVyLkhBUkJhc2UuX29wdGlvbmFsTnVtYmVyKGRhdGFbJ19ibG9ja2VkX3F1ZXVlaW5nJ10pO3RoaXMuX2Jsb2NrZWRfcHJveHk9SEFSSW1wb3J0ZXIuSEFSQmFzZS5fb3B0aW9uYWxOdW1iZXIoZGF0YVsnX2Jsb2NrZWRfcHJveHknXSk7fX07O0hBUkltcG9ydGVyLkltcG9ydGVyPWNsYXNze3N0YXRpYyByZXF1ZXN0c0Zyb21IQVJMb2cobG9nKXtjb25zdCBwYWdlcz1uZXcgTWFwKCk7Zm9yKGNvbnN0IHBhZ2Ugb2YgbG9nLnBhZ2VzKQpwYWdlcy5zZXQocGFnZS5pZCxwYWdlKTtsb2cuZW50cmllcy5zb3J0KChhLGIpPT5hLnN0YXJ0ZWREYXRlVGltZS1iLnN0YXJ0ZWREYXRlVGltZSk7Y29uc3QgcGFnZUxvYWRzPW5ldyBNYXAoKTtjb25zdCByZXF1ZXN0cz1bXTtmb3IoY29uc3QgZW50cnkgb2YgbG9nLmVudHJpZXMpe2xldCBwYWdlTG9hZD1wYWdlTG9hZHMuZ2V0KGVudHJ5LnBhZ2VyZWYpO2NvbnN0IGRvY3VtZW50VVJMPXBhZ2VMb2FkP3BhZ2VMb2FkLm1haW5SZXF1ZXN0LnVybCgpOmVudHJ5LnJlcXVlc3QudXJsO2NvbnN0IHJlcXVlc3Q9bmV3IFNESy5OZXR3b3JrUmVxdWVzdCgnaGFyLScrcmVxdWVzdHMubGVuZ3RoLGVudHJ5LnJlcXVlc3QudXJsLGRvY3VtZW50VVJMLCcnLCcnLG51bGwpO2NvbnN0IHBhZ2U9cGFnZXMuZ2V0KGVudHJ5LnBhZ2VyZWYpO2lmKCFwYWdlTG9hZCYmcGFnZSl7cGFnZUxvYWQ9SEFSSW1wb3J0ZXIuSW1wb3J0ZXIuX2J1aWxkUGFnZUxvYWQocGFnZSxyZXF1ZXN0KTtwYWdlTG9hZHMuc2V0KGVudHJ5LnBhZ2VyZWYscGFnZUxvYWQpO30KSEFSSW1wb3J0ZXIuSW1wb3J0ZXIuX2ZpbGxSZXF1ZXN0RnJvbUhBUkVudHJ5KHJlcXVlc3QsZW50cnkscGFnZUxvYWQpO2lmKHBhZ2VMb2FkKQpwYWdlTG9hZC5iaW5kUmVxdWVzdChyZXF1ZXN0KTtyZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO30KcmV0dXJuIHJlcXVlc3RzO30Kc3RhdGljIF9idWlsZFBhZ2VMb2FkKHBhZ2UsbWFpblJlcXVlc3Qpe2NvbnN0IHBhZ2VMb2FkPW5ldyBCcm93c2VyU0RLLlBhZ2VMb2FkKG1haW5SZXF1ZXN0KTtwYWdlTG9hZC5zdGFydFRpbWU9cGFnZS5zdGFydGVkRGF0ZVRpbWU7cGFnZUxvYWQuY29udGVudExvYWRUaW1lPXBhZ2UucGFnZVRpbWluZ3Mub25Db250ZW50TG9hZCoxMDAwO3BhZ2VMb2FkLmxvYWRUaW1lPXBhZ2UucGFnZVRpbWluZ3Mub25Mb2FkKjEwMDA7cmV0dXJuIHBhZ2VMb2FkO30Kc3RhdGljIF9maWxsUmVxdWVzdEZyb21IQVJFbnRyeShyZXF1ZXN0LGVudHJ5LHBhZ2VMb2FkKXtpZihlbnRyeS5yZXF1ZXN0LnBvc3REYXRhKQpyZXF1ZXN0LnNldFJlcXVlc3RGb3JtRGF0YSh0cnVlLGVudHJ5LnJlcXVlc3QucG9zdERhdGEudGV4dCk7ZWxzZQpyZXF1ZXN0LnNldFJlcXVlc3RGb3JtRGF0YShmYWxzZSxudWxsKTtyZXF1ZXN0LmNvbm5lY3Rpb25JZD1lbnRyeS5jb25uZWN0aW9ufHwnJztyZXF1ZXN0LnJlcXVlc3RNZXRob2Q9ZW50cnkucmVxdWVzdC5tZXRob2Q7cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVycyhlbnRyeS5yZXF1ZXN0LmhlYWRlcnMpO2lmKGVudHJ5LnJlc3BvbnNlLmNvbnRlbnQubWltZVR5cGUmJmVudHJ5LnJlc3BvbnNlLmNvbnRlbnQubWltZVR5cGUhPT0neC11bmtub3duJykKcmVxdWVzdC5taW1lVHlwZT1lbnRyeS5yZXNwb25zZS5jb250ZW50Lm1pbWVUeXBlO3JlcXVlc3QucmVzcG9uc2VIZWFkZXJzPWVudHJ5LnJlc3BvbnNlLmhlYWRlcnM7cmVxdWVzdC5zdGF0dXNDb2RlPWVudHJ5LnJlc3BvbnNlLnN0YXR1cztyZXF1ZXN0LnN0YXR1c1RleHQ9ZW50cnkucmVzcG9uc2Uuc3RhdHVzVGV4dDtsZXQgcHJvdG9jb2w9ZW50cnkucmVzcG9uc2UuaHR0cFZlcnNpb24udG9Mb3dlckNhc2UoKTtpZihwcm90b2NvbD09PSdodHRwLzIuMCcpCnByb3RvY29sPSdoMic7cmVxdWVzdC5wcm90b2NvbD1wcm90b2NvbC5yZXBsYWNlKC9eaHR0cFwvMlwuMD9cK3F1aWMvLCdodHRwLzIrcXVpYycpO2NvbnN0IGlzc3VlVGltZT1lbnRyeS5zdGFydGVkRGF0ZVRpbWUuZ2V0VGltZSgpLzEwMDA7cmVxdWVzdC5zZXRJc3N1ZVRpbWUoaXNzdWVUaW1lLGlzc3VlVGltZSk7Y29uc3QgY29udGVudFNpemU9ZW50cnkucmVzcG9uc2UuY29udGVudC5zaXplPjA/ZW50cnkucmVzcG9uc2UuY29udGVudC5zaXplOjA7Y29uc3QgaGVhZGVyc1NpemU9ZW50cnkucmVzcG9uc2UuaGVhZGVyc1NpemU+MD9lbnRyeS5yZXNwb25zZS5oZWFkZXJzU2l6ZTowO2NvbnN0IGJvZHlTaXplPWVudHJ5LnJlc3BvbnNlLmJvZHlTaXplPjA/ZW50cnkucmVzcG9uc2UuYm9keVNpemU6MDtyZXF1ZXN0LnJlc291cmNlU2l6ZT1jb250ZW50U2l6ZXx8KGhlYWRlcnNTaXplK2JvZHlTaXplKTtsZXQgdHJhbnNmZXJTaXplPWVudHJ5LnJlc3BvbnNlLmN1c3RvbUFzTnVtYmVyKCd0cmFuc2ZlclNpemUnKTtpZih0cmFuc2ZlclNpemU9PT11bmRlZmluZWQpCnRyYW5zZmVyU2l6ZT1lbnRyeS5yZXNwb25zZS5oZWFkZXJzU2l6ZStlbnRyeS5yZXNwb25zZS5ib2R5U2l6ZTtyZXF1ZXN0LnNldFRyYW5zZmVyU2l6ZSh0cmFuc2ZlclNpemU+PTA/dHJhbnNmZXJTaXplOjApO2NvbnN0IGZyb21DYWNoZT1lbnRyeS5jdXN0b21Bc1N0cmluZygnZnJvbUNhY2hlJyk7aWYoZnJvbUNhY2hlPT09J21lbW9yeScpCnJlcXVlc3Quc2V0RnJvbU1lbW9yeUNhY2hlKCk7ZWxzZSBpZihmcm9tQ2FjaGU9PT0nZGlzaycpCnJlcXVlc3Quc2V0RnJvbURpc2tDYWNoZSgpO2NvbnN0IGNvbnRlbnREYXRhPXtlcnJvcjpudWxsLGNvbnRlbnQ6bnVsbCxlbmNvZGVkOmVudHJ5LnJlc3BvbnNlLmNvbnRlbnQuZW5jb2Rpbmc9PT0nYmFzZTY0J307aWYoZW50cnkucmVzcG9uc2UuY29udGVudC50ZXh0IT09dW5kZWZpbmVkKQpjb250ZW50RGF0YS5jb250ZW50PWVudHJ5LnJlc3BvbnNlLmNvbnRlbnQudGV4dDtyZXF1ZXN0LnNldENvbnRlbnREYXRhUHJvdmlkZXIoYXN5bmMoKT0+Y29udGVudERhdGEpO0hBUkltcG9ydGVyLkltcG9ydGVyLl9zZXR1cFRpbWluZyhyZXF1ZXN0LGlzc3VlVGltZSxlbnRyeS50aW1lLGVudHJ5LnRpbWluZ3MpO3JlcXVlc3Quc2V0UmVtb3RlQWRkcmVzcyhlbnRyeS5zZXJ2ZXJJUEFkZHJlc3N8fCcnLDgwKTtsZXQgcmVzb3VyY2VUeXBlPShwYWdlTG9hZCYmcGFnZUxvYWQubWFpblJlcXVlc3Q9PT1yZXF1ZXN0KT9Db21tb24ucmVzb3VyY2VUeXBlcy5Eb2N1bWVudDpDb21tb24uUmVzb3VyY2VUeXBlLmZyb21NaW1lVHlwZShlbnRyeS5yZXNwb25zZS5jb250ZW50Lm1pbWVUeXBlKTtpZighcmVzb3VyY2VUeXBlKQpyZXNvdXJjZVR5cGU9Q29tbW9uLlJlc291cmNlVHlwZS5mcm9tVVJMKGVudHJ5LnJlcXVlc3QudXJsKXx8Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXI7cmVxdWVzdC5zZXRSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKTtyZXF1ZXN0LmZpbmlzaGVkPXRydWU7fQpzdGF0aWMgX3NldHVwVGltaW5nKHJlcXVlc3QsaXNzdWVUaW1lLGVudHJ5VG90YWxEdXJhdGlvbix0aW1pbmdzKXtmdW5jdGlvbiBhY2N1bXVsYXRlVGltZSh0aW1pbmcpe2lmKHRpbWluZz09PXVuZGVmaW5lZHx8dGltaW5nPDApCnJldHVybi0xO2xhc3RFbnRyeSs9dGltaW5nO3JldHVybiBsYXN0RW50cnk7fQpsZXQgbGFzdEVudHJ5PXRpbWluZ3MuYmxvY2tlZD49MD90aW1pbmdzLmJsb2NrZWQ6MDtjb25zdCBwcm94eT10aW1pbmdzLmN1c3RvbUFzTnVtYmVyKCdibG9ja2VkX3Byb3h5Jyl8fC0xO2NvbnN0IHF1ZXVlaW5nPXRpbWluZ3MuY3VzdG9tQXNOdW1iZXIoJ2Jsb2NrZWRfcXVldWVpbmcnKXx8LTE7Y29uc3Qgc3NsPXRpbWluZ3Muc3NsPj0wP3RpbWluZ3Muc3NsOjA7aWYodGltaW5ncy5jb25uZWN0PjApCnRpbWluZ3MuY29ubmVjdC09c3NsO2NvbnN0IHRpbWluZz17cHJveHlTdGFydDpwcm94eT4wP2xhc3RFbnRyeS1wcm94eTotMSxwcm94eUVuZDpwcm94eT4wP2xhc3RFbnRyeTotMSxyZXF1ZXN0VGltZTppc3N1ZVRpbWUrKHF1ZXVlaW5nPjA/cXVldWVpbmc6MCkvMTAwMCxkbnNTdGFydDp0aW1pbmdzLmRucz49MD9sYXN0RW50cnk6LTEsZG5zRW5kOmFjY3VtdWxhdGVUaW1lKHRpbWluZ3MuZG5zKSxjb25uZWN0U3RhcnQ6dGltaW5ncy5jb25uZWN0Pj0wP2xhc3RFbnRyeTotMSxjb25uZWN0RW5kOmFjY3VtdWxhdGVUaW1lKHRpbWluZ3MuY29ubmVjdCkrc3NsLHNzbFN0YXJ0OnRpbWluZ3Muc3NsPj0wP2xhc3RFbnRyeTotMSxzc2xFbmQ6YWNjdW11bGF0ZVRpbWUodGltaW5ncy5zc2wpLHdvcmtlclN0YXJ0Oi0xLHdvcmtlclJlYWR5Oi0xLHNlbmRTdGFydDp0aW1pbmdzLnNlbmQ+PTA/bGFzdEVudHJ5Oi0xLHNlbmRFbmQ6YWNjdW11bGF0ZVRpbWUodGltaW5ncy5zZW5kKSxwdXNoU3RhcnQ6MCxwdXNoRW5kOjAscmVjZWl2ZUhlYWRlcnNFbmQ6YWNjdW11bGF0ZVRpbWUodGltaW5ncy53YWl0KX07YWNjdW11bGF0ZVRpbWUodGltaW5ncy5yZWNlaXZlKTtyZXF1ZXN0LnRpbWluZz10aW1pbmc7cmVxdWVzdC5lbmRUaW1lPWlzc3VlVGltZStNYXRoLm1heChlbnRyeVRvdGFsRHVyYXRpb24sbGFzdEVudHJ5KS8xMDAwO319OztIZWFwU25hcHNob3RNb2RlbC5IZWFwU25hcHNob3RQcm9ncmVzc0V2ZW50PXtVcGRhdGU6J1Byb2dyZXNzVXBkYXRlJyxCcm9rZW5TbmFwc2hvdDonQnJva2VuU25hcHNob3QnfTtIZWFwU25hcHNob3RNb2RlbC5iYXNlU3lzdGVtRGlzdGFuY2U9MTAwMDAwMDAwO0hlYXBTbmFwc2hvdE1vZGVsLkFsbG9jYXRpb25Ob2RlQ2FsbGVycz1jbGFzc3tjb25zdHJ1Y3Rvcihub2Rlc1dpdGhTaW5nbGVDYWxsZXIsYnJhbmNoaW5nQ2FsbGVycyl7dGhpcy5ub2Rlc1dpdGhTaW5nbGVDYWxsZXI9bm9kZXNXaXRoU2luZ2xlQ2FsbGVyO3RoaXMuYnJhbmNoaW5nQ2FsbGVycz1icmFuY2hpbmdDYWxsZXJzO319O0hlYXBTbmFwc2hvdE1vZGVsLlNlcmlhbGl6ZWRBbGxvY2F0aW9uTm9kZT1jbGFzc3tjb25zdHJ1Y3Rvcihub2RlSWQsZnVuY3Rpb25OYW1lLHNjcmlwdE5hbWUsc2NyaXB0SWQsbGluZSxjb2x1bW4sY291bnQsc2l6ZSxsaXZlQ291bnQsbGl2ZVNpemUsaGFzQ2hpbGRyZW4pe3RoaXMuaWQ9bm9kZUlkO3RoaXMubmFtZT1mdW5jdGlvbk5hbWU7dGhpcy5zY3JpcHROYW1lPXNjcmlwdE5hbWU7dGhpcy5zY3JpcHRJZD1zY3JpcHRJZDt0aGlzLmxpbmU9bGluZTt0aGlzLmNvbHVtbj1jb2x1bW47dGhpcy5jb3VudD1jb3VudDt0aGlzLnNpemU9c2l6ZTt0aGlzLmxpdmVDb3VudD1saXZlQ291bnQ7dGhpcy5saXZlU2l6ZT1saXZlU2l6ZTt0aGlzLmhhc0NoaWxkcmVuPWhhc0NoaWxkcmVuO319O0hlYXBTbmFwc2hvdE1vZGVsLkFsbG9jYXRpb25TdGFja0ZyYW1lPWNsYXNze2NvbnN0cnVjdG9yKGZ1bmN0aW9uTmFtZSxzY3JpcHROYW1lLHNjcmlwdElkLGxpbmUsY29sdW1uKXt0aGlzLmZ1bmN0aW9uTmFtZT1mdW5jdGlvbk5hbWU7dGhpcy5zY3JpcHROYW1lPXNjcmlwdE5hbWU7dGhpcy5zY3JpcHRJZD1zY3JpcHRJZDt0aGlzLmxpbmU9bGluZTt0aGlzLmNvbHVtbj1jb2x1bW47fX07SGVhcFNuYXBzaG90TW9kZWwuTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihpZCxuYW1lLGRpc3RhbmNlLG5vZGVJbmRleCxyZXRhaW5lZFNpemUsc2VsZlNpemUsdHlwZSl7dGhpcy5pZD1pZDt0aGlzLm5hbWU9bmFtZTt0aGlzLmRpc3RhbmNlPWRpc3RhbmNlO3RoaXMubm9kZUluZGV4PW5vZGVJbmRleDt0aGlzLnJldGFpbmVkU2l6ZT1yZXRhaW5lZFNpemU7dGhpcy5zZWxmU2l6ZT1zZWxmU2l6ZTt0aGlzLnR5cGU9dHlwZTt0aGlzLmNhbkJlUXVlcmllZD1mYWxzZTt0aGlzLmRldGFjaGVkRE9NVHJlZU5vZGU9ZmFsc2U7fX07SGVhcFNuYXBzaG90TW9kZWwuRWRnZT1jbGFzc3tjb25zdHJ1Y3RvcihuYW1lLG5vZGUsdHlwZSxlZGdlSW5kZXgpe3RoaXMubmFtZT1uYW1lO3RoaXMubm9kZT1ub2RlO3RoaXMudHlwZT10eXBlO3RoaXMuZWRnZUluZGV4PWVkZ2VJbmRleDt9fTtIZWFwU25hcHNob3RNb2RlbC5BZ2dyZWdhdGU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmNvdW50O3RoaXMuZGlzdGFuY2U7dGhpcy5zZWxmO3RoaXMubWF4UmV0O3RoaXMudHlwZTt0aGlzLm5hbWU7dGhpcy5pZHhzO319O0hlYXBTbmFwc2hvdE1vZGVsLkFnZ3JlZ2F0ZUZvckRpZmY9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmluZGV4ZXM9W107dGhpcy5pZHM9W107dGhpcy5zZWxmU2l6ZXM9W107fX07SGVhcFNuYXBzaG90TW9kZWwuRGlmZj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYWRkZWRDb3VudD0wO3RoaXMucmVtb3ZlZENvdW50PTA7dGhpcy5hZGRlZFNpemU9MDt0aGlzLnJlbW92ZWRTaXplPTA7dGhpcy5kZWxldGVkSW5kZXhlcz1bXTt0aGlzLmFkZGVkSW5kZXhlcz1bXTt9fTtIZWFwU25hcHNob3RNb2RlbC5EaWZmRm9yQ2xhc3M9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmFkZGVkQ291bnQ7dGhpcy5yZW1vdmVkQ291bnQ7dGhpcy5hZGRlZFNpemU7dGhpcy5yZW1vdmVkU2l6ZTt0aGlzLmRlbGV0ZWRJbmRleGVzO3RoaXMuYWRkZWRJbmRleGVzO3RoaXMuY291bnREZWx0YTt0aGlzLnNpemVEZWx0YTt9fTtIZWFwU25hcHNob3RNb2RlbC5Db21wYXJhdG9yQ29uZmlnPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5maWVsZE5hbWUxO3RoaXMuYXNjZW5kaW5nMTt0aGlzLmZpZWxkTmFtZTI7dGhpcy5hc2NlbmRpbmcyO319O0hlYXBTbmFwc2hvdE1vZGVsLldvcmtlckNvbW1hbmQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmNhbGxJZDt0aGlzLmRpc3Bvc2l0aW9uO3RoaXMub2JqZWN0SWQ7dGhpcy5uZXdPYmplY3RJZDt0aGlzLm1ldGhvZE5hbWU7dGhpcy5tZXRob2RBcmd1bWVudHM7dGhpcy5zb3VyY2U7fX07SGVhcFNuYXBzaG90TW9kZWwuSXRlbXNSYW5nZT1jbGFzc3tjb25zdHJ1Y3RvcihzdGFydFBvc2l0aW9uLGVuZFBvc2l0aW9uLHRvdGFsTGVuZ3RoLGl0ZW1zKXt0aGlzLnN0YXJ0UG9zaXRpb249c3RhcnRQb3NpdGlvbjt0aGlzLmVuZFBvc2l0aW9uPWVuZFBvc2l0aW9uO3RoaXMudG90YWxMZW5ndGg9dG90YWxMZW5ndGg7dGhpcy5pdGVtcz1pdGVtczt9fTtIZWFwU25hcHNob3RNb2RlbC5TdGF0aWNEYXRhPWNsYXNze2NvbnN0cnVjdG9yKG5vZGVDb3VudCxyb290Tm9kZUluZGV4LHRvdGFsU2l6ZSxtYXhKU09iamVjdElkKXt0aGlzLm5vZGVDb3VudD1ub2RlQ291bnQ7dGhpcy5yb290Tm9kZUluZGV4PXJvb3ROb2RlSW5kZXg7dGhpcy50b3RhbFNpemU9dG90YWxTaXplO3RoaXMubWF4SlNPYmplY3RJZD1tYXhKU09iamVjdElkO319O0hlYXBTbmFwc2hvdE1vZGVsLlN0YXRpc3RpY3M9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnRvdGFsO3RoaXMudjhoZWFwO3RoaXMubmF0aXZlO3RoaXMuY29kZTt0aGlzLmpzQXJyYXlzO3RoaXMuc3RyaW5nczt0aGlzLnN5c3RlbTt9fTtIZWFwU25hcHNob3RNb2RlbC5Ob2RlRmlsdGVyPWNsYXNze2NvbnN0cnVjdG9yKG1pbk5vZGVJZCxtYXhOb2RlSWQpe3RoaXMubWluTm9kZUlkPW1pbk5vZGVJZDt0aGlzLm1heE5vZGVJZD1tYXhOb2RlSWQ7dGhpcy5hbGxvY2F0aW9uTm9kZUlkO30KZXF1YWxzKG8pe3JldHVybiB0aGlzLm1pbk5vZGVJZD09PW8ubWluTm9kZUlkJiZ0aGlzLm1heE5vZGVJZD09PW8ubWF4Tm9kZUlkJiZ0aGlzLmFsbG9jYXRpb25Ob2RlSWQ9PT1vLmFsbG9jYXRpb25Ob2RlSWQ7fX07SGVhcFNuYXBzaG90TW9kZWwuU2VhcmNoQ29uZmlnPWNsYXNze2NvbnN0cnVjdG9yKHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZCl7dGhpcy5xdWVyeT1xdWVyeTt0aGlzLmNhc2VTZW5zaXRpdmU9Y2FzZVNlbnNpdGl2ZTt0aGlzLmlzUmVnZXg9aXNSZWdleDt0aGlzLnNob3VsZEp1bXA9c2hvdWxkSnVtcDt0aGlzLmp1bXBCYWNrd2FyZD1qdW1wQmFja3dhcmQ7fX07SGVhcFNuYXBzaG90TW9kZWwuU2FtcGxlcz1jbGFzc3tjb25zdHJ1Y3Rvcih0aW1lc3RhbXBzLGxhc3RBc3NpZ25lZElkcyxzaXplcyl7dGhpcy50aW1lc3RhbXBzPXRpbWVzdGFtcHM7dGhpcy5sYXN0QXNzaWduZWRJZHM9bGFzdEFzc2lnbmVkSWRzO3RoaXMuc2l6ZXM9c2l6ZXM7fX07O0hlbHAubGF0ZXN0UmVsZWFzZU5vdGU9ZnVuY3Rpb24oKXtpZighSGVscC5fbGF0ZXN0UmVsZWFzZU5vdGUpe0hlbHAuX2xhdGVzdFJlbGVhc2VOb3RlPUhlbHAucmVsZWFzZU5vdGVUZXh0LnJlZHVjZSgoYWNjLG5vdGUpPT5ub3RlLnZlcnNpb24+YWNjLnZlcnNpb24/bm90ZTphY2MpO30KcmV0dXJuIEhlbHAuX2xhdGVzdFJlbGVhc2VOb3RlO307SGVscC5fc2hvd1JlbGVhc2VOb3RlSWZOZWVkZWQ9ZnVuY3Rpb24oKXtIZWxwLl9pbm5lclNob3dSZWxlYXNlTm90ZUlmTmVlZGVkKEhlbHAuX3JlbGVhc2VOb3RlVmVyc2lvblNldHRpbmcuZ2V0KCksSGVscC5sYXRlc3RSZWxlYXNlTm90ZSgpLnZlcnNpb24sQ29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ2hlbHAuc2hvdy1yZWxlYXNlLW5vdGUnKS5nZXQoKSk7fTtIZWxwLl9pbm5lclNob3dSZWxlYXNlTm90ZUlmTmVlZGVkPWZ1bmN0aW9uKGxhc3RTZWVuVmVyc2lvbixsYXRlc3RWZXJzaW9uLHNob3dSZWxlYXNlTm90ZSl7aWYoIWxhc3RTZWVuVmVyc2lvbil7SGVscC5fcmVsZWFzZU5vdGVWZXJzaW9uU2V0dGluZy5zZXQobGF0ZXN0VmVyc2lvbik7cmV0dXJuO30KaWYoIXNob3dSZWxlYXNlTm90ZSkKcmV0dXJuO2lmKGxhc3RTZWVuVmVyc2lvbj49bGF0ZXN0VmVyc2lvbikKcmV0dXJuO0hlbHAuX3JlbGVhc2VOb3RlVmVyc2lvblNldHRpbmcuc2V0KGxhdGVzdFZlcnNpb24pO1VJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KEhlbHAucmVsZWFzZU5vdGVWaWV3SWQsdHJ1ZSk7fTtIZWxwLnJlbGVhc2VOb3RlVmlld0lkPSdyZWxlYXNlLW5vdGUnO0hlbHAuUmVsZWFzZU5vdGVIaWdobGlnaHQ7SGVscC5SZWxlYXNlTm90ZTtIZWxwLkhlbHBMYXRlSW5pdGlhbGl6YXRpb249Y2xhc3N7cnVuKCl7SGVscC5fc2hvd1JlbGVhc2VOb3RlSWZOZWVkZWQoKTt9fTtIZWxwLlJlbGVhc2VOb3Rlc0FjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtJbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKEhlbHAubGF0ZXN0UmVsZWFzZU5vdGUoKS5saW5rKTtyZXR1cm4gdHJ1ZTt9fTtIZWxwLl9yZWxlYXNlTm90ZVZlcnNpb25TZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdyZWxlYXNlTm90ZVZlcnNpb25TZWVuJywwKTs7SGVscC5SZWxlYXNlTm90ZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdoZWxwL3JlbGVhc2VOb3RlLmNzcycpO2NvbnN0IHJlbGVhc2VOb3RlRWxlbWVudD10aGlzLl9jcmVhdGVSZWxlYXNlTm90ZUVsZW1lbnQoSGVscC5sYXRlc3RSZWxlYXNlTm90ZSgpKTtjb25zdCB0b3BTZWN0aW9uPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlbGVhc2Utbm90ZS10b3Atc2VjdGlvbicpO3RvcFNlY3Rpb24udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKEhlbHAubGF0ZXN0UmVsZWFzZU5vdGUoKS5oZWFkZXIpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVsZWFzZU5vdGVFbGVtZW50KTt9Cl9jcmVhdGVSZWxlYXNlTm90ZUVsZW1lbnQocmVsZWFzZU5vdGUpe2NvbnN0IGhib3g9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnaGJveCcpO2NvbnN0IGNvbnRhaW5lcj1oYm94LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZWxlYXNlLW5vdGUtY29udGFpbmVyJyk7Y29uc3QgY29udGVudENvbnRhaW5lcj1jb250YWluZXIuY3JlYXRlQ2hpbGQoJ3VsJyk7Zm9yKGNvbnN0IGhpZ2hsaWdodCBvZiByZWxlYXNlTm90ZS5oaWdobGlnaHRzKXtjb25zdCBsaXN0SXRlbT1jb250ZW50Q29udGFpbmVyLmNyZWF0ZUNoaWxkKCdsaScpO2NvbnN0IHRpdGxlPVVJLlhMaW5rLmNyZWF0ZShoaWdobGlnaHQubGluayxoaWdobGlnaHQudGl0bGUrJyAnLCdyZWxlYXNlLW5vdGUtdGl0bGUnKTt0aXRsZS50aXRsZT0nJztsaXN0SXRlbS5hcHBlbmRDaGlsZCh0aXRsZSk7Y29uc3Qgc3VidGl0bGU9VUkuWExpbmsuY3JlYXRlKGhpZ2hsaWdodC5saW5rLGhpZ2hsaWdodC5zdWJ0aXRsZSsnICcsJ3JlbGVhc2Utbm90ZS1zdWJ0aXRsZScpO3N1YnRpdGxlLnRpdGxlPScnO2xpc3RJdGVtLmFwcGVuZENoaWxkKHN1YnRpdGxlKTt9CmNvbnN0IGFjdGlvbkNvbnRhaW5lcj1jb250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3JlbGVhc2Utbm90ZS1hY3Rpb24tY29udGFpbmVyJyk7YWN0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdMZWFybiBtb3JlJyksZXZlbnQ9PntldmVudC5jb25zdW1lKHRydWUpO0luc3BlY3RvckZyb250ZW5kSG9zdC5vcGVuSW5OZXdUYWIocmVsZWFzZU5vdGUubGluayk7fSkpO2FjdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xvc2UnKSxldmVudD0+e2V2ZW50LmNvbnN1bWUodHJ1ZSk7VUkuaW5zcGVjdG9yVmlldy5jbG9zZURyYXdlclRhYihIZWxwLnJlbGVhc2VOb3RlVmlld0lkLHRydWUpO30sJ2Nsb3NlLXJlbGVhc2Utbm90ZScpKTtjb25zdCBpbWFnZUxpbms9VUkuWExpbmsuY3JlYXRlKHJlbGVhc2VOb3RlLmxpbmssJyAnKTtpbWFnZUxpbmsuY2xhc3NMaXN0LmFkZCgncmVsZWFzZS1ub3RlLWltYWdlJyk7aW1hZ2VMaW5rLnRpdGxlPScnO2hib3guYXBwZW5kQ2hpbGQoaW1hZ2VMaW5rKTtjb25zdCBpbWFnZT1pbWFnZUxpbmsuY3JlYXRlQ2hpbGQoJ2ltZycpO2ltYWdlLnNyYz0nSW1hZ2VzL3doYXRzbmV3LnBuZyc7cmV0dXJuIGhib3g7fX07O2NvbnN0IGNvbnRpbnVlVG9IZXJlU2hvcnRjdXQ9SG9zdC5pc01hYygpPydDb21tYW5kJzonQ29udHJvbCc7Y29uc3QgbmV0d29ya1NlYXJjaFNob3J0Y3V0PUhvc3QuaXNNYWMoKT8nQ29tbWFuZCArIEYnOidDb250cm9sICsgRic7Y29uc3QgY29tbWFuZE1lbnVTaG9ydGN1dD1Ib3N0LmlzTWFjKCk/J0NvbW1hbmQgKyBTaGlmdCArIFAnOidDb250cm9sICsgU2hpZnQgKyBQJztIZWxwLnJlbGVhc2VOb3RlVGV4dD1be3ZlcnNpb246MTEsaGVhZGVyOidIaWdobGlnaHRzIGZyb20gdGhlIENocm9tZSA2OCB1cGRhdGUnLGhpZ2hsaWdodHM6W3t0aXRsZTonRWFnZXIgZXZhbHVhdGlvbicsc3VidGl0bGU6J1ByZXZpZXcgcmV0dXJuIHZhbHVlcyBpbiB0aGUgQ29uc29sZSB3aXRob3V0IGV4cGxpY2l0bHkgZXhlY3V0aW5nIGV4cHJlc3Npb25zLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNS9kZXZ0b29scyNlYWdlcmV2YWx1YXRpb24nLH0se3RpdGxlOidBcmd1bWVudCBoaW50cycsc3VidGl0bGU6YFZpZXcgYSBmdW5jdGlvbidzIGV4cGVjdGVkIGFyZ3VtZW50cyBpbiB0aGUgQ29uc29sZS5gLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDUvZGV2dG9vbHMjaGludHMnLH0se3RpdGxlOidGdW5jdGlvbiBhdXRvY29tcGxldGlvbicsc3VidGl0bGU6J1ZpZXcgYXZhaWxhYmxlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYWZ0ZXIgY2FsbGluZyBhIGZ1bmN0aW9uIGluIHRoZSBDb25zb2xlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNS9kZXZ0b29scyNhdXRvY29tcGxldGUnLH0se3RpdGxlOidBdWRpdHMgcGFuZWwgdXBkYXRlcycsc3VidGl0bGU6J0Zhc3RlciwgbW9yZSBjb25zaXNlbnQgYXVkaXRzLCBhIG5ldyBVSSwgYW5kIG5ldyBhdWRpdHMsIHRoYW5rcyB0byBMaWdodGhvdXNlIDMuMC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDUvZGV2dG9vbHMjbGgzJyx9XSxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE4LzA1L2RldnRvb2xzJyx9LHt2ZXJzaW9uOjEwLGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIHRoZSBDaHJvbWUgNjcgdXBkYXRlJyxoaWdobGlnaHRzOlt7dGl0bGU6J1NlYXJjaCBhY3Jvc3MgYWxsIG5ldHdvcmsgaGVhZGVycycsc3VidGl0bGU6YFByZXNzICR7bmV0d29ya1NlYXJjaFNob3J0Y3V0fSBpbiB0aGUgTmV0d29yayBwYW5lbCB0byBvcGVuIHRoZSBOZXR3b3JrIFNlYXJjaCBwYW5lLmAsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNC9kZXZ0b29scyNuZXR3b3JrLXNlYXJjaCcsfSx7dGl0bGU6J0NTUyB2YXJpYWJsZSB2YWx1ZSBwcmV2aWV3cyBpbiB0aGUgU3R5bGVzIHBhbmUnLHN1YnRpdGxlOidXaGVuIGEgcHJvcGVydHkgdmFsdWUgaXMgYSBDU1MgdmFyaWFibGUsIERldlRvb2xzIG5vdyBzaG93cyBhIGNvbG9yIHByZXZpZXcgbmV4dCB0byB0aGUgdmFyaWFibGUuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE4LzA0L2RldnRvb2xzI3ZhcnMnLH0se3RpdGxlOidTdG9wIGluZmluaXRlIGxvb3BzJyxzdWJ0aXRsZTonUGF1c2UgSmF2YVNjcmlwdCBleGVjdXRpb24gdGhlbiBzZWxlY3QgdGhlIG5ldyBTdG9wIEN1cnJlbnQgSmF2YVNjcmlwdCBDYWxsIGJ1dHRvbi4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDQvZGV2dG9vbHMjc3RvcCcsfSx7dGl0bGU6J0NvcHkgYXMgZmV0Y2gnLHN1YnRpdGxlOidSaWdodC1jbGljayBhIG5ldHdvcmsgcmVxdWVzdCB0aGVuIHNlbGVjdCBDb3B5ID4gQ29weSBhcyBmZXRjaC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDQvZGV2dG9vbHMjZmV0Y2gnLH0se3RpdGxlOidNb3JlIGF1ZGl0cycsc3VidGl0bGU6J1R3byBuZXcgYXVkaXRzLCBkZXNrdG9wIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHZpZXdpbmcgdHJhY2VzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNC9kZXZ0b29scyNhdWRpdHMnLH0se3RpdGxlOidVc2VyIFRpbWluZyBpbiB0aGUgUGVyZm9ybWFuY2UgdGFicycsc3VidGl0bGU6J0NsaWNrIHRoZSBVc2VyIFRpbWluZyBzZWN0aW9uIHRvIHZpZXcgbWVhc3VyZXMgaW4gdGhlIFN1bW1hcnksIEJvdHRvbS1VcCwgYW5kIENhbGwgVHJlZSB0YWJzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNC9kZXZ0b29scyN0YWJzJyx9LF0sbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wNC9kZXZ0b29scycsfSx7dmVyc2lvbjo5LGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIHRoZSBDaHJvbWUgNjYgdXBkYXRlJyxoaWdobGlnaHRzOlt7dGl0bGU6J1ByZXR0eS1wcmludGluZyBpbiB0aGUgUHJldmlldyBhbmQgUmVzcG9uc2UgdGFicycsc3VidGl0bGU6J1RoZSBQcmV2aWV3IHRhYiBub3cgcHJldHR5LXByaW50cyBieSBkZWZhdWx0LCBhbmQgeW91IGNhbiBmb3JjZSAnKydwcmV0dHktcHJpbnRpbmcgaW4gdGhlIFJlc3BvbnNlIHRhYiB2aWEgdGhlIG5ldyBGb3JtYXQgYnV0dG9uLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMi9kZXZ0b29scyNwcmV0dHktcHJpbnRpbmcnLH0se3RpdGxlOidQcmV2aWV3aW5nIEhUTUwgY29udGVudCBpbiB0aGUgUHJldmlldyB0YWInLHN1YnRpdGxlOidUaGUgUHJldmlldyB0YWIgbm93IGFsd2F5cyBkb2VzIGEgYmFzaWMgcmVuZGVyaW5nIG9mIEhUTUwgY29udGVudC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDIvZGV2dG9vbHMjcHJldmlld3MnLH0se3RpdGxlOidMb2NhbCBPdmVycmlkZXMgd2l0aCBzdHlsZXMgZGVmaW5lZCBpbiBIVE1MJyxzdWJ0aXRsZTonTG9jYWwgT3ZlcnJpZGVzIG5vdyB3b3JrcyB3aXRoIHN0eWxlcyBkZWZpbmVkIGluIEhUTUwsIHdpdGggb25lIGV4Y2VwdGlvbi4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDIvZGV2dG9vbHMjb3ZlcnJpZGVzJyx9LHt0aXRsZTonQmxhY2tib3hpbmcgaW4gdGhlIEluaXRpYXRvciBjb2x1bW4nLHN1YnRpdGxlOidIaWRlIGZyYW1ld29yayBzY3JpcHRzIGluIG9yZGVyIHRvIHNlZSB0aGUgYXBwIGNvZGUgdGhhdCBjYXVzZWQgYSByZXF1ZXN0LicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMi9kZXZ0b29scyNibGFja2JveGluZycsfSxdLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDIvZGV2dG9vbHMnLH0se3ZlcnNpb246OCxoZWFkZXI6J0hpZ2hsaWdodHMgZnJvbSB0aGUgQ2hyb21lIDY1IHVwZGF0ZScsaGlnaGxpZ2h0czpbe3RpdGxlOidMb2NhbCBvdmVycmlkZXMnLHN1YnRpdGxlOidPdmVycmlkZSBuZXR3b3JrIHJlcXVlc3RzIGFuZCBzZXJ2ZSBsb2NhbCByZXNvdXJjZXMgaW5zdGVhZC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDEvZGV2dG9vbHMjb3ZlcnJpZGVzJyx9LHt0aXRsZTonQ2hhbmdlcyB0YWInLHN1YnRpdGxlOidUcmFjayBjaGFuZ2VzIHRoYXQgeW91IG1ha2UgbG9jYWxseSBpbiBEZXZUb29scyB2aWEgdGhlIENoYW5nZXMgdGFiLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMS9kZXZ0b29scyNjaGFuZ2VzJyx9LHt0aXRsZTonTmV3IGFjY2Vzc2liaWxpdHkgdG9vbHMnLHN1YnRpdGxlOidJbnNwZWN0IHRoZSBhY2Nlc3NpYmlsaXR5IHByb3BlcnRpZXMgYW5kIGNvbnRyYXN0IHJhdGlvIG9mIGVsZW1lbnRzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMS9kZXZ0b29scyNhMTF5Jyx9LHt0aXRsZTonTmV3IGF1ZGl0cycsc3VidGl0bGU6J05ldyBwZXJmb3JtYW5jZSBhdWRpdHMsIGEgd2hvbGUgbmV3IGNhdGVnb3J5IG9mIFNFTyBhdWRpdHMsIGFuZCBtb3JlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMS9kZXZ0b29scyNhdWRpdHMnLH0se3RpdGxlOidDb2RlIHN0ZXBwaW5nIHVwZGF0ZXMnLHN1YnRpdGxlOidSZWxpYWJseSBzdGVwIGludG8gd2ViIHdvcmtlciBhbmQgYXN5bmNocm9ub3VzIGNvZGUuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE4LzAxL2RldnRvb2xzI3N0ZXBwaW5nJyx9LHt0aXRsZTonTXVsdGlwbGUgcmVjb3JkaW5ncyBpbiB0aGUgUGVyZm9ybWFuY2UgcGFuZWwnLHN1YnRpdGxlOidUZW1wb3JhcmlseSBzYXZlIHVwIHRvIDUgcmVjb3JkaW5ncy4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDEvZGV2dG9vbHMjcmVjb3JkaW5ncycsfSxdLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTgvMDEvZGV2dG9vbHMnLH0se3ZlcnNpb246NyxoZWFkZXI6J0hpZ2hsaWdodHMgZnJvbSB0aGUgQ2hyb21lIDY0IHVwZGF0ZScsaGlnaGxpZ2h0czpbe3RpdGxlOidQZXJmb3JtYW5jZSBtb25pdG9yJyxzdWJ0aXRsZTonR2V0IGEgcmVhbC10aW1lIHZpZXcgb2YgdmFyaW91cyBwZXJmb3JtYW5jZSBtZXRyaWNzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8xMS9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI3BlcmYtbW9uaXRvcicsfSx7dGl0bGU6J0NvbnNvbGUgc2lkZWJhcicsc3VidGl0bGU6J1JlZHVjZSBjb25zb2xlIG5vaXNlIGFuZCBmb2N1cyBvbiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIHlvdS4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMTEvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNjb25zb2xlLXNpZGViYXInLH0se3RpdGxlOidHcm91cCBzaW1pbGFyIGNvbnNvbGUgbWVzc2FnZXMnLHN1YnRpdGxlOidUaGUgQ29uc29sZSBub3cgZ3JvdXBzIHNpbWlsYXIgbWVzc2FnZXMgYnkgZGVmYXVsdC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMTEvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNncm91cC1zaW1pbGFyJyx9LF0sbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8xMS9kZXZ0b29scy1yZWxlYXNlLW5vdGVzJyx9LHt2ZXJzaW9uOjYsaGVhZGVyOidIaWdobGlnaHRzIGZyb20gdGhlIENocm9tZSA2MyB1cGRhdGUnLGhpZ2hsaWdodHM6W3t0aXRsZTonTXVsdGktY2xpZW50IHJlbW90ZSBkZWJ1Z2dpbmcnLHN1YnRpdGxlOidVc2UgRGV2VG9vbHMgd2hpbGUgZGVidWdnaW5nIHlvdXIgYXBwIGZyb20gYW4gSURFIG9yIHRlc3RpbmcgZnJhbWV3b3JrLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8xMC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI211bHRpLWNsaWVudCcsfSx7dGl0bGU6J1dvcmtzcGFjZXMgMi4wJyxzdWJ0aXRsZTonU2F2ZSBjaGFuZ2VzIG1hZGUgaW4gRGV2VG9vbHMgdG8gZGlzaywgbm93IHdpdGggbW9yZSBoZWxwZnVsIFVJIGFuZCBiZXR0ZXIgYXV0by1tYXBwaW5nLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8xMC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI3dvcmtzcGFjZXMnLH0se3RpdGxlOidGb3VyIG5ldyBhdWRpdHMnLHN1YnRpdGxlOidJbmNsdWRpbmcgIkFwcHJvcHJpYXRlIGFzcGVjdCByYXRpb3MgZm9yIGltYWdlcyIsICJBdm9pZCBKUyBsaWJyYXJpZXMgd2l0aCBrbm93biB2dWxuZXJhYmlsaXRpZXMiLCBhbmQgbW9yZS4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMTAvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNhdWRpdHMnLH0se3RpdGxlOidDdXN0b20gcHVzaCBub3RpZmljYXRpb25zJyxzdWJ0aXRsZTonU2ltdWxhdGUgcHVzaCBub3RpZmljYXRpb25zIHdpdGggY3VzdG9tIGRhdGEuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzEwL2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjcHVzaCcsfSx7dGl0bGU6J0N1c3RvbSBiYWNrZ3JvdW5kIHN5bmMgZXZlbnRzJyxzdWJ0aXRsZTonVHJpZ2dlciBiYWNrZ3JvdW5kIHN5bmMgZXZlbnRzIHdpdGggY3VzdG9tIHRhZ3MuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzEwL2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjc3luYycsfSxdLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMTAvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcycsfSx7dmVyc2lvbjo1LGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIHRoZSBDaHJvbWUgNjIgdXBkYXRlJyxoaWdobGlnaHRzOlt7dGl0bGU6J1RvcC1sZXZlbCBhd2FpdCBvcGVyYXRvcnMgaW4gdGhlIENvbnNvbGUnLHN1YnRpdGxlOidVc2UgYXdhaXQgdG8gY29udmVuaWVudGx5IGV4cGVyaW1lbnQgd2l0aCBhc3luY2hyb25vdXMgZnVuY3Rpb25zIGluIHRoZSBDb25zb2xlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wOC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2F3YWl0Jyx9LHt0aXRsZTonTmV3IHNjcmVlbnNob3Qgd29ya2Zsb3dzJyxzdWJ0aXRsZTonVGFrZSBzY3JlZW5zaG90cyBvZiBhIHBvcnRpb24gb2YgdGhlIHZpZXdwb3J0LCBvciBvZiBzcGVjaWZpYyBIVE1MIG5vZGVzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wOC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI3NjcmVlbnNob3RzJyx9LHt0aXRsZTonQ1NTIEdyaWQgaGlnaGxpZ2h0aW5nJyxzdWJ0aXRsZTonSG92ZXIgb3ZlciBhbiBlbGVtZW50IHRvIHNlZSB0aGUgQ1NTIEdyaWQgdGhhdFwncyBhZmZlY3RpbmcgaXQuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA4L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjY3NzLWdyaWQtaGlnaGxpZ2h0aW5nJyx9LHt0aXRsZTonQSBuZXcgQ29uc29sZSBBUEkgZm9yIHF1ZXJ5aW5nIG9iamVjdHMnLHN1YnRpdGxlOidDYWxsIHF1ZXJ5T2JqZWN0cyhDb25zdHJ1Y3RvcikgdG8gZ2V0IGFuIGFycmF5IG9mIG9iamVjdHMgaW5zdGFudGlhdGVkIHdpdGggdGhhdCBjb25zdHJ1Y3Rvci4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDgvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNxdWVyeS1vYmplY3RzJyx9LHt0aXRsZTonTmV3IENvbnNvbGUgZmlsdGVycycsc3VidGl0bGU6J0ZpbHRlciBvdXQgbG9nZ2luZyBub2lzZSB3aXRoIHRoZSBuZXcgbmVnYXRpdmUgYW5kIFVSTCBmaWx0ZXJzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wOC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2NvbnNvbGUtZmlsdGVycycsfSx7dGl0bGU6J0hBUiBpbXBvcnRzIGluIHRoZSBOZXR3b3JrIHBhbmVsJyxzdWJ0aXRsZTonRHJhZy1hbmQtZHJvcCBhIEhBUiBmaWxlIHRvIGFuYWx5emUgYSBwcmV2aW91cyBuZXR3b3JrIHJlY29yZGluZy4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDgvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNoYXItaW1wb3J0cycsfSx7dGl0bGU6J1ByZXZpZXdhYmxlIGNhY2hlIHJlc291cmNlcyBpbiB0aGUgQXBwbGljYXRpb24gcGFuZWwnLHN1YnRpdGxlOidDbGljayBhIHJvdyBpbiBhIENhY2hlIFN0b3JhZ2UgdGFibGUgdG8gc2VlIGEgcHJldmlldyBvZiB0aGF0IHJlc291cmNlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wOC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2NhY2hlLXByZXZpZXcnLH1dLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDgvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcycsfSx7dmVyc2lvbjo0LGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIHRoZSBDaHJvbWUgNjEgdXBkYXRlJyxoaWdobGlnaHRzOlt7dGl0bGU6J01vYmlsZSBkZXZpY2UgdGhyb3R0bGluZycsc3VidGl0bGU6J1NpbXVsYXRlIGEgbW9iaWxlIGRldmljZVwncyBDUFUgYW5kIG5ldHdvcmsgdGhyb3R0bGluZyBmcm9tIERldmljZSBNb2RlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNy9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI3Rocm90dGxpbmcnLH0se3RpdGxlOidTdG9yYWdlIHVzYWdlJyxzdWJ0aXRsZTonU2VlIGhvdyBtdWNoIHN0b3JhZ2UgKEluZGV4ZWREQiwgbG9jYWwsIHNlc3Npb24sIGNhY2hlLCBldGMuKSBhbiBvcmlnaW4gaXMgdXNpbmcuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA3L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjc3RvcmFnZScsfSx7dGl0bGU6J0NhY2hlIHRpbWVzdGFtcHMnLHN1YnRpdGxlOidWaWV3IHdoZW4gYSBzZXJ2aWNlIHdvcmtlciBjYWNoZWQgYSByZXNwb25zZS4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDcvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyN0aW1lLWNhY2hlZCcsfSx7dGl0bGU6J0VTNiBNb2R1bGVzIHN1cHBvcnQnLHN1YnRpdGxlOidEZWJ1ZyBFUzYgTW9kdWxlcyBuYXRpdmVseSBmcm9tIHRoZSBTb3VyY2VzIHBhbmVsLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNy9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI21vZHVsZXMnLH1dLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDcvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcycsfSx7dmVyc2lvbjozLGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIHRoZSBDaHJvbWUgNjAgdXBkYXRlJyxoaWdobGlnaHRzOlt7dGl0bGU6J05ldyBBdWRpdHMgcGFuZWwsIHBvd2VyZWQgYnkgTGlnaHRob3VzZScsc3VidGl0bGU6J0ZpbmQgb3V0IHdoZXRoZXIgeW91ciBzaXRlIHF1YWxpZmllcyBhcyBhIFByb2dyZXNzaXZlIFdlYiBBcHAsIG1lYXN1cmUgdGhlIGFjY2Vzc2liaWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIGEgcGFnZSwgYW5kIGRpc2NvdmVyIGJlc3QgcHJhY3RpY2VzLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNS9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2xpZ2h0aG91c2UnLH0se3RpdGxlOidUaGlyZC1wYXJ0eSBiYWRnZXMnLHN1YnRpdGxlOidTZWUgd2hhdCB0aGlyZC1wYXJ0eSBlbnRpdGllcyBhcmUgbG9nZ2luZyB0byB0aGUgQ29uc29sZSwgbWFraW5nIG5ldHdvcmsgcmVxdWVzdHMsIGFuZCBjYXVzaW5nIHdvcmsgZHVyaW5nIHBlcmZvcm1hbmNlIHJlY29yZGluZ3MuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA1L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjYmFkZ2VzJyx9LHt0aXRsZTonTmV3ICJDb250aW51ZSB0byBIZXJlIiBnZXN0dXJlJyxzdWJ0aXRsZTonV2hpbGUgcGF1c2VkIG9uIGEgbGluZSBvZiBjb2RlLCBob2xkICcrY29udGludWVUb0hlcmVTaG9ydGN1dCsnIGFuZCB0aGVuIGNsaWNrIHRvIGNvbnRpbnVlIHRvIGFub3RoZXIgbGluZSBvZiBjb2RlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNS9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2NvbnRpbnVlJyx9LHt0aXRsZTonU3RlcCBpbnRvIGFzeW5jJyxzdWJ0aXRsZTonUHJlZGljdGFibHkgc3RlcCBpbnRvIGEgcHJvbWlzZSByZXNvbHV0aW9uIG9yIG90aGVyIGFzeW5jaHJvbm91cyBjb2RlIHdpdGggYSBzaW5nbGUgZ2VzdHVyZS4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDUvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNzdGVwLWludG8tYXN5bmMnLH0se3RpdGxlOidNb3JlIGluZm9ybWF0aXZlIG9iamVjdCBwcmV2aWV3cycsc3VidGl0bGU6J0dldCBhIGJldHRlciBpZGVhIG9mIHRoZSBjb250ZW50cyBvZiBvYmplY3RzIHdoZW4gbG9nZ2luZyB0aGVtIHRvIHRoZSBDb25zb2xlLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNS9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI29iamVjdC1wcmV2aWV3cycsfSx7dGl0bGU6J1JlYWwtdGltZSBDb3ZlcmFnZSB0YWIgdXBkYXRlcycsc3VidGl0bGU6J1NlZSB3aGF0IGNvZGUgaXMgYmVpbmcgdXNlZCBpbiByZWFsLXRpbWUuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA1L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjY292ZXJhZ2UnLH1dLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDUvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcycsfSx7dmVyc2lvbjoyLGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIENocm9tZSA1OSB1cGRhdGUnLGhpZ2hsaWdodHM6W3t0aXRsZTonQ1NTIGFuZCBKUyBjb2RlIGNvdmVyYWdlJyxzdWJ0aXRsZTonRmluZCB1bnVzZWQgQ1NTIGFuZCBKUyB3aXRoIHRoZSBuZXcgQ292ZXJhZ2UgZHJhd2VyLicsbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wNC9kZXZ0b29scy1yZWxlYXNlLW5vdGVzI2NvdmVyYWdlJyx9LHt0aXRsZTonRnVsbC1wYWdlIHNjcmVlbnNob3RzJyxzdWJ0aXRsZTonVGFrZSBhIHNjcmVlbnNob3Qgb2YgdGhlIGVudGlyZSBwYWdlLCBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IHRvIHRoZSBib3R0b20uJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA0L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjc2NyZWVuc2hvdHMnLH0se3RpdGxlOidCbG9jayByZXF1ZXN0cycsc3VidGl0bGU6J01hbnVhbGx5IGRpc2FibGUgaW5kaXZpZHVhbCByZXF1ZXN0cyBpbiB0aGUgTmV0d29yayBwYW5lbC4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDQvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNibG9jay1yZXF1ZXN0cycsfSx7dGl0bGU6J1N0ZXAgb3ZlciBhc3luYyBhd2FpdCcsc3VidGl0bGU6J1N0ZXAgdGhyb3VnaCBhc3luYyBmdW5jdGlvbnMgcHJlZGljdGFibHkuJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzA0L2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjYXN5bmMnLH0se3RpdGxlOidVbmlmaWVkIENvbW1hbmQgTWVudScsc3VidGl0bGU6J0V4ZWN1dGUgY29tbWFuZHMgYW5kIG9wZW4gZmlsZXMgZnJvbSB0aGUgbmV3bHktdW5pZmllZCBDb21tYW5kIE1lbnUgKCcrY29tbWFuZE1lbnVTaG9ydGN1dCsnKS4nLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDQvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNjb21tYW5kLW1lbnUnLH1dLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDQvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcycsfSx7dmVyc2lvbjoxLGhlYWRlcjonSGlnaGxpZ2h0cyBmcm9tIENocm9tZSA1OCB1cGRhdGUnLGhpZ2hsaWdodHM6W3t0aXRsZTonTmV3IFBlcmZvcm1hbmNlIGFuZCBNZW1vcnkgcGFuZWxzJyxzdWJ0aXRsZTonSGVhZCB0byBQZXJmb3JtYW5jZSBmb3IgSmF2YVNjcmlwdCBwcm9maWxpbmcnLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDMvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNwZXJmb3JtYW5jZS1wYW5lbCcsfSx7dGl0bGU6J0VkaXRhYmxlIGNvb2tpZXMnLHN1YnRpdGxlOidZb3UgY2FuIGVkaXQgYW55IGV4aXN0aW5nIGNvb2tpZXMgYW5kIGNyZWF0ZSBuZXcgb25lcyBpbiB0aGUgQXBwbGljYXRpb24gcGFuZWwnLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDMvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNjb29raWVzJyx9LHt0aXRsZTonQ29uc29sZSBmaWx0ZXJpbmcgJiBzZXR0aW5ncycsc3VidGl0bGU6J1VzZSB0aGUgdGV4dCBmaWx0ZXIgb3IgY2xpY2sgdGhlIENvbnNvbGUgc2V0dGluZ3MgaWNvbiB0byB0b3VjaCB1cCB5b3VyIHByZWZlcmVuY2VzJyxsaW5rOidodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzAzL2RldnRvb2xzLXJlbGVhc2Utbm90ZXMjY29uc29sZScsfSx7dGl0bGU6J0RlYnVnZ2VyIGNhdGNoZXMgb3V0LW9mLW1lbW9yeSBlcnJvcnMnLHN1YnRpdGxlOidTZWUgdGhlIHN0YWNrIG9yIGdyYWIgYSBoZWFwIHNuYXBzaG90IHRvIHNlZSB3aHkgdGhlIGFwcCBtYXkgY3Jhc2gnLGxpbms6J2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDMvZGV2dG9vbHMtcmVsZWFzZS1ub3RlcyNvdXQtb2YtbWVtb3J5LWJyZWFrcG9pbnRzJyx9LF0sbGluazonaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMy9kZXZ0b29scy1yZWxlYXNlLW5vdGVzJyx9XTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImhlbHAvcmVsZWFzZU5vdGUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xufVxuXG4uaGJveCB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi5yZWxlYXNlLW5vdGUtdG9wLXNlY3Rpb24ge1xuICAgIGhlaWdodDogMjdweDtcbiAgICBsaW5lLWhlaWdodDogMjdweDtcbiAgICBwYWRkaW5nOiAwIDE1cHg7XG4gICAgZmxleDogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5yZWxlYXNlLW5vdGUtdG9wLXNlY3Rpb24ge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLnJlbGVhc2Utbm90ZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnJlbGVhc2Utbm90ZS1jb250YWluZXIgdWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcGFkZGluZzogMTBweCAxNnB4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleDogbm9uZTtcbiAgICBtYXJnaW46IDRweCAxMnB4IDAgMnB4O1xuICAgIG1heC13aWR0aDogNjAwcHg7XG59XG5cbi5yZWxlYXNlLW5vdGUtY29udGFpbmVyIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOmNvbHVtbjtcbiAgICBmbGV4OiBub25lO1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuXG4ucmVsZWFzZS1ub3RlLWNvbnRhaW5lciBsaTpob3ZlciB7XG4gICAgY29sb3I6ICMwMzliZTU7XG59XG5cbi5yZWxlYXNlLW5vdGUtdGl0bGUsXG4ucmVsZWFzZS1ub3RlLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5yZWxlYXNlLW5vdGUtc3VidGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMTNweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xufVxuXG4ucmVsZWFzZS1ub3RlLWNvbnRhaW5lciBsaTpub3QoOmhvdmVyKSAucmVsZWFzZS1ub3RlLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogIzk5OTtcbn1cblxuLnJlbGVhc2Utbm90ZS1hY3Rpb24tY29udGFpbmVyID4gYnV0dG9uIHtcbiAgICBtYXJnaW46IDEwcHggMCAyMHB4IDIwcHg7XG4gICAgY29sb3I6ICM3NTc1NzU7XG59XG5cbi5yZWxlYXNlLW5vdGUtYWN0aW9uLWNvbnRhaW5lciB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLnJlbGVhc2Utbm90ZS1pbWFnZSB7XG4gICAgZmxleC1zaHJpbms6IDI7XG59XG5cbmltZyB7XG4gICAgbWFyZ2luOiAyMHB4O1xuICAgIHdpZHRoOiAyNjBweDtcbiAgICBoZWlnaHQ6IDIwMHB4O1xuICAgIGZsZXg6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpO1xufVxuXG5pbWc6aG92ZXIge1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIC41KTtcbn1cblxuLyojIHNvdXJjZVVSTD1oZWxwL3JlbGVhc2VOb3RlLmNzcyAqLyI7SW5saW5lRWRpdG9yLkJlemllckVkaXRvcj1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2lubGluZV9lZGl0b3IvYmV6aWVyRWRpdG9yLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQudGFiSW5kZXg9MDt0aGlzLnNldERlZmF1bHRGb2N1c2VkRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9wcmV2aWV3RWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdiZXppZXItcHJldmlldy1jb250YWluZXInKTt0aGlzLl9wcmV2aWV3RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmV6aWVyLXByZXZpZXctYW5pbWF0aW9uJyk7dGhpcy5fcHJldmlld0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3N0YXJ0UHJldmlld0FuaW1hdGlvbi5iaW5kKHRoaXMpKTt0aGlzLl9wcmV2aWV3T25pb249dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmV6aWVyLXByZXZpZXctb25pb24nKTt0aGlzLl9wcmV2aWV3T25pb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3N0YXJ0UHJldmlld0FuaW1hdGlvbi5iaW5kKHRoaXMpKTt0aGlzLl9vdXRlckNvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdiZXppZXItY29udGFpbmVyJyk7dGhpcy5fcHJlc2V0c0NvbnRhaW5lcj10aGlzLl9vdXRlckNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYmV6aWVyLXByZXNldHMnKTt0aGlzLl9wcmVzZXRVST1uZXcgSW5saW5lRWRpdG9yLkJlemllclVJKDQwLDQwLDAsMixmYWxzZSk7dGhpcy5fcHJlc2V0Q2F0ZWdvcmllcz1bXTtmb3IobGV0IGk9MDtpPElubGluZUVkaXRvci5CZXppZXJFZGl0b3IuUHJlc2V0cy5sZW5ndGg7aSsrKXt0aGlzLl9wcmVzZXRDYXRlZ29yaWVzW2ldPXRoaXMuX2NyZWF0ZUNhdGVnb3J5KElubGluZUVkaXRvci5CZXppZXJFZGl0b3IuUHJlc2V0c1tpXSk7dGhpcy5fcHJlc2V0c0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9wcmVzZXRDYXRlZ29yaWVzW2ldLmljb24pO30KdGhpcy5fY3VydmVVST1uZXcgSW5saW5lRWRpdG9yLkJlemllclVJKDE1MCwyNTAsNTAsNyx0cnVlKTt0aGlzLl9jdXJ2ZT10aGlzLl9vdXRlckNvbnRhaW5lci5jcmVhdGVTVkdDaGlsZCgnc3ZnJywnYmV6aWVyLWN1cnZlJyk7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5fY3VydmUsdGhpcy5fZHJhZ1N0YXJ0LmJpbmQodGhpcyksdGhpcy5fZHJhZ01vdmUuYmluZCh0aGlzKSx0aGlzLl9kcmFnRW5kLmJpbmQodGhpcyksJ2RlZmF1bHQnKTt0aGlzLl9oZWFkZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmV6aWVyLWhlYWRlcicpO2NvbnN0IG1pbnVzPXRoaXMuX2NyZWF0ZVByZXNldE1vZGlmeUljb24odGhpcy5faGVhZGVyLCdiZXppZXItcHJlc2V0LW1pbnVzJywnTSAxMiA2IEwgOCAxMCBMIDEyIDE0Jyk7Y29uc3QgcGx1cz10aGlzLl9jcmVhdGVQcmVzZXRNb2RpZnlJY29uKHRoaXMuX2hlYWRlciwnYmV6aWVyLXByZXNldC1wbHVzJywnTSA4IDYgTCAxMiAxMCBMIDggMTQnKTttaW51cy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fcHJlc2V0TW9kaWZ5Q2xpY2tlZC5iaW5kKHRoaXMsZmFsc2UpKTtwbHVzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9wcmVzZXRNb2RpZnlDbGlja2VkLmJpbmQodGhpcyx0cnVlKSk7dGhpcy5fbGFiZWw9dGhpcy5faGVhZGVyLmNyZWF0ZUNoaWxkKCdzcGFuJywnc291cmNlLWNvZGUgYmV6aWVyLWRpc3BsYXktdmFsdWUnKTt9CnNldEJlemllcihiZXppZXIpe2lmKCFiZXppZXIpCnJldHVybjt0aGlzLl9iZXppZXI9YmV6aWVyO3RoaXMuX3VwZGF0ZVVJKCk7fQpiZXppZXIoKXtyZXR1cm4gdGhpcy5fYmV6aWVyO30Kd2FzU2hvd24oKXt0aGlzLl91bnNlbGVjdFByZXNldHMoKTtmb3IoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5fcHJlc2V0Q2F0ZWdvcmllcyl7Zm9yKGxldCBpPTA7aTxjYXRlZ29yeS5wcmVzZXRzLmxlbmd0aDtpKyspe2lmKHRoaXMuX2Jlemllci5hc0NTU1RleHQoKT09PWNhdGVnb3J5LnByZXNldHNbaV0udmFsdWUpe2NhdGVnb3J5LnByZXNldEluZGV4PWk7dGhpcy5fcHJlc2V0Q2F0ZWdvcnlTZWxlY3RlZChjYXRlZ29yeSk7fX19CnRoaXMuX3VwZGF0ZVVJKCk7dGhpcy5fc3RhcnRQcmV2aWV3QW5pbWF0aW9uKCk7fQpfb25jaGFuZ2UoKXt0aGlzLl91cGRhdGVVSSgpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKElubGluZUVkaXRvci5CZXppZXJFZGl0b3IuRXZlbnRzLkJlemllckNoYW5nZWQsdGhpcy5fYmV6aWVyLmFzQ1NTVGV4dCgpKTt9Cl91cGRhdGVVSSgpe2NvbnN0IGxhYmVsVGV4dD10aGlzLl9zZWxlY3RlZENhdGVnb3J5P3RoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkucHJlc2V0c1t0aGlzLl9zZWxlY3RlZENhdGVnb3J5LnByZXNldEluZGV4XS5uYW1lOnRoaXMuX2Jlemllci5hc0NTU1RleHQoKS5yZXBsYWNlKC9ccygtXGRcLlxkKS9nLCckMScpO3RoaXMuX2xhYmVsLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZyhsYWJlbFRleHQpO3RoaXMuX2N1cnZlVUkuZHJhd0N1cnZlKHRoaXMuX2Jlemllcix0aGlzLl9jdXJ2ZSk7dGhpcy5fcHJldmlld09uaW9uLnJlbW92ZUNoaWxkcmVuKCk7fQpfZHJhZ1N0YXJ0KGV2ZW50KXt0aGlzLl9tb3VzZURvd25Qb3NpdGlvbj1uZXcgVUkuR2VvbWV0cnkuUG9pbnQoZXZlbnQueCxldmVudC55KTtjb25zdCB1aT10aGlzLl9jdXJ2ZVVJO3RoaXMuX2NvbnRyb2xQb3NpdGlvbj1uZXcgVUkuR2VvbWV0cnkuUG9pbnQoTnVtYmVyLmNvbnN0cmFpbigoZXZlbnQub2Zmc2V0WC11aS5yYWRpdXMpL3VpLmN1cnZlV2lkdGgoKSwwLDEpLCh1aS5jdXJ2ZUhlaWdodCgpK3VpLm1hcmdpblRvcCt1aS5yYWRpdXMtZXZlbnQub2Zmc2V0WSkvdWkuY3VydmVIZWlnaHQoKSk7Y29uc3QgZmlyc3RDb250cm9sUG9pbnRJc0Nsb3Nlcj10aGlzLl9jb250cm9sUG9zaXRpb24uZGlzdGFuY2VUbyh0aGlzLl9iZXppZXIuY29udHJvbFBvaW50c1swXSk8dGhpcy5fY29udHJvbFBvc2l0aW9uLmRpc3RhbmNlVG8odGhpcy5fYmV6aWVyLmNvbnRyb2xQb2ludHNbMV0pO3RoaXMuX3NlbGVjdGVkUG9pbnQ9Zmlyc3RDb250cm9sUG9pbnRJc0Nsb3Nlcj8wOjE7dGhpcy5fYmV6aWVyLmNvbnRyb2xQb2ludHNbdGhpcy5fc2VsZWN0ZWRQb2ludF09dGhpcy5fY29udHJvbFBvc2l0aW9uO3RoaXMuX3Vuc2VsZWN0UHJlc2V0cygpO3RoaXMuX29uY2hhbmdlKCk7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm4gdHJ1ZTt9Cl91cGRhdGVDb250cm9sUG9zaXRpb24obW91c2VYLG1vdXNlWSl7Y29uc3QgZGVsdGFYPShtb3VzZVgtdGhpcy5fbW91c2VEb3duUG9zaXRpb24ueCkvdGhpcy5fY3VydmVVSS5jdXJ2ZVdpZHRoKCk7Y29uc3QgZGVsdGFZPShtb3VzZVktdGhpcy5fbW91c2VEb3duUG9zaXRpb24ueSkvdGhpcy5fY3VydmVVSS5jdXJ2ZUhlaWdodCgpO2NvbnN0IG5ld1Bvc2l0aW9uPW5ldyBVSS5HZW9tZXRyeS5Qb2ludChOdW1iZXIuY29uc3RyYWluKHRoaXMuX2NvbnRyb2xQb3NpdGlvbi54K2RlbHRhWCwwLDEpLHRoaXMuX2NvbnRyb2xQb3NpdGlvbi55LWRlbHRhWSk7dGhpcy5fYmV6aWVyLmNvbnRyb2xQb2ludHNbdGhpcy5fc2VsZWN0ZWRQb2ludF09bmV3UG9zaXRpb247fQpfZHJhZ01vdmUoZXZlbnQpe3RoaXMuX3VwZGF0ZUNvbnRyb2xQb3NpdGlvbihldmVudC54LGV2ZW50LnkpO3RoaXMuX29uY2hhbmdlKCk7fQpfZHJhZ0VuZChldmVudCl7dGhpcy5fdXBkYXRlQ29udHJvbFBvc2l0aW9uKGV2ZW50LngsZXZlbnQueSk7dGhpcy5fb25jaGFuZ2UoKTt0aGlzLl9zdGFydFByZXZpZXdBbmltYXRpb24oKTt9Cl9jcmVhdGVDYXRlZ29yeShwcmVzZXRHcm91cCl7Y29uc3QgcHJlc2V0RWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdiZXppZXItcHJlc2V0LWNhdGVnb3J5Jyk7Y29uc3QgaWNvbkVsZW1lbnQ9cHJlc2V0RWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnc3ZnJywnYmV6aWVyLXByZXNldCBtb25vc3BhY2UnKTtjb25zdCBjYXRlZ29yeT17cHJlc2V0czpwcmVzZXRHcm91cCxwcmVzZXRJbmRleDowLGljb246cHJlc2V0RWxlbWVudH07dGhpcy5fcHJlc2V0VUkuZHJhd0N1cnZlKFVJLkdlb21ldHJ5LkN1YmljQmV6aWVyLnBhcnNlKGNhdGVnb3J5LnByZXNldHNbMF0udmFsdWUpLGljb25FbGVtZW50KTtpY29uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fcHJlc2V0Q2F0ZWdvcnlTZWxlY3RlZC5iaW5kKHRoaXMsY2F0ZWdvcnkpKTtyZXR1cm4gY2F0ZWdvcnk7fQpfY3JlYXRlUHJlc2V0TW9kaWZ5SWNvbihwYXJlbnRFbGVtZW50LGNsYXNzTmFtZSxkcmF3UGF0aCl7Y29uc3QgaWNvbj1wYXJlbnRFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdzdmcnLCdiZXppZXItcHJlc2V0LW1vZGlmeSAnK2NsYXNzTmFtZSk7aWNvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywyMCk7aWNvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsMjApO2NvbnN0IHBhdGg9aWNvbi5jcmVhdGVTVkdDaGlsZCgncGF0aCcpO3BhdGguc2V0QXR0cmlidXRlKCdkJyxkcmF3UGF0aCk7cmV0dXJuIGljb247fQpfdW5zZWxlY3RQcmVzZXRzKCl7Zm9yKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMuX3ByZXNldENhdGVnb3JpZXMpCmNhdGVnb3J5Lmljb24uY2xhc3NMaXN0LnJlbW92ZSgnYmV6aWVyLXByZXNldC1zZWxlY3RlZCcpO2RlbGV0ZSB0aGlzLl9zZWxlY3RlZENhdGVnb3J5O3RoaXMuX2hlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdiZXppZXItaGVhZGVyLWFjdGl2ZScpO30KX3ByZXNldENhdGVnb3J5U2VsZWN0ZWQoY2F0ZWdvcnksZXZlbnQpe2lmKHRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnk9PT1jYXRlZ29yeSkKcmV0dXJuO3RoaXMuX3Vuc2VsZWN0UHJlc2V0cygpO3RoaXMuX2hlYWRlci5jbGFzc0xpc3QuYWRkKCdiZXppZXItaGVhZGVyLWFjdGl2ZScpO3RoaXMuX3NlbGVjdGVkQ2F0ZWdvcnk9Y2F0ZWdvcnk7dGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5pY29uLmNsYXNzTGlzdC5hZGQoJ2Jlemllci1wcmVzZXQtc2VsZWN0ZWQnKTt0aGlzLnNldEJlemllcihVSS5HZW9tZXRyeS5DdWJpY0Jlemllci5wYXJzZShjYXRlZ29yeS5wcmVzZXRzW2NhdGVnb3J5LnByZXNldEluZGV4XS52YWx1ZSkpO3RoaXMuX29uY2hhbmdlKCk7dGhpcy5fc3RhcnRQcmV2aWV3QW5pbWF0aW9uKCk7aWYoZXZlbnQpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfcHJlc2V0TW9kaWZ5Q2xpY2tlZChpbnRlbnNpZnksZXZlbnQpe2lmKCF0aGlzLl9zZWxlY3RlZENhdGVnb3J5KQpyZXR1cm47Y29uc3QgbGVuZ3RoPXRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkucHJlc2V0cy5sZW5ndGg7dGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5wcmVzZXRJbmRleD0odGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5wcmVzZXRJbmRleCsoaW50ZW5zaWZ5PzE6LTEpK2xlbmd0aCklbGVuZ3RoO3RoaXMuc2V0QmV6aWVyKFVJLkdlb21ldHJ5LkN1YmljQmV6aWVyLnBhcnNlKHRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkucHJlc2V0c1t0aGlzLl9zZWxlY3RlZENhdGVnb3J5LnByZXNldEluZGV4XS52YWx1ZSkpO3RoaXMuX29uY2hhbmdlKCk7dGhpcy5fc3RhcnRQcmV2aWV3QW5pbWF0aW9uKCk7fQpfc3RhcnRQcmV2aWV3QW5pbWF0aW9uKCl7aWYodGhpcy5fcHJldmlld0FuaW1hdGlvbikKdGhpcy5fcHJldmlld0FuaW1hdGlvbi5jYW5jZWwoKTtjb25zdCBhbmltYXRpb25EdXJhdGlvbj0xNjAwO2NvbnN0IG51bWJlck9uaW9uU2xpY2VzPTIwO2NvbnN0IGtleWZyYW1lcz1be29mZnNldDowLHRyYW5zZm9ybTondHJhbnNsYXRlWCgwcHgpJyxlYXNpbmc6dGhpcy5fYmV6aWVyLmFzQ1NTVGV4dCgpLG9wYWNpdHk6MX0se29mZnNldDowLjksdHJhbnNmb3JtOid0cmFuc2xhdGVYKDIxOHB4KScsb3BhY2l0eToxfSx7b2Zmc2V0OjEsdHJhbnNmb3JtOid0cmFuc2xhdGVYKDIxOHB4KScsb3BhY2l0eTowfV07dGhpcy5fcHJldmlld0FuaW1hdGlvbj10aGlzLl9wcmV2aWV3RWxlbWVudC5hbmltYXRlKGtleWZyYW1lcyxhbmltYXRpb25EdXJhdGlvbik7dGhpcy5fcHJldmlld09uaW9uLnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTw9bnVtYmVyT25pb25TbGljZXM7aSsrKXtjb25zdCBzbGljZT10aGlzLl9wcmV2aWV3T25pb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ2Jlemllci1wcmV2aWV3LWFuaW1hdGlvbicpO2NvbnN0IHBsYXllcj1zbGljZS5hbmltYXRlKFt7dHJhbnNmb3JtOid0cmFuc2xhdGVYKDBweCknLGVhc2luZzp0aGlzLl9iZXppZXIuYXNDU1NUZXh0KCl9LHt0cmFuc2Zvcm06J3RyYW5zbGF0ZVgoMjE4cHgpJ31dLHtkdXJhdGlvbjphbmltYXRpb25EdXJhdGlvbixmaWxsOidmb3J3YXJkcyd9KTtwbGF5ZXIucGF1c2UoKTtwbGF5ZXIuY3VycmVudFRpbWU9YW5pbWF0aW9uRHVyYXRpb24qaS9udW1iZXJPbmlvblNsaWNlczt9fX07SW5saW5lRWRpdG9yLkJlemllckVkaXRvci5FdmVudHM9e0JlemllckNoYW5nZWQ6U3ltYm9sKCdCZXppZXJDaGFuZ2VkJyl9O0lubGluZUVkaXRvci5CZXppZXJFZGl0b3IuUHJlc2V0cz1bW3tuYW1lOidlYXNlLWluLW91dCcsdmFsdWU6J2Vhc2UtaW4tb3V0J30se25hbWU6J0luIE91dCDCtyBTaW5lJyx2YWx1ZTonY3ViaWMtYmV6aWVyKDAuNDUsIDAuMDUsIDAuNTUsIDAuOTUpJ30se25hbWU6J0luIE91dCDCtyBRdWFkcmF0aWMnLHZhbHVlOidjdWJpYy1iZXppZXIoMC40NiwgMC4wMywgMC41MiwgMC45NiknfSx7bmFtZTonSW4gT3V0IMK3IEN1YmljJyx2YWx1ZTonY3ViaWMtYmV6aWVyKDAuNjUsIDAuMDUsIDAuMzYsIDEpJ30se25hbWU6J0Zhc3QgT3V0LCBTbG93IEluJyx2YWx1ZTonY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSd9LHtuYW1lOidJbiBPdXQgwrcgQmFjaycsdmFsdWU6J2N1YmljLWJlemllcigwLjY4LCAtMC41NSwgMC4yNywgMS41NSknfV0sW3tuYW1lOidGYXN0IE91dCwgTGluZWFyIEluJyx2YWx1ZTonY3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSknfSx7bmFtZTonZWFzZS1pbicsdmFsdWU6J2Vhc2UtaW4nfSx7bmFtZTonSW4gwrcgU2luZScsdmFsdWU6J2N1YmljLWJlemllcigwLjQ3LCAwLCAwLjc1LCAwLjcyKSd9LHtuYW1lOidJbiDCtyBRdWFkcmF0aWMnLHZhbHVlOidjdWJpYy1iZXppZXIoMC41NSwgMC4wOSwgMC42OCwgMC41MyknfSx7bmFtZTonSW4gwrcgQ3ViaWMnLHZhbHVlOidjdWJpYy1iZXppZXIoMC41NSwgMC4wNiwgMC42OCwgMC4xOSknfSx7bmFtZTonSW4gwrcgQmFjaycsdmFsdWU6J2N1YmljLWJlemllcigwLjYsIC0wLjI4LCAwLjc0LCAwLjA1KSd9XSxbe25hbWU6J2Vhc2Utb3V0Jyx2YWx1ZTonZWFzZS1vdXQnfSx7bmFtZTonT3V0IMK3IFNpbmUnLHZhbHVlOidjdWJpYy1iZXppZXIoMC4zOSwgMC41OCwgMC41NywgMSknfSx7bmFtZTonT3V0IMK3IFF1YWRyYXRpYycsdmFsdWU6J2N1YmljLWJlemllcigwLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0KSd9LHtuYW1lOidPdXQgwrcgQ3ViaWMnLHZhbHVlOidjdWJpYy1iZXppZXIoMC4yMiwgMC42MSwgMC4zNiwgMSknfSx7bmFtZTonTGluZWFyIE91dCwgU2xvdyBJbicsdmFsdWU6J2N1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJ30se25hbWU6J091dCDCtyBCYWNrJyx2YWx1ZTonY3ViaWMtYmV6aWVyKDAuMTgsIDAuODksIDAuMzIsIDEuMjgpJ31dXTtJbmxpbmVFZGl0b3IuQmV6aWVyRWRpdG9yLlByZXNldENhdGVnb3J5OztJbmxpbmVFZGl0b3IuQmV6aWVyVUk9Y2xhc3N7Y29uc3RydWN0b3Iod2lkdGgsaGVpZ2h0LG1hcmdpblRvcCxjb250cm9sUG9pbnRSYWRpdXMsbGluZWFyTGluZSl7dGhpcy53aWR0aD13aWR0aDt0aGlzLmhlaWdodD1oZWlnaHQ7dGhpcy5tYXJnaW5Ub3A9bWFyZ2luVG9wO3RoaXMucmFkaXVzPWNvbnRyb2xQb2ludFJhZGl1czt0aGlzLmxpbmVhckxpbmU9bGluZWFyTGluZTt9CnN0YXRpYyBkcmF3VmVsb2NpdHlDaGFydChiZXppZXIscGF0aCx3aWR0aCl7Y29uc3QgaGVpZ2h0PUlubGluZUVkaXRvci5CZXppZXJVSS5IZWlnaHQ7bGV0IHBhdGhCdWlsZGVyPVsnTScsMCxoZWlnaHRdO2NvbnN0IHNhbXBsZVNpemU9MS80MDtsZXQgcHJldj1iZXppZXIuZXZhbHVhdGVBdCgwKTtmb3IobGV0IHQ9c2FtcGxlU2l6ZTt0PDErc2FtcGxlU2l6ZTt0Kz1zYW1wbGVTaXplKXtjb25zdCBjdXJyZW50PWJlemllci5ldmFsdWF0ZUF0KHQpO2xldCBzbG9wZT0oY3VycmVudC55LXByZXYueSkvKGN1cnJlbnQueC1wcmV2LngpO2NvbnN0IHdlaWdodGVkWD1wcmV2LngqKDEtdCkrY3VycmVudC54KnQ7c2xvcGU9TWF0aC50YW5oKHNsb3BlLzEuNSk7cGF0aEJ1aWxkZXI9cGF0aEJ1aWxkZXIuY29uY2F0KFsnTCcsKHdlaWdodGVkWCp3aWR0aCkudG9GaXhlZCgyKSwoaGVpZ2h0LXNsb3BlKmhlaWdodCkudG9GaXhlZCgyKV0pO3ByZXY9Y3VycmVudDt9CnBhdGhCdWlsZGVyPXBhdGhCdWlsZGVyLmNvbmNhdChbJ0wnLHdpZHRoLnRvRml4ZWQoMiksaGVpZ2h0LCdaJ10pO3BhdGguc2V0QXR0cmlidXRlKCdkJyxwYXRoQnVpbGRlci5qb2luKCcgJykpO30KY3VydmVXaWR0aCgpe3JldHVybiB0aGlzLndpZHRoLXRoaXMucmFkaXVzKjI7fQpjdXJ2ZUhlaWdodCgpe3JldHVybiB0aGlzLmhlaWdodC10aGlzLnJhZGl1cyoyLXRoaXMubWFyZ2luVG9wKjI7fQpfZHJhd0xpbmUocGFyZW50RWxlbWVudCxjbGFzc05hbWUseDEseTEseDIseTIpe2NvbnN0IGxpbmU9cGFyZW50RWxlbWVudC5jcmVhdGVTVkdDaGlsZCgnbGluZScsY2xhc3NOYW1lKTtsaW5lLnNldEF0dHJpYnV0ZSgneDEnLHgxK3RoaXMucmFkaXVzKTtsaW5lLnNldEF0dHJpYnV0ZSgneTEnLHkxK3RoaXMucmFkaXVzK3RoaXMubWFyZ2luVG9wKTtsaW5lLnNldEF0dHJpYnV0ZSgneDInLHgyK3RoaXMucmFkaXVzKTtsaW5lLnNldEF0dHJpYnV0ZSgneTInLHkyK3RoaXMucmFkaXVzK3RoaXMubWFyZ2luVG9wKTt9Cl9kcmF3Q29udHJvbFBvaW50cyhwYXJlbnRFbGVtZW50LHN0YXJ0WCxzdGFydFksY29udHJvbFgsY29udHJvbFkpe3RoaXMuX2RyYXdMaW5lKHBhcmVudEVsZW1lbnQsJ2Jlemllci1jb250cm9sLWxpbmUnLHN0YXJ0WCxzdGFydFksY29udHJvbFgsY29udHJvbFkpO2NvbnN0IGNpcmNsZT1wYXJlbnRFbGVtZW50LmNyZWF0ZVNWR0NoaWxkKCdjaXJjbGUnLCdiZXppZXItY29udHJvbC1jaXJjbGUnKTtjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsY29udHJvbFgrdGhpcy5yYWRpdXMpO2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5Jyxjb250cm9sWSt0aGlzLnJhZGl1cyt0aGlzLm1hcmdpblRvcCk7Y2lyY2xlLnNldEF0dHJpYnV0ZSgncicsdGhpcy5yYWRpdXMpO30KZHJhd0N1cnZlKGJlemllcixzdmcpe2lmKCFiZXppZXIpCnJldHVybjtjb25zdCB3aWR0aD10aGlzLmN1cnZlV2lkdGgoKTtjb25zdCBoZWlnaHQ9dGhpcy5jdXJ2ZUhlaWdodCgpO3N2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx0aGlzLndpZHRoKTtzdmcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLHRoaXMuaGVpZ2h0KTtzdmcucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBncm91cD1zdmcuY3JlYXRlU1ZHQ2hpbGQoJ2cnKTtpZih0aGlzLmxpbmVhckxpbmUpCnRoaXMuX2RyYXdMaW5lKGdyb3VwLCdsaW5lYXItbGluZScsMCxoZWlnaHQsd2lkdGgsMCk7Y29uc3QgY3VydmU9Z3JvdXAuY3JlYXRlU1ZHQ2hpbGQoJ3BhdGgnLCdiZXppZXItcGF0aCcpO2NvbnN0IGN1cnZlUG9pbnRzPVtuZXcgVUkuR2VvbWV0cnkuUG9pbnQoYmV6aWVyLmNvbnRyb2xQb2ludHNbMF0ueCp3aWR0aCt0aGlzLnJhZGl1cywoMS1iZXppZXIuY29udHJvbFBvaW50c1swXS55KSpoZWlnaHQrdGhpcy5yYWRpdXMrdGhpcy5tYXJnaW5Ub3ApLG5ldyBVSS5HZW9tZXRyeS5Qb2ludChiZXppZXIuY29udHJvbFBvaW50c1sxXS54KndpZHRoK3RoaXMucmFkaXVzLCgxLWJlemllci5jb250cm9sUG9pbnRzWzFdLnkpKmhlaWdodCt0aGlzLnJhZGl1cyt0aGlzLm1hcmdpblRvcCksbmV3IFVJLkdlb21ldHJ5LlBvaW50KHdpZHRoK3RoaXMucmFkaXVzLHRoaXMubWFyZ2luVG9wK3RoaXMucmFkaXVzKV07Y3VydmUuc2V0QXR0cmlidXRlKCdkJywnTScrdGhpcy5yYWRpdXMrJywnKyhoZWlnaHQrdGhpcy5yYWRpdXMrdGhpcy5tYXJnaW5Ub3ApKycgQycrY3VydmVQb2ludHMuam9pbignICcpKTt0aGlzLl9kcmF3Q29udHJvbFBvaW50cyhncm91cCwwLGhlaWdodCxiZXppZXIuY29udHJvbFBvaW50c1swXS54KndpZHRoLCgxLWJlemllci5jb250cm9sUG9pbnRzWzBdLnkpKmhlaWdodCk7dGhpcy5fZHJhd0NvbnRyb2xQb2ludHMoZ3JvdXAsd2lkdGgsMCxiZXppZXIuY29udHJvbFBvaW50c1sxXS54KndpZHRoLCgxLWJlemllci5jb250cm9sUG9pbnRzWzFdLnkpKmhlaWdodCk7fX07SW5saW5lRWRpdG9yLkJlemllclVJLkhlaWdodD0yNjs7SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoPWNsYXNzIGV4dGVuZHMgSFRNTFNwYW5FbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt9CnN0YXRpYyBjcmVhdGUoKXtpZighSW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLl9jb25zdHJ1Y3Rvcil7SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLl9jb25zdHJ1Y3Rvcj1VSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ3NwYW4nLCdjb2xvci1zd2F0Y2gnLElubGluZUVkaXRvci5Db2xvclN3YXRjaC5wcm90b3R5cGUpO30KcmV0dXJuKG5ldyBJbmxpbmVFZGl0b3IuQ29sb3JTd2F0Y2guX2NvbnN0cnVjdG9yKCkpO30Kc3RhdGljIF9uZXh0Q29sb3JGb3JtYXQoY29sb3IsY3VyRm9ybWF0KXtjb25zdCBjZj1Db21tb24uQ29sb3IuRm9ybWF0O3N3aXRjaChjdXJGb3JtYXQpe2Nhc2UgY2YuT3JpZ2luYWw6cmV0dXJuIWNvbG9yLmhhc0FscGhhKCk/Y2YuUkdCOmNmLlJHQkE7Y2FzZSBjZi5SR0I6Y2FzZSBjZi5SR0JBOnJldHVybiFjb2xvci5oYXNBbHBoYSgpP2NmLkhTTDpjZi5IU0xBO2Nhc2UgY2YuSFNMOmNhc2UgY2YuSFNMQTppZihjb2xvci5uaWNrbmFtZSgpKQpyZXR1cm4gY2YuTmlja25hbWU7cmV0dXJuIGNvbG9yLmRldGVjdEhFWEZvcm1hdCgpO2Nhc2UgY2YuU2hvcnRIRVg6cmV0dXJuIGNmLkhFWDtjYXNlIGNmLlNob3J0SEVYQTpyZXR1cm4gY2YuSEVYQTtjYXNlIGNmLkhFWEE6Y2FzZSBjZi5IRVg6cmV0dXJuIGNmLk9yaWdpbmFsO2Nhc2UgY2YuTmlja25hbWU6cmV0dXJuIGNvbG9yLmRldGVjdEhFWEZvcm1hdCgpO2RlZmF1bHQ6cmV0dXJuIGNmLlJHQkE7fX0KY29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3I7fQpzZXRDb2xvcihjb2xvcil7dGhpcy5fY29sb3I9Y29sb3I7dGhpcy5fZm9ybWF0PXRoaXMuX2NvbG9yLmZvcm1hdCgpO2NvbnN0IGNvbG9yU3RyaW5nPSh0aGlzLl9jb2xvci5hc1N0cmluZyh0aGlzLl9mb3JtYXQpKTt0aGlzLnNldFRleHQoY29sb3JTdHJpbmcpO3RoaXMuX3N3YXRjaElubmVyLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jb2xvclN0cmluZzt9CmhpZGVUZXh0KGhpZGUpe3RoaXMuX2NvbG9yVmFsdWVFbGVtZW50LmhpZGRlbj1oaWRlO30Kc2V0VGV4dCh0ZXh0LHRvb2x0aXApe3RoaXMuX2NvbG9yVmFsdWVFbGVtZW50LnRleHRDb250ZW50PXRleHQ7dGhpcy5fY29sb3JWYWx1ZUVsZW1lbnQudGl0bGU9dG9vbHRpcDt9CmZvcm1hdCgpe3JldHVybiB0aGlzLl9mb3JtYXQ7fQpzZXRGb3JtYXQoZm9ybWF0KXt0aGlzLl9mb3JtYXQ9Zm9ybWF0O3RoaXMuc2V0VGV4dCh0aGlzLl9jb2xvci5hc1N0cmluZyh0aGlzLl9mb3JtYXQpKTt9CnRvZ2dsZU5leHRGb3JtYXQoKXtsZXQgY3VycmVudFZhbHVlO2Rve3RoaXMuX2Zvcm1hdD1JbmxpbmVFZGl0b3IuQ29sb3JTd2F0Y2guX25leHRDb2xvckZvcm1hdCh0aGlzLl9jb2xvcix0aGlzLl9mb3JtYXQpO2N1cnJlbnRWYWx1ZT10aGlzLl9jb2xvci5hc1N0cmluZyh0aGlzLl9mb3JtYXQpO313aGlsZShjdXJyZW50VmFsdWU9PT10aGlzLl9jb2xvclZhbHVlRWxlbWVudC50ZXh0Q29udGVudCk7dGhpcy5zZXRUZXh0KGN1cnJlbnRWYWx1ZSk7fQppY29uRWxlbWVudCgpe3JldHVybiB0aGlzLl9pY29uRWxlbWVudDt9CmNyZWF0ZWRDYWxsYmFjaygpe2NvbnN0IHJvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMsJ2lubGluZV9lZGl0b3IvY29sb3JTd2F0Y2guY3NzJyk7dGhpcy5faWNvbkVsZW1lbnQ9cm9vdC5jcmVhdGVDaGlsZCgnc3BhbicsJ2NvbG9yLXN3YXRjaCcpO3RoaXMuX2ljb25FbGVtZW50LnRpdGxlPUNvbW1vbi5VSVN0cmluZygnU2hpZnQtY2xpY2sgdG8gY2hhbmdlIGNvbG9yIGZvcm1hdCcpO3RoaXMuX3N3YXRjaElubmVyPXRoaXMuX2ljb25FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnY29sb3Itc3dhdGNoLWlubmVyJyk7dGhpcy5fc3dhdGNoSW5uZXIuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLGU9PmUuY29uc3VtZSgpLGZhbHNlKTt0aGlzLl9zd2F0Y2hJbm5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGU9PmUuY29uc3VtZSgpLGZhbHNlKTt0aGlzLl9zd2F0Y2hJbm5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faGFuZGxlQ2xpY2suYmluZCh0aGlzKSx0cnVlKTtyb290LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7dGhpcy5fY29sb3JWYWx1ZUVsZW1lbnQ9dGhpcy5jcmVhdGVDaGlsZCgnc3BhbicpO30KX2hhbmRsZUNsaWNrKGV2ZW50KXtpZighZXZlbnQuc2hpZnRLZXkpCnJldHVybjtldmVudC50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLmhvc3QudG9nZ2xlTmV4dEZvcm1hdCgpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fX07SW5saW5lRWRpdG9yLkJlemllclN3YXRjaD1jbGFzcyBleHRlbmRzIEhUTUxTcGFuRWxlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7fQpzdGF0aWMgY3JlYXRlKCl7aWYoIUlubGluZUVkaXRvci5CZXppZXJTd2F0Y2guX2NvbnN0cnVjdG9yKXtJbmxpbmVFZGl0b3IuQmV6aWVyU3dhdGNoLl9jb25zdHJ1Y3Rvcj1VSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ3NwYW4nLCdiZXppZXItc3dhdGNoJyxJbmxpbmVFZGl0b3IuQmV6aWVyU3dhdGNoLnByb3RvdHlwZSk7fQpyZXR1cm4obmV3IElubGluZUVkaXRvci5CZXppZXJTd2F0Y2guX2NvbnN0cnVjdG9yKCkpO30KYmV6aWVyVGV4dCgpe3JldHVybiB0aGlzLl90ZXh0RWxlbWVudC50ZXh0Q29udGVudDt9CnNldEJlemllclRleHQodGV4dCl7dGhpcy5fdGV4dEVsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDt9CmhpZGVUZXh0KGhpZGUpe3RoaXMuX3RleHRFbGVtZW50LmhpZGRlbj1oaWRlO30KaWNvbkVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faWNvbkVsZW1lbnQ7fQpjcmVhdGVkQ2FsbGJhY2soKXtjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLCdpbmxpbmVfZWRpdG9yL2JlemllclN3YXRjaC5jc3MnKTt0aGlzLl9pY29uRWxlbWVudD1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLWJlemllcicsJ2Jlemllci1zd2F0Y2gtaWNvbicpO3Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5faWNvbkVsZW1lbnQpO3RoaXMuX3RleHRFbGVtZW50PXRoaXMuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtyb290LmNyZWF0ZUNoaWxkKCdjb250ZW50Jyk7fX07SW5saW5lRWRpdG9yLkNTU1NoYWRvd1N3YXRjaD1jbGFzcyBleHRlbmRzIEhUTUxTcGFuRWxlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7fQpzdGF0aWMgY3JlYXRlKCl7aWYoIUlubGluZUVkaXRvci5DU1NTaGFkb3dTd2F0Y2guX2NvbnN0cnVjdG9yKXtJbmxpbmVFZGl0b3IuQ1NTU2hhZG93U3dhdGNoLl9jb25zdHJ1Y3Rvcj1VSS5yZWdpc3RlckN1c3RvbUVsZW1lbnQoJ3NwYW4nLCdjc3Mtc2hhZG93LXN3YXRjaCcsSW5saW5lRWRpdG9yLkNTU1NoYWRvd1N3YXRjaC5wcm90b3R5cGUpO30KcmV0dXJuKG5ldyBJbmxpbmVFZGl0b3IuQ1NTU2hhZG93U3dhdGNoLl9jb25zdHJ1Y3RvcigpKTt9Cm1vZGVsKCl7cmV0dXJuIHRoaXMuX21vZGVsO30Kc2V0Q1NTU2hhZG93KG1vZGVsKXt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHJlc3VsdHM9VGV4dFV0aWxzLlRleHRVdGlscy5zcGxpdFN0cmluZ0J5UmVnZXhlcyhtb2RlbC5hc0NTU1RleHQoKSxbL2luc2V0L2csQ29tbW9uLkNvbG9yLlJlZ2V4XSk7Zm9yKGxldCBpPTA7aTxyZXN1bHRzLmxlbmd0aDtpKyspe2NvbnN0IHJlc3VsdD1yZXN1bHRzW2ldO2lmKHJlc3VsdC5yZWdleEluZGV4PT09MSl7aWYoIXRoaXMuX2NvbG9yU3dhdGNoKQp0aGlzLl9jb2xvclN3YXRjaD1JbmxpbmVFZGl0b3IuQ29sb3JTd2F0Y2guY3JlYXRlKCk7dGhpcy5fY29sb3JTd2F0Y2guc2V0Q29sb3IobW9kZWwuY29sb3IoKSk7dGhpcy5fY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29sb3JTd2F0Y2gpO31lbHNle3RoaXMuX2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKHJlc3VsdC52YWx1ZSkpO319fQpoaWRlVGV4dChoaWRlKXt0aGlzLl9jb250ZW50RWxlbWVudC5oaWRkZW49aGlkZTt9Cmljb25FbGVtZW50KCl7cmV0dXJuIHRoaXMuX2ljb25FbGVtZW50O30KY29sb3JTd2F0Y2goKXtyZXR1cm4gdGhpcy5fY29sb3JTd2F0Y2g7fQpjcmVhdGVkQ2FsbGJhY2soKXtjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLCdpbmxpbmVfZWRpdG9yL2Nzc1NoYWRvd1N3YXRjaC5jc3MnKTt0aGlzLl9pY29uRWxlbWVudD1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXNoYWRvdycsJ3NoYWRvdy1zd2F0Y2gtaWNvbicpO3Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5faWNvbkVsZW1lbnQpO3Jvb3QuY3JlYXRlQ2hpbGQoJ2NvbnRlbnQnKTt0aGlzLl9jb250ZW50RWxlbWVudD10aGlzLmNyZWF0ZUNoaWxkKCdzcGFuJyk7fX07O0lubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3I9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdpbmxpbmVfZWRpdG9yL2Nzc1NoYWRvd0VkaXRvci5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5fdHlwZUZpZWxkPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NoYWRvdy1lZGl0b3ItZmllbGQgc2hhZG93LWVkaXRvci1mbGV4LWZpZWxkJyk7dGhpcy5fdHlwZUZpZWxkLmNyZWF0ZUNoaWxkKCdsYWJlbCcsJ3NoYWRvdy1lZGl0b3ItbGFiZWwnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1R5cGUnKTt0aGlzLl9vdXRzZXRCdXR0b249dGhpcy5fdHlwZUZpZWxkLmNyZWF0ZUNoaWxkKCdidXR0b24nLCdzaGFkb3ctZWRpdG9yLWJ1dHRvbi1sZWZ0Jyk7dGhpcy5fb3V0c2V0QnV0dG9uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnT3V0c2V0Jyk7dGhpcy5fb3V0c2V0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkJ1dHRvbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2luc2V0QnV0dG9uPXRoaXMuX3R5cGVGaWVsZC5jcmVhdGVDaGlsZCgnYnV0dG9uJywnc2hhZG93LWVkaXRvci1idXR0b24tcmlnaHQnKTt0aGlzLl9pbnNldEJ1dHRvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0luc2V0Jyk7dGhpcy5faW5zZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uQnV0dG9uQ2xpY2suYmluZCh0aGlzKSxmYWxzZSk7Y29uc3QgeEZpZWxkPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NoYWRvdy1lZGl0b3ItZmllbGQnKTt0aGlzLl94SW5wdXQ9dGhpcy5fY3JlYXRlVGV4dElucHV0KHhGaWVsZCxDb21tb24uVUlTdHJpbmcoJ1ggb2Zmc2V0JykpO2NvbnN0IHlGaWVsZD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzaGFkb3ctZWRpdG9yLWZpZWxkJyk7dGhpcy5feUlucHV0PXRoaXMuX2NyZWF0ZVRleHRJbnB1dCh5RmllbGQsQ29tbW9uLlVJU3RyaW5nKCdZIG9mZnNldCcpKTt0aGlzLl94eVNsaWRlcj14RmllbGQuY3JlYXRlQ2hpbGQoJ2NhbnZhcycsJ3NoYWRvdy1lZGl0b3ItMkQtc2xpZGVyJyk7dGhpcy5feHlTbGlkZXIud2lkdGg9SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5jYW52YXNTaXplO3RoaXMuX3h5U2xpZGVyLmhlaWdodD1JbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmNhbnZhc1NpemU7dGhpcy5feHlTbGlkZXIudGFiSW5kZXg9LTE7dGhpcy5faGFsZkNhbnZhc1NpemU9SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5jYW52YXNTaXplLzI7dGhpcy5faW5uZXJDYW52YXNTaXplPXRoaXMuX2hhbGZDYW52YXNTaXplLUlubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3Iuc2xpZGVyVGh1bWJSYWRpdXM7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5feHlTbGlkZXIsdGhpcy5fZHJhZ1N0YXJ0LmJpbmQodGhpcyksdGhpcy5fZHJhZ01vdmUuYmluZCh0aGlzKSxudWxsLCdkZWZhdWx0Jyk7dGhpcy5feHlTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25DYW52YXNBcnJvd0tleS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl94eVNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdibHVyJyx0aGlzLl9vbkNhbnZhc0JsdXIuYmluZCh0aGlzKSxmYWxzZSk7Y29uc3QgYmx1ckZpZWxkPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NoYWRvdy1lZGl0b3ItZmllbGQgc2hhZG93LWVkaXRvci1mbGV4LWZpZWxkIHNoYWRvdy1lZGl0b3ItYmx1ci1maWVsZCcpO3RoaXMuX2JsdXJJbnB1dD10aGlzLl9jcmVhdGVUZXh0SW5wdXQoYmx1ckZpZWxkLENvbW1vbi5VSVN0cmluZygnQmx1cicpKTt0aGlzLl9ibHVyU2xpZGVyPXRoaXMuX2NyZWF0ZVNsaWRlcihibHVyRmllbGQpO3RoaXMuX3NwcmVhZEZpZWxkPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NoYWRvdy1lZGl0b3ItZmllbGQgc2hhZG93LWVkaXRvci1mbGV4LWZpZWxkJyk7dGhpcy5fc3ByZWFkSW5wdXQ9dGhpcy5fY3JlYXRlVGV4dElucHV0KHRoaXMuX3NwcmVhZEZpZWxkLENvbW1vbi5VSVN0cmluZygnU3ByZWFkJykpO3RoaXMuX3NwcmVhZFNsaWRlcj10aGlzLl9jcmVhdGVTbGlkZXIodGhpcy5fc3ByZWFkRmllbGQpO30KX2NyZWF0ZVRleHRJbnB1dChmaWVsZCxwcm9wZXJ0eU5hbWUpe2NvbnN0IGxhYmVsPWZpZWxkLmNyZWF0ZUNoaWxkKCdsYWJlbCcsJ3NoYWRvdy1lZGl0b3ItbGFiZWwnKTtsYWJlbC50ZXh0Q29udGVudD1wcm9wZXJ0eU5hbWU7bGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLHByb3BlcnR5TmFtZSk7Y29uc3QgdGV4dElucHV0PVVJLmNyZWF0ZUlucHV0KCdzaGFkb3ctZWRpdG9yLXRleHQtaW5wdXQnLCd0ZXh0Jyk7ZmllbGQuYXBwZW5kQ2hpbGQodGV4dElucHV0KTt0ZXh0SW5wdXQuaWQ9cHJvcGVydHlOYW1lO3RleHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9oYW5kbGVWYWx1ZU1vZGlmaWNhdGlvbi5iaW5kKHRoaXMpLGZhbHNlKTt0ZXh0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsdGhpcy5faGFuZGxlVmFsdWVNb2RpZmljYXRpb24uYmluZCh0aGlzKSxmYWxzZSk7dGV4dElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jyx0aGlzLl9vblRleHRJbnB1dC5iaW5kKHRoaXMpLGZhbHNlKTt0ZXh0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsdGhpcy5fb25UZXh0Qmx1ci5iaW5kKHRoaXMpLGZhbHNlKTtyZXR1cm4gdGV4dElucHV0O30KX2NyZWF0ZVNsaWRlcihmaWVsZCl7Y29uc3Qgc2xpZGVyPVVJLmNyZWF0ZVNsaWRlckxhYmVsKDAsSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5tYXhSYW5nZSwtMSk7c2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jyx0aGlzLl9vblNsaWRlcklucHV0LmJpbmQodGhpcyksZmFsc2UpO2ZpZWxkLmFwcGVuZENoaWxkKHNsaWRlcik7cmV0dXJuIHNsaWRlcjt9Cndhc1Nob3duKCl7dGhpcy5fdXBkYXRlVUkoKTt9CnNldE1vZGVsKG1vZGVsKXt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl90eXBlRmllbGQuaGlkZGVuPSFtb2RlbC5pc0JveFNoYWRvdygpO3RoaXMuX3NwcmVhZEZpZWxkLmhpZGRlbj0hbW9kZWwuaXNCb3hTaGFkb3coKTt0aGlzLl91cGRhdGVVSSgpO30KX3VwZGF0ZVVJKCl7dGhpcy5fdXBkYXRlQnV0dG9ucygpO3RoaXMuX3hJbnB1dC52YWx1ZT10aGlzLl9tb2RlbC5vZmZzZXRYKCkuYXNDU1NUZXh0KCk7dGhpcy5feUlucHV0LnZhbHVlPXRoaXMuX21vZGVsLm9mZnNldFkoKS5hc0NTU1RleHQoKTt0aGlzLl9ibHVySW5wdXQudmFsdWU9dGhpcy5fbW9kZWwuYmx1clJhZGl1cygpLmFzQ1NTVGV4dCgpO3RoaXMuX3NwcmVhZElucHV0LnZhbHVlPXRoaXMuX21vZGVsLnNwcmVhZFJhZGl1cygpLmFzQ1NTVGV4dCgpO3RoaXMuX2JsdXJTbGlkZXIudmFsdWU9dGhpcy5fbW9kZWwuYmx1clJhZGl1cygpLmFtb3VudDt0aGlzLl9zcHJlYWRTbGlkZXIudmFsdWU9dGhpcy5fbW9kZWwuc3ByZWFkUmFkaXVzKCkuYW1vdW50O3RoaXMuX3VwZGF0ZUNhbnZhcyhmYWxzZSk7fQpfdXBkYXRlQnV0dG9ucygpe3RoaXMuX2luc2V0QnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ2VuYWJsZWQnLHRoaXMuX21vZGVsLmluc2V0KCkpO3RoaXMuX291dHNldEJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdlbmFibGVkJywhdGhpcy5fbW9kZWwuaW5zZXQoKSk7fQpfdXBkYXRlQ2FudmFzKGRyYXdGb2N1cyl7Y29uc3QgY29udGV4dD10aGlzLl94eVNsaWRlci5nZXRDb250ZXh0KCcyZCcpO2NvbnRleHQuY2xlYXJSZWN0KDAsMCx0aGlzLl94eVNsaWRlci53aWR0aCx0aGlzLl94eVNsaWRlci5oZWlnaHQpO2NvbnRleHQuc2F2ZSgpO2NvbnRleHQuc2V0TGluZURhc2goWzEsMV0pO2NvbnRleHQuc3Ryb2tlU3R5bGU9J3JnYmEoMjEwLCAyMTAsIDIxMCwgMC44KSc7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0Lm1vdmVUbyh0aGlzLl9oYWxmQ2FudmFzU2l6ZSwwKTtjb250ZXh0LmxpbmVUbyh0aGlzLl9oYWxmQ2FudmFzU2l6ZSxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmNhbnZhc1NpemUpO2NvbnRleHQubW92ZVRvKDAsdGhpcy5faGFsZkNhbnZhc1NpemUpO2NvbnRleHQubGluZVRvKElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IuY2FudmFzU2l6ZSx0aGlzLl9oYWxmQ2FudmFzU2l6ZSk7Y29udGV4dC5zdHJva2UoKTtjb250ZXh0LnJlc3RvcmUoKTtjb25zdCB0aHVtYlBvaW50PXRoaXMuX3NsaWRlclRodW1iUG9zaXRpb24oKTtjb250ZXh0LnNhdmUoKTtjb250ZXh0LnRyYW5zbGF0ZSh0aGlzLl9oYWxmQ2FudmFzU2l6ZSx0aGlzLl9oYWxmQ2FudmFzU2l6ZSk7Y29udGV4dC5saW5lV2lkdGg9Mjtjb250ZXh0LnN0cm9rZVN0eWxlPSdyZ2JhKDEzMCwgMTMwLCAxMzAsIDAuNzUpJztjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKDAsMCk7Y29udGV4dC5saW5lVG8odGh1bWJQb2ludC54LHRodW1iUG9pbnQueSk7Y29udGV4dC5zdHJva2UoKTtpZihkcmF3Rm9jdXMpe2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5maWxsU3R5bGU9J3JnYmEoNjYsIDEzMywgMjQ0LCAwLjQpJztjb250ZXh0LmFyYyh0aHVtYlBvaW50LngsdGh1bWJQb2ludC55LElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3Iuc2xpZGVyVGh1bWJSYWRpdXMrMiwwLDIqTWF0aC5QSSk7Y29udGV4dC5maWxsKCk7fQpjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuZmlsbFN0eWxlPScjNDI4NUY0Jztjb250ZXh0LmFyYyh0aHVtYlBvaW50LngsdGh1bWJQb2ludC55LElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3Iuc2xpZGVyVGh1bWJSYWRpdXMsMCwyKk1hdGguUEkpO2NvbnRleHQuZmlsbCgpO2NvbnRleHQucmVzdG9yZSgpO30KX29uQnV0dG9uQ2xpY2soZXZlbnQpe2NvbnN0IGluc2V0Q2xpY2tlZD0oZXZlbnQuY3VycmVudFRhcmdldD09PXRoaXMuX2luc2V0QnV0dG9uKTtpZihpbnNldENsaWNrZWQmJnRoaXMuX21vZGVsLmluc2V0KCl8fCFpbnNldENsaWNrZWQmJiF0aGlzLl9tb2RlbC5pbnNldCgpKQpyZXR1cm47dGhpcy5fbW9kZWwuc2V0SW5zZXQoaW5zZXRDbGlja2VkKTt0aGlzLl91cGRhdGVCdXR0b25zKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5FdmVudHMuU2hhZG93Q2hhbmdlZCx0aGlzLl9tb2RlbCk7fQpfaGFuZGxlVmFsdWVNb2RpZmljYXRpb24oZXZlbnQpe2NvbnN0IG1vZGlmaWVkVmFsdWU9VUkuY3JlYXRlUmVwbGFjZW1lbnRTdHJpbmcoZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSxldmVudCxjdXN0b21OdW1iZXJIYW5kbGVyKTtpZighbW9kaWZpZWRWYWx1ZSkKcmV0dXJuO2NvbnN0IGxlbmd0aD1JbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoLnBhcnNlKG1vZGlmaWVkVmFsdWUpO2lmKCFsZW5ndGgpCnJldHVybjtpZihldmVudC5jdXJyZW50VGFyZ2V0PT09dGhpcy5fYmx1cklucHV0JiZsZW5ndGguYW1vdW50PDApCmxlbmd0aC5hbW91bnQ9MDtldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlPWxlbmd0aC5hc0NTU1RleHQoKTtldmVudC5jdXJyZW50VGFyZ2V0LnNlbGVjdGlvblN0YXJ0PTA7ZXZlbnQuY3VycmVudFRhcmdldC5zZWxlY3Rpb25FbmQ9ZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZS5sZW5ndGg7dGhpcy5fb25UZXh0SW5wdXQoZXZlbnQpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7ZnVuY3Rpb24gY3VzdG9tTnVtYmVySGFuZGxlcihwcmVmaXgsbnVtYmVyLHN1ZmZpeCl7aWYoIXN1ZmZpeC5sZW5ndGgpCnN1ZmZpeD1JbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmRlZmF1bHRVbml0O3JldHVybiBwcmVmaXgrbnVtYmVyK3N1ZmZpeDt9fQpfb25UZXh0SW5wdXQoZXZlbnQpe3RoaXMuX2NoYW5nZWRFbGVtZW50PWV2ZW50LmN1cnJlbnRUYXJnZXQ7dGhpcy5fY2hhbmdlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaW52YWxpZCcpO2NvbnN0IGxlbmd0aD1JbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoLnBhcnNlKGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUpO2lmKCFsZW5ndGh8fGV2ZW50LmN1cnJlbnRUYXJnZXQ9PT10aGlzLl9ibHVySW5wdXQmJmxlbmd0aC5hbW91bnQ8MCkKcmV0dXJuO2lmKGV2ZW50LmN1cnJlbnRUYXJnZXQ9PT10aGlzLl94SW5wdXQpe3RoaXMuX21vZGVsLnNldE9mZnNldFgobGVuZ3RoKTt0aGlzLl91cGRhdGVDYW52YXMoZmFsc2UpO31lbHNlIGlmKGV2ZW50LmN1cnJlbnRUYXJnZXQ9PT10aGlzLl95SW5wdXQpe3RoaXMuX21vZGVsLnNldE9mZnNldFkobGVuZ3RoKTt0aGlzLl91cGRhdGVDYW52YXMoZmFsc2UpO31lbHNlIGlmKGV2ZW50LmN1cnJlbnRUYXJnZXQ9PT10aGlzLl9ibHVySW5wdXQpe3RoaXMuX21vZGVsLnNldEJsdXJSYWRpdXMobGVuZ3RoKTt0aGlzLl9ibHVyU2xpZGVyLnZhbHVlPWxlbmd0aC5hbW91bnQ7fWVsc2UgaWYoZXZlbnQuY3VycmVudFRhcmdldD09PXRoaXMuX3NwcmVhZElucHV0KXt0aGlzLl9tb2RlbC5zZXRTcHJlYWRSYWRpdXMobGVuZ3RoKTt0aGlzLl9zcHJlYWRTbGlkZXIudmFsdWU9bGVuZ3RoLmFtb3VudDt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IuRXZlbnRzLlNoYWRvd0NoYW5nZWQsdGhpcy5fbW9kZWwpO30KX29uVGV4dEJsdXIoKXtpZighdGhpcy5fY2hhbmdlZEVsZW1lbnQpCnJldHVybjtsZXQgbGVuZ3RoPSF0aGlzLl9jaGFuZ2VkRWxlbWVudC52YWx1ZS50cmltKCk/SW5saW5lRWRpdG9yLkNTU0xlbmd0aC56ZXJvKCk6SW5saW5lRWRpdG9yLkNTU0xlbmd0aC5wYXJzZSh0aGlzLl9jaGFuZ2VkRWxlbWVudC52YWx1ZSk7aWYoIWxlbmd0aCkKbGVuZ3RoPUlubGluZUVkaXRvci5DU1NMZW5ndGgucGFyc2UodGhpcy5fY2hhbmdlZEVsZW1lbnQudmFsdWUrSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdCk7aWYoIWxlbmd0aCl7dGhpcy5fY2hhbmdlZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaW52YWxpZCcpO3RoaXMuX2NoYW5nZWRFbGVtZW50PW51bGw7cmV0dXJuO30KaWYodGhpcy5fY2hhbmdlZEVsZW1lbnQ9PT10aGlzLl94SW5wdXQpe3RoaXMuX21vZGVsLnNldE9mZnNldFgobGVuZ3RoKTt0aGlzLl94SW5wdXQudmFsdWU9bGVuZ3RoLmFzQ1NTVGV4dCgpO3RoaXMuX3VwZGF0ZUNhbnZhcyhmYWxzZSk7fWVsc2UgaWYodGhpcy5fY2hhbmdlZEVsZW1lbnQ9PT10aGlzLl95SW5wdXQpe3RoaXMuX21vZGVsLnNldE9mZnNldFkobGVuZ3RoKTt0aGlzLl95SW5wdXQudmFsdWU9bGVuZ3RoLmFzQ1NTVGV4dCgpO3RoaXMuX3VwZGF0ZUNhbnZhcyhmYWxzZSk7fWVsc2UgaWYodGhpcy5fY2hhbmdlZEVsZW1lbnQ9PT10aGlzLl9ibHVySW5wdXQpe2lmKGxlbmd0aC5hbW91bnQ8MCkKbGVuZ3RoPUlubGluZUVkaXRvci5DU1NMZW5ndGguemVybygpO3RoaXMuX21vZGVsLnNldEJsdXJSYWRpdXMobGVuZ3RoKTt0aGlzLl9ibHVySW5wdXQudmFsdWU9bGVuZ3RoLmFzQ1NTVGV4dCgpO3RoaXMuX2JsdXJTbGlkZXIudmFsdWU9bGVuZ3RoLmFtb3VudDt9ZWxzZSBpZih0aGlzLl9jaGFuZ2VkRWxlbWVudD09PXRoaXMuX3NwcmVhZElucHV0KXt0aGlzLl9tb2RlbC5zZXRTcHJlYWRSYWRpdXMobGVuZ3RoKTt0aGlzLl9zcHJlYWRJbnB1dC52YWx1ZT1sZW5ndGguYXNDU1NUZXh0KCk7dGhpcy5fc3ByZWFkU2xpZGVyLnZhbHVlPWxlbmd0aC5hbW91bnQ7fQp0aGlzLl9jaGFuZ2VkRWxlbWVudD1udWxsO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IuRXZlbnRzLlNoYWRvd0NoYW5nZWQsdGhpcy5fbW9kZWwpO30KX29uU2xpZGVySW5wdXQoZXZlbnQpe2lmKGV2ZW50LmN1cnJlbnRUYXJnZXQ9PT10aGlzLl9ibHVyU2xpZGVyKXt0aGlzLl9tb2RlbC5zZXRCbHVyUmFkaXVzKG5ldyBJbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoKHRoaXMuX2JsdXJTbGlkZXIudmFsdWUsdGhpcy5fbW9kZWwuYmx1clJhZGl1cygpLnVuaXR8fElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IuZGVmYXVsdFVuaXQpKTt0aGlzLl9ibHVySW5wdXQudmFsdWU9dGhpcy5fbW9kZWwuYmx1clJhZGl1cygpLmFzQ1NTVGV4dCgpO3RoaXMuX2JsdXJJbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpbnZhbGlkJyk7fWVsc2UgaWYoZXZlbnQuY3VycmVudFRhcmdldD09PXRoaXMuX3NwcmVhZFNsaWRlcil7dGhpcy5fbW9kZWwuc2V0U3ByZWFkUmFkaXVzKG5ldyBJbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoKHRoaXMuX3NwcmVhZFNsaWRlci52YWx1ZSx0aGlzLl9tb2RlbC5zcHJlYWRSYWRpdXMoKS51bml0fHxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmRlZmF1bHRVbml0KSk7dGhpcy5fc3ByZWFkSW5wdXQudmFsdWU9dGhpcy5fbW9kZWwuc3ByZWFkUmFkaXVzKCkuYXNDU1NUZXh0KCk7dGhpcy5fc3ByZWFkSW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnaW52YWxpZCcpO30KdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5FdmVudHMuU2hhZG93Q2hhbmdlZCx0aGlzLl9tb2RlbCk7fQpfZHJhZ1N0YXJ0KGV2ZW50KXt0aGlzLl94eVNsaWRlci5mb2N1cygpO3RoaXMuX3VwZGF0ZUNhbnZhcyh0cnVlKTt0aGlzLl9jYW52YXNPcmlnaW49bmV3IFVJLkdlb21ldHJ5LlBvaW50KHRoaXMuX3h5U2xpZGVyLnRvdGFsT2Zmc2V0TGVmdCgpK3RoaXMuX2hhbGZDYW52YXNTaXplLHRoaXMuX3h5U2xpZGVyLnRvdGFsT2Zmc2V0VG9wKCkrdGhpcy5faGFsZkNhbnZhc1NpemUpO2NvbnN0IGNsaWNrZWRQb2ludD1uZXcgVUkuR2VvbWV0cnkuUG9pbnQoZXZlbnQueC10aGlzLl9jYW52YXNPcmlnaW4ueCxldmVudC55LXRoaXMuX2NhbnZhc09yaWdpbi55KTtjb25zdCB0aHVtYlBvaW50PXRoaXMuX3NsaWRlclRodW1iUG9zaXRpb24oKTtpZihjbGlja2VkUG9pbnQuZGlzdGFuY2VUbyh0aHVtYlBvaW50KT49SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5zbGlkZXJUaHVtYlJhZGl1cykKdGhpcy5fZHJhZ01vdmUoZXZlbnQpO3JldHVybiB0cnVlO30KX2RyYWdNb3ZlKGV2ZW50KXtsZXQgcG9pbnQ9bmV3IFVJLkdlb21ldHJ5LlBvaW50KGV2ZW50LngtdGhpcy5fY2FudmFzT3JpZ2luLngsZXZlbnQueS10aGlzLl9jYW52YXNPcmlnaW4ueSk7aWYoZXZlbnQuc2hpZnRLZXkpCnBvaW50PXRoaXMuX3NuYXBUb0Nsb3Nlc3REaXJlY3Rpb24ocG9pbnQpO2NvbnN0IGNvbnN0cmFpbmVkUG9pbnQ9dGhpcy5fY29uc3RyYWluUG9pbnQocG9pbnQsdGhpcy5faW5uZXJDYW52YXNTaXplKTtjb25zdCBuZXdYPU1hdGgucm91bmQoKGNvbnN0cmFpbmVkUG9pbnQueC90aGlzLl9pbm5lckNhbnZhc1NpemUpKklubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IubWF4UmFuZ2UpO2NvbnN0IG5ld1k9TWF0aC5yb3VuZCgoY29uc3RyYWluZWRQb2ludC55L3RoaXMuX2lubmVyQ2FudmFzU2l6ZSkqSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5tYXhSYW5nZSk7aWYoZXZlbnQuc2hpZnRLZXkpe3RoaXMuX21vZGVsLnNldE9mZnNldFgobmV3IElubGluZUVkaXRvci5DU1NMZW5ndGgobmV3WCx0aGlzLl9tb2RlbC5vZmZzZXRYKCkudW5pdHx8SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdCkpO3RoaXMuX21vZGVsLnNldE9mZnNldFkobmV3IElubGluZUVkaXRvci5DU1NMZW5ndGgobmV3WSx0aGlzLl9tb2RlbC5vZmZzZXRZKCkudW5pdHx8SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdCkpO31lbHNle2lmKCFldmVudC5hbHRLZXkpe3RoaXMuX21vZGVsLnNldE9mZnNldFgobmV3IElubGluZUVkaXRvci5DU1NMZW5ndGgobmV3WCx0aGlzLl9tb2RlbC5vZmZzZXRYKCkudW5pdHx8SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdCkpO30KaWYoIVVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKGV2ZW50KSl7dGhpcy5fbW9kZWwuc2V0T2Zmc2V0WShuZXcgSW5saW5lRWRpdG9yLkNTU0xlbmd0aChuZXdZLHRoaXMuX21vZGVsLm9mZnNldFkoKS51bml0fHxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmRlZmF1bHRVbml0KSk7fX0KdGhpcy5feElucHV0LnZhbHVlPXRoaXMuX21vZGVsLm9mZnNldFgoKS5hc0NTU1RleHQoKTt0aGlzLl95SW5wdXQudmFsdWU9dGhpcy5fbW9kZWwub2Zmc2V0WSgpLmFzQ1NTVGV4dCgpO3RoaXMuX3hJbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpbnZhbGlkJyk7dGhpcy5feUlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2ludmFsaWQnKTt0aGlzLl91cGRhdGVDYW52YXModHJ1ZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5FdmVudHMuU2hhZG93Q2hhbmdlZCx0aGlzLl9tb2RlbCk7fQpfb25DYW52YXNCbHVyKCl7dGhpcy5fdXBkYXRlQ2FudmFzKGZhbHNlKTt9Cl9vbkNhbnZhc0Fycm93S2V5KGV2ZW50KXtsZXQgc2hpZnRYPTA7bGV0IHNoaWZ0WT0wO2lmKGV2ZW50LmtleT09PSdBcnJvd1JpZ2h0JykKc2hpZnRYPTE7ZWxzZSBpZihldmVudC5rZXk9PT0nQXJyb3dMZWZ0JykKc2hpZnRYPS0xO2Vsc2UgaWYoZXZlbnQua2V5PT09J0Fycm93VXAnKQpzaGlmdFk9LTE7ZWxzZSBpZihldmVudC5rZXk9PT0nQXJyb3dEb3duJykKc2hpZnRZPTE7aWYoIXNoaWZ0WCYmIXNoaWZ0WSkKcmV0dXJuO2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYoc2hpZnRYKXtjb25zdCBvZmZzZXRYPXRoaXMuX21vZGVsLm9mZnNldFgoKTtjb25zdCBuZXdBbW91bnQ9TnVtYmVyLmNvbnN0cmFpbihvZmZzZXRYLmFtb3VudCtzaGlmdFgsLUlubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IubWF4UmFuZ2UsSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5tYXhSYW5nZSk7aWYobmV3QW1vdW50PT09b2Zmc2V0WC5hbW91bnQpCnJldHVybjt0aGlzLl9tb2RlbC5zZXRPZmZzZXRYKG5ldyBJbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoKG5ld0Ftb3VudCxvZmZzZXRYLnVuaXR8fElubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IuZGVmYXVsdFVuaXQpKTt0aGlzLl94SW5wdXQudmFsdWU9dGhpcy5fbW9kZWwub2Zmc2V0WCgpLmFzQ1NTVGV4dCgpO3RoaXMuX3hJbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpbnZhbGlkJyk7fQppZihzaGlmdFkpe2NvbnN0IG9mZnNldFk9dGhpcy5fbW9kZWwub2Zmc2V0WSgpO2NvbnN0IG5ld0Ftb3VudD1OdW1iZXIuY29uc3RyYWluKG9mZnNldFkuYW1vdW50K3NoaWZ0WSwtSW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5tYXhSYW5nZSxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLm1heFJhbmdlKTtpZihuZXdBbW91bnQ9PT1vZmZzZXRZLmFtb3VudCkKcmV0dXJuO3RoaXMuX21vZGVsLnNldE9mZnNldFkobmV3IElubGluZUVkaXRvci5DU1NMZW5ndGgobmV3QW1vdW50LG9mZnNldFkudW5pdHx8SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdCkpO3RoaXMuX3lJbnB1dC52YWx1ZT10aGlzLl9tb2RlbC5vZmZzZXRZKCkuYXNDU1NUZXh0KCk7dGhpcy5feUlucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2ludmFsaWQnKTt9CnRoaXMuX3VwZGF0ZUNhbnZhcyh0cnVlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLkV2ZW50cy5TaGFkb3dDaGFuZ2VkLHRoaXMuX21vZGVsKTt9Cl9jb25zdHJhaW5Qb2ludChwb2ludCxtYXgpe2lmKE1hdGguYWJzKHBvaW50LngpPD1tYXgmJk1hdGguYWJzKHBvaW50LnkpPD1tYXgpCnJldHVybiBuZXcgVUkuR2VvbWV0cnkuUG9pbnQocG9pbnQueCxwb2ludC55KTtyZXR1cm4gcG9pbnQuc2NhbGUobWF4L01hdGgubWF4KE1hdGguYWJzKHBvaW50LngpLE1hdGguYWJzKHBvaW50LnkpKSk7fQpfc25hcFRvQ2xvc2VzdERpcmVjdGlvbihwb2ludCl7bGV0IG1pbkRpc3RhbmNlPU51bWJlci5NQVhfVkFMVUU7bGV0IGNsb3Nlc3RQb2ludD1wb2ludDtjb25zdCBkaXJlY3Rpb25zPVtuZXcgVUkuR2VvbWV0cnkuUG9pbnQoMCwtMSksbmV3IFVJLkdlb21ldHJ5LlBvaW50KDEsLTEpLG5ldyBVSS5HZW9tZXRyeS5Qb2ludCgxLDApLG5ldyBVSS5HZW9tZXRyeS5Qb2ludCgxLDEpXTtmb3IoY29uc3QgZGlyZWN0aW9uIG9mIGRpcmVjdGlvbnMpe2NvbnN0IHByb2plY3Rpb249cG9pbnQucHJvamVjdE9uKGRpcmVjdGlvbik7Y29uc3QgZGlzdGFuY2U9cG9pbnQuZGlzdGFuY2VUbyhwcm9qZWN0aW9uKTtpZihkaXN0YW5jZTxtaW5EaXN0YW5jZSl7bWluRGlzdGFuY2U9ZGlzdGFuY2U7Y2xvc2VzdFBvaW50PXByb2plY3Rpb247fX0KcmV0dXJuIGNsb3Nlc3RQb2ludDt9Cl9zbGlkZXJUaHVtYlBvc2l0aW9uKCl7Y29uc3QgeD0odGhpcy5fbW9kZWwub2Zmc2V0WCgpLmFtb3VudC9JbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLm1heFJhbmdlKSp0aGlzLl9pbm5lckNhbnZhc1NpemU7Y29uc3QgeT0odGhpcy5fbW9kZWwub2Zmc2V0WSgpLmFtb3VudC9JbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLm1heFJhbmdlKSp0aGlzLl9pbm5lckNhbnZhc1NpemU7cmV0dXJuIHRoaXMuX2NvbnN0cmFpblBvaW50KG5ldyBVSS5HZW9tZXRyeS5Qb2ludCh4LHkpLHRoaXMuX2lubmVyQ2FudmFzU2l6ZSk7fX07SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5FdmVudHM9e1NoYWRvd0NoYW5nZWQ6U3ltYm9sKCdTaGFkb3dDaGFuZ2VkJyl9O0lubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3IubWF4UmFuZ2U9MjA7SW5saW5lRWRpdG9yLkNTU1NoYWRvd0VkaXRvci5kZWZhdWx0VW5pdD0ncHgnO0lubGluZUVkaXRvci5DU1NTaGFkb3dFZGl0b3Iuc2xpZGVyVGh1bWJSYWRpdXM9NjtJbmxpbmVFZGl0b3IuQ1NTU2hhZG93RWRpdG9yLmNhbnZhc1NpemU9ODg7O0lubGluZUVkaXRvci5Td2F0Y2hQb3BvdmVySGVscGVyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fcG9wb3Zlcj1uZXcgVUkuR2xhc3NQYW5lKCk7dGhpcy5fcG9wb3Zlci5yZWdpc3RlclJlcXVpcmVkQ1NTKCdpbmxpbmVfZWRpdG9yL3N3YXRjaFBvcG92ZXIuY3NzJyk7dGhpcy5fcG9wb3Zlci5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCk7dGhpcy5fcG9wb3Zlci5zZXRNYXJnaW5CZWhhdmlvcihVSS5HbGFzc1BhbmUuTWFyZ2luQmVoYXZpb3IuQXJyb3cpO3RoaXMuX3BvcG92ZXIuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGU9PmUuY29uc3VtZSgpLGZhbHNlKTt0aGlzLl9oaWRlUHJveHk9dGhpcy5oaWRlLmJpbmQodGhpcyx0cnVlKTt0aGlzLl9ib3VuZE9uS2V5RG93bj10aGlzLl9vbktleURvd24uYmluZCh0aGlzKTt0aGlzLl9ib3VuZEZvY3VzT3V0PXRoaXMuX29uRm9jdXNPdXQuYmluZCh0aGlzKTt0aGlzLl9pc0hpZGRlbj10cnVlO30KX29uRm9jdXNPdXQoZXZlbnQpe2lmKCFldmVudC5yZWxhdGVkVGFyZ2V0fHxldmVudC5yZWxhdGVkVGFyZ2V0LmlzU2VsZk9yRGVzY2VuZGFudCh0aGlzLl92aWV3LmNvbnRlbnRFbGVtZW50KSkKcmV0dXJuO3RoaXMuX2hpZGVQcm94eSgpO30KaXNTaG93aW5nKCl7cmV0dXJuIHRoaXMuX3BvcG92ZXIuaXNTaG93aW5nKCk7fQpzaG93KHZpZXcsYW5jaG9yRWxlbWVudCxoaWRkZW5DYWxsYmFjayl7aWYodGhpcy5fcG9wb3Zlci5pc1Nob3dpbmcoKSl7aWYodGhpcy5fYW5jaG9yRWxlbWVudD09PWFuY2hvckVsZW1lbnQpCnJldHVybjt0aGlzLmhpZGUodHJ1ZSk7fQpkZWxldGUgdGhpcy5faXNIaWRkZW47dGhpcy5fYW5jaG9yRWxlbWVudD1hbmNob3JFbGVtZW50O3RoaXMuX3ZpZXc9dmlldzt0aGlzLl9oaWRkZW5DYWxsYmFjaz1oaWRkZW5DYWxsYmFjazt0aGlzLnJlcG9zaXRpb24oKTt2aWV3LmZvY3VzKCk7Y29uc3QgZG9jdW1lbnQ9dGhpcy5fcG9wb3Zlci5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9oaWRlUHJveHksZmFsc2UpO2RvY3VtZW50LmRlZmF1bHRWaWV3LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdGhpcy5faGlkZVByb3h5LGZhbHNlKTt0aGlzLl92aWV3LmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2JvdW5kT25LZXlEb3duLGZhbHNlKTt9CnJlcG9zaXRpb24oKXt0aGlzLl92aWV3LmNvbnRlbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jyx0aGlzLl9ib3VuZEZvY3VzT3V0LGZhbHNlKTt0aGlzLl92aWV3LnNob3codGhpcy5fcG9wb3Zlci5jb250ZW50RWxlbWVudCk7dGhpcy5fcG9wb3Zlci5zZXRDb250ZW50QW5jaG9yQm94KHRoaXMuX2FuY2hvckVsZW1lbnQuYm94SW5XaW5kb3coKSk7dGhpcy5fcG9wb3Zlci5zaG93KHRoaXMuX2FuY2hvckVsZW1lbnQub3duZXJEb2N1bWVudCk7dGhpcy5fdmlldy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsdGhpcy5fYm91bmRGb2N1c091dCxmYWxzZSk7aWYoIXRoaXMuX2ZvY3VzUmVzdG9yZXIpCnRoaXMuX2ZvY3VzUmVzdG9yZXI9bmV3IFVJLldpZGdldEZvY3VzUmVzdG9yZXIodGhpcy5fdmlldyk7fQpoaWRlKGNvbW1pdEVkaXQpe2lmKHRoaXMuX2lzSGlkZGVuKQpyZXR1cm47Y29uc3QgZG9jdW1lbnQ9dGhpcy5fcG9wb3Zlci5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7dGhpcy5faXNIaWRkZW49dHJ1ZTt0aGlzLl9wb3BvdmVyLmhpZGUoKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX2hpZGVQcm94eSxmYWxzZSk7ZG9jdW1lbnQuZGVmYXVsdFZpZXcucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0aGlzLl9oaWRlUHJveHksZmFsc2UpO2lmKHRoaXMuX2hpZGRlbkNhbGxiYWNrKQp0aGlzLl9oaWRkZW5DYWxsYmFjay5jYWxsKG51bGwsISFjb21taXRFZGl0KTt0aGlzLl9mb2N1c1Jlc3RvcmVyLnJlc3RvcmUoKTtkZWxldGUgdGhpcy5fYW5jaG9yRWxlbWVudDtpZih0aGlzLl92aWV3KXt0aGlzLl92aWV3LmRldGFjaCgpO3RoaXMuX3ZpZXcuY29udGVudEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRPbktleURvd24sZmFsc2UpO3RoaXMuX3ZpZXcuY29udGVudEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLHRoaXMuX2JvdW5kRm9jdXNPdXQsZmFsc2UpO2RlbGV0ZSB0aGlzLl92aWV3O319Cl9vbktleURvd24oZXZlbnQpe2lmKGV2ZW50LmtleT09PSdFbnRlcicpe3RoaXMuaGlkZSh0cnVlKTtldmVudC5jb25zdW1lKHRydWUpO3JldHVybjt9CmlmKGV2ZW50LmtleT09PSdFc2NhcGUnKXt0aGlzLmhpZGUoZmFsc2UpO2V2ZW50LmNvbnN1bWUodHJ1ZSk7fX19OztJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IoaXNCb3hTaGFkb3cpe3RoaXMuX2lzQm94U2hhZG93PWlzQm94U2hhZG93O3RoaXMuX2luc2V0PWZhbHNlO3RoaXMuX29mZnNldFg9SW5saW5lRWRpdG9yLkNTU0xlbmd0aC56ZXJvKCk7dGhpcy5fb2Zmc2V0WT1JbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoLnplcm8oKTt0aGlzLl9ibHVyUmFkaXVzPUlubGluZUVkaXRvci5DU1NMZW5ndGguemVybygpO3RoaXMuX3NwcmVhZFJhZGl1cz1JbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoLnplcm8oKTt0aGlzLl9jb2xvcj0oQ29tbW9uLkNvbG9yLnBhcnNlKCdibGFjaycpKTt0aGlzLl9mb3JtYXQ9W0lubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5PZmZzZXRYLElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5PZmZzZXRZXTt9CnN0YXRpYyBwYXJzZVRleHRTaGFkb3codGV4dCl7cmV0dXJuIElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fcGFyc2VTaGFkb3codGV4dCxmYWxzZSk7fQpzdGF0aWMgcGFyc2VCb3hTaGFkb3codGV4dCl7cmV0dXJuIElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fcGFyc2VTaGFkb3codGV4dCx0cnVlKTt9CnN0YXRpYyBfcGFyc2VTaGFkb3codGV4dCxpc0JveFNoYWRvdyl7Y29uc3Qgc2hhZG93VGV4dHM9W107Y29uc3Qgc3BsaXRzPVRleHRVdGlscy5UZXh0VXRpbHMuc3BsaXRTdHJpbmdCeVJlZ2V4ZXModGV4dCxbQ29tbW9uLkNvbG9yLlJlZ2V4LC8sL2ddKTtsZXQgY3VycmVudEluZGV4PTA7Zm9yKGxldCBpPTA7aTxzcGxpdHMubGVuZ3RoO2krKyl7aWYoc3BsaXRzW2ldLnJlZ2V4SW5kZXg9PT0xKXtjb25zdCBjb21tYT1zcGxpdHNbaV07c2hhZG93VGV4dHMucHVzaCh0ZXh0LnN1YnN0cmluZyhjdXJyZW50SW5kZXgsY29tbWEucG9zaXRpb24pKTtjdXJyZW50SW5kZXg9Y29tbWEucG9zaXRpb24rMTt9fQpzaGFkb3dUZXh0cy5wdXNoKHRleHQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCx0ZXh0Lmxlbmd0aCkpO2NvbnN0IHNoYWRvd3M9W107Zm9yKGxldCBpPTA7aTxzaGFkb3dUZXh0cy5sZW5ndGg7aSsrKXtjb25zdCBzaGFkb3c9bmV3IElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbChpc0JveFNoYWRvdyk7c2hhZG93Ll9mb3JtYXQ9W107bGV0IG5leHRQYXJ0QWxsb3dlZD10cnVlO2NvbnN0IHJlZ2V4ZXM9Wy9pbnNldC9naSxDb21tb24uQ29sb3IuUmVnZXgsSW5saW5lRWRpdG9yLkNTU0xlbmd0aC5SZWdleF07Y29uc3QgcmVzdWx0cz1UZXh0VXRpbHMuVGV4dFV0aWxzLnNwbGl0U3RyaW5nQnlSZWdleGVzKHNoYWRvd1RleHRzW2ldLHJlZ2V4ZXMpO2ZvcihsZXQgaj0wO2o8cmVzdWx0cy5sZW5ndGg7aisrKXtjb25zdCByZXN1bHQ9cmVzdWx0c1tqXTtpZihyZXN1bHQucmVnZXhJbmRleD09PS0xKXtpZigvXFMvLnRlc3QocmVzdWx0LnZhbHVlKSkKcmV0dXJuW107bmV4dFBhcnRBbGxvd2VkPXRydWU7fWVsc2V7aWYoIW5leHRQYXJ0QWxsb3dlZCkKcmV0dXJuW107bmV4dFBhcnRBbGxvd2VkPWZhbHNlO2lmKHJlc3VsdC5yZWdleEluZGV4PT09MCl7c2hhZG93Ll9pbnNldD10cnVlO3NoYWRvdy5fZm9ybWF0LnB1c2goSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0Lkluc2V0KTt9ZWxzZSBpZihyZXN1bHQucmVnZXhJbmRleD09PTEpe2NvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShyZXN1bHQudmFsdWUpO2lmKCFjb2xvcikKcmV0dXJuW107c2hhZG93Ll9jb2xvcj1jb2xvcjtzaGFkb3cuX2Zvcm1hdC5wdXNoKElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5Db2xvcik7fWVsc2UgaWYocmVzdWx0LnJlZ2V4SW5kZXg9PT0yKXtjb25zdCBsZW5ndGg9SW5saW5lRWRpdG9yLkNTU0xlbmd0aC5wYXJzZShyZXN1bHQudmFsdWUpO2lmKCFsZW5ndGgpCnJldHVybltdO2NvbnN0IHByZXZpb3VzUGFydD1zaGFkb3cuX2Zvcm1hdC5sZW5ndGg+MD9zaGFkb3cuX2Zvcm1hdFtzaGFkb3cuX2Zvcm1hdC5sZW5ndGgtMV06Jyc7aWYocHJldmlvdXNQYXJ0PT09SW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0Lk9mZnNldFgpe3NoYWRvdy5fb2Zmc2V0WT1sZW5ndGg7c2hhZG93Ll9mb3JtYXQucHVzaChJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuT2Zmc2V0WSk7fWVsc2UgaWYocHJldmlvdXNQYXJ0PT09SW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0Lk9mZnNldFkpe3NoYWRvdy5fYmx1clJhZGl1cz1sZW5ndGg7c2hhZG93Ll9mb3JtYXQucHVzaChJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuQmx1clJhZGl1cyk7fWVsc2UgaWYocHJldmlvdXNQYXJ0PT09SW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0LkJsdXJSYWRpdXMpe3NoYWRvdy5fc3ByZWFkUmFkaXVzPWxlbmd0aDtzaGFkb3cuX2Zvcm1hdC5wdXNoKElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5TcHJlYWRSYWRpdXMpO31lbHNle3NoYWRvdy5fb2Zmc2V0WD1sZW5ndGg7c2hhZG93Ll9mb3JtYXQucHVzaChJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuT2Zmc2V0WCk7fX19fQppZihpbnZhbGlkQ291bnQoc2hhZG93LElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5PZmZzZXRYLDEsMSl8fGludmFsaWRDb3VudChzaGFkb3csSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0Lk9mZnNldFksMSwxKXx8aW52YWxpZENvdW50KHNoYWRvdyxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuQ29sb3IsMCwxKXx8aW52YWxpZENvdW50KHNoYWRvdyxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuQmx1clJhZGl1cywwLDEpfHxpbnZhbGlkQ291bnQoc2hhZG93LElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5JbnNldCwwLGlzQm94U2hhZG93PzE6MCl8fGludmFsaWRDb3VudChzaGFkb3csSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0LlNwcmVhZFJhZGl1cywwLGlzQm94U2hhZG93PzE6MCkpCnJldHVybltdO3NoYWRvd3MucHVzaChzaGFkb3cpO30KcmV0dXJuIHNoYWRvd3M7ZnVuY3Rpb24gaW52YWxpZENvdW50KHNoYWRvdyxwYXJ0LG1pbixtYXgpe2xldCBjb3VudD0wO2ZvcihsZXQgaT0wO2k8c2hhZG93Ll9mb3JtYXQubGVuZ3RoO2krKyl7aWYoc2hhZG93Ll9mb3JtYXRbaV09PT1wYXJ0KQpjb3VudCsrO30KcmV0dXJuIGNvdW50PG1pbnx8Y291bnQ+bWF4O319CnNldEluc2V0KGluc2V0KXt0aGlzLl9pbnNldD1pbnNldDtpZih0aGlzLl9mb3JtYXQuaW5kZXhPZihJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuSW5zZXQpPT09LTEpCnRoaXMuX2Zvcm1hdC51bnNoaWZ0KElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5JbnNldCk7fQpzZXRPZmZzZXRYKG9mZnNldFgpe3RoaXMuX29mZnNldFg9b2Zmc2V0WDt9CnNldE9mZnNldFkob2Zmc2V0WSl7dGhpcy5fb2Zmc2V0WT1vZmZzZXRZO30Kc2V0Qmx1clJhZGl1cyhibHVyUmFkaXVzKXt0aGlzLl9ibHVyUmFkaXVzPWJsdXJSYWRpdXM7aWYodGhpcy5fZm9ybWF0LmluZGV4T2YoSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0LkJsdXJSYWRpdXMpPT09LTEpe2NvbnN0IHlJbmRleD10aGlzLl9mb3JtYXQuaW5kZXhPZihJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuT2Zmc2V0WSk7dGhpcy5fZm9ybWF0LnNwbGljZSh5SW5kZXgrMSwwLElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5CbHVyUmFkaXVzKTt9fQpzZXRTcHJlYWRSYWRpdXMoc3ByZWFkUmFkaXVzKXt0aGlzLl9zcHJlYWRSYWRpdXM9c3ByZWFkUmFkaXVzO2lmKHRoaXMuX2Zvcm1hdC5pbmRleE9mKElubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5TcHJlYWRSYWRpdXMpPT09LTEpe3RoaXMuc2V0Qmx1clJhZGl1cyh0aGlzLl9ibHVyUmFkaXVzKTtjb25zdCBibHVySW5kZXg9dGhpcy5fZm9ybWF0LmluZGV4T2YoSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0LkJsdXJSYWRpdXMpO3RoaXMuX2Zvcm1hdC5zcGxpY2UoYmx1ckluZGV4KzEsMCxJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuU3ByZWFkUmFkaXVzKTt9fQpzZXRDb2xvcihjb2xvcil7dGhpcy5fY29sb3I9Y29sb3I7aWYodGhpcy5fZm9ybWF0LmluZGV4T2YoSW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0LkNvbG9yKT09PS0xKQp0aGlzLl9mb3JtYXQucHVzaChJbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuQ29sb3IpO30KaXNCb3hTaGFkb3coKXtyZXR1cm4gdGhpcy5faXNCb3hTaGFkb3c7fQppbnNldCgpe3JldHVybiB0aGlzLl9pbnNldDt9Cm9mZnNldFgoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0WDt9Cm9mZnNldFkoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0WTt9CmJsdXJSYWRpdXMoKXtyZXR1cm4gdGhpcy5fYmx1clJhZGl1czt9CnNwcmVhZFJhZGl1cygpe3JldHVybiB0aGlzLl9zcHJlYWRSYWRpdXM7fQpjb2xvcigpe3JldHVybiB0aGlzLl9jb2xvcjt9CmFzQ1NTVGV4dCgpe2NvbnN0IHBhcnRzPVtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fZm9ybWF0Lmxlbmd0aDtpKyspe2NvbnN0IHBhcnQ9dGhpcy5fZm9ybWF0W2ldO2lmKHBhcnQ9PT1JbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuSW5zZXQmJnRoaXMuX2luc2V0KQpwYXJ0cy5wdXNoKCdpbnNldCcpO2Vsc2UgaWYocGFydD09PUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5PZmZzZXRYKQpwYXJ0cy5wdXNoKHRoaXMuX29mZnNldFguYXNDU1NUZXh0KCkpO2Vsc2UgaWYocGFydD09PUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5PZmZzZXRZKQpwYXJ0cy5wdXNoKHRoaXMuX29mZnNldFkuYXNDU1NUZXh0KCkpO2Vsc2UgaWYocGFydD09PUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5CbHVyUmFkaXVzKQpwYXJ0cy5wdXNoKHRoaXMuX2JsdXJSYWRpdXMuYXNDU1NUZXh0KCkpO2Vsc2UgaWYocGFydD09PUlubGluZUVkaXRvci5DU1NTaGFkb3dNb2RlbC5fUGFydC5TcHJlYWRSYWRpdXMpCnBhcnRzLnB1c2godGhpcy5fc3ByZWFkUmFkaXVzLmFzQ1NTVGV4dCgpKTtlbHNlIGlmKHBhcnQ9PT1JbmxpbmVFZGl0b3IuQ1NTU2hhZG93TW9kZWwuX1BhcnQuQ29sb3IpCnBhcnRzLnB1c2godGhpcy5fY29sb3IuYXNTdHJpbmcodGhpcy5fY29sb3IuZm9ybWF0KCkpKTt9CnJldHVybiBwYXJ0cy5qb2luKCcgJyk7fX07SW5saW5lRWRpdG9yLkNTU1NoYWRvd01vZGVsLl9QYXJ0PXtJbnNldDonSScsT2Zmc2V0WDonWCcsT2Zmc2V0WTonWScsQmx1clJhZGl1czonQicsU3ByZWFkUmFkaXVzOidTJyxDb2xvcjonQyd9O0lubGluZUVkaXRvci5DU1NMZW5ndGg9Y2xhc3N7Y29uc3RydWN0b3IoYW1vdW50LHVuaXQpe3RoaXMuYW1vdW50PWFtb3VudDt0aGlzLnVuaXQ9dW5pdDt9CnN0YXRpYyBwYXJzZSh0ZXh0KXtjb25zdCBsZW5ndGhSZWdleD1uZXcgUmVnRXhwKCdeKD86JytJbmxpbmVFZGl0b3IuQ1NTTGVuZ3RoLlJlZ2V4LnNvdXJjZSsnKSQnLCdpJyk7Y29uc3QgbWF0Y2g9dGV4dC5tYXRjaChsZW5ndGhSZWdleCk7aWYoIW1hdGNoKQpyZXR1cm4gbnVsbDtpZihtYXRjaC5sZW5ndGg+MiYmbWF0Y2hbMl0pCnJldHVybiBuZXcgSW5saW5lRWRpdG9yLkNTU0xlbmd0aChwYXJzZUZsb2F0KG1hdGNoWzFdKSxtYXRjaFsyXSk7cmV0dXJuIElubGluZUVkaXRvci5DU1NMZW5ndGguemVybygpO30Kc3RhdGljIHplcm8oKXtyZXR1cm4gbmV3IElubGluZUVkaXRvci5DU1NMZW5ndGgoMCwnJyk7fQphc0NTU1RleHQoKXtyZXR1cm4gdGhpcy5hbW91bnQrdGhpcy51bml0O319O0lubGluZUVkaXRvci5DU1NMZW5ndGguUmVnZXg9KGZ1bmN0aW9uKCl7Y29uc3QgbnVtYmVyPScoWystXT8oPzpbMC05XSpbLl0pP1swLTldKyg/OltlRV1bKy1dP1swLTldKyk/KSc7Y29uc3QgdW5pdD0nKGNofGNtfGVtfGV4fGlufG1tfHBjfHB0fHB4fHJlbXx2aHx2bWF4fHZtaW58dncpJztjb25zdCB6ZXJvPSdbKy1dPyg/OjAqWy5dKT8wKyg/OltlRV1bKy1dP1swLTldKyk/JztyZXR1cm4gbmV3IFJlZ0V4cChudW1iZXIrdW5pdCsnfCcremVybywnZ2knKTt9KSgpOztSdW50aW1lLmNhY2hlZFJlc291cmNlc1siaW5saW5lX2VkaXRvci9iZXppZXJFZGl0b3IuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICB3aWR0aDogMjcwcHg7XG4gICAgaGVpZ2h0OiAzNTBweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmJlemllci1wcmVzZXQtc2VsZWN0ZWQgPiBzdmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi5iZXppZXItcHJlc2V0LWxhYmVsIHtcbiAgICBmb250LXNpemU6IDEwcHg7XG59XG5cbi5iZXppZXItcHJlc2V0IHtcbiAgICB3aWR0aDogNTBweDtcbiAgICBoZWlnaHQ6IDUwcHg7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbn1cblxuLmJlemllci1wcmVzZXQgbGluZS5iZXppZXItY29udHJvbC1saW5lIHtcbiAgICBzdHJva2U6ICM2NjY7XG4gICAgc3Ryb2tlLXdpZHRoOiAxO1xuICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcbiAgICBmaWxsOiBub25lO1xufVxuXG4uYmV6aWVyLXByZXNldCBjaXJjbGUuYmV6aWVyLWNvbnRyb2wtY2lyY2xlIHtcbiAgICBmaWxsOiAjNjY2O1xufVxuXG4uYmV6aWVyLXByZXNldCBwYXRoLmJlemllci1wYXRoIHtcbiAgICBzdHJva2U6IGJsYWNrO1xuICAgIHN0cm9rZS13aWR0aDogMjtcbiAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7XG4gICAgZmlsbDogbm9uZTtcbn1cblxuLmJlemllci1wcmVzZXQtc2VsZWN0ZWQgcGF0aC5iZXppZXItcGF0aCwgLmJlemllci1wcmVzZXQtc2VsZWN0ZWQgbGluZS5iZXppZXItY29udHJvbC1saW5lIHtcbiAgICBzdHJva2U6IHdoaXRlO1xufVxuXG4uYmV6aWVyLXByZXNldC1zZWxlY3RlZCBjaXJjbGUuYmV6aWVyLWNvbnRyb2wtY2lyY2xlIHtcbiAgICBmaWxsOiB3aGl0ZTtcbn1cblxuLmJlemllci1jdXJ2ZSBsaW5lLmxpbmVhci1saW5lIHtcbiAgICBzdHJva2U6IHJnYigyMzgsIDIzOCwgMjM4KTtcbiAgICBzdHJva2Utd2lkdGg6IDI7XG4gICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICAgIGZpbGw6IG5vbmU7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLmJlemllci1jdXJ2ZSBsaW5lLmxpbmVhci1saW5lIHtcbiAgICBzdHJva2U6IHJnYigxMzgsIDEzOCwgMTM4KTtcbn1cblxuLmJlemllci1jdXJ2ZSBsaW5lLmJlemllci1jb250cm9sLWxpbmUge1xuICAgIHN0cm9rZTogIzlDMjdCMDtcbiAgICBzdHJva2Utd2lkdGg6IDI7XG4gICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICAgIGZpbGw6IG5vbmU7XG4gICAgb3BhY2l0eTogMC42O1xufVxuXG4uYmV6aWVyLWN1cnZlIGNpcmNsZS5iZXppZXItY29udHJvbC1jaXJjbGUge1xuICAgIGZpbGw6ICM5QzI3QjA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYmV6aWVyLWN1cnZlIHBhdGguYmV6aWVyLXBhdGgge1xuICAgIHN0cm9rZTogYmxhY2s7XG4gICAgc3Ryb2tlLXdpZHRoOiAzO1xuICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDtcbiAgICBmaWxsOiBub25lO1xufVxuXG4uYmV6aWVyLXByZXZpZXctY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgIHdpZHRoOiAyMDAlO1xuICAgIGhlaWdodDogMjBweDtcbiAgICB6LWluZGV4OiAyO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi5iZXppZXItcHJldmlldy1hbmltYXRpb24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM5QzI3QjA7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uYmV6aWVyLXByZXZpZXctb25pb24ge1xuICAgIG1hcmdpbi10b3A6IC0yMHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xufVxuXG4uYmV6aWVyLXByZXZpZXctb25pb24gPiAuYmV6aWVyLXByZXZpZXctYW5pbWF0aW9uIHtcbiAgICBvcGFjaXR5OiAwLjE7XG59XG5cbnN2Zy5iZXppZXItcHJlc2V0LW1vZGlmeSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgICBib3JkZXItcmFkaXVzOiAzNXB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDEwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuc3ZnLmJlemllci1wcmVzZXQtbW9kaWZ5OmhvdmVyLCAuYmV6aWVyLXByZXNldDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTtcbn1cblxuLmJlemllci1wcmVzZXQtc2VsZWN0ZWQgLmJlemllci1wcmVzZXQ6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi5iZXppZXItcHJlc2V0LW1vZGlmeSBwYXRoIHtcbiAgICBzdHJva2Utd2lkdGg6IDI7XG4gICAgc3Ryb2tlOiBibGFjaztcbiAgICBmaWxsOiBub25lO1xufVxuXG4uYmV6aWVyLXByZXNldC1zZWxlY3RlZCAuYmV6aWVyLXByZXNldC1tb2RpZnkge1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbi5iZXppZXItcHJlc2V0LWNhdGVnb3J5IHtcbiAgICB3aWR0aDogNTBweDtcbiAgICBtYXJnaW46IDIwcHggMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDEwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG59XG5cbnNwYW4uYmV6aWVyLWRpc3BsYXktdmFsdWUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICBjdXJzb3I6IHRleHQ7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcCAhaW1wb3J0YW50O1xufVxuXG4uYmV6aWVyLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXJnaW4tdG9wOiAzOHB4O1xufVxuXG5zdmcuYmV6aWVyLWN1cnZlIHtcbiAgICBtYXJnaW4tbGVmdDogMzJweDtcbiAgICBtYXJnaW4tdG9wOiAtOHB4O1xufVxuXG5zdmcuYmV6aWVyLXByZXNldC1tb2RpZnkuYmV6aWVyLXByZXNldC1wbHVzIHtcbiAgICByaWdodDogMDtcbn1cblxuLmJlemllci1oZWFkZXIge1xuICAgIG1hcmdpbi10b3A6IDE2cHg7XG59XG5cbnN2Zy5iZXppZXItcHJlc2V0LW1vZGlmeTphY3RpdmUsXG4uLXRoZW1lLXNlbGVjdGlvbi1jb2xvciB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG59XG5cbi5iZXppZXItcHJlc2V0LWNhdGVnb3J5OmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTtcbn1cblxuLmJlemllci1oZWFkZXItYWN0aXZlID4gc3ZnLmJlemllci1wcmVzZXQtbW9kaWZ5IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG4uYmV6aWVyLXByZXNldC1tb2RpZnk6YWN0aXZlIHBhdGgge1xuICAgIHN0cm9rZTogd2hpdGU7XG59XG5cbi8qIyBzb3VyY2VVUkw9aW5saW5lX2VkaXRvci9iZXppZXJFZGl0b3IuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siaW5saW5lX2VkaXRvci9jb2xvclN3YXRjaC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jb2xvci1zd2F0Y2gge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tbGVmdDogMXB4O1xuICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICB0b3A6IDFweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2NoZWNrZXIucG5nKTtcbiAgICBsaW5lLWhlaWdodDogMTBweDtcbn1cblxuLmNvbG9yLXN3YXRjaC1pbm5lciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuNik7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uY29sb3Itc3dhdGNoLWlubmVyOmhvdmVyIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDY0LCA2NCwgNjQsIDAuOCk7XG59XG5cblxuLyojIHNvdXJjZVVSTD1pbmxpbmVfZWRpdG9yL2NvbG9yU3dhdGNoLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImlubGluZV9lZGl0b3IvYmV6aWVyU3dhdGNoLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uYmV6aWVyLXN3YXRjaC1pY29uIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICB0b3A6IDFweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM5QzI3QjA7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uYmV6aWVyLXN3YXRjaC1pY29uOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODAwMDgwO1xufVxuXG4vKiMgc291cmNlVVJMPWlubGluZV9lZGl0b3IvYmV6aWVyU3dhdGNoLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImlubGluZV9lZGl0b3IvY3NzU2hhZG93U3dhdGNoLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uc2hhZG93LXN3YXRjaC1pY29uIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luLWxlZnQ6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICB0b3A6IDFweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM5QzI3QjA7XG59XG5cbi5zaGFkb3ctc3dhdGNoLWljb246aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDAwODA7XG59XG5cbi8qIyBzb3VyY2VVUkw9aW5saW5lX2VkaXRvci9jc3NTaGFkb3dTd2F0Y2guY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siaW5saW5lX2VkaXRvci9jc3NTaGFkb3dFZGl0b3IuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuOmhvc3Qge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcGFkZGluZzogNHB4IDEycHggMTJweCAxMnB4O1xufVxuXG4uc2hhZG93LWVkaXRvci1maWVsZDpsYXN0LW9mLXR5cGUge1xuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbn1cblxuLnNoYWRvdy1lZGl0b3ItZmllbGQge1xuICAgIGhlaWdodDogMjRweDtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uc2hhZG93LWVkaXRvci1mbGV4LWZpZWxkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbn1cblxuLnNoYWRvdy1lZGl0b3ItZmllbGQuc2hhZG93LWVkaXRvci1ibHVyLWZpZWxkIHtcbiAgICBtYXJnaW4tdG9wOiA0MHB4O1xufVxuXG4uc2hhZG93LWVkaXRvci0yRC1zbGlkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6IDg4cHg7XG4gICAgd2lkdGg6IDg4cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE0KTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5zaGFkb3ctZWRpdG9yLWxhYmVsIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDUycHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4uc2hhZG93LWVkaXRvci1idXR0b24tbGVmdCwgLnNoYWRvdy1lZGl0b3ItYnV0dG9uLXJpZ2h0IHtcbiAgICB3aWR0aDogNzRweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgcGFkZGluZzogM3B4IDdweDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTQpO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zaGFkb3ctZWRpdG9yLWJ1dHRvbi1sZWZ0IHtcbiAgICBib3JkZXItcmFkaXVzOiAycHggMCAwIDJweDtcbn1cblxuLnNoYWRvdy1lZGl0b3ItYnV0dG9uLXJpZ2h0IHtcbiAgICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbn1cblxuLnNoYWRvdy1lZGl0b3ItYnV0dG9uLWxlZnQ6aG92ZXIsIC5zaGFkb3ctZWRpdG9yLWJ1dHRvbi1yaWdodDpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLnNoYWRvdy1lZGl0b3ItYnV0dG9uLWxlZnQ6Zm9jdXMsIC5zaGFkb3ctZWRpdG9yLWJ1dHRvbi1yaWdodDpmb2N1cyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuLnNoYWRvdy1lZGl0b3ItYnV0dG9uLWxlZnQuZW5hYmxlZCwgLnNoYWRvdy1lZGl0b3ItYnV0dG9uLXJpZ2h0LmVuYWJsZWQsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVGNDtcbiAgICBjb2xvcjogI2ZmZmZmZjtcbn1cblxuLnNoYWRvdy1lZGl0b3ItYnV0dG9uLWxlZnQuZW5hYmxlZDpmb2N1cywgLnNoYWRvdy1lZGl0b3ItYnV0dG9uLXJpZ2h0LmVuYWJsZWQ6Zm9jdXMsIC10aGVtZS1wcmVzZXJ2ZSAge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMzQjc4RTc7XG59XG5cbi5zaGFkb3ctZWRpdG9yLXRleHQtaW5wdXQge1xuICAgIHdpZHRoOiA1MnB4O1xuICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWZvY3VzLXJpbmctaW5hY3RpdmUtc2hhZG93KTtcbn1cblxuLyojIHNvdXJjZVVSTD1pbmxpbmVfZWRpdG9yL2Nzc1NoYWRvd0VkaXRvci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJpbmxpbmVfZWRpdG9yL3N3YXRjaFBvcG92ZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLndpZGdldCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1kcm9wLXNoYWRvdyk7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgbGluZS1oZWlnaHQ6IDExcHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9aW5saW5lX2VkaXRvci9zd2F0Y2hQb3BvdmVyLmNzcyAqLyI7SmF2YVNjcmlwdE1ldGFkYXRhLk5hdGl2ZUZ1bmN0aW9ucz1beyJuYW1lIjoiZmluZCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoiZmluZCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dLCJyZWNlaXZlciI6IlJlYWRvbmx5QXJyYXkifSx7Im5hbWUiOiJmaW5kIiwic2lnbmF0dXJlcyI6W1sicHJlZGljYXRlIiwiP3RoaXNBcmciXV0sInJlY2VpdmVyIjoiSW50OEFycmF5In0seyJuYW1lIjoiZmluZCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dLCJyZWNlaXZlciI6IlVpbnQ4QXJyYXkifSx7Im5hbWUiOiJmaW5kIiwic2lnbmF0dXJlcyI6W1sicHJlZGljYXRlIiwiP3RoaXNBcmciXV0sInJlY2VpdmVyIjoiVWludDhDbGFtcGVkQXJyYXkifSx7Im5hbWUiOiJmaW5kIiwic2lnbmF0dXJlcyI6W1sicHJlZGljYXRlIiwiP3RoaXNBcmciXV0sInJlY2VpdmVyIjoiSW50MTZBcnJheSJ9LHsibmFtZSI6ImZpbmQiLCJzaWduYXR1cmVzIjpbWyJwcmVkaWNhdGUiLCI/dGhpc0FyZyJdXSwicmVjZWl2ZXIiOiJVaW50MTZBcnJheSJ9LHsibmFtZSI6ImZpbmQiLCJzaWduYXR1cmVzIjpbWyJwcmVkaWNhdGUiLCI/dGhpc0FyZyJdXSwicmVjZWl2ZXIiOiJJbnQzMkFycmF5In0seyJuYW1lIjoiZmluZCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dLCJyZWNlaXZlciI6IlVpbnQzMkFycmF5In0seyJuYW1lIjoiZmluZCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dLCJyZWNlaXZlciI6IkZsb2F0MzJBcnJheSJ9LHsibmFtZSI6ImZpbmQiLCJzaWduYXR1cmVzIjpbWyJwcmVkaWNhdGUiLCI/dGhpc0FyZyJdXSwicmVjZWl2ZXIiOiJGbG9hdDY0QXJyYXkifSx7Im5hbWUiOiJmaW5kIiwic2lnbmF0dXJlcyI6W1siP3N0cmluZyIsIj9jYXNlU2Vuc2l0aXZlIiwiP2JhY2t3YXJkcyIsIj93cmFwIiwiP3dob2xlV29yZCIsIj9zZWFyY2hJbkZyYW1lcyIsIj9zaG93RGlhbG9nIl1dLCJyZWNlaXZlciI6IldpbmRvdyJ9LHsibmFtZSI6ImZpbmRJbmRleCIsInNpZ25hdHVyZXMiOltbInByZWRpY2F0ZSIsIj90aGlzQXJnIl1dfSx7Im5hbWUiOiJmaWxsIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbInZhbHVlIiwiP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJJbnQ4QXJyYXkifSx7Im5hbWUiOiJmaWxsIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IlVpbnQ4QXJyYXkifSx7Im5hbWUiOiJmaWxsIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IlVpbnQ4Q2xhbXBlZEFycmF5In0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbInZhbHVlIiwiP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJJbnQxNkFycmF5In0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbInZhbHVlIiwiP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJVaW50MTZBcnJheSJ9LHsibmFtZSI6ImZpbGwiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSIsIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiSW50MzJBcnJheSJ9LHsibmFtZSI6ImZpbGwiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSIsIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiVWludDMyQXJyYXkifSx7Im5hbWUiOiJmaWxsIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IkZsb2F0MzJBcnJheSJ9LHsibmFtZSI6ImZpbGwiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSIsIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiRmxvYXQ2NEFycmF5In0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbIj93aW5kaW5nIl0sWyJwYXRoIiwiP3dpbmRpbmciXV0sInJlY2VpdmVyIjoiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbIj93aW5kaW5nIl0sWyJwYXRoIiwiP3dpbmRpbmciXV0sInJlY2VpdmVyIjoiT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiZmlsbCIsInNpZ25hdHVyZXMiOltbIj93aW5kaW5nIl0sWyJwYXRoIiwiP3dpbmRpbmciXV0sInJlY2VpdmVyIjoiUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJjb3B5V2l0aGluIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0Iiwic3RhcnQiLCI/ZW5kIl1dfSx7Im5hbWUiOiJmcm9tIiwic2lnbmF0dXJlcyI6W1siYXJyYXlMaWtlIiwiP21hcGZuIiwiP3RoaXNBcmciXSxbIml0ZXJhYmxlIiwiP21hcGZuIiwiP3RoaXNBcmciXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoiZnJvbSIsInNpZ25hdHVyZXMiOltbImFycmF5TGlrZSIsIj9tYXBmbiIsIj90aGlzQXJnIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImZyb20iLCJzaWduYXR1cmVzIjpbWyJhcnJheUxpa2UiLCI/bWFwZm4iLCI/dGhpc0FyZyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJmcm9tIiwic2lnbmF0dXJlcyI6W1siYXJyYXlMaWtlIiwiP21hcGZuIiwiP3RoaXNBcmciXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoiZnJvbSIsInNpZ25hdHVyZXMiOltbImFycmF5TGlrZSIsIj9tYXBmbiIsIj90aGlzQXJnIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImZyb20iLCJzaWduYXR1cmVzIjpbWyJhcnJheUxpa2UiLCI/bWFwZm4iLCI/dGhpc0FyZyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJmcm9tIiwic2lnbmF0dXJlcyI6W1siYXJyYXlMaWtlIiwiP21hcGZuIiwiP3RoaXNBcmciXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoiZnJvbSIsInNpZ25hdHVyZXMiOltbImFycmF5TGlrZSIsIj9tYXBmbiIsIj90aGlzQXJnIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImZyb20iLCJzaWduYXR1cmVzIjpbWyJhcnJheUxpa2UiLCI/bWFwZm4iLCI/dGhpc0FyZyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJmcm9tIiwic2lnbmF0dXJlcyI6W1siYXJyYXlMaWtlIiwiP21hcGZuIiwiP3RoaXNBcmciXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoib2YiLCJzaWduYXR1cmVzIjpbWyIuLi5pdGVtcyJdXX0seyJuYW1lIjoiY2x6MzIiLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJpbXVsIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV19LHsibmFtZSI6InNpZ24iLCJzaWduYXR1cmVzIjpbWyJ4Il1dLCJyZWNlaXZlciI6Ik1hdGgifSx7Im5hbWUiOiJzaWduIiwic2lnbmF0dXJlcyI6W1siYWxnb3JpdGhtIiwia2V5IiwiZGF0YSJdXSwicmVjZWl2ZXIiOiJTdWJ0bGVDcnlwdG8ifSx7Im5hbWUiOiJsb2cxMCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImxvZzIiLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJsb2cxcCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImV4cG0xIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiY29zaCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6InNpbmgiLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJ0YW5oIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiYWNvc2giLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJhc2luaCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImF0YW5oIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiaHlwb3QiLCJzaWduYXR1cmVzIjpbWyIuLi52YWx1ZXMiXV19LHsibmFtZSI6InRydW5jIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiZnJvdW5kIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiY2JydCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImlzRmluaXRlIiwic2lnbmF0dXJlcyI6W1sibnVtYmVyIl1dfSx7Im5hbWUiOiJpc0ludGVnZXIiLCJzaWduYXR1cmVzIjpbWyJudW1iZXIiXV19LHsibmFtZSI6ImlzTmFOIiwic2lnbmF0dXJlcyI6W1sibnVtYmVyIl1dfSx7Im5hbWUiOiJpc1NhZmVJbnRlZ2VyIiwic2lnbmF0dXJlcyI6W1sibnVtYmVyIl1dfSx7Im5hbWUiOiJwYXJzZUZsb2F0Iiwic2lnbmF0dXJlcyI6W1sic3RyaW5nIl1dfSx7Im5hbWUiOiJwYXJzZUludCIsInNpZ25hdHVyZXMiOltbInN0cmluZyIsIj9yYWRpeCJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJwYXJzZUludCIsInNpZ25hdHVyZXMiOltbInMiLCI/cmFkaXgiXV0sInJlY2VpdmVyIjoiV2luZG93In0seyJuYW1lIjoiaGFzT3duUHJvcGVydHkiLCJzaWduYXR1cmVzIjpbWyJ2Il1dfSx7Im5hbWUiOiJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInNpZ25hdHVyZXMiOltbInYiXV19LHsibmFtZSI6ImFzc2lnbiIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInNvdXJjZSJdLFsidGFyZ2V0IiwiLi4uc291cmNlcyJdLFsidGFyZ2V0Iiwic291cmNlMSIsInNvdXJjZTIiLCI/c291cmNlMyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJhc3NpZ24iLCJzaWduYXR1cmVzIjpbWyJ1cmwiXV0sInJlY2VpdmVyIjoiTG9jYXRpb24ifSx7Im5hbWUiOiJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzaWduYXR1cmVzIjpbWyJvIl1dfSx7Im5hbWUiOiJpcyIsInNpZ25hdHVyZXMiOltbInZhbHVlMSIsInZhbHVlMiJdXX0seyJuYW1lIjoic2V0UHJvdG90eXBlT2YiLCJzaWduYXR1cmVzIjpbWyJvIiwicHJvdG8iXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoic2V0UHJvdG90eXBlT2YiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJ2Il1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6ImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInNpZ25hdHVyZXMiOltbIm8iLCJwcm9wZXJ0eUtleSJdLFsibyIsInAiXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwicCJdXSwicmVjZWl2ZXIiOiJQcm94eUhhbmRsZXIifSx7Im5hbWUiOiJkZWZpbmVQcm9wZXJ0eSIsInNpZ25hdHVyZXMiOltbIm8iLCJwcm9wZXJ0eUtleSIsImF0dHJpYnV0ZXMiXSxbIm8iLCJwIiwiYXR0cmlidXRlcyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJkZWZpbmVQcm9wZXJ0eSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInAiLCJhdHRyaWJ1dGVzIl1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6ImNvZGVQb2ludEF0Iiwic2lnbmF0dXJlcyI6W1sicG9zIl1dfSx7Im5hbWUiOiJpbmNsdWRlcyIsInNpZ25hdHVyZXMiOltbInNlYXJjaFN0cmluZyIsIj9wb3NpdGlvbiJdXSwicmVjZWl2ZXIiOiJTdHJpbmcifSx7Im5hbWUiOiJpbmNsdWRlcyIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoiaW5jbHVkZXMiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJSZWFkb25seUFycmF5In0seyJuYW1lIjoiaW5jbHVkZXMiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJJbnQ4QXJyYXkifSx7Im5hbWUiOiJpbmNsdWRlcyIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IlVpbnQ4QXJyYXkifSx7Im5hbWUiOiJpbmNsdWRlcyIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IlVpbnQ4Q2xhbXBlZEFycmF5In0seyJuYW1lIjoiaW5jbHVkZXMiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJJbnQxNkFycmF5In0seyJuYW1lIjoiaW5jbHVkZXMiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJVaW50MTZBcnJheSJ9LHsibmFtZSI6ImluY2x1ZGVzIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiSW50MzJBcnJheSJ9LHsibmFtZSI6ImluY2x1ZGVzIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiVWludDMyQXJyYXkifSx7Im5hbWUiOiJpbmNsdWRlcyIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkZsb2F0MzJBcnJheSJ9LHsibmFtZSI6ImluY2x1ZGVzIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiRmxvYXQ2NEFycmF5In0seyJuYW1lIjoiaW5jbHVkZXMiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV0sInJlY2VpdmVyIjoiSURCS2V5UmFuZ2UifSx7Im5hbWUiOiJlbmRzV2l0aCIsInNpZ25hdHVyZXMiOltbInNlYXJjaFN0cmluZyIsIj9lbmRQb3NpdGlvbiJdXX0seyJuYW1lIjoibm9ybWFsaXplIiwic2lnbmF0dXJlcyI6W1siP2Zvcm0iXV0sInJlY2VpdmVyIjoiU3RyaW5nIn0seyJuYW1lIjoicmVwZWF0Iiwic2lnbmF0dXJlcyI6W1siY291bnQiXV19LHsibmFtZSI6InN0YXJ0c1dpdGgiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hTdHJpbmciLCI/cG9zaXRpb24iXV19LHsibmFtZSI6ImFuY2hvciIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6ImZvbnRjb2xvciIsInNpZ25hdHVyZXMiOltbImNvbG9yIl1dfSx7Im5hbWUiOiJmb250c2l6ZSIsInNpZ25hdHVyZXMiOltbInNpemUiXV19LHsibmFtZSI6ImxpbmsiLCJzaWduYXR1cmVzIjpbWyJ1cmwiXV19LHsibmFtZSI6InN1YiIsInNpZ25hdHVyZXMiOltbInR5cGVkQXJyYXkiLCJpbmRleCIsInZhbHVlIl1dLCJyZWNlaXZlciI6IkF0b21pY3MifSx7Im5hbWUiOiJzdWIiLCJzaWduYXR1cmVzIjpbWyIuLi52YWx1ZXMiXV0sInJlY2VpdmVyIjoiQ1NTTnVtZXJpY1ZhbHVlIn0seyJuYW1lIjoiZnJvbUNvZGVQb2ludCIsInNpZ25hdHVyZXMiOltbIi4uLmNvZGVQb2ludHMiXV19LHsibmFtZSI6InJhdyIsInNpZ25hdHVyZXMiOltbInRlbXBsYXRlIiwiLi4uc3Vic3RpdHV0aW9ucyJdXX0seyJuYW1lIjoiY2xlYXIiLCJzaWduYXR1cmVzIjpbWyJtYXNrIl1dLCJyZWNlaXZlciI6IldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJkZWxldGUiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV0sInJlY2VpdmVyIjoiTWFwIn0seyJuYW1lIjoiZGVsZXRlIiwic2lnbmF0dXJlcyI6W1sia2V5Il1dLCJyZWNlaXZlciI6IldlYWtNYXAifSx7Im5hbWUiOiJkZWxldGUiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJTZXQifSx7Im5hbWUiOiJkZWxldGUiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJXZWFrU2V0In0seyJuYW1lIjoiZGVsZXRlIiwic2lnbmF0dXJlcyI6W1sicHJvcGVydHkiXV0sInJlY2VpdmVyIjoiU3R5bGVQcm9wZXJ0eU1hcCJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJIZWFkZXJzIn0seyJuYW1lIjoiZGVsZXRlIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJGb3JtRGF0YSJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiVVJMU2VhcmNoUGFyYW1zIn0seyJuYW1lIjoiZGVsZXRlIiwic2lnbmF0dXJlcyI6W1siY2FjaGVOYW1lIl1dLCJyZWNlaXZlciI6IkNhY2hlU3RvcmFnZSJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbInJlcXVlc3QiLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJDYWNoZSJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbIm9wdGlvbnMiXSxbIm5hbWUiLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJDb29raWVTdG9yZSJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJJREJPYmplY3RTdG9yZSJ9LHsibmFtZSI6ImRlbGV0ZSIsInNpZ25hdHVyZXMiOltbImluc3RydW1lbnRLZXkiXV0sInJlY2VpdmVyIjoiUGF5bWVudEluc3RydW1lbnRzIn0seyJuYW1lIjoiZm9yRWFjaCIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrZm4iLCI/dGhpc0FyZyJdXX0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1sia2V5Il1dLCJyZWNlaXZlciI6Ik1hcCJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJSZWFkb25seU1hcCJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJXZWFrTWFwIn0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwicCIsInJlY2VpdmVyIl1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbInByb3BlcnR5Il1dLCJyZWNlaXZlciI6IlN0eWxlUHJvcGVydHlNYXBSZWFkT25seSJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJIZWFkZXJzIn0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJDdXN0b21FbGVtZW50UmVnaXN0cnkifSx7Im5hbWUiOiJnZXQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dLCJyZWNlaXZlciI6IkZvcm1EYXRhIn0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJVUkxTZWFyY2hQYXJhbXMifSx7Im5hbWUiOiJnZXQiLCJzaWduYXR1cmVzIjpbWyJpZCJdXSwicmVjZWl2ZXIiOiJCYWNrZ3JvdW5kRmV0Y2hNYW5hZ2VyIn0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXSxbIm5hbWUiLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJDb29raWVTdG9yZSJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkNyZWRlbnRpYWxzQ29udGFpbmVyIn0seyJuYW1lIjoiZ2V0Iiwic2lnbmF0dXJlcyI6W1sia2V5SWQiXV0sInJlY2VpdmVyIjoiTWVkaWFLZXlTdGF0dXNNYXAifSx7Im5hbWUiOiJnZXQiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV0sInJlY2VpdmVyIjoiSURCSW5kZXgifSx7Im5hbWUiOiJnZXQiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV0sInJlY2VpdmVyIjoiSURCT2JqZWN0U3RvcmUifSx7Im5hbWUiOiJnZXQiLCJzaWduYXR1cmVzIjpbWyJpbnN0cnVtZW50S2V5Il1dLCJyZWNlaXZlciI6IlBheW1lbnRJbnN0cnVtZW50cyJ9LHsibmFtZSI6ImdldCIsInNpZ25hdHVyZXMiOltbImlkIl1dLCJyZWNlaXZlciI6IkNsaWVudHMifSx7Im5hbWUiOiJoYXMiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV0sInJlY2VpdmVyIjoiTWFwIn0seyJuYW1lIjoiaGFzIiwic2lnbmF0dXJlcyI6W1sia2V5Il1dLCJyZWNlaXZlciI6IlJlYWRvbmx5TWFwIn0seyJuYW1lIjoiaGFzIiwic2lnbmF0dXJlcyI6W1sia2V5Il1dLCJyZWNlaXZlciI6IldlYWtNYXAifSx7Im5hbWUiOiJoYXMiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJTZXQifSx7Im5hbWUiOiJoYXMiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJSZWFkb25seVNldCJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dLCJyZWNlaXZlciI6IldlYWtTZXQifSx7Im5hbWUiOiJoYXMiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJwIl1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbInByb3BlcnR5Il1dLCJyZWNlaXZlciI6IlN0eWxlUHJvcGVydHlNYXBSZWFkT25seSJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJIZWFkZXJzIn0seyJuYW1lIjoiaGFzIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJGb3JtRGF0YSJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiVVJMU2VhcmNoUGFyYW1zIn0seyJuYW1lIjoiaGFzIiwic2lnbmF0dXJlcyI6W1siY2FjaGVOYW1lIl1dLCJyZWNlaXZlciI6IkNhY2hlU3RvcmFnZSJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl0sWyJuYW1lIiwiP29wdGlvbnMiXV0sInJlY2VpdmVyIjoiQ29va2llU3RvcmUifSx7Im5hbWUiOiJoYXMiLCJzaWduYXR1cmVzIjpbWyJrZXlJZCJdXSwicmVjZWl2ZXIiOiJNZWRpYUtleVN0YXR1c01hcCJ9LHsibmFtZSI6ImhhcyIsInNpZ25hdHVyZXMiOltbImluc3RydW1lbnRLZXkiXV0sInJlY2VpdmVyIjoiUGF5bWVudEluc3RydW1lbnRzIn0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1sia2V5IiwidmFsdWUiXV0sInJlY2VpdmVyIjoiTWFwIn0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1sia2V5IiwidmFsdWUiXV0sInJlY2VpdmVyIjoiV2Vha01hcCJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInAiLCJ2YWx1ZSIsInJlY2VpdmVyIl1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbInYiXV0sInJlY2VpdmVyIjoiUHJvcGVydHlEZXNjcmlwdG9yIn0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1siYXJyYXkiLCI/b2Zmc2V0Il1dLCJyZWNlaXZlciI6IkludDhBcnJheSJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbImFycmF5IiwiP29mZnNldCJdXSwicmVjZWl2ZXIiOiJVaW50OEFycmF5In0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1siYXJyYXkiLCI/b2Zmc2V0Il1dLCJyZWNlaXZlciI6IlVpbnQ4Q2xhbXBlZEFycmF5In0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1siYXJyYXkiLCI/b2Zmc2V0Il1dLCJyZWNlaXZlciI6IkludDE2QXJyYXkifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJhcnJheSIsIj9vZmZzZXQiXV0sInJlY2VpdmVyIjoiVWludDE2QXJyYXkifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJhcnJheSIsIj9vZmZzZXQiXV0sInJlY2VpdmVyIjoiSW50MzJBcnJheSJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbImFycmF5IiwiP29mZnNldCJdXSwicmVjZWl2ZXIiOiJVaW50MzJBcnJheSJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbImFycmF5IiwiP29mZnNldCJdXSwicmVjZWl2ZXIiOiJGbG9hdDMyQXJyYXkifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJhcnJheSIsIj9vZmZzZXQiXV0sInJlY2VpdmVyIjoiRmxvYXQ2NEFycmF5In0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1sicHJvcGVydHkiLCIuLi52YWx1ZXMiXV0sInJlY2VpdmVyIjoiU3R5bGVQcm9wZXJ0eU1hcCJ9LHsibmFtZSI6InNldCIsInNpZ25hdHVyZXMiOltbImtleSIsInZhbHVlIl1dLCJyZWNlaXZlciI6IkhlYWRlcnMifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmFsdWUiLCI/ZmlsZW5hbWUiXV0sInJlY2VpdmVyIjoiRm9ybURhdGEifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmFsdWUiXV0sInJlY2VpdmVyIjoiVVJMU2VhcmNoUGFyYW1zIn0seyJuYW1lIjoic2V0Iiwic2lnbmF0dXJlcyI6W1sib3B0aW9ucyJdLFsibmFtZSIsInZhbHVlIiwiP29wdGlvbnMiXV0sInJlY2VpdmVyIjoiQ29va2llU3RvcmUifSx7Im5hbWUiOiJzZXQiLCJzaWduYXR1cmVzIjpbWyJpbnN0cnVtZW50S2V5IiwiZGV0YWlscyJdXSwicmVjZWl2ZXIiOiJQYXltZW50SW5zdHJ1bWVudHMifSx7Im5hbWUiOiJhZGQiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJTZXQifSx7Im5hbWUiOiJhZGQiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJXZWFrU2V0In0seyJuYW1lIjoiYWRkIiwic2lnbmF0dXJlcyI6W1sidHlwZWRBcnJheSIsImluZGV4IiwidmFsdWUiXV0sInJlY2VpdmVyIjoiQXRvbWljcyJ9LHsibmFtZSI6ImFkZCIsInNpZ25hdHVyZXMiOltbImZpbGUiXSxbImRhdGEiLCJ0eXBlIl1dLCJyZWNlaXZlciI6IkRhdGFUcmFuc2Zlckl0ZW1MaXN0In0seyJuYW1lIjoiYWRkIiwic2lnbmF0dXJlcyI6W1siLi4udmFsdWVzIl1dLCJyZWNlaXZlciI6IkNTU051bWVyaWNWYWx1ZSJ9LHsibmFtZSI6ImFkZCIsInNpZ25hdHVyZXMiOltbIm5vZGUiLCI/YmVmb3JlIl1dLCJyZWNlaXZlciI6IkFjY2Vzc2libGVOb2RlTGlzdCJ9LHsibmFtZSI6ImFkZCIsInNpZ25hdHVyZXMiOltbIi4uLnRva2VucyJdXSwicmVjZWl2ZXIiOiJET01Ub2tlbkxpc3QifSx7Im5hbWUiOiJhZGQiLCJzaWduYXR1cmVzIjpbWyJlbGVtZW50IiwiP2JlZm9yZSJdXSwicmVjZWl2ZXIiOiJIVE1MT3B0aW9uc0NvbGxlY3Rpb24ifSx7Im5hbWUiOiJhZGQiLCJzaWduYXR1cmVzIjpbWyJlbGVtZW50IiwiP2JlZm9yZSJdXSwicmVjZWl2ZXIiOiJIVE1MU2VsZWN0RWxlbWVudCJ9LHsibmFtZSI6ImFkZCIsInNpZ25hdHVyZXMiOltbInJlcXVlc3QiXV0sInJlY2VpdmVyIjoiQ2FjaGUifSx7Im5hbWUiOiJhZGQiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSIsIj9rZXkiXV0sInJlY2VpdmVyIjoiSURCT2JqZWN0U3RvcmUifSx7Im5hbWUiOiJhbGwiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZXMiXV19LHsibmFtZSI6InJhY2UiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZXMiXV19LHsibmFtZSI6InJlamVjdCIsInNpZ25hdHVyZXMiOltbInJlYXNvbiJdXX0seyJuYW1lIjoicmVzb2x2ZSIsInNpZ25hdHVyZXMiOltbIj92YWx1ZSJdXX0seyJuYW1lIjoidG9TdHJpbmciLCJzaWduYXR1cmVzIjpbWyI/cmFkaXgiXV0sInJlY2VpdmVyIjoiTnVtYmVyIn0seyJuYW1lIjoiZm9yIiwic2lnbmF0dXJlcyI6W1sia2V5Il1dfSx7Im5hbWUiOiJrZXlGb3IiLCJzaWduYXR1cmVzIjpbWyJzeW0iXV19LHsibmFtZSI6Im5leHQiLCJzaWduYXR1cmVzIjpbWyI/dmFsdWUiXV19LHsibmFtZSI6InJldHVybiIsInNpZ25hdHVyZXMiOltbIj92YWx1ZSJdXX0seyJuYW1lIjoidGhyb3ciLCJzaWduYXR1cmVzIjpbWyI/ZSJdXX0seyJuYW1lIjoiZW50cmllcyIsInNpZ25hdHVyZXMiOltbIm8iXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoia2V5cyIsInNpZ25hdHVyZXMiOltbIm8iXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoia2V5cyIsInNpZ25hdHVyZXMiOltbIj9yZXF1ZXN0IiwiP29wdGlvbnMiXV0sInJlY2VpdmVyIjoiQ2FjaGUifSx7Im5hbWUiOiJ2YWx1ZXMiLCJzaWduYXR1cmVzIjpbWyJvIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImdldFByb3RvdHlwZU9mIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0Il1dLCJyZWNlaXZlciI6IlByb3h5SGFuZGxlciJ9LHsibmFtZSI6ImdldFByb3RvdHlwZU9mIiwic2lnbmF0dXJlcyI6W1sibyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJpc0V4dGVuc2libGUiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiXV0sInJlY2VpdmVyIjoiUHJveHlIYW5kbGVyIn0seyJuYW1lIjoiaXNFeHRlbnNpYmxlIiwic2lnbmF0dXJlcyI6W1sibyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJwcmV2ZW50RXh0ZW5zaW9ucyIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXSwicmVjZWl2ZXIiOiJQcm94eUhhbmRsZXIifSx7Im5hbWUiOiJwcmV2ZW50RXh0ZW5zaW9ucyIsInNpZ25hdHVyZXMiOltbIm8iXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoiZGVsZXRlUHJvcGVydHkiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJwIl1dfSx7Im5hbWUiOiJlbnVtZXJhdGUiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiXV19LHsibmFtZSI6Im93bktleXMiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiXV19LHsibmFtZSI6ImFwcGx5Iiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwidGhpc0FyZyIsIj9hcmdBcnJheSJdXSwicmVjZWl2ZXIiOiJQcm94eUhhbmRsZXIifSx7Im5hbWUiOiJhcHBseSIsInNpZ25hdHVyZXMiOltbInRoaXNBcmciLCI/YXJnQXJyYXkiXV0sInJlY2VpdmVyIjoiRnVuY3Rpb24ifSx7Im5hbWUiOiJjb25zdHJ1Y3QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJhcmdBcnJheSIsIj9uZXdUYXJnZXQiXV19LHsibmFtZSI6InJldm9jYWJsZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImhhbmRsZXIiXV19LHsibmFtZSI6Im1hdGNoIiwic2lnbmF0dXJlcyI6W1sibWF0Y2hlciJdLFsicmVnZXhwIl1dLCJyZWNlaXZlciI6IlN0cmluZyJ9LHsibmFtZSI6Im1hdGNoIiwic2lnbmF0dXJlcyI6W1sicmVxdWVzdCJdXSwicmVjZWl2ZXIiOiJCYWNrZ3JvdW5kRmV0Y2hTZXR0bGVkRmV0Y2hlcyJ9LHsibmFtZSI6Im1hdGNoIiwic2lnbmF0dXJlcyI6W1sicmVxdWVzdCIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkNhY2hlU3RvcmFnZSJ9LHsibmFtZSI6Im1hdGNoIiwic2lnbmF0dXJlcyI6W1sicmVxdWVzdCIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkNhY2hlIn0seyJuYW1lIjoicmVwbGFjZSIsInNpZ25hdHVyZXMiOltbInNlYXJjaFZhbHVlIiwicmVwbGFjZVZhbHVlIl0sWyJzZWFyY2hWYWx1ZSIsInJlcGxhY2VyIl1dLCJyZWNlaXZlciI6IlN0cmluZyJ9LHsibmFtZSI6InJlcGxhY2UiLCJzaWduYXR1cmVzIjpbWyJ0b2tlbiIsIm5ld1Rva2VuIl1dLCJyZWNlaXZlciI6IkRPTVRva2VuTGlzdCJ9LHsibmFtZSI6InJlcGxhY2UiLCJzaWduYXR1cmVzIjpbWyJ1cmwiXV0sInJlY2VpdmVyIjoiTG9jYXRpb24ifSx7Im5hbWUiOiJzZWFyY2giLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hlciJdLFsicmVnZXhwIl1dfSx7Im5hbWUiOiJzcGxpdCIsInNpZ25hdHVyZXMiOltbInNwbGl0dGVyIiwiP2xpbWl0Il0sWyJzZXBhcmF0b3IiLCI/bGltaXQiXV19LHsibmFtZSI6ImV2YWwiLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJkZWNvZGVVUkkiLCJzaWduYXR1cmVzIjpbWyJlbmNvZGVkVVJJIl1dfSx7Im5hbWUiOiJkZWNvZGVVUklDb21wb25lbnQiLCJzaWduYXR1cmVzIjpbWyJlbmNvZGVkVVJJQ29tcG9uZW50Il1dfSx7Im5hbWUiOiJlbmNvZGVVUkkiLCJzaWduYXR1cmVzIjpbWyJ1cmkiXV19LHsibmFtZSI6ImVuY29kZVVSSUNvbXBvbmVudCIsInNpZ25hdHVyZXMiOltbInVyaUNvbXBvbmVudCJdXX0seyJuYW1lIjoiZXNjYXBlIiwic2lnbmF0dXJlcyI6W1sic3RyaW5nIl1dLCJyZWNlaXZlciI6IldpbmRvdyJ9LHsibmFtZSI6ImVzY2FwZSIsInNpZ25hdHVyZXMiOltbImlkZW50Il1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImVzY2FwZSIsInNpZ25hdHVyZXMiOltbImh0bWwiXV0sInN0YXRpYyI6dHJ1ZX0seyJuYW1lIjoidW5lc2NhcGUiLCJzaWduYXR1cmVzIjpbWyJzdHJpbmciXV19LHsibmFtZSI6InRvTG9jYWxlU3RyaW5nIiwic2lnbmF0dXJlcyI6W1siP2xvY2FsZXMiLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJEYXRlIn0seyJuYW1lIjoidG9Mb2NhbGVTdHJpbmciLCJzaWduYXR1cmVzIjpbWyI/bG9jYWxlcyIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6Ik51bWJlciJ9LHsibmFtZSI6ImlzUHJvdG90eXBlT2YiLCJzaWduYXR1cmVzIjpbWyJ2Il1dfSx7Im5hbWUiOiJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwic2lnbmF0dXJlcyI6W1sibyJdXX0seyJuYW1lIjoiY3JlYXRlIiwic2lnbmF0dXJlcyI6W1sibyIsIj9wcm9wZXJ0aWVzIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImNyZWF0ZSIsInNpZ25hdHVyZXMiOltbInVybCJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJjcmVhdGUiLCJzaWduYXR1cmVzIjpbWyI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJDcmVkZW50aWFsc0NvbnRhaW5lciJ9LHsibmFtZSI6ImRlZmluZVByb3BlcnRpZXMiLCJzaWduYXR1cmVzIjpbWyJvIiwicHJvcGVydGllcyJdXX0seyJuYW1lIjoic2VhbCIsInNpZ25hdHVyZXMiOltbIm8iXV19LHsibmFtZSI6ImZyZWV6ZSIsInNpZ25hdHVyZXMiOltbImEiXSxbImYiXSxbIm8iXV19LHsibmFtZSI6ImlzU2VhbGVkIiwic2lnbmF0dXJlcyI6W1sibyJdXX0seyJuYW1lIjoiaXNGcm96ZW4iLCJzaWduYXR1cmVzIjpbWyJvIl1dfSx7Im5hbWUiOiJjYWxsIiwic2lnbmF0dXJlcyI6W1sidGhpc0FyZyIsIi4uLmFyZ0FycmF5Il1dfSx7Im5hbWUiOiJiaW5kIiwic2lnbmF0dXJlcyI6W1sidGhpc0FyZyIsIi4uLmFyZ0FycmF5Il1dfSx7Im5hbWUiOiJjaGFyQXQiLCJzaWduYXR1cmVzIjpbWyJwb3MiXV19LHsibmFtZSI6ImNoYXJDb2RlQXQiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXX0seyJuYW1lIjoiY29uY2F0Iiwic2lnbmF0dXJlcyI6W1siLi4uc3RyaW5ncyJdXSwicmVjZWl2ZXIiOiJTdHJpbmcifSx7Im5hbWUiOiJjb25jYXQiLCJzaWduYXR1cmVzIjpbWyIuLi5pdGVtcyJdXSwicmVjZWl2ZXIiOiJSZWFkb25seUFycmF5In0seyJuYW1lIjoiY29uY2F0Iiwic2lnbmF0dXJlcyI6W1siLi4uaXRlbXMiXV0sInJlY2VpdmVyIjoiQXJyYXkifSx7Im5hbWUiOiJpbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoU3RyaW5nIiwiP3Bvc2l0aW9uIl1dLCJyZWNlaXZlciI6IlN0cmluZyJ9LHsibmFtZSI6ImluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJSZWFkb25seUFycmF5In0seyJuYW1lIjoiaW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoiaW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkludDhBcnJheSJ9LHsibmFtZSI6ImluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJVaW50OEFycmF5In0seyJuYW1lIjoiaW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IlVpbnQ4Q2xhbXBlZEFycmF5In0seyJuYW1lIjoiaW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkludDE2QXJyYXkifSx7Im5hbWUiOiJpbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiVWludDE2QXJyYXkifSx7Im5hbWUiOiJpbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiSW50MzJBcnJheSJ9LHsibmFtZSI6ImluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJVaW50MzJBcnJheSJ9LHsibmFtZSI6ImluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJGbG9hdDMyQXJyYXkifSx7Im5hbWUiOiJpbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiRmxvYXQ2NEFycmF5In0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hTdHJpbmciLCI/cG9zaXRpb24iXV0sInJlY2VpdmVyIjoiU3RyaW5nIn0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJSZWFkb25seUFycmF5In0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJBcnJheSJ9LHsibmFtZSI6Imxhc3RJbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiSW50OEFycmF5In0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJVaW50OEFycmF5In0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJVaW50OENsYW1wZWRBcnJheSJ9LHsibmFtZSI6Imxhc3RJbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiSW50MTZBcnJheSJ9LHsibmFtZSI6Imxhc3RJbmRleE9mIiwic2lnbmF0dXJlcyI6W1sic2VhcmNoRWxlbWVudCIsIj9mcm9tSW5kZXgiXV0sInJlY2VpdmVyIjoiVWludDE2QXJyYXkifSx7Im5hbWUiOiJsYXN0SW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkludDMyQXJyYXkifSx7Im5hbWUiOiJsYXN0SW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IlVpbnQzMkFycmF5In0seyJuYW1lIjoibGFzdEluZGV4T2YiLCJzaWduYXR1cmVzIjpbWyJzZWFyY2hFbGVtZW50IiwiP2Zyb21JbmRleCJdXSwicmVjZWl2ZXIiOiJGbG9hdDMyQXJyYXkifSx7Im5hbWUiOiJsYXN0SW5kZXhPZiIsInNpZ25hdHVyZXMiOltbInNlYXJjaEVsZW1lbnQiLCI/ZnJvbUluZGV4Il1dLCJyZWNlaXZlciI6IkZsb2F0NjRBcnJheSJ9LHsibmFtZSI6ImxvY2FsZUNvbXBhcmUiLCJzaWduYXR1cmVzIjpbWyJ0aGF0IiwiP2xvY2FsZXMiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IlN0cmluZyJ9LHsibmFtZSI6InNsaWNlIiwic2lnbmF0dXJlcyI6W1siP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJSZWFkb25seUFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IkNvbmNhdEFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyJiZWdpbiIsIj9lbmQiXV0sInJlY2VpdmVyIjoiQXJyYXlCdWZmZXIifSx7Im5hbWUiOiJzbGljZSIsInNpZ25hdHVyZXMiOltbIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiSW50OEFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IlVpbnQ4QXJyYXkifSx7Im5hbWUiOiJzbGljZSIsInNpZ25hdHVyZXMiOltbIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiVWludDhDbGFtcGVkQXJyYXkifSx7Im5hbWUiOiJzbGljZSIsInNpZ25hdHVyZXMiOltbIj9zdGFydCIsIj9lbmQiXV0sInJlY2VpdmVyIjoiSW50MTZBcnJheSJ9LHsibmFtZSI6InNsaWNlIiwic2lnbmF0dXJlcyI6W1siP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJVaW50MTZBcnJheSJ9LHsibmFtZSI6InNsaWNlIiwic2lnbmF0dXJlcyI6W1siP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJJbnQzMkFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IlVpbnQzMkFycmF5In0seyJuYW1lIjoic2xpY2UiLCJzaWduYXR1cmVzIjpbWyI/c3RhcnQiLCI/ZW5kIl1dLCJyZWNlaXZlciI6IkZsb2F0MzJBcnJheSJ9LHsibmFtZSI6InNsaWNlIiwic2lnbmF0dXJlcyI6W1siP3N0YXJ0IiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJGbG9hdDY0QXJyYXkifSx7Im5hbWUiOiJzbGljZSIsInNpZ25hdHVyZXMiOltbImJlZ2luIiwiP2VuZCJdXSwicmVjZWl2ZXIiOiJTaGFyZWRBcnJheUJ1ZmZlciJ9LHsibmFtZSI6InNsaWNlIiwic2lnbmF0dXJlcyI6W1siP3N0YXJ0IiwiP2VuZCIsIj9jb250ZW50VHlwZSJdXSwicmVjZWl2ZXIiOiJCbG9iIn0seyJuYW1lIjoic3Vic3RyaW5nIiwic2lnbmF0dXJlcyI6W1sic3RhcnQiLCI/ZW5kIl1dfSx7Im5hbWUiOiJzdWJzdHIiLCJzaWduYXR1cmVzIjpbWyJmcm9tIiwiP2xlbmd0aCJdXX0seyJuYW1lIjoiZnJvbUNoYXJDb2RlIiwic2lnbmF0dXJlcyI6W1siLi4uY29kZXMiXV19LHsibmFtZSI6InRvRml4ZWQiLCJzaWduYXR1cmVzIjpbWyI/ZnJhY3Rpb25EaWdpdHMiXV19LHsibmFtZSI6InRvRXhwb25lbnRpYWwiLCJzaWduYXR1cmVzIjpbWyI/ZnJhY3Rpb25EaWdpdHMiXV19LHsibmFtZSI6InRvUHJlY2lzaW9uIiwic2lnbmF0dXJlcyI6W1siP3ByZWNpc2lvbiJdXX0seyJuYW1lIjoiYWJzIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiYWNvcyIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImFzaW4iLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJhdGFuIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoiYXRhbjIiLCJzaWduYXR1cmVzIjpbWyJ5IiwieCJdXX0seyJuYW1lIjoiY2VpbCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImNvcyIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImV4cCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6ImZsb29yIiwic2lnbmF0dXJlcyI6W1sieCJdXX0seyJuYW1lIjoibG9nIiwic2lnbmF0dXJlcyI6W1sieCJdXSwicmVjZWl2ZXIiOiJNYXRoIn0seyJuYW1lIjoibG9nIiwic2lnbmF0dXJlcyI6W1siLi4uZGF0YSJdXSwicmVjZWl2ZXIiOiJjb25zb2xlIn0seyJuYW1lIjoibWF4Iiwic2lnbmF0dXJlcyI6W1siLi4udmFsdWVzIl1dfSx7Im5hbWUiOiJtaW4iLCJzaWduYXR1cmVzIjpbWyIuLi52YWx1ZXMiXV19LHsibmFtZSI6InBvdyIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJyb3VuZCIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6InNpbiIsInNpZ25hdHVyZXMiOltbIngiXV19LHsibmFtZSI6InNxcnQiLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJ0YW4iLCJzaWduYXR1cmVzIjpbWyJ4Il1dfSx7Im5hbWUiOiJ0b0xvY2FsZURhdGVTdHJpbmciLCJzaWduYXR1cmVzIjpbWyI/bG9jYWxlcyIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJ0b0xvY2FsZVRpbWVTdHJpbmciLCJzaWduYXR1cmVzIjpbWyI/bG9jYWxlcyIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJzZXRUaW1lIiwic2lnbmF0dXJlcyI6W1sidGltZSJdXX0seyJuYW1lIjoic2V0TWlsbGlzZWNvbmRzIiwic2lnbmF0dXJlcyI6W1sibXMiXV19LHsibmFtZSI6InNldFVUQ01pbGxpc2Vjb25kcyIsInNpZ25hdHVyZXMiOltbIm1zIl1dfSx7Im5hbWUiOiJzZXRTZWNvbmRzIiwic2lnbmF0dXJlcyI6W1sic2VjIiwiP21zIl1dfSx7Im5hbWUiOiJzZXRVVENTZWNvbmRzIiwic2lnbmF0dXJlcyI6W1sic2VjIiwiP21zIl1dfSx7Im5hbWUiOiJzZXRNaW51dGVzIiwic2lnbmF0dXJlcyI6W1sibWluIiwiP3NlYyIsIj9tcyJdXX0seyJuYW1lIjoic2V0VVRDTWludXRlcyIsInNpZ25hdHVyZXMiOltbIm1pbiIsIj9zZWMiLCI/bXMiXV19LHsibmFtZSI6InNldEhvdXJzIiwic2lnbmF0dXJlcyI6W1siaG91cnMiLCI/bWluIiwiP3NlYyIsIj9tcyJdXX0seyJuYW1lIjoic2V0VVRDSG91cnMiLCJzaWduYXR1cmVzIjpbWyJob3VycyIsIj9taW4iLCI/c2VjIiwiP21zIl1dfSx7Im5hbWUiOiJzZXREYXRlIiwic2lnbmF0dXJlcyI6W1siZGF0ZSJdXX0seyJuYW1lIjoic2V0VVRDRGF0ZSIsInNpZ25hdHVyZXMiOltbImRhdGUiXV19LHsibmFtZSI6InNldE1vbnRoIiwic2lnbmF0dXJlcyI6W1sibW9udGgiLCI/ZGF0ZSJdXX0seyJuYW1lIjoic2V0VVRDTW9udGgiLCJzaWduYXR1cmVzIjpbWyJtb250aCIsIj9kYXRlIl1dfSx7Im5hbWUiOiJzZXRGdWxsWWVhciIsInNpZ25hdHVyZXMiOltbInllYXIiLCI/bW9udGgiLCI/ZGF0ZSJdXX0seyJuYW1lIjoic2V0VVRDRnVsbFllYXIiLCJzaWduYXR1cmVzIjpbWyJ5ZWFyIiwiP21vbnRoIiwiP2RhdGUiXV19LHsibmFtZSI6InRvSlNPTiIsInNpZ25hdHVyZXMiOltbIj9rZXkiXV19LHsibmFtZSI6InBhcnNlIiwic2lnbmF0dXJlcyI6W1sicyJdXSwic3RhdGljIjp0cnVlfSx7Im5hbWUiOiJwYXJzZSIsInNpZ25hdHVyZXMiOltbInRleHQiLCI/cmV2aXZlciJdXSwicmVjZWl2ZXIiOiJKU09OIn0seyJuYW1lIjoicGFyc2UiLCJzaWduYXR1cmVzIjpbWyJjc3NUZXh0Il1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6IlVUQyIsInNpZ25hdHVyZXMiOltbInllYXIiLCJtb250aCIsIj9kYXRlIiwiP2hvdXJzIiwiP21pbnV0ZXMiLCI/c2Vjb25kcyIsIj9tcyJdXX0seyJuYW1lIjoiZXhlYyIsInNpZ25hdHVyZXMiOltbInN0cmluZyJdXX0seyJuYW1lIjoidGVzdCIsInNpZ25hdHVyZXMiOltbInN0cmluZyJdXX0seyJuYW1lIjoic3RyaW5naWZ5Iiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/cmVwbGFjZXIiLCI/c3BhY2UiXV19LHsibmFtZSI6ImpvaW4iLCJzaWduYXR1cmVzIjpbWyI/c2VwYXJhdG9yIl1dfSx7Im5hbWUiOiJldmVyeSIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrZm4iLCI/dGhpc0FyZyJdXX0seyJuYW1lIjoic29tZSIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrZm4iLCI/dGhpc0FyZyJdXX0seyJuYW1lIjoibWFwIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2tmbiIsIj90aGlzQXJnIl1dfSx7Im5hbWUiOiJmaWx0ZXIiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFja2ZuIiwiP3RoaXNBcmciXV19LHsibmFtZSI6InJlZHVjZSIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrZm4iLCI/aW5pdGlhbFZhbHVlIl1dfSx7Im5hbWUiOiJyZWR1Y2VSaWdodCIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrZm4iLCI/aW5pdGlhbFZhbHVlIl1dfSx7Im5hbWUiOiJwdXNoIiwic2lnbmF0dXJlcyI6W1siLi4uaXRlbXMiXV0sInJlY2VpdmVyIjoiQXJyYXkifSx7Im5hbWUiOiJwdXNoIiwic2lnbmF0dXJlcyI6W1sibWVzc2FnZSIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6Ik5GQyJ9LHsibmFtZSI6InNvcnQiLCJzaWduYXR1cmVzIjpbWyI/Y29tcGFyZUZuIl1dLCJyZWNlaXZlciI6IkFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiSW50OEFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiVWludDhBcnJheSJ9LHsibmFtZSI6InNvcnQiLCJzaWduYXR1cmVzIjpbWyI/Y29tcGFyZUZuIl1dLCJyZWNlaXZlciI6IlVpbnQ4Q2xhbXBlZEFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiSW50MTZBcnJheSJ9LHsibmFtZSI6InNvcnQiLCJzaWduYXR1cmVzIjpbWyI/Y29tcGFyZUZuIl1dLCJyZWNlaXZlciI6IlVpbnQxNkFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiSW50MzJBcnJheSJ9LHsibmFtZSI6InNvcnQiLCJzaWduYXR1cmVzIjpbWyI/Y29tcGFyZUZuIl1dLCJyZWNlaXZlciI6IlVpbnQzMkFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiRmxvYXQzMkFycmF5In0seyJuYW1lIjoic29ydCIsInNpZ25hdHVyZXMiOltbIj9jb21wYXJlRm4iXV0sInJlY2VpdmVyIjoiRmxvYXQ2NEFycmF5In0seyJuYW1lIjoic3BsaWNlIiwic2lnbmF0dXJlcyI6W1sic3RhcnQiLCI/ZGVsZXRlQ291bnQiLCIuLi5pdGVtcyJdXX0seyJuYW1lIjoidW5zaGlmdCIsInNpZ25hdHVyZXMiOltbIi4uLml0ZW1zIl1dfSx7Im5hbWUiOiJpc0FycmF5Iiwic2lnbmF0dXJlcyI6W1siYXJnIl1dfSx7Im5hbWUiOiJ0aGVuIiwic2lnbmF0dXJlcyI6W1siP29uZnVsZmlsbGVkIiwiP29ucmVqZWN0ZWQiXV19LHsibmFtZSI6ImNhdGNoIiwic2lnbmF0dXJlcyI6W1siP29ucmVqZWN0ZWQiXV19LHsibmFtZSI6ImlzVmlldyIsInNpZ25hdHVyZXMiOltbImFyZyJdXX0seyJuYW1lIjoiZ2V0RmxvYXQzMiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCI/bGl0dGxlRW5kaWFuIl1dfSx7Im5hbWUiOiJnZXRGbG9hdDY0Iiwic2lnbmF0dXJlcyI6W1siYnl0ZU9mZnNldCIsIj9saXR0bGVFbmRpYW4iXV19LHsibmFtZSI6ImdldEludDgiLCJzaWduYXR1cmVzIjpbWyJieXRlT2Zmc2V0Il1dfSx7Im5hbWUiOiJnZXRJbnQxNiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCI/bGl0dGxlRW5kaWFuIl1dfSx7Im5hbWUiOiJnZXRJbnQzMiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCI/bGl0dGxlRW5kaWFuIl1dfSx7Im5hbWUiOiJnZXRVaW50OCIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiXV19LHsibmFtZSI6ImdldFVpbnQxNiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCI/bGl0dGxlRW5kaWFuIl1dfSx7Im5hbWUiOiJnZXRVaW50MzIiLCJzaWduYXR1cmVzIjpbWyJieXRlT2Zmc2V0IiwiP2xpdHRsZUVuZGlhbiJdXX0seyJuYW1lIjoic2V0RmxvYXQzMiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCJ2YWx1ZSIsIj9saXR0bGVFbmRpYW4iXV19LHsibmFtZSI6InNldEZsb2F0NjQiLCJzaWduYXR1cmVzIjpbWyJieXRlT2Zmc2V0IiwidmFsdWUiLCI/bGl0dGxlRW5kaWFuIl1dfSx7Im5hbWUiOiJzZXRJbnQ4Iiwic2lnbmF0dXJlcyI6W1siYnl0ZU9mZnNldCIsInZhbHVlIl1dfSx7Im5hbWUiOiJzZXRJbnQxNiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCJ2YWx1ZSIsIj9saXR0bGVFbmRpYW4iXV19LHsibmFtZSI6InNldEludDMyIiwic2lnbmF0dXJlcyI6W1siYnl0ZU9mZnNldCIsInZhbHVlIiwiP2xpdHRsZUVuZGlhbiJdXX0seyJuYW1lIjoic2V0VWludDgiLCJzaWduYXR1cmVzIjpbWyJieXRlT2Zmc2V0IiwidmFsdWUiXV19LHsibmFtZSI6InNldFVpbnQxNiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCJ2YWx1ZSIsIj9saXR0bGVFbmRpYW4iXV19LHsibmFtZSI6InNldFVpbnQzMiIsInNpZ25hdHVyZXMiOltbImJ5dGVPZmZzZXQiLCJ2YWx1ZSIsIj9saXR0bGVFbmRpYW4iXV19LHsibmFtZSI6InN1YmFycmF5Iiwic2lnbmF0dXJlcyI6W1siYmVnaW4iLCI/ZW5kIl1dfSx7Im5hbWUiOiJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwic2lnbmF0dXJlcyI6W1sibyJdXX0seyJuYW1lIjoiYW5kIiwic2lnbmF0dXJlcyI6W1sidHlwZWRBcnJheSIsImluZGV4IiwidmFsdWUiXV19LHsibmFtZSI6ImNvbXBhcmVFeGNoYW5nZSIsInNpZ25hdHVyZXMiOltbInR5cGVkQXJyYXkiLCJpbmRleCIsImV4cGVjdGVkVmFsdWUiLCJyZXBsYWNlbWVudFZhbHVlIl1dfSx7Im5hbWUiOiJleGNoYW5nZSIsInNpZ25hdHVyZXMiOltbInR5cGVkQXJyYXkiLCJpbmRleCIsInZhbHVlIl1dfSx7Im5hbWUiOiJpc0xvY2tGcmVlIiwic2lnbmF0dXJlcyI6W1sic2l6ZSJdXX0seyJuYW1lIjoibG9hZCIsInNpZ25hdHVyZXMiOltbInR5cGVkQXJyYXkiLCJpbmRleCJdXSwicmVjZWl2ZXIiOiJBdG9taWNzIn0seyJuYW1lIjoibG9hZCIsInNpZ25hdHVyZXMiOltbImZvbnQiLCI/dGV4dCJdXSwicmVjZWl2ZXIiOiJGb250RmFjZVNldCJ9LHsibmFtZSI6ImxvYWQiLCJzaWduYXR1cmVzIjpbWyJzZXNzaW9uSWQiXV0sInJlY2VpdmVyIjoiTWVkaWFLZXlTZXNzaW9uIn0seyJuYW1lIjoib3IiLCJzaWduYXR1cmVzIjpbWyJ0eXBlZEFycmF5IiwiaW5kZXgiLCJ2YWx1ZSJdXX0seyJuYW1lIjoic3RvcmUiLCJzaWduYXR1cmVzIjpbWyJ0eXBlZEFycmF5IiwiaW5kZXgiLCJ2YWx1ZSJdXSwicmVjZWl2ZXIiOiJBdG9taWNzIn0seyJuYW1lIjoic3RvcmUiLCJzaWduYXR1cmVzIjpbWyJjcmVkZW50aWFsIl1dLCJyZWNlaXZlciI6IkNyZWRlbnRpYWxzQ29udGFpbmVyIn0seyJuYW1lIjoid2FpdCIsInNpZ25hdHVyZXMiOltbInR5cGVkQXJyYXkiLCJpbmRleCIsInZhbHVlIiwiP3RpbWVvdXQiXV19LHsibmFtZSI6Indha2UiLCJzaWduYXR1cmVzIjpbWyJ0eXBlZEFycmF5IiwiaW5kZXgiLCJjb3VudCJdXX0seyJuYW1lIjoieG9yIiwic2lnbmF0dXJlcyI6W1sidHlwZWRBcnJheSIsImluZGV4IiwidmFsdWUiXV19LHsibmFtZSI6InBhZFN0YXJ0Iiwic2lnbmF0dXJlcyI6W1sibWF4TGVuZ3RoIiwiP2ZpbGxTdHJpbmciXV19LHsibmFtZSI6InBhZEVuZCIsInNpZ25hdHVyZXMiOltbIm1heExlbmd0aCIsIj9maWxsU3RyaW5nIl1dfSx7Im5hbWUiOiJmb3JtYXRUb1BhcnRzIiwic2lnbmF0dXJlcyI6W1siP2RhdGUiXV19LHsibmFtZSI6ImZpbmFsbHkiLCJzaWduYXR1cmVzIjpbWyI/b25maW5hbGx5Il1dfSx7Im5hbWUiOiJmbGF0TWFwIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2siLCI/dGhpc0FyZyJdXX0seyJuYW1lIjoiZmxhdHRlbiIsInNpZ25hdHVyZXMiOltbIj9kZXB0aCJdXX0seyJuYW1lIjoidXBkYXRlVGltaW5nIiwic2lnbmF0dXJlcyI6W1siP3RpbWluZyJdXX0seyJuYW1lIjoiQW5pbWF0aW9uIiwic2lnbmF0dXJlcyI6W1siP2VmZmVjdCIsIj90aW1lbGluZSJdXX0seyJuYW1lIjoiY2FuY2VsIiwic2lnbmF0dXJlcyI6W1siP3JlYXNvbiJdXSwicmVjZWl2ZXIiOiJVbmRlcmx5aW5nU291cmNlQmFzZSJ9LHsibmFtZSI6ImFuaW1hdGUiLCJzaWduYXR1cmVzIjpbWyJrZXlmcmFtZXMiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoic2V0S2V5ZnJhbWVzIiwic2lnbmF0dXJlcyI6W1sia2V5ZnJhbWVzIl1dfSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiRGF0YVRyYW5zZmVySXRlbUxpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiQ1NTS2V5ZnJhbWVzUnVsZSJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl0sWyJwcm9wZXJ0eSIsInByb3BlcnR5VmFsdWUiXV0sInJlY2VpdmVyIjoiQ1NTU3R5bGVEZWNsYXJhdGlvbiJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJDU1NOdW1lcmljQXJyYXkifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCI/dmFsIl1dLCJyZWNlaXZlciI6IkNTU1RyYW5zZm9ybVZhbHVlIn0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4IiwiP3ZhbCJdXSwicmVjZWl2ZXIiOiJDU1NVbnBhcnNlZFZhbHVlIn0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiU3R5bGVTaGVldExpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCJub2RlIl1dLCJyZWNlaXZlciI6IkFjY2Vzc2libGVOb2RlTGlzdCJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwiP3ZhbHVlIl1dLCJyZWNlaXZlciI6IkRPTVN0cmluZ01hcCJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdLFsibmFtZSJdXSwicmVjZWl2ZXIiOiJXaW5kb3cifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiSFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb24ifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXSxbIm5hbWUiXV0sInJlY2VpdmVyIjoiSFRNTEZvcm1FbGVtZW50In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4IiwiP29wdGlvbiJdLFsibmFtZSJdXSwicmVjZWl2ZXIiOiJIVE1MT3B0aW9uc0NvbGxlY3Rpb24ifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCJvcHRpb24iXV0sInJlY2VpdmVyIjoiSFRNTFNlbGVjdEVsZW1lbnQifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiUmFkaW9Ob2RlTGlzdCJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJIVE1MQWxsQ29sbGVjdGlvbiJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwiP3ZhbHVlIl1dLCJyZWNlaXZlciI6IkhUTUxFbWJlZEVsZW1lbnQifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJIVE1MRnJhbWVTZXRFbGVtZW50In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbIm5hbWUiLCI/dmFsdWUiXV0sInJlY2VpdmVyIjoiSFRNTE9iamVjdEVsZW1lbnQifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiQXVkaW9UcmFja0xpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiVGV4dFRyYWNrQ3VlTGlzdCJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJUZXh0VHJhY2tMaXN0In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IlZpZGVvVHJhY2tMaXN0In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4IiwibmV3SXRlbSJdXSwicmVjZWl2ZXIiOiJTVkdMZW5ndGhMaXN0In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4IiwibmV3SXRlbSJdXSwicmVjZWl2ZXIiOiJTVkdOdW1iZXJMaXN0In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbImluZGV4IiwibmV3SXRlbSJdXSwicmVjZWl2ZXIiOiJTVkdQb2ludExpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCJuZXdJdGVtIl1dLCJyZWNlaXZlciI6IlNWR1N0cmluZ0xpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCJuZXdJdGVtIl1dLCJyZWNlaXZlciI6IlNWR1RyYW5zZm9ybUxpc3QifSx7Im5hbWUiOiJudWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiU291cmNlQnVmZmVyTGlzdCJ9LHsibmFtZSI6Im51bGwiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJUcmFja0RlZmF1bHRMaXN0In0seyJuYW1lIjoibnVsbCIsInNpZ25hdHVyZXMiOltbIj9uYW1lIl1dLCJyZWNlaXZlciI6IlJUQ1N0YXRzUmVzcG9uc2UifSx7Im5hbWUiOiJyZW1vdmUiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJEYXRhVHJhbnNmZXJJdGVtTGlzdCJ9LHsibmFtZSI6InJlbW92ZSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IkFjY2Vzc2libGVOb2RlTGlzdCJ9LHsibmFtZSI6InJlbW92ZSIsInNpZ25hdHVyZXMiOltbIi4uLnRva2VucyJdXSwicmVjZWl2ZXIiOiJET01Ub2tlbkxpc3QifSx7Im5hbWUiOiJyZW1vdmUiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJIVE1MT3B0aW9uc0NvbGxlY3Rpb24ifSx7Im5hbWUiOiJyZW1vdmUiLCJzaWduYXR1cmVzIjpbWyI/aW5kZXgiXV0sInJlY2VpdmVyIjoiSFRNTFNlbGVjdEVsZW1lbnQifSx7Im5hbWUiOiJyZW1vdmUiLCJzaWduYXR1cmVzIjpbWyJzdWNjZXNzQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJFbnRyeSJ9LHsibmFtZSI6InJlbW92ZSIsInNpZ25hdHVyZXMiOltbInN0YXJ0IiwiZW5kIl1dLCJyZWNlaXZlciI6IlNvdXJjZUJ1ZmZlciJ9LHsibmFtZSI6ImdldEFzU3RyaW5nIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2siXV19LHsibmFtZSI6InNldERyYWdJbWFnZSIsInNpZ25hdHVyZXMiOltbImltYWdlIiwieCIsInkiXV19LHsibmFtZSI6ImdldERhdGEiLCJzaWduYXR1cmVzIjpbWyJmb3JtYXQiXV19LHsibmFtZSI6InNldERhdGEiLCJzaWduYXR1cmVzIjpbWyJmb3JtYXQiLCJkYXRhIl1dfSx7Im5hbWUiOiJjbGVhckRhdGEiLCJzaWduYXR1cmVzIjpbWyI/Zm9ybWF0Il1dfSx7Im5hbWUiOiJpbnNlcnRSdWxlIiwic2lnbmF0dXJlcyI6W1sicnVsZSIsImluZGV4Il1dLCJyZWNlaXZlciI6IkNTU0dyb3VwaW5nUnVsZSJ9LHsibmFtZSI6Imluc2VydFJ1bGUiLCJzaWduYXR1cmVzIjpbWyJydWxlIiwiP2luZGV4Il1dLCJyZWNlaXZlciI6IkNTU1N0eWxlU2hlZXQifSx7Im5hbWUiOiJkZWxldGVSdWxlIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiQ1NTR3JvdXBpbmdSdWxlIn0seyJuYW1lIjoiZGVsZXRlUnVsZSIsInNpZ25hdHVyZXMiOltbInNlbGVjdCJdXSwicmVjZWl2ZXIiOiJDU1NLZXlmcmFtZXNSdWxlIn0seyJuYW1lIjoiZGVsZXRlUnVsZSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IkNTU1N0eWxlU2hlZXQifSx7Im5hbWUiOiJhcHBlbmRSdWxlIiwic2lnbmF0dXJlcyI6W1sicnVsZSJdXX0seyJuYW1lIjoiZmluZFJ1bGUiLCJzaWduYXR1cmVzIjpbWyJzZWxlY3QiXV19LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJDU1NSdWxlTGlzdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJDU1NTdHlsZURlY2xhcmF0aW9uIn0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6Ik1lZGlhTGlzdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTdHlsZVNoZWV0TGlzdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJBY2Nlc3NpYmxlTm9kZUxpc3QifSx7Im5hbWUiOiJpdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiRE9NU3RyaW5nTGlzdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJET01Ub2tlbkxpc3QifSx7Im5hbWUiOiJpdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiTmFtZWROb2RlTWFwIn0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6Ik5vZGVMaXN0In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IkZpbGVMaXN0In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IkRPTVJlY3RMaXN0In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IkhUTUxTZWxlY3RFbGVtZW50In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbIj9uYW1lT3JJbmRleCJdXSwicmVjZWl2ZXIiOiJIVE1MQWxsQ29sbGVjdGlvbiJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJIVE1MQ29sbGVjdGlvbiJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJUb3VjaExpc3QifSx7Im5hbWUiOiJpdGVtIiwic2lnbmF0dXJlcyI6W1siP2luZGV4Il1dLCJyZWNlaXZlciI6IkdhbWVwYWRMaXN0In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6Ik1pbWVUeXBlQXJyYXkifSx7Im5hbWUiOiJpdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiUGx1Z2luQXJyYXkifSx7Im5hbWUiOiJpdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiUGx1Z2luIn0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IlNwZWVjaEdyYW1tYXJMaXN0In0seyJuYW1lIjoiaXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IlNwZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCJ9LHsibmFtZSI6Iml0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTUUxSZXN1bHRTZXRSb3dMaXN0In0seyJuYW1lIjoiZ2V0UHJvcGVydHlWYWx1ZSIsInNpZ25hdHVyZXMiOltbInByb3BlcnR5Il1dfSx7Im5hbWUiOiJnZXRQcm9wZXJ0eVByaW9yaXR5Iiwic2lnbmF0dXJlcyI6W1sicHJvcGVydHkiXV19LHsibmFtZSI6InNldFByb3BlcnR5Iiwic2lnbmF0dXJlcyI6W1sicHJvcGVydHkiLCJ2YWx1ZSIsIj9wcmlvcml0eSJdXX0seyJuYW1lIjoicmVtb3ZlUHJvcGVydHkiLCJzaWduYXR1cmVzIjpbWyJwcm9wZXJ0eSJdXX0seyJuYW1lIjoiQ1NTU3R5bGVTaGVldCIsInNpZ25hdHVyZXMiOltbInRleHQiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiYWRkUnVsZSIsInNpZ25hdHVyZXMiOltbIj9zZWxlY3RvciIsIj9zdHlsZSIsIj9pbmRleCJdXX0seyJuYW1lIjoicmVtb3ZlUnVsZSIsInNpZ25hdHVyZXMiOltbIj9pbmRleCJdXX0seyJuYW1lIjoic3VwcG9ydHMiLCJzaWduYXR1cmVzIjpbWyJjb25kaXRpb25UZXh0Il0sWyJwcm9wZXJ0eSIsInZhbHVlIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6InN1cHBvcnRzIiwic2lnbmF0dXJlcyI6W1sidG9rZW4iXV0sInJlY2VpdmVyIjoiRE9NVG9rZW5MaXN0In0seyJuYW1lIjoiQ1NTS2V5d29yZFZhbHVlIiwic2lnbmF0dXJlcyI6W1sia2V5d29yZCJdXX0seyJuYW1lIjoiQ1NTTWF0aEludmVydCIsInNpZ25hdHVyZXMiOltbImFyZyJdXX0seyJuYW1lIjoiQ1NTTWF0aE1heCIsInNpZ25hdHVyZXMiOltbIi4uLmFyZ3MiXV19LHsibmFtZSI6IkNTU01hdGhNaW4iLCJzaWduYXR1cmVzIjpbWyIuLi5hcmdzIl1dfSx7Im5hbWUiOiJDU1NNYXRoTmVnYXRlIiwic2lnbmF0dXJlcyI6W1siYXJnIl1dfSx7Im5hbWUiOiJDU1NNYXRoUHJvZHVjdCIsInNpZ25hdHVyZXMiOltbIi4uLmFyZ3MiXV19LHsibmFtZSI6IkNTU01hdGhTdW0iLCJzaWduYXR1cmVzIjpbWyIuLi5hcmdzIl1dfSx7Im5hbWUiOiJDU1NNYXRyaXhDb21wb25lbnQiLCJzaWduYXR1cmVzIjpbWyJtYXRyaXgiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoibXVsIiwic2lnbmF0dXJlcyI6W1siLi4udmFsdWVzIl1dfSx7Im5hbWUiOiJkaXYiLCJzaWduYXR1cmVzIjpbWyIuLi52YWx1ZXMiXV19LHsibmFtZSI6ImVxdWFscyIsInNpZ25hdHVyZXMiOltbIi4uLnZhbHVlcyJdXX0seyJuYW1lIjoidG8iLCJzaWduYXR1cmVzIjpbWyJ1bml0Il1dfSx7Im5hbWUiOiJ0b1N1bSIsInNpZ25hdHVyZXMiOltbIi4uLnVuaXRzIl1dfSx7Im5hbWUiOiJDU1NQZXJzcGVjdGl2ZSIsInNpZ25hdHVyZXMiOltbImxlbmd0aCJdXX0seyJuYW1lIjoiQ1NTUG9zaXRpb25WYWx1ZSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJDU1NSb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZVZhbHVlIl1dfSx7Im5hbWUiOiJDU1NTY2FsZSIsInNpZ25hdHVyZXMiOltbIngiLCJ5IiwiP3oiXV19LHsibmFtZSI6IkNTU1NrZXdYIiwic2lnbmF0dXJlcyI6W1siYXgiXV19LHsibmFtZSI6IkNTU1NrZXdZIiwic2lnbmF0dXJlcyI6W1siYXkiXV19LHsibmFtZSI6IkNTU1NrZXciLCJzaWduYXR1cmVzIjpbWyJheCIsImF5Il1dfSx7Im5hbWUiOiJDU1NUcmFuc2Zvcm1WYWx1ZSIsInNpZ25hdHVyZXMiOltbInRyYW5zZm9ybXMiXV19LHsibmFtZSI6IkNTU1RyYW5zbGF0ZSIsInNpZ25hdHVyZXMiOltbIngiLCJ5IiwiP3oiXV19LHsibmFtZSI6IkNTU1VuaXRWYWx1ZSIsInNpZ25hdHVyZXMiOltbInZhbHVlIiwidW5pdCJdXX0seyJuYW1lIjoibnVtYmVyIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InBlcmNlbnQiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiZW0iLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiZXgiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiY2giLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoicmVtIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InZ3Iiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InZoIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InZtaW4iLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoidm1heCIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJjbSIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJtbSIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJpbiIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJwdCIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJwYyIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJweCIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJRIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6ImRlZyIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJncmFkIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InJhZCIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJ0dXJuIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6InMiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoibXMiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiSHoiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoia0h6Iiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6ImRwaSIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJkcGNtIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV19LHsibmFtZSI6ImRwcHgiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiZnIiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiQ1NTVW5wYXJzZWRWYWx1ZSIsInNpZ25hdHVyZXMiOltbIm1lbWJlcnMiXV19LHsibmFtZSI6IkNTU1ZhcmlhYmxlUmVmZXJlbmNlVmFsdWUiLCJzaWduYXR1cmVzIjpbWyJ2YXJpYWJsZSIsIj9mYWxsYmFjayJdXX0seyJuYW1lIjoiZ2V0QWxsIiwic2lnbmF0dXJlcyI6W1sicHJvcGVydHkiXV0sInJlY2VpdmVyIjoiU3R5bGVQcm9wZXJ0eU1hcFJlYWRPbmx5In0seyJuYW1lIjoiZ2V0QWxsIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJGb3JtRGF0YSJ9LHsibmFtZSI6ImdldEFsbCIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiVVJMU2VhcmNoUGFyYW1zIn0seyJuYW1lIjoiZ2V0QWxsIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXSxbIm5hbWUiLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJDb29raWVTdG9yZSJ9LHsibmFtZSI6ImdldEFsbCIsInNpZ25hdHVyZXMiOltbIj9xdWVyeSIsIj9jb3VudCJdXSwicmVjZWl2ZXIiOiJJREJJbmRleCJ9LHsibmFtZSI6ImdldEFsbCIsInNpZ25hdHVyZXMiOltbIj9xdWVyeSIsIj9jb3VudCJdXSwicmVjZWl2ZXIiOiJJREJPYmplY3RTdG9yZSJ9LHsibmFtZSI6ImFwcGVuZCIsInNpZ25hdHVyZXMiOltbInByb3BlcnR5IiwiLi4udmFsdWVzIl1dLCJyZWNlaXZlciI6IlN0eWxlUHJvcGVydHlNYXAifSx7Im5hbWUiOiJhcHBlbmQiLCJzaWduYXR1cmVzIjpbWyIuLi5ub2RlcyJdXSwicmVjZWl2ZXIiOiJQYXJlbnROb2RlIn0seyJuYW1lIjoiYXBwZW5kIiwic2lnbmF0dXJlcyI6W1sibmFtZSIsInZhbHVlIl1dLCJyZWNlaXZlciI6IkhlYWRlcnMifSx7Im5hbWUiOiJhcHBlbmQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmFsdWUiLCI/ZmlsZW5hbWUiXV0sInJlY2VpdmVyIjoiRm9ybURhdGEifSx7Im5hbWUiOiJhcHBlbmQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmFsdWUiXV0sInJlY2VpdmVyIjoiVVJMU2VhcmNoUGFyYW1zIn0seyJuYW1lIjoiRm9udEZhY2VTZXRMb2FkRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6ImNoZWNrIiwic2lnbmF0dXJlcyI6W1siZm9udCIsIj90ZXh0Il1dfSx7Im5hbWUiOiJGb250RmFjZSIsInNpZ25hdHVyZXMiOltbImZhbWlseSIsInNvdXJjZSIsIj9kZXNjcmlwdG9ycyJdXX0seyJuYW1lIjoiYXBwZW5kTWVkaXVtIiwic2lnbmF0dXJlcyI6W1sibWVkaXVtIl1dfSx7Im5hbWUiOiJkZWxldGVNZWRpdW0iLCJzaWduYXR1cmVzIjpbWyJtZWRpdW0iXV19LHsibmFtZSI6Ik1lZGlhUXVlcnlMaXN0RXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6ImFkZExpc3RlbmVyIiwic2lnbmF0dXJlcyI6W1sibGlzdGVuZXIiXV19LHsibmFtZSI6InJlbW92ZUxpc3RlbmVyIiwic2lnbmF0dXJlcyI6W1sibGlzdGVuZXIiXV19LHsibmFtZSI6InJlZ2lzdGVyUHJvcGVydHkiLCJzaWduYXR1cmVzIjpbWyJkZXNjcmlwdG9yIl1dfSx7Im5hbWUiOiJtYXRjaE1lZGl1bSIsInNpZ25hdHVyZXMiOltbIj9tZWRpYXF1ZXJ5Il1dfSx7Im5hbWUiOiJTdHlsZVNoZWV0TGlzdCIsInNpZ25hdHVyZXMiOltbInNoZWV0cyJdXX0seyJuYW1lIjoiYXBwZW5kQ2hpbGQiLCJzaWduYXR1cmVzIjpbWyJjaGlsZCJdXSwicmVjZWl2ZXIiOiJBY2Nlc3NpYmxlTm9kZSJ9LHsibmFtZSI6ImFwcGVuZENoaWxkIiwic2lnbmF0dXJlcyI6W1sibm9kZSJdXSwicmVjZWl2ZXIiOiJOb2RlIn0seyJuYW1lIjoicmVtb3ZlQ2hpbGQiLCJzaWduYXR1cmVzIjpbWyJjaGlsZCJdXX0seyJuYW1lIjoic3Vic3RyaW5nRGF0YSIsInNpZ25hdHVyZXMiOltbIm9mZnNldCIsImNvdW50Il1dfSx7Im5hbWUiOiJhcHBlbmREYXRhIiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXX0seyJuYW1lIjoiaW5zZXJ0RGF0YSIsInNpZ25hdHVyZXMiOltbIm9mZnNldCIsImRhdGEiXV19LHsibmFtZSI6ImRlbGV0ZURhdGEiLCJzaWduYXR1cmVzIjpbWyJvZmZzZXQiLCJjb3VudCJdXX0seyJuYW1lIjoicmVwbGFjZURhdGEiLCJzaWduYXR1cmVzIjpbWyJvZmZzZXQiLCJjb3VudCIsImRhdGEiXV19LHsibmFtZSI6ImJlZm9yZSIsInNpZ25hdHVyZXMiOltbIi4uLm5vZGVzIl1dfSx7Im5hbWUiOiJhZnRlciIsInNpZ25hdHVyZXMiOltbIi4uLm5vZGVzIl1dfSx7Im5hbWUiOiJyZXBsYWNlV2l0aCIsInNpZ25hdHVyZXMiOltbIi4uLm5vZGVzIl1dfSx7Im5hbWUiOiJlbGVtZW50RnJvbVBvaW50Iiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV19LHsibmFtZSI6ImVsZW1lbnRzRnJvbVBvaW50Iiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV19LHsibmFtZSI6ImdldEVsZW1lbnRzQnlUYWdOYW1lIiwic2lnbmF0dXJlcyI6W1sibG9jYWxOYW1lIl1dfSx7Im5hbWUiOiJnZXRFbGVtZW50c0J5VGFnTmFtZU5TIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibG9jYWxOYW1lIl1dfSx7Im5hbWUiOiJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwic2lnbmF0dXJlcyI6W1siY2xhc3NOYW1lcyJdXX0seyJuYW1lIjoiY3JlYXRlRWxlbWVudCIsInNpZ25hdHVyZXMiOltbImxvY2FsTmFtZSIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJjcmVhdGVFbGVtZW50TlMiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiLCJxdWFsaWZpZWROYW1lIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImNyZWF0ZVRleHROb2RlIiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXX0seyJuYW1lIjoiY3JlYXRlQ0RBVEFTZWN0aW9uIiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXX0seyJuYW1lIjoiY3JlYXRlQ29tbWVudCIsInNpZ25hdHVyZXMiOltbImRhdGEiXV19LHsibmFtZSI6ImNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImRhdGEiXV19LHsibmFtZSI6ImltcG9ydE5vZGUiLCJzaWduYXR1cmVzIjpbWyJub2RlIiwiP2RlZXAiXV19LHsibmFtZSI6ImFkb3B0Tm9kZSIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6ImNyZWF0ZUF0dHJpYnV0ZSIsInNpZ25hdHVyZXMiOltbImxvY2FsTmFtZSJdXX0seyJuYW1lIjoiY3JlYXRlQXR0cmlidXRlTlMiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiLCJxdWFsaWZpZWROYW1lIl1dfSx7Im5hbWUiOiJjcmVhdGVFdmVudCIsInNpZ25hdHVyZXMiOltbImV2ZW50VHlwZSJdXX0seyJuYW1lIjoiY3JlYXRlTm9kZUl0ZXJhdG9yIiwic2lnbmF0dXJlcyI6W1sicm9vdCIsIj93aGF0VG9TaG93IiwiP2ZpbHRlciJdXX0seyJuYW1lIjoiY3JlYXRlVHJlZVdhbGtlciIsInNpZ25hdHVyZXMiOltbInJvb3QiLCI/d2hhdFRvU2hvdyIsIj9maWx0ZXIiXV19LHsibmFtZSI6ImdldEVsZW1lbnRzQnlOYW1lIiwic2lnbmF0dXJlcyI6W1siZWxlbWVudE5hbWUiXV19LHsibmFtZSI6Im9wZW4iLCJzaWduYXR1cmVzIjpbWyI/dHlwZSIsIj9yZXBsYWNlIl0sWyJ1cmwiLCJuYW1lIiwiZmVhdHVyZXMiXV0sInJlY2VpdmVyIjoiRG9jdW1lbnQifSx7Im5hbWUiOiJvcGVuIiwic2lnbmF0dXJlcyI6W1siP3VybCIsIj90YXJnZXQiLCI/ZmVhdHVyZXMiXV0sInJlY2VpdmVyIjoiV2luZG93In0seyJuYW1lIjoib3BlbiIsInNpZ25hdHVyZXMiOltbIm1ldGhvZCIsInVybCIsIj9hc3luYyIsIj91c2VybmFtZSIsIj9wYXNzd29yZCJdXSwicmVjZWl2ZXIiOiJYTUxIdHRwUmVxdWVzdCJ9LHsibmFtZSI6Im9wZW4iLCJzaWduYXR1cmVzIjpbWyJjYWNoZU5hbWUiXV0sInJlY2VpdmVyIjoiQ2FjaGVTdG9yYWdlIn0seyJuYW1lIjoib3BlbiIsInNpZ25hdHVyZXMiOltbIm5hbWUiLCI/dmVyc2lvbiJdXSwicmVjZWl2ZXIiOiJJREJGYWN0b3J5In0seyJuYW1lIjoiY2xvc2UiLCJzaWduYXR1cmVzIjpbWyI/cmV0dXJuVmFsdWUiXV0sInJlY2VpdmVyIjoiSFRNTERpYWxvZ0VsZW1lbnQifSx7Im5hbWUiOiJjbG9zZSIsInNpZ25hdHVyZXMiOltbIj9jb2RlIiwiP3JlYXNvbiJdXSwicmVjZWl2ZXIiOiJXZWJTb2NrZXQifSx7Im5hbWUiOiJ3cml0ZSIsInNpZ25hdHVyZXMiOltbIi4uLnRleHQiXSxbInRleHQiXV0sInJlY2VpdmVyIjoiRG9jdW1lbnQifSx7Im5hbWUiOiJ3cml0ZSIsInNpZ25hdHVyZXMiOltbImRhdGEiXV0sInJlY2VpdmVyIjoiQ2xpcGJvYXJkIn0seyJuYW1lIjoid3JpdGUiLCJzaWduYXR1cmVzIjpbWyJkYXRhIl1dLCJyZWNlaXZlciI6IkZpbGVXcml0ZXJTeW5jIn0seyJuYW1lIjoid3JpdGUiLCJzaWduYXR1cmVzIjpbWyJkYXRhIl1dLCJyZWNlaXZlciI6IkZpbGVXcml0ZXIifSx7Im5hbWUiOiJ3cml0ZWxuIiwic2lnbmF0dXJlcyI6W1siLi4udGV4dCJdLFsidGV4dCJdXX0seyJuYW1lIjoiZXhlY0NvbW1hbmQiLCJzaWduYXR1cmVzIjpbWyJjb21tYW5kSWQiLCI/c2hvd1VJIiwiP3ZhbHVlIl1dfSx7Im5hbWUiOiJxdWVyeUNvbW1hbmRFbmFibGVkIiwic2lnbmF0dXJlcyI6W1siY29tbWFuZElkIl1dfSx7Im5hbWUiOiJxdWVyeUNvbW1hbmRJbmRldGVybSIsInNpZ25hdHVyZXMiOltbImNvbW1hbmRJZCJdXX0seyJuYW1lIjoicXVlcnlDb21tYW5kU3RhdGUiLCJzaWduYXR1cmVzIjpbWyJjb21tYW5kSWQiXV19LHsibmFtZSI6InF1ZXJ5Q29tbWFuZFN1cHBvcnRlZCIsInNpZ25hdHVyZXMiOltbImNvbW1hbmRJZCJdXX0seyJuYW1lIjoicXVlcnlDb21tYW5kVmFsdWUiLCJzaWduYXR1cmVzIjpbWyJjb21tYW5kSWQiXV19LHsibmFtZSI6ImNyZWF0ZVRvdWNoTGlzdCIsInNpZ25hdHVyZXMiOltbIi4uLnRvdWNoZXMiXV19LHsibmFtZSI6InJlZ2lzdGVyRWxlbWVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiY2FyZXRSYW5nZUZyb21Qb2ludCIsInNpZ25hdHVyZXMiOltbIj94IiwiP3kiXV19LHsibmFtZSI6IkRPTUV4Y2VwdGlvbiIsInNpZ25hdHVyZXMiOltbIj9tZXNzYWdlIiwiP25hbWUiXV19LHsibmFtZSI6ImNyZWF0ZURvY3VtZW50VHlwZSIsInNpZ25hdHVyZXMiOltbInF1YWxpZmllZE5hbWUiLCJwdWJsaWNJZCIsInN5c3RlbUlkIl1dfSx7Im5hbWUiOiJjcmVhdGVEb2N1bWVudCIsInNpZ25hdHVyZXMiOltbIm5hbWVzcGFjZVVSSSIsInF1YWxpZmllZE5hbWUiLCI/ZG9jdHlwZSJdXX0seyJuYW1lIjoiY3JlYXRlSFRNTERvY3VtZW50Iiwic2lnbmF0dXJlcyI6W1siP3RpdGxlIl1dfSx7Im5hbWUiOiJjb250YWlucyIsInNpZ25hdHVyZXMiOltbInN0cmluZyJdXSwicmVjZWl2ZXIiOiJET01TdHJpbmdMaXN0In0seyJuYW1lIjoiY29udGFpbnMiLCJzaWduYXR1cmVzIjpbWyJ0b2tlbiJdXSwicmVjZWl2ZXIiOiJET01Ub2tlbkxpc3QifSx7Im5hbWUiOiJjb250YWlucyIsInNpZ25hdHVyZXMiOltbIm90aGVyIl1dLCJyZWNlaXZlciI6Ik5vZGUifSx7Im5hbWUiOiJ0b2dnbGUiLCJzaWduYXR1cmVzIjpbWyJ0b2tlbiIsIj9mb3JjZSJdXX0seyJuYW1lIjoic2V0UG9pbnRlckNhcHR1cmUiLCJzaWduYXR1cmVzIjpbWyJwb2ludGVySWQiXV19LHsibmFtZSI6InJlbGVhc2VQb2ludGVyQ2FwdHVyZSIsInNpZ25hdHVyZXMiOltbInBvaW50ZXJJZCJdXX0seyJuYW1lIjoiaGFzUG9pbnRlckNhcHR1cmUiLCJzaWduYXR1cmVzIjpbWyJwb2ludGVySWQiXV19LHsibmFtZSI6ImdldEF0dHJpYnV0ZSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6ImdldEF0dHJpYnV0ZU5TIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibG9jYWxOYW1lIl1dfSx7Im5hbWUiOiJzZXRBdHRyaWJ1dGUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmFsdWUiXV19LHsibmFtZSI6InNldEF0dHJpYnV0ZU5TIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibmFtZSIsInZhbHVlIl1dfSx7Im5hbWUiOiJyZW1vdmVBdHRyaWJ1dGUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJyZW1vdmVBdHRyaWJ1dGVOUyIsInNpZ25hdHVyZXMiOltbIm5hbWVzcGFjZVVSSSIsImxvY2FsTmFtZSJdXX0seyJuYW1lIjoiaGFzQXR0cmlidXRlIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXX0seyJuYW1lIjoiaGFzQXR0cmlidXRlTlMiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiLCJsb2NhbE5hbWUiXV19LHsibmFtZSI6ImdldEF0dHJpYnV0ZU5vZGUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJnZXRBdHRyaWJ1dGVOb2RlTlMiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiLCJsb2NhbE5hbWUiXV19LHsibmFtZSI6InNldEF0dHJpYnV0ZU5vZGUiLCJzaWduYXR1cmVzIjpbWyJhdHRyIl1dfSx7Im5hbWUiOiJzZXRBdHRyaWJ1dGVOb2RlTlMiLCJzaWduYXR1cmVzIjpbWyJhdHRyIl1dfSx7Im5hbWUiOiJyZW1vdmVBdHRyaWJ1dGVOb2RlIiwic2lnbmF0dXJlcyI6W1siYXR0ciJdXX0seyJuYW1lIjoiY2xvc2VzdCIsInNpZ25hdHVyZXMiOltbInNlbGVjdG9ycyJdXX0seyJuYW1lIjoibWF0Y2hlcyIsInNpZ25hdHVyZXMiOltbInNlbGVjdG9ycyJdXX0seyJuYW1lIjoid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwic2lnbmF0dXJlcyI6W1sic2VsZWN0b3JzIl1dfSx7Im5hbWUiOiJhdHRhY2hTaGFkb3ciLCJzaWduYXR1cmVzIjpbWyJzaGFkb3dSb290SW5pdERpY3QiXV19LHsibmFtZSI6Imluc2VydEFkamFjZW50RWxlbWVudCIsInNpZ25hdHVyZXMiOltbIndoZXJlIiwiZWxlbWVudCJdXX0seyJuYW1lIjoiaW5zZXJ0QWRqYWNlbnRUZXh0Iiwic2lnbmF0dXJlcyI6W1sid2hlcmUiLCJkYXRhIl1dfSx7Im5hbWUiOiJpbnNlcnRBZGphY2VudEhUTUwiLCJzaWduYXR1cmVzIjpbWyJwb3NpdGlvbiIsInRleHQiXV19LHsibmFtZSI6InNjcm9sbEludG9WaWV3Iiwic2lnbmF0dXJlcyI6W1siP2FyZyJdXX0seyJuYW1lIjoic2Nyb2xsIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXSxbIngiLCJ5Il1dfSx7Im5hbWUiOiJzY3JvbGxUbyIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl0sWyJ4IiwieSJdXX0seyJuYW1lIjoic2Nyb2xsQnkiLCJzaWduYXR1cmVzIjpbWyI/b3B0aW9ucyJdLFsieCIsInkiXV19LHsibmFtZSI6InNldEFwcGx5U2Nyb2xsIiwic2lnbmF0dXJlcyI6W1sic2Nyb2xsU3RhdGVDYWxsYmFjayIsIm5hdGl2ZVNjcm9sbEJlaGF2aW9yIl1dfSx7Im5hbWUiOiJzZXREaXN0cmlidXRlU2Nyb2xsIiwic2lnbmF0dXJlcyI6W1sic2Nyb2xsU3RhdGVDYWxsYmFjayIsIm5hdGl2ZVNjcm9sbEJlaGF2aW9yIl1dfSx7Im5hbWUiOiJzY3JvbGxJbnRvVmlld0lmTmVlZGVkIiwic2lnbmF0dXJlcyI6W1siP2NlbnRlcklmTmVlZGVkIl1dfSx7Im5hbWUiOiJDdXN0b21FdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiaW5pdEN1c3RvbUV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9idWJibGVzIiwiP2NhbmNlbGFibGUiLCI/ZGV0YWlsIl1dfSx7Im5hbWUiOiJoYW5kbGVFdmVudCIsInNpZ25hdHVyZXMiOltbImV2ZW50Il1dLCJyZWNlaXZlciI6IkV2ZW50TGlzdGVuZXIifSx7Im5hbWUiOiJoYW5kbGVFdmVudCIsInNpZ25hdHVyZXMiOltbImVudHJpZXMiXV0sInJlY2VpdmVyIjoiRW50cmllc0NhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJlbnRyeSJdXSwicmVjZWl2ZXIiOiJFbnRyeUNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJlcnJvciJdXSwicmVjZWl2ZXIiOiJFcnJvckNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJmaWxlIl1dLCJyZWNlaXZlciI6IkZpbGVDYWxsYmFjayJ9LHsibmFtZSI6ImhhbmRsZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1siZmlsZVN5c3RlbSJdXSwicmVjZWl2ZXIiOiJGaWxlU3lzdGVtQ2FsbGJhY2sifSx7Im5hbWUiOiJoYW5kbGVFdmVudCIsInNpZ25hdHVyZXMiOltbImZpbGVXcml0ZXIiXV0sInJlY2VpdmVyIjoiRmlsZVdyaXRlckNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJtZXRhZGF0YSJdXSwicmVjZWl2ZXIiOiJNZXRhZGF0YUNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0cmFuc2FjdGlvbiIsInJlc3VsdFNldCJdXSwicmVjZWl2ZXIiOiJTUUxTdGF0ZW1lbnRDYWxsYmFjayJ9LHsibmFtZSI6ImhhbmRsZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHJhbnNhY3Rpb24iLCJlcnJvciJdXSwicmVjZWl2ZXIiOiJTUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0cmFuc2FjdGlvbiJdXSwicmVjZWl2ZXIiOiJTUUxUcmFuc2FjdGlvbkNhbGxiYWNrIn0seyJuYW1lIjoiaGFuZGxlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJlcnJvciJdXSwicmVjZWl2ZXIiOiJTUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2sifSx7Im5hbWUiOiJhZGRFdmVudExpc3RlbmVyIiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImxpc3RlbmVyIiwiP29wdGlvbnMiXV19LHsibmFtZSI6InJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwibGlzdGVuZXIiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiZGlzcGF0Y2hFdmVudCIsInNpZ25hdHVyZXMiOltbImV2ZW50Il1dfSx7Im5hbWUiOiJFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiaW5pdEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9idWJibGVzIiwiP2NhbmNlbGFibGUiXV19LHsibmFtZSI6Ik11dGF0aW9uT2JzZXJ2ZXIiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayJdXX0seyJuYW1lIjoib2JzZXJ2ZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6Ik11dGF0aW9uT2JzZXJ2ZXIifSx7Im5hbWUiOiJvYnNlcnZlIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0Il1dLCJyZWNlaXZlciI6IkludGVyc2VjdGlvbk9ic2VydmVyIn0seyJuYW1lIjoib2JzZXJ2ZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXSwicmVjZWl2ZXIiOiJSZXNpemVPYnNlcnZlciJ9LHsibmFtZSI6Im9ic2VydmUiLCJzaWduYXR1cmVzIjpbWyJvcHRpb25zIl1dLCJyZWNlaXZlciI6IlBlcmZvcm1hbmNlT2JzZXJ2ZXIifSx7Im5hbWUiOiJvYnNlcnZlIiwic2lnbmF0dXJlcyI6W1siZGIiLCJ0eCIsIm9wdGlvbnMiXV0sInJlY2VpdmVyIjoiSURCT2JzZXJ2ZXIifSx7Im5hbWUiOiJkaXNjb25uZWN0Iiwic2lnbmF0dXJlcyI6W1siP291dHB1dCJdLFsiZGVzdGluYXRpb24iLCI/b3V0cHV0IiwiP2lucHV0Il1dLCJyZWNlaXZlciI6IkF1ZGlvTm9kZSJ9LHsibmFtZSI6ImdldE5hbWVkSXRlbSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6ImdldE5hbWVkSXRlbU5TIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibG9jYWxOYW1lIl1dfSx7Im5hbWUiOiJzZXROYW1lZEl0ZW0iLCJzaWduYXR1cmVzIjpbWyJhdHRyIl1dfSx7Im5hbWUiOiJzZXROYW1lZEl0ZW1OUyIsInNpZ25hdHVyZXMiOltbImF0dHIiXV19LHsibmFtZSI6InJlbW92ZU5hbWVkSXRlbSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6InJlbW92ZU5hbWVkSXRlbU5TIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibG9jYWxOYW1lIl1dfSx7Im5hbWUiOiJhY2NlcHROb2RlIiwic2lnbmF0dXJlcyI6W1sibm9kZSJdXX0seyJuYW1lIjoiZ2V0Um9vdE5vZGUiLCJzaWduYXR1cmVzIjpbWyI/b3B0aW9ucyJdXX0seyJuYW1lIjoiY2xvbmVOb2RlIiwic2lnbmF0dXJlcyI6W1siP2RlZXAiXV19LHsibmFtZSI6ImlzRXF1YWxOb2RlIiwic2lnbmF0dXJlcyI6W1sib3RoZXJOb2RlIl1dfSx7Im5hbWUiOiJpc1NhbWVOb2RlIiwic2lnbmF0dXJlcyI6W1sib3RoZXJOb2RlIl1dfSx7Im5hbWUiOiJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsInNpZ25hdHVyZXMiOltbIm90aGVyIl1dfSx7Im5hbWUiOiJsb29rdXBQcmVmaXgiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiXV19LHsibmFtZSI6Imxvb2t1cE5hbWVzcGFjZVVSSSIsInNpZ25hdHVyZXMiOltbInByZWZpeCJdXSwicmVjZWl2ZXIiOiJOb2RlIn0seyJuYW1lIjoibG9va3VwTmFtZXNwYWNlVVJJIiwic2lnbmF0dXJlcyI6W1siP3ByZWZpeCJdXSwicmVjZWl2ZXIiOiJYUGF0aE5TUmVzb2x2ZXIifSx7Im5hbWUiOiJpc0RlZmF1bHROYW1lc3BhY2UiLCJzaWduYXR1cmVzIjpbWyJuYW1lc3BhY2VVUkkiXV19LHsibmFtZSI6Imluc2VydEJlZm9yZSIsInNpZ25hdHVyZXMiOltbIm5vZGUiLCJjaGlsZCJdXX0seyJuYW1lIjoicmVwbGFjZUNoaWxkIiwic2lnbmF0dXJlcyI6W1sibm9kZSIsImNoaWxkIl1dfSx7Im5hbWUiOiJnZXRFbGVtZW50QnlJZCIsInNpZ25hdHVyZXMiOltbImVsZW1lbnRJZCJdXX0seyJuYW1lIjoicHJlcGVuZCIsInNpZ25hdHVyZXMiOltbIi4uLm5vZGVzIl1dfSx7Im5hbWUiOiJxdWVyeVNlbGVjdG9yIiwic2lnbmF0dXJlcyI6W1sic2VsZWN0b3JzIl1dfSx7Im5hbWUiOiJxdWVyeVNlbGVjdG9yQWxsIiwic2lnbmF0dXJlcyI6W1sic2VsZWN0b3JzIl1dfSx7Im5hbWUiOiJzZXRTdGFydCIsInNpZ25hdHVyZXMiOltbIm5vZGUiLCJvZmZzZXQiXV19LHsibmFtZSI6InNldEVuZCIsInNpZ25hdHVyZXMiOltbIm5vZGUiLCJvZmZzZXQiXV19LHsibmFtZSI6InNldFN0YXJ0QmVmb3JlIiwic2lnbmF0dXJlcyI6W1sibm9kZSJdXX0seyJuYW1lIjoic2V0U3RhcnRBZnRlciIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6InNldEVuZEJlZm9yZSIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6InNldEVuZEFmdGVyIiwic2lnbmF0dXJlcyI6W1sibm9kZSJdXX0seyJuYW1lIjoiY29sbGFwc2UiLCJzaWduYXR1cmVzIjpbWyI/dG9TdGFydCJdXSwicmVjZWl2ZXIiOiJSYW5nZSJ9LHsibmFtZSI6ImNvbGxhcHNlIiwic2lnbmF0dXJlcyI6W1sibm9kZSIsIj9vZmZzZXQiXV0sInJlY2VpdmVyIjoiU2VsZWN0aW9uIn0seyJuYW1lIjoic2VsZWN0Tm9kZSIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6InNlbGVjdE5vZGVDb250ZW50cyIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6ImNvbXBhcmVCb3VuZGFyeVBvaW50cyIsInNpZ25hdHVyZXMiOltbImhvdyIsInNvdXJjZVJhbmdlIl1dfSx7Im5hbWUiOiJpbnNlcnROb2RlIiwic2lnbmF0dXJlcyI6W1sibm9kZSJdXX0seyJuYW1lIjoic3Vycm91bmRDb250ZW50cyIsInNpZ25hdHVyZXMiOltbIm5ld1BhcmVudCJdXX0seyJuYW1lIjoiaXNQb2ludEluUmFuZ2UiLCJzaWduYXR1cmVzIjpbWyJub2RlIiwib2Zmc2V0Il1dfSx7Im5hbWUiOiJjb21wYXJlUG9pbnQiLCJzaWduYXR1cmVzIjpbWyJub2RlIiwib2Zmc2V0Il1dfSx7Im5hbWUiOiJpbnRlcnNlY3RzTm9kZSIsInNpZ25hdHVyZXMiOltbIm5vZGUiXV19LHsibmFtZSI6InNwbGl0VGV4dCIsInNpZ25hdHVyZXMiOltbIm9mZnNldCJdXX0seyJuYW1lIjoidW5zYWZlbHlDcmVhdGUiLCJzaWduYXR1cmVzIjpbWyJodG1sIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6InVuc2FmZWx5Q3JlYXRlIiwic2lnbmF0dXJlcyI6W1sidXJsIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6InVuc2FmZWx5Q3JlYXRlIiwic2lnbmF0dXJlcyI6W1sidXJsIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImdldFJhbmdlQXQiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXX0seyJuYW1lIjoiYWRkUmFuZ2UiLCJzaWduYXR1cmVzIjpbWyJyYW5nZSJdXX0seyJuYW1lIjoicmVtb3ZlUmFuZ2UiLCJzaWduYXR1cmVzIjpbWyJyYW5nZSJdXX0seyJuYW1lIjoic2V0UG9zaXRpb24iLCJzaWduYXR1cmVzIjpbWyJub2RlIiwiP29mZnNldCJdXSwicmVjZWl2ZXIiOiJTZWxlY3Rpb24ifSx7Im5hbWUiOiJzZXRQb3NpdGlvbiIsInNpZ25hdHVyZXMiOltbIngiLCJ5IiwieiJdXSwicmVjZWl2ZXIiOiJBdWRpb0xpc3RlbmVyIn0seyJuYW1lIjoic2V0UG9zaXRpb24iLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsInoiXV0sInJlY2VpdmVyIjoiUGFubmVyTm9kZSJ9LHsibmFtZSI6ImV4dGVuZCIsInNpZ25hdHVyZXMiOltbIm5vZGUiLCI/b2Zmc2V0Il1dfSx7Im5hbWUiOiJzZXRCYXNlQW5kRXh0ZW50Iiwic2lnbmF0dXJlcyI6W1siYmFzZU5vZGUiLCJiYXNlT2Zmc2V0IiwiZXh0ZW50Tm9kZSIsImV4dGVudE9mZnNldCJdXX0seyJuYW1lIjoic2VsZWN0QWxsQ2hpbGRyZW4iLCJzaWduYXR1cmVzIjpbWyJub2RlIl1dfSx7Im5hbWUiOiJjb250YWluc05vZGUiLCJzaWduYXR1cmVzIjpbWyJub2RlIiwiP2FsbG93UGFydGlhbENvbnRhaW5tZW50Il1dfSx7Im5hbWUiOiJDbGlwYm9hcmRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiQ29tcG9zaXRpb25FdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiaW5pdENvbXBvc2l0aW9uRXZlbnQiLCJzaWduYXR1cmVzIjpbWyI/dHlwZSIsIj9idWJibGVzIiwiP2NhbmNlbGFibGUiLCI/dmlldyIsIj9kYXRhIl1dfSx7Im5hbWUiOiJEcmFnRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IkZvY3VzRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6Ikhhc2hDaGFuZ2VFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiSW5wdXRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiS2V5Ym9hcmRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiZ2V0TW9kaWZpZXJTdGF0ZSIsInNpZ25hdHVyZXMiOltbImtleUFyZyJdXX0seyJuYW1lIjoiaW5pdEtleWJvYXJkRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2J1YmJsZXMiLCI/Y2FuY2VsYWJsZSIsIj92aWV3IiwiP2tleUlkZW50aWZpZXIiLCI/bG9jYXRpb24iLCI/Y3RybEtleSIsIj9hbHRLZXkiLCI/c2hpZnRLZXkiLCI/bWV0YUtleSJdXX0seyJuYW1lIjoiTWVzc2FnZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9ldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJpbml0TWVzc2FnZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZUFyZyIsIj9jYW5CdWJibGVBcmciLCI/Y2FuY2VsYWJsZUFyZyIsIj9kYXRhQXJnIiwiP29yaWdpbkFyZyIsIj9sYXN0RXZlbnRJZEFyZyIsIj9zb3VyY2VBcmciLCI/cG9ydHNBcmciXV19LHsibmFtZSI6Ik1vdXNlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6ImluaXRNb3VzZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1siP3R5cGUiLCI/YnViYmxlcyIsIj9jYW5jZWxhYmxlIiwiP3ZpZXciLCI/ZGV0YWlsIiwiP3NjcmVlblgiLCI/c2NyZWVuWSIsIj9jbGllbnRYIiwiP2NsaWVudFkiLCI/Y3RybEtleSIsIj9hbHRLZXkiLCI/c2hpZnRLZXkiLCI/bWV0YUtleSIsIj9idXR0b24iLCI/cmVsYXRlZFRhcmdldCJdXX0seyJuYW1lIjoiaW5pdE11dGF0aW9uRXZlbnQiLCJzaWduYXR1cmVzIjpbWyI/dHlwZSIsIj9idWJibGVzIiwiP2NhbmNlbGFibGUiLCI/cmVsYXRlZE5vZGUiLCI/cHJldlZhbHVlIiwiP25ld1ZhbHVlIiwiP2F0dHJOYW1lIiwiP2F0dHJDaGFuZ2UiXV19LHsibmFtZSI6IlBhZ2VUcmFuc2l0aW9uRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IlBvcFN0YXRlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IlByb2dyZXNzRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IlByb21pc2VSZWplY3Rpb25FdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJpbml0VGV4dEV2ZW50Iiwic2lnbmF0dXJlcyI6W1siP3R5cGUiLCI/YnViYmxlcyIsIj9jYW5jZWxhYmxlIiwiP3ZpZXciLCI/ZGF0YSJdXX0seyJuYW1lIjoiVG91Y2hFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiVUlFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiaW5pdFVJRXZlbnQiLCJzaWduYXR1cmVzIjpbWyI/dHlwZSIsIj9idWJibGVzIiwiP2NhbmNlbGFibGUiLCI/dmlldyIsIj9kZXRhaWwiXV19LHsibmFtZSI6IldoZWVsRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IkhlYWRlcnMiLCJzaWduYXR1cmVzIjpbWyI/aW5pdCJdXX0seyJuYW1lIjoiUmVxdWVzdCIsInNpZ25hdHVyZXMiOltbImlucHV0IiwiP3JlcXVlc3RJbml0RGljdCJdXX0seyJuYW1lIjoiUmVzcG9uc2UiLCJzaWduYXR1cmVzIjpbWyI/Ym9keSIsIj9pbml0Il1dfSx7Im5hbWUiOiJlcnJvciIsInNpZ25hdHVyZXMiOltbIi4uLmRhdGEiXV0sInJlY2VpdmVyIjoiY29uc29sZSJ9LHsibmFtZSI6InJlZGlyZWN0Iiwic2lnbmF0dXJlcyI6W1sidXJsIiwiP3N0YXR1cyJdXX0seyJuYW1lIjoiZmV0Y2giLCJzaWduYXR1cmVzIjpbWyJpbnB1dCIsIj9pbml0Il1dLCJyZWNlaXZlciI6IldpbmRvdyJ9LHsibmFtZSI6ImZldGNoIiwic2lnbmF0dXJlcyI6W1siaW5wdXQiLCI/aW5pdCJdXSwicmVjZWl2ZXIiOiJXb3JrZXJHbG9iYWxTY29wZSJ9LHsibmFtZSI6ImZldGNoIiwic2lnbmF0dXJlcyI6W1siaWQiLCJyZXF1ZXN0cyIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkJhY2tncm91bmRGZXRjaE1hbmFnZXIifSx7Im5hbWUiOiJmZXRjaCIsInNpZ25hdHVyZXMiOltbImlucHV0IiwiP2luaXQiXV0sInJlY2VpdmVyIjoiU2VydmljZVdvcmtlckdsb2JhbFNjb3BlIn0seyJuYW1lIjoiQmxvYiIsInNpZ25hdHVyZXMiOltbIj9ibG9iUGFydHMiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoicmVhZEFzQXJyYXlCdWZmZXIiLCJzaWduYXR1cmVzIjpbWyJibG9iIl1dfSx7Im5hbWUiOiJyZWFkQXNCaW5hcnlTdHJpbmciLCJzaWduYXR1cmVzIjpbWyJibG9iIl1dfSx7Im5hbWUiOiJyZWFkQXNUZXh0Iiwic2lnbmF0dXJlcyI6W1siYmxvYiIsIj9sYWJlbCJdXX0seyJuYW1lIjoicmVhZEFzRGF0YVVSTCIsInNpZ25hdHVyZXMiOltbImJsb2IiXV19LHsibmFtZSI6IkZpbGUiLCJzaWduYXR1cmVzIjpbWyJmaWxlQml0cyIsImZpbGVOYW1lIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImNyZWF0ZU9iamVjdFVSTCIsInNpZ25hdHVyZXMiOltbImJsb2IiXSxbInNvdXJjZSJdLFsic3RyZWFtIl1dfSx7Im5hbWUiOiJyZXZva2VPYmplY3RVUkwiLCJzaWduYXR1cmVzIjpbWyJ1cmwiXV19LHsibmFtZSI6ImdvIiwic2lnbmF0dXJlcyI6W1siP2RlbHRhIl1dfSx7Im5hbWUiOiJwdXNoU3RhdGUiLCJzaWduYXR1cmVzIjpbWyJkYXRhIiwidGl0bGUiLCI/dXJsIl1dfSx7Im5hbWUiOiJyZXBsYWNlU3RhdGUiLCJzaWduYXR1cmVzIjpbWyJkYXRhIiwidGl0bGUiLCI/dXJsIl1dfSx7Im5hbWUiOiJidG9hIiwic2lnbmF0dXJlcyI6W1siYnRvYSJdXX0seyJuYW1lIjoiYXRvYiIsInNpZ25hdHVyZXMiOltbImF0b2IiXV19LHsibmFtZSI6InNldFRpbWVvdXQiLCJzaWduYXR1cmVzIjpbWyJoYW5kbGVyIiwiP3RpbWVvdXQiLCIuLi5hcmd1bWVudHMiXV19LHsibmFtZSI6ImNsZWFyVGltZW91dCIsInNpZ25hdHVyZXMiOltbIj9oYW5kbGUiXV19LHsibmFtZSI6InNldEludGVydmFsIiwic2lnbmF0dXJlcyI6W1siaGFuZGxlciIsIj90aW1lb3V0IiwiLi4uYXJndW1lbnRzIl1dfSx7Im5hbWUiOiJjbGVhckludGVydmFsIiwic2lnbmF0dXJlcyI6W1siP2hhbmRsZSJdXX0seyJuYW1lIjoic3RvcCIsInNpZ25hdHVyZXMiOltbIj93aGVuIl1dLCJyZWNlaXZlciI6IkF1ZGlvU2NoZWR1bGVkU291cmNlTm9kZSJ9LHsibmFtZSI6ImZvY3VzIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV0sInJlY2VpdmVyIjoiSFRNTEVsZW1lbnQifSx7Im5hbWUiOiJhbGVydCIsInNpZ25hdHVyZXMiOltbIj9tZXNzYWdlIl1dfSx7Im5hbWUiOiJjb25maXJtIiwic2lnbmF0dXJlcyI6W1siP21lc3NhZ2UiXV19LHsibmFtZSI6InByb21wdCIsInNpZ25hdHVyZXMiOltbIj9tZXNzYWdlIiwiP2RlZmF1bHRWYWx1ZSJdXSwicmVjZWl2ZXIiOiJXaW5kb3cifSx7Im5hbWUiOiJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayJdXX0seyJuYW1lIjoiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJzaWduYXR1cmVzIjpbWyJoYW5kbGUiXV19LHsibmFtZSI6InJlcXVlc3RJZGxlQ2FsbGJhY2siLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJjYW5jZWxJZGxlQ2FsbGJhY2siLCJzaWduYXR1cmVzIjpbWyJoYW5kbGUiXV19LHsibmFtZSI6InBvc3RNZXNzYWdlIiwic2lnbmF0dXJlcyI6W1sibWVzc2FnZSIsInRhcmdldE9yaWdpbiIsIj90cmFuc2ZlciJdXSwicmVjZWl2ZXIiOiJXaW5kb3cifSx7Im5hbWUiOiJwb3N0TWVzc2FnZSIsInNpZ25hdHVyZXMiOltbIm1lc3NhZ2UiLCI/dHJhbnNmZXIiXV0sInJlY2VpdmVyIjoiTWVzc2FnZVBvcnQifSx7Im5hbWUiOiJwb3N0TWVzc2FnZSIsInNpZ25hdHVyZXMiOltbIm1lc3NhZ2UiLCI/dHJhbnNmZXIiXV0sInJlY2VpdmVyIjoiRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGUifSx7Im5hbWUiOiJwb3N0TWVzc2FnZSIsInNpZ25hdHVyZXMiOltbIm1lc3NhZ2UiLCI/dHJhbnNmZXIiXV0sInJlY2VpdmVyIjoiV29ya2VyIn0seyJuYW1lIjoicG9zdE1lc3NhZ2UiLCJzaWduYXR1cmVzIjpbWyJtZXNzYWdlIl1dLCJyZWNlaXZlciI6IkJyb2FkY2FzdENoYW5uZWwifSx7Im5hbWUiOiJwb3N0TWVzc2FnZSIsInNpZ25hdHVyZXMiOltbIm1lc3NhZ2UiLCI/dHJhbnNmZXIiXV0sInJlY2VpdmVyIjoiQ2xpZW50In0seyJuYW1lIjoicG9zdE1lc3NhZ2UiLCJzaWduYXR1cmVzIjpbWyJtZXNzYWdlIiwiP3RyYW5zZmVyIl1dLCJyZWNlaXZlciI6IlNlcnZpY2VXb3JrZXIifSx7Im5hbWUiOiJnZXRDb21wdXRlZFN0eWxlIiwic2lnbmF0dXJlcyI6W1siZWx0IiwiP3BzZXVkb0VsdCJdXX0seyJuYW1lIjoibWF0Y2hNZWRpYSIsInNpZ25hdHVyZXMiOltbInF1ZXJ5Il1dfSx7Im5hbWUiOiJtb3ZlVG8iLCJzaWduYXR1cmVzIjpbWyJ4IiwieSJdXSwicmVjZWl2ZXIiOiJXaW5kb3cifSx7Im5hbWUiOiJtb3ZlVG8iLCJzaWduYXR1cmVzIjpbWyJ4IiwieSJdXSwicmVjZWl2ZXIiOiJDYW52YXNQYXRoIn0seyJuYW1lIjoibW92ZVRvIiwic2lnbmF0dXJlcyI6W1sicGFyZW50IiwibmFtZSJdXSwicmVjZWl2ZXIiOiJFbnRyeVN5bmMifSx7Im5hbWUiOiJtb3ZlVG8iLCJzaWduYXR1cmVzIjpbWyJwYXJlbnQiLCI/bmFtZSIsIj9zdWNjZXNzQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJFbnRyeSJ9LHsibmFtZSI6Im1vdmVCeSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJyZXNpemVUbyIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJyZXNpemVCeSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJnZXRDb21wdXRlZEFjY2Vzc2libGVOb2RlIiwic2lnbmF0dXJlcyI6W1siZWxlbWVudCJdXX0seyJuYW1lIjoid2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2siXV19LHsibmFtZSI6IndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIiwic2lnbmF0dXJlcyI6W1siaWQiXV19LHsibmFtZSI6InJlcXVlc3RGdWxsc2NyZWVuIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV19LHsibmFtZSI6IndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV19LHsibmFtZSI6IndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV19LHsibmFtZSI6IkRPTU1hdHJpeFJlYWRPbmx5Iiwic2lnbmF0dXJlcyI6W1siP2luaXQiXV19LHsibmFtZSI6ImZyb21NYXRyaXgiLCJzaWduYXR1cmVzIjpbWyI/b3RoZXIiXV19LHsibmFtZSI6ImZyb21GbG9hdDMyQXJyYXkiLCJzaWduYXR1cmVzIjpbWyJhcnJheTMyIl1dfSx7Im5hbWUiOiJmcm9tRmxvYXQ2NEFycmF5Iiwic2lnbmF0dXJlcyI6W1siYXJyYXk2NCJdXX0seyJuYW1lIjoidHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1siP3R4IiwiP3R5IiwiP3R6Il1dLCJyZWNlaXZlciI6IkRPTU1hdHJpeFJlYWRPbmx5In0seyJuYW1lIjoidHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV0sInJlY2VpdmVyIjoiU1ZHTWF0cml4In0seyJuYW1lIjoidHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV0sInJlY2VpdmVyIjoiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoidHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV0sInJlY2VpdmVyIjoiT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoidHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV0sInJlY2VpdmVyIjoiUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJzY2FsZSIsInNpZ25hdHVyZXMiOltbIj9zY2FsZVgiLCI/c2NhbGVZIiwiP3NjYWxlWiIsIj9vcmlnaW5YIiwiP29yaWdpblkiLCI/b3JpZ2luWiJdXSwicmVjZWl2ZXIiOiJET01NYXRyaXhSZWFkT25seSJ9LHsibmFtZSI6InNjYWxlIiwic2lnbmF0dXJlcyI6W1sic2NhbGVGYWN0b3IiXV0sInJlY2VpdmVyIjoiU1ZHTWF0cml4In0seyJuYW1lIjoic2NhbGUiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSJdXSwicmVjZWl2ZXIiOiJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJzY2FsZSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dLCJyZWNlaXZlciI6Ik9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCJ9LHsibmFtZSI6InNjYWxlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXV0sInJlY2VpdmVyIjoiUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJzY2FsZTNkIiwic2lnbmF0dXJlcyI6W1siP3NjYWxlIiwiP29yaWdpblgiLCI/b3JpZ2luWSIsIj9vcmlnaW5aIl1dfSx7Im5hbWUiOiJyb3RhdGUiLCJzaWduYXR1cmVzIjpbWyI/cm90WCIsIj9yb3RZIiwiP3JvdFoiXV0sInJlY2VpdmVyIjoiRE9NTWF0cml4UmVhZE9ubHkifSx7Im5hbWUiOiJyb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXSwicmVjZWl2ZXIiOiJTVkdNYXRyaXgifSx7Im5hbWUiOiJyb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXSwicmVjZWl2ZXIiOiJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJyb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXSwicmVjZWl2ZXIiOiJPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJyb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXSwicmVjZWl2ZXIiOiJQYWludFJlbmRlcmluZ0NvbnRleHQyRCJ9LHsibmFtZSI6InJvdGF0ZUZyb21WZWN0b3IiLCJzaWduYXR1cmVzIjpbWyI/eCIsIj95Il1dLCJyZWNlaXZlciI6IkRPTU1hdHJpeFJlYWRPbmx5In0seyJuYW1lIjoicm90YXRlRnJvbVZlY3RvciIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dLCJyZWNlaXZlciI6IlNWR01hdHJpeCJ9LHsibmFtZSI6InJvdGF0ZUF4aXNBbmdsZSIsInNpZ25hdHVyZXMiOltbIj94IiwiP3kiLCI/eiIsIj9hbmdsZSJdXX0seyJuYW1lIjoic2tld1giLCJzaWduYXR1cmVzIjpbWyI/c3giXV0sInJlY2VpdmVyIjoiRE9NTWF0cml4UmVhZE9ubHkifSx7Im5hbWUiOiJza2V3WCIsInNpZ25hdHVyZXMiOltbImFuZ2xlIl1dLCJyZWNlaXZlciI6IlNWR01hdHJpeCJ9LHsibmFtZSI6InNrZXdZIiwic2lnbmF0dXJlcyI6W1siP3N5Il1dLCJyZWNlaXZlciI6IkRPTU1hdHJpeFJlYWRPbmx5In0seyJuYW1lIjoic2tld1kiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXSwicmVjZWl2ZXIiOiJTVkdNYXRyaXgifSx7Im5hbWUiOiJtdWx0aXBseSIsInNpZ25hdHVyZXMiOltbIj9vdGhlciJdXSwicmVjZWl2ZXIiOiJET01NYXRyaXhSZWFkT25seSJ9LHsibmFtZSI6Im11bHRpcGx5Iiwic2lnbmF0dXJlcyI6W1sic2Vjb25kTWF0cml4Il1dLCJyZWNlaXZlciI6IlNWR01hdHJpeCJ9LHsibmFtZSI6InRyYW5zZm9ybVBvaW50Iiwic2lnbmF0dXJlcyI6W1siP3BvaW50Il1dfSx7Im5hbWUiOiJET01NYXRyaXgiLCJzaWduYXR1cmVzIjpbWyI/aW5pdCJdXX0seyJuYW1lIjoibXVsdGlwbHlTZWxmIiwic2lnbmF0dXJlcyI6W1siP290aGVyIl1dfSx7Im5hbWUiOiJwcmVNdWx0aXBseVNlbGYiLCJzaWduYXR1cmVzIjpbWyI/b3RoZXIiXV19LHsibmFtZSI6InRyYW5zbGF0ZVNlbGYiLCJzaWduYXR1cmVzIjpbWyI/dHgiLCI/dHkiLCI/dHoiXV19LHsibmFtZSI6InNjYWxlU2VsZiIsInNpZ25hdHVyZXMiOltbIj9zY2FsZVgiLCI/c2NhbGVZIiwiP3NjYWxlWiIsIj9vcmlnaW5YIiwiP29yaWdpblkiLCI/b3JpZ2luWiJdXX0seyJuYW1lIjoic2NhbGUzZFNlbGYiLCJzaWduYXR1cmVzIjpbWyI/c2NhbGUiLCI/b3JpZ2luWCIsIj9vcmlnaW5ZIiwiP29yaWdpbloiXV19LHsibmFtZSI6InJvdGF0ZVNlbGYiLCJzaWduYXR1cmVzIjpbWyI/cm90WCIsIj9yb3RZIiwiP3JvdFoiXV19LHsibmFtZSI6InJvdGF0ZUZyb21WZWN0b3JTZWxmIiwic2lnbmF0dXJlcyI6W1siP3giLCI/eSJdXX0seyJuYW1lIjoicm90YXRlQXhpc0FuZ2xlU2VsZiIsInNpZ25hdHVyZXMiOltbIj94IiwiP3kiLCI/eiIsIj9hbmdsZSJdXX0seyJuYW1lIjoic2tld1hTZWxmIiwic2lnbmF0dXJlcyI6W1siP3N4Il1dfSx7Im5hbWUiOiJza2V3WVNlbGYiLCJzaWduYXR1cmVzIjpbWyI/c3kiXV19LHsibmFtZSI6InNldE1hdHJpeFZhbHVlIiwic2lnbmF0dXJlcyI6W1sidHJhbnNmb3JtTGlzdCJdXX0seyJuYW1lIjoiRE9NUG9pbnRSZWFkT25seSIsInNpZ25hdHVyZXMiOltbIj94IiwiP3kiLCI/eiIsIj93Il1dfSx7Im5hbWUiOiJmcm9tUG9pbnQiLCJzaWduYXR1cmVzIjpbWyI/b3RoZXIiXV19LHsibmFtZSI6Im1hdHJpeFRyYW5zZm9ybSIsInNpZ25hdHVyZXMiOltbIj9tYXRyaXgiXV0sInJlY2VpdmVyIjoiRE9NUG9pbnRSZWFkT25seSJ9LHsibmFtZSI6Im1hdHJpeFRyYW5zZm9ybSIsInNpZ25hdHVyZXMiOltbIm1hdHJpeCJdXSwicmVjZWl2ZXIiOiJTVkdQb2ludCJ9LHsibmFtZSI6IkRPTVBvaW50Iiwic2lnbmF0dXJlcyI6W1siP3giLCI/eSIsIj96IiwiP3ciXV19LHsibmFtZSI6IkRPTVF1YWQiLCJzaWduYXR1cmVzIjpbWyI/cDEiLCI/cDIiLCI/cDMiLCI/cDQiXV19LHsibmFtZSI6ImZyb21SZWN0Iiwic2lnbmF0dXJlcyI6W1siP290aGVyIl1dfSx7Im5hbWUiOiJmcm9tUXVhZCIsInNpZ25hdHVyZXMiOltbIj9vdGhlciJdXX0seyJuYW1lIjoiRE9NUmVjdFJlYWRPbmx5Iiwic2lnbmF0dXJlcyI6W1siP3giLCI/eSIsIj93aWR0aCIsIj9oZWlnaHQiXV19LHsibmFtZSI6IkRPTVJlY3QiLCJzaWduYXR1cmVzIjpbWyI/eCIsIj95IiwiP3dpZHRoIiwiP2hlaWdodCJdXX0seyJuYW1lIjoidG9EYXRhVVJMIiwic2lnbmF0dXJlcyI6W1siP3R5cGUiLCI/YXJndW1lbnRzIl1dfSx7Im5hbWUiOiJ0b0Jsb2IiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayIsIj90eXBlIiwiP2FyZ3VtZW50cyJdXX0seyJuYW1lIjoiSW1hZ2VEYXRhIiwic2lnbmF0dXJlcyI6W1sic3ciLCJzaCJdXX0seyJuYW1lIjoiZGVmaW5lIiwic2lnbmF0dXJlcyI6W1sibmFtZSIsImNvbnN0cnVjdG9yIiwiP29wdGlvbnMiXV19LHsibmFtZSI6IndoZW5EZWZpbmVkIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXX0seyJuYW1lIjoidXBncmFkZSIsInNpZ25hdHVyZXMiOltbInJvb3QiXV19LHsibmFtZSI6IkZvcm1EYXRhIiwic2lnbmF0dXJlcyI6W1siP2Zvcm0iXV19LHsibmFtZSI6InNldEN1c3RvbVZhbGlkaXR5Iiwic2lnbmF0dXJlcyI6W1siZXJyb3IiXV19LHsibmFtZSI6Im5hbWVkSXRlbSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiSFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb24ifSx7Im5hbWUiOiJuYW1lZEl0ZW0iLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dLCJyZWNlaXZlciI6IkhUTUxTZWxlY3RFbGVtZW50In0seyJuYW1lIjoibmFtZWRJdGVtIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJIVE1MQWxsQ29sbGVjdGlvbiJ9LHsibmFtZSI6Im5hbWVkSXRlbSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiSFRNTENvbGxlY3Rpb24ifSx7Im5hbWUiOiJuYW1lZEl0ZW0iLCJzaWduYXR1cmVzIjpbWyI/bmFtZSJdXSwicmVjZWl2ZXIiOiJSVENTdGF0c1Jlc3BvbnNlIn0seyJuYW1lIjoibmFtZWRJdGVtIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJNaW1lVHlwZUFycmF5In0seyJuYW1lIjoibmFtZWRJdGVtIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXSwicmVjZWl2ZXIiOiJQbHVnaW5BcnJheSJ9LHsibmFtZSI6Im5hbWVkSXRlbSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV0sInJlY2VpdmVyIjoiUGx1Z2luIn0seyJuYW1lIjoic3RlcFVwIiwic2lnbmF0dXJlcyI6W1siP24iXV19LHsibmFtZSI6InN0ZXBEb3duIiwic2lnbmF0dXJlcyI6W1siP24iXV19LHsibmFtZSI6InNldFJhbmdlVGV4dCIsInNpZ25hdHVyZXMiOltbInJlcGxhY2VtZW50IiwiP3N0YXJ0IiwiP2VuZCIsIj9zZWxlY3Rpb25Nb2RlIl1dfSx7Im5hbWUiOiJzZXRTZWxlY3Rpb25SYW5nZSIsInNpZ25hdHVyZXMiOltbInN0YXJ0IiwiZW5kIiwiP2RpcmVjdGlvbiJdXX0seyJuYW1lIjoiT3B0aW9uIiwic2lnbmF0dXJlcyI6W1siP2RhdGEiLCI/dmFsdWUiLCI/ZGVmYXVsdFNlbGVjdGVkIiwiP3NlbGVjdGVkIl1dfSx7Im5hbWUiOiJJbWFnZSIsInNpZ25hdHVyZXMiOltbIj93aWR0aCIsIj9oZWlnaHQiXV19LHsibmFtZSI6ImRlY29kZSIsInNpZ25hdHVyZXMiOltbIj9pbnB1dCIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IlRleHREZWNvZGVyIn0seyJuYW1lIjoic3RhcnQiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJUaW1lUmFuZ2VzIn0seyJuYW1lIjoic3RhcnQiLCJzaWduYXR1cmVzIjpbWyJzdHJlYW0iXV0sInJlY2VpdmVyIjoiVW5kZXJseWluZ1NvdXJjZUJhc2UifSx7Im5hbWUiOiJzdGFydCIsInNpZ25hdHVyZXMiOltbIj90aW1lc2xpY2UiXV0sInJlY2VpdmVyIjoiTWVkaWFSZWNvcmRlciJ9LHsibmFtZSI6InN0YXJ0Iiwic2lnbmF0dXJlcyI6W1siP3doZW4iLCI/Z3JhaW5PZmZzZXQiLCI/Z3JhaW5EdXJhdGlvbiJdXSwicmVjZWl2ZXIiOiJBdWRpb0J1ZmZlclNvdXJjZU5vZGUifSx7Im5hbWUiOiJzdGFydCIsInNpZ25hdHVyZXMiOltbIj93aGVuIl1dLCJyZWNlaXZlciI6IkF1ZGlvU2NoZWR1bGVkU291cmNlTm9kZSJ9LHsibmFtZSI6ImFzc2lnbmVkTm9kZXMiLCJzaWduYXR1cmVzIjpbWyI/b3B0aW9ucyJdXX0seyJuYW1lIjoiYXNzaWduZWRFbGVtZW50cyIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJpbnNlcnRSb3ciLCJzaWduYXR1cmVzIjpbWyI/aW5kZXgiXV19LHsibmFtZSI6ImRlbGV0ZVJvdyIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dfSx7Im5hbWUiOiJpbnNlcnRDZWxsIiwic2lnbmF0dXJlcyI6W1siP2luZGV4Il1dfSx7Im5hbWUiOiJkZWxldGVDZWxsIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV19LHsibmFtZSI6IkF1ZGlvIiwic2lnbmF0dXJlcyI6W1siP3NyYyJdXX0seyJuYW1lIjoiY2FuUGxheVR5cGUiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIl1dfSx7Im5hbWUiOiJhZGRUZXh0VHJhY2siLCJzaWduYXR1cmVzIjpbWyJraW5kIiwiP2xhYmVsIiwiP2xhbmd1YWdlIl1dfSx7Im5hbWUiOiJlbmQiLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJUaW1lUmFuZ2VzIn0seyJuYW1lIjoiZ2V0VHJhY2tCeUlkIiwic2lnbmF0dXJlcyI6W1siaWQiXV0sInJlY2VpdmVyIjoiQXVkaW9UcmFja0xpc3QifSx7Im5hbWUiOiJnZXRUcmFja0J5SWQiLCJzaWduYXR1cmVzIjpbWyJpZCJdXSwicmVjZWl2ZXIiOiJUZXh0VHJhY2tMaXN0In0seyJuYW1lIjoiZ2V0VHJhY2tCeUlkIiwic2lnbmF0dXJlcyI6W1siaWQiXV0sInJlY2VpdmVyIjoiVmlkZW9UcmFja0xpc3QifSx7Im5hbWUiOiJnZXRUcmFja0J5SWQiLCJzaWduYXR1cmVzIjpbWyJ0cmFja0lkIl1dLCJyZWNlaXZlciI6Ik1lZGlhU3RyZWFtIn0seyJuYW1lIjoiZ2V0Q3VlQnlJZCIsInNpZ25hdHVyZXMiOltbImlkIl1dfSx7Im5hbWUiOiJhZGRDdWUiLCJzaWduYXR1cmVzIjpbWyJjdWUiXV19LHsibmFtZSI6InJlbW92ZUN1ZSIsInNpZ25hdHVyZXMiOltbImN1ZSJdXX0seyJuYW1lIjoiY3JlYXRlSW1hZ2VCaXRtYXAiLCJzaWduYXR1cmVzIjpbWyJpbWFnZUJpdG1hcCIsIj9vcHRpb25zIl0sWyJpbWFnZUJpdG1hcCIsInN4Iiwic3kiLCJzdyIsInNoIiwiP29wdGlvbnMiXV19LHsibmFtZSI6IlRvdWNoIiwic2lnbmF0dXJlcyI6W1siaW5pdERpY3QiXV19LHsibmFtZSI6ImNvcHlUZXh0Iiwic2lnbmF0dXJlcyI6W1sidGV4dCJdXX0seyJuYW1lIjoic2hvd0NvbnRleHRNZW51QXRQb2ludCIsInNpZ25hdHVyZXMiOltbIngiLCJ5IiwiaXRlbXMiLCI/ZG9jdW1lbnQiXV19LHsibmFtZSI6InNlbmRNZXNzYWdlVG9FbWJlZGRlciIsInNpZ25hdHVyZXMiOltbIm1lc3NhZ2UiXV19LHsibmFtZSI6InVub2JzZXJ2ZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXSwicmVjZWl2ZXIiOiJJbnRlcnNlY3Rpb25PYnNlcnZlciJ9LHsibmFtZSI6InVub2JzZXJ2ZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXSwicmVjZWl2ZXIiOiJSZXNpemVPYnNlcnZlciJ9LHsibmFtZSI6InVub2JzZXJ2ZSIsInNpZ25hdHVyZXMiOltbImRiIl1dLCJyZWNlaXZlciI6IklEQk9ic2VydmVyIn0seyJuYW1lIjoibGF5b3V0TmV4dEZyYWdtZW50Iiwic2lnbmF0dXJlcyI6W1sib3B0aW9ucyJdXX0seyJuYW1lIjoicmVnaXN0ZXJMYXlvdXQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwibGF5b3V0Q3RvciJdXX0seyJuYW1lIjoidXBkYXRlIiwic2lnbmF0dXJlcyI6W1sicmVzcG9uc2UiXV0sInJlY2VpdmVyIjoiTWVkaWFLZXlTZXNzaW9uIn0seyJuYW1lIjoidXBkYXRlIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiXV0sInJlY2VpdmVyIjoiSURCQ3Vyc29yIn0seyJuYW1lIjoid2F0Y2giLCJzaWduYXR1cmVzIjpbWyJzaWduYWxzIiwiY2FsbGJhY2siXV0sInJlY2VpdmVyIjoiTW9qb0hhbmRsZSJ9LHsibmFtZSI6IndhdGNoIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2siLCI/b3B0aW9ucyJdXSwicmVjZWl2ZXIiOiJORkMifSx7Im5hbWUiOiJ3cml0ZU1lc3NhZ2UiLCJzaWduYXR1cmVzIjpbWyJidWZmZXIiLCJoYW5kbGVzIl1dfSx7Im5hbWUiOiJyZWFkTWVzc2FnZSIsInNpZ25hdHVyZXMiOltbIj9mbGFncyJdXX0seyJuYW1lIjoid3JpdGVEYXRhIiwic2lnbmF0dXJlcyI6W1siYnVmZmVyIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImRpc2NhcmREYXRhIiwic2lnbmF0dXJlcyI6W1sibnVtQnl0ZXMiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoicmVhZERhdGEiLCJzaWduYXR1cmVzIjpbWyJidWZmZXIiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoibWFwQnVmZmVyIiwic2lnbmF0dXJlcyI6W1sib2Zmc2V0IiwibnVtQnl0ZXMiXV19LHsibmFtZSI6ImR1cGxpY2F0ZUJ1ZmZlckhhbmRsZSIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJjcmVhdGVEYXRhUGlwZSIsInNpZ25hdHVyZXMiOltbIm9wdGlvbnMiXV19LHsibmFtZSI6ImNyZWF0ZVNoYXJlZEJ1ZmZlciIsInNpZ25hdHVyZXMiOltbIm51bUJ5dGVzIl1dfSx7Im5hbWUiOiJiaW5kSW50ZXJmYWNlIiwic2lnbmF0dXJlcyI6W1siaW50ZXJmYWNlTmFtZSIsInJlcXVlc3RfaGFuZGxlIiwiP3Njb3BlIl1dfSx7Im5hbWUiOiJNb2pvSW50ZXJmYWNlSW50ZXJjZXB0b3IiLCJzaWduYXR1cmVzIjpbWyJpbnRlcmZhY2VOYW1lIiwiP3Njb3BlIl1dfSx7Im5hbWUiOiJNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9ldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJPZmZzY3JlZW5DYW52YXMiLCJzaWduYXR1cmVzIjpbWyJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoiY29udmVydFRvQmxvYiIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJzZXRWYWx1ZUFuZENsb3NlUG9wdXAiLCJzaWduYXR1cmVzIjpbWyJudW1iZXJWYWx1ZSIsInN0cmluZ1ZhbHVlIl1dfSx7Im5hbWUiOiJzZXRWYWx1ZSIsInNpZ25hdHVyZXMiOltbInZhbHVlIl1dfSx7Im5hbWUiOiJzZWxlY3RGb250c0Zyb21Pd25lckRvY3VtZW50Iiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0RG9jdW1lbnQiXV19LHsibmFtZSI6ImxvY2FsaXplTnVtYmVyU3RyaW5nIiwic2lnbmF0dXJlcyI6W1sibnVtYmVyU3RyaW5nIl1dfSx7Im5hbWUiOiJmb3JtYXRNb250aCIsInNpZ25hdHVyZXMiOltbInllYXIiLCJ6ZXJvQmFzZU1vbnRoIl1dfSx7Im5hbWUiOiJmb3JtYXRTaG9ydE1vbnRoIiwic2lnbmF0dXJlcyI6W1sieWVhciIsInplcm9CYXNlTW9udGgiXV19LHsibmFtZSI6ImZvcm1hdFdlZWsiLCJzaWduYXR1cmVzIjpbWyJ5ZWFyIiwid2Vla051bWJlciIsImxvY2FsaXplZFN0YXJ0RGF0ZSJdXX0seyJuYW1lIjoic2V0V2luZG93UmVjdCIsInNpZ25hdHVyZXMiOltbIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXV19LHsibmFtZSI6ImNvbnN1bWVEZWx0YSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJhbGxvd3NGZWF0dXJlIiwic2lnbmF0dXJlcyI6W1siZmVhdHVyZSIsIj91cmwiXV19LHsibmFtZSI6ImdldEFsbG93bGlzdEZvckZlYXR1cmUiLCJzaWduYXR1cmVzIjpbWyJmZWF0dXJlIl1dfSx7Im5hbWUiOiJuZXdWYWx1ZVNwZWNpZmllZFVuaXRzIiwic2lnbmF0dXJlcyI6W1sidW5pdFR5cGUiLCJ2YWx1ZUluU3BlY2lmaWVkVW5pdHMiXV19LHsibmFtZSI6ImNvbnZlcnRUb1NwZWNpZmllZFVuaXRzIiwic2lnbmF0dXJlcyI6W1sidW5pdFR5cGUiXV19LHsibmFtZSI6ImJlZ2luRWxlbWVudEF0Iiwic2lnbmF0dXJlcyI6W1sib2Zmc2V0Il1dfSx7Im5hbWUiOiJlbmRFbGVtZW50QXQiLCJzaWduYXR1cmVzIjpbWyJvZmZzZXQiXV19LHsibmFtZSI6InNldFN0ZERldmlhdGlvbiIsInNpZ25hdHVyZXMiOltbInN0ZERldmlhdGlvblgiLCJzdGREZXZpYXRpb25ZIl1dfSx7Im5hbWUiOiJpc1BvaW50SW5GaWxsIiwic2lnbmF0dXJlcyI6W1sicG9pbnQiXV19LHsibmFtZSI6ImlzUG9pbnRJblN0cm9rZSIsInNpZ25hdHVyZXMiOltbInBvaW50Il1dLCJyZWNlaXZlciI6IlNWR0dlb21ldHJ5RWxlbWVudCJ9LHsibmFtZSI6ImlzUG9pbnRJblN0cm9rZSIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il0sWyJwYXRoIiwieCIsInkiXV0sInJlY2VpdmVyIjoiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiaXNQb2ludEluU3Ryb2tlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiXSxbInBhdGgiLCJ4IiwieSJdXSwicmVjZWl2ZXIiOiJPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJpc1BvaW50SW5TdHJva2UiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSJdLFsicGF0aCIsIngiLCJ5Il1dLCJyZWNlaXZlciI6IlBhaW50UmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiZ2V0UG9pbnRBdExlbmd0aCIsInNpZ25hdHVyZXMiOltbImRpc3RhbmNlIl1dfSx7Im5hbWUiOiJpbml0aWFsaXplIiwic2lnbmF0dXJlcyI6W1sibmV3SXRlbSJdXX0seyJuYW1lIjoiZ2V0SXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IlNWR0xlbmd0aExpc3QifSx7Im5hbWUiOiJnZXRJdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiU1ZHTnVtYmVyTGlzdCJ9LHsibmFtZSI6ImdldEl0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdQb2ludExpc3QifSx7Im5hbWUiOiJnZXRJdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiU1ZHU3RyaW5nTGlzdCJ9LHsibmFtZSI6ImdldEl0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdUcmFuc2Zvcm1MaXN0In0seyJuYW1lIjoiZ2V0SXRlbSIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJTdG9yYWdlIn0seyJuYW1lIjoiaW5zZXJ0SXRlbUJlZm9yZSIsInNpZ25hdHVyZXMiOltbIm5ld0l0ZW0iLCJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdMZW5ndGhMaXN0In0seyJuYW1lIjoiaW5zZXJ0SXRlbUJlZm9yZSIsInNpZ25hdHVyZXMiOltbIm5ld0l0ZW0iLCJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdOdW1iZXJMaXN0In0seyJuYW1lIjoiaW5zZXJ0SXRlbUJlZm9yZSIsInNpZ25hdHVyZXMiOltbIm5ld0l0ZW0iLCJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdQb2ludExpc3QifSx7Im5hbWUiOiJpbnNlcnRJdGVtQmVmb3JlIiwic2lnbmF0dXJlcyI6W1siaXRlbSIsImluZGV4Il1dLCJyZWNlaXZlciI6IlNWR1N0cmluZ0xpc3QifSx7Im5hbWUiOiJpbnNlcnRJdGVtQmVmb3JlIiwic2lnbmF0dXJlcyI6W1sibmV3SXRlbSIsImluZGV4Il1dLCJyZWNlaXZlciI6IlNWR1RyYW5zZm9ybUxpc3QifSx7Im5hbWUiOiJyZXBsYWNlSXRlbSIsInNpZ25hdHVyZXMiOltbIm5ld0l0ZW0iLCJpbmRleCJdXX0seyJuYW1lIjoicmVtb3ZlSXRlbSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dLCJyZWNlaXZlciI6IlNWR0xlbmd0aExpc3QifSx7Im5hbWUiOiJyZW1vdmVJdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiU1ZHTnVtYmVyTGlzdCJ9LHsibmFtZSI6InJlbW92ZUl0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdQb2ludExpc3QifSx7Im5hbWUiOiJyZW1vdmVJdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV0sInJlY2VpdmVyIjoiU1ZHU3RyaW5nTGlzdCJ9LHsibmFtZSI6InJlbW92ZUl0ZW0iLCJzaWduYXR1cmVzIjpbWyJpbmRleCJdXSwicmVjZWl2ZXIiOiJTVkdUcmFuc2Zvcm1MaXN0In0seyJuYW1lIjoicmVtb3ZlSXRlbSIsInNpZ25hdHVyZXMiOltbImtleSJdXSwicmVjZWl2ZXIiOiJTdG9yYWdlIn0seyJuYW1lIjoiYXBwZW5kSXRlbSIsInNpZ25hdHVyZXMiOltbIm5ld0l0ZW0iXV19LHsibmFtZSI6InNldE9yaWVudFRvQW5nbGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSJdXX0seyJuYW1lIjoic2NhbGVOb25Vbmlmb3JtIiwic2lnbmF0dXJlcyI6W1sic2NhbGVGYWN0b3JYIiwic2NhbGVGYWN0b3JZIl1dfSx7Im5hbWUiOiJnZXRJbnRlcnNlY3Rpb25MaXN0Iiwic2lnbmF0dXJlcyI6W1sicmVjdCIsInJlZmVyZW5jZUVsZW1lbnQiXV19LHsibmFtZSI6ImdldEVuY2xvc3VyZUxpc3QiLCJzaWduYXR1cmVzIjpbWyJyZWN0IiwicmVmZXJlbmNlRWxlbWVudCJdXX0seyJuYW1lIjoiY2hlY2tJbnRlcnNlY3Rpb24iLCJzaWduYXR1cmVzIjpbWyJlbGVtZW50IiwicmVjdCJdXX0seyJuYW1lIjoiY2hlY2tFbmNsb3N1cmUiLCJzaWduYXR1cmVzIjpbWyJlbGVtZW50IiwicmVjdCJdXX0seyJuYW1lIjoiY3JlYXRlU1ZHVHJhbnNmb3JtRnJvbU1hdHJpeCIsInNpZ25hdHVyZXMiOltbIm1hdHJpeCJdXX0seyJuYW1lIjoic3VzcGVuZFJlZHJhdyIsInNpZ25hdHVyZXMiOltbIm1heFdhaXRNaWxsaXNlY29uZHMiXV19LHsibmFtZSI6InVuc3VzcGVuZFJlZHJhdyIsInNpZ25hdHVyZXMiOltbInN1c3BlbmRIYW5kbGVJZCJdXX0seyJuYW1lIjoic2V0Q3VycmVudFRpbWUiLCJzaWduYXR1cmVzIjpbWyJzZWNvbmRzIl1dfSx7Im5hbWUiOiJnZXRTdWJTdHJpbmdMZW5ndGgiLCJzaWduYXR1cmVzIjpbWyJjaGFybnVtIiwibmNoYXJzIl1dfSx7Im5hbWUiOiJnZXRTdGFydFBvc2l0aW9uT2ZDaGFyIiwic2lnbmF0dXJlcyI6W1siY2hhcm51bSJdXX0seyJuYW1lIjoiZ2V0RW5kUG9zaXRpb25PZkNoYXIiLCJzaWduYXR1cmVzIjpbWyJjaGFybnVtIl1dfSx7Im5hbWUiOiJnZXRFeHRlbnRPZkNoYXIiLCJzaWduYXR1cmVzIjpbWyJjaGFybnVtIl1dfSx7Im5hbWUiOiJnZXRSb3RhdGlvbk9mQ2hhciIsInNpZ25hdHVyZXMiOltbImNoYXJudW0iXV19LHsibmFtZSI6ImdldENoYXJOdW1BdFBvc2l0aW9uIiwic2lnbmF0dXJlcyI6W1sicG9pbnQiXV19LHsibmFtZSI6InNlbGVjdFN1YlN0cmluZyIsInNpZ25hdHVyZXMiOltbImNoYXJudW0iLCJuY2hhcnMiXV19LHsibmFtZSI6InNldE1hdHJpeCIsInNpZ25hdHVyZXMiOltbIm1hdHJpeCJdXX0seyJuYW1lIjoic2V0VHJhbnNsYXRlIiwic2lnbmF0dXJlcyI6W1sidHgiLCJ0eSJdXX0seyJuYW1lIjoic2V0U2NhbGUiLCJzaWduYXR1cmVzIjpbWyJzeCIsInN5Il1dfSx7Im5hbWUiOiJzZXRSb3RhdGUiLCJzaWduYXR1cmVzIjpbWyJhbmdsZSIsImN4IiwiY3kiXV19LHsibmFtZSI6InNldFNrZXdYIiwic2lnbmF0dXJlcyI6W1siYW5nbGUiXV19LHsibmFtZSI6InNldFNrZXdZIiwic2lnbmF0dXJlcyI6W1siYW5nbGUiXV19LHsibmFtZSI6ImdldEVudHJpZXNCeVR5cGUiLCJzaWduYXR1cmVzIjpbWyJlbnRyeVR5cGUiXV19LHsibmFtZSI6ImdldEVudHJpZXNCeU5hbWUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwiP2VudHJ5VHlwZSJdXX0seyJuYW1lIjoiUGVyZm9ybWFuY2VPYnNlcnZlciIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrIl1dfSx7Im5hbWUiOiJVUkxTZWFyY2hQYXJhbXMiLCJzaWduYXR1cmVzIjpbWyI/aW5pdCJdXX0seyJuYW1lIjoiVVJMIiwic2lnbmF0dXJlcyI6W1sidXJsIiwiP2Jhc2UiXV19LHsibmFtZSI6ImltcG9ydFNjcmlwdHMiLCJzaWduYXR1cmVzIjpbWyIuLi51cmxzIl1dfSx7Im5hbWUiOiJhZGRNb2R1bGUiLCJzaWduYXR1cmVzIjpbWyJtb2R1bGVVUkwiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiY3JlYXRlRXhwcmVzc2lvbiIsInNpZ25hdHVyZXMiOltbImV4cHJlc3Npb24iLCI/cmVzb2x2ZXIiXV19LHsibmFtZSI6ImNyZWF0ZU5TUmVzb2x2ZXIiLCJzaWduYXR1cmVzIjpbWyJub2RlUmVzb2x2ZXIiXV19LHsibmFtZSI6ImV2YWx1YXRlIiwic2lnbmF0dXJlcyI6W1siZXhwcmVzc2lvbiIsImNvbnRleHROb2RlIiwiP3Jlc29sdmVyIiwiP3R5cGUiLCI/aW5SZXN1bHQiXV0sInJlY2VpdmVyIjoiRG9jdW1lbnQifSx7Im5hbWUiOiJldmFsdWF0ZSIsInNpZ25hdHVyZXMiOltbImV4cHJlc3Npb24iLCJjb250ZXh0Tm9kZSIsIj9yZXNvbHZlciIsIj90eXBlIiwiP2luUmVzdWx0Il1dLCJyZWNlaXZlciI6IlhQYXRoRXZhbHVhdG9yIn0seyJuYW1lIjoiZXZhbHVhdGUiLCJzaWduYXR1cmVzIjpbWyJjb250ZXh0Tm9kZSIsIj90eXBlIiwiP2luUmVzdWx0Il1dLCJyZWNlaXZlciI6IlhQYXRoRXhwcmVzc2lvbiJ9LHsibmFtZSI6InBhcnNlRnJvbVN0cmluZyIsInNpZ25hdHVyZXMiOltbInN0ciIsInR5cGUiXV19LHsibmFtZSI6InNlcmlhbGl6ZVRvU3RyaW5nIiwic2lnbmF0dXJlcyI6W1sicm9vdCJdXX0seyJuYW1lIjoic25hcHNob3RJdGVtIiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV19LHsibmFtZSI6ImltcG9ydFN0eWxlc2hlZXQiLCJzaWduYXR1cmVzIjpbWyJzdHlsZSJdXX0seyJuYW1lIjoidHJhbnNmb3JtVG9GcmFnbWVudCIsInNpZ25hdHVyZXMiOltbInNvdXJjZSIsIm91dHB1dCJdXX0seyJuYW1lIjoidHJhbnNmb3JtVG9Eb2N1bWVudCIsInNpZ25hdHVyZXMiOltbInNvdXJjZSJdXX0seyJuYW1lIjoic2V0UGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sibmFtZXNwYWNlVVJJIiwibG9jYWxOYW1lIiwidmFsdWUiXV19LHsibmFtZSI6ImdldFBhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbIm5hbWVzcGFjZVVSSSIsImxvY2FsTmFtZSJdXSwicmVjZWl2ZXIiOiJYU0xUUHJvY2Vzc29yIn0seyJuYW1lIjoiZ2V0UGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sicG5hbWUiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InJlbW92ZVBhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbIm5hbWVzcGFjZVVSSSIsImxvY2FsTmFtZSJdXX0seyJuYW1lIjoic2V0UmVxdWVzdEhlYWRlciIsInNpZ25hdHVyZXMiOltbIm5hbWUiLCJ2YWx1ZSJdXX0seyJuYW1lIjoic2VuZCIsInNpZ25hdHVyZXMiOltbIj9ib2R5Il1dLCJyZWNlaXZlciI6IlhNTEh0dHBSZXF1ZXN0In0seyJuYW1lIjoic2VuZCIsInNpZ25hdHVyZXMiOltbImRhdGEiXV0sInJlY2VpdmVyIjoiUlRDRGF0YUNoYW5uZWwifSx7Im5hbWUiOiJzZW5kIiwic2lnbmF0dXJlcyI6W1sibWVzc2FnZSJdLFsiZGF0YSJdXSwicmVjZWl2ZXIiOiJQcmVzZW50YXRpb25Db25uZWN0aW9uIn0seyJuYW1lIjoic2VuZCIsInNpZ25hdHVyZXMiOltbImRhdGEiLCI/dGltZXN0YW1wIl1dLCJyZWNlaXZlciI6Ik1JRElPdXRwdXQifSx7Im5hbWUiOiJzZW5kIiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXSwicmVjZWl2ZXIiOiJXZWJTb2NrZXQifSx7Im5hbWUiOiJnZXRSZXNwb25zZUhlYWRlciIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6Im92ZXJyaWRlTWltZVR5cGUiLCJzaWduYXR1cmVzIjpbWyJtaW1lIl1dfSx7Im5hbWUiOiJyZWdpc3RlckFuaW1hdG9yIiwic2lnbmF0dXJlcyI6W1sibmFtZSIsImFuaW1hdG9yQ29uc3RydWN0b3IiXV19LHsibmFtZSI6InNldFNpbmtJZCIsInNpZ25hdHVyZXMiOltbInNpbmtJZCJdXX0seyJuYW1lIjoiQmFja2dyb3VuZEZldGNoQ2xpY2tFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJpbml0Il1dfSx7Im5hbWUiOiJCYWNrZ3JvdW5kRmV0Y2hFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJpbml0Il1dfSx7Im5hbWUiOiJCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiaW5pdCJdXX0seyJuYW1lIjoiQmFja2dyb3VuZEZldGNoU2V0dGxlZEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImluaXQiXV19LHsibmFtZSI6IkJhY2tncm91bmRGZXRjaFNldHRsZWRGZXRjaCIsInNpZ25hdHVyZXMiOltbInJlcXVlc3QiLCJyZXNwb25zZSJdXX0seyJuYW1lIjoiQmFja2dyb3VuZEZldGNoVXBkYXRlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiaW5pdCJdXX0seyJuYW1lIjoidXBkYXRlVUkiLCJzaWduYXR1cmVzIjpbWyJ0aXRsZSJdXX0seyJuYW1lIjoiQmFja2dyb3VuZEZldGNoZWRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJpbml0Il1dfSx7Im5hbWUiOiJTeW5jRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiaW5pdCJdXX0seyJuYW1lIjoicmVnaXN0ZXIiLCJzaWduYXR1cmVzIjpbWyJ0YWciXV0sInJlY2VpdmVyIjoiU3luY01hbmFnZXIifSx7Im5hbWUiOiJyZWdpc3RlciIsInNpZ25hdHVyZXMiOltbInVybCIsIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IlNlcnZpY2VXb3JrZXJDb250YWluZXIifSx7Im5hbWUiOiJzZW5kQmVhY29uIiwic2lnbmF0dXJlcyI6W1sidXJsIiwiP2RhdGEiXV19LHsibmFtZSI6ImdldERlc2NyaXB0b3IiLCJzaWduYXR1cmVzIjpbWyJkZXNjcmlwdG9yIl1dLCJyZWNlaXZlciI6IkJsdWV0b290aFJlbW90ZUdBVFRDaGFyYWN0ZXJpc3RpYyJ9LHsibmFtZSI6ImdldERlc2NyaXB0b3IiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImdldERlc2NyaXB0b3JzIiwic2lnbmF0dXJlcyI6W1siP2Rlc2NyaXB0b3IiXV19LHsibmFtZSI6IndyaXRlVmFsdWUiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiY29ubmVjdCIsInNpZ25hdHVyZXMiOltbImRlc3RpbmF0aW9uIiwiP291dHB1dCIsIj9pbnB1dCJdXSwicmVjZWl2ZXIiOiJBdWRpb05vZGUifSx7Im5hbWUiOiJnZXRQcmltYXJ5U2VydmljZSIsInNpZ25hdHVyZXMiOltbInNlcnZpY2UiXV19LHsibmFtZSI6ImdldFByaW1hcnlTZXJ2aWNlcyIsInNpZ25hdHVyZXMiOltbIj9zZXJ2aWNlIl1dfSx7Im5hbWUiOiJnZXRDaGFyYWN0ZXJpc3RpYyIsInNpZ25hdHVyZXMiOltbImNoYXJhY3RlcmlzdGljIl1dLCJyZWNlaXZlciI6IkJsdWV0b290aFJlbW90ZUdBVFRTZXJ2aWNlIn0seyJuYW1lIjoiZ2V0Q2hhcmFjdGVyaXN0aWMiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dLCJzdGF0aWMiOnRydWV9LHsibmFtZSI6ImdldENoYXJhY3RlcmlzdGljcyIsInNpZ25hdHVyZXMiOltbIj9jaGFyYWN0ZXJpc3RpYyJdXX0seyJuYW1lIjoiZ2V0U2VydmljZSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6ImNhbm9uaWNhbFVVSUQiLCJzaWduYXR1cmVzIjpbWyJhbGlhcyJdXX0seyJuYW1lIjoicmVxdWVzdERldmljZSIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkJsdWV0b290aCJ9LHsibmFtZSI6InJlcXVlc3REZXZpY2UiLCJzaWduYXR1cmVzIjpbWyJvcHRpb25zIl1dLCJyZWNlaXZlciI6IlVTQiJ9LHsibmFtZSI6IkJyb2FkY2FzdENoYW5uZWwiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJnZXRDb3N0Iiwic2lnbmF0dXJlcyI6W1sib3BlcmF0aW9uIl1dfSx7Im5hbWUiOiJyZXNlcnZlIiwic2lnbmF0dXJlcyI6W1sib3BlcmF0aW9uIl1dfSx7Im5hbWUiOiJtYXRjaEFsbCIsInNpZ25hdHVyZXMiOltbIj9yZXF1ZXN0IiwiP29wdGlvbnMiXV0sInJlY2VpdmVyIjoiQ2FjaGUifSx7Im5hbWUiOiJtYXRjaEFsbCIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dLCJyZWNlaXZlciI6IkNsaWVudHMifSx7Im5hbWUiOiJhZGRBbGwiLCJzaWduYXR1cmVzIjpbWyJyZXF1ZXN0cyJdXX0seyJuYW1lIjoicHV0Iiwic2lnbmF0dXJlcyI6W1sicmVxdWVzdCIsInJlc3BvbnNlIl1dLCJyZWNlaXZlciI6IkNhY2hlIn0seyJuYW1lIjoicHV0Iiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCI/a2V5Il1dLCJyZWNlaXZlciI6IklEQk9iamVjdFN0b3JlIn0seyJuYW1lIjoiYWRkQ29sb3JTdG9wIiwic2lnbmF0dXJlcyI6W1sib2Zmc2V0IiwiY29sb3IiXV19LHsibmFtZSI6ImxpbmVUbyIsInNpZ25hdHVyZXMiOltbIngiLCJ5Il1dfSx7Im5hbWUiOiJxdWFkcmF0aWNDdXJ2ZVRvIiwic2lnbmF0dXJlcyI6W1siY3B4IiwiY3B5IiwieCIsInkiXV19LHsibmFtZSI6ImJlemllckN1cnZlVG8iLCJzaWduYXR1cmVzIjpbWyJjcDF4IiwiY3AxeSIsImNwMngiLCJjcDJ5IiwieCIsInkiXV19LHsibmFtZSI6ImFyY1RvIiwic2lnbmF0dXJlcyI6W1sieDEiLCJ5MSIsIngyIiwieTIiLCJyYWRpdXMiXV19LHsibmFtZSI6InJlY3QiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il1dfSx7Im5hbWUiOiJhcmMiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsInJhZGl1cyIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsIj9hbnRpY2xvY2t3aXNlIl1dfSx7Im5hbWUiOiJlbGxpcHNlIiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJyYWRpdXNYIiwicmFkaXVzWSIsInJvdGF0aW9uIiwic3RhcnRBbmdsZSIsImVuZEFuZ2xlIiwiP2FudGljbG9ja3dpc2UiXV19LHsibmFtZSI6InNldFRyYW5zZm9ybSIsInNpZ25hdHVyZXMiOltbInRyYW5zZm9ybSJdXSwicmVjZWl2ZXIiOiJDYW52YXNQYXR0ZXJuIn0seyJuYW1lIjoic2V0VHJhbnNmb3JtIiwic2lnbmF0dXJlcyI6W1siYSIsImIiLCJjIiwiZCIsImUiLCJmIl1dLCJyZWNlaXZlciI6IkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCJ9LHsibmFtZSI6InNldFRyYW5zZm9ybSIsInNpZ25hdHVyZXMiOltbImEiLCJiIiwiYyIsImQiLCJlIiwiZiJdXSwicmVjZWl2ZXIiOiJPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJzZXRUcmFuc2Zvcm0iLCJzaWduYXR1cmVzIjpbWyJhIiwiYiIsImMiLCJkIiwiZSIsImYiXV0sInJlY2VpdmVyIjoiUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJ0cmFuc2Zvcm0iLCJzaWduYXR1cmVzIjpbWyJhIiwiYiIsImMiLCJkIiwiZSIsImYiXV19LHsibmFtZSI6ImNyZWF0ZUxpbmVhckdyYWRpZW50Iiwic2lnbmF0dXJlcyI6W1sieDAiLCJ5MCIsIngxIiwieTEiXV19LHsibmFtZSI6ImNyZWF0ZVJhZGlhbEdyYWRpZW50Iiwic2lnbmF0dXJlcyI6W1sieDAiLCJ5MCIsInIwIiwieDEiLCJ5MSIsInIxIl1dfSx7Im5hbWUiOiJjcmVhdGVQYXR0ZXJuIiwic2lnbmF0dXJlcyI6W1siaW1hZ2UiLCJyZXBldGl0aW9uVHlwZSJdXX0seyJuYW1lIjoiY2xlYXJSZWN0Iiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoiZmlsbFJlY3QiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il1dfSx7Im5hbWUiOiJzdHJva2VSZWN0Iiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoic3Ryb2tlIiwic2lnbmF0dXJlcyI6W1siP3BhdGgiXV19LHsibmFtZSI6ImRyYXdGb2N1c0lmTmVlZGVkIiwic2lnbmF0dXJlcyI6W1siZWxlbWVudCJdLFsicGF0aCIsImVsZW1lbnQiXV19LHsibmFtZSI6InNjcm9sbFBhdGhJbnRvVmlldyIsInNpZ25hdHVyZXMiOltbIj9wYXRoIl1dfSx7Im5hbWUiOiJjbGlwIiwic2lnbmF0dXJlcyI6W1siP3dpbmRpbmciXSxbInBhdGgiLCI/d2luZGluZyJdXSwicmVjZWl2ZXIiOiJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJjbGlwIiwic2lnbmF0dXJlcyI6W1siP3BhdGgiXV0sInJlY2VpdmVyIjoiT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiY2xpcCIsInNpZ25hdHVyZXMiOltbIj93aW5kaW5nIl0sWyJwYXRoIiwiP3dpbmRpbmciXV0sInJlY2VpdmVyIjoiUGFpbnRSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJpc1BvaW50SW5QYXRoIiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCI/d2luZGluZyJdLFsicGF0aCIsIngiLCJ5IiwiP3dpbmRpbmciXV19LHsibmFtZSI6ImZpbGxUZXh0Iiwic2lnbmF0dXJlcyI6W1sidGV4dCIsIngiLCJ5IiwiP21heFdpZHRoIl1dfSx7Im5hbWUiOiJzdHJva2VUZXh0Iiwic2lnbmF0dXJlcyI6W1sidGV4dCIsIngiLCJ5IiwiP21heFdpZHRoIl1dfSx7Im5hbWUiOiJtZWFzdXJlVGV4dCIsInNpZ25hdHVyZXMiOltbInRleHQiXV19LHsibmFtZSI6ImRyYXdJbWFnZSIsInNpZ25hdHVyZXMiOltbImltYWdlIiwieCIsInkiLCI/d2lkdGgiLCI/aGVpZ2h0Il0sWyJpbWFnZSIsInN4Iiwic3kiLCJzdyIsInNoIiwiZHgiLCJkeSIsImR3IiwiZGgiXV19LHsibmFtZSI6ImFkZEhpdFJlZ2lvbiIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJyZW1vdmVIaXRSZWdpb24iLCJzaWduYXR1cmVzIjpbWyJpZCJdXX0seyJuYW1lIjoiY3JlYXRlSW1hZ2VEYXRhIiwic2lnbmF0dXJlcyI6W1siaW1hZ2VkYXRhIl0sWyJzdyIsInNoIiwiP2ltYWdlRGF0YUNvbG9yU2V0dGluZ3MiXSxbImRhdGEiLCJzdyIsInNoIiwiP2ltYWdlRGF0YUNvbG9yU2V0dGluZ3MiXV0sInJlY2VpdmVyIjoiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIn0seyJuYW1lIjoiY3JlYXRlSW1hZ2VEYXRhIiwic2lnbmF0dXJlcyI6W1siaW1hZ2VkYXRhIl0sWyJzdyIsInNoIiwiP2ltYWdlRGF0YUNvbG9yU2V0dGluZ3MiXSxbImRhdGEiLCJzdyIsInNoIiwiaW1hZ2VEYXRhQ29sb3JTZXR0aW5ncyJdXSwicmVjZWl2ZXIiOiJPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQifSx7Im5hbWUiOiJnZXRJbWFnZURhdGEiLCJzaWduYXR1cmVzIjpbWyJzeCIsInN5Iiwic3ciLCJzaCJdXX0seyJuYW1lIjoicHV0SW1hZ2VEYXRhIiwic2lnbmF0dXJlcyI6W1siaW1hZ2VkYXRhIiwiZHgiLCJkeSIsIj9kaXJ0eVgiLCI/ZGlydHlZIiwiP2RpcnR5V2lkdGgiLCI/ZGlydHlIZWlnaHQiXV19LHsibmFtZSI6InNldExpbmVEYXNoIiwic2lnbmF0dXJlcyI6W1siZGFzaCJdXX0seyJuYW1lIjoiYWRkUGF0aCIsInNpZ25hdHVyZXMiOltbInBhdGgiLCI/dHJhbnNmb3JtIl1dfSx7Im5hbWUiOiJnZXRDb250ZXh0Iiwic2lnbmF0dXJlcyI6W1siY29udGV4dElkIiwiP2F0dHJpYnV0ZXMiXV0sInJlY2VpdmVyIjoiSFRNTENhbnZhc0VsZW1lbnQifSx7Im5hbWUiOiJnZXRDb250ZXh0Iiwic2lnbmF0dXJlcyI6W1siY29udGV4dFR5cGUiLCI/YXR0cmlidXRlcyJdXSwicmVjZWl2ZXIiOiJPZmZzY3JlZW5DYW52YXMifSx7Im5hbWUiOiJ0cmFuc2ZlckZyb21JbWFnZUJpdG1hcCIsInNpZ25hdHVyZXMiOltbImJpdG1hcCJdXX0seyJuYW1lIjoid3JpdGVUZXh0Iiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXX0seyJuYW1lIjoiQ29va2llQ2hhbmdlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6InN1YnNjcmliZVRvQ2hhbmdlcyIsInNpZ25hdHVyZXMiOltbInN1YnNjcmlwdGlvbnMiXV19LHsibmFtZSI6IkV4dGVuZGFibGVDb29raWVDaGFuZ2VFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiRmVkZXJhdGVkQ3JlZGVudGlhbCIsInNpZ25hdHVyZXMiOltbImRhdGEiXV19LHsibmFtZSI6IlBhc3N3b3JkQ3JlZGVudGlhbCIsInNpZ25hdHVyZXMiOltbImRhdGEiXV19LHsibmFtZSI6ImdldFJhbmRvbVZhbHVlcyIsInNpZ25hdHVyZXMiOltbImFycmF5Il1dfSx7Im5hbWUiOiJlbmNyeXB0Iiwic2lnbmF0dXJlcyI6W1siYWxnb3JpdGhtIiwia2V5IiwiZGF0YSJdXX0seyJuYW1lIjoiZGVjcnlwdCIsInNpZ25hdHVyZXMiOltbImFsZ29yaXRobSIsImtleSIsImRhdGEiXV19LHsibmFtZSI6InZlcmlmeSIsInNpZ25hdHVyZXMiOltbImFsZ29yaXRobSIsImtleSIsInNpZ25hdHVyZSIsImRhdGEiXV19LHsibmFtZSI6ImRpZ2VzdCIsInNpZ25hdHVyZXMiOltbImFsZ29yaXRobSIsImRhdGEiXV19LHsibmFtZSI6ImdlbmVyYXRlS2V5Iiwic2lnbmF0dXJlcyI6W1siYWxnb3JpdGhtIiwiZXh0cmFjdGFibGUiLCJrZXlVc2FnZXMiXV19LHsibmFtZSI6ImltcG9ydEtleSIsInNpZ25hdHVyZXMiOltbImZvcm1hdCIsImtleURhdGEiLCJhbGdvcml0aG0iLCJleHRyYWN0YWJsZSIsImtleVVzYWdlcyJdXX0seyJuYW1lIjoiZXhwb3J0S2V5Iiwic2lnbmF0dXJlcyI6W1siZm9ybWF0Iiwia2V5Il1dfSx7Im5hbWUiOiJkZXJpdmVCaXRzIiwic2lnbmF0dXJlcyI6W1siYWxnb3JpdGhtIiwiYmFzZUtleSIsImxlbmd0aCJdXX0seyJuYW1lIjoiZGVyaXZlS2V5Iiwic2lnbmF0dXJlcyI6W1siYWxnb3JpdGhtIiwiYmFzZUtleSIsImRlcml2ZWRLZXlUeXBlIiwiZXh0cmFjdGFibGUiLCJrZXlVc2FnZXMiXV19LHsibmFtZSI6IndyYXBLZXkiLCJzaWduYXR1cmVzIjpbWyJmb3JtYXQiLCJrZXkiLCJ3cmFwcGluZ0tleSIsIndyYXBBbGdvcml0aG0iXV19LHsibmFtZSI6InVud3JhcEtleSIsInNpZ25hdHVyZXMiOltbImZvcm1hdCIsIndyYXBwZWRLZXkiLCJ1bndyYXBwaW5nS2V5IiwidW53cmFwQWxnb3JpdGhtIiwidW53cmFwcGVkS2V5QWxnb3JpdGhtIiwiZXh0cmFjdGFibGUiLCJrZXlVc2FnZXMiXV19LHsibmFtZSI6InJlZ2lzdGVyUGFpbnQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwicGFpbnRDdG9yIl1dfSx7Im5hbWUiOiJEZXZpY2VNb3Rpb25FdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiRGV2aWNlT3JpZW50YXRpb25FdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiVGV4dERlY29kZXIiLCJzaWduYXR1cmVzIjpbWyI/bGFiZWwiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiZW5jb2RlIiwic2lnbmF0dXJlcyI6W1siP2lucHV0Il1dfSx7Im5hbWUiOiJzZXRNZWRpYUtleXMiLCJzaWduYXR1cmVzIjpbWyJtZWRpYUtleXMiXV19LHsibmFtZSI6ImdlbmVyYXRlUmVxdWVzdCIsInNpZ25hdHVyZXMiOltbImluaXREYXRhVHlwZSIsImluaXREYXRhIl1dfSx7Im5hbWUiOiJnZXRTdGF0dXNGb3JQb2xpY3kiLCJzaWduYXR1cmVzIjpbWyJwb2xpY3kiXV19LHsibmFtZSI6ImNyZWF0ZVNlc3Npb24iLCJzaWduYXR1cmVzIjpbWyI/c2Vzc2lvblR5cGUiXV19LHsibmFtZSI6InNldFNlcnZlckNlcnRpZmljYXRlIiwic2lnbmF0dXJlcyI6W1sic2VydmVyQ2VydGlmaWNhdGUiXV19LHsibmFtZSI6InJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2VzcyIsInNpZ25hdHVyZXMiOltbImtleVN5c3RlbSIsInN1cHBvcnRlZENvbmZpZ3VyYXRpb25zIl1dfSx7Im5hbWUiOiJFdmVudFNvdXJjZSIsInNpZ25hdHVyZXMiOltbInVybCIsIj9ldmVudFNvdXJjZUluaXREaWN0Il1dfSx7Im5hbWUiOiJ3ZWJraXRSZXF1ZXN0RmlsZVN5c3RlbSIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJzaXplIiwiP3N1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkRlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlIn0seyJuYW1lIjoid2Via2l0UmVxdWVzdEZpbGVTeXN0ZW0iLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwic2l6ZSIsIj9zdWNjZXNzQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSJ9LHsibmFtZSI6IndlYmtpdFJlcXVlc3RGaWxlU3lzdGVtIiwic2lnbmF0dXJlcyI6W1sidHlwZSIsInNpemUiLCJzdWNjZXNzQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJXaW5kb3cifSx7Im5hbWUiOiJ3ZWJraXRSZXF1ZXN0RmlsZVN5c3RlbVN5bmMiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwic2l6ZSJdXX0seyJuYW1lIjoid2Via2l0UmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTCIsInNpZ25hdHVyZXMiOltbInVybCIsInN1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dfSx7Im5hbWUiOiJ3ZWJraXRSZXNvbHZlTG9jYWxGaWxlU3lzdGVtU3luY1VSTCIsInNpZ25hdHVyZXMiOltbInVybCJdXX0seyJuYW1lIjoiaXNvbGF0ZWRGaWxlU3lzdGVtIiwic2lnbmF0dXJlcyI6W1siZmlsZVN5c3RlbUlkIiwicmVnaXN0ZXJlZE5hbWUiXV19LHsibmFtZSI6InVwZ3JhZGVEcmFnZ2VkRmlsZVN5c3RlbVBlcm1pc3Npb25zIiwic2lnbmF0dXJlcyI6W1siZG9tRmlsZVN5c3RlbSJdXX0seyJuYW1lIjoiZ2V0RmlsZSIsInNpZ25hdHVyZXMiOltbInBhdGgiLCJmbGFncyJdXSwicmVjZWl2ZXIiOiJEaXJlY3RvcnlFbnRyeVN5bmMifSx7Im5hbWUiOiJnZXRGaWxlIiwic2lnbmF0dXJlcyI6W1sicGF0aCIsIj9vcHRpb25zIiwiP3N1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkRpcmVjdG9yeUVudHJ5In0seyJuYW1lIjoiZ2V0RGlyZWN0b3J5Iiwic2lnbmF0dXJlcyI6W1sicGF0aCIsImZsYWdzIl1dLCJyZWNlaXZlciI6IkRpcmVjdG9yeUVudHJ5U3luYyJ9LHsibmFtZSI6ImdldERpcmVjdG9yeSIsInNpZ25hdHVyZXMiOltbInBhdGgiLCI/b3B0aW9ucyIsIj9zdWNjZXNzQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJEaXJlY3RvcnlFbnRyeSJ9LHsibmFtZSI6InJlbW92ZVJlY3Vyc2l2ZWx5Iiwic2lnbmF0dXJlcyI6W1sic3VjY2Vzc0NhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siXV0sInJlY2VpdmVyIjoiRGlyZWN0b3J5RW50cnkifSx7Im5hbWUiOiJyZWFkRW50cmllcyIsInNpZ25hdHVyZXMiOltbInN1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkRpcmVjdG9yeVJlYWRlciJ9LHsibmFtZSI6ImdldE1ldGFkYXRhIiwic2lnbmF0dXJlcyI6W1sic3VjY2Vzc0NhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siXV0sInJlY2VpdmVyIjoiRW50cnkifSx7Im5hbWUiOiJjb3B5VG8iLCJzaWduYXR1cmVzIjpbWyJwYXJlbnQiLCJuYW1lIl1dLCJyZWNlaXZlciI6IkVudHJ5U3luYyJ9LHsibmFtZSI6ImNvcHlUbyIsInNpZ25hdHVyZXMiOltbInBhcmVudCIsIj9uYW1lIiwiP3N1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkVudHJ5In0seyJuYW1lIjoiZ2V0UGFyZW50Iiwic2lnbmF0dXJlcyI6W1siP3N1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkVudHJ5In0seyJuYW1lIjoiZmlsZSIsInNpZ25hdHVyZXMiOltbInN1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkZpbGVFbnRyeSJ9LHsibmFtZSI6ImNyZWF0ZVdyaXRlciIsInNpZ25hdHVyZXMiOltbInN1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkZpbGVFbnRyeSJ9LHsibmFtZSI6InNlZWsiLCJzaWduYXR1cmVzIjpbWyJwb3NpdGlvbiJdXX0seyJuYW1lIjoidHJ1bmNhdGUiLCJzaWduYXR1cmVzIjpbWyJzaXplIl1dfSx7Im5hbWUiOiJwbGF5RWZmZWN0Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsInBhcmFtcyJdXX0seyJuYW1lIjoiZ2V0Q3VycmVudFBvc2l0aW9uIiwic2lnbmF0dXJlcyI6W1sic3VjY2Vzc0NhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoid2F0Y2hQb3NpdGlvbiIsInNpZ25hdHVyZXMiOltbInN1Y2Nlc3NDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImNsZWFyV2F0Y2giLCJzaWduYXR1cmVzIjpbWyJ3YXRjaElEIl1dfSx7Im5hbWUiOiJJbWFnZUNhcHR1cmUiLCJzaWduYXR1cmVzIjpbWyJ0cmFjayJdXX0seyJuYW1lIjoidGFrZVBob3RvIiwic2lnbmF0dXJlcyI6W1siP3Bob3RvU2V0dGluZ3MiXV19LHsibmFtZSI6ImFkdmFuY2UiLCJzaWduYXR1cmVzIjpbWyJjb3VudCJdXX0seyJuYW1lIjoiY29udGludWUiLCJzaWduYXR1cmVzIjpbWyI/a2V5Il1dfSx7Im5hbWUiOiJjb250aW51ZVByaW1hcnlLZXkiLCJzaWduYXR1cmVzIjpbWyJrZXkiLCJwcmltYXJ5S2V5Il1dfSx7Im5hbWUiOiJ0cmFuc2FjdGlvbiIsInNpZ25hdHVyZXMiOltbInN0b3JlTmFtZXMiLCI/bW9kZSJdXSwicmVjZWl2ZXIiOiJJREJEYXRhYmFzZSJ9LHsibmFtZSI6InRyYW5zYWN0aW9uIiwic2lnbmF0dXJlcyI6W1siY2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayIsIj9zdWNjZXNzQ2FsbGJhY2siXV0sInJlY2VpdmVyIjoiRGF0YWJhc2UifSx7Im5hbWUiOiJjcmVhdGVPYmplY3RTdG9yZSIsInNpZ25hdHVyZXMiOltbIm5hbWUiLCI/b3B0aW9ucyJdXX0seyJuYW1lIjoiZGVsZXRlT2JqZWN0U3RvcmUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJkZWxldGVEYXRhYmFzZSIsInNpZ25hdHVyZXMiOltbIm5hbWUiXV19LHsibmFtZSI6ImNtcCIsInNpZ25hdHVyZXMiOltbImZpcnN0Iiwic2Vjb25kIl1dfSx7Im5hbWUiOiJnZXRLZXkiLCJzaWduYXR1cmVzIjpbWyJrZXkiXV19LHsibmFtZSI6ImdldEFsbEtleXMiLCJzaWduYXR1cmVzIjpbWyI/cXVlcnkiLCI/Y291bnQiXV19LHsibmFtZSI6ImNvdW50Iiwic2lnbmF0dXJlcyI6W1siP2tleSJdXSwicmVjZWl2ZXIiOiJJREJJbmRleCJ9LHsibmFtZSI6ImNvdW50Iiwic2lnbmF0dXJlcyI6W1siP2tleSJdXSwicmVjZWl2ZXIiOiJJREJPYmplY3RTdG9yZSJ9LHsibmFtZSI6ImNvdW50Iiwic2lnbmF0dXJlcyI6W1siP2xhYmVsIl1dLCJyZWNlaXZlciI6ImNvbnNvbGUifSx7Im5hbWUiOiJvcGVuQ3Vyc29yIiwic2lnbmF0dXJlcyI6W1siP3JhbmdlIiwiP2RpcmVjdGlvbiJdXX0seyJuYW1lIjoib3BlbktleUN1cnNvciIsInNpZ25hdHVyZXMiOltbIj9yYW5nZSIsIj9kaXJlY3Rpb24iXV19LHsibmFtZSI6Im9ubHkiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoibG93ZXJCb3VuZCIsInNpZ25hdHVyZXMiOltbImJvdW5kIiwiP29wZW4iXV19LHsibmFtZSI6InVwcGVyQm91bmQiLCJzaWduYXR1cmVzIjpbWyJib3VuZCIsIj9vcGVuIl1dfSx7Im5hbWUiOiJib3VuZCIsInNpZ25hdHVyZXMiOltbImxvd2VyIiwidXBwZXIiLCI/bG93ZXJPcGVuIiwiP3VwcGVyT3BlbiJdXX0seyJuYW1lIjoiaW5kZXgiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJjcmVhdGVJbmRleCIsInNpZ25hdHVyZXMiOltbIm5hbWUiLCJrZXlQYXRoIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImRlbGV0ZUluZGV4Iiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXX0seyJuYW1lIjoiSURCT2JzZXJ2ZXIiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayJdXX0seyJuYW1lIjoib2JqZWN0U3RvcmUiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJJREJWZXJzaW9uQ2hhbmdlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6ImxvY2siLCJzaWduYXR1cmVzIjpbWyI/a2V5Q29kZXMiXV0sInJlY2VpdmVyIjoiS2V5Ym9hcmQifSx7Im5hbWUiOiJsb2NrIiwic2lnbmF0dXJlcyI6W1sib3JpZW50YXRpb24iXV0sInJlY2VpdmVyIjoiU2NyZWVuT3JpZW50YXRpb24ifSx7Im5hbWUiOiJyZXF1ZXN0Iiwic2lnbmF0dXJlcyI6W1sibmFtZSIsImNhbGxiYWNrIl0sWyJuYW1lIiwib3B0aW9ucyIsImNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkxvY2tNYW5hZ2VyIn0seyJuYW1lIjoicmVxdWVzdCIsInNpZ25hdHVyZXMiOltbInBlcm1pc3Npb25zIl1dLCJyZWNlaXZlciI6IlBlcm1pc3Npb25zIn0seyJuYW1lIjoicXVlcnkiLCJzaWduYXR1cmVzIjpbWyJwZXJtaXNzaW9uIl1dLCJyZWNlaXZlciI6IlBlcm1pc3Npb25zIn0seyJuYW1lIjoiZGVjb2RpbmdJbmZvIiwic2lnbmF0dXJlcyI6W1siY29uZmlndXJhdGlvbiJdXX0seyJuYW1lIjoiZW5jb2RpbmdJbmZvIiwic2lnbmF0dXJlcyI6W1siY29uZmlndXJhdGlvbiJdXX0seyJuYW1lIjoiY2FwdHVyZVN0cmVhbSIsInNpZ25hdHVyZXMiOltbIj9mcmFtZVJhdGUiXV0sInJlY2VpdmVyIjoiSFRNTENhbnZhc0VsZW1lbnQifSx7Im5hbWUiOiJCbG9iRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiTWVkaWFSZWNvcmRlciIsInNpZ25hdHVyZXMiOltbInN0cmVhbSIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJpc1R5cGVTdXBwb3J0ZWQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIl1dfSx7Im5hbWUiOiJzZXRBY3Rpb25IYW5kbGVyIiwic2lnbmF0dXJlcyI6W1siYWN0aW9uIiwiaGFuZGxlciJdXX0seyJuYW1lIjoiYWRkU291cmNlQnVmZmVyIiwic2lnbmF0dXJlcyI6W1sidHlwZSJdXX0seyJuYW1lIjoicmVtb3ZlU291cmNlQnVmZmVyIiwic2lnbmF0dXJlcyI6W1siYnVmZmVyIl1dfSx7Im5hbWUiOiJlbmRPZlN0cmVhbSIsInNpZ25hdHVyZXMiOltbIj9lcnJvciJdXX0seyJuYW1lIjoic2V0TGl2ZVNlZWthYmxlUmFuZ2UiLCJzaWduYXR1cmVzIjpbWyJzdGFydCIsImVuZCJdXX0seyJuYW1lIjoiYXBwZW5kQnVmZmVyIiwic2lnbmF0dXJlcyI6W1siZGF0YSJdXX0seyJuYW1lIjoiZ2V0VXNlck1lZGlhIiwic2lnbmF0dXJlcyI6W1siP2NvbnN0cmFpbnRzIl1dLCJyZWNlaXZlciI6Ik1lZGlhRGV2aWNlcyJ9LHsibmFtZSI6ImdldFVzZXJNZWRpYSIsInNpZ25hdHVyZXMiOltbImNvbnN0cmFpbnRzIiwic3VjY2Vzc0NhbGxiYWNrIiwiZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJOYXZpZ2F0b3IifSx7Im5hbWUiOiJNZWRpYVN0cmVhbVRyYWNrRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiYXBwbHlDb25zdHJhaW50cyIsInNpZ25hdHVyZXMiOltbIj9jb25zdHJhaW50cyJdXX0seyJuYW1lIjoiYWRkVHJhY2siLCJzaWduYXR1cmVzIjpbWyJ0cmFjayJdXSwicmVjZWl2ZXIiOiJNZWRpYVN0cmVhbSJ9LHsibmFtZSI6ImFkZFRyYWNrIiwic2lnbmF0dXJlcyI6W1sidHJhY2siLCIuLi5zdHJlYW1zIl1dLCJyZWNlaXZlciI6IlJUQ1BlZXJDb25uZWN0aW9uIn0seyJuYW1lIjoicmVtb3ZlVHJhY2siLCJzaWduYXR1cmVzIjpbWyJ0cmFjayJdXSwicmVjZWl2ZXIiOiJNZWRpYVN0cmVhbSJ9LHsibmFtZSI6InJlbW92ZVRyYWNrIiwic2lnbmF0dXJlcyI6W1sic2VuZGVyIl1dLCJyZWNlaXZlciI6IlJUQ1BlZXJDb25uZWN0aW9uIn0seyJuYW1lIjoid2Via2l0R2V0VXNlck1lZGlhIiwic2lnbmF0dXJlcyI6W1siY29uc3RyYWludHMiLCJzdWNjZXNzQ2FsbGJhY2siLCJlcnJvckNhbGxiYWNrIl1dfSx7Im5hbWUiOiJyZWdpc3RlclByb3RvY29sSGFuZGxlciIsInNpZ25hdHVyZXMiOltbInNjaGVtZSIsInVybCIsInRpdGxlIl1dfSx7Im5hbWUiOiJ1bnJlZ2lzdGVyUHJvdG9jb2xIYW5kbGVyIiwic2lnbmF0dXJlcyI6W1sic2NoZW1lIiwidXJsIl1dfSx7Im5hbWUiOiJjYW5jZWxQdXNoIiwic2lnbmF0dXJlcyI6W1siP3RhcmdldCJdXX0seyJuYW1lIjoiY2FuY2VsV2F0Y2giLCJzaWduYXR1cmVzIjpbWyI/aWQiXV19LHsibmFtZSI6Ik5vdGlmaWNhdGlvbkV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImV2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6Ik5vdGlmaWNhdGlvbiIsInNpZ25hdHVyZXMiOltbInRpdGxlIiwiP29wdGlvbnMiXV19LHsibmFtZSI6InJlcXVlc3RQZXJtaXNzaW9uIiwic2lnbmF0dXJlcyI6W1siP2RlcHJlY2F0ZWRDYWxsYmFjayJdXX0seyJuYW1lIjoic2hvd05vdGlmaWNhdGlvbiIsInNpZ25hdHVyZXMiOltbInRpdGxlIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImdldE5vdGlmaWNhdGlvbnMiLCJzaWduYXR1cmVzIjpbWyI/ZmlsdGVyIl1dfSx7Im5hbWUiOiJBYm9ydFBheW1lbnRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJyZXNwb25kV2l0aCIsInNpZ25hdHVyZXMiOltbInBheW1lbnRBYm9ydGVkUmVzcG9uc2UiXV0sInJlY2VpdmVyIjoiQWJvcnRQYXltZW50RXZlbnQifSx7Im5hbWUiOiJyZXNwb25kV2l0aCIsInNpZ25hdHVyZXMiOltbImNhbk1ha2VQYXltZW50UmVzcG9uc2UiXV0sInJlY2VpdmVyIjoiQ2FuTWFrZVBheW1lbnRFdmVudCJ9LHsibmFtZSI6InJlc3BvbmRXaXRoIiwic2lnbmF0dXJlcyI6W1sicmVzcG9uc2UiXV0sInJlY2VpdmVyIjoiUGF5bWVudFJlcXVlc3RFdmVudCJ9LHsibmFtZSI6InJlc3BvbmRXaXRoIiwic2lnbmF0dXJlcyI6W1siciJdXSwicmVjZWl2ZXIiOiJGZXRjaEV2ZW50In0seyJuYW1lIjoiQ2FuTWFrZVBheW1lbnRFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJQYXltZW50UmVxdWVzdEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImV2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6Im9wZW5XaW5kb3ciLCJzaWduYXR1cmVzIjpbWyJ1cmwiXV19LHsibmFtZSI6IlBheW1lbnRSZXF1ZXN0VXBkYXRlRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6InVwZGF0ZVdpdGgiLCJzaWduYXR1cmVzIjpbWyJkZXRhaWxzUHJvbWlzZSJdXX0seyJuYW1lIjoiUGF5bWVudFJlcXVlc3QiLCJzaWduYXR1cmVzIjpbWyJtZXRob2REYXRhIiwiZGV0YWlscyIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJSVENEYXRhQ2hhbm5lbEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImV2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6Imluc2VydERUTUYiLCJzaWduYXR1cmVzIjpbWyJ0b25lcyIsIj9kdXJhdGlvbiIsIj9pbnRlclRvbmVHYXAiXV19LHsibmFtZSI6InN0YXQiLCJzaWduYXR1cmVzIjpbWyJuYW1lIl1dfSx7Im5hbWUiOiJSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9ldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJSVENQZWVyQ29ubmVjdGlvbiIsInNpZ25hdHVyZXMiOltbIj9jb25maWd1cmF0aW9uIiwiP21lZGlhQ29uc3RyYWludHMiXV19LHsibmFtZSI6ImNyZWF0ZU9mZmVyIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXSxbInN1Y2Nlc3NDYWxsYmFjayIsImZhaWx1cmVDYWxsYmFjayIsIj9ydGNPZmZlck9wdGlvbnMiXV19LHsibmFtZSI6ImNyZWF0ZUFuc3dlciIsInNpZ25hdHVyZXMiOltbIj9vcHRpb25zIl0sWyJzdWNjZXNzQ2FsbGJhY2siLCJmYWlsdXJlQ2FsbGJhY2siLCI/bWVkaWFDb25zdHJhaW50cyJdXX0seyJuYW1lIjoic2V0TG9jYWxEZXNjcmlwdGlvbiIsInNpZ25hdHVyZXMiOltbImRlc2NyaXB0aW9uIiwiP3N1Y2Nlc3NDYWxsYmFjayIsIj9mYWlsdXJlQ2FsbGJhY2siXV19LHsibmFtZSI6InNldFJlbW90ZURlc2NyaXB0aW9uIiwic2lnbmF0dXJlcyI6W1siZGVzY3JpcHRpb24iLCI/c3VjY2Vzc0NhbGxiYWNrIiwiP2ZhaWx1cmVDYWxsYmFjayJdXX0seyJuYW1lIjoiYWRkSWNlQ2FuZGlkYXRlIiwic2lnbmF0dXJlcyI6W1siY2FuZGlkYXRlIiwiP3N1Y2Nlc3NDYWxsYmFjayIsIj9mYWlsdXJlQ2FsbGJhY2siXV19LHsibmFtZSI6InNldENvbmZpZ3VyYXRpb24iLCJzaWduYXR1cmVzIjpbWyJjb25maWd1cmF0aW9uIl1dfSx7Im5hbWUiOiJnZXRTdGF0cyIsInNpZ25hdHVyZXMiOltbIj9jYWxsYmFja09yU2VsZWN0b3IiXSxbInN1Y2Nlc3NDYWxsYmFjayIsInNlbGVjdG9yIl1dLCJyZWNlaXZlciI6IlJUQ1BlZXJDb25uZWN0aW9uIn0seyJuYW1lIjoiY3JlYXRlRGF0YUNoYW5uZWwiLCJzaWduYXR1cmVzIjpbWyJsYWJlbCIsIj9kYXRhQ2hhbm5lbERpY3QiXV19LHsibmFtZSI6ImdlbmVyYXRlQ2VydGlmaWNhdGUiLCJzaWduYXR1cmVzIjpbWyJrZXlnZW5BbGdvcml0aG0iXV19LHsibmFtZSI6ImFkZFN0cmVhbSIsInNpZ25hdHVyZXMiOltbInN0cmVhbSIsIj9tZWRpYUNvbnN0cmFpbnRzIl1dfSx7Im5hbWUiOiJyZW1vdmVTdHJlYW0iLCJzaWduYXR1cmVzIjpbWyJzdHJlYW0iXV19LHsibmFtZSI6ImNyZWF0ZURUTUZTZW5kZXIiLCJzaWduYXR1cmVzIjpbWyJ0cmFjayJdXX0seyJuYW1lIjoic2V0UGFyYW1ldGVycyIsInNpZ25hdHVyZXMiOltbIj9wYXJhbWV0ZXJzIl1dfSx7Im5hbWUiOiJyZXBsYWNlVHJhY2siLCJzaWduYXR1cmVzIjpbWyJ3aXRoVHJhY2siXV19LHsibmFtZSI6InJldm9rZSIsInNpZ25hdHVyZXMiOltbInBlcm1pc3Npb24iXV19LHsibmFtZSI6InJlcXVlc3RBbGwiLCJzaWduYXR1cmVzIjpbWyJwZXJtaXNzaW9ucyJdXX0seyJuYW1lIjoicmVmcmVzaCIsInNpZ25hdHVyZXMiOltbIj9yZWxvYWQiXV19LHsibmFtZSI6IlByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJQcmVzZW50YXRpb25SZXF1ZXN0Iiwic2lnbmF0dXJlcyI6W1sidXJsIl1dfSx7Im5hbWUiOiJyZWNvbm5lY3QiLCJzaWduYXR1cmVzIjpbWyJpZCJdXX0seyJuYW1lIjoiUHVzaEV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9ldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJxdWVyeVVzYWdlQW5kUXVvdGEiLCJzaWduYXR1cmVzIjpbWyJzdG9yYWdlVHlwZSIsIj91c2FnZUNhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siXV0sInJlY2VpdmVyIjoiRGVwcmVjYXRlZFN0b3JhZ2VJbmZvIn0seyJuYW1lIjoicXVlcnlVc2FnZUFuZFF1b3RhIiwic2lnbmF0dXJlcyI6W1sidXNhZ2VDYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dLCJyZWNlaXZlciI6IkRlcHJlY2F0ZWRTdG9yYWdlUXVvdGEifSx7Im5hbWUiOiJyZXF1ZXN0UXVvdGEiLCJzaWduYXR1cmVzIjpbWyJzdG9yYWdlVHlwZSIsIm5ld1F1b3RhSW5CeXRlcyIsIj9xdW90YUNhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siXV0sInJlY2VpdmVyIjoiRGVwcmVjYXRlZFN0b3JhZ2VJbmZvIn0seyJuYW1lIjoicmVxdWVzdFF1b3RhIiwic2lnbmF0dXJlcyI6W1sibmV3UXVvdGFJbkJ5dGVzIiwiP3F1b3RhQ2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayJdXSwicmVjZWl2ZXIiOiJEZXByZWNhdGVkU3RvcmFnZVF1b3RhIn0seyJuYW1lIjoid2F0Y2hBdmFpbGFiaWxpdHkiLCJzaWduYXR1cmVzIjpbWyJjYWxsYmFjayJdXX0seyJuYW1lIjoiY2FuY2VsV2F0Y2hBdmFpbGFiaWxpdHkiLCJzaWduYXR1cmVzIjpbWyI/aWQiXV19LHsibmFtZSI6IkFic29sdXRlT3JpZW50YXRpb25TZW5zb3IiLCJzaWduYXR1cmVzIjpbWyI/c2Vuc29yT3B0aW9ucyJdXX0seyJuYW1lIjoiQWNjZWxlcm9tZXRlciIsInNpZ25hdHVyZXMiOltbIj9zZW5zb3JPcHRpb25zIl1dfSx7Im5hbWUiOiJBbWJpZW50TGlnaHRTZW5zb3IiLCJzaWduYXR1cmVzIjpbWyI/c2Vuc29yT3B0aW9ucyJdXX0seyJuYW1lIjoiR3lyb3Njb3BlIiwic2lnbmF0dXJlcyI6W1siP3NlbnNvck9wdGlvbnMiXV19LHsibmFtZSI6IkxpbmVhckFjY2VsZXJhdGlvblNlbnNvciIsInNpZ25hdHVyZXMiOltbIj9zZW5zb3JPcHRpb25zIl1dfSx7Im5hbWUiOiJwb3B1bGF0ZU1hdHJpeCIsInNpZ25hdHVyZXMiOltbInRhcmdldEJ1ZmZlciJdXX0seyJuYW1lIjoiUmVsYXRpdmVPcmllbnRhdGlvblNlbnNvciIsInNpZ25hdHVyZXMiOltbIj9zZW5zb3JPcHRpb25zIl1dfSx7Im5hbWUiOiJTZW5zb3JFcnJvckV2ZW50Iiwic2lnbmF0dXJlcyI6W1sidHlwZSIsImV2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6IkV4dGVuZGFibGVFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoid2FpdFVudGlsIiwic2lnbmF0dXJlcyI6W1siZiJdXX0seyJuYW1lIjoiRmV0Y2hFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCJldmVudEluaXREaWN0Il1dfSx7Im5hbWUiOiJJbnN0YWxsRXZlbnQiLCJzaWduYXR1cmVzIjpbWyJ0eXBlIiwiP2V2ZW50SW5pdERpY3QiXV19LHsibmFtZSI6ImVuYWJsZSIsInNpZ25hdHVyZXMiOltbImNhcCJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoiZGlzYWJsZSIsInNpZ25hdHVyZXMiOltbImNhcCJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoic2V0SGVhZGVyVmFsdWUiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSJdXX0seyJuYW1lIjoiZ2V0UmVnaXN0cmF0aW9uIiwic2lnbmF0dXJlcyI6W1siP2RvY3VtZW50VVJMIl1dfSx7Im5hbWUiOiJuYXZpZ2F0ZSIsInNpZ25hdHVyZXMiOltbInVybCJdXX0seyJuYW1lIjoiZGV0ZWN0Iiwic2lnbmF0dXJlcyI6W1siaW1hZ2UiXV19LHsibmFtZSI6IkZhY2VEZXRlY3RvciIsInNpZ25hdHVyZXMiOltbIj9mYWNlRGV0ZWN0b3JPcHRpb25zIl1dfSx7Im5hbWUiOiJhZGRGcm9tVXJpIiwic2lnbmF0dXJlcyI6W1sic3JjIiwiP3dlaWdodCJdXX0seyJuYW1lIjoiYWRkRnJvbVN0cmluZyIsInNpZ25hdHVyZXMiOltbInN0cmluZyIsIj93ZWlnaHQiXV19LHsibmFtZSI6InNwZWFrIiwic2lnbmF0dXJlcyI6W1sidXR0ZXJhbmNlIl1dfSx7Im5hbWUiOiJpbml0U3RvcmFnZUV2ZW50Iiwic2lnbmF0dXJlcyI6W1siP3R5cGVBcmciLCI/Y2FuQnViYmxlQXJnIiwiP2NhbmNlbGFibGVBcmciLCI/a2V5QXJnIiwiP29sZFZhbHVlQXJnIiwiP25ld1ZhbHVlQXJnIiwiP3VybEFyZyIsIj9zdG9yYWdlQXJlYUFyZyJdXX0seyJuYW1lIjoia2V5Iiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV19LHsibmFtZSI6InNldEl0ZW0iLCJzaWduYXR1cmVzIjpbWyJrZXkiLCJ2YWx1ZSJdXX0seyJuYW1lIjoidmlicmF0ZSIsInNpZ25hdHVyZXMiOltbInBhdHRlcm4iXV19LHsibmFtZSI6ImdldEZyYW1lRGF0YSIsInNpZ25hdHVyZXMiOltbImZyYW1lRGF0YSJdXX0seyJuYW1lIjoiZ2V0RXllUGFyYW1ldGVycyIsInNpZ25hdHVyZXMiOltbIndoaWNoRXllIl1dfSx7Im5hbWUiOiJyZXF1ZXN0UHJlc2VudCIsInNpZ25hdHVyZXMiOltbImxheWVycyJdXX0seyJuYW1lIjoiZ2V0RmxvYXRGcmVxdWVuY3lEYXRhIiwic2lnbmF0dXJlcyI6W1siYXJyYXkiXV19LHsibmFtZSI6ImdldEJ5dGVGcmVxdWVuY3lEYXRhIiwic2lnbmF0dXJlcyI6W1siYXJyYXkiXV19LHsibmFtZSI6ImdldEZsb2F0VGltZURvbWFpbkRhdGEiLCJzaWduYXR1cmVzIjpbWyJhcnJheSJdXX0seyJuYW1lIjoiZ2V0Qnl0ZVRpbWVEb21haW5EYXRhIiwic2lnbmF0dXJlcyI6W1siYXJyYXkiXV19LHsibmFtZSI6ImdldENoYW5uZWxEYXRhIiwic2lnbmF0dXJlcyI6W1siY2hhbm5lbEluZGV4Il1dfSx7Im5hbWUiOiJjb3B5RnJvbUNoYW5uZWwiLCJzaWduYXR1cmVzIjpbWyJkZXN0aW5hdGlvbiIsImNoYW5uZWxOdW1iZXIiLCI/c3RhcnRJbkNoYW5uZWwiXV19LHsibmFtZSI6ImNvcHlUb0NoYW5uZWwiLCJzaWduYXR1cmVzIjpbWyJzb3VyY2UiLCJjaGFubmVsTnVtYmVyIiwiP3N0YXJ0SW5DaGFubmVsIl1dfSx7Im5hbWUiOiJzdXNwZW5kIiwic2lnbmF0dXJlcyI6W1sic3VzcGVuZFRpbWUiXV0sInJlY2VpdmVyIjoiT2ZmbGluZUF1ZGlvQ29udGV4dCJ9LHsibmFtZSI6InNldE9yaWVudGF0aW9uIiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJ6IiwieFVwIiwieVVwIiwielVwIl1dLCJyZWNlaXZlciI6IkF1ZGlvTGlzdGVuZXIifSx7Im5hbWUiOiJzZXRPcmllbnRhdGlvbiIsInNpZ25hdHVyZXMiOltbIngiLCJ5IiwieiJdXSwicmVjZWl2ZXIiOiJQYW5uZXJOb2RlIn0seyJuYW1lIjoic2V0VmFsdWVBdFRpbWUiLCJzaWduYXR1cmVzIjpbWyJ2YWx1ZSIsInRpbWUiXV19LHsibmFtZSI6ImxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCJ0aW1lIl1dfSx7Im5hbWUiOiJleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCJ0aW1lIl1dfSx7Im5hbWUiOiJzZXRUYXJnZXRBdFRpbWUiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJ0aW1lIiwidGltZUNvbnN0YW50Il1dfSx7Im5hbWUiOiJzZXRWYWx1ZUN1cnZlQXRUaW1lIiwic2lnbmF0dXJlcyI6W1sidmFsdWVzIiwidGltZSIsImR1cmF0aW9uIl1dfSx7Im5hbWUiOiJjYW5jZWxTY2hlZHVsZWRWYWx1ZXMiLCJzaWduYXR1cmVzIjpbWyJzdGFydFRpbWUiXV19LHsibmFtZSI6ImNhbmNlbEFuZEhvbGRBdFRpbWUiLCJzaWduYXR1cmVzIjpbWyJzdGFydFRpbWUiXV19LHsibmFtZSI6InJlZ2lzdGVyUHJvY2Vzc29yIiwic2lnbmF0dXJlcyI6W1sibmFtZSIsInByb2Nlc3NvckNvbnN0cnVjdG9yIl1dfSx7Im5hbWUiOiJjcmVhdGVCdWZmZXIiLCJzaWduYXR1cmVzIjpbWyJudW1iZXJPZkNoYW5uZWxzIiwibnVtYmVyT2ZGcmFtZXMiLCJzYW1wbGVSYXRlIl1dLCJyZWNlaXZlciI6IkJhc2VBdWRpb0NvbnRleHQifSx7Im5hbWUiOiJkZWNvZGVBdWRpb0RhdGEiLCJzaWduYXR1cmVzIjpbWyJhdWRpb0RhdGEiLCI/c3VjY2Vzc0NhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siXV19LHsibmFtZSI6ImNyZWF0ZURlbGF5Iiwic2lnbmF0dXJlcyI6W1siP21heERlbGF5VGltZSJdXX0seyJuYW1lIjoiY3JlYXRlSUlSRmlsdGVyIiwic2lnbmF0dXJlcyI6W1siZmVlZEZvcndhcmQiLCJmZWVkQmFjayJdXX0seyJuYW1lIjoiY3JlYXRlU2NyaXB0UHJvY2Vzc29yIiwic2lnbmF0dXJlcyI6W1siP2J1ZmZlclNpemUiLCI/bnVtYmVyT2ZJbnB1dENoYW5uZWxzIiwiP251bWJlck9mT3V0cHV0Q2hhbm5lbHMiXV19LHsibmFtZSI6ImNyZWF0ZVBlcmlvZGljV2F2ZSIsInNpZ25hdHVyZXMiOltbInJlYWwiLCJpbWFnIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImNyZWF0ZUNoYW5uZWxTcGxpdHRlciIsInNpZ25hdHVyZXMiOltbIj9udW1iZXJPZk91dHB1dHMiXV19LHsibmFtZSI6ImNyZWF0ZUNoYW5uZWxNZXJnZXIiLCJzaWduYXR1cmVzIjpbWyI/bnVtYmVyT2ZJbnB1dHMiXV19LHsibmFtZSI6ImNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSIsInNpZ25hdHVyZXMiOltbIm1lZGlhRWxlbWVudCJdXX0seyJuYW1lIjoiY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UiLCJzaWduYXR1cmVzIjpbWyJtZWRpYVN0cmVhbSJdXX0seyJuYW1lIjoiZ2V0RnJlcXVlbmN5UmVzcG9uc2UiLCJzaWduYXR1cmVzIjpbWyJmcmVxdWVuY3lIeiIsIm1hZ1Jlc3BvbnNlIiwicGhhc2VSZXNwb25zZSJdXX0seyJuYW1lIjoic2V0UGVyaW9kaWNXYXZlIiwic2lnbmF0dXJlcyI6W1sicGVyaW9kaWNXYXZlIl1dfSx7Im5hbWUiOiJjaGFuZ2VWZXJzaW9uIiwic2lnbmF0dXJlcyI6W1sib2xkVmVyc2lvbiIsIm5ld1ZlcnNpb24iLCI/Y2FsbGJhY2siLCI/ZXJyb3JDYWxsYmFjayIsIj9zdWNjZXNzQ2FsbGJhY2siXV19LHsibmFtZSI6InJlYWRUcmFuc2FjdGlvbiIsInNpZ25hdHVyZXMiOltbImNhbGxiYWNrIiwiP2Vycm9yQ2FsbGJhY2siLCI/c3VjY2Vzc0NhbGxiYWNrIl1dfSx7Im5hbWUiOiJleGVjdXRlU3FsIiwic2lnbmF0dXJlcyI6W1sic3FsU3RhdGVtZW50IiwiP2FyZ3VtZW50cyIsIj9jYWxsYmFjayIsIj9lcnJvckNhbGxiYWNrIl1dfSx7Im5hbWUiOiJvcGVuRGF0YWJhc2UiLCJzaWduYXR1cmVzIjpbWyJuYW1lIiwidmVyc2lvbiIsImRpc3BsYXlOYW1lIiwiZXN0aW1hdGVkU2l6ZSIsIj9jcmVhdGlvbkNhbGxiYWNrIl1dfSx7Im5hbWUiOiJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLCJzaWduYXR1cmVzIjpbWyJtb2RlIiwiZmlyc3QiLCJjb3VudCIsInByaW1jb3VudCJdXX0seyJuYW1lIjoiZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLCJzaWduYXR1cmVzIjpbWyJtb2RlIiwiY291bnQiLCJ0eXBlIiwib2Zmc2V0IiwicHJpbWNvdW50Il1dfSx7Im5hbWUiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsImRpdmlzb3IiXV19LHsibmFtZSI6InF1ZXJ5Q291bnRlckVYVCIsInNpZ25hdHVyZXMiOltbInF1ZXJ5IiwidGFyZ2V0Il1dfSx7Im5hbWUiOiJkZWxldGVRdWVyeUVYVCIsInNpZ25hdHVyZXMiOltbInF1ZXJ5Il1dfSx7Im5hbWUiOiJpc1F1ZXJ5RVhUIiwic2lnbmF0dXJlcyI6W1sicXVlcnkiXV19LHsibmFtZSI6ImJlZ2luUXVlcnlFWFQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJxdWVyeSJdXX0seyJuYW1lIjoiZW5kUXVlcnlFWFQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiXV19LHsibmFtZSI6ImdldFF1ZXJ5RVhUIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwicG5hbWUiXV19LHsibmFtZSI6ImdldFF1ZXJ5T2JqZWN0RVhUIiwic2lnbmF0dXJlcyI6W1sicXVlcnkiLCJwbmFtZSJdXX0seyJuYW1lIjoiZGVsZXRlVmVydGV4QXJyYXlPRVMiLCJzaWduYXR1cmVzIjpbWyI/YXJyYXlPYmplY3QiXV19LHsibmFtZSI6ImlzVmVydGV4QXJyYXlPRVMiLCJzaWduYXR1cmVzIjpbWyI/YXJyYXlPYmplY3QiXV19LHsibmFtZSI6ImJpbmRWZXJ0ZXhBcnJheU9FUyIsInNpZ25hdHVyZXMiOltbIj9hcnJheU9iamVjdCJdXX0seyJuYW1lIjoiZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSIsInNpZ25hdHVyZXMiOltbInNoYWRlciJdXX0seyJuYW1lIjoiZHJhd0J1ZmZlcnNXRUJHTCIsInNpZ25hdHVyZXMiOltbImJ1ZmZlcnMiXV19LHsibmFtZSI6ImdldEJ1ZmZlclN1YkRhdGFBc3luYyIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInNyY0J5dGVPZmZzZXQiLCJkc3REYXRhIiwiP2RzdE9mZnNldCIsIj9sZW5ndGgiXV19LHsibmFtZSI6ImFjdGl2ZVRleHR1cmUiLCJzaWduYXR1cmVzIjpbWyJ0ZXh0dXJlIl1dfSx7Im5hbWUiOiJhdHRhY2hTaGFkZXIiLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIiwic2hhZGVyIl1dfSx7Im5hbWUiOiJiaW5kQXR0cmliTG9jYXRpb24iLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIiwiaW5kZXgiLCJuYW1lIl1dfSx7Im5hbWUiOiJiaW5kQnVmZmVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiYnVmZmVyIl1dfSx7Im5hbWUiOiJiaW5kRnJhbWVidWZmZXIiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJmcmFtZWJ1ZmZlciJdXX0seyJuYW1lIjoiYmluZFJlbmRlcmJ1ZmZlciIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInJlbmRlcmJ1ZmZlciJdXX0seyJuYW1lIjoiYmluZFRleHR1cmUiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJ0ZXh0dXJlIl1dfSx7Im5hbWUiOiJibGVuZENvbG9yIiwic2lnbmF0dXJlcyI6W1sicmVkIiwiZ3JlZW4iLCJibHVlIiwiYWxwaGEiXV19LHsibmFtZSI6ImJsZW5kRXF1YXRpb24iLCJzaWduYXR1cmVzIjpbWyJtb2RlIl1dfSx7Im5hbWUiOiJibGVuZEVxdWF0aW9uU2VwYXJhdGUiLCJzaWduYXR1cmVzIjpbWyJtb2RlUkdCIiwibW9kZUFscGhhIl1dfSx7Im5hbWUiOiJibGVuZEZ1bmMiLCJzaWduYXR1cmVzIjpbWyJzZmFjdG9yIiwiZGZhY3RvciJdXX0seyJuYW1lIjoiYmxlbmRGdW5jU2VwYXJhdGUiLCJzaWduYXR1cmVzIjpbWyJzcmNSR0IiLCJkc3RSR0IiLCJzcmNBbHBoYSIsImRzdEFscGhhIl1dfSx7Im5hbWUiOiJidWZmZXJEYXRhIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0Iiwic2l6ZSIsInVzYWdlIl0sWyJ0YXJnZXQiLCJkYXRhIiwidXNhZ2UiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6ImJ1ZmZlckRhdGEiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJzcmNEYXRhIiwidXNhZ2UiLCJzcmNPZmZzZXQiLCI/bGVuZ3RoIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoiYnVmZmVyU3ViRGF0YSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsIm9mZnNldCIsImRhdGEiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6ImJ1ZmZlclN1YkRhdGEiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJkc3RCeXRlT2Zmc2V0Iiwic3JjRGF0YSIsInNyY09mZnNldCIsIj9sZW5ndGgiXV0sInJlY2VpdmVyIjoiV2ViR0wyUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJjaGVja0ZyYW1lYnVmZmVyU3RhdHVzIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0Il1dfSx7Im5hbWUiOiJjbGVhckNvbG9yIiwic2lnbmF0dXJlcyI6W1sicmVkIiwiZ3JlZW4iLCJibHVlIiwiYWxwaGEiXV19LHsibmFtZSI6ImNsZWFyRGVwdGgiLCJzaWduYXR1cmVzIjpbWyJkZXB0aCJdXX0seyJuYW1lIjoiY2xlYXJTdGVuY2lsIiwic2lnbmF0dXJlcyI6W1sicyJdXX0seyJuYW1lIjoiY29sb3JNYXNrIiwic2lnbmF0dXJlcyI6W1sicmVkIiwiZ3JlZW4iLCJibHVlIiwiYWxwaGEiXV19LHsibmFtZSI6ImNvbXBpbGVTaGFkZXIiLCJzaWduYXR1cmVzIjpbWyJzaGFkZXIiXV19LHsibmFtZSI6ImNvbXByZXNzZWRUZXhJbWFnZTJEIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwibGV2ZWwiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0IiwiYm9yZGVyIiwiZGF0YSJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoiY29tcHJlc3NlZFRleEltYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJpbWFnZVNpemUiLCJvZmZzZXQiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciIsImRhdGEiLCJzcmNPZmZzZXQiLCI/c3JjTGVuZ3RoT3ZlcnJpZGUiXV0sInJlY2VpdmVyIjoiV2ViR0wyUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsImRhdGEiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6ImNvbXByZXNzZWRUZXhTdWJJbWFnZTJEIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwibGV2ZWwiLCJ4b2Zmc2V0IiwieW9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZm9ybWF0IiwiaW1hZ2VTaXplIiwib2Zmc2V0Il0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJmb3JtYXQiLCJkYXRhIiwic3JjT2Zmc2V0IiwiP3NyY0xlbmd0aE92ZXJyaWRlIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoiY29weVRleEltYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0IiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciJdXX0seyJuYW1lIjoiY29weVRleFN1YkltYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoiY3JlYXRlU2hhZGVyIiwic2lnbmF0dXJlcyI6W1sidHlwZSJdXX0seyJuYW1lIjoiY3VsbEZhY2UiLCJzaWduYXR1cmVzIjpbWyJtb2RlIl1dfSx7Im5hbWUiOiJkZWxldGVCdWZmZXIiLCJzaWduYXR1cmVzIjpbWyJidWZmZXIiXV19LHsibmFtZSI6ImRlbGV0ZUZyYW1lYnVmZmVyIiwic2lnbmF0dXJlcyI6W1siZnJhbWVidWZmZXIiXV19LHsibmFtZSI6ImRlbGV0ZVByb2dyYW0iLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIl1dfSx7Im5hbWUiOiJkZWxldGVSZW5kZXJidWZmZXIiLCJzaWduYXR1cmVzIjpbWyJyZW5kZXJidWZmZXIiXV19LHsibmFtZSI6ImRlbGV0ZVNoYWRlciIsInNpZ25hdHVyZXMiOltbInNoYWRlciJdXX0seyJuYW1lIjoiZGVsZXRlVGV4dHVyZSIsInNpZ25hdHVyZXMiOltbInRleHR1cmUiXV19LHsibmFtZSI6ImRlcHRoRnVuYyIsInNpZ25hdHVyZXMiOltbImZ1bmMiXV19LHsibmFtZSI6ImRlcHRoTWFzayIsInNpZ25hdHVyZXMiOltbImZsYWciXV19LHsibmFtZSI6ImRlcHRoUmFuZ2UiLCJzaWduYXR1cmVzIjpbWyJ6TmVhciIsInpGYXIiXV19LHsibmFtZSI6ImRldGFjaFNoYWRlciIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iLCJzaGFkZXIiXV19LHsibmFtZSI6ImRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSIsInNpZ25hdHVyZXMiOltbImluZGV4Il1dfSx7Im5hbWUiOiJkcmF3QXJyYXlzIiwic2lnbmF0dXJlcyI6W1sibW9kZSIsImZpcnN0IiwiY291bnQiXV19LHsibmFtZSI6ImRyYXdFbGVtZW50cyIsInNpZ25hdHVyZXMiOltbIm1vZGUiLCJjb3VudCIsInR5cGUiLCJvZmZzZXQiXV19LHsibmFtZSI6ImVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iiwic2lnbmF0dXJlcyI6W1siaW5kZXgiXV19LHsibmFtZSI6ImZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiYXR0YWNobWVudCIsInJlbmRlcmJ1ZmZlcnRhcmdldCIsInJlbmRlcmJ1ZmZlciJdXX0seyJuYW1lIjoiZnJhbWVidWZmZXJUZXh0dXJlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJhdHRhY2htZW50IiwidGV4dGFyZ2V0IiwidGV4dHVyZSIsImxldmVsIl1dfSx7Im5hbWUiOiJmcm9udEZhY2UiLCJzaWduYXR1cmVzIjpbWyJtb2RlIl1dfSx7Im5hbWUiOiJnZW5lcmF0ZU1pcG1hcCIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXX0seyJuYW1lIjoiZ2V0QWN0aXZlQXR0cmliIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsImluZGV4Il1dfSx7Im5hbWUiOiJnZXRBY3RpdmVVbmlmb3JtIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsImluZGV4Il1dfSx7Im5hbWUiOiJnZXRBdHRhY2hlZFNoYWRlcnMiLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIl1dfSx7Im5hbWUiOiJnZXRBdHRyaWJMb2NhdGlvbiIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iLCJuYW1lIl1dfSx7Im5hbWUiOiJnZXRCdWZmZXJQYXJhbWV0ZXIiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJwbmFtZSJdXX0seyJuYW1lIjoiZ2V0RXh0ZW5zaW9uIiwic2lnbmF0dXJlcyI6W1sibmFtZSJdXX0seyJuYW1lIjoiZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiYXR0YWNobWVudCIsInBuYW1lIl1dfSx7Im5hbWUiOiJnZXRQcm9ncmFtUGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsInBuYW1lIl1dfSx7Im5hbWUiOiJnZXRQcm9ncmFtSW5mb0xvZyIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iXV19LHsibmFtZSI6ImdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInBuYW1lIl1dfSx7Im5hbWUiOiJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJzaWduYXR1cmVzIjpbWyJzaGFkZXIiLCJwbmFtZSJdXX0seyJuYW1lIjoiZ2V0U2hhZGVySW5mb0xvZyIsInNpZ25hdHVyZXMiOltbInNoYWRlciJdXX0seyJuYW1lIjoiZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0Iiwic2lnbmF0dXJlcyI6W1sic2hhZGVydHlwZSIsInByZWNpc2lvbnR5cGUiXV19LHsibmFtZSI6ImdldFNoYWRlclNvdXJjZSIsInNpZ25hdHVyZXMiOltbInNoYWRlciJdXX0seyJuYW1lIjoiZ2V0VGV4UGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwicG5hbWUiXV19LHsibmFtZSI6ImdldFVuaWZvcm0iLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIiwibG9jYXRpb24iXV19LHsibmFtZSI6ImdldFVuaWZvcm1Mb2NhdGlvbiIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iLCJuYW1lIl1dfSx7Im5hbWUiOiJnZXRWZXJ0ZXhBdHRyaWIiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsInBuYW1lIl1dfSx7Im5hbWUiOiJnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsInBuYW1lIl1dfSx7Im5hbWUiOiJoaW50Iiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwibW9kZSJdXX0seyJuYW1lIjoiaXNCdWZmZXIiLCJzaWduYXR1cmVzIjpbWyJidWZmZXIiXV19LHsibmFtZSI6ImlzRW5hYmxlZCIsInNpZ25hdHVyZXMiOltbImNhcCJdXX0seyJuYW1lIjoiaXNGcmFtZWJ1ZmZlciIsInNpZ25hdHVyZXMiOltbImZyYW1lYnVmZmVyIl1dfSx7Im5hbWUiOiJpc1Byb2dyYW0iLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIl1dfSx7Im5hbWUiOiJpc1JlbmRlcmJ1ZmZlciIsInNpZ25hdHVyZXMiOltbInJlbmRlcmJ1ZmZlciJdXX0seyJuYW1lIjoiaXNTaGFkZXIiLCJzaWduYXR1cmVzIjpbWyJzaGFkZXIiXV19LHsibmFtZSI6ImlzVGV4dHVyZSIsInNpZ25hdHVyZXMiOltbInRleHR1cmUiXV19LHsibmFtZSI6ImxpbmVXaWR0aCIsInNpZ25hdHVyZXMiOltbIndpZHRoIl1dfSx7Im5hbWUiOiJsaW5rUHJvZ3JhbSIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iXV19LHsibmFtZSI6InBpeGVsU3RvcmVpIiwic2lnbmF0dXJlcyI6W1sicG5hbWUiLCJwYXJhbSJdXX0seyJuYW1lIjoicG9seWdvbk9mZnNldCIsInNpZ25hdHVyZXMiOltbImZhY3RvciIsInVuaXRzIl1dfSx7Im5hbWUiOiJyZWFkUGl4ZWxzIiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsInR5cGUiLCJwaXhlbHMiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InJlYWRQaXhlbHMiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiZm9ybWF0IiwidHlwZSIsIm9mZnNldCJdLFsieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsInR5cGUiLCJkc3REYXRhIiwib2Zmc2V0Il1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoicmVuZGVyYnVmZmVyU3RvcmFnZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiXV19LHsibmFtZSI6InNhbXBsZUNvdmVyYWdlIiwic2lnbmF0dXJlcyI6W1sidmFsdWUiLCJpbnZlcnQiXV19LHsibmFtZSI6InNjaXNzb3IiLCJzaWduYXR1cmVzIjpbWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il1dfSx7Im5hbWUiOiJzaGFkZXJTb3VyY2UiLCJzaWduYXR1cmVzIjpbWyJzaGFkZXIiLCJzdHJpbmciXV19LHsibmFtZSI6InN0ZW5jaWxGdW5jIiwic2lnbmF0dXJlcyI6W1siZnVuYyIsInJlZiIsIm1hc2siXV19LHsibmFtZSI6InN0ZW5jaWxGdW5jU2VwYXJhdGUiLCJzaWduYXR1cmVzIjpbWyJmYWNlIiwiZnVuYyIsInJlZiIsIm1hc2siXV19LHsibmFtZSI6InN0ZW5jaWxNYXNrIiwic2lnbmF0dXJlcyI6W1sibWFzayJdXX0seyJuYW1lIjoic3RlbmNpbE1hc2tTZXBhcmF0ZSIsInNpZ25hdHVyZXMiOltbImZhY2UiLCJtYXNrIl1dfSx7Im5hbWUiOiJzdGVuY2lsT3AiLCJzaWduYXR1cmVzIjpbWyJmYWlsIiwiemZhaWwiLCJ6cGFzcyJdXX0seyJuYW1lIjoic3RlbmNpbE9wU2VwYXJhdGUiLCJzaWduYXR1cmVzIjpbWyJmYWNlIiwiZmFpbCIsInpmYWlsIiwienBhc3MiXV19LHsibmFtZSI6InRleFBhcmFtZXRlcmYiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJwbmFtZSIsInBhcmFtIl1dfSx7Im5hbWUiOiJ0ZXhQYXJhbWV0ZXJpIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwicG5hbWUiLCJwYXJhbSJdXX0seyJuYW1lIjoidGV4SW1hZ2UyRCIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJmb3JtYXQiLCJ0eXBlIiwicGl4ZWxzIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0IiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0IiwiZm9ybWF0IiwidHlwZSIsImNhbnZhcyJdLFsidGFyZ2V0IiwibGV2ZWwiLCJpbnRlcm5hbGZvcm1hdCIsImZvcm1hdCIsInR5cGUiLCJ2aWRlbyJdLFsidGFyZ2V0IiwibGV2ZWwiLCJpbnRlcm5hbGZvcm1hdCIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJwaXhlbHMiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InRleEltYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJmb3JtYXQiLCJ0eXBlIiwib2Zmc2V0Il0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJmb3JtYXQiLCJ0eXBlIiwiZGF0YSJdLFsidGFyZ2V0IiwibGV2ZWwiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0IiwiYm9yZGVyIiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJmb3JtYXQiLCJ0eXBlIiwiY2FudmFzIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJmb3JtYXQiLCJ0eXBlIiwidmlkZW8iXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJzcmNEYXRhIiwic3JjT2Zmc2V0Il1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidGV4U3ViSW1hZ2UyRCIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJmb3JtYXQiLCJ0eXBlIiwicGl4ZWxzIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwiZm9ybWF0IiwidHlwZSIsImNhbnZhcyJdLFsidGFyZ2V0IiwibGV2ZWwiLCJ4b2Zmc2V0IiwieW9mZnNldCIsImZvcm1hdCIsInR5cGUiLCJ2aWRlbyJdLFsidGFyZ2V0IiwibGV2ZWwiLCJ4b2Zmc2V0IiwieW9mZnNldCIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsInR5cGUiLCJwaXhlbHMiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InRleFN1YkltYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJmb3JtYXQiLCJ0eXBlIiwib2Zmc2V0Il0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJmb3JtYXQiLCJ0eXBlIiwiZGF0YSJdLFsidGFyZ2V0IiwibGV2ZWwiLCJ4b2Zmc2V0IiwieW9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJmb3JtYXQiLCJ0eXBlIiwiY2FudmFzIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJmb3JtYXQiLCJ0eXBlIiwidmlkZW8iXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCIsInR5cGUiLCJzcmNEYXRhIiwic3JjT2Zmc2V0Il1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTFmIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ4Il1dfSx7Im5hbWUiOiJ1bmlmb3JtMWZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Il1dLCJyZWNlaXZlciI6IldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtMWZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Iiwic3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXSwicmVjZWl2ZXIiOiJXZWJHTDJSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm0xaSIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwieCJdXX0seyJuYW1lIjoidW5pZm9ybTFpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTFpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsInNyY09mZnNldCIsIj9zcmNMZW5ndGgiXV0sInJlY2VpdmVyIjoiV2ViR0wyUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtMmYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsIngiLCJ5Il1dfSx7Im5hbWUiOiJ1bmlmb3JtMmZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Il1dLCJyZWNlaXZlciI6IldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtMmZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Iiwic3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXSwicmVjZWl2ZXIiOiJXZWJHTDJSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm0yaSIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwieCIsInkiXV19LHsibmFtZSI6InVuaWZvcm0yaXYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm0yaXYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiLCJzcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTNmIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ4IiwieSIsInoiXV19LHsibmFtZSI6InVuaWZvcm0zZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm0zZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiLCJzcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTNpIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ4IiwieSIsInoiXV19LHsibmFtZSI6InVuaWZvcm0zaXYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm0zaXYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYiLCJzcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTRmIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ4IiwieSIsInoiLCJ3Il1dfSx7Im5hbWUiOiJ1bmlmb3JtNGZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Il1dLCJyZWNlaXZlciI6IldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtNGZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2Iiwic3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXSwicmVjZWl2ZXIiOiJXZWJHTDJSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm00aSIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwieCIsInkiLCJ6IiwidyJdXX0seyJuYW1lIjoidW5pZm9ybTRpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybTRpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsInNyY09mZnNldCIsIj9zcmNMZW5ndGgiXV0sInJlY2VpdmVyIjoiV2ViR0wyUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtTWF0cml4MmZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ0cmFuc3Bvc2UiLCJhcnJheSJdXSwicmVjZWl2ZXIiOiJXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybU1hdHJpeDJmdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidHJhbnNwb3NlIiwiYXJyYXkiLCJzcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dLCJyZWNlaXZlciI6IldlYkdMMlJlbmRlcmluZ0NvbnRleHRCYXNlIn0seyJuYW1lIjoidW5pZm9ybU1hdHJpeDNmdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidHJhbnNwb3NlIiwiYXJyYXkiXV0sInJlY2VpdmVyIjoiV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm1NYXRyaXgzZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInRyYW5zcG9zZSIsImFycmF5Iiwic3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXSwicmVjZWl2ZXIiOiJXZWJHTDJSZW5kZXJpbmdDb250ZXh0QmFzZSJ9LHsibmFtZSI6InVuaWZvcm1NYXRyaXg0ZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInRyYW5zcG9zZSIsImFycmF5Il1dLCJyZWNlaXZlciI6IldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1bmlmb3JtTWF0cml4NGZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ0cmFuc3Bvc2UiLCJhcnJheSIsInNyY09mZnNldCIsIj9zcmNMZW5ndGgiXV0sInJlY2VpdmVyIjoiV2ViR0wyUmVuZGVyaW5nQ29udGV4dEJhc2UifSx7Im5hbWUiOiJ1c2VQcm9ncmFtIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSJdXX0seyJuYW1lIjoidmFsaWRhdGVQcm9ncmFtIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliMWYiLCJzaWduYXR1cmVzIjpbWyJpbmR4IiwieCJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliMWZ2Iiwic2lnbmF0dXJlcyI6W1siaW5keCIsInZhbHVlcyJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliMmYiLCJzaWduYXR1cmVzIjpbWyJpbmR4IiwieCIsInkiXV19LHsibmFtZSI6InZlcnRleEF0dHJpYjJmdiIsInNpZ25hdHVyZXMiOltbImluZHgiLCJ2YWx1ZXMiXV19LHsibmFtZSI6InZlcnRleEF0dHJpYjNmIiwic2lnbmF0dXJlcyI6W1siaW5keCIsIngiLCJ5IiwieiJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliM2Z2Iiwic2lnbmF0dXJlcyI6W1siaW5keCIsInZhbHVlcyJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliNGYiLCJzaWduYXR1cmVzIjpbWyJpbmR4IiwieCIsInkiLCJ6IiwidyJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliNGZ2Iiwic2lnbmF0dXJlcyI6W1siaW5keCIsInZhbHVlcyJdXX0seyJuYW1lIjoidmVydGV4QXR0cmliUG9pbnRlciIsInNpZ25hdHVyZXMiOltbImluZHgiLCJzaXplIiwidHlwZSIsIm5vcm1hbGl6ZWQiLCJzdHJpZGUiLCJvZmZzZXQiXV19LHsibmFtZSI6InZpZXdwb3J0Iiwic2lnbmF0dXJlcyI6W1sieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoic2V0Q29tcGF0aWJsZVhSRGV2aWNlIiwic2lnbmF0dXJlcyI6W1siZGV2aWNlIl1dfSx7Im5hbWUiOiJjb3B5QnVmZmVyU3ViRGF0YSIsInNpZ25hdHVyZXMiOltbInJlYWRUYXJnZXQiLCJ3cml0ZVRhcmdldCIsInJlYWRPZmZzZXQiLCJ3cml0ZU9mZnNldCIsInNpemUiXV19LHsibmFtZSI6ImdldEJ1ZmZlclN1YkRhdGEiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJzcmNCeXRlT2Zmc2V0IiwiZHN0RGF0YSIsIj9kc3RPZmZzZXQiLCI/bGVuZ3RoIl1dfSx7Im5hbWUiOiJibGl0RnJhbWVidWZmZXIiLCJzaWduYXR1cmVzIjpbWyJzcmNYMCIsInNyY1kwIiwic3JjWDEiLCJzcmNZMSIsImRzdFgwIiwiZHN0WTAiLCJkc3RYMSIsImRzdFkxIiwibWFzayIsImZpbHRlciJdXX0seyJuYW1lIjoiZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJhdHRhY2htZW50IiwidGV4dHVyZSIsImxldmVsIiwibGF5ZXIiXV19LHsibmFtZSI6ImdldEludGVybmFsZm9ybWF0UGFyYW1ldGVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiaW50ZXJuYWxmb3JtYXQiLCJwbmFtZSJdXX0seyJuYW1lIjoiaW52YWxpZGF0ZUZyYW1lYnVmZmVyIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiYXR0YWNobWVudHMiXV19LHsibmFtZSI6ImludmFsaWRhdGVTdWJGcmFtZWJ1ZmZlciIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImF0dGFjaG1lbnRzIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoicmVhZEJ1ZmZlciIsInNpZ25hdHVyZXMiOltbIm1vZGUiXV19LHsibmFtZSI6InJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInNhbXBsZXMiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0Il1dfSx7Im5hbWUiOiJ0ZXhTdG9yYWdlMkQiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbHMiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0Il1dfSx7Im5hbWUiOiJ0ZXhTdG9yYWdlM0QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbHMiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiXV19LHsibmFtZSI6InRleEltYWdlM0QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJvZmZzZXQiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImRlcHRoIiwiYm9yZGVyIiwiZm9ybWF0IiwidHlwZSIsImRhdGEiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImRlcHRoIiwiYm9yZGVyIiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJjYW52YXMiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImRlcHRoIiwiYm9yZGVyIiwiZm9ybWF0IiwidHlwZSIsInZpZGVvIl0sWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImJvcmRlciIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwiaW50ZXJuYWxmb3JtYXQiLCJ3aWR0aCIsImhlaWdodCIsImRlcHRoIiwiYm9yZGVyIiwiZm9ybWF0IiwidHlwZSIsInBpeGVscyIsIj9zcmNPZmZzZXQiXV19LHsibmFtZSI6InRleFN1YkltYWdlM0QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwiem9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJmb3JtYXQiLCJ0eXBlIiwib2Zmc2V0Il0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwiem9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJmb3JtYXQiLCJ0eXBlIiwiZGF0YSJdLFsidGFyZ2V0IiwibGV2ZWwiLCJ4b2Zmc2V0IiwieW9mZnNldCIsInpvZmZzZXQiLCJ3aWR0aCIsImhlaWdodCIsImRlcHRoIiwiZm9ybWF0IiwidHlwZSIsImltYWdlIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwiem9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJmb3JtYXQiLCJ0eXBlIiwiY2FudmFzIl0sWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwiem9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJmb3JtYXQiLCJ0eXBlIiwidmlkZW8iXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ6b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImZvcm1hdCIsInR5cGUiLCJiaXRtYXAiXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ6b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImZvcm1hdCIsInR5cGUiLCJwaXhlbHMiLCI/c3JjT2Zmc2V0Il1dfSx7Im5hbWUiOiJjb3B5VGV4U3ViSW1hZ2UzRCIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ6b2Zmc2V0IiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdXX0seyJuYW1lIjoiY29tcHJlc3NlZFRleEltYWdlM0QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsImludGVybmFsZm9ybWF0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImJvcmRlciIsImltYWdlU2l6ZSIsIm9mZnNldCJdLFsidGFyZ2V0IiwibGV2ZWwiLCJpbnRlcm5hbGZvcm1hdCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJib3JkZXIiLCJkYXRhIiwiP3NyY09mZnNldCIsIj9zcmNMZW5ndGhPdmVycmlkZSJdXX0seyJuYW1lIjoiY29tcHJlc3NlZFRleFN1YkltYWdlM0QiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJsZXZlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwiem9mZnNldCIsIndpZHRoIiwiaGVpZ2h0IiwiZGVwdGgiLCJmb3JtYXQiLCJpbWFnZVNpemUiLCJvZmZzZXQiXSxbInRhcmdldCIsImxldmVsIiwieG9mZnNldCIsInlvZmZzZXQiLCJ6b2Zmc2V0Iiwid2lkdGgiLCJoZWlnaHQiLCJkZXB0aCIsImZvcm1hdCIsImRhdGEiLCI/c3JjT2Zmc2V0IiwiP3NyY0xlbmd0aE92ZXJyaWRlIl1dfSx7Im5hbWUiOiJnZXRGcmFnRGF0YUxvY2F0aW9uIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsIm5hbWUiXV19LHsibmFtZSI6InVuaWZvcm0xdWkiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYwIl1dfSx7Im5hbWUiOiJ1bmlmb3JtMnVpIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2MCIsInYxIl1dfSx7Im5hbWUiOiJ1bmlmb3JtM3VpIiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ2MCIsInYxIiwidjIiXV19LHsibmFtZSI6InVuaWZvcm00dWkiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInYwIiwidjEiLCJ2MiIsInYzIl1dfSx7Im5hbWUiOiJ1bmlmb3JtMXVpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ1bmlmb3JtMnVpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ1bmlmb3JtM3VpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ1bmlmb3JtNHVpdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidiIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ1bmlmb3JtTWF0cml4MngzZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInRyYW5zcG9zZSIsInZhbHVlIiwiP3NyY09mZnNldCIsIj9zcmNMZW5ndGgiXV19LHsibmFtZSI6InVuaWZvcm1NYXRyaXgzeDJmdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidHJhbnNwb3NlIiwidmFsdWUiLCI/c3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXX0seyJuYW1lIjoidW5pZm9ybU1hdHJpeDJ4NGZ2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ0cmFuc3Bvc2UiLCJ2YWx1ZSIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ1bmlmb3JtTWF0cml4NHgyZnYiLCJzaWduYXR1cmVzIjpbWyJsb2NhdGlvbiIsInRyYW5zcG9zZSIsInZhbHVlIiwiP3NyY09mZnNldCIsIj9zcmNMZW5ndGgiXV19LHsibmFtZSI6InVuaWZvcm1NYXRyaXgzeDRmdiIsInNpZ25hdHVyZXMiOltbImxvY2F0aW9uIiwidHJhbnNwb3NlIiwidmFsdWUiLCI/c3JjT2Zmc2V0IiwiP3NyY0xlbmd0aCJdXX0seyJuYW1lIjoidW5pZm9ybU1hdHJpeDR4M2Z2Iiwic2lnbmF0dXJlcyI6W1sibG9jYXRpb24iLCJ0cmFuc3Bvc2UiLCJ2YWx1ZSIsIj9zcmNPZmZzZXQiLCI/c3JjTGVuZ3RoIl1dfSx7Im5hbWUiOiJ2ZXJ0ZXhBdHRyaWJJNGkiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsIngiLCJ5IiwieiIsInciXV19LHsibmFtZSI6InZlcnRleEF0dHJpYkk0aXYiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsInYiXV19LHsibmFtZSI6InZlcnRleEF0dHJpYkk0dWkiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsIngiLCJ5IiwieiIsInciXV19LHsibmFtZSI6InZlcnRleEF0dHJpYkk0dWl2Iiwic2lnbmF0dXJlcyI6W1siaW5kZXgiLCJ2Il1dfSx7Im5hbWUiOiJ2ZXJ0ZXhBdHRyaWJJUG9pbnRlciIsInNpZ25hdHVyZXMiOltbImluZGV4Iiwic2l6ZSIsInR5cGUiLCJzdHJpZGUiLCJvZmZzZXQiXV19LHsibmFtZSI6InZlcnRleEF0dHJpYkRpdmlzb3IiLCJzaWduYXR1cmVzIjpbWyJpbmRleCIsImRpdmlzb3IiXV19LHsibmFtZSI6ImRyYXdBcnJheXNJbnN0YW5jZWQiLCJzaWduYXR1cmVzIjpbWyJtb2RlIiwiZmlyc3QiLCJjb3VudCIsImluc3RhbmNlQ291bnQiXV19LHsibmFtZSI6ImRyYXdFbGVtZW50c0luc3RhbmNlZCIsInNpZ25hdHVyZXMiOltbIm1vZGUiLCJjb3VudCIsInR5cGUiLCJvZmZzZXQiLCJpbnN0YW5jZUNvdW50Il1dfSx7Im5hbWUiOiJkcmF3UmFuZ2VFbGVtZW50cyIsInNpZ25hdHVyZXMiOltbIm1vZGUiLCJzdGFydCIsImVuZCIsImNvdW50IiwidHlwZSIsIm9mZnNldCJdXX0seyJuYW1lIjoiZHJhd0J1ZmZlcnMiLCJzaWduYXR1cmVzIjpbWyJidWZmZXJzIl1dfSx7Im5hbWUiOiJjbGVhckJ1ZmZlcml2Iiwic2lnbmF0dXJlcyI6W1siYnVmZmVyIiwiZHJhd2J1ZmZlciIsInZhbHVlIiwiP3NyY09mZnNldCJdXX0seyJuYW1lIjoiY2xlYXJCdWZmZXJ1aXYiLCJzaWduYXR1cmVzIjpbWyJidWZmZXIiLCJkcmF3YnVmZmVyIiwidmFsdWUiLCI/c3JjT2Zmc2V0Il1dfSx7Im5hbWUiOiJjbGVhckJ1ZmZlcmZ2Iiwic2lnbmF0dXJlcyI6W1siYnVmZmVyIiwiZHJhd2J1ZmZlciIsInZhbHVlIiwiP3NyY09mZnNldCJdXX0seyJuYW1lIjoiY2xlYXJCdWZmZXJmaSIsInNpZ25hdHVyZXMiOltbImJ1ZmZlciIsImRyYXdidWZmZXIiLCJkZXB0aCIsInN0ZW5jaWwiXV19LHsibmFtZSI6ImRlbGV0ZVF1ZXJ5Iiwic2lnbmF0dXJlcyI6W1sicXVlcnkiXV19LHsibmFtZSI6ImlzUXVlcnkiLCJzaWduYXR1cmVzIjpbWyJxdWVyeSJdXX0seyJuYW1lIjoiYmVnaW5RdWVyeSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsInF1ZXJ5Il1dfSx7Im5hbWUiOiJlbmRRdWVyeSIsInNpZ25hdHVyZXMiOltbInRhcmdldCJdXX0seyJuYW1lIjoiZ2V0UXVlcnkiLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJwbmFtZSJdXX0seyJuYW1lIjoiZ2V0UXVlcnlQYXJhbWV0ZXIiLCJzaWduYXR1cmVzIjpbWyJxdWVyeSIsInBuYW1lIl1dfSx7Im5hbWUiOiJkZWxldGVTYW1wbGVyIiwic2lnbmF0dXJlcyI6W1sic2FtcGxlciJdXX0seyJuYW1lIjoiaXNTYW1wbGVyIiwic2lnbmF0dXJlcyI6W1sic2FtcGxlciJdXX0seyJuYW1lIjoiYmluZFNhbXBsZXIiLCJzaWduYXR1cmVzIjpbWyJ1bml0Iiwic2FtcGxlciJdXX0seyJuYW1lIjoic2FtcGxlclBhcmFtZXRlcmkiLCJzaWduYXR1cmVzIjpbWyJzYW1wbGVyIiwicG5hbWUiLCJwYXJhbSJdXX0seyJuYW1lIjoic2FtcGxlclBhcmFtZXRlcmYiLCJzaWduYXR1cmVzIjpbWyJzYW1wbGVyIiwicG5hbWUiLCJwYXJhbSJdXX0seyJuYW1lIjoiZ2V0U2FtcGxlclBhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbInNhbXBsZXIiLCJwbmFtZSJdXX0seyJuYW1lIjoiZmVuY2VTeW5jIiwic2lnbmF0dXJlcyI6W1siY29uZGl0aW9uIiwiZmxhZ3MiXV19LHsibmFtZSI6ImlzU3luYyIsInNpZ25hdHVyZXMiOltbInN5bmMiXV19LHsibmFtZSI6ImRlbGV0ZVN5bmMiLCJzaWduYXR1cmVzIjpbWyJzeW5jIl1dfSx7Im5hbWUiOiJjbGllbnRXYWl0U3luYyIsInNpZ25hdHVyZXMiOltbInN5bmMiLCJmbGFncyIsInRpbWVvdXQiXV19LHsibmFtZSI6IndhaXRTeW5jIiwic2lnbmF0dXJlcyI6W1sic3luYyIsImZsYWdzIiwidGltZW91dCJdXX0seyJuYW1lIjoiZ2V0U3luY1BhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbInN5bmMiLCJwbmFtZSJdXX0seyJuYW1lIjoiZGVsZXRlVHJhbnNmb3JtRmVlZGJhY2siLCJzaWduYXR1cmVzIjpbWyJmZWVkYmFjayJdXX0seyJuYW1lIjoiaXNUcmFuc2Zvcm1GZWVkYmFjayIsInNpZ25hdHVyZXMiOltbImZlZWRiYWNrIl1dfSx7Im5hbWUiOiJiaW5kVHJhbnNmb3JtRmVlZGJhY2siLCJzaWduYXR1cmVzIjpbWyJ0YXJnZXQiLCJmZWVkYmFjayJdXX0seyJuYW1lIjoiYmVnaW5UcmFuc2Zvcm1GZWVkYmFjayIsInNpZ25hdHVyZXMiOltbInByaW1pdGl2ZU1vZGUiXV19LHsibmFtZSI6InRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MiLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIiwidmFyeWluZ3MiLCJidWZmZXJNb2RlIl1dfSx7Im5hbWUiOiJnZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmciLCJzaWduYXR1cmVzIjpbWyJwcm9ncmFtIiwiaW5kZXgiXV19LHsibmFtZSI6ImJpbmRCdWZmZXJCYXNlIiwic2lnbmF0dXJlcyI6W1sidGFyZ2V0IiwiaW5kZXgiLCJidWZmZXIiXV19LHsibmFtZSI6ImJpbmRCdWZmZXJSYW5nZSIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImluZGV4IiwiYnVmZmVyIiwib2Zmc2V0Iiwic2l6ZSJdXX0seyJuYW1lIjoiZ2V0SW5kZXhlZFBhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbInRhcmdldCIsImluZGV4Il1dfSx7Im5hbWUiOiJnZXRVbmlmb3JtSW5kaWNlcyIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iLCJ1bmlmb3JtTmFtZXMiXV19LHsibmFtZSI6ImdldEFjdGl2ZVVuaWZvcm1zIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsInVuaWZvcm1JbmRpY2VzIiwicG5hbWUiXV19LHsibmFtZSI6ImdldFVuaWZvcm1CbG9ja0luZGV4Iiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsInVuaWZvcm1CbG9ja05hbWUiXV19LHsibmFtZSI6ImdldEFjdGl2ZVVuaWZvcm1CbG9ja1BhcmFtZXRlciIsInNpZ25hdHVyZXMiOltbInByb2dyYW0iLCJ1bmlmb3JtQmxvY2tJbmRleCIsInBuYW1lIl1dfSx7Im5hbWUiOiJnZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsInVuaWZvcm1CbG9ja0luZGV4Il1dfSx7Im5hbWUiOiJ1bmlmb3JtQmxvY2tCaW5kaW5nIiwic2lnbmF0dXJlcyI6W1sicHJvZ3JhbSIsInVuaWZvcm1CbG9ja0luZGV4IiwidW5pZm9ybUJsb2NrQmluZGluZyJdXX0seyJuYW1lIjoiZGVsZXRlVmVydGV4QXJyYXkiLCJzaWduYXR1cmVzIjpbWyJ2ZXJ0ZXhBcnJheSJdXX0seyJuYW1lIjoiaXNWZXJ0ZXhBcnJheSIsInNpZ25hdHVyZXMiOltbInZlcnRleEFycmF5Il1dfSx7Im5hbWUiOiJiaW5kVmVydGV4QXJyYXkiLCJzaWduYXR1cmVzIjpbWyJ2ZXJ0ZXhBcnJheSJdXX0seyJuYW1lIjoicmVxdWVzdE1JRElBY2Nlc3MiLCJzaWduYXR1cmVzIjpbWyI/b3B0aW9ucyJdXX0seyJuYW1lIjoic2hhcmUiLCJzaWduYXR1cmVzIjpbWyI/ZGF0YSJdXX0seyJuYW1lIjoiQ2xvc2VFdmVudCIsInNpZ25hdHVyZXMiOltbInR5cGUiLCI/ZXZlbnRJbml0RGljdCJdXX0seyJuYW1lIjoiV2ViU29ja2V0Iiwic2lnbmF0dXJlcyI6W1sidXJsIiwiP3Byb3RvY29scyJdXX0seyJuYW1lIjoic2VsZWN0Q29uZmlndXJhdGlvbiIsInNpZ25hdHVyZXMiOltbImNvbmZpZ3VyYXRpb25WYWx1ZSJdXX0seyJuYW1lIjoiY2xhaW1JbnRlcmZhY2UiLCJzaWduYXR1cmVzIjpbWyJpbnRlcmZhY2VOdW1iZXIiXV19LHsibmFtZSI6InJlbGVhc2VJbnRlcmZhY2UiLCJzaWduYXR1cmVzIjpbWyJpbnRlcmZhY2VOdW1iZXIiXV19LHsibmFtZSI6InNlbGVjdEFsdGVybmF0ZUludGVyZmFjZSIsInNpZ25hdHVyZXMiOltbImludGVyZmFjZU51bWJlciIsImFsdGVybmF0ZVNldHRpbmciXV19LHsibmFtZSI6ImNvbnRyb2xUcmFuc2ZlckluIiwic2lnbmF0dXJlcyI6W1sic2V0dXAiLCJsZW5ndGgiXV19LHsibmFtZSI6ImNvbnRyb2xUcmFuc2Zlck91dCIsInNpZ25hdHVyZXMiOltbInNldHVwIiwiP2RhdGEiXV19LHsibmFtZSI6ImNsZWFySGFsdCIsInNpZ25hdHVyZXMiOltbImRpcmVjdGlvbiIsImVuZHBvaW50TnVtYmVyIl1dfSx7Im5hbWUiOiJ0cmFuc2ZlckluIiwic2lnbmF0dXJlcyI6W1siZW5kcG9pbnROdW1iZXIiLCJsZW5ndGgiXV19LHsibmFtZSI6InRyYW5zZmVyT3V0Iiwic2lnbmF0dXJlcyI6W1siZW5kcG9pbnROdW1iZXIiLCJkYXRhIl1dfSx7Im5hbWUiOiJpc29jaHJvbm91c1RyYW5zZmVySW4iLCJzaWduYXR1cmVzIjpbWyJlbmRwb2ludE51bWJlciIsInBhY2tldExlbmd0aHMiXV19LHsibmFtZSI6Imlzb2Nocm9ub3VzVHJhbnNmZXJPdXQiLCJzaWduYXR1cmVzIjpbWyJlbmRwb2ludE51bWJlciIsImRhdGEiLCJwYWNrZXRMZW5ndGhzIl1dfSx7Im5hbWUiOiJnZXRUcmFuc2Zvcm1UbyIsInNpZ25hdHVyZXMiOltbIm90aGVyIl1dfSx7Im5hbWUiOiJnZXRWaWV3TWF0cml4Iiwic2lnbmF0dXJlcyI6W1sidmlldyJdXX0seyJuYW1lIjoic3VwcG9ydHNTZXNzaW9uIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV19LHsibmFtZSI6InJlcXVlc3RTZXNzaW9uIiwic2lnbmF0dXJlcyI6W1siP29wdGlvbnMiXV19LHsibmFtZSI6ImdldERldmljZVBvc2UiLCJzaWduYXR1cmVzIjpbWyJjb29yZGluYXRlU3lzdGVtIl1dfSx7Im5hbWUiOiJnZXRJbnB1dFBvc2UiLCJzaWduYXR1cmVzIjpbWyJpbnB1dFNvdXJjZSIsImNvb3JkaW5hdGVTeXN0ZW0iXV19LHsibmFtZSI6InJlcXVlc3RGcmFtZU9mUmVmZXJlbmNlIiwic2lnbmF0dXJlcyI6W1sidHlwZSIsIj9vcHRpb25zIl1dfSx7Im5hbWUiOiJnZXRWaWV3cG9ydCIsInNpZ25hdHVyZXMiOltbInZpZXciXV19LHsibmFtZSI6InJlcXVlc3RWaWV3cG9ydFNjYWxpbmciLCJzaWduYXR1cmVzIjpbWyJ2aWV3cG9ydFNjYWxlRmFjdG9yIl1dfSx7Im5hbWUiOiJhc3NlcnQiLCJzaWduYXR1cmVzIjpbWyI/Y29uZGl0aW9uIiwiLi4uZGF0YSJdXX0seyJuYW1lIjoiZGVidWciLCJzaWduYXR1cmVzIjpbWyIuLi5kYXRhIl1dfSx7Im5hbWUiOiJkaXIiLCJzaWduYXR1cmVzIjpbWyJpdGVtIiwiP29wdGlvbnMiXV19LHsibmFtZSI6ImRpcnhtbCIsInNpZ25hdHVyZXMiOltbIi4uLmRhdGEiXV19LHsibmFtZSI6Imdyb3VwIiwic2lnbmF0dXJlcyI6W1siLi4uZGF0YSJdXX0seyJuYW1lIjoiZ3JvdXBDb2xsYXBzZWQiLCJzaWduYXR1cmVzIjpbWyIuLi5kYXRhIl1dfSx7Im5hbWUiOiJpbmZvIiwic2lnbmF0dXJlcyI6W1siLi4uZGF0YSJdXX0seyJuYW1lIjoicHJvZmlsZSIsInNpZ25hdHVyZXMiOltbIj90aXRsZSJdXX0seyJuYW1lIjoicHJvZmlsZUVuZCIsInNpZ25hdHVyZXMiOltbIj90aXRsZSJdXX0seyJuYW1lIjoidGFibGUiLCJzaWduYXR1cmVzIjpbWyIuLi50YWJ1bGFyRGF0YSJdXX0seyJuYW1lIjoidGltZSIsInNpZ25hdHVyZXMiOltbIj9sYWJlbCJdXX0seyJuYW1lIjoidGltZUVuZCIsInNpZ25hdHVyZXMiOltbIj9sYWJlbCJdXX0seyJuYW1lIjoidGltZVN0YW1wIiwic2lnbmF0dXJlcyI6W1siP25hbWUiXV19LHsibmFtZSI6InRyYWNlIiwic2lnbmF0dXJlcyI6W1siLi4uZGF0YSJdXX0seyJuYW1lIjoid2FybiIsInNpZ25hdHVyZXMiOltbIi4uLmRhdGEiXV19XTs7SmF2YVNjcmlwdE1ldGFkYXRhLkphdmFTY3JpcHRNZXRhZGF0YT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3VuaXF1ZUZ1bmN0aW9ucz1uZXcgTWFwKCk7dGhpcy5faW5zdGFuY2VNZXRob2RzPW5ldyBNYXAoKTt0aGlzLl9zdGF0aWNNZXRob2RzPW5ldyBNYXAoKTtmb3IoY29uc3QgbmF0aXZlRnVuY3Rpb24gb2YgSmF2YVNjcmlwdE1ldGFkYXRhLk5hdGl2ZUZ1bmN0aW9ucyl7aWYoIW5hdGl2ZUZ1bmN0aW9uLnJlY2VpdmVyKXt0aGlzLl91bmlxdWVGdW5jdGlvbnMuc2V0KG5hdGl2ZUZ1bmN0aW9uLm5hbWUsbmF0aXZlRnVuY3Rpb24uc2lnbmF0dXJlcyk7fWVsc2UgaWYobmF0aXZlRnVuY3Rpb24uc3RhdGljKXtpZighdGhpcy5fc3RhdGljTWV0aG9kcy5oYXMobmF0aXZlRnVuY3Rpb24ucmVjZWl2ZXIpKQp0aGlzLl9zdGF0aWNNZXRob2RzLnNldChuYXRpdmVGdW5jdGlvbi5yZWNlaXZlcixuZXcgTWFwKCkpO3RoaXMuX3N0YXRpY01ldGhvZHMuZ2V0KG5hdGl2ZUZ1bmN0aW9uLnJlY2VpdmVyKS5zZXQobmF0aXZlRnVuY3Rpb24ubmFtZSxuYXRpdmVGdW5jdGlvbi5zaWduYXR1cmVzKTt9ZWxzZXtpZighdGhpcy5faW5zdGFuY2VNZXRob2RzLmhhcyhuYXRpdmVGdW5jdGlvbi5yZWNlaXZlcikpCnRoaXMuX2luc3RhbmNlTWV0aG9kcy5zZXQobmF0aXZlRnVuY3Rpb24ucmVjZWl2ZXIsbmV3IE1hcCgpKTt0aGlzLl9pbnN0YW5jZU1ldGhvZHMuZ2V0KG5hdGl2ZUZ1bmN0aW9uLnJlY2VpdmVyKS5zZXQobmF0aXZlRnVuY3Rpb24ubmFtZSxuYXRpdmVGdW5jdGlvbi5zaWduYXR1cmVzKTt9fX0Kc2lnbmF0dXJlc0Zvck5hdGl2ZUZ1bmN0aW9uKG5hbWUpe3JldHVybiB0aGlzLl91bmlxdWVGdW5jdGlvbnMuZ2V0KG5hbWUpfHxudWxsO30Kc2lnbmF0dXJlc0Zvckluc3RhbmNlTWV0aG9kKG5hbWUscmVjZWl2ZXJDbGFzc05hbWUpe2lmKCF0aGlzLl9pbnN0YW5jZU1ldGhvZHMuaGFzKHJlY2VpdmVyQ2xhc3NOYW1lKSkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX2luc3RhbmNlTWV0aG9kcy5nZXQocmVjZWl2ZXJDbGFzc05hbWUpLmdldChuYW1lKXx8bnVsbDt9CnNpZ25hdHVyZXNGb3JTdGF0aWNNZXRob2QobmFtZSxyZWNlaXZlckNvbnN0cnVjdG9yTmFtZSl7aWYoIXRoaXMuX3N0YXRpY01ldGhvZHMuaGFzKHJlY2VpdmVyQ29uc3RydWN0b3JOYW1lKSkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuX3N0YXRpY01ldGhvZHMuZ2V0KHJlY2VpdmVyQ29uc3RydWN0b3JOYW1lKS5nZXQobmFtZSl8fG51bGw7fX07SmF2YVNjcmlwdE1ldGFkYXRhLk5hdGl2ZUZ1bmN0aW9uczs7TGF5ZXJWaWV3ZXIuTGF5ZXJEZXRhaWxzVmlldz1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3RvcihsYXllclZpZXdIb3N0KXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2xheWVyX3ZpZXdlci9sYXllckRldGFpbHNWaWV3LmNzcycpO3RoaXMuX2xheWVyVmlld0hvc3Q9bGF5ZXJWaWV3SG9zdDt0aGlzLl9sYXllclZpZXdIb3N0LnJlZ2lzdGVyVmlldyh0aGlzKTt0aGlzLl9lbXB0eVdpZGdldD1uZXcgVUkuRW1wdHlXaWRnZXQoQ29tbW9uLlVJU3RyaW5nKCdTZWxlY3QgYSBsYXllciB0byBzZWUgaXRzIGRldGFpbHMnKSk7dGhpcy5fYnVpbGRDb250ZW50KCk7fQpob3Zlck9iamVjdChzZWxlY3Rpb24pe30Kc2VsZWN0T2JqZWN0KHNlbGVjdGlvbil7dGhpcy5fc2VsZWN0aW9uPXNlbGVjdGlvbjtpZih0aGlzLmlzU2hvd2luZygpKQp0aGlzLnVwZGF0ZSgpO30Kc2V0TGF5ZXJUcmVlKGxheWVyVHJlZSl7fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7dGhpcy51cGRhdGUoKTt9Cl9vblNjcm9sbFJlY3RDbGlja2VkKGluZGV4LGV2ZW50KXtpZihldmVudC53aGljaCE9PTEpCnJldHVybjt0aGlzLl9sYXllclZpZXdIb3N0LnNlbGVjdE9iamVjdChuZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNjcm9sbFJlY3RTZWxlY3Rpb24odGhpcy5fc2VsZWN0aW9uLmxheWVyKCksaW5kZXgpKTt9Cl9vblBhaW50UHJvZmlsZXJCdXR0b25DbGlja2VkKCl7aWYodGhpcy5fc2VsZWN0aW9uLnR5cGUoKT09PUxheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb24uVHlwZS5TbmFwc2hvdHx8dGhpcy5fc2VsZWN0aW9uLmxheWVyKCkpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKExheWVyVmlld2VyLkxheWVyRGV0YWlsc1ZpZXcuRXZlbnRzLlBhaW50UHJvZmlsZXJSZXF1ZXN0ZWQsdGhpcy5fc2VsZWN0aW9uKTt9Cl9jcmVhdGVTY3JvbGxSZWN0RWxlbWVudChzY3JvbGxSZWN0LGluZGV4KXtpZihpbmRleCkKdGhpcy5fc2Nyb2xsUmVjdHNDZWxsLmNyZWF0ZVRleHRDaGlsZCgnLCAnKTtjb25zdCBlbGVtZW50PXRoaXMuX3Njcm9sbFJlY3RzQ2VsbC5jcmVhdGVDaGlsZCgnc3BhbicsJ3Njcm9sbC1yZWN0Jyk7aWYodGhpcy5fc2VsZWN0aW9uLnNjcm9sbFJlY3RJbmRleD09PWluZGV4KQplbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO2VsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclcyAlZCDDlyAlZCAoYXQgJWQsICVkKScsTGF5ZXJWaWV3ZXIuTGF5ZXJEZXRhaWxzVmlldy5fc2xvd1Njcm9sbFJlY3ROYW1lcy5nZXQoc2Nyb2xsUmVjdC50eXBlKSxzY3JvbGxSZWN0LnJlY3QueCxzY3JvbGxSZWN0LnJlY3QueSxzY3JvbGxSZWN0LnJlY3Qud2lkdGgsc2Nyb2xsUmVjdC5yZWN0LmhlaWdodCk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25TY3JvbGxSZWN0Q2xpY2tlZC5iaW5kKHRoaXMsaW5kZXgpLGZhbHNlKTt9Cl9mb3JtYXRTdGlja3lBbmNlc3RvckxheWVyKHRpdGxlLGxheWVyKXtpZighbGF5ZXIpCnJldHVybicnO2NvbnN0IG5vZGU9bGF5ZXIubm9kZUZvclNlbGZPckFuY2VzdG9yKCk7Y29uc3QgbmFtZT1ub2RlP25vZGUuc2ltcGxlU2VsZWN0b3IoKTpDb21tb24uVUlTdHJpbmcoJzx1bm5hbWVkPicpO3JldHVybiBDb21tb24uVUlTdHJpbmcoJyVzOiAlcyAoJXMpJyx0aXRsZSxuYW1lLGxheWVyLmlkKCkpO30KX2NyZWF0ZVN0aWNreUFuY2VzdG9yQ2hpbGQodGl0bGUsbGF5ZXIpe2lmKCFsYXllcikKcmV0dXJuO3RoaXMuX3N0aWNreVBvc2l0aW9uQ29uc3RyYWludENlbGwuY3JlYXRlVGV4dENoaWxkKCcsICcpO2NvbnN0IGNoaWxkPXRoaXMuX3N0aWNreVBvc2l0aW9uQ29uc3RyYWludENlbGwuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtjaGlsZC50ZXh0Q29udGVudD10aGlzLl9mb3JtYXRTdGlja3lBbmNlc3RvckxheWVyKHRpdGxlLGxheWVyKTt9Cl9wb3B1bGF0ZVN0aWNreVBvc2l0aW9uQ29uc3RyYWludENlbGwoY29uc3RyYWludCl7dGhpcy5fc3RpY2t5UG9zaXRpb25Db25zdHJhaW50Q2VsbC5yZW1vdmVDaGlsZHJlbigpO2lmKCFjb25zdHJhaW50KQpyZXR1cm47Y29uc3Qgc3RpY2t5Qm94UmVjdD1jb25zdHJhaW50LnN0aWNreUJveFJlY3QoKTtjb25zdCBzdGlja3lCb3hSZWN0RWxlbWVudD10aGlzLl9zdGlja3lQb3NpdGlvbkNvbnN0cmFpbnRDZWxsLmNyZWF0ZUNoaWxkKCdzcGFuJyk7c3RpY2t5Qm94UmVjdEVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTdGlja3kgQm94ICVkIMOXICVkIChhdCAlZCwgJWQpJyxzdGlja3lCb3hSZWN0LndpZHRoLHN0aWNreUJveFJlY3QuaGVpZ2h0LHN0aWNreUJveFJlY3QueCxzdGlja3lCb3hSZWN0LnkpO3RoaXMuX3N0aWNreVBvc2l0aW9uQ29uc3RyYWludENlbGwuY3JlYXRlVGV4dENoaWxkKCcsICcpO2NvbnN0IGNvbnRhaW5pbmdCbG9ja1JlY3Q9Y29uc3RyYWludC5jb250YWluaW5nQmxvY2tSZWN0KCk7Y29uc3QgY29udGFpbmluZ0Jsb2NrUmVjdEVsZW1lbnQ9dGhpcy5fc3RpY2t5UG9zaXRpb25Db25zdHJhaW50Q2VsbC5jcmVhdGVDaGlsZCgnc3BhbicpO2NvbnRhaW5pbmdCbG9ja1JlY3RFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQ29udGFpbmluZyBCbG9jayAlZCDDlyAlZCAoYXQgJWQsICVkKScsY29udGFpbmluZ0Jsb2NrUmVjdC53aWR0aCxjb250YWluaW5nQmxvY2tSZWN0LmhlaWdodCxjb250YWluaW5nQmxvY2tSZWN0LngsY29udGFpbmluZ0Jsb2NrUmVjdC55KTt0aGlzLl9jcmVhdGVTdGlja3lBbmNlc3RvckNoaWxkKENvbW1vbi5VSVN0cmluZygnTmVhcmVzdCBMYXllciBTaGlmdGluZyBTdGlja3kgQm94JyksY29uc3RyYWludC5uZWFyZXN0TGF5ZXJTaGlmdGluZ1N0aWNreUJveCgpKTt0aGlzLl9jcmVhdGVTdGlja3lBbmNlc3RvckNoaWxkKENvbW1vbi5VSVN0cmluZygnTmVhcmVzdCBMYXllciBTaGlmdGluZyBDb250YWluaW5nIEJsb2NrJyksY29uc3RyYWludC5uZWFyZXN0TGF5ZXJTaGlmdGluZ0NvbnRhaW5pbmdCbG9jaygpKTt9CnVwZGF0ZSgpe2NvbnN0IGxheWVyPXRoaXMuX3NlbGVjdGlvbiYmdGhpcy5fc2VsZWN0aW9uLmxheWVyKCk7aWYoIWxheWVyKXt0aGlzLl90YWJsZUVsZW1lbnQucmVtb3ZlKCk7dGhpcy5fcGFpbnRQcm9maWxlckJ1dHRvbi5yZW1vdmUoKTt0aGlzLl9lbXB0eVdpZGdldC5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3JldHVybjt9CnRoaXMuX2VtcHR5V2lkZ2V0LmRldGFjaCgpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGFibGVFbGVtZW50KTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3BhaW50UHJvZmlsZXJCdXR0b24pO3RoaXMuX3NpemVDZWxsLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnJWQgw5cgJWQgKGF0ICVkLCVkKScsbGF5ZXIud2lkdGgoKSxsYXllci5oZWlnaHQoKSxsYXllci5vZmZzZXRYKCksbGF5ZXIub2Zmc2V0WSgpKTt0aGlzLl9wYWludENvdW50Q2VsbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIWxheWVyLnBhaW50Q291bnQoKSk7dGhpcy5fcGFpbnRDb3VudENlbGwudGV4dENvbnRlbnQ9bGF5ZXIucGFpbnRDb3VudCgpO3RoaXMuX21lbW9yeUVzdGltYXRlQ2VsbC50ZXh0Q29udGVudD1OdW1iZXIuYnl0ZXNUb1N0cmluZyhsYXllci5ncHVNZW1vcnlVc2FnZSgpKTtsYXllci5yZXF1ZXN0Q29tcG9zaXRpbmdSZWFzb25zKCkudGhlbih0aGlzLl91cGRhdGVDb21wb3NpdGluZ1JlYXNvbnMuYmluZCh0aGlzKSk7dGhpcy5fc2Nyb2xsUmVjdHNDZWxsLnJlbW92ZUNoaWxkcmVuKCk7bGF5ZXIuc2Nyb2xsUmVjdHMoKS5mb3JFYWNoKHRoaXMuX2NyZWF0ZVNjcm9sbFJlY3RFbGVtZW50LmJpbmQodGhpcykpO3RoaXMuX3BvcHVsYXRlU3RpY2t5UG9zaXRpb25Db25zdHJhaW50Q2VsbChsYXllci5zdGlja3lQb3NpdGlvbkNvbnN0cmFpbnQoKSk7Y29uc3Qgc25hcHNob3Q9dGhpcy5fc2VsZWN0aW9uLnR5cGUoKT09PUxheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb24uVHlwZS5TbmFwc2hvdD8odGhpcy5fc2VsZWN0aW9uKS5zbmFwc2hvdCgpOm51bGw7dGhpcy5fcGFpbnRQcm9maWxlckJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFzbmFwc2hvdCk7fQpfYnVpbGRDb250ZW50KCl7dGhpcy5fdGFibGVFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3RhYmxlJyk7dGhpcy5fdGJvZHlFbGVtZW50PXRoaXMuX3RhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndGJvZHknKTt0aGlzLl9zaXplQ2VsbD10aGlzLl9jcmVhdGVSb3coQ29tbW9uLlVJU3RyaW5nKCdTaXplJykpO3RoaXMuX2NvbXBvc2l0aW5nUmVhc29uc0NlbGw9dGhpcy5fY3JlYXRlUm93KENvbW1vbi5VSVN0cmluZygnQ29tcG9zaXRpbmcgUmVhc29ucycpKTt0aGlzLl9tZW1vcnlFc3RpbWF0ZUNlbGw9dGhpcy5fY3JlYXRlUm93KENvbW1vbi5VSVN0cmluZygnTWVtb3J5IGVzdGltYXRlJykpO3RoaXMuX3BhaW50Q291bnRDZWxsPXRoaXMuX2NyZWF0ZVJvdyhDb21tb24uVUlTdHJpbmcoJ1BhaW50IGNvdW50JykpO3RoaXMuX3Njcm9sbFJlY3RzQ2VsbD10aGlzLl9jcmVhdGVSb3coQ29tbW9uLlVJU3RyaW5nKCdTbG93IHNjcm9sbCByZWdpb25zJykpO3RoaXMuX3N0aWNreVBvc2l0aW9uQ29uc3RyYWludENlbGw9dGhpcy5fY3JlYXRlUm93KENvbW1vbi5VSVN0cmluZygnU3RpY2t5IHBvc2l0aW9uIGNvbnN0cmFpbnQnKSk7dGhpcy5fcGFpbnRQcm9maWxlckJ1dHRvbj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdhJywnaGlkZGVuIGxpbmsnKTt0aGlzLl9wYWludFByb2ZpbGVyQnV0dG9uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUGFpbnQgUHJvZmlsZXInKTt0aGlzLl9wYWludFByb2ZpbGVyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vblBhaW50UHJvZmlsZXJCdXR0b25DbGlja2VkLmJpbmQodGhpcykpO30KX2NyZWF0ZVJvdyh0aXRsZSl7Y29uc3QgdHI9dGhpcy5fdGJvZHlFbGVtZW50LmNyZWF0ZUNoaWxkKCd0cicpO2NvbnN0IHRpdGxlQ2VsbD10ci5jcmVhdGVDaGlsZCgndGQnKTt0aXRsZUNlbGwudGV4dENvbnRlbnQ9dGl0bGU7cmV0dXJuIHRyLmNyZWF0ZUNoaWxkKCd0ZCcpO30KX3VwZGF0ZUNvbXBvc2l0aW5nUmVhc29ucyhjb21wb3NpdGluZ1JlYXNvbnMpe2lmKCFjb21wb3NpdGluZ1JlYXNvbnN8fCFjb21wb3NpdGluZ1JlYXNvbnMubGVuZ3RoKXt0aGlzLl9jb21wb3NpdGluZ1JlYXNvbnNDZWxsLnRleHRDb250ZW50PSduL2EnO3JldHVybjt9CnRoaXMuX2NvbXBvc2l0aW5nUmVhc29uc0NlbGwucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBsaXN0PXRoaXMuX2NvbXBvc2l0aW5nUmVhc29uc0NlbGwuY3JlYXRlQ2hpbGQoJ3VsJyk7Zm9yKGxldCBpPTA7aTxjb21wb3NpdGluZ1JlYXNvbnMubGVuZ3RoOysraSl7bGV0IHRleHQ9TGF5ZXJWaWV3ZXIuTGF5ZXJEZXRhaWxzVmlldy5Db21wb3NpdGluZ1JlYXNvbkRldGFpbFtjb21wb3NpdGluZ1JlYXNvbnNbaV1dfHxjb21wb3NpdGluZ1JlYXNvbnNbaV07aWYoL1xzLipbXi5dJC8udGVzdCh0ZXh0KSkKdGV4dCs9Jy4nO2xpc3QuY3JlYXRlQ2hpbGQoJ2xpJykudGV4dENvbnRlbnQ9dGV4dDt9fX07TGF5ZXJWaWV3ZXIuTGF5ZXJEZXRhaWxzVmlldy5FdmVudHM9e1BhaW50UHJvZmlsZXJSZXF1ZXN0ZWQ6U3ltYm9sKCdQYWludFByb2ZpbGVyUmVxdWVzdGVkJyl9O0xheWVyVmlld2VyLkxheWVyRGV0YWlsc1ZpZXcuQ29tcG9zaXRpbmdSZWFzb25EZXRhaWw9eyd0cmFuc2Zvcm0zRCc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggYSBDU1MgM0QgdHJhbnNmb3JtLicpLCd2aWRlbyc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhIDx2aWRlbz4gZWxlbWVudC4nKSwnY2FudmFzJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byB0aGUgZWxlbWVudCBiZWluZyBhIDxjYW52YXM+IGVsZW1lbnQuJyksJ3BsdWdpbic6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhIHBsdWdpbi4nKSwnaUZyYW1lJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIDxpZnJhbWU+IGVsZW1lbnQuJyksJ2JhY2tmYWNlVmlzaWJpbGl0eUhpZGRlbic6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggYSAiYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuIiBzdHlsZS4nKSwnYW5pbWF0aW9uJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIGFuaW1hdGVkIGVsZW1lbnQuJyksJ2ZpbHRlcnMnOkNvbW1vbi5VSVN0cmluZygnQ29tcG9zaXRpb24gZHVlIHRvIGFzc29jaWF0aW9uIHdpdGggYW4gZWxlbWVudCB3aXRoIENTUyBmaWx0ZXJzIGFwcGxpZWQuJyksJ3Njcm9sbERlcGVuZGVudFBvc2l0aW9uJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIGVsZW1lbnQgd2l0aCBhICJwb3NpdGlvbjogZml4ZWQiIG9yICJwb3NpdGlvbjogc3RpY2t5IiBzdHlsZS4nKSwnb3ZlcmZsb3dTY3JvbGxpbmdUb3VjaCc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggYSAib3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaCIgc3R5bGUuJyksJ2JsZW5kaW5nJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIGVsZW1lbnQgdGhhdCBoYXMgYmxlbmQgbW9kZSBvdGhlciB0aGFuICJub3JtYWwiLicpLCdhc3N1bWVkT3ZlcmxhcCc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHRoYXQgbWF5IG92ZXJsYXAgb3RoZXIgY29tcG9zaXRlZCBlbGVtZW50cy4nKSwnb3ZlcmxhcCc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IG92ZXJsYXBwaW5nIG90aGVyIGNvbXBvc2l0ZWQgZWxlbWVudHMuJyksJ25lZ2F0aXZlWkluZGV4Q2hpbGRyZW4nOkNvbW1vbi5VSVN0cmluZygnQ29tcG9zaXRpb24gZHVlIHRvIGFzc29jaWF0aW9uIHdpdGggYW4gZWxlbWVudCB3aXRoIGRlc2NlbmRhbnRzIHRoYXQgaGF2ZSBhIG5lZ2F0aXZlIHotaW5kZXguJyksJ3RyYW5zZm9ybVdpdGhDb21wb3NpdGVkRGVzY2VuZGFudHMnOkNvbW1vbi5VSVN0cmluZygnQ29tcG9zaXRpb24gZHVlIHRvIGFzc29jaWF0aW9uIHdpdGggYW4gZWxlbWVudCB3aXRoIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ29wYWNpdHlXaXRoQ29tcG9zaXRlZERlc2NlbmRhbnRzJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIGVsZW1lbnQgd2l0aCBvcGFjaXR5IGFwcGxpZWQgYW5kIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ21hc2tXaXRoQ29tcG9zaXRlZERlc2NlbmRhbnRzJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGEgbWFza2VkIGVsZW1lbnQgYW5kIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ3JlZmxlY3Rpb25XaXRoQ29tcG9zaXRlZERlc2NlbmRhbnRzJzpDb21tb24uVUlTdHJpbmcoJ0NvbXBvc2l0aW9uIGR1ZSB0byBhc3NvY2lhdGlvbiB3aXRoIGFuIGVsZW1lbnQgd2l0aCBhIHJlZmxlY3Rpb24gYW5kIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ2ZpbHRlcldpdGhDb21wb3NpdGVkRGVzY2VuZGFudHMnOkNvbW1vbi5VSVN0cmluZygnQ29tcG9zaXRpb24gZHVlIHRvIGFzc29jaWF0aW9uIHdpdGggYW4gZWxlbWVudCB3aXRoIENTUyBmaWx0ZXJzIGFwcGxpZWQgYW5kIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ2JsZW5kaW5nV2l0aENvbXBvc2l0ZWREZXNjZW5kYW50cyc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggQ1NTIGJsZW5kaW5nIGFwcGxpZWQgYW5kIGNvbXBvc2l0ZWQgZGVzY2VuZGFudHMuJyksJ2NsaXBzQ29tcG9zaXRpbmdEZXNjZW5kYW50cyc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IGNsaXBwaW5nIGNvbXBvc2l0aW5nIGRlc2NlbmRhbnRzLicpLCdwZXJzcGVjdGl2ZSc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggcGVyc3BlY3RpdmUgYXBwbGllZC4nKSwncHJlc2VydmUzRCc6Q29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGlvbiBkdWUgdG8gYXNzb2NpYXRpb24gd2l0aCBhbiBlbGVtZW50IHdpdGggYSAidHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZCIgc3R5bGUuJyksJ3Jvb3QnOkNvbW1vbi5VSVN0cmluZygnUm9vdCBsYXllci4nKSwnbGF5ZXJGb3JDbGlwJzpDb21tb24uVUlTdHJpbmcoJ0xheWVyIGZvciBjbGlwLicpLCdsYXllckZvclNjcm9sbGJhcic6Q29tbW9uLlVJU3RyaW5nKCdMYXllciBmb3Igc2Nyb2xsYmFyLicpLCdsYXllckZvclNjcm9sbGluZ0NvbnRhaW5lcic6Q29tbW9uLlVJU3RyaW5nKCdMYXllciBmb3Igc2Nyb2xsaW5nIGNvbnRhaW5lci4nKSwnbGF5ZXJGb3JGb3JlZ3JvdW5kJzpDb21tb24uVUlTdHJpbmcoJ0xheWVyIGZvciBmb3JlZ3JvdW5kLicpLCdsYXllckZvckJhY2tncm91bmQnOkNvbW1vbi5VSVN0cmluZygnTGF5ZXIgZm9yIGJhY2tncm91bmQuJyksJ2xheWVyRm9yTWFzayc6Q29tbW9uLlVJU3RyaW5nKCdMYXllciBmb3IgbWFzay4nKSwnbGF5ZXJGb3JWaWRlb092ZXJsYXknOkNvbW1vbi5VSVN0cmluZygnTGF5ZXIgZm9yIHZpZGVvIG92ZXJsYXkuJyksfTtMYXllclZpZXdlci5MYXllckRldGFpbHNWaWV3Ll9zbG93U2Nyb2xsUmVjdE5hbWVzPW5ldyBNYXAoW1tTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuTm9uRmFzdFNjcm9sbGFibGUsQ29tbW9uLlVJU3RyaW5nKCdOb24gZmFzdCBzY3JvbGxhYmxlJyldLFtTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuVG91Y2hFdmVudEhhbmRsZXIsQ29tbW9uLlVJU3RyaW5nKCdUb3VjaCBldmVudCBoYW5kbGVyJyldLFtTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuV2hlZWxFdmVudEhhbmRsZXIsQ29tbW9uLlVJU3RyaW5nKCdXaGVlbCBldmVudCBoYW5kbGVyJyldLFtTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuUmVwYWludHNPblNjcm9sbCxDb21tb24uVUlTdHJpbmcoJ1JlcGFpbnRzIG9uIHNjcm9sbCcpXV0pOztMYXllclZpZXdlci5MYXllclRyZWVPdXRsaW5lPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihsYXllclZpZXdIb3N0KXtzdXBlcigpO3RoaXMuX2xheWVyVmlld0hvc3Q9bGF5ZXJWaWV3SG9zdDt0aGlzLl9sYXllclZpZXdIb3N0LnJlZ2lzdGVyVmlldyh0aGlzKTt0aGlzLl90cmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMuX3RyZWVPdXRsaW5lLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGF5ZXItdHJlZScsJ292ZXJmbG93LWF1dG8nKTt0aGlzLl90cmVlT3V0bGluZS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fb25Nb3VzZU1vdmUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsdGhpcy5fb25Nb3VzZU1vdmUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fb25Db250ZXh0TWVudS5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2xhc3RIb3ZlcmVkTm9kZT1udWxsO3RoaXMuZWxlbWVudD10aGlzLl90cmVlT3V0bGluZS5lbGVtZW50O3RoaXMuX2xheWVyVmlld0hvc3Quc2hvd0ludGVybmFsTGF5ZXJzU2V0dGluZygpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZSx0aGlzKTt9CmZvY3VzKCl7dGhpcy5fdHJlZU91dGxpbmUuZm9jdXMoKTt9CnNlbGVjdE9iamVjdChzZWxlY3Rpb24pe3RoaXMuaG92ZXJPYmplY3QobnVsbCk7Y29uc3QgbGF5ZXI9c2VsZWN0aW9uJiZzZWxlY3Rpb24ubGF5ZXIoKTtjb25zdCBub2RlPWxheWVyJiZsYXllcltMYXllclZpZXdlci5MYXllclRyZWVFbGVtZW50Ll9zeW1ib2xdO2lmKG5vZGUpCm5vZGUucmV2ZWFsQW5kU2VsZWN0KHRydWUpO2Vsc2UgaWYodGhpcy5fdHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudCkKdGhpcy5fdHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudC5kZXNlbGVjdCgpO30KaG92ZXJPYmplY3Qoc2VsZWN0aW9uKXtjb25zdCBsYXllcj1zZWxlY3Rpb24mJnNlbGVjdGlvbi5sYXllcigpO2NvbnN0IG5vZGU9bGF5ZXImJmxheWVyW0xheWVyVmlld2VyLkxheWVyVHJlZUVsZW1lbnQuX3N5bWJvbF07aWYobm9kZT09PXRoaXMuX2xhc3RIb3ZlcmVkTm9kZSkKcmV0dXJuO2lmKHRoaXMuX2xhc3RIb3ZlcmVkTm9kZSkKdGhpcy5fbGFzdEhvdmVyZWROb2RlLnNldEhvdmVyZWQoZmFsc2UpO2lmKG5vZGUpCm5vZGUuc2V0SG92ZXJlZCh0cnVlKTt0aGlzLl9sYXN0SG92ZXJlZE5vZGU9bm9kZTt9CnNldExheWVyVHJlZShsYXllclRyZWUpe3RoaXMuX2xheWVyVHJlZT1sYXllclRyZWU7dGhpcy5fdXBkYXRlKCk7fQpfdXBkYXRlKCl7Y29uc3Qgc2hvd0ludGVybmFsTGF5ZXJzPXRoaXMuX2xheWVyVmlld0hvc3Quc2hvd0ludGVybmFsTGF5ZXJzU2V0dGluZygpLmdldCgpO2NvbnN0IHNlZW5MYXllcnM9bmV3IE1hcCgpO2xldCByb290PW51bGw7aWYodGhpcy5fbGF5ZXJUcmVlKXtpZighc2hvd0ludGVybmFsTGF5ZXJzKQpyb290PXRoaXMuX2xheWVyVHJlZS5jb250ZW50Um9vdCgpO2lmKCFyb290KQpyb290PXRoaXMuX2xheWVyVHJlZS5yb290KCk7fQpmdW5jdGlvbiB1cGRhdGVMYXllcihsYXllcil7aWYoIWxheWVyLmRyYXdzQ29udGVudCgpJiYhc2hvd0ludGVybmFsTGF5ZXJzKQpyZXR1cm47aWYoc2VlbkxheWVycy5nZXQobGF5ZXIpKQpjb25zb2xlLmFzc2VydChmYWxzZSwnRHVwbGljYXRlIGxheWVyOiAnK2xheWVyLmlkKCkpO3NlZW5MYXllcnMuc2V0KGxheWVyLHRydWUpO2xldCBub2RlPWxheWVyW0xheWVyVmlld2VyLkxheWVyVHJlZUVsZW1lbnQuX3N5bWJvbF07bGV0IHBhcmVudExheWVyPWxheWVyLnBhcmVudCgpO3doaWxlKHBhcmVudExheWVyJiZwYXJlbnRMYXllciE9PXJvb3QmJiFwYXJlbnRMYXllci5kcmF3c0NvbnRlbnQoKSYmIXNob3dJbnRlcm5hbExheWVycykKcGFyZW50TGF5ZXI9cGFyZW50TGF5ZXIucGFyZW50KCk7Y29uc3QgcGFyZW50PWxheWVyPT09cm9vdD90aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpOnBhcmVudExheWVyW0xheWVyVmlld2VyLkxheWVyVHJlZUVsZW1lbnQuX3N5bWJvbF07aWYoIXBhcmVudCl7Y29uc29sZS5hc3NlcnQoZmFsc2UsJ1BhcmVudCBpcyBub3QgaW4gdGhlIHRyZWUnKTtyZXR1cm47fQppZighbm9kZSl7bm9kZT1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJUcmVlRWxlbWVudCh0aGlzLGxheWVyKTtwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7aWYoIWxheWVyLmRyYXdzQ29udGVudCgpKQpub2RlLmV4cGFuZCgpO31lbHNle2lmKG5vZGUucGFyZW50IT09cGFyZW50KXtjb25zdCBvbGRTZWxlY3Rpb249dGhpcy5fdHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudDtpZihub2RlLnBhcmVudCkKbm9kZS5wYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7cGFyZW50LmFwcGVuZENoaWxkKG5vZGUpO2lmKG9sZFNlbGVjdGlvbiE9PXRoaXMuX3RyZWVPdXRsaW5lLnNlbGVjdGVkVHJlZUVsZW1lbnQpCm9sZFNlbGVjdGlvbi5zZWxlY3QoKTt9Cm5vZGUuX3VwZGF0ZSgpO319CmlmKHJvb3QpCnRoaXMuX2xheWVyVHJlZS5mb3JFYWNoTGF5ZXIodXBkYXRlTGF5ZXIuYmluZCh0aGlzKSxyb290KTtjb25zdCByb290RWxlbWVudD10aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpO2ZvcihsZXQgbm9kZT1yb290RWxlbWVudC5maXJzdENoaWxkKCk7bm9kZSYmIW5vZGUucm9vdDspe2lmKHNlZW5MYXllcnMuZ2V0KG5vZGUuX2xheWVyKSl7bm9kZT1ub2RlLnRyYXZlcnNlTmV4dFRyZWVFbGVtZW50KGZhbHNlKTt9ZWxzZXtjb25zdCBuZXh0Tm9kZT1ub2RlLm5leHRTaWJsaW5nfHxub2RlLnBhcmVudDtub2RlLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtpZihub2RlPT09dGhpcy5fbGFzdEhvdmVyZWROb2RlKQp0aGlzLl9sYXN0SG92ZXJlZE5vZGU9bnVsbDtub2RlPW5leHROb2RlO319CmlmKCF0aGlzLl90cmVlT3V0bGluZS5zZWxlY3RlZFRyZWVFbGVtZW50KXtjb25zdCBlbGVtZW50VG9TZWxlY3Q9dGhpcy5fbGF5ZXJUcmVlLmNvbnRlbnRSb290KCl8fHRoaXMuX2xheWVyVHJlZS5yb290KCk7aWYoZWxlbWVudFRvU2VsZWN0KQplbGVtZW50VG9TZWxlY3RbTGF5ZXJWaWV3ZXIuTGF5ZXJUcmVlRWxlbWVudC5fc3ltYm9sXS5yZXZlYWxBbmRTZWxlY3QodHJ1ZSk7fX0KX29uTW91c2VNb3ZlKGV2ZW50KXtjb25zdCBub2RlPXRoaXMuX3RyZWVPdXRsaW5lLnRyZWVFbGVtZW50RnJvbUV2ZW50KGV2ZW50KTtpZihub2RlPT09dGhpcy5fbGFzdEhvdmVyZWROb2RlKQpyZXR1cm47dGhpcy5fbGF5ZXJWaWV3SG9zdC5ob3Zlck9iamVjdCh0aGlzLl9zZWxlY3Rpb25Gb3JOb2RlKG5vZGUpKTt9Cl9zZWxlY3RlZE5vZGVDaGFuZ2VkKG5vZGUpe3RoaXMuX2xheWVyVmlld0hvc3Quc2VsZWN0T2JqZWN0KHRoaXMuX3NlbGVjdGlvbkZvck5vZGUobm9kZSkpO30KX29uQ29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IHNlbGVjdGlvbj10aGlzLl9zZWxlY3Rpb25Gb3JOb2RlKHRoaXMuX3RyZWVPdXRsaW5lLnRyZWVFbGVtZW50RnJvbUV2ZW50KGV2ZW50KSk7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTt0aGlzLl9sYXllclZpZXdIb3N0LnNob3dDb250ZXh0TWVudShjb250ZXh0TWVudSxzZWxlY3Rpb24pO30KX3NlbGVjdGlvbkZvck5vZGUobm9kZSl7cmV0dXJuIG5vZGUmJm5vZGUuX2xheWVyP25ldyBMYXllclZpZXdlci5MYXllclZpZXcuTGF5ZXJTZWxlY3Rpb24obm9kZS5fbGF5ZXIpOm51bGw7fX07TGF5ZXJWaWV3ZXIuTGF5ZXJUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHRyZWUsbGF5ZXIpe3N1cGVyKCk7dGhpcy5fdHJlZU91dGxpbmU9dHJlZTt0aGlzLl9sYXllcj1sYXllcjt0aGlzLl9sYXllcltMYXllclZpZXdlci5MYXllclRyZWVFbGVtZW50Ll9zeW1ib2xdPXRoaXM7dGhpcy5fdXBkYXRlKCk7fQpfdXBkYXRlKCl7Y29uc3Qgbm9kZT10aGlzLl9sYXllci5ub2RlRm9yU2VsZk9yQW5jZXN0b3IoKTtjb25zdCB0aXRsZT1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dGl0bGUuY3JlYXRlVGV4dENoaWxkKG5vZGU/bm9kZS5zaW1wbGVTZWxlY3RvcigpOicjJyt0aGlzLl9sYXllci5pZCgpKTtjb25zdCBkZXRhaWxzPXRpdGxlLmNyZWF0ZUNoaWxkKCdzcGFuJywnZGltbWVkJyk7ZGV0YWlscy50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyAoJWQgw5cgJWQpJyx0aGlzLl9sYXllci53aWR0aCgpLHRoaXMuX2xheWVyLmhlaWdodCgpKTt0aGlzLnRpdGxlPXRpdGxlO30Kb25zZWxlY3QoKXt0aGlzLl90cmVlT3V0bGluZS5fc2VsZWN0ZWROb2RlQ2hhbmdlZCh0aGlzKTtyZXR1cm4gZmFsc2U7fQpzZXRIb3ZlcmVkKGhvdmVyZWQpe3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hvdmVyZWQnLGhvdmVyZWQpO319O0xheWVyVmlld2VyLkxheWVyVHJlZUVsZW1lbnQuX3N5bWJvbD1TeW1ib2woJ2xheWVyJyk7O0xheWVyVmlld2VyLkxheWVyVmlldz1mdW5jdGlvbigpe307TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LnByb3RvdHlwZT17aG92ZXJPYmplY3Qoc2VsZWN0aW9uKXt9LHNlbGVjdE9iamVjdChzZWxlY3Rpb24pe30sc2V0TGF5ZXJUcmVlKGxheWVyVHJlZSl7fX07TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbj1jbGFzc3tjb25zdHJ1Y3Rvcih0eXBlLGxheWVyKXt0aGlzLl90eXBlPXR5cGU7dGhpcy5fbGF5ZXI9bGF5ZXI7fQpzdGF0aWMgaXNFcXVhbChhLGIpe3JldHVybiBhJiZiP2EuX2lzRXF1YWwoYik6YT09PWI7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpsYXllcigpe3JldHVybiB0aGlzLl9sYXllcjt9Cl9pc0VxdWFsKG90aGVyKXtyZXR1cm4gZmFsc2U7fX07TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbi5UeXBlPXtMYXllcjpTeW1ib2woJ0xheWVyJyksU2Nyb2xsUmVjdDpTeW1ib2woJ1Njcm9sbFJlY3QnKSxTbmFwc2hvdDpTeW1ib2woJ1NuYXBzaG90Jyl9O0xheWVyVmlld2VyLkxheWVyVmlldy5MYXllclNlbGVjdGlvbj1jbGFzcyBleHRlbmRzIExheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb257Y29uc3RydWN0b3IobGF5ZXIpe2NvbnNvbGUuYXNzZXJ0KGxheWVyLCdMYXllclNlbGVjdGlvbiB3aXRoIGVtcHR5IGxheWVyJyk7c3VwZXIoTGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbi5UeXBlLkxheWVyLGxheWVyKTt9Cl9pc0VxdWFsKG90aGVyKXtyZXR1cm4gb3RoZXIuX3R5cGU9PT1MYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLlR5cGUuTGF5ZXImJm90aGVyLmxheWVyKCkuaWQoKT09PXRoaXMubGF5ZXIoKS5pZCgpO319O0xheWVyVmlld2VyLkxheWVyVmlldy5TY3JvbGxSZWN0U2VsZWN0aW9uPWNsYXNzIGV4dGVuZHMgTGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbntjb25zdHJ1Y3RvcihsYXllcixzY3JvbGxSZWN0SW5kZXgpe3N1cGVyKExheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb24uVHlwZS5TY3JvbGxSZWN0LGxheWVyKTt0aGlzLnNjcm9sbFJlY3RJbmRleD1zY3JvbGxSZWN0SW5kZXg7fQpfaXNFcXVhbChvdGhlcil7cmV0dXJuIG90aGVyLl90eXBlPT09TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbi5UeXBlLlNjcm9sbFJlY3QmJnRoaXMubGF5ZXIoKS5pZCgpPT09b3RoZXIubGF5ZXIoKS5pZCgpJiZ0aGlzLnNjcm9sbFJlY3RJbmRleD09PW90aGVyLnNjcm9sbFJlY3RJbmRleDt9fTtMYXllclZpZXdlci5MYXllclZpZXcuU25hcHNob3RTZWxlY3Rpb249Y2xhc3MgZXh0ZW5kcyBMYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9ue2NvbnN0cnVjdG9yKGxheWVyLHNuYXBzaG90KXtzdXBlcihMYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLlR5cGUuU25hcHNob3QsbGF5ZXIpO3RoaXMuX3NuYXBzaG90PXNuYXBzaG90O30KX2lzRXF1YWwob3RoZXIpe3JldHVybiBvdGhlci5fdHlwZT09PUxheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb24uVHlwZS5TbmFwc2hvdCYmdGhpcy5sYXllcigpLmlkKCk9PT1vdGhlci5sYXllcigpLmlkKCkmJnRoaXMuX3NuYXBzaG90PT09b3RoZXIuX3NuYXBzaG90O30Kc25hcHNob3QoKXtyZXR1cm4gdGhpcy5fc25hcHNob3Q7fX07TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3SG9zdD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3ZpZXdzPVtdO3RoaXMuX3NlbGVjdGVkT2JqZWN0PW51bGw7dGhpcy5faG92ZXJlZE9iamVjdD1udWxsO3RoaXMuX3Nob3dJbnRlcm5hbExheWVyc1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2xheWVyc1Nob3dJbnRlcm5hbExheWVycycsZmFsc2UpO30KcmVnaXN0ZXJWaWV3KGxheWVyVmlldyl7dGhpcy5fdmlld3MucHVzaChsYXllclZpZXcpO30Kc2V0TGF5ZXJUcmVlKGxheWVyVHJlZSl7dGhpcy5fdGFyZ2V0PWxheWVyVHJlZS50YXJnZXQoKTtjb25zdCBzZWxlY3RlZExheWVyPXRoaXMuX3NlbGVjdGVkT2JqZWN0JiZ0aGlzLl9zZWxlY3RlZE9iamVjdC5sYXllcigpO2lmKHNlbGVjdGVkTGF5ZXImJighbGF5ZXJUcmVlfHwhbGF5ZXJUcmVlLmxheWVyQnlJZChzZWxlY3RlZExheWVyLmlkKCkpKSkKdGhpcy5zZWxlY3RPYmplY3QobnVsbCk7Y29uc3QgaG92ZXJlZExheWVyPXRoaXMuX2hvdmVyZWRPYmplY3QmJnRoaXMuX2hvdmVyZWRPYmplY3QubGF5ZXIoKTtpZihob3ZlcmVkTGF5ZXImJighbGF5ZXJUcmVlfHwhbGF5ZXJUcmVlLmxheWVyQnlJZChob3ZlcmVkTGF5ZXIuaWQoKSkpKQp0aGlzLmhvdmVyT2JqZWN0KG51bGwpO2Zvcihjb25zdCB2aWV3IG9mIHRoaXMuX3ZpZXdzKQp2aWV3LnNldExheWVyVHJlZShsYXllclRyZWUpO30KaG92ZXJPYmplY3Qoc2VsZWN0aW9uKXtpZihMYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLmlzRXF1YWwodGhpcy5faG92ZXJlZE9iamVjdCxzZWxlY3Rpb24pKQpyZXR1cm47dGhpcy5faG92ZXJlZE9iamVjdD1zZWxlY3Rpb247Y29uc3QgbGF5ZXI9c2VsZWN0aW9uJiZzZWxlY3Rpb24ubGF5ZXIoKTt0aGlzLl90b2dnbGVOb2RlSGlnaGxpZ2h0KGxheWVyP2xheWVyLm5vZGVGb3JTZWxmT3JBbmNlc3RvcigpOm51bGwpO2Zvcihjb25zdCB2aWV3IG9mIHRoaXMuX3ZpZXdzKQp2aWV3LmhvdmVyT2JqZWN0KHNlbGVjdGlvbik7fQpzZWxlY3RPYmplY3Qoc2VsZWN0aW9uKXtpZihMYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLmlzRXF1YWwodGhpcy5fc2VsZWN0ZWRPYmplY3Qsc2VsZWN0aW9uKSkKcmV0dXJuO3RoaXMuX3NlbGVjdGVkT2JqZWN0PXNlbGVjdGlvbjtmb3IoY29uc3QgdmlldyBvZiB0aGlzLl92aWV3cykKdmlldy5zZWxlY3RPYmplY3Qoc2VsZWN0aW9uKTt9CnNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3RlZE9iamVjdDt9CnNob3dDb250ZXh0TWVudShjb250ZXh0TWVudSxzZWxlY3Rpb24pe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKENvbW1vbi5VSVN0cmluZygnU2hvdyBpbnRlcm5hbCBsYXllcnMnKSx0aGlzLl90b2dnbGVTaG93SW50ZXJuYWxMYXllcnMuYmluZCh0aGlzKSx0aGlzLl9zaG93SW50ZXJuYWxMYXllcnNTZXR0aW5nLmdldCgpKTtjb25zdCBub2RlPXNlbGVjdGlvbiYmc2VsZWN0aW9uLmxheWVyKCkmJnNlbGVjdGlvbi5sYXllcigpLm5vZGVGb3JTZWxmT3JBbmNlc3RvcigpO2lmKG5vZGUpCmNvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyhub2RlKTtjb250ZXh0TWVudS5zaG93KCk7fQpzaG93SW50ZXJuYWxMYXllcnNTZXR0aW5nKCl7cmV0dXJuIHRoaXMuX3Nob3dJbnRlcm5hbExheWVyc1NldHRpbmc7fQpfdG9nZ2xlU2hvd0ludGVybmFsTGF5ZXJzKCl7dGhpcy5fc2hvd0ludGVybmFsTGF5ZXJzU2V0dGluZy5zZXQoIXRoaXMuX3Nob3dJbnRlcm5hbExheWVyc1NldHRpbmcuZ2V0KCkpO30KX3RvZ2dsZU5vZGVIaWdobGlnaHQobm9kZSl7aWYobm9kZSl7bm9kZS5oaWdobGlnaHRGb3JUd29TZWNvbmRzKCk7cmV0dXJuO30KU0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO319OztMYXllclZpZXdlci5MYXllcnMzRFZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGxheWVyVmlld0hvc3Qpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbGF5ZXJfdmlld2VyL2xheWVyczNEVmlldy5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xheWVycy0zZC12aWV3Jyk7dGhpcy5fZmFpbEJhbm5lcj1uZXcgVUkuVkJveCgpO3RoaXMuX2ZhaWxCYW5uZXIuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmdWxsLXdpZGdldC1kaW1tZWQtYmFubmVyJyk7dGhpcy5fZmFpbEJhbm5lci5lbGVtZW50LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ0xheWVyIGluZm9ybWF0aW9uIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLicpKTt0aGlzLl9sYXllclZpZXdIb3N0PWxheWVyVmlld0hvc3Q7dGhpcy5fbGF5ZXJWaWV3SG9zdC5yZWdpc3RlclZpZXcodGhpcyk7dGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlcj1uZXcgTGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlcih0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLl90cmFuc2Zvcm1Db250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoTGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlci5FdmVudHMuVHJhbnNmb3JtQ2hhbmdlZCx0aGlzLl91cGRhdGUsdGhpcyk7dGhpcy5faW5pdFRvb2xiYXIoKTt0aGlzLl9jYW52YXNFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NhbnZhcycpO3RoaXMuX2NhbnZhc0VsZW1lbnQudGFiSW5kZXg9MDt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyx0aGlzLl9vbkRvdWJsZUNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9vbk1vdXNlRG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHRoaXMuX29uTW91c2VVcC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9vbkNvbnRleHRNZW51LmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2xhc3RTZWxlY3Rpb249e307dGhpcy5fbGF5ZXJUcmVlPW51bGw7dGhpcy5fdGV4dHVyZU1hbmFnZXI9bmV3IExheWVyVmlld2VyLkxheWVyVGV4dHVyZU1hbmFnZXIodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO3RoaXMuX2Nocm9tZVRleHR1cmVzPVtdO3RoaXMuX3JlY3RzPVtdO3RoaXMuX2xheWVyVmlld0hvc3Quc2hvd0ludGVybmFsTGF5ZXJzU2V0dGluZygpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZSx0aGlzKTt9CnNldExheWVyVHJlZShsYXllclRyZWUpe3RoaXMuX2xheWVyVHJlZT1sYXllclRyZWU7dGhpcy5fbGF5ZXJUZXh0dXJlPW51bGw7ZGVsZXRlIHRoaXMuX29sZFRleHR1cmVTY2FsZTtpZih0aGlzLl9zaG93UGFpbnRzKCkpCnRoaXMuX3RleHR1cmVNYW5hZ2VyLnNldExheWVyVHJlZShsYXllclRyZWUpO3RoaXMuX3VwZGF0ZSgpO30Kc2hvd0ltYWdlRm9yTGF5ZXIobGF5ZXIsaW1hZ2VVUkwpe2lmKCFpbWFnZVVSTCl7dGhpcy5fbGF5ZXJUZXh0dXJlPW51bGw7dGhpcy5fdXBkYXRlKCk7cmV0dXJuO30KVUkubG9hZEltYWdlKGltYWdlVVJMKS50aGVuKGltYWdlPT57Y29uc3QgdGV4dHVyZT1pbWFnZSYmTGF5ZXJWaWV3ZXIuTGF5ZXJUZXh0dXJlTWFuYWdlci5fY3JlYXRlVGV4dHVyZUZvckltYWdlKHRoaXMuX2dsLGltYWdlKTt0aGlzLl9sYXllclRleHR1cmU9dGV4dHVyZT97bGF5ZXI6bGF5ZXIsdGV4dHVyZTp0ZXh0dXJlfTpudWxsO3RoaXMuX3VwZGF0ZSgpO30pO30Kb25SZXNpemUoKXt0aGlzLl9yZXNpemVDYW52YXMoKTt0aGlzLl91cGRhdGUoKTt9CndpbGxIaWRlKCl7dGhpcy5fdGV4dHVyZU1hbmFnZXIuc3VzcGVuZCgpO30Kd2FzU2hvd24oKXt0aGlzLl90ZXh0dXJlTWFuYWdlci5yZXN1bWUoKTtpZighdGhpcy5fbmVlZHNVcGRhdGUpCnJldHVybjt0aGlzLl9yZXNpemVDYW52YXMoKTt0aGlzLl91cGRhdGUoKTt9CnVwZGF0ZUxheWVyU25hcHNob3QobGF5ZXIpe3RoaXMuX3RleHR1cmVNYW5hZ2VyLmxheWVyTmVlZHNVcGRhdGUobGF5ZXIpO30KX3NldE91dGxpbmUodHlwZSxzZWxlY3Rpb24pe3RoaXMuX2xhc3RTZWxlY3Rpb25bdHlwZV09c2VsZWN0aW9uO3RoaXMuX3VwZGF0ZSgpO30KaG92ZXJPYmplY3Qoc2VsZWN0aW9uKXt0aGlzLl9zZXRPdXRsaW5lKExheWVyVmlld2VyLkxheWVyczNEVmlldy5PdXRsaW5lVHlwZS5Ib3ZlcmVkLHNlbGVjdGlvbik7fQpzZWxlY3RPYmplY3Qoc2VsZWN0aW9uKXt0aGlzLl9zZXRPdXRsaW5lKExheWVyVmlld2VyLkxheWVyczNEVmlldy5PdXRsaW5lVHlwZS5Ib3ZlcmVkLG51bGwpO3RoaXMuX3NldE91dGxpbmUoTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3Lk91dGxpbmVUeXBlLlNlbGVjdGVkLHNlbGVjdGlvbik7fQpzbmFwc2hvdEZvclNlbGVjdGlvbihzZWxlY3Rpb24pe2lmKHNlbGVjdGlvbi50eXBlKCk9PT1MYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLlR5cGUuU25hcHNob3Qpe2NvbnN0IHNuYXBzaG90V2l0aFJlY3Q9KHNlbGVjdGlvbikuc25hcHNob3QoKTtzbmFwc2hvdFdpdGhSZWN0LnNuYXBzaG90LmFkZFJlZmVyZW5jZSgpO3JldHVybihQcm9taXNlLnJlc29sdmUoc25hcHNob3RXaXRoUmVjdCkpO30KaWYoc2VsZWN0aW9uLmxheWVyKCkpe2NvbnN0IHByb21pc2U9c2VsZWN0aW9uLmxheWVyKCkuc25hcHNob3RzKClbMF07aWYocHJvbWlzZSkKcmV0dXJuIHByb21pc2U7fQpyZXR1cm4oUHJvbWlzZS5yZXNvbHZlKG51bGwpKTt9Cl9pbml0R0woY2FudmFzKXtjb25zdCBnbD1jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKTtpZighZ2wpCnJldHVybiBudWxsO2dsLmJsZW5kRnVuYyhnbC5TUkNfQUxQSEEsZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7Z2wuZW5hYmxlKGdsLkJMRU5EKTtnbC5jbGVhckNvbG9yKDAuMCwwLjAsMC4wLDAuMCk7Z2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO3JldHVybiBnbDt9Cl9jcmVhdGVTaGFkZXIodHlwZSxzY3JpcHQpe2NvbnN0IHNoYWRlcj10aGlzLl9nbC5jcmVhdGVTaGFkZXIodHlwZSk7dGhpcy5fZ2wuc2hhZGVyU291cmNlKHNoYWRlcixzY3JpcHQpO3RoaXMuX2dsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTt0aGlzLl9nbC5hdHRhY2hTaGFkZXIodGhpcy5fc2hhZGVyUHJvZ3JhbSxzaGFkZXIpO30KX2luaXRTaGFkZXJzKCl7dGhpcy5fc2hhZGVyUHJvZ3JhbT10aGlzLl9nbC5jcmVhdGVQcm9ncmFtKCk7dGhpcy5fY3JlYXRlU2hhZGVyKHRoaXMuX2dsLkZSQUdNRU5UX1NIQURFUixMYXllclZpZXdlci5MYXllcnMzRFZpZXcuRnJhZ21lbnRTaGFkZXIpO3RoaXMuX2NyZWF0ZVNoYWRlcih0aGlzLl9nbC5WRVJURVhfU0hBREVSLExheWVyVmlld2VyLkxheWVyczNEVmlldy5WZXJ0ZXhTaGFkZXIpO3RoaXMuX2dsLmxpbmtQcm9ncmFtKHRoaXMuX3NoYWRlclByb2dyYW0pO3RoaXMuX2dsLnVzZVByb2dyYW0odGhpcy5fc2hhZGVyUHJvZ3JhbSk7dGhpcy5fc2hhZGVyUHJvZ3JhbS52ZXJ0ZXhQb3NpdGlvbkF0dHJpYnV0ZT10aGlzLl9nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLl9zaGFkZXJQcm9ncmFtLCdhVmVydGV4UG9zaXRpb24nKTt0aGlzLl9nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLl9zaGFkZXJQcm9ncmFtLnZlcnRleFBvc2l0aW9uQXR0cmlidXRlKTt0aGlzLl9zaGFkZXJQcm9ncmFtLnZlcnRleENvbG9yQXR0cmlidXRlPXRoaXMuX2dsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuX3NoYWRlclByb2dyYW0sJ2FWZXJ0ZXhDb2xvcicpO3RoaXMuX2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMuX3NoYWRlclByb2dyYW0udmVydGV4Q29sb3JBdHRyaWJ1dGUpO3RoaXMuX3NoYWRlclByb2dyYW0udGV4dHVyZUNvb3JkQXR0cmlidXRlPXRoaXMuX2dsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuX3NoYWRlclByb2dyYW0sJ2FUZXh0dXJlQ29vcmQnKTt0aGlzLl9nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLl9zaGFkZXJQcm9ncmFtLnRleHR1cmVDb29yZEF0dHJpYnV0ZSk7dGhpcy5fc2hhZGVyUHJvZ3JhbS5wTWF0cml4VW5pZm9ybT10aGlzLl9nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5fc2hhZGVyUHJvZ3JhbSwndVBNYXRyaXgnKTt0aGlzLl9zaGFkZXJQcm9ncmFtLnNhbXBsZXJVbmlmb3JtPXRoaXMuX2dsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLl9zaGFkZXJQcm9ncmFtLCd1U2FtcGxlcicpO30KX3Jlc2l6ZUNhbnZhcygpe3RoaXMuX2NhbnZhc0VsZW1lbnQud2lkdGg9dGhpcy5fY2FudmFzRWxlbWVudC5vZmZzZXRXaWR0aCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9jYW52YXNFbGVtZW50LmhlaWdodD10aGlzLl9jYW52YXNFbGVtZW50Lm9mZnNldEhlaWdodCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt9Cl91cGRhdGVUcmFuc2Zvcm1BbmRDb25zdHJhaW50cygpe2NvbnN0IHBhZGRpbmdGcmFjdGlvbj0wLjE7Y29uc3Qgdmlld3BvcnQ9dGhpcy5fbGF5ZXJUcmVlLnZpZXdwb3J0U2l6ZSgpO2NvbnN0IGJhc2VXaWR0aD12aWV3cG9ydD92aWV3cG9ydC53aWR0aDp0aGlzLl9kaW1lbnNpb25zRm9yQXV0b3NjYWxlLndpZHRoO2NvbnN0IGJhc2VIZWlnaHQ9dmlld3BvcnQ/dmlld3BvcnQuaGVpZ2h0OnRoaXMuX2RpbWVuc2lvbnNGb3JBdXRvc2NhbGUuaGVpZ2h0O2NvbnN0IGNhbnZhc1dpZHRoPXRoaXMuX2NhbnZhc0VsZW1lbnQud2lkdGg7Y29uc3QgY2FudmFzSGVpZ2h0PXRoaXMuX2NhbnZhc0VsZW1lbnQuaGVpZ2h0O2NvbnN0IHBhZGRpbmdYPWNhbnZhc1dpZHRoKnBhZGRpbmdGcmFjdGlvbjtjb25zdCBwYWRkaW5nWT1jYW52YXNIZWlnaHQqcGFkZGluZ0ZyYWN0aW9uO2NvbnN0IHNjYWxlWD0oY2FudmFzV2lkdGgtMipwYWRkaW5nWCkvYmFzZVdpZHRoO2NvbnN0IHNjYWxlWT0oY2FudmFzSGVpZ2h0LTIqcGFkZGluZ1kpL2Jhc2VIZWlnaHQ7Y29uc3Qgdmlld1NjYWxlPU1hdGgubWluKHNjYWxlWCxzY2FsZVkpO2NvbnN0IG1pblNjYWxlQ29uc3RyYWludD1NYXRoLm1pbihiYXNlV2lkdGgvdGhpcy5fZGltZW5zaW9uc0ZvckF1dG9zY2FsZS53aWR0aCxiYXNlSGVpZ2h0L3RoaXMuX2RpbWVuc2lvbnNGb3JBdXRvc2NhbGUud2lkdGgpLzI7dGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5zZXRTY2FsZUNvbnN0cmFpbnRzKG1pblNjYWxlQ29uc3RyYWludCwxMC92aWV3U2NhbGUpO2NvbnN0IHNjYWxlPXRoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIuc2NhbGUoKTtjb25zdCByb3RhdGVYPXRoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIucm90YXRlWCgpO2NvbnN0IHJvdGF0ZVk9dGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5yb3RhdGVZKCk7dGhpcy5fc2NhbGU9c2NhbGUqdmlld1NjYWxlO2NvbnN0IHRleHR1cmVTY2FsZT1OdW1iZXIuY29uc3RyYWluKHRoaXMuX3NjYWxlLDAuMSwxKTtpZih0ZXh0dXJlU2NhbGUhPT10aGlzLl9vbGRUZXh0dXJlU2NhbGUpe3RoaXMuX29sZFRleHR1cmVTY2FsZT10ZXh0dXJlU2NhbGU7dGhpcy5fdGV4dHVyZU1hbmFnZXIuc2V0U2NhbGUodGV4dHVyZVNjYWxlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhMYXllclZpZXdlci5MYXllcnMzRFZpZXcuRXZlbnRzLlNjYWxlQ2hhbmdlZCx0ZXh0dXJlU2NhbGUpO30KY29uc3Qgc2NhbGVBbmRSb3RhdGlvbk1hdHJpeD1uZXcgV2ViS2l0Q1NTTWF0cml4KCkuc2NhbGUoc2NhbGUsc2NhbGUsc2NhbGUpLnRyYW5zbGF0ZShjYW52YXNXaWR0aC8yLGNhbnZhc0hlaWdodC8yLDApLnJvdGF0ZShyb3RhdGVYLHJvdGF0ZVksMCkuc2NhbGUodmlld1NjYWxlLHZpZXdTY2FsZSx2aWV3U2NhbGUpLnRyYW5zbGF0ZSgtYmFzZVdpZHRoLzIsLWJhc2VIZWlnaHQvMiwwKTtsZXQgYm91bmRzO2ZvcihsZXQgaT0wO2k8dGhpcy5fcmVjdHMubGVuZ3RoOysraSkKYm91bmRzPVVJLkdlb21ldHJ5LmJvdW5kc0ZvclRyYW5zZm9ybWVkUG9pbnRzKHNjYWxlQW5kUm90YXRpb25NYXRyaXgsdGhpcy5fcmVjdHNbaV0udmVydGljZXMsYm91bmRzKTt0aGlzLl90cmFuc2Zvcm1Db250cm9sbGVyLmNsYW1wT2Zmc2V0cygocGFkZGluZ1gtYm91bmRzLm1heFgpL3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLChjYW52YXNXaWR0aC1wYWRkaW5nWC1ib3VuZHMubWluWCkvd2luZG93LmRldmljZVBpeGVsUmF0aW8sKHBhZGRpbmdZLWJvdW5kcy5tYXhZKS93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywoY2FudmFzSGVpZ2h0LXBhZGRpbmdZLWJvdW5kcy5taW5ZKS93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7Y29uc3Qgb2Zmc2V0WD10aGlzLl90cmFuc2Zvcm1Db250cm9sbGVyLm9mZnNldFgoKSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCBvZmZzZXRZPXRoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIub2Zmc2V0WSgpKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX3Byb2plY3Rpb25NYXRyaXg9bmV3IFdlYktpdENTU01hdHJpeCgpLnRyYW5zbGF0ZShvZmZzZXRYLG9mZnNldFksMCkubXVsdGlwbHkoc2NhbGVBbmRSb3RhdGlvbk1hdHJpeCk7Y29uc3QgZ2xQcm9qZWN0aW9uTWF0cml4PW5ldyBXZWJLaXRDU1NNYXRyaXgoKS5zY2FsZSgxLC0xLC0xKS50cmFuc2xhdGUoLTEsLTEsMCkuc2NhbGUoMi90aGlzLl9jYW52YXNFbGVtZW50LndpZHRoLDIvdGhpcy5fY2FudmFzRWxlbWVudC5oZWlnaHQsMS8xMDAwMDAwKS5tdWx0aXBseSh0aGlzLl9wcm9qZWN0aW9uTWF0cml4KTt0aGlzLl9nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuX3NoYWRlclByb2dyYW0ucE1hdHJpeFVuaWZvcm0sZmFsc2UsdGhpcy5fYXJyYXlGcm9tTWF0cml4KGdsUHJvamVjdGlvbk1hdHJpeCkpO30KX2FycmF5RnJvbU1hdHJpeChtKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbbS5tMTEsbS5tMTIsbS5tMTMsbS5tMTQsbS5tMjEsbS5tMjIsbS5tMjMsbS5tMjQsbS5tMzEsbS5tMzIsbS5tMzMsbS5tMzQsbS5tNDEsbS5tNDIsbS5tNDMsbS5tNDRdKTt9Cl9pbml0V2hpdGVUZXh0dXJlKCl7dGhpcy5fd2hpdGVUZXh0dXJlPXRoaXMuX2dsLmNyZWF0ZVRleHR1cmUoKTt0aGlzLl9nbC5iaW5kVGV4dHVyZSh0aGlzLl9nbC5URVhUVVJFXzJELHRoaXMuX3doaXRlVGV4dHVyZSk7Y29uc3Qgd2hpdGVQaXhlbD1uZXcgVWludDhBcnJheShbMjU1LDI1NSwyNTUsMjU1XSk7dGhpcy5fZ2wudGV4SW1hZ2UyRCh0aGlzLl9nbC5URVhUVVJFXzJELDAsdGhpcy5fZ2wuUkdCQSwxLDEsMCx0aGlzLl9nbC5SR0JBLHRoaXMuX2dsLlVOU0lHTkVEX0JZVEUsd2hpdGVQaXhlbCk7fQpfaW5pdENocm9tZVRleHR1cmVzKCl7ZnVuY3Rpb24gbG9hZENocm9tZVRleHR1cmUoaW5kZXgsdXJsKXtVSS5sb2FkSW1hZ2UodXJsKS50aGVuKGltYWdlPT57dGhpcy5fY2hyb21lVGV4dHVyZXNbaW5kZXhdPWltYWdlJiZMYXllclZpZXdlci5MYXllclRleHR1cmVNYW5hZ2VyLl9jcmVhdGVUZXh0dXJlRm9ySW1hZ2UodGhpcy5fZ2wsaW1hZ2UpfHx1bmRlZmluZWQ7fSk7fQpsb2FkQ2hyb21lVGV4dHVyZS5jYWxsKHRoaXMsTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkNocm9tZVRleHR1cmUuTGVmdCwnSW1hZ2VzL2Nocm9tZUxlZnQucG5nJyk7bG9hZENocm9tZVRleHR1cmUuY2FsbCh0aGlzLExheWVyVmlld2VyLkxheWVyczNEVmlldy5DaHJvbWVUZXh0dXJlLk1pZGRsZSwnSW1hZ2VzL2Nocm9tZU1pZGRsZS5wbmcnKTtsb2FkQ2hyb21lVGV4dHVyZS5jYWxsKHRoaXMsTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkNocm9tZVRleHR1cmUuUmlnaHQsJ0ltYWdlcy9jaHJvbWVSaWdodC5wbmcnKTt9Cl9pbml0R0xJZk5lY2Vzc2FyeSgpe2lmKHRoaXMuX2dsKQpyZXR1cm4gdGhpcy5fZ2w7dGhpcy5fZ2w9dGhpcy5faW5pdEdMKHRoaXMuX2NhbnZhc0VsZW1lbnQpO2lmKCF0aGlzLl9nbCkKcmV0dXJuIG51bGw7dGhpcy5faW5pdFNoYWRlcnMoKTt0aGlzLl9pbml0V2hpdGVUZXh0dXJlKCk7dGhpcy5faW5pdENocm9tZVRleHR1cmVzKCk7dGhpcy5fdGV4dHVyZU1hbmFnZXIuc2V0Q29udGV4dCh0aGlzLl9nbCk7cmV0dXJuIHRoaXMuX2dsO30KX2NhbGN1bGF0ZURlcHRoc0FuZFZpc2liaWxpdHkoKXt0aGlzLl9kZXB0aEJ5TGF5ZXJJZD17fTtsZXQgZGVwdGg9MDtjb25zdCBzaG93SW50ZXJuYWxMYXllcnM9dGhpcy5fbGF5ZXJWaWV3SG9zdC5zaG93SW50ZXJuYWxMYXllcnNTZXR0aW5nKCkuZ2V0KCk7Y29uc3Qgcm9vdD1zaG93SW50ZXJuYWxMYXllcnM/dGhpcy5fbGF5ZXJUcmVlLnJvb3QoKToodGhpcy5fbGF5ZXJUcmVlLmNvbnRlbnRSb290KCl8fHRoaXMuX2xheWVyVHJlZS5yb290KCkpO2NvbnN0IHF1ZXVlPVtyb290XTt0aGlzLl9kZXB0aEJ5TGF5ZXJJZFtyb290LmlkKCldPTA7dGhpcy5fdmlzaWJsZUxheWVycz1uZXcgU2V0KCk7d2hpbGUocXVldWUubGVuZ3RoPjApe2NvbnN0IGxheWVyPXF1ZXVlLnNoaWZ0KCk7aWYoc2hvd0ludGVybmFsTGF5ZXJzfHxsYXllci5kcmF3c0NvbnRlbnQoKSkKdGhpcy5fdmlzaWJsZUxheWVycy5hZGQobGF5ZXIpO2NvbnN0IGNoaWxkcmVuPWxheWVyLmNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxjaGlsZHJlbi5sZW5ndGg7KytpKXt0aGlzLl9kZXB0aEJ5TGF5ZXJJZFtjaGlsZHJlbltpXS5pZCgpXT0rK2RlcHRoO3F1ZXVlLnB1c2goY2hpbGRyZW5baV0pO319CnRoaXMuX21heERlcHRoPWRlcHRoO30KX2RlcHRoRm9yTGF5ZXIobGF5ZXIpe3JldHVybiB0aGlzLl9kZXB0aEJ5TGF5ZXJJZFtsYXllci5pZCgpXSpMYXllclZpZXdlci5MYXllcnMzRFZpZXcuTGF5ZXJTcGFjaW5nO30KX2NhbGN1bGF0ZVNjcm9sbFJlY3REZXB0aChsYXllcixpbmRleCl7cmV0dXJuIHRoaXMuX2RlcHRoRm9yTGF5ZXIobGF5ZXIpK2luZGV4KkxheWVyVmlld2VyLkxheWVyczNEVmlldy5TY3JvbGxSZWN0U3BhY2luZysxO30KX3VwZGF0ZURpbWVuc2lvbnNGb3JBdXRvc2NhbGUobGF5ZXIpe3RoaXMuX2RpbWVuc2lvbnNGb3JBdXRvc2NhbGUud2lkdGg9TWF0aC5tYXgobGF5ZXIud2lkdGgoKSx0aGlzLl9kaW1lbnNpb25zRm9yQXV0b3NjYWxlLndpZHRoKTt0aGlzLl9kaW1lbnNpb25zRm9yQXV0b3NjYWxlLmhlaWdodD1NYXRoLm1heChsYXllci5oZWlnaHQoKSx0aGlzLl9kaW1lbnNpb25zRm9yQXV0b3NjYWxlLmhlaWdodCk7fQpfY2FsY3VsYXRlTGF5ZXJSZWN0KGxheWVyKXtpZighdGhpcy5fdmlzaWJsZUxheWVycy5oYXMobGF5ZXIpKQpyZXR1cm47Y29uc3Qgc2VsZWN0aW9uPW5ldyBMYXllclZpZXdlci5MYXllclZpZXcuTGF5ZXJTZWxlY3Rpb24obGF5ZXIpO2NvbnN0IHJlY3Q9bmV3IExheWVyVmlld2VyLkxheWVyczNEVmlldy5SZWN0YW5nbGUoc2VsZWN0aW9uKTtyZWN0LnNldFZlcnRpY2VzKGxheWVyLnF1YWQoKSx0aGlzLl9kZXB0aEZvckxheWVyKGxheWVyKSk7dGhpcy5fYXBwZW5kUmVjdChyZWN0KTt0aGlzLl91cGRhdGVEaW1lbnNpb25zRm9yQXV0b3NjYWxlKGxheWVyKTt9Cl9hcHBlbmRSZWN0KHJlY3Qpe2NvbnN0IHNlbGVjdGlvbj1yZWN0LnJlbGF0ZWRPYmplY3Q7Y29uc3QgaXNTZWxlY3RlZD1MYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLmlzRXF1YWwodGhpcy5fbGFzdFNlbGVjdGlvbltMYXllclZpZXdlci5MYXllcnMzRFZpZXcuT3V0bGluZVR5cGUuU2VsZWN0ZWRdLHNlbGVjdGlvbik7Y29uc3QgaXNIb3ZlcmVkPUxheWVyVmlld2VyLkxheWVyVmlldy5TZWxlY3Rpb24uaXNFcXVhbCh0aGlzLl9sYXN0U2VsZWN0aW9uW0xheWVyVmlld2VyLkxheWVyczNEVmlldy5PdXRsaW5lVHlwZS5Ib3ZlcmVkXSxzZWxlY3Rpb24pO2lmKGlzU2VsZWN0ZWQpe3JlY3QuYm9yZGVyQ29sb3I9TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlNlbGVjdGVkQm9yZGVyQ29sb3I7fWVsc2UgaWYoaXNIb3ZlcmVkKXtyZWN0LmJvcmRlckNvbG9yPUxheWVyVmlld2VyLkxheWVyczNEVmlldy5Ib3ZlcmVkQm9yZGVyQ29sb3I7Y29uc3QgZmlsbENvbG9yPXJlY3QuZmlsbENvbG9yfHxbMjU1LDI1NSwyNTUsMV07Y29uc3QgbWFza0NvbG9yPUxheWVyVmlld2VyLkxheWVyczNEVmlldy5Ib3ZlcmVkSW1hZ2VNYXNrQ29sb3I7cmVjdC5maWxsQ29sb3I9W2ZpbGxDb2xvclswXSptYXNrQ29sb3JbMF0vMjU1LGZpbGxDb2xvclsxXSptYXNrQ29sb3JbMV0vMjU1LGZpbGxDb2xvclsyXSptYXNrQ29sb3JbMl0vMjU1LGZpbGxDb2xvclszXSptYXNrQ29sb3JbM11dO31lbHNle3JlY3QuYm9yZGVyQ29sb3I9TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkJvcmRlckNvbG9yO30KcmVjdC5saW5lV2lkdGg9aXNTZWxlY3RlZD9MYXllclZpZXdlci5MYXllcnMzRFZpZXcuU2VsZWN0ZWRCb3JkZXJXaWR0aDpMYXllclZpZXdlci5MYXllcnMzRFZpZXcuQm9yZGVyV2lkdGg7dGhpcy5fcmVjdHMucHVzaChyZWN0KTt9Cl9jYWxjdWxhdGVMYXllclNjcm9sbFJlY3RzKGxheWVyKXtjb25zdCBzY3JvbGxSZWN0cz1sYXllci5zY3JvbGxSZWN0cygpO2ZvcihsZXQgaT0wO2k8c2Nyb2xsUmVjdHMubGVuZ3RoOysraSl7Y29uc3Qgc2VsZWN0aW9uPW5ldyBMYXllclZpZXdlci5MYXllclZpZXcuU2Nyb2xsUmVjdFNlbGVjdGlvbihsYXllcixpKTtjb25zdCByZWN0PW5ldyBMYXllclZpZXdlci5MYXllcnMzRFZpZXcuUmVjdGFuZ2xlKHNlbGVjdGlvbik7cmVjdC5jYWxjdWxhdGVWZXJ0aWNlc0Zyb21SZWN0KGxheWVyLHNjcm9sbFJlY3RzW2ldLnJlY3QsdGhpcy5fY2FsY3VsYXRlU2Nyb2xsUmVjdERlcHRoKGxheWVyLGkpKTtyZWN0LmZpbGxDb2xvcj1MYXllclZpZXdlci5MYXllcnMzRFZpZXcuU2Nyb2xsUmVjdEJhY2tncm91bmRDb2xvcjt0aGlzLl9hcHBlbmRSZWN0KHJlY3QpO319Cl9jYWxjdWxhdGVMYXllclRpbGVSZWN0cyhsYXllcil7Y29uc3QgdGlsZXM9dGhpcy5fdGV4dHVyZU1hbmFnZXIudGlsZXNGb3JMYXllcihsYXllcik7Zm9yKGxldCBpPTA7aTx0aWxlcy5sZW5ndGg7KytpKXtjb25zdCB0aWxlPXRpbGVzW2ldO2lmKCF0aWxlLnRleHR1cmUpCmNvbnRpbnVlO2NvbnN0IHNlbGVjdGlvbj1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNuYXBzaG90U2VsZWN0aW9uKGxheWVyLHtyZWN0OnRpbGUucmVjdCxzbmFwc2hvdDp0aWxlLnNuYXBzaG90fSk7Y29uc3QgcmVjdD1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlJlY3RhbmdsZShzZWxlY3Rpb24pO3JlY3QuY2FsY3VsYXRlVmVydGljZXNGcm9tUmVjdChsYXllcix0aWxlLnJlY3QsdGhpcy5fZGVwdGhGb3JMYXllcihsYXllcikrMSk7cmVjdC50ZXh0dXJlPXRpbGUudGV4dHVyZTt0aGlzLl9hcHBlbmRSZWN0KHJlY3QpO319Cl9jYWxjdWxhdGVSZWN0cygpe3RoaXMuX3JlY3RzPVtdO3RoaXMuX2RpbWVuc2lvbnNGb3JBdXRvc2NhbGU9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMuX2xheWVyVHJlZS5mb3JFYWNoTGF5ZXIodGhpcy5fY2FsY3VsYXRlTGF5ZXJSZWN0LmJpbmQodGhpcykpO2lmKHRoaXMuX3Nob3dTbG93U2Nyb2xsUmVjdHNTZXR0aW5nLmdldCgpKQp0aGlzLl9sYXllclRyZWUuZm9yRWFjaExheWVyKHRoaXMuX2NhbGN1bGF0ZUxheWVyU2Nyb2xsUmVjdHMuYmluZCh0aGlzKSk7aWYodGhpcy5fbGF5ZXJUZXh0dXJlJiZ0aGlzLl92aXNpYmxlTGF5ZXJzLmhhcyh0aGlzLl9sYXllclRleHR1cmUubGF5ZXIpKXtjb25zdCBsYXllcj10aGlzLl9sYXllclRleHR1cmUubGF5ZXI7Y29uc3Qgc2VsZWN0aW9uPW5ldyBMYXllclZpZXdlci5MYXllclZpZXcuTGF5ZXJTZWxlY3Rpb24obGF5ZXIpO2NvbnN0IHJlY3Q9bmV3IExheWVyVmlld2VyLkxheWVyczNEVmlldy5SZWN0YW5nbGUoc2VsZWN0aW9uKTtyZWN0LnNldFZlcnRpY2VzKGxheWVyLnF1YWQoKSx0aGlzLl9kZXB0aEZvckxheWVyKGxheWVyKSk7cmVjdC50ZXh0dXJlPXRoaXMuX2xheWVyVGV4dHVyZS50ZXh0dXJlO3RoaXMuX2FwcGVuZFJlY3QocmVjdCk7fWVsc2UgaWYodGhpcy5fc2hvd1BhaW50cygpKXt0aGlzLl9sYXllclRyZWUuZm9yRWFjaExheWVyKHRoaXMuX2NhbGN1bGF0ZUxheWVyVGlsZVJlY3RzLmJpbmQodGhpcykpO319Cl9tYWtlQ29sb3JzQXJyYXkoY29sb3Ipe2xldCBjb2xvcnM9W107Y29uc3Qgbm9ybWFsaXplZENvbG9yPVtjb2xvclswXS8yNTUsY29sb3JbMV0vMjU1LGNvbG9yWzJdLzI1NSxjb2xvclszXV07Zm9yKGxldCBpPTA7aTw0O2krKykKY29sb3JzPWNvbG9ycy5jb25jYXQobm9ybWFsaXplZENvbG9yKTtyZXR1cm4gY29sb3JzO30KX3NldFZlcnRleEF0dHJpYnV0ZShhdHRyaWJ1dGUsYXJyYXksbGVuZ3RoKXtjb25zdCBnbD10aGlzLl9nbDtjb25zdCBidWZmZXI9Z2wuY3JlYXRlQnVmZmVyKCk7Z2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsYnVmZmVyKTtnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUixuZXcgRmxvYXQzMkFycmF5KGFycmF5KSxnbC5TVEFUSUNfRFJBVyk7Z2wudmVydGV4QXR0cmliUG9pbnRlcihhdHRyaWJ1dGUsbGVuZ3RoLGdsLkZMT0FULGZhbHNlLDAsMCk7fQpfZHJhd1JlY3RhbmdsZSh2ZXJ0aWNlcyxtb2RlLGNvbG9yLHRleHR1cmUpe2NvbnN0IGdsPXRoaXMuX2dsO2NvbnN0IHdoaXRlPVsyNTUsMjU1LDI1NSwxXTtjb2xvcj1jb2xvcnx8d2hpdGU7dGhpcy5fc2V0VmVydGV4QXR0cmlidXRlKHRoaXMuX3NoYWRlclByb2dyYW0udmVydGV4UG9zaXRpb25BdHRyaWJ1dGUsdmVydGljZXMsMyk7dGhpcy5fc2V0VmVydGV4QXR0cmlidXRlKHRoaXMuX3NoYWRlclByb2dyYW0udGV4dHVyZUNvb3JkQXR0cmlidXRlLFswLDEsMSwxLDEsMCwwLDBdLDIpO3RoaXMuX3NldFZlcnRleEF0dHJpYnV0ZSh0aGlzLl9zaGFkZXJQcm9ncmFtLnZlcnRleENvbG9yQXR0cmlidXRlLHRoaXMuX21ha2VDb2xvcnNBcnJheShjb2xvciksY29sb3IubGVuZ3RoKTtpZih0ZXh0dXJlKXtnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELHRleHR1cmUpO2dsLnVuaWZvcm0xaSh0aGlzLl9zaGFkZXJQcm9ncmFtLnNhbXBsZXJVbmlmb3JtLDApO31lbHNle2dsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsdGhpcy5fd2hpdGVUZXh0dXJlKTt9CmNvbnN0IG51bWJlck9mVmVydGljZXM9dmVydGljZXMubGVuZ3RoLzM7Z2wuZHJhd0FycmF5cyhtb2RlLDAsbnVtYmVyT2ZWZXJ0aWNlcyk7fQpfZHJhd1RleHR1cmUodmVydGljZXMsdGV4dHVyZSxjb2xvcil7dGhpcy5fZHJhd1JlY3RhbmdsZSh2ZXJ0aWNlcyx0aGlzLl9nbC5UUklBTkdMRV9GQU4sY29sb3IsdGV4dHVyZSk7fQpfZHJhd1ZpZXdwb3J0QW5kQ2hyb21lKCl7Y29uc3Qgdmlld3BvcnQ9dGhpcy5fbGF5ZXJUcmVlLnZpZXdwb3J0U2l6ZSgpO2lmKCF2aWV3cG9ydCkKcmV0dXJuO2NvbnN0IGRyYXdDaHJvbWU9IUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdmcmFtZVZpZXdlckhpZGVDaHJvbWVXaW5kb3cnKS5nZXQoKSYmdGhpcy5fY2hyb21lVGV4dHVyZXMubGVuZ3RoPj0zJiZ0aGlzLl9jaHJvbWVUZXh0dXJlcy5pbmRleE9mKHVuZGVmaW5lZCk8MDtjb25zdCB6PSh0aGlzLl9tYXhEZXB0aCsxKSpMYXllclZpZXdlci5MYXllcnMzRFZpZXcuTGF5ZXJTcGFjaW5nO2NvbnN0IGJvcmRlcldpZHRoPU1hdGguY2VpbChMYXllclZpZXdlci5MYXllcnMzRFZpZXcuVmlld3BvcnRCb3JkZXJXaWR0aCp0aGlzLl9zY2FsZSk7bGV0IHZlcnRpY2VzPVt2aWV3cG9ydC53aWR0aCwwLHosdmlld3BvcnQud2lkdGgsdmlld3BvcnQuaGVpZ2h0LHosMCx2aWV3cG9ydC5oZWlnaHQseiwwLDAsel07dGhpcy5fZ2wubGluZVdpZHRoKGJvcmRlcldpZHRoKTt0aGlzLl9kcmF3UmVjdGFuZ2xlKHZlcnRpY2VzLGRyYXdDaHJvbWU/dGhpcy5fZ2wuTElORV9TVFJJUDp0aGlzLl9nbC5MSU5FX0xPT1AsTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlZpZXdwb3J0Qm9yZGVyQ29sb3IpO2lmKCFkcmF3Q2hyb21lKQpyZXR1cm47Y29uc3QgYm9yZGVyQWRqdXN0bWVudD1MYXllclZpZXdlci5MYXllcnMzRFZpZXcuVmlld3BvcnRCb3JkZXJXaWR0aC8yO2NvbnN0IHZpZXdwb3J0V2lkdGg9dGhpcy5fbGF5ZXJUcmVlLnZpZXdwb3J0U2l6ZSgpLndpZHRoKzIqYm9yZGVyQWRqdXN0bWVudDtjb25zdCBjaHJvbWVIZWlnaHQ9dGhpcy5fY2hyb21lVGV4dHVyZXNbMF0uaW1hZ2UubmF0dXJhbEhlaWdodDtjb25zdCBtaWRkbGVGcmFnbWVudFdpZHRoPXZpZXdwb3J0V2lkdGgtdGhpcy5fY2hyb21lVGV4dHVyZXNbMF0uaW1hZ2UubmF0dXJhbFdpZHRoLXRoaXMuX2Nocm9tZVRleHR1cmVzWzJdLmltYWdlLm5hdHVyYWxXaWR0aDtsZXQgeD0tYm9yZGVyQWRqdXN0bWVudDtjb25zdCB5PS1jaHJvbWVIZWlnaHQ7Zm9yKGxldCBpPTA7aTx0aGlzLl9jaHJvbWVUZXh0dXJlcy5sZW5ndGg7KytpKXtjb25zdCB3aWR0aD1pPT09TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkNocm9tZVRleHR1cmUuTWlkZGxlP21pZGRsZUZyYWdtZW50V2lkdGg6dGhpcy5fY2hyb21lVGV4dHVyZXNbaV0uaW1hZ2UubmF0dXJhbFdpZHRoO2lmKHdpZHRoPDB8fHgrd2lkdGg+dmlld3BvcnRXaWR0aCkKYnJlYWs7dmVydGljZXM9W3gseSx6LHgrd2lkdGgseSx6LHgrd2lkdGgseStjaHJvbWVIZWlnaHQseix4LHkrY2hyb21lSGVpZ2h0LHpdO3RoaXMuX2RyYXdUZXh0dXJlKHZlcnRpY2VzLCh0aGlzLl9jaHJvbWVUZXh0dXJlc1tpXSkpO3grPXdpZHRoO319Cl9kcmF3Vmlld1JlY3QocmVjdCl7Y29uc3QgdmVydGljZXM9cmVjdC52ZXJ0aWNlcztpZihyZWN0LnRleHR1cmUpCnRoaXMuX2RyYXdUZXh0dXJlKHZlcnRpY2VzLHJlY3QudGV4dHVyZSxyZWN0LmZpbGxDb2xvcnx8dW5kZWZpbmVkKTtlbHNlIGlmKHJlY3QuZmlsbENvbG9yKQp0aGlzLl9kcmF3UmVjdGFuZ2xlKHZlcnRpY2VzLHRoaXMuX2dsLlRSSUFOR0xFX0ZBTixyZWN0LmZpbGxDb2xvcik7dGhpcy5fZ2wubGluZVdpZHRoKHJlY3QubGluZVdpZHRoKTtpZihyZWN0LmJvcmRlckNvbG9yKQp0aGlzLl9kcmF3UmVjdGFuZ2xlKHZlcnRpY2VzLHRoaXMuX2dsLkxJTkVfTE9PUCxyZWN0LmJvcmRlckNvbG9yKTt9Cl91cGRhdGUoKXtpZighdGhpcy5pc1Nob3dpbmcoKSl7dGhpcy5fbmVlZHNVcGRhdGU9dHJ1ZTtyZXR1cm47fQppZighdGhpcy5fbGF5ZXJUcmVlfHwhdGhpcy5fbGF5ZXJUcmVlLnJvb3QoKSl7dGhpcy5fZmFpbEJhbm5lci5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3JldHVybjt9CmNvbnN0IGdsPXRoaXMuX2luaXRHTElmTmVjZXNzYXJ5KCk7aWYoIWdsKXt0aGlzLl9mYWlsQmFubmVyLmVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9mYWlsQmFubmVyLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fd2ViZ2xEaXNhYmxlZEJhbm5lcigpKTt0aGlzLl9mYWlsQmFubmVyLnNob3codGhpcy5jb250ZW50RWxlbWVudCk7cmV0dXJuO30KdGhpcy5fZmFpbEJhbm5lci5kZXRhY2goKTt0aGlzLl9nbC52aWV3cG9ydFdpZHRoPXRoaXMuX2NhbnZhc0VsZW1lbnQud2lkdGg7dGhpcy5fZ2wudmlld3BvcnRIZWlnaHQ9dGhpcy5fY2FudmFzRWxlbWVudC5oZWlnaHQ7dGhpcy5fY2FsY3VsYXRlRGVwdGhzQW5kVmlzaWJpbGl0eSgpO3RoaXMuX2NhbGN1bGF0ZVJlY3RzKCk7dGhpcy5fdXBkYXRlVHJhbnNmb3JtQW5kQ29uc3RyYWludHMoKTtnbC52aWV3cG9ydCgwLDAsZ2wudmlld3BvcnRXaWR0aCxnbC52aWV3cG9ydEhlaWdodCk7Z2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVHxnbC5ERVBUSF9CVUZGRVJfQklUKTt0aGlzLl9yZWN0cy5mb3JFYWNoKHRoaXMuX2RyYXdWaWV3UmVjdC5iaW5kKHRoaXMpKTt0aGlzLl9kcmF3Vmlld3BvcnRBbmRDaHJvbWUoKTt9Cl93ZWJnbERpc2FibGVkQmFubmVyKCl7Y29uc3QgZnJhZ21lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmcmFnbWVudC5jcmVhdGVDaGlsZCgnZGl2JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdDYW5cJ3QgZGlzcGxheSBsYXllcnMsJyk7ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnV2ViR0wgc3VwcG9ydCBpcyBkaXNhYmxlZCBpbiB5b3VyIGJyb3dzZXIuJyk7ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoVUkuZm9ybWF0TG9jYWxpemVkKCdDaGVjayAlcyBmb3IgcG9zc2libGUgcmVhc29ucy4nLFtVSS5YTGluay5jcmVhdGUoJ2Fib3V0OmdwdScpXSkpO3JldHVybiBmcmFnbWVudDt9Cl9zZWxlY3Rpb25Gcm9tRXZlbnRQb2ludChldmVudCl7aWYoIXRoaXMuX2xheWVyVHJlZSkKcmV0dXJuIG51bGw7bGV0IGNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludD1JbmZpbml0eTtsZXQgY2xvc2VzdE9iamVjdD1udWxsO2NvbnN0IHByb2plY3Rpb25NYXRyaXg9bmV3IFdlYktpdENTU01hdHJpeCgpLnNjYWxlKDEsLTEsLTEpLnRyYW5zbGF0ZSgtMSwtMSwwKS5tdWx0aXBseSh0aGlzLl9wcm9qZWN0aW9uTWF0cml4KTtjb25zdCB4MD0oZXZlbnQuY2xpZW50WC10aGlzLl9jYW52YXNFbGVtZW50LnRvdGFsT2Zmc2V0TGVmdCgpKSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCB5MD0tKGV2ZW50LmNsaWVudFktdGhpcy5fY2FudmFzRWxlbWVudC50b3RhbE9mZnNldFRvcCgpKSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbihyZWN0KXtpZighcmVjdC5yZWxhdGVkT2JqZWN0KQpyZXR1cm47Y29uc3QgdD1yZWN0LmludGVyc2VjdFdpdGhMaW5lKHByb2plY3Rpb25NYXRyaXgseDAseTApO2lmKHQ8Y2xvc2VzdEludGVyc2VjdGlvblBvaW50KXtjbG9zZXN0SW50ZXJzZWN0aW9uUG9pbnQ9dDtjbG9zZXN0T2JqZWN0PXJlY3QucmVsYXRlZE9iamVjdDt9fQp0aGlzLl9yZWN0cy5mb3JFYWNoKGNoZWNrSW50ZXJzZWN0aW9uKTtyZXR1cm4gY2xvc2VzdE9iamVjdDt9Cl9jcmVhdGVWaXNpYmlsaXR5U2V0dGluZyhjYXB0aW9uLG5hbWUsdmFsdWUsdG9vbGJhcil7Y29uc3Qgc2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZyhuYW1lLHZhbHVlKTtzZXR0aW5nLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZyhjYXB0aW9uKSk7c2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGUsdGhpcyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveChzZXR0aW5nKSk7cmV0dXJuIHNldHRpbmc7fQpfaW5pdFRvb2xiYXIoKXt0aGlzLl9wYW5lbFRvb2xiYXI9dGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci50b29sYmFyKCk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wYW5lbFRvb2xiYXIuZWxlbWVudCk7dGhpcy5fc2hvd1Nsb3dTY3JvbGxSZWN0c1NldHRpbmc9dGhpcy5fY3JlYXRlVmlzaWJpbGl0eVNldHRpbmcoJ1Nsb3cgc2Nyb2xsIHJlY3RzJywnZnJhbWVWaWV3ZXJTaG93U2xvd1Njcm9sbFJlY3RzJyx0cnVlLHRoaXMuX3BhbmVsVG9vbGJhcik7dGhpcy5fc2hvd1BhaW50c1NldHRpbmc9dGhpcy5fY3JlYXRlVmlzaWJpbGl0eVNldHRpbmcoJ1BhaW50cycsJ2ZyYW1lVmlld2VyU2hvd1BhaW50cycsdHJ1ZSx0aGlzLl9wYW5lbFRvb2xiYXIpO3RoaXMuX3Nob3dQYWludHNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVBhaW50cyx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnZnJhbWVWaWV3ZXJIaWRlQ2hyb21lV2luZG93JykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlLHRoaXMpO30KX29uQ29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVzZXQgVmlldycpLHRoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIucmVzZXRBbmROb3RpZnkuYmluZCh0aGlzLl90cmFuc2Zvcm1Db250cm9sbGVyKSxmYWxzZSk7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX3NlbGVjdGlvbkZyb21FdmVudFBvaW50KGV2ZW50KTtpZihzZWxlY3Rpb24mJnNlbGVjdGlvbi50eXBlKCk9PT1MYXllclZpZXdlci5MYXllclZpZXcuU2VsZWN0aW9uLlR5cGUuU25hcHNob3Qpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1Nob3cgUGFpbnQgUHJvZmlsZXInKSx0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycy5iaW5kKHRoaXMsTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkV2ZW50cy5QYWludFByb2ZpbGVyUmVxdWVzdGVkLHNlbGVjdGlvbiksZmFsc2UpO30KdGhpcy5fbGF5ZXJWaWV3SG9zdC5zaG93Q29udGV4dE1lbnUoY29udGV4dE1lbnUsc2VsZWN0aW9uKTt9Cl9vbk1vdXNlTW92ZShldmVudCl7aWYoZXZlbnQud2hpY2gpCnJldHVybjt0aGlzLl9sYXllclZpZXdIb3N0LmhvdmVyT2JqZWN0KHRoaXMuX3NlbGVjdGlvbkZyb21FdmVudFBvaW50KGV2ZW50KSk7fQpfb25Nb3VzZURvd24oZXZlbnQpe3RoaXMuX21vdXNlRG93blg9ZXZlbnQuY2xpZW50WDt0aGlzLl9tb3VzZURvd25ZPWV2ZW50LmNsaWVudFk7fQpfb25Nb3VzZVVwKGV2ZW50KXtjb25zdCBtYXhEaXN0YW5jZUluUGl4ZWxzPTY7aWYodGhpcy5fbW91c2VEb3duWCYmTWF0aC5hYnMoZXZlbnQuY2xpZW50WC10aGlzLl9tb3VzZURvd25YKTxtYXhEaXN0YW5jZUluUGl4ZWxzJiZNYXRoLmFicyhldmVudC5jbGllbnRZLXRoaXMuX21vdXNlRG93blkpPG1heERpc3RhbmNlSW5QaXhlbHMpCnRoaXMuX2xheWVyVmlld0hvc3Quc2VsZWN0T2JqZWN0KHRoaXMuX3NlbGVjdGlvbkZyb21FdmVudFBvaW50KGV2ZW50KSk7ZGVsZXRlIHRoaXMuX21vdXNlRG93blg7ZGVsZXRlIHRoaXMuX21vdXNlRG93blk7fQpfb25Eb3VibGVDbGljayhldmVudCl7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX3NlbGVjdGlvbkZyb21FdmVudFBvaW50KGV2ZW50KTtpZihzZWxlY3Rpb24mJihzZWxlY3Rpb24udHlwZSgpPT09TGF5ZXJWaWV3ZXIuTGF5ZXJWaWV3LlNlbGVjdGlvbi5UeXBlLlNuYXBzaG90fHxzZWxlY3Rpb24ubGF5ZXIoKSkpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKExheWVyVmlld2VyLkxheWVyczNEVmlldy5FdmVudHMuUGFpbnRQcm9maWxlclJlcXVlc3RlZCxzZWxlY3Rpb24pO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO30KX3VwZGF0ZVBhaW50cygpe2lmKHRoaXMuX3Nob3dQYWludHMoKSl7dGhpcy5fdGV4dHVyZU1hbmFnZXIuc2V0TGF5ZXJUcmVlKHRoaXMuX2xheWVyVHJlZSk7dGhpcy5fdGV4dHVyZU1hbmFnZXIuZm9yY2VVcGRhdGUoKTt9ZWxzZXt0aGlzLl90ZXh0dXJlTWFuYWdlci5yZXNldCgpO30KdGhpcy5fdXBkYXRlKCk7fQpfc2hvd1BhaW50cygpe3JldHVybiB0aGlzLl9zaG93UGFpbnRzU2V0dGluZy5nZXQoKTt9fTtMYXllclZpZXdlci5MYXllcnMzRFZpZXcuTGF5ZXJTdHlsZTtMYXllclZpZXdlci5MYXllcnMzRFZpZXcuT3V0bGluZVR5cGU9e0hvdmVyZWQ6J2hvdmVyZWQnLFNlbGVjdGVkOidzZWxlY3RlZCd9O0xheWVyVmlld2VyLkxheWVyczNEVmlldy5FdmVudHM9e1BhaW50UHJvZmlsZXJSZXF1ZXN0ZWQ6U3ltYm9sKCdQYWludFByb2ZpbGVyUmVxdWVzdGVkJyksU2NhbGVDaGFuZ2VkOlN5bWJvbCgnU2NhbGVDaGFuZ2VkJyl9O0xheWVyVmlld2VyLkxheWVyczNEVmlldy5DaHJvbWVUZXh0dXJlPXtMZWZ0OjAsTWlkZGxlOjEsUmlnaHQ6Mn07TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlNjcm9sbFJlY3RUaXRsZXM9e1JlcGFpbnRzT25TY3JvbGw6Q29tbW9uLlVJU3RyaW5nKCdyZXBhaW50cyBvbiBzY3JvbGwnKSxUb3VjaEV2ZW50SGFuZGxlcjpDb21tb24uVUlTdHJpbmcoJ3RvdWNoIGV2ZW50IGxpc3RlbmVyJyksV2hlZWxFdmVudEhhbmRsZXI6Q29tbW9uLlVJU3RyaW5nKCdtb3VzZXdoZWVsIGV2ZW50IGxpc3RlbmVyJyl9O0xheWVyVmlld2VyLkxheWVyczNEVmlldy5GcmFnbWVudFNoYWRlcj0nJysncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4nKyd2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuJysndmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG4nKyd1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcbicrJ3ZvaWQgbWFpbih2b2lkKVxuJysne1xuJysnICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdmVjMih2VGV4dHVyZUNvb3JkLnMsIHZUZXh0dXJlQ29vcmQudCkpICogdkNvbG9yO1xuJysnfSc7TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlZlcnRleFNoYWRlcj0nJysnYXR0cmlidXRlIHZlYzMgYVZlcnRleFBvc2l0aW9uO1xuJysnYXR0cmlidXRlIHZlYzIgYVRleHR1cmVDb29yZDtcbicrJ2F0dHJpYnV0ZSB2ZWM0IGFWZXJ0ZXhDb2xvcjtcbicrJ3VuaWZvcm0gbWF0NCB1UE1hdHJpeDtcbicrJ3ZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xuJysndmFyeWluZyB2ZWM0IHZDb2xvcjtcbicrJ3ZvaWQgbWFpbih2b2lkKVxuJysne1xuJysnZ2xfUG9zaXRpb24gPSB1UE1hdHJpeCAqIHZlYzQoYVZlcnRleFBvc2l0aW9uLCAxLjApO1xuJysndkNvbG9yID0gYVZlcnRleENvbG9yO1xuJysndlRleHR1cmVDb29yZCA9IGFUZXh0dXJlQ29vcmQ7XG4nKyd9JztMYXllclZpZXdlci5MYXllcnMzRFZpZXcuSG92ZXJlZEJvcmRlckNvbG9yPVswLDAsMjU1LDFdO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5TZWxlY3RlZEJvcmRlckNvbG9yPVswLDI1NSwwLDFdO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5Cb3JkZXJDb2xvcj1bMCwwLDAsMV07TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlZpZXdwb3J0Qm9yZGVyQ29sb3I9WzE2MCwxNjAsMTYwLDFdO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5TY3JvbGxSZWN0QmFja2dyb3VuZENvbG9yPVsxNzgsMTAwLDEwMCwwLjZdO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5Ib3ZlcmVkSW1hZ2VNYXNrQ29sb3I9WzIwMCwyMDAsMjU1LDFdO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5Cb3JkZXJXaWR0aD0xO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5TZWxlY3RlZEJvcmRlcldpZHRoPTI7TGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LlZpZXdwb3J0Qm9yZGVyV2lkdGg9MztMYXllclZpZXdlci5MYXllcnMzRFZpZXcuTGF5ZXJTcGFjaW5nPTIwO0xheWVyVmlld2VyLkxheWVyczNEVmlldy5TY3JvbGxSZWN0U3BhY2luZz00O0xheWVyVmlld2VyLkxheWVyVGV4dHVyZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IodGV4dHVyZVVwZGF0ZWRDYWxsYmFjayl7dGhpcy5fdGV4dHVyZVVwZGF0ZWRDYWxsYmFjaz10ZXh0dXJlVXBkYXRlZENhbGxiYWNrO3RoaXMuX3Rocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcigwKTt0aGlzLl9zY2FsZT0wO3RoaXMuX2FjdGl2ZT1mYWxzZTt0aGlzLnJlc2V0KCk7fQpzdGF0aWMgX2NyZWF0ZVRleHR1cmVGb3JJbWFnZShnbCxpbWFnZSl7Y29uc3QgdGV4dHVyZT1nbC5jcmVhdGVUZXh0dXJlKCk7dGV4dHVyZS5pbWFnZT1pbWFnZTtnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELHRleHR1cmUpO2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsMSk7Z2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELDAsZ2wuUkdCQSxnbC5SR0JBLGdsLlVOU0lHTkVEX0JZVEUsdGV4dHVyZS5pbWFnZSk7Z2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELGdsLlRFWFRVUkVfTUlOX0ZJTFRFUixnbC5MSU5FQVIpO2dsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCxnbC5URVhUVVJFX01BR19GSUxURVIsZ2wuTElORUFSKTtnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsZ2wuVEVYVFVSRV9XUkFQX1MsZ2wuQ0xBTVBfVE9fRURHRSk7Z2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELGdsLlRFWFRVUkVfV1JBUF9ULGdsLkNMQU1QX1RPX0VER0UpO2dsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsbnVsbCk7cmV0dXJuIHRleHR1cmU7fQpyZXNldCgpe2lmKHRoaXMuX3RpbGVzQnlMYXllcikKdGhpcy5zZXRMYXllclRyZWUobnVsbCk7dGhpcy5fdGlsZXNCeUxheWVyPW5ldyBNYXAoKTt0aGlzLl9xdWV1ZT1bXTt9CnNldENvbnRleHQoZ2xDb250ZXh0KXt0aGlzLl9nbD1nbENvbnRleHQ7aWYodGhpcy5fc2NhbGUpCnRoaXMuX3VwZGF0ZVRleHR1cmVzKCk7fQpzdXNwZW5kKCl7dGhpcy5fYWN0aXZlPWZhbHNlO30KcmVzdW1lKCl7dGhpcy5fYWN0aXZlPXRydWU7aWYodGhpcy5fcXVldWUubGVuZ3RoKQp0aGlzLl91cGRhdGUoKTt9CnNldExheWVyVHJlZShsYXllclRyZWUpe2NvbnN0IG5ld0xheWVycz1uZXcgU2V0KCk7Y29uc3Qgb2xkTGF5ZXJzPUFycmF5LmZyb20odGhpcy5fdGlsZXNCeUxheWVyLmtleXMoKSk7aWYobGF5ZXJUcmVlKXtsYXllclRyZWUuZm9yRWFjaExheWVyKGxheWVyPT57aWYoIWxheWVyLmRyYXdzQ29udGVudCgpKQpyZXR1cm47bmV3TGF5ZXJzLmFkZChsYXllcik7aWYoIXRoaXMuX3RpbGVzQnlMYXllci5oYXMobGF5ZXIpKXt0aGlzLl90aWxlc0J5TGF5ZXIuc2V0KGxheWVyLFtdKTt0aGlzLmxheWVyTmVlZHNVcGRhdGUobGF5ZXIpO319KTt9CmlmKCFvbGRMYXllcnMubGVuZ3RoKQp0aGlzLmZvcmNlVXBkYXRlKCk7Zm9yKGNvbnN0IGxheWVyIG9mIG9sZExheWVycyl7aWYobmV3TGF5ZXJzLmhhcyhsYXllcikpCmNvbnRpbnVlO3RoaXMuX3RpbGVzQnlMYXllci5nZXQobGF5ZXIpLmZvckVhY2godGlsZT0+dGlsZS5kaXNwb3NlKCkpO3RoaXMuX3RpbGVzQnlMYXllci5kZWxldGUobGF5ZXIpO319Cl9zZXRTbmFwc2hvdHNGb3JMYXllcihsYXllcixzbmFwc2hvdHMpe2NvbnN0IG9sZFNuYXBzaG90c1RvVGlsZXM9bmV3IE1hcCgodGhpcy5fdGlsZXNCeUxheWVyLmdldChsYXllcil8fFtdKS5tYXAodGlsZT0+W3RpbGUuc25hcHNob3QsdGlsZV0pKTtjb25zdCBuZXdUaWxlcz1bXTtjb25zdCByZXVzZWRUaWxlcz1bXTtmb3IoY29uc3Qgc25hcHNob3Qgb2Ygc25hcHNob3RzKXtjb25zdCBvbGRUaWxlPW9sZFNuYXBzaG90c1RvVGlsZXMuZ2V0KHNuYXBzaG90KTtpZihvbGRUaWxlKXtyZXVzZWRUaWxlcy5wdXNoKG9sZFRpbGUpO29sZFNuYXBzaG90c1RvVGlsZXMuZGVsZXRlKG9sZFRpbGUpO31lbHNle25ld1RpbGVzLnB1c2gobmV3IExheWVyVmlld2VyLkxheWVyVGV4dHVyZU1hbmFnZXIuVGlsZShzbmFwc2hvdCkpO319CnRoaXMuX3RpbGVzQnlMYXllci5zZXQobGF5ZXIscmV1c2VkVGlsZXMuY29uY2F0KG5ld1RpbGVzKSk7Zm9yKGNvbnN0IHRpbGUgb2Ygb2xkU25hcHNob3RzVG9UaWxlcy52YWx1ZXMoKSkKdGlsZS5kaXNwb3NlKCk7aWYoIXRoaXMuX2dsfHwhdGhpcy5fc2NhbGUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtyZXR1cm4gUHJvbWlzZS5hbGwobmV3VGlsZXMubWFwKHRpbGU9PnRpbGUudXBkYXRlKHRoaXMuX2dsLHRoaXMuX3NjYWxlKSkpLnRoZW4odGhpcy5fdGV4dHVyZVVwZGF0ZWRDYWxsYmFjayk7fQpzZXRTY2FsZShzY2FsZSl7aWYodGhpcy5fc2NhbGUmJnRoaXMuX3NjYWxlPj1zY2FsZSkKcmV0dXJuO3RoaXMuX3NjYWxlPXNjYWxlO3RoaXMuX3VwZGF0ZVRleHR1cmVzKCk7fQp0aWxlc0ZvckxheWVyKGxheWVyKXtyZXR1cm4gdGhpcy5fdGlsZXNCeUxheWVyLmdldChsYXllcil8fFtdO30KbGF5ZXJOZWVkc1VwZGF0ZShsYXllcil7aWYodGhpcy5fcXVldWUuaW5kZXhPZihsYXllcik8MCkKdGhpcy5fcXVldWUucHVzaChsYXllcik7aWYodGhpcy5fYWN0aXZlKQp0aGlzLl90aHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO30KZm9yY2VVcGRhdGUoKXt0aGlzLl9xdWV1ZS5mb3JFYWNoKGxheWVyPT50aGlzLl91cGRhdGVMYXllcihsYXllcikpO3RoaXMuX3F1ZXVlPVtdO3RoaXMuX3VwZGF0ZSgpO30KX3VwZGF0ZSgpe2NvbnN0IGxheWVyPXRoaXMuX3F1ZXVlLnNoaWZ0KCk7aWYoIWxheWVyKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYodGhpcy5fcXVldWUubGVuZ3RoKQp0aGlzLl90aHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO3JldHVybiB0aGlzLl91cGRhdGVMYXllcihsYXllcik7fQpfdXBkYXRlTGF5ZXIobGF5ZXIpe3JldHVybiBQcm9taXNlLmFsbChsYXllci5zbmFwc2hvdHMoKSkudGhlbihzbmFwc2hvdHM9PnRoaXMuX3NldFNuYXBzaG90c0ZvckxheWVyKGxheWVyLHNuYXBzaG90cy5maWx0ZXIoc25hcHNob3Q9PiEhc25hcHNob3QpKSk7fQpfdXBkYXRlVGV4dHVyZXMoKXtpZighdGhpcy5fZ2wpCnJldHVybjtpZighdGhpcy5fc2NhbGUpCnJldHVybjtmb3IoY29uc3QgdGlsZXMgb2YgdGhpcy5fdGlsZXNCeUxheWVyLnZhbHVlcygpKXtmb3IoY29uc3QgdGlsZSBvZiB0aWxlcyl7Y29uc3QgcHJvbWlzZT10aWxlLnVwZGF0ZVNjYWxlKHRoaXMuX2dsLHRoaXMuX3NjYWxlKTtpZihwcm9taXNlKQpwcm9taXNlLnRoZW4odGhpcy5fdGV4dHVyZVVwZGF0ZWRDYWxsYmFjayk7fX19fTtMYXllclZpZXdlci5MYXllcnMzRFZpZXcuUmVjdGFuZ2xlPWNsYXNze2NvbnN0cnVjdG9yKHJlbGF0ZWRPYmplY3Qpe3RoaXMucmVsYXRlZE9iamVjdD1yZWxhdGVkT2JqZWN0O3RoaXMubGluZVdpZHRoPTE7dGhpcy5ib3JkZXJDb2xvcj1udWxsO3RoaXMuZmlsbENvbG9yPW51bGw7dGhpcy50ZXh0dXJlPW51bGw7fQpzZXRWZXJ0aWNlcyhxdWFkLHope3RoaXMudmVydGljZXM9W3F1YWRbMF0scXVhZFsxXSx6LHF1YWRbMl0scXVhZFszXSx6LHF1YWRbNF0scXVhZFs1XSx6LHF1YWRbNl0scXVhZFs3XSx6XTt9Cl9jYWxjdWxhdGVQb2ludE9uUXVhZChxdWFkLHJhdGlvWCxyYXRpb1kpe2NvbnN0IHgwPXF1YWRbMF07Y29uc3QgeTA9cXVhZFsxXTtjb25zdCB4MT1xdWFkWzJdO2NvbnN0IHkxPXF1YWRbM107Y29uc3QgeDI9cXVhZFs0XTtjb25zdCB5Mj1xdWFkWzVdO2NvbnN0IHgzPXF1YWRbNl07Y29uc3QgeTM9cXVhZFs3XTtjb25zdCBmaXJzdFNpZGVQb2ludFg9eDArcmF0aW9YKih4MS14MCk7Y29uc3QgZmlyc3RTaWRlUG9pbnRZPXkwK3JhdGlvWCooeTEteTApO2NvbnN0IHRoaXJkU2lkZVBvaW50WD14MytyYXRpb1gqKHgyLXgzKTtjb25zdCB0aGlyZFNpZGVQb2ludFk9eTMrcmF0aW9YKih5Mi15Myk7Y29uc3QgeD1maXJzdFNpZGVQb2ludFgrcmF0aW9ZKih0aGlyZFNpZGVQb2ludFgtZmlyc3RTaWRlUG9pbnRYKTtjb25zdCB5PWZpcnN0U2lkZVBvaW50WStyYXRpb1kqKHRoaXJkU2lkZVBvaW50WS1maXJzdFNpZGVQb2ludFkpO3JldHVyblt4LHldO30KY2FsY3VsYXRlVmVydGljZXNGcm9tUmVjdChsYXllcixyZWN0LHope2NvbnN0IHF1YWQ9bGF5ZXIucXVhZCgpO2NvbnN0IHJ4MT1yZWN0LngvbGF5ZXIud2lkdGgoKTtjb25zdCByeDI9KHJlY3QueCtyZWN0LndpZHRoKS9sYXllci53aWR0aCgpO2NvbnN0IHJ5MT1yZWN0LnkvbGF5ZXIuaGVpZ2h0KCk7Y29uc3QgcnkyPShyZWN0LnkrcmVjdC5oZWlnaHQpL2xheWVyLmhlaWdodCgpO2NvbnN0IHJlY3RRdWFkPXRoaXMuX2NhbGN1bGF0ZVBvaW50T25RdWFkKHF1YWQscngxLHJ5MSkuY29uY2F0KHRoaXMuX2NhbGN1bGF0ZVBvaW50T25RdWFkKHF1YWQscngyLHJ5MSkpLmNvbmNhdCh0aGlzLl9jYWxjdWxhdGVQb2ludE9uUXVhZChxdWFkLHJ4MixyeTIpKS5jb25jYXQodGhpcy5fY2FsY3VsYXRlUG9pbnRPblF1YWQocXVhZCxyeDEscnkyKSk7dGhpcy5zZXRWZXJ0aWNlcyhyZWN0UXVhZCx6KTt9CmludGVyc2VjdFdpdGhMaW5lKG1hdHJpeCx4MCx5MCl7bGV0IGk7Y29uc3QgcG9pbnRzPVtdO2ZvcihpPTA7aTw0OysraSl7cG9pbnRzW2ldPVVJLkdlb21ldHJ5Lm11bHRpcGx5VmVjdG9yQnlNYXRyaXhBbmROb3JtYWxpemUobmV3IFVJLkdlb21ldHJ5LlZlY3Rvcih0aGlzLnZlcnRpY2VzW2kqM10sdGhpcy52ZXJ0aWNlc1tpKjMrMV0sdGhpcy52ZXJ0aWNlc1tpKjMrMl0pLG1hdHJpeCk7fQpjb25zdCBub3JtYWw9VUkuR2VvbWV0cnkuY3Jvc3NQcm9kdWN0KFVJLkdlb21ldHJ5LnN1YnRyYWN0KHBvaW50c1sxXSxwb2ludHNbMF0pLFVJLkdlb21ldHJ5LnN1YnRyYWN0KHBvaW50c1syXSxwb2ludHNbMV0pKTtjb25zdCBBPW5vcm1hbC54O2NvbnN0IEI9bm9ybWFsLnk7Y29uc3QgQz1ub3JtYWwuejtjb25zdCBEPS0oQSpwb2ludHNbMF0ueCtCKnBvaW50c1swXS55K0MqcG9pbnRzWzBdLnopO2NvbnN0IHQ9LShEK0EqeDArQip5MCkvQztjb25zdCBwdD1uZXcgVUkuR2VvbWV0cnkuVmVjdG9yKHgwLHkwLHQpO2NvbnN0IHRWZWN0cz1wb2ludHMubWFwKFVJLkdlb21ldHJ5LnN1YnRyYWN0LmJpbmQobnVsbCxwdCkpO2ZvcihpPTA7aTx0VmVjdHMubGVuZ3RoOysraSl7Y29uc3QgcHJvZHVjdD1VSS5HZW9tZXRyeS5zY2FsYXJQcm9kdWN0KG5vcm1hbCxVSS5HZW9tZXRyeS5jcm9zc1Byb2R1Y3QodFZlY3RzW2ldLHRWZWN0c1soaSsxKSV0VmVjdHMubGVuZ3RoXSkpO2lmKHByb2R1Y3Q8MCkKcmV0dXJuIHVuZGVmaW5lZDt9CnJldHVybiB0O319O0xheWVyVmlld2VyLkxheWVyVGV4dHVyZU1hbmFnZXIuVGlsZT1jbGFzc3tjb25zdHJ1Y3RvcihzbmFwc2hvdFdpdGhSZWN0KXt0aGlzLnNuYXBzaG90PXNuYXBzaG90V2l0aFJlY3Quc25hcHNob3Q7dGhpcy5yZWN0PXNuYXBzaG90V2l0aFJlY3QucmVjdDt0aGlzLnNjYWxlPTA7dGhpcy50ZXh0dXJlPW51bGw7fQpkaXNwb3NlKCl7dGhpcy5zbmFwc2hvdC5yZWxlYXNlKCk7aWYodGhpcy50ZXh0dXJlKXt0aGlzLl9nbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7dGhpcy50ZXh0dXJlPW51bGw7fX0KdXBkYXRlU2NhbGUoZ2xDb250ZXh0LHNjYWxlKXtpZih0aGlzLnRleHR1cmUmJnRoaXMuc2NhbGU+PXNjYWxlKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy51cGRhdGUoZ2xDb250ZXh0LHNjYWxlKTt9CmFzeW5jIHVwZGF0ZShnbENvbnRleHQsc2NhbGUpe3RoaXMuX2dsPWdsQ29udGV4dDt0aGlzLnNjYWxlPXNjYWxlO2NvbnN0IGltYWdlVVJMPWF3YWl0IHRoaXMuc25hcHNob3QucmVwbGF5KHNjYWxlKTtjb25zdCBpbWFnZT1pbWFnZVVSTCYmYXdhaXQgVUkubG9hZEltYWdlKGltYWdlVVJMKTt0aGlzLnRleHR1cmU9aW1hZ2UmJkxheWVyVmlld2VyLkxheWVyVGV4dHVyZU1hbmFnZXIuX2NyZWF0ZVRleHR1cmVGb3JJbWFnZShnbENvbnRleHQsaW1hZ2UpO319OztMYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldz1jbGFzcyBleHRlbmRzIFVJLkhCb3h7Y29uc3RydWN0b3Ioc2hvd0ltYWdlQ2FsbGJhY2spe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbGF5ZXJfdmlld2VyL3BhaW50UHJvZmlsZXIuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYWludC1wcm9maWxlci1vdmVydmlldycpO3RoaXMuX2NhbnZhc0NvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwYWludC1wcm9maWxlci1jYW52YXMtY29udGFpbmVyJyk7dGhpcy5fcHJvZ3Jlc3NCYW5uZXI9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZnVsbC13aWRnZXQtZGltbWVkLWJhbm5lciBoaWRkZW4nKTt0aGlzLl9wcm9ncmVzc0Jhbm5lci50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Byb2ZpbGluZ1x1MjAyNicpO3RoaXMuX3BpZUNoYXJ0PW5ldyBQZXJmVUkuUGllQ2hhcnQoNTUsdGhpcy5fZm9ybWF0UGllQ2hhcnRUaW1lLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fcGllQ2hhcnQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYWludC1wcm9maWxlci1waWUtY2hhcnQnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3BpZUNoYXJ0LmVsZW1lbnQpO3RoaXMuX3Nob3dJbWFnZUNhbGxiYWNrPXNob3dJbWFnZUNhbGxiYWNrO3RoaXMuX2NhbnZhcz10aGlzLl9jYW52YXNDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2NhbnZhcycsJ2ZpbGwnKTt0aGlzLl9jb250ZXh0PXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO3RoaXMuX3NlbGVjdGlvbldpbmRvdz1uZXcgUGVyZlVJLk92ZXJ2aWV3R3JpZC5XaW5kb3codGhpcy5fY2FudmFzQ29udGFpbmVyKTt0aGlzLl9zZWxlY3Rpb25XaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuT3ZlcnZpZXdHcmlkLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZCx0aGlzKTt0aGlzLl9pbm5lckJhcldpZHRoPTQqd2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fbWluQmFySGVpZ2h0PXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX2JhclBhZGRpbmdXaWR0aD0yKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX291dGVyQmFyV2lkdGg9dGhpcy5faW5uZXJCYXJXaWR0aCt0aGlzLl9iYXJQYWRkaW5nV2lkdGg7dGhpcy5fcGVuZGluZ1NjYWxlPTE7dGhpcy5fc2NhbGU9dGhpcy5fcGVuZGluZ1NjYWxlO3RoaXMuX3Jlc2V0KCk7fQpzdGF0aWMgY2F0ZWdvcmllcygpe2lmKExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3Ll9jYXRlZ29yaWVzKQpyZXR1cm4gTGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlclZpZXcuX2NhdGVnb3JpZXM7TGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlclZpZXcuX2NhdGVnb3JpZXM9e3NoYXBlczpuZXcgTGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlckNhdGVnb3J5KCdzaGFwZXMnLENvbW1vbi5VSVN0cmluZygnU2hhcGVzJyksJ3JnYigyNTUsIDE2MSwgMTI5KScpLGJpdG1hcDpuZXcgTGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlckNhdGVnb3J5KCdiaXRtYXAnLENvbW1vbi5VSVN0cmluZygnQml0bWFwJyksJ3JnYigxMzYsIDE5NiwgMjU1KScpLHRleHQ6bmV3IExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJDYXRlZ29yeSgndGV4dCcsQ29tbW9uLlVJU3RyaW5nKCdUZXh0JyksJ3JnYigxODAsIDI1NSwgMTM3KScpLG1pc2M6bmV3IExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJDYXRlZ29yeSgnbWlzYycsQ29tbW9uLlVJU3RyaW5nKCdNaXNjJyksJ3JnYigyMDYsIDE2MCwgMjU1KScpfTtyZXR1cm4gTGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlclZpZXcuX2NhdGVnb3JpZXM7fQpzdGF0aWMgX2luaXRMb2dJdGVtQ2F0ZWdvcmllcygpe2lmKExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3Ll9sb2dJdGVtQ2F0ZWdvcmllc01hcCkKcmV0dXJuIExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3Ll9sb2dJdGVtQ2F0ZWdvcmllc01hcDtjb25zdCBjYXRlZ29yaWVzPUxheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3LmNhdGVnb3JpZXMoKTtjb25zdCBsb2dJdGVtQ2F0ZWdvcmllcz17fTtsb2dJdGVtQ2F0ZWdvcmllc1snQ2xlYXInXT1jYXRlZ29yaWVzWydtaXNjJ107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdQYWludCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd0RhdGEnXT1jYXRlZ29yaWVzWydtaXNjJ107bG9nSXRlbUNhdGVnb3JpZXNbJ1NldE1hdHJpeCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snUHVzaEN1bGwnXT1jYXRlZ29yaWVzWydtaXNjJ107bG9nSXRlbUNhdGVnb3JpZXNbJ1BvcEN1bGwnXT1jYXRlZ29yaWVzWydtaXNjJ107bG9nSXRlbUNhdGVnb3JpZXNbJ1RyYW5zbGF0ZSddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snU2NhbGUnXT1jYXRlZ29yaWVzWydtaXNjJ107bG9nSXRlbUNhdGVnb3JpZXNbJ0NvbmNhdCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snUmVzdG9yZSddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snU2F2ZUxheWVyJ109Y2F0ZWdvcmllc1snbWlzYyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydTYXZlJ109Y2F0ZWdvcmllc1snbWlzYyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydCZWdpbkNvbW1lbnRHcm91cCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snQWRkQ29tbWVudCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRW5kQ29tbWVudEdyb3VwJ109Y2F0ZWdvcmllc1snbWlzYyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydDbGlwUmVjdCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snQ2xpcFJSZWN0J109Y2F0ZWdvcmllc1snbWlzYyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydDbGlwUGF0aCddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snQ2xpcFJlZ2lvbiddPWNhdGVnb3JpZXNbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd1BvaW50cyddPWNhdGVnb3JpZXNbJ3NoYXBlcyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3UmVjdCddPWNhdGVnb3JpZXNbJ3NoYXBlcyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3T3ZhbCddPWNhdGVnb3JpZXNbJ3NoYXBlcyddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3UlJlY3QnXT1jYXRlZ29yaWVzWydzaGFwZXMnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd1BhdGgnXT1jYXRlZ29yaWVzWydzaGFwZXMnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd1ZlcnRpY2VzJ109Y2F0ZWdvcmllc1snc2hhcGVzJ107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdEUlJlY3QnXT1jYXRlZ29yaWVzWydzaGFwZXMnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd0JpdG1hcCddPWNhdGVnb3JpZXNbJ2JpdG1hcCddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3Qml0bWFwUmVjdFRvUmVjdCddPWNhdGVnb3JpZXNbJ2JpdG1hcCddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3Qml0bWFwTWF0cml4J109Y2F0ZWdvcmllc1snYml0bWFwJ107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdCaXRtYXBOaW5lJ109Y2F0ZWdvcmllc1snYml0bWFwJ107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdTcHJpdGUnXT1jYXRlZ29yaWVzWydiaXRtYXAnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd1BpY3R1cmUnXT1jYXRlZ29yaWVzWydiaXRtYXAnXTtsb2dJdGVtQ2F0ZWdvcmllc1snRHJhd1RleHQnXT1jYXRlZ29yaWVzWyd0ZXh0J107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdQb3NUZXh0J109Y2F0ZWdvcmllc1sndGV4dCddO2xvZ0l0ZW1DYXRlZ29yaWVzWydEcmF3UG9zVGV4dEgnXT1jYXRlZ29yaWVzWyd0ZXh0J107bG9nSXRlbUNhdGVnb3JpZXNbJ0RyYXdUZXh0T25QYXRoJ109Y2F0ZWdvcmllc1sndGV4dCddO0xheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3Ll9sb2dJdGVtQ2F0ZWdvcmllc01hcD1sb2dJdGVtQ2F0ZWdvcmllcztyZXR1cm4gbG9nSXRlbUNhdGVnb3JpZXM7fQpzdGF0aWMgX2NhdGVnb3J5Rm9yTG9nSXRlbShsb2dJdGVtKXtjb25zdCBtZXRob2Q9bG9nSXRlbS5tZXRob2QudG9UaXRsZUNhc2UoKTtjb25zdCBsb2dJdGVtQ2F0ZWdvcmllcz1MYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5faW5pdExvZ0l0ZW1DYXRlZ29yaWVzKCk7bGV0IHJlc3VsdD1sb2dJdGVtQ2F0ZWdvcmllc1ttZXRob2RdO2lmKCFyZXN1bHQpe3Jlc3VsdD1MYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5jYXRlZ29yaWVzKClbJ21pc2MnXTtsb2dJdGVtQ2F0ZWdvcmllc1ttZXRob2RdPXJlc3VsdDt9CnJldHVybiByZXN1bHQ7fQpvblJlc2l6ZSgpe3RoaXMuX3VwZGF0ZSgpO30KYXN5bmMgc2V0U25hcHNob3RBbmRMb2coc25hcHNob3QsbG9nLGNsaXBSZWN0KXt0aGlzLl9yZXNldCgpO3RoaXMuX3NuYXBzaG90PXNuYXBzaG90O2lmKHRoaXMuX3NuYXBzaG90KQp0aGlzLl9zbmFwc2hvdC5hZGRSZWZlcmVuY2UoKTt0aGlzLl9sb2c9bG9nO3RoaXMuX2xvZ0NhdGVnb3JpZXM9dGhpcy5fbG9nLm1hcChMYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5fY2F0ZWdvcnlGb3JMb2dJdGVtKTtpZighdGhpcy5fc25hcHNob3Qpe3RoaXMuX3VwZGF0ZSgpO3RoaXMuX3BpZUNoYXJ0LnNldFRvdGFsKDApO3RoaXMuX3NlbGVjdGlvbldpbmRvdy5zZXRFbmFibGVkKGZhbHNlKTtyZXR1cm47fQp0aGlzLl9zZWxlY3Rpb25XaW5kb3cuc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9wcm9ncmVzc0Jhbm5lci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLl91cGRhdGVJbWFnZSgpO2NvbnN0IHByb2ZpbGVzPWF3YWl0IHNuYXBzaG90LnByb2ZpbGUoY2xpcFJlY3QpO3RoaXMuX3Byb2dyZXNzQmFubmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX3Byb2ZpbGVzPXByb2ZpbGVzO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX3VwZGF0ZVBpZUNoYXJ0KCk7fQpzZXRTY2FsZShzY2FsZSl7Y29uc3QgbmVlZHNVcGRhdGU9c2NhbGU+dGhpcy5fc2NhbGU7Y29uc3QgcHJlZGljdGl2ZUdyb3d0aEZhY3Rvcj0yO3RoaXMuX3BlbmRpbmdTY2FsZT1NYXRoLm1pbigxLHNjYWxlKnByZWRpY3RpdmVHcm93dGhGYWN0b3IpO2lmKG5lZWRzVXBkYXRlJiZ0aGlzLl9zbmFwc2hvdCkKdGhpcy5fdXBkYXRlSW1hZ2UoKTt9Cl91cGRhdGUoKXt0aGlzLl9jYW52YXMud2lkdGg9dGhpcy5fY2FudmFzQ29udGFpbmVyLmNsaWVudFdpZHRoKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX2NhbnZhcy5oZWlnaHQ9dGhpcy5fY2FudmFzQ29udGFpbmVyLmNsaWVudEhlaWdodCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9zYW1wbGVzUGVyQmFyPTA7aWYoIXRoaXMuX3Byb2ZpbGVzfHwhdGhpcy5fcHJvZmlsZXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgbWF4QmFycz1NYXRoLmZsb29yKCh0aGlzLl9jYW52YXMud2lkdGgtMip0aGlzLl9iYXJQYWRkaW5nV2lkdGgpL3RoaXMuX291dGVyQmFyV2lkdGgpO2NvbnN0IHNhbXBsZUNvdW50PXRoaXMuX2xvZy5sZW5ndGg7dGhpcy5fc2FtcGxlc1BlckJhcj1NYXRoLmNlaWwoc2FtcGxlQ291bnQvbWF4QmFycyk7bGV0IG1heEJhclRpbWU9MDtjb25zdCBiYXJUaW1lcz1bXTtjb25zdCBiYXJIZWlnaHRCeUNhdGVnb3J5PVtdO2xldCBoZWlnaHRCeUNhdGVnb3J5PXt9O2ZvcihsZXQgaT0wLGxhc3RCYXJJbmRleD0wLGxhc3RCYXJUaW1lPTA7aTxzYW1wbGVDb3VudDspe2xldCBjYXRlZ29yeU5hbWU9KHRoaXMuX2xvZ0NhdGVnb3JpZXNbaV0mJnRoaXMuX2xvZ0NhdGVnb3JpZXNbaV0ubmFtZSl8fCdtaXNjJztjb25zdCBzYW1wbGVJbmRleD10aGlzLl9sb2dbaV0uY29tbWFuZEluZGV4O2ZvcihsZXQgcm93PTA7cm93PHRoaXMuX3Byb2ZpbGVzLmxlbmd0aDtyb3crKyl7Y29uc3Qgc2FtcGxlPXRoaXMuX3Byb2ZpbGVzW3Jvd11bc2FtcGxlSW5kZXhdO2xhc3RCYXJUaW1lKz1zYW1wbGU7aGVpZ2h0QnlDYXRlZ29yeVtjYXRlZ29yeU5hbWVdPShoZWlnaHRCeUNhdGVnb3J5W2NhdGVnb3J5TmFtZV18fDApK3NhbXBsZTt9CisraTtpZihpLWxhc3RCYXJJbmRleD09PXRoaXMuX3NhbXBsZXNQZXJCYXJ8fGk9PT1zYW1wbGVDb3VudCl7Y29uc3QgZmFjdG9yPXRoaXMuX3Byb2ZpbGVzLmxlbmd0aCooaS1sYXN0QmFySW5kZXgpO2xhc3RCYXJUaW1lLz1mYWN0b3I7Zm9yKGNhdGVnb3J5TmFtZSBpbiBoZWlnaHRCeUNhdGVnb3J5KQpoZWlnaHRCeUNhdGVnb3J5W2NhdGVnb3J5TmFtZV0vPWZhY3RvcjtiYXJUaW1lcy5wdXNoKGxhc3RCYXJUaW1lKTtiYXJIZWlnaHRCeUNhdGVnb3J5LnB1c2goaGVpZ2h0QnlDYXRlZ29yeSk7aWYobGFzdEJhclRpbWU+bWF4QmFyVGltZSkKbWF4QmFyVGltZT1sYXN0QmFyVGltZTtsYXN0QmFyVGltZT0wO2hlaWdodEJ5Q2F0ZWdvcnk9e307bGFzdEJhckluZGV4PWk7fX0KY29uc3QgcGFkZGluZ0hlaWdodD00KndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO2NvbnN0IHNjYWxlPSh0aGlzLl9jYW52YXMuaGVpZ2h0LXBhZGRpbmdIZWlnaHQtdGhpcy5fbWluQmFySGVpZ2h0KS9tYXhCYXJUaW1lO2ZvcihsZXQgaT0wO2k8YmFyVGltZXMubGVuZ3RoOysraSl7Zm9yKGNvbnN0IGNhdGVnb3J5TmFtZSBpbiBiYXJIZWlnaHRCeUNhdGVnb3J5W2ldKQpiYXJIZWlnaHRCeUNhdGVnb3J5W2ldW2NhdGVnb3J5TmFtZV0qPShiYXJUaW1lc1tpXSpzY2FsZSt0aGlzLl9taW5CYXJIZWlnaHQpL2JhclRpbWVzW2ldO3RoaXMuX3JlbmRlckJhcihpLGJhckhlaWdodEJ5Q2F0ZWdvcnlbaV0pO319Cl9yZW5kZXJCYXIoaW5kZXgsaGVpZ2h0QnlDYXRlZ29yeSl7Y29uc3QgY2F0ZWdvcmllcz1MYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5jYXRlZ29yaWVzKCk7bGV0IGN1cnJlbnRIZWlnaHQ9MDtjb25zdCB4PXRoaXMuX2JhclBhZGRpbmdXaWR0aCtpbmRleCp0aGlzLl9vdXRlckJhcldpZHRoO2Zvcihjb25zdCBjYXRlZ29yeU5hbWUgaW4gY2F0ZWdvcmllcyl7aWYoIWhlaWdodEJ5Q2F0ZWdvcnlbY2F0ZWdvcnlOYW1lXSkKY29udGludWU7Y3VycmVudEhlaWdodCs9aGVpZ2h0QnlDYXRlZ29yeVtjYXRlZ29yeU5hbWVdO2NvbnN0IHk9dGhpcy5fY2FudmFzLmhlaWdodC1jdXJyZW50SGVpZ2h0O3RoaXMuX2NvbnRleHQuZmlsbFN0eWxlPWNhdGVnb3JpZXNbY2F0ZWdvcnlOYW1lXS5jb2xvcjt0aGlzLl9jb250ZXh0LmZpbGxSZWN0KHgseSx0aGlzLl9pbm5lckJhcldpZHRoLGhlaWdodEJ5Q2F0ZWdvcnlbY2F0ZWdvcnlOYW1lXSk7fX0KX29uV2luZG93Q2hhbmdlZCgpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3LkV2ZW50cy5XaW5kb3dDaGFuZ2VkKTt0aGlzLl91cGRhdGVQaWVDaGFydCgpO2lmKHRoaXMuX3VwZGF0ZUltYWdlVGltZXIpCnJldHVybjt0aGlzLl91cGRhdGVJbWFnZVRpbWVyPXNldFRpbWVvdXQodGhpcy5fdXBkYXRlSW1hZ2UuYmluZCh0aGlzKSwxMDApO30KX3VwZGF0ZVBpZUNoYXJ0KCl7Y29uc3Qgd2luZG93PXRoaXMuc2VsZWN0aW9uV2luZG93KCk7aWYoIXRoaXMuX3Byb2ZpbGVzfHwhdGhpcy5fcHJvZmlsZXMubGVuZ3RofHwhd2luZG93KQpyZXR1cm47bGV0IHRvdGFsVGltZT0wO2NvbnN0IHRpbWVCeUNhdGVnb3J5PXt9O2ZvcihsZXQgaT13aW5kb3cubGVmdDtpPHdpbmRvdy5yaWdodDsrK2kpe2NvbnN0IGxvZ0VudHJ5PXRoaXMuX2xvZ1tpXTtjb25zdCBjYXRlZ29yeT1MYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5fY2F0ZWdvcnlGb3JMb2dJdGVtKGxvZ0VudHJ5KTt0aW1lQnlDYXRlZ29yeVtjYXRlZ29yeS5jb2xvcl09dGltZUJ5Q2F0ZWdvcnlbY2F0ZWdvcnkuY29sb3JdfHwwO2ZvcihsZXQgaj0wO2o8dGhpcy5fcHJvZmlsZXMubGVuZ3RoOysrail7Y29uc3QgdGltZT10aGlzLl9wcm9maWxlc1tqXVtsb2dFbnRyeS5jb21tYW5kSW5kZXhdO3RvdGFsVGltZSs9dGltZTt0aW1lQnlDYXRlZ29yeVtjYXRlZ29yeS5jb2xvcl0rPXRpbWU7fX0KdGhpcy5fcGllQ2hhcnQuc2V0VG90YWwodG90YWxUaW1lL3RoaXMuX3Byb2ZpbGVzLmxlbmd0aCk7Zm9yKGNvbnN0IGNvbG9yIGluIHRpbWVCeUNhdGVnb3J5KQp0aGlzLl9waWVDaGFydC5hZGRTbGljZSh0aW1lQnlDYXRlZ29yeVtjb2xvcl0vdGhpcy5fcHJvZmlsZXMubGVuZ3RoLGNvbG9yKTt9Cl9mb3JtYXRQaWVDaGFydFRpbWUodmFsdWUpe3JldHVybiBOdW1iZXIubWlsbGlzVG9TdHJpbmcodmFsdWUqMTAwMCx0cnVlKTt9CnNlbGVjdGlvbldpbmRvdygpe2lmKCF0aGlzLl9sb2cpCnJldHVybiBudWxsO2NvbnN0IHNjcmVlbkxlZnQ9dGhpcy5fc2VsZWN0aW9uV2luZG93LndpbmRvd0xlZnQqdGhpcy5fY2FudmFzLndpZHRoO2NvbnN0IHNjcmVlblJpZ2h0PXRoaXMuX3NlbGVjdGlvbldpbmRvdy53aW5kb3dSaWdodCp0aGlzLl9jYW52YXMud2lkdGg7Y29uc3QgYmFyTGVmdD1NYXRoLmZsb29yKHNjcmVlbkxlZnQvdGhpcy5fb3V0ZXJCYXJXaWR0aCk7Y29uc3QgYmFyUmlnaHQ9TWF0aC5mbG9vcigoc2NyZWVuUmlnaHQrdGhpcy5faW5uZXJCYXJXaWR0aC10aGlzLl9iYXJQYWRkaW5nV2lkdGgvMikvdGhpcy5fb3V0ZXJCYXJXaWR0aCk7Y29uc3Qgc3RlcExlZnQ9TnVtYmVyLmNvbnN0cmFpbihiYXJMZWZ0KnRoaXMuX3NhbXBsZXNQZXJCYXIsMCx0aGlzLl9sb2cubGVuZ3RoLTEpO2NvbnN0IHN0ZXBSaWdodD1OdW1iZXIuY29uc3RyYWluKGJhclJpZ2h0KnRoaXMuX3NhbXBsZXNQZXJCYXIsMCx0aGlzLl9sb2cubGVuZ3RoKTtyZXR1cm57bGVmdDpzdGVwTGVmdCxyaWdodDpzdGVwUmlnaHR9O30KX3VwZGF0ZUltYWdlKCl7ZGVsZXRlIHRoaXMuX3VwZGF0ZUltYWdlVGltZXI7bGV0IGxlZnQ7bGV0IHJpZ2h0O2NvbnN0IHdpbmRvdz10aGlzLnNlbGVjdGlvbldpbmRvdygpO2lmKHRoaXMuX3Byb2ZpbGVzJiZ0aGlzLl9wcm9maWxlcy5sZW5ndGgmJndpbmRvdyl7bGVmdD10aGlzLl9sb2dbd2luZG93LmxlZnRdLmNvbW1hbmRJbmRleDtyaWdodD10aGlzLl9sb2dbd2luZG93LnJpZ2h0LTFdLmNvbW1hbmRJbmRleDt9CmNvbnN0IHNjYWxlPXRoaXMuX3BlbmRpbmdTY2FsZTt0aGlzLl9zbmFwc2hvdC5yZXBsYXkoc2NhbGUsbGVmdCxyaWdodCkudGhlbihpbWFnZT0+e2lmKCFpbWFnZSkKcmV0dXJuO3RoaXMuX3NjYWxlPXNjYWxlO3RoaXMuX3Nob3dJbWFnZUNhbGxiYWNrKGltYWdlKTt9KTt9Cl9yZXNldCgpe2lmKHRoaXMuX3NuYXBzaG90KQp0aGlzLl9zbmFwc2hvdC5yZWxlYXNlKCk7dGhpcy5fc25hcHNob3Q9bnVsbDt0aGlzLl9wcm9maWxlcz1udWxsO3RoaXMuX3NlbGVjdGlvbldpbmRvdy5yZXNldCgpO3RoaXMuX3NlbGVjdGlvbldpbmRvdy5zZXRFbmFibGVkKGZhbHNlKTt9fTtMYXllclZpZXdlci5QYWludFByb2ZpbGVyVmlldy5FdmVudHM9e1dpbmRvd0NoYW5nZWQ6U3ltYm9sKCdXaW5kb3dDaGFuZ2VkJyl9O0xheWVyVmlld2VyLlBhaW50UHJvZmlsZXJDb21tYW5kTG9nVmlldz1jbGFzcyBleHRlbmRzIFVJLlRocm90dGxlZFdpZGdldHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5zZXRNaW5pbXVtU2l6ZSgxMDAsMjUpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvdmVyZmxvdy1hdXRvJyk7dGhpcy5fdHJlZU91dGxpbmU9bmV3IFVJLlRyZWVPdXRsaW5lSW5TaGFkb3coKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudCk7dGhpcy5fbG9nPVtdO30Kc2V0Q29tbWFuZExvZyhsb2cpe3RoaXMuX2xvZz1sb2c7dGhpcy5fdHJlZUl0ZW1DYWNoZT1uZXcgTWFwKCk7dGhpcy51cGRhdGVXaW5kb3coe2xlZnQ6MCxyaWdodDp0aGlzLl9sb2cubGVuZ3RofSk7fQpfYXBwZW5kTG9nSXRlbShsb2dJdGVtKXtsZXQgdHJlZUVsZW1lbnQ9dGhpcy5fdHJlZUl0ZW1DYWNoZS5nZXQobG9nSXRlbSk7aWYoIXRyZWVFbGVtZW50KXt0cmVlRWxlbWVudD1uZXcgTGF5ZXJWaWV3ZXIuTG9nVHJlZUVsZW1lbnQodGhpcyxsb2dJdGVtKTt0aGlzLl90cmVlSXRlbUNhY2hlLnNldChsb2dJdGVtLHRyZWVFbGVtZW50KTt9ZWxzZSBpZih0cmVlRWxlbWVudC5wYXJlbnQpe3JldHVybjt9CnRoaXMuX3RyZWVPdXRsaW5lLmFwcGVuZENoaWxkKHRyZWVFbGVtZW50KTt9CnVwZGF0ZVdpbmRvdyhzZWxlY3Rpb25XaW5kb3cpe3RoaXMuX3NlbGVjdGlvbldpbmRvdz1zZWxlY3Rpb25XaW5kb3c7dGhpcy51cGRhdGUoKTt9CmRvVXBkYXRlKCl7aWYoIXRoaXMuX3NlbGVjdGlvbldpbmRvd3x8IXRoaXMuX2xvZy5sZW5ndGgpe3RoaXMuX3RyZWVPdXRsaW5lLnJlbW92ZUNoaWxkcmVuKCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KY29uc3Qgcm9vdD10aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpO2Zvcig7Oyl7Y29uc3QgY2hpbGQ9cm9vdC5maXJzdENoaWxkKCk7aWYoIWNoaWxkfHxjaGlsZC5fbG9nSXRlbS5jb21tYW5kSW5kZXg+PXRoaXMuX3NlbGVjdGlvbldpbmRvdy5sZWZ0KQpicmVhaztyb290LnJlbW92ZUNoaWxkQXRJbmRleCgwKTt9CmZvcig7Oyl7Y29uc3QgY2hpbGQ9cm9vdC5sYXN0Q2hpbGQoKTtpZighY2hpbGR8fGNoaWxkLl9sb2dJdGVtLmNvbW1hbmRJbmRleDx0aGlzLl9zZWxlY3Rpb25XaW5kb3cucmlnaHQpCmJyZWFrO3Jvb3QucmVtb3ZlQ2hpbGRBdEluZGV4KHJvb3QuY2hpbGRyZW4oKS5sZW5ndGgtMSk7fQpmb3IobGV0IGk9dGhpcy5fc2VsZWN0aW9uV2luZG93LmxlZnQscmlnaHQ9dGhpcy5fc2VsZWN0aW9uV2luZG93LnJpZ2h0O2k8cmlnaHQ7KytpKQp0aGlzLl9hcHBlbmRMb2dJdGVtKHRoaXMuX2xvZ1tpXSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319O0xheWVyVmlld2VyLkxvZ1RyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Iob3duZXJWaWV3LGxvZ0l0ZW0pe3N1cGVyKCcnLCEhbG9nSXRlbS5wYXJhbXMpO3RoaXMuX2xvZ0l0ZW09bG9nSXRlbTt0aGlzLl9vd25lclZpZXc9b3duZXJWaWV3O3RoaXMuX2ZpbGxlZD1mYWxzZTt9Cm9uYXR0YWNoKCl7dGhpcy5fdXBkYXRlKCk7fQpvbnBvcHVsYXRlKCl7Zm9yKGNvbnN0IHBhcmFtIGluIHRoaXMuX2xvZ0l0ZW0ucGFyYW1zKQpMYXllclZpZXdlci5Mb2dQcm9wZXJ0eVRyZWVFbGVtZW50Ll9hcHBlbmRMb2dQcm9wZXJ0eUl0ZW0odGhpcyxwYXJhbSx0aGlzLl9sb2dJdGVtLnBhcmFtc1twYXJhbV0pO30KX3BhcmFtVG9TdHJpbmcocGFyYW0sbmFtZSl7aWYodHlwZW9mIHBhcmFtIT09J29iamVjdCcpCnJldHVybiB0eXBlb2YgcGFyYW09PT0nc3RyaW5nJyYmcGFyYW0ubGVuZ3RoPjEwMD9uYW1lOkpTT04uc3RyaW5naWZ5KHBhcmFtKTtsZXQgc3RyPScnO2xldCBrZXlDb3VudD0wO2Zvcihjb25zdCBrZXkgaW4gcGFyYW0pe2lmKCsra2V5Q291bnQ+NHx8dHlwZW9mIHBhcmFtW2tleV09PT0nb2JqZWN0J3x8KHR5cGVvZiBwYXJhbVtrZXldPT09J3N0cmluZycmJnBhcmFtW2tleV0ubGVuZ3RoPjEwMCkpCnJldHVybiBuYW1lO2lmKHN0cikKc3RyKz0nLCAnO3N0cis9cGFyYW1ba2V5XTt9CnJldHVybiBzdHI7fQpfcGFyYW1zVG9TdHJpbmcocGFyYW1zKXtsZXQgc3RyPScnO2Zvcihjb25zdCBrZXkgaW4gcGFyYW1zKXtpZihzdHIpCnN0cis9JywgJztzdHIrPXRoaXMuX3BhcmFtVG9TdHJpbmcocGFyYW1zW2tleV0sa2V5KTt9CnJldHVybiBzdHI7fQpfdXBkYXRlKCl7Y29uc3QgdGl0bGU9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO3RpdGxlLmNyZWF0ZVRleHRDaGlsZCh0aGlzLl9sb2dJdGVtLm1ldGhvZCsnKCcrdGhpcy5fcGFyYW1zVG9TdHJpbmcodGhpcy5fbG9nSXRlbS5wYXJhbXMpKycpJyk7dGhpcy50aXRsZT10aXRsZTt9fTtMYXllclZpZXdlci5Mb2dQcm9wZXJ0eVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3IocHJvcGVydHkpe3N1cGVyKCk7dGhpcy5fcHJvcGVydHk9cHJvcGVydHk7fQpzdGF0aWMgX2FwcGVuZExvZ1Byb3BlcnR5SXRlbShlbGVtZW50LG5hbWUsdmFsdWUpe2NvbnN0IHRyZWVFbGVtZW50PW5ldyBMYXllclZpZXdlci5Mb2dQcm9wZXJ0eVRyZWVFbGVtZW50KHtuYW1lOm5hbWUsdmFsdWU6dmFsdWV9KTtlbGVtZW50LmFwcGVuZENoaWxkKHRyZWVFbGVtZW50KTtpZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09J29iamVjdCcpe2Zvcihjb25zdCBwcm9wZXJ0eSBpbiB2YWx1ZSkKTGF5ZXJWaWV3ZXIuTG9nUHJvcGVydHlUcmVlRWxlbWVudC5fYXBwZW5kTG9nUHJvcGVydHlJdGVtKHRyZWVFbGVtZW50LHByb3BlcnR5LHZhbHVlW3Byb3BlcnR5XSk7fX0Kb25hdHRhY2goKXtjb25zdCB0aXRsZT1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Y29uc3QgbmFtZUVsZW1lbnQ9dGl0bGUuY3JlYXRlQ2hpbGQoJ3NwYW4nLCduYW1lJyk7bmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9dGhpcy5fcHJvcGVydHkubmFtZTtjb25zdCBzZXBhcmF0b3JFbGVtZW50PXRpdGxlLmNyZWF0ZUNoaWxkKCdzcGFuJywnc2VwYXJhdG9yJyk7c2VwYXJhdG9yRWxlbWVudC50ZXh0Q29udGVudD0nOiAnO2lmKHRoaXMuX3Byb3BlcnR5LnZhbHVlPT09bnVsbHx8dHlwZW9mIHRoaXMuX3Byb3BlcnR5LnZhbHVlIT09J29iamVjdCcpe2NvbnN0IHZhbHVlRWxlbWVudD10aXRsZS5jcmVhdGVDaGlsZCgnc3BhbicsJ3ZhbHVlJyk7dmFsdWVFbGVtZW50LnRleHRDb250ZW50PUpTT04uc3RyaW5naWZ5KHRoaXMuX3Byb3BlcnR5LnZhbHVlKTt2YWx1ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY20tanMtJysodGhpcy5fcHJvcGVydHkudmFsdWU9PT1udWxsPydudWxsJzp0eXBlb2YgdGhpcy5fcHJvcGVydHkudmFsdWUpKTt9CnRoaXMudGl0bGU9dGl0bGU7fX07TGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlckNhdGVnb3J5PWNsYXNze2NvbnN0cnVjdG9yKG5hbWUsdGl0bGUsY29sb3Ipe3RoaXMubmFtZT1uYW1lO3RoaXMudGl0bGU9dGl0bGU7dGhpcy5jb2xvcj1jb2xvcjt9fTs7TGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlcj1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoZWxlbWVudCxkaXNhYmxlUm90YXRlKXtzdXBlcigpO3RoaXMuX3Nob3J0Y3V0cz17fTt0aGlzLmVsZW1lbnQ9ZWxlbWVudDtpZih0aGlzLmVsZW1lbnQudGFiSW5kZXg8MCkKdGhpcy5lbGVtZW50LnRhYkluZGV4PTA7dGhpcy5fcmVnaXN0ZXJTaG9ydGN1dHMoKTtVSS5pbnN0YWxsRHJhZ0hhbmRsZShlbGVtZW50LHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcyksdGhpcy5fb25EcmFnLmJpbmQodGhpcyksdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcyksJ21vdmUnLG51bGwpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSxmYWxzZSk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJyx0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbWluU2NhbGU9MDt0aGlzLl9tYXhTY2FsZT1JbmZpbml0eTt0aGlzLl9jb250cm9sUGFuZWxUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCd0cmFuc2Zvcm0tY29udHJvbC1wYW5lbCcpO3RoaXMuX21vZGVCdXR0b25zPXt9O2lmKCFkaXNhYmxlUm90YXRlKXtjb25zdCBwYW5Nb2RlQnV0dG9uPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKENvbW1vbi5VSVN0cmluZygnUGFuIG1vZGUgKFgpJyksJ2xhcmdlaWNvbi1wYW4nKTtwYW5Nb2RlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fc2V0TW9kZS5iaW5kKHRoaXMsTGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlci5Nb2Rlcy5QYW4pKTt0aGlzLl9tb2RlQnV0dG9uc1tMYXllclZpZXdlci5UcmFuc2Zvcm1Db250cm9sbGVyLk1vZGVzLlBhbl09cGFuTW9kZUJ1dHRvbjt0aGlzLl9jb250cm9sUGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHBhbk1vZGVCdXR0b24pO2NvbnN0IHJvdGF0ZU1vZGVCdXR0b249bmV3IFVJLlRvb2xiYXJUb2dnbGUoQ29tbW9uLlVJU3RyaW5nKCdSb3RhdGUgbW9kZSAoViknKSwnbGFyZ2VpY29uLXJvdGF0ZScpO3JvdGF0ZU1vZGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9zZXRNb2RlLmJpbmQodGhpcyxMYXllclZpZXdlci5UcmFuc2Zvcm1Db250cm9sbGVyLk1vZGVzLlJvdGF0ZSkpO3RoaXMuX21vZGVCdXR0b25zW0xheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUm90YXRlXT1yb3RhdGVNb2RlQnV0dG9uO3RoaXMuX2NvbnRyb2xQYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0ocm90YXRlTW9kZUJ1dHRvbik7fQp0aGlzLl9zZXRNb2RlKExheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUGFuKTtjb25zdCByZXNldEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1Jlc2V0IHRyYW5zZm9ybSAoMCknKSwnbGFyZ2VpY29uLWNlbnRlcicpO3Jlc2V0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5yZXNldEFuZE5vdGlmeS5iaW5kKHRoaXMsdW5kZWZpbmVkKSk7dGhpcy5fY29udHJvbFBhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShyZXNldEJ1dHRvbik7dGhpcy5fcmVzZXQoKTt9CnRvb2xiYXIoKXtyZXR1cm4gdGhpcy5fY29udHJvbFBhbmVsVG9vbGJhcjt9Cl9vbktleURvd24oZXZlbnQpe2lmKGV2ZW50LmtleUNvZGU9PT1VSS5LZXlib2FyZFNob3J0Y3V0LktleXMuU2hpZnQuY29kZSl7dGhpcy5fdG9nZ2xlTW9kZSgpO3JldHVybjt9CmNvbnN0IHNob3J0Y3V0S2V5PVVJLktleWJvYXJkU2hvcnRjdXQubWFrZUtleUZyb21FdmVudElnbm9yaW5nTW9kaWZpZXJzKGV2ZW50KTtjb25zdCBoYW5kbGVyPXRoaXMuX3Nob3J0Y3V0c1tzaG9ydGN1dEtleV07aWYoaGFuZGxlciYmaGFuZGxlcihldmVudCkpCmV2ZW50LmNvbnN1bWUoKTt9Cl9vbktleVVwKGV2ZW50KXtpZihldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLlNoaWZ0LmNvZGUpCnRoaXMuX3RvZ2dsZU1vZGUoKTt9Cl9hZGRTaG9ydGN1dHMoa2V5cyxoYW5kbGVyKXtmb3IobGV0IGk9MDtpPGtleXMubGVuZ3RoOysraSkKdGhpcy5fc2hvcnRjdXRzW2tleXNbaV0ua2V5XT1oYW5kbGVyO30KX3JlZ2lzdGVyU2hvcnRjdXRzKCl7dGhpcy5fYWRkU2hvcnRjdXRzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5SZXNldFZpZXcsdGhpcy5yZXNldEFuZE5vdGlmeS5iaW5kKHRoaXMpKTt0aGlzLl9hZGRTaG9ydGN1dHMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlBhbk1vZGUsdGhpcy5fc2V0TW9kZS5iaW5kKHRoaXMsTGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlci5Nb2Rlcy5QYW4pKTt0aGlzLl9hZGRTaG9ydGN1dHMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlJvdGF0ZU1vZGUsdGhpcy5fc2V0TW9kZS5iaW5kKHRoaXMsTGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlci5Nb2Rlcy5Sb3RhdGUpKTtjb25zdCB6b29tRmFjdG9yPTEuMTt0aGlzLl9hZGRTaG9ydGN1dHMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLlpvb21Jbix0aGlzLl9vbktleWJvYXJkWm9vbS5iaW5kKHRoaXMsem9vbUZhY3RvcikpO3RoaXMuX2FkZFNob3J0Y3V0cyhVSS5TaG9ydGN1dHNTY3JlZW4uTGF5ZXJzUGFuZWxTaG9ydGN1dHMuWm9vbU91dCx0aGlzLl9vbktleWJvYXJkWm9vbS5iaW5kKHRoaXMsMS96b29tRmFjdG9yKSk7dGhpcy5fYWRkU2hvcnRjdXRzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5VcCx0aGlzLl9vbktleWJvYXJkUGFuT3JSb3RhdGUuYmluZCh0aGlzLDAsLTEpKTt0aGlzLl9hZGRTaG9ydGN1dHMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLkRvd24sdGhpcy5fb25LZXlib2FyZFBhbk9yUm90YXRlLmJpbmQodGhpcywwLDEpKTt0aGlzLl9hZGRTaG9ydGN1dHMoVUkuU2hvcnRjdXRzU2NyZWVuLkxheWVyc1BhbmVsU2hvcnRjdXRzLkxlZnQsdGhpcy5fb25LZXlib2FyZFBhbk9yUm90YXRlLmJpbmQodGhpcywtMSwwKSk7dGhpcy5fYWRkU2hvcnRjdXRzKFVJLlNob3J0Y3V0c1NjcmVlbi5MYXllcnNQYW5lbFNob3J0Y3V0cy5SaWdodCx0aGlzLl9vbktleWJvYXJkUGFuT3JSb3RhdGUuYmluZCh0aGlzLDEsMCkpO30KX3Bvc3RDaGFuZ2VFdmVudCgpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKExheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuRXZlbnRzLlRyYW5zZm9ybUNoYW5nZWQpO30KX3Jlc2V0KCl7dGhpcy5fc2NhbGU9MTt0aGlzLl9vZmZzZXRYPTA7dGhpcy5fb2Zmc2V0WT0wO3RoaXMuX3JvdGF0ZVg9MDt0aGlzLl9yb3RhdGVZPTA7fQpfdG9nZ2xlTW9kZSgpe3RoaXMuX3NldE1vZGUodGhpcy5fbW9kZT09PUxheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUGFuP0xheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUm90YXRlOkxheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUGFuKTt9Cl9zZXRNb2RlKG1vZGUpe2lmKHRoaXMuX21vZGU9PT1tb2RlKQpyZXR1cm47dGhpcy5fbW9kZT1tb2RlO3RoaXMuX3VwZGF0ZU1vZGVCdXR0b25zKCk7dGhpcy5lbGVtZW50LmZvY3VzKCk7fQpfdXBkYXRlTW9kZUJ1dHRvbnMoKXtmb3IoY29uc3QgbW9kZSBpbiB0aGlzLl9tb2RlQnV0dG9ucykKdGhpcy5fbW9kZUJ1dHRvbnNbbW9kZV0uc2V0VG9nZ2xlZChtb2RlPT09dGhpcy5fbW9kZSk7fQpyZXNldEFuZE5vdGlmeShldmVudCl7dGhpcy5fcmVzZXQoKTt0aGlzLl9wb3N0Q2hhbmdlRXZlbnQoKTtpZihldmVudCkKZXZlbnQucHJldmVudERlZmF1bHQoKTt0aGlzLmVsZW1lbnQuZm9jdXMoKTt9CnNldFNjYWxlQ29uc3RyYWludHMobWluU2NhbGUsbWF4U2NhbGUpe3RoaXMuX21pblNjYWxlPW1pblNjYWxlO3RoaXMuX21heFNjYWxlPW1heFNjYWxlO3RoaXMuX3NjYWxlPU51bWJlci5jb25zdHJhaW4odGhpcy5fc2NhbGUsbWluU2NhbGUsbWF4U2NhbGUpO30KY2xhbXBPZmZzZXRzKG1pblgsbWF4WCxtaW5ZLG1heFkpe3RoaXMuX29mZnNldFg9TnVtYmVyLmNvbnN0cmFpbih0aGlzLl9vZmZzZXRYLG1pblgsbWF4WCk7dGhpcy5fb2Zmc2V0WT1OdW1iZXIuY29uc3RyYWluKHRoaXMuX29mZnNldFksbWluWSxtYXhZKTt9CnNjYWxlKCl7cmV0dXJuIHRoaXMuX3NjYWxlO30Kb2Zmc2V0WCgpe3JldHVybiB0aGlzLl9vZmZzZXRYO30Kb2Zmc2V0WSgpe3JldHVybiB0aGlzLl9vZmZzZXRZO30Kcm90YXRlWCgpe3JldHVybiB0aGlzLl9yb3RhdGVYO30Kcm90YXRlWSgpe3JldHVybiB0aGlzLl9yb3RhdGVZO30KX29uU2NhbGUoc2NhbGVGYWN0b3IseCx5KXtzY2FsZUZhY3Rvcj1OdW1iZXIuY29uc3RyYWluKHRoaXMuX3NjYWxlKnNjYWxlRmFjdG9yLHRoaXMuX21pblNjYWxlLHRoaXMuX21heFNjYWxlKS90aGlzLl9zY2FsZTt0aGlzLl9zY2FsZSo9c2NhbGVGYWN0b3I7dGhpcy5fb2Zmc2V0WC09KHgtdGhpcy5fb2Zmc2V0WCkqKHNjYWxlRmFjdG9yLTEpO3RoaXMuX29mZnNldFktPSh5LXRoaXMuX29mZnNldFkpKihzY2FsZUZhY3Rvci0xKTt0aGlzLl9wb3N0Q2hhbmdlRXZlbnQoKTt9Cl9vblBhbihvZmZzZXRYLG9mZnNldFkpe3RoaXMuX29mZnNldFgrPW9mZnNldFg7dGhpcy5fb2Zmc2V0WSs9b2Zmc2V0WTt0aGlzLl9wb3N0Q2hhbmdlRXZlbnQoKTt9Cl9vblJvdGF0ZShyb3RhdGVYLHJvdGF0ZVkpe3RoaXMuX3JvdGF0ZVg9cm90YXRlWDt0aGlzLl9yb3RhdGVZPXJvdGF0ZVk7dGhpcy5fcG9zdENoYW5nZUV2ZW50KCk7fQpfb25LZXlib2FyZFpvb20oem9vbUZhY3Rvcil7dGhpcy5fb25TY2FsZSh6b29tRmFjdG9yLHRoaXMuZWxlbWVudC5jbGllbnRXaWR0aC8yLHRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQvMik7fQpfb25LZXlib2FyZFBhbk9yUm90YXRlKHhNdWx0aXBsaWVyLHlNdWx0aXBsaWVyKXtjb25zdCBwYW5TdGVwSW5QaXhlbHM9Njtjb25zdCByb3RhdGVTdGVwSW5EZWdyZWVzPTU7aWYodGhpcy5fbW9kZT09PUxheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXMuUm90YXRlKXt0aGlzLl9vblJvdGF0ZSh0aGlzLl9yb3RhdGVYK3lNdWx0aXBsaWVyKnJvdGF0ZVN0ZXBJbkRlZ3JlZXMsdGhpcy5fcm90YXRlWSt4TXVsdGlwbGllcipyb3RhdGVTdGVwSW5EZWdyZWVzKTt9ZWxzZXt0aGlzLl9vblBhbih4TXVsdGlwbGllcipwYW5TdGVwSW5QaXhlbHMseU11bHRpcGxpZXIqcGFuU3RlcEluUGl4ZWxzKTt9fQpfb25Nb3VzZVdoZWVsKGV2ZW50KXtjb25zdCB6b29tRmFjdG9yPTEuMTtjb25zdCBtb3VzZVdoZWVsWm9vbVNwZWVkPTEvMTIwO2NvbnN0IHNjYWxlRmFjdG9yPU1hdGgucG93KHpvb21GYWN0b3IsZXZlbnQud2hlZWxEZWx0YVkqbW91c2VXaGVlbFpvb21TcGVlZCk7dGhpcy5fb25TY2FsZShzY2FsZUZhY3RvcixldmVudC5jbGllbnRYLXRoaXMuZWxlbWVudC50b3RhbE9mZnNldExlZnQoKSxldmVudC5jbGllbnRZLXRoaXMuZWxlbWVudC50b3RhbE9mZnNldFRvcCgpKTt9Cl9vbkRyYWcoZXZlbnQpe2lmKHRoaXMuX21vZGU9PT1MYXllclZpZXdlci5UcmFuc2Zvcm1Db250cm9sbGVyLk1vZGVzLlJvdGF0ZSl7dGhpcy5fb25Sb3RhdGUodGhpcy5fb2xkUm90YXRlWCsodGhpcy5fb3JpZ2luWS1ldmVudC5jbGllbnRZKS90aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0KjE4MCx0aGlzLl9vbGRSb3RhdGVZLSh0aGlzLl9vcmlnaW5YLWV2ZW50LmNsaWVudFgpL3RoaXMuZWxlbWVudC5jbGllbnRXaWR0aCoxODApO31lbHNle3RoaXMuX29uUGFuKGV2ZW50LmNsaWVudFgtdGhpcy5fb3JpZ2luWCxldmVudC5jbGllbnRZLXRoaXMuX29yaWdpblkpO3RoaXMuX29yaWdpblg9ZXZlbnQuY2xpZW50WDt0aGlzLl9vcmlnaW5ZPWV2ZW50LmNsaWVudFk7fX0KX29uRHJhZ1N0YXJ0KGV2ZW50KXt0aGlzLmVsZW1lbnQuZm9jdXMoKTt0aGlzLl9vcmlnaW5YPWV2ZW50LmNsaWVudFg7dGhpcy5fb3JpZ2luWT1ldmVudC5jbGllbnRZO3RoaXMuX29sZFJvdGF0ZVg9dGhpcy5fcm90YXRlWDt0aGlzLl9vbGRSb3RhdGVZPXRoaXMuX3JvdGF0ZVk7cmV0dXJuIHRydWU7fQpfb25EcmFnRW5kKCl7ZGVsZXRlIHRoaXMuX29yaWdpblg7ZGVsZXRlIHRoaXMuX29yaWdpblk7ZGVsZXRlIHRoaXMuX29sZFJvdGF0ZVg7ZGVsZXRlIHRoaXMuX29sZFJvdGF0ZVk7fX07TGF5ZXJWaWV3ZXIuVHJhbnNmb3JtQ29udHJvbGxlci5FdmVudHM9e1RyYW5zZm9ybUNoYW5nZWQ6U3ltYm9sKCdUcmFuc2Zvcm1DaGFuZ2VkJyl9O0xheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuTW9kZXM9e1BhbjonUGFuJyxSb3RhdGU6J1JvdGF0ZScsfTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImxheWVyX3ZpZXdlci9sYXllcnMzRFZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmxheWVycy0zZC12aWV3IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi50b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG59XG5cbmNhbnZhcyB7XG4gICAgZmxleDogMSAxO1xufVxuXG4vKiMgc291cmNlVVJMPWxheWVyX3ZpZXdlci9sYXllcnMzRFZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibGF5ZXJfdmlld2VyL3BhaW50UHJvZmlsZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnBhaW50LXByb2ZpbGVyLW92ZXJ2aWV3IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xufVxuXG4ucGFpbnQtcHJvZmlsZXItY2FudmFzLWNvbnRhaW5lciB7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5wYWludC1wcm9maWxlci1waWUtY2hhcnQge1xuICAgIHdpZHRoOiA2MHB4ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiA2MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZm9udC1zaXplOiAxMHB4O1xufVxuXG4ucGFpbnQtcHJvZmlsZXItY2FudmFzLWNvbnRhaW5lciBjYW52YXMge1xuICAgIHotaW5kZXg6IDIwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBvcGFjaXR5OiAwLjk1O1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnBhaW50LXByb2ZpbGVyLWNhbnZhcy1jb250YWluZXIgLm92ZXJ2aWV3LWdyaWQtZGl2aWRlcnMtYmFja2dyb3VuZCxcbi5wYWludC1wcm9maWxlci1jYW52YXMtY29udGFpbmVyIC5vdmVydmlldy1ncmlkLXdpbmRvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogYXV0bztcbn1cblxuLnBhaW50LXByb2ZpbGVyLWNhbnZhcy1jb250YWluZXIgLm92ZXJ2aWV3LWdyaWQtd2luZG93LXJlc2l6ZXIge1xuICAgIHotaW5kZXg6IDIwMDA7XG59XG5cbi8qIyBzb3VyY2VVUkw9bGF5ZXJfdmlld2VyL3BhaW50UHJvZmlsZXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibGF5ZXJfdmlld2VyL2xheWVyRGV0YWlsc1ZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxudGFibGUgdGQge1xuICAgIHBhZGRpbmctbGVmdDogOHB4O1xufVxuXG50YWJsZSB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5zY3JvbGwtcmVjdC5hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAwLCAxMDAsIDEwMCwgMC4yKTtcbn1cblxudWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgLXdlYmtpdC1wYWRkaW5nLXN0YXJ0OiAwO1xuICAgIC13ZWJraXQtbWFyZ2luLWJlZm9yZTogMDtcbiAgICAtd2Via2l0LW1hcmdpbi1hZnRlcjogMDtcbn1cblxuYSB7XG4gICAgcGFkZGluZzogOHB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vKiMgc291cmNlVVJMPWxheWVyX3ZpZXdlci9sYXllckRldGFpbHNWaWV3LmNzcyAqLyI7TGF5ZXJzLkxheWVyUGFpbnRQcm9maWxlclZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5TcGxpdFdpZGdldHtjb25zdHJ1Y3RvcihzaG93SW1hZ2VDYWxsYmFjayl7c3VwZXIodHJ1ZSxmYWxzZSk7dGhpcy5fbG9nVHJlZVZpZXc9bmV3IExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJDb21tYW5kTG9nVmlldygpO3RoaXMuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9sb2dUcmVlVmlldyk7dGhpcy5fcGFpbnRQcm9maWxlclZpZXc9bmV3IExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3KHNob3dJbWFnZUNhbGxiYWNrKTt0aGlzLnNldE1haW5XaWRnZXQodGhpcy5fcGFpbnRQcm9maWxlclZpZXcpO3RoaXMuX3BhaW50UHJvZmlsZXJWaWV3LmFkZEV2ZW50TGlzdGVuZXIoTGF5ZXJWaWV3ZXIuUGFpbnRQcm9maWxlclZpZXcuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25XaW5kb3dDaGFuZ2VkLHRoaXMpO30KcmVzZXQoKXt0aGlzLl9wYWludFByb2ZpbGVyVmlldy5zZXRTbmFwc2hvdEFuZExvZyhudWxsLFtdLG51bGwpO30KcHJvZmlsZShzbmFwc2hvdCl7c25hcHNob3QuY29tbWFuZExvZygpLnRoZW4obG9nPT5zZXRTbmFwc2hvdEFuZExvZy5jYWxsKHRoaXMsc25hcHNob3QsbG9nKSk7ZnVuY3Rpb24gc2V0U25hcHNob3RBbmRMb2coc25hcHNob3QsbG9nKXt0aGlzLl9sb2dUcmVlVmlldy5zZXRDb21tYW5kTG9nKGxvZ3x8W10pO3RoaXMuX3BhaW50UHJvZmlsZXJWaWV3LnNldFNuYXBzaG90QW5kTG9nKHNuYXBzaG90LGxvZ3x8W10sbnVsbCk7aWYoc25hcHNob3QpCnNuYXBzaG90LnJlbGVhc2UoKTt9fQpzZXRTY2FsZShzY2FsZSl7dGhpcy5fcGFpbnRQcm9maWxlclZpZXcuc2V0U2NhbGUoc2NhbGUpO30KX29uV2luZG93Q2hhbmdlZCgpe3RoaXMuX2xvZ1RyZWVWaWV3LnVwZGF0ZVdpbmRvdyh0aGlzLl9wYWludFByb2ZpbGVyVmlldy5zZWxlY3Rpb25XaW5kb3coKSk7fX07O0xheWVycy5MYXllclRyZWVNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fbGF5ZXJUcmVlQWdlbnQ9dGFyZ2V0LmxheWVyVHJlZUFnZW50KCk7dGFyZ2V0LnJlZ2lzdGVyTGF5ZXJUcmVlRGlzcGF0Y2hlcihuZXcgTGF5ZXJzLkxheWVyVHJlZURpc3BhdGNoZXIodGhpcykpO3RoaXMuX3BhaW50UHJvZmlsZXJNb2RlbD0odGFyZ2V0Lm1vZGVsKFNESy5QYWludFByb2ZpbGVyTW9kZWwpKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZihyZXNvdXJjZVRyZWVNb2RlbCl7cmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLk1haW5GcmFtZU5hdmlnYXRlZCx0aGlzLl9vbk1haW5GcmFtZU5hdmlnYXRlZCx0aGlzKTt9CnRoaXMuX2xheWVyVHJlZT1udWxsO3RoaXMuX3Rocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcigyMCk7fQpkaXNhYmxlKCl7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9lbmFibGVkPWZhbHNlO3RoaXMuX2xheWVyVHJlZUFnZW50LmRpc2FibGUoKTt9CmVuYWJsZSgpe2lmKHRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9lbmFibGVkPXRydWU7dGhpcy5fZm9yY2VFbmFibGUoKTt9Cl9mb3JjZUVuYWJsZSgpe3RoaXMuX2xhc3RQYWludFJlY3RCeUxheWVySWQ9e307aWYoIXRoaXMuX2xheWVyVHJlZSkKdGhpcy5fbGF5ZXJUcmVlPW5ldyBMYXllcnMuQWdlbnRMYXllclRyZWUodGhpcyk7dGhpcy5fbGF5ZXJUcmVlQWdlbnQuZW5hYmxlKCk7fQpsYXllclRyZWUoKXtyZXR1cm4gdGhpcy5fbGF5ZXJUcmVlO30KYXN5bmMgX2xheWVyVHJlZUNoYW5nZWQobGF5ZXJzKXtpZighdGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMuX3Rocm90dGxlci5zY2hlZHVsZSh0aGlzLl9pbm5lclNldExheWVycy5iaW5kKHRoaXMsbGF5ZXJzKSk7fQphc3luYyBfaW5uZXJTZXRMYXllcnMobGF5ZXJzKXtjb25zdCBsYXllclRyZWU9KHRoaXMuX2xheWVyVHJlZSk7YXdhaXQgbGF5ZXJUcmVlLnNldExheWVycyhsYXllcnMpO2Zvcihjb25zdCBsYXllcklkIGluIHRoaXMuX2xhc3RQYWludFJlY3RCeUxheWVySWQpe2NvbnN0IGxhc3RQYWludFJlY3Q9dGhpcy5fbGFzdFBhaW50UmVjdEJ5TGF5ZXJJZFtsYXllcklkXTtjb25zdCBsYXllcj1sYXllclRyZWUubGF5ZXJCeUlkKGxheWVySWQpO2lmKGxheWVyKQpsYXllci5fbGFzdFBhaW50UmVjdD1sYXN0UGFpbnRSZWN0O30KdGhpcy5fbGFzdFBhaW50UmVjdEJ5TGF5ZXJJZD17fTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhMYXllcnMuTGF5ZXJUcmVlTW9kZWwuRXZlbnRzLkxheWVyVHJlZUNoYW5nZWQpO30KX2xheWVyUGFpbnRlZChsYXllcklkLGNsaXBSZWN0KXtpZighdGhpcy5fZW5hYmxlZCkKcmV0dXJuO2NvbnN0IGxheWVyVHJlZT0odGhpcy5fbGF5ZXJUcmVlKTtjb25zdCBsYXllcj1sYXllclRyZWUubGF5ZXJCeUlkKGxheWVySWQpO2lmKCFsYXllcil7dGhpcy5fbGFzdFBhaW50UmVjdEJ5TGF5ZXJJZFtsYXllcklkXT1jbGlwUmVjdDtyZXR1cm47fQpsYXllci5fZGlkUGFpbnQoY2xpcFJlY3QpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKExheWVycy5MYXllclRyZWVNb2RlbC5FdmVudHMuTGF5ZXJQYWludGVkLGxheWVyKTt9Cl9vbk1haW5GcmFtZU5hdmlnYXRlZCgpe3RoaXMuX2xheWVyVHJlZT1udWxsO2lmKHRoaXMuX2VuYWJsZWQpCnRoaXMuX2ZvcmNlRW5hYmxlKCk7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKExheWVycy5MYXllclRyZWVNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuRE9NLGZhbHNlKTtMYXllcnMuTGF5ZXJUcmVlTW9kZWwuRXZlbnRzPXtMYXllclRyZWVDaGFuZ2VkOlN5bWJvbCgnTGF5ZXJUcmVlQ2hhbmdlZCcpLExheWVyUGFpbnRlZDpTeW1ib2woJ0xheWVyUGFpbnRlZCcpLH07TGF5ZXJzLkFnZW50TGF5ZXJUcmVlPWNsYXNzIGV4dGVuZHMgU0RLLkxheWVyVHJlZUJhc2V7Y29uc3RydWN0b3IobGF5ZXJUcmVlTW9kZWwpe3N1cGVyKGxheWVyVHJlZU1vZGVsLnRhcmdldCgpKTt0aGlzLl9sYXllclRyZWVNb2RlbD1sYXllclRyZWVNb2RlbDt9CmFzeW5jIHNldExheWVycyhwYXlsb2FkKXtpZighcGF5bG9hZCl7dGhpcy5faW5uZXJTZXRMYXllcnMocGF5bG9hZCk7cmV0dXJuO30KY29uc3QgaWRzVG9SZXNvbHZlPW5ldyBTZXQoKTtmb3IobGV0IGk9MDtpPHBheWxvYWQubGVuZ3RoOysraSl7Y29uc3QgYmFja2VuZE5vZGVJZD1wYXlsb2FkW2ldLmJhY2tlbmROb2RlSWQ7aWYoIWJhY2tlbmROb2RlSWR8fHRoaXMuYmFja2VuZE5vZGVJZFRvTm9kZSgpLmhhcyhiYWNrZW5kTm9kZUlkKSkKY29udGludWU7aWRzVG9SZXNvbHZlLmFkZChiYWNrZW5kTm9kZUlkKTt9CmF3YWl0IHRoaXMucmVzb2x2ZUJhY2tlbmROb2RlSWRzKGlkc1RvUmVzb2x2ZSk7dGhpcy5faW5uZXJTZXRMYXllcnMocGF5bG9hZCk7fQpfaW5uZXJTZXRMYXllcnMobGF5ZXJzKXt0aGlzLnNldFJvb3QobnVsbCk7dGhpcy5zZXRDb250ZW50Um9vdChudWxsKTtpZighbGF5ZXJzKQpyZXR1cm47bGV0IHJvb3Q7Y29uc3Qgb2xkTGF5ZXJzQnlJZD10aGlzLl9sYXllcnNCeUlkO3RoaXMuX2xheWVyc0J5SWQ9e307Zm9yKGxldCBpPTA7aTxsYXllcnMubGVuZ3RoOysraSl7Y29uc3QgbGF5ZXJJZD1sYXllcnNbaV0ubGF5ZXJJZDtsZXQgbGF5ZXI9b2xkTGF5ZXJzQnlJZFtsYXllcklkXTtpZihsYXllcikKbGF5ZXIuX3Jlc2V0KGxheWVyc1tpXSk7ZWxzZQpsYXllcj1uZXcgTGF5ZXJzLkFnZW50TGF5ZXIodGhpcy5fbGF5ZXJUcmVlTW9kZWwsbGF5ZXJzW2ldKTt0aGlzLl9sYXllcnNCeUlkW2xheWVySWRdPWxheWVyO2NvbnN0IGJhY2tlbmROb2RlSWQ9bGF5ZXJzW2ldLmJhY2tlbmROb2RlSWQ7aWYoYmFja2VuZE5vZGVJZCkKbGF5ZXIuX3NldE5vZGUodGhpcy5iYWNrZW5kTm9kZUlkVG9Ob2RlKCkuZ2V0KGJhY2tlbmROb2RlSWQpKTtpZighdGhpcy5jb250ZW50Um9vdCgpJiZsYXllci5kcmF3c0NvbnRlbnQoKSkKdGhpcy5zZXRDb250ZW50Um9vdChsYXllcik7Y29uc3QgcGFyZW50SWQ9bGF5ZXIucGFyZW50SWQoKTtpZihwYXJlbnRJZCl7Y29uc3QgcGFyZW50PXRoaXMuX2xheWVyc0J5SWRbcGFyZW50SWRdO2lmKCFwYXJlbnQpCmNvbnNvbGUuYXNzZXJ0KHBhcmVudCwnbWlzc2luZyBwYXJlbnQgJytwYXJlbnRJZCsnIGZvciBsYXllciAnK2xheWVySWQpO3BhcmVudC5hZGRDaGlsZChsYXllcik7fWVsc2V7aWYocm9vdCkKY29uc29sZS5hc3NlcnQoZmFsc2UsJ011bHRpcGxlIHJvb3QgbGF5ZXJzJyk7cm9vdD1sYXllcjt9fQppZihyb290KXt0aGlzLnNldFJvb3Qocm9vdCk7cm9vdC5fY2FsY3VsYXRlUXVhZChuZXcgV2ViS2l0Q1NTTWF0cml4KCkpO319fTtMYXllcnMuQWdlbnRMYXllcj1jbGFzc3tjb25zdHJ1Y3RvcihsYXllclRyZWVNb2RlbCxsYXllclBheWxvYWQpe3RoaXMuX2xheWVyVHJlZU1vZGVsPWxheWVyVHJlZU1vZGVsO3RoaXMuX3Jlc2V0KGxheWVyUGF5bG9hZCk7fQppZCgpe3JldHVybiB0aGlzLl9sYXllclBheWxvYWQubGF5ZXJJZDt9CnBhcmVudElkKCl7cmV0dXJuIHRoaXMuX2xheWVyUGF5bG9hZC5wYXJlbnRMYXllcklkO30KcGFyZW50KCl7cmV0dXJuIHRoaXMuX3BhcmVudDt9CmlzUm9vdCgpe3JldHVybiF0aGlzLnBhcmVudElkKCk7fQpjaGlsZHJlbigpe3JldHVybiB0aGlzLl9jaGlsZHJlbjt9CmFkZENoaWxkKGNoaWxkKXtpZihjaGlsZC5fcGFyZW50KQpjb25zb2xlLmFzc2VydChmYWxzZSwnQ2hpbGQgYWxyZWFkeSBoYXMgYSBwYXJlbnQnKTt0aGlzLl9jaGlsZHJlbi5wdXNoKGNoaWxkKTtjaGlsZC5fcGFyZW50PXRoaXM7fQpfc2V0Tm9kZShub2RlKXt0aGlzLl9ub2RlPW5vZGU7fQpub2RlKCl7cmV0dXJuIHRoaXMuX25vZGU7fQpub2RlRm9yU2VsZk9yQW5jZXN0b3IoKXtmb3IobGV0IGxheWVyPXRoaXM7bGF5ZXI7bGF5ZXI9bGF5ZXIuX3BhcmVudCl7aWYobGF5ZXIuX25vZGUpCnJldHVybiBsYXllci5fbm9kZTt9CnJldHVybiBudWxsO30Kb2Zmc2V0WCgpe3JldHVybiB0aGlzLl9sYXllclBheWxvYWQub2Zmc2V0WDt9Cm9mZnNldFkoKXtyZXR1cm4gdGhpcy5fbGF5ZXJQYXlsb2FkLm9mZnNldFk7fQp3aWR0aCgpe3JldHVybiB0aGlzLl9sYXllclBheWxvYWQud2lkdGg7fQpoZWlnaHQoKXtyZXR1cm4gdGhpcy5fbGF5ZXJQYXlsb2FkLmhlaWdodDt9CnRyYW5zZm9ybSgpe3JldHVybiB0aGlzLl9sYXllclBheWxvYWQudHJhbnNmb3JtO30KcXVhZCgpe3JldHVybiB0aGlzLl9xdWFkO30KYW5jaG9yUG9pbnQoKXtyZXR1cm5bdGhpcy5fbGF5ZXJQYXlsb2FkLmFuY2hvclh8fDAsdGhpcy5fbGF5ZXJQYXlsb2FkLmFuY2hvcll8fDAsdGhpcy5fbGF5ZXJQYXlsb2FkLmFuY2hvclp8fDAsXTt9CmludmlzaWJsZSgpe3JldHVybiB0aGlzLl9sYXllclBheWxvYWQuaW52aXNpYmxlO30KcGFpbnRDb3VudCgpe3JldHVybiB0aGlzLl9wYWludENvdW50fHx0aGlzLl9sYXllclBheWxvYWQucGFpbnRDb3VudDt9Cmxhc3RQYWludFJlY3QoKXtyZXR1cm4gdGhpcy5fbGFzdFBhaW50UmVjdDt9CnNjcm9sbFJlY3RzKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFJlY3RzO30Kc3RpY2t5UG9zaXRpb25Db25zdHJhaW50KCl7cmV0dXJuIHRoaXMuX3N0aWNreVBvc2l0aW9uQ29uc3RyYWludDt9CmFzeW5jIHJlcXVlc3RDb21wb3NpdGluZ1JlYXNvbnMoKXtjb25zdCByZWFzb25zPWF3YWl0IHRoaXMuX2xheWVyVHJlZU1vZGVsLl9sYXllclRyZWVBZ2VudC5jb21wb3NpdGluZ1JlYXNvbnModGhpcy5pZCgpKTtyZXR1cm4gcmVhc29uc3x8W107fQpkcmF3c0NvbnRlbnQoKXtyZXR1cm4gdGhpcy5fbGF5ZXJQYXlsb2FkLmRyYXdzQ29udGVudDt9CmdwdU1lbW9yeVVzYWdlKCl7Y29uc3QgYnl0ZXNQZXJQaXhlbD00O3JldHVybiB0aGlzLmRyYXdzQ29udGVudCgpP3RoaXMud2lkdGgoKSp0aGlzLmhlaWdodCgpKmJ5dGVzUGVyUGl4ZWw6MDt9CnNuYXBzaG90cygpe2NvbnN0IHByb21pc2U9dGhpcy5fbGF5ZXJUcmVlTW9kZWwuX3BhaW50UHJvZmlsZXJNb2RlbC5tYWtlU25hcHNob3QodGhpcy5pZCgpKS50aGVuKHNuYXBzaG90PT57aWYoIXNuYXBzaG90KQpyZXR1cm4gbnVsbDtyZXR1cm57cmVjdDp7eDowLHk6MCx3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9LHNuYXBzaG90OnNuYXBzaG90fTt9KTtyZXR1cm5bcHJvbWlzZV07fQpfZGlkUGFpbnQocmVjdCl7dGhpcy5fbGFzdFBhaW50UmVjdD1yZWN0O3RoaXMuX3BhaW50Q291bnQ9dGhpcy5wYWludENvdW50KCkrMTt0aGlzLl9pbWFnZT1udWxsO30KX3Jlc2V0KGxheWVyUGF5bG9hZCl7dGhpcy5fbm9kZT1udWxsO3RoaXMuX2NoaWxkcmVuPVtdO3RoaXMuX3BhcmVudD1udWxsO3RoaXMuX3BhaW50Q291bnQ9MDt0aGlzLl9sYXllclBheWxvYWQ9bGF5ZXJQYXlsb2FkO3RoaXMuX2ltYWdlPW51bGw7dGhpcy5fc2Nyb2xsUmVjdHM9dGhpcy5fbGF5ZXJQYXlsb2FkLnNjcm9sbFJlY3RzfHxbXTt0aGlzLl9zdGlja3lQb3NpdGlvbkNvbnN0cmFpbnQ9dGhpcy5fbGF5ZXJQYXlsb2FkLnN0aWNreVBvc2l0aW9uQ29uc3RyYWludD9uZXcgU0RLLkxheWVyLlN0aWNreVBvc2l0aW9uQ29uc3RyYWludCh0aGlzLl9sYXllclRyZWVNb2RlbC5sYXllclRyZWUoKSx0aGlzLl9sYXllclBheWxvYWQuc3RpY2t5UG9zaXRpb25Db25zdHJhaW50KTpudWxsO30KX21hdHJpeEZyb21BcnJheShhKXtmdW5jdGlvbiB0b0ZpeGVkOSh4KXtyZXR1cm4geC50b0ZpeGVkKDkpO30KcmV0dXJuIG5ldyBXZWJLaXRDU1NNYXRyaXgoJ21hdHJpeDNkKCcrYS5tYXAodG9GaXhlZDkpLmpvaW4oJywnKSsnKScpO30KX2NhbGN1bGF0ZVRyYW5zZm9ybVRvVmlld3BvcnQocGFyZW50VHJhbnNmb3JtKXtjb25zdCBvZmZzZXRNYXRyaXg9bmV3IFdlYktpdENTU01hdHJpeCgpLnRyYW5zbGF0ZSh0aGlzLl9sYXllclBheWxvYWQub2Zmc2V0WCx0aGlzLl9sYXllclBheWxvYWQub2Zmc2V0WSk7bGV0IG1hdHJpeD1vZmZzZXRNYXRyaXg7aWYodGhpcy5fbGF5ZXJQYXlsb2FkLnRyYW5zZm9ybSl7Y29uc3QgdHJhbnNmb3JtTWF0cml4PXRoaXMuX21hdHJpeEZyb21BcnJheSh0aGlzLl9sYXllclBheWxvYWQudHJhbnNmb3JtKTtjb25zdCBhbmNob3JWZWN0b3I9bmV3IFVJLkdlb21ldHJ5LlZlY3Rvcih0aGlzLl9sYXllclBheWxvYWQud2lkdGgqdGhpcy5hbmNob3JQb2ludCgpWzBdLHRoaXMuX2xheWVyUGF5bG9hZC5oZWlnaHQqdGhpcy5hbmNob3JQb2ludCgpWzFdLHRoaXMuYW5jaG9yUG9pbnQoKVsyXSk7Y29uc3QgYW5jaG9yUG9pbnQ9VUkuR2VvbWV0cnkubXVsdGlwbHlWZWN0b3JCeU1hdHJpeEFuZE5vcm1hbGl6ZShhbmNob3JWZWN0b3IsbWF0cml4KTtjb25zdCBhbmNob3JNYXRyaXg9bmV3IFdlYktpdENTU01hdHJpeCgpLnRyYW5zbGF0ZSgtYW5jaG9yUG9pbnQueCwtYW5jaG9yUG9pbnQueSwtYW5jaG9yUG9pbnQueik7bWF0cml4PWFuY2hvck1hdHJpeC5pbnZlcnNlKCkubXVsdGlwbHkodHJhbnNmb3JtTWF0cml4Lm11bHRpcGx5KGFuY2hvck1hdHJpeC5tdWx0aXBseShtYXRyaXgpKSk7fQptYXRyaXg9cGFyZW50VHJhbnNmb3JtLm11bHRpcGx5KG1hdHJpeCk7cmV0dXJuIG1hdHJpeDt9Cl9jcmVhdGVWZXJ0ZXhBcnJheUZvclJlY3Qod2lkdGgsaGVpZ2h0KXtyZXR1cm5bMCwwLDAsd2lkdGgsMCwwLHdpZHRoLGhlaWdodCwwLDAsaGVpZ2h0LDBdO30KX2NhbGN1bGF0ZVF1YWQocGFyZW50VHJhbnNmb3JtKXtjb25zdCBtYXRyaXg9dGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtVG9WaWV3cG9ydChwYXJlbnRUcmFuc2Zvcm0pO3RoaXMuX3F1YWQ9W107Y29uc3QgdmVydGljZXM9dGhpcy5fY3JlYXRlVmVydGV4QXJyYXlGb3JSZWN0KHRoaXMuX2xheWVyUGF5bG9hZC53aWR0aCx0aGlzLl9sYXllclBheWxvYWQuaGVpZ2h0KTtmb3IobGV0IGk9MDtpPDQ7KytpKXtjb25zdCBwb2ludD1VSS5HZW9tZXRyeS5tdWx0aXBseVZlY3RvckJ5TWF0cml4QW5kTm9ybWFsaXplKG5ldyBVSS5HZW9tZXRyeS5WZWN0b3IodmVydGljZXNbaSozXSx2ZXJ0aWNlc1tpKjMrMV0sdmVydGljZXNbaSozKzJdKSxtYXRyaXgpO3RoaXMuX3F1YWQucHVzaChwb2ludC54LHBvaW50LnkpO30KZnVuY3Rpb24gY2FsY3VsYXRlUXVhZEZvckxheWVyKGxheWVyKXtsYXllci5fY2FsY3VsYXRlUXVhZChtYXRyaXgpO30KdGhpcy5fY2hpbGRyZW4uZm9yRWFjaChjYWxjdWxhdGVRdWFkRm9yTGF5ZXIpO319O0xheWVycy5MYXllclRyZWVEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKGxheWVyVHJlZU1vZGVsKXt0aGlzLl9sYXllclRyZWVNb2RlbD1sYXllclRyZWVNb2RlbDt9CmxheWVyVHJlZURpZENoYW5nZShsYXllcnMpe3RoaXMuX2xheWVyVHJlZU1vZGVsLl9sYXllclRyZWVDaGFuZ2VkKGxheWVyc3x8bnVsbCk7fQpsYXllclBhaW50ZWQobGF5ZXJJZCxjbGlwUmVjdCl7dGhpcy5fbGF5ZXJUcmVlTW9kZWwuX2xheWVyUGFpbnRlZChsYXllcklkLGNsaXBSZWN0KTt9fTs7TGF5ZXJzLkxheWVyc1BhbmVsPWNsYXNzIGV4dGVuZHMgVUkuUGFuZWxXaXRoU2lkZWJhcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCdsYXllcnMnLDIyNSk7dGhpcy5fbW9kZWw9bnVsbDtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlVGFyZ2V0cyh0aGlzKTt0aGlzLl9sYXllclZpZXdIb3N0PW5ldyBMYXllclZpZXdlci5MYXllclZpZXdIb3N0KCk7dGhpcy5fbGF5ZXJUcmVlT3V0bGluZT1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJUcmVlT3V0bGluZSh0aGlzLl9sYXllclZpZXdIb3N0KTt0aGlzLnBhbmVsU2lkZWJhckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9sYXllclRyZWVPdXRsaW5lLmVsZW1lbnQpO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX2xheWVyVHJlZU91dGxpbmUuZWxlbWVudCk7dGhpcy5fcmlnaHRTcGxpdFdpZGdldD1uZXcgVUkuU3BsaXRXaWRnZXQoZmFsc2UsdHJ1ZSwnbGF5ZXJEZXRhaWxzU3BsaXRWaWV3U3RhdGUnKTt0aGlzLnNwbGl0V2lkZ2V0KCkuc2V0TWFpbldpZGdldCh0aGlzLl9yaWdodFNwbGl0V2lkZ2V0KTt0aGlzLl9sYXllcnMzRFZpZXc9bmV3IExheWVyVmlld2VyLkxheWVyczNEVmlldyh0aGlzLl9sYXllclZpZXdIb3N0KTt0aGlzLl9yaWdodFNwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fbGF5ZXJzM0RWaWV3KTt0aGlzLl9sYXllcnMzRFZpZXcuYWRkRXZlbnRMaXN0ZW5lcihMYXllclZpZXdlci5MYXllcnMzRFZpZXcuRXZlbnRzLlBhaW50UHJvZmlsZXJSZXF1ZXN0ZWQsdGhpcy5fb25QYWludFByb2ZpbGVSZXF1ZXN0ZWQsdGhpcyk7dGhpcy5fbGF5ZXJzM0RWaWV3LmFkZEV2ZW50TGlzdGVuZXIoTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3LkV2ZW50cy5TY2FsZUNoYW5nZWQsdGhpcy5fb25TY2FsZUNoYW5nZWQsdGhpcyk7dGhpcy5fdGFiYmVkUGFuZT1uZXcgVUkuVGFiYmVkUGFuZSgpO3RoaXMuX3JpZ2h0U3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl90YWJiZWRQYW5lKTt0aGlzLl9sYXllckRldGFpbHNWaWV3PW5ldyBMYXllclZpZXdlci5MYXllckRldGFpbHNWaWV3KHRoaXMuX2xheWVyVmlld0hvc3QpO3RoaXMuX2xheWVyRGV0YWlsc1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihMYXllclZpZXdlci5MYXllckRldGFpbHNWaWV3LkV2ZW50cy5QYWludFByb2ZpbGVyUmVxdWVzdGVkLHRoaXMuX29uUGFpbnRQcm9maWxlUmVxdWVzdGVkLHRoaXMpO3RoaXMuX3RhYmJlZFBhbmUuYXBwZW5kVGFiKExheWVycy5MYXllcnNQYW5lbC5EZXRhaWxzVmlld1RhYnMuRGV0YWlscyxDb21tb24uVUlTdHJpbmcoJ0RldGFpbHMnKSx0aGlzLl9sYXllckRldGFpbHNWaWV3KTt0aGlzLl9wYWludFByb2ZpbGVyVmlldz1uZXcgTGF5ZXJzLkxheWVyUGFpbnRQcm9maWxlclZpZXcodGhpcy5fc2hvd0ltYWdlLmJpbmQodGhpcykpO3RoaXMuX3RhYmJlZFBhbmUuYWRkRXZlbnRMaXN0ZW5lcihVSS5UYWJiZWRQYW5lLkV2ZW50cy5UYWJDbG9zZWQsdGhpcy5fb25UYWJDbG9zZWQsdGhpcyk7dGhpcy5fdXBkYXRlVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDEwMCk7fQpmb2N1cygpe3RoaXMuX2xheWVyVHJlZU91dGxpbmUuZm9jdXMoKTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTtpZih0aGlzLl9tb2RlbCkKdGhpcy5fbW9kZWwuZW5hYmxlKCk7fQp3aWxsSGlkZSgpe2lmKHRoaXMuX21vZGVsKQp0aGlzLl9tb2RlbC5kaXNhYmxlKCk7c3VwZXIud2lsbEhpZGUoKTt9CnRhcmdldEFkZGVkKHRhcmdldCl7aWYodGhpcy5fbW9kZWwpCnJldHVybjt0aGlzLl9tb2RlbD10YXJnZXQubW9kZWwoTGF5ZXJzLkxheWVyVHJlZU1vZGVsKTtpZighdGhpcy5fbW9kZWwpCnJldHVybjt0aGlzLl9tb2RlbC5hZGRFdmVudExpc3RlbmVyKExheWVycy5MYXllclRyZWVNb2RlbC5FdmVudHMuTGF5ZXJUcmVlQ2hhbmdlZCx0aGlzLl9vbkxheWVyVHJlZVVwZGF0ZWQsdGhpcyk7dGhpcy5fbW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihMYXllcnMuTGF5ZXJUcmVlTW9kZWwuRXZlbnRzLkxheWVyUGFpbnRlZCx0aGlzLl9vbkxheWVyUGFpbnRlZCx0aGlzKTtpZih0aGlzLmlzU2hvd2luZygpKQp0aGlzLl9tb2RlbC5lbmFibGUoKTt9CnRhcmdldFJlbW92ZWQodGFyZ2V0KXtpZighdGhpcy5fbW9kZWx8fHRoaXMuX21vZGVsLnRhcmdldCgpIT09dGFyZ2V0KQpyZXR1cm47dGhpcy5fbW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihMYXllcnMuTGF5ZXJUcmVlTW9kZWwuRXZlbnRzLkxheWVyVHJlZUNoYW5nZWQsdGhpcy5fb25MYXllclRyZWVVcGRhdGVkLHRoaXMpO3RoaXMuX21vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoTGF5ZXJzLkxheWVyVHJlZU1vZGVsLkV2ZW50cy5MYXllclBhaW50ZWQsdGhpcy5fb25MYXllclBhaW50ZWQsdGhpcyk7dGhpcy5fbW9kZWwuZGlzYWJsZSgpO3RoaXMuX21vZGVsPW51bGw7fQpfb25MYXllclRyZWVVcGRhdGVkKCl7dGhpcy5fdXBkYXRlVGhyb3R0bGVyLnNjaGVkdWxlKHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTt9Cl91cGRhdGUoKXtpZih0aGlzLl9tb2RlbCkKdGhpcy5fbGF5ZXJWaWV3SG9zdC5zZXRMYXllclRyZWUodGhpcy5fbW9kZWwubGF5ZXJUcmVlKCkpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9Cl9vbkxheWVyUGFpbnRlZChldmVudCl7aWYoIXRoaXMuX21vZGVsKQpyZXR1cm47Y29uc3QgbGF5ZXI9KGV2ZW50LmRhdGEpO2lmKHRoaXMuX2xheWVyVmlld0hvc3Quc2VsZWN0aW9uKCkmJnRoaXMuX2xheWVyVmlld0hvc3Quc2VsZWN0aW9uKCkubGF5ZXIoKT09PWxheWVyKQp0aGlzLl9sYXllckRldGFpbHNWaWV3LnVwZGF0ZSgpO3RoaXMuX2xheWVyczNEVmlldy51cGRhdGVMYXllclNuYXBzaG90KGxheWVyKTt9Cl9vblBhaW50UHJvZmlsZVJlcXVlc3RlZChldmVudCl7Y29uc3Qgc2VsZWN0aW9uPShldmVudC5kYXRhKTt0aGlzLl9sYXllcnMzRFZpZXcuc25hcHNob3RGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKS50aGVuKHNuYXBzaG90V2l0aFJlY3Q9PntpZighc25hcHNob3RXaXRoUmVjdCkKcmV0dXJuO3RoaXMuX2xheWVyQmVpbmdQcm9maWxlZD1zZWxlY3Rpb24ubGF5ZXIoKTtpZighdGhpcy5fdGFiYmVkUGFuZS5oYXNUYWIoTGF5ZXJzLkxheWVyc1BhbmVsLkRldGFpbHNWaWV3VGFicy5Qcm9maWxlcikpe3RoaXMuX3RhYmJlZFBhbmUuYXBwZW5kVGFiKExheWVycy5MYXllcnNQYW5lbC5EZXRhaWxzVmlld1RhYnMuUHJvZmlsZXIsQ29tbW9uLlVJU3RyaW5nKCdQcm9maWxlcicpLHRoaXMuX3BhaW50UHJvZmlsZXJWaWV3LHVuZGVmaW5lZCx0cnVlLHRydWUpO30KdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIoTGF5ZXJzLkxheWVyc1BhbmVsLkRldGFpbHNWaWV3VGFicy5Qcm9maWxlcik7dGhpcy5fcGFpbnRQcm9maWxlclZpZXcucHJvZmlsZShzbmFwc2hvdFdpdGhSZWN0LnNuYXBzaG90KTt9KTt9Cl9vblRhYkNsb3NlZChldmVudCl7aWYoZXZlbnQuZGF0YS50YWJJZCE9PUxheWVycy5MYXllcnNQYW5lbC5EZXRhaWxzVmlld1RhYnMuUHJvZmlsZXJ8fCF0aGlzLl9sYXllckJlaW5nUHJvZmlsZWQpCnJldHVybjt0aGlzLl9wYWludFByb2ZpbGVyVmlldy5yZXNldCgpO3RoaXMuX2xheWVyczNEVmlldy5zaG93SW1hZ2VGb3JMYXllcih0aGlzLl9sYXllckJlaW5nUHJvZmlsZWQsdW5kZWZpbmVkKTt0aGlzLl9sYXllckJlaW5nUHJvZmlsZWQ9bnVsbDt9Cl9zaG93SW1hZ2UoaW1hZ2VVUkwpe3RoaXMuX2xheWVyczNEVmlldy5zaG93SW1hZ2VGb3JMYXllcih0aGlzLl9sYXllckJlaW5nUHJvZmlsZWQsaW1hZ2VVUkwpO30KX29uU2NhbGVDaGFuZ2VkKGV2ZW50KXt0aGlzLl9wYWludFByb2ZpbGVyVmlldy5zZXRTY2FsZSgoZXZlbnQuZGF0YSkpO319O0xheWVycy5MYXllcnNQYW5lbC5EZXRhaWxzVmlld1RhYnM9e0RldGFpbHM6J2RldGFpbHMnLFByb2ZpbGVyOidwcm9maWxlcid9OztOZXR3b3JrLkJsb2NrZWRVUkxzUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ25ldHdvcmsvYmxvY2tlZFVSTHNQYW5lLmNzcycpO05ldHdvcmsuQmxvY2tlZFVSTHNQYW5lLl9pbnN0YW5jZT10aGlzO3RoaXMuX21hbmFnZXI9U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXI7dGhpcy5fbWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5CbG9ja2VkUGF0dGVybnNDaGFuZ2VkLHRoaXMuX3VwZGF0ZSx0aGlzKTt0aGlzLl90b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2VuYWJsZWRDaGVja2JveD1uZXcgVUkuVG9vbGJhckNoZWNrYm94KENvbW1vbi5VSVN0cmluZygnRW5hYmxlIHJlcXVlc3QgYmxvY2tpbmcnKSx1bmRlZmluZWQsdGhpcy5fdG9nZ2xlRW5hYmxlZC5iaW5kKHRoaXMpKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2VuYWJsZWRDaGVja2JveCk7dGhpcy5fdG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTtjb25zdCBhZGRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgcGF0dGVybicpLCdsYXJnZWljb24tYWRkJyk7YWRkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fYWRkQnV0dG9uQ2xpY2tlZCx0aGlzKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGFkZEJ1dHRvbik7Y29uc3QgY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgYWxsIHBhdHRlcm5zJyksJ2xhcmdlaWNvbi1jbGVhcicpO2NsZWFyQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fcmVtb3ZlQWxsLHRoaXMpO3RoaXMuX3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oY2xlYXJCdXR0b24pO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Jsb2NrZWQtdXJscycpO3RoaXMuX2xpc3QucmVnaXN0ZXJSZXF1aXJlZENTUygnbmV0d29yay9ibG9ja2VkVVJMc1BhbmUuY3NzJyk7dGhpcy5fbGlzdC5zZXRFbXB0eVBsYWNlaG9sZGVyKHRoaXMuX2NyZWF0ZUVtcHR5UGxhY2Vob2xkZXIoKSk7dGhpcy5fbGlzdC5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2VkaXRvcj1udWxsO3RoaXMuX2Jsb2NrZWRDb3VudEZvclVybD1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuTmV0d29ya01hbmFnZXIsU0RLLk5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5SZXF1ZXN0RmluaXNoZWQsdGhpcy5fb25SZXF1ZXN0RmluaXNoZWQsdGhpcyk7dGhpcy5fdXBkYXRlVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDIwMCk7dGhpcy5fdXBkYXRlKCk7fQpfY3JlYXRlRW1wdHlQbGFjZWhvbGRlcigpe2NvbnN0IGVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnbm8tYmxvY2tlZC11cmxzJyk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUmVxdWVzdHMgYXJlIG5vdCBibG9ja2VkLiAnKTtjb25zdCBhZGRMaW5rPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdsaW5rJyk7YWRkTGluay50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0FkZCBwYXR0ZXJuLicpO2FkZExpbmsuaHJlZj0nJzthZGRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9hZGRCdXR0b25DbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO3JldHVybiBlbGVtZW50O30Kc3RhdGljIHJlc2V0KCl7aWYoTmV0d29yay5CbG9ja2VkVVJMc1BhbmUuX2luc3RhbmNlKQpOZXR3b3JrLkJsb2NrZWRVUkxzUGFuZS5faW5zdGFuY2UucmVzZXQoKTt9Cl9hZGRCdXR0b25DbGlja2VkKCl7dGhpcy5fbWFuYWdlci5zZXRCbG9ja2luZ0VuYWJsZWQodHJ1ZSk7dGhpcy5fbGlzdC5hZGROZXdJdGVtKDAse3VybDonJyxlbmFibGVkOnRydWV9KTt9CnJlbmRlckl0ZW0ocGF0dGVybixlZGl0YWJsZSl7Y29uc3QgY291bnQ9dGhpcy5fYmxvY2tlZFJlcXVlc3RzQ291bnQocGF0dGVybi51cmwpO2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnYmxvY2tlZC11cmwnKTtjb25zdCBjaGVja2JveD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdpbnB1dCcsJ2Jsb2NrZWQtdXJsLWNoZWNrYm94Jyk7Y2hlY2tib3gudHlwZT0nY2hlY2tib3gnO2NoZWNrYm94LmNoZWNrZWQ9cGF0dGVybi5lbmFibGVkO2NoZWNrYm94LmRpc2FibGVkPSF0aGlzLl9tYW5hZ2VyLmJsb2NraW5nRW5hYmxlZCgpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Jsb2NrZWQtdXJsLWxhYmVsJykudGV4dENvbnRlbnQ9cGF0dGVybi51cmw7ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmxvY2tlZC11cmwtY291bnQnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyVkIGJsb2NrZWQnLGNvdW50KTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxldmVudD0+dGhpcy5fdG9nZ2xlUGF0dGVybihwYXR0ZXJuLGV2ZW50KSxmYWxzZSk7Y2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGV2ZW50PT50aGlzLl90b2dnbGVQYXR0ZXJuKHBhdHRlcm4sZXZlbnQpLGZhbHNlKTtyZXR1cm4gZWxlbWVudDt9Cl90b2dnbGVQYXR0ZXJuKHBhdHRlcm4sZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7Y29uc3QgcGF0dGVybnM9dGhpcy5fbWFuYWdlci5ibG9ja2VkUGF0dGVybnMoKTtwYXR0ZXJucy5zcGxpY2UocGF0dGVybnMuaW5kZXhPZihwYXR0ZXJuKSwxLHtlbmFibGVkOiFwYXR0ZXJuLmVuYWJsZWQsdXJsOnBhdHRlcm4udXJsfSk7dGhpcy5fbWFuYWdlci5zZXRCbG9ja2VkUGF0dGVybnMocGF0dGVybnMpO30KX3RvZ2dsZUVuYWJsZWQoKXt0aGlzLl9tYW5hZ2VyLnNldEJsb2NraW5nRW5hYmxlZCghdGhpcy5fbWFuYWdlci5ibG9ja2luZ0VuYWJsZWQoKSk7dGhpcy5fdXBkYXRlKCk7fQpyZW1vdmVJdGVtUmVxdWVzdGVkKHBhdHRlcm4saW5kZXgpe2NvbnN0IHBhdHRlcm5zPXRoaXMuX21hbmFnZXIuYmxvY2tlZFBhdHRlcm5zKCk7cGF0dGVybnMuc3BsaWNlKGluZGV4LDEpO3RoaXMuX21hbmFnZXIuc2V0QmxvY2tlZFBhdHRlcm5zKHBhdHRlcm5zKTt9CmJlZ2luRWRpdChwYXR0ZXJuKXt0aGlzLl9lZGl0b3I9dGhpcy5fY3JlYXRlRWRpdG9yKCk7dGhpcy5fZWRpdG9yLmNvbnRyb2woJ3VybCcpLnZhbHVlPXBhdHRlcm4udXJsO3JldHVybiB0aGlzLl9lZGl0b3I7fQpjb21taXRFZGl0KGl0ZW0sZWRpdG9yLGlzTmV3KXtjb25zdCB1cmw9ZWRpdG9yLmNvbnRyb2woJ3VybCcpLnZhbHVlO2NvbnN0IHBhdHRlcm5zPXRoaXMuX21hbmFnZXIuYmxvY2tlZFBhdHRlcm5zKCk7aWYoaXNOZXcpCnBhdHRlcm5zLnB1c2goe2VuYWJsZWQ6dHJ1ZSx1cmw6dXJsfSk7ZWxzZQpwYXR0ZXJucy5zcGxpY2UocGF0dGVybnMuaW5kZXhPZihpdGVtKSwxLHtlbmFibGVkOnRydWUsdXJsOnVybH0pO3RoaXMuX21hbmFnZXIuc2V0QmxvY2tlZFBhdHRlcm5zKHBhdHRlcm5zKTt9Cl9jcmVhdGVFZGl0b3IoKXtpZih0aGlzLl9lZGl0b3IpCnJldHVybiB0aGlzLl9lZGl0b3I7Y29uc3QgZWRpdG9yPW5ldyBVSS5MaXN0V2lkZ2V0LkVkaXRvcigpO2NvbnN0IGNvbnRlbnQ9ZWRpdG9yLmNvbnRlbnRFbGVtZW50KCk7Y29uc3QgdGl0bGVzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Jsb2NrZWQtdXJsLWVkaXQtcm93Jyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1RleHQgcGF0dGVybiB0byBibG9jayBtYXRjaGluZyByZXF1ZXN0czsgdXNlICogZm9yIHdpbGRjYXJkJyk7Y29uc3QgZmllbGRzPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Jsb2NrZWQtdXJsLWVkaXQtcm93Jyk7Y29uc3QgdXJsSW5wdXQ9ZWRpdG9yLmNyZWF0ZUlucHV0KCd1cmwnLCd0ZXh0JywnJywoaXRlbSxpbmRleCxpbnB1dCk9PiEhaW5wdXQudmFsdWUmJiF0aGlzLl9tYW5hZ2VyLmJsb2NrZWRQYXR0ZXJucygpLmZpbmQocGF0dGVybj0+cGF0dGVybi51cmw9PT1pbnB1dC52YWx1ZSkpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnYmxvY2tlZC11cmwtZWRpdC12YWx1ZScpLmFwcGVuZENoaWxkKHVybElucHV0KTtyZXR1cm4gZWRpdG9yO30KX3JlbW92ZUFsbCgpe3RoaXMuX21hbmFnZXIuc2V0QmxvY2tlZFBhdHRlcm5zKFtdKTt9Cl91cGRhdGUoKXtjb25zdCBlbmFibGVkPXRoaXMuX21hbmFnZXIuYmxvY2tpbmdFbmFibGVkKCk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2Jsb2NraW5nLWRpc2FibGVkJywhZW5hYmxlZCYmISF0aGlzLl9tYW5hZ2VyLmJsb2NrZWRQYXR0ZXJucygpLmxlbmd0aCk7dGhpcy5fZW5hYmxlZENoZWNrYm94LnNldENoZWNrZWQoZW5hYmxlZCk7dGhpcy5fbGlzdC5jbGVhcigpO2Zvcihjb25zdCBwYXR0ZXJuIG9mIHRoaXMuX21hbmFnZXIuYmxvY2tlZFBhdHRlcm5zKCkpCnRoaXMuX2xpc3QuYXBwZW5kSXRlbShwYXR0ZXJuLHRydWUpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9Cl9ibG9ja2VkUmVxdWVzdHNDb3VudCh1cmwpe2lmKCF1cmwpCnJldHVybiAwO2xldCByZXN1bHQ9MDtmb3IoY29uc3QgYmxvY2tlZFVybCBvZiB0aGlzLl9ibG9ja2VkQ291bnRGb3JVcmwua2V5cygpKXtpZih0aGlzLl9tYXRjaGVzKHVybCxibG9ja2VkVXJsKSkKcmVzdWx0Kz10aGlzLl9ibG9ja2VkQ291bnRGb3JVcmwuZ2V0KGJsb2NrZWRVcmwpO30KcmV0dXJuIHJlc3VsdDt9Cl9tYXRjaGVzKHBhdHRlcm4sdXJsKXtsZXQgcG9zPTA7Y29uc3QgcGFydHM9cGF0dGVybi5zcGxpdCgnKicpO2ZvcihsZXQgaW5kZXg9MDtpbmRleDxwYXJ0cy5sZW5ndGg7aW5kZXgrKyl7Y29uc3QgcGFydD1wYXJ0c1tpbmRleF07aWYoIXBhcnQubGVuZ3RoKQpjb250aW51ZTtwb3M9dXJsLmluZGV4T2YocGFydCxwb3MpO2lmKHBvcz09PS0xKQpyZXR1cm4gZmFsc2U7cG9zKz1wYXJ0Lmxlbmd0aDt9CnJldHVybiB0cnVlO30KcmVzZXQoKXt0aGlzLl9ibG9ja2VkQ291bnRGb3JVcmwuY2xlYXIoKTt0aGlzLl91cGRhdGVUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO30KX29uUmVxdWVzdEZpbmlzaGVkKGV2ZW50KXtjb25zdCByZXF1ZXN0PShldmVudC5kYXRhKTtpZihyZXF1ZXN0Lndhc0Jsb2NrZWQoKSl7Y29uc3QgY291bnQ9dGhpcy5fYmxvY2tlZENvdW50Rm9yVXJsLmdldChyZXF1ZXN0LnVybCgpKXx8MDt0aGlzLl9ibG9ja2VkQ291bnRGb3JVcmwuc2V0KHJlcXVlc3QudXJsKCksY291bnQrMSk7dGhpcy5fdXBkYXRlVGhyb3R0bGVyLnNjaGVkdWxlKHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpKTt9fX07TmV0d29yay5CbG9ja2VkVVJMc1BhbmUuX2luc3RhbmNlPW51bGw7O05ldHdvcmsuRXZlbnRTb3VyY2VNZXNzYWdlc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHJlcXVlc3Qpe3N1cGVyKCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL2V2ZW50U291cmNlTWVzc2FnZXNWaWV3LmNzcycpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdldmVudC1zb3VyY2UtbWVzc2FnZXMtdmlldycpO3RoaXMuX3JlcXVlc3Q9cmVxdWVzdDtjb25zdCBjb2x1bW5zPShbe2lkOidpZCcsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdJZCcpLHNvcnRhYmxlOnRydWUsd2VpZ2h0Ojh9LHtpZDondHlwZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUeXBlJyksc29ydGFibGU6dHJ1ZSx3ZWlnaHQ6OH0se2lkOidkYXRhJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0RhdGEnKSxzb3J0YWJsZTpmYWxzZSx3ZWlnaHQ6ODh9LHtpZDondGltZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUaW1lJyksc29ydGFibGU6dHJ1ZSx3ZWlnaHQ6OH1dKTt0aGlzLl9kYXRhR3JpZD1uZXcgRGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZChjb2x1bW5zKTt0aGlzLl9kYXRhR3JpZC5zZXRTdHJpcGVkKHRydWUpO3RoaXMuX2RhdGFHcmlkLnNldFN0aWNrVG9Cb3R0b20odHJ1ZSk7dGhpcy5fZGF0YUdyaWQubWFya0NvbHVtbkFzU29ydGVkQnkoJ3RpbWUnLERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZyk7dGhpcy5fc29ydEl0ZW1zKCk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU29ydGluZ0NoYW5nZWQsdGhpcy5fc29ydEl0ZW1zLHRoaXMpO3RoaXMuX2RhdGFHcmlkLnNldE5hbWUoJ0V2ZW50U291cmNlTWVzc2FnZXNWaWV3Jyk7dGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7fQp3YXNTaG93bigpe3RoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBtZXNzYWdlcz10aGlzLl9yZXF1ZXN0LmV2ZW50U291cmNlTWVzc2FnZXMoKTtmb3IobGV0IGk9MDtpPG1lc3NhZ2VzLmxlbmd0aDsrK2kpCnRoaXMuX2RhdGFHcmlkLmluc2VydENoaWxkKG5ldyBOZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGUobWVzc2FnZXNbaV0pKTt0aGlzLl9yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5FdmVudFNvdXJjZU1lc3NhZ2VBZGRlZCx0aGlzLl9tZXNzYWdlQWRkZWQsdGhpcyk7fQp3aWxsSGlkZSgpe3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkV2ZW50U291cmNlTWVzc2FnZUFkZGVkLHRoaXMuX21lc3NhZ2VBZGRlZCx0aGlzKTt9Cl9tZXNzYWdlQWRkZWQoZXZlbnQpe2NvbnN0IG1lc3NhZ2U9KGV2ZW50LmRhdGEpO3RoaXMuX2RhdGFHcmlkLmluc2VydENoaWxkKG5ldyBOZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGUobWVzc2FnZSkpO30KX3NvcnRJdGVtcygpe2NvbnN0IHNvcnRDb2x1bW5JZD10aGlzLl9kYXRhR3JpZC5zb3J0Q29sdW1uSWQoKTtpZighc29ydENvbHVtbklkKQpyZXR1cm47Y29uc3QgY29tcGFyYXRvcj1OZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGUuQ29tcGFyYXRvcnNbc29ydENvbHVtbklkXTtpZighY29tcGFyYXRvcikKcmV0dXJuO3RoaXMuX2RhdGFHcmlkLnNvcnROb2Rlcyhjb21wYXJhdG9yLCF0aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpKTt9fTtOZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZXtjb25zdHJ1Y3RvcihtZXNzYWdlKXtjb25zdCB0aW1lPW5ldyBEYXRlKG1lc3NhZ2UudGltZSoxMDAwKTtjb25zdCB0aW1lVGV4dD0oJzAnK3RpbWUuZ2V0SG91cnMoKSkuc3Vic3RyKC0yKSsnOicrKCcwJyt0aW1lLmdldE1pbnV0ZXMoKSkuc3Vic3RyKC0yKSsnOicrCignMCcrdGltZS5nZXRTZWNvbmRzKCkpLnN1YnN0cigtMikrJy4nKygnMDAnK3RpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpLnN1YnN0cigtMyk7Y29uc3QgdGltZU5vZGU9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGltZU5vZGUuY3JlYXRlVGV4dENoaWxkKHRpbWVUZXh0KTt0aW1lTm9kZS50aXRsZT10aW1lLnRvTG9jYWxlU3RyaW5nKCk7c3VwZXIoe2lkOm1lc3NhZ2UuZXZlbnRJZCx0eXBlOm1lc3NhZ2UuZXZlbnROYW1lLGRhdGE6bWVzc2FnZS5kYXRhLHRpbWU6dGltZU5vZGV9KTt0aGlzLl9tZXNzYWdlPW1lc3NhZ2U7fX07TmV0d29yay5FdmVudFNvdXJjZU1lc3NhZ2VOb2RlQ29tcGFyYXRvcj1mdW5jdGlvbihmaWVsZCxhLGIpe2NvbnN0IGFWYWx1ZT1hLl9tZXNzYWdlW2ZpZWxkXTtjb25zdCBiVmFsdWU9Yi5fbWVzc2FnZVtmaWVsZF07cmV0dXJuIGFWYWx1ZTxiVmFsdWU/LTE6YVZhbHVlPmJWYWx1ZT8xOjA7fTtOZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGUuQ29tcGFyYXRvcnM9eydpZCc6TmV0d29yay5FdmVudFNvdXJjZU1lc3NhZ2VOb2RlQ29tcGFyYXRvci5iaW5kKG51bGwsJ2V2ZW50SWQnKSwndHlwZSc6TmV0d29yay5FdmVudFNvdXJjZU1lc3NhZ2VOb2RlQ29tcGFyYXRvci5iaW5kKG51bGwsJ2V2ZW50TmFtZScpLCd0aW1lJzpOZXR3b3JrLkV2ZW50U291cmNlTWVzc2FnZU5vZGVDb21wYXJhdG9yLmJpbmQobnVsbCwndGltZScpfTs7TmV0d29yay5IQVJXcml0ZXI9Y2xhc3N7c3RhdGljIGFzeW5jIHdyaXRlKHN0cmVhbSxyZXF1ZXN0cyxwcm9ncmVzcyl7Y29uc3QgY29tcG9zaXRlUHJvZ3Jlc3M9bmV3IENvbW1vbi5Db21wb3NpdGVQcm9ncmVzcyhwcm9ncmVzcyk7Y29uc3QgY29udGVudD1hd2FpdCBOZXR3b3JrLkhBUldyaXRlci5faGFyU3RyaW5nRm9yUmVxdWVzdHMocmVxdWVzdHMsY29tcG9zaXRlUHJvZ3Jlc3MpO2lmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBOZXR3b3JrLkhBUldyaXRlci5fd3JpdGVUb1N0cmVhbShzdHJlYW0sY29tcG9zaXRlUHJvZ3Jlc3MsY29udGVudCk7fQpzdGF0aWMgYXN5bmMgX2hhclN0cmluZ0ZvclJlcXVlc3RzKHJlcXVlc3RzLGNvbXBvc2l0ZVByb2dyZXNzKXtjb25zdCBwcm9ncmVzcz1jb21wb3NpdGVQcm9ncmVzcy5jcmVhdGVTdWJQcm9ncmVzcygpO3Byb2dyZXNzLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnQ29sbGVjdGluZyBjb250ZW50XHUyMDI2JykpO3Byb2dyZXNzLnNldFRvdGFsV29yayhyZXF1ZXN0cy5sZW5ndGgpO2NvbnN0IGhhckxvZz1hd2FpdCBCcm93c2VyU0RLLkhBUkxvZy5idWlsZChyZXF1ZXN0cyk7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGxldCBpPTA7aTxyZXF1ZXN0cy5sZW5ndGg7aSsrKXtjb25zdCBwcm9taXNlPXJlcXVlc3RzW2ldLmNvbnRlbnREYXRhKCk7cHJvbWlzZXMucHVzaChwcm9taXNlLnRoZW4oY29udGVudExvYWRlZC5iaW5kKG51bGwsaGFyTG9nLmVudHJpZXNbaV0pKSk7fQphd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7cHJvZ3Jlc3MuZG9uZSgpO2lmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSkKcmV0dXJuJyc7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtsb2c6aGFyTG9nfSxudWxsLE5ldHdvcmsuSEFSV3JpdGVyLl9qc29uSW5kZW50KTtmdW5jdGlvbiBpc1ZhbGlkQ2hhcmFjdGVyKGNvZGVfcG9pbnQpe3JldHVybiBjb2RlX3BvaW50PDB4RDgwMHx8KGNvZGVfcG9pbnQ+PTB4RTAwMCYmY29kZV9wb2ludDwweEZERDApfHwoY29kZV9wb2ludD4weEZERUYmJmNvZGVfcG9pbnQ8PTB4MTBGRkZGJiYoY29kZV9wb2ludCYweEZGRkUpIT09MHhGRkZFKTt9CmZ1bmN0aW9uIG5lZWRzRW5jb2RpbmcoY29udGVudCl7Zm9yKGxldCBpPTA7aTxjb250ZW50Lmxlbmd0aDtpKyspe2lmKCFpc1ZhbGlkQ2hhcmFjdGVyKGNvbnRlbnQuY2hhckNvZGVBdChpKSkpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30KZnVuY3Rpb24gY29udGVudExvYWRlZChlbnRyeSxjb250ZW50RGF0YSl7cHJvZ3Jlc3Mud29ya2VkKCk7bGV0IGVuY29kZWQ9Y29udGVudERhdGEuZW5jb2RlZDtpZihjb250ZW50RGF0YS5jb250ZW50IT09bnVsbCl7bGV0IGNvbnRlbnQ9Y29udGVudERhdGEuY29udGVudDtpZihjb250ZW50JiYhZW5jb2RlZCYmbmVlZHNFbmNvZGluZyhjb250ZW50KSl7Y29udGVudD1jb250ZW50LnRvQmFzZTY0KCk7ZW5jb2RlZD10cnVlO30KZW50cnkucmVzcG9uc2UuY29udGVudC50ZXh0PWNvbnRlbnQ7fQppZihlbmNvZGVkKQplbnRyeS5yZXNwb25zZS5jb250ZW50LmVuY29kaW5nPSdiYXNlNjQnO319CnN0YXRpYyBhc3luYyBfd3JpdGVUb1N0cmVhbShzdHJlYW0sY29tcG9zaXRlUHJvZ3Jlc3MsZmlsZUNvbnRlbnQpe2NvbnN0IHByb2dyZXNzPWNvbXBvc2l0ZVByb2dyZXNzLmNyZWF0ZVN1YlByb2dyZXNzKCk7cHJvZ3Jlc3Muc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdXcml0aW5nIGZpbGVcdTIwMjYnKSk7cHJvZ3Jlc3Muc2V0VG90YWxXb3JrKGZpbGVDb250ZW50Lmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxmaWxlQ29udGVudC5sZW5ndGgmJiFwcm9ncmVzcy5pc0NhbmNlbGVkKCk7aSs9TmV0d29yay5IQVJXcml0ZXIuX2NodW5rU2l6ZSl7Y29uc3QgY2h1bms9ZmlsZUNvbnRlbnQuc3Vic3RyKGksTmV0d29yay5IQVJXcml0ZXIuX2NodW5rU2l6ZSk7YXdhaXQgc3RyZWFtLndyaXRlKGNodW5rKTtwcm9ncmVzcy53b3JrZWQoY2h1bmsubGVuZ3RoKTt9CnByb2dyZXNzLmRvbmUoKTt9fTtOZXR3b3JrLkhBUldyaXRlci5fanNvbkluZGVudD0yO05ldHdvcmsuSEFSV3JpdGVyLl9jaHVua1NpemU9MTAwMDAwOztOZXR3b3JrLk5ldHdvcmtDb25maWdWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbmV0d29yay9uZXR3b3JrQ29uZmlnVmlldy5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstY29uZmlnJyk7dGhpcy5fY3JlYXRlQ2FjaGVTZWN0aW9uKCk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JykuY2xhc3NMaXN0LmFkZCgncGFuZWwtc2VjdGlvbi1zZXBhcmF0b3InKTt0aGlzLl9jcmVhdGVOZXR3b3JrVGhyb3R0bGluZ1NlY3Rpb24oKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKS5jbGFzc0xpc3QuYWRkKCdwYW5lbC1zZWN0aW9uLXNlcGFyYXRvcicpO3RoaXMuX2NyZWF0ZVVzZXJBZ2VudFNlY3Rpb24oKTt9CnN0YXRpYyBjcmVhdGVVc2VyQWdlbnRTZWxlY3RBbmRJbnB1dCgpe2NvbnN0IHVzZXJBZ2VudFNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2N1c3RvbVVzZXJBZ2VudCcsJycpO2NvbnN0IHVzZXJBZ2VudFNlbGVjdEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7Y29uc3QgY3VzdG9tT3ZlcnJpZGU9e3RpdGxlOkNvbW1vbi5VSVN0cmluZygnQ3VzdG9tLi4uJyksdmFsdWU6J2N1c3RvbSd9O3VzZXJBZ2VudFNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IE9wdGlvbihjdXN0b21PdmVycmlkZS50aXRsZSxjdXN0b21PdmVycmlkZS52YWx1ZSkpO2NvbnN0IGdyb3Vwcz1OZXR3b3JrLk5ldHdvcmtDb25maWdWaWV3Ll91c2VyQWdlbnRHcm91cHM7Zm9yKGNvbnN0IHVzZXJBZ2VudERlc2NyaXB0b3Igb2YgZ3JvdXBzKXtjb25zdCBncm91cEVsZW1lbnQ9dXNlckFnZW50U2VsZWN0RWxlbWVudC5jcmVhdGVDaGlsZCgnb3B0Z3JvdXAnKTtncm91cEVsZW1lbnQubGFiZWw9dXNlckFnZW50RGVzY3JpcHRvci50aXRsZTtmb3IoY29uc3QgdXNlckFnZW50VmVyc2lvbiBvZiB1c2VyQWdlbnREZXNjcmlwdG9yLnZhbHVlcyl7Y29uc3QgdXNlckFnZW50VmFsdWU9U0RLLk11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIucGF0Y2hVc2VyQWdlbnRXaXRoQ2hyb21lVmVyc2lvbih1c2VyQWdlbnRWZXJzaW9uLnZhbHVlKTtncm91cEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IE9wdGlvbih1c2VyQWdlbnRWZXJzaW9uLnRpdGxlLHVzZXJBZ2VudFZhbHVlKSk7fX0KdXNlckFnZW50U2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4PTA7Y29uc3Qgb3RoZXJVc2VyQWdlbnRFbGVtZW50PVVJLmNyZWF0ZUlucHV0KCcnLCd0ZXh0Jyk7b3RoZXJVc2VyQWdlbnRFbGVtZW50LnZhbHVlPXVzZXJBZ2VudFNldHRpbmcuZ2V0KCk7b3RoZXJVc2VyQWdlbnRFbGVtZW50LnRpdGxlPXVzZXJBZ2VudFNldHRpbmcuZ2V0KCk7b3RoZXJVc2VyQWdlbnRFbGVtZW50LnBsYWNlaG9sZGVyPUNvbW1vbi5VSVN0cmluZygnRW50ZXIgYSBjdXN0b20gdXNlciBhZ2VudCcpO290aGVyVXNlckFnZW50RWxlbWVudC5yZXF1aXJlZD10cnVlO3NldHRpbmdDaGFuZ2VkKCk7dXNlckFnZW50U2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHVzZXJBZ2VudFNlbGVjdGVkLGZhbHNlKTtvdGhlclVzZXJBZ2VudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGFwcGx5T3RoZXJVc2VyQWdlbnQsZmFsc2UpO2Z1bmN0aW9uIHVzZXJBZ2VudFNlbGVjdGVkKCl7Y29uc3QgdmFsdWU9dXNlckFnZW50U2VsZWN0RWxlbWVudC5vcHRpb25zW3VzZXJBZ2VudFNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleF0udmFsdWU7aWYodmFsdWUhPT1jdXN0b21PdmVycmlkZS52YWx1ZSl7dXNlckFnZW50U2V0dGluZy5zZXQodmFsdWUpO290aGVyVXNlckFnZW50RWxlbWVudC52YWx1ZT12YWx1ZTtvdGhlclVzZXJBZ2VudEVsZW1lbnQudGl0bGU9dmFsdWU7fWVsc2V7b3RoZXJVc2VyQWdlbnRFbGVtZW50LnNlbGVjdCgpO319CmZ1bmN0aW9uIHNldHRpbmdDaGFuZ2VkKCl7Y29uc3QgdmFsdWU9dXNlckFnZW50U2V0dGluZy5nZXQoKTtjb25zdCBvcHRpb25zPXVzZXJBZ2VudFNlbGVjdEVsZW1lbnQub3B0aW9ucztsZXQgc2VsZWN0aW9uUmVzdG9yZWQ9ZmFsc2U7Zm9yKGxldCBpPTA7aTxvcHRpb25zLmxlbmd0aDsrK2kpe2lmKG9wdGlvbnNbaV0udmFsdWU9PT12YWx1ZSl7dXNlckFnZW50U2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4PWk7c2VsZWN0aW9uUmVzdG9yZWQ9dHJ1ZTticmVhazt9fQppZighc2VsZWN0aW9uUmVzdG9yZWQpCnVzZXJBZ2VudFNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleD0wO30KZnVuY3Rpb24gYXBwbHlPdGhlclVzZXJBZ2VudCgpe2lmKHVzZXJBZ2VudFNldHRpbmcuZ2V0KCkhPT1vdGhlclVzZXJBZ2VudEVsZW1lbnQudmFsdWUpe3VzZXJBZ2VudFNldHRpbmcuc2V0KG90aGVyVXNlckFnZW50RWxlbWVudC52YWx1ZSk7b3RoZXJVc2VyQWdlbnRFbGVtZW50LnRpdGxlPW90aGVyVXNlckFnZW50RWxlbWVudC52YWx1ZTtzZXR0aW5nQ2hhbmdlZCgpO319CnJldHVybntzZWxlY3Q6dXNlckFnZW50U2VsZWN0RWxlbWVudCxpbnB1dDpvdGhlclVzZXJBZ2VudEVsZW1lbnR9O30KX2NyZWF0ZVNlY3Rpb24odGl0bGUsY2xhc3NOYW1lKXtjb25zdCBzZWN0aW9uPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NlY3Rpb24nLCduZXR3b3JrLWNvbmZpZy1ncm91cCcpO2lmKGNsYXNzTmFtZSkKc2VjdGlvbi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7c2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay1jb25maWctdGl0bGUnKS50ZXh0Q29udGVudD10aXRsZTtyZXR1cm4gc2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay1jb25maWctZmllbGRzJyk7fQpfY3JlYXRlQ2FjaGVTZWN0aW9uKCl7Y29uc3Qgc2VjdGlvbj10aGlzLl9jcmVhdGVTZWN0aW9uKENvbW1vbi5VSVN0cmluZygnQ2FjaGluZycpLCduZXR3b3JrLWNvbmZpZy1kaXNhYmxlLWNhY2hlJyk7c2VjdGlvbi5hcHBlbmRDaGlsZChVSS5TZXR0aW5nc1VJLmNyZWF0ZVNldHRpbmdDaGVja2JveChDb21tb24uVUlTdHJpbmcoJ0Rpc2FibGUgY2FjaGUnKSxDb21tb24ubW9kdWxlU2V0dGluZygnY2FjaGVEaXNhYmxlZCcpLHRydWUpKTt9Cl9jcmVhdGVOZXR3b3JrVGhyb3R0bGluZ1NlY3Rpb24oKXtjb25zdCBzZWN0aW9uPXRoaXMuX2NyZWF0ZVNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdOZXR3b3JrIHRocm90dGxpbmcnKSwnbmV0d29yay1jb25maWctdGhyb3R0bGluZycpO2NvbnN0IG5ldHdvcmtUaHJvdHRsaW5nU2VsZWN0PShzZWN0aW9uLmNyZWF0ZUNoaWxkKCdzZWxlY3QnLCdjaHJvbWUtc2VsZWN0JykpO01vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5kZWNvcmF0ZVNlbGVjdFdpdGhOZXR3b3JrVGhyb3R0bGluZyhuZXR3b3JrVGhyb3R0bGluZ1NlbGVjdCk7fQpfY3JlYXRlVXNlckFnZW50U2VjdGlvbigpe2NvbnN0IHNlY3Rpb249dGhpcy5fY3JlYXRlU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ1VzZXIgYWdlbnQnKSwnbmV0d29yay1jb25maWctdWEnKTtjb25zdCBjaGVja2JveExhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKENvbW1vbi5VSVN0cmluZygnU2VsZWN0IGF1dG9tYXRpY2FsbHknKSx0cnVlKTtzZWN0aW9uLmFwcGVuZENoaWxkKGNoZWNrYm94TGFiZWwpO2NvbnN0IGF1dG9DaGVja2JveD1jaGVja2JveExhYmVsLmNoZWNrYm94RWxlbWVudDtjb25zdCBjdXN0b21Vc2VyQWdlbnRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdjdXN0b21Vc2VyQWdlbnQnLCcnKTtjdXN0b21Vc2VyQWdlbnRTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKCgpPT57aWYoYXV0b0NoZWNrYm94LmNoZWNrZWQpCnJldHVybjtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5zZXRDdXN0b21Vc2VyQWdlbnRPdmVycmlkZShjdXN0b21Vc2VyQWdlbnRTZXR0aW5nLmdldCgpKTt9KTtjb25zdCBjdXN0b21Vc2VyQWdlbnRTZWxlY3RCb3g9c2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay1jb25maWctdWEtY3VzdG9tJyk7YXV0b0NoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsdXNlckFnZW50U2VsZWN0Qm94Q2hhbmdlZCk7Y29uc3QgY3VzdG9tU2VsZWN0QW5kSW5wdXQ9TmV0d29yay5OZXR3b3JrQ29uZmlnVmlldy5jcmVhdGVVc2VyQWdlbnRTZWxlY3RBbmRJbnB1dCgpO2N1c3RvbVNlbGVjdEFuZElucHV0LnNlbGVjdC5jbGFzc0xpc3QuYWRkKCdjaHJvbWUtc2VsZWN0Jyk7Y3VzdG9tVXNlckFnZW50U2VsZWN0Qm94LmFwcGVuZENoaWxkKGN1c3RvbVNlbGVjdEFuZElucHV0LnNlbGVjdCk7Y3VzdG9tVXNlckFnZW50U2VsZWN0Qm94LmFwcGVuZENoaWxkKGN1c3RvbVNlbGVjdEFuZElucHV0LmlucHV0KTt1c2VyQWdlbnRTZWxlY3RCb3hDaGFuZ2VkKCk7ZnVuY3Rpb24gdXNlckFnZW50U2VsZWN0Qm94Q2hhbmdlZCgpe2NvbnN0IHVzZUN1c3RvbVVBPSFhdXRvQ2hlY2tib3guY2hlY2tlZDtjdXN0b21Vc2VyQWdlbnRTZWxlY3RCb3guY2xhc3NMaXN0LnRvZ2dsZSgnY2hlY2tlZCcsdXNlQ3VzdG9tVUEpO2N1c3RvbVNlbGVjdEFuZElucHV0LnNlbGVjdC5kaXNhYmxlZD0hdXNlQ3VzdG9tVUE7Y3VzdG9tU2VsZWN0QW5kSW5wdXQuaW5wdXQuZGlzYWJsZWQ9IXVzZUN1c3RvbVVBO2NvbnN0IGN1c3RvbVVBPXVzZUN1c3RvbVVBP2N1c3RvbVVzZXJBZ2VudFNldHRpbmcuZ2V0KCk6Jyc7U0RLLm11bHRpdGFyZ2V0TmV0d29ya01hbmFnZXIuc2V0Q3VzdG9tVXNlckFnZW50T3ZlcnJpZGUoY3VzdG9tVUEpO319fTtOZXR3b3JrLk5ldHdvcmtDb25maWdWaWV3Ll91c2VyQWdlbnRHcm91cHM9W3t0aXRsZTonQW5kcm9pZCcsdmFsdWVzOlt7dGl0bGU6J0FuZHJvaWQgKDQuMC4yKSBCcm93c2VyIFx1MjAxNCBHYWxheHkgTmV4dXMnLHZhbHVlOidNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wLjI7IGVuLXVzOyBHYWxheHkgTmV4dXMgQnVpbGQvSUNMNTNGKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCd9LHt0aXRsZTonQW5kcm9pZCAoMi4zKSBCcm93c2VyIFx1MjAxNCBOZXh1cyBTJyx2YWx1ZTonTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDIuMy42OyBlbi11czsgTmV4dXMgUyBCdWlsZC9HUkszOUYpIEFwcGxlV2ViS2l0LzUzMy4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzMuMSd9XX0se3RpdGxlOidCbGFja0JlcnJ5Jyx2YWx1ZXM6W3t0aXRsZTonQmxhY2tCZXJyeSBcdTIwMTQgQkIxMCcsdmFsdWU6J01vemlsbGEvNS4wIChCQjEwOyBUb3VjaCkgQXBwbGVXZWJLaXQvNTM3LjErIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjAuMTMzNyBNb2JpbGUgU2FmYXJpLzUzNy4xKyd9LHt0aXRsZTonQmxhY2tCZXJyeSBcdTIwMTQgUGxheUJvb2sgMi4xJyx2YWx1ZTonTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi83LjIuMS4wIFNhZmFyaS81MzYuMisnfSx7dGl0bGU6J0JsYWNrQmVycnkgXHUyMDE0IDk5MDAnLHZhbHVlOidNb3ppbGxhLzUuMCAoQmxhY2tCZXJyeTsgVTsgQmxhY2tCZXJyeSA5OTAwOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM0LjExKyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wLjAuMTg3IE1vYmlsZSBTYWZhcmkvNTM0LjExKyd9XX0se3RpdGxlOidDaHJvbWUnLHZhbHVlczpbe3RpdGxlOidDaHJvbWUgXHUyMDE0IEFuZHJvaWQgTW9iaWxlJyx2YWx1ZTonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8lcyBNb2JpbGUgU2FmYXJpLzUzNy4zNid9LHt0aXRsZTonQ2hyb21lIFx1MjAxNCBBbmRyb2lkIFRhYmxldCcsdmFsdWU6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjM7IE5leHVzIDcgQnVpbGQvSlNTMTVRKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgU2FmYXJpLzUzNy4zNid9LHt0aXRsZTonQ2hyb21lIFx1MjAxNCBpUGhvbmUnLHZhbHVlOidNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDlfMSBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDEuMSAoS0hUTUwsIGxpa2UgR2Vja28pIENyaU9TLyVzIE1vYmlsZS8xM0IxNDMgU2FmYXJpLzYwMS4xLjQ2J30se3RpdGxlOidDaHJvbWUgXHUyMDE0IGlQYWQnLHZhbHVlOidNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDlfMSBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDEuMSAoS0hUTUwsIGxpa2UgR2Vja28pIENyaU9TLyVzIE1vYmlsZS8xM0IxNDMgU2FmYXJpLzYwMS4xLjQ2J30se3RpdGxlOidDaHJvbWUgXHUyMDE0IENocm9tZSBPUycsdmFsdWU6J01vemlsbGEvNS4wIChYMTE7IENyT1MgeDg2XzY0IDEwMDY2LjAuMCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIFNhZmFyaS81MzcuMzYnfSx7dGl0bGU6J0Nocm9tZSBcdTIwMTQgTWFjJyx2YWx1ZTonTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTFfMSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLyVzIFNhZmFyaS81MzcuMzYnfSx7dGl0bGU6J0Nocm9tZSBcdTIwMTQgV2luZG93cycsdmFsdWU6J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvJXMgU2FmYXJpLzUzNy4zNid9XX0se3RpdGxlOidFZGdlJyx2YWx1ZXM6W3t0aXRsZTonRWRnZSBcdTIwMTQgV2luZG93cycsdmFsdWU6J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS80Mi4wLjIzMTEuMTM1IFNhZmFyaS81MzcuMzYgRWRnZS8xMi4xMDI0MCd9LHt0aXRsZTonRWRnZSBcdTIwMTQgTW9iaWxlJyx2YWx1ZTonTW96aWxsYS81LjAgKFdpbmRvd3MgUGhvbmUgMTAuMDsgQW5kcm9pZCA0LjIuMTsgTWljcm9zb2Z0OyBMdW1pYSA2NDAgWEwgTFRFKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDIuMC4yMzExLjEzNSBNb2JpbGUgU2FmYXJpLzUzNy4zNiBFZGdlLzEyLjEwMTY2J30se3RpdGxlOidFZGdlIFx1MjAxNCBYQm94Jyx2YWx1ZTonTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgWGJveDsgWGJveCBPbmUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS80Mi4wLjIzMTEuMTM1IFNhZmFyaS81MzcuMzYgRWRnZS8xMy4xMDU4Nid9XX0se3RpdGxlOidGaXJlZm94Jyx2YWx1ZXM6W3t0aXRsZTonRmlyZWZveCBcdTIwMTQgQW5kcm9pZCBNb2JpbGUnLHZhbHVlOidNb3ppbGxhLzUuMCAoQW5kcm9pZCA0LjQ7IE1vYmlsZTsgcnY6NDYuMCkgR2Vja28vNDYuMCBGaXJlZm94LzQ2LjAnfSx7dGl0bGU6J0ZpcmVmb3ggXHUyMDE0IEFuZHJvaWQgVGFibGV0Jyx2YWx1ZTonTW96aWxsYS81LjAgKEFuZHJvaWQgNC40OyBUYWJsZXQ7IHJ2OjQ2LjApIEdlY2tvLzQ2LjAgRmlyZWZveC80Ni4wJ30se3RpdGxlOidGaXJlZm94IFx1MjAxNCBpUGhvbmUnLHZhbHVlOidNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDhfMyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDAuMS40IChLSFRNTCwgbGlrZSBHZWNrbykgRnhpT1MvMS4wIE1vYmlsZS8xMkY2OSBTYWZhcmkvNjAwLjEuNCd9LHt0aXRsZTonRmlyZWZveCBcdTIwMTQgaVBhZCcsdmFsdWU6J01vemlsbGEvNS4wIChpUGFkOyBDUFUgaVBob25lIE9TIDhfMyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDAuMS40IChLSFRNTCwgbGlrZSBHZWNrbykgRnhpT1MvMS4wIE1vYmlsZS8xMkY2OSBTYWZhcmkvNjAwLjEuNCd9LHt0aXRsZTonRmlyZWZveCBcdTIwMTQgTWFjJyx2YWx1ZTonTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTAuMTE7IHJ2OjQ2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNDYuMCd9LHt0aXRsZTonRmlyZWZveCBcdTIwMTQgV2luZG93cycsdmFsdWU6J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0OyBydjo0Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzQ2LjAnfV19LHt0aXRsZTonR29vZ2xlYm90Jyx2YWx1ZXM6W3t0aXRsZTonR29vZ2xlYm90Jyx2YWx1ZTonTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IEdvb2dsZWJvdC8yLjE7ICtodHRwOi8vd3d3Lmdvb2dsZS5jb20vYm90Lmh0bWwpJ30se3RpdGxlOidHb29nbGVib3QgU21hcnRwaG9uZScsdmFsdWU6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjAuMTsgTmV4dXMgNVggQnVpbGQvTU1CMjlQKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDEuMC4yMjcyLjk2IE1vYmlsZSBTYWZhcmkvNTM3LjM2IChjb21wYXRpYmxlOyBHb29nbGVib3QvMi4xOyAraHR0cDovL3d3dy5nb29nbGUuY29tL2JvdC5odG1sKSd9XX0se3RpdGxlOidJbnRlcm5ldCBFeHBsb3JlcicsdmFsdWVzOlt7dGl0bGU6J0ludGVybmV0IEV4cGxvcmVyIDExJyx2YWx1ZTonTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV09XNjQ7IFRyaWRlbnQvNy4wOyBydjoxMS4wKSBsaWtlIEdlY2tvJ30se3RpdGxlOidJbnRlcm5ldCBFeHBsb3JlciAxMCcsdmFsdWU6J01vemlsbGEvNS4wIChjb21wYXRpYmxlOyBNU0lFIDEwLjA7IFdpbmRvd3MgTlQgNi4xOyBXT1c2NDsgVHJpZGVudC82LjApJ30se3RpdGxlOidJbnRlcm5ldCBFeHBsb3JlciA5Jyx2YWx1ZTonTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgOS4wOyBXaW5kb3dzIE5UIDYuMTsgVHJpZGVudC81LjApJ30se3RpdGxlOidJbnRlcm5ldCBFeHBsb3JlciA4Jyx2YWx1ZTonTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgOC4wOyBXaW5kb3dzIE5UIDYuMDsgVHJpZGVudC80LjApJ30se3RpdGxlOidJbnRlcm5ldCBFeHBsb3JlciA3Jyx2YWx1ZTonTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNy4wOyBXaW5kb3dzIE5UIDYuMCknfV19LHt0aXRsZTonT3BlcmEnLHZhbHVlczpbe3RpdGxlOidPcGVyYSBcdTIwMTQgTWFjJyx2YWx1ZTonTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTFfMSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzUwLjAuMjY2MS44NyBTYWZhcmkvNTM3LjM2IE9QUi8zNy4wLjIxNzguMzEnfSx7dGl0bGU6J09wZXJhIFx1MjAxNCBXaW5kb3dzJyx2YWx1ZTonTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV09XNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS81MC4wLjI2NjEuODcgU2FmYXJpLzUzNy4zNiBPUFIvMzcuMC4yMTc4LjMxJ30se3RpdGxlOidPcGVyYSAoUHJlc3RvKSBcdTIwMTQgTWFjJyx2YWx1ZTonT3BlcmEvOS44MCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMC45LjEpIFByZXN0by8yLjEyLjM4OCBWZXJzaW9uLzEyLjE2J30se3RpdGxlOidPcGVyYSAoUHJlc3RvKSBcdTIwMTQgV2luZG93cycsdmFsdWU6J09wZXJhLzkuODAgKFdpbmRvd3MgTlQgNi4xKSBQcmVzdG8vMi4xMi4zODggVmVyc2lvbi8xMi4xNid9LHt0aXRsZTonT3BlcmEgTW9iaWxlIFx1MjAxNCBBbmRyb2lkIE1vYmlsZScsdmFsdWU6J09wZXJhLzEyLjAyIChBbmRyb2lkIDQuMTsgTGludXg7IE9wZXJhIE1vYmkvQURSLTExMTExMDExNTc7IFU7IGVuLVVTKSBQcmVzdG8vMi45LjIwMSBWZXJzaW9uLzEyLjAyJ30se3RpdGxlOidPcGVyYSBNaW5pIFx1MjAxNCBpT1MnLHZhbHVlOidPcGVyYS85LjgwIChpUGhvbmU7IE9wZXJhIE1pbmkvOC4wLjAvMzQuMjMzNjsgVTsgZW4pIFByZXN0by8yLjguMTE5IFZlcnNpb24vMTEuMTAnfV19LHt0aXRsZTonU2FmYXJpJyx2YWx1ZXM6W3t0aXRsZTonU2FmYXJpIFx1MjAxNCBpUGFkIGlPUyA5Jyx2YWx1ZTonTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyA5XzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAxLjEuNDYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzkuMCBNb2JpbGUvMTNCMTM3IFNhZmFyaS82MDEuMSd9LHt0aXRsZTonU2FmYXJpIFx1MjAxNCBpUGhvbmUgaU9TIDknLHZhbHVlOidNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDlfMSBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDEuMS40NiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vOS4wIE1vYmlsZS8xM0IxMzcgU2FmYXJpLzYwMS4xJ30se3RpdGxlOidTYWZhcmkgXHUyMDE0IE1hYycsdmFsdWU6J01vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzlfMykgQXBwbGVXZWJLaXQvNTM3Ljc1LjE0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi83LjAuMyBTYWZhcmkvNzA0NkExOTRBJ31dfSx7dGl0bGU6J1VDIEJyb3dzZXInLHZhbHVlczpbe3RpdGxlOidVQyBCcm93c2VyIFx1MjAxNCBBbmRyb2lkIE1vYmlsZScsdmFsdWU6J01vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuNDsgZW4tVVM7IFhUMTAyMiBCdWlsZC9LWEMyMS41LTQwKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBVQ0Jyb3dzZXIvMTAuNy4wLjYzNiBVMy8wLjguMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCd9LHt0aXRsZTonVUMgQnJvd3NlciBcdTIwMTQgaU9TJyx2YWx1ZTonVUNXRUIvMi4wIChpUGFkOyBVOyBDUFUgT1MgN18xIGxpa2UgTWFjIE9TIFg7IGVuOyBpUGFkMyw2KSBVMi8xLjAuMCBVQ0Jyb3dzZXIvOS4zLjEuMzQ0J30se3RpdGxlOidVQyBCcm93c2VyIFx1MjAxNCBXaW5kb3dzIFBob25lJyx2YWx1ZTonTm9raWFYMi0wMi8yLjAgKDExLjc5KSBQcm9maWxlL01JRFAtMi4xIENvbmZpZ3VyYXRpb24vQ0xEQy0xLjEgTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgOC4wOyBXaW5kb3dzIE5UIDYuMTsgVHJpZGVudC80LjA7IFNMQ0MyOy5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy41LjMwNzI5OyAuTkVUIENMUiAzLjAuMzA3Mjk7IE1lZGlhIENlbnRlciBQQyA2LjA7IEluZm9QYXRoLjIpIFVDQnJvd3NlcjguNC4wLjE1OS83MC8zNTInfV19XTs7TmV0d29yay5OZXR3b3JrTm9kZT1jbGFzcyBleHRlbmRzIERhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKHBhcmVudFZpZXcpe3N1cGVyKHt9KTt0aGlzLl9wYXJlbnRWaWV3PXBhcmVudFZpZXc7dGhpcy5faXNIb3ZlcmVkPWZhbHNlO3RoaXMuX2lzUHJvZHVjdD1mYWxzZTt0aGlzLl9zaG93aW5nSW5pdGlhdG9yQ2hhaW49ZmFsc2U7dGhpcy5fcmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdD1udWxsO30Kc3RhdGljIF90aGVtZWRCYWNrZ3JvdW5kQ29sb3JzKCl7aWYoTmV0d29yay5OZXR3b3JrTm9kZS5fdGhlbWVkQmFja2dyb3VuZENvbG9yc0NhY2hlKQpyZXR1cm4gTmV0d29yay5OZXR3b3JrTm9kZS5fdGhlbWVkQmFja2dyb3VuZENvbG9yc0NhY2hlO2NvbnN0IHRoZW1lZENvbG9ycz17fTtmb3IoY29uc3QgbmFtZSBpbiBOZXR3b3JrLk5ldHdvcmtOb2RlLl9iYWNrZ3JvdW5kQ29sb3JzKXtjb25zdCBjb2xvcj1Db21tb24uQ29sb3IuZnJvbVJHQkEoTmV0d29yay5OZXR3b3JrTm9kZS5fYmFja2dyb3VuZENvbG9yc1tuYW1lXSk7dGhlbWVkQ29sb3JzW25hbWVdPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yKGNvbG9yLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkJhY2tncm91bmQpO30KTmV0d29yay5OZXR3b3JrTm9kZS5fdGhlbWVkQmFja2dyb3VuZENvbG9yc0NhY2hlPSh0aGVtZWRDb2xvcnMpO3JldHVybiBOZXR3b3JrLk5ldHdvcmtOb2RlLl90aGVtZWRCYWNrZ3JvdW5kQ29sb3JzQ2FjaGU7fQpkaXNwbGF5TmFtZSgpe3JldHVybicnO30KY3JlYXRlQ2VsbChjb2x1bW5JZCl7Y29uc3QgY2VsbD10aGlzLmNyZWF0ZVREKGNvbHVtbklkKTt0aGlzLnJlbmRlckNlbGwoY2VsbCxjb2x1bW5JZCk7cmV0dXJuIGNlbGw7fQpyZW5kZXJDZWxsKGNlbGwsY29sdW1uSWQpe30KYmFja2dyb3VuZENvbG9yKCl7Y29uc3QgYmdDb2xvcnM9TmV0d29yay5OZXR3b3JrTm9kZS5fdGhlbWVkQmFja2dyb3VuZENvbG9ycygpO2lmKHRoaXMuc2VsZWN0ZWQpCnJldHVybihiZ0NvbG9ycy5TZWxlY3RlZC5hc1N0cmluZyhDb21tb24uQ29sb3IuRm9ybWF0LkhFWCkpO2xldCBjb2xvcj10aGlzLmlzU3RyaXBlZCgpP2JnQ29sb3JzLlN0cmlwZTpiZ0NvbG9ycy5EZWZhdWx0O2lmKHRoaXMuaXNOYXZpZ2F0aW9uUmVxdWVzdCgpKQpjb2xvcj1jb2xvci5ibGVuZFdpdGgoYmdDb2xvcnMuTmF2aWdhdGlvbik7aWYodGhpcy5ob3ZlcmVkKCkpCmNvbG9yPWNvbG9yLmJsZW5kV2l0aChiZ0NvbG9ycy5Ib3ZlcmVkKTtpZih0aGlzLmlzT25Jbml0aWF0b3JQYXRoKCkpCmNvbG9yPWNvbG9yLmJsZW5kV2l0aChiZ0NvbG9ycy5Jbml0aWF0b3JQYXRoKTtpZih0aGlzLmlzT25Jbml0aWF0ZWRQYXRoKCkpCmNvbG9yPWNvbG9yLmJsZW5kV2l0aChiZ0NvbG9ycy5Jbml0aWF0ZWRQYXRoKTtyZXR1cm4oY29sb3IuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5IRVgpKTt9Cl91cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKXtjb25zdCBlbGVtZW50PXRoaXMuZXhpc3RpbmdFbGVtZW50KCk7aWYoIWVsZW1lbnQpCnJldHVybjtlbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmJhY2tncm91bmRDb2xvcigpO3RoaXMuX3BhcmVudFZpZXcuc3R5bGVzQ2hhbmdlZCgpO30Kc2V0U3RyaXBlZChpc1N0cmlwZWQpe3N1cGVyLnNldFN0cmlwZWQoaXNTdHJpcGVkKTt0aGlzLl91cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKTt9CnBhcmVudFZpZXcoKXtyZXR1cm4gdGhpcy5fcGFyZW50Vmlldzt9CmhvdmVyZWQoKXtyZXR1cm4gdGhpcy5faXNIb3ZlcmVkO30Kc2hvd2luZ0luaXRpYXRvckNoYWluKCl7cmV0dXJuIHRoaXMuX3Nob3dpbmdJbml0aWF0b3JDaGFpbjt9Cm5vZGVTZWxmSGVpZ2h0KCl7cmV0dXJuIHRoaXMuX3BhcmVudFZpZXcucm93SGVpZ2h0KCk7fQpzZXRIb3ZlcmVkKGhvdmVyZWQsc2hvd0luaXRpYXRvckNoYWluKXtpZih0aGlzLl9pc0hvdmVyZWQ9PT1ob3ZlcmVkJiZ0aGlzLl9zaG93aW5nSW5pdGlhdG9yQ2hhaW49PT1zaG93SW5pdGlhdG9yQ2hhaW4pCnJldHVybjtpZih0aGlzLl9pc0hvdmVyZWQhPT1ob3ZlcmVkKXt0aGlzLl9pc0hvdmVyZWQ9aG92ZXJlZDtpZih0aGlzLmF0dGFjaGVkKCkpCnRoaXMuZWxlbWVudCgpLmNsYXNzTGlzdC50b2dnbGUoJ2hvdmVyJyxob3ZlcmVkKTt9CmlmKHRoaXMuX3Nob3dpbmdJbml0aWF0b3JDaGFpbiE9PXNob3dJbml0aWF0b3JDaGFpbil7dGhpcy5fc2hvd2luZ0luaXRpYXRvckNoYWluPXNob3dJbml0aWF0b3JDaGFpbjt0aGlzLnNob3dpbmdJbml0aWF0b3JDaGFpbkNoYW5nZWQoKTt9CnRoaXMuX3BhcmVudFZpZXcuc3R5bGVzQ2hhbmdlZCgpO3RoaXMuX3VwZGF0ZUJhY2tncm91bmRDb2xvcigpO30Kc2hvd2luZ0luaXRpYXRvckNoYWluQ2hhbmdlZCgpe30KaXNPbkluaXRpYXRvclBhdGgoKXtyZXR1cm4gZmFsc2U7fQppc09uSW5pdGlhdGVkUGF0aCgpe3JldHVybiBmYWxzZTt9CnJlcXVlc3QoKXtyZXR1cm4gbnVsbDt9CmlzTmF2aWdhdGlvblJlcXVlc3QoKXtyZXR1cm4gZmFsc2U7fQpjbGVhckZsYXROb2Rlcygpe3N1cGVyLmNsZWFyRmxhdE5vZGVzKCk7dGhpcy5fcmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdD1udWxsO30KcmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdCgpe2lmKHRoaXMuX3JlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QpCnJldHVybiB0aGlzLl9yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0O2xldCByZXF1ZXN0PXRoaXMucmVxdWVzdCgpO2lmKHJlcXVlc3R8fCF0aGlzLmhhc0NoaWxkcmVuKCkpe3RoaXMuX3JlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3Q9cmVxdWVzdDtyZXR1cm4gdGhpcy5fcmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdDt9CmxldCBmaXJzdENoaWxkUmVxdWVzdD1udWxsO2NvbnN0IGZsYXRDaGlsZHJlbj10aGlzLmZsYXRDaGlsZHJlbigpO2ZvcihsZXQgaT0wO2k8ZmxhdENoaWxkcmVuLmxlbmd0aDtpKyspe3JlcXVlc3Q9ZmxhdENoaWxkcmVuW2ldLnJlcXVlc3QoKTtpZighZmlyc3RDaGlsZFJlcXVlc3R8fChyZXF1ZXN0JiZyZXF1ZXN0Lmlzc3VlVGltZSgpPGZpcnN0Q2hpbGRSZXF1ZXN0Lmlzc3VlVGltZSgpKSkKZmlyc3RDaGlsZFJlcXVlc3Q9cmVxdWVzdDt9CnRoaXMuX3JlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3Q9Zmlyc3RDaGlsZFJlcXVlc3Q7cmV0dXJuIHRoaXMuX3JlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3Q7fX07TmV0d29yay5OZXR3b3JrTm9kZS5fYmFja2dyb3VuZENvbG9ycz17RGVmYXVsdDpbMjU1LDI1NSwyNTUsMS4wXSxTdHJpcGU6WzI0NSwyNDUsMjQ1LDEuMF0sTmF2aWdhdGlvbjpbMjIxLDIzOCwyNTUsMS4wXSxIb3ZlcmVkOlsyMzUsMjQyLDI1MiwwLjddLEluaXRpYXRvclBhdGg6WzU4LDIxNyw1OCwwLjRdLEluaXRpYXRlZFBhdGg6WzIxNyw1OCw1OCwwLjRdLFNlbGVjdGVkOls2Myw4MSwxODEsLjZdLEZyb21GcmFtZTpbMjI0LDI0NywyNTAsLjRdLElzUHJvZHVjdDpbMjU1LDI1MiwyMjUsLjZdLH07TmV0d29yay5OZXR3b3JrTm9kZS5fU3VwcG9ydGVkQmFja2dyb3VuZENvbG9ycztOZXR3b3JrLk5ldHdvcmtOb2RlLl90aGVtZWRCYWNrZ3JvdW5kQ29sb3JzQ2FjaGU7TmV0d29yay5OZXR3b3JrTm9kZS5fUHJvZHVjdEVudHJ5SW5mbztOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZT1jbGFzcyBleHRlbmRzIE5ldHdvcmsuTmV0d29ya05vZGV7Y29uc3RydWN0b3IocGFyZW50VmlldyxyZXF1ZXN0KXtzdXBlcihwYXJlbnRWaWV3KTt0aGlzLl9uYW1lQ2VsbD1udWxsO3RoaXMuX25hbWVCYWRnZUVsZW1lbnQ9bnVsbDt0aGlzLl9pbml0aWF0b3JDZWxsPW51bGw7dGhpcy5fcmVxdWVzdD1yZXF1ZXN0O3RoaXMuX2lzTmF2aWdhdGlvblJlcXVlc3Q9ZmFsc2U7dGhpcy5zZWxlY3RhYmxlPXRydWU7dGhpcy5faXNPbkluaXRpYXRvclBhdGg9ZmFsc2U7dGhpcy5faXNPbkluaXRpYXRlZFBhdGg9ZmFsc2U7fQpzdGF0aWMgTmFtZUNvbXBhcmF0b3IoYSxiKXtjb25zdCBhTmFtZT1hLmRpc3BsYXlOYW1lKCkudG9Mb3dlckNhc2UoKTtjb25zdCBiTmFtZT1iLmRpc3BsYXlOYW1lKCkudG9Mb3dlckNhc2UoKTtpZihhTmFtZT09PWJOYW1lKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZihhUmVxdWVzdCYmYlJlcXVlc3QpCnJldHVybiBhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTtyZXR1cm4gYVJlcXVlc3Q/LTE6MTt9CnJldHVybiBhTmFtZTxiTmFtZT8tMToxO30Kc3RhdGljIFJlbW90ZUFkZHJlc3NDb21wYXJhdG9yKGEsYil7Y29uc3QgYVJlcXVlc3Q9YS5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7Y29uc3QgYlJlcXVlc3Q9Yi5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7aWYoIWFSZXF1ZXN0fHwhYlJlcXVlc3QpCnJldHVybiFhUmVxdWVzdD8tMToxO2NvbnN0IGFSZW1vdGVBZGRyZXNzPWFSZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKTtjb25zdCBiUmVtb3RlQWRkcmVzcz1iUmVxdWVzdC5yZW1vdGVBZGRyZXNzKCk7aWYoYVJlbW90ZUFkZHJlc3M+YlJlbW90ZUFkZHJlc3MpCnJldHVybiAxO2lmKGJSZW1vdGVBZGRyZXNzPmFSZW1vdGVBZGRyZXNzKQpyZXR1cm4tMTtyZXR1cm4gYVJlcXVlc3QuaW5kZW50aXR5Q29tcGFyZShiUmVxdWVzdCk7fQpzdGF0aWMgUHJvZHVjdENvbXBhcmF0b3IocHJvZHVjdFJlZ2lzdHJ5LGEsYil7Y29uc3QgYVJlcXVlc3Q9YS5yZXF1ZXN0KCk7Y29uc3QgYlJlcXVlc3Q9Yi5yZXF1ZXN0KCk7aWYoIWFSZXF1ZXN0fHwhYlJlcXVlc3QpCnJldHVybiFhUmVxdWVzdD8tMToxO2NvbnN0IGFOYW1lPXByb2R1Y3RSZWdpc3RyeS5uYW1lRm9yVXJsKGFSZXF1ZXN0LnBhcnNlZFVSTCl8fCcnO2NvbnN0IGJOYW1lPXByb2R1Y3RSZWdpc3RyeS5uYW1lRm9yVXJsKGJSZXF1ZXN0LnBhcnNlZFVSTCl8fCcnO3JldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lKXx8YVJlcXVlc3QuaW5kZW50aXR5Q29tcGFyZShiUmVxdWVzdCk7fQpzdGF0aWMgU2l6ZUNvbXBhcmF0b3IoYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7aWYoYlJlcXVlc3QuY2FjaGVkKCkmJiFhUmVxdWVzdC5jYWNoZWQoKSkKcmV0dXJuIDE7aWYoYVJlcXVlc3QuY2FjaGVkKCkmJiFiUmVxdWVzdC5jYWNoZWQoKSkKcmV0dXJuLTE7cmV0dXJuKGFSZXF1ZXN0LnRyYW5zZmVyU2l6ZS1iUmVxdWVzdC50cmFuc2ZlclNpemUpfHxhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTt9CnN0YXRpYyBUeXBlQ29tcGFyYXRvcihhLGIpe2NvbnN0IGFSZXF1ZXN0PWEucmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdCgpO2NvbnN0IGJSZXF1ZXN0PWIucmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdCgpO2lmKCFhUmVxdWVzdHx8IWJSZXF1ZXN0KQpyZXR1cm4hYVJlcXVlc3Q/LTE6MTtjb25zdCBhU2ltcGxlVHlwZT1hLmRpc3BsYXlUeXBlKCk7Y29uc3QgYlNpbXBsZVR5cGU9Yi5kaXNwbGF5VHlwZSgpO2lmKGFTaW1wbGVUeXBlPmJTaW1wbGVUeXBlKQpyZXR1cm4gMTtpZihiU2ltcGxlVHlwZT5hU2ltcGxlVHlwZSkKcmV0dXJuLTE7cmV0dXJuIGFSZXF1ZXN0LmluZGVudGl0eUNvbXBhcmUoYlJlcXVlc3QpO30Kc3RhdGljIEluaXRpYXRvckNvbXBhcmF0b3IoYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7aWYoIWEuX2luaXRpYXRvckNlbGx8fCFiLl9pbml0aWF0b3JDZWxsKQpyZXR1cm4hYS5faW5pdGlhdG9yQ2VsbD8tMToxO2NvbnN0IGFUZXh0PWEuX2xpbmtpZmllZEluaXRpYXRvckFuY2hvcj9hLl9saW5raWZpZWRJbml0aWF0b3JBbmNob3IudGV4dENvbnRlbnQ6YS5faW5pdGlhdG9yQ2VsbC50aXRsZTtjb25zdCBiVGV4dD1iLl9saW5raWZpZWRJbml0aWF0b3JBbmNob3I/Yi5fbGlua2lmaWVkSW5pdGlhdG9yQW5jaG9yLnRleHRDb250ZW50OmIuX2luaXRpYXRvckNlbGwudGl0bGU7cmV0dXJuIGFUZXh0LmxvY2FsZUNvbXBhcmUoYlRleHQpO30Kc3RhdGljIFJlcXVlc3RDb29raWVzQ291bnRDb21wYXJhdG9yKGEsYil7Y29uc3QgYVJlcXVlc3Q9YS5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7Y29uc3QgYlJlcXVlc3Q9Yi5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7aWYoIWFSZXF1ZXN0fHwhYlJlcXVlc3QpCnJldHVybiFhUmVxdWVzdD8tMToxO2NvbnN0IGFTY29yZT1hUmVxdWVzdC5yZXF1ZXN0Q29va2llcz9hUmVxdWVzdC5yZXF1ZXN0Q29va2llcy5sZW5ndGg6MDtjb25zdCBiU2NvcmU9YlJlcXVlc3QucmVxdWVzdENvb2tpZXM/YlJlcXVlc3QucmVxdWVzdENvb2tpZXMubGVuZ3RoOjA7cmV0dXJuKGFTY29yZS1iU2NvcmUpfHxhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTt9CnN0YXRpYyBSZXNwb25zZUNvb2tpZXNDb3VudENvbXBhcmF0b3IoYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7Y29uc3QgYVNjb3JlPWFSZXF1ZXN0LnJlc3BvbnNlQ29va2llcz9hUmVxdWVzdC5yZXNwb25zZUNvb2tpZXMubGVuZ3RoOjA7Y29uc3QgYlNjb3JlPWJSZXF1ZXN0LnJlc3BvbnNlQ29va2llcz9iUmVxdWVzdC5yZXNwb25zZUNvb2tpZXMubGVuZ3RoOjA7cmV0dXJuKGFTY29yZS1iU2NvcmUpfHxhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTt9CnN0YXRpYyBQcmlvcml0eUNvbXBhcmF0b3IoYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7Y29uc3QgYVByaW9yaXR5PWFSZXF1ZXN0LnByaW9yaXR5KCk7bGV0IGFTY29yZT1hUHJpb3JpdHk/UGVyZlVJLm5ldHdvcmtQcmlvcml0eVdlaWdodChhUHJpb3JpdHkpOjA7YVNjb3JlPWFTY29yZXx8MDtjb25zdCBiUHJpb3JpdHk9YlJlcXVlc3QucHJpb3JpdHkoKTtsZXQgYlNjb3JlPWJQcmlvcml0eT9QZXJmVUkubmV0d29ya1ByaW9yaXR5V2VpZ2h0KGJQcmlvcml0eSk6MDtiU2NvcmU9YlNjb3JlfHwwO3JldHVybiBhU2NvcmUtYlNjb3JlfHxhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTt9CnN0YXRpYyBSZXF1ZXN0UHJvcGVydHlDb21wYXJhdG9yKHByb3BlcnR5TmFtZSxhLGIpe2NvbnN0IGFSZXF1ZXN0PWEucmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdCgpO2NvbnN0IGJSZXF1ZXN0PWIucmVxdWVzdE9yRmlyc3RLbm93bkNoaWxkUmVxdWVzdCgpO2lmKCFhUmVxdWVzdHx8IWJSZXF1ZXN0KQpyZXR1cm4hYVJlcXVlc3Q/LTE6MTtjb25zdCBhVmFsdWU9YVJlcXVlc3RbcHJvcGVydHlOYW1lXTtjb25zdCBiVmFsdWU9YlJlcXVlc3RbcHJvcGVydHlOYW1lXTtpZihhVmFsdWU9PT1iVmFsdWUpCnJldHVybiBhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTtyZXR1cm4gYVZhbHVlPmJWYWx1ZT8xOi0xO30Kc3RhdGljIFJlc3BvbnNlSGVhZGVyU3RyaW5nQ29tcGFyYXRvcihwcm9wZXJ0eU5hbWUsYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7Y29uc3QgYVZhbHVlPVN0cmluZyhhUmVxdWVzdC5yZXNwb25zZUhlYWRlclZhbHVlKHByb3BlcnR5TmFtZSl8fCcnKTtjb25zdCBiVmFsdWU9U3RyaW5nKGJSZXF1ZXN0LnJlc3BvbnNlSGVhZGVyVmFsdWUocHJvcGVydHlOYW1lKXx8JycpO3JldHVybiBhVmFsdWUubG9jYWxlQ29tcGFyZShiVmFsdWUpfHxhUmVxdWVzdC5pbmRlbnRpdHlDb21wYXJlKGJSZXF1ZXN0KTt9CnN0YXRpYyBSZXNwb25zZUhlYWRlck51bWJlckNvbXBhcmF0b3IocHJvcGVydHlOYW1lLGEsYil7Y29uc3QgYVJlcXVlc3Q9YS5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7Y29uc3QgYlJlcXVlc3Q9Yi5yZXF1ZXN0T3JGaXJzdEtub3duQ2hpbGRSZXF1ZXN0KCk7aWYoIWFSZXF1ZXN0fHwhYlJlcXVlc3QpCnJldHVybiFhUmVxdWVzdD8tMToxO2NvbnN0IGFWYWx1ZT0oYVJlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZShwcm9wZXJ0eU5hbWUpIT09dW5kZWZpbmVkKT9wYXJzZUZsb2F0KGFSZXF1ZXN0LnJlc3BvbnNlSGVhZGVyVmFsdWUocHJvcGVydHlOYW1lKSk6LUluZmluaXR5O2NvbnN0IGJWYWx1ZT0oYlJlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZShwcm9wZXJ0eU5hbWUpIT09dW5kZWZpbmVkKT9wYXJzZUZsb2F0KGJSZXF1ZXN0LnJlc3BvbnNlSGVhZGVyVmFsdWUocHJvcGVydHlOYW1lKSk6LUluZmluaXR5O2lmKGFWYWx1ZT09PWJWYWx1ZSkKcmV0dXJuIGFSZXF1ZXN0LmluZGVudGl0eUNvbXBhcmUoYlJlcXVlc3QpO3JldHVybiBhVmFsdWU+YlZhbHVlPzE6LTE7fQpzdGF0aWMgUmVzcG9uc2VIZWFkZXJEYXRlQ29tcGFyYXRvcihwcm9wZXJ0eU5hbWUsYSxiKXtjb25zdCBhUmVxdWVzdD1hLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtjb25zdCBiUmVxdWVzdD1iLnJlcXVlc3RPckZpcnN0S25vd25DaGlsZFJlcXVlc3QoKTtpZighYVJlcXVlc3R8fCFiUmVxdWVzdCkKcmV0dXJuIWFSZXF1ZXN0Py0xOjE7Y29uc3QgYUhlYWRlcj1hUmVxdWVzdC5yZXNwb25zZUhlYWRlclZhbHVlKHByb3BlcnR5TmFtZSk7Y29uc3QgYkhlYWRlcj1iUmVxdWVzdC5yZXNwb25zZUhlYWRlclZhbHVlKHByb3BlcnR5TmFtZSk7Y29uc3QgYVZhbHVlPWFIZWFkZXI/bmV3IERhdGUoYUhlYWRlcikuZ2V0VGltZSgpOi1JbmZpbml0eTtjb25zdCBiVmFsdWU9YkhlYWRlcj9uZXcgRGF0ZShiSGVhZGVyKS5nZXRUaW1lKCk6LUluZmluaXR5O2lmKGFWYWx1ZT09PWJWYWx1ZSkKcmV0dXJuIGFSZXF1ZXN0LmluZGVudGl0eUNvbXBhcmUoYlJlcXVlc3QpO3JldHVybiBhVmFsdWU+YlZhbHVlPzE6LTE7fQpzaG93aW5nSW5pdGlhdG9yQ2hhaW5DaGFuZ2VkKCl7Y29uc3Qgc2hvd0luaXRpYXRvckNoYWluPXRoaXMuc2hvd2luZ0luaXRpYXRvckNoYWluKCk7Y29uc3QgaW5pdGlhdG9yR3JhcGg9QnJvd3NlclNESy5uZXR3b3JrTG9nLmluaXRpYXRvckdyYXBoRm9yUmVxdWVzdCh0aGlzLl9yZXF1ZXN0KTtmb3IoY29uc3QgcmVxdWVzdCBvZiBpbml0aWF0b3JHcmFwaC5pbml0aWF0b3JzKXtpZihyZXF1ZXN0PT09dGhpcy5fcmVxdWVzdCkKY29udGludWU7Y29uc3Qgbm9kZT10aGlzLnBhcmVudFZpZXcoKS5ub2RlRm9yUmVxdWVzdChyZXF1ZXN0KTtpZighbm9kZSkKY29udGludWU7bm9kZS5fc2V0SXNPbkluaXRpYXRvclBhdGgoc2hvd0luaXRpYXRvckNoYWluKTt9CmZvcihjb25zdCByZXF1ZXN0IG9mIGluaXRpYXRvckdyYXBoLmluaXRpYXRlZCl7aWYocmVxdWVzdD09PXRoaXMuX3JlcXVlc3QpCmNvbnRpbnVlO2NvbnN0IG5vZGU9dGhpcy5wYXJlbnRWaWV3KCkubm9kZUZvclJlcXVlc3QocmVxdWVzdCk7aWYoIW5vZGUpCmNvbnRpbnVlO25vZGUuX3NldElzT25Jbml0aWF0ZWRQYXRoKHNob3dJbml0aWF0b3JDaGFpbik7fX0KX3NldElzT25Jbml0aWF0b3JQYXRoKGlzT25Jbml0aWF0b3JQYXRoKXtpZih0aGlzLl9pc09uSW5pdGlhdG9yUGF0aD09PWlzT25Jbml0aWF0b3JQYXRofHwhdGhpcy5hdHRhY2hlZCgpKQpyZXR1cm47dGhpcy5faXNPbkluaXRpYXRvclBhdGg9aXNPbkluaXRpYXRvclBhdGg7dGhpcy5fdXBkYXRlQmFja2dyb3VuZENvbG9yKCk7fQppc09uSW5pdGlhdG9yUGF0aCgpe3JldHVybiB0aGlzLl9pc09uSW5pdGlhdG9yUGF0aDt9Cl9zZXRJc09uSW5pdGlhdGVkUGF0aChpc09uSW5pdGlhdGVkUGF0aCl7aWYodGhpcy5faXNPbkluaXRpYXRlZFBhdGg9PT1pc09uSW5pdGlhdGVkUGF0aHx8IXRoaXMuYXR0YWNoZWQoKSkKcmV0dXJuO3RoaXMuX2lzT25Jbml0aWF0ZWRQYXRoPWlzT25Jbml0aWF0ZWRQYXRoO3RoaXMuX3VwZGF0ZUJhY2tncm91bmRDb2xvcigpO30KaXNPbkluaXRpYXRlZFBhdGgoKXtyZXR1cm4gdGhpcy5faXNPbkluaXRpYXRlZFBhdGg7fQpkaXNwbGF5VHlwZSgpe2NvbnN0IG1pbWVUeXBlPXRoaXMuX3JlcXVlc3QubWltZVR5cGV8fHRoaXMuX3JlcXVlc3QucmVxdWVzdENvbnRlbnRUeXBlKCl8fCcnO2NvbnN0IHJlc291cmNlVHlwZT10aGlzLl9yZXF1ZXN0LnJlc291cmNlVHlwZSgpO2xldCBzaW1wbGVUeXBlPXJlc291cmNlVHlwZS5uYW1lKCk7aWYocmVzb3VyY2VUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXJ8fHJlc291cmNlVHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlKQpzaW1wbGVUeXBlPW1pbWVUeXBlLnJlcGxhY2UoL14oYXBwbGljYXRpb258aW1hZ2UpXC8vLCcnKTtyZXR1cm4gc2ltcGxlVHlwZTt9CmRpc3BsYXlOYW1lKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3QubmFtZSgpO30KcmVxdWVzdCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0O30KaXNOYXZpZ2F0aW9uUmVxdWVzdCgpe2NvbnN0IHBhZ2VMb2FkPUJyb3dzZXJTREsuUGFnZUxvYWQuZm9yUmVxdWVzdCh0aGlzLl9yZXF1ZXN0KTtyZXR1cm4gcGFnZUxvYWQ/cGFnZUxvYWQubWFpblJlcXVlc3Q9PT10aGlzLl9yZXF1ZXN0OmZhbHNlO30Kbm9kZVNlbGZIZWlnaHQoKXtyZXR1cm4gdGhpcy5wYXJlbnRWaWV3KCkucm93SGVpZ2h0KCk7fQpjcmVhdGVDZWxscyhlbGVtZW50KXt0aGlzLl9uYW1lQ2VsbD1udWxsO3RoaXMuX2luaXRpYXRvckNlbGw9bnVsbDtlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ25ldHdvcmstZXJyb3Itcm93Jyx0aGlzLl9pc0ZhaWxlZCgpKTtlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ25ldHdvcmstbmF2aWdhdGlvbi1yb3cnLHRoaXMuX2lzTmF2aWdhdGlvblJlcXVlc3QpO3N1cGVyLmNyZWF0ZUNlbGxzKGVsZW1lbnQpO3RoaXMuX3VwZGF0ZUJhY2tncm91bmRDb2xvcigpO1Byb2R1Y3RSZWdpc3RyeS5pbnN0YW5jZSgpLnRoZW4ocHJvZHVjdFJlZ2lzdHJ5PT57aWYocHJvZHVjdFJlZ2lzdHJ5LmVudHJ5Rm9yVXJsKHRoaXMuX3JlcXVlc3QucGFyc2VkVVJMKSl7dGhpcy5faXNQcm9kdWN0PXRydWU7dGhpcy5fdXBkYXRlQmFja2dyb3VuZENvbG9yKCk7fX0pO30KX3NldFRleHRBbmRUaXRsZShlbGVtZW50LHRleHQpe2VsZW1lbnQuY3JlYXRlVGV4dENoaWxkKHRleHQpO2VsZW1lbnQudGl0bGU9dGV4dDt9CnJlbmRlckNlbGwoY2VsbCxjb2x1bW5JZCl7c3dpdGNoKGNvbHVtbklkKXtjYXNlJ25hbWUnOnRoaXMuX3JlbmRlck5hbWVDZWxsKGNlbGwpO2JyZWFrO2Nhc2UnbWV0aG9kJzp0aGlzLl9zZXRUZXh0QW5kVGl0bGUoY2VsbCx0aGlzLl9yZXF1ZXN0LnJlcXVlc3RNZXRob2QpO2JyZWFrO2Nhc2Unc3RhdHVzJzp0aGlzLl9yZW5kZXJTdGF0dXNDZWxsKGNlbGwpO2JyZWFrO2Nhc2UncHJvdG9jb2wnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX3JlcXVlc3QucHJvdG9jb2wpO2JyZWFrO2Nhc2Unc2NoZW1lJzp0aGlzLl9zZXRUZXh0QW5kVGl0bGUoY2VsbCx0aGlzLl9yZXF1ZXN0LnNjaGVtZSk7YnJlYWs7Y2FzZSdkb21haW4nOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX3JlcXVlc3QuZG9tYWluKTticmVhaztjYXNlJ3JlbW90ZWFkZHJlc3MnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX3JlcXVlc3QucmVtb3RlQWRkcmVzcygpKTticmVhaztjYXNlJ2Nvb2tpZXMnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX2FycmF5TGVuZ3RoKHRoaXMuX3JlcXVlc3QucmVxdWVzdENvb2tpZXMpKTticmVhaztjYXNlJ3NldGNvb2tpZXMnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX2FycmF5TGVuZ3RoKHRoaXMuX3JlcXVlc3QucmVzcG9uc2VDb29raWVzKSk7YnJlYWs7Y2FzZSdwcmlvcml0eSc6Y29uc3QgcHJpb3JpdHk9dGhpcy5fcmVxdWVzdC5wcmlvcml0eSgpO3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHByaW9yaXR5P1BlcmZVSS51aUxhYmVsRm9yTmV0d29ya1ByaW9yaXR5KHByaW9yaXR5KTonJyk7YnJlYWs7Y2FzZSdjb25uZWN0aW9uaWQnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX3JlcXVlc3QuY29ubmVjdGlvbklkKTticmVhaztjYXNlJ3R5cGUnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuZGlzcGxheVR5cGUoKSk7YnJlYWs7Y2FzZSdpbml0aWF0b3InOnRoaXMuX3JlbmRlckluaXRpYXRvckNlbGwoY2VsbCk7YnJlYWs7Y2FzZSdzaXplJzp0aGlzLl9yZW5kZXJTaXplQ2VsbChjZWxsKTticmVhaztjYXNlJ3RpbWUnOnRoaXMuX3JlbmRlclRpbWVDZWxsKGNlbGwpO2JyZWFrO2Nhc2UndGltZWxpbmUnOnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLCcnKTticmVhaztkZWZhdWx0OnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRoaXMuX3JlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZShjb2x1bW5JZCl8fCcnKTticmVhazt9fQpfYXJyYXlMZW5ndGgoYXJyYXkpe3JldHVybiBhcnJheT8nJythcnJheS5sZW5ndGg6Jyc7fQpzZWxlY3Qoc3VwcmVzc1NlbGVjdGVkRXZlbnQpe3N1cGVyLnNlbGVjdChzdXByZXNzU2VsZWN0ZWRFdmVudCk7dGhpcy5wYXJlbnRWaWV3KCkuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRXZlbnRzLlJlcXVlc3RTZWxlY3RlZCx0aGlzLl9yZXF1ZXN0KTt9CmhpZ2hsaWdodE1hdGNoZWRTdWJzdHJpbmcocmVnZXhwKXtpZighcmVnZXhwKQpyZXR1cm5bXTt0aGlzLmVsZW1lbnQoKTtjb25zdCBkb21DaGFuZ2VzPVtdO2NvbnN0IG1hdGNoSW5mbz10aGlzLl9uYW1lQ2VsbC50ZXh0Q29udGVudC5tYXRjaChyZWdleHApO2lmKG1hdGNoSW5mbykKVUkuaGlnaGxpZ2h0U2VhcmNoUmVzdWx0KHRoaXMuX25hbWVDZWxsLG1hdGNoSW5mby5pbmRleCxtYXRjaEluZm9bMF0ubGVuZ3RoLGRvbUNoYW5nZXMpO3JldHVybiBkb21DaGFuZ2VzO30KX29wZW5Jbk5ld1RhYigpe0luc3BlY3RvckZyb250ZW5kSG9zdC5vcGVuSW5OZXdUYWIodGhpcy5fcmVxdWVzdC51cmwoKSk7fQpfaXNGYWlsZWQoKXtyZXR1cm4odGhpcy5fcmVxdWVzdC5mYWlsZWQmJiF0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGUpfHwodGhpcy5fcmVxdWVzdC5zdGF0dXNDb2RlPj00MDApO30KX3JlbmRlck5hbWVDZWxsKGNlbGwpe2NvbnN0IGxlZnRQYWRkaW5nPXRoaXMubGVmdFBhZGRpbmc/dGhpcy5sZWZ0UGFkZGluZysncHgnOicnO2NlbGwuc3R5bGUuc2V0UHJvcGVydHkoJ3BhZGRpbmctbGVmdCcsbGVmdFBhZGRpbmcpO3RoaXMuX25hbWVDZWxsPWNlbGw7Y2VsbC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsdGhpcy5fb3BlbkluTmV3VGFiLmJpbmQodGhpcyksZmFsc2UpO2xldCBpY29uRWxlbWVudDtpZih0aGlzLl9yZXF1ZXN0LnJlc291cmNlVHlwZSgpPT09Q29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2Upe2NvbnN0IHByZXZpZXdJbWFnZT1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdpbWcnLCdpbWFnZS1uZXR3b3JrLWljb24tcHJldmlldycpO3RoaXMuX3JlcXVlc3QucG9wdWxhdGVJbWFnZVNvdXJjZShwcmV2aWV3SW1hZ2UpO2ljb25FbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2ljb24nKTtpY29uRWxlbWVudC5hcHBlbmRDaGlsZChwcmV2aWV3SW1hZ2UpO31lbHNle2ljb25FbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2ltZycsJ2ljb24nKTt9Cmljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fcmVxdWVzdC5yZXNvdXJjZVR5cGUoKS5uYW1lKCkpO2NlbGwuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO2lmKCF0aGlzLl9uYW1lQmFkZ2VFbGVtZW50KXt0aGlzLl9uYW1lQmFkZ2VFbGVtZW50PXRoaXMucGFyZW50VmlldygpLmJhZGdlUG9vbC5iYWRnZUZvclVSTCh0aGlzLl9yZXF1ZXN0LnBhcnNlZFVSTCk7dGhpcy5fbmFtZUJhZGdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWJhZGdlJyk7fQpjZWxsLmFwcGVuZENoaWxkKHRoaXMuX25hbWVCYWRnZUVsZW1lbnQpO2NvbnN0IG5hbWU9dGhpcy5fcmVxdWVzdC5uYW1lKCkudHJpbU1pZGRsZSgxMDApO2NvbnN0IG5ldHdvcmtNYW5hZ2VyPVNESy5OZXR3b3JrTWFuYWdlci5mb3JSZXF1ZXN0KHRoaXMuX3JlcXVlc3QpO2NlbGwuY3JlYXRlVGV4dENoaWxkKG5ldHdvcmtNYW5hZ2VyP25ldHdvcmtNYW5hZ2VyLnRhcmdldCgpLmRlY29yYXRlTGFiZWwobmFtZSk6bmFtZSk7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCx0aGlzLl9yZXF1ZXN0LnBhdGgoKSk7Y2VsbC50aXRsZT10aGlzLl9yZXF1ZXN0LnVybCgpO30KX3JlbmRlclN0YXR1c0NlbGwoY2VsbCl7Y2VsbC5jbGFzc0xpc3QudG9nZ2xlKCduZXR3b3JrLWRpbS1jZWxsJywhdGhpcy5faXNGYWlsZWQoKSYmKHRoaXMuX3JlcXVlc3QuY2FjaGVkKCl8fCF0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGUpKTtpZih0aGlzLl9yZXF1ZXN0LmZhaWxlZCYmIXRoaXMuX3JlcXVlc3QuY2FuY2VsZWQmJiF0aGlzLl9yZXF1ZXN0Lndhc0Jsb2NrZWQoKSl7Y29uc3QgZmFpbFRleHQ9Q29tbW9uLlVJU3RyaW5nKCcoZmFpbGVkKScpO2lmKHRoaXMuX3JlcXVlc3QubG9jYWxpemVkRmFpbERlc2NyaXB0aW9uKXtjZWxsLmNyZWF0ZVRleHRDaGlsZChmYWlsVGV4dCk7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCx0aGlzLl9yZXF1ZXN0LmxvY2FsaXplZEZhaWxEZXNjcmlwdGlvbik7Y2VsbC50aXRsZT1mYWlsVGV4dCsnICcrdGhpcy5fcmVxdWVzdC5sb2NhbGl6ZWRGYWlsRGVzY3JpcHRpb247fWVsc2V7dGhpcy5fc2V0VGV4dEFuZFRpdGxlKGNlbGwsZmFpbFRleHQpO319ZWxzZSBpZih0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGUpe2NlbGwuY3JlYXRlVGV4dENoaWxkKCcnK3RoaXMuX3JlcXVlc3Quc3RhdHVzQ29kZSk7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCx0aGlzLl9yZXF1ZXN0LnN0YXR1c1RleHQpO2NlbGwudGl0bGU9dGhpcy5fcmVxdWVzdC5zdGF0dXNDb2RlKycgJyt0aGlzLl9yZXF1ZXN0LnN0YXR1c1RleHQ7fWVsc2UgaWYodGhpcy5fcmVxdWVzdC5wYXJzZWRVUkwuaXNEYXRhVVJMKCkpe3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGRhdGEpJykpO31lbHNlIGlmKHRoaXMuX3JlcXVlc3QuY2FuY2VsZWQpe3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGNhbmNlbGVkKScpKTt9ZWxzZSBpZih0aGlzLl9yZXF1ZXN0Lndhc0Jsb2NrZWQoKSl7bGV0IHJlYXNvbj1Db21tb24uVUlTdHJpbmcoJ290aGVyJyk7c3dpdGNoKHRoaXMuX3JlcXVlc3QuYmxvY2tlZFJlYXNvbigpKXtjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5PdGhlcjpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdvdGhlcicpO2JyZWFrO2Nhc2UgUHJvdG9jb2wuTmV0d29yay5CbG9ja2VkUmVhc29uLkNzcDpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdjc3AnKTticmVhaztjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5NaXhlZENvbnRlbnQ6cmVhc29uPUNvbW1vbi5VSVN0cmluZygnbWl4ZWQtY29udGVudCcpO2JyZWFrO2Nhc2UgUHJvdG9jb2wuTmV0d29yay5CbG9ja2VkUmVhc29uLk9yaWdpbjpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdvcmlnaW4nKTticmVhaztjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5JbnNwZWN0b3I6cmVhc29uPUNvbW1vbi5VSVN0cmluZygnZGV2dG9vbHMnKTticmVhaztjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5TdWJyZXNvdXJjZUZpbHRlcjpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdzdWJyZXNvdXJjZS1maWx0ZXInKTticmVhaztjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5Db250ZW50VHlwZTpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdjb250ZW50LXR5cGUnKTticmVhaztjYXNlIFByb3RvY29sLk5ldHdvcmsuQmxvY2tlZFJlYXNvbi5Db2xsYXBzZWRCeUNsaWVudDpyZWFzb249Q29tbW9uLlVJU3RyaW5nKCdleHRlbnNpb24nKTticmVhazt9CnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGJsb2NrZWQ6JXMpJyxyZWFzb24pKTt9ZWxzZSBpZih0aGlzLl9yZXF1ZXN0LmZpbmlzaGVkKXt0aGlzLl9zZXRUZXh0QW5kVGl0bGUoY2VsbCxDb21tb24uVUlTdHJpbmcoJ0ZpbmlzaGVkJykpO31lbHNle3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKHBlbmRpbmcpJykpO319Cl9yZW5kZXJJbml0aWF0b3JDZWxsKGNlbGwpe3RoaXMuX2luaXRpYXRvckNlbGw9Y2VsbDtjb25zdCByZXF1ZXN0PXRoaXMuX3JlcXVlc3Q7Y29uc3QgaW5pdGlhdG9yPUJyb3dzZXJTREsubmV0d29ya0xvZy5pbml0aWF0b3JJbmZvRm9yUmVxdWVzdChyZXF1ZXN0KTtjb25zdCB0aW1pbmc9cmVxdWVzdC50aW1pbmc7aWYodGltaW5nJiZ0aW1pbmcucHVzaFN0YXJ0KQpjZWxsLmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKENvbW1vbi5VSVN0cmluZygnUHVzaCAvICcpKSk7c3dpdGNoKGluaXRpYXRvci50eXBlKXtjYXNlIFNESy5OZXR3b3JrUmVxdWVzdC5Jbml0aWF0b3JUeXBlLlBhcnNlcjpjZWxsLnRpdGxlPWluaXRpYXRvci51cmwrJzonKyhpbml0aWF0b3IubGluZU51bWJlcisxKTtjb25zdCB1aVNvdXJjZUNvZGU9V29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVGb3JVUkwoaW5pdGlhdG9yLnVybCk7Y2VsbC5hcHBlbmRDaGlsZChDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5VVJMKGluaXRpYXRvci51cmwse3RleHQ6dWlTb3VyY2VDb2RlP3VpU291cmNlQ29kZS5kaXNwbGF5TmFtZSgpOnVuZGVmaW5lZCxsaW5lTnVtYmVyOmluaXRpYXRvci5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjppbml0aWF0b3IuY29sdW1uTnVtYmVyfSkpO3RoaXMuX2FwcGVuZFN1YnRpdGxlKGNlbGwsQ29tbW9uLlVJU3RyaW5nKCdQYXJzZXInKSk7YnJlYWs7Y2FzZSBTREsuTmV0d29ya1JlcXVlc3QuSW5pdGlhdG9yVHlwZS5SZWRpcmVjdDpjZWxsLnRpdGxlPWluaXRpYXRvci51cmw7Y29uc3QgcmVkaXJlY3RTb3VyY2U9KHJlcXVlc3QucmVkaXJlY3RTb3VyY2UoKSk7Y29uc29sZS5hc3NlcnQocmVkaXJlY3RTb3VyY2UpO2lmKHRoaXMucGFyZW50VmlldygpLm5vZGVGb3JSZXF1ZXN0KHJlZGlyZWN0U291cmNlKSl7Y2VsbC5hcHBlbmRDaGlsZChDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5UmV2ZWFsYWJsZShyZWRpcmVjdFNvdXJjZSxCaW5kaW5ncy5kaXNwbGF5TmFtZUZvclVSTChyZWRpcmVjdFNvdXJjZS51cmwoKSkpKTt9ZWxzZXtjZWxsLmFwcGVuZENoaWxkKENvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwocmVkaXJlY3RTb3VyY2UudXJsKCkpKTt9CnRoaXMuX2FwcGVuZFN1YnRpdGxlKGNlbGwsQ29tbW9uLlVJU3RyaW5nKCdSZWRpcmVjdCcpKTticmVhaztjYXNlIFNESy5OZXR3b3JrUmVxdWVzdC5Jbml0aWF0b3JUeXBlLlNjcmlwdDpjb25zdCBuZXR3b3JrTWFuYWdlcj1TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChyZXF1ZXN0KTtpZihpbml0aWF0b3Iuc3RhY2spe3RoaXMuX2xpbmtpZmllZEluaXRpYXRvckFuY2hvcj10aGlzLnBhcmVudFZpZXcoKS5saW5raWZpZXIubGlua2lmeVN0YWNrVHJhY2VUb3BGcmFtZShuZXR3b3JrTWFuYWdlcj9uZXR3b3JrTWFuYWdlci50YXJnZXQoKTpudWxsLGluaXRpYXRvci5zdGFjayk7fWVsc2V7dGhpcy5fbGlua2lmaWVkSW5pdGlhdG9yQW5jaG9yPXRoaXMucGFyZW50VmlldygpLmxpbmtpZmllci5saW5raWZ5U2NyaXB0TG9jYXRpb24obmV0d29ya01hbmFnZXI/bmV0d29ya01hbmFnZXIudGFyZ2V0KCk6bnVsbCxpbml0aWF0b3Iuc2NyaXB0SWQsaW5pdGlhdG9yLnVybCxpbml0aWF0b3IubGluZU51bWJlcixpbml0aWF0b3IuY29sdW1uTnVtYmVyKTt9CnRoaXMuX2xpbmtpZmllZEluaXRpYXRvckFuY2hvci50aXRsZT0nJztjZWxsLmFwcGVuZENoaWxkKHRoaXMuX2xpbmtpZmllZEluaXRpYXRvckFuY2hvcik7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCxDb21tb24uVUlTdHJpbmcoJ1NjcmlwdCcpKTtjZWxsLmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstc2NyaXB0LWluaXRpYXRlZCcpO2NlbGwucmVxdWVzdD1yZXF1ZXN0O2JyZWFrO2Nhc2UgU0RLLk5ldHdvcmtSZXF1ZXN0LkluaXRpYXRvclR5cGUuUHJlbG9hZDpjZWxsLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnUHJlbG9hZCcpO2NlbGwuY2xhc3NMaXN0LmFkZCgnbmV0d29yay1kaW0tY2VsbCcpO2NlbGwuYXBwZW5kQ2hpbGQoY3JlYXRlVGV4dE5vZGUoQ29tbW9uLlVJU3RyaW5nKCdQcmVsb2FkJykpKTticmVhaztjYXNlIFNESy5OZXR3b3JrUmVxdWVzdC5Jbml0aWF0b3JUeXBlLlNpZ25lZEV4Y2hhbmdlOmNlbGwuYXBwZW5kQ2hpbGQoQ29tcG9uZW50cy5MaW5raWZpZXIubGlua2lmeVVSTChpbml0aWF0b3IudXJsKSk7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCxDb21tb24uVUlTdHJpbmcoJ3NpZ25lZC1leGNoYW5nZScpKTticmVhaztkZWZhdWx0OmNlbGwudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdPdGhlcicpO2NlbGwuY2xhc3NMaXN0LmFkZCgnbmV0d29yay1kaW0tY2VsbCcpO2NlbGwuYXBwZW5kQ2hpbGQoY3JlYXRlVGV4dE5vZGUoQ29tbW9uLlVJU3RyaW5nKCdPdGhlcicpKSk7fX0KX3JlbmRlclNpemVDZWxsKGNlbGwpe2lmKHRoaXMuX3JlcXVlc3QuZmV0Y2hlZFZpYVNlcnZpY2VXb3JrZXIpe3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGZyb20gU2VydmljZVdvcmtlciknKSk7Y2VsbC5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWRpbS1jZWxsJyk7fWVsc2UgaWYodGhpcy5fcmVxdWVzdC5yZWRpcmVjdFNvdXJjZSgpJiZ0aGlzLl9yZXF1ZXN0LnJlZGlyZWN0U291cmNlKCkuc2lnbmVkRXhjaGFuZ2VJbmZvKCkpe3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGZyb20gc2lnbmVkLWV4Y2hhbmdlKScpKTtjZWxsLmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstZGltLWNlbGwnKTt9ZWxzZSBpZih0aGlzLl9yZXF1ZXN0LmNhY2hlZCgpKXtpZih0aGlzLl9yZXF1ZXN0LmNhY2hlZEluTWVtb3J5KCkpCnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGZyb20gbWVtb3J5IGNhY2hlKScpKTtlbHNlCnRoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLENvbW1vbi5VSVN0cmluZygnKGZyb20gZGlzayBjYWNoZSknKSk7Y2VsbC5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWRpbS1jZWxsJyk7fWVsc2V7Y29uc3QgcmVzb3VyY2VTaXplPU51bWJlci5ieXRlc1RvU3RyaW5nKHRoaXMuX3JlcXVlc3QucmVzb3VyY2VTaXplKTtjb25zdCB0cmFuc2ZlclNpemU9TnVtYmVyLmJ5dGVzVG9TdHJpbmcodGhpcy5fcmVxdWVzdC50cmFuc2ZlclNpemUpO3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLHRyYW5zZmVyU2l6ZSk7dGhpcy5fYXBwZW5kU3VidGl0bGUoY2VsbCxyZXNvdXJjZVNpemUpO319Cl9yZW5kZXJUaW1lQ2VsbChjZWxsKXtpZih0aGlzLl9yZXF1ZXN0LmR1cmF0aW9uPjApe3RoaXMuX3NldFRleHRBbmRUaXRsZShjZWxsLE51bWJlci5zZWNvbmRzVG9TdHJpbmcodGhpcy5fcmVxdWVzdC5kdXJhdGlvbikpO3RoaXMuX2FwcGVuZFN1YnRpdGxlKGNlbGwsTnVtYmVyLnNlY29uZHNUb1N0cmluZyh0aGlzLl9yZXF1ZXN0LmxhdGVuY3kpKTt9ZWxzZXtjZWxsLmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstZGltLWNlbGwnKTt0aGlzLl9zZXRUZXh0QW5kVGl0bGUoY2VsbCxDb21tb24uVUlTdHJpbmcoJ1BlbmRpbmcnKSk7fX0KX2FwcGVuZFN1YnRpdGxlKGNlbGxFbGVtZW50LHN1YnRpdGxlVGV4dCl7Y29uc3Qgc3VidGl0bGVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3N1YnRpdGxlRWxlbWVudC5jbGFzc05hbWU9J25ldHdvcmstY2VsbC1zdWJ0aXRsZSc7c3VidGl0bGVFbGVtZW50LnRleHRDb250ZW50PXN1YnRpdGxlVGV4dDtjZWxsRWxlbWVudC5hcHBlbmRDaGlsZChzdWJ0aXRsZUVsZW1lbnQpO319O05ldHdvcmsuTmV0d29ya0dyb3VwTm9kZT1jbGFzcyBleHRlbmRzIE5ldHdvcmsuTmV0d29ya05vZGV7cmVuZGVyQ2VsbChjZWxsLGNvbHVtbklkKXtpZihjb2x1bW5JZD09PSduYW1lJyl7Y29uc3QgbGVmdFBhZGRpbmc9dGhpcy5sZWZ0UGFkZGluZz90aGlzLmxlZnRQYWRkaW5nKydweCc6Jyc7Y2VsbC5zdHlsZS5zZXRQcm9wZXJ0eSgncGFkZGluZy1sZWZ0JyxsZWZ0UGFkZGluZyk7Y2VsbC5jbGFzc0xpc3QuYWRkKCdkaXNjbG9zdXJlJyk7fX0Kc2VsZWN0KHN1cHJlc3NTZWxlY3RlZEV2ZW50KXtpZih0aGlzLmV4cGFuZGVkKXt0aGlzLmNvbGxhcHNlKCk7cmV0dXJuO30KdGhpcy5leHBhbmQoKTt9fTs7TmV0d29yay5OZXR3b3JrSXRlbVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5UYWJiZWRQYW5le2NvbnN0cnVjdG9yKHJlcXVlc3QsY2FsY3VsYXRvcil7c3VwZXIoKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbmV0d29yay1pdGVtLXZpZXcnKTt0aGlzLl9yZXNvdXJjZVZpZXdUYWJTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdyZXNvdXJjZVZpZXdUYWInLCdwcmV2aWV3Jyk7dGhpcy5faGVhZGVyc1ZpZXc9bmV3IE5ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3KHJlcXVlc3QpO3RoaXMuYXBwZW5kVGFiKE5ldHdvcmsuTmV0d29ya0l0ZW1WaWV3LlRhYnMuSGVhZGVycyxDb21tb24uVUlTdHJpbmcoJ0hlYWRlcnMnKSx0aGlzLl9oZWFkZXJzVmlldyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKFVJLlRhYmJlZFBhbmUuRXZlbnRzLlRhYlNlbGVjdGVkLHRoaXMuX3RhYlNlbGVjdGVkLHRoaXMpO2lmKHJlcXVlc3QucmVzb3VyY2VUeXBlKCk9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5XZWJTb2NrZXQpe2NvbnN0IGZyYW1lVmlldz1uZXcgTmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldyhyZXF1ZXN0KTt0aGlzLmFwcGVuZFRhYihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLldzRnJhbWVzLENvbW1vbi5VSVN0cmluZygnRnJhbWVzJyksZnJhbWVWaWV3KTt9ZWxzZSBpZihyZXF1ZXN0Lm1pbWVUeXBlPT09J3RleHQvZXZlbnQtc3RyZWFtJyl7dGhpcy5hcHBlbmRUYWIoTmV0d29yay5OZXR3b3JrSXRlbVZpZXcuVGFicy5FdmVudFNvdXJjZSxDb21tb24uVUlTdHJpbmcoJ0V2ZW50U3RyZWFtJyksbmV3IE5ldHdvcmsuRXZlbnRTb3VyY2VNZXNzYWdlc1ZpZXcocmVxdWVzdCkpO31lbHNle3RoaXMuX3Jlc3BvbnNlVmlldz1uZXcgTmV0d29yay5SZXF1ZXN0UmVzcG9uc2VWaWV3KHJlcXVlc3QpO2NvbnN0IHByZXZpZXdWaWV3PW5ldyBOZXR3b3JrLlJlcXVlc3RQcmV2aWV3VmlldyhyZXF1ZXN0KTt0aGlzLmFwcGVuZFRhYihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLlByZXZpZXcsQ29tbW9uLlVJU3RyaW5nKCdQcmV2aWV3JykscHJldmlld1ZpZXcpO2lmKHJlcXVlc3Quc2lnbmVkRXhjaGFuZ2VJbmZvKCkmJnJlcXVlc3Quc2lnbmVkRXhjaGFuZ2VJbmZvKCkuZXJyb3JzJiZyZXF1ZXN0LnNpZ25lZEV4Y2hhbmdlSW5mbygpLmVycm9ycy5sZW5ndGgpe2NvbnN0IGljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1lcnJvcicpO2ljb24udGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTaWduZWRFeGNoYW5nZSBlcnJvcicpO3RoaXMuc2V0VGFiSWNvbihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLlByZXZpZXcsaWNvbik7fQp0aGlzLmFwcGVuZFRhYihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLlJlc3BvbnNlLENvbW1vbi5VSVN0cmluZygnUmVzcG9uc2UnKSx0aGlzLl9yZXNwb25zZVZpZXcpO30KaWYocmVxdWVzdC5yZXF1ZXN0Q29va2llc3x8cmVxdWVzdC5yZXNwb25zZUNvb2tpZXMpe3RoaXMuX2Nvb2tpZXNWaWV3PW5ldyBOZXR3b3JrLlJlcXVlc3RDb29raWVzVmlldyhyZXF1ZXN0KTt0aGlzLmFwcGVuZFRhYihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLkNvb2tpZXMsQ29tbW9uLlVJU3RyaW5nKCdDb29raWVzJyksdGhpcy5fY29va2llc1ZpZXcpO30KdGhpcy5hcHBlbmRUYWIoTmV0d29yay5OZXR3b3JrSXRlbVZpZXcuVGFicy5UaW1pbmcsQ29tbW9uLlVJU3RyaW5nKCdUaW1pbmcnKSxuZXcgTmV0d29yay5SZXF1ZXN0VGltaW5nVmlldyhyZXF1ZXN0LGNhbGN1bGF0b3IpKTt0aGlzLl9yZXF1ZXN0PXJlcXVlc3Q7fQp3YXNTaG93bigpe3N1cGVyLndhc1Nob3duKCk7dGhpcy5fc2VsZWN0VGFiKCk7fQpfc2VsZWN0VGFiKHRhYklkKXtpZighdGFiSWQpCnRhYklkPXRoaXMuX3Jlc291cmNlVmlld1RhYlNldHRpbmcuZ2V0KCk7aWYoIXRoaXMuc2VsZWN0VGFiKHRhYklkKSkKdGhpcy5zZWxlY3RUYWIoJ2hlYWRlcnMnKTt9Cl90YWJTZWxlY3RlZChldmVudCl7aWYoIWV2ZW50LmRhdGEuaXNVc2VyR2VzdHVyZSkKcmV0dXJuO3RoaXMuX3Jlc291cmNlVmlld1RhYlNldHRpbmcuc2V0KGV2ZW50LmRhdGEudGFiSWQpO30KcmVxdWVzdCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0O30KYXN5bmMgcmV2ZWFsUmVzcG9uc2VCb2R5KGxpbmUpe3RoaXMuX3NlbGVjdFRhYihOZXR3b3JrLk5ldHdvcmtJdGVtVmlldy5UYWJzLlJlc3BvbnNlKTtpZih0aGlzLl9yZXNwb25zZVZpZXcmJnR5cGVvZiBsaW5lPT09J251bWJlcicpCmF3YWl0IHRoaXMuX3Jlc3BvbnNlVmlldy5yZXZlYWxMaW5lKChsaW5lKSk7fQpyZXZlYWxSZXF1ZXN0SGVhZGVyKGhlYWRlcil7dGhpcy5fc2VsZWN0VGFiKE5ldHdvcmsuTmV0d29ya0l0ZW1WaWV3LlRhYnMuSGVhZGVycyk7dGhpcy5faGVhZGVyc1ZpZXcucmV2ZWFsUmVxdWVzdEhlYWRlcihoZWFkZXIpO30KcmV2ZWFsUmVzcG9uc2VIZWFkZXIoaGVhZGVyKXt0aGlzLl9zZWxlY3RUYWIoTmV0d29yay5OZXR3b3JrSXRlbVZpZXcuVGFicy5IZWFkZXJzKTt0aGlzLl9oZWFkZXJzVmlldy5yZXZlYWxSZXNwb25zZUhlYWRlcihoZWFkZXIpO319O05ldHdvcmsuTmV0d29ya0l0ZW1WaWV3LlRhYnM9e0Nvb2tpZXM6J2Nvb2tpZXMnLEV2ZW50U291cmNlOidldmVudFNvdXJjZScsSGVhZGVyczonaGVhZGVycycsUHJldmlldzoncHJldmlldycsUmVzcG9uc2U6J3Jlc3BvbnNlJyxUaW1pbmc6J3RpbWluZycsV3NGcmFtZXM6J3dlYlNvY2tldEZyYW1lcyd9OztOZXR3b3JrLk5ldHdvcmtUaW1lQm91bmRhcnk9Y2xhc3N7Y29uc3RydWN0b3IobWluaW11bSxtYXhpbXVtKXt0aGlzLm1pbmltdW09bWluaW11bTt0aGlzLm1heGltdW09bWF4aW11bTt9CmVxdWFscyhvdGhlcil7cmV0dXJuKHRoaXMubWluaW11bT09PW90aGVyLm1pbmltdW0pJiYodGhpcy5tYXhpbXVtPT09b3RoZXIubWF4aW11bSk7fX07TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3I9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHN0YXJ0QXRaZXJvKXtzdXBlcigpO3RoaXMuc3RhcnRBdFplcm89c3RhcnRBdFplcm87dGhpcy5fbWluaW11bUJvdW5kYXJ5PS0xO3RoaXMuX21heGltdW1Cb3VuZGFyeT0tMTt0aGlzLl9ib3VuZHJ5Q2hhbmdlZEV2ZW50VGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDApO3RoaXMuX3dpbmRvdz1udWxsO30Kc2V0V2luZG93KHdpbmRvdyl7dGhpcy5fd2luZG93PXdpbmRvdzt0aGlzLl9ib3VuZGFyeUNoYW5nZWQoKTt9CnNldEluaXRpYWxVc2VyRnJpZW5kbHlCb3VuZGFyaWVzKCl7dGhpcy5fbWluaW11bUJvdW5kYXJ5PTA7dGhpcy5fbWF4aW11bUJvdW5kYXJ5PTE7fQpjb21wdXRlUG9zaXRpb24odGltZSl7cmV0dXJuKHRpbWUtdGhpcy5taW5pbXVtQm91bmRhcnkoKSkvdGhpcy5ib3VuZGFyeVNwYW4oKSp0aGlzLl93b3JraW5nQXJlYTt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIE51bWJlci5zZWNvbmRzVG9TdHJpbmcodmFsdWUsISFwcmVjaXNpb24pO30KbWluaW11bUJvdW5kYXJ5KCl7cmV0dXJuIHRoaXMuX3dpbmRvdz90aGlzLl93aW5kb3cubWluaW11bTp0aGlzLl9taW5pbXVtQm91bmRhcnk7fQp6ZXJvVGltZSgpe3JldHVybiB0aGlzLl9taW5pbXVtQm91bmRhcnk7fQptYXhpbXVtQm91bmRhcnkoKXtyZXR1cm4gdGhpcy5fd2luZG93P3RoaXMuX3dpbmRvdy5tYXhpbXVtOnRoaXMuX21heGltdW1Cb3VuZGFyeTt9CmJvdW5kYXJ5KCl7cmV0dXJuIG5ldyBOZXR3b3JrLk5ldHdvcmtUaW1lQm91bmRhcnkodGhpcy5taW5pbXVtQm91bmRhcnkoKSx0aGlzLm1heGltdW1Cb3VuZGFyeSgpKTt9CmJvdW5kYXJ5U3Bhbigpe3JldHVybiB0aGlzLm1heGltdW1Cb3VuZGFyeSgpLXRoaXMubWluaW11bUJvdW5kYXJ5KCk7fQpyZXNldCgpe3RoaXMuX21pbmltdW1Cb3VuZGFyeT0tMTt0aGlzLl9tYXhpbXVtQm91bmRhcnk9LTE7dGhpcy5fYm91bmRhcnlDaGFuZ2VkKCk7fQpfdmFsdWUoaXRlbSl7cmV0dXJuIDA7fQpzZXREaXNwbGF5V2lkdGgoY2xpZW50V2lkdGgpe3RoaXMuX3dvcmtpbmdBcmVhPWNsaWVudFdpZHRoO30KY29tcHV0ZUJhckdyYXBoUGVyY2VudGFnZXMocmVxdWVzdCl7bGV0IHN0YXJ0O2xldCBtaWRkbGU7bGV0IGVuZDtpZihyZXF1ZXN0LnN0YXJ0VGltZSE9PS0xKQpzdGFydD0oKHJlcXVlc3Quc3RhcnRUaW1lLXRoaXMubWluaW11bUJvdW5kYXJ5KCkpL3RoaXMuYm91bmRhcnlTcGFuKCkpKjEwMDtlbHNlCnN0YXJ0PTA7aWYocmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZSE9PS0xKQptaWRkbGU9KChyZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lLXRoaXMubWluaW11bUJvdW5kYXJ5KCkpL3RoaXMuYm91bmRhcnlTcGFuKCkpKjEwMDtlbHNlCm1pZGRsZT0odGhpcy5zdGFydEF0WmVybz9zdGFydDoxMDApO2lmKHJlcXVlc3QuZW5kVGltZSE9PS0xKQplbmQ9KChyZXF1ZXN0LmVuZFRpbWUtdGhpcy5taW5pbXVtQm91bmRhcnkoKSkvdGhpcy5ib3VuZGFyeVNwYW4oKSkqMTAwO2Vsc2UKZW5kPSh0aGlzLnN0YXJ0QXRaZXJvP21pZGRsZToxMDApO2lmKHRoaXMuc3RhcnRBdFplcm8pe2VuZC09c3RhcnQ7bWlkZGxlLT1zdGFydDtzdGFydD0wO30KcmV0dXJue3N0YXJ0OnN0YXJ0LG1pZGRsZTptaWRkbGUsZW5kOmVuZH07fQpjb21wdXRlUGVyY2VudGFnZUZyb21FdmVudFRpbWUoZXZlbnRUaW1lKXtpZihldmVudFRpbWUhPT0tMSYmIXRoaXMuc3RhcnRBdFplcm8pCnJldHVybigoZXZlbnRUaW1lLXRoaXMubWluaW11bUJvdW5kYXJ5KCkpL3RoaXMuYm91bmRhcnlTcGFuKCkpKjEwMDtyZXR1cm4gMDt9CnBlcmNlbnRhZ2VUb1RpbWUocGVyY2VudGFnZSl7cmV0dXJuIHBlcmNlbnRhZ2UqdGhpcy5ib3VuZGFyeVNwYW4oKS8xMDArdGhpcy5taW5pbXVtQm91bmRhcnkoKTt9Cl9ib3VuZGFyeUNoYW5nZWQoKXt0aGlzLl9ib3VuZHJ5Q2hhbmdlZEV2ZW50VGhyb3R0bGVyLnNjaGVkdWxlKGRpc3BhdGNoRXZlbnQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCgpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKE5ldHdvcmsuTmV0d29ya1RpbWVDYWxjdWxhdG9yLkV2ZW50cy5Cb3VuZGFyaWVzQ2hhbmdlZCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319CnVwZGF0ZUJvdW5kYXJpZXNGb3JFdmVudFRpbWUoZXZlbnRUaW1lKXtpZihldmVudFRpbWU9PT0tMXx8dGhpcy5zdGFydEF0WmVybykKcmV0dXJuO2lmKHRoaXMuX21heGltdW1Cb3VuZGFyeT09PXVuZGVmaW5lZHx8ZXZlbnRUaW1lPnRoaXMuX21heGltdW1Cb3VuZGFyeSl7dGhpcy5fbWF4aW11bUJvdW5kYXJ5PWV2ZW50VGltZTt0aGlzLl9ib3VuZGFyeUNoYW5nZWQoKTt9fQpjb21wdXRlQmFyR3JhcGhMYWJlbHMocmVxdWVzdCl7bGV0IHJpZ2h0TGFiZWw9Jyc7aWYocmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZSE9PS0xJiZyZXF1ZXN0LmVuZFRpbWUhPT0tMSkKcmlnaHRMYWJlbD1OdW1iZXIuc2Vjb25kc1RvU3RyaW5nKHJlcXVlc3QuZW5kVGltZS1yZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lKTtjb25zdCBoYXNMYXRlbmN5PXJlcXVlc3QubGF0ZW5jeT4wO2NvbnN0IGxlZnRMYWJlbD1oYXNMYXRlbmN5P051bWJlci5zZWNvbmRzVG9TdHJpbmcocmVxdWVzdC5sYXRlbmN5KTpyaWdodExhYmVsO2lmKHJlcXVlc3QudGltaW5nKQpyZXR1cm57bGVmdDpsZWZ0TGFiZWwscmlnaHQ6cmlnaHRMYWJlbH07bGV0IHRvb2x0aXA7aWYoaGFzTGF0ZW5jeSYmcmlnaHRMYWJlbCl7Y29uc3QgdG90YWw9TnVtYmVyLnNlY29uZHNUb1N0cmluZyhyZXF1ZXN0LmR1cmF0aW9uKTt0b29sdGlwPU5ldHdvcmsuTmV0d29ya1RpbWVDYWxjdWxhdG9yLl9sYXRlbmN5RG93bmxvYWRUb3RhbEZvcm1hdC5mb3JtYXQobGVmdExhYmVsLHJpZ2h0TGFiZWwsdG90YWwpO31lbHNlIGlmKGhhc0xhdGVuY3kpe3Rvb2x0aXA9TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX2xhdGVuY3lGb3JtYXQuZm9ybWF0KGxlZnRMYWJlbCk7fWVsc2UgaWYocmlnaHRMYWJlbCl7dG9vbHRpcD1OZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5fZG93bmxvYWRGb3JtYXQuZm9ybWF0KHJpZ2h0TGFiZWwpO30KaWYocmVxdWVzdC5mZXRjaGVkVmlhU2VydmljZVdvcmtlcikKdG9vbHRpcD1OZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5fZnJvbVNlcnZpY2VXb3JrZXJGb3JtYXQuZm9ybWF0KHRvb2x0aXApO2Vsc2UgaWYocmVxdWVzdC5jYWNoZWQoKSkKdG9vbHRpcD1OZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5fZnJvbUNhY2hlRm9ybWF0LmZvcm1hdCh0b29sdGlwKTtyZXR1cm57bGVmdDpsZWZ0TGFiZWwscmlnaHQ6cmlnaHRMYWJlbCx0b29sdGlwOnRvb2x0aXB9O30KdXBkYXRlQm91bmRhcmllcyhyZXF1ZXN0KXtjb25zdCBsb3dlckJvdW5kPXRoaXMuX2xvd2VyQm91bmQocmVxdWVzdCk7Y29uc3QgdXBwZXJCb3VuZD10aGlzLl91cHBlckJvdW5kKHJlcXVlc3QpO2xldCBjaGFuZ2VkPWZhbHNlO2lmKGxvd2VyQm91bmQhPT0tMXx8dGhpcy5zdGFydEF0WmVybykKY2hhbmdlZD10aGlzLl9leHRlbmRCb3VuZGFyaWVzVG9JbmNsdWRlVGltZXN0YW1wKHRoaXMuc3RhcnRBdFplcm8/MDpsb3dlckJvdW5kKTtpZih1cHBlckJvdW5kIT09LTEpCmNoYW5nZWQ9dGhpcy5fZXh0ZW5kQm91bmRhcmllc1RvSW5jbHVkZVRpbWVzdGFtcCh1cHBlckJvdW5kKXx8Y2hhbmdlZDtpZihjaGFuZ2VkKQp0aGlzLl9ib3VuZGFyeUNoYW5nZWQoKTt9Cl9leHRlbmRCb3VuZGFyaWVzVG9JbmNsdWRlVGltZXN0YW1wKHRpbWVzdGFtcCl7Y29uc3QgcHJldmlvdXNNaW5pbXVtQm91bmRhcnk9dGhpcy5fbWluaW11bUJvdW5kYXJ5O2NvbnN0IHByZXZpb3VzTWF4aW11bUJvdW5kYXJ5PXRoaXMuX21heGltdW1Cb3VuZGFyeTtjb25zdCBtaW5PZmZzZXQ9TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX21pbmltdW1TcHJlYWQ7aWYodGhpcy5fbWluaW11bUJvdW5kYXJ5PT09LTF8fHRoaXMuX21heGltdW1Cb3VuZGFyeT09PS0xKXt0aGlzLl9taW5pbXVtQm91bmRhcnk9dGltZXN0YW1wO3RoaXMuX21heGltdW1Cb3VuZGFyeT10aW1lc3RhbXArbWluT2Zmc2V0O31lbHNle3RoaXMuX21pbmltdW1Cb3VuZGFyeT1NYXRoLm1pbih0aW1lc3RhbXAsdGhpcy5fbWluaW11bUJvdW5kYXJ5KTt0aGlzLl9tYXhpbXVtQm91bmRhcnk9TWF0aC5tYXgodGltZXN0YW1wLHRoaXMuX21pbmltdW1Cb3VuZGFyeSttaW5PZmZzZXQsdGhpcy5fbWF4aW11bUJvdW5kYXJ5KTt9CnJldHVybiBwcmV2aW91c01pbmltdW1Cb3VuZGFyeSE9PXRoaXMuX21pbmltdW1Cb3VuZGFyeXx8cHJldmlvdXNNYXhpbXVtQm91bmRhcnkhPT10aGlzLl9tYXhpbXVtQm91bmRhcnk7fQpfbG93ZXJCb3VuZChyZXF1ZXN0KXtyZXR1cm4gMDt9Cl91cHBlckJvdW5kKHJlcXVlc3Qpe3JldHVybiAwO319O05ldHdvcmsuTmV0d29ya1RpbWVDYWxjdWxhdG9yLl9taW5pbXVtU3ByZWFkPTAuMTtOZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5FdmVudHM9e0JvdW5kYXJpZXNDaGFuZ2VkOlN5bWJvbCgnQm91bmRhcmllc0NoYW5nZWQnKX07TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX2xhdGVuY3lEb3dubG9hZFRvdGFsRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyVzIGxhdGVuY3ksICVzIGRvd25sb2FkICglcyB0b3RhbCknKTtOZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5fbGF0ZW5jeUZvcm1hdD1uZXcgQ29tbW9uLlVJU3RyaW5nRm9ybWF0KCclcyBsYXRlbmN5Jyk7TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX2Rvd25sb2FkRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyVzIGRvd25sb2FkJyk7TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX2Zyb21TZXJ2aWNlV29ya2VyRm9ybWF0PW5ldyBDb21tb24uVUlTdHJpbmdGb3JtYXQoJyVzIChmcm9tIFNlcnZpY2VXb3JrZXIpJyk7TmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuX2Zyb21DYWNoZUZvcm1hdD1uZXcgQ29tbW9uLlVJU3RyaW5nRm9ybWF0KCclcyAoZnJvbSBjYWNoZSknKTtOZXR3b3JrLk5ldHdvcmtUcmFuc2ZlclRpbWVDYWxjdWxhdG9yPWNsYXNzIGV4dGVuZHMgTmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3J7Y29uc3RydWN0b3IoKXtzdXBlcihmYWxzZSk7fQpmb3JtYXRWYWx1ZSh2YWx1ZSxwcmVjaXNpb24pe3JldHVybiBOdW1iZXIuc2Vjb25kc1RvU3RyaW5nKHZhbHVlLXRoaXMuemVyb1RpbWUoKSwhIXByZWNpc2lvbik7fQpfbG93ZXJCb3VuZChyZXF1ZXN0KXtyZXR1cm4gcmVxdWVzdC5pc3N1ZVRpbWUoKTt9Cl91cHBlckJvdW5kKHJlcXVlc3Qpe3JldHVybiByZXF1ZXN0LmVuZFRpbWU7fX07TmV0d29yay5OZXR3b3JrVHJhbnNmZXJEdXJhdGlvbkNhbGN1bGF0b3I9Y2xhc3MgZXh0ZW5kcyBOZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO30KZm9ybWF0VmFsdWUodmFsdWUscHJlY2lzaW9uKXtyZXR1cm4gTnVtYmVyLnNlY29uZHNUb1N0cmluZyh2YWx1ZSwhIXByZWNpc2lvbik7fQpfdXBwZXJCb3VuZChyZXF1ZXN0KXtyZXR1cm4gcmVxdWVzdC5kdXJhdGlvbjt9fTs7TmV0d29yay5OZXR3b3JrTG9nVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoZmlsdGVyQmFyLHByb2dyZXNzQmFyQ29udGFpbmVyLG5ldHdvcmtMb2dMYXJnZVJvd3NTZXR0aW5nKXtzdXBlcigpO3RoaXMuc2V0TWluaW11bVNpemUoNTAsNjQpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbmV0d29yay9uZXR3b3JrTG9nVmlldy5jc3MnKTt0aGlzLmVsZW1lbnQuaWQ9J25ldHdvcmstY29udGFpbmVyJzt0aGlzLl9uZXR3b3JrSGlkZURhdGFVUkxTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCduZXR3b3JrSGlkZURhdGFVUkwnLGZhbHNlKTt0aGlzLl9uZXR3b3JrUmVzb3VyY2VUeXBlRmlsdGVyc1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ25ldHdvcmtSZXNvdXJjZVR5cGVGaWx0ZXJzJyx7fSk7dGhpcy5fcmF3Um93SGVpZ2h0PTA7dGhpcy5fcHJvZ3Jlc3NCYXJDb250YWluZXI9cHJvZ3Jlc3NCYXJDb250YWluZXI7dGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmc9bmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmc7dGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodXBkYXRlUm93SGVpZ2h0LmJpbmQodGhpcyksdGhpcyk7ZnVuY3Rpb24gdXBkYXRlUm93SGVpZ2h0KCl7dGhpcy5fcmF3Um93SGVpZ2h0PSEhdGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmcuZ2V0KCk/NDE6MjE7dGhpcy5fcm93SGVpZ2h0PXRoaXMuX2NvbXB1dGVSb3dIZWlnaHQoKTt9CnRoaXMuX3Jhd1Jvd0hlaWdodD0wO3RoaXMuX3Jvd0hlaWdodD0wO3VwZGF0ZVJvd0hlaWdodC5jYWxsKHRoaXMpO3RoaXMuX3RpbWVDYWxjdWxhdG9yPW5ldyBOZXR3b3JrLk5ldHdvcmtUcmFuc2ZlclRpbWVDYWxjdWxhdG9yKCk7dGhpcy5fZHVyYXRpb25DYWxjdWxhdG9yPW5ldyBOZXR3b3JrLk5ldHdvcmtUcmFuc2ZlckR1cmF0aW9uQ2FsY3VsYXRvcigpO3RoaXMuX2NhbGN1bGF0b3I9dGhpcy5fdGltZUNhbGN1bGF0b3I7dGhpcy5fY29sdW1ucz1uZXcgTmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnModGhpcyx0aGlzLl90aW1lQ2FsY3VsYXRvcix0aGlzLl9kdXJhdGlvbkNhbGN1bGF0b3IsbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmcpO3RoaXMuX2NvbHVtbnMuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX3N0YWxlUmVxdWVzdHM9bmV3IFNldCgpO3RoaXMuX21haW5SZXF1ZXN0TG9hZFRpbWU9LTE7dGhpcy5fbWFpblJlcXVlc3RET01Db250ZW50TG9hZGVkVGltZT0tMTt0aGlzLl9oaWdobGlnaHRlZFN1YnN0cmluZ0NoYW5nZXM9W107dGhpcy5fZmlsdGVycz1bXTt0aGlzLl90aW1lRmlsdGVyPW51bGw7dGhpcy5faG92ZXJlZE5vZGU9bnVsbDt0aGlzLl9yZWNvcmRpbmdIaW50PW51bGw7dGhpcy5fcmVmcmVzaFJlcXVlc3RJZD1udWxsO3RoaXMuX2hpZ2hsaWdodGVkTm9kZT1udWxsO3RoaXMubGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcigpO3RoaXMuYmFkZ2VQb29sPW5ldyBQcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sKCk7dGhpcy5fcmVjb3JkaW5nPWZhbHNlO3RoaXMuX25lZWRzUmVmcmVzaD1mYWxzZTt0aGlzLl9oZWFkZXJIZWlnaHQ9MDt0aGlzLl9ncm91cExvb2t1cHM9bmV3IE1hcCgpO3RoaXMuX2dyb3VwTG9va3Vwcy5zZXQoJ0ZyYW1lJyxuZXcgTmV0d29yay5OZXR3b3JrRnJhbWVHcm91cGVyKHRoaXMpKTt0aGlzLl9hY3RpdmVHcm91cExvb2t1cD1udWxsO3RoaXMuX3RleHRGaWx0ZXJVST1uZXcgVUkuVGV4dEZpbHRlclVJKCk7dGhpcy5fdGV4dEZpbHRlclVJLmFkZEV2ZW50TGlzdGVuZXIoVUkuRmlsdGVyVUkuRXZlbnRzLkZpbHRlckNoYW5nZWQsdGhpcy5fZmlsdGVyQ2hhbmdlZCx0aGlzKTtmaWx0ZXJCYXIuYWRkRmlsdGVyKHRoaXMuX3RleHRGaWx0ZXJVSSk7dGhpcy5fZGF0YVVSTEZpbHRlclVJPW5ldyBVSS5DaGVja2JveEZpbHRlclVJKCdoaWRlLWRhdGEtdXJsJyxDb21tb24uVUlTdHJpbmcoJ0hpZGUgZGF0YSBVUkxzJyksdHJ1ZSx0aGlzLl9uZXR3b3JrSGlkZURhdGFVUkxTZXR0aW5nKTt0aGlzLl9kYXRhVVJMRmlsdGVyVUkuYWRkRXZlbnRMaXN0ZW5lcihVSS5GaWx0ZXJVSS5FdmVudHMuRmlsdGVyQ2hhbmdlZCx0aGlzLl9maWx0ZXJDaGFuZ2VkLmJpbmQodGhpcyksdGhpcyk7ZmlsdGVyQmFyLmFkZEZpbHRlcih0aGlzLl9kYXRhVVJMRmlsdGVyVUkpO2NvbnN0IGZpbHRlckl0ZW1zPU9iamVjdC52YWx1ZXMoQ29tbW9uLnJlc291cmNlQ2F0ZWdvcmllcykubWFwKGNhdGVnb3J5PT4oe25hbWU6Y2F0ZWdvcnkudGl0bGUsbGFiZWw6Y2F0ZWdvcnkuc2hvcnRUaXRsZSx0aXRsZTpjYXRlZ29yeS50aXRsZX0pKTt0aGlzLl9yZXNvdXJjZUNhdGVnb3J5RmlsdGVyVUk9bmV3IFVJLk5hbWVkQml0U2V0RmlsdGVyVUkoZmlsdGVySXRlbXMsdGhpcy5fbmV0d29ya1Jlc291cmNlVHlwZUZpbHRlcnNTZXR0aW5nKTt0aGlzLl9yZXNvdXJjZUNhdGVnb3J5RmlsdGVyVUkuYWRkRXZlbnRMaXN0ZW5lcihVSS5GaWx0ZXJVSS5FdmVudHMuRmlsdGVyQ2hhbmdlZCx0aGlzLl9maWx0ZXJDaGFuZ2VkLmJpbmQodGhpcyksdGhpcyk7ZmlsdGVyQmFyLmFkZEZpbHRlcih0aGlzLl9yZXNvdXJjZUNhdGVnb3J5RmlsdGVyVUkpO3RoaXMuX2ZpbHRlclBhcnNlcj1uZXcgVGV4dFV0aWxzLkZpbHRlclBhcnNlcihOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9zZWFyY2hLZXlzKTt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlcj1uZXcgVUkuRmlsdGVyU3VnZ2VzdGlvbkJ1aWxkZXIoTmV0d29yay5OZXR3b3JrTG9nVmlldy5fc2VhcmNoS2V5cyxOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9zb3J0U2VhcmNoVmFsdWVzKTt0aGlzLl9yZXNldFN1Z2dlc3Rpb25CdWlsZGVyKCk7dGhpcy5fZGF0YUdyaWQ9dGhpcy5fY29sdW1ucy5kYXRhR3JpZCgpO3RoaXMuX3NldHVwRGF0YUdyaWQoKTt0aGlzLl9jb2x1bW5zLnNvcnRCeUN1cnJlbnRDb2x1bW4oKTtmaWx0ZXJCYXIuZmlsdGVyQnV0dG9uKCkuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9kYXRhR3JpZC5zY2hlZHVsZVVwZGF0ZS5iaW5kKHRoaXMuX2RhdGFHcmlkLHRydWUpKTt0aGlzLl9zdW1tYXJ5QmFyRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstc3VtbWFyeS1iYXInKTtuZXcgVUkuRHJvcFRhcmdldCh0aGlzLmVsZW1lbnQsW1VJLkRyb3BUYXJnZXQuVHlwZS5GaWxlXSxDb21tb24uVUlTdHJpbmcoJ0Ryb3AgSEFSIGZpbGVzIGhlcmUnKSx0aGlzLl9oYW5kbGVEcm9wLmJpbmQodGhpcykpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCduZXR3b3JrQ29sb3JDb2RlUmVzb3VyY2VUeXBlcycpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2ludmFsaWRhdGVBbGxJdGVtcy5iaW5kKHRoaXMsZmFsc2UpLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLk5ldHdvcmtNYW5hZ2VyLHRoaXMpO0Jyb3dzZXJTREsubmV0d29ya0xvZy5hZGRFdmVudExpc3RlbmVyKEJyb3dzZXJTREsuTmV0d29ya0xvZy5FdmVudHMuUmVxdWVzdEFkZGVkLHRoaXMuX29uUmVxdWVzdFVwZGF0ZWQsdGhpcyk7QnJvd3NlclNESy5uZXR3b3JrTG9nLmFkZEV2ZW50TGlzdGVuZXIoQnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cy5SZXF1ZXN0VXBkYXRlZCx0aGlzLl9vblJlcXVlc3RVcGRhdGVkLHRoaXMpO0Jyb3dzZXJTREsubmV0d29ya0xvZy5hZGRFdmVudExpc3RlbmVyKEJyb3dzZXJTREsuTmV0d29ya0xvZy5FdmVudHMuUmVzZXQsdGhpcy5fcmVzZXQsdGhpcyk7dGhpcy5fdXBkYXRlR3JvdXBCeUZyYW1lKCk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ25ldHdvcmsuZ3JvdXAtYnktZnJhbWUnKS5hZGRDaGFuZ2VMaXN0ZW5lcigoKT0+dGhpcy5fdXBkYXRlR3JvdXBCeUZyYW1lKCkpO3RoaXMuX2ZpbHRlckJhcj1maWx0ZXJCYXI7fQpfdXBkYXRlR3JvdXBCeUZyYW1lKCl7Y29uc3QgdmFsdWU9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ25ldHdvcmsuZ3JvdXAtYnktZnJhbWUnKS5nZXQoKTt0aGlzLl9zZXRHcm91cGluZyh2YWx1ZT8nRnJhbWUnOm51bGwpO30Kc3RhdGljIF9zb3J0U2VhcmNoVmFsdWVzKGtleSx2YWx1ZXMpe2lmKGtleT09PU5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5Qcmlvcml0eSl7dmFsdWVzLnNvcnQoKGEsYik9Pntjb25zdCBhUHJpb3JpdHk9KFBlcmZVSS51aUxhYmVsVG9OZXR3b3JrUHJpb3JpdHkoYSkpO2NvbnN0IGJQcmlvcml0eT0oUGVyZlVJLnVpTGFiZWxUb05ldHdvcmtQcmlvcml0eShiKSk7cmV0dXJuIFBlcmZVSS5uZXR3b3JrUHJpb3JpdHlXZWlnaHQoYVByaW9yaXR5KS1QZXJmVUkubmV0d29ya1ByaW9yaXR5V2VpZ2h0KGJQcmlvcml0eSk7fSk7fWVsc2V7dmFsdWVzLnNvcnQoKTt9fQpzdGF0aWMgX25lZ2F0aXZlRmlsdGVyKGZpbHRlcixyZXF1ZXN0KXtyZXR1cm4hZmlsdGVyKHJlcXVlc3QpO30Kc3RhdGljIF9yZXF1ZXN0UGF0aEZpbHRlcihyZWdleCxyZXF1ZXN0KXtpZighcmVnZXgpCnJldHVybiBmYWxzZTtyZXR1cm4gcmVnZXgudGVzdChyZXF1ZXN0LnBhdGgoKSsnLycrcmVxdWVzdC5uYW1lKCkpO30Kc3RhdGljIF9zdWJkb21haW5zKGRvbWFpbil7Y29uc3QgcmVzdWx0PVtkb21haW5dO2xldCBpbmRleE9mUGVyaW9kPWRvbWFpbi5pbmRleE9mKCcuJyk7d2hpbGUoaW5kZXhPZlBlcmlvZCE9PS0xKXtyZXN1bHQucHVzaCgnKicrZG9tYWluLnN1YnN0cmluZyhpbmRleE9mUGVyaW9kKSk7aW5kZXhPZlBlcmlvZD1kb21haW4uaW5kZXhPZignLicsaW5kZXhPZlBlcmlvZCsxKTt9CnJldHVybiByZXN1bHQ7fQpzdGF0aWMgX2NyZWF0ZVJlcXVlc3REb21haW5GaWx0ZXIodmFsdWUpe2Z1bmN0aW9uIGVzY2FwZUZvclJlZ0V4cChzdHJpbmcpe3JldHVybiBzdHJpbmcuZXNjYXBlRm9yUmVnRXhwKCk7fQpjb25zdCBlc2NhcGVkUGF0dGVybj12YWx1ZS5zcGxpdCgnKicpLm1hcChlc2NhcGVGb3JSZWdFeHApLmpvaW4oJy4qJyk7cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3REb21haW5GaWx0ZXIuYmluZChudWxsLG5ldyBSZWdFeHAoJ14nK2VzY2FwZWRQYXR0ZXJuKyckJywnaScpKTt9CnN0YXRpYyBfcmVxdWVzdERvbWFpbkZpbHRlcihyZWdleCxyZXF1ZXN0KXtyZXR1cm4gcmVnZXgudGVzdChyZXF1ZXN0LmRvbWFpbik7fQpzdGF0aWMgX3J1bm5pbmdSZXF1ZXN0RmlsdGVyKHJlcXVlc3Qpe3JldHVybiFyZXF1ZXN0LmZpbmlzaGVkO30Kc3RhdGljIF9mcm9tQ2FjaGVSZXF1ZXN0RmlsdGVyKHJlcXVlc3Qpe3JldHVybiByZXF1ZXN0LmNhY2hlZCgpO30Kc3RhdGljIF9yZXF1ZXN0UmVzcG9uc2VIZWFkZXJGaWx0ZXIodmFsdWUscmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZSh2YWx1ZSkhPT11bmRlZmluZWQ7fQpzdGF0aWMgX3JlcXVlc3RNZXRob2RGaWx0ZXIodmFsdWUscmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QucmVxdWVzdE1ldGhvZD09PXZhbHVlO30Kc3RhdGljIF9yZXF1ZXN0UHJpb3JpdHlGaWx0ZXIodmFsdWUscmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QucHJpb3JpdHkoKT09PXZhbHVlO30Kc3RhdGljIF9yZXF1ZXN0TWltZVR5cGVGaWx0ZXIodmFsdWUscmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QubWltZVR5cGU9PT12YWx1ZTt9CnN0YXRpYyBfcmVxdWVzdE1peGVkQ29udGVudEZpbHRlcih2YWx1ZSxyZXF1ZXN0KXtpZih2YWx1ZT09PU5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuTWl4ZWRDb250ZW50RmlsdGVyVmFsdWVzLkRpc3BsYXllZCkKcmV0dXJuIHJlcXVlc3QubWl4ZWRDb250ZW50VHlwZT09PVByb3RvY29sLlNlY3VyaXR5Lk1peGVkQ29udGVudFR5cGUuT3B0aW9uYWxseUJsb2NrYWJsZTtlbHNlIGlmKHZhbHVlPT09TmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuQmxvY2tlZCkKcmV0dXJuIHJlcXVlc3QubWl4ZWRDb250ZW50VHlwZT09PVByb3RvY29sLlNlY3VyaXR5Lk1peGVkQ29udGVudFR5cGUuQmxvY2thYmxlJiZyZXF1ZXN0Lndhc0Jsb2NrZWQoKTtlbHNlIGlmKHZhbHVlPT09TmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuQmxvY2tPdmVycmlkZGVuKQpyZXR1cm4gcmVxdWVzdC5taXhlZENvbnRlbnRUeXBlPT09UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5CbG9ja2FibGUmJiFyZXF1ZXN0Lndhc0Jsb2NrZWQoKTtlbHNlIGlmKHZhbHVlPT09TmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuQWxsKQpyZXR1cm4gcmVxdWVzdC5taXhlZENvbnRlbnRUeXBlIT09UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5Ob25lO3JldHVybiBmYWxzZTt9CnN0YXRpYyBfcmVxdWVzdFNjaGVtZUZpbHRlcih2YWx1ZSxyZXF1ZXN0KXtyZXR1cm4gcmVxdWVzdC5zY2hlbWU9PT12YWx1ZTt9CnN0YXRpYyBfcmVxdWVzdFNldENvb2tpZURvbWFpbkZpbHRlcih2YWx1ZSxyZXF1ZXN0KXtjb25zdCBjb29raWVzPXJlcXVlc3QucmVzcG9uc2VDb29raWVzO2ZvcihsZXQgaT0wLGw9Y29va2llcz9jb29raWVzLmxlbmd0aDowO2k8bDsrK2kpe2lmKGNvb2tpZXNbaV0uZG9tYWluKCk9PT12YWx1ZSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpzdGF0aWMgX3JlcXVlc3RTZXRDb29raWVOYW1lRmlsdGVyKHZhbHVlLHJlcXVlc3Qpe2NvbnN0IGNvb2tpZXM9cmVxdWVzdC5yZXNwb25zZUNvb2tpZXM7Zm9yKGxldCBpPTAsbD1jb29raWVzP2Nvb2tpZXMubGVuZ3RoOjA7aTxsOysraSl7aWYoY29va2llc1tpXS5uYW1lKCk9PT12YWx1ZSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpzdGF0aWMgX3JlcXVlc3RTZXRDb29raWVWYWx1ZUZpbHRlcih2YWx1ZSxyZXF1ZXN0KXtjb25zdCBjb29raWVzPXJlcXVlc3QucmVzcG9uc2VDb29raWVzO2ZvcihsZXQgaT0wLGw9Y29va2llcz9jb29raWVzLmxlbmd0aDowO2k8bDsrK2kpe2lmKGNvb2tpZXNbaV0udmFsdWUoKT09PXZhbHVlKQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CnN0YXRpYyBfcmVxdWVzdFNpemVMYXJnZXJUaGFuRmlsdGVyKHZhbHVlLHJlcXVlc3Qpe3JldHVybiByZXF1ZXN0LnRyYW5zZmVyU2l6ZT49dmFsdWU7fQpzdGF0aWMgX3N0YXR1c0NvZGVGaWx0ZXIodmFsdWUscmVxdWVzdCl7cmV0dXJuKCcnK3JlcXVlc3Quc3RhdHVzQ29kZSk9PT12YWx1ZTt9CnN0YXRpYyBIVFRQUmVxdWVzdHNGaWx0ZXIocmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QucGFyc2VkVVJMLmlzVmFsaWQmJihyZXF1ZXN0LnNjaGVtZSBpbiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkhUVFBTY2hlbWFzKTt9CnN0YXRpYyBGaW5pc2hlZFJlcXVlc3RzRmlsdGVyKHJlcXVlc3Qpe3JldHVybiByZXF1ZXN0LmZpbmlzaGVkO30Kc3RhdGljIF9yZXF1ZXN0VGltZUZpbHRlcih3aW5kb3dTdGFydCx3aW5kb3dFbmQscmVxdWVzdCl7aWYocmVxdWVzdC5pc3N1ZVRpbWUoKT53aW5kb3dFbmQpCnJldHVybiBmYWxzZTtpZihyZXF1ZXN0LmVuZFRpbWUhPT0tMSYmcmVxdWVzdC5lbmRUaW1lPHdpbmRvd1N0YXJ0KQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWU7fQpzdGF0aWMgX2NvcHlSZXF1ZXN0SGVhZGVycyhyZXF1ZXN0KXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1RleHQoKSk7fQpzdGF0aWMgX2NvcHlSZXNwb25zZUhlYWRlcnMocmVxdWVzdCl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KHJlcXVlc3QucmVzcG9uc2VIZWFkZXJzVGV4dCk7fQpzdGF0aWMgYXN5bmMgX2NvcHlSZXNwb25zZShyZXF1ZXN0KXtjb25zdCBjb250ZW50RGF0YT1hd2FpdCByZXF1ZXN0LmNvbnRlbnREYXRhKCk7bGV0IGNvbnRlbnQ9Y29udGVudERhdGEuY29udGVudDtpZihjb250ZW50RGF0YS5lbmNvZGVkKXtjb250ZW50PUNvbW1vbi5Db250ZW50UHJvdmlkZXIuY29udGVudEFzRGF0YVVSTChjb250ZW50RGF0YS5jb250ZW50LHJlcXVlc3QubWltZVR5cGUsY29udGVudERhdGEuZW5jb2RlZCxjb250ZW50RGF0YS5lbmNvZGVkPyd1dGYtOCc6bnVsbCk7fQpJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQoY29udGVudHx8JycpO30KX2hhbmRsZURyb3AoZGF0YVRyYW5zZmVyKXtjb25zdCBpdGVtcz1kYXRhVHJhbnNmZXIuaXRlbXM7aWYoIWl0ZW1zLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGVudHJ5PWl0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkoKTtpZihlbnRyeS5pc0RpcmVjdG9yeSkKcmV0dXJuO2VudHJ5LmZpbGUodGhpcy5fb25Mb2FkRnJvbUZpbGUuYmluZCh0aGlzKSk7fQphc3luYyBfb25Mb2FkRnJvbUZpbGUoZmlsZSl7Y29uc3Qgb3V0cHV0U3RyZWFtPW5ldyBDb21tb24uU3RyaW5nT3V0cHV0U3RyZWFtKCk7Y29uc3QgcmVhZGVyPW5ldyBCaW5kaW5ncy5DaHVua2VkRmlsZVJlYWRlcihmaWxlLDEwMDAwMDAwKTtjb25zdCBzdWNjZXNzPWF3YWl0IHJlYWRlci5yZWFkKG91dHB1dFN0cmVhbSk7aWYoIXN1Y2Nlc3Mpe3RoaXMuX2hhckxvYWRGYWlsZWQocmVhZGVyLmVycm9yKCkubWVzc2FnZSk7cmV0dXJuO30KbGV0IGhhclJvb3Q7dHJ5e2hhclJvb3Q9bmV3IEhBUkltcG9ydGVyLkhBUlJvb3QoSlNPTi5wYXJzZShvdXRwdXRTdHJlYW0uZGF0YSgpKSk7fWNhdGNoKGUpe3RoaXMuX2hhckxvYWRGYWlsZWQoZSk7cmV0dXJuO30KQnJvd3NlclNESy5uZXR3b3JrTG9nLmltcG9ydFJlcXVlc3RzKEhBUkltcG9ydGVyLkltcG9ydGVyLnJlcXVlc3RzRnJvbUhBUkxvZyhoYXJSb290LmxvZykpO30KX2hhckxvYWRGYWlsZWQobWVzc2FnZSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEhBUiBmaWxlIHdpdGggZm9sbG93aW5nIGVycm9yOiAnK21lc3NhZ2UpO30KX3NldEdyb3VwaW5nKGdyb3VwS2V5KXtpZih0aGlzLl9hY3RpdmVHcm91cExvb2t1cCkKdGhpcy5fYWN0aXZlR3JvdXBMb29rdXAucmVzZXQoKTtjb25zdCBncm91cExvb2t1cD1ncm91cEtleT90aGlzLl9ncm91cExvb2t1cHMuZ2V0KGdyb3VwS2V5KXx8bnVsbDpudWxsO3RoaXMuX2FjdGl2ZUdyb3VwTG9va3VwPWdyb3VwTG9va3VwO3RoaXMuX2ludmFsaWRhdGVBbGxJdGVtcygpO30KX2NvbXB1dGVSb3dIZWlnaHQoKXtyZXR1cm4gTWF0aC5yb3VuZCh0aGlzLl9yYXdSb3dIZWlnaHQqd2luZG93LmRldmljZVBpeGVsUmF0aW8pL3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO30Kbm9kZUZvclJlcXVlc3QocmVxdWVzdCl7cmV0dXJuIHJlcXVlc3RbTmV0d29yay5OZXR3b3JrTG9nVmlldy5fbmV0d29ya05vZGVTeW1ib2xdfHxudWxsO30KaGVhZGVySGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2hlYWRlckhlaWdodDt9CnNldFJlY29yZGluZyhyZWNvcmRpbmcpe3RoaXMuX3JlY29yZGluZz1yZWNvcmRpbmc7dGhpcy5fdXBkYXRlU3VtbWFyeUJhcigpO30KbW9kZWxBZGRlZChuZXR3b3JrTWFuYWdlcil7aWYobmV0d29ya01hbmFnZXIudGFyZ2V0KCkucGFyZW50VGFyZ2V0KCkpCnJldHVybjtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1uZXR3b3JrTWFuYWdlci50YXJnZXQoKS5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKHJlc291cmNlVHJlZU1vZGVsKXtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTG9hZCx0aGlzLl9sb2FkRXZlbnRGaXJlZCx0aGlzKTtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRE9NQ29udGVudExvYWRlZCx0aGlzLl9kb21Db250ZW50TG9hZGVkRXZlbnRGaXJlZCx0aGlzKTt9fQptb2RlbFJlbW92ZWQobmV0d29ya01hbmFnZXIpe2lmKCFuZXR3b3JrTWFuYWdlci50YXJnZXQoKS5wYXJlbnRUYXJnZXQoKSl7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9bmV0d29ya01hbmFnZXIudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZihyZXNvdXJjZVRyZWVNb2RlbCl7cmVzb3VyY2VUcmVlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkxvYWQsdGhpcy5fbG9hZEV2ZW50RmlyZWQsdGhpcyk7cmVzb3VyY2VUcmVlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkRPTUNvbnRlbnRMb2FkZWQsdGhpcy5fZG9tQ29udGVudExvYWRlZEV2ZW50RmlyZWQsdGhpcyk7fX19CnNldFdpbmRvdyhzdGFydCxlbmQpe2lmKCFzdGFydCYmIWVuZCl7dGhpcy5fdGltZUZpbHRlcj1udWxsO3RoaXMuX3RpbWVDYWxjdWxhdG9yLnNldFdpbmRvdyhudWxsKTt9ZWxzZXt0aGlzLl90aW1lRmlsdGVyPU5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3RUaW1lRmlsdGVyLmJpbmQobnVsbCxzdGFydCxlbmQpO3RoaXMuX3RpbWVDYWxjdWxhdG9yLnNldFdpbmRvdyhuZXcgTmV0d29yay5OZXR3b3JrVGltZUJvdW5kYXJ5KHN0YXJ0LGVuZCkpO30KdGhpcy5fZmlsdGVyUmVxdWVzdHMoKTt9CmNsZWFyU2VsZWN0aW9uKCl7aWYodGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlKQp0aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGUuZGVzZWxlY3QoKTt9Cl9yZXNldFN1Z2dlc3Rpb25CdWlsZGVyKCl7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuY2xlYXIoKTt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5JcyxOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LklzRmlsdGVyVHlwZS5SdW5uaW5nKTt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5JcyxOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LklzRmlsdGVyVHlwZS5Gcm9tQ2FjaGUpO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkxhcmdlclRoYW4sJzEwMCcpO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkxhcmdlclRoYW4sJzEwaycpO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkxhcmdlclRoYW4sJzFNJyk7dGhpcy5fdGV4dEZpbHRlclVJLnNldFN1Z2dlc3Rpb25Qcm92aWRlcih0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5jb21wbGV0aW9ucy5iaW5kKHRoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyKSk7fQpfZmlsdGVyQ2hhbmdlZChldmVudCl7dGhpcy5yZW1vdmVBbGxOb2RlSGlnaGxpZ2h0cygpO3RoaXMuX3BhcnNlRmlsdGVyUXVlcnkodGhpcy5fdGV4dEZpbHRlclVJLnZhbHVlKCkpO3RoaXMuX2ZpbHRlclJlcXVlc3RzKCk7fQpfc2hvd1JlY29yZGluZ0hpbnQoKXt0aGlzLl9oaWRlUmVjb3JkaW5nSGludCgpO3RoaXMuX3JlY29yZGluZ0hpbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCduZXR3b3JrLXN0YXR1cy1wYW5lIGZpbGwnKTtjb25zdCBoaW50VGV4dD10aGlzLl9yZWNvcmRpbmdIaW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZWNvcmRpbmctaGludCcpO2NvbnN0IHJlbG9hZFNob3J0Y3V0Tm9kZT10aGlzLl9yZWNvcmRpbmdIaW50LmNyZWF0ZUNoaWxkKCdiJyk7cmVsb2FkU2hvcnRjdXROb2RlLnRleHRDb250ZW50PVVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbignaW5zcGVjdG9yX21haW4ucmVsb2FkJylbMF0ubmFtZTtpZih0aGlzLl9yZWNvcmRpbmcpe2NvbnN0IHJlY29yZGluZ1RleHQ9aGludFRleHQuY3JlYXRlQ2hpbGQoJ3NwYW4nKTtyZWNvcmRpbmdUZXh0LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUmVjb3JkaW5nIG5ldHdvcmsgYWN0aXZpdHlcdTIwMjYnKTtoaW50VGV4dC5jcmVhdGVDaGlsZCgnYnInKTtoaW50VGV4dC5hcHBlbmRDaGlsZChVSS5mb3JtYXRMb2NhbGl6ZWQoJ1BlcmZvcm0gYSByZXF1ZXN0IG9yIGhpdCAlcyB0byByZWNvcmQgdGhlIHJlbG9hZC4nLFtyZWxvYWRTaG9ydGN1dE5vZGVdKSk7fWVsc2V7Y29uc3QgcmVjb3JkTm9kZT1oaW50VGV4dC5jcmVhdGVDaGlsZCgnYicpO3JlY29yZE5vZGUudGV4dENvbnRlbnQ9VUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dFRpdGxlRm9yQWN0aW9uKCduZXR3b3JrLnRvZ2dsZS1yZWNvcmRpbmcnKTtoaW50VGV4dC5hcHBlbmRDaGlsZChVSS5mb3JtYXRMb2NhbGl6ZWQoJ1JlY29yZCAoJXMpIG9yIHJlbG9hZCAoJXMpIHRvIGRpc3BsYXkgbmV0d29yayBhY3Rpdml0eS4nLFtyZWNvcmROb2RlLHJlbG9hZFNob3J0Y3V0Tm9kZV0pKTt9fQpfaGlkZVJlY29yZGluZ0hpbnQoKXtpZih0aGlzLl9yZWNvcmRpbmdIaW50KQp0aGlzLl9yZWNvcmRpbmdIaW50LnJlbW92ZSgpO3RoaXMuX3JlY29yZGluZ0hpbnQ9bnVsbDt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7aWYoIXRoaXMuX2RhdGFHcmlkKQpyZXR1cm5bXTtyZXR1cm5bdGhpcy5fZGF0YUdyaWQuc2Nyb2xsQ29udGFpbmVyXTt9CmNvbHVtbkV4dGVuc2lvblJlc29sdmVkKCl7dGhpcy5faW52YWxpZGF0ZUFsbEl0ZW1zKHRydWUpO30KX3NldHVwRGF0YUdyaWQoKXt0aGlzLl9kYXRhR3JpZC5zZXRSb3dDb250ZXh0TWVudUNhbGxiYWNrKChjb250ZXh0TWVudSxub2RlKT0+e2NvbnN0IHJlcXVlc3Q9bm9kZS5yZXF1ZXN0KCk7aWYocmVxdWVzdCkKdGhpcy5oYW5kbGVDb250ZXh0TWVudUZvclJlcXVlc3QoY29udGV4dE1lbnUscmVxdWVzdCk7fSk7dGhpcy5fZGF0YUdyaWQuc2V0U3RpY2tUb0JvdHRvbSh0cnVlKTt0aGlzLl9kYXRhR3JpZC5zZXROYW1lKCduZXR3b3JrTG9nJyk7dGhpcy5fZGF0YUdyaWQuc2V0UmVzaXplTWV0aG9kKERhdGFHcmlkLkRhdGFHcmlkLlJlc2l6ZU1ldGhvZC5MYXN0KTt0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstbG9nLWdyaWQnKTt0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fZGF0YUdyaWRNb3VzZURvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fZGF0YUdyaWRNb3VzZU1vdmUuYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCgpPT50aGlzLl9zZXRIb3ZlcmVkTm9kZShudWxsKSx0cnVlKTtyZXR1cm4gdGhpcy5fZGF0YUdyaWQ7fQpfZGF0YUdyaWRNb3VzZU1vdmUoZXZlbnQpe2NvbnN0IG5vZGU9KHRoaXMuX2RhdGFHcmlkLmRhdGFHcmlkTm9kZUZyb21Ob2RlKChldmVudC50YXJnZXQpKSk7Y29uc3QgaGlnaGxpZ2h0SW5pdGlhdG9yQ2hhaW49ZXZlbnQuc2hpZnRLZXk7dGhpcy5fc2V0SG92ZXJlZE5vZGUobm9kZSxoaWdobGlnaHRJbml0aWF0b3JDaGFpbik7fQpob3ZlcmVkTm9kZSgpe3JldHVybiB0aGlzLl9ob3ZlcmVkTm9kZTt9Cl9zZXRIb3ZlcmVkTm9kZShub2RlLGhpZ2hsaWdodEluaXRpYXRvckNoYWluKXtpZih0aGlzLl9ob3ZlcmVkTm9kZSkKdGhpcy5faG92ZXJlZE5vZGUuc2V0SG92ZXJlZChmYWxzZSxmYWxzZSk7dGhpcy5faG92ZXJlZE5vZGU9bm9kZTtpZih0aGlzLl9ob3ZlcmVkTm9kZSkKdGhpcy5faG92ZXJlZE5vZGUuc2V0SG92ZXJlZCh0cnVlLCEhaGlnaGxpZ2h0SW5pdGlhdG9yQ2hhaW4pO30KX2RhdGFHcmlkTW91c2VEb3duKGV2ZW50KXtpZighdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlJiZldmVudC5idXR0b24pCmV2ZW50LmNvbnN1bWUoKTt9Cl91cGRhdGVTdW1tYXJ5QmFyKCl7dGhpcy5faGlkZVJlY29yZGluZ0hpbnQoKTtsZXQgdHJhbnNmZXJTaXplPTA7bGV0IHNlbGVjdGVkTm9kZU51bWJlcj0wO2xldCBzZWxlY3RlZFRyYW5zZmVyU2l6ZT0wO2xldCBiYXNlVGltZT0tMTtsZXQgbWF4VGltZT0tMTtsZXQgbm9kZUNvdW50PTA7Zm9yKGNvbnN0IHJlcXVlc3Qgb2YgQnJvd3NlclNESy5uZXR3b3JrTG9nLnJlcXVlc3RzKCkpe2NvbnN0IG5vZGU9cmVxdWVzdFtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9uZXR3b3JrTm9kZVN5bWJvbF07aWYoIW5vZGUpCmNvbnRpbnVlO25vZGVDb3VudCsrO2NvbnN0IHJlcXVlc3RUcmFuc2ZlclNpemU9cmVxdWVzdC50cmFuc2ZlclNpemU7dHJhbnNmZXJTaXplKz1yZXF1ZXN0VHJhbnNmZXJTaXplO2lmKCFub2RlW05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX2lzRmlsdGVyZWRPdXRTeW1ib2xdKXtzZWxlY3RlZE5vZGVOdW1iZXIrKztzZWxlY3RlZFRyYW5zZmVyU2l6ZSs9cmVxdWVzdFRyYW5zZmVyU2l6ZTt9CmNvbnN0IG5ldHdvcmtNYW5hZ2VyPVNESy5OZXR3b3JrTWFuYWdlci5mb3JSZXF1ZXN0KHJlcXVlc3QpO2lmKG5ldHdvcmtNYW5hZ2VyJiZyZXF1ZXN0LnVybCgpPT09bmV0d29ya01hbmFnZXIudGFyZ2V0KCkuaW5zcGVjdGVkVVJMKCkmJnJlcXVlc3QucmVzb3VyY2VUeXBlKCk9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5Eb2N1bWVudCYmIW5ldHdvcmtNYW5hZ2VyLnRhcmdldCgpLnBhcmVudFRhcmdldCgpKQpiYXNlVGltZT1yZXF1ZXN0LnN0YXJ0VGltZTtpZihyZXF1ZXN0LmVuZFRpbWU+bWF4VGltZSkKbWF4VGltZT1yZXF1ZXN0LmVuZFRpbWU7fQppZighbm9kZUNvdW50KXt0aGlzLl9zaG93UmVjb3JkaW5nSGludCgpO3JldHVybjt9CmNvbnN0IHN1bW1hcnlCYXI9dGhpcy5fc3VtbWFyeUJhckVsZW1lbnQ7c3VtbWFyeUJhci5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHNlcGFyYXRvcj0nXHUyMDAyXHUyNzU4XHUyMDAyJztsZXQgdGV4dD0nJztmdW5jdGlvbiBhcHBlbmRDaHVuayhjaHVuayl7Y29uc3Qgc3Bhbj1zdW1tYXJ5QmFyLmNyZWF0ZUNoaWxkKCdzcGFuJyk7c3Bhbi50ZXh0Q29udGVudD1jaHVuazt0ZXh0Kz1jaHVuaztyZXR1cm4gc3Bhbjt9CmlmKHNlbGVjdGVkTm9kZU51bWJlciE9PW5vZGVDb3VudCl7YXBwZW5kQ2h1bmsoQ29tbW9uLlVJU3RyaW5nKCclZCAvICVkIHJlcXVlc3RzJyxzZWxlY3RlZE5vZGVOdW1iZXIsbm9kZUNvdW50KSk7YXBwZW5kQ2h1bmsoc2VwYXJhdG9yKTthcHBlbmRDaHVuayhDb21tb24uVUlTdHJpbmcoJyVzIC8gJXMgdHJhbnNmZXJyZWQnLE51bWJlci5ieXRlc1RvU3RyaW5nKHNlbGVjdGVkVHJhbnNmZXJTaXplKSxOdW1iZXIuYnl0ZXNUb1N0cmluZyh0cmFuc2ZlclNpemUpKSk7fWVsc2V7YXBwZW5kQ2h1bmsoQ29tbW9uLlVJU3RyaW5nKCclZCByZXF1ZXN0cycsbm9kZUNvdW50KSk7YXBwZW5kQ2h1bmsoc2VwYXJhdG9yKTthcHBlbmRDaHVuayhDb21tb24uVUlTdHJpbmcoJyVzIHRyYW5zZmVycmVkJyxOdW1iZXIuYnl0ZXNUb1N0cmluZyh0cmFuc2ZlclNpemUpKSk7fQppZihiYXNlVGltZSE9PS0xJiZtYXhUaW1lIT09LTEpe2FwcGVuZENodW5rKHNlcGFyYXRvcik7YXBwZW5kQ2h1bmsoQ29tbW9uLlVJU3RyaW5nKCdGaW5pc2g6ICVzJyxOdW1iZXIuc2Vjb25kc1RvU3RyaW5nKG1heFRpbWUtYmFzZVRpbWUpKSk7aWYodGhpcy5fbWFpblJlcXVlc3RET01Db250ZW50TG9hZGVkVGltZSE9PS0xJiZ0aGlzLl9tYWluUmVxdWVzdERPTUNvbnRlbnRMb2FkZWRUaW1lPmJhc2VUaW1lKXthcHBlbmRDaHVuayhzZXBhcmF0b3IpO2NvbnN0IGRvbUNvbnRlbnRMb2FkZWRUZXh0PUNvbW1vbi5VSVN0cmluZygnRE9NQ29udGVudExvYWRlZDogJXMnLE51bWJlci5zZWNvbmRzVG9TdHJpbmcodGhpcy5fbWFpblJlcXVlc3RET01Db250ZW50TG9hZGVkVGltZS1iYXNlVGltZSkpO2FwcGVuZENodW5rKGRvbUNvbnRlbnRMb2FkZWRUZXh0KS5jbGFzc0xpc3QuYWRkKCdzdW1tYXJ5LWJsdWUnKTt9CmlmKHRoaXMuX21haW5SZXF1ZXN0TG9hZFRpbWUhPT0tMSl7YXBwZW5kQ2h1bmsoc2VwYXJhdG9yKTtjb25zdCBsb2FkVGV4dD1Db21tb24uVUlTdHJpbmcoJ0xvYWQ6ICVzJyxOdW1iZXIuc2Vjb25kc1RvU3RyaW5nKHRoaXMuX21haW5SZXF1ZXN0TG9hZFRpbWUtYmFzZVRpbWUpKTthcHBlbmRDaHVuayhsb2FkVGV4dCkuY2xhc3NMaXN0LmFkZCgnc3VtbWFyeS1yZWQnKTt9fQpzdW1tYXJ5QmFyLnRpdGxlPXRleHQ7fQpzY2hlZHVsZVJlZnJlc2goKXtpZih0aGlzLl9uZWVkc1JlZnJlc2gpCnJldHVybjt0aGlzLl9uZWVkc1JlZnJlc2g9dHJ1ZTtpZih0aGlzLmlzU2hvd2luZygpJiYhdGhpcy5fcmVmcmVzaFJlcXVlc3RJZCkKdGhpcy5fcmVmcmVzaFJlcXVlc3RJZD10aGlzLmVsZW1lbnQud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZnJlc2guYmluZCh0aGlzKSk7fQphZGRGaWxtU3RyaXBGcmFtZXModGltZXMpe3RoaXMuX2NvbHVtbnMuYWRkRXZlbnREaXZpZGVycyh0aW1lcywnbmV0d29yay1mcmFtZS1kaXZpZGVyJyk7fQpzZWxlY3RGaWxtU3RyaXBGcmFtZSh0aW1lKXt0aGlzLl9jb2x1bW5zLnNlbGVjdEZpbG1TdHJpcEZyYW1lKHRpbWUpO30KY2xlYXJGaWxtU3RyaXBGcmFtZSgpe3RoaXMuX2NvbHVtbnMuY2xlYXJGaWxtU3RyaXBGcmFtZSgpO30KX3JlZnJlc2hJZk5lZWRlZCgpe2lmKHRoaXMuX25lZWRzUmVmcmVzaCkKdGhpcy5fcmVmcmVzaCgpO30KX2ludmFsaWRhdGVBbGxJdGVtcyhkZWZlclVwZGF0ZSl7dGhpcy5fc3RhbGVSZXF1ZXN0cz1uZXcgU2V0KEJyb3dzZXJTREsubmV0d29ya0xvZy5yZXF1ZXN0cygpKTtpZihkZWZlclVwZGF0ZSkKdGhpcy5zY2hlZHVsZVJlZnJlc2goKTtlbHNlCnRoaXMuX3JlZnJlc2goKTt9CnRpbWVDYWxjdWxhdG9yKCl7cmV0dXJuIHRoaXMuX3RpbWVDYWxjdWxhdG9yO30KY2FsY3VsYXRvcigpe3JldHVybiB0aGlzLl9jYWxjdWxhdG9yO30Kc2V0Q2FsY3VsYXRvcih4KXtpZigheHx8dGhpcy5fY2FsY3VsYXRvcj09PXgpCnJldHVybjtpZih0aGlzLl9jYWxjdWxhdG9yIT09eCl7dGhpcy5fY2FsY3VsYXRvcj14O3RoaXMuX2NvbHVtbnMuc2V0Q2FsY3VsYXRvcih0aGlzLl9jYWxjdWxhdG9yKTt9CnRoaXMuX2NhbGN1bGF0b3IucmVzZXQoKTtpZih0aGlzLl9jYWxjdWxhdG9yLnN0YXJ0QXRaZXJvKQp0aGlzLl9jb2x1bW5zLmhpZGVFdmVudERpdmlkZXJzKCk7ZWxzZQp0aGlzLl9jb2x1bW5zLnNob3dFdmVudERpdmlkZXJzKCk7dGhpcy5faW52YWxpZGF0ZUFsbEl0ZW1zKCk7fQpfbG9hZEV2ZW50RmlyZWQoZXZlbnQpe2lmKCF0aGlzLl9yZWNvcmRpbmcpCnJldHVybjtjb25zdCB0aW1lPShldmVudC5kYXRhLmxvYWRUaW1lKTtpZih0aW1lKXt0aGlzLl9tYWluUmVxdWVzdExvYWRUaW1lPXRpbWU7dGhpcy5fY29sdW1ucy5hZGRFdmVudERpdmlkZXJzKFt0aW1lXSwnbmV0d29yay1yZWQtZGl2aWRlcicpO319Cl9kb21Db250ZW50TG9hZGVkRXZlbnRGaXJlZChldmVudCl7aWYoIXRoaXMuX3JlY29yZGluZykKcmV0dXJuO2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO2lmKGRhdGEpe3RoaXMuX21haW5SZXF1ZXN0RE9NQ29udGVudExvYWRlZFRpbWU9ZGF0YTt0aGlzLl9jb2x1bW5zLmFkZEV2ZW50RGl2aWRlcnMoW2RhdGFdLCduZXR3b3JrLWJsdWUtZGl2aWRlcicpO319Cndhc1Nob3duKCl7dGhpcy5fcmVmcmVzaElmTmVlZGVkKCk7dGhpcy5fY29sdW1ucy53YXNTaG93bigpO30Kd2lsbEhpZGUoKXt0aGlzLl9jb2x1bW5zLndpbGxIaWRlKCk7fQpvblJlc2l6ZSgpe3RoaXMuX3Jvd0hlaWdodD10aGlzLl9jb21wdXRlUm93SGVpZ2h0KCk7fQpmbGF0Tm9kZXNMaXN0KCl7cmV0dXJuIHRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkuZmxhdENoaWxkcmVuKCk7fQpzdHlsZXNDaGFuZ2VkKCl7dGhpcy5fY29sdW1ucy5zY2hlZHVsZVJlZnJlc2goKTt9Cl9yZWZyZXNoKCl7dGhpcy5fbmVlZHNSZWZyZXNoPWZhbHNlO2lmKHRoaXMuX3JlZnJlc2hSZXF1ZXN0SWQpe3RoaXMuZWxlbWVudC53aW5kb3coKS5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWZyZXNoUmVxdWVzdElkKTt0aGlzLl9yZWZyZXNoUmVxdWVzdElkPW51bGw7fQp0aGlzLnJlbW92ZUFsbE5vZGVIaWdobGlnaHRzKCk7dGhpcy5fdGltZUNhbGN1bGF0b3IudXBkYXRlQm91bmRhcmllc0ZvckV2ZW50VGltZSh0aGlzLl9tYWluUmVxdWVzdExvYWRUaW1lKTt0aGlzLl9kdXJhdGlvbkNhbGN1bGF0b3IudXBkYXRlQm91bmRhcmllc0ZvckV2ZW50VGltZSh0aGlzLl9tYWluUmVxdWVzdExvYWRUaW1lKTt0aGlzLl90aW1lQ2FsY3VsYXRvci51cGRhdGVCb3VuZGFyaWVzRm9yRXZlbnRUaW1lKHRoaXMuX21haW5SZXF1ZXN0RE9NQ29udGVudExvYWRlZFRpbWUpO3RoaXMuX2R1cmF0aW9uQ2FsY3VsYXRvci51cGRhdGVCb3VuZGFyaWVzRm9yRXZlbnRUaW1lKHRoaXMuX21haW5SZXF1ZXN0RE9NQ29udGVudExvYWRlZFRpbWUpO2NvbnN0IG5vZGVzVG9JbnNlcnQ9bmV3IE1hcCgpO2NvbnN0IG5vZGVzVG9SZWZyZXNoPVtdO2NvbnN0IHN0YWxlTm9kZXM9bmV3IFNldCgpO3doaWxlKHRoaXMuX3N0YWxlUmVxdWVzdHMuc2l6ZSl7Y29uc3QgcmVxdWVzdD10aGlzLl9zdGFsZVJlcXVlc3RzLmZpcnN0VmFsdWUoKTt0aGlzLl9zdGFsZVJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0KTtsZXQgbm9kZT1yZXF1ZXN0W05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX25ldHdvcmtOb2RlU3ltYm9sXTtpZighbm9kZSkKbm9kZT10aGlzLl9jcmVhdGVOb2RlRm9yUmVxdWVzdChyZXF1ZXN0KTtzdGFsZU5vZGVzLmFkZChub2RlKTt9CmZvcihjb25zdCBub2RlIG9mIHN0YWxlTm9kZXMpe2NvbnN0IGlzRmlsdGVyZWRPdXQ9IXRoaXMuX2FwcGx5RmlsdGVyKG5vZGUpO2lmKGlzRmlsdGVyZWRPdXQmJm5vZGU9PT10aGlzLl9ob3ZlcmVkTm9kZSkKdGhpcy5fc2V0SG92ZXJlZE5vZGUobnVsbCk7aWYoIWlzRmlsdGVyZWRPdXQpCm5vZGVzVG9SZWZyZXNoLnB1c2gobm9kZSk7Y29uc3QgcmVxdWVzdD1ub2RlLnJlcXVlc3QoKTt0aGlzLl90aW1lQ2FsY3VsYXRvci51cGRhdGVCb3VuZGFyaWVzKHJlcXVlc3QpO3RoaXMuX2R1cmF0aW9uQ2FsY3VsYXRvci51cGRhdGVCb3VuZGFyaWVzKHJlcXVlc3QpO2NvbnN0IG5ld1BhcmVudD10aGlzLl9wYXJlbnROb2RlRm9ySW5zZXJ0KG5vZGUpO2lmKG5vZGVbTmV0d29yay5OZXR3b3JrTG9nVmlldy5faXNGaWx0ZXJlZE91dFN5bWJvbF09PT1pc0ZpbHRlcmVkT3V0JiZub2RlLnBhcmVudD09PW5ld1BhcmVudCkKY29udGludWU7bm9kZVtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9pc0ZpbHRlcmVkT3V0U3ltYm9sXT1pc0ZpbHRlcmVkT3V0O2NvbnN0IHJlbW92ZUZyb21QYXJlbnQ9bm9kZS5wYXJlbnQmJihpc0ZpbHRlcmVkT3V0fHxub2RlLnBhcmVudCE9PW5ld1BhcmVudCk7aWYocmVtb3ZlRnJvbVBhcmVudCl7bGV0IHBhcmVudD1ub2RlLnBhcmVudDtwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7d2hpbGUocGFyZW50JiYhcGFyZW50Lmhhc0NoaWxkcmVuKCkmJnBhcmVudC5kYXRhR3JpZCYmcGFyZW50LmRhdGFHcmlkLnJvb3ROb2RlKCkhPT1wYXJlbnQpe2NvbnN0IGdyYW5kcGFyZW50PXBhcmVudC5wYXJlbnQ7Z3JhbmRwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50KTtwYXJlbnQ9Z3JhbmRwYXJlbnQ7fX0KaWYoIW5ld1BhcmVudHx8aXNGaWx0ZXJlZE91dCkKY29udGludWU7aWYoIW5ld1BhcmVudC5kYXRhR3JpZCYmIW5vZGVzVG9JbnNlcnQuaGFzKG5ld1BhcmVudCkpe25vZGVzVG9JbnNlcnQuc2V0KG5ld1BhcmVudCx0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpKTtub2Rlc1RvUmVmcmVzaC5wdXNoKG5ld1BhcmVudCk7fQpub2Rlc1RvSW5zZXJ0LnNldChub2RlLG5ld1BhcmVudCk7fQpmb3IoY29uc3Qgbm9kZSBvZiBub2Rlc1RvSW5zZXJ0LmtleXMoKSkKbm9kZXNUb0luc2VydC5nZXQobm9kZSkuYXBwZW5kQ2hpbGQobm9kZSk7Zm9yKGNvbnN0IG5vZGUgb2Ygbm9kZXNUb1JlZnJlc2gpCm5vZGUucmVmcmVzaCgpO3RoaXMuX3VwZGF0ZVN1bW1hcnlCYXIoKTtpZihub2Rlc1RvSW5zZXJ0LnNpemUpCnRoaXMuX2NvbHVtbnMuc29ydEJ5Q3VycmVudENvbHVtbigpO3RoaXMuX2RhdGFHcmlkLnVwZGF0ZUluc3RhbnRseSgpO3RoaXMuX2RpZFJlZnJlc2hGb3JUZXN0KCk7fQpfZGlkUmVmcmVzaEZvclRlc3QoKXt9Cl9wYXJlbnROb2RlRm9ySW5zZXJ0KG5vZGUpe2lmKCF0aGlzLl9hY3RpdmVHcm91cExvb2t1cCkKcmV0dXJuIHRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCk7Y29uc3QgZ3JvdXBOb2RlPXRoaXMuX2FjdGl2ZUdyb3VwTG9va3VwLmdyb3VwTm9kZUZvclJlcXVlc3Qobm9kZS5yZXF1ZXN0KCkpO2lmKCFncm91cE5vZGUpCnJldHVybiB0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpO3JldHVybiBncm91cE5vZGU7fQpfcmVzZXQoKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkV2ZW50cy5SZXF1ZXN0U2VsZWN0ZWQsbnVsbCk7dGhpcy5fc2V0SG92ZXJlZE5vZGUobnVsbCk7dGhpcy5fY29sdW1ucy5yZXNldCgpO3RoaXMuX3RpbWVGaWx0ZXI9bnVsbDt0aGlzLl9jYWxjdWxhdG9yLnJlc2V0KCk7dGhpcy5fdGltZUNhbGN1bGF0b3Iuc2V0V2luZG93KG51bGwpO3RoaXMubGlua2lmaWVyLnJlc2V0KCk7dGhpcy5iYWRnZVBvb2wucmVzZXQoKTtpZih0aGlzLl9hY3RpdmVHcm91cExvb2t1cCkKdGhpcy5fYWN0aXZlR3JvdXBMb29rdXAucmVzZXQoKTt0aGlzLl9zdGFsZVJlcXVlc3RzLmNsZWFyKCk7dGhpcy5fcmVzZXRTdWdnZXN0aW9uQnVpbGRlcigpO3RoaXMuX21haW5SZXF1ZXN0TG9hZFRpbWU9LTE7dGhpcy5fbWFpblJlcXVlc3RET01Db250ZW50TG9hZGVkVGltZT0tMTt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fdXBkYXRlU3VtbWFyeUJhcigpO3RoaXMuX2RhdGFHcmlkLnNldFN0aWNrVG9Cb3R0b20odHJ1ZSk7dGhpcy5zY2hlZHVsZVJlZnJlc2goKTt9CnNldFRleHRGaWx0ZXJWYWx1ZShmaWx0ZXJTdHJpbmcpe3RoaXMuX3RleHRGaWx0ZXJVSS5zZXRWYWx1ZShmaWx0ZXJTdHJpbmcpO3RoaXMuX2RhdGFVUkxGaWx0ZXJVSS5zZXRDaGVja2VkKGZhbHNlKTt0aGlzLl9yZXNvdXJjZUNhdGVnb3J5RmlsdGVyVUkucmVzZXQoKTt9Cl9jcmVhdGVOb2RlRm9yUmVxdWVzdChyZXF1ZXN0KXtjb25zdCBub2RlPW5ldyBOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZSh0aGlzLHJlcXVlc3QpO3JlcXVlc3RbTmV0d29yay5OZXR3b3JrTG9nVmlldy5fbmV0d29ya05vZGVTeW1ib2xdPW5vZGU7bm9kZVtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9pc0ZpbHRlcmVkT3V0U3ltYm9sXT10cnVlO2ZvcihsZXQgcmVkaXJlY3Q9cmVxdWVzdC5yZWRpcmVjdFNvdXJjZSgpO3JlZGlyZWN0O3JlZGlyZWN0PXJlZGlyZWN0LnJlZGlyZWN0U291cmNlKCkpCnRoaXMuX3JlZnJlc2hSZXF1ZXN0KHJlZGlyZWN0KTtyZXR1cm4gbm9kZTt9Cl9vblJlcXVlc3RVcGRhdGVkKGV2ZW50KXtjb25zdCByZXF1ZXN0PShldmVudC5kYXRhKTt0aGlzLl9yZWZyZXNoUmVxdWVzdChyZXF1ZXN0KTt9Cl9yZWZyZXNoUmVxdWVzdChyZXF1ZXN0KXtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9zdWJkb21haW5zKHJlcXVlc3QuZG9tYWluKS5mb3JFYWNoKHRoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0uYmluZCh0aGlzLl9zdWdnZXN0aW9uQnVpbGRlcixOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuRG9tYWluKSk7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuTWV0aG9kLHJlcXVlc3QucmVxdWVzdE1ldGhvZCk7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuTWltZVR5cGUscmVxdWVzdC5taW1lVHlwZSk7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2NoZW1lLCcnK3JlcXVlc3Quc2NoZW1lKTt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5TdGF0dXNDb2RlLCcnK3JlcXVlc3Quc3RhdHVzQ29kZSk7Y29uc3QgcHJpb3JpdHk9cmVxdWVzdC5wcmlvcml0eSgpO2lmKHByaW9yaXR5KXt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5Qcmlvcml0eSxQZXJmVUkudWlMYWJlbEZvck5ldHdvcmtQcmlvcml0eShwcmlvcml0eSkpO30KaWYocmVxdWVzdC5taXhlZENvbnRlbnRUeXBlIT09UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5Ob25lKXt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5NaXhlZENvbnRlbnQsTmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuQWxsKTt9CmlmKHJlcXVlc3QubWl4ZWRDb250ZW50VHlwZT09PVByb3RvY29sLlNlY3VyaXR5Lk1peGVkQ29udGVudFR5cGUuT3B0aW9uYWxseUJsb2NrYWJsZSl7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuTWl4ZWRDb250ZW50LE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuTWl4ZWRDb250ZW50RmlsdGVyVmFsdWVzLkRpc3BsYXllZCk7fQppZihyZXF1ZXN0Lm1peGVkQ29udGVudFR5cGU9PT1Qcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLkJsb2NrYWJsZSl7Y29uc3Qgc3VnZ2VzdGlvbj1yZXF1ZXN0Lndhc0Jsb2NrZWQoKT9OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5CbG9ja2VkOk5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuTWl4ZWRDb250ZW50RmlsdGVyVmFsdWVzLkJsb2NrT3ZlcnJpZGRlbjt0aGlzLl9zdWdnZXN0aW9uQnVpbGRlci5hZGRJdGVtKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5NaXhlZENvbnRlbnQsc3VnZ2VzdGlvbik7fQpjb25zdCByZXNwb25zZUhlYWRlcnM9cmVxdWVzdC5yZXNwb25zZUhlYWRlcnM7Zm9yKGxldCBpPTAsbD1yZXNwb25zZUhlYWRlcnMubGVuZ3RoO2k8bDsrK2kpCnRoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkhhc1Jlc3BvbnNlSGVhZGVyLHJlc3BvbnNlSGVhZGVyc1tpXS5uYW1lKTtjb25zdCBjb29raWVzPXJlcXVlc3QucmVzcG9uc2VDb29raWVzO2ZvcihsZXQgaT0wLGw9Y29va2llcz9jb29raWVzLmxlbmd0aDowO2k8bDsrK2kpe2NvbnN0IGNvb2tpZT1jb29raWVzW2ldO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLlNldENvb2tpZURvbWFpbixjb29raWUuZG9tYWluKCkpO3RoaXMuX3N1Z2dlc3Rpb25CdWlsZGVyLmFkZEl0ZW0oTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLlNldENvb2tpZU5hbWUsY29va2llLm5hbWUoKSk7dGhpcy5fc3VnZ2VzdGlvbkJ1aWxkZXIuYWRkSXRlbShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2V0Q29va2llVmFsdWUsY29va2llLnZhbHVlKCkpO30KdGhpcy5fc3RhbGVSZXF1ZXN0cy5hZGQocmVxdWVzdCk7dGhpcy5zY2hlZHVsZVJlZnJlc2goKTt9CnJvd0hlaWdodCgpe3JldHVybiB0aGlzLl9yb3dIZWlnaHQ7fQpzd2l0Y2hWaWV3TW9kZShncmlkTW9kZSl7dGhpcy5fY29sdW1ucy5zd2l0Y2hWaWV3TW9kZShncmlkTW9kZSk7fQpoYW5kbGVDb250ZXh0TWVudUZvclJlcXVlc3QoY29udGV4dE1lbnUscmVxdWVzdCl7Y29udGV4dE1lbnUuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHJlcXVlc3QpO2xldCBjb3B5TWVudT1jb250ZXh0TWVudS5jbGlwYm9hcmRTZWN0aW9uKCkuYXBwZW5kU3ViTWVudUl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5JykpO2NvbnN0IGZvb3RlclNlY3Rpb249Y29weU1lbnUuZm9vdGVyU2VjdGlvbigpO2lmKHJlcXVlc3Qpe2NvcHlNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShVSS5jb3B5TGlua0FkZHJlc3NMYWJlbCgpLEluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dC5iaW5kKEluc3BlY3RvckZyb250ZW5kSG9zdCxyZXF1ZXN0LmNvbnRlbnRVUkwoKSkpO2lmKHJlcXVlc3QucmVxdWVzdEhlYWRlcnNUZXh0KCkpe2NvcHlNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgcmVxdWVzdCBoZWFkZXJzJyksTmV0d29yay5OZXR3b3JrTG9nVmlldy5fY29weVJlcXVlc3RIZWFkZXJzLmJpbmQobnVsbCxyZXF1ZXN0KSk7fQppZihyZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQpe2NvcHlNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgcmVzcG9uc2UgaGVhZGVycycpLE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX2NvcHlSZXNwb25zZUhlYWRlcnMuYmluZChudWxsLHJlcXVlc3QpKTt9CmlmKHJlcXVlc3QuZmluaXNoZWQpe2NvcHlNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgcmVzcG9uc2UnKSxOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9jb3B5UmVzcG9uc2UuYmluZChudWxsLHJlcXVlc3QpKTt9CmlmKEhvc3QuaXNXaW4oKSl7Zm9vdGVyU2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBhcyBQb3dlclNoZWxsJyksdGhpcy5fY29weVBvd2VyU2hlbGxDb21tYW5kLmJpbmQodGhpcyxyZXF1ZXN0KSk7Zm9vdGVyU2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBhcyBmZXRjaCcpLHRoaXMuX2NvcHlGZXRjaENhbGwuYmluZCh0aGlzLHJlcXVlc3QpKTtmb290ZXJTZWN0aW9uLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGFzIGNVUkwgKGNtZCknKSx0aGlzLl9jb3B5Q3VybENvbW1hbmQuYmluZCh0aGlzLHJlcXVlc3QsJ3dpbicpKTtmb290ZXJTZWN0aW9uLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGFzIGNVUkwgKGJhc2gpJyksdGhpcy5fY29weUN1cmxDb21tYW5kLmJpbmQodGhpcyxyZXF1ZXN0LCd1bml4JykpO2Zvb3RlclNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgYWxsIGFzIFBvd2VyU2hlbGwnKSx0aGlzLl9jb3B5QWxsUG93ZXJTaGVsbENvbW1hbmQuYmluZCh0aGlzKSk7Zm9vdGVyU2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBhbGwgYXMgZmV0Y2gnKSx0aGlzLl9jb3B5QWxsRmV0Y2hDYWxsLmJpbmQodGhpcykpO2Zvb3RlclNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgYWxsIGFzIGNVUkwgKGNtZCknKSx0aGlzLl9jb3B5QWxsQ3VybENvbW1hbmQuYmluZCh0aGlzLCd3aW4nKSk7Zm9vdGVyU2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBhbGwgYXMgY1VSTCAoYmFzaCknKSx0aGlzLl9jb3B5QWxsQ3VybENvbW1hbmQuYmluZCh0aGlzLCd1bml4JykpO31lbHNle2Zvb3RlclNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgYXMgZmV0Y2gnKSx0aGlzLl9jb3B5RmV0Y2hDYWxsLmJpbmQodGhpcyxyZXF1ZXN0KSk7Zm9vdGVyU2VjdGlvbi5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSBhcyBjVVJMJyksdGhpcy5fY29weUN1cmxDb21tYW5kLmJpbmQodGhpcyxyZXF1ZXN0LCd1bml4JykpO2Zvb3RlclNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgYWxsIGFzIGZldGNoJyksdGhpcy5fY29weUFsbEZldGNoQ2FsbC5iaW5kKHRoaXMpKTtmb290ZXJTZWN0aW9uLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGFsbCBhcyBjVVJMJyksdGhpcy5fY29weUFsbEN1cmxDb21tYW5kLmJpbmQodGhpcywndW5peCcpKTt9fWVsc2V7Y29weU1lbnU9Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weScpKTt9CmZvb3RlclNlY3Rpb24uYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgYWxsIGFzIEhBUicpLHRoaXMuX2NvcHlBbGwuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuc2F2ZVNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnU2F2ZSBhcyBIQVIgd2l0aCBjb250ZW50JyksdGhpcy5fZXhwb3J0QWxsLmJpbmQodGhpcykpO2NvbnRleHRNZW51LmVkaXRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NsZWFyIGJyb3dzZXIgY2FjaGUnKSx0aGlzLl9jbGVhckJyb3dzZXJDYWNoZS5iaW5kKHRoaXMpKTtjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBicm93c2VyIGNvb2tpZXMnKSx0aGlzLl9jbGVhckJyb3dzZXJDb29raWVzLmJpbmQodGhpcykpO2lmKHJlcXVlc3Qpe2NvbnN0IG1heEJsb2NrZWRVUkxMZW5ndGg9MjA7Y29uc3QgbWFuYWdlcj1TREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlcjtsZXQgcGF0dGVybnM9bWFuYWdlci5ibG9ja2VkUGF0dGVybnMoKTtjb25zdCB1cmxXaXRob3V0U2NoZW1lPXJlcXVlc3QucGFyc2VkVVJMLnVybFdpdGhvdXRTY2hlbWUoKTtpZih1cmxXaXRob3V0U2NoZW1lJiYhcGF0dGVybnMuZmluZChwYXR0ZXJuPT5wYXR0ZXJuLnVybD09PXVybFdpdGhvdXRTY2hlbWUpKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQmxvY2sgcmVxdWVzdCBVUkwnKSxhZGRCbG9ja2VkVVJMLmJpbmQobnVsbCx1cmxXaXRob3V0U2NoZW1lKSk7fWVsc2UgaWYodXJsV2l0aG91dFNjaGVtZSl7Y29uc3QgY3JvcHBlZFVSTD11cmxXaXRob3V0U2NoZW1lLnRyaW1NaWRkbGUobWF4QmxvY2tlZFVSTExlbmd0aCk7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1VuYmxvY2sgJXMnLGNyb3BwZWRVUkwpLHJlbW92ZUJsb2NrZWRVUkwuYmluZChudWxsLHVybFdpdGhvdXRTY2hlbWUpKTt9CmNvbnN0IGRvbWFpbj1yZXF1ZXN0LnBhcnNlZFVSTC5kb21haW4oKTtpZihkb21haW4mJiFwYXR0ZXJucy5maW5kKHBhdHRlcm49PnBhdHRlcm4udXJsPT09ZG9tYWluKSl7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0Jsb2NrIHJlcXVlc3QgZG9tYWluJyksYWRkQmxvY2tlZFVSTC5iaW5kKG51bGwsZG9tYWluKSk7fWVsc2UgaWYoZG9tYWluKXtjb25zdCBjcm9wcGVkRG9tYWluPWRvbWFpbi50cmltTWlkZGxlKG1heEJsb2NrZWRVUkxMZW5ndGgpO2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdVbmJsb2NrICVzJyxjcm9wcGVkRG9tYWluKSxyZW1vdmVCbG9ja2VkVVJMLmJpbmQobnVsbCxkb21haW4pKTt9CmlmKFNESy5OZXR3b3JrTWFuYWdlci5jYW5SZXBsYXlSZXF1ZXN0KHJlcXVlc3QpKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVwbGF5IFhIUicpLFNESy5OZXR3b3JrTWFuYWdlci5yZXBsYXlSZXF1ZXN0LmJpbmQobnVsbCxyZXF1ZXN0KSk7fQpmdW5jdGlvbiBhZGRCbG9ja2VkVVJMKHVybCl7cGF0dGVybnMucHVzaCh7ZW5hYmxlZDp0cnVlLHVybDp1cmx9KTttYW5hZ2VyLnNldEJsb2NrZWRQYXR0ZXJucyhwYXR0ZXJucyk7bWFuYWdlci5zZXRCbG9ja2luZ0VuYWJsZWQodHJ1ZSk7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsuYmxvY2tlZC11cmxzJyk7fQpmdW5jdGlvbiByZW1vdmVCbG9ja2VkVVJMKHVybCl7cGF0dGVybnM9cGF0dGVybnMuZmlsdGVyKHBhdHRlcm49PnBhdHRlcm4udXJsIT09dXJsKTttYW5hZ2VyLnNldEJsb2NrZWRQYXR0ZXJucyhwYXR0ZXJucyk7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsuYmxvY2tlZC11cmxzJyk7fX19Cl9oYXJSZXF1ZXN0cygpe2NvbnN0IGh0dHBSZXF1ZXN0cz1Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVxdWVzdHMoKS5maWx0ZXIoTmV0d29yay5OZXR3b3JrTG9nVmlldy5IVFRQUmVxdWVzdHNGaWx0ZXIpO3JldHVybiBodHRwUmVxdWVzdHMuZmlsdGVyKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmluaXNoZWRSZXF1ZXN0c0ZpbHRlcik7fQphc3luYyBfY29weUFsbCgpe2NvbnN0IGhhckFyY2hpdmU9e2xvZzphd2FpdCBCcm93c2VyU0RLLkhBUkxvZy5idWlsZCh0aGlzLl9oYXJSZXF1ZXN0cygpKX07SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KEpTT04uc3RyaW5naWZ5KGhhckFyY2hpdmUsbnVsbCwyKSk7fQphc3luYyBfY29weUN1cmxDb21tYW5kKHJlcXVlc3QscGxhdGZvcm0pe2NvbnN0IGNvbW1hbmQ9YXdhaXQgdGhpcy5fZ2VuZXJhdGVDdXJsQ29tbWFuZChyZXF1ZXN0LHBsYXRmb3JtKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQoY29tbWFuZCk7fQphc3luYyBfY29weUFsbEN1cmxDb21tYW5kKHBsYXRmb3JtKXtjb25zdCByZXF1ZXN0cz1Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVxdWVzdHMoKTtjb25zdCBjb21tYW5kcz1hd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cy5tYXAocmVxdWVzdD0+dGhpcy5fZ2VuZXJhdGVDdXJsQ29tbWFuZChyZXF1ZXN0LHBsYXRmb3JtKSkpO2lmKHBsYXRmb3JtPT09J3dpbicpCkluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChjb21tYW5kcy5qb2luKCcgJlxyXG4nKSk7ZWxzZQpJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQoY29tbWFuZHMuam9pbignIDtcbicpKTt9CmFzeW5jIF9jb3B5RmV0Y2hDYWxsKHJlcXVlc3QscGxhdGZvcm0pe2NvbnN0IGNvbW1hbmQ9YXdhaXQgdGhpcy5fZ2VuZXJhdGVGZXRjaENhbGwocmVxdWVzdCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KGNvbW1hbmQpO30KYXN5bmMgX2NvcHlBbGxGZXRjaENhbGwoKXtjb25zdCByZXF1ZXN0cz1Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVxdWVzdHMoKTtjb25zdCBjb21tYW5kcz1hd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cy5tYXAocmVxdWVzdD0+dGhpcy5fZ2VuZXJhdGVGZXRjaENhbGwocmVxdWVzdCkpKTtJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQoY29tbWFuZHMuam9pbignIDtcbicpKTt9CmFzeW5jIF9jb3B5UG93ZXJTaGVsbENvbW1hbmQocmVxdWVzdCl7Y29uc3QgY29tbWFuZD1hd2FpdCB0aGlzLl9nZW5lcmF0ZVBvd2VyU2hlbGxDb21tYW5kKHJlcXVlc3QpO0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChjb21tYW5kKTt9CmFzeW5jIF9jb3B5QWxsUG93ZXJTaGVsbENvbW1hbmQoKXtjb25zdCByZXF1ZXN0cz1Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVxdWVzdHMoKTtjb25zdCBjb21tYW5kcz1hd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cy5tYXAocmVxdWVzdD0+dGhpcy5fZ2VuZXJhdGVQb3dlclNoZWxsQ29tbWFuZChyZXF1ZXN0KSkpO0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChjb21tYW5kcy5qb2luKCc7XHJcbicpKTt9CmFzeW5jIF9leHBvcnRBbGwoKXtjb25zdCB1cmw9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmluc3BlY3RlZFVSTCgpO2NvbnN0IHBhcnNlZFVSTD11cmwuYXNQYXJzZWRVUkwoKTtjb25zdCBmaWxlbmFtZT1wYXJzZWRVUkw/cGFyc2VkVVJMLmhvc3Q6J25ldHdvcmstbG9nJztjb25zdCBzdHJlYW09bmV3IEJpbmRpbmdzLkZpbGVPdXRwdXRTdHJlYW0oKTtpZighYXdhaXQgc3RyZWFtLm9wZW4oZmlsZW5hbWUrJy5oYXInKSkKcmV0dXJuO2NvbnN0IHByb2dyZXNzSW5kaWNhdG9yPW5ldyBVSS5Qcm9ncmVzc0luZGljYXRvcigpO3RoaXMuX3Byb2dyZXNzQmFyQ29udGFpbmVyLmFwcGVuZENoaWxkKHByb2dyZXNzSW5kaWNhdG9yLmVsZW1lbnQpO2F3YWl0IE5ldHdvcmsuSEFSV3JpdGVyLndyaXRlKHN0cmVhbSx0aGlzLl9oYXJSZXF1ZXN0cygpLHByb2dyZXNzSW5kaWNhdG9yKTtwcm9ncmVzc0luZGljYXRvci5kb25lKCk7c3RyZWFtLmNsb3NlKCk7fQpfY2xlYXJCcm93c2VyQ2FjaGUoKXtpZihjb25maXJtKENvbW1vbi5VSVN0cmluZygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFyIGJyb3dzZXIgY2FjaGU/JykpKQpTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5jbGVhckJyb3dzZXJDYWNoZSgpO30KX2NsZWFyQnJvd3NlckNvb2tpZXMoKXtpZihjb25maXJtKENvbW1vbi5VSVN0cmluZygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFyIGJyb3dzZXIgY29va2llcz8nKSkpClNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmNsZWFyQnJvd3NlckNvb2tpZXMoKTt9Cl9yZW1vdmVBbGxIaWdobGlnaHRzKCl7dGhpcy5yZW1vdmVBbGxOb2RlSGlnaGxpZ2h0cygpO2ZvcihsZXQgaT0wO2k8dGhpcy5faGlnaGxpZ2h0ZWRTdWJzdHJpbmdDaGFuZ2VzLmxlbmd0aDsrK2kpClVJLnJldmVydERvbUNoYW5nZXModGhpcy5faGlnaGxpZ2h0ZWRTdWJzdHJpbmdDaGFuZ2VzW2ldKTt0aGlzLl9oaWdobGlnaHRlZFN1YnN0cmluZ0NoYW5nZXM9W107fQpfYXBwbHlGaWx0ZXIobm9kZSl7Y29uc3QgcmVxdWVzdD1ub2RlLnJlcXVlc3QoKTtpZih0aGlzLl90aW1lRmlsdGVyJiYhdGhpcy5fdGltZUZpbHRlcihyZXF1ZXN0KSkKcmV0dXJuIGZhbHNlO2NvbnN0IGNhdGVnb3J5TmFtZT1yZXF1ZXN0LnJlc291cmNlVHlwZSgpLmNhdGVnb3J5KCkudGl0bGU7aWYoIXRoaXMuX3Jlc291cmNlQ2F0ZWdvcnlGaWx0ZXJVSS5hY2NlcHQoY2F0ZWdvcnlOYW1lKSkKcmV0dXJuIGZhbHNlO2lmKHRoaXMuX2RhdGFVUkxGaWx0ZXJVSS5jaGVja2VkKCkmJnJlcXVlc3QucGFyc2VkVVJMLmlzRGF0YVVSTCgpKQpyZXR1cm4gZmFsc2U7aWYocmVxdWVzdC5zdGF0dXNUZXh0PT09J1NlcnZpY2UgV29ya2VyIEZhbGxiYWNrIFJlcXVpcmVkJykKcmV0dXJuIGZhbHNlO2ZvcihsZXQgaT0wO2k8dGhpcy5fZmlsdGVycy5sZW5ndGg7KytpKXtpZighdGhpcy5fZmlsdGVyc1tpXShyZXF1ZXN0KSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fQpfcGFyc2VGaWx0ZXJRdWVyeShxdWVyeSl7Y29uc3QgZGVzY3JpcHRvcnM9dGhpcy5fZmlsdGVyUGFyc2VyLnBhcnNlKHF1ZXJ5KTt0aGlzLl9maWx0ZXJzPWRlc2NyaXB0b3JzLm1hcChkZXNjcmlwdG9yPT57Y29uc3Qga2V5PWRlc2NyaXB0b3Iua2V5O2NvbnN0IHRleHQ9ZGVzY3JpcHRvci50ZXh0fHwnJztjb25zdCByZWdleD1kZXNjcmlwdG9yLnJlZ2V4O2xldCBmaWx0ZXI7aWYoa2V5KXtjb25zdCBkZWZhdWx0VGV4dD0oa2V5Kyc6Jyt0ZXh0KS5lc2NhcGVGb3JSZWdFeHAoKTtmaWx0ZXI9dGhpcy5fY3JlYXRlU3BlY2lhbEZpbHRlcigoa2V5KSx0ZXh0KXx8TmV0d29yay5OZXR3b3JrTG9nVmlldy5fcmVxdWVzdFBhdGhGaWx0ZXIuYmluZChudWxsLG5ldyBSZWdFeHAoZGVmYXVsdFRleHQsJ2knKSk7fWVsc2UgaWYoZGVzY3JpcHRvci5yZWdleCl7ZmlsdGVyPU5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3RQYXRoRmlsdGVyLmJpbmQobnVsbCwocmVnZXgpKTt9ZWxzZXtmaWx0ZXI9TmV0d29yay5OZXR3b3JrTG9nVmlldy5fcmVxdWVzdFBhdGhGaWx0ZXIuYmluZChudWxsLG5ldyBSZWdFeHAodGV4dC5lc2NhcGVGb3JSZWdFeHAoKSwnaScpKTt9CnJldHVybiBkZXNjcmlwdG9yLm5lZ2F0aXZlP05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX25lZ2F0aXZlRmlsdGVyLmJpbmQobnVsbCxmaWx0ZXIpOmZpbHRlcjt9KTt9Cl9jcmVhdGVTcGVjaWFsRmlsdGVyKHR5cGUsdmFsdWUpe3N3aXRjaCh0eXBlKXtjYXNlIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5Eb21haW46cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX2NyZWF0ZVJlcXVlc3REb21haW5GaWx0ZXIodmFsdWUpO2Nhc2UgTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkhhc1Jlc3BvbnNlSGVhZGVyOnJldHVybiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9yZXF1ZXN0UmVzcG9uc2VIZWFkZXJGaWx0ZXIuYmluZChudWxsLHZhbHVlKTtjYXNlIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5JczppZih2YWx1ZS50b0xvd2VyQ2FzZSgpPT09TmV0d29yay5OZXR3b3JrTG9nVmlldy5Jc0ZpbHRlclR5cGUuUnVubmluZykKcmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3J1bm5pbmdSZXF1ZXN0RmlsdGVyO2lmKHZhbHVlLnRvTG93ZXJDYXNlKCk9PT1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3LklzRmlsdGVyVHlwZS5Gcm9tQ2FjaGUpCnJldHVybiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9mcm9tQ2FjaGVSZXF1ZXN0RmlsdGVyO2JyZWFrO2Nhc2UgTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLkxhcmdlclRoYW46cmV0dXJuIHRoaXMuX2NyZWF0ZVNpemVGaWx0ZXIodmFsdWUudG9Mb3dlckNhc2UoKSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuTWV0aG9kOnJldHVybiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9yZXF1ZXN0TWV0aG9kRmlsdGVyLmJpbmQobnVsbCx2YWx1ZSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuTWltZVR5cGU6cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3RNaW1lVHlwZUZpbHRlci5iaW5kKG51bGwsdmFsdWUpO2Nhc2UgTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLk1peGVkQ29udGVudDpyZXR1cm4gTmV0d29yay5OZXR3b3JrTG9nVmlldy5fcmVxdWVzdE1peGVkQ29udGVudEZpbHRlci5iaW5kKG51bGwsKHZhbHVlKSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2NoZW1lOnJldHVybiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9yZXF1ZXN0U2NoZW1lRmlsdGVyLmJpbmQobnVsbCx2YWx1ZSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2V0Q29va2llRG9tYWluOnJldHVybiBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9yZXF1ZXN0U2V0Q29va2llRG9tYWluRmlsdGVyLmJpbmQobnVsbCx2YWx1ZSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2V0Q29va2llTmFtZTpyZXR1cm4gTmV0d29yay5OZXR3b3JrTG9nVmlldy5fcmVxdWVzdFNldENvb2tpZU5hbWVGaWx0ZXIuYmluZChudWxsLHZhbHVlKTtjYXNlIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZS5TZXRDb29raWVWYWx1ZTpyZXR1cm4gTmV0d29yay5OZXR3b3JrTG9nVmlldy5fcmVxdWVzdFNldENvb2tpZVZhbHVlRmlsdGVyLmJpbmQobnVsbCx2YWx1ZSk7Y2FzZSBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuUHJpb3JpdHk6cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3RQcmlvcml0eUZpbHRlci5iaW5kKG51bGwsUGVyZlVJLnVpTGFiZWxUb05ldHdvcmtQcmlvcml0eSh2YWx1ZSkpO2Nhc2UgTmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLlN0YXR1c0NvZGU6cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3N0YXR1c0NvZGVGaWx0ZXIuYmluZChudWxsLHZhbHVlKTt9CnJldHVybiBudWxsO30KX2NyZWF0ZVNpemVGaWx0ZXIodmFsdWUpe2xldCBtdWx0aXBsaWVyPTE7aWYodmFsdWUuZW5kc1dpdGgoJ2snKSl7bXVsdGlwbGllcj0xMDI0O3ZhbHVlPXZhbHVlLnN1YnN0cmluZygwLHZhbHVlLmxlbmd0aC0xKTt9ZWxzZSBpZih2YWx1ZS5lbmRzV2l0aCgnbScpKXttdWx0aXBsaWVyPTEwMjQqMTAyNDt2YWx1ZT12YWx1ZS5zdWJzdHJpbmcoMCx2YWx1ZS5sZW5ndGgtMSk7fQpjb25zdCBxdWFudGl0eT1OdW1iZXIodmFsdWUpO2lmKGlzTmFOKHF1YW50aXR5KSkKcmV0dXJuIG51bGw7cmV0dXJuIE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuX3JlcXVlc3RTaXplTGFyZ2VyVGhhbkZpbHRlci5iaW5kKG51bGwscXVhbnRpdHkqbXVsdGlwbGllcik7fQpfZmlsdGVyUmVxdWVzdHMoKXt0aGlzLl9yZW1vdmVBbGxIaWdobGlnaHRzKCk7dGhpcy5faW52YWxpZGF0ZUFsbEl0ZW1zKCk7fQpfcmV2ZWFsKHJlcXVlc3Qpe3RoaXMucmVtb3ZlQWxsTm9kZUhpZ2hsaWdodHMoKTtjb25zdCBub2RlPXJlcXVlc3RbTmV0d29yay5OZXR3b3JrTG9nVmlldy5fbmV0d29ya05vZGVTeW1ib2xdO2lmKCFub2RlfHwhbm9kZS5kYXRhR3JpZCkKcmV0dXJuIG51bGw7bm9kZS5yZXZlYWwoKTtyZXR1cm4gbm9kZTt9CnJldmVhbEFuZEhpZ2hsaWdodFJlcXVlc3QocmVxdWVzdCl7Y29uc3Qgbm9kZT10aGlzLl9yZXZlYWwocmVxdWVzdCk7aWYobm9kZSkKdGhpcy5faGlnaGxpZ2h0Tm9kZShub2RlKTt9CnNlbGVjdFJlcXVlc3QocmVxdWVzdCl7dGhpcy5zZXRUZXh0RmlsdGVyVmFsdWUoJycpO2NvbnN0IG5vZGU9dGhpcy5fcmV2ZWFsKHJlcXVlc3QpO2lmKG5vZGUpCm5vZGUuc2VsZWN0KCk7fQpyZW1vdmVBbGxOb2RlSGlnaGxpZ2h0cygpe2lmKHRoaXMuX2hpZ2hsaWdodGVkTm9kZSl7dGhpcy5faGlnaGxpZ2h0ZWROb2RlLmVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHRlZC1yb3cnKTt0aGlzLl9oaWdobGlnaHRlZE5vZGU9bnVsbDt9fQpfaGlnaGxpZ2h0Tm9kZShub2RlKXtVSS5ydW5DU1NBbmltYXRpb25PbmNlKG5vZGUuZWxlbWVudCgpLCdoaWdobGlnaHRlZC1yb3cnKTt0aGlzLl9oaWdobGlnaHRlZE5vZGU9bm9kZTt9CmFzeW5jIF9nZW5lcmF0ZUZldGNoQ2FsbChyZXF1ZXN0KXtjb25zdCBpZ25vcmVkSGVhZGVycz17J21ldGhvZCc6MSwncGF0aCc6MSwnc2NoZW1lJzoxLCd2ZXJzaW9uJzoxLCdhY2NlcHQtY2hhcnNldCc6MSwnYWNjZXB0LWVuY29kaW5nJzoxLCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LWhlYWRlcnMnOjEsJ2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtbWV0aG9kJzoxLCdjb25uZWN0aW9uJzoxLCdjb250ZW50LWxlbmd0aCc6MSwnY29va2llJzoxLCdjb29raWUyJzoxLCdkYXRlJzoxLCdkbnQnOjEsJ2V4cGVjdCc6MSwnaG9zdCc6MSwna2VlcC1hbGl2ZSc6MSwnb3JpZ2luJzoxLCdyZWZlcmVyJzoxLCd0ZSc6MSwndHJhaWxlcic6MSwndHJhbnNmZXItZW5jb2RpbmcnOjEsJ3VwZ3JhZGUnOjEsJ3ZpYSc6MSwndXNlci1hZ2VudCc6MX07Y29uc3QgY3JlZGVudGlhbEhlYWRlcnM9eydjb29raWUnOjEsJ2F1dGhvcml6YXRpb24nOjF9O2NvbnN0IHVybD1KU09OLnN0cmluZ2lmeShyZXF1ZXN0LnVybCgpKTtjb25zdCByZXF1ZXN0SGVhZGVycz1yZXF1ZXN0LnJlcXVlc3RIZWFkZXJzKCk7Y29uc3QgaGVhZGVyRGF0YT1yZXF1ZXN0SGVhZGVycy5yZWR1Y2UoKHJlc3VsdCxoZWFkZXIpPT57Y29uc3QgbmFtZT1oZWFkZXIubmFtZTtpZighaWdub3JlZEhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXSYmIW5hbWUuaW5jbHVkZXMoJzonKSkKcmVzdWx0LmFwcGVuZChuYW1lLGhlYWRlci52YWx1ZSk7cmV0dXJuIHJlc3VsdDt9LG5ldyBIZWFkZXJzKCkpO2NvbnN0IGhlYWRlcnM9e307Zm9yKGNvbnN0IGhlYWRlckFycmF5IG9mIGhlYWRlckRhdGEpCmhlYWRlcnNbaGVhZGVyQXJyYXlbMF1dPWhlYWRlcnNbaGVhZGVyQXJyYXlbMV1dO2NvbnN0IGNyZWRlbnRpYWxzPXJlcXVlc3QucmVxdWVzdENvb2tpZXN8fHJlcXVlc3RIZWFkZXJzLnNvbWUoKHtuYW1lfSk9PmNyZWRlbnRpYWxIZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV0pPydpbmNsdWRlJzonb21pdCc7Y29uc3QgcmVmZXJyZXJIZWFkZXI9cmVxdWVzdEhlYWRlcnMuZmluZCgoe25hbWV9KT0+bmFtZS50b0xvd2VyQ2FzZSgpPT09J3JlZmVyZXInKTtjb25zdCByZWZlcnJlcj1yZWZlcnJlckhlYWRlcj9yZWZlcnJlckhlYWRlci52YWx1ZTp2b2lkIDA7Y29uc3QgcmVmZXJyZXJQb2xpY3k9cmVxdWVzdC5yZWZlcnJlclBvbGljeSgpfHx2b2lkIDA7Y29uc3QgcmVxdWVzdEJvZHk9YXdhaXQgcmVxdWVzdC5yZXF1ZXN0Rm9ybURhdGEoKTtjb25zdCBmZXRjaE9wdGlvbnM9e2NyZWRlbnRpYWxzLGhlYWRlcnMscmVmZXJyZXIscmVmZXJyZXJQb2xpY3ksYm9keTpyZXF1ZXN0Qm9keSxtZXRob2Q6cmVxdWVzdC5yZXF1ZXN0TWV0aG9kLG1vZGU6J2NvcnMnfTtjb25zdCBvcHRpb25zPUpTT04uc3RyaW5naWZ5KGZldGNoT3B0aW9ucyk7cmV0dXJuYGZldGNoKCR7dXJsfSwgJHtvcHRpb25zfSk7YDt9CmFzeW5jIF9nZW5lcmF0ZUN1cmxDb21tYW5kKHJlcXVlc3QscGxhdGZvcm0pe2xldCBjb21tYW5kPVsnY3VybCddO2NvbnN0IGlnbm9yZWRIZWFkZXJzPXsnaG9zdCc6MSwnbWV0aG9kJzoxLCdwYXRoJzoxLCdzY2hlbWUnOjEsJ3ZlcnNpb24nOjF9O2Z1bmN0aW9uIGVzY2FwZVN0cmluZ1dpbihzdHIpe2NvbnN0IGVuY2Fwc0NoYXJzPS9bXHJcbl0vLnRlc3Qoc3RyKT8nXiInOiciJztyZXR1cm4gZW5jYXBzQ2hhcnMrCnN0ci5yZXBsYWNlKC9cXC9nLCdcXFxcJykucmVwbGFjZSgvIi9nLCdcXCInKS5yZXBsYWNlKC9bXmEtekEtWjAtOVxzX1wtOj0rfidcLy4nLD87KCkqYF0vZywnXiQmJykucmVwbGFjZSgvJSg/PVthLXpBLVowLTlfXSkvZywnJV4nKS5yZXBsYWNlKC9cclxufFtcblxyXS9nLCdeXG5cbicpKwplbmNhcHNDaGFyczt9CmZ1bmN0aW9uIGVzY2FwZVN0cmluZ1Bvc2l4KHN0cil7ZnVuY3Rpb24gZXNjYXBlQ2hhcmFjdGVyKHgpe2xldCBjb2RlPXguY2hhckNvZGVBdCgwKTtpZihjb2RlPDI1Nil7cmV0dXJuIGNvZGU8MTY/J1xceDAnK2NvZGUudG9TdHJpbmcoMTYpOidcXHgnK2NvZGUudG9TdHJpbmcoMTYpO30KY29kZT1jb2RlLnRvU3RyaW5nKDE2KTtyZXR1cm4nXFx1JysoJzAwMDAnK2NvZGUpLnN1YnN0cihjb2RlLmxlbmd0aCw0KTt9CmlmKC9bXlx4MjAtXHg3RV18XCcvLnRlc3Qoc3RyKSl7cmV0dXJuJyRcJycrCnN0ci5yZXBsYWNlKC9cXC9nLCdcXFxcJykucmVwbGFjZSgvXCcvZywnXFxcJycpLnJlcGxhY2UoL1xuL2csJ1xcbicpLnJlcGxhY2UoL1xyL2csJ1xccicpLnJlcGxhY2UoL1teXHgyMC1ceDdFXS9nLGVzY2FwZUNoYXJhY3RlcikrJ1wnJzt9ZWxzZXtyZXR1cm4nXCcnK3N0cisnXCcnO319CmNvbnN0IGVzY2FwZVN0cmluZz1wbGF0Zm9ybT09PSd3aW4nP2VzY2FwZVN0cmluZ1dpbjplc2NhcGVTdHJpbmdQb3NpeDtjb21tYW5kLnB1c2goZXNjYXBlU3RyaW5nKHJlcXVlc3QudXJsKCkpLnJlcGxhY2UoL1tbe31cXV0vZywnXFwkJicpKTtsZXQgaW5mZXJyZWRNZXRob2Q9J0dFVCc7Y29uc3QgZGF0YT1bXTtjb25zdCByZXF1ZXN0Q29udGVudFR5cGU9cmVxdWVzdC5yZXF1ZXN0Q29udGVudFR5cGUoKTtjb25zdCBmb3JtRGF0YT1hd2FpdCByZXF1ZXN0LnJlcXVlc3RGb3JtRGF0YSgpO2lmKHJlcXVlc3RDb250ZW50VHlwZSYmcmVxdWVzdENvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpJiZmb3JtRGF0YSl7ZGF0YS5wdXNoKCctLWRhdGEnKTtkYXRhLnB1c2goZXNjYXBlU3RyaW5nKGZvcm1EYXRhKSk7aWdub3JlZEhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ109dHJ1ZTtpbmZlcnJlZE1ldGhvZD0nUE9TVCc7fWVsc2UgaWYoZm9ybURhdGEpe2RhdGEucHVzaCgnLS1kYXRhLWJpbmFyeScpO2RhdGEucHVzaChlc2NhcGVTdHJpbmcoZm9ybURhdGEpKTtpZ25vcmVkSGVhZGVyc1snY29udGVudC1sZW5ndGgnXT10cnVlO2luZmVycmVkTWV0aG9kPSdQT1NUJzt9CmlmKHJlcXVlc3QucmVxdWVzdE1ldGhvZCE9PWluZmVycmVkTWV0aG9kKXtjb21tYW5kLnB1c2goJy1YJyk7Y29tbWFuZC5wdXNoKHJlcXVlc3QucmVxdWVzdE1ldGhvZCk7fQpjb25zdCByZXF1ZXN0SGVhZGVycz1yZXF1ZXN0LnJlcXVlc3RIZWFkZXJzKCk7Zm9yKGxldCBpPTA7aTxyZXF1ZXN0SGVhZGVycy5sZW5ndGg7aSsrKXtjb25zdCBoZWFkZXI9cmVxdWVzdEhlYWRlcnNbaV07Y29uc3QgbmFtZT1oZWFkZXIubmFtZS5yZXBsYWNlKC9eOi8sJycpO2lmKG5hbWUudG9Mb3dlckNhc2UoKWluIGlnbm9yZWRIZWFkZXJzKQpjb250aW51ZTtjb21tYW5kLnB1c2goJy1IJyk7Y29tbWFuZC5wdXNoKGVzY2FwZVN0cmluZyhuYW1lKyc6ICcraGVhZGVyLnZhbHVlKSk7fQpjb21tYW5kPWNvbW1hbmQuY29uY2F0KGRhdGEpO2NvbW1hbmQucHVzaCgnLS1jb21wcmVzc2VkJyk7aWYocmVxdWVzdC5zZWN1cml0eVN0YXRlKCk9PT1Qcm90b2NvbC5TZWN1cml0eS5TZWN1cml0eVN0YXRlLkluc2VjdXJlKQpjb21tYW5kLnB1c2goJy0taW5zZWN1cmUnKTtyZXR1cm4gY29tbWFuZC5qb2luKCcgJyk7fQphc3luYyBfZ2VuZXJhdGVQb3dlclNoZWxsQ29tbWFuZChyZXF1ZXN0KXtjb25zdCBjb21tYW5kPVsnSW52b2tlLVdlYlJlcXVlc3QnXTtjb25zdCBpZ25vcmVkSGVhZGVycz1uZXcgU2V0KFsnaG9zdCcsJ2Nvbm5lY3Rpb24nLCdwcm94eS1jb25uZWN0aW9uJywnY29udGVudC1sZW5ndGgnLCdleHBlY3QnLCdyYW5nZScsJ2NvbnRlbnQtdHlwZSddKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKXtyZXR1cm4nIicrCnN0ci5yZXBsYWNlKC9bYFwkIl0vZywnYCQmJykucmVwbGFjZSgvW15ceDIwLVx4N0VdL2csY2hhcj0+JyQoW2NoYXJdJytjaGFyLmNoYXJDb2RlQXQoMCkrJyknKSsnIic7fQpjb21tYW5kLnB1c2goJy1VcmknKTtjb21tYW5kLnB1c2goZXNjYXBlU3RyaW5nKHJlcXVlc3QudXJsKCkpKTtpZihyZXF1ZXN0LnJlcXVlc3RNZXRob2QhPT0nR0VUJyl7Y29tbWFuZC5wdXNoKCctTWV0aG9kJyk7Y29tbWFuZC5wdXNoKGVzY2FwZVN0cmluZyhyZXF1ZXN0LnJlcXVlc3RNZXRob2QpKTt9CmNvbnN0IHJlcXVlc3RIZWFkZXJzPXJlcXVlc3QucmVxdWVzdEhlYWRlcnMoKTtjb25zdCBoZWFkZXJOYW1lVmFsdWVQYWlycz1bXTtmb3IoY29uc3QgaGVhZGVyIG9mIHJlcXVlc3RIZWFkZXJzKXtjb25zdCBuYW1lPWhlYWRlci5uYW1lLnJlcGxhY2UoL146LywnJyk7aWYoaWdub3JlZEhlYWRlcnMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpCmNvbnRpbnVlO2hlYWRlck5hbWVWYWx1ZVBhaXJzLnB1c2goZXNjYXBlU3RyaW5nKG5hbWUpKyc9Jytlc2NhcGVTdHJpbmcoaGVhZGVyLnZhbHVlKSk7fQppZihoZWFkZXJOYW1lVmFsdWVQYWlycy5sZW5ndGgpe2NvbW1hbmQucHVzaCgnLUhlYWRlcnMnKTtjb21tYW5kLnB1c2goJ0B7JytoZWFkZXJOYW1lVmFsdWVQYWlycy5qb2luKCc7ICcpKyd9Jyk7fQpjb25zdCBjb250ZW50VHlwZUhlYWRlcj1yZXF1ZXN0SGVhZGVycy5maW5kKCh7bmFtZX0pPT5uYW1lLnRvTG93ZXJDYXNlKCk9PT0nY29udGVudC10eXBlJyk7aWYoY29udGVudFR5cGVIZWFkZXIpe2NvbW1hbmQucHVzaCgnLUNvbnRlbnRUeXBlJyk7Y29tbWFuZC5wdXNoKGVzY2FwZVN0cmluZyhjb250ZW50VHlwZUhlYWRlci52YWx1ZSkpO30KY29uc3QgZm9ybURhdGE9YXdhaXQgcmVxdWVzdC5yZXF1ZXN0Rm9ybURhdGEoKTtpZihmb3JtRGF0YSl7Y29tbWFuZC5wdXNoKCctQm9keScpO2NvbnN0IGJvZHk9ZXNjYXBlU3RyaW5nKGZvcm1EYXRhKTtpZigvW15ceDIwLVx4N0VdLy50ZXN0KGZvcm1EYXRhKSkKY29tbWFuZC5wdXNoKCcoW1N5c3RlbS5UZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRCeXRlcygnK2JvZHkrJykpJyk7ZWxzZQpjb21tYW5kLnB1c2goYm9keSk7fQpyZXR1cm4gY29tbWFuZC5qb2luKCcgJyk7fX07TmV0d29yay5OZXR3b3JrTG9nVmlldy5faXNGaWx0ZXJlZE91dFN5bWJvbD1TeW1ib2woJ2lzRmlsdGVyZWRPdXQnKTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9uZXR3b3JrTm9kZVN5bWJvbD1TeW1ib2woJ05ldHdvcmtOb2RlJyk7TmV0d29yay5OZXR3b3JrTG9nVmlldy5IVFRQU2NoZW1hcz17J2h0dHAnOnRydWUsJ2h0dHBzJzp0cnVlLCd3cyc6dHJ1ZSwnd3NzJzp0cnVlfTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkV2ZW50cz17UmVxdWVzdFNlbGVjdGVkOlN5bWJvbCgnUmVxdWVzdFNlbGVjdGVkJyl9O05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZT17RG9tYWluOidkb21haW4nLEhhc1Jlc3BvbnNlSGVhZGVyOidoYXMtcmVzcG9uc2UtaGVhZGVyJyxJczonaXMnLExhcmdlclRoYW46J2xhcmdlci10aGFuJyxNZXRob2Q6J21ldGhvZCcsTWltZVR5cGU6J21pbWUtdHlwZScsTWl4ZWRDb250ZW50OidtaXhlZC1jb250ZW50JyxQcmlvcml0eToncHJpb3JpdHknLFNjaGVtZTonc2NoZW1lJyxTZXRDb29raWVEb21haW46J3NldC1jb29raWUtZG9tYWluJyxTZXRDb29raWVOYW1lOidzZXQtY29va2llLW5hbWUnLFNldENvb2tpZVZhbHVlOidzZXQtY29va2llLXZhbHVlJyxTdGF0dXNDb2RlOidzdGF0dXMtY29kZSd9O05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuTWl4ZWRDb250ZW50RmlsdGVyVmFsdWVzPXtBbGw6J2FsbCcsRGlzcGxheWVkOidkaXNwbGF5ZWQnLEJsb2NrZWQ6J2Jsb2NrZWQnLEJsb2NrT3ZlcnJpZGRlbjonYmxvY2stb3ZlcnJpZGRlbid9O05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuSXNGaWx0ZXJUeXBlPXtSdW5uaW5nOidydW5uaW5nJyxGcm9tQ2FjaGU6J2Zyb20tY2FjaGUnfTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Ll9zZWFyY2hLZXlzPU9iamVjdC5rZXlzKE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyVHlwZSkubWFwKGtleT0+TmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlW2tleV0pO05ldHdvcmsuTmV0d29ya0xvZ1ZpZXcuRmlsdGVyO05ldHdvcmsuR3JvdXBMb29rdXBJbnRlcmZhY2U9ZnVuY3Rpb24oKXt9O05ldHdvcmsuR3JvdXBMb29rdXBJbnRlcmZhY2UucHJvdG90eXBlPXtncm91cE5vZGVGb3JSZXF1ZXN0OmZ1bmN0aW9uKHJlcXVlc3Qpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fTs7TmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnM9Y2xhc3N7Y29uc3RydWN0b3IobmV0d29ya0xvZ1ZpZXcsdGltZUNhbGN1bGF0b3IsZHVyYXRpb25DYWxjdWxhdG9yLG5ldHdvcmtMb2dMYXJnZVJvd3NTZXR0aW5nKXt0aGlzLl9uZXR3b3JrTG9nVmlldz1uZXR3b3JrTG9nVmlldzt0aGlzLl9wZXJzaXN0YW50U2V0dGluZ3M9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ25ldHdvcmtMb2dDb2x1bW5zJyx7fSk7dGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmc9bmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmc7dGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlUm93c1NpemUsdGhpcyk7dGhpcy5fZXZlbnREaXZpZGVycz1uZXcgTWFwKCk7dGhpcy5fZXZlbnREaXZpZGVyc1Nob3duPWZhbHNlO3RoaXMuX2dyaWRNb2RlPXRydWU7dGhpcy5fY29sdW1ucz1bXTt0aGlzLl93YXRlcmZhbGxSZXF1ZXN0c0FyZVN0YWxlPWZhbHNlO3RoaXMuX3dhdGVyZmFsbFNjcm9sbGVyV2lkdGhJc1N0YWxlPXRydWU7dGhpcy5fcG9wdXBMaW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKCk7dGhpcy5fY2FsY3VsYXRvcnNNYXA9bmV3IE1hcCgpO3RoaXMuX2NhbGN1bGF0b3JzTWFwLnNldChOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fY2FsY3VsYXRvclR5cGVzLlRpbWUsdGltZUNhbGN1bGF0b3IpO3RoaXMuX2NhbGN1bGF0b3JzTWFwLnNldChOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fY2FsY3VsYXRvclR5cGVzLkR1cmF0aW9uLGR1cmF0aW9uQ2FsY3VsYXRvcik7dGhpcy5fbGFzdFdoZWVsVGltZT0wO3RoaXMuX3NldHVwRGF0YUdyaWQoKTt0aGlzLl9zZXR1cFdhdGVyZmFsbCgpO30Kc3RhdGljIF9jb252ZXJ0VG9EYXRhR3JpZERlc2NyaXB0b3IoY29sdW1uQ29uZmlnKXtyZXR1cm4oe2lkOmNvbHVtbkNvbmZpZy5pZCx0aXRsZTpjb2x1bW5Db25maWcudGl0bGUsc29ydGFibGU6Y29sdW1uQ29uZmlnLnNvcnRhYmxlLGFsaWduOmNvbHVtbkNvbmZpZy5hbGlnbixub25TZWxlY3RhYmxlOmNvbHVtbkNvbmZpZy5ub25TZWxlY3RhYmxlLHdlaWdodDpjb2x1bW5Db25maWcud2VpZ2h0fSk7fQp3YXNTaG93bigpe3RoaXMuX3VwZGF0ZVJvd3NTaXplKCk7fQp3aWxsSGlkZSgpe3RoaXMuX3BvcG92ZXJIZWxwZXIuaGlkZVBvcG92ZXIoKTt9CnJlc2V0KCl7aWYodGhpcy5fcG9wb3ZlckhlbHBlcikKdGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO3RoaXMuX2V2ZW50RGl2aWRlcnMuY2xlYXIoKTt9Cl9zZXR1cERhdGFHcmlkKCl7Y29uc3QgZGVmYXVsdENvbHVtbnM9TmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnMuX2RlZmF1bHRDb2x1bW5zO2NvbnN0IGRlZmF1bHRDb2x1bW5Db25maWc9TmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnMuX2RlZmF1bHRDb2x1bW5Db25maWc7dGhpcy5fY29sdW1ucz0oW10pO2Zvcihjb25zdCBjdXJyZW50Q29uZmlnQ29sdW1uIG9mIGRlZmF1bHRDb2x1bW5zKXtjb25zdCBjb2x1bW5Db25maWc9KE9iamVjdC5hc3NpZ24oe30sZGVmYXVsdENvbHVtbkNvbmZpZyxjdXJyZW50Q29uZmlnQ29sdW1uKSk7Y29sdW1uQ29uZmlnLmlkPWNvbHVtbkNvbmZpZy5pZDtpZihjb2x1bW5Db25maWcuc3VidGl0bGUpCmNvbHVtbkNvbmZpZy50aXRsZURPTUZyYWdtZW50PXRoaXMuX21ha2VIZWFkZXJGcmFnbWVudChjb2x1bW5Db25maWcudGl0bGUsY29sdW1uQ29uZmlnLnN1YnRpdGxlKTt0aGlzLl9jb2x1bW5zLnB1c2goY29sdW1uQ29uZmlnKTt9CnRoaXMuX2xvYWRDdXN0b21Db2x1bW5zQW5kU2V0dGluZ3MoKTt0aGlzLl9wb3BvdmVySGVscGVyPW5ldyBVSS5Qb3BvdmVySGVscGVyKHRoaXMuX25ldHdvcmtMb2dWaWV3LmVsZW1lbnQsdGhpcy5fZ2V0UG9wb3ZlclJlcXVlc3QuYmluZCh0aGlzKSk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXRIYXNQYWRkaW5nKHRydWUpO3RoaXMuX3BvcG92ZXJIZWxwZXIuc2V0VGltZW91dCgzMDAsMzAwKTt0aGlzLl9kYXRhR3JpZD1uZXcgRGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZCh0aGlzLl9jb2x1bW5zLm1hcChOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fY29udmVydFRvRGF0YUdyaWREZXNjcmlwdG9yKSk7dGhpcy5fZGF0YUdyaWQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGV2ZW50PT57aWYoIXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZSYmZXZlbnQuYnV0dG9uKQpldmVudC5jb25zdW1lKCk7fSx0cnVlKTt0aGlzLl9kYXRhR3JpZFNjcm9sbGVyPXRoaXMuX2RhdGFHcmlkLnNjcm9sbENvbnRhaW5lcjt0aGlzLl91cGRhdGVDb2x1bW5zKCk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU29ydGluZ0NoYW5nZWQsdGhpcy5fc29ydEhhbmRsZXIsdGhpcyk7dGhpcy5fZGF0YUdyaWQuc2V0SGVhZGVyQ29udGV4dE1lbnVDYWxsYmFjayh0aGlzLl9pbm5lckhlYWRlckNvbnRleHRNZW51LmJpbmQodGhpcykpO3RoaXMuX2FjdGl2ZVdhdGVyZmFsbFNvcnRJZD1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5XYXRlcmZhbGxTb3J0SWRzLlN0YXJ0VGltZTt0aGlzLl9kYXRhR3JpZC5tYXJrQ29sdW1uQXNTb3J0ZWRCeShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5faW5pdGlhbFNvcnRDb2x1bW4sRGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuQXNjZW5kaW5nKTt0aGlzLl9zcGxpdFdpZGdldD1uZXcgVUkuU3BsaXRXaWRnZXQodHJ1ZSx0cnVlLCduZXR3b3JrUGFuZWxTcGxpdFZpZXdXYXRlcmZhbGwnLDIwMCk7Y29uc3Qgd2lkZ2V0PXRoaXMuX2RhdGFHcmlkLmFzV2lkZ2V0KCk7d2lkZ2V0LnNldE1pbmltdW1TaXplKDE1MCwwKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHdpZGdldCk7fQpfc2V0dXBXYXRlcmZhbGwoKXt0aGlzLl93YXRlcmZhbGxDb2x1bW49bmV3IE5ldHdvcmsuTmV0d29ya1dhdGVyZmFsbENvbHVtbih0aGlzLl9uZXR3b3JrTG9nVmlldy5jYWxjdWxhdG9yKCkpO3RoaXMuX3dhdGVyZmFsbENvbHVtbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JyxoYW5kbGVDb250ZXh0TWVudS5iaW5kKHRoaXMpKTt0aGlzLl93YXRlcmZhbGxDb2x1bW4uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJyx0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzLGZhbHNlKSx7cGFzc2l2ZTp0cnVlfSk7dGhpcy5fZGF0YUdyaWRTY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJyx0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzLHRydWUpLHRydWUpO3RoaXMuX3dhdGVyZmFsbFNjcm9sbGVyPXRoaXMuX3dhdGVyZmFsbENvbHVtbi5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay13YXRlcmZhbGwtdi1zY3JvbGwnKTt0aGlzLl93YXRlcmZhbGxTY3JvbGxlckNvbnRlbnQ9dGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstd2F0ZXJmYWxsLXYtc2Nyb2xsLWNvbnRlbnQnKTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5QYWRkaW5nQ2hhbmdlZCwoKT0+e3RoaXMuX3dhdGVyZmFsbFNjcm9sbGVyV2lkdGhJc1N0YWxlPXRydWU7dGhpcy5fc3luY1Njcm9sbGVycygpO30pO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuVmlld3BvcnREYXRhR3JpZC5FdmVudHMuVmlld3BvcnRDYWxjdWxhdGVkLHRoaXMuX3JlZHJhd1dhdGVyZmFsbENvbHVtbi5iaW5kKHRoaXMpKTt0aGlzLl9jcmVhdGVXYXRlcmZhbGxIZWFkZXIoKTt0aGlzLl93YXRlcmZhbGxDb2x1bW4uY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbmV0d29yay13YXRlcmZhbGwtdmlldycpO3RoaXMuX3dhdGVyZmFsbENvbHVtbi5zZXRNaW5pbXVtU2l6ZSgxMDAsMCk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl93YXRlcmZhbGxDb2x1bW4pO3RoaXMuc3dpdGNoVmlld01vZGUoZmFsc2UpO2Z1bmN0aW9uIGhhbmRsZUNvbnRleHRNZW51KGV2ZW50KXtjb25zdCBub2RlPXRoaXMuX3dhdGVyZmFsbENvbHVtbi5nZXROb2RlRnJvbVBvaW50KGV2ZW50Lm9mZnNldFgsZXZlbnQub2Zmc2V0WSk7aWYoIW5vZGUpCnJldHVybjtjb25zdCByZXF1ZXN0PW5vZGUucmVxdWVzdCgpO2lmKCFyZXF1ZXN0KQpyZXR1cm47Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTt0aGlzLl9uZXR3b3JrTG9nVmlldy5oYW5kbGVDb250ZXh0TWVudUZvclJlcXVlc3QoY29udGV4dE1lbnUscmVxdWVzdCk7Y29udGV4dE1lbnUuc2hvdygpO319Cl9vbk1vdXNlV2hlZWwoc2hvdWxkQ29uc3VtZSxldmVudCl7aWYoc2hvdWxkQ29uc3VtZSkKZXZlbnQuY29uc3VtZSh0cnVlKTtjb25zdCBoYXNSZWNlbnRXaGVlbD1EYXRlLm5vdygpLXRoaXMuX2xhc3RXaGVlbFRpbWU8ODA7dGhpcy5fYWN0aXZlU2Nyb2xsZXIuc2Nyb2xsQnkoe3RvcDotZXZlbnQud2hlZWxEZWx0YVksYmVoYXZpb3I6aGFzUmVjZW50V2hlZWw/J2luc3RhbnQnOidzbW9vdGgnfSk7dGhpcy5fc3luY1Njcm9sbGVycygpO3RoaXMuX2xhc3RXaGVlbFRpbWU9RGF0ZS5ub3coKTt9Cl9zeW5jU2Nyb2xsZXJzKCl7aWYoIXRoaXMuX3dhdGVyZmFsbENvbHVtbi5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX3dhdGVyZmFsbFNjcm9sbGVyQ29udGVudC5zdHlsZS5oZWlnaHQ9dGhpcy5fZGF0YUdyaWRTY3JvbGxlci5zY3JvbGxIZWlnaHQrJ3B4Jzt0aGlzLl91cGRhdGVTY3JvbGxlcldpZHRoSWZOZWVkZWQoKTt0aGlzLl9kYXRhR3JpZFNjcm9sbGVyLnNjcm9sbFRvcD10aGlzLl93YXRlcmZhbGxTY3JvbGxlci5zY3JvbGxUb3A7fQpfdXBkYXRlU2Nyb2xsZXJXaWR0aElmTmVlZGVkKCl7aWYodGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXJXaWR0aElzU3RhbGUpe3RoaXMuX3dhdGVyZmFsbFNjcm9sbGVyV2lkdGhJc1N0YWxlPWZhbHNlO3RoaXMuX3dhdGVyZmFsbENvbHVtbi5zZXRSaWdodFBhZGRpbmcodGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXIub2Zmc2V0V2lkdGgtdGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXJDb250ZW50Lm9mZnNldFdpZHRoKTt9fQpfcmVkcmF3V2F0ZXJmYWxsQ29sdW1uKCl7aWYoIXRoaXMuX3dhdGVyZmFsbFJlcXVlc3RzQXJlU3RhbGUpe3RoaXMuX3VwZGF0ZVNjcm9sbGVyV2lkdGhJZk5lZWRlZCgpO3RoaXMuX3dhdGVyZmFsbENvbHVtbi51cGRhdGUodGhpcy5fYWN0aXZlU2Nyb2xsZXIuc2Nyb2xsVG9wLHRoaXMuX2V2ZW50RGl2aWRlcnNTaG93bj90aGlzLl9ldmVudERpdmlkZXJzOnVuZGVmaW5lZCk7cmV0dXJuO30KdGhpcy5fc3luY1Njcm9sbGVycygpO2NvbnN0IG5vZGVzPXRoaXMuX25ldHdvcmtMb2dWaWV3LmZsYXROb2Rlc0xpc3QoKTt0aGlzLl93YXRlcmZhbGxDb2x1bW4udXBkYXRlKHRoaXMuX2FjdGl2ZVNjcm9sbGVyLnNjcm9sbFRvcCx0aGlzLl9ldmVudERpdmlkZXJzLG5vZGVzKTt9Cl9jcmVhdGVXYXRlcmZhbGxIZWFkZXIoKXt0aGlzLl93YXRlcmZhbGxIZWFkZXJFbGVtZW50PXRoaXMuX3dhdGVyZmFsbENvbHVtbi5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay13YXRlcmZhbGwtaGVhZGVyJyk7dGhpcy5fd2F0ZXJmYWxsSGVhZGVyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsd2F0ZXJmYWxsSGVhZGVyQ2xpY2tlZC5iaW5kKHRoaXMpKTt0aGlzLl93YXRlcmZhbGxIZWFkZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JyxldmVudD0+dGhpcy5faW5uZXJIZWFkZXJDb250ZXh0TWVudShuZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpKSk7Y29uc3QgaW5uZXJFbGVtZW50PXRoaXMuX3dhdGVyZmFsbEhlYWRlckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO2lubmVyRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1dhdGVyZmFsbCcpO3RoaXMuX3dhdGVyZmFsbENvbHVtblNvcnRJY29uPVVJLkljb24uY3JlYXRlKCcnLCdzb3J0LW9yZGVyLWljb24nKTt0aGlzLl93YXRlcmZhbGxIZWFkZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzb3J0LW9yZGVyLWljb24tY29udGFpbmVyJykuYXBwZW5kQ2hpbGQodGhpcy5fd2F0ZXJmYWxsQ29sdW1uU29ydEljb24pO2Z1bmN0aW9uIHdhdGVyZmFsbEhlYWRlckNsaWNrZWQoKXtjb25zdCBzb3J0T3JkZXJzPURhdGFHcmlkLkRhdGFHcmlkLk9yZGVyO2NvbnN0IHNvcnRPcmRlcj10aGlzLl9kYXRhR3JpZC5zb3J0T3JkZXIoKT09PXNvcnRPcmRlcnMuQXNjZW5kaW5nP3NvcnRPcmRlcnMuRGVzY2VuZGluZzpzb3J0T3JkZXJzLkFzY2VuZGluZzt0aGlzLl9kYXRhR3JpZC5tYXJrQ29sdW1uQXNTb3J0ZWRCeSgnd2F0ZXJmYWxsJyxzb3J0T3JkZXIpO3RoaXMuX3NvcnRIYW5kbGVyKCk7fX0Kc2V0Q2FsY3VsYXRvcih4KXt0aGlzLl93YXRlcmZhbGxDb2x1bW4uc2V0Q2FsY3VsYXRvcih4KTt9CnNjaGVkdWxlUmVmcmVzaCgpe3RoaXMuX3dhdGVyZmFsbENvbHVtbi5zY2hlZHVsZURyYXcoKTt9Cl91cGRhdGVSb3dzU2l6ZSgpe2NvbnN0IGxhcmdlUm93cz0hIXRoaXMuX25ldHdvcmtMb2dMYXJnZVJvd3NTZXR0aW5nLmdldCgpO3RoaXMuX2RhdGFHcmlkLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc21hbGwnLCFsYXJnZVJvd3MpO3RoaXMuX2RhdGFHcmlkLnNjaGVkdWxlVXBkYXRlKCk7dGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXJXaWR0aElzU3RhbGU9dHJ1ZTt0aGlzLl93YXRlcmZhbGxDb2x1bW4uc2V0Um93SGVpZ2h0KGxhcmdlUm93cz80MToyMSk7dGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXIuY2xhc3NMaXN0LnRvZ2dsZSgnc21hbGwnLCFsYXJnZVJvd3MpO3RoaXMuX3dhdGVyZmFsbEhlYWRlckVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc21hbGwnLCFsYXJnZVJvd3MpO3RoaXMuX3dhdGVyZmFsbENvbHVtbi5zZXRIZWFkZXJIZWlnaHQodGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXIub2Zmc2V0VG9wKTt9CnNob3coZWxlbWVudCl7dGhpcy5fc3BsaXRXaWRnZXQuc2hvdyhlbGVtZW50KTt9CmRhdGFHcmlkKCl7cmV0dXJuIHRoaXMuX2RhdGFHcmlkO30Kc29ydEJ5Q3VycmVudENvbHVtbigpe3RoaXMuX3NvcnRIYW5kbGVyKCk7fQpfc29ydEhhbmRsZXIoKXtjb25zdCBjb2x1bW5JZD10aGlzLl9kYXRhR3JpZC5zb3J0Q29sdW1uSWQoKTt0aGlzLl9uZXR3b3JrTG9nVmlldy5yZW1vdmVBbGxOb2RlSGlnaGxpZ2h0cygpO3RoaXMuX3dhdGVyZmFsbFJlcXVlc3RzQXJlU3RhbGU9dHJ1ZTtpZihjb2x1bW5JZD09PSd3YXRlcmZhbGwnKXtpZih0aGlzLl9kYXRhR3JpZC5zb3J0T3JkZXIoKT09PURhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZykKdGhpcy5fd2F0ZXJmYWxsQ29sdW1uU29ydEljb24uc2V0SWNvblR5cGUoJ3NtYWxsaWNvbi10cmlhbmdsZS11cCcpO2Vsc2UKdGhpcy5fd2F0ZXJmYWxsQ29sdW1uU29ydEljb24uc2V0SWNvblR5cGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1kb3duJyk7Y29uc3Qgc29ydEZ1bmN0aW9uPU5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlJlcXVlc3RQcm9wZXJ0eUNvbXBhcmF0b3IuYmluZChudWxsLHRoaXMuX2FjdGl2ZVdhdGVyZmFsbFNvcnRJZCk7dGhpcy5fZGF0YUdyaWQuc29ydE5vZGVzKHNvcnRGdW5jdGlvbiwhdGhpcy5fZGF0YUdyaWQuaXNTb3J0T3JkZXJBc2NlbmRpbmcoKSk7dGhpcy5fZGF0YUdyaWRTb3J0ZWRGb3JUZXN0KCk7cmV0dXJuO30KdGhpcy5fd2F0ZXJmYWxsQ29sdW1uU29ydEljb24uc2V0SWNvblR5cGUoJycpO2NvbnN0IGNvbHVtbkNvbmZpZz10aGlzLl9jb2x1bW5zLmZpbmQoY29sdW1uQ29uZmlnPT5jb2x1bW5Db25maWcuaWQ9PT1jb2x1bW5JZCk7aWYoIWNvbHVtbkNvbmZpZ3x8IWNvbHVtbkNvbmZpZy5zb3J0aW5nRnVuY3Rpb24pCnJldHVybjt0aGlzLl9kYXRhR3JpZC5zb3J0Tm9kZXMoY29sdW1uQ29uZmlnLnNvcnRpbmdGdW5jdGlvbiwhdGhpcy5fZGF0YUdyaWQuaXNTb3J0T3JkZXJBc2NlbmRpbmcoKSk7dGhpcy5fZGF0YUdyaWRTb3J0ZWRGb3JUZXN0KCk7fQpfZGF0YUdyaWRTb3J0ZWRGb3JUZXN0KCl7fQpfdXBkYXRlQ29sdW1ucygpe2lmKCF0aGlzLl9kYXRhR3JpZCkKcmV0dXJuO2NvbnN0IHZpc2libGVDb2x1bW5zPSh7fSk7aWYodGhpcy5fZ3JpZE1vZGUpe2Zvcihjb25zdCBjb2x1bW5Db25maWcgb2YgdGhpcy5fY29sdW1ucykKdmlzaWJsZUNvbHVtbnNbY29sdW1uQ29uZmlnLmlkXT1jb2x1bW5Db25maWcudmlzaWJsZTt9ZWxzZXt2aXNpYmxlQ29sdW1ucy5uYW1lPXRydWU7fQp0aGlzLl9kYXRhR3JpZC5zZXRDb2x1bW5zVmlzaWJsaXR5KHZpc2libGVDb2x1bW5zKTt9CnN3aXRjaFZpZXdNb2RlKGdyaWRNb2RlKXtpZih0aGlzLl9ncmlkTW9kZT09PWdyaWRNb2RlKQpyZXR1cm47dGhpcy5fZ3JpZE1vZGU9Z3JpZE1vZGU7aWYoZ3JpZE1vZGUpe2lmKHRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZSkKdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlLnNlbGVjdGVkPWZhbHNlO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3dCb3RoKCk7dGhpcy5fYWN0aXZlU2Nyb2xsZXI9dGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXI7dGhpcy5fd2F0ZXJmYWxsU2Nyb2xsZXIuc2Nyb2xsVG9wPXRoaXMuX2RhdGFHcmlkU2Nyb2xsZXIuc2Nyb2xsVG9wO3RoaXMuX2RhdGFHcmlkLnNldFNjcm9sbENvbnRhaW5lcih0aGlzLl93YXRlcmZhbGxTY3JvbGxlcik7fWVsc2V7dGhpcy5fbmV0d29ya0xvZ1ZpZXcucmVtb3ZlQWxsTm9kZUhpZ2hsaWdodHMoKTt0aGlzLl9zcGxpdFdpZGdldC5oaWRlU2lkZWJhcigpO3RoaXMuX2FjdGl2ZVNjcm9sbGVyPXRoaXMuX2RhdGFHcmlkU2Nyb2xsZXI7dGhpcy5fZGF0YUdyaWQuc2V0U2Nyb2xsQ29udGFpbmVyKHRoaXMuX2RhdGFHcmlkU2Nyb2xsZXIpO30KdGhpcy5fbmV0d29ya0xvZ1ZpZXcuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdicmllZi1tb2RlJywhZ3JpZE1vZGUpO3RoaXMuX3VwZGF0ZUNvbHVtbnMoKTt0aGlzLl91cGRhdGVSb3dzU2l6ZSgpO30KX3RvZ2dsZUNvbHVtblZpc2liaWxpdHkoY29sdW1uQ29uZmlnKXt0aGlzLl9sb2FkQ3VzdG9tQ29sdW1uc0FuZFNldHRpbmdzKCk7Y29sdW1uQ29uZmlnLnZpc2libGU9IWNvbHVtbkNvbmZpZy52aXNpYmxlO3RoaXMuX3NhdmVDb2x1bW5zU2V0dGluZ3MoKTt0aGlzLl91cGRhdGVDb2x1bW5zKCk7fQpfc2F2ZUNvbHVtbnNTZXR0aW5ncygpe2NvbnN0IHNhdmVhYmxlU2V0dGluZ3M9e307Zm9yKGNvbnN0IGNvbHVtbkNvbmZpZyBvZiB0aGlzLl9jb2x1bW5zKQpzYXZlYWJsZVNldHRpbmdzW2NvbHVtbkNvbmZpZy5pZF09e3Zpc2libGU6Y29sdW1uQ29uZmlnLnZpc2libGUsdGl0bGU6Y29sdW1uQ29uZmlnLnRpdGxlfTt0aGlzLl9wZXJzaXN0YW50U2V0dGluZ3Muc2V0KHNhdmVhYmxlU2V0dGluZ3MpO30KX2xvYWRDdXN0b21Db2x1bW5zQW5kU2V0dGluZ3MoKXtjb25zdCBzYXZlZFNldHRpbmdzPXRoaXMuX3BlcnNpc3RhbnRTZXR0aW5ncy5nZXQoKTtjb25zdCBjb2x1bW5JZHM9T2JqZWN0LmtleXMoc2F2ZWRTZXR0aW5ncyk7Zm9yKGNvbnN0IGNvbHVtbklkIG9mIGNvbHVtbklkcyl7Y29uc3Qgc2V0dGluZz1zYXZlZFNldHRpbmdzW2NvbHVtbklkXTtsZXQgY29sdW1uQ29uZmlnPXRoaXMuX2NvbHVtbnMuZmluZChjb2x1bW5Db25maWc9PmNvbHVtbkNvbmZpZy5pZD09PWNvbHVtbklkKTtpZighY29sdW1uQ29uZmlnKQpjb2x1bW5Db25maWc9dGhpcy5fYWRkQ3VzdG9tSGVhZGVyKHNldHRpbmcudGl0bGUsY29sdW1uSWQpO2lmKGNvbHVtbkNvbmZpZy5oaWRlYWJsZSYmdHlwZW9mIHNldHRpbmcudmlzaWJsZT09PSdib29sZWFuJykKY29sdW1uQ29uZmlnLnZpc2libGU9ISFzZXR0aW5nLnZpc2libGU7aWYodHlwZW9mIHNldHRpbmcudGl0bGU9PT0nc3RyaW5nJykKY29sdW1uQ29uZmlnLnRpdGxlPXNldHRpbmcudGl0bGU7fX0KX21ha2VIZWFkZXJGcmFnbWVudCh0aXRsZSxzdWJ0aXRsZSl7Y29uc3QgZnJhZ21lbnQ9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCh0aXRsZSk7Y29uc3Qgc3VidGl0bGVEaXY9ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstaGVhZGVyLXN1YnRpdGxlJyk7c3VidGl0bGVEaXYuY3JlYXRlVGV4dENoaWxkKHN1YnRpdGxlKTtyZXR1cm4gZnJhZ21lbnQ7fQpfaW5uZXJIZWFkZXJDb250ZXh0TWVudShjb250ZXh0TWVudSl7Y29uc3QgY29sdW1uQ29uZmlncz10aGlzLl9jb2x1bW5zLmZpbHRlcihjb2x1bW5Db25maWc9PmNvbHVtbkNvbmZpZy5oaWRlYWJsZSk7Y29uc3Qgbm9uUmVzcG9uc2VIZWFkZXJzPWNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbkNvbmZpZz0+IWNvbHVtbkNvbmZpZy5pc1Jlc3BvbnNlSGVhZGVyKTtmb3IoY29uc3QgY29sdW1uQ29uZmlnIG9mIG5vblJlc3BvbnNlSGVhZGVycyl7Y29udGV4dE1lbnUuaGVhZGVyU2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShjb2x1bW5Db25maWcudGl0bGUsdGhpcy5fdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eS5iaW5kKHRoaXMsY29sdW1uQ29uZmlnKSxjb2x1bW5Db25maWcudmlzaWJsZSk7fQpjb25zdCByZXNwb25zZVN1Yk1lbnU9Y29udGV4dE1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnUmVzcG9uc2UgSGVhZGVycycpKTtjb25zdCByZXNwb25zZUhlYWRlcnM9Y29sdW1uQ29uZmlncy5maWx0ZXIoY29sdW1uQ29uZmlnPT5jb2x1bW5Db25maWcuaXNSZXNwb25zZUhlYWRlcik7Zm9yKGNvbnN0IGNvbHVtbkNvbmZpZyBvZiByZXNwb25zZUhlYWRlcnMpe3Jlc3BvbnNlU3ViTWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShjb2x1bW5Db25maWcudGl0bGUsdGhpcy5fdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eS5iaW5kKHRoaXMsY29sdW1uQ29uZmlnKSxjb2x1bW5Db25maWcudmlzaWJsZSk7fQpyZXNwb25zZVN1Yk1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdNYW5hZ2UgSGVhZGVyIENvbHVtbnNcdTIwMjYnKSx0aGlzLl9tYW5hZ2VDdXN0b21IZWFkZXJEaWFsb2cuYmluZCh0aGlzKSk7Y29uc3Qgd2F0ZXJmYWxsU29ydElkcz1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5XYXRlcmZhbGxTb3J0SWRzO2NvbnN0IHdhdGVyZmFsbFN1Yk1lbnU9Y29udGV4dE1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZFN1Yk1lbnVJdGVtKENvbW1vbi5VSVN0cmluZygnV2F0ZXJmYWxsJykpO3dhdGVyZmFsbFN1Yk1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRDaGVja2JveEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTdGFydCBUaW1lJyksc2V0V2F0ZXJmYWxsTW9kZS5iaW5kKHRoaXMsd2F0ZXJmYWxsU29ydElkcy5TdGFydFRpbWUpLHRoaXMuX2FjdGl2ZVdhdGVyZmFsbFNvcnRJZD09PXdhdGVyZmFsbFNvcnRJZHMuU3RhcnRUaW1lKTt3YXRlcmZhbGxTdWJNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKENvbW1vbi5VSVN0cmluZygnUmVzcG9uc2UgVGltZScpLHNldFdhdGVyZmFsbE1vZGUuYmluZCh0aGlzLHdhdGVyZmFsbFNvcnRJZHMuUmVzcG9uc2VUaW1lKSx0aGlzLl9hY3RpdmVXYXRlcmZhbGxTb3J0SWQ9PT13YXRlcmZhbGxTb3J0SWRzLlJlc3BvbnNlVGltZSk7d2F0ZXJmYWxsU3ViTWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZENoZWNrYm94SXRlbShDb21tb24uVUlTdHJpbmcoJ0VuZCBUaW1lJyksc2V0V2F0ZXJmYWxsTW9kZS5iaW5kKHRoaXMsd2F0ZXJmYWxsU29ydElkcy5FbmRUaW1lKSx0aGlzLl9hY3RpdmVXYXRlcmZhbGxTb3J0SWQ9PT13YXRlcmZhbGxTb3J0SWRzLkVuZFRpbWUpO3dhdGVyZmFsbFN1Yk1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRDaGVja2JveEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdUb3RhbCBEdXJhdGlvbicpLHNldFdhdGVyZmFsbE1vZGUuYmluZCh0aGlzLHdhdGVyZmFsbFNvcnRJZHMuRHVyYXRpb24pLHRoaXMuX2FjdGl2ZVdhdGVyZmFsbFNvcnRJZD09PXdhdGVyZmFsbFNvcnRJZHMuRHVyYXRpb24pO3dhdGVyZmFsbFN1Yk1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRDaGVja2JveEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdMYXRlbmN5Jyksc2V0V2F0ZXJmYWxsTW9kZS5iaW5kKHRoaXMsd2F0ZXJmYWxsU29ydElkcy5MYXRlbmN5KSx0aGlzLl9hY3RpdmVXYXRlcmZhbGxTb3J0SWQ9PT13YXRlcmZhbGxTb3J0SWRzLkxhdGVuY3kpO2NvbnRleHRNZW51LnNob3coKTtmdW5jdGlvbiBzZXRXYXRlcmZhbGxNb2RlKHNvcnRJZCl7bGV0IGNhbGN1bGF0b3I9dGhpcy5fY2FsY3VsYXRvcnNNYXAuZ2V0KE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXdDb2x1bW5zLl9jYWxjdWxhdG9yVHlwZXMuVGltZSk7Y29uc3Qgd2F0ZXJmYWxsU29ydElkcz1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5XYXRlcmZhbGxTb3J0SWRzO2lmKHNvcnRJZD09PXdhdGVyZmFsbFNvcnRJZHMuRHVyYXRpb258fHNvcnRJZD09PXdhdGVyZmFsbFNvcnRJZHMuTGF0ZW5jeSkKY2FsY3VsYXRvcj10aGlzLl9jYWxjdWxhdG9yc01hcC5nZXQoTmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnMuX2NhbGN1bGF0b3JUeXBlcy5EdXJhdGlvbik7dGhpcy5fbmV0d29ya0xvZ1ZpZXcuc2V0Q2FsY3VsYXRvcihjYWxjdWxhdG9yKTt0aGlzLl9hY3RpdmVXYXRlcmZhbGxTb3J0SWQ9c29ydElkO3RoaXMuX2RhdGFHcmlkLm1hcmtDb2x1bW5Bc1NvcnRlZEJ5KCd3YXRlcmZhbGwnLERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZyk7dGhpcy5fc29ydEhhbmRsZXIoKTt9fQpfbWFuYWdlQ3VzdG9tSGVhZGVyRGlhbG9nKCl7Y29uc3QgY3VzdG9tSGVhZGVycz1bXTtmb3IoY29uc3QgY29sdW1uQ29uZmlnIG9mIHRoaXMuX2NvbHVtbnMpe2lmKGNvbHVtbkNvbmZpZy5pc1Jlc3BvbnNlSGVhZGVyKQpjdXN0b21IZWFkZXJzLnB1c2goe3RpdGxlOmNvbHVtbkNvbmZpZy50aXRsZSxlZGl0YWJsZTpjb2x1bW5Db25maWcuaXNDdXN0b21IZWFkZXJ9KTt9CmNvbnN0IG1hbmFnZUN1c3RvbUhlYWRlcnM9bmV3IE5ldHdvcmsuTmV0d29ya01hbmFnZUN1c3RvbUhlYWRlcnNWaWV3KGN1c3RvbUhlYWRlcnMsaGVhZGVyVGl0bGU9PiEhdGhpcy5fYWRkQ3VzdG9tSGVhZGVyKGhlYWRlclRpdGxlKSx0aGlzLl9jaGFuZ2VDdXN0b21IZWFkZXIuYmluZCh0aGlzKSx0aGlzLl9yZW1vdmVDdXN0b21IZWFkZXIuYmluZCh0aGlzKSk7Y29uc3QgZGlhbG9nPW5ldyBVSS5EaWFsb2coKTttYW5hZ2VDdXN0b21IZWFkZXJzLnNob3coZGlhbG9nLmNvbnRlbnRFbGVtZW50KTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5zaG93KHRoaXMuX25ldHdvcmtMb2dWaWV3LmVsZW1lbnQpO30KX3JlbW92ZUN1c3RvbUhlYWRlcihoZWFkZXJJZCl7aGVhZGVySWQ9aGVhZGVySWQudG9Mb3dlckNhc2UoKTtjb25zdCBpbmRleD10aGlzLl9jb2x1bW5zLmZpbmRJbmRleChjb2x1bW5Db25maWc9PmNvbHVtbkNvbmZpZy5pZD09PWhlYWRlcklkKTtpZihpbmRleD09PS0xKQpyZXR1cm4gZmFsc2U7dGhpcy5fY29sdW1ucy5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fZGF0YUdyaWQucmVtb3ZlQ29sdW1uKGhlYWRlcklkKTt0aGlzLl9zYXZlQ29sdW1uc1NldHRpbmdzKCk7dGhpcy5fdXBkYXRlQ29sdW1ucygpO3JldHVybiB0cnVlO30KX2FkZEN1c3RvbUhlYWRlcihoZWFkZXJUaXRsZSxoZWFkZXJJZCxpbmRleCl7aWYoIWhlYWRlcklkKQpoZWFkZXJJZD1oZWFkZXJUaXRsZS50b0xvd2VyQ2FzZSgpO2lmKGluZGV4PT09dW5kZWZpbmVkKQppbmRleD10aGlzLl9jb2x1bW5zLmxlbmd0aC0xO2NvbnN0IGN1cnJlbnRDb2x1bW5Db25maWc9dGhpcy5fY29sdW1ucy5maW5kKGNvbHVtbkNvbmZpZz0+Y29sdW1uQ29uZmlnLmlkPT09aGVhZGVySWQpO2lmKGN1cnJlbnRDb2x1bW5Db25maWcpCnJldHVybiBudWxsO2NvbnN0IGNvbHVtbkNvbmZpZz0oT2JqZWN0LmFzc2lnbih7fSxOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fZGVmYXVsdENvbHVtbkNvbmZpZyx7aWQ6aGVhZGVySWQsdGl0bGU6aGVhZGVyVGl0bGUsaXNSZXNwb25zZUhlYWRlcjp0cnVlLGlzQ3VzdG9tSGVhZGVyOnRydWUsdmlzaWJsZTp0cnVlLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLGhlYWRlcklkKX0pKTt0aGlzLl9jb2x1bW5zLnNwbGljZShpbmRleCwwLGNvbHVtbkNvbmZpZyk7aWYodGhpcy5fZGF0YUdyaWQpCnRoaXMuX2RhdGFHcmlkLmFkZENvbHVtbihOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fY29udmVydFRvRGF0YUdyaWREZXNjcmlwdG9yKGNvbHVtbkNvbmZpZyksaW5kZXgpO3RoaXMuX3NhdmVDb2x1bW5zU2V0dGluZ3MoKTt0aGlzLl91cGRhdGVDb2x1bW5zKCk7cmV0dXJuIGNvbHVtbkNvbmZpZzt9Cl9jaGFuZ2VDdXN0b21IZWFkZXIob2xkSGVhZGVySWQsbmV3SGVhZGVyVGl0bGUsbmV3SGVhZGVySWQpe2lmKCFuZXdIZWFkZXJJZCkKbmV3SGVhZGVySWQ9bmV3SGVhZGVyVGl0bGUudG9Mb3dlckNhc2UoKTtvbGRIZWFkZXJJZD1vbGRIZWFkZXJJZC50b0xvd2VyQ2FzZSgpO2NvbnN0IG9sZEluZGV4PXRoaXMuX2NvbHVtbnMuZmluZEluZGV4KGNvbHVtbkNvbmZpZz0+Y29sdW1uQ29uZmlnLmlkPT09b2xkSGVhZGVySWQpO2NvbnN0IG9sZENvbHVtbkNvbmZpZz10aGlzLl9jb2x1bW5zW29sZEluZGV4XTtjb25zdCBjdXJyZW50Q29sdW1uQ29uZmlnPXRoaXMuX2NvbHVtbnMuZmluZChjb2x1bW5Db25maWc9PmNvbHVtbkNvbmZpZy5pZD09PW5ld0hlYWRlcklkKTtpZighb2xkQ29sdW1uQ29uZmlnfHwoY3VycmVudENvbHVtbkNvbmZpZyYmb2xkSGVhZGVySWQhPT1uZXdIZWFkZXJJZCkpCnJldHVybiBmYWxzZTt0aGlzLl9yZW1vdmVDdXN0b21IZWFkZXIob2xkSGVhZGVySWQpO3RoaXMuX2FkZEN1c3RvbUhlYWRlcihuZXdIZWFkZXJUaXRsZSxuZXdIZWFkZXJJZCxvbGRJbmRleCk7cmV0dXJuIHRydWU7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2lmKCF0aGlzLl9ncmlkTW9kZSkKcmV0dXJuIG51bGw7Y29uc3QgaG92ZXJlZE5vZGU9dGhpcy5fbmV0d29ya0xvZ1ZpZXcuaG92ZXJlZE5vZGUoKTtpZighaG92ZXJlZE5vZGUpCnJldHVybiBudWxsO2NvbnN0IGFuY2hvcj1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnbmV0d29yay1zY3JpcHQtaW5pdGlhdGVkJyk7aWYoIWFuY2hvcikKcmV0dXJuIG51bGw7Y29uc3QgcmVxdWVzdD1ob3ZlcmVkTm9kZS5yZXF1ZXN0KCk7Y29uc3QgaW5pdGlhdG9yPXJlcXVlc3Q/cmVxdWVzdC5pbml0aWF0b3IoKTpudWxsO2lmKCFpbml0aWF0b3J8fCFpbml0aWF0b3Iuc3RhY2spCnJldHVybiBudWxsO3JldHVybntib3g6YW5jaG9yLmJveEluV2luZG93KCksc2hvdzpwb3BvdmVyPT57Y29uc3QgbWFuYWdlcj1hbmNob3IucmVxdWVzdD9TREsuTmV0d29ya01hbmFnZXIuZm9yUmVxdWVzdChhbmNob3IucmVxdWVzdCk6bnVsbDtjb25zdCBjb250ZW50PUNvbXBvbmVudHMuSlNQcmVzZW50YXRpb25VdGlscy5idWlsZFN0YWNrVHJhY2VQcmV2aWV3Q29udGVudHMobWFuYWdlcj9tYW5hZ2VyLnRhcmdldCgpOm51bGwsdGhpcy5fcG9wdXBMaW5raWZpZXIsaW5pdGlhdG9yLnN0YWNrLCgpPT5wb3BvdmVyLnNldFNpemVCZWhhdmlvcihVSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLk1lYXN1cmVDb250ZW50KSk7cG9wb3Zlci5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO30saGlkZTp0aGlzLl9wb3B1cExpbmtpZmllci5yZXNldC5iaW5kKHRoaXMuX3BvcHVwTGlua2lmaWVyKX07fQphZGRFdmVudERpdmlkZXJzKHRpbWVzLGNsYXNzTmFtZSl7bGV0IGNvbG9yPSd0cmFuc3BhcmVudCc7c3dpdGNoKGNsYXNzTmFtZSl7Y2FzZSduZXR3b3JrLWJsdWUtZGl2aWRlcic6Y29sb3I9J2hzbGEoMjQwLCAxMDAlLCA4MCUsIDAuNyknO2JyZWFrO2Nhc2UnbmV0d29yay1yZWQtZGl2aWRlcic6Y29sb3I9J3JnYmEoMjU1LCAwLCAwLCAwLjUpJzticmVhaztkZWZhdWx0OnJldHVybjt9CmNvbnN0IGN1cnJlbnRUaW1lcz10aGlzLl9ldmVudERpdmlkZXJzLmdldChjb2xvcil8fFtdO3RoaXMuX2V2ZW50RGl2aWRlcnMuc2V0KGNvbG9yLGN1cnJlbnRUaW1lcy5jb25jYXQodGltZXMpKTt0aGlzLl9uZXR3b3JrTG9nVmlldy5zY2hlZHVsZVJlZnJlc2goKTt9CmhpZGVFdmVudERpdmlkZXJzKCl7dGhpcy5fZXZlbnREaXZpZGVyc1Nob3duPXRydWU7dGhpcy5fcmVkcmF3V2F0ZXJmYWxsQ29sdW1uKCk7fQpzaG93RXZlbnREaXZpZGVycygpe3RoaXMuX2V2ZW50RGl2aWRlcnNTaG93bj1mYWxzZTt0aGlzLl9yZWRyYXdXYXRlcmZhbGxDb2x1bW4oKTt9CnNlbGVjdEZpbG1TdHJpcEZyYW1lKHRpbWUpe3RoaXMuX2V2ZW50RGl2aWRlcnMuc2V0KE5ldHdvcmsuTmV0d29ya0xvZ1ZpZXdDb2x1bW5zLl9maWxtU3RyaXBEaXZpZGVyQ29sb3IsW3RpbWVdKTt0aGlzLl9yZWRyYXdXYXRlcmZhbGxDb2x1bW4oKTt9CmNsZWFyRmlsbVN0cmlwRnJhbWUoKXt0aGlzLl9ldmVudERpdmlkZXJzLmRlbGV0ZShOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fZmlsbVN0cmlwRGl2aWRlckNvbG9yKTt0aGlzLl9yZWRyYXdXYXRlcmZhbGxDb2x1bW4oKTt9fTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5faW5pdGlhbFNvcnRDb2x1bW49J3dhdGVyZmFsbCc7TmV0d29yay5OZXR3b3JrTG9nVmlld0NvbHVtbnMuRGVzY3JpcHRvcjtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fY2FsY3VsYXRvclR5cGVzPXtEdXJhdGlvbjonRHVyYXRpb24nLFRpbWU6J1RpbWUnfTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fZGVmYXVsdENvbHVtbkNvbmZpZz17c3VidGl0bGU6bnVsbCx2aXNpYmxlOmZhbHNlLHdlaWdodDo2LHNvcnRhYmxlOnRydWUsaGlkZWFibGU6dHJ1ZSxub25TZWxlY3RhYmxlOnRydWUsaXNSZXNwb25zZUhlYWRlcjpmYWxzZSxhbHdheXNWaXNpYmxlOmZhbHNlLGlzQ3VzdG9tSGVhZGVyOmZhbHNlfTtOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Q29sdW1ucy5fZGVmYXVsdENvbHVtbnM9W3tpZDonbmFtZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdOYW1lJyksc3VidGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdQYXRoJyksdmlzaWJsZTp0cnVlLHdlaWdodDoyMCxoaWRlYWJsZTpmYWxzZSxub25TZWxlY3RhYmxlOmZhbHNlLGFsd2F5c1Zpc2libGU6dHJ1ZSxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuTmFtZUNvbXBhcmF0b3J9LHtpZDonbWV0aG9kJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ01ldGhvZCcpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXF1ZXN0UHJvcGVydHlDb21wYXJhdG9yLmJpbmQobnVsbCwncmVxdWVzdE1ldGhvZCcpfSx7aWQ6J3N0YXR1cycsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTdGF0dXMnKSx2aXNpYmxlOnRydWUsc3VidGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUZXh0Jyksc29ydGluZ0Z1bmN0aW9uOk5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlJlcXVlc3RQcm9wZXJ0eUNvbXBhcmF0b3IuYmluZChudWxsLCdzdGF0dXNDb2RlJyl9LHtpZDoncHJvdG9jb2wnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnUHJvdG9jb2wnKSxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuUmVxdWVzdFByb3BlcnR5Q29tcGFyYXRvci5iaW5kKG51bGwsJ3Byb3RvY29sJyl9LHtpZDonc2NoZW1lJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1NjaGVtZScpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXF1ZXN0UHJvcGVydHlDb21wYXJhdG9yLmJpbmQobnVsbCwnc2NoZW1lJyl9LHtpZDonZG9tYWluJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0RvbWFpbicpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXF1ZXN0UHJvcGVydHlDb21wYXJhdG9yLmJpbmQobnVsbCwnZG9tYWluJyl9LHtpZDoncmVtb3RlYWRkcmVzcycsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdSZW1vdGUgQWRkcmVzcycpLHdlaWdodDoxMCxhbGlnbjpEYXRhR3JpZC5EYXRhR3JpZC5BbGlnbi5SaWdodCxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuUmVtb3RlQWRkcmVzc0NvbXBhcmF0b3J9LHtpZDondHlwZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUeXBlJyksdmlzaWJsZTp0cnVlLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5UeXBlQ29tcGFyYXRvcn0se2lkOidpbml0aWF0b3InLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnSW5pdGlhdG9yJyksdmlzaWJsZTp0cnVlLHdlaWdodDoxMCxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuSW5pdGlhdG9yQ29tcGFyYXRvcn0se2lkOidjb29raWVzJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0Nvb2tpZXMnKSxhbGlnbjpEYXRhR3JpZC5EYXRhR3JpZC5BbGlnbi5SaWdodCxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuUmVxdWVzdENvb2tpZXNDb3VudENvbXBhcmF0b3J9LHtpZDonc2V0Y29va2llcycsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTZXQgQ29va2llcycpLGFsaWduOkRhdGFHcmlkLkRhdGFHcmlkLkFsaWduLlJpZ2h0LHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUNvb2tpZXNDb3VudENvbXBhcmF0b3J9LHtpZDonc2l6ZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTaXplJyksdmlzaWJsZTp0cnVlLHN1YnRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ29udGVudCcpLGFsaWduOkRhdGFHcmlkLkRhdGFHcmlkLkFsaWduLlJpZ2h0LHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5TaXplQ29tcGFyYXRvcn0se2lkOid0aW1lJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1RpbWUnKSx2aXNpYmxlOnRydWUsc3VidGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdMYXRlbmN5JyksYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uUmlnaHQsc29ydGluZ0Z1bmN0aW9uOk5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlJlcXVlc3RQcm9wZXJ0eUNvbXBhcmF0b3IuYmluZChudWxsLCdkdXJhdGlvbicpfSx7aWQ6J3ByaW9yaXR5Jyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ByaW9yaXR5Jyksc29ydGluZ0Z1bmN0aW9uOk5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlByaW9yaXR5Q29tcGFyYXRvcn0se2lkOidjb25uZWN0aW9uaWQnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ29ubmVjdGlvbiBJRCcpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXF1ZXN0UHJvcGVydHlDb21wYXJhdG9yLmJpbmQobnVsbCwnY29ubmVjdGlvbklkJyl9LHtpZDonY2FjaGUtY29udHJvbCcsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ2FjaGUtQ29udHJvbCcpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLCdjYWNoZS1jb250cm9sJyl9LHtpZDonY29ubmVjdGlvbicsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ29ubmVjdGlvbicpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLCdjb25uZWN0aW9uJyl9LHtpZDonY29udGVudC1lbmNvZGluZycsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ29udGVudC1FbmNvZGluZycpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLCdjb250ZW50LWVuY29kaW5nJyl9LHtpZDonY29udGVudC1sZW5ndGgnLGlzUmVzcG9uc2VIZWFkZXI6dHJ1ZSx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0NvbnRlbnQtTGVuZ3RoJyksYWxpZ246RGF0YUdyaWQuRGF0YUdyaWQuQWxpZ24uUmlnaHQsc29ydGluZ0Z1bmN0aW9uOk5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlJlc3BvbnNlSGVhZGVyTnVtYmVyQ29tcGFyYXRvci5iaW5kKG51bGwsJ2NvbnRlbnQtbGVuZ3RoJyl9LHtpZDonZXRhZycsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnRVRhZycpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLCdldGFnJyl9LHtpZDona2VlcC1hbGl2ZScsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnS2VlcC1BbGl2ZScpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlclN0cmluZ0NvbXBhcmF0b3IuYmluZChudWxsLCdrZWVwLWFsaXZlJyl9LHtpZDonbGFzdC1tb2RpZmllZCcsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnTGFzdC1Nb2RpZmllZCcpLHNvcnRpbmdGdW5jdGlvbjpOZXR3b3JrLk5ldHdvcmtSZXF1ZXN0Tm9kZS5SZXNwb25zZUhlYWRlckRhdGVDb21wYXJhdG9yLmJpbmQobnVsbCwnbGFzdC1tb2RpZmllZCcpfSx7aWQ6J3NlcnZlcicsaXNSZXNwb25zZUhlYWRlcjp0cnVlLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnU2VydmVyJyksc29ydGluZ0Z1bmN0aW9uOk5ldHdvcmsuTmV0d29ya1JlcXVlc3ROb2RlLlJlc3BvbnNlSGVhZGVyU3RyaW5nQ29tcGFyYXRvci5iaW5kKG51bGwsJ3NlcnZlcicpfSx7aWQ6J3ZhcnknLGlzUmVzcG9uc2VIZWFkZXI6dHJ1ZSx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ZhcnknKSxzb3J0aW5nRnVuY3Rpb246TmV0d29yay5OZXR3b3JrUmVxdWVzdE5vZGUuUmVzcG9uc2VIZWFkZXJTdHJpbmdDb21wYXJhdG9yLmJpbmQobnVsbCwndmFyeScpfSx7aWQ6J3dhdGVyZmFsbCcsdGl0bGU6JycsdmlzaWJsZTpmYWxzZSxoaWRlYWJsZTpmYWxzZX1dO05ldHdvcmsuTmV0d29ya0xvZ1ZpZXdDb2x1bW5zLl9maWxtU3RyaXBEaXZpZGVyQ29sb3I9JyNmY2NjNDknO05ldHdvcmsuTmV0d29ya0xvZ1ZpZXdDb2x1bW5zLldhdGVyZmFsbFNvcnRJZHM9e1N0YXJ0VGltZTonc3RhcnRUaW1lJyxSZXNwb25zZVRpbWU6J3Jlc3BvbnNlUmVjZWl2ZWRUaW1lJyxFbmRUaW1lOidlbmRUaW1lJyxEdXJhdGlvbjonZHVyYXRpb24nLExhdGVuY3k6J2xhdGVuY3knfTs7TmV0d29yay5OZXR3b3JrRnJhbWVHcm91cGVyPWNsYXNze2NvbnN0cnVjdG9yKHBhcmVudFZpZXcpe3RoaXMuX3BhcmVudFZpZXc9cGFyZW50Vmlldzt0aGlzLl9hY3RpdmVHcm91cHM9bmV3IE1hcCgpO30KZ3JvdXBOb2RlRm9yUmVxdWVzdChyZXF1ZXN0KXtjb25zdCBmcmFtZT1TREsuUmVzb3VyY2VUcmVlTW9kZWwuZnJhbWVGb3JSZXF1ZXN0KHJlcXVlc3QpO2lmKCFmcmFtZXx8ZnJhbWUuaXNUb3BGcmFtZSgpKQpyZXR1cm4gbnVsbDtsZXQgZ3JvdXBOb2RlPXRoaXMuX2FjdGl2ZUdyb3Vwcy5nZXQoZnJhbWUpO2lmKGdyb3VwTm9kZSkKcmV0dXJuIGdyb3VwTm9kZTtncm91cE5vZGU9bmV3IE5ldHdvcmsuRnJhbWVHcm91cE5vZGUodGhpcy5fcGFyZW50VmlldyxmcmFtZSk7dGhpcy5fYWN0aXZlR3JvdXBzLnNldChmcmFtZSxncm91cE5vZGUpO3JldHVybiBncm91cE5vZGU7fQpyZXNldCgpe3RoaXMuX2FjdGl2ZUdyb3Vwcy5jbGVhcigpO319O05ldHdvcmsuRnJhbWVHcm91cE5vZGU9Y2xhc3MgZXh0ZW5kcyBOZXR3b3JrLk5ldHdvcmtHcm91cE5vZGV7Y29uc3RydWN0b3IocGFyZW50VmlldyxmcmFtZSl7c3VwZXIocGFyZW50Vmlldyk7dGhpcy5fZnJhbWU9ZnJhbWU7dGhpcy5fcHJvZHVjdEJhZGdlPW51bGw7fQpkaXNwbGF5TmFtZSgpe3JldHVybiBuZXcgQ29tbW9uLlBhcnNlZFVSTCh0aGlzLl9mcmFtZS51cmwpLmRvbWFpbigpfHx0aGlzLl9mcmFtZS5uYW1lfHwnPGlmcmFtZT4nO30KcmVuZGVyQ2VsbChjZWxsLGNvbHVtbklkKXtzdXBlci5yZW5kZXJDZWxsKGNlbGwsY29sdW1uSWQpO2lmKGNvbHVtbklkPT09J25hbWUnKXtjb25zdCBuYW1lPXRoaXMuZGlzcGxheU5hbWUoKTtpZighdGhpcy5fcHJvZHVjdEJhZGdlKXt0aGlzLl9wcm9kdWN0QmFkZ2U9dGhpcy5wYXJlbnRWaWV3KCkuYmFkZ2VQb29sLmJhZGdlRm9yRnJhbWUodGhpcy5fZnJhbWUpO3RoaXMuX3Byb2R1Y3RCYWRnZS5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWZyYW1lLWdyb3VwLWJhZGdlJyk7fQpjZWxsLmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbmF2aWdhdG9yLWZyYW1lJywnbmV0d29yay1mcmFtZS1ncm91cC1pY29uJykpO2NlbGwuYXBwZW5kQ2hpbGQodGhpcy5fcHJvZHVjdEJhZGdlKTtjZWxsLmNyZWF0ZVRleHRDaGlsZChuYW1lKTtjZWxsLnRpdGxlPW5hbWU7fX19OztOZXR3b3JrLk5ldHdvcmtNYW5hZ2VDdXN0b21IZWFkZXJzVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoY29sdW1uRGF0YSxhZGRIZWFkZXJDb2x1bW5DYWxsYmFjayxjaGFuZ2VIZWFkZXJDb2x1bW5DYWxsYmFjayxyZW1vdmVIZWFkZXJDb2x1bW5DYWxsYmFjayl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL25ldHdvcmtNYW5hZ2VDdXN0b21IZWFkZXJzVmlldy5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2N1c3RvbS1oZWFkZXJzLXdyYXBwZXInKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFkZXInKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ01hbmFnZSBIZWFkZXIgQ29sdW1ucycpO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RXaWRnZXQodGhpcyk7dGhpcy5fbGlzdC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2N1c3RvbS1oZWFkZXJzLWxpc3QnKTt0aGlzLl9saXN0LnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ25ldHdvcmsvbmV0d29ya01hbmFnZUN1c3RvbUhlYWRlcnNWaWV3LmNzcycpO2NvbnN0IHBsYWNlaG9sZGVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2N1c3RvbS1oZWFkZXJzLWxpc3QtbGlzdC1lbXB0eScpO3BsYWNlaG9sZGVyLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gY3VzdG9tIGhlYWRlcnMnKTt0aGlzLl9saXN0LnNldEVtcHR5UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKFVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgY3VzdG9tIGhlYWRlclx1MjAyNicpLHRoaXMuX2FkZEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSwnYWRkLWJ1dHRvbicpKTt0aGlzLl9jb2x1bW5Db25maWdzPW5ldyBNYXAoKTtjb2x1bW5EYXRhLmZvckVhY2goY29sdW1uRGF0YT0+dGhpcy5fY29sdW1uQ29uZmlncy5zZXQoY29sdW1uRGF0YS50aXRsZS50b0xvd2VyQ2FzZSgpLGNvbHVtbkRhdGEpKTt0aGlzLl9hZGRIZWFkZXJDb2x1bW5DYWxsYmFjaz1hZGRIZWFkZXJDb2x1bW5DYWxsYmFjazt0aGlzLl9jaGFuZ2VIZWFkZXJDb2x1bW5DYWxsYmFjaz1jaGFuZ2VIZWFkZXJDb2x1bW5DYWxsYmFjazt0aGlzLl9yZW1vdmVIZWFkZXJDb2x1bW5DYWxsYmFjaz1yZW1vdmVIZWFkZXJDb2x1bW5DYWxsYmFjazt0aGlzLmNvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7fQp3YXNTaG93bigpe3RoaXMuX2hlYWRlcnNVcGRhdGVkKCk7fQpfaGVhZGVyc1VwZGF0ZWQoKXt0aGlzLl9saXN0LmNsZWFyKCk7dGhpcy5fY29sdW1uQ29uZmlncy5mb3JFYWNoKGhlYWRlckRhdGE9PnRoaXMuX2xpc3QuYXBwZW5kSXRlbSh7aGVhZGVyOmhlYWRlckRhdGEudGl0bGV9LGhlYWRlckRhdGEuZWRpdGFibGUpKTt9Cl9hZGRCdXR0b25DbGlja2VkKCl7dGhpcy5fbGlzdC5hZGROZXdJdGVtKHRoaXMuX2NvbHVtbkNvbmZpZ3Muc2l6ZSx7aGVhZGVyOicnfSk7fQpyZW5kZXJJdGVtKGl0ZW0sZWRpdGFibGUpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnY3VzdG9tLWhlYWRlcnMtbGlzdC1pdGVtJyk7Y29uc3QgaGVhZGVyPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2N1c3RvbS1oZWFkZXItbmFtZScpO2hlYWRlci50ZXh0Q29udGVudD1pdGVtLmhlYWRlcjtoZWFkZXIudGl0bGU9aXRlbS5oZWFkZXI7cmV0dXJuIGVsZW1lbnQ7fQpyZW1vdmVJdGVtUmVxdWVzdGVkKGl0ZW0saW5kZXgpe3RoaXMuX3JlbW92ZUhlYWRlckNvbHVtbkNhbGxiYWNrKGl0ZW0uaGVhZGVyKTt0aGlzLl9jb2x1bW5Db25maWdzLmRlbGV0ZShpdGVtLmhlYWRlci50b0xvd2VyQ2FzZSgpKTt0aGlzLl9oZWFkZXJzVXBkYXRlZCgpO30KY29tbWl0RWRpdChpdGVtLGVkaXRvcixpc05ldyl7Y29uc3QgaGVhZGVySWQ9ZWRpdG9yLmNvbnRyb2woJ2hlYWRlcicpLnZhbHVlLnRyaW0oKTtsZXQgc3VjY2VzcztpZihpc05ldykKc3VjY2Vzcz10aGlzLl9hZGRIZWFkZXJDb2x1bW5DYWxsYmFjayhoZWFkZXJJZCk7ZWxzZQpzdWNjZXNzPXRoaXMuX2NoYW5nZUhlYWRlckNvbHVtbkNhbGxiYWNrKGl0ZW0uaGVhZGVyLGhlYWRlcklkKTtpZihzdWNjZXNzJiYhaXNOZXcpCnRoaXMuX2NvbHVtbkNvbmZpZ3MuZGVsZXRlKGl0ZW0uaGVhZGVyLnRvTG93ZXJDYXNlKCkpO2lmKHN1Y2Nlc3MpCnRoaXMuX2NvbHVtbkNvbmZpZ3Muc2V0KGhlYWRlcklkLnRvTG93ZXJDYXNlKCkse3RpdGxlOmhlYWRlcklkLGVkaXRhYmxlOnRydWV9KTt0aGlzLl9oZWFkZXJzVXBkYXRlZCgpO30KYmVnaW5FZGl0KGl0ZW0pe2NvbnN0IGVkaXRvcj10aGlzLl9jcmVhdGVFZGl0b3IoKTtlZGl0b3IuY29udHJvbCgnaGVhZGVyJykudmFsdWU9aXRlbS5oZWFkZXI7cmV0dXJuIGVkaXRvcjt9Cl9jcmVhdGVFZGl0b3IoKXtpZih0aGlzLl9lZGl0b3IpCnJldHVybiB0aGlzLl9lZGl0b3I7Y29uc3QgZWRpdG9yPW5ldyBVSS5MaXN0V2lkZ2V0LkVkaXRvcigpO3RoaXMuX2VkaXRvcj1lZGl0b3I7Y29uc3QgY29udGVudD1lZGl0b3IuY29udGVudEVsZW1lbnQoKTtjb25zdCB0aXRsZXM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnY3VzdG9tLWhlYWRlcnMtZWRpdC1yb3cnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2N1c3RvbS1oZWFkZXJzLWhlYWRlcicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnSGVhZGVyIE5hbWUnKTtjb25zdCBmaWVsZHM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnY3VzdG9tLWhlYWRlcnMtZWRpdC1yb3cnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2N1c3RvbS1oZWFkZXJzLWhlYWRlcicpLmFwcGVuZENoaWxkKGVkaXRvci5jcmVhdGVJbnB1dCgnaGVhZGVyJywndGV4dCcsJ3gtY3VzdG9tLWhlYWRlcicsdmFsaWRhdGVIZWFkZXIuYmluZCh0aGlzKSkpO3JldHVybiBlZGl0b3I7ZnVuY3Rpb24gdmFsaWRhdGVIZWFkZXIoaXRlbSxpbmRleCxpbnB1dCl7Y29uc3QgaGVhZGVySWQ9ZWRpdG9yLmNvbnRyb2woJ2hlYWRlcicpLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuX2NvbHVtbkNvbmZpZ3MuaGFzKGhlYWRlcklkKSYmaXRlbS5oZWFkZXIhPT1oZWFkZXJJZCkKcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO319fTs7TmV0d29yay5OZXR3b3JrT3ZlcnZpZXc9Y2xhc3MgZXh0ZW5kcyBQZXJmVUkuVGltZWxpbmVPdmVydmlld0Jhc2V7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3NlbGVjdGVkRmlsbVN0cmlwVGltZT0tMTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbmV0d29yay1vdmVydmlldycpO3RoaXMuX251bUJhbmRzPTE7dGhpcy5fdXBkYXRlU2NoZWR1bGVkPWZhbHNlO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuTG9hZCx0aGlzLl9sb2FkRXZlbnRGaXJlZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbCxTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkRPTUNvbnRlbnRMb2FkZWQsdGhpcy5fZG9tQ29udGVudExvYWRlZEV2ZW50RmlyZWQsdGhpcyk7dGhpcy5yZXNldCgpO30Kc2V0RmlsbVN0cmlwTW9kZWwoZmlsbVN0cmlwTW9kZWwpe3RoaXMuX2ZpbG1TdHJpcE1vZGVsPWZpbG1TdHJpcE1vZGVsO3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9CnNlbGVjdEZpbG1TdHJpcEZyYW1lKHRpbWUpe3RoaXMuX3NlbGVjdGVkRmlsbVN0cmlwVGltZT10aW1lO3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9CmNsZWFyRmlsbVN0cmlwRnJhbWUoKXt0aGlzLl9zZWxlY3RlZEZpbG1TdHJpcFRpbWU9LTE7dGhpcy5zY2hlZHVsZVVwZGF0ZSgpO30KX2xvYWRFdmVudEZpcmVkKGV2ZW50KXtjb25zdCB0aW1lPShldmVudC5kYXRhLmxvYWRUaW1lKTtpZih0aW1lKQp0aGlzLl9sb2FkRXZlbnRzLnB1c2godGltZSoxMDAwKTt0aGlzLnNjaGVkdWxlVXBkYXRlKCk7fQpfZG9tQ29udGVudExvYWRlZEV2ZW50RmlyZWQoZXZlbnQpe2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO2lmKGRhdGEpCnRoaXMuX2RvbUNvbnRlbnRMb2FkZWRFdmVudHMucHVzaChkYXRhKjEwMDApO3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9Cl9iYW5kSWQoY29ubmVjdGlvbklkKXtpZighY29ubmVjdGlvbklkfHxjb25uZWN0aW9uSWQ9PT0nMCcpCnJldHVybi0xO2lmKHRoaXMuX2JhbmRNYXAuaGFzKGNvbm5lY3Rpb25JZCkpCnJldHVybih0aGlzLl9iYW5kTWFwLmdldChjb25uZWN0aW9uSWQpKTtjb25zdCByZXN1bHQ9dGhpcy5fbmV4dEJhbmQrKzt0aGlzLl9iYW5kTWFwLnNldChjb25uZWN0aW9uSWQscmVzdWx0KTtyZXR1cm4gcmVzdWx0O30KdXBkYXRlUmVxdWVzdChyZXF1ZXN0KXtpZighdGhpcy5fcmVxdWVzdHNTZXQuaGFzKHJlcXVlc3QpKXt0aGlzLl9yZXF1ZXN0c1NldC5hZGQocmVxdWVzdCk7dGhpcy5fcmVxdWVzdHNMaXN0LnB1c2gocmVxdWVzdCk7fQp0aGlzLnNjaGVkdWxlVXBkYXRlKCk7fQp3YXNTaG93bigpe3RoaXMub25SZXNpemUoKTt9Cm9uUmVzaXplKCl7Y29uc3Qgd2lkdGg9dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO2NvbnN0IGhlaWdodD10aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O3RoaXMuY2FsY3VsYXRvcigpLnNldERpc3BsYXlXaWR0aCh3aWR0aCk7dGhpcy5yZXNldENhbnZhcygpO2NvbnN0IG51bUJhbmRzPSgoKGhlaWdodC0xKS9OZXR3b3JrLk5ldHdvcmtPdmVydmlldy5fYmFuZEhlaWdodCktMSl8MDt0aGlzLl9udW1CYW5kcz0obnVtQmFuZHM+MCk/bnVtQmFuZHM6MTt0aGlzLnNjaGVkdWxlVXBkYXRlKCk7fQpyZXNldCgpe3RoaXMuX2ZpbG1TdHJpcE1vZGVsPW51bGw7dGhpcy5fc3Bhbj0xO3RoaXMuX2xhc3RCb3VuZGFyeT1udWxsO3RoaXMuX25leHRCYW5kPTA7dGhpcy5fYmFuZE1hcD1uZXcgTWFwKCk7dGhpcy5fcmVxdWVzdHNMaXN0PVtdO3RoaXMuX3JlcXVlc3RzU2V0PW5ldyBTZXQoKTt0aGlzLl9sb2FkRXZlbnRzPVtdO3RoaXMuX2RvbUNvbnRlbnRMb2FkZWRFdmVudHM9W107dGhpcy5yZXNldENhbnZhcygpO30Kc2NoZWR1bGVVcGRhdGUoKXtpZih0aGlzLl91cGRhdGVTY2hlZHVsZWR8fCF0aGlzLmlzU2hvd2luZygpKQpyZXR1cm47dGhpcy5fdXBkYXRlU2NoZWR1bGVkPXRydWU7dGhpcy5lbGVtZW50LndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTt9CnVwZGF0ZSgpe3RoaXMuX3VwZGF0ZVNjaGVkdWxlZD1mYWxzZTtjb25zdCBjYWxjdWxhdG9yPXRoaXMuY2FsY3VsYXRvcigpO2NvbnN0IG5ld0JvdW5kYXJ5PW5ldyBOZXR3b3JrLk5ldHdvcmtUaW1lQm91bmRhcnkoY2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKSxjYWxjdWxhdG9yLm1heGltdW1Cb3VuZGFyeSgpKTtpZighdGhpcy5fbGFzdEJvdW5kYXJ5fHwhbmV3Qm91bmRhcnkuZXF1YWxzKHRoaXMuX2xhc3RCb3VuZGFyeSkpe2NvbnN0IHNwYW49Y2FsY3VsYXRvci5ib3VuZGFyeVNwYW4oKTt3aGlsZSh0aGlzLl9zcGFuPHNwYW4pCnRoaXMuX3NwYW4qPTEuMjU7Y2FsY3VsYXRvci5zZXRCb3VuZHMoY2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKSxjYWxjdWxhdG9yLm1pbmltdW1Cb3VuZGFyeSgpK3RoaXMuX3NwYW4pO3RoaXMuX2xhc3RCb3VuZGFyeT1uZXcgTmV0d29yay5OZXR3b3JrVGltZUJvdW5kYXJ5KGNhbGN1bGF0b3IubWluaW11bUJvdW5kYXJ5KCksY2FsY3VsYXRvci5tYXhpbXVtQm91bmRhcnkoKSk7fQpjb25zdCBjb250ZXh0PXRoaXMuY29udGV4dCgpO2NvbnN0IGxpbmVzQnlUeXBlPXt9O2NvbnN0IHBhZGRpbmdUb3A9MjtmdW5jdGlvbiBkcmF3TGluZXModHlwZSxzdHJva2VTdHlsZSl7Y29uc3QgbGluZXM9bGluZXNCeVR5cGVbdHlwZV07aWYoIWxpbmVzKQpyZXR1cm47Y29uc3Qgbj1saW5lcy5sZW5ndGg7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LnN0cm9rZVN0eWxlPXN0cm9rZVN0eWxlO2ZvcihsZXQgaT0wO2k8bjspe2NvbnN0IHk9bGluZXNbaSsrXSpOZXR3b3JrLk5ldHdvcmtPdmVydmlldy5fYmFuZEhlaWdodCtwYWRkaW5nVG9wO2NvbnN0IHN0YXJ0VGltZT1saW5lc1tpKytdO2xldCBlbmRUaW1lPWxpbmVzW2krK107aWYoZW5kVGltZT09PU51bWJlci5NQVhfVkFMVUUpCmVuZFRpbWU9Y2FsY3VsYXRvci5tYXhpbXVtQm91bmRhcnkoKTtjb250ZXh0Lm1vdmVUbyhjYWxjdWxhdG9yLmNvbXB1dGVQb3NpdGlvbihzdGFydFRpbWUpLHkpO2NvbnRleHQubGluZVRvKGNhbGN1bGF0b3IuY29tcHV0ZVBvc2l0aW9uKGVuZFRpbWUpKzEseSk7fQpjb250ZXh0LnN0cm9rZSgpO30KZnVuY3Rpb24gYWRkTGluZSh0eXBlLHksc3RhcnQsZW5kKXtsZXQgbGluZXM9bGluZXNCeVR5cGVbdHlwZV07aWYoIWxpbmVzKXtsaW5lcz1bXTtsaW5lc0J5VHlwZVt0eXBlXT1saW5lczt9CmxpbmVzLnB1c2goeSxzdGFydCxlbmQpO30KY29uc3QgcmVxdWVzdHM9dGhpcy5fcmVxdWVzdHNMaXN0O2NvbnN0IG49cmVxdWVzdHMubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2NvbnN0IHJlcXVlc3Q9cmVxdWVzdHNbaV07Y29uc3QgYmFuZD10aGlzLl9iYW5kSWQocmVxdWVzdC5jb25uZWN0aW9uSWQpO2NvbnN0IHk9KGJhbmQ9PT0tMSk/MDooYmFuZCV0aGlzLl9udW1CYW5kcysxKTtjb25zdCB0aW1lUmFuZ2VzPU5ldHdvcmsuUmVxdWVzdFRpbWluZ1ZpZXcuY2FsY3VsYXRlUmVxdWVzdFRpbWVSYW5nZXMocmVxdWVzdCx0aGlzLmNhbGN1bGF0b3IoKS5taW5pbXVtQm91bmRhcnkoKSk7Zm9yKGxldCBqPTA7ajx0aW1lUmFuZ2VzLmxlbmd0aDsrK2ope2NvbnN0IHR5cGU9dGltZVJhbmdlc1tqXS5uYW1lO2lmKGJhbmQhPT0tMXx8dHlwZT09PU5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlRvdGFsKQphZGRMaW5lKHR5cGUseSx0aW1lUmFuZ2VzW2pdLnN0YXJ0KjEwMDAsdGltZVJhbmdlc1tqXS5lbmQqMTAwMCk7fX0KY29udGV4dC5jbGVhclJlY3QoMCwwLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTtjb250ZXh0LnNhdmUoKTtjb250ZXh0LnNjYWxlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtjb250ZXh0LmxpbmVXaWR0aD0yO2RyYXdMaW5lcyhOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Ub3RhbCwnI0NDQ0NDQycpO2RyYXdMaW5lcyhOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5CbG9ja2luZywnI0FBQUFBQScpO2RyYXdMaW5lcyhOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Db25uZWN0aW5nLCcjRkY5ODAwJyk7ZHJhd0xpbmVzKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNlcnZpY2VXb3JrZXIsJyNGRjk4MDAnKTtkcmF3TGluZXMoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuU2VydmljZVdvcmtlclByZXBhcmF0aW9uLCcjRkY5ODAwJyk7ZHJhd0xpbmVzKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlB1c2gsJyM4Q0RCZmYnKTtkcmF3TGluZXMoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUHJveHksJyNBMTg4N0YnKTtkcmF3TGluZXMoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuRE5TLCcjMDA5Njg4Jyk7ZHJhd0xpbmVzKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNTTCwnIzlDMjdCMCcpO2RyYXdMaW5lcyhOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5TZW5kaW5nLCcjQjBCRUM1Jyk7ZHJhd0xpbmVzKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLldhaXRpbmcsJyMwMEM4NTMnKTtkcmF3TGluZXMoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUmVjZWl2aW5nLCcjMDNBOUY0Jyk7Y29uc3QgaGVpZ2h0PXRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7Y29udGV4dC5saW5lV2lkdGg9MTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuc3Ryb2tlU3R5bGU9JyM4MDgwRkYnO2ZvcihsZXQgaT10aGlzLl9kb21Db250ZW50TG9hZGVkRXZlbnRzLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCB4PU1hdGgucm91bmQoY2FsY3VsYXRvci5jb21wdXRlUG9zaXRpb24odGhpcy5fZG9tQ29udGVudExvYWRlZEV2ZW50c1tpXSkpKzAuNTtjb250ZXh0Lm1vdmVUbyh4LDApO2NvbnRleHQubGluZVRvKHgsaGVpZ2h0KTt9CmNvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LnN0cm9rZVN0eWxlPScjRkY4MDgwJztmb3IobGV0IGk9dGhpcy5fbG9hZEV2ZW50cy5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgeD1NYXRoLnJvdW5kKGNhbGN1bGF0b3IuY29tcHV0ZVBvc2l0aW9uKHRoaXMuX2xvYWRFdmVudHNbaV0pKSswLjU7Y29udGV4dC5tb3ZlVG8oeCwwKTtjb250ZXh0LmxpbmVUbyh4LGhlaWdodCk7fQpjb250ZXh0LnN0cm9rZSgpO2lmKHRoaXMuX3NlbGVjdGVkRmlsbVN0cmlwVGltZSE9PS0xKXtjb250ZXh0LmxpbmVXaWR0aD0yO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5zdHJva2VTdHlsZT0nI0ZDQ0M0OSc7Y29uc3QgeD1NYXRoLnJvdW5kKGNhbGN1bGF0b3IuY29tcHV0ZVBvc2l0aW9uKHRoaXMuX3NlbGVjdGVkRmlsbVN0cmlwVGltZSkpO2NvbnRleHQubW92ZVRvKHgsMCk7Y29udGV4dC5saW5lVG8oeCxoZWlnaHQpO2NvbnRleHQuc3Ryb2tlKCk7fQpjb250ZXh0LnJlc3RvcmUoKTt9fTtOZXR3b3JrLk5ldHdvcmtPdmVydmlldy5fYmFuZEhlaWdodD0zO05ldHdvcmsuTmV0d29ya092ZXJ2aWV3LldpbmRvdzs7TmV0d29yay5OZXR3b3JrU2VhcmNoU2NvcGU9Y2xhc3N7cGVyZm9ybUluZGV4aW5nKHByb2dyZXNzKXtzZXRJbW1lZGlhdGUocHJvZ3Jlc3MuZG9uZS5iaW5kKHByb2dyZXNzKSk7fQphc3luYyBwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxwcm9ncmVzcyxzZWFyY2hSZXN1bHRDYWxsYmFjayxzZWFyY2hGaW5pc2hlZENhbGxiYWNrKXtjb25zdCBwcm9taXNlcz1bXTtjb25zdCByZXF1ZXN0cz1Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVxdWVzdHMoKS5maWx0ZXIocmVxdWVzdD0+c2VhcmNoQ29uZmlnLmZpbGVQYXRoTWF0Y2hlc0ZpbGVRdWVyeShyZXF1ZXN0LnVybCgpKSk7cHJvZ3Jlc3Muc2V0VG90YWxXb3JrKHJlcXVlc3RzLmxlbmd0aCk7Zm9yKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpe2NvbnN0IHByb21pc2U9dGhpcy5fc2VhcmNoUmVxdWVzdChzZWFyY2hDb25maWcscmVxdWVzdCxwcm9ncmVzcyk7cHJvbWlzZXMucHVzaChwcm9taXNlKTt9CmNvbnN0IHJlc3VsdHM9YXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO2lmKHByb2dyZXNzLmlzQ2FuY2VsZWQoKSl7c2VhcmNoRmluaXNoZWRDYWxsYmFjayhmYWxzZSk7cmV0dXJuO30KZm9yKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzLnNvcnQoKHIxLHIyKT0+cjEubGFiZWwoKS5sb2NhbGVDb21wYXJlKHIyLmxhYmVsKCkpKSl7aWYocmVzdWx0Lm1hdGNoZXNDb3VudCgpPjApCnNlYXJjaFJlc3VsdENhbGxiYWNrKHJlc3VsdCk7fQpwcm9ncmVzcy5kb25lKCk7c2VhcmNoRmluaXNoZWRDYWxsYmFjayh0cnVlKTt9CmFzeW5jIF9zZWFyY2hSZXF1ZXN0KHNlYXJjaENvbmZpZyxyZXF1ZXN0LHByb2dyZXNzKXtsZXQgYm9keU1hdGNoZXM9W107aWYocmVxdWVzdC5jb250ZW50VHlwZSgpLmlzVGV4dFR5cGUoKSl7Ym9keU1hdGNoZXM9YXdhaXQgcmVxdWVzdC5zZWFyY2hJbkNvbnRlbnQoc2VhcmNoQ29uZmlnLnF1ZXJ5KCksIXNlYXJjaENvbmZpZy5pZ25vcmVDYXNlKCksc2VhcmNoQ29uZmlnLmlzUmVnZXgoKSk7fQppZihwcm9ncmVzcy5pc0NhbmNlbGVkKCkpCnJldHVybiBudWxsO2NvbnN0IGxvY2F0aW9ucz1bXTtpZihzdHJpbmdNYXRjaGVzUXVlcnkocmVxdWVzdC51cmwoKSkpCmxvY2F0aW9ucy5wdXNoKE5ldHdvcmsuVUlSZXF1ZXN0TG9jYXRpb24udXJsTWF0Y2gocmVxdWVzdCkpO2Zvcihjb25zdCBoZWFkZXIgb2YgcmVxdWVzdC5yZXF1ZXN0SGVhZGVycygpKXtpZihoZWFkZXJNYXRjaGVzUXVlcnkoaGVhZGVyKSkKbG9jYXRpb25zLnB1c2goTmV0d29yay5VSVJlcXVlc3RMb2NhdGlvbi5yZXF1ZXN0SGVhZGVyTWF0Y2gocmVxdWVzdCxoZWFkZXIpKTt9CmZvcihjb25zdCBoZWFkZXIgb2YgcmVxdWVzdC5yZXNwb25zZUhlYWRlcnMpe2lmKGhlYWRlck1hdGNoZXNRdWVyeShoZWFkZXIpKQpsb2NhdGlvbnMucHVzaChOZXR3b3JrLlVJUmVxdWVzdExvY2F0aW9uLnJlc3BvbnNlSGVhZGVyTWF0Y2gocmVxdWVzdCxoZWFkZXIpKTt9CmZvcihjb25zdCBtYXRjaCBvZiBib2R5TWF0Y2hlcykKbG9jYXRpb25zLnB1c2goTmV0d29yay5VSVJlcXVlc3RMb2NhdGlvbi5ib2R5TWF0Y2gocmVxdWVzdCxtYXRjaCkpO3Byb2dyZXNzLndvcmtlZCgpO3JldHVybiBuZXcgTmV0d29yay5OZXR3b3JrU2VhcmNoUmVzdWx0KHJlcXVlc3QsbG9jYXRpb25zKTtmdW5jdGlvbiBoZWFkZXJNYXRjaGVzUXVlcnkoaGVhZGVyKXtyZXR1cm4gc3RyaW5nTWF0Y2hlc1F1ZXJ5KGAke2hlYWRlci5uYW1lfTogJHtoZWFkZXIudmFsdWV9YCk7fQpmdW5jdGlvbiBzdHJpbmdNYXRjaGVzUXVlcnkoc3RyaW5nKXtjb25zdCBmbGFncz1zZWFyY2hDb25maWcuaWdub3JlQ2FzZSgpPydpJzonJztjb25zdCByZWdFeHBzPXNlYXJjaENvbmZpZy5xdWVyaWVzKCkubWFwKHF1ZXJ5PT5uZXcgUmVnRXhwKHF1ZXJ5LGZsYWdzKSk7bGV0IHBvcz0wO2Zvcihjb25zdCByZWdFeHAgb2YgcmVnRXhwcyl7Y29uc3QgbWF0Y2g9c3RyaW5nLnN1YnN0cihwb3MpLm1hdGNoKHJlZ0V4cCk7aWYoIW1hdGNoKQpyZXR1cm4gZmFsc2U7cG9zKz1tYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGg7fQpyZXR1cm4gdHJ1ZTt9fQpzdG9wU2VhcmNoKCl7fX07TmV0d29yay5VSVJlcXVlc3RMb2NhdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihyZXF1ZXN0LHJlcXVlc3RIZWFkZXIscmVzcG9uc2VIZWFkZXIsc2VhcmNoTWF0Y2gsdXJsTWF0Y2gpe3RoaXMucmVxdWVzdD1yZXF1ZXN0O3RoaXMucmVxdWVzdEhlYWRlcj1yZXF1ZXN0SGVhZGVyO3RoaXMucmVzcG9uc2VIZWFkZXI9cmVzcG9uc2VIZWFkZXI7dGhpcy5zZWFyY2hNYXRjaD1zZWFyY2hNYXRjaDt0aGlzLmlzVXJsTWF0Y2g9dXJsTWF0Y2g7fQpzdGF0aWMgcmVxdWVzdEhlYWRlck1hdGNoKHJlcXVlc3QsaGVhZGVyKXtyZXR1cm4gbmV3IE5ldHdvcmsuVUlSZXF1ZXN0TG9jYXRpb24ocmVxdWVzdCxoZWFkZXIsbnVsbCxudWxsLGZhbHNlKTt9CnN0YXRpYyByZXNwb25zZUhlYWRlck1hdGNoKHJlcXVlc3QsaGVhZGVyKXtyZXR1cm4gbmV3IE5ldHdvcmsuVUlSZXF1ZXN0TG9jYXRpb24ocmVxdWVzdCxudWxsLGhlYWRlcixudWxsLGZhbHNlKTt9CnN0YXRpYyBib2R5TWF0Y2gocmVxdWVzdCxzZWFyY2hNYXRjaCl7cmV0dXJuIG5ldyBOZXR3b3JrLlVJUmVxdWVzdExvY2F0aW9uKHJlcXVlc3QsbnVsbCxudWxsLHNlYXJjaE1hdGNoLGZhbHNlKTt9CnN0YXRpYyB1cmxNYXRjaChyZXF1ZXN0KXtyZXR1cm4gbmV3IE5ldHdvcmsuVUlSZXF1ZXN0TG9jYXRpb24ocmVxdWVzdCxudWxsLG51bGwsbnVsbCx0cnVlKTt9fTtOZXR3b3JrLk5ldHdvcmtTZWFyY2hSZXN1bHQ9Y2xhc3N7Y29uc3RydWN0b3IocmVxdWVzdCxsb2NhdGlvbnMpe3RoaXMuX3JlcXVlc3Q9cmVxdWVzdDt0aGlzLl9sb2NhdGlvbnM9bG9jYXRpb25zO30KbWF0Y2hlc0NvdW50KCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9ucy5sZW5ndGg7fQpsYWJlbCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0LmRpc3BsYXlOYW1lO30KZGVzY3JpcHRpb24oKXtjb25zdCBwYXJzZWRVcmw9dGhpcy5fcmVxdWVzdC5wYXJzZWRVUkw7aWYoIXBhcnNlZFVybCkKcmV0dXJuIHRoaXMuX3JlcXVlc3QudXJsKCk7cmV0dXJuIHBhcnNlZFVybC51cmxXaXRob3V0U2NoZW1lKCk7fQptYXRjaExpbmVDb250ZW50KGluZGV4KXtjb25zdCBsb2NhdGlvbj10aGlzLl9sb2NhdGlvbnNbaW5kZXhdO2lmKGxvY2F0aW9uLmlzVXJsTWF0Y2gpCnJldHVybiB0aGlzLl9yZXF1ZXN0LnVybCgpO2NvbnN0IGhlYWRlcj1sb2NhdGlvbi5yZXF1ZXN0SGVhZGVyfHxsb2NhdGlvbi5yZXNwb25zZUhlYWRlcjtpZihoZWFkZXIpCnJldHVybiBoZWFkZXIudmFsdWU7cmV0dXJuIGxvY2F0aW9uLnNlYXJjaE1hdGNoLmxpbmVDb250ZW50O30KbWF0Y2hSZXZlYWxhYmxlKGluZGV4KXtyZXR1cm4gdGhpcy5fbG9jYXRpb25zW2luZGV4XTt9Cm1hdGNoTGFiZWwoaW5kZXgpe2NvbnN0IGxvY2F0aW9uPXRoaXMuX2xvY2F0aW9uc1tpbmRleF07aWYobG9jYXRpb24uaXNVcmxNYXRjaCkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnVVJMJyk7Y29uc3QgaGVhZGVyPWxvY2F0aW9uLnJlcXVlc3RIZWFkZXJ8fGxvY2F0aW9uLnJlc3BvbnNlSGVhZGVyO2lmKGhlYWRlcikKcmV0dXJuYCR7aGVhZGVyLm5hbWV9OmA7cmV0dXJuIGxvY2F0aW9uLnNlYXJjaE1hdGNoLmxpbmVOdW1iZXIrMTt9fTs7TmV0d29yay5OZXR3b3JrV2F0ZXJmYWxsQ29sdW1uPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihjYWxjdWxhdG9yKXtzdXBlcihmYWxzZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL25ldHdvcmtXYXRlcmZhbGxDb2x1bW4uY3NzJyk7dGhpcy5fY2FudmFzPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NhbnZhcycpO3RoaXMuX2NhbnZhcy50YWJJbmRleD0wO3RoaXMuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX2NhbnZhcyk7dGhpcy5fY2FudmFzUG9zaXRpb249dGhpcy5fY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2xlZnRQYWRkaW5nPTU7dGhpcy5fZm9udFNpemU9MTA7dGhpcy5fcmlnaHRQYWRkaW5nPTA7dGhpcy5fc2Nyb2xsVG9wPTA7dGhpcy5faGVhZGVySGVpZ2h0PTA7dGhpcy5fY2FsY3VsYXRvcj1jYWxjdWxhdG9yO3RoaXMuX3Jhd1Jvd0hlaWdodD0wO3RoaXMuX3Jvd0hlaWdodD0wO3RoaXMuX29mZnNldFdpZHRoPTA7dGhpcy5fb2Zmc2V0SGVpZ2h0PTA7dGhpcy5fc3RhcnRUaW1lPXRoaXMuX2NhbGN1bGF0b3IubWluaW11bUJvdW5kYXJ5KCk7dGhpcy5fZW5kVGltZT10aGlzLl9jYWxjdWxhdG9yLm1heGltdW1Cb3VuZGFyeSgpO3RoaXMuX3BvcG92ZXJIZWxwZXI9bmV3IFVJLlBvcG92ZXJIZWxwZXIodGhpcy5lbGVtZW50LHRoaXMuX2dldFBvcG92ZXJSZXF1ZXN0LmJpbmQodGhpcykpO3RoaXMuX3BvcG92ZXJIZWxwZXIuc2V0SGFzUGFkZGluZyh0cnVlKTt0aGlzLl9wb3BvdmVySGVscGVyLnNldFRpbWVvdXQoMzAwLDMwMCk7dGhpcy5fbm9kZXM9W107dGhpcy5faG92ZXJlZE5vZGU9bnVsbDt0aGlzLl9ldmVudERpdmlkZXJzPW5ldyBNYXAoKTt0aGlzLl91cGRhdGVSZXF1ZXN0SUQ7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fb25Nb3VzZU1vdmUuYmluZCh0aGlzKSx0cnVlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsZXZlbnQ9PnRoaXMuX3NldEhvdmVyZWROb2RlKG51bGwsZmFsc2UpLHRydWUpO3RoaXMuX3N0eWxlRm9yVGltZVJhbmdlTmFtZT1OZXR3b3JrLk5ldHdvcmtXYXRlcmZhbGxDb2x1bW4uX2J1aWxkUmVxdWVzdFRpbWVSYW5nZVN0eWxlKCk7Y29uc3QgcmVzb3VyY2VTdHlsZVR1cGxlPU5ldHdvcmsuTmV0d29ya1dhdGVyZmFsbENvbHVtbi5fYnVpbGRSZXNvdXJjZVR5cGVTdHlsZSgpO3RoaXMuX3N0eWxlRm9yV2FpdGluZ1Jlc291cmNlVHlwZT1yZXNvdXJjZVN0eWxlVHVwbGVbMF07dGhpcy5fc3R5bGVGb3JEb3dubG9hZGluZ1Jlc291cmNlVHlwZT1yZXNvdXJjZVN0eWxlVHVwbGVbMV07Y29uc3QgYmFzZUxpbmVDb2xvcj1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyNhNWE1YTUnLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO3RoaXMuX3dpc2tlclN0eWxlPXtib3JkZXJDb2xvcjpiYXNlTGluZUNvbG9yLGxpbmVXaWR0aDoxfTt0aGlzLl9ob3ZlckRldGFpbHNTdHlsZT17ZmlsbFN0eWxlOmJhc2VMaW5lQ29sb3IsbGluZVdpZHRoOjEsYm9yZGVyQ29sb3I6YmFzZUxpbmVDb2xvcn07dGhpcy5fcGF0aEZvclN0eWxlPW5ldyBNYXAoKTt0aGlzLl90ZXh0TGF5ZXJzPVtdO30Kc3RhdGljIF9idWlsZFJlcXVlc3RUaW1lUmFuZ2VTdHlsZSgpe2NvbnN0IHR5cGVzPU5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzO2NvbnN0IHN0eWxlTWFwPW5ldyBNYXAoKTtzdHlsZU1hcC5zZXQodHlwZXMuQ29ubmVjdGluZyx7ZmlsbFN0eWxlOicjRkY5ODAwJ30pO3N0eWxlTWFwLnNldCh0eXBlcy5TU0wse2ZpbGxTdHlsZTonIzlDMjdCMCd9KTtzdHlsZU1hcC5zZXQodHlwZXMuRE5TLHtmaWxsU3R5bGU6JyMwMDk2ODgnfSk7c3R5bGVNYXAuc2V0KHR5cGVzLlByb3h5LHtmaWxsU3R5bGU6JyNBMTg4N0YnfSk7c3R5bGVNYXAuc2V0KHR5cGVzLkJsb2NraW5nLHtmaWxsU3R5bGU6JyNBQUFBQUEnfSk7c3R5bGVNYXAuc2V0KHR5cGVzLlB1c2gse2ZpbGxTdHlsZTonIzhDREJmZid9KTtzdHlsZU1hcC5zZXQodHlwZXMuUXVldWVpbmcse2ZpbGxTdHlsZTond2hpdGUnLGxpbmVXaWR0aDoyLGJvcmRlckNvbG9yOidsaWdodGdyZXknfSk7c3R5bGVNYXAuc2V0KHR5cGVzLlJlY2VpdmluZyx7ZmlsbFN0eWxlOicjMDNBOUY0JyxsaW5lV2lkdGg6Mixib3JkZXJDb2xvcjonIzAzQTlGNCd9KTtzdHlsZU1hcC5zZXQodHlwZXMuV2FpdGluZyx7ZmlsbFN0eWxlOicjMDBDODUzJ30pO3N0eWxlTWFwLnNldCh0eXBlcy5SZWNlaXZpbmdQdXNoLHtmaWxsU3R5bGU6JyMwM0E5RjQnfSk7c3R5bGVNYXAuc2V0KHR5cGVzLlNlcnZpY2VXb3JrZXIse2ZpbGxTdHlsZTonb3JhbmdlJ30pO3N0eWxlTWFwLnNldCh0eXBlcy5TZXJ2aWNlV29ya2VyUHJlcGFyYXRpb24se2ZpbGxTdHlsZTonb3JhbmdlJ30pO3JldHVybiBzdHlsZU1hcDt9CnN0YXRpYyBfYnVpbGRSZXNvdXJjZVR5cGVTdHlsZSgpe2NvbnN0IGJhc2VSZXNvdXJjZVR5cGVDb2xvcnM9bmV3IE1hcChbWydkb2N1bWVudCcsJ2hzbCgyMTUsIDEwMCUsIDgwJSknXSxbJ2ZvbnQnLCdoc2woOCwgMTAwJSwgODAlKSddLFsnbWVkaWEnLCdoc2woOTAsIDUwJSwgODAlKSddLFsnaW1hZ2UnLCdoc2woOTAsIDUwJSwgODAlKSddLFsnc2NyaXB0JywnaHNsKDMxLCAxMDAlLCA4MCUpJ10sWydzdHlsZXNoZWV0JywnaHNsKDI3MiwgNjQlLCA4MCUpJ10sWyd0ZXh0dHJhY2snLCdoc2woOCwgMTAwJSwgODAlKSddLFsnd2Vic29ja2V0JywnaHNsKDAsIDAlLCA5NSUpJ10sWyd4aHInLCdoc2woNTMsIDEwMCUsIDgwJSknXSxbJ2ZldGNoJywnaHNsKDUzLCAxMDAlLCA4MCUpJ10sWydvdGhlcicsJ2hzbCgwLCAwJSwgOTUlKSddLF0pO2NvbnN0IHdhaXRpbmdTdHlsZU1hcD1uZXcgTWFwKCk7Y29uc3QgZG93bmxvYWRpbmdTdHlsZU1hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHJlc291cmNlVHlwZSBvZiBPYmplY3QudmFsdWVzKENvbW1vbi5yZXNvdXJjZVR5cGVzKSl7bGV0IGNvbG9yPWJhc2VSZXNvdXJjZVR5cGVDb2xvcnMuZ2V0KHJlc291cmNlVHlwZS5uYW1lKCkpO2lmKCFjb2xvcikKY29sb3I9YmFzZVJlc291cmNlVHlwZUNvbG9ycy5nZXQoJ290aGVyJyk7Y29uc3QgYm9yZGVyQ29sb3I9dG9Cb3JkZXJDb2xvcihjb2xvcik7d2FpdGluZ1N0eWxlTWFwLnNldChyZXNvdXJjZVR5cGUse2ZpbGxTdHlsZTp0b1dhaXRpbmdDb2xvcihjb2xvciksbGluZVdpZHRoOjEsYm9yZGVyQ29sb3I6Ym9yZGVyQ29sb3J9KTtkb3dubG9hZGluZ1N0eWxlTWFwLnNldChyZXNvdXJjZVR5cGUse2ZpbGxTdHlsZTpjb2xvcixsaW5lV2lkdGg6MSxib3JkZXJDb2xvcjpib3JkZXJDb2xvcn0pO30KcmV0dXJuW3dhaXRpbmdTdHlsZU1hcCxkb3dubG9hZGluZ1N0eWxlTWFwXTtmdW5jdGlvbiB0b0JvcmRlckNvbG9yKGNvbG9yKXtjb25zdCBwYXJzZWRDb2xvcj1Db21tb24uQ29sb3IucGFyc2UoY29sb3IpO2NvbnN0IGhzbGE9cGFyc2VkQ29sb3IuaHNsYSgpO2hzbGFbMV0vPTI7aHNsYVsyXS09TWF0aC5taW4oaHNsYVsyXSwwLjIpO3JldHVybiBwYXJzZWRDb2xvci5hc1N0cmluZyhudWxsKTt9CmZ1bmN0aW9uIHRvV2FpdGluZ0NvbG9yKGNvbG9yKXtjb25zdCBwYXJzZWRDb2xvcj1Db21tb24uQ29sb3IucGFyc2UoY29sb3IpO2NvbnN0IGhzbGE9cGFyc2VkQ29sb3IuaHNsYSgpO2hzbGFbMl0qPTEuMTtyZXR1cm4gcGFyc2VkQ29sb3IuYXNTdHJpbmcobnVsbCk7fX0KX3Jlc2V0UGF0aHMoKXt0aGlzLl9wYXRoRm9yU3R5bGUuY2xlYXIoKTt0aGlzLl9wYXRoRm9yU3R5bGUuc2V0KHRoaXMuX3dpc2tlclN0eWxlLG5ldyBQYXRoMkQoKSk7dGhpcy5fc3R5bGVGb3JUaW1lUmFuZ2VOYW1lLmZvckVhY2goc3R5bGU9PnRoaXMuX3BhdGhGb3JTdHlsZS5zZXQoc3R5bGUsbmV3IFBhdGgyRCgpKSk7dGhpcy5fc3R5bGVGb3JXYWl0aW5nUmVzb3VyY2VUeXBlLmZvckVhY2goc3R5bGU9PnRoaXMuX3BhdGhGb3JTdHlsZS5zZXQoc3R5bGUsbmV3IFBhdGgyRCgpKSk7dGhpcy5fc3R5bGVGb3JEb3dubG9hZGluZ1Jlc291cmNlVHlwZS5mb3JFYWNoKHN0eWxlPT50aGlzLl9wYXRoRm9yU3R5bGUuc2V0KHN0eWxlLG5ldyBQYXRoMkQoKSkpO3RoaXMuX3BhdGhGb3JTdHlsZS5zZXQodGhpcy5faG92ZXJEZXRhaWxzU3R5bGUsbmV3IFBhdGgyRCgpKTt9CndpbGxIaWRlKCl7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO30Kd2FzU2hvd24oKXt0aGlzLnVwZGF0ZSgpO30KX29uTW91c2VNb3ZlKGV2ZW50KXt0aGlzLl9zZXRIb3ZlcmVkTm9kZSh0aGlzLmdldE5vZGVGcm9tUG9pbnQoZXZlbnQub2Zmc2V0WCxldmVudC5vZmZzZXRZKSxldmVudC5zaGlmdEtleSk7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2lmKCF0aGlzLl9ob3ZlcmVkTm9kZSkKcmV0dXJuIG51bGw7Y29uc3QgcmVxdWVzdD10aGlzLl9ob3ZlcmVkTm9kZS5yZXF1ZXN0KCk7aWYoIXJlcXVlc3QpCnJldHVybiBudWxsO2NvbnN0IHVzZVRpbWluZ0JhcnM9IUNvbW1vbi5tb2R1bGVTZXR0aW5nKCduZXR3b3JrQ29sb3JDb2RlUmVzb3VyY2VUeXBlcycpLmdldCgpJiYhdGhpcy5fY2FsY3VsYXRvci5zdGFydEF0WmVybztsZXQgcmFuZ2U7bGV0IHN0YXJ0O2xldCBlbmQ7aWYodXNlVGltaW5nQmFycyl7cmFuZ2U9TmV0d29yay5SZXF1ZXN0VGltaW5nVmlldy5jYWxjdWxhdGVSZXF1ZXN0VGltZVJhbmdlcyhyZXF1ZXN0LDApLmZpbmQoZGF0YT0+ZGF0YS5uYW1lPT09TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuVG90YWwpO3N0YXJ0PXRoaXMuX3RpbWVUb1Bvc2l0aW9uKHJhbmdlLnN0YXJ0KTtlbmQ9dGhpcy5fdGltZVRvUG9zaXRpb24ocmFuZ2UuZW5kKTt9ZWxzZXtyYW5nZT10aGlzLl9nZXRTaW1wbGlmaWVkQmFyUmFuZ2UocmVxdWVzdCwwKTtzdGFydD1yYW5nZS5zdGFydDtlbmQ9cmFuZ2UuZW5kO30KaWYoZW5kLXN0YXJ0PDUwKXtjb25zdCBoYWxmV2lkdGg9KGVuZC1zdGFydCkvMjtzdGFydD1zdGFydCtoYWxmV2lkdGgtMjU7ZW5kPWVuZC1oYWxmV2lkdGgrMjU7fQppZihldmVudC5jbGllbnRYPHRoaXMuX2NhbnZhc1Bvc2l0aW9uLmxlZnQrc3RhcnR8fGV2ZW50LmNsaWVudFg+dGhpcy5fY2FudmFzUG9zaXRpb24ubGVmdCtlbmQpCnJldHVybiBudWxsO2NvbnN0IHJvd0luZGV4PXRoaXMuX25vZGVzLmZpbmRJbmRleChub2RlPT5ub2RlLmhvdmVyZWQoKSk7Y29uc3QgYmFySGVpZ2h0PXRoaXMuX2dldEJhckhlaWdodChyYW5nZS5uYW1lKTtjb25zdCB5PXRoaXMuX2hlYWRlckhlaWdodCsodGhpcy5fcm93SGVpZ2h0KnJvd0luZGV4LXRoaXMuX3Njcm9sbFRvcCkrKCh0aGlzLl9yb3dIZWlnaHQtYmFySGVpZ2h0KS8yKTtpZihldmVudC5jbGllbnRZPHRoaXMuX2NhbnZhc1Bvc2l0aW9uLnRvcCt5fHxldmVudC5jbGllbnRZPnRoaXMuX2NhbnZhc1Bvc2l0aW9uLnRvcCt5K2JhckhlaWdodCkKcmV0dXJuIG51bGw7Y29uc3QgYW5jaG9yQm94PXRoaXMuZWxlbWVudC5ib3hJbldpbmRvdygpO2FuY2hvckJveC54Kz1zdGFydDthbmNob3JCb3gueSs9eTthbmNob3JCb3gud2lkdGg9ZW5kLXN0YXJ0O2FuY2hvckJveC5oZWlnaHQ9YmFySGVpZ2h0O3JldHVybntib3g6YW5jaG9yQm94LHNob3c6cG9wb3Zlcj0+e2NvbnN0IGNvbnRlbnQ9TmV0d29yay5SZXF1ZXN0VGltaW5nVmlldy5jcmVhdGVUaW1pbmdUYWJsZSgocmVxdWVzdCksdGhpcy5fY2FsY3VsYXRvcik7cG9wb3Zlci5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO319O30KX3NldEhvdmVyZWROb2RlKG5vZGUsaGlnaGxpZ2h0SW5pdGlhdG9yQ2hhaW4pe2lmKHRoaXMuX2hvdmVyZWROb2RlKQp0aGlzLl9ob3ZlcmVkTm9kZS5zZXRIb3ZlcmVkKGZhbHNlLGZhbHNlKTt0aGlzLl9ob3ZlcmVkTm9kZT1ub2RlO2lmKHRoaXMuX2hvdmVyZWROb2RlKQp0aGlzLl9ob3ZlcmVkTm9kZS5zZXRIb3ZlcmVkKHRydWUsaGlnaGxpZ2h0SW5pdGlhdG9yQ2hhaW4pO30Kc2V0Um93SGVpZ2h0KGhlaWdodCl7dGhpcy5fcmF3Um93SGVpZ2h0PWhlaWdodDt0aGlzLl91cGRhdGVSb3dIZWlnaHQoKTt9Cl91cGRhdGVSb3dIZWlnaHQoKXt0aGlzLl9yb3dIZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLl9yYXdSb3dIZWlnaHQqd2luZG93LmRldmljZVBpeGVsUmF0aW8pL3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO30Kc2V0SGVhZGVySGVpZ2h0KGhlaWdodCl7dGhpcy5faGVhZGVySGVpZ2h0PWhlaWdodDt9CnNldFJpZ2h0UGFkZGluZyhwYWRkaW5nKXt0aGlzLl9yaWdodFBhZGRpbmc9cGFkZGluZzt0aGlzLl9jYWxjdWxhdGVDYW52YXNTaXplKCk7fQpzZXRDYWxjdWxhdG9yKGNhbGN1bGF0b3Ipe3RoaXMuX2NhbGN1bGF0b3I9Y2FsY3VsYXRvcjt9CmdldE5vZGVGcm9tUG9pbnQoeCx5KXtpZih5PD10aGlzLl9oZWFkZXJIZWlnaHQpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9ub2Rlc1tNYXRoLmZsb29yKCh0aGlzLl9zY3JvbGxUb3AreS10aGlzLl9oZWFkZXJIZWlnaHQpL3RoaXMuX3Jvd0hlaWdodCldO30Kc2NoZWR1bGVEcmF3KCl7aWYodGhpcy5fdXBkYXRlUmVxdWVzdElEKQpyZXR1cm47dGhpcy5fdXBkYXRlUmVxdWVzdElEPXRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlKCkpO30KdXBkYXRlKHNjcm9sbFRvcCxldmVudERpdmlkZXJzLG5vZGVzKXtpZihzY3JvbGxUb3AhPT11bmRlZmluZWQmJnRoaXMuX3Njcm9sbFRvcCE9PXNjcm9sbFRvcCl7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO3RoaXMuX3Njcm9sbFRvcD1zY3JvbGxUb3A7fQppZihub2Rlcyl7dGhpcy5fbm9kZXM9bm9kZXM7dGhpcy5fY2FsY3VsYXRlQ2FudmFzU2l6ZSgpO30KaWYoZXZlbnREaXZpZGVycyE9PXVuZGVmaW5lZCkKdGhpcy5fZXZlbnREaXZpZGVycz1ldmVudERpdmlkZXJzO2lmKHRoaXMuX3VwZGF0ZVJlcXVlc3RJRCl7dGhpcy5lbGVtZW50LndpbmRvdygpLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3VwZGF0ZVJlcXVlc3RJRCk7ZGVsZXRlIHRoaXMuX3VwZGF0ZVJlcXVlc3RJRDt9CnRoaXMuX3N0YXJ0VGltZT10aGlzLl9jYWxjdWxhdG9yLm1pbmltdW1Cb3VuZGFyeSgpO3RoaXMuX2VuZFRpbWU9dGhpcy5fY2FsY3VsYXRvci5tYXhpbXVtQm91bmRhcnkoKTt0aGlzLl9yZXNldENhbnZhcygpO3RoaXMuX3Jlc2V0UGF0aHMoKTt0aGlzLl90ZXh0TGF5ZXJzPVtdO3RoaXMuX2RyYXcoKTt9Cl9yZXNldENhbnZhcygpe2NvbnN0IHJhdGlvPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX2NhbnZhcy53aWR0aD10aGlzLl9vZmZzZXRXaWR0aCpyYXRpbzt0aGlzLl9jYW52YXMuaGVpZ2h0PXRoaXMuX29mZnNldEhlaWdodCpyYXRpbzt0aGlzLl9jYW52YXMuc3R5bGUud2lkdGg9dGhpcy5fb2Zmc2V0V2lkdGgrJ3B4Jzt0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0PXRoaXMuX29mZnNldEhlaWdodCsncHgnO30Kb25SZXNpemUoKXtzdXBlci5vblJlc2l6ZSgpO3RoaXMuX3VwZGF0ZVJvd0hlaWdodCgpO3RoaXMuX2NhbGN1bGF0ZUNhbnZhc1NpemUoKTt0aGlzLnNjaGVkdWxlRHJhdygpO30KX2NhbGN1bGF0ZUNhbnZhc1NpemUoKXt0aGlzLl9vZmZzZXRXaWR0aD10aGlzLmNvbnRlbnRFbGVtZW50Lm9mZnNldFdpZHRoLXRoaXMuX3JpZ2h0UGFkZGluZzt0aGlzLl9vZmZzZXRIZWlnaHQ9dGhpcy5jb250ZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7dGhpcy5fY2FsY3VsYXRvci5zZXREaXNwbGF5V2lkdGgodGhpcy5fb2Zmc2V0V2lkdGgpO3RoaXMuX2NhbnZhc1Bvc2l0aW9uPXRoaXMuX2NhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt9Cl90aW1lVG9Qb3NpdGlvbih0aW1lKXtjb25zdCBhdmFpbGFibGVXaWR0aD10aGlzLl9vZmZzZXRXaWR0aC10aGlzLl9sZWZ0UGFkZGluZztjb25zdCB0aW1lVG9QaXhlbD1hdmFpbGFibGVXaWR0aC8odGhpcy5fZW5kVGltZS10aGlzLl9zdGFydFRpbWUpO3JldHVybiBNYXRoLmZsb29yKHRoaXMuX2xlZnRQYWRkaW5nKyh0aW1lLXRoaXMuX3N0YXJ0VGltZSkqdGltZVRvUGl4ZWwpO30KX2RpZERyYXdGb3JUZXN0KCl7fQpfZHJhdygpe2NvbnN0IHVzZVRpbWluZ0JhcnM9IUNvbW1vbi5tb2R1bGVTZXR0aW5nKCduZXR3b3JrQ29sb3JDb2RlUmVzb3VyY2VUeXBlcycpLmdldCgpJiYhdGhpcy5fY2FsY3VsYXRvci5zdGFydEF0WmVybztjb25zdCBub2Rlcz10aGlzLl9ub2Rlcztjb25zdCBjb250ZXh0PXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2NvbnRleHQuc2F2ZSgpO2NvbnRleHQuc2NhbGUod2luZG93LmRldmljZVBpeGVsUmF0aW8sd2luZG93LmRldmljZVBpeGVsUmF0aW8pO2NvbnRleHQudHJhbnNsYXRlKDAsdGhpcy5faGVhZGVySGVpZ2h0KTtjb250ZXh0LnJlY3QoMCwwLHRoaXMuX29mZnNldFdpZHRoLHRoaXMuX29mZnNldEhlaWdodCk7Y29udGV4dC5jbGlwKCk7Y29uc3QgZmlyc3RSZXF1ZXN0SW5kZXg9TWF0aC5mbG9vcih0aGlzLl9zY3JvbGxUb3AvdGhpcy5fcm93SGVpZ2h0KTtjb25zdCBsYXN0UmVxdWVzdEluZGV4PU1hdGgubWluKG5vZGVzLmxlbmd0aCxmaXJzdFJlcXVlc3RJbmRleCtNYXRoLmNlaWwodGhpcy5fb2Zmc2V0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCkpO2ZvcihsZXQgaT1maXJzdFJlcXVlc3RJbmRleDtpPGxhc3RSZXF1ZXN0SW5kZXg7aSsrKXtjb25zdCByb3dPZmZzZXQ9dGhpcy5fcm93SGVpZ2h0Kmk7Y29uc3Qgbm9kZT1ub2Rlc1tpXTt0aGlzLl9kZWNvcmF0ZVJvdyhjb250ZXh0LG5vZGUscm93T2Zmc2V0LXRoaXMuX3Njcm9sbFRvcCk7bGV0IGRyYXdOb2Rlcz1bXTtpZihub2RlLmhhc0NoaWxkcmVuKCkmJiFub2RlLmV4cGFuZGVkKQpkcmF3Tm9kZXM9KG5vZGUuZmxhdENoaWxkcmVuKCkpO2RyYXdOb2Rlcy5wdXNoKG5vZGUpO2Zvcihjb25zdCBkcmF3Tm9kZSBvZiBkcmF3Tm9kZXMpe2lmKHVzZVRpbWluZ0JhcnMpCnRoaXMuX2J1aWxkVGltaW5nQmFyTGF5ZXJzKGRyYXdOb2RlLHJvd09mZnNldC10aGlzLl9zY3JvbGxUb3ApO2Vsc2UKdGhpcy5fYnVpbGRTaW1wbGlmaWVkQmFyTGF5ZXJzKGNvbnRleHQsZHJhd05vZGUscm93T2Zmc2V0LXRoaXMuX3Njcm9sbFRvcCk7fX0KdGhpcy5fZHJhd0xheWVycyhjb250ZXh0KTtjb250ZXh0LnNhdmUoKTtjb250ZXh0LmZpbGxTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyM4ODgnLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO2Zvcihjb25zdCB0ZXh0RGF0YSBvZiB0aGlzLl90ZXh0TGF5ZXJzKQpjb250ZXh0LmZpbGxUZXh0KHRleHREYXRhLnRleHQsdGV4dERhdGEueCx0ZXh0RGF0YS55KTtjb250ZXh0LnJlc3RvcmUoKTt0aGlzLl9kcmF3RXZlbnREaXZpZGVycyhjb250ZXh0KTtjb250ZXh0LnJlc3RvcmUoKTtjb25zdCBmcmVlWm9uZUF0TGVmdD03NTtjb25zdCBmcmVlWm9uZUF0UmlnaHQ9MTg7Y29uc3QgZGl2aWRlcnNEYXRhPVBlcmZVSS5UaW1lbGluZUdyaWQuY2FsY3VsYXRlR3JpZE9mZnNldHModGhpcy5fY2FsY3VsYXRvcik7UGVyZlVJLlRpbWVsaW5lR3JpZC5kcmF3Q2FudmFzR3JpZChjb250ZXh0LGRpdmlkZXJzRGF0YSk7UGVyZlVJLlRpbWVsaW5lR3JpZC5kcmF3Q2FudmFzSGVhZGVycyhjb250ZXh0LGRpdmlkZXJzRGF0YSx0aW1lPT50aGlzLl9jYWxjdWxhdG9yLmZvcm1hdFZhbHVlKHRpbWUsZGl2aWRlcnNEYXRhLnByZWNpc2lvbiksdGhpcy5fZm9udFNpemUsdGhpcy5faGVhZGVySGVpZ2h0LGZyZWVab25lQXRMZWZ0KTtjb250ZXh0LmNsZWFyUmVjdCh0aGlzLl9vZmZzZXRXaWR0aC1mcmVlWm9uZUF0UmlnaHQsMCxmcmVlWm9uZUF0UmlnaHQsdGhpcy5faGVhZGVySGVpZ2h0KTt0aGlzLl9kaWREcmF3Rm9yVGVzdCgpO30KX2RyYXdMYXllcnMoY29udGV4dCl7Zm9yKGNvbnN0IGVudHJ5IG9mIHRoaXMuX3BhdGhGb3JTdHlsZSl7Y29uc3Qgc3R5bGU9KGVudHJ5WzBdKTtjb25zdCBwYXRoPShlbnRyeVsxXSk7Y29udGV4dC5zYXZlKCk7Y29udGV4dC5iZWdpblBhdGgoKTtpZihzdHlsZS5saW5lV2lkdGgpe2NvbnRleHQubGluZVdpZHRoPXN0eWxlLmxpbmVXaWR0aDtjb250ZXh0LnN0cm9rZVN0eWxlPXN0eWxlLmJvcmRlckNvbG9yO2NvbnRleHQuc3Ryb2tlKHBhdGgpO30KaWYoc3R5bGUuZmlsbFN0eWxlKXtjb250ZXh0LmZpbGxTdHlsZT1zdHlsZS5maWxsU3R5bGU7Y29udGV4dC5maWxsKHBhdGgpO30KY29udGV4dC5yZXN0b3JlKCk7fX0KX2RyYXdFdmVudERpdmlkZXJzKGNvbnRleHQpe2NvbnRleHQuc2F2ZSgpO2NvbnRleHQubGluZVdpZHRoPTE7Zm9yKGNvbnN0IGNvbG9yIG9mIHRoaXMuX2V2ZW50RGl2aWRlcnMua2V5cygpKXtjb250ZXh0LnN0cm9rZVN0eWxlPWNvbG9yO2Zvcihjb25zdCB0aW1lIG9mIHRoaXMuX2V2ZW50RGl2aWRlcnMuZ2V0KGNvbG9yKSl7Y29udGV4dC5iZWdpblBhdGgoKTtjb25zdCB4PXRoaXMuX3RpbWVUb1Bvc2l0aW9uKHRpbWUpO2NvbnRleHQubW92ZVRvKHgsMCk7Y29udGV4dC5saW5lVG8oeCx0aGlzLl9vZmZzZXRIZWlnaHQpO30KY29udGV4dC5zdHJva2UoKTt9CmNvbnRleHQucmVzdG9yZSgpO30KX2dldEJhckhlaWdodCh0eXBlKXtjb25zdCB0eXBlcz1OZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcztzd2l0Y2godHlwZSl7Y2FzZSB0eXBlcy5Db25uZWN0aW5nOmNhc2UgdHlwZXMuU1NMOmNhc2UgdHlwZXMuRE5TOmNhc2UgdHlwZXMuUHJveHk6Y2FzZSB0eXBlcy5CbG9ja2luZzpjYXNlIHR5cGVzLlB1c2g6Y2FzZSB0eXBlcy5RdWV1ZWluZzpyZXR1cm4gNztkZWZhdWx0OnJldHVybiAxMzt9fQpfZ2V0U2ltcGxpZmllZEJhclJhbmdlKHJlcXVlc3QsYm9yZGVyT2Zmc2V0KXtjb25zdCBkcmF3V2lkdGg9dGhpcy5fb2Zmc2V0V2lkdGgtdGhpcy5fbGVmdFBhZGRpbmc7Y29uc3QgcGVyY2VudGFnZXM9dGhpcy5fY2FsY3VsYXRvci5jb21wdXRlQmFyR3JhcGhQZXJjZW50YWdlcyhyZXF1ZXN0KTtyZXR1cm57c3RhcnQ6dGhpcy5fbGVmdFBhZGRpbmcrTWF0aC5mbG9vcigocGVyY2VudGFnZXMuc3RhcnQvMTAwKSpkcmF3V2lkdGgpK2JvcmRlck9mZnNldCxtaWQ6dGhpcy5fbGVmdFBhZGRpbmcrTWF0aC5mbG9vcigocGVyY2VudGFnZXMubWlkZGxlLzEwMCkqZHJhd1dpZHRoKStib3JkZXJPZmZzZXQsZW5kOnRoaXMuX2xlZnRQYWRkaW5nK01hdGguZmxvb3IoKHBlcmNlbnRhZ2VzLmVuZC8xMDApKmRyYXdXaWR0aCkrYm9yZGVyT2Zmc2V0fTt9Cl9idWlsZFNpbXBsaWZpZWRCYXJMYXllcnMoY29udGV4dCxub2RlLHkpe2NvbnN0IHJlcXVlc3Q9bm9kZS5yZXF1ZXN0KCk7aWYoIXJlcXVlc3QpCnJldHVybjtjb25zdCBib3JkZXJXaWR0aD0xO2NvbnN0IGJvcmRlck9mZnNldD1ib3JkZXJXaWR0aCUyPT09MD8wOjAuNTtjb25zdCByYW5nZXM9dGhpcy5fZ2V0U2ltcGxpZmllZEJhclJhbmdlKHJlcXVlc3QsYm9yZGVyT2Zmc2V0KTtjb25zdCBoZWlnaHQ9dGhpcy5fZ2V0QmFySGVpZ2h0KCk7eSs9TWF0aC5mbG9vcih0aGlzLl9yb3dIZWlnaHQvMi1oZWlnaHQvMitib3JkZXJXaWR0aCktYm9yZGVyV2lkdGgvMjtjb25zdCB3YWl0aW5nU3R5bGU9dGhpcy5fc3R5bGVGb3JXYWl0aW5nUmVzb3VyY2VUeXBlLmdldChyZXF1ZXN0LnJlc291cmNlVHlwZSgpKTtjb25zdCB3YWl0aW5nUGF0aD10aGlzLl9wYXRoRm9yU3R5bGUuZ2V0KHdhaXRpbmdTdHlsZSk7d2FpdGluZ1BhdGgucmVjdChyYW5nZXMuc3RhcnQseSxyYW5nZXMubWlkLXJhbmdlcy5zdGFydCxoZWlnaHQtYm9yZGVyV2lkdGgpO2NvbnN0IGJhcldpZHRoPU1hdGgubWF4KDIscmFuZ2VzLmVuZC1yYW5nZXMubWlkKTtjb25zdCBkb3dubG9hZGluZ1N0eWxlPXRoaXMuX3N0eWxlRm9yRG93bmxvYWRpbmdSZXNvdXJjZVR5cGUuZ2V0KHJlcXVlc3QucmVzb3VyY2VUeXBlKCkpO2NvbnN0IGRvd25sb2FkaW5nUGF0aD10aGlzLl9wYXRoRm9yU3R5bGUuZ2V0KGRvd25sb2FkaW5nU3R5bGUpO2Rvd25sb2FkaW5nUGF0aC5yZWN0KHJhbmdlcy5taWQseSxiYXJXaWR0aCxoZWlnaHQtYm9yZGVyV2lkdGgpO2xldCBsYWJlbHM9bnVsbDtpZihub2RlLmhvdmVyZWQoKSl7bGFiZWxzPXRoaXMuX2NhbGN1bGF0b3IuY29tcHV0ZUJhckdyYXBoTGFiZWxzKHJlcXVlc3QpO2NvbnN0IGJhckRvdExpbmVMZW5ndGg9MTA7Y29uc3QgbGVmdExhYmVsV2lkdGg9Y29udGV4dC5tZWFzdXJlVGV4dChsYWJlbHMubGVmdCkud2lkdGg7Y29uc3QgcmlnaHRMYWJlbFdpZHRoPWNvbnRleHQubWVhc3VyZVRleHQobGFiZWxzLnJpZ2h0KS53aWR0aDtjb25zdCBob3ZlckxpbmVQYXRoPXRoaXMuX3BhdGhGb3JTdHlsZS5nZXQodGhpcy5faG92ZXJEZXRhaWxzU3R5bGUpO2lmKGxlZnRMYWJlbFdpZHRoPHJhbmdlcy5taWQtcmFuZ2VzLnN0YXJ0KXtjb25zdCBtaWRCYXJYPXJhbmdlcy5zdGFydCsocmFuZ2VzLm1pZC1yYW5nZXMuc3RhcnQtbGVmdExhYmVsV2lkdGgpLzI7dGhpcy5fdGV4dExheWVycy5wdXNoKHt0ZXh0OmxhYmVscy5sZWZ0LHg6bWlkQmFyWCx5OnkrdGhpcy5fZm9udFNpemV9KTt9ZWxzZSBpZihiYXJEb3RMaW5lTGVuZ3RoK2xlZnRMYWJlbFdpZHRoK3RoaXMuX2xlZnRQYWRkaW5nPHJhbmdlcy5zdGFydCl7dGhpcy5fdGV4dExheWVycy5wdXNoKHt0ZXh0OmxhYmVscy5sZWZ0LHg6cmFuZ2VzLnN0YXJ0LWxlZnRMYWJlbFdpZHRoLWJhckRvdExpbmVMZW5ndGgtMSx5OnkrdGhpcy5fZm9udFNpemV9KTtob3ZlckxpbmVQYXRoLm1vdmVUbyhyYW5nZXMuc3RhcnQtYmFyRG90TGluZUxlbmd0aCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTtob3ZlckxpbmVQYXRoLmFyYyhyYW5nZXMuc3RhcnQseStNYXRoLmZsb29yKGhlaWdodC8yKSwyLDAsMipNYXRoLlBJKTtob3ZlckxpbmVQYXRoLm1vdmVUbyhyYW5nZXMuc3RhcnQtYmFyRG90TGluZUxlbmd0aCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTtob3ZlckxpbmVQYXRoLmxpbmVUbyhyYW5nZXMuc3RhcnQseStNYXRoLmZsb29yKGhlaWdodC8yKSk7fQpjb25zdCBlbmRYPXJhbmdlcy5taWQrYmFyV2lkdGgrYm9yZGVyT2Zmc2V0O2lmKHJpZ2h0TGFiZWxXaWR0aDxlbmRYLXJhbmdlcy5taWQpe2NvbnN0IG1pZEJhclg9cmFuZ2VzLm1pZCsoZW5kWC1yYW5nZXMubWlkLXJpZ2h0TGFiZWxXaWR0aCkvMjt0aGlzLl90ZXh0TGF5ZXJzLnB1c2goe3RleHQ6bGFiZWxzLnJpZ2h0LHg6bWlkQmFyWCx5OnkrdGhpcy5fZm9udFNpemV9KTt9ZWxzZSBpZihlbmRYK2JhckRvdExpbmVMZW5ndGgrcmlnaHRMYWJlbFdpZHRoPHRoaXMuX29mZnNldFdpZHRoLXRoaXMuX2xlZnRQYWRkaW5nKXt0aGlzLl90ZXh0TGF5ZXJzLnB1c2goe3RleHQ6bGFiZWxzLnJpZ2h0LHg6ZW5kWCtiYXJEb3RMaW5lTGVuZ3RoKzEseTp5K3RoaXMuX2ZvbnRTaXplfSk7aG92ZXJMaW5lUGF0aC5tb3ZlVG8oZW5kWCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTtob3ZlckxpbmVQYXRoLmFyYyhlbmRYLHkrTWF0aC5mbG9vcihoZWlnaHQvMiksMiwwLDIqTWF0aC5QSSk7aG92ZXJMaW5lUGF0aC5tb3ZlVG8oZW5kWCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTtob3ZlckxpbmVQYXRoLmxpbmVUbyhlbmRYK2JhckRvdExpbmVMZW5ndGgseStNYXRoLmZsb29yKGhlaWdodC8yKSk7fX0KaWYoIXRoaXMuX2NhbGN1bGF0b3Iuc3RhcnRBdFplcm8pe2NvbnN0IHF1ZXVlaW5nUmFuZ2U9TmV0d29yay5SZXF1ZXN0VGltaW5nVmlldy5jYWxjdWxhdGVSZXF1ZXN0VGltZVJhbmdlcyhyZXF1ZXN0LDApLmZpbmQoZGF0YT0+ZGF0YS5uYW1lPT09TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuVG90YWwpO2NvbnN0IGxlZnRMYWJlbFdpZHRoPWxhYmVscz9jb250ZXh0Lm1lYXN1cmVUZXh0KGxhYmVscy5sZWZ0KS53aWR0aDowO2NvbnN0IGxlZnRUZXh0UGxhY2VkSW5CYXI9bGVmdExhYmVsV2lkdGg8cmFuZ2VzLm1pZC1yYW5nZXMuc3RhcnQ7Y29uc3Qgd2lza2VyVGV4dFBhZGRpbmc9MTM7Y29uc3QgdGV4dE9mZnNldD0obGFiZWxzJiYhbGVmdFRleHRQbGFjZWRJbkJhcik/bGVmdExhYmVsV2lkdGgrd2lza2VyVGV4dFBhZGRpbmc6MDtjb25zdCBxdWV1ZWluZ1N0YXJ0PXRoaXMuX3RpbWVUb1Bvc2l0aW9uKHF1ZXVlaW5nUmFuZ2Uuc3RhcnQpO2lmKHJhbmdlcy5zdGFydC10ZXh0T2Zmc2V0PnF1ZXVlaW5nU3RhcnQpe2NvbnN0IHdpc2tlclBhdGg9dGhpcy5fcGF0aEZvclN0eWxlLmdldCh0aGlzLl93aXNrZXJTdHlsZSk7d2lza2VyUGF0aC5tb3ZlVG8ocXVldWVpbmdTdGFydCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTt3aXNrZXJQYXRoLmxpbmVUbyhyYW5nZXMuc3RhcnQtdGV4dE9mZnNldCx5K01hdGguZmxvb3IoaGVpZ2h0LzIpKTtjb25zdCB3aXNrZXJIZWlnaHQ9aGVpZ2h0LzI7d2lza2VyUGF0aC5tb3ZlVG8ocXVldWVpbmdTdGFydCtib3JkZXJPZmZzZXQseSt3aXNrZXJIZWlnaHQvMik7d2lza2VyUGF0aC5saW5lVG8ocXVldWVpbmdTdGFydCtib3JkZXJPZmZzZXQseStoZWlnaHQtd2lza2VySGVpZ2h0LzItMSk7fX19Cl9idWlsZFRpbWluZ0JhckxheWVycyhub2RlLHkpe2NvbnN0IHJlcXVlc3Q9bm9kZS5yZXF1ZXN0KCk7aWYoIXJlcXVlc3QpCnJldHVybjtjb25zdCByYW5nZXM9TmV0d29yay5SZXF1ZXN0VGltaW5nVmlldy5jYWxjdWxhdGVSZXF1ZXN0VGltZVJhbmdlcyhyZXF1ZXN0LDApO2Zvcihjb25zdCByYW5nZSBvZiByYW5nZXMpe2lmKHJhbmdlLm5hbWU9PT1OZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Ub3RhbHx8cmFuZ2UubmFtZT09PU5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNlbmRpbmd8fHJhbmdlLmVuZC1yYW5nZS5zdGFydD09PTApCmNvbnRpbnVlO2NvbnN0IHN0eWxlPXRoaXMuX3N0eWxlRm9yVGltZVJhbmdlTmFtZS5nZXQocmFuZ2UubmFtZSk7Y29uc3QgcGF0aD10aGlzLl9wYXRoRm9yU3R5bGUuZ2V0KHN0eWxlKTtjb25zdCBsaW5lV2lkdGg9c3R5bGUubGluZVdpZHRofHwwO2NvbnN0IGhlaWdodD10aGlzLl9nZXRCYXJIZWlnaHQocmFuZ2UubmFtZSk7Y29uc3QgbWlkZGxlQmFyWT15K01hdGguZmxvb3IodGhpcy5fcm93SGVpZ2h0LzItaGVpZ2h0LzIpK2xpbmVXaWR0aC8yO2NvbnN0IHN0YXJ0PXRoaXMuX3RpbWVUb1Bvc2l0aW9uKHJhbmdlLnN0YXJ0KTtjb25zdCBlbmQ9dGhpcy5fdGltZVRvUG9zaXRpb24ocmFuZ2UuZW5kKTtwYXRoLnJlY3Qoc3RhcnQsbWlkZGxlQmFyWSxlbmQtc3RhcnQsaGVpZ2h0LWxpbmVXaWR0aCk7fX0KX2RlY29yYXRlUm93KGNvbnRleHQsbm9kZSx5KXtjb250ZXh0LnNhdmUoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQuZmlsbFN0eWxlPW5vZGUuYmFja2dyb3VuZENvbG9yKCk7Y29udGV4dC5yZWN0KDAseSx0aGlzLl9vZmZzZXRXaWR0aCx0aGlzLl9yb3dIZWlnaHQpO2NvbnRleHQuZmlsbCgpO2NvbnRleHQucmVzdG9yZSgpO319O05ldHdvcmsuTmV0d29ya1dhdGVyZmFsbENvbHVtbi5fTGF5ZXJTdHlsZTtOZXR3b3JrLk5ldHdvcmtXYXRlcmZhbGxDb2x1bW4uX1RleHRMYXllcjs7TmV0d29yay5SZXF1ZXN0Q29va2llc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHJlcXVlc3Qpe3N1cGVyKCk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL3JlcXVlc3RDb29raWVzVmlldy5jc3MnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVxdWVzdC1jb29raWVzLXZpZXcnKTt0aGlzLl9yZXF1ZXN0PXJlcXVlc3Q7fQp3YXNTaG93bigpe3RoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlcXVlc3RIZWFkZXJzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoQ29va2llcyx0aGlzKTt0aGlzLl9yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5SZXNwb25zZUhlYWRlcnNDaGFuZ2VkLHRoaXMuX3JlZnJlc2hDb29raWVzLHRoaXMpO2lmKCF0aGlzLl9nb3RDb29raWVzKXtpZighdGhpcy5fZW1wdHlXaWRnZXQpe3RoaXMuX2VtcHR5V2lkZ2V0PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ1RoaXMgcmVxdWVzdCBoYXMgbm8gY29va2llcy4nKSk7dGhpcy5fZW1wdHlXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO30KcmV0dXJuO30KaWYoIXRoaXMuX2Nvb2tpZXNUYWJsZSkKdGhpcy5fYnVpbGRDb29raWVzVGFibGUoKTt9CndpbGxIaWRlKCl7dGhpcy5fcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuUmVxdWVzdEhlYWRlcnNDaGFuZ2VkLHRoaXMuX3JlZnJlc2hDb29raWVzLHRoaXMpO3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlc3BvbnNlSGVhZGVyc0NoYW5nZWQsdGhpcy5fcmVmcmVzaENvb2tpZXMsdGhpcyk7fQpnZXQgX2dvdENvb2tpZXMoKXtyZXR1cm4odGhpcy5fcmVxdWVzdC5yZXF1ZXN0Q29va2llcyYmdGhpcy5fcmVxdWVzdC5yZXF1ZXN0Q29va2llcy5sZW5ndGgpfHwodGhpcy5fcmVxdWVzdC5yZXNwb25zZUNvb2tpZXMmJnRoaXMuX3JlcXVlc3QucmVzcG9uc2VDb29raWVzLmxlbmd0aCk7fQpfYnVpbGRDb29raWVzVGFibGUoKXt0aGlzLmRldGFjaENoaWxkV2lkZ2V0cygpO3RoaXMuX2Nvb2tpZXNUYWJsZT1uZXcgQ29va2llVGFibGUuQ29va2llc1RhYmxlKCk7dGhpcy5fY29va2llc1RhYmxlLnNldENvb2tpZUZvbGRlcnMoW3tmb2xkZXJOYW1lOkNvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBDb29raWVzJyksY29va2llczp0aGlzLl9yZXF1ZXN0LnJlcXVlc3RDb29raWVzfSx7Zm9sZGVyTmFtZTpDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNlIENvb2tpZXMnKSxjb29raWVzOnRoaXMuX3JlcXVlc3QucmVzcG9uc2VDb29raWVzfV0pO3RoaXMuX2Nvb2tpZXNUYWJsZS5zaG93KHRoaXMuZWxlbWVudCk7fQpfcmVmcmVzaENvb2tpZXMoKXtkZWxldGUgdGhpcy5fY29va2llc1RhYmxlO2lmKCF0aGlzLl9nb3RDb29raWVzfHwhdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX2J1aWxkQ29va2llc1RhYmxlKCk7fX07O05ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihyZXF1ZXN0KXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbmV0d29yay9yZXF1ZXN0SGVhZGVyc1ZpZXcuY3NzJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JlcXVlc3QtaGVhZGVycy12aWV3Jyk7dGhpcy5fcmVxdWVzdD1yZXF1ZXN0O3RoaXMuX2RlY29kZVJlcXVlc3RQYXJhbWV0ZXJzPXRydWU7dGhpcy5fc2hvd1JlcXVlc3RIZWFkZXJzVGV4dD1mYWxzZTt0aGlzLl9zaG93UmVzcG9uc2VIZWFkZXJzVGV4dD1mYWxzZTt0aGlzLl9oaWdobGlnaHRlZEVsZW1lbnQ9bnVsbDtjb25zdCByb290PW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7cm9vdC5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL3JlcXVlc3RIZWFkZXJzVHJlZS5jc3MnKTtyb290LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVxdWVzdC1oZWFkZXJzLXRyZWUnKTtyb290LnNldEZvY3VzYWJsZShmYWxzZSk7cm9vdC5tYWtlRGVuc2UoKTtyb290LmV4cGFuZFRyZWVFbGVtZW50c1doZW5BcnJvd2luZz10cnVlO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChyb290LmVsZW1lbnQpO2NvbnN0IGdlbmVyYWxDYXRlZ29yeT1uZXcgTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuQ2F0ZWdvcnkocm9vdCwnZ2VuZXJhbCcsQ29tbW9uLlVJU3RyaW5nKCdHZW5lcmFsJykpO2dlbmVyYWxDYXRlZ29yeS5oaWRkZW49ZmFsc2U7dGhpcy5fdXJsSXRlbT1nZW5lcmFsQ2F0ZWdvcnkuY3JlYXRlTGVhZigpO3RoaXMuX3JlcXVlc3RNZXRob2RJdGVtPWdlbmVyYWxDYXRlZ29yeS5jcmVhdGVMZWFmKCk7dGhpcy5fc3RhdHVzQ29kZUl0ZW09Z2VuZXJhbENhdGVnb3J5LmNyZWF0ZUxlYWYoKTt0aGlzLl9yZW1vdGVBZGRyZXNzSXRlbT1nZW5lcmFsQ2F0ZWdvcnkuY3JlYXRlTGVhZigpO3RoaXMuX3JlbW90ZUFkZHJlc3NJdGVtLmhpZGRlbj10cnVlO3RoaXMuX3JlZmVycmVyUG9saWN5SXRlbT1nZW5lcmFsQ2F0ZWdvcnkuY3JlYXRlTGVhZigpO3RoaXMuX3JlZmVycmVyUG9saWN5SXRlbS5oaWRkZW49dHJ1ZTt0aGlzLl9yZXNwb25zZUhlYWRlcnNDYXRlZ29yeT1uZXcgTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuQ2F0ZWdvcnkocm9vdCwncmVzcG9uc2VIZWFkZXJzJywnJyk7dGhpcy5fcmVxdWVzdEhlYWRlcnNDYXRlZ29yeT1uZXcgTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuQ2F0ZWdvcnkocm9vdCwncmVxdWVzdEhlYWRlcnMnLCcnKTt0aGlzLl9xdWVyeVN0cmluZ0NhdGVnb3J5PW5ldyBOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5DYXRlZ29yeShyb290LCdxdWVyeVN0cmluZycsJycpO3RoaXMuX2Zvcm1EYXRhQ2F0ZWdvcnk9bmV3IE5ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3LkNhdGVnb3J5KHJvb3QsJ2Zvcm1EYXRhJywnJyk7dGhpcy5fcmVxdWVzdFBheWxvYWRDYXRlZ29yeT1uZXcgTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuQ2F0ZWdvcnkocm9vdCwncmVxdWVzdFBheWxvYWQnLENvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBQYXlsb2FkJykpO30Kd2FzU2hvd24oKXt0aGlzLl9jbGVhckhpZ2hsaWdodCgpO3RoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlbW90ZUFkZHJlc3NDaGFuZ2VkLHRoaXMuX3JlZnJlc2hSZW1vdGVBZGRyZXNzLHRoaXMpO3RoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlcXVlc3RIZWFkZXJzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoUmVxdWVzdEhlYWRlcnMsdGhpcyk7dGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuUmVzcG9uc2VIZWFkZXJzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoUmVzcG9uc2VIZWFkZXJzLHRoaXMpO3RoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyx0aGlzLl9yZWZyZXNoSFRUUEluZm9ybWF0aW9uLHRoaXMpO3RoaXMuX3JlZnJlc2hVUkwoKTt0aGlzLl9yZWZyZXNoUXVlcnlTdHJpbmcoKTt0aGlzLl9yZWZyZXNoUmVxdWVzdEhlYWRlcnMoKTt0aGlzLl9yZWZyZXNoUmVzcG9uc2VIZWFkZXJzKCk7dGhpcy5fcmVmcmVzaEhUVFBJbmZvcm1hdGlvbigpO3RoaXMuX3JlZnJlc2hSZW1vdGVBZGRyZXNzKCk7dGhpcy5fcmVmcmVzaFJlZmVycmVyUG9saWN5KCk7fQp3aWxsSGlkZSgpe3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlbW90ZUFkZHJlc3NDaGFuZ2VkLHRoaXMuX3JlZnJlc2hSZW1vdGVBZGRyZXNzLHRoaXMpO3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlJlcXVlc3RIZWFkZXJzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoUmVxdWVzdEhlYWRlcnMsdGhpcyk7dGhpcy5fcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuUmVzcG9uc2VIZWFkZXJzQ2hhbmdlZCx0aGlzLl9yZWZyZXNoUmVzcG9uc2VIZWFkZXJzLHRoaXMpO3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyx0aGlzLl9yZWZyZXNoSFRUUEluZm9ybWF0aW9uLHRoaXMpO30KX2Zvcm1hdEhlYWRlcihuYW1lLHZhbHVlKXtjb25zdCBmcmFnbWVudD1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci1uYW1lJykudGV4dENvbnRlbnQ9bmFtZSsnOiAnO2ZyYWdtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnaGVhZGVyLXNlcGFyYXRvcicpO2ZyYWdtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFkZXItdmFsdWUgc291cmNlLWNvZGUnKS50ZXh0Q29udGVudD12YWx1ZTtyZXR1cm4gZnJhZ21lbnQ7fQpfZm9ybWF0UGFyYW1ldGVyKHZhbHVlLGNsYXNzTmFtZSxkZWNvZGVQYXJhbWV0ZXJzKXtsZXQgZXJyb3JEZWNvZGluZz1mYWxzZTtpZihkZWNvZGVQYXJhbWV0ZXJzKXt2YWx1ZT12YWx1ZS5yZXBsYWNlKC9cKy9nLCcgJyk7aWYodmFsdWUuaW5kZXhPZignJScpPj0wKXt0cnl7dmFsdWU9ZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTt9Y2F0Y2goZSl7ZXJyb3JEZWNvZGluZz10cnVlO319fQpjb25zdCBkaXY9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JyxjbGFzc05hbWUpO2lmKHZhbHVlPT09JycpCmRpdi5jbGFzc0xpc3QuYWRkKCdlbXB0eS12YWx1ZScpO2lmKGVycm9yRGVjb2RpbmcpCmRpdi5jcmVhdGVDaGlsZCgnc3BhbicsJ2hlYWRlci1kZWNvZGUtZXJyb3InKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyh1bmFibGUgdG8gZGVjb2RlIHZhbHVlKScpO2Vsc2UKZGl2LnRleHRDb250ZW50PXZhbHVlO3JldHVybiBkaXY7fQpfcmVmcmVzaFVSTCgpe3RoaXMuX3VybEl0ZW0udGl0bGU9dGhpcy5fZm9ybWF0SGVhZGVyKENvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBVUkwnKSx0aGlzLl9yZXF1ZXN0LnVybCgpKTt9Cl9yZWZyZXNoUXVlcnlTdHJpbmcoKXtjb25zdCBxdWVyeVN0cmluZz10aGlzLl9yZXF1ZXN0LnF1ZXJ5U3RyaW5nKCk7Y29uc3QgcXVlcnlQYXJhbWV0ZXJzPXRoaXMuX3JlcXVlc3QucXVlcnlQYXJhbWV0ZXJzO3RoaXMuX3F1ZXJ5U3RyaW5nQ2F0ZWdvcnkuaGlkZGVuPSFxdWVyeVBhcmFtZXRlcnM7aWYocXVlcnlQYXJhbWV0ZXJzKXt0aGlzLl9yZWZyZXNoUGFyYW1zKENvbW1vbi5VSVN0cmluZygnUXVlcnkgU3RyaW5nIFBhcmFtZXRlcnMnKSxxdWVyeVBhcmFtZXRlcnMscXVlcnlTdHJpbmcsdGhpcy5fcXVlcnlTdHJpbmdDYXRlZ29yeSk7fX0KYXN5bmMgX3JlZnJlc2hGb3JtRGF0YSgpe3RoaXMuX2Zvcm1EYXRhQ2F0ZWdvcnkuaGlkZGVuPXRydWU7dGhpcy5fcmVxdWVzdFBheWxvYWRDYXRlZ29yeS5oaWRkZW49dHJ1ZTtjb25zdCBmb3JtRGF0YT1hd2FpdCB0aGlzLl9yZXF1ZXN0LnJlcXVlc3RGb3JtRGF0YSgpO2lmKCFmb3JtRGF0YSkKcmV0dXJuO2NvbnN0IGZvcm1QYXJhbWV0ZXJzPWF3YWl0IHRoaXMuX3JlcXVlc3QuZm9ybVBhcmFtZXRlcnMoKTtpZihmb3JtUGFyYW1ldGVycyl7dGhpcy5fZm9ybURhdGFDYXRlZ29yeS5oaWRkZW49ZmFsc2U7dGhpcy5fcmVmcmVzaFBhcmFtcyhDb21tb24uVUlTdHJpbmcoJ0Zvcm0gRGF0YScpLGZvcm1QYXJhbWV0ZXJzLGZvcm1EYXRhLHRoaXMuX2Zvcm1EYXRhQ2F0ZWdvcnkpO31lbHNle3RoaXMuX3JlcXVlc3RQYXlsb2FkQ2F0ZWdvcnkuaGlkZGVuPWZhbHNlO3RyeXtjb25zdCBqc29uPUpTT04ucGFyc2UoZm9ybURhdGEpO3RoaXMuX3JlZnJlc2hSZXF1ZXN0SlNPTlBheWxvYWQoanNvbixmb3JtRGF0YSk7fWNhdGNoKGUpe3RoaXMuX3BvcHVsYXRlVHJlZUVsZW1lbnRXaXRoU291cmNlVGV4dCh0aGlzLl9yZXF1ZXN0UGF5bG9hZENhdGVnb3J5LGZvcm1EYXRhKTt9fX0KX3BvcHVsYXRlVHJlZUVsZW1lbnRXaXRoU291cmNlVGV4dCh0cmVlRWxlbWVudCxzb3VyY2VUZXh0KXtjb25zdCBtYXhfbGVuPTMwMDA7Y29uc3QgdGV4dD0oc291cmNlVGV4dHx8JycpLnRyaW0oKTtjb25zdCB0cmltPXRleHQubGVuZ3RoPm1heF9sZW47Y29uc3Qgc291cmNlVGV4dEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2hlYWRlci12YWx1ZSBzb3VyY2UtY29kZScpO3NvdXJjZVRleHRFbGVtZW50LnRleHRDb250ZW50PXRyaW0/dGV4dC5zdWJzdHIoMCxtYXhfbGVuKTp0ZXh0O2NvbnN0IHNvdXJjZVRyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudChzb3VyY2VUZXh0RWxlbWVudCk7c291cmNlVHJlZUVsZW1lbnQuc2VsZWN0YWJsZT1mYWxzZTt0cmVlRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RyZWVFbGVtZW50LmFwcGVuZENoaWxkKHNvdXJjZVRyZWVFbGVtZW50KTtpZighdHJpbSkKcmV0dXJuO2NvbnN0IHNob3dNb3JlQnV0dG9uPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2J1dHRvbicsJ3JlcXVlc3QtaGVhZGVycy1zaG93LW1vcmUtYnV0dG9uJyk7c2hvd01vcmVCdXR0b24udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IG1vcmUnKTtzaG93TW9yZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PntzaG93TW9yZUJ1dHRvbi5yZW1vdmUoKTtzb3VyY2VUZXh0RWxlbWVudC50ZXh0Q29udGVudD10ZXh0O30pO3NvdXJjZVRleHRFbGVtZW50LmFwcGVuZENoaWxkKHNob3dNb3JlQnV0dG9uKTt9Cl9yZWZyZXNoUGFyYW1zKHRpdGxlLHBhcmFtcyxzb3VyY2VUZXh0LHBhcmFtc1RyZWVFbGVtZW50KXtwYXJhbXNUcmVlRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3BhcmFtc1RyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3BhcmFtc1RyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQodGl0bGUpO2NvbnN0IGhlYWRlckNvdW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdoZWFkZXItY291bnQnKTtoZWFkZXJDb3VudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1x1MDBBMCglZCknLHBhcmFtcy5sZW5ndGgpO3BhcmFtc1RyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXJDb3VudCk7ZnVuY3Rpb24gdG9nZ2xlVmlld1NvdXJjZShldmVudCl7cGFyYW1zVHJlZUVsZW1lbnRbTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuX3ZpZXdTb3VyY2VTeW1ib2xdPSFwYXJhbXNUcmVlRWxlbWVudFtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5fdmlld1NvdXJjZVN5bWJvbF07dGhpcy5fcmVmcmVzaFBhcmFtcyh0aXRsZSxwYXJhbXMsc291cmNlVGV4dCxwYXJhbXNUcmVlRWxlbWVudCk7ZXZlbnQuY29uc3VtZSgpO30KcGFyYW1zVHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVZpZXdTb3VyY2VUb2dnbGUocGFyYW1zVHJlZUVsZW1lbnRbTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuX3ZpZXdTb3VyY2VTeW1ib2xdLHRvZ2dsZVZpZXdTb3VyY2UuYmluZCh0aGlzKSkpO2lmKHBhcmFtc1RyZWVFbGVtZW50W05ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3Ll92aWV3U291cmNlU3ltYm9sXSl7dGhpcy5fcG9wdWxhdGVUcmVlRWxlbWVudFdpdGhTb3VyY2VUZXh0KHBhcmFtc1RyZWVFbGVtZW50LHNvdXJjZVRleHQpO3JldHVybjt9CmNvbnN0IHRvZ2dsZVRpdGxlPXRoaXMuX2RlY29kZVJlcXVlc3RQYXJhbWV0ZXJzP0NvbW1vbi5VSVN0cmluZygndmlldyBVUkwgZW5jb2RlZCcpOkNvbW1vbi5VSVN0cmluZygndmlldyBkZWNvZGVkJyk7Y29uc3QgdG9nZ2xlQnV0dG9uPXRoaXMuX2NyZWF0ZVRvZ2dsZUJ1dHRvbih0b2dnbGVUaXRsZSk7dG9nZ2xlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl90b2dnbGVVUkxEZWNvZGluZy5iaW5kKHRoaXMpLGZhbHNlKTtwYXJhbXNUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodG9nZ2xlQnV0dG9uKTtmb3IobGV0IGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXtjb25zdCBwYXJhbU5hbWVWYWx1ZT1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYocGFyYW1zW2ldLm5hbWUhPT0nJyl7Y29uc3QgbmFtZT10aGlzLl9mb3JtYXRQYXJhbWV0ZXIocGFyYW1zW2ldLm5hbWUrJzogJywnaGVhZGVyLW5hbWUnLHRoaXMuX2RlY29kZVJlcXVlc3RQYXJhbWV0ZXJzKTtjb25zdCB2YWx1ZT10aGlzLl9mb3JtYXRQYXJhbWV0ZXIocGFyYW1zW2ldLnZhbHVlLCdoZWFkZXItdmFsdWUgc291cmNlLWNvZGUnLHRoaXMuX2RlY29kZVJlcXVlc3RQYXJhbWV0ZXJzKTtwYXJhbU5hbWVWYWx1ZS5hcHBlbmRDaGlsZChuYW1lKTtwYXJhbU5hbWVWYWx1ZS5jcmVhdGVDaGlsZCgnc3BhbicsJ2hlYWRlci1zZXBhcmF0b3InKTtwYXJhbU5hbWVWYWx1ZS5hcHBlbmRDaGlsZCh2YWx1ZSk7fWVsc2V7cGFyYW1OYW1lVmFsdWUuYXBwZW5kQ2hpbGQodGhpcy5fZm9ybWF0UGFyYW1ldGVyKENvbW1vbi5VSVN0cmluZygnKGVtcHR5KScpLCdlbXB0eS1yZXF1ZXN0LWhlYWRlcicsdGhpcy5fZGVjb2RlUmVxdWVzdFBhcmFtZXRlcnMpKTt9CmNvbnN0IHBhcmFtVHJlZUVsZW1lbnQ9bmV3IFVJLlRyZWVFbGVtZW50KHBhcmFtTmFtZVZhbHVlKTtwYXJhbVRyZWVFbGVtZW50LnNlbGVjdGFibGU9ZmFsc2U7cGFyYW1zVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1UcmVlRWxlbWVudCk7fX0KX3JlZnJlc2hSZXF1ZXN0SlNPTlBheWxvYWQocGFyc2VkT2JqZWN0LHNvdXJjZVRleHQpe2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuX3JlcXVlc3RQYXlsb2FkQ2F0ZWdvcnk7dHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBsaXN0SXRlbT10aGlzLl9yZXF1ZXN0UGF5bG9hZENhdGVnb3J5Lmxpc3RJdGVtRWxlbWVudDtsaXN0SXRlbS5yZW1vdmVDaGlsZHJlbigpO2xpc3RJdGVtLmNyZWF0ZVRleHRDaGlsZCh0aGlzLl9yZXF1ZXN0UGF5bG9hZENhdGVnb3J5LnRpdGxlKTtmdW5jdGlvbiB0b2dnbGVWaWV3U291cmNlKGV2ZW50KXt0cmVlRWxlbWVudFtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5fdmlld1NvdXJjZVN5bWJvbF09IXRyZWVFbGVtZW50W05ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3Ll92aWV3U291cmNlU3ltYm9sXTt0aGlzLl9yZWZyZXNoUmVxdWVzdEpTT05QYXlsb2FkKHBhcnNlZE9iamVjdCxzb3VyY2VUZXh0KTtldmVudC5jb25zdW1lKCk7fQpsaXN0SXRlbS5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVWaWV3U291cmNlVG9nZ2xlKHRyZWVFbGVtZW50W05ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3Ll92aWV3U291cmNlU3ltYm9sXSx0b2dnbGVWaWV3U291cmNlLmJpbmQodGhpcykpKTtpZih0cmVlRWxlbWVudFtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5fdmlld1NvdXJjZVN5bWJvbF0pe3RoaXMuX3BvcHVsYXRlVHJlZUVsZW1lbnRXaXRoU291cmNlVGV4dCh0aGlzLl9yZXF1ZXN0UGF5bG9hZENhdGVnb3J5LHNvdXJjZVRleHQpO31lbHNle2NvbnN0IG9iamVjdD1TREsuUmVtb3RlT2JqZWN0LmZyb21Mb2NhbE9iamVjdChwYXJzZWRPYmplY3QpO2NvbnN0IHNlY3Rpb249bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uKG9iamVjdCxvYmplY3QuZGVzY3JpcHRpb24pO3NlY3Rpb24uZXhwYW5kKCk7c2VjdGlvbi5lZGl0YWJsZT1mYWxzZTt0cmVlRWxlbWVudC5hcHBlbmRDaGlsZChuZXcgVUkuVHJlZUVsZW1lbnQoc2VjdGlvbi5lbGVtZW50KSk7fX0KX2NyZWF0ZVZpZXdTb3VyY2VUb2dnbGUodmlld1NvdXJjZSxoYW5kbGVyKXtjb25zdCB2aWV3U291cmNlVG9nZ2xlVGl0bGU9dmlld1NvdXJjZT9Db21tb24uVUlTdHJpbmcoJ3ZpZXcgcGFyc2VkJyk6Q29tbW9uLlVJU3RyaW5nKCd2aWV3IHNvdXJjZScpO2NvbnN0IHZpZXdTb3VyY2VUb2dnbGVCdXR0b249dGhpcy5fY3JlYXRlVG9nZ2xlQnV0dG9uKHZpZXdTb3VyY2VUb2dnbGVUaXRsZSk7dmlld1NvdXJjZVRvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsaGFuZGxlcixmYWxzZSk7cmV0dXJuIHZpZXdTb3VyY2VUb2dnbGVCdXR0b247fQpfdG9nZ2xlVVJMRGVjb2RpbmcoZXZlbnQpe3RoaXMuX2RlY29kZVJlcXVlc3RQYXJhbWV0ZXJzPSF0aGlzLl9kZWNvZGVSZXF1ZXN0UGFyYW1ldGVyczt0aGlzLl9yZWZyZXNoUXVlcnlTdHJpbmcoKTt0aGlzLl9yZWZyZXNoRm9ybURhdGEoKTtldmVudC5jb25zdW1lKCk7fQpfcmVmcmVzaFJlcXVlc3RIZWFkZXJzKCl7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fcmVxdWVzdEhlYWRlcnNDYXRlZ29yeTtjb25zdCBoZWFkZXJzPXRoaXMuX3JlcXVlc3QucmVxdWVzdEhlYWRlcnMoKS5zbGljZSgpO2hlYWRlcnMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm5hbWUudG9Mb3dlckNhc2UoKS5jb21wYXJlVG8oYi5uYW1lLnRvTG93ZXJDYXNlKCkpO30pO2NvbnN0IGhlYWRlcnNUZXh0PXRoaXMuX3JlcXVlc3QucmVxdWVzdEhlYWRlcnNUZXh0KCk7aWYodGhpcy5fc2hvd1JlcXVlc3RIZWFkZXJzVGV4dCYmaGVhZGVyc1RleHQpCnRoaXMuX3JlZnJlc2hIZWFkZXJzVGV4dChDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgSGVhZGVycycpLGhlYWRlcnMubGVuZ3RoLGhlYWRlcnNUZXh0LHRyZWVFbGVtZW50KTtlbHNlCnRoaXMuX3JlZnJlc2hIZWFkZXJzKENvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBIZWFkZXJzJyksaGVhZGVycyx0cmVlRWxlbWVudCxoZWFkZXJzVGV4dD09PXVuZGVmaW5lZCk7aWYoaGVhZGVyc1RleHQpe2NvbnN0IHRvZ2dsZUJ1dHRvbj10aGlzLl9jcmVhdGVIZWFkZXJzVG9nZ2xlQnV0dG9uKHRoaXMuX3Nob3dSZXF1ZXN0SGVhZGVyc1RleHQpO3RvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fdG9nZ2xlUmVxdWVzdEhlYWRlcnNUZXh0LmJpbmQodGhpcyksZmFsc2UpO3RyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZCh0b2dnbGVCdXR0b24pO30KdGhpcy5fcmVmcmVzaEZvcm1EYXRhKCk7fQpfcmVmcmVzaFJlc3BvbnNlSGVhZGVycygpe2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuX3Jlc3BvbnNlSGVhZGVyc0NhdGVnb3J5O2NvbnN0IGhlYWRlcnM9dGhpcy5fcmVxdWVzdC5zb3J0ZWRSZXNwb25zZUhlYWRlcnMuc2xpY2UoKTtjb25zdCBoZWFkZXJzVGV4dD10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQ7aWYodGhpcy5fc2hvd1Jlc3BvbnNlSGVhZGVyc1RleHQpCnRoaXMuX3JlZnJlc2hIZWFkZXJzVGV4dChDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNlIEhlYWRlcnMnKSxoZWFkZXJzLmxlbmd0aCxoZWFkZXJzVGV4dCx0cmVlRWxlbWVudCk7ZWxzZQp0aGlzLl9yZWZyZXNoSGVhZGVycyhDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNlIEhlYWRlcnMnKSxoZWFkZXJzLHRyZWVFbGVtZW50KTtpZihoZWFkZXJzVGV4dCl7Y29uc3QgdG9nZ2xlQnV0dG9uPXRoaXMuX2NyZWF0ZUhlYWRlcnNUb2dnbGVCdXR0b24odGhpcy5fc2hvd1Jlc3BvbnNlSGVhZGVyc1RleHQpO3RvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fdG9nZ2xlUmVzcG9uc2VIZWFkZXJzVGV4dC5iaW5kKHRoaXMpLGZhbHNlKTt0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodG9nZ2xlQnV0dG9uKTt9fQpfcmVmcmVzaEhUVFBJbmZvcm1hdGlvbigpe2NvbnN0IHJlcXVlc3RNZXRob2RFbGVtZW50PXRoaXMuX3JlcXVlc3RNZXRob2RJdGVtO3JlcXVlc3RNZXRob2RFbGVtZW50LmhpZGRlbj0hdGhpcy5fcmVxdWVzdC5zdGF0dXNDb2RlO2NvbnN0IHN0YXR1c0NvZGVFbGVtZW50PXRoaXMuX3N0YXR1c0NvZGVJdGVtO3N0YXR1c0NvZGVFbGVtZW50LmhpZGRlbj0hdGhpcy5fcmVxdWVzdC5zdGF0dXNDb2RlO2lmKHRoaXMuX3JlcXVlc3Quc3RhdHVzQ29kZSl7Y29uc3Qgc3RhdHVzQ29kZUZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtzdGF0dXNDb2RlRnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci1uYW1lJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTdGF0dXMgQ29kZScpKyc6ICc7c3RhdHVzQ29kZUZyYWdtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnaGVhZGVyLXNlcGFyYXRvcicpO2NvbnN0IHN0YXR1c0NvZGVJbWFnZT1zdGF0dXNDb2RlRnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2xhYmVsJywncmVzb3VyY2Utc3RhdHVzLWltYWdlJywnZHQtaWNvbi1sYWJlbCcpO3N0YXR1c0NvZGVJbWFnZS50aXRsZT10aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGUrJyAnK3RoaXMuX3JlcXVlc3Quc3RhdHVzVGV4dDtpZih0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGU8MzAwfHx0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGU9PT0zMDQpCnN0YXR1c0NvZGVJbWFnZS50eXBlPSdzbWFsbGljb24tZ3JlZW4tYmFsbCc7ZWxzZSBpZih0aGlzLl9yZXF1ZXN0LnN0YXR1c0NvZGU8NDAwKQpzdGF0dXNDb2RlSW1hZ2UudHlwZT0nc21hbGxpY29uLW9yYW5nZS1iYWxsJztlbHNlCnN0YXR1c0NvZGVJbWFnZS50eXBlPSdzbWFsbGljb24tcmVkLWJhbGwnO3JlcXVlc3RNZXRob2RFbGVtZW50LnRpdGxlPXRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgTWV0aG9kJyksdGhpcy5fcmVxdWVzdC5yZXF1ZXN0TWV0aG9kKTtjb25zdCBzdGF0dXNUZXh0RWxlbWVudD1zdGF0dXNDb2RlRnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci12YWx1ZSBzb3VyY2UtY29kZScpO2xldCBzdGF0dXNUZXh0PXRoaXMuX3JlcXVlc3Quc3RhdHVzQ29kZSsnICcrdGhpcy5fcmVxdWVzdC5zdGF0dXNUZXh0O2lmKHRoaXMuX3JlcXVlc3QuZmV0Y2hlZFZpYVNlcnZpY2VXb3JrZXIpe3N0YXR1c1RleHQrPScgJytDb21tb24uVUlTdHJpbmcoJyhmcm9tIFNlcnZpY2VXb3JrZXIpJyk7c3RhdHVzVGV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RhdHVzLWZyb20tY2FjaGUnKTt9ZWxzZSBpZih0aGlzLl9yZXF1ZXN0LnJlZGlyZWN0U291cmNlKCkmJnRoaXMuX3JlcXVlc3QucmVkaXJlY3RTb3VyY2UoKS5zaWduZWRFeGNoYW5nZUluZm8oKSl7c3RhdHVzVGV4dCs9JyAnK0NvbW1vbi5VSVN0cmluZygnKGZyb20gc2lnbmVkLWV4Y2hhbmdlKScpO3N0YXR1c1RleHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0YXR1cy1mcm9tLWNhY2hlJyk7fWVsc2UgaWYodGhpcy5fcmVxdWVzdC5jYWNoZWQoKSl7aWYodGhpcy5fcmVxdWVzdC5jYWNoZWRJbk1lbW9yeSgpKQpzdGF0dXNUZXh0Kz0nICcrQ29tbW9uLlVJU3RyaW5nKCcoZnJvbSBtZW1vcnkgY2FjaGUpJyk7ZWxzZQpzdGF0dXNUZXh0Kz0nICcrQ29tbW9uLlVJU3RyaW5nKCcoZnJvbSBkaXNrIGNhY2hlKScpO3N0YXR1c1RleHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0YXR1cy1mcm9tLWNhY2hlJyk7fQpzdGF0dXNUZXh0RWxlbWVudC50ZXh0Q29udGVudD1zdGF0dXNUZXh0O3N0YXR1c0NvZGVFbGVtZW50LnRpdGxlPXN0YXR1c0NvZGVGcmFnbWVudDt9fQpfcmVmcmVzaEhlYWRlcnNUaXRsZSh0aXRsZSxoZWFkZXJzVHJlZUVsZW1lbnQsaGVhZGVyc0xlbmd0aCl7aGVhZGVyc1RyZWVFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2hlYWRlcnNUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKHRpdGxlKTtjb25zdCBoZWFkZXJDb3VudD1Db21tb24uVUlTdHJpbmcoJ1x1MDBBMCglZCknLGhlYWRlcnNMZW5ndGgpO2hlYWRlcnNUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdoZWFkZXItY291bnQnKS50ZXh0Q29udGVudD1oZWFkZXJDb3VudDt9Cl9yZWZyZXNoSGVhZGVycyh0aXRsZSxoZWFkZXJzLGhlYWRlcnNUcmVlRWxlbWVudCxwcm92aXNpb25hbEhlYWRlcnMpe2hlYWRlcnNUcmVlRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IGxlbmd0aD1oZWFkZXJzLmxlbmd0aDt0aGlzLl9yZWZyZXNoSGVhZGVyc1RpdGxlKHRpdGxlLGhlYWRlcnNUcmVlRWxlbWVudCxsZW5ndGgpO2lmKHByb3Zpc2lvbmFsSGVhZGVycyl7Y29uc3QgY2F1dGlvblRleHQ9Q29tbW9uLlVJU3RyaW5nKCdQcm92aXNpb25hbCBoZWFkZXJzIGFyZSBzaG93bicpO2NvbnN0IGNhdXRpb25GcmFnbWVudD1jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Y2F1dGlvbkZyYWdtZW50LmNyZWF0ZUNoaWxkKCdsYWJlbCcsJycsJ2R0LWljb24tbGFiZWwnKS50eXBlPSdzbWFsbGljb24td2FybmluZyc7Y2F1dGlvbkZyYWdtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjYXV0aW9uJykudGV4dENvbnRlbnQ9Y2F1dGlvblRleHQ7Y29uc3QgY2F1dGlvblRyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudChjYXV0aW9uRnJhZ21lbnQpO2NhdXRpb25UcmVlRWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO2hlYWRlcnNUcmVlRWxlbWVudC5hcHBlbmRDaGlsZChjYXV0aW9uVHJlZUVsZW1lbnQpO30KaGVhZGVyc1RyZWVFbGVtZW50LmhpZGRlbj0hbGVuZ3RoJiYhcHJvdmlzaW9uYWxIZWFkZXJzO2ZvcihsZXQgaT0wO2k8bGVuZ3RoOysraSl7Y29uc3QgaGVhZGVyVHJlZUVsZW1lbnQ9bmV3IFVJLlRyZWVFbGVtZW50KHRoaXMuX2Zvcm1hdEhlYWRlcihoZWFkZXJzW2ldLm5hbWUsaGVhZGVyc1tpXS52YWx1ZSkpO2hlYWRlclRyZWVFbGVtZW50LnNlbGVjdGFibGU9ZmFsc2U7aGVhZGVyc1RyZWVFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRlclRyZWVFbGVtZW50KTtoZWFkZXJUcmVlRWxlbWVudFtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5faGVhZGVyTmFtZVN5bWJvbF09aGVhZGVyc1tpXS5uYW1lO319Cl9yZWZyZXNoSGVhZGVyc1RleHQodGl0bGUsY291bnQsaGVhZGVyc1RleHQsaGVhZGVyc1RyZWVFbGVtZW50KXt0aGlzLl9wb3B1bGF0ZVRyZWVFbGVtZW50V2l0aFNvdXJjZVRleHQoaGVhZGVyc1RyZWVFbGVtZW50LGhlYWRlcnNUZXh0KTt0aGlzLl9yZWZyZXNoSGVhZGVyc1RpdGxlKHRpdGxlLGhlYWRlcnNUcmVlRWxlbWVudCxjb3VudCk7fQpfcmVmcmVzaFJlbW90ZUFkZHJlc3MoKXtjb25zdCByZW1vdGVBZGRyZXNzPXRoaXMuX3JlcXVlc3QucmVtb3RlQWRkcmVzcygpO2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuX3JlbW90ZUFkZHJlc3NJdGVtO3RyZWVFbGVtZW50LmhpZGRlbj0hcmVtb3RlQWRkcmVzcztpZihyZW1vdGVBZGRyZXNzKQp0cmVlRWxlbWVudC50aXRsZT10aGlzLl9mb3JtYXRIZWFkZXIoQ29tbW9uLlVJU3RyaW5nKCdSZW1vdGUgQWRkcmVzcycpLHJlbW90ZUFkZHJlc3MpO30KX3JlZnJlc2hSZWZlcnJlclBvbGljeSgpe2NvbnN0IHJlZmVycmVyUG9saWN5PXRoaXMuX3JlcXVlc3QucmVmZXJyZXJQb2xpY3koKTtjb25zdCB0cmVlRWxlbWVudD10aGlzLl9yZWZlcnJlclBvbGljeUl0ZW07dHJlZUVsZW1lbnQuaGlkZGVuPSFyZWZlcnJlclBvbGljeTtpZihyZWZlcnJlclBvbGljeSkKdHJlZUVsZW1lbnQudGl0bGU9dGhpcy5fZm9ybWF0SGVhZGVyKENvbW1vbi5VSVN0cmluZygnUmVmZXJyZXIgUG9saWN5JykscmVmZXJyZXJQb2xpY3kpO30KX3RvZ2dsZVJlcXVlc3RIZWFkZXJzVGV4dChldmVudCl7dGhpcy5fc2hvd1JlcXVlc3RIZWFkZXJzVGV4dD0hdGhpcy5fc2hvd1JlcXVlc3RIZWFkZXJzVGV4dDt0aGlzLl9yZWZyZXNoUmVxdWVzdEhlYWRlcnMoKTtldmVudC5jb25zdW1lKCk7fQpfdG9nZ2xlUmVzcG9uc2VIZWFkZXJzVGV4dChldmVudCl7dGhpcy5fc2hvd1Jlc3BvbnNlSGVhZGVyc1RleHQ9IXRoaXMuX3Nob3dSZXNwb25zZUhlYWRlcnNUZXh0O3RoaXMuX3JlZnJlc2hSZXNwb25zZUhlYWRlcnMoKTtldmVudC5jb25zdW1lKCk7fQpfY3JlYXRlVG9nZ2xlQnV0dG9uKHRpdGxlKXtjb25zdCBidXR0b249Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2hlYWRlci10b2dnbGUnKTtidXR0b24udGV4dENvbnRlbnQ9dGl0bGU7cmV0dXJuIGJ1dHRvbjt9Cl9jcmVhdGVIZWFkZXJzVG9nZ2xlQnV0dG9uKGlzSGVhZGVyc1RleHRTaG93bil7Y29uc3QgdG9nZ2xlVGl0bGU9aXNIZWFkZXJzVGV4dFNob3duP0NvbW1vbi5VSVN0cmluZygndmlldyBwYXJzZWQnKTpDb21tb24uVUlTdHJpbmcoJ3ZpZXcgc291cmNlJyk7cmV0dXJuIHRoaXMuX2NyZWF0ZVRvZ2dsZUJ1dHRvbih0b2dnbGVUaXRsZSk7fQpfY2xlYXJIaWdobGlnaHQoKXtpZih0aGlzLl9oaWdobGlnaHRlZEVsZW1lbnQpCnRoaXMuX2hpZ2hsaWdodGVkRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWhpZ2hsaWdodCcpO3RoaXMuX2hpZ2hsaWdodGVkRWxlbWVudD1udWxsO30KX3JldmVhbEFuZEhpZ2hsaWdodChjYXRlZ29yeSxuYW1lKXt0aGlzLl9jbGVhckhpZ2hsaWdodCgpO2Zvcihjb25zdCBlbGVtZW50IG9mIGNhdGVnb3J5LmNoaWxkcmVuKCkpe2lmKGVsZW1lbnRbTmV0d29yay5SZXF1ZXN0SGVhZGVyc1ZpZXcuX2hlYWRlck5hbWVTeW1ib2xdIT09bmFtZSkKY29udGludWU7dGhpcy5faGlnaGxpZ2h0ZWRFbGVtZW50PWVsZW1lbnQ7ZWxlbWVudC5yZXZlYWwoKTtlbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXItaGlnaGxpZ2h0Jyk7cmV0dXJuO319CnJldmVhbFJlcXVlc3RIZWFkZXIoaGVhZGVyKXt0aGlzLl9yZXZlYWxBbmRIaWdobGlnaHQodGhpcy5fcmVxdWVzdEhlYWRlcnNDYXRlZ29yeSxoZWFkZXIpO30KcmV2ZWFsUmVzcG9uc2VIZWFkZXIoaGVhZGVyKXt0aGlzLl9yZXZlYWxBbmRIaWdobGlnaHQodGhpcy5fcmVzcG9uc2VIZWFkZXJzQ2F0ZWdvcnksaGVhZGVyKTt9fTtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5faGVhZGVyTmFtZVN5bWJvbD1TeW1ib2woJ0hlYWRlck5hbWUnKTtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5fdmlld1NvdXJjZVN5bWJvbD1TeW1ib2woJ1ZpZXdTb3VyY2UnKTtOZXR3b3JrLlJlcXVlc3RIZWFkZXJzVmlldy5DYXRlZ29yeT1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHJvb3QsbmFtZSx0aXRsZSl7c3VwZXIodGl0bGV8fCcnLHRydWUpO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt0aGlzLmhpZGRlbj10cnVlO3RoaXMuX2V4cGFuZGVkU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygncmVxdWVzdC1pbmZvLScrbmFtZSsnLWNhdGVnb3J5LWV4cGFuZGVkJyx0cnVlKTt0aGlzLmV4cGFuZGVkPXRoaXMuX2V4cGFuZGVkU2V0dGluZy5nZXQoKTtyb290LmFwcGVuZENoaWxkKHRoaXMpO30KY3JlYXRlTGVhZigpe2NvbnN0IGxlYWY9bmV3IFVJLlRyZWVFbGVtZW50KCk7bGVhZi5zZWxlY3RhYmxlPWZhbHNlO3RoaXMuYXBwZW5kQ2hpbGQobGVhZik7cmV0dXJuIGxlYWY7fQpvbmV4cGFuZCgpe3RoaXMuX2V4cGFuZGVkU2V0dGluZy5zZXQodHJ1ZSk7fQpvbmNvbGxhcHNlKCl7dGhpcy5fZXhwYW5kZWRTZXR0aW5nLnNldChmYWxzZSk7fX07O05ldHdvcmsuUmVxdWVzdEhUTUxWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihkYXRhVVJMKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ25ldHdvcmsvcmVxdWVzdEhUTUxWaWV3LmNzcycpO3RoaXMuX2RhdGFVUkw9ZGF0YVVSTDt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2h0bWwnLCdyZXF1ZXN0LXZpZXcnKTt9Cndhc1Nob3duKCl7dGhpcy5fY3JlYXRlSUZyYW1lKCk7fQp3aWxsSGlkZSgpe3RoaXMuY29udGVudEVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt9Cl9jcmVhdGVJRnJhbWUoKXt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgaWZyYW1lPWNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO2lmcmFtZS5jbGFzc05hbWU9J2h0bWwtcHJldmlldy1mcmFtZSc7aWZyYW1lLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsJycpO2lmcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsdGhpcy5fZGF0YVVSTCk7aWZyYW1lLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLC0xKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGlmcmFtZSk7fX07O05ldHdvcmsuUmVxdWVzdFJlc3BvbnNlVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IocmVxdWVzdCl7c3VwZXIoKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVxdWVzdC12aWV3Jyk7dGhpcy5yZXF1ZXN0PXJlcXVlc3Q7dGhpcy5fY29udGVudFZpZXdQcm9taXNlPW51bGw7fQpzdGF0aWMgX2hhc1RleHRDb250ZW50KHJlcXVlc3QsY29udGVudERhdGEpe2NvbnN0IG1pbWVUeXBlPXJlcXVlc3QubWltZVR5cGU7bGV0IHJlc291cmNlVHlwZT1Db21tb24uUmVzb3VyY2VUeXBlLmZyb21NaW1lVHlwZShtaW1lVHlwZSk7aWYocmVzb3VyY2VUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuT3RoZXIpCnJlc291cmNlVHlwZT1yZXF1ZXN0LmNvbnRlbnRUeXBlKCk7aWYocmVzb3VyY2VUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuSW1hZ2UpCnJldHVybiBtaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS9zdmcnKTtpZihyZXNvdXJjZVR5cGUuaXNUZXh0VHlwZSgpKQpyZXR1cm4gdHJ1ZTtpZihjb250ZW50RGF0YS5lcnJvcikKcmV0dXJuIGZhbHNlO2lmKHJlc291cmNlVHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLk90aGVyKQpyZXR1cm4hIWNvbnRlbnREYXRhLmNvbnRlbnQmJiFjb250ZW50RGF0YS5lbmNvZGVkO3JldHVybiBmYWxzZTt9CnN0YXRpYyBhc3luYyBzb3VyY2VWaWV3Rm9yUmVxdWVzdChyZXF1ZXN0KXtsZXQgc291cmNlVmlldz1yZXF1ZXN0W05ldHdvcmsuUmVxdWVzdFJlc3BvbnNlVmlldy5fc291cmNlVmlld1N5bWJvbF07aWYoc291cmNlVmlldyE9PXVuZGVmaW5lZCkKcmV0dXJuIHNvdXJjZVZpZXc7Y29uc3QgY29udGVudERhdGE9YXdhaXQgcmVxdWVzdC5jb250ZW50RGF0YSgpO2lmKCFOZXR3b3JrLlJlcXVlc3RSZXNwb25zZVZpZXcuX2hhc1RleHRDb250ZW50KHJlcXVlc3QsY29udGVudERhdGEpKXtyZXF1ZXN0W05ldHdvcmsuUmVxdWVzdFJlc3BvbnNlVmlldy5fc291cmNlVmlld1N5bWJvbF09bnVsbDtyZXR1cm4gbnVsbDt9CmNvbnN0IGNvbnRlbnRQcm92aWRlcj1uZXcgTmV0d29yay5EZWNvZGluZ0NvbnRlbnRQcm92aWRlcihyZXF1ZXN0KTtjb25zdCBoaWdobGlnaHRlclR5cGU9cmVxdWVzdC5yZXNvdXJjZVR5cGUoKS5jYW5vbmljYWxNaW1lVHlwZSgpfHxyZXF1ZXN0Lm1pbWVUeXBlO3NvdXJjZVZpZXc9U291cmNlRnJhbWUuUmVzb3VyY2VTb3VyY2VGcmFtZS5jcmVhdGVTZWFyY2hhYmxlVmlldyhjb250ZW50UHJvdmlkZXIsaGlnaGxpZ2h0ZXJUeXBlKTtyZXF1ZXN0W05ldHdvcmsuUmVxdWVzdFJlc3BvbnNlVmlldy5fc291cmNlVmlld1N5bWJvbF09c291cmNlVmlldztyZXR1cm4gc291cmNlVmlldzt9Cndhc1Nob3duKCl7dGhpcy5fZG9TaG93UHJldmlldygpO30KX2RvU2hvd1ByZXZpZXcoKXtpZighdGhpcy5fY29udGVudFZpZXdQcm9taXNlKQp0aGlzLl9jb250ZW50Vmlld1Byb21pc2U9dGhpcy5zaG93UHJldmlldygpO3JldHVybiB0aGlzLl9jb250ZW50Vmlld1Byb21pc2U7fQphc3luYyBzaG93UHJldmlldygpe2NvbnN0IHJlc3BvbnNlVmlldz1hd2FpdCB0aGlzLmNyZWF0ZVByZXZpZXcoKTtyZXNwb25zZVZpZXcuc2hvdyh0aGlzLmVsZW1lbnQpO3JldHVybiByZXNwb25zZVZpZXc7fQphc3luYyBjcmVhdGVQcmV2aWV3KCl7Y29uc3QgY29udGVudERhdGE9YXdhaXQgdGhpcy5yZXF1ZXN0LmNvbnRlbnREYXRhKCk7Y29uc3Qgc291cmNlVmlldz1hd2FpdCBOZXR3b3JrLlJlcXVlc3RSZXNwb25zZVZpZXcuc291cmNlVmlld0ZvclJlcXVlc3QodGhpcy5yZXF1ZXN0KTtpZigoIWNvbnRlbnREYXRhLmNvbnRlbnR8fCFzb3VyY2VWaWV3KSYmIWNvbnRlbnREYXRhLmVycm9yKQpyZXR1cm4gbmV3IFVJLkVtcHR5V2lkZ2V0KENvbW1vbi5VSVN0cmluZygnVGhpcyByZXF1ZXN0IGhhcyBubyByZXNwb25zZSBkYXRhIGF2YWlsYWJsZS4nKSk7aWYoY29udGVudERhdGEuY29udGVudCYmc291cmNlVmlldykKcmV0dXJuIHNvdXJjZVZpZXc7cmV0dXJuIG5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ0ZhaWxlZCB0byBsb2FkIHJlc3BvbnNlIGRhdGEnKSk7fQphc3luYyByZXZlYWxMaW5lKGxpbmUpe2NvbnN0IHZpZXc9YXdhaXQgdGhpcy5fZG9TaG93UHJldmlldygpO2lmKHZpZXcgaW5zdGFuY2VvZiBTb3VyY2VGcmFtZS5SZXNvdXJjZVNvdXJjZUZyYW1lLlNlYXJjaGFibGVDb250YWluZXIpCnZpZXcucmV2ZWFsUG9zaXRpb24obGluZSk7fX07TmV0d29yay5SZXF1ZXN0UmVzcG9uc2VWaWV3Ll9zb3VyY2VWaWV3U3ltYm9sPVN5bWJvbCgnUmVxdWVzdFJlc3BvbnNlU291cmNlVmlldycpO05ldHdvcmsuRGVjb2RpbmdDb250ZW50UHJvdmlkZXI9Y2xhc3N7Y29uc3RydWN0b3IocmVxdWVzdCl7dGhpcy5fcmVxdWVzdD1yZXF1ZXN0O30KY29udGVudFVSTCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0LmNvbnRlbnRVUkwoKTt9CmNvbnRlbnRUeXBlKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3QucmVzb3VyY2VUeXBlKCk7fQpjb250ZW50RW5jb2RlZCgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO30KYXN5bmMgcmVxdWVzdENvbnRlbnQoKXtjb25zdCBjb250ZW50RGF0YT1hd2FpdCB0aGlzLl9yZXF1ZXN0LmNvbnRlbnREYXRhKCk7cmV0dXJuIGNvbnRlbnREYXRhLmVuY29kZWQ/d2luZG93LmF0b2IoY29udGVudERhdGEuY29udGVudHx8JycpOmNvbnRlbnREYXRhLmNvbnRlbnQ7fQpzZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KXtyZXR1cm4gdGhpcy5fcmVxdWVzdC5zZWFyY2hJbkNvbnRlbnQocXVlcnksY2FzZVNlbnNpdGl2ZSxpc1JlZ2V4KTt9fTs7TmV0d29yay5SZXF1ZXN0UHJldmlld1ZpZXc9Y2xhc3MgZXh0ZW5kcyBOZXR3b3JrLlJlcXVlc3RSZXNwb25zZVZpZXd7Y29uc3RydWN0b3IocmVxdWVzdCl7c3VwZXIocmVxdWVzdCk7fQphc3luYyBzaG93UHJldmlldygpe2NvbnN0IHZpZXc9YXdhaXQgc3VwZXIuc2hvd1ByZXZpZXcoKTtpZighKHZpZXcgaW5zdGFuY2VvZiBVSS5TaW1wbGVWaWV3KSkKcmV0dXJuIHZpZXc7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignbmV0d29yay1pdGVtLXByZXZpZXctdG9vbGJhcicsdGhpcy5lbGVtZW50KTtmb3IoY29uc3QgaXRlbSBvZiB2aWV3LnN5bmNUb29sYmFySXRlbXMoKSkKdG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShpdGVtKTtyZXR1cm4gdmlldzt9CmFzeW5jIF9odG1sUHJldmlldygpe2NvbnN0IGNvbnRlbnREYXRhPWF3YWl0IHRoaXMucmVxdWVzdC5jb250ZW50RGF0YSgpO2lmKGNvbnRlbnREYXRhLmVycm9yKQpyZXR1cm4gbmV3IFVJLkVtcHR5V2lkZ2V0KENvbW1vbi5VSVN0cmluZygnRmFpbGVkIHRvIGxvYWQgcmVzcG9uc2UgZGF0YScpKTtjb25zdCB3aGl0ZWxpc3Q9bmV3IFNldChbJ3RleHQvaHRtbCcsJ3RleHQvcGxhaW4nLCdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSk7aWYoIXdoaXRlbGlzdC5oYXModGhpcy5yZXF1ZXN0Lm1pbWVUeXBlKSkKcmV0dXJuIG51bGw7Y29uc3QganNvblZpZXc9YXdhaXQgU291cmNlRnJhbWUuSlNPTlZpZXcuY3JlYXRlVmlldyhjb250ZW50RGF0YS5jb250ZW50KTtpZihqc29uVmlldykKcmV0dXJuIGpzb25WaWV3O2NvbnN0IGRhdGFVUkw9Q29tbW9uLkNvbnRlbnRQcm92aWRlci5jb250ZW50QXNEYXRhVVJMKGNvbnRlbnREYXRhLmNvbnRlbnQsdGhpcy5yZXF1ZXN0Lm1pbWVUeXBlLGNvbnRlbnREYXRhLmVuY29kZWQsY29udGVudERhdGEuZW5jb2RlZD8ndXRmLTgnOm51bGwpO3JldHVybiBkYXRhVVJMP25ldyBOZXR3b3JrLlJlcXVlc3RIVE1MVmlldyhkYXRhVVJMKTpudWxsO30KYXN5bmMgY3JlYXRlUHJldmlldygpe2lmKHRoaXMucmVxdWVzdC5zaWduZWRFeGNoYW5nZUluZm8oKSkKcmV0dXJuIG5ldyBOZXR3b3JrLlNpZ25lZEV4Y2hhbmdlSW5mb1ZpZXcodGhpcy5yZXF1ZXN0KTtjb25zdCBodG1sRXJyb3JQcmV2aWV3PWF3YWl0IHRoaXMuX2h0bWxQcmV2aWV3KCk7aWYoaHRtbEVycm9yUHJldmlldykKcmV0dXJuIGh0bWxFcnJvclByZXZpZXc7Y29uc3QgcHJvdmlkZWQ9YXdhaXQgU291cmNlRnJhbWUuUHJldmlld0ZhY3RvcnkuY3JlYXRlUHJldmlldyh0aGlzLnJlcXVlc3QsdGhpcy5yZXF1ZXN0Lm1pbWVUeXBlKTtpZihwcm92aWRlZCkKcmV0dXJuIHByb3ZpZGVkO2NvbnN0IHNvdXJjZVZpZXc9YXdhaXQgTmV0d29yay5SZXF1ZXN0UmVzcG9uc2VWaWV3LnNvdXJjZVZpZXdGb3JSZXF1ZXN0KHRoaXMucmVxdWVzdCk7aWYoc291cmNlVmlldykKcmV0dXJuIHNvdXJjZVZpZXc7cmV0dXJuIG5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ1ByZXZpZXcgbm90IGF2YWlsYWJsZScpKTt9fTs7TmV0d29yay5SZXF1ZXN0VGltaW5nVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IocmVxdWVzdCxjYWxjdWxhdG9yKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNvdXJjZS10aW1pbmctdmlldycpO3RoaXMuX3JlcXVlc3Q9cmVxdWVzdDt0aGlzLl9jYWxjdWxhdG9yPWNhbGN1bGF0b3I7fQpzdGF0aWMgX3RpbWVSYW5nZVRpdGxlKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlB1c2g6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnUmVjZWl2aW5nIFB1c2gnKTtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlF1ZXVlaW5nOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1F1ZXVlaW5nJyk7Y2FzZSBOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5CbG9ja2luZzpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTdGFsbGVkJyk7Y2FzZSBOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Db25uZWN0aW5nOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0luaXRpYWwgY29ubmVjdGlvbicpO2Nhc2UgTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuRE5TOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0ROUyBMb29rdXAnKTtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlByb3h5OnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1Byb3h5IG5lZ290aWF0aW9uJyk7Y2FzZSBOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5SZWNlaXZpbmdQdXNoOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1JlYWRpbmcgUHVzaCcpO2Nhc2UgTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUmVjZWl2aW5nOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0NvbnRlbnQgRG93bmxvYWQnKTtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNlbmRpbmc6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBzZW50Jyk7Y2FzZSBOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5TZXJ2aWNlV29ya2VyOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgdG8gU2VydmljZVdvcmtlcicpO2Nhc2UgTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuU2VydmljZVdvcmtlclByZXBhcmF0aW9uOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1NlcnZpY2VXb3JrZXIgUHJlcGFyYXRpb24nKTtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNTTDpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTU0wnKTtjYXNlIE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlRvdGFsOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1RvdGFsJyk7Y2FzZSBOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5XYWl0aW5nOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1dhaXRpbmcgKFRURkIpJyk7ZGVmYXVsdDpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKG5hbWUpO319CnN0YXRpYyBjYWxjdWxhdGVSZXF1ZXN0VGltZVJhbmdlcyhyZXF1ZXN0LG5hdmlnYXRpb25TdGFydCl7Y29uc3QgcmVzdWx0PVtdO2Z1bmN0aW9uIGFkZFJhbmdlKG5hbWUsc3RhcnQsZW5kKXtpZihzdGFydDxOdW1iZXIuTUFYX1ZBTFVFJiZzdGFydDw9ZW5kKQpyZXN1bHQucHVzaCh7bmFtZTpuYW1lLHN0YXJ0OnN0YXJ0LGVuZDplbmR9KTt9CmZ1bmN0aW9uIGZpcnN0UG9zaXRpdmUobnVtYmVycyl7Zm9yKGxldCBpPTA7aTxudW1iZXJzLmxlbmd0aDsrK2kpe2lmKG51bWJlcnNbaV0+MCkKcmV0dXJuIG51bWJlcnNbaV07fQpyZXR1cm4gdW5kZWZpbmVkO30KZnVuY3Rpb24gYWRkT2Zmc2V0UmFuZ2UobmFtZSxzdGFydCxlbmQpe2lmKHN0YXJ0Pj0wJiZlbmQ+PTApCmFkZFJhbmdlKG5hbWUsc3RhcnRUaW1lKyhzdGFydC8xMDAwKSxzdGFydFRpbWUrKGVuZC8xMDAwKSk7fQpjb25zdCB0aW1pbmc9cmVxdWVzdC50aW1pbmc7aWYoIXRpbWluZyl7Y29uc3Qgc3RhcnQ9cmVxdWVzdC5pc3N1ZVRpbWUoKSE9PS0xP3JlcXVlc3QuaXNzdWVUaW1lKCk6cmVxdWVzdC5zdGFydFRpbWUhPT0tMT9yZXF1ZXN0LnN0YXJ0VGltZTowO2NvbnN0IG1pZGRsZT0ocmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZT09PS0xKT9OdW1iZXIuTUFYX1ZBTFVFOnJlcXVlc3QucmVzcG9uc2VSZWNlaXZlZFRpbWU7Y29uc3QgZW5kPShyZXF1ZXN0LmVuZFRpbWU9PT0tMSk/TnVtYmVyLk1BWF9WQUxVRTpyZXF1ZXN0LmVuZFRpbWU7YWRkUmFuZ2UoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuVG90YWwsc3RhcnQsZW5kKTthZGRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5CbG9ja2luZyxzdGFydCxtaWRkbGUpO2FkZFJhbmdlKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlJlY2VpdmluZyxtaWRkbGUsZW5kKTtyZXR1cm4gcmVzdWx0O30KY29uc3QgaXNzdWVUaW1lPXJlcXVlc3QuaXNzdWVUaW1lKCk7Y29uc3Qgc3RhcnRUaW1lPXRpbWluZy5yZXF1ZXN0VGltZTtjb25zdCBlbmRUaW1lPWZpcnN0UG9zaXRpdmUoW3JlcXVlc3QuZW5kVGltZSxyZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lXSl8fHN0YXJ0VGltZTthZGRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Ub3RhbCxpc3N1ZVRpbWU8c3RhcnRUaW1lP2lzc3VlVGltZTpzdGFydFRpbWUsZW5kVGltZSk7aWYodGltaW5nLnB1c2hTdGFydCl7Y29uc3QgcHVzaEVuZD10aW1pbmcucHVzaEVuZHx8ZW5kVGltZTtpZihwdXNoRW5kPm5hdmlnYXRpb25TdGFydCkKYWRkUmFuZ2UoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUHVzaCxNYXRoLm1heCh0aW1pbmcucHVzaFN0YXJ0LG5hdmlnYXRpb25TdGFydCkscHVzaEVuZCk7fQppZihpc3N1ZVRpbWU8c3RhcnRUaW1lKQphZGRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5RdWV1ZWluZyxpc3N1ZVRpbWUsc3RhcnRUaW1lKTtjb25zdCByZXNwb25zZVJlY2VpdmVkPShyZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lLXN0YXJ0VGltZSkqMTAwMDtpZihyZXF1ZXN0LmZldGNoZWRWaWFTZXJ2aWNlV29ya2VyKXthZGRPZmZzZXRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5CbG9ja2luZywwLHRpbWluZy53b3JrZXJTdGFydCk7YWRkT2Zmc2V0UmFuZ2UoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuU2VydmljZVdvcmtlclByZXBhcmF0aW9uLHRpbWluZy53b3JrZXJTdGFydCx0aW1pbmcud29ya2VyUmVhZHkpO2FkZE9mZnNldFJhbmdlKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNlcnZpY2VXb3JrZXIsdGltaW5nLndvcmtlclJlYWR5LHRpbWluZy5zZW5kRW5kKTthZGRPZmZzZXRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5XYWl0aW5nLHRpbWluZy5zZW5kRW5kLHJlc3BvbnNlUmVjZWl2ZWQpO31lbHNlIGlmKCF0aW1pbmcucHVzaFN0YXJ0KXtjb25zdCBibG9ja2luZ0VuZD1maXJzdFBvc2l0aXZlKFt0aW1pbmcuZG5zU3RhcnQsdGltaW5nLmNvbm5lY3RTdGFydCx0aW1pbmcuc2VuZFN0YXJ0LHJlc3BvbnNlUmVjZWl2ZWRdKXx8MDthZGRPZmZzZXRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5CbG9ja2luZywwLGJsb2NraW5nRW5kKTthZGRPZmZzZXRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5Qcm94eSx0aW1pbmcucHJveHlTdGFydCx0aW1pbmcucHJveHlFbmQpO2FkZE9mZnNldFJhbmdlKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLkROUyx0aW1pbmcuZG5zU3RhcnQsdGltaW5nLmRuc0VuZCk7YWRkT2Zmc2V0UmFuZ2UoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuQ29ubmVjdGluZyx0aW1pbmcuY29ubmVjdFN0YXJ0LHRpbWluZy5jb25uZWN0RW5kKTthZGRPZmZzZXRSYW5nZShOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5TU0wsdGltaW5nLnNzbFN0YXJ0LHRpbWluZy5zc2xFbmQpO2FkZE9mZnNldFJhbmdlKE5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlNlbmRpbmcsdGltaW5nLnNlbmRTdGFydCx0aW1pbmcuc2VuZEVuZCk7YWRkT2Zmc2V0UmFuZ2UoTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuV2FpdGluZyxNYXRoLm1heCh0aW1pbmcuc2VuZEVuZCx0aW1pbmcuY29ubmVjdEVuZCx0aW1pbmcuZG5zRW5kLHRpbWluZy5wcm94eUVuZCxibG9ja2luZ0VuZCkscmVzcG9uc2VSZWNlaXZlZCk7fQppZihyZXF1ZXN0LmVuZFRpbWUhPT0tMSl7YWRkUmFuZ2UodGltaW5nLnB1c2hTdGFydD9OZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5SZWNlaXZpbmdQdXNoOk5ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzLlJlY2VpdmluZyxyZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lLGVuZFRpbWUpO30KcmV0dXJuIHJlc3VsdDt9CnN0YXRpYyBjcmVhdGVUaW1pbmdUYWJsZShyZXF1ZXN0LGNhbGN1bGF0b3Ipe2NvbnN0IHRhYmxlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCd0YWJsZScsJ25ldHdvcmstdGltaW5nLXRhYmxlJyk7VUkuYXBwZW5kU3R5bGUodGFibGVFbGVtZW50LCduZXR3b3JrL25ldHdvcmtUaW1pbmdUYWJsZS5jc3MnKTtjb25zdCBjb2xncm91cD10YWJsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2NvbGdyb3VwJyk7Y29sZ3JvdXAuY3JlYXRlQ2hpbGQoJ2NvbCcsJ2xhYmVscycpO2NvbGdyb3VwLmNyZWF0ZUNoaWxkKCdjb2wnLCdiYXJzJyk7Y29sZ3JvdXAuY3JlYXRlQ2hpbGQoJ2NvbCcsJ2R1cmF0aW9uJyk7Y29uc3QgdGltZVJhbmdlcz1OZXR3b3JrLlJlcXVlc3RUaW1pbmdWaWV3LmNhbGN1bGF0ZVJlcXVlc3RUaW1lUmFuZ2VzKHJlcXVlc3QsY2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKSk7Y29uc3Qgc3RhcnRUaW1lPXRpbWVSYW5nZXMubWFwKHI9PnIuc3RhcnQpLnJlZHVjZSgoYSxiKT0+TWF0aC5taW4oYSxiKSk7Y29uc3QgZW5kVGltZT10aW1lUmFuZ2VzLm1hcChyPT5yLmVuZCkucmVkdWNlKChhLGIpPT5NYXRoLm1heChhLGIpKTtjb25zdCBzY2FsZT0xMDAvKGVuZFRpbWUtc3RhcnRUaW1lKTtsZXQgY29ubmVjdGlvbkhlYWRlcjtsZXQgZGF0YUhlYWRlcjtsZXQgcXVldWVpbmdIZWFkZXI7bGV0IHRvdGFsRHVyYXRpb249MDtjb25zdCBzdGFydFRpbWVIZWFkZXI9dGFibGVFbGVtZW50LmNyZWF0ZUNoaWxkKCd0aGVhZCcsJ25ldHdvcmstdGltaW5nLXN0YXJ0Jyk7Y29uc3QgcXVldWVkQ2VsbD1zdGFydFRpbWVIZWFkZXIuY3JlYXRlQ2hpbGQoJ3RyJykuY3JlYXRlQ2hpbGQoJ3RkJyk7Y29uc3Qgc3RhcnRlZENlbGw9c3RhcnRUaW1lSGVhZGVyLmNyZWF0ZUNoaWxkKCd0cicpLmNyZWF0ZUNoaWxkKCd0ZCcpO3F1ZXVlZENlbGwuY29sU3Bhbj1zdGFydGVkQ2VsbC5jb2xTcGFuPTI7cXVldWVkQ2VsbC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdRdWV1ZWQgYXQgJXMnLGNhbGN1bGF0b3IuZm9ybWF0VmFsdWUocmVxdWVzdC5pc3N1ZVRpbWUoKSwyKSkpO3N0YXJ0ZWRDZWxsLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1N0YXJ0ZWQgYXQgJXMnLGNhbGN1bGF0b3IuZm9ybWF0VmFsdWUocmVxdWVzdC5zdGFydFRpbWUsMikpKTtsZXQgcmlnaHQ7Zm9yKGxldCBpPTA7aTx0aW1lUmFuZ2VzLmxlbmd0aDsrK2kpe2NvbnN0IHJhbmdlPXRpbWVSYW5nZXNbaV07Y29uc3QgcmFuZ2VOYW1lPXJhbmdlLm5hbWU7aWYocmFuZ2VOYW1lPT09TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuVG90YWwpe3RvdGFsRHVyYXRpb249cmFuZ2UuZW5kLXJhbmdlLnN0YXJ0O2NvbnRpbnVlO30KaWYocmFuZ2VOYW1lPT09TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUHVzaCl7Y3JlYXRlSGVhZGVyKENvbW1vbi5VSVN0cmluZygnU2VydmVyIFB1c2gnKSk7fWVsc2UgaWYocmFuZ2VOYW1lPT09TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUXVldWVpbmcpe3F1ZXVlaW5nSGVhZGVyPXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndHInLCduZXR3b3JrLXRpbWluZy10YWJsZS1oZWFkZXInKTtxdWV1ZWluZ0hlYWRlci5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdSZXNvdXJjZSBTY2hlZHVsaW5nJykpO3F1ZXVlaW5nSGVhZGVyLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZVRleHRDaGlsZCgnJyk7cXVldWVpbmdIZWFkZXIuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnVElNRScpKTt9ZWxzZSBpZihOZXR3b3JrLlJlcXVlc3RUaW1pbmdWaWV3LkNvbm5lY3Rpb25TZXR1cFJhbmdlTmFtZXMuaGFzKHJhbmdlTmFtZSkpe2lmKCFjb25uZWN0aW9uSGVhZGVyKQpjb25uZWN0aW9uSGVhZGVyPWNyZWF0ZUhlYWRlcihDb21tb24uVUlTdHJpbmcoJ0Nvbm5lY3Rpb24gU3RhcnQnKSk7fWVsc2V7aWYoIWRhdGFIZWFkZXIpCmRhdGFIZWFkZXI9Y3JlYXRlSGVhZGVyKENvbW1vbi5VSVN0cmluZygnUmVxdWVzdC9SZXNwb25zZScpKTt9CmNvbnN0IGxlZnQ9KHNjYWxlKihyYW5nZS5zdGFydC1zdGFydFRpbWUpKTtyaWdodD0oc2NhbGUqKGVuZFRpbWUtcmFuZ2UuZW5kKSk7Y29uc3QgZHVyYXRpb249cmFuZ2UuZW5kLXJhbmdlLnN0YXJ0O2NvbnN0IHRyPXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndHInKTt0ci5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVUZXh0Q2hpbGQoTmV0d29yay5SZXF1ZXN0VGltaW5nVmlldy5fdGltZVJhbmdlVGl0bGUocmFuZ2VOYW1lKSk7Y29uc3Qgcm93PXRyLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZUNoaWxkKCdkaXYnLCduZXR3b3JrLXRpbWluZy1yb3cnKTtjb25zdCBiYXI9cm93LmNyZWF0ZUNoaWxkKCdzcGFuJywnbmV0d29yay10aW1pbmctYmFyICcrcmFuZ2VOYW1lKTtiYXIuc3R5bGUubGVmdD1sZWZ0KyclJztiYXIuc3R5bGUucmlnaHQ9cmlnaHQrJyUnO2Jhci50ZXh0Q29udGVudD0nXHUyMDBCJztjb25zdCBsYWJlbD10ci5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVDaGlsZCgnZGl2JywnbmV0d29yay10aW1pbmctYmFyLXRpdGxlJyk7bGFiZWwudGV4dENvbnRlbnQ9TnVtYmVyLnNlY29uZHNUb1N0cmluZyhkdXJhdGlvbix0cnVlKTt9CmlmKCFyZXF1ZXN0LmZpbmlzaGVkKXtjb25zdCBjZWxsPXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndHInKS5jcmVhdGVDaGlsZCgndGQnLCdjYXV0aW9uJyk7Y2VsbC5jb2xTcGFuPTM7Y2VsbC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdDQVVUSU9OOiByZXF1ZXN0IGlzIG5vdCBmaW5pc2hlZCB5ZXQhJykpO30KY29uc3QgZm9vdGVyPXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndHInLCduZXR3b3JrLXRpbWluZy1mb290ZXInKTtjb25zdCBub3RlPWZvb3Rlci5jcmVhdGVDaGlsZCgndGQnKTtub3RlLmNvbFNwYW49MTtub3RlLmFwcGVuZENoaWxkKFVJLmNyZWF0ZURvY3VtZW50YXRpb25MaW5rKCduZXR3b3JrLXBlcmZvcm1hbmNlL3JlZmVyZW5jZSN0aW1pbmctZXhwbGFuYXRpb24nLENvbW1vbi5VSVN0cmluZygnRXhwbGFuYXRpb24nKSkpO2Zvb3Rlci5jcmVhdGVDaGlsZCgndGQnKTtmb290ZXIuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlVGV4dENoaWxkKE51bWJlci5zZWNvbmRzVG9TdHJpbmcodG90YWxEdXJhdGlvbix0cnVlKSk7Y29uc3Qgc2VydmVyVGltaW5ncz1yZXF1ZXN0LnNlcnZlclRpbWluZ3M7aWYoIXNlcnZlclRpbWluZ3MpCnJldHVybiB0YWJsZUVsZW1lbnQ7Y29uc3QgbGFzdFRpbWluZ1JpZ2h0RWRnZT1yaWdodD09PXVuZGVmaW5lZD8xMDA6cmlnaHQ7Y29uc3QgYnJlYWtFbGVtZW50PXRhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgndHInLCduZXR3b3JrLXRpbWluZy10YWJsZS1oZWFkZXInKS5jcmVhdGVDaGlsZCgndGQnKTticmVha0VsZW1lbnQuY29sU3Bhbj0zO2JyZWFrRWxlbWVudC5jcmVhdGVDaGlsZCgnaHInLCdicmVhaycpO2NvbnN0IHNlcnZlckhlYWRlcj10YWJsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3RyJywnbmV0d29yay10aW1pbmctdGFibGUtaGVhZGVyJyk7c2VydmVySGVhZGVyLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1NlcnZlciBUaW1pbmcnKSk7c2VydmVySGVhZGVyLmNyZWF0ZUNoaWxkKCd0ZCcpO3NlcnZlckhlYWRlci5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdUSU1FJykpO3NlcnZlclRpbWluZ3MuZmlsdGVyKGl0ZW09Pml0ZW0ubWV0cmljLnRvTG93ZXJDYXNlKCkhPT0ndG90YWwnKS5mb3JFYWNoKGl0ZW09PmFkZFRpbWluZyhpdGVtLGxhc3RUaW1pbmdSaWdodEVkZ2UpKTtzZXJ2ZXJUaW1pbmdzLmZpbHRlcihpdGVtPT5pdGVtLm1ldHJpYy50b0xvd2VyQ2FzZSgpPT09J3RvdGFsJykuZm9yRWFjaChpdGVtPT5hZGRUaW1pbmcoaXRlbSxsYXN0VGltaW5nUmlnaHRFZGdlKSk7cmV0dXJuIHRhYmxlRWxlbWVudDtmdW5jdGlvbiBhZGRUaW1pbmcoc2VydmVyVGltaW5nLHJpZ2h0KXtjb25zdCBjb2xvckdlbmVyYXRvcj1uZXcgQ29tbW9uLkNvbG9yLkdlbmVyYXRvcih7bWluOjAsbWF4OjM2MCxjb3VudDozNn0se21pbjo1MCxtYXg6ODB9LDgwKTtjb25zdCBpc1RvdGFsPXNlcnZlclRpbWluZy5tZXRyaWMudG9Mb3dlckNhc2UoKT09PSd0b3RhbCc7Y29uc3QgdHI9dGFibGVFbGVtZW50LmNyZWF0ZUNoaWxkKCd0cicsaXNUb3RhbD8nbmV0d29yay10aW1pbmctZm9vdGVyJzonJyk7Y29uc3QgbWV0cmljPXRyLmNyZWF0ZUNoaWxkKCd0ZCcsJ25ldHdvcmstdGltaW5nLW1ldHJpYycpO21ldHJpYy5jcmVhdGVUZXh0Q2hpbGQoc2VydmVyVGltaW5nLmRlc2NyaXB0aW9ufHxzZXJ2ZXJUaW1pbmcubWV0cmljKTtjb25zdCByb3c9dHIuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstdGltaW5nLXJvdycpO2lmKHNlcnZlclRpbWluZy52YWx1ZT09PW51bGwpCnJldHVybjtjb25zdCBsZWZ0PXNjYWxlKihlbmRUaW1lLXN0YXJ0VGltZS0oc2VydmVyVGltaW5nLnZhbHVlLzEwMDApKTtpZihsZWZ0Pj0wKXtjb25zdCBiYXI9cm93LmNyZWF0ZUNoaWxkKCdzcGFuJywnbmV0d29yay10aW1pbmctYmFyIHNlcnZlci10aW1pbmcnKTtiYXIuc3R5bGUubGVmdD1sZWZ0KyclJztiYXIuc3R5bGUucmlnaHQ9cmlnaHQrJyUnO2Jhci50ZXh0Q29udGVudD0nXHUyMDBCJztpZighaXNUb3RhbCkKYmFyLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jb2xvckdlbmVyYXRvci5jb2xvckZvcklEKHNlcnZlclRpbWluZy5tZXRyaWMpO30KY29uc3QgbGFiZWw9dHIuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstdGltaW5nLWJhci10aXRsZScpO2xhYmVsLnRleHRDb250ZW50PU51bWJlci5taWxsaXNUb1N0cmluZyhzZXJ2ZXJUaW1pbmcudmFsdWUsdHJ1ZSk7fQpmdW5jdGlvbiBjcmVhdGVIZWFkZXIodGl0bGUpe2NvbnN0IGRhdGFIZWFkZXI9dGFibGVFbGVtZW50LmNyZWF0ZUNoaWxkKCd0cicsJ25ldHdvcmstdGltaW5nLXRhYmxlLWhlYWRlcicpO2RhdGFIZWFkZXIuY3JlYXRlQ2hpbGQoJ3RkJykuY3JlYXRlVGV4dENoaWxkKHRpdGxlKTtkYXRhSGVhZGVyLmNyZWF0ZUNoaWxkKCd0ZCcpLmNyZWF0ZVRleHRDaGlsZCgnJyk7ZGF0YUhlYWRlci5jcmVhdGVDaGlsZCgndGQnKS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdUSU1FJykpO3JldHVybiBkYXRhSGVhZGVyO319Cndhc1Nob3duKCl7dGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuVGltaW5nQ2hhbmdlZCx0aGlzLl9yZWZyZXNoLHRoaXMpO3RoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLkZpbmlzaGVkTG9hZGluZyx0aGlzLl9yZWZyZXNoLHRoaXMpO3RoaXMuX2NhbGN1bGF0b3IuYWRkRXZlbnRMaXN0ZW5lcihOZXR3b3JrLk5ldHdvcmtUaW1lQ2FsY3VsYXRvci5FdmVudHMuQm91bmRhcmllc0NoYW5nZWQsdGhpcy5fcmVmcmVzaCx0aGlzKTt0aGlzLl9yZWZyZXNoKCk7fQp3aWxsSGlkZSgpe3RoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya1JlcXVlc3QuRXZlbnRzLlRpbWluZ0NoYW5nZWQsdGhpcy5fcmVmcmVzaCx0aGlzKTt0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5GaW5pc2hlZExvYWRpbmcsdGhpcy5fcmVmcmVzaCx0aGlzKTt0aGlzLl9jYWxjdWxhdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoTmV0d29yay5OZXR3b3JrVGltZUNhbGN1bGF0b3IuRXZlbnRzLkJvdW5kYXJpZXNDaGFuZ2VkLHRoaXMuX3JlZnJlc2gsdGhpcyk7fQpfcmVmcmVzaCgpe2lmKHRoaXMuX3RhYmxlRWxlbWVudCkKdGhpcy5fdGFibGVFbGVtZW50LnJlbW92ZSgpO3RoaXMuX3RhYmxlRWxlbWVudD1OZXR3b3JrLlJlcXVlc3RUaW1pbmdWaWV3LmNyZWF0ZVRpbWluZ1RhYmxlKHRoaXMuX3JlcXVlc3QsdGhpcy5fY2FsY3VsYXRvcik7dGhpcy5fdGFibGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jlc291cmNlLXRpbWluZy10YWJsZScpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90YWJsZUVsZW1lbnQpO319O05ldHdvcmsuUmVxdWVzdFRpbWVSYW5nZU5hbWVzPXtQdXNoOidwdXNoJyxRdWV1ZWluZzoncXVldWVpbmcnLEJsb2NraW5nOidibG9ja2luZycsQ29ubmVjdGluZzonY29ubmVjdGluZycsRE5TOidkbnMnLFByb3h5Oidwcm94eScsUmVjZWl2aW5nOidyZWNlaXZpbmcnLFJlY2VpdmluZ1B1c2g6J3JlY2VpdmluZy1wdXNoJyxTZW5kaW5nOidzZW5kaW5nJyxTZXJ2aWNlV29ya2VyOidzZXJ2aWNld29ya2VyJyxTZXJ2aWNlV29ya2VyUHJlcGFyYXRpb246J3NlcnZpY2V3b3JrZXItcHJlcGFyYXRpb24nLFNTTDonc3NsJyxUb3RhbDondG90YWwnLFdhaXRpbmc6J3dhaXRpbmcnfTtOZXR3b3JrLlJlcXVlc3RUaW1pbmdWaWV3LkNvbm5lY3Rpb25TZXR1cFJhbmdlTmFtZXM9bmV3IFNldChbTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUXVldWVpbmcsTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuQmxvY2tpbmcsTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuQ29ubmVjdGluZyxOZXR3b3JrLlJlcXVlc3RUaW1lUmFuZ2VOYW1lcy5ETlMsTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuUHJveHksTmV0d29yay5SZXF1ZXN0VGltZVJhbmdlTmFtZXMuU1NMXSk7TmV0d29yay5SZXF1ZXN0VGltZVJhbmdlOztOZXR3b3JrLlJlc291cmNlV2ViU29ja2V0RnJhbWVWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihyZXF1ZXN0KXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnbmV0d29yay93ZWJTb2NrZXRGcmFtZVZpZXcuY3NzJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3dlYnNvY2tldC1mcmFtZS12aWV3Jyk7dGhpcy5fcmVxdWVzdD1yZXF1ZXN0O3RoaXMuX3NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSx0cnVlLCdyZXNvdXJjZVdlYlNvY2tldEZyYW1lU3BsaXRWaWV3U3RhdGUnKTt0aGlzLl9zcGxpdFdpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7Y29uc3QgY29sdW1ucz0oW3tpZDonZGF0YScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdEYXRhJyksc29ydGFibGU6ZmFsc2Usd2VpZ2h0Ojg4fSx7aWQ6J2xlbmd0aCcsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdMZW5ndGgnKSxzb3J0YWJsZTpmYWxzZSxhbGlnbjpEYXRhR3JpZC5EYXRhR3JpZC5BbGlnbi5SaWdodCx3ZWlnaHQ6NX0se2lkOid0aW1lJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1RpbWUnKSxzb3J0YWJsZTp0cnVlLHdlaWdodDo3fV0pO3RoaXMuX2RhdGFHcmlkPW5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkKGNvbHVtbnMpO3RoaXMuX2RhdGFHcmlkLnNldFJvd0NvbnRleHRNZW51Q2FsbGJhY2sob25Sb3dDb250ZXh0TWVudS5iaW5kKHRoaXMpKTt0aGlzLl9kYXRhR3JpZC5zZXRTdGlja1RvQm90dG9tKHRydWUpO3RoaXMuX2RhdGFHcmlkLnNldENlbGxDbGFzcygnd2Vic29ja2V0LWZyYW1lLXZpZXctdGQnKTt0aGlzLl90aW1lQ29tcGFyYXRvcj0oTmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lTm9kZVRpbWVDb21wYXJhdG9yKTt0aGlzLl9kYXRhR3JpZC5zb3J0Tm9kZXModGhpcy5fdGltZUNvbXBhcmF0b3IsZmFsc2UpO3RoaXMuX2RhdGFHcmlkLm1hcmtDb2x1bW5Bc1NvcnRlZEJ5KCd0aW1lJyxEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5Bc2NlbmRpbmcpO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDaGFuZ2VkLHRoaXMuX3NvcnRJdGVtcyx0aGlzKTt0aGlzLl9kYXRhR3JpZC5zZXROYW1lKCdSZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldycpO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSx0aGlzLl9vbkZyYW1lU2VsZWN0ZWQsdGhpcyk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuRGVzZWxlY3RlZE5vZGUsdGhpcy5fb25GcmFtZURlc2VsZWN0ZWQsdGhpcyk7dGhpcy5fbWFpblRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJycpO3RoaXMuX2NsZWFyQWxsQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xlYXIgQWxsJyksJ2xhcmdlaWNvbi1jbGVhcicpO3RoaXMuX2NsZWFyQWxsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fY2xlYXJGcmFtZXMsdGhpcyk7dGhpcy5fbWFpblRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fY2xlYXJBbGxCdXR0b24pO3RoaXMuX2ZpbHRlclR5cGVDb21ib2JveD1uZXcgVUkuVG9vbGJhckNvbWJvQm94KHRoaXMuX3VwZGF0ZUZpbHRlclNldHRpbmcuYmluZCh0aGlzKSk7Zm9yKGNvbnN0IGZpbHRlckl0ZW0gb2YgTmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldy5fZmlsdGVyVHlwZXMpe2NvbnN0IG9wdGlvbj10aGlzLl9maWx0ZXJUeXBlQ29tYm9ib3guY3JlYXRlT3B0aW9uKGZpbHRlckl0ZW0ubGFiZWwsZmlsdGVySXRlbS5sYWJlbCxmaWx0ZXJJdGVtLm5hbWUpO3RoaXMuX2ZpbHRlclR5cGVDb21ib2JveC5hZGRPcHRpb24ob3B0aW9uKTt9CnRoaXMuX21haW5Ub29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2ZpbHRlclR5cGVDb21ib2JveCk7dGhpcy5fZmlsdGVyVHlwZT1udWxsO2NvbnN0IHBsYWNlaG9sZGVyPSdFbnRlciByZWdleCwgZm9yIGV4YW1wbGU6ICh3ZWIpP3NvY2tldCc7dGhpcy5fZmlsdGVyVGV4dElucHV0PW5ldyBVSS5Ub29sYmFySW5wdXQoQ29tbW9uLlVJU3RyaW5nKHBsYWNlaG9sZGVyKSwwLjQpO3RoaXMuX2ZpbHRlclRleHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJJbnB1dC5FdmVudC5UZXh0Q2hhbmdlZCx0aGlzLl91cGRhdGVGaWx0ZXJTZXR0aW5nLHRoaXMpO3RoaXMuX21haW5Ub29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2ZpbHRlclRleHRJbnB1dCk7dGhpcy5fZmlsdGVyUmVnZXg9bnVsbDtjb25zdCBtYWluQ29udGFpbmVyPW5ldyBVSS5WQm94KCk7bWFpbkNvbnRhaW5lci5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX21haW5Ub29sYmFyLmVsZW1lbnQpO3RoaXMuX2RhdGFHcmlkLmFzV2lkZ2V0KCkuc2hvdyhtYWluQ29udGFpbmVyLmVsZW1lbnQpO3RoaXMuX3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQobWFpbkNvbnRhaW5lcik7dGhpcy5fZnJhbWVFbXB0eVdpZGdldD1uZXcgVUkuRW1wdHlXaWRnZXQoQ29tbW9uLlVJU3RyaW5nKCdTZWxlY3QgZnJhbWUgdG8gYnJvd3NlIGl0cyBjb250ZW50LicpKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuX2ZyYW1lRW1wdHlXaWRnZXQpO3RoaXMuX3NlbGVjdGVkTm9kZT1udWxsO2Z1bmN0aW9uIG9uUm93Q29udGV4dE1lbnUoY29udGV4dE1lbnUsbm9kZSl7Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IG1lc3NhZ2UnKSxJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQuYmluZChJbnNwZWN0b3JGcm9udGVuZEhvc3Qsbm9kZS5kYXRhLmRhdGEpKTtjb250ZXh0TWVudS5mb290ZXJTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NsZWFyIGFsbCcpLHRoaXMuX2NsZWFyRnJhbWVzLmJpbmQodGhpcykpO319CnN0YXRpYyBvcENvZGVEZXNjcmlwdGlvbihvcENvZGUsbWFzayl7Y29uc3QgcmF3RGVzY3JpcHRpb249TmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldy5vcENvZGVEZXNjcmlwdGlvbnNbb3BDb2RlXXx8Jyc7Y29uc3QgbG9jYWxpemVkRGVzY3JpcHRpb249Q29tbW9uLlVJU3RyaW5nKHJhd0Rlc2NyaXB0aW9uKTtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclcyAoT3Bjb2RlICVkJXMpJyxsb2NhbGl6ZWREZXNjcmlwdGlvbixvcENvZGUsKG1hc2s/JywgbWFzayc6JycpKTt9Cndhc1Nob3duKCl7dGhpcy5yZWZyZXNoKCk7dGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrUmVxdWVzdC5FdmVudHMuV2Vic29ja2V0RnJhbWVBZGRlZCx0aGlzLl9mcmFtZUFkZGVkLHRoaXMpO30Kd2lsbEhpZGUoKXt0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLk5ldHdvcmtSZXF1ZXN0LkV2ZW50cy5XZWJzb2NrZXRGcmFtZUFkZGVkLHRoaXMuX2ZyYW1lQWRkZWQsdGhpcyk7fQpfZnJhbWVBZGRlZChldmVudCl7Y29uc3QgZnJhbWU9KGV2ZW50LmRhdGEpO2lmKCF0aGlzLl9mcmFtZUZpbHRlcihmcmFtZSkpCnJldHVybjt0aGlzLl9kYXRhR3JpZC5pbnNlcnRDaGlsZChuZXcgTmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lTm9kZSh0aGlzLl9yZXF1ZXN0LnVybCgpLGZyYW1lKSk7fQpfZnJhbWVGaWx0ZXIoZnJhbWUpe2lmKHRoaXMuX2ZpbHRlclR5cGUmJmZyYW1lLnR5cGUhPT10aGlzLl9maWx0ZXJUeXBlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIXRoaXMuX2ZpbHRlclJlZ2V4fHx0aGlzLl9maWx0ZXJSZWdleC50ZXN0KGZyYW1lLnRleHQpO30KX2NsZWFyRnJhbWVzKCl7dGhpcy5fcmVxdWVzdFtOZXR3b3JrLlJlc291cmNlV2ViU29ja2V0RnJhbWVWaWV3Ll9jbGVhckZyYW1lT2Zmc2V0U3ltYm9sXT10aGlzLl9yZXF1ZXN0LmZyYW1lcygpLmxlbmd0aDt0aGlzLnJlZnJlc2goKTt9Cl91cGRhdGVGaWx0ZXJTZXR0aW5nKCl7Y29uc3QgdGV4dD10aGlzLl9maWx0ZXJUZXh0SW5wdXQudmFsdWUoKTtjb25zdCB0eXBlPXRoaXMuX2ZpbHRlclR5cGVDb21ib2JveC5zZWxlY3RlZE9wdGlvbigpLnZhbHVlO3RoaXMuX2ZpbHRlclJlZ2V4PXRleHQ/bmV3IFJlZ0V4cCh0ZXh0LCdpJyk6bnVsbDt0aGlzLl9maWx0ZXJUeXBlPXR5cGU9PT0nYWxsJz9udWxsOnR5cGU7dGhpcy5yZWZyZXNoKCk7fQphc3luYyBfb25GcmFtZVNlbGVjdGVkKGV2ZW50KXtjb25zdCBzZWxlY3RlZE5vZGU9KGV2ZW50LmRhdGEpO3RoaXMuX2N1cnJlbnRTZWxlY3RlZE5vZGU9c2VsZWN0ZWROb2RlO2NvbnN0IGNvbnRlbnRQcm92aWRlcj1zZWxlY3RlZE5vZGUuY29udGVudFByb3ZpZGVyKCk7Y29uc3QgY29udGVudD1hd2FpdCBjb250ZW50UHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKTtjb25zdCBqc29uVmlldz1hd2FpdCBTb3VyY2VGcmFtZS5KU09OVmlldy5jcmVhdGVWaWV3KGNvbnRlbnQpO2lmKHRoaXMuX2N1cnJlbnRTZWxlY3RlZE5vZGUhPT1zZWxlY3RlZE5vZGUpCnJldHVybjtpZihqc29uVmlldykKdGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldChqc29uVmlldyk7ZWxzZQp0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KG5ldyBTb3VyY2VGcmFtZS5SZXNvdXJjZVNvdXJjZUZyYW1lKGNvbnRlbnRQcm92aWRlcikpO30KX29uRnJhbWVEZXNlbGVjdGVkKGV2ZW50KXt0aGlzLl9jdXJyZW50U2VsZWN0ZWROb2RlPW51bGw7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9mcmFtZUVtcHR5V2lkZ2V0KTt9CnJlZnJlc2goKXt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgdXJsPXRoaXMuX3JlcXVlc3QudXJsKCk7bGV0IGZyYW1lcz10aGlzLl9yZXF1ZXN0LmZyYW1lcygpO2NvbnN0IG9mZnNldD10aGlzLl9yZXF1ZXN0W05ldHdvcmsuUmVzb3VyY2VXZWJTb2NrZXRGcmFtZVZpZXcuX2NsZWFyRnJhbWVPZmZzZXRTeW1ib2xdfHwwO2ZyYW1lcz1mcmFtZXMuc2xpY2Uob2Zmc2V0KTtmcmFtZXM9ZnJhbWVzLmZpbHRlcih0aGlzLl9mcmFtZUZpbHRlci5iaW5kKHRoaXMpKTtmcmFtZXMuZm9yRWFjaChmcmFtZT0+dGhpcy5fZGF0YUdyaWQuaW5zZXJ0Q2hpbGQobmV3IE5ldHdvcmsuUmVzb3VyY2VXZWJTb2NrZXRGcmFtZU5vZGUodXJsLGZyYW1lKSkpO30KX3NvcnRJdGVtcygpe3RoaXMuX2RhdGFHcmlkLnNvcnROb2Rlcyh0aGlzLl90aW1lQ29tcGFyYXRvciwhdGhpcy5fZGF0YUdyaWQuaXNTb3J0T3JkZXJBc2NlbmRpbmcoKSk7fX07TmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldy5PcENvZGVzPXtDb250aW51YXRpb25GcmFtZTowLFRleHRGcmFtZToxLEJpbmFyeUZyYW1lOjIsQ29ubmVjdGlvbkNsb3NlRnJhbWU6OCxQaW5nRnJhbWU6OSxQb25nRnJhbWU6MTB9O05ldHdvcmsuUmVzb3VyY2VXZWJTb2NrZXRGcmFtZVZpZXcub3BDb2RlRGVzY3JpcHRpb25zPShmdW5jdGlvbigpe2NvbnN0IG9wQ29kZXM9TmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldy5PcENvZGVzO2NvbnN0IG1hcD1bXTttYXBbb3BDb2Rlcy5Db250aW51YXRpb25GcmFtZV09J0NvbnRpbnVhdGlvbiBGcmFtZSc7bWFwW29wQ29kZXMuVGV4dEZyYW1lXT0nVGV4dCBGcmFtZSc7bWFwW29wQ29kZXMuQmluYXJ5RnJhbWVdPSdCaW5hcnkgRnJhbWUnO21hcFtvcENvZGVzLkNvbnRpbnVhdGlvbkZyYW1lXT0nQ29ubmVjdGlvbiBDbG9zZSBGcmFtZSc7bWFwW29wQ29kZXMuUGluZ0ZyYW1lXT0nUGluZyBGcmFtZSc7bWFwW29wQ29kZXMuUG9uZ0ZyYW1lXT0nUG9uZyBGcmFtZSc7cmV0dXJuIG1hcDt9KSgpO05ldHdvcmsuUmVzb3VyY2VXZWJTb2NrZXRGcmFtZVZpZXcuX2ZpbHRlclR5cGVzPVt7bmFtZTonYWxsJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0FsbCcpfSx7bmFtZTonc2VuZCcsbGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdTZW5kJyl9LHtuYW1lOidyZWNlaXZlJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ1JlY2VpdmUnKX0sXTtOZXR3b3JrLlJlc291cmNlV2ViU29ja2V0RnJhbWVOb2RlPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuU29ydGFibGVEYXRhR3JpZE5vZGV7Y29uc3RydWN0b3IodXJsLGZyYW1lKXtsZXQgZGF0YVRleHQ9ZnJhbWUudGV4dDtjb25zdCBsZW5ndGg9ZnJhbWUudGV4dC5sZW5ndGg7Y29uc3QgdGltZT1uZXcgRGF0ZShmcmFtZS50aW1lKjEwMDApO2NvbnN0IHRpbWVUZXh0PSgnMCcrdGltZS5nZXRIb3VycygpKS5zdWJzdHIoLTIpKyc6JysoJzAnK3RpbWUuZ2V0TWludXRlcygpKS5zdWJzdHIoLTIpKyc6JysKKCcwJyt0aW1lLmdldFNlY29uZHMoKSkuc3Vic3RyKC0yKSsnLicrKCcwMCcrdGltZS5nZXRNaWxsaXNlY29uZHMoKSkuc3Vic3RyKC0zKTtjb25zdCB0aW1lTm9kZT1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aW1lTm9kZS5jcmVhdGVUZXh0Q2hpbGQodGltZVRleHQpO3RpbWVOb2RlLnRpdGxlPXRpbWUudG9Mb2NhbGVTdHJpbmcoKTtjb25zdCBpc1RleHRGcmFtZT1mcmFtZS5vcENvZGU9PT1OZXR3b3JrLlJlc291cmNlV2ViU29ja2V0RnJhbWVWaWV3Lk9wQ29kZXMuVGV4dEZyYW1lO2lmKCFpc1RleHRGcmFtZSkKZGF0YVRleHQ9TmV0d29yay5SZXNvdXJjZVdlYlNvY2tldEZyYW1lVmlldy5vcENvZGVEZXNjcmlwdGlvbihmcmFtZS5vcENvZGUsZnJhbWUubWFzayk7c3VwZXIoe2RhdGE6ZGF0YVRleHQsbGVuZ3RoOmxlbmd0aCx0aW1lOnRpbWVOb2RlfSk7dGhpcy5fdXJsPXVybDt0aGlzLl9mcmFtZT1mcmFtZTt0aGlzLl9pc1RleHRGcmFtZT1pc1RleHRGcmFtZTt0aGlzLl9kYXRhVGV4dD1kYXRhVGV4dDt9CmNyZWF0ZUNlbGxzKGVsZW1lbnQpe2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnd2Vic29ja2V0LWZyYW1lLXZpZXctcm93LWVycm9yJyx0aGlzLl9mcmFtZS50eXBlPT09U0RLLk5ldHdvcmtSZXF1ZXN0LldlYlNvY2tldEZyYW1lVHlwZS5FcnJvcik7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd3ZWJzb2NrZXQtZnJhbWUtdmlldy1yb3ctc2VuZCcsdGhpcy5fZnJhbWUudHlwZT09PVNESy5OZXR3b3JrUmVxdWVzdC5XZWJTb2NrZXRGcmFtZVR5cGUuU2VuZCk7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd3ZWJzb2NrZXQtZnJhbWUtdmlldy1yb3ctcmVjZWl2ZScsdGhpcy5fZnJhbWUudHlwZT09PVNESy5OZXR3b3JrUmVxdWVzdC5XZWJTb2NrZXRGcmFtZVR5cGUuUmVjZWl2ZSk7ZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd3ZWJzb2NrZXQtZnJhbWUtdmlldy1yb3ctb3Bjb2RlJywhdGhpcy5faXNUZXh0RnJhbWUpO3N1cGVyLmNyZWF0ZUNlbGxzKGVsZW1lbnQpO30Kbm9kZVNlbGZIZWlnaHQoKXtyZXR1cm4gMjE7fQpjb250ZW50UHJvdmlkZXIoKXtyZXR1cm4gQ29tbW9uLlN0YXRpY0NvbnRlbnRQcm92aWRlci5mcm9tU3RyaW5nKHRoaXMuX3VybCxDb21tb24ucmVzb3VyY2VUeXBlcy5XZWJTb2NrZXQsdGhpcy5fZGF0YVRleHQpO319O05ldHdvcmsuUmVzb3VyY2VXZWJTb2NrZXRGcmFtZU5vZGVUaW1lQ29tcGFyYXRvcj1mdW5jdGlvbihhLGIpe3JldHVybiBhLl9mcmFtZS50aW1lLWIuX2ZyYW1lLnRpbWU7fTtOZXR3b3JrLlJlc291cmNlV2ViU29ja2V0RnJhbWVWaWV3Ll9jbGVhckZyYW1lT2Zmc2V0U3ltYm9sPVN5bWJvbCgnQ2xlYXJGcmFtZU9mZnNldCcpOztOZXR3b3JrLlNpZ25lZEV4Y2hhbmdlSW5mb1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHJlcXVlc3Qpe3N1cGVyKCk7Y29uc3Qgc2lnbmVkRXhjaGFuZ2VJbmZvPXJlcXVlc3Quc2lnbmVkRXhjaGFuZ2VJbmZvKCk7Y29uc29sZS5hc3NlcnQoc2lnbmVkRXhjaGFuZ2VJbmZvKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ25ldHdvcmsvc2lnbmVkRXhjaGFuZ2VJbmZvVmlldy5jc3MnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2lnbmVkLWV4Y2hhbmdlLWluZm8tdmlldycpO2NvbnN0IHJvb3Q9bmV3IFVJLlRyZWVPdXRsaW5lSW5TaGFkb3coKTtyb290LnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ25ldHdvcmsvc2lnbmVkRXhjaGFuZ2VJbmZvVHJlZS5jc3MnKTtyb290LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2lnbmVkLWV4Y2hhbmdlLWluZm8tdHJlZScpO3Jvb3Quc2V0Rm9jdXNhYmxlKGZhbHNlKTtyb290Lm1ha2VEZW5zZSgpO3Jvb3QuZXhwYW5kVHJlZUVsZW1lbnRzV2hlbkFycm93aW5nPXRydWU7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHJvb3QuZWxlbWVudCk7Y29uc3QgZXJyb3JGaWVsZFNldE1hcD1uZXcgTWFwKCk7aWYoc2lnbmVkRXhjaGFuZ2VJbmZvLmVycm9ycyYmc2lnbmVkRXhjaGFuZ2VJbmZvLmVycm9ycy5sZW5ndGgpe2NvbnN0IGVycm9yTWVzc2FnZXNDYXRlZ29yeT1uZXcgTmV0d29yay5TaWduZWRFeGNoYW5nZUluZm9WaWV3LkNhdGVnb3J5KHJvb3QsQ29tbW9uLlVJU3RyaW5nKCdFcnJvcnMnKSk7Zm9yKGNvbnN0IGVycm9yIG9mIHNpZ25lZEV4Y2hhbmdlSW5mby5lcnJvcnMpe2NvbnN0IGZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmcmFnbWVudC5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLWVycm9yJywncHJvbXB0LWljb24nKSk7ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2Vycm9yLWxvZycpLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7ZXJyb3JNZXNzYWdlc0NhdGVnb3J5LmNyZWF0ZUxlYWYoZnJhZ21lbnQpO2lmKGVycm9yLmVycm9yRmllbGQpe2xldCBlcnJvckZpZWxkU2V0PWVycm9yRmllbGRTZXRNYXAuZ2V0KGVycm9yLnNpZ25hdHVyZUluZGV4KTtpZighZXJyb3JGaWVsZFNldCl7ZXJyb3JGaWVsZFNldD1uZXcgU2V0KCk7ZXJyb3JGaWVsZFNldE1hcC5zZXQoZXJyb3Iuc2lnbmF0dXJlSW5kZXgsZXJyb3JGaWVsZFNldCk7fQplcnJvckZpZWxkU2V0LmFkZChlcnJvci5lcnJvckZpZWxkKTt9fX0KY29uc3QgdGl0bGVFbGVtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt0aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci1uYW1lJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaWduZWQgSFRUUCBleGNoYW5nZScpO2NvbnN0IGxlYXJuTW9yZU5vZGU9VUkuWExpbmsuY3JlYXRlKCdodHRwczovL2dpdGh1Yi5jb20vV0lDRy93ZWJwYWNrYWdlJyxDb21tb24uVUlTdHJpbmcoJ0xlYXJuXHhhMG1vcmUnKSwnaGVhZGVyLXRvZ2dsZScpO3RpdGxlRWxlbWVudC5hcHBlbmRDaGlsZChsZWFybk1vcmVOb2RlKTtjb25zdCBoZWFkZXJDYXRlZ29yeT1uZXcgTmV0d29yay5TaWduZWRFeGNoYW5nZUluZm9WaWV3LkNhdGVnb3J5KHJvb3QsdGl0bGVFbGVtZW50KTtpZihzaWduZWRFeGNoYW5nZUluZm8uaGVhZGVyKXtjb25zdCBoZWFkZXI9c2lnbmVkRXhjaGFuZ2VJbmZvLmhlYWRlcjtjb25zdCByZWRpcmVjdERlc3RpbmF0aW9uPXJlcXVlc3QucmVkaXJlY3REZXN0aW5hdGlvbigpO2NvbnN0IHJlcXVlc3RVUkxFbGVtZW50PXRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgVVJMJyksaGVhZGVyLnJlcXVlc3RVcmwpO2lmKHJlZGlyZWN0RGVzdGluYXRpb24pe2NvbnN0IHZpZXdSZXF1ZXN0TGluaz1Db21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5UmV2ZWFsYWJsZShyZWRpcmVjdERlc3RpbmF0aW9uLCdWaWV3IHJlcXVlc3QnKTt2aWV3UmVxdWVzdExpbmsuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLXRvZ2dsZScpO3JlcXVlc3RVUkxFbGVtZW50LmFwcGVuZENoaWxkKHZpZXdSZXF1ZXN0TGluayk7fQpoZWFkZXJDYXRlZ29yeS5jcmVhdGVMZWFmKHJlcXVlc3RVUkxFbGVtZW50KTtoZWFkZXJDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgbWV0aG9kJyksaGVhZGVyLnJlcXVlc3RNZXRob2QpKTtoZWFkZXJDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNlIGNvZGUnKSxoZWFkZXIucmVzcG9uc2VDb2RlKycnKSk7dGhpcy5fcmVzcG9uc2VIZWFkZXJzSXRlbT1oZWFkZXJDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1Jlc3BvbnNlIGhlYWRlcnMnKSwnJykpO2NvbnN0IHJlc3BvbnNlSGVhZGVycz1oZWFkZXIucmVzcG9uc2VIZWFkZXJzO2Zvcihjb25zdCBuYW1lIGluIHJlc3BvbnNlSGVhZGVycyl7Y29uc3QgaGVhZGVyVHJlZUVsZW1lbnQ9bmV3IFVJLlRyZWVFbGVtZW50KHRoaXMuX2Zvcm1hdEhlYWRlcihuYW1lLHJlc3BvbnNlSGVhZGVyc1tuYW1lXSkpO2hlYWRlclRyZWVFbGVtZW50LnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fcmVzcG9uc2VIZWFkZXJzSXRlbS5hcHBlbmRDaGlsZChoZWFkZXJUcmVlRWxlbWVudCk7fQp0aGlzLl9yZXNwb25zZUhlYWRlcnNJdGVtLmV4cGFuZCgpO2ZvcihsZXQgaT0wO2k8aGVhZGVyLnNpZ25hdHVyZXMubGVuZ3RoOysraSl7Y29uc3QgZXJyb3JGaWVsZFNldD1lcnJvckZpZWxkU2V0TWFwLmdldChpKXx8bmV3IFNldCgpO2NvbnN0IHNpZ25hdHVyZT1oZWFkZXIuc2lnbmF0dXJlc1tpXTtjb25zdCBzaWduYXR1cmVDYXRlZ29yeT1uZXcgTmV0d29yay5TaWduZWRFeGNoYW5nZUluZm9WaWV3LkNhdGVnb3J5KHJvb3QsQ29tbW9uLlVJU3RyaW5nKCdTaWduYXR1cmUnKSk7c2lnbmF0dXJlQ2F0ZWdvcnkuY3JlYXRlTGVhZih0aGlzLl9mb3JtYXRIZWFkZXIoQ29tbW9uLlVJU3RyaW5nKCdMYWJlbCcpLHNpZ25hdHVyZS5sYWJlbCkpO3NpZ25hdHVyZUNhdGVnb3J5LmNyZWF0ZUxlYWYodGhpcy5fZm9ybWF0SGVhZGVyRm9ySGV4RGF0YShDb21tb24uVUlTdHJpbmcoJ1NpZ25hdHVyZScpLHNpZ25hdHVyZS5zaWduYXR1cmUsZXJyb3JGaWVsZFNldC5oYXMoUHJvdG9jb2wuTmV0d29yay5TaWduZWRFeGNoYW5nZUVycm9yRmllbGQuU2lnbmF0dXJlU2lnKSkpO2lmKHNpZ25hdHVyZS5jZXJ0VXJsKXtjb25zdCBjZXJ0VVJMRWxlbWVudD10aGlzLl9mb3JtYXRIZWFkZXIoQ29tbW9uLlVJU3RyaW5nKCdDZXJ0aWZpY2F0ZSBVUkwnKSxzaWduYXR1cmUuY2VydFVybCxlcnJvckZpZWxkU2V0LmhhcyhQcm90b2NvbC5OZXR3b3JrLlNpZ25lZEV4Y2hhbmdlRXJyb3JGaWVsZC5TaWduYXR1cmVDZXJ0VXJsKSk7aWYoc2lnbmF0dXJlLmNlcnRpZmljYXRlcyl7Y29uc3Qgdmlld0NlcnRMaW5rPWNlcnRVUkxFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnZGV2dG9vbHMtbGluayBoZWFkZXItdG9nZ2xlJyk7dmlld0NlcnRMaW5rLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVmlldyBjZXJ0aWZpY2F0ZScpO3ZpZXdDZXJ0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsSW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNob3dDZXJ0aWZpY2F0ZVZpZXdlci5iaW5kKG51bGwsc2lnbmF0dXJlLmNlcnRpZmljYXRlcyksZmFsc2UpO30Kc2lnbmF0dXJlQ2F0ZWdvcnkuY3JlYXRlTGVhZihjZXJ0VVJMRWxlbWVudCk7fQpzaWduYXR1cmVDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ0ludGVncml0eScpLHNpZ25hdHVyZS5pbnRlZ3JpdHksZXJyb3JGaWVsZFNldC5oYXMoUHJvdG9jb2wuTmV0d29yay5TaWduZWRFeGNoYW5nZUVycm9yRmllbGQuU2lnbmF0dXJlSW50ZWdyaXR5KSkpO2lmKHNpZ25hdHVyZS5jZXJ0U2hhMjU2KXtzaWduYXR1cmVDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlckZvckhleERhdGEoQ29tbW9uLlVJU3RyaW5nKCdDZXJ0aWZpY2F0ZSBTSEEyNTYnKSxzaWduYXR1cmUuY2VydFNoYTI1NixlcnJvckZpZWxkU2V0LmhhcyhQcm90b2NvbC5OZXR3b3JrLlNpZ25lZEV4Y2hhbmdlRXJyb3JGaWVsZC5TaWduYXR1cmVDZXJ0U2hhMjU2KSkpO30Kc2lnbmF0dXJlQ2F0ZWdvcnkuY3JlYXRlTGVhZih0aGlzLl9mb3JtYXRIZWFkZXIoQ29tbW9uLlVJU3RyaW5nKCdWYWxpZGl0eSBVUkwnKSxzaWduYXR1cmUudmFsaWRpdHlVcmwsZXJyb3JGaWVsZFNldC5oYXMoUHJvdG9jb2wuTmV0d29yay5TaWduZWRFeGNoYW5nZUVycm9yRmllbGQuU2lnbmF0dXJlVmFsaWRpdHlVcmwpKSk7c2lnbmF0dXJlQ2F0ZWdvcnkuY3JlYXRlTGVhZigpLnRpdGxlPXRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ0RhdGUnKSxuZXcgRGF0ZSgxMDAwKnNpZ25hdHVyZS5kYXRlKS50b1VUQ1N0cmluZygpLGVycm9yRmllbGRTZXQuaGFzKFByb3RvY29sLk5ldHdvcmsuU2lnbmVkRXhjaGFuZ2VFcnJvckZpZWxkLlNpZ25hdHVyZVRpbWVzdGFtcHMpKTtzaWduYXR1cmVDYXRlZ29yeS5jcmVhdGVMZWFmKCkudGl0bGU9dGhpcy5fZm9ybWF0SGVhZGVyKENvbW1vbi5VSVN0cmluZygnRXhwaXJlcycpLG5ldyBEYXRlKDEwMDAqc2lnbmF0dXJlLmV4cGlyZXMpLnRvVVRDU3RyaW5nKCksZXJyb3JGaWVsZFNldC5oYXMoUHJvdG9jb2wuTmV0d29yay5TaWduZWRFeGNoYW5nZUVycm9yRmllbGQuU2lnbmF0dXJlVGltZXN0YW1wcykpO319CmlmKHNpZ25lZEV4Y2hhbmdlSW5mby5zZWN1cml0eURldGFpbHMpe2NvbnN0IHNlY3VyaXR5RGV0YWlscz1zaWduZWRFeGNoYW5nZUluZm8uc2VjdXJpdHlEZXRhaWxzO2NvbnN0IHNlY3VyaXR5Q2F0ZWdvcnk9bmV3IE5ldHdvcmsuU2lnbmVkRXhjaGFuZ2VJbmZvVmlldy5DYXRlZ29yeShyb290LENvbW1vbi5VSVN0cmluZygnQ2VydGlmaWNhdGUnKSk7c2VjdXJpdHlDYXRlZ29yeS5jcmVhdGVMZWFmKHRoaXMuX2Zvcm1hdEhlYWRlcihDb21tb24uVUlTdHJpbmcoJ1N1YmplY3QnKSxzZWN1cml0eURldGFpbHMuc3ViamVjdE5hbWUpKTtzZWN1cml0eUNhdGVnb3J5LmNyZWF0ZUxlYWYodGhpcy5fZm9ybWF0SGVhZGVyKENvbW1vbi5VSVN0cmluZygnVmFsaWQgZnJvbScpLG5ldyBEYXRlKDEwMDAqc2VjdXJpdHlEZXRhaWxzLnZhbGlkRnJvbSkudG9VVENTdHJpbmcoKSkpO3NlY3VyaXR5Q2F0ZWdvcnkuY3JlYXRlTGVhZih0aGlzLl9mb3JtYXRIZWFkZXIoQ29tbW9uLlVJU3RyaW5nKCdWYWxpZCB1bnRpbCcpLG5ldyBEYXRlKDEwMDAqc2VjdXJpdHlEZXRhaWxzLnZhbGlkVG8pLnRvVVRDU3RyaW5nKCkpKTtzZWN1cml0eUNhdGVnb3J5LmNyZWF0ZUxlYWYodGhpcy5fZm9ybWF0SGVhZGVyKENvbW1vbi5VSVN0cmluZygnSXNzdWVyJyksc2VjdXJpdHlEZXRhaWxzLmlzc3VlcikpO319Cl9mb3JtYXRIZWFkZXIobmFtZSx2YWx1ZSxoaWdobGlnaHRlZCl7Y29uc3QgZnJhZ21lbnQ9Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2NvbnN0IG5hbWVFbGVtZW50PWZyYWdtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFkZXItbmFtZScpO25hbWVFbGVtZW50LnRleHRDb250ZW50PW5hbWUrJzogJztmcmFnbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2hlYWRlci1zZXBhcmF0b3InKTtjb25zdCB2YWx1ZUVsZW1lbnQ9ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYWRlci12YWx1ZSBzb3VyY2UtY29kZScpO3ZhbHVlRWxlbWVudC50ZXh0Q29udGVudD12YWx1ZTtpZihoaWdobGlnaHRlZCl7bmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZXJyb3ItZmllbGQnKTt2YWx1ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZXJyb3ItZmllbGQnKTt9CnJldHVybiBmcmFnbWVudDt9Cl9mb3JtYXRIZWFkZXJGb3JIZXhEYXRhKG5hbWUsdmFsdWUsaGlnaGxpZ2h0ZWQpe2NvbnN0IGZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjb25zdCBuYW1lRWxlbWVudD1mcmFnbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaGVhZGVyLW5hbWUnKTtuYW1lRWxlbWVudC50ZXh0Q29udGVudD1uYW1lKyc6ICc7ZnJhZ21lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdoZWFkZXItc2VwYXJhdG9yJyk7Y29uc3QgdmFsdWVFbGVtZW50PWZyYWdtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFkZXItdmFsdWUgc291cmNlLWNvZGUgaGV4LWRhdGEnKTt2YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQ9dmFsdWUucmVwbGFjZSgvKC57Mn0pL2csJyQxICcpO2lmKGhpZ2hsaWdodGVkKXtuYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlcnJvci1maWVsZCcpO3ZhbHVlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlcnJvci1maWVsZCcpO30KcmV0dXJuIGZyYWdtZW50O319O05ldHdvcmsuU2lnbmVkRXhjaGFuZ2VJbmZvVmlldy5DYXRlZ29yeT1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHJvb3QsdGl0bGUpe3N1cGVyKHRpdGxlLHRydWUpO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt0aGlzLmV4cGFuZGVkPXRydWU7cm9vdC5hcHBlbmRDaGlsZCh0aGlzKTt9CmNyZWF0ZUxlYWYodGl0bGUpe2NvbnN0IGxlYWY9bmV3IFVJLlRyZWVFbGVtZW50KHRpdGxlKTtsZWFmLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5hcHBlbmRDaGlsZChsZWFmKTtyZXR1cm4gbGVhZjt9fTs7TmV0d29yay5OZXR3b3JrUGFuZWw9Y2xhc3MgZXh0ZW5kcyBVSS5QYW5lbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCduZXR3b3JrJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCduZXR3b3JrL25ldHdvcmtQYW5lbC5jc3MnKTt0aGlzLl9uZXR3b3JrTG9nU2hvd092ZXJ2aWV3U2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya0xvZ1Nob3dPdmVydmlldycsdHJ1ZSk7dGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ25ldHdvcmtMb2dMYXJnZVJvd3MnLGZhbHNlKTt0aGlzLl9uZXR3b3JrUmVjb3JkRmlsbVN0cmlwU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbmV0d29ya1JlY29yZEZpbG1TdHJpcFNldHRpbmcnLGZhbHNlKTt0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignbmV0d29yay50b2dnbGUtcmVjb3JkaW5nJykpO3RoaXMuX3BlbmRpbmdTdG9wVGltZXI7dGhpcy5fbmV0d29ya0l0ZW1WaWV3PW51bGw7dGhpcy5fZmlsbVN0cmlwVmlldz1udWxsO3RoaXMuX2ZpbG1TdHJpcFJlY29yZGVyPW51bGw7Y29uc3QgcGFuZWw9bmV3IFVJLlZCb3goKTt0aGlzLl9wYW5lbFRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJycscGFuZWwuY29udGVudEVsZW1lbnQpO3RoaXMuX2ZpbHRlckJhcj1uZXcgVUkuRmlsdGVyQmFyKCduZXR3b3JrUGFuZWwnLHRydWUpO3RoaXMuX2ZpbHRlckJhci5zaG93KHBhbmVsLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9maWxtU3RyaXBQbGFjZWhvbGRlckVsZW1lbnQ9cGFuZWwuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ25ldHdvcmstZmlsbS1zdHJpcC1wbGFjZWhvbGRlcicpO3RoaXMuX292ZXJ2aWV3UGFuZT1uZXcgUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lKCduZXR3b3JrJyk7dGhpcy5fb3ZlcnZpZXdQYW5lLmFkZEV2ZW50TGlzdGVuZXIoUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl9vdmVydmlld1BhbmUuZWxlbWVudC5pZD0nbmV0d29yay1vdmVydmlldy1wYW5lbCc7dGhpcy5fbmV0d29ya092ZXJ2aWV3PW5ldyBOZXR3b3JrLk5ldHdvcmtPdmVydmlldygpO3RoaXMuX292ZXJ2aWV3UGFuZS5zZXRPdmVydmlld0NvbnRyb2xzKFt0aGlzLl9uZXR3b3JrT3ZlcnZpZXddKTt0aGlzLl9vdmVydmlld1BsYWNlaG9sZGVyRWxlbWVudD1wYW5lbC5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fY2FsY3VsYXRvcj1uZXcgTmV0d29yay5OZXR3b3JrVHJhbnNmZXJUaW1lQ2FsY3VsYXRvcigpO3RoaXMuX3NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLGZhbHNlLCduZXR3b3JrUGFuZWxTcGxpdFZpZXdTdGF0ZScpO3RoaXMuX3NwbGl0V2lkZ2V0LmhpZGVNYWluKCk7dGhpcy5fc3BsaXRXaWRnZXQuc2hvdyhwYW5lbC5jb250ZW50RWxlbWVudCk7cGFuZWwuc2V0RGVmYXVsdEZvY3VzZWRDaGlsZCh0aGlzLl9maWx0ZXJCYXIpO2NvbnN0IGluaXRpYWxTaWRlYmFyV2lkdGg9MjI1O2NvbnN0IHNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLGZhbHNlLCduZXR3b3JrUGFuZWxTaWRlYmFyU3RhdGUnLGluaXRpYWxTaWRlYmFyV2lkdGgpO3NwbGl0V2lkZ2V0LmhpZGVTaWRlYmFyKCk7c3BsaXRXaWRnZXQuZW5hYmxlU2hvd01vZGVTYXZpbmcoKTtzcGxpdFdpZGdldC5lbGVtZW50LnRhYkluZGV4PTA7c3BsaXRXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX3NpZGViYXJMb2NhdGlvbj1VSS52aWV3TWFuYWdlci5jcmVhdGVUYWJiZWRMb2NhdGlvbihhc3luYygpPT57VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsnKTtzcGxpdFdpZGdldC5zaG93Qm90aCgpO30sJ25ldHdvcmstc2lkZWJhcicsdHJ1ZSk7Y29uc3QgdGFiYmVkUGFuZT10aGlzLl9zaWRlYmFyTG9jYXRpb24udGFiYmVkUGFuZSgpO3RhYmJlZFBhbmUuc2V0TWluaW11bVNpemUoMTAwLDI1KTt0YWJiZWRQYW5lLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbmV0d29yay10YWJiZWQtcGFuZScpO3RhYmJlZFBhbmUuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxldmVudD0+e2lmKGV2ZW50LmtleSE9PSdFc2NhcGUnKQpyZXR1cm47c3BsaXRXaWRnZXQuaGlkZVNpZGViYXIoKTtldmVudC5jb25zdW1lKCk7fSk7Y29uc3QgY2xvc2VTaWRlYmFyPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xvc2UnKSwnbGFyZ2VpY29uLWRlbGV0ZScpO2Nsb3NlU2lkZWJhci5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT5zcGxpdFdpZGdldC5oaWRlU2lkZWJhcigpKTt0YWJiZWRQYW5lLnJpZ2h0VG9vbGJhcigpLmFwcGVuZFRvb2xiYXJJdGVtKGNsb3NlU2lkZWJhcik7c3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0YWJiZWRQYW5lKTtzcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHBhbmVsKTtzcGxpdFdpZGdldC5zZXREZWZhdWx0Rm9jdXNlZENoaWxkKHBhbmVsKTt0aGlzLnNldERlZmF1bHRGb2N1c2VkQ2hpbGQoc3BsaXRXaWRnZXQpO3RoaXMuX3Byb2dyZXNzQmFyQ29udGFpbmVyPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuX25ldHdvcmtMb2dWaWV3PW5ldyBOZXR3b3JrLk5ldHdvcmtMb2dWaWV3KHRoaXMuX2ZpbHRlckJhcix0aGlzLl9wcm9ncmVzc0JhckNvbnRhaW5lcix0aGlzLl9uZXR3b3JrTG9nTGFyZ2VSb3dzU2V0dGluZyk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9uZXR3b3JrTG9nVmlldyk7dGhpcy5fZGV0YWlsc1dpZGdldD1uZXcgVUkuVkJveCgpO3RoaXMuX2RldGFpbHNXaWRnZXQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCduZXR3b3JrLWRldGFpbHMtdmlldycpO3RoaXMuX3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fZGV0YWlsc1dpZGdldCk7dGhpcy5fY2xvc2VCdXR0b25FbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicsJ2R0LWNsb3NlLWJ1dHRvbicpO3RoaXMuX2Nsb3NlQnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fc2hvd1JlcXVlc3QuYmluZCh0aGlzLG51bGwpLGZhbHNlKTt0aGlzLl9jbG9zZUJ1dHRvbkVsZW1lbnQuc3R5bGUubWFyZ2luPScwIDVweCc7dGhpcy5fbmV0d29ya0xvZ1Nob3dPdmVydmlld1NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdG9nZ2xlU2hvd092ZXJ2aWV3LHRoaXMpO3RoaXMuX25ldHdvcmtMb2dMYXJnZVJvd3NTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3RvZ2dsZUxhcmdlclJlcXVlc3RzLHRoaXMpO3RoaXMuX25ldHdvcmtSZWNvcmRGaWxtU3RyaXBTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3RvZ2dsZVJlY29yZEZpbG1TdHJpcCx0aGlzKTt0aGlzLl9wcmVzZXJ2ZUxvZ1NldHRpbmc9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ25ldHdvcmtfbG9nLnByZXNlcnZlLWxvZycpO3RoaXMuX29mZmxpbmVDaGVja2JveD1Nb2JpbGVUaHJvdHRsaW5nLnRocm90dGxpbmdNYW5hZ2VyKCkuY3JlYXRlT2ZmbGluZVRvb2xiYXJDaGVja2JveCgpO3RoaXMuX3Rocm90dGxpbmdTZWxlY3Q9dGhpcy5fY3JlYXRlVGhyb3R0bGluZ0NvbmRpdGlvbnNTZWxlY3QoKTt0aGlzLl9zZXR1cFRvb2xiYXJCdXR0b25zKHNwbGl0V2lkZ2V0KTt0aGlzLl90b2dnbGVSZWNvcmQodHJ1ZSk7dGhpcy5fdG9nZ2xlU2hvd092ZXJ2aWV3KCk7dGhpcy5fdG9nZ2xlTGFyZ2VyUmVxdWVzdHMoKTt0aGlzLl90b2dnbGVSZWNvcmRGaWxtU3RyaXAoKTt0aGlzLl91cGRhdGVVSSgpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuV2lsbFJlbG9hZFBhZ2UsdGhpcy5fd2lsbFJlbG9hZFBhZ2UsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwsU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5Mb2FkLHRoaXMuX2xvYWQsdGhpcyk7dGhpcy5fbmV0d29ya0xvZ1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkV2ZW50cy5SZXF1ZXN0U2VsZWN0ZWQsdGhpcy5fb25SZXF1ZXN0U2VsZWN0ZWQsdGhpcyk7QnJvd3NlclNESy5uZXR3b3JrTG9nLmFkZEV2ZW50TGlzdGVuZXIoQnJvd3NlclNESy5OZXR3b3JrTG9nLkV2ZW50cy5SZXF1ZXN0QWRkZWQsdGhpcy5fb25VcGRhdGVSZXF1ZXN0LHRoaXMpO0Jyb3dzZXJTREsubmV0d29ya0xvZy5hZGRFdmVudExpc3RlbmVyKEJyb3dzZXJTREsuTmV0d29ya0xvZy5FdmVudHMuUmVxdWVzdFVwZGF0ZWQsdGhpcy5fb25VcGRhdGVSZXF1ZXN0LHRoaXMpO0Jyb3dzZXJTREsubmV0d29ya0xvZy5hZGRFdmVudExpc3RlbmVyKEJyb3dzZXJTREsuTmV0d29ya0xvZy5FdmVudHMuUmVzZXQsdGhpcy5fb25OZXR3b3JrTG9nUmVzZXQsdGhpcyk7fQpzdGF0aWMgcmV2ZWFsQW5kRmlsdGVyKGZpbHRlcnMpe2NvbnN0IHBhbmVsPU5ldHdvcmsuTmV0d29ya1BhbmVsLl9pbnN0YW5jZSgpO2xldCBmaWx0ZXJTdHJpbmc9Jyc7Zm9yKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJzKQpmaWx0ZXJTdHJpbmcrPWAke2ZpbHRlci5maWx0ZXJUeXBlfToke2ZpbHRlci5maWx0ZXJWYWx1ZX0gYDtwYW5lbC5fbmV0d29ya0xvZ1ZpZXcuc2V0VGV4dEZpbHRlclZhbHVlKGZpbHRlclN0cmluZyk7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsnKTt9CnN0YXRpYyBfaW5zdGFuY2UoKXtyZXR1cm4oc2VsZi5ydW50aW1lLnNoYXJlZEluc3RhbmNlKE5ldHdvcmsuTmV0d29ya1BhbmVsKSk7fQpvZmZsaW5lQ2hlY2tib3hGb3JUZXN0KCl7cmV0dXJuIHRoaXMuX29mZmxpbmVDaGVja2JveDt9CnRocm90dGxpbmdTZWxlY3RGb3JUZXN0KCl7cmV0dXJuIHRoaXMuX3Rocm90dGxpbmdTZWxlY3Q7fQpfb25XaW5kb3dDaGFuZ2VkKGV2ZW50KXtjb25zdCBzdGFydFRpbWU9TWF0aC5tYXgodGhpcy5fY2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKSxldmVudC5kYXRhLnN0YXJ0VGltZS8xMDAwKTtjb25zdCBlbmRUaW1lPU1hdGgubWluKHRoaXMuX2NhbGN1bGF0b3IubWF4aW11bUJvdW5kYXJ5KCksZXZlbnQuZGF0YS5lbmRUaW1lLzEwMDApO3RoaXMuX25ldHdvcmtMb2dWaWV3LnNldFdpbmRvdyhzdGFydFRpbWUsZW5kVGltZSk7fQpfc2V0dXBUb29sYmFyQnV0dG9ucyhzcGxpdFdpZGdldCl7Y29uc3Qgc2VhcmNoVG9nZ2xlPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKCdTZWFyY2gnLCdsYXJnZWljb24tc2VhcmNoJyk7ZnVuY3Rpb24gdXBkYXRlU2lkZWJhclRvZ2dsZSgpe3NlYXJjaFRvZ2dsZS5zZXRUb2dnbGVkKHNwbGl0V2lkZ2V0LnNob3dNb2RlKCkhPT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5TWFpbik7fQp0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uKSk7Y29uc3QgY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhcicpLCdsYXJnZWljb24tY2xlYXInKTtjbGVhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT5Ccm93c2VyU0RLLm5ldHdvcmtMb2cucmVzZXQoKSx0aGlzKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oY2xlYXJCdXR0b24pO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTtjb25zdCByZWNvcmRGaWxtU3RyaXBCdXR0b249bmV3IFVJLlRvb2xiYXJTZXR0aW5nVG9nZ2xlKHRoaXMuX25ldHdvcmtSZWNvcmRGaWxtU3RyaXBTZXR0aW5nLCdsYXJnZWljb24tY2FtZXJhJyxDb21tb24uVUlTdHJpbmcoJ0NhcHR1cmUgc2NyZWVuc2hvdHMnKSk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHJlY29yZEZpbG1TdHJpcEJ1dHRvbik7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2ZpbHRlckJhci5maWx0ZXJCdXR0b24oKSk7dXBkYXRlU2lkZWJhclRvZ2dsZSgpO3NwbGl0V2lkZ2V0LmFkZEV2ZW50TGlzdGVuZXIoVUkuU3BsaXRXaWRnZXQuRXZlbnRzLlNob3dNb2RlQ2hhbmdlZCx1cGRhdGVTaWRlYmFyVG9nZ2xlKTtzZWFyY2hUb2dnbGUuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+e2lmKHNwbGl0V2lkZ2V0LnNob3dNb2RlKCk9PT1VSS5TcGxpdFdpZGdldC5TaG93TW9kZS5Pbmx5TWFpbikKc3BsaXRXaWRnZXQuc2hvd0JvdGgoKTtlbHNlCnNwbGl0V2lkZ2V0LmhpZGVTaWRlYmFyKCk7fSk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHNlYXJjaFRvZ2dsZSk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUZXh0KENvbW1vbi5VSVN0cmluZygnVmlldzonKSk7Y29uc3QgbGFyZ2VyUmVxdWVzdHNCdXR0b249bmV3IFVJLlRvb2xiYXJTZXR0aW5nVG9nZ2xlKHRoaXMuX25ldHdvcmtMb2dMYXJnZVJvd3NTZXR0aW5nLCdsYXJnZWljb24tbGFyZ2UtbGlzdCcsQ29tbW9uLlVJU3RyaW5nKCdVc2UgbGFyZ2UgcmVxdWVzdCByb3dzJyksQ29tbW9uLlVJU3RyaW5nKCdVc2Ugc21hbGwgcmVxdWVzdCByb3dzJykpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShsYXJnZXJSZXF1ZXN0c0J1dHRvbik7Y29uc3Qgc2hvd092ZXJ2aWV3QnV0dG9uPW5ldyBVSS5Ub29sYmFyU2V0dGluZ1RvZ2dsZSh0aGlzLl9uZXR3b3JrTG9nU2hvd092ZXJ2aWV3U2V0dGluZywnbGFyZ2VpY29uLXdhdGVyZmFsbCcsQ29tbW9uLlVJU3RyaW5nKCdTaG93IG92ZXJ2aWV3JyksQ29tbW9uLlVJU3RyaW5nKCdIaWRlIG92ZXJ2aWV3JykpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShzaG93T3ZlcnZpZXdCdXR0b24pO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveChDb21tb24ubW9kdWxlU2V0dGluZygnbmV0d29yay5ncm91cC1ieS1mcmFtZScpLCcnLENvbW1vbi5VSVN0cmluZygnR3JvdXAgYnkgZnJhbWUnKSkpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3godGhpcy5fcHJlc2VydmVMb2dTZXR0aW5nLENvbW1vbi5VSVN0cmluZygnRG8gbm90IGNsZWFyIGxvZyBvbiBwYWdlIHJlbG9hZCAvIG5hdmlnYXRpb24nKSxDb21tb24uVUlTdHJpbmcoJ1ByZXNlcnZlIGxvZycpKSk7Y29uc3QgZGlzYWJsZUNhY2hlQ2hlY2tib3g9bmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3goQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2NhY2hlRGlzYWJsZWQnKSxDb21tb24uVUlTdHJpbmcoJ0Rpc2FibGUgY2FjaGUgKHdoaWxlIERldlRvb2xzIGlzIG9wZW4pJyksQ29tbW9uLlVJU3RyaW5nKCdEaXNhYmxlIGNhY2hlJykpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShkaXNhYmxlQ2FjaGVDaGVja2JveCk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9vZmZsaW5lQ2hlY2tib3gpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl90aHJvdHRsaW5nU2VsZWN0KTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJJdGVtKHRoaXMuX3Byb2dyZXNzQmFyQ29udGFpbmVyKSk7fQpfY3JlYXRlVGhyb3R0bGluZ0NvbmRpdGlvbnNTZWxlY3QoKXtjb25zdCB0b29sYmFySXRlbT1uZXcgVUkuVG9vbGJhckNvbWJvQm94KG51bGwpO3Rvb2xiYXJJdGVtLnNldFRpdGxlKGxzYFRocm90dGxpbmdgKTt0b29sYmFySXRlbS5zZXRNYXhXaWR0aCgxNjApO01vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5kZWNvcmF0ZVNlbGVjdFdpdGhOZXR3b3JrVGhyb3R0bGluZyh0b29sYmFySXRlbS5zZWxlY3RFbGVtZW50KCkpO3JldHVybiB0b29sYmFySXRlbTt9Cl90b2dnbGVSZWNvcmRpbmcoKXtpZighdGhpcy5fcHJlc2VydmVMb2dTZXR0aW5nLmdldCgpJiYhdGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnRvZ2dsZWQoKSkKQnJvd3NlclNESy5uZXR3b3JrTG9nLnJlc2V0KCk7dGhpcy5fdG9nZ2xlUmVjb3JkKCF0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb24udG9nZ2xlZCgpKTt9Cl90b2dnbGVSZWNvcmQodG9nZ2xlZCl7dGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnNldFRvZ2dsZWQodG9nZ2xlZCk7dGhpcy5fbmV0d29ya0xvZ1ZpZXcuc2V0UmVjb3JkaW5nKHRvZ2dsZWQpO2lmKCF0b2dnbGVkJiZ0aGlzLl9maWxtU3RyaXBSZWNvcmRlcikKdGhpcy5fZmlsbVN0cmlwUmVjb3JkZXIuc3RvcFJlY29yZGluZyh0aGlzLl9maWxtU3RyaXBBdmFpbGFibGUuYmluZCh0aGlzKSk7QnJvd3NlclNESy5uZXR3b3JrTG9nLnNldElzUmVjb3JkaW5nKHRvZ2dsZWQpO30KX2ZpbG1TdHJpcEF2YWlsYWJsZShmaWxtU3RyaXBNb2RlbCl7aWYoIWZpbG1TdHJpcE1vZGVsKQpyZXR1cm47Y29uc3QgY2FsY3VsYXRvcj10aGlzLl9uZXR3b3JrTG9nVmlldy50aW1lQ2FsY3VsYXRvcigpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuc2V0TW9kZWwoZmlsbVN0cmlwTW9kZWwsY2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKSoxMDAwLGNhbGN1bGF0b3IuYm91bmRhcnlTcGFuKCkqMTAwMCk7dGhpcy5fbmV0d29ya092ZXJ2aWV3LnNldEZpbG1TdHJpcE1vZGVsKGZpbG1TdHJpcE1vZGVsKTtjb25zdCB0aW1lc3RhbXBzPWZpbG1TdHJpcE1vZGVsLmZyYW1lcygpLm1hcChtYXBUaW1lc3RhbXApO2Z1bmN0aW9uIG1hcFRpbWVzdGFtcChmcmFtZSl7cmV0dXJuIGZyYW1lLnRpbWVzdGFtcC8xMDAwO30KdGhpcy5fbmV0d29ya0xvZ1ZpZXcuYWRkRmlsbVN0cmlwRnJhbWVzKHRpbWVzdGFtcHMpO30KX29uTmV0d29ya0xvZ1Jlc2V0KCl7TmV0d29yay5CbG9ja2VkVVJMc1BhbmUucmVzZXQoKTtpZighdGhpcy5fcHJlc2VydmVMb2dTZXR0aW5nLmdldCgpKXt0aGlzLl9jYWxjdWxhdG9yLnJlc2V0KCk7dGhpcy5fb3ZlcnZpZXdQYW5lLnJlc2V0KCk7fQppZih0aGlzLl9maWxtU3RyaXBWaWV3KQp0aGlzLl9yZXNldEZpbG1TdHJpcFZpZXcoKTt9Cl93aWxsUmVsb2FkUGFnZShldmVudCl7dGhpcy5fdG9nZ2xlUmVjb3JkKHRydWUpO2lmKHRoaXMuX3BlbmRpbmdTdG9wVGltZXIpe2NsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nU3RvcFRpbWVyKTtkZWxldGUgdGhpcy5fcGVuZGluZ1N0b3BUaW1lcjt9CmlmKHRoaXMuaXNTaG93aW5nKCkmJnRoaXMuX2ZpbG1TdHJpcFJlY29yZGVyKQp0aGlzLl9maWxtU3RyaXBSZWNvcmRlci5zdGFydFJlY29yZGluZygpO30KX2xvYWQoZXZlbnQpe2lmKHRoaXMuX2ZpbG1TdHJpcFJlY29yZGVyJiZ0aGlzLl9maWxtU3RyaXBSZWNvcmRlci5pc1JlY29yZGluZygpKXt0aGlzLl9wZW5kaW5nU3RvcFRpbWVyPXNldFRpbWVvdXQodGhpcy5fc3RvcEZpbG1TdHJpcFJlY29yZGluZy5iaW5kKHRoaXMpLE5ldHdvcmsuTmV0d29ya1BhbmVsLmRpc3BsYXlTY3JlZW5zaG90RGVsYXkpO319Cl9zdG9wRmlsbVN0cmlwUmVjb3JkaW5nKCl7dGhpcy5fZmlsbVN0cmlwUmVjb3JkZXIuc3RvcFJlY29yZGluZyh0aGlzLl9maWxtU3RyaXBBdmFpbGFibGUuYmluZCh0aGlzKSk7ZGVsZXRlIHRoaXMuX3BlbmRpbmdTdG9wVGltZXI7fQpfdG9nZ2xlTGFyZ2VyUmVxdWVzdHMoKXt0aGlzLl91cGRhdGVVSSgpO30KX3RvZ2dsZVNob3dPdmVydmlldygpe2NvbnN0IHRvZ2dsZWQ9dGhpcy5fbmV0d29ya0xvZ1Nob3dPdmVydmlld1NldHRpbmcuZ2V0KCk7aWYodG9nZ2xlZCkKdGhpcy5fb3ZlcnZpZXdQYW5lLnNob3codGhpcy5fb3ZlcnZpZXdQbGFjZWhvbGRlckVsZW1lbnQpO2Vsc2UKdGhpcy5fb3ZlcnZpZXdQYW5lLmRldGFjaCgpO3RoaXMuZG9SZXNpemUoKTt9Cl90b2dnbGVSZWNvcmRGaWxtU3RyaXAoKXtjb25zdCB0b2dnbGVkPXRoaXMuX25ldHdvcmtSZWNvcmRGaWxtU3RyaXBTZXR0aW5nLmdldCgpO2lmKHRvZ2dsZWQmJiF0aGlzLl9maWxtU3RyaXBSZWNvcmRlcil7dGhpcy5fZmlsbVN0cmlwVmlldz1uZXcgUGVyZlVJLkZpbG1TdHJpcFZpZXcoKTt0aGlzLl9maWxtU3RyaXBWaWV3LnNldE1vZGUoUGVyZlVJLkZpbG1TdHJpcFZpZXcuTW9kZXMuRnJhbWVCYXNlZCk7dGhpcy5fZmlsbVN0cmlwVmlldy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25ldHdvcmstZmlsbS1zdHJpcCcpO3RoaXMuX2ZpbG1TdHJpcFJlY29yZGVyPW5ldyBOZXR3b3JrLk5ldHdvcmtQYW5lbC5GaWxtU3RyaXBSZWNvcmRlcih0aGlzLl9uZXR3b3JrTG9nVmlldy50aW1lQ2FsY3VsYXRvcigpLHRoaXMuX2ZpbG1TdHJpcFZpZXcpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuc2hvdyh0aGlzLl9maWxtU3RyaXBQbGFjZWhvbGRlckVsZW1lbnQpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuRmlsbVN0cmlwVmlldy5FdmVudHMuRnJhbWVTZWxlY3RlZCx0aGlzLl9vbkZpbG1GcmFtZVNlbGVjdGVkLHRoaXMpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuRmlsbVN0cmlwVmlldy5FdmVudHMuRnJhbWVFbnRlcix0aGlzLl9vbkZpbG1GcmFtZUVudGVyLHRoaXMpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuRmlsbVN0cmlwVmlldy5FdmVudHMuRnJhbWVFeGl0LHRoaXMuX29uRmlsbUZyYW1lRXhpdCx0aGlzKTt0aGlzLl9yZXNldEZpbG1TdHJpcFZpZXcoKTt9CmlmKCF0b2dnbGVkJiZ0aGlzLl9maWxtU3RyaXBSZWNvcmRlcil7dGhpcy5fZmlsbVN0cmlwVmlldy5kZXRhY2goKTt0aGlzLl9maWxtU3RyaXBWaWV3PW51bGw7dGhpcy5fZmlsbVN0cmlwUmVjb3JkZXI9bnVsbDt9fQpfcmVzZXRGaWxtU3RyaXBWaWV3KCl7dGhpcy5fZmlsbVN0cmlwVmlldy5yZXNldCgpO3RoaXMuX2ZpbG1TdHJpcFZpZXcuc2V0U3RhdHVzVGV4dChDb21tb24uVUlTdHJpbmcoJ0hpdCAlcyB0byByZWxvYWQgYW5kIGNhcHR1cmUgZmlsbXN0cmlwLicsVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCdpbnNwZWN0b3JfbWFpbi5yZWxvYWQnKVswXS5uYW1lKSk7fQplbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0Zvcigpe3JldHVybiB0aGlzLl9uZXR3b3JrTG9nVmlldy5lbGVtZW50c1RvUmVzdG9yZVNjcm9sbFBvc2l0aW9uc0ZvcigpO30Kd2FzU2hvd24oKXtVSS5jb250ZXh0LnNldEZsYXZvcihOZXR3b3JrLk5ldHdvcmtQYW5lbCx0aGlzKTt9CndpbGxIaWRlKCl7VUkuY29udGV4dC5zZXRGbGF2b3IoTmV0d29yay5OZXR3b3JrUGFuZWwsbnVsbCk7fQpyZXZlYWxBbmRIaWdobGlnaHRSZXF1ZXN0KHJlcXVlc3Qpe3RoaXMuX3Nob3dSZXF1ZXN0KG51bGwpO2lmKHJlcXVlc3QpCnRoaXMuX25ldHdvcmtMb2dWaWV3LnJldmVhbEFuZEhpZ2hsaWdodFJlcXVlc3QocmVxdWVzdCk7fQphc3luYyBzZWxlY3RSZXF1ZXN0KHJlcXVlc3Qpe2F3YWl0IFVJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KCduZXR3b3JrJyk7dGhpcy5fbmV0d29ya0xvZ1ZpZXcuc2VsZWN0UmVxdWVzdChyZXF1ZXN0KTtyZXR1cm4gdGhpcy5fbmV0d29ya0l0ZW1WaWV3O30KX29uUm93U2l6ZUNoYW5nZWQoZXZlbnQpe3RoaXMuX3VwZGF0ZVVJKCk7fQpfb25SZXF1ZXN0U2VsZWN0ZWQoZXZlbnQpe2NvbnN0IHJlcXVlc3Q9KGV2ZW50LmRhdGEpO3RoaXMuX3Nob3dSZXF1ZXN0KHJlcXVlc3QpO30KX3Nob3dSZXF1ZXN0KHJlcXVlc3Qpe2lmKHRoaXMuX25ldHdvcmtJdGVtVmlldyl7dGhpcy5fbmV0d29ya0l0ZW1WaWV3LmRldGFjaCgpO3RoaXMuX25ldHdvcmtJdGVtVmlldz1udWxsO30KaWYocmVxdWVzdCl7dGhpcy5fbmV0d29ya0l0ZW1WaWV3PW5ldyBOZXR3b3JrLk5ldHdvcmtJdGVtVmlldyhyZXF1ZXN0LHRoaXMuX25ldHdvcmtMb2dWaWV3LnRpbWVDYWxjdWxhdG9yKCkpO3RoaXMuX25ldHdvcmtJdGVtVmlldy5sZWZ0VG9vbGJhcigpLmFwcGVuZFRvb2xiYXJJdGVtKG5ldyBVSS5Ub29sYmFySXRlbSh0aGlzLl9jbG9zZUJ1dHRvbkVsZW1lbnQpKTt0aGlzLl9uZXR3b3JrSXRlbVZpZXcuc2hvdyh0aGlzLl9kZXRhaWxzV2lkZ2V0LmVsZW1lbnQpO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3dCb3RoKCk7fWVsc2V7dGhpcy5fc3BsaXRXaWRnZXQuaGlkZU1haW4oKTt0aGlzLl9uZXR3b3JrTG9nVmlldy5jbGVhclNlbGVjdGlvbigpO30KdGhpcy5fdXBkYXRlVUkoKTt9Cl91cGRhdGVVSSgpe3RoaXMuX2RldGFpbHNXaWRnZXQuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCduZXR3b3JrLWRldGFpbHMtdmlldy10YWxsLWhlYWRlcicsdGhpcy5fbmV0d29ya0xvZ0xhcmdlUm93c1NldHRpbmcuZ2V0KCkpO3RoaXMuX25ldHdvcmtMb2dWaWV3LnN3aXRjaFZpZXdNb2RlKCF0aGlzLl9zcGxpdFdpZGdldC5pc1Jlc2l6YWJsZSgpKTt9CmFwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpe2Z1bmN0aW9uIHJldmVhbChyZXF1ZXN0KXtVSS52aWV3TWFuYWdlci5zaG93VmlldygnbmV0d29yaycpLnRoZW4odGhpcy5yZXZlYWxBbmRIaWdobGlnaHRSZXF1ZXN0LmJpbmQodGhpcyxyZXF1ZXN0KSk7fQpmdW5jdGlvbiBhcHBlbmRSZXZlYWxJdGVtKHJlcXVlc3Qpe2NvbnRleHRNZW51LnJldmVhbFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmV2ZWFsIGluIE5ldHdvcmsgcGFuZWwnKSxyZXZlYWwuYmluZCh0aGlzLHJlcXVlc3QpKTt9CmlmKGV2ZW50LnRhcmdldC5pc1NlbGZPckRlc2NlbmRhbnQodGhpcy5lbGVtZW50KSkKcmV0dXJuO2lmKHRhcmdldCBpbnN0YW5jZW9mIFNESy5SZXNvdXJjZSl7Y29uc3QgcmVzb3VyY2U9KHRhcmdldCk7aWYocmVzb3VyY2UucmVxdWVzdCkKYXBwZW5kUmV2ZWFsSXRlbS5jYWxsKHRoaXMscmVzb3VyY2UucmVxdWVzdCk7cmV0dXJuO30KaWYodGFyZ2V0IGluc3RhbmNlb2YgV29ya3NwYWNlLlVJU291cmNlQ29kZSl7Y29uc3QgdWlTb3VyY2VDb2RlPSh0YXJnZXQpO2NvbnN0IHJlc291cmNlPUJpbmRpbmdzLnJlc291cmNlRm9yVVJMKHVpU291cmNlQ29kZS51cmwoKSk7aWYocmVzb3VyY2UmJnJlc291cmNlLnJlcXVlc3QpCmFwcGVuZFJldmVhbEl0ZW0uY2FsbCh0aGlzLHJlc291cmNlLnJlcXVlc3QpO3JldHVybjt9CmlmKCEodGFyZ2V0IGluc3RhbmNlb2YgU0RLLk5ldHdvcmtSZXF1ZXN0KSkKcmV0dXJuO2NvbnN0IHJlcXVlc3Q9KHRhcmdldCk7aWYodGhpcy5fbmV0d29ya0l0ZW1WaWV3JiZ0aGlzLl9uZXR3b3JrSXRlbVZpZXcuaXNTaG93aW5nKCkmJnRoaXMuX25ldHdvcmtJdGVtVmlldy5yZXF1ZXN0KCk9PT1yZXF1ZXN0KQpyZXR1cm47YXBwZW5kUmV2ZWFsSXRlbS5jYWxsKHRoaXMscmVxdWVzdCk7fQpfb25GaWxtRnJhbWVTZWxlY3RlZChldmVudCl7Y29uc3QgdGltZXN0YW1wPShldmVudC5kYXRhKTt0aGlzLl9vdmVydmlld1BhbmUuc2V0V2luZG93VGltZXMoMCx0aW1lc3RhbXApO30KX29uRmlsbUZyYW1lRW50ZXIoZXZlbnQpe2NvbnN0IHRpbWVzdGFtcD0oZXZlbnQuZGF0YSk7dGhpcy5fbmV0d29ya092ZXJ2aWV3LnNlbGVjdEZpbG1TdHJpcEZyYW1lKHRpbWVzdGFtcCk7dGhpcy5fbmV0d29ya0xvZ1ZpZXcuc2VsZWN0RmlsbVN0cmlwRnJhbWUodGltZXN0YW1wLzEwMDApO30KX29uRmlsbUZyYW1lRXhpdChldmVudCl7dGhpcy5fbmV0d29ya092ZXJ2aWV3LmNsZWFyRmlsbVN0cmlwRnJhbWUoKTt0aGlzLl9uZXR3b3JrTG9nVmlldy5jbGVhckZpbG1TdHJpcEZyYW1lKCk7fQpfb25VcGRhdGVSZXF1ZXN0KGV2ZW50KXtjb25zdCByZXF1ZXN0PShldmVudC5kYXRhKTt0aGlzLl9jYWxjdWxhdG9yLnVwZGF0ZUJvdW5kYXJpZXMocmVxdWVzdCk7dGhpcy5fb3ZlcnZpZXdQYW5lLnNldEJvdW5kcyh0aGlzLl9jYWxjdWxhdG9yLm1pbmltdW1Cb3VuZGFyeSgpKjEwMDAsdGhpcy5fY2FsY3VsYXRvci5tYXhpbXVtQm91bmRhcnkoKSoxMDAwKTt0aGlzLl9uZXR3b3JrT3ZlcnZpZXcudXBkYXRlUmVxdWVzdChyZXF1ZXN0KTt0aGlzLl9vdmVydmlld1BhbmUuc2NoZWR1bGVVcGRhdGUoKTt9CnJlc29sdmVMb2NhdGlvbihsb2NhdGlvbk5hbWUpe2lmKGxvY2F0aW9uTmFtZT09PSduZXR3b3JrLXNpZGViYXInKQpyZXR1cm4gdGhpcy5fc2lkZWJhckxvY2F0aW9uO3JldHVybiBudWxsO319O05ldHdvcmsuTmV0d29ya1BhbmVsLmRpc3BsYXlTY3JlZW5zaG90RGVsYXk9MTAwMDtOZXR3b3JrLk5ldHdvcmtQYW5lbC5Db250ZXh0TWVudVByb3ZpZGVyPWNsYXNze2FwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpe05ldHdvcmsuTmV0d29ya1BhbmVsLl9pbnN0YW5jZSgpLmFwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpO319O05ldHdvcmsuTmV0d29ya1BhbmVsLlJlcXVlc3RSZXZlYWxlcj1jbGFzc3tyZXZlYWwocmVxdWVzdCl7aWYoIShyZXF1ZXN0IGluc3RhbmNlb2YgU0RLLk5ldHdvcmtSZXF1ZXN0KSkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignSW50ZXJuYWwgZXJyb3I6IG5vdCBhIG5ldHdvcmsgcmVxdWVzdCcpKTtjb25zdCBwYW5lbD1OZXR3b3JrLk5ldHdvcmtQYW5lbC5faW5zdGFuY2UoKTtyZXR1cm4gVUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsnKS50aGVuKHBhbmVsLnJldmVhbEFuZEhpZ2hsaWdodFJlcXVlc3QuYmluZChwYW5lbCxyZXF1ZXN0KSk7fX07TmV0d29yay5OZXR3b3JrUGFuZWwuRmlsbVN0cmlwUmVjb3JkZXI9Y2xhc3N7Y29uc3RydWN0b3IodGltZUNhbGN1bGF0b3IsZmlsbVN0cmlwVmlldyl7dGhpcy5fdHJhY2luZ01hbmFnZXI9bnVsbDt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1udWxsO3RoaXMuX3RpbWVDYWxjdWxhdG9yPXRpbWVDYWxjdWxhdG9yO3RoaXMuX2ZpbG1TdHJpcFZpZXc9ZmlsbVN0cmlwVmlldzt0aGlzLl90cmFjaW5nTW9kZWw9bnVsbDt0aGlzLl9jYWxsYmFjaz1udWxsO30KdHJhY2VFdmVudHNDb2xsZWN0ZWQoZXZlbnRzKXtpZih0aGlzLl90cmFjaW5nTW9kZWwpCnRoaXMuX3RyYWNpbmdNb2RlbC5hZGRFdmVudHMoZXZlbnRzKTt9CnRyYWNpbmdDb21wbGV0ZSgpe2lmKCF0aGlzLl90cmFjaW5nTW9kZWx8fCF0aGlzLl90cmFjaW5nTWFuYWdlcikKcmV0dXJuO3RoaXMuX3RyYWNpbmdNb2RlbC50cmFjaW5nQ29tcGxldGUoKTt0aGlzLl90cmFjaW5nTWFuYWdlcj1udWxsO3RoaXMuX2NhbGxiYWNrKG5ldyBTREsuRmlsbVN0cmlwTW9kZWwodGhpcy5fdHJhY2luZ01vZGVsLHRoaXMuX3RpbWVDYWxjdWxhdG9yLm1pbmltdW1Cb3VuZGFyeSgpKjEwMDApKTt0aGlzLl9jYWxsYmFjaz1udWxsO2lmKHRoaXMuX3Jlc291cmNlVHJlZU1vZGVsKQp0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5yZXN1bWVSZWxvYWQoKTt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1udWxsO30KdHJhY2luZ0J1ZmZlclVzYWdlKCl7fQpldmVudHNSZXRyaWV2YWxQcm9ncmVzcyhwcm9ncmVzcyl7fQpzdGFydFJlY29yZGluZygpe3RoaXMuX2ZpbG1TdHJpcFZpZXcucmVzZXQoKTt0aGlzLl9maWxtU3RyaXBWaWV3LnNldFN0YXR1c1RleHQoQ29tbW9uLlVJU3RyaW5nKCdSZWNvcmRpbmcgZnJhbWVzLi4uJykpO2NvbnN0IHRyYWNpbmdNYW5hZ2Vycz1TREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLlRyYWNpbmdNYW5hZ2VyKTtpZih0aGlzLl90cmFjaW5nTWFuYWdlcnx8IXRyYWNpbmdNYW5hZ2Vycy5sZW5ndGgpCnJldHVybjt0aGlzLl90cmFjaW5nTWFuYWdlcj10cmFjaW5nTWFuYWdlcnNbMF07dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWw9dGhpcy5fdHJhY2luZ01hbmFnZXIudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZih0aGlzLl90cmFjaW5nTW9kZWwpCnRoaXMuX3RyYWNpbmdNb2RlbC5kaXNwb3NlKCk7dGhpcy5fdHJhY2luZ01vZGVsPW5ldyBTREsuVHJhY2luZ01vZGVsKG5ldyBCaW5kaW5ncy5UZW1wRmlsZUJhY2tpbmdTdG9yYWdlKCkpO3RoaXMuX3RyYWNpbmdNYW5hZ2VyLnN0YXJ0KHRoaXMsJy0qLGRpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMuc2NyZWVuc2hvdCcsJycpO30KaXNSZWNvcmRpbmcoKXtyZXR1cm4hIXRoaXMuX3RyYWNpbmdNYW5hZ2VyO30Kc3RvcFJlY29yZGluZyhjYWxsYmFjayl7aWYoIXRoaXMuX3RyYWNpbmdNYW5hZ2VyKQpyZXR1cm47dGhpcy5fdHJhY2luZ01hbmFnZXIuc3RvcCgpO2lmKHRoaXMuX3Jlc291cmNlVHJlZU1vZGVsKQp0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbC5zdXNwZW5kUmVsb2FkKCk7dGhpcy5fY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5fZmlsbVN0cmlwVmlldy5zZXRTdGF0dXNUZXh0KENvbW1vbi5VSVN0cmluZygnRmV0Y2hpbmcgZnJhbWVzLi4uJykpO319O05ldHdvcmsuTmV0d29ya1BhbmVsLkFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBwYW5lbD1VSS5jb250ZXh0LmZsYXZvcihOZXR3b3JrLk5ldHdvcmtQYW5lbCk7Y29uc29sZS5hc3NlcnQocGFuZWwmJnBhbmVsIGluc3RhbmNlb2YgTmV0d29yay5OZXR3b3JrUGFuZWwpO3N3aXRjaChhY3Rpb25JZCl7Y2FzZSduZXR3b3JrLnRvZ2dsZS1yZWNvcmRpbmcnOnBhbmVsLl90b2dnbGVSZWNvcmRpbmcoKTtyZXR1cm4gdHJ1ZTtjYXNlJ25ldHdvcmsuaGlkZS1yZXF1ZXN0LWRldGFpbHMnOmlmKCFwYW5lbC5fbmV0d29ya0l0ZW1WaWV3KQpyZXR1cm4gZmFsc2U7cGFuZWwuX3Nob3dSZXF1ZXN0KG51bGwpO3JldHVybiB0cnVlO2Nhc2UnbmV0d29yay5zZWFyY2gnOmNvbnN0IHNlbGVjdGlvbj1VSS5pbnNwZWN0b3JWaWV3LmVsZW1lbnQud2luZG93KCkuZ2V0U2VsZWN0aW9uKCk7bGV0IHF1ZXJ5Q2FuZGlkYXRlPScnO2lmKHNlbGVjdGlvbi5yYW5nZUNvdW50KQpxdWVyeUNhbmRpZGF0ZT1zZWxlY3Rpb24udG9TdHJpbmcoKS5yZXBsYWNlKC9ccj9cbi4qLywnJyk7TmV0d29yay5TZWFyY2hOZXR3b3JrVmlldy5vcGVuU2VhcmNoKHF1ZXJ5Q2FuZGlkYXRlKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtOZXR3b3JrLk5ldHdvcmtQYW5lbC5SZXF1ZXN0TG9jYXRpb25SZXZlYWxlcj1jbGFzc3thc3luYyByZXZlYWwobWF0Y2gpe2NvbnN0IGxvY2F0aW9uPShtYXRjaCk7Y29uc3Qgdmlldz1hd2FpdCBOZXR3b3JrLk5ldHdvcmtQYW5lbC5faW5zdGFuY2UoKS5zZWxlY3RSZXF1ZXN0KGxvY2F0aW9uLnJlcXVlc3QpO2lmKCF2aWV3KQpyZXR1cm47aWYobG9jYXRpb24uc2VhcmNoTWF0Y2gpCmF3YWl0IHZpZXcucmV2ZWFsUmVzcG9uc2VCb2R5KGxvY2F0aW9uLnNlYXJjaE1hdGNoLmxpbmVOdW1iZXIpO2lmKGxvY2F0aW9uLnJlcXVlc3RIZWFkZXIpCnZpZXcucmV2ZWFsUmVxdWVzdEhlYWRlcihsb2NhdGlvbi5yZXF1ZXN0SGVhZGVyLm5hbWUpO2lmKGxvY2F0aW9uLnJlc3BvbnNlSGVhZGVyKQp2aWV3LnJldmVhbFJlc3BvbnNlSGVhZGVyKGxvY2F0aW9uLnJlc3BvbnNlSGVhZGVyLm5hbWUpO319O05ldHdvcmsuU2VhcmNoTmV0d29ya1ZpZXc9Y2xhc3MgZXh0ZW5kcyBTZWFyY2guU2VhcmNoVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCduZXR3b3JrJyk7fQpzdGF0aWMgYXN5bmMgb3BlblNlYXJjaChxdWVyeSxzZWFyY2hJbW1lZGlhdGVseSl7YXdhaXQgVUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ25ldHdvcmsuc2VhcmNoLW5ldHdvcmstdGFiJyk7Y29uc3Qgc2VhcmNoVmlldz0oc2VsZi5ydW50aW1lLnNoYXJlZEluc3RhbmNlKE5ldHdvcmsuU2VhcmNoTmV0d29ya1ZpZXcpKTtzZWFyY2hWaWV3LnRvZ2dsZShxdWVyeSwhIXNlYXJjaEltbWVkaWF0ZWx5KTtyZXR1cm4gc2VhcmNoVmlldzt9CmNyZWF0ZVNjb3BlKCl7cmV0dXJuIG5ldyBOZXR3b3JrLk5ldHdvcmtTZWFyY2hTY29wZSgpO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9ibG9ja2VkVVJMc1BhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5saXN0IHtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcikgIWltcG9ydGFudDtcbn1cblxuLmJsb2NraW5nLWRpc2FibGVkIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBvcGFjaXR5OiAwLjg7XG59XG5cbi5lZGl0b3ItY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwIDRweDtcbn1cblxuLm5vLWJsb2NrZWQtdXJscywgLmJsb2NrZWQtdXJscyB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbi5uby1ibG9ja2VkLXVybHMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgcGFkZGluZzogMTBweDtcbn1cblxuLm5vLWJsb2NrZWQtdXJscyA+IHNwYW4ge1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG59XG5cbi5ibG9ja2VkLXVybCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogYXV0bztcbn1cblxuLmJsb2NrZWQtdXJsLWNvdW50IHtcbiAgICBmbGV4OiBub25lO1xuICAgIHBhZGRpbmctcmlnaHQ6IDlweDtcbn1cblxuLmJsb2NrZWQtdXJsLWNoZWNrYm94IHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5ibG9ja2VkLXVybC1sYWJlbCB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IGF1dG87XG4gICAgcGFkZGluZzogMCAzcHg7XG59XG5cbi5ibG9ja2VkLXVybC1lZGl0LXJvdyB7XG4gICAgZmxleDogbm9uZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luOiA3cHggNXB4IDAgNXB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5ibG9ja2VkLXVybC1lZGl0LXZhbHVlIHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgIGZsZXg6IDEgMSAwcHg7XG59XG5cbi5ibG9ja2VkLXVybC1lZGl0LXJvdyBpbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdGV4dC1hbGlnbjogaW5oZXJpdDtcbiAgICBoZWlnaHQ6IDIycHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9bmV0d29yay9ibG9ja2VkVVJMc1BhbmUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9ldmVudFNvdXJjZU1lc3NhZ2VzVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmV2ZW50LXNvdXJjZS1tZXNzYWdlcy12aWV3IC5kYXRhLWdyaWQge1xuICAgIGZsZXg6IGF1dG87XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvZXZlbnRTb3VyY2VNZXNzYWdlc1ZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9uZXR3b3JrQ29uZmlnVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLm5ldHdvcmstY29uZmlnIHtcbiAgICBwYWRkaW5nOiAxMnB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4ubmV0d29yay1jb25maWctZ3JvdXAge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgbWluLWhlaWdodDogMzBweDtcbn1cblxuLm5ldHdvcmstY29uZmlnLXRpdGxlIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7XG4gICAgd2lkdGg6IDEzMHB4O1xufVxuXG4ubmV0d29yay1jb25maWctZmllbGRzIHtcbiAgICBmbGV4OiAyIDAgMjAwcHg7XG59XG5cbi5wYW5lbC1zZWN0aW9uLXNlcGFyYXRvciB7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xufVxuXG4vKiBEaXNhYmxlIGNhY2hlICovXG5cbi5uZXR3b3JrLWNvbmZpZy1kaXNhYmxlLWNhY2hlIHtcbiAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIHBhZGRpbmctdG9wOiAwO1xufVxuXG4vKiBOZXR3b3JrIHRocm90dGxpbmcgKi9cblxuLm5ldHdvcmstY29uZmlnLXRocm90dGxpbmcgLmNocm9tZS1zZWxlY3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1heC13aWR0aDogMjUwcHg7XG59XG5cbi5uZXR3b3JrLWNvbmZpZy10aHJvdHRsaW5nID4gLm5ldHdvcmstY29uZmlnLXRpdGxlIHtcbiAgICBsaW5lLWhlaWdodDogMjRweDtcbn1cblxuLyogVXNlciBhZ2VudCAqL1xuXG4ubmV0d29yay1jb25maWctdWEgPiAubmV0d29yay1jb25maWctdGl0bGUge1xuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG4ubmV0d29yay1jb25maWctdWEgbGFiZWxbaXM9XCJkdC1yYWRpb1wiXS5jaGVja2VkID4gKiB7XG4gICAgZGlzcGxheTogbm9uZVxufVxuXG4ubmV0d29yay1jb25maWctdWEgaW5wdXQ6bm90KC5kdC1yYWRpby1idXR0b24pIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7XG4gICAgbWF4LXdpZHRoOiAyNTBweDtcbn1cblxuLm5ldHdvcmstY29uZmlnLXVhIGlucHV0W3JlYWRvbmx5XSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNSwgMjM1LCAyMjgpO1xufVxuXG4ubmV0d29yay1jb25maWctdWEgaW5wdXRbdHlwZT10ZXh0XSwgLm5ldHdvcmstY29uZmlnLXVhIC5jaHJvbWUtc2VsZWN0IHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5uZXR3b3JrLWNvbmZpZy11YSAuY2hyb21lLXNlbGVjdCB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpO1xuICAgIG1heC13aWR0aDogMjUwcHg7XG59XG5cbi5uZXR3b3JrLWNvbmZpZy11YSBsYWJlbFtpcz1cImR0LXJhZGlvXCJdIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLm5ldHdvcmstY29uZmlnLXVhLWF1dG8sIC5uZXR3b3JrLWNvbmZpZy11YS1jdXN0b20ge1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLm5ldHdvcmstY29uZmlnLXVhLWF1dG8uY2hlY2tlZCwgLm5ldHdvcmstY29uZmlnLXVhLWN1c3RvbS5jaGVja2VkIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvbmV0d29ya0NvbmZpZ1ZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9uZXR3b3JrTG9nVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4gKiBkaXN0cmlidXRpb24uXG4gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZmxleDogYXV0bztcbn1cblxuLm5ldHdvcmstc3VtbWFyeS1iYXIge1xuICAgIGZsZXg6IDAgMCAyN3B4O1xuICAgIGxpbmUtaGVpZ2h0OiAyN3B4O1xuICAgIHBhZGRpbmctbGVmdDogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubmV0d29yay1zdW1tYXJ5LWJhciBsYWJlbFtpcz1kdC1pY29uLWxhYmVsXSB7XG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG59XG5cbi5uZXR3b3JrLXN1bW1hcnktYmFyID4gKiB7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIHRhYmxlLmRhdGEge1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgdGQge1xuICAgIGhlaWdodDogNDFweDtcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlMWUxZTE7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC5jb3JuZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZC5zbWFsbCB0ZCB7XG4gICAgaGVpZ2h0OiAyMXB4O1xufVxuXG4ubmV0d29yay13YXRlcmZhbGwtaGVhZGVyLCAubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgdGgge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjA1LCAyMDUsIDIwNSk7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCByZ2IoMjA1LCAyMDUsIDIwNSk7XG59XG5cbi5uZXR3b3JrLXdhdGVyZmFsbC1oZWFkZXIsIC5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAuaGVhZGVyLWNvbnRhaW5lciB7XG4gICAgaGVpZ2h0OiAzMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgLmRhdGEtY29udGFpbmVyIHtcbiAgICB0b3A6IDMxcHg7XG59XG5cbi5uZXR3b3JrLXdhdGVyZmFsbC1oZWFkZXIuc21hbGwsIC5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZC5zbWFsbCAuaGVhZGVyLWNvbnRhaW5lciB7XG4gICAgaGVpZ2h0OiAyN3B4O1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmRhdGEtY29udGFpbmVyIHtcbiAgICB0b3A6IDI3cHg7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCBzZWxlY3Qge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAubmFtZS1jb2x1bW4ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC53YXRlcmZhbGwtY29sdW1uIHtcbiAgICBwYWRkaW5nOiAxcHggMDtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC53YXRlcmZhbGwtY29sdW1uIC5zb3J0LW9yZGVyLWljb24tY29udGFpbmVyIHtcbiAgICByaWdodDogMTVweDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIHRoLnNvcnRhYmxlOmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubmV0d29yay1jZWxsLXN1YnRpdGxlIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGNvbG9yOiBncmF5O1xufVxuXG4ubmV0d29yay1iYWRnZSB7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG59XG5cbi5uZXR3b3JrLWVycm9yLXJvdyxcbi5uZXR3b3JrLWVycm9yLXJvdyAubmV0d29yay1jZWxsLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogcmdiKDIzMCwgMCwgMCk7XG59XG5cbi5pbml0aWF0b3ItY29sdW1uIC5kZXZ0b29scy1saW5rIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIHRyLnNlbGVjdGVkLFxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIHRyLnNlbGVjdGVkIC5uZXR3b3JrLWNlbGwtc3VidGl0bGUsXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgdHIuc2VsZWN0ZWQgLm5ldHdvcmstZGltLWNlbGwge1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZDpmb2N1cyB0ci5zZWxlY3RlZCxcbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZDpmb2N1cyB0ci5zZWxlY3RlZCAubmV0d29yay1jZWxsLXN1YnRpdGxlLFxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkOmZvY3VzIHRyLnNlbGVjdGVkIC5uZXR3b3JrLWRpbS1jZWxsIHtcbiAgICBjb2xvcjogdmFyKC0tc2VsZWN0aW9uLWZnLWNvbG9yKSAhaW1wb3J0YW50O1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZCB0ci5oaWdobGlnaHRlZC1yb3cge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBuZXR3b3JrLXJvdy1oaWdobGlnaHQtZmFkZW91dCAycyAwcztcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIG5ldHdvcmstcm93LWhpZ2hsaWdodC1mYWRlb3V0IHtcbiAgICBmcm9tIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAxMjAsIDEpOyB9XG4gICAgdG8geyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAxMjAsIDApOyB9XG59XG5cbi5uZXR3b3JrLWhlYWRlci1zdWJ0aXRsZSB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZC5zbWFsbCAubmV0d29yay1jZWxsLXN1YnRpdGxlLFxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkLnNtYWxsIC5uZXR3b3JrLWhlYWRlci1zdWJ0aXRsZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogUmVzb3VyY2UgcHJldmlldyBpY29ucyAqL1xuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgLmljb24ge1xuICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzb3VyY2VQbGFpbkljb24ucG5nKTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkLnNtYWxsIC5pY29uIHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc291cmNlUGxhaW5JY29uU21hbGwucG5nKTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC5pY29uLnNjcmlwdCB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZUpTSWNvbi5wbmcpO1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmljb24uc2NyaXB0IHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc291cmNlRG9jdW1lbnRJY29uU21hbGwucG5nKTtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC5pY29uLmRvY3VtZW50IHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc291cmNlRG9jdW1lbnRJY29uLnBuZyk7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZC5zbWFsbCAuaWNvbi5kb2N1bWVudCB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZURvY3VtZW50SWNvblNtYWxsLnBuZyk7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAuaWNvbi5zdHlsZXNoZWV0IHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Jlc291cmNlQ1NTSWNvbi5wbmcpO1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmljb24uc3R5bGVzaGVldCB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZURvY3VtZW50SWNvblNtYWxsLnBuZyk7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAuaWNvbi5tZWRpYSB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZVBsYWluSWNvbi5wbmcpOyAvKiBGSVhNRTogbWVkaWEgaWNvbiAqL1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmljb24ubWVkaWEge1xuICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzb3VyY2VQbGFpbkljb25TbWFsbC5wbmcpOyAvKiBGSVhNRTogbWVkaWEgaWNvbiAqL1xufVxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC5pY29uLnRleHR0cmFjayB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZVBsYWluSWNvbi5wbmcpOyAvKiBGSVhNRTogdnR0IGljb24gKi9cbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkLnNtYWxsIC5pY29uLnRleHR0cmFjayB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9yZXNvdXJjZVBsYWluSWNvblNtYWxsLnBuZyk7IC8qIEZJWE1FOiB2dHQgaWNvbiAqL1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQgLmljb24uaW1hZ2Uge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL3Jlc291cmNlUGxhaW5JY29uLnBuZyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBjb250ZW50OiBcIlwiO1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmljb24uaW1hZ2Uge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvcmVzb3VyY2VQbGFpbkljb25TbWFsbC5wbmcpO1xuICAgIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAuaWNvbiB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgd2lkdGg6IDMycHg7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkLnNtYWxsIC5pY29uIHtcbiAgICB3aWR0aDogMTZweDtcbiAgICBoZWlnaHQ6IDE2cHg7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAuaW1hZ2UtbmV0d29yay1pY29uLXByZXZpZXcge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgdG9wOiAzcHg7XG4gICAgYm90dG9tOiA0cHg7XG4gICAgbGVmdDogNXB4O1xuICAgIHJpZ2h0OiA1cHg7XG4gICAgbWF4LXdpZHRoOiAxOHB4O1xuICAgIG1heC1oZWlnaHQ6IDIxcHg7XG4gICAgbWluLXdpZHRoOiAxcHg7XG4gICAgbWluLWhlaWdodDogMXB4O1xufVxuXG4ubmV0d29yay1sb2ctZ3JpZC5kYXRhLWdyaWQuc21hbGwgLmltYWdlLW5ldHdvcmstaWNvbi1wcmV2aWV3IHtcbiAgICB0b3A6IDJweDtcbiAgICBib3R0b206IDFweDtcbiAgICBsZWZ0OiAzcHg7XG4gICAgcmlnaHQ6IDNweDtcbiAgICBtYXgtd2lkdGg6IDhweDtcbiAgICBtYXgtaGVpZ2h0OiAxMXB4O1xufVxuXG4ubmV0d29yay1kaW0tY2VsbCB7XG4gICAgY29sb3I6IGdyZXk7XG59XG5cbi5uZXR3b3JrLXN1bW1hcnktYmFyIC5zdW1tYXJ5LXJlZCB7XG4gICAgY29sb3I6IHJlZDtcbn1cblxuLm5ldHdvcmstZnJhbWUtZGl2aWRlciB7XG4gICAgd2lkdGg6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkNDQzQ5O1xuICAgIHotaW5kZXg6IDEwO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuI25ldHdvcmstY29udGFpbmVyOm5vdCguYnJpZWYtbW9kZSkgLmRhdGEtY29udGFpbmVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubmV0d29yay1zdW1tYXJ5LWJhciAuc3VtbWFyeS1ibHVlIHtcbiAgICBjb2xvcjogYmx1ZTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAubmV0d29yay1zdW1tYXJ5LWJhciAuc3VtbWFyeS1ibHVlIHtcbiAgICBjb2xvcjogIzAzQTlGNDtcbn1cblxuLm5ldHdvcmstbG9nLWdyaWQuZGF0YS1ncmlkIC5yZXNvdXJjZXMtZGl2aWRlcnMge1xuICAgIHotaW5kZXg6IDA7XG59XG5cbi5uZXR3b3JrLWxvZy1ncmlkLmRhdGEtZ3JpZCAucmVzb3VyY2VzLWRpdmlkZXJzLWxhYmVsLWJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGhlaWdodDogMzBweDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuI25ldHdvcmstY29udGFpbmVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ubmV0d29yay1zdGF0dXMtcGFuZSB7XG4gICAgY29sb3I6ICM3Nzc7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgei1pbmRleDogNTAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMCAyMHB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4ubmV0d29yay1zdGF0dXMtcGFuZSA+IC5yZWNvcmRpbmctaGludCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBsaW5lLWhlaWdodDogMjhweDtcbn1cblxuLm5ldHdvcmstd2F0ZXJmYWxsLWhlYWRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1sZWZ0OiAwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgei1pbmRleDogMjAwO1xufVxuXG4ubmV0d29yay13YXRlcmZhbGwtaGVhZGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDAsIDAlLCAxMCUsIDAuMSk7XG59XG5cbi5uZXR3b3JrLXdhdGVyZmFsbC1oZWFkZXIgZGl2IHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICAgIG1hcmdpbjogYXV0byAwcHg7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgcGFkZGluZzogMHB4IDRweDtcbn1cblxuLm5ldHdvcmstd2F0ZXJmYWxsLWhlYWRlciAuc29ydC1vcmRlci1pY29uLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMXB4O1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLm5ldHdvcmstd2F0ZXJmYWxsLWhlYWRlciAuc29ydC1vcmRlci1pY29uIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIG1hcmdpbi1ib3R0b206IC0ycHg7XG59XG5cbi5uZXR3b3JrLWZyYW1lLWdyb3VwLWljb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IC04cHggLTJweDtcbn1cblxuLm5ldHdvcmstZnJhbWUtZ3JvdXAtYmFkZ2Uge1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvbmV0d29ya0xvZ1ZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9uZXR3b3JrTWFuYWdlQ3VzdG9tSGVhZGVyc1ZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cbi5jdXN0b20taGVhZGVycy1saXN0IHtcbiAgICBoZWlnaHQ6IDI3MnB4O1xuICAgIHdpZHRoOiAyNTBweDtcbn1cblxuLmN1c3RvbS1oZWFkZXJzLXdyYXBwZXJ7XG4gICAgbWFyZ2luOiAxMHB4O1xufVxuXG4uaGVhZGVyIHtcbiAgICBwYWRkaW5nOiAwIDAgNnB4O1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5jdXN0b20taGVhZGVycy1oZWFkZXIge1xuICAgIHBhZGRpbmc6MnB4O1xufVxuXG4uY3VzdG9tLWhlYWRlcnMtbGlzdC1pdGVtIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbn1cblxuLmVkaXRvci1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDVweCAwcHggMHB4IDVweDtcbn1cblxuLmFkZC1idXR0b24ge1xuICAgIHdpZHRoOiAxNTBweDtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvbmV0d29ya01hbmFnZUN1c3RvbUhlYWRlcnNWaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm5ldHdvcmsvbmV0d29ya1BhbmVsLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50aG9ueSBSaWNhdWQgPHJpa0B3ZWJraXQub3JnPlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICpcbiAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKFwiQXBwbGVcIikgbm9yIHRoZSBuYW1lcyBvZlxuICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4ucGFuZWwubmV0d29yayAudG9vbGJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xufVxuXG4ubmV0d29yay1kZXRhaWxzLXZpZXcge1xuICAgIGJhY2tncm91bmQ6IHJnYigyMDMsIDIwMywgMjAzKTtcbn1cblxuLm5ldHdvcmstZGV0YWlscy12aWV3LXRhbGwtaGVhZGVyIHtcbiAgICBtYXJnaW4tdG9wOiA0cHg7XG59XG5cbi5uZXR3b3JrLWl0ZW0tdmlldyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLm5ldHdvcmstaXRlbS1wcmV2aWV3LXRvb2xiYXIge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi5yZXNvdXJjZS10aW1pbmctdmlldyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luOiA2cHg7XG4gICAgY29sb3I6IHJnYigzMCUsIDMwJSwgMzAlKTtcbn1cblxuLnJlc291cmNlLXRpbWluZy10YWJsZSB7XG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbn1cblxuI25ldHdvcmstb3ZlcnZpZXctcGFuZWwge1xuICAgIGZsZXg6IG5vbmU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4jbmV0d29yay1vdmVydmlldy1jb250YWluZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleDogYXV0bztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0RDRENEO1xufVxuXG4jbmV0d29yay1vdmVydmlldy1jb250YWluZXIgY2FudmFzIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbiNuZXR3b3JrLW92ZXJ2aWV3LWdyaWQgLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4ubmV0d29yayAubmV0d29yay1vdmVydmlldyB7XG4gICAgZmxleDogMCAwIDYwcHg7XG59XG5cbi5uZXR3b3JrLW92ZXJ2aWV3IC5vdmVydmlldy1ncmlkLXdpbmRvdyxcbi5uZXR3b3JrLW92ZXJ2aWV3IC5vdmVydmlldy1ncmlkLWRpdmlkZXJzLWJhY2tncm91bmQge1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLm5ldHdvcmstb3ZlcnZpZXcgLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7XG59XG5cbi5uZXR3b3JrLW92ZXJ2aWV3IC5yZXNvdXJjZXMtZGl2aWRlcnMtbGFiZWwtYmFyIC5yZXNvdXJjZXMtZGl2aWRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5uZXR3b3JrLW92ZXJ2aWV3IC5yZXNvdXJjZXMtZGl2aWRlcnMge1xuICAgIHotaW5kZXg6IDI1MDtcbn1cblxuLnJlcXVlc3Qtdmlldy5odG1sIGlmcmFtZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLm5ldHdvcmstZmlsbS1zdHJpcCB7XG4gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNjZGNkY2Q7XG4gICAgZmxleDogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubmV0d29yay1maWxtLXN0cmlwLXBsYWNlaG9sZGVyIHtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLm5ldHdvcmstYmxvY2tlZC11cmxzIHtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG4gICAgZmxleDogMTA0cHggMCAwO1xufVxuXG4ub3Blbi1zZWFyY2gtdmlldyB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woNTAsIDEwMCUsIDg4JSk7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmbGV4LWdyb3c6IDA7XG4gICAgcGFkZGluZzogNHB4O1xufVxuXG4ub3Blbi1zZWFyY2gtdmlldyA+ICoge1xuICAgIG1hcmdpbjogMCA0cHg7XG59XG5cbi5vcGVuLXNlYXJjaC12aWV3IC5zZWFyY2gtc3VnZ2VzdGlvbiB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubmV0d29yay10YWJiZWQtcGFuZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG59XG5cbi8qIyBzb3VyY2VVUkw9bmV0d29yay9uZXR3b3JrUGFuZWwuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9uZXR3b3JrVGltaW5nVGFibGUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLm5ldHdvcmstdGltaW5nLXRhYmxlIHtcbiAgICB3aWR0aDogMzgwcHg7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1zdGFydCB7XG4gICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuLm5ldHdvcmstdGltaW5nLXRhYmxlLWhlYWRlciB0ZCwgLm5ldHdvcmstdGltaW5nLWZvb3RlciB0ZCB7XG4gICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLm5ldHdvcmstdGltaW5nLXRhYmxlLWhlYWRlciB0ZCB7XG4gICAgY29sb3I6ICNiYmI7XG59XG5cbi5uZXR3b3JrLXRpbWluZy10YWJsZS1oZWFkZXIgdGQ6bGFzdC1jaGlsZCB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG59XG5cbi5uZXR3b3JrLXRpbWluZy10YWJsZSBjb2wubGFiZWxzIHtcbiAgICB3aWR0aDogMTU2cHg7XG59XG5cbi5uZXR3b3JrLXRpbWluZy10YWJsZSBjb2wuZHVyYXRpb24ge1xuICAgIHdpZHRoOiA4MHB4O1xufVxuXG4ubmV0d29yay10aW1pbmctdGFibGUgdGQge1xuICAgIHBhZGRpbmc6IDRweCAwO1xufVxuXG4ubmV0d29yay10aW1pbmctdGFibGUgdGQuY2F1dGlvbiB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgY29sb3I6IHJnYigyNTUsIDEyOCwgMCk7XG4gICAgcGFkZGluZzogMnB4IDA7XG59XG5cbi5uZXR3b3JrLXRpbWluZy10YWJsZSBoci5icmVhayB7XG4gICAgYm9yZGVyOiAwO1xuICAgIGhlaWdodDogMXB4O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2VlZSwgI2JiYiwgI2VlZSk7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1mb290ZXIgdGQ6bGFzdC1jaGlsZCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1yb3cge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBoZWlnaHQ6IDE1cHg7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBtaW4td2lkdGg6IDFweDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xufVxuXG4ubmV0d29yay10aW1pbmctYmFyLXRpdGxlIHtcbiAgICBjb2xvcjogIzIyMjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4ubmV0d29yay10aW1pbmctYmFyLnF1ZXVlaW5nLFxuLm5ldHdvcmstdGltaW5nLWJhci50b3RhbCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xufVxuXG4ubmV0d29yay10aW1pbmctYmFyLmJsb2NraW5nLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUE7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1iYXIucHJveHksIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ExODg3Rjtcbn1cblxuLm5ldHdvcmstdGltaW5nLWJhci5kbnMsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTY4ODtcbn1cblxuLm5ldHdvcmstdGltaW5nLWJhci5jb25uZWN0aW5nLFxuLm5ldHdvcmstdGltaW5nLWJhci5zZXJ2aWNld29ya2VyLFxuLm5ldHdvcmstdGltaW5nLWJhci5zZXJ2aWNld29ya2VyLXByZXBhcmF0aW9uLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRjk4MDA7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1iYXIuc3NsLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM5QzI3QjA7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1iYXIuc2VuZGluZywgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjBCRUM1O1xufVxuXG4ubmV0d29yay10aW1pbmctYmFyLndhaXRpbmcsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwQzg1Mztcbn1cblxuLm5ldHdvcmstdGltaW5nLWJhci5yZWNlaXZpbmcsIC10aGVtZS1wcmVzZXJ2ZSxcbi5uZXR3b3JrLXRpbWluZy1iYXIucmVjZWl2aW5nLXB1c2gsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAzQTlGNDtcbn1cblxuLm5ldHdvcmstdGltaW5nLWJhci5wdXNoLCAtdGhlbWUtcHJlc2VydmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM4Q0RCZmY7XG59XG5cbi5uZXR3b3JrLXRpbWluZy1iYXIuc2VydmVyLXRpbWluZywgLXRoZW1lLXByZXNlcnZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xufVxuXG4ubmV0d29yay10aW1pbmctdGFibGUgdGQubmV0d29yay10aW1pbmctbWV0cmljIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG1heC13aWR0aDogMTUwcHg7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4ubmV0d29yay10aW1pbmctYmFyLnByb3h5LFxuLm5ldHdvcmstdGltaW5nLWJhci5kbnMsXG4ubmV0d29yay10aW1pbmctYmFyLnNzbCxcbi5uZXR3b3JrLXRpbWluZy1iYXIuY29ubmVjdGluZyxcbi5uZXR3b3JrLXRpbWluZy1iYXIuYmxvY2tpbmcge1xuICAgIGhlaWdodDogMTBweDtcbiAgICBtYXJnaW46IGF1dG87XG59XG5cbi8qIyBzb3VyY2VVUkw9bmV0d29yay9uZXR3b3JrVGltaW5nVGFibGUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9uZXR3b3JrV2F0ZXJmYWxsQ29sdW1uLmNzcyJdPSIvKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cbi5uZXR3b3JrLXdhdGVyZmFsbC12LXNjcm9sbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG1hcmdpbi10b3A6IDMxcHg7XG4gICAgei1pbmRleDogMjAwO1xufVxuXG4ubmV0d29yay13YXRlcmZhbGwtdi1zY3JvbGwuc21hbGwge1xuICAgIG1hcmdpbi10b3A6IDI3cHg7XG59XG5cbi5uZXR3b3JrLXdhdGVyZmFsbC12LXNjcm9sbC1jb250ZW50IHtcbiAgICB3aWR0aDogMTVweDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD1uZXR3b3JrL25ldHdvcmtXYXRlcmZhbGxDb2x1bW4uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9yZXF1ZXN0Q29va2llc1ZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5yZXF1ZXN0LWNvb2tpZXMtdmlldyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBtYXJnaW46IDEycHg7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG4ucmVxdWVzdC1jb29raWVzLXZpZXcgLmRhdGEtZ3JpZCB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5yZXF1ZXN0LWNvb2tpZXMtdmlldyAuZGF0YS1ncmlkIC5yb3ctZ3JvdXAge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvcmVxdWVzdENvb2tpZXNWaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm5ldHdvcmsvcmVxdWVzdEhlYWRlcnNUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50cmVlLW91dGxpbmUge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbn1cblxuLnRyZWUtb3V0bGluZSA+IG9sIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZTBlMGUwO1xufVxuXG4udHJlZS1vdXRsaW5lID4gLnBhcmVudCB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBjb2xvcjogIzYxNjE2MTtcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAyNnB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaTpub3QoLnBhcmVudCkge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOm5vdCgucGFyZW50KTo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIC5jYXV0aW9uIHtcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5leHBhbmRlZCAuaGVhZGVyLWNvdW50IHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIC5oZWFkZXItdG9nZ2xlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIC5zdGF0dXMtZnJvbS1jYWNoZSB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi50cmVlLW91dGxpbmUgbGkuZXhwYW5kZWQgLmhlYWRlci10b2dnbGUge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW4tbGVmdDogMzBweDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGNvbG9yOiByZ2IoNDUlLCA0NSUsIDQ1JSk7XG59XG5cbi50cmVlLW91dGxpbmUgbGkgLmhlYWRlci10b2dnbGU6aG92ZXIge1xuICAgIGNvbG9yOiByZ2IoMjAlLCAyMCUsIDQ1JSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4udHJlZS1vdXRsaW5lIC5oZWFkZXItbmFtZSB7XG4gICAgY29sb3I6IHJnYigzMyUsIDMzJSwgMzMlKTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luLXJpZ2h0OiAwLjI1ZW07XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi50cmVlLW91dGxpbmUgLmhlYWRlci1zZXBhcmF0b3Ige1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIC5oZWFkZXItdmFsdWUge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICAgIG1hcmdpbi10b3A6IDFweDtcbn1cblxuLnRyZWUtb3V0bGluZSAuZW1wdHktcmVxdWVzdC1oZWFkZXIge1xuICAgIGNvbG9yOiByZ2JhKDMzJSwgMzMlLCAzMyUsIDAuNSk7XG59XG5cbi5yZXF1ZXN0LWhlYWRlcnMtc2hvdy1tb3JlLWJ1dHRvbiB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW46IDAgNHB4O1xuICAgIHBhZGRpbmc6IDJweCA0cHg7XG59XG5cbi5oZWFkZXItaGlnaGxpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjc4XG59XG5cbi8qIyBzb3VyY2VVUkw9bmV0d29yay9yZXF1ZXN0SGVhZGVyc1RyZWUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9yZXF1ZXN0SGVhZGVyc1ZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5yZXF1ZXN0LWhlYWRlcnMtdmlldyB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLnJlc291cmNlLXN0YXR1cy1pbWFnZSB7XG4gICAgbWFyZ2luLXRvcDogLTJweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cblxuLnJlcXVlc3QtaGVhZGVycy12aWV3IC5maWx0ZXItaW5wdXQge1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNjY2M7XG4gICAgZmxleDogMCAwIDE5cHg7XG4gICAgcGFkZGluZzogMCA0cHg7XG59XG5cbi5yZXF1ZXN0LWhlYWRlcnMtdHJlZSB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbWFyZ2luOiAwO1xufVxuXG4uaGVhZGVyLWRlY29kZS1lcnJvciB7XG4gICAgY29sb3I6IHJlZDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuaGVhZGVyLWRlY29kZS1lcnJvciB7XG4gICAgY29sb3I6IGhzbCgwLCAxMDAlLCA2NSUpO1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvcmVxdWVzdEhlYWRlcnNWaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm5ldHdvcmsvcmVxdWVzdEhUTUxWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuLmh0bWwtcHJldmlldy1mcmFtZSB7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIGZsZXgtZ3JvdzogMTtcbiAgbWFyZ2luOiAyMHB4O1xufVxuXG4vKiMgc291cmNlVVJMPW5ldHdvcmsvcmVxdWVzdEhUTUxWaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm5ldHdvcmsvc2lnbmVkRXhjaGFuZ2VJbmZvVHJlZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4udHJlZS1vdXRsaW5lIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG59XG5cbi50cmVlLW91dGxpbmUgPiBvbCB7XG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2UwZTBlMDtcbn1cblxuLnRyZWUtb3V0bGluZSA+IC5wYXJlbnQge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgY29sb3I6ICM2MTYxNjE7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGhlaWdodDogMjZweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIwcHg7XG59XG5cbi50cmVlLW91dGxpbmUgbGk6bm90KC5wYXJlbnQpIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaTpub3QoLnBhcmVudCk6OmJlZm9yZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnRyZWUtb3V0bGluZSAuaGVhZGVyLW5hbWUge1xuICAgIGNvbG9yOiByZ2IoMzMlLCAzMyUsIDMzJSk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMC4yNWVtO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxuXG4udHJlZS1vdXRsaW5lIC5oZWFkZXItc2VwYXJhdG9yIHtcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLnRyZWUtb3V0bGluZSAuaGVhZGVyLXZhbHVlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgbWFyZ2luLXJpZ2h0OiAxZW07XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG59XG5cbi50cmVlLW91dGxpbmUgLmhlYWRlci10b2dnbGUge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW4tbGVmdDogMzBweDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGNvbG9yOiByZ2IoNDUlLCA0NSUsIDQ1JSk7XG59XG5cbi50cmVlLW91dGxpbmUgLmhlYWRlci10b2dnbGU6aG92ZXIge1xuICAgIGNvbG9yOiByZ2IoMjAlLCAyMCUsIDQ1JSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4udHJlZS1vdXRsaW5lIC5lcnJvci1sb2cge1xuICAgIGNvbG9yOiByZWQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMC4yNWVtO1xuICAgIG1hcmdpbi1sZWZ0OiAwLjI1ZW07XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi50cmVlLW91dGxpbmUgLmhleC1kYXRhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIC5lcnJvci1maWVsZCB7XG4gICAgY29sb3I6IHJlZDtcbn1cblxuLyojIHNvdXJjZVVSTD1uZXR3b3JrL3NpZ25lZEV4Y2hhbmdlSW5mb1RyZWUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay9zaWduZWRFeGNoYW5nZUluZm9WaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uc2lnbmVkLWV4Y2hhbmdlLWluZm8tdmlldyB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLnNpZ25lZC1leGNoYW5nZS1pbmZvLXRyZWUge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLyojIHNvdXJjZVVSTD1uZXR3b3JrL3NpZ25lZEV4Y2hhbmdlSW5mb1ZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sibmV0d29yay93ZWJTb2NrZXRGcmFtZVZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi53ZWJzb2NrZXQtZnJhbWUtdmlldyB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLndlYnNvY2tldC1mcmFtZS12aWV3IC5kYXRhLWdyaWQge1xuICAgIGZsZXg6IGF1dG87XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4ud2Vic29ja2V0LWZyYW1lLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbn1cblxuLndlYnNvY2tldC1mcmFtZS12aWV3LXRkIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbn1cblxuLndlYnNvY2tldC1mcmFtZS12aWV3IC5kYXRhLWdyaWQgdHIuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWY7XG59XG5cbi53ZWJzb2NrZXQtZnJhbWUtdmlldyAuZGF0YS1ncmlkIHRkLFxuLndlYnNvY2tldC1mcmFtZS12aWV3IC5kYXRhLWdyaWQgdGgge1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjY2NjO1xufVxuXG4ud2Vic29ja2V0LWZyYW1lLXZpZXctcm93LXNlbmQgdGQ6Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCJcXDJCMDYgXCI7XG4gICAgY29sb3I6ICMwODA7XG59XG5cbi53ZWJzb2NrZXQtZnJhbWUtdmlldy1yb3ctcmVjZWl2ZSB0ZDpmaXJzdC1jaGlsZDo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlxcMkIwNyBcIjtcbiAgICBjb2xvcjogI0U2NTEwMDtcbn1cblxuLmRhdGEtZ3JpZDpmb2N1cyAud2Vic29ja2V0LWZyYW1lLXZpZXctcm93LXNlbmQuc2VsZWN0ZWQgdGQ6Zmlyc3QtY2hpbGQ6OmJlZm9yZSxcbi5kYXRhLWdyaWQ6Zm9jdXMgLndlYnNvY2tldC1mcmFtZS12aWV3LXJvdy1yZWNlaXZlLnNlbGVjdGVkIHRkOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLndlYnNvY2tldC1mcmFtZS12aWV3LXJvdy1zZW5kIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI2LCAyNDcsIDIxOCk7XG59XG5cbi53ZWJzb2NrZXQtZnJhbWUtdmlldy1yb3ctb3Bjb2RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDIzMik7XG4gICAgY29sb3I6IHJnYigxNzAsIDExMSwgNzEpO1xufVxuXG4ud2Vic29ja2V0LWZyYW1lLXZpZXctcm93LWVycm9yIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyMzcsIDIzNyk7XG4gICAgY29sb3I6IHJnYigxODIsIDAsIDApO1xufVxuXG4ud2Vic29ja2V0LWZyYW1lLXZpZXcgLnRvb2xiYXIge1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLyojIHNvdXJjZVVSTD1uZXR3b3JrL3dlYlNvY2tldEZyYW1lVmlldy5jc3MgKi8iO09iamVjdFVJLkN1c3RvbVByZXZpZXdTZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKG9iamVjdCl7dGhpcy5fc2VjdGlvbkVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2N1c3RvbS1leHBhbmRhYmxlLXNlY3Rpb24nKTt0aGlzLl9vYmplY3Q9b2JqZWN0O3RoaXMuX2V4cGFuZGVkPWZhbHNlO3RoaXMuX2NhY2hlZENvbnRlbnQ9bnVsbDtjb25zdCBjdXN0b21QcmV2aWV3PW9iamVjdC5jdXN0b21QcmV2aWV3KCk7bGV0IGhlYWRlckpTT047dHJ5e2hlYWRlckpTT049SlNPTi5wYXJzZShjdXN0b21QcmV2aWV3LmhlYWRlcik7fWNhdGNoKGUpe0NvbW1vbi5jb25zb2xlLmVycm9yKCdCcm9rZW4gZm9ybWF0dGVyOiBoZWFkZXIgaXMgaW52YWxpZCBqc29uICcrZSk7cmV0dXJuO30KdGhpcy5faGVhZGVyPXRoaXMuX3JlbmRlckpTT05NTFRhZyhoZWFkZXJKU09OKTtpZih0aGlzLl9oZWFkZXIubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0Jyb2tlbiBmb3JtYXR0ZXI6IGhlYWRlciBzaG91bGQgYmUgYW4gZWxlbWVudCBub2RlLicpO3JldHVybjt9CmlmKGN1c3RvbVByZXZpZXcuaGFzQm9keSl7dGhpcy5faGVhZGVyLmNsYXNzTGlzdC5hZGQoJ2N1c3RvbS1leHBhbmRhYmxlLXNlY3Rpb24taGVhZGVyJyk7dGhpcy5faGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2V4cGFuZEljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1yaWdodCcsJ2N1c3RvbS1leHBhbmQtaWNvbicpO3RoaXMuX2hlYWRlci5pbnNlcnRCZWZvcmUodGhpcy5fZXhwYW5kSWNvbix0aGlzLl9oZWFkZXIuZmlyc3RDaGlsZCk7fQp0aGlzLl9zZWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIpO30KZWxlbWVudCgpe3JldHVybiB0aGlzLl9zZWN0aW9uRWxlbWVudDt9Cl9yZW5kZXJKU09OTUxUYWcoanNvbk1MKXtpZighQXJyYXkuaXNBcnJheShqc29uTUwpKQpyZXR1cm4gY3JlYXRlVGV4dE5vZGUoanNvbk1MKycnKTtjb25zdCBhcnJheT0oanNvbk1MKTtyZXR1cm4gYXJyYXlbMF09PT0nb2JqZWN0Jz90aGlzLl9sYXlvdXRPYmplY3RUYWcoYXJyYXkpOnRoaXMuX3JlbmRlckVsZW1lbnQoYXJyYXkpO30KX3JlbmRlckVsZW1lbnQob2JqZWN0KXtjb25zdCB0YWdOYW1lPW9iamVjdC5zaGlmdCgpO2lmKCFPYmplY3RVSS5DdXN0b21QcmV2aWV3U2VjdGlvbi5fdGFnc1doaXRlTGlzdC5oYXModGFnTmFtZSkpe0NvbW1vbi5jb25zb2xlLmVycm9yKCdCcm9rZW4gZm9ybWF0dGVyOiBlbGVtZW50ICcrdGFnTmFtZSsnIGlzIG5vdCBhbGxvd2VkIScpO3JldHVybiBjcmVhdGVFbGVtZW50KCdzcGFuJyk7fQpjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoKHRhZ05hbWUpKTtpZigodHlwZW9mIG9iamVjdFswXT09PSdvYmplY3QnKSYmIUFycmF5LmlzQXJyYXkob2JqZWN0WzBdKSl7Y29uc3QgYXR0cmlidXRlcz1vYmplY3Quc2hpZnQoKTtmb3IoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpe2NvbnN0IHZhbHVlPWF0dHJpYnV0ZXNba2V5XTtpZigoa2V5IT09J3N0eWxlJyl8fCh0eXBlb2YgdmFsdWUhPT0nc3RyaW5nJykpCmNvbnRpbnVlO2VsZW1lbnQuc2V0QXR0cmlidXRlKGtleSx2YWx1ZSk7fX0KdGhpcy5fYXBwZW5kSnNvbk1MVGFncyhlbGVtZW50LG9iamVjdCk7cmV0dXJuIGVsZW1lbnQ7fQpfbGF5b3V0T2JqZWN0VGFnKG9iamVjdFRhZyl7b2JqZWN0VGFnLnNoaWZ0KCk7Y29uc3QgYXR0cmlidXRlcz1vYmplY3RUYWcuc2hpZnQoKTtjb25zdCByZW1vdGVPYmplY3Q9dGhpcy5fb2JqZWN0LnJ1bnRpbWVNb2RlbCgpLmNyZWF0ZVJlbW90ZU9iamVjdCgoYXR0cmlidXRlcykpO2lmKHJlbW90ZU9iamVjdC5jdXN0b21QcmV2aWV3KCkpCnJldHVybihuZXcgT2JqZWN0VUkuQ3VzdG9tUHJldmlld1NlY3Rpb24ocmVtb3RlT2JqZWN0KSkuZWxlbWVudCgpO2NvbnN0IHNlY3Rpb25FbGVtZW50PU9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLmRlZmF1bHRPYmplY3RQcmVzZW50YXRpb24ocmVtb3RlT2JqZWN0KTtzZWN0aW9uRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdjdXN0b20tZXhwYW5kYWJsZS1zZWN0aW9uLXN0YW5kYXJkLXNlY3Rpb24nLHJlbW90ZU9iamVjdC5oYXNDaGlsZHJlbik7cmV0dXJuIHNlY3Rpb25FbGVtZW50O30KX2FwcGVuZEpzb25NTFRhZ3MocGFyZW50RWxlbWVudCxqc29uTUxUYWdzKXtmb3IobGV0IGk9MDtpPGpzb25NTFRhZ3MubGVuZ3RoOysraSkKcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJKU09OTUxUYWcoanNvbk1MVGFnc1tpXSkpO30KX29uQ2xpY2soZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7aWYodGhpcy5fY2FjaGVkQ29udGVudCkKdGhpcy5fdG9nZ2xlRXhwYW5kKCk7ZWxzZQp0aGlzLl9sb2FkQm9keSgpO30KX3RvZ2dsZUV4cGFuZCgpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZDt0aGlzLl9oZWFkZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZXhwYW5kZWQnLHRoaXMuX2V4cGFuZGVkKTt0aGlzLl9jYWNoZWRDb250ZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXRoaXMuX2V4cGFuZGVkKTtpZih0aGlzLl9leHBhbmRlZCkKdGhpcy5fZXhwYW5kSWNvbi5zZXRJY29uVHlwZSgnc21hbGxpY29uLXRyaWFuZ2xlLWRvd24nKTtlbHNlCnRoaXMuX2V4cGFuZEljb24uc2V0SWNvblR5cGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1yaWdodCcpO30KX2xvYWRCb2R5KCl7ZnVuY3Rpb24gbG9hZChiaW5kUmVtb3RlT2JqZWN0LGZvcm1hdHRlcixjb25maWcpe2Z1bmN0aW9uIHN1YnN0aXR1dGVPYmplY3RUYWdzSW5DdXN0b21QcmV2aWV3KGpzb25NTE9iamVjdCl7aWYoIWpzb25NTE9iamVjdHx8KHR5cGVvZiBqc29uTUxPYmplY3QhPT0nb2JqZWN0Jyl8fCh0eXBlb2YganNvbk1MT2JqZWN0LnNwbGljZSE9PSdmdW5jdGlvbicpKQpyZXR1cm47Y29uc3Qgb2JqPWpzb25NTE9iamVjdC5sZW5ndGg7aWYoISh0eXBlb2Ygb2JqPT09J251bWJlcicmJm9iaj4+PjA9PT1vYmomJihvYmo+MHx8MS9vYmo+MCkpKQpyZXR1cm47bGV0IHN0YXJ0SW5kZXg9MTtpZihqc29uTUxPYmplY3RbMF09PT0nb2JqZWN0Jyl7Y29uc3QgYXR0cmlidXRlcz1qc29uTUxPYmplY3RbMV07Y29uc3Qgb3JpZ2luT2JqZWN0PWF0dHJpYnV0ZXNbJ29iamVjdCddO2NvbnN0IGNvbmZpZz1hdHRyaWJ1dGVzWydjb25maWcnXTtpZih0eXBlb2Ygb3JpZ2luT2JqZWN0PT09J3VuZGVmaW5lZCcpCnRocm93J0lsbGVnYWwgZm9ybWF0OiBvYmxpZ2F0b3J5IGF0dHJpYnV0ZSAib2JqZWN0IiBpc25cJ3Qgc3BlY2lmaWVkJztqc29uTUxPYmplY3RbMV09YmluZFJlbW90ZU9iamVjdChvcmlnaW5PYmplY3QsY29uZmlnKTtzdGFydEluZGV4PTI7fQpmb3IobGV0IGk9c3RhcnRJbmRleDtpPGpzb25NTE9iamVjdC5sZW5ndGg7KytpKQpzdWJzdGl0dXRlT2JqZWN0VGFnc0luQ3VzdG9tUHJldmlldyhqc29uTUxPYmplY3RbaV0pO30KdHJ5e2NvbnN0IGJvZHk9Zm9ybWF0dGVyLmJvZHkodGhpcyxjb25maWcpO3N1YnN0aXR1dGVPYmplY3RUYWdzSW5DdXN0b21QcmV2aWV3KGJvZHkpO3JldHVybiBib2R5O31jYXRjaChlKXtjb25zb2xlLmVycm9yKCdDdXN0b20gRm9ybWF0dGVyIEZhaWxlZDogJytlKTtyZXR1cm4gbnVsbDt9fQpjb25zdCBjdXN0b21QcmV2aWV3PXRoaXMuX29iamVjdC5jdXN0b21QcmV2aWV3KCk7Y29uc3QgYXJncz1be29iamVjdElkOmN1c3RvbVByZXZpZXcuYmluZFJlbW90ZU9iamVjdEZ1bmN0aW9uSWR9LHtvYmplY3RJZDpjdXN0b21QcmV2aWV3LmZvcm1hdHRlck9iamVjdElkfV07aWYoY3VzdG9tUHJldmlldy5jb25maWdPYmplY3RJZCkKYXJncy5wdXNoKHtvYmplY3RJZDpjdXN0b21QcmV2aWV3LmNvbmZpZ09iamVjdElkfSk7dGhpcy5fb2JqZWN0LmNhbGxGdW5jdGlvbkpTT04obG9hZCxhcmdzLG9uQm9keUxvYWRlZC5iaW5kKHRoaXMpKTtmdW5jdGlvbiBvbkJvZHlMb2FkZWQoYm9keUpzb25NTCl7aWYoIWJvZHlKc29uTUwpCnJldHVybjt0aGlzLl9jYWNoZWRDb250ZW50PXRoaXMuX3JlbmRlckpTT05NTFRhZyhib2R5SnNvbk1MKTt0aGlzLl9zZWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jYWNoZWRDb250ZW50KTt0aGlzLl90b2dnbGVFeHBhbmQoKTt9fX07T2JqZWN0VUkuQ3VzdG9tUHJldmlld0NvbXBvbmVudD1jbGFzc3tjb25zdHJ1Y3RvcihvYmplY3Qpe3RoaXMuX29iamVjdD1vYmplY3Q7dGhpcy5fY3VzdG9tUHJldmlld1NlY3Rpb249bmV3IE9iamVjdFVJLkN1c3RvbVByZXZpZXdTZWN0aW9uKG9iamVjdCk7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdzb3VyY2UtY29kZScpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuZWxlbWVudCwnb2JqZWN0X3VpL2N1c3RvbVByZXZpZXdDb21wb25lbnQuY3NzJyk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9jb250ZXh0TWVudUV2ZW50RmlyZWQuYmluZCh0aGlzKSxmYWxzZSk7c2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLl9jdXN0b21QcmV2aWV3U2VjdGlvbi5lbGVtZW50KCkpO30KZXhwYW5kSWZQb3NzaWJsZSgpe2lmKHRoaXMuX29iamVjdC5jdXN0b21QcmV2aWV3KCkuaGFzQm9keSYmdGhpcy5fY3VzdG9tUHJldmlld1NlY3Rpb24pCnRoaXMuX2N1c3RvbVByZXZpZXdTZWN0aW9uLl9sb2FkQm9keSgpO30KX2NvbnRleHRNZW51RXZlbnRGaXJlZChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtpZih0aGlzLl9jdXN0b21QcmV2aWV3U2VjdGlvbil7Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTaG93IGFzIEphdmFTY3JpcHQgb2JqZWN0JyksdGhpcy5fZGlzYXNzZW1ibGUuYmluZCh0aGlzKSk7fQpjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXModGhpcy5fb2JqZWN0KTtjb250ZXh0TWVudS5zaG93KCk7fQpfZGlzYXNzZW1ibGUoKXt0aGlzLmVsZW1lbnQuc2hhZG93Um9vdC50ZXh0Q29udGVudD0nJzt0aGlzLl9jdXN0b21QcmV2aWV3U2VjdGlvbj1udWxsO3RoaXMuZWxlbWVudC5zaGFkb3dSb290LmFwcGVuZENoaWxkKE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLmRlZmF1bHRPYmplY3RQcmVzZW50YXRpb24odGhpcy5fb2JqZWN0KSk7fX07T2JqZWN0VUkuQ3VzdG9tUHJldmlld1NlY3Rpb24uX3RhZ3NXaGl0ZUxpc3Q9bmV3IFNldChbJ3NwYW4nLCdkaXYnLCdvbCcsJ2xpJywndGFibGUnLCd0cicsJ3RkJ10pOztPYmplY3RVSS5PYmplY3RQb3BvdmVySGVscGVyPWNsYXNze2NvbnN0cnVjdG9yKGxpbmtpZmllcixyZXN1bHRIaWdobGlnaHRlZEFzRE9NKXt0aGlzLl9saW5raWZpZXI9bGlua2lmaWVyO3RoaXMuX3Jlc3VsdEhpZ2hsaWdodGVkQXNET009cmVzdWx0SGlnaGxpZ2h0ZWRBc0RPTTt9CmRpc3Bvc2UoKXtpZih0aGlzLl9yZXN1bHRIaWdobGlnaHRlZEFzRE9NKQpTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7aWYodGhpcy5fbGlua2lmaWVyKQp0aGlzLl9saW5raWZpZXIuZGlzcG9zZSgpO30Kc3RhdGljIGFzeW5jIGJ1aWxkT2JqZWN0UG9wb3ZlcihyZXN1bHQscG9wb3Zlcil7Y29uc3QgZGVzY3JpcHRpb249cmVzdWx0LmRlc2NyaXB0aW9uLnRyaW1FbmQoT2JqZWN0VUkuT2JqZWN0UG9wb3ZlckhlbHBlci5NYXhQb3BvdmVyVGV4dExlbmd0aCk7bGV0IHBvcG92ZXJDb250ZW50RWxlbWVudD1udWxsO2lmKHJlc3VsdC50eXBlPT09J29iamVjdCcpe2xldCBsaW5raWZpZXI9bnVsbDtsZXQgcmVzdWx0SGlnaGxpZ2h0ZWRBc0RPTT1mYWxzZTtpZihyZXN1bHQuc3VidHlwZT09PSdub2RlJyl7U0RLLk92ZXJsYXlNb2RlbC5oaWdobGlnaHRPYmplY3RBc0RPTU5vZGUocmVzdWx0KTtyZXN1bHRIaWdobGlnaHRlZEFzRE9NPXRydWU7fQppZihyZXN1bHQuY3VzdG9tUHJldmlldygpKXtjb25zdCBjdXN0b21QcmV2aWV3Q29tcG9uZW50PW5ldyBPYmplY3RVSS5DdXN0b21QcmV2aWV3Q29tcG9uZW50KHJlc3VsdCk7Y3VzdG9tUHJldmlld0NvbXBvbmVudC5leHBhbmRJZlBvc3NpYmxlKCk7cG9wb3ZlckNvbnRlbnRFbGVtZW50PWN1c3RvbVByZXZpZXdDb21wb25lbnQuZWxlbWVudDt9ZWxzZXtwb3BvdmVyQ29udGVudEVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnb2JqZWN0LXBvcG92ZXItY29udGVudCcpO1VJLmFwcGVuZFN0eWxlKHBvcG92ZXJDb250ZW50RWxlbWVudCwnb2JqZWN0X3VpL29iamVjdFBvcG92ZXIuY3NzJyk7Y29uc3QgdGl0bGVFbGVtZW50PXBvcG92ZXJDb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbW9ub3NwYWNlIG9iamVjdC1wb3BvdmVyLXRpdGxlJyk7dGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9ZGVzY3JpcHRpb247bGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcigpO2NvbnN0IHNlY3Rpb249bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uKHJlc3VsdCwnJyxsaW5raWZpZXIpO3NlY3Rpb24uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvYmplY3QtcG9wb3Zlci10cmVlJyk7c2VjdGlvbi50aXRsZUxlc3NNb2RlKCk7cG9wb3ZlckNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHNlY3Rpb24uZWxlbWVudCk7fQpwb3BvdmVyLnNldE1heENvbnRlbnRTaXplKG5ldyBVSS5TaXplKDMwMCwyNTApKTtwb3BvdmVyLnNldFNpemVCZWhhdmlvcihVSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLlNldEV4YWN0U2l6ZSk7cG9wb3Zlci5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChwb3BvdmVyQ29udGVudEVsZW1lbnQpO3JldHVybiBuZXcgT2JqZWN0VUkuT2JqZWN0UG9wb3ZlckhlbHBlcihsaW5raWZpZXIscmVzdWx0SGlnaGxpZ2h0ZWRBc0RPTSk7fQpwb3BvdmVyQ29udGVudEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO1VJLmFwcGVuZFN0eWxlKHBvcG92ZXJDb250ZW50RWxlbWVudCwnb2JqZWN0X3VpL29iamVjdFZhbHVlLmNzcycpO1VJLmFwcGVuZFN0eWxlKHBvcG92ZXJDb250ZW50RWxlbWVudCwnb2JqZWN0X3VpL29iamVjdFBvcG92ZXIuY3NzJyk7Y29uc3QgdmFsdWVFbGVtZW50PXBvcG92ZXJDb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ21vbm9zcGFjZSBvYmplY3QtdmFsdWUtJytyZXN1bHQudHlwZSk7dmFsdWVFbGVtZW50LnN0eWxlLndoaXRlU3BhY2U9J3ByZSc7aWYocmVzdWx0LnR5cGU9PT0nc3RyaW5nJykKdmFsdWVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZHJlbihgIiR7ZGVzY3JpcHRpb259ImApO2Vsc2UgaWYocmVzdWx0LnR5cGUhPT0nZnVuY3Rpb24nKQp2YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQ9ZGVzY3JpcHRpb247aWYocmVzdWx0LnR5cGUhPT0nZnVuY3Rpb24nKXtwb3BvdmVyLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHBvcG92ZXJDb250ZW50RWxlbWVudCk7cmV0dXJuIG5ldyBPYmplY3RVSS5PYmplY3RQb3BvdmVySGVscGVyKG51bGwsZmFsc2UpO30KT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uZm9ybWF0T2JqZWN0QXNGdW5jdGlvbihyZXN1bHQsdmFsdWVFbGVtZW50LHRydWUpO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHJlc3VsdC5kZWJ1Z2dlck1vZGVsKCkuZnVuY3Rpb25EZXRhaWxzUHJvbWlzZShyZXN1bHQpO2lmKCFyZXNwb25zZSkKcmV0dXJuIG51bGw7Y29uc3QgY29udGFpbmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ29iamVjdC1wb3BvdmVyLWNvbnRhaW5lcicpO2NvbnN0IHRpdGxlPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnZnVuY3Rpb24tcG9wb3Zlci10aXRsZSBzb3VyY2UtY29kZScpO2NvbnN0IGZ1bmN0aW9uTmFtZT10aXRsZS5jcmVhdGVDaGlsZCgnc3BhbicsJ2Z1bmN0aW9uLW5hbWUnKTtmdW5jdGlvbk5hbWUudGV4dENvbnRlbnQ9VUkuYmVhdXRpZnlGdW5jdGlvbk5hbWUocmVzcG9uc2UuZnVuY3Rpb25OYW1lKTtjb25zdCByYXdMb2NhdGlvbj1yZXNwb25zZS5sb2NhdGlvbjtjb25zdCBsaW5rQ29udGFpbmVyPXRpdGxlLmNyZWF0ZUNoaWxkKCdkaXYnLCdmdW5jdGlvbi10aXRsZS1saW5rLWNvbnRhaW5lcicpO2NvbnN0IHNvdXJjZVVSTD1yYXdMb2NhdGlvbiYmcmF3TG9jYXRpb24uc2NyaXB0KCkmJnJhd0xvY2F0aW9uLnNjcmlwdCgpLnNvdXJjZVVSTDtsZXQgbGlua2lmaWVyPW51bGw7aWYoc291cmNlVVJMKXtsaW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKCk7bGlua0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5raWZpZXIubGlua2lmeVJhd0xvY2F0aW9uKHJhd0xvY2F0aW9uLHNvdXJjZVVSTCkpO30KY29udGFpbmVyLmFwcGVuZENoaWxkKHBvcG92ZXJDb250ZW50RWxlbWVudCk7cG9wb3Zlci5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO3JldHVybiBuZXcgT2JqZWN0VUkuT2JqZWN0UG9wb3ZlckhlbHBlcihsaW5raWZpZXIsZmFsc2UpO319O09iamVjdFVJLk9iamVjdFBvcG92ZXJIZWxwZXIuTWF4UG9wb3ZlclRleHRMZW5ndGg9MTAwMDA7O09iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uPWNsYXNzIGV4dGVuZHMgVUkuVHJlZU91dGxpbmVJblNoYWRvd3tjb25zdHJ1Y3RvcihvYmplY3QsdGl0bGUsbGlua2lmaWVyLGVtcHR5UGxhY2Vob2xkZXIsaWdub3JlSGFzT3duUHJvcGVydHksZXh0cmFQcm9wZXJ0aWVzKXtzdXBlcigpO3RoaXMuX29iamVjdD1vYmplY3Q7dGhpcy5fZWRpdGFibGU9dHJ1ZTt0aGlzLmhpZGVPdmVyZmxvdygpO3RoaXMuc2V0Rm9jdXNhYmxlKGZhbHNlKTt0aGlzLl9vYmplY3RUcmVlRWxlbWVudD1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uUm9vdEVsZW1lbnQob2JqZWN0LGxpbmtpZmllcixlbXB0eVBsYWNlaG9sZGVyLGlnbm9yZUhhc093blByb3BlcnR5LGV4dHJhUHJvcGVydGllcyk7dGhpcy5hcHBlbmRDaGlsZCh0aGlzLl9vYmplY3RUcmVlRWxlbWVudCk7aWYodHlwZW9mIHRpdGxlPT09J3N0cmluZyd8fCF0aXRsZSl7dGhpcy50aXRsZUVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyk7dGhpcy50aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9dGl0bGV8fCcnO31lbHNle3RoaXMudGl0bGVFbGVtZW50PXRpdGxlO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZSk7fQp0aGlzLmVsZW1lbnQuX3NlY3Rpb249dGhpczt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ29iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ29iamVjdF91aS9vYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jc3MnKTt0aGlzLnJvb3RFbGVtZW50KCkuY2hpbGRyZW5MaXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb3VyY2UtY29kZScsJ29iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24nKTt9CnN0YXRpYyBkZWZhdWx0T2JqZWN0UHJlc2VudGF0aW9uKG9iamVjdCxsaW5raWZpZXIsc2tpcFByb3RvKXtjb25zdCBjb21wb25lbnRSb290PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdzb3VyY2UtY29kZScpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKGNvbXBvbmVudFJvb3QsJ29iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MnKTtzaGFkb3dSb290LmFwcGVuZENoaWxkKE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLmNyZWF0ZVZhbHVlRWxlbWVudChvYmplY3QsZmFsc2UsdHJ1ZSkpO2lmKCFvYmplY3QuaGFzQ2hpbGRyZW4pCnJldHVybiBjb21wb25lbnRSb290O2NvbnN0IG9iamVjdFByb3BlcnRpZXNTZWN0aW9uPW5ldyBPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbihvYmplY3QsY29tcG9uZW50Um9vdCxsaW5raWZpZXIpO29iamVjdFByb3BlcnRpZXNTZWN0aW9uLmVkaXRhYmxlPWZhbHNlO2lmKHNraXBQcm90bykKb2JqZWN0UHJvcGVydGllc1NlY3Rpb24uc2tpcFByb3RvKCk7cmV0dXJuIG9iamVjdFByb3BlcnRpZXNTZWN0aW9uLmVsZW1lbnQ7fQpzdGF0aWMgQ29tcGFyZVByb3BlcnRpZXMocHJvcGVydHlBLHByb3BlcnR5Qil7Y29uc3QgYT1wcm9wZXJ0eUEubmFtZTtjb25zdCBiPXByb3BlcnR5Qi5uYW1lO2lmKGE9PT0nX19wcm90b19fJykKcmV0dXJuIDE7aWYoYj09PSdfX3Byb3RvX18nKQpyZXR1cm4tMTtpZighcHJvcGVydHlBLmVudW1lcmFibGUmJnByb3BlcnR5Qi5lbnVtZXJhYmxlKQpyZXR1cm4gMTtpZighcHJvcGVydHlCLmVudW1lcmFibGUmJnByb3BlcnR5QS5lbnVtZXJhYmxlKQpyZXR1cm4tMTtpZihhLnN0YXJ0c1dpdGgoJ18nKSYmIWIuc3RhcnRzV2l0aCgnXycpKQpyZXR1cm4gMTtpZihiLnN0YXJ0c1dpdGgoJ18nKSYmIWEuc3RhcnRzV2l0aCgnXycpKQpyZXR1cm4tMTtpZihwcm9wZXJ0eUEuc3ltYm9sJiYhcHJvcGVydHlCLnN5bWJvbCkKcmV0dXJuIDE7aWYocHJvcGVydHlCLnN5bWJvbCYmIXByb3BlcnR5QS5zeW1ib2wpCnJldHVybi0xO3JldHVybiBTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcihhLGIpO30Kc3RhdGljIGNyZWF0ZU5hbWVFbGVtZW50KG5hbWUpe2NvbnN0IG5hbWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCduYW1lJyk7aWYoL15cc3xccyR8XiR8XG4vLnRlc3QobmFtZSkpCm5hbWVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZHJlbignIicsbmFtZS5yZXBsYWNlKC9cbi9nLCdcdTIxQjUnKSwnIicpO2Vsc2UKbmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bmFtZTtyZXR1cm4gbmFtZUVsZW1lbnQ7fQpzdGF0aWMgdmFsdWVFbGVtZW50Rm9yRnVuY3Rpb25EZXNjcmlwdGlvbihkZXNjcmlwdGlvbixpbmNsdWRlUHJldmlldyxkZWZhdWx0TmFtZSl7Y29uc3QgdmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdvYmplY3QtdmFsdWUtZnVuY3Rpb24nKTtkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbnx8Jyc7Y29uc3QgdGV4dD1kZXNjcmlwdGlvbi5yZXBsYWNlKC9eZnVuY3Rpb24gW2dzXWV0IC8sJ2Z1bmN0aW9uICcpLnJlcGxhY2UoL15mdW5jdGlvbiBbZ3NdZXRcKC8sJ2Z1bmN0aW9uXCgnKS5yZXBsYWNlKC9eW2dzXWV0IC8sJycpO2RlZmF1bHROYW1lPWRlZmF1bHROYW1lfHwnJztjb25zdCBhc3luY01hdGNoPXRleHQubWF0Y2goL14oYXN5bmNccytmdW5jdGlvbikvKTtjb25zdCBpc0dlbmVyYXRvcj10ZXh0LnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uKicpO2NvbnN0IGlzR2VuZXJhdG9yU2hvcnRoYW5kPXRleHQuc3RhcnRzV2l0aCgnKicpO2NvbnN0IGlzQmFzaWM9IWlzR2VuZXJhdG9yJiZ0ZXh0LnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uJyk7Y29uc3QgaXNDbGFzcz10ZXh0LnN0YXJ0c1dpdGgoJ2NsYXNzICcpfHx0ZXh0LnN0YXJ0c1dpdGgoJ2NsYXNzeycpO2NvbnN0IGZpcnN0QXJyb3dJbmRleD10ZXh0LmluZGV4T2YoJz0+Jyk7Y29uc3QgaXNBcnJvdz0hYXN5bmNNYXRjaCYmIWlzR2VuZXJhdG9yJiYhaXNCYXNpYyYmIWlzQ2xhc3MmJmZpcnN0QXJyb3dJbmRleD4wO2xldCB0ZXh0QWZ0ZXJQcmVmaXg7aWYoaXNDbGFzcyl7dGV4dEFmdGVyUHJlZml4PXRleHQuc3Vic3RyaW5nKCdjbGFzcycubGVuZ3RoKTtjb25zdCBjbGFzc05hbWVNYXRjaD0vXltee1xzXSsvLmV4ZWModGV4dEFmdGVyUHJlZml4LnRyaW0oKSk7bGV0IGNsYXNzTmFtZT1kZWZhdWx0TmFtZTtpZihjbGFzc05hbWVNYXRjaCkKY2xhc3NOYW1lPWNsYXNzTmFtZU1hdGNoWzBdLnRyaW0oKXx8ZGVmYXVsdE5hbWU7YWRkRWxlbWVudHMoJ2NsYXNzJyx0ZXh0QWZ0ZXJQcmVmaXgsY2xhc3NOYW1lKTt9ZWxzZSBpZihhc3luY01hdGNoKXt0ZXh0QWZ0ZXJQcmVmaXg9dGV4dC5zdWJzdHJpbmcoYXN5bmNNYXRjaFsxXS5sZW5ndGgpO2FkZEVsZW1lbnRzKCdhc3luYyBcdTAxOTInLHRleHRBZnRlclByZWZpeCxuYW1lQW5kQXJndW1lbnRzKHRleHRBZnRlclByZWZpeCkpO31lbHNlIGlmKGlzR2VuZXJhdG9yKXt0ZXh0QWZ0ZXJQcmVmaXg9dGV4dC5zdWJzdHJpbmcoJ2Z1bmN0aW9uKicubGVuZ3RoKTthZGRFbGVtZW50cygnXHUwMTkyKicsdGV4dEFmdGVyUHJlZml4LG5hbWVBbmRBcmd1bWVudHModGV4dEFmdGVyUHJlZml4KSk7fWVsc2UgaWYoaXNHZW5lcmF0b3JTaG9ydGhhbmQpe3RleHRBZnRlclByZWZpeD10ZXh0LnN1YnN0cmluZygnKicubGVuZ3RoKTthZGRFbGVtZW50cygnXHUwMTkyKicsdGV4dEFmdGVyUHJlZml4LG5hbWVBbmRBcmd1bWVudHModGV4dEFmdGVyUHJlZml4KSk7fWVsc2UgaWYoaXNCYXNpYyl7dGV4dEFmdGVyUHJlZml4PXRleHQuc3Vic3RyaW5nKCdmdW5jdGlvbicubGVuZ3RoKTthZGRFbGVtZW50cygnXHUwMTkyJyx0ZXh0QWZ0ZXJQcmVmaXgsbmFtZUFuZEFyZ3VtZW50cyh0ZXh0QWZ0ZXJQcmVmaXgpKTt9ZWxzZSBpZihpc0Fycm93KXtjb25zdCBtYXhBcnJvd0Z1bmN0aW9uQ2hhcmFjdGVyTGVuZ3RoPTYwO2xldCBhYmJyZXZpYXRpb249dGV4dDtpZihkZWZhdWx0TmFtZSkKYWJicmV2aWF0aW9uPWRlZmF1bHROYW1lKycoKSc7ZWxzZSBpZih0ZXh0Lmxlbmd0aD5tYXhBcnJvd0Z1bmN0aW9uQ2hhcmFjdGVyTGVuZ3RoKQphYmJyZXZpYXRpb249dGV4dC5zdWJzdHJpbmcoMCxmaXJzdEFycm93SW5kZXgrMikrJyB7XHUyMDI2fSc7YWRkRWxlbWVudHMoJycsdGV4dCxhYmJyZXZpYXRpb24pO31lbHNle2FkZEVsZW1lbnRzKCdcdTAxOTInLHRleHQsbmFtZUFuZEFyZ3VtZW50cyh0ZXh0KSk7fQp2YWx1ZUVsZW1lbnQudGl0bGU9ZGVzY3JpcHRpb24udHJpbUVuZCg1MDApO3JldHVybiB2YWx1ZUVsZW1lbnQ7ZnVuY3Rpb24gbmFtZUFuZEFyZ3VtZW50cyhjb250ZW50cyl7Y29uc3Qgc3RhcnRPZkFyZ3VtZW50c0luZGV4PWNvbnRlbnRzLmluZGV4T2YoJygnKTtjb25zdCBlbmRPZkFyZ3VtZW50c01hdGNoPWNvbnRlbnRzLm1hdGNoKC9cKVxzKnsvKTtpZihzdGFydE9mQXJndW1lbnRzSW5kZXghPT0tMSYmZW5kT2ZBcmd1bWVudHNNYXRjaCYmZW5kT2ZBcmd1bWVudHNNYXRjaC5pbmRleD5zdGFydE9mQXJndW1lbnRzSW5kZXgpe2NvbnN0IG5hbWU9Y29udGVudHMuc3Vic3RyaW5nKDAsc3RhcnRPZkFyZ3VtZW50c0luZGV4KS50cmltKCl8fGRlZmF1bHROYW1lO2NvbnN0IGFyZ3M9Y29udGVudHMuc3Vic3RyaW5nKHN0YXJ0T2ZBcmd1bWVudHNJbmRleCxlbmRPZkFyZ3VtZW50c01hdGNoLmluZGV4KzEpO3JldHVybiBuYW1lK2FyZ3M7fQpyZXR1cm4gZGVmYXVsdE5hbWUrJygpJzt9CmZ1bmN0aW9uIGFkZEVsZW1lbnRzKHByZWZpeCxib2R5LGFiYnJldmlhdGlvbil7Y29uc3QgbWF4RnVuY3Rpb25Cb2R5TGVuZ3RoPTIwMDtpZihwcmVmaXgubGVuZ3RoKQp2YWx1ZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdvYmplY3QtdmFsdWUtZnVuY3Rpb24tcHJlZml4JykudGV4dENvbnRlbnQ9cHJlZml4KycgJztpZihpbmNsdWRlUHJldmlldykKdmFsdWVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChib2R5LnRyaW0oKS50cmltRW5kKG1heEZ1bmN0aW9uQm9keUxlbmd0aCkpO2Vsc2UKdmFsdWVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChhYmJyZXZpYXRpb24ucmVwbGFjZSgvXG4vZywnICcpKTt9fQpzdGF0aWMgY3JlYXRlVmFsdWVFbGVtZW50V2l0aEN1c3RvbVN1cHBvcnQodmFsdWUsd2FzVGhyb3duLHNob3dQcmV2aWV3LHBhcmVudEVsZW1lbnQsbGlua2lmaWVyKXtpZih2YWx1ZS5jdXN0b21QcmV2aWV3KCkpe2NvbnN0IHJlc3VsdD0obmV3IE9iamVjdFVJLkN1c3RvbVByZXZpZXdDb21wb25lbnQodmFsdWUpKS5lbGVtZW50O3Jlc3VsdC5jbGFzc0xpc3QuYWRkKCdvYmplY3QtcHJvcGVydGllcy1zZWN0aW9uLWN1c3RvbS1zZWN0aW9uJyk7cmV0dXJuIHJlc3VsdDt9CnJldHVybiBPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVWYWx1ZUVsZW1lbnQodmFsdWUsd2FzVGhyb3duLHNob3dQcmV2aWV3LHBhcmVudEVsZW1lbnQsbGlua2lmaWVyKTt9CnN0YXRpYyBjcmVhdGVWYWx1ZUVsZW1lbnQodmFsdWUsd2FzVGhyb3duLHNob3dQcmV2aWV3LHBhcmVudEVsZW1lbnQsbGlua2lmaWVyKXtsZXQgdmFsdWVFbGVtZW50O2NvbnN0IHR5cGU9dmFsdWUudHlwZTtjb25zdCBzdWJ0eXBlPXZhbHVlLnN1YnR5cGU7Y29uc3QgZGVzY3JpcHRpb249dmFsdWUuZGVzY3JpcHRpb247aWYodHlwZT09PSdvYmplY3QnJiZzdWJ0eXBlPT09J2ludGVybmFsI2xvY2F0aW9uJyl7Y29uc3QgcmF3TG9jYXRpb249dmFsdWUuZGVidWdnZXJNb2RlbCgpLmNyZWF0ZVJhd0xvY2F0aW9uQnlTY3JpcHRJZCh2YWx1ZS52YWx1ZS5zY3JpcHRJZCx2YWx1ZS52YWx1ZS5saW5lTnVtYmVyLHZhbHVlLnZhbHVlLmNvbHVtbk51bWJlcik7aWYocmF3TG9jYXRpb24mJmxpbmtpZmllcikKcmV0dXJuIGxpbmtpZmllci5saW5raWZ5UmF3TG9jYXRpb24ocmF3TG9jYXRpb24sJycpO3ZhbHVlRWxlbWVudD1jcmVhdGVVbmtub3duSW50ZXJuYWxMb2NhdGlvbkVsZW1lbnQoKTt9ZWxzZSBpZih0eXBlPT09J3N0cmluZycmJnR5cGVvZiBkZXNjcmlwdGlvbj09PSdzdHJpbmcnKXt2YWx1ZUVsZW1lbnQ9Y3JlYXRlU3RyaW5nRWxlbWVudCgpO31lbHNlIGlmKHR5cGU9PT0nZnVuY3Rpb24nKXt2YWx1ZUVsZW1lbnQ9T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24udmFsdWVFbGVtZW50Rm9yRnVuY3Rpb25EZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7fWVsc2UgaWYodHlwZT09PSdvYmplY3QnJiZzdWJ0eXBlPT09J25vZGUnJiZkZXNjcmlwdGlvbil7dmFsdWVFbGVtZW50PWNyZWF0ZU5vZGVFbGVtZW50KCk7fWVsc2UgaWYodHlwZT09PSdudW1iZXInJiZkZXNjcmlwdGlvbiYmZGVzY3JpcHRpb24uaW5kZXhPZignZScpIT09LTEpe3ZhbHVlRWxlbWVudD1jcmVhdGVOdW1iZXJXaXRoRXhwb25lbnRFbGVtZW50KCk7aWYocGFyZW50RWxlbWVudCkKcGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoYm94Jyk7fWVsc2V7dmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdvYmplY3QtdmFsdWUtJysoc3VidHlwZXx8dHlwZSkpO3ZhbHVlRWxlbWVudC50aXRsZT1kZXNjcmlwdGlvbnx8Jyc7aWYodmFsdWUucHJldmlldyYmc2hvd1ByZXZpZXcpe2NvbnN0IHByZXZpZXdGb3JtYXR0ZXI9bmV3IE9iamVjdFVJLlJlbW90ZU9iamVjdFByZXZpZXdGb3JtYXR0ZXIoKTtwcmV2aWV3Rm9ybWF0dGVyLmFwcGVuZE9iamVjdFByZXZpZXcodmFsdWVFbGVtZW50LHZhbHVlLnByZXZpZXcsZmFsc2UpO31lbHNlIGlmKGRlc2NyaXB0aW9uLmxlbmd0aD5PYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5fbWF4UmVuZGVyYWJsZVN0cmluZ0xlbmd0aCl7dmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKFVJLmNyZWF0ZUV4cGFuZGFibGVUZXh0KGRlc2NyaXB0aW9uLDUwKSk7fWVsc2V7dmFsdWVFbGVtZW50LnRleHRDb250ZW50PWRlc2NyaXB0aW9uO319CmlmKHdhc1Rocm93bil7Y29uc3Qgd3JhcHBlckVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ2Vycm9yIHZhbHVlJyk7d3JhcHBlckVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCdbJytDb21tb24uVUlTdHJpbmcoJ0V4Y2VwdGlvbicpKyc6ICcpO3dyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlRWxlbWVudCk7d3JhcHBlckVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCddJyk7cmV0dXJuIHdyYXBwZXJFbGVtZW50O30KdmFsdWVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3ZhbHVlJyk7cmV0dXJuIHZhbHVlRWxlbWVudDtmdW5jdGlvbiBjcmVhdGVVbmtub3duSW50ZXJuYWxMb2NhdGlvbkVsZW1lbnQoKXtjb25zdCB2YWx1ZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicpO3ZhbHVlRWxlbWVudC50ZXh0Q29udGVudD0nPCcrQ29tbW9uLlVJU3RyaW5nKCd1bmtub3duJykrJz4nO3ZhbHVlRWxlbWVudC50aXRsZT1kZXNjcmlwdGlvbnx8Jyc7cmV0dXJuIHZhbHVlRWxlbWVudDt9CmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ0VsZW1lbnQoKXtjb25zdCB2YWx1ZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ29iamVjdC12YWx1ZS1zdHJpbmcnKTtjb25zdCB0ZXh0PWRlc2NyaXB0aW9uLnJlcGxhY2UoL1xuL2csJ1x1MjFCNScpO3ZhbHVlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC12YWx1ZS1zdHJpbmctcXVvdGUnKS50ZXh0Q29udGVudD0nIic7aWYoZGVzY3JpcHRpb24ubGVuZ3RoPk9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLl9tYXhSZW5kZXJhYmxlU3RyaW5nTGVuZ3RoKQp2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoVUkuY3JlYXRlRXhwYW5kYWJsZVRleHQodGV4dCw1MCkpO2Vsc2UKdmFsdWVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCh0ZXh0KTt2YWx1ZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdvYmplY3QtdmFsdWUtc3RyaW5nLXF1b3RlJykudGV4dENvbnRlbnQ9JyInO3ZhbHVlRWxlbWVudC50aXRsZT1kZXNjcmlwdGlvbnx8Jyc7cmV0dXJuIHZhbHVlRWxlbWVudDt9CmZ1bmN0aW9uIGNyZWF0ZU5vZGVFbGVtZW50KCl7Y29uc3QgdmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdvYmplY3QtdmFsdWUtbm9kZScpO09iamVjdFVJLlJlbW90ZU9iamVjdFByZXZpZXdGb3JtYXR0ZXIuY3JlYXRlU3BhbnNGb3JOb2RlVGl0bGUodmFsdWVFbGVtZW50LChkZXNjcmlwdGlvbikpO3ZhbHVlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZXZlbnQ9PntDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHZhbHVlKTtldmVudC5jb25zdW1lKHRydWUpO30sZmFsc2UpO3ZhbHVlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCgpPT5TREsuT3ZlcmxheU1vZGVsLmhpZ2hsaWdodE9iamVjdEFzRE9NTm9kZSh2YWx1ZSksZmFsc2UpO3ZhbHVlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywoKT0+U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpLGZhbHNlKTtyZXR1cm4gdmFsdWVFbGVtZW50O30KZnVuY3Rpb24gY3JlYXRlTnVtYmVyV2l0aEV4cG9uZW50RWxlbWVudCgpe2NvbnN0IHZhbHVlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnb2JqZWN0LXZhbHVlLW51bWJlcicpO2NvbnN0IG51bWJlclBhcnRzPWRlc2NyaXB0aW9uLnNwbGl0KCdlJyk7dmFsdWVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnb2JqZWN0LXZhbHVlLXNjaWVudGlmaWMtbm90YXRpb24tbWFudGlzc2EnKS50ZXh0Q29udGVudD1udW1iZXJQYXJ0c1swXTt2YWx1ZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdvYmplY3QtdmFsdWUtc2NpZW50aWZpYy1ub3RhdGlvbi1leHBvbmVudCcpLnRleHRDb250ZW50PSdlJytudW1iZXJQYXJ0c1sxXTt2YWx1ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb2JqZWN0LXZhbHVlLXNjaWVudGlmaWMtbm90YXRpb24tbnVtYmVyJyk7dmFsdWVFbGVtZW50LnRpdGxlPWRlc2NyaXB0aW9ufHwnJztyZXR1cm4gdmFsdWVFbGVtZW50O319CnN0YXRpYyBmb3JtYXRPYmplY3RBc0Z1bmN0aW9uKGZ1bmMsZWxlbWVudCxsaW5raWZ5LGluY2x1ZGVQcmV2aWV3KXtmdW5jLmRlYnVnZ2VyTW9kZWwoKS5mdW5jdGlvbkRldGFpbHNQcm9taXNlKGZ1bmMpLnRoZW4oZGlkR2V0RGV0YWlscyk7ZnVuY3Rpb24gZGlkR2V0RGV0YWlscyhyZXNwb25zZSl7aWYobGlua2lmeSYmcmVzcG9uc2UmJnJlc3BvbnNlLmxvY2F0aW9uKXtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpbmtpZmllZCcpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT5Db21tb24uUmV2ZWFsZXIucmV2ZWFsKHJlc3BvbnNlLmxvY2F0aW9uKSYmZmFsc2UpO30KbGV0IGRlZmF1bHROYW1lPWluY2x1ZGVQcmV2aWV3PycnOidhbm9ueW1vdXMnO2lmKHJlc3BvbnNlJiZyZXNwb25zZS5mdW5jdGlvbk5hbWUpCmRlZmF1bHROYW1lPXJlc3BvbnNlLmZ1bmN0aW9uTmFtZTtjb25zdCB2YWx1ZUVsZW1lbnQ9T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24udmFsdWVFbGVtZW50Rm9yRnVuY3Rpb25EZXNjcmlwdGlvbihmdW5jLmRlc2NyaXB0aW9uLGluY2x1ZGVQcmV2aWV3LGRlZmF1bHROYW1lKTtlbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlRWxlbWVudCk7fX0Kc2tpcFByb3RvKCl7dGhpcy5fc2tpcFByb3RvPXRydWU7fQpleHBhbmQoKXt0aGlzLl9vYmplY3RUcmVlRWxlbWVudC5leHBhbmQoKTt9CnNldEVkaXRhYmxlKHZhbHVlKXt0aGlzLl9lZGl0YWJsZT12YWx1ZTt9Cm9iamVjdFRyZWVFbGVtZW50KCl7cmV0dXJuIHRoaXMuX29iamVjdFRyZWVFbGVtZW50O30KZW5hYmxlQ29udGV4dE1lbnUoKXt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51RXZlbnRGaXJlZC5iaW5kKHRoaXMpLGZhbHNlKTt9Cl9jb250ZXh0TWVudUV2ZW50RmlyZWQoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHRoaXMuX29iamVjdCk7aWYodGhpcy5fb2JqZWN0IGluc3RhbmNlb2YgU0RLLkxvY2FsSlNPTk9iamVjdCl7Y29udGV4dE1lbnUudmlld1NlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYEV4cGFuZCByZWN1cnNpdmVseWAsdGhpcy5fb2JqZWN0VHJlZUVsZW1lbnQuZXhwYW5kUmVjdXJzaXZlbHkuYmluZCh0aGlzLl9vYmplY3RUcmVlRWxlbWVudCxOdW1iZXIuTUFYX1ZBTFVFKSk7Y29udGV4dE1lbnUudmlld1NlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYENvbGxhcHNlIGNoaWxkcmVuYCx0aGlzLl9vYmplY3RUcmVlRWxlbWVudC5jb2xsYXBzZUNoaWxkcmVuLmJpbmQodGhpcy5fb2JqZWN0VHJlZUVsZW1lbnQpKTt9CmNvbnRleHRNZW51LnNob3coKTt9CnRpdGxlTGVzc01vZGUoKXt0aGlzLl9vYmplY3RUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5fb2JqZWN0VHJlZUVsZW1lbnQuY2hpbGRyZW5MaXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aXRsZS1sZXNzLW1vZGUnKTt0aGlzLl9vYmplY3RUcmVlRWxlbWVudC5leHBhbmQoKTt9fTtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5fYXJyYXlMb2FkVGhyZXNob2xkPTEwMDtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5fbWF4UmVuZGVyYWJsZVN0cmluZ0xlbmd0aD0xMDAwMDtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5Sb290RWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKG9iamVjdCxsaW5raWZpZXIsZW1wdHlQbGFjZWhvbGRlcixpZ25vcmVIYXNPd25Qcm9wZXJ0eSxleHRyYVByb3BlcnRpZXMpe2NvbnN0IGNvbnRlbnRFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2NvbnRlbnQnKTtzdXBlcihjb250ZW50RWxlbWVudCk7dGhpcy5fb2JqZWN0PW9iamVjdDt0aGlzLl9leHRyYVByb3BlcnRpZXM9ZXh0cmFQcm9wZXJ0aWVzfHxbXTt0aGlzLl9pZ25vcmVIYXNPd25Qcm9wZXJ0eT0hIWlnbm9yZUhhc093blByb3BlcnR5O3RoaXMuX2VtcHR5UGxhY2Vob2xkZXI9ZW1wdHlQbGFjZWhvbGRlcjt0aGlzLnNldEV4cGFuZGFibGUodHJ1ZSk7dGhpcy5zZWxlY3RhYmxlPWZhbHNlO3RoaXMudG9nZ2xlT25DbGljaz10cnVlO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24tcm9vdC1lbGVtZW50Jyk7dGhpcy5fbGlua2lmaWVyPWxpbmtpZmllcjt9Cm9uZXhwYW5kKCl7aWYodGhpcy50cmVlT3V0bGluZSkKdGhpcy50cmVlT3V0bGluZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7fQpvbmNvbGxhcHNlKCl7aWYodGhpcy50cmVlT3V0bGluZSkKdGhpcy50cmVlT3V0bGluZS5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7fQpvbmRibGNsaWNrKGUpe3JldHVybiB0cnVlO30Kb25wb3B1bGF0ZSgpe09iamVjdFVJLk9iamVjdFByb3BlcnR5VHJlZUVsZW1lbnQuX3BvcHVsYXRlKHRoaXMsdGhpcy5fb2JqZWN0LCEhdGhpcy50cmVlT3V0bGluZS5fc2tpcFByb3RvLHRoaXMuX2xpbmtpZmllcix0aGlzLl9lbXB0eVBsYWNlaG9sZGVyLHRoaXMuX2lnbm9yZUhhc093blByb3BlcnR5LHRoaXMuX2V4dHJhUHJvcGVydGllcyk7fX07T2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHByb3BlcnR5LGxpbmtpZmllcil7c3VwZXIoKTt0aGlzLnByb3BlcnR5PXByb3BlcnR5O3RoaXMudG9nZ2xlT25DbGljaz10cnVlO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLl9oaWdobGlnaHRDaGFuZ2VzPVtdO3RoaXMuX2xpbmtpZmllcj1saW5raWZpZXI7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2NvbnRleHRNZW51RmlyZWQuYmluZCh0aGlzKSxmYWxzZSk7fQpzdGF0aWMgX3BvcHVsYXRlKHRyZWVFbGVtZW50LHZhbHVlLHNraXBQcm90byxsaW5raWZpZXIsZW1wdHlQbGFjZWhvbGRlcixmbGF0dGVuUHJvdG9DaGFpbixleHRyYVByb3BlcnRpZXMsdGFyZ2V0VmFsdWUpe2lmKHZhbHVlLmFycmF5TGVuZ3RoKCk+T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uX2FycmF5TG9hZFRocmVzaG9sZCl7dHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtPYmplY3RVSS5BcnJheUdyb3VwaW5nVHJlZUVsZW1lbnQuX3BvcHVsYXRlQXJyYXkodHJlZUVsZW1lbnQsdmFsdWUsMCx2YWx1ZS5hcnJheUxlbmd0aCgpLTEsbGlua2lmaWVyKTtyZXR1cm47fQpmdW5jdGlvbiBjYWxsYmFjayhwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyl7dHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtpZighcHJvcGVydGllcykKcmV0dXJuO2V4dHJhUHJvcGVydGllcz1leHRyYVByb3BlcnRpZXN8fFtdO2ZvcihsZXQgaT0wO2k8ZXh0cmFQcm9wZXJ0aWVzLmxlbmd0aDsrK2kpCnByb3BlcnRpZXMucHVzaChleHRyYVByb3BlcnRpZXNbaV0pO09iamVjdFVJLk9iamVjdFByb3BlcnR5VHJlZUVsZW1lbnQucG9wdWxhdGVXaXRoUHJvcGVydGllcyh0cmVlRWxlbWVudCxwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyxza2lwUHJvdG8sdGFyZ2V0VmFsdWV8fHZhbHVlLGxpbmtpZmllcixlbXB0eVBsYWNlaG9sZGVyKTt9CmlmKGZsYXR0ZW5Qcm90b0NoYWluKQp2YWx1ZS5nZXRBbGxQcm9wZXJ0aWVzKGZhbHNlLHRydWUsY2FsbGJhY2spO2Vsc2UKU0RLLlJlbW90ZU9iamVjdC5sb2FkRnJvbU9iamVjdFBlclByb3RvKHZhbHVlLHRydWUsY2FsbGJhY2spO30Kc3RhdGljIHBvcHVsYXRlV2l0aFByb3BlcnRpZXModHJlZU5vZGUscHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMsc2tpcFByb3RvLHZhbHVlLGxpbmtpZmllcixlbXB0eVBsYWNlaG9sZGVyKXtwcm9wZXJ0aWVzLnNvcnQoT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uQ29tcGFyZVByb3BlcnRpZXMpO2NvbnN0IHRhaWxQcm9wZXJ0aWVzPVtdO2xldCBwcm90b1Byb3BlcnR5PW51bGw7Zm9yKGxldCBpPTA7aTxwcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3BlcnR5PXByb3BlcnRpZXNbaV07cHJvcGVydHkucGFyZW50T2JqZWN0PXZhbHVlO2lmKHByb3BlcnR5Lm5hbWU9PT0nX19wcm90b19fJyYmIXByb3BlcnR5LmlzQWNjZXNzb3JQcm9wZXJ0eSgpKXtwcm90b1Byb3BlcnR5PXByb3BlcnR5O2NvbnRpbnVlO30KaWYocHJvcGVydHkuaXNPd24mJnByb3BlcnR5LmdldHRlcil7Y29uc3QgZ2V0dGVyUHJvcGVydHk9bmV3IFNESy5SZW1vdGVPYmplY3RQcm9wZXJ0eSgnZ2V0ICcrcHJvcGVydHkubmFtZSxwcm9wZXJ0eS5nZXR0ZXIsZmFsc2UpO2dldHRlclByb3BlcnR5LnBhcmVudE9iamVjdD12YWx1ZTt0YWlsUHJvcGVydGllcy5wdXNoKGdldHRlclByb3BlcnR5KTt9CmlmKHByb3BlcnR5LmlzT3duJiZwcm9wZXJ0eS5zZXR0ZXIpe2NvbnN0IHNldHRlclByb3BlcnR5PW5ldyBTREsuUmVtb3RlT2JqZWN0UHJvcGVydHkoJ3NldCAnK3Byb3BlcnR5Lm5hbWUscHJvcGVydHkuc2V0dGVyLGZhbHNlKTtzZXR0ZXJQcm9wZXJ0eS5wYXJlbnRPYmplY3Q9dmFsdWU7dGFpbFByb3BlcnRpZXMucHVzaChzZXR0ZXJQcm9wZXJ0eSk7fQpjb25zdCBjYW5TaG93UHJvcGVydHk9cHJvcGVydHkuZ2V0dGVyfHwhcHJvcGVydHkuaXNBY2Nlc3NvclByb3BlcnR5KCk7aWYoY2FuU2hvd1Byb3BlcnR5JiZwcm9wZXJ0eS5uYW1lIT09J19fcHJvdG9fXycpCnRyZWVOb2RlLmFwcGVuZENoaWxkKG5ldyBPYmplY3RVSS5PYmplY3RQcm9wZXJ0eVRyZWVFbGVtZW50KHByb3BlcnR5LGxpbmtpZmllcikpO30KZm9yKGxldCBpPTA7aTx0YWlsUHJvcGVydGllcy5sZW5ndGg7KytpKQp0cmVlTm9kZS5hcHBlbmRDaGlsZChuZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudCh0YWlsUHJvcGVydGllc1tpXSxsaW5raWZpZXIpKTtpZighc2tpcFByb3RvJiZwcm90b1Byb3BlcnR5KQp0cmVlTm9kZS5hcHBlbmRDaGlsZChuZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudChwcm90b1Byb3BlcnR5LGxpbmtpZmllcikpO2lmKGludGVybmFsUHJvcGVydGllcyl7Zm9yKGxldCBpPTA7aTxpbnRlcm5hbFByb3BlcnRpZXMubGVuZ3RoO2krKyl7aW50ZXJuYWxQcm9wZXJ0aWVzW2ldLnBhcmVudE9iamVjdD12YWx1ZTtjb25zdCB0cmVlRWxlbWVudD1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudChpbnRlcm5hbFByb3BlcnRpZXNbaV0sbGlua2lmaWVyKTtpZihpbnRlcm5hbFByb3BlcnRpZXNbaV0ubmFtZT09PSdbW0VudHJpZXNdXScpe3RyZWVFbGVtZW50LnNldEV4cGFuZGFibGUodHJ1ZSk7dHJlZUVsZW1lbnQuZXhwYW5kKCk7fQp0cmVlTm9kZS5hcHBlbmRDaGlsZCh0cmVlRWxlbWVudCk7fX0KT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudC5fYXBwZW5kRW1wdHlQbGFjZWhvbGRlcklmTmVlZGVkKHRyZWVOb2RlLGVtcHR5UGxhY2Vob2xkZXIpO30Kc3RhdGljIF9hcHBlbmRFbXB0eVBsYWNlaG9sZGVySWZOZWVkZWQodHJlZU5vZGUsZW1wdHlQbGFjZWhvbGRlcil7aWYodHJlZU5vZGUuY2hpbGRDb3VudCgpKQpyZXR1cm47Y29uc3QgdGl0bGU9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnZ3JheS1pbmZvLW1lc3NhZ2UnKTt0aXRsZS50ZXh0Q29udGVudD1lbXB0eVBsYWNlaG9sZGVyfHxDb21tb24uVUlTdHJpbmcoJ05vIHByb3BlcnRpZXMnKTtjb25zdCBpbmZvRWxlbWVudD1uZXcgVUkuVHJlZUVsZW1lbnQodGl0bGUpO3RyZWVOb2RlLmFwcGVuZENoaWxkKGluZm9FbGVtZW50KTt9CnN0YXRpYyBjcmVhdGVSZW1vdGVPYmplY3RBY2Nlc3NvclByb3BlcnR5U3BhbihvYmplY3QscHJvcGVydHlQYXRoLGNhbGxiYWNrKXtjb25zdCByb290RWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7Y29uc3QgZWxlbWVudD1yb290RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO2VsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCcoLi4uKScpO2lmKCFvYmplY3QpCnJldHVybiByb290RWxlbWVudDtlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29iamVjdC12YWx1ZS1jYWxjdWxhdGUtdmFsdWUtYnV0dG9uJyk7ZWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0ludm9rZSBwcm9wZXJ0eSBnZXR0ZXInKTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxvbkludm9rZUdldHRlckNsaWNrLGZhbHNlKTtmdW5jdGlvbiBvbkludm9rZUdldHRlckNsaWNrKGV2ZW50KXtldmVudC5jb25zdW1lKCk7b2JqZWN0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCxjYWxsYmFjayk7fQpyZXR1cm4gcm9vdEVsZW1lbnQ7fQpzZXRTZWFyY2hSZWdleChyZWdleCxhZGRpdGlvbmFsQ3NzQ2xhc3NOYW1lKXtsZXQgY3NzQ2xhc3Nlcz1VSS5oaWdobGlnaHRlZFNlYXJjaFJlc3VsdENsYXNzTmFtZTtpZihhZGRpdGlvbmFsQ3NzQ2xhc3NOYW1lKQpjc3NDbGFzc2VzKz0nICcrYWRkaXRpb25hbENzc0NsYXNzTmFtZTt0aGlzLnJldmVydEhpZ2hsaWdodENoYW5nZXMoKTt0aGlzLl9hcHBseVNlYXJjaChyZWdleCx0aGlzLm5hbWVFbGVtZW50LGNzc0NsYXNzZXMpO2NvbnN0IHZhbHVlVHlwZT10aGlzLnByb3BlcnR5LnZhbHVlLnR5cGU7aWYodmFsdWVUeXBlIT09J29iamVjdCcpCnRoaXMuX2FwcGx5U2VhcmNoKHJlZ2V4LHRoaXMudmFsdWVFbGVtZW50LGNzc0NsYXNzZXMpO3JldHVybiEhdGhpcy5faGlnaGxpZ2h0Q2hhbmdlcy5sZW5ndGg7fQpfYXBwbHlTZWFyY2gocmVnZXgsZWxlbWVudCxjc3NDbGFzc05hbWUpe2NvbnN0IHJhbmdlcz1bXTtjb25zdCBjb250ZW50PWVsZW1lbnQudGV4dENvbnRlbnQ7cmVnZXgubGFzdEluZGV4PTA7bGV0IG1hdGNoPXJlZ2V4LmV4ZWMoY29udGVudCk7d2hpbGUobWF0Y2gpe3Jhbmdlcy5wdXNoKG5ldyBUZXh0VXRpbHMuU291cmNlUmFuZ2UobWF0Y2guaW5kZXgsbWF0Y2hbMF0ubGVuZ3RoKSk7bWF0Y2g9cmVnZXguZXhlYyhjb250ZW50KTt9CmlmKHJhbmdlcy5sZW5ndGgpClVJLmhpZ2hsaWdodFJhbmdlc1dpdGhTdHlsZUNsYXNzKGVsZW1lbnQscmFuZ2VzLGNzc0NsYXNzTmFtZSx0aGlzLl9oaWdobGlnaHRDaGFuZ2VzKTt9CnJldmVydEhpZ2hsaWdodENoYW5nZXMoKXtVSS5yZXZlcnREb21DaGFuZ2VzKHRoaXMuX2hpZ2hsaWdodENoYW5nZXMpO3RoaXMuX2hpZ2hsaWdodENoYW5nZXM9W107fQpvbnBvcHVsYXRlKCl7Y29uc3QgcHJvcGVydHlWYWx1ZT0odGhpcy5wcm9wZXJ0eS52YWx1ZSk7Y29uc29sZS5hc3NlcnQocHJvcGVydHlWYWx1ZSk7Y29uc3Qgc2tpcFByb3RvPXRoaXMudHJlZU91dGxpbmU/dGhpcy50cmVlT3V0bGluZS5fc2tpcFByb3RvOnRydWU7Y29uc3QgdGFyZ2V0VmFsdWU9dGhpcy5wcm9wZXJ0eS5uYW1lIT09J19fcHJvdG9fXyc/cHJvcGVydHlWYWx1ZTp0aGlzLnByb3BlcnR5LnBhcmVudE9iamVjdDtPYmplY3RVSS5PYmplY3RQcm9wZXJ0eVRyZWVFbGVtZW50Ll9wb3B1bGF0ZSh0aGlzLHByb3BlcnR5VmFsdWUsc2tpcFByb3RvLHRoaXMuX2xpbmtpZmllcix1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx0YXJnZXRWYWx1ZSk7fQpvbmRibGNsaWNrKGV2ZW50KXtjb25zdCBpbkVkaXRhYmxlRWxlbWVudD1ldmVudC50YXJnZXQuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMudmFsdWVFbGVtZW50KXx8KHRoaXMuZXhwYW5kZWRWYWx1ZUVsZW1lbnQmJmV2ZW50LnRhcmdldC5pc1NlbGZPckRlc2NlbmRhbnQodGhpcy5leHBhbmRlZFZhbHVlRWxlbWVudCkpO2lmKCF0aGlzLnByb3BlcnR5LnZhbHVlLmN1c3RvbVByZXZpZXcoKSYmaW5FZGl0YWJsZUVsZW1lbnQmJih0aGlzLnByb3BlcnR5LndyaXRhYmxlfHx0aGlzLnByb3BlcnR5LnNldHRlcikpCnRoaXMuX3N0YXJ0RWRpdGluZygpO3JldHVybiBmYWxzZTt9Cm9uYXR0YWNoKCl7dGhpcy51cGRhdGUoKTt0aGlzLl91cGRhdGVFeHBhbmRhYmxlKCk7fQpvbmV4cGFuZCgpe3RoaXMuX3Nob3dFeHBhbmRlZFZhbHVlRWxlbWVudCh0cnVlKTt9Cm9uY29sbGFwc2UoKXt0aGlzLl9zaG93RXhwYW5kZWRWYWx1ZUVsZW1lbnQoZmFsc2UpO30KX3Nob3dFeHBhbmRlZFZhbHVlRWxlbWVudCh2YWx1ZSl7aWYoIXRoaXMuZXhwYW5kZWRWYWx1ZUVsZW1lbnQpCnJldHVybjtpZih2YWx1ZSkKdGhpcy5fcm93Q29udGFpbmVyLnJlcGxhY2VDaGlsZCh0aGlzLmV4cGFuZGVkVmFsdWVFbGVtZW50LHRoaXMudmFsdWVFbGVtZW50KTtlbHNlCnRoaXMuX3Jvd0NvbnRhaW5lci5yZXBsYWNlQ2hpbGQodGhpcy52YWx1ZUVsZW1lbnQsdGhpcy5leHBhbmRlZFZhbHVlRWxlbWVudCk7fQpfY3JlYXRlRXhwYW5kZWRWYWx1ZUVsZW1lbnQodmFsdWUpe2NvbnN0IG5lZWRzQWx0ZXJuYXRlVmFsdWU9dmFsdWUuaGFzQ2hpbGRyZW4mJiF2YWx1ZS5jdXN0b21QcmV2aWV3KCkmJnZhbHVlLnN1YnR5cGUhPT0nbm9kZScmJnZhbHVlLnR5cGUhPT0nZnVuY3Rpb24nJiYodmFsdWUudHlwZSE9PSdvYmplY3QnfHx2YWx1ZS5wcmV2aWV3KTtpZighbmVlZHNBbHRlcm5hdGVWYWx1ZSkKcmV0dXJuIG51bGw7Y29uc3QgdmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCd2YWx1ZScpO2lmKHZhbHVlLmRlc2NyaXB0aW9uPT09J09iamVjdCcpCnZhbHVlRWxlbWVudC50ZXh0Q29udGVudD0nJztlbHNlCnZhbHVlRWxlbWVudC5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKHZhbHVlLmRlc2NyaXB0aW9ufHwnJyk7dmFsdWVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29iamVjdC12YWx1ZS0nKyh2YWx1ZS5zdWJ0eXBlfHx2YWx1ZS50eXBlKSk7dmFsdWVFbGVtZW50LnRpdGxlPXZhbHVlLmRlc2NyaXB0aW9ufHwnJztyZXR1cm4gdmFsdWVFbGVtZW50O30KdXBkYXRlKCl7dGhpcy5uYW1lRWxlbWVudD1PYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVOYW1lRWxlbWVudCh0aGlzLnByb3BlcnR5Lm5hbWUpO2lmKCF0aGlzLnByb3BlcnR5LmVudW1lcmFibGUpCnRoaXMubmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbi1kaW1tZWQnKTtpZih0aGlzLnByb3BlcnR5LnN5bnRoZXRpYykKdGhpcy5uYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzeW50aGV0aWMtcHJvcGVydHknKTt0aGlzLl91cGRhdGVQcm9wZXJ0eVBhdGgoKTtpZih0aGlzLnByb3BlcnR5LnZhbHVlKXtjb25zdCBzaG93UHJldmlldz10aGlzLnByb3BlcnR5Lm5hbWUhPT0nX19wcm90b19fJzt0aGlzLnZhbHVlRWxlbWVudD1PYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVWYWx1ZUVsZW1lbnRXaXRoQ3VzdG9tU3VwcG9ydCh0aGlzLnByb3BlcnR5LnZhbHVlLHRoaXMucHJvcGVydHkud2FzVGhyb3duLHNob3dQcmV2aWV3LHRoaXMubGlzdEl0ZW1FbGVtZW50LHRoaXMuX2xpbmtpZmllcik7fWVsc2UgaWYodGhpcy5wcm9wZXJ0eS5nZXR0ZXIpe3RoaXMudmFsdWVFbGVtZW50PU9iamVjdFVJLk9iamVjdFByb3BlcnR5VHJlZUVsZW1lbnQuY3JlYXRlUmVtb3RlT2JqZWN0QWNjZXNzb3JQcm9wZXJ0eVNwYW4odGhpcy5wcm9wZXJ0eS5wYXJlbnRPYmplY3QsW3RoaXMucHJvcGVydHkubmFtZV0sdGhpcy5fb25JbnZva2VHZXR0ZXJDbGljay5iaW5kKHRoaXMpKTt9ZWxzZXt0aGlzLnZhbHVlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnb2JqZWN0LXZhbHVlLXVuZGVmaW5lZCcpO3RoaXMudmFsdWVFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnPHVucmVhZGFibGU+Jyk7dGhpcy52YWx1ZUVsZW1lbnQudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdObyBwcm9wZXJ0eSBnZXR0ZXInKTt9CmNvbnN0IHZhbHVlVGV4dD10aGlzLnZhbHVlRWxlbWVudC50ZXh0Q29udGVudDtpZih0aGlzLnByb3BlcnR5LnZhbHVlJiZ2YWx1ZVRleHQmJiF0aGlzLnByb3BlcnR5Lndhc1Rocm93bikKdGhpcy5leHBhbmRlZFZhbHVlRWxlbWVudD10aGlzLl9jcmVhdGVFeHBhbmRlZFZhbHVlRWxlbWVudCh0aGlzLnByb3BlcnR5LnZhbHVlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3Jvd0NvbnRhaW5lcj1VSS5odG1sYDxzcGFuPiR7dGhpcy5uYW1lRWxlbWVudH06ICR7dGhpcy52YWx1ZUVsZW1lbnR9PC9zcGFuPmA7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcm93Q29udGFpbmVyKTt9Cl91cGRhdGVQcm9wZXJ0eVBhdGgoKXtpZih0aGlzLm5hbWVFbGVtZW50LnRpdGxlKQpyZXR1cm47Y29uc3QgbmFtZT10aGlzLnByb3BlcnR5Lm5hbWU7aWYodGhpcy5wcm9wZXJ0eS5zeW50aGV0aWMpe3RoaXMubmFtZUVsZW1lbnQudGl0bGU9bmFtZTtyZXR1cm47fQpjb25zdCB1c2VEb3ROb3RhdGlvbj0vXihffFwkfFtBLVpdKShffFwkfFtBLVpdfFxkKSokL2k7Y29uc3QgaXNJbnRlZ2VyPS9eWzEtOV1cZCokLztjb25zdCBwYXJlbnRQYXRoPSh0aGlzLnBhcmVudC5uYW1lRWxlbWVudCYmIXRoaXMucGFyZW50LnByb3BlcnR5LnN5bnRoZXRpYyk/dGhpcy5wYXJlbnQubmFtZUVsZW1lbnQudGl0bGU6Jyc7aWYodXNlRG90Tm90YXRpb24udGVzdChuYW1lKSkKdGhpcy5uYW1lRWxlbWVudC50aXRsZT1wYXJlbnRQYXRoP2Ake3BhcmVudFBhdGh9LiR7bmFtZX1gOm5hbWU7ZWxzZSBpZihpc0ludGVnZXIudGVzdChuYW1lKSkKdGhpcy5uYW1lRWxlbWVudC50aXRsZT1wYXJlbnRQYXRoKydbJytuYW1lKyddJztlbHNlCnRoaXMubmFtZUVsZW1lbnQudGl0bGU9cGFyZW50UGF0aCsnWyInK0pTT04uc3RyaW5naWZ5KG5hbWUpKyciXSc7fQpfY29udGV4dE1lbnVGaXJlZChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXModGhpcyk7aWYodGhpcy5wcm9wZXJ0eS5zeW1ib2wpCmNvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyh0aGlzLnByb3BlcnR5LnN5bWJvbCk7aWYodGhpcy5wcm9wZXJ0eS52YWx1ZSkKY29udGV4dE1lbnUuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHRoaXMucHJvcGVydHkudmFsdWUpO2lmKCF0aGlzLnByb3BlcnR5LnN5bnRoZXRpYyYmdGhpcy5uYW1lRWxlbWVudCYmdGhpcy5uYW1lRWxlbWVudC50aXRsZSl7Y29uc3QgY29weVBhdGhIYW5kbGVyPUluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dC5iaW5kKEluc3BlY3RvckZyb250ZW5kSG9zdCx0aGlzLm5hbWVFbGVtZW50LnRpdGxlKTtjb250ZXh0TWVudS5jbGlwYm9hcmRTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BDb3B5IHByb3BlcnR5IHBhdGhgLGNvcHlQYXRoSGFuZGxlcik7fQppZih0aGlzLnByb3BlcnR5LnBhcmVudE9iamVjdCBpbnN0YW5jZW9mIFNESy5Mb2NhbEpTT05PYmplY3Qpe2NvbnRleHRNZW51LnZpZXdTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BFeHBhbmQgcmVjdXJzaXZlbHlgLHRoaXMuZXhwYW5kUmVjdXJzaXZlbHkuYmluZCh0aGlzLE51bWJlci5NQVhfVkFMVUUpKTtjb250ZXh0TWVudS52aWV3U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgQ29sbGFwc2UgY2hpbGRyZW5gLHRoaXMuY29sbGFwc2VDaGlsZHJlbi5iaW5kKHRoaXMpKTt9CmNvbnRleHRNZW51LnNob3coKTt9Cl9zdGFydEVkaXRpbmcoKXtpZih0aGlzLl9wcm9tcHR8fCF0aGlzLnRyZWVPdXRsaW5lLl9lZGl0YWJsZXx8dGhpcy5fcmVhZE9ubHkpCnJldHVybjt0aGlzLl9lZGl0YWJsZURpdj10aGlzLl9yb3dDb250YWluZXIuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdlZGl0YWJsZS1kaXYnKTtsZXQgdGV4dD10aGlzLnByb3BlcnR5LnZhbHVlLmRlc2NyaXB0aW9uO2lmKHRoaXMucHJvcGVydHkudmFsdWUudHlwZT09PSdzdHJpbmcnJiZ0eXBlb2YgdGV4dD09PSdzdHJpbmcnKQp0ZXh0PSciJyt0ZXh0KyciJzt0aGlzLl9lZGl0YWJsZURpdi5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKHRleHQsQ29tbW9uLlVJU3RyaW5nKCc8c3RyaW5nIGlzIHRvbyBsYXJnZSB0byBlZGl0PicpKTtjb25zdCBvcmlnaW5hbENvbnRlbnQ9dGhpcy5fZWRpdGFibGVEaXYudGV4dENvbnRlbnQ7dGhpcy5zZXRFeHBhbmRhYmxlKGZhbHNlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlZGl0aW5nLXN1Yi1wYXJ0Jyk7dGhpcy52YWx1ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5fcHJvbXB0PW5ldyBPYmplY3RVSS5PYmplY3RQcm9wZXJ0eVByb21wdCgpO2NvbnN0IHByb3h5RWxlbWVudD10aGlzLl9wcm9tcHQuYXR0YWNoQW5kU3RhcnRFZGl0aW5nKHRoaXMuX2VkaXRhYmxlRGl2LHRoaXMuX2VkaXRpbmdDb21taXR0ZWQuYmluZCh0aGlzLG9yaWdpbmFsQ29udGVudCkpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmdldENvbXBvbmVudFNlbGVjdGlvbigpLnNlbGVjdEFsbENoaWxkcmVuKHRoaXMuX2VkaXRhYmxlRGl2KTtwcm94eUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fcHJvbXB0S2V5RG93bi5iaW5kKHRoaXMsb3JpZ2luYWxDb250ZW50KSxmYWxzZSk7fQpfZWRpdGluZ0VuZGVkKCl7dGhpcy5fcHJvbXB0LmRldGFjaCgpO2RlbGV0ZSB0aGlzLl9wcm9tcHQ7dGhpcy5fZWRpdGFibGVEaXYucmVtb3ZlKCk7dGhpcy5fdXBkYXRlRXhwYW5kYWJsZSgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LnNjcm9sbExlZnQ9MDt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdlZGl0aW5nLXN1Yi1wYXJ0Jyk7fQpfZWRpdGluZ0NhbmNlbGxlZCgpe3RoaXMudmFsdWVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO3RoaXMuX2VkaXRpbmdFbmRlZCgpO30KX2VkaXRpbmdDb21taXR0ZWQob3JpZ2luYWxDb250ZW50KXtjb25zdCB1c2VySW5wdXQ9dGhpcy5fcHJvbXB0LnRleHQoKTtpZih1c2VySW5wdXQ9PT1vcmlnaW5hbENvbnRlbnQpe3RoaXMuX2VkaXRpbmdDYW5jZWxsZWQoKTtyZXR1cm47fQp0aGlzLl9lZGl0aW5nRW5kZWQoKTt0aGlzLl9hcHBseUV4cHJlc3Npb24odXNlcklucHV0KTt9Cl9wcm9tcHRLZXlEb3duKG9yaWdpbmFsQ29udGVudCxldmVudCl7aWYoaXNFbnRlcktleShldmVudCkpe2V2ZW50LmNvbnN1bWUoKTt0aGlzLl9lZGl0aW5nQ29tbWl0dGVkKG9yaWdpbmFsQ29udGVudCk7cmV0dXJuO30KaWYoZXZlbnQua2V5PT09J0VzY2FwZScpe2V2ZW50LmNvbnN1bWUoKTt0aGlzLl9lZGl0aW5nQ2FuY2VsbGVkKCk7cmV0dXJuO319CmFzeW5jIF9hcHBseUV4cHJlc3Npb24oZXhwcmVzc2lvbil7Y29uc3QgcHJvcGVydHk9U0RLLlJlbW90ZU9iamVjdC50b0NhbGxBcmd1bWVudCh0aGlzLnByb3BlcnR5LnN5bWJvbHx8dGhpcy5wcm9wZXJ0eS5uYW1lKTtleHByZXNzaW9uPVNESy5SdW50aW1lTW9kZWwud3JhcE9iamVjdExpdGVyYWxFeHByZXNzaW9uSWZOZWVkZWQoZXhwcmVzc2lvbi50cmltKCkpO2lmKHRoaXMucHJvcGVydHkuc3ludGhldGljKXtsZXQgaW52YWxpZGF0ZT1mYWxzZTtpZihleHByZXNzaW9uKQppbnZhbGlkYXRlPWF3YWl0IHRoaXMucHJvcGVydHkuc2V0U3ludGhldGljVmFsdWUoZXhwcmVzc2lvbik7aWYoaW52YWxpZGF0ZSl7Y29uc3QgcGFyZW50PXRoaXMucGFyZW50O3BhcmVudC5pbnZhbGlkYXRlQ2hpbGRyZW4oKTtwYXJlbnQub25wb3B1bGF0ZSgpO31lbHNle3RoaXMudXBkYXRlKCk7fQpyZXR1cm47fQpjb25zdCBlcnJvclByb21pc2U9ZXhwcmVzc2lvbj90aGlzLnByb3BlcnR5LnBhcmVudE9iamVjdC5zZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LGV4cHJlc3Npb24pOnRoaXMucHJvcGVydHkucGFyZW50T2JqZWN0LmRlbGV0ZVByb3BlcnR5KHByb3BlcnR5KTtjb25zdCBlcnJvcj1hd2FpdCBlcnJvclByb21pc2U7aWYoZXJyb3Ipe3RoaXMudXBkYXRlKCk7cmV0dXJuO30KaWYoIWV4cHJlc3Npb24pe3RoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO31lbHNle2NvbnN0IHBhcmVudD10aGlzLnBhcmVudDtwYXJlbnQuaW52YWxpZGF0ZUNoaWxkcmVuKCk7cGFyZW50Lm9ucG9wdWxhdGUoKTt9fQpfb25JbnZva2VHZXR0ZXJDbGljayhyZXN1bHQsd2FzVGhyb3duKXtpZighcmVzdWx0KQpyZXR1cm47dGhpcy5wcm9wZXJ0eS52YWx1ZT1yZXN1bHQ7dGhpcy5wcm9wZXJ0eS53YXNUaHJvd249d2FzVGhyb3duO3RoaXMudXBkYXRlKCk7dGhpcy5pbnZhbGlkYXRlQ2hpbGRyZW4oKTt0aGlzLl91cGRhdGVFeHBhbmRhYmxlKCk7fQpfdXBkYXRlRXhwYW5kYWJsZSgpe2lmKHRoaXMucHJvcGVydHkudmFsdWUpe3RoaXMuc2V0RXhwYW5kYWJsZSghdGhpcy5wcm9wZXJ0eS52YWx1ZS5jdXN0b21QcmV2aWV3KCkmJnRoaXMucHJvcGVydHkudmFsdWUuaGFzQ2hpbGRyZW4mJiF0aGlzLnByb3BlcnR5Lndhc1Rocm93bik7fWVsc2V7dGhpcy5zZXRFeHBhbmRhYmxlKGZhbHNlKTt9fQpwYXRoKCl7cmV0dXJuIHRoaXMubmFtZUVsZW1lbnQudGl0bGU7fX07T2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Iob2JqZWN0LGZyb21JbmRleCx0b0luZGV4LHByb3BlcnR5Q291bnQsbGlua2lmaWVyKXtzdXBlcihTdHJpbmcuc3ByaW50ZignWyVkIFx1MjAyNiAlZF0nLGZyb21JbmRleCx0b0luZGV4KSx0cnVlKTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fZnJvbUluZGV4PWZyb21JbmRleDt0aGlzLl90b0luZGV4PXRvSW5kZXg7dGhpcy5fb2JqZWN0PW9iamVjdDt0aGlzLl9yZWFkT25seT10cnVlO3RoaXMuX3Byb3BlcnR5Q291bnQ9cHJvcGVydHlDb3VudDt0aGlzLl9saW5raWZpZXI9bGlua2lmaWVyO30Kc3RhdGljIF9wb3B1bGF0ZUFycmF5KHRyZWVOb2RlLG9iamVjdCxmcm9tSW5kZXgsdG9JbmRleCxsaW5raWZpZXIpe09iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fcG9wdWxhdGVSYW5nZXModHJlZU5vZGUsb2JqZWN0LGZyb21JbmRleCx0b0luZGV4LHRydWUsbGlua2lmaWVyKTt9CnN0YXRpYyBfcG9wdWxhdGVSYW5nZXModHJlZU5vZGUsb2JqZWN0LGZyb21JbmRleCx0b0luZGV4LHRvcExldmVsLGxpbmtpZmllcil7b2JqZWN0LmNhbGxGdW5jdGlvbkpTT04ocGFja1Jhbmdlcyxbe3ZhbHVlOmZyb21JbmRleH0se3ZhbHVlOnRvSW5kZXh9LHt2YWx1ZTpPYmplY3RVSS5BcnJheUdyb3VwaW5nVHJlZUVsZW1lbnQuX2J1Y2tldFRocmVzaG9sZH0se3ZhbHVlOk9iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fc3BhcnNlSXRlcmF0aW9uVGhyZXNob2xkfSx7dmFsdWU6T2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50Ll9nZXRPd25Qcm9wZXJ0eU5hbWVzVGhyZXNob2xkfV0sY2FsbGJhY2spO2Z1bmN0aW9uIHBhY2tSYW5nZXMoZnJvbUluZGV4LHRvSW5kZXgsYnVja2V0VGhyZXNob2xkLHNwYXJzZUl0ZXJhdGlvblRocmVzaG9sZCxnZXRPd25Qcm9wZXJ0eU5hbWVzVGhyZXNob2xkKXtsZXQgb3duUHJvcGVydHlOYW1lcz1udWxsO2NvbnN0IGNvbnNlY3V0aXZlUmFuZ2U9KHRvSW5kZXgtZnJvbUluZGV4Pj1zcGFyc2VJdGVyYXRpb25UaHJlc2hvbGQpJiZBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcyk7Y29uc3Qgc2tpcEdldE93blByb3BlcnR5TmFtZXM9Y29uc2VjdXRpdmVSYW5nZSYmKHRvSW5kZXgtZnJvbUluZGV4Pj1nZXRPd25Qcm9wZXJ0eU5hbWVzVGhyZXNob2xkKTtmdW5jdGlvbiphcnJheUluZGV4ZXMob2JqZWN0KXtpZih0b0luZGV4LWZyb21JbmRleDxzcGFyc2VJdGVyYXRpb25UaHJlc2hvbGQpe2ZvcihsZXQgaT1mcm9tSW5kZXg7aTw9dG9JbmRleDsrK2kpe2lmKGkgaW4gb2JqZWN0KQp5aWVsZCBpO319ZWxzZXtvd25Qcm9wZXJ0eU5hbWVzPW93blByb3BlcnR5TmFtZXN8fE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7Zm9yKGxldCBpPTA7aTxvd25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsrK2kpe2NvbnN0IG5hbWU9b3duUHJvcGVydHlOYW1lc1tpXTtjb25zdCBpbmRleD1uYW1lPj4+MDtpZigoJycraW5kZXgpPT09bmFtZSYmZnJvbUluZGV4PD1pbmRleCYmaW5kZXg8PXRvSW5kZXgpCnlpZWxkIGluZGV4O319fQpsZXQgY291bnQ9MDtpZihjb25zZWN1dGl2ZVJhbmdlKXtjb3VudD10b0luZGV4LWZyb21JbmRleCsxO31lbHNle2Zvcihjb25zdCBpIG9mIGFycmF5SW5kZXhlcyh0aGlzKSkKKytjb3VudDt9CmxldCBidWNrZXRTaXplPWNvdW50O2lmKGNvdW50PD1idWNrZXRUaHJlc2hvbGQpCmJ1Y2tldFNpemU9Y291bnQ7ZWxzZQpidWNrZXRTaXplPU1hdGgucG93KGJ1Y2tldFRocmVzaG9sZCxNYXRoLmNlaWwoTWF0aC5sb2coY291bnQpL01hdGgubG9nKGJ1Y2tldFRocmVzaG9sZCkpLTEpO2NvbnN0IHJhbmdlcz1bXTtpZihjb25zZWN1dGl2ZVJhbmdlKXtmb3IobGV0IGk9ZnJvbUluZGV4O2k8PXRvSW5kZXg7aSs9YnVja2V0U2l6ZSl7Y29uc3QgZ3JvdXBTdGFydD1pO2xldCBncm91cEVuZD1ncm91cFN0YXJ0K2J1Y2tldFNpemUtMTtpZihncm91cEVuZD50b0luZGV4KQpncm91cEVuZD10b0luZGV4O3Jhbmdlcy5wdXNoKFtncm91cFN0YXJ0LGdyb3VwRW5kLGdyb3VwRW5kLWdyb3VwU3RhcnQrMV0pO319ZWxzZXtjb3VudD0wO2xldCBncm91cFN0YXJ0PS0xO2xldCBncm91cEVuZD0wO2Zvcihjb25zdCBpIG9mIGFycmF5SW5kZXhlcyh0aGlzKSl7aWYoZ3JvdXBTdGFydD09PS0xKQpncm91cFN0YXJ0PWk7Z3JvdXBFbmQ9aTtpZigrK2NvdW50PT09YnVja2V0U2l6ZSl7cmFuZ2VzLnB1c2goW2dyb3VwU3RhcnQsZ3JvdXBFbmQsY291bnRdKTtjb3VudD0wO2dyb3VwU3RhcnQ9LTE7fX0KaWYoY291bnQ+MCkKcmFuZ2VzLnB1c2goW2dyb3VwU3RhcnQsZ3JvdXBFbmQsY291bnRdKTt9CnJldHVybntyYW5nZXM6cmFuZ2VzLHNraXBHZXRPd25Qcm9wZXJ0eU5hbWVzOnNraXBHZXRPd25Qcm9wZXJ0eU5hbWVzfTt9CmZ1bmN0aW9uIGNhbGxiYWNrKHJlc3VsdCl7aWYoIXJlc3VsdCkKcmV0dXJuO2NvbnN0IHJhbmdlcz0ocmVzdWx0LnJhbmdlcyk7aWYocmFuZ2VzLmxlbmd0aD09PTEpe09iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fcG9wdWxhdGVBc0ZyYWdtZW50KHRyZWVOb2RlLG9iamVjdCxyYW5nZXNbMF1bMF0scmFuZ2VzWzBdWzFdLGxpbmtpZmllcik7fWVsc2V7Zm9yKGxldCBpPTA7aTxyYW5nZXMubGVuZ3RoOysraSl7Y29uc3QgZnJvbUluZGV4PXJhbmdlc1tpXVswXTtjb25zdCB0b0luZGV4PXJhbmdlc1tpXVsxXTtjb25zdCBjb3VudD1yYW5nZXNbaV1bMl07aWYoZnJvbUluZGV4PT09dG9JbmRleCkKT2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50Ll9wb3B1bGF0ZUFzRnJhZ21lbnQodHJlZU5vZGUsb2JqZWN0LGZyb21JbmRleCx0b0luZGV4LGxpbmtpZmllcik7ZWxzZQp0cmVlTm9kZS5hcHBlbmRDaGlsZChuZXcgT2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50KG9iamVjdCxmcm9tSW5kZXgsdG9JbmRleCxjb3VudCxsaW5raWZpZXIpKTt9fQppZih0b3BMZXZlbCl7T2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50Ll9wb3B1bGF0ZU5vbkluZGV4UHJvcGVydGllcyh0cmVlTm9kZSxvYmplY3QscmVzdWx0LnNraXBHZXRPd25Qcm9wZXJ0eU5hbWVzLGxpbmtpZmllcik7fX19CnN0YXRpYyBfcG9wdWxhdGVBc0ZyYWdtZW50KHRyZWVOb2RlLG9iamVjdCxmcm9tSW5kZXgsdG9JbmRleCxsaW5raWZpZXIpe29iamVjdC5jYWxsRnVuY3Rpb24oYnVpbGRBcnJheUZyYWdtZW50LFt7dmFsdWU6ZnJvbUluZGV4fSx7dmFsdWU6dG9JbmRleH0se3ZhbHVlOk9iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fc3BhcnNlSXRlcmF0aW9uVGhyZXNob2xkfV0scHJvY2Vzc0FycmF5RnJhZ21lbnQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gYnVpbGRBcnJheUZyYWdtZW50KGZyb21JbmRleCx0b0luZGV4LHNwYXJzZUl0ZXJhdGlvblRocmVzaG9sZCl7Y29uc3QgcmVzdWx0PU9iamVjdC5jcmVhdGUobnVsbCk7aWYodG9JbmRleC1mcm9tSW5kZXg8c3BhcnNlSXRlcmF0aW9uVGhyZXNob2xkKXtmb3IobGV0IGk9ZnJvbUluZGV4O2k8PXRvSW5kZXg7KytpKXtpZihpIGluIHRoaXMpCnJlc3VsdFtpXT10aGlzW2ldO319ZWxzZXtjb25zdCBvd25Qcm9wZXJ0eU5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpO2ZvcihsZXQgaT0wO2k8b3duUHJvcGVydHlOYW1lcy5sZW5ndGg7KytpKXtjb25zdCBuYW1lPW93blByb3BlcnR5TmFtZXNbaV07Y29uc3QgaW5kZXg9bmFtZT4+PjA7aWYoU3RyaW5nKGluZGV4KT09PW5hbWUmJmZyb21JbmRleDw9aW5kZXgmJmluZGV4PD10b0luZGV4KQpyZXN1bHRbaW5kZXhdPXRoaXNbaW5kZXhdO319CnJldHVybiByZXN1bHQ7fQpmdW5jdGlvbiBwcm9jZXNzQXJyYXlGcmFnbWVudChhcnJheUZyYWdtZW50LHdhc1Rocm93bil7aWYoIWFycmF5RnJhZ21lbnR8fHdhc1Rocm93bikKcmV0dXJuO2FycmF5RnJhZ21lbnQuZ2V0QWxsUHJvcGVydGllcyhmYWxzZSx0cnVlLHByb2Nlc3NQcm9wZXJ0aWVzLmJpbmQodGhpcykpO30KZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMocHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpe2lmKCFwcm9wZXJ0aWVzKQpyZXR1cm47cHJvcGVydGllcy5zb3J0KE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLkNvbXBhcmVQcm9wZXJ0aWVzKTtmb3IobGV0IGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoOysraSl7cHJvcGVydGllc1tpXS5wYXJlbnRPYmplY3Q9dGhpcy5fb2JqZWN0O2NvbnN0IGNoaWxkVHJlZUVsZW1lbnQ9bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnR5VHJlZUVsZW1lbnQocHJvcGVydGllc1tpXSxsaW5raWZpZXIpO2NoaWxkVHJlZUVsZW1lbnQuX3JlYWRPbmx5PXRydWU7dHJlZU5vZGUuYXBwZW5kQ2hpbGQoY2hpbGRUcmVlRWxlbWVudCk7fX19CnN0YXRpYyBfcG9wdWxhdGVOb25JbmRleFByb3BlcnRpZXModHJlZU5vZGUsb2JqZWN0LHNraXBHZXRPd25Qcm9wZXJ0eU5hbWVzLGxpbmtpZmllcil7b2JqZWN0LmNhbGxGdW5jdGlvbihidWlsZE9iamVjdEZyYWdtZW50LFt7dmFsdWU6c2tpcEdldE93blByb3BlcnR5TmFtZXN9XSxwcm9jZXNzT2JqZWN0RnJhZ21lbnQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gYnVpbGRPYmplY3RGcmFnbWVudChza2lwR2V0T3duUHJvcGVydHlOYW1lcyl7Y29uc3QgcmVzdWx0PXtfX3Byb3RvX186dGhpcy5fX3Byb3RvX199O2lmKHNraXBHZXRPd25Qcm9wZXJ0eU5hbWVzKQpyZXR1cm4gcmVzdWx0O2NvbnN0IG5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpO2ZvcihsZXQgaT0wO2k8bmFtZXMubGVuZ3RoOysraSl7Y29uc3QgbmFtZT1uYW1lc1tpXTtpZihTdHJpbmcobmFtZT4+PjApPT09bmFtZSYmbmFtZT4+PjAhPT0weGZmZmZmZmZmKQpjb250aW51ZTtjb25zdCBkZXNjcmlwdG9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcyxuYW1lKTtpZihkZXNjcmlwdG9yKQpPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LG5hbWUsZGVzY3JpcHRvcik7fQpyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gcHJvY2Vzc09iamVjdEZyYWdtZW50KGFycmF5RnJhZ21lbnQsd2FzVGhyb3duKXtpZighYXJyYXlGcmFnbWVudHx8d2FzVGhyb3duKQpyZXR1cm47YXJyYXlGcmFnbWVudC5nZXRPd25Qcm9wZXJ0aWVzKHRydWUscHJvY2Vzc1Byb3BlcnRpZXMuYmluZCh0aGlzKSk7fQpmdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyl7aWYoIXByb3BlcnRpZXMpCnJldHVybjtwcm9wZXJ0aWVzLnNvcnQoT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uQ29tcGFyZVByb3BlcnRpZXMpO2ZvcihsZXQgaT0wO2k8cHJvcGVydGllcy5sZW5ndGg7KytpKXtwcm9wZXJ0aWVzW2ldLnBhcmVudE9iamVjdD10aGlzLl9vYmplY3Q7Y29uc3QgY2hpbGRUcmVlRWxlbWVudD1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudChwcm9wZXJ0aWVzW2ldLGxpbmtpZmllcik7Y2hpbGRUcmVlRWxlbWVudC5fcmVhZE9ubHk9dHJ1ZTt0cmVlTm9kZS5hcHBlbmRDaGlsZChjaGlsZFRyZWVFbGVtZW50KTt9fX0Kb25wb3B1bGF0ZSgpe2lmKHRoaXMuX3Byb3BlcnR5Q291bnQ+PU9iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fYnVja2V0VGhyZXNob2xkKXtPYmplY3RVSS5BcnJheUdyb3VwaW5nVHJlZUVsZW1lbnQuX3BvcHVsYXRlUmFuZ2VzKHRoaXMsdGhpcy5fb2JqZWN0LHRoaXMuX2Zyb21JbmRleCx0aGlzLl90b0luZGV4LGZhbHNlLHRoaXMuX2xpbmtpZmllcik7cmV0dXJuO30KT2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50Ll9wb3B1bGF0ZUFzRnJhZ21lbnQodGhpcyx0aGlzLl9vYmplY3QsdGhpcy5fZnJvbUluZGV4LHRoaXMuX3RvSW5kZXgsdGhpcy5fbGlua2lmaWVyKTt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbi1uYW1lJyk7fX07T2JqZWN0VUkuQXJyYXlHcm91cGluZ1RyZWVFbGVtZW50Ll9idWNrZXRUaHJlc2hvbGQ9MTAwO09iamVjdFVJLkFycmF5R3JvdXBpbmdUcmVlRWxlbWVudC5fc3BhcnNlSXRlcmF0aW9uVGhyZXNob2xkPTI1MDAwMDtPYmplY3RVSS5BcnJheUdyb3VwaW5nVHJlZUVsZW1lbnQuX2dldE93blByb3BlcnR5TmFtZXNUaHJlc2hvbGQ9NTAwMDAwO09iamVjdFVJLk9iamVjdFByb3BlcnR5UHJvbXB0PWNsYXNzIGV4dGVuZHMgVUkuVGV4dFByb21wdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5pbml0aWFsaXplKE9iamVjdFVJLmphdmFTY3JpcHRBdXRvY29tcGxldGUuY29tcGxldGlvbnNGb3JUZXh0SW5DdXJyZW50Q29udGV4dC5iaW5kKE9iamVjdFVJLmphdmFTY3JpcHRBdXRvY29tcGxldGUpKTt9fTtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbkV4cGFuZENvbnRyb2xsZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9leHBhbmRlZFByb3BlcnRpZXM9bmV3IFNldCgpO30Kd2F0Y2hTZWN0aW9uKGlkLHNlY3Rpb24pe3NlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihVSS5UcmVlT3V0bGluZS5FdmVudHMuRWxlbWVudEF0dGFjaGVkLHRoaXMuX2VsZW1lbnRBdHRhY2hlZCx0aGlzKTtzZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRFeHBhbmRlZCx0aGlzLl9lbGVtZW50RXhwYW5kZWQsdGhpcyk7c2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRyZWVPdXRsaW5lLkV2ZW50cy5FbGVtZW50Q29sbGFwc2VkLHRoaXMuX2VsZW1lbnRDb2xsYXBzZWQsdGhpcyk7c2VjdGlvbltPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbkV4cGFuZENvbnRyb2xsZXIuX3RyZWVPdXRsaW5lSWRdPWlkO2lmKHRoaXMuX2V4cGFuZGVkUHJvcGVydGllcy5oYXMoaWQpKQpzZWN0aW9uLmV4cGFuZCgpO30Kc3RvcFdhdGNoU2VjdGlvbnNXaXRoSWQoaWQpe2Zvcihjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLl9leHBhbmRlZFByb3BlcnRpZXMpe2lmKHByb3BlcnR5LnN0YXJ0c1dpdGgoaWQrJzonKSkKdGhpcy5fZXhwYW5kZWRQcm9wZXJ0aWVzLmRlbGV0ZShwcm9wZXJ0eSk7fX0KX2VsZW1lbnRBdHRhY2hlZChldmVudCl7Y29uc3QgZWxlbWVudD0oZXZlbnQuZGF0YSk7aWYoZWxlbWVudC5pc0V4cGFuZGFibGUoKSYmdGhpcy5fZXhwYW5kZWRQcm9wZXJ0aWVzLmhhcyh0aGlzLl9wcm9wZXJ0eVBhdGgoZWxlbWVudCkpKQplbGVtZW50LmV4cGFuZCgpO30KX2VsZW1lbnRFeHBhbmRlZChldmVudCl7Y29uc3QgZWxlbWVudD0oZXZlbnQuZGF0YSk7dGhpcy5fZXhwYW5kZWRQcm9wZXJ0aWVzLmFkZCh0aGlzLl9wcm9wZXJ0eVBhdGgoZWxlbWVudCkpO30KX2VsZW1lbnRDb2xsYXBzZWQoZXZlbnQpe2NvbnN0IGVsZW1lbnQ9KGV2ZW50LmRhdGEpO3RoaXMuX2V4cGFuZGVkUHJvcGVydGllcy5kZWxldGUodGhpcy5fcHJvcGVydHlQYXRoKGVsZW1lbnQpKTt9Cl9wcm9wZXJ0eVBhdGgodHJlZUVsZW1lbnQpe2NvbnN0IGNhY2hlZFByb3BlcnR5UGF0aD10cmVlRWxlbWVudFtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbkV4cGFuZENvbnRyb2xsZXIuX2NhY2hlZFBhdGhTeW1ib2xdO2lmKGNhY2hlZFByb3BlcnR5UGF0aCkKcmV0dXJuIGNhY2hlZFByb3BlcnR5UGF0aDtsZXQgY3VycmVudD10cmVlRWxlbWVudDtjb25zdCByb290RWxlbWVudD10cmVlRWxlbWVudC50cmVlT3V0bGluZS5vYmplY3RUcmVlRWxlbWVudCgpO2xldCByZXN1bHQ7d2hpbGUoY3VycmVudCE9PXJvb3RFbGVtZW50KXtsZXQgY3VycmVudE5hbWU9Jyc7aWYoY3VycmVudC5wcm9wZXJ0eSkKY3VycmVudE5hbWU9Y3VycmVudC5wcm9wZXJ0eS5uYW1lO2Vsc2UKY3VycmVudE5hbWU9dHlwZW9mIGN1cnJlbnQudGl0bGU9PT0nc3RyaW5nJz9jdXJyZW50LnRpdGxlOmN1cnJlbnQudGl0bGUudGV4dENvbnRlbnQ7cmVzdWx0PWN1cnJlbnROYW1lKyhyZXN1bHQ/Jy4nK3Jlc3VsdDonJyk7Y3VycmVudD1jdXJyZW50LnBhcmVudDt9CmNvbnN0IHRyZWVPdXRsaW5lSWQ9dHJlZUVsZW1lbnQudHJlZU91dGxpbmVbT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb25FeHBhbmRDb250cm9sbGVyLl90cmVlT3V0bGluZUlkXTtyZXN1bHQ9dHJlZU91dGxpbmVJZCsocmVzdWx0Pyc6JytyZXN1bHQ6JycpO3RyZWVFbGVtZW50W09iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uRXhwYW5kQ29udHJvbGxlci5fY2FjaGVkUGF0aFN5bWJvbF09cmVzdWx0O3JldHVybiByZXN1bHQ7fX07T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb25FeHBhbmRDb250cm9sbGVyLl9jYWNoZWRQYXRoU3ltYm9sPVN5bWJvbCgnY2FjaGVkUGF0aCcpO09iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uRXhwYW5kQ29udHJvbGxlci5fdHJlZU91dGxpbmVJZD1TeW1ib2woJ3RyZWVPdXRsaW5lSWQnKTtPYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5SZW5kZXJlcj1jbGFzc3tyZW5kZXIob2JqZWN0LG9wdGlvbnMpe2lmKCEob2JqZWN0IGluc3RhbmNlb2YgU0RLLlJlbW90ZU9iamVjdCkpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NhblwndCByZW5kZXIgJytvYmplY3QpKTtvcHRpb25zPW9wdGlvbnN8fHt9O2NvbnN0IHRpdGxlPW9wdGlvbnMudGl0bGU7Y29uc3Qgc2VjdGlvbj1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24ob2JqZWN0LHRpdGxlKTtpZighdGl0bGUpCnNlY3Rpb24udGl0bGVMZXNzTW9kZSgpO2lmKG9wdGlvbnMuZXhwYW5kZWQpCnNlY3Rpb24uZXhwYW5kKCk7c2VjdGlvbi5lZGl0YWJsZT0hIW9wdGlvbnMuZWRpdGFibGU7cmV0dXJuIFByb21pc2UucmVzb2x2ZShzZWN0aW9uLmVsZW1lbnQpO319OztPYmplY3RVSS5KYXZhU2NyaXB0QXV0b2NvbXBsZXRlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZXhwcmVzc2lvbkNhY2hlPW5ldyBNYXAoKTtTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuQ29tbWFuZEV2YWx1YXRlZCx0aGlzLl9jbGVhckNhY2hlLHRoaXMpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLkV4ZWN1dGlvbkNvbnRleHQsdGhpcy5fY2xlYXJDYWNoZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclJlc3VtZWQsdGhpcy5fY2xlYXJDYWNoZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclBhdXNlZCx0aGlzLl9jbGVhckNhY2hlLHRoaXMpO30KX2NsZWFyQ2FjaGUoKXt0aGlzLl9leHByZXNzaW9uQ2FjaGUuY2xlYXIoKTt9CmFzeW5jIGNvbXBsZXRpb25zRm9yVGV4dEluQ3VycmVudENvbnRleHQoZnVsbFRleHQscXVlcnksZm9yY2Upe2NvbnN0IHRyaW1tZWRUZXh0PWZ1bGxUZXh0LnRyaW0oKTtjb25zdFttYXBDb21wbGV0aW9ucyxleHByZXNzaW9uQ29tcGxldGlvbnNdPWF3YWl0IFByb21pc2UuYWxsKFt0aGlzLl9tYXBDb21wbGV0aW9ucyh0cmltbWVkVGV4dCxxdWVyeSksdGhpcy5fY29tcGxldGlvbnNGb3JFeHByZXNzaW9uKHRyaW1tZWRUZXh0LHF1ZXJ5LGZvcmNlKV0pO3JldHVybiBtYXBDb21wbGV0aW9ucy5jb25jYXQoZXhwcmVzc2lvbkNvbXBsZXRpb25zKTt9CmFzeW5jIGFyZ3VtZW50c0hpbnQoZnVsbFRleHQpe2NvbnN0IGZ1bmN0aW9uQ2FsbD1hd2FpdCBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmZpbmRMYXN0RnVuY3Rpb25DYWxsKGZ1bGxUZXh0KTtpZighZnVuY3Rpb25DYWxsKQpyZXR1cm4gbnVsbDtjb25zdCBleGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighZXhlY3V0aW9uQ29udGV4dCkKcmV0dXJuIG51bGw7Y29uc3QgcmVzdWx0PWF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoe2V4cHJlc3Npb246ZnVuY3Rpb25DYWxsLmJhc2VFeHByZXNzaW9uLG9iamVjdEdyb3VwOidhcmd1bWVudHNIaW50JyxpbmNsdWRlQ29tbWFuZExpbmVBUEk6dHJ1ZSxzaWxlbnQ6dHJ1ZSxyZXR1cm5CeVZhbHVlOmZhbHNlLGdlbmVyYXRlUHJldmlldzpmYWxzZSx0aHJvd09uU2lkZUVmZmVjdDpmdW5jdGlvbkNhbGwucG9zc2libGVTaWRlRWZmZWN0cyx0aW1lb3V0OmZ1bmN0aW9uQ2FsbC5wb3NzaWJsZVNpZGVFZmZlY3RzPzUwMDp1bmRlZmluZWR9LGZhbHNlLGZhbHNlKTtpZighcmVzdWx0fHxyZXN1bHQuZXhjZXB0aW9uRGV0YWlsc3x8IXJlc3VsdC5vYmplY3R8fHJlc3VsdC5vYmplY3QudHlwZSE9PSdmdW5jdGlvbicpe2V4ZWN1dGlvbkNvbnRleHQucnVudGltZU1vZGVsLnJlbGVhc2VPYmplY3RHcm91cCgnYXJndW1lbnRzSGludCcpO3JldHVybiBudWxsO30KY29uc3QgYXJncz1hd2FpdCB0aGlzLl9hcmd1bWVudHNGb3JGdW5jdGlvbihyZXN1bHQub2JqZWN0LGFzeW5jKCk9Pntjb25zdCByZXN1bHQ9YXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSh7ZXhwcmVzc2lvbjpmdW5jdGlvbkNhbGwucmVjZWl2ZXIsb2JqZWN0R3JvdXA6J2FyZ3VtZW50c0hpbnQnLGluY2x1ZGVDb21tYW5kTGluZUFQSTp0cnVlLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6ZmFsc2UsZ2VuZXJhdGVQcmV2aWV3OmZhbHNlLHRocm93T25TaWRlRWZmZWN0OmZ1bmN0aW9uQ2FsbC5wb3NzaWJsZVNpZGVFZmZlY3RzLHRpbWVvdXQ6ZnVuY3Rpb25DYWxsLnBvc3NpYmxlU2lkZUVmZmVjdHM/NTAwOnVuZGVmaW5lZH0sZmFsc2UsZmFsc2UpO3JldHVybihyZXN1bHQmJiFyZXN1bHQuZXhjZXB0aW9uRGV0YWlscyk/cmVzdWx0Lm9iamVjdDpudWxsO30sZnVuY3Rpb25DYWxsLmZ1bmN0aW9uTmFtZSk7ZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWwucmVsZWFzZU9iamVjdEdyb3VwKCdhcmd1bWVudHNIaW50Jyk7aWYoIWFyZ3MubGVuZ3RofHwoYXJncy5sZW5ndGg9PT0xJiYhYXJnc1swXS5sZW5ndGgpKQpyZXR1cm4gbnVsbDtyZXR1cm57YXJncyxhcmd1bWVudEluZGV4OmZ1bmN0aW9uQ2FsbC5hcmd1bWVudEluZGV4fTt9CmFzeW5jIF9hcmd1bWVudHNGb3JGdW5jdGlvbihmdW5jdGlvbk9iamVjdCxyZWNlaXZlck9iakdldHRlcixwYXJzZWRGdW5jdGlvbk5hbWUpe2NvbnN0IGRlc2NyaXB0aW9uPWZ1bmN0aW9uT2JqZWN0LmRlc2NyaXB0aW9uO2lmKCFkZXNjcmlwdGlvbi5lbmRzV2l0aCgneyBbbmF0aXZlIGNvZGVdIH0nKSkKcmV0dXJuW2F3YWl0IEZvcm1hdHRlci5mb3JtYXR0ZXJXb3JrZXJQb29sKCkuYXJndW1lbnRzTGlzdChkZXNjcmlwdGlvbildO2lmKGRlc2NyaXB0aW9uPT09J2Z1bmN0aW9uICgpIHsgW25hdGl2ZSBjb2RlXSB9Jyl7Y29uc3QgcHJvcGVydGllcz1hd2FpdCBmdW5jdGlvbk9iamVjdC5nZXRPd25Qcm9wZXJ0aWVzUHJvbWlzZShmYWxzZSk7Y29uc3QgaW50ZXJuYWxQcm9wZXJ0aWVzPXByb3BlcnRpZXMuaW50ZXJuYWxQcm9wZXJ0aWVzfHxbXTtjb25zdCB0YXJnZXRQcm9wZXJ0eT1pbnRlcm5hbFByb3BlcnRpZXMuZmluZChwcm9wZXJ0eT0+cHJvcGVydHkubmFtZT09PSdbW1RhcmdldEZ1bmN0aW9uXV0nKTtjb25zdCBhcmdzUHJvcGVydHk9aW50ZXJuYWxQcm9wZXJ0aWVzLmZpbmQocHJvcGVydHk9PnByb3BlcnR5Lm5hbWU9PT0nW1tCb3VuZEFyZ3NdXScpO2NvbnN0IHRoaXNQcm9wZXJ0eT1pbnRlcm5hbFByb3BlcnRpZXMuZmluZChwcm9wZXJ0eT0+cHJvcGVydHkubmFtZT09PSdbW0JvdW5kVGhpc11dJyk7aWYodGhpc1Byb3BlcnR5JiZ0YXJnZXRQcm9wZXJ0eSYmYXJnc1Byb3BlcnR5KXtjb25zdCBvcmlnaW5hbFNpZ25hdHVyZXM9YXdhaXQgdGhpcy5fYXJndW1lbnRzRm9yRnVuY3Rpb24odGFyZ2V0UHJvcGVydHkudmFsdWUsKCk9PlByb21pc2UucmVzb2x2ZSh0aGlzUHJvcGVydHkudmFsdWUpKTtjb25zdCBib3VuZEFyZ3NMZW5ndGg9U0RLLlJlbW90ZU9iamVjdC5hcnJheUxlbmd0aChhcmdzUHJvcGVydHkudmFsdWUpO2NvbnN0IGNsaXBwZWRBcmdzPVtdO2Zvcihjb25zdCBzaWduYXR1cmUgb2Ygb3JpZ2luYWxTaWduYXR1cmVzKXtjb25zdCByZXN0SW5kZXg9c2lnbmF0dXJlLnNsaWNlKDAsYm91bmRBcmdzTGVuZ3RoKS5maW5kSW5kZXgoYXJnPT5hcmcuc3RhcnRzV2l0aCgnLi4uJykpO2lmKHJlc3RJbmRleCE9PS0xKQpjbGlwcGVkQXJncy5wdXNoKHNpZ25hdHVyZS5zbGljZShyZXN0SW5kZXgpKTtlbHNlCmNsaXBwZWRBcmdzLnB1c2goc2lnbmF0dXJlLnNsaWNlKGJvdW5kQXJnc0xlbmd0aCkpO30KcmV0dXJuIGNsaXBwZWRBcmdzO319CmNvbnN0IGphdmFTY3JpcHRNZXRhZGF0YT1hd2FpdCBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9uKENvbW1vbi5KYXZhU2NyaXB0TWV0YWRhdGEpLmluc3RhbmNlKCk7Y29uc3QgbmFtZT0vXmZ1bmN0aW9uIChbXihdKilcKC8uZXhlYyhkZXNjcmlwdGlvbilbMV18fHBhcnNlZEZ1bmN0aW9uTmFtZTtpZighbmFtZSkKcmV0dXJuW107Y29uc3QgdW5pcXVlU2lnbmF0dXJlcz1qYXZhU2NyaXB0TWV0YWRhdGEuc2lnbmF0dXJlc0Zvck5hdGl2ZUZ1bmN0aW9uKG5hbWUpO2lmKHVuaXF1ZVNpZ25hdHVyZXMpCnJldHVybiB1bmlxdWVTaWduYXR1cmVzO2NvbnN0IHJlY2VpdmVyT2JqPWF3YWl0IHJlY2VpdmVyT2JqR2V0dGVyKCk7Y29uc3QgY2xhc3NOYW1lPXJlY2VpdmVyT2JqLmNsYXNzTmFtZTtpZihqYXZhU2NyaXB0TWV0YWRhdGEuc2lnbmF0dXJlc0Zvckluc3RhbmNlTWV0aG9kKG5hbWUsY2xhc3NOYW1lKSkKcmV0dXJuIGphdmFTY3JpcHRNZXRhZGF0YS5zaWduYXR1cmVzRm9ySW5zdGFuY2VNZXRob2QobmFtZSxjbGFzc05hbWUpO2lmKHJlY2VpdmVyT2JqLnR5cGU9PT0nZnVuY3Rpb24nJiZyZWNlaXZlck9iai5kZXNjcmlwdGlvbi5lbmRzV2l0aCgneyBbbmF0aXZlIGNvZGVdIH0nKSl7Y29uc3QgcmVjZWl2ZXJOYW1lPS9eZnVuY3Rpb24gKFteKF0qKVwoLy5leGVjKHJlY2VpdmVyT2JqLmRlc2NyaXB0aW9uKVsxXTtjb25zdCBzdGF0aWNTaWduYXR1cmVzPWphdmFTY3JpcHRNZXRhZGF0YS5zaWduYXR1cmVzRm9yU3RhdGljTWV0aG9kKG5hbWUscmVjZWl2ZXJOYW1lKTtpZihzdGF0aWNTaWduYXR1cmVzKQpyZXR1cm4gc3RhdGljU2lnbmF0dXJlczt9CmxldCBwcm90b05hbWVzO2lmKHJlY2VpdmVyT2JqLnR5cGU9PT0nbnVtYmVyJyl7cHJvdG9OYW1lcz1bJ051bWJlcicsJ09iamVjdCddO31lbHNlIGlmKHJlY2VpdmVyT2JqLnR5cGU9PT0nc3RyaW5nJyl7cHJvdG9OYW1lcz1bJ1N0cmluZycsJ09iamVjdCddO31lbHNlIGlmKHJlY2VpdmVyT2JqLnR5cGU9PT0nc3ltYm9sJyl7cHJvdG9OYW1lcz1bJ1N5bWJvbCcsJ09iamVjdCddO31lbHNlIGlmKHJlY2VpdmVyT2JqLnR5cGU9PT0nYmlnaW50Jyl7cHJvdG9OYW1lcz1bJ0JpZ0ludCcsJ09iamVjdCddO31lbHNlIGlmKHJlY2VpdmVyT2JqLnR5cGU9PT0nYm9vbGVhbicpe3Byb3RvTmFtZXM9WydCb29sZWFuJywnT2JqZWN0J107fWVsc2UgaWYocmVjZWl2ZXJPYmoudHlwZT09PSd1bmRlZmluZWQnfHxyZWNlaXZlck9iai5zdWJ0eXBlPT09J251bGwnKXtwcm90b05hbWVzPVtdO31lbHNle3Byb3RvTmFtZXM9YXdhaXQgcmVjZWl2ZXJPYmouY2FsbEZ1bmN0aW9uSlNPTlByb21pc2UoZnVuY3Rpb24oKXtjb25zdCByZXN1bHQ9W107Zm9yKGxldCBvYmplY3Q9dGhpcztvYmplY3Q7b2JqZWN0PU9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpKXtpZih0eXBlb2Ygb2JqZWN0PT09J29iamVjdCcmJm9iamVjdC5jb25zdHJ1Y3RvciYmb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUpCnJlc3VsdFtyZXN1bHQubGVuZ3RoXT1vYmplY3QuY29uc3RydWN0b3IubmFtZTt9CnJldHVybiByZXN1bHQ7fSk7fQpmb3IoY29uc3QgcHJvdG8gb2YgcHJvdG9OYW1lcyl7Y29uc3QgaW5zdGFuY2VTaWduYXR1cmVzPWphdmFTY3JpcHRNZXRhZGF0YS5zaWduYXR1cmVzRm9ySW5zdGFuY2VNZXRob2QobmFtZSxwcm90byk7aWYoaW5zdGFuY2VTaWduYXR1cmVzKQpyZXR1cm4gaW5zdGFuY2VTaWduYXR1cmVzO30KcmV0dXJuW107fQphc3luYyBfbWFwQ29tcGxldGlvbnModGV4dCxxdWVyeSl7Y29uc3QgbWFwTWF0Y2g9dGV4dC5tYXRjaCgvXC5ccyooZ2V0fHNldHxkZWxldGUpXHMqXChccyokLyk7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoIWV4ZWN1dGlvbkNvbnRleHR8fCFtYXBNYXRjaCkKcmV0dXJuW107Y29uc3QgZXhwcmVzc2lvbj1hd2FpdCBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmZpbmRMYXN0RXhwcmVzc2lvbih0ZXh0LnN1YnN0cmluZygwLG1hcE1hdGNoLmluZGV4KSk7aWYoIWV4cHJlc3Npb24pCnJldHVybltdO2NvbnN0IHJlc3VsdD1hd2FpdCBleGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKHtleHByZXNzaW9uOmV4cHJlc3Npb24uYmFzZUV4cHJlc3Npb24sb2JqZWN0R3JvdXA6J21hcENvbXBsZXRpb24nLGluY2x1ZGVDb21tYW5kTGluZUFQSTp0cnVlLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6ZmFsc2UsZ2VuZXJhdGVQcmV2aWV3OmZhbHNlLHRocm93T25TaWRlRWZmZWN0OmV4cHJlc3Npb24ucG9zc2libGVTaWRlRWZmZWN0cyx0aW1lb3V0OmV4cHJlc3Npb24ucG9zc2libGVTaWRlRWZmZWN0cz81MDA6dW5kZWZpbmVkfSxmYWxzZSxmYWxzZSk7aWYocmVzdWx0LmVycm9yfHwhIXJlc3VsdC5leGNlcHRpb25EZXRhaWxzfHxyZXN1bHQub2JqZWN0LnN1YnR5cGUhPT0nbWFwJykKcmV0dXJuW107Y29uc3QgcHJvcGVydGllcz1hd2FpdCByZXN1bHQub2JqZWN0LmdldE93blByb3BlcnRpZXNQcm9taXNlKGZhbHNlKTtjb25zdCBpbnRlcm5hbFByb3BlcnRpZXM9cHJvcGVydGllcy5pbnRlcm5hbFByb3BlcnRpZXN8fFtdO2NvbnN0IGVudHJpZXNQcm9wZXJ0eT1pbnRlcm5hbFByb3BlcnRpZXMuZmluZChwcm9wZXJ0eT0+cHJvcGVydHkubmFtZT09PSdbW0VudHJpZXNdXScpO2lmKCFlbnRyaWVzUHJvcGVydHkpCnJldHVybltdO2NvbnN0IGtleXNPYmo9YXdhaXQgZW50cmllc1Byb3BlcnR5LnZhbHVlLmNhbGxGdW5jdGlvbkpTT05Qcm9taXNlKGdldEVudHJpZXMpO2V4ZWN1dGlvbkNvbnRleHQucnVudGltZU1vZGVsLnJlbGVhc2VPYmplY3RHcm91cCgnbWFwQ29tcGxldGlvbicpO3JldHVybiBnb3RLZXlzKE9iamVjdC5rZXlzKGtleXNPYmopKTtmdW5jdGlvbiBnZXRFbnRyaWVzKCl7Y29uc3QgcmVzdWx0PXtfX3Byb3RvX186bnVsbH07Zm9yKGxldCBpPTA7aTx0aGlzLmxlbmd0aDtpKyspe2lmKHR5cGVvZiB0aGlzW2ldLmtleT09PSdzdHJpbmcnKQpyZXN1bHRbdGhpc1tpXS5rZXldPXRydWU7fQpyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gZ290S2V5cyhyYXdLZXlzKXtjb25zdCBjYXNlU2Vuc2l0aXZlUHJlZml4PVtdO2NvbnN0IGNhc2VJbnNlbnNpdGl2ZVByZWZpeD1bXTtjb25zdCBjYXNlU2Vuc2l0aXZlQW55d2hlcmU9W107Y29uc3QgY2FzZUluc2Vuc2l0aXZlQW55d2hlcmU9W107bGV0IHF1b3RlQ2hhcj0nIic7aWYocXVlcnkuc3RhcnRzV2l0aCgnXCcnKSkKcXVvdGVDaGFyPSdcJyc7bGV0IGVuZENoYXI9JyknO2lmKG1hcE1hdGNoWzBdLmluZGV4T2YoJ3NldCcpIT09LTEpCmVuZENoYXI9JywgJztjb25zdCBzb3J0ZXI9cmF3S2V5cy5sZW5ndGg8MTAwMD9TdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcjp1bmRlZmluZWQ7Y29uc3Qga2V5cz1yYXdLZXlzLnNvcnQoc29ydGVyKS5tYXAoa2V5PT5xdW90ZUNoYXIra2V5K3F1b3RlQ2hhcik7Zm9yKGNvbnN0IGtleSBvZiBrZXlzKXtpZihrZXkubGVuZ3RoPHF1ZXJ5Lmxlbmd0aCkKY29udGludWU7aWYocXVlcnkubGVuZ3RoJiZrZXkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpPT09LTEpCmNvbnRpbnVlO2NvbnN0IHRpdGxlPWtleS5zcGxpdCgnXG4nKS5qb2luKCdcXG4nKTtjb25zdCB0ZXh0PXRpdGxlK2VuZENoYXI7aWYoa2V5LnN0YXJ0c1dpdGgocXVlcnkpKQpjYXNlU2Vuc2l0aXZlUHJlZml4LnB1c2goe3RleHQ6dGV4dCx0aXRsZTp0aXRsZSxwcmlvcml0eTo0fSk7ZWxzZSBpZihrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKQpjYXNlSW5zZW5zaXRpdmVQcmVmaXgucHVzaCh7dGV4dDp0ZXh0LHRpdGxlOnRpdGxlLHByaW9yaXR5OjN9KTtlbHNlIGlmKGtleS5pbmRleE9mKHF1ZXJ5KSE9PS0xKQpjYXNlU2Vuc2l0aXZlQW55d2hlcmUucHVzaCh7dGV4dDp0ZXh0LHRpdGxlOnRpdGxlLHByaW9yaXR5OjJ9KTtlbHNlCmNhc2VJbnNlbnNpdGl2ZUFueXdoZXJlLnB1c2goe3RleHQ6dGV4dCx0aXRsZTp0aXRsZSxwcmlvcml0eToxfSk7fQpjb25zdCBzdWdnZXN0aW9ucz1jYXNlU2Vuc2l0aXZlUHJlZml4LmNvbmNhdChjYXNlSW5zZW5zaXRpdmVQcmVmaXgsY2FzZVNlbnNpdGl2ZUFueXdoZXJlLGNhc2VJbnNlbnNpdGl2ZUFueXdoZXJlKTtpZihzdWdnZXN0aW9ucy5sZW5ndGgpCnN1Z2dlc3Rpb25zWzBdLnN1YnRpdGxlPUNvbW1vbi5VSVN0cmluZygnS2V5cycpO3JldHVybiBzdWdnZXN0aW9uczt9fQphc3luYyBfY29tcGxldGlvbnNGb3JFeHByZXNzaW9uKGZ1bGxUZXh0LHF1ZXJ5LGZvcmNlKXtjb25zdCBleGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighZXhlY3V0aW9uQ29udGV4dCkKcmV0dXJuW107bGV0IGV4cHJlc3Npb247aWYoZnVsbFRleHQuZW5kc1dpdGgoJy4nKXx8ZnVsbFRleHQuZW5kc1dpdGgoJ1snKSkKZXhwcmVzc2lvbj1hd2FpdCBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmZpbmRMYXN0RXhwcmVzc2lvbihmdWxsVGV4dC5zdWJzdHJpbmcoMCxmdWxsVGV4dC5sZW5ndGgtMSkpO2lmKCFleHByZXNzaW9uKXtpZihmdWxsVGV4dC5lbmRzV2l0aCgnLicpKQpyZXR1cm5bXTtleHByZXNzaW9uPXtiYXNlRXhwcmVzc2lvbjonJyxwb3NzaWJsZVNpZGVFZmZlY3RzOmZhbHNlfTt9CmNvbnN0IG5lZWRzTm9TaWRlRWZmZWN0cz1leHByZXNzaW9uLnBvc3NpYmxlU2lkZUVmZmVjdHM7Y29uc3QgZXhwcmVzc2lvblN0cmluZz1leHByZXNzaW9uLmJhc2VFeHByZXNzaW9uO2NvbnN0IGRvdE5vdGF0aW9uPWZ1bGxUZXh0LmVuZHNXaXRoKCcuJyk7Y29uc3QgYnJhY2tldE5vdGF0aW9uPSEhZXhwcmVzc2lvblN0cmluZyYmZnVsbFRleHQuZW5kc1dpdGgoJ1snKTtpZigoZXhwcmVzc2lvblN0cmluZyYmIWlzTmFOKGV4cHJlc3Npb25TdHJpbmcpKXx8KCFleHByZXNzaW9uU3RyaW5nJiZxdWVyeSYmIWlzTmFOKHF1ZXJ5KSkpCnJldHVybltdO2lmKCFxdWVyeSYmIWV4cHJlc3Npb25TdHJpbmcmJiFmb3JjZSkKcmV0dXJuW107Y29uc3Qgc2VsZWN0ZWRGcmFtZT1leGVjdXRpb25Db250ZXh0LmRlYnVnZ2VyTW9kZWwuc2VsZWN0ZWRDYWxsRnJhbWUoKTtsZXQgY29tcGxldGlvbkdyb3Vwcztjb25zdCBURU5fU0VDT05EUz0xMDAwMDtsZXQgY2FjaGU9dGhpcy5fZXhwcmVzc2lvbkNhY2hlLmdldChleHByZXNzaW9uU3RyaW5nKTtpZihjYWNoZSYmY2FjaGUuZGF0ZStURU5fU0VDT05EUz5EYXRlLm5vdygpKXtjb21wbGV0aW9uR3JvdXBzPWF3YWl0IGNhY2hlLnZhbHVlO31lbHNlIGlmKCFleHByZXNzaW9uU3RyaW5nJiZzZWxlY3RlZEZyYW1lKXtjYWNoZT17ZGF0ZTpEYXRlLm5vdygpLHZhbHVlOmNvbXBsZXRpb25zT25QYXVzZShzZWxlY3RlZEZyYW1lKX07dGhpcy5fZXhwcmVzc2lvbkNhY2hlLnNldChleHByZXNzaW9uU3RyaW5nLGNhY2hlKTtjb21wbGV0aW9uR3JvdXBzPWF3YWl0IGNhY2hlLnZhbHVlO31lbHNle2NvbnN0IHJlc3VsdFByb21pc2U9ZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSh7ZXhwcmVzc2lvbjpleHByZXNzaW9uU3RyaW5nLG9iamVjdEdyb3VwOidjb21wbGV0aW9uJyxpbmNsdWRlQ29tbWFuZExpbmVBUEk6dHJ1ZSxzaWxlbnQ6dHJ1ZSxyZXR1cm5CeVZhbHVlOmZhbHNlLGdlbmVyYXRlUHJldmlldzpmYWxzZSx0aHJvd09uU2lkZUVmZmVjdDpuZWVkc05vU2lkZUVmZmVjdHMsdGltZW91dDpuZWVkc05vU2lkZUVmZmVjdHM/NTAwOnVuZGVmaW5lZH0sZmFsc2UsZmFsc2UpO2NhY2hlPXtkYXRlOkRhdGUubm93KCksdmFsdWU6cmVzdWx0UHJvbWlzZS50aGVuKHJlc3VsdD0+Y29tcGxldGlvbnNPbkdsb2JhbC5jYWxsKHRoaXMscmVzdWx0KSl9O3RoaXMuX2V4cHJlc3Npb25DYWNoZS5zZXQoZXhwcmVzc2lvblN0cmluZyxjYWNoZSk7Y29tcGxldGlvbkdyb3Vwcz1hd2FpdCBjYWNoZS52YWx1ZTt9CnJldHVybiB0aGlzLl9yZWNlaXZlZFByb3BlcnR5TmFtZXMoY29tcGxldGlvbkdyb3Vwcy5zbGljZSgwKSxkb3ROb3RhdGlvbixicmFja2V0Tm90YXRpb24sZXhwcmVzc2lvblN0cmluZyxxdWVyeSk7YXN5bmMgZnVuY3Rpb24gY29tcGxldGlvbnNPbkdsb2JhbChyZXN1bHQpe2lmKHJlc3VsdC5lcnJvcnx8ISFyZXN1bHQuZXhjZXB0aW9uRGV0YWlsc3x8IXJlc3VsdC5vYmplY3QpCnJldHVybltdO2xldCBvYmplY3Q9cmVzdWx0Lm9iamVjdDt3aGlsZShvYmplY3QmJm9iamVjdC50eXBlPT09J29iamVjdCcmJm9iamVjdC5zdWJ0eXBlPT09J3Byb3h5Jyl7Y29uc3QgcHJvcGVydGllcz1hd2FpdCBvYmplY3QuZ2V0T3duUHJvcGVydGllc1Byb21pc2UoZmFsc2UpO2NvbnN0IGludGVybmFsUHJvcGVydGllcz1wcm9wZXJ0aWVzLmludGVybmFsUHJvcGVydGllc3x8W107Y29uc3QgdGFyZ2V0PWludGVybmFsUHJvcGVydGllcy5maW5kKHByb3BlcnR5PT5wcm9wZXJ0eS5uYW1lPT09J1tbVGFyZ2V0XV0nKTtvYmplY3Q9dGFyZ2V0P3RhcmdldC52YWx1ZTpudWxsO30KaWYoIW9iamVjdCkKcmV0dXJuW107bGV0IGNvbXBsZXRpb25zPVtdO2lmKG9iamVjdC50eXBlPT09J29iamVjdCd8fG9iamVjdC50eXBlPT09J2Z1bmN0aW9uJyl7Y29tcGxldGlvbnM9YXdhaXQgb2JqZWN0LmNhbGxGdW5jdGlvbkpTT05Qcm9taXNlKGdldENvbXBsZXRpb25zLFtTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KG9iamVjdC5zdWJ0eXBlKV0pfHxbXTt9ZWxzZSBpZihvYmplY3QudHlwZT09PSdzdHJpbmcnfHxvYmplY3QudHlwZT09PSdudW1iZXInfHxvYmplY3QudHlwZT09PSdib29sZWFuJ3x8b2JqZWN0LnR5cGU9PT0nYmlnaW50Jyl7Y29uc3QgZXZhbHVhdGVSZXN1bHQ9YXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSh7ZXhwcmVzc2lvbjonKCcrZ2V0Q29tcGxldGlvbnMrJykoIicrb2JqZWN0LnR5cGUrJyIpJyxvYmplY3RHcm91cDonY29tcGxldGlvbicsaW5jbHVkZUNvbW1hbmRMaW5lQVBJOmZhbHNlLHNpbGVudDp0cnVlLHJldHVybkJ5VmFsdWU6dHJ1ZSxnZW5lcmF0ZVByZXZpZXc6ZmFsc2V9LGZhbHNlLGZhbHNlKTtpZihldmFsdWF0ZVJlc3VsdC5vYmplY3QmJiFldmFsdWF0ZVJlc3VsdC5leGNlcHRpb25EZXRhaWxzKQpjb21wbGV0aW9ucz1ldmFsdWF0ZVJlc3VsdC5vYmplY3QudmFsdWV8fFtdO30KZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWwucmVsZWFzZU9iamVjdEdyb3VwKCdjb21wbGV0aW9uJyk7aWYoIWV4cHJlc3Npb25TdHJpbmcpe2NvbnN0IGdsb2JhbE5hbWVzPWF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZ2xvYmFsTGV4aWNhbFNjb3BlTmFtZXMoKTtpZihjb21wbGV0aW9ucy5sZW5ndGgpCmNvbXBsZXRpb25zWzBdLml0ZW1zPWNvbXBsZXRpb25zWzBdLml0ZW1zLmNvbmNhdChnbG9iYWxOYW1lcyk7ZWxzZQpjb21wbGV0aW9ucy5wdXNoKHtpdGVtczpnbG9iYWxOYW1lcy5zb3J0KCksdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdMZXhpY2FsIHNjb3BlIHZhcmlhYmxlcycpfSk7fQpmb3IoY29uc3QgZ3JvdXAgb2YgY29tcGxldGlvbnMpe2ZvcihsZXQgaT0wO2k8Z3JvdXAuaXRlbXMubGVuZ3RoO2krKykKZ3JvdXAuaXRlbXNbaV09Z3JvdXAuaXRlbXNbaV0ucmVwbGFjZSgvXG4vZywnXFxuJyk7Z3JvdXAuaXRlbXMuc29ydChncm91cC5pdGVtcy5sZW5ndGg8MTAwMD90aGlzLl9pdGVtQ29tcGFyYXRvcjp1bmRlZmluZWQpO30KcmV0dXJuIGNvbXBsZXRpb25zO2Z1bmN0aW9uIGdldENvbXBsZXRpb25zKHR5cGUpe2xldCBvYmplY3Q7aWYodHlwZT09PSdzdHJpbmcnKQpvYmplY3Q9bmV3IFN0cmluZygnJyk7ZWxzZSBpZih0eXBlPT09J251bWJlcicpCm9iamVjdD1uZXcgTnVtYmVyKDApO2Vsc2UgaWYodHlwZT09PSdiaWdpbnQnKQpvYmplY3Q9T2JqZWN0KEJpZ0ludCgwKSk7ZWxzZSBpZih0eXBlPT09J2Jvb2xlYW4nKQpvYmplY3Q9bmV3IEJvb2xlYW4oZmFsc2UpO2Vsc2UKb2JqZWN0PXRoaXM7Y29uc3QgcmVzdWx0PVtdO3RyeXtmb3IobGV0IG89b2JqZWN0O287bz1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobykpe2lmKCh0eXBlPT09J2FycmF5J3x8dHlwZT09PSd0eXBlZGFycmF5JykmJm89PT1vYmplY3QmJm8ubGVuZ3RoPjk5OTkpCmNvbnRpbnVlO2NvbnN0IGdyb3VwPXtpdGVtczpbXSxfX3Byb3RvX186bnVsbH07dHJ5e2lmKHR5cGVvZiBvPT09J29iamVjdCcmJm8uY29uc3RydWN0b3ImJm8uY29uc3RydWN0b3IubmFtZSkKZ3JvdXAudGl0bGU9by5jb25zdHJ1Y3Rvci5uYW1lO31jYXRjaChlZSl7fQpyZXN1bHRbcmVzdWx0Lmxlbmd0aF09Z3JvdXA7Y29uc3QgbmFtZXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobyk7Y29uc3QgaXNBcnJheT1BcnJheS5pc0FycmF5KG8pO2ZvcihsZXQgaT0wO2k8bmFtZXMubGVuZ3RoJiZncm91cC5pdGVtcy5sZW5ndGg8MTAwMDA7KytpKXtpZihpc0FycmF5JiYvXlswLTldLy50ZXN0KG5hbWVzW2ldKSkKY29udGludWU7Z3JvdXAuaXRlbXNbZ3JvdXAuaXRlbXMubGVuZ3RoXT1uYW1lc1tpXTt9fX1jYXRjaChlKXt9CnJldHVybiByZXN1bHQ7fX0KYXN5bmMgZnVuY3Rpb24gY29tcGxldGlvbnNPblBhdXNlKGNhbGxGcmFtZSl7Y29uc3QgcmVzdWx0PVt7aXRlbXM6Wyd0aGlzJ119XTtjb25zdCBzY29wZUNoYWluPWNhbGxGcmFtZS5zY29wZUNoYWluKCk7Y29uc3QgZ3JvdXBQcm9taXNlcz1bXTtmb3IoY29uc3Qgc2NvcGUgb2Ygc2NvcGVDaGFpbil7Z3JvdXBQcm9taXNlcy5wdXNoKHNjb3BlLm9iamVjdCgpLmdldEFsbFByb3BlcnRpZXNQcm9taXNlKGZhbHNlLGZhbHNlKS50aGVuKHJlc3VsdD0+KHtwcm9wZXJ0aWVzOnJlc3VsdC5wcm9wZXJ0aWVzLG5hbWU6c2NvcGUubmFtZSgpfSkpKTt9CmNvbnN0IGZ1bGxTY29wZXM9YXdhaXQgUHJvbWlzZS5hbGwoZ3JvdXBQcm9taXNlcyk7ZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWwucmVsZWFzZU9iamVjdEdyb3VwKCdjb21wbGV0aW9uJyk7Zm9yKGNvbnN0IHNjb3BlIG9mIGZ1bGxTY29wZXMpCnJlc3VsdC5wdXNoKHt0aXRsZTpzY29wZS5uYW1lLGl0ZW1zOnNjb3BlLnByb3BlcnRpZXMubWFwKHByb3BlcnR5PT5wcm9wZXJ0eS5uYW1lKS5zb3J0KCl9KTtyZXR1cm4gcmVzdWx0O319Cl9yZWNlaXZlZFByb3BlcnR5TmFtZXMocHJvcGVydHlHcm91cHMsZG90Tm90YXRpb24sYnJhY2tldE5vdGF0aW9uLGV4cHJlc3Npb25TdHJpbmcscXVlcnkpe2lmKCFwcm9wZXJ0eUdyb3VwcykKcmV0dXJuW107Y29uc3QgaW5jbHVkZUNvbW1hbmRMaW5lQVBJPSghZG90Tm90YXRpb24mJiFicmFja2V0Tm90YXRpb24pO2lmKGluY2x1ZGVDb21tYW5kTGluZUFQSSl7Y29uc3QgY29tbWFuZExpbmVBUEk9WydkaXInLCdkaXJ4bWwnLCdrZXlzJywndmFsdWVzJywncHJvZmlsZScsJ3Byb2ZpbGVFbmQnLCdtb25pdG9yRXZlbnRzJywndW5tb25pdG9yRXZlbnRzJywnaW5zcGVjdCcsJ2NvcHknLCdjbGVhcicsJ2dldEV2ZW50TGlzdGVuZXJzJywnZGVidWcnLCd1bmRlYnVnJywnbW9uaXRvcicsJ3VubW9uaXRvcicsJ3RhYmxlJywncXVlcnlPYmplY3RzJywnJCcsJyQkJywnJHgnXTtwcm9wZXJ0eUdyb3Vwcy5wdXNoKHtpdGVtczpjb21tYW5kTGluZUFQSX0pO30KcmV0dXJuIHRoaXMuX2NvbXBsZXRpb25zRm9yUXVlcnkoZG90Tm90YXRpb24sYnJhY2tldE5vdGF0aW9uLGV4cHJlc3Npb25TdHJpbmcscXVlcnkscHJvcGVydHlHcm91cHMpO30KX2NvbXBsZXRpb25zRm9yUXVlcnkoZG90Tm90YXRpb24sYnJhY2tldE5vdGF0aW9uLGV4cHJlc3Npb25TdHJpbmcscXVlcnkscHJvcGVydHlHcm91cHMpe2NvbnN0IHF1b3RlVXNlZD0oYnJhY2tldE5vdGF0aW9uJiZxdWVyeS5zdGFydHNXaXRoKCdcJycpKT8nXCcnOiciJztpZighZXhwcmVzc2lvblN0cmluZyl7Y29uc3Qga2V5d29yZHM9Wydhd2FpdCcsJ2JyZWFrJywnY2FzZScsJ2NhdGNoJywnY2xhc3MnLCdjb25zdCcsJ2NvbnRpbnVlJywnZGVidWdnZXInLCdkZWZhdWx0JywnZGVsZXRlJywnZG8nLCdlbHNlJywnZXhwb3J0cycsJ2V4dGVuZHMnLCdmaW5hbGx5JywnZm9yJywnZnVuY3Rpb24nLCdpZicsJ2ltcG9ydCcsJ2luJywnaW5zdGFuY2VvZicsJ25ldycsJ3JldHVybicsJ3N1cGVyJywnc3dpdGNoJywndGhpcycsJ3Rocm93JywndHJ5JywndHlwZW9mJywndmFyJywndm9pZCcsJ3doaWxlJywnd2l0aCcsJ3lpZWxkJywnbGV0Jywnc3RhdGljJywnYXN5bmMnLCdvZiddO3Byb3BlcnR5R3JvdXBzLnB1c2goe3RpdGxlOmxzYGtleXdvcmRzYCxpdGVtczprZXl3b3Jkcy5zb3J0KCl9KTt9CmNvbnN0IGFsbFByb3BlcnRpZXM9bmV3IFNldCgpO2xldCByZXN1bHQ9W107bGV0IGxhc3RHcm91cFRpdGxlO2NvbnN0IHJlZ2V4PS9eW2EtekEtWl8kXHUwMDhGLVx1RkZGRl1bYS16QS1aMC05XyRcdTAwOEYtXHVGRkZGXSokLztjb25zdCBsb3dlckNhc2VRdWVyeT1xdWVyeS50b0xvd2VyQ2FzZSgpO2Zvcihjb25zdCBncm91cCBvZiBwcm9wZXJ0eUdyb3Vwcyl7Y29uc3QgY2FzZVNlbnNpdGl2ZVByZWZpeD1bXTtjb25zdCBjYXNlSW5zZW5zaXRpdmVQcmVmaXg9W107Y29uc3QgY2FzZVNlbnNpdGl2ZUFueXdoZXJlPVtdO2NvbnN0IGNhc2VJbnNlbnNpdGl2ZUFueXdoZXJlPVtdO2ZvcihsZXQgaT0wO2k8Z3JvdXAuaXRlbXMubGVuZ3RoO2krKyl7bGV0IHByb3BlcnR5PWdyb3VwLml0ZW1zW2ldO2lmKCFicmFja2V0Tm90YXRpb24mJiFyZWdleC50ZXN0KHByb3BlcnR5KSkKY29udGludWU7aWYoYnJhY2tldE5vdGF0aW9uKXtpZighL15bMC05XSskLy50ZXN0KHByb3BlcnR5KSkKcHJvcGVydHk9cXVvdGVVc2VkK3Byb3BlcnR5LmVzY2FwZUNoYXJhY3RlcnMocXVvdGVVc2VkKydcXCcpK3F1b3RlVXNlZDtwcm9wZXJ0eSs9J10nO30KaWYoYWxsUHJvcGVydGllcy5oYXMocHJvcGVydHkpKQpjb250aW51ZTtpZihwcm9wZXJ0eS5sZW5ndGg8cXVlcnkubGVuZ3RoKQpjb250aW51ZTtjb25zdCBsb3dlckNhc2VQcm9wZXJ0eT1wcm9wZXJ0eS50b0xvd2VyQ2FzZSgpO2lmKHF1ZXJ5Lmxlbmd0aCYmbG93ZXJDYXNlUHJvcGVydHkuaW5kZXhPZihsb3dlckNhc2VRdWVyeSk9PT0tMSkKY29udGludWU7YWxsUHJvcGVydGllcy5hZGQocHJvcGVydHkpO2lmKHByb3BlcnR5LnN0YXJ0c1dpdGgocXVlcnkpKQpjYXNlU2Vuc2l0aXZlUHJlZml4LnB1c2goe3RleHQ6cHJvcGVydHkscHJpb3JpdHk6NH0pO2Vsc2UgaWYobG93ZXJDYXNlUHJvcGVydHkuc3RhcnRzV2l0aChsb3dlckNhc2VRdWVyeSkpCmNhc2VJbnNlbnNpdGl2ZVByZWZpeC5wdXNoKHt0ZXh0OnByb3BlcnR5LHByaW9yaXR5OjN9KTtlbHNlIGlmKHByb3BlcnR5LmluZGV4T2YocXVlcnkpIT09LTEpCmNhc2VTZW5zaXRpdmVBbnl3aGVyZS5wdXNoKHt0ZXh0OnByb3BlcnR5LHByaW9yaXR5OjJ9KTtlbHNlCmNhc2VJbnNlbnNpdGl2ZUFueXdoZXJlLnB1c2goe3RleHQ6cHJvcGVydHkscHJpb3JpdHk6MX0pO30KY29uc3Qgc3RydWN0dXJlZEdyb3VwPWNhc2VTZW5zaXRpdmVQcmVmaXguY29uY2F0KGNhc2VJbnNlbnNpdGl2ZVByZWZpeCxjYXNlU2Vuc2l0aXZlQW55d2hlcmUsY2FzZUluc2Vuc2l0aXZlQW55d2hlcmUpO2lmKHN0cnVjdHVyZWRHcm91cC5sZW5ndGgmJmdyb3VwLnRpdGxlIT09bGFzdEdyb3VwVGl0bGUpe3N0cnVjdHVyZWRHcm91cFswXS5zdWJ0aXRsZT1ncm91cC50aXRsZTtsYXN0R3JvdXBUaXRsZT1ncm91cC50aXRsZTt9CnJlc3VsdD1yZXN1bHQuY29uY2F0KHN0cnVjdHVyZWRHcm91cCk7cmVzdWx0LmZvckVhY2goaXRlbT0+e2lmKGl0ZW0udGV4dC5lbmRzV2l0aCgnXScpKQppdGVtLnRpdGxlPWl0ZW0udGV4dC5zdWJzdHJpbmcoMCxpdGVtLnRleHQubGVuZ3RoLTEpO30pO30KcmV0dXJuIHJlc3VsdDt9Cl9pdGVtQ29tcGFyYXRvcihhLGIpe2NvbnN0IGFTdGFydHNXaXRoVW5kZXJzY29yZT1hLnN0YXJ0c1dpdGgoJ18nKTtjb25zdCBiU3RhcnRzV2l0aFVuZGVyc2NvcmU9Yi5zdGFydHNXaXRoKCdfJyk7aWYoYVN0YXJ0c1dpdGhVbmRlcnNjb3JlJiYhYlN0YXJ0c1dpdGhVbmRlcnNjb3JlKQpyZXR1cm4gMTtpZihiU3RhcnRzV2l0aFVuZGVyc2NvcmUmJiFhU3RhcnRzV2l0aFVuZGVyc2NvcmUpCnJldHVybi0xO3JldHVybiBTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcihhLGIpO319O09iamVjdFVJLkphdmFTY3JpcHRBdXRvY29tcGxldGUuQ29tcGxldGlvbkdyb3VwO09iamVjdFVJLmphdmFTY3JpcHRBdXRvY29tcGxldGU9bmV3IE9iamVjdFVJLkphdmFTY3JpcHRBdXRvY29tcGxldGUoKTtPYmplY3RVSS5KYXZhU2NyaXB0QXV0b2NvbXBsZXRlQ29uZmlnPWNsYXNze2NvbnN0cnVjdG9yKGVkaXRvcil7dGhpcy5fZWRpdG9yPWVkaXRvcjt9CnN0YXRpYyBjcmVhdGVDb25maWdGb3JFZGl0b3IoZWRpdG9yKXtjb25zdCBhdXRvY29tcGxldGU9bmV3IE9iamVjdFVJLkphdmFTY3JpcHRBdXRvY29tcGxldGVDb25maWcoZWRpdG9yKTtyZXR1cm57c3Vic3RpdHV0ZVJhbmdlQ2FsbGJhY2s6YXV0b2NvbXBsZXRlLl9zdWJzdGl0dXRlUmFuZ2UuYmluZChhdXRvY29tcGxldGUpLHN1Z2dlc3Rpb25zQ2FsbGJhY2s6YXV0b2NvbXBsZXRlLl9zdWdnZXN0aW9uc0NhbGxiYWNrLmJpbmQoYXV0b2NvbXBsZXRlKSx0b29sdGlwQ2FsbGJhY2s6YXV0b2NvbXBsZXRlLl90b29sdGlwQ2FsbGJhY2suYmluZChhdXRvY29tcGxldGUpLH07fQpfc3Vic3RpdHV0ZVJhbmdlKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCB0b2tlbj10aGlzLl9lZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7aWYodG9rZW4mJnRva2VuLnR5cGU9PT0nanMtc3RyaW5nJykKcmV0dXJuIG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGxpbmVOdW1iZXIsdG9rZW4uc3RhcnRDb2x1bW4sbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO2NvbnN0IGxpbmVUZXh0PXRoaXMuX2VkaXRvci5saW5lKGxpbmVOdW1iZXIpO2xldCBpbmRleDtmb3IoaW5kZXg9Y29sdW1uTnVtYmVyLTE7aW5kZXg+PTA7aW5kZXgtLSl7aWYoJyA9OlsoezssISstKi8mfF48Pi5cdFxyXG4nLmluZGV4T2YobGluZVRleHQuY2hhckF0KGluZGV4KSkhPT0tMSkKYnJlYWs7fQpyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2UobGluZU51bWJlcixpbmRleCsxLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTt9CmFzeW5jIF9zdWdnZXN0aW9uc0NhbGxiYWNrKHF1ZXJ5UmFuZ2Usc3Vic3RpdHV0ZVJhbmdlLGZvcmNlKXtjb25zdCBxdWVyeT10aGlzLl9lZGl0b3IudGV4dChxdWVyeVJhbmdlKTtjb25zdCBiZWZvcmU9dGhpcy5fZWRpdG9yLnRleHQobmV3IFRleHRVdGlscy5UZXh0UmFuZ2UoMCwwLHF1ZXJ5UmFuZ2Uuc3RhcnRMaW5lLHF1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW4pKTtjb25zdCB0b2tlbj10aGlzLl9lZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihzdWJzdGl0dXRlUmFuZ2Uuc3RhcnRMaW5lLHN1YnN0aXR1dGVSYW5nZS5zdGFydENvbHVtbik7aWYodG9rZW4pe2NvbnN0IGV4Y2x1ZGVkVG9rZW5zPW5ldyBTZXQoWydqcy1jb21tZW50JywnanMtc3RyaW5nLTInLCdqcy1kZWYnXSk7Y29uc3QgdHJpbW1lZEJlZm9yZT1iZWZvcmUudHJpbSgpO2lmKCF0cmltbWVkQmVmb3JlLmVuZHNXaXRoKCdbJykmJiF0cmltbWVkQmVmb3JlLm1hdGNoKC9cLlxzKihnZXR8c2V0fGRlbGV0ZSlccypcKFxzKiQvKSkKZXhjbHVkZWRUb2tlbnMuYWRkKCdqcy1zdHJpbmcnKTtpZighdHJpbW1lZEJlZm9yZS5lbmRzV2l0aCgnLicpKQpleGNsdWRlZFRva2Vucy5hZGQoJ2pzLXByb3BlcnR5Jyk7aWYoZXhjbHVkZWRUb2tlbnMuaGFzKHRva2VuLnR5cGUpKQpyZXR1cm5bXTt9CmNvbnN0IHF1ZXJ5QW5kQWZ0ZXI9dGhpcy5fZWRpdG9yLmxpbmUocXVlcnlSYW5nZS5zdGFydExpbmUpLnN1YnN0cmluZyhxdWVyeVJhbmdlLnN0YXJ0Q29sdW1uKTtjb25zdCB3b3Jkcz1hd2FpdCBPYmplY3RVSS5qYXZhU2NyaXB0QXV0b2NvbXBsZXRlLmNvbXBsZXRpb25zRm9yVGV4dEluQ3VycmVudENvbnRleHQoYmVmb3JlLHF1ZXJ5LGZvcmNlKTtpZighZm9yY2UmJnF1ZXJ5QW5kQWZ0ZXImJnF1ZXJ5QW5kQWZ0ZXIhPT1xdWVyeSYmd29yZHMuc29tZSh3b3JkPT5xdWVyeUFuZEFmdGVyLnN0YXJ0c1dpdGgod29yZC50ZXh0KSYmcXVlcnkubGVuZ3RoIT09d29yZC50ZXh0Lmxlbmd0aCkpCnJldHVybltdO3JldHVybiB3b3Jkczt9CmFzeW5jIF90b29sdGlwQ2FsbGJhY2sobGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IGJlZm9yZT10aGlzLl9lZGl0b3IudGV4dChuZXcgVGV4dFV0aWxzLlRleHRSYW5nZSgwLDAsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpKTtjb25zdCByZXN1bHQ9YXdhaXQgT2JqZWN0VUkuamF2YVNjcmlwdEF1dG9jb21wbGV0ZS5hcmd1bWVudHNIaW50KGJlZm9yZSk7aWYoIXJlc3VsdCkKcmV0dXJuIG51bGw7Y29uc3QgYXJndW1lbnRJbmRleD1yZXN1bHQuYXJndW1lbnRJbmRleDtjb25zdCB0b29sdGlwPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2Zvcihjb25zdCBhcmdzIG9mIHJlc3VsdC5hcmdzKXtjb25zdCBhcmd1bWVudHNFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtmb3IobGV0IGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7aWYoaT09PWFyZ3VtZW50SW5kZXh8fChpPGFyZ3VtZW50SW5kZXgmJmFyZ3NbaV0uc3RhcnRzV2l0aCgnLi4uJykpKQphcmd1bWVudHNFbGVtZW50LmFwcGVuZENoaWxkKFVJLmh0bWxgPGI+JHthcmdzW2ldfTwvYj5gKTtlbHNlCmFyZ3VtZW50c0VsZW1lbnQuY3JlYXRlVGV4dENoaWxkKGFyZ3NbaV0pO2lmKGk8YXJncy5sZW5ndGgtMSkKYXJndW1lbnRzRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJywgJyk7fQp0b29sdGlwLmFwcGVuZENoaWxkKFVJLmh0bWxgPGRpdiBjbGFzcz0nc291cmNlLWNvZGUnPlx1MDE5Migke2FyZ3VtZW50c0VsZW1lbnR9KTwvZGl2PmApO30KcmV0dXJuIHRvb2x0aXA7fX07O09iamVjdFVJLlJlbW90ZU9iamVjdFByZXZpZXdGb3JtYXR0ZXI9Y2xhc3N7c3RhdGljIF9vYmplY3RQcm9wZXJ0eUNvbXBhcmF0b3IoYSxiKXtyZXR1cm4gc29ydFZhbHVlKGEpLXNvcnRWYWx1ZShiKTtmdW5jdGlvbiBzb3J0VmFsdWUocHJvcGVydHkpe2NvbnN0IGludGVybmFsTmFtZT1PYmplY3RVSS5SZW1vdGVPYmplY3RQcmV2aWV3Rm9ybWF0dGVyLl9pbnRlcm5hbE5hbWU7aWYocHJvcGVydHkubmFtZT09PWludGVybmFsTmFtZS5Qcm9taXNlU3RhdHVzKQpyZXR1cm4gMTtlbHNlIGlmKHByb3BlcnR5Lm5hbWU9PT1pbnRlcm5hbE5hbWUuUHJvbWlzZVZhbHVlKQpyZXR1cm4gMjtlbHNlIGlmKHByb3BlcnR5Lm5hbWU9PT1pbnRlcm5hbE5hbWUuR2VuZXJhdG9yU3RhdHVzfHxpbnRlcm5hbE5hbWUuUHJpbWl0aXZlVmFsdWUpCnJldHVybiAzO2Vsc2UgaWYocHJvcGVydHkudHlwZSE9PSdmdW5jdGlvbicpCnJldHVybiA0O3JldHVybiA1O319CmFwcGVuZE9iamVjdFByZXZpZXcocGFyZW50RWxlbWVudCxwcmV2aWV3LGlzRW50cnkpe2NvbnN0IGRlc2NyaXB0aW9uPXByZXZpZXcuZGVzY3JpcHRpb247Y29uc3Qgc3ViVHlwZXNXaXRob3V0VmFsdWVQcmV2aWV3PW5ldyBTZXQoWydudWxsJywncmVnZXhwJywnZXJyb3InLCdpbnRlcm5hbCNlbnRyeSddKTtpZihwcmV2aWV3LnR5cGUhPT0nb2JqZWN0J3x8c3ViVHlwZXNXaXRob3V0VmFsdWVQcmV2aWV3LmhhcyhwcmV2aWV3LnN1YnR5cGUpfHxpc0VudHJ5KXtwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyUHJvcGVydHlQcmV2aWV3KHByZXZpZXcudHlwZSxwcmV2aWV3LnN1YnR5cGUsZGVzY3JpcHRpb24pKTtyZXR1cm47fQpjb25zdCBpc0FycmF5T3JUeXBlZEFycmF5PXByZXZpZXcuc3VidHlwZT09PSdhcnJheSd8fHByZXZpZXcuc3VidHlwZT09PSd0eXBlZGFycmF5JztpZihkZXNjcmlwdGlvbil7bGV0IHRleHQ7aWYoaXNBcnJheU9yVHlwZWRBcnJheSl7Y29uc3QgYXJyYXlMZW5ndGg9U0RLLlJlbW90ZU9iamVjdC5hcnJheUxlbmd0aChwcmV2aWV3KTtjb25zdCBhcnJheUxlbmd0aFRleHQ9YXJyYXlMZW5ndGg+MT8oJygnK2FycmF5TGVuZ3RoKycpJyk6Jyc7Y29uc3QgYXJyYXlOYW1lPVNESy5SZW1vdGVPYmplY3QuYXJyYXlOYW1lRnJvbURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTt0ZXh0PWFycmF5TmFtZT09PSdBcnJheSc/YXJyYXlMZW5ndGhUZXh0OihhcnJheU5hbWUrYXJyYXlMZW5ndGhUZXh0KTt9ZWxzZXtjb25zdCBoaWRlRGVzY3JpcHRpb249ZGVzY3JpcHRpb249PT0nT2JqZWN0Jzt0ZXh0PWhpZGVEZXNjcmlwdGlvbj8nJzpkZXNjcmlwdGlvbjt9CmlmKHRleHQubGVuZ3RoPjApCnBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdvYmplY3QtZGVzY3JpcHRpb24nKS50ZXh0Q29udGVudD10ZXh0KydcdTAwYTAnO30KY29uc3QgcHJvcGVydGllc0VsZW1lbnQ9cGFyZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ29iamVjdC1wcm9wZXJ0aWVzLXByZXZpZXcnKTtwcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoaXNBcnJheU9yVHlwZWRBcnJheT8nWyc6J3snKTtpZihwcmV2aWV3LmVudHJpZXMpCnRoaXMuX2FwcGVuZEVudHJpZXNQcmV2aWV3KHByb3BlcnRpZXNFbGVtZW50LHByZXZpZXcpO2Vsc2UgaWYoaXNBcnJheU9yVHlwZWRBcnJheSkKdGhpcy5fYXBwZW5kQXJyYXlQcm9wZXJ0aWVzUHJldmlldyhwcm9wZXJ0aWVzRWxlbWVudCxwcmV2aWV3KTtlbHNlCnRoaXMuX2FwcGVuZE9iamVjdFByb3BlcnRpZXNQcmV2aWV3KHByb3BlcnRpZXNFbGVtZW50LHByZXZpZXcpO2lmKHByZXZpZXcub3ZlcmZsb3cpe2NvbnN0IGVsbGlwc2lzVGV4dD1wcm9wZXJ0aWVzRWxlbWVudC50ZXh0Q29udGVudC5sZW5ndGg+MT8nLFx1MDBhMFx1MjAyNic6J1x1MjAyNic7cHJvcGVydGllc0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1lbGxpcHNpc1RleHQ7fQpwcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoaXNBcnJheU9yVHlwZWRBcnJheT8nXSc6J30nKTt9Cl9hYmJyZXZpYXRlRnVsbFF1YWxpZmllZENsYXNzTmFtZShkZXNjcmlwdGlvbil7Y29uc3QgYWJicmV2aWF0ZWREZXNjcmlwdGlvbj1kZXNjcmlwdGlvbi5zcGxpdCgnLicpO2ZvcihsZXQgaT0wO2k8YWJicmV2aWF0ZWREZXNjcmlwdGlvbi5sZW5ndGgtMTsrK2kpCmFiYnJldmlhdGVkRGVzY3JpcHRpb25baV09YWJicmV2aWF0ZWREZXNjcmlwdGlvbltpXS50cmltTWlkZGxlKDMpO3JldHVybiBhYmJyZXZpYXRlZERlc2NyaXB0aW9uLmpvaW4oJy4nKTt9Cl9hcHBlbmRPYmplY3RQcm9wZXJ0aWVzUHJldmlldyhwYXJlbnRFbGVtZW50LHByZXZpZXcpe2NvbnN0IGludGVybmFsTmFtZT1PYmplY3RVSS5SZW1vdGVPYmplY3RQcmV2aWV3Rm9ybWF0dGVyLl9pbnRlcm5hbE5hbWU7Y29uc3QgcHJvcGVydGllcz1wcmV2aWV3LnByb3BlcnRpZXMuZmlsdGVyKHA9PnAudHlwZSE9PSdhY2Nlc3NvcicpLnN0YWJsZVNvcnQoT2JqZWN0VUkuUmVtb3RlT2JqZWN0UHJldmlld0Zvcm1hdHRlci5fb2JqZWN0UHJvcGVydHlDb21wYXJhdG9yKTtmb3IobGV0IGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoOysraSl7aWYoaT4wKQpwYXJlbnRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTtjb25zdCBwcm9wZXJ0eT1wcm9wZXJ0aWVzW2ldO2NvbnN0IG5hbWU9cHJvcGVydHkubmFtZTtpZihwcmV2aWV3LnN1YnR5cGU9PT0ncHJvbWlzZScmJm5hbWU9PT1pbnRlcm5hbE5hbWUuUHJvbWlzZVN0YXR1cyl7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJEaXNwbGF5TmFtZSgnPCcrcHJvcGVydHkudmFsdWUrJz4nKSk7Y29uc3QgbmV4dFByb3BlcnR5PWkrMTxwcm9wZXJ0aWVzLmxlbmd0aD9wcm9wZXJ0aWVzW2krMV06bnVsbDtpZihuZXh0UHJvcGVydHkmJm5leHRQcm9wZXJ0eS5uYW1lPT09aW50ZXJuYWxOYW1lLlByb21pc2VWYWx1ZSl7aWYocHJvcGVydHkudmFsdWUhPT0ncGVuZGluZycpe3BhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCc6ICcpO3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3NvcihbbmV4dFByb3BlcnR5XSkpO30KaSsrO319ZWxzZSBpZihwcmV2aWV3LnN1YnR5cGU9PT0nZ2VuZXJhdG9yJyYmbmFtZT09PWludGVybmFsTmFtZS5HZW5lcmF0b3JTdGF0dXMpe3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyRGlzcGxheU5hbWUoJzwnK3Byb3BlcnR5LnZhbHVlKyc+JykpO31lbHNlIGlmKG5hbWU9PT1pbnRlcm5hbE5hbWUuUHJpbWl0aXZlVmFsdWUpe3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3NvcihbcHJvcGVydHldKSk7fWVsc2V7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJEaXNwbGF5TmFtZShuYW1lKSk7cGFyZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJzogJyk7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yZW5kZXJQcm9wZXJ0eVByZXZpZXdPckFjY2Vzc29yKFtwcm9wZXJ0eV0pKTt9fX0KX2FwcGVuZEFycmF5UHJvcGVydGllc1ByZXZpZXcocGFyZW50RWxlbWVudCxwcmV2aWV3KXtjb25zdCBhcnJheUxlbmd0aD1TREsuUmVtb3RlT2JqZWN0LmFycmF5TGVuZ3RoKHByZXZpZXcpO2NvbnN0IGluZGV4UHJvcGVydGllcz1wcmV2aWV3LnByb3BlcnRpZXMuZmlsdGVyKHA9PnRvQXJyYXlJbmRleChwLm5hbWUpIT09LTEpLnN0YWJsZVNvcnQoYXJyYXlFbnRyeUNvbXBhcmF0b3IpO2NvbnN0IG90aGVyUHJvcGVydGllcz1wcmV2aWV3LnByb3BlcnRpZXMuZmlsdGVyKHA9PnRvQXJyYXlJbmRleChwLm5hbWUpPT09LTEpLnN0YWJsZVNvcnQoT2JqZWN0VUkuUmVtb3RlT2JqZWN0UHJldmlld0Zvcm1hdHRlci5fb2JqZWN0UHJvcGVydHlDb21wYXJhdG9yKTtmdW5jdGlvbiBhcnJheUVudHJ5Q29tcGFyYXRvcihhLGIpe3JldHVybiB0b0FycmF5SW5kZXgoYS5uYW1lKS10b0FycmF5SW5kZXgoYi5uYW1lKTt9CmZ1bmN0aW9uIHRvQXJyYXlJbmRleChuYW1lKXtjb25zdCBpbmRleD1uYW1lPj4+MDtpZihTdHJpbmcoaW5kZXgpPT09bmFtZSYmaW5kZXg8YXJyYXlMZW5ndGgpCnJldHVybiBpbmRleDtyZXR1cm4tMTt9CmNvbnN0IGNhblNob3dHYXBzPSFwcmV2aWV3Lm92ZXJmbG93O2xldCBsYXN0Tm9uRW1wdHlBcnJheUluZGV4PS0xO2xldCBlbGVtZW50c0FkZGVkPWZhbHNlO2ZvcihsZXQgaT0wO2k8aW5kZXhQcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2lmKGVsZW1lbnRzQWRkZWQpCnBhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCcsICcpO2NvbnN0IHByb3BlcnR5PWluZGV4UHJvcGVydGllc1tpXTtjb25zdCBpbmRleD10b0FycmF5SW5kZXgocHJvcGVydHkubmFtZSk7aWYoY2FuU2hvd0dhcHMmJmluZGV4LWxhc3ROb25FbXB0eUFycmF5SW5kZXg+MSl7YXBwZW5kVW5kZWZpbmVkKGluZGV4KTtwYXJlbnRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTt9CmlmKCFjYW5TaG93R2FwcyYmaSE9PWluZGV4KXtwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3JlbmRlckRpc3BsYXlOYW1lKHByb3BlcnR5Lm5hbWUpKTtwYXJlbnRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnOiAnKTt9CnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3NvcihbcHJvcGVydHldKSk7bGFzdE5vbkVtcHR5QXJyYXlJbmRleD1pbmRleDtlbGVtZW50c0FkZGVkPXRydWU7fQppZihjYW5TaG93R2FwcyYmYXJyYXlMZW5ndGgtbGFzdE5vbkVtcHR5QXJyYXlJbmRleD4xKXtpZihlbGVtZW50c0FkZGVkKQpwYXJlbnRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTthcHBlbmRVbmRlZmluZWQoYXJyYXlMZW5ndGgpO30KZm9yKGxldCBpPTA7aTxvdGhlclByb3BlcnRpZXMubGVuZ3RoOysraSl7aWYoZWxlbWVudHNBZGRlZCkKcGFyZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJywgJyk7Y29uc3QgcHJvcGVydHk9b3RoZXJQcm9wZXJ0aWVzW2ldO3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyRGlzcGxheU5hbWUocHJvcGVydHkubmFtZSkpO3BhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCc6ICcpO3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3NvcihbcHJvcGVydHldKSk7ZWxlbWVudHNBZGRlZD10cnVlO30KZnVuY3Rpb24gYXBwZW5kVW5kZWZpbmVkKGluZGV4KXtjb25zdCBzcGFuPXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdvYmplY3QtdmFsdWUtdW5kZWZpbmVkJyk7Y29uc3QgY291bnQ9aW5kZXgtbGFzdE5vbkVtcHR5QXJyYXlJbmRleC0xO3NwYW4udGV4dENvbnRlbnQ9Y291bnQhPT0xP0NvbW1vbi5VSVN0cmluZygnZW1wdHkgw5cgJWQnLGNvdW50KTpDb21tb24uVUlTdHJpbmcoJ2VtcHR5Jyk7ZWxlbWVudHNBZGRlZD10cnVlO319Cl9hcHBlbmRFbnRyaWVzUHJldmlldyhwYXJlbnRFbGVtZW50LHByZXZpZXcpe2ZvcihsZXQgaT0wO2k8cHJldmlldy5lbnRyaWVzLmxlbmd0aDsrK2kpe2lmKGk+MCkKcGFyZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJywgJyk7Y29uc3QgZW50cnk9cHJldmlldy5lbnRyaWVzW2ldO2lmKGVudHJ5LmtleSl7dGhpcy5hcHBlbmRPYmplY3RQcmV2aWV3KHBhcmVudEVsZW1lbnQsZW50cnkua2V5LHRydWUpO3BhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKCcgPT4gJyk7fQp0aGlzLmFwcGVuZE9iamVjdFByZXZpZXcocGFyZW50RWxlbWVudCxlbnRyeS52YWx1ZSx0cnVlKTt9fQpfcmVuZGVyRGlzcGxheU5hbWUobmFtZSl7Y29uc3QgcmVzdWx0PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCduYW1lJyk7Y29uc3QgbmVlZHNRdW90ZXM9L15cc3xccyR8XiR8XG4vLnRlc3QobmFtZSk7cmVzdWx0LnRleHRDb250ZW50PW5lZWRzUXVvdGVzPyciJytuYW1lLnJlcGxhY2UoL1xuL2csJ1x1MjFCNScpKyciJzpuYW1lO3JldHVybiByZXN1bHQ7fQpfcmVuZGVyUHJvcGVydHlQcmV2aWV3T3JBY2Nlc3Nvcihwcm9wZXJ0eVBhdGgpe2NvbnN0IHByb3BlcnR5PXByb3BlcnR5UGF0aC5wZWVrTGFzdCgpO3JldHVybiB0aGlzLnJlbmRlclByb3BlcnR5UHJldmlldyhwcm9wZXJ0eS50eXBlLChwcm9wZXJ0eS5zdWJ0eXBlKSxwcm9wZXJ0eS52YWx1ZSk7fQpyZW5kZXJQcm9wZXJ0eVByZXZpZXcodHlwZSxzdWJ0eXBlLGRlc2NyaXB0aW9uKXtjb25zdCBzcGFuPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdvYmplY3QtdmFsdWUtJysoc3VidHlwZXx8dHlwZSkpO2Rlc2NyaXB0aW9uPWRlc2NyaXB0aW9ufHwnJztpZih0eXBlPT09J2FjY2Vzc29yJyl7c3Bhbi50ZXh0Q29udGVudD0nKC4uLiknO3NwYW4udGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdUaGUgcHJvcGVydHkgaXMgY29tcHV0ZWQgd2l0aCBhIGdldHRlcicpO3JldHVybiBzcGFuO30KaWYodHlwZT09PSdmdW5jdGlvbicpe3NwYW4udGV4dENvbnRlbnQ9J1x1MDE5Mic7cmV0dXJuIHNwYW47fQppZih0eXBlPT09J29iamVjdCcmJnN1YnR5cGU9PT0nbm9kZScmJmRlc2NyaXB0aW9uKXtPYmplY3RVSS5SZW1vdGVPYmplY3RQcmV2aWV3Rm9ybWF0dGVyLmNyZWF0ZVNwYW5zRm9yTm9kZVRpdGxlKHNwYW4sZGVzY3JpcHRpb24pO3JldHVybiBzcGFuO30KaWYodHlwZT09PSdzdHJpbmcnKXtzcGFuLmNyZWF0ZVRleHRDaGlsZHJlbignIicsZGVzY3JpcHRpb24ucmVwbGFjZSgvXG4vZywnXHUyMUI1JyksJyInKTtyZXR1cm4gc3Bhbjt9CmlmKHR5cGU9PT0nb2JqZWN0JyYmIXN1YnR5cGUpe2xldCBwcmV2aWV3PXRoaXMuX2FiYnJldmlhdGVGdWxsUXVhbGlmaWVkQ2xhc3NOYW1lKGRlc2NyaXB0aW9uKTtpZihwcmV2aWV3PT09J09iamVjdCcpCnByZXZpZXc9J3tcdTIwMjZ9JztzcGFuLnRleHRDb250ZW50PXByZXZpZXc7c3Bhbi50aXRsZT1kZXNjcmlwdGlvbjtyZXR1cm4gc3Bhbjt9CnNwYW4udGV4dENvbnRlbnQ9ZGVzY3JpcHRpb247cmV0dXJuIHNwYW47fX07T2JqZWN0VUkuUmVtb3RlT2JqZWN0UHJldmlld0Zvcm1hdHRlci5faW50ZXJuYWxOYW1lPXtHZW5lcmF0b3JTdGF0dXM6J1tbR2VuZXJhdG9yU3RhdHVzXV0nLFByaW1pdGl2ZVZhbHVlOidbW1ByaW1pdGl2ZVZhbHVlXV0nLFByb21pc2VTdGF0dXM6J1tbUHJvbWlzZVN0YXR1c11dJyxQcm9taXNlVmFsdWU6J1tbUHJvbWlzZVZhbHVlXV0nfTtPYmplY3RVSS5SZW1vdGVPYmplY3RQcmV2aWV3Rm9ybWF0dGVyLmNyZWF0ZVNwYW5zRm9yTm9kZVRpdGxlPWZ1bmN0aW9uKGNvbnRhaW5lcixub2RlVGl0bGUpe2NvbnN0IG1hdGNoPW5vZGVUaXRsZS5tYXRjaCgvKFteIy5dKykoI1teLl0rKT8oXC4uKik/Lyk7Y29udGFpbmVyLmNyZWF0ZUNoaWxkKCdzcGFuJywnd2Via2l0LWh0bWwtdGFnLW5hbWUnKS50ZXh0Q29udGVudD1tYXRjaFsxXTtpZihtYXRjaFsyXSkKY29udGFpbmVyLmNyZWF0ZUNoaWxkKCdzcGFuJywnd2Via2l0LWh0bWwtYXR0cmlidXRlLXZhbHVlJykudGV4dENvbnRlbnQ9bWF0Y2hbMl07aWYobWF0Y2hbM10pCmNvbnRhaW5lci5jcmVhdGVDaGlsZCgnc3BhbicsJ3dlYmtpdC1odG1sLWF0dHJpYnV0ZS1uYW1lJykudGV4dENvbnRlbnQ9bWF0Y2hbM107fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm9iamVjdF91aS9jdXN0b21QcmV2aWV3Q29tcG9uZW50LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uY3VzdG9tLWV4cGFuZGFibGUtc2VjdGlvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLmN1c3RvbS1leHBhbmQtaWNvbiB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogLTJweDtcbiAgICBiYWNrZ3JvdW5kOiBibGFjaztcbn1cblxuLmN1c3RvbS1leHBhbmRhYmxlLXNlY3Rpb24tc3RhbmRhcmQtc2VjdGlvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4vKiMgc291cmNlVVJMPW9iamVjdF91aS9jdXN0b21QcmV2aWV3Q29tcG9uZW50LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm9iamVjdF91aS9vYmplY3RQb3BvdmVyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5vYmplY3QtcG9wb3Zlci1jb250ZW50IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmbGV4OiAxIDEgYXV0bztcbn1cblxuLm9iamVjdC1wb3BvdmVyLXRpdGxlIHtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgcGFkZGluZy1sZWZ0OiAxOHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAycHg7XG59XG5cbi5vYmplY3QtcG9wb3Zlci10cmVlIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiKDE4NCwgMTg0LCAxODQpO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTNweCk7XG59XG5cbi5vYmplY3QtcG9wb3Zlci1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmZ1bmN0aW9uLXBvcG92ZXItdGl0bGUge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQUFBO1xuICAgIG1hcmdpbi1ib3R0b206IDNweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5mdW5jdGlvbi1wb3BvdmVyLXRpdGxlIC5mdW5jdGlvbi1uYW1lIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmZ1bmN0aW9uLXRpdGxlLWxpbmstY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uZnVuY3Rpb24tdGl0bGUtbGluay1jb250YWluZXIgLmRldnRvb2xzLWxpbmsge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmZ1bmN0aW9uLWxvY2F0aW9uLXN0ZXAtaW50byB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xufVxuXG4vKiMgc291cmNlVVJMPW9iamVjdF91aS9vYmplY3RQb3BvdmVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm9iamVjdF91aS9vYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ub2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbi1kaW1tZWQge1xuICAgIG9wYWNpdHk6IDAuNjtcbn1cblxuLm9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24ge1xuICAgIHBhZGRpbmc6IDAgMCAwcHggMHB4O1xuICAgIGNvbG9yOiByZ2IoMzMsMzMsMzMpICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4ub2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbiBsaSB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLm9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24gbGk6OmJlZm9yZSB7XG4gICAgdG9wOiAtMXB4O1xufVxuXG4ub2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbiBsaS5lZGl0aW5nLXN1Yi1wYXJ0IHtcbiAgICBwYWRkaW5nOiAzcHggMTJweCA4cHggNnB4O1xuICAgIG1hcmdpbjogLTFweCAtNnB4IC04cHggLTZweDtcbiAgICB0ZXh0LW92ZXJmbG93OiBjbGlwO1xufVxuXG4ub2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbiBsaS5lZGl0aW5nIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICB0ZXh0LW92ZXJmbG93OiBjbGlwO1xufVxuXG4udHJlZS1vdXRsaW5lIG9sLnRpdGxlLWxlc3MtbW9kZSB7XG4gICAgcGFkZGluZy1sZWZ0OiAwcHg7XG59XG5cbi5vYmplY3QtcHJvcGVydGllcy1zZWN0aW9uIC5zeW50aGV0aWMtcHJvcGVydHkge1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLm9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24tcm9vdC1lbGVtZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XG5cbi5vYmplY3QtcHJvcGVydGllcy1zZWN0aW9uIC5lZGl0YWJsZS1kaXYge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIyBzb3VyY2VVUkw9b2JqZWN0X3VpL29iamVjdFByb3BlcnRpZXNTZWN0aW9uLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbIm9iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ub2JqZWN0LXZhbHVlLXNjaWVudGlmaWMtbm90YXRpb24tZXhwb25lbnQge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4ub2JqZWN0LXZhbHVlLXNjaWVudGlmaWMtbm90YXRpb24tbWFudGlzc2Ege1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZmxleC1zaHJpbms6IDE7XG4gICAgbWluLXdpZHRoOiAxZXg7XG59XG5cbi5vYmplY3QtdmFsdWUtc2NpZW50aWZpYy1ub3RhdGlvbi1udW1iZXIge1xuICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbn1cblxuLnZhbHVlLm9iamVjdC12YWx1ZS1ub2RlOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU2LCAxMjEsIDIxNywgMC4xKTtcbn1cblxuLm9iamVjdC12YWx1ZS1mdW5jdGlvbi1wcmVmaXgsXG4ub2JqZWN0LXZhbHVlLWJvb2xlYW4ge1xuICAgIGNvbG9yOiByZ2IoMTMsIDM0LCAxNzApO1xufVxuXG4ub2JqZWN0LXZhbHVlLWZ1bmN0aW9uIHtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5vYmplY3QtdmFsdWUtZnVuY3Rpb24ubGlua2lmaWVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4ub2JqZWN0LXZhbHVlLW51bWJlciB7XG4gICAgY29sb3I6IHJnYigyOCwgMCwgMjA3KTtcbn1cblxuLm9iamVjdC12YWx1ZS1iaWdpbnQge1xuICAgIGNvbG9yOiByZ2IoMCwgOTMsIDApO1xufVxuXG4ub2JqZWN0LXZhbHVlLXN0cmluZyxcbi5vYmplY3QtdmFsdWUtcmVnZXhwLFxuLm9iamVjdC12YWx1ZS1zeW1ib2wge1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgdW5pY29kZS1iaWRpOiAtd2Via2l0LWlzb2xhdGU7XG4gICAgY29sb3I6IHJnYigxOTYsIDI2LCAyMik7XG59XG5cbi5vYmplY3QtdmFsdWUtc3RyaW5nLXF1b3RlIHtcbiAgICBjb2xvcjogIzIyMjtcbn1cblxuLm9iamVjdC12YWx1ZS1ub2RlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICAgIGNvbG9yOiByZ2IoNDgsIDU3LCA2Nik7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ub2JqZWN0LXZhbHVlLW51bGwsXG4ub2JqZWN0LXZhbHVlLXVuZGVmaW5lZCB7XG4gICAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTtcbn1cblxuLm9iamVjdC12YWx1ZSB7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4ub2JqZWN0LXZhbHVlLWNhbGN1bGF0ZS12YWx1ZS1idXR0b246aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4ub2JqZWN0LXByb3BlcnRpZXMtc2VjdGlvbi1jdXN0b20tc2VjdGlvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAub2JqZWN0LXZhbHVlLW51bWJlcixcbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLm9iamVjdC12YWx1ZS1udW1iZXIsXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5vYmplY3QtdmFsdWUtYm9vbGVhbixcbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgLm9iamVjdC12YWx1ZS1ib29sZWFuIHtcbiAgICBjb2xvcjogaHNsKDI1MiwgMTAwJSwgNzUlKTtcbn1cblxuLm9iamVjdC1wcm9wZXJ0aWVzLXNlY3Rpb24gLm9iamVjdC1kZXNjcmlwdGlvbiB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi52YWx1ZSAub2JqZWN0LXByb3BlcnRpZXMtcHJldmlldyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLm5hbWUge1xuICAgIGNvbG9yOiByZ2IoMTM2LCAxOSwgMTQ1KTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLm9iamVjdC1wcm9wZXJ0aWVzLXByZXZpZXcgLm5hbWUge1xuICAgIGNvbG9yOiAjNTY1NjU2O1xufVxuXG4vKiMgc291cmNlVVJMPW9iamVjdF91aS9vYmplY3RWYWx1ZS5jc3MgKi8iO1BlcmZVSS5DaGFydFZpZXdwb3J0RGVsZWdhdGU9ZnVuY3Rpb24oKXt9O1BlcmZVSS5DaGFydFZpZXdwb3J0RGVsZWdhdGUucHJvdG90eXBlPXt3aW5kb3dDaGFuZ2VkKHN0YXJ0VGltZSxlbmRUaW1lLGFuaW1hdGUpe30sdXBkYXRlUmFuZ2VTZWxlY3Rpb24oc3RhcnRUaW1lLGVuZFRpbWUpe30sc2V0U2l6ZSh3aWR0aCxoZWlnaHQpe30sdXBkYXRlKCl7fX07UGVyZlVJLkNoYXJ0Vmlld3BvcnQ9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGRlbGVnYXRlKXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncGVyZl91aS9jaGFydFZpZXdwb3J0LmNzcycpO3RoaXMuX2RlbGVnYXRlPWRlbGVnYXRlO3RoaXMudmlld3BvcnRFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbGwnKTt0aGlzLnZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX3VwZGF0ZUN1cnNvclBvc2l0aW9uLmJpbmQodGhpcyksZmFsc2UpO3RoaXMudmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0Jyx0aGlzLl9vbk1vdXNlT3V0LmJpbmQodGhpcyksZmFsc2UpO3RoaXMudmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLHRoaXMuX29uTW91c2VXaGVlbC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLnZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbkNoYXJ0S2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLnZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsdGhpcy5fb25DaGFydEtleVVwLmJpbmQodGhpcyksZmFsc2UpO1VJLmluc3RhbGxEcmFnSGFuZGxlKHRoaXMudmlld3BvcnRFbGVtZW50LHRoaXMuX3N0YXJ0RHJhZ2dpbmcuYmluZCh0aGlzKSx0aGlzLl9kcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX2VuZERyYWdnaW5nLmJpbmQodGhpcyksJy13ZWJraXQtZ3JhYmJpbmcnLG51bGwpO1VJLmluc3RhbGxEcmFnSGFuZGxlKHRoaXMudmlld3BvcnRFbGVtZW50LHRoaXMuX3N0YXJ0UmFuZ2VTZWxlY3Rpb24uYmluZCh0aGlzKSx0aGlzLl9yYW5nZVNlbGVjdGlvbkRyYWdnaW5nLmJpbmQodGhpcyksdGhpcy5fZW5kUmFuZ2VTZWxlY3Rpb24uYmluZCh0aGlzKSwndGV4dCcsbnVsbCk7dGhpcy5fYWx3YXlzU2hvd1ZlcnRpY2FsU2Nyb2xsPWZhbHNlO3RoaXMuX3JhbmdlU2VsZWN0aW9uRW5hYmxlZD10cnVlO3RoaXMuX3ZTY3JvbGxFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2NoYXJ0LXZpZXdwb3J0LXYtc2Nyb2xsJyk7dGhpcy5fdlNjcm9sbENvbnRlbnQ9dGhpcy5fdlNjcm9sbEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuX3ZTY3JvbGxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fc2VsZWN0aW9uT3ZlcmxheT10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjaGFydC12aWV3cG9ydC1zZWxlY3Rpb24tb3ZlcmxheSBoaWRkZW4nKTt0aGlzLl9zZWxlY3RlZFRpbWVTcGFuTGFiZWw9dGhpcy5fc2VsZWN0aW9uT3ZlcmxheS5jcmVhdGVDaGlsZCgnZGl2JywndGltZS1zcGFuJyk7dGhpcy5fY3Vyc29yRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjaGFydC1jdXJzb3ItZWxlbWVudCBoaWRkZW4nKTt0aGlzLnJlc2V0KCk7fQphbHdheXNTaG93VmVydGljYWxTY3JvbGwoKXt0aGlzLl9hbHdheXNTaG93VmVydGljYWxTY3JvbGw9dHJ1ZTt0aGlzLl92U2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhbHdheXMtc2hvdy1zY3JvbGxiYXInKTt9CmRpc2FibGVSYW5nZVNlbGVjdGlvbigpe3RoaXMuX3JhbmdlU2VsZWN0aW9uRW5hYmxlZD1mYWxzZTt0aGlzLl9yYW5nZVNlbGVjdGlvblN0YXJ0PW51bGw7dGhpcy5fcmFuZ2VTZWxlY3Rpb25FbmQ9bnVsbDt0aGlzLl91cGRhdGVSYW5nZVNlbGVjdGlvbk92ZXJsYXkoKTt9CmlzRHJhZ2dpbmcoKXtyZXR1cm4gdGhpcy5faXNEcmFnZ2luZzt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7cmV0dXJuW3RoaXMuX3ZTY3JvbGxFbGVtZW50XTt9Cl91cGRhdGVTY3JvbGxCYXIoKXtjb25zdCBzaG93U2Nyb2xsPXRoaXMuX2Fsd2F5c1Nob3dWZXJ0aWNhbFNjcm9sbHx8dGhpcy5fdG90YWxIZWlnaHQ+dGhpcy5fb2Zmc2V0SGVpZ2h0O2lmKHRoaXMuX3ZTY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaGlkZGVuJykhPT1zaG93U2Nyb2xsKQpyZXR1cm47dGhpcy5fdlNjcm9sbEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhc2hvd1Njcm9sbCk7dGhpcy5fdXBkYXRlQ29udGVudEVsZW1lbnRTaXplKCk7fQpvblJlc2l6ZSgpe3RoaXMuX3VwZGF0ZVNjcm9sbEJhcigpO3RoaXMuX3VwZGF0ZUNvbnRlbnRFbGVtZW50U2l6ZSgpO3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9CnJlc2V0KCl7dGhpcy5fdlNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wPTA7dGhpcy5fc2Nyb2xsVG9wPTA7dGhpcy5fcmFuZ2VTZWxlY3Rpb25TdGFydD1udWxsO3RoaXMuX3JhbmdlU2VsZWN0aW9uRW5kPW51bGw7dGhpcy5faXNEcmFnZ2luZz1mYWxzZTt0aGlzLl9kcmFnU3RhcnRQb2ludFg9MDt0aGlzLl9kcmFnU3RhcnRQb2ludFk9MDt0aGlzLl9kcmFnU3RhcnRTY3JvbGxUb3A9MDt0aGlzLl92aXNpYmxlTGVmdFRpbWU9MDt0aGlzLl92aXNpYmxlUmlnaHRUaW1lPTA7dGhpcy5fb2Zmc2V0V2lkdGg9MDt0aGlzLl9vZmZzZXRIZWlnaHQ9MDt0aGlzLl90b3RhbEhlaWdodD0wO3RoaXMuX3RhcmdldExlZnRUaW1lPTA7dGhpcy5fdGFyZ2V0UmlnaHRUaW1lPTA7dGhpcy5fdXBkYXRlQ29udGVudEVsZW1lbnRTaXplKCk7fQpfdXBkYXRlQ29udGVudEVsZW1lbnRTaXplKCl7bGV0IG9mZnNldFdpZHRoPXRoaXMuX3ZTY3JvbGxFbGVtZW50Lm9mZnNldExlZnQ7aWYoIW9mZnNldFdpZHRoKQpvZmZzZXRXaWR0aD10aGlzLmNvbnRlbnRFbGVtZW50Lm9mZnNldFdpZHRoO3RoaXMuX29mZnNldFdpZHRoPW9mZnNldFdpZHRoO3RoaXMuX29mZnNldEhlaWdodD10aGlzLmNvbnRlbnRFbGVtZW50Lm9mZnNldEhlaWdodDt0aGlzLl9kZWxlZ2F0ZS5zZXRTaXplKHRoaXMuX29mZnNldFdpZHRoLHRoaXMuX29mZnNldEhlaWdodCk7fQpzZXRDb250ZW50SGVpZ2h0KHRvdGFsSGVpZ2h0KXt0aGlzLl90b3RhbEhlaWdodD10b3RhbEhlaWdodDt0aGlzLl92U2Nyb2xsQ29udGVudC5zdHlsZS5oZWlnaHQ9dG90YWxIZWlnaHQrJ3B4Jzt0aGlzLl91cGRhdGVTY3JvbGxCYXIoKTtpZih0aGlzLl9zY3JvbGxUb3ArdGhpcy5fb2Zmc2V0SGVpZ2h0PD10b3RhbEhlaWdodCkKcmV0dXJuO3RoaXMuX3Njcm9sbFRvcD1NYXRoLm1heCgwLHRvdGFsSGVpZ2h0LXRoaXMuX29mZnNldEhlaWdodCk7dGhpcy5fdlNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wPXRoaXMuX3Njcm9sbFRvcDt9CnNldFNjcm9sbE9mZnNldChvZmZzZXQsaGVpZ2h0KXtoZWlnaHQ9aGVpZ2h0fHwwO2lmKHRoaXMuX3ZTY3JvbGxFbGVtZW50LnNjcm9sbFRvcD5vZmZzZXQpCnRoaXMuX3ZTY3JvbGxFbGVtZW50LnNjcm9sbFRvcD1vZmZzZXQ7ZWxzZSBpZih0aGlzLl92U2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A8b2Zmc2V0LXRoaXMuX29mZnNldEhlaWdodCtoZWlnaHQpCnRoaXMuX3ZTY3JvbGxFbGVtZW50LnNjcm9sbFRvcD1vZmZzZXQtdGhpcy5fb2Zmc2V0SGVpZ2h0K2hlaWdodDt9CnNjcm9sbE9mZnNldCgpe3JldHVybiB0aGlzLl92U2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7fQpzZXRCb3VuZGFyaWVzKHplcm9UaW1lLHRvdGFsVGltZSl7dGhpcy5fbWluaW11bUJvdW5kYXJ5PXplcm9UaW1lO3RoaXMuX3RvdGFsVGltZT10b3RhbFRpbWU7fQpfb25Nb3VzZVdoZWVsKGUpe2NvbnN0IGRvWm9vbUluc3RlYWQ9ZS5zaGlmdEtleV4oQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2ZsYW1lY2hhcnRNb3VzZVdoZWVsQWN0aW9uJykuZ2V0KCk9PT0nem9vbScpO2NvbnN0IHBhblZlcnRpY2FsbHk9IWRvWm9vbUluc3RlYWQmJihlLndoZWVsRGVsdGFZfHxNYXRoLmFicyhlLndoZWVsRGVsdGFYKT09PTEyMCk7Y29uc3QgcGFuSG9yaXpvbnRhbGx5PWRvWm9vbUluc3RlYWQmJk1hdGguYWJzKGUud2hlZWxEZWx0YVgpPk1hdGguYWJzKGUud2hlZWxEZWx0YVkpO2lmKHBhblZlcnRpY2FsbHkpe3RoaXMuX3ZTY3JvbGxFbGVtZW50LnNjcm9sbFRvcC09KGUud2hlZWxEZWx0YVl8fGUud2hlZWxEZWx0YVgpLzEyMCp0aGlzLl9vZmZzZXRIZWlnaHQvODt9ZWxzZSBpZihwYW5Ib3Jpem9udGFsbHkpe3RoaXMuX2hhbmRsZVBhbkdlc3R1cmUoLWUud2hlZWxEZWx0YVgsdHJ1ZSk7fWVsc2V7Y29uc3QgbW91c2VXaGVlbFpvb21TcGVlZD0xLzEyMDt0aGlzLl9oYW5kbGVab29tR2VzdHVyZShNYXRoLnBvdygxLjIsLShlLndoZWVsRGVsdGFZfHxlLndoZWVsRGVsdGFYKSptb3VzZVdoZWVsWm9vbVNwZWVkKS0xKTt9CmUuY29uc3VtZSh0cnVlKTt9Cl9zdGFydERyYWdnaW5nKGV2ZW50KXtpZihldmVudC5zaGlmdEtleSkKcmV0dXJuIGZhbHNlO3RoaXMuX2lzRHJhZ2dpbmc9dHJ1ZTt0aGlzLl9kcmFnU3RhcnRQb2ludFg9ZXZlbnQucGFnZVg7dGhpcy5fZHJhZ1N0YXJ0UG9pbnRZPWV2ZW50LnBhZ2VZO3RoaXMuX2RyYWdTdGFydFNjcm9sbFRvcD10aGlzLl92U2Nyb2xsRWxlbWVudC5zY3JvbGxUb3A7dGhpcy52aWV3cG9ydEVsZW1lbnQuc3R5bGUuY3Vyc29yPScnO3JldHVybiB0cnVlO30KX2RyYWdnaW5nKGV2ZW50KXtjb25zdCBwaXhlbFNoaWZ0PXRoaXMuX2RyYWdTdGFydFBvaW50WC1ldmVudC5wYWdlWDt0aGlzLl9kcmFnU3RhcnRQb2ludFg9ZXZlbnQucGFnZVg7dGhpcy5faGFuZGxlUGFuR2VzdHVyZShwaXhlbFNoaWZ0KTtjb25zdCBwaXhlbFNjcm9sbD10aGlzLl9kcmFnU3RhcnRQb2ludFktZXZlbnQucGFnZVk7dGhpcy5fdlNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wPXRoaXMuX2RyYWdTdGFydFNjcm9sbFRvcCtwaXhlbFNjcm9sbDt9Cl9lbmREcmFnZ2luZygpe3RoaXMuX2lzRHJhZ2dpbmc9ZmFsc2U7fQpfc3RhcnRSYW5nZVNlbGVjdGlvbihldmVudCl7aWYoIWV2ZW50LnNoaWZ0S2V5fHwhdGhpcy5fcmFuZ2VTZWxlY3Rpb25FbmFibGVkKQpyZXR1cm4gZmFsc2U7dGhpcy5faXNEcmFnZ2luZz10cnVlO3RoaXMuX3NlbGVjdGlvbk9mZnNldFNoaWZ0WD1ldmVudC5vZmZzZXRYLWV2ZW50LnBhZ2VYO3RoaXMuX3NlbGVjdGlvbk9mZnNldFNoaWZ0WT1ldmVudC5vZmZzZXRZLWV2ZW50LnBhZ2VZO3RoaXMuX3NlbGVjdGlvblN0YXJ0WD1ldmVudC5vZmZzZXRYO2NvbnN0IHN0eWxlPXRoaXMuX3NlbGVjdGlvbk92ZXJsYXkuc3R5bGU7c3R5bGUubGVmdD10aGlzLl9zZWxlY3Rpb25TdGFydFgrJ3B4JztzdHlsZS53aWR0aD0nMXB4Jzt0aGlzLl9zZWxlY3RlZFRpbWVTcGFuTGFiZWwudGV4dENvbnRlbnQ9Jyc7dGhpcy5fc2VsZWN0aW9uT3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtyZXR1cm4gdHJ1ZTt9Cl9lbmRSYW5nZVNlbGVjdGlvbigpe3RoaXMuX2lzRHJhZ2dpbmc9ZmFsc2U7dGhpcy5fc2VsZWN0aW9uU3RhcnRYPW51bGw7fQpoaWRlUmFuZ2VTZWxlY3Rpb24oKXt0aGlzLl9zZWxlY3Rpb25PdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX3JhbmdlU2VsZWN0aW9uU3RhcnQ9bnVsbDt0aGlzLl9yYW5nZVNlbGVjdGlvbkVuZD1udWxsO30Kc2V0UmFuZ2VTZWxlY3Rpb24oc3RhcnRUaW1lLGVuZFRpbWUpe2lmKCF0aGlzLl9yYW5nZVNlbGVjdGlvbkVuYWJsZWQpCnJldHVybjt0aGlzLl9yYW5nZVNlbGVjdGlvblN0YXJ0PU1hdGgubWluKHN0YXJ0VGltZSxlbmRUaW1lKTt0aGlzLl9yYW5nZVNlbGVjdGlvbkVuZD1NYXRoLm1heChzdGFydFRpbWUsZW5kVGltZSk7dGhpcy5fdXBkYXRlUmFuZ2VTZWxlY3Rpb25PdmVybGF5KCk7dGhpcy5fZGVsZWdhdGUudXBkYXRlUmFuZ2VTZWxlY3Rpb24odGhpcy5fcmFuZ2VTZWxlY3Rpb25TdGFydCx0aGlzLl9yYW5nZVNlbGVjdGlvbkVuZCk7fQpvbkNsaWNrKGV2ZW50KXtjb25zdCB0aW1lPXRoaXMucGl4ZWxUb1RpbWUoZXZlbnQub2Zmc2V0WCk7aWYodGhpcy5fcmFuZ2VTZWxlY3Rpb25TdGFydCE9PW51bGwmJnRpbWU+PXRoaXMuX3JhbmdlU2VsZWN0aW9uU3RhcnQmJnRpbWU8PXRoaXMuX3JhbmdlU2VsZWN0aW9uRW5kKQpyZXR1cm47dGhpcy5oaWRlUmFuZ2VTZWxlY3Rpb24oKTt9Cl9yYW5nZVNlbGVjdGlvbkRyYWdnaW5nKGV2ZW50KXtjb25zdCB4PU51bWJlci5jb25zdHJhaW4oZXZlbnQucGFnZVgrdGhpcy5fc2VsZWN0aW9uT2Zmc2V0U2hpZnRYLDAsdGhpcy5fb2Zmc2V0V2lkdGgpO2NvbnN0IHN0YXJ0PXRoaXMucGl4ZWxUb1RpbWUodGhpcy5fc2VsZWN0aW9uU3RhcnRYKTtjb25zdCBlbmQ9dGhpcy5waXhlbFRvVGltZSh4KTt0aGlzLnNldFJhbmdlU2VsZWN0aW9uKHN0YXJ0LGVuZCk7fQpfdXBkYXRlUmFuZ2VTZWxlY3Rpb25PdmVybGF5KCl7Y29uc3QgbWFyZ2luPTEwMDtjb25zdCBsZWZ0PU51bWJlci5jb25zdHJhaW4odGhpcy50aW1lVG9Qb3NpdGlvbih0aGlzLl9yYW5nZVNlbGVjdGlvblN0YXJ0KSwtbWFyZ2luLHRoaXMuX29mZnNldFdpZHRoK21hcmdpbik7Y29uc3QgcmlnaHQ9TnVtYmVyLmNvbnN0cmFpbih0aGlzLnRpbWVUb1Bvc2l0aW9uKHRoaXMuX3JhbmdlU2VsZWN0aW9uRW5kKSwtbWFyZ2luLHRoaXMuX29mZnNldFdpZHRoK21hcmdpbik7Y29uc3Qgc3R5bGU9dGhpcy5fc2VsZWN0aW9uT3ZlcmxheS5zdHlsZTtzdHlsZS5sZWZ0PWxlZnQrJ3B4JztzdHlsZS53aWR0aD0ocmlnaHQtbGVmdCkrJ3B4Jztjb25zdCB0aW1lU3Bhbj10aGlzLl9yYW5nZVNlbGVjdGlvbkVuZC10aGlzLl9yYW5nZVNlbGVjdGlvblN0YXJ0O3RoaXMuX3NlbGVjdGVkVGltZVNwYW5MYWJlbC50ZXh0Q29udGVudD1OdW1iZXIucHJlY2lzZU1pbGxpc1RvU3RyaW5nKHRpbWVTcGFuLDIpO30KX29uU2Nyb2xsKCl7dGhpcy5fc2Nyb2xsVG9wPXRoaXMuX3ZTY3JvbGxFbGVtZW50LnNjcm9sbFRvcDt0aGlzLnNjaGVkdWxlVXBkYXRlKCk7fQpfb25Nb3VzZU91dCgpe3RoaXMuX2xhc3RNb3VzZU9mZnNldFg9LTE7dGhpcy5fc2hvd0N1cnNvcihmYWxzZSk7fQpfdXBkYXRlQ3Vyc29yUG9zaXRpb24oZSl7dGhpcy5fc2hvd0N1cnNvcihlLnNoaWZ0S2V5KTt0aGlzLl9jdXJzb3JFbGVtZW50LnN0eWxlLmxlZnQ9ZS5vZmZzZXRYKydweCc7dGhpcy5fbGFzdE1vdXNlT2Zmc2V0WD1lLm9mZnNldFg7fQpwaXhlbFRvVGltZSh4KXtyZXR1cm4gdGhpcy5waXhlbFRvVGltZU9mZnNldCh4KSt0aGlzLl92aXNpYmxlTGVmdFRpbWU7fQpwaXhlbFRvVGltZU9mZnNldCh4KXtyZXR1cm4geCoodGhpcy5fdmlzaWJsZVJpZ2h0VGltZS10aGlzLl92aXNpYmxlTGVmdFRpbWUpL3RoaXMuX29mZnNldFdpZHRoO30KdGltZVRvUG9zaXRpb24odGltZSl7cmV0dXJuIE1hdGguZmxvb3IoKHRpbWUtdGhpcy5fdmlzaWJsZUxlZnRUaW1lKS8odGhpcy5fdmlzaWJsZVJpZ2h0VGltZS10aGlzLl92aXNpYmxlTGVmdFRpbWUpKnRoaXMuX29mZnNldFdpZHRoKTt9CnRpbWVUb1BpeGVsKCl7cmV0dXJuIHRoaXMuX29mZnNldFdpZHRoLyh0aGlzLl92aXNpYmxlUmlnaHRUaW1lLXRoaXMuX3Zpc2libGVMZWZ0VGltZSk7fQpfc2hvd0N1cnNvcih2aXNpYmxlKXt0aGlzLl9jdXJzb3JFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXZpc2libGV8fHRoaXMuX2lzRHJhZ2dpbmcpO30KX29uQ2hhcnRLZXlEb3duKGUpe3RoaXMuX3Nob3dDdXJzb3IoZS5zaGlmdEtleSk7dGhpcy5faGFuZGxlWm9vbVBhbktleXMoZSk7fQpfb25DaGFydEtleVVwKGUpe3RoaXMuX3Nob3dDdXJzb3IoZS5zaGlmdEtleSk7fQpfaGFuZGxlWm9vbVBhbktleXMoZSl7aWYoIVVJLktleWJvYXJkU2hvcnRjdXQuaGFzTm9Nb2RpZmllcnMoZSkpCnJldHVybjtjb25zdCB6b29tRmFjdG9yPWUuc2hpZnRLZXk/MC44OjAuMztjb25zdCBwYW5PZmZzZXQ9ZS5zaGlmdEtleT8zMjA6MTYwO3N3aXRjaChlLmNvZGUpe2Nhc2UnS2V5QSc6dGhpcy5faGFuZGxlUGFuR2VzdHVyZSgtcGFuT2Zmc2V0LHRydWUpO2JyZWFrO2Nhc2UnS2V5RCc6dGhpcy5faGFuZGxlUGFuR2VzdHVyZShwYW5PZmZzZXQsdHJ1ZSk7YnJlYWs7Y2FzZSdLZXlXJzp0aGlzLl9oYW5kbGVab29tR2VzdHVyZSgtem9vbUZhY3Rvcik7YnJlYWs7Y2FzZSdLZXlTJzp0aGlzLl9oYW5kbGVab29tR2VzdHVyZSh6b29tRmFjdG9yKTticmVhaztkZWZhdWx0OnJldHVybjt9CmUuY29uc3VtZSh0cnVlKTt9Cl9oYW5kbGVab29tR2VzdHVyZSh6b29tKXtjb25zdCBib3VuZHM9e2xlZnQ6dGhpcy5fdGFyZ2V0TGVmdFRpbWUscmlnaHQ6dGhpcy5fdGFyZ2V0UmlnaHRUaW1lfTtjb25zdCBjdXJzb3JUaW1lPXRoaXMucGl4ZWxUb1RpbWUodGhpcy5fbGFzdE1vdXNlT2Zmc2V0WCk7Ym91bmRzLmxlZnQrPShib3VuZHMubGVmdC1jdXJzb3JUaW1lKSp6b29tO2JvdW5kcy5yaWdodCs9KGJvdW5kcy5yaWdodC1jdXJzb3JUaW1lKSp6b29tO3RoaXMuX3JlcXVlc3RXaW5kb3dUaW1lcyhib3VuZHMsdHJ1ZSk7fQpfaGFuZGxlUGFuR2VzdHVyZShvZmZzZXQsYW5pbWF0ZSl7Y29uc3QgYm91bmRzPXtsZWZ0OnRoaXMuX3RhcmdldExlZnRUaW1lLHJpZ2h0OnRoaXMuX3RhcmdldFJpZ2h0VGltZX07Y29uc3QgdGltZU9mZnNldD1OdW1iZXIuY29uc3RyYWluKHRoaXMucGl4ZWxUb1RpbWVPZmZzZXQob2Zmc2V0KSx0aGlzLl9taW5pbXVtQm91bmRhcnktYm91bmRzLmxlZnQsdGhpcy5fdG90YWxUaW1lK3RoaXMuX21pbmltdW1Cb3VuZGFyeS1ib3VuZHMucmlnaHQpO2JvdW5kcy5sZWZ0Kz10aW1lT2Zmc2V0O2JvdW5kcy5yaWdodCs9dGltZU9mZnNldDt0aGlzLl9yZXF1ZXN0V2luZG93VGltZXMoYm91bmRzLCEhYW5pbWF0ZSk7fQpfcmVxdWVzdFdpbmRvd1RpbWVzKGJvdW5kcyxhbmltYXRlKXtjb25zdCBtYXhCb3VuZD10aGlzLl9taW5pbXVtQm91bmRhcnkrdGhpcy5fdG90YWxUaW1lO2lmKGJvdW5kcy5sZWZ0PHRoaXMuX21pbmltdW1Cb3VuZGFyeSl7Ym91bmRzLnJpZ2h0PU1hdGgubWluKGJvdW5kcy5yaWdodCt0aGlzLl9taW5pbXVtQm91bmRhcnktYm91bmRzLmxlZnQsbWF4Qm91bmQpO2JvdW5kcy5sZWZ0PXRoaXMuX21pbmltdW1Cb3VuZGFyeTt9ZWxzZSBpZihib3VuZHMucmlnaHQ+bWF4Qm91bmQpe2JvdW5kcy5sZWZ0PU1hdGgubWF4KGJvdW5kcy5sZWZ0LWJvdW5kcy5yaWdodCttYXhCb3VuZCx0aGlzLl9taW5pbXVtQm91bmRhcnkpO2JvdW5kcy5yaWdodD1tYXhCb3VuZDt9CmlmKGJvdW5kcy5yaWdodC1ib3VuZHMubGVmdDxQZXJmVUkuRmxhbWVDaGFydC5NaW5pbWFsVGltZVdpbmRvd01zKQpyZXR1cm47dGhpcy5fZGVsZWdhdGUud2luZG93Q2hhbmdlZChib3VuZHMubGVmdCxib3VuZHMucmlnaHQsYW5pbWF0ZSk7fQpzY2hlZHVsZVVwZGF0ZSgpe2lmKHRoaXMuX3VwZGF0ZVRpbWVySWR8fHRoaXMuX2NhbmNlbFdpbmRvd1RpbWVzQW5pbWF0aW9uKQpyZXR1cm47dGhpcy5fdXBkYXRlVGltZXJJZD10aGlzLmVsZW1lbnQud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5fdXBkYXRlVGltZXJJZD0wO3RoaXMuX3VwZGF0ZSgpO30pO30KX3VwZGF0ZSgpe3RoaXMuX3VwZGF0ZVJhbmdlU2VsZWN0aW9uT3ZlcmxheSgpO3RoaXMuX2RlbGVnYXRlLnVwZGF0ZSgpO30Kc2V0V2luZG93VGltZXMoc3RhcnRUaW1lLGVuZFRpbWUsYW5pbWF0ZSl7aWYoc3RhcnRUaW1lPT09dGhpcy5fdGFyZ2V0TGVmdFRpbWUmJmVuZFRpbWU9PT10aGlzLl90YXJnZXRSaWdodFRpbWUpCnJldHVybjtpZighYW5pbWF0ZXx8dGhpcy5fdmlzaWJsZUxlZnRUaW1lPT09MHx8dGhpcy5fdmlzaWJsZVJpZ2h0VGltZT09PUluZmluaXR5fHwoc3RhcnRUaW1lPT09MCYmZW5kVGltZT09PUluZmluaXR5KXx8KHN0YXJ0VGltZT09PUluZmluaXR5JiZlbmRUaW1lPT09SW5maW5pdHkpKXt0aGlzLl90YXJnZXRMZWZ0VGltZT1zdGFydFRpbWU7dGhpcy5fdGFyZ2V0UmlnaHRUaW1lPWVuZFRpbWU7dGhpcy5fdmlzaWJsZUxlZnRUaW1lPXN0YXJ0VGltZTt0aGlzLl92aXNpYmxlUmlnaHRUaW1lPWVuZFRpbWU7dGhpcy5zY2hlZHVsZVVwZGF0ZSgpO3JldHVybjt9CmlmKHRoaXMuX2NhbmNlbFdpbmRvd1RpbWVzQW5pbWF0aW9uKXt0aGlzLl9jYW5jZWxXaW5kb3dUaW1lc0FuaW1hdGlvbigpO3RoaXMuX3Zpc2libGVMZWZ0VGltZT10aGlzLl90YXJnZXRMZWZ0VGltZTt0aGlzLl92aXNpYmxlUmlnaHRUaW1lPXRoaXMuX3RhcmdldFJpZ2h0VGltZTt9CnRoaXMuX3RhcmdldExlZnRUaW1lPXN0YXJ0VGltZTt0aGlzLl90YXJnZXRSaWdodFRpbWU9ZW5kVGltZTt0aGlzLl9jYW5jZWxXaW5kb3dUaW1lc0FuaW1hdGlvbj1VSS5hbmltYXRlRnVuY3Rpb24odGhpcy5lbGVtZW50LndpbmRvdygpLGFuaW1hdGVXaW5kb3dUaW1lcy5iaW5kKHRoaXMpLFt7ZnJvbTp0aGlzLl92aXNpYmxlTGVmdFRpbWUsdG86c3RhcnRUaW1lfSx7ZnJvbTp0aGlzLl92aXNpYmxlUmlnaHRUaW1lLHRvOmVuZFRpbWV9XSwxMDAsKCk9PnRoaXMuX2NhbmNlbFdpbmRvd1RpbWVzQW5pbWF0aW9uPW51bGwpO2Z1bmN0aW9uIGFuaW1hdGVXaW5kb3dUaW1lcyhzdGFydFRpbWUsZW5kVGltZSl7dGhpcy5fdmlzaWJsZUxlZnRUaW1lPXN0YXJ0VGltZTt0aGlzLl92aXNpYmxlUmlnaHRUaW1lPWVuZFRpbWU7dGhpcy5fdXBkYXRlKCk7fX0Kd2luZG93TGVmdFRpbWUoKXtyZXR1cm4gdGhpcy5fdmlzaWJsZUxlZnRUaW1lO30Kd2luZG93UmlnaHRUaW1lKCl7cmV0dXJuIHRoaXMuX3Zpc2libGVSaWdodFRpbWU7fX07O1BlcmZVSS5GaWxtU3RyaXBWaWV3PWNsYXNzIGV4dGVuZHMgVUkuSEJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncGVyZl91aS9maWxtU3RyaXBWaWV3LmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsbS1zdHJpcC12aWV3Jyk7dGhpcy5fc3RhdHVzTGFiZWw9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnbGFiZWwnKTt0aGlzLnJlc2V0KCk7dGhpcy5zZXRNb2RlKFBlcmZVSS5GaWxtU3RyaXBWaWV3Lk1vZGVzLlRpbWVCYXNlZCk7fQpzdGF0aWMgX3NldEltYWdlRGF0YShpbWFnZUVsZW1lbnQsZGF0YSl7aWYoZGF0YSkKaW1hZ2VFbGVtZW50LnNyYz0nZGF0YTppbWFnZS9qcGc7YmFzZTY0LCcrZGF0YTt9CnNldE1vZGUobW9kZSl7dGhpcy5fbW9kZT1tb2RlO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgndGltZS1iYXNlZCcsbW9kZT09PVBlcmZVSS5GaWxtU3RyaXBWaWV3Lk1vZGVzLlRpbWVCYXNlZCk7dGhpcy51cGRhdGUoKTt9CnNldE1vZGVsKGZpbG1TdHJpcE1vZGVsLHplcm9UaW1lLHNwYW5UaW1lKXt0aGlzLl9tb2RlbD1maWxtU3RyaXBNb2RlbDt0aGlzLl96ZXJvVGltZT16ZXJvVGltZTt0aGlzLl9zcGFuVGltZT1zcGFuVGltZTtjb25zdCBmcmFtZXM9ZmlsbVN0cmlwTW9kZWwuZnJhbWVzKCk7aWYoIWZyYW1lcy5sZW5ndGgpe3RoaXMucmVzZXQoKTtyZXR1cm47fQp0aGlzLnVwZGF0ZSgpO30KY3JlYXRlRnJhbWVFbGVtZW50KGZyYW1lKXtjb25zdCB0aW1lPWZyYW1lLnRpbWVzdGFtcDtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2ZyYW1lJyk7ZWxlbWVudC50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0RvdWJsZWNsaWNrIHRvIHpvb20gaW1hZ2UuIENsaWNrIHRvIHZpZXcgcHJlY2VkaW5nIHJlcXVlc3RzLicpO2VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWUnKS50ZXh0Q29udGVudD1OdW1iZXIubWlsbGlzVG9TdHJpbmcodGltZS10aGlzLl96ZXJvVGltZSk7Y29uc3QgaW1hZ2VFbGVtZW50PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RodW1ibmFpbCcpLmNyZWF0ZUNoaWxkKCdpbWcnKTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fb25Nb3VzZUV2ZW50LmJpbmQodGhpcyxQZXJmVUkuRmlsbVN0cmlwVmlldy5FdmVudHMuRnJhbWVTZWxlY3RlZCx0aW1lKSxmYWxzZSk7ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJyx0aGlzLl9vbk1vdXNlRXZlbnQuYmluZCh0aGlzLFBlcmZVSS5GaWxtU3RyaXBWaWV3LkV2ZW50cy5GcmFtZUVudGVyLHRpbWUpLGZhbHNlKTtlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0Jyx0aGlzLl9vbk1vdXNlRXZlbnQuYmluZCh0aGlzLFBlcmZVSS5GaWxtU3RyaXBWaWV3LkV2ZW50cy5GcmFtZUV4aXQsdGltZSksZmFsc2UpO2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX29uRG91YmxlQ2xpY2suYmluZCh0aGlzLGZyYW1lKSxmYWxzZSk7cmV0dXJuIGZyYW1lLmltYWdlRGF0YVByb21pc2UoKS50aGVuKFBlcmZVSS5GaWxtU3RyaXBWaWV3Ll9zZXRJbWFnZURhdGEuYmluZChudWxsLGltYWdlRWxlbWVudCkpLnRoZW4ocmV0dXJuRWxlbWVudCk7ZnVuY3Rpb24gcmV0dXJuRWxlbWVudCgpe3JldHVybiBlbGVtZW50O319CmZyYW1lQnlUaW1lKHRpbWUpe2Z1bmN0aW9uIGNvbXBhcmF0b3IodGltZSxmcmFtZSl7cmV0dXJuIHRpbWUtZnJhbWUudGltZXN0YW1wO30KY29uc3QgZnJhbWVzPXRoaXMuX21vZGVsLmZyYW1lcygpO2NvbnN0IGluZGV4PU1hdGgubWF4KGZyYW1lcy51cHBlckJvdW5kKHRpbWUsY29tcGFyYXRvciktMSwwKTtyZXR1cm4gZnJhbWVzW2luZGV4XTt9CnVwZGF0ZSgpe2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuO2NvbnN0IGZyYW1lcz10aGlzLl9tb2RlbC5mcmFtZXMoKTtpZighZnJhbWVzLmxlbmd0aCkKcmV0dXJuO2lmKHRoaXMuX21vZGU9PT1QZXJmVUkuRmlsbVN0cmlwVmlldy5Nb2Rlcy5GcmFtZUJhc2VkKXtQcm9taXNlLmFsbChmcmFtZXMubWFwKHRoaXMuY3JlYXRlRnJhbWVFbGVtZW50LmJpbmQodGhpcykpKS50aGVuKGFwcGVuZEVsZW1lbnRzLmJpbmQodGhpcykpO3JldHVybjt9CmNvbnN0IHdpZHRoPXRoaXMuY29udGVudEVsZW1lbnQuY2xpZW50V2lkdGg7Y29uc3Qgc2NhbGU9dGhpcy5fc3BhblRpbWUvd2lkdGg7dGhpcy5jcmVhdGVGcmFtZUVsZW1lbnQoZnJhbWVzWzBdKS50aGVuKGNvbnRpbnVlV2hlbkZyYW1lSW1hZ2VMb2FkZWQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gY29udGludWVXaGVuRnJhbWVJbWFnZUxvYWRlZChlbGVtZW50MCl7Y29uc3QgZnJhbWVXaWR0aD1NYXRoLmNlaWwoVUkubWVhc3VyZVByZWZlcnJlZFNpemUoZWxlbWVudDAsdGhpcy5jb250ZW50RWxlbWVudCkud2lkdGgpO2lmKCFmcmFtZVdpZHRoKQpyZXR1cm47Y29uc3QgcHJvbWlzZXM9W107Zm9yKGxldCBwb3M9ZnJhbWVXaWR0aDtwb3M8d2lkdGg7cG9zKz1mcmFtZVdpZHRoKXtjb25zdCB0aW1lPXBvcypzY2FsZSt0aGlzLl96ZXJvVGltZTtwcm9taXNlcy5wdXNoKHRoaXMuY3JlYXRlRnJhbWVFbGVtZW50KHRoaXMuZnJhbWVCeVRpbWUodGltZSkpLnRoZW4oZml4V2lkdGgpKTt9ClByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGFwcGVuZEVsZW1lbnRzLmJpbmQodGhpcykpO2Z1bmN0aW9uIGZpeFdpZHRoKGVsZW1lbnQpe2VsZW1lbnQuc3R5bGUud2lkdGg9ZnJhbWVXaWR0aCsncHgnO3JldHVybiBlbGVtZW50O319CmZ1bmN0aW9uIGFwcGVuZEVsZW1lbnRzKGVsZW1lbnRzKXt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxlbGVtZW50cy5sZW5ndGg7KytpKQp0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRzW2ldKTt9fQpvblJlc2l6ZSgpe2lmKHRoaXMuX21vZGU9PT1QZXJmVUkuRmlsbVN0cmlwVmlldy5Nb2Rlcy5GcmFtZUJhc2VkKQpyZXR1cm47dGhpcy51cGRhdGUoKTt9Cl9vbk1vdXNlRXZlbnQoZXZlbnROYW1lLHRpbWVzdGFtcCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoZXZlbnROYW1lLHRpbWVzdGFtcCk7fQpfb25Eb3VibGVDbGljayhmaWxtU3RyaXBGcmFtZSl7bmV3IFBlcmZVSS5GaWxtU3RyaXBWaWV3LkRpYWxvZyhmaWxtU3RyaXBGcmFtZSx0aGlzLl96ZXJvVGltZSk7fQpyZXNldCgpe3RoaXMuX3plcm9UaW1lPTA7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fc3RhdHVzTGFiZWwpO30Kc2V0U3RhdHVzVGV4dCh0ZXh0KXt0aGlzLl9zdGF0dXNMYWJlbC50ZXh0Q29udGVudD10ZXh0O319O1BlcmZVSS5GaWxtU3RyaXBWaWV3LkV2ZW50cz17RnJhbWVTZWxlY3RlZDpTeW1ib2woJ0ZyYW1lU2VsZWN0ZWQnKSxGcmFtZUVudGVyOlN5bWJvbCgnRnJhbWVFbnRlcicpLEZyYW1lRXhpdDpTeW1ib2woJ0ZyYW1lRXhpdCcpLH07UGVyZlVJLkZpbG1TdHJpcFZpZXcuTW9kZXM9e1RpbWVCYXNlZDonVGltZUJhc2VkJyxGcmFtZUJhc2VkOidGcmFtZUJhc2VkJ307UGVyZlVJLkZpbG1TdHJpcFZpZXcuRGlhbG9nPWNsYXNze2NvbnN0cnVjdG9yKGZpbG1TdHJpcEZyYW1lLHplcm9UaW1lKXtjb25zdCBwcmV2QnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oJ1x1MjVDMCcsdGhpcy5fb25QcmV2RnJhbWUuYmluZCh0aGlzKSk7cHJldkJ1dHRvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ1ByZXZpb3VzIGZyYW1lJyk7Y29uc3QgbmV4dEJ1dHRvbj1VSS5jcmVhdGVUZXh0QnV0dG9uKCdcdTI1QjYnLHRoaXMuX29uTmV4dEZyYW1lLmJpbmQodGhpcykpO25leHRCdXR0b24udGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdOZXh0IGZyYW1lJyk7dGhpcy5fZnJhZ21lbnQ9VUkuRnJhZ21lbnQuYnVpbGRgCiAgICAgIDx4LXdpZGdldCBmbGV4PW5vbmUgbWFyZ2luPTEycHg+CiAgICAgICAgPHgtaGJveCBvdmVyZmxvdz1hdXRvIGJvcmRlcj0nMXB4IHNvbGlkICNkZGQnIG1heC1oZWlnaHQ9ODB2aCBtYXgtd2lkdGg9ODB2dz4KICAgICAgICAgIDxpbWcgJD1pbWFnZT48L2ltZz4KICAgICAgICA8L3gtaGJveD4KICAgICAgICA8eC1oYm94IHgtY2VudGVyIGp1c3RpZnktY29udGVudD1jZW50ZXIgbWFyZ2luLXRvcD0xMHB4PgogICAgICAgICAgJHtwcmV2QnV0dG9ufQogICAgICAgICAgPHgtaGJveCAkPXRpbWUgbWFyZ2luPThweD48L3gtaGJveD4KICAgICAgICAgICR7bmV4dEJ1dHRvbn0KICAgICAgICA8L3gtaGJveD4KICAgICAgPC94LXdpZGdldD4KICAgIGA7dGhpcy5fd2lkZ2V0PSh0aGlzLl9mcmFnbWVudC5lbGVtZW50KCkpO3RoaXMuX3dpZGdldC50YWJJbmRleD0wO3RoaXMuX3dpZGdldC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9rZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2ZyYW1lcz1maWxtU3RyaXBGcmFtZS5tb2RlbCgpLmZyYW1lcygpO3RoaXMuX2luZGV4PWZpbG1TdHJpcEZyYW1lLmluZGV4O3RoaXMuX3plcm9UaW1lPXplcm9UaW1lfHxmaWxtU3RyaXBGcmFtZS5tb2RlbCgpLnplcm9UaW1lKCk7dGhpcy5fZGlhbG9nPW51bGw7dGhpcy5fcmVuZGVyKCk7fQpfcmVzaXplKCl7aWYoIXRoaXMuX2RpYWxvZyl7dGhpcy5fZGlhbG9nPW5ldyBVSS5EaWFsb2coKTt0aGlzLl9kaWFsb2cuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fd2lkZ2V0KTt0aGlzLl9kaWFsb2cuc2V0RGVmYXVsdEZvY3VzZWRFbGVtZW50KHRoaXMuX3dpZGdldCk7dGhpcy5fZGlhbG9nLnNob3coKTt9CnRoaXMuX2RpYWxvZy5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCk7fQpfa2V5RG93bihldmVudCl7c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdBcnJvd0xlZnQnOmlmKEhvc3QuaXNNYWMoKSYmZXZlbnQubWV0YUtleSkKdGhpcy5fb25GaXJzdEZyYW1lKCk7ZWxzZQp0aGlzLl9vblByZXZGcmFtZSgpO2JyZWFrO2Nhc2UnQXJyb3dSaWdodCc6aWYoSG9zdC5pc01hYygpJiZldmVudC5tZXRhS2V5KQp0aGlzLl9vbkxhc3RGcmFtZSgpO2Vsc2UKdGhpcy5fb25OZXh0RnJhbWUoKTticmVhaztjYXNlJ0hvbWUnOnRoaXMuX29uRmlyc3RGcmFtZSgpO2JyZWFrO2Nhc2UnRW5kJzp0aGlzLl9vbkxhc3RGcmFtZSgpO2JyZWFrO319Cl9vblByZXZGcmFtZSgpe2lmKHRoaXMuX2luZGV4PjApCi0tdGhpcy5faW5kZXg7dGhpcy5fcmVuZGVyKCk7fQpfb25OZXh0RnJhbWUoKXtpZih0aGlzLl9pbmRleDx0aGlzLl9mcmFtZXMubGVuZ3RoLTEpCisrdGhpcy5faW5kZXg7dGhpcy5fcmVuZGVyKCk7fQpfb25GaXJzdEZyYW1lKCl7dGhpcy5faW5kZXg9MDt0aGlzLl9yZW5kZXIoKTt9Cl9vbkxhc3RGcmFtZSgpe3RoaXMuX2luZGV4PXRoaXMuX2ZyYW1lcy5sZW5ndGgtMTt0aGlzLl9yZW5kZXIoKTt9Cl9yZW5kZXIoKXtjb25zdCBmcmFtZT10aGlzLl9mcmFtZXNbdGhpcy5faW5kZXhdO3RoaXMuX2ZyYWdtZW50LiQoJ3RpbWUnKS50ZXh0Q29udGVudD1OdW1iZXIubWlsbGlzVG9TdHJpbmcoZnJhbWUudGltZXN0YW1wLXRoaXMuX3plcm9UaW1lKTtyZXR1cm4gZnJhbWUuaW1hZ2VEYXRhUHJvbWlzZSgpLnRoZW4oUGVyZlVJLkZpbG1TdHJpcFZpZXcuX3NldEltYWdlRGF0YS5iaW5kKG51bGwsdGhpcy5fZnJhZ21lbnQuJCgnaW1hZ2UnKSkpLnRoZW4odGhpcy5fcmVzaXplLmJpbmQodGhpcykpO319OztQZXJmVUkuRmxhbWVDaGFydERlbGVnYXRlPWZ1bmN0aW9uKCl7fTtQZXJmVUkuRmxhbWVDaGFydERlbGVnYXRlLnByb3RvdHlwZT17d2luZG93Q2hhbmdlZChzdGFydFRpbWUsZW5kVGltZSxhbmltYXRlKXt9LHVwZGF0ZVJhbmdlU2VsZWN0aW9uKHN0YXJ0VGltZSxlbmRUaW1lKXt9LHVwZGF0ZVNlbGVjdGVkR3JvdXAoZmxhbWVDaGFydCxncm91cCl7fSx9O1BlcmZVSS5GbGFtZUNoYXJ0PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihkYXRhUHJvdmlkZXIsZmxhbWVDaGFydERlbGVnYXRlLGdyb3VwRXhwYW5zaW9uU2V0dGluZyl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdwZXJmX3VpL2ZsYW1lQ2hhcnQuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmbGFtZS1jaGFydC1tYWluLXBhbmUnKTt0aGlzLl9ncm91cEV4cGFuc2lvblNldHRpbmc9Z3JvdXBFeHBhbnNpb25TZXR0aW5nO3RoaXMuX2dyb3VwRXhwYW5zaW9uU3RhdGU9Z3JvdXBFeHBhbnNpb25TZXR0aW5nJiZncm91cEV4cGFuc2lvblNldHRpbmcuZ2V0KCl8fHt9O3RoaXMuX2ZsYW1lQ2hhcnREZWxlZ2F0ZT1mbGFtZUNoYXJ0RGVsZWdhdGU7dGhpcy5fY2hhcnRWaWV3cG9ydD1uZXcgUGVyZlVJLkNoYXJ0Vmlld3BvcnQodGhpcyk7dGhpcy5fY2hhcnRWaWV3cG9ydC5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2RhdGFQcm92aWRlcj1kYXRhUHJvdmlkZXI7dGhpcy5fdmlld3BvcnRFbGVtZW50PXRoaXMuX2NoYXJ0Vmlld3BvcnQudmlld3BvcnRFbGVtZW50O3RoaXMuX2NhbnZhcz0odGhpcy5fdmlld3BvcnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdjYW52YXMnKSk7dGhpcy5fY2FudmFzLnRhYkluZGV4PTA7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5fY2FudmFzKTt0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLHRoaXMuX29uTW91c2VPdXQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZW50cnlJbmZvPXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmxhbWUtY2hhcnQtZW50cnktaW5mbycpO3RoaXMuX21hcmtlckhpZ2hsaWdoRWxlbWVudD10aGlzLl92aWV3cG9ydEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZsYW1lLWNoYXJ0LW1hcmtlci1oaWdobGlnaHQtZWxlbWVudCcpO3RoaXMuX2hpZ2hsaWdodEVsZW1lbnQ9dGhpcy5fdmlld3BvcnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmbGFtZS1jaGFydC1oaWdobGlnaHQtZWxlbWVudCcpO3RoaXMuX3NlbGVjdGVkRWxlbWVudD10aGlzLl92aWV3cG9ydEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZsYW1lLWNoYXJ0LXNlbGVjdGVkLWVsZW1lbnQnKTtVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0aGlzLl92aWV3cG9ydEVsZW1lbnQsdGhpcy5fc3RhcnREcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX2RyYWdnaW5nLmJpbmQodGhpcyksdGhpcy5fZW5kRHJhZ2dpbmcuYmluZCh0aGlzKSxudWxsKTt0aGlzLl9ydWxlckVuYWJsZWQ9dHJ1ZTt0aGlzLl9yYW5nZVNlbGVjdGlvblN0YXJ0PTA7dGhpcy5fcmFuZ2VTZWxlY3Rpb25FbmQ9MDt0aGlzLl9iYXJIZWlnaHQ9MTc7dGhpcy5fdGV4dEJhc2VsaW5lPTU7dGhpcy5fdGV4dFBhZGRpbmc9NTt0aGlzLl9tYXJrZXJSYWRpdXM9Njt0aGlzLl9jaGFydFZpZXdwb3J0LnNldFdpbmRvd1RpbWVzKGRhdGFQcm92aWRlci5taW5pbXVtQm91bmRhcnkoKSxkYXRhUHJvdmlkZXIubWluaW11bUJvdW5kYXJ5KCkrZGF0YVByb3ZpZGVyLnRvdGFsVGltZSgpKTt0aGlzLl9oZWFkZXJMZWZ0UGFkZGluZz02O3RoaXMuX2Fycm93U2lkZT04O3RoaXMuX2V4cGFuc2lvbkFycm93SW5kZW50PXRoaXMuX2hlYWRlckxlZnRQYWRkaW5nK3RoaXMuX2Fycm93U2lkZS8yO3RoaXMuX2hlYWRlckxhYmVsWFBhZGRpbmc9Mzt0aGlzLl9oZWFkZXJMYWJlbFlQYWRkaW5nPTI7dGhpcy5faGlnaGxpZ2h0ZWRNYXJrZXJJbmRleD0tMTt0aGlzLl9oaWdobGlnaHRlZEVudHJ5SW5kZXg9LTE7dGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4PS0xO3RoaXMuX3Jhd1RpbWVsaW5lRGF0YUxlbmd0aD0wO3RoaXMuX3RleHRXaWR0aD1uZXcgTWFwKCk7dGhpcy5fbGFzdE1vdXNlT2Zmc2V0WD0wO3RoaXMuX3NlbGVjdGVkR3JvdXA9LTE7dGhpcy5fc2VsZWN0ZWRHcm91cEJhY2tyb3VuZENvbG9yPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dChQZXJmVUkuRmxhbWVDaGFydC5Db2xvcnMuU2VsZWN0ZWRHcm91cEJhY2tncm91bmQsVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7dGhpcy5fc2VsZWN0ZWRHcm91cEJvcmRlckNvbG9yPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dChQZXJmVUkuRmxhbWVDaGFydC5Db2xvcnMuU2VsZWN0ZWRHcm91cEJvcmRlcixVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5CYWNrZ3JvdW5kKTt9CndpbGxIaWRlKCl7dGhpcy5oaWRlSGlnaGxpZ2h0KCk7fQpzZXRCYXJIZWlnaHQodmFsdWUpe3RoaXMuX2JhckhlaWdodD12YWx1ZTt9CnNldFRleHRCYXNlbGluZSh2YWx1ZSl7dGhpcy5fdGV4dEJhc2VsaW5lPXZhbHVlO30Kc2V0VGV4dFBhZGRpbmcodmFsdWUpe3RoaXMuX3RleHRQYWRkaW5nPXZhbHVlO30KZW5hYmxlUnVsZXIoZW5hYmxlKXt0aGlzLl9ydWxlckVuYWJsZWQ9ZW5hYmxlO30KYWx3YXlzU2hvd1ZlcnRpY2FsU2Nyb2xsKCl7dGhpcy5fY2hhcnRWaWV3cG9ydC5hbHdheXNTaG93VmVydGljYWxTY3JvbGwoKTt9CmRpc2FibGVSYW5nZVNlbGVjdGlvbigpe3RoaXMuX2NoYXJ0Vmlld3BvcnQuZGlzYWJsZVJhbmdlU2VsZWN0aW9uKCk7fQpoaWdobGlnaHRFbnRyeShlbnRyeUluZGV4KXtpZih0aGlzLl9oaWdobGlnaHRlZEVudHJ5SW5kZXg9PT1lbnRyeUluZGV4KQpyZXR1cm47aWYoIXRoaXMuX2RhdGFQcm92aWRlci5lbnRyeUNvbG9yKGVudHJ5SW5kZXgpKQpyZXR1cm47dGhpcy5faGlnaGxpZ2h0ZWRFbnRyeUluZGV4PWVudHJ5SW5kZXg7dGhpcy5fdXBkYXRlRWxlbWVudFBvc2l0aW9uKHRoaXMuX2hpZ2hsaWdodEVsZW1lbnQsdGhpcy5faGlnaGxpZ2h0ZWRFbnRyeUluZGV4KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlIaWdobGlnaHRlZCxlbnRyeUluZGV4KTt9CmhpZGVIaWdobGlnaHQoKXt0aGlzLl9lbnRyeUluZm8ucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9oaWdobGlnaHRlZEVudHJ5SW5kZXg9LTE7dGhpcy5fdXBkYXRlRWxlbWVudFBvc2l0aW9uKHRoaXMuX2hpZ2hsaWdodEVsZW1lbnQsdGhpcy5faGlnaGxpZ2h0ZWRFbnRyeUluZGV4KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlIaWdobGlnaHRlZCwtMSk7fQpfcmVzZXRDYW52YXMoKXtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCB3aWR0aD1NYXRoLnJvdW5kKHRoaXMuX29mZnNldFdpZHRoKnJhdGlvKTtjb25zdCBoZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLl9vZmZzZXRIZWlnaHQqcmF0aW8pO3RoaXMuX2NhbnZhcy53aWR0aD13aWR0aDt0aGlzLl9jYW52YXMuaGVpZ2h0PWhlaWdodDt0aGlzLl9jYW52YXMuc3R5bGUud2lkdGg9YCR7d2lkdGggLyByYXRpb31weGA7dGhpcy5fY2FudmFzLnN0eWxlLmhlaWdodD1gJHtoZWlnaHQgLyByYXRpb31weGA7fQp3aW5kb3dDaGFuZ2VkKHN0YXJ0VGltZSxlbmRUaW1lLGFuaW1hdGUpe3RoaXMuX2ZsYW1lQ2hhcnREZWxlZ2F0ZS53aW5kb3dDaGFuZ2VkKHN0YXJ0VGltZSxlbmRUaW1lLGFuaW1hdGUpO30KdXBkYXRlUmFuZ2VTZWxlY3Rpb24oc3RhcnRUaW1lLGVuZFRpbWUpe3RoaXMuX2ZsYW1lQ2hhcnREZWxlZ2F0ZS51cGRhdGVSYW5nZVNlbGVjdGlvbihzdGFydFRpbWUsZW5kVGltZSk7fQpzZXRTaXplKHdpZHRoLGhlaWdodCl7dGhpcy5fb2Zmc2V0V2lkdGg9d2lkdGg7dGhpcy5fb2Zmc2V0SGVpZ2h0PWhlaWdodDt9Cl9zdGFydERyYWdnaW5nKGV2ZW50KXt0aGlzLmhpZGVIaWdobGlnaHQoKTt0aGlzLl9tYXhEcmFnT2Zmc2V0PTA7dGhpcy5fZHJhZ1N0YXJ0WD1ldmVudC5wYWdlWDt0aGlzLl9kcmFnU3RhcnRZPWV2ZW50LnBhZ2VZO3JldHVybiB0cnVlO30KX2RyYWdnaW5nKGV2ZW50KXtjb25zdCBkeD1ldmVudC5wYWdlWC10aGlzLl9kcmFnU3RhcnRYO2NvbnN0IGR5PWV2ZW50LnBhZ2VZLXRoaXMuX2RyYWdTdGFydFk7dGhpcy5fbWF4RHJhZ09mZnNldD1NYXRoLm1heCh0aGlzLl9tYXhEcmFnT2Zmc2V0LE1hdGguc3FydChkeCpkeCtkeSpkeSkpO30KX2VuZERyYWdnaW5nKGV2ZW50KXt0aGlzLl91cGRhdGVIaWdobGlnaHQoKTt9Cl90aW1lbGluZURhdGEoKXtpZighdGhpcy5fZGF0YVByb3ZpZGVyKQpyZXR1cm4gbnVsbDtjb25zdCB0aW1lbGluZURhdGE9dGhpcy5fZGF0YVByb3ZpZGVyLnRpbWVsaW5lRGF0YSgpO2lmKHRpbWVsaW5lRGF0YSE9PXRoaXMuX3Jhd1RpbWVsaW5lRGF0YXx8dGltZWxpbmVEYXRhLmVudHJ5U3RhcnRUaW1lcy5sZW5ndGghPT10aGlzLl9yYXdUaW1lbGluZURhdGFMZW5ndGgpCnRoaXMuX3Byb2Nlc3NUaW1lbGluZURhdGEodGltZWxpbmVEYXRhKTtyZXR1cm4gdGhpcy5fcmF3VGltZWxpbmVEYXRhO30KX3JldmVhbEVudHJ5KGVudHJ5SW5kZXgpe2NvbnN0IHRpbWVsaW5lRGF0YT10aGlzLl90aW1lbGluZURhdGEoKTtpZighdGltZWxpbmVEYXRhKQpyZXR1cm47Y29uc3QgdGltZUxlZnQ9dGhpcy5fY2hhcnRWaWV3cG9ydC53aW5kb3dMZWZ0VGltZSgpO2NvbnN0IHRpbWVSaWdodD10aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd1JpZ2h0VGltZSgpO2NvbnN0IGVudHJ5U3RhcnRUaW1lPXRpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3QgZW50cnlUb3RhbFRpbWU9dGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lc1tlbnRyeUluZGV4XTtjb25zdCBlbnRyeUVuZFRpbWU9ZW50cnlTdGFydFRpbWUrZW50cnlUb3RhbFRpbWU7bGV0IG1pbkVudHJ5VGltZVdpbmRvdz1NYXRoLm1pbihlbnRyeVRvdGFsVGltZSx0aW1lUmlnaHQtdGltZUxlZnQpO2NvbnN0IGxldmVsPXRpbWVsaW5lRGF0YS5lbnRyeUxldmVsc1tlbnRyeUluZGV4XTt0aGlzLl9jaGFydFZpZXdwb3J0LnNldFNjcm9sbE9mZnNldCh0aGlzLl9sZXZlbFRvT2Zmc2V0KGxldmVsKSx0aGlzLl9sZXZlbEhlaWdodChsZXZlbCkpO2NvbnN0IG1pblZpc2libGVXaWR0aFB4PTMwO2NvbnN0IGZ1dHVyZVBpeGVsVG9UaW1lPSh0aW1lUmlnaHQtdGltZUxlZnQpL3RoaXMuX29mZnNldFdpZHRoO21pbkVudHJ5VGltZVdpbmRvdz1NYXRoLm1heChtaW5FbnRyeVRpbWVXaW5kb3csZnV0dXJlUGl4ZWxUb1RpbWUqbWluVmlzaWJsZVdpZHRoUHgpO2lmKHRpbWVMZWZ0PmVudHJ5RW5kVGltZSl7Y29uc3QgZGVsdGE9dGltZUxlZnQtZW50cnlFbmRUaW1lK21pbkVudHJ5VGltZVdpbmRvdzt0aGlzLndpbmRvd0NoYW5nZWQodGltZUxlZnQtZGVsdGEsdGltZVJpZ2h0LWRlbHRhLHRydWUpO31lbHNlIGlmKHRpbWVSaWdodDxlbnRyeVN0YXJ0VGltZSl7Y29uc3QgZGVsdGE9ZW50cnlTdGFydFRpbWUtdGltZVJpZ2h0K21pbkVudHJ5VGltZVdpbmRvdzt0aGlzLndpbmRvd0NoYW5nZWQodGltZUxlZnQrZGVsdGEsdGltZVJpZ2h0K2RlbHRhLHRydWUpO319CnNldFdpbmRvd1RpbWVzKHN0YXJ0VGltZSxlbmRUaW1lLGFuaW1hdGUpe3RoaXMuX2NoYXJ0Vmlld3BvcnQuc2V0V2luZG93VGltZXMoc3RhcnRUaW1lLGVuZFRpbWUsYW5pbWF0ZSk7dGhpcy5fdXBkYXRlSGlnaGxpZ2h0KCk7fQpfb25Nb3VzZU1vdmUoZXZlbnQpe3RoaXMuX2xhc3RNb3VzZU9mZnNldFg9ZXZlbnQub2Zmc2V0WDt0aGlzLl9sYXN0TW91c2VPZmZzZXRZPWV2ZW50Lm9mZnNldFk7aWYoIXRoaXMuX2VuYWJsZWQoKSkKcmV0dXJuO2lmKHRoaXMuX2NoYXJ0Vmlld3BvcnQuaXNEcmFnZ2luZygpKQpyZXR1cm47aWYodGhpcy5fY29vcmRpbmF0ZXNUb0dyb3VwSW5kZXgoZXZlbnQub2Zmc2V0WCxldmVudC5vZmZzZXRZLHRydWUpPj0wKXt0aGlzLmhpZGVIaWdobGlnaHQoKTt0aGlzLl92aWV3cG9ydEVsZW1lbnQuc3R5bGUuY3Vyc29yPSdwb2ludGVyJztyZXR1cm47fQp0aGlzLl91cGRhdGVIaWdobGlnaHQoKTt9Cl91cGRhdGVIaWdobGlnaHQoKXtjb25zdCBpbkRpdmlkZXJzQmFyPXRoaXMuX2xhc3RNb3VzZU9mZnNldFk8UGVyZlVJLkZsYW1lQ2hhcnQuSGVhZGVySGVpZ2h0O3RoaXMuX2hpZ2hsaWdodGVkTWFya2VySW5kZXg9aW5EaXZpZGVyc0Jhcj90aGlzLl9tYXJrZXJJbmRleEF0UG9zaXRpb24odGhpcy5fbGFzdE1vdXNlT2Zmc2V0WCk6LTE7dGhpcy5fdXBkYXRlTWFya2VySGlnaGxpZ2h0KCk7Y29uc3QgZW50cnlJbmRleD10aGlzLl9oaWdobGlnaHRlZE1hcmtlckluZGV4PT09LTE/dGhpcy5fY29vcmRpbmF0ZXNUb0VudHJ5SW5kZXgodGhpcy5fbGFzdE1vdXNlT2Zmc2V0WCx0aGlzLl9sYXN0TW91c2VPZmZzZXRZKTotMTtpZihlbnRyeUluZGV4PT09LTEpe3RoaXMuaGlkZUhpZ2hsaWdodCgpO2NvbnN0IGdyb3VwPXRoaXMuX2Nvb3JkaW5hdGVzVG9Hcm91cEluZGV4KHRoaXMuX2xhc3RNb3VzZU9mZnNldFgsdGhpcy5fbGFzdE1vdXNlT2Zmc2V0WSxmYWxzZSk7aWYoZ3JvdXA+PTAmJnRoaXMuX3Jhd1RpbWVsaW5lRGF0YS5ncm91cHNbZ3JvdXBdLnNlbGVjdGFibGUpCnRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5jdXJzb3I9J3BvaW50ZXInO2Vsc2UKdGhpcy5fdmlld3BvcnRFbGVtZW50LnN0eWxlLmN1cnNvcj0nZGVmYXVsdCc7cmV0dXJuO30KaWYodGhpcy5fY2hhcnRWaWV3cG9ydC5pc0RyYWdnaW5nKCkpCnJldHVybjt0aGlzLl91cGRhdGVQb3BvdmVyKGVudHJ5SW5kZXgpO3RoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5jdXJzb3I9dGhpcy5fZGF0YVByb3ZpZGVyLmNhbkp1bXBUb0VudHJ5KGVudHJ5SW5kZXgpPydwb2ludGVyJzonZGVmYXVsdCc7dGhpcy5oaWdobGlnaHRFbnRyeShlbnRyeUluZGV4KTt9Cl9vbk1vdXNlT3V0KCl7dGhpcy5fbGFzdE1vdXNlT2Zmc2V0WD0tMTt0aGlzLl9sYXN0TW91c2VPZmZzZXRZPS0xO3RoaXMuaGlkZUhpZ2hsaWdodCgpO30KX3VwZGF0ZVBvcG92ZXIoZW50cnlJbmRleCl7aWYoZW50cnlJbmRleD09PXRoaXMuX2hpZ2hsaWdodGVkRW50cnlJbmRleCl7dGhpcy5fdXBkYXRlUG9wb3Zlck9mZnNldCgpO3JldHVybjt9CnRoaXMuX2VudHJ5SW5mby5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHBvcG92ZXJFbGVtZW50PXRoaXMuX2RhdGFQcm92aWRlci5wcmVwYXJlSGlnaGxpZ2h0ZWRFbnRyeUluZm8oZW50cnlJbmRleCk7aWYocG9wb3ZlckVsZW1lbnQpe3RoaXMuX2VudHJ5SW5mby5hcHBlbmRDaGlsZChwb3BvdmVyRWxlbWVudCk7dGhpcy5fdXBkYXRlUG9wb3Zlck9mZnNldCgpO319Cl91cGRhdGVQb3BvdmVyT2Zmc2V0KCl7Y29uc3QgbW91c2VYPXRoaXMuX2xhc3RNb3VzZU9mZnNldFg7Y29uc3QgbW91c2VZPXRoaXMuX2xhc3RNb3VzZU9mZnNldFk7Y29uc3QgcGFyZW50V2lkdGg9dGhpcy5fZW50cnlJbmZvLnBhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7Y29uc3QgcGFyZW50SGVpZ2h0PXRoaXMuX2VudHJ5SW5mby5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodDtjb25zdCBpbmZvV2lkdGg9dGhpcy5fZW50cnlJbmZvLmNsaWVudFdpZHRoO2NvbnN0IGluZm9IZWlnaHQ9dGhpcy5fZW50cnlJbmZvLmNsaWVudEhlaWdodDtjb25zdCBvZmZzZXRYPTEwO2NvbnN0IG9mZnNldFk9NjtsZXQgeDtsZXQgeTtmb3IobGV0IHF1YWRyYW50PTA7cXVhZHJhbnQ8NDsrK3F1YWRyYW50KXtjb25zdCBkeD1xdWFkcmFudCYyPy1vZmZzZXRYLWluZm9XaWR0aDpvZmZzZXRYO2NvbnN0IGR5PXF1YWRyYW50JjE/LW9mZnNldFktaW5mb0hlaWdodDpvZmZzZXRZO3g9TnVtYmVyLmNvbnN0cmFpbihtb3VzZVgrZHgsMCxwYXJlbnRXaWR0aC1pbmZvV2lkdGgpO3k9TnVtYmVyLmNvbnN0cmFpbihtb3VzZVkrZHksMCxwYXJlbnRIZWlnaHQtaW5mb0hlaWdodCk7aWYoeD49bW91c2VYfHxtb3VzZVg+PXgraW5mb1dpZHRofHx5Pj1tb3VzZVl8fG1vdXNlWT49eStpbmZvSGVpZ2h0KQpicmVhazt9CnRoaXMuX2VudHJ5SW5mby5zdHlsZS5sZWZ0PXgrJ3B4Jzt0aGlzLl9lbnRyeUluZm8uc3R5bGUudG9wPXkrJ3B4Jzt9Cl9vbkNsaWNrKGV2ZW50KXt0aGlzLmZvY3VzKCk7Y29uc3QgY2xpY2tUaHJlc2hvbGQ9NTtpZih0aGlzLl9tYXhEcmFnT2Zmc2V0PmNsaWNrVGhyZXNob2xkKQpyZXR1cm47dGhpcy5fc2VsZWN0R3JvdXAodGhpcy5fY29vcmRpbmF0ZXNUb0dyb3VwSW5kZXgoZXZlbnQub2Zmc2V0WCxldmVudC5vZmZzZXRZLGZhbHNlKSk7dGhpcy5fdG9nZ2xlR3JvdXBWaXNpYmlsaXR5KHRoaXMuX2Nvb3JkaW5hdGVzVG9Hcm91cEluZGV4KGV2ZW50Lm9mZnNldFgsZXZlbnQub2Zmc2V0WSx0cnVlKSk7Y29uc3QgdGltZWxpbmVEYXRhPXRoaXMuX3RpbWVsaW5lRGF0YSgpO2lmKGV2ZW50LnNoaWZ0S2V5JiZ0aGlzLl9oaWdobGlnaHRlZEVudHJ5SW5kZXghPT0tMSYmdGltZWxpbmVEYXRhKXtjb25zdCBzdGFydD10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW3RoaXMuX2hpZ2hsaWdodGVkRW50cnlJbmRleF07Y29uc3QgZW5kPXN0YXJ0K3RpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXNbdGhpcy5faGlnaGxpZ2h0ZWRFbnRyeUluZGV4XTt0aGlzLl9jaGFydFZpZXdwb3J0LnNldFJhbmdlU2VsZWN0aW9uKHN0YXJ0LGVuZCk7fWVsc2V7dGhpcy5fY2hhcnRWaWV3cG9ydC5vbkNsaWNrKGV2ZW50KTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlTZWxlY3RlZCx0aGlzLl9oaWdobGlnaHRlZEVudHJ5SW5kZXgpO319Cl9zZWxlY3RHcm91cChncm91cEluZGV4KXtjb25zdCBncm91cHM9dGhpcy5fcmF3VGltZWxpbmVEYXRhLmdyb3VwcztpZihncm91cEluZGV4PDB8fCFncm91cHNbZ3JvdXBJbmRleF0uc2VsZWN0YWJsZXx8dGhpcy5fc2VsZWN0ZWRHcm91cD09PWdyb3VwSW5kZXgpCnJldHVybjt0aGlzLl9zZWxlY3RlZEdyb3VwPWdyb3VwSW5kZXg7dGhpcy5fZmxhbWVDaGFydERlbGVnYXRlLnVwZGF0ZVNlbGVjdGVkR3JvdXAodGhpcyxncm91cHNbZ3JvdXBJbmRleF0pO3RoaXMuX3Jlc2V0Q2FudmFzKCk7dGhpcy5fZHJhdygpO30KX3RvZ2dsZUdyb3VwVmlzaWJpbGl0eShncm91cEluZGV4KXtpZihncm91cEluZGV4PDB8fCF0aGlzLl9pc0dyb3VwQ29sbGFwc2libGUoZ3JvdXBJbmRleCkpCnJldHVybjtjb25zdCBncm91cHM9dGhpcy5fcmF3VGltZWxpbmVEYXRhLmdyb3Vwcztjb25zdCBncm91cD1ncm91cHNbZ3JvdXBJbmRleF07Z3JvdXAuZXhwYW5kZWQ9IWdyb3VwLmV4cGFuZGVkO3RoaXMuX2dyb3VwRXhwYW5zaW9uU3RhdGVbZ3JvdXAubmFtZV09Z3JvdXAuZXhwYW5kZWQ7aWYodGhpcy5fZ3JvdXBFeHBhbnNpb25TZXR0aW5nKQp0aGlzLl9ncm91cEV4cGFuc2lvblNldHRpbmcuc2V0KHRoaXMuX2dyb3VwRXhwYW5zaW9uU3RhdGUpO3RoaXMuX3VwZGF0ZUxldmVsUG9zaXRpb25zKCk7dGhpcy5fdXBkYXRlSGlnaGxpZ2h0KCk7aWYoIWdyb3VwLmV4cGFuZGVkKXtjb25zdCB0aW1lbGluZURhdGE9dGhpcy5fdGltZWxpbmVEYXRhKCk7Y29uc3QgbGV2ZWw9dGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW3RoaXMuX3NlbGVjdGVkRW50cnlJbmRleF07aWYodGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4Pj0wJiZsZXZlbD49Z3JvdXAuc3RhcnRMZXZlbCYmKGdyb3VwSW5kZXg+PWdyb3Vwcy5sZW5ndGgtMXx8Z3JvdXBzW2dyb3VwSW5kZXgrMV0uc3RhcnRMZXZlbD5sZXZlbCkpCnRoaXMuX3NlbGVjdGVkRW50cnlJbmRleD0tMTt9CnRoaXMuX3VwZGF0ZUhlaWdodCgpO3RoaXMuX3Jlc2V0Q2FudmFzKCk7dGhpcy5fZHJhdygpO30KX29uS2V5RG93bihlKXt0aGlzLl9oYW5kbGVTZWxlY3Rpb25OYXZpZ2F0aW9uKGUpO30KX2hhbmRsZVNlbGVjdGlvbk5hdmlnYXRpb24oZSl7aWYoIVVJLktleWJvYXJkU2hvcnRjdXQuaGFzTm9Nb2RpZmllcnMoZSkpCnJldHVybjtpZih0aGlzLl9zZWxlY3RlZEVudHJ5SW5kZXg9PT0tMSkKcmV0dXJuO2NvbnN0IHRpbWVsaW5lRGF0YT10aGlzLl90aW1lbGluZURhdGEoKTtpZighdGltZWxpbmVEYXRhKQpyZXR1cm47ZnVuY3Rpb24gdGltZUNvbXBhcmF0b3IodGltZSxlbnRyeUluZGV4KXtyZXR1cm4gdGltZS10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2VudHJ5SW5kZXhdO30KZnVuY3Rpb24gZW50cmllc0ludGVyc2VjdChlbnRyeTEsZW50cnkyKXtjb25zdCBzdGFydDE9dGltZWxpbmVEYXRhLmVudHJ5U3RhcnRUaW1lc1tlbnRyeTFdO2NvbnN0IHN0YXJ0Mj10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2VudHJ5Ml07Y29uc3QgZW5kMT1zdGFydDErdGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lc1tlbnRyeTFdO2NvbnN0IGVuZDI9c3RhcnQyK3RpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXNbZW50cnkyXTtyZXR1cm4gc3RhcnQxPGVuZDImJnN0YXJ0MjxlbmQxO30KY29uc3Qga2V5cz1VSS5LZXlib2FyZFNob3J0Y3V0LktleXM7aWYoZS5rZXlDb2RlPT09a2V5cy5MZWZ0LmNvZGV8fGUua2V5Q29kZT09PWtleXMuUmlnaHQuY29kZSl7Y29uc3QgbGV2ZWw9dGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW3RoaXMuX3NlbGVjdGVkRW50cnlJbmRleF07Y29uc3QgbGV2ZWxJbmRleGVzPXRoaXMuX3RpbWVsaW5lTGV2ZWxzW2xldmVsXTtsZXQgaW5kZXhPbkxldmVsPWxldmVsSW5kZXhlcy5sb3dlckJvdW5kKHRoaXMuX3NlbGVjdGVkRW50cnlJbmRleCk7aW5kZXhPbkxldmVsKz1lLmtleUNvZGU9PT1rZXlzLkxlZnQuY29kZT8tMToxO2UuY29uc3VtZSh0cnVlKTtpZihpbmRleE9uTGV2ZWw+PTAmJmluZGV4T25MZXZlbDxsZXZlbEluZGV4ZXMubGVuZ3RoKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlTZWxlY3RlZCxsZXZlbEluZGV4ZXNbaW5kZXhPbkxldmVsXSk7cmV0dXJuO30KaWYoZS5rZXlDb2RlPT09a2V5cy5VcC5jb2RlfHxlLmtleUNvZGU9PT1rZXlzLkRvd24uY29kZSl7ZS5jb25zdW1lKHRydWUpO2xldCBsZXZlbD10aW1lbGluZURhdGEuZW50cnlMZXZlbHNbdGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4XTtsZXZlbCs9ZS5rZXlDb2RlPT09a2V5cy5VcC5jb2RlPy0xOjE7aWYobGV2ZWw8MHx8bGV2ZWw+PXRoaXMuX3RpbWVsaW5lTGV2ZWxzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGVudHJ5VGltZT10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW3RoaXMuX3NlbGVjdGVkRW50cnlJbmRleF0rCnRpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXNbdGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4XS8yO2NvbnN0IGxldmVsSW5kZXhlcz10aGlzLl90aW1lbGluZUxldmVsc1tsZXZlbF07bGV0IGluZGV4T25MZXZlbD1sZXZlbEluZGV4ZXMudXBwZXJCb3VuZChlbnRyeVRpbWUsdGltZUNvbXBhcmF0b3IpLTE7aWYoIWVudHJpZXNJbnRlcnNlY3QodGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4LGxldmVsSW5kZXhlc1tpbmRleE9uTGV2ZWxdKSl7KytpbmRleE9uTGV2ZWw7aWYoaW5kZXhPbkxldmVsPj1sZXZlbEluZGV4ZXMubGVuZ3RofHwhZW50cmllc0ludGVyc2VjdCh0aGlzLl9zZWxlY3RlZEVudHJ5SW5kZXgsbGV2ZWxJbmRleGVzW2luZGV4T25MZXZlbF0pKQpyZXR1cm47fQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlTZWxlY3RlZCxsZXZlbEluZGV4ZXNbaW5kZXhPbkxldmVsXSk7fX0KX2Nvb3JkaW5hdGVzVG9FbnRyeUluZGV4KHgseSl7aWYoeDwwfHx5PDApCnJldHVybi0xO2NvbnN0IHRpbWVsaW5lRGF0YT10aGlzLl90aW1lbGluZURhdGEoKTtpZighdGltZWxpbmVEYXRhKQpyZXR1cm4tMTt5Kz10aGlzLl9jaGFydFZpZXdwb3J0LnNjcm9sbE9mZnNldCgpO2NvbnN0IGN1cnNvckxldmVsPXRoaXMuX3Zpc2libGVMZXZlbE9mZnNldHMudXBwZXJCb3VuZCh5KS0xO2lmKGN1cnNvckxldmVsPDB8fCF0aGlzLl92aXNpYmxlTGV2ZWxzW2N1cnNvckxldmVsXSkKcmV0dXJuLTE7Y29uc3Qgb2Zmc2V0RnJvbUxldmVsPXktdGhpcy5fdmlzaWJsZUxldmVsT2Zmc2V0c1tjdXJzb3JMZXZlbF07aWYob2Zmc2V0RnJvbUxldmVsPnRoaXMuX2xldmVsSGVpZ2h0KGN1cnNvckxldmVsKSkKcmV0dXJuLTE7Y29uc3QgZW50cnlTdGFydFRpbWVzPXRpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXM7Y29uc3QgZW50cnlUb3RhbFRpbWVzPXRpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXM7Y29uc3QgZW50cnlJbmRleGVzPXRoaXMuX3RpbWVsaW5lTGV2ZWxzW2N1cnNvckxldmVsXTtpZighZW50cnlJbmRleGVzfHwhZW50cnlJbmRleGVzLmxlbmd0aCkKcmV0dXJuLTE7ZnVuY3Rpb24gY29tcGFyYXRvcih0aW1lLGVudHJ5SW5kZXgpe3JldHVybiB0aW1lLWVudHJ5U3RhcnRUaW1lc1tlbnRyeUluZGV4XTt9CmNvbnN0IGN1cnNvclRpbWU9dGhpcy5fY2hhcnRWaWV3cG9ydC5waXhlbFRvVGltZSh4KTtjb25zdCBpbmRleE9uTGV2ZWw9TWF0aC5tYXgoZW50cnlJbmRleGVzLnVwcGVyQm91bmQoY3Vyc29yVGltZSxjb21wYXJhdG9yKS0xLDApO2Z1bmN0aW9uIGNoZWNrRW50cnlIaXQoZW50cnlJbmRleCl7aWYoZW50cnlJbmRleD09PXVuZGVmaW5lZCkKcmV0dXJuIGZhbHNlO2NvbnN0IHN0YXJ0VGltZT1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3Qgc3RhcnRYPXRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24oc3RhcnRUaW1lKTtjb25zdCBkdXJhdGlvbj1lbnRyeVRvdGFsVGltZXNbZW50cnlJbmRleF07aWYoaXNOYU4oZHVyYXRpb24pKXtjb25zdCBkeD1zdGFydFgteDtjb25zdCBkeT10aGlzLl9sZXZlbEhlaWdodChjdXJzb3JMZXZlbCkvMi1vZmZzZXRGcm9tTGV2ZWw7cmV0dXJuIGR4KmR4K2R5KmR5PHRoaXMuX21hcmtlclJhZGl1cyp0aGlzLl9tYXJrZXJSYWRpdXM7fQpjb25zdCBlbmRYPXRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24oc3RhcnRUaW1lK2R1cmF0aW9uKTtjb25zdCBiYXJUaHJlc2hvbGRQeD0zO3JldHVybiBzdGFydFgtYmFyVGhyZXNob2xkUHg8eCYmeDxlbmRYK2JhclRocmVzaG9sZFB4O30KbGV0IGVudHJ5SW5kZXg9ZW50cnlJbmRleGVzW2luZGV4T25MZXZlbF07aWYoY2hlY2tFbnRyeUhpdC5jYWxsKHRoaXMsZW50cnlJbmRleCkpCnJldHVybiBlbnRyeUluZGV4O2VudHJ5SW5kZXg9ZW50cnlJbmRleGVzW2luZGV4T25MZXZlbCsxXTtpZihjaGVja0VudHJ5SGl0LmNhbGwodGhpcyxlbnRyeUluZGV4KSkKcmV0dXJuIGVudHJ5SW5kZXg7cmV0dXJuLTE7fQpfY29vcmRpbmF0ZXNUb0dyb3VwSW5kZXgoeCx5LGhlYWRlck9ubHkpe2lmKHg8MHx8eTwwKQpyZXR1cm4tMTt5Kz10aGlzLl9jaGFydFZpZXdwb3J0LnNjcm9sbE9mZnNldCgpO2NvbnN0IGdyb3Vwcz10aGlzLl9yYXdUaW1lbGluZURhdGEuZ3JvdXBzfHxbXTtjb25zdCBncm91cD10aGlzLl9ncm91cE9mZnNldHMudXBwZXJCb3VuZCh5KS0xO2lmKGdyb3VwPDB8fGdyb3VwPj1ncm91cHMubGVuZ3RoKQpyZXR1cm4tMTtjb25zdCBoZWlnaHQ9aGVhZGVyT25seT9ncm91cHNbZ3JvdXBdLnN0eWxlLmhlaWdodDp0aGlzLl9ncm91cE9mZnNldHNbZ3JvdXArMV0tdGhpcy5fZ3JvdXBPZmZzZXRzW2dyb3VwXTtpZih5LXRoaXMuX2dyb3VwT2Zmc2V0c1tncm91cF0+PWhlaWdodCkKcmV0dXJuLTE7aWYoIWhlYWRlck9ubHkpCnJldHVybiBncm91cDtjb25zdCBjb250ZXh0PSh0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSk7Y29udGV4dC5zYXZlKCk7Y29udGV4dC5mb250PWdyb3Vwc1tncm91cF0uc3R5bGUuZm9udDtjb25zdCByaWdodD10aGlzLl9oZWFkZXJMZWZ0UGFkZGluZyt0aGlzLl9sYWJlbFdpZHRoRm9yR3JvdXAoY29udGV4dCxncm91cHNbZ3JvdXBdKTtjb250ZXh0LnJlc3RvcmUoKTtpZih4PnJpZ2h0KQpyZXR1cm4tMTtyZXR1cm4gZ3JvdXA7fQpfbWFya2VySW5kZXhBdFBvc2l0aW9uKHgpe2NvbnN0IG1hcmtlcnM9dGhpcy5fdGltZWxpbmVEYXRhKCkubWFya2VycztpZighbWFya2VycykKcmV0dXJuLTE7Y29uc3QgYWNjdXJyYWN5T2Zmc2V0UHg9NDtjb25zdCB0aW1lPXRoaXMuX2NoYXJ0Vmlld3BvcnQucGl4ZWxUb1RpbWUoeCk7Y29uc3QgbGVmdFRpbWU9dGhpcy5fY2hhcnRWaWV3cG9ydC5waXhlbFRvVGltZSh4LWFjY3VycmFjeU9mZnNldFB4KTtjb25zdCByaWdodFRpbWU9dGhpcy5fY2hhcnRWaWV3cG9ydC5waXhlbFRvVGltZSh4K2FjY3VycmFjeU9mZnNldFB4KTtjb25zdCBsZWZ0PXRoaXMuX21hcmtlckluZGV4QmVmb3JlVGltZShsZWZ0VGltZSk7bGV0IG1hcmtlckluZGV4PS0xO2xldCBkaXN0YW5jZT1JbmZpbml0eTtmb3IobGV0IGk9bGVmdDtpPG1hcmtlcnMubGVuZ3RoJiZtYXJrZXJzW2ldLnN0YXJ0VGltZSgpPHJpZ2h0VGltZTtpKyspe2NvbnN0IG5leHREaXN0YW5jZT1NYXRoLmFicyhtYXJrZXJzW2ldLnN0YXJ0VGltZSgpLXRpbWUpO2lmKG5leHREaXN0YW5jZTxkaXN0YW5jZSl7bWFya2VySW5kZXg9aTtkaXN0YW5jZT1uZXh0RGlzdGFuY2U7fX0KcmV0dXJuIG1hcmtlckluZGV4O30KX21hcmtlckluZGV4QmVmb3JlVGltZSh0aW1lKXtyZXR1cm4gdGhpcy5fdGltZWxpbmVEYXRhKCkubWFya2Vycy5sb3dlckJvdW5kKHRpbWUsKG1hcmtlclRpbWVzdGFtcCxtYXJrZXIpPT5tYXJrZXJUaW1lc3RhbXAtbWFya2VyLnN0YXJ0VGltZSgpKTt9Cl9kcmF3KCl7Y29uc3QgdGltZWxpbmVEYXRhPXRoaXMuX3RpbWVsaW5lRGF0YSgpO2lmKCF0aW1lbGluZURhdGEpCnJldHVybjtjb25zdCB3aWR0aD10aGlzLl9vZmZzZXRXaWR0aDtjb25zdCBoZWlnaHQ9dGhpcy5fb2Zmc2V0SGVpZ2h0O2NvbnN0IGNvbnRleHQ9KHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtjb250ZXh0LnNhdmUoKTtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCB0b3A9dGhpcy5fY2hhcnRWaWV3cG9ydC5zY3JvbGxPZmZzZXQoKTtjb250ZXh0LnNjYWxlKHJhdGlvLHJhdGlvKTtjb250ZXh0LnRyYW5zbGF0ZSgwLC10b3ApO2NvbnN0IGRlZmF1bHRGb250PScxMXB4ICcrSG9zdC5mb250RmFtaWx5KCk7Y29udGV4dC5mb250PWRlZmF1bHRGb250O2NvbnN0IGVudHJ5VG90YWxUaW1lcz10aW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzO2NvbnN0IGVudHJ5U3RhcnRUaW1lcz10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzO2NvbnN0IGVudHJ5TGV2ZWxzPXRpbWVsaW5lRGF0YS5lbnRyeUxldmVscztjb25zdCB0aW1lVG9QaXhlbD10aGlzLl9jaGFydFZpZXdwb3J0LnRpbWVUb1BpeGVsKCk7Y29uc3QgdGl0bGVJbmRpY2VzPVtdO2NvbnN0IG1hcmtlckluZGljZXM9W107Y29uc3QgdGV4dFBhZGRpbmc9dGhpcy5fdGV4dFBhZGRpbmc7Y29uc3QgbWluVGV4dFdpZHRoPTIqdGV4dFBhZGRpbmcrVUkubWVhc3VyZVRleHRXaWR0aChjb250ZXh0LCdcdTIwMjYnKTtjb25zdCBtaW5WaXNpYmxlQmFyTGV2ZWw9TWF0aC5tYXgodGhpcy5fdmlzaWJsZUxldmVsT2Zmc2V0cy51cHBlckJvdW5kKHRvcCktMSwwKTtjb250ZXh0LnNhdmUoKTt0aGlzLl9mb3JFYWNoR3JvdXAoKG9mZnNldCxpbmRleCxncm91cCxpc0ZpcnN0LGdyb3VwSGVpZ2h0KT0+e2lmKGluZGV4PT09dGhpcy5fc2VsZWN0ZWRHcm91cCl7Y29udGV4dC5maWxsU3R5bGU9dGhpcy5fc2VsZWN0ZWRHcm91cEJhY2tyb3VuZENvbG9yO2NvbnRleHQuZmlsbFJlY3QoMCxvZmZzZXQsd2lkdGgsZ3JvdXBIZWlnaHQtZ3JvdXAuc3R5bGUucGFkZGluZyk7fX0pO2NvbnRleHQucmVzdG9yZSgpO2NvbnN0IGNvbG9yQnVja2V0cz1uZXcgTWFwKCk7Zm9yKGxldCBsZXZlbD1taW5WaXNpYmxlQmFyTGV2ZWw7bGV2ZWw8dGhpcy5fZGF0YVByb3ZpZGVyLm1heFN0YWNrRGVwdGgoKTsrK2xldmVsKXtpZih0aGlzLl9sZXZlbFRvT2Zmc2V0KGxldmVsKT50b3AraGVpZ2h0KQpicmVhaztpZighdGhpcy5fdmlzaWJsZUxldmVsc1tsZXZlbF0pCmNvbnRpbnVlO2NvbnN0IGxldmVsSW5kZXhlcz10aGlzLl90aW1lbGluZUxldmVsc1tsZXZlbF07Y29uc3QgcmlnaHRJbmRleE9uTGV2ZWw9bGV2ZWxJbmRleGVzLmxvd2VyQm91bmQodGhpcy5fY2hhcnRWaWV3cG9ydC53aW5kb3dSaWdodFRpbWUoKSwodGltZSxlbnRyeUluZGV4KT0+dGltZS1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF0pLQoxO2xldCBsYXN0RHJhd09mZnNldD1JbmZpbml0eTtmb3IobGV0IGVudHJ5SW5kZXhPbkxldmVsPXJpZ2h0SW5kZXhPbkxldmVsO2VudHJ5SW5kZXhPbkxldmVsPj0wOy0tZW50cnlJbmRleE9uTGV2ZWwpe2NvbnN0IGVudHJ5SW5kZXg9bGV2ZWxJbmRleGVzW2VudHJ5SW5kZXhPbkxldmVsXTtjb25zdCBlbnRyeVN0YXJ0VGltZT1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3QgZW50cnlPZmZzZXRSaWdodD1lbnRyeVN0YXJ0VGltZSsoZW50cnlUb3RhbFRpbWVzW2VudHJ5SW5kZXhdfHwwKTtpZihlbnRyeU9mZnNldFJpZ2h0PD10aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd0xlZnRUaW1lKCkpCmJyZWFrO2NvbnN0IGJhclg9dGhpcy5fdGltZVRvUG9zaXRpb25DbGlwcGVkKGVudHJ5U3RhcnRUaW1lKTtpZihiYXJYPj1sYXN0RHJhd09mZnNldCkKY29udGludWU7bGFzdERyYXdPZmZzZXQ9YmFyWDtjb25zdCBjb2xvcj10aGlzLl9kYXRhUHJvdmlkZXIuZW50cnlDb2xvcihlbnRyeUluZGV4KTtsZXQgYnVja2V0PWNvbG9yQnVja2V0cy5nZXQoY29sb3IpO2lmKCFidWNrZXQpe2J1Y2tldD1bXTtjb2xvckJ1Y2tldHMuc2V0KGNvbG9yLGJ1Y2tldCk7fQpidWNrZXQucHVzaChlbnRyeUluZGV4KTt9fQpjb25zdCBjb2xvcnM9Y29sb3JCdWNrZXRzLmtleXNBcnJheSgpO2ZvcihsZXQgYz0wO2M8Y29sb3JzLmxlbmd0aDsrK2Mpe2NvbnN0IGNvbG9yPWNvbG9yc1tjXTtjb25zdCBpbmRleGVzPWNvbG9yQnVja2V0cy5nZXQoY29sb3IpO2NvbnRleHQuYmVnaW5QYXRoKCk7Zm9yKGxldCBpPTA7aTxpbmRleGVzLmxlbmd0aDsrK2kpe2NvbnN0IGVudHJ5SW5kZXg9aW5kZXhlc1tpXTtjb25zdCBlbnRyeVN0YXJ0VGltZT1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3QgYmFyWD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW50cnlTdGFydFRpbWUpO2NvbnN0IGR1cmF0aW9uPWVudHJ5VG90YWxUaW1lc1tlbnRyeUluZGV4XTtjb25zdCBiYXJMZXZlbD1lbnRyeUxldmVsc1tlbnRyeUluZGV4XTtjb25zdCBiYXJIZWlnaHQ9dGhpcy5fbGV2ZWxIZWlnaHQoYmFyTGV2ZWwpO2NvbnN0IGJhclk9dGhpcy5fbGV2ZWxUb09mZnNldChiYXJMZXZlbCk7aWYoaXNOYU4oZHVyYXRpb24pKXtjb250ZXh0Lm1vdmVUbyhiYXJYK3RoaXMuX21hcmtlclJhZGl1cyxiYXJZK2JhckhlaWdodC8yKTtjb250ZXh0LmFyYyhiYXJYLGJhclkrYmFySGVpZ2h0LzIsdGhpcy5fbWFya2VyUmFkaXVzLDAsTWF0aC5QSSoyKTttYXJrZXJJbmRpY2VzLnB1c2goZW50cnlJbmRleCk7Y29udGludWU7fQpjb25zdCBiYXJSaWdodD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW50cnlTdGFydFRpbWUrZHVyYXRpb24pO2NvbnN0IGJhcldpZHRoPU1hdGgubWF4KGJhclJpZ2h0LWJhclgsMSk7aWYoY29sb3IpCmNvbnRleHQucmVjdChiYXJYLGJhclksYmFyV2lkdGgtMC40LGJhckhlaWdodC0xKTtpZihiYXJXaWR0aD5taW5UZXh0V2lkdGh8fHRoaXMuX2RhdGFQcm92aWRlci5mb3JjZURlY29yYXRpb24oZW50cnlJbmRleCkpCnRpdGxlSW5kaWNlcy5wdXNoKGVudHJ5SW5kZXgpO30KaWYoIWNvbG9yKQpjb250aW51ZTtjb250ZXh0LmZpbGxTdHlsZT1jb2xvcjtjb250ZXh0LmZpbGwoKTt9CmNvbnRleHQuYmVnaW5QYXRoKCk7Zm9yKGxldCBtPTA7bTxtYXJrZXJJbmRpY2VzLmxlbmd0aDsrK20pe2NvbnN0IGVudHJ5SW5kZXg9bWFya2VySW5kaWNlc1ttXTtjb25zdCBlbnRyeVN0YXJ0VGltZT1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3QgYmFyWD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW50cnlTdGFydFRpbWUpO2NvbnN0IGJhckxldmVsPWVudHJ5TGV2ZWxzW2VudHJ5SW5kZXhdO2NvbnN0IHk9dGhpcy5fbGV2ZWxUb09mZnNldChiYXJMZXZlbCkrdGhpcy5fbGV2ZWxIZWlnaHQoYmFyTGV2ZWwpLzI7Y29udGV4dC5tb3ZlVG8oYmFyWCt0aGlzLl9tYXJrZXJSYWRpdXMseSk7Y29udGV4dC5hcmMoYmFyWCx5LHRoaXMuX21hcmtlclJhZGl1cywwLE1hdGguUEkqMik7fQpjb250ZXh0LnN0cm9rZVN0eWxlPSdyZ2JhKDAsIDAsIDAsIDAuMiknO2NvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC50ZXh0QmFzZWxpbmU9J2FscGhhYmV0aWMnO2ZvcihsZXQgaT0wO2k8dGl0bGVJbmRpY2VzLmxlbmd0aDsrK2kpe2NvbnN0IGVudHJ5SW5kZXg9dGl0bGVJbmRpY2VzW2ldO2NvbnN0IGVudHJ5U3RhcnRUaW1lPWVudHJ5U3RhcnRUaW1lc1tlbnRyeUluZGV4XTtjb25zdCBiYXJYPXRoaXMuX3RpbWVUb1Bvc2l0aW9uQ2xpcHBlZChlbnRyeVN0YXJ0VGltZSk7Y29uc3QgYmFyUmlnaHQ9TWF0aC5taW4odGhpcy5fdGltZVRvUG9zaXRpb25DbGlwcGVkKGVudHJ5U3RhcnRUaW1lK2VudHJ5VG90YWxUaW1lc1tlbnRyeUluZGV4XSksd2lkdGgpKzE7Y29uc3QgYmFyV2lkdGg9YmFyUmlnaHQtYmFyWDtjb25zdCBiYXJMZXZlbD1lbnRyeUxldmVsc1tlbnRyeUluZGV4XTtjb25zdCBiYXJZPXRoaXMuX2xldmVsVG9PZmZzZXQoYmFyTGV2ZWwpO2xldCB0ZXh0PXRoaXMuX2RhdGFQcm92aWRlci5lbnRyeVRpdGxlKGVudHJ5SW5kZXgpO2lmKHRleHQmJnRleHQubGVuZ3RoKXtjb250ZXh0LmZvbnQ9dGhpcy5fZGF0YVByb3ZpZGVyLmVudHJ5Rm9udChlbnRyeUluZGV4KXx8ZGVmYXVsdEZvbnQ7dGV4dD1VSS50cmltVGV4dE1pZGRsZShjb250ZXh0LHRleHQsYmFyV2lkdGgtMip0ZXh0UGFkZGluZyk7fQpjb25zdCB1bmNsaXBwZWRCYXJYPXRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24oZW50cnlTdGFydFRpbWUpO2NvbnN0IGJhckhlaWdodD10aGlzLl9sZXZlbEhlaWdodChiYXJMZXZlbCk7aWYodGhpcy5fZGF0YVByb3ZpZGVyLmRlY29yYXRlRW50cnkoZW50cnlJbmRleCxjb250ZXh0LHRleHQsYmFyWCxiYXJZLGJhcldpZHRoLGJhckhlaWdodCx1bmNsaXBwZWRCYXJYLHRpbWVUb1BpeGVsKSkKY29udGludWU7aWYoIXRleHR8fCF0ZXh0Lmxlbmd0aCkKY29udGludWU7Y29udGV4dC5maWxsU3R5bGU9dGhpcy5fZGF0YVByb3ZpZGVyLnRleHRDb2xvcihlbnRyeUluZGV4KTtjb250ZXh0LmZpbGxUZXh0KHRleHQsYmFyWCt0ZXh0UGFkZGluZyxiYXJZK2JhckhlaWdodC10aGlzLl90ZXh0QmFzZWxpbmUpO30KY29udGV4dC5yZXN0b3JlKCk7dGhpcy5fZHJhd0dyb3VwSGVhZGVycyh3aWR0aCxoZWlnaHQpO3RoaXMuX2RyYXdGbG93RXZlbnRzKGNvbnRleHQsd2lkdGgsaGVpZ2h0KTt0aGlzLl9kcmF3TWFya2VycygpO2NvbnN0IGRpdmlkZXJzRGF0YT1QZXJmVUkuVGltZWxpbmVHcmlkLmNhbGN1bGF0ZUdyaWRPZmZzZXRzKHRoaXMpO1BlcmZVSS5UaW1lbGluZUdyaWQuZHJhd0NhbnZhc0dyaWQoY29udGV4dCxkaXZpZGVyc0RhdGEpO2lmKHRoaXMuX3J1bGVyRW5hYmxlZCl7UGVyZlVJLlRpbWVsaW5lR3JpZC5kcmF3Q2FudmFzSGVhZGVycyhjb250ZXh0LGRpdmlkZXJzRGF0YSx0aW1lPT50aGlzLmZvcm1hdFZhbHVlKHRpbWUsZGl2aWRlcnNEYXRhLnByZWNpc2lvbiksMyxQZXJmVUkuRmxhbWVDaGFydC5IZWFkZXJIZWlnaHQpO30KdGhpcy5fdXBkYXRlRWxlbWVudFBvc2l0aW9uKHRoaXMuX2hpZ2hsaWdodEVsZW1lbnQsdGhpcy5faGlnaGxpZ2h0ZWRFbnRyeUluZGV4KTt0aGlzLl91cGRhdGVFbGVtZW50UG9zaXRpb24odGhpcy5fc2VsZWN0ZWRFbGVtZW50LHRoaXMuX3NlbGVjdGVkRW50cnlJbmRleCk7dGhpcy5fdXBkYXRlTWFya2VySGlnaGxpZ2h0KCk7fQpfZHJhd0dyb3VwSGVhZGVycyh3aWR0aCxoZWlnaHQpe2NvbnN0IGNvbnRleHQ9KHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtjb25zdCB0b3A9dGhpcy5fY2hhcnRWaWV3cG9ydC5zY3JvbGxPZmZzZXQoKTtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCBncm91cHM9dGhpcy5fcmF3VGltZWxpbmVEYXRhLmdyb3Vwc3x8W107aWYoIWdyb3Vwcy5sZW5ndGgpCnJldHVybjtjb25zdCBncm91cE9mZnNldHM9dGhpcy5fZ3JvdXBPZmZzZXRzO2NvbnN0IGxhc3RHcm91cE9mZnNldD1BcnJheS5wcm90b3R5cGUucGVla0xhc3QuY2FsbChncm91cE9mZnNldHMpO2NvbnN0IGNvbG9yVXNhZ2U9VUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2U7Y29udGV4dC5zYXZlKCk7Y29udGV4dC5zY2FsZShyYXRpbyxyYXRpbyk7Y29udGV4dC50cmFuc2xhdGUoMCwtdG9wKTtjb25zdCBkZWZhdWx0Rm9udD0nMTFweCAnK0hvc3QuZm9udEZhbWlseSgpO2NvbnRleHQuZm9udD1kZWZhdWx0Rm9udDtjb250ZXh0LmZpbGxTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyNmZmYnLGNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7dGhpcy5fZm9yRWFjaEdyb3VwKChvZmZzZXQsaW5kZXgsZ3JvdXApPT57Y29uc3QgcGFkZGluZ0hlaWdodD1ncm91cC5zdHlsZS5wYWRkaW5nO2lmKHBhZGRpbmdIZWlnaHQ8NSkKcmV0dXJuO2NvbnRleHQuZmlsbFJlY3QoMCxvZmZzZXQtcGFkZGluZ0hlaWdodCsyLHdpZHRoLHBhZGRpbmdIZWlnaHQtNCk7fSk7aWYoZ3JvdXBzLmxlbmd0aCYmbGFzdEdyb3VwT2Zmc2V0PHRvcCtoZWlnaHQpCmNvbnRleHQuZmlsbFJlY3QoMCxsYXN0R3JvdXBPZmZzZXQrMix3aWR0aCx0b3AraGVpZ2h0LWxhc3RHcm91cE9mZnNldCk7Y29udGV4dC5zdHJva2VTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyNlZWUnLGNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7Y29udGV4dC5iZWdpblBhdGgoKTt0aGlzLl9mb3JFYWNoR3JvdXAoKG9mZnNldCxpbmRleCxncm91cCxpc0ZpcnN0KT0+e2lmKGlzRmlyc3R8fGdyb3VwLnN0eWxlLnBhZGRpbmc8NCkKcmV0dXJuO2hMaW5lKG9mZnNldC0yLjUpO30pO2hMaW5lKGxhc3RHcm91cE9mZnNldCsxLjUpO2NvbnRleHQuc3Ryb2tlKCk7dGhpcy5fZm9yRWFjaEdyb3VwKChvZmZzZXQsaW5kZXgsZ3JvdXApPT57aWYoZ3JvdXAuc3R5bGUudXNlRmlyc3RMaW5lRm9yT3ZlcnZpZXcpCnJldHVybjtpZighdGhpcy5faXNHcm91cENvbGxhcHNpYmxlKGluZGV4KXx8Z3JvdXAuZXhwYW5kZWQpe2lmKCFncm91cC5zdHlsZS5zaGFyZUhlYWRlckxpbmUmJmluZGV4IT09dGhpcy5fc2VsZWN0ZWRHcm91cCl7Y29udGV4dC5maWxsU3R5bGU9Z3JvdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yO2NvbnRleHQuZmlsbFJlY3QoMCxvZmZzZXQsd2lkdGgsZ3JvdXAuc3R5bGUuaGVpZ2h0KTt9CnJldHVybjt9CmxldCBuZXh0R3JvdXA9aW5kZXgrMTt3aGlsZShuZXh0R3JvdXA8Z3JvdXBzLmxlbmd0aCYmZ3JvdXBzW25leHRHcm91cF0uc3R5bGUubmVzdGluZ0xldmVsPmdyb3VwLnN0eWxlLm5lc3RpbmdMZXZlbCkKbmV4dEdyb3VwKys7Y29uc3QgZW5kTGV2ZWw9bmV4dEdyb3VwPGdyb3Vwcy5sZW5ndGg/Z3JvdXBzW25leHRHcm91cF0uc3RhcnRMZXZlbDp0aGlzLl9kYXRhUHJvdmlkZXIubWF4U3RhY2tEZXB0aCgpO3RoaXMuX2RyYXdDb2xsYXBzZWRPdmVydmlld0Zvckdyb3VwKGdyb3VwLG9mZnNldCxlbmRMZXZlbCk7fSk7Y29udGV4dC5zYXZlKCk7dGhpcy5fZm9yRWFjaEdyb3VwKChvZmZzZXQsaW5kZXgsZ3JvdXApPT57Y29udGV4dC5mb250PWdyb3VwLnN0eWxlLmZvbnQ7aWYodGhpcy5faXNHcm91cENvbGxhcHNpYmxlKGluZGV4KSYmIWdyb3VwLmV4cGFuZGVkfHxncm91cC5zdHlsZS5zaGFyZUhlYWRlckxpbmUpe2NvbnN0IHdpZHRoPXRoaXMuX2xhYmVsV2lkdGhGb3JHcm91cChjb250ZXh0LGdyb3VwKSsyO2lmKGluZGV4PT09dGhpcy5fc2VsZWN0ZWRHcm91cCkKY29udGV4dC5maWxsU3R5bGU9dGhpcy5fc2VsZWN0ZWRHcm91cEJhY2tyb3VuZENvbG9yO2Vsc2UKY29udGV4dC5maWxsU3R5bGU9Q29tbW9uLkNvbG9yLnBhcnNlKGdyb3VwLnN0eWxlLmJhY2tncm91bmRDb2xvcikuc2V0QWxwaGEoMC44KS5hc1N0cmluZyhudWxsKTtjb250ZXh0LmZpbGxSZWN0KHRoaXMuX2hlYWRlckxlZnRQYWRkaW5nLXRoaXMuX2hlYWRlckxhYmVsWFBhZGRpbmcsb2Zmc2V0K3RoaXMuX2hlYWRlckxhYmVsWVBhZGRpbmcsd2lkdGgsZ3JvdXAuc3R5bGUuaGVpZ2h0LTIqdGhpcy5faGVhZGVyTGFiZWxZUGFkZGluZyk7fQpjb250ZXh0LmZpbGxTdHlsZT1ncm91cC5zdHlsZS5jb2xvcjtjb250ZXh0LmZpbGxUZXh0KGdyb3VwLm5hbWUsTWF0aC5mbG9vcih0aGlzLl9leHBhbnNpb25BcnJvd0luZGVudCooZ3JvdXAuc3R5bGUubmVzdGluZ0xldmVsKzEpK3RoaXMuX2Fycm93U2lkZSksb2Zmc2V0K2dyb3VwLnN0eWxlLmhlaWdodC10aGlzLl90ZXh0QmFzZWxpbmUpO30pO2NvbnRleHQucmVzdG9yZSgpO2NvbnRleHQuZmlsbFN0eWxlPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dCgnIzZlNmU2ZScsY29sb3JVc2FnZS5Gb3JlZ3JvdW5kKTtjb250ZXh0LmJlZ2luUGF0aCgpO3RoaXMuX2ZvckVhY2hHcm91cCgob2Zmc2V0LGluZGV4LGdyb3VwKT0+e2lmKHRoaXMuX2lzR3JvdXBDb2xsYXBzaWJsZShpbmRleCkpe2RyYXdFeHBhbnNpb25BcnJvdy5jYWxsKHRoaXMsdGhpcy5fZXhwYW5zaW9uQXJyb3dJbmRlbnQqKGdyb3VwLnN0eWxlLm5lc3RpbmdMZXZlbCsxKSxvZmZzZXQrZ3JvdXAuc3R5bGUuaGVpZ2h0LXRoaXMuX3RleHRCYXNlbGluZS10aGlzLl9hcnJvd1NpZGUvMiwhIWdyb3VwLmV4cGFuZGVkKTt9fSk7Y29udGV4dC5maWxsKCk7Y29udGV4dC5zdHJva2VTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyNkZGQnLGNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LnN0cm9rZSgpO3RoaXMuX2ZvckVhY2hHcm91cCgob2Zmc2V0LGluZGV4LGdyb3VwLGlzRmlyc3QsZ3JvdXBIZWlnaHQpPT57aWYoaW5kZXg9PT10aGlzLl9zZWxlY3RlZEdyb3VwKXtjb25zdCBsaW5lV2lkdGg9Mjtjb25zdCBicmFja2V0TGVuZ3RoPTEwO2NvbnRleHQuZmlsbFN0eWxlPXRoaXMuX3NlbGVjdGVkR3JvdXBCb3JkZXJDb2xvcjtjb250ZXh0LmZpbGxSZWN0KDAsb2Zmc2V0LWxpbmVXaWR0aCxsaW5lV2lkdGgsZ3JvdXBIZWlnaHQtZ3JvdXAuc3R5bGUucGFkZGluZysyKmxpbmVXaWR0aCk7Y29udGV4dC5maWxsUmVjdCgwLG9mZnNldC1saW5lV2lkdGgsYnJhY2tldExlbmd0aCxsaW5lV2lkdGgpO2NvbnRleHQuZmlsbFJlY3QoMCxvZmZzZXQrZ3JvdXBIZWlnaHQtZ3JvdXAuc3R5bGUucGFkZGluZyxicmFja2V0TGVuZ3RoLGxpbmVXaWR0aCk7fX0pO2NvbnRleHQucmVzdG9yZSgpO2Z1bmN0aW9uIGhMaW5lKHkpe2NvbnRleHQubW92ZVRvKDAseSk7Y29udGV4dC5saW5lVG8od2lkdGgseSk7fQpmdW5jdGlvbiBkcmF3RXhwYW5zaW9uQXJyb3coeCx5LGV4cGFuZGVkKXtjb25zdCBhcnJvd0hlaWdodD10aGlzLl9hcnJvd1NpZGUqTWF0aC5zcXJ0KDMpLzI7Y29uc3QgYXJyb3dDZW50ZXJPZmZzZXQ9TWF0aC5yb3VuZChhcnJvd0hlaWdodC8yKTtjb250ZXh0LnNhdmUoKTtjb250ZXh0LnRyYW5zbGF0ZSh4LHkpO2NvbnRleHQucm90YXRlKGV4cGFuZGVkP01hdGguUEkvMjowKTtjb250ZXh0Lm1vdmVUbygtYXJyb3dDZW50ZXJPZmZzZXQsLXRoaXMuX2Fycm93U2lkZS8yKTtjb250ZXh0LmxpbmVUbygtYXJyb3dDZW50ZXJPZmZzZXQsdGhpcy5fYXJyb3dTaWRlLzIpO2NvbnRleHQubGluZVRvKGFycm93SGVpZ2h0LWFycm93Q2VudGVyT2Zmc2V0LDApO2NvbnRleHQucmVzdG9yZSgpO319Cl9mb3JFYWNoR3JvdXAoY2FsbGJhY2spe2NvbnN0IHRvcD10aGlzLl9jaGFydFZpZXdwb3J0LnNjcm9sbE9mZnNldCgpO2NvbnN0IGdyb3Vwcz10aGlzLl9yYXdUaW1lbGluZURhdGEuZ3JvdXBzfHxbXTtpZighZ3JvdXBzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGdyb3VwT2Zmc2V0cz10aGlzLl9ncm91cE9mZnNldHM7Y29uc3QgZ3JvdXBTdGFjaz1be25lc3RpbmdMZXZlbDotMSx2aXNpYmxlOnRydWV9XTtmb3IobGV0IGk9MDtpPGdyb3Vwcy5sZW5ndGg7KytpKXtjb25zdCBncm91cFRvcD1ncm91cE9mZnNldHNbaV07Y29uc3QgZ3JvdXA9Z3JvdXBzW2ldO2lmKGdyb3VwVG9wLWdyb3VwLnN0eWxlLnBhZGRpbmc+dG9wK3RoaXMuX29mZnNldEhlaWdodCkKYnJlYWs7bGV0IGZpcnN0R3JvdXA9dHJ1ZTt3aGlsZShncm91cFN0YWNrLnBlZWtMYXN0KCkubmVzdGluZ0xldmVsPj1ncm91cC5zdHlsZS5uZXN0aW5nTGV2ZWwpe2dyb3VwU3RhY2sucG9wKCk7Zmlyc3RHcm91cD1mYWxzZTt9CmNvbnN0IHBhcmVudEdyb3VwVmlzaWJsZT1ncm91cFN0YWNrLnBlZWtMYXN0KCkudmlzaWJsZTtjb25zdCB0aGlzR3JvdXBWaXNpYmxlPXBhcmVudEdyb3VwVmlzaWJsZSYmKCF0aGlzLl9pc0dyb3VwQ29sbGFwc2libGUoaSl8fGdyb3VwLmV4cGFuZGVkKTtncm91cFN0YWNrLnB1c2goe25lc3RpbmdMZXZlbDpncm91cC5zdHlsZS5uZXN0aW5nTGV2ZWwsdmlzaWJsZTp0aGlzR3JvdXBWaXNpYmxlfSk7Y29uc3QgbmV4dE9mZnNldD1pPT09Z3JvdXBzLmxlbmd0aC0xP2dyb3VwT2Zmc2V0c1tpKzFdK2dyb3VwLnN0eWxlLnBhZGRpbmc6Z3JvdXBPZmZzZXRzW2krMV07aWYoIXBhcmVudEdyb3VwVmlzaWJsZXx8bmV4dE9mZnNldDx0b3ApCmNvbnRpbnVlO2NhbGxiYWNrKGdyb3VwVG9wLGksZ3JvdXAsZmlyc3RHcm91cCxuZXh0T2Zmc2V0LWdyb3VwVG9wKTt9fQpfbGFiZWxXaWR0aEZvckdyb3VwKGNvbnRleHQsZ3JvdXApe3JldHVybiBVSS5tZWFzdXJlVGV4dFdpZHRoKGNvbnRleHQsZ3JvdXAubmFtZSkrdGhpcy5fZXhwYW5zaW9uQXJyb3dJbmRlbnQqKGdyb3VwLnN0eWxlLm5lc3RpbmdMZXZlbCsxKSsKMip0aGlzLl9oZWFkZXJMYWJlbFhQYWRkaW5nO30KX2RyYXdDb2xsYXBzZWRPdmVydmlld0Zvckdyb3VwKGdyb3VwLHksZW5kTGV2ZWwpe2NvbnN0IHJhbmdlPW5ldyBDb21tb24uU2VnbWVudGVkUmFuZ2UobWVyZ2VDYWxsYmFjayk7Y29uc3QgdGltZVdpbmRvd0xlZnQ9dGhpcy5fY2hhcnRWaWV3cG9ydC53aW5kb3dMZWZ0VGltZSgpO2NvbnN0IHRpbWVXaW5kb3dSaWdodD10aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd1JpZ2h0VGltZSgpO2NvbnN0IGNvbnRleHQ9KHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtjb25zdCBiYXJIZWlnaHQ9Z3JvdXAuc3R5bGUuaGVpZ2h0O2NvbnN0IGVudHJ5U3RhcnRUaW1lcz10aGlzLl9yYXdUaW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzO2NvbnN0IGVudHJ5VG90YWxUaW1lcz10aGlzLl9yYXdUaW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzO2NvbnN0IHRpbWVUb1BpeGVsPXRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUGl4ZWwoKTtmb3IobGV0IGxldmVsPWdyb3VwLnN0YXJ0TGV2ZWw7bGV2ZWw8ZW5kTGV2ZWw7KytsZXZlbCl7Y29uc3QgbGV2ZWxJbmRleGVzPXRoaXMuX3RpbWVsaW5lTGV2ZWxzW2xldmVsXTtjb25zdCByaWdodEluZGV4T25MZXZlbD1sZXZlbEluZGV4ZXMubG93ZXJCb3VuZCh0aW1lV2luZG93UmlnaHQsKHRpbWUsZW50cnlJbmRleCk9PnRpbWUtZW50cnlTdGFydFRpbWVzW2VudHJ5SW5kZXhdKS0xO2xldCBsYXN0RHJhd09mZnNldD1JbmZpbml0eTtmb3IobGV0IGVudHJ5SW5kZXhPbkxldmVsPXJpZ2h0SW5kZXhPbkxldmVsO2VudHJ5SW5kZXhPbkxldmVsPj0wOy0tZW50cnlJbmRleE9uTGV2ZWwpe2NvbnN0IGVudHJ5SW5kZXg9bGV2ZWxJbmRleGVzW2VudHJ5SW5kZXhPbkxldmVsXTtjb25zdCBlbnRyeVN0YXJ0VGltZT1lbnRyeVN0YXJ0VGltZXNbZW50cnlJbmRleF07Y29uc3QgYmFyWD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW50cnlTdGFydFRpbWUpO2NvbnN0IGVudHJ5RW5kVGltZT1lbnRyeVN0YXJ0VGltZStlbnRyeVRvdGFsVGltZXNbZW50cnlJbmRleF07aWYoaXNOYU4oZW50cnlFbmRUaW1lKXx8YmFyWD49bGFzdERyYXdPZmZzZXQpCmNvbnRpbnVlO2lmKGVudHJ5RW5kVGltZTw9dGltZVdpbmRvd0xlZnQpCmJyZWFrO2xhc3REcmF3T2Zmc2V0PWJhclg7Y29uc3QgY29sb3I9dGhpcy5fZGF0YVByb3ZpZGVyLmVudHJ5Q29sb3IoZW50cnlJbmRleCk7Y29uc3QgZW5kQmFyWD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW50cnlFbmRUaW1lKTtpZihncm91cC5zdHlsZS51c2VEZWNvcmF0b3JzRm9yT3ZlcnZpZXcmJnRoaXMuX2RhdGFQcm92aWRlci5mb3JjZURlY29yYXRpb24oZW50cnlJbmRleCkpe2NvbnN0IHVuY2xpcHBlZEJhclg9dGhpcy5fY2hhcnRWaWV3cG9ydC50aW1lVG9Qb3NpdGlvbihlbnRyeVN0YXJ0VGltZSk7Y29uc3QgYmFyV2lkdGg9ZW5kQmFyWC1iYXJYO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5maWxsU3R5bGU9Y29sb3I7Y29udGV4dC5maWxsUmVjdChiYXJYLHksYmFyV2lkdGgsYmFySGVpZ2h0LTEpO3RoaXMuX2RhdGFQcm92aWRlci5kZWNvcmF0ZUVudHJ5KGVudHJ5SW5kZXgsY29udGV4dCwnJyxiYXJYLHksYmFyV2lkdGgsYmFySGVpZ2h0LHVuY2xpcHBlZEJhclgsdGltZVRvUGl4ZWwpO2NvbnRpbnVlO30KcmFuZ2UuYXBwZW5kKG5ldyBDb21tb24uU2VnbWVudChiYXJYLGVuZEJhclgsY29sb3IpKTt9fQpjb25zdCBzZWdtZW50cz1yYW5nZS5zZWdtZW50cygpLnNsaWNlKCkuc29ydCgoYSxiKT0+YS5kYXRhLmxvY2FsZUNvbXBhcmUoYi5kYXRhKSk7bGV0IGxhc3RDb2xvcjtjb250ZXh0LmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8c2VnbWVudHMubGVuZ3RoOysraSl7Y29uc3Qgc2VnbWVudD1zZWdtZW50c1tpXTtpZihsYXN0Q29sb3IhPT1zZWdtZW50c1tpXS5kYXRhKXtjb250ZXh0LmZpbGwoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2xhc3RDb2xvcj1zZWdtZW50c1tpXS5kYXRhO2NvbnRleHQuZmlsbFN0eWxlPWxhc3RDb2xvcjt9CmNvbnRleHQucmVjdChzZWdtZW50LmJlZ2luLHksc2VnbWVudC5lbmQtc2VnbWVudC5iZWdpbixiYXJIZWlnaHQpO30KY29udGV4dC5maWxsKCk7ZnVuY3Rpb24gbWVyZ2VDYWxsYmFjayhhLGIpe3JldHVybiBhLmRhdGE9PT1iLmRhdGEmJmEuZW5kKzAuND5iLmVuZD9hOm51bGw7fX0KX2RyYXdGbG93RXZlbnRzKGNvbnRleHQsd2lkdGgsaGVpZ2h0KXtjb250ZXh0LnNhdmUoKTtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCB0b3A9dGhpcy5fY2hhcnRWaWV3cG9ydC5zY3JvbGxPZmZzZXQoKTtjb25zdCBhcnJvd1dpZHRoPTY7Y29udGV4dC5zY2FsZShyYXRpbyxyYXRpbyk7Y29udGV4dC50cmFuc2xhdGUoMCwtdG9wKTtjb250ZXh0LmZpbGxTdHlsZT0nIzdmNTA1MCc7Y29udGV4dC5zdHJva2VTdHlsZT0nIzdmNTA1MCc7Y29uc3QgdGQ9dGhpcy5fdGltZWxpbmVEYXRhKCk7Y29uc3QgZW5kSW5kZXg9dGQuZmxvd1N0YXJ0VGltZXMubG93ZXJCb3VuZCh0aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd1JpZ2h0VGltZSgpKTtjb250ZXh0LmxpbmVXaWR0aD0wLjU7Zm9yKGxldCBpPTA7aTxlbmRJbmRleDsrK2kpe2lmKCF0ZC5mbG93RW5kVGltZXNbaV18fHRkLmZsb3dFbmRUaW1lc1tpXTx0aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd0xlZnRUaW1lKCkpCmNvbnRpbnVlO2NvbnN0IHN0YXJ0WD10aGlzLl9jaGFydFZpZXdwb3J0LnRpbWVUb1Bvc2l0aW9uKHRkLmZsb3dTdGFydFRpbWVzW2ldKTtjb25zdCBlbmRYPXRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24odGQuZmxvd0VuZFRpbWVzW2ldKTtjb25zdCBzdGFydExldmVsPXRkLmZsb3dTdGFydExldmVsc1tpXTtjb25zdCBlbmRMZXZlbD10ZC5mbG93RW5kTGV2ZWxzW2ldO2NvbnN0IHN0YXJ0WT10aGlzLl9sZXZlbFRvT2Zmc2V0KHN0YXJ0TGV2ZWwpK3RoaXMuX2xldmVsSGVpZ2h0KHN0YXJ0TGV2ZWwpLzI7Y29uc3QgZW5kWT10aGlzLl9sZXZlbFRvT2Zmc2V0KGVuZExldmVsKSt0aGlzLl9sZXZlbEhlaWdodChlbmRMZXZlbCkvMjtjb25zdCBzZWdtZW50PU1hdGgubWluKChlbmRYLXN0YXJ0WCkvNCw0MCk7Y29uc3QgZGlzdGFuY2VUaW1lPXRkLmZsb3dFbmRUaW1lc1tpXS10ZC5mbG93U3RhcnRUaW1lc1tpXTtjb25zdCBkaXN0YW5jZVk9KGVuZFktc3RhcnRZKS8xMDtjb25zdCBzcHJlYWQ9MzA7Y29uc3QgbGluZVk9ZGlzdGFuY2VUaW1lPDE/c3RhcnRZOnNwcmVhZCtNYXRoLm1heCgwLHN0YXJ0WStkaXN0YW5jZVkqKGklc3ByZWFkKSk7Y29uc3QgcD1bXTtwLnB1c2goe3g6c3RhcnRYLHk6c3RhcnRZfSk7cC5wdXNoKHt4OnN0YXJ0WCthcnJvd1dpZHRoLHk6c3RhcnRZfSk7cC5wdXNoKHt4OnN0YXJ0WCtzZWdtZW50KzIqYXJyb3dXaWR0aCx5OnN0YXJ0WX0pO3AucHVzaCh7eDpzdGFydFgrc2VnbWVudCx5OmxpbmVZfSk7cC5wdXNoKHt4OnN0YXJ0WCtzZWdtZW50KjIseTpsaW5lWX0pO3AucHVzaCh7eDplbmRYLXNlZ21lbnQqMix5OmxpbmVZfSk7cC5wdXNoKHt4OmVuZFgtc2VnbWVudCx5OmxpbmVZfSk7cC5wdXNoKHt4OmVuZFgtc2VnbWVudC0yKmFycm93V2lkdGgseTplbmRZfSk7cC5wdXNoKHt4OmVuZFgtYXJyb3dXaWR0aCx5OmVuZFl9KTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKHBbMF0ueCxwWzBdLnkpO2NvbnRleHQubGluZVRvKHBbMV0ueCxwWzFdLnkpO2NvbnRleHQuYmV6aWVyQ3VydmVUbyhwWzJdLngscFsyXS55LHBbM10ueCxwWzNdLnkscFs0XS54LHBbNF0ueSk7Y29udGV4dC5saW5lVG8ocFs1XS54LHBbNV0ueSk7Y29udGV4dC5iZXppZXJDdXJ2ZVRvKHBbNl0ueCxwWzZdLnkscFs3XS54LHBbN10ueSxwWzhdLngscFs4XS55KTtjb250ZXh0LnN0cm9rZSgpO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5hcmMoc3RhcnRYLHN0YXJ0WSwyLC1NYXRoLlBJLzIsTWF0aC5QSS8yLGZhbHNlKTtjb250ZXh0LmZpbGwoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKGVuZFgsZW5kWSk7Y29udGV4dC5saW5lVG8oZW5kWC1hcnJvd1dpZHRoLGVuZFktMyk7Y29udGV4dC5saW5lVG8oZW5kWC1hcnJvd1dpZHRoLGVuZFkrMyk7Y29udGV4dC5maWxsKCk7fQpjb250ZXh0LnJlc3RvcmUoKTt9Cl9kcmF3TWFya2Vycygpe2NvbnN0IG1hcmtlcnM9dGhpcy5fdGltZWxpbmVEYXRhKCkubWFya2Vycztjb25zdCBsZWZ0PXRoaXMuX21hcmtlckluZGV4QmVmb3JlVGltZSh0aGlzLm1pbmltdW1Cb3VuZGFyeSgpKTtjb25zdCByaWdodEJvdW5kYXJ5PXRoaXMubWF4aW11bUJvdW5kYXJ5KCk7Y29uc3QgdGltZVRvUGl4ZWw9dGhpcy5fY2hhcnRWaWV3cG9ydC50aW1lVG9QaXhlbCgpO2NvbnN0IGNvbnRleHQ9KHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpKTtjb250ZXh0LnNhdmUoKTtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb250ZXh0LnNjYWxlKHJhdGlvLHJhdGlvKTtjb250ZXh0LnRyYW5zbGF0ZSgwLDMpO2NvbnN0IGhlaWdodD1QZXJmVUkuRmxhbWVDaGFydC5IZWFkZXJIZWlnaHQtMTtmb3IobGV0IGk9bGVmdDtpPG1hcmtlcnMubGVuZ3RoO2krKyl7Y29uc3QgdGltZXN0YW1wPW1hcmtlcnNbaV0uc3RhcnRUaW1lKCk7aWYodGltZXN0YW1wPnJpZ2h0Qm91bmRhcnkpCmJyZWFrO21hcmtlcnNbaV0uZHJhdyhjb250ZXh0LHRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24odGltZXN0YW1wKSxoZWlnaHQsdGltZVRvUGl4ZWwpO30KY29udGV4dC5yZXN0b3JlKCk7fQpfdXBkYXRlTWFya2VySGlnaGxpZ2h0KCl7Y29uc3QgZWxlbWVudD10aGlzLl9tYXJrZXJIaWdobGlnaEVsZW1lbnQ7aWYoZWxlbWVudC5wYXJlbnRFbGVtZW50KQplbGVtZW50LnJlbW92ZSgpO2NvbnN0IG1hcmtlckluZGV4PXRoaXMuX2hpZ2hsaWdodGVkTWFya2VySW5kZXg7aWYobWFya2VySW5kZXg9PT0tMSkKcmV0dXJuO2NvbnN0IG1hcmtlcj10aGlzLl90aW1lbGluZURhdGEoKS5tYXJrZXJzW21hcmtlckluZGV4XTtjb25zdCBiYXJYPXRoaXMuX3RpbWVUb1Bvc2l0aW9uQ2xpcHBlZChtYXJrZXIuc3RhcnRUaW1lKCkpO2VsZW1lbnQudGl0bGU9bWFya2VyLnRpdGxlKCk7Y29uc3Qgc3R5bGU9ZWxlbWVudC5zdHlsZTtzdHlsZS5sZWZ0PWJhclgrJ3B4JztzdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bWFya2VyLmNvbG9yKCk7dGhpcy5fdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO30KX3Byb2Nlc3NUaW1lbGluZURhdGEodGltZWxpbmVEYXRhKXtpZighdGltZWxpbmVEYXRhKXt0aGlzLl90aW1lbGluZUxldmVscz1udWxsO3RoaXMuX3Zpc2libGVMZXZlbE9mZnNldHM9bnVsbDt0aGlzLl92aXNpYmxlTGV2ZWxzPW51bGw7dGhpcy5fZ3JvdXBPZmZzZXRzPW51bGw7dGhpcy5fcmF3VGltZWxpbmVEYXRhPW51bGw7dGhpcy5fcmF3VGltZWxpbmVEYXRhTGVuZ3RoPTA7dGhpcy5fc2VsZWN0ZWRHcm91cD0tMTt0aGlzLl9mbGFtZUNoYXJ0RGVsZWdhdGUudXBkYXRlU2VsZWN0ZWRHcm91cCh0aGlzLG51bGwpO3JldHVybjt9CnRoaXMuX3Jhd1RpbWVsaW5lRGF0YT10aW1lbGluZURhdGE7dGhpcy5fcmF3VGltZWxpbmVEYXRhTGVuZ3RoPXRpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXMubGVuZ3RoO2NvbnN0IGVudHJ5Q291bnRlcnM9bmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGFQcm92aWRlci5tYXhTdGFja0RlcHRoKCkrMSk7Zm9yKGxldCBpPTA7aTx0aW1lbGluZURhdGEuZW50cnlMZXZlbHMubGVuZ3RoOysraSkKKytlbnRyeUNvdW50ZXJzW3RpbWVsaW5lRGF0YS5lbnRyeUxldmVsc1tpXV07Y29uc3QgbGV2ZWxJbmRleGVzPW5ldyBBcnJheShlbnRyeUNvdW50ZXJzLmxlbmd0aCk7Zm9yKGxldCBpPTA7aTxsZXZlbEluZGV4ZXMubGVuZ3RoOysraSl7bGV2ZWxJbmRleGVzW2ldPW5ldyBVaW50MzJBcnJheShlbnRyeUNvdW50ZXJzW2ldKTtlbnRyeUNvdW50ZXJzW2ldPTA7fQpmb3IobGV0IGk9MDtpPHRpbWVsaW5lRGF0YS5lbnRyeUxldmVscy5sZW5ndGg7KytpKXtjb25zdCBsZXZlbD10aW1lbGluZURhdGEuZW50cnlMZXZlbHNbaV07bGV2ZWxJbmRleGVzW2xldmVsXVtlbnRyeUNvdW50ZXJzW2xldmVsXSsrXT1pO30KdGhpcy5fdGltZWxpbmVMZXZlbHM9bGV2ZWxJbmRleGVzO2NvbnN0IGdyb3Vwcz10aGlzLl9yYXdUaW1lbGluZURhdGEuZ3JvdXBzfHxbXTtmb3IobGV0IGk9MDtpPGdyb3Vwcy5sZW5ndGg7KytpKXtjb25zdCBleHBhbmRlZD10aGlzLl9ncm91cEV4cGFuc2lvblN0YXRlW2dyb3Vwc1tpXS5uYW1lXTtpZihleHBhbmRlZCE9PXVuZGVmaW5lZCkKZ3JvdXBzW2ldLmV4cGFuZGVkPWV4cGFuZGVkO30KdGhpcy5fdXBkYXRlTGV2ZWxQb3NpdGlvbnMoKTt0aGlzLl91cGRhdGVIZWlnaHQoKTt0aGlzLl9zZWxlY3RlZEdyb3VwPXRpbWVsaW5lRGF0YS5zZWxlY3RlZEdyb3VwP2dyb3Vwcy5pbmRleE9mKHRpbWVsaW5lRGF0YS5zZWxlY3RlZEdyb3VwKTotMTt0aGlzLl9mbGFtZUNoYXJ0RGVsZWdhdGUudXBkYXRlU2VsZWN0ZWRHcm91cCh0aGlzLHRpbWVsaW5lRGF0YS5zZWxlY3RlZEdyb3VwKTt9Cl91cGRhdGVMZXZlbFBvc2l0aW9ucygpe2NvbnN0IGxldmVsQ291bnQ9dGhpcy5fZGF0YVByb3ZpZGVyLm1heFN0YWNrRGVwdGgoKTtjb25zdCBncm91cHM9dGhpcy5fcmF3VGltZWxpbmVEYXRhLmdyb3Vwc3x8W107dGhpcy5fdmlzaWJsZUxldmVsT2Zmc2V0cz1uZXcgVWludDMyQXJyYXkobGV2ZWxDb3VudCsxKTt0aGlzLl92aXNpYmxlTGV2ZWxIZWlnaHRzPW5ldyBVaW50MzJBcnJheShsZXZlbENvdW50KTt0aGlzLl92aXNpYmxlTGV2ZWxzPW5ldyBVaW50MTZBcnJheShsZXZlbENvdW50KTt0aGlzLl9ncm91cE9mZnNldHM9bmV3IFVpbnQzMkFycmF5KGdyb3Vwcy5sZW5ndGgrMSk7bGV0IGdyb3VwSW5kZXg9LTE7bGV0IGN1cnJlbnRPZmZzZXQ9dGhpcy5fcnVsZXJFbmFibGVkP1BlcmZVSS5GbGFtZUNoYXJ0LkhlYWRlckhlaWdodCsyOjI7bGV0IHZpc2libGU9dHJ1ZTtjb25zdCBncm91cFN0YWNrPVt7bmVzdGluZ0xldmVsOi0xLHZpc2libGU6dHJ1ZX1dO2NvbnN0IGxhc3RHcm91cExldmVsPU1hdGgubWF4KGxldmVsQ291bnQsZ3JvdXBzLmxlbmd0aD9ncm91cHMucGVla0xhc3QoKS5zdGFydExldmVsKzE6MCk7bGV0IGxldmVsO2ZvcihsZXZlbD0wO2xldmVsPGxhc3RHcm91cExldmVsOysrbGV2ZWwpe2xldCBwYXJlbnRHcm91cElzVmlzaWJsZT10cnVlO2xldCBzdHlsZTt3aGlsZShncm91cEluZGV4PGdyb3Vwcy5sZW5ndGgtMSYmbGV2ZWw9PT1ncm91cHNbZ3JvdXBJbmRleCsxXS5zdGFydExldmVsKXsrK2dyb3VwSW5kZXg7c3R5bGU9Z3JvdXBzW2dyb3VwSW5kZXhdLnN0eWxlO2xldCBuZXh0TGV2ZWw9dHJ1ZTt3aGlsZShncm91cFN0YWNrLnBlZWtMYXN0KCkubmVzdGluZ0xldmVsPj1zdHlsZS5uZXN0aW5nTGV2ZWwpe2dyb3VwU3RhY2sucG9wKCk7bmV4dExldmVsPWZhbHNlO30KY29uc3QgdGhpc0dyb3VwSXNWaXNpYmxlPWdyb3VwSW5kZXg+PTAmJnRoaXMuX2lzR3JvdXBDb2xsYXBzaWJsZShncm91cEluZGV4KT9ncm91cHNbZ3JvdXBJbmRleF0uZXhwYW5kZWQ6dHJ1ZTtwYXJlbnRHcm91cElzVmlzaWJsZT1ncm91cFN0YWNrLnBlZWtMYXN0KCkudmlzaWJsZTt2aXNpYmxlPXRoaXNHcm91cElzVmlzaWJsZSYmcGFyZW50R3JvdXBJc1Zpc2libGU7Z3JvdXBTdGFjay5wdXNoKHtuZXN0aW5nTGV2ZWw6c3R5bGUubmVzdGluZ0xldmVsLHZpc2libGU6dmlzaWJsZX0pO2lmKHBhcmVudEdyb3VwSXNWaXNpYmxlKQpjdXJyZW50T2Zmc2V0Kz1uZXh0TGV2ZWw/MDpzdHlsZS5wYWRkaW5nO3RoaXMuX2dyb3VwT2Zmc2V0c1tncm91cEluZGV4XT1jdXJyZW50T2Zmc2V0O2lmKHBhcmVudEdyb3VwSXNWaXNpYmxlJiYhc3R5bGUuc2hhcmVIZWFkZXJMaW5lKQpjdXJyZW50T2Zmc2V0Kz1zdHlsZS5oZWlnaHQ7fQpjb25zdCBpc0ZpcnN0T25MZXZlbD1ncm91cEluZGV4Pj0wJiZsZXZlbD09PWdyb3Vwc1tncm91cEluZGV4XS5zdGFydExldmVsO2NvbnN0IHRoaXNMZXZlbElzVmlzaWJsZT1wYXJlbnRHcm91cElzVmlzaWJsZSYmKHZpc2libGV8fGlzRmlyc3RPbkxldmVsJiZncm91cHNbZ3JvdXBJbmRleF0uc3R5bGUudXNlRmlyc3RMaW5lRm9yT3ZlcnZpZXcpO2lmKGxldmVsPGxldmVsQ291bnQpe2xldCBoZWlnaHQ7aWYoZ3JvdXBJbmRleD49MCl7Y29uc3QgZ3JvdXA9Z3JvdXBzW2dyb3VwSW5kZXhdO2NvbnN0IHN0eWxlQj1ncm91cC5zdHlsZTtoZWlnaHQ9aXNGaXJzdE9uTGV2ZWwmJiFzdHlsZUIuc2hhcmVIZWFkZXJMaW5lfHwoc3R5bGVCLmNvbGxhcHNpYmxlJiYhZ3JvdXAuZXhwYW5kZWQpP3N0eWxlQi5oZWlnaHQ6KHN0eWxlQi5pdGVtc0hlaWdodHx8dGhpcy5fYmFySGVpZ2h0KTt9ZWxzZXtoZWlnaHQ9dGhpcy5fYmFySGVpZ2h0O30KdGhpcy5fdmlzaWJsZUxldmVsc1tsZXZlbF09dGhpc0xldmVsSXNWaXNpYmxlO3RoaXMuX3Zpc2libGVMZXZlbE9mZnNldHNbbGV2ZWxdPWN1cnJlbnRPZmZzZXQ7dGhpcy5fdmlzaWJsZUxldmVsSGVpZ2h0c1tsZXZlbF09aGVpZ2h0O30KaWYodGhpc0xldmVsSXNWaXNpYmxlfHwocGFyZW50R3JvdXBJc1Zpc2libGUmJnN0eWxlJiZzdHlsZS5zaGFyZUhlYWRlckxpbmUmJmlzRmlyc3RPbkxldmVsKSkKY3VycmVudE9mZnNldCs9dGhpcy5fdmlzaWJsZUxldmVsSGVpZ2h0c1tsZXZlbF07fQppZihncm91cEluZGV4Pj0wKQp0aGlzLl9ncm91cE9mZnNldHNbZ3JvdXBJbmRleCsxXT1jdXJyZW50T2Zmc2V0O3RoaXMuX3Zpc2libGVMZXZlbE9mZnNldHNbbGV2ZWxdPWN1cnJlbnRPZmZzZXQ7fQpfaXNHcm91cENvbGxhcHNpYmxlKGluZGV4KXtjb25zdCBncm91cHM9dGhpcy5fcmF3VGltZWxpbmVEYXRhLmdyb3Vwc3x8W107Y29uc3Qgc3R5bGU9Z3JvdXBzW2luZGV4XS5zdHlsZTtpZighc3R5bGUuc2hhcmVIZWFkZXJMaW5lfHwhc3R5bGUuY29sbGFwc2libGUpCnJldHVybiEhc3R5bGUuY29sbGFwc2libGU7Y29uc3QgaXNMYXN0R3JvdXA9aW5kZXgrMT49Z3JvdXBzLmxlbmd0aDtpZighaXNMYXN0R3JvdXAmJmdyb3Vwc1tpbmRleCsxXS5zdHlsZS5uZXN0aW5nTGV2ZWw+c3R5bGUubmVzdGluZ0xldmVsKQpyZXR1cm4gdHJ1ZTtjb25zdCBuZXh0R3JvdXBMZXZlbD1pc0xhc3RHcm91cD90aGlzLl9kYXRhUHJvdmlkZXIubWF4U3RhY2tEZXB0aCgpOmdyb3Vwc1tpbmRleCsxXS5zdGFydExldmVsO2lmKG5leHRHcm91cExldmVsIT09Z3JvdXBzW2luZGV4XS5zdGFydExldmVsKzEpCnJldHVybiB0cnVlO3JldHVybiBzdHlsZS5oZWlnaHQhPT1zdHlsZS5pdGVtc0hlaWdodDt9CnNldFNlbGVjdGVkRW50cnkoZW50cnlJbmRleCl7aWYodGhpcy5fc2VsZWN0ZWRFbnRyeUluZGV4PT09ZW50cnlJbmRleCkKcmV0dXJuO2lmKGVudHJ5SW5kZXghPT0tMSkKdGhpcy5fY2hhcnRWaWV3cG9ydC5oaWRlUmFuZ2VTZWxlY3Rpb24oKTt0aGlzLl9zZWxlY3RlZEVudHJ5SW5kZXg9ZW50cnlJbmRleDt0aGlzLl9yZXZlYWxFbnRyeShlbnRyeUluZGV4KTt0aGlzLl91cGRhdGVFbGVtZW50UG9zaXRpb24odGhpcy5fc2VsZWN0ZWRFbGVtZW50LHRoaXMuX3NlbGVjdGVkRW50cnlJbmRleCk7fQpfdXBkYXRlRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQsZW50cnlJbmRleCl7Y29uc3QgZWxlbWVudE1pbldpZHRoUHg9MjtpZihlbGVtZW50LnBhcmVudEVsZW1lbnQpCmVsZW1lbnQucmVtb3ZlKCk7aWYoZW50cnlJbmRleD09PS0xKQpyZXR1cm47Y29uc3QgdGltZWxpbmVEYXRhPXRoaXMuX3RpbWVsaW5lRGF0YSgpO2NvbnN0IHN0YXJ0VGltZT10aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2VudHJ5SW5kZXhdO2NvbnN0IGVuZFRpbWU9c3RhcnRUaW1lKyh0aW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzW2VudHJ5SW5kZXhdfHwwKTtsZXQgYmFyWD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoc3RhcnRUaW1lKTtjb25zdCBiYXJSaWdodD10aGlzLl90aW1lVG9Qb3NpdGlvbkNsaXBwZWQoZW5kVGltZSk7aWYoYmFyUmlnaHQ9PT0wfHxiYXJYPT09dGhpcy5fb2Zmc2V0V2lkdGgpCnJldHVybjtsZXQgYmFyV2lkdGg9YmFyUmlnaHQtYmFyWDtjb25zdCBiYXJDZW50ZXI9YmFyWCtiYXJXaWR0aC8yO2JhcldpZHRoPU1hdGgubWF4KGJhcldpZHRoLGVsZW1lbnRNaW5XaWR0aFB4KTtiYXJYPWJhckNlbnRlci1iYXJXaWR0aC8yO2NvbnN0IGVudHJ5TGV2ZWw9dGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW2VudHJ5SW5kZXhdO2NvbnN0IGJhclk9dGhpcy5fbGV2ZWxUb09mZnNldChlbnRyeUxldmVsKS10aGlzLl9jaGFydFZpZXdwb3J0LnNjcm9sbE9mZnNldCgpO2NvbnN0IGJhckhlaWdodD10aGlzLl9sZXZlbEhlaWdodChlbnRyeUxldmVsKTtjb25zdCBzdHlsZT1lbGVtZW50LnN0eWxlO3N0eWxlLmxlZnQ9YmFyWCsncHgnO3N0eWxlLnRvcD1iYXJZKydweCc7c3R5bGUud2lkdGg9YmFyV2lkdGgrJ3B4JztzdHlsZS5oZWlnaHQ9YmFySGVpZ2h0LTErJ3B4Jzt0aGlzLl92aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7fQpfdGltZVRvUG9zaXRpb25DbGlwcGVkKHRpbWUpe3JldHVybiBOdW1iZXIuY29uc3RyYWluKHRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24odGltZSksMCx0aGlzLl9vZmZzZXRXaWR0aCk7fQpfbGV2ZWxUb09mZnNldChsZXZlbCl7cmV0dXJuIHRoaXMuX3Zpc2libGVMZXZlbE9mZnNldHNbbGV2ZWxdO30KX2xldmVsSGVpZ2h0KGxldmVsKXtyZXR1cm4gdGhpcy5fdmlzaWJsZUxldmVsSGVpZ2h0c1tsZXZlbF07fQpfdXBkYXRlQm91bmRhcmllcygpe3RoaXMuX3RvdGFsVGltZT10aGlzLl9kYXRhUHJvdmlkZXIudG90YWxUaW1lKCk7dGhpcy5fbWluaW11bUJvdW5kYXJ5PXRoaXMuX2RhdGFQcm92aWRlci5taW5pbXVtQm91bmRhcnkoKTt0aGlzLl9jaGFydFZpZXdwb3J0LnNldEJvdW5kYXJpZXModGhpcy5fbWluaW11bUJvdW5kYXJ5LHRoaXMuX3RvdGFsVGltZSk7fQpfdXBkYXRlSGVpZ2h0KCl7Y29uc3QgaGVpZ2h0PXRoaXMuX2xldmVsVG9PZmZzZXQodGhpcy5fZGF0YVByb3ZpZGVyLm1heFN0YWNrRGVwdGgoKSkrMjt0aGlzLl9jaGFydFZpZXdwb3J0LnNldENvbnRlbnRIZWlnaHQoaGVpZ2h0KTt9Cm9uUmVzaXplKCl7dGhpcy5zY2hlZHVsZVVwZGF0ZSgpO30KdXBkYXRlKCl7aWYoIXRoaXMuX3RpbWVsaW5lRGF0YSgpKQpyZXR1cm47dGhpcy5fcmVzZXRDYW52YXMoKTt0aGlzLl91cGRhdGVIZWlnaHQoKTt0aGlzLl91cGRhdGVCb3VuZGFyaWVzKCk7dGhpcy5fZHJhdygpO2lmKCF0aGlzLl9jaGFydFZpZXdwb3J0LmlzRHJhZ2dpbmcoKSkKdGhpcy5fdXBkYXRlSGlnaGxpZ2h0KCk7fQpyZXNldCgpe3RoaXMuX2NoYXJ0Vmlld3BvcnQucmVzZXQoKTt0aGlzLl9yYXdUaW1lbGluZURhdGE9bnVsbDt0aGlzLl9yYXdUaW1lbGluZURhdGFMZW5ndGg9MDt0aGlzLl9oaWdobGlnaHRlZE1hcmtlckluZGV4PS0xO3RoaXMuX2hpZ2hsaWdodGVkRW50cnlJbmRleD0tMTt0aGlzLl9zZWxlY3RlZEVudHJ5SW5kZXg9LTE7dGhpcy5fdGV4dFdpZHRoPW5ldyBNYXAoKTt0aGlzLl9jaGFydFZpZXdwb3J0LnNjaGVkdWxlVXBkYXRlKCk7fQpzY2hlZHVsZVVwZGF0ZSgpe3RoaXMuX2NoYXJ0Vmlld3BvcnQuc2NoZWR1bGVVcGRhdGUoKTt9Cl9lbmFibGVkKCl7cmV0dXJuIHRoaXMuX3Jhd1RpbWVsaW5lRGF0YUxlbmd0aCE9PTA7fQpjb21wdXRlUG9zaXRpb24odGltZSl7cmV0dXJuIHRoaXMuX2NoYXJ0Vmlld3BvcnQudGltZVRvUG9zaXRpb24odGltZSk7fQpmb3JtYXRWYWx1ZSh2YWx1ZSxwcmVjaXNpb24pe3JldHVybiB0aGlzLl9kYXRhUHJvdmlkZXIuZm9ybWF0VmFsdWUodmFsdWUtdGhpcy56ZXJvVGltZSgpLHByZWNpc2lvbik7fQptYXhpbXVtQm91bmRhcnkoKXtyZXR1cm4gdGhpcy5fY2hhcnRWaWV3cG9ydC53aW5kb3dSaWdodFRpbWUoKTt9Cm1pbmltdW1Cb3VuZGFyeSgpe3JldHVybiB0aGlzLl9jaGFydFZpZXdwb3J0LndpbmRvd0xlZnRUaW1lKCk7fQp6ZXJvVGltZSgpe3JldHVybiB0aGlzLl9kYXRhUHJvdmlkZXIubWluaW11bUJvdW5kYXJ5KCk7fQpib3VuZGFyeVNwYW4oKXtyZXR1cm4gdGhpcy5tYXhpbXVtQm91bmRhcnkoKS10aGlzLm1pbmltdW1Cb3VuZGFyeSgpO319O1BlcmZVSS5GbGFtZUNoYXJ0LkhlYWRlckhlaWdodD0xNTtQZXJmVUkuRmxhbWVDaGFydC5NaW5pbWFsVGltZVdpbmRvd01zPTAuNTtQZXJmVUkuRmxhbWVDaGFydERhdGFQcm92aWRlcj1mdW5jdGlvbigpe307UGVyZlVJLkZsYW1lQ2hhcnQuR3JvdXA7UGVyZlVJLkZsYW1lQ2hhcnQuR3JvdXBTdHlsZTtQZXJmVUkuRmxhbWVDaGFydC5UaW1lbGluZURhdGE9Y2xhc3N7Y29uc3RydWN0b3IoZW50cnlMZXZlbHMsZW50cnlUb3RhbFRpbWVzLGVudHJ5U3RhcnRUaW1lcyxncm91cHMpe3RoaXMuZW50cnlMZXZlbHM9ZW50cnlMZXZlbHM7dGhpcy5lbnRyeVRvdGFsVGltZXM9ZW50cnlUb3RhbFRpbWVzO3RoaXMuZW50cnlTdGFydFRpbWVzPWVudHJ5U3RhcnRUaW1lczt0aGlzLmdyb3Vwcz1ncm91cHM7dGhpcy5tYXJrZXJzPVtdO3RoaXMuZmxvd1N0YXJ0VGltZXM9W107dGhpcy5mbG93U3RhcnRMZXZlbHM9W107dGhpcy5mbG93RW5kVGltZXM9W107dGhpcy5mbG93RW5kTGV2ZWxzPVtdO3RoaXMuc2VsZWN0ZWRHcm91cD1udWxsO319O1BlcmZVSS5GbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLnByb3RvdHlwZT17bWluaW11bUJvdW5kYXJ5KCl7fSx0b3RhbFRpbWUoKXt9LGZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7fSxtYXhTdGFja0RlcHRoKCl7fSx0aW1lbGluZURhdGEoKXt9LHByZXBhcmVIaWdobGlnaHRlZEVudHJ5SW5mbyhlbnRyeUluZGV4KXt9LGNhbkp1bXBUb0VudHJ5KGVudHJ5SW5kZXgpe30sZW50cnlUaXRsZShlbnRyeUluZGV4KXt9LGVudHJ5Rm9udChlbnRyeUluZGV4KXt9LGVudHJ5Q29sb3IoZW50cnlJbmRleCl7fSxkZWNvcmF0ZUVudHJ5KGVudHJ5SW5kZXgsY29udGV4dCx0ZXh0LGJhclgsYmFyWSxiYXJXaWR0aCxiYXJIZWlnaHQsdW5jbGlwcGVkQmFyWCx0aW1lVG9QaXhlbFJhdGlvKXt9LGZvcmNlRGVjb3JhdGlvbihlbnRyeUluZGV4KXt9LHRleHRDb2xvcihlbnRyeUluZGV4KXt9LH07UGVyZlVJLkZsYW1lQ2hhcnRNYXJrZXI9ZnVuY3Rpb24oKXt9O1BlcmZVSS5GbGFtZUNoYXJ0TWFya2VyLnByb3RvdHlwZT17c3RhcnRUaW1lKCl7fSxjb2xvcigpe30sdGl0bGUoKXt9LGRyYXcoY29udGV4dCx4LGhlaWdodCxwaXhlbHNQZXJNaWxsaXNlY29uZCl7fSx9O1BlcmZVSS5GbGFtZUNoYXJ0LkV2ZW50cz17RW50cnlTZWxlY3RlZDpTeW1ib2woJ0VudHJ5U2VsZWN0ZWQnKSxFbnRyeUhpZ2hsaWdodGVkOlN5bWJvbCgnRW50cnlIaWdobGlnaHRlZCcpfTtQZXJmVUkuRmxhbWVDaGFydC5Db2xvcnM9e1NlbGVjdGVkR3JvdXBCYWNrZ3JvdW5kOidoc2woMjE1LCA4NSUsIDk4JSknLFNlbGVjdGVkR3JvdXBCb3JkZXI6J2hzbCgyMTYsIDY4JSwgNTQlKScsfTs7UGVyZlVJLkdDQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2Zvcihjb25zdCBoZWFwUHJvZmlsZXJNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkhlYXBQcm9maWxlck1vZGVsKSkKaGVhcFByb2ZpbGVyTW9kZWwuY29sbGVjdEdhcmJhZ2UoKTtyZXR1cm4gdHJ1ZTt9fTs7UGVyZlVJLkxpbmVMZXZlbFByb2ZpbGU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9sb2NhdGlvblBvb2w9bmV3IEJpbmRpbmdzLkxpdmVMb2NhdGlvblBvb2woKTt0aGlzLnJlc2V0KCk7fQpzdGF0aWMgaW5zdGFuY2UoKXtpZighUGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuX2luc3RhbmNlKQpQZXJmVUkuTGluZUxldmVsUHJvZmlsZS5faW5zdGFuY2U9bmV3IFBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlKCk7cmV0dXJuIFBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLl9pbnN0YW5jZTt9CmFwcGVuZENQVVByb2ZpbGUocHJvZmlsZSl7Y29uc3Qgbm9kZXNUb0dvPVtwcm9maWxlLnByb2ZpbGVIZWFkXTtjb25zdCBzYW1wbGVEdXJhdGlvbj0ocHJvZmlsZS5wcm9maWxlRW5kVGltZS1wcm9maWxlLnByb2ZpbGVTdGFydFRpbWUpL3Byb2ZpbGUudG90YWxIaXRDb3VudDt3aGlsZShub2Rlc1RvR28ubGVuZ3RoKXtjb25zdCBub2Rlcz1ub2Rlc1RvR28ucG9wKCkuY2hpbGRyZW47Zm9yKGxldCBpPTA7aTxub2Rlcy5sZW5ndGg7KytpKXtjb25zdCBub2RlPW5vZGVzW2ldO25vZGVzVG9Hby5wdXNoKG5vZGUpO2lmKCFub2RlLnVybHx8IW5vZGUucG9zaXRpb25UaWNrcykKY29udGludWU7bGV0IGZpbGVJbmZvPXRoaXMuX2ZpbGVzLmdldChub2RlLnVybCk7aWYoIWZpbGVJbmZvKXtmaWxlSW5mbz1uZXcgTWFwKCk7dGhpcy5fZmlsZXMuc2V0KG5vZGUudXJsLGZpbGVJbmZvKTt9CmZvcihsZXQgaj0wO2o8bm9kZS5wb3NpdGlvblRpY2tzLmxlbmd0aDsrK2ope2NvbnN0IGxpbmVJbmZvPW5vZGUucG9zaXRpb25UaWNrc1tqXTtjb25zdCBsaW5lPWxpbmVJbmZvLmxpbmU7Y29uc3QgdGltZT1saW5lSW5mby50aWNrcypzYW1wbGVEdXJhdGlvbjtmaWxlSW5mby5zZXQobGluZSwoZmlsZUluZm8uZ2V0KGxpbmUpfHwwKSt0aW1lKTt9fX0KdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTt9CnJlc2V0KCl7dGhpcy5fZmlsZXM9bmV3IE1hcCgpO3RoaXMuX3NjaGVkdWxlVXBkYXRlKCk7fQpfc2NoZWR1bGVVcGRhdGUoKXtpZih0aGlzLl91cGRhdGVUaW1lcikKcmV0dXJuO3RoaXMuX3VwZGF0ZVRpbWVyPXNldFRpbWVvdXQoKCk9Pnt0aGlzLl91cGRhdGVUaW1lcj1udWxsO3RoaXMuX2RvVXBkYXRlKCk7fSwwKTt9Cl9kb1VwZGF0ZSgpe3RoaXMuX2xvY2F0aW9uUG9vbC5kaXNwb3NlQWxsKCk7V29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh1aVNvdXJjZUNvZGU9PnVpU291cmNlQ29kZS5yZW1vdmVEZWNvcmF0aW9uc0ZvclR5cGUoUGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuTGluZURlY29yYXRvci50eXBlKSk7Zm9yKGNvbnN0IGZpbGVJbmZvIG9mIHRoaXMuX2ZpbGVzKXtjb25zdCB1cmw9KGZpbGVJbmZvWzBdKTtjb25zdCB1aVNvdXJjZUNvZGU9V29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVGb3JVUkwodXJsKTtpZighdWlTb3VyY2VDb2RlKQpjb250aW51ZTtjb25zdCB0YXJnZXQ9QmluZGluZ3MuTmV0d29ya1Byb2plY3QudGFyZ2V0Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl8fFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKTtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldD90YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOm51bGw7aWYoIWRlYnVnZ2VyTW9kZWwpCmNvbnRpbnVlO2Zvcihjb25zdCBsaW5lSW5mbyBvZiBmaWxlSW5mb1sxXSl7Y29uc3QgbGluZT1saW5lSW5mb1swXS0xO2NvbnN0IHRpbWU9bGluZUluZm9bMV07Y29uc3QgcmF3TG9jYXRpb249ZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbkJ5VVJMKHVybCxsaW5lLDApO2lmKHJhd0xvY2F0aW9uKQpuZXcgUGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuUHJlc2VudGF0aW9uKHJhd0xvY2F0aW9uLHRpbWUsdGhpcy5fbG9jYXRpb25Qb29sKTtlbHNlIGlmKHVpU291cmNlQ29kZSkKdWlTb3VyY2VDb2RlLmFkZExpbmVEZWNvcmF0aW9uKGxpbmUsUGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuTGluZURlY29yYXRvci50eXBlLHRpbWUpO319fX07UGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuUHJlc2VudGF0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHJhd0xvY2F0aW9uLHRpbWUsbG9jYXRpb25Qb29sKXt0aGlzLl90aW1lPXRpbWU7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLmNyZWF0ZUxpdmVMb2NhdGlvbihyYXdMb2NhdGlvbix0aGlzLnVwZGF0ZUxvY2F0aW9uLmJpbmQodGhpcyksbG9jYXRpb25Qb29sKTt9CnVwZGF0ZUxvY2F0aW9uKGxpdmVMb2NhdGlvbil7aWYodGhpcy5fdWlMb2NhdGlvbikKdGhpcy5fdWlMb2NhdGlvbi51aVNvdXJjZUNvZGUucmVtb3ZlRGVjb3JhdGlvbnNGb3JUeXBlKFBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLkxpbmVEZWNvcmF0b3IudHlwZSk7dGhpcy5fdWlMb2NhdGlvbj1saXZlTG9jYXRpb24udWlMb2NhdGlvbigpO2lmKHRoaXMuX3VpTG9jYXRpb24pe3RoaXMuX3VpTG9jYXRpb24udWlTb3VyY2VDb2RlLmFkZExpbmVEZWNvcmF0aW9uKHRoaXMuX3VpTG9jYXRpb24ubGluZU51bWJlcixQZXJmVUkuTGluZUxldmVsUHJvZmlsZS5MaW5lRGVjb3JhdG9yLnR5cGUsdGhpcy5fdGltZSk7fX19O1BlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLkxpbmVEZWNvcmF0b3I9Y2xhc3N7ZGVjb3JhdGUodWlTb3VyY2VDb2RlLHRleHRFZGl0b3Ipe2NvbnN0IGd1dHRlclR5cGU9J0NvZGVNaXJyb3ItZ3V0dGVyLXBlcmZvcm1hbmNlJztjb25zdCBkZWNvcmF0aW9ucz11aVNvdXJjZUNvZGUuZGVjb3JhdGlvbnNGb3JUeXBlKFBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLkxpbmVEZWNvcmF0b3IudHlwZSk7dGV4dEVkaXRvci51bmluc3RhbGxHdXR0ZXIoZ3V0dGVyVHlwZSk7aWYoIWRlY29yYXRpb25zfHwhZGVjb3JhdGlvbnMuc2l6ZSkKcmV0dXJuO3RleHRFZGl0b3IuaW5zdGFsbEd1dHRlcihndXR0ZXJUeXBlLGZhbHNlKTtmb3IoY29uc3QgZGVjb3JhdGlvbiBvZiBkZWNvcmF0aW9ucyl7Y29uc3QgdGltZT0oZGVjb3JhdGlvbi5kYXRhKCkpO2NvbnN0IHRleHQ9Q29tbW9uLlVJU3RyaW5nKCclLjFmXHhhMG1zJyx0aW1lKTtjb25zdCBpbnRlbnNpdHk9TnVtYmVyLmNvbnN0cmFpbihNYXRoLmxvZzEwKDErMip0aW1lKS81LDAuMDIsMSk7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0ZXh0LWVkaXRvci1saW5lLW1hcmtlci1wZXJmb3JtYW5jZScpO2VsZW1lbnQudGV4dENvbnRlbnQ9dGV4dDtlbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcj1gaHNsYSg0NCwgMTAwJSwgNTAlLCAke2ludGVuc2l0eS50b0ZpeGVkKDMpfSlgO3RleHRFZGl0b3Iuc2V0R3V0dGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uLnJhbmdlKCkuc3RhcnRMaW5lLGd1dHRlclR5cGUsZWxlbWVudCk7fX19O1BlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLkxpbmVEZWNvcmF0b3IudHlwZT0ncGVyZm9ybWFuY2UnOztQZXJmVUkudWlMYWJlbEZvck5ldHdvcmtQcmlvcml0eT1mdW5jdGlvbihwcmlvcml0eSl7cmV0dXJuIFBlcmZVSS5fcHJpb3JpdHlVSUxhYmVsTWFwKCkuZ2V0KHByaW9yaXR5KXx8Jyc7fTtQZXJmVUkudWlMYWJlbFRvTmV0d29ya1ByaW9yaXR5PWZ1bmN0aW9uKHByaW9yaXR5TGFiZWwpe2lmKCFQZXJmVUkuX3VpTGFiZWxUb1ByaW9yaXR5TWFwSW5zdGFuY2Upe1BlcmZVSS5fdWlMYWJlbFRvUHJpb3JpdHlNYXBJbnN0YW5jZT1uZXcgTWFwKCk7UGVyZlVJLl9wcmlvcml0eVVJTGFiZWxNYXAoKS5mb3JFYWNoKCh2YWx1ZSxrZXkpPT5QZXJmVUkuX3VpTGFiZWxUb1ByaW9yaXR5TWFwSW5zdGFuY2Uuc2V0KHZhbHVlLGtleSkpO30KcmV0dXJuIFBlcmZVSS5fdWlMYWJlbFRvUHJpb3JpdHlNYXBJbnN0YW5jZS5nZXQocHJpb3JpdHlMYWJlbCl8fCcnO307UGVyZlVJLl9wcmlvcml0eVVJTGFiZWxNYXA9ZnVuY3Rpb24oKXtpZihQZXJmVUkuX3ByaW9yaXR5VUlMYWJlbE1hcEluc3RhbmNlKQpyZXR1cm4gUGVyZlVJLl9wcmlvcml0eVVJTGFiZWxNYXBJbnN0YW5jZTtjb25zdCBtYXA9bmV3IE1hcCgpO21hcC5zZXQoUHJvdG9jb2wuTmV0d29yay5SZXNvdXJjZVByaW9yaXR5LlZlcnlMb3csQ29tbW9uLlVJU3RyaW5nKCdMb3dlc3QnKSk7bWFwLnNldChQcm90b2NvbC5OZXR3b3JrLlJlc291cmNlUHJpb3JpdHkuTG93LENvbW1vbi5VSVN0cmluZygnTG93JykpO21hcC5zZXQoUHJvdG9jb2wuTmV0d29yay5SZXNvdXJjZVByaW9yaXR5Lk1lZGl1bSxDb21tb24uVUlTdHJpbmcoJ01lZGl1bScpKTttYXAuc2V0KFByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eS5IaWdoLENvbW1vbi5VSVN0cmluZygnSGlnaCcpKTttYXAuc2V0KFByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eS5WZXJ5SGlnaCxDb21tb24uVUlTdHJpbmcoJ0hpZ2hlc3QnKSk7UGVyZlVJLl9wcmlvcml0eVVJTGFiZWxNYXBJbnN0YW5jZT1tYXA7cmV0dXJuIG1hcDt9O1BlcmZVSS5uZXR3b3JrUHJpb3JpdHlXZWlnaHQ9ZnVuY3Rpb24ocHJpb3JpdHkpe2lmKCFQZXJmVUkuX25ldHdvcmtQcmlvcml0eVdlaWdodHMpe2NvbnN0IHByaW9yaXR5TWFwPW5ldyBNYXAoKTtwcmlvcml0eU1hcC5zZXQoUHJvdG9jb2wuTmV0d29yay5SZXNvdXJjZVByaW9yaXR5LlZlcnlMb3csMSk7cHJpb3JpdHlNYXAuc2V0KFByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eS5Mb3csMik7cHJpb3JpdHlNYXAuc2V0KFByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eS5NZWRpdW0sMyk7cHJpb3JpdHlNYXAuc2V0KFByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eS5IaWdoLDQpO3ByaW9yaXR5TWFwLnNldChQcm90b2NvbC5OZXR3b3JrLlJlc291cmNlUHJpb3JpdHkuVmVyeUhpZ2gsNSk7UGVyZlVJLl9uZXR3b3JrUHJpb3JpdHlXZWlnaHRzPXByaW9yaXR5TWFwO30KcmV0dXJuIFBlcmZVSS5fbmV0d29ya1ByaW9yaXR5V2VpZ2h0cy5nZXQocHJpb3JpdHkpfHwwO307O1BlcmZVSS5PdmVydmlld0dyaWQ9Y2xhc3N7Y29uc3RydWN0b3IocHJlZml4KXt0aGlzLmVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5lbGVtZW50LmlkPXByZWZpeCsnLW92ZXJ2aWV3LWNvbnRhaW5lcic7dGhpcy5fZ3JpZD1uZXcgUGVyZlVJLlRpbWVsaW5lR3JpZCgpO3RoaXMuX2dyaWQuZWxlbWVudC5pZD1wcmVmaXgrJy1vdmVydmlldy1ncmlkJzt0aGlzLl9ncmlkLnNldFNjcm9sbFRvcCgwKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZ3JpZC5lbGVtZW50KTt0aGlzLl93aW5kb3c9bmV3IFBlcmZVSS5PdmVydmlld0dyaWQuV2luZG93KHRoaXMuZWxlbWVudCx0aGlzLl9ncmlkLmRpdmlkZXJzTGFiZWxCYXJFbGVtZW50KTt9CmNsaWVudFdpZHRoKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jbGllbnRXaWR0aDt9CnVwZGF0ZURpdmlkZXJzKGNhbGN1bGF0b3Ipe3RoaXMuX2dyaWQudXBkYXRlRGl2aWRlcnMoY2FsY3VsYXRvcik7fQphZGRFdmVudERpdmlkZXJzKGRpdmlkZXJzKXt0aGlzLl9ncmlkLmFkZEV2ZW50RGl2aWRlcnMoZGl2aWRlcnMpO30KcmVtb3ZlRXZlbnREaXZpZGVycygpe3RoaXMuX2dyaWQucmVtb3ZlRXZlbnREaXZpZGVycygpO30KcmVzZXQoKXt0aGlzLl93aW5kb3cucmVzZXQoKTt9CndpbmRvd0xlZnQoKXtyZXR1cm4gdGhpcy5fd2luZG93LndpbmRvd0xlZnQ7fQp3aW5kb3dSaWdodCgpe3JldHVybiB0aGlzLl93aW5kb3cud2luZG93UmlnaHQ7fQpzZXRXaW5kb3cobGVmdCxyaWdodCl7dGhpcy5fd2luZG93Ll9zZXRXaW5kb3cobGVmdCxyaWdodCk7fQphZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXtyZXR1cm4gdGhpcy5fd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3QpO30Kc2V0Q2xpY2tIYW5kbGVyKGNsaWNrSGFuZGxlcil7dGhpcy5fd2luZG93LnNldENsaWNrSGFuZGxlcihjbGlja0hhbmRsZXIpO30Kem9vbSh6b29tRmFjdG9yLHJlZmVyZW5jZVBvaW50KXt0aGlzLl93aW5kb3cuX3pvb20oem9vbUZhY3RvcixyZWZlcmVuY2VQb2ludCk7fQpzZXRSZXNpemVFbmFibGVkKGVuYWJsZWQpe3RoaXMuX3dpbmRvdy5zZXRFbmFibGVkKGVuYWJsZWQpO319O1BlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemU9MTQ7UGVyZlVJLk92ZXJ2aWV3R3JpZC5XaW5kb3dTY3JvbGxTcGVlZEZhY3Rvcj0uMztQZXJmVUkuT3ZlcnZpZXdHcmlkLlJlc2l6ZXJPZmZzZXQ9My41O1BlcmZVSS5PdmVydmlld0dyaWQuV2luZG93PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihwYXJlbnRFbGVtZW50LGRpdmlkZXJzTGFiZWxCYXJFbGVtZW50KXtzdXBlcigpO3RoaXMuX3BhcmVudEVsZW1lbnQ9cGFyZW50RWxlbWVudDtVSS5pbnN0YWxsRHJhZ0hhbmRsZSh0aGlzLl9wYXJlbnRFbGVtZW50LHRoaXMuX3N0YXJ0V2luZG93U2VsZWN0b3JEcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX3dpbmRvd1NlbGVjdG9yRHJhZ2dpbmcuYmluZCh0aGlzKSx0aGlzLl9lbmRXaW5kb3dTZWxlY3RvckRyYWdnaW5nLmJpbmQodGhpcyksJ3RleHQnLG51bGwpO2lmKGRpdmlkZXJzTGFiZWxCYXJFbGVtZW50KXtVSS5pbnN0YWxsRHJhZ0hhbmRsZShkaXZpZGVyc0xhYmVsQmFyRWxlbWVudCx0aGlzLl9zdGFydFdpbmRvd0RyYWdnaW5nLmJpbmQodGhpcyksdGhpcy5fd2luZG93RHJhZ2dpbmcuYmluZCh0aGlzKSxudWxsLCctd2Via2l0LWdyYWJiaW5nJywnLXdlYmtpdC1ncmFiJyk7fQp0aGlzLl9wYXJlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLHRoaXMuX29uTW91c2VXaGVlbC5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX3BhcmVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX3Jlc2l6ZVdpbmRvd01heGltdW0uYmluZCh0aGlzKSx0cnVlKTtVSS5hcHBlbmRTdHlsZSh0aGlzLl9wYXJlbnRFbGVtZW50LCdwZXJmX3VpL292ZXJ2aWV3R3JpZC5jc3MnKTt0aGlzLl9sZWZ0UmVzaXplRWxlbWVudD1wYXJlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdvdmVydmlldy1ncmlkLXdpbmRvdy1yZXNpemVyJyk7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5fbGVmdFJlc2l6ZUVsZW1lbnQsdGhpcy5fcmVzaXplckVsZW1lbnRTdGFydERyYWdnaW5nLmJpbmQodGhpcyksdGhpcy5fbGVmdFJlc2l6ZUVsZW1lbnREcmFnZ2luZy5iaW5kKHRoaXMpLG51bGwsJ2V3LXJlc2l6ZScpO3RoaXMuX3JpZ2h0UmVzaXplRWxlbWVudD1wYXJlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdvdmVydmlldy1ncmlkLXdpbmRvdy1yZXNpemVyJyk7VUkuaW5zdGFsbERyYWdIYW5kbGUodGhpcy5fcmlnaHRSZXNpemVFbGVtZW50LHRoaXMuX3Jlc2l6ZXJFbGVtZW50U3RhcnREcmFnZ2luZy5iaW5kKHRoaXMpLHRoaXMuX3JpZ2h0UmVzaXplRWxlbWVudERyYWdnaW5nLmJpbmQodGhpcyksbnVsbCwnZXctcmVzaXplJyk7dGhpcy5fbGVmdEN1cnRhaW5FbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3dpbmRvdy1jdXJ0YWluLWxlZnQnKTt0aGlzLl9yaWdodEN1cnRhaW5FbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3dpbmRvdy1jdXJ0YWluLXJpZ2h0Jyk7dGhpcy5yZXNldCgpO30KcmVzZXQoKXt0aGlzLndpbmRvd0xlZnQ9MC4wO3RoaXMud2luZG93UmlnaHQ9MS4wO3RoaXMuc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl91cGRhdGVDdXJ0YWlucygpO30Kc2V0RW5hYmxlZChlbmFibGVkKXt0aGlzLl9lbmFibGVkPWVuYWJsZWQ7fQpzZXRDbGlja0hhbmRsZXIoY2xpY2tIYW5kbGVyKXt0aGlzLl9jbGlja0hhbmRsZXI9Y2xpY2tIYW5kbGVyO30KX3Jlc2l6ZXJFbGVtZW50U3RhcnREcmFnZ2luZyhldmVudCl7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybiBmYWxzZTt0aGlzLl9yZXNpemVyUGFyZW50T2Zmc2V0TGVmdD1ldmVudC5wYWdlWC1ldmVudC5vZmZzZXRYLWV2ZW50LnRhcmdldC5vZmZzZXRMZWZ0O2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JldHVybiB0cnVlO30KX2xlZnRSZXNpemVFbGVtZW50RHJhZ2dpbmcoZXZlbnQpe3RoaXMuX3Jlc2l6ZVdpbmRvd0xlZnQoZXZlbnQucGFnZVgtdGhpcy5fcmVzaXplclBhcmVudE9mZnNldExlZnQpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fQpfcmlnaHRSZXNpemVFbGVtZW50RHJhZ2dpbmcoZXZlbnQpe3RoaXMuX3Jlc2l6ZVdpbmRvd1JpZ2h0KGV2ZW50LnBhZ2VYLXRoaXMuX3Jlc2l6ZXJQYXJlbnRPZmZzZXRMZWZ0KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO30KX3N0YXJ0V2luZG93U2VsZWN0b3JEcmFnZ2luZyhldmVudCl7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybiBmYWxzZTt0aGlzLl9vZmZzZXRMZWZ0PXRoaXMuX3BhcmVudEVsZW1lbnQudG90YWxPZmZzZXRMZWZ0KCk7Y29uc3QgcG9zaXRpb249ZXZlbnQueC10aGlzLl9vZmZzZXRMZWZ0O3RoaXMuX292ZXJ2aWV3V2luZG93U2VsZWN0b3I9bmV3IFBlcmZVSS5PdmVydmlld0dyaWQuV2luZG93U2VsZWN0b3IodGhpcy5fcGFyZW50RWxlbWVudCxwb3NpdGlvbik7cmV0dXJuIHRydWU7fQpfd2luZG93U2VsZWN0b3JEcmFnZ2luZyhldmVudCl7dGhpcy5fb3ZlcnZpZXdXaW5kb3dTZWxlY3Rvci5fdXBkYXRlUG9zaXRpb24oZXZlbnQueC10aGlzLl9vZmZzZXRMZWZ0KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO30KX2VuZFdpbmRvd1NlbGVjdG9yRHJhZ2dpbmcoZXZlbnQpe2NvbnN0IHdpbmRvdz10aGlzLl9vdmVydmlld1dpbmRvd1NlbGVjdG9yLl9jbG9zZShldmVudC54LXRoaXMuX29mZnNldExlZnQpO2RlbGV0ZSB0aGlzLl9vdmVydmlld1dpbmRvd1NlbGVjdG9yO2NvbnN0IGNsaWNrVGhyZXNob2xkPTM7aWYod2luZG93LmVuZC13aW5kb3cuc3RhcnQ8Y2xpY2tUaHJlc2hvbGQpe2lmKHRoaXMuX2NsaWNrSGFuZGxlciYmdGhpcy5fY2xpY2tIYW5kbGVyLmNhbGwobnVsbCxldmVudCkpCnJldHVybjtjb25zdCBtaWRkbGU9d2luZG93LmVuZDt3aW5kb3cuc3RhcnQ9TWF0aC5tYXgoMCxtaWRkbGUtUGVyZlVJLk92ZXJ2aWV3R3JpZC5NaW5TZWxlY3RhYmxlU2l6ZS8yKTt3aW5kb3cuZW5kPU1hdGgubWluKHRoaXMuX3BhcmVudEVsZW1lbnQuY2xpZW50V2lkdGgsbWlkZGxlK1BlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemUvMik7fWVsc2UgaWYod2luZG93LmVuZC13aW5kb3cuc3RhcnQ8UGVyZlVJLk92ZXJ2aWV3R3JpZC5NaW5TZWxlY3RhYmxlU2l6ZSl7aWYodGhpcy5fcGFyZW50RWxlbWVudC5jbGllbnRXaWR0aC13aW5kb3cuZW5kPlBlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemUpCndpbmRvdy5lbmQ9d2luZG93LnN0YXJ0K1BlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemU7ZWxzZQp3aW5kb3cuc3RhcnQ9d2luZG93LmVuZC1QZXJmVUkuT3ZlcnZpZXdHcmlkLk1pblNlbGVjdGFibGVTaXplO30KdGhpcy5fc2V0V2luZG93UG9zaXRpb24od2luZG93LnN0YXJ0LHdpbmRvdy5lbmQpO30KX3N0YXJ0V2luZG93RHJhZ2dpbmcoZXZlbnQpe3RoaXMuX2RyYWdTdGFydFBvaW50PWV2ZW50LnBhZ2VYO3RoaXMuX2RyYWdTdGFydExlZnQ9dGhpcy53aW5kb3dMZWZ0O3RoaXMuX2RyYWdTdGFydFJpZ2h0PXRoaXMud2luZG93UmlnaHQ7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmV0dXJuIHRydWU7fQpfd2luZG93RHJhZ2dpbmcoZXZlbnQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7bGV0IGRlbHRhPShldmVudC5wYWdlWC10aGlzLl9kcmFnU3RhcnRQb2ludCkvdGhpcy5fcGFyZW50RWxlbWVudC5jbGllbnRXaWR0aDtpZih0aGlzLl9kcmFnU3RhcnRMZWZ0K2RlbHRhPDApCmRlbHRhPS10aGlzLl9kcmFnU3RhcnRMZWZ0O2lmKHRoaXMuX2RyYWdTdGFydFJpZ2h0K2RlbHRhPjEpCmRlbHRhPTEtdGhpcy5fZHJhZ1N0YXJ0UmlnaHQ7dGhpcy5fc2V0V2luZG93KHRoaXMuX2RyYWdTdGFydExlZnQrZGVsdGEsdGhpcy5fZHJhZ1N0YXJ0UmlnaHQrZGVsdGEpO30KX3Jlc2l6ZVdpbmRvd0xlZnQoc3RhcnQpe2lmKHN0YXJ0PDEwKQpzdGFydD0wO2Vsc2UgaWYoc3RhcnQ+dGhpcy5fcmlnaHRSZXNpemVFbGVtZW50Lm9mZnNldExlZnQtNCkKc3RhcnQ9dGhpcy5fcmlnaHRSZXNpemVFbGVtZW50Lm9mZnNldExlZnQtNDt0aGlzLl9zZXRXaW5kb3dQb3NpdGlvbihzdGFydCxudWxsKTt9Cl9yZXNpemVXaW5kb3dSaWdodChlbmQpe2lmKGVuZD50aGlzLl9wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoLTEwKQplbmQ9dGhpcy5fcGFyZW50RWxlbWVudC5jbGllbnRXaWR0aDtlbHNlIGlmKGVuZDx0aGlzLl9sZWZ0UmVzaXplRWxlbWVudC5vZmZzZXRMZWZ0K1BlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemUpCmVuZD10aGlzLl9sZWZ0UmVzaXplRWxlbWVudC5vZmZzZXRMZWZ0K1BlcmZVSS5PdmVydmlld0dyaWQuTWluU2VsZWN0YWJsZVNpemU7dGhpcy5fc2V0V2luZG93UG9zaXRpb24obnVsbCxlbmQpO30KX3Jlc2l6ZVdpbmRvd01heGltdW0oKXt0aGlzLl9zZXRXaW5kb3dQb3NpdGlvbigwLHRoaXMuX3BhcmVudEVsZW1lbnQuY2xpZW50V2lkdGgpO30KX3NldFdpbmRvdyh3aW5kb3dMZWZ0LHdpbmRvd1JpZ2h0KXt0aGlzLndpbmRvd0xlZnQ9d2luZG93TGVmdDt0aGlzLndpbmRvd1JpZ2h0PXdpbmRvd1JpZ2h0O3RoaXMuX3VwZGF0ZUN1cnRhaW5zKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyZlVJLk92ZXJ2aWV3R3JpZC5FdmVudHMuV2luZG93Q2hhbmdlZCk7fQpfdXBkYXRlQ3VydGFpbnMoKXtsZXQgbGVmdD10aGlzLndpbmRvd0xlZnQ7bGV0IHJpZ2h0PXRoaXMud2luZG93UmlnaHQ7Y29uc3Qgd2lkdGg9cmlnaHQtbGVmdDtjb25zdCB3aWR0aEluUGl4ZWxzPXdpZHRoKnRoaXMuX3BhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7Y29uc3QgbWluV2lkdGhJblBpeGVscz1QZXJmVUkuT3ZlcnZpZXdHcmlkLk1pblNlbGVjdGFibGVTaXplLzI7aWYod2lkdGhJblBpeGVsczxtaW5XaWR0aEluUGl4ZWxzKXtjb25zdCBmYWN0b3I9bWluV2lkdGhJblBpeGVscy93aWR0aEluUGl4ZWxzO2xlZnQ9KCh0aGlzLndpbmRvd1JpZ2h0K3RoaXMud2luZG93TGVmdCktd2lkdGgqZmFjdG9yKS8yO3JpZ2h0PSgodGhpcy53aW5kb3dSaWdodCt0aGlzLndpbmRvd0xlZnQpK3dpZHRoKmZhY3RvcikvMjt9CnRoaXMuX2xlZnRSZXNpemVFbGVtZW50LnN0eWxlLmxlZnQ9KDEwMCpsZWZ0KS50b0ZpeGVkKDIpKyclJzt0aGlzLl9yaWdodFJlc2l6ZUVsZW1lbnQuc3R5bGUubGVmdD0oMTAwKnJpZ2h0KS50b0ZpeGVkKDIpKyclJzt0aGlzLl9sZWZ0Q3VydGFpbkVsZW1lbnQuc3R5bGUud2lkdGg9KDEwMCpsZWZ0KS50b0ZpeGVkKDIpKyclJzt0aGlzLl9yaWdodEN1cnRhaW5FbGVtZW50LnN0eWxlLndpZHRoPSgxMDAqKDEtcmlnaHQpKS50b0ZpeGVkKDIpKyclJzt9Cl9zZXRXaW5kb3dQb3NpdGlvbihzdGFydCxlbmQpe2NvbnN0IGNsaWVudFdpZHRoPXRoaXMuX3BhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7Y29uc3Qgd2luZG93TGVmdD10eXBlb2Ygc3RhcnQ9PT0nbnVtYmVyJz9zdGFydC9jbGllbnRXaWR0aDp0aGlzLndpbmRvd0xlZnQ7Y29uc3Qgd2luZG93UmlnaHQ9dHlwZW9mIGVuZD09PSdudW1iZXInP2VuZC9jbGllbnRXaWR0aDp0aGlzLndpbmRvd1JpZ2h0O3RoaXMuX3NldFdpbmRvdyh3aW5kb3dMZWZ0LHdpbmRvd1JpZ2h0KTt9Cl9vbk1vdXNlV2hlZWwoZXZlbnQpe2lmKCF0aGlzLl9lbmFibGVkKQpyZXR1cm47aWYodHlwZW9mIGV2ZW50LndoZWVsRGVsdGFZPT09J251bWJlcicmJmV2ZW50LndoZWVsRGVsdGFZKXtjb25zdCB6b29tRmFjdG9yPTEuMTtjb25zdCBtb3VzZVdoZWVsWm9vbVNwZWVkPTEvMTIwO2NvbnN0IHJlZmVyZW5jZT1ldmVudC5vZmZzZXRYL2V2ZW50LnRhcmdldC5jbGllbnRXaWR0aDt0aGlzLl96b29tKE1hdGgucG93KHpvb21GYWN0b3IsLWV2ZW50LndoZWVsRGVsdGFZKm1vdXNlV2hlZWxab29tU3BlZWQpLHJlZmVyZW5jZSk7fQppZih0eXBlb2YgZXZlbnQud2hlZWxEZWx0YVg9PT0nbnVtYmVyJyYmZXZlbnQud2hlZWxEZWx0YVgpe2xldCBvZmZzZXQ9TWF0aC5yb3VuZChldmVudC53aGVlbERlbHRhWCpQZXJmVUkuT3ZlcnZpZXdHcmlkLldpbmRvd1Njcm9sbFNwZWVkRmFjdG9yKTtjb25zdCB3aW5kb3dMZWZ0PXRoaXMuX2xlZnRSZXNpemVFbGVtZW50Lm9mZnNldExlZnQrUGVyZlVJLk92ZXJ2aWV3R3JpZC5SZXNpemVyT2Zmc2V0O2NvbnN0IHdpbmRvd1JpZ2h0PXRoaXMuX3JpZ2h0UmVzaXplRWxlbWVudC5vZmZzZXRMZWZ0K1BlcmZVSS5PdmVydmlld0dyaWQuUmVzaXplck9mZnNldDtpZih3aW5kb3dMZWZ0LW9mZnNldDwwKQpvZmZzZXQ9d2luZG93TGVmdDtpZih3aW5kb3dSaWdodC1vZmZzZXQ+dGhpcy5fcGFyZW50RWxlbWVudC5jbGllbnRXaWR0aCkKb2Zmc2V0PXdpbmRvd1JpZ2h0LXRoaXMuX3BhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7dGhpcy5fc2V0V2luZG93UG9zaXRpb24od2luZG93TGVmdC1vZmZzZXQsd2luZG93UmlnaHQtb2Zmc2V0KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO319Cl96b29tKGZhY3RvcixyZWZlcmVuY2Upe2xldCBsZWZ0PXRoaXMud2luZG93TGVmdDtsZXQgcmlnaHQ9dGhpcy53aW5kb3dSaWdodDtjb25zdCB3aW5kb3dTaXplPXJpZ2h0LWxlZnQ7bGV0IG5ld1dpbmRvd1NpemU9ZmFjdG9yKndpbmRvd1NpemU7aWYobmV3V2luZG93U2l6ZT4xKXtuZXdXaW5kb3dTaXplPTE7ZmFjdG9yPW5ld1dpbmRvd1NpemUvd2luZG93U2l6ZTt9CmxlZnQ9cmVmZXJlbmNlKyhsZWZ0LXJlZmVyZW5jZSkqZmFjdG9yO2xlZnQ9TnVtYmVyLmNvbnN0cmFpbihsZWZ0LDAsMS1uZXdXaW5kb3dTaXplKTtyaWdodD1yZWZlcmVuY2UrKHJpZ2h0LXJlZmVyZW5jZSkqZmFjdG9yO3JpZ2h0PU51bWJlci5jb25zdHJhaW4ocmlnaHQsbmV3V2luZG93U2l6ZSwxKTt0aGlzLl9zZXRXaW5kb3cobGVmdCxyaWdodCk7fX07UGVyZlVJLk92ZXJ2aWV3R3JpZC5FdmVudHM9e1dpbmRvd0NoYW5nZWQ6U3ltYm9sKCdXaW5kb3dDaGFuZ2VkJyl9O1BlcmZVSS5PdmVydmlld0dyaWQuV2luZG93U2VsZWN0b3I9Y2xhc3N7Y29uc3RydWN0b3IocGFyZW50LHBvc2l0aW9uKXt0aGlzLl9zdGFydFBvc2l0aW9uPXBvc2l0aW9uO3RoaXMuX3dpZHRoPXBhcmVudC5vZmZzZXRXaWR0aDt0aGlzLl93aW5kb3dTZWxlY3Rvcj1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLl93aW5kb3dTZWxlY3Rvci5jbGFzc05hbWU9J292ZXJ2aWV3LWdyaWQtd2luZG93LXNlbGVjdG9yJzt0aGlzLl93aW5kb3dTZWxlY3Rvci5zdHlsZS5sZWZ0PXRoaXMuX3N0YXJ0UG9zaXRpb24rJ3B4Jzt0aGlzLl93aW5kb3dTZWxlY3Rvci5zdHlsZS5yaWdodD10aGlzLl93aWR0aC10aGlzLl9zdGFydFBvc2l0aW9uKydweCc7cGFyZW50LmFwcGVuZENoaWxkKHRoaXMuX3dpbmRvd1NlbGVjdG9yKTt9Cl9jbG9zZShwb3NpdGlvbil7cG9zaXRpb249TWF0aC5tYXgoMCxNYXRoLm1pbihwb3NpdGlvbix0aGlzLl93aWR0aCkpO3RoaXMuX3dpbmRvd1NlbGVjdG9yLnJlbW92ZSgpO3JldHVybiB0aGlzLl9zdGFydFBvc2l0aW9uPHBvc2l0aW9uP3tzdGFydDp0aGlzLl9zdGFydFBvc2l0aW9uLGVuZDpwb3NpdGlvbn06e3N0YXJ0OnBvc2l0aW9uLGVuZDp0aGlzLl9zdGFydFBvc2l0aW9ufTt9Cl91cGRhdGVQb3NpdGlvbihwb3NpdGlvbil7cG9zaXRpb249TWF0aC5tYXgoMCxNYXRoLm1pbihwb3NpdGlvbix0aGlzLl93aWR0aCkpO2lmKHBvc2l0aW9uPHRoaXMuX3N0YXJ0UG9zaXRpb24pe3RoaXMuX3dpbmRvd1NlbGVjdG9yLnN0eWxlLmxlZnQ9cG9zaXRpb24rJ3B4Jzt0aGlzLl93aW5kb3dTZWxlY3Rvci5zdHlsZS5yaWdodD10aGlzLl93aWR0aC10aGlzLl9zdGFydFBvc2l0aW9uKydweCc7fWVsc2V7dGhpcy5fd2luZG93U2VsZWN0b3Iuc3R5bGUubGVmdD10aGlzLl9zdGFydFBvc2l0aW9uKydweCc7dGhpcy5fd2luZG93U2VsZWN0b3Iuc3R5bGUucmlnaHQ9dGhpcy5fd2lkdGgtcG9zaXRpb24rJ3B4Jzt9fX07O1BlcmZVSS5QaWVDaGFydD1jbGFzc3tjb25zdHJ1Y3RvcihzaXplLGZvcm1hdHRlcixzaG93VG90YWwpe3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLl9zaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLmVsZW1lbnQsJ3BlcmZfdWkvcGllQ2hhcnQuY3NzJyk7Y29uc3Qgcm9vdD10aGlzLl9zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdyb290Jyk7Y29uc3Qgc3ZnPXRoaXMuX2NyZWF0ZVNWR0NoaWxkKHJvb3QsJ3N2ZycpO3RoaXMuX2dyb3VwPXRoaXMuX2NyZWF0ZVNWR0NoaWxkKHN2ZywnZycpO3RoaXMuX2lubmVyUj0wLjYxODtjb25zdCBzdHJva2VXaWR0aD0xL3NpemU7bGV0IGNpcmNsZT10aGlzLl9jcmVhdGVTVkdDaGlsZCh0aGlzLl9ncm91cCwnY2lyY2xlJyk7Y2lyY2xlLnNldEF0dHJpYnV0ZSgncicsMSk7Y2lyY2xlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywnaHNsKDAsIDAlLCA4MCUpJyk7Y2lyY2xlLnNldEF0dHJpYnV0ZSgnZmlsbCcsJ3RyYW5zcGFyZW50Jyk7Y2lyY2xlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyxzdHJva2VXaWR0aCk7Y2lyY2xlPXRoaXMuX2NyZWF0ZVNWR0NoaWxkKHRoaXMuX2dyb3VwLCdjaXJjbGUnKTtjaXJjbGUuc2V0QXR0cmlidXRlKCdyJyx0aGlzLl9pbm5lclIpO2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsJ2hzbCgwLCAwJSwgODAlKScpO2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCd0cmFuc3BhcmVudCcpO2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsc3Ryb2tlV2lkdGgpO3RoaXMuX2ZvcmVncm91bmRFbGVtZW50PXJvb3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BpZS1jaGFydC1mb3JlZ3JvdW5kJyk7aWYoc2hvd1RvdGFsKQp0aGlzLl90b3RhbEVsZW1lbnQ9dGhpcy5fZm9yZWdyb3VuZEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BpZS1jaGFydC10b3RhbCcpO3RoaXMuX2Zvcm1hdHRlcj1mb3JtYXR0ZXI7dGhpcy5fc2xpY2VzPVtdO3RoaXMuX2xhc3RBbmdsZT0tTWF0aC5QSS8yO3RoaXMuX3NldFNpemUoc2l6ZSk7fQpzZXRUb3RhbCh0b3RhbFZhbHVlKXtmb3IobGV0IGk9MDtpPHRoaXMuX3NsaWNlcy5sZW5ndGg7KytpKQp0aGlzLl9zbGljZXNbaV0ucmVtb3ZlKCk7dGhpcy5fc2xpY2VzPVtdO3RoaXMuX3RvdGFsVmFsdWU9dG90YWxWYWx1ZTt0aGlzLl9sYXN0QW5nbGU9LU1hdGguUEkvMjtsZXQgdG90YWxTdHJpbmc7aWYodG90YWxWYWx1ZSkKdG90YWxTdHJpbmc9dGhpcy5fZm9ybWF0dGVyP3RoaXMuX2Zvcm1hdHRlcih0b3RhbFZhbHVlKTp0b3RhbFZhbHVlO2Vsc2UKdG90YWxTdHJpbmc9Jyc7aWYodGhpcy5fdG90YWxFbGVtZW50KQp0aGlzLl90b3RhbEVsZW1lbnQudGV4dENvbnRlbnQ9dG90YWxTdHJpbmc7fQpfc2V0U2l6ZSh2YWx1ZSl7dGhpcy5fZ3JvdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCdzY2FsZSgnKyh2YWx1ZS8yKSsnKSB0cmFuc2xhdGUoMSwgMSkgc2NhbGUoMC45OSwgMC45OSknKTtjb25zdCBzaXplPXZhbHVlKydweCc7dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPXNpemU7dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD1zaXplO30KYWRkU2xpY2UodmFsdWUsY29sb3Ipe2xldCBzbGljZUFuZ2xlPXZhbHVlL3RoaXMuX3RvdGFsVmFsdWUqMipNYXRoLlBJO2lmKCFpc0Zpbml0ZShzbGljZUFuZ2xlKSkKcmV0dXJuO3NsaWNlQW5nbGU9TWF0aC5taW4oc2xpY2VBbmdsZSwyKk1hdGguUEkqMC45OTk5KTtjb25zdCBwYXRoPXRoaXMuX2NyZWF0ZVNWR0NoaWxkKHRoaXMuX2dyb3VwLCdwYXRoJyk7Y29uc3QgeDE9TWF0aC5jb3ModGhpcy5fbGFzdEFuZ2xlKTtjb25zdCB5MT1NYXRoLnNpbih0aGlzLl9sYXN0QW5nbGUpO3RoaXMuX2xhc3RBbmdsZSs9c2xpY2VBbmdsZTtjb25zdCB4Mj1NYXRoLmNvcyh0aGlzLl9sYXN0QW5nbGUpO2NvbnN0IHkyPU1hdGguc2luKHRoaXMuX2xhc3RBbmdsZSk7Y29uc3QgcjI9dGhpcy5faW5uZXJSO2NvbnN0IHgzPXgyKnIyO2NvbnN0IHkzPXkyKnIyO2NvbnN0IHg0PXgxKnIyO2NvbnN0IHk0PXkxKnIyO2NvbnN0IGxhcmdlQXJjPXNsaWNlQW5nbGU+TWF0aC5QST8xOjA7cGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLGBNJHt4MX0sJHt5MX0gQTEsMSwwLCR7bGFyZ2VBcmN9LDEsJHt4Mn0sJHt5Mn0gTCR7eDN9LCR7eTN9IEEke3IyfSwke3IyfSwwLCR7bGFyZ2VBcmN9LDAsJHt4NH0sJHt5NH0gWmApO3BhdGguc2V0QXR0cmlidXRlKCdmaWxsJyxjb2xvcik7dGhpcy5fc2xpY2VzLnB1c2gocGF0aCk7fQpfY3JlYXRlU1ZHQ2hpbGQocGFyZW50LGNoaWxkVHlwZSl7Y29uc3QgY2hpbGQ9cGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsY2hpbGRUeXBlKTtwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO3JldHVybiBjaGlsZDt9fTs7UGVyZlVJLlRpbWVsaW5lR3JpZD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtVSS5hcHBlbmRTdHlsZSh0aGlzLmVsZW1lbnQsJ3BlcmZfdWkvdGltZWxpbmVHcmlkLmNzcycpO3RoaXMuX2RpdmlkZXJzRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Jlc291cmNlcy1kaXZpZGVycycpO3RoaXMuX2dyaWRIZWFkZXJFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO3RoaXMuX2dyaWRIZWFkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RpbWVsaW5lLWdyaWQtaGVhZGVyJyk7dGhpcy5fZXZlbnREaXZpZGVyc0VsZW1lbnQ9dGhpcy5fZ3JpZEhlYWRlckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Jlc291cmNlcy1ldmVudC1kaXZpZGVycycpO3RoaXMuX2RpdmlkZXJzTGFiZWxCYXJFbGVtZW50PXRoaXMuX2dyaWRIZWFkZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdyZXNvdXJjZXMtZGl2aWRlcnMtbGFiZWwtYmFyJyk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2dyaWRIZWFkZXJFbGVtZW50KTt9CnN0YXRpYyBjYWxjdWxhdGVHcmlkT2Zmc2V0cyhjYWxjdWxhdG9yLGZyZWVab25lQXRMZWZ0KXtjb25zdCBtaW5HcmlkU2xpY2VQeD02NDtjb25zdCBjbGllbnRXaWR0aD1jYWxjdWxhdG9yLmNvbXB1dGVQb3NpdGlvbihjYWxjdWxhdG9yLm1heGltdW1Cb3VuZGFyeSgpKTtsZXQgZGl2aWRlcnNDb3VudD1jbGllbnRXaWR0aC9taW5HcmlkU2xpY2VQeDtsZXQgZ3JpZFNsaWNlVGltZT1jYWxjdWxhdG9yLmJvdW5kYXJ5U3BhbigpL2RpdmlkZXJzQ291bnQ7Y29uc3QgcGl4ZWxzUGVyVGltZT1jbGllbnRXaWR0aC9jYWxjdWxhdG9yLmJvdW5kYXJ5U3BhbigpO2NvbnN0IGxvZ0dyaWRTbGljZVRpbWU9TWF0aC5jZWlsKE1hdGgubG9nKGdyaWRTbGljZVRpbWUpL01hdGguTE4xMCk7Z3JpZFNsaWNlVGltZT1NYXRoLnBvdygxMCxsb2dHcmlkU2xpY2VUaW1lKTtpZihncmlkU2xpY2VUaW1lKnBpeGVsc1BlclRpbWU+PTUqbWluR3JpZFNsaWNlUHgpCmdyaWRTbGljZVRpbWU9Z3JpZFNsaWNlVGltZS81O2lmKGdyaWRTbGljZVRpbWUqcGl4ZWxzUGVyVGltZT49MiptaW5HcmlkU2xpY2VQeCkKZ3JpZFNsaWNlVGltZT1ncmlkU2xpY2VUaW1lLzI7Y29uc3QgZmlyc3REaXZpZGVyVGltZT1NYXRoLmNlaWwoKGNhbGN1bGF0b3IubWluaW11bUJvdW5kYXJ5KCktY2FsY3VsYXRvci56ZXJvVGltZSgpKS9ncmlkU2xpY2VUaW1lKSpncmlkU2xpY2VUaW1lKwpjYWxjdWxhdG9yLnplcm9UaW1lKCk7bGV0IGxhc3REaXZpZGVyVGltZT1jYWxjdWxhdG9yLm1heGltdW1Cb3VuZGFyeSgpO2xhc3REaXZpZGVyVGltZSs9bWluR3JpZFNsaWNlUHgvcGl4ZWxzUGVyVGltZTtkaXZpZGVyc0NvdW50PU1hdGguY2VpbCgobGFzdERpdmlkZXJUaW1lLWZpcnN0RGl2aWRlclRpbWUpL2dyaWRTbGljZVRpbWUpO2lmKCFncmlkU2xpY2VUaW1lKQpkaXZpZGVyc0NvdW50PTA7Y29uc3Qgb2Zmc2V0cz1bXTtmb3IobGV0IGk9MDtpPGRpdmlkZXJzQ291bnQ7KytpKXtjb25zdCB0aW1lPWZpcnN0RGl2aWRlclRpbWUrZ3JpZFNsaWNlVGltZSppO2lmKGNhbGN1bGF0b3IuY29tcHV0ZVBvc2l0aW9uKHRpbWUpPGZyZWVab25lQXRMZWZ0KQpjb250aW51ZTtvZmZzZXRzLnB1c2goe3Bvc2l0aW9uOk1hdGguZmxvb3IoY2FsY3VsYXRvci5jb21wdXRlUG9zaXRpb24odGltZSkpLHRpbWU6dGltZX0pO30KcmV0dXJue29mZnNldHM6b2Zmc2V0cyxwcmVjaXNpb246TWF0aC5tYXgoMCwtTWF0aC5mbG9vcihNYXRoLmxvZyhncmlkU2xpY2VUaW1lKjEuMDEpL01hdGguTE4xMCkpfTt9CnN0YXRpYyBkcmF3Q2FudmFzR3JpZChjb250ZXh0LGRpdmlkZXJzRGF0YSl7Y29udGV4dC5zYXZlKCk7Y29udGV4dC5zY2FsZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyx3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7Y29uc3QgaGVpZ2h0PU1hdGguZmxvb3IoY29udGV4dC5jYW52YXMuaGVpZ2h0L3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtjb250ZXh0LnN0cm9rZVN0eWxlPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dCgncmdiYSgwLCAwLCAwLCAwLjEpJyxVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5Gb3JlZ3JvdW5kKTtjb250ZXh0LmxpbmVXaWR0aD0xO2NvbnRleHQudHJhbnNsYXRlKDAuNSwwLjUpO2NvbnRleHQuYmVnaW5QYXRoKCk7Zm9yKGNvbnN0IG9mZnNldEluZm8gb2YgZGl2aWRlcnNEYXRhLm9mZnNldHMpe2NvbnRleHQubW92ZVRvKG9mZnNldEluZm8ucG9zaXRpb24sMCk7Y29udGV4dC5saW5lVG8ob2Zmc2V0SW5mby5wb3NpdGlvbixoZWlnaHQpO30KY29udGV4dC5zdHJva2UoKTtjb250ZXh0LnJlc3RvcmUoKTt9CnN0YXRpYyBkcmF3Q2FudmFzSGVhZGVycyhjb250ZXh0LGRpdmlkZXJzRGF0YSxmb3JtYXRUaW1lRnVuY3Rpb24scGFkZGluZ1RvcCxoZWFkZXJIZWlnaHQsZnJlZVpvbmVBdExlZnQpe2NvbnRleHQuc2F2ZSgpO2NvbnRleHQuc2NhbGUod2luZG93LmRldmljZVBpeGVsUmF0aW8sd2luZG93LmRldmljZVBpeGVsUmF0aW8pO2NvbnN0IHdpZHRoPU1hdGguY2VpbChjb250ZXh0LmNhbnZhcy53aWR0aC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LmZpbGxTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KScsVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7Y29udGV4dC5maWxsUmVjdCgwLDAsd2lkdGgsaGVhZGVySGVpZ2h0KTtjb250ZXh0LmZpbGxTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyMzMzMnLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO2NvbnRleHQudGV4dEJhc2VsaW5lPSdoYW5naW5nJztjb250ZXh0LmZvbnQ9JzExcHggJytIb3N0LmZvbnRGYW1pbHkoKTtjb25zdCBwYWRkaW5nUmlnaHQ9NDtmb3IoY29uc3Qgb2Zmc2V0SW5mbyBvZiBkaXZpZGVyc0RhdGEub2Zmc2V0cyl7Y29uc3QgdGV4dD1mb3JtYXRUaW1lRnVuY3Rpb24ob2Zmc2V0SW5mby50aW1lKTtjb25zdCB0ZXh0V2lkdGg9Y29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtjb25zdCB0ZXh0UG9zaXRpb249b2Zmc2V0SW5mby5wb3NpdGlvbi10ZXh0V2lkdGgtcGFkZGluZ1JpZ2h0O2lmKCFmcmVlWm9uZUF0TGVmdHx8ZnJlZVpvbmVBdExlZnQ8dGV4dFBvc2l0aW9uKQpjb250ZXh0LmZpbGxUZXh0KHRleHQsdGV4dFBvc2l0aW9uLHBhZGRpbmdUb3ApO30KY29udGV4dC5yZXN0b3JlKCk7fQpnZXQgZGl2aWRlcnNFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RpdmlkZXJzRWxlbWVudDt9CmdldCBkaXZpZGVyc0xhYmVsQmFyRWxlbWVudCgpe3JldHVybiB0aGlzLl9kaXZpZGVyc0xhYmVsQmFyRWxlbWVudDt9CnJlbW92ZURpdmlkZXJzKCl7dGhpcy5fZGl2aWRlcnNFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fZGl2aWRlcnNMYWJlbEJhckVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt9CnVwZGF0ZURpdmlkZXJzKGNhbGN1bGF0b3IsZnJlZVpvbmVBdExlZnQpe2NvbnN0IGRpdmlkZXJzRGF0YT1QZXJmVUkuVGltZWxpbmVHcmlkLmNhbGN1bGF0ZUdyaWRPZmZzZXRzKGNhbGN1bGF0b3IsZnJlZVpvbmVBdExlZnQpO2NvbnN0IGRpdmlkZXJPZmZzZXRzPWRpdmlkZXJzRGF0YS5vZmZzZXRzO2NvbnN0IHByZWNpc2lvbj1kaXZpZGVyc0RhdGEucHJlY2lzaW9uO2NvbnN0IGRpdmlkZXJzRWxlbWVudENsaWVudFdpZHRoPXRoaXMuX2RpdmlkZXJzRWxlbWVudC5jbGllbnRXaWR0aDtsZXQgZGl2aWRlcj0odGhpcy5fZGl2aWRlcnNFbGVtZW50LmZpcnN0Q2hpbGQpO2xldCBkaXZpZGVyTGFiZWxCYXI9KHRoaXMuX2RpdmlkZXJzTGFiZWxCYXJFbGVtZW50LmZpcnN0Q2hpbGQpO2ZvcihsZXQgaT0wO2k8ZGl2aWRlck9mZnNldHMubGVuZ3RoOysraSl7aWYoIWRpdmlkZXIpe2RpdmlkZXI9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7ZGl2aWRlci5jbGFzc05hbWU9J3Jlc291cmNlcy1kaXZpZGVyJzt0aGlzLl9kaXZpZGVyc0VsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2aWRlcik7ZGl2aWRlckxhYmVsQmFyPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2RpdmlkZXJMYWJlbEJhci5jbGFzc05hbWU9J3Jlc291cmNlcy1kaXZpZGVyJztjb25zdCBsYWJlbD1jcmVhdGVFbGVtZW50KCdkaXYnKTtsYWJlbC5jbGFzc05hbWU9J3Jlc291cmNlcy1kaXZpZGVyLWxhYmVsJztkaXZpZGVyTGFiZWxCYXIuX2xhYmVsRWxlbWVudD1sYWJlbDtkaXZpZGVyTGFiZWxCYXIuYXBwZW5kQ2hpbGQobGFiZWwpO3RoaXMuX2RpdmlkZXJzTGFiZWxCYXJFbGVtZW50LmFwcGVuZENoaWxkKGRpdmlkZXJMYWJlbEJhcik7fQpjb25zdCB0aW1lPWRpdmlkZXJPZmZzZXRzW2ldLnRpbWU7Y29uc3QgcG9zaXRpb249ZGl2aWRlck9mZnNldHNbaV0ucG9zaXRpb247ZGl2aWRlckxhYmVsQmFyLl9sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQ9Y2FsY3VsYXRvci5mb3JtYXRWYWx1ZSh0aW1lLHByZWNpc2lvbik7Y29uc3QgcGVyY2VudExlZnQ9MTAwKnBvc2l0aW9uL2RpdmlkZXJzRWxlbWVudENsaWVudFdpZHRoO2RpdmlkZXIuc3R5bGUubGVmdD1wZXJjZW50TGVmdCsnJSc7ZGl2aWRlckxhYmVsQmFyLnN0eWxlLmxlZnQ9cGVyY2VudExlZnQrJyUnO2RpdmlkZXI9KGRpdmlkZXIubmV4dFNpYmxpbmcpO2RpdmlkZXJMYWJlbEJhcj0oZGl2aWRlckxhYmVsQmFyLm5leHRTaWJsaW5nKTt9CndoaWxlKGRpdmlkZXIpe2NvbnN0IG5leHREaXZpZGVyPWRpdmlkZXIubmV4dFNpYmxpbmc7dGhpcy5fZGl2aWRlcnNFbGVtZW50LnJlbW92ZUNoaWxkKGRpdmlkZXIpO2RpdmlkZXI9bmV4dERpdmlkZXI7fQp3aGlsZShkaXZpZGVyTGFiZWxCYXIpe2NvbnN0IG5leHREaXZpZGVyPWRpdmlkZXJMYWJlbEJhci5uZXh0U2libGluZzt0aGlzLl9kaXZpZGVyc0xhYmVsQmFyRWxlbWVudC5yZW1vdmVDaGlsZChkaXZpZGVyTGFiZWxCYXIpO2RpdmlkZXJMYWJlbEJhcj1uZXh0RGl2aWRlcjt9CnJldHVybiB0cnVlO30KYWRkRXZlbnREaXZpZGVyKGRpdmlkZXIpe3RoaXMuX2V2ZW50RGl2aWRlcnNFbGVtZW50LmFwcGVuZENoaWxkKGRpdmlkZXIpO30KYWRkRXZlbnREaXZpZGVycyhkaXZpZGVycyl7dGhpcy5fZ3JpZEhlYWRlckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZXZlbnREaXZpZGVyc0VsZW1lbnQpO2Zvcihjb25zdCBkaXZpZGVyIG9mIGRpdmlkZXJzKQp0aGlzLl9ldmVudERpdmlkZXJzRWxlbWVudC5hcHBlbmRDaGlsZChkaXZpZGVyKTt0aGlzLl9ncmlkSGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9ldmVudERpdmlkZXJzRWxlbWVudCk7fQpyZW1vdmVFdmVudERpdmlkZXJzKCl7dGhpcy5fZXZlbnREaXZpZGVyc0VsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt9CmhpZGVFdmVudERpdmlkZXJzKCl7dGhpcy5fZXZlbnREaXZpZGVyc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fQpzaG93RXZlbnREaXZpZGVycygpe3RoaXMuX2V2ZW50RGl2aWRlcnNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO30KaGlkZURpdmlkZXJzKCl7dGhpcy5fZGl2aWRlcnNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO30Kc2hvd0RpdmlkZXJzKCl7dGhpcy5fZGl2aWRlcnNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO30Kc2V0U2Nyb2xsVG9wKHNjcm9sbFRvcCl7dGhpcy5fZGl2aWRlcnNMYWJlbEJhckVsZW1lbnQuc3R5bGUudG9wPXNjcm9sbFRvcCsncHgnO3RoaXMuX2V2ZW50RGl2aWRlcnNFbGVtZW50LnN0eWxlLnRvcD1zY3JvbGxUb3ArJ3B4Jzt9fTtQZXJmVUkuVGltZWxpbmVHcmlkLkRpdmlkZXJzRGF0YTtQZXJmVUkuVGltZWxpbmVHcmlkLkNhbGN1bGF0b3I9ZnVuY3Rpb24oKXt9O1BlcmZVSS5UaW1lbGluZUdyaWQuQ2FsY3VsYXRvci5wcm90b3R5cGU9e2NvbXB1dGVQb3NpdGlvbih0aW1lKXt9LGZvcm1hdFZhbHVlKHRpbWUscHJlY2lzaW9uKXt9LG1pbmltdW1Cb3VuZGFyeSgpe30semVyb1RpbWUoKXt9LG1heGltdW1Cb3VuZGFyeSgpe30sYm91bmRhcnlTcGFuKCl7fX07O1BlcmZVSS5UaW1lbGluZU92ZXJ2aWV3UGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IocHJlZml4KXtzdXBlcigpO3RoaXMuZWxlbWVudC5pZD1wcmVmaXgrJy1vdmVydmlldy1wYW5lJzt0aGlzLl9vdmVydmlld0NhbGN1bGF0b3I9bmV3IFBlcmZVSS5UaW1lbGluZU92ZXJ2aWV3Q2FsY3VsYXRvcigpO3RoaXMuX292ZXJ2aWV3R3JpZD1uZXcgUGVyZlVJLk92ZXJ2aWV3R3JpZChwcmVmaXgpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9vdmVydmlld0dyaWQuZWxlbWVudCk7dGhpcy5fY3Vyc29yQXJlYT10aGlzLl9vdmVydmlld0dyaWQuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3ZlcnZpZXctZ3JpZC1jdXJzb3ItYXJlYScpO3RoaXMuX2N1cnNvckVsZW1lbnQ9dGhpcy5fb3ZlcnZpZXdHcmlkLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ292ZXJ2aWV3LWdyaWQtY3Vyc29yLXBvc2l0aW9uJyk7dGhpcy5fY3Vyc29yQXJlYS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fY3Vyc29yQXJlYS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9oaWRlQ3Vyc29yLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fb3ZlcnZpZXdHcmlkLnNldFJlc2l6ZUVuYWJsZWQoZmFsc2UpO3RoaXMuX292ZXJ2aWV3R3JpZC5hZGRFdmVudExpc3RlbmVyKFBlcmZVSS5PdmVydmlld0dyaWQuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25XaW5kb3dDaGFuZ2VkLHRoaXMpO3RoaXMuX292ZXJ2aWV3R3JpZC5zZXRDbGlja0hhbmRsZXIodGhpcy5fb25DbGljay5iaW5kKHRoaXMpKTt0aGlzLl9vdmVydmlld0NvbnRyb2xzPVtdO3RoaXMuX21hcmtlcnM9bmV3IE1hcCgpO3RoaXMuX292ZXJ2aWV3SW5mbz1uZXcgUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lLk92ZXJ2aWV3SW5mbyh0aGlzLl9jdXJzb3JFbGVtZW50KTt0aGlzLl91cGRhdGVUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMTAwKTt0aGlzLl9jdXJzb3JFbmFibGVkPWZhbHNlO3RoaXMuX2N1cnNvclBvc2l0aW9uPTA7dGhpcy5fbGFzdFdpZHRoPTA7fQpfb25Nb3VzZU1vdmUoZXZlbnQpe2lmKCF0aGlzLl9jdXJzb3JFbmFibGVkKQpyZXR1cm47dGhpcy5fY3Vyc29yUG9zaXRpb249ZXZlbnQub2Zmc2V0WCtldmVudC50YXJnZXQub2Zmc2V0TGVmdDt0aGlzLl9jdXJzb3JFbGVtZW50LnN0eWxlLmxlZnQ9dGhpcy5fY3Vyc29yUG9zaXRpb24rJ3B4Jzt0aGlzLl9jdXJzb3JFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk9J3Zpc2libGUnO3RoaXMuX292ZXJ2aWV3SW5mby5zZXRDb250ZW50KHRoaXMuX2J1aWxkT3ZlcnZpZXdJbmZvKCkpO30KYXN5bmMgX2J1aWxkT3ZlcnZpZXdJbmZvKCl7Y29uc3QgZG9jdW1lbnQ9dGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7Y29uc3QgeD10aGlzLl9jdXJzb3JQb3NpdGlvbjtjb25zdCBlbGVtZW50cz1hd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9vdmVydmlld0NvbnRyb2xzLm1hcChjb250cm9sPT5jb250cm9sLm92ZXJ2aWV3SW5mb1Byb21pc2UoeCkpKTtjb25zdCBmcmFnbWVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7ZWxlbWVudHMucmVtb3ZlKG51bGwpO2ZyYWdtZW50LmFwcGVuZENoaWxkcmVuLmFwcGx5KGZyYWdtZW50LGVsZW1lbnRzKTtyZXR1cm4gZnJhZ21lbnQ7fQpfaGlkZUN1cnNvcigpe3RoaXMuX2N1cnNvckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eT0naGlkZGVuJzt0aGlzLl9vdmVydmlld0luZm8uaGlkZSgpO30Kd2FzU2hvd24oKXt0aGlzLl91cGRhdGUoKTt9CndpbGxIaWRlKCl7dGhpcy5fb3ZlcnZpZXdJbmZvLmhpZGUoKTt9Cm9uUmVzaXplKCl7Y29uc3Qgd2lkdGg9dGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoO2lmKHdpZHRoPT09dGhpcy5fbGFzdFdpZHRoKQpyZXR1cm47dGhpcy5fbGFzdFdpZHRoPXdpZHRoO3RoaXMuc2NoZWR1bGVVcGRhdGUoKTt9CnNldE92ZXJ2aWV3Q29udHJvbHMob3ZlcnZpZXdDb250cm9scyl7Zm9yKGxldCBpPTA7aTx0aGlzLl9vdmVydmlld0NvbnRyb2xzLmxlbmd0aDsrK2kpCnRoaXMuX292ZXJ2aWV3Q29udHJvbHNbaV0uZGlzcG9zZSgpO2ZvcihsZXQgaT0wO2k8b3ZlcnZpZXdDb250cm9scy5sZW5ndGg7KytpKXtvdmVydmlld0NvbnRyb2xzW2ldLnNldENhbGN1bGF0b3IodGhpcy5fb3ZlcnZpZXdDYWxjdWxhdG9yKTtvdmVydmlld0NvbnRyb2xzW2ldLnNob3codGhpcy5fb3ZlcnZpZXdHcmlkLmVsZW1lbnQpO30KdGhpcy5fb3ZlcnZpZXdDb250cm9scz1vdmVydmlld0NvbnRyb2xzO3RoaXMuX3VwZGF0ZSgpO30Kc2V0Qm91bmRzKG1pbmltdW1Cb3VuZGFyeSxtYXhpbXVtQm91bmRhcnkpe3RoaXMuX292ZXJ2aWV3Q2FsY3VsYXRvci5zZXRCb3VuZHMobWluaW11bUJvdW5kYXJ5LG1heGltdW1Cb3VuZGFyeSk7dGhpcy5fb3ZlcnZpZXdHcmlkLnNldFJlc2l6ZUVuYWJsZWQodHJ1ZSk7dGhpcy5fY3Vyc29yRW5hYmxlZD10cnVlO30Kc2NoZWR1bGVVcGRhdGUoKXt0aGlzLl91cGRhdGVUaHJvdHRsZXIuc2NoZWR1bGUocHJvY2Vzcy5iaW5kKHRoaXMpKTtmdW5jdGlvbiBwcm9jZXNzKCl7dGhpcy5fdXBkYXRlKCk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319Cl91cGRhdGUoKXtpZighdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX292ZXJ2aWV3Q2FsY3VsYXRvci5zZXREaXNwbGF5V2lkdGgodGhpcy5fb3ZlcnZpZXdHcmlkLmNsaWVudFdpZHRoKCkpO2ZvcihsZXQgaT0wO2k8dGhpcy5fb3ZlcnZpZXdDb250cm9scy5sZW5ndGg7KytpKQp0aGlzLl9vdmVydmlld0NvbnRyb2xzW2ldLnVwZGF0ZSgpO3RoaXMuX292ZXJ2aWV3R3JpZC51cGRhdGVEaXZpZGVycyh0aGlzLl9vdmVydmlld0NhbGN1bGF0b3IpO3RoaXMuX3VwZGF0ZU1hcmtlcnMoKTt0aGlzLl91cGRhdGVXaW5kb3coKTt9CnNldE1hcmtlcnMobWFya2Vycyl7dGhpcy5fbWFya2Vycz1tYXJrZXJzO30KX3VwZGF0ZU1hcmtlcnMoKXtjb25zdCBmaWx0ZXJlZE1hcmtlcnM9bmV3IE1hcCgpO2Zvcihjb25zdCB0aW1lIG9mIHRoaXMuX21hcmtlcnMua2V5cygpKXtjb25zdCBtYXJrZXI9dGhpcy5fbWFya2Vycy5nZXQodGltZSk7Y29uc3QgcG9zaXRpb249TWF0aC5yb3VuZCh0aGlzLl9vdmVydmlld0NhbGN1bGF0b3IuY29tcHV0ZVBvc2l0aW9uKHRpbWUpKTtpZihmaWx0ZXJlZE1hcmtlcnMuaGFzKHBvc2l0aW9uKSkKY29udGludWU7ZmlsdGVyZWRNYXJrZXJzLnNldChwb3NpdGlvbixtYXJrZXIpO21hcmtlci5zdHlsZS5sZWZ0PXBvc2l0aW9uKydweCc7fQp0aGlzLl9vdmVydmlld0dyaWQucmVtb3ZlRXZlbnREaXZpZGVycygpO3RoaXMuX292ZXJ2aWV3R3JpZC5hZGRFdmVudERpdmlkZXJzKGZpbHRlcmVkTWFya2Vycy52YWx1ZXNBcnJheSgpKTt9CnJlc2V0KCl7dGhpcy5fd2luZG93U3RhcnRUaW1lPTA7dGhpcy5fd2luZG93RW5kVGltZT1JbmZpbml0eTt0aGlzLl9vdmVydmlld0NhbGN1bGF0b3IucmVzZXQoKTt0aGlzLl9vdmVydmlld0dyaWQucmVzZXQoKTt0aGlzLl9vdmVydmlld0dyaWQuc2V0UmVzaXplRW5hYmxlZChmYWxzZSk7dGhpcy5fY3Vyc29yRW5hYmxlZD1mYWxzZTt0aGlzLl9oaWRlQ3Vyc29yKCk7dGhpcy5fbWFya2Vycz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5fb3ZlcnZpZXdDb250cm9scykKY29udHJvbC5yZXNldCgpO3RoaXMuX292ZXJ2aWV3SW5mby5oaWRlKCk7dGhpcy5zY2hlZHVsZVVwZGF0ZSgpO30KX29uQ2xpY2soZXZlbnQpe3JldHVybiB0aGlzLl9vdmVydmlld0NvbnRyb2xzLnNvbWUoY29udHJvbD0+Y29udHJvbC5vbkNsaWNrKGV2ZW50KSk7fQpfb25XaW5kb3dDaGFuZ2VkKGV2ZW50KXtpZih0aGlzLl9tdXRlT25XaW5kb3dDaGFuZ2VkKQpyZXR1cm47aWYoIXRoaXMuX292ZXJ2aWV3Q29udHJvbHMubGVuZ3RoKQpyZXR1cm47Y29uc3QgYWJzb2x1dGVNaW49dGhpcy5fb3ZlcnZpZXdDYWxjdWxhdG9yLm1pbmltdW1Cb3VuZGFyeSgpO2NvbnN0IHRpbWVTcGFuPXRoaXMuX292ZXJ2aWV3Q2FsY3VsYXRvci5tYXhpbXVtQm91bmRhcnkoKS1hYnNvbHV0ZU1pbjtjb25zdCB3aW5kb3dUaW1lcz17c3RhcnRUaW1lOmFic29sdXRlTWluK3RpbWVTcGFuKnRoaXMuX292ZXJ2aWV3R3JpZC53aW5kb3dMZWZ0KCksZW5kVGltZTphYnNvbHV0ZU1pbit0aW1lU3Bhbip0aGlzLl9vdmVydmlld0dyaWQud2luZG93UmlnaHQoKX07dGhpcy5fd2luZG93U3RhcnRUaW1lPXdpbmRvd1RpbWVzLnN0YXJ0VGltZTt0aGlzLl93aW5kb3dFbmRUaW1lPXdpbmRvd1RpbWVzLmVuZFRpbWU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHdpbmRvd1RpbWVzKTt9CnNldFdpbmRvd1RpbWVzKHN0YXJ0VGltZSxlbmRUaW1lKXtpZihzdGFydFRpbWU9PT10aGlzLl93aW5kb3dTdGFydFRpbWUmJmVuZFRpbWU9PT10aGlzLl93aW5kb3dFbmRUaW1lKQpyZXR1cm47dGhpcy5fd2luZG93U3RhcnRUaW1lPXN0YXJ0VGltZTt0aGlzLl93aW5kb3dFbmRUaW1lPWVuZFRpbWU7dGhpcy5fdXBkYXRlV2luZG93KCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHtzdGFydFRpbWU6c3RhcnRUaW1lLGVuZFRpbWU6ZW5kVGltZX0pO30KX3VwZGF0ZVdpbmRvdygpe2lmKCF0aGlzLl9vdmVydmlld0NvbnRyb2xzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGFic29sdXRlTWluPXRoaXMuX292ZXJ2aWV3Q2FsY3VsYXRvci5taW5pbXVtQm91bmRhcnkoKTtjb25zdCB0aW1lU3Bhbj10aGlzLl9vdmVydmlld0NhbGN1bGF0b3IubWF4aW11bUJvdW5kYXJ5KCktYWJzb2x1dGVNaW47Y29uc3QgaGF2ZVJlY29yZHM9YWJzb2x1dGVNaW4+MDtjb25zdCBsZWZ0PWhhdmVSZWNvcmRzJiZ0aGlzLl93aW5kb3dTdGFydFRpbWU/TWF0aC5taW4oKHRoaXMuX3dpbmRvd1N0YXJ0VGltZS1hYnNvbHV0ZU1pbikvdGltZVNwYW4sMSk6MDtjb25zdCByaWdodD1oYXZlUmVjb3JkcyYmdGhpcy5fd2luZG93RW5kVGltZTxJbmZpbml0eT8odGhpcy5fd2luZG93RW5kVGltZS1hYnNvbHV0ZU1pbikvdGltZVNwYW46MTt0aGlzLl9tdXRlT25XaW5kb3dDaGFuZ2VkPXRydWU7dGhpcy5fb3ZlcnZpZXdHcmlkLnNldFdpbmRvdyhsZWZ0LHJpZ2h0KTt0aGlzLl9tdXRlT25XaW5kb3dDaGFuZ2VkPWZhbHNlO319O1BlcmZVSS5UaW1lbGluZU92ZXJ2aWV3UGFuZS5FdmVudHM9e1dpbmRvd0NoYW5nZWQ6U3ltYm9sKCdXaW5kb3dDaGFuZ2VkJyl9O1BlcmZVSS5UaW1lbGluZU92ZXJ2aWV3Q2FsY3VsYXRvcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMucmVzZXQoKTt9CmNvbXB1dGVQb3NpdGlvbih0aW1lKXtyZXR1cm4odGltZS10aGlzLl9taW5pbXVtQm91bmRhcnkpL3RoaXMuYm91bmRhcnlTcGFuKCkqdGhpcy5fd29ya2luZ0FyZWE7fQpwb3NpdGlvblRvVGltZShwb3NpdGlvbil7cmV0dXJuIHBvc2l0aW9uL3RoaXMuX3dvcmtpbmdBcmVhKnRoaXMuYm91bmRhcnlTcGFuKCkrdGhpcy5fbWluaW11bUJvdW5kYXJ5O30Kc2V0Qm91bmRzKG1pbmltdW1Cb3VuZGFyeSxtYXhpbXVtQm91bmRhcnkpe3RoaXMuX21pbmltdW1Cb3VuZGFyeT1taW5pbXVtQm91bmRhcnk7dGhpcy5fbWF4aW11bUJvdW5kYXJ5PW1heGltdW1Cb3VuZGFyeTt9CnNldERpc3BsYXlXaWR0aChjbGllbnRXaWR0aCl7dGhpcy5fd29ya2luZ0FyZWE9Y2xpZW50V2lkdGg7fQpyZXNldCgpe3RoaXMuc2V0Qm91bmRzKDAsMTAwKTt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIE51bWJlci5wcmVjaXNlTWlsbGlzVG9TdHJpbmcodmFsdWUtdGhpcy56ZXJvVGltZSgpLHByZWNpc2lvbik7fQptYXhpbXVtQm91bmRhcnkoKXtyZXR1cm4gdGhpcy5fbWF4aW11bUJvdW5kYXJ5O30KbWluaW11bUJvdW5kYXJ5KCl7cmV0dXJuIHRoaXMuX21pbmltdW1Cb3VuZGFyeTt9Cnplcm9UaW1lKCl7cmV0dXJuIHRoaXMuX21pbmltdW1Cb3VuZGFyeTt9CmJvdW5kYXJ5U3Bhbigpe3JldHVybiB0aGlzLl9tYXhpbXVtQm91bmRhcnktdGhpcy5fbWluaW11bUJvdW5kYXJ5O319O1BlcmZVSS5UaW1lbGluZU92ZXJ2aWV3PWZ1bmN0aW9uKCl7fTtQZXJmVUkuVGltZWxpbmVPdmVydmlldy5wcm90b3R5cGU9e3Nob3cocGFyZW50RWxlbWVudCxpbnNlcnRCZWZvcmUpe30sdXBkYXRlKCl7fSxkaXNwb3NlKCl7fSxyZXNldCgpe30sb3ZlcnZpZXdJbmZvUHJvbWlzZSh4KXt9LG9uQ2xpY2soZXZlbnQpe30sfTtQZXJmVUkuVGltZWxpbmVPdmVydmlld0Jhc2U9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9jYWxjdWxhdG9yPW51bGw7dGhpcy5fY2FudmFzPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnY2FudmFzJywnZmlsbCcpO3RoaXMuX2NvbnRleHQ9dGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJyk7fQp3aWR0aCgpe3JldHVybiB0aGlzLl9jYW52YXMud2lkdGg7fQpoZWlnaHQoKXtyZXR1cm4gdGhpcy5fY2FudmFzLmhlaWdodDt9CmNvbnRleHQoKXtyZXR1cm4gdGhpcy5fY29udGV4dDt9CmNhbGN1bGF0b3IoKXtyZXR1cm4gdGhpcy5fY2FsY3VsYXRvcjt9CnVwZGF0ZSgpe3RoaXMucmVzZXRDYW52YXMoKTt9CmRpc3Bvc2UoKXt0aGlzLmRldGFjaCgpO30KcmVzZXQoKXt9Cm92ZXJ2aWV3SW5mb1Byb21pc2UoeCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO30Kc2V0Q2FsY3VsYXRvcihjYWxjdWxhdG9yKXt0aGlzLl9jYWxjdWxhdG9yPWNhbGN1bGF0b3I7fQpvbkNsaWNrKGV2ZW50KXtyZXR1cm4gZmFsc2U7fQpyZXNldENhbnZhcygpe2lmKHRoaXMuZWxlbWVudC5jbGllbnRXaWR0aCkKdGhpcy5zZXRDYW52YXNTaXplKHRoaXMuZWxlbWVudC5jbGllbnRXaWR0aCx0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0KTt9CnNldENhbnZhc1NpemUod2lkdGgsaGVpZ2h0KXt0aGlzLl9jYW52YXMud2lkdGg9d2lkdGgqd2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fY2FudmFzLmhlaWdodD1oZWlnaHQqd2luZG93LmRldmljZVBpeGVsUmF0aW87fX07UGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdQYW5lLk92ZXJ2aWV3SW5mbz1jbGFzc3tjb25zdHJ1Y3RvcihhbmNob3Ipe3RoaXMuX2FuY2hvckVsZW1lbnQ9YW5jaG9yO3RoaXMuX2dsYXNzUGFuZT1uZXcgVUkuR2xhc3NQYW5lKCk7dGhpcy5fZ2xhc3NQYW5lLnNldFBvaW50ZXJFdmVudHNCZWhhdmlvcihVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLlBpZXJjZUNvbnRlbnRzKTt0aGlzLl9nbGFzc1BhbmUuc2V0TWFyZ2luQmVoYXZpb3IoVUkuR2xhc3NQYW5lLk1hcmdpbkJlaGF2aW9yLkFycm93KTt0aGlzLl9nbGFzc1BhbmUuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO3RoaXMuX3Zpc2libGU9ZmFsc2U7dGhpcy5fZWxlbWVudD1VSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXModGhpcy5fZ2xhc3NQYW5lLmNvbnRlbnRFbGVtZW50LCdwZXJmX3VpL3RpbWVsaW5lT3ZlcnZpZXdJbmZvLmNzcycpLmNyZWF0ZUNoaWxkKCdkaXYnLCdvdmVydmlldy1pbmZvJyk7fQphc3luYyBzZXRDb250ZW50KGNvbnRlbnRQcm9taXNlKXt0aGlzLl92aXNpYmxlPXRydWU7Y29uc3QgY29udGVudD1hd2FpdCBjb250ZW50UHJvbWlzZTtpZighdGhpcy5fdmlzaWJsZSkKcmV0dXJuO3RoaXMuX2VsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO3RoaXMuX2dsYXNzUGFuZS5zZXRDb250ZW50QW5jaG9yQm94KHRoaXMuX2FuY2hvckVsZW1lbnQuYm94SW5XaW5kb3coKSk7aWYoIXRoaXMuX2dsYXNzUGFuZS5pc1Nob3dpbmcoKSkKdGhpcy5fZ2xhc3NQYW5lLnNob3coKHRoaXMuX2FuY2hvckVsZW1lbnQub3duZXJEb2N1bWVudCkpO30KaGlkZSgpe3RoaXMuX3Zpc2libGU9ZmFsc2U7dGhpcy5fZ2xhc3NQYW5lLmhpZGUoKTt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInBlcmZfdWkvY2hhcnRWaWV3cG9ydC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uY2hhcnQtdmlld3BvcnQtdi1zY3JvbGwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICB6LWluZGV4OiAyMDA7XG4gICAgcGFkZGluZy1sZWZ0OiAxcHg7XG59XG5cbi5jaGFydC12aWV3cG9ydC12LXNjcm9sbC5hbHdheXMtc2hvdy1zY3JvbGxiYXIge1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLyogZm9yY2Ugbm9uIG92ZXJsYXkgc2Nyb2xsYmFycyBmb3IgTWFjICovXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIC5jaGFydC12aWV3cG9ydC12LXNjcm9sbCB7XG4gICAgcmlnaHQ6IDJweDtcbiAgICB0b3A6IDNweDtcbiAgICBib3R0b206IDNweDtcbn1cblxuOmhvc3QtY29udGV4dCgucGxhdGZvcm0tbWFjKSA6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogOHB4O1xufVxuXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDU2JSwgMC42KTtcbiAgICBib3JkZXItcmFkaXVzOiA1MHB4O1xufVxuXG46aG9zdC1jb250ZXh0KC5wbGF0Zm9ybS1tYWMpIC5jaGFydC12aWV3cG9ydC12LXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDI1JSwgMC42KTtcbn1cblxuLyogZm9yY2Ugbm9uIG92ZXJsYXkgc2Nyb2xsYmFycyBmb3IgQXVyYSBPdmVybGF5IFNjcm9sbGJhciBlbmFibGVkICovXG46aG9zdC1jb250ZXh0KC5vdmVybGF5LXNjcm9sbGJhci1lbmFibGVkKSA6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMTBweDtcbn1cblxuOmhvc3QtY29udGV4dCgub3ZlcmxheS1zY3JvbGxiYXItZW5hYmxlZCkgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLCAwJSwgMCUsIDAuNSk7XG59XG5cbjpob3N0LWNvbnRleHQoLm92ZXJsYXktc2Nyb2xsYmFyLWVuYWJsZWQpIC5jaGFydC12aWV3cG9ydC12LXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDAlLCAwLjcpO1xufVxuXG4uY2hhcnQtdmlld3BvcnQtc2VsZWN0aW9uLW92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NiwgMTIxLCAyMTcsIDAuMyk7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMTYsIDgxLCAxNzcpO1xuICAgIGJvcmRlci13aWR0aDogMCAxcHg7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNoYXJ0LXZpZXdwb3J0LXNlbGVjdGlvbi1vdmVybGF5IC50aW1lLXNwYW4ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xufVxuXG4vKiMgc291cmNlVVJMPXBlcmZfdWkvY2hhcnRWaWV3cG9ydC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwZXJmX3VpL2ZpbG1TdHJpcFZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5maWxtLXN0cmlwLXZpZXcge1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgbWluLWhlaWdodDogODFweDtcbn1cblxuLmZpbG0tc3RyaXAtdmlldy50aW1lLWJhc2VkIC5mcmFtZSAudGltZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmZpbG0tc3RyaXAtdmlldyAubGFiZWwge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgY29sb3I6ICM5OTk7XG59XG5cbi5maWxtLXN0cmlwLXZpZXcgLmZyYW1lIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgZmxleDogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5maWxtLXN0cmlwLXZpZXcgLmZyYW1lLWxpbWl0LXJlYWNoZWQge1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjb2xvcjogIzg4ODtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5maWxtLXN0cmlwLXZpZXcgLmZyYW1lIC50aHVtYm5haWwge1xuICAgIG1pbi13aWR0aDogMjRweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBtYXJnaW46IDRweCAwIDJweDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLmZpbG0tc3RyaXAtdmlldyAuZnJhbWU6aG92ZXIgLnRodW1ibmFpbCB7XG4gICAgYm9yZGVyLWNvbG9yOiAjRkJDQTQ2O1xufVxuXG4uZmlsbS1zdHJpcC12aWV3IC5mcmFtZSAudGh1bWJuYWlsIGltZyB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIG1heC13aWR0aDogODBweDtcbiAgICBtYXgtaGVpZ2h0OiA1MHB4O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGJveC1zaGFkb3c6IDAgMCAzcHggI2JiYjtcbiAgICBmbGV4OiAwIDAgYXV0bztcbn1cblxuLmZpbG0tc3RyaXAtdmlldyAuZnJhbWU6aG92ZXIgLnRodW1ibmFpbCBpbWcge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG59XG5cbi5maWxtLXN0cmlwLXZpZXcgLmZyYW1lIC50aW1lIHtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogMnB4O1xufVxuXG4vKiMgc291cmNlVVJMPXBlcmZfdWkvZmlsbVN0cmlwVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwZXJmX3VpL2ZsYW1lQ2hhcnQuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmZsYW1lLWNoYXJ0LW1haW4tcGFuZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmZsYW1lLWNoYXJ0LW1hcmtlci1oaWdobGlnaHQtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMXB4O1xuICAgIGhlaWdodDogMThweDtcbiAgICB3aWR0aDogNnB4O1xuICAgIG1hcmdpbjogMCAtM3B4O1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5mbGFtZS1jaGFydC1oaWdobGlnaHQtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTYsIDEyMSwgMjE3LCAwLjEpO1xufVxuXG4uZmxhbWUtY2hhcnQtc2VsZWN0ZWQtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTYsIDEyMSwgMjE3LCAwLjEpO1xufVxuXG4uY2hhcnQtY3Vyc29yLWVsZW1lbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICB3aWR0aDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5mbGFtZS1jaGFydC1lbnRyeS1pbmZvOm5vdCg6ZW1wdHkpIHtcbiAgICB6LWluZGV4OiAyMDAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgbWF4LXdpZHRoOiA4MCU7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xufVxuXG4uZmxhbWUtY2hhcnQtZW50cnktaW5mbyB0YWJsZSB0ciB0ZDplbXB0eSB7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLmZsYW1lLWNoYXJ0LWVudHJ5LWluZm8gdGFibGUgdHIgdGQ6bm90KDplbXB0eSkge1xuICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5mbGFtZS1jaGFydC1lbnRyeS1pbmZvIHRhYmxlIHRyIHRkOmZpcnN0LWNoaWxkIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmZsYW1lLWNoYXJ0LWVudHJ5LWluZm8gdGFibGUgdHIgdGQgc3BhbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9cGVyZl91aS9mbGFtZUNoYXJ0LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInBlcmZfdWkvb3ZlcnZpZXdHcmlkLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ub3ZlcnZpZXctZ3JpZC13aW5kb3ctc2VsZWN0b3Ige1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTI1LCAxNzMsIDIxNywgMC41KTtcbiAgICB6LWluZGV4OiAyNTA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5vdmVydmlldy1ncmlkLXdpbmRvdy1yZXNpemVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtMXB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICB3aWR0aDogNnB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTMsIDE1MywgMTUzKTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCB3aGl0ZTtcbiAgICB6LWluZGV4OiA1MDA7XG59XG5cbi5vdmVydmlldy1ncmlkLWN1cnNvci1hcmVhIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICB0b3A6IDIwcHg7XG4gICAgYm90dG9tOiAwO1xuICAgIHotaW5kZXg6IDUwMDtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi5vdmVydmlldy1ncmlkLWN1cnNvci1wb3NpdGlvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDIyMCwgOTUlLCA1MCUsIDAuNyk7XG4gICAgei1pbmRleDogNTAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ud2luZG93LWN1cnRhaW4tbGVmdCwgLndpbmRvdy1jdXJ0YWluLXJpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDAsIDAlLCA4MCUsIDAuNSk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogMzAwO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGJvcmRlcjogMXB4IG5vbmUgaHNsYSgwLCAwJSwgNzAlLCAwLjUpO1xufVxuXG4ud2luZG93LWN1cnRhaW4tbGVmdCB7XG4gICAgbGVmdDogMDtcbiAgICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkO1xufVxuXG4ud2luZG93LWN1cnRhaW4tcmlnaHQge1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbn1cblxuLyojIHNvdXJjZVVSTD1wZXJmX3VpL292ZXJ2aWV3R3JpZC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwZXJmX3VpL3BpZUNoYXJ0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ucm9vdCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuLnBpZS1jaGFydC1mb3JlZ3JvdW5kIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDEwO1xuICAgIHRvcDogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4ucGllLWNoYXJ0LXRvdGFsIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMnB4IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNik7XG59XG5cbi8qIyBzb3VyY2VVUkw9cGVyZl91aS9waWVDaGFydC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwZXJmX3VpL3RpbWVsaW5lR3JpZC5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnJlc291cmNlcy1kaXZpZGVycyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IC0xMDA7XG4gICAgYm90dG9tOiAwO1xufVxuXG4ucmVzb3VyY2VzLWV2ZW50LWRpdmlkZXJzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IDMwMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpO1xuICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHotaW5kZXg6IDIwMDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVzb3VyY2VzLWRpdmlkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEpO1xufVxuXG4ucmVzb3VyY2VzLWV2ZW50LWRpdmlkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IDA7XG4gICAgei1pbmRleDogMzAwO1xufVxuXG4ucmVzb3VyY2VzLWRpdmlkZXItbGFiZWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDRweDtcbiAgICByaWdodDogM3B4O1xuICAgIGZvbnQtc2l6ZTogODAlO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi50aW1lbGluZS1ncmlkLWhlYWRlciB7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vKiMgc291cmNlVVJMPXBlcmZfdWkvdGltZWxpbmVHcmlkLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInBlcmZfdWkvdGltZWxpbmVPdmVydmlld0luZm8uY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLm92ZXJ2aWV3LWluZm86bm90KDplbXB0eSkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xuICAgIHBhZGRpbmc6IDNweDtcbn1cblxuLm92ZXJ2aWV3LWluZm8gLmZyYW1lIC50aW1lIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4ub3ZlcnZpZXctaW5mbyAuZnJhbWUgLnRodW1ibmFpbCBpbWcge1xuICAgIG1heC13aWR0aDogNTB2dztcbiAgICBtYXgtaGVpZ2h0OiA1MHZoO1xufVxuXG4vKiMgc291cmNlVVJMPXBlcmZfdWkvdGltZWxpbmVPdmVydmlld0luZm8uY3NzICovIjtQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yPWNsYXNzIGV4dGVuZHMgVUkuSEJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygncGVyZm9ybWFuY2VfbW9uaXRvci9wZXJmb3JtYW5jZU1vbml0b3IuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwZXJmbW9uLXBhbmUnKTt0aGlzLl9tZXRyaWNzQnVmZmVyPVtdO3RoaXMuX3BpeGVsc1Blck1zPTIwLzEwMDA7dGhpcy5fcG9sbEludGVydmFsTXM9NTAwO3RoaXMuX3NjYWxlSGVpZ2h0PTE2O3RoaXMuX2dyYXBoSGVpZ2h0PTkwO3RoaXMuX2dyaWRDb2xvcj1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3JnYmEoMCwgMCwgMCwgMC4wOCknLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO3RoaXMuX2NvbnRyb2xQYW5lPW5ldyBQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLkNvbnRyb2xQYW5lKHRoaXMuY29udGVudEVsZW1lbnQpO2NvbnN0IGNoYXJ0Q29udGFpbmVyPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BlcmZtb24tY2hhcnQtY29udGFpbmVyJyk7dGhpcy5fY2FudmFzPShjaGFydENvbnRhaW5lci5jcmVhdGVDaGlsZCgnY2FudmFzJykpO3RoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BlcmZtb24tY2hhcnQtc3VzcGVuZC1vdmVybGF5IGZpbGwnKS5jcmVhdGVDaGlsZCgnZGl2JykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdQYXVzZWQnKTt0aGlzLl9jb250cm9sUGFuZS5hZGRFdmVudExpc3RlbmVyKFBlcmZvcm1hbmNlTW9uaXRvci5QZXJmb3JtYW5jZU1vbml0b3IuQ29udHJvbFBhbmUuRXZlbnRzLk1ldHJpY0NoYW5nZWQsdGhpcy5fcmVjYWxjQ2hhcnRIZWlnaHQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuUGVyZm9ybWFuY2VNZXRyaWNzTW9kZWwsdGhpcyk7fQp3YXNTaG93bigpe2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcy5fc3VzcGVuZFN0YXRlQ2hhbmdlZCx0aGlzKTt0aGlzLl9tb2RlbC5lbmFibGUoKTt0aGlzLl9zdXNwZW5kU3RhdGVDaGFuZ2VkKCk7fQp3aWxsSGlkZSgpe2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuO1NESy50YXJnZXRNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcy5fc3VzcGVuZFN0YXRlQ2hhbmdlZCx0aGlzKTt0aGlzLl9zdG9wUG9sbGluZygpO3RoaXMuX21vZGVsLmRpc2FibGUoKTt9Cm1vZGVsQWRkZWQobW9kZWwpe2lmKHRoaXMuX21vZGVsKQpyZXR1cm47dGhpcy5fbW9kZWw9bW9kZWw7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy53YXNTaG93bigpO30KbW9kZWxSZW1vdmVkKG1vZGVsKXtpZih0aGlzLl9tb2RlbCE9PW1vZGVsKQpyZXR1cm47aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy53aWxsSGlkZSgpO3RoaXMuX21vZGVsPW51bGw7fQpfc3VzcGVuZFN0YXRlQ2hhbmdlZCgpe2NvbnN0IHN1c3BlbmRlZD1TREsudGFyZ2V0TWFuYWdlci5hbGxUYXJnZXRzU3VzcGVuZGVkKCk7aWYoc3VzcGVuZGVkKQp0aGlzLl9zdG9wUG9sbGluZygpO2Vsc2UKdGhpcy5fc3RhcnRQb2xsaW5nKCk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdzdXNwZW5kZWQnLHN1c3BlbmRlZCk7fQpfc3RhcnRQb2xsaW5nKCl7dGhpcy5fc3RhcnRUaW1lc3RhbXA9MDt0aGlzLl9wb2xsVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMuX3BvbGwoKSx0aGlzLl9wb2xsSW50ZXJ2YWxNcyk7dGhpcy5vblJlc2l6ZSgpO2FuaW1hdGUuY2FsbCh0aGlzKTtmdW5jdGlvbiBhbmltYXRlKCl7dGhpcy5fZHJhdygpO3RoaXMuX2FuaW1hdGlvbklkPXRoaXMuY29udGVudEVsZW1lbnQud2luZG93KCkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUuYmluZCh0aGlzKSk7fX0KX3N0b3BQb2xsaW5nKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLl9wb2xsVGltZXIpO3RoaXMuY29udGVudEVsZW1lbnQud2luZG93KCkuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uSWQpO3RoaXMuX21ldHJpY3NCdWZmZXI9W107fQphc3luYyBfcG9sbCgpe2NvbnN0IGRhdGE9YXdhaXQgdGhpcy5fbW9kZWwucmVxdWVzdE1ldHJpY3MoKTtjb25zdCB0aW1lc3RhbXA9ZGF0YS50aW1lc3RhbXA7Y29uc3QgbWV0cmljcz1kYXRhLm1ldHJpY3M7dGhpcy5fbWV0cmljc0J1ZmZlci5wdXNoKHt0aW1lc3RhbXAsbWV0cmljczptZXRyaWNzfSk7Y29uc3QgbWlsbGlzUGVyV2lkdGg9dGhpcy5fd2lkdGgvdGhpcy5fcGl4ZWxzUGVyTXM7Y29uc3QgbWF4Q291bnQ9TWF0aC5jZWlsKG1pbGxpc1BlcldpZHRoL3RoaXMuX3BvbGxJbnRlcnZhbE1zKjIpO2lmKHRoaXMuX21ldHJpY3NCdWZmZXIubGVuZ3RoPm1heENvdW50KjIpCnRoaXMuX21ldHJpY3NCdWZmZXIuc3BsaWNlKDAsdGhpcy5fbWV0cmljc0J1ZmZlci5sZW5ndGgtbWF4Q291bnQpO3RoaXMuX2NvbnRyb2xQYW5lLnVwZGF0ZU1ldHJpY3MobWV0cmljcyk7fQpfZHJhdygpe2NvbnN0IGN0eD0odGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJykpO2N0eC5zYXZlKCk7Y3R4LnNjYWxlKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtjdHguY2xlYXJSZWN0KDAsMCx0aGlzLl93aWR0aCx0aGlzLl9oZWlnaHQpO2N0eC5zYXZlKCk7Y3R4LnRyYW5zbGF0ZSgwLHRoaXMuX3NjYWxlSGVpZ2h0KTtmb3IoY29uc3QgY2hhcnRJbmZvIG9mIHRoaXMuX2NvbnRyb2xQYW5lLmNoYXJ0cygpKXtpZighdGhpcy5fY29udHJvbFBhbmUuaXNBY3RpdmUoY2hhcnRJbmZvLm1ldHJpY3NbMF0ubmFtZSkpCmNvbnRpbnVlO3RoaXMuX2RyYXdDaGFydChjdHgsY2hhcnRJbmZvLHRoaXMuX2dyYXBoSGVpZ2h0KTtjdHgudHJhbnNsYXRlKDAsdGhpcy5fZ3JhcGhIZWlnaHQpO30KY3R4LnJlc3RvcmUoKTt0aGlzLl9kcmF3SG9yaXpvbnRhbEdyaWQoY3R4KTtjdHgucmVzdG9yZSgpO30KX2RyYXdIb3Jpem9udGFsR3JpZChjdHgpe2NvbnN0IGxpZ2h0R3JheT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3JnYmEoMCwgMCwgMCwgMC4wMiknLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO2N0eC5mb250PSc5cHggJytIb3N0LmZvbnRGYW1pbHkoKTtjdHguZmlsbFN0eWxlPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dCgncmdiYSgwLCAwLCAwLCAwLjMpJyxVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5Gb3JlZ3JvdW5kKTtjb25zdCBjdXJyZW50VGltZT1EYXRlLm5vdygpLzEwMDA7Zm9yKGxldCBzZWM9TWF0aC5jZWlsKGN1cnJlbnRUaW1lKTs7LS1zZWMpe2NvbnN0IHg9dGhpcy5fd2lkdGgtKChjdXJyZW50VGltZS1zZWMpKjEwMDAtdGhpcy5fcG9sbEludGVydmFsTXMpKnRoaXMuX3BpeGVsc1Blck1zO2lmKHg8LTUwKQpicmVhaztjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbyhNYXRoLnJvdW5kKHgpKzAuNSwwKTtjdHgubGluZVRvKE1hdGgucm91bmQoeCkrMC41LHRoaXMuX2hlaWdodCk7aWYoc2VjPj0wJiZzZWMlNT09PTApCmN0eC5maWxsVGV4dChuZXcgRGF0ZShzZWMqMTAwMCkudG9Mb2NhbGVUaW1lU3RyaW5nKCksTWF0aC5yb3VuZCh4KSs0LDEyKTtjdHguc3Ryb2tlU3R5bGU9c2VjJTU/bGlnaHRHcmF5OnRoaXMuX2dyaWRDb2xvcjtjdHguc3Ryb2tlKCk7fX0KX2RyYXdDaGFydChjdHgsY2hhcnRJbmZvLGhlaWdodCl7Y3R4LnNhdmUoKTtjdHgucmVjdCgwLDAsdGhpcy5fd2lkdGgsaGVpZ2h0KTtjdHguY2xpcCgpO2NvbnN0IGJvdHRvbVBhZGRpbmc9ODtjb25zdCBleHRyYVNwYWNlPTEuMDU7Y29uc3QgbWF4PXRoaXMuX2NhbGNNYXgoY2hhcnRJbmZvKSpleHRyYVNwYWNlO2NvbnN0IHN0YWNrZWRDaGFydEJhc2VMYW5kc2NhcGU9Y2hhcnRJbmZvLnN0YWNrZWQ/bmV3IE1hcCgpOm51bGw7Y29uc3QgcGF0aHM9W107Zm9yKGxldCBpPWNoYXJ0SW5mby5tZXRyaWNzLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCBtZXRyaWNJbmZvPWNoYXJ0SW5mby5tZXRyaWNzW2ldO3BhdGhzLnB1c2goe3BhdGg6dGhpcy5fYnVpbGRNZXRyaWNQYXRoKGNoYXJ0SW5mbyxtZXRyaWNJbmZvLGhlaWdodC1ib3R0b21QYWRkaW5nLG1heCxpP3N0YWNrZWRDaGFydEJhc2VMYW5kc2NhcGU6bnVsbCksY29sb3I6bWV0cmljSW5mby5jb2xvcn0pO30KY29uc3QgYmFja2dyb3VuZENvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShVSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3doaXRlJyxVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5CYWNrZ3JvdW5kKSk7Zm9yKGNvbnN0IHBhdGggb2YgcGF0aHMucmV2ZXJzZSgpKXtjb25zdCBjb2xvcj1wYXRoLmNvbG9yO2N0eC5zYXZlKCk7Y3R4LmZpbGxTdHlsZT1iYWNrZ3JvdW5kQ29sb3IuYmxlbmRXaXRoKENvbW1vbi5Db2xvci5wYXJzZShjb2xvcikuc2V0QWxwaGEoMC4yKSkuYXNTdHJpbmcobnVsbCk7Y3R4LmZpbGwocGF0aC5wYXRoKTtjdHguc3Ryb2tlU3R5bGU9Y29sb3I7Y3R4LmxpbmVXaWR0aD0wLjU7Y3R4LnN0cm9rZShwYXRoLnBhdGgpO2N0eC5yZXN0b3JlKCk7fQp0aGlzLl9kcmF3VmVydGljYWxHcmlkKGN0eCxoZWlnaHQtYm90dG9tUGFkZGluZyxtYXgsY2hhcnRJbmZvKTtjdHgucmVzdG9yZSgpO30KX2NhbGNNYXgoY2hhcnRJbmZvKXtpZihjaGFydEluZm8ubWF4KQpyZXR1cm4gY2hhcnRJbmZvLm1heDtjb25zdCB3aWR0aD10aGlzLl93aWR0aDtjb25zdCBzdGFydFRpbWU9cGVyZm9ybWFuY2Uubm93KCktdGhpcy5fcG9sbEludGVydmFsTXMtd2lkdGgvdGhpcy5fcGl4ZWxzUGVyTXM7bGV0IG1heD0tSW5maW5pdHk7Zm9yKGNvbnN0IG1ldHJpY0luZm8gb2YgY2hhcnRJbmZvLm1ldHJpY3Mpe2ZvcihsZXQgaT10aGlzLl9tZXRyaWNzQnVmZmVyLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCBtZXRyaWNzPXRoaXMuX21ldHJpY3NCdWZmZXJbaV07Y29uc3QgdmFsdWU9bWV0cmljcy5tZXRyaWNzLmdldChtZXRyaWNJbmZvLm5hbWUpO21heD1NYXRoLm1heChtYXgsdmFsdWUpO2lmKG1ldHJpY3MudGltZXN0YW1wPHN0YXJ0VGltZSkKYnJlYWs7fX0KaWYoIXRoaXMuX21ldHJpY3NCdWZmZXIubGVuZ3RoKQpyZXR1cm4gMTA7Y29uc3QgYmFzZTEwPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cxMChtYXgpKSk7bWF4PU1hdGguY2VpbChtYXgvYmFzZTEwLzIpKmJhc2UxMCoyO2NvbnN0IGFscGhhPTAuMjtjaGFydEluZm8uY3VycmVudE1heD1tYXgqYWxwaGErKGNoYXJ0SW5mby5jdXJyZW50TWF4fHxtYXgpKigxLWFscGhhKTtyZXR1cm4gY2hhcnRJbmZvLmN1cnJlbnRNYXg7fQpfZHJhd1ZlcnRpY2FsR3JpZChjdHgsaGVpZ2h0LG1heCxpbmZvKXtsZXQgYmFzZT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nMTAobWF4KSkpO2NvbnN0IGZpcnN0RGlnaXQ9TWF0aC5mbG9vcihtYXgvYmFzZSk7aWYoZmlyc3REaWdpdCE9PTEmJmZpcnN0RGlnaXQlMj09PTEpCmJhc2UqPTI7bGV0IHNjYWxlVmFsdWU9TWF0aC5mbG9vcihtYXgvYmFzZSkqYmFzZTtjb25zdCBzcGFuPW1heDtjb25zdCB0b3BQYWRkaW5nPTU7Y29uc3QgdmlzaWJsZUhlaWdodD1oZWlnaHQtdG9wUGFkZGluZztjdHguZmlsbFN0eWxlPVVJLnRoZW1lU3VwcG9ydC5wYXRjaENvbG9yVGV4dCgncmdiYSgwLCAwLCAwLCAwLjMpJyxVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5Gb3JlZ3JvdW5kKTtjdHguc3Ryb2tlU3R5bGU9dGhpcy5fZ3JpZENvbG9yO2N0eC5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPDI7KytpKXtjb25zdCB5PWNhbGNZKHNjYWxlVmFsdWUpO2NvbnN0IGxhYmVsVGV4dD1QZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLk1ldHJpY0luZGljYXRvci5fZm9ybWF0TnVtYmVyKHNjYWxlVmFsdWUsaW5mbyk7Y3R4Lm1vdmVUbygwLHkpO2N0eC5saW5lVG8oNCx5KTtjdHgubW92ZVRvKGN0eC5tZWFzdXJlVGV4dChsYWJlbFRleHQpLndpZHRoKzEyLHkpO2N0eC5saW5lVG8odGhpcy5fd2lkdGgseSk7Y3R4LmZpbGxUZXh0KGxhYmVsVGV4dCw4LGNhbGNZKHNjYWxlVmFsdWUpKzMpO3NjYWxlVmFsdWUvPTI7fQpjdHguc3Ryb2tlKCk7Y3R4LmJlZ2luUGF0aCgpO2N0eC5tb3ZlVG8oMCxoZWlnaHQrMC41KTtjdHgubGluZVRvKHRoaXMuX3dpZHRoLGhlaWdodCswLjUpO2N0eC5zdHJva2VTdHlsZT1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3JnYmEoMCwgMCwgMCwgMC4yKScsVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuRm9yZWdyb3VuZCk7Y3R4LnN0cm9rZSgpO2Z1bmN0aW9uIGNhbGNZKHZhbHVlKXtyZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQtdmlzaWJsZUhlaWdodCp2YWx1ZS9zcGFuKSswLjU7fX0KX2J1aWxkTWV0cmljUGF0aChjaGFydEluZm8sbWV0cmljSW5mbyxoZWlnaHQsc2NhbGVNYXgsc3RhY2tlZENoYXJ0QmFzZUxhbmRzY2FwZSl7Y29uc3QgcGF0aD1uZXcgUGF0aDJEKCk7Y29uc3QgdG9wUGFkZGluZz01O2NvbnN0IHZpc2libGVIZWlnaHQ9aGVpZ2h0LXRvcFBhZGRpbmc7aWYodmlzaWJsZUhlaWdodDwxKQpyZXR1cm4gcGF0aDtjb25zdCBzcGFuPXNjYWxlTWF4O2NvbnN0IG1ldHJpY05hbWU9bWV0cmljSW5mby5uYW1lO2NvbnN0IHBpeGVsc1Blck1zPXRoaXMuX3BpeGVsc1Blck1zO2NvbnN0IHN0YXJ0VGltZT1wZXJmb3JtYW5jZS5ub3coKS10aGlzLl9wb2xsSW50ZXJ2YWxNcy10aGlzLl93aWR0aC9waXhlbHNQZXJNcztjb25zdCBzbW9vdGg9Y2hhcnRJbmZvLnNtb290aDtsZXQgeD0wO2xldCBsYXN0WT0wO2xldCBsYXN0WD0wO2lmKHRoaXMuX21ldHJpY3NCdWZmZXIubGVuZ3RoKXt4PSh0aGlzLl9tZXRyaWNzQnVmZmVyWzBdLnRpbWVzdGFtcC1zdGFydFRpbWUpKnBpeGVsc1Blck1zO3BhdGgubW92ZVRvKHgsY2FsY1koMCkpO3BhdGgubGluZVRvKHRoaXMuX3dpZHRoKzUsY2FsY1koMCkpO2xhc3RZPWNhbGNZKHRoaXMuX21ldHJpY3NCdWZmZXIucGVla0xhc3QoKS5tZXRyaWNzLmdldChtZXRyaWNOYW1lKSk7bGFzdFg9dGhpcy5fd2lkdGgrNTtwYXRoLmxpbmVUbyhsYXN0WCxsYXN0WSk7fQpmb3IobGV0IGk9dGhpcy5fbWV0cmljc0J1ZmZlci5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgbWV0cmljcz10aGlzLl9tZXRyaWNzQnVmZmVyW2ldO2NvbnN0IHRpbWVzdGFtcD1tZXRyaWNzLnRpbWVzdGFtcDtsZXQgdmFsdWU9bWV0cmljcy5tZXRyaWNzLmdldChtZXRyaWNOYW1lKTtpZihzdGFja2VkQ2hhcnRCYXNlTGFuZHNjYXBlKXt2YWx1ZSs9c3RhY2tlZENoYXJ0QmFzZUxhbmRzY2FwZS5nZXQodGltZXN0YW1wKXx8MDt2YWx1ZT1OdW1iZXIuY29uc3RyYWluKHZhbHVlLDAsMSk7c3RhY2tlZENoYXJ0QmFzZUxhbmRzY2FwZS5zZXQodGltZXN0YW1wLHZhbHVlKTt9CmNvbnN0IHk9Y2FsY1kodmFsdWUpO3g9KHRpbWVzdGFtcC1zdGFydFRpbWUpKnBpeGVsc1Blck1zO2lmKHNtb290aCl7Y29uc3QgbWlkWD0obGFzdFgreCkvMjtwYXRoLmJlemllckN1cnZlVG8obWlkWCxsYXN0WSxtaWRYLHkseCx5KTt9ZWxzZXtwYXRoLmxpbmVUbyh4LGxhc3RZKTtwYXRoLmxpbmVUbyh4LHkpO30KbGFzdFg9eDtsYXN0WT15O2lmKHRpbWVzdGFtcDxzdGFydFRpbWUpCmJyZWFrO30KcmV0dXJuIHBhdGg7ZnVuY3Rpb24gY2FsY1kodmFsdWUpe3JldHVybiBNYXRoLnJvdW5kKGhlaWdodC12aXNpYmxlSGVpZ2h0KnZhbHVlL3NwYW4pKzAuNTt9fQpvblJlc2l6ZSgpe3N1cGVyLm9uUmVzaXplKCk7dGhpcy5fd2lkdGg9dGhpcy5fY2FudmFzLm9mZnNldFdpZHRoO3RoaXMuX2NhbnZhcy53aWR0aD1NYXRoLnJvdW5kKHRoaXMuX3dpZHRoKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLl9yZWNhbGNDaGFydEhlaWdodCgpO30KX3JlY2FsY0NoYXJ0SGVpZ2h0KCl7bGV0IGhlaWdodD10aGlzLl9zY2FsZUhlaWdodDtmb3IoY29uc3QgY2hhcnRJbmZvIG9mIHRoaXMuX2NvbnRyb2xQYW5lLmNoYXJ0cygpKXtpZih0aGlzLl9jb250cm9sUGFuZS5pc0FjdGl2ZShjaGFydEluZm8ubWV0cmljc1swXS5uYW1lKSkKaGVpZ2h0Kz10aGlzLl9ncmFwaEhlaWdodDt9CnRoaXMuX2hlaWdodD1NYXRoLmNlaWwoaGVpZ2h0KndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLl9jYW52YXMuaGVpZ2h0PXRoaXMuX2hlaWdodDt0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0PWAke3RoaXMuX2hlaWdodCAvIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfXB4YDt9fTtQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLkZvcm1hdD17UGVyY2VudDpTeW1ib2woJ1BlcmNlbnQnKSxCeXRlczpTeW1ib2woJ0J5dGVzJyksfTtQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLkNoYXJ0SW5mbztQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLk1ldHJpY0luZm87UGVyZm9ybWFuY2VNb25pdG9yLlBlcmZvcm1hbmNlTW9uaXRvci5Db250cm9sUGFuZT1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IocGFyZW50KXtzdXBlcigpO3RoaXMuZWxlbWVudD1wYXJlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BlcmZtb24tY29udHJvbC1wYW5lJyk7dGhpcy5fZW5hYmxlZENoYXJ0c1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3BlcmZtb25BY3RpdmVJbmRpY2F0b3JzMicsWydUYXNrRHVyYXRpb24nLCdKU0hlYXBUb3RhbFNpemUnLCdOb2RlcyddKTt0aGlzLl9lbmFibGVkQ2hhcnRzPW5ldyBTZXQodGhpcy5fZW5hYmxlZENoYXJ0c1NldHRpbmcuZ2V0KCkpO2NvbnN0IGZvcm1hdD1QZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLkZvcm1hdDt0aGlzLl9jaGFydHNJbmZvPVt7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdDUFUgdXNhZ2UnKSxtZXRyaWNzOlt7bmFtZTonVGFza0R1cmF0aW9uJyxjb2xvcjonIzk5OSd9LHtuYW1lOidTY3JpcHREdXJhdGlvbicsY29sb3I6J29yYW5nZSd9LHtuYW1lOidMYXlvdXREdXJhdGlvbicsY29sb3I6J2JsdWV2aW9sZXQnfSx7bmFtZTonUmVjYWxjU3R5bGVEdXJhdGlvbicsY29sb3I6J3Zpb2xldCd9XSxmb3JtYXQ6Zm9ybWF0LlBlcmNlbnQsc21vb3RoOnRydWUsc3RhY2tlZDp0cnVlLGNvbG9yOidyZWQnLG1heDoxfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdKUyBoZWFwIHNpemUnKSxtZXRyaWNzOlt7bmFtZTonSlNIZWFwVG90YWxTaXplJyxjb2xvcjonIzk5Zid9LHtuYW1lOidKU0hlYXBVc2VkU2l6ZScsY29sb3I6J2JsdWUnfV0sZm9ybWF0OmZvcm1hdC5CeXRlcyxjb2xvcjonYmx1ZSd9LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0RPTSBOb2RlcycpLG1ldHJpY3M6W3tuYW1lOidOb2RlcycsY29sb3I6J2dyZWVuJ31dfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdKUyBldmVudCBsaXN0ZW5lcnMnKSxtZXRyaWNzOlt7bmFtZTonSlNFdmVudExpc3RlbmVycycsY29sb3I6J3llbGxvd2dyZWVuJ31dfSx7dGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdEb2N1bWVudHMnKSxtZXRyaWNzOlt7bmFtZTonRG9jdW1lbnRzJyxjb2xvcjonZGFya2JsdWUnfV19LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0RvY3VtZW50IEZyYW1lcycpLG1ldHJpY3M6W3tuYW1lOidGcmFtZXMnLGNvbG9yOidkYXJrY3lhbid9XX0se3RpdGxlOkNvbW1vbi5VSVN0cmluZygnTGF5b3V0cyAvIHNlYycpLG1ldHJpY3M6W3tuYW1lOidMYXlvdXRDb3VudCcsY29sb3I6J2hvdHBpbmsnfV19LHt0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1N0eWxlIHJlY2FsY3MgLyBzZWMnKSxtZXRyaWNzOlt7bmFtZTonUmVjYWxjU3R5bGVDb3VudCcsY29sb3I6J2RlZXBwaW5rJ31dfV07Zm9yKGNvbnN0IGluZm8gb2YgdGhpcy5fY2hhcnRzSW5mbyl7Zm9yKGNvbnN0IG1ldHJpYyBvZiBpbmZvLm1ldHJpY3MpCm1ldHJpYy5jb2xvcj1VSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQobWV0cmljLmNvbG9yLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpO30KdGhpcy5faW5kaWNhdG9ycz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGNoYXJ0SW5mbyBvZiB0aGlzLl9jaGFydHNJbmZvKXtjb25zdCBjaGFydE5hbWU9Y2hhcnRJbmZvLm1ldHJpY3NbMF0ubmFtZTtjb25zdCBhY3RpdmU9dGhpcy5fZW5hYmxlZENoYXJ0cy5oYXMoY2hhcnROYW1lKTtjb25zdCBpbmRpY2F0b3I9bmV3IFBlcmZvcm1hbmNlTW9uaXRvci5QZXJmb3JtYW5jZU1vbml0b3IuTWV0cmljSW5kaWNhdG9yKHRoaXMuZWxlbWVudCxjaGFydEluZm8sYWN0aXZlLHRoaXMuX29uVG9nZ2xlLmJpbmQodGhpcyxjaGFydE5hbWUpKTt0aGlzLl9pbmRpY2F0b3JzLnNldChjaGFydE5hbWUsaW5kaWNhdG9yKTt9fQpfb25Ub2dnbGUoY2hhcnROYW1lLGFjdGl2ZSl7aWYoYWN0aXZlKQp0aGlzLl9lbmFibGVkQ2hhcnRzLmFkZChjaGFydE5hbWUpO2Vsc2UKdGhpcy5fZW5hYmxlZENoYXJ0cy5kZWxldGUoY2hhcnROYW1lKTt0aGlzLl9lbmFibGVkQ2hhcnRzU2V0dGluZy5zZXQoQXJyYXkuZnJvbSh0aGlzLl9lbmFibGVkQ2hhcnRzKSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyZm9ybWFuY2VNb25pdG9yLlBlcmZvcm1hbmNlTW9uaXRvci5Db250cm9sUGFuZS5FdmVudHMuTWV0cmljQ2hhbmdlZCk7fQpjaGFydHMoKXtyZXR1cm4gdGhpcy5fY2hhcnRzSW5mbzt9CmlzQWN0aXZlKG1ldHJpY05hbWUpe3JldHVybiB0aGlzLl9lbmFibGVkQ2hhcnRzLmhhcyhtZXRyaWNOYW1lKTt9CnVwZGF0ZU1ldHJpY3MobWV0cmljcyl7Zm9yKGNvbnN0IG5hbWUgb2YgdGhpcy5faW5kaWNhdG9ycy5rZXlzKCkpe2lmKG1ldHJpY3MuaGFzKG5hbWUpKQp0aGlzLl9pbmRpY2F0b3JzLmdldChuYW1lKS5zZXRWYWx1ZShtZXRyaWNzLmdldChuYW1lKSk7fX19O1BlcmZvcm1hbmNlTW9uaXRvci5QZXJmb3JtYW5jZU1vbml0b3IuQ29udHJvbFBhbmUuRXZlbnRzPXtNZXRyaWNDaGFuZ2VkOlN5bWJvbCgnTWV0cmljQ2hhbmdlZCcpfTtQZXJmb3JtYW5jZU1vbml0b3IuUGVyZm9ybWFuY2VNb25pdG9yLk1ldHJpY0luZGljYXRvcj1jbGFzc3tjb25zdHJ1Y3RvcihwYXJlbnQsaW5mbyxhY3RpdmUsb25Ub2dnbGUpe2NvbnN0IGNvbG9yPWluZm8uY29sb3J8fGluZm8ubWV0cmljc1swXS5jb2xvcjt0aGlzLl9pbmZvPWluZm87dGhpcy5fYWN0aXZlPWFjdGl2ZTt0aGlzLl9vblRvZ2dsZT1vblRvZ2dsZTt0aGlzLmVsZW1lbnQ9cGFyZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwZXJmbW9uLWluZGljYXRvcicpO3RoaXMuX3N3YXRjaEVsZW1lbnQ9VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi1jaGVja21hcmstc3F1YXJlJywncGVyZm1vbi1pbmRpY2F0b3Itc3dhdGNoJyk7dGhpcy5fc3dhdGNoRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y29sb3I7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3N3YXRjaEVsZW1lbnQpO3RoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncGVyZm1vbi1pbmRpY2F0b3ItdGl0bGUnKS50ZXh0Q29udGVudD1pbmZvLnRpdGxlO3RoaXMuX3ZhbHVlRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3BlcmZtb24taW5kaWNhdG9yLXZhbHVlJyk7dGhpcy5fdmFsdWVFbGVtZW50LnN0eWxlLmNvbG9yPWNvbG9yO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnRoaXMuX3RvZ2dsZUluZGljYXRvcigpKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyxhY3RpdmUpO30Kc3RhdGljIF9mb3JtYXROdW1iZXIodmFsdWUsaW5mbyl7c3dpdGNoKGluZm8uZm9ybWF0KXtjYXNlIFBlcmZvcm1hbmNlTW9uaXRvci5QZXJmb3JtYW5jZU1vbml0b3IuRm9ybWF0LlBlcmNlbnQ6cmV0dXJuIHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycse21heGltdW1GcmFjdGlvbkRpZ2l0czoxLHN0eWxlOidwZXJjZW50J30pO2Nhc2UgUGVyZm9ybWFuY2VNb25pdG9yLlBlcmZvcm1hbmNlTW9uaXRvci5Gb3JtYXQuQnl0ZXM6cmV0dXJuIE51bWJlci5ieXRlc1RvU3RyaW5nKHZhbHVlKTtkZWZhdWx0OnJldHVybiB2YWx1ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6MX0pO319CnNldFZhbHVlKHZhbHVlKXt0aGlzLl92YWx1ZUVsZW1lbnQudGV4dENvbnRlbnQ9UGVyZm9ybWFuY2VNb25pdG9yLlBlcmZvcm1hbmNlTW9uaXRvci5NZXRyaWNJbmRpY2F0b3IuX2Zvcm1hdE51bWJlcih2YWx1ZSx0aGlzLl9pbmZvKTt9Cl90b2dnbGVJbmRpY2F0b3IoKXt0aGlzLl9hY3RpdmU9IXRoaXMuX2FjdGl2ZTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyx0aGlzLl9hY3RpdmUpO3RoaXMuX29uVG9nZ2xlKHRoaXMuX2FjdGl2ZSk7fX07UGVyZm9ybWFuY2VNb25pdG9yLlBlcmZvcm1hbmNlTW9uaXRvci5NZXRyaWNJbmRpY2F0b3IuX2Zvcm1hdD1uZXcgSW50bC5OdW1iZXJGb3JtYXQoJ2VuLVVTJyx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjF9KTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInBlcmZvcm1hbmNlX21vbml0b3IvcGVyZm9ybWFuY2VNb25pdG9yLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wZXJmbW9uLXBhbmUge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGVyZm1vbi1wYW5lLnN1c3BlbmRlZCB7XG4gIG9wYWNpdHk6IDAuNDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5wZXJmbW9uLXBhbmUgLnBlcmZtb24tY2hhcnQtc3VzcGVuZC1vdmVybGF5IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgZm9udC1zaXplOiAyNnB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLnBlcmZtb24tcGFuZS5zdXNwZW5kZWQgLnBlcmZtb24tY2hhcnQtc3VzcGVuZC1vdmVybGF5IHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnBlcmZtb24tY29udHJvbC1wYW5lIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgcGFkZGluZzogNnB4IDA7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLnBlcmZtb24tY2hhcnQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleDogMSAxO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNjY2M7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbi5wZXJmbW9uLWNoYXJ0LWNvbnRhaW5lciBjYW52YXMge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnBlcmZtb24taW5kaWNhdG9yIHtcbiAgcGFkZGluZzogNnB4IDEycHg7XG4gIG1hcmdpbjogLTFweCAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDIxMHB4O1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3I6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3Itc3dhdGNoIHtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG59XG5cbi5wZXJmbW9uLWluZGljYXRvcjpub3QoLmFjdGl2ZSkgLnBlcmZtb24taW5kaWNhdG9yLXN3YXRjaCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWUgIWltcG9ydGFudDtcbn1cblxuLnBlcmZtb24taW5kaWNhdG9yLXRpdGxlIHtcbiAgZmxleDogMCAwIDExNXB4O1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3I6bm90KC5hY3RpdmUpIC5wZXJmbW9uLWluZGljYXRvci10aXRsZSB7XG4gIGNvbG9yOiAjYWFhO1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3ItdmFsdWUge1xuICBmbGV4OiAwIDAgNTVweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3I6bm90KC5hY3RpdmUpIC5wZXJmbW9uLWluZGljYXRvci12YWx1ZSB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi5wZXJmbW9uLWluZGljYXRvci1jbG9zZSB7XG4gIHBhZGRpbmctbGVmdDogNHB4O1xufVxuXG4ucGVyZm1vbi1pbmRpY2F0b3I6bm90KDpob3ZlcikgLnBlcmZtb24taW5kaWNhdG9yLWNsb3NlIHtcbiAgb3BhY2l0eTogMDtcbn1cblxuLnBlcmZtb24tYWRkLWJ1dHRvbjpub3QoOmhvdmVyKSB7XG4gIGNvbG9yOiAjYmJiO1xufVxuXG4vKiMgc291cmNlVVJMPXBlcmZvcm1hbmNlX21vbml0b3IvcGVyZm9ybWFuY2VNb25pdG9yLmNzcyAqLyI7UHJvZmlsZXIuUHJvZmlsZVR5cGU9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGlkLG5hbWUpe3N1cGVyKCk7dGhpcy5faWQ9aWQ7dGhpcy5fbmFtZT1uYW1lO3RoaXMuX3Byb2ZpbGVzPVtdO3RoaXMuX3Byb2ZpbGVCZWluZ1JlY29yZGVkPW51bGw7dGhpcy5fbmV4dFByb2ZpbGVVaWQ9MTtpZighd2luZG93Lm9wZW5lcikKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VubG9hZCcsdGhpcy5fY2xlYXJUZW1wU3RvcmFnZS5iaW5kKHRoaXMpLGZhbHNlKTt9CnR5cGVOYW1lKCl7cmV0dXJuJyc7fQpuZXh0UHJvZmlsZVVpZCgpe3JldHVybiB0aGlzLl9uZXh0UHJvZmlsZVVpZDt9CmluY3JlbWVudFByb2ZpbGVVaWQoKXtyZXR1cm4gdGhpcy5fbmV4dFByb2ZpbGVVaWQrKzt9Cmhhc1RlbXBvcmFyeVZpZXcoKXtyZXR1cm4gZmFsc2U7fQpmaWxlRXh0ZW5zaW9uKCl7cmV0dXJuIG51bGw7fQpnZXQgYnV0dG9uVG9vbHRpcCgpe3JldHVybicnO30KZ2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkO30KZ2V0IHRyZWVJdGVtVGl0bGUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CmdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQpidXR0b25DbGlja2VkKCl7cmV0dXJuIGZhbHNlO30KZ2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuJyc7fQppc0luc3RhbnRQcm9maWxlKCl7cmV0dXJuIGZhbHNlO30KaXNFbmFibGVkKCl7cmV0dXJuIHRydWU7fQpnZXRQcm9maWxlcygpe2Z1bmN0aW9uIGlzRmluaXNoZWQocHJvZmlsZSl7cmV0dXJuIHRoaXMuX3Byb2ZpbGVCZWluZ1JlY29yZGVkIT09cHJvZmlsZTt9CnJldHVybiB0aGlzLl9wcm9maWxlcy5maWx0ZXIoaXNGaW5pc2hlZC5iaW5kKHRoaXMpKTt9CmN1c3RvbUNvbnRlbnQoKXtyZXR1cm4gbnVsbDt9CmdldFByb2ZpbGUodWlkKXtmb3IobGV0IGk9MDtpPHRoaXMuX3Byb2ZpbGVzLmxlbmd0aDsrK2kpe2lmKHRoaXMuX3Byb2ZpbGVzW2ldLnVpZD09PXVpZCkKcmV0dXJuIHRoaXMuX3Byb2ZpbGVzW2ldO30KcmV0dXJuIG51bGw7fQpsb2FkRnJvbUZpbGUoZmlsZSl7bGV0IG5hbWU9ZmlsZS5uYW1lO2NvbnN0IGZpbGVFeHRlbnNpb249dGhpcy5maWxlRXh0ZW5zaW9uKCk7aWYoZmlsZUV4dGVuc2lvbiYmbmFtZS5lbmRzV2l0aChmaWxlRXh0ZW5zaW9uKSkKbmFtZT1uYW1lLnN1YnN0cigwLG5hbWUubGVuZ3RoLWZpbGVFeHRlbnNpb24ubGVuZ3RoKTtjb25zdCBwcm9maWxlPXRoaXMuY3JlYXRlUHJvZmlsZUxvYWRlZEZyb21GaWxlKG5hbWUpO3Byb2ZpbGUuc2V0RnJvbUZpbGUoKTt0aGlzLnNldFByb2ZpbGVCZWluZ1JlY29yZGVkKHByb2ZpbGUpO3RoaXMuYWRkUHJvZmlsZShwcm9maWxlKTtyZXR1cm4gcHJvZmlsZS5sb2FkRnJvbUZpbGUoZmlsZSk7fQpjcmVhdGVQcm9maWxlTG9hZGVkRnJvbUZpbGUodGl0bGUpe3Rocm93IG5ldyBFcnJvcignTmVlZHMgaW1wbGVtZW50ZWQuJyk7fQphZGRQcm9maWxlKHByb2ZpbGUpe3RoaXMuX3Byb2ZpbGVzLnB1c2gocHJvZmlsZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZVR5cGUuRXZlbnRzLkFkZFByb2ZpbGVIZWFkZXIscHJvZmlsZSk7fQpyZW1vdmVQcm9maWxlKHByb2ZpbGUpe2NvbnN0IGluZGV4PXRoaXMuX3Byb2ZpbGVzLmluZGV4T2YocHJvZmlsZSk7aWYoaW5kZXg9PT0tMSkKcmV0dXJuO3RoaXMuX3Byb2ZpbGVzLnNwbGljZShpbmRleCwxKTt0aGlzLl9kaXNwb3NlUHJvZmlsZShwcm9maWxlKTt9Cl9jbGVhclRlbXBTdG9yYWdlKCl7Zm9yKGxldCBpPTA7aTx0aGlzLl9wcm9maWxlcy5sZW5ndGg7KytpKQp0aGlzLl9wcm9maWxlc1tpXS5yZW1vdmVUZW1wRmlsZSgpO30KcHJvZmlsZUJlaW5nUmVjb3JkZWQoKXtyZXR1cm4gdGhpcy5fcHJvZmlsZUJlaW5nUmVjb3JkZWQ7fQpzZXRQcm9maWxlQmVpbmdSZWNvcmRlZChwcm9maWxlKXt0aGlzLl9wcm9maWxlQmVpbmdSZWNvcmRlZD1wcm9maWxlO30KcHJvZmlsZUJlaW5nUmVjb3JkZWRSZW1vdmVkKCl7fQpyZXNldCgpe2Zvcihjb25zdCBwcm9maWxlIG9mIHRoaXMuX3Byb2ZpbGVzLnNsaWNlKCkpCnRoaXMuX2Rpc3Bvc2VQcm9maWxlKHByb2ZpbGUpO3RoaXMuX3Byb2ZpbGVzPVtdO3RoaXMuX25leHRQcm9maWxlVWlkPTE7fQpfZGlzcG9zZVByb2ZpbGUocHJvZmlsZSl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZVR5cGUuRXZlbnRzLlJlbW92ZVByb2ZpbGVIZWFkZXIscHJvZmlsZSk7cHJvZmlsZS5kaXNwb3NlKCk7aWYodGhpcy5fcHJvZmlsZUJlaW5nUmVjb3JkZWQ9PT1wcm9maWxlKXt0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkUmVtb3ZlZCgpO3RoaXMuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQobnVsbCk7fX19O1Byb2ZpbGVyLlByb2ZpbGVUeXBlLkV2ZW50cz17QWRkUHJvZmlsZUhlYWRlcjpTeW1ib2woJ2FkZC1wcm9maWxlLWhlYWRlcicpLFByb2ZpbGVDb21wbGV0ZTpTeW1ib2woJ3Byb2ZpbGUtY29tcGxldGUnKSxSZW1vdmVQcm9maWxlSGVhZGVyOlN5bWJvbCgncmVtb3ZlLXByb2ZpbGUtaGVhZGVyJyksVmlld1VwZGF0ZWQ6U3ltYm9sKCd2aWV3LXVwZGF0ZWQnKX07UHJvZmlsZXIuUHJvZmlsZVR5cGUuRGF0YURpc3BsYXlEZWxlZ2F0ZT1mdW5jdGlvbigpe307UHJvZmlsZXIuUHJvZmlsZVR5cGUuRGF0YURpc3BsYXlEZWxlZ2F0ZS5wcm90b3R5cGU9e3Nob3dQcm9maWxlKHByb2ZpbGUpe30sc2hvd09iamVjdChzbmFwc2hvdE9iamVjdElkLHBlcnNwZWN0aXZlTmFtZSl7fSxhc3luYyBsaW5raWZ5T2JqZWN0KHNuYXBzaG90T2JqZWN0SWQpe319OztQcm9maWxlci5Qcm9maWxlSGVhZGVyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcihwcm9maWxlVHlwZSx0aXRsZSl7c3VwZXIoKTt0aGlzLl9wcm9maWxlVHlwZT1wcm9maWxlVHlwZTt0aGlzLnRpdGxlPXRpdGxlO3RoaXMudWlkPXByb2ZpbGVUeXBlLmluY3JlbWVudFByb2ZpbGVVaWQoKTt0aGlzLl9mcm9tRmlsZT1mYWxzZTt9CnNldFRpdGxlKHRpdGxlKXt0aGlzLnRpdGxlPXRpdGxlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuRXZlbnRzLlByb2ZpbGVUaXRsZUNoYW5nZWQsdGhpcyk7fQpwcm9maWxlVHlwZSgpe3JldHVybiB0aGlzLl9wcm9maWxlVHlwZTt9CnVwZGF0ZVN0YXR1cyhzdWJ0aXRsZSx3YWl0KXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQcm9maWxlci5Qcm9maWxlSGVhZGVyLkV2ZW50cy5VcGRhdGVTdGF0dXMsbmV3IFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuU3RhdHVzVXBkYXRlKHN1YnRpdGxlLHdhaXQpKTt9CmNyZWF0ZVNpZGViYXJUcmVlRWxlbWVudChkYXRhRGlzcGxheURlbGVnYXRlKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTt9CmNyZWF0ZVZpZXcoZGF0YURpc3BsYXlEZWxlZ2F0ZSl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7fQpyZW1vdmVUZW1wRmlsZSgpe2lmKHRoaXMuX3RlbXBGaWxlKQp0aGlzLl90ZW1wRmlsZS5yZW1vdmUoKTt9CmRpc3Bvc2UoKXt9CmNhblNhdmVUb0ZpbGUoKXtyZXR1cm4gZmFsc2U7fQpzYXZlVG9GaWxlKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTt9CmxvYWRGcm9tRmlsZShmaWxlKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KZnJvbUZpbGUoKXtyZXR1cm4gdGhpcy5fZnJvbUZpbGU7fQpzZXRGcm9tRmlsZSgpe3RoaXMuX2Zyb21GaWxlPXRydWU7fQpzZXRQcm9maWxlKHByb2ZpbGUpe319O1Byb2ZpbGVyLlByb2ZpbGVIZWFkZXIuU3RhdHVzVXBkYXRlPWNsYXNze2NvbnN0cnVjdG9yKHN1YnRpdGxlLHdhaXQpe3RoaXMuc3VidGl0bGU9c3VidGl0bGU7dGhpcy53YWl0PXdhaXQ7fX07UHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHM9e1VwZGF0ZVN0YXR1czpTeW1ib2woJ1VwZGF0ZVN0YXR1cycpLFByb2ZpbGVSZWNlaXZlZDpTeW1ib2woJ1Byb2ZpbGVSZWNlaXZlZCcpLFByb2ZpbGVUaXRsZUNoYW5nZWQ6U3ltYm9sKCdQcm9maWxlVGl0bGVDaGFuZ2VkJyl9OztQcm9maWxlci5Qcm9maWxlc1BhbmVsPWNsYXNzIGV4dGVuZHMgVUkuUGFuZWxXaXRoU2lkZWJhcntjb25zdHJ1Y3RvcihuYW1lLHByb2ZpbGVUeXBlcyxyZWNvcmRpbmdBY3Rpb25JZCl7c3VwZXIobmFtZSk7dGhpcy5fcHJvZmlsZVR5cGVzPXByb2ZpbGVUeXBlczt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Byb2ZpbGVyL2hlYXBQcm9maWxlci5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Byb2ZpbGVyL3Byb2ZpbGVzUGFuZWwuY3NzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdvYmplY3RfdWkvb2JqZWN0VmFsdWUuY3NzJyk7Y29uc3QgbWFpbkNvbnRhaW5lcj1uZXcgVUkuVkJveCgpO3RoaXMuc3BsaXRXaWRnZXQoKS5zZXRNYWluV2lkZ2V0KG1haW5Db250YWluZXIpO3RoaXMucHJvZmlsZXNJdGVtVHJlZUVsZW1lbnQ9bmV3IFByb2ZpbGVyLlByb2ZpbGVzU2lkZWJhclRyZWVFbGVtZW50KHRoaXMpO3RoaXMuX3NpZGViYXJUcmVlPW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7dGhpcy5fc2lkZWJhclRyZWUucmVnaXN0ZXJSZXF1aXJlZENTUygncHJvZmlsZXIvcHJvZmlsZXNTaWRlYmFyVHJlZS5jc3MnKTt0aGlzLl9zaWRlYmFyVHJlZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Byb2ZpbGVzLXNpZGViYXItdHJlZS1ib3gnKTt0aGlzLnBhbmVsU2lkZWJhckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9zaWRlYmFyVHJlZS5lbGVtZW50KTt0aGlzLl9zaWRlYmFyVHJlZS5hcHBlbmRDaGlsZCh0aGlzLnByb2ZpbGVzSXRlbVRyZWVFbGVtZW50KTt0aGlzLnByb2ZpbGVWaWV3cz1jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLnByb2ZpbGVWaWV3cy5pZD0ncHJvZmlsZS12aWV3cyc7dGhpcy5wcm9maWxlVmlld3MuY2xhc3NMaXN0LmFkZCgndmJveCcpO21haW5Db250YWluZXIuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb2ZpbGVWaWV3cyk7dGhpcy5fdG9vbGJhckVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywncHJvZmlsZXMtdG9vbGJhcicpO21haW5Db250YWluZXIuZWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5fdG9vbGJhckVsZW1lbnQsbWFpbkNvbnRhaW5lci5lbGVtZW50LmZpcnN0Q2hpbGQpO3RoaXMucGFuZWxTaWRlYmFyRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoJ3Byb2ZpbGVzLXRyZWUtc2lkZWJhcicpO2NvbnN0IHRvb2xiYXJDb250YWluZXJMZWZ0PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Byb2ZpbGVzLXRvb2xiYXInKTt0aGlzLnBhbmVsU2lkZWJhckVsZW1lbnQoKS5pbnNlcnRCZWZvcmUodG9vbGJhckNvbnRhaW5lckxlZnQsdGhpcy5wYW5lbFNpZGViYXJFbGVtZW50KCkuZmlyc3RDaGlsZCk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0b29sYmFyQ29udGFpbmVyTGVmdCk7dGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uPShVSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24ocmVjb3JkaW5nQWN0aW9uSWQpKTt0aGlzLl90b2dnbGVSZWNvcmRCdXR0b249VUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3RvZ2dsZVJlY29yZEJ1dHRvbik7dGhpcy5jbGVhclJlc3VsdHNCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBhbGwgcHJvZmlsZXMnKSwnbGFyZ2VpY29uLWNsZWFyJyk7dGhpcy5jbGVhclJlc3VsdHNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9yZXNldCx0aGlzKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuY2xlYXJSZXN1bHRzQnV0dG9uKTt0b29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b25Gb3JJZCgnY29tcG9uZW50cy5jb2xsZWN0LWdhcmJhZ2UnKSk7dGhpcy5fcHJvZmlsZVZpZXdUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLHRoaXMuX3Rvb2xiYXJFbGVtZW50KTt0aGlzLl9wcm9maWxlR3JvdXBzPXt9O3RoaXMuX2xhdW5jaGVyVmlldz1uZXcgUHJvZmlsZXIuUHJvZmlsZUxhdW5jaGVyVmlldyh0aGlzKTt0aGlzLl9sYXVuY2hlclZpZXcuYWRkRXZlbnRMaXN0ZW5lcihQcm9maWxlci5Qcm9maWxlTGF1bmNoZXJWaWV3LkV2ZW50cy5Qcm9maWxlVHlwZVNlbGVjdGVkLHRoaXMuX29uUHJvZmlsZVR5cGVTZWxlY3RlZCx0aGlzKTt0aGlzLl9wcm9maWxlVG9WaWV3PVtdO3RoaXMuX3R5cGVJZFRvU2lkZWJhclNlY3Rpb249e307Y29uc3QgdHlwZXM9dGhpcy5fcHJvZmlsZVR5cGVzO2ZvcihsZXQgaT0wO2k8dHlwZXMubGVuZ3RoO2krKykKdGhpcy5fcmVnaXN0ZXJQcm9maWxlVHlwZSh0eXBlc1tpXSk7dGhpcy5fbGF1bmNoZXJWaWV3LnJlc3RvcmVTZWxlY3RlZFByb2ZpbGVUeXBlKCk7dGhpcy5wcm9maWxlc0l0ZW1UcmVlRWxlbWVudC5zZWxlY3QoKTt0aGlzLl9zaG93TGF1bmNoZXJWaWV3KCk7dGhpcy5fY3JlYXRlRmlsZVNlbGVjdG9yRWxlbWVudCgpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTtTREsudGFyZ2V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5TdXNwZW5kU3RhdGVDaGFuZ2VkLHRoaXMuX29uU3VzcGVuZFN0YXRlQ2hhbmdlZCx0aGlzKTt9Cl9vbktleURvd24oZXZlbnQpe2xldCBoYW5kbGVkPWZhbHNlO2lmKGV2ZW50LmtleT09PSdBcnJvd0Rvd24nJiYhZXZlbnQuYWx0S2V5KQpoYW5kbGVkPXRoaXMuX3NpZGViYXJUcmVlLnNlbGVjdE5leHQoKTtlbHNlIGlmKGV2ZW50LmtleT09PSdBcnJvd1VwJyYmIWV2ZW50LmFsdEtleSkKaGFuZGxlZD10aGlzLl9zaWRlYmFyVHJlZS5zZWxlY3RQcmV2aW91cygpO2lmKGhhbmRsZWQpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7fQpzZWFyY2hhYmxlVmlldygpe3JldHVybiB0aGlzLnZpc2libGVWaWV3JiZ0aGlzLnZpc2libGVWaWV3LnNlYXJjaGFibGVWaWV3P3RoaXMudmlzaWJsZVZpZXcuc2VhcmNoYWJsZVZpZXcoKTpudWxsO30KX2NyZWF0ZUZpbGVTZWxlY3RvckVsZW1lbnQoKXtpZih0aGlzLl9maWxlU2VsZWN0b3JFbGVtZW50KQp0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZmlsZVNlbGVjdG9yRWxlbWVudCk7dGhpcy5fZmlsZVNlbGVjdG9yRWxlbWVudD1VSS5jcmVhdGVGaWxlU2VsZWN0b3JFbGVtZW50KHRoaXMuX2xvYWRGcm9tRmlsZS5iaW5kKHRoaXMpKTtQcm9maWxlci5Qcm9maWxlc1BhbmVsLl9maWxlU2VsZWN0b3JFbGVtZW50PXRoaXMuX2ZpbGVTZWxlY3RvckVsZW1lbnQ7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2ZpbGVTZWxlY3RvckVsZW1lbnQpO30KX2ZpbmRQcm9maWxlVHlwZUJ5RXh0ZW5zaW9uKGZpbGVOYW1lKXtyZXR1cm4gdGhpcy5fcHJvZmlsZVR5cGVzLmZpbmQodHlwZT0+ISF0eXBlLmZpbGVFeHRlbnNpb24oKSYmZmlsZU5hbWUuZW5kc1dpdGgodHlwZS5maWxlRXh0ZW5zaW9uKCl8fCcnKSl8fG51bGw7fQphc3luYyBfbG9hZEZyb21GaWxlKGZpbGUpe3RoaXMuX2NyZWF0ZUZpbGVTZWxlY3RvckVsZW1lbnQoKTtjb25zdCBwcm9maWxlVHlwZT10aGlzLl9maW5kUHJvZmlsZVR5cGVCeUV4dGVuc2lvbihmaWxlLm5hbWUpO2lmKCFwcm9maWxlVHlwZSl7Y29uc3QgZXh0ZW5zaW9ucz1uZXcgU2V0KHRoaXMuX3Byb2ZpbGVUeXBlcy5tYXAodHlwZT0+dHlwZS5maWxlRXh0ZW5zaW9uKCkpLmZpbHRlcihleHQ9PmV4dCkpO0NvbW1vbi5jb25zb2xlLmVycm9yKENvbW1vbi5VSVN0cmluZyhgQ2FuJ3QgbG9hZCBmaWxlLiBTdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zOiAnJXMnLmAsQXJyYXkuZnJvbShleHRlbnNpb25zKS5qb2luKGAnLCAnYCkpKTtyZXR1cm47fQppZighIXByb2ZpbGVUeXBlLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkpe0NvbW1vbi5jb25zb2xlLmVycm9yKENvbW1vbi5VSVN0cmluZyhgQ2FuJ3QgbG9hZCBwcm9maWxlIHdoaWxlIGFub3RoZXIgcHJvZmlsZSBpcyBiZWluZyByZWNvcmRlZC5gKSk7cmV0dXJuO30KY29uc3QgZXJyb3I9YXdhaXQgcHJvZmlsZVR5cGUubG9hZEZyb21GaWxlKGZpbGUpO2lmKGVycm9yKQpVSS5NZXNzYWdlRGlhbG9nLnNob3coQ29tbW9uLlVJU3RyaW5nKCdQcm9maWxlIGxvYWRpbmcgZmFpbGVkOiAlcy4nLGVycm9yLm1lc3NhZ2UpKTt9CnRvZ2dsZVJlY29yZCgpe2lmKCF0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb24uZW5hYmxlZCgpKQpyZXR1cm4gdHJ1ZTtjb25zdCB0eXBlPXRoaXMuX3NlbGVjdGVkUHJvZmlsZVR5cGU7Y29uc3QgaXNQcm9maWxpbmc9dHlwZS5idXR0b25DbGlja2VkKCk7dGhpcy5fdXBkYXRlVG9nZ2xlUmVjb3JkQWN0aW9uKGlzUHJvZmlsaW5nKTtpZihpc1Byb2ZpbGluZyl7dGhpcy5fbGF1bmNoZXJWaWV3LnByb2ZpbGVTdGFydGVkKCk7aWYodHlwZS5oYXNUZW1wb3JhcnlWaWV3KCkpCnRoaXMuc2hvd1Byb2ZpbGUodHlwZS5wcm9maWxlQmVpbmdSZWNvcmRlZCgpKTt9ZWxzZXt0aGlzLl9sYXVuY2hlclZpZXcucHJvZmlsZUZpbmlzaGVkKCk7fQpyZXR1cm4gdHJ1ZTt9Cl9vblN1c3BlbmRTdGF0ZUNoYW5nZWQoKXt0aGlzLl91cGRhdGVUb2dnbGVSZWNvcmRBY3Rpb24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnRvZ2dsZWQoKSk7fQpfdXBkYXRlVG9nZ2xlUmVjb3JkQWN0aW9uKHRvZ2dsZWQpe2NvbnN0IGVuYWJsZT10b2dnbGVkfHwhU0RLLnRhcmdldE1hbmFnZXIuYWxsVGFyZ2V0c1N1c3BlbmRlZCgpO3RoaXMuX3RvZ2dsZVJlY29yZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7dGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnNldFRvZ2dsZWQodG9nZ2xlZCk7aWYoZW5hYmxlKQp0aGlzLl90b2dnbGVSZWNvcmRCdXR0b24uc2V0VGl0bGUodGhpcy5fc2VsZWN0ZWRQcm9maWxlVHlwZT90aGlzLl9zZWxlY3RlZFByb2ZpbGVUeXBlLmJ1dHRvblRvb2x0aXA6JycpO2Vsc2UKdGhpcy5fdG9nZ2xlUmVjb3JkQnV0dG9uLnNldFRpdGxlKFVJLmFub3RoZXJQcm9maWxlckFjdGl2ZUxhYmVsKCkpO2lmKHRoaXMuX3NlbGVjdGVkUHJvZmlsZVR5cGUpCnRoaXMuX2xhdW5jaGVyVmlldy51cGRhdGVQcm9maWxlVHlwZSh0aGlzLl9zZWxlY3RlZFByb2ZpbGVUeXBlLGVuYWJsZSk7fQpfcHJvZmlsZUJlaW5nUmVjb3JkZWRSZW1vdmVkKCl7dGhpcy5fdXBkYXRlVG9nZ2xlUmVjb3JkQWN0aW9uKGZhbHNlKTt0aGlzLl9sYXVuY2hlclZpZXcucHJvZmlsZUZpbmlzaGVkKCk7fQpfb25Qcm9maWxlVHlwZVNlbGVjdGVkKGV2ZW50KXt0aGlzLl9zZWxlY3RlZFByb2ZpbGVUeXBlPShldmVudC5kYXRhKTt0aGlzLl91cGRhdGVQcm9maWxlVHlwZVNwZWNpZmljVUkoKTt9Cl91cGRhdGVQcm9maWxlVHlwZVNwZWNpZmljVUkoKXt0aGlzLl91cGRhdGVUb2dnbGVSZWNvcmRBY3Rpb24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnRvZ2dsZWQoKSk7fQpfcmVzZXQoKXt0aGlzLl9wcm9maWxlVHlwZXMuZm9yRWFjaCh0eXBlPT50eXBlLnJlc2V0KCkpO2RlbGV0ZSB0aGlzLnZpc2libGVWaWV3O3RoaXMuX3Byb2ZpbGVHcm91cHM9e307dGhpcy5fdXBkYXRlVG9nZ2xlUmVjb3JkQWN0aW9uKGZhbHNlKTt0aGlzLl9sYXVuY2hlclZpZXcucHJvZmlsZUZpbmlzaGVkKCk7dGhpcy5fc2lkZWJhclRyZWUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzb21lLWV4cGFuZGFibGUnKTt0aGlzLl9sYXVuY2hlclZpZXcuZGV0YWNoKCk7dGhpcy5wcm9maWxlVmlld3MucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9wcm9maWxlVmlld1Rvb2xiYXIucmVtb3ZlVG9vbGJhckl0ZW1zKCk7dGhpcy5jbGVhclJlc3VsdHNCdXR0b24uZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLnByb2ZpbGVzSXRlbVRyZWVFbGVtZW50LnNlbGVjdCgpO3RoaXMuX3Nob3dMYXVuY2hlclZpZXcoKTt9Cl9zaG93TGF1bmNoZXJWaWV3KCl7dGhpcy5jbG9zZVZpc2libGVWaWV3KCk7dGhpcy5fcHJvZmlsZVZpZXdUb29sYmFyLnJlbW92ZVRvb2xiYXJJdGVtcygpO3RoaXMuX2xhdW5jaGVyVmlldy5zaG93KHRoaXMucHJvZmlsZVZpZXdzKTt0aGlzLnZpc2libGVWaWV3PXRoaXMuX2xhdW5jaGVyVmlldzt0aGlzLl90b29sYmFyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt9Cl9yZWdpc3RlclByb2ZpbGVUeXBlKHByb2ZpbGVUeXBlKXt0aGlzLl9sYXVuY2hlclZpZXcuYWRkUHJvZmlsZVR5cGUocHJvZmlsZVR5cGUpO2NvbnN0IHByb2ZpbGVUeXBlU2VjdGlvbj1uZXcgUHJvZmlsZXIuUHJvZmlsZVR5cGVTaWRlYmFyU2VjdGlvbih0aGlzLHByb2ZpbGVUeXBlKTt0aGlzLl90eXBlSWRUb1NpZGViYXJTZWN0aW9uW3Byb2ZpbGVUeXBlLmlkXT1wcm9maWxlVHlwZVNlY3Rpb247dGhpcy5fc2lkZWJhclRyZWUuYXBwZW5kQ2hpbGQocHJvZmlsZVR5cGVTZWN0aW9uKTtwcm9maWxlVHlwZVNlY3Rpb24uY2hpbGRyZW5MaXN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTtmdW5jdGlvbiBvbkFkZFByb2ZpbGVIZWFkZXIoZXZlbnQpe3RoaXMuX2FkZFByb2ZpbGVIZWFkZXIoKGV2ZW50LmRhdGEpKTt9CmZ1bmN0aW9uIG9uUmVtb3ZlUHJvZmlsZUhlYWRlcihldmVudCl7dGhpcy5fcmVtb3ZlUHJvZmlsZUhlYWRlcigoZXZlbnQuZGF0YSkpO30KZnVuY3Rpb24gcHJvZmlsZUNvbXBsZXRlKGV2ZW50KXt0aGlzLnNob3dQcm9maWxlKChldmVudC5kYXRhKSk7fQpwcm9maWxlVHlwZS5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLlByb2ZpbGVUeXBlLkV2ZW50cy5WaWV3VXBkYXRlZCx0aGlzLl91cGRhdGVQcm9maWxlVHlwZVNwZWNpZmljVUksdGhpcyk7cHJvZmlsZVR5cGUuYWRkRXZlbnRMaXN0ZW5lcihQcm9maWxlci5Qcm9maWxlVHlwZS5FdmVudHMuQWRkUHJvZmlsZUhlYWRlcixvbkFkZFByb2ZpbGVIZWFkZXIsdGhpcyk7cHJvZmlsZVR5cGUuYWRkRXZlbnRMaXN0ZW5lcihQcm9maWxlci5Qcm9maWxlVHlwZS5FdmVudHMuUmVtb3ZlUHJvZmlsZUhlYWRlcixvblJlbW92ZVByb2ZpbGVIZWFkZXIsdGhpcyk7cHJvZmlsZVR5cGUuYWRkRXZlbnRMaXN0ZW5lcihQcm9maWxlci5Qcm9maWxlVHlwZS5FdmVudHMuUHJvZmlsZUNvbXBsZXRlLHByb2ZpbGVDb21wbGV0ZSx0aGlzKTtjb25zdCBwcm9maWxlcz1wcm9maWxlVHlwZS5nZXRQcm9maWxlcygpO2ZvcihsZXQgaT0wO2k8cHJvZmlsZXMubGVuZ3RoO2krKykKdGhpcy5fYWRkUHJvZmlsZUhlYWRlcihwcm9maWxlc1tpXSk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtpZih0aGlzLnBhbmVsU2lkZWJhckVsZW1lbnQoKS5pc1NlbGZPckFuY2VzdG9yKGV2ZW50LnNyY0VsZW1lbnQpKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdMb2FkXHUyMDI2JyksdGhpcy5fZmlsZVNlbGVjdG9yRWxlbWVudC5jbGljay5iaW5kKHRoaXMuX2ZpbGVTZWxlY3RvckVsZW1lbnQpKTt9CmNvbnRleHRNZW51LnNob3coKTt9CnNob3dMb2FkRnJvbUZpbGVEaWFsb2coKXt0aGlzLl9maWxlU2VsZWN0b3JFbGVtZW50LmNsaWNrKCk7fQpfYWRkUHJvZmlsZUhlYWRlcihwcm9maWxlKXtjb25zdCBwcm9maWxlVHlwZT1wcm9maWxlLnByb2ZpbGVUeXBlKCk7Y29uc3QgdHlwZUlkPXByb2ZpbGVUeXBlLmlkO3RoaXMuX3R5cGVJZFRvU2lkZWJhclNlY3Rpb25bdHlwZUlkXS5hZGRQcm9maWxlSGVhZGVyKHByb2ZpbGUpO2lmKCF0aGlzLnZpc2libGVWaWV3fHx0aGlzLnZpc2libGVWaWV3PT09dGhpcy5fbGF1bmNoZXJWaWV3KQp0aGlzLnNob3dQcm9maWxlKHByb2ZpbGUpO30KX3JlbW92ZVByb2ZpbGVIZWFkZXIocHJvZmlsZSl7aWYocHJvZmlsZS5wcm9maWxlVHlwZSgpLnByb2ZpbGVCZWluZ1JlY29yZGVkKCk9PT1wcm9maWxlKQp0aGlzLl9wcm9maWxlQmVpbmdSZWNvcmRlZFJlbW92ZWQoKTtjb25zdCBpPXRoaXMuX2luZGV4T2ZWaWV3Rm9yUHJvZmlsZShwcm9maWxlKTtpZihpIT09LTEpCnRoaXMuX3Byb2ZpbGVUb1ZpZXcuc3BsaWNlKGksMSk7Y29uc3QgcHJvZmlsZVR5cGU9cHJvZmlsZS5wcm9maWxlVHlwZSgpO2NvbnN0IHR5cGVJZD1wcm9maWxlVHlwZS5pZDtjb25zdCBzZWN0aW9uSXNFbXB0eT10aGlzLl90eXBlSWRUb1NpZGViYXJTZWN0aW9uW3R5cGVJZF0ucmVtb3ZlUHJvZmlsZUhlYWRlcihwcm9maWxlKTtpZihzZWN0aW9uSXNFbXB0eSl7dGhpcy5wcm9maWxlc0l0ZW1UcmVlRWxlbWVudC5zZWxlY3QoKTt0aGlzLl9zaG93TGF1bmNoZXJWaWV3KCk7fX0Kc2hvd1Byb2ZpbGUocHJvZmlsZSl7aWYoIXByb2ZpbGV8fChwcm9maWxlLnByb2ZpbGVUeXBlKCkucHJvZmlsZUJlaW5nUmVjb3JkZWQoKT09PXByb2ZpbGUpJiYhcHJvZmlsZS5wcm9maWxlVHlwZSgpLmhhc1RlbXBvcmFyeVZpZXcoKSkKcmV0dXJuIG51bGw7Y29uc3Qgdmlldz10aGlzLnZpZXdGb3JQcm9maWxlKHByb2ZpbGUpO2lmKHZpZXc9PT10aGlzLnZpc2libGVWaWV3KQpyZXR1cm4gdmlldzt0aGlzLmNsb3NlVmlzaWJsZVZpZXcoKTt2aWV3LnNob3codGhpcy5wcm9maWxlVmlld3MpO3ZpZXcuZm9jdXMoKTt0aGlzLl90b29sYmFyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLnZpc2libGVWaWV3PXZpZXc7Y29uc3QgcHJvZmlsZVR5cGVTZWN0aW9uPXRoaXMuX3R5cGVJZFRvU2lkZWJhclNlY3Rpb25bcHJvZmlsZS5wcm9maWxlVHlwZSgpLmlkXTtjb25zdCBzaWRlYmFyRWxlbWVudD1wcm9maWxlVHlwZVNlY3Rpb24uc2lkZWJhckVsZW1lbnRGb3JQcm9maWxlKHByb2ZpbGUpO3NpZGViYXJFbGVtZW50LnJldmVhbEFuZFNlbGVjdCgpO3RoaXMuX3Byb2ZpbGVWaWV3VG9vbGJhci5yZW1vdmVUb29sYmFySXRlbXMoKTtjb25zdCB0b29sYmFySXRlbXM9dmlldy5zeW5jVG9vbGJhckl0ZW1zKCk7Zm9yKGxldCBpPTA7aTx0b29sYmFySXRlbXMubGVuZ3RoOysraSkKdGhpcy5fcHJvZmlsZVZpZXdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRvb2xiYXJJdGVtc1tpXSk7cmV0dXJuIHZpZXc7fQpzaG93T2JqZWN0KHNuYXBzaG90T2JqZWN0SWQscGVyc3BlY3RpdmVOYW1lKXt9CmFzeW5jIGxpbmtpZnlPYmplY3Qoc25hcHNob3RPYmplY3RJZCl7cmV0dXJuIG51bGw7fQp2aWV3Rm9yUHJvZmlsZShwcm9maWxlKXtjb25zdCBpbmRleD10aGlzLl9pbmRleE9mVmlld0ZvclByb2ZpbGUocHJvZmlsZSk7aWYoaW5kZXghPT0tMSkKcmV0dXJuIHRoaXMuX3Byb2ZpbGVUb1ZpZXdbaW5kZXhdLnZpZXc7Y29uc3Qgdmlldz1wcm9maWxlLmNyZWF0ZVZpZXcodGhpcyk7dmlldy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Byb2ZpbGUtdmlldycpO3RoaXMuX3Byb2ZpbGVUb1ZpZXcucHVzaCh7cHJvZmlsZTpwcm9maWxlLHZpZXc6dmlld30pO3JldHVybiB2aWV3O30KX2luZGV4T2ZWaWV3Rm9yUHJvZmlsZShwcm9maWxlKXtmb3IobGV0IGk9MDtpPHRoaXMuX3Byb2ZpbGVUb1ZpZXcubGVuZ3RoO2krKyl7aWYodGhpcy5fcHJvZmlsZVRvVmlld1tpXS5wcm9maWxlPT09cHJvZmlsZSkKcmV0dXJuIGk7fQpyZXR1cm4tMTt9CmNsb3NlVmlzaWJsZVZpZXcoKXtpZih0aGlzLnZpc2libGVWaWV3KQp0aGlzLnZpc2libGVWaWV3LmRldGFjaCgpO2RlbGV0ZSB0aGlzLnZpc2libGVWaWV3O30KZm9jdXMoKXt0aGlzLl9zaWRlYmFyVHJlZS5mb2N1cygpO319O1Byb2ZpbGVyLlByb2ZpbGVUeXBlU2lkZWJhclNlY3Rpb249Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihkYXRhRGlzcGxheURlbGVnYXRlLHByb2ZpbGVUeXBlKXtzdXBlcihwcm9maWxlVHlwZS50cmVlSXRlbVRpdGxlLmVzY2FwZUhUTUwoKSx0cnVlKTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5fZGF0YURpc3BsYXlEZWxlZ2F0ZT1kYXRhRGlzcGxheURlbGVnYXRlO3RoaXMuX3Byb2ZpbGVUcmVlRWxlbWVudHM9W107dGhpcy5fcHJvZmlsZUdyb3Vwcz17fTt0aGlzLmV4cGFuZCgpO3RoaXMuaGlkZGVuPXRydWU7dGhpcy5zZXRDb2xsYXBzaWJsZShmYWxzZSk7fQphZGRQcm9maWxlSGVhZGVyKHByb2ZpbGUpe3RoaXMuaGlkZGVuPWZhbHNlO2NvbnN0IHByb2ZpbGVUeXBlPXByb2ZpbGUucHJvZmlsZVR5cGUoKTtsZXQgc2lkZWJhclBhcmVudD10aGlzO2NvbnN0IHByb2ZpbGVUcmVlRWxlbWVudD1wcm9maWxlLmNyZWF0ZVNpZGViYXJUcmVlRWxlbWVudCh0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlKTt0aGlzLl9wcm9maWxlVHJlZUVsZW1lbnRzLnB1c2gocHJvZmlsZVRyZWVFbGVtZW50KTtpZighcHJvZmlsZS5mcm9tRmlsZSgpJiZwcm9maWxlVHlwZS5wcm9maWxlQmVpbmdSZWNvcmRlZCgpIT09cHJvZmlsZSl7Y29uc3QgcHJvZmlsZVRpdGxlPXByb2ZpbGUudGl0bGU7bGV0IGdyb3VwPXRoaXMuX3Byb2ZpbGVHcm91cHNbcHJvZmlsZVRpdGxlXTtpZighZ3JvdXApe2dyb3VwPW5ldyBQcm9maWxlci5Qcm9maWxlVHlwZVNpZGViYXJTZWN0aW9uLlByb2ZpbGVHcm91cCgpO3RoaXMuX3Byb2ZpbGVHcm91cHNbcHJvZmlsZVRpdGxlXT1ncm91cDt9Cmdyb3VwLnByb2ZpbGVTaWRlYmFyVHJlZUVsZW1lbnRzLnB1c2gocHJvZmlsZVRyZWVFbGVtZW50KTtjb25zdCBncm91cFNpemU9Z3JvdXAucHJvZmlsZVNpZGViYXJUcmVlRWxlbWVudHMubGVuZ3RoO2lmKGdyb3VwU2l6ZT09PTIpe2dyb3VwLnNpZGViYXJUcmVlRWxlbWVudD1uZXcgUHJvZmlsZXIuUHJvZmlsZUdyb3VwU2lkZWJhclRyZWVFbGVtZW50KHRoaXMuX2RhdGFEaXNwbGF5RGVsZWdhdGUscHJvZmlsZS50aXRsZSk7Y29uc3QgZmlyc3RQcm9maWxlVHJlZUVsZW1lbnQ9Z3JvdXAucHJvZmlsZVNpZGViYXJUcmVlRWxlbWVudHNbMF07Y29uc3QgaW5kZXg9dGhpcy5jaGlsZHJlbigpLmluZGV4T2YoZmlyc3RQcm9maWxlVHJlZUVsZW1lbnQpO3RoaXMuaW5zZXJ0Q2hpbGQoZ3JvdXAuc2lkZWJhclRyZWVFbGVtZW50LGluZGV4KTtjb25zdCBzZWxlY3RlZD1maXJzdFByb2ZpbGVUcmVlRWxlbWVudC5zZWxlY3RlZDt0aGlzLnJlbW92ZUNoaWxkKGZpcnN0UHJvZmlsZVRyZWVFbGVtZW50KTtncm91cC5zaWRlYmFyVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZmlyc3RQcm9maWxlVHJlZUVsZW1lbnQpO2lmKHNlbGVjdGVkKQpmaXJzdFByb2ZpbGVUcmVlRWxlbWVudC5yZXZlYWxBbmRTZWxlY3QoKTtmaXJzdFByb2ZpbGVUcmVlRWxlbWVudC5zZXRTbWFsbCh0cnVlKTtmaXJzdFByb2ZpbGVUcmVlRWxlbWVudC5zZXRNYWluVGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdSdW4gJWQnLDEpKTt0aGlzLnRyZWVPdXRsaW5lLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc29tZS1leHBhbmRhYmxlJyk7fQppZihncm91cFNpemU+PTIpe3NpZGViYXJQYXJlbnQ9Z3JvdXAuc2lkZWJhclRyZWVFbGVtZW50O3Byb2ZpbGVUcmVlRWxlbWVudC5zZXRTbWFsbCh0cnVlKTtwcm9maWxlVHJlZUVsZW1lbnQuc2V0TWFpblRpdGxlKENvbW1vbi5VSVN0cmluZygnUnVuICVkJyxncm91cFNpemUpKTt9fQpzaWRlYmFyUGFyZW50LmFwcGVuZENoaWxkKHByb2ZpbGVUcmVlRWxlbWVudCk7fQpyZW1vdmVQcm9maWxlSGVhZGVyKHByb2ZpbGUpe2NvbnN0IGluZGV4PXRoaXMuX3NpZGViYXJFbGVtZW50SW5kZXgocHJvZmlsZSk7aWYoaW5kZXg9PT0tMSkKcmV0dXJuIGZhbHNlO2NvbnN0IHByb2ZpbGVUcmVlRWxlbWVudD10aGlzLl9wcm9maWxlVHJlZUVsZW1lbnRzW2luZGV4XTt0aGlzLl9wcm9maWxlVHJlZUVsZW1lbnRzLnNwbGljZShpbmRleCwxKTtsZXQgc2lkZWJhclBhcmVudD10aGlzO2NvbnN0IGdyb3VwPXRoaXMuX3Byb2ZpbGVHcm91cHNbcHJvZmlsZS50aXRsZV07aWYoZ3JvdXApe2NvbnN0IGdyb3VwRWxlbWVudHM9Z3JvdXAucHJvZmlsZVNpZGViYXJUcmVlRWxlbWVudHM7Z3JvdXBFbGVtZW50cy5zcGxpY2UoZ3JvdXBFbGVtZW50cy5pbmRleE9mKHByb2ZpbGVUcmVlRWxlbWVudCksMSk7aWYoZ3JvdXBFbGVtZW50cy5sZW5ndGg9PT0xKXtjb25zdCBwb3M9c2lkZWJhclBhcmVudC5jaGlsZHJlbigpLmluZGV4T2YoKGdyb3VwLnNpZGViYXJUcmVlRWxlbWVudCkpO2dyb3VwLnNpZGViYXJUcmVlRWxlbWVudC5yZW1vdmVDaGlsZChncm91cEVsZW1lbnRzWzBdKTt0aGlzLmluc2VydENoaWxkKGdyb3VwRWxlbWVudHNbMF0scG9zKTtncm91cEVsZW1lbnRzWzBdLnNldFNtYWxsKGZhbHNlKTtncm91cEVsZW1lbnRzWzBdLnNldE1haW5UaXRsZShwcm9maWxlLnRpdGxlKTt0aGlzLnJlbW92ZUNoaWxkKGdyb3VwLnNpZGViYXJUcmVlRWxlbWVudCk7fQppZihncm91cEVsZW1lbnRzLmxlbmd0aCE9PTApCnNpZGViYXJQYXJlbnQ9Z3JvdXAuc2lkZWJhclRyZWVFbGVtZW50O30Kc2lkZWJhclBhcmVudC5yZW1vdmVDaGlsZChwcm9maWxlVHJlZUVsZW1lbnQpO3Byb2ZpbGVUcmVlRWxlbWVudC5kaXNwb3NlKCk7aWYodGhpcy5jaGlsZENvdW50KCkpCnJldHVybiBmYWxzZTt0aGlzLmhpZGRlbj10cnVlO3JldHVybiB0cnVlO30Kc2lkZWJhckVsZW1lbnRGb3JQcm9maWxlKHByb2ZpbGUpe2NvbnN0IGluZGV4PXRoaXMuX3NpZGViYXJFbGVtZW50SW5kZXgocHJvZmlsZSk7cmV0dXJuIGluZGV4PT09LTE/bnVsbDp0aGlzLl9wcm9maWxlVHJlZUVsZW1lbnRzW2luZGV4XTt9Cl9zaWRlYmFyRWxlbWVudEluZGV4KHByb2ZpbGUpe2NvbnN0IGVsZW1lbnRzPXRoaXMuX3Byb2ZpbGVUcmVlRWxlbWVudHM7Zm9yKGxldCBpPTA7aTxlbGVtZW50cy5sZW5ndGg7aSsrKXtpZihlbGVtZW50c1tpXS5wcm9maWxlPT09cHJvZmlsZSkKcmV0dXJuIGk7fQpyZXR1cm4tMTt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncHJvZmlsZXMtdHJlZS1zZWN0aW9uJyk7fX07UHJvZmlsZXIuUHJvZmlsZVR5cGVTaWRlYmFyU2VjdGlvbi5Qcm9maWxlR3JvdXA9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnByb2ZpbGVTaWRlYmFyVHJlZUVsZW1lbnRzPVtdO3RoaXMuc2lkZWJhclRyZWVFbGVtZW50PW51bGw7fX07UHJvZmlsZXIuUHJvZmlsZVNpZGViYXJUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKGRhdGFEaXNwbGF5RGVsZWdhdGUscHJvZmlsZSxjbGFzc05hbWUpe3N1cGVyKCcnLGZhbHNlKTt0aGlzLl9pY29uRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdpY29uJyk7dGhpcy5fdGl0bGVzRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0aXRsZXMgbm8tc3VidGl0bGUnKTt0aGlzLl90aXRsZUNvbnRhaW5lcj10aGlzLl90aXRsZXNFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywndGl0bGUtY29udGFpbmVyJyk7dGhpcy5fdGl0bGVFbGVtZW50PXRoaXMuX3RpdGxlQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdzcGFuJywndGl0bGUnKTt0aGlzLl9zdWJ0aXRsZUVsZW1lbnQ9dGhpcy5fdGl0bGVzRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3N1YnRpdGxlJyk7dGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50PXByb2ZpbGUudGl0bGU7dGhpcy5fY2xhc3NOYW1lPWNsYXNzTmFtZTt0aGlzLl9zbWFsbD1mYWxzZTt0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlPWRhdGFEaXNwbGF5RGVsZWdhdGU7dGhpcy5wcm9maWxlPXByb2ZpbGU7cHJvZmlsZS5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuRXZlbnRzLlVwZGF0ZVN0YXR1cyx0aGlzLl91cGRhdGVTdGF0dXMsdGhpcyk7aWYocHJvZmlsZS5jYW5TYXZlVG9GaWxlKCkpCnRoaXMuX2NyZWF0ZVNhdmVMaW5rKCk7ZWxzZQpwcm9maWxlLmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHMuUHJvZmlsZVJlY2VpdmVkLHRoaXMuX29uUHJvZmlsZVJlY2VpdmVkLHRoaXMpO30KX2NyZWF0ZVNhdmVMaW5rKCl7dGhpcy5fc2F2ZUxpbmtFbGVtZW50PXRoaXMuX3RpdGxlQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdzcGFuJywnc2F2ZS1saW5rJyk7dGhpcy5fc2F2ZUxpbmtFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnU2F2ZScpO3RoaXMuX3NhdmVMaW5rRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fc2F2ZVByb2ZpbGUuYmluZCh0aGlzKSxmYWxzZSk7fQpfb25Qcm9maWxlUmVjZWl2ZWQoZXZlbnQpe3RoaXMuX2NyZWF0ZVNhdmVMaW5rKCk7fQpfdXBkYXRlU3RhdHVzKGV2ZW50KXtjb25zdCBzdGF0dXNVcGRhdGU9ZXZlbnQuZGF0YTtpZihzdGF0dXNVcGRhdGUuc3VidGl0bGUhPT1udWxsKXt0aGlzLl9zdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9c3RhdHVzVXBkYXRlLnN1YnRpdGxlfHwnJzt0aGlzLl90aXRsZXNFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ25vLXN1YnRpdGxlJywhc3RhdHVzVXBkYXRlLnN1YnRpdGxlKTt9CmlmKHR5cGVvZiBzdGF0dXNVcGRhdGUud2FpdD09PSdib29sZWFuJyYmdGhpcy5saXN0SXRlbUVsZW1lbnQpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3dhaXQnLHN0YXR1c1VwZGF0ZS53YWl0KTt9Cm9uZGJsY2xpY2soZXZlbnQpe2lmKCF0aGlzLl9lZGl0aW5nKQp0aGlzLl9zdGFydEVkaXRpbmcoKGV2ZW50LnRhcmdldCkpO3JldHVybiBmYWxzZTt9Cl9zdGFydEVkaXRpbmcoZXZlbnRUYXJnZXQpe2NvbnN0IGNvbnRhaW5lcj1ldmVudFRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCd0aXRsZScpO2lmKCFjb250YWluZXIpCnJldHVybjtjb25zdCBjb25maWc9bmV3IFVJLklucGxhY2VFZGl0b3IuQ29uZmlnKHRoaXMuX2VkaXRpbmdDb21taXR0ZWQuYmluZCh0aGlzKSx0aGlzLl9lZGl0aW5nQ2FuY2VsbGVkLmJpbmQodGhpcykpO3RoaXMuX2VkaXRpbmc9VUkuSW5wbGFjZUVkaXRvci5zdGFydEVkaXRpbmcoY29udGFpbmVyLGNvbmZpZyk7fQpfZWRpdGluZ0NvbW1pdHRlZChjb250YWluZXIsbmV3VGl0bGUpe2RlbGV0ZSB0aGlzLl9lZGl0aW5nO3RoaXMucHJvZmlsZS5zZXRUaXRsZShuZXdUaXRsZSk7fQpfZWRpdGluZ0NhbmNlbGxlZCgpe2RlbGV0ZSB0aGlzLl9lZGl0aW5nO30KZGlzcG9zZSgpe3RoaXMucHJvZmlsZS5yZW1vdmVFdmVudExpc3RlbmVyKFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuRXZlbnRzLlVwZGF0ZVN0YXR1cyx0aGlzLl91cGRhdGVTdGF0dXMsdGhpcyk7dGhpcy5wcm9maWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHMuUHJvZmlsZVJlY2VpdmVkLHRoaXMuX29uUHJvZmlsZVJlY2VpdmVkLHRoaXMpO30Kb25zZWxlY3QoKXt0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlLnNob3dQcm9maWxlKHRoaXMucHJvZmlsZSk7cmV0dXJuIHRydWU7fQpvbmRlbGV0ZSgpe3RoaXMucHJvZmlsZS5wcm9maWxlVHlwZSgpLnJlbW92ZVByb2ZpbGUodGhpcy5wcm9maWxlKTtyZXR1cm4gdHJ1ZTt9Cm9uYXR0YWNoKCl7aWYodGhpcy5fY2xhc3NOYW1lKQp0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuX2NsYXNzTmFtZSk7aWYodGhpcy5fc21hbGwpCnRoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtYWxsJyk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGRyZW4odGhpcy5faWNvbkVsZW1lbnQsdGhpcy5fdGl0bGVzRWxlbWVudCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXZlbnQuYmluZCh0aGlzKSx0cnVlKTt9Cl9oYW5kbGVDb250ZXh0TWVudUV2ZW50KGV2ZW50KXtjb25zdCBwcm9maWxlPXRoaXMucHJvZmlsZTtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnRleHRNZW51LmhlYWRlclNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnTG9hZFx1MjAyNicpLFByb2ZpbGVyLlByb2ZpbGVzUGFuZWwuX2ZpbGVTZWxlY3RvckVsZW1lbnQuY2xpY2suYmluZChQcm9maWxlci5Qcm9maWxlc1BhbmVsLl9maWxlU2VsZWN0b3JFbGVtZW50KSk7aWYocHJvZmlsZS5jYW5TYXZlVG9GaWxlKCkpCmNvbnRleHRNZW51LnNhdmVTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1NhdmVcdTIwMjYnKSxwcm9maWxlLnNhdmVUb0ZpbGUuYmluZChwcm9maWxlKSk7Y29udGV4dE1lbnUuZm9vdGVyU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdEZWxldGUnKSx0aGlzLm9uZGVsZXRlLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9zYXZlUHJvZmlsZShldmVudCl7dGhpcy5wcm9maWxlLnNhdmVUb0ZpbGUoKTt9CnNldFNtYWxsKHNtYWxsKXt0aGlzLl9zbWFsbD1zbWFsbDtpZih0aGlzLmxpc3RJdGVtRWxlbWVudCkKdGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc21hbGwnLHRoaXMuX3NtYWxsKTt9CnNldE1haW5UaXRsZSh0aXRsZSl7dGhpcy5fdGl0bGVFbGVtZW50LnRleHRDb250ZW50PXRpdGxlO319O1Byb2ZpbGVyLlByb2ZpbGVHcm91cFNpZGViYXJUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKGRhdGFEaXNwbGF5RGVsZWdhdGUsdGl0bGUpe3N1cGVyKCcnLHRydWUpO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlPWRhdGFEaXNwbGF5RGVsZWdhdGU7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5leHBhbmQoKTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt9Cm9uc2VsZWN0KCl7Y29uc3QgaGFzQ2hpbGRyZW49dGhpcy5jaGlsZENvdW50KCk+MDtpZihoYXNDaGlsZHJlbikKdGhpcy5fZGF0YURpc3BsYXlEZWxlZ2F0ZS5zaG93UHJvZmlsZSh0aGlzLmxhc3RDaGlsZCgpLnByb2ZpbGUpO3JldHVybiBoYXNDaGlsZHJlbjt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncHJvZmlsZS1ncm91cC1zaWRlYmFyLXRyZWUtaXRlbScpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdpY29uJyk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpdGxlcyBuby1zdWJ0aXRsZScpLmNyZWF0ZUNoaWxkKCdzcGFuJywndGl0bGUtY29udGFpbmVyJykuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd0aXRsZScpLnRleHRDb250ZW50PXRoaXMuX3RpdGxlO319O1Byb2ZpbGVyLlByb2ZpbGVzU2lkZWJhclRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3IocGFuZWwpe3N1cGVyKCcnLGZhbHNlKTt0aGlzLnNlbGVjdGFibGU9dHJ1ZTt0aGlzLl9wYW5lbD1wYW5lbDt9Cm9uc2VsZWN0KCl7dGhpcy5fcGFuZWwuX3Nob3dMYXVuY2hlclZpZXcoKTtyZXR1cm4gdHJ1ZTt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncHJvZmlsZS1sYXVuY2hlci12aWV3LXRyZWUtaXRlbScpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdpY29uJyk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpdGxlcyBuby1zdWJ0aXRsZScpLmNyZWF0ZUNoaWxkKCdzcGFuJywndGl0bGUtY29udGFpbmVyJykuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd0aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUHJvZmlsZXMnKTt9fTtQcm9maWxlci5KU1Byb2ZpbGVyUGFuZWw9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5Qcm9maWxlc1BhbmVse2NvbnN0cnVjdG9yKCl7Y29uc3QgcmVnaXN0cnk9UHJvZmlsZXIuUHJvZmlsZVR5cGVSZWdpc3RyeS5pbnN0YW5jZTtzdXBlcignanNfcHJvZmlsZXInLFtyZWdpc3RyeS5jcHVQcm9maWxlVHlwZV0sJ3Byb2ZpbGVyLmpzLXRvZ2dsZS1yZWNvcmRpbmcnKTt9Cndhc1Nob3duKCl7VUkuY29udGV4dC5zZXRGbGF2b3IoUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsLHRoaXMpO30Kd2lsbEhpZGUoKXtVSS5jb250ZXh0LnNldEZsYXZvcihQcm9maWxlci5KU1Byb2ZpbGVyUGFuZWwsbnVsbCk7fQpoYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7Y29uc3QgcGFuZWw9VUkuY29udGV4dC5mbGF2b3IoUHJvZmlsZXIuSlNQcm9maWxlclBhbmVsKTtjb25zb2xlLmFzc2VydChwYW5lbCYmcGFuZWwgaW5zdGFuY2VvZiBQcm9maWxlci5KU1Byb2ZpbGVyUGFuZWwpO3BhbmVsLnRvZ2dsZVJlY29yZCgpO3JldHVybiB0cnVlO319OztQcm9maWxlci5Qcm9maWxlVmlldz1jbGFzcyBleHRlbmRzIFVJLlNpbXBsZVZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ1Byb2ZpbGUnKSk7dGhpcy5fc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KHRoaXMpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNldFBsYWNlaG9sZGVyKENvbW1vbi5VSVN0cmluZygnRmluZCBieSBjb3N0ICg+NTBtcyksIG5hbWUgb3IgZmlsZScpKTt0aGlzLl9zZWFyY2hhYmxlVmlldy5zaG93KHRoaXMuZWxlbWVudCk7Y29uc3QgY29sdW1ucz0oW10pO2NvbHVtbnMucHVzaCh7aWQ6J3NlbGYnLHRpdGxlOnRoaXMuY29sdW1uSGVhZGVyKCdzZWxmJyksd2lkdGg6JzEyMHB4JyxmaXhlZFdpZHRoOnRydWUsc29ydGFibGU6dHJ1ZSxzb3J0OkRhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmd9KTtjb2x1bW5zLnB1c2goe2lkOid0b3RhbCcsdGl0bGU6dGhpcy5jb2x1bW5IZWFkZXIoJ3RvdGFsJyksd2lkdGg6JzEyMHB4JyxmaXhlZFdpZHRoOnRydWUsc29ydGFibGU6dHJ1ZX0pO2NvbHVtbnMucHVzaCh7aWQ6J2Z1bmN0aW9uJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0Z1bmN0aW9uJyksZGlzY2xvc3VyZTp0cnVlLHNvcnRhYmxlOnRydWV9KTt0aGlzLmRhdGFHcmlkPW5ldyBEYXRhR3JpZC5EYXRhR3JpZChjb2x1bW5zKTt0aGlzLmRhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDaGFuZ2VkLHRoaXMuX3NvcnRQcm9maWxlLHRoaXMpO3RoaXMuZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU2VsZWN0ZWROb2RlLHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMsdHJ1ZSkpO3RoaXMuZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuRGVzZWxlY3RlZE5vZGUsdGhpcy5fbm9kZVNlbGVjdGVkLmJpbmQodGhpcyxmYWxzZSkpO3RoaXMudmlld1NlbGVjdENvbWJvQm94PW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3godGhpcy5fY2hhbmdlVmlldy5iaW5kKHRoaXMpKTt0aGlzLmZvY3VzQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnRm9jdXMgc2VsZWN0ZWQgZnVuY3Rpb24nKSwnbGFyZ2VpY29uLXZpc2liaWxpdHknKTt0aGlzLmZvY3VzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuZm9jdXNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9mb2N1c0NsaWNrZWQsdGhpcyk7dGhpcy5leGNsdWRlQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnRXhjbHVkZSBzZWxlY3RlZCBmdW5jdGlvbicpLCdsYXJnZWljb24tZGVsZXRlJyk7dGhpcy5leGNsdWRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuZXhjbHVkZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2V4Y2x1ZGVDbGlja2VkLHRoaXMpO3RoaXMucmVzZXRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZXN0b3JlIGFsbCBmdW5jdGlvbnMnKSwnbGFyZ2VpY29uLXJlZnJlc2gnKTt0aGlzLnJlc2V0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMucmVzZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9yZXNldENsaWNrZWQsdGhpcyk7dGhpcy5fbGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcihQcm9maWxlci5Qcm9maWxlVmlldy5fbWF4TGlua0xlbmd0aCk7fQpzdGF0aWMgYnVpbGRQb3BvdmVyVGFibGUoZW50cnlJbmZvKXtjb25zdCB0YWJsZT1jcmVhdGVFbGVtZW50KCd0YWJsZScpO2Zvcihjb25zdCBlbnRyeSBvZiBlbnRyeUluZm8pe2NvbnN0IHJvdz10YWJsZS5jcmVhdGVDaGlsZCgndHInKTtyb3cuY3JlYXRlQ2hpbGQoJ3RkJykudGV4dENvbnRlbnQ9ZW50cnkudGl0bGU7cm93LmNyZWF0ZUNoaWxkKCd0ZCcpLnRleHRDb250ZW50PWVudHJ5LnZhbHVlO30KcmV0dXJuIHRhYmxlO30KaW5pdGlhbGl6ZShub2RlRm9ybWF0dGVyLHZpZXdUeXBlcyl7dGhpcy5fbm9kZUZvcm1hdHRlcj1ub2RlRm9ybWF0dGVyO3RoaXMuX3ZpZXdUeXBlPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdwcm9maWxlVmlldycsUHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLkhlYXZ5KTt2aWV3VHlwZXM9dmlld1R5cGVzfHxbUHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLkZsYW1lLFByb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5IZWF2eSxQcm9maWxlci5Qcm9maWxlVmlldy5WaWV3VHlwZXMuVHJlZV07Y29uc3Qgb3B0aW9uTmFtZXM9bmV3IE1hcChbW1Byb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5GbGFtZSxsc2BDaGFydGBdLFtQcm9maWxlci5Qcm9maWxlVmlldy5WaWV3VHlwZXMuSGVhdnksbHNgSGVhdnkgKEJvdHRvbSBVcClgXSxbUHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLlRyZWUsbHNgVHJlZSAoVG9wIERvd24pYF0sW1Byb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5UZXh0LGxzYFRleHQgKFRvcCBEb3duKWBdLF0pO2NvbnN0IG9wdGlvbnM9bmV3IE1hcCh2aWV3VHlwZXMubWFwKHR5cGU9Plt0eXBlLHRoaXMudmlld1NlbGVjdENvbWJvQm94LmNyZWF0ZU9wdGlvbihvcHRpb25OYW1lcy5nZXQodHlwZSksJycsdHlwZSldKSk7Y29uc3Qgb3B0aW9uTmFtZT10aGlzLl92aWV3VHlwZS5nZXQoKXx8dmlld1R5cGVzWzBdO2NvbnN0IG9wdGlvbj1vcHRpb25zLmdldChvcHRpb25OYW1lKXx8b3B0aW9ucy5nZXQodmlld1R5cGVzWzBdKTt0aGlzLnZpZXdTZWxlY3RDb21ib0JveC5zZWxlY3Qob3B0aW9uKTt0aGlzLl9jaGFuZ2VWaWV3KCk7aWYodGhpcy5fZmxhbWVDaGFydCkKdGhpcy5fZmxhbWVDaGFydC51cGRhdGUoKTt9CmZvY3VzKCl7aWYodGhpcy5fZmxhbWVDaGFydCkKdGhpcy5fZmxhbWVDaGFydC5mb2N1cygpO2Vsc2UKc3VwZXIuZm9jdXMoKTt9CmNvbHVtbkhlYWRlcihjb2x1bW5JZCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9CnNlbGVjdFJhbmdlKHRpbWVMZWZ0LHRpbWVSaWdodCl7aWYoIXRoaXMuX2ZsYW1lQ2hhcnQpCnJldHVybjt0aGlzLl9mbGFtZUNoYXJ0LnNlbGVjdFJhbmdlKHRpbWVMZWZ0LHRpbWVSaWdodCk7fQpzeW5jVG9vbGJhckl0ZW1zKCl7cmV0dXJuW3RoaXMudmlld1NlbGVjdENvbWJvQm94LHRoaXMuZm9jdXNCdXR0b24sdGhpcy5leGNsdWRlQnV0dG9uLHRoaXMucmVzZXRCdXR0b25dO30KX2dldEJvdHRvbVVwUHJvZmlsZURhdGFHcmlkVHJlZSgpe2lmKCF0aGlzLl9ib3R0b21VcFByb2ZpbGVEYXRhR3JpZFRyZWUpe3RoaXMuX2JvdHRvbVVwUHJvZmlsZURhdGFHcmlkVHJlZT1uZXcgUHJvZmlsZXIuQm90dG9tVXBQcm9maWxlRGF0YUdyaWRUcmVlKHRoaXMuX25vZGVGb3JtYXR0ZXIsdGhpcy5fc2VhcmNoYWJsZVZpZXcsdGhpcy5wcm9maWxlLnJvb3QsdGhpcy5hZGp1c3RlZFRvdGFsKTt9CnJldHVybiB0aGlzLl9ib3R0b21VcFByb2ZpbGVEYXRhR3JpZFRyZWU7fQpfZ2V0VG9wRG93blByb2ZpbGVEYXRhR3JpZFRyZWUoKXtpZighdGhpcy5fdG9wRG93blByb2ZpbGVEYXRhR3JpZFRyZWUpe3RoaXMuX3RvcERvd25Qcm9maWxlRGF0YUdyaWRUcmVlPW5ldyBQcm9maWxlci5Ub3BEb3duUHJvZmlsZURhdGFHcmlkVHJlZSh0aGlzLl9ub2RlRm9ybWF0dGVyLHRoaXMuX3NlYXJjaGFibGVWaWV3LHRoaXMucHJvZmlsZS5yb290LHRoaXMuYWRqdXN0ZWRUb3RhbCk7fQpyZXR1cm4gdGhpcy5fdG9wRG93blByb2ZpbGVEYXRhR3JpZFRyZWU7fQp3aWxsSGlkZSgpe3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0tMTt9CnJlZnJlc2goKXtjb25zdCBzZWxlY3RlZFByb2ZpbGVOb2RlPXRoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlP3RoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlLnByb2ZpbGVOb2RlOm51bGw7dGhpcy5kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgY2hpbGRyZW49dGhpcy5wcm9maWxlRGF0YUdyaWRUcmVlLmNoaWxkcmVuO2NvbnN0IGNvdW50PWNoaWxkcmVuLmxlbmd0aDtmb3IobGV0IGluZGV4PTA7aW5kZXg8Y291bnQ7KytpbmRleCkKdGhpcy5kYXRhR3JpZC5yb290Tm9kZSgpLmFwcGVuZENoaWxkKGNoaWxkcmVuW2luZGV4XSk7aWYoc2VsZWN0ZWRQcm9maWxlTm9kZSkKc2VsZWN0ZWRQcm9maWxlTm9kZS5zZWxlY3RlZD10cnVlO30KcmVmcmVzaFZpc2libGVEYXRhKCl7bGV0IGNoaWxkPXRoaXMuZGF0YUdyaWQucm9vdE5vZGUoKS5jaGlsZHJlblswXTt3aGlsZShjaGlsZCl7Y2hpbGQucmVmcmVzaCgpO2NoaWxkPWNoaWxkLnRyYXZlcnNlTmV4dE5vZGUoZmFsc2UsbnVsbCx0cnVlKTt9fQpzZWFyY2hhYmxlVmlldygpe3JldHVybiB0aGlzLl9zZWFyY2hhYmxlVmlldzt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiBmYWxzZTt9CnNlYXJjaENhbmNlbGVkKCl7dGhpcy5fc2VhcmNoYWJsZUVsZW1lbnQuc2VhcmNoQ2FuY2VsZWQoKTt9CnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7dGhpcy5fc2VhcmNoYWJsZUVsZW1lbnQucGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKTt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXt0aGlzLl9zZWFyY2hhYmxlRWxlbWVudC5qdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCk7fQpqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpe3RoaXMuX3NlYXJjaGFibGVFbGVtZW50Lmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCk7fQpsaW5raWZpZXIoKXtyZXR1cm4gdGhpcy5fbGlua2lmaWVyO30KX2Vuc3VyZVRleHRWaWV3Q3JlYXRlZCgpe2lmKHRoaXMuX3RleHRWaWV3KQpyZXR1cm47dGhpcy5fdGV4dFZpZXc9bmV3IFVJLlNpbXBsZVZpZXcobHNgQ2FsbCB0cmVlYCk7dGhpcy5fdGV4dFZpZXcucmVnaXN0ZXJSZXF1aXJlZENTUygncHJvZmlsZXIvcHJvZmlsZXNQYW5lbC5jc3MnKTt0aGlzLnBvcHVsYXRlVGV4dFZpZXcodGhpcy5fdGV4dFZpZXcpO30KcG9wdWxhdGVUZXh0Vmlldyh2aWV3KXt9CmNyZWF0ZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIoKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KX2Vuc3VyZUZsYW1lQ2hhcnRDcmVhdGVkKCl7aWYodGhpcy5fZmxhbWVDaGFydCkKcmV0dXJuO3RoaXMuX2RhdGFQcm92aWRlcj10aGlzLmNyZWF0ZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIoKTt0aGlzLl9mbGFtZUNoYXJ0PW5ldyBQcm9maWxlci5DUFVQcm9maWxlRmxhbWVDaGFydCh0aGlzLl9zZWFyY2hhYmxlVmlldyx0aGlzLl9kYXRhUHJvdmlkZXIpO3RoaXMuX2ZsYW1lQ2hhcnQuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlTZWxlY3RlZCx0aGlzLl9vbkVudHJ5U2VsZWN0ZWQuYmluZCh0aGlzKSk7fQpfb25FbnRyeVNlbGVjdGVkKGV2ZW50KXtjb25zdCBlbnRyeUluZGV4PWV2ZW50LmRhdGE7Y29uc3Qgbm9kZT10aGlzLl9kYXRhUHJvdmlkZXIuX2VudHJ5Tm9kZXNbZW50cnlJbmRleF07Y29uc3QgZGVidWdnZXJNb2RlbD10aGlzLl9wcm9maWxlSGVhZGVyLl9kZWJ1Z2dlck1vZGVsO2lmKCFub2RlfHwhbm9kZS5zY3JpcHRJZHx8IWRlYnVnZ2VyTW9kZWwpCnJldHVybjtjb25zdCBzY3JpcHQ9ZGVidWdnZXJNb2RlbC5zY3JpcHRGb3JJZChub2RlLnNjcmlwdElkKTtpZighc2NyaXB0KQpyZXR1cm47Y29uc3QgbG9jYXRpb249KGRlYnVnZ2VyTW9kZWwuY3JlYXRlUmF3TG9jYXRpb24oc2NyaXB0LG5vZGUubGluZU51bWJlcixub2RlLmNvbHVtbk51bWJlcikpO0NvbW1vbi5SZXZlYWxlci5yZXZlYWwoQmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKGxvY2F0aW9uKSk7fQpfY2hhbmdlVmlldygpe2lmKCF0aGlzLnByb2ZpbGUpCnJldHVybjt0aGlzLl9zZWFyY2hhYmxlVmlldy5jbG9zZVNlYXJjaCgpO2lmKHRoaXMuX3Zpc2libGVWaWV3KQp0aGlzLl92aXNpYmxlVmlldy5kZXRhY2goKTt0aGlzLl92aWV3VHlwZS5zZXQodGhpcy52aWV3U2VsZWN0Q29tYm9Cb3guc2VsZWN0ZWRPcHRpb24oKS52YWx1ZSk7c3dpdGNoKHRoaXMuX3ZpZXdUeXBlLmdldCgpKXtjYXNlIFByb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5GbGFtZTp0aGlzLl9lbnN1cmVGbGFtZUNoYXJ0Q3JlYXRlZCgpO3RoaXMuX3Zpc2libGVWaWV3PXRoaXMuX2ZsYW1lQ2hhcnQ7dGhpcy5fc2VhcmNoYWJsZUVsZW1lbnQ9dGhpcy5fZmxhbWVDaGFydDticmVhaztjYXNlIFByb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5UcmVlOnRoaXMucHJvZmlsZURhdGFHcmlkVHJlZT10aGlzLl9nZXRUb3BEb3duUHJvZmlsZURhdGFHcmlkVHJlZSgpO3RoaXMuX3NvcnRQcm9maWxlKCk7dGhpcy5fdmlzaWJsZVZpZXc9dGhpcy5kYXRhR3JpZC5hc1dpZGdldCgpO3RoaXMuX3NlYXJjaGFibGVFbGVtZW50PXRoaXMucHJvZmlsZURhdGFHcmlkVHJlZTticmVhaztjYXNlIFByb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5IZWF2eTp0aGlzLnByb2ZpbGVEYXRhR3JpZFRyZWU9dGhpcy5fZ2V0Qm90dG9tVXBQcm9maWxlRGF0YUdyaWRUcmVlKCk7dGhpcy5fc29ydFByb2ZpbGUoKTt0aGlzLl92aXNpYmxlVmlldz10aGlzLmRhdGFHcmlkLmFzV2lkZ2V0KCk7dGhpcy5fc2VhcmNoYWJsZUVsZW1lbnQ9dGhpcy5wcm9maWxlRGF0YUdyaWRUcmVlO2JyZWFrO2Nhc2UgUHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLlRleHQ6dGhpcy5fZW5zdXJlVGV4dFZpZXdDcmVhdGVkKCk7dGhpcy5fdmlzaWJsZVZpZXc9dGhpcy5fdGV4dFZpZXc7dGhpcy5fc2VhcmNoYWJsZUVsZW1lbnQ9dGhpcy5fdGV4dFZpZXc7YnJlYWs7fQpjb25zdCBpc0ZsYW1lPXRoaXMuX3ZpZXdUeXBlLmdldCgpPT09UHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLkZsYW1lO3RoaXMuZm9jdXNCdXR0b24uc2V0VmlzaWJsZSghaXNGbGFtZSk7dGhpcy5leGNsdWRlQnV0dG9uLnNldFZpc2libGUoIWlzRmxhbWUpO3RoaXMucmVzZXRCdXR0b24uc2V0VmlzaWJsZSghaXNGbGFtZSk7dGhpcy5fdmlzaWJsZVZpZXcuc2hvdyh0aGlzLl9zZWFyY2hhYmxlVmlldy5lbGVtZW50KTt9Cl9ub2RlU2VsZWN0ZWQoc2VsZWN0ZWQpe3RoaXMuZm9jdXNCdXR0b24uc2V0RW5hYmxlZChzZWxlY3RlZCk7dGhpcy5leGNsdWRlQnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0ZWQpO30KX2ZvY3VzQ2xpY2tlZChldmVudCl7aWYoIXRoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlKQpyZXR1cm47dGhpcy5yZXNldEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMucHJvZmlsZURhdGFHcmlkVHJlZS5mb2N1cyh0aGlzLmRhdGFHcmlkLnNlbGVjdGVkTm9kZSk7dGhpcy5yZWZyZXNoKCk7dGhpcy5yZWZyZXNoVmlzaWJsZURhdGEoKTtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLkNwdVByb2ZpbGVOb2RlRm9jdXNlZCk7fQpfZXhjbHVkZUNsaWNrZWQoZXZlbnQpe2NvbnN0IHNlbGVjdGVkTm9kZT10aGlzLmRhdGFHcmlkLnNlbGVjdGVkTm9kZTtpZighc2VsZWN0ZWROb2RlKQpyZXR1cm47c2VsZWN0ZWROb2RlLmRlc2VsZWN0KCk7dGhpcy5yZXNldEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMucHJvZmlsZURhdGFHcmlkVHJlZS5leGNsdWRlKHNlbGVjdGVkTm9kZSk7dGhpcy5yZWZyZXNoKCk7dGhpcy5yZWZyZXNoVmlzaWJsZURhdGEoKTtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLkNwdVByb2ZpbGVOb2RlRXhjbHVkZWQpO30KX3Jlc2V0Q2xpY2tlZChldmVudCl7dGhpcy5yZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLnByb2ZpbGVEYXRhR3JpZFRyZWUucmVzdG9yZSgpO3RoaXMuX2xpbmtpZmllci5yZXNldCgpO3RoaXMucmVmcmVzaCgpO3RoaXMucmVmcmVzaFZpc2libGVEYXRhKCk7fQpfc29ydFByb2ZpbGUoKXtjb25zdCBzb3J0QXNjZW5kaW5nPXRoaXMuZGF0YUdyaWQuaXNTb3J0T3JkZXJBc2NlbmRpbmcoKTtjb25zdCBzb3J0Q29sdW1uSWQ9dGhpcy5kYXRhR3JpZC5zb3J0Q29sdW1uSWQoKTtjb25zdCBzb3J0UHJvcGVydHk9c29ydENvbHVtbklkPT09J2Z1bmN0aW9uJz8nZnVuY3Rpb25OYW1lJzpzb3J0Q29sdW1uSWR8fCcnO3RoaXMucHJvZmlsZURhdGFHcmlkVHJlZS5zb3J0KFByb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZFRyZWUucHJvcGVydHlDb21wYXJhdG9yKHNvcnRQcm9wZXJ0eSxzb3J0QXNjZW5kaW5nKSk7dGhpcy5yZWZyZXNoKCk7fX07UHJvZmlsZXIuUHJvZmlsZVZpZXcuX21heExpbmtMZW5ndGg9MzA7UHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzPXtGbGFtZTonRmxhbWUnLFRyZWU6J1RyZWUnLEhlYXZ5OidIZWF2eScsVGV4dDonVGV4dCd9O1Byb2ZpbGVyLldyaXRhYmxlUHJvZmlsZUhlYWRlcj1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVIZWFkZXJ7Y29uc3RydWN0b3IoZGVidWdnZXJNb2RlbCx0eXBlLHRpdGxlKXtzdXBlcih0eXBlLHRpdGxlfHxDb21tb24uVUlTdHJpbmcoJ1Byb2ZpbGUgJWQnLHR5cGUubmV4dFByb2ZpbGVVaWQoKSkpO3RoaXMuX2RlYnVnZ2VyTW9kZWw9ZGVidWdnZXJNb2RlbDt0aGlzLl90ZW1wRmlsZT1udWxsO30KX29uQ2h1bmtUcmFuc2ZlcnJlZChyZWFkZXIpe3RoaXMudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnTG9hZGluZ1x1MjAyNiAlZCUlJyxOdW1iZXIuYnl0ZXNUb1N0cmluZyh0aGlzLl9qc29uaWZpZWRQcm9maWxlLmxlbmd0aCkpKTt9Cl9vbkVycm9yKHJlYWRlcil7dGhpcy51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKGBGaWxlICclcycgcmVhZCBlcnJvcjogJXNgLHJlYWRlci5maWxlTmFtZSgpLHJlYWRlci5lcnJvcigpLm1lc3NhZ2UpKTt9CmFzeW5jIHdyaXRlKHRleHQpe3RoaXMuX2pzb25pZmllZFByb2ZpbGUrPXRleHQ7fQpjbG9zZSgpe30KZGlzcG9zZSgpe3RoaXMucmVtb3ZlVGVtcEZpbGUoKTt9CmNyZWF0ZVNpZGViYXJUcmVlRWxlbWVudChwYW5lbCl7cmV0dXJuIG5ldyBQcm9maWxlci5Qcm9maWxlU2lkZWJhclRyZWVFbGVtZW50KHBhbmVsLHRoaXMsJ3Byb2ZpbGUtc2lkZWJhci10cmVlLWl0ZW0nKTt9CmNhblNhdmVUb0ZpbGUoKXtyZXR1cm4hdGhpcy5mcm9tRmlsZSgpJiZ0aGlzLl9wcm90b2NvbFByb2ZpbGU7fQphc3luYyBzYXZlVG9GaWxlKCl7Y29uc3QgZmlsZU91dHB1dFN0cmVhbT1uZXcgQmluZGluZ3MuRmlsZU91dHB1dFN0cmVhbSgpO3RoaXMuX2ZpbGVOYW1lPXRoaXMuX2ZpbGVOYW1lfHxgJHt0aGlzLnByb2ZpbGVUeXBlKCkudHlwZU5hbWUoKX0tJHtuZXcgRGF0ZSgpLnRvSVNPODYwMUNvbXBhY3QoKX0ke3RoaXMucHJvZmlsZVR5cGUoKS5maWxlRXh0ZW5zaW9uKCl9YDtjb25zdCBhY2NlcHRlZD1hd2FpdCBmaWxlT3V0cHV0U3RyZWFtLm9wZW4odGhpcy5fZmlsZU5hbWUpO2lmKCFhY2NlcHRlZHx8IXRoaXMuX3RlbXBGaWxlKQpyZXR1cm47Y29uc3QgZGF0YT1hd2FpdCB0aGlzLl90ZW1wRmlsZS5yZWFkKCk7aWYoZGF0YSkKYXdhaXQgZmlsZU91dHB1dFN0cmVhbS53cml0ZShkYXRhKTtmaWxlT3V0cHV0U3RyZWFtLmNsb3NlKCk7fQphc3luYyBsb2FkRnJvbUZpbGUoZmlsZSl7dGhpcy51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCdMb2FkaW5nXHUyMDI2JyksdHJ1ZSk7Y29uc3QgZmlsZVJlYWRlcj1uZXcgQmluZGluZ3MuQ2h1bmtlZEZpbGVSZWFkZXIoZmlsZSwxMDAwMDAwMCx0aGlzLl9vbkNodW5rVHJhbnNmZXJyZWQuYmluZCh0aGlzKSk7dGhpcy5fanNvbmlmaWVkUHJvZmlsZT0nJztjb25zdCBzdWNjZXNzPWF3YWl0IGZpbGVSZWFkZXIucmVhZCh0aGlzKTtpZighc3VjY2Vzcyl7dGhpcy5fb25FcnJvcihmaWxlUmVhZGVyKTtyZXR1cm4gbmV3IEVycm9yKENvbW1vbi5VSVN0cmluZygnRmFpbGVkIHRvIHJlYWQgZmlsZScpKTt9CnRoaXMudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnUGFyc2luZ1x1MjAyNicpLHRydWUpO2xldCBlcnJvcj1udWxsO3RyeXt0aGlzLl9wcm9maWxlPShKU09OLnBhcnNlKHRoaXMuX2pzb25pZmllZFByb2ZpbGUpKTt0aGlzLnNldFByb2ZpbGUodGhpcy5fcHJvZmlsZSk7dGhpcy51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCdMb2FkZWQnKSxmYWxzZSk7fWNhdGNoKGUpe2Vycm9yPWU7dGhpcy5wcm9maWxlVHlwZSgpLnJlbW92ZVByb2ZpbGUodGhpcyk7fQp0aGlzLl9qc29uaWZpZWRQcm9maWxlPW51bGw7aWYodGhpcy5wcm9maWxlVHlwZSgpLnByb2ZpbGVCZWluZ1JlY29yZGVkKCk9PT10aGlzKQp0aGlzLnByb2ZpbGVUeXBlKCkuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQobnVsbCk7cmV0dXJuIGVycm9yO30Kc2V0UHJvdG9jb2xQcm9maWxlKHByb2ZpbGUpe3RoaXMuc2V0UHJvZmlsZShwcm9maWxlKTt0aGlzLl9wcm90b2NvbFByb2ZpbGU9cHJvZmlsZTt0aGlzLl90ZW1wRmlsZT1uZXcgQmluZGluZ3MuVGVtcEZpbGUoKTt0aGlzLl90ZW1wRmlsZS53cml0ZShbSlNPTi5zdHJpbmdpZnkocHJvZmlsZSldKTtpZih0aGlzLmNhblNhdmVUb0ZpbGUoKSkKdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHMuUHJvZmlsZVJlY2VpdmVkKTt9fTs7UHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZT1jbGFzcyBleHRlbmRzIERhdGFHcmlkLkRhdGFHcmlkTm9kZXtjb25zdHJ1Y3Rvcihwcm9maWxlTm9kZSxvd25pbmdUcmVlLGhhc0NoaWxkcmVuKXtzdXBlcihudWxsLGhhc0NoaWxkcmVuKTt0aGlzLnByb2ZpbGVOb2RlPXByb2ZpbGVOb2RlO3RoaXMudHJlZT1vd25pbmdUcmVlO3RoaXMuY2hpbGRyZW5CeUNhbGxVSUQ9bmV3IE1hcCgpO3RoaXMubGFzdENvbXBhcmF0b3I9bnVsbDt0aGlzLmNhbGxVSUQ9cHJvZmlsZU5vZGUuY2FsbFVJRDt0aGlzLnNlbGY9cHJvZmlsZU5vZGUuc2VsZjt0aGlzLnRvdGFsPXByb2ZpbGVOb2RlLnRvdGFsO3RoaXMuZnVuY3Rpb25OYW1lPVVJLmJlYXV0aWZ5RnVuY3Rpb25OYW1lKHByb2ZpbGVOb2RlLmZ1bmN0aW9uTmFtZSk7dGhpcy5fZGVvcHRSZWFzb249cHJvZmlsZU5vZGUuZGVvcHRSZWFzb258fCcnO3RoaXMudXJsPXByb2ZpbGVOb2RlLnVybDt9CnN0YXRpYyBzb3J0KGdyaWROb2RlR3JvdXBzLGNvbXBhcmF0b3IsZm9yY2Upe2ZvcihsZXQgZ3JpZE5vZGVHcm91cEluZGV4PTA7Z3JpZE5vZGVHcm91cEluZGV4PGdyaWROb2RlR3JvdXBzLmxlbmd0aDsrK2dyaWROb2RlR3JvdXBJbmRleCl7Y29uc3QgZ3JpZE5vZGVzPWdyaWROb2RlR3JvdXBzW2dyaWROb2RlR3JvdXBJbmRleF07Y29uc3QgY291bnQ9Z3JpZE5vZGVzLmxlbmd0aDtmb3IobGV0IGluZGV4PTA7aW5kZXg8Y291bnQ7KytpbmRleCl7Y29uc3QgZ3JpZE5vZGU9Z3JpZE5vZGVzW2luZGV4XTtpZighZm9yY2UmJighZ3JpZE5vZGUuZXhwYW5kZWR8fGdyaWROb2RlLmxhc3RDb21wYXJhdG9yPT09Y29tcGFyYXRvcikpe2lmKGdyaWROb2RlLmNoaWxkcmVuLmxlbmd0aCkKZ3JpZE5vZGUuc2hvdWxkUmVmcmVzaENoaWxkcmVuPXRydWU7Y29udGludWU7fQpncmlkTm9kZS5sYXN0Q29tcGFyYXRvcj1jb21wYXJhdG9yO2NvbnN0IGNoaWxkcmVuPWdyaWROb2RlLmNoaWxkcmVuO2NvbnN0IGNoaWxkQ291bnQ9Y2hpbGRyZW4ubGVuZ3RoO2lmKGNoaWxkQ291bnQpe2NoaWxkcmVuLnNvcnQoY29tcGFyYXRvcik7Zm9yKGxldCBjaGlsZEluZGV4PTA7Y2hpbGRJbmRleDxjaGlsZENvdW50OysrY2hpbGRJbmRleCkKY2hpbGRyZW5bY2hpbGRJbmRleF0ucmVjYWxjdWxhdGVTaWJsaW5ncyhjaGlsZEluZGV4KTtncmlkTm9kZUdyb3Vwcy5wdXNoKGNoaWxkcmVuKTt9fX19CnN0YXRpYyBtZXJnZShjb250YWluZXIsY2hpbGQsc2hvdWxkQWJzb3JiKXtjb250YWluZXIuc2VsZis9Y2hpbGQuc2VsZjtpZighc2hvdWxkQWJzb3JiKQpjb250YWluZXIudG90YWwrPWNoaWxkLnRvdGFsO2xldCBjaGlsZHJlbj1jb250YWluZXIuY2hpbGRyZW4uc2xpY2UoKTtjb250YWluZXIucmVtb3ZlQ2hpbGRyZW4oKTtsZXQgY291bnQ9Y2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgaW5kZXg9MDtpbmRleDxjb3VudDsrK2luZGV4KXtpZighc2hvdWxkQWJzb3JifHxjaGlsZHJlbltpbmRleF0hPT1jaGlsZCkKY29udGFpbmVyLmFwcGVuZENoaWxkKGNoaWxkcmVuW2luZGV4XSk7fQpjaGlsZHJlbj1jaGlsZC5jaGlsZHJlbi5zbGljZSgpO2NvdW50PWNoaWxkcmVuLmxlbmd0aDtmb3IobGV0IGluZGV4PTA7aW5kZXg8Y291bnQ7KytpbmRleCl7Y29uc3Qgb3JwaGFuZWRDaGlsZD1jaGlsZHJlbltpbmRleF07Y29uc3QgZXhpc3RpbmdDaGlsZD1jb250YWluZXIuY2hpbGRyZW5CeUNhbGxVSUQuZ2V0KG9ycGhhbmVkQ2hpbGQuY2FsbFVJRCk7aWYoZXhpc3RpbmdDaGlsZCkKZXhpc3RpbmdDaGlsZC5tZXJnZSgob3JwaGFuZWRDaGlsZCksZmFsc2UpO2Vsc2UKY29udGFpbmVyLmFwcGVuZENoaWxkKG9ycGhhbmVkQ2hpbGQpO319CnN0YXRpYyBwb3B1bGF0ZShjb250YWluZXIpe2lmKGNvbnRhaW5lci5fcG9wdWxhdGVkKQpyZXR1cm47Y29udGFpbmVyLl9wb3B1bGF0ZWQ9dHJ1ZTtjb250YWluZXIucG9wdWxhdGVDaGlsZHJlbigpO2NvbnN0IGN1cnJlbnRDb21wYXJhdG9yPWNvbnRhaW5lci50cmVlLmxhc3RDb21wYXJhdG9yO2lmKGN1cnJlbnRDb21wYXJhdG9yKQpjb250YWluZXIuc29ydChjdXJyZW50Q29tcGFyYXRvcix0cnVlKTt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2xldCBjZWxsO3N3aXRjaChjb2x1bW5JZCl7Y2FzZSdzZWxmJzpjZWxsPXRoaXMuX2NyZWF0ZVZhbHVlQ2VsbCh0aGlzLnNlbGYsdGhpcy5zZWxmUGVyY2VudCk7Y2VsbC5jbGFzc0xpc3QudG9nZ2xlKCdoaWdobGlnaHQnLHRoaXMuX3NlYXJjaE1hdGNoZWRTZWxmQ29sdW1uKTticmVhaztjYXNlJ3RvdGFsJzpjZWxsPXRoaXMuX2NyZWF0ZVZhbHVlQ2VsbCh0aGlzLnRvdGFsLHRoaXMudG90YWxQZXJjZW50KTtjZWxsLmNsYXNzTGlzdC50b2dnbGUoJ2hpZ2hsaWdodCcsdGhpcy5fc2VhcmNoTWF0Y2hlZFRvdGFsQ29sdW1uKTticmVhaztjYXNlJ2Z1bmN0aW9uJzpjZWxsPXRoaXMuY3JlYXRlVEQoY29sdW1uSWQpO2NlbGwuY2xhc3NMaXN0LnRvZ2dsZSgnaGlnaGxpZ2h0Jyx0aGlzLl9zZWFyY2hNYXRjaGVkRnVuY3Rpb25Db2x1bW4pO2lmKHRoaXMuX2Rlb3B0UmVhc29uKXtjZWxsLmNsYXNzTGlzdC5hZGQoJ25vdC1vcHRpbWl6ZWQnKTtjb25zdCB3YXJuaW5nSWNvbj1VSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXdhcm5pbmcnLCdwcm9maWxlLXdhcm4tbWFya2VyJyk7d2FybmluZ0ljb24udGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdOb3Qgb3B0aW1pemVkOiAlcycsdGhpcy5fZGVvcHRSZWFzb24pO2NlbGwuYXBwZW5kQ2hpbGQod2FybmluZ0ljb24pO30KY2VsbC5jcmVhdGVUZXh0Q2hpbGQodGhpcy5mdW5jdGlvbk5hbWUpO2lmKHRoaXMucHJvZmlsZU5vZGUuc2NyaXB0SWQ9PT0nMCcpCmJyZWFrO2NvbnN0IHVybEVsZW1lbnQ9dGhpcy50cmVlLl9mb3JtYXR0ZXIubGlua2lmeU5vZGUodGhpcyk7aWYoIXVybEVsZW1lbnQpCmJyZWFrO3VybEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9Jzc1JSc7Y2VsbC5hcHBlbmRDaGlsZCh1cmxFbGVtZW50KTticmVhaztkZWZhdWx0OmNlbGw9c3VwZXIuY3JlYXRlQ2VsbChjb2x1bW5JZCk7YnJlYWs7fQpyZXR1cm4gY2VsbDt9Cl9jcmVhdGVWYWx1ZUNlbGwodmFsdWUscGVyY2VudCl7Y29uc3QgY2VsbD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCd0ZCcsJ251bWVyaWMtY29sdW1uJyk7Y29uc3QgZGl2PWNlbGwuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Byb2ZpbGUtbXVsdGlwbGUtdmFsdWVzJyk7ZGl2LmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9dGhpcy50cmVlLl9mb3JtYXR0ZXIuZm9ybWF0VmFsdWUodmFsdWUsdGhpcyk7ZGl2LmNyZWF0ZUNoaWxkKCdzcGFuJywncGVyY2VudC1jb2x1bW4nKS50ZXh0Q29udGVudD10aGlzLnRyZWUuX2Zvcm1hdHRlci5mb3JtYXRQZXJjZW50KHBlcmNlbnQsdGhpcyk7cmV0dXJuIGNlbGw7fQpzb3J0KGNvbXBhcmF0b3IsZm9yY2Upe3JldHVybiBQcm9maWxlci5Qcm9maWxlRGF0YUdyaWROb2RlLnNvcnQoW1t0aGlzXV0sY29tcGFyYXRvcixmb3JjZSk7fQppbnNlcnRDaGlsZChwcm9maWxlRGF0YUdyaWROb2RlLGluZGV4KXtzdXBlci5pbnNlcnRDaGlsZChwcm9maWxlRGF0YUdyaWROb2RlLGluZGV4KTt0aGlzLmNoaWxkcmVuQnlDYWxsVUlELnNldChwcm9maWxlRGF0YUdyaWROb2RlLmNhbGxVSUQsKHByb2ZpbGVEYXRhR3JpZE5vZGUpKTt9CnJlbW92ZUNoaWxkKHByb2ZpbGVEYXRhR3JpZE5vZGUpe3N1cGVyLnJlbW92ZUNoaWxkKHByb2ZpbGVEYXRhR3JpZE5vZGUpO3RoaXMuY2hpbGRyZW5CeUNhbGxVSUQuZGVsZXRlKCgocHJvZmlsZURhdGFHcmlkTm9kZSkpLmNhbGxVSUQpO30KcmVtb3ZlQ2hpbGRyZW4oKXtzdXBlci5yZW1vdmVDaGlsZHJlbigpO3RoaXMuY2hpbGRyZW5CeUNhbGxVSUQuY2xlYXIoKTt9CmZpbmRDaGlsZChub2RlKXtpZighbm9kZSkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuY2hpbGRyZW5CeUNhbGxVSUQuZ2V0KG5vZGUuY2FsbFVJRCk7fQpnZXQgc2VsZlBlcmNlbnQoKXtyZXR1cm4gdGhpcy5zZWxmL3RoaXMudHJlZS50b3RhbCoxMDAuMDt9CmdldCB0b3RhbFBlcmNlbnQoKXtyZXR1cm4gdGhpcy50b3RhbC90aGlzLnRyZWUudG90YWwqMTAwLjA7fQpwb3B1bGF0ZSgpe1Byb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZE5vZGUucG9wdWxhdGUodGhpcyk7fQpwb3B1bGF0ZUNoaWxkcmVuKCl7fQpzYXZlKCl7aWYodGhpcy5fc2F2ZWRDaGlsZHJlbikKcmV0dXJuO3RoaXMuX3NhdmVkU2VsZj10aGlzLnNlbGY7dGhpcy5fc2F2ZWRUb3RhbD10aGlzLnRvdGFsO3RoaXMuX3NhdmVkQ2hpbGRyZW49dGhpcy5jaGlsZHJlbi5zbGljZSgpO30KcmVzdG9yZSgpe2lmKCF0aGlzLl9zYXZlZENoaWxkcmVuKQpyZXR1cm47dGhpcy5zZWxmPXRoaXMuX3NhdmVkU2VsZjt0aGlzLnRvdGFsPXRoaXMuX3NhdmVkVG90YWw7dGhpcy5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IGNoaWxkcmVuPXRoaXMuX3NhdmVkQ2hpbGRyZW47Y29uc3QgY291bnQ9Y2hpbGRyZW4ubGVuZ3RoO2ZvcihsZXQgaW5kZXg9MDtpbmRleDxjb3VudDsrK2luZGV4KXtjaGlsZHJlbltpbmRleF0ucmVzdG9yZSgpO3RoaXMuYXBwZW5kQ2hpbGQoY2hpbGRyZW5baW5kZXhdKTt9fQptZXJnZShjaGlsZCxzaG91bGRBYnNvcmIpe1Byb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZE5vZGUubWVyZ2UodGhpcyxjaGlsZCxzaG91bGRBYnNvcmIpO319O1Byb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZFRyZWU9Y2xhc3N7Y29uc3RydWN0b3IoZm9ybWF0dGVyLHNlYXJjaGFibGVWaWV3LHRvdGFsKXt0aGlzLnRyZWU9dGhpczt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuX2Zvcm1hdHRlcj1mb3JtYXR0ZXI7dGhpcy5fc2VhcmNoYWJsZVZpZXc9c2VhcmNoYWJsZVZpZXc7dGhpcy50b3RhbD10b3RhbDt0aGlzLmxhc3RDb21wYXJhdG9yPW51bGw7dGhpcy5jaGlsZHJlbkJ5Q2FsbFVJRD1uZXcgTWFwKCk7dGhpcy5kZWVwU2VhcmNoPXRydWU7fQpzdGF0aWMgcHJvcGVydHlDb21wYXJhdG9yKHByb3BlcnR5LGlzQXNjZW5kaW5nKXtsZXQgY29tcGFyYXRvcj1Qcm9maWxlci5Qcm9maWxlRGF0YUdyaWRUcmVlLnByb3BlcnR5Q29tcGFyYXRvcnNbKGlzQXNjZW5kaW5nPzE6MCldW3Byb3BlcnR5XTtpZighY29tcGFyYXRvcil7aWYoaXNBc2NlbmRpbmcpe2NvbXBhcmF0b3I9ZnVuY3Rpb24obGhzLHJocyl7aWYobGhzW3Byb3BlcnR5XTxyaHNbcHJvcGVydHldKQpyZXR1cm4tMTtpZihsaHNbcHJvcGVydHldPnJoc1twcm9wZXJ0eV0pCnJldHVybiAxO3JldHVybiAwO307fWVsc2V7Y29tcGFyYXRvcj1mdW5jdGlvbihsaHMscmhzKXtpZihsaHNbcHJvcGVydHldPnJoc1twcm9wZXJ0eV0pCnJldHVybi0xO2lmKGxoc1twcm9wZXJ0eV08cmhzW3Byb3BlcnR5XSkKcmV0dXJuIDE7cmV0dXJuIDA7fTt9ClByb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZFRyZWUucHJvcGVydHlDb21wYXJhdG9yc1soaXNBc2NlbmRpbmc/MTowKV1bcHJvcGVydHldPWNvbXBhcmF0b3I7fQpyZXR1cm4gY29tcGFyYXRvcjt9CmdldCBleHBhbmRlZCgpe3JldHVybiB0cnVlO30KYXBwZW5kQ2hpbGQoY2hpbGQpe3RoaXMuaW5zZXJ0Q2hpbGQoY2hpbGQsdGhpcy5jaGlsZHJlbi5sZW5ndGgpO30KaW5zZXJ0Q2hpbGQoY2hpbGQsaW5kZXgpe3RoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LDAsY2hpbGQpO3RoaXMuY2hpbGRyZW5CeUNhbGxVSUQuc2V0KGNoaWxkLmNhbGxVSUQsY2hpbGQpO30KcmVtb3ZlQ2hpbGRyZW4oKXt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuY2hpbGRyZW5CeUNhbGxVSUQuY2xlYXIoKTt9CnBvcHVsYXRlQ2hpbGRyZW4oKXt9CmZpbmRDaGlsZChub2RlKXtpZighbm9kZSkKcmV0dXJuIG51bGw7cmV0dXJuIHRoaXMuY2hpbGRyZW5CeUNhbGxVSUQuZ2V0KG5vZGUuY2FsbFVJRCk7fQpzb3J0KGNvbXBhcmF0b3IsZm9yY2Upe3JldHVybiBQcm9maWxlci5Qcm9maWxlRGF0YUdyaWROb2RlLnNvcnQoW1t0aGlzXV0sY29tcGFyYXRvcixmb3JjZSk7fQpzYXZlKCl7aWYodGhpcy5fc2F2ZWRDaGlsZHJlbikKcmV0dXJuO3RoaXMuX3NhdmVkVG90YWw9dGhpcy50b3RhbDt0aGlzLl9zYXZlZENoaWxkcmVuPXRoaXMuY2hpbGRyZW4uc2xpY2UoKTt9CnJlc3RvcmUoKXtpZighdGhpcy5fc2F2ZWRDaGlsZHJlbikKcmV0dXJuO3RoaXMuY2hpbGRyZW49dGhpcy5fc2F2ZWRDaGlsZHJlbjt0aGlzLnRvdGFsPXRoaXMuX3NhdmVkVG90YWw7Y29uc3QgY2hpbGRyZW49dGhpcy5jaGlsZHJlbjtjb25zdCBjb3VudD1jaGlsZHJlbi5sZW5ndGg7Zm9yKGxldCBpbmRleD0wO2luZGV4PGNvdW50OysraW5kZXgpCmNoaWxkcmVuW2luZGV4XS5yZXN0b3JlKCk7dGhpcy5fc2F2ZWRDaGlsZHJlbj1udWxsO30KX21hdGNoRnVuY3Rpb24oc2VhcmNoQ29uZmlnKXtjb25zdCBxdWVyeT1zZWFyY2hDb25maWcucXVlcnkudHJpbSgpO2lmKCFxdWVyeS5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGdyZWF0ZXJUaGFuPShxdWVyeS5zdGFydHNXaXRoKCc+JykpO2NvbnN0IGxlc3NUaGFuPShxdWVyeS5zdGFydHNXaXRoKCc8JykpO2xldCBlcXVhbFRvPShxdWVyeS5zdGFydHNXaXRoKCc9Jyl8fCgoZ3JlYXRlclRoYW58fGxlc3NUaGFuKSYmcXVlcnkuaW5kZXhPZignPScpPT09MSkpO2NvbnN0IHBlcmNlbnRVbml0cz0ocXVlcnkuZW5kc1dpdGgoJyUnKSk7Y29uc3QgbWlsbGlzZWNvbmRzVW5pdHM9KHF1ZXJ5Lmxlbmd0aD4yJiZxdWVyeS5lbmRzV2l0aCgnbXMnKSk7Y29uc3Qgc2Vjb25kc1VuaXRzPSghbWlsbGlzZWNvbmRzVW5pdHMmJnF1ZXJ5LmVuZHNXaXRoKCdzJykpO2xldCBxdWVyeU51bWJlcj1wYXJzZUZsb2F0KHF1ZXJ5KTtpZihncmVhdGVyVGhhbnx8bGVzc1RoYW58fGVxdWFsVG8pe2lmKGVxdWFsVG8mJihncmVhdGVyVGhhbnx8bGVzc1RoYW4pKQpxdWVyeU51bWJlcj1wYXJzZUZsb2F0KHF1ZXJ5LnN1YnN0cmluZygyKSk7ZWxzZQpxdWVyeU51bWJlcj1wYXJzZUZsb2F0KHF1ZXJ5LnN1YnN0cmluZygxKSk7fQpjb25zdCBxdWVyeU51bWJlck1pbGxpc2Vjb25kcz0oc2Vjb25kc1VuaXRzPyhxdWVyeU51bWJlcioxMDAwKTpxdWVyeU51bWJlcik7aWYoIWlzTmFOKHF1ZXJ5TnVtYmVyKSYmIShncmVhdGVyVGhhbnx8bGVzc1RoYW4pKQplcXVhbFRvPXRydWU7Y29uc3QgbWF0Y2hlcj1jcmVhdGVQbGFpblRleHRTZWFyY2hSZWdleChxdWVyeSwnaScpO2Z1bmN0aW9uIG1hdGNoZXNRdWVyeShwcm9maWxlRGF0YUdyaWROb2RlKXtkZWxldGUgcHJvZmlsZURhdGFHcmlkTm9kZS5fc2VhcmNoTWF0Y2hlZFNlbGZDb2x1bW47ZGVsZXRlIHByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRUb3RhbENvbHVtbjtkZWxldGUgcHJvZmlsZURhdGFHcmlkTm9kZS5fc2VhcmNoTWF0Y2hlZEZ1bmN0aW9uQ29sdW1uO2lmKHBlcmNlbnRVbml0cyl7aWYobGVzc1RoYW4pe2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUuc2VsZlBlcmNlbnQ8cXVlcnlOdW1iZXIpCnByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRTZWxmQ29sdW1uPXRydWU7aWYocHJvZmlsZURhdGFHcmlkTm9kZS50b3RhbFBlcmNlbnQ8cXVlcnlOdW1iZXIpCnByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRUb3RhbENvbHVtbj10cnVlO31lbHNlIGlmKGdyZWF0ZXJUaGFuKXtpZihwcm9maWxlRGF0YUdyaWROb2RlLnNlbGZQZXJjZW50PnF1ZXJ5TnVtYmVyKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkU2VsZkNvbHVtbj10cnVlO2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUudG90YWxQZXJjZW50PnF1ZXJ5TnVtYmVyKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW49dHJ1ZTt9CmlmKGVxdWFsVG8pe2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUuc2VsZlBlcmNlbnQ9PT1xdWVyeU51bWJlcikKcHJvZmlsZURhdGFHcmlkTm9kZS5fc2VhcmNoTWF0Y2hlZFNlbGZDb2x1bW49dHJ1ZTtpZihwcm9maWxlRGF0YUdyaWROb2RlLnRvdGFsUGVyY2VudD09PXF1ZXJ5TnVtYmVyKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW49dHJ1ZTt9fWVsc2UgaWYobWlsbGlzZWNvbmRzVW5pdHN8fHNlY29uZHNVbml0cyl7aWYobGVzc1RoYW4pe2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUuc2VsZjxxdWVyeU51bWJlck1pbGxpc2Vjb25kcykKcHJvZmlsZURhdGFHcmlkTm9kZS5fc2VhcmNoTWF0Y2hlZFNlbGZDb2x1bW49dHJ1ZTtpZihwcm9maWxlRGF0YUdyaWROb2RlLnRvdGFsPHF1ZXJ5TnVtYmVyTWlsbGlzZWNvbmRzKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW49dHJ1ZTt9ZWxzZSBpZihncmVhdGVyVGhhbil7aWYocHJvZmlsZURhdGFHcmlkTm9kZS5zZWxmPnF1ZXJ5TnVtYmVyTWlsbGlzZWNvbmRzKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkU2VsZkNvbHVtbj10cnVlO2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUudG90YWw+cXVlcnlOdW1iZXJNaWxsaXNlY29uZHMpCnByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRUb3RhbENvbHVtbj10cnVlO30KaWYoZXF1YWxUbyl7aWYocHJvZmlsZURhdGFHcmlkTm9kZS5zZWxmPT09cXVlcnlOdW1iZXJNaWxsaXNlY29uZHMpCnByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRTZWxmQ29sdW1uPXRydWU7aWYocHJvZmlsZURhdGFHcmlkTm9kZS50b3RhbD09PXF1ZXJ5TnVtYmVyTWlsbGlzZWNvbmRzKQpwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW49dHJ1ZTt9fQppZihwcm9maWxlRGF0YUdyaWROb2RlLmZ1bmN0aW9uTmFtZS5tYXRjaChtYXRjaGVyKXx8KHByb2ZpbGVEYXRhR3JpZE5vZGUudXJsJiZwcm9maWxlRGF0YUdyaWROb2RlLnVybC5tYXRjaChtYXRjaGVyKSkpCnByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRGdW5jdGlvbkNvbHVtbj10cnVlO2lmKHByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRTZWxmQ29sdW1ufHxwcm9maWxlRGF0YUdyaWROb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW58fHByb2ZpbGVEYXRhR3JpZE5vZGUuX3NlYXJjaE1hdGNoZWRGdW5jdGlvbkNvbHVtbil7cHJvZmlsZURhdGFHcmlkTm9kZS5yZWZyZXNoKCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gbWF0Y2hlc1F1ZXJ5O30KcGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXt0aGlzLnNlYXJjaENhbmNlbGVkKCk7Y29uc3QgbWF0Y2hlc1F1ZXJ5PXRoaXMuX21hdGNoRnVuY3Rpb24oc2VhcmNoQ29uZmlnKTtpZighbWF0Y2hlc1F1ZXJ5KQpyZXR1cm47dGhpcy5fc2VhcmNoUmVzdWx0cz1bXTtjb25zdCBkZWVwU2VhcmNoPXRoaXMuZGVlcFNlYXJjaDtmb3IobGV0IGN1cnJlbnQ9dGhpcy5jaGlsZHJlblswXTtjdXJyZW50O2N1cnJlbnQ9Y3VycmVudC50cmF2ZXJzZU5leHROb2RlKCFkZWVwU2VhcmNoLG51bGwsIWRlZXBTZWFyY2gpKXtpZihtYXRjaGVzUXVlcnkoY3VycmVudCkpCnRoaXMuX3NlYXJjaFJlc3VsdHMucHVzaCh7cHJvZmlsZU5vZGU6Y3VycmVudH0pO30KdGhpcy5fc2VhcmNoUmVzdWx0SW5kZXg9anVtcEJhY2t3YXJkcz8wOnRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoLTE7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKTt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVDdXJyZW50TWF0Y2hJbmRleCh0aGlzLl9zZWFyY2hSZXN1bHRJbmRleCk7fQpzZWFyY2hDYW5jZWxlZCgpe2lmKHRoaXMuX3NlYXJjaFJlc3VsdHMpe2ZvcihsZXQgaT0wO2k8dGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGg7KytpKXtjb25zdCBwcm9maWxlTm9kZT10aGlzLl9zZWFyY2hSZXN1bHRzW2ldLnByb2ZpbGVOb2RlO2RlbGV0ZSBwcm9maWxlTm9kZS5fc2VhcmNoTWF0Y2hlZFNlbGZDb2x1bW47ZGVsZXRlIHByb2ZpbGVOb2RlLl9zZWFyY2hNYXRjaGVkVG90YWxDb2x1bW47ZGVsZXRlIHByb2ZpbGVOb2RlLl9zZWFyY2hNYXRjaGVkRnVuY3Rpb25Db2x1bW47cHJvZmlsZU5vZGUucmVmcmVzaCgpO319CnRoaXMuX3NlYXJjaFJlc3VsdHM9W107dGhpcy5fc2VhcmNoUmVzdWx0SW5kZXg9LTE7fQpqdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCl7aWYoIXRoaXMuX3NlYXJjaFJlc3VsdHN8fCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuX3NlYXJjaFJlc3VsdEluZGV4PSh0aGlzLl9zZWFyY2hSZXN1bHRJbmRleCsxKSV0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aDt0aGlzLl9qdW1wVG9TZWFyY2hSZXN1bHQodGhpcy5fc2VhcmNoUmVzdWx0SW5kZXgpO30KanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fc2VhcmNoUmVzdWx0c3x8IXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKQpyZXR1cm47dGhpcy5fc2VhcmNoUmVzdWx0SW5kZXg9KHRoaXMuX3NlYXJjaFJlc3VsdEluZGV4LTErdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpJXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoO3RoaXMuX2p1bXBUb1NlYXJjaFJlc3VsdCh0aGlzLl9zZWFyY2hSZXN1bHRJbmRleCk7fQpzdXBwb3J0c0Nhc2VTZW5zaXRpdmVTZWFyY2goKXtyZXR1cm4gdHJ1ZTt9CnN1cHBvcnRzUmVnZXhTZWFyY2goKXtyZXR1cm4gZmFsc2U7fQpfanVtcFRvU2VhcmNoUmVzdWx0KGluZGV4KXtjb25zdCBzZWFyY2hSZXN1bHQ9dGhpcy5fc2VhcmNoUmVzdWx0c1tpbmRleF07aWYoIXNlYXJjaFJlc3VsdCkKcmV0dXJuO2NvbnN0IHByb2ZpbGVOb2RlPXNlYXJjaFJlc3VsdC5wcm9maWxlTm9kZTtwcm9maWxlTm9kZS5yZXZlYWxBbmRTZWxlY3QoKTt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVDdXJyZW50TWF0Y2hJbmRleChpbmRleCk7fX07UHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkVHJlZS5wcm9wZXJ0eUNvbXBhcmF0b3JzPVt7fSx7fV07UHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZS5Gb3JtYXR0ZXI9ZnVuY3Rpb24oKXt9O1Byb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZE5vZGUuRm9ybWF0dGVyLnByb3RvdHlwZT17Zm9ybWF0VmFsdWUodmFsdWUsbm9kZSl7fSxmb3JtYXRQZXJjZW50KHZhbHVlLG5vZGUpe30sbGlua2lmeU5vZGUobm9kZSl7fX07O1Byb2ZpbGVyLkJvdHRvbVVwUHJvZmlsZURhdGFHcmlkTm9kZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVEYXRhR3JpZE5vZGV7Y29uc3RydWN0b3IocHJvZmlsZU5vZGUsb3duaW5nVHJlZSl7c3VwZXIocHJvZmlsZU5vZGUsb3duaW5nVHJlZSwhIXByb2ZpbGVOb2RlLnBhcmVudCYmISFwcm9maWxlTm9kZS5wYXJlbnQucGFyZW50KTt0aGlzLl9yZW1haW5pbmdOb2RlSW5mb3M9W107fQpzdGF0aWMgX3NoYXJlZFBvcHVsYXRlKGNvbnRhaW5lcil7Y29uc3QgcmVtYWluaW5nTm9kZUluZm9zPWNvbnRhaW5lci5fcmVtYWluaW5nTm9kZUluZm9zO2NvbnN0IGNvdW50PXJlbWFpbmluZ05vZGVJbmZvcy5sZW5ndGg7Zm9yKGxldCBpbmRleD0wO2luZGV4PGNvdW50OysraW5kZXgpe2NvbnN0IG5vZGVJbmZvPXJlbWFpbmluZ05vZGVJbmZvc1tpbmRleF07Y29uc3QgYW5jZXN0b3I9bm9kZUluZm8uYW5jZXN0b3I7Y29uc3QgZm9jdXNOb2RlPW5vZGVJbmZvLmZvY3VzTm9kZTtsZXQgY2hpbGQ9Y29udGFpbmVyLmZpbmRDaGlsZChhbmNlc3Rvcik7aWYoY2hpbGQpe2NvbnN0IHRvdGFsQWNjb3VudGVkRm9yPW5vZGVJbmZvLnRvdGFsQWNjb3VudGVkRm9yO2NoaWxkLnNlbGYrPWZvY3VzTm9kZS5zZWxmO2lmKCF0b3RhbEFjY291bnRlZEZvcikKY2hpbGQudG90YWwrPWZvY3VzTm9kZS50b3RhbDt9ZWxzZXtjaGlsZD1uZXcgUHJvZmlsZXIuQm90dG9tVXBQcm9maWxlRGF0YUdyaWROb2RlKGFuY2VzdG9yLChjb250YWluZXIudHJlZSkpO2lmKGFuY2VzdG9yIT09Zm9jdXNOb2RlKXtjaGlsZC5zZWxmPWZvY3VzTm9kZS5zZWxmO2NoaWxkLnRvdGFsPWZvY3VzTm9kZS50b3RhbDt9CmNvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZCk7fQpjb25zdCBwYXJlbnQ9YW5jZXN0b3IucGFyZW50O2lmKHBhcmVudCYmcGFyZW50LnBhcmVudCl7bm9kZUluZm8uYW5jZXN0b3I9cGFyZW50O2NoaWxkLl9yZW1haW5pbmdOb2RlSW5mb3MucHVzaChub2RlSW5mbyk7fX0KZGVsZXRlIGNvbnRhaW5lci5fcmVtYWluaW5nTm9kZUluZm9zO30KX3Rha2VQcm9wZXJ0aWVzRnJvbVByb2ZpbGVEYXRhR3JpZE5vZGUocHJvZmlsZURhdGFHcmlkTm9kZSl7dGhpcy5zYXZlKCk7dGhpcy5zZWxmPXByb2ZpbGVEYXRhR3JpZE5vZGUuc2VsZjt0aGlzLnRvdGFsPXByb2ZpbGVEYXRhR3JpZE5vZGUudG90YWw7fQpfa2VlcE9ubHlDaGlsZChjaGlsZCl7dGhpcy5zYXZlKCk7dGhpcy5yZW1vdmVDaGlsZHJlbigpO3RoaXMuYXBwZW5kQ2hpbGQoY2hpbGQpO30KX2V4Y2x1ZGUoYUNhbGxVSUQpe2lmKHRoaXMuX3JlbWFpbmluZ05vZGVJbmZvcykKdGhpcy5wb3B1bGF0ZSgpO3RoaXMuc2F2ZSgpO2NvbnN0IGNoaWxkcmVuPXRoaXMuY2hpbGRyZW47bGV0IGluZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoO3doaWxlKGluZGV4LS0pCmNoaWxkcmVuW2luZGV4XS5fZXhjbHVkZShhQ2FsbFVJRCk7Y29uc3QgY2hpbGQ9dGhpcy5jaGlsZHJlbkJ5Q2FsbFVJRC5nZXQoYUNhbGxVSUQpO2lmKGNoaWxkKQp0aGlzLm1lcmdlKGNoaWxkLHRydWUpO30KcmVzdG9yZSgpe3N1cGVyLnJlc3RvcmUoKTtpZighdGhpcy5jaGlsZHJlbi5sZW5ndGgpCnRoaXMuc2V0SGFzQ2hpbGRyZW4odGhpcy5fd2lsbEhhdmVDaGlsZHJlbih0aGlzLnByb2ZpbGVOb2RlKSk7fQptZXJnZShjaGlsZCxzaG91bGRBYnNvcmIpe3RoaXMuc2VsZi09Y2hpbGQuc2VsZjtzdXBlci5tZXJnZShjaGlsZCxzaG91bGRBYnNvcmIpO30KcG9wdWxhdGVDaGlsZHJlbigpe1Byb2ZpbGVyLkJvdHRvbVVwUHJvZmlsZURhdGFHcmlkTm9kZS5fc2hhcmVkUG9wdWxhdGUodGhpcyk7fQpfd2lsbEhhdmVDaGlsZHJlbihwcm9maWxlTm9kZSl7cmV0dXJuISEocHJvZmlsZU5vZGUucGFyZW50JiZwcm9maWxlTm9kZS5wYXJlbnQucGFyZW50KTt9fTtQcm9maWxlci5Cb3R0b21VcFByb2ZpbGVEYXRhR3JpZFRyZWU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5Qcm9maWxlRGF0YUdyaWRUcmVle2NvbnN0cnVjdG9yKGZvcm1hdHRlcixzZWFyY2hhYmxlVmlldyxyb290UHJvZmlsZU5vZGUsdG90YWwpe3N1cGVyKGZvcm1hdHRlcixzZWFyY2hhYmxlVmlldyx0b3RhbCk7dGhpcy5kZWVwU2VhcmNoPWZhbHNlO2xldCBwcm9maWxlTm9kZVVJRHM9MDtjb25zdCBwcm9maWxlTm9kZUdyb3Vwcz1bW10sW3Jvb3RQcm9maWxlTm9kZV1dO2NvbnN0IHZpc2l0ZWRQcm9maWxlTm9kZXNGb3JDYWxsVUlEPW5ldyBNYXAoKTt0aGlzLl9yZW1haW5pbmdOb2RlSW5mb3M9W107Zm9yKGxldCBwcm9maWxlTm9kZUdyb3VwSW5kZXg9MDtwcm9maWxlTm9kZUdyb3VwSW5kZXg8cHJvZmlsZU5vZGVHcm91cHMubGVuZ3RoOysrcHJvZmlsZU5vZGVHcm91cEluZGV4KXtjb25zdCBwYXJlbnRQcm9maWxlTm9kZXM9cHJvZmlsZU5vZGVHcm91cHNbcHJvZmlsZU5vZGVHcm91cEluZGV4XTtjb25zdCBwcm9maWxlTm9kZXM9cHJvZmlsZU5vZGVHcm91cHNbKytwcm9maWxlTm9kZUdyb3VwSW5kZXhdO2NvbnN0IGNvdW50PXByb2ZpbGVOb2Rlcy5sZW5ndGg7Zm9yKGxldCBpbmRleD0wO2luZGV4PGNvdW50OysraW5kZXgpe2NvbnN0IHByb2ZpbGVOb2RlPXByb2ZpbGVOb2Rlc1tpbmRleF07aWYoIXByb2ZpbGVOb2RlLlVJRCkKcHJvZmlsZU5vZGUuVUlEPSsrcHJvZmlsZU5vZGVVSURzO2lmKHByb2ZpbGVOb2RlLnBhcmVudCl7bGV0IHZpc2l0ZWROb2Rlcz12aXNpdGVkUHJvZmlsZU5vZGVzRm9yQ2FsbFVJRC5nZXQocHJvZmlsZU5vZGUuY2FsbFVJRCk7bGV0IHRvdGFsQWNjb3VudGVkRm9yPWZhbHNlO2lmKCF2aXNpdGVkTm9kZXMpe3Zpc2l0ZWROb2Rlcz1uZXcgU2V0KCk7dmlzaXRlZFByb2ZpbGVOb2Rlc0ZvckNhbGxVSUQuc2V0KHByb2ZpbGVOb2RlLmNhbGxVSUQsdmlzaXRlZE5vZGVzKTt9ZWxzZXtjb25zdCBwYXJlbnRDb3VudD1wYXJlbnRQcm9maWxlTm9kZXMubGVuZ3RoO2ZvcihsZXQgcGFyZW50SW5kZXg9MDtwYXJlbnRJbmRleDxwYXJlbnRDb3VudDsrK3BhcmVudEluZGV4KXtpZih2aXNpdGVkTm9kZXMuaGFzKHBhcmVudFByb2ZpbGVOb2Rlc1twYXJlbnRJbmRleF0uVUlEKSl7dG90YWxBY2NvdW50ZWRGb3I9dHJ1ZTticmVhazt9fX0KdmlzaXRlZE5vZGVzLmFkZChwcm9maWxlTm9kZS5VSUQpO3RoaXMuX3JlbWFpbmluZ05vZGVJbmZvcy5wdXNoKHthbmNlc3Rvcjpwcm9maWxlTm9kZSxmb2N1c05vZGU6cHJvZmlsZU5vZGUsdG90YWxBY2NvdW50ZWRGb3I6dG90YWxBY2NvdW50ZWRGb3J9KTt9CmNvbnN0IGNoaWxkcmVuPXByb2ZpbGVOb2RlLmNoaWxkcmVuO2lmKGNoaWxkcmVuLmxlbmd0aCl7cHJvZmlsZU5vZGVHcm91cHMucHVzaChwYXJlbnRQcm9maWxlTm9kZXMuY29uY2F0KFtwcm9maWxlTm9kZV0pKTtwcm9maWxlTm9kZUdyb3Vwcy5wdXNoKGNoaWxkcmVuKTt9fX0KUHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZS5wb3B1bGF0ZSh0aGlzKTtyZXR1cm4gdGhpczt9CmZvY3VzKHByb2ZpbGVEYXRhR3JpZE5vZGUpe2lmKCFwcm9maWxlRGF0YUdyaWROb2RlKQpyZXR1cm47dGhpcy5zYXZlKCk7bGV0IGN1cnJlbnROb2RlPXByb2ZpbGVEYXRhR3JpZE5vZGU7bGV0IGZvY3VzTm9kZT1wcm9maWxlRGF0YUdyaWROb2RlO3doaWxlKGN1cnJlbnROb2RlLnBhcmVudCYmKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZSkpe2N1cnJlbnROb2RlLl90YWtlUHJvcGVydGllc0Zyb21Qcm9maWxlRGF0YUdyaWROb2RlKHByb2ZpbGVEYXRhR3JpZE5vZGUpO2ZvY3VzTm9kZT1jdXJyZW50Tm9kZTtjdXJyZW50Tm9kZT1jdXJyZW50Tm9kZS5wYXJlbnQ7aWYoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBQcm9maWxlci5Qcm9maWxlRGF0YUdyaWROb2RlKQpjdXJyZW50Tm9kZS5fa2VlcE9ubHlDaGlsZChmb2N1c05vZGUpO30KdGhpcy5jaGlsZHJlbj1bZm9jdXNOb2RlXTt0aGlzLnRvdGFsPXByb2ZpbGVEYXRhR3JpZE5vZGUudG90YWw7fQpleGNsdWRlKHByb2ZpbGVEYXRhR3JpZE5vZGUpe2lmKCFwcm9maWxlRGF0YUdyaWROb2RlKQpyZXR1cm47dGhpcy5zYXZlKCk7Y29uc3QgZXhjbHVkZWRDYWxsVUlEPXByb2ZpbGVEYXRhR3JpZE5vZGUuY2FsbFVJRDtjb25zdCBleGNsdWRlZFRvcExldmVsQ2hpbGQ9dGhpcy5jaGlsZHJlbkJ5Q2FsbFVJRC5nZXQoZXhjbHVkZWRDYWxsVUlEKTtpZihleGNsdWRlZFRvcExldmVsQ2hpbGQpCnRoaXMuY2hpbGRyZW4ucmVtb3ZlKGV4Y2x1ZGVkVG9wTGV2ZWxDaGlsZCk7Y29uc3QgY2hpbGRyZW49dGhpcy5jaGlsZHJlbjtjb25zdCBjb3VudD1jaGlsZHJlbi5sZW5ndGg7Zm9yKGxldCBpbmRleD0wO2luZGV4PGNvdW50OysraW5kZXgpCmNoaWxkcmVuW2luZGV4XS5fZXhjbHVkZShleGNsdWRlZENhbGxVSUQpO2lmKHRoaXMubGFzdENvbXBhcmF0b3IpCnRoaXMuc29ydCh0aGlzLmxhc3RDb21wYXJhdG9yLHRydWUpO30KcG9wdWxhdGVDaGlsZHJlbigpe1Byb2ZpbGVyLkJvdHRvbVVwUHJvZmlsZURhdGFHcmlkTm9kZS5fc2hhcmVkUG9wdWxhdGUodGhpcyk7fX07O1Byb2ZpbGVyLlRvcERvd25Qcm9maWxlRGF0YUdyaWROb2RlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZXtjb25zdHJ1Y3Rvcihwcm9maWxlTm9kZSxvd25pbmdUcmVlKXtjb25zdCBoYXNDaGlsZHJlbj0hIShwcm9maWxlTm9kZS5jaGlsZHJlbiYmcHJvZmlsZU5vZGUuY2hpbGRyZW4ubGVuZ3RoKTtzdXBlcihwcm9maWxlTm9kZSxvd25pbmdUcmVlLGhhc0NoaWxkcmVuKTt0aGlzLl9yZW1haW5pbmdDaGlsZHJlbj1wcm9maWxlTm9kZS5jaGlsZHJlbjt9CnN0YXRpYyBfc2hhcmVkUG9wdWxhdGUoY29udGFpbmVyKXtjb25zdCBjaGlsZHJlbj1jb250YWluZXIuX3JlbWFpbmluZ0NoaWxkcmVuO2NvbnN0IGNoaWxkcmVuTGVuZ3RoPWNoaWxkcmVuLmxlbmd0aDtmb3IobGV0IGk9MDtpPGNoaWxkcmVuTGVuZ3RoOysraSl7Y29udGFpbmVyLmFwcGVuZENoaWxkKG5ldyBQcm9maWxlci5Ub3BEb3duUHJvZmlsZURhdGFHcmlkTm9kZShjaGlsZHJlbltpXSwoY29udGFpbmVyLnRyZWUpKSk7fQpjb250YWluZXIuX3JlbWFpbmluZ0NoaWxkcmVuPW51bGw7fQpzdGF0aWMgX2V4Y2x1ZGVSZWN1cnNpdmVseShjb250YWluZXIsYUNhbGxVSUQpe2lmKGNvbnRhaW5lci5fcmVtYWluaW5nQ2hpbGRyZW4pCmNvbnRhaW5lci5wb3B1bGF0ZSgpO2NvbnRhaW5lci5zYXZlKCk7Y29uc3QgY2hpbGRyZW49Y29udGFpbmVyLmNoaWxkcmVuO2xldCBpbmRleD1jb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoO3doaWxlKGluZGV4LS0pClByb2ZpbGVyLlRvcERvd25Qcm9maWxlRGF0YUdyaWROb2RlLl9leGNsdWRlUmVjdXJzaXZlbHkoY2hpbGRyZW5baW5kZXhdLGFDYWxsVUlEKTtjb25zdCBjaGlsZD1jb250YWluZXIuY2hpbGRyZW5CeUNhbGxVSUQuZ2V0KGFDYWxsVUlEKTtpZihjaGlsZCkKUHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkTm9kZS5tZXJnZShjb250YWluZXIsY2hpbGQsdHJ1ZSk7fQpwb3B1bGF0ZUNoaWxkcmVuKCl7UHJvZmlsZXIuVG9wRG93blByb2ZpbGVEYXRhR3JpZE5vZGUuX3NoYXJlZFBvcHVsYXRlKHRoaXMpO319O1Byb2ZpbGVyLlRvcERvd25Qcm9maWxlRGF0YUdyaWRUcmVlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuUHJvZmlsZURhdGFHcmlkVHJlZXtjb25zdHJ1Y3Rvcihmb3JtYXR0ZXIsc2VhcmNoYWJsZVZpZXcscm9vdFByb2ZpbGVOb2RlLHRvdGFsKXtzdXBlcihmb3JtYXR0ZXIsc2VhcmNoYWJsZVZpZXcsdG90YWwpO3RoaXMuX3JlbWFpbmluZ0NoaWxkcmVuPXJvb3RQcm9maWxlTm9kZS5jaGlsZHJlbjtQcm9maWxlci5Qcm9maWxlRGF0YUdyaWROb2RlLnBvcHVsYXRlKHRoaXMpO30KZm9jdXMocHJvZmlsZURhdGFHcmlkTm9kZSl7aWYoIXByb2ZpbGVEYXRhR3JpZE5vZGUpCnJldHVybjt0aGlzLnNhdmUoKTtwcm9maWxlRGF0YUdyaWROb2RlLnNhdmVQb3NpdGlvbigpO3RoaXMuY2hpbGRyZW49W3Byb2ZpbGVEYXRhR3JpZE5vZGVdO3RoaXMudG90YWw9cHJvZmlsZURhdGFHcmlkTm9kZS50b3RhbDt9CmV4Y2x1ZGUocHJvZmlsZURhdGFHcmlkTm9kZSl7aWYoIXByb2ZpbGVEYXRhR3JpZE5vZGUpCnJldHVybjt0aGlzLnNhdmUoKTtQcm9maWxlci5Ub3BEb3duUHJvZmlsZURhdGFHcmlkTm9kZS5fZXhjbHVkZVJlY3Vyc2l2ZWx5KHRoaXMscHJvZmlsZURhdGFHcmlkTm9kZS5jYWxsVUlEKTtpZih0aGlzLmxhc3RDb21wYXJhdG9yKQp0aGlzLnNvcnQodGhpcy5sYXN0Q29tcGFyYXRvcix0cnVlKTt9CnJlc3RvcmUoKXtpZighdGhpcy5fc2F2ZWRDaGlsZHJlbikKcmV0dXJuO3RoaXMuY2hpbGRyZW5bMF0ucmVzdG9yZVBvc2l0aW9uKCk7c3VwZXIucmVzdG9yZSgpO30KcG9wdWxhdGVDaGlsZHJlbigpe1Byb2ZpbGVyLlRvcERvd25Qcm9maWxlRGF0YUdyaWROb2RlLl9zaGFyZWRQb3B1bGF0ZSh0aGlzKTt9fTs7UHJvZmlsZXIuUHJvZmlsZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXtQZXJmVUkuRmxhbWVDaGFydERhdGFQcm92aWRlci5jYWxsKHRoaXMpO3RoaXMuX2NvbG9yR2VuZXJhdG9yPVByb2ZpbGVyLlByb2ZpbGVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLmNvbG9yR2VuZXJhdG9yKCk7fQpzdGF0aWMgY29sb3JHZW5lcmF0b3IoKXtpZighUHJvZmlsZXIuUHJvZmlsZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuX2NvbG9yR2VuZXJhdG9yKXtjb25zdCBjb2xvckdlbmVyYXRvcj1uZXcgQ29tbW9uLkNvbG9yLkdlbmVyYXRvcih7bWluOjMwLG1heDozMzB9LHttaW46NTAsbWF4OjgwLGNvdW50OjV9LHttaW46ODAsbWF4OjkwLGNvdW50OjN9KTtjb2xvckdlbmVyYXRvci5zZXRDb2xvckZvcklEKCcoaWRsZSknLCdoc2woMCwgMCUsIDk0JSknKTtjb2xvckdlbmVyYXRvci5zZXRDb2xvckZvcklEKCcocHJvZ3JhbSknLCdoc2woMCwgMCUsIDgwJSknKTtjb2xvckdlbmVyYXRvci5zZXRDb2xvckZvcklEKCcoZ2FyYmFnZSBjb2xsZWN0b3IpJywnaHNsKDAsIDAlLCA4MCUpJyk7UHJvZmlsZXIuUHJvZmlsZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuX2NvbG9yR2VuZXJhdG9yPWNvbG9yR2VuZXJhdG9yO30KcmV0dXJuIFByb2ZpbGVyLlByb2ZpbGVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLl9jb2xvckdlbmVyYXRvcjt9Cm1pbmltdW1Cb3VuZGFyeSgpe3JldHVybiB0aGlzLl9jcHVQcm9maWxlLnByb2ZpbGVTdGFydFRpbWU7fQp0b3RhbFRpbWUoKXtyZXR1cm4gdGhpcy5fY3B1UHJvZmlsZS5wcm9maWxlSGVhZC50b3RhbDt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIE51bWJlci5wcmVjaXNlTWlsbGlzVG9TdHJpbmcodmFsdWUscHJlY2lzaW9uKTt9Cm1heFN0YWNrRGVwdGgoKXtyZXR1cm4gdGhpcy5fbWF4U3RhY2tEZXB0aDt9CnRpbWVsaW5lRGF0YSgpe3JldHVybiB0aGlzLl90aW1lbGluZURhdGF8fHRoaXMuX2NhbGN1bGF0ZVRpbWVsaW5lRGF0YSgpO30KX2NhbGN1bGF0ZVRpbWVsaW5lRGF0YSgpe3Rocm93J05vdCBpbXBsZW1lbnRlZC4nO30KcHJlcGFyZUhpZ2hsaWdodGVkRW50cnlJbmZvKGVudHJ5SW5kZXgpe3Rocm93J05vdCBpbXBsZW1lbnRlZC4nO30KY2FuSnVtcFRvRW50cnkoZW50cnlJbmRleCl7cmV0dXJuIHRoaXMuX2VudHJ5Tm9kZXNbZW50cnlJbmRleF0uc2NyaXB0SWQhPT0nMCc7fQplbnRyeVRpdGxlKGVudHJ5SW5kZXgpe2NvbnN0IG5vZGU9dGhpcy5fZW50cnlOb2Rlc1tlbnRyeUluZGV4XTtyZXR1cm4gVUkuYmVhdXRpZnlGdW5jdGlvbk5hbWUobm9kZS5mdW5jdGlvbk5hbWUpO30KZW50cnlGb250KGVudHJ5SW5kZXgpe2lmKCF0aGlzLl9mb250KXt0aGlzLl9mb250PScxMXB4ICcrSG9zdC5mb250RmFtaWx5KCk7dGhpcy5fYm9sZEZvbnQ9J2JvbGQgJyt0aGlzLl9mb250O30KY29uc3Qgbm9kZT10aGlzLl9lbnRyeU5vZGVzW2VudHJ5SW5kZXhdO3JldHVybiBub2RlLmRlb3B0UmVhc29uP3RoaXMuX2JvbGRGb250OnRoaXMuX2ZvbnQ7fQplbnRyeUNvbG9yKGVudHJ5SW5kZXgpe2NvbnN0IG5vZGU9dGhpcy5fZW50cnlOb2Rlc1tlbnRyeUluZGV4XTtyZXR1cm4gdGhpcy5fY29sb3JHZW5lcmF0b3IuY29sb3JGb3JJRChub2RlLnVybHx8KG5vZGUuc2NyaXB0SWQhPT0nMCc/bm9kZS5zY3JpcHRJZDpub2RlLmZ1bmN0aW9uTmFtZSkpO30KZGVjb3JhdGVFbnRyeShlbnRyeUluZGV4LGNvbnRleHQsdGV4dCxiYXJYLGJhclksYmFyV2lkdGgsYmFySGVpZ2h0KXtyZXR1cm4gZmFsc2U7fQpmb3JjZURlY29yYXRpb24oZW50cnlJbmRleCl7cmV0dXJuIGZhbHNlO30KdGV4dENvbG9yKGVudHJ5SW5kZXgpe3JldHVybicjMzMzJzt9fTtQcm9maWxlci5DUFVQcm9maWxlRmxhbWVDaGFydD1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3Ioc2VhcmNoYWJsZVZpZXcsZGF0YVByb3ZpZGVyKXtzdXBlcigpO3RoaXMuZWxlbWVudC5pZD0nY3B1LWZsYW1lLWNoYXJ0Jzt0aGlzLl9zZWFyY2hhYmxlVmlldz1zZWFyY2hhYmxlVmlldzt0aGlzLl9vdmVydmlld1BhbmU9bmV3IFByb2ZpbGVyLkNQVVByb2ZpbGVGbGFtZUNoYXJ0Lk92ZXJ2aWV3UGFuZShkYXRhUHJvdmlkZXIpO3RoaXMuX292ZXJ2aWV3UGFuZS5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fbWFpblBhbmU9bmV3IFBlcmZVSS5GbGFtZUNoYXJ0KGRhdGFQcm92aWRlcix0aGlzLl9vdmVydmlld1BhbmUpO3RoaXMuX21haW5QYW5lLnNldEJhckhlaWdodCgxNSk7dGhpcy5fbWFpblBhbmUuc2V0VGV4dEJhc2VsaW5lKDQpO3RoaXMuX21haW5QYW5lLnNldFRleHRQYWRkaW5nKDIpO3RoaXMuX21haW5QYW5lLnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9tYWluUGFuZS5hZGRFdmVudExpc3RlbmVyKFBlcmZVSS5GbGFtZUNoYXJ0LkV2ZW50cy5FbnRyeVNlbGVjdGVkLHRoaXMuX29uRW50cnlTZWxlY3RlZCx0aGlzKTt0aGlzLl9vdmVydmlld1BhbmUuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuT3ZlcnZpZXdHcmlkLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZCx0aGlzKTt0aGlzLl9kYXRhUHJvdmlkZXI9ZGF0YVByb3ZpZGVyO3RoaXMuX3NlYXJjaFJlc3VsdHM9W107fQpmb2N1cygpe3RoaXMuX21haW5QYW5lLmZvY3VzKCk7fQpfb25XaW5kb3dDaGFuZ2VkKGV2ZW50KXtjb25zdCB3aW5kb3dMZWZ0PWV2ZW50LmRhdGEud2luZG93VGltZUxlZnQ7Y29uc3Qgd2luZG93UmlnaHQ9ZXZlbnQuZGF0YS53aW5kb3dUaW1lUmlnaHQ7dGhpcy5fbWFpblBhbmUuc2V0V2luZG93VGltZXMod2luZG93TGVmdCx3aW5kb3dSaWdodCx0cnVlKTt9CnNlbGVjdFJhbmdlKHRpbWVMZWZ0LHRpbWVSaWdodCl7dGhpcy5fb3ZlcnZpZXdQYW5lLl9zZWxlY3RSYW5nZSh0aW1lTGVmdCx0aW1lUmlnaHQpO30KX29uRW50cnlTZWxlY3RlZChldmVudCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUGVyZlVJLkZsYW1lQ2hhcnQuRXZlbnRzLkVudHJ5U2VsZWN0ZWQsZXZlbnQuZGF0YSk7fQp1cGRhdGUoKXt0aGlzLl9vdmVydmlld1BhbmUudXBkYXRlKCk7dGhpcy5fbWFpblBhbmUudXBkYXRlKCk7fQpwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpe2NvbnN0IG1hdGNoZXI9Y3JlYXRlUGxhaW5UZXh0U2VhcmNoUmVnZXgoc2VhcmNoQ29uZmlnLnF1ZXJ5LHNlYXJjaENvbmZpZy5jYXNlU2Vuc2l0aXZlPycnOidpJyk7Y29uc3Qgc2VsZWN0ZWRFbnRyeUluZGV4PXRoaXMuX3NlYXJjaFJlc3VsdEluZGV4IT09LTE/dGhpcy5fc2VhcmNoUmVzdWx0c1t0aGlzLl9zZWFyY2hSZXN1bHRJbmRleF06LTE7dGhpcy5fc2VhcmNoUmVzdWx0cz1bXTtjb25zdCBlbnRyaWVzQ291bnQ9dGhpcy5fZGF0YVByb3ZpZGVyLl9lbnRyeU5vZGVzLmxlbmd0aDtmb3IobGV0IGluZGV4PTA7aW5kZXg8ZW50cmllc0NvdW50OysraW5kZXgpe2lmKHRoaXMuX2RhdGFQcm92aWRlci5lbnRyeVRpdGxlKGluZGV4KS5tYXRjaChtYXRjaGVyKSkKdGhpcy5fc2VhcmNoUmVzdWx0cy5wdXNoKGluZGV4KTt9CmlmKHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKXt0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD10aGlzLl9zZWFyY2hSZXN1bHRzLmluZGV4T2Yoc2VsZWN0ZWRFbnRyeUluZGV4KTtpZih0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD09PS0xKQp0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD1qdW1wQmFja3dhcmRzP3RoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoLTE6MDt0aGlzLl9tYWluUGFuZS5zZXRTZWxlY3RlZEVudHJ5KHRoaXMuX3NlYXJjaFJlc3VsdHNbdGhpcy5fc2VhcmNoUmVzdWx0SW5kZXhdKTt9ZWxzZXt0aGlzLnNlYXJjaENhbmNlbGVkKCk7fQp0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVTZWFyY2hNYXRjaGVzQ291bnQodGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZUN1cnJlbnRNYXRjaEluZGV4KHRoaXMuX3NlYXJjaFJlc3VsdEluZGV4KTt9CnNlYXJjaENhbmNlbGVkKCl7dGhpcy5fbWFpblBhbmUuc2V0U2VsZWN0ZWRFbnRyeSgtMSk7dGhpcy5fc2VhcmNoUmVzdWx0cz1bXTt0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD0tMTt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXt0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD0odGhpcy5fc2VhcmNoUmVzdWx0SW5kZXgrMSkldGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGg7dGhpcy5fbWFpblBhbmUuc2V0U2VsZWN0ZWRFbnRyeSh0aGlzLl9zZWFyY2hSZXN1bHRzW3RoaXMuX3NlYXJjaFJlc3VsdEluZGV4XSk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlQ3VycmVudE1hdGNoSW5kZXgodGhpcy5fc2VhcmNoUmVzdWx0SW5kZXgpO30KanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXt0aGlzLl9zZWFyY2hSZXN1bHRJbmRleD0odGhpcy5fc2VhcmNoUmVzdWx0SW5kZXgtMSt0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkldGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGg7dGhpcy5fbWFpblBhbmUuc2V0U2VsZWN0ZWRFbnRyeSh0aGlzLl9zZWFyY2hSZXN1bHRzW3RoaXMuX3NlYXJjaFJlc3VsdEluZGV4XSk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlQ3VycmVudE1hdGNoSW5kZXgodGhpcy5fc2VhcmNoUmVzdWx0SW5kZXgpO30Kc3VwcG9ydHNDYXNlU2Vuc2l0aXZlU2VhcmNoKCl7cmV0dXJuIHRydWU7fQpzdXBwb3J0c1JlZ2V4U2VhcmNoKCl7cmV0dXJuIGZhbHNlO319O1Byb2ZpbGVyLkNQVVByb2ZpbGVGbGFtZUNoYXJ0Lk92ZXJ2aWV3Q2FsY3VsYXRvcj1jbGFzc3tjb25zdHJ1Y3RvcihkYXRhUHJvdmlkZXIpe3RoaXMuX2RhdGFQcm92aWRlcj1kYXRhUHJvdmlkZXI7fQpfdXBkYXRlQm91bmRhcmllcyhvdmVydmlld1BhbmUpe3RoaXMuX21pbmltdW1Cb3VuZGFyaWVzPW92ZXJ2aWV3UGFuZS5fZGF0YVByb3ZpZGVyLm1pbmltdW1Cb3VuZGFyeSgpO2NvbnN0IHRvdGFsVGltZT1vdmVydmlld1BhbmUuX2RhdGFQcm92aWRlci50b3RhbFRpbWUoKTt0aGlzLl9tYXhpbXVtQm91bmRhcmllcz10aGlzLl9taW5pbXVtQm91bmRhcmllcyt0b3RhbFRpbWU7dGhpcy5feFNjYWxlRmFjdG9yPW92ZXJ2aWV3UGFuZS5fb3ZlcnZpZXdDb250YWluZXIuY2xpZW50V2lkdGgvdG90YWxUaW1lO30KY29tcHV0ZVBvc2l0aW9uKHRpbWUpe3JldHVybih0aW1lLXRoaXMuX21pbmltdW1Cb3VuZGFyaWVzKSp0aGlzLl94U2NhbGVGYWN0b3I7fQpmb3JtYXRWYWx1ZSh2YWx1ZSxwcmVjaXNpb24pe3JldHVybiB0aGlzLl9kYXRhUHJvdmlkZXIuZm9ybWF0VmFsdWUodmFsdWUtdGhpcy5fbWluaW11bUJvdW5kYXJpZXMscHJlY2lzaW9uKTt9Cm1heGltdW1Cb3VuZGFyeSgpe3JldHVybiB0aGlzLl9tYXhpbXVtQm91bmRhcmllczt9Cm1pbmltdW1Cb3VuZGFyeSgpe3JldHVybiB0aGlzLl9taW5pbXVtQm91bmRhcmllczt9Cnplcm9UaW1lKCl7cmV0dXJuIHRoaXMuX21pbmltdW1Cb3VuZGFyaWVzO30KYm91bmRhcnlTcGFuKCl7cmV0dXJuIHRoaXMuX21heGltdW1Cb3VuZGFyaWVzLXRoaXMuX21pbmltdW1Cb3VuZGFyaWVzO319O1Byb2ZpbGVyLkNQVVByb2ZpbGVGbGFtZUNoYXJ0Lk92ZXJ2aWV3UGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoZGF0YVByb3ZpZGVyKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjcHUtcHJvZmlsZS1mbGFtZS1jaGFydC1vdmVydmlldy1wYW5lJyk7dGhpcy5fb3ZlcnZpZXdDb250YWluZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjcHUtcHJvZmlsZS1mbGFtZS1jaGFydC1vdmVydmlldy1jb250YWluZXInKTt0aGlzLl9vdmVydmlld0dyaWQ9bmV3IFBlcmZVSS5PdmVydmlld0dyaWQoJ2NwdS1wcm9maWxlLWZsYW1lLWNoYXJ0Jyk7dGhpcy5fb3ZlcnZpZXdHcmlkLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsbCcpO3RoaXMuX292ZXJ2aWV3Q2FudmFzPXRoaXMuX292ZXJ2aWV3Q29udGFpbmVyLmNyZWF0ZUNoaWxkKCdjYW52YXMnLCdjcHUtcHJvZmlsZS1mbGFtZS1jaGFydC1vdmVydmlldy1jYW52YXMnKTt0aGlzLl9vdmVydmlld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9vdmVydmlld0dyaWQuZWxlbWVudCk7dGhpcy5fb3ZlcnZpZXdDYWxjdWxhdG9yPW5ldyBQcm9maWxlci5DUFVQcm9maWxlRmxhbWVDaGFydC5PdmVydmlld0NhbGN1bGF0b3IoZGF0YVByb3ZpZGVyKTt0aGlzLl9kYXRhUHJvdmlkZXI9ZGF0YVByb3ZpZGVyO3RoaXMuX292ZXJ2aWV3R3JpZC5hZGRFdmVudExpc3RlbmVyKFBlcmZVSS5PdmVydmlld0dyaWQuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25XaW5kb3dDaGFuZ2VkLHRoaXMpO30Kd2luZG93Q2hhbmdlZCh3aW5kb3dTdGFydFRpbWUsd2luZG93RW5kVGltZSl7dGhpcy5fc2VsZWN0UmFuZ2Uod2luZG93U3RhcnRUaW1lLHdpbmRvd0VuZFRpbWUpO30KdXBkYXRlUmFuZ2VTZWxlY3Rpb24oc3RhcnRUaW1lLGVuZFRpbWUpe30KdXBkYXRlU2VsZWN0ZWRHcm91cChmbGFtZUNoYXJ0LGdyb3VwKXt9Cl9zZWxlY3RSYW5nZSh0aW1lTGVmdCx0aW1lUmlnaHQpe2NvbnN0IHN0YXJ0VGltZT10aGlzLl9kYXRhUHJvdmlkZXIubWluaW11bUJvdW5kYXJ5KCk7Y29uc3QgdG90YWxUaW1lPXRoaXMuX2RhdGFQcm92aWRlci50b3RhbFRpbWUoKTt0aGlzLl9vdmVydmlld0dyaWQuc2V0V2luZG93KCh0aW1lTGVmdC1zdGFydFRpbWUpL3RvdGFsVGltZSwodGltZVJpZ2h0LXN0YXJ0VGltZSkvdG90YWxUaW1lKTt9Cl9vbldpbmRvd0NoYW5nZWQoZXZlbnQpe2NvbnN0IHN0YXJ0VGltZT10aGlzLl9kYXRhUHJvdmlkZXIubWluaW11bUJvdW5kYXJ5KCk7Y29uc3QgdG90YWxUaW1lPXRoaXMuX2RhdGFQcm92aWRlci50b3RhbFRpbWUoKTtjb25zdCBkYXRhPXt3aW5kb3dUaW1lTGVmdDpzdGFydFRpbWUrdGhpcy5fb3ZlcnZpZXdHcmlkLndpbmRvd0xlZnQoKSp0b3RhbFRpbWUsd2luZG93VGltZVJpZ2h0OnN0YXJ0VGltZSt0aGlzLl9vdmVydmlld0dyaWQud2luZG93UmlnaHQoKSp0b3RhbFRpbWV9O3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFBlcmZVSS5PdmVydmlld0dyaWQuRXZlbnRzLldpbmRvd0NoYW5nZWQsZGF0YSk7fQpfdGltZWxpbmVEYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGFQcm92aWRlci50aW1lbGluZURhdGEoKTt9Cm9uUmVzaXplKCl7dGhpcy5fc2NoZWR1bGVVcGRhdGUoKTt9Cl9zY2hlZHVsZVVwZGF0ZSgpe2lmKHRoaXMuX3VwZGF0ZVRpbWVySWQpCnJldHVybjt0aGlzLl91cGRhdGVUaW1lcklkPXRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7fQp1cGRhdGUoKXt0aGlzLl91cGRhdGVUaW1lcklkPTA7Y29uc3QgdGltZWxpbmVEYXRhPXRoaXMuX3RpbWVsaW5lRGF0YSgpO2lmKCF0aW1lbGluZURhdGEpCnJldHVybjt0aGlzLl9yZXNldENhbnZhcyh0aGlzLl9vdmVydmlld0NvbnRhaW5lci5jbGllbnRXaWR0aCx0aGlzLl9vdmVydmlld0NvbnRhaW5lci5jbGllbnRIZWlnaHQtUGVyZlVJLkZsYW1lQ2hhcnQuSGVhZGVySGVpZ2h0KTt0aGlzLl9vdmVydmlld0NhbGN1bGF0b3IuX3VwZGF0ZUJvdW5kYXJpZXModGhpcyk7dGhpcy5fb3ZlcnZpZXdHcmlkLnVwZGF0ZURpdmlkZXJzKHRoaXMuX292ZXJ2aWV3Q2FsY3VsYXRvcik7dGhpcy5fZHJhd092ZXJ2aWV3Q2FudmFzKCk7fQpfZHJhd092ZXJ2aWV3Q2FudmFzKCl7Y29uc3QgY2FudmFzV2lkdGg9dGhpcy5fb3ZlcnZpZXdDYW52YXMud2lkdGg7Y29uc3QgY2FudmFzSGVpZ2h0PXRoaXMuX292ZXJ2aWV3Q2FudmFzLmhlaWdodDtjb25zdCBkcmF3RGF0YT10aGlzLl9jYWxjdWxhdGVEcmF3RGF0YShjYW52YXNXaWR0aCk7Y29uc3QgY29udGV4dD10aGlzLl9vdmVydmlld0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2NvbnN0IHJhdGlvPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO2NvbnN0IG9mZnNldEZyb21Cb3R0b209cmF0aW87Y29uc3QgbGluZVdpZHRoPTE7Y29uc3QgeVNjYWxlRmFjdG9yPWNhbnZhc0hlaWdodC8odGhpcy5fZGF0YVByb3ZpZGVyLm1heFN0YWNrRGVwdGgoKSoxLjEpO2NvbnRleHQubGluZVdpZHRoPWxpbmVXaWR0aDtjb250ZXh0LnRyYW5zbGF0ZSgwLjUsMC41KTtjb250ZXh0LnN0cm9rZVN0eWxlPSdyZ2JhKDIwLDAsMCwwLjQpJztjb250ZXh0LmZpbGxTdHlsZT0ncmdiYSgyMTQsMjI1LDI1NCwwLjgpJztjb250ZXh0Lm1vdmVUbygtbGluZVdpZHRoLGNhbnZhc0hlaWdodCtsaW5lV2lkdGgpO2NvbnRleHQubGluZVRvKC1saW5lV2lkdGgsTWF0aC5yb3VuZChjYW52YXNIZWlnaHQtZHJhd0RhdGFbMF0qeVNjYWxlRmFjdG9yLW9mZnNldEZyb21Cb3R0b20pKTtsZXQgdmFsdWU7Zm9yKGxldCB4PTA7eDxjYW52YXNXaWR0aDsrK3gpe3ZhbHVlPU1hdGgucm91bmQoY2FudmFzSGVpZ2h0LWRyYXdEYXRhW3hdKnlTY2FsZUZhY3Rvci1vZmZzZXRGcm9tQm90dG9tKTtjb250ZXh0LmxpbmVUbyh4LHZhbHVlKTt9CmNvbnRleHQubGluZVRvKGNhbnZhc1dpZHRoK2xpbmVXaWR0aCx2YWx1ZSk7Y29udGV4dC5saW5lVG8oY2FudmFzV2lkdGgrbGluZVdpZHRoLGNhbnZhc0hlaWdodCtsaW5lV2lkdGgpO2NvbnRleHQuZmlsbCgpO2NvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC5jbG9zZVBhdGgoKTt9Cl9jYWxjdWxhdGVEcmF3RGF0YSh3aWR0aCl7Y29uc3QgZGF0YVByb3ZpZGVyPXRoaXMuX2RhdGFQcm92aWRlcjtjb25zdCB0aW1lbGluZURhdGE9dGhpcy5fdGltZWxpbmVEYXRhKCk7Y29uc3QgZW50cnlTdGFydFRpbWVzPXRpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXM7Y29uc3QgZW50cnlUb3RhbFRpbWVzPXRpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXM7Y29uc3QgZW50cnlMZXZlbHM9dGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzO2NvbnN0IGxlbmd0aD1lbnRyeVN0YXJ0VGltZXMubGVuZ3RoO2NvbnN0IG1pbmltdW1Cb3VuZGFyeT10aGlzLl9kYXRhUHJvdmlkZXIubWluaW11bUJvdW5kYXJ5KCk7Y29uc3QgZHJhd0RhdGE9bmV3IFVpbnQ4QXJyYXkod2lkdGgpO2NvbnN0IHNjYWxlRmFjdG9yPXdpZHRoL2RhdGFQcm92aWRlci50b3RhbFRpbWUoKTtmb3IobGV0IGVudHJ5SW5kZXg9MDtlbnRyeUluZGV4PGxlbmd0aDsrK2VudHJ5SW5kZXgpe2NvbnN0IHN0YXJ0PU1hdGguZmxvb3IoKGVudHJ5U3RhcnRUaW1lc1tlbnRyeUluZGV4XS1taW5pbXVtQm91bmRhcnkpKnNjYWxlRmFjdG9yKTtjb25zdCBmaW5pc2g9TWF0aC5mbG9vcigoZW50cnlTdGFydFRpbWVzW2VudHJ5SW5kZXhdLW1pbmltdW1Cb3VuZGFyeStlbnRyeVRvdGFsVGltZXNbZW50cnlJbmRleF0pKnNjYWxlRmFjdG9yKTtmb3IobGV0IHg9c3RhcnQ7eDw9ZmluaXNoOysreCkKZHJhd0RhdGFbeF09TWF0aC5tYXgoZHJhd0RhdGFbeF0sZW50cnlMZXZlbHNbZW50cnlJbmRleF0rMSk7fQpyZXR1cm4gZHJhd0RhdGE7fQpfcmVzZXRDYW52YXMod2lkdGgsaGVpZ2h0KXtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9vdmVydmlld0NhbnZhcy53aWR0aD13aWR0aCpyYXRpbzt0aGlzLl9vdmVydmlld0NhbnZhcy5oZWlnaHQ9aGVpZ2h0KnJhdGlvO3RoaXMuX292ZXJ2aWV3Q2FudmFzLnN0eWxlLndpZHRoPXdpZHRoKydweCc7dGhpcy5fb3ZlcnZpZXdDYW52YXMuc3R5bGUuaGVpZ2h0PWhlaWdodCsncHgnO319OztQcm9maWxlci5DUFVQcm9maWxlVmlldz1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVWaWV3e2NvbnN0cnVjdG9yKHByb2ZpbGVIZWFkZXIpe3N1cGVyKCk7dGhpcy5fcHJvZmlsZUhlYWRlcj1wcm9maWxlSGVhZGVyO3RoaXMucHJvZmlsZT1wcm9maWxlSGVhZGVyLnByb2ZpbGVNb2RlbCgpO3RoaXMuYWRqdXN0ZWRUb3RhbD10aGlzLnByb2ZpbGUucHJvZmlsZUhlYWQudG90YWw7dGhpcy5hZGp1c3RlZFRvdGFsLT10aGlzLnByb2ZpbGUuaWRsZU5vZGU/dGhpcy5wcm9maWxlLmlkbGVOb2RlLnRvdGFsOjA7dGhpcy5pbml0aWFsaXplKG5ldyBQcm9maWxlci5DUFVQcm9maWxlVmlldy5Ob2RlRm9ybWF0dGVyKHRoaXMpKTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTtjb25zdCBsaW5lTGV2ZWxQcm9maWxlPVBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLmluc3RhbmNlKCk7bGluZUxldmVsUHJvZmlsZS5yZXNldCgpO2xpbmVMZXZlbFByb2ZpbGUuYXBwZW5kQ1BVUHJvZmlsZSh0aGlzLnByb2ZpbGUpO30KY29sdW1uSGVhZGVyKGNvbHVtbklkKXtzd2l0Y2goY29sdW1uSWQpe2Nhc2Unc2VsZic6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnU2VsZiBUaW1lJyk7Y2FzZSd0b3RhbCc6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnVG90YWwgVGltZScpO30KcmV0dXJuJyc7fQpjcmVhdGVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyKCl7cmV0dXJuIG5ldyBQcm9maWxlci5DUFVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyKHRoaXMucHJvZmlsZSx0aGlzLl9wcm9maWxlSGVhZGVyLl9jcHVQcm9maWxlck1vZGVsKTt9fTtQcm9maWxlci5DUFVQcm9maWxlVHlwZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVUeXBle2NvbnN0cnVjdG9yKCl7c3VwZXIoUHJvZmlsZXIuQ1BVUHJvZmlsZVR5cGUuVHlwZUlkLENvbW1vbi5VSVN0cmluZygnUmVjb3JkIEphdmFTY3JpcHQgQ1BVIFByb2ZpbGUnKSk7dGhpcy5fcmVjb3JkaW5nPWZhbHNlO1Byb2ZpbGVyLkNQVVByb2ZpbGVUeXBlLmluc3RhbmNlPXRoaXM7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuQ1BVUHJvZmlsZXJNb2RlbCxTREsuQ1BVUHJvZmlsZXJNb2RlbC5FdmVudHMuQ29uc29sZVByb2ZpbGVGaW5pc2hlZCx0aGlzLl9jb25zb2xlUHJvZmlsZUZpbmlzaGVkLHRoaXMpO30KcHJvZmlsZUJlaW5nUmVjb3JkZWQoKXtyZXR1cm4oc3VwZXIucHJvZmlsZUJlaW5nUmVjb3JkZWQoKSk7fQp0eXBlTmFtZSgpe3JldHVybidDUFUnO30KZmlsZUV4dGVuc2lvbigpe3JldHVybicuY3B1cHJvZmlsZSc7fQpnZXQgYnV0dG9uVG9vbHRpcCgpe3JldHVybiB0aGlzLl9yZWNvcmRpbmc/Q29tbW9uLlVJU3RyaW5nKCdTdG9wIENQVSBwcm9maWxpbmcnKTpDb21tb24uVUlTdHJpbmcoJ1N0YXJ0IENQVSBwcm9maWxpbmcnKTt9CmJ1dHRvbkNsaWNrZWQoKXtpZih0aGlzLl9yZWNvcmRpbmcpe3RoaXMuc3RvcFJlY29yZGluZ1Byb2ZpbGUoKTtyZXR1cm4gZmFsc2U7fWVsc2V7dGhpcy5zdGFydFJlY29yZGluZ1Byb2ZpbGUoKTtyZXR1cm4gdHJ1ZTt9fQpnZXQgdHJlZUl0ZW1UaXRsZSgpe3JldHVybiBDb21tb24uVUlTdHJpbmcoJ0NQVSBQUk9GSUxFUycpO30KZ2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnQ1BVIHByb2ZpbGVzIHNob3cgd2hlcmUgdGhlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHlvdXIgcGFnZVwncyBKYXZhU2NyaXB0IGZ1bmN0aW9ucy4nKTt9Cl9jb25zb2xlUHJvZmlsZUZpbmlzaGVkKGV2ZW50KXtjb25zdCBkYXRhPShldmVudC5kYXRhKTtjb25zdCBjcHVQcm9maWxlPShkYXRhLmNwdVByb2ZpbGUpO2NvbnN0IHByb2ZpbGU9bmV3IFByb2ZpbGVyLkNQVVByb2ZpbGVIZWFkZXIoZGF0YS5jcHVQcm9maWxlck1vZGVsLHRoaXMsZGF0YS50aXRsZSk7cHJvZmlsZS5zZXRQcm90b2NvbFByb2ZpbGUoY3B1UHJvZmlsZSk7dGhpcy5hZGRQcm9maWxlKHByb2ZpbGUpO30Kc3RhcnRSZWNvcmRpbmdQcm9maWxlKCl7Y29uc3QgY3B1UHJvZmlsZXJNb2RlbD1VSS5jb250ZXh0LmZsYXZvcihTREsuQ1BVUHJvZmlsZXJNb2RlbCk7aWYodGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpfHwhY3B1UHJvZmlsZXJNb2RlbCkKcmV0dXJuO2NvbnN0IHByb2ZpbGU9bmV3IFByb2ZpbGVyLkNQVVByb2ZpbGVIZWFkZXIoY3B1UHJvZmlsZXJNb2RlbCx0aGlzKTt0aGlzLnNldFByb2ZpbGVCZWluZ1JlY29yZGVkKHByb2ZpbGUpO1NESy50YXJnZXRNYW5hZ2VyLnN1c3BlbmRBbGxUYXJnZXRzKCk7dGhpcy5hZGRQcm9maWxlKHByb2ZpbGUpO3Byb2ZpbGUudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnUmVjb3JkaW5nXHUyMDI2JykpO3RoaXMuX3JlY29yZGluZz10cnVlO2NwdVByb2ZpbGVyTW9kZWwuc3RhcnRSZWNvcmRpbmcoKTtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlByb2ZpbGVzQ1BVUHJvZmlsZVRha2VuKTt9CmFzeW5jIHN0b3BSZWNvcmRpbmdQcm9maWxlKCl7dGhpcy5fcmVjb3JkaW5nPWZhbHNlO2lmKCF0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCl8fCF0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkuX2NwdVByb2ZpbGVyTW9kZWwpCnJldHVybjtjb25zdCBwcm9maWxlPWF3YWl0IHRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKS5fY3B1UHJvZmlsZXJNb2RlbC5zdG9wUmVjb3JkaW5nKCk7Y29uc3QgcmVjb3JkZWRQcm9maWxlPXRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKTtpZihyZWNvcmRlZFByb2ZpbGUpe2NvbnNvbGUuYXNzZXJ0KHByb2ZpbGUpO3JlY29yZGVkUHJvZmlsZS5zZXRQcm90b2NvbFByb2ZpbGUocHJvZmlsZSk7cmVjb3JkZWRQcm9maWxlLnVwZGF0ZVN0YXR1cygnJyk7dGhpcy5zZXRQcm9maWxlQmVpbmdSZWNvcmRlZChudWxsKTt9CmF3YWl0IFNESy50YXJnZXRNYW5hZ2VyLnJlc3VtZUFsbFRhcmdldHMoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQcm9maWxlci5Qcm9maWxlVHlwZS5FdmVudHMuUHJvZmlsZUNvbXBsZXRlLHJlY29yZGVkUHJvZmlsZSk7fQpjcmVhdGVQcm9maWxlTG9hZGVkRnJvbUZpbGUodGl0bGUpe3JldHVybiBuZXcgUHJvZmlsZXIuQ1BVUHJvZmlsZUhlYWRlcihudWxsLHRoaXMsdGl0bGUpO30KcHJvZmlsZUJlaW5nUmVjb3JkZWRSZW1vdmVkKCl7dGhpcy5zdG9wUmVjb3JkaW5nUHJvZmlsZSgpO319O1Byb2ZpbGVyLkNQVVByb2ZpbGVUeXBlLlR5cGVJZD0nQ1BVJztQcm9maWxlci5DUFVQcm9maWxlSGVhZGVyPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuV3JpdGFibGVQcm9maWxlSGVhZGVye2NvbnN0cnVjdG9yKGNwdVByb2ZpbGVyTW9kZWwsdHlwZSx0aXRsZSl7c3VwZXIoY3B1UHJvZmlsZXJNb2RlbCYmY3B1UHJvZmlsZXJNb2RlbC5kZWJ1Z2dlck1vZGVsKCksdHlwZSx0aXRsZSk7dGhpcy5fY3B1UHJvZmlsZXJNb2RlbD1jcHVQcm9maWxlck1vZGVsO30KY3JlYXRlVmlldygpe3JldHVybiBuZXcgUHJvZmlsZXIuQ1BVUHJvZmlsZVZpZXcodGhpcyk7fQpwcm90b2NvbFByb2ZpbGUoKXtyZXR1cm4gdGhpcy5fcHJvdG9jb2xQcm9maWxlO30KcHJvZmlsZU1vZGVsKCl7cmV0dXJuIHRoaXMuX3Byb2ZpbGVNb2RlbDt9CnNldFByb2ZpbGUocHJvZmlsZSl7dGhpcy5fcHJvZmlsZU1vZGVsPW5ldyBTREsuQ1BVUHJvZmlsZURhdGFNb2RlbChwcm9maWxlKTt9fTtQcm9maWxlci5DUFVQcm9maWxlVmlldy5Ob2RlRm9ybWF0dGVyPWNsYXNze2NvbnN0cnVjdG9yKHByb2ZpbGVWaWV3KXt0aGlzLl9wcm9maWxlVmlldz1wcm9maWxlVmlldzt9CmZvcm1hdFZhbHVlKHZhbHVlKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjFmXHhhMG1zJyx2YWx1ZSk7fQpmb3JtYXRQZXJjZW50KHZhbHVlLG5vZGUpe3JldHVybiBub2RlLnByb2ZpbGVOb2RlPT09dGhpcy5fcHJvZmlsZVZpZXcucHJvZmlsZS5pZGxlTm9kZT8nJzpDb21tb24uVUlTdHJpbmcoJyUuMmZceGEwJSUnLHZhbHVlKTt9CmxpbmtpZnlOb2RlKG5vZGUpe2NvbnN0IGNwdVByb2ZpbGVyTW9kZWw9dGhpcy5fcHJvZmlsZVZpZXcuX3Byb2ZpbGVIZWFkZXIuX2NwdVByb2ZpbGVyTW9kZWw7cmV0dXJuIHRoaXMuX3Byb2ZpbGVWaWV3LmxpbmtpZmllcigpLm1heWJlTGlua2lmeUNvbnNvbGVDYWxsRnJhbWUoY3B1UHJvZmlsZXJNb2RlbD9jcHVQcm9maWxlck1vZGVsLnRhcmdldCgpOm51bGwsbm9kZS5wcm9maWxlTm9kZS5jYWxsRnJhbWUsJ3Byb2ZpbGUtbm9kZS1maWxlJyk7fX07UHJvZmlsZXIuQ1BVRmxhbWVDaGFydERhdGFQcm92aWRlcj1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVye2NvbnN0cnVjdG9yKGNwdVByb2ZpbGUsY3B1UHJvZmlsZXJNb2RlbCl7c3VwZXIoKTt0aGlzLl9jcHVQcm9maWxlPWNwdVByb2ZpbGU7dGhpcy5fY3B1UHJvZmlsZXJNb2RlbD1jcHVQcm9maWxlck1vZGVsO30KX2NhbGN1bGF0ZVRpbWVsaW5lRGF0YSgpe2NvbnN0IGVudHJpZXM9W107Y29uc3Qgc3RhY2s9W107bGV0IG1heERlcHRoPTU7ZnVuY3Rpb24gb25PcGVuRnJhbWUoKXtzdGFjay5wdXNoKGVudHJpZXMubGVuZ3RoKTtlbnRyaWVzLnB1c2gobnVsbCk7fQpmdW5jdGlvbiBvbkNsb3NlRnJhbWUoZGVwdGgsbm9kZSxzdGFydFRpbWUsdG90YWxUaW1lLHNlbGZUaW1lKXtjb25zdCBpbmRleD1zdGFjay5wb3AoKTtlbnRyaWVzW2luZGV4XT1uZXcgUHJvZmlsZXIuQ1BVRmxhbWVDaGFydERhdGFQcm92aWRlci5DaGFydEVudHJ5KGRlcHRoLHRvdGFsVGltZSxzdGFydFRpbWUsc2VsZlRpbWUsbm9kZSk7bWF4RGVwdGg9TWF0aC5tYXgobWF4RGVwdGgsZGVwdGgpO30KdGhpcy5fY3B1UHJvZmlsZS5mb3JFYWNoRnJhbWUob25PcGVuRnJhbWUsb25DbG9zZUZyYW1lKTtjb25zdCBlbnRyeU5vZGVzPW5ldyBBcnJheShlbnRyaWVzLmxlbmd0aCk7Y29uc3QgZW50cnlMZXZlbHM9bmV3IFVpbnQxNkFycmF5KGVudHJpZXMubGVuZ3RoKTtjb25zdCBlbnRyeVRvdGFsVGltZXM9bmV3IEZsb2F0MzJBcnJheShlbnRyaWVzLmxlbmd0aCk7Y29uc3QgZW50cnlTZWxmVGltZXM9bmV3IEZsb2F0MzJBcnJheShlbnRyaWVzLmxlbmd0aCk7Y29uc3QgZW50cnlTdGFydFRpbWVzPW5ldyBGbG9hdDY0QXJyYXkoZW50cmllcy5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8ZW50cmllcy5sZW5ndGg7KytpKXtjb25zdCBlbnRyeT1lbnRyaWVzW2ldO2VudHJ5Tm9kZXNbaV09ZW50cnkubm9kZTtlbnRyeUxldmVsc1tpXT1lbnRyeS5kZXB0aDtlbnRyeVRvdGFsVGltZXNbaV09ZW50cnkuZHVyYXRpb247ZW50cnlTdGFydFRpbWVzW2ldPWVudHJ5LnN0YXJ0VGltZTtlbnRyeVNlbGZUaW1lc1tpXT1lbnRyeS5zZWxmVGltZTt9CnRoaXMuX21heFN0YWNrRGVwdGg9bWF4RGVwdGgrMTt0aGlzLl90aW1lbGluZURhdGE9bmV3IFBlcmZVSS5GbGFtZUNoYXJ0LlRpbWVsaW5lRGF0YShlbnRyeUxldmVscyxlbnRyeVRvdGFsVGltZXMsZW50cnlTdGFydFRpbWVzLG51bGwpO3RoaXMuX2VudHJ5Tm9kZXM9ZW50cnlOb2Rlczt0aGlzLl9lbnRyeVNlbGZUaW1lcz1lbnRyeVNlbGZUaW1lcztyZXR1cm4gdGhpcy5fdGltZWxpbmVEYXRhO30KcHJlcGFyZUhpZ2hsaWdodGVkRW50cnlJbmZvKGVudHJ5SW5kZXgpe2NvbnN0IHRpbWVsaW5lRGF0YT10aGlzLl90aW1lbGluZURhdGE7Y29uc3Qgbm9kZT10aGlzLl9lbnRyeU5vZGVzW2VudHJ5SW5kZXhdO2lmKCFub2RlKQpyZXR1cm4gbnVsbDtjb25zdCBlbnRyeUluZm89W107ZnVuY3Rpb24gcHVzaEVudHJ5SW5mb1Jvdyh0aXRsZSx2YWx1ZSl7ZW50cnlJbmZvLnB1c2goe3RpdGxlOnRpdGxlLHZhbHVlOnZhbHVlfSk7fQpmdW5jdGlvbiBtaWxsaXNlY29uZHNUb1N0cmluZyhtcyl7aWYobXM9PT0wKQpyZXR1cm4nMCc7aWYobXM8MTAwMCkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJS4xZlx4YTBtcycsbXMpO3JldHVybiBOdW1iZXIuc2Vjb25kc1RvU3RyaW5nKG1zLzEwMDAsdHJ1ZSk7fQpjb25zdCBuYW1lPVVJLmJlYXV0aWZ5RnVuY3Rpb25OYW1lKG5vZGUuZnVuY3Rpb25OYW1lKTtwdXNoRW50cnlJbmZvUm93KENvbW1vbi5VSVN0cmluZygnTmFtZScpLG5hbWUpO2NvbnN0IHNlbGZUaW1lPW1pbGxpc2Vjb25kc1RvU3RyaW5nKHRoaXMuX2VudHJ5U2VsZlRpbWVzW2VudHJ5SW5kZXhdKTtjb25zdCB0b3RhbFRpbWU9bWlsbGlzZWNvbmRzVG9TdHJpbmcodGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lc1tlbnRyeUluZGV4XSk7cHVzaEVudHJ5SW5mb1JvdyhDb21tb24uVUlTdHJpbmcoJ1NlbGYgdGltZScpLHNlbGZUaW1lKTtwdXNoRW50cnlJbmZvUm93KENvbW1vbi5VSVN0cmluZygnVG90YWwgdGltZScpLHRvdGFsVGltZSk7Y29uc3QgbGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcigpO2NvbnN0IGxpbms9bGlua2lmaWVyLm1heWJlTGlua2lmeUNvbnNvbGVDYWxsRnJhbWUodGhpcy5fY3B1UHJvZmlsZXJNb2RlbCYmdGhpcy5fY3B1UHJvZmlsZXJNb2RlbC50YXJnZXQoKSxub2RlLmNhbGxGcmFtZSk7aWYobGluaykKcHVzaEVudHJ5SW5mb1JvdyhDb21tb24uVUlTdHJpbmcoJ1VSTCcpLGxpbmsudGV4dENvbnRlbnQpO2xpbmtpZmllci5kaXNwb3NlKCk7cHVzaEVudHJ5SW5mb1JvdyhDb21tb24uVUlTdHJpbmcoJ0FnZ3JlZ2F0ZWQgc2VsZiB0aW1lJyksTnVtYmVyLnNlY29uZHNUb1N0cmluZyhub2RlLnNlbGYvMTAwMCx0cnVlKSk7cHVzaEVudHJ5SW5mb1JvdyhDb21tb24uVUlTdHJpbmcoJ0FnZ3JlZ2F0ZWQgdG90YWwgdGltZScpLE51bWJlci5zZWNvbmRzVG9TdHJpbmcobm9kZS50b3RhbC8xMDAwLHRydWUpKTtpZihub2RlLmRlb3B0UmVhc29uKQpwdXNoRW50cnlJbmZvUm93KENvbW1vbi5VSVN0cmluZygnTm90IG9wdGltaXplZCcpLG5vZGUuZGVvcHRSZWFzb24pO3JldHVybiBQcm9maWxlci5Qcm9maWxlVmlldy5idWlsZFBvcG92ZXJUYWJsZShlbnRyeUluZm8pO319O1Byb2ZpbGVyLkNQVUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuQ2hhcnRFbnRyeT1jbGFzc3tjb25zdHJ1Y3RvcihkZXB0aCxkdXJhdGlvbixzdGFydFRpbWUsc2VsZlRpbWUsbm9kZSl7dGhpcy5kZXB0aD1kZXB0aDt0aGlzLmR1cmF0aW9uPWR1cmF0aW9uO3RoaXMuc3RhcnRUaW1lPXN0YXJ0VGltZTt0aGlzLnNlbGZUaW1lPXNlbGZUaW1lO3RoaXMubm9kZT1ub2RlO319OztQcm9maWxlci5IZWFwUHJvZmlsZVZpZXc9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5Qcm9maWxlVmlld3tjb25zdHJ1Y3Rvcihwcm9maWxlSGVhZGVyKXtzdXBlcigpO3RoaXMuX3Byb2ZpbGVIZWFkZXI9cHJvZmlsZUhlYWRlcjt0aGlzLnByb2ZpbGU9bmV3IFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVNb2RlbChwcm9maWxlSGVhZGVyLl9wcm9maWxlfHxwcm9maWxlSGVhZGVyLnByb3RvY29sUHJvZmlsZSgpKTt0aGlzLmFkanVzdGVkVG90YWw9dGhpcy5wcm9maWxlLnRvdGFsO2NvbnN0IHZpZXdzPVtQcm9maWxlci5Qcm9maWxlVmlldy5WaWV3VHlwZXMuRmxhbWUsUHJvZmlsZXIuUHJvZmlsZVZpZXcuVmlld1R5cGVzLkhlYXZ5LFByb2ZpbGVyLlByb2ZpbGVWaWV3LlZpZXdUeXBlcy5UcmVlXTtjb25zdCBpc05hdGl2ZVByb2ZpbGU9W1Byb2ZpbGVyLlNhbXBsaW5nTmF0aXZlSGVhcFByb2ZpbGVUeXBlLlR5cGVJZCxQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBTbmFwc2hvdFR5cGUuVHlwZUlkXS5pbmNsdWRlcyhwcm9maWxlSGVhZGVyLnByb2ZpbGVUeXBlKCkuaWQpO2lmKGlzTmF0aXZlUHJvZmlsZSkKdmlld3MucHVzaChQcm9maWxlci5Qcm9maWxlVmlldy5WaWV3VHlwZXMuVGV4dCk7dGhpcy5pbml0aWFsaXplKG5ldyBQcm9maWxlci5IZWFwUHJvZmlsZVZpZXcuTm9kZUZvcm1hdHRlcih0aGlzKSx2aWV3cyk7fQpjb2x1bW5IZWFkZXIoY29sdW1uSWQpe3N3aXRjaChjb2x1bW5JZCl7Y2FzZSdzZWxmJzpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTZWxmIFNpemUgKGJ5dGVzKScpO2Nhc2UndG90YWwnOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1RvdGFsIFNpemUgKGJ5dGVzKScpO30KcmV0dXJuJyc7fQpjcmVhdGVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyKCl7cmV0dXJuIG5ldyBQcm9maWxlci5IZWFwRmxhbWVDaGFydERhdGFQcm92aWRlcih0aGlzLnByb2ZpbGUsdGhpcy5fcHJvZmlsZUhlYWRlci5oZWFwUHJvZmlsZXJNb2RlbCgpKTt9CnBvcHVsYXRlVGV4dFZpZXcodmlldyl7Y29uc3QgZ3VpZGVzPScrITp8JztsZXQgdGV4dD1gU2FtcGxpbmcgbWVtb3J5IHByb2ZpbGUuXG5cbkRhdGUvVGltZTogICAgICAgJHtuZXcgRGF0ZSgpfVxuYCtgUmVwb3J0IFZlcnNpb246ICA3XG5Ob2RlIHdlaWdodDogICAgIDEgS2lCXG4tLS0tXG5cbkNhbGwgZ3JhcGg6XG5gO2NvbnN0IHNvcnRlZENoaWxkcmVuPXRoaXMucHJvZmlsZS5yb290LmNoaWxkcmVuLnNvcnQoKGEsYik9PmIudG90YWwtYS50b3RhbCk7Zm9yKGNvbnN0IGNoaWxkIG9mIHNvcnRlZENoaWxkcmVuKQpwcmludFRyZWUoJyAgICAnLGNoaWxkIT09c29ydGVkQ2hpbGRyZW4ucGVla0xhc3QoKSxjaGlsZCk7dmlldy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgncHJlJywncHJvZmlsZS10ZXh0LXZpZXcgbW9ub3NwYWNlJykudGV4dENvbnRlbnQ9dGV4dDtmdW5jdGlvbiBwcmludFRyZWUocGFkZGluZyxkcmF3R3VpZGUsbm9kZSl7Y29uc3QgaXNBZGRyZXNzPW5vZGUuZnVuY3Rpb25OYW1lLnN0YXJ0c1dpdGgoJzB4Jyk7Y29uc3QgZnVuY3Rpb25OYW1lPWlzQWRkcmVzcz8nPz8/Jzpub2RlLmZ1bmN0aW9uTmFtZTtjb25zdCBhZGRyZXNzPWlzQWRkcmVzcz9ub2RlLmZ1bmN0aW9uTmFtZTonPz8/Jzt0ZXh0Kz1gJHtwYWRkaW5nfSR7TWF0aC5yb3VuZChub2RlLnRvdGFsIC8gMTAyNCl9ICAke2Z1bmN0aW9uTmFtZX0gIFske2FkZHJlc3N9XVxuYDtjb25zdCBndWlkZUNoYXI9ZHJhd0d1aWRlP2d1aWRlc1twYWRkaW5nLmxlbmd0aC8yJWd1aWRlcy5sZW5ndGhdOicgJztjb25zdCBuZXh0UGFkZGluZz1wYWRkaW5nK2d1aWRlQ2hhcisnICc7Y29uc3Qgc29ydGVkQ2hpbGRyZW49bm9kZS5jaGlsZHJlbi5zb3J0KChhLGIpPT5iLnRvdGFsLWEudG90YWwpO2Zvcihjb25zdCBjaGlsZCBvZiBzb3J0ZWRDaGlsZHJlbikKcHJpbnRUcmVlKG5leHRQYWRkaW5nLGNoaWxkIT09c29ydGVkQ2hpbGRyZW4ucGVla0xhc3QoKSxjaGlsZCk7fX19O1Byb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVUeXBlQmFzZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVUeXBle2NvbnN0cnVjdG9yKHR5cGVJZCxkZXNjcmlwdGlvbil7c3VwZXIodHlwZUlkLGRlc2NyaXB0aW9uKTt0aGlzLl9yZWNvcmRpbmc9ZmFsc2U7fQpwcm9maWxlQmVpbmdSZWNvcmRlZCgpe3JldHVybihzdXBlci5wcm9maWxlQmVpbmdSZWNvcmRlZCgpKTt9CnR5cGVOYW1lKCl7cmV0dXJuJ0hlYXAnO30KZmlsZUV4dGVuc2lvbigpe3JldHVybicuaGVhcHByb2ZpbGUnO30KZ2V0IGJ1dHRvblRvb2x0aXAoKXtyZXR1cm4gdGhpcy5fcmVjb3JkaW5nP0NvbW1vbi5VSVN0cmluZygnU3RvcCBoZWFwIHByb2ZpbGluZycpOkNvbW1vbi5VSVN0cmluZygnU3RhcnQgaGVhcCBwcm9maWxpbmcnKTt9CmJ1dHRvbkNsaWNrZWQoKXtjb25zdCB3YXNSZWNvcmRpbmc9dGhpcy5fcmVjb3JkaW5nO2lmKHdhc1JlY29yZGluZykKdGhpcy5zdG9wUmVjb3JkaW5nUHJvZmlsZSgpO2Vsc2UKdGhpcy5zdGFydFJlY29yZGluZ1Byb2ZpbGUoKTtyZXR1cm4hd2FzUmVjb3JkaW5nO30Kc3RhcnRSZWNvcmRpbmdQcm9maWxlKCl7Y29uc3QgaGVhcFByb2ZpbGVyTW9kZWw9VUkuY29udGV4dC5mbGF2b3IoU0RLLkhlYXBQcm9maWxlck1vZGVsKTtpZih0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCl8fCFoZWFwUHJvZmlsZXJNb2RlbCkKcmV0dXJuO2NvbnN0IHByb2ZpbGU9bmV3IFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVIZWFkZXIoaGVhcFByb2ZpbGVyTW9kZWwsdGhpcyk7dGhpcy5zZXRQcm9maWxlQmVpbmdSZWNvcmRlZChwcm9maWxlKTtTREsudGFyZ2V0TWFuYWdlci5zdXNwZW5kQWxsVGFyZ2V0cygpO3RoaXMuYWRkUHJvZmlsZShwcm9maWxlKTtwcm9maWxlLnVwZGF0ZVN0YXR1cyhDb21tb24uVUlTdHJpbmcoJ1JlY29yZGluZ1x1MjAyNicpKTt0aGlzLl9yZWNvcmRpbmc9dHJ1ZTt0aGlzLl9zdGFydFNhbXBsaW5nKCk7fQphc3luYyBzdG9wUmVjb3JkaW5nUHJvZmlsZSgpe3RoaXMuX3JlY29yZGluZz1mYWxzZTtpZighdGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpfHwhdGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpLmhlYXBQcm9maWxlck1vZGVsKCkpCnJldHVybjt0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnU3RvcHBpbmdcdTIwMjYnKSk7Y29uc3QgcHJvZmlsZT1hd2FpdCB0aGlzLl9zdG9wU2FtcGxpbmcoKTtjb25zdCByZWNvcmRlZFByb2ZpbGU9dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpO2lmKHJlY29yZGVkUHJvZmlsZSl7Y29uc29sZS5hc3NlcnQocHJvZmlsZSk7cmVjb3JkZWRQcm9maWxlLnNldFByb3RvY29sUHJvZmlsZShwcm9maWxlKTtyZWNvcmRlZFByb2ZpbGUudXBkYXRlU3RhdHVzKCcnKTt0aGlzLnNldFByb2ZpbGVCZWluZ1JlY29yZGVkKG51bGwpO30KYXdhaXQgU0RLLnRhcmdldE1hbmFnZXIucmVzdW1lQWxsVGFyZ2V0cygpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLlByb2ZpbGVUeXBlLkV2ZW50cy5Qcm9maWxlQ29tcGxldGUscmVjb3JkZWRQcm9maWxlKTt9CmNyZWF0ZVByb2ZpbGVMb2FkZWRGcm9tRmlsZSh0aXRsZSl7cmV0dXJuIG5ldyBQcm9maWxlci5TYW1wbGluZ0hlYXBQcm9maWxlSGVhZGVyKG51bGwsdGhpcyx0aXRsZSk7fQpwcm9maWxlQmVpbmdSZWNvcmRlZFJlbW92ZWQoKXt0aGlzLnN0b3BSZWNvcmRpbmdQcm9maWxlKCk7fQpfc3RhcnRTYW1wbGluZygpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpfc3RvcFNhbXBsaW5nKCl7dGhyb3cnTm90IGltcGxlbWVudGVkJzt9fTtQcm9maWxlci5TYW1wbGluZ0hlYXBQcm9maWxlVHlwZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVUeXBlQmFzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVUeXBlLlR5cGVJZCxsc2BBbGxvY2F0aW9uIHNhbXBsaW5nYCk7UHJvZmlsZXIuU2FtcGxpbmdIZWFwUHJvZmlsZVR5cGUuaW5zdGFuY2U9dGhpczt9CmdldCB0cmVlSXRlbVRpdGxlKCl7cmV0dXJuIGxzYFNBTVBMSU5HIFBST0ZJTEVTYDt9CmdldCBkZXNjcmlwdGlvbigpe3JldHVybiBsc2BSZWNvcmQgbWVtb3J5IGFsbG9jYXRpb25zIHVzaW5nIHNhbXBsaW5nIG1ldGhvZC4KICAgICAgICAgICAgICBUaGlzIHByb2ZpbGUgdHlwZSBoYXMgbWluaW1hbCBwZXJmb3JtYW5jZSBvdmVyaGVhZCBhbmQgY2FuIGJlIHVzZWQgZm9yIGxvbmcgcnVubmluZyBvcGVyYXRpb25zLgogICAgICAgICAgICAgIEl0IHByb3ZpZGVzIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBhbGxvY2F0aW9ucyBicm9rZW4gZG93biBieSBKYXZhU2NyaXB0IGV4ZWN1dGlvbiBzdGFjay5gO30KX3N0YXJ0U2FtcGxpbmcoKXt0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkuaGVhcFByb2ZpbGVyTW9kZWwoKS5zdGFydFNhbXBsaW5nKCk7fQpfc3RvcFNhbXBsaW5nKCl7cmV0dXJuIHRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKS5oZWFwUHJvZmlsZXJNb2RlbCgpLnN0b3BTYW1wbGluZygpO319O1Byb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVUeXBlLlR5cGVJZD0nU2FtcGxpbmdIZWFwJztQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBQcm9maWxlVHlwZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVUeXBlQmFzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKFByb2ZpbGVyLlNhbXBsaW5nTmF0aXZlSGVhcFByb2ZpbGVUeXBlLlR5cGVJZCxsc2BOYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gc2FtcGxpbmdgKTtQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBQcm9maWxlVHlwZS5pbnN0YW5jZT10aGlzO30KZ2V0IHRyZWVJdGVtVGl0bGUoKXtyZXR1cm4gbHNgTkFUSVZFIFNBTVBMSU5HIFBST0ZJTEVTYDt9CmdldCBkZXNjcmlwdGlvbigpe3JldHVybiBsc2BBbGxvY2F0aW9uIHByb2ZpbGVzIHNob3cgc2FtcGxlZCBuYXRpdmUgbWVtb3J5IGFsbG9jYXRpb25zIGZyb20gdGhlIHJlbmRlcmVyIHByb2Nlc3MuYDt9Cl9zdGFydFNhbXBsaW5nKCl7dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpLmhlYXBQcm9maWxlck1vZGVsKCkuc3RhcnROYXRpdmVTYW1wbGluZygpO30KX3N0b3BTYW1wbGluZygpe3JldHVybiB0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkuaGVhcFByb2ZpbGVyTW9kZWwoKS5zdG9wTmF0aXZlU2FtcGxpbmcoKTt9fTtQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBQcm9maWxlVHlwZS5UeXBlSWQ9J1NhbXBsaW5nTmF0aXZlSGVhcFJlY29yZGluZyc7UHJvZmlsZXIuU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RUeXBlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuU2FtcGxpbmdIZWFwUHJvZmlsZVR5cGVCYXNle2NvbnN0cnVjdG9yKHByb2Nlc3NUeXBlKXtzdXBlcihQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBTbmFwc2hvdFR5cGUuVHlwZUlkLGxzYE5hdGl2ZSBtZW1vcnkgYWxsb2NhdGlvbiBzbmFwc2hvdCAoJHtwcm9jZXNzVHlwZX0pYCk7fQppc0luc3RhbnRQcm9maWxlKCl7cmV0dXJuIHRydWU7fQpnZXQgdHJlZUl0ZW1UaXRsZSgpe3JldHVybiBsc2BOQVRJVkUgU05BUFNIT1RTYDt9CmdldCBkZXNjcmlwdGlvbigpe3JldHVybiBsc2BOYXRpdmUgbWVtb3J5IHNuYXBzaG90cyBzaG93IHNhbXBsZWQgbmF0aXZlIGFsbG9jYXRpb25zIGluIHRoZSByZW5kZXJlciBwcm9jZXNzIHNpbmNlIHN0YXJ0IHVwLgogICAgICAgICAgICAgIENocm9tZSBoYXMgdG8gYmUgc3RhcnRlZCB3aXRoIC0tc2FtcGxpbmctaGVhcC1wcm9maWxlciBmbGFnLgogICAgICAgICAgICAgIENoZWNrIGZsYWdzIGF0IGNocm9tZTovL2ZsYWdzYDt9CmJ1dHRvbkNsaWNrZWQoKXt0aGlzLl90YWtlU25hcHNob3QoKTtyZXR1cm4gZmFsc2U7fQphc3luYyBfdGFrZVNuYXBzaG90KCl7aWYodGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpKQpyZXR1cm47Y29uc3QgaGVhcFByb2ZpbGVyTW9kZWw9VUkuY29udGV4dC5mbGF2b3IoU0RLLkhlYXBQcm9maWxlck1vZGVsKTtpZighaGVhcFByb2ZpbGVyTW9kZWwpCnJldHVybjtjb25zdCBwcm9maWxlPW5ldyBQcm9maWxlci5TYW1wbGluZ0hlYXBQcm9maWxlSGVhZGVyKGhlYXBQcm9maWxlck1vZGVsLHRoaXMsbHNgU25hcHNob3QgJHt0aGlzLm5leHRQcm9maWxlVWlkKCl9YCk7dGhpcy5zZXRQcm9maWxlQmVpbmdSZWNvcmRlZChwcm9maWxlKTt0aGlzLmFkZFByb2ZpbGUocHJvZmlsZSk7cHJvZmlsZS51cGRhdGVTdGF0dXMobHNgU25hcHNob3R0aW5nXHUyMDI2YCk7Y29uc3QgcHJvdG9jb2xQcm9maWxlPWF3YWl0IHRoaXMuX3Rha2VOYXRpdmVTbmFwc2hvdCgoaGVhcFByb2ZpbGVyTW9kZWwpKTtjb25zdCByZWNvcmRlZFByb2ZpbGU9dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpO2lmKHJlY29yZGVkUHJvZmlsZSl7Y29uc29sZS5hc3NlcnQocHJvdG9jb2xQcm9maWxlKTtyZWNvcmRlZFByb2ZpbGUuc2V0UHJvdG9jb2xQcm9maWxlKHByb3RvY29sUHJvZmlsZSk7cmVjb3JkZWRQcm9maWxlLnVwZGF0ZVN0YXR1cygnJyk7dGhpcy5zZXRQcm9maWxlQmVpbmdSZWNvcmRlZChudWxsKTt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLlByb2ZpbGVUeXBlLkV2ZW50cy5Qcm9maWxlQ29tcGxldGUscmVjb3JkZWRQcm9maWxlKTt9Cl90YWtlTmF0aXZlU25hcHNob3QoaGVhcFByb2ZpbGVyTW9kZWwpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fX07UHJvZmlsZXIuU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RUeXBlLlR5cGVJZD0nU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3QnO1Byb2ZpbGVyLlNhbXBsaW5nTmF0aXZlSGVhcFNuYXBzaG90QnJvd3NlclR5cGU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBTbmFwc2hvdFR5cGV7Y29uc3RydWN0b3IoKXtzdXBlcihsc2BCcm93c2VyYCk7UHJvZmlsZXIuU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RCcm93c2VyVHlwZS5pbnN0YW5jZT10aGlzO30KX3Rha2VOYXRpdmVTbmFwc2hvdChoZWFwUHJvZmlsZXJNb2RlbCl7cmV0dXJuIGhlYXBQcm9maWxlck1vZGVsLnRha2VOYXRpdmVCcm93c2VyU25hcHNob3QoKTt9fTtQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBTbmFwc2hvdFJlbmRlcmVyVHlwZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlNhbXBsaW5nTmF0aXZlSGVhcFNuYXBzaG90VHlwZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKGxzYFJlbmRlcmVyYCk7UHJvZmlsZXIuU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RSZW5kZXJlclR5cGUuaW5zdGFuY2U9dGhpczt9CmFzeW5jIF90YWtlTmF0aXZlU25hcHNob3QoaGVhcFByb2ZpbGVyTW9kZWwpe3JldHVybiBhd2FpdCBoZWFwUHJvZmlsZXJNb2RlbC50YWtlTmF0aXZlU25hcHNob3QoKTt9fTtQcm9maWxlci5TYW1wbGluZ0hlYXBQcm9maWxlSGVhZGVyPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuV3JpdGFibGVQcm9maWxlSGVhZGVye2NvbnN0cnVjdG9yKGhlYXBQcm9maWxlck1vZGVsLHR5cGUsdGl0bGUpe3N1cGVyKGhlYXBQcm9maWxlck1vZGVsJiZoZWFwUHJvZmlsZXJNb2RlbC5kZWJ1Z2dlck1vZGVsKCksdHlwZSx0aXRsZXx8Q29tbW9uLlVJU3RyaW5nKCdQcm9maWxlICVkJyx0eXBlLm5leHRQcm9maWxlVWlkKCkpKTt0aGlzLl9oZWFwUHJvZmlsZXJNb2RlbD1oZWFwUHJvZmlsZXJNb2RlbDt9CmNyZWF0ZVZpZXcoKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBQcm9maWxlVmlldyh0aGlzKTt9CnByb3RvY29sUHJvZmlsZSgpe3JldHVybiB0aGlzLl9wcm90b2NvbFByb2ZpbGU7fQpoZWFwUHJvZmlsZXJNb2RlbCgpe3JldHVybiB0aGlzLl9oZWFwUHJvZmlsZXJNb2RlbDt9fTtQcm9maWxlci5TYW1wbGluZ0hlYXBQcm9maWxlTm9kZT1jbGFzcyBleHRlbmRzIFNESy5Qcm9maWxlTm9kZXtjb25zdHJ1Y3Rvcihub2RlKXtjb25zdCBjYWxsRnJhbWU9bm9kZS5jYWxsRnJhbWV8fCh7ZnVuY3Rpb25OYW1lOm5vZGVbJ2Z1bmN0aW9uTmFtZSddLHNjcmlwdElkOm5vZGVbJ3NjcmlwdElkJ10sdXJsOm5vZGVbJ3VybCddLGxpbmVOdW1iZXI6bm9kZVsnbGluZU51bWJlciddLTEsY29sdW1uTnVtYmVyOm5vZGVbJ2NvbHVtbk51bWJlciddLTF9KTtzdXBlcihjYWxsRnJhbWUpO3RoaXMuc2VsZj1ub2RlLnNlbGZTaXplO319O1Byb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5Qcm9maWxlVHJlZU1vZGVse2NvbnN0cnVjdG9yKHByb2ZpbGUpe3N1cGVyKCk7dGhpcy5pbml0aWFsaXplKHRyYW5zbGF0ZVByb2ZpbGVUcmVlKHByb2ZpbGUuaGVhZCkpO2Z1bmN0aW9uIHRyYW5zbGF0ZVByb2ZpbGVUcmVlKHJvb3Qpe2NvbnN0IHJlc3VsdFJvb3Q9bmV3IFByb2ZpbGVyLlNhbXBsaW5nSGVhcFByb2ZpbGVOb2RlKHJvb3QpO2NvbnN0IHRhcmdldE5vZGVTdGFjaz1bcmVzdWx0Um9vdF07Y29uc3Qgc291cmNlTm9kZVN0YWNrPVtyb290XTt3aGlsZShzb3VyY2VOb2RlU3RhY2subGVuZ3RoKXtjb25zdCBzb3VyY2VOb2RlPXNvdXJjZU5vZGVTdGFjay5wb3AoKTtjb25zdCBwYXJlbnROb2RlPXRhcmdldE5vZGVTdGFjay5wb3AoKTtwYXJlbnROb2RlLmNoaWxkcmVuPXNvdXJjZU5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkPT5uZXcgUHJvZmlsZXIuU2FtcGxpbmdIZWFwUHJvZmlsZU5vZGUoY2hpbGQpKTtzb3VyY2VOb2RlU3RhY2sucHVzaC5hcHBseShzb3VyY2VOb2RlU3RhY2ssc291cmNlTm9kZS5jaGlsZHJlbik7dGFyZ2V0Tm9kZVN0YWNrLnB1c2guYXBwbHkodGFyZ2V0Tm9kZVN0YWNrLHBhcmVudE5vZGUuY2hpbGRyZW4pO30KcmV0dXJuIHJlc3VsdFJvb3Q7fX19O1Byb2ZpbGVyLkhlYXBQcm9maWxlVmlldy5Ob2RlRm9ybWF0dGVyPWNsYXNze2NvbnN0cnVjdG9yKHByb2ZpbGVWaWV3KXt0aGlzLl9wcm9maWxlVmlldz1wcm9maWxlVmlldzt9CmZvcm1hdFZhbHVlKHZhbHVlKXtyZXR1cm4gTnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodmFsdWUpO30KZm9ybWF0UGVyY2VudCh2YWx1ZSxub2RlKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclLjJmXHhhMCUlJyx2YWx1ZSk7fQpsaW5raWZ5Tm9kZShub2RlKXtjb25zdCBoZWFwUHJvZmlsZXJNb2RlbD10aGlzLl9wcm9maWxlVmlldy5fcHJvZmlsZUhlYWRlci5oZWFwUHJvZmlsZXJNb2RlbCgpO3JldHVybiB0aGlzLl9wcm9maWxlVmlldy5saW5raWZpZXIoKS5tYXliZUxpbmtpZnlDb25zb2xlQ2FsbEZyYW1lKGhlYXBQcm9maWxlck1vZGVsP2hlYXBQcm9maWxlck1vZGVsLnRhcmdldCgpOm51bGwsbm9kZS5wcm9maWxlTm9kZS5jYWxsRnJhbWUsJ3Byb2ZpbGUtbm9kZS1maWxlJyk7fX07UHJvZmlsZXIuSGVhcEZsYW1lQ2hhcnREYXRhUHJvdmlkZXI9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5Qcm9maWxlRmxhbWVDaGFydERhdGFQcm92aWRlcntjb25zdHJ1Y3Rvcihwcm9maWxlLGhlYXBQcm9maWxlck1vZGVsKXtzdXBlcigpO3RoaXMuX3Byb2ZpbGU9cHJvZmlsZTt0aGlzLl9oZWFwUHJvZmlsZXJNb2RlbD1oZWFwUHJvZmlsZXJNb2RlbDt9Cm1pbmltdW1Cb3VuZGFyeSgpe3JldHVybiAwO30KdG90YWxUaW1lKCl7cmV0dXJuIHRoaXMuX3Byb2ZpbGUucm9vdC50b3RhbDt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnJXNceGEwS0InLE51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHZhbHVlLzFlMykpO30KX2NhbGN1bGF0ZVRpbWVsaW5lRGF0YSgpe2Z1bmN0aW9uIG5vZGVzQ291bnQobm9kZSl7cmV0dXJuIG5vZGUuY2hpbGRyZW4ucmVkdWNlKChjb3VudCxub2RlKT0+Y291bnQrbm9kZXNDb3VudChub2RlKSwxKTt9CmNvbnN0IGNvdW50PW5vZGVzQ291bnQodGhpcy5fcHJvZmlsZS5yb290KTtjb25zdCBlbnRyeU5vZGVzPW5ldyBBcnJheShjb3VudCk7Y29uc3QgZW50cnlMZXZlbHM9bmV3IFVpbnQxNkFycmF5KGNvdW50KTtjb25zdCBlbnRyeVRvdGFsVGltZXM9bmV3IEZsb2F0MzJBcnJheShjb3VudCk7Y29uc3QgZW50cnlTdGFydFRpbWVzPW5ldyBGbG9hdDY0QXJyYXkoY291bnQpO2xldCBkZXB0aD0wO2xldCBtYXhEZXB0aD0wO2xldCBwb3NpdGlvbj0wO2xldCBpbmRleD0wO2Z1bmN0aW9uIGFkZE5vZGUobm9kZSl7Y29uc3Qgc3RhcnQ9cG9zaXRpb247ZW50cnlOb2Rlc1tpbmRleF09bm9kZTtlbnRyeUxldmVsc1tpbmRleF09ZGVwdGg7ZW50cnlUb3RhbFRpbWVzW2luZGV4XT1ub2RlLnRvdGFsO2VudHJ5U3RhcnRUaW1lc1tpbmRleF09cG9zaXRpb247KytpbmRleDsrK2RlcHRoO25vZGUuY2hpbGRyZW4uZm9yRWFjaChhZGROb2RlKTstLWRlcHRoO21heERlcHRoPU1hdGgubWF4KG1heERlcHRoLGRlcHRoKTtwb3NpdGlvbj1zdGFydCtub2RlLnRvdGFsO30KYWRkTm9kZSh0aGlzLl9wcm9maWxlLnJvb3QpO3RoaXMuX21heFN0YWNrRGVwdGg9bWF4RGVwdGgrMTt0aGlzLl9lbnRyeU5vZGVzPWVudHJ5Tm9kZXM7dGhpcy5fdGltZWxpbmVEYXRhPW5ldyBQZXJmVUkuRmxhbWVDaGFydC5UaW1lbGluZURhdGEoZW50cnlMZXZlbHMsZW50cnlUb3RhbFRpbWVzLGVudHJ5U3RhcnRUaW1lcyxudWxsKTtyZXR1cm4gdGhpcy5fdGltZWxpbmVEYXRhO30KcHJlcGFyZUhpZ2hsaWdodGVkRW50cnlJbmZvKGVudHJ5SW5kZXgpe2NvbnN0IG5vZGU9dGhpcy5fZW50cnlOb2Rlc1tlbnRyeUluZGV4XTtpZighbm9kZSkKcmV0dXJuIG51bGw7Y29uc3QgZW50cnlJbmZvPVtdO2Z1bmN0aW9uIHB1c2hFbnRyeUluZm9Sb3codGl0bGUsdmFsdWUpe2VudHJ5SW5mby5wdXNoKHt0aXRsZTp0aXRsZSx2YWx1ZTp2YWx1ZX0pO30KcHVzaEVudHJ5SW5mb1JvdyhDb21tb24uVUlTdHJpbmcoJ05hbWUnKSxVSS5iZWF1dGlmeUZ1bmN0aW9uTmFtZShub2RlLmZ1bmN0aW9uTmFtZSkpO3B1c2hFbnRyeUluZm9Sb3coQ29tbW9uLlVJU3RyaW5nKCdTZWxmIHNpemUnKSxOdW1iZXIuYnl0ZXNUb1N0cmluZyhub2RlLnNlbGYpKTtwdXNoRW50cnlJbmZvUm93KENvbW1vbi5VSVN0cmluZygnVG90YWwgc2l6ZScpLE51bWJlci5ieXRlc1RvU3RyaW5nKG5vZGUudG90YWwpKTtjb25zdCBsaW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKCk7Y29uc3QgbGluaz1saW5raWZpZXIubWF5YmVMaW5raWZ5Q29uc29sZUNhbGxGcmFtZSh0aGlzLl9oZWFwUHJvZmlsZXJNb2RlbD90aGlzLl9oZWFwUHJvZmlsZXJNb2RlbC50YXJnZXQoKTpudWxsLG5vZGUuY2FsbEZyYW1lKTtpZihsaW5rKQpwdXNoRW50cnlJbmZvUm93KENvbW1vbi5VSVN0cmluZygnVVJMJyksbGluay50ZXh0Q29udGVudCk7bGlua2lmaWVyLmRpc3Bvc2UoKTtyZXR1cm4gUHJvZmlsZXIuUHJvZmlsZVZpZXcuYnVpbGRQb3BvdmVyVGFibGUoZW50cnlJbmZvKTt9fTs7UHJvZmlsZXIuSGVhcFNuYXBzaG90V29ya2VyUHJveHk9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGV2ZW50SGFuZGxlcil7c3VwZXIoKTt0aGlzLl9ldmVudEhhbmRsZXI9ZXZlbnRIYW5kbGVyO3RoaXMuX25leHRPYmplY3RJZD0xO3RoaXMuX25leHRDYWxsSWQ9MTt0aGlzLl9jYWxsYmFja3M9bmV3IE1hcCgpO3RoaXMuX3ByZXZpb3VzQ2FsbGJhY2tzPW5ldyBTZXQoKTt0aGlzLl93b3JrZXI9bmV3IENvbW1vbi5Xb3JrZXIoJ2hlYXBfc25hcHNob3Rfd29ya2VyJyk7dGhpcy5fd29ya2VyLm9ubWVzc2FnZT10aGlzLl9tZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTt9CmNyZWF0ZUxvYWRlcihwcm9maWxlVWlkLHNuYXBzaG90UmVjZWl2ZWRDYWxsYmFjayl7Y29uc3Qgb2JqZWN0SWQ9dGhpcy5fbmV4dE9iamVjdElkKys7Y29uc3QgcHJveHk9bmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdExvYWRlclByb3h5KHRoaXMsb2JqZWN0SWQscHJvZmlsZVVpZCxzbmFwc2hvdFJlY2VpdmVkQ2FsbGJhY2spO3RoaXMuX3Bvc3RNZXNzYWdlKHtjYWxsSWQ6dGhpcy5fbmV4dENhbGxJZCsrLGRpc3Bvc2l0aW9uOidjcmVhdGUnLG9iamVjdElkOm9iamVjdElkLG1ldGhvZE5hbWU6J0hlYXBTbmFwc2hvdFdvcmtlci5IZWFwU25hcHNob3RMb2FkZXInfSk7cmV0dXJuIHByb3h5O30KZGlzcG9zZSgpe3RoaXMuX3dvcmtlci50ZXJtaW5hdGUoKTtpZih0aGlzLl9pbnRlcnZhbCkKY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7fQpkaXNwb3NlT2JqZWN0KG9iamVjdElkKXt0aGlzLl9wb3N0TWVzc2FnZSh7Y2FsbElkOnRoaXMuX25leHRDYWxsSWQrKyxkaXNwb3NpdGlvbjonZGlzcG9zZScsb2JqZWN0SWQ6b2JqZWN0SWR9KTt9CmV2YWx1YXRlRm9yVGVzdChzY3JpcHQsY2FsbGJhY2spe2NvbnN0IGNhbGxJZD10aGlzLl9uZXh0Q2FsbElkKys7dGhpcy5fY2FsbGJhY2tzLnNldChjYWxsSWQsY2FsbGJhY2spO3RoaXMuX3Bvc3RNZXNzYWdlKHtjYWxsSWQ6Y2FsbElkLGRpc3Bvc2l0aW9uOidldmFsdWF0ZUZvclRlc3QnLHNvdXJjZTpzY3JpcHR9KTt9CmNhbGxGYWN0b3J5TWV0aG9kKGNhbGxiYWNrLG9iamVjdElkLG1ldGhvZE5hbWUscHJveHlDb25zdHJ1Y3Rvcil7Y29uc3QgY2FsbElkPXRoaXMuX25leHRDYWxsSWQrKztjb25zdCBtZXRob2RBcmd1bWVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDQpO2NvbnN0IG5ld09iamVjdElkPXRoaXMuX25leHRPYmplY3RJZCsrO2Z1bmN0aW9uIHdyYXBDYWxsYmFjayhyZW1vdGVSZXN1bHQpe2NhbGxiYWNrKHJlbW90ZVJlc3VsdD9uZXcgcHJveHlDb25zdHJ1Y3Rvcih0aGlzLG5ld09iamVjdElkKTpudWxsKTt9CmlmKGNhbGxiYWNrKXt0aGlzLl9jYWxsYmFja3Muc2V0KGNhbGxJZCx3cmFwQ2FsbGJhY2suYmluZCh0aGlzKSk7dGhpcy5fcG9zdE1lc3NhZ2Uoe2NhbGxJZDpjYWxsSWQsZGlzcG9zaXRpb246J2ZhY3RvcnknLG9iamVjdElkOm9iamVjdElkLG1ldGhvZE5hbWU6bWV0aG9kTmFtZSxtZXRob2RBcmd1bWVudHM6bWV0aG9kQXJndW1lbnRzLG5ld09iamVjdElkOm5ld09iamVjdElkfSk7cmV0dXJuIG51bGw7fWVsc2V7dGhpcy5fcG9zdE1lc3NhZ2Uoe2NhbGxJZDpjYWxsSWQsZGlzcG9zaXRpb246J2ZhY3RvcnknLG9iamVjdElkOm9iamVjdElkLG1ldGhvZE5hbWU6bWV0aG9kTmFtZSxtZXRob2RBcmd1bWVudHM6bWV0aG9kQXJndW1lbnRzLG5ld09iamVjdElkOm5ld09iamVjdElkfSk7cmV0dXJuIG5ldyBwcm94eUNvbnN0cnVjdG9yKHRoaXMsbmV3T2JqZWN0SWQpO319CmNhbGxNZXRob2QoY2FsbGJhY2ssb2JqZWN0SWQsbWV0aG9kTmFtZSl7Y29uc3QgY2FsbElkPXRoaXMuX25leHRDYWxsSWQrKztjb25zdCBtZXRob2RBcmd1bWVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO2lmKGNhbGxiYWNrKQp0aGlzLl9jYWxsYmFja3Muc2V0KGNhbGxJZCxjYWxsYmFjayk7dGhpcy5fcG9zdE1lc3NhZ2Uoe2NhbGxJZDpjYWxsSWQsZGlzcG9zaXRpb246J21ldGhvZCcsb2JqZWN0SWQ6b2JqZWN0SWQsbWV0aG9kTmFtZTptZXRob2ROYW1lLG1ldGhvZEFyZ3VtZW50czptZXRob2RBcmd1bWVudHN9KTt9CnN0YXJ0Q2hlY2tpbmdGb3JMb25nUnVubmluZ0NhbGxzKCl7aWYodGhpcy5faW50ZXJ2YWwpCnJldHVybjt0aGlzLl9jaGVja0xvbmdSdW5uaW5nQ2FsbHMoKTt0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCh0aGlzLl9jaGVja0xvbmdSdW5uaW5nQ2FsbHMuYmluZCh0aGlzKSwzMDApO30KX2NoZWNrTG9uZ1J1bm5pbmdDYWxscygpe2Zvcihjb25zdCBjYWxsSWQgb2YgdGhpcy5fcHJldmlvdXNDYWxsYmFja3Mpe2lmKCF0aGlzLl9jYWxsYmFja3MuaGFzKGNhbGxJZCkpCnRoaXMuX3ByZXZpb3VzQ2FsbGJhY2tzLmRlbGV0ZShjYWxsSWQpO30KY29uc3QgaGFzTG9uZ1J1bm5pbmdDYWxscz0hIXRoaXMuX3ByZXZpb3VzQ2FsbGJhY2tzLnNpemU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuSGVhcFNuYXBzaG90V29ya2VyUHJveHkuRXZlbnRzLldhaXQsaGFzTG9uZ1J1bm5pbmdDYWxscyk7Zm9yKGNvbnN0IGNhbGxJZCBvZiB0aGlzLl9jYWxsYmFja3Mua2V5c0FycmF5KCkpCnRoaXMuX3ByZXZpb3VzQ2FsbGJhY2tzLmFkZChjYWxsSWQpO30KX21lc3NhZ2VSZWNlaXZlZChldmVudCl7Y29uc3QgZGF0YT1ldmVudC5kYXRhO2lmKGRhdGEuZXZlbnROYW1lKXtpZih0aGlzLl9ldmVudEhhbmRsZXIpCnRoaXMuX2V2ZW50SGFuZGxlcihkYXRhLmV2ZW50TmFtZSxkYXRhLmRhdGEpO3JldHVybjt9CmlmKGRhdGEuZXJyb3Ipe2lmKGRhdGEuZXJyb3JNZXRob2ROYW1lKXtDb21tb24uY29uc29sZS5lcnJvcihDb21tb24uVUlTdHJpbmcoJ0FuIGVycm9yIG9jY3VycmVkIHdoZW4gYSBjYWxsIHRvIG1ldGhvZCBcJyVzXCcgd2FzIHJlcXVlc3RlZCcsZGF0YS5lcnJvck1ldGhvZE5hbWUpKTt9CkNvbW1vbi5jb25zb2xlLmVycm9yKGRhdGFbJ2Vycm9yQ2FsbFN0YWNrJ10pO3RoaXMuX2NhbGxiYWNrcy5kZWxldGUoZGF0YS5jYWxsSWQpO3JldHVybjt9CmlmKCF0aGlzLl9jYWxsYmFja3MuaGFzKGRhdGEuY2FsbElkKSkKcmV0dXJuO2NvbnN0IGNhbGxiYWNrPXRoaXMuX2NhbGxiYWNrcy5nZXQoZGF0YS5jYWxsSWQpO3RoaXMuX2NhbGxiYWNrcy5kZWxldGUoZGF0YS5jYWxsSWQpO2NhbGxiYWNrKGRhdGEucmVzdWx0KTt9Cl9wb3N0TWVzc2FnZShtZXNzYWdlKXt0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2UobWVzc2FnZSk7fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90V29ya2VyUHJveHkuRXZlbnRzPXtXYWl0OlN5bWJvbCgnV2FpdCcpfTtQcm9maWxlci5IZWFwU25hcHNob3RQcm94eU9iamVjdD1jbGFzc3tjb25zdHJ1Y3Rvcih3b3JrZXIsb2JqZWN0SWQpe3RoaXMuX3dvcmtlcj13b3JrZXI7dGhpcy5fb2JqZWN0SWQ9b2JqZWN0SWQ7fQpfY2FsbFdvcmtlcih3b3JrZXJNZXRob2ROYW1lLGFyZ3Mpe2FyZ3Muc3BsaWNlKDEsMCx0aGlzLl9vYmplY3RJZCk7cmV0dXJuIHRoaXMuX3dvcmtlclt3b3JrZXJNZXRob2ROYW1lXS5hcHBseSh0aGlzLl93b3JrZXIsYXJncyk7fQpkaXNwb3NlKCl7dGhpcy5fd29ya2VyLmRpc3Bvc2VPYmplY3QodGhpcy5fb2JqZWN0SWQpO30KZGlzcG9zZVdvcmtlcigpe3RoaXMuX3dvcmtlci5kaXNwb3NlKCk7fQpjYWxsRmFjdG9yeU1ldGhvZChjYWxsYmFjayxtZXRob2ROYW1lLHByb3h5Q29uc3RydWN0b3IsdmFyX2FyZ3Mpe3JldHVybiB0aGlzLl9jYWxsV29ya2VyKCdjYWxsRmFjdG9yeU1ldGhvZCcsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKTt9Cl9jYWxsTWV0aG9kUHJvbWlzZShtZXRob2ROYW1lLHZhcl9hcmdzKXtjb25zdCBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9PnRoaXMuX2NhbGxXb3JrZXIoJ2NhbGxNZXRob2QnLFtyZXNvbHZlLC4uLmFyZ3NdKSk7fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90TG9hZGVyUHJveHk9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RQcm94eU9iamVjdHtjb25zdHJ1Y3Rvcih3b3JrZXIsb2JqZWN0SWQscHJvZmlsZVVpZCxzbmFwc2hvdFJlY2VpdmVkQ2FsbGJhY2spe3N1cGVyKHdvcmtlcixvYmplY3RJZCk7dGhpcy5fcHJvZmlsZVVpZD1wcm9maWxlVWlkO3RoaXMuX3NuYXBzaG90UmVjZWl2ZWRDYWxsYmFjaz1zbmFwc2hvdFJlY2VpdmVkQ2FsbGJhY2s7fQp3cml0ZShjaHVuayl7cmV0dXJuIHRoaXMuX2NhbGxNZXRob2RQcm9taXNlKCd3cml0ZScsY2h1bmspO30KYXN5bmMgY2xvc2UoKXthd2FpdCB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnY2xvc2UnKTtjb25zdCBzbmFwc2hvdFByb3h5PWF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmU9PnRoaXMuY2FsbEZhY3RvcnlNZXRob2QocmVzb2x2ZSwnYnVpbGRTbmFwc2hvdCcsUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJveHkpKTt0aGlzLmRpc3Bvc2UoKTtzbmFwc2hvdFByb3h5LnNldFByb2ZpbGVVaWQodGhpcy5fcHJvZmlsZVVpZCk7YXdhaXQgc25hcHNob3RQcm94eS51cGRhdGVTdGF0aWNEYXRhKCk7dGhpcy5fc25hcHNob3RSZWNlaXZlZENhbGxiYWNrKHNuYXBzaG90UHJveHkpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdFByb3h5PWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJveHlPYmplY3R7Y29uc3RydWN0b3Iod29ya2VyLG9iamVjdElkKXtzdXBlcih3b3JrZXIsb2JqZWN0SWQpO3RoaXMuX3N0YXRpY0RhdGE9bnVsbDt9CnNlYXJjaChzZWFyY2hDb25maWcsZmlsdGVyKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ3NlYXJjaCcsc2VhcmNoQ29uZmlnLGZpbHRlcik7fQphZ2dyZWdhdGVzV2l0aEZpbHRlcihmaWx0ZXIpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnYWdncmVnYXRlc1dpdGhGaWx0ZXInLGZpbHRlcik7fQphZ2dyZWdhdGVzRm9yRGlmZigpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnYWdncmVnYXRlc0ZvckRpZmYnKTt9CmNhbGN1bGF0ZVNuYXBzaG90RGlmZihiYXNlU25hcHNob3RJZCxiYXNlU25hcHNob3RBZ2dyZWdhdGVzKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ2NhbGN1bGF0ZVNuYXBzaG90RGlmZicsYmFzZVNuYXBzaG90SWQsYmFzZVNuYXBzaG90QWdncmVnYXRlcyk7fQpub2RlQ2xhc3NOYW1lKHNuYXBzaG90T2JqZWN0SWQpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnbm9kZUNsYXNzTmFtZScsc25hcHNob3RPYmplY3RJZCk7fQpjcmVhdGVFZGdlc1Byb3ZpZGVyKG5vZGVJbmRleCl7cmV0dXJuIHRoaXMuY2FsbEZhY3RvcnlNZXRob2QobnVsbCwnY3JlYXRlRWRnZXNQcm92aWRlcicsUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvdmlkZXJQcm94eSxub2RlSW5kZXgpO30KY3JlYXRlUmV0YWluaW5nRWRnZXNQcm92aWRlcihub2RlSW5kZXgpe3JldHVybiB0aGlzLmNhbGxGYWN0b3J5TWV0aG9kKG51bGwsJ2NyZWF0ZVJldGFpbmluZ0VkZ2VzUHJvdmlkZXInLFByb2ZpbGVyLkhlYXBTbmFwc2hvdFByb3ZpZGVyUHJveHksbm9kZUluZGV4KTt9CmNyZWF0ZUFkZGVkTm9kZXNQcm92aWRlcihiYXNlU25hcHNob3RJZCxjbGFzc05hbWUpe3JldHVybiB0aGlzLmNhbGxGYWN0b3J5TWV0aG9kKG51bGwsJ2NyZWF0ZUFkZGVkTm9kZXNQcm92aWRlcicsUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvdmlkZXJQcm94eSxiYXNlU25hcHNob3RJZCxjbGFzc05hbWUpO30KY3JlYXRlRGVsZXRlZE5vZGVzUHJvdmlkZXIobm9kZUluZGV4ZXMpe3JldHVybiB0aGlzLmNhbGxGYWN0b3J5TWV0aG9kKG51bGwsJ2NyZWF0ZURlbGV0ZWROb2Rlc1Byb3ZpZGVyJyxQcm9maWxlci5IZWFwU25hcHNob3RQcm92aWRlclByb3h5LG5vZGVJbmRleGVzKTt9CmNyZWF0ZU5vZGVzUHJvdmlkZXIoZmlsdGVyKXtyZXR1cm4gdGhpcy5jYWxsRmFjdG9yeU1ldGhvZChudWxsLCdjcmVhdGVOb2Rlc1Byb3ZpZGVyJyxQcm9maWxlci5IZWFwU25hcHNob3RQcm92aWRlclByb3h5LGZpbHRlcik7fQpjcmVhdGVOb2Rlc1Byb3ZpZGVyRm9yQ2xhc3MoY2xhc3NOYW1lLG5vZGVGaWx0ZXIpe3JldHVybiB0aGlzLmNhbGxGYWN0b3J5TWV0aG9kKG51bGwsJ2NyZWF0ZU5vZGVzUHJvdmlkZXJGb3JDbGFzcycsUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvdmlkZXJQcm94eSxjbGFzc05hbWUsbm9kZUZpbHRlcik7fQphbGxvY2F0aW9uVHJhY2VzVG9wcygpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnYWxsb2NhdGlvblRyYWNlc1RvcHMnKTt9CmFsbG9jYXRpb25Ob2RlQ2FsbGVycyhub2RlSWQpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnYWxsb2NhdGlvbk5vZGVDYWxsZXJzJyxub2RlSWQpO30KYWxsb2NhdGlvblN0YWNrKG5vZGVJbmRleCl7cmV0dXJuIHRoaXMuX2NhbGxNZXRob2RQcm9taXNlKCdhbGxvY2F0aW9uU3RhY2snLG5vZGVJbmRleCk7fQpkaXNwb3NlKCl7dGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgYmUgY2FsbGVkJyk7fQpnZXQgbm9kZUNvdW50KCl7cmV0dXJuIHRoaXMuX3N0YXRpY0RhdGEubm9kZUNvdW50O30KZ2V0IHJvb3ROb2RlSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RhdGljRGF0YS5yb290Tm9kZUluZGV4O30KYXN5bmMgdXBkYXRlU3RhdGljRGF0YSgpe3RoaXMuX3N0YXRpY0RhdGE9YXdhaXQgdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ3VwZGF0ZVN0YXRpY0RhdGEnKTt9CmdldFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ2dldFN0YXRpc3RpY3MnKTt9CmdldFNhbXBsZXMoKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ2dldFNhbXBsZXMnKTt9CmdldCB0b3RhbFNpemUoKXtyZXR1cm4gdGhpcy5fc3RhdGljRGF0YS50b3RhbFNpemU7fQpnZXQgdWlkKCl7cmV0dXJuIHRoaXMuX3Byb2ZpbGVVaWQ7fQpzZXRQcm9maWxlVWlkKHByb2ZpbGVVaWQpe3RoaXMuX3Byb2ZpbGVVaWQ9cHJvZmlsZVVpZDt9Cm1heEpTT2JqZWN0SWQoKXtyZXR1cm4gdGhpcy5fc3RhdGljRGF0YS5tYXhKU09iamVjdElkO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdFByb3ZpZGVyUHJveHk9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RQcm94eU9iamVjdHtjb25zdHJ1Y3Rvcih3b3JrZXIsb2JqZWN0SWQpe3N1cGVyKHdvcmtlcixvYmplY3RJZCk7fQpub2RlUG9zaXRpb24oc25hcHNob3RPYmplY3RJZCl7cmV0dXJuIHRoaXMuX2NhbGxNZXRob2RQcm9taXNlKCdub2RlUG9zaXRpb24nLHNuYXBzaG90T2JqZWN0SWQpO30KaXNFbXB0eSgpe3JldHVybiB0aGlzLl9jYWxsTWV0aG9kUHJvbWlzZSgnaXNFbXB0eScpO30Kc2VyaWFsaXplSXRlbXNSYW5nZShzdGFydFBvc2l0aW9uLGVuZFBvc2l0aW9uKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ3NlcmlhbGl6ZUl0ZW1zUmFuZ2UnLHN0YXJ0UG9zaXRpb24sZW5kUG9zaXRpb24pO30Kc29ydEFuZFJld2luZChjb21wYXJhdG9yKXtyZXR1cm4gdGhpcy5fY2FsbE1ldGhvZFByb21pc2UoJ3NvcnRBbmRSZXdpbmQnLGNvbXBhcmF0b3IpO319OztQcm9maWxlci5IZWFwU25hcHNob3RTb3J0YWJsZURhdGFHcmlkPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuRGF0YUdyaWR7Y29uc3RydWN0b3IoZGF0YURpc3BsYXlEZWxlZ2F0ZSxjb2x1bW5zKXtzdXBlcihjb2x1bW5zKTt0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlPWRhdGFEaXNwbGF5RGVsZWdhdGU7Y29uc3QgdG9vbHRpcHM9W1snZGlzdGFuY2UnLGxzYERpc3RhbmNlIGZyb20gd2luZG93IG9iamVjdGBdLFsnc2hhbGxvd1NpemUnLGxzYFNpemUgb2YgdGhlIG9iamVjdCBpdHNlbGYgaW4gYnl0ZXNgXSxbJ3JldGFpbmVkU2l6ZScsbHNgU2l6ZSBvZiB0aGUgb2JqZWN0IHBsdXMgdGhlIGdyYXBoIGl0IHJldGFpbnMgaW4gYnl0ZXNgXV07Zm9yKGNvbnN0IGluZm8gb2YgdG9vbHRpcHMpe2NvbnN0IGhlYWRlckNlbGw9dGhpcy5oZWFkZXJUYWJsZUhlYWRlcihpbmZvWzBdKTtpZihoZWFkZXJDZWxsKQpoZWFkZXJDZWxsLnNldEF0dHJpYnV0ZSgndGl0bGUnLGluZm9bMV0pO30KdGhpcy5fcmVjdXJzaXZlU29ydGluZ0RlcHRoPTA7dGhpcy5faGlnaGxpZ2h0ZWROb2RlPW51bGw7dGhpcy5fcG9wdWxhdGVkQW5kU29ydGVkPWZhbHNlO3RoaXMuX25hbWVGaWx0ZXI9bnVsbDt0aGlzLl9ub2RlRmlsdGVyPW5ldyBIZWFwU25hcHNob3RNb2RlbC5Ob2RlRmlsdGVyKCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFNvcnRhYmxlRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDb21wbGV0ZSx0aGlzLl9zb3J0aW5nQ29tcGxldGUsdGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5Tb3J0aW5nQ2hhbmdlZCx0aGlzLnNvcnRpbmdDaGFuZ2VkLHRoaXMpO30KZGF0YURpc3BsYXlEZWxlZ2F0ZSgpe3JldHVybiB0aGlzLl9kYXRhRGlzcGxheURlbGVnYXRlO30Kbm9kZUZpbHRlcigpe3JldHVybiB0aGlzLl9ub2RlRmlsdGVyO30Kc2V0TmFtZUZpbHRlcihuYW1lRmlsdGVyKXt0aGlzLl9uYW1lRmlsdGVyPW5hbWVGaWx0ZXI7fQpkZWZhdWx0UG9wdWxhdGVDb3VudCgpe3JldHVybiAxMDA7fQpfZGlzcG9zZUFsbE5vZGVzKCl7Y29uc3QgY2hpbGRyZW49dGhpcy50b3BMZXZlbE5vZGVzKCk7Zm9yKGxldCBpPTAsbD1jaGlsZHJlbi5sZW5ndGg7aTxsOysraSkKY2hpbGRyZW5baV0uZGlzcG9zZSgpO30Kd2FzU2hvd24oKXtpZih0aGlzLl9uYW1lRmlsdGVyKXt0aGlzLl9uYW1lRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhcklucHV0LkV2ZW50LlRleHRDaGFuZ2VkLHRoaXMuX29uTmFtZUZpbHRlckNoYW5nZWQsdGhpcyk7dGhpcy51cGRhdGVWaXNpYmxlTm9kZXModHJ1ZSk7fQppZih0aGlzLl9wb3B1bGF0ZWRBbmRTb3J0ZWQpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFNvcnRhYmxlRGF0YUdyaWQuRXZlbnRzLkNvbnRlbnRTaG93bix0aGlzKTt9Cl9zb3J0aW5nQ29tcGxldGUoKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuSGVhcFNuYXBzaG90U29ydGFibGVEYXRhR3JpZC5FdmVudHMuU29ydGluZ0NvbXBsZXRlLHRoaXMuX3NvcnRpbmdDb21wbGV0ZSx0aGlzKTt0aGlzLl9wb3B1bGF0ZWRBbmRTb3J0ZWQ9dHJ1ZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQcm9maWxlci5IZWFwU25hcHNob3RTb3J0YWJsZURhdGFHcmlkLkV2ZW50cy5Db250ZW50U2hvd24sdGhpcyk7fQp3aWxsSGlkZSgpe2lmKHRoaXMuX25hbWVGaWx0ZXIpCnRoaXMuX25hbWVGaWx0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsdGhpcy5fb25OYW1lRmlsdGVyQ2hhbmdlZCx0aGlzKTt0aGlzLl9jbGVhckN1cnJlbnRIaWdobGlnaHQoKTt9CnBvcHVsYXRlQ29udGV4dE1lbnUoY29udGV4dE1lbnUsZXZlbnQpe2NvbnN0IHRkPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aE5vZGVOYW1lKCd0ZCcpO2lmKCF0ZCkKcmV0dXJuO2NvbnN0IG5vZGU9dGQuaGVhcFNuYXBzaG90Tm9kZTtjb250ZXh0TWVudS5yZXZlYWxTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BSZXZlYWwgaW4gU3VtbWFyeSB2aWV3YCwoKT0+e3RoaXMuX2RhdGFEaXNwbGF5RGVsZWdhdGUuc2hvd09iamVjdChub2RlLnNuYXBzaG90Tm9kZUlkLGxzYFN1bW1hcnlgKTt9KTt9CnJlc2V0U29ydGluZ0NhY2hlKCl7ZGVsZXRlIHRoaXMuX2xhc3RTb3J0Q29sdW1uSWQ7ZGVsZXRlIHRoaXMuX2xhc3RTb3J0QXNjZW5kaW5nO30KdG9wTGV2ZWxOb2Rlcygpe3JldHVybiB0aGlzLnJvb3ROb2RlKCkuY2hpbGRyZW47fQpyZXZlYWxPYmplY3RCeUhlYXBTbmFwc2hvdElkKGhlYXBTbmFwc2hvdE9iamVjdElkKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7fQpoaWdobGlnaHROb2RlKG5vZGUpe3RoaXMuX2NsZWFyQ3VycmVudEhpZ2hsaWdodCgpO3RoaXMuX2hpZ2hsaWdodGVkTm9kZT1ub2RlO1VJLnJ1bkNTU0FuaW1hdGlvbk9uY2UodGhpcy5faGlnaGxpZ2h0ZWROb2RlLmVsZW1lbnQoKSwnaGlnaGxpZ2h0ZWQtcm93Jyk7fQpfY2xlYXJDdXJyZW50SGlnaGxpZ2h0KCl7aWYoIXRoaXMuX2hpZ2hsaWdodGVkTm9kZSkKcmV0dXJuO3RoaXMuX2hpZ2hsaWdodGVkTm9kZS5lbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQtcm93Jyk7dGhpcy5faGlnaGxpZ2h0ZWROb2RlPW51bGw7fQpyZXNldE5hbWVGaWx0ZXIoKXt0aGlzLl9uYW1lRmlsdGVyLnNldFZhbHVlKCcnKTt9Cl9vbk5hbWVGaWx0ZXJDaGFuZ2VkKCl7dGhpcy51cGRhdGVWaXNpYmxlTm9kZXModHJ1ZSk7fQpzb3J0aW5nQ2hhbmdlZCgpe2NvbnN0IHNvcnRBc2NlbmRpbmc9dGhpcy5pc1NvcnRPcmRlckFzY2VuZGluZygpO2NvbnN0IHNvcnRDb2x1bW5JZD10aGlzLnNvcnRDb2x1bW5JZCgpO2lmKHRoaXMuX2xhc3RTb3J0Q29sdW1uSWQ9PT1zb3J0Q29sdW1uSWQmJnRoaXMuX2xhc3RTb3J0QXNjZW5kaW5nPT09c29ydEFzY2VuZGluZykKcmV0dXJuO3RoaXMuX2xhc3RTb3J0Q29sdW1uSWQ9c29ydENvbHVtbklkO3RoaXMuX2xhc3RTb3J0QXNjZW5kaW5nPXNvcnRBc2NlbmRpbmc7Y29uc3Qgc29ydEZpZWxkcz10aGlzLl9zb3J0RmllbGRzKHNvcnRDb2x1bW5JZCxzb3J0QXNjZW5kaW5nKTtmdW5jdGlvbiBTb3J0QnlUd29GaWVsZHMobm9kZUEsbm9kZUIpe2xldCBmaWVsZDE9bm9kZUFbc29ydEZpZWxkc1swXV07bGV0IGZpZWxkMj1ub2RlQltzb3J0RmllbGRzWzBdXTtsZXQgcmVzdWx0PWZpZWxkMTxmaWVsZDI/LTE6KGZpZWxkMT5maWVsZDI/MTowKTtpZighc29ydEZpZWxkc1sxXSkKcmVzdWx0PS1yZXN1bHQ7aWYocmVzdWx0IT09MCkKcmV0dXJuIHJlc3VsdDtmaWVsZDE9bm9kZUFbc29ydEZpZWxkc1syXV07ZmllbGQyPW5vZGVCW3NvcnRGaWVsZHNbMl1dO3Jlc3VsdD1maWVsZDE8ZmllbGQyPy0xOihmaWVsZDE+ZmllbGQyPzE6MCk7aWYoIXNvcnRGaWVsZHNbM10pCnJlc3VsdD0tcmVzdWx0O3JldHVybiByZXN1bHQ7fQp0aGlzLl9wZXJmb3JtU29ydGluZyhTb3J0QnlUd29GaWVsZHMpO30KX3BlcmZvcm1Tb3J0aW5nKHNvcnRGdW5jdGlvbil7dGhpcy5yZWN1cnNpdmVTb3J0aW5nRW50ZXIoKTtjb25zdCBjaGlsZHJlbj10aGlzLmFsbENoaWxkcmVuKHRoaXMucm9vdE5vZGUoKSk7dGhpcy5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7Y2hpbGRyZW4uc29ydChzb3J0RnVuY3Rpb24pO2ZvcihsZXQgaT0wLGw9Y2hpbGRyZW4ubGVuZ3RoO2k8bDsrK2kpe2NvbnN0IGNoaWxkPWNoaWxkcmVuW2ldO3RoaXMuYXBwZW5kQ2hpbGRBZnRlclNvcnRpbmcoY2hpbGQpO2lmKGNoaWxkLmV4cGFuZGVkKQpjaGlsZC5zb3J0KCk7fQp0aGlzLnJlY3Vyc2l2ZVNvcnRpbmdMZWF2ZSgpO30KYXBwZW5kQ2hpbGRBZnRlclNvcnRpbmcoY2hpbGQpe2NvbnN0IHJldmVhbGVkPWNoaWxkLnJldmVhbGVkO3RoaXMucm9vdE5vZGUoKS5hcHBlbmRDaGlsZChjaGlsZCk7Y2hpbGQucmV2ZWFsZWQ9cmV2ZWFsZWQ7fQpyZWN1cnNpdmVTb3J0aW5nRW50ZXIoKXsrK3RoaXMuX3JlY3Vyc2l2ZVNvcnRpbmdEZXB0aDt9CnJlY3Vyc2l2ZVNvcnRpbmdMZWF2ZSgpe2lmKCF0aGlzLl9yZWN1cnNpdmVTb3J0aW5nRGVwdGgpCnJldHVybjtpZigtLXRoaXMuX3JlY3Vyc2l2ZVNvcnRpbmdEZXB0aCkKcmV0dXJuO3RoaXMudXBkYXRlVmlzaWJsZU5vZGVzKHRydWUpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFNvcnRhYmxlRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDb21wbGV0ZSk7fQp1cGRhdGVWaXNpYmxlTm9kZXMoZm9yY2Upe30KYWxsQ2hpbGRyZW4ocGFyZW50KXtyZXR1cm4gcGFyZW50LmNoaWxkcmVuO30KaW5zZXJ0Q2hpbGQocGFyZW50LG5vZGUsaW5kZXgpe3BhcmVudC5pbnNlcnRDaGlsZChub2RlLGluZGV4KTt9CnJlbW92ZUNoaWxkQnlJbmRleChwYXJlbnQsaW5kZXgpe3BhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuY2hpbGRyZW5baW5kZXhdKTt9CnJlbW92ZUFsbENoaWxkcmVuKHBhcmVudCl7cGFyZW50LnJlbW92ZUNoaWxkcmVuKCk7fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90U29ydGFibGVEYXRhR3JpZC5FdmVudHM9e0NvbnRlbnRTaG93bjpTeW1ib2woJ0NvbnRlbnRTaG93bicpLFNvcnRpbmdDb21wbGV0ZTpTeW1ib2woJ1NvcnRpbmdDb21wbGV0ZScpfTtQcm9maWxlci5IZWFwU25hcHNob3RWaWV3cG9ydERhdGFHcmlkPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90U29ydGFibGVEYXRhR3JpZHtjb25zdHJ1Y3RvcihkYXRhRGlzcGxheURlbGVnYXRlLGNvbHVtbnMpe3N1cGVyKGRhdGFEaXNwbGF5RGVsZWdhdGUsY29sdW1ucyk7dGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX3RvcFBhZGRpbmdIZWlnaHQ9MDt0aGlzLl9ib3R0b21QYWRkaW5nSGVpZ2h0PTA7fQp0b3BMZXZlbE5vZGVzKCl7cmV0dXJuIHRoaXMuYWxsQ2hpbGRyZW4odGhpcy5yb290Tm9kZSgpKTt9CmFwcGVuZENoaWxkQWZ0ZXJTb3J0aW5nKGNoaWxkKXt9CnVwZGF0ZVZpc2libGVOb2Rlcyhmb3JjZSl7Y29uc3QgZ3VhcmRab25lSGVpZ2h0PTQwO2NvbnN0IHNjcm9sbEhlaWdodD10aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxIZWlnaHQ7bGV0IHNjcm9sbFRvcD10aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7bGV0IHNjcm9sbEJvdHRvbT1zY3JvbGxIZWlnaHQtc2Nyb2xsVG9wLXRoaXMuc2Nyb2xsQ29udGFpbmVyLm9mZnNldEhlaWdodDtzY3JvbGxUb3A9TWF0aC5tYXgoMCxzY3JvbGxUb3AtZ3VhcmRab25lSGVpZ2h0KTtzY3JvbGxCb3R0b209TWF0aC5tYXgoMCxzY3JvbGxCb3R0b20tZ3VhcmRab25lSGVpZ2h0KTtsZXQgdmlld1BvcnRIZWlnaHQ9c2Nyb2xsSGVpZ2h0LXNjcm9sbFRvcC1zY3JvbGxCb3R0b207aWYoIWZvcmNlJiZzY3JvbGxUb3A+PXRoaXMuX3RvcFBhZGRpbmdIZWlnaHQmJnNjcm9sbEJvdHRvbT49dGhpcy5fYm90dG9tUGFkZGluZ0hlaWdodCkKcmV0dXJuO2NvbnN0IGh5c3RlcmVzaXNIZWlnaHQ9NTAwO3Njcm9sbFRvcC09aHlzdGVyZXNpc0hlaWdodDt2aWV3UG9ydEhlaWdodCs9MipoeXN0ZXJlc2lzSGVpZ2h0O2NvbnN0IHNlbGVjdGVkTm9kZT10aGlzLnNlbGVjdGVkTm9kZTt0aGlzLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl90b3BQYWRkaW5nSGVpZ2h0PTA7dGhpcy5fYm90dG9tUGFkZGluZ0hlaWdodD0wO3RoaXMuX2FkZFZpc2libGVOb2Rlcyh0aGlzLnJvb3ROb2RlKCksc2Nyb2xsVG9wLHNjcm9sbFRvcCt2aWV3UG9ydEhlaWdodCk7dGhpcy5zZXRWZXJ0aWNhbFBhZGRpbmcodGhpcy5fdG9wUGFkZGluZ0hlaWdodCx0aGlzLl9ib3R0b21QYWRkaW5nSGVpZ2h0KTtpZihzZWxlY3RlZE5vZGUpe2lmKHNlbGVjdGVkTm9kZS5wYXJlbnQpCnNlbGVjdGVkTm9kZS5zZWxlY3QodHJ1ZSk7ZWxzZQp0aGlzLnNlbGVjdGVkTm9kZT1zZWxlY3RlZE5vZGU7fX0KX2FkZFZpc2libGVOb2RlcyhwYXJlbnROb2RlLHRvcEJvdW5kLGJvdHRvbUJvdW5kKXtpZighcGFyZW50Tm9kZS5leHBhbmRlZCkKcmV0dXJuIDA7Y29uc3QgY2hpbGRyZW49dGhpcy5hbGxDaGlsZHJlbihwYXJlbnROb2RlKTtsZXQgdG9wUGFkZGluZz0wO2NvbnN0IG5hbWVGaWx0ZXJWYWx1ZT10aGlzLl9uYW1lRmlsdGVyP3RoaXMuX25hbWVGaWx0ZXIudmFsdWUoKS50b0xvd2VyQ2FzZSgpOicnO2xldCBpPTA7Zm9yKDtpPGNoaWxkcmVuLmxlbmd0aDsrK2kpe2NvbnN0IGNoaWxkPWNoaWxkcmVuW2ldO2lmKG5hbWVGaWx0ZXJWYWx1ZSYmY2hpbGQuZmlsdGVyZWRPdXQmJmNoaWxkLmZpbHRlcmVkT3V0KG5hbWVGaWx0ZXJWYWx1ZSkpCmNvbnRpbnVlO2NvbnN0IG5ld1RvcD10b3BQYWRkaW5nK3RoaXMuX25vZGVIZWlnaHQoY2hpbGQpO2lmKG5ld1RvcD50b3BCb3VuZCkKYnJlYWs7dG9wUGFkZGluZz1uZXdUb3A7fQpsZXQgcG9zaXRpb249dG9wUGFkZGluZztmb3IoO2k8Y2hpbGRyZW4ubGVuZ3RoJiZwb3NpdGlvbjxib3R0b21Cb3VuZDsrK2kpe2NvbnN0IGNoaWxkPWNoaWxkcmVuW2ldO2lmKG5hbWVGaWx0ZXJWYWx1ZSYmY2hpbGQuZmlsdGVyZWRPdXQmJmNoaWxkLmZpbHRlcmVkT3V0KG5hbWVGaWx0ZXJWYWx1ZSkpCmNvbnRpbnVlO2NvbnN0IGhhc0NoaWxkcmVuPWNoaWxkLmhhc0NoaWxkcmVuKCk7Y2hpbGQucmVtb3ZlQ2hpbGRyZW4oKTtjaGlsZC5zZXRIYXNDaGlsZHJlbihoYXNDaGlsZHJlbik7cGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7cG9zaXRpb24rPWNoaWxkLm5vZGVTZWxmSGVpZ2h0KCk7cG9zaXRpb24rPXRoaXMuX2FkZFZpc2libGVOb2RlcyhjaGlsZCx0b3BCb3VuZC1wb3NpdGlvbixib3R0b21Cb3VuZC1wb3NpdGlvbik7fQpsZXQgYm90dG9tUGFkZGluZz0wO2Zvcig7aTxjaGlsZHJlbi5sZW5ndGg7KytpKXtjb25zdCBjaGlsZD1jaGlsZHJlbltpXTtpZihuYW1lRmlsdGVyVmFsdWUmJmNoaWxkLmZpbHRlcmVkT3V0JiZjaGlsZC5maWx0ZXJlZE91dChuYW1lRmlsdGVyVmFsdWUpKQpjb250aW51ZTtib3R0b21QYWRkaW5nKz10aGlzLl9ub2RlSGVpZ2h0KGNoaWxkKTt9CnRoaXMuX3RvcFBhZGRpbmdIZWlnaHQrPXRvcFBhZGRpbmc7dGhpcy5fYm90dG9tUGFkZGluZ0hlaWdodCs9Ym90dG9tUGFkZGluZztyZXR1cm4gcG9zaXRpb24rYm90dG9tUGFkZGluZzt9Cl9ub2RlSGVpZ2h0KG5vZGUpe2xldCByZXN1bHQ9bm9kZS5ub2RlU2VsZkhlaWdodCgpO2lmKCFub2RlLmV4cGFuZGVkKQpyZXR1cm4gcmVzdWx0O2NvbnN0IGNoaWxkcmVuPXRoaXMuYWxsQ2hpbGRyZW4obm9kZSk7Zm9yKGxldCBpPTA7aTxjaGlsZHJlbi5sZW5ndGg7aSsrKQpyZXN1bHQrPXRoaXMuX25vZGVIZWlnaHQoY2hpbGRyZW5baV0pO3JldHVybiByZXN1bHQ7fQpyZXZlYWxUcmVlTm9kZShwYXRoVG9SZXZlYWwpe2NvbnN0IGhlaWdodD10aGlzLl9jYWxjdWxhdGVPZmZzZXQocGF0aFRvUmV2ZWFsKTtjb25zdCBub2RlPShwYXRoVG9SZXZlYWwucGVla0xhc3QoKSk7Y29uc3Qgc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtjb25zdCBzY3JvbGxCb3R0b209c2Nyb2xsVG9wK3RoaXMuc2Nyb2xsQ29udGFpbmVyLm9mZnNldEhlaWdodDtpZihoZWlnaHQ+PXNjcm9sbFRvcCYmaGVpZ2h0PHNjcm9sbEJvdHRvbSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKTtjb25zdCBzY3JvbGxHYXA9NDA7dGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wPU1hdGgubWF4KDAsaGVpZ2h0LXNjcm9sbEdhcCk7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pntjb25zb2xlLmFzc2VydCghdGhpcy5fc2Nyb2xsVG9SZXNvbHZlQ2FsbGJhY2spO3RoaXMuX3Njcm9sbFRvUmVzb2x2ZUNhbGxiYWNrPXJlc29sdmUuYmluZChudWxsLG5vZGUpO3RoaXMuc2Nyb2xsQ29udGFpbmVyLndpbmRvdygpLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2lmKCF0aGlzLl9zY3JvbGxUb1Jlc29sdmVDYWxsYmFjaykKcmV0dXJuO3RoaXMuX3Njcm9sbFRvUmVzb2x2ZUNhbGxiYWNrKCk7dGhpcy5fc2Nyb2xsVG9SZXNvbHZlQ2FsbGJhY2s9bnVsbDt9KTt9KTt9Cl9jYWxjdWxhdGVPZmZzZXQocGF0aFRvUmV2ZWFsKXtsZXQgcGFyZW50Tm9kZT10aGlzLnJvb3ROb2RlKCk7bGV0IGhlaWdodD0wO2ZvcihsZXQgaT0wO2k8cGF0aFRvUmV2ZWFsLmxlbmd0aDsrK2kpe2NvbnN0IG5vZGU9cGF0aFRvUmV2ZWFsW2ldO2NvbnN0IGNoaWxkcmVuPXRoaXMuYWxsQ2hpbGRyZW4ocGFyZW50Tm9kZSk7Zm9yKGxldCBqPTA7ajxjaGlsZHJlbi5sZW5ndGg7KytqKXtjb25zdCBjaGlsZD1jaGlsZHJlbltqXTtpZihub2RlPT09Y2hpbGQpe2hlaWdodCs9bm9kZS5ub2RlU2VsZkhlaWdodCgpO2JyZWFrO30KaGVpZ2h0Kz10aGlzLl9ub2RlSGVpZ2h0KGNoaWxkKTt9CnBhcmVudE5vZGU9bm9kZTt9CnJldHVybiBoZWlnaHQtcGF0aFRvUmV2ZWFsLnBlZWtMYXN0KCkubm9kZVNlbGZIZWlnaHQoKTt9CmFsbENoaWxkcmVuKHBhcmVudCl7cmV0dXJuIHBhcmVudC5fYWxsQ2hpbGRyZW58fChwYXJlbnQuX2FsbENoaWxkcmVuPVtdKTt9CmFwcGVuZE5vZGUocGFyZW50LG5vZGUpe3RoaXMuYWxsQ2hpbGRyZW4ocGFyZW50KS5wdXNoKG5vZGUpO30KaW5zZXJ0Q2hpbGQocGFyZW50LG5vZGUsaW5kZXgpe3RoaXMuYWxsQ2hpbGRyZW4ocGFyZW50KS5zcGxpY2UoaW5kZXgsMCwobm9kZSkpO30KcmVtb3ZlQ2hpbGRCeUluZGV4KHBhcmVudCxpbmRleCl7dGhpcy5hbGxDaGlsZHJlbihwYXJlbnQpLnNwbGljZShpbmRleCwxKTt9CnJlbW92ZUFsbENoaWxkcmVuKHBhcmVudCl7cGFyZW50Ll9hbGxDaGlsZHJlbj1bXTt9CnJlbW92ZVRvcExldmVsTm9kZXMoKXt0aGlzLl9kaXNwb3NlQWxsTm9kZXMoKTt0aGlzLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLnJvb3ROb2RlKCkuX2FsbENoaWxkcmVuPVtdO30KX2lzU2Nyb2xsZWRJbnRvVmlldyhlbGVtZW50KXtjb25zdCB2aWV3cG9ydFRvcD10aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7Y29uc3Qgdmlld3BvcnRCb3R0b209dmlld3BvcnRUb3ArdGhpcy5zY3JvbGxDb250YWluZXIuY2xpZW50SGVpZ2h0O2NvbnN0IGVsZW1Ub3A9ZWxlbWVudC5vZmZzZXRUb3A7Y29uc3QgZWxlbUJvdHRvbT1lbGVtVG9wK2VsZW1lbnQub2Zmc2V0SGVpZ2h0O3JldHVybiBlbGVtQm90dG9tPD12aWV3cG9ydEJvdHRvbSYmZWxlbVRvcD49dmlld3BvcnRUb3A7fQpvblJlc2l6ZSgpe3N1cGVyLm9uUmVzaXplKCk7dGhpcy51cGRhdGVWaXNpYmxlTm9kZXMoZmFsc2UpO30KX29uU2Nyb2xsKGV2ZW50KXt0aGlzLnVwZGF0ZVZpc2libGVOb2RlcyhmYWxzZSk7aWYodGhpcy5fc2Nyb2xsVG9SZXNvbHZlQ2FsbGJhY2spe3RoaXMuX3Njcm9sbFRvUmVzb2x2ZUNhbGxiYWNrKCk7dGhpcy5fc2Nyb2xsVG9SZXNvbHZlQ2FsbGJhY2s9bnVsbDt9fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90Q29udGFpbm1lbnREYXRhR3JpZD1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdFNvcnRhYmxlRGF0YUdyaWR7Y29uc3RydWN0b3IoZGF0YURpc3BsYXlEZWxlZ2F0ZSxjb2x1bW5zKXtjb2x1bW5zPWNvbHVtbnN8fCgoW3tpZDonb2JqZWN0Jyx0aXRsZTpsc2BPYmplY3RgLGRpc2Nsb3N1cmU6dHJ1ZSxzb3J0YWJsZTp0cnVlfSx7aWQ6J2Rpc3RhbmNlJyx0aXRsZTpsc2BEaXN0YW5jZWAsd2lkdGg6JzcwcHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J3NoYWxsb3dTaXplJyx0aXRsZTpsc2BTaGFsbG93IFNpemVgLHdpZHRoOicxMTBweCcsc29ydGFibGU6dHJ1ZSxmaXhlZFdpZHRoOnRydWV9LHtpZDoncmV0YWluZWRTaXplJyx0aXRsZTpsc2BSZXRhaW5lZCBTaXplYCx3aWR0aDonMTEwcHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlLHNvcnQ6RGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuRGVzY2VuZGluZ31dKSk7c3VwZXIoZGF0YURpc3BsYXlEZWxlZ2F0ZSxjb2x1bW5zKTt9CnNldERhdGFTb3VyY2Uoc25hcHNob3Qsbm9kZUluZGV4KXt0aGlzLnNuYXBzaG90PXNuYXBzaG90O2NvbnN0IG5vZGU9e25vZGVJbmRleDpub2RlSW5kZXh8fHNuYXBzaG90LnJvb3ROb2RlSW5kZXh9O2NvbnN0IGZha2VFZGdlPXtub2RlOm5vZGV9O3RoaXMuc2V0Um9vdE5vZGUodGhpcy5fY3JlYXRlUm9vdE5vZGUoc25hcHNob3QsZmFrZUVkZ2UpKTt0aGlzLnJvb3ROb2RlKCkuc29ydCgpO30KX2NyZWF0ZVJvb3ROb2RlKHNuYXBzaG90LGZha2VFZGdlKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdE9iamVjdE5vZGUodGhpcyxzbmFwc2hvdCxmYWtlRWRnZSxudWxsKTt9CnNvcnRpbmdDaGFuZ2VkKCl7Y29uc3Qgcm9vdE5vZGU9dGhpcy5yb290Tm9kZSgpO2lmKHJvb3ROb2RlLmhhc0NoaWxkcmVuKCkpCnJvb3ROb2RlLnNvcnQoKTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RSZXRhaW5tZW50RGF0YUdyaWQ9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RDb250YWlubWVudERhdGFHcmlke2NvbnN0cnVjdG9yKGRhdGFEaXNwbGF5RGVsZWdhdGUpe2NvbnN0IGNvbHVtbnM9KFt7aWQ6J29iamVjdCcsdGl0bGU6bHNgT2JqZWN0YCxkaXNjbG9zdXJlOnRydWUsc29ydGFibGU6dHJ1ZX0se2lkOidkaXN0YW5jZScsdGl0bGU6bHNgRGlzdGFuY2VgLHdpZHRoOic3MHB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0OkRhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZ30se2lkOidzaGFsbG93U2l6ZScsdGl0bGU6bHNgU2hhbGxvdyBTaXplYCx3aWR0aDonMTEwcHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J3JldGFpbmVkU2l6ZScsdGl0bGU6bHNgUmV0YWluZWQgU2l6ZWAsd2lkdGg6JzExMHB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZX1dKTtzdXBlcihkYXRhRGlzcGxheURlbGVnYXRlLGNvbHVtbnMpO30KX2NyZWF0ZVJvb3ROb2RlKHNuYXBzaG90LGZha2VFZGdlKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFJldGFpbmluZ09iamVjdE5vZGUodGhpcyxzbmFwc2hvdCxmYWtlRWRnZSxudWxsKTt9Cl9zb3J0RmllbGRzKHNvcnRDb2x1bW4sc29ydEFzY2VuZGluZyl7cmV0dXJue29iamVjdDpbJ19uYW1lJyxzb3J0QXNjZW5kaW5nLCdfY291bnQnLGZhbHNlXSxjb3VudDpbJ19jb3VudCcsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdLHNoYWxsb3dTaXplOlsnX3NoYWxsb3dTaXplJyxzb3J0QXNjZW5kaW5nLCdfbmFtZScsdHJ1ZV0scmV0YWluZWRTaXplOlsnX3JldGFpbmVkU2l6ZScsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdLGRpc3RhbmNlOlsnX2Rpc3RhbmNlJyxzb3J0QXNjZW5kaW5nLCdfbmFtZScsdHJ1ZV19W3NvcnRDb2x1bW5dO30KcmVzZXQoKXt0aGlzLnJvb3ROb2RlKCkucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLnJlc2V0U29ydGluZ0NhY2hlKCk7fQpzZXREYXRhU291cmNlKHNuYXBzaG90LG5vZGVJbmRleCl7c3VwZXIuc2V0RGF0YVNvdXJjZShzbmFwc2hvdCxub2RlSW5kZXgpO3RoaXMucm9vdE5vZGUoKS5leHBhbmQoKTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RSZXRhaW5tZW50RGF0YUdyaWQuRXZlbnRzPXtFeHBhbmRSZXRhaW5lcnNDb21wbGV0ZTpTeW1ib2woJ0V4cGFuZFJldGFpbmVyc0NvbXBsZXRlJyl9O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdENvbnN0cnVjdG9yc0RhdGFHcmlkPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90Vmlld3BvcnREYXRhR3JpZHtjb25zdHJ1Y3RvcihkYXRhRGlzcGxheURlbGVnYXRlKXtjb25zdCBjb2x1bW5zPShbe2lkOidvYmplY3QnLHRpdGxlOmxzYENvbnN0cnVjdG9yYCxkaXNjbG9zdXJlOnRydWUsc29ydGFibGU6dHJ1ZX0se2lkOidkaXN0YW5jZScsdGl0bGU6bHNgRGlzdGFuY2VgLHdpZHRoOic3MHB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZX0se2lkOidzaGFsbG93U2l6ZScsdGl0bGU6bHNgU2hhbGxvdyBTaXplYCx3aWR0aDonMTEwcHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J3JldGFpbmVkU2l6ZScsdGl0bGU6bHNgUmV0YWluZWQgU2l6ZWAsd2lkdGg6JzExMHB4Jyxzb3J0OkRhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmcsc29ydGFibGU6dHJ1ZSxmaXhlZFdpZHRoOnRydWV9XSk7c3VwZXIoZGF0YURpc3BsYXlEZWxlZ2F0ZSxjb2x1bW5zKTt0aGlzLl9wcm9maWxlSW5kZXg9LTE7dGhpcy5fb2JqZWN0SWRUb1NlbGVjdD1udWxsO30KX3NvcnRGaWVsZHMoc29ydENvbHVtbixzb3J0QXNjZW5kaW5nKXtyZXR1cm57b2JqZWN0OlsnX25hbWUnLHNvcnRBc2NlbmRpbmcsJ19yZXRhaW5lZFNpemUnLGZhbHNlXSxkaXN0YW5jZTpbJ19kaXN0YW5jZScsc29ydEFzY2VuZGluZywnX3JldGFpbmVkU2l6ZScsZmFsc2VdLHNoYWxsb3dTaXplOlsnX3NoYWxsb3dTaXplJyxzb3J0QXNjZW5kaW5nLCdfbmFtZScsdHJ1ZV0scmV0YWluZWRTaXplOlsnX3JldGFpbmVkU2l6ZScsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdfVtzb3J0Q29sdW1uXTt9CmFzeW5jIHJldmVhbE9iamVjdEJ5SGVhcFNuYXBzaG90SWQoaWQpe2lmKCF0aGlzLnNuYXBzaG90KXt0aGlzLl9vYmplY3RJZFRvU2VsZWN0PWlkO3JldHVybiBudWxsO30KY29uc3QgY2xhc3NOYW1lPWF3YWl0IHRoaXMuc25hcHNob3Qubm9kZUNsYXNzTmFtZShwYXJzZUludChpZCwxMCkpO2lmKCFjbGFzc05hbWUpCnJldHVybiBudWxsO2NvbnN0IHBhcmVudD10aGlzLnRvcExldmVsTm9kZXMoKS5maW5kKGNsYXNzTm9kZT0+Y2xhc3NOb2RlLl9uYW1lPT09Y2xhc3NOYW1lKTtpZighcGFyZW50KQpyZXR1cm4gbnVsbDtjb25zdCBub2Rlcz1hd2FpdCBwYXJlbnQucG9wdWxhdGVOb2RlQnlTbmFwc2hvdE9iamVjdElkKHBhcnNlSW50KGlkLDEwKSk7cmV0dXJuIG5vZGVzLmxlbmd0aD90aGlzLnJldmVhbFRyZWVOb2RlKG5vZGVzKTpudWxsO30KY2xlYXIoKXt0aGlzLl9uZXh0UmVxdWVzdGVkRmlsdGVyPW51bGw7dGhpcy5fbGFzdEZpbHRlcj1udWxsO3RoaXMucmVtb3ZlVG9wTGV2ZWxOb2RlcygpO30Kc2V0RGF0YVNvdXJjZShzbmFwc2hvdCl7dGhpcy5zbmFwc2hvdD1zbmFwc2hvdDtpZih0aGlzLl9wcm9maWxlSW5kZXg9PT0tMSkKdGhpcy5fcG9wdWxhdGVDaGlsZHJlbigpO2lmKHRoaXMuX29iamVjdElkVG9TZWxlY3Qpe3RoaXMucmV2ZWFsT2JqZWN0QnlIZWFwU25hcHNob3RJZCh0aGlzLl9vYmplY3RJZFRvU2VsZWN0KTt0aGlzLl9vYmplY3RJZFRvU2VsZWN0PW51bGw7fX0Kc2V0U2VsZWN0aW9uUmFuZ2UobWluTm9kZUlkLG1heE5vZGVJZCl7dGhpcy5fbm9kZUZpbHRlcj1uZXcgSGVhcFNuYXBzaG90TW9kZWwuTm9kZUZpbHRlcihtaW5Ob2RlSWQsbWF4Tm9kZUlkKTt0aGlzLl9wb3B1bGF0ZUNoaWxkcmVuKHRoaXMuX25vZGVGaWx0ZXIpO30Kc2V0QWxsb2NhdGlvbk5vZGVJZChhbGxvY2F0aW9uTm9kZUlkKXt0aGlzLl9ub2RlRmlsdGVyPW5ldyBIZWFwU25hcHNob3RNb2RlbC5Ob2RlRmlsdGVyKCk7dGhpcy5fbm9kZUZpbHRlci5hbGxvY2F0aW9uTm9kZUlkPWFsbG9jYXRpb25Ob2RlSWQ7dGhpcy5fcG9wdWxhdGVDaGlsZHJlbih0aGlzLl9ub2RlRmlsdGVyKTt9Cl9hZ2dyZWdhdGVzUmVjZWl2ZWQobm9kZUZpbHRlcixhZ2dyZWdhdGVzKXt0aGlzLl9maWx0ZXJJblByb2dyZXNzPW51bGw7aWYodGhpcy5fbmV4dFJlcXVlc3RlZEZpbHRlcil7dGhpcy5zbmFwc2hvdC5hZ2dyZWdhdGVzV2l0aEZpbHRlcih0aGlzLl9uZXh0UmVxdWVzdGVkRmlsdGVyKS50aGVuKHRoaXMuX2FnZ3JlZ2F0ZXNSZWNlaXZlZC5iaW5kKHRoaXMsdGhpcy5fbmV4dFJlcXVlc3RlZEZpbHRlcikpO3RoaXMuX2ZpbHRlckluUHJvZ3Jlc3M9dGhpcy5fbmV4dFJlcXVlc3RlZEZpbHRlcjt0aGlzLl9uZXh0UmVxdWVzdGVkRmlsdGVyPW51bGw7fQp0aGlzLnJlbW92ZVRvcExldmVsTm9kZXMoKTt0aGlzLnJlc2V0U29ydGluZ0NhY2hlKCk7Zm9yKGNvbnN0IGNvbnN0cnVjdG9yIGluIGFnZ3JlZ2F0ZXMpe3RoaXMuYXBwZW5kTm9kZSh0aGlzLnJvb3ROb2RlKCksbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdENvbnN0cnVjdG9yTm9kZSh0aGlzLGNvbnN0cnVjdG9yLGFnZ3JlZ2F0ZXNbY29uc3RydWN0b3JdLG5vZGVGaWx0ZXIpKTt9CnRoaXMuc29ydGluZ0NoYW5nZWQoKTt0aGlzLl9sYXN0RmlsdGVyPW5vZGVGaWx0ZXI7fQphc3luYyBfcG9wdWxhdGVDaGlsZHJlbihtYXliZU5vZGVGaWx0ZXIpe2NvbnN0IG5vZGVGaWx0ZXI9bWF5YmVOb2RlRmlsdGVyfHxuZXcgSGVhcFNuYXBzaG90TW9kZWwuTm9kZUZpbHRlcigpO2lmKHRoaXMuX2ZpbHRlckluUHJvZ3Jlc3Mpe3RoaXMuX25leHRSZXF1ZXN0ZWRGaWx0ZXI9dGhpcy5fZmlsdGVySW5Qcm9ncmVzcy5lcXVhbHMobm9kZUZpbHRlcik/bnVsbDpub2RlRmlsdGVyO3JldHVybjt9CmlmKHRoaXMuX2xhc3RGaWx0ZXImJnRoaXMuX2xhc3RGaWx0ZXIuZXF1YWxzKG5vZGVGaWx0ZXIpKQpyZXR1cm47dGhpcy5fZmlsdGVySW5Qcm9ncmVzcz1ub2RlRmlsdGVyO2NvbnN0IGFnZ3JlZ2F0ZXM9YXdhaXQgdGhpcy5zbmFwc2hvdC5hZ2dyZWdhdGVzV2l0aEZpbHRlcihub2RlRmlsdGVyKTt0aGlzLl9hZ2dyZWdhdGVzUmVjZWl2ZWQobm9kZUZpbHRlcixhZ2dyZWdhdGVzKTt9CmZpbHRlclNlbGVjdEluZGV4Q2hhbmdlZChwcm9maWxlcyxwcm9maWxlSW5kZXgpe3RoaXMuX3Byb2ZpbGVJbmRleD1wcm9maWxlSW5kZXg7dGhpcy5fbm9kZUZpbHRlcj11bmRlZmluZWQ7aWYocHJvZmlsZUluZGV4IT09LTEpe2NvbnN0IG1pbk5vZGVJZD1wcm9maWxlSW5kZXg+MD9wcm9maWxlc1twcm9maWxlSW5kZXgtMV0ubWF4SlNPYmplY3RJZDowO2NvbnN0IG1heE5vZGVJZD1wcm9maWxlc1twcm9maWxlSW5kZXhdLm1heEpTT2JqZWN0SWQ7dGhpcy5fbm9kZUZpbHRlcj1uZXcgSGVhcFNuYXBzaG90TW9kZWwuTm9kZUZpbHRlcihtaW5Ob2RlSWQsbWF4Tm9kZUlkKTt9CnRoaXMuX3BvcHVsYXRlQ2hpbGRyZW4odGhpcy5fbm9kZUZpbHRlcik7fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90RGlmZkRhdGFHcmlkPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90Vmlld3BvcnREYXRhR3JpZHtjb25zdHJ1Y3RvcihkYXRhRGlzcGxheURlbGVnYXRlKXtjb25zdCBjb2x1bW5zPShbe2lkOidvYmplY3QnLHRpdGxlOmxzYENvbnN0cnVjdG9yYCxkaXNjbG9zdXJlOnRydWUsc29ydGFibGU6dHJ1ZX0se2lkOidhZGRlZENvdW50Jyx0aXRsZTpsc2AjIE5ld2Asd2lkdGg6Jzc1cHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J3JlbW92ZWRDb3VudCcsdGl0bGU6bHNgIyBEZWxldGVkYCx3aWR0aDonNzVweCcsc29ydGFibGU6dHJ1ZSxmaXhlZFdpZHRoOnRydWV9LHtpZDonY291bnREZWx0YScsdGl0bGU6bHNgIyBEZWx0YWAsd2lkdGg6JzY1cHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J2FkZGVkU2l6ZScsdGl0bGU6bHNgQWxsb2MuIFNpemVgLHdpZHRoOic3NXB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0OkRhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmd9LHtpZDoncmVtb3ZlZFNpemUnLHRpdGxlOmxzYEZyZWVkIFNpemVgLHdpZHRoOic3NXB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZX0se2lkOidzaXplRGVsdGEnLHRpdGxlOmxzYFNpemUgRGVsdGFgLHdpZHRoOic3NXB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZX1dKTtzdXBlcihkYXRhRGlzcGxheURlbGVnYXRlLGNvbHVtbnMpO30KZGVmYXVsdFBvcHVsYXRlQ291bnQoKXtyZXR1cm4gNTA7fQpfc29ydEZpZWxkcyhzb3J0Q29sdW1uLHNvcnRBc2NlbmRpbmcpe3JldHVybntvYmplY3Q6WydfbmFtZScsc29ydEFzY2VuZGluZywnX2NvdW50JyxmYWxzZV0sYWRkZWRDb3VudDpbJ19hZGRlZENvdW50Jyxzb3J0QXNjZW5kaW5nLCdfbmFtZScsdHJ1ZV0scmVtb3ZlZENvdW50OlsnX3JlbW92ZWRDb3VudCcsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdLGNvdW50RGVsdGE6WydfY291bnREZWx0YScsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdLGFkZGVkU2l6ZTpbJ19hZGRlZFNpemUnLHNvcnRBc2NlbmRpbmcsJ19uYW1lJyx0cnVlXSxyZW1vdmVkU2l6ZTpbJ19yZW1vdmVkU2l6ZScsc29ydEFzY2VuZGluZywnX25hbWUnLHRydWVdLHNpemVEZWx0YTpbJ19zaXplRGVsdGEnLHNvcnRBc2NlbmRpbmcsJ19uYW1lJyx0cnVlXX1bc29ydENvbHVtbl07fQpzZXREYXRhU291cmNlKHNuYXBzaG90KXt0aGlzLnNuYXBzaG90PXNuYXBzaG90O30Kc2V0QmFzZURhdGFTb3VyY2UoYmFzZVNuYXBzaG90KXt0aGlzLmJhc2VTbmFwc2hvdD1iYXNlU25hcHNob3Q7dGhpcy5yZW1vdmVUb3BMZXZlbE5vZGVzKCk7dGhpcy5yZXNldFNvcnRpbmdDYWNoZSgpO2lmKHRoaXMuYmFzZVNuYXBzaG90PT09dGhpcy5zbmFwc2hvdCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuSGVhcFNuYXBzaG90U29ydGFibGVEYXRhR3JpZC5FdmVudHMuU29ydGluZ0NvbXBsZXRlKTtyZXR1cm47fQp0aGlzLl9wb3B1bGF0ZUNoaWxkcmVuKCk7fQphc3luYyBfcG9wdWxhdGVDaGlsZHJlbigpe2NvbnN0IGFnZ3JlZ2F0ZXNGb3JEaWZmPWF3YWl0IHRoaXMuYmFzZVNuYXBzaG90LmFnZ3JlZ2F0ZXNGb3JEaWZmKCk7Y29uc3QgZGlmZkJ5Q2xhc3NOYW1lPWF3YWl0IHRoaXMuc25hcHNob3QuY2FsY3VsYXRlU25hcHNob3REaWZmKHRoaXMuYmFzZVNuYXBzaG90LnVpZCxhZ2dyZWdhdGVzRm9yRGlmZik7Zm9yKGNvbnN0IGNsYXNzTmFtZSBpbiBkaWZmQnlDbGFzc05hbWUpe2NvbnN0IGRpZmY9ZGlmZkJ5Q2xhc3NOYW1lW2NsYXNzTmFtZV07dGhpcy5hcHBlbmROb2RlKHRoaXMucm9vdE5vZGUoKSxuZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90RGlmZk5vZGUodGhpcyxjbGFzc05hbWUsZGlmZikpO30KdGhpcy5zb3J0aW5nQ2hhbmdlZCgpO319O1Byb2ZpbGVyLkFsbG9jYXRpb25EYXRhR3JpZD1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXdwb3J0RGF0YUdyaWR7Y29uc3RydWN0b3IoaGVhcFByb2ZpbGVyTW9kZWwsZGF0YURpc3BsYXlEZWxlZ2F0ZSl7Y29uc3QgY29sdW1ucz0oW3tpZDonbGl2ZUNvdW50Jyx0aXRsZTpsc2BMaXZlIENvdW50YCx3aWR0aDonNzVweCcsc29ydGFibGU6dHJ1ZSxmaXhlZFdpZHRoOnRydWV9LHtpZDonY291bnQnLHRpdGxlOmxzYENvdW50YCx3aWR0aDonNjVweCcsc29ydGFibGU6dHJ1ZSxmaXhlZFdpZHRoOnRydWV9LHtpZDonbGl2ZVNpemUnLHRpdGxlOmxzYExpdmUgU2l6ZWAsd2lkdGg6Jzc1cHgnLHNvcnRhYmxlOnRydWUsZml4ZWRXaWR0aDp0cnVlfSx7aWQ6J3NpemUnLHRpdGxlOmxzYFNpemVgLHdpZHRoOic3NXB4Jyxzb3J0YWJsZTp0cnVlLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0OkRhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmd9LHtpZDonbmFtZScsdGl0bGU6bHNgRnVuY3Rpb25gLGRpc2Nsb3N1cmU6dHJ1ZSxzb3J0YWJsZTp0cnVlfSxdKTtzdXBlcihkYXRhRGlzcGxheURlbGVnYXRlLGNvbHVtbnMpO3RoaXMuX2hlYXBQcm9maWxlck1vZGVsPWhlYXBQcm9maWxlck1vZGVsO3RoaXMuX2xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoKTt9CmhlYXBQcm9maWxlck1vZGVsKCl7cmV0dXJuIHRoaXMuX2hlYXBQcm9maWxlck1vZGVsO30KZGlzcG9zZSgpe3RoaXMuX2xpbmtpZmllci5yZXNldCgpO30KYXN5bmMgc2V0RGF0YVNvdXJjZShzbmFwc2hvdCl7dGhpcy5zbmFwc2hvdD1zbmFwc2hvdDt0aGlzLl90b3BOb2Rlcz1hd2FpdCB0aGlzLnNuYXBzaG90LmFsbG9jYXRpb25UcmFjZXNUb3BzKCk7dGhpcy5fcG9wdWxhdGVDaGlsZHJlbigpO30KX3BvcHVsYXRlQ2hpbGRyZW4oKXt0aGlzLnJlbW92ZVRvcExldmVsTm9kZXMoKTtjb25zdCByb290PXRoaXMucm9vdE5vZGUoKTtjb25zdCB0b3BzPXRoaXMuX3RvcE5vZGVzO2Zvcihjb25zdCB0b3Agb2YgdG9wcykKdGhpcy5hcHBlbmROb2RlKHJvb3QsbmV3IFByb2ZpbGVyLkFsbG9jYXRpb25HcmlkTm9kZSh0aGlzLHRvcCkpO3RoaXMudXBkYXRlVmlzaWJsZU5vZGVzKHRydWUpO30Kc29ydGluZ0NoYW5nZWQoKXt0aGlzLl90b3BOb2Rlcy5zb3J0KHRoaXMuX2NyZWF0ZUNvbXBhcmF0b3IoKSk7dGhpcy5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fcG9wdWxhdGVDaGlsZHJlbigpO30KX2NyZWF0ZUNvbXBhcmF0b3IoKXtjb25zdCBmaWVsZE5hbWU9dGhpcy5zb3J0Q29sdW1uSWQoKTtjb25zdCBjb21wYXJlUmVzdWx0PSh0aGlzLnNvcnRPcmRlcigpPT09RGF0YUdyaWQuRGF0YUdyaWQuT3JkZXIuQXNjZW5kaW5nKT8rMTotMTtmdW5jdGlvbiBjb21wYXJlKGEsYil7aWYoYVtmaWVsZE5hbWVdPmJbZmllbGROYW1lXSkKcmV0dXJuIGNvbXBhcmVSZXN1bHQ7aWYoYVtmaWVsZE5hbWVdPGJbZmllbGROYW1lXSkKcmV0dXJuLWNvbXBhcmVSZXN1bHQ7cmV0dXJuIDA7fQpyZXR1cm4gY29tcGFyZTt9fTs7UHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5EYXRhR3JpZE5vZGV7Y29uc3RydWN0b3IodHJlZSxoYXNDaGlsZHJlbil7c3VwZXIobnVsbCxoYXNDaGlsZHJlbik7dGhpcy5fZGF0YUdyaWQ9dHJlZTt0aGlzLl9pbnN0YW5jZUNvdW50PTA7dGhpcy5fc2F2ZWRDaGlsZHJlbj1udWxsO3RoaXMuX3JldHJpZXZlZENoaWxkcmVuUmFuZ2VzPVtdO3RoaXMuX3Byb3ZpZGVyT2JqZWN0PW51bGw7dGhpcy5fcmVhY2hhYmxlRnJvbVdpbmRvdz1mYWxzZTt9CnN0YXRpYyBjcmVhdGVDb21wYXJhdG9yKGZpZWxkTmFtZXMpe3JldHVybih7ZmllbGROYW1lMTpmaWVsZE5hbWVzWzBdLGFzY2VuZGluZzE6ZmllbGROYW1lc1sxXSxmaWVsZE5hbWUyOmZpZWxkTmFtZXNbMl0sYXNjZW5kaW5nMjpmaWVsZE5hbWVzWzNdfSk7fQpoZWFwU25hcHNob3REYXRhR3JpZCgpe3JldHVybiB0aGlzLl9kYXRhR3JpZDt9CmNyZWF0ZVByb3ZpZGVyKCl7dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7fQpyZXRhaW5lcnNEYXRhU291cmNlKCl7cmV0dXJuIG51bGw7fQpfcHJvdmlkZXIoKXtpZighdGhpcy5fcHJvdmlkZXJPYmplY3QpCnRoaXMuX3Byb3ZpZGVyT2JqZWN0PXRoaXMuY3JlYXRlUHJvdmlkZXIoKTtyZXR1cm4gdGhpcy5fcHJvdmlkZXJPYmplY3Q7fQpjcmVhdGVDZWxsKGNvbHVtbklkKXtjb25zdCBjZWxsPXN1cGVyLmNyZWF0ZUNlbGwoY29sdW1uSWQpO2lmKHRoaXMuX3NlYXJjaE1hdGNoZWQpCmNlbGwuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7cmV0dXJuIGNlbGw7fQpjb2xsYXBzZSgpe3N1cGVyLmNvbGxhcHNlKCk7dGhpcy5fZGF0YUdyaWQudXBkYXRlVmlzaWJsZU5vZGVzKHRydWUpO30KZXhwYW5kKCl7c3VwZXIuZXhwYW5kKCk7dGhpcy5fZGF0YUdyaWQudXBkYXRlVmlzaWJsZU5vZGVzKHRydWUpO30KZGlzcG9zZSgpe2lmKHRoaXMuX3Byb3ZpZGVyT2JqZWN0KQp0aGlzLl9wcm92aWRlck9iamVjdC5kaXNwb3NlKCk7Zm9yKGxldCBub2RlPXRoaXMuY2hpbGRyZW5bMF07bm9kZTtub2RlPW5vZGUudHJhdmVyc2VOZXh0Tm9kZSh0cnVlLHRoaXMsdHJ1ZSkpe2lmKG5vZGUuZGlzcG9zZSkKbm9kZS5kaXNwb3NlKCk7fX0KcXVlcnlPYmplY3RDb250ZW50KGhlYXBQcm9maWxlck1vZGVsLG9iamVjdEdyb3VwTmFtZSl7fQpfdG9QZXJjZW50U3RyaW5nKG51bSl7cmV0dXJuIG51bS50b0ZpeGVkKDApKydceGEwJSc7fQpfdG9VSURpc3RhbmNlKGRpc3RhbmNlKXtjb25zdCBiYXNlU3lzdGVtRGlzdGFuY2U9SGVhcFNuYXBzaG90TW9kZWwuYmFzZVN5c3RlbURpc3RhbmNlO3JldHVybiBkaXN0YW5jZT49MCYmZGlzdGFuY2U8YmFzZVN5c3RlbURpc3RhbmNlP0NvbW1vbi5VSVN0cmluZygnJWQnLGRpc3RhbmNlKTpDb21tb24uVUlTdHJpbmcoJ1x1MjIxMicpO30KYWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fZGF0YUdyaWQuYWxsQ2hpbGRyZW4odGhpcyk7fQpyZW1vdmVDaGlsZEJ5SW5kZXgoaW5kZXgpe3RoaXMuX2RhdGFHcmlkLnJlbW92ZUNoaWxkQnlJbmRleCh0aGlzLGluZGV4KTt9CmNoaWxkRm9yUG9zaXRpb24obm9kZVBvc2l0aW9uKXtsZXQgaW5kZXhPZkZpcnN0Q2hpbGRJblJhbmdlPTA7Zm9yKGxldCBpPTA7aTx0aGlzLl9yZXRyaWV2ZWRDaGlsZHJlblJhbmdlcy5sZW5ndGg7aSsrKXtjb25zdCByYW5nZT10aGlzLl9yZXRyaWV2ZWRDaGlsZHJlblJhbmdlc1tpXTtpZihyYW5nZS5mcm9tPD1ub2RlUG9zaXRpb24mJm5vZGVQb3NpdGlvbjxyYW5nZS50byl7Y29uc3QgY2hpbGRJbmRleD1pbmRleE9mRmlyc3RDaGlsZEluUmFuZ2Urbm9kZVBvc2l0aW9uLXJhbmdlLmZyb207cmV0dXJuIHRoaXMuYWxsQ2hpbGRyZW4oKVtjaGlsZEluZGV4XTt9CmluZGV4T2ZGaXJzdENoaWxkSW5SYW5nZSs9cmFuZ2UudG8tcmFuZ2UuZnJvbSsxO30KcmV0dXJuIG51bGw7fQpfY3JlYXRlVmFsdWVDZWxsKGNvbHVtbklkKXtjb25zdCBjZWxsPVVJLmh0bWxgPHRkIGNsYXNzPSJudW1lcmljLWNvbHVtbiIgLz5gO2lmKHRoaXMuZGF0YUdyaWQuc25hcHNob3QudG90YWxTaXplIT09MCl7Y29uc3QgZGl2PVVJLmh0bWxgPGRpdj48c3Bhbj4ke3RoaXMuZGF0YVtjb2x1bW5JZF19PC9zcGFuPjwvZGl2PmA7Y29uc3QgcGVyY2VudENvbHVtbj1jb2x1bW5JZCsnLXBlcmNlbnQnO2lmKHBlcmNlbnRDb2x1bW4gaW4gdGhpcy5kYXRhKXtkaXYuYXBwZW5kQ2hpbGQoVUkuaHRtbGA8c3BhbiBjbGFzcz0icGVyY2VudC1jb2x1bW4iPiR7dGhpcy5kYXRhW3BlcmNlbnRDb2x1bW5dfTwvc3Bhbj5gKTtkaXYuY2xhc3NMaXN0LmFkZCgncHJvZmlsZS1tdWx0aXBsZS12YWx1ZXMnKTt9CmNlbGwuYXBwZW5kQ2hpbGQoZGl2KTt9CnJldHVybiBjZWxsO30KcG9wdWxhdGUoKXtpZih0aGlzLl9wb3B1bGF0ZWQpCnJldHVybjt0aGlzLl9wb3B1bGF0ZWQ9dHJ1ZTt0aGlzLl9wcm92aWRlcigpLnNvcnRBbmRSZXdpbmQodGhpcy5jb21wYXJhdG9yKCkpLnRoZW4oKCk9PnRoaXMuX3BvcHVsYXRlQ2hpbGRyZW4oKSk7fQpleHBhbmRXaXRob3V0UG9wdWxhdGUoKXt0aGlzLl9wb3B1bGF0ZWQ9dHJ1ZTt0aGlzLmV4cGFuZCgpO3JldHVybiB0aGlzLl9wcm92aWRlcigpLnNvcnRBbmRSZXdpbmQodGhpcy5jb21wYXJhdG9yKCkpO30KX3BvcHVsYXRlQ2hpbGRyZW4oZnJvbVBvc2l0aW9uLHRvUG9zaXRpb24pe2xldCBhZnRlclBvcHVsYXRlO2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UocmVzb2x2ZT0+YWZ0ZXJQb3B1bGF0ZT1yZXNvbHZlKTtmcm9tUG9zaXRpb249ZnJvbVBvc2l0aW9ufHwwO3RvUG9zaXRpb249dG9Qb3NpdGlvbnx8ZnJvbVBvc2l0aW9uK3RoaXMuX2RhdGFHcmlkLmRlZmF1bHRQb3B1bGF0ZUNvdW50KCk7bGV0IGZpcnN0Tm90U2VyaWFsaXplZFBvc2l0aW9uPWZyb21Qb3NpdGlvbjtzZXJpYWxpemVOZXh0Q2h1bmsuY2FsbCh0aGlzKTtyZXR1cm4gcHJvbWlzZTtmdW5jdGlvbiBzZXJpYWxpemVOZXh0Q2h1bmsoKXtpZihmaXJzdE5vdFNlcmlhbGl6ZWRQb3NpdGlvbj49dG9Qb3NpdGlvbikKcmV0dXJuO2NvbnN0IGVuZD1NYXRoLm1pbihmaXJzdE5vdFNlcmlhbGl6ZWRQb3NpdGlvbit0aGlzLl9kYXRhR3JpZC5kZWZhdWx0UG9wdWxhdGVDb3VudCgpLHRvUG9zaXRpb24pO3RoaXMuX3Byb3ZpZGVyKCkuc2VyaWFsaXplSXRlbXNSYW5nZShmaXJzdE5vdFNlcmlhbGl6ZWRQb3NpdGlvbixlbmQpLnRoZW4oY2hpbGRyZW5SZXRyaWV2ZWQuYmluZCh0aGlzKSk7Zmlyc3ROb3RTZXJpYWxpemVkUG9zaXRpb249ZW5kO30KZnVuY3Rpb24gaW5zZXJ0UmV0cmlldmVkQ2hpbGQoaXRlbSxpbnNlcnRpb25JbmRleCl7aWYodGhpcy5fc2F2ZWRDaGlsZHJlbil7Y29uc3QgaGFzaD10aGlzLl9jaGlsZEhhc2hGb3JFbnRpdHkoaXRlbSk7aWYoaGFzaCBpbiB0aGlzLl9zYXZlZENoaWxkcmVuKXt0aGlzLl9kYXRhR3JpZC5pbnNlcnRDaGlsZCh0aGlzLHRoaXMuX3NhdmVkQ2hpbGRyZW5baGFzaF0saW5zZXJ0aW9uSW5kZXgpO3JldHVybjt9fQp0aGlzLl9kYXRhR3JpZC5pbnNlcnRDaGlsZCh0aGlzLHRoaXMuX2NyZWF0ZUNoaWxkTm9kZShpdGVtKSxpbnNlcnRpb25JbmRleCk7fQpmdW5jdGlvbiBpbnNlcnRTaG93TW9yZUJ1dHRvbihmcm9tLHRvLGluc2VydGlvbkluZGV4KXtjb25zdCBidXR0b249bmV3IERhdGFHcmlkLlNob3dNb3JlRGF0YUdyaWROb2RlKHRoaXMuX3BvcHVsYXRlQ2hpbGRyZW4uYmluZCh0aGlzKSxmcm9tLHRvLHRoaXMuX2RhdGFHcmlkLmRlZmF1bHRQb3B1bGF0ZUNvdW50KCkpO3RoaXMuX2RhdGFHcmlkLmluc2VydENoaWxkKHRoaXMsYnV0dG9uLGluc2VydGlvbkluZGV4KTt9CmZ1bmN0aW9uIGNoaWxkcmVuUmV0cmlldmVkKGl0ZW1zUmFuZ2Upe2xldCBpdGVtSW5kZXg9MDtsZXQgaXRlbVBvc2l0aW9uPWl0ZW1zUmFuZ2Uuc3RhcnRQb3NpdGlvbjtjb25zdCBpdGVtcz1pdGVtc1JhbmdlLml0ZW1zO2xldCBpbnNlcnRpb25JbmRleD0wO2lmKCF0aGlzLl9yZXRyaWV2ZWRDaGlsZHJlblJhbmdlcy5sZW5ndGgpe2lmKGl0ZW1zUmFuZ2Uuc3RhcnRQb3NpdGlvbj4wKXt0aGlzLl9yZXRyaWV2ZWRDaGlsZHJlblJhbmdlcy5wdXNoKHtmcm9tOjAsdG86MH0pO2luc2VydFNob3dNb3JlQnV0dG9uLmNhbGwodGhpcywwLGl0ZW1zUmFuZ2Uuc3RhcnRQb3NpdGlvbixpbnNlcnRpb25JbmRleCsrKTt9CnRoaXMuX3JldHJpZXZlZENoaWxkcmVuUmFuZ2VzLnB1c2goe2Zyb206aXRlbXNSYW5nZS5zdGFydFBvc2l0aW9uLHRvOml0ZW1zUmFuZ2UuZW5kUG9zaXRpb259KTtmb3IobGV0IGk9MCxsPWl0ZW1zLmxlbmd0aDtpPGw7KytpKQppbnNlcnRSZXRyaWV2ZWRDaGlsZC5jYWxsKHRoaXMsaXRlbXNbaV0saW5zZXJ0aW9uSW5kZXgrKyk7aWYoaXRlbXNSYW5nZS5lbmRQb3NpdGlvbjxpdGVtc1JhbmdlLnRvdGFsTGVuZ3RoKQppbnNlcnRTaG93TW9yZUJ1dHRvbi5jYWxsKHRoaXMsaXRlbXNSYW5nZS5lbmRQb3NpdGlvbixpdGVtc1JhbmdlLnRvdGFsTGVuZ3RoLGluc2VydGlvbkluZGV4KyspO31lbHNle2xldCByYW5nZUluZGV4PTA7bGV0IGZvdW5kPWZhbHNlO2xldCByYW5nZTt3aGlsZShyYW5nZUluZGV4PHRoaXMuX3JldHJpZXZlZENoaWxkcmVuUmFuZ2VzLmxlbmd0aCl7cmFuZ2U9dGhpcy5fcmV0cmlldmVkQ2hpbGRyZW5SYW5nZXNbcmFuZ2VJbmRleF07aWYocmFuZ2UudG8+PWl0ZW1Qb3NpdGlvbil7Zm91bmQ9dHJ1ZTticmVhazt9Cmluc2VydGlvbkluZGV4Kz1yYW5nZS50by1yYW5nZS5mcm9tO2lmKHJhbmdlLnRvPGl0ZW1zUmFuZ2UudG90YWxMZW5ndGgpCmluc2VydGlvbkluZGV4Kz0xOysrcmFuZ2VJbmRleDt9CmlmKCFmb3VuZHx8aXRlbXNSYW5nZS5zdGFydFBvc2l0aW9uPHJhbmdlLmZyb20pe3RoaXMuYWxsQ2hpbGRyZW4oKVtpbnNlcnRpb25JbmRleC0xXS5zZXRFbmRQb3NpdGlvbihpdGVtc1JhbmdlLnN0YXJ0UG9zaXRpb24pO2luc2VydFNob3dNb3JlQnV0dG9uLmNhbGwodGhpcyxpdGVtc1JhbmdlLnN0YXJ0UG9zaXRpb24sZm91bmQ/cmFuZ2UuZnJvbTppdGVtc1JhbmdlLnRvdGFsTGVuZ3RoLGluc2VydGlvbkluZGV4KTtyYW5nZT17ZnJvbTppdGVtc1JhbmdlLnN0YXJ0UG9zaXRpb24sdG86aXRlbXNSYW5nZS5zdGFydFBvc2l0aW9ufTtpZighZm91bmQpCnJhbmdlSW5kZXg9dGhpcy5fcmV0cmlldmVkQ2hpbGRyZW5SYW5nZXMubGVuZ3RoO3RoaXMuX3JldHJpZXZlZENoaWxkcmVuUmFuZ2VzLnNwbGljZShyYW5nZUluZGV4LDAscmFuZ2UpO31lbHNle2luc2VydGlvbkluZGV4Kz1pdGVtUG9zaXRpb24tcmFuZ2UuZnJvbTt9CndoaWxlKHJhbmdlLnRvPGl0ZW1zUmFuZ2UuZW5kUG9zaXRpb24pe2NvbnN0IHNraXBDb3VudD1yYW5nZS50by1pdGVtUG9zaXRpb247aW5zZXJ0aW9uSW5kZXgrPXNraXBDb3VudDtpdGVtSW5kZXgrPXNraXBDb3VudDtpdGVtUG9zaXRpb249cmFuZ2UudG87Y29uc3QgbmV4dFJhbmdlPXRoaXMuX3JldHJpZXZlZENoaWxkcmVuUmFuZ2VzW3JhbmdlSW5kZXgrMV07bGV0IG5ld0VuZE9mUmFuZ2U9bmV4dFJhbmdlP25leHRSYW5nZS5mcm9tOml0ZW1zUmFuZ2UudG90YWxMZW5ndGg7aWYobmV3RW5kT2ZSYW5nZT5pdGVtc1JhbmdlLmVuZFBvc2l0aW9uKQpuZXdFbmRPZlJhbmdlPWl0ZW1zUmFuZ2UuZW5kUG9zaXRpb247d2hpbGUoaXRlbVBvc2l0aW9uPG5ld0VuZE9mUmFuZ2Upe2luc2VydFJldHJpZXZlZENoaWxkLmNhbGwodGhpcyxpdGVtc1tpdGVtSW5kZXgrK10saW5zZXJ0aW9uSW5kZXgrKyk7KytpdGVtUG9zaXRpb247fQppZihuZXh0UmFuZ2UmJm5ld0VuZE9mUmFuZ2U9PT1uZXh0UmFuZ2UuZnJvbSl7cmFuZ2UudG89bmV4dFJhbmdlLnRvO3RoaXMucmVtb3ZlQ2hpbGRCeUluZGV4KGluc2VydGlvbkluZGV4KTt0aGlzLl9yZXRyaWV2ZWRDaGlsZHJlblJhbmdlcy5zcGxpY2UocmFuZ2VJbmRleCsxLDEpO31lbHNle3JhbmdlLnRvPW5ld0VuZE9mUmFuZ2U7aWYobmV3RW5kT2ZSYW5nZT09PWl0ZW1zUmFuZ2UudG90YWxMZW5ndGgpCnRoaXMucmVtb3ZlQ2hpbGRCeUluZGV4KGluc2VydGlvbkluZGV4KTtlbHNlCnRoaXMuYWxsQ2hpbGRyZW4oKVtpbnNlcnRpb25JbmRleF0uc2V0U3RhcnRQb3NpdGlvbihpdGVtc1JhbmdlLmVuZFBvc2l0aW9uKTt9fX0KdGhpcy5faW5zdGFuY2VDb3VudCs9aXRlbXMubGVuZ3RoO2lmKGZpcnN0Tm90U2VyaWFsaXplZFBvc2l0aW9uPHRvUG9zaXRpb24pe3NlcmlhbGl6ZU5leHRDaHVuay5jYWxsKHRoaXMpO3JldHVybjt9CmlmKHRoaXMuZXhwYW5kZWQpCnRoaXMuX2RhdGFHcmlkLnVwZGF0ZVZpc2libGVOb2Rlcyh0cnVlKTthZnRlclBvcHVsYXRlKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGUuRXZlbnRzLlBvcHVsYXRlQ29tcGxldGUpO319Cl9zYXZlQ2hpbGRyZW4oKXt0aGlzLl9zYXZlZENoaWxkcmVuPW51bGw7Y29uc3QgY2hpbGRyZW49dGhpcy5hbGxDaGlsZHJlbigpO2ZvcihsZXQgaT0wLGw9Y2hpbGRyZW4ubGVuZ3RoO2k8bDsrK2kpe2NvbnN0IGNoaWxkPWNoaWxkcmVuW2ldO2lmKCFjaGlsZC5leHBhbmRlZCkKY29udGludWU7aWYoIXRoaXMuX3NhdmVkQ2hpbGRyZW4pCnRoaXMuX3NhdmVkQ2hpbGRyZW49e307dGhpcy5fc2F2ZWRDaGlsZHJlblt0aGlzLl9jaGlsZEhhc2hGb3JOb2RlKGNoaWxkKV09Y2hpbGQ7fX0KYXN5bmMgc29ydCgpe3RoaXMuX2RhdGFHcmlkLnJlY3Vyc2l2ZVNvcnRpbmdFbnRlcigpO2F3YWl0IHRoaXMuX3Byb3ZpZGVyKCkuc29ydEFuZFJld2luZCh0aGlzLmNvbXBhcmF0b3IoKSk7dGhpcy5fc2F2ZUNoaWxkcmVuKCk7dGhpcy5fZGF0YUdyaWQucmVtb3ZlQWxsQ2hpbGRyZW4odGhpcyk7dGhpcy5fcmV0cmlldmVkQ2hpbGRyZW5SYW5nZXM9W107Y29uc3QgaW5zdGFuY2VDb3VudD10aGlzLl9pbnN0YW5jZUNvdW50O3RoaXMuX2luc3RhbmNlQ291bnQ9MDthd2FpdCB0aGlzLl9wb3B1bGF0ZUNoaWxkcmVuKDAsaW5zdGFuY2VDb3VudCk7Zm9yKGNvbnN0IGNoaWxkIG9mIHRoaXMuYWxsQ2hpbGRyZW4oKSl7aWYoY2hpbGQuZXhwYW5kZWQpCmNoaWxkLnNvcnQoKTt9CnRoaXMuX2RhdGFHcmlkLnJlY3Vyc2l2ZVNvcnRpbmdMZWF2ZSgpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdEdyaWROb2RlLkV2ZW50cz17UG9wdWxhdGVDb21wbGV0ZTpTeW1ib2woJ1BvcHVsYXRlQ29tcGxldGUnKX07UHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGUuQ2hpbGRyZW5Qcm92aWRlcj1mdW5jdGlvbigpe307UHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGUuQ2hpbGRyZW5Qcm92aWRlci5wcm90b3R5cGU9e2Rpc3Bvc2UoKXt9LG5vZGVQb3NpdGlvbihzbmFwc2hvdE9iamVjdElkKXt9LGlzRW1wdHkoKXt9LHNlcmlhbGl6ZUl0ZW1zUmFuZ2Uoc3RhcnRQb3NpdGlvbixlbmRQb3NpdGlvbil7fSxzb3J0QW5kUmV3aW5kKGNvbXBhcmF0b3Ipe319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdEdlbmVyaWNPYmplY3ROb2RlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGV7Y29uc3RydWN0b3IoZGF0YUdyaWQsbm9kZSl7c3VwZXIoZGF0YUdyaWQsZmFsc2UpO2lmKCFub2RlKQpyZXR1cm47dGhpcy5fbmFtZT1ub2RlLm5hbWU7dGhpcy5fdHlwZT1ub2RlLnR5cGU7dGhpcy5fZGlzdGFuY2U9bm9kZS5kaXN0YW5jZTt0aGlzLl9zaGFsbG93U2l6ZT1ub2RlLnNlbGZTaXplO3RoaXMuX3JldGFpbmVkU2l6ZT1ub2RlLnJldGFpbmVkU2l6ZTt0aGlzLnNuYXBzaG90Tm9kZUlkPW5vZGUuaWQ7dGhpcy5zbmFwc2hvdE5vZGVJbmRleD1ub2RlLm5vZGVJbmRleDtpZih0aGlzLl90eXBlPT09J3N0cmluZycpe3RoaXMuX3JlYWNoYWJsZUZyb21XaW5kb3c9dHJ1ZTt9ZWxzZSBpZih0aGlzLl90eXBlPT09J29iamVjdCcmJnRoaXMuX25hbWUuc3RhcnRzV2l0aCgnV2luZG93Jykpe3RoaXMuX25hbWU9dGhpcy5zaG9ydGVuV2luZG93VVJMKHRoaXMuX25hbWUsZmFsc2UpO3RoaXMuX3JlYWNoYWJsZUZyb21XaW5kb3c9dHJ1ZTt9ZWxzZSBpZihub2RlLmNhbkJlUXVlcmllZCl7dGhpcy5fcmVhY2hhYmxlRnJvbVdpbmRvdz10cnVlO30KaWYobm9kZS5kZXRhY2hlZERPTVRyZWVOb2RlKQp0aGlzLmRldGFjaGVkRE9NVHJlZU5vZGU9dHJ1ZTtjb25zdCBzbmFwc2hvdD1kYXRhR3JpZC5zbmFwc2hvdDtjb25zdCBzaGFsbG93U2l6ZVBlcmNlbnQ9dGhpcy5fc2hhbGxvd1NpemUvc25hcHNob3QudG90YWxTaXplKjEwMC4wO2NvbnN0IHJldGFpbmVkU2l6ZVBlcmNlbnQ9dGhpcy5fcmV0YWluZWRTaXplL3NuYXBzaG90LnRvdGFsU2l6ZSoxMDAuMDt0aGlzLmRhdGE9eydkaXN0YW5jZSc6dGhpcy5fdG9VSURpc3RhbmNlKHRoaXMuX2Rpc3RhbmNlKSwnc2hhbGxvd1NpemUnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX3NoYWxsb3dTaXplKSwncmV0YWluZWRTaXplJzpOdW1iZXIud2l0aFRob3VzYW5kc1NlcGFyYXRvcih0aGlzLl9yZXRhaW5lZFNpemUpLCdzaGFsbG93U2l6ZS1wZXJjZW50Jzp0aGlzLl90b1BlcmNlbnRTdHJpbmcoc2hhbGxvd1NpemVQZXJjZW50KSwncmV0YWluZWRTaXplLXBlcmNlbnQnOnRoaXMuX3RvUGVyY2VudFN0cmluZyhyZXRhaW5lZFNpemVQZXJjZW50KX07fQpyZXRhaW5lcnNEYXRhU291cmNlKCl7cmV0dXJue3NuYXBzaG90OnRoaXMuX2RhdGFHcmlkLnNuYXBzaG90LHNuYXBzaG90Tm9kZUluZGV4OnRoaXMuc25hcHNob3ROb2RlSW5kZXh9O30KY3JlYXRlQ2VsbChjb2x1bW5JZCl7Y29uc3QgY2VsbD1jb2x1bW5JZCE9PSdvYmplY3QnP3RoaXMuX2NyZWF0ZVZhbHVlQ2VsbChjb2x1bW5JZCk6dGhpcy5fY3JlYXRlT2JqZWN0Q2VsbCgpO2lmKHRoaXMuX3NlYXJjaE1hdGNoZWQpCmNlbGwuY2xhc3NMaXN0LmFkZCgnaGlnaGxpZ2h0Jyk7cmV0dXJuIGNlbGw7fQpfY3JlYXRlT2JqZWN0Q2VsbCgpe2xldCB2YWx1ZT10aGlzLl9uYW1lO2xldCB2YWx1ZVN0eWxlPSdvYmplY3QnO3N3aXRjaCh0aGlzLl90eXBlKXtjYXNlJ2NvbmNhdGVuYXRlZCBzdHJpbmcnOmNhc2Unc3RyaW5nJzp2YWx1ZT1gIiR7dmFsdWV9ImA7dmFsdWVTdHlsZT0nc3RyaW5nJzticmVhaztjYXNlJ3JlZ2V4cCc6dmFsdWU9YC8ke3ZhbHVlfS9gO3ZhbHVlU3R5bGU9J3N0cmluZyc7YnJlYWs7Y2FzZSdjbG9zdXJlJzp2YWx1ZT1gJHt2YWx1ZX0oKWA7dmFsdWVTdHlsZT0nZnVuY3Rpb24nO2JyZWFrO2Nhc2UnYmlnaW50Jzp2YWx1ZVN0eWxlPSdiaWdpbnQnO2JyZWFrO2Nhc2UnbnVtYmVyJzp2YWx1ZVN0eWxlPSdudW1iZXInO2JyZWFrO2Nhc2UnaGlkZGVuJzp2YWx1ZVN0eWxlPSdudWxsJzticmVhaztjYXNlJ2FycmF5Jzp2YWx1ZT0odmFsdWV8fGxzYChpbnRlcm5hbCBhcnJheSlgKSsnW10nO2JyZWFrO30KcmV0dXJuIHRoaXMuX2NyZWF0ZU9iamVjdENlbGxXaXRoVmFsdWUodmFsdWVTdHlsZSx2YWx1ZSk7fQpfY3JlYXRlT2JqZWN0Q2VsbFdpdGhWYWx1ZSh2YWx1ZVN0eWxlLHZhbHVlKXtjb25zdCBmcmFnbWVudD1VSS5GcmFnbWVudC5idWlsZGAKICAgICAgICA8dGQgY2xhc3M9Im9iamVjdC1jb2x1bW4gZGlzY2xvc3VyZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2UtY29kZSBldmVudC1wcm9wZXJ0aWVzIiBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGUiICQ9ImNvbnRhaW5lciI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ2YWx1ZSBvYmplY3QtdmFsdWUtJHt2YWx1ZVN0eWxlfSI+JHt2YWx1ZX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJvYmplY3QtdmFsdWUtaWQiPkAke3RoaXMuc25hcHNob3ROb2RlSWR9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD5gO2NvbnN0IGRpdj1mcmFnbWVudC4kKCdjb250YWluZXInKTt0aGlzLl9wcmVmaXhPYmplY3RDZWxsKGRpdik7aWYodGhpcy5fcmVhY2hhYmxlRnJvbVdpbmRvdyl7ZGl2LmFwcGVuZENoaWxkKFVJLmh0bWxgPHNwYW4gY2xhc3M9ImhlYXAtb2JqZWN0LXRhZyIgdGl0bGU9IiR7bHNgVXNlciBvYmplY3QgcmVhY2hhYmxlIGZyb20gd2luZG93YH0iPvCfl5Y8L3NwYW4+YCk7fQppZih0aGlzLmRldGFjaGVkRE9NVHJlZU5vZGUpCmRpdi5hcHBlbmRDaGlsZChVSS5odG1sYDxzcGFuIGNsYXNzPSJoZWFwLW9iamVjdC10YWciIHRpdGxlPSIke2xzYERldGFjaGVkIGZyb20gRE9NIHRyZWVgfSI+4pyAPC9zcGFuPmApO3RoaXMuX2FwcGVuZFNvdXJjZUxvY2F0aW9uKGRpdik7Y29uc3QgY2VsbD1mcmFnbWVudC5lbGVtZW50KCk7aWYodGhpcy5kZXB0aCkKY2VsbC5zdHlsZS5zZXRQcm9wZXJ0eSgncGFkZGluZy1sZWZ0JywodGhpcy5kZXB0aCp0aGlzLmRhdGFHcmlkLmluZGVudFdpZHRoKSsncHgnKTtjZWxsLmhlYXBTbmFwc2hvdE5vZGU9dGhpcztyZXR1cm4gY2VsbDt9Cl9wcmVmaXhPYmplY3RDZWxsKGRpdil7fQphc3luYyBfYXBwZW5kU291cmNlTG9jYXRpb24oZGl2KXtpZih0aGlzLl90eXBlIT09J2Nsb3N1cmUnKQpyZXR1cm47Y29uc3QgbGlua0NvbnRhaW5lcj1VSS5odG1sYDxzcGFuIGNsYXNzPSJoZWFwLW9iamVjdC1zb3VyY2UtbGluayIgLz5gO2Rpdi5hcHBlbmRDaGlsZChsaW5rQ29udGFpbmVyKTtjb25zdCBsaW5rPWF3YWl0IHRoaXMuX2RhdGFHcmlkLmRhdGFEaXNwbGF5RGVsZWdhdGUoKS5saW5raWZ5T2JqZWN0KFN0cmluZyh0aGlzLnNuYXBzaG90Tm9kZUlkKSk7aWYobGluaykKbGlua0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKTtlbHNlCmxpbmtDb250YWluZXIucmVtb3ZlKCk7fQphc3luYyBxdWVyeU9iamVjdENvbnRlbnQoaGVhcFByb2ZpbGVyTW9kZWwsb2JqZWN0R3JvdXBOYW1lKXtjb25zdCBydW50aW1lTW9kZWw9aGVhcFByb2ZpbGVyTW9kZWwucnVudGltZU1vZGVsKCk7bGV0IHJlc3VsdDtpZih0aGlzLl90eXBlPT09J3N0cmluZycpCnJlc3VsdD1ydW50aW1lTW9kZWwuY3JlYXRlUmVtb3RlT2JqZWN0RnJvbVByaW1pdGl2ZVZhbHVlKHRoaXMuX25hbWUpO2Vsc2UKcmVzdWx0PWF3YWl0IGhlYXBQcm9maWxlck1vZGVsLm9iamVjdEZvclNuYXBzaG90T2JqZWN0SWQoU3RyaW5nKHRoaXMuc25hcHNob3ROb2RlSWQpLG9iamVjdEdyb3VwTmFtZSk7cmV0dXJuIHJlc3VsdHx8cnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdEZyb21QcmltaXRpdmVWYWx1ZShsc2BQcmV2aWV3IGlzIG5vdCBhdmFpbGFibGVgKTt9CmFzeW5jIHVwZGF0ZUhhc0NoaWxkcmVuKCl7Y29uc3QgaXNFbXB0eT1hd2FpdCB0aGlzLl9wcm92aWRlcigpLmlzRW1wdHkoKTt0aGlzLnNldEhhc0NoaWxkcmVuKCFpc0VtcHR5KTt9CnNob3J0ZW5XaW5kb3dVUkwoZnVsbE5hbWUsaGFzT2JqZWN0SWQpe2NvbnN0IHN0YXJ0UG9zPWZ1bGxOYW1lLmluZGV4T2YoJy8nKTtjb25zdCBlbmRQb3M9aGFzT2JqZWN0SWQ/ZnVsbE5hbWUuaW5kZXhPZignQCcpOmZ1bGxOYW1lLmxlbmd0aDtpZihzdGFydFBvcz09PS0xfHxlbmRQb3M9PT0tMSkKcmV0dXJuIGZ1bGxOYW1lO2NvbnN0IGZ1bGxVUkw9ZnVsbE5hbWUuc3Vic3RyaW5nKHN0YXJ0UG9zKzEsZW5kUG9zKS50cmltTGVmdCgpO2xldCB1cmw9ZnVsbFVSTC50cmltVVJMKCk7aWYodXJsLmxlbmd0aD40MCkKdXJsPXVybC50cmltTWlkZGxlKDQwKTtyZXR1cm4gZnVsbE5hbWUuc3Vic3RyKDAsc3RhcnRQb3MrMikrdXJsK2Z1bGxOYW1lLnN1YnN0cihlbmRQb3MpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdE9iamVjdE5vZGU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RHZW5lcmljT2JqZWN0Tm9kZXtjb25zdHJ1Y3RvcihkYXRhR3JpZCxzbmFwc2hvdCxlZGdlLHBhcmVudE9iamVjdE5vZGUpe3N1cGVyKGRhdGFHcmlkLGVkZ2Uubm9kZSk7dGhpcy5fcmVmZXJlbmNlTmFtZT1lZGdlLm5hbWU7dGhpcy5fcmVmZXJlbmNlVHlwZT1lZGdlLnR5cGU7dGhpcy5fZWRnZUluZGV4PWVkZ2UuZWRnZUluZGV4O3RoaXMuX3NuYXBzaG90PXNuYXBzaG90O3RoaXMuX3BhcmVudE9iamVjdE5vZGU9cGFyZW50T2JqZWN0Tm9kZTt0aGlzLl9jeWNsZWRXaXRoQW5jZXN0b3JHcmlkTm9kZT10aGlzLl9maW5kQW5jZXN0b3JXaXRoU2FtZVNuYXBzaG90Tm9kZUlkKCk7aWYoIXRoaXMuX2N5Y2xlZFdpdGhBbmNlc3RvckdyaWROb2RlKQp0aGlzLnVwZGF0ZUhhc0NoaWxkcmVuKCk7Y29uc3QgZGF0YT10aGlzLmRhdGE7ZGF0YVsnY291bnQnXT0nJztkYXRhWydhZGRlZENvdW50J109Jyc7ZGF0YVsncmVtb3ZlZENvdW50J109Jyc7ZGF0YVsnY291bnREZWx0YSddPScnO2RhdGFbJ2FkZGVkU2l6ZSddPScnO2RhdGFbJ3JlbW92ZWRTaXplJ109Jyc7ZGF0YVsnc2l6ZURlbHRhJ109Jyc7fQpyZXRhaW5lcnNEYXRhU291cmNlKCl7cmV0dXJue3NuYXBzaG90OnRoaXMuX3NuYXBzaG90LHNuYXBzaG90Tm9kZUluZGV4OnRoaXMuc25hcHNob3ROb2RlSW5kZXh9O30KY3JlYXRlUHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fc25hcHNob3QuY3JlYXRlRWRnZXNQcm92aWRlcih0aGlzLnNuYXBzaG90Tm9kZUluZGV4KTt9Cl9maW5kQW5jZXN0b3JXaXRoU2FtZVNuYXBzaG90Tm9kZUlkKCl7bGV0IGFuY2VzdG9yPXRoaXMuX3BhcmVudE9iamVjdE5vZGU7d2hpbGUoYW5jZXN0b3Ipe2lmKGFuY2VzdG9yLnNuYXBzaG90Tm9kZUlkPT09dGhpcy5zbmFwc2hvdE5vZGVJZCkKcmV0dXJuIGFuY2VzdG9yO2FuY2VzdG9yPWFuY2VzdG9yLl9wYXJlbnRPYmplY3ROb2RlO30KcmV0dXJuIG51bGw7fQpfY3JlYXRlQ2hpbGROb2RlKGl0ZW0pe3JldHVybiBuZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90T2JqZWN0Tm9kZSh0aGlzLl9kYXRhR3JpZCx0aGlzLl9zbmFwc2hvdCxpdGVtLHRoaXMpO30KX2NoaWxkSGFzaEZvckVudGl0eShlZGdlKXtyZXR1cm4gZWRnZS5lZGdlSW5kZXg7fQpfY2hpbGRIYXNoRm9yTm9kZShjaGlsZE5vZGUpe3JldHVybiBjaGlsZE5vZGUuX2VkZ2VJbmRleDt9CmNvbXBhcmF0b3IoKXtjb25zdCBzb3J0QXNjZW5kaW5nPXRoaXMuX2RhdGFHcmlkLmlzU29ydE9yZGVyQXNjZW5kaW5nKCk7Y29uc3Qgc29ydENvbHVtbklkPXRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2NvbnN0IHNvcnRGaWVsZHM9e29iamVjdDpbJyFlZGdlTmFtZScsc29ydEFzY2VuZGluZywncmV0YWluZWRTaXplJyxmYWxzZV0sY291bnQ6WychZWRnZU5hbWUnLHRydWUsJ3JldGFpbmVkU2l6ZScsZmFsc2VdLHNoYWxsb3dTaXplOlsnc2VsZlNpemUnLHNvcnRBc2NlbmRpbmcsJyFlZGdlTmFtZScsdHJ1ZV0scmV0YWluZWRTaXplOlsncmV0YWluZWRTaXplJyxzb3J0QXNjZW5kaW5nLCchZWRnZU5hbWUnLHRydWVdLGRpc3RhbmNlOlsnZGlzdGFuY2UnLHNvcnRBc2NlbmRpbmcsJ19uYW1lJyx0cnVlXX1bc29ydENvbHVtbklkXXx8WychZWRnZU5hbWUnLHRydWUsJ3JldGFpbmVkU2l6ZScsZmFsc2VdO3JldHVybiBQcm9maWxlci5IZWFwU25hcHNob3RHcmlkTm9kZS5jcmVhdGVDb21wYXJhdG9yKHNvcnRGaWVsZHMpO30KX3ByZWZpeE9iamVjdENlbGwoZGl2KXtsZXQgbmFtZT10aGlzLl9yZWZlcmVuY2VOYW1lfHwnKGVtcHR5KSc7bGV0IG5hbWVDbGFzcz0nbmFtZSc7c3dpdGNoKHRoaXMuX3JlZmVyZW5jZVR5cGUpe2Nhc2UnY29udGV4dCc6bmFtZUNsYXNzPSdvYmplY3QtdmFsdWUtbnVtYmVyJzticmVhaztjYXNlJ2ludGVybmFsJzpjYXNlJ2hpZGRlbic6Y2FzZSd3ZWFrJzpuYW1lQ2xhc3M9J29iamVjdC12YWx1ZS1udWxsJzticmVhaztjYXNlJ2VsZW1lbnQnOm5hbWU9YFske25hbWV9XWA7YnJlYWs7fQppZih0aGlzLl9jeWNsZWRXaXRoQW5jZXN0b3JHcmlkTm9kZSkKZGl2LmNsYXNzTGlzdC5hZGQoJ2N5Y2xlZC1hbmNlc3Nvci1ub2RlJyk7ZGl2LnByZXBlbmQoVUkuaHRtbGA8c3BhbiBjbGFzcz0iJHtuYW1lQ2xhc3N9Ij4ke25hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZ3JheWVkIj4ke3RoaXMuX2VkZ2VOb2RlU2VwYXJhdG9yKCl9PC9zcGFuPmApO30KX2VkZ2VOb2RlU2VwYXJhdG9yKCl7cmV0dXJuJzo6Jzt9fTtQcm9maWxlci5IZWFwU25hcHNob3RSZXRhaW5pbmdPYmplY3ROb2RlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90T2JqZWN0Tm9kZXtjb25zdHJ1Y3RvcihkYXRhR3JpZCxzbmFwc2hvdCxlZGdlLHBhcmVudFJldGFpbmluZ09iamVjdE5vZGUpe3N1cGVyKGRhdGFHcmlkLHNuYXBzaG90LGVkZ2UscGFyZW50UmV0YWluaW5nT2JqZWN0Tm9kZSk7fQpjcmVhdGVQcm92aWRlcigpe3JldHVybiB0aGlzLl9zbmFwc2hvdC5jcmVhdGVSZXRhaW5pbmdFZGdlc1Byb3ZpZGVyKHRoaXMuc25hcHNob3ROb2RlSW5kZXgpO30KX2NyZWF0ZUNoaWxkTm9kZShpdGVtKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFJldGFpbmluZ09iamVjdE5vZGUodGhpcy5fZGF0YUdyaWQsdGhpcy5fc25hcHNob3QsaXRlbSx0aGlzKTt9Cl9lZGdlTm9kZVNlcGFyYXRvcigpe3JldHVybiBsc2BpbmA7fQpleHBhbmQoKXt0aGlzLl9leHBhbmRSZXRhaW5lcnNDaGFpbigyMCk7fQpfZXhwYW5kUmV0YWluZXJzQ2hhaW4obWF4RXhwYW5kTGV2ZWxzKXtpZighdGhpcy5fcG9wdWxhdGVkKXt0aGlzLm9uY2UoUHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGUuRXZlbnRzLlBvcHVsYXRlQ29tcGxldGUpLnRoZW4oKCk9PnRoaXMuX2V4cGFuZFJldGFpbmVyc0NoYWluKG1heEV4cGFuZExldmVscykpO3RoaXMucG9wdWxhdGUoKTtyZXR1cm47fQpzdXBlci5leHBhbmQoKTtpZigtLW1heEV4cGFuZExldmVscz4wJiZ0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtjb25zdCByZXRhaW5lcj10aGlzLmNoaWxkcmVuWzBdO2lmKHJldGFpbmVyLl9kaXN0YW5jZT4xKXtyZXRhaW5lci5fZXhwYW5kUmV0YWluZXJzQ2hhaW4obWF4RXhwYW5kTGV2ZWxzKTtyZXR1cm47fX0KdGhpcy5fZGF0YUdyaWQuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFJldGFpbm1lbnREYXRhR3JpZC5FdmVudHMuRXhwYW5kUmV0YWluZXJzQ29tcGxldGUpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdEluc3RhbmNlTm9kZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdEdlbmVyaWNPYmplY3ROb2Rle2NvbnN0cnVjdG9yKGRhdGFHcmlkLHNuYXBzaG90LG5vZGUsaXNEZWxldGVkTm9kZSl7c3VwZXIoZGF0YUdyaWQsbm9kZSk7dGhpcy5fYmFzZVNuYXBzaG90T3JTbmFwc2hvdD1zbmFwc2hvdDt0aGlzLl9pc0RlbGV0ZWROb2RlPWlzRGVsZXRlZE5vZGU7dGhpcy51cGRhdGVIYXNDaGlsZHJlbigpO2NvbnN0IGRhdGE9dGhpcy5kYXRhO2RhdGFbJ2NvdW50J109Jyc7ZGF0YVsnY291bnREZWx0YSddPScnO2RhdGFbJ3NpemVEZWx0YSddPScnO2lmKHRoaXMuX2lzRGVsZXRlZE5vZGUpe2RhdGFbJ2FkZGVkQ291bnQnXT0nJztkYXRhWydhZGRlZFNpemUnXT0nJztkYXRhWydyZW1vdmVkQ291bnQnXT0nXHUyMDIyJztkYXRhWydyZW1vdmVkU2l6ZSddPU51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX3NoYWxsb3dTaXplKTt9ZWxzZXtkYXRhWydhZGRlZENvdW50J109J1x1MjAyMic7ZGF0YVsnYWRkZWRTaXplJ109TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodGhpcy5fc2hhbGxvd1NpemUpO2RhdGFbJ3JlbW92ZWRDb3VudCddPScnO2RhdGFbJ3JlbW92ZWRTaXplJ109Jyc7fX0KcmV0YWluZXJzRGF0YVNvdXJjZSgpe3JldHVybntzbmFwc2hvdDp0aGlzLl9iYXNlU25hcHNob3RPclNuYXBzaG90LHNuYXBzaG90Tm9kZUluZGV4OnRoaXMuc25hcHNob3ROb2RlSW5kZXh9O30KY3JlYXRlUHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fYmFzZVNuYXBzaG90T3JTbmFwc2hvdC5jcmVhdGVFZGdlc1Byb3ZpZGVyKHRoaXMuc25hcHNob3ROb2RlSW5kZXgpO30KX2NyZWF0ZUNoaWxkTm9kZShpdGVtKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdE9iamVjdE5vZGUodGhpcy5fZGF0YUdyaWQsdGhpcy5fYmFzZVNuYXBzaG90T3JTbmFwc2hvdCxpdGVtLG51bGwpO30KX2NoaWxkSGFzaEZvckVudGl0eShlZGdlKXtyZXR1cm4gZWRnZS5lZGdlSW5kZXg7fQpfY2hpbGRIYXNoRm9yTm9kZShjaGlsZE5vZGUpe3JldHVybiBjaGlsZE5vZGUuX2VkZ2VJbmRleDt9CmNvbXBhcmF0b3IoKXtjb25zdCBzb3J0QXNjZW5kaW5nPXRoaXMuX2RhdGFHcmlkLmlzU29ydE9yZGVyQXNjZW5kaW5nKCk7Y29uc3Qgc29ydENvbHVtbklkPXRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2NvbnN0IHNvcnRGaWVsZHM9e29iamVjdDpbJyFlZGdlTmFtZScsc29ydEFzY2VuZGluZywncmV0YWluZWRTaXplJyxmYWxzZV0sZGlzdGFuY2U6WydkaXN0YW5jZScsc29ydEFzY2VuZGluZywncmV0YWluZWRTaXplJyxmYWxzZV0sY291bnQ6WychZWRnZU5hbWUnLHRydWUsJ3JldGFpbmVkU2l6ZScsZmFsc2VdLGFkZGVkU2l6ZTpbJ3NlbGZTaXplJyxzb3J0QXNjZW5kaW5nLCchZWRnZU5hbWUnLHRydWVdLHJlbW92ZWRTaXplOlsnc2VsZlNpemUnLHNvcnRBc2NlbmRpbmcsJyFlZGdlTmFtZScsdHJ1ZV0sc2hhbGxvd1NpemU6WydzZWxmU2l6ZScsc29ydEFzY2VuZGluZywnIWVkZ2VOYW1lJyx0cnVlXSxyZXRhaW5lZFNpemU6WydyZXRhaW5lZFNpemUnLHNvcnRBc2NlbmRpbmcsJyFlZGdlTmFtZScsdHJ1ZV19W3NvcnRDb2x1bW5JZF18fFsnIWVkZ2VOYW1lJyx0cnVlLCdyZXRhaW5lZFNpemUnLGZhbHNlXTtyZXR1cm4gUHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGUuY3JlYXRlQ29tcGFyYXRvcihzb3J0RmllbGRzKTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RDb25zdHJ1Y3Rvck5vZGU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RHcmlkTm9kZXtjb25zdHJ1Y3RvcihkYXRhR3JpZCxjbGFzc05hbWUsYWdncmVnYXRlLG5vZGVGaWx0ZXIpe3N1cGVyKGRhdGFHcmlkLGFnZ3JlZ2F0ZS5jb3VudD4wKTt0aGlzLl9uYW1lPWNsYXNzTmFtZTt0aGlzLl9ub2RlRmlsdGVyPW5vZGVGaWx0ZXI7dGhpcy5fZGlzdGFuY2U9YWdncmVnYXRlLmRpc3RhbmNlO3RoaXMuX2NvdW50PWFnZ3JlZ2F0ZS5jb3VudDt0aGlzLl9zaGFsbG93U2l6ZT1hZ2dyZWdhdGUuc2VsZjt0aGlzLl9yZXRhaW5lZFNpemU9YWdncmVnYXRlLm1heFJldDtjb25zdCBzbmFwc2hvdD1kYXRhR3JpZC5zbmFwc2hvdDtjb25zdCByZXRhaW5lZFNpemVQZXJjZW50PXRoaXMuX3JldGFpbmVkU2l6ZS9zbmFwc2hvdC50b3RhbFNpemUqMTAwLjA7Y29uc3Qgc2hhbGxvd1NpemVQZXJjZW50PXRoaXMuX3NoYWxsb3dTaXplL3NuYXBzaG90LnRvdGFsU2l6ZSoxMDAuMDt0aGlzLmRhdGE9eydvYmplY3QnOmNsYXNzTmFtZSwnY291bnQnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX2NvdW50KSwnZGlzdGFuY2UnOnRoaXMuX3RvVUlEaXN0YW5jZSh0aGlzLl9kaXN0YW5jZSksJ3NoYWxsb3dTaXplJzpOdW1iZXIud2l0aFRob3VzYW5kc1NlcGFyYXRvcih0aGlzLl9zaGFsbG93U2l6ZSksJ3JldGFpbmVkU2l6ZSc6TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodGhpcy5fcmV0YWluZWRTaXplKSwnc2hhbGxvd1NpemUtcGVyY2VudCc6dGhpcy5fdG9QZXJjZW50U3RyaW5nKHNoYWxsb3dTaXplUGVyY2VudCksJ3JldGFpbmVkU2l6ZS1wZXJjZW50Jzp0aGlzLl90b1BlcmNlbnRTdHJpbmcocmV0YWluZWRTaXplUGVyY2VudCl9O30KY3JlYXRlUHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fZGF0YUdyaWQuc25hcHNob3QuY3JlYXRlTm9kZXNQcm92aWRlckZvckNsYXNzKHRoaXMuX25hbWUsdGhpcy5fbm9kZUZpbHRlcik7fQphc3luYyBwb3B1bGF0ZU5vZGVCeVNuYXBzaG90T2JqZWN0SWQoc25hcHNob3RPYmplY3RJZCl7dGhpcy5fZGF0YUdyaWQucmVzZXROYW1lRmlsdGVyKCk7YXdhaXQgdGhpcy5leHBhbmRXaXRob3V0UG9wdWxhdGUoKTtjb25zdCBub2RlUG9zaXRpb249YXdhaXQgdGhpcy5fcHJvdmlkZXIoKS5ub2RlUG9zaXRpb24oc25hcHNob3RPYmplY3RJZCk7aWYobm9kZVBvc2l0aW9uPT09LTEpe3RoaXMuY29sbGFwc2UoKTtyZXR1cm5bXTt9CmF3YWl0IHRoaXMuX3BvcHVsYXRlQ2hpbGRyZW4obm9kZVBvc2l0aW9uLG51bGwpO2NvbnN0IG5vZGU9KHRoaXMuY2hpbGRGb3JQb3NpdGlvbihub2RlUG9zaXRpb24pKTtyZXR1cm4gbm9kZT9bdGhpcyxub2RlXTpbXTt9CmZpbHRlcmVkT3V0KGZpbHRlclZhbHVlKXtyZXR1cm4gdGhpcy5fbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyVmFsdWUpPT09LTE7fQpjcmVhdGVDZWxsKGNvbHVtbklkKXtjb25zdCBjZWxsPWNvbHVtbklkPT09J29iamVjdCc/c3VwZXIuY3JlYXRlQ2VsbChjb2x1bW5JZCk6dGhpcy5fY3JlYXRlVmFsdWVDZWxsKGNvbHVtbklkKTtpZihjb2x1bW5JZD09PSdvYmplY3QnJiZ0aGlzLl9jb3VudD4xKQpjZWxsLmFwcGVuZENoaWxkKFVJLmh0bWxgPHNwYW4gY2xhc3M9Im9iamVjdHMtY291bnQiPsOXJHt0aGlzLl9jb3VudH08L3NwYW4+YCk7aWYodGhpcy5fc2VhcmNoTWF0Y2hlZCkKY2VsbC5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQnKTtyZXR1cm4gY2VsbDt9Cl9jcmVhdGVDaGlsZE5vZGUoaXRlbSl7cmV0dXJuIG5ldyBQcm9maWxlci5IZWFwU25hcHNob3RJbnN0YW5jZU5vZGUodGhpcy5fZGF0YUdyaWQsdGhpcy5fZGF0YUdyaWQuc25hcHNob3QsaXRlbSxmYWxzZSk7fQpjb21wYXJhdG9yKCl7Y29uc3Qgc29ydEFzY2VuZGluZz10aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpO2NvbnN0IHNvcnRDb2x1bW5JZD10aGlzLl9kYXRhR3JpZC5zb3J0Q29sdW1uSWQoKTtjb25zdCBzb3J0RmllbGRzPXtvYmplY3Q6WyduYW1lJyxzb3J0QXNjZW5kaW5nLCdpZCcsdHJ1ZV0sZGlzdGFuY2U6WydkaXN0YW5jZScsc29ydEFzY2VuZGluZywncmV0YWluZWRTaXplJyxmYWxzZV0sc2hhbGxvd1NpemU6WydzZWxmU2l6ZScsc29ydEFzY2VuZGluZywnaWQnLHRydWVdLHJldGFpbmVkU2l6ZTpbJ3JldGFpbmVkU2l6ZScsc29ydEFzY2VuZGluZywnaWQnLHRydWVdfVtzb3J0Q29sdW1uSWRdO3JldHVybiBQcm9maWxlci5IZWFwU25hcHNob3RHcmlkTm9kZS5jcmVhdGVDb21wYXJhdG9yKHNvcnRGaWVsZHMpO30KX2NoaWxkSGFzaEZvckVudGl0eShub2RlKXtyZXR1cm4gbm9kZS5pZDt9Cl9jaGlsZEhhc2hGb3JOb2RlKGNoaWxkTm9kZSl7cmV0dXJuIGNoaWxkTm9kZS5zbmFwc2hvdE5vZGVJZDt9fTtQcm9maWxlci5IZWFwU25hcHNob3REaWZmTm9kZXNQcm92aWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihhZGRlZE5vZGVzUHJvdmlkZXIsZGVsZXRlZE5vZGVzUHJvdmlkZXIsYWRkZWRDb3VudCxyZW1vdmVkQ291bnQpe3RoaXMuX2FkZGVkTm9kZXNQcm92aWRlcj1hZGRlZE5vZGVzUHJvdmlkZXI7dGhpcy5fZGVsZXRlZE5vZGVzUHJvdmlkZXI9ZGVsZXRlZE5vZGVzUHJvdmlkZXI7dGhpcy5fYWRkZWRDb3VudD1hZGRlZENvdW50O3RoaXMuX3JlbW92ZWRDb3VudD1yZW1vdmVkQ291bnQ7fQpkaXNwb3NlKCl7dGhpcy5fYWRkZWROb2Rlc1Byb3ZpZGVyLmRpc3Bvc2UoKTt0aGlzLl9kZWxldGVkTm9kZXNQcm92aWRlci5kaXNwb3NlKCk7fQpub2RlUG9zaXRpb24oc25hcHNob3RPYmplY3RJZCl7dGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO30KaXNFbXB0eSgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO30KYXN5bmMgc2VyaWFsaXplSXRlbXNSYW5nZShiZWdpblBvc2l0aW9uLGVuZFBvc2l0aW9uKXtsZXQgaXRlbXNSYW5nZTtsZXQgYWRkZWRJdGVtcztpZihiZWdpblBvc2l0aW9uPHRoaXMuX2FkZGVkQ291bnQpe2l0ZW1zUmFuZ2U9YXdhaXQgdGhpcy5fYWRkZWROb2Rlc1Byb3ZpZGVyLnNlcmlhbGl6ZUl0ZW1zUmFuZ2UoYmVnaW5Qb3NpdGlvbixlbmRQb3NpdGlvbik7Zm9yKGNvbnN0IGl0ZW0gb2YgaXRlbXNSYW5nZS5pdGVtcykKaXRlbS5pc0FkZGVkTm90UmVtb3ZlZD10cnVlO2lmKGl0ZW1zUmFuZ2UuZW5kUG9zaXRpb24+PWVuZFBvc2l0aW9uKXtpdGVtc1JhbmdlLnRvdGFsTGVuZ3RoPXRoaXMuX2FkZGVkQ291bnQrdGhpcy5fcmVtb3ZlZENvdW50O3JldHVybiBpdGVtc1JhbmdlO30KYWRkZWRJdGVtcz1pdGVtc1JhbmdlO2l0ZW1zUmFuZ2U9YXdhaXQgdGhpcy5fZGVsZXRlZE5vZGVzUHJvdmlkZXIuc2VyaWFsaXplSXRlbXNSYW5nZSgwLGVuZFBvc2l0aW9uLWl0ZW1zUmFuZ2UuZW5kUG9zaXRpb24pO31lbHNle2FkZGVkSXRlbXM9bmV3IEhlYXBTbmFwc2hvdE1vZGVsLkl0ZW1zUmFuZ2UoMCwwLDAsW10pO2l0ZW1zUmFuZ2U9YXdhaXQgdGhpcy5fZGVsZXRlZE5vZGVzUHJvdmlkZXIuc2VyaWFsaXplSXRlbXNSYW5nZShiZWdpblBvc2l0aW9uLXRoaXMuX2FkZGVkQ291bnQsZW5kUG9zaXRpb24tdGhpcy5fYWRkZWRDb3VudCk7fQppZighYWRkZWRJdGVtcy5pdGVtcy5sZW5ndGgpCmFkZGVkSXRlbXMuc3RhcnRQb3NpdGlvbj10aGlzLl9hZGRlZENvdW50K2l0ZW1zUmFuZ2Uuc3RhcnRQb3NpdGlvbjtmb3IoY29uc3QgaXRlbSBvZiBpdGVtc1JhbmdlLml0ZW1zKQppdGVtLmlzQWRkZWROb3RSZW1vdmVkPWZhbHNlO2FkZGVkSXRlbXMuaXRlbXMucHVzaEFsbChpdGVtc1JhbmdlLml0ZW1zKTthZGRlZEl0ZW1zLmVuZFBvc2l0aW9uPXRoaXMuX2FkZGVkQ291bnQraXRlbXNSYW5nZS5lbmRQb3NpdGlvbjthZGRlZEl0ZW1zLnRvdGFsTGVuZ3RoPXRoaXMuX2FkZGVkQ291bnQrdGhpcy5fcmVtb3ZlZENvdW50O3JldHVybiBhZGRlZEl0ZW1zO30KYXN5bmMgc29ydEFuZFJld2luZChjb21wYXJhdG9yKXthd2FpdCB0aGlzLl9hZGRlZE5vZGVzUHJvdmlkZXIuc29ydEFuZFJld2luZChjb21wYXJhdG9yKTthd2FpdCB0aGlzLl9kZWxldGVkTm9kZXNQcm92aWRlci5zb3J0QW5kUmV3aW5kKGNvbXBhcmF0b3IpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdERpZmZOb2RlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90R3JpZE5vZGV7Y29uc3RydWN0b3IoZGF0YUdyaWQsY2xhc3NOYW1lLGRpZmZGb3JDbGFzcyl7c3VwZXIoZGF0YUdyaWQsdHJ1ZSk7dGhpcy5fbmFtZT1jbGFzc05hbWU7dGhpcy5fYWRkZWRDb3VudD1kaWZmRm9yQ2xhc3MuYWRkZWRDb3VudDt0aGlzLl9yZW1vdmVkQ291bnQ9ZGlmZkZvckNsYXNzLnJlbW92ZWRDb3VudDt0aGlzLl9jb3VudERlbHRhPWRpZmZGb3JDbGFzcy5jb3VudERlbHRhO3RoaXMuX2FkZGVkU2l6ZT1kaWZmRm9yQ2xhc3MuYWRkZWRTaXplO3RoaXMuX3JlbW92ZWRTaXplPWRpZmZGb3JDbGFzcy5yZW1vdmVkU2l6ZTt0aGlzLl9zaXplRGVsdGE9ZGlmZkZvckNsYXNzLnNpemVEZWx0YTt0aGlzLl9kZWxldGVkSW5kZXhlcz1kaWZmRm9yQ2xhc3MuZGVsZXRlZEluZGV4ZXM7dGhpcy5kYXRhPXsnb2JqZWN0JzpjbGFzc05hbWUsJ2FkZGVkQ291bnQnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX2FkZGVkQ291bnQpLCdyZW1vdmVkQ291bnQnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX3JlbW92ZWRDb3VudCksJ2NvdW50RGVsdGEnOnRoaXMuX3NpZ25Gb3JEZWx0YSh0aGlzLl9jb3VudERlbHRhKStOdW1iZXIud2l0aFRob3VzYW5kc1NlcGFyYXRvcihNYXRoLmFicyh0aGlzLl9jb3VudERlbHRhKSksJ2FkZGVkU2l6ZSc6TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodGhpcy5fYWRkZWRTaXplKSwncmVtb3ZlZFNpemUnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKHRoaXMuX3JlbW92ZWRTaXplKSwnc2l6ZURlbHRhJzp0aGlzLl9zaWduRm9yRGVsdGEodGhpcy5fc2l6ZURlbHRhKStOdW1iZXIud2l0aFRob3VzYW5kc1NlcGFyYXRvcihNYXRoLmFicyh0aGlzLl9zaXplRGVsdGEpKX07fQpjcmVhdGVQcm92aWRlcigpe2NvbnN0IHRyZWU9dGhpcy5fZGF0YUdyaWQ7cmV0dXJuIG5ldyBQcm9maWxlci5IZWFwU25hcHNob3REaWZmTm9kZXNQcm92aWRlcih0cmVlLnNuYXBzaG90LmNyZWF0ZUFkZGVkTm9kZXNQcm92aWRlcih0cmVlLmJhc2VTbmFwc2hvdC51aWQsdGhpcy5fbmFtZSksdHJlZS5iYXNlU25hcHNob3QuY3JlYXRlRGVsZXRlZE5vZGVzUHJvdmlkZXIodGhpcy5fZGVsZXRlZEluZGV4ZXMpLHRoaXMuX2FkZGVkQ291bnQsdGhpcy5fcmVtb3ZlZENvdW50KTt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2NvbnN0IGNlbGw9c3VwZXIuY3JlYXRlQ2VsbChjb2x1bW5JZCk7aWYoY29sdW1uSWQhPT0nb2JqZWN0JykKY2VsbC5jbGFzc0xpc3QuYWRkKCdudW1lcmljLWNvbHVtbicpO3JldHVybiBjZWxsO30KX2NyZWF0ZUNoaWxkTm9kZShpdGVtKXtpZihpdGVtLmlzQWRkZWROb3RSZW1vdmVkKQpyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdEluc3RhbmNlTm9kZSh0aGlzLl9kYXRhR3JpZCx0aGlzLl9kYXRhR3JpZC5zbmFwc2hvdCxpdGVtLGZhbHNlKTtlbHNlCnJldHVybiBuZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90SW5zdGFuY2VOb2RlKHRoaXMuX2RhdGFHcmlkLHRoaXMuX2RhdGFHcmlkLmJhc2VTbmFwc2hvdCxpdGVtLHRydWUpO30KX2NoaWxkSGFzaEZvckVudGl0eShub2RlKXtyZXR1cm4gbm9kZS5pZDt9Cl9jaGlsZEhhc2hGb3JOb2RlKGNoaWxkTm9kZSl7cmV0dXJuIGNoaWxkTm9kZS5zbmFwc2hvdE5vZGVJZDt9CmNvbXBhcmF0b3IoKXtjb25zdCBzb3J0QXNjZW5kaW5nPXRoaXMuX2RhdGFHcmlkLmlzU29ydE9yZGVyQXNjZW5kaW5nKCk7Y29uc3Qgc29ydENvbHVtbklkPXRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2NvbnN0IHNvcnRGaWVsZHM9e29iamVjdDpbJ25hbWUnLHNvcnRBc2NlbmRpbmcsJ2lkJyx0cnVlXSxhZGRlZENvdW50OlsnbmFtZScsdHJ1ZSwnaWQnLHRydWVdLHJlbW92ZWRDb3VudDpbJ25hbWUnLHRydWUsJ2lkJyx0cnVlXSxjb3VudERlbHRhOlsnbmFtZScsdHJ1ZSwnaWQnLHRydWVdLGFkZGVkU2l6ZTpbJ3NlbGZTaXplJyxzb3J0QXNjZW5kaW5nLCdpZCcsdHJ1ZV0scmVtb3ZlZFNpemU6WydzZWxmU2l6ZScsc29ydEFzY2VuZGluZywnaWQnLHRydWVdLHNpemVEZWx0YTpbJ3NlbGZTaXplJyxzb3J0QXNjZW5kaW5nLCdpZCcsdHJ1ZV19W3NvcnRDb2x1bW5JZF07cmV0dXJuIFByb2ZpbGVyLkhlYXBTbmFwc2hvdEdyaWROb2RlLmNyZWF0ZUNvbXBhcmF0b3Ioc29ydEZpZWxkcyk7fQpmaWx0ZXJlZE91dChmaWx0ZXJWYWx1ZSl7cmV0dXJuIHRoaXMuX25hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlclZhbHVlKT09PS0xO30KX3NpZ25Gb3JEZWx0YShkZWx0YSl7aWYoZGVsdGE9PT0wKQpyZXR1cm4nJztpZihkZWx0YT4wKQpyZXR1cm4nKyc7ZWxzZQpyZXR1cm4nXHUyMjEyJzt9fTtQcm9maWxlci5BbGxvY2F0aW9uR3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RHcmlkTm9kZXtjb25zdHJ1Y3RvcihkYXRhR3JpZCxkYXRhKXtzdXBlcihkYXRhR3JpZCxkYXRhLmhhc0NoaWxkcmVuKTt0aGlzLl9wb3B1bGF0ZWQ9ZmFsc2U7dGhpcy5fYWxsb2NhdGlvbk5vZGU9ZGF0YTt0aGlzLmRhdGE9eydsaXZlQ291bnQnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKGRhdGEubGl2ZUNvdW50KSwnY291bnQnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKGRhdGEuY291bnQpLCdsaXZlU2l6ZSc6TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IoZGF0YS5saXZlU2l6ZSksJ3NpemUnOk51bWJlci53aXRoVGhvdXNhbmRzU2VwYXJhdG9yKGRhdGEuc2l6ZSksJ25hbWUnOmRhdGEubmFtZX07fQpwb3B1bGF0ZSgpe2lmKHRoaXMuX3BvcHVsYXRlZCkKcmV0dXJuO3RoaXMuX2RvUG9wdWxhdGUoKTt9CmFzeW5jIF9kb1BvcHVsYXRlKCl7dGhpcy5fcG9wdWxhdGVkPXRydWU7Y29uc3QgY2FsbGVycz1hd2FpdCB0aGlzLl9kYXRhR3JpZC5zbmFwc2hvdC5hbGxvY2F0aW9uTm9kZUNhbGxlcnModGhpcy5fYWxsb2NhdGlvbk5vZGUuaWQpO2NvbnN0IGNhbGxlcnNDaGFpbj1jYWxsZXJzLm5vZGVzV2l0aFNpbmdsZUNhbGxlcjtsZXQgcGFyZW50Tm9kZT10aGlzO2NvbnN0IGRhdGFHcmlkPSh0aGlzLl9kYXRhR3JpZCk7Zm9yKGNvbnN0IGNhbGxlciBvZiBjYWxsZXJzQ2hhaW4pe2NvbnN0IGNoaWxkPW5ldyBQcm9maWxlci5BbGxvY2F0aW9uR3JpZE5vZGUoZGF0YUdyaWQsY2FsbGVyKTtkYXRhR3JpZC5hcHBlbmROb2RlKHBhcmVudE5vZGUsY2hpbGQpO3BhcmVudE5vZGU9Y2hpbGQ7cGFyZW50Tm9kZS5fcG9wdWxhdGVkPXRydWU7aWYodGhpcy5leHBhbmRlZCkKcGFyZW50Tm9kZS5leHBhbmQoKTt9CmNvbnN0IGNhbGxlcnNCcmFuY2g9Y2FsbGVycy5icmFuY2hpbmdDYWxsZXJzO2NhbGxlcnNCcmFuY2guc29ydCh0aGlzLl9kYXRhR3JpZC5fY3JlYXRlQ29tcGFyYXRvcigpKTtmb3IoY29uc3QgY2FsbGVyIG9mIGNhbGxlcnNCcmFuY2gpCmRhdGFHcmlkLmFwcGVuZE5vZGUocGFyZW50Tm9kZSxuZXcgUHJvZmlsZXIuQWxsb2NhdGlvbkdyaWROb2RlKGRhdGFHcmlkLGNhbGxlcikpO2RhdGFHcmlkLnVwZGF0ZVZpc2libGVOb2Rlcyh0cnVlKTt9CmV4cGFuZCgpe3N1cGVyLmV4cGFuZCgpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPT09MSkKdGhpcy5jaGlsZHJlblswXS5leHBhbmQoKTt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2lmKGNvbHVtbklkIT09J25hbWUnKQpyZXR1cm4gdGhpcy5fY3JlYXRlVmFsdWVDZWxsKGNvbHVtbklkKTtjb25zdCBjZWxsPXN1cGVyLmNyZWF0ZUNlbGwoY29sdW1uSWQpO2NvbnN0IGFsbG9jYXRpb25Ob2RlPXRoaXMuX2FsbG9jYXRpb25Ob2RlO2NvbnN0IGhlYXBQcm9maWxlck1vZGVsPXRoaXMuX2RhdGFHcmlkLmhlYXBQcm9maWxlck1vZGVsKCk7aWYoYWxsb2NhdGlvbk5vZGUuc2NyaXB0SWQpe2NvbnN0IGxpbmtpZmllcj10aGlzLl9kYXRhR3JpZC5fbGlua2lmaWVyO2NvbnN0IHVybEVsZW1lbnQ9bGlua2lmaWVyLmxpbmtpZnlTY3JpcHRMb2NhdGlvbihoZWFwUHJvZmlsZXJNb2RlbD9oZWFwUHJvZmlsZXJNb2RlbC50YXJnZXQoKTpudWxsLFN0cmluZyhhbGxvY2F0aW9uTm9kZS5zY3JpcHRJZCksYWxsb2NhdGlvbk5vZGUuc2NyaXB0TmFtZSxhbGxvY2F0aW9uTm9kZS5saW5lLTEsYWxsb2NhdGlvbk5vZGUuY29sdW1uLTEsJ3Byb2ZpbGUtbm9kZS1maWxlJyk7dXJsRWxlbWVudC5zdHlsZS5tYXhXaWR0aD0nNzUlJztjZWxsLmluc2VydEJlZm9yZSh1cmxFbGVtZW50LGNlbGwuZmlyc3RDaGlsZCk7fQpyZXR1cm4gY2VsbDt9CmFsbG9jYXRpb25Ob2RlSWQoKXtyZXR1cm4gdGhpcy5fYWxsb2NhdGlvbk5vZGUuaWQ7fX07O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5TaW1wbGVWaWV3e2NvbnN0cnVjdG9yKGRhdGFEaXNwbGF5RGVsZWdhdGUscHJvZmlsZSl7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdIZWFwIFNuYXBzaG90JykpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFwLXNuYXBzaG90LXZpZXcnKTt0aGlzLl9wcm9maWxlPXByb2ZpbGU7dGhpcy5fbGlua2lmaWVyPW5ldyBDb21wb25lbnRzLkxpbmtpZmllcigpO3Byb2ZpbGUucHJvZmlsZVR5cGUoKS5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlNuYXBzaG90UmVjZWl2ZWQsdGhpcy5fb25SZWNlaXZlU25hcHNob3QsdGhpcyk7cHJvZmlsZS5wcm9maWxlVHlwZSgpLmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuUHJvZmlsZVR5cGUuRXZlbnRzLlJlbW92ZVByb2ZpbGVIZWFkZXIsdGhpcy5fb25Qcm9maWxlSGVhZGVyUmVtb3ZlZCx0aGlzKTtjb25zdCBpc0hlYXBUaW1lbGluZT1wcm9maWxlLnByb2ZpbGVUeXBlKCkuaWQ9PT1Qcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlR5cGVJZDtpZihpc0hlYXBUaW1lbGluZSl7dGhpcy5fdHJhY2tpbmdPdmVydmlld0dyaWQ9bmV3IFByb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZChwcm9maWxlKTt0aGlzLl90cmFja2luZ092ZXJ2aWV3R3JpZC5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZC5JZHNSYW5nZUNoYW5nZWQsdGhpcy5fb25JZHNSYW5nZUNoYW5nZWQuYmluZCh0aGlzKSk7fQp0aGlzLl9wYXJlbnREYXRhRGlzcGxheURlbGVnYXRlPWRhdGFEaXNwbGF5RGVsZWdhdGU7dGhpcy5fc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KHRoaXMpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9zcGxpdFdpZGdldD1uZXcgVUkuU3BsaXRXaWRnZXQoZmFsc2UsdHJ1ZSwnaGVhcFNuYXBzaG90U3BsaXRWaWV3U3RhdGUnLDIwMCwyMDApO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3codGhpcy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7dGhpcy5fY29udGFpbm1lbnREYXRhR3JpZD1uZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90Q29udGFpbm1lbnREYXRhR3JpZCh0aGlzKTt0aGlzLl9jb250YWlubWVudERhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSx0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLHRoaXMpO3RoaXMuX2NvbnRhaW5tZW50V2lkZ2V0PXRoaXMuX2NvbnRhaW5tZW50RGF0YUdyaWQuYXNXaWRnZXQoKTt0aGlzLl9jb250YWlubWVudFdpZGdldC5zZXRNaW5pbXVtU2l6ZSg1MCwyNSk7dGhpcy5fc3RhdGlzdGljc1ZpZXc9bmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFN0YXRpc3RpY3NWaWV3KCk7dGhpcy5fY29uc3RydWN0b3JzRGF0YUdyaWQ9bmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdENvbnN0cnVjdG9yc0RhdGFHcmlkKHRoaXMpO3RoaXMuX2NvbnN0cnVjdG9yc0RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSx0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLHRoaXMpO3RoaXMuX2NvbnN0cnVjdG9yc1dpZGdldD10aGlzLl9jb25zdHJ1Y3RvcnNEYXRhR3JpZC5hc1dpZGdldCgpO3RoaXMuX2NvbnN0cnVjdG9yc1dpZGdldC5zZXRNaW5pbXVtU2l6ZSg1MCwyNSk7dGhpcy5fZGlmZkRhdGFHcmlkPW5ldyBQcm9maWxlci5IZWFwU25hcHNob3REaWZmRGF0YUdyaWQodGhpcyk7dGhpcy5fZGlmZkRhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSx0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLHRoaXMpO3RoaXMuX2RpZmZXaWRnZXQ9dGhpcy5fZGlmZkRhdGFHcmlkLmFzV2lkZ2V0KCk7dGhpcy5fZGlmZldpZGdldC5zZXRNaW5pbXVtU2l6ZSg1MCwyNSk7aWYoaXNIZWFwVGltZWxpbmUpe3RoaXMuX2FsbG9jYXRpb25EYXRhR3JpZD1uZXcgUHJvZmlsZXIuQWxsb2NhdGlvbkRhdGFHcmlkKHByb2ZpbGUuaGVhcFByb2ZpbGVyTW9kZWwoKSx0aGlzKTt0aGlzLl9hbGxvY2F0aW9uRGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU2VsZWN0ZWROb2RlLHRoaXMuX29uU2VsZWN0QWxsb2NhdGlvbk5vZGUsdGhpcyk7dGhpcy5fYWxsb2NhdGlvbldpZGdldD10aGlzLl9hbGxvY2F0aW9uRGF0YUdyaWQuYXNXaWRnZXQoKTt0aGlzLl9hbGxvY2F0aW9uV2lkZ2V0LnNldE1pbmltdW1TaXplKDUwLDI1KTt0aGlzLl9hbGxvY2F0aW9uU3RhY2tWaWV3PW5ldyBQcm9maWxlci5IZWFwQWxsb2NhdGlvblN0YWNrVmlldyhwcm9maWxlLmhlYXBQcm9maWxlck1vZGVsKCkpO3RoaXMuX2FsbG9jYXRpb25TdGFja1ZpZXcuc2V0TWluaW11bVNpemUoNTAsMjUpO3RoaXMuX3RhYmJlZFBhbmU9bmV3IFVJLlRhYmJlZFBhbmUoKTt9CnRoaXMuX3JldGFpbm1lbnREYXRhR3JpZD1uZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90UmV0YWlubWVudERhdGFHcmlkKHRoaXMpO3RoaXMuX3JldGFpbm1lbnRXaWRnZXQ9dGhpcy5fcmV0YWlubWVudERhdGFHcmlkLmFzV2lkZ2V0KCk7dGhpcy5fcmV0YWlubWVudFdpZGdldC5zZXRNaW5pbXVtU2l6ZSg1MCwyMSk7dGhpcy5fcmV0YWlubWVudFdpZGdldC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JldGFpbmluZy1wYXRocy12aWV3Jyk7bGV0IHNwbGl0V2lkZ2V0UmVzaXplcjtpZih0aGlzLl9hbGxvY2F0aW9uU3RhY2tWaWV3KXt0aGlzLl90YWJiZWRQYW5lPW5ldyBVSS5UYWJiZWRQYW5lKCk7dGhpcy5fdGFiYmVkUGFuZS5hcHBlbmRUYWIoJ3JldGFpbmVycycsQ29tbW9uLlVJU3RyaW5nKCdSZXRhaW5lcnMnKSx0aGlzLl9yZXRhaW5tZW50V2lkZ2V0KTt0aGlzLl90YWJiZWRQYW5lLmFwcGVuZFRhYignYWxsb2NhdGlvbi1zdGFjaycsQ29tbW9uLlVJU3RyaW5nKCdBbGxvY2F0aW9uIHN0YWNrJyksdGhpcy5fYWxsb2NhdGlvblN0YWNrVmlldyk7c3BsaXRXaWRnZXRSZXNpemVyPXRoaXMuX3RhYmJlZFBhbmUuaGVhZGVyRWxlbWVudCgpO3RoaXMuX29iamVjdERldGFpbHNWaWV3PXRoaXMuX3RhYmJlZFBhbmU7fWVsc2V7Y29uc3QgcmV0YWlubWVudFZpZXdIZWFkZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywnaGVhcC1zbmFwc2hvdC12aWV3LXJlc2l6ZXInKTtjb25zdCByZXRhaW5pbmdQYXRoc1RpdGxlRGl2PXJldGFpbm1lbnRWaWV3SGVhZGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCd0aXRsZScpO2NvbnN0IHJldGFpbmluZ1BhdGhzVGl0bGU9cmV0YWluaW5nUGF0aHNUaXRsZURpdi5jcmVhdGVDaGlsZCgnc3BhbicpO3JldGFpbmluZ1BhdGhzVGl0bGUudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdSZXRhaW5lcnMnKTtzcGxpdFdpZGdldFJlc2l6ZXI9cmV0YWlubWVudFZpZXdIZWFkZXI7dGhpcy5fb2JqZWN0RGV0YWlsc1ZpZXc9bmV3IFVJLlZCb3goKTt0aGlzLl9vYmplY3REZXRhaWxzVmlldy5lbGVtZW50LmFwcGVuZENoaWxkKHJldGFpbm1lbnRWaWV3SGVhZGVyKTt0aGlzLl9yZXRhaW5tZW50V2lkZ2V0LnNob3codGhpcy5fb2JqZWN0RGV0YWlsc1ZpZXcuZWxlbWVudCk7fQp0aGlzLl9zcGxpdFdpZGdldC5oaWRlRGVmYXVsdFJlc2l6ZXIoKTt0aGlzLl9zcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcihzcGxpdFdpZGdldFJlc2l6ZXIpO3RoaXMuX3JldGFpbm1lbnREYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5TZWxlY3RlZE5vZGUsdGhpcy5faW5zcGVjdGVkT2JqZWN0Q2hhbmdlZCx0aGlzKTt0aGlzLl9yZXRhaW5tZW50RGF0YUdyaWQucmVzZXQoKTt0aGlzLl9wZXJzcGVjdGl2ZXM9W107dGhpcy5fY29tcGFyaXNvblBlcnNwZWN0aXZlPW5ldyBQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LkNvbXBhcmlzb25QZXJzcGVjdGl2ZSgpO3RoaXMuX3BlcnNwZWN0aXZlcy5wdXNoKG5ldyBQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LlN1bW1hcnlQZXJzcGVjdGl2ZSgpKTtpZihwcm9maWxlLnByb2ZpbGVUeXBlKCkhPT1Qcm9maWxlci5Qcm9maWxlVHlwZVJlZ2lzdHJ5Lmluc3RhbmNlLnRyYWNraW5nSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUpCnRoaXMuX3BlcnNwZWN0aXZlcy5wdXNoKHRoaXMuX2NvbXBhcmlzb25QZXJzcGVjdGl2ZSk7dGhpcy5fcGVyc3BlY3RpdmVzLnB1c2gobmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuQ29udGFpbm1lbnRQZXJzcGVjdGl2ZSgpKTtpZih0aGlzLl9hbGxvY2F0aW9uV2lkZ2V0KQp0aGlzLl9wZXJzcGVjdGl2ZXMucHVzaChuZXcgUHJvZmlsZXIuSGVhcFNuYXBzaG90Vmlldy5BbGxvY2F0aW9uUGVyc3BlY3RpdmUoKSk7dGhpcy5fcGVyc3BlY3RpdmVzLnB1c2gobmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuU3RhdGlzdGljc1BlcnNwZWN0aXZlKCkpO3RoaXMuX3BlcnNwZWN0aXZlU2VsZWN0PW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3godGhpcy5fb25TZWxlY3RlZFBlcnNwZWN0aXZlQ2hhbmdlZC5iaW5kKHRoaXMpKTt0aGlzLl91cGRhdGVQZXJzcGVjdGl2ZU9wdGlvbnMoKTt0aGlzLl9iYXNlU2VsZWN0PW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3godGhpcy5fY2hhbmdlQmFzZS5iaW5kKHRoaXMpKTt0aGlzLl9iYXNlU2VsZWN0LnNldFZpc2libGUoZmFsc2UpO3RoaXMuX3VwZGF0ZUJhc2VPcHRpb25zKCk7dGhpcy5fZmlsdGVyU2VsZWN0PW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3godGhpcy5fY2hhbmdlRmlsdGVyLmJpbmQodGhpcykpO3RoaXMuX2ZpbHRlclNlbGVjdC5zZXRWaXNpYmxlKGZhbHNlKTt0aGlzLl91cGRhdGVGaWx0ZXJPcHRpb25zKCk7dGhpcy5fY2xhc3NOYW1lRmlsdGVyPW5ldyBVSS5Ub29sYmFySW5wdXQoJ0NsYXNzIGZpbHRlcicpO3RoaXMuX2NsYXNzTmFtZUZpbHRlci5zZXRWaXNpYmxlKGZhbHNlKTt0aGlzLl9jb25zdHJ1Y3RvcnNEYXRhR3JpZC5zZXROYW1lRmlsdGVyKHRoaXMuX2NsYXNzTmFtZUZpbHRlcik7dGhpcy5fZGlmZkRhdGFHcmlkLnNldE5hbWVGaWx0ZXIodGhpcy5fY2xhc3NOYW1lRmlsdGVyKTt0aGlzLl9zZWxlY3RlZFNpemVUZXh0PW5ldyBVSS5Ub29sYmFyVGV4dCgpO3RoaXMuX3BvcG92ZXJIZWxwZXI9bmV3IFVJLlBvcG92ZXJIZWxwZXIodGhpcy5lbGVtZW50LHRoaXMuX2dldFBvcG92ZXJSZXF1ZXN0LmJpbmQodGhpcykpO3RoaXMuX3BvcG92ZXJIZWxwZXIuc2V0RGlzYWJsZU9uQ2xpY2sodHJ1ZSk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXRIYXNQYWRkaW5nKHRydWUpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX3BvcG92ZXJIZWxwZXIuaGlkZVBvcG92ZXIuYmluZCh0aGlzLl9wb3BvdmVySGVscGVyKSx0cnVlKTt0aGlzLl9jdXJyZW50UGVyc3BlY3RpdmVJbmRleD0wO3RoaXMuX2N1cnJlbnRQZXJzcGVjdGl2ZT10aGlzLl9wZXJzcGVjdGl2ZXNbMF07dGhpcy5fY3VycmVudFBlcnNwZWN0aXZlLmFjdGl2YXRlKHRoaXMpO3RoaXMuX2RhdGFHcmlkPXRoaXMuX2N1cnJlbnRQZXJzcGVjdGl2ZS5tYXN0ZXJHcmlkKHRoaXMpO3RoaXMuX3BvcHVsYXRlKCk7dGhpcy5fc2VhcmNoVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDApO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLHRydWUpO2Zvcihjb25zdCBleGlzdGluZ1Byb2ZpbGUgb2YgdGhpcy5fcHJvZmlsZXMoKSkKZXhpc3RpbmdQcm9maWxlLmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHMuUHJvZmlsZVRpdGxlQ2hhbmdlZCx0aGlzLl91cGRhdGVDb250cm9scyx0aGlzKTt9CnNlYXJjaGFibGVWaWV3KCl7cmV0dXJuIHRoaXMuX3NlYXJjaGFibGVWaWV3O30Kc2hvd1Byb2ZpbGUocHJvZmlsZSl7cmV0dXJuIHRoaXMuX3BhcmVudERhdGFEaXNwbGF5RGVsZWdhdGUuc2hvd1Byb2ZpbGUocHJvZmlsZSk7fQpzaG93T2JqZWN0KHNuYXBzaG90T2JqZWN0SWQscGVyc3BlY3RpdmVOYW1lKXtpZihzbmFwc2hvdE9iamVjdElkPD10aGlzLl9wcm9maWxlLm1heEpTT2JqZWN0SWQpCnRoaXMuc2VsZWN0TGl2ZU9iamVjdChwZXJzcGVjdGl2ZU5hbWUsc25hcHNob3RPYmplY3RJZCk7ZWxzZQp0aGlzLl9wYXJlbnREYXRhRGlzcGxheURlbGVnYXRlLnNob3dPYmplY3Qoc25hcHNob3RPYmplY3RJZCxwZXJzcGVjdGl2ZU5hbWUpO30KYXN5bmMgbGlua2lmeU9iamVjdChzbmFwc2hvdE9iamVjdElkKXtjb25zdCBoZWFwUHJvZmlsZXJNb2RlbD10aGlzLl9wcm9maWxlLmhlYXBQcm9maWxlck1vZGVsKCk7Y29uc3QgcmVtb3RlT2JqZWN0PWF3YWl0IGhlYXBQcm9maWxlck1vZGVsLm9iamVjdEZvclNuYXBzaG90T2JqZWN0SWQoU3RyaW5nKHNuYXBzaG90T2JqZWN0SWQpLCdsaW5rJyk7aWYoIXJlbW90ZU9iamVjdHx8cmVtb3RlT2JqZWN0LnR5cGUhPT0nZnVuY3Rpb24nKQpyZXR1cm4gbnVsbDtjb25zdCBmdW5jdGlvbkRldGFpbHM9YXdhaXQgcmVtb3RlT2JqZWN0LmRlYnVnZ2VyTW9kZWwoKS5mdW5jdGlvbkRldGFpbHNQcm9taXNlKHJlbW90ZU9iamVjdCk7aWYoIWZ1bmN0aW9uRGV0YWlsc3x8IWZ1bmN0aW9uRGV0YWlscy5sb2NhdGlvbikKcmV0dXJuIG51bGw7Y29uc3QgcmF3TG9jYXRpb249ZnVuY3Rpb25EZXRhaWxzLmxvY2F0aW9uO2NvbnN0IHNvdXJjZVVSTD1yYXdMb2NhdGlvbi5zY3JpcHQoKSYmcmF3TG9jYXRpb24uc2NyaXB0KCkuc291cmNlVVJMO3JldHVybiBzb3VyY2VVUkwmJnRoaXMuX2xpbmtpZmllcj90aGlzLl9saW5raWZpZXIubGlua2lmeVJhd0xvY2F0aW9uKHJhd0xvY2F0aW9uLHNvdXJjZVVSTCk6bnVsbDt9CmFzeW5jIF9wb3B1bGF0ZSgpe2NvbnN0IGhlYXBTbmFwc2hvdFByb3h5PWF3YWl0IHRoaXMuX3Byb2ZpbGUuX2xvYWRQcm9taXNlO3RoaXMuX3JldHJpZXZlU3RhdGlzdGljcyhoZWFwU25hcHNob3RQcm94eSk7dGhpcy5fZGF0YUdyaWQuc2V0RGF0YVNvdXJjZShoZWFwU25hcHNob3RQcm94eSk7aWYodGhpcy5fcHJvZmlsZS5wcm9maWxlVHlwZSgpLmlkPT09UHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5UeXBlSWQmJnRoaXMuX3Byb2ZpbGUuZnJvbUZpbGUoKSl7Y29uc3Qgc2FtcGxlcz1hd2FpdCBoZWFwU25hcHNob3RQcm94eS5nZXRTYW1wbGVzKCk7dGhpcy5fdHJhY2tpbmdPdmVydmlld0dyaWQuX3NldFNhbXBsZXMoc2FtcGxlcyk7fQpjb25zdCBsaXN0PXRoaXMuX3Byb2ZpbGVzKCk7Y29uc3QgcHJvZmlsZUluZGV4PWxpc3QuaW5kZXhPZih0aGlzLl9wcm9maWxlKTt0aGlzLl9iYXNlU2VsZWN0LnNldFNlbGVjdGVkSW5kZXgoTWF0aC5tYXgoMCxwcm9maWxlSW5kZXgtMSkpO2lmKHRoaXMuX3RyYWNraW5nT3ZlcnZpZXdHcmlkKQp0aGlzLl90cmFja2luZ092ZXJ2aWV3R3JpZC5fdXBkYXRlR3JpZCgpO30KYXN5bmMgX3JldHJpZXZlU3RhdGlzdGljcyhoZWFwU25hcHNob3RQcm94eSl7Y29uc3Qgc3RhdGlzdGljcz1hd2FpdCBoZWFwU25hcHNob3RQcm94eS5nZXRTdGF0aXN0aWNzKCk7dGhpcy5fc3RhdGlzdGljc1ZpZXcuc2V0VG90YWwoc3RhdGlzdGljcy50b3RhbCk7dGhpcy5fc3RhdGlzdGljc1ZpZXcuYWRkUmVjb3JkKHN0YXRpc3RpY3MuY29kZSxDb21tb24uVUlTdHJpbmcoJ0NvZGUnKSwnI2Y3NycpO3RoaXMuX3N0YXRpc3RpY3NWaWV3LmFkZFJlY29yZChzdGF0aXN0aWNzLnN0cmluZ3MsQ29tbW9uLlVJU3RyaW5nKCdTdHJpbmdzJyksJyM1ZTUnKTt0aGlzLl9zdGF0aXN0aWNzVmlldy5hZGRSZWNvcmQoc3RhdGlzdGljcy5qc0FycmF5cyxDb21tb24uVUlTdHJpbmcoJ0pTIEFycmF5cycpLCcjN2FmJyk7dGhpcy5fc3RhdGlzdGljc1ZpZXcuYWRkUmVjb3JkKHN0YXRpc3RpY3MubmF0aXZlLENvbW1vbi5VSVN0cmluZygnVHlwZWQgQXJyYXlzJyksJyNmYzUnKTt0aGlzLl9zdGF0aXN0aWNzVmlldy5hZGRSZWNvcmQoc3RhdGlzdGljcy5zeXN0ZW0sQ29tbW9uLlVJU3RyaW5nKCdTeXN0ZW0gT2JqZWN0cycpLCcjOThmJyk7dGhpcy5fc3RhdGlzdGljc1ZpZXcuYWRkUmVjb3JkKHN0YXRpc3RpY3MudG90YWwsQ29tbW9uLlVJU3RyaW5nKCdUb3RhbCcpKTtyZXR1cm4gc3RhdGlzdGljczt9Cl9vbklkc1JhbmdlQ2hhbmdlZChldmVudCl7Y29uc3QgbWluSWQ9ZXZlbnQuZGF0YS5taW5JZDtjb25zdCBtYXhJZD1ldmVudC5kYXRhLm1heElkO3RoaXMuX3NlbGVjdGVkU2l6ZVRleHQuc2V0VGV4dChDb21tb24uVUlTdHJpbmcoJ1NlbGVjdGVkIHNpemU6ICVzJyxOdW1iZXIuYnl0ZXNUb1N0cmluZyhldmVudC5kYXRhLnNpemUpKSk7aWYodGhpcy5fY29uc3RydWN0b3JzRGF0YUdyaWQuc25hcHNob3QpCnRoaXMuX2NvbnN0cnVjdG9yc0RhdGFHcmlkLnNldFNlbGVjdGlvblJhbmdlKG1pbklkLG1heElkKTt9CnN5bmNUb29sYmFySXRlbXMoKXtjb25zdCByZXN1bHQ9W3RoaXMuX3BlcnNwZWN0aXZlU2VsZWN0LHRoaXMuX2NsYXNzTmFtZUZpbHRlcl07aWYodGhpcy5fcHJvZmlsZS5wcm9maWxlVHlwZSgpIT09UHJvZmlsZXIuUHJvZmlsZVR5cGVSZWdpc3RyeS5pbnN0YW5jZS50cmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlKQpyZXN1bHQucHVzaCh0aGlzLl9iYXNlU2VsZWN0LHRoaXMuX2ZpbHRlclNlbGVjdCk7cmVzdWx0LnB1c2godGhpcy5fc2VsZWN0ZWRTaXplVGV4dCk7cmV0dXJuIHJlc3VsdDt9CndpbGxIaWRlKCl7dGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4PS0xO3RoaXMuX3BvcG92ZXJIZWxwZXIuaGlkZVBvcG92ZXIoKTt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiBmYWxzZTt9CnNlYXJjaENhbmNlbGVkKCl7dGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4PS0xO3RoaXMuX3NlYXJjaFJlc3VsdHM9W107fQpfc2VsZWN0UmV2ZWFsZWROb2RlKG5vZGUpe2lmKG5vZGUpCm5vZGUuc2VsZWN0KCk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtpZih0aGlzLl9kYXRhR3JpZCkKdGhpcy5fZGF0YUdyaWQucG9wdWxhdGVDb250ZXh0TWVudShjb250ZXh0TWVudSxldmVudCk7Y29udGV4dE1lbnUuc2hvdygpO30KcGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXtjb25zdCBuZXh0UXVlcnk9bmV3IEhlYXBTbmFwc2hvdE1vZGVsLlNlYXJjaENvbmZpZyhzZWFyY2hDb25maWcucXVlcnkudHJpbSgpLHNlYXJjaENvbmZpZy5jYXNlU2Vuc2l0aXZlLHNlYXJjaENvbmZpZy5pc1JlZ2V4LHNob3VsZEp1bXAsanVtcEJhY2t3YXJkc3x8ZmFsc2UpO3RoaXMuX3NlYXJjaFRocm90dGxlci5zY2hlZHVsZSh0aGlzLl9wZXJmb3JtU2VhcmNoLmJpbmQodGhpcyxuZXh0UXVlcnkpKTt9CmFzeW5jIF9wZXJmb3JtU2VhcmNoKG5leHRRdWVyeSl7dGhpcy5zZWFyY2hDYW5jZWxlZCgpO2lmKCF0aGlzLl9jdXJyZW50UGVyc3BlY3RpdmUuc3VwcG9ydHNTZWFyY2goKSkKcmV0dXJuO3RoaXMuY3VycmVudFF1ZXJ5PW5leHRRdWVyeTtjb25zdCBxdWVyeT1uZXh0UXVlcnkucXVlcnkudHJpbSgpO2lmKCFxdWVyeSkKcmV0dXJuO2lmKHF1ZXJ5LmNoYXJBdCgwKT09PSdAJyl7Y29uc3Qgc25hcHNob3ROb2RlSWQ9cGFyc2VJbnQocXVlcnkuc3Vic3RyaW5nKDEpLDEwKTtpZihpc05hTihzbmFwc2hvdE5vZGVJZCkpCnJldHVybjtjb25zdCBub2RlPWF3YWl0IHRoaXMuX2RhdGFHcmlkLnJldmVhbE9iamVjdEJ5SGVhcFNuYXBzaG90SWQoU3RyaW5nKHNuYXBzaG90Tm9kZUlkKSk7dGhpcy5fc2VsZWN0UmV2ZWFsZWROb2RlKG5vZGUpO3JldHVybjt9CnRoaXMuX3NlYXJjaFJlc3VsdHM9YXdhaXQgdGhpcy5fcHJvZmlsZS5fc25hcHNob3RQcm94eS5zZWFyY2godGhpcy5jdXJyZW50UXVlcnksdGhpcy5fZGF0YUdyaWQubm9kZUZpbHRlcigpKTt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVTZWFyY2hNYXRjaGVzQ291bnQodGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpO2lmKHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKQp0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg9bmV4dFF1ZXJ5Lmp1bXBCYWNrd2FyZHM/dGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgtMTowO2F3YWl0IHRoaXMuX2p1bXBUb1NlYXJjaFJlc3VsdCh0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXgpO30KanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0odGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4KzEpJXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoO3RoaXMuX3NlYXJjaFRocm90dGxlci5zY2hlZHVsZSh0aGlzLl9qdW1wVG9TZWFyY2hSZXN1bHQuYmluZCh0aGlzLHRoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleCkpO30KanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpCnJldHVybjt0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg9KHRoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleCt0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aC0xKSV0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aDt0aGlzLl9zZWFyY2hUaHJvdHRsZXIuc2NoZWR1bGUodGhpcy5fanVtcFRvU2VhcmNoUmVzdWx0LmJpbmQodGhpcyx0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXgpKTt9CmFzeW5jIF9qdW1wVG9TZWFyY2hSZXN1bHQoc2VhcmNoUmVzdWx0SW5kZXgpe3RoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZUN1cnJlbnRNYXRjaEluZGV4KHNlYXJjaFJlc3VsdEluZGV4KTtpZihzZWFyY2hSZXN1bHRJbmRleD09PS0xKQpyZXR1cm47Y29uc3Qgbm9kZT1hd2FpdCB0aGlzLl9kYXRhR3JpZC5yZXZlYWxPYmplY3RCeUhlYXBTbmFwc2hvdElkKFN0cmluZyh0aGlzLl9zZWFyY2hSZXN1bHRzW3NlYXJjaFJlc3VsdEluZGV4XSkpO3RoaXMuX3NlbGVjdFJldmVhbGVkTm9kZShub2RlKTt9CnJlZnJlc2hWaXNpYmxlRGF0YSgpe2lmKCF0aGlzLl9kYXRhR3JpZCkKcmV0dXJuO2xldCBjaGlsZD10aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmNoaWxkcmVuWzBdO3doaWxlKGNoaWxkKXtjaGlsZC5yZWZyZXNoKCk7Y2hpbGQ9Y2hpbGQudHJhdmVyc2VOZXh0Tm9kZShmYWxzZSxudWxsLHRydWUpO319Cl9jaGFuZ2VCYXNlKCl7aWYodGhpcy5fYmFzZVByb2ZpbGU9PT10aGlzLl9wcm9maWxlcygpW3RoaXMuX2Jhc2VTZWxlY3Quc2VsZWN0ZWRJbmRleCgpXSkKcmV0dXJuO3RoaXMuX2Jhc2VQcm9maWxlPXRoaXMuX3Byb2ZpbGVzKClbdGhpcy5fYmFzZVNlbGVjdC5zZWxlY3RlZEluZGV4KCldO2NvbnN0IGRhdGFHcmlkPSh0aGlzLl9kYXRhR3JpZCk7aWYoZGF0YUdyaWQuc25hcHNob3QpCnRoaXMuX2Jhc2VQcm9maWxlLl9sb2FkUHJvbWlzZS50aGVuKGRhdGFHcmlkLnNldEJhc2VEYXRhU291cmNlLmJpbmQoZGF0YUdyaWQpKTtpZighdGhpcy5jdXJyZW50UXVlcnl8fCF0aGlzLl9zZWFyY2hSZXN1bHRzKQpyZXR1cm47dGhpcy5wZXJmb3JtU2VhcmNoKHRoaXMuY3VycmVudFF1ZXJ5LGZhbHNlKTt9Cl9jaGFuZ2VGaWx0ZXIoKXtjb25zdCBwcm9maWxlSW5kZXg9dGhpcy5fZmlsdGVyU2VsZWN0LnNlbGVjdGVkSW5kZXgoKS0xO3RoaXMuX2RhdGFHcmlkLmZpbHRlclNlbGVjdEluZGV4Q2hhbmdlZCh0aGlzLl9wcm9maWxlcygpLHByb2ZpbGVJbmRleCk7aWYoIXRoaXMuY3VycmVudFF1ZXJ5fHwhdGhpcy5fc2VhcmNoUmVzdWx0cykKcmV0dXJuO3RoaXMucGVyZm9ybVNlYXJjaCh0aGlzLmN1cnJlbnRRdWVyeSxmYWxzZSk7fQpfcHJvZmlsZXMoKXtyZXR1cm4gdGhpcy5fcHJvZmlsZS5wcm9maWxlVHlwZSgpLmdldFByb2ZpbGVzKCk7fQpfc2VsZWN0aW9uQ2hhbmdlZChldmVudCl7Y29uc3Qgc2VsZWN0ZWROb2RlPShldmVudC5kYXRhKTt0aGlzLl9zZXRTZWxlY3RlZE5vZGVGb3JEZXRhaWxzVmlldyhzZWxlY3RlZE5vZGUpO3RoaXMuX2luc3BlY3RlZE9iamVjdENoYW5nZWQoZXZlbnQpO30KX29uU2VsZWN0QWxsb2NhdGlvbk5vZGUoZXZlbnQpe2NvbnN0IHNlbGVjdGVkTm9kZT0oZXZlbnQuZGF0YSk7dGhpcy5fY29uc3RydWN0b3JzRGF0YUdyaWQuc2V0QWxsb2NhdGlvbk5vZGVJZChzZWxlY3RlZE5vZGUuYWxsb2NhdGlvbk5vZGVJZCgpKTt0aGlzLl9zZXRTZWxlY3RlZE5vZGVGb3JEZXRhaWxzVmlldyhudWxsKTt9Cl9pbnNwZWN0ZWRPYmplY3RDaGFuZ2VkKGV2ZW50KXtjb25zdCBzZWxlY3RlZE5vZGU9KGV2ZW50LmRhdGEpO2NvbnN0IGhlYXBQcm9maWxlck1vZGVsPXRoaXMuX3Byb2ZpbGUuaGVhcFByb2ZpbGVyTW9kZWwoKTtpZihoZWFwUHJvZmlsZXJNb2RlbCYmc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgUHJvZmlsZXIuSGVhcFNuYXBzaG90R2VuZXJpY09iamVjdE5vZGUpCmhlYXBQcm9maWxlck1vZGVsLmFkZEluc3BlY3RlZEhlYXBPYmplY3QoU3RyaW5nKHNlbGVjdGVkTm9kZS5zbmFwc2hvdE5vZGVJZCkpO30KX3NldFNlbGVjdGVkTm9kZUZvckRldGFpbHNWaWV3KG5vZGVJdGVtKXtjb25zdCBkYXRhU291cmNlPW5vZGVJdGVtJiZub2RlSXRlbS5yZXRhaW5lcnNEYXRhU291cmNlKCk7aWYoZGF0YVNvdXJjZSl7dGhpcy5fcmV0YWlubWVudERhdGFHcmlkLnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZS5zbmFwc2hvdCxkYXRhU291cmNlLnNuYXBzaG90Tm9kZUluZGV4KTtpZih0aGlzLl9hbGxvY2F0aW9uU3RhY2tWaWV3KQp0aGlzLl9hbGxvY2F0aW9uU3RhY2tWaWV3LnNldEFsbG9jYXRlZE9iamVjdChkYXRhU291cmNlLnNuYXBzaG90LGRhdGFTb3VyY2Uuc25hcHNob3ROb2RlSW5kZXgpO31lbHNle2lmKHRoaXMuX2FsbG9jYXRpb25TdGFja1ZpZXcpCnRoaXMuX2FsbG9jYXRpb25TdGFja1ZpZXcuY2xlYXIoKTt0aGlzLl9yZXRhaW5tZW50RGF0YUdyaWQucmVzZXQoKTt9fQpfY2hhbmdlUGVyc3BlY3RpdmVBbmRXYWl0KHBlcnNwZWN0aXZlVGl0bGUpe2NvbnN0IHBlcnNwZWN0aXZlSW5kZXg9dGhpcy5fcGVyc3BlY3RpdmVzLmZpbmRJbmRleChwZXJzcGVjdGl2ZT0+cGVyc3BlY3RpdmUudGl0bGUoKT09PXBlcnNwZWN0aXZlVGl0bGUpO2lmKHBlcnNwZWN0aXZlSW5kZXg9PT0tMXx8dGhpcy5fY3VycmVudFBlcnNwZWN0aXZlSW5kZXg9PT1wZXJzcGVjdGl2ZUluZGV4KQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgcHJvbWlzZT10aGlzLl9wZXJzcGVjdGl2ZXNbcGVyc3BlY3RpdmVJbmRleF0ubWFzdGVyR3JpZCh0aGlzKS5vbmNlKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFNvcnRhYmxlRGF0YUdyaWQuRXZlbnRzLkNvbnRlbnRTaG93bik7Y29uc3Qgb3B0aW9uPXRoaXMuX3BlcnNwZWN0aXZlU2VsZWN0Lm9wdGlvbnMoKS5maW5kKG9wdGlvbj0+b3B0aW9uLnZhbHVlPT09cGVyc3BlY3RpdmVJbmRleCk7dGhpcy5fcGVyc3BlY3RpdmVTZWxlY3Quc2VsZWN0KChvcHRpb24pKTt0aGlzLl9jaGFuZ2VQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZUluZGV4KTtyZXR1cm4gcHJvbWlzZTt9CmFzeW5jIF91cGRhdGVEYXRhU291cmNlQW5kVmlldygpe2NvbnN0IGRhdGFHcmlkPXRoaXMuX2RhdGFHcmlkO2lmKCFkYXRhR3JpZHx8ZGF0YUdyaWQuc25hcHNob3QpCnJldHVybjtjb25zdCBzbmFwc2hvdFByb3h5PWF3YWl0IHRoaXMuX3Byb2ZpbGUuX2xvYWRQcm9taXNlO2lmKHRoaXMuX2RhdGFHcmlkIT09ZGF0YUdyaWQpCnJldHVybjtpZihkYXRhR3JpZC5zbmFwc2hvdCE9PXNuYXBzaG90UHJveHkpCmRhdGFHcmlkLnNldERhdGFTb3VyY2Uoc25hcHNob3RQcm94eSk7aWYoZGF0YUdyaWQhPT10aGlzLl9kaWZmRGF0YUdyaWQpCnJldHVybjtpZighdGhpcy5fYmFzZVByb2ZpbGUpCnRoaXMuX2Jhc2VQcm9maWxlPXRoaXMuX3Byb2ZpbGVzKClbdGhpcy5fYmFzZVNlbGVjdC5zZWxlY3RlZEluZGV4KCldO2NvbnN0IGJhc2VTbmFwc2hvdFByb3h5PWF3YWl0IHRoaXMuX2Jhc2VQcm9maWxlLl9sb2FkUHJvbWlzZTtpZih0aGlzLl9kaWZmRGF0YUdyaWQuYmFzZVNuYXBzaG90IT09YmFzZVNuYXBzaG90UHJveHkpCnRoaXMuX2RpZmZEYXRhR3JpZC5zZXRCYXNlRGF0YVNvdXJjZShiYXNlU25hcHNob3RQcm94eSk7fQpfb25TZWxlY3RlZFBlcnNwZWN0aXZlQ2hhbmdlZChldmVudCl7dGhpcy5fY2hhbmdlUGVyc3BlY3RpdmUoZXZlbnQudGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXS52YWx1ZSk7fQpfY2hhbmdlUGVyc3BlY3RpdmUoc2VsZWN0ZWRJbmRleCl7aWYoc2VsZWN0ZWRJbmRleD09PXRoaXMuX2N1cnJlbnRQZXJzcGVjdGl2ZUluZGV4KQpyZXR1cm47dGhpcy5fY3VycmVudFBlcnNwZWN0aXZlSW5kZXg9c2VsZWN0ZWRJbmRleDt0aGlzLl9jdXJyZW50UGVyc3BlY3RpdmUuZGVhY3RpdmF0ZSh0aGlzKTtjb25zdCBwZXJzcGVjdGl2ZT10aGlzLl9wZXJzcGVjdGl2ZXNbc2VsZWN0ZWRJbmRleF07dGhpcy5fY3VycmVudFBlcnNwZWN0aXZlPXBlcnNwZWN0aXZlO3RoaXMuX2RhdGFHcmlkPXBlcnNwZWN0aXZlLm1hc3RlckdyaWQodGhpcyk7cGVyc3BlY3RpdmUuYWN0aXZhdGUodGhpcyk7dGhpcy5yZWZyZXNoVmlzaWJsZURhdGEoKTtpZih0aGlzLl9kYXRhR3JpZCkKdGhpcy5fZGF0YUdyaWQudXBkYXRlV2lkdGhzKCk7dGhpcy5fdXBkYXRlRGF0YVNvdXJjZUFuZFZpZXcoKTtpZighdGhpcy5jdXJyZW50UXVlcnl8fCF0aGlzLl9zZWFyY2hSZXN1bHRzKQpyZXR1cm47dGhpcy5wZXJmb3JtU2VhcmNoKHRoaXMuY3VycmVudFF1ZXJ5LGZhbHNlKTt9CmFzeW5jIHNlbGVjdExpdmVPYmplY3QocGVyc3BlY3RpdmVOYW1lLHNuYXBzaG90T2JqZWN0SWQpe2F3YWl0IHRoaXMuX2NoYW5nZVBlcnNwZWN0aXZlQW5kV2FpdChwZXJzcGVjdGl2ZU5hbWUpO2NvbnN0IG5vZGU9YXdhaXQgdGhpcy5fZGF0YUdyaWQucmV2ZWFsT2JqZWN0QnlIZWFwU25hcHNob3RJZChzbmFwc2hvdE9iamVjdElkKTtpZihub2RlKQpub2RlLnNlbGVjdCgpO2Vsc2UKQ29tbW9uLmNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgaGVhcCBzbmFwc2hvdCBub2RlJyk7fQpfZ2V0UG9wb3ZlclJlcXVlc3QoZXZlbnQpe2NvbnN0IHNwYW49ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWUoJ3NwYW4nKTtjb25zdCByb3c9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoTm9kZU5hbWUoJ3RyJyk7Y29uc3QgaGVhcFByb2ZpbGVyTW9kZWw9dGhpcy5fcHJvZmlsZS5oZWFwUHJvZmlsZXJNb2RlbCgpO2lmKCFyb3d8fCFzcGFufHwhaGVhcFByb2ZpbGVyTW9kZWwpCnJldHVybiBudWxsO2NvbnN0IG5vZGU9cm93Ll9kYXRhR3JpZE5vZGU7bGV0IG9iamVjdFBvcG92ZXJIZWxwZXI7cmV0dXJue2JveDpzcGFuLmJveEluV2luZG93KCksc2hvdzphc3luYyBwb3BvdmVyPT57Y29uc3QgcmVtb3RlT2JqZWN0PWF3YWl0IG5vZGUucXVlcnlPYmplY3RDb250ZW50KGhlYXBQcm9maWxlck1vZGVsLCdwb3BvdmVyJyk7aWYoIXJlbW90ZU9iamVjdCkKcmV0dXJuIGZhbHNlO29iamVjdFBvcG92ZXJIZWxwZXI9YXdhaXQgT2JqZWN0VUkuT2JqZWN0UG9wb3ZlckhlbHBlci5idWlsZE9iamVjdFBvcG92ZXIocmVtb3RlT2JqZWN0LHBvcG92ZXIpO2lmKCFvYmplY3RQb3BvdmVySGVscGVyKXtoZWFwUHJvZmlsZXJNb2RlbC5ydW50aW1lTW9kZWwoKS5yZWxlYXNlT2JqZWN0R3JvdXAoJ3BvcG92ZXInKTtyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9LGhpZGU6KCk9PntoZWFwUHJvZmlsZXJNb2RlbC5ydW50aW1lTW9kZWwoKS5yZWxlYXNlT2JqZWN0R3JvdXAoJ3BvcG92ZXInKTtvYmplY3RQb3BvdmVySGVscGVyLmRpc3Bvc2UoKTt9fTt9Cl91cGRhdGVQZXJzcGVjdGl2ZU9wdGlvbnMoKXtjb25zdCBtdWx0aXBsZVNuYXBzaG90cz10aGlzLl9wcm9maWxlcygpLmxlbmd0aD4xO3RoaXMuX3BlcnNwZWN0aXZlU2VsZWN0LnJlbW92ZU9wdGlvbnMoKTt0aGlzLl9wZXJzcGVjdGl2ZXMuZm9yRWFjaCgocGVyc3BlY3RpdmUsaW5kZXgpPT57aWYobXVsdGlwbGVTbmFwc2hvdHN8fHBlcnNwZWN0aXZlIT09dGhpcy5fY29tcGFyaXNvblBlcnNwZWN0aXZlKQp0aGlzLl9wZXJzcGVjdGl2ZVNlbGVjdC5jcmVhdGVPcHRpb24ocGVyc3BlY3RpdmUudGl0bGUoKSwnJyxTdHJpbmcoaW5kZXgpKTt9KTt9Cl91cGRhdGVCYXNlT3B0aW9ucygpe2NvbnN0IGxpc3Q9dGhpcy5fcHJvZmlsZXMoKTtjb25zdCBzZWxlY3RlZEluZGV4PXRoaXMuX2Jhc2VTZWxlY3Quc2VsZWN0ZWRJbmRleCgpO3RoaXMuX2Jhc2VTZWxlY3QucmVtb3ZlT3B0aW9ucygpO2Zvcihjb25zdCBpdGVtIG9mIGxpc3QpCnRoaXMuX2Jhc2VTZWxlY3QuY3JlYXRlT3B0aW9uKGl0ZW0udGl0bGUpO2lmKHNlbGVjdGVkSW5kZXg+LTEpCnRoaXMuX2Jhc2VTZWxlY3Quc2V0U2VsZWN0ZWRJbmRleChzZWxlY3RlZEluZGV4KTt9Cl91cGRhdGVGaWx0ZXJPcHRpb25zKCl7Y29uc3QgbGlzdD10aGlzLl9wcm9maWxlcygpO2NvbnN0IHNlbGVjdGVkSW5kZXg9dGhpcy5fZmlsdGVyU2VsZWN0LnNlbGVjdGVkSW5kZXgoKTt0aGlzLl9maWx0ZXJTZWxlY3QucmVtb3ZlT3B0aW9ucygpO3RoaXMuX2ZpbHRlclNlbGVjdC5jcmVhdGVPcHRpb24oQ29tbW9uLlVJU3RyaW5nKCdBbGwgb2JqZWN0cycpKTtmb3IobGV0IGk9MDtpPGxpc3QubGVuZ3RoOysraSl7bGV0IHRpdGxlO2lmKCFpKQp0aXRsZT1Db21tb24uVUlTdHJpbmcoJ09iamVjdHMgYWxsb2NhdGVkIGJlZm9yZSAlcycsbGlzdFtpXS50aXRsZSk7ZWxzZQp0aXRsZT1Db21tb24uVUlTdHJpbmcoJ09iamVjdHMgYWxsb2NhdGVkIGJldHdlZW4gJXMgYW5kICVzJyxsaXN0W2ktMV0udGl0bGUsbGlzdFtpXS50aXRsZSk7dGhpcy5fZmlsdGVyU2VsZWN0LmNyZWF0ZU9wdGlvbih0aXRsZSk7fQppZihzZWxlY3RlZEluZGV4Pi0xKQp0aGlzLl9maWx0ZXJTZWxlY3Quc2V0U2VsZWN0ZWRJbmRleChzZWxlY3RlZEluZGV4KTt9Cl91cGRhdGVDb250cm9scygpe3RoaXMuX3VwZGF0ZVBlcnNwZWN0aXZlT3B0aW9ucygpO3RoaXMuX3VwZGF0ZUJhc2VPcHRpb25zKCk7dGhpcy5fdXBkYXRlRmlsdGVyT3B0aW9ucygpO30KX29uUmVjZWl2ZVNuYXBzaG90KGV2ZW50KXt0aGlzLl91cGRhdGVDb250cm9scygpO2NvbnN0IHByb2ZpbGU9ZXZlbnQuZGF0YTtwcm9maWxlLmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuUHJvZmlsZUhlYWRlci5FdmVudHMuUHJvZmlsZVRpdGxlQ2hhbmdlZCx0aGlzLl91cGRhdGVDb250cm9scyx0aGlzKTt9Cl9vblByb2ZpbGVIZWFkZXJSZW1vdmVkKGV2ZW50KXtjb25zdCBwcm9maWxlPWV2ZW50LmRhdGE7cHJvZmlsZS5yZW1vdmVFdmVudExpc3RlbmVyKFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuRXZlbnRzLlByb2ZpbGVUaXRsZUNoYW5nZWQsdGhpcy5fdXBkYXRlQ29udHJvbHMsdGhpcyk7aWYodGhpcy5fcHJvZmlsZT09PXByb2ZpbGUpe3RoaXMuZGV0YWNoKCk7dGhpcy5fcHJvZmlsZS5wcm9maWxlVHlwZSgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUuU25hcHNob3RSZWNlaXZlZCx0aGlzLl9vblJlY2VpdmVTbmFwc2hvdCx0aGlzKTt0aGlzLl9wcm9maWxlLnByb2ZpbGVUeXBlKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihQcm9maWxlci5Qcm9maWxlVHlwZS5FdmVudHMuUmVtb3ZlUHJvZmlsZUhlYWRlcix0aGlzLl9vblByb2ZpbGVIZWFkZXJSZW1vdmVkLHRoaXMpO3RoaXMuZGlzcG9zZSgpO31lbHNle3RoaXMuX3VwZGF0ZUNvbnRyb2xzKCk7fX0KZGlzcG9zZSgpe3RoaXMuX2xpbmtpZmllci5kaXNwb3NlKCk7dGhpcy5fcG9wb3ZlckhlbHBlci5kaXNwb3NlKCk7aWYodGhpcy5fYWxsb2NhdGlvblN0YWNrVmlldyl7dGhpcy5fYWxsb2NhdGlvblN0YWNrVmlldy5jbGVhcigpO3RoaXMuX2FsbG9jYXRpb25EYXRhR3JpZC5kaXNwb3NlKCk7fQppZih0aGlzLl90cmFja2luZ092ZXJ2aWV3R3JpZCkKdGhpcy5fdHJhY2tpbmdPdmVydmlld0dyaWQuZGlzcG9zZSgpO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuUGVyc3BlY3RpdmU9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGUpe3RoaXMuX3RpdGxlPXRpdGxlO30KYWN0aXZhdGUoaGVhcFNuYXBzaG90Vmlldyl7fQpkZWFjdGl2YXRlKGhlYXBTbmFwc2hvdFZpZXcpe2hlYXBTbmFwc2hvdFZpZXcuX2Jhc2VTZWxlY3Quc2V0VmlzaWJsZShmYWxzZSk7aGVhcFNuYXBzaG90Vmlldy5fZmlsdGVyU2VsZWN0LnNldFZpc2libGUoZmFsc2UpO2hlYXBTbmFwc2hvdFZpZXcuX2NsYXNzTmFtZUZpbHRlci5zZXRWaXNpYmxlKGZhbHNlKTtpZihoZWFwU25hcHNob3RWaWV3Ll90cmFja2luZ092ZXJ2aWV3R3JpZCkKaGVhcFNuYXBzaG90Vmlldy5fdHJhY2tpbmdPdmVydmlld0dyaWQuZGV0YWNoKCk7aWYoaGVhcFNuYXBzaG90Vmlldy5fYWxsb2NhdGlvbldpZGdldCkKaGVhcFNuYXBzaG90Vmlldy5fYWxsb2NhdGlvbldpZGdldC5kZXRhY2goKTtpZihoZWFwU25hcHNob3RWaWV3Ll9zdGF0aXN0aWNzVmlldykKaGVhcFNuYXBzaG90Vmlldy5fc3RhdGlzdGljc1ZpZXcuZGV0YWNoKCk7aGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuZGV0YWNoKCk7aGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuZGV0YWNoQ2hpbGRXaWRnZXRzKCk7fQptYXN0ZXJHcmlkKGhlYXBTbmFwc2hvdFZpZXcpe3JldHVybiBudWxsO30KdGl0bGUoKXtyZXR1cm4gdGhpcy5fdGl0bGU7fQpzdXBwb3J0c1NlYXJjaCgpe3JldHVybiBmYWxzZTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LlN1bW1hcnlQZXJzcGVjdGl2ZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuUGVyc3BlY3RpdmV7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ1N1bW1hcnknKSk7fQphY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KXtoZWFwU25hcHNob3RWaWV3Ll9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KGhlYXBTbmFwc2hvdFZpZXcuX2NvbnN0cnVjdG9yc1dpZGdldCk7aGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldChoZWFwU25hcHNob3RWaWV3Ll9vYmplY3REZXRhaWxzVmlldyk7aGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuc2hvdyhoZWFwU25hcHNob3RWaWV3Ll9zZWFyY2hhYmxlVmlldy5lbGVtZW50KTtoZWFwU25hcHNob3RWaWV3Ll9maWx0ZXJTZWxlY3Quc2V0VmlzaWJsZSh0cnVlKTtoZWFwU25hcHNob3RWaWV3Ll9jbGFzc05hbWVGaWx0ZXIuc2V0VmlzaWJsZSh0cnVlKTtpZighaGVhcFNuYXBzaG90Vmlldy5fdHJhY2tpbmdPdmVydmlld0dyaWQpCnJldHVybjtoZWFwU25hcHNob3RWaWV3Ll90cmFja2luZ092ZXJ2aWV3R3JpZC5zaG93KGhlYXBTbmFwc2hvdFZpZXcuX3NlYXJjaGFibGVWaWV3LmVsZW1lbnQsaGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuZWxlbWVudCk7aGVhcFNuYXBzaG90Vmlldy5fdHJhY2tpbmdPdmVydmlld0dyaWQudXBkYXRlKCk7aGVhcFNuYXBzaG90Vmlldy5fdHJhY2tpbmdPdmVydmlld0dyaWQuX3VwZGF0ZUdyaWQoKTt9Cm1hc3RlckdyaWQoaGVhcFNuYXBzaG90Vmlldyl7cmV0dXJuIGhlYXBTbmFwc2hvdFZpZXcuX2NvbnN0cnVjdG9yc0RhdGFHcmlkO30Kc3VwcG9ydHNTZWFyY2goKXtyZXR1cm4gdHJ1ZTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LkNvbXBhcmlzb25QZXJzcGVjdGl2ZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuUGVyc3BlY3RpdmV7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ0NvbXBhcmlzb24nKSk7fQphY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KXtoZWFwU25hcHNob3RWaWV3Ll9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KGhlYXBTbmFwc2hvdFZpZXcuX2RpZmZXaWRnZXQpO2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQoaGVhcFNuYXBzaG90Vmlldy5fb2JqZWN0RGV0YWlsc1ZpZXcpO2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNob3coaGVhcFNuYXBzaG90Vmlldy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7aGVhcFNuYXBzaG90Vmlldy5fYmFzZVNlbGVjdC5zZXRWaXNpYmxlKHRydWUpO2hlYXBTbmFwc2hvdFZpZXcuX2NsYXNzTmFtZUZpbHRlci5zZXRWaXNpYmxlKHRydWUpO30KbWFzdGVyR3JpZChoZWFwU25hcHNob3RWaWV3KXtyZXR1cm4gaGVhcFNuYXBzaG90Vmlldy5fZGlmZkRhdGFHcmlkO30Kc3VwcG9ydHNTZWFyY2goKXtyZXR1cm4gdHJ1ZTt9fTtQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LkNvbnRhaW5tZW50UGVyc3BlY3RpdmU9Y2xhc3MgZXh0ZW5kcyBQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LlBlcnNwZWN0aXZle2NvbnN0cnVjdG9yKCl7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdDb250YWlubWVudCcpKTt9CmFjdGl2YXRlKGhlYXBTbmFwc2hvdFZpZXcpe2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQoaGVhcFNuYXBzaG90Vmlldy5fY29udGFpbm1lbnRXaWRnZXQpO2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQoaGVhcFNuYXBzaG90Vmlldy5fb2JqZWN0RGV0YWlsc1ZpZXcpO2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNob3coaGVhcFNuYXBzaG90Vmlldy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7fQptYXN0ZXJHcmlkKGhlYXBTbmFwc2hvdFZpZXcpe3JldHVybiBoZWFwU25hcHNob3RWaWV3Ll9jb250YWlubWVudERhdGFHcmlkO319O1Byb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuQWxsb2NhdGlvblBlcnNwZWN0aXZlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90Vmlldy5QZXJzcGVjdGl2ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKENvbW1vbi5VSVN0cmluZygnQWxsb2NhdGlvbicpKTt0aGlzLl9hbGxvY2F0aW9uU3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KGZhbHNlLHRydWUsJ2hlYXBTbmFwc2hvdEFsbG9jYXRpb25TcGxpdFZpZXdTdGF0ZScsMjAwLDIwMCk7dGhpcy5fYWxsb2NhdGlvblNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQobmV3IFVJLlZCb3goKSk7fQphY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KXt0aGlzLl9hbGxvY2F0aW9uU3BsaXRXaWRnZXQuc2V0TWFpbldpZGdldChoZWFwU25hcHNob3RWaWV3Ll9hbGxvY2F0aW9uV2lkZ2V0KTtoZWFwU25hcHNob3RWaWV3Ll9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KGhlYXBTbmFwc2hvdFZpZXcuX2NvbnN0cnVjdG9yc1dpZGdldCk7aGVhcFNuYXBzaG90Vmlldy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldChoZWFwU25hcHNob3RWaWV3Ll9vYmplY3REZXRhaWxzVmlldyk7Y29uc3QgYWxsb2NhdGVkT2JqZWN0c1ZpZXc9bmV3IFVJLlZCb3goKTtjb25zdCByZXNpemVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2hlYXAtc25hcHNob3Qtdmlldy1yZXNpemVyJyk7Y29uc3QgdGl0bGU9cmVzaXplci5jcmVhdGVDaGlsZCgnZGl2JywndGl0bGUnKS5jcmVhdGVDaGlsZCgnc3BhbicpO3RpdGxlLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTGl2ZSBvYmplY3RzJyk7dGhpcy5fYWxsb2NhdGlvblNwbGl0V2lkZ2V0LmhpZGVEZWZhdWx0UmVzaXplcigpO3RoaXMuX2FsbG9jYXRpb25TcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcihyZXNpemVyKTthbGxvY2F0ZWRPYmplY3RzVmlldy5lbGVtZW50LmFwcGVuZENoaWxkKHJlc2l6ZXIpO2hlYXBTbmFwc2hvdFZpZXcuX3NwbGl0V2lkZ2V0LnNob3coYWxsb2NhdGVkT2JqZWN0c1ZpZXcuZWxlbWVudCk7dGhpcy5fYWxsb2NhdGlvblNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQoYWxsb2NhdGVkT2JqZWN0c1ZpZXcpO3RoaXMuX2FsbG9jYXRpb25TcGxpdFdpZGdldC5zaG93KGhlYXBTbmFwc2hvdFZpZXcuX3NlYXJjaGFibGVWaWV3LmVsZW1lbnQpO2hlYXBTbmFwc2hvdFZpZXcuX2NvbnN0cnVjdG9yc0RhdGFHcmlkLmNsZWFyKCk7Y29uc3Qgc2VsZWN0ZWROb2RlPWhlYXBTbmFwc2hvdFZpZXcuX2FsbG9jYXRpb25EYXRhR3JpZC5zZWxlY3RlZE5vZGU7aWYoc2VsZWN0ZWROb2RlKQpoZWFwU25hcHNob3RWaWV3Ll9jb25zdHJ1Y3RvcnNEYXRhR3JpZC5zZXRBbGxvY2F0aW9uTm9kZUlkKHNlbGVjdGVkTm9kZS5hbGxvY2F0aW9uTm9kZUlkKCkpO30KZGVhY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KXt0aGlzLl9hbGxvY2F0aW9uU3BsaXRXaWRnZXQuZGV0YWNoKCk7c3VwZXIuZGVhY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KTt9Cm1hc3RlckdyaWQoaGVhcFNuYXBzaG90Vmlldyl7cmV0dXJuIGhlYXBTbmFwc2hvdFZpZXcuX2FsbG9jYXRpb25EYXRhR3JpZDt9fTtQcm9maWxlci5IZWFwU25hcHNob3RWaWV3LlN0YXRpc3RpY3NQZXJzcGVjdGl2ZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLkhlYXBTbmFwc2hvdFZpZXcuUGVyc3BlY3RpdmV7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ1N0YXRpc3RpY3MnKSk7fQphY3RpdmF0ZShoZWFwU25hcHNob3RWaWV3KXtoZWFwU25hcHNob3RWaWV3Ll9zdGF0aXN0aWNzVmlldy5zaG93KGhlYXBTbmFwc2hvdFZpZXcuX3NlYXJjaGFibGVWaWV3LmVsZW1lbnQpO30KbWFzdGVyR3JpZChoZWFwU25hcHNob3RWaWV3KXtyZXR1cm4gbnVsbDt9fTtQcm9maWxlci5IZWFwU25hcHNob3RQcm9maWxlVHlwZT1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVUeXBle2NvbnN0cnVjdG9yKGlkLHRpdGxlKXtzdXBlcihpZHx8UHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUuVHlwZUlkLHRpdGxlfHxsc2BIZWFwIHNuYXBzaG90YCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuSGVhcFByb2ZpbGVyTW9kZWwsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuSGVhcFByb2ZpbGVyTW9kZWwsU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5SZXNldFByb2ZpbGVzLHRoaXMuX3Jlc2V0UHJvZmlsZXMsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuSGVhcFByb2ZpbGVyTW9kZWwsU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5BZGRIZWFwU25hcHNob3RDaHVuayx0aGlzLl9hZGRIZWFwU25hcHNob3RDaHVuayx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5IZWFwUHJvZmlsZXJNb2RlbCxTREsuSGVhcFByb2ZpbGVyTW9kZWwuRXZlbnRzLlJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzLHRoaXMuX3JlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzLHRoaXMpO30KbW9kZWxBZGRlZChoZWFwUHJvZmlsZXJNb2RlbCl7aGVhcFByb2ZpbGVyTW9kZWwuZW5hYmxlKCk7fQptb2RlbFJlbW92ZWQoaGVhcFByb2ZpbGVyTW9kZWwpe30KZ2V0UHJvZmlsZXMoKXtyZXR1cm4oc3VwZXIuZ2V0UHJvZmlsZXMoKSk7fQpmaWxlRXh0ZW5zaW9uKCl7cmV0dXJuJy5oZWFwc25hcHNob3QnO30KZ2V0IGJ1dHRvblRvb2x0aXAoKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdUYWtlIGhlYXAgc25hcHNob3QnKTt9CmlzSW5zdGFudFByb2ZpbGUoKXtyZXR1cm4gdHJ1ZTt9CmJ1dHRvbkNsaWNrZWQoKXt0aGlzLl90YWtlSGVhcFNuYXBzaG90KCk7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5Qcm9maWxlc0hlYXBQcm9maWxlVGFrZW4pO3JldHVybiBmYWxzZTt9CmdldCB0cmVlSXRlbVRpdGxlKCl7cmV0dXJuIENvbW1vbi5VSVN0cmluZygnSEVBUCBTTkFQU0hPVFMnKTt9CmdldCBkZXNjcmlwdGlvbigpe3JldHVybiBDb21tb24uVUlTdHJpbmcoJ0hlYXAgc25hcHNob3QgcHJvZmlsZXMgc2hvdyBtZW1vcnkgZGlzdHJpYnV0aW9uIGFtb25nIHlvdXIgcGFnZVwncyBKYXZhU2NyaXB0IG9iamVjdHMgYW5kIHJlbGF0ZWQgRE9NIG5vZGVzLicpO30KY3JlYXRlUHJvZmlsZUxvYWRlZEZyb21GaWxlKHRpdGxlKXtyZXR1cm4gbmV3IFByb2ZpbGVyLkhlYXBQcm9maWxlSGVhZGVyKG51bGwsdGhpcyx0aXRsZSk7fQphc3luYyBfdGFrZUhlYXBTbmFwc2hvdCgpe2lmKHRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKSkKcmV0dXJuO2NvbnN0IGhlYXBQcm9maWxlck1vZGVsPVVJLmNvbnRleHQuZmxhdm9yKFNESy5IZWFwUHJvZmlsZXJNb2RlbCk7aWYoIWhlYXBQcm9maWxlck1vZGVsKQpyZXR1cm47bGV0IHByb2ZpbGU9bmV3IFByb2ZpbGVyLkhlYXBQcm9maWxlSGVhZGVyKGhlYXBQcm9maWxlck1vZGVsLHRoaXMpO3RoaXMuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQocHJvZmlsZSk7dGhpcy5hZGRQcm9maWxlKHByb2ZpbGUpO3Byb2ZpbGUudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnU25hcHNob3R0aW5nXHUyMDI2JykpO2F3YWl0IGhlYXBQcm9maWxlck1vZGVsLnRha2VIZWFwU25hcHNob3QodHJ1ZSk7cHJvZmlsZT10aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCk7cHJvZmlsZS50aXRsZT1Db21tb24uVUlTdHJpbmcoJ1NuYXBzaG90ICVkJyxwcm9maWxlLnVpZCk7cHJvZmlsZS5fZmluaXNoTG9hZCgpO3RoaXMuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQobnVsbCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZVR5cGUuRXZlbnRzLlByb2ZpbGVDb21wbGV0ZSxwcm9maWxlKTt9Cl9hZGRIZWFwU25hcHNob3RDaHVuayhldmVudCl7aWYoIXRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKSkKcmV0dXJuO2NvbnN0IGNodW5rPShldmVudC5kYXRhKTt0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkudHJhbnNmZXJDaHVuayhjaHVuayk7fQpfcmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MoZXZlbnQpe2NvbnN0IHByb2ZpbGU9dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpO2lmKCFwcm9maWxlKQpyZXR1cm47Y29uc3QgZGF0YT0oZXZlbnQuZGF0YSk7cHJvZmlsZS51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCclLjBmJSUnLChkYXRhLmRvbmUvZGF0YS50b3RhbCkqMTAwKSx0cnVlKTtpZihkYXRhLmZpbmlzaGVkKQpwcm9maWxlLl9wcmVwYXJlVG9Mb2FkKCk7fQpfcmVzZXRQcm9maWxlcyhldmVudCl7Y29uc3QgaGVhcFByb2ZpbGVyTW9kZWw9KGV2ZW50LmRhdGEpO2Zvcihjb25zdCBwcm9maWxlIG9mIHRoaXMuZ2V0UHJvZmlsZXMoKSl7aWYocHJvZmlsZS5oZWFwUHJvZmlsZXJNb2RlbCgpPT09aGVhcFByb2ZpbGVyTW9kZWwpCnRoaXMucmVtb3ZlUHJvZmlsZShwcm9maWxlKTt9fQpfc25hcHNob3RSZWNlaXZlZChwcm9maWxlKXtpZih0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCk9PT1wcm9maWxlKQp0aGlzLnNldFByb2ZpbGVCZWluZ1JlY29yZGVkKG51bGwpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLkhlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlNuYXBzaG90UmVjZWl2ZWQscHJvZmlsZSk7fX07UHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUuVHlwZUlkPSdIRUFQJztQcm9maWxlci5IZWFwU25hcHNob3RQcm9maWxlVHlwZS5TbmFwc2hvdFJlY2VpdmVkPSdTbmFwc2hvdFJlY2VpdmVkJztQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlPWNsYXNzIGV4dGVuZHMgUHJvZmlsZXIuSGVhcFNuYXBzaG90UHJvZmlsZVR5cGV7Y29uc3RydWN0b3IoKXtzdXBlcihQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlR5cGVJZCxsc2BBbGxvY2F0aW9uIGluc3RydW1lbnRhdGlvbiBvbiB0aW1lbGluZWApO3RoaXMuX3JlY29yZEFsbG9jYXRpb25TdGFja3NTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdyZWNvcmRBbGxvY2F0aW9uU3RhY2tzJyxmYWxzZSk7fQptb2RlbEFkZGVkKGhlYXBQcm9maWxlck1vZGVsKXtzdXBlci5tb2RlbEFkZGVkKGhlYXBQcm9maWxlck1vZGVsKTtoZWFwUHJvZmlsZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5IZWFwUHJvZmlsZXJNb2RlbC5FdmVudHMuSGVhcFN0YXRzVXBkYXRlLHRoaXMuX2hlYXBTdGF0c1VwZGF0ZSx0aGlzKTtoZWFwUHJvZmlsZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5IZWFwUHJvZmlsZXJNb2RlbC5FdmVudHMuTGFzdFNlZW5PYmplY3RJZCx0aGlzLl9sYXN0U2Vlbk9iamVjdElkLHRoaXMpO30KbW9kZWxSZW1vdmVkKGhlYXBQcm9maWxlck1vZGVsKXtzdXBlci5tb2RlbFJlbW92ZWQoaGVhcFByb2ZpbGVyTW9kZWwpO2hlYXBQcm9maWxlck1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5IZWFwU3RhdHNVcGRhdGUsdGhpcy5faGVhcFN0YXRzVXBkYXRlLHRoaXMpO2hlYXBQcm9maWxlck1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkhlYXBQcm9maWxlck1vZGVsLkV2ZW50cy5MYXN0U2Vlbk9iamVjdElkLHRoaXMuX2xhc3RTZWVuT2JqZWN0SWQsdGhpcyk7fQpfaGVhcFN0YXRzVXBkYXRlKGV2ZW50KXtpZighdGhpcy5fcHJvZmlsZVNhbXBsZXMpCnJldHVybjtjb25zdCBzYW1wbGVzPShldmVudC5kYXRhKTtsZXQgaW5kZXg7Zm9yKGxldCBpPTA7aTxzYW1wbGVzLmxlbmd0aDtpKz0zKXtpbmRleD1zYW1wbGVzW2ldO2NvbnN0IHNpemU9c2FtcGxlc1tpKzJdO3RoaXMuX3Byb2ZpbGVTYW1wbGVzLnNpemVzW2luZGV4XT1zaXplO2lmKCF0aGlzLl9wcm9maWxlU2FtcGxlcy5tYXhbaW5kZXhdKQp0aGlzLl9wcm9maWxlU2FtcGxlcy5tYXhbaW5kZXhdPXNpemU7fX0KX2xhc3RTZWVuT2JqZWN0SWQoZXZlbnQpe2NvbnN0IHByb2ZpbGVTYW1wbGVzPXRoaXMuX3Byb2ZpbGVTYW1wbGVzO2lmKCFwcm9maWxlU2FtcGxlcykKcmV0dXJuO2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO2NvbnN0IGN1cnJlbnRJbmRleD1NYXRoLm1heChwcm9maWxlU2FtcGxlcy5pZHMubGVuZ3RoLHByb2ZpbGVTYW1wbGVzLm1heC5sZW5ndGgtMSk7cHJvZmlsZVNhbXBsZXMuaWRzW2N1cnJlbnRJbmRleF09ZGF0YS5sYXN0U2Vlbk9iamVjdElkO2lmKCFwcm9maWxlU2FtcGxlcy5tYXhbY3VycmVudEluZGV4XSl7cHJvZmlsZVNhbXBsZXMubWF4W2N1cnJlbnRJbmRleF09MDtwcm9maWxlU2FtcGxlcy5zaXplc1tjdXJyZW50SW5kZXhdPTA7fQpwcm9maWxlU2FtcGxlcy50aW1lc3RhbXBzW2N1cnJlbnRJbmRleF09ZGF0YS50aW1lc3RhbXA7aWYocHJvZmlsZVNhbXBsZXMudG90YWxUaW1lPGRhdGEudGltZXN0YW1wLXByb2ZpbGVTYW1wbGVzLnRpbWVzdGFtcHNbMF0pCnByb2ZpbGVTYW1wbGVzLnRvdGFsVGltZSo9Mjt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLkhlYXBTdGF0c1VwZGF0ZSx0aGlzLl9wcm9maWxlU2FtcGxlcyk7dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpLnVwZGF0ZVN0YXR1cyhudWxsLHRydWUpO30KaGFzVGVtcG9yYXJ5Vmlldygpe3JldHVybiB0cnVlO30KZ2V0IGJ1dHRvblRvb2x0aXAoKXtyZXR1cm4gdGhpcy5fcmVjb3JkaW5nP2xzYFN0b3AgcmVjb3JkaW5nIGhlYXAgcHJvZmlsZWA6bHNgU3RhcnQgcmVjb3JkaW5nIGhlYXAgcHJvZmlsZWA7fQppc0luc3RhbnRQcm9maWxlKCl7cmV0dXJuIGZhbHNlO30KYnV0dG9uQ2xpY2tlZCgpe3JldHVybiB0aGlzLl90b2dnbGVSZWNvcmRpbmcoKTt9Cl9zdGFydFJlY29yZGluZ1Byb2ZpbGUoKXtpZih0aGlzLnByb2ZpbGVCZWluZ1JlY29yZGVkKCkpCnJldHVybjtjb25zdCBoZWFwUHJvZmlsZXJNb2RlbD10aGlzLl9hZGROZXdQcm9maWxlKCk7aWYoIWhlYXBQcm9maWxlck1vZGVsKQpyZXR1cm47aGVhcFByb2ZpbGVyTW9kZWwuc3RhcnRUcmFja2luZ0hlYXBPYmplY3RzKHRoaXMuX3JlY29yZEFsbG9jYXRpb25TdGFja3NTZXR0aW5nLmdldCgpKTt9CmN1c3RvbUNvbnRlbnQoKXtyZXR1cm4gVUkuU2V0dGluZ3NVSS5jcmVhdGVTZXR0aW5nQ2hlY2tib3gobHNgUmVjb3JkIGFsbG9jYXRpb24gc3RhY2tzIChleHRyYSBwZXJmb3JtYW5jZSBvdmVyaGVhZClgLHRoaXMuX3JlY29yZEFsbG9jYXRpb25TdGFja3NTZXR0aW5nLHRydWUpO30KX2FkZE5ld1Byb2ZpbGUoKXtjb25zdCBoZWFwUHJvZmlsZXJNb2RlbD1VSS5jb250ZXh0LmZsYXZvcihTREsuSGVhcFByb2ZpbGVyTW9kZWwpO2lmKCFoZWFwUHJvZmlsZXJNb2RlbCkKcmV0dXJuIG51bGw7dGhpcy5zZXRQcm9maWxlQmVpbmdSZWNvcmRlZChuZXcgUHJvZmlsZXIuSGVhcFByb2ZpbGVIZWFkZXIoaGVhcFByb2ZpbGVyTW9kZWwsdGhpcyx1bmRlZmluZWQpKTt0aGlzLl9wcm9maWxlU2FtcGxlcz1uZXcgUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5TYW1wbGVzKCk7dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpLl9wcm9maWxlU2FtcGxlcz10aGlzLl9wcm9maWxlU2FtcGxlczt0aGlzLl9yZWNvcmRpbmc9dHJ1ZTt0aGlzLmFkZFByb2ZpbGUoKHRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKSkpO3RoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKS51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCdSZWNvcmRpbmdcdTIwMjYnKSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5UcmFja2luZ1N0YXJ0ZWQpO3JldHVybiBoZWFwUHJvZmlsZXJNb2RlbDt9CmFzeW5jIF9zdG9wUmVjb3JkaW5nUHJvZmlsZSgpe3RoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKS51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCdTbmFwc2hvdHRpbmdcdTIwMjYnKSk7Y29uc3Qgc3RvcFByb21pc2U9dGhpcy5wcm9maWxlQmVpbmdSZWNvcmRlZCgpLmhlYXBQcm9maWxlck1vZGVsKCkuc3RvcFRyYWNraW5nSGVhcE9iamVjdHModHJ1ZSk7dGhpcy5fcmVjb3JkaW5nPWZhbHNlO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLlRyYWNraW5nSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUuVHJhY2tpbmdTdG9wcGVkKTthd2FpdCBzdG9wUHJvbWlzZTtjb25zdCBwcm9maWxlPXRoaXMucHJvZmlsZUJlaW5nUmVjb3JkZWQoKTtpZighcHJvZmlsZSkKcmV0dXJuO3Byb2ZpbGUuX2ZpbmlzaExvYWQoKTt0aGlzLl9wcm9maWxlU2FtcGxlcz1udWxsO3RoaXMuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQobnVsbCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZVR5cGUuRXZlbnRzLlByb2ZpbGVDb21wbGV0ZSxwcm9maWxlKTt9Cl90b2dnbGVSZWNvcmRpbmcoKXtpZih0aGlzLl9yZWNvcmRpbmcpCnRoaXMuX3N0b3BSZWNvcmRpbmdQcm9maWxlKCk7ZWxzZQp0aGlzLl9zdGFydFJlY29yZGluZ1Byb2ZpbGUoKTtyZXR1cm4gdGhpcy5fcmVjb3JkaW5nO30KZmlsZUV4dGVuc2lvbigpe3JldHVybicuaGVhcHRpbWVsaW5lJzt9CmdldCB0cmVlSXRlbVRpdGxlKCl7cmV0dXJuIGxzYEFMTE9DQVRJT04gVElNRUxJTkVTYDt9CmdldCBkZXNjcmlwdGlvbigpe3JldHVybiBsc2AKICAgICAgICBBbGxvY2F0aW9uIHRpbWVsaW5lcyBzaG93IGluc3RydW1lbnRlZCBKYXZhU2NyaXB0IG1lbW9yeSBhbGxvY2F0aW9ucyBvdmVyIHRpbWUuCiAgICAgICAgT25jZSBwcm9maWxlIGlzIHJlY29yZGVkIHlvdSBjYW4gc2VsZWN0IGEgdGltZSBpbnRlcnZhbCB0byBzZWUgb2JqZWN0cyB0aGF0CiAgICAgICAgd2VyZSBhbGxvY2F0ZWQgd2l0aGluIGl0IGFuZCBzdGlsbCBhbGl2ZSBieSB0aGUgZW5kIG9mIHJlY29yZGluZy4KICAgICAgICBVc2UgdGhpcyBwcm9maWxlIHR5cGUgdG8gaXNvbGF0ZSBtZW1vcnkgbGVha3MuYDt9Cl9yZXNldFByb2ZpbGVzKGV2ZW50KXtjb25zdCB3YXNSZWNvcmRpbmc9dGhpcy5fcmVjb3JkaW5nO3RoaXMuc2V0UHJvZmlsZUJlaW5nUmVjb3JkZWQobnVsbCk7c3VwZXIuX3Jlc2V0UHJvZmlsZXMoZXZlbnQpO3RoaXMuX3Byb2ZpbGVTYW1wbGVzPW51bGw7aWYod2FzUmVjb3JkaW5nKQp0aGlzLl9hZGROZXdQcm9maWxlKCk7fQpwcm9maWxlQmVpbmdSZWNvcmRlZFJlbW92ZWQoKXt0aGlzLl9zdG9wUmVjb3JkaW5nUHJvZmlsZSgpO3RoaXMuX3Byb2ZpbGVTYW1wbGVzPW51bGw7fX07UHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5UeXBlSWQ9J0hFQVAtUkVDT1JEJztQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLkhlYXBTdGF0c1VwZGF0ZT0nSGVhcFN0YXRzVXBkYXRlJztQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlRyYWNraW5nU3RhcnRlZD0nVHJhY2tpbmdTdGFydGVkJztQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlRyYWNraW5nU3RvcHBlZD0nVHJhY2tpbmdTdG9wcGVkJztQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlNhbXBsZXM9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnNpemVzPVtdO3RoaXMuaWRzPVtdO3RoaXMudGltZXN0YW1wcz1bXTt0aGlzLm1heD1bXTt0aGlzLnRvdGFsVGltZT0zMDAwMDt9fTtQcm9maWxlci5IZWFwUHJvZmlsZUhlYWRlcj1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVIZWFkZXJ7Y29uc3RydWN0b3IoaGVhcFByb2ZpbGVyTW9kZWwsdHlwZSx0aXRsZSl7c3VwZXIodHlwZSx0aXRsZXx8Q29tbW9uLlVJU3RyaW5nKCdTbmFwc2hvdCAlZCcsdHlwZS5uZXh0UHJvZmlsZVVpZCgpKSk7dGhpcy5faGVhcFByb2ZpbGVyTW9kZWw9aGVhcFByb2ZpbGVyTW9kZWw7dGhpcy5tYXhKU09iamVjdElkPS0xO3RoaXMuX3dvcmtlclByb3h5PW51bGw7dGhpcy5fcmVjZWl2ZXI9bnVsbDt0aGlzLl9zbmFwc2hvdFByb3h5PW51bGw7dGhpcy5fbG9hZFByb21pc2U9bmV3IFByb21pc2UocmVzb2x2ZT0+dGhpcy5fZnVsZmlsbExvYWQ9cmVzb2x2ZSk7dGhpcy5fdG90YWxOdW1iZXJPZkNodW5rcz0wO3RoaXMuX2J1ZmZlcmVkV3JpdGVyPW51bGw7dGhpcy5fdGVtcEZpbGU9bnVsbDt9CmhlYXBQcm9maWxlck1vZGVsKCl7cmV0dXJuIHRoaXMuX2hlYXBQcm9maWxlck1vZGVsO30KY3JlYXRlU2lkZWJhclRyZWVFbGVtZW50KGRhdGFEaXNwbGF5RGVsZWdhdGUpe3JldHVybiBuZXcgUHJvZmlsZXIuUHJvZmlsZVNpZGViYXJUcmVlRWxlbWVudChkYXRhRGlzcGxheURlbGVnYXRlLHRoaXMsJ2hlYXAtc25hcHNob3Qtc2lkZWJhci10cmVlLWl0ZW0nKTt9CmNyZWF0ZVZpZXcoZGF0YURpc3BsYXlEZWxlZ2F0ZSl7cmV0dXJuIG5ldyBQcm9maWxlci5IZWFwU25hcHNob3RWaWV3KGRhdGFEaXNwbGF5RGVsZWdhdGUsdGhpcyk7fQpfcHJlcGFyZVRvTG9hZCgpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLl9yZWNlaXZlciwnQWxyZWFkeSBsb2FkaW5nJyk7dGhpcy5fc2V0dXBXb3JrZXIoKTt0aGlzLnVwZGF0ZVN0YXR1cyhDb21tb24uVUlTdHJpbmcoJ0xvYWRpbmdcdTIwMjYnKSx0cnVlKTt9Cl9maW5pc2hMb2FkKCl7aWYoIXRoaXMuX3dhc0Rpc3Bvc2VkKQp0aGlzLl9yZWNlaXZlci5jbG9zZSgpO2lmKCF0aGlzLl9idWZmZXJlZFdyaXRlcikKcmV0dXJuO3RoaXMuX2RpZFdyaXRlVG9UZW1wRmlsZSh0aGlzLl9idWZmZXJlZFdyaXRlcik7fQpfZGlkV3JpdGVUb1RlbXBGaWxlKHRlbXBGaWxlKXtpZih0aGlzLl93YXNEaXNwb3NlZCl7aWYodGVtcEZpbGUpCnRlbXBGaWxlLnJlbW92ZSgpO3JldHVybjt9CnRoaXMuX3RlbXBGaWxlPXRlbXBGaWxlO2lmKCF0ZW1wRmlsZSkKdGhpcy5fZmFpbGVkVG9DcmVhdGVUZW1wRmlsZT10cnVlO2lmKHRoaXMuX29uVGVtcEZpbGVSZWFkeSl7dGhpcy5fb25UZW1wRmlsZVJlYWR5KCk7dGhpcy5fb25UZW1wRmlsZVJlYWR5PW51bGw7fX0KX3NldHVwV29ya2VyKCl7ZnVuY3Rpb24gc2V0UHJvZmlsZVdhaXQoZXZlbnQpe3RoaXMudXBkYXRlU3RhdHVzKG51bGwsZXZlbnQuZGF0YSk7fQpjb25zb2xlLmFzc2VydCghdGhpcy5fd29ya2VyUHJveHksJ0hlYXBTbmFwc2hvdFdvcmtlclByb3h5IGFscmVhZHkgZXhpc3RzJyk7dGhpcy5fd29ya2VyUHJveHk9bmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFdvcmtlclByb3h5KHRoaXMuX2hhbmRsZVdvcmtlckV2ZW50LmJpbmQodGhpcykpO3RoaXMuX3dvcmtlclByb3h5LmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuSGVhcFNuYXBzaG90V29ya2VyUHJveHkuRXZlbnRzLldhaXQsc2V0UHJvZmlsZVdhaXQsdGhpcyk7dGhpcy5fcmVjZWl2ZXI9dGhpcy5fd29ya2VyUHJveHkuY3JlYXRlTG9hZGVyKHRoaXMudWlkLHRoaXMuX3NuYXBzaG90UmVjZWl2ZWQuYmluZCh0aGlzKSk7fQpfaGFuZGxlV29ya2VyRXZlbnQoZXZlbnROYW1lLGRhdGEpe2lmKEhlYXBTbmFwc2hvdE1vZGVsLkhlYXBTbmFwc2hvdFByb2dyZXNzRXZlbnQuQnJva2VuU25hcHNob3Q9PT1ldmVudE5hbWUpe2NvbnN0IGVycm9yPShkYXRhKTtDb21tb24uY29uc29sZS5lcnJvcihlcnJvcik7cmV0dXJuO30KaWYoSGVhcFNuYXBzaG90TW9kZWwuSGVhcFNuYXBzaG90UHJvZ3Jlc3NFdmVudC5VcGRhdGUhPT1ldmVudE5hbWUpCnJldHVybjtjb25zdCBzdWJ0aXRsZT0oZGF0YSk7dGhpcy51cGRhdGVTdGF0dXMoc3VidGl0bGUpO30KZGlzcG9zZSgpe2lmKHRoaXMuX3dvcmtlclByb3h5KQp0aGlzLl93b3JrZXJQcm94eS5kaXNwb3NlKCk7dGhpcy5yZW1vdmVUZW1wRmlsZSgpO3RoaXMuX3dhc0Rpc3Bvc2VkPXRydWU7fQpfZGlkQ29tcGxldGVTbmFwc2hvdFRyYW5zZmVyKCl7aWYoIXRoaXMuX3NuYXBzaG90UHJveHkpCnJldHVybjt0aGlzLnVwZGF0ZVN0YXR1cyhOdW1iZXIuYnl0ZXNUb1N0cmluZyh0aGlzLl9zbmFwc2hvdFByb3h5LnRvdGFsU2l6ZSksZmFsc2UpO30KdHJhbnNmZXJDaHVuayhjaHVuayl7aWYoIXRoaXMuX2J1ZmZlcmVkV3JpdGVyKQp0aGlzLl9idWZmZXJlZFdyaXRlcj1uZXcgQmluZGluZ3MuVGVtcEZpbGUoKTt0aGlzLl9idWZmZXJlZFdyaXRlci53cml0ZShbY2h1bmtdKTsrK3RoaXMuX3RvdGFsTnVtYmVyT2ZDaHVua3M7dGhpcy5fcmVjZWl2ZXIud3JpdGUoY2h1bmspO30KX3NuYXBzaG90UmVjZWl2ZWQoc25hcHNob3RQcm94eSl7aWYodGhpcy5fd2FzRGlzcG9zZWQpCnJldHVybjt0aGlzLl9yZWNlaXZlcj1udWxsO3RoaXMuX3NuYXBzaG90UHJveHk9c25hcHNob3RQcm94eTt0aGlzLm1heEpTT2JqZWN0SWQ9c25hcHNob3RQcm94eS5tYXhKU09iamVjdElkKCk7dGhpcy5fZGlkQ29tcGxldGVTbmFwc2hvdFRyYW5zZmVyKCk7dGhpcy5fd29ya2VyUHJveHkuc3RhcnRDaGVja2luZ0ZvckxvbmdSdW5uaW5nQ2FsbHMoKTt0aGlzLm5vdGlmeVNuYXBzaG90UmVjZWl2ZWQoKTt9Cm5vdGlmeVNuYXBzaG90UmVjZWl2ZWQoKXt0aGlzLl9mdWxmaWxsTG9hZCh0aGlzLl9zbmFwc2hvdFByb3h5KTt0aGlzLnByb2ZpbGVUeXBlKCkuX3NuYXBzaG90UmVjZWl2ZWQodGhpcyk7aWYodGhpcy5jYW5TYXZlVG9GaWxlKCkpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLlByb2ZpbGVIZWFkZXIuRXZlbnRzLlByb2ZpbGVSZWNlaXZlZCk7fQpjYW5TYXZlVG9GaWxlKCl7cmV0dXJuIXRoaXMuZnJvbUZpbGUoKSYmISF0aGlzLl9zbmFwc2hvdFByb3h5O30Kc2F2ZVRvRmlsZSgpe2NvbnN0IGZpbGVPdXRwdXRTdHJlYW09bmV3IEJpbmRpbmdzLkZpbGVPdXRwdXRTdHJlYW0oKTt0aGlzLl9maWxlTmFtZT10aGlzLl9maWxlTmFtZXx8J0hlYXAtJytuZXcgRGF0ZSgpLnRvSVNPODYwMUNvbXBhY3QoKSt0aGlzLnByb2ZpbGVUeXBlKCkuZmlsZUV4dGVuc2lvbigpO2ZpbGVPdXRwdXRTdHJlYW0ub3Blbih0aGlzLl9maWxlTmFtZSkudGhlbihvbk9wZW4uYmluZCh0aGlzKSk7YXN5bmMgZnVuY3Rpb24gb25PcGVuKGFjY2VwdGVkKXtpZighYWNjZXB0ZWQpCnJldHVybjtpZih0aGlzLl9mYWlsZWRUb0NyZWF0ZVRlbXBGaWxlKXtDb21tb24uY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG9wZW4gdGVtcCBmaWxlIHdpdGggaGVhcCBzbmFwc2hvdCcpO2ZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTtyZXR1cm47fQppZih0aGlzLl90ZW1wRmlsZSl7Y29uc3QgZXJyb3I9YXdhaXQgdGhpcy5fdGVtcEZpbGUuY29weVRvT3V0cHV0U3RyZWFtKGZpbGVPdXRwdXRTdHJlYW0sdGhpcy5fb25DaHVua1RyYW5zZmVycmVkLmJpbmQodGhpcykpO2lmKGVycm9yKQpDb21tb24uY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlYWQgaGVhcCBzbmFwc2hvdCBmcm9tIHRlbXAgZmlsZTogJytlcnJvci5tZXNzYWdlKTt0aGlzLl9kaWRDb21wbGV0ZVNuYXBzaG90VHJhbnNmZXIoKTtyZXR1cm47fQp0aGlzLl9vblRlbXBGaWxlUmVhZHk9b25PcGVuLmJpbmQodGhpcyxhY2NlcHRlZCk7dGhpcy5fdXBkYXRlU2F2ZVByb2dyZXNzKDAsMSk7fX0KX29uQ2h1bmtUcmFuc2ZlcnJlZChyZWFkZXIpe3RoaXMuX3VwZGF0ZVNhdmVQcm9ncmVzcyhyZWFkZXIubG9hZGVkU2l6ZSgpLHJlYWRlci5maWxlU2l6ZSgpKTt9Cl91cGRhdGVTYXZlUHJvZ3Jlc3ModmFsdWUsdG90YWwpe2NvbnN0IHBlcmNlbnRWYWx1ZT0oKHRvdGFsJiZ2YWx1ZS90b3RhbCkqMTAwKS50b0ZpeGVkKDApO3RoaXMudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnU2F2aW5nXHUyMDI2ICVkJSUnLHBlcmNlbnRWYWx1ZSkpO30KYXN5bmMgbG9hZEZyb21GaWxlKGZpbGUpe3RoaXMudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnTG9hZGluZ1x1MjAyNicpLHRydWUpO3RoaXMuX3NldHVwV29ya2VyKCk7Y29uc3QgcmVhZGVyPW5ldyBCaW5kaW5ncy5DaHVua2VkRmlsZVJlYWRlcihmaWxlLDEwMDAwMDAwKTtjb25zdCBzdWNjZXNzPWF3YWl0IHJlYWRlci5yZWFkKCh0aGlzLl9yZWNlaXZlcikpO2lmKCFzdWNjZXNzKQp0aGlzLnVwZGF0ZVN0YXR1cyhyZWFkZXIuZXJyb3IoKS5tZXNzYWdlKTtyZXR1cm4gc3VjY2Vzcz9udWxsOnJlYWRlci5lcnJvcigpO319O1Byb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZD1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoaGVhcFByb2ZpbGVIZWFkZXIpe3N1cGVyKCk7dGhpcy5lbGVtZW50LmlkPSdoZWFwLXJlY29yZGluZy12aWV3Jzt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGVhcC10cmFja2luZy1vdmVydmlldycpO3RoaXMuX292ZXJ2aWV3Q29udGFpbmVyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnaGVhcC1vdmVydmlldy1jb250YWluZXInKTt0aGlzLl9vdmVydmlld0dyaWQ9bmV3IFBlcmZVSS5PdmVydmlld0dyaWQoJ2hlYXAtcmVjb3JkaW5nJyk7dGhpcy5fb3ZlcnZpZXdHcmlkLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsbCcpO3RoaXMuX292ZXJ2aWV3Q2FudmFzPXRoaXMuX292ZXJ2aWV3Q29udGFpbmVyLmNyZWF0ZUNoaWxkKCdjYW52YXMnLCdoZWFwLXJlY29yZGluZy1vdmVydmlldy1jYW52YXMnKTt0aGlzLl9vdmVydmlld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9vdmVydmlld0dyaWQuZWxlbWVudCk7dGhpcy5fb3ZlcnZpZXdDYWxjdWxhdG9yPW5ldyBQcm9maWxlci5IZWFwVHJhY2tpbmdPdmVydmlld0dyaWQuT3ZlcnZpZXdDYWxjdWxhdG9yKCk7dGhpcy5fb3ZlcnZpZXdHcmlkLmFkZEV2ZW50TGlzdGVuZXIoUGVyZlVJLk92ZXJ2aWV3R3JpZC5FdmVudHMuV2luZG93Q2hhbmdlZCx0aGlzLl9vbldpbmRvd0NoYW5nZWQsdGhpcyk7dGhpcy5fcHJvZmlsZVNhbXBsZXM9aGVhcFByb2ZpbGVIZWFkZXIuZnJvbUZpbGUoKT9uZXcgUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5TYW1wbGVzKCk6aGVhcFByb2ZpbGVIZWFkZXIuX3Byb2ZpbGVTYW1wbGVzO3RoaXMuX3Byb2ZpbGVUeXBlPWhlYXBQcm9maWxlSGVhZGVyLnByb2ZpbGVUeXBlKCk7aWYoIWhlYXBQcm9maWxlSGVhZGVyLmZyb21GaWxlKCkmJmhlYXBQcm9maWxlSGVhZGVyLnByb2ZpbGVUeXBlKCkucHJvZmlsZUJlaW5nUmVjb3JkZWQoKT09PWhlYXBQcm9maWxlSGVhZGVyKXt0aGlzLl9wcm9maWxlVHlwZS5hZGRFdmVudExpc3RlbmVyKFByb2ZpbGVyLlRyYWNraW5nSGVhcFNuYXBzaG90UHJvZmlsZVR5cGUuSGVhcFN0YXRzVXBkYXRlLHRoaXMuX29uSGVhcFN0YXRzVXBkYXRlLHRoaXMpO3RoaXMuX3Byb2ZpbGVUeXBlLmFkZEV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5UcmFja2luZ1N0b3BwZWQsdGhpcy5fb25TdG9wVHJhY2tpbmcsdGhpcyk7fQp0aGlzLl93aW5kb3dMZWZ0PTAuMDt0aGlzLl93aW5kb3dSaWdodD0xLjA7dGhpcy5fb3ZlcnZpZXdHcmlkLnNldFdpbmRvdyh0aGlzLl93aW5kb3dMZWZ0LHRoaXMuX3dpbmRvd1JpZ2h0KTt0aGlzLl95U2NhbGU9bmV3IFByb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZC5TbW9vdGhTY2FsZSgpO3RoaXMuX3hTY2FsZT1uZXcgUHJvZmlsZXIuSGVhcFRyYWNraW5nT3ZlcnZpZXdHcmlkLlNtb290aFNjYWxlKCk7fQpkaXNwb3NlKCl7dGhpcy5fb25TdG9wVHJhY2tpbmcoKTt9Cl9vblN0b3BUcmFja2luZygpe3RoaXMuX3Byb2ZpbGVUeXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5IZWFwU3RhdHNVcGRhdGUsdGhpcy5fb25IZWFwU3RhdHNVcGRhdGUsdGhpcyk7dGhpcy5fcHJvZmlsZVR5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLlRyYWNraW5nU3RvcHBlZCx0aGlzLl9vblN0b3BUcmFja2luZyx0aGlzKTt9Cl9vbkhlYXBTdGF0c1VwZGF0ZShldmVudCl7dGhpcy5fcHJvZmlsZVNhbXBsZXM9ZXZlbnQuZGF0YTt0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO30KX3NldFNhbXBsZXMoc2FtcGxlcyl7aWYoIXNhbXBsZXMpCnJldHVybjtjb25zb2xlLmFzc2VydCghdGhpcy5fcHJvZmlsZVNhbXBsZXMudGltZXN0YW1wcy5sZW5ndGgsJ1Nob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBsb2FkaW5nIGZyb20gZmlsZS4nKTtjb25zb2xlLmFzc2VydChzYW1wbGVzLnRpbWVzdGFtcHMubGVuZ3RoKTt0aGlzLl9wcm9maWxlU2FtcGxlcz1uZXcgUHJvZmlsZXIuVHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZS5TYW1wbGVzKCk7dGhpcy5fcHJvZmlsZVNhbXBsZXMuc2l6ZXM9c2FtcGxlcy5zaXplczt0aGlzLl9wcm9maWxlU2FtcGxlcy5pZHM9c2FtcGxlcy5sYXN0QXNzaWduZWRJZHM7dGhpcy5fcHJvZmlsZVNhbXBsZXMudGltZXN0YW1wcz1zYW1wbGVzLnRpbWVzdGFtcHM7dGhpcy5fcHJvZmlsZVNhbXBsZXMubWF4PXNhbXBsZXMuc2l6ZXM7dGhpcy5fcHJvZmlsZVNhbXBsZXMudG90YWxUaW1lPShzYW1wbGVzLnRpbWVzdGFtcHMucGVla0xhc3QoKSk7dGhpcy51cGRhdGUoKTt9Cl9kcmF3T3ZlcnZpZXdDYW52YXMod2lkdGgsaGVpZ2h0KXtpZighdGhpcy5fcHJvZmlsZVNhbXBsZXMpCnJldHVybjtjb25zdCBwcm9maWxlU2FtcGxlcz10aGlzLl9wcm9maWxlU2FtcGxlcztjb25zdCBzaXplcz1wcm9maWxlU2FtcGxlcy5zaXplcztjb25zdCB0b3BTaXplcz1wcm9maWxlU2FtcGxlcy5tYXg7Y29uc3QgdGltZXN0YW1wcz1wcm9maWxlU2FtcGxlcy50aW1lc3RhbXBzO2NvbnN0IHN0YXJ0VGltZT10aW1lc3RhbXBzWzBdO2NvbnN0IGVuZFRpbWU9dGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aC0xXTtjb25zdCBzY2FsZUZhY3Rvcj10aGlzLl94U2NhbGUubmV4dFNjYWxlKHdpZHRoL3Byb2ZpbGVTYW1wbGVzLnRvdGFsVGltZSk7bGV0IG1heFNpemU9MDtmdW5jdGlvbiBhZ2dyZWdhdGVBbmRDYWxsKHNpemVzLGNhbGxiYWNrKXtsZXQgc2l6ZT0wO2xldCBjdXJyZW50WD0wO2ZvcihsZXQgaT0xO2k8dGltZXN0YW1wcy5sZW5ndGg7KytpKXtjb25zdCB4PU1hdGguZmxvb3IoKHRpbWVzdGFtcHNbaV0tc3RhcnRUaW1lKSpzY2FsZUZhY3Rvcik7aWYoeCE9PWN1cnJlbnRYKXtpZihzaXplKQpjYWxsYmFjayhjdXJyZW50WCxzaXplKTtzaXplPTA7Y3VycmVudFg9eDt9CnNpemUrPXNpemVzW2ldO30KY2FsbGJhY2soY3VycmVudFgsc2l6ZSk7fQpmdW5jdGlvbiBtYXhTaXplQ2FsbGJhY2soeCxzaXplKXttYXhTaXplPU1hdGgubWF4KG1heFNpemUsc2l6ZSk7fQphZ2dyZWdhdGVBbmRDYWxsKHNpemVzLG1heFNpemVDYWxsYmFjayk7Y29uc3QgeVNjYWxlRmFjdG9yPXRoaXMuX3lTY2FsZS5uZXh0U2NhbGUobWF4U2l6ZT9oZWlnaHQvKG1heFNpemUqMS4xKTowLjApO3RoaXMuX292ZXJ2aWV3Q2FudmFzLndpZHRoPXdpZHRoKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX292ZXJ2aWV3Q2FudmFzLmhlaWdodD1oZWlnaHQqd2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fb3ZlcnZpZXdDYW52YXMuc3R5bGUud2lkdGg9d2lkdGgrJ3B4Jzt0aGlzLl9vdmVydmlld0NhbnZhcy5zdHlsZS5oZWlnaHQ9aGVpZ2h0KydweCc7Y29uc3QgY29udGV4dD10aGlzLl9vdmVydmlld0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2NvbnRleHQuc2NhbGUod2luZG93LmRldmljZVBpeGVsUmF0aW8sd2luZG93LmRldmljZVBpeGVsUmF0aW8pO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5saW5lV2lkdGg9Mjtjb250ZXh0LnN0cm9rZVN0eWxlPSdyZ2JhKDE5MiwgMTkyLCAxOTIsIDAuNiknO2NvbnN0IGN1cnJlbnRYPShlbmRUaW1lLXN0YXJ0VGltZSkqc2NhbGVGYWN0b3I7Y29udGV4dC5tb3ZlVG8oY3VycmVudFgsaGVpZ2h0LTEpO2NvbnRleHQubGluZVRvKGN1cnJlbnRYLDApO2NvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC5jbG9zZVBhdGgoKTtsZXQgZ3JpZFk7bGV0IGdyaWRWYWx1ZTtjb25zdCBncmlkTGFiZWxIZWlnaHQ9MTQ7aWYoeVNjYWxlRmFjdG9yKXtjb25zdCBtYXhHcmlkVmFsdWU9KGhlaWdodC1ncmlkTGFiZWxIZWlnaHQpL3lTY2FsZUZhY3RvcjtncmlkVmFsdWU9TWF0aC5wb3coMTAyNCxNYXRoLmZsb29yKE1hdGgubG9nKG1heEdyaWRWYWx1ZSkvTWF0aC5sb2coMTAyNCkpKTtncmlkVmFsdWUqPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cobWF4R3JpZFZhbHVlL2dyaWRWYWx1ZSkvTWF0aC5MTjEwKSk7aWYoZ3JpZFZhbHVlKjU8PW1heEdyaWRWYWx1ZSkKZ3JpZFZhbHVlKj01O2dyaWRZPU1hdGgucm91bmQoaGVpZ2h0LWdyaWRWYWx1ZSp5U2NhbGVGYWN0b3ItMC41KSswLjU7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LmxpbmVXaWR0aD0xO2NvbnRleHQuc3Ryb2tlU3R5bGU9J3JnYmEoMCwgMCwgMCwgMC4yKSc7Y29udGV4dC5tb3ZlVG8oMCxncmlkWSk7Y29udGV4dC5saW5lVG8od2lkdGgsZ3JpZFkpO2NvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC5jbG9zZVBhdGgoKTt9CmZ1bmN0aW9uIGRyYXdCYXJDYWxsYmFjayh4LHNpemUpe2NvbnRleHQubW92ZVRvKHgsaGVpZ2h0LTEpO2NvbnRleHQubGluZVRvKHgsTWF0aC5yb3VuZChoZWlnaHQtc2l6ZSp5U2NhbGVGYWN0b3ItMSkpO30KY29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LmxpbmVXaWR0aD0yO2NvbnRleHQuc3Ryb2tlU3R5bGU9J3JnYmEoMTkyLCAxOTIsIDE5MiwgMC42KSc7YWdncmVnYXRlQW5kQ2FsbCh0b3BTaXplcyxkcmF3QmFyQ2FsbGJhY2spO2NvbnRleHQuc3Ryb2tlKCk7Y29udGV4dC5jbG9zZVBhdGgoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubGluZVdpZHRoPTI7Y29udGV4dC5zdHJva2VTdHlsZT0ncmdiYSgwLCAwLCAxOTIsIDAuOCknO2FnZ3JlZ2F0ZUFuZENhbGwoc2l6ZXMsZHJhd0JhckNhbGxiYWNrKTtjb250ZXh0LnN0cm9rZSgpO2NvbnRleHQuY2xvc2VQYXRoKCk7aWYoZ3JpZFZhbHVlKXtjb25zdCBsYWJlbD1OdW1iZXIuYnl0ZXNUb1N0cmluZyhncmlkVmFsdWUpO2NvbnN0IGxhYmVsUGFkZGluZz00O2NvbnN0IGxhYmVsWD0wO2NvbnN0IGxhYmVsWT1ncmlkWS0wLjU7Y29uc3QgbGFiZWxXaWR0aD0yKmxhYmVsUGFkZGluZytjb250ZXh0Lm1lYXN1cmVUZXh0KGxhYmVsKS53aWR0aDtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQudGV4dEJhc2VsaW5lPSdib3R0b20nO2NvbnRleHQuZm9udD0nMTBweCAnK3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpO2NvbnRleHQuZmlsbFN0eWxlPSdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpJztjb250ZXh0LmZpbGxSZWN0KGxhYmVsWCxsYWJlbFktZ3JpZExhYmVsSGVpZ2h0LGxhYmVsV2lkdGgsZ3JpZExhYmVsSGVpZ2h0KTtjb250ZXh0LmZpbGxTdHlsZT0ncmdiKDY0LCA2NCwgNjQpJztjb250ZXh0LmZpbGxUZXh0KGxhYmVsLGxhYmVsWCtsYWJlbFBhZGRpbmcsbGFiZWxZKTtjb250ZXh0LmZpbGwoKTtjb250ZXh0LmNsb3NlUGF0aCgpO319Cm9uUmVzaXplKCl7dGhpcy5fdXBkYXRlT3ZlcnZpZXdDYW52YXM9dHJ1ZTt0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO30KX29uV2luZG93Q2hhbmdlZCgpe2lmKCF0aGlzLl91cGRhdGVHcmlkVGltZXJJZCkKdGhpcy5fdXBkYXRlR3JpZFRpbWVySWQ9c2V0VGltZW91dCh0aGlzLl91cGRhdGVHcmlkLmJpbmQodGhpcyksMTApO30KX3NjaGVkdWxlVXBkYXRlKCl7aWYodGhpcy5fdXBkYXRlVGltZXJJZCkKcmV0dXJuO3RoaXMuX3VwZGF0ZVRpbWVySWQ9c2V0VGltZW91dCh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLDEwKTt9Cl91cGRhdGVCb3VuZGFyaWVzKCl7dGhpcy5fd2luZG93TGVmdD10aGlzLl9vdmVydmlld0dyaWQud2luZG93TGVmdCgpO3RoaXMuX3dpbmRvd1JpZ2h0PXRoaXMuX292ZXJ2aWV3R3JpZC53aW5kb3dSaWdodCgpO3RoaXMuX3dpbmRvd1dpZHRoPXRoaXMuX3dpbmRvd1JpZ2h0LXRoaXMuX3dpbmRvd0xlZnQ7fQp1cGRhdGUoKXt0aGlzLl91cGRhdGVUaW1lcklkPW51bGw7aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjt0aGlzLl91cGRhdGVCb3VuZGFyaWVzKCk7dGhpcy5fb3ZlcnZpZXdDYWxjdWxhdG9yLl91cGRhdGVCb3VuZGFyaWVzKHRoaXMpO3RoaXMuX292ZXJ2aWV3R3JpZC51cGRhdGVEaXZpZGVycyh0aGlzLl9vdmVydmlld0NhbGN1bGF0b3IpO3RoaXMuX2RyYXdPdmVydmlld0NhbnZhcyh0aGlzLl9vdmVydmlld0NvbnRhaW5lci5jbGllbnRXaWR0aCx0aGlzLl9vdmVydmlld0NvbnRhaW5lci5jbGllbnRIZWlnaHQtMjApO30KX3VwZGF0ZUdyaWQoKXt0aGlzLl91cGRhdGVHcmlkVGltZXJJZD0wO3RoaXMuX3VwZGF0ZUJvdW5kYXJpZXMoKTtjb25zdCBpZHM9dGhpcy5fcHJvZmlsZVNhbXBsZXMuaWRzO2NvbnN0IHRpbWVzdGFtcHM9dGhpcy5fcHJvZmlsZVNhbXBsZXMudGltZXN0YW1wcztjb25zdCBzaXplcz10aGlzLl9wcm9maWxlU2FtcGxlcy5zaXplcztjb25zdCBzdGFydFRpbWU9dGltZXN0YW1wc1swXTtjb25zdCB0b3RhbFRpbWU9dGhpcy5fcHJvZmlsZVNhbXBsZXMudG90YWxUaW1lO2NvbnN0IHRpbWVMZWZ0PXN0YXJ0VGltZSt0b3RhbFRpbWUqdGhpcy5fd2luZG93TGVmdDtjb25zdCB0aW1lUmlnaHQ9c3RhcnRUaW1lK3RvdGFsVGltZSp0aGlzLl93aW5kb3dSaWdodDtsZXQgbWluSWQ9MDtsZXQgbWF4SWQ9aWRzW2lkcy5sZW5ndGgtMV0rMTtsZXQgc2l6ZT0wO2ZvcihsZXQgaT0wO2k8dGltZXN0YW1wcy5sZW5ndGg7KytpKXtpZighdGltZXN0YW1wc1tpXSkKY29udGludWU7aWYodGltZXN0YW1wc1tpXT50aW1lUmlnaHQpCmJyZWFrO21heElkPWlkc1tpXTtpZih0aW1lc3RhbXBzW2ldPHRpbWVMZWZ0KXttaW5JZD1pZHNbaV07Y29udGludWU7fQpzaXplKz1zaXplc1tpXTt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFByb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZC5JZHNSYW5nZUNoYW5nZWQse21pbklkOm1pbklkLG1heElkOm1heElkLHNpemU6c2l6ZX0pO319O1Byb2ZpbGVyLkhlYXBUcmFja2luZ092ZXJ2aWV3R3JpZC5JZHNSYW5nZUNoYW5nZWQ9U3ltYm9sKCdJZHNSYW5nZUNoYW5nZWQnKTtQcm9maWxlci5IZWFwVHJhY2tpbmdPdmVydmlld0dyaWQuU21vb3RoU2NhbGU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9sYXN0VXBkYXRlPTA7dGhpcy5fY3VycmVudFNjYWxlPTAuMDt9Cm5leHRTY2FsZSh0YXJnZXQpe3RhcmdldD10YXJnZXR8fHRoaXMuX2N1cnJlbnRTY2FsZTtpZih0aGlzLl9jdXJyZW50U2NhbGUpe2NvbnN0IG5vdz1EYXRlLm5vdygpO2NvbnN0IHRpbWVEZWx0YU1zPW5vdy10aGlzLl9sYXN0VXBkYXRlO3RoaXMuX2xhc3RVcGRhdGU9bm93O2NvbnN0IG1heENoYW5nZVBlclNlYz0yMDtjb25zdCBtYXhDaGFuZ2VQZXJEZWx0YT1NYXRoLnBvdyhtYXhDaGFuZ2VQZXJTZWMsdGltZURlbHRhTXMvMTAwMCk7Y29uc3Qgc2NhbGVDaGFuZ2U9dGFyZ2V0L3RoaXMuX2N1cnJlbnRTY2FsZTt0aGlzLl9jdXJyZW50U2NhbGUqPU51bWJlci5jb25zdHJhaW4oc2NhbGVDaGFuZ2UsMS9tYXhDaGFuZ2VQZXJEZWx0YSxtYXhDaGFuZ2VQZXJEZWx0YSk7fWVsc2V7dGhpcy5fY3VycmVudFNjYWxlPXRhcmdldDt9CnJldHVybiB0aGlzLl9jdXJyZW50U2NhbGU7fX07UHJvZmlsZXIuSGVhcFRyYWNraW5nT3ZlcnZpZXdHcmlkLk92ZXJ2aWV3Q2FsY3VsYXRvcj1jbGFzc3tfdXBkYXRlQm91bmRhcmllcyhjaGFydCl7dGhpcy5fbWluaW11bUJvdW5kYXJpZXM9MDt0aGlzLl9tYXhpbXVtQm91bmRhcmllcz1jaGFydC5fcHJvZmlsZVNhbXBsZXMudG90YWxUaW1lO3RoaXMuX3hTY2FsZUZhY3Rvcj1jaGFydC5fb3ZlcnZpZXdDb250YWluZXIuY2xpZW50V2lkdGgvdGhpcy5fbWF4aW11bUJvdW5kYXJpZXM7fQpjb21wdXRlUG9zaXRpb24odGltZSl7cmV0dXJuKHRpbWUtdGhpcy5fbWluaW11bUJvdW5kYXJpZXMpKnRoaXMuX3hTY2FsZUZhY3Rvcjt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIE51bWJlci5zZWNvbmRzVG9TdHJpbmcodmFsdWUvMTAwMCwhIXByZWNpc2lvbik7fQptYXhpbXVtQm91bmRhcnkoKXtyZXR1cm4gdGhpcy5fbWF4aW11bUJvdW5kYXJpZXM7fQptaW5pbXVtQm91bmRhcnkoKXtyZXR1cm4gdGhpcy5fbWluaW11bUJvdW5kYXJpZXM7fQp6ZXJvVGltZSgpe3JldHVybiB0aGlzLl9taW5pbXVtQm91bmRhcmllczt9CmJvdW5kYXJ5U3Bhbigpe3JldHVybiB0aGlzLl9tYXhpbXVtQm91bmRhcmllcy10aGlzLl9taW5pbXVtQm91bmRhcmllczt9fTtQcm9maWxlci5IZWFwU25hcHNob3RTdGF0aXN0aWNzVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFwLXNuYXBzaG90LXN0YXRpc3RpY3MtdmlldycpO3RoaXMuX3BpZUNoYXJ0PW5ldyBQZXJmVUkuUGllQ2hhcnQoMTUwLFByb2ZpbGVyLkhlYXBTbmFwc2hvdFN0YXRpc3RpY3NWaWV3Ll92YWx1ZUZvcm1hdHRlcix0cnVlKTt0aGlzLl9waWVDaGFydC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hlYXAtc25hcHNob3Qtc3RhdHMtcGllLWNoYXJ0Jyk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3BpZUNoYXJ0LmVsZW1lbnQpO3RoaXMuX2xhYmVscz10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYXAtc25hcHNob3Qtc3RhdHMtbGVnZW5kJyk7fQpzdGF0aWMgX3ZhbHVlRm9ybWF0dGVyKHZhbHVlKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclcyBLQicsTnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IoTWF0aC5yb3VuZCh2YWx1ZS8xMDI0KSkpO30Kc2V0VG90YWwodmFsdWUpe3RoaXMuX3BpZUNoYXJ0LnNldFRvdGFsKHZhbHVlKTt9CmFkZFJlY29yZCh2YWx1ZSxuYW1lLGNvbG9yKXtpZihjb2xvcikKdGhpcy5fcGllQ2hhcnQuYWRkU2xpY2UodmFsdWUsY29sb3IpO2NvbnN0IG5vZGU9dGhpcy5fbGFiZWxzLmNyZWF0ZUNoaWxkKCdkaXYnKTtjb25zdCBzd2F0Y2hEaXY9bm9kZS5jcmVhdGVDaGlsZCgnZGl2JywnaGVhcC1zbmFwc2hvdC1zdGF0cy1zd2F0Y2gnKTtjb25zdCBuYW1lRGl2PW5vZGUuY3JlYXRlQ2hpbGQoJ2RpdicsJ2hlYXAtc25hcHNob3Qtc3RhdHMtbmFtZScpO2NvbnN0IHNpemVEaXY9bm9kZS5jcmVhdGVDaGlsZCgnZGl2JywnaGVhcC1zbmFwc2hvdC1zdGF0cy1zaXplJyk7aWYoY29sb3IpCnN3YXRjaERpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y29sb3I7ZWxzZQpzd2F0Y2hEaXYuY2xhc3NMaXN0LmFkZCgnaGVhcC1zbmFwc2hvdC1zdGF0cy1lbXB0eS1zd2F0Y2gnKTtuYW1lRGl2LnRleHRDb250ZW50PW5hbWU7c2l6ZURpdi50ZXh0Q29udGVudD1Qcm9maWxlci5IZWFwU25hcHNob3RTdGF0aXN0aWNzVmlldy5fdmFsdWVGb3JtYXR0ZXIodmFsdWUpO319O1Byb2ZpbGVyLkhlYXBBbGxvY2F0aW9uU3RhY2tWaWV3PWNsYXNzIGV4dGVuZHMgVUkuV2lkZ2V0e2NvbnN0cnVjdG9yKGhlYXBQcm9maWxlck1vZGVsKXtzdXBlcigpO3RoaXMuX2hlYXBQcm9maWxlck1vZGVsPWhlYXBQcm9maWxlck1vZGVsO3RoaXMuX2xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoKTt9CmFzeW5jIHNldEFsbG9jYXRlZE9iamVjdChzbmFwc2hvdCxzbmFwc2hvdE5vZGVJbmRleCl7dGhpcy5jbGVhcigpO2NvbnN0IGZyYW1lcz1hd2FpdCBzbmFwc2hvdC5hbGxvY2F0aW9uU3RhY2soc25hcHNob3ROb2RlSW5kZXgpO2lmKCFmcmFtZXMpe2NvbnN0IHN0YWNrRGl2PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnbm8taGVhcC1hbGxvY2F0aW9uLXN0YWNrJyk7c3RhY2tEaXYuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnU3RhY2sgd2FzIG5vdCByZWNvcmRlZCBmb3IgdGhpcyBvYmplY3QgYmVjYXVzZSBpdCBoYWQgYmVlbiBhbGxvY2F0ZWQgYmVmb3JlIHRoaXMgcHJvZmlsZSByZWNvcmRpbmcgc3RhcnRlZC4nKSk7cmV0dXJuO30KY29uc3Qgc3RhY2tEaXY9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFwLWFsbG9jYXRpb24tc3RhY2snKTtmb3IoY29uc3QgZnJhbWUgb2YgZnJhbWVzKXtjb25zdCBmcmFtZURpdj1zdGFja0Rpdi5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhY2stZnJhbWUnKTtjb25zdCBuYW1lPWZyYW1lRGl2LmNyZWF0ZUNoaWxkKCdkaXYnKTtuYW1lLnRleHRDb250ZW50PVVJLmJlYXV0aWZ5RnVuY3Rpb25OYW1lKGZyYW1lLmZ1bmN0aW9uTmFtZSk7aWYoIWZyYW1lLnNjcmlwdElkKQpjb250aW51ZTtjb25zdCB1cmxFbGVtZW50PXRoaXMuX2xpbmtpZmllci5saW5raWZ5U2NyaXB0TG9jYXRpb24odGhpcy5faGVhcFByb2ZpbGVyTW9kZWw/dGhpcy5faGVhcFByb2ZpbGVyTW9kZWwudGFyZ2V0KCk6bnVsbCxTdHJpbmcoZnJhbWUuc2NyaXB0SWQpLGZyYW1lLnNjcmlwdE5hbWUsZnJhbWUubGluZS0xLGZyYW1lLmNvbHVtbi0xKTtmcmFtZURpdi5hcHBlbmRDaGlsZCh1cmxFbGVtZW50KTt9fQpjbGVhcigpe3RoaXMuZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2xpbmtpZmllci5yZXNldCgpO319OztQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbD1jbGFzcyBleHRlbmRzIFByb2ZpbGVyLlByb2ZpbGVzUGFuZWx7Y29uc3RydWN0b3IoKXtjb25zdCByZWdpc3RyeT1Qcm9maWxlci5Qcm9maWxlVHlwZVJlZ2lzdHJ5Lmluc3RhbmNlO2NvbnN0IHByb2ZpbGVUeXBlcz1bcmVnaXN0cnkuaGVhcFNuYXBzaG90UHJvZmlsZVR5cGUscmVnaXN0cnkudHJhY2tpbmdIZWFwU25hcHNob3RQcm9maWxlVHlwZSxyZWdpc3RyeS5zYW1wbGluZ0hlYXBQcm9maWxlVHlwZV07aWYoUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ25hdGl2ZUhlYXBQcm9maWxlcicpKXtwcm9maWxlVHlwZXMucHVzaChyZWdpc3RyeS5zYW1wbGluZ05hdGl2ZUhlYXBQcm9maWxlVHlwZSk7cHJvZmlsZVR5cGVzLnB1c2gocmVnaXN0cnkuc2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RSZW5kZXJlclR5cGUpO3Byb2ZpbGVUeXBlcy5wdXNoKHJlZ2lzdHJ5LnNhbXBsaW5nTmF0aXZlSGVhcFNuYXBzaG90QnJvd3NlclR5cGUpO30Kc3VwZXIoJ2hlYXBfcHJvZmlsZXInLHByb2ZpbGVUeXBlcywncHJvZmlsZXIuaGVhcC10b2dnbGUtcmVjb3JkaW5nJyk7fQphcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsdGFyZ2V0KXtpZighKHRhcmdldCBpbnN0YW5jZW9mIFNESy5SZW1vdGVPYmplY3QpKQpyZXR1cm47aWYoIXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtjb25zdCBvYmplY3Q9KHRhcmdldCk7aWYoIW9iamVjdC5vYmplY3RJZCkKcmV0dXJuO2NvbnN0IG9iamVjdElkPShvYmplY3Qub2JqZWN0SWQpO2NvbnN0IGhlYXBQcm9maWxlcz1Qcm9maWxlci5Qcm9maWxlVHlwZVJlZ2lzdHJ5Lmluc3RhbmNlLmhlYXBTbmFwc2hvdFByb2ZpbGVUeXBlLmdldFByb2ZpbGVzKCk7aWYoIWhlYXBQcm9maWxlcy5sZW5ndGgpCnJldHVybjtjb25zdCBoZWFwUHJvZmlsZXJNb2RlbD1vYmplY3QucnVudGltZU1vZGVsKCkuaGVhcFByb2ZpbGVyTW9kZWwoKTtpZighaGVhcFByb2ZpbGVyTW9kZWwpCnJldHVybjtmdW5jdGlvbiByZXZlYWxJblZpZXcodmlld05hbWUpe2hlYXBQcm9maWxlck1vZGVsLnNuYXBzaG90T2JqZWN0SWRGb3JPYmplY3RJZChvYmplY3RJZCkudGhlbihyZXN1bHQ9PntpZih0aGlzLmlzU2hvd2luZygpJiZyZXN1bHQpCnRoaXMuc2hvd09iamVjdChyZXN1bHQsdmlld05hbWUpO30pO30KY29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZXZlYWwgaW4gU3VtbWFyeSB2aWV3JykscmV2ZWFsSW5WaWV3LmJpbmQodGhpcywnU3VtbWFyeScpKTt9CmhhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBwYW5lbD1VSS5jb250ZXh0LmZsYXZvcihQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbCk7Y29uc29sZS5hc3NlcnQocGFuZWwmJnBhbmVsIGluc3RhbmNlb2YgUHJvZmlsZXIuSGVhcFByb2ZpbGVyUGFuZWwpO3BhbmVsLnRvZ2dsZVJlY29yZCgpO3JldHVybiB0cnVlO30Kd2FzU2hvd24oKXtVSS5jb250ZXh0LnNldEZsYXZvcihQcm9maWxlci5IZWFwUHJvZmlsZXJQYW5lbCx0aGlzKTt9CndpbGxIaWRlKCl7VUkuY29udGV4dC5zZXRGbGF2b3IoUHJvZmlsZXIuSGVhcFByb2ZpbGVyUGFuZWwsbnVsbCk7fQpzaG93T2JqZWN0KHNuYXBzaG90T2JqZWN0SWQscGVyc3BlY3RpdmVOYW1lKXtjb25zdCByZWdpc3RyeT1Qcm9maWxlci5Qcm9maWxlVHlwZVJlZ2lzdHJ5Lmluc3RhbmNlO2NvbnN0IGhlYXBQcm9maWxlcz1yZWdpc3RyeS5oZWFwU25hcHNob3RQcm9maWxlVHlwZS5nZXRQcm9maWxlcygpO2ZvcihsZXQgaT0wO2k8aGVhcFByb2ZpbGVzLmxlbmd0aDtpKyspe2NvbnN0IHByb2ZpbGU9aGVhcFByb2ZpbGVzW2ldO2lmKHByb2ZpbGUubWF4SlNPYmplY3RJZD49c25hcHNob3RPYmplY3RJZCl7dGhpcy5zaG93UHJvZmlsZShwcm9maWxlKTtjb25zdCB2aWV3PXRoaXMudmlld0ZvclByb2ZpbGUocHJvZmlsZSk7dmlldy5zZWxlY3RMaXZlT2JqZWN0KHBlcnNwZWN0aXZlTmFtZSxzbmFwc2hvdE9iamVjdElkKTticmVhazt9fX19OztQcm9maWxlci5Jc29sYXRlU2VsZWN0b3I9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5faXRlbXM9bmV3IFVJLkxpc3RNb2RlbCgpO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RDb250cm9sKHRoaXMuX2l0ZW1zLHRoaXMsVUkuTGlzdE1vZGUuTm9uVmlld3BvcnQpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbGlzdC5lbGVtZW50KTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Byb2ZpbGVyL3Byb2ZpbGVMYXVuY2hlclZpZXcuY3NzJyk7dGhpcy5faXNvbGF0ZUJ5TW9kZWw9bmV3IE1hcCgpO3RoaXMuX2l0ZW1CeUlzb2xhdGU9bmV3IE1hcCgpO3RoaXMuX3VwZGF0ZVRpbWVyPW51bGw7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuUnVudGltZU1vZGVsLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLk5hbWVDaGFuZ2VkLHRoaXMuX3RhcmdldENoYW5nZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzLl90YXJnZXRDaGFuZ2VkLHRoaXMpO30Kd2FzU2hvd24oKXt0aGlzLl91cGRhdGVTdGF0cygpO30Kd2lsbEhpZGUoKXtjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVGltZXIpO30KbW9kZWxBZGRlZChtb2RlbCl7dGhpcy5fbW9kZWxBZGRlZChtb2RlbCk7fQphc3luYyBfbW9kZWxBZGRlZChtb2RlbCl7Y29uc3QgaXNvbGF0ZVByb21pc2U9bW9kZWwuaXNvbGF0ZUlkKCk7dGhpcy5faXNvbGF0ZUJ5TW9kZWwuc2V0KG1vZGVsLGlzb2xhdGVQcm9taXNlKTtjb25zdCBpc29sYXRlPWF3YWl0IGlzb2xhdGVQcm9taXNlO2xldCBpdGVtPXRoaXMuX2l0ZW1CeUlzb2xhdGUuZ2V0KGlzb2xhdGUpO2lmKCFpdGVtKXtpdGVtPW5ldyBQcm9maWxlci5Jc29sYXRlU2VsZWN0b3IuTGlzdEl0ZW0obW9kZWwpO2NvbnN0IGluZGV4PW1vZGVsLnRhcmdldCgpPT09U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpPzA6dGhpcy5faXRlbXMubGVuZ3RoO3RoaXMuX2l0ZW1zLmluc2VydChpbmRleCxpdGVtKTt0aGlzLl9pdGVtQnlJc29sYXRlLnNldChpc29sYXRlLGl0ZW0pO2lmKHRoaXMuX2l0ZW1zLmxlbmd0aD09PTEpCnRoaXMuX2xpc3Quc2VsZWN0SXRlbShpdGVtKTt9ZWxzZXtpdGVtLmFkZE1vZGVsKG1vZGVsKTt9CnRoaXMuX3VwZGF0ZSgpO30KbW9kZWxSZW1vdmVkKG1vZGVsKXt0aGlzLl9tb2RlbFJlbW92ZWQobW9kZWwpO30KYXN5bmMgX21vZGVsUmVtb3ZlZChtb2RlbCl7Y29uc3QgaXNvbGF0ZT1hd2FpdCB0aGlzLl9pc29sYXRlQnlNb2RlbC5nZXQobW9kZWwpO3RoaXMuX2lzb2xhdGVCeU1vZGVsLmRlbGV0ZShtb2RlbCk7Y29uc3QgaXRlbT10aGlzLl9pdGVtQnlJc29sYXRlLmdldChpc29sYXRlKTtpdGVtLnJlbW92ZU1vZGVsKG1vZGVsKTtpZighaXRlbS5tb2RlbHMoKS5sZW5ndGgpe3RoaXMuX2l0ZW1zLnJlbW92ZSh0aGlzLl9pdGVtcy5pbmRleE9mKGl0ZW0pKTt0aGlzLl9pdGVtQnlJc29sYXRlLmRlbGV0ZShpc29sYXRlKTt9CnRoaXMuX3VwZGF0ZSgpO30KYXN5bmMgX3RhcmdldENoYW5nZWQoZXZlbnQpe2NvbnN0IHRhcmdldD0oZXZlbnQuZGF0YSk7Y29uc3QgbW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SdW50aW1lTW9kZWwpO2NvbnN0IGlzb2xhdGU9bW9kZWwmJmF3YWl0IHRoaXMuX2lzb2xhdGVCeU1vZGVsLmdldChtb2RlbCk7Y29uc3QgaXRlbT1pc29sYXRlJiZ0aGlzLl9pdGVtQnlJc29sYXRlLmdldChpc29sYXRlKTtpZihpdGVtKQppdGVtLnVwZGF0ZVRpdGxlKCk7fQpjcmVhdGVFbGVtZW50Rm9ySXRlbShpdGVtKXtyZXR1cm4gaXRlbS5lbGVtZW50O30KaGVpZ2h0Rm9ySXRlbShpdGVtKXt9CmlzSXRlbVNlbGVjdGFibGUoaXRlbSl7cmV0dXJuIHRydWU7fQpzZWxlY3RlZEl0ZW1DaGFuZ2VkKGZyb20sdG8sZnJvbUVsZW1lbnQsdG9FbGVtZW50KXtpZihmcm9tRWxlbWVudCkKZnJvbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtpZih0b0VsZW1lbnQpCnRvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO2NvbnN0IG1vZGVsPXRvJiZ0by5tb2RlbHMoKVswXTtVSS5jb250ZXh0LnNldEZsYXZvcihTREsuSGVhcFByb2ZpbGVyTW9kZWwsbW9kZWwmJm1vZGVsLmhlYXBQcm9maWxlck1vZGVsKCkpO1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNESy5DUFVQcm9maWxlck1vZGVsLG1vZGVsJiZtb2RlbC50YXJnZXQoKS5tb2RlbChTREsuQ1BVUHJvZmlsZXJNb2RlbCkpO30KX3VwZGF0ZSgpe3RoaXMuX2xpc3QuaW52YWxpZGF0ZVJhbmdlKDAsdGhpcy5faXRlbXMubGVuZ3RoKTt9Cl91cGRhdGVTdGF0cygpe2Zvcihjb25zdCBpdGVtIG9mIHRoaXMuX2l0ZW1CeUlzb2xhdGUudmFsdWVzKCkpCml0ZW0udXBkYXRlU3RhdHMoKTtjb25zdCBoZWFwU3RhdHNVcGRhdGVJbnRlcnZhbE1zPTIwMDA7dGhpcy5fdXBkYXRlVGltZXI9c2V0VGltZW91dCgoKT0+dGhpcy5fdXBkYXRlU3RhdHMoKSxoZWFwU3RhdHNVcGRhdGVJbnRlcnZhbE1zKTt9fTtQcm9maWxlci5Jc29sYXRlU2VsZWN0b3IuTGlzdEl0ZW09Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwpe3RoaXMuX21vZGVscz1uZXcgU2V0KFttb2RlbF0pO3RoaXMuZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdwcm9maWxlLWlzb2xhdGUtaXRlbSBoYm94Jyk7dGhpcy5faGVhcERpdj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Byb2ZpbGUtaXNvbGF0ZS1pdGVtLWhlYXAnKTt0aGlzLl9uYW1lRGl2PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncHJvZmlsZS1pc29sYXRlLWl0ZW0tbmFtZScpO3RoaXMuX3VwZGF0ZXNEaXNhYmxlZD1mYWxzZTt0aGlzLnVwZGF0ZVRpdGxlKCk7dGhpcy51cGRhdGVTdGF0cygpO30KYWRkTW9kZWwobW9kZWwpe3RoaXMuX21vZGVscy5hZGQobW9kZWwpO3RoaXMudXBkYXRlVGl0bGUoKTt9CnJlbW92ZU1vZGVsKG1vZGVsKXt0aGlzLl9tb2RlbHMuZGVsZXRlKG1vZGVsKTt0aGlzLnVwZGF0ZVRpdGxlKCk7fQptb2RlbHMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9tb2RlbHMpO30KYXN5bmMgdXBkYXRlU3RhdHMoKXtpZih0aGlzLl91cGRhdGVzRGlzYWJsZWQpCnJldHVybjtjb25zdCBoZWFwU3RhdHM9YXdhaXQgdGhpcy5fbW9kZWxzLnZhbHVlcygpLm5leHQoKS52YWx1ZS5oZWFwVXNhZ2UoKTtpZighaGVhcFN0YXRzKXt0aGlzLl91cGRhdGVzRGlzYWJsZWQ9dHJ1ZTtyZXR1cm47fQpjb25zdCB1c2VkVGl0bGU9bHNgSGVhcCBzaXplIGluIHVzZSBieSBsaXZlIEpTIG9iamVjdHMuYDtjb25zdCB0b3RhbFRpdGxlPWxzYFRvdGFsIEpTIGhlYXAgc2l6ZSBpbmNsdWRpbmcgbGl2ZSBvYmplY3RzLCBnYXJiYWdlLCBhbmQgcmVzZXJ2ZWQgc3BhY2UuYDt0aGlzLl9oZWFwRGl2LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5faGVhcERpdi5hcHBlbmQoVUkuaHRtbGAKICAgICAgICA8c3BhbiB0aXRsZT0iJHt1c2VkVGl0bGV9Ij4ke051bWJlci5ieXRlc1RvU3RyaW5nKGhlYXBTdGF0cy51c2VkU2l6ZSl9PC9zcGFuPgogICAgICAgIDxzcGFuPiAvIDwvc3Bhbj4KICAgICAgICA8c3BhbiB0aXRsZT0iJHt0b3RhbFRpdGxlfSI+JHtOdW1iZXIuYnl0ZXNUb1N0cmluZyhoZWFwU3RhdHMudG90YWxTaXplKX08L3NwYW4+YCk7fQp1cGRhdGVUaXRsZSgpe2NvbnN0IG1vZGVsQ291bnRCeU5hbWU9bmV3IE1hcCgpO2Zvcihjb25zdCBtb2RlbCBvZiB0aGlzLl9tb2RlbHMudmFsdWVzKCkpe2NvbnN0IHRhcmdldD1tb2RlbC50YXJnZXQoKTtjb25zdCBuYW1lPVNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKSE9PXRhcmdldD90YXJnZXQubmFtZSgpOicnO2NvbnN0IHBhcnNlZFVSTD1uZXcgQ29tbW9uLlBhcnNlZFVSTCh0YXJnZXQuaW5zcGVjdGVkVVJMKCkpO2NvbnN0IGRvbWFpbj1wYXJzZWRVUkwuaXNWYWxpZD9wYXJzZWRVUkwuZG9tYWluKCk6Jyc7Y29uc3QgdGl0bGU9dGFyZ2V0LmRlY29yYXRlTGFiZWwoZG9tYWluJiZuYW1lP2Ake2RvbWFpbn06ICR7bmFtZX1gOm5hbWV8fGRvbWFpbnx8bHNgKGVtcHR5KWApO21vZGVsQ291bnRCeU5hbWUuc2V0KHRpdGxlLChtb2RlbENvdW50QnlOYW1lLmdldCh0aXRsZSl8fDApKzEpO30KdGhpcy5fbmFtZURpdi5yZW1vdmVDaGlsZHJlbigpO2Zvcihjb25zdFtuYW1lLGNvdW50XW9mIG1vZGVsQ291bnRCeU5hbWUpe2NvbnN0IHRpdGxlPWNvdW50PjE/YCR7bmFtZX0gKCR7Y291bnR9KWA6bmFtZTt0aGlzLl9uYW1lRGl2LmFwcGVuZENoaWxkKFVJLmh0bWxgPGRpdiB0aXRsZT0iJHt0aXRsZX0iPiR7dGl0bGV9PC9kaXY+YCk7fX19OztQcm9maWxlci5Qcm9maWxlTGF1bmNoZXJWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcihwcm9maWxlc1BhbmVsKXtzdXBlcigpO3RoaXMuX3BhbmVsPXByb2ZpbGVzUGFuZWw7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Byb2ZpbGUtbGF1bmNoZXItdmlldycpO3RoaXMuX2NvbnRlbnRFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywncHJvZmlsZS1sYXVuY2hlci12aWV3LWNvbnRlbnQnKTt0aGlzLl9pbm5lckNvbnRlbnRFbGVtZW50PXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTtjb25zdCBjb250cm9sRGl2PXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd2Ym94IHByb2ZpbGUtbGF1bmNoZXItY29udHJvbCcpO2NvbnRyb2xEaXYuY3JlYXRlQ2hpbGQoJ2gxJykudGV4dENvbnRlbnQ9bHNgU2VsZWN0IEphdmFTY3JpcHQgVk0gaW5zdGFuY2VgO2NvbnN0IHRhcmdldERpdj1jb250cm9sRGl2LmNyZWF0ZUNoaWxkKCdkaXYnLCd2Ym94IHByb2ZpbGUtbGF1bmNoZXItdGFyZ2V0LWxpc3QnKTtuZXcgUHJvZmlsZXIuSXNvbGF0ZVNlbGVjdG9yKCkuc2hvdyh0YXJnZXREaXYpO3RoaXMuX2NvbnRyb2xCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbignJyx0aGlzLl9jb250cm9sQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpLCdwcm9maWxlLWxhdW5jaGVyLWJ1dHRvbicsdHJ1ZSk7dGhpcy5fY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udHJvbEJ1dHRvbik7dGhpcy5fcmVjb3JkQnV0dG9uRW5hYmxlZD10cnVlO3RoaXMuX2xvYWRCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0xvYWQnKSx0aGlzLl9sb2FkQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpLCdwcm9maWxlLWxhdW5jaGVyLWJ1dHRvbicpO3RoaXMuX2NvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2xvYWRCdXR0b24pO3RoaXMuX3NlbGVjdGVkUHJvZmlsZVR5cGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzZWxlY3RlZFByb2ZpbGVUeXBlJywnQ1BVJyk7dGhpcy5faGVhZGVyPXRoaXMuX2lubmVyQ29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2gxJyk7dGhpcy5fcHJvZmlsZVR5cGVTZWxlY3RvckZvcm09dGhpcy5faW5uZXJDb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZm9ybScpO3RoaXMuX2lubmVyQ29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZsZXhpYmxlLXNwYWNlJyk7dGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50PW5ldyBNYXAoKTt9Cl9sb2FkQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX3BhbmVsLnNob3dMb2FkRnJvbUZpbGVEaWFsb2coKTt9Cl91cGRhdGVDb250cm9scygpe2lmKHRoaXMuX2lzRW5hYmxlZCYmdGhpcy5fcmVjb3JkQnV0dG9uRW5hYmxlZCkKdGhpcy5fY29udHJvbEJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7ZWxzZQp0aGlzLl9jb250cm9sQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCcnKTt0aGlzLl9jb250cm9sQnV0dG9uLnRpdGxlPXRoaXMuX3JlY29yZEJ1dHRvbkVuYWJsZWQ/Jyc6VUkuYW5vdGhlclByb2ZpbGVyQWN0aXZlTGFiZWwoKTtpZih0aGlzLl9pc0luc3RhbnRQcm9maWxlKXt0aGlzLl9jb250cm9sQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3J1bm5pbmcnKTt0aGlzLl9jb250cm9sQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3ByaW1hcnktYnV0dG9uJyk7dGhpcy5fY29udHJvbEJ1dHRvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Rha2Ugc25hcHNob3QnKTt9ZWxzZSBpZih0aGlzLl9pc1Byb2ZpbGluZyl7dGhpcy5fY29udHJvbEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdydW5uaW5nJyk7dGhpcy5fY29udHJvbEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdwcmltYXJ5LWJ1dHRvbicpO3RoaXMuX2NvbnRyb2xCdXR0b24udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTdG9wJyk7fWVsc2V7dGhpcy5fY29udHJvbEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdydW5uaW5nJyk7dGhpcy5fY29udHJvbEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdwcmltYXJ5LWJ1dHRvbicpO3RoaXMuX2NvbnRyb2xCdXR0b24udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTdGFydCcpO30KZm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50LnZhbHVlcygpKQppdGVtLmRpc2FibGVkPSEhdGhpcy5faXNQcm9maWxpbmc7fQpwcm9maWxlU3RhcnRlZCgpe3RoaXMuX2lzUHJvZmlsaW5nPXRydWU7dGhpcy5fdXBkYXRlQ29udHJvbHMoKTt9CnByb2ZpbGVGaW5pc2hlZCgpe3RoaXMuX2lzUHJvZmlsaW5nPWZhbHNlO3RoaXMuX3VwZGF0ZUNvbnRyb2xzKCk7fQp1cGRhdGVQcm9maWxlVHlwZShwcm9maWxlVHlwZSxyZWNvcmRCdXR0b25FbmFibGVkKXt0aGlzLl9pc0luc3RhbnRQcm9maWxlPXByb2ZpbGVUeXBlLmlzSW5zdGFudFByb2ZpbGUoKTt0aGlzLl9yZWNvcmRCdXR0b25FbmFibGVkPXJlY29yZEJ1dHRvbkVuYWJsZWQ7dGhpcy5faXNFbmFibGVkPXByb2ZpbGVUeXBlLmlzRW5hYmxlZCgpO3RoaXMuX3VwZGF0ZUNvbnRyb2xzKCk7fQphZGRQcm9maWxlVHlwZShwcm9maWxlVHlwZSl7Y29uc3QgbGFiZWxFbGVtZW50PVVJLmNyZWF0ZVJhZGlvTGFiZWwoJ3Byb2ZpbGUtdHlwZScscHJvZmlsZVR5cGUubmFtZSk7dGhpcy5fcHJvZmlsZVR5cGVTZWxlY3RvckZvcm0uYXBwZW5kQ2hpbGQobGFiZWxFbGVtZW50KTtjb25zdCBvcHRpb25FbGVtZW50PWxhYmVsRWxlbWVudC5yYWRpb0VsZW1lbnQ7dGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50LnNldChwcm9maWxlVHlwZS5pZCxvcHRpb25FbGVtZW50KTtvcHRpb25FbGVtZW50Ll9wcm9maWxlVHlwZT1wcm9maWxlVHlwZTtvcHRpb25FbGVtZW50LnN0eWxlLmhpZGRlbj10cnVlO29wdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyx0aGlzLl9wcm9maWxlVHlwZUNoYW5nZWQuYmluZCh0aGlzLHByb2ZpbGVUeXBlKSxmYWxzZSk7Y29uc3QgZGVzY3JpcHRpb25FbGVtZW50PXRoaXMuX3Byb2ZpbGVUeXBlU2VsZWN0b3JGb3JtLmNyZWF0ZUNoaWxkKCdwJyk7ZGVzY3JpcHRpb25FbGVtZW50LnRleHRDb250ZW50PXByb2ZpbGVUeXBlLmRlc2NyaXB0aW9uO2NvbnN0IGN1c3RvbUNvbnRlbnQ9cHJvZmlsZVR5cGUuY3VzdG9tQ29udGVudCgpO2lmKGN1c3RvbUNvbnRlbnQpCnRoaXMuX3Byb2ZpbGVUeXBlU2VsZWN0b3JGb3JtLmNyZWF0ZUNoaWxkKCdwJykuYXBwZW5kQ2hpbGQoY3VzdG9tQ29udGVudCk7aWYodGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50LnNpemU+MSkKdGhpcy5faGVhZGVyLnRleHRDb250ZW50PWxzYFNlbGVjdCBwcm9maWxpbmcgdHlwZWA7ZWxzZQp0aGlzLl9oZWFkZXIudGV4dENvbnRlbnQ9cHJvZmlsZVR5cGUubmFtZTt9CnJlc3RvcmVTZWxlY3RlZFByb2ZpbGVUeXBlKCl7bGV0IHR5cGVJZD10aGlzLl9zZWxlY3RlZFByb2ZpbGVUeXBlU2V0dGluZy5nZXQoKTtpZighdGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50Lmhhcyh0eXBlSWQpKQp0eXBlSWQ9dGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50LmtleXMoKS5uZXh0KCkudmFsdWU7dGhpcy5fdHlwZUlkVG9PcHRpb25FbGVtZW50LmdldCh0eXBlSWQpLmNoZWNrZWQ9dHJ1ZTtjb25zdCB0eXBlPXRoaXMuX3R5cGVJZFRvT3B0aW9uRWxlbWVudC5nZXQodHlwZUlkKS5fcHJvZmlsZVR5cGU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZUxhdW5jaGVyVmlldy5FdmVudHMuUHJvZmlsZVR5cGVTZWxlY3RlZCx0eXBlKTt9Cl9jb250cm9sQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX3BhbmVsLnRvZ2dsZVJlY29yZCgpO30KX3Byb2ZpbGVUeXBlQ2hhbmdlZChwcm9maWxlVHlwZSl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUHJvZmlsZXIuUHJvZmlsZUxhdW5jaGVyVmlldy5FdmVudHMuUHJvZmlsZVR5cGVTZWxlY3RlZCxwcm9maWxlVHlwZSk7dGhpcy5faXNJbnN0YW50UHJvZmlsZT1wcm9maWxlVHlwZS5pc0luc3RhbnRQcm9maWxlKCk7dGhpcy5faXNFbmFibGVkPXByb2ZpbGVUeXBlLmlzRW5hYmxlZCgpO3RoaXMuX3VwZGF0ZUNvbnRyb2xzKCk7dGhpcy5fc2VsZWN0ZWRQcm9maWxlVHlwZVNldHRpbmcuc2V0KHByb2ZpbGVUeXBlLmlkKTt9fTtQcm9maWxlci5Qcm9maWxlTGF1bmNoZXJWaWV3LkV2ZW50cz17UHJvZmlsZVR5cGVTZWxlY3RlZDpTeW1ib2woJ1Byb2ZpbGVUeXBlU2VsZWN0ZWQnKX07O1Byb2ZpbGVyLlByb2ZpbGVUeXBlUmVnaXN0cnk9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmNwdVByb2ZpbGVUeXBlPW5ldyBQcm9maWxlci5DUFVQcm9maWxlVHlwZSgpO3RoaXMuaGVhcFNuYXBzaG90UHJvZmlsZVR5cGU9bmV3IFByb2ZpbGVyLkhlYXBTbmFwc2hvdFByb2ZpbGVUeXBlKCk7dGhpcy5zYW1wbGluZ0hlYXBQcm9maWxlVHlwZT1uZXcgUHJvZmlsZXIuU2FtcGxpbmdIZWFwUHJvZmlsZVR5cGUoKTt0aGlzLnNhbXBsaW5nTmF0aXZlSGVhcFByb2ZpbGVUeXBlPW5ldyBQcm9maWxlci5TYW1wbGluZ05hdGl2ZUhlYXBQcm9maWxlVHlwZSgpO3RoaXMuc2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RCcm93c2VyVHlwZT1uZXcgUHJvZmlsZXIuU2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RCcm93c2VyVHlwZSgpO3RoaXMuc2FtcGxpbmdOYXRpdmVIZWFwU25hcHNob3RSZW5kZXJlclR5cGU9bmV3IFByb2ZpbGVyLlNhbXBsaW5nTmF0aXZlSGVhcFNuYXBzaG90UmVuZGVyZXJUeXBlKCk7dGhpcy50cmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlPW5ldyBQcm9maWxlci5UcmFja2luZ0hlYXBTbmFwc2hvdFByb2ZpbGVUeXBlKCk7fX07UHJvZmlsZXIuUHJvZmlsZVR5cGVSZWdpc3RyeS5pbnN0YW5jZT1uZXcgUHJvZmlsZXIuUHJvZmlsZVR5cGVSZWdpc3RyeSgpOztSdW50aW1lLmNhY2hlZFJlc291cmNlc1sicHJvZmlsZXIvaGVhcFByb2ZpbGVyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4gKiBkaXN0cmlidXRpb24uXG4gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLmhlYXAtc25hcHNob3QtdmlldyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyAuZGF0YS1ncmlkIHtcbiAgICBib3JkZXI6IG5vbmU7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgLmRhdGEtZ3JpZCB0cjplbXB0eSB7XG4gICAgaGVpZ2h0OiAxNnB4O1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyAuZGF0YS1ncmlkIHNwYW4ucGVyY2VudC1jb2x1bW4ge1xuICAgIHdpZHRoOiAzNXB4ICFpbXBvcnRhbnQ7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgLm9iamVjdC12YWx1ZS1vYmplY3QsXG4ub2JqZWN0LXZhbHVlLW5vZGUge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xufVxuXG4uaGVhcC1zbmFwc2hvdC12aWV3IC5vYmplY3QtdmFsdWUtc3RyaW5nIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uaGVhcC1zbmFwc2hvdC12aWV3IHRkLm9iamVjdC1jb2x1bW4gLm9iamVjdHMtY291bnQge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBjb2xvcjogZ3JleTtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyB0cjpub3QoLnNlbGVjdGVkKSAub2JqZWN0LXZhbHVlLWlkIHtcbiAgICBjb2xvcjogZ3JleTtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyAuZGF0YS1ncmlkIHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uaGVhcC1zbmFwc2hvdC12aWV3IC5oZWFwLXRyYWNraW5nLW92ZXJ2aWV3IHtcbiAgICBmbGV4OiAwIDAgODBweDtcbiAgICBoZWlnaHQ6IDgwcHg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgLnJldGFpbmluZy1wYXRocy12aWV3IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGVhcC1zbmFwc2hvdC12aWV3IC5oZWFwLXNuYXBzaG90LXZpZXctcmVzaXplciB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy90b29sYmFyUmVzaXplclZlcnRpY2FsLnBuZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE3OSwgMTc5LCAxNzkpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgY2VudGVyLCBjZW50ZXI7XG4gICAgZmxleDogMCAwIDIxcHg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgLmhlYXAtc25hcHNob3Qtdmlldy1yZXNpemVyIC50aXRsZSA+IHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBwYWRkaW5nLXRvcDogM3B4O1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyAuaGVhcC1zbmFwc2hvdC12aWV3LXJlc2l6ZXIgKiB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgdHI6bm90KC5zZWxlY3RlZCkgdGQub2JqZWN0LWNvbHVtbiBzcGFuLmhpZ2hsaWdodCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyB0ZC5vYmplY3QtY29sdW1uID4gZGl2ID4gc3BhbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgdGQub2JqZWN0LWNvbHVtbiBzcGFuLmhlYXAtb2JqZWN0LXNvdXJjZS1saW5rIHtcbiAgICBmbG9hdDogcmlnaHQ7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgdGQub2JqZWN0LWNvbHVtbiBzcGFuLmhlYXAtb2JqZWN0LXNvdXJjZS1saW5rOmVtcHR5IHtcbiAgICBhbmltYXRpb246IGZhZGVJbk91dCAycyBpbmZpbml0ZTtcbn1cblxuLmhlYXAtc25hcHNob3QtdmlldyB0ZC5vYmplY3QtY29sdW1uIHNwYW4uaGVhcC1vYmplY3Qtc291cmNlLWxpbms6ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIlxcYjdcXGI3XCI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbkBrZXlmcmFtZXMgZmFkZUluT3V0IHtcbiAgICAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDApO1xuICAgIH1cbiAgICA1MCUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwLjV0dXJuKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDF0dXJuKTtcbiAgICB9XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgdHI6bm90KC5zZWxlY3RlZCkgdGQub2JqZWN0LWNvbHVtbiBzcGFuLmhlYXAtb2JqZWN0LXRhZyB7XG4gICAgY29sb3I6ICM4ODg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXZpZXcgdGQub2JqZWN0LWNvbHVtbiBzcGFuLmdyYXllZCB7XG4gICAgY29sb3I6IGdyYXk7XG59XG5cbi5jeWNsZWQtYW5jZXNzb3Itbm9kZSB7XG4gICAgb3BhY2l0eTogMC42O1xufVxuXG4jaGVhcC1yZWNvcmRpbmctdmlldyAuaGVhcC1zbmFwc2hvdC12aWV3IHtcbiAgICB0b3A6IDgwcHg7XG59XG5cbi5oZWFwLW92ZXJ2aWV3LWNvbnRhaW5lciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogODBweDtcbn1cblxuI2hlYXAtcmVjb3JkaW5nLW92ZXJ2aWV3LWdyaWQgLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4jaGVhcC1yZWNvcmRpbmctb3ZlcnZpZXctY29udGFpbmVyIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO1xufVxuXG4uaGVhcC1yZWNvcmRpbmctb3ZlcnZpZXctY2FudmFzIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAyMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xufVxuXG4uaGVhcC1zbmFwc2hvdC1zdGF0aXN0aWNzLXZpZXcge1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4uaGVhcC1zbmFwc2hvdC1zdGF0cy1waWUtY2hhcnQge1xuICAgIG1hcmdpbjogMTJweCAzMHB4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uaGVhcC1zbmFwc2hvdC1zdGF0cy1sZWdlbmQge1xuICAgIG1hcmdpbi1sZWZ0OiAyNHB4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uaGVhcC1zbmFwc2hvdC1zdGF0cy1sZWdlbmQgPiBkaXYge1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICB3aWR0aDogMTcwcHg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXN0YXRzLXN3YXRjaCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEwMCwgMTAwLCAxMDAsIDAuMyk7XG59XG5cbi5oZWFwLXNuYXBzaG90LXN0YXRzLXN3YXRjaC5oZWFwLXNuYXBzaG90LXN0YXRzLWVtcHR5LXN3YXRjaCB7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uaGVhcC1zbmFwc2hvdC1zdGF0cy1uYW1lLFxuLmhlYXAtc25hcHNob3Qtc3RhdHMtc2l6ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XG59XG5cbi5oZWFwLXNuYXBzaG90LXN0YXRzLXNpemUge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmhlYXAtYWxsb2NhdGlvbi1zdGFjayAuc3RhY2stZnJhbWUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjQwLCAyNDAsIDI0MCk7XG4gICAgcGFkZGluZzogMnB4O1xufVxuXG4uaGVhcC1hbGxvY2F0aW9uLXN0YWNrIC5zdGFjay1mcmFtZSAuZGV2dG9vbHMtbGluayB7XG4gICAgY29sb3I6IHJnYigzMyUsIDMzJSwgMzMlKTtcbn1cblxuLm5vLWhlYXAtYWxsb2NhdGlvbi1zdGFjayB7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4vKiMgc291cmNlVVJMPXByb2ZpbGVyL2hlYXBQcm9maWxlci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm9maWxlci9wcm9maWxlTGF1bmNoZXJWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wcm9maWxlLWlzb2xhdGUtaXRlbSB7XG4gICAgcGFkZGluZzogNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG4ucHJvZmlsZS1pc29sYXRlLWl0ZW06aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDAlLCAwLjA1KTtcbn1cblxuLnByb2ZpbGUtaXNvbGF0ZS1pdGVtLnNlbGVjdGVkIHtcbiAgICBib3JkZXItY29sb3I6ICM0Mjg1ZjQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDIwO1xufVxuXG4ucHJvZmlsZS1pc29sYXRlLWl0ZW0gPiBkaXYge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIG1hcmdpbi1sZWZ0OiA5cHg7XG59XG5cbi5wcm9maWxlLWlzb2xhdGUtaXRlbS1oZWFwIHtcbiAgICB3aWR0aDogMTIwcHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9cHJvZmlsZXIvcHJvZmlsZUxhdW5jaGVyVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm9maWxlci9wcm9maWxlc1BhbmVsLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50aG9ueSBSaWNhdWQgPHJpa0B3ZWJraXQub3JnPlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICpcbiAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKFwiQXBwbGVcIikgbm9yIHRoZSBuYW1lcyBvZlxuICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4vKiBQcm9maWxlciBTdHlsZSAqL1xuXG4jcHJvZmlsZS12aWV3cyB7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5wcm9maWxlLXZpZXcgLmRhdGEtZ3JpZCB0YWJsZS5kYXRhIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLnByb2ZpbGUtdmlldyAuZGF0YS1ncmlkIHRyOm5vdCguc2VsZWN0ZWQpIC5oaWdobGlnaHQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDIzMCwgMTc5KTtcbn1cblxuLnByb2ZpbGUtdmlldyAuZGF0YS1ncmlkIHRyOmhvdmVyIHRkOm5vdCguYm90dG9tLWZpbGxlci10ZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLnByb2ZpbGUtdmlldyAuZGF0YS1ncmlkIHRkLm51bWVyaWMtY29sdW1uIHtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnByb2ZpbGUtdmlldyAuZGF0YS1ncmlkIGRpdi5wcm9maWxlLW11bHRpcGxlLXZhbHVlcyB7XG4gICAgZmxvYXQ6IHJpZ2h0O1xufVxuXG4ucHJvZmlsZS12aWV3IC5kYXRhLWdyaWQgc3Bhbi5wZXJjZW50LWNvbHVtbiB7XG4gICAgY29sb3I6ICM5OTk7XG4gICAgd2lkdGg6IDUwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ucHJvZmlsZS12aWV3IC5kYXRhLWdyaWQgdHIuc2VsZWN0ZWQgc3BhbiB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5wcm9maWxlcy10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLnByb2ZpbGVzLXRyZWUtc2lkZWJhciB7XG4gICAgZmxleDogYXV0bztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucHJvZmlsZXMtc2lkZWJhci10cmVlLWJveCB7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLnByb2ZpbGUtdmlldyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucHJvZmlsZS12aWV3IC5kYXRhLWdyaWQge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4ucHJvZmlsZS12aWV3IC5kYXRhLWdyaWQgdGguc2VsZi1jb2x1bW4sXG4ucHJvZmlsZS12aWV3IC5kYXRhLWdyaWQgdGgudG90YWwtY29sdW1uIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5wcm9maWxlLW5vZGUtZmlsZSB7XG4gICAgZmxvYXQ6IHJpZ2h0O1xuICAgIGNvbG9yOiBncmF5O1xufVxuXG4ucHJvZmlsZS13YXJuLW1hcmtlciB7XG4gICAgdmVydGljYWwtYWxpZ246IC0xcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAycHg7XG59XG5cbi5kYXRhLWdyaWQgdHIuc2VsZWN0ZWQgLnByb2ZpbGUtbm9kZS1maWxlIHtcbiAgICBjb2xvcjogcmdiKDMzJSwgMzMlLCAzMyUpO1xufVxuXG4uZGF0YS1ncmlkOmZvY3VzIHRyLnNlbGVjdGVkIC5wcm9maWxlLW5vZGUtZmlsZSB7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG5cbi5wcm9maWxlLWxhdW5jaGVyLXZpZXcge1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4ucHJvZmlsZS1sYXVuY2hlci12aWV3LWNvbnRlbnQge1xuICAgIHBhZGRpbmc6IDEwcHggMTZweDtcbn1cblxuLnByb2ZpbGUtbGF1bmNoZXItdmlldy1jb250ZW50IGgxIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBwYWRkaW5nOiA2cHggMDtcbiAgICBtYXJnaW46IDAgMCA1cHggMDtcbn1cblxuLnByb2ZpbGUtbGF1bmNoZXItdmlldy1jb250ZW50IGxhYmVsIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG59XG5cbi5wcm9maWxlLWxhdW5jaGVyLWNvbnRyb2wge1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xufVxuXG4ucHJvZmlsZS1sYXVuY2hlci1jb250cm9sIGJ1dHRvbiB7XG4gICAgbWluLXdpZHRoOiAxMTBweDtcbn1cblxuLnByb2ZpbGUtbGF1bmNoZXItdGFyZ2V0LWxpc3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTUwcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ucHJvZmlsZS1sYXVuY2hlci10YXJnZXQge1xuICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbn1cblxuLnByb2ZpbGUtbGF1bmNoZXItdGFyZ2V0ID4gKiB7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG59XG5cbi5wcm9maWxlLWxhdW5jaGVyLXZpZXctY29udGVudCBwIHtcbiAgICBjb2xvcjogZ3JleTtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDIycHg7XG59XG5cbi5wcm9maWxlLWxhdW5jaGVyLXZpZXctY29udGVudCBwIGxhYmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4ucHJvZmlsZS1sYXVuY2hlci12aWV3LWNvbnRlbnQgYnV0dG9uLnJ1bm5pbmcge1xuICAgIGNvbG9yOiBoc2woMCwgMTAwJSwgNTglKTtcbn1cblxuLnByb2ZpbGUtbGF1bmNoZXItdmlldy1jb250ZW50IGJ1dHRvbi5ydW5uaW5nOmhvdmVyIHtcbiAgICBjb2xvcjogaHNsKDAsIDEwMCUsIDQyJSk7XG59XG5cbmJvZHkuaW5hY3RpdmUgLnByb2ZpbGUtbGF1bmNoZXItdmlldy1jb250ZW50IGJ1dHRvbi5ydW5uaW5nOm5vdCgudG9vbGJhci1pdGVtKSB7XG4gICAgY29sb3I6IHJnYigyMjAsIDEzMCwgMTMwKTtcbn1cblxuLmhpZ2hsaWdodGVkLXJvdyB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHJvd19oaWdobGlnaHQgMnMgMHM7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyByb3dfaGlnaGxpZ2h0IHtcbiAgICBmcm9tIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAxMjAsIDEpOyB9XG4gICAgdG8geyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAxMjAsIDApOyB9XG59XG5cbi5wcm9maWxlLWNhbnZhcy1kZWNvcmF0aW9uIGxhYmVsW2lzPWR0LWljb24tbGFiZWxdIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cblxuLnByb2ZpbGUtY2FudmFzLWRlY29yYXRpb24ge1xuICAgIGNvbG9yOiByZWQ7XG4gICAgbWFyZ2luOiAtMTRweCAwIDEzcHggMjJweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XG59XG5cbi5wcm9maWxlLWNhbnZhcy1kZWNvcmF0aW9uIGJ1dHRvbiB7XG4gICAgbWFyZ2luOiAwIDAgMCAxMHB4ICFpbXBvcnRhbnQ7XG59XG5cbi5wcm9maWxlLWxhdW5jaGVyLWJ1dHRvbiB7XG4gICAgbWluLXdpZHRoOiAxMjBweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiA4cHggMTZweCA4cHggMDtcbn1cblxuLmNwdS1wcm9maWxlLWZsYW1lLWNoYXJ0LW92ZXJ2aWV3LWNvbnRhaW5lciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogODBweDtcbn1cblxuI2NwdS1wcm9maWxlLWZsYW1lLWNoYXJ0LW92ZXJ2aWV3LWNvbnRhaW5lciB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtcbn1cblxuLmNwdS1wcm9maWxlLWZsYW1lLWNoYXJ0LW92ZXJ2aWV3LWNhbnZhcyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMjBweDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbn1cblxuI2NwdS1wcm9maWxlLWZsYW1lLWNoYXJ0LW92ZXJ2aWV3LWdyaWQgLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uY3B1LXByb2ZpbGUtZmxhbWUtY2hhcnQtb3ZlcnZpZXctcGFuZSB7XG4gICAgZmxleDogMCAwIDgwcHggIWltcG9ydGFudDtcbn1cblxuLnByb2ZpbGUtdGV4dC12aWV3IHtcbiAgICBwYWRkaW5nOiAxMHB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIG1hcmdpbjogMDtcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcbiAgICBjdXJzb3I6IHRleHQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9cHJvZmlsZXIvcHJvZmlsZXNQYW5lbC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJwcm9maWxlci9wcm9maWxlc1NpZGViYXJUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi8qIFRyZWUgb3V0bGluZSBvdmVycmlkZXMgKi9cblxuOmhvc3Qge1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbm9sLnRyZWUtb3V0bGluZSB7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgZmxleDogYXV0bztcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbGluZS1oZWlnaHQ6IDM0cHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOm5vdCgucGFyZW50KTo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG46aG9zdC1jb250ZXh0KC5zb21lLWV4cGFuZGFibGUpIC50cmVlLW91dGxpbmUgbGk6bm90KC5wYXJlbnQpIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5wcm9maWxlcy10cmVlLXNlY3Rpb24ge1xuICAgIGhlaWdodDogMThweDtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgY29sb3I6IHJnYig5MiwgMTEwLCAxMjkpO1xuICAgIHRleHQtc2hhZG93OiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpIDAgMXB4IDA7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG59XG5cbi50cmVlLW91dGxpbmUgbGkucHJvZmlsZXMtdHJlZS1zZWN0aW9uOjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi50cmVlLW91dGxpbmUgb2wge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIEdlbmVyaWMgaXRlbXMgc3R5bGluZyAqL1xuXG4udGl0bGUtY29udGFpbmVyID4gLnNhdmUtbGluayB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxubGkuc2VsZWN0ZWQgLnRpdGxlLWNvbnRhaW5lciA+IC5zYXZlLWxpbmsge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnRyZWUtb3V0bGluZSA+IC5pY29uIHtcbiAgICBtYXJnaW4tbGVmdDogMTZweDtcbn1cblxubGkgLmljb24ge1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAzcHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxubGkud2FpdCAuaWNvbiB7XG4gICAgY29udGVudDogbm9uZTtcbn1cblxubGkud2FpdCAuaWNvbjo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMjRweDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgbWFyZ2luOiA0cHg7XG4gICAgYm9yZGVyOiAzcHggc29saWQgZ3JleTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGNsaXA6IHJlY3QoMCwgMTVweCwgMTVweCwgMCk7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHNwaW5uZXItYW5pbWF0aW9uIDFzIGxpbmVhciBpbmZpbml0ZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5saS53YWl0LnNtYWxsIC5pY29uOjpiZWZvcmUge1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDFweDtcbiAgICBjbGlwOiByZWN0KDAsIDlweCwgOXB4LCAwKTtcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbn1cblxubGkud2FpdC5zZWxlY3RlZCAuaWNvbjo6YmVmb3JlIHtcbiAgICBib3JkZXItY29sb3I6IHdoaXRlO1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc3Bpbm5lci1hbmltYXRpb24ge1xuICAgIGZyb20geyB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxufVxuXG5saS5zbWFsbCB7XG4gICAgaGVpZ2h0OiAyMHB4O1xufVxuXG5saS5zbWFsbCAuaWNvbiB7XG4gICAgd2lkdGg6IDE2cHg7XG4gICAgaGVpZ2h0OiAxNnB4O1xufVxuXG5saSAudGl0bGVzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdG9wOiA1cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgcGFkZGluZy1ib3R0b206IDFweDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZmxleDogYXV0bztcbn1cblxubGkgLnRpdGxlcyA+IC50aXRsZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbmxpLnNtYWxsIC50aXRsZXMge1xuICAgIHRvcDogMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbmxpOm5vdCguc21hbGwpIC50aXRsZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXFxBXCI7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxubGkgLnN1YnRpdGxlIHtcbiAgICBmb250LXNpemU6IDgwJTtcbn1cblxubGkuc21hbGwgLnN1YnRpdGxlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiBIZWFwIHByb2ZpbGVzICovXG5cbi5oZWFwLXNuYXBzaG90LXNpZGViYXItdHJlZS1pdGVtIC5pY29uIHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Byb2ZpbGVJY29uLnBuZyk7XG59XG5cbi5oZWFwLXNuYXBzaG90LXNpZGViYXItdHJlZS1pdGVtLnNtYWxsIC5pY29uIHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Byb2ZpbGVTbWFsbEljb24ucG5nKTtcbn1cblxuLyogTGF1bmNoZXIgKi9cblxuLnByb2ZpbGUtbGF1bmNoZXItdmlldy10cmVlLWl0ZW0ge1xuICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cbi5wcm9maWxlLWxhdW5jaGVyLXZpZXctdHJlZS1pdGVtID4gLmljb24ge1xuICAgIHdpZHRoOiA4cHggIWltcG9ydGFudDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi8qIENQVSBwcm9maWxlcyAqL1xuXG4ucHJvZmlsZS1zaWRlYmFyLXRyZWUtaXRlbSAuaWNvbiB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9wcm9maWxlSWNvbi5wbmcpO1xufVxuXG4ucHJvZmlsZS1zaWRlYmFyLXRyZWUtaXRlbS5zbWFsbCAuaWNvbiB7XG4gICAgY29udGVudDogdXJsKEltYWdlcy9wcm9maWxlU21hbGxJY29uLnBuZyk7XG59XG5cbi5wcm9maWxlLWdyb3VwLXNpZGViYXItdHJlZS1pdGVtIC5pY29uIHtcbiAgICBjb250ZW50OiB1cmwoSW1hZ2VzL3Byb2ZpbGVHcm91cEljb24ucG5nKTtcbn1cblxuLyojIHNvdXJjZVVSTD1wcm9maWxlci9wcm9maWxlc1NpZGViYXJUcmVlLmNzcyAqLyI7UXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldD1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IocHJvdmlkZXIscHJvbXB0SGlzdG9yeSxxdWVyeUNoYW5nZWRDYWxsYmFjayl7c3VwZXIodHJ1ZSk7dGhpcy5fcHJvbXB0SGlzdG9yeT1wcm9tcHRIaXN0b3J5fHxbXTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZpbHRlcmVkLWxpc3Qtd2lkZ2V0Jyk7dGhpcy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3F1aWNrX29wZW4vZmlsdGVyZWRMaXN0V2lkZ2V0LmNzcycpO3RoaXMuX3Byb21wdEVsZW1lbnQ9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmlsdGVyZWQtbGlzdC13aWRnZXQtaW5wdXQnKTt0aGlzLl9wcm9tcHRFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsJ2ZhbHNlJyk7dGhpcy5fcHJvbXB0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsJ3BsYWludGV4dC1vbmx5Jyk7dGhpcy5fcHJvbXB0PW5ldyBVSS5UZXh0UHJvbXB0KCk7dGhpcy5fcHJvbXB0LmluaXRpYWxpemUoKCk9PlByb21pc2UucmVzb2x2ZShbXSkpO2NvbnN0IHByb21wdFByb3h5PXRoaXMuX3Byb21wdC5hdHRhY2godGhpcy5fcHJvbXB0RWxlbWVudCk7cHJvbXB0UHJveHkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKSxmYWxzZSk7cHJvbXB0UHJveHkuY2xhc3NMaXN0LmFkZCgnZmlsdGVyZWQtbGlzdC13aWRnZXQtcHJvbXB0LWVsZW1lbnQnKTt0aGlzLl9ib3R0b21FbGVtZW50c0NvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd2Ym94Jyk7dGhpcy5fcHJvZ3Jlc3NFbGVtZW50PXRoaXMuX2JvdHRvbUVsZW1lbnRzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdmaWx0ZXJlZC1saXN0LXdpZGdldC1wcm9ncmVzcycpO3RoaXMuX3Byb2dyZXNzQmFyRWxlbWVudD10aGlzLl9wcm9ncmVzc0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ZpbHRlcmVkLWxpc3Qtd2lkZ2V0LXByb2dyZXNzLWJhcicpO3RoaXMuX2l0ZW1zPW5ldyBVSS5MaXN0TW9kZWwoKTt0aGlzLl9saXN0PW5ldyBVSS5MaXN0Q29udHJvbCh0aGlzLl9pdGVtcyx0aGlzLFVJLkxpc3RNb2RlLkVxdWFsSGVpZ2h0SXRlbXMpO3RoaXMuX2l0ZW1FbGVtZW50c0NvbnRhaW5lcj10aGlzLl9saXN0LmVsZW1lbnQ7dGhpcy5faXRlbUVsZW1lbnRzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NvbnRhaW5lcicpO3RoaXMuX2JvdHRvbUVsZW1lbnRzQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2l0ZW1FbGVtZW50c0NvbnRhaW5lcik7dGhpcy5faXRlbUVsZW1lbnRzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX25vdEZvdW5kRWxlbWVudD10aGlzLl9ib3R0b21FbGVtZW50c0NvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jywnbm90LWZvdW5kLXRleHQnKTt0aGlzLl9ub3RGb3VuZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5fcHJvbXB0RWxlbWVudCk7dGhpcy5fcHJlZml4PScnO3RoaXMuX3Byb3ZpZGVyPXByb3ZpZGVyO3RoaXMuX3F1ZXJ5Q2hhbmdlZENhbGxiYWNrPXF1ZXJ5Q2hhbmdlZENhbGxiYWNrO30Kc3RhdGljIGhpZ2hsaWdodFJhbmdlcyhlbGVtZW50LHF1ZXJ5LGNhc2VJbnNlbnNpdGl2ZSl7aWYoIXF1ZXJ5KQpyZXR1cm4gZmFsc2U7ZnVuY3Rpb24gcmFuZ2VzRm9yTWF0Y2godGV4dCxxdWVyeSl7Y29uc3Qgb3Bjb2Rlcz1EaWZmLkRpZmYuY2hhckRpZmYocXVlcnksdGV4dCk7bGV0IG9mZnNldD0wO2NvbnN0IHJhbmdlcz1bXTtmb3IobGV0IGk9MDtpPG9wY29kZXMubGVuZ3RoOysraSl7Y29uc3Qgb3Bjb2RlPW9wY29kZXNbaV07aWYob3Bjb2RlWzBdPT09RGlmZi5EaWZmLk9wZXJhdGlvbi5FcXVhbCkKcmFuZ2VzLnB1c2gobmV3IFRleHRVdGlscy5Tb3VyY2VSYW5nZShvZmZzZXQsb3Bjb2RlWzFdLmxlbmd0aCkpO2Vsc2UgaWYob3Bjb2RlWzBdIT09RGlmZi5EaWZmLk9wZXJhdGlvbi5JbnNlcnQpCnJldHVybiBudWxsO29mZnNldCs9b3Bjb2RlWzFdLmxlbmd0aDt9CnJldHVybiByYW5nZXM7fQpjb25zdCB0ZXh0PWVsZW1lbnQudGV4dENvbnRlbnQ7bGV0IHJhbmdlcz1yYW5nZXNGb3JNYXRjaCh0ZXh0LHF1ZXJ5KTtpZighcmFuZ2VzfHxjYXNlSW5zZW5zaXRpdmUpCnJhbmdlcz1yYW5nZXNGb3JNYXRjaCh0ZXh0LnRvVXBwZXJDYXNlKCkscXVlcnkudG9VcHBlckNhc2UoKSk7aWYocmFuZ2VzKXtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyhlbGVtZW50LHJhbmdlcywnaGlnaGxpZ2h0Jyk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpzZXRQbGFjZWhvbGRlcihwbGFjZWhvbGRlcil7dGhpcy5fcHJvbXB0LnNldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyKTt9CnNob3dBc0RpYWxvZygpe3RoaXMuX2RpYWxvZz1uZXcgVUkuRGlhbG9nKCk7dGhpcy5fZGlhbG9nLnNldE1heENvbnRlbnRTaXplKG5ldyBVSS5TaXplKDUwNCwzNDApKTt0aGlzLl9kaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuU2V0RXhhY3RXaWR0aE1heEhlaWdodCk7dGhpcy5fZGlhbG9nLnNldENvbnRlbnRQb3NpdGlvbihudWxsLDIyKTt0aGlzLnNob3codGhpcy5fZGlhbG9nLmNvbnRlbnRFbGVtZW50KTt0aGlzLl9kaWFsb2cuc2hvdygpO30Kc2V0UHJlZml4KHByZWZpeCl7dGhpcy5fcHJlZml4PXByZWZpeDt9CnNldFByb3ZpZGVyKHByb3ZpZGVyKXtpZihwcm92aWRlcj09PXRoaXMuX3Byb3ZpZGVyKQpyZXR1cm47aWYodGhpcy5fcHJvdmlkZXIpCnRoaXMuX3Byb3ZpZGVyLmRldGFjaCgpO3RoaXMuX2NsZWFyVGltZXJzKCk7dGhpcy5fcHJvdmlkZXI9cHJvdmlkZXI7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fYXR0YWNoUHJvdmlkZXIoKTt9Cl9hdHRhY2hQcm92aWRlcigpe3RoaXMuX2l0ZW1zLnJlcGxhY2VBbGwoW10pO3RoaXMuX2xpc3QuaW52YWxpZGF0ZUl0ZW1IZWlnaHQoKTtpZih0aGlzLl9wcm92aWRlcil7dGhpcy5fcHJvdmlkZXIuc2V0UmVmcmVzaENhbGxiYWNrKHRoaXMuX2l0ZW1zTG9hZGVkLmJpbmQodGhpcyx0aGlzLl9wcm92aWRlcikpO3RoaXMuX3Byb3ZpZGVyLmF0dGFjaCgpO30KdGhpcy5faXRlbXNMb2FkZWQodGhpcy5fcHJvdmlkZXIpO30KX3ZhbHVlKCl7cmV0dXJuIHRoaXMuX3Byb21wdC50ZXh0KCkudHJpbSgpO30KX2NsZWFuVmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWUoKS5zdWJzdHJpbmcodGhpcy5fcHJlZml4Lmxlbmd0aCk7fQp3YXNTaG93bigpe3RoaXMuX2F0dGFjaFByb3ZpZGVyKCk7fQp3aWxsSGlkZSgpe2lmKHRoaXMuX3Byb3ZpZGVyKQp0aGlzLl9wcm92aWRlci5kZXRhY2goKTt0aGlzLl9jbGVhclRpbWVycygpO30KX2NsZWFyVGltZXJzKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2ZpbHRlclRpbWVyKTtjbGVhclRpbWVvdXQodGhpcy5fc2NvcmluZ1RpbWVyKTtjbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpO2RlbGV0ZSB0aGlzLl9maWx0ZXJUaW1lcjtkZWxldGUgdGhpcy5fc2NvcmluZ1RpbWVyO2RlbGV0ZSB0aGlzLl9sb2FkVGltZW91dDtkZWxldGUgdGhpcy5fcmVmcmVzaExpc3RXaXRoQ3VycmVudFJlc3VsdDt9Cl9vbkVudGVyKGV2ZW50KXtpZighdGhpcy5fcHJvdmlkZXIpCnJldHVybjtjb25zdCBzZWxlY3RlZEluZGV4SW5Qcm92aWRlcj10aGlzLl9wcm92aWRlci5pdGVtQ291bnQoKT90aGlzLl9saXN0LnNlbGVjdGVkSXRlbSgpOm51bGw7dGhpcy5fc2VsZWN0SXRlbShzZWxlY3RlZEluZGV4SW5Qcm92aWRlcik7aWYodGhpcy5fZGlhbG9nKQp0aGlzLl9kaWFsb2cuaGlkZSgpO30KX2l0ZW1zTG9hZGVkKHByb3ZpZGVyKXtpZih0aGlzLl9sb2FkVGltZW91dHx8cHJvdmlkZXIhPT10aGlzLl9wcm92aWRlcikKcmV0dXJuO3RoaXMuX2xvYWRUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fdXBkYXRlQWZ0ZXJJdGVtc0xvYWRlZC5iaW5kKHRoaXMpLDApO30KX3VwZGF0ZUFmdGVySXRlbXNMb2FkZWQoKXtkZWxldGUgdGhpcy5fbG9hZFRpbWVvdXQ7dGhpcy5fZmlsdGVySXRlbXMoKTt9CmNyZWF0ZUVsZW1lbnRGb3JJdGVtKGl0ZW0pe2NvbnN0IGl0ZW1FbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2l0ZW1FbGVtZW50LmNsYXNzTmFtZT0nZmlsdGVyZWQtbGlzdC13aWRnZXQtaXRlbSAnKyh0aGlzLl9wcm92aWRlci5yZW5kZXJBc1R3b1Jvd3MoKT8ndHdvLXJvd3MnOidvbmUtcm93Jyk7Y29uc3QgdGl0bGVFbGVtZW50PWl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmaWx0ZXJlZC1saXN0LXdpZGdldC10aXRsZScpO2NvbnN0IHN1YnRpdGxlRWxlbWVudD1pdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZmlsdGVyZWQtbGlzdC13aWRnZXQtc3VidGl0bGUnKTtzdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9J1x1MjAwQic7dGhpcy5fcHJvdmlkZXIucmVuZGVySXRlbShpdGVtLHRoaXMuX2NsZWFuVmFsdWUoKSx0aXRsZUVsZW1lbnQsc3VidGl0bGVFbGVtZW50KTtyZXR1cm4gaXRlbUVsZW1lbnQ7fQpoZWlnaHRGb3JJdGVtKGl0ZW0pe3JldHVybiAwO30KaXNJdGVtU2VsZWN0YWJsZShpdGVtKXtyZXR1cm4gdHJ1ZTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO2lmKHRvRWxlbWVudCl7dG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7VUkuQVJJQVV0aWxzLmFsZXJ0KHRvRWxlbWVudC50ZXh0Q29udGVudCx0b0VsZW1lbnQpO319Cl9vbkNsaWNrKGV2ZW50KXtjb25zdCBpdGVtPXRoaXMuX2xpc3QuaXRlbUZvck5vZGUoKGV2ZW50LnRhcmdldCkpO2lmKGl0ZW09PT1udWxsKQpyZXR1cm47ZXZlbnQuY29uc3VtZSh0cnVlKTt0aGlzLl9zZWxlY3RJdGVtKGl0ZW0pO2lmKHRoaXMuX2RpYWxvZykKdGhpcy5fZGlhbG9nLmhpZGUoKTt9CnNldFF1ZXJ5KHF1ZXJ5KXt0aGlzLl9wcm9tcHQuZm9jdXMoKTt0aGlzLl9wcm9tcHQuc2V0VGV4dChxdWVyeSk7dGhpcy5fcXVlcnlDaGFuZ2VkKCk7dGhpcy5fcHJvbXB0LmF1dG9Db21wbGV0ZVNvb24odHJ1ZSk7dGhpcy5fc2NoZWR1bGVGaWx0ZXIoKTt9Cl90YWJLZXlQcmVzc2VkKCl7Y29uc3QgdXNlckVudGVyZWRUZXh0PXRoaXMuX3Byb21wdC50ZXh0KCk7bGV0IGNvbXBsZXRpb247Zm9yKGxldCBpPXRoaXMuX3Byb21wdEhpc3RvcnkubGVuZ3RoLTE7aT49MDtpLS0pe2lmKHRoaXMuX3Byb21wdEhpc3RvcnlbaV0hPT11c2VyRW50ZXJlZFRleHQmJnRoaXMuX3Byb21wdEhpc3RvcnlbaV0uc3RhcnRzV2l0aCh1c2VyRW50ZXJlZFRleHQpKXtjb21wbGV0aW9uPXRoaXMuX3Byb21wdEhpc3RvcnlbaV07YnJlYWs7fX0KaWYoIWNvbXBsZXRpb24pCnJldHVybiBmYWxzZTt0aGlzLl9wcm9tcHQuZm9jdXMoKTt0aGlzLl9wcm9tcHQuc2V0VGV4dChjb21wbGV0aW9uKTt0aGlzLl9wcm9tcHQuc2V0RE9NU2VsZWN0aW9uKHVzZXJFbnRlcmVkVGV4dC5sZW5ndGgsY29tcGxldGlvbi5sZW5ndGgpO3RoaXMuX3NjaGVkdWxlRmlsdGVyKCk7cmV0dXJuIHRydWU7fQpfaXRlbXNGaWx0ZXJlZEZvclRlc3QoKXt9Cl9maWx0ZXJJdGVtcygpe2RlbGV0ZSB0aGlzLl9maWx0ZXJUaW1lcjtpZih0aGlzLl9zY29yaW5nVGltZXIpe2NsZWFyVGltZW91dCh0aGlzLl9zY29yaW5nVGltZXIpO2RlbGV0ZSB0aGlzLl9zY29yaW5nVGltZXI7aWYodGhpcy5fcmVmcmVzaExpc3RXaXRoQ3VycmVudFJlc3VsdCkKdGhpcy5fcmVmcmVzaExpc3RXaXRoQ3VycmVudFJlc3VsdCgpO30KaWYoIXRoaXMuX3Byb3ZpZGVyKXt0aGlzLl9ib3R0b21FbGVtZW50c0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLHRydWUpO3RoaXMuX2l0ZW1zRmlsdGVyZWRGb3JUZXN0KCk7cmV0dXJuO30KdGhpcy5fYm90dG9tRWxlbWVudHNDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJyxmYWxzZSk7dGhpcy5fcHJvZ3Jlc3NCYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybT0nc2NhbGVYKDApJzt0aGlzLl9wcm9ncmVzc0JhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZmlsdGVyZWQtd2lkZ2V0LXByb2dyZXNzLWZhZGUnKTt0aGlzLl9wcm9ncmVzc0JhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7Y29uc3QgcXVlcnk9dGhpcy5fcHJvdmlkZXIucmV3cml0ZVF1ZXJ5KHRoaXMuX2NsZWFuVmFsdWUoKSk7dGhpcy5fcXVlcnk9cXVlcnk7Y29uc3QgZmlsdGVyUmVnZXg9cXVlcnk/U3RyaW5nLmZpbHRlclJlZ2V4KHF1ZXJ5KTpudWxsO2NvbnN0IGZpbHRlcmVkSXRlbXM9W107Y29uc3QgYmVzdFNjb3Jlcz1bXTtjb25zdCBiZXN0SXRlbXM9W107Y29uc3QgYmVzdEl0ZW1zVG9Db2xsZWN0PTEwMDtsZXQgbWluQmVzdFNjb3JlPTA7Y29uc3Qgb3ZlcmZsb3dJdGVtcz1bXTtjb25zdCBzY29yZVN0YXJ0VGltZT13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7Y29uc3QgbWF4V29ya0l0ZW1zPU51bWJlci5jb25zdHJhaW4oMTAsNTAwLCh0aGlzLl9wcm92aWRlci5pdGVtQ291bnQoKS8xMCl8MCk7c2NvcmVJdGVtcy5jYWxsKHRoaXMsMCk7ZnVuY3Rpb24gY29tcGFyZUludGVnZXJzKGEsYil7cmV0dXJuIGItYTt9CmZ1bmN0aW9uIHNjb3JlSXRlbXMoZnJvbUluZGV4KXtkZWxldGUgdGhpcy5fc2NvcmluZ1RpbWVyO2xldCB3b3JrRG9uZT0wO2xldCBpO2ZvcihpPWZyb21JbmRleDtpPHRoaXMuX3Byb3ZpZGVyLml0ZW1Db3VudCgpJiZ3b3JrRG9uZTxtYXhXb3JrSXRlbXM7KytpKXtpZihmaWx0ZXJSZWdleCYmIWZpbHRlclJlZ2V4LnRlc3QodGhpcy5fcHJvdmlkZXIuaXRlbUtleUF0KGkpKSkKY29udGludWU7Y29uc3Qgc2NvcmU9dGhpcy5fcHJvdmlkZXIuaXRlbVNjb3JlQXQoaSxxdWVyeSk7aWYocXVlcnkpCndvcmtEb25lKys7aWYoc2NvcmU+bWluQmVzdFNjb3JlfHxiZXN0U2NvcmVzLmxlbmd0aDxiZXN0SXRlbXNUb0NvbGxlY3Qpe2NvbnN0IGluZGV4PWJlc3RTY29yZXMudXBwZXJCb3VuZChzY29yZSxjb21wYXJlSW50ZWdlcnMpO2Jlc3RTY29yZXMuc3BsaWNlKGluZGV4LDAsc2NvcmUpO2Jlc3RJdGVtcy5zcGxpY2UoaW5kZXgsMCxpKTtpZihiZXN0U2NvcmVzLmxlbmd0aD5iZXN0SXRlbXNUb0NvbGxlY3Qpe292ZXJmbG93SXRlbXMucHVzaChiZXN0SXRlbXMucGVla0xhc3QoKSk7YmVzdFNjb3Jlcy5sZW5ndGg9YmVzdEl0ZW1zVG9Db2xsZWN0O2Jlc3RJdGVtcy5sZW5ndGg9YmVzdEl0ZW1zVG9Db2xsZWN0O30KbWluQmVzdFNjb3JlPWJlc3RTY29yZXMucGVla0xhc3QoKTt9ZWxzZXtmaWx0ZXJlZEl0ZW1zLnB1c2goaSk7fX0KdGhpcy5fcmVmcmVzaExpc3RXaXRoQ3VycmVudFJlc3VsdD10aGlzLl9yZWZyZXNoTGlzdC5iaW5kKHRoaXMsYmVzdEl0ZW1zLG92ZXJmbG93SXRlbXMsZmlsdGVyZWRJdGVtcyk7aWYoaTx0aGlzLl9wcm92aWRlci5pdGVtQ291bnQoKSl7dGhpcy5fc2NvcmluZ1RpbWVyPXNldFRpbWVvdXQoc2NvcmVJdGVtcy5iaW5kKHRoaXMsaSksMCk7aWYod2luZG93LnBlcmZvcm1hbmNlLm5vdygpLXNjb3JlU3RhcnRUaW1lPjUwKQp0aGlzLl9wcm9ncmVzc0JhckVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPSdzY2FsZVgoJytpL3RoaXMuX3Byb3ZpZGVyLml0ZW1Db3VudCgpKycpJztyZXR1cm47fQppZih3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktc2NvcmVTdGFydFRpbWU+MTAwKXt0aGlzLl9wcm9ncmVzc0JhckVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPSdzY2FsZVgoMSknO3RoaXMuX3Byb2dyZXNzQmFyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWx0ZXJlZC13aWRnZXQtcHJvZ3Jlc3MtZmFkZScpO31lbHNle3RoaXMuX3Byb2dyZXNzQmFyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt9CnRoaXMuX3JlZnJlc2hMaXN0V2l0aEN1cnJlbnRSZXN1bHQoKTt9fQpfcmVmcmVzaExpc3QoYmVzdEl0ZW1zLG92ZXJmbG93SXRlbXMsZmlsdGVyZWRJdGVtcyl7ZGVsZXRlIHRoaXMuX3JlZnJlc2hMaXN0V2l0aEN1cnJlbnRSZXN1bHQ7ZmlsdGVyZWRJdGVtcz1bXS5jb25jYXQoYmVzdEl0ZW1zLG92ZXJmbG93SXRlbXMsZmlsdGVyZWRJdGVtcyk7dGhpcy5fdXBkYXRlTm90Rm91bmRNZXNzYWdlKCEhZmlsdGVyZWRJdGVtcy5sZW5ndGgpO2NvbnN0IG9sZEhlaWdodD10aGlzLl9saXN0LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O3RoaXMuX2l0ZW1zLnJlcGxhY2VBbGwoZmlsdGVyZWRJdGVtcyk7aWYoZmlsdGVyZWRJdGVtcy5sZW5ndGgpCnRoaXMuX2xpc3Quc2VsZWN0SXRlbShmaWx0ZXJlZEl0ZW1zWzBdKTtpZih0aGlzLl9saXN0LmVsZW1lbnQub2Zmc2V0SGVpZ2h0IT09b2xkSGVpZ2h0KQp0aGlzLl9saXN0LnZpZXdwb3J0UmVzaXplZCgpO3RoaXMuX2l0ZW1zRmlsdGVyZWRGb3JUZXN0KCk7fQpfdXBkYXRlTm90Rm91bmRNZXNzYWdlKGhhc0l0ZW1zKXt0aGlzLl9saXN0LmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhaGFzSXRlbXMpO3RoaXMuX25vdEZvdW5kRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLGhhc0l0ZW1zKTtpZighaGFzSXRlbXMpCnRoaXMuX25vdEZvdW5kRWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9wcm92aWRlci5ub3RGb3VuZFRleHQodGhpcy5fY2xlYW5WYWx1ZSgpKTt9Cl9vbklucHV0KCl7dGhpcy5fcXVlcnlDaGFuZ2VkKCk7dGhpcy5fc2NoZWR1bGVGaWx0ZXIoKTt9Cl9xdWVyeUNoYW5nZWQoKXtpZih0aGlzLl9xdWVyeUNoYW5nZWRDYWxsYmFjaykKdGhpcy5fcXVlcnlDaGFuZ2VkQ2FsbGJhY2sodGhpcy5fdmFsdWUoKSk7aWYodGhpcy5fcHJvdmlkZXIpCnRoaXMuX3Byb3ZpZGVyLnF1ZXJ5Q2hhbmdlZCh0aGlzLl9jbGVhblZhbHVlKCkpO30KX29uS2V5RG93bihldmVudCl7bGV0IGhhbmRsZWQ9ZmFsc2U7c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdFbnRlcic6dGhpcy5fb25FbnRlcihldmVudCk7cmV0dXJuO2Nhc2UnVGFiJzpoYW5kbGVkPXRoaXMuX3RhYktleVByZXNzZWQoKTticmVhaztjYXNlJ0Fycm93VXAnOmhhbmRsZWQ9dGhpcy5fbGlzdC5zZWxlY3RQcmV2aW91c0l0ZW0odHJ1ZSxmYWxzZSk7YnJlYWs7Y2FzZSdBcnJvd0Rvd24nOmhhbmRsZWQ9dGhpcy5fbGlzdC5zZWxlY3ROZXh0SXRlbSh0cnVlLGZhbHNlKTticmVhaztjYXNlJ1BhZ2VVcCc6aGFuZGxlZD10aGlzLl9saXN0LnNlbGVjdEl0ZW1QcmV2aW91c1BhZ2UoZmFsc2UpO2JyZWFrO2Nhc2UnUGFnZURvd24nOmhhbmRsZWQ9dGhpcy5fbGlzdC5zZWxlY3RJdGVtTmV4dFBhZ2UoZmFsc2UpO2JyZWFrO30KaWYoaGFuZGxlZCkKZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9zY2hlZHVsZUZpbHRlcigpe2lmKHRoaXMuX2ZpbHRlclRpbWVyKQpyZXR1cm47dGhpcy5fZmlsdGVyVGltZXI9c2V0VGltZW91dCh0aGlzLl9maWx0ZXJJdGVtcy5iaW5kKHRoaXMpLDApO30KX3NlbGVjdEl0ZW0oaXRlbUluZGV4KXt0aGlzLl9wcm9tcHRIaXN0b3J5LnB1c2godGhpcy5fdmFsdWUoKSk7aWYodGhpcy5fcHJvbXB0SGlzdG9yeS5sZW5ndGg+MTAwKQp0aGlzLl9wcm9tcHRIaXN0b3J5LnNoaWZ0KCk7dGhpcy5fcHJvdmlkZXIuc2VsZWN0SXRlbShpdGVtSW5kZXgsdGhpcy5fY2xlYW5WYWx1ZSgpKTt9fTtRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LlByb3ZpZGVyPWNsYXNze3NldFJlZnJlc2hDYWxsYmFjayhyZWZyZXNoQ2FsbGJhY2spe3RoaXMuX3JlZnJlc2hDYWxsYmFjaz1yZWZyZXNoQ2FsbGJhY2s7fQphdHRhY2goKXt9Cml0ZW1Db3VudCgpe3JldHVybiAwO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7cmV0dXJuJyc7fQppdGVtU2NvcmVBdChpdGVtSW5kZXgscXVlcnkpe3JldHVybiAxO30KcmVuZGVySXRlbShpdGVtSW5kZXgscXVlcnksdGl0bGVFbGVtZW50LHN1YnRpdGxlRWxlbWVudCl7fQpyZW5kZXJBc1R3b1Jvd3MoKXtyZXR1cm4gZmFsc2U7fQpzZWxlY3RJdGVtKGl0ZW1JbmRleCxwcm9tcHRWYWx1ZSl7fQpyZWZyZXNoKCl7dGhpcy5fcmVmcmVzaENhbGxiYWNrKCk7fQpyZXdyaXRlUXVlcnkocXVlcnkpe3JldHVybiBxdWVyeTt9CnF1ZXJ5Q2hhbmdlZChxdWVyeSl7fQpub3RGb3VuZFRleHQocXVlcnkpe3JldHVybiBDb21tb24uVUlTdHJpbmcoJ05vIHJlc3VsdHMgZm91bmQnKTt9CmRldGFjaCgpe319OztRdWlja09wZW4uUXVpY2tPcGVuPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fcHJlZml4PW51bGw7dGhpcy5fcXVlcnk9Jyc7dGhpcy5fcHJvdmlkZXJzPW5ldyBNYXAoKTt0aGlzLl9wcmVmaXhlcz1bXTt0aGlzLl9maWx0ZXJlZExpc3RXaWRnZXQ9bnVsbDtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucyhRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LlByb3ZpZGVyKS5mb3JFYWNoKHRoaXMuX2FkZFByb3ZpZGVyLmJpbmQodGhpcykpO3RoaXMuX3ByZWZpeGVzLnNvcnQoKGEsYik9PmIubGVuZ3RoLWEubGVuZ3RoKTt9CnN0YXRpYyBzaG93KHF1ZXJ5KXtjb25zdCBxdWlja09wZW49bmV3IHRoaXMoKTtjb25zdCBmaWx0ZXJlZExpc3RXaWRnZXQ9bmV3IFF1aWNrT3Blbi5GaWx0ZXJlZExpc3RXaWRnZXQobnVsbCx0aGlzLl9oaXN0b3J5LHF1aWNrT3Blbi5fcXVlcnlDaGFuZ2VkLmJpbmQocXVpY2tPcGVuKSk7cXVpY2tPcGVuLl9maWx0ZXJlZExpc3RXaWRnZXQ9ZmlsdGVyZWRMaXN0V2lkZ2V0O2ZpbHRlcmVkTGlzdFdpZGdldC5zZXRQbGFjZWhvbGRlcihDb21tb24uVUlTdHJpbmcoJ1R5cGUgXCc/XCcgdG8gc2VlIGF2YWlsYWJsZSBjb21tYW5kcycpKTtmaWx0ZXJlZExpc3RXaWRnZXQuc2hvd0FzRGlhbG9nKCk7ZmlsdGVyZWRMaXN0V2lkZ2V0LnNldFF1ZXJ5KHF1ZXJ5KTt9Cl9hZGRQcm92aWRlcihleHRlbnNpb24pe2NvbnN0IHByZWZpeD1leHRlbnNpb24uZGVzY3JpcHRvcigpWydwcmVmaXgnXTt0aGlzLl9wcmVmaXhlcy5wdXNoKHByZWZpeCk7dGhpcy5fcHJvdmlkZXJzLnNldChwcmVmaXgsKGV4dGVuc2lvbi5pbnN0YW5jZS5iaW5kKGV4dGVuc2lvbikpKTt9Cl9xdWVyeUNoYW5nZWQocXVlcnkpe2NvbnN0IHByZWZpeD10aGlzLl9wcmVmaXhlcy5maW5kKHByZWZpeD0+cXVlcnkuc3RhcnRzV2l0aChwcmVmaXgpKTtpZih0eXBlb2YgcHJlZml4IT09J3N0cmluZyd8fHRoaXMuX3ByZWZpeD09PXByZWZpeCkKcmV0dXJuO3RoaXMuX3ByZWZpeD1wcmVmaXg7dGhpcy5fZmlsdGVyZWRMaXN0V2lkZ2V0LnNldFByZWZpeChwcmVmaXgpO3RoaXMuX2ZpbHRlcmVkTGlzdFdpZGdldC5zZXRQcm92aWRlcihudWxsKTt0aGlzLl9wcm92aWRlcnMuZ2V0KHByZWZpeCkoKS50aGVuKHByb3ZpZGVyPT57aWYodGhpcy5fcHJlZml4IT09cHJlZml4KQpyZXR1cm47dGhpcy5fZmlsdGVyZWRMaXN0V2lkZ2V0LnNldFByb3ZpZGVyKHByb3ZpZGVyKTt0aGlzLl9wcm92aWRlckxvYWRlZEZvclRlc3QocHJvdmlkZXIpO30pO30KX3Byb3ZpZGVyTG9hZGVkRm9yVGVzdChwcm92aWRlcil7fX07UXVpY2tPcGVuLlF1aWNrT3Blbi5faGlzdG9yeT1bXTtRdWlja09wZW4uUXVpY2tPcGVuLlNob3dBY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7c3dpdGNoKGFjdGlvbklkKXtjYXNlJ3F1aWNrT3Blbi5zaG93JzpRdWlja09wZW4uUXVpY2tPcGVuLnNob3coJycpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319OztRdWlja09wZW4uQ29tbWFuZE1lbnU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9jb21tYW5kcz1bXTt0aGlzLl9sb2FkQ29tbWFuZHMoKTt9CnN0YXRpYyBjcmVhdGVDb21tYW5kKGNhdGVnb3J5LGtleXMsdGl0bGUsc2hvcnRjdXQsZXhlY3V0ZUhhbmRsZXIsYXZhaWxhYmxlSGFuZGxlcil7Y29uc3Qga2V5PWtleXMucmVwbGFjZSgvLC9nLCdcMCcpO3JldHVybiBuZXcgUXVpY2tPcGVuLkNvbW1hbmRNZW51LkNvbW1hbmQoY2F0ZWdvcnksdGl0bGUsa2V5LHNob3J0Y3V0LGV4ZWN1dGVIYW5kbGVyLGF2YWlsYWJsZUhhbmRsZXIpO30Kc3RhdGljIGNyZWF0ZVNldHRpbmdDb21tYW5kKGV4dGVuc2lvbix0aXRsZSx2YWx1ZSl7Y29uc3QgY2F0ZWdvcnk9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnY2F0ZWdvcnknXXx8Jyc7Y29uc3QgdGFncz1leHRlbnNpb24uZGVzY3JpcHRvcigpWyd0YWdzJ118fCcnO2NvbnN0IHNldHRpbmc9Q29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnc2V0dGluZ05hbWUnXSk7cmV0dXJuIFF1aWNrT3Blbi5Db21tYW5kTWVudS5jcmVhdGVDb21tYW5kKGNhdGVnb3J5LHRhZ3MsdGl0bGUsJycsc2V0dGluZy5zZXQuYmluZChzZXR0aW5nLHZhbHVlKSxhdmFpbGFibGVIYW5kbGVyKTtmdW5jdGlvbiBhdmFpbGFibGVIYW5kbGVyKCl7cmV0dXJuIHNldHRpbmcuZ2V0KCkhPT12YWx1ZTt9fQpzdGF0aWMgY3JlYXRlQWN0aW9uQ29tbWFuZChhY3Rpb24pe2NvbnN0IHNob3J0Y3V0PVVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXRUaXRsZUZvckFjdGlvbihhY3Rpb24uaWQoKSl8fCcnO3JldHVybiBRdWlja09wZW4uQ29tbWFuZE1lbnUuY3JlYXRlQ29tbWFuZChhY3Rpb24uY2F0ZWdvcnkoKSxhY3Rpb24udGFncygpLGFjdGlvbi50aXRsZSgpLHNob3J0Y3V0LGFjdGlvbi5leGVjdXRlLmJpbmQoYWN0aW9uKSk7fQpzdGF0aWMgY3JlYXRlUmV2ZWFsVmlld0NvbW1hbmQoZXh0ZW5zaW9uLGNhdGVnb3J5KXtjb25zdCB2aWV3SWQ9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnaWQnXTtjb25zdCBleGVjdXRlSGFuZGxlcj1VSS52aWV3TWFuYWdlci5zaG93Vmlldy5iaW5kKFVJLnZpZXdNYW5hZ2VyLHZpZXdJZCk7Y29uc3QgdGFncz1leHRlbnNpb24uZGVzY3JpcHRvcigpWyd0YWdzJ118fCcnO3JldHVybiBRdWlja09wZW4uQ29tbWFuZE1lbnUuY3JlYXRlQ29tbWFuZChjYXRlZ29yeSx0YWdzLENvbW1vbi5VSVN0cmluZygnU2hvdyAlcycsZXh0ZW5zaW9uLnRpdGxlKCkpLCcnLGV4ZWN1dGVIYW5kbGVyKTt9Cl9sb2FkQ29tbWFuZHMoKXtjb25zdCBsb2NhdGlvbnM9bmV3IE1hcCgpO3NlbGYucnVudGltZS5leHRlbnNpb25zKFVJLlZpZXdMb2NhdGlvblJlc29sdmVyKS5mb3JFYWNoKGV4dGVuc2lvbj0+e2NvbnN0IGNhdGVnb3J5PWV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2NhdGVnb3J5J107Y29uc3QgbmFtZT1leHRlbnNpb24uZGVzY3JpcHRvcigpWyduYW1lJ107aWYoY2F0ZWdvcnkmJm5hbWUpCmxvY2F0aW9ucy5zZXQobmFtZSxjYXRlZ29yeSk7fSk7Y29uc3Qgdmlld0V4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoJ3ZpZXcnKTtmb3IoY29uc3QgZXh0ZW5zaW9uIG9mIHZpZXdFeHRlbnNpb25zKXtjb25zdCBjYXRlZ29yeT1sb2NhdGlvbnMuZ2V0KGV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2xvY2F0aW9uJ10pO2lmKGNhdGVnb3J5KQp0aGlzLl9jb21tYW5kcy5wdXNoKFF1aWNrT3Blbi5Db21tYW5kTWVudS5jcmVhdGVSZXZlYWxWaWV3Q29tbWFuZChleHRlbnNpb24sY2F0ZWdvcnkpKTt9CmNvbnN0IHNldHRpbmdFeHRlbnNpb25zPXNlbGYucnVudGltZS5leHRlbnNpb25zKCdzZXR0aW5nJyk7Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBzZXR0aW5nRXh0ZW5zaW9ucyl7Y29uc3Qgb3B0aW9ucz1leHRlbnNpb24uZGVzY3JpcHRvcigpWydvcHRpb25zJ107aWYoIW9wdGlvbnN8fCFleHRlbnNpb24uZGVzY3JpcHRvcigpWydjYXRlZ29yeSddKQpjb250aW51ZTtmb3IoY29uc3QgcGFpciBvZiBvcHRpb25zKQp0aGlzLl9jb21tYW5kcy5wdXNoKFF1aWNrT3Blbi5Db21tYW5kTWVudS5jcmVhdGVTZXR0aW5nQ29tbWFuZChleHRlbnNpb24scGFpclsndGl0bGUnXSxwYWlyWyd2YWx1ZSddKSk7fX0KY29tbWFuZHMoKXtyZXR1cm4gdGhpcy5fY29tbWFuZHM7fX07UXVpY2tPcGVuLkNvbW1hbmRNZW51UHJvdmlkZXI9Y2xhc3MgZXh0ZW5kcyBRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LlByb3ZpZGVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9jb21tYW5kcz1bXTt9CmF0dGFjaCgpe2NvbnN0IGFsbENvbW1hbmRzPVF1aWNrT3Blbi5jb21tYW5kTWVudS5jb21tYW5kcygpO2NvbnN0IGFjdGlvbnM9VUkuYWN0aW9uUmVnaXN0cnkuYXZhaWxhYmxlQWN0aW9ucygpO2Zvcihjb25zdCBhY3Rpb24gb2YgYWN0aW9ucyl7aWYoYWN0aW9uLmNhdGVnb3J5KCkpCnRoaXMuX2NvbW1hbmRzLnB1c2goUXVpY2tPcGVuLkNvbW1hbmRNZW51LmNyZWF0ZUFjdGlvbkNvbW1hbmQoYWN0aW9uKSk7fQpmb3IoY29uc3QgY29tbWFuZCBvZiBhbGxDb21tYW5kcyl7aWYoY29tbWFuZC5hdmFpbGFibGUoKSkKdGhpcy5fY29tbWFuZHMucHVzaChjb21tYW5kKTt9CnRoaXMuX2NvbW1hbmRzPXRoaXMuX2NvbW1hbmRzLnNvcnQoY29tbWFuZENvbXBhcmF0b3IpO2Z1bmN0aW9uIGNvbW1hbmRDb21wYXJhdG9yKGxlZnQscmlnaHQpe2NvbnN0IGNhdHM9bGVmdC5jYXRlZ29yeSgpLmNvbXBhcmVUbyhyaWdodC5jYXRlZ29yeSgpKTtyZXR1cm4gY2F0cz9jYXRzOmxlZnQudGl0bGUoKS5jb21wYXJlVG8ocmlnaHQudGl0bGUoKSk7fX0KZGV0YWNoKCl7dGhpcy5fY29tbWFuZHM9W107fQppdGVtQ291bnQoKXtyZXR1cm4gdGhpcy5fY29tbWFuZHMubGVuZ3RoO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7cmV0dXJuIHRoaXMuX2NvbW1hbmRzW2l0ZW1JbmRleF0ua2V5KCk7fQppdGVtU2NvcmVBdChpdGVtSW5kZXgscXVlcnkpe2NvbnN0IGNvbW1hbmQ9dGhpcy5fY29tbWFuZHNbaXRlbUluZGV4XTtjb25zdCBvcGNvZGVzPURpZmYuRGlmZi5jaGFyRGlmZihxdWVyeS50b0xvd2VyQ2FzZSgpLGNvbW1hbmQudGl0bGUoKS50b0xvd2VyQ2FzZSgpKTtsZXQgc2NvcmU9MDtmb3IobGV0IGk9MDtpPG9wY29kZXMubGVuZ3RoOysraSl7aWYob3Bjb2Rlc1tpXVswXT09PURpZmYuRGlmZi5PcGVyYXRpb24uRXF1YWwpCnNjb3JlKz1vcGNvZGVzW2ldWzFdLmxlbmd0aCpvcGNvZGVzW2ldWzFdLmxlbmd0aDt9CmlmKGNvbW1hbmQuY2F0ZWdvcnkoKS5zdGFydHNXaXRoKCdQYW5lbCcpKQpzY29yZSs9MjtlbHNlIGlmKGNvbW1hbmQuY2F0ZWdvcnkoKS5zdGFydHNXaXRoKCdEcmF3ZXInKSkKc2NvcmUrPTE7cmV0dXJuIHNjb3JlO30KcmVuZGVySXRlbShpdGVtSW5kZXgscXVlcnksdGl0bGVFbGVtZW50LHN1YnRpdGxlRWxlbWVudCl7Y29uc3QgY29tbWFuZD10aGlzLl9jb21tYW5kc1tpdGVtSW5kZXhdO3RpdGxlRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IHRhZ0VsZW1lbnQ9dGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywndGFnJyk7Y29uc3QgaW5kZXg9U3RyaW5nLmhhc2hDb2RlKGNvbW1hbmQuY2F0ZWdvcnkoKSklUXVpY2tPcGVuLkNvbW1hbmRNZW51UHJvdmlkZXIuTWF0ZXJpYWxQYWxldHRlQ29sb3JzLmxlbmd0aDt0YWdFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvcj1RdWlja09wZW4uQ29tbWFuZE1lbnVQcm92aWRlci5NYXRlcmlhbFBhbGV0dGVDb2xvcnNbaW5kZXhdO3RhZ0VsZW1lbnQudGV4dENvbnRlbnQ9Y29tbWFuZC5jYXRlZ29yeSgpO3RpdGxlRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoY29tbWFuZC50aXRsZSgpKTtRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LmhpZ2hsaWdodFJhbmdlcyh0aXRsZUVsZW1lbnQscXVlcnksdHJ1ZSk7c3VidGl0bGVFbGVtZW50LnRleHRDb250ZW50PWNvbW1hbmQuc2hvcnRjdXQoKTt9CnNlbGVjdEl0ZW0oaXRlbUluZGV4LHByb21wdFZhbHVlKXtpZihpdGVtSW5kZXg9PT1udWxsKQpyZXR1cm47dGhpcy5fY29tbWFuZHNbaXRlbUluZGV4XS5leGVjdXRlKCk7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5TZWxlY3RDb21tYW5kRnJvbUNvbW1hbmRNZW51KTt9Cm5vdEZvdW5kVGV4dCgpe3JldHVybiBDb21tb24uVUlTdHJpbmcoJ05vIGNvbW1hbmRzIGZvdW5kJyk7fX07UXVpY2tPcGVuLkNvbW1hbmRNZW51UHJvdmlkZXIuTWF0ZXJpYWxQYWxldHRlQ29sb3JzPVsnI0Y0NDMzNicsJyNFOTFFNjMnLCcjOUMyN0IwJywnIzY3M0FCNycsJyMzRjUxQjUnLCcjMDNBOUY0JywnIzAwQkNENCcsJyMwMDk2ODgnLCcjNENBRjUwJywnIzhCQzM0QScsJyNDRERDMzknLCcjRkZDMTA3JywnI0ZGOTgwMCcsJyNGRjU3MjInLCcjNzk1NTQ4JywnIzlFOUU5RScsJyM2MDdEOEInXTtRdWlja09wZW4uQ29tbWFuZE1lbnUuQ29tbWFuZD1jbGFzc3tjb25zdHJ1Y3RvcihjYXRlZ29yeSx0aXRsZSxrZXksc2hvcnRjdXQsZXhlY3V0ZUhhbmRsZXIsYXZhaWxhYmxlSGFuZGxlcil7dGhpcy5fY2F0ZWdvcnk9Y2F0ZWdvcnk7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5fa2V5PWNhdGVnb3J5KydcMCcrdGl0bGUrJ1wwJytrZXk7dGhpcy5fc2hvcnRjdXQ9c2hvcnRjdXQ7dGhpcy5fZXhlY3V0ZUhhbmRsZXI9ZXhlY3V0ZUhhbmRsZXI7dGhpcy5fYXZhaWxhYmxlSGFuZGxlcj1hdmFpbGFibGVIYW5kbGVyO30KY2F0ZWdvcnkoKXtyZXR1cm4gdGhpcy5fY2F0ZWdvcnk7fQp0aXRsZSgpe3JldHVybiB0aGlzLl90aXRsZTt9CmtleSgpe3JldHVybiB0aGlzLl9rZXk7fQpzaG9ydGN1dCgpe3JldHVybiB0aGlzLl9zaG9ydGN1dDt9CmF2YWlsYWJsZSgpe3JldHVybiB0aGlzLl9hdmFpbGFibGVIYW5kbGVyP3RoaXMuX2F2YWlsYWJsZUhhbmRsZXIoKTp0cnVlO30KZXhlY3V0ZSgpe3RoaXMuX2V4ZWN1dGVIYW5kbGVyKCk7fX07UXVpY2tPcGVuLmNvbW1hbmRNZW51PW5ldyBRdWlja09wZW4uQ29tbWFuZE1lbnUoKTtRdWlja09wZW4uQ29tbWFuZE1lbnUuU2hvd0FjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuYnJpbmdUb0Zyb250KCk7UXVpY2tPcGVuLlF1aWNrT3Blbi5zaG93KCc+Jyk7cmV0dXJuIHRydWU7fX07O1F1aWNrT3Blbi5IZWxwUXVpY2tPcGVuPWNsYXNzIGV4dGVuZHMgUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fcHJvdmlkZXJzPVtdO3NlbGYucnVudGltZS5leHRlbnNpb25zKFF1aWNrT3Blbi5GaWx0ZXJlZExpc3RXaWRnZXQuUHJvdmlkZXIpLmZvckVhY2godGhpcy5fYWRkUHJvdmlkZXIuYmluZCh0aGlzKSk7fQpfYWRkUHJvdmlkZXIoZXh0ZW5zaW9uKXtpZihleHRlbnNpb24uZGVzY3JpcHRvcigpWyd0aXRsZSddKQp0aGlzLl9wcm92aWRlcnMucHVzaCh7cHJlZml4OmV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3ByZWZpeCddLHRpdGxlOmV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3RpdGxlJ119KTt9Cml0ZW1Db3VudCgpe3JldHVybiB0aGlzLl9wcm92aWRlcnMubGVuZ3RoO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1tpdGVtSW5kZXhdLnByZWZpeDt9Cml0ZW1TY29yZUF0KGl0ZW1JbmRleCxxdWVyeSl7cmV0dXJuLXRoaXMuX3Byb3ZpZGVyc1tpdGVtSW5kZXhdLnByZWZpeC5sZW5ndGg7fQpyZW5kZXJJdGVtKGl0ZW1JbmRleCxxdWVyeSx0aXRsZUVsZW1lbnQsc3VidGl0bGVFbGVtZW50KXtjb25zdCBwcm92aWRlcj10aGlzLl9wcm92aWRlcnNbaXRlbUluZGV4XTtjb25zdCBwcmVmaXhFbGVtZW50PXRpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ21vbm9zcGFjZScpO3ByZWZpeEVsZW1lbnQudGV4dENvbnRlbnQ9KHByb3ZpZGVyLnByZWZpeHx8J1x1MjAyNicpKycgJzt0aXRsZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKHByb3ZpZGVyLnRpdGxlKTt9CnNlbGVjdEl0ZW0oaXRlbUluZGV4LHByb21wdFZhbHVlKXtpZihpdGVtSW5kZXghPT1udWxsKQpRdWlja09wZW4uUXVpY2tPcGVuLnNob3codGhpcy5fcHJvdmlkZXJzW2l0ZW1JbmRleF0ucHJlZml4KTt9CnJlbmRlckFzVHdvUm93cygpe3JldHVybiBmYWxzZTt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInF1aWNrX29wZW4vZmlsdGVyZWRMaXN0V2lkZ2V0LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uZmlsdGVyZWQtbGlzdC13aWRnZXQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uZmlsdGVyZWQtbGlzdC13aWRnZXQtcHJvbXB0LWVsZW1lbnQge1xuICAgIGZsZXg6IDAgMCAzNHB4O1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMCA2cHg7XG4gICAgei1pbmRleDogMTtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1pbnB1dCB7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICBoZWlnaHQ6IDE4cHg7XG4gICAgbWFyZ2luLXRvcDogMTJweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1wcm9ncmVzcyB7XG4gICAgZmxleDogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7XG4gICAgaGVpZ2h0OiAycHg7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1wcm9ncmVzcy1iYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMyMTk2RjM7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7XG4gICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2l0aW9uOiBub25lO1xufVxuXG4uZmlsdGVyZWQtd2lkZ2V0LXByb2dyZXNzLWZhZGUge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSA1MDBtcztcbn1cblxuLmZpbHRlcmVkLWxpc3Qtd2lkZ2V0ID4gZGl2LmNvbnRhaW5lciB7XG4gICAgZmxleDogYXV0bztcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGJhY2tncm91bmQ6ICNmYmZiZmI7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1pdGVtIHtcbiAgICBwYWRkaW5nOiA0cHggNnB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBjb2xvcjogcmdiKDk1LCA5NSwgOTUpO1xufVxuXG4uZmlsdGVyZWQtbGlzdC13aWRnZXQtaXRlbS5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAuZmlsdGVyZWQtbGlzdC13aWRnZXQtaXRlbS5zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMztcbn1cblxuLmZpbHRlcmVkLWxpc3Qtd2lkZ2V0LWl0ZW0gc3Bhbi5oaWdobGlnaHQge1xuICAgIGNvbG9yOiAjMjIyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZmlsdGVyZWQtbGlzdC13aWRnZXQtaXRlbSAuZmlsdGVyZWQtbGlzdC13aWRnZXQtdGl0bGUge1xuICAgIGZsZXg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLmZpbHRlcmVkLWxpc3Qtd2lkZ2V0LWl0ZW0gLmZpbHRlcmVkLWxpc3Qtd2lkZ2V0LXN1YnRpdGxlIHtcbiAgICBmbGV4OiBub25lO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgY29sb3I6IHJnYigxNTUsIDE1NSwgMTU1KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4uZmlsdGVyZWQtbGlzdC13aWRnZXQtaXRlbSAuZmlsdGVyZWQtbGlzdC13aWRnZXQtc3VidGl0bGUgLmZpcnN0LXBhcnQge1xuICAgIGZsZXgtc2hyaW5rOiAxMDAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1pdGVtLm9uZS1yb3cge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1pdGVtLnR3by1yb3dzIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIzNSwgMjM1LCAyMzUpO1xufVxuXG4udGFnIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogMXB4IDNweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG59XG5cbi5maWx0ZXJlZC1saXN0LXdpZGdldC1pdGVtIC50YWcgLmhpZ2hsaWdodCB7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4ubm90LWZvdW5kLXRleHQge1xuICAgIGhlaWdodDogMzRweDtcbiAgICBsaW5lLWhlaWdodDogMzRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgY29sb3I6ICM4ODg7XG4gICAgYmFja2dyb3VuZDogI2ZiZmJmYjtcbn1cblxuLyojIHNvdXJjZVVSTD1xdWlja19vcGVuL2ZpbHRlcmVkTGlzdFdpZGdldC5jc3MgKi8iO1Jlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RhcmdldC5yZWdpc3RlckFwcGxpY2F0aW9uQ2FjaGVEaXNwYXRjaGVyKG5ldyBSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZURpc3BhdGNoZXIodGhpcykpO3RoaXMuX2FnZW50PXRhcmdldC5hcHBsaWNhdGlvbkNhY2hlQWdlbnQoKTt0aGlzLl9hZ2VudC5lbmFibGUoKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fZnJhbWVOYXZpZ2F0ZWQsdGhpcyk7cmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkZyYW1lRGV0YWNoZWQsdGhpcy5fZnJhbWVEZXRhY2hlZCx0aGlzKTt0aGlzLl9zdGF0dXNlcz17fTt0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lPXt9O3RoaXMuX21haW5GcmFtZU5hdmlnYXRlZCgpO3RoaXMuX29uTGluZT10cnVlO30KYXN5bmMgX2ZyYW1lTmF2aWdhdGVkKGV2ZW50KXtjb25zdCBmcmFtZT0oZXZlbnQuZGF0YSk7aWYoZnJhbWUuaXNNYWluRnJhbWUoKSl7dGhpcy5fbWFpbkZyYW1lTmF2aWdhdGVkKCk7cmV0dXJuO30KY29uc3QgZnJhbWVJZD1mcmFtZS5pZDtjb25zdCBtYW5pZmVzdFVSTD1hd2FpdCB0aGlzLl9hZ2VudC5nZXRNYW5pZmVzdEZvckZyYW1lKGZyYW1lSWQpO2lmKG1hbmlmZXN0VVJMIT09bnVsbCYmIW1hbmlmZXN0VVJMKQp0aGlzLl9mcmFtZU1hbmlmZXN0UmVtb3ZlZChmcmFtZUlkKTt9Cl9mcmFtZURldGFjaGVkKGV2ZW50KXtjb25zdCBmcmFtZT0oZXZlbnQuZGF0YSk7dGhpcy5fZnJhbWVNYW5pZmVzdFJlbW92ZWQoZnJhbWUuaWQpO30KcmVzZXQoKXt0aGlzLl9zdGF0dXNlcz17fTt0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lPXt9O3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLkZyYW1lTWFuaWZlc3RzUmVzZXQpO30KYXN5bmMgX21haW5GcmFtZU5hdmlnYXRlZCgpe2NvbnN0IGZyYW1lc1dpdGhNYW5pZmVzdHM9YXdhaXQgdGhpcy5fYWdlbnQuZ2V0RnJhbWVzV2l0aE1hbmlmZXN0cygpO2Zvcihjb25zdCBmcmFtZSBvZiBmcmFtZXNXaXRoTWFuaWZlc3RzfHxbXSkKdGhpcy5fZnJhbWVNYW5pZmVzdFVwZGF0ZWQoZnJhbWUuZnJhbWVJZCxmcmFtZS5tYW5pZmVzdFVSTCxmcmFtZS5zdGF0dXMpO30KX2ZyYW1lTWFuaWZlc3RVcGRhdGVkKGZyYW1lSWQsbWFuaWZlc3RVUkwsc3RhdHVzKXtpZihzdGF0dXM9PT1hcHBsaWNhdGlvbkNhY2hlLlVOQ0FDSEVEKXt0aGlzLl9mcmFtZU1hbmlmZXN0UmVtb3ZlZChmcmFtZUlkKTtyZXR1cm47fQppZighbWFuaWZlc3RVUkwpCnJldHVybjtpZih0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lW2ZyYW1lSWRdJiZtYW5pZmVzdFVSTCE9PXRoaXMuX21hbmlmZXN0VVJMc0J5RnJhbWVbZnJhbWVJZF0pCnRoaXMuX2ZyYW1lTWFuaWZlc3RSZW1vdmVkKGZyYW1lSWQpO2NvbnN0IHN0YXR1c0NoYW5nZWQ9dGhpcy5fc3RhdHVzZXNbZnJhbWVJZF0hPT1zdGF0dXM7dGhpcy5fc3RhdHVzZXNbZnJhbWVJZF09c3RhdHVzO2lmKCF0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lW2ZyYW1lSWRdKXt0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lW2ZyYW1lSWRdPW1hbmlmZXN0VVJMO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLkZyYW1lTWFuaWZlc3RBZGRlZCxmcmFtZUlkKTt9CmlmKHN0YXR1c0NoYW5nZWQpCnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLkZyYW1lTWFuaWZlc3RTdGF0dXNVcGRhdGVkLGZyYW1lSWQpO30KX2ZyYW1lTWFuaWZlc3RSZW1vdmVkKGZyYW1lSWQpe2lmKCF0aGlzLl9tYW5pZmVzdFVSTHNCeUZyYW1lW2ZyYW1lSWRdKQpyZXR1cm47ZGVsZXRlIHRoaXMuX21hbmlmZXN0VVJMc0J5RnJhbWVbZnJhbWVJZF07ZGVsZXRlIHRoaXMuX3N0YXR1c2VzW2ZyYW1lSWRdO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLkZyYW1lTWFuaWZlc3RSZW1vdmVkLGZyYW1lSWQpO30KZnJhbWVNYW5pZmVzdFVSTChmcmFtZUlkKXtyZXR1cm4gdGhpcy5fbWFuaWZlc3RVUkxzQnlGcmFtZVtmcmFtZUlkXXx8Jyc7fQpmcmFtZU1hbmlmZXN0U3RhdHVzKGZyYW1lSWQpe3JldHVybiB0aGlzLl9zdGF0dXNlc1tmcmFtZUlkXXx8YXBwbGljYXRpb25DYWNoZS5VTkNBQ0hFRDt9CmdldCBvbkxpbmUoKXtyZXR1cm4gdGhpcy5fb25MaW5lO30KX3N0YXR1c1VwZGF0ZWQoZnJhbWVJZCxtYW5pZmVzdFVSTCxzdGF0dXMpe3RoaXMuX2ZyYW1lTWFuaWZlc3RVcGRhdGVkKGZyYW1lSWQsbWFuaWZlc3RVUkwsc3RhdHVzKTt9CnJlcXVlc3RBcHBsaWNhdGlvbkNhY2hlKGZyYW1lSWQpe3JldHVybiB0aGlzLl9hZ2VudC5nZXRBcHBsaWNhdGlvbkNhY2hlRm9yRnJhbWUoZnJhbWVJZCk7fQpfbmV0d29ya1N0YXRlVXBkYXRlZChpc05vd09ubGluZSl7dGhpcy5fb25MaW5lPWlzTm93T25saW5lO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLk5ldHdvcmtTdGF0ZUNoYW5nZWQsaXNOb3dPbmxpbmUpO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZU1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00sZmFsc2UpO1Jlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzPXtGcmFtZU1hbmlmZXN0U3RhdHVzVXBkYXRlZDpTeW1ib2woJ0ZyYW1lTWFuaWZlc3RTdGF0dXNVcGRhdGVkJyksRnJhbWVNYW5pZmVzdEFkZGVkOlN5bWJvbCgnRnJhbWVNYW5pZmVzdEFkZGVkJyksRnJhbWVNYW5pZmVzdFJlbW92ZWQ6U3ltYm9sKCdGcmFtZU1hbmlmZXN0UmVtb3ZlZCcpLEZyYW1lTWFuaWZlc3RzUmVzZXQ6U3ltYm9sKCdGcmFtZU1hbmlmZXN0c1Jlc2V0JyksTmV0d29ya1N0YXRlQ2hhbmdlZDpTeW1ib2woJ05ldHdvcmtTdGF0ZUNoYW5nZWQnKX07UmVzb3VyY2VzLkFwcGxpY2F0aW9uQ2FjaGVEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKGFwcGxpY2F0aW9uQ2FjaGVNb2RlbCl7dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsPWFwcGxpY2F0aW9uQ2FjaGVNb2RlbDt9CmFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkKGZyYW1lSWQsbWFuaWZlc3RVUkwsc3RhdHVzKXt0aGlzLl9hcHBsaWNhdGlvbkNhY2hlTW9kZWwuX3N0YXR1c1VwZGF0ZWQoZnJhbWVJZCxtYW5pZmVzdFVSTCxzdGF0dXMpO30KbmV0d29ya1N0YXRlVXBkYXRlZChpc05vd09ubGluZSl7dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLl9uZXR3b3JrU3RhdGVVcGRhdGVkKGlzTm93T25saW5lKTt9fTs7UmVzb3VyY2VzLkFwcE1hbmlmZXN0Vmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Jlc291cmNlcy9hcHBNYW5pZmVzdFZpZXcuY3NzJyk7dGhpcy5fZW1wdHlWaWV3PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ05vIG1hbmlmZXN0IGRldGVjdGVkJykpO2NvbnN0IHA9dGhpcy5fZW1wdHlWaWV3LmFwcGVuZFBhcmFncmFwaCgpO2NvbnN0IGxpbmtFbGVtZW50PVVJLlhMaW5rLmNyZWF0ZSgnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9lbmdhZ2UtYW5kLXJldGFpbi93ZWItYXBwLW1hbmlmZXN0Lz91dG1fc291cmNlPWRldnRvb2xzJyxDb21tb24uVUlTdHJpbmcoJ1JlYWQgbW9yZSBhYm91dCB0aGUgd2ViIG1hbmlmZXN0JykpO3AuYXBwZW5kQ2hpbGQoVUkuZm9ybWF0TG9jYWxpemVkKCdBIHdlYiBtYW5pZmVzdCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgaG93IHlvdXIgYXBwIGJlaGF2ZXMgd2hlbiBsYXVuY2hlZCBhbmQgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiAlcycsW2xpbmtFbGVtZW50XSkpO3RoaXMuX2VtcHR5Vmlldy5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2VtcHR5Vmlldy5oaWRlV2lkZ2V0KCk7dGhpcy5fcmVwb3J0Vmlldz1uZXcgVUkuUmVwb3J0VmlldyhDb21tb24uVUlTdHJpbmcoJ0FwcCBNYW5pZmVzdCcpKTt0aGlzLl9yZXBvcnRWaWV3LnNob3codGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5fcmVwb3J0Vmlldy5oaWRlV2lkZ2V0KCk7dGhpcy5fZXJyb3JzU2VjdGlvbj10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdFcnJvcnMgYW5kIHdhcm5pbmdzJykpO3RoaXMuX2lkZW50aXR5U2VjdGlvbj10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdJZGVudGl0eScpKTtjb25zdCB0b29sYmFyPXRoaXMuX2lkZW50aXR5U2VjdGlvbi5jcmVhdGVUb29sYmFyKCk7dG9vbGJhci5yZW5kZXJBc0xpbmtzKCk7Y29uc3QgYWRkVG9Ib21lU2NyZWVuPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQWRkIHRvIGhvbWVzY3JlZW4nKSx1bmRlZmluZWQsQ29tbW9uLlVJU3RyaW5nKCdBZGQgdG8gaG9tZXNjcmVlbicpKTthZGRUb0hvbWVTY3JlZW4uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9hZGRUb0hvbWVzY3JlZW4sdGhpcyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShhZGRUb0hvbWVTY3JlZW4pO3RoaXMuX3ByZXNlbnRhdGlvblNlY3Rpb249dGhpcy5fcmVwb3J0Vmlldy5hcHBlbmRTZWN0aW9uKENvbW1vbi5VSVN0cmluZygnUHJlc2VudGF0aW9uJykpO3RoaXMuX2ljb25zU2VjdGlvbj10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdJY29ucycpKTt0aGlzLl9uYW1lRmllbGQ9dGhpcy5faWRlbnRpdHlTZWN0aW9uLmFwcGVuZEZpZWxkKENvbW1vbi5VSVN0cmluZygnTmFtZScpKTt0aGlzLl9zaG9ydE5hbWVGaWVsZD10aGlzLl9pZGVudGl0eVNlY3Rpb24uYXBwZW5kRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdTaG9ydCBuYW1lJykpO3RoaXMuX3N0YXJ0VVJMRmllbGQ9dGhpcy5fcHJlc2VudGF0aW9uU2VjdGlvbi5hcHBlbmRGaWVsZChDb21tb24uVUlTdHJpbmcoJ1N0YXJ0IFVSTCcpKTtjb25zdCB0aGVtZUNvbG9yRmllbGQ9dGhpcy5fcHJlc2VudGF0aW9uU2VjdGlvbi5hcHBlbmRGaWVsZChDb21tb24uVUlTdHJpbmcoJ1RoZW1lIGNvbG9yJykpO3RoaXMuX3RoZW1lQ29sb3JTd2F0Y2g9SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLmNyZWF0ZSgpO3RoZW1lQ29sb3JGaWVsZC5hcHBlbmRDaGlsZCh0aGlzLl90aGVtZUNvbG9yU3dhdGNoKTtjb25zdCBiYWNrZ3JvdW5kQ29sb3JGaWVsZD10aGlzLl9wcmVzZW50YXRpb25TZWN0aW9uLmFwcGVuZEZpZWxkKENvbW1vbi5VSVN0cmluZygnQmFja2dyb3VuZCBjb2xvcicpKTt0aGlzLl9iYWNrZ3JvdW5kQ29sb3JTd2F0Y2g9SW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoLmNyZWF0ZSgpO2JhY2tncm91bmRDb2xvckZpZWxkLmFwcGVuZENoaWxkKHRoaXMuX2JhY2tncm91bmRDb2xvclN3YXRjaCk7dGhpcy5fb3JpZW50YXRpb25GaWVsZD10aGlzLl9wcmVzZW50YXRpb25TZWN0aW9uLmFwcGVuZEZpZWxkKENvbW1vbi5VSVN0cmluZygnT3JpZW50YXRpb24nKSk7dGhpcy5fZGlzcGxheUZpZWxkPXRoaXMuX3ByZXNlbnRhdGlvblNlY3Rpb24uYXBwZW5kRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdEaXNwbGF5JykpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLlJlc291cmNlVHJlZU1vZGVsLHRoaXMpO30KbW9kZWxBZGRlZChyZXNvdXJjZVRyZWVNb2RlbCl7aWYodGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwpCnJldHVybjt0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbD1yZXNvdXJjZVRyZWVNb2RlbDt0aGlzLl91cGRhdGVNYW5pZmVzdCgpO3Jlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fdXBkYXRlTWFuaWZlc3QsdGhpcyk7fQptb2RlbFJlbW92ZWQocmVzb3VyY2VUcmVlTW9kZWwpe2lmKCF0aGlzLl9yZXNvdXJjZVRyZWVNb2RlbHx8dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwhPT1yZXNvdXJjZVRyZWVNb2RlbCkKcmV0dXJuO3Jlc291cmNlVHJlZU1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fdXBkYXRlTWFuaWZlc3QsdGhpcyk7ZGVsZXRlIHRoaXMuX3Jlc291cmNlVHJlZU1vZGVsO30KX3VwZGF0ZU1hbmlmZXN0KCl7dGhpcy5fcmVzb3VyY2VUcmVlTW9kZWwuZmV0Y2hBcHBNYW5pZmVzdCh0aGlzLl9yZW5kZXJNYW5pZmVzdC5iaW5kKHRoaXMpKTt9Cl9yZW5kZXJNYW5pZmVzdCh1cmwsZGF0YSxlcnJvcnMpe2lmKCFkYXRhJiYhZXJyb3JzLmxlbmd0aCl7dGhpcy5fZW1wdHlWaWV3LnNob3dXaWRnZXQoKTt0aGlzLl9yZXBvcnRWaWV3LmhpZGVXaWRnZXQoKTtyZXR1cm47fQp0aGlzLl9lbXB0eVZpZXcuaGlkZVdpZGdldCgpO3RoaXMuX3JlcG9ydFZpZXcuc2hvd1dpZGdldCgpO3RoaXMuX3JlcG9ydFZpZXcuc2V0VVJMKENvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwodXJsKSk7dGhpcy5fZXJyb3JzU2VjdGlvbi5jbGVhckNvbnRlbnQoKTt0aGlzLl9lcnJvcnNTZWN0aW9uLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhZXJyb3JzLmxlbmd0aCk7Zm9yKGNvbnN0IGVycm9yIG9mIGVycm9ycyl7dGhpcy5fZXJyb3JzU2VjdGlvbi5hcHBlbmRSb3coKS5hcHBlbmRDaGlsZChVSS5jcmVhdGVMYWJlbChlcnJvci5tZXNzYWdlLGVycm9yLmNyaXRpY2FsPydzbWFsbGljb24tZXJyb3InOidzbWFsbGljb24td2FybmluZycpKTt9CmlmKCFkYXRhKQpyZXR1cm47aWYoZGF0YS5jaGFyQ29kZUF0KDApPT09MHhGRUZGKQpkYXRhPWRhdGEuc2xpY2UoMSk7Y29uc3QgcGFyc2VkTWFuaWZlc3Q9SlNPTi5wYXJzZShkYXRhKTt0aGlzLl9uYW1lRmllbGQudGV4dENvbnRlbnQ9c3RyaW5nUHJvcGVydHkoJ25hbWUnKTt0aGlzLl9zaG9ydE5hbWVGaWVsZC50ZXh0Q29udGVudD1zdHJpbmdQcm9wZXJ0eSgnc2hvcnRfbmFtZScpO3RoaXMuX3N0YXJ0VVJMRmllbGQucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBzdGFydFVSTD1zdHJpbmdQcm9wZXJ0eSgnc3RhcnRfdXJsJyk7aWYoc3RhcnRVUkwpe2NvbnN0IGNvbXBsZXRlVVJMPShDb21tb24uUGFyc2VkVVJMLmNvbXBsZXRlVVJMKHVybCxzdGFydFVSTCkpO3RoaXMuX3N0YXJ0VVJMRmllbGQuYXBwZW5kQ2hpbGQoQ29tcG9uZW50cy5MaW5raWZpZXIubGlua2lmeVVSTChjb21wbGV0ZVVSTCx7dGV4dDpzdGFydFVSTH0pKTt9CnRoaXMuX3RoZW1lQ29sb3JTd2F0Y2guY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhc3RyaW5nUHJvcGVydHkoJ3RoZW1lX2NvbG9yJykpO2NvbnN0IHRoZW1lQ29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKHN0cmluZ1Byb3BlcnR5KCd0aGVtZV9jb2xvcicpfHwnd2hpdGUnKXx8Q29tbW9uLkNvbG9yLnBhcnNlKCd3aGl0ZScpO3RoaXMuX3RoZW1lQ29sb3JTd2F0Y2guc2V0Q29sb3IoKHRoZW1lQ29sb3IpKTt0aGlzLl9iYWNrZ3JvdW5kQ29sb3JTd2F0Y2guY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhc3RyaW5nUHJvcGVydHkoJ2JhY2tncm91bmRfY29sb3InKSk7Y29uc3QgYmFja2dyb3VuZENvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShzdHJpbmdQcm9wZXJ0eSgnYmFja2dyb3VuZF9jb2xvcicpfHwnd2hpdGUnKXx8Q29tbW9uLkNvbG9yLnBhcnNlKCd3aGl0ZScpO3RoaXMuX2JhY2tncm91bmRDb2xvclN3YXRjaC5zZXRDb2xvcigoYmFja2dyb3VuZENvbG9yKSk7dGhpcy5fb3JpZW50YXRpb25GaWVsZC50ZXh0Q29udGVudD1zdHJpbmdQcm9wZXJ0eSgnb3JpZW50YXRpb24nKTt0aGlzLl9kaXNwbGF5RmllbGQudGV4dENvbnRlbnQ9c3RyaW5nUHJvcGVydHkoJ2Rpc3BsYXknKTtjb25zdCBpY29ucz1wYXJzZWRNYW5pZmVzdFsnaWNvbnMnXXx8W107dGhpcy5faWNvbnNTZWN0aW9uLmNsZWFyQ29udGVudCgpO2Zvcihjb25zdCBpY29uIG9mIGljb25zKXtjb25zdCB0aXRsZT0oaWNvblsnc2l6ZXMnXXx8JycpKydcbicrKGljb25bJ3R5cGUnXXx8JycpO2NvbnN0IGZpZWxkPXRoaXMuX2ljb25zU2VjdGlvbi5hcHBlbmRGaWVsZCh0aXRsZSk7Y29uc3QgaW1hZ2VFbGVtZW50PWZpZWxkLmNyZWF0ZUNoaWxkKCdpbWcnKTtpbWFnZUVsZW1lbnQuc3R5bGUubWF4V2lkdGg9JzIwMHB4JztpbWFnZUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0PScyMDBweCc7aW1hZ2VFbGVtZW50LnNyYz1Db21tb24uUGFyc2VkVVJMLmNvbXBsZXRlVVJMKHVybCxpY29uWydzcmMnXSk7fQpmdW5jdGlvbiBzdHJpbmdQcm9wZXJ0eShuYW1lKXtjb25zdCB2YWx1ZT1wYXJzZWRNYW5pZmVzdFtuYW1lXTtpZih0eXBlb2YgdmFsdWUhPT0nc3RyaW5nJykKcmV0dXJuJyc7cmV0dXJuIHZhbHVlO319Cl9hZGRUb0hvbWVzY3JlZW4oZXZlbnQpe2NvbnN0IHRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7aWYodGFyZ2V0JiZ0YXJnZXQuaGFzQnJvd3NlckNhcGFiaWxpdHkoKSl7dGFyZ2V0LnBhZ2VBZ2VudCgpLnJlcXVlc3RBcHBCYW5uZXIoKTtDb21tb24uY29uc29sZS5zaG93KCk7fX19OztSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZUl0ZW1zVmlldz1jbGFzcyBleHRlbmRzIFVJLlNpbXBsZVZpZXd7Y29uc3RydWN0b3IobW9kZWwsZnJhbWVJZCl7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdBcHBDYWNoZScpKTt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RvcmFnZS12aWV3JywndGFibGUnKTt0aGlzLl9kZWxldGVCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdEZWxldGUnKSwnbGFyZ2VpY29uLWRlbGV0ZScpO3RoaXMuX2RlbGV0ZUJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTt0aGlzLl9kZWxldGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9kZWxldGVCdXR0b25DbGlja2VkLHRoaXMpO3RoaXMuX2Nvbm5lY3Rpdml0eUljb249Y3JlYXRlRWxlbWVudCgnbGFiZWwnLCdkdC1pY29uLWxhYmVsJyk7dGhpcy5fY29ubmVjdGl2aXR5SWNvbi5zdHlsZS5tYXJnaW49JzAgMnB4IDAgNXB4Jzt0aGlzLl9zdGF0dXNJY29uPWNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywnZHQtaWNvbi1sYWJlbCcpO3RoaXMuX3N0YXR1c0ljb24uc3R5bGUubWFyZ2luPScwIDJweCAwIDVweCc7dGhpcy5fZnJhbWVJZD1mcmFtZUlkO3RoaXMuX2VtcHR5V2lkZ2V0PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ05vIEFwcGxpY2F0aW9uIENhY2hlIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4nKSk7dGhpcy5fZW1wdHlXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX21hcmtEaXJ0eSgpO2NvbnN0IHN0YXR1cz10aGlzLl9tb2RlbC5mcmFtZU1hbmlmZXN0U3RhdHVzKGZyYW1lSWQpO3RoaXMudXBkYXRlU3RhdHVzKHN0YXR1cyk7dGhpcy51cGRhdGVOZXR3b3JrU3RhdGUodGhpcy5fbW9kZWwub25MaW5lKTt0aGlzLl9kZWxldGVCdXR0b24uZWxlbWVudC5zdHlsZS5kaXNwbGF5PSdub25lJzt9CnN5bmNUb29sYmFySXRlbXMoKXtyZXR1cm5bdGhpcy5fZGVsZXRlQnV0dG9uLG5ldyBVSS5Ub29sYmFySXRlbSh0aGlzLl9jb25uZWN0aXZpdHlJY29uKSxuZXcgVUkuVG9vbGJhclNlcGFyYXRvcigpLG5ldyBVSS5Ub29sYmFySXRlbSh0aGlzLl9zdGF0dXNJY29uKV07fQp3YXNTaG93bigpe3RoaXMuX21heWJlVXBkYXRlKCk7fQp3aWxsSGlkZSgpe3RoaXMuX2RlbGV0ZUJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTt9Cl9tYXliZVVwZGF0ZSgpe2lmKCF0aGlzLmlzU2hvd2luZygpfHwhdGhpcy5fdmlld0RpcnR5KQpyZXR1cm47dGhpcy5fdXBkYXRlKCk7dGhpcy5fdmlld0RpcnR5PWZhbHNlO30KX21hcmtEaXJ0eSgpe3RoaXMuX3ZpZXdEaXJ0eT10cnVlO30KdXBkYXRlU3RhdHVzKHN0YXR1cyl7Y29uc3Qgb2xkU3RhdHVzPXRoaXMuX3N0YXR1czt0aGlzLl9zdGF0dXM9c3RhdHVzO2NvbnN0IHN0YXR1c0luZm9ybWF0aW9uPXt9O3N0YXR1c0luZm9ybWF0aW9uW2FwcGxpY2F0aW9uQ2FjaGUuVU5DQUNIRURdPXt0eXBlOidzbWFsbGljb24tcmVkLWJhbGwnLHRleHQ6J1VOQ0FDSEVEJ307c3RhdHVzSW5mb3JtYXRpb25bYXBwbGljYXRpb25DYWNoZS5JRExFXT17dHlwZTonc21hbGxpY29uLWdyZWVuLWJhbGwnLHRleHQ6J0lETEUnfTtzdGF0dXNJbmZvcm1hdGlvblthcHBsaWNhdGlvbkNhY2hlLkNIRUNLSU5HXT17dHlwZTonc21hbGxpY29uLW9yYW5nZS1iYWxsJyx0ZXh0OidDSEVDS0lORyd9O3N0YXR1c0luZm9ybWF0aW9uW2FwcGxpY2F0aW9uQ2FjaGUuRE9XTkxPQURJTkddPXt0eXBlOidzbWFsbGljb24tb3JhbmdlLWJhbGwnLHRleHQ6J0RPV05MT0FESU5HJ307c3RhdHVzSW5mb3JtYXRpb25bYXBwbGljYXRpb25DYWNoZS5VUERBVEVSRUFEWV09e3R5cGU6J3NtYWxsaWNvbi1ncmVlbi1iYWxsJyx0ZXh0OidVUERBVEVSRUFEWSd9O3N0YXR1c0luZm9ybWF0aW9uW2FwcGxpY2F0aW9uQ2FjaGUuT0JTT0xFVEVdPXt0eXBlOidzbWFsbGljb24tcmVkLWJhbGwnLHRleHQ6J09CU09MRVRFJ307Y29uc3QgaW5mbz1zdGF0dXNJbmZvcm1hdGlvbltzdGF0dXNdfHxzdGF0dXNJbmZvcm1hdGlvblthcHBsaWNhdGlvbkNhY2hlLlVOQ0FDSEVEXTt0aGlzLl9zdGF0dXNJY29uLnR5cGU9aW5mby50eXBlO3RoaXMuX3N0YXR1c0ljb24udGV4dENvbnRlbnQ9aW5mby50ZXh0O2lmKHRoaXMuaXNTaG93aW5nKCkmJnRoaXMuX3N0YXR1cz09PWFwcGxpY2F0aW9uQ2FjaGUuSURMRSYmKG9sZFN0YXR1cz09PWFwcGxpY2F0aW9uQ2FjaGUuVVBEQVRFUkVBRFl8fCF0aGlzLl9yZXNvdXJjZXMpKQp0aGlzLl9tYXJrRGlydHkoKTt0aGlzLl9tYXliZVVwZGF0ZSgpO30KdXBkYXRlTmV0d29ya1N0YXRlKGlzTm93T25saW5lKXtpZihpc05vd09ubGluZSl7dGhpcy5fY29ubmVjdGl2aXR5SWNvbi50eXBlPSdzbWFsbGljb24tZ3JlZW4tYmFsbCc7dGhpcy5fY29ubmVjdGl2aXR5SWNvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ09ubGluZScpO31lbHNle3RoaXMuX2Nvbm5lY3Rpdml0eUljb24udHlwZT0nc21hbGxpY29uLXJlZC1iYWxsJzt0aGlzLl9jb25uZWN0aXZpdHlJY29uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnT2ZmbGluZScpO319CmFzeW5jIF91cGRhdGUoKXtjb25zdCBhcHBsaWNhdGlvbkNhY2hlPWF3YWl0IHRoaXMuX21vZGVsLnJlcXVlc3RBcHBsaWNhdGlvbkNhY2hlKHRoaXMuX2ZyYW1lSWQpO2lmKCFhcHBsaWNhdGlvbkNhY2hlfHwhYXBwbGljYXRpb25DYWNoZS5tYW5pZmVzdFVSTCl7ZGVsZXRlIHRoaXMuX21hbmlmZXN0O2RlbGV0ZSB0aGlzLl9jcmVhdGlvblRpbWU7ZGVsZXRlIHRoaXMuX3VwZGF0ZVRpbWU7ZGVsZXRlIHRoaXMuX3NpemU7ZGVsZXRlIHRoaXMuX3Jlc291cmNlczt0aGlzLl9lbXB0eVdpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fZGVsZXRlQnV0dG9uLnNldFZpc2libGUoZmFsc2UpO2lmKHRoaXMuX2RhdGFHcmlkKQp0aGlzLl9kYXRhR3JpZC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3JldHVybjt9CnRoaXMuX21hbmlmZXN0PWFwcGxpY2F0aW9uQ2FjaGUubWFuaWZlc3RVUkw7dGhpcy5fY3JlYXRpb25UaW1lPWFwcGxpY2F0aW9uQ2FjaGUuY3JlYXRpb25UaW1lO3RoaXMuX3VwZGF0ZVRpbWU9YXBwbGljYXRpb25DYWNoZS51cGRhdGVUaW1lO3RoaXMuX3NpemU9YXBwbGljYXRpb25DYWNoZS5zaXplO3RoaXMuX3Jlc291cmNlcz1hcHBsaWNhdGlvbkNhY2hlLnJlc291cmNlcztpZighdGhpcy5fZGF0YUdyaWQpCnRoaXMuX2NyZWF0ZURhdGFHcmlkKCk7dGhpcy5fcG9wdWxhdGVEYXRhR3JpZCgpO3RoaXMuX2RhdGFHcmlkLmF1dG9TaXplQ29sdW1ucygyMCw4MCk7dGhpcy5fZGF0YUdyaWQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt0aGlzLl9lbXB0eVdpZGdldC5kZXRhY2goKTt0aGlzLl9kZWxldGVCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTt9Cl9jcmVhdGVEYXRhR3JpZCgpe2NvbnN0IGNvbHVtbnM9KFt7aWQ6J3Jlc291cmNlJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1Jlc291cmNlJyksc29ydDpEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5Bc2NlbmRpbmcsc29ydGFibGU6dHJ1ZX0se2lkOid0eXBlJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1R5cGUnKSxzb3J0YWJsZTp0cnVlfSx7aWQ6J3NpemUnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnU2l6ZScpLGFsaWduOkRhdGFHcmlkLkRhdGFHcmlkLkFsaWduLlJpZ2h0LHNvcnRhYmxlOnRydWV9XSk7dGhpcy5fZGF0YUdyaWQ9bmV3IERhdGFHcmlkLkRhdGFHcmlkKGNvbHVtbnMpO3RoaXMuX2RhdGFHcmlkLnNldFN0cmlwZWQodHJ1ZSk7dGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU29ydGluZ0NoYW5nZWQsdGhpcy5fcG9wdWxhdGVEYXRhR3JpZCx0aGlzKTt9Cl9wb3B1bGF0ZURhdGFHcmlkKCl7Y29uc3Qgc2VsZWN0ZWRSZXNvdXJjZT10aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGU/dGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlLnJlc291cmNlOm51bGw7Y29uc3Qgc29ydERpcmVjdGlvbj10aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpPzE6LTE7ZnVuY3Rpb24gbnVtYmVyQ29tcGFyZShmaWVsZCxyZXNvdXJjZTEscmVzb3VyY2UyKXtyZXR1cm4gc29ydERpcmVjdGlvbioocmVzb3VyY2UxW2ZpZWxkXS1yZXNvdXJjZTJbZmllbGRdKTt9CmZ1bmN0aW9uIGxvY2FsZUNvbXBhcmUoZmllbGQscmVzb3VyY2UxLHJlc291cmNlMil7cmV0dXJuIHNvcnREaXJlY3Rpb24qKHJlc291cmNlMVtmaWVsZF0rJycpLmxvY2FsZUNvbXBhcmUocmVzb3VyY2UyW2ZpZWxkXSsnJyk7fQpsZXQgY29tcGFyYXRvcjtzd2l0Y2godGhpcy5fZGF0YUdyaWQuc29ydENvbHVtbklkKCkpe2Nhc2UncmVzb3VyY2UnOmNvbXBhcmF0b3I9bG9jYWxlQ29tcGFyZS5iaW5kKG51bGwsJ3VybCcpO2JyZWFrO2Nhc2UndHlwZSc6Y29tcGFyYXRvcj1sb2NhbGVDb21wYXJlLmJpbmQobnVsbCwndHlwZScpO2JyZWFrO2Nhc2Unc2l6ZSc6Y29tcGFyYXRvcj1udW1iZXJDb21wYXJlLmJpbmQobnVsbCwnc2l6ZScpO2JyZWFrO2RlZmF1bHQ6bG9jYWxlQ29tcGFyZS5iaW5kKG51bGwsJ3Jlc291cmNlJyk7fQp0aGlzLl9yZXNvdXJjZXMuc29ydChjb21wYXJhdG9yKTt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7bGV0IG5vZGVUb1NlbGVjdDtmb3IobGV0IGk9MDtpPHRoaXMuX3Jlc291cmNlcy5sZW5ndGg7KytpKXtjb25zdCBkYXRhPXt9O2NvbnN0IHJlc291cmNlPXRoaXMuX3Jlc291cmNlc1tpXTtkYXRhLnJlc291cmNlPXJlc291cmNlLnVybDtkYXRhLnR5cGU9cmVzb3VyY2UudHlwZTtkYXRhLnNpemU9TnVtYmVyLmJ5dGVzVG9TdHJpbmcocmVzb3VyY2Uuc2l6ZSk7Y29uc3Qgbm9kZT1uZXcgRGF0YUdyaWQuRGF0YUdyaWROb2RlKGRhdGEpO25vZGUucmVzb3VyY2U9cmVzb3VyY2U7bm9kZS5zZWxlY3RhYmxlPXRydWU7dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKS5hcHBlbmRDaGlsZChub2RlKTtpZihyZXNvdXJjZT09PXNlbGVjdGVkUmVzb3VyY2Upe25vZGVUb1NlbGVjdD1ub2RlO25vZGVUb1NlbGVjdC5zZWxlY3RlZD10cnVlO319CmlmKCFub2RlVG9TZWxlY3QmJnRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkuY2hpbGRyZW4ubGVuZ3RoKQp0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmNoaWxkcmVuWzBdLnNlbGVjdGVkPXRydWU7fQpfZGVsZXRlQnV0dG9uQ2xpY2tlZChldmVudCl7aWYoIXRoaXMuX2RhdGFHcmlkfHwhdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlKQpyZXR1cm47dGhpcy5fZGVsZXRlQ2FsbGJhY2sodGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlKTt9Cl9kZWxldGVDYWxsYmFjayhub2RlKXt9fTs7UmVzb3VyY2VzLkNsZWFyU3RvcmFnZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5UaHJvdHRsZWRXaWRnZXR7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlLDEwMDApO2NvbnN0IHR5cGVzPVByb3RvY29sLlN0b3JhZ2UuU3RvcmFnZVR5cGU7dGhpcy5fcGllQ29sb3JzPW5ldyBNYXAoW1t0eXBlcy5BcHBjYWNoZSwncmdiKDExMCwgMTYxLCAyMjYpJ10sW3R5cGVzLkNhY2hlX3N0b3JhZ2UsJ3JnYigyMjksIDExMywgMTEzKSddLFt0eXBlcy5Db29raWVzLCdyZ2IoMjM5LCAxOTYsIDg3KSddLFt0eXBlcy5JbmRleGVkZGIsJ3JnYigxNTUsIDEyNywgMjMwKSddLFt0eXBlcy5Mb2NhbF9zdG9yYWdlLCdyZ2IoMTE2LCAxNzgsIDEwMiknXSxbdHlwZXMuU2VydmljZV93b3JrZXJzLCdyZ2IoMjU1LCAxNjcsIDM2KSddLFt0eXBlcy5XZWJzcWwsJ3JnYigyMDMsIDIyMCwgNTYpJ10sXSk7dGhpcy5fcmVwb3J0Vmlldz1uZXcgVUkuUmVwb3J0VmlldyhDb21tb24uVUlTdHJpbmcoJ0NsZWFyIHN0b3JhZ2UnKSk7dGhpcy5fcmVwb3J0Vmlldy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdyZXNvdXJjZXMvY2xlYXJTdG9yYWdlVmlldy5jc3MnKTt0aGlzLl9yZXBvcnRWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2xlYXItc3RvcmFnZS1oZWFkZXInKTt0aGlzLl9yZXBvcnRWaWV3LnNob3codGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5fdGFyZ2V0PW51bGw7dGhpcy5fc2VjdXJpdHlPcmlnaW49bnVsbDt0aGlzLl9zZXR0aW5ncz1uZXcgTWFwKCk7Zm9yKGNvbnN0IHR5cGUgb2YKW3R5cGVzLkFwcGNhY2hlLHR5cGVzLkNhY2hlX3N0b3JhZ2UsdHlwZXMuQ29va2llcyx0eXBlcy5JbmRleGVkZGIsdHlwZXMuTG9jYWxfc3RvcmFnZSx0eXBlcy5TZXJ2aWNlX3dvcmtlcnMsdHlwZXMuV2Vic3FsXSkKdGhpcy5fc2V0dGluZ3Muc2V0KHR5cGUsQ29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2NsZWFyLXN0b3JhZ2UtJyt0eXBlLHRydWUpKTtjb25zdCBxdW90YT10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdVc2FnZScpKTt0aGlzLl9xdW90YVJvdz1xdW90YS5hcHBlbmRSb3coKTt0aGlzLl9xdW90YVVzYWdlPW51bGw7dGhpcy5fcGllQ2hhcnQ9bmV3IFBlcmZVSS5QaWVDaGFydCgxMTAsTnVtYmVyLmJ5dGVzVG9TdHJpbmcsdHJ1ZSk7dGhpcy5fcGllQ2hhcnRMZWdlbmQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Y29uc3QgdXNhZ2VCcmVha2Rvd25Sb3c9cXVvdGEuYXBwZW5kUm93KCk7dXNhZ2VCcmVha2Rvd25Sb3cuY2xhc3NMaXN0LmFkZCgndXNhZ2UtYnJlYWtkb3duLXJvdycpO3VzYWdlQnJlYWtkb3duUm93LmFwcGVuZENoaWxkKHRoaXMuX3BpZUNoYXJ0LmVsZW1lbnQpO3VzYWdlQnJlYWtkb3duUm93LmFwcGVuZENoaWxkKHRoaXMuX3BpZUNoYXJ0TGVnZW5kKTtjb25zdCBhcHBsaWNhdGlvbj10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdBcHBsaWNhdGlvbicpKTt0aGlzLl9hcHBlbmRJdGVtKGFwcGxpY2F0aW9uLENvbW1vbi5VSVN0cmluZygnVW5yZWdpc3RlciBzZXJ2aWNlIHdvcmtlcnMnKSwnc2VydmljZV93b3JrZXJzJyk7Y29uc3Qgc3RvcmFnZT10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdTdG9yYWdlJykpO3RoaXMuX2FwcGVuZEl0ZW0oc3RvcmFnZSxDb21tb24uVUlTdHJpbmcoJ0xvY2FsIGFuZCBzZXNzaW9uIHN0b3JhZ2UnKSwnbG9jYWxfc3RvcmFnZScpO3RoaXMuX2FwcGVuZEl0ZW0oc3RvcmFnZSxDb21tb24uVUlTdHJpbmcoJ0luZGV4ZWREQicpLCdpbmRleGVkZGInKTt0aGlzLl9hcHBlbmRJdGVtKHN0b3JhZ2UsQ29tbW9uLlVJU3RyaW5nKCdXZWIgU1FMJyksJ3dlYnNxbCcpO3RoaXMuX2FwcGVuZEl0ZW0oc3RvcmFnZSxDb21tb24uVUlTdHJpbmcoJ0Nvb2tpZXMnKSwnY29va2llcycpO2NvbnN0IGNhY2hlcz10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdDYWNoZScpKTt0aGlzLl9hcHBlbmRJdGVtKGNhY2hlcyxDb21tb24uVUlTdHJpbmcoJ0NhY2hlIHN0b3JhZ2UnKSwnY2FjaGVfc3RvcmFnZScpO3RoaXMuX2FwcGVuZEl0ZW0oY2FjaGVzLENvbW1vbi5VSVN0cmluZygnQXBwbGljYXRpb24gY2FjaGUnKSwnYXBwY2FjaGUnKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlVGFyZ2V0cyh0aGlzLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5Ccm93c2VyKTtjb25zdCBmb290ZXI9dGhpcy5fcmVwb3J0Vmlldy5hcHBlbmRTZWN0aW9uKCcnLCdjbGVhci1zdG9yYWdlLWJ1dHRvbicpLmFwcGVuZFJvdygpO3RoaXMuX2NsZWFyQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBzaXRlIGRhdGEnKSx0aGlzLl9jbGVhci5iaW5kKHRoaXMpLENvbW1vbi5VSVN0cmluZygnQ2xlYXIgc2l0ZSBkYXRhJykpO2Zvb3Rlci5hcHBlbmRDaGlsZCh0aGlzLl9jbGVhckJ1dHRvbik7fQpfYXBwZW5kSXRlbShzZWN0aW9uLHRpdGxlLHNldHRpbmdOYW1lKXtjb25zdCByb3c9c2VjdGlvbi5hcHBlbmRSb3coKTtyb3cuYXBwZW5kQ2hpbGQoVUkuU2V0dGluZ3NVSS5jcmVhdGVTZXR0aW5nQ2hlY2tib3godGl0bGUsdGhpcy5fc2V0dGluZ3MuZ2V0KHNldHRpbmdOYW1lKSx0cnVlKSk7fQp0YXJnZXRBZGRlZCh0YXJnZXQpe2lmKHRoaXMuX3RhcmdldCkKcmV0dXJuO3RoaXMuX3RhcmdldD10YXJnZXQ7Y29uc3Qgc2VjdXJpdHlPcmlnaW5NYW5hZ2VyPXRhcmdldC5tb2RlbChTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyKTt0aGlzLl91cGRhdGVPcmlnaW4oc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLm1haW5TZWN1cml0eU9yaWdpbigpKTtzZWN1cml0eU9yaWdpbk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5NYWluU2VjdXJpdHlPcmlnaW5DaGFuZ2VkLHRoaXMuX29yaWdpbkNoYW5nZWQsdGhpcyk7fQp0YXJnZXRSZW1vdmVkKHRhcmdldCl7aWYodGhpcy5fdGFyZ2V0IT09dGFyZ2V0KQpyZXR1cm47Y29uc3Qgc2VjdXJpdHlPcmlnaW5NYW5hZ2VyPXRhcmdldC5tb2RlbChTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyKTtzZWN1cml0eU9yaWdpbk1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5NYWluU2VjdXJpdHlPcmlnaW5DaGFuZ2VkLHRoaXMuX29yaWdpbkNoYW5nZWQsdGhpcyk7fQpfb3JpZ2luQ2hhbmdlZChldmVudCl7Y29uc3Qgb3JpZ2luPShldmVudC5kYXRhKTt0aGlzLl91cGRhdGVPcmlnaW4ob3JpZ2luKTt9Cl91cGRhdGVPcmlnaW4odXJsKXt0aGlzLl9zZWN1cml0eU9yaWdpbj1uZXcgQ29tbW9uLlBhcnNlZFVSTCh1cmwpLnNlY3VyaXR5T3JpZ2luKCk7dGhpcy5fcmVwb3J0Vmlldy5zZXRTdWJ0aXRsZSh0aGlzLl9zZWN1cml0eU9yaWdpbik7dGhpcy5kb1VwZGF0ZSgpO30KX2NsZWFyKCl7aWYoIXRoaXMuX3NlY3VyaXR5T3JpZ2luKQpyZXR1cm47Y29uc3Qgc3RvcmFnZVR5cGVzPVtdO2Zvcihjb25zdCB0eXBlIG9mIHRoaXMuX3NldHRpbmdzLmtleXMoKSl7aWYodGhpcy5fc2V0dGluZ3MuZ2V0KHR5cGUpLmdldCgpKQpzdG9yYWdlVHlwZXMucHVzaCh0eXBlKTt9CnRoaXMuX3RhcmdldC5zdG9yYWdlQWdlbnQoKS5jbGVhckRhdGFGb3JPcmlnaW4odGhpcy5fc2VjdXJpdHlPcmlnaW4sc3RvcmFnZVR5cGVzLmpvaW4oJywnKSk7Y29uc3Qgc2V0PW5ldyBTZXQoc3RvcmFnZVR5cGVzKTtjb25zdCBoYXNBbGw9c2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkFsbCk7aWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkNvb2tpZXMpfHxoYXNBbGwpe2NvbnN0IGNvb2tpZU1vZGVsPXRoaXMuX3RhcmdldC5tb2RlbChTREsuQ29va2llTW9kZWwpO2lmKGNvb2tpZU1vZGVsKQpjb29raWVNb2RlbC5jbGVhcigpO30KaWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkluZGV4ZWRkYil8fGhhc0FsbCl7Zm9yKGNvbnN0IHRhcmdldCBvZiBTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKCkpe2NvbnN0IGluZGV4ZWREQk1vZGVsPXRhcmdldC5tb2RlbChSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwpO2lmKGluZGV4ZWREQk1vZGVsKQppbmRleGVkREJNb2RlbC5jbGVhckZvck9yaWdpbih0aGlzLl9zZWN1cml0eU9yaWdpbik7fX0KaWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkxvY2FsX3N0b3JhZ2UpfHxoYXNBbGwpe2NvbnN0IHN0b3JhZ2VNb2RlbD10aGlzLl90YXJnZXQubW9kZWwoUmVzb3VyY2VzLkRPTVN0b3JhZ2VNb2RlbCk7aWYoc3RvcmFnZU1vZGVsKQpzdG9yYWdlTW9kZWwuY2xlYXJGb3JPcmlnaW4odGhpcy5fc2VjdXJpdHlPcmlnaW4pO30KaWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLldlYnNxbCl8fGhhc0FsbCl7Y29uc3QgZGF0YWJhc2VNb2RlbD10aGlzLl90YXJnZXQubW9kZWwoUmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwpO2lmKGRhdGFiYXNlTW9kZWwpe2RhdGFiYXNlTW9kZWwuZGlzYWJsZSgpO2RhdGFiYXNlTW9kZWwuZW5hYmxlKCk7fX0KaWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkNhY2hlX3N0b3JhZ2UpfHxoYXNBbGwpe2NvbnN0IHRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7Y29uc3QgbW9kZWw9dGFyZ2V0JiZ0YXJnZXQubW9kZWwoU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsKTtpZihtb2RlbCkKbW9kZWwuY2xlYXJGb3JPcmlnaW4odGhpcy5fc2VjdXJpdHlPcmlnaW4pO30KaWYoc2V0LmhhcyhQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkFwcGNhY2hlKXx8aGFzQWxsKXtjb25zdCBhcHBjYWNoZU1vZGVsPXRoaXMuX3RhcmdldC5tb2RlbChSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZU1vZGVsKTtpZihhcHBjYWNoZU1vZGVsKQphcHBjYWNoZU1vZGVsLnJlc2V0KCk7fQp0aGlzLl9jbGVhckJ1dHRvbi5kaXNhYmxlZD10cnVlO2NvbnN0IGxhYmVsPXRoaXMuX2NsZWFyQnV0dG9uLnRleHRDb250ZW50O3RoaXMuX2NsZWFyQnV0dG9uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQ2xlYXJpbmcuLi4nKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5fY2xlYXJCdXR0b24uZGlzYWJsZWQ9ZmFsc2U7dGhpcy5fY2xlYXJCdXR0b24udGV4dENvbnRlbnQ9bGFiZWw7fSw1MDApO30KYXN5bmMgZG9VcGRhdGUoKXtpZighdGhpcy5fc2VjdXJpdHlPcmlnaW4pCnJldHVybjtjb25zdCBzZWN1cml0eU9yaWdpbj0odGhpcy5fc2VjdXJpdHlPcmlnaW4pO2NvbnN0IHJlc3BvbnNlPWF3YWl0IHRoaXMuX3RhcmdldC5zdG9yYWdlQWdlbnQoKS5pbnZva2VfZ2V0VXNhZ2VBbmRRdW90YSh7b3JpZ2luOnNlY3VyaXR5T3JpZ2lufSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKXt0aGlzLl9xdW90YVJvdy50ZXh0Q29udGVudD0nJzt0aGlzLl9yZXNldFBpZUNoYXJ0KDApO3JldHVybjt9CnRoaXMuX3F1b3RhUm93LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnJXMgdXNlZCBvdXQgb2YgJXMgc3RvcmFnZSBxdW90YScsTnVtYmVyLmJ5dGVzVG9TdHJpbmcocmVzcG9uc2UudXNhZ2UpLE51bWJlci5ieXRlc1RvU3RyaW5nKHJlc3BvbnNlLnF1b3RhKSk7aWYoIXRoaXMuX3F1b3RhVXNhZ2V8fHRoaXMuX3F1b3RhVXNhZ2UhPT1yZXNwb25zZS51c2FnZSl7dGhpcy5fcXVvdGFVc2FnZT1yZXNwb25zZS51c2FnZTt0aGlzLl9yZXNldFBpZUNoYXJ0KHJlc3BvbnNlLnVzYWdlKTtmb3IoY29uc3QgdXNhZ2VGb3JUeXBlIG9mIHJlc3BvbnNlLnVzYWdlQnJlYWtkb3duLnNvcnQoKGEsYik9PmIudXNhZ2UtYS51c2FnZSkpe2NvbnN0IHZhbHVlPXVzYWdlRm9yVHlwZS51c2FnZTtpZighdmFsdWUpCmNvbnRpbnVlO2NvbnN0IHRpdGxlPXRoaXMuX2dldFN0b3JhZ2VUeXBlTmFtZSh1c2FnZUZvclR5cGUuc3RvcmFnZVR5cGUpO2NvbnN0IGNvbG9yPXRoaXMuX3BpZUNvbG9ycy5nZXQodXNhZ2VGb3JUeXBlLnN0b3JhZ2VUeXBlKXx8JyNjY2MnO3RoaXMuX3BpZUNoYXJ0LmFkZFNsaWNlKHZhbHVlLGNvbG9yKTtjb25zdCByb3dFbGVtZW50PXRoaXMuX3BpZUNoYXJ0TGVnZW5kLmNyZWF0ZUNoaWxkKCdkaXYnLCd1c2FnZS1icmVha2Rvd24tbGVnZW5kLXJvdycpO3Jvd0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd1c2FnZS1icmVha2Rvd24tbGVnZW5kLXZhbHVlJykudGV4dENvbnRlbnQ9TnVtYmVyLmJ5dGVzVG9TdHJpbmcodmFsdWUpO3Jvd0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd1c2FnZS1icmVha2Rvd24tbGVnZW5kLXN3YXRjaCcpLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jb2xvcjtyb3dFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywndXNhZ2UtYnJlYWtkb3duLWxlZ2VuZC10aXRsZScpLnRleHRDb250ZW50PXRpdGxlO319CnRoaXMuX3VzYWdlVXBkYXRlZEZvclRlc3QocmVzcG9uc2UudXNhZ2UscmVzcG9uc2UucXVvdGEscmVzcG9uc2UudXNhZ2VCcmVha2Rvd24pO3RoaXMudXBkYXRlKCk7fQpfcmVzZXRQaWVDaGFydCh0b3RhbCl7dGhpcy5fcGllQ2hhcnQuc2V0VG90YWwodG90YWwpO3RoaXMuX3BpZUNoYXJ0TGVnZW5kLnJlbW92ZUNoaWxkcmVuKCk7fQpfZ2V0U3RvcmFnZVR5cGVOYW1lKHR5cGUpe3N3aXRjaCh0eXBlKXtjYXNlIFByb3RvY29sLlN0b3JhZ2UuU3RvcmFnZVR5cGUuRmlsZV9zeXN0ZW1zOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0ZpbGUgU3lzdGVtJyk7Y2FzZSBQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLldlYnNxbDpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdXZWIgU1FMJyk7Y2FzZSBQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkFwcGNhY2hlOnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0FwcGxpY2F0aW9uIENhY2hlJyk7Y2FzZSBQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLkluZGV4ZWRkYjpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdJbmRleGVkREInKTtjYXNlIFByb3RvY29sLlN0b3JhZ2UuU3RvcmFnZVR5cGUuQ2FjaGVfc3RvcmFnZTpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdDYWNoZSBTdG9yYWdlJyk7Y2FzZSBQcm90b2NvbC5TdG9yYWdlLlN0b3JhZ2VUeXBlLlNlcnZpY2Vfd29ya2VyczpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdTZXJ2aWNlIFdvcmtlcnMnKTtkZWZhdWx0OnJldHVybiBDb21tb24uVUlTdHJpbmcoJ090aGVyJyk7fX0KX3VzYWdlVXBkYXRlZEZvclRlc3QodXNhZ2UscXVvdGEsdXNhZ2VCcmVha2Rvd24pe319OztSZXNvdXJjZXMuU3RvcmFnZUl0ZW1zVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IodGl0bGUsZmlsdGVyTmFtZSl7c3VwZXIoZmFsc2UpO3RoaXMuX2ZpbHRlclJlZ2V4PW51bGw7dGhpcy5fZGVsZXRlQWxsQnV0dG9uPXRoaXMuX2FkZEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0NsZWFyIEFsbCcpLCdsYXJnZWljb24tY2xlYXInLHRoaXMuZGVsZXRlQWxsSXRlbXMpO3RoaXMuX2RlbGV0ZVNlbGVjdGVkQnV0dG9uPXRoaXMuX2FkZEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0RlbGV0ZSBTZWxlY3RlZCcpLCdsYXJnZWljb24tZGVsZXRlJyx0aGlzLmRlbGV0ZVNlbGVjdGVkSXRlbSk7dGhpcy5fcmVmcmVzaEJ1dHRvbj10aGlzLl9hZGRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdSZWZyZXNoJyksJ2xhcmdlaWNvbi1yZWZyZXNoJyx0aGlzLnJlZnJlc2hJdGVtcyk7dGhpcy5fbWFpblRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3RvcC1yZXNvdXJjZXMtdG9vbGJhcicsdGhpcy5lbGVtZW50KTt0aGlzLl9maWx0ZXJJdGVtPW5ldyBVSS5Ub29sYmFySW5wdXQoQ29tbW9uLlVJU3RyaW5nKCdGaWx0ZXInKSwwLjQpO3RoaXMuX2ZpbHRlckl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsdGhpcy5fZmlsdGVyQ2hhbmdlZCx0aGlzKTtjb25zdCB0b29sYmFySXRlbXM9W3RoaXMuX3JlZnJlc2hCdXR0b24sdGhpcy5fZGVsZXRlQWxsQnV0dG9uLHRoaXMuX2RlbGV0ZVNlbGVjdGVkQnV0dG9uLHRoaXMuX2ZpbHRlckl0ZW1dO2Zvcihjb25zdCBpdGVtIG9mIHRvb2xiYXJJdGVtcykKdGhpcy5fbWFpblRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oaXRlbSk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9zaG93Q29udGV4dE1lbnUuYmluZCh0aGlzKSx0cnVlKTt9Cl9hZGRCdXR0b24obGFiZWwsZ2x5cGgsY2FsbGJhY2spe2NvbnN0IGJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihsYWJlbCxnbHlwaCk7YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssY2FsbGJhY2ssdGhpcyk7cmV0dXJuIGJ1dHRvbjt9Cl9zaG93Q29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLHRoaXMucmVmcmVzaEl0ZW1zLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9maWx0ZXJDaGFuZ2VkKGV2ZW50KXtjb25zdCB0ZXh0PShldmVudC5kYXRhKTt0aGlzLl9maWx0ZXJSZWdleD10ZXh0P25ldyBSZWdFeHAodGV4dC5lc2NhcGVGb3JSZWdFeHAoKSwnaScpOm51bGw7dGhpcy5yZWZyZXNoSXRlbXMoKTt9CmZpbHRlcihpdGVtcyxrZXlGdW5jdGlvbil7aWYoIXRoaXMuX2ZpbHRlclJlZ2V4KQpyZXR1cm4gaXRlbXM7cmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtPT50aGlzLl9maWx0ZXJSZWdleC50ZXN0KGtleUZ1bmN0aW9uKGl0ZW0pKSk7fQp3YXNTaG93bigpe3RoaXMucmVmcmVzaEl0ZW1zKCk7fQpzZXRDYW5EZWxldGVBbGwoZW5hYmxlZCl7dGhpcy5fZGVsZXRlQWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7fQpzZXRDYW5EZWxldGVTZWxlY3RlZChlbmFibGVkKXt0aGlzLl9kZWxldGVTZWxlY3RlZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpO30Kc2V0Q2FuUmVmcmVzaChlbmFibGVkKXt0aGlzLl9yZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7fQpzZXRDYW5GaWx0ZXIoZW5hYmxlZCl7dGhpcy5fZmlsdGVySXRlbS5zZXRFbmFibGVkKGVuYWJsZWQpO30KZGVsZXRlQWxsSXRlbXMoKXt9CmRlbGV0ZVNlbGVjdGVkSXRlbSgpe30KcmVmcmVzaEl0ZW1zKCl7fX07O1Jlc291cmNlcy5Db29raWVJdGVtc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuU3RvcmFnZUl0ZW1zVmlld3tjb25zdHJ1Y3Rvcihtb2RlbCxjb29raWVEb21haW4pe3N1cGVyKENvbW1vbi5VSVN0cmluZygnQ29va2llcycpLCdjb29raWVzUGFuZWwnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RvcmFnZS12aWV3Jyk7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5fY29va2llRG9tYWluPWNvb2tpZURvbWFpbjt0aGlzLl90b3RhbFNpemU9MDt0aGlzLl9jb29raWVzVGFibGU9bnVsbDt0aGlzLl9yZWZyZXNoVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDMwMCk7dGhpcy5fZXZlbnREZXNjcmlwdG9ycz1bXTt0aGlzLnNldENvb2tpZXNEb21haW4obW9kZWwsY29va2llRG9tYWluKTt9CnNldENvb2tpZXNEb21haW4obW9kZWwsZG9tYWluKXt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9jb29raWVEb21haW49ZG9tYWluO3RoaXMucmVmcmVzaEl0ZW1zKCk7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2V2ZW50RGVzY3JpcHRvcnMpO2NvbnN0IG5ldHdvcmtNYW5hZ2VyPW1vZGVsLnRhcmdldCgpLm1vZGVsKFNESy5OZXR3b3JrTWFuYWdlcik7dGhpcy5fZXZlbnREZXNjcmlwdG9ycz1bbmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlc3BvbnNlUmVjZWl2ZWQsdGhpcy5fb25SZXNwb25zZVJlY2VpdmVkLHRoaXMpXTt9Cl9zYXZlQ29va2llKG5ld0Nvb2tpZSxvbGRDb29raWUpe2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7aWYob2xkQ29va2llJiYobmV3Q29va2llLm5hbWUoKSE9PW9sZENvb2tpZS5uYW1lKCl8fG5ld0Nvb2tpZS51cmwoKSE9PW9sZENvb2tpZS51cmwoKSkpCnRoaXMuX21vZGVsLmRlbGV0ZUNvb2tpZShvbGRDb29raWUpO3JldHVybiB0aGlzLl9tb2RlbC5zYXZlQ29va2llKG5ld0Nvb2tpZSk7fQpfZGVsZXRlQ29va2llKGNvb2tpZSxjYWxsYmFjayl7dGhpcy5fbW9kZWwuZGVsZXRlQ29va2llKGNvb2tpZSxjYWxsYmFjayk7fQpfdXBkYXRlV2l0aENvb2tpZXMoYWxsQ29va2llcyl7dGhpcy5fdG90YWxTaXplPWFsbENvb2tpZXMucmVkdWNlKChzaXplLGNvb2tpZSk9PnNpemUrY29va2llLnNpemUoKSwwKTtpZighdGhpcy5fY29va2llc1RhYmxlKXt0aGlzLl9jb29raWVzVGFibGU9bmV3IENvb2tpZVRhYmxlLkNvb2tpZXNUYWJsZSh0aGlzLl9zYXZlQ29va2llLmJpbmQodGhpcyksdGhpcy5yZWZyZXNoSXRlbXMuYmluZCh0aGlzKSwoKT0+dGhpcy5zZXRDYW5EZWxldGVTZWxlY3RlZCghIXRoaXMuX2Nvb2tpZXNUYWJsZS5zZWxlY3RlZENvb2tpZSgpKSx0aGlzLl9kZWxldGVDb29raWUuYmluZCh0aGlzKSk7fQpjb25zdCBwYXJzZWRVUkw9dGhpcy5fY29va2llRG9tYWluLmFzUGFyc2VkVVJMKCk7Y29uc3QgaG9zdD1wYXJzZWRVUkw/cGFyc2VkVVJMLmhvc3Q6Jyc7dGhpcy5fY29va2llc1RhYmxlLnNldENvb2tpZURvbWFpbihob3N0KTtjb25zdCBzaG93bkNvb2tpZXM9dGhpcy5maWx0ZXIoYWxsQ29va2llcyxjb29raWU9PmAke2Nvb2tpZS5uYW1lKCl9ICR7Y29va2llLnZhbHVlKCl9ICR7Y29va2llLmRvbWFpbigpfWApO3RoaXMuX2Nvb2tpZXNUYWJsZS5zZXRDb29raWVzKHNob3duQ29va2llcyk7dGhpcy5fY29va2llc1RhYmxlLnNob3codGhpcy5lbGVtZW50KTt0aGlzLnNldENhbkZpbHRlcih0cnVlKTt0aGlzLnNldENhbkRlbGV0ZUFsbCh0cnVlKTt0aGlzLnNldENhbkRlbGV0ZVNlbGVjdGVkKCEhdGhpcy5fY29va2llc1RhYmxlLnNlbGVjdGVkQ29va2llKCkpO30KZGVsZXRlQWxsSXRlbXMoKXt0aGlzLl9tb2RlbC5jbGVhcih0aGlzLl9jb29raWVEb21haW4sKCk9PnRoaXMucmVmcmVzaEl0ZW1zKCkpO30KZGVsZXRlU2VsZWN0ZWRJdGVtKCl7Y29uc3Qgc2VsZWN0ZWRDb29raWU9dGhpcy5fY29va2llc1RhYmxlLnNlbGVjdGVkQ29va2llKCk7aWYoc2VsZWN0ZWRDb29raWUpCnRoaXMuX21vZGVsLmRlbGV0ZUNvb2tpZShzZWxlY3RlZENvb2tpZSwoKT0+dGhpcy5yZWZyZXNoSXRlbXMoKSk7fQpyZWZyZXNoSXRlbXMoKXt0aGlzLl9tb2RlbC5nZXRDb29raWVzRm9yRG9tYWluKHRoaXMuX2Nvb2tpZURvbWFpbikudGhlbih0aGlzLl91cGRhdGVXaXRoQ29va2llcy5iaW5kKHRoaXMpKTt9Cl9vblJlc3BvbnNlUmVjZWl2ZWQoKXt0aGlzLl9yZWZyZXNoVGhyb3R0bGVyLnNjaGVkdWxlKCgpPT5Qcm9taXNlLnJlc29sdmUodGhpcy5yZWZyZXNoSXRlbXMoKSkpO319OztSZXNvdXJjZXMuRGF0YWJhc2U9Y2xhc3N7Y29uc3RydWN0b3IobW9kZWwsaWQsZG9tYWluLG5hbWUsdmVyc2lvbil7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5faWQ9aWQ7dGhpcy5fZG9tYWluPWRvbWFpbjt0aGlzLl9uYW1lPW5hbWU7dGhpcy5fdmVyc2lvbj12ZXJzaW9uO30KZ2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkO30KZ2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZTt9CnNldCBuYW1lKHgpe3RoaXMuX25hbWU9eDt9CmdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb247fQpzZXQgdmVyc2lvbih4KXt0aGlzLl92ZXJzaW9uPXg7fQpnZXQgZG9tYWluKCl7cmV0dXJuIHRoaXMuX2RvbWFpbjt9CnNldCBkb21haW4oeCl7dGhpcy5fZG9tYWluPXg7fQphc3luYyB0YWJsZU5hbWVzKCl7Y29uc3QgbmFtZXM9YXdhaXQgdGhpcy5fbW9kZWwuX2FnZW50LmdldERhdGFiYXNlVGFibGVOYW1lcyh0aGlzLl9pZCl8fFtdO3JldHVybiBuYW1lcy5zb3J0KCk7fQphc3luYyBleGVjdXRlU3FsKHF1ZXJ5LG9uU3VjY2VzcyxvbkVycm9yKXtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9tb2RlbC5fYWdlbnQuaW52b2tlX2V4ZWN1dGVTUUwoeydkYXRhYmFzZUlkJzp0aGlzLl9pZCwncXVlcnknOnF1ZXJ5fSk7Y29uc3QgZXJyb3I9cmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdO2lmKGVycm9yKXtvbkVycm9yKGVycm9yKTtyZXR1cm47fQpjb25zdCBzcWxFcnJvcj1yZXNwb25zZS5zcWxFcnJvcjtpZighc3FsRXJyb3Ipe29uU3VjY2VzcyhyZXNwb25zZS5jb2x1bW5OYW1lcyxyZXNwb25zZS52YWx1ZXMpO3JldHVybjt9CmxldCBtZXNzYWdlO2lmKHNxbEVycm9yLm1lc3NhZ2UpCm1lc3NhZ2U9c3FsRXJyb3IubWVzc2FnZTtlbHNlIGlmKHNxbEVycm9yLmNvZGU9PT0yKQptZXNzYWdlPUNvbW1vbi5VSVN0cmluZygnRGF0YWJhc2Ugbm8gbG9uZ2VyIGhhcyBleHBlY3RlZCB2ZXJzaW9uLicpO2Vsc2UKbWVzc2FnZT1Db21tb24uVUlTdHJpbmcoJ0FuIHVuZXhwZWN0ZWQgZXJyb3IgJXMgb2NjdXJyZWQuJyxzcWxFcnJvci5jb2RlKTtvbkVycm9yKG1lc3NhZ2UpO319O1Jlc291cmNlcy5EYXRhYmFzZU1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl9kYXRhYmFzZXM9W107dGhpcy5fYWdlbnQ9dGFyZ2V0LmRhdGFiYXNlQWdlbnQoKTt0aGlzLnRhcmdldCgpLnJlZ2lzdGVyRGF0YWJhc2VEaXNwYXRjaGVyKG5ldyBSZXNvdXJjZXMuRGF0YWJhc2VEaXNwYXRjaGVyKHRoaXMpKTt9CmVuYWJsZSgpe2lmKHRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9hZ2VudC5lbmFibGUoKTt0aGlzLl9lbmFibGVkPXRydWU7fQpkaXNhYmxlKCl7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9lbmFibGVkPWZhbHNlO3RoaXMuX2RhdGFiYXNlcz1bXTt0aGlzLl9hZ2VudC5kaXNhYmxlKCk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwuRXZlbnRzLkRhdGFiYXNlc1JlbW92ZWQpO30KZGF0YWJhc2VzKCl7Y29uc3QgcmVzdWx0PVtdO2Zvcihjb25zdCBkYXRhYmFzZSBvZiB0aGlzLl9kYXRhYmFzZXMpCnJlc3VsdC5wdXNoKGRhdGFiYXNlKTtyZXR1cm4gcmVzdWx0O30KX2FkZERhdGFiYXNlKGRhdGFiYXNlKXt0aGlzLl9kYXRhYmFzZXMucHVzaChkYXRhYmFzZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwuRXZlbnRzLkRhdGFiYXNlQWRkZWQsZGF0YWJhc2UpO319O1NESy5TREtNb2RlbC5yZWdpc3RlcihSZXNvdXJjZXMuRGF0YWJhc2VNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTm9uZSxmYWxzZSk7UmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwuRXZlbnRzPXtEYXRhYmFzZUFkZGVkOlN5bWJvbCgnRGF0YWJhc2VBZGRlZCcpLERhdGFiYXNlc1JlbW92ZWQ6U3ltYm9sKCdEYXRhYmFzZXNSZW1vdmVkJyksfTtSZXNvdXJjZXMuRGF0YWJhc2VEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKG1vZGVsKXt0aGlzLl9tb2RlbD1tb2RlbDt9CmFkZERhdGFiYXNlKHBheWxvYWQpe3RoaXMuX21vZGVsLl9hZGREYXRhYmFzZShuZXcgUmVzb3VyY2VzLkRhdGFiYXNlKHRoaXMuX21vZGVsLHBheWxvYWQuaWQscGF5bG9hZC5kb21haW4scGF5bG9hZC5uYW1lLHBheWxvYWQudmVyc2lvbikpO319O1Jlc291cmNlcy5EYXRhYmFzZU1vZGVsLl9zeW1ib2w9U3ltYm9sKCdEYXRhYmFzZU1vZGVsJyk7O1Jlc291cmNlcy5ET01TdG9yYWdlPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcihtb2RlbCxzZWN1cml0eU9yaWdpbixpc0xvY2FsU3RvcmFnZSl7c3VwZXIoKTt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9zZWN1cml0eU9yaWdpbj1zZWN1cml0eU9yaWdpbjt0aGlzLl9pc0xvY2FsU3RvcmFnZT1pc0xvY2FsU3RvcmFnZTt9CnN0YXRpYyBzdG9yYWdlSWQoc2VjdXJpdHlPcmlnaW4saXNMb2NhbFN0b3JhZ2Upe3JldHVybntzZWN1cml0eU9yaWdpbjpzZWN1cml0eU9yaWdpbixpc0xvY2FsU3RvcmFnZTppc0xvY2FsU3RvcmFnZX07fQpnZXQgaWQoKXtyZXR1cm4gUmVzb3VyY2VzLkRPTVN0b3JhZ2Uuc3RvcmFnZUlkKHRoaXMuX3NlY3VyaXR5T3JpZ2luLHRoaXMuX2lzTG9jYWxTdG9yYWdlKTt9CmdldCBzZWN1cml0eU9yaWdpbigpe3JldHVybiB0aGlzLl9zZWN1cml0eU9yaWdpbjt9CmdldCBpc0xvY2FsU3RvcmFnZSgpe3JldHVybiB0aGlzLl9pc0xvY2FsU3RvcmFnZTt9CmdldEl0ZW1zKCl7cmV0dXJuIHRoaXMuX21vZGVsLl9hZ2VudC5nZXRET01TdG9yYWdlSXRlbXModGhpcy5pZCk7fQpzZXRJdGVtKGtleSx2YWx1ZSl7dGhpcy5fbW9kZWwuX2FnZW50LnNldERPTVN0b3JhZ2VJdGVtKHRoaXMuaWQsa2V5LHZhbHVlKTt9CnJlbW92ZUl0ZW0oa2V5KXt0aGlzLl9tb2RlbC5fYWdlbnQucmVtb3ZlRE9NU3RvcmFnZUl0ZW0odGhpcy5pZCxrZXkpO30KY2xlYXIoKXt0aGlzLl9tb2RlbC5fYWdlbnQuY2xlYXIodGhpcy5pZCk7fX07UmVzb3VyY2VzLkRPTVN0b3JhZ2UuRXZlbnRzPXtET01TdG9yYWdlSXRlbXNDbGVhcmVkOlN5bWJvbCgnRE9NU3RvcmFnZUl0ZW1zQ2xlYXJlZCcpLERPTVN0b3JhZ2VJdGVtUmVtb3ZlZDpTeW1ib2woJ0RPTVN0b3JhZ2VJdGVtUmVtb3ZlZCcpLERPTVN0b3JhZ2VJdGVtQWRkZWQ6U3ltYm9sKCdET01TdG9yYWdlSXRlbUFkZGVkJyksRE9NU3RvcmFnZUl0ZW1VcGRhdGVkOlN5bWJvbCgnRE9NU3RvcmFnZUl0ZW1VcGRhdGVkJyl9O1Jlc291cmNlcy5ET01TdG9yYWdlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlcj10YXJnZXQubW9kZWwoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlcik7dGhpcy5fc3RvcmFnZXM9e307dGhpcy5fYWdlbnQ9dGFyZ2V0LmRvbXN0b3JhZ2VBZ2VudCgpO30KZW5hYmxlKCl7aWYodGhpcy5fZW5hYmxlZCkKcmV0dXJuO3RoaXMudGFyZ2V0KCkucmVnaXN0ZXJET01TdG9yYWdlRGlzcGF0Y2hlcihuZXcgUmVzb3VyY2VzLkRPTVN0b3JhZ2VEaXNwYXRjaGVyKHRoaXMpKTt0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5TZWN1cml0eU9yaWdpbkFkZGVkLHRoaXMuX3NlY3VyaXR5T3JpZ2luQWRkZWQsdGhpcyk7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlci5FdmVudHMuU2VjdXJpdHlPcmlnaW5SZW1vdmVkLHRoaXMuX3NlY3VyaXR5T3JpZ2luUmVtb3ZlZCx0aGlzKTtmb3IoY29uc3Qgc2VjdXJpdHlPcmlnaW4gb2YgdGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnNlY3VyaXR5T3JpZ2lucygpKQp0aGlzLl9hZGRPcmlnaW4oc2VjdXJpdHlPcmlnaW4pO3RoaXMuX2FnZW50LmVuYWJsZSgpO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt9CmNsZWFyRm9yT3JpZ2luKG9yaWdpbil7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybjtmb3IoY29uc3QgaXNMb2NhbCBvZlt0cnVlLGZhbHNlXSl7Y29uc3Qga2V5PXRoaXMuX3N0b3JhZ2VLZXkob3JpZ2luLGlzTG9jYWwpO2NvbnN0IHN0b3JhZ2U9dGhpcy5fc3RvcmFnZXNba2V5XTtzdG9yYWdlLmNsZWFyKCk7fQp0aGlzLl9yZW1vdmVPcmlnaW4ob3JpZ2luKTt0aGlzLl9hZGRPcmlnaW4ob3JpZ2luKTt9Cl9zZWN1cml0eU9yaWdpbkFkZGVkKGV2ZW50KXt0aGlzLl9hZGRPcmlnaW4oKGV2ZW50LmRhdGEpKTt9Cl9hZGRPcmlnaW4oc2VjdXJpdHlPcmlnaW4pe2NvbnN0IHBhcnNlZD1uZXcgQ29tbW9uLlBhcnNlZFVSTChzZWN1cml0eU9yaWdpbik7aWYoIXBhcnNlZC5pc1ZhbGlkfHxwYXJzZWQuc2NoZW1lPT09J2RhdGEnfHxwYXJzZWQuc2NoZW1lPT09J2Fib3V0J3x8cGFyc2VkLnNjaGVtZT09PSdqYXZhc2NyaXB0JykKcmV0dXJuO2Zvcihjb25zdCBpc0xvY2FsIG9mW3RydWUsZmFsc2VdKXtjb25zdCBrZXk9dGhpcy5fc3RvcmFnZUtleShzZWN1cml0eU9yaWdpbixpc0xvY2FsKTtjb25zb2xlLmFzc2VydCghdGhpcy5fc3RvcmFnZXNba2V5XSk7Y29uc3Qgc3RvcmFnZT1uZXcgUmVzb3VyY2VzLkRPTVN0b3JhZ2UodGhpcyxzZWN1cml0eU9yaWdpbixpc0xvY2FsKTt0aGlzLl9zdG9yYWdlc1trZXldPXN0b3JhZ2U7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkRPTVN0b3JhZ2VNb2RlbC5FdmVudHMuRE9NU3RvcmFnZUFkZGVkLHN0b3JhZ2UpO319Cl9zZWN1cml0eU9yaWdpblJlbW92ZWQoZXZlbnQpe3RoaXMuX3JlbW92ZU9yaWdpbigoZXZlbnQuZGF0YSkpO30KX3JlbW92ZU9yaWdpbihzZWN1cml0eU9yaWdpbil7Zm9yKGNvbnN0IGlzTG9jYWwgb2ZbdHJ1ZSxmYWxzZV0pe2NvbnN0IGtleT10aGlzLl9zdG9yYWdlS2V5KHNlY3VyaXR5T3JpZ2luLGlzTG9jYWwpO2NvbnN0IHN0b3JhZ2U9dGhpcy5fc3RvcmFnZXNba2V5XTtpZighc3RvcmFnZSkKY29udGludWU7ZGVsZXRlIHRoaXMuX3N0b3JhZ2VzW2tleV07dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkRPTVN0b3JhZ2VNb2RlbC5FdmVudHMuRE9NU3RvcmFnZVJlbW92ZWQsc3RvcmFnZSk7fX0KX3N0b3JhZ2VLZXkoc2VjdXJpdHlPcmlnaW4saXNMb2NhbFN0b3JhZ2Upe3JldHVybiBKU09OLnN0cmluZ2lmeShSZXNvdXJjZXMuRE9NU3RvcmFnZS5zdG9yYWdlSWQoc2VjdXJpdHlPcmlnaW4saXNMb2NhbFN0b3JhZ2UpKTt9Cl9kb21TdG9yYWdlSXRlbXNDbGVhcmVkKHN0b3JhZ2VJZCl7Y29uc3QgZG9tU3RvcmFnZT10aGlzLnN0b3JhZ2VGb3JJZChzdG9yYWdlSWQpO2lmKCFkb21TdG9yYWdlKQpyZXR1cm47Y29uc3QgZXZlbnREYXRhPXt9O2RvbVN0b3JhZ2UuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5ET01TdG9yYWdlLkV2ZW50cy5ET01TdG9yYWdlSXRlbXNDbGVhcmVkLGV2ZW50RGF0YSk7fQpfZG9tU3RvcmFnZUl0ZW1SZW1vdmVkKHN0b3JhZ2VJZCxrZXkpe2NvbnN0IGRvbVN0b3JhZ2U9dGhpcy5zdG9yYWdlRm9ySWQoc3RvcmFnZUlkKTtpZighZG9tU3RvcmFnZSkKcmV0dXJuO2NvbnN0IGV2ZW50RGF0YT17a2V5OmtleX07ZG9tU3RvcmFnZS5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkRPTVN0b3JhZ2UuRXZlbnRzLkRPTVN0b3JhZ2VJdGVtUmVtb3ZlZCxldmVudERhdGEpO30KX2RvbVN0b3JhZ2VJdGVtQWRkZWQoc3RvcmFnZUlkLGtleSx2YWx1ZSl7Y29uc3QgZG9tU3RvcmFnZT10aGlzLnN0b3JhZ2VGb3JJZChzdG9yYWdlSWQpO2lmKCFkb21TdG9yYWdlKQpyZXR1cm47Y29uc3QgZXZlbnREYXRhPXtrZXk6a2V5LHZhbHVlOnZhbHVlfTtkb21TdG9yYWdlLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhSZXNvdXJjZXMuRE9NU3RvcmFnZS5FdmVudHMuRE9NU3RvcmFnZUl0ZW1BZGRlZCxldmVudERhdGEpO30KX2RvbVN0b3JhZ2VJdGVtVXBkYXRlZChzdG9yYWdlSWQsa2V5LG9sZFZhbHVlLHZhbHVlKXtjb25zdCBkb21TdG9yYWdlPXRoaXMuc3RvcmFnZUZvcklkKHN0b3JhZ2VJZCk7aWYoIWRvbVN0b3JhZ2UpCnJldHVybjtjb25zdCBldmVudERhdGE9e2tleTprZXksb2xkVmFsdWU6b2xkVmFsdWUsdmFsdWU6dmFsdWV9O2RvbVN0b3JhZ2UuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5ET01TdG9yYWdlLkV2ZW50cy5ET01TdG9yYWdlSXRlbVVwZGF0ZWQsZXZlbnREYXRhKTt9CnN0b3JhZ2VGb3JJZChzdG9yYWdlSWQpe3JldHVybiB0aGlzLl9zdG9yYWdlc1tKU09OLnN0cmluZ2lmeShzdG9yYWdlSWQpXTt9CnN0b3JhZ2VzKCl7Y29uc3QgcmVzdWx0PVtdO2Zvcihjb25zdCBpZCBpbiB0aGlzLl9zdG9yYWdlcykKcmVzdWx0LnB1c2godGhpcy5fc3RvcmFnZXNbaWRdKTtyZXR1cm4gcmVzdWx0O319O1NESy5TREtNb2RlbC5yZWdpc3RlcihSZXNvdXJjZXMuRE9NU3RvcmFnZU1vZGVsLFNESy5UYXJnZXQuQ2FwYWJpbGl0eS5ET00sZmFsc2UpO1Jlc291cmNlcy5ET01TdG9yYWdlTW9kZWwuRXZlbnRzPXtET01TdG9yYWdlQWRkZWQ6U3ltYm9sKCdET01TdG9yYWdlQWRkZWQnKSxET01TdG9yYWdlUmVtb3ZlZDpTeW1ib2woJ0RPTVN0b3JhZ2VSZW1vdmVkJyl9O1Jlc291cmNlcy5ET01TdG9yYWdlRGlzcGF0Y2hlcj1jbGFzc3tjb25zdHJ1Y3Rvcihtb2RlbCl7dGhpcy5fbW9kZWw9bW9kZWw7fQpkb21TdG9yYWdlSXRlbXNDbGVhcmVkKHN0b3JhZ2VJZCl7dGhpcy5fbW9kZWwuX2RvbVN0b3JhZ2VJdGVtc0NsZWFyZWQoc3RvcmFnZUlkKTt9CmRvbVN0b3JhZ2VJdGVtUmVtb3ZlZChzdG9yYWdlSWQsa2V5KXt0aGlzLl9tb2RlbC5fZG9tU3RvcmFnZUl0ZW1SZW1vdmVkKHN0b3JhZ2VJZCxrZXkpO30KZG9tU3RvcmFnZUl0ZW1BZGRlZChzdG9yYWdlSWQsa2V5LHZhbHVlKXt0aGlzLl9tb2RlbC5fZG9tU3RvcmFnZUl0ZW1BZGRlZChzdG9yYWdlSWQsa2V5LHZhbHVlKTt9CmRvbVN0b3JhZ2VJdGVtVXBkYXRlZChzdG9yYWdlSWQsa2V5LG9sZFZhbHVlLHZhbHVlKXt0aGlzLl9tb2RlbC5fZG9tU3RvcmFnZUl0ZW1VcGRhdGVkKHN0b3JhZ2VJZCxrZXksb2xkVmFsdWUsdmFsdWUpO319O1Jlc291cmNlcy5ET01TdG9yYWdlTW9kZWwuX3N5bWJvbD1TeW1ib2woJ0RvbVN0b3JhZ2UnKTs7UmVzb3VyY2VzLkRPTVN0b3JhZ2VJdGVtc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuU3RvcmFnZUl0ZW1zVmlld3tjb25zdHJ1Y3Rvcihkb21TdG9yYWdlKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ0RPTSBTdG9yYWdlJyksJ2RvbVN0b3JhZ2VQYW5lbCcpO3RoaXMuX2RvbVN0b3JhZ2U9ZG9tU3RvcmFnZTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RvcmFnZS12aWV3JywndGFibGUnKTtjb25zdCBjb2x1bW5zPShbe2lkOidrZXknLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnS2V5Jyksc29ydGFibGU6ZmFsc2UsZWRpdGFibGU6dHJ1ZSxsb25nVGV4dDp0cnVlLHdlaWdodDo1MH0se2lkOid2YWx1ZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdWYWx1ZScpLHNvcnRhYmxlOmZhbHNlLGVkaXRhYmxlOnRydWUsbG9uZ1RleHQ6dHJ1ZSx3ZWlnaHQ6NTB9XSk7dGhpcy5fZGF0YUdyaWQ9bmV3IERhdGFHcmlkLkRhdGFHcmlkKGNvbHVtbnMsdGhpcy5fZWRpdGluZ0NhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5fZGVsZXRlQ2FsbGJhY2suYmluZCh0aGlzKSk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuU2VsZWN0ZWROb2RlLGV2ZW50PT50aGlzLl9wcmV2aWV3RW50cnkoKGV2ZW50LmRhdGEpKSk7dGhpcy5fZGF0YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihEYXRhR3JpZC5EYXRhR3JpZC5FdmVudHMuRGVzZWxlY3RlZE5vZGUsZXZlbnQ9PnRoaXMuX3ByZXZpZXdFbnRyeShudWxsKSk7dGhpcy5fZGF0YUdyaWQuc2V0U3RyaXBlZCh0cnVlKTt0aGlzLl9kYXRhR3JpZC5zZXROYW1lKCdET01TdG9yYWdlSXRlbXNWaWV3Jyk7dGhpcy5fc3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KGZhbHNlLGZhbHNlKTt0aGlzLl9zcGxpdFdpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2Vjb25kSXNTaWRlYmFyKHRydWUpO3RoaXMuX3ByZXZpZXdQYW5lbD1uZXcgVUkuVkJveCgpO2NvbnN0IHJlc2l6ZXI9dGhpcy5fcHJldmlld1BhbmVsLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3ByZXZpZXctcGFuZWwtcmVzaXplcicpO3RoaXMuX3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKSk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9wcmV2aWV3UGFuZWwpO3RoaXMuX3NwbGl0V2lkZ2V0Lmluc3RhbGxSZXNpemVyKHJlc2l6ZXIpO3RoaXMuX3ByZXZpZXc9bnVsbDt0aGlzLl9wcmV2aWV3VmFsdWU9bnVsbDt0aGlzLl9zaG93UHJldmlldyhudWxsLG51bGwpO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtdO3RoaXMuc2V0U3RvcmFnZShkb21TdG9yYWdlKTt9CnNldFN0b3JhZ2UoZG9tU3RvcmFnZSl7Q29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2V2ZW50TGlzdGVuZXJzKTt0aGlzLl9kb21TdG9yYWdlPWRvbVN0b3JhZ2U7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX2RvbVN0b3JhZ2UuYWRkRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRE9NU3RvcmFnZS5FdmVudHMuRE9NU3RvcmFnZUl0ZW1zQ2xlYXJlZCx0aGlzLl9kb21TdG9yYWdlSXRlbXNDbGVhcmVkLHRoaXMpLHRoaXMuX2RvbVN0b3JhZ2UuYWRkRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRE9NU3RvcmFnZS5FdmVudHMuRE9NU3RvcmFnZUl0ZW1SZW1vdmVkLHRoaXMuX2RvbVN0b3JhZ2VJdGVtUmVtb3ZlZCx0aGlzKSx0aGlzLl9kb21TdG9yYWdlLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkRPTVN0b3JhZ2UuRXZlbnRzLkRPTVN0b3JhZ2VJdGVtQWRkZWQsdGhpcy5fZG9tU3RvcmFnZUl0ZW1BZGRlZCx0aGlzKSx0aGlzLl9kb21TdG9yYWdlLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkRPTVN0b3JhZ2UuRXZlbnRzLkRPTVN0b3JhZ2VJdGVtVXBkYXRlZCx0aGlzLl9kb21TdG9yYWdlSXRlbVVwZGF0ZWQsdGhpcyksXTt0aGlzLnJlZnJlc2hJdGVtcygpO30KX2RvbVN0b3JhZ2VJdGVtc0NsZWFyZWQoKXtpZighdGhpcy5pc1Nob3dpbmcoKXx8IXRoaXMuX2RhdGFHcmlkKQpyZXR1cm47dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKS5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2RhdGFHcmlkLmFkZENyZWF0aW9uTm9kZShmYWxzZSk7dGhpcy5zZXRDYW5EZWxldGVTZWxlY3RlZChmYWxzZSk7fQpfZG9tU3RvcmFnZUl0ZW1SZW1vdmVkKGV2ZW50KXtpZighdGhpcy5pc1Nob3dpbmcoKXx8IXRoaXMuX2RhdGFHcmlkKQpyZXR1cm47Y29uc3Qgc3RvcmFnZURhdGE9ZXZlbnQuZGF0YTtjb25zdCByb290Tm9kZT10aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpO2NvbnN0IGNoaWxkcmVuPXJvb3ROb2RlLmNoaWxkcmVuO2ZvcihsZXQgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSl7Y29uc3QgY2hpbGROb2RlPWNoaWxkcmVuW2ldO2lmKGNoaWxkTm9kZS5kYXRhLmtleT09PXN0b3JhZ2VEYXRhLmtleSl7cm9vdE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTt0aGlzLnNldENhbkRlbGV0ZVNlbGVjdGVkKGNoaWxkcmVuLmxlbmd0aD4xKTtyZXR1cm47fX19Cl9kb21TdG9yYWdlSXRlbUFkZGVkKGV2ZW50KXtpZighdGhpcy5pc1Nob3dpbmcoKXx8IXRoaXMuX2RhdGFHcmlkKQpyZXR1cm47Y29uc3Qgc3RvcmFnZURhdGE9ZXZlbnQuZGF0YTtjb25zdCByb290Tm9kZT10aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpO2NvbnN0IGNoaWxkcmVuPXJvb3ROb2RlLmNoaWxkcmVuO2ZvcihsZXQgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSl7aWYoY2hpbGRyZW5baV0uZGF0YS5rZXk9PT1zdG9yYWdlRGF0YS5rZXkpCnJldHVybjt9CmNvbnN0IGNoaWxkTm9kZT1uZXcgRGF0YUdyaWQuRGF0YUdyaWROb2RlKHtrZXk6c3RvcmFnZURhdGEua2V5LHZhbHVlOnN0b3JhZ2VEYXRhLnZhbHVlfSxmYWxzZSk7cm9vdE5vZGUuaW5zZXJ0Q2hpbGQoY2hpbGROb2RlLGNoaWxkcmVuLmxlbmd0aC0xKTt9Cl9kb21TdG9yYWdlSXRlbVVwZGF0ZWQoZXZlbnQpe2lmKCF0aGlzLmlzU2hvd2luZygpfHwhdGhpcy5fZGF0YUdyaWQpCnJldHVybjtjb25zdCBzdG9yYWdlRGF0YT1ldmVudC5kYXRhO2NvbnN0IGNoaWxkTm9kZT10aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmNoaWxkcmVuLmZpbmQoY2hpbGQ9PmNoaWxkLmRhdGEua2V5PT09c3RvcmFnZURhdGEua2V5KTtpZighY2hpbGROb2RlfHxjaGlsZE5vZGUuZGF0YS52YWx1ZT09PXN0b3JhZ2VEYXRhLnZhbHVlKQpyZXR1cm47Y2hpbGROb2RlLmRhdGEudmFsdWU9c3RvcmFnZURhdGEudmFsdWU7Y2hpbGROb2RlLnJlZnJlc2goKTtpZighY2hpbGROb2RlLnNlbGVjdGVkKQpyZXR1cm47dGhpcy5fcHJldmlld0VudHJ5KGNoaWxkTm9kZSk7dGhpcy5zZXRDYW5EZWxldGVTZWxlY3RlZCh0cnVlKTt9Cl9zaG93RE9NU3RvcmFnZUl0ZW1zKGl0ZW1zKXtjb25zdCByb290Tm9kZT10aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpO2xldCBzZWxlY3RlZEtleT1udWxsO2Zvcihjb25zdCBub2RlIG9mIHJvb3ROb2RlLmNoaWxkcmVuKXtpZighbm9kZS5zZWxlY3RlZCkKY29udGludWU7c2VsZWN0ZWRLZXk9bm9kZS5kYXRhLmtleTticmVhazt9CnJvb3ROb2RlLnJlbW92ZUNoaWxkcmVuKCk7bGV0IHNlbGVjdGVkTm9kZT1udWxsO2NvbnN0IGZpbHRlcmVkSXRlbXM9aXRlbT0+YCR7aXRlbVswXX0gJHtpdGVtWzFdfWA7Zm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5maWx0ZXIoaXRlbXMsZmlsdGVyZWRJdGVtcykpe2NvbnN0IGtleT1pdGVtWzBdO2NvbnN0IHZhbHVlPWl0ZW1bMV07Y29uc3Qgbm9kZT1uZXcgRGF0YUdyaWQuRGF0YUdyaWROb2RlKHtrZXk6a2V5LHZhbHVlOnZhbHVlfSxmYWxzZSk7bm9kZS5zZWxlY3RhYmxlPXRydWU7cm9vdE5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7aWYoIXNlbGVjdGVkTm9kZXx8a2V5PT09c2VsZWN0ZWRLZXkpCnNlbGVjdGVkTm9kZT1ub2RlO30KaWYoc2VsZWN0ZWROb2RlKQpzZWxlY3RlZE5vZGUuc2VsZWN0ZWQ9dHJ1ZTt0aGlzLl9kYXRhR3JpZC5hZGRDcmVhdGlvbk5vZGUoZmFsc2UpO3RoaXMuc2V0Q2FuRGVsZXRlU2VsZWN0ZWQoISFzZWxlY3RlZE5vZGUpO30KZGVsZXRlU2VsZWN0ZWRJdGVtKCl7aWYoIXRoaXMuX2RhdGFHcmlkfHwhdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlKQpyZXR1cm47dGhpcy5fZGVsZXRlQ2FsbGJhY2sodGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlKTt9CnJlZnJlc2hJdGVtcygpe3RoaXMuX2RvbVN0b3JhZ2UuZ2V0SXRlbXMoKS50aGVuKGl0ZW1zPT5pdGVtcyYmdGhpcy5fc2hvd0RPTVN0b3JhZ2VJdGVtcyhpdGVtcykpO30KZGVsZXRlQWxsSXRlbXMoKXt0aGlzLl9kb21TdG9yYWdlLmNsZWFyKCk7dGhpcy5fZG9tU3RvcmFnZUl0ZW1zQ2xlYXJlZCgpO30KX2VkaXRpbmdDYWxsYmFjayhlZGl0aW5nTm9kZSxjb2x1bW5JZGVudGlmaWVyLG9sZFRleHQsbmV3VGV4dCl7Y29uc3QgZG9tU3RvcmFnZT10aGlzLl9kb21TdG9yYWdlO2lmKGNvbHVtbklkZW50aWZpZXI9PT0na2V5Jyl7aWYodHlwZW9mIG9sZFRleHQ9PT0nc3RyaW5nJykKZG9tU3RvcmFnZS5yZW1vdmVJdGVtKG9sZFRleHQpO2RvbVN0b3JhZ2Uuc2V0SXRlbShuZXdUZXh0LGVkaXRpbmdOb2RlLmRhdGEudmFsdWV8fCcnKTt0aGlzLl9yZW1vdmVEdXBlcyhlZGl0aW5nTm9kZSk7fWVsc2V7ZG9tU3RvcmFnZS5zZXRJdGVtKGVkaXRpbmdOb2RlLmRhdGEua2V5fHwnJyxuZXdUZXh0KTt9fQpfcmVtb3ZlRHVwZXMobWFzdGVyTm9kZSl7Y29uc3Qgcm9vdE5vZGU9dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKTtjb25zdCBjaGlsZHJlbj1yb290Tm9kZS5jaGlsZHJlbjtmb3IobGV0IGk9Y2hpbGRyZW4ubGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IGNoaWxkTm9kZT1jaGlsZHJlbltpXTtpZigoY2hpbGROb2RlLmRhdGEua2V5PT09bWFzdGVyTm9kZS5kYXRhLmtleSkmJihtYXN0ZXJOb2RlIT09Y2hpbGROb2RlKSkKcm9vdE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTt9fQpfZGVsZXRlQ2FsbGJhY2sobm9kZSl7aWYoIW5vZGV8fG5vZGUuaXNDcmVhdGlvbk5vZGUpCnJldHVybjtpZih0aGlzLl9kb21TdG9yYWdlKQp0aGlzLl9kb21TdG9yYWdlLnJlbW92ZUl0ZW0obm9kZS5kYXRhLmtleSk7fQpfc2hvd1ByZXZpZXcocHJldmlldyx2YWx1ZSl7aWYodGhpcy5fcHJldmlldyYmdGhpcy5fcHJldmlld1ZhbHVlPT09dmFsdWUpCnJldHVybjtpZih0aGlzLl9wcmV2aWV3KQp0aGlzLl9wcmV2aWV3LmRldGFjaCgpO2lmKCFwcmV2aWV3KQpwcmV2aWV3PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ1NlbGVjdCBhIHZhbHVlIHRvIHByZXZpZXcnKSk7dGhpcy5fcHJldmlld1ZhbHVlPXZhbHVlO3RoaXMuX3ByZXZpZXc9cHJldmlldztwcmV2aWV3LnNob3codGhpcy5fcHJldmlld1BhbmVsLmNvbnRlbnRFbGVtZW50KTt9CmFzeW5jIF9wcmV2aWV3RW50cnkoZW50cnkpe2NvbnN0IHZhbHVlPWVudHJ5JiZlbnRyeS5kYXRhJiZlbnRyeS5kYXRhLnZhbHVlO2lmKCF2YWx1ZSl7dGhpcy5fc2hvd1ByZXZpZXcobnVsbCx2YWx1ZSk7cmV0dXJuO30KY29uc3QgcHJvdG9jb2w9dGhpcy5fZG9tU3RvcmFnZS5pc0xvY2FsU3RvcmFnZT8nbG9jYWxzdG9yYWdlJzonc2Vzc2lvbnN0b3JhZ2UnO2NvbnN0IHVybD1gJHtwcm90b2NvbH06Ly8ke2VudHJ5LmtleX1gO2NvbnN0IHByb3ZpZGVyPUNvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXIuZnJvbVN0cmluZyh1cmwsQ29tbW9uLnJlc291cmNlVHlwZXMuWEhSLCh2YWx1ZSkpO2NvbnN0IHByZXZpZXc9YXdhaXQgU291cmNlRnJhbWUuUHJldmlld0ZhY3RvcnkuY3JlYXRlUHJldmlldyhwcm92aWRlciwndGV4dC9wbGFpbicpO2lmKCFlbnRyeS5zZWxlY3RlZCkKcmV0dXJuO3RoaXMuX3Nob3dQcmV2aWV3KHByZXZpZXcsdmFsdWUpO319OztSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGRhdGFiYXNlKXtzdXBlcigpO3RoaXMuZGF0YWJhc2U9ZGF0YWJhc2U7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0b3JhZ2UtdmlldycsJ3F1ZXJ5JywnbW9ub3NwYWNlJyk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0Jyx0aGlzLl9zZWxlY3RTdGFydC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9wcm9tcHRDb250YWluZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdkYXRhYmFzZS1xdWVyeS1wcm9tcHQtY29udGFpbmVyJyk7dGhpcy5fcHJvbXB0Q29udGFpbmVyLmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdGV4dC1wcm9tcHQnLCdwcm9tcHQtaWNvbicpKTt0aGlzLl9wcm9tcHRFbGVtZW50PXRoaXMuX3Byb21wdENvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jyk7dGhpcy5fcHJvbXB0RWxlbWVudC5jbGFzc05hbWU9J2RhdGFiYXNlLXF1ZXJ5LXByb21wdCc7dGhpcy5fcHJvbXB0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9wcm9tcHRLZXlEb3duLmJpbmQodGhpcykpO3RoaXMuX3Byb21wdD1uZXcgVUkuVGV4dFByb21wdCgpO3RoaXMuX3Byb21wdC5pbml0aWFsaXplKHRoaXMuY29tcGxldGlvbnMuYmluZCh0aGlzKSwnICcpO3RoaXMuX3Byb3h5RWxlbWVudD10aGlzLl9wcm9tcHQuYXR0YWNoKHRoaXMuX3Byb21wdEVsZW1lbnQpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fbWVzc2FnZXNDbGlja2VkLmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5lbGVtZW50LnRhYkluZGV4PTA7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyx0aGlzLl9wcm9tcHQuZm9jdXMuYmluZCh0aGlzLl9wcm9tcHQpKTt9Cl9tZXNzYWdlc0NsaWNrZWQoKXtpZighdGhpcy5fcHJvbXB0LmlzQ2FyZXRJbnNpZGVQcm9tcHQoKSYmIXRoaXMuZWxlbWVudC5oYXNTZWxlY3Rpb24oKSkKdGhpcy5fcHJvbXB0Lm1vdmVDYXJldFRvRW5kT2ZQcm9tcHQoKTt9CmFzeW5jIGNvbXBsZXRpb25zKGV4cHJlc3Npb24scHJlZml4LGZvcmNlKXtpZighcHJlZml4KQpyZXR1cm5bXTtwcmVmaXg9cHJlZml4LnRvTG93ZXJDYXNlKCk7Y29uc3QgdGFibGVOYW1lcz1hd2FpdCB0aGlzLmRhdGFiYXNlLnRhYmxlTmFtZXMoKTtyZXR1cm4gdGFibGVOYW1lcy5tYXAobmFtZT0+bmFtZSsnICcpLmNvbmNhdChSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXcuX1NRTF9CVUlMVF9JTlMpLmZpbHRlcihwcm9wb3NhbD0+cHJvcG9zYWwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHByZWZpeCkpLm1hcChjb21wbGV0aW9uPT4oe3RleHQ6Y29tcGxldGlvbn0pKTt9Cl9zZWxlY3RTdGFydChldmVudCl7aWYodGhpcy5fc2VsZWN0aW9uVGltZW91dCkKY2xlYXJUaW1lb3V0KHRoaXMuX3NlbGVjdGlvblRpbWVvdXQpO3RoaXMuX3Byb21wdC5jbGVhckF1dG9jb21wbGV0ZSgpO2Z1bmN0aW9uIG1vdmVCYWNrSWZPdXRzaWRlKCl7ZGVsZXRlIHRoaXMuX3NlbGVjdGlvblRpbWVvdXQ7aWYoIXRoaXMuX3Byb21wdC5pc0NhcmV0SW5zaWRlUHJvbXB0KCkmJiF0aGlzLmVsZW1lbnQuaGFzU2VsZWN0aW9uKCkpCnRoaXMuX3Byb21wdC5tb3ZlQ2FyZXRUb0VuZE9mUHJvbXB0KCk7dGhpcy5fcHJvbXB0LmF1dG9Db21wbGV0ZVNvb24oKTt9CnRoaXMuX3NlbGVjdGlvblRpbWVvdXQ9c2V0VGltZW91dChtb3ZlQmFja0lmT3V0c2lkZS5iaW5kKHRoaXMpLDEwMCk7fQpfcHJvbXB0S2V5RG93bihldmVudCl7aWYoaXNFbnRlcktleShldmVudCkpe3RoaXMuX2VudGVyS2V5UHJlc3NlZChldmVudCk7cmV0dXJuO319CmFzeW5jIF9lbnRlcktleVByZXNzZWQoZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7Y29uc3QgcXVlcnk9dGhpcy5fcHJvbXB0LnRleHRXaXRoQ3VycmVudFN1Z2dlc3Rpb24oKTt0aGlzLl9wcm9tcHQuY2xlYXJBdXRvY29tcGxldGUoKTtpZighcXVlcnkubGVuZ3RoKQpyZXR1cm47dGhpcy5fcHJvbXB0LnNldEVuYWJsZWQoZmFsc2UpO3RyeXtjb25zdCByZXN1bHQ9YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e3RoaXMuZGF0YWJhc2UuZXhlY3V0ZVNxbChxdWVyeSwoY29sdW1uTmFtZXMsdmFsdWVzKT0+cmVzb2x2ZSh7Y29sdW1uTmFtZXMsdmFsdWVzfSksZXJyb3JUZXh0PT5yZWplY3QoZXJyb3JUZXh0KSk7fSk7dGhpcy5fcXVlcnlGaW5pc2hlZChxdWVyeSxyZXN1bHQuY29sdW1uTmFtZXMscmVzdWx0LnZhbHVlcyk7fWNhdGNoKGUpe3RoaXMuX2FwcGVuZEVycm9yUXVlcnlSZXN1bHQocXVlcnksZSk7fQp0aGlzLl9wcm9tcHQuc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9wcm9tcHQuc2V0VGV4dCgnJyk7dGhpcy5fcHJvbXB0LmZvY3VzKCk7fQpfcXVlcnlGaW5pc2hlZChxdWVyeSxjb2x1bW5OYW1lcyx2YWx1ZXMpe2NvbnN0IGRhdGFHcmlkPURhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQuY3JlYXRlKGNvbHVtbk5hbWVzLHZhbHVlcyk7Y29uc3QgdHJpbW1lZFF1ZXJ5PXF1ZXJ5LnRyaW0oKTtsZXQgdmlldz1udWxsO2lmKGRhdGFHcmlkKXtkYXRhR3JpZC5zZXRTdHJpcGVkKHRydWUpO2RhdGFHcmlkLnJlbmRlcklubGluZSgpO2RhdGFHcmlkLmF1dG9TaXplQ29sdW1ucyg1KTt2aWV3PWRhdGFHcmlkLmFzV2lkZ2V0KCk7fQp0aGlzLl9hcHBlbmRWaWV3UXVlcnlSZXN1bHQodHJpbW1lZFF1ZXJ5LHZpZXcpO2lmKHRyaW1tZWRRdWVyeS5tYXRjaCgvXmNyZWF0ZSAvaSl8fHRyaW1tZWRRdWVyeS5tYXRjaCgvXmRyb3AgdGFibGUgL2kpKQp0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXcuRXZlbnRzLlNjaGVtYVVwZGF0ZWQsdGhpcy5kYXRhYmFzZSk7fQpfYXBwZW5kVmlld1F1ZXJ5UmVzdWx0KHF1ZXJ5LHZpZXcpe2NvbnN0IHJlc3VsdEVsZW1lbnQ9dGhpcy5fYXBwZW5kUXVlcnlSZXN1bHQocXVlcnkpO2lmKHZpZXcpCnZpZXcuc2hvdyhyZXN1bHRFbGVtZW50KTtlbHNlCnJlc3VsdEVsZW1lbnQucmVtb3ZlKCk7dGhpcy5fcHJvbXB0RWxlbWVudC5zY3JvbGxJbnRvVmlldyhmYWxzZSk7fQpfYXBwZW5kRXJyb3JRdWVyeVJlc3VsdChxdWVyeSxlcnJvclRleHQpe2NvbnN0IHJlc3VsdEVsZW1lbnQ9dGhpcy5fYXBwZW5kUXVlcnlSZXN1bHQocXVlcnkpO3Jlc3VsdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZXJyb3InKTtyZXN1bHRFbGVtZW50LmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tZXJyb3InLCdwcm9tcHQtaWNvbicpKTtyZXN1bHRFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChlcnJvclRleHQpO3RoaXMuX3Byb21wdEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO30KX2FwcGVuZFF1ZXJ5UmVzdWx0KHF1ZXJ5KXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2VsZW1lbnQuY2xhc3NOYW1lPSdkYXRhYmFzZS11c2VyLXF1ZXJ5JztlbGVtZW50LmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24tdXNlci1jb21tYW5kJywncHJvbXB0LWljb24nKSk7dGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShlbGVtZW50LHRoaXMuX3Byb21wdENvbnRhaW5lcik7Y29uc3QgY29tbWFuZFRleHRFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb21tYW5kVGV4dEVsZW1lbnQuY2xhc3NOYW1lPSdkYXRhYmFzZS1xdWVyeS10ZXh0Jztjb21tYW5kVGV4dEVsZW1lbnQudGV4dENvbnRlbnQ9cXVlcnk7ZWxlbWVudC5hcHBlbmRDaGlsZChjb21tYW5kVGV4dEVsZW1lbnQpO2NvbnN0IHJlc3VsdEVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7cmVzdWx0RWxlbWVudC5jbGFzc05hbWU9J2RhdGFiYXNlLXF1ZXJ5LXJlc3VsdCc7ZWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHRFbGVtZW50KTtyZXR1cm4gcmVzdWx0RWxlbWVudDt9fTtSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXcuRXZlbnRzPXtTY2hlbWFVcGRhdGVkOlN5bWJvbCgnU2NoZW1hVXBkYXRlZCcpfTtSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXcuX1NRTF9CVUlMVF9JTlM9WydTRUxFQ1QgJywnRlJPTSAnLCdXSEVSRSAnLCdMSU1JVCAnLCdERUxFVEUgRlJPTSAnLCdDUkVBVEUgJywnRFJPUCAnLCdUQUJMRSAnLCdJTkRFWCAnLCdVUERBVEUgJywnSU5TRVJUIElOVE8gJywnVkFMVUVTICgnXTs7UmVzb3VyY2VzLkRhdGFiYXNlVGFibGVWaWV3PWNsYXNzIGV4dGVuZHMgVUkuU2ltcGxlVmlld3tjb25zdHJ1Y3RvcihkYXRhYmFzZSx0YWJsZU5hbWUpe3N1cGVyKENvbW1vbi5VSVN0cmluZygnRGF0YWJhc2UnKSk7dGhpcy5kYXRhYmFzZT1kYXRhYmFzZTt0aGlzLnRhYmxlTmFtZT10YWJsZU5hbWU7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0b3JhZ2UtdmlldycsJ3RhYmxlJyk7dGhpcy5fdmlzaWJsZUNvbHVtbnNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdkYXRhYmFzZVRhYmxlVmlld1Zpc2libGVDb2x1bW5zJyx7fSk7dGhpcy5yZWZyZXNoQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLCdsYXJnZWljb24tcmVmcmVzaCcpO3RoaXMucmVmcmVzaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3JlZnJlc2hCdXR0b25DbGlja2VkLHRoaXMpO3RoaXMuX3Zpc2libGVDb2x1bW5zSW5wdXQ9bmV3IFVJLlRvb2xiYXJJbnB1dChDb21tb24uVUlTdHJpbmcoJ1Zpc2libGUgY29sdW1ucycpLDEpO3RoaXMuX3Zpc2libGVDb2x1bW5zSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsdGhpcy5fb25WaXNpYmxlQ29sdW1uc0NoYW5nZWQsdGhpcyk7fQp3YXNTaG93bigpe3RoaXMudXBkYXRlKCk7fQpzeW5jVG9vbGJhckl0ZW1zKCl7cmV0dXJuW3RoaXMucmVmcmVzaEJ1dHRvbix0aGlzLl92aXNpYmxlQ29sdW1uc0lucHV0XTt9Cl9lc2NhcGVUYWJsZU5hbWUodGFibGVOYW1lKXtyZXR1cm4gdGFibGVOYW1lLnJlcGxhY2UoL1wiL2csJyIiJyk7fQp1cGRhdGUoKXt0aGlzLmRhdGFiYXNlLmV4ZWN1dGVTcWwoJ1NFTEVDVCByb3dpZCwgKiBGUk9NICInK3RoaXMuX2VzY2FwZVRhYmxlTmFtZSh0aGlzLnRhYmxlTmFtZSkrJyInLHRoaXMuX3F1ZXJ5RmluaXNoZWQuYmluZCh0aGlzKSx0aGlzLl9xdWVyeUVycm9yLmJpbmQodGhpcykpO30KX3F1ZXJ5RmluaXNoZWQoY29sdW1uTmFtZXMsdmFsdWVzKXt0aGlzLmRldGFjaENoaWxkV2lkZ2V0cygpO3RoaXMuZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2RhdGFHcmlkPURhdGFHcmlkLlNvcnRhYmxlRGF0YUdyaWQuY3JlYXRlKGNvbHVtbk5hbWVzLHZhbHVlcyk7dGhpcy5fdmlzaWJsZUNvbHVtbnNJbnB1dC5zZXRWaXNpYmxlKCEhdGhpcy5fZGF0YUdyaWQpO2lmKCF0aGlzLl9kYXRhR3JpZCl7dGhpcy5fZW1wdHlXaWRnZXQ9bmV3IFVJLkVtcHR5V2lkZ2V0KENvbW1vbi5VSVN0cmluZygnVGhlIOKAnCVz4oCdXG50YWJsZSBpcyBlbXB0eS4nLHRoaXMudGFibGVOYW1lKSk7dGhpcy5fZW1wdHlXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO3JldHVybjt9CnRoaXMuX2RhdGFHcmlkLnNldFN0cmlwZWQodHJ1ZSk7dGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fZGF0YUdyaWQuYXV0b1NpemVDb2x1bW5zKDUpO3RoaXMuX2NvbHVtbnNNYXA9bmV3IE1hcCgpO2ZvcihsZXQgaT0xO2k8Y29sdW1uTmFtZXMubGVuZ3RoOysraSkKdGhpcy5fY29sdW1uc01hcC5zZXQoY29sdW1uTmFtZXNbaV0sU3RyaW5nKGkpKTt0aGlzLl9sYXN0VmlzaWJsZUNvbHVtbnM9Jyc7Y29uc3QgdmlzaWJsZUNvbHVtbnNUZXh0PXRoaXMuX3Zpc2libGVDb2x1bW5zU2V0dGluZy5nZXQoKVt0aGlzLnRhYmxlTmFtZV18fCcnO3RoaXMuX3Zpc2libGVDb2x1bW5zSW5wdXQuc2V0VmFsdWUodmlzaWJsZUNvbHVtbnNUZXh0KTt0aGlzLl9vblZpc2libGVDb2x1bW5zQ2hhbmdlZCgpO30KX29uVmlzaWJsZUNvbHVtbnNDaGFuZ2VkKCl7aWYoIXRoaXMuX2RhdGFHcmlkKQpyZXR1cm47Y29uc3QgdGV4dD10aGlzLl92aXNpYmxlQ29sdW1uc0lucHV0LnZhbHVlKCk7Y29uc3QgcGFydHM9dGV4dC5zcGxpdCgvW1xzLF0rLyk7Y29uc3QgbWF0Y2hlcz1uZXcgU2V0KCk7Y29uc3QgY29sdW1uc1Zpc2liaWxpdHk9e307Y29sdW1uc1Zpc2liaWxpdHlbJzAnXT10cnVlO2ZvcihsZXQgaT0wO2k8cGFydHMubGVuZ3RoOysraSl7Y29uc3QgcGFydD1wYXJ0c1tpXTtpZih0aGlzLl9jb2x1bW5zTWFwLmhhcyhwYXJ0KSl7bWF0Y2hlcy5hZGQocGFydCk7Y29sdW1uc1Zpc2liaWxpdHlbdGhpcy5fY29sdW1uc01hcC5nZXQocGFydCldPXRydWU7fX0KY29uc3QgbmV3VmlzaWJsZUNvbHVtbnM9bWF0Y2hlcy52YWx1ZXNBcnJheSgpLnNvcnQoKS5qb2luKCcsICcpO2lmKG5ld1Zpc2libGVDb2x1bW5zLmxlbmd0aD09PTApe2Zvcihjb25zdCB2IG9mIHRoaXMuX2NvbHVtbnNNYXAudmFsdWVzKCkpCmNvbHVtbnNWaXNpYmlsaXR5W3ZdPXRydWU7fQppZihuZXdWaXNpYmxlQ29sdW1ucz09PXRoaXMuX2xhc3RWaXNpYmxlQ29sdW1ucykKcmV0dXJuO2NvbnN0IHZpc2libGVDb2x1bW5zUmVnaXN0cnk9dGhpcy5fdmlzaWJsZUNvbHVtbnNTZXR0aW5nLmdldCgpO3Zpc2libGVDb2x1bW5zUmVnaXN0cnlbdGhpcy50YWJsZU5hbWVdPXRleHQ7dGhpcy5fdmlzaWJsZUNvbHVtbnNTZXR0aW5nLnNldCh2aXNpYmxlQ29sdW1uc1JlZ2lzdHJ5KTt0aGlzLl9kYXRhR3JpZC5zZXRDb2x1bW5zVmlzaWJsaXR5KGNvbHVtbnNWaXNpYmlsaXR5KTt0aGlzLl9sYXN0VmlzaWJsZUNvbHVtbnM9bmV3VmlzaWJsZUNvbHVtbnM7fQpfcXVlcnlFcnJvcihlcnJvcil7dGhpcy5kZXRhY2hDaGlsZFdpZGdldHMoKTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBlcnJvck1zZ0VsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7ZXJyb3JNc2dFbGVtZW50LmNsYXNzTmFtZT0nc3RvcmFnZS10YWJsZS1lcnJvcic7ZXJyb3JNc2dFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQW4gZXJyb3Igb2NjdXJyZWQgdHJ5aW5nIHRvXG5yZWFkIHRoZSDigJwlc+KAnSB0YWJsZS4nLHRoaXMudGFibGVOYW1lKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZXJyb3JNc2dFbGVtZW50KTt9Cl9yZWZyZXNoQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy51cGRhdGUoKTt9fTs7UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsPWNsYXNzIGV4dGVuZHMgU0RLLlNES01vZGVse2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0YXJnZXQucmVnaXN0ZXJTdG9yYWdlRGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXI9dGFyZ2V0Lm1vZGVsKFNESy5TZWN1cml0eU9yaWdpbk1hbmFnZXIpO3RoaXMuX2luZGV4ZWREQkFnZW50PXRhcmdldC5pbmRleGVkREJBZ2VudCgpO3RoaXMuX3N0b3JhZ2VBZ2VudD10YXJnZXQuc3RvcmFnZUFnZW50KCk7dGhpcy5fZGF0YWJhc2VzPW5ldyBNYXAoKTt0aGlzLl9kYXRhYmFzZU5hbWVzQnlTZWN1cml0eU9yaWdpbj17fTt0aGlzLl9vcmlnaW5zVXBkYXRlZD1uZXcgU2V0KCk7dGhpcy5fdGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDEwMDApO30Kc3RhdGljIGtleUZyb21JREJLZXkoaWRiS2V5KXtpZih0eXBlb2YoaWRiS2V5KT09PSd1bmRlZmluZWQnfHxpZGJLZXk9PT1udWxsKQpyZXR1cm4gdW5kZWZpbmVkO2xldCB0eXBlO2NvbnN0IGtleT17fTtzd2l0Y2godHlwZW9mKGlkYktleSkpe2Nhc2UnbnVtYmVyJzprZXkubnVtYmVyPWlkYktleTt0eXBlPVJlc291cmNlcy5JbmRleGVkREJNb2RlbC5LZXlUeXBlcy5OdW1iZXJUeXBlO2JyZWFrO2Nhc2Unc3RyaW5nJzprZXkuc3RyaW5nPWlkYktleTt0eXBlPVJlc291cmNlcy5JbmRleGVkREJNb2RlbC5LZXlUeXBlcy5TdHJpbmdUeXBlO2JyZWFrO2Nhc2Unb2JqZWN0JzppZihpZGJLZXkgaW5zdGFuY2VvZiBEYXRlKXtrZXkuZGF0ZT1pZGJLZXkuZ2V0VGltZSgpO3R5cGU9UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLktleVR5cGVzLkRhdGVUeXBlO31lbHNlIGlmKEFycmF5LmlzQXJyYXkoaWRiS2V5KSl7a2V5LmFycmF5PVtdO2ZvcihsZXQgaT0wO2k8aWRiS2V5Lmxlbmd0aDsrK2kpCmtleS5hcnJheS5wdXNoKFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5rZXlGcm9tSURCS2V5KGlkYktleVtpXSkpO3R5cGU9UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLktleVR5cGVzLkFycmF5VHlwZTt9CmJyZWFrO2RlZmF1bHQ6cmV0dXJuIHVuZGVmaW5lZDt9CmtleS50eXBlPSh0eXBlKTtyZXR1cm4ga2V5O30Kc3RhdGljIF9rZXlSYW5nZUZyb21JREJLZXlSYW5nZShpZGJLZXlSYW5nZSl7Y29uc3Qga2V5UmFuZ2U9e307a2V5UmFuZ2UubG93ZXI9UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLmtleUZyb21JREJLZXkoaWRiS2V5UmFuZ2UubG93ZXIpO2tleVJhbmdlLnVwcGVyPVJlc291cmNlcy5JbmRleGVkREJNb2RlbC5rZXlGcm9tSURCS2V5KGlkYktleVJhbmdlLnVwcGVyKTtrZXlSYW5nZS5sb3dlck9wZW49ISFpZGJLZXlSYW5nZS5sb3dlck9wZW47a2V5UmFuZ2UudXBwZXJPcGVuPSEhaWRiS2V5UmFuZ2UudXBwZXJPcGVuO3JldHVybiBrZXlSYW5nZTt9CnN0YXRpYyBpZGJLZXlQYXRoRnJvbUtleVBhdGgoa2V5UGF0aCl7bGV0IGlkYktleVBhdGg7c3dpdGNoKGtleVBhdGgudHlwZSl7Y2FzZSBSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuS2V5UGF0aFR5cGVzLk51bGxUeXBlOmlkYktleVBhdGg9bnVsbDticmVhaztjYXNlIFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5LZXlQYXRoVHlwZXMuU3RyaW5nVHlwZTppZGJLZXlQYXRoPWtleVBhdGguc3RyaW5nO2JyZWFrO2Nhc2UgUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLktleVBhdGhUeXBlcy5BcnJheVR5cGU6aWRiS2V5UGF0aD1rZXlQYXRoLmFycmF5O2JyZWFrO30KcmV0dXJuIGlkYktleVBhdGg7fQpzdGF0aWMga2V5UGF0aFN0cmluZ0Zyb21JREJLZXlQYXRoKGlkYktleVBhdGgpe2lmKHR5cGVvZiBpZGJLZXlQYXRoPT09J3N0cmluZycpCnJldHVybiciJytpZGJLZXlQYXRoKyciJztpZihpZGJLZXlQYXRoIGluc3RhbmNlb2YgQXJyYXkpCnJldHVybidbIicraWRiS2V5UGF0aC5qb2luKCciLCAiJykrJyJdJztyZXR1cm4gbnVsbDt9CmVuYWJsZSgpe2lmKHRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9pbmRleGVkREJBZ2VudC5lbmFibGUoKTt0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5TZWN1cml0eU9yaWdpbkFkZGVkLHRoaXMuX3NlY3VyaXR5T3JpZ2luQWRkZWQsdGhpcyk7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlci5FdmVudHMuU2VjdXJpdHlPcmlnaW5SZW1vdmVkLHRoaXMuX3NlY3VyaXR5T3JpZ2luUmVtb3ZlZCx0aGlzKTtmb3IoY29uc3Qgc2VjdXJpdHlPcmlnaW4gb2YgdGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnNlY3VyaXR5T3JpZ2lucygpKQp0aGlzLl9hZGRPcmlnaW4oc2VjdXJpdHlPcmlnaW4pO3RoaXMuX2VuYWJsZWQ9dHJ1ZTt9CmNsZWFyRm9yT3JpZ2luKG9yaWdpbil7aWYoIXRoaXMuX2VuYWJsZWQpCnJldHVybjt0aGlzLl9yZW1vdmVPcmlnaW4ob3JpZ2luKTt0aGlzLl9hZGRPcmlnaW4ob3JpZ2luKTt9CmFzeW5jIGRlbGV0ZURhdGFiYXNlKGRhdGFiYXNlSWQpe2lmKCF0aGlzLl9lbmFibGVkKQpyZXR1cm47YXdhaXQgdGhpcy5faW5kZXhlZERCQWdlbnQuZGVsZXRlRGF0YWJhc2UoZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbixkYXRhYmFzZUlkLm5hbWUpO3RoaXMuX2xvYWREYXRhYmFzZU5hbWVzKGRhdGFiYXNlSWQuc2VjdXJpdHlPcmlnaW4pO30KYXN5bmMgcmVmcmVzaERhdGFiYXNlTmFtZXMoKXtmb3IoY29uc3Qgc2VjdXJpdHlPcmlnaW4gaW4gdGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW4pCmF3YWl0IHRoaXMuX2xvYWREYXRhYmFzZU5hbWVzKHNlY3VyaXR5T3JpZ2luKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuRXZlbnRzLkRhdGFiYXNlTmFtZXNSZWZyZXNoZWQpO30KcmVmcmVzaERhdGFiYXNlKGRhdGFiYXNlSWQpe3RoaXMuX2xvYWREYXRhYmFzZShkYXRhYmFzZUlkLHRydWUpO30KY2xlYXJPYmplY3RTdG9yZShkYXRhYmFzZUlkLG9iamVjdFN0b3JlTmFtZSl7cmV0dXJuIHRoaXMuX2luZGV4ZWREQkFnZW50LmNsZWFyT2JqZWN0U3RvcmUoZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbixkYXRhYmFzZUlkLm5hbWUsb2JqZWN0U3RvcmVOYW1lKTt9CmRlbGV0ZUVudHJpZXMoZGF0YWJhc2VJZCxvYmplY3RTdG9yZU5hbWUsaWRiS2V5UmFuZ2Upe2NvbnN0IGtleVJhbmdlPVJlc291cmNlcy5JbmRleGVkREJNb2RlbC5fa2V5UmFuZ2VGcm9tSURCS2V5UmFuZ2UoaWRiS2V5UmFuZ2UpO3JldHVybiB0aGlzLl9pbmRleGVkREJBZ2VudC5kZWxldGVPYmplY3RTdG9yZUVudHJpZXMoZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbixkYXRhYmFzZUlkLm5hbWUsb2JqZWN0U3RvcmVOYW1lLGtleVJhbmdlKTt9Cl9zZWN1cml0eU9yaWdpbkFkZGVkKGV2ZW50KXtjb25zdCBzZWN1cml0eU9yaWdpbj0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkT3JpZ2luKHNlY3VyaXR5T3JpZ2luKTt9Cl9zZWN1cml0eU9yaWdpblJlbW92ZWQoZXZlbnQpe2NvbnN0IHNlY3VyaXR5T3JpZ2luPShldmVudC5kYXRhKTt0aGlzLl9yZW1vdmVPcmlnaW4oc2VjdXJpdHlPcmlnaW4pO30KX2FkZE9yaWdpbihzZWN1cml0eU9yaWdpbil7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2RhdGFiYXNlTmFtZXNCeVNlY3VyaXR5T3JpZ2luW3NlY3VyaXR5T3JpZ2luXSk7dGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dPVtdO3RoaXMuX2xvYWREYXRhYmFzZU5hbWVzKHNlY3VyaXR5T3JpZ2luKTtpZih0aGlzLl9pc1ZhbGlkU2VjdXJpdHlPcmlnaW4oc2VjdXJpdHlPcmlnaW4pKQp0aGlzLl9zdG9yYWdlQWdlbnQudHJhY2tJbmRleGVkREJGb3JPcmlnaW4oc2VjdXJpdHlPcmlnaW4pO30KX3JlbW92ZU9yaWdpbihzZWN1cml0eU9yaWdpbil7Y29uc29sZS5hc3NlcnQodGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dKTtmb3IobGV0IGk9MDtpPHRoaXMuX2RhdGFiYXNlTmFtZXNCeVNlY3VyaXR5T3JpZ2luW3NlY3VyaXR5T3JpZ2luXS5sZW5ndGg7KytpKQp0aGlzLl9kYXRhYmFzZVJlbW92ZWQoc2VjdXJpdHlPcmlnaW4sdGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dW2ldKTtkZWxldGUgdGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dO2lmKHRoaXMuX2lzVmFsaWRTZWN1cml0eU9yaWdpbihzZWN1cml0eU9yaWdpbikpCnRoaXMuX3N0b3JhZ2VBZ2VudC51bnRyYWNrSW5kZXhlZERCRm9yT3JpZ2luKHNlY3VyaXR5T3JpZ2luKTt9Cl9pc1ZhbGlkU2VjdXJpdHlPcmlnaW4oc2VjdXJpdHlPcmlnaW4pe2NvbnN0IHBhcnNlZFVSTD1zZWN1cml0eU9yaWdpbi5hc1BhcnNlZFVSTCgpO3JldHVybiEhcGFyc2VkVVJMJiZwYXJzZWRVUkwuc2NoZW1lLnN0YXJ0c1dpdGgoJ2h0dHAnKTt9Cl91cGRhdGVPcmlnaW5EYXRhYmFzZU5hbWVzKHNlY3VyaXR5T3JpZ2luLGRhdGFiYXNlTmFtZXMpe2NvbnN0IG5ld0RhdGFiYXNlTmFtZXM9bmV3IFNldChkYXRhYmFzZU5hbWVzKTtjb25zdCBvbGREYXRhYmFzZU5hbWVzPW5ldyBTZXQodGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dKTt0aGlzLl9kYXRhYmFzZU5hbWVzQnlTZWN1cml0eU9yaWdpbltzZWN1cml0eU9yaWdpbl09ZGF0YWJhc2VOYW1lcztmb3IoY29uc3QgZGF0YWJhc2VOYW1lIG9mIG9sZERhdGFiYXNlTmFtZXMpe2lmKCFuZXdEYXRhYmFzZU5hbWVzLmhhcyhkYXRhYmFzZU5hbWUpKQp0aGlzLl9kYXRhYmFzZVJlbW92ZWQoc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lKTt9CmZvcihjb25zdCBkYXRhYmFzZU5hbWUgb2YgbmV3RGF0YWJhc2VOYW1lcyl7aWYoIW9sZERhdGFiYXNlTmFtZXMuaGFzKGRhdGFiYXNlTmFtZSkpCnRoaXMuX2RhdGFiYXNlQWRkZWQoc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lKTt9fQpkYXRhYmFzZXMoKXtjb25zdCByZXN1bHQ9W107Zm9yKGNvbnN0IHNlY3VyaXR5T3JpZ2luIGluIHRoaXMuX2RhdGFiYXNlTmFtZXNCeVNlY3VyaXR5T3JpZ2luKXtjb25zdCBkYXRhYmFzZU5hbWVzPXRoaXMuX2RhdGFiYXNlTmFtZXNCeVNlY3VyaXR5T3JpZ2luW3NlY3VyaXR5T3JpZ2luXTtmb3IobGV0IGk9MDtpPGRhdGFiYXNlTmFtZXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2gobmV3IFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5EYXRhYmFzZUlkKHNlY3VyaXR5T3JpZ2luLGRhdGFiYXNlTmFtZXNbaV0pKTt9CnJldHVybiByZXN1bHQ7fQpfZGF0YWJhc2VBZGRlZChzZWN1cml0eU9yaWdpbixkYXRhYmFzZU5hbWUpe2NvbnN0IGRhdGFiYXNlSWQ9bmV3IFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5EYXRhYmFzZUlkKHNlY3VyaXR5T3JpZ2luLGRhdGFiYXNlTmFtZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cy5EYXRhYmFzZUFkZGVkLHttb2RlbDp0aGlzLGRhdGFiYXNlSWQ6ZGF0YWJhc2VJZH0pO30KX2RhdGFiYXNlUmVtb3ZlZChzZWN1cml0eU9yaWdpbixkYXRhYmFzZU5hbWUpe2NvbnN0IGRhdGFiYXNlSWQ9bmV3IFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5EYXRhYmFzZUlkKHNlY3VyaXR5T3JpZ2luLGRhdGFiYXNlTmFtZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cy5EYXRhYmFzZVJlbW92ZWQse21vZGVsOnRoaXMsZGF0YWJhc2VJZDpkYXRhYmFzZUlkfSk7fQphc3luYyBfbG9hZERhdGFiYXNlTmFtZXMoc2VjdXJpdHlPcmlnaW4pe2NvbnN0IGRhdGFiYXNlTmFtZXM9YXdhaXQgdGhpcy5faW5kZXhlZERCQWdlbnQucmVxdWVzdERhdGFiYXNlTmFtZXMoc2VjdXJpdHlPcmlnaW4pO2lmKCFkYXRhYmFzZU5hbWVzKQpyZXR1cm5bXTtpZighdGhpcy5fZGF0YWJhc2VOYW1lc0J5U2VjdXJpdHlPcmlnaW5bc2VjdXJpdHlPcmlnaW5dKQpyZXR1cm5bXTt0aGlzLl91cGRhdGVPcmlnaW5EYXRhYmFzZU5hbWVzKHNlY3VyaXR5T3JpZ2luLGRhdGFiYXNlTmFtZXMpO3JldHVybiBkYXRhYmFzZU5hbWVzO30KYXN5bmMgX2xvYWREYXRhYmFzZShkYXRhYmFzZUlkLGVudHJpZXNVcGRhdGVkKXtjb25zdCBkYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM9YXdhaXQgdGhpcy5faW5kZXhlZERCQWdlbnQucmVxdWVzdERhdGFiYXNlKGRhdGFiYXNlSWQuc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VJZC5uYW1lKTtpZighZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKQpyZXR1cm47aWYoIXRoaXMuX2RhdGFiYXNlTmFtZXNCeVNlY3VyaXR5T3JpZ2luW2RhdGFiYXNlSWQuc2VjdXJpdHlPcmlnaW5dKQpyZXR1cm47Y29uc3QgZGF0YWJhc2VNb2RlbD1uZXcgUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkRhdGFiYXNlKGRhdGFiYXNlSWQsZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzLnZlcnNpb24pO3RoaXMuX2RhdGFiYXNlcy5zZXQoZGF0YWJhc2VJZCxkYXRhYmFzZU1vZGVsKTtmb3IoY29uc3Qgb2JqZWN0U3RvcmUgb2YgZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzLm9iamVjdFN0b3Jlcyl7Y29uc3Qgb2JqZWN0U3RvcmVJREJLZXlQYXRoPVJlc291cmNlcy5JbmRleGVkREJNb2RlbC5pZGJLZXlQYXRoRnJvbUtleVBhdGgob2JqZWN0U3RvcmUua2V5UGF0aCk7Y29uc3Qgb2JqZWN0U3RvcmVNb2RlbD1uZXcgUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLk9iamVjdFN0b3JlKG9iamVjdFN0b3JlLm5hbWUsb2JqZWN0U3RvcmVJREJLZXlQYXRoLG9iamVjdFN0b3JlLmF1dG9JbmNyZW1lbnQpO2ZvcihsZXQgaj0wO2o8b2JqZWN0U3RvcmUuaW5kZXhlcy5sZW5ndGg7KytqKXtjb25zdCBpbmRleD1vYmplY3RTdG9yZS5pbmRleGVzW2pdO2NvbnN0IGluZGV4SURCS2V5UGF0aD1SZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuaWRiS2V5UGF0aEZyb21LZXlQYXRoKGluZGV4LmtleVBhdGgpO2NvbnN0IGluZGV4TW9kZWw9bmV3IFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5JbmRleChpbmRleC5uYW1lLGluZGV4SURCS2V5UGF0aCxpbmRleC51bmlxdWUsaW5kZXgubXVsdGlFbnRyeSk7b2JqZWN0U3RvcmVNb2RlbC5pbmRleGVzW2luZGV4TW9kZWwubmFtZV09aW5kZXhNb2RlbDt9CmRhdGFiYXNlTW9kZWwub2JqZWN0U3RvcmVzW29iamVjdFN0b3JlTW9kZWwubmFtZV09b2JqZWN0U3RvcmVNb2RlbDt9CnRoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5FdmVudHMuRGF0YWJhc2VMb2FkZWQse21vZGVsOnRoaXMsZGF0YWJhc2U6ZGF0YWJhc2VNb2RlbCxlbnRyaWVzVXBkYXRlZDplbnRyaWVzVXBkYXRlZH0pO30KbG9hZE9iamVjdFN0b3JlRGF0YShkYXRhYmFzZUlkLG9iamVjdFN0b3JlTmFtZSxpZGJLZXlSYW5nZSxza2lwQ291bnQscGFnZVNpemUsY2FsbGJhY2spe3RoaXMuX3JlcXVlc3REYXRhKGRhdGFiYXNlSWQsZGF0YWJhc2VJZC5uYW1lLG9iamVjdFN0b3JlTmFtZSwnJyxpZGJLZXlSYW5nZSxza2lwQ291bnQscGFnZVNpemUsY2FsbGJhY2spO30KbG9hZEluZGV4RGF0YShkYXRhYmFzZUlkLG9iamVjdFN0b3JlTmFtZSxpbmRleE5hbWUsaWRiS2V5UmFuZ2Usc2tpcENvdW50LHBhZ2VTaXplLGNhbGxiYWNrKXt0aGlzLl9yZXF1ZXN0RGF0YShkYXRhYmFzZUlkLGRhdGFiYXNlSWQubmFtZSxvYmplY3RTdG9yZU5hbWUsaW5kZXhOYW1lLGlkYktleVJhbmdlLHNraXBDb3VudCxwYWdlU2l6ZSxjYWxsYmFjayk7fQphc3luYyBfcmVxdWVzdERhdGEoZGF0YWJhc2VJZCxkYXRhYmFzZU5hbWUsb2JqZWN0U3RvcmVOYW1lLGluZGV4TmFtZSxpZGJLZXlSYW5nZSxza2lwQ291bnQscGFnZVNpemUsY2FsbGJhY2spe2NvbnN0IGtleVJhbmdlPWlkYktleVJhbmdlP1Jlc291cmNlcy5JbmRleGVkREJNb2RlbC5fa2V5UmFuZ2VGcm9tSURCS2V5UmFuZ2UoaWRiS2V5UmFuZ2UpOnVuZGVmaW5lZDtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9pbmRleGVkREJBZ2VudC5pbnZva2VfcmVxdWVzdERhdGEoe3NlY3VyaXR5T3JpZ2luOmRhdGFiYXNlSWQuc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lLG9iamVjdFN0b3JlTmFtZSxpbmRleE5hbWUsc2tpcENvdW50LHBhZ2VTaXplLGtleVJhbmdlfSk7aWYocmVzcG9uc2VbUHJvdG9jb2wuRXJyb3JdKXtjb25zb2xlLmVycm9yKCdJbmRleGVkREJBZ2VudCBlcnJvcjogJytyZXNwb25zZVtQcm90b2NvbC5FcnJvcl0pO3JldHVybjt9CmNvbnN0IHJ1bnRpbWVNb2RlbD10aGlzLnRhcmdldCgpLm1vZGVsKFNESy5SdW50aW1lTW9kZWwpO2lmKCFydW50aW1lTW9kZWx8fCF0aGlzLl9kYXRhYmFzZU5hbWVzQnlTZWN1cml0eU9yaWdpbltkYXRhYmFzZUlkLnNlY3VyaXR5T3JpZ2luXSkKcmV0dXJuO2NvbnN0IGRhdGFFbnRyaWVzPXJlc3BvbnNlLm9iamVjdFN0b3JlRGF0YUVudHJpZXM7Y29uc3QgZW50cmllcz1bXTtmb3IoY29uc3QgZGF0YUVudHJ5IG9mIGRhdGFFbnRyaWVzKXtjb25zdCBrZXk9cnVudGltZU1vZGVsLmNyZWF0ZVJlbW90ZU9iamVjdChkYXRhRW50cnkua2V5KTtjb25zdCBwcmltYXJ5S2V5PXJ1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QoZGF0YUVudHJ5LnByaW1hcnlLZXkpO2NvbnN0IHZhbHVlPXJ1bnRpbWVNb2RlbC5jcmVhdGVSZW1vdGVPYmplY3QoZGF0YUVudHJ5LnZhbHVlKTtlbnRyaWVzLnB1c2gobmV3IFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5FbnRyeShrZXkscHJpbWFyeUtleSx2YWx1ZSkpO30KY2FsbGJhY2soZW50cmllcyxyZXNwb25zZS5oYXNNb3JlKTt9CmFzeW5jIF9yZWZyZXNoRGF0YWJhc2VMaXN0KHNlY3VyaXR5T3JpZ2luKXtjb25zdCBkYXRhYmFzZU5hbWVzPWF3YWl0IHRoaXMuX2xvYWREYXRhYmFzZU5hbWVzKHNlY3VyaXR5T3JpZ2luKTtmb3IoY29uc3QgZGF0YWJhc2VOYW1lIG9mIGRhdGFiYXNlTmFtZXMpCnRoaXMuX2xvYWREYXRhYmFzZShuZXcgUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkRhdGFiYXNlSWQoc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lKSxmYWxzZSk7fQppbmRleGVkREJMaXN0VXBkYXRlZChzZWN1cml0eU9yaWdpbil7dGhpcy5fb3JpZ2luc1VwZGF0ZWQuYWRkKHNlY3VyaXR5T3JpZ2luKTt0aGlzLl90aHJvdHRsZXIuc2NoZWR1bGUoKCk9Pntjb25zdCBwcm9taXNlcz1BcnJheS5mcm9tKHRoaXMuX29yaWdpbnNVcGRhdGVkLHNlY3VyaXR5T3JpZ2luPT57dGhpcy5fcmVmcmVzaERhdGFiYXNlTGlzdChzZWN1cml0eU9yaWdpbik7fSk7dGhpcy5fb3JpZ2luc1VwZGF0ZWQuY2xlYXIoKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30pO30KaW5kZXhlZERCQ29udGVudFVwZGF0ZWQoc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lLG9iamVjdFN0b3JlTmFtZSl7Y29uc3QgZGF0YWJhc2VJZD1uZXcgUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkRhdGFiYXNlSWQoc2VjdXJpdHlPcmlnaW4sZGF0YWJhc2VOYW1lKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuRXZlbnRzLkluZGV4ZWREQkNvbnRlbnRVcGRhdGVkLHtkYXRhYmFzZUlkOmRhdGFiYXNlSWQsb2JqZWN0U3RvcmVOYW1lOm9iamVjdFN0b3JlTmFtZSxtb2RlbDp0aGlzfSk7fQpjYWNoZVN0b3JhZ2VMaXN0VXBkYXRlZChzZWN1cml0eU9yaWdpbil7fQpjYWNoZVN0b3JhZ2VDb250ZW50VXBkYXRlZChzZWN1cml0eU9yaWdpbil7fX07U0RLLlNES01vZGVsLnJlZ2lzdGVyKFJlc291cmNlcy5JbmRleGVkREJNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuTm9uZSxmYWxzZSk7UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLktleVR5cGVzPXtOdW1iZXJUeXBlOidudW1iZXInLFN0cmluZ1R5cGU6J3N0cmluZycsRGF0ZVR5cGU6J2RhdGUnLEFycmF5VHlwZTonYXJyYXknfTtSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuS2V5UGF0aFR5cGVzPXtOdWxsVHlwZTonbnVsbCcsU3RyaW5nVHlwZTonc3RyaW5nJyxBcnJheVR5cGU6J2FycmF5J307UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cz17RGF0YWJhc2VBZGRlZDpTeW1ib2woJ0RhdGFiYXNlQWRkZWQnKSxEYXRhYmFzZVJlbW92ZWQ6U3ltYm9sKCdEYXRhYmFzZVJlbW92ZWQnKSxEYXRhYmFzZUxvYWRlZDpTeW1ib2woJ0RhdGFiYXNlTG9hZGVkJyksRGF0YWJhc2VOYW1lc1JlZnJlc2hlZDpTeW1ib2woJ0RhdGFiYXNlTmFtZXNSZWZyZXNoZWQnKSxJbmRleGVkREJDb250ZW50VXBkYXRlZDpTeW1ib2woJ0luZGV4ZWREQkNvbnRlbnRVcGRhdGVkJyl9O1Jlc291cmNlcy5JbmRleGVkREJNb2RlbC5FbnRyeT1jbGFzc3tjb25zdHJ1Y3RvcihrZXkscHJpbWFyeUtleSx2YWx1ZSl7dGhpcy5rZXk9a2V5O3RoaXMucHJpbWFyeUtleT1wcmltYXJ5S2V5O3RoaXMudmFsdWU9dmFsdWU7fX07UmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkRhdGFiYXNlSWQ9Y2xhc3N7Y29uc3RydWN0b3Ioc2VjdXJpdHlPcmlnaW4sbmFtZSl7dGhpcy5zZWN1cml0eU9yaWdpbj1zZWN1cml0eU9yaWdpbjt0aGlzLm5hbWU9bmFtZTt9CmVxdWFscyhkYXRhYmFzZUlkKXtyZXR1cm4gdGhpcy5uYW1lPT09ZGF0YWJhc2VJZC5uYW1lJiZ0aGlzLnNlY3VyaXR5T3JpZ2luPT09ZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbjt9fTtSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuRGF0YWJhc2U9Y2xhc3N7Y29uc3RydWN0b3IoZGF0YWJhc2VJZCx2ZXJzaW9uKXt0aGlzLmRhdGFiYXNlSWQ9ZGF0YWJhc2VJZDt0aGlzLnZlcnNpb249dmVyc2lvbjt0aGlzLm9iamVjdFN0b3Jlcz17fTt9fTtSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuT2JqZWN0U3RvcmU9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSxrZXlQYXRoLGF1dG9JbmNyZW1lbnQpe3RoaXMubmFtZT1uYW1lO3RoaXMua2V5UGF0aD1rZXlQYXRoO3RoaXMuYXV0b0luY3JlbWVudD1hdXRvSW5jcmVtZW50O3RoaXMuaW5kZXhlcz17fTt9CmdldCBrZXlQYXRoU3RyaW5nKCl7cmV0dXJuKFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5rZXlQYXRoU3RyaW5nRnJvbUlEQktleVBhdGgoKHRoaXMua2V5UGF0aCkpKTt9fTtSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwuSW5kZXg9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSxrZXlQYXRoLHVuaXF1ZSxtdWx0aUVudHJ5KXt0aGlzLm5hbWU9bmFtZTt0aGlzLmtleVBhdGg9a2V5UGF0aDt0aGlzLnVuaXF1ZT11bmlxdWU7dGhpcy5tdWx0aUVudHJ5PW11bHRpRW50cnk7fQpnZXQga2V5UGF0aFN0cmluZygpe3JldHVybihSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwua2V5UGF0aFN0cmluZ0Zyb21JREJLZXlQYXRoKCh0aGlzLmtleVBhdGgpKSk7fX07O1Jlc291cmNlcy5JREJEYXRhYmFzZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKG1vZGVsLGRhdGFiYXNlKXtzdXBlcigpO3RoaXMuX21vZGVsPW1vZGVsO2NvbnN0IGRhdGFiYXNlTmFtZT1kYXRhYmFzZT9kYXRhYmFzZS5kYXRhYmFzZUlkLm5hbWU6Q29tbW9uLlVJU3RyaW5nKCdMb2FkaW5nXHUyMDI2Jyk7dGhpcy5fcmVwb3J0Vmlldz1uZXcgVUkuUmVwb3J0VmlldyhkYXRhYmFzZU5hbWUpO3RoaXMuX3JlcG9ydFZpZXcuc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTtjb25zdCBib2R5U2VjdGlvbj10aGlzLl9yZXBvcnRWaWV3LmFwcGVuZFNlY3Rpb24oJycpO3RoaXMuX3NlY3VyaXR5T3JpZ2luRWxlbWVudD1ib2R5U2VjdGlvbi5hcHBlbmRGaWVsZChDb21tb24uVUlTdHJpbmcoJ1NlY3VyaXR5IG9yaWdpbicpKTt0aGlzLl92ZXJzaW9uRWxlbWVudD1ib2R5U2VjdGlvbi5hcHBlbmRGaWVsZChDb21tb24uVUlTdHJpbmcoJ1ZlcnNpb24nKSk7Y29uc3QgZm9vdGVyPXRoaXMuX3JlcG9ydFZpZXcuYXBwZW5kU2VjdGlvbignJykuYXBwZW5kUm93KCk7dGhpcy5fY2xlYXJCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0RlbGV0ZSBkYXRhYmFzZScpLCgpPT50aGlzLl9kZWxldGVEYXRhYmFzZSgpLENvbW1vbi5VSVN0cmluZygnRGVsZXRlIGRhdGFiYXNlJykpO2Zvb3Rlci5hcHBlbmRDaGlsZCh0aGlzLl9jbGVhckJ1dHRvbik7dGhpcy5fcmVmcmVzaEJ1dHRvbj1VSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCBkYXRhYmFzZScpLCgpPT50aGlzLl9yZWZyZXNoRGF0YWJhc2VCdXR0b25DbGlja2VkKCksQ29tbW9uLlVJU3RyaW5nKCdSZWZyZXNoIGRhdGFiYXNlJykpO2Zvb3Rlci5hcHBlbmRDaGlsZCh0aGlzLl9yZWZyZXNoQnV0dG9uKTtpZihkYXRhYmFzZSkKdGhpcy51cGRhdGUoZGF0YWJhc2UpO30KX3JlZnJlc2hEYXRhYmFzZSgpe3RoaXMuX3NlY3VyaXR5T3JpZ2luRWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9kYXRhYmFzZS5kYXRhYmFzZUlkLnNlY3VyaXR5T3JpZ2luO3RoaXMuX3ZlcnNpb25FbGVtZW50LnRleHRDb250ZW50PXRoaXMuX2RhdGFiYXNlLnZlcnNpb247fQpfcmVmcmVzaERhdGFiYXNlQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX21vZGVsLnJlZnJlc2hEYXRhYmFzZSh0aGlzLl9kYXRhYmFzZS5kYXRhYmFzZUlkKTt9CnVwZGF0ZShkYXRhYmFzZSl7dGhpcy5fZGF0YWJhc2U9ZGF0YWJhc2U7dGhpcy5fcmVwb3J0Vmlldy5zZXRUaXRsZSh0aGlzLl9kYXRhYmFzZS5kYXRhYmFzZUlkLm5hbWUpO3RoaXMuX3JlZnJlc2hEYXRhYmFzZSgpO3RoaXMuX3VwZGF0ZWRGb3JUZXN0cygpO30KX3VwZGF0ZWRGb3JUZXN0cygpe30KYXN5bmMgX2RlbGV0ZURhdGFiYXNlKCl7Y29uc3Qgb2s9YXdhaXQgVUkuQ29uZmlybURpYWxvZy5zaG93KENvbW1vbi5VSVN0cmluZygnUGxlYXNlIGNvbmZpcm0gZGVsZXRlIG9mICIlcyIgZGF0YWJhc2UuJyx0aGlzLl9kYXRhYmFzZS5kYXRhYmFzZUlkLm5hbWUpLHRoaXMuZWxlbWVudCk7aWYob2spCnRoaXMuX21vZGVsLmRlbGV0ZURhdGFiYXNlKHRoaXMuX2RhdGFiYXNlLmRhdGFiYXNlSWQpO319O1Jlc291cmNlcy5JREJEYXRhVmlldz1jbGFzcyBleHRlbmRzIFVJLlNpbXBsZVZpZXd7Y29uc3RydWN0b3IobW9kZWwsZGF0YWJhc2VJZCxvYmplY3RTdG9yZSxpbmRleCxyZWZyZXNoT2JqZWN0U3RvcmVDYWxsYmFjayl7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdJREInKSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdyZXNvdXJjZXMvaW5kZXhlZERCVmlld3MuY3NzJyk7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5fZGF0YWJhc2VJZD1kYXRhYmFzZUlkO3RoaXMuX2lzSW5kZXg9ISFpbmRleDt0aGlzLl9yZWZyZXNoT2JqZWN0U3RvcmVDYWxsYmFjaz1yZWZyZXNoT2JqZWN0U3RvcmVDYWxsYmFjazt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaW5kZXhlZC1kYi1kYXRhLXZpZXcnLCdzdG9yYWdlLXZpZXcnKTt0aGlzLl9yZWZyZXNoQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLCdsYXJnZWljb24tcmVmcmVzaCcpO3RoaXMuX3JlZnJlc2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9yZWZyZXNoQnV0dG9uQ2xpY2tlZCx0aGlzKTt0aGlzLl9kZWxldGVTZWxlY3RlZEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0RlbGV0ZSBzZWxlY3RlZCcpLCdsYXJnZWljb24tZGVsZXRlJyk7dGhpcy5fZGVsZXRlU2VsZWN0ZWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+dGhpcy5fZGVsZXRlQnV0dG9uQ2xpY2tlZChudWxsKSk7dGhpcy5fY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhciBvYmplY3Qgc3RvcmUnKSwnbGFyZ2VpY29uLWNsZWFyJyk7dGhpcy5fY2xlYXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9jbGVhckJ1dHRvbkNsaWNrZWQsdGhpcyk7dGhpcy5fbmVlZHNSZWZyZXNoPW5ldyBVSS5Ub29sYmFySXRlbShVSS5jcmVhdGVMYWJlbChDb21tb24uVUlTdHJpbmcoJ0RhdGEgbWF5IGJlIHN0YWxlJyksJ3NtYWxsaWNvbi13YXJuaW5nJykpO3RoaXMuX25lZWRzUmVmcmVzaC5zZXRWaXNpYmxlKGZhbHNlKTt0aGlzLl9uZWVkc1JlZnJlc2guc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdTb21lIGVudHJpZXMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCcpKTt0aGlzLl9jcmVhdGVFZGl0b3JUb29sYmFyKCk7dGhpcy5fcGFnZVNpemU9NTA7dGhpcy5fc2tpcENvdW50PTA7dGhpcy51cGRhdGUob2JqZWN0U3RvcmUsaW5kZXgpO3RoaXMuX2VudHJpZXM9W107fQpfY3JlYXRlRGF0YUdyaWQoKXtjb25zdCBrZXlQYXRoPXRoaXMuX2lzSW5kZXg/dGhpcy5faW5kZXgua2V5UGF0aDp0aGlzLl9vYmplY3RTdG9yZS5rZXlQYXRoO2NvbnN0IGNvbHVtbnM9KFtdKTtjb2x1bW5zLnB1c2goe2lkOidudW1iZXInLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnIycpLHNvcnRhYmxlOmZhbHNlLHdpZHRoOic1MHB4J30pO2NvbHVtbnMucHVzaCh7aWQ6J2tleScsdGl0bGVET01GcmFnbWVudDp0aGlzLl9rZXlDb2x1bW5IZWFkZXJGcmFnbWVudChDb21tb24uVUlTdHJpbmcoJ0tleScpLGtleVBhdGgpLHNvcnRhYmxlOmZhbHNlfSk7aWYodGhpcy5faXNJbmRleCl7Y29sdW1ucy5wdXNoKHtpZDoncHJpbWFyeUtleScsdGl0bGVET01GcmFnbWVudDp0aGlzLl9rZXlDb2x1bW5IZWFkZXJGcmFnbWVudChDb21tb24uVUlTdHJpbmcoJ1ByaW1hcnkga2V5JyksdGhpcy5fb2JqZWN0U3RvcmUua2V5UGF0aCksc29ydGFibGU6ZmFsc2V9KTt9CmNvbHVtbnMucHVzaCh7aWQ6J3ZhbHVlJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1ZhbHVlJyksc29ydGFibGU6ZmFsc2V9KTtjb25zdCBkYXRhR3JpZD1uZXcgRGF0YUdyaWQuRGF0YUdyaWQoY29sdW1ucyx1bmRlZmluZWQsdGhpcy5fZGVsZXRlQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpLHRoaXMuX3VwZGF0ZURhdGEuYmluZCh0aGlzLHRydWUpKTtkYXRhR3JpZC5zZXRTdHJpcGVkKHRydWUpO2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSxldmVudD0+dGhpcy5fdXBkYXRlVG9vbGJhckVuYWJsZW1lbnQoKSx0aGlzKTtyZXR1cm4gZGF0YUdyaWQ7fQpfa2V5Q29sdW1uSGVhZGVyRnJhZ21lbnQocHJlZml4LGtleVBhdGgpe2NvbnN0IGtleUNvbHVtbkhlYWRlckZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtrZXlDb2x1bW5IZWFkZXJGcmFnbWVudC5jcmVhdGVUZXh0Q2hpbGQocHJlZml4KTtpZihrZXlQYXRoPT09bnVsbCkKcmV0dXJuIGtleUNvbHVtbkhlYWRlckZyYWdtZW50O2tleUNvbHVtbkhlYWRlckZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCgnICgnK0NvbW1vbi5VSVN0cmluZygnS2V5IHBhdGg6ICcpKTtpZihBcnJheS5pc0FycmF5KGtleVBhdGgpKXtrZXlDb2x1bW5IZWFkZXJGcmFnbWVudC5jcmVhdGVUZXh0Q2hpbGQoJ1snKTtmb3IobGV0IGk9MDtpPGtleVBhdGgubGVuZ3RoOysraSl7aWYoaSE9PTApCmtleUNvbHVtbkhlYWRlckZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTtrZXlDb2x1bW5IZWFkZXJGcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9rZXlQYXRoU3RyaW5nRnJhZ21lbnQoa2V5UGF0aFtpXSkpO30Ka2V5Q29sdW1uSGVhZGVyRnJhZ21lbnQuY3JlYXRlVGV4dENoaWxkKCddJyk7fWVsc2V7Y29uc3Qga2V5UGF0aFN0cmluZz0oa2V5UGF0aCk7a2V5Q29sdW1uSGVhZGVyRnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fa2V5UGF0aFN0cmluZ0ZyYWdtZW50KGtleVBhdGhTdHJpbmcpKTt9CmtleUNvbHVtbkhlYWRlckZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCgnKScpO3JldHVybiBrZXlDb2x1bW5IZWFkZXJGcmFnbWVudDt9Cl9rZXlQYXRoU3RyaW5nRnJhZ21lbnQoa2V5UGF0aFN0cmluZyl7Y29uc3Qga2V5UGF0aFN0cmluZ0ZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtrZXlQYXRoU3RyaW5nRnJhZ21lbnQuY3JlYXRlVGV4dENoaWxkKCciJyk7Y29uc3Qga2V5UGF0aFNwYW49a2V5UGF0aFN0cmluZ0ZyYWdtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc291cmNlLWNvZGUgaW5kZXhlZC1kYi1rZXktcGF0aCcpO2tleVBhdGhTcGFuLnRleHRDb250ZW50PWtleVBhdGhTdHJpbmc7a2V5UGF0aFN0cmluZ0ZyYWdtZW50LmNyZWF0ZVRleHRDaGlsZCgnIicpO3JldHVybiBrZXlQYXRoU3RyaW5nRnJhZ21lbnQ7fQpfY3JlYXRlRWRpdG9yVG9vbGJhcigpe2NvbnN0IGVkaXRvclRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ2RhdGEtdmlldy10b29sYmFyJyx0aGlzLmVsZW1lbnQpO2VkaXRvclRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcmVmcmVzaEJ1dHRvbik7ZWRpdG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jbGVhckJ1dHRvbik7ZWRpdG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9kZWxldGVTZWxlY3RlZEJ1dHRvbik7ZWRpdG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhclNlcGFyYXRvcigpKTt0aGlzLl9wYWdlQmFja0J1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1Nob3cgcHJldmlvdXMgcGFnZScpLCdsYXJnZWljb24tcGxheS1iYWNrJyk7dGhpcy5fcGFnZUJhY2tCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9wYWdlQmFja0J1dHRvbkNsaWNrZWQsdGhpcyk7ZWRpdG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9wYWdlQmFja0J1dHRvbik7dGhpcy5fcGFnZUZvcndhcmRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdTaG93IG5leHQgcGFnZScpLCdsYXJnZWljb24tcGxheScpO3RoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fcGFnZUZvcndhcmRCdXR0b25DbGlja2VkLHRoaXMpO2VkaXRvclRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcGFnZUZvcndhcmRCdXR0b24pO3RoaXMuX2tleUlucHV0RWxlbWVudD1VSS5jcmVhdGVJbnB1dCgndG9vbGJhci1pbnB1dCcpO2VkaXRvclRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJJdGVtKHRoaXMuX2tleUlucHV0RWxlbWVudCkpO3RoaXMuX2tleUlucHV0RWxlbWVudC5wbGFjZWhvbGRlcj1Db21tb24uVUlTdHJpbmcoJ1N0YXJ0IGZyb20ga2V5Jyk7dGhpcy5fa2V5SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJyx0aGlzLl9rZXlJbnB1dENoYW5nZWQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fa2V5SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2N1dCcsdGhpcy5fa2V5SW5wdXRDaGFuZ2VkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2tleUlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsdGhpcy5fa2V5SW5wdXRDaGFuZ2VkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX2tleUlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9rZXlJbnB1dENoYW5nZWQuYmluZCh0aGlzKSxmYWxzZSk7ZWRpdG9yVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9uZWVkc1JlZnJlc2gpO30KX3BhZ2VCYWNrQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy5fc2tpcENvdW50PU1hdGgubWF4KDAsdGhpcy5fc2tpcENvdW50LXRoaXMuX3BhZ2VTaXplKTt0aGlzLl91cGRhdGVEYXRhKGZhbHNlKTt9Cl9wYWdlRm9yd2FyZEJ1dHRvbkNsaWNrZWQoZXZlbnQpe3RoaXMuX3NraXBDb3VudD10aGlzLl9za2lwQ291bnQrdGhpcy5fcGFnZVNpemU7dGhpcy5fdXBkYXRlRGF0YShmYWxzZSk7fQpfa2V5SW5wdXRDaGFuZ2VkKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5fdXBkYXRlRGF0YS5iaW5kKHRoaXMsZmFsc2UpLDApO30KcmVmcmVzaERhdGEoKXt0aGlzLl91cGRhdGVEYXRhKHRydWUpO30KdXBkYXRlKG9iamVjdFN0b3JlLGluZGV4KXt0aGlzLl9vYmplY3RTdG9yZT1vYmplY3RTdG9yZTt0aGlzLl9pbmRleD1pbmRleDtpZih0aGlzLl9kYXRhR3JpZCkKdGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKS5kZXRhY2goKTt0aGlzLl9kYXRhR3JpZD10aGlzLl9jcmVhdGVEYXRhR3JpZCgpO3RoaXMuX2RhdGFHcmlkLmFzV2lkZ2V0KCkuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX3NraXBDb3VudD0wO3RoaXMuX3VwZGF0ZURhdGEodHJ1ZSk7fQpfcGFyc2VLZXkoa2V5U3RyaW5nKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9SlNPTi5wYXJzZShrZXlTdHJpbmcpO31jYXRjaChlKXtyZXN1bHQ9a2V5U3RyaW5nO30KcmV0dXJuIHJlc3VsdDt9Cl91cGRhdGVEYXRhKGZvcmNlKXtjb25zdCBrZXk9dGhpcy5fcGFyc2VLZXkodGhpcy5fa2V5SW5wdXRFbGVtZW50LnZhbHVlKTtjb25zdCBwYWdlU2l6ZT10aGlzLl9wYWdlU2l6ZTtsZXQgc2tpcENvdW50PXRoaXMuX3NraXBDb3VudDtsZXQgc2VsZWN0ZWQ9dGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlP3RoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZS5kYXRhWydudW1iZXInXTowO3NlbGVjdGVkPU1hdGgubWF4KHNlbGVjdGVkLHRoaXMuX3NraXBDb3VudCk7dGhpcy5fcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9jbGVhckJ1dHRvbi5zZXRFbmFibGVkKCF0aGlzLl9pc0luZGV4KTtpZighZm9yY2UmJnRoaXMuX2xhc3RLZXk9PT1rZXkmJnRoaXMuX2xhc3RQYWdlU2l6ZT09PXBhZ2VTaXplJiZ0aGlzLl9sYXN0U2tpcENvdW50PT09c2tpcENvdW50KQpyZXR1cm47aWYodGhpcy5fbGFzdEtleSE9PWtleXx8dGhpcy5fbGFzdFBhZ2VTaXplIT09cGFnZVNpemUpe3NraXBDb3VudD0wO3RoaXMuX3NraXBDb3VudD0wO30KdGhpcy5fbGFzdEtleT1rZXk7dGhpcy5fbGFzdFBhZ2VTaXplPXBhZ2VTaXplO3RoaXMuX2xhc3RTa2lwQ291bnQ9c2tpcENvdW50O2Z1bmN0aW9uIGNhbGxiYWNrKGVudHJpZXMsaGFzTW9yZSl7dGhpcy5fcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMuY2xlYXIoKTt0aGlzLl9lbnRyaWVzPWVudHJpZXM7bGV0IHNlbGVjdGVkTm9kZT1udWxsO2ZvcihsZXQgaT0wO2k8ZW50cmllcy5sZW5ndGg7KytpKXtjb25zdCBkYXRhPXt9O2RhdGFbJ251bWJlciddPWkrc2tpcENvdW50O2RhdGFbJ2tleSddPWVudHJpZXNbaV0ua2V5O2RhdGFbJ3ByaW1hcnlLZXknXT1lbnRyaWVzW2ldLnByaW1hcnlLZXk7ZGF0YVsndmFsdWUnXT1lbnRyaWVzW2ldLnZhbHVlO2NvbnN0IG5vZGU9bmV3IFJlc291cmNlcy5JREJEYXRhR3JpZE5vZGUoZGF0YSk7dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKS5hcHBlbmRDaGlsZChub2RlKTtpZihkYXRhWydudW1iZXInXTw9c2VsZWN0ZWQpCnNlbGVjdGVkTm9kZT1ub2RlO30KaWYoc2VsZWN0ZWROb2RlKQpzZWxlY3RlZE5vZGUuc2VsZWN0KCk7dGhpcy5fcGFnZUJhY2tCdXR0b24uc2V0RW5hYmxlZCghIXNraXBDb3VudCk7dGhpcy5fcGFnZUZvcndhcmRCdXR0b24uc2V0RW5hYmxlZChoYXNNb3JlKTt0aGlzLl9uZWVkc1JlZnJlc2guc2V0VmlzaWJsZShmYWxzZSk7dGhpcy5fdXBkYXRlVG9vbGJhckVuYWJsZW1lbnQoKTt0aGlzLl91cGRhdGVkRGF0YUZvclRlc3RzKCk7fQpjb25zdCBpZGJLZXlSYW5nZT1rZXk/d2luZG93LklEQktleVJhbmdlLmxvd2VyQm91bmQoa2V5KTpudWxsO2lmKHRoaXMuX2lzSW5kZXgpe3RoaXMuX21vZGVsLmxvYWRJbmRleERhdGEodGhpcy5fZGF0YWJhc2VJZCx0aGlzLl9vYmplY3RTdG9yZS5uYW1lLHRoaXMuX2luZGV4Lm5hbWUsaWRiS2V5UmFuZ2Usc2tpcENvdW50LHBhZ2VTaXplLGNhbGxiYWNrLmJpbmQodGhpcykpO31lbHNle3RoaXMuX21vZGVsLmxvYWRPYmplY3RTdG9yZURhdGEodGhpcy5fZGF0YWJhc2VJZCx0aGlzLl9vYmplY3RTdG9yZS5uYW1lLGlkYktleVJhbmdlLHNraXBDb3VudCxwYWdlU2l6ZSxjYWxsYmFjay5iaW5kKHRoaXMpKTt9fQpfdXBkYXRlZERhdGFGb3JUZXN0cygpe30KX3JlZnJlc2hCdXR0b25DbGlja2VkKGV2ZW50KXt0aGlzLl91cGRhdGVEYXRhKHRydWUpO30KYXN5bmMgX2NsZWFyQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy5fY2xlYXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7YXdhaXQgdGhpcy5fbW9kZWwuY2xlYXJPYmplY3RTdG9yZSh0aGlzLl9kYXRhYmFzZUlkLHRoaXMuX29iamVjdFN0b3JlLm5hbWUpO3RoaXMuX2NsZWFyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fdXBkYXRlRGF0YSh0cnVlKTt9Cm1hcmtOZWVkc1JlZnJlc2goKXt0aGlzLl9uZWVkc1JlZnJlc2guc2V0VmlzaWJsZSh0cnVlKTt9CmFzeW5jIF9kZWxldGVCdXR0b25DbGlja2VkKG5vZGUpe2lmKCFub2RlKXtub2RlPXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTtpZighbm9kZSkKcmV0dXJuO30KY29uc3Qga2V5PSh0aGlzLl9pc0luZGV4P25vZGUuZGF0YS5wcmltYXJ5S2V5Om5vZGUuZGF0YS5rZXkpO2NvbnN0IGtleVZhbHVlPShrZXkudmFsdWUpO2F3YWl0IHRoaXMuX21vZGVsLmRlbGV0ZUVudHJpZXModGhpcy5fZGF0YWJhc2VJZCx0aGlzLl9vYmplY3RTdG9yZS5uYW1lLHdpbmRvdy5JREJLZXlSYW5nZS5vbmx5KGtleVZhbHVlKSk7dGhpcy5fcmVmcmVzaE9iamVjdFN0b3JlQ2FsbGJhY2soKTt9CmNsZWFyKCl7dGhpcy5fZGF0YUdyaWQucm9vdE5vZGUoKS5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2VudHJpZXM9W107fQpfdXBkYXRlVG9vbGJhckVuYWJsZW1lbnQoKXtjb25zdCBlbXB0eT0hdGhpcy5fZGF0YUdyaWR8fHRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkuY2hpbGRyZW4ubGVuZ3RoPT09MDt0aGlzLl9jbGVhckJ1dHRvbi5zZXRFbmFibGVkKCFlbXB0eSk7dGhpcy5fZGVsZXRlU2VsZWN0ZWRCdXR0b24uc2V0RW5hYmxlZCghZW1wdHkmJnRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZSE9PW51bGwpO319O1Jlc291cmNlcy5JREJEYXRhR3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5EYXRhR3JpZE5vZGV7Y29uc3RydWN0b3IoZGF0YSl7c3VwZXIoZGF0YSxmYWxzZSk7dGhpcy5zZWxlY3RhYmxlPXRydWU7fQpjcmVhdGVDZWxsKGNvbHVtbklkZW50aWZpZXIpe2NvbnN0IGNlbGw9c3VwZXIuY3JlYXRlQ2VsbChjb2x1bW5JZGVudGlmaWVyKTtjb25zdCB2YWx1ZT0odGhpcy5kYXRhW2NvbHVtbklkZW50aWZpZXJdKTtzd2l0Y2goY29sdW1uSWRlbnRpZmllcil7Y2FzZSd2YWx1ZSc6Y2FzZSdrZXknOmNhc2UncHJpbWFyeUtleSc6Y2VsbC5yZW1vdmVDaGlsZHJlbigpO2NvbnN0IG9iamVjdEVsZW1lbnQ9T2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uZGVmYXVsdE9iamVjdFByZXNlbnRhdGlvbih2YWx1ZSx1bmRlZmluZWQsdHJ1ZSk7Y2VsbC5hcHBlbmRDaGlsZChvYmplY3RFbGVtZW50KTticmVhaztkZWZhdWx0On0KcmV0dXJuIGNlbGw7fX07O1Jlc291cmNlcy5SZXNvdXJjZXNQYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVsV2l0aFNpZGViYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigncmVzb3VyY2VzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdyZXNvdXJjZXMvcmVzb3VyY2VzUGFuZWwuY3NzJyk7dGhpcy5fcmVzb3VyY2VzTGFzdFNlbGVjdGVkSXRlbVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3Jlc291cmNlc0xhc3RTZWxlY3RlZEVsZW1lbnRQYXRoJyxbXSk7dGhpcy52aXNpYmxlVmlldz1udWxsO3RoaXMuX3BlbmRpbmdWaWV3UHJvbWlzZT1udWxsO3RoaXMuX2NhdGVnb3J5Vmlldz1udWxsO2NvbnN0IG1haW5Db250YWluZXI9bmV3IFVJLlZCb3goKTt0aGlzLnN0b3JhZ2VWaWV3cz1tYWluQ29udGFpbmVyLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Zib3ggZmxleC1hdXRvJyk7dGhpcy5fc3RvcmFnZVZpZXdUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCdyZXNvdXJjZXMtdG9vbGJhcicsbWFpbkNvbnRhaW5lci5lbGVtZW50KTt0aGlzLnNwbGl0V2lkZ2V0KCkuc2V0TWFpbldpZGdldChtYWluQ29udGFpbmVyKTt0aGlzLl9kb21TdG9yYWdlVmlldz1udWxsO3RoaXMuX2Nvb2tpZVZpZXc9bnVsbDt0aGlzLl9lbXB0eVdpZGdldD1udWxsO3RoaXMuX3NpZGViYXI9bmV3IFJlc291cmNlcy5BcHBsaWNhdGlvblBhbmVsU2lkZWJhcih0aGlzKTt0aGlzLl9zaWRlYmFyLnNob3codGhpcy5wYW5lbFNpZGViYXJFbGVtZW50KCkpO30Kc3RhdGljIF9pbnN0YW5jZSgpe3JldHVybihzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoUmVzb3VyY2VzLlJlc291cmNlc1BhbmVsKSk7fQpzdGF0aWMgX3Nob3VsZENsb3NlT25SZXNldCh2aWV3KXtjb25zdCB2aWV3Q2xhc3Nlc1RvQ2xvc2U9W1NvdXJjZUZyYW1lLlJlc291cmNlU291cmNlRnJhbWUsU291cmNlRnJhbWUuSW1hZ2VWaWV3LFNvdXJjZUZyYW1lLkZvbnRWaWV3LFJlc291cmNlcy5TdG9yYWdlSXRlbXNWaWV3LFJlc291cmNlcy5EYXRhYmFzZVF1ZXJ5VmlldyxSZXNvdXJjZXMuRGF0YWJhc2VUYWJsZVZpZXddO3JldHVybiB2aWV3Q2xhc3Nlc1RvQ2xvc2Uuc29tZSh0eXBlPT52aWV3IGluc3RhbmNlb2YgdHlwZSk7fQpmb2N1cygpe3RoaXMuX3NpZGViYXIuZm9jdXMoKTt9Cmxhc3RTZWxlY3RlZEl0ZW1QYXRoKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlc0xhc3RTZWxlY3RlZEl0ZW1TZXR0aW5nLmdldCgpO30Kc2V0TGFzdFNlbGVjdGVkSXRlbVBhdGgocGF0aCl7dGhpcy5fcmVzb3VyY2VzTGFzdFNlbGVjdGVkSXRlbVNldHRpbmcuc2V0KHBhdGgpO30KcmVzZXRWaWV3KCl7aWYodGhpcy52aXNpYmxlVmlldyYmUmVzb3VyY2VzLlJlc291cmNlc1BhbmVsLl9zaG91bGRDbG9zZU9uUmVzZXQodGhpcy52aXNpYmxlVmlldykpCnRoaXMuc2hvd1ZpZXcobnVsbCk7fQpzaG93Vmlldyh2aWV3KXt0aGlzLl9wZW5kaW5nVmlld1Byb21pc2U9bnVsbDtpZih0aGlzLnZpc2libGVWaWV3PT09dmlldykKcmV0dXJuO2lmKHRoaXMudmlzaWJsZVZpZXcpCnRoaXMudmlzaWJsZVZpZXcuZGV0YWNoKCk7aWYodmlldykKdmlldy5zaG93KHRoaXMuc3RvcmFnZVZpZXdzKTt0aGlzLnZpc2libGVWaWV3PXZpZXc7dGhpcy5fc3RvcmFnZVZpZXdUb29sYmFyLnJlbW92ZVRvb2xiYXJJdGVtcygpO2NvbnN0IHRvb2xiYXJJdGVtcz0odmlldyBpbnN0YW5jZW9mIFVJLlNpbXBsZVZpZXcmJnZpZXcuc3luY1Rvb2xiYXJJdGVtcygpKXx8W107Zm9yKGxldCBpPTA7aTx0b29sYmFySXRlbXMubGVuZ3RoOysraSkKdGhpcy5fc3RvcmFnZVZpZXdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRvb2xiYXJJdGVtc1tpXSk7dGhpcy5fc3RvcmFnZVZpZXdUb29sYmFyLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdG9vbGJhckl0ZW1zLmxlbmd0aCk7fQphc3luYyBzY2hlZHVsZVNob3dWaWV3KHZpZXdQcm9taXNlKXt0aGlzLl9wZW5kaW5nVmlld1Byb21pc2U9dmlld1Byb21pc2U7Y29uc3Qgdmlldz1hd2FpdCB2aWV3UHJvbWlzZTtpZih0aGlzLl9wZW5kaW5nVmlld1Byb21pc2UhPT12aWV3UHJvbWlzZSkKcmV0dXJuIG51bGw7dGhpcy5zaG93Vmlldyh2aWV3KTtyZXR1cm4gdmlldzt9CnNob3dDYXRlZ29yeVZpZXcoY2F0ZWdvcnlOYW1lKXtpZighdGhpcy5fY2F0ZWdvcnlWaWV3KQp0aGlzLl9jYXRlZ29yeVZpZXc9bmV3IFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlWaWV3KCk7dGhpcy5fY2F0ZWdvcnlWaWV3LnNldFRleHQoY2F0ZWdvcnlOYW1lKTt0aGlzLnNob3dWaWV3KHRoaXMuX2NhdGVnb3J5Vmlldyk7fQpzaG93RE9NU3RvcmFnZShkb21TdG9yYWdlKXtpZighZG9tU3RvcmFnZSkKcmV0dXJuO2lmKCF0aGlzLl9kb21TdG9yYWdlVmlldykKdGhpcy5fZG9tU3RvcmFnZVZpZXc9bmV3IFJlc291cmNlcy5ET01TdG9yYWdlSXRlbXNWaWV3KGRvbVN0b3JhZ2UpO2Vsc2UKdGhpcy5fZG9tU3RvcmFnZVZpZXcuc2V0U3RvcmFnZShkb21TdG9yYWdlKTt0aGlzLnNob3dWaWV3KHRoaXMuX2RvbVN0b3JhZ2VWaWV3KTt9CnNob3dDb29raWVzKGNvb2tpZUZyYW1lVGFyZ2V0LGNvb2tpZURvbWFpbil7Y29uc3QgbW9kZWw9Y29va2llRnJhbWVUYXJnZXQubW9kZWwoU0RLLkNvb2tpZU1vZGVsKTtpZighbW9kZWwpCnJldHVybjtpZighdGhpcy5fY29va2llVmlldykKdGhpcy5fY29va2llVmlldz1uZXcgUmVzb3VyY2VzLkNvb2tpZUl0ZW1zVmlldyhtb2RlbCxjb29raWVEb21haW4pO2Vsc2UKdGhpcy5fY29va2llVmlldy5zZXRDb29raWVzRG9tYWluKG1vZGVsLGNvb2tpZURvbWFpbik7dGhpcy5zaG93Vmlldyh0aGlzLl9jb29raWVWaWV3KTt9CnNob3dFbXB0eVdpZGdldCh0ZXh0KXtpZighdGhpcy5fZW1wdHlXaWRnZXQpCnRoaXMuX2VtcHR5V2lkZ2V0PW5ldyBVSS5FbXB0eVdpZGdldCh0ZXh0KTtlbHNlCnRoaXMuX2VtcHR5V2lkZ2V0LnRleHQ9dGV4dDt0aGlzLnNob3dWaWV3KHRoaXMuX2VtcHR5V2lkZ2V0KTt9CmNsZWFyQ29va2llcyh0YXJnZXQsY29va2llRG9tYWluKXtjb25zdCBtb2RlbD10YXJnZXQubW9kZWwoU0RLLkNvb2tpZU1vZGVsKTtpZighbW9kZWwpCnJldHVybjttb2RlbC5jbGVhcihjb29raWVEb21haW4sKCk9PntpZih0aGlzLl9jb29raWVWaWV3KQp0aGlzLl9jb29raWVWaWV3LnJlZnJlc2hJdGVtcygpO30pO319O1Jlc291cmNlcy5SZXNvdXJjZXNQYW5lbC5SZXNvdXJjZVJldmVhbGVyPWNsYXNze2FzeW5jIHJldmVhbChyZXNvdXJjZSl7aWYoIShyZXNvdXJjZSBpbnN0YW5jZW9mIFNESy5SZXNvdXJjZSkpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yOiBub3QgYSByZXNvdXJjZScpKTtjb25zdCBzaWRlYmFyPVJlc291cmNlcy5SZXNvdXJjZXNQYW5lbC5faW5zdGFuY2UoKS5fc2lkZWJhcjthd2FpdCBVSS52aWV3TWFuYWdlci5zaG93VmlldygncmVzb3VyY2VzJyk7YXdhaXQgc2lkZWJhci5zaG93UmVzb3VyY2UocmVzb3VyY2UpO319OztSZXNvdXJjZXMuQXBwbGljYXRpb25QYW5lbFNpZGViYXI9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHBhbmVsKXtzdXBlcigpO3RoaXMuX3BhbmVsPXBhbmVsO3RoaXMuX3NpZGViYXJUcmVlPW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7dGhpcy5fc2lkZWJhclRyZWUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNvdXJjZXMtc2lkZWJhcicpO3RoaXMuX3NpZGViYXJUcmVlLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Jlc291cmNlcy9yZXNvdXJjZXNTaWRlYmFyLmNzcycpO3RoaXMuX3NpZGViYXJUcmVlLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsdGVyLWFsbCcpO3RoaXMuX3NpZGViYXJUcmVlLmFkZEV2ZW50TGlzdGVuZXIoVUkuVHJlZU91dGxpbmUuRXZlbnRzLkVsZW1lbnRBdHRhY2hlZCx0aGlzLl90cmVlRWxlbWVudEFkZGVkLHRoaXMpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2lkZWJhclRyZWUuZWxlbWVudCk7dGhpcy5fYXBwbGljYXRpb25UcmVlRWxlbWVudD10aGlzLl9hZGRTaWRlYmFyU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0FwcGxpY2F0aW9uJykpO2NvbnN0IG1hbmlmZXN0VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5BcHBNYW5pZmVzdFRyZWVFbGVtZW50KHBhbmVsKTt0aGlzLl9hcHBsaWNhdGlvblRyZWVFbGVtZW50LmFwcGVuZENoaWxkKG1hbmlmZXN0VHJlZUVsZW1lbnQpO3RoaXMuc2VydmljZVdvcmtlcnNUcmVlRWxlbWVudD1uZXcgUmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJzVHJlZUVsZW1lbnQocGFuZWwpO3RoaXMuX2FwcGxpY2F0aW9uVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXJ2aWNlV29ya2Vyc1RyZWVFbGVtZW50KTtjb25zdCBjbGVhclN0b3JhZ2VUcmVlRWxlbWVudD1uZXcgUmVzb3VyY2VzLkNsZWFyU3RvcmFnZVRyZWVFbGVtZW50KHBhbmVsKTt0aGlzLl9hcHBsaWNhdGlvblRyZWVFbGVtZW50LmFwcGVuZENoaWxkKGNsZWFyU3RvcmFnZVRyZWVFbGVtZW50KTtjb25zdCBzdG9yYWdlVHJlZUVsZW1lbnQ9dGhpcy5fYWRkU2lkZWJhclNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdTdG9yYWdlJykpO3RoaXMubG9jYWxTdG9yYWdlTGlzdFRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuU3RvcmFnZUNhdGVnb3J5VHJlZUVsZW1lbnQocGFuZWwsQ29tbW9uLlVJU3RyaW5nKCdMb2NhbCBTdG9yYWdlJyksJ0xvY2FsU3RvcmFnZScpO2NvbnN0IGxvY2FsU3RvcmFnZUljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tdGFibGUnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLmxvY2FsU3RvcmFnZUxpc3RUcmVlRWxlbWVudC5zZXRMZWFkaW5nSWNvbnMoW2xvY2FsU3RvcmFnZUljb25dKTtzdG9yYWdlVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5sb2NhbFN0b3JhZ2VMaXN0VHJlZUVsZW1lbnQpO3RoaXMuc2Vzc2lvblN0b3JhZ2VMaXN0VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlUcmVlRWxlbWVudChwYW5lbCxDb21tb24uVUlTdHJpbmcoJ1Nlc3Npb24gU3RvcmFnZScpLCdTZXNzaW9uU3RvcmFnZScpO2NvbnN0IHNlc3Npb25TdG9yYWdlSWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi10YWJsZScsJ3Jlc291cmNlLXRyZWUtaXRlbScpO3RoaXMuc2Vzc2lvblN0b3JhZ2VMaXN0VHJlZUVsZW1lbnQuc2V0TGVhZGluZ0ljb25zKFtzZXNzaW9uU3RvcmFnZUljb25dKTtzdG9yYWdlVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXNzaW9uU3RvcmFnZUxpc3RUcmVlRWxlbWVudCk7dGhpcy5pbmRleGVkREJMaXN0VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5JbmRleGVkREJUcmVlRWxlbWVudChwYW5lbCk7c3RvcmFnZVRyZWVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5kZXhlZERCTGlzdFRyZWVFbGVtZW50KTt0aGlzLmRhdGFiYXNlc0xpc3RUcmVlRWxlbWVudD1uZXcgUmVzb3VyY2VzLlN0b3JhZ2VDYXRlZ29yeVRyZWVFbGVtZW50KHBhbmVsLENvbW1vbi5VSVN0cmluZygnV2ViIFNRTCcpLCdEYXRhYmFzZXMnKTtjb25zdCBkYXRhYmFzZUljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tZGF0YWJhc2UnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLmRhdGFiYXNlc0xpc3RUcmVlRWxlbWVudC5zZXRMZWFkaW5nSWNvbnMoW2RhdGFiYXNlSWNvbl0pO3N0b3JhZ2VUcmVlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmRhdGFiYXNlc0xpc3RUcmVlRWxlbWVudCk7dGhpcy5jb29raWVMaXN0VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlUcmVlRWxlbWVudChwYW5lbCxDb21tb24uVUlTdHJpbmcoJ0Nvb2tpZXMnKSwnQ29va2llcycpO2NvbnN0IGNvb2tpZUljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tY29va2llJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5jb29raWVMaXN0VHJlZUVsZW1lbnQuc2V0TGVhZGluZ0ljb25zKFtjb29raWVJY29uXSk7c3RvcmFnZVRyZWVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY29va2llTGlzdFRyZWVFbGVtZW50KTtjb25zdCBjYWNoZVRyZWVFbGVtZW50PXRoaXMuX2FkZFNpZGViYXJTZWN0aW9uKENvbW1vbi5VSVN0cmluZygnQ2FjaGUnKSk7dGhpcy5jYWNoZVN0b3JhZ2VMaXN0VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5TZXJ2aWNlV29ya2VyQ2FjaGVUcmVlRWxlbWVudChwYW5lbCk7Y2FjaGVUcmVlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmNhY2hlU3RvcmFnZUxpc3RUcmVlRWxlbWVudCk7dGhpcy5hcHBsaWNhdGlvbkNhY2hlTGlzdFRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuU3RvcmFnZUNhdGVnb3J5VHJlZUVsZW1lbnQocGFuZWwsQ29tbW9uLlVJU3RyaW5nKCdBcHBsaWNhdGlvbiBDYWNoZScpLCdBcHBsaWNhdGlvbkNhY2hlJyk7Y29uc3QgYXBwbGljYXRpb25DYWNoZUljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tdGFibGUnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLmFwcGxpY2F0aW9uQ2FjaGVMaXN0VHJlZUVsZW1lbnQuc2V0TGVhZGluZ0ljb25zKFthcHBsaWNhdGlvbkNhY2hlSWNvbl0pO2NhY2hlVHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5hcHBsaWNhdGlvbkNhY2hlTGlzdFRyZWVFbGVtZW50KTt0aGlzLl9yZXNvdXJjZXNTZWN0aW9uPW5ldyBSZXNvdXJjZXMuUmVzb3VyY2VzU2VjdGlvbihwYW5lbCx0aGlzLl9hZGRTaWRlYmFyU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0ZyYW1lcycpKSk7dGhpcy5fZGF0YWJhc2VUYWJsZVZpZXdzPW5ldyBNYXAoKTt0aGlzLl9kYXRhYmFzZVF1ZXJ5Vmlld3M9bmV3IE1hcCgpO3RoaXMuX2RhdGFiYXNlVHJlZUVsZW1lbnRzPW5ldyBNYXAoKTt0aGlzLl9kb21TdG9yYWdlVHJlZUVsZW1lbnRzPW5ldyBNYXAoKTt0aGlzLl9kb21haW5zPXt9O3RoaXMuX3NpZGViYXJUcmVlLmNvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fb25tb3VzZW1vdmUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fc2lkZWJhclRyZWUuY29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsdGhpcy5fb25tb3VzZWxlYXZlLmJpbmQodGhpcyksZmFsc2UpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVUYXJnZXRzKHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fZnJhbWVOYXZpZ2F0ZWQsdGhpcyk7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX3BhbmVsLmxhc3RTZWxlY3RlZEl0ZW1QYXRoKCk7aWYoIXNlbGVjdGlvbi5sZW5ndGgpCm1hbmlmZXN0VHJlZUVsZW1lbnQuc2VsZWN0KCk7fQpfYWRkU2lkZWJhclNlY3Rpb24odGl0bGUpe2NvbnN0IHRyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudCh0aXRsZSx0cnVlKTt0cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RvcmFnZS1ncm91cC1saXN0LWl0ZW0nKTt0cmVlRWxlbWVudC5zZXRDb2xsYXBzaWJsZShmYWxzZSk7dHJlZUVsZW1lbnQuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLl9zaWRlYmFyVHJlZS5hcHBlbmRDaGlsZCh0cmVlRWxlbWVudCk7cmV0dXJuIHRyZWVFbGVtZW50O30KdGFyZ2V0QWRkZWQodGFyZ2V0KXtpZih0aGlzLl90YXJnZXQpCnJldHVybjt0aGlzLl90YXJnZXQ9dGFyZ2V0O3RoaXMuX2RhdGFiYXNlTW9kZWw9dGFyZ2V0Lm1vZGVsKFJlc291cmNlcy5EYXRhYmFzZU1vZGVsKTt0aGlzLl9kYXRhYmFzZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwuRXZlbnRzLkRhdGFiYXNlQWRkZWQsdGhpcy5fZGF0YWJhc2VBZGRlZCx0aGlzKTt0aGlzLl9kYXRhYmFzZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkRhdGFiYXNlTW9kZWwuRXZlbnRzLkRhdGFiYXNlc1JlbW92ZWQsdGhpcy5fcmVzZXRXZWJTUUwsdGhpcyk7Y29uc3QgcmVzb3VyY2VUcmVlTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7aWYoIXJlc291cmNlVHJlZU1vZGVsKQpyZXR1cm47aWYocmVzb3VyY2VUcmVlTW9kZWwuY2FjaGVkUmVzb3VyY2VzTG9hZGVkKCkpCnRoaXMuX2luaXRpYWxpemUoKTtyZXNvdXJjZVRyZWVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuQ2FjaGVkUmVzb3VyY2VzTG9hZGVkLHRoaXMuX2luaXRpYWxpemUsdGhpcyk7cmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLldpbGxMb2FkQ2FjaGVkUmVzb3VyY2VzLHRoaXMuX3Jlc2V0V2l0aEZyYW1lcyx0aGlzKTt9CnRhcmdldFJlbW92ZWQodGFyZ2V0KXtpZih0YXJnZXQhPT10aGlzLl90YXJnZXQpCnJldHVybjtkZWxldGUgdGhpcy5fdGFyZ2V0O2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKHJlc291cmNlVHJlZU1vZGVsKXtyZXNvdXJjZVRyZWVNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuQ2FjaGVkUmVzb3VyY2VzTG9hZGVkLHRoaXMuX2luaXRpYWxpemUsdGhpcyk7cmVzb3VyY2VUcmVlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLldpbGxMb2FkQ2FjaGVkUmVzb3VyY2VzLHRoaXMuX3Jlc2V0V2l0aEZyYW1lcyx0aGlzKTt9CnRoaXMuX2RhdGFiYXNlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRGF0YWJhc2VNb2RlbC5FdmVudHMuRGF0YWJhc2VBZGRlZCx0aGlzLl9kYXRhYmFzZUFkZGVkLHRoaXMpO3RoaXMuX2RhdGFiYXNlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRGF0YWJhc2VNb2RlbC5FdmVudHMuRGF0YWJhc2VzUmVtb3ZlZCx0aGlzLl9yZXNldFdlYlNRTCx0aGlzKTt0aGlzLl9yZXNldFdpdGhGcmFtZXMoKTt9CmZvY3VzKCl7dGhpcy5fc2lkZWJhclRyZWUuZm9jdXMoKTt9Cl9pbml0aWFsaXplKCl7Zm9yKGNvbnN0IGZyYW1lIG9mIFNESy5SZXNvdXJjZVRyZWVNb2RlbC5mcmFtZXMoKSkKdGhpcy5fYWRkQ29va2llRG9jdW1lbnQoZnJhbWUpO3RoaXMuX2RhdGFiYXNlTW9kZWwuZW5hYmxlKCk7Y29uc3QgaW5kZXhlZERCTW9kZWw9dGhpcy5fdGFyZ2V0Lm1vZGVsKFJlc291cmNlcy5JbmRleGVkREJNb2RlbCk7aWYoaW5kZXhlZERCTW9kZWwpCmluZGV4ZWREQk1vZGVsLmVuYWJsZSgpO2NvbnN0IGNhY2hlU3RvcmFnZU1vZGVsPXRoaXMuX3RhcmdldC5tb2RlbChTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWwpO2lmKGNhY2hlU3RvcmFnZU1vZGVsKQpjYWNoZVN0b3JhZ2VNb2RlbC5lbmFibGUoKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD10aGlzLl90YXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKTtpZihyZXNvdXJjZVRyZWVNb2RlbCkKdGhpcy5fcG9wdWxhdGVBcHBsaWNhdGlvbkNhY2hlVHJlZShyZXNvdXJjZVRyZWVNb2RlbCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhSZXNvdXJjZXMuRE9NU3RvcmFnZU1vZGVsLHRoaXMpO3RoaXMuaW5kZXhlZERCTGlzdFRyZWVFbGVtZW50Ll9pbml0aWFsaXplKCk7Y29uc3Qgc2VydmljZVdvcmtlckNhY2hlTW9kZWw9dGhpcy5fdGFyZ2V0Lm1vZGVsKFNESy5TZXJ2aWNlV29ya2VyQ2FjaGVNb2RlbCk7dGhpcy5jYWNoZVN0b3JhZ2VMaXN0VHJlZUVsZW1lbnQuX2luaXRpYWxpemUoc2VydmljZVdvcmtlckNhY2hlTW9kZWwpO30KbW9kZWxBZGRlZChkb21TdG9yYWdlTW9kZWwpe2RvbVN0b3JhZ2VNb2RlbC5lbmFibGUoKTtkb21TdG9yYWdlTW9kZWwuc3RvcmFnZXMoKS5mb3JFYWNoKHRoaXMuX2FkZERPTVN0b3JhZ2UuYmluZCh0aGlzKSk7ZG9tU3RvcmFnZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkRPTVN0b3JhZ2VNb2RlbC5FdmVudHMuRE9NU3RvcmFnZUFkZGVkLHRoaXMuX2RvbVN0b3JhZ2VBZGRlZCx0aGlzKTtkb21TdG9yYWdlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRE9NU3RvcmFnZU1vZGVsLkV2ZW50cy5ET01TdG9yYWdlUmVtb3ZlZCx0aGlzLl9kb21TdG9yYWdlUmVtb3ZlZCx0aGlzKTt9Cm1vZGVsUmVtb3ZlZChkb21TdG9yYWdlTW9kZWwpe2RvbVN0b3JhZ2VNb2RlbC5zdG9yYWdlcygpLmZvckVhY2godGhpcy5fcmVtb3ZlRE9NU3RvcmFnZS5iaW5kKHRoaXMpKTtkb21TdG9yYWdlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuRE9NU3RvcmFnZU1vZGVsLkV2ZW50cy5ET01TdG9yYWdlQWRkZWQsdGhpcy5fZG9tU3RvcmFnZUFkZGVkLHRoaXMpO2RvbVN0b3JhZ2VNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFJlc291cmNlcy5ET01TdG9yYWdlTW9kZWwuRXZlbnRzLkRPTVN0b3JhZ2VSZW1vdmVkLHRoaXMuX2RvbVN0b3JhZ2VSZW1vdmVkLHRoaXMpO30KX3Jlc2V0V2l0aEZyYW1lcygpe3RoaXMuX3Jlc291cmNlc1NlY3Rpb24ucmVzZXQoKTt0aGlzLl9yZXNldCgpO30KX3Jlc2V0V2ViU1FMKCl7Y29uc3QgcXVlcnlWaWV3cz10aGlzLl9kYXRhYmFzZVF1ZXJ5Vmlld3MudmFsdWVzQXJyYXkoKTtmb3IobGV0IGk9MDtpPHF1ZXJ5Vmlld3MubGVuZ3RoOysraSl7cXVlcnlWaWV3c1tpXS5yZW1vdmVFdmVudExpc3RlbmVyKFJlc291cmNlcy5EYXRhYmFzZVF1ZXJ5Vmlldy5FdmVudHMuU2NoZW1hVXBkYXRlZCx0aGlzLl91cGRhdGVEYXRhYmFzZVRhYmxlcyx0aGlzKTt9CnRoaXMuX2RhdGFiYXNlVGFibGVWaWV3cy5jbGVhcigpO3RoaXMuX2RhdGFiYXNlUXVlcnlWaWV3cy5jbGVhcigpO3RoaXMuX2RhdGFiYXNlVHJlZUVsZW1lbnRzLmNsZWFyKCk7dGhpcy5kYXRhYmFzZXNMaXN0VHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLmRhdGFiYXNlc0xpc3RUcmVlRWxlbWVudC5zZXRFeHBhbmRhYmxlKGZhbHNlKTt9Cl9yZXNldEFwcENhY2hlKCl7Zm9yKGNvbnN0IGZyYW1lSWQgb2YgT2JqZWN0LmtleXModGhpcy5fYXBwbGljYXRpb25DYWNoZUZyYW1lRWxlbWVudHMpKQp0aGlzLl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVNYW5pZmVzdFJlbW92ZWQoe2RhdGE6ZnJhbWVJZH0pO3RoaXMuYXBwbGljYXRpb25DYWNoZUxpc3RUcmVlRWxlbWVudC5zZXRFeHBhbmRhYmxlKGZhbHNlKTt9Cl90cmVlRWxlbWVudEFkZGVkKGV2ZW50KXtjb25zdCBzZWxlY3Rpb249dGhpcy5fcGFuZWwubGFzdFNlbGVjdGVkSXRlbVBhdGgoKTtpZighc2VsZWN0aW9uLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGVsZW1lbnQ9ZXZlbnQuZGF0YTtjb25zdCBpbmRleD1zZWxlY3Rpb24uaW5kZXhPZihlbGVtZW50Lml0ZW1VUkwpO2lmKGluZGV4PDApCnJldHVybjtmb3IobGV0IHBhcmVudD1lbGVtZW50LnBhcmVudDtwYXJlbnQ7cGFyZW50PXBhcmVudC5wYXJlbnQpCnBhcmVudC5leHBhbmQoKTtpZihpbmRleD4wKQplbGVtZW50LmV4cGFuZCgpO2VsZW1lbnQuc2VsZWN0KCk7fQpfcmVzZXQoKXt0aGlzLl9kb21haW5zPXt9O3RoaXMuX3Jlc2V0V2ViU1FMKCk7dGhpcy5jb29raWVMaXN0VHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt9Cl9mcmFtZU5hdmlnYXRlZChldmVudCl7Y29uc3QgZnJhbWU9ZXZlbnQuZGF0YTtpZihmcmFtZS5pc1RvcEZyYW1lKCkpCnRoaXMuX3Jlc2V0KCk7Y29uc3QgYXBwbGljYXRpb25DYWNoZUZyYW1lVHJlZUVsZW1lbnQ9dGhpcy5fYXBwbGljYXRpb25DYWNoZUZyYW1lRWxlbWVudHNbZnJhbWUuaWRdO2lmKGFwcGxpY2F0aW9uQ2FjaGVGcmFtZVRyZWVFbGVtZW50KQphcHBsaWNhdGlvbkNhY2hlRnJhbWVUcmVlRWxlbWVudC5mcmFtZU5hdmlnYXRlZChmcmFtZSk7dGhpcy5fYWRkQ29va2llRG9jdW1lbnQoZnJhbWUpO30KX2RhdGFiYXNlQWRkZWQoZXZlbnQpe2NvbnN0IGRhdGFiYXNlPShldmVudC5kYXRhKTtjb25zdCBkYXRhYmFzZVRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuRGF0YWJhc2VUcmVlRWxlbWVudCh0aGlzLGRhdGFiYXNlKTt0aGlzLl9kYXRhYmFzZVRyZWVFbGVtZW50cy5zZXQoZGF0YWJhc2UsZGF0YWJhc2VUcmVlRWxlbWVudCk7dGhpcy5kYXRhYmFzZXNMaXN0VHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZGF0YWJhc2VUcmVlRWxlbWVudCk7fQpfYWRkQ29va2llRG9jdW1lbnQoZnJhbWUpe2NvbnN0IHBhcnNlZFVSTD1mcmFtZS51cmwuYXNQYXJzZWRVUkwoKTtpZighcGFyc2VkVVJMfHwocGFyc2VkVVJMLnNjaGVtZSE9PSdodHRwJyYmcGFyc2VkVVJMLnNjaGVtZSE9PSdodHRwcycmJnBhcnNlZFVSTC5zY2hlbWUhPT0nZmlsZScpKQpyZXR1cm47Y29uc3QgZG9tYWluPXBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbigpO2lmKCF0aGlzLl9kb21haW5zW2RvbWFpbl0pe3RoaXMuX2RvbWFpbnNbZG9tYWluXT10cnVlO2NvbnN0IGNvb2tpZURvbWFpblRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuQ29va2llVHJlZUVsZW1lbnQodGhpcy5fcGFuZWwsZnJhbWUsZG9tYWluKTt0aGlzLmNvb2tpZUxpc3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZChjb29raWVEb21haW5UcmVlRWxlbWVudCk7fX0KX2RvbVN0b3JhZ2VBZGRlZChldmVudCl7Y29uc3QgZG9tU3RvcmFnZT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkRE9NU3RvcmFnZShkb21TdG9yYWdlKTt9Cl9hZGRET01TdG9yYWdlKGRvbVN0b3JhZ2Upe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLl9kb21TdG9yYWdlVHJlZUVsZW1lbnRzLmdldChkb21TdG9yYWdlKSk7Y29uc3QgZG9tU3RvcmFnZVRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuRE9NU3RvcmFnZVRyZWVFbGVtZW50KHRoaXMuX3BhbmVsLGRvbVN0b3JhZ2UpO3RoaXMuX2RvbVN0b3JhZ2VUcmVlRWxlbWVudHMuc2V0KGRvbVN0b3JhZ2UsZG9tU3RvcmFnZVRyZWVFbGVtZW50KTtpZihkb21TdG9yYWdlLmlzTG9jYWxTdG9yYWdlKQp0aGlzLmxvY2FsU3RvcmFnZUxpc3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZChkb21TdG9yYWdlVHJlZUVsZW1lbnQpO2Vsc2UKdGhpcy5zZXNzaW9uU3RvcmFnZUxpc3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZChkb21TdG9yYWdlVHJlZUVsZW1lbnQpO30KX2RvbVN0b3JhZ2VSZW1vdmVkKGV2ZW50KXtjb25zdCBkb21TdG9yYWdlPShldmVudC5kYXRhKTt0aGlzLl9yZW1vdmVET01TdG9yYWdlKGRvbVN0b3JhZ2UpO30KX3JlbW92ZURPTVN0b3JhZ2UoZG9tU3RvcmFnZSl7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fZG9tU3RvcmFnZVRyZWVFbGVtZW50cy5nZXQoZG9tU3RvcmFnZSk7aWYoIXRyZWVFbGVtZW50KQpyZXR1cm47Y29uc3Qgd2FzU2VsZWN0ZWQ9dHJlZUVsZW1lbnQuc2VsZWN0ZWQ7Y29uc3QgcGFyZW50TGlzdFRyZWVFbGVtZW50PXRyZWVFbGVtZW50LnBhcmVudDtwYXJlbnRMaXN0VHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGQodHJlZUVsZW1lbnQpO2lmKHdhc1NlbGVjdGVkKQpwYXJlbnRMaXN0VHJlZUVsZW1lbnQuc2VsZWN0KCk7dGhpcy5fZG9tU3RvcmFnZVRyZWVFbGVtZW50cy5yZW1vdmUoZG9tU3RvcmFnZSk7fQpzZWxlY3REYXRhYmFzZShkYXRhYmFzZSl7aWYoZGF0YWJhc2Upe3RoaXMuX3Nob3dEYXRhYmFzZShkYXRhYmFzZSk7dGhpcy5fZGF0YWJhc2VUcmVlRWxlbWVudHMuZ2V0KGRhdGFiYXNlKS5zZWxlY3QoKTt9fQphc3luYyBzaG93UmVzb3VyY2UocmVzb3VyY2UsbGluZSxjb2x1bW4pe2F3YWl0IHRoaXMuX3Jlc291cmNlc1NlY3Rpb24ucmV2ZWFsUmVzb3VyY2UocmVzb3VyY2UsbGluZSxjb2x1bW4pO30KX3Nob3dEYXRhYmFzZShkYXRhYmFzZSx0YWJsZU5hbWUpe2lmKCFkYXRhYmFzZSkKcmV0dXJuO2xldCB2aWV3O2lmKHRhYmxlTmFtZSl7bGV0IHRhYmxlVmlld3M9dGhpcy5fZGF0YWJhc2VUYWJsZVZpZXdzLmdldChkYXRhYmFzZSk7aWYoIXRhYmxlVmlld3Mpe3RhYmxlVmlld3M9KHt9KTt0aGlzLl9kYXRhYmFzZVRhYmxlVmlld3Muc2V0KGRhdGFiYXNlLHRhYmxlVmlld3MpO30Kdmlldz10YWJsZVZpZXdzW3RhYmxlTmFtZV07aWYoIXZpZXcpe3ZpZXc9bmV3IFJlc291cmNlcy5EYXRhYmFzZVRhYmxlVmlldyhkYXRhYmFzZSx0YWJsZU5hbWUpO3RhYmxlVmlld3NbdGFibGVOYW1lXT12aWV3O319ZWxzZXt2aWV3PXRoaXMuX2RhdGFiYXNlUXVlcnlWaWV3cy5nZXQoZGF0YWJhc2UpO2lmKCF2aWV3KXt2aWV3PW5ldyBSZXNvdXJjZXMuRGF0YWJhc2VRdWVyeVZpZXcoZGF0YWJhc2UpO3RoaXMuX2RhdGFiYXNlUXVlcnlWaWV3cy5zZXQoZGF0YWJhc2Usdmlldyk7dmlldy5hZGRFdmVudExpc3RlbmVyKFJlc291cmNlcy5EYXRhYmFzZVF1ZXJ5Vmlldy5FdmVudHMuU2NoZW1hVXBkYXRlZCx0aGlzLl91cGRhdGVEYXRhYmFzZVRhYmxlcyx0aGlzKTt9fQp0aGlzLl9pbm5lclNob3dWaWV3KHZpZXcpO30KX3Nob3dBcHBsaWNhdGlvbkNhY2hlKGZyYW1lSWQpe2lmKCF0aGlzLl9hcHBsaWNhdGlvbkNhY2hlVmlld3NbZnJhbWVJZF0pe3RoaXMuX2FwcGxpY2F0aW9uQ2FjaGVWaWV3c1tmcmFtZUlkXT1uZXcgUmVzb3VyY2VzLkFwcGxpY2F0aW9uQ2FjaGVJdGVtc1ZpZXcodGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLGZyYW1lSWQpO30KdGhpcy5faW5uZXJTaG93Vmlldyh0aGlzLl9hcHBsaWNhdGlvbkNhY2hlVmlld3NbZnJhbWVJZF0pO30Kc2hvd0ZpbGVTeXN0ZW0odmlldyl7dGhpcy5faW5uZXJTaG93Vmlldyh2aWV3KTt9Cl9pbm5lclNob3dWaWV3KHZpZXcpe3RoaXMuX3BhbmVsLnNob3dWaWV3KHZpZXcpO30KX3VwZGF0ZURhdGFiYXNlVGFibGVzKGV2ZW50KXtjb25zdCBkYXRhYmFzZT1ldmVudC5kYXRhO2lmKCFkYXRhYmFzZSkKcmV0dXJuO2NvbnN0IGRhdGFiYXNlc1RyZWVFbGVtZW50PXRoaXMuX2RhdGFiYXNlVHJlZUVsZW1lbnRzLmdldChkYXRhYmFzZSk7aWYoIWRhdGFiYXNlc1RyZWVFbGVtZW50KQpyZXR1cm47ZGF0YWJhc2VzVHJlZUVsZW1lbnQuaW52YWxpZGF0ZUNoaWxkcmVuKCk7Y29uc3QgdGFibGVWaWV3cz10aGlzLl9kYXRhYmFzZVRhYmxlVmlld3MuZ2V0KGRhdGFiYXNlKTtpZighdGFibGVWaWV3cykKcmV0dXJuO2NvbnN0IHRhYmxlTmFtZXNIYXNoPXt9O2NvbnN0IHBhbmVsPXRoaXMuX3BhbmVsO2Z1bmN0aW9uIHRhYmxlTmFtZXNDYWxsYmFjayh0YWJsZU5hbWVzKXtjb25zdCB0YWJsZU5hbWVzTGVuZ3RoPXRhYmxlTmFtZXMubGVuZ3RoO2ZvcihsZXQgaT0wO2k8dGFibGVOYW1lc0xlbmd0aDsrK2kpCnRhYmxlTmFtZXNIYXNoW3RhYmxlTmFtZXNbaV1dPXRydWU7Zm9yKGNvbnN0IHRhYmxlTmFtZSBpbiB0YWJsZVZpZXdzKXtpZighKHRhYmxlTmFtZSBpbiB0YWJsZU5hbWVzSGFzaCkpe2lmKHBhbmVsLnZpc2libGVWaWV3PT09dGFibGVWaWV3c1t0YWJsZU5hbWVdKQpwYW5lbC5zaG93VmlldyhudWxsKTtkZWxldGUgdGFibGVWaWV3c1t0YWJsZU5hbWVdO319fQpkYXRhYmFzZS5nZXRUYWJsZU5hbWVzKHRhYmxlTmFtZXNDYWxsYmFjayk7fQpfcG9wdWxhdGVBcHBsaWNhdGlvbkNhY2hlVHJlZShyZXNvdXJjZVRyZWVNb2RlbCl7dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsPXRoaXMuX3RhcmdldC5tb2RlbChSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZU1vZGVsKTt0aGlzLl9hcHBsaWNhdGlvbkNhY2hlVmlld3M9e307dGhpcy5fYXBwbGljYXRpb25DYWNoZUZyYW1lRWxlbWVudHM9e307dGhpcy5fYXBwbGljYXRpb25DYWNoZU1hbmlmZXN0RWxlbWVudHM9e307dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkFwcGxpY2F0aW9uQ2FjaGVNb2RlbC5FdmVudHMuRnJhbWVNYW5pZmVzdEFkZGVkLHRoaXMuX2FwcGxpY2F0aW9uQ2FjaGVGcmFtZU1hbmlmZXN0QWRkZWQsdGhpcyk7dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkFwcGxpY2F0aW9uQ2FjaGVNb2RlbC5FdmVudHMuRnJhbWVNYW5pZmVzdFJlbW92ZWQsdGhpcy5fYXBwbGljYXRpb25DYWNoZUZyYW1lTWFuaWZlc3RSZW1vdmVkLHRoaXMpO3RoaXMuX2FwcGxpY2F0aW9uQ2FjaGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTW9kZWwuRXZlbnRzLkZyYW1lTWFuaWZlc3RzUmVzZXQsdGhpcy5fcmVzZXRBcHBDYWNoZSx0aGlzKTt0aGlzLl9hcHBsaWNhdGlvbkNhY2hlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZU1vZGVsLkV2ZW50cy5GcmFtZU1hbmlmZXN0U3RhdHVzVXBkYXRlZCx0aGlzLl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVNYW5pZmVzdFN0YXR1c0NoYW5nZWQsdGhpcyk7dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoUmVzb3VyY2VzLkFwcGxpY2F0aW9uQ2FjaGVNb2RlbC5FdmVudHMuTmV0d29ya1N0YXRlQ2hhbmdlZCx0aGlzLl9hcHBsaWNhdGlvbkNhY2hlTmV0d29ya1N0YXRlQ2hhbmdlZCx0aGlzKTt9Cl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVNYW5pZmVzdEFkZGVkKGV2ZW50KXtjb25zdCBmcmFtZUlkPWV2ZW50LmRhdGE7Y29uc3QgbWFuaWZlc3RVUkw9dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLmZyYW1lTWFuaWZlc3RVUkwoZnJhbWVJZCk7bGV0IG1hbmlmZXN0VHJlZUVsZW1lbnQ9dGhpcy5fYXBwbGljYXRpb25DYWNoZU1hbmlmZXN0RWxlbWVudHNbbWFuaWZlc3RVUkxdO2lmKCFtYW5pZmVzdFRyZWVFbGVtZW50KXttYW5pZmVzdFRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuQXBwbGljYXRpb25DYWNoZU1hbmlmZXN0VHJlZUVsZW1lbnQodGhpcy5fcGFuZWwsbWFuaWZlc3RVUkwpO3RoaXMuYXBwbGljYXRpb25DYWNoZUxpc3RUcmVlRWxlbWVudC5hcHBlbmRDaGlsZChtYW5pZmVzdFRyZWVFbGVtZW50KTt0aGlzLl9hcHBsaWNhdGlvbkNhY2hlTWFuaWZlc3RFbGVtZW50c1ttYW5pZmVzdFVSTF09bWFuaWZlc3RUcmVlRWxlbWVudDt9CmNvbnN0IG1vZGVsPXRoaXMuX3RhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2NvbnN0IGZyYW1lVHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlRnJhbWVUcmVlRWxlbWVudCh0aGlzLG1vZGVsLmZyYW1lRm9ySWQoZnJhbWVJZCksbWFuaWZlc3RVUkwpO21hbmlmZXN0VHJlZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhbWVUcmVlRWxlbWVudCk7bWFuaWZlc3RUcmVlRWxlbWVudC5leHBhbmQoKTt0aGlzLl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVFbGVtZW50c1tmcmFtZUlkXT1mcmFtZVRyZWVFbGVtZW50O30KX2FwcGxpY2F0aW9uQ2FjaGVGcmFtZU1hbmlmZXN0UmVtb3ZlZChldmVudCl7Y29uc3QgZnJhbWVJZD1ldmVudC5kYXRhO2NvbnN0IGZyYW1lVHJlZUVsZW1lbnQ9dGhpcy5fYXBwbGljYXRpb25DYWNoZUZyYW1lRWxlbWVudHNbZnJhbWVJZF07aWYoIWZyYW1lVHJlZUVsZW1lbnQpCnJldHVybjtjb25zdCBtYW5pZmVzdFVSTD1mcmFtZVRyZWVFbGVtZW50Lm1hbmlmZXN0VVJMO2RlbGV0ZSB0aGlzLl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVFbGVtZW50c1tmcmFtZUlkXTtkZWxldGUgdGhpcy5fYXBwbGljYXRpb25DYWNoZVZpZXdzW2ZyYW1lSWRdO2ZyYW1lVHJlZUVsZW1lbnQucGFyZW50LnJlbW92ZUNoaWxkKGZyYW1lVHJlZUVsZW1lbnQpO2NvbnN0IG1hbmlmZXN0VHJlZUVsZW1lbnQ9dGhpcy5fYXBwbGljYXRpb25DYWNoZU1hbmlmZXN0RWxlbWVudHNbbWFuaWZlc3RVUkxdO2lmKG1hbmlmZXN0VHJlZUVsZW1lbnQuY2hpbGRDb3VudCgpKQpyZXR1cm47ZGVsZXRlIHRoaXMuX2FwcGxpY2F0aW9uQ2FjaGVNYW5pZmVzdEVsZW1lbnRzW21hbmlmZXN0VVJMXTttYW5pZmVzdFRyZWVFbGVtZW50LnBhcmVudC5yZW1vdmVDaGlsZChtYW5pZmVzdFRyZWVFbGVtZW50KTt9Cl9hcHBsaWNhdGlvbkNhY2hlRnJhbWVNYW5pZmVzdFN0YXR1c0NoYW5nZWQoZXZlbnQpe2NvbnN0IGZyYW1lSWQ9ZXZlbnQuZGF0YTtjb25zdCBzdGF0dXM9dGhpcy5fYXBwbGljYXRpb25DYWNoZU1vZGVsLmZyYW1lTWFuaWZlc3RTdGF0dXMoZnJhbWVJZCk7aWYodGhpcy5fYXBwbGljYXRpb25DYWNoZVZpZXdzW2ZyYW1lSWRdKQp0aGlzLl9hcHBsaWNhdGlvbkNhY2hlVmlld3NbZnJhbWVJZF0udXBkYXRlU3RhdHVzKHN0YXR1cyk7fQpfYXBwbGljYXRpb25DYWNoZU5ldHdvcmtTdGF0ZUNoYW5nZWQoZXZlbnQpe2NvbnN0IGlzTm93T25saW5lPWV2ZW50LmRhdGE7Zm9yKGNvbnN0IG1hbmlmZXN0VVJMIGluIHRoaXMuX2FwcGxpY2F0aW9uQ2FjaGVWaWV3cykKdGhpcy5fYXBwbGljYXRpb25DYWNoZVZpZXdzW21hbmlmZXN0VVJMXS51cGRhdGVOZXR3b3JrU3RhdGUoaXNOb3dPbmxpbmUpO30Kc2hvd1ZpZXcodmlldyl7aWYodmlldykKdGhpcy5zaG93UmVzb3VyY2Uodmlldy5yZXNvdXJjZSk7fQpfb25tb3VzZW1vdmUoZXZlbnQpe2NvbnN0IG5vZGVVbmRlck1vdXNlPWV2ZW50LnRhcmdldDtpZighbm9kZVVuZGVyTW91c2UpCnJldHVybjtjb25zdCBsaXN0Tm9kZT1ub2RlVW5kZXJNb3VzZS5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aE5vZGVOYW1lKCdsaScpO2lmKCFsaXN0Tm9kZSkKcmV0dXJuO2NvbnN0IGVsZW1lbnQ9bGlzdE5vZGUudHJlZUVsZW1lbnQ7aWYodGhpcy5fcHJldmlvdXNIb3ZlcmVkRWxlbWVudD09PWVsZW1lbnQpCnJldHVybjtpZih0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50KXt0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50LmhvdmVyZWQ9ZmFsc2U7ZGVsZXRlIHRoaXMuX3ByZXZpb3VzSG92ZXJlZEVsZW1lbnQ7fQppZihlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VzLkZyYW1lVHJlZUVsZW1lbnQpe3RoaXMuX3ByZXZpb3VzSG92ZXJlZEVsZW1lbnQ9ZWxlbWVudDtlbGVtZW50LmhvdmVyZWQ9dHJ1ZTt9fQpfb25tb3VzZWxlYXZlKGV2ZW50KXtpZih0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50KXt0aGlzLl9wcmV2aW91c0hvdmVyZWRFbGVtZW50LmhvdmVyZWQ9ZmFsc2U7ZGVsZXRlIHRoaXMuX3ByZXZpb3VzSG92ZXJlZEVsZW1lbnQ7fX19O1Jlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Ioc3RvcmFnZVBhbmVsLHRpdGxlLGV4cGFuZGFibGUpe3N1cGVyKHRpdGxlLGV4cGFuZGFibGUpO3RoaXMuX3N0b3JhZ2VQYW5lbD1zdG9yYWdlUGFuZWw7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7aWYoIXNlbGVjdGVkQnlVc2VyKQpyZXR1cm4gZmFsc2U7Y29uc3QgcGF0aD1bXTtmb3IobGV0IGVsPXRoaXM7ZWw7ZWw9ZWwucGFyZW50KXtjb25zdCB1cmw9ZWwuaXRlbVVSTDtpZighdXJsKQpicmVhaztwYXRoLnB1c2godXJsKTt9CnRoaXMuX3N0b3JhZ2VQYW5lbC5zZXRMYXN0U2VsZWN0ZWRJdGVtUGF0aChwYXRoKTtyZXR1cm4gZmFsc2U7fQpzaG93Vmlldyh2aWV3KXt0aGlzLl9zdG9yYWdlUGFuZWwuc2hvd1ZpZXcodmlldyk7fX07UmVzb3VyY2VzLlN0b3JhZ2VDYXRlZ29yeVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgUmVzb3VyY2VzLkJhc2VTdG9yYWdlVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Ioc3RvcmFnZVBhbmVsLGNhdGVnb3J5TmFtZSxzZXR0aW5nc0tleSl7c3VwZXIoc3RvcmFnZVBhbmVsLGNhdGVnb3J5TmFtZSxmYWxzZSk7dGhpcy5fZXhwYW5kZWRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdyZXNvdXJjZXMnK3NldHRpbmdzS2V5KydFeHBhbmRlZCcsc2V0dGluZ3NLZXk9PT0nRnJhbWVzJyk7dGhpcy5fY2F0ZWdvcnlOYW1lPWNhdGVnb3J5TmFtZTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2NhdGVnb3J5Oi8vJyt0aGlzLl9jYXRlZ29yeU5hbWU7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7c3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO3RoaXMuX3N0b3JhZ2VQYW5lbC5zaG93Q2F0ZWdvcnlWaWV3KHRoaXMuX2NhdGVnb3J5TmFtZSk7cmV0dXJuIGZhbHNlO30Kb25hdHRhY2goKXtzdXBlci5vbmF0dGFjaCgpO2lmKHRoaXMuX2V4cGFuZGVkU2V0dGluZy5nZXQoKSkKdGhpcy5leHBhbmQoKTt9Cm9uZXhwYW5kKCl7dGhpcy5fZXhwYW5kZWRTZXR0aW5nLnNldCh0cnVlKTt9Cm9uY29sbGFwc2UoKXt0aGlzLl9leHBhbmRlZFNldHRpbmcuc2V0KGZhbHNlKTt9fTtSZXNvdXJjZXMuRGF0YWJhc2VUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHNpZGViYXIsZGF0YWJhc2Upe3N1cGVyKHNpZGViYXIuX3BhbmVsLGRhdGFiYXNlLm5hbWUsdHJ1ZSk7dGhpcy5fc2lkZWJhcj1zaWRlYmFyO3RoaXMuX2RhdGFiYXNlPWRhdGFiYXNlO2NvbnN0IGljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tZGF0YWJhc2UnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLnNldExlYWRpbmdJY29ucyhbaWNvbl0pO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4nZGF0YWJhc2U6Ly8nK2VuY29kZVVSSSh0aGlzLl9kYXRhYmFzZS5uYW1lKTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7dGhpcy5fc2lkZWJhci5fc2hvd0RhdGFiYXNlKHRoaXMuX2RhdGFiYXNlKTtyZXR1cm4gZmFsc2U7fQpvbmV4cGFuZCgpe3RoaXMuX3VwZGF0ZUNoaWxkcmVuKCk7fQphc3luYyBfdXBkYXRlQ2hpbGRyZW4oKXtjb25zdCB0YWJsZU5hbWVzPWF3YWl0IHRoaXMuX2RhdGFiYXNlLnRhYmxlTmFtZXMoKTtmb3IoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlTmFtZXMpCnRoaXMuYXBwZW5kQ2hpbGQobmV3IFJlc291cmNlcy5EYXRhYmFzZVRhYmxlVHJlZUVsZW1lbnQodGhpcy5fc2lkZWJhcix0aGlzLl9kYXRhYmFzZSx0YWJsZU5hbWUpKTt9fTtSZXNvdXJjZXMuRGF0YWJhc2VUYWJsZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgUmVzb3VyY2VzLkJhc2VTdG9yYWdlVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Ioc2lkZWJhcixkYXRhYmFzZSx0YWJsZU5hbWUpe3N1cGVyKHNpZGViYXIuX3BhbmVsLHRhYmxlTmFtZSxmYWxzZSk7dGhpcy5fc2lkZWJhcj1zaWRlYmFyO3RoaXMuX2RhdGFiYXNlPWRhdGFiYXNlO3RoaXMuX3RhYmxlTmFtZT10YWJsZU5hbWU7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi10YWJsZScsJ3Jlc291cmNlLXRyZWUtaXRlbScpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtpY29uXSk7fQpnZXQgaXRlbVVSTCgpe3JldHVybidkYXRhYmFzZTovLycrZW5jb2RlVVJJKHRoaXMuX2RhdGFiYXNlLm5hbWUpKycvJytlbmNvZGVVUkkodGhpcy5fdGFibGVOYW1lKTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7dGhpcy5fc2lkZWJhci5fc2hvd0RhdGFiYXNlKHRoaXMuX2RhdGFiYXNlLHRoaXMuX3RhYmxlTmFtZSk7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5TZXJ2aWNlV29ya2VyQ2FjaGVUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwpe3N1cGVyKHN0b3JhZ2VQYW5lbCxDb21tb24uVUlTdHJpbmcoJ0NhY2hlIFN0b3JhZ2UnKSwnQ2FjaGVTdG9yYWdlJyk7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbWVkaXVtaWNvbi1kYXRhYmFzZScsJ3Jlc291cmNlLXRyZWUtaXRlbScpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtpY29uXSk7dGhpcy5fc3dDYWNoZU1vZGVsPW51bGw7fQpfaW5pdGlhbGl6ZShtb2RlbCl7dGhpcy5fc3dDYWNoZVRyZWVFbGVtZW50cz1bXTt0aGlzLl9zd0NhY2hlTW9kZWw9bW9kZWw7aWYobW9kZWwpe2Zvcihjb25zdCBjYWNoZSBvZiBtb2RlbC5jYWNoZXMoKSkKdGhpcy5fYWRkQ2FjaGUobW9kZWwsY2FjaGUpO30KU0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWwsU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cy5DYWNoZUFkZGVkLHRoaXMuX2NhY2hlQWRkZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuU2VydmljZVdvcmtlckNhY2hlTW9kZWwsU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cy5DYWNoZVJlbW92ZWQsdGhpcy5fY2FjaGVSZW1vdmVkLHRoaXMpO30Kb25hdHRhY2goKXtzdXBlci5vbmF0dGFjaCgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9oYW5kbGVDb250ZXh0TWVudUV2ZW50LmJpbmQodGhpcyksdHJ1ZSk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZWZyZXNoIENhY2hlcycpLHRoaXMuX3JlZnJlc2hDYWNoZXMuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuc2hvdygpO30KX3JlZnJlc2hDYWNoZXMoKXtpZih0aGlzLl9zd0NhY2hlTW9kZWwpCnRoaXMuX3N3Q2FjaGVNb2RlbC5yZWZyZXNoQ2FjaGVOYW1lcygpO30KX2NhY2hlQWRkZWQoZXZlbnQpe2NvbnN0IGNhY2hlPShldmVudC5kYXRhLmNhY2hlKTtjb25zdCBtb2RlbD0oZXZlbnQuZGF0YS5tb2RlbCk7dGhpcy5fYWRkQ2FjaGUobW9kZWwsY2FjaGUpO30KX2FkZENhY2hlKG1vZGVsLGNhY2hlKXtjb25zdCBzd0NhY2hlVHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5TV0NhY2hlVHJlZUVsZW1lbnQodGhpcy5fc3RvcmFnZVBhbmVsLG1vZGVsLGNhY2hlKTt0aGlzLl9zd0NhY2hlVHJlZUVsZW1lbnRzLnB1c2goc3dDYWNoZVRyZWVFbGVtZW50KTt0aGlzLmFwcGVuZENoaWxkKHN3Q2FjaGVUcmVlRWxlbWVudCk7fQpfY2FjaGVSZW1vdmVkKGV2ZW50KXtjb25zdCBjYWNoZT0oZXZlbnQuZGF0YS5jYWNoZSk7Y29uc3QgbW9kZWw9KGV2ZW50LmRhdGEubW9kZWwpO2NvbnN0IHN3Q2FjaGVUcmVlRWxlbWVudD10aGlzLl9jYWNoZVRyZWVFbGVtZW50KG1vZGVsLGNhY2hlKTtpZighc3dDYWNoZVRyZWVFbGVtZW50KQpyZXR1cm47dGhpcy5yZW1vdmVDaGlsZChzd0NhY2hlVHJlZUVsZW1lbnQpO3RoaXMuX3N3Q2FjaGVUcmVlRWxlbWVudHMucmVtb3ZlKHN3Q2FjaGVUcmVlRWxlbWVudCk7dGhpcy5zZXRFeHBhbmRhYmxlKHRoaXMuY2hpbGRDb3VudCgpPjApO30KX2NhY2hlVHJlZUVsZW1lbnQobW9kZWwsY2FjaGUpe2xldCBpbmRleD0tMTtsZXQgaTtmb3IoaT0wO2k8dGhpcy5fc3dDYWNoZVRyZWVFbGVtZW50cy5sZW5ndGg7KytpKXtpZih0aGlzLl9zd0NhY2hlVHJlZUVsZW1lbnRzW2ldLl9jYWNoZS5lcXVhbHMoY2FjaGUpJiZ0aGlzLl9zd0NhY2hlVHJlZUVsZW1lbnRzW2ldLl9tb2RlbD09PW1vZGVsKXtpbmRleD1pO2JyZWFrO319CmlmKGluZGV4IT09LTEpCnJldHVybiB0aGlzLl9zd0NhY2hlVHJlZUVsZW1lbnRzW2ldO3JldHVybiBudWxsO319O1Jlc291cmNlcy5TV0NhY2hlVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuQmFzZVN0b3JhZ2VUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwsbW9kZWwsY2FjaGUpe3N1cGVyKHN0b3JhZ2VQYW5lbCxjYWNoZS5jYWNoZU5hbWUrJyAtICcrY2FjaGUuc2VjdXJpdHlPcmlnaW4sZmFsc2UpO3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX2NhY2hlPWNhY2hlO3RoaXMuX3ZpZXc9bnVsbDtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLXRhYmxlJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2NhY2hlOi8vJyt0aGlzLl9jYWNoZS5jYWNoZUlkO30Kb25hdHRhY2goKXtzdXBlci5vbmF0dGFjaCgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLl9oYW5kbGVDb250ZXh0TWVudUV2ZW50LmJpbmQodGhpcyksdHJ1ZSk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdEZWxldGUnKSx0aGlzLl9jbGVhckNhY2hlLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9jbGVhckNhY2hlKCl7dGhpcy5fbW9kZWwuZGVsZXRlQ2FjaGUodGhpcy5fY2FjaGUpO30KdXBkYXRlKGNhY2hlKXt0aGlzLl9jYWNoZT1jYWNoZTtpZih0aGlzLl92aWV3KQp0aGlzLl92aWV3LnVwZGF0ZShjYWNoZSk7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7c3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO2lmKCF0aGlzLl92aWV3KQp0aGlzLl92aWV3PW5ldyBSZXNvdXJjZXMuU2VydmljZVdvcmtlckNhY2hlVmlldyh0aGlzLl9tb2RlbCx0aGlzLl9jYWNoZSk7dGhpcy5zaG93Vmlldyh0aGlzLl92aWV3KTtyZXR1cm4gZmFsc2U7fX07UmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJzVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuQmFzZVN0b3JhZ2VUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwpe3N1cGVyKHN0b3JhZ2VQYW5lbCxDb21tb24uVUlTdHJpbmcoJ1NlcnZpY2UgV29ya2VycycpLGZhbHNlKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLXNlcnZpY2Utd29ya2VyJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ3NlcnZpY2Utd29ya2VyczovLyc7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7c3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO2lmKCF0aGlzLl92aWV3KQp0aGlzLl92aWV3PW5ldyBSZXNvdXJjZXMuU2VydmljZVdvcmtlcnNWaWV3KCk7dGhpcy5zaG93Vmlldyh0aGlzLl92aWV3KTtyZXR1cm4gZmFsc2U7fX07UmVzb3VyY2VzLkFwcE1hbmlmZXN0VHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuQmFzZVN0b3JhZ2VUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwpe3N1cGVyKHN0b3JhZ2VQYW5lbCxDb21tb24uVUlTdHJpbmcoJ01hbmlmZXN0JyksZmFsc2UpO2NvbnN0IGljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tbWFuaWZlc3QnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLnNldExlYWRpbmdJY29ucyhbaWNvbl0pO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4nbWFuaWZlc3Q6Ly8nO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3N1cGVyLm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKTtpZighdGhpcy5fdmlldykKdGhpcy5fdmlldz1uZXcgUmVzb3VyY2VzLkFwcE1hbmlmZXN0VmlldygpO3RoaXMuc2hvd1ZpZXcodGhpcy5fdmlldyk7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5DbGVhclN0b3JhZ2VUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCl7c3VwZXIoc3RvcmFnZVBhbmVsLENvbW1vbi5VSVN0cmluZygnQ2xlYXIgc3RvcmFnZScpLGZhbHNlKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLWNsZWFyLXN0b3JhZ2UnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLnNldExlYWRpbmdJY29ucyhbaWNvbl0pO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4nY2xlYXItc3RvcmFnZTovLyc7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7c3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO2lmKCF0aGlzLl92aWV3KQp0aGlzLl92aWV3PW5ldyBSZXNvdXJjZXMuQ2xlYXJTdG9yYWdlVmlldygpO3RoaXMuc2hvd1ZpZXcodGhpcy5fdmlldyk7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5JbmRleGVkREJUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwpe3N1cGVyKHN0b3JhZ2VQYW5lbCxDb21tb24uVUlTdHJpbmcoJ0luZGV4ZWREQicpLCdJbmRleGVkREInKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLWRhdGFiYXNlJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9Cl9pbml0aWFsaXplKCl7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwsUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cy5EYXRhYmFzZUFkZGVkLHRoaXMuX2luZGV4ZWREQkFkZGVkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5FdmVudHMuRGF0YWJhc2VSZW1vdmVkLHRoaXMuX2luZGV4ZWREQlJlbW92ZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwsUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cy5EYXRhYmFzZUxvYWRlZCx0aGlzLl9pbmRleGVkREJMb2FkZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihSZXNvdXJjZXMuSW5kZXhlZERCTW9kZWwsUmVzb3VyY2VzLkluZGV4ZWREQk1vZGVsLkV2ZW50cy5JbmRleGVkREJDb250ZW50VXBkYXRlZCx0aGlzLl9pbmRleGVkREJDb250ZW50VXBkYXRlZCx0aGlzKTt0aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50cz1bXTtmb3IoY29uc3QgaW5kZXhlZERCTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFJlc291cmNlcy5JbmRleGVkREJNb2RlbCkpe2NvbnN0IGRhdGFiYXNlcz1pbmRleGVkREJNb2RlbC5kYXRhYmFzZXMoKTtmb3IobGV0IGo9MDtqPGRhdGFiYXNlcy5sZW5ndGg7KytqKQp0aGlzLl9hZGRJbmRleGVkREIoaW5kZXhlZERCTW9kZWwsZGF0YWJhc2VzW2pdKTt9fQpvbmF0dGFjaCgpe3N1cGVyLm9uYXR0YWNoKCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXZlbnQuYmluZCh0aGlzKSx0cnVlKTt9Cl9oYW5kbGVDb250ZXh0TWVudUV2ZW50KGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlZnJlc2ggSW5kZXhlZERCJyksdGhpcy5yZWZyZXNoSW5kZXhlZERCLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9CnJlZnJlc2hJbmRleGVkREIoKXtmb3IoY29uc3QgaW5kZXhlZERCTW9kZWwgb2YgU0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFJlc291cmNlcy5JbmRleGVkREJNb2RlbCkpCmluZGV4ZWREQk1vZGVsLnJlZnJlc2hEYXRhYmFzZU5hbWVzKCk7fQpfaW5kZXhlZERCQWRkZWQoZXZlbnQpe2NvbnN0IGRhdGFiYXNlSWQ9KGV2ZW50LmRhdGEuZGF0YWJhc2VJZCk7Y29uc3QgbW9kZWw9KGV2ZW50LmRhdGEubW9kZWwpO3RoaXMuX2FkZEluZGV4ZWREQihtb2RlbCxkYXRhYmFzZUlkKTt9Cl9hZGRJbmRleGVkREIobW9kZWwsZGF0YWJhc2VJZCl7Y29uc3QgaWRiRGF0YWJhc2VUcmVlRWxlbWVudD1uZXcgUmVzb3VyY2VzLklEQkRhdGFiYXNlVHJlZUVsZW1lbnQodGhpcy5fc3RvcmFnZVBhbmVsLG1vZGVsLGRhdGFiYXNlSWQpO3RoaXMuX2lkYkRhdGFiYXNlVHJlZUVsZW1lbnRzLnB1c2goaWRiRGF0YWJhc2VUcmVlRWxlbWVudCk7dGhpcy5hcHBlbmRDaGlsZChpZGJEYXRhYmFzZVRyZWVFbGVtZW50KTttb2RlbC5yZWZyZXNoRGF0YWJhc2UoZGF0YWJhc2VJZCk7fQpfaW5kZXhlZERCUmVtb3ZlZChldmVudCl7Y29uc3QgZGF0YWJhc2VJZD0oZXZlbnQuZGF0YS5kYXRhYmFzZUlkKTtjb25zdCBtb2RlbD0oZXZlbnQuZGF0YS5tb2RlbCk7Y29uc3QgaWRiRGF0YWJhc2VUcmVlRWxlbWVudD10aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50KG1vZGVsLGRhdGFiYXNlSWQpO2lmKCFpZGJEYXRhYmFzZVRyZWVFbGVtZW50KQpyZXR1cm47aWRiRGF0YWJhc2VUcmVlRWxlbWVudC5jbGVhcigpO3RoaXMucmVtb3ZlQ2hpbGQoaWRiRGF0YWJhc2VUcmVlRWxlbWVudCk7dGhpcy5faWRiRGF0YWJhc2VUcmVlRWxlbWVudHMucmVtb3ZlKGlkYkRhdGFiYXNlVHJlZUVsZW1lbnQpO3RoaXMuc2V0RXhwYW5kYWJsZSh0aGlzLmNoaWxkQ291bnQoKT4wKTt9Cl9pbmRleGVkREJMb2FkZWQoZXZlbnQpe2NvbnN0IGRhdGFiYXNlPShldmVudC5kYXRhLmRhdGFiYXNlKTtjb25zdCBtb2RlbD0oZXZlbnQuZGF0YS5tb2RlbCk7Y29uc3QgZW50cmllc1VwZGF0ZWQ9KGV2ZW50LmRhdGEuZW50cmllc1VwZGF0ZWQpO2NvbnN0IGlkYkRhdGFiYXNlVHJlZUVsZW1lbnQ9dGhpcy5faWRiRGF0YWJhc2VUcmVlRWxlbWVudChtb2RlbCxkYXRhYmFzZS5kYXRhYmFzZUlkKTtpZighaWRiRGF0YWJhc2VUcmVlRWxlbWVudCkKcmV0dXJuO2lkYkRhdGFiYXNlVHJlZUVsZW1lbnQudXBkYXRlKGRhdGFiYXNlLGVudHJpZXNVcGRhdGVkKTt9Cl9pbmRleGVkREJDb250ZW50VXBkYXRlZChldmVudCl7Y29uc3QgZGF0YWJhc2VJZD0oZXZlbnQuZGF0YS5kYXRhYmFzZUlkKTtjb25zdCBvYmplY3RTdG9yZU5hbWU9KGV2ZW50LmRhdGEub2JqZWN0U3RvcmVOYW1lKTtjb25zdCBtb2RlbD0oZXZlbnQuZGF0YS5tb2RlbCk7Y29uc3QgaWRiRGF0YWJhc2VUcmVlRWxlbWVudD10aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50KG1vZGVsLGRhdGFiYXNlSWQpO2lmKCFpZGJEYXRhYmFzZVRyZWVFbGVtZW50KQpyZXR1cm47aWRiRGF0YWJhc2VUcmVlRWxlbWVudC5pbmRleGVkREJDb250ZW50VXBkYXRlZChvYmplY3RTdG9yZU5hbWUpO30KX2lkYkRhdGFiYXNlVHJlZUVsZW1lbnQobW9kZWwsZGF0YWJhc2VJZCl7bGV0IGluZGV4PS0xO2xldCBpO2ZvcihpPTA7aTx0aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50cy5sZW5ndGg7KytpKXtpZih0aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50c1tpXS5fZGF0YWJhc2VJZC5lcXVhbHMoZGF0YWJhc2VJZCkmJnRoaXMuX2lkYkRhdGFiYXNlVHJlZUVsZW1lbnRzW2ldLl9tb2RlbD09PW1vZGVsKXtpbmRleD1pO2JyZWFrO319CmlmKGluZGV4IT09LTEpCnJldHVybiB0aGlzLl9pZGJEYXRhYmFzZVRyZWVFbGVtZW50c1tpXTtyZXR1cm4gbnVsbDt9fTtSZXNvdXJjZXMuSURCRGF0YWJhc2VUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCxtb2RlbCxkYXRhYmFzZUlkKXtzdXBlcihzdG9yYWdlUGFuZWwsZGF0YWJhc2VJZC5uYW1lKycgLSAnK2RhdGFiYXNlSWQuc2VjdXJpdHlPcmlnaW4sZmFsc2UpO3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX2RhdGFiYXNlSWQ9ZGF0YWJhc2VJZDt0aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50cz17fTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLWRhdGFiYXNlJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt0aGlzLl9tb2RlbC5hZGRFdmVudExpc3RlbmVyKFJlc291cmNlcy5JbmRleGVkREJNb2RlbC5FdmVudHMuRGF0YWJhc2VOYW1lc1JlZnJlc2hlZCx0aGlzLl9yZWZyZXNoSW5kZXhlZERCLHRoaXMpO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4naW5kZXhlZERCOi8vJyt0aGlzLl9kYXRhYmFzZUlkLnNlY3VyaXR5T3JpZ2luKycvJyt0aGlzLl9kYXRhYmFzZUlkLm5hbWU7fQpvbmF0dGFjaCgpe3N1cGVyLm9uYXR0YWNoKCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXZlbnQuYmluZCh0aGlzKSx0cnVlKTt9Cl9oYW5kbGVDb250ZXh0TWVudUV2ZW50KGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlZnJlc2ggSW5kZXhlZERCJyksdGhpcy5fcmVmcmVzaEluZGV4ZWREQi5iaW5kKHRoaXMpKTtjb250ZXh0TWVudS5zaG93KCk7fQpfcmVmcmVzaEluZGV4ZWREQigpe3RoaXMuX21vZGVsLnJlZnJlc2hEYXRhYmFzZSh0aGlzLl9kYXRhYmFzZUlkKTt9CmluZGV4ZWREQkNvbnRlbnRVcGRhdGVkKG9iamVjdFN0b3JlTmFtZSl7aWYodGhpcy5faWRiT2JqZWN0U3RvcmVUcmVlRWxlbWVudHNbb2JqZWN0U3RvcmVOYW1lXSkKdGhpcy5faWRiT2JqZWN0U3RvcmVUcmVlRWxlbWVudHNbb2JqZWN0U3RvcmVOYW1lXS5tYXJrTmVlZHNSZWZyZXNoKCk7fQp1cGRhdGUoZGF0YWJhc2UsZW50cmllc1VwZGF0ZWQpe3RoaXMuX2RhdGFiYXNlPWRhdGFiYXNlO2NvbnN0IG9iamVjdFN0b3JlTmFtZXM9e307Zm9yKGNvbnN0IG9iamVjdFN0b3JlTmFtZSBpbiB0aGlzLl9kYXRhYmFzZS5vYmplY3RTdG9yZXMpe2NvbnN0IG9iamVjdFN0b3JlPXRoaXMuX2RhdGFiYXNlLm9iamVjdFN0b3Jlc1tvYmplY3RTdG9yZU5hbWVdO29iamVjdFN0b3JlTmFtZXNbb2JqZWN0U3RvcmUubmFtZV09dHJ1ZTtpZighdGhpcy5faWRiT2JqZWN0U3RvcmVUcmVlRWxlbWVudHNbb2JqZWN0U3RvcmUubmFtZV0pe2NvbnN0IGlkYk9iamVjdFN0b3JlVHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5JREJPYmplY3RTdG9yZVRyZWVFbGVtZW50KHRoaXMuX3N0b3JhZ2VQYW5lbCx0aGlzLl9tb2RlbCx0aGlzLl9kYXRhYmFzZUlkLG9iamVjdFN0b3JlKTt0aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50c1tvYmplY3RTdG9yZS5uYW1lXT1pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50O3RoaXMuYXBwZW5kQ2hpbGQoaWRiT2JqZWN0U3RvcmVUcmVlRWxlbWVudCk7fQp0aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50c1tvYmplY3RTdG9yZS5uYW1lXS51cGRhdGUob2JqZWN0U3RvcmUsZW50cmllc1VwZGF0ZWQpO30KZm9yKGNvbnN0IG9iamVjdFN0b3JlTmFtZSBpbiB0aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50cyl7aWYoIW9iamVjdFN0b3JlTmFtZXNbb2JqZWN0U3RvcmVOYW1lXSkKdGhpcy5fb2JqZWN0U3RvcmVSZW1vdmVkKG9iamVjdFN0b3JlTmFtZSk7fQppZih0aGlzLl92aWV3KQp0aGlzLl92aWV3LnVwZGF0ZShkYXRhYmFzZSk7dGhpcy5fdXBkYXRlVG9vbHRpcCgpO30KX3VwZGF0ZVRvb2x0aXAoKXt0aGlzLnRvb2x0aXA9Q29tbW9uLlVJU3RyaW5nKCdWZXJzaW9uJykrJzogJyt0aGlzLl9kYXRhYmFzZS52ZXJzaW9uO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3N1cGVyLm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKTtpZighdGhpcy5fdmlldykKdGhpcy5fdmlldz1uZXcgUmVzb3VyY2VzLklEQkRhdGFiYXNlVmlldyh0aGlzLl9tb2RlbCx0aGlzLl9kYXRhYmFzZSk7dGhpcy5zaG93Vmlldyh0aGlzLl92aWV3KTtyZXR1cm4gZmFsc2U7fQpfb2JqZWN0U3RvcmVSZW1vdmVkKG9iamVjdFN0b3JlTmFtZSl7Y29uc3Qgb2JqZWN0U3RvcmVUcmVlRWxlbWVudD10aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50c1tvYmplY3RTdG9yZU5hbWVdO29iamVjdFN0b3JlVHJlZUVsZW1lbnQuY2xlYXIoKTt0aGlzLnJlbW92ZUNoaWxkKG9iamVjdFN0b3JlVHJlZUVsZW1lbnQpO2RlbGV0ZSB0aGlzLl9pZGJPYmplY3RTdG9yZVRyZWVFbGVtZW50c1tvYmplY3RTdG9yZU5hbWVdO30KY2xlYXIoKXtmb3IoY29uc3Qgb2JqZWN0U3RvcmVOYW1lIGluIHRoaXMuX2lkYk9iamVjdFN0b3JlVHJlZUVsZW1lbnRzKQp0aGlzLl9vYmplY3RTdG9yZVJlbW92ZWQob2JqZWN0U3RvcmVOYW1lKTt9fTtSZXNvdXJjZXMuSURCT2JqZWN0U3RvcmVUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCxtb2RlbCxkYXRhYmFzZUlkLG9iamVjdFN0b3JlKXtzdXBlcihzdG9yYWdlUGFuZWwsb2JqZWN0U3RvcmUubmFtZSxmYWxzZSk7dGhpcy5fbW9kZWw9bW9kZWw7dGhpcy5fZGF0YWJhc2VJZD1kYXRhYmFzZUlkO3RoaXMuX2lkYkluZGV4VHJlZUVsZW1lbnRzPXt9O3RoaXMuX29iamVjdFN0b3JlPW9iamVjdFN0b3JlO3RoaXMuX3ZpZXc9bnVsbDtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdtZWRpdW1pY29uLXRhYmxlJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2luZGV4ZWREQjovLycrdGhpcy5fZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbisnLycrdGhpcy5fZGF0YWJhc2VJZC5uYW1lKycvJysKdGhpcy5fb2JqZWN0U3RvcmUubmFtZTt9Cm9uYXR0YWNoKCl7c3VwZXIub25hdHRhY2goKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLHRydWUpO30KbWFya05lZWRzUmVmcmVzaCgpe2lmKHRoaXMuX3ZpZXcpCnRoaXMuX3ZpZXcubWFya05lZWRzUmVmcmVzaCgpO2Zvcihjb25zdCBpbmRleE5hbWUgaW4gdGhpcy5faWRiSW5kZXhUcmVlRWxlbWVudHMpCnRoaXMuX2lkYkluZGV4VHJlZUVsZW1lbnRzW2luZGV4TmFtZV0ubWFya05lZWRzUmVmcmVzaCgpO30KX2hhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xlYXInKSx0aGlzLl9jbGVhck9iamVjdFN0b3JlLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9yZWZyZXNoT2JqZWN0U3RvcmUoKXtpZih0aGlzLl92aWV3KQp0aGlzLl92aWV3LnJlZnJlc2hEYXRhKCk7Zm9yKGNvbnN0IGluZGV4TmFtZSBpbiB0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50cykKdGhpcy5faWRiSW5kZXhUcmVlRWxlbWVudHNbaW5kZXhOYW1lXS5yZWZyZXNoSW5kZXgoKTt9CmFzeW5jIF9jbGVhck9iamVjdFN0b3JlKCl7YXdhaXQgdGhpcy5fbW9kZWwuY2xlYXJPYmplY3RTdG9yZSh0aGlzLl9kYXRhYmFzZUlkLHRoaXMuX29iamVjdFN0b3JlLm5hbWUpO3RoaXMudXBkYXRlKHRoaXMuX29iamVjdFN0b3JlLHRydWUpO30KdXBkYXRlKG9iamVjdFN0b3JlLGVudHJpZXNVcGRhdGVkKXt0aGlzLl9vYmplY3RTdG9yZT1vYmplY3RTdG9yZTtjb25zdCBpbmRleE5hbWVzPXt9O2Zvcihjb25zdCBpbmRleE5hbWUgaW4gdGhpcy5fb2JqZWN0U3RvcmUuaW5kZXhlcyl7Y29uc3QgaW5kZXg9dGhpcy5fb2JqZWN0U3RvcmUuaW5kZXhlc1tpbmRleE5hbWVdO2luZGV4TmFtZXNbaW5kZXgubmFtZV09dHJ1ZTtpZighdGhpcy5faWRiSW5kZXhUcmVlRWxlbWVudHNbaW5kZXgubmFtZV0pe2NvbnN0IGlkYkluZGV4VHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5JREJJbmRleFRyZWVFbGVtZW50KHRoaXMuX3N0b3JhZ2VQYW5lbCx0aGlzLl9tb2RlbCx0aGlzLl9kYXRhYmFzZUlkLHRoaXMuX29iamVjdFN0b3JlLGluZGV4LHRoaXMuX3JlZnJlc2hPYmplY3RTdG9yZS5iaW5kKHRoaXMpKTt0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50c1tpbmRleC5uYW1lXT1pZGJJbmRleFRyZWVFbGVtZW50O3RoaXMuYXBwZW5kQ2hpbGQoaWRiSW5kZXhUcmVlRWxlbWVudCk7fQp0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50c1tpbmRleC5uYW1lXS51cGRhdGUodGhpcy5fb2JqZWN0U3RvcmUsaW5kZXgsZW50cmllc1VwZGF0ZWQpO30KZm9yKGNvbnN0IGluZGV4TmFtZSBpbiB0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50cyl7aWYoIWluZGV4TmFtZXNbaW5kZXhOYW1lXSkKdGhpcy5faW5kZXhSZW1vdmVkKGluZGV4TmFtZSk7fQpmb3IoY29uc3QgaW5kZXhOYW1lIGluIHRoaXMuX2lkYkluZGV4VHJlZUVsZW1lbnRzKXtpZighaW5kZXhOYW1lc1tpbmRleE5hbWVdKXt0aGlzLnJlbW92ZUNoaWxkKHRoaXMuX2lkYkluZGV4VHJlZUVsZW1lbnRzW2luZGV4TmFtZV0pO2RlbGV0ZSB0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50c1tpbmRleE5hbWVdO319CmlmKHRoaXMuY2hpbGRDb3VudCgpKQp0aGlzLmV4cGFuZCgpO2lmKHRoaXMuX3ZpZXcmJmVudHJpZXNVcGRhdGVkKQp0aGlzLl92aWV3LnVwZGF0ZSh0aGlzLl9vYmplY3RTdG9yZSxudWxsKTt0aGlzLl91cGRhdGVUb29sdGlwKCk7fQpfdXBkYXRlVG9vbHRpcCgpe2NvbnN0IGtleVBhdGhTdHJpbmc9dGhpcy5fb2JqZWN0U3RvcmUua2V5UGF0aFN0cmluZztsZXQgdG9vbHRpcFN0cmluZz1rZXlQYXRoU3RyaW5nIT09bnVsbD8oQ29tbW9uLlVJU3RyaW5nKCdLZXkgcGF0aDogJykra2V5UGF0aFN0cmluZyk6Jyc7aWYodGhpcy5fb2JqZWN0U3RvcmUuYXV0b0luY3JlbWVudCkKdG9vbHRpcFN0cmluZys9J1xuJytDb21tb24uVUlTdHJpbmcoJ2F1dG9JbmNyZW1lbnQnKTt0aGlzLnRvb2x0aXA9dG9vbHRpcFN0cmluZzt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7aWYoIXRoaXMuX3ZpZXcpe3RoaXMuX3ZpZXc9bmV3IFJlc291cmNlcy5JREJEYXRhVmlldyh0aGlzLl9tb2RlbCx0aGlzLl9kYXRhYmFzZUlkLHRoaXMuX29iamVjdFN0b3JlLG51bGwsdGhpcy5fcmVmcmVzaE9iamVjdFN0b3JlLmJpbmQodGhpcykpO30KdGhpcy5zaG93Vmlldyh0aGlzLl92aWV3KTtyZXR1cm4gZmFsc2U7fQpfaW5kZXhSZW1vdmVkKGluZGV4TmFtZSl7Y29uc3QgaW5kZXhUcmVlRWxlbWVudD10aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50c1tpbmRleE5hbWVdO2luZGV4VHJlZUVsZW1lbnQuY2xlYXIoKTt0aGlzLnJlbW92ZUNoaWxkKGluZGV4VHJlZUVsZW1lbnQpO2RlbGV0ZSB0aGlzLl9pZGJJbmRleFRyZWVFbGVtZW50c1tpbmRleE5hbWVdO30KY2xlYXIoKXtmb3IoY29uc3QgaW5kZXhOYW1lIGluIHRoaXMuX2lkYkluZGV4VHJlZUVsZW1lbnRzKQp0aGlzLl9pbmRleFJlbW92ZWQoaW5kZXhOYW1lKTtpZih0aGlzLl92aWV3KQp0aGlzLl92aWV3LmNsZWFyKCk7fX07UmVzb3VyY2VzLklEQkluZGV4VHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuQmFzZVN0b3JhZ2VUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwsbW9kZWwsZGF0YWJhc2VJZCxvYmplY3RTdG9yZSxpbmRleCxyZWZyZXNoT2JqZWN0U3RvcmUpe3N1cGVyKHN0b3JhZ2VQYW5lbCxpbmRleC5uYW1lLGZhbHNlKTt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9kYXRhYmFzZUlkPWRhdGFiYXNlSWQ7dGhpcy5fb2JqZWN0U3RvcmU9b2JqZWN0U3RvcmU7dGhpcy5faW5kZXg9aW5kZXg7dGhpcy5fcmVmcmVzaE9iamVjdFN0b3JlPXJlZnJlc2hPYmplY3RTdG9yZTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2luZGV4ZWREQjovLycrdGhpcy5fZGF0YWJhc2VJZC5zZWN1cml0eU9yaWdpbisnLycrdGhpcy5fZGF0YWJhc2VJZC5uYW1lKycvJysKdGhpcy5fb2JqZWN0U3RvcmUubmFtZSsnLycrdGhpcy5faW5kZXgubmFtZTt9Cm1hcmtOZWVkc1JlZnJlc2goKXtpZih0aGlzLl92aWV3KQp0aGlzLl92aWV3Lm1hcmtOZWVkc1JlZnJlc2goKTt9CnJlZnJlc2hJbmRleCgpe2lmKHRoaXMuX3ZpZXcpCnRoaXMuX3ZpZXcucmVmcmVzaERhdGEoKTt9CnVwZGF0ZShvYmplY3RTdG9yZSxpbmRleCxlbnRyaWVzVXBkYXRlZCl7dGhpcy5fb2JqZWN0U3RvcmU9b2JqZWN0U3RvcmU7dGhpcy5faW5kZXg9aW5kZXg7aWYodGhpcy5fdmlldyYmZW50cmllc1VwZGF0ZWQpCnRoaXMuX3ZpZXcudXBkYXRlKHRoaXMuX29iamVjdFN0b3JlLHRoaXMuX2luZGV4KTt0aGlzLl91cGRhdGVUb29sdGlwKCk7fQpfdXBkYXRlVG9vbHRpcCgpe2NvbnN0IHRvb2x0aXBMaW5lcz1bXTtjb25zdCBrZXlQYXRoU3RyaW5nPXRoaXMuX2luZGV4LmtleVBhdGhTdHJpbmc7dG9vbHRpcExpbmVzLnB1c2goQ29tbW9uLlVJU3RyaW5nKCdLZXkgcGF0aDogJykra2V5UGF0aFN0cmluZyk7aWYodGhpcy5faW5kZXgudW5pcXVlKQp0b29sdGlwTGluZXMucHVzaChDb21tb24uVUlTdHJpbmcoJ3VuaXF1ZScpKTtpZih0aGlzLl9pbmRleC5tdWx0aUVudHJ5KQp0b29sdGlwTGluZXMucHVzaChDb21tb24uVUlTdHJpbmcoJ211bHRpRW50cnknKSk7dGhpcy50b29sdGlwPXRvb2x0aXBMaW5lcy5qb2luKCdcbicpO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3N1cGVyLm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKTtpZighdGhpcy5fdmlldyl7dGhpcy5fdmlldz1uZXcgUmVzb3VyY2VzLklEQkRhdGFWaWV3KHRoaXMuX21vZGVsLHRoaXMuX2RhdGFiYXNlSWQsdGhpcy5fb2JqZWN0U3RvcmUsdGhpcy5faW5kZXgsdGhpcy5fcmVmcmVzaE9iamVjdFN0b3JlKTt9CnRoaXMuc2hvd1ZpZXcodGhpcy5fdmlldyk7cmV0dXJuIGZhbHNlO30KY2xlYXIoKXtpZih0aGlzLl92aWV3KQp0aGlzLl92aWV3LmNsZWFyKCk7fX07UmVzb3VyY2VzLkRPTVN0b3JhZ2VUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCxkb21TdG9yYWdlKXtzdXBlcihzdG9yYWdlUGFuZWwsZG9tU3RvcmFnZS5zZWN1cml0eU9yaWdpbj9kb21TdG9yYWdlLnNlY3VyaXR5T3JpZ2luOkNvbW1vbi5VSVN0cmluZygnTG9jYWwgRmlsZXMnKSxmYWxzZSk7dGhpcy5fZG9tU3RvcmFnZT1kb21TdG9yYWdlO2NvbnN0IGljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tdGFibGUnLCdyZXNvdXJjZS10cmVlLWl0ZW0nKTt0aGlzLnNldExlYWRpbmdJY29ucyhbaWNvbl0pO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4nc3RvcmFnZTovLycrdGhpcy5fZG9tU3RvcmFnZS5zZWN1cml0eU9yaWdpbisnLycrCih0aGlzLl9kb21TdG9yYWdlLmlzTG9jYWxTdG9yYWdlPydsb2NhbCc6J3Nlc3Npb24nKTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7dGhpcy5fc3RvcmFnZVBhbmVsLnNob3dET01TdG9yYWdlKHRoaXMuX2RvbVN0b3JhZ2UpO3JldHVybiBmYWxzZTt9Cm9uYXR0YWNoKCl7c3VwZXIub25hdHRhY2goKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLHRydWUpO30KX2hhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xlYXInKSwoKT0+dGhpcy5fZG9tU3RvcmFnZS5jbGVhcigpKTtjb250ZXh0TWVudS5zaG93KCk7fX07UmVzb3VyY2VzLkNvb2tpZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgUmVzb3VyY2VzLkJhc2VTdG9yYWdlVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Ioc3RvcmFnZVBhbmVsLGZyYW1lLGNvb2tpZURvbWFpbil7c3VwZXIoc3RvcmFnZVBhbmVsLGNvb2tpZURvbWFpbj9jb29raWVEb21haW46Q29tbW9uLlVJU3RyaW5nKCdMb2NhbCBGaWxlcycpLGZhbHNlKTt0aGlzLl90YXJnZXQ9ZnJhbWUucmVzb3VyY2VUcmVlTW9kZWwoKS50YXJnZXQoKTt0aGlzLl9jb29raWVEb21haW49Y29va2llRG9tYWluO2NvbnN0IGljb249VUkuSWNvbi5jcmVhdGUoJ21lZGl1bWljb24tY29va2llJywncmVzb3VyY2UtdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2Nvb2tpZXM6Ly8nK3RoaXMuX2Nvb2tpZURvbWFpbjt9Cm9uYXR0YWNoKCl7c3VwZXIub25hdHRhY2goKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLHRydWUpO30KX2hhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ2xlYXInKSwoKT0+dGhpcy5fc3RvcmFnZVBhbmVsLmNsZWFyQ29va2llcyh0aGlzLl90YXJnZXQsdGhpcy5fY29va2llRG9tYWluKSk7Y29udGV4dE1lbnUuc2hvdygpO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3N1cGVyLm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKTt0aGlzLl9zdG9yYWdlUGFuZWwuc2hvd0Nvb2tpZXModGhpcy5fdGFyZ2V0LHRoaXMuX2Nvb2tpZURvbWFpbik7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlTWFuaWZlc3RUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCxtYW5pZmVzdFVSTCl7Y29uc3QgdGl0bGU9bmV3IENvbW1vbi5QYXJzZWRVUkwobWFuaWZlc3RVUkwpLmRpc3BsYXlOYW1lO3N1cGVyKHN0b3JhZ2VQYW5lbCx0aXRsZSxmYWxzZSk7dGhpcy50b29sdGlwPW1hbmlmZXN0VVJMO3RoaXMuX21hbmlmZXN0VVJMPW1hbmlmZXN0VVJMO30KZ2V0IGl0ZW1VUkwoKXtyZXR1cm4nYXBwY2FjaGU6Ly8nK3RoaXMuX21hbmlmZXN0VVJMO30KZ2V0IG1hbmlmZXN0VVJMKCl7cmV0dXJuIHRoaXMuX21hbmlmZXN0VVJMO30Kb25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpe3N1cGVyLm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKTt0aGlzLl9zdG9yYWdlUGFuZWwuc2hvd0NhdGVnb3J5Vmlldyh0aGlzLl9tYW5pZmVzdFVSTCk7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5BcHBsaWNhdGlvbkNhY2hlRnJhbWVUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHNpZGViYXIsZnJhbWUsbWFuaWZlc3RVUkwpe3N1cGVyKHNpZGViYXIuX3BhbmVsLCcnLGZhbHNlKTt0aGlzLl9zaWRlYmFyPXNpZGViYXI7dGhpcy5fZnJhbWVJZD1mcmFtZS5pZDt0aGlzLl9tYW5pZmVzdFVSTD1tYW5pZmVzdFVSTDt0aGlzLl9yZWZyZXNoVGl0bGVzKGZyYW1lKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbmF2aWdhdG9yLWZvbGRlcicsJ25hdmlnYXRvci10cmVlLWl0ZW0nKTtpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRvci1mb2xkZXItdHJlZS1pdGVtJyk7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW2ljb25dKTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuJ2FwcGNhY2hlOi8vJyt0aGlzLl9tYW5pZmVzdFVSTCsnLycrZW5jb2RlVVJJKHRoaXMudGl0bGVBc1RleHQoKSk7fQpnZXQgZnJhbWVJZCgpe3JldHVybiB0aGlzLl9mcmFtZUlkO30KZ2V0IG1hbmlmZXN0VVJMKCl7cmV0dXJuIHRoaXMuX21hbmlmZXN0VVJMO30KX3JlZnJlc2hUaXRsZXMoZnJhbWUpe3RoaXMudGl0bGU9ZnJhbWUuZGlzcGxheU5hbWUoKTt9CmZyYW1lTmF2aWdhdGVkKGZyYW1lKXt0aGlzLl9yZWZyZXNoVGl0bGVzKGZyYW1lKTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7dGhpcy5fc2lkZWJhci5fc2hvd0FwcGxpY2F0aW9uQ2FjaGUodGhpcy5fZnJhbWVJZCk7cmV0dXJuIGZhbHNlO319O1Jlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N0b3JhZ2UtdmlldycpO3RoaXMuX2VtcHR5V2lkZ2V0PW5ldyBVSS5FbXB0eVdpZGdldCgnJyk7dGhpcy5fZW1wdHlXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO30Kc2V0VGV4dCh0ZXh0KXt0aGlzLl9lbXB0eVdpZGdldC50ZXh0PXRleHQ7fX07O1Jlc291cmNlcy5SZXNvdXJjZXNTZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHN0b3JhZ2VQYW5lbCx0cmVlRWxlbWVudCl7dGhpcy5fcGFuZWw9c3RvcmFnZVBhbmVsO3RoaXMuX3RyZWVFbGVtZW50PXRyZWVFbGVtZW50O3RoaXMuX3RyZWVFbGVtZW50Rm9yRnJhbWVJZD1uZXcgTWFwKCk7ZnVuY3Rpb24gYWRkTGlzdGVuZXIoZXZlbnRUeXBlLGhhbmRsZXIsdGFyZ2V0KXtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbCxldmVudFR5cGUsZXZlbnQ9PmhhbmRsZXIuY2FsbCh0YXJnZXQsZXZlbnQuZGF0YSkpO30KYWRkTGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZUFkZGVkLHRoaXMuX2ZyYW1lQWRkZWQsdGhpcyk7YWRkTGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5GcmFtZU5hdmlnYXRlZCx0aGlzLl9mcmFtZU5hdmlnYXRlZCx0aGlzKTthZGRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkZyYW1lRGV0YWNoZWQsdGhpcy5fZnJhbWVEZXRhY2hlZCx0aGlzKTthZGRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLlJlc291cmNlQWRkZWQsdGhpcy5fcmVzb3VyY2VBZGRlZCx0aGlzKTtjb25zdCBtYWluVGFyZ2V0PVNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKTtjb25zdCByZXNvdXJjZVRyZWVNb2RlbD1tYWluVGFyZ2V0JiZtYWluVGFyZ2V0Lm1vZGVsKFNESy5SZXNvdXJjZVRyZWVNb2RlbCk7Y29uc3QgbWFpbkZyYW1lPXJlc291cmNlVHJlZU1vZGVsJiZyZXNvdXJjZVRyZWVNb2RlbC5tYWluRnJhbWU7aWYobWFpbkZyYW1lKQp0aGlzLl9mcmFtZUFkZGVkKG1haW5GcmFtZSk7fQpzdGF0aWMgX2dldFBhcmVudEZyYW1lKGZyYW1lKXtjb25zdCBwYXJlbnRGcmFtZT1mcmFtZS5wYXJlbnRGcmFtZTtpZihwYXJlbnRGcmFtZSkKcmV0dXJuIHBhcmVudEZyYW1lO2NvbnN0IHBhcmVudFRhcmdldD1mcmFtZS5yZXNvdXJjZVRyZWVNb2RlbCgpLnRhcmdldCgpLnBhcmVudFRhcmdldCgpO2lmKCFwYXJlbnRUYXJnZXQpCnJldHVybiBudWxsO3JldHVybiBwYXJlbnRUYXJnZXQubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKS5tYWluRnJhbWU7fQpfZXhwYW5kRnJhbWUoZnJhbWUpe2lmKCFmcmFtZSkKcmV0dXJuIGZhbHNlO2xldCB0cmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQuZ2V0KGZyYW1lLmlkKTtpZighdHJlZUVsZW1lbnQmJiF0aGlzLl9leHBhbmRGcmFtZShSZXNvdXJjZXMuUmVzb3VyY2VzU2VjdGlvbi5fZ2V0UGFyZW50RnJhbWUoZnJhbWUpKSkKcmV0dXJuIGZhbHNlO3RyZWVFbGVtZW50PXRoaXMuX3RyZWVFbGVtZW50Rm9yRnJhbWVJZC5nZXQoZnJhbWUuaWQpO2lmKCF0cmVlRWxlbWVudCkKcmV0dXJuIGZhbHNlO3RyZWVFbGVtZW50LmV4cGFuZCgpO3JldHVybiB0cnVlO30KYXN5bmMgcmV2ZWFsUmVzb3VyY2UocmVzb3VyY2UsbGluZSxjb2x1bW4pe2lmKCF0aGlzLl9leHBhbmRGcmFtZShyZXNvdXJjZS5mcmFtZSgpKSkKcmV0dXJuO2NvbnN0IHJlc291cmNlVHJlZUVsZW1lbnQ9UmVzb3VyY2VzLkZyYW1lUmVzb3VyY2VUcmVlRWxlbWVudC5mb3JSZXNvdXJjZShyZXNvdXJjZSk7aWYocmVzb3VyY2VUcmVlRWxlbWVudCkKYXdhaXQgcmVzb3VyY2VUcmVlRWxlbWVudC5yZXZlYWxSZXNvdXJjZShsaW5lLGNvbHVtbik7fQpfZnJhbWVBZGRlZChmcmFtZSl7Y29uc3QgcGFyZW50RnJhbWU9UmVzb3VyY2VzLlJlc291cmNlc1NlY3Rpb24uX2dldFBhcmVudEZyYW1lKGZyYW1lKTtjb25zdCBwYXJlbnRUcmVlRWxlbWVudD1wYXJlbnRGcmFtZT90aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQuZ2V0KHBhcmVudEZyYW1lLmlkKTp0aGlzLl90cmVlRWxlbWVudDtpZighcGFyZW50VHJlZUVsZW1lbnQpCnJldHVybjtjb25zdCBmcmFtZVRyZWVFbGVtZW50PW5ldyBSZXNvdXJjZXMuRnJhbWVUcmVlRWxlbWVudCh0aGlzLGZyYW1lKTt0aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQuc2V0KGZyYW1lLmlkLGZyYW1lVHJlZUVsZW1lbnQpO3BhcmVudFRyZWVFbGVtZW50LmFwcGVuZENoaWxkKGZyYW1lVHJlZUVsZW1lbnQpO30KX2ZyYW1lRGV0YWNoZWQoZnJhbWUpe2NvbnN0IGZyYW1lVHJlZUVsZW1lbnQ9dGhpcy5fdHJlZUVsZW1lbnRGb3JGcmFtZUlkLmdldChmcmFtZS5pZCk7aWYoIWZyYW1lVHJlZUVsZW1lbnQpCnJldHVybjt0aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQucmVtb3ZlKGZyYW1lLmlkKTtpZihmcmFtZVRyZWVFbGVtZW50LnBhcmVudCkKZnJhbWVUcmVlRWxlbWVudC5wYXJlbnQucmVtb3ZlQ2hpbGQoZnJhbWVUcmVlRWxlbWVudCk7fQpfZnJhbWVOYXZpZ2F0ZWQoZnJhbWUpe2NvbnN0IGZyYW1lVHJlZUVsZW1lbnQ9dGhpcy5fdHJlZUVsZW1lbnRGb3JGcmFtZUlkLmdldChmcmFtZS5pZCk7aWYoZnJhbWVUcmVlRWxlbWVudCkKZnJhbWVUcmVlRWxlbWVudC5mcmFtZU5hdmlnYXRlZChmcmFtZSk7fQpfcmVzb3VyY2VBZGRlZChyZXNvdXJjZSl7Y29uc3QgZnJhbWVUcmVlRWxlbWVudD10aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQuZ2V0KHJlc291cmNlLmZyYW1lSWQpO2lmKCFmcmFtZVRyZWVFbGVtZW50KXtyZXR1cm47fQpmcmFtZVRyZWVFbGVtZW50LmFwcGVuZFJlc291cmNlKHJlc291cmNlKTt9CnJlc2V0KCl7dGhpcy5fdHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl90cmVlRWxlbWVudEZvckZyYW1lSWQuY2xlYXIoKTt9fTtSZXNvdXJjZXMuRnJhbWVUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFJlc291cmNlcy5CYXNlU3RvcmFnZVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHNlY3Rpb24sZnJhbWUpe3N1cGVyKHNlY3Rpb24uX3BhbmVsLCcnLGZhbHNlKTt0aGlzLl9wb3B1bGF0ZWQ9ZmFsc2U7dGhpcy5fc2VjdGlvbj1zZWN0aW9uO3RoaXMuX2ZyYW1lPWZyYW1lO3RoaXMuX2ZyYW1lSWQ9ZnJhbWUuaWQ7dGhpcy5fY2F0ZWdvcnlFbGVtZW50cz17fTt0aGlzLl90cmVlRWxlbWVudEZvclJlc291cmNlPXt9O3RoaXMuc2V0RXhwYW5kYWJsZSh0cnVlKTt0aGlzLmZyYW1lTmF2aWdhdGVkKGZyYW1lKTtjb25zdCBpY29uPVVJLkljb24uY3JlYXRlKCdsYXJnZWljb24tbmF2aWdhdG9yLWZyYW1lJywnbmF2aWdhdG9yLXRyZWUtaXRlbScpO2ljb24uY2xhc3NMaXN0LmFkZCgnbmF2aWdhdG9yLWZyYW1lLXRyZWUtaXRlbScpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtpY29uXSk7fQpmcmFtZU5hdmlnYXRlZChmcmFtZSl7dGhpcy5pbnZhbGlkYXRlQ2hpbGRyZW4oKTt0aGlzLl9mcmFtZUlkPWZyYW1lLmlkO3RoaXMudGl0bGU9ZnJhbWUuZGlzcGxheU5hbWUoKTt0aGlzLl9jYXRlZ29yeUVsZW1lbnRzPXt9O3RoaXMuX3RyZWVFbGVtZW50Rm9yUmVzb3VyY2U9e307fQpnZXQgaXRlbVVSTCgpe3JldHVybidmcmFtZTovLycrZW5jb2RlVVJJKHRoaXMudGl0bGVBc1RleHQoKSk7fQpvbnNlbGVjdChzZWxlY3RlZEJ5VXNlcil7c3VwZXIub25zZWxlY3Qoc2VsZWN0ZWRCeVVzZXIpO3RoaXMuX3NlY3Rpb24uX3BhbmVsLnNob3dDYXRlZ29yeVZpZXcodGhpcy50aXRsZUFzVGV4dCgpKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcmVkJyk7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO3JldHVybiBmYWxzZTt9CnNldCBob3ZlcmVkKGhvdmVyZWQpe2lmKGhvdmVyZWQpe3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hvdmVyZWQnKTt0aGlzLl9mcmFtZS5yZXNvdXJjZVRyZWVNb2RlbCgpLmRvbU1vZGVsKCkub3ZlcmxheU1vZGVsKCkuaGlnaGxpZ2h0RnJhbWUodGhpcy5fZnJhbWVJZCk7fWVsc2V7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXJlZCcpO1NESy5PdmVybGF5TW9kZWwuaGlkZURPTU5vZGVIaWdobGlnaHQoKTt9fQphcHBlbmRSZXNvdXJjZShyZXNvdXJjZSl7aWYoIXRoaXMuX3BvcHVsYXRlZCkKcmV0dXJuO2NvbnN0IHN0YXR1c0NvZGU9cmVzb3VyY2VbJ3N0YXR1c0NvZGUnXTtpZihzdGF0dXNDb2RlPj0zMDEmJnN0YXR1c0NvZGU8PTMwMykKcmV0dXJuO2NvbnN0IHJlc291cmNlVHlwZT1yZXNvdXJjZS5yZXNvdXJjZVR5cGUoKTtjb25zdCBjYXRlZ29yeU5hbWU9cmVzb3VyY2VUeXBlLm5hbWUoKTtsZXQgY2F0ZWdvcnlFbGVtZW50PXJlc291cmNlVHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50P3RoaXM6dGhpcy5fY2F0ZWdvcnlFbGVtZW50c1tjYXRlZ29yeU5hbWVdO2lmKCFjYXRlZ29yeUVsZW1lbnQpe2NhdGVnb3J5RWxlbWVudD1uZXcgUmVzb3VyY2VzLlN0b3JhZ2VDYXRlZ29yeVRyZWVFbGVtZW50KHRoaXMuX3NlY3Rpb24uX3BhbmVsLHJlc291cmNlLnJlc291cmNlVHlwZSgpLmNhdGVnb3J5KCkudGl0bGUsY2F0ZWdvcnlOYW1lKTt0aGlzLl9jYXRlZ29yeUVsZW1lbnRzW3Jlc291cmNlVHlwZS5uYW1lKCldPWNhdGVnb3J5RWxlbWVudDt0aGlzLl9pbnNlcnRJblByZXNlbnRhdGlvbk9yZGVyKHRoaXMsY2F0ZWdvcnlFbGVtZW50KTt9CmNvbnN0IHJlc291cmNlVHJlZUVsZW1lbnQ9bmV3IFJlc291cmNlcy5GcmFtZVJlc291cmNlVHJlZUVsZW1lbnQodGhpcy5fc2VjdGlvbi5fcGFuZWwscmVzb3VyY2UpO3RoaXMuX2luc2VydEluUHJlc2VudGF0aW9uT3JkZXIoY2F0ZWdvcnlFbGVtZW50LHJlc291cmNlVHJlZUVsZW1lbnQpO3RoaXMuX3RyZWVFbGVtZW50Rm9yUmVzb3VyY2VbcmVzb3VyY2UudXJsXT1yZXNvdXJjZVRyZWVFbGVtZW50O30KcmVzb3VyY2VCeVVSTCh1cmwpe2NvbnN0IHRyZWVFbGVtZW50PXRoaXMuX3RyZWVFbGVtZW50Rm9yUmVzb3VyY2VbdXJsXTtyZXR1cm4gdHJlZUVsZW1lbnQ/dHJlZUVsZW1lbnQuX3Jlc291cmNlOm51bGw7fQphcHBlbmRDaGlsZCh0cmVlRWxlbWVudCl7aWYoIXRoaXMuX3BvcHVsYXRlZCkKcmV0dXJuO3RoaXMuX2luc2VydEluUHJlc2VudGF0aW9uT3JkZXIodGhpcyx0cmVlRWxlbWVudCk7fQpfaW5zZXJ0SW5QcmVzZW50YXRpb25PcmRlcihwYXJlbnRUcmVlRWxlbWVudCxjaGlsZFRyZWVFbGVtZW50KXtmdW5jdGlvbiB0eXBlV2VpZ2h0KHRyZWVFbGVtZW50KXtpZih0cmVlRWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlcy5TdG9yYWdlQ2F0ZWdvcnlUcmVlRWxlbWVudCkKcmV0dXJuIDI7aWYodHJlZUVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZXMuRnJhbWVUcmVlRWxlbWVudCkKcmV0dXJuIDE7cmV0dXJuIDM7fQpmdW5jdGlvbiBjb21wYXJlKHRyZWVFbGVtZW50MSx0cmVlRWxlbWVudDIpe2NvbnN0IHR5cGVXZWlnaHQxPXR5cGVXZWlnaHQodHJlZUVsZW1lbnQxKTtjb25zdCB0eXBlV2VpZ2h0Mj10eXBlV2VpZ2h0KHRyZWVFbGVtZW50Mik7bGV0IHJlc3VsdDtpZih0eXBlV2VpZ2h0MT50eXBlV2VpZ2h0MikKcmVzdWx0PTE7ZWxzZSBpZih0eXBlV2VpZ2h0MTx0eXBlV2VpZ2h0MikKcmVzdWx0PS0xO2Vsc2UKcmVzdWx0PXRyZWVFbGVtZW50MS50aXRsZUFzVGV4dCgpLmxvY2FsZUNvbXBhcmUodHJlZUVsZW1lbnQyLnRpdGxlQXNUZXh0KCkpO3JldHVybiByZXN1bHQ7fQpjb25zdCBjaGlsZENvdW50PXBhcmVudFRyZWVFbGVtZW50LmNoaWxkQ291bnQoKTtsZXQgaTtmb3IoaT0wO2k8Y2hpbGRDb3VudDsrK2kpe2lmKGNvbXBhcmUoY2hpbGRUcmVlRWxlbWVudCxwYXJlbnRUcmVlRWxlbWVudC5jaGlsZEF0KGkpKTwwKQpicmVhazt9CnBhcmVudFRyZWVFbGVtZW50Lmluc2VydENoaWxkKGNoaWxkVHJlZUVsZW1lbnQsaSk7fQpvbnBvcHVsYXRlKCl7dGhpcy5fcG9wdWxhdGVkPXRydWU7Zm9yKGNvbnN0IGNoaWxkIG9mIHRoaXMuX2ZyYW1lLmNoaWxkRnJhbWVzKQp0aGlzLl9zZWN0aW9uLl9mcmFtZUFkZGVkKGNoaWxkKTtmb3IoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5fZnJhbWUucmVzb3VyY2VzKCkpCnRoaXMuYXBwZW5kUmVzb3VyY2UocmVzb3VyY2UpO319O1Jlc291cmNlcy5GcmFtZVJlc291cmNlVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBSZXNvdXJjZXMuQmFzZVN0b3JhZ2VUcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihzdG9yYWdlUGFuZWwscmVzb3VyY2Upe3N1cGVyKHN0b3JhZ2VQYW5lbCxyZXNvdXJjZS5kaXNwbGF5TmFtZSxmYWxzZSk7dGhpcy5fcGFuZWw9c3RvcmFnZVBhbmVsO3RoaXMuX3Jlc291cmNlPXJlc291cmNlO3RoaXMuX3ByZXZpZXdQcm9taXNlPW51bGw7dGhpcy50b29sdGlwPXJlc291cmNlLnVybDt0aGlzLl9yZXNvdXJjZVtSZXNvdXJjZXMuRnJhbWVSZXNvdXJjZVRyZWVFbGVtZW50Ll9zeW1ib2xdPXRoaXM7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbGFyZ2VpY29uLW5hdmlnYXRvci1maWxlJywnbmF2aWdhdG9yLXRyZWUtaXRlbScpO2ljb24uY2xhc3NMaXN0LmFkZCgnbmF2aWdhdG9yLWZpbGUtdHJlZS1pdGVtJyk7aWNvbi5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0b3ItJytyZXNvdXJjZS5yZXNvdXJjZVR5cGUoKS5uYW1lKCkrJy10cmVlLWl0ZW0nKTt0aGlzLnNldExlYWRpbmdJY29ucyhbaWNvbl0pO30Kc3RhdGljIGZvclJlc291cmNlKHJlc291cmNlKXtyZXR1cm4gcmVzb3VyY2VbUmVzb3VyY2VzLkZyYW1lUmVzb3VyY2VUcmVlRWxlbWVudC5fc3ltYm9sXTt9CmdldCBpdGVtVVJMKCl7cmV0dXJuIHRoaXMuX3Jlc291cmNlLnVybDt9Cl9wcmVwYXJlUHJldmlldygpe2lmKHRoaXMuX3ByZXZpZXdQcm9taXNlKQpyZXR1cm4gdGhpcy5fcHJldmlld1Byb21pc2U7Y29uc3Qgdmlld1Byb21pc2U9U291cmNlRnJhbWUuUHJldmlld0ZhY3RvcnkuY3JlYXRlUHJldmlldyh0aGlzLl9yZXNvdXJjZSx0aGlzLl9yZXNvdXJjZS5taW1lVHlwZSk7dGhpcy5fcHJldmlld1Byb21pc2U9dmlld1Byb21pc2UudGhlbih2aWV3PT57aWYodmlldykKcmV0dXJuIHZpZXc7cmV0dXJuIG5ldyBVSS5FbXB0eVdpZGdldCh0aGlzLl9yZXNvdXJjZS51cmwpO30pO3JldHVybiB0aGlzLl9wcmV2aWV3UHJvbWlzZTt9Cm9uc2VsZWN0KHNlbGVjdGVkQnlVc2VyKXtzdXBlci5vbnNlbGVjdChzZWxlY3RlZEJ5VXNlcik7dGhpcy5fcGFuZWwuc2NoZWR1bGVTaG93Vmlldyh0aGlzLl9wcmVwYXJlUHJldmlldygpKTtyZXR1cm4gZmFsc2U7fQpvbmRibGNsaWNrKGV2ZW50KXtJbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKHRoaXMuX3Jlc291cmNlLnVybCk7cmV0dXJuIGZhbHNlO30Kb25hdHRhY2goKXtzdXBlci5vbmF0dGFjaCgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmRyYWdnYWJsZT10cnVlO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsdGhpcy5fb25kcmFnc3RhcnQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXZlbnQuYmluZCh0aGlzKSx0cnVlKTt9Cl9vbmRyYWdzdGFydChldmVudCl7ZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLHRoaXMuX3Jlc291cmNlLmNvbnRlbnR8fCcnKTtldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0nY29weSc7cmV0dXJuIHRydWU7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXModGhpcy5fcmVzb3VyY2UpO2NvbnRleHRNZW51LnNob3coKTt9CmFzeW5jIHJldmVhbFJlc291cmNlKGxpbmUsY29sdW1uKXt0aGlzLnJldmVhbEFuZFNlbGVjdCh0cnVlKTtjb25zdCB2aWV3PWF3YWl0IHRoaXMuX3BhbmVsLnNjaGVkdWxlU2hvd1ZpZXcodGhpcy5fcHJlcGFyZVByZXZpZXcoKSk7aWYoISh2aWV3IGluc3RhbmNlb2YgU291cmNlRnJhbWUuUmVzb3VyY2VTb3VyY2VGcmFtZSl8fHR5cGVvZiBsaW5lIT09J251bWJlcicpCnJldHVybjt2aWV3LnJldmVhbFBvc2l0aW9uKGxpbmUsY29sdW1uLHRydWUpO319O1Jlc291cmNlcy5GcmFtZVJlc291cmNlVHJlZUVsZW1lbnQuX3N5bWJvbD1TeW1ib2woJ3RyZWVFbGVtZW50Jyk7O1Jlc291cmNlcy5TZXJ2aWNlV29ya2VyQ2FjaGVWaWV3PWNsYXNzIGV4dGVuZHMgVUkuU2ltcGxlVmlld3tjb25zdHJ1Y3Rvcihtb2RlbCxjYWNoZSl7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdDYWNoZScpKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3Jlc291cmNlcy9zZXJ2aWNlV29ya2VyQ2FjaGVWaWV3cy5jc3MnKTt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl9lbnRyaWVzRm9yVGVzdD1udWxsO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXJ2aWNlLXdvcmtlci1jYWNoZS1kYXRhLXZpZXcnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3RvcmFnZS12aWV3Jyk7Y29uc3QgZWRpdG9yVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignZGF0YS12aWV3LXRvb2xiYXInLHRoaXMuZWxlbWVudCk7dGhpcy5fc3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KGZhbHNlLGZhbHNlKTt0aGlzLl9zcGxpdFdpZGdldC5zaG93KHRoaXMuZWxlbWVudCk7dGhpcy5fcHJldmlld1BhbmVsPW5ldyBVSS5WQm94KCk7Y29uc3QgcmVzaXplcj10aGlzLl9wcmV2aWV3UGFuZWwuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnY2FjaGUtcHJldmlldy1wYW5lbC1yZXNpemVyJyk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0TWFpbldpZGdldCh0aGlzLl9wcmV2aWV3UGFuZWwpO3RoaXMuX3NwbGl0V2lkZ2V0Lmluc3RhbGxSZXNpemVyKHJlc2l6ZXIpO3RoaXMuX3ByZXZpZXc9bnVsbDt0aGlzLl9jYWNoZT1jYWNoZTt0aGlzLl9kYXRhR3JpZD1udWxsO3RoaXMuX2xhc3RQYWdlU2l6ZT1udWxsO3RoaXMuX2xhc3RTa2lwQ291bnQ9bnVsbDt0aGlzLl9yZWZyZXNoVGhyb3R0bGVyPW5ldyBDb21tb24uVGhyb3R0bGVyKDMwMCk7dGhpcy5fcGFnZUJhY2tCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdTaG93IHByZXZpb3VzIHBhZ2UnKSwnbGFyZ2VpY29uLXBsYXktYmFjaycpO3RoaXMuX3BhZ2VCYWNrQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fcGFnZUJhY2tCdXR0b25DbGlja2VkLHRoaXMpO2VkaXRvclRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcGFnZUJhY2tCdXR0b24pO3RoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnU2hvdyBuZXh0IHBhZ2UnKSwnbGFyZ2VpY29uLXBsYXknKTt0aGlzLl9wYWdlRm9yd2FyZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9wYWdlRm9yd2FyZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uQ2xpY2tlZCx0aGlzKTtlZGl0b3JUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uKTt0aGlzLl9yZWZyZXNoQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLCdsYXJnZWljb24tcmVmcmVzaCcpO3RoaXMuX3JlZnJlc2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9yZWZyZXNoQnV0dG9uQ2xpY2tlZCx0aGlzKTtlZGl0b3JUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3JlZnJlc2hCdXR0b24pO3RoaXMuX2RlbGV0ZVNlbGVjdGVkQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnRGVsZXRlIFNlbGVjdGVkJyksJ2xhcmdlaWNvbi1kZWxldGUnKTt0aGlzLl9kZWxldGVTZWxlY3RlZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT50aGlzLl9kZWxldGVCdXR0b25DbGlja2VkKG51bGwpKTtlZGl0b3JUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2RlbGV0ZVNlbGVjdGVkQnV0dG9uKTt0aGlzLl9wYWdlU2l6ZT01MDt0aGlzLl9za2lwQ291bnQ9MDt0aGlzLnVwZGF0ZShjYWNoZSk7fQp3YXNTaG93bigpe3RoaXMuX21vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cy5DYWNoZVN0b3JhZ2VDb250ZW50VXBkYXRlZCx0aGlzLl9jYWNoZUNvbnRlbnRVcGRhdGVkLHRoaXMpO3RoaXMuX3VwZGF0ZURhdGEodHJ1ZSk7fQp3aWxsSGlkZSgpe3RoaXMuX21vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJDYWNoZU1vZGVsLkV2ZW50cy5DYWNoZVN0b3JhZ2VDb250ZW50VXBkYXRlZCx0aGlzLl9jYWNoZUNvbnRlbnRVcGRhdGVkLHRoaXMpO30KX3Nob3dQcmV2aWV3KHByZXZpZXcpe2lmKHRoaXMuX3ByZXZpZXc9PT1wcmV2aWV3KQpyZXR1cm47aWYodGhpcy5fcHJldmlldykKdGhpcy5fcHJldmlldy5kZXRhY2goKTtpZighcHJldmlldykKcHJldmlldz1uZXcgVUkuRW1wdHlXaWRnZXQoQ29tbW9uLlVJU3RyaW5nKCdTZWxlY3QgYSBjYWNoZSBlbnRyeSBhYm92ZSB0byBwcmV2aWV3JykpO3RoaXMuX3ByZXZpZXc9cHJldmlldzt0aGlzLl9wcmV2aWV3LnNob3codGhpcy5fcHJldmlld1BhbmVsLmVsZW1lbnQpO30KX2NyZWF0ZURhdGFHcmlkKCl7Y29uc3QgY29sdW1ucz0oW3tpZDoncGF0aCcsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdQYXRoJyksd2VpZ2h0OjQsc29ydGFibGU6dHJ1ZX0se2lkOidjb250ZW50VHlwZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdDb250ZW50LVR5cGUnKSx3ZWlnaHQ6MSxzb3J0YWJsZTp0cnVlfSx7aWQ6J2NvbnRlbnRMZW5ndGgnLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQ29udGVudC1MZW5ndGgnKSx3ZWlnaHQ6MSxhbGlnbjpEYXRhR3JpZC5EYXRhR3JpZC5BbGlnbi5SaWdodCxzb3J0YWJsZTp0cnVlfSx7aWQ6J3Jlc3BvbnNlVGltZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUaW1lIENhY2hlZCcpLHdpZHRoOicxMmVtJyx3ZWlnaHQ6MSxhbGlnbjpEYXRhR3JpZC5EYXRhR3JpZC5BbGlnbi5SaWdodCxzb3J0YWJsZTp0cnVlfV0pO2NvbnN0IGRhdGFHcmlkPW5ldyBEYXRhR3JpZC5EYXRhR3JpZChjb2x1bW5zLHVuZGVmaW5lZCx0aGlzLl9kZWxldGVCdXR0b25DbGlja2VkLmJpbmQodGhpcyksdGhpcy5fdXBkYXRlRGF0YS5iaW5kKHRoaXMsdHJ1ZSkpO2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDaGFuZ2VkLHRoaXMuX3NvcnRpbmdDaGFuZ2VkLHRoaXMpO2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSxldmVudD0+dGhpcy5fcHJldmlld0NhY2hlZFJlc3BvbnNlKGV2ZW50LmRhdGEuZGF0YSksdGhpcyk7ZGF0YUdyaWQuc2V0U3RyaXBlZCh0cnVlKTtyZXR1cm4gZGF0YUdyaWQ7fQpfc29ydGluZ0NoYW5nZWQoKXtpZighdGhpcy5fZGF0YUdyaWQpCnJldHVybjtjb25zdCBhY2NlbmRpbmc9dGhpcy5fZGF0YUdyaWQuaXNTb3J0T3JkZXJBc2NlbmRpbmcoKTtjb25zdCBjb2x1bW5JZD10aGlzLl9kYXRhR3JpZC5zb3J0Q29sdW1uSWQoKTtsZXQgY29tcGFyYXRvcjtpZihjb2x1bW5JZD09PSdwYXRoJykKY29tcGFyYXRvcj0oYSxiKT0+YS5fcGF0aC5sb2NhbGVDb21wYXJlKGIuX3BhdGgpO2Vsc2UgaWYoY29sdW1uSWQ9PT0nY29udGVudFR5cGUnKQpjb21wYXJhdG9yPShhLGIpPT5hLmRhdGEubWltZVR5cGUubG9jYWxlQ29tcGFyZShiLmRhdGEubWltZVR5cGUpO2Vsc2UgaWYoY29sdW1uSWQ9PT0nY29udGVudExlbmd0aCcpCmNvbXBhcmF0b3I9KGEsYik9PmEuZGF0YS5yZXNvdXJjZVNpemUtYi5kYXRhLnJlc291cmNlU2l6ZTtlbHNlIGlmKGNvbHVtbklkPT09J3Jlc3BvbnNlVGltZScpCmNvbXBhcmF0b3I9KGEsYik9PmEuZGF0YS5lbmRUaW1lLWIuZGF0YS5lbmRUaW1lO2NvbnN0IGNoaWxkcmVuPXRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCkuY2hpbGRyZW4uc2xpY2UoKTt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7Y2hpbGRyZW4uc29ydCgoYSxiKT0+e2NvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGEsYik7cmV0dXJuIGFjY2VuZGluZz9yZXN1bHQ6LXJlc3VsdDt9KTtjaGlsZHJlbi5mb3JFYWNoKGNoaWxkPT50aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLmFwcGVuZENoaWxkKGNoaWxkKSk7fQpfcGFnZUJhY2tCdXR0b25DbGlja2VkKGV2ZW50KXt0aGlzLl9za2lwQ291bnQ9TWF0aC5tYXgoMCx0aGlzLl9za2lwQ291bnQtdGhpcy5fcGFnZVNpemUpO3RoaXMuX3VwZGF0ZURhdGEoZmFsc2UpO30KX3BhZ2VGb3J3YXJkQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy5fc2tpcENvdW50PXRoaXMuX3NraXBDb3VudCt0aGlzLl9wYWdlU2l6ZTt0aGlzLl91cGRhdGVEYXRhKGZhbHNlKTt9CmFzeW5jIF9kZWxldGVCdXR0b25DbGlja2VkKG5vZGUpe2lmKCFub2RlKXtub2RlPXRoaXMuX2RhdGFHcmlkJiZ0aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGU7aWYoIW5vZGUpCnJldHVybjt9CmF3YWl0IHRoaXMuX21vZGVsLmRlbGV0ZUNhY2hlRW50cnkodGhpcy5fY2FjaGUsKG5vZGUuZGF0YS51cmwoKSkpO25vZGUucmVtb3ZlKCk7fQp1cGRhdGUoY2FjaGUpe3RoaXMuX2NhY2hlPWNhY2hlO2lmKHRoaXMuX2RhdGFHcmlkKQp0aGlzLl9kYXRhR3JpZC5hc1dpZGdldCgpLmRldGFjaCgpO3RoaXMuX2RhdGFHcmlkPXRoaXMuX2NyZWF0ZURhdGFHcmlkKCk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9kYXRhR3JpZC5hc1dpZGdldCgpKTt0aGlzLl9za2lwQ291bnQ9MDt0aGlzLl91cGRhdGVEYXRhKHRydWUpO30KX3VwZGF0ZURhdGFDYWxsYmFjayhza2lwQ291bnQsZW50cmllcyxoYXNNb3JlKXtjb25zdCBzZWxlY3RlZD10aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGUmJnRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZS5kYXRhLnVybCgpO3RoaXMuX3JlZnJlc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9lbnRyaWVzRm9yVGVzdD1lbnRyaWVzO2NvbnN0IG9sZEVudHJpZXM9bmV3IE1hcCgpO2NvbnN0IHJvb3ROb2RlPXRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCk7Zm9yKGNvbnN0IG5vZGUgb2Ygcm9vdE5vZGUuY2hpbGRyZW4pCm9sZEVudHJpZXMuc2V0KG5vZGUuZGF0YS51cmwsbm9kZSk7cm9vdE5vZGUucmVtb3ZlQ2hpbGRyZW4oKTtsZXQgc2VsZWN0ZWROb2RlPW51bGw7Zm9yKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpe2xldCBub2RlPW9sZEVudHJpZXMuZ2V0KGVudHJ5LnJlcXVlc3RVUkwpO2lmKCFub2RlfHxub2RlLmRhdGEucmVzcG9uc2VUaW1lIT09ZW50cnkucmVzcG9uc2VUaW1lKXtub2RlPW5ldyBSZXNvdXJjZXMuU2VydmljZVdvcmtlckNhY2hlVmlldy5EYXRhR3JpZE5vZGUodGhpcy5fY3JlYXRlUmVxdWVzdChlbnRyeSkpO25vZGUuc2VsZWN0YWJsZT10cnVlO30Kcm9vdE5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7aWYoZW50cnkucmVxdWVzdFVSTD09PXNlbGVjdGVkKQpzZWxlY3RlZE5vZGU9bm9kZTt9CnRoaXMuX3BhZ2VCYWNrQnV0dG9uLnNldEVuYWJsZWQoISFza2lwQ291bnQpO3RoaXMuX3BhZ2VGb3J3YXJkQnV0dG9uLnNldEVuYWJsZWQoaGFzTW9yZSk7aWYoIXNlbGVjdGVkTm9kZSkKdGhpcy5fc2hvd1ByZXZpZXcobnVsbCk7ZWxzZQpzZWxlY3RlZE5vZGUucmV2ZWFsQW5kU2VsZWN0KCk7dGhpcy5fdXBkYXRlZEZvclRlc3QoKTt9Cl91cGRhdGVEYXRhKGZvcmNlKXtjb25zdCBwYWdlU2l6ZT10aGlzLl9wYWdlU2l6ZTtsZXQgc2tpcENvdW50PXRoaXMuX3NraXBDb3VudDtpZighZm9yY2UmJnRoaXMuX2xhc3RQYWdlU2l6ZT09PXBhZ2VTaXplJiZ0aGlzLl9sYXN0U2tpcENvdW50PT09c2tpcENvdW50KQpyZXR1cm47dGhpcy5fcmVmcmVzaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtpZih0aGlzLl9sYXN0UGFnZVNpemUhPT1wYWdlU2l6ZSl7c2tpcENvdW50PTA7dGhpcy5fc2tpcENvdW50PTA7fQp0aGlzLl9sYXN0UGFnZVNpemU9cGFnZVNpemU7dGhpcy5fbGFzdFNraXBDb3VudD1za2lwQ291bnQ7dGhpcy5fbW9kZWwubG9hZENhY2hlRGF0YSh0aGlzLl9jYWNoZSxza2lwQ291bnQscGFnZVNpemUsdGhpcy5fdXBkYXRlRGF0YUNhbGxiYWNrLmJpbmQodGhpcyxza2lwQ291bnQpKTt9Cl9yZWZyZXNoQnV0dG9uQ2xpY2tlZChldmVudCl7dGhpcy5fdXBkYXRlRGF0YSh0cnVlKTt9Cl9jYWNoZUNvbnRlbnRVcGRhdGVkKGV2ZW50KXtjb25zdCBuYW1lQW5kT3JpZ2luPWV2ZW50LmRhdGE7aWYodGhpcy5fY2FjaGUuc2VjdXJpdHlPcmlnaW4hPT1uYW1lQW5kT3JpZ2luLm9yaWdpbnx8dGhpcy5fY2FjaGUuY2FjaGVOYW1lIT09bmFtZUFuZE9yaWdpbi5jYWNoZU5hbWUpCnJldHVybjt0aGlzLl9yZWZyZXNoVGhyb3R0bGVyLnNjaGVkdWxlKCgpPT5Qcm9taXNlLnJlc29sdmUodGhpcy5fdXBkYXRlRGF0YSh0cnVlKSksdHJ1ZSk7fQphc3luYyBfcHJldmlld0NhY2hlZFJlc3BvbnNlKHJlcXVlc3Qpe2xldCBwcmV2aWV3PXJlcXVlc3RbUmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJDYWNoZVZpZXcuX3ByZXZpZXdTeW1ib2xdO2lmKCFwcmV2aWV3KXtwcmV2aWV3PW5ldyBSZXNvdXJjZXMuU2VydmljZVdvcmtlckNhY2hlVmlldy5SZXF1ZXN0VmlldyhyZXF1ZXN0KTtyZXF1ZXN0W1Jlc291cmNlcy5TZXJ2aWNlV29ya2VyQ2FjaGVWaWV3Ll9wcmV2aWV3U3ltYm9sXT1wcmV2aWV3O30KaWYocmVxdWVzdD09PXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZS5kYXRhKQp0aGlzLl9zaG93UHJldmlldyhwcmV2aWV3KTt9Cl9jcmVhdGVSZXF1ZXN0KGVudHJ5KXtjb25zdCByZXF1ZXN0PW5ldyBTREsuTmV0d29ya1JlcXVlc3QoJ2NhY2hlLXN0b3JhZ2UtJytlbnRyeS5yZXF1ZXN0VVJMLGVudHJ5LnJlcXVlc3RVUkwsJycsJycsJycsbnVsbCk7cmVxdWVzdC5yZXF1ZXN0TWV0aG9kPWVudHJ5LnJlcXVlc3RNZXRob2Q7cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVycyhlbnRyeS5yZXF1ZXN0SGVhZGVycyk7cmVxdWVzdC5zdGF0dXNDb2RlPWVudHJ5LnJlc3BvbnNlU3RhdHVzO3JlcXVlc3Quc3RhdHVzVGV4dD1lbnRyeS5yZXNwb25zZVN0YXR1c1RleHQ7cmVxdWVzdC5wcm90b2NvbD1uZXcgQ29tbW9uLlBhcnNlZFVSTChlbnRyeS5yZXF1ZXN0VVJMKS5zY2hlbWU7cmVxdWVzdC5yZXNwb25zZUhlYWRlcnM9ZW50cnkucmVzcG9uc2VIZWFkZXJzO3JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnNUZXh0KCcnKTtyZXF1ZXN0LmVuZFRpbWU9ZW50cnkucmVzcG9uc2VUaW1lO2xldCBoZWFkZXI9ZW50cnkucmVzcG9uc2VIZWFkZXJzLmZpbmQoaGVhZGVyPT5oZWFkZXIubmFtZS50b0xvd2VyQ2FzZSgpPT09J2NvbnRlbnQtdHlwZScpO2NvbnN0IGNvbnRlbnRUeXBlPWhlYWRlcj9oZWFkZXIudmFsdWU6J3RleHQvcGxhaW4nO3JlcXVlc3QubWltZVR5cGU9Y29udGVudFR5cGU7aGVhZGVyPWVudHJ5LnJlc3BvbnNlSGVhZGVycy5maW5kKGhlYWRlcj0+aGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKT09PSdjb250ZW50LWxlbmd0aCcpO3JlcXVlc3QucmVzb3VyY2VTaXplPShoZWFkZXImJmhlYWRlci52YWx1ZSl8MDtsZXQgcmVzb3VyY2VUeXBlPUNvbW1vbi5SZXNvdXJjZVR5cGUuZnJvbU1pbWVUeXBlKGNvbnRlbnRUeXBlKTtpZighcmVzb3VyY2VUeXBlKQpyZXNvdXJjZVR5cGU9Q29tbW9uLlJlc291cmNlVHlwZS5mcm9tVVJMKGVudHJ5LnJlcXVlc3RVUkwpfHxDb21tb24ucmVzb3VyY2VUeXBlcy5PdGhlcjtyZXF1ZXN0LnNldFJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpO3JlcXVlc3Quc2V0Q29udGVudERhdGFQcm92aWRlcih0aGlzLl9yZXF1ZXN0Q29udGVudC5iaW5kKHRoaXMscmVxdWVzdCkpO3JldHVybiByZXF1ZXN0O30KYXN5bmMgX3JlcXVlc3RDb250ZW50KHJlcXVlc3Qpe2NvbnN0IGlzVGV4dD1yZXF1ZXN0LnJlc291cmNlVHlwZSgpLmlzVGV4dFR5cGUoKTtjb25zdCBjb250ZW50RGF0YT17ZXJyb3I6bnVsbCxjb250ZW50Om51bGwsZW5jb2RlZDohaXNUZXh0fTtjb25zdCByZXNwb25zZT1hd2FpdCB0aGlzLl9jYWNoZS5yZXF1ZXN0Q2FjaGVkUmVzcG9uc2UocmVxdWVzdC51cmwoKSk7aWYocmVzcG9uc2UpCmNvbnRlbnREYXRhLmNvbnRlbnQ9aXNUZXh0P3dpbmRvdy5hdG9iKHJlc3BvbnNlLmJvZHkpOnJlc3BvbnNlLmJvZHk7cmV0dXJuIGNvbnRlbnREYXRhO30KX3VwZGF0ZWRGb3JUZXN0KCl7fX07UmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJDYWNoZVZpZXcuX3ByZXZpZXdTeW1ib2w9U3ltYm9sKCdwcmV2aWV3Jyk7UmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJDYWNoZVZpZXcuX1JFU1BPTlNFX0NBQ0hFX1NJWkU9MTA7UmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJDYWNoZVZpZXcuRGF0YUdyaWROb2RlPWNsYXNzIGV4dGVuZHMgRGF0YUdyaWQuRGF0YUdyaWROb2Rle2NvbnN0cnVjdG9yKHJlcXVlc3Qpe3N1cGVyKHJlcXVlc3QpO3RoaXMuX3BhdGg9Q29tbW9uLlBhcnNlZFVSTC5leHRyYWN0UGF0aChyZXF1ZXN0LnVybCgpKTtpZighdGhpcy5fcGF0aCkKdGhpcy5fcGF0aD1yZXF1ZXN0LnVybCgpO2lmKHRoaXMuX3BhdGgubGVuZ3RoPjEmJnRoaXMuX3BhdGguc3RhcnRzV2l0aCgnLycpKQp0aGlzLl9wYXRoPXRoaXMuX3BhdGguc3Vic3RyaW5nKDEpO3RoaXMuX3JlcXVlc3Q9cmVxdWVzdDt9CmNyZWF0ZUNlbGwoY29sdW1uSWQpe2NvbnN0IGNlbGw9dGhpcy5jcmVhdGVURChjb2x1bW5JZCk7bGV0IHZhbHVlO2lmKGNvbHVtbklkPT09J3BhdGgnKQp2YWx1ZT10aGlzLl9wYXRoO2Vsc2UgaWYoY29sdW1uSWQ9PT0nY29udGVudFR5cGUnKQp2YWx1ZT10aGlzLl9yZXF1ZXN0Lm1pbWVUeXBlO2Vsc2UgaWYoY29sdW1uSWQ9PT0nY29udGVudExlbmd0aCcpCnZhbHVlPSh0aGlzLl9yZXF1ZXN0LnJlc291cmNlU2l6ZXwwKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTtlbHNlIGlmKGNvbHVtbklkPT09J3Jlc3BvbnNlVGltZScpCnZhbHVlPW5ldyBEYXRlKHRoaXMuX3JlcXVlc3QuZW5kVGltZSoxMDAwKS50b0xvY2FsZVN0cmluZygpO0RhdGFHcmlkLkRhdGFHcmlkLnNldEVsZW1lbnRUZXh0KGNlbGwsdmFsdWV8fCcnLHRydWUpO3JldHVybiBjZWxsO319O1Jlc291cmNlcy5TZXJ2aWNlV29ya2VyQ2FjaGVWaWV3LlJlcXVlc3RWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihyZXF1ZXN0KXtzdXBlcigpO3RoaXMuX3RhYmJlZFBhbmU9bmV3IFVJLlRhYmJlZFBhbmUoKTt0aGlzLl90YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiU2VsZWN0ZWQsdGhpcy5fdGFiU2VsZWN0ZWQsdGhpcyk7dGhpcy5fcmVzb3VyY2VWaWV3VGFiU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnY2FjaGVTdG9yYWdlVmlld1RhYicsJ3ByZXZpZXcnKTt0aGlzLl90YWJiZWRQYW5lLmFwcGVuZFRhYignaGVhZGVycycsQ29tbW9uLlVJU3RyaW5nKCdIZWFkZXJzJyksbmV3IE5ldHdvcmsuUmVxdWVzdEhlYWRlcnNWaWV3KHJlcXVlc3QpKTt0aGlzLl90YWJiZWRQYW5lLmFwcGVuZFRhYigncHJldmlldycsQ29tbW9uLlVJU3RyaW5nKCdQcmV2aWV3JyksbmV3IE5ldHdvcmsuUmVxdWVzdFByZXZpZXdWaWV3KHJlcXVlc3QpKTt0aGlzLl90YWJiZWRQYW5lLnNob3codGhpcy5lbGVtZW50KTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTt0aGlzLl9zZWxlY3RUYWIoKTt9Cl9zZWxlY3RUYWIodGFiSWQpe2lmKCF0YWJJZCkKdGFiSWQ9dGhpcy5fcmVzb3VyY2VWaWV3VGFiU2V0dGluZy5nZXQoKTtpZighdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIodGFiSWQpKQp0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYignaGVhZGVycycpO30KX3RhYlNlbGVjdGVkKGV2ZW50KXtpZighZXZlbnQuZGF0YS5pc1VzZXJHZXN0dXJlKQpyZXR1cm47dGhpcy5fcmVzb3VyY2VWaWV3VGFiU2V0dGluZy5zZXQoZXZlbnQuZGF0YS50YWJJZCk7fX07O1Jlc291cmNlcy5TZXJ2aWNlV29ya2Vyc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdyZXNvdXJjZXMvc2VydmljZVdvcmtlcnNWaWV3LmNzcycpO3RoaXMuX2N1cnJlbnRXb3JrZXJzVmlldz1uZXcgVUkuUmVwb3J0VmlldyhDb21tb24uVUlTdHJpbmcoJ1NlcnZpY2UgV29ya2VycycpKTt0aGlzLl9jdXJyZW50V29ya2Vyc1ZpZXcuc2V0Qm9keVNjcm9sbGFibGUoZmFsc2UpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VydmljZS13b3JrZXItbGlzdCcpO3RoaXMuX2N1cnJlbnRXb3JrZXJzVmlldy5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO3RoaXMuX2N1cnJlbnRXb3JrZXJzVmlldy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlcnZpY2Utd29ya2Vycy10aGlzLW9yaWdpbicpO3RoaXMuX3Rvb2xiYXI9dGhpcy5fY3VycmVudFdvcmtlcnNWaWV3LmNyZWF0ZVRvb2xiYXIoKTt0aGlzLl90b29sYmFyLm1ha2VXcmFwcGFibGUodHJ1ZSk7dGhpcy5fc2VjdGlvbnM9bmV3IE1hcCgpO3RoaXMuX21hbmFnZXI9bnVsbDt0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXI9bnVsbDt0aGlzLl9maWx0ZXJUaHJvdHRsZXI9bmV3IENvbW1vbi5UaHJvdHRsZXIoMzAwKTt0aGlzLl9vdGhlcldvcmtlcnM9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VydmljZS13b3JrZXJzLW90aGVyLW9yaWdpbicpO3RoaXMuX290aGVyU1dGaWx0ZXI9dGhpcy5fb3RoZXJXb3JrZXJzLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXJ2aWNlLXdvcmtlci1maWx0ZXInKTt0aGlzLl9vdGhlclNXRmlsdGVyLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLDApO3RoaXMuX290aGVyU1dGaWx0ZXIuc2V0QXR0cmlidXRlKCdyb2xlJywnc3dpdGNoJyk7dGhpcy5fb3RoZXJTV0ZpbHRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsZmFsc2UpO3RoaXMuX290aGVyU1dGaWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZXZlbnQ9PntpZihpc0VudGVyS2V5KGV2ZW50KXx8ZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5TcGFjZS5jb2RlKQp0aGlzLl90b2dnbGVGaWx0ZXIoKTt9KTtjb25zdCBmaWx0ZXJMYWJlbD10aGlzLl9vdGhlclNXRmlsdGVyLmNyZWF0ZUNoaWxkKCdsYWJlbCcsJ3NlcnZpY2Utd29ya2VyLWZpbHRlci1sYWJlbCcpO2ZpbHRlckxhYmVsLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnU2VydmljZSB3b3JrZXJzIGZyb20gb3RoZXIgZG9tYWlucycpO2ZpbHRlckxhYmVsLnNldEF0dHJpYnV0ZSgnZm9yJywnZXhwYW5kLWFsbCcpO2ZpbHRlckxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+dGhpcy5fdG9nZ2xlRmlsdGVyKCkpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3NlcnZpY2Utd29ya2VyLWZpbHRlci10b29sYmFyJyx0aGlzLl9vdGhlclNXRmlsdGVyKTt0aGlzLl9maWx0ZXI9bmV3IFVJLlRvb2xiYXJJbnB1dCgnRmlsdGVyJywxKTt0aGlzLl9maWx0ZXIuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFySW5wdXQuRXZlbnQuVGV4dENoYW5nZWQsKCk9PnRoaXMuX2ZpbHRlckNoYW5nZWQoKSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9maWx0ZXIpO3RoaXMuX290aGVyV29ya2Vyc1ZpZXc9bmV3IFVJLlJlcG9ydFZpZXcoKTt0aGlzLl9vdGhlcldvcmtlcnNWaWV3LnNldEJvZHlTY3JvbGxhYmxlKGZhbHNlKTt0aGlzLl9vdGhlcldvcmtlcnNWaWV3LnNob3codGhpcy5fb3RoZXJXb3JrZXJzKTt0aGlzLl9vdGhlcldvcmtlcnNWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VydmljZS13b3JrZXJzLWZvci1vdGhlci1vcmlnaW5zJyk7dGhpcy5fdXBkYXRlQ29sbGFwc2VkU3R5bGUoKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKE1vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5jcmVhdGVPZmZsaW5lVG9vbGJhckNoZWNrYm94KCkpO2NvbnN0IHVwZGF0ZU9uUmVsb2FkU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnc2VydmljZVdvcmtlclVwZGF0ZU9uUmVsb2FkJyxmYWxzZSk7dXBkYXRlT25SZWxvYWRTZXR0aW5nLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnVXBkYXRlIG9uIHJlbG9hZCcpKTtjb25zdCBmb3JjZVVwZGF0ZT1uZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveCh1cGRhdGVPblJlbG9hZFNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdGb3JjZSB1cGRhdGUgU2VydmljZSBXb3JrZXIgb24gcGFnZSByZWxvYWQnKSk7dGhpcy5fdG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShmb3JjZVVwZGF0ZSk7Y29uc3QgYnlwYXNzU2VydmljZVdvcmtlclNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ2J5cGFzc1NlcnZpY2VXb3JrZXInLGZhbHNlKTtieXBhc3NTZXJ2aWNlV29ya2VyU2V0dGluZy5zZXRUaXRsZShDb21tb24uVUlTdHJpbmcoJ0J5cGFzcyBmb3IgbmV0d29yaycpKTtjb25zdCBmYWxsYmFja1RvTmV0d29yaz1uZXcgVUkuVG9vbGJhclNldHRpbmdDaGVja2JveChieXBhc3NTZXJ2aWNlV29ya2VyU2V0dGluZyxDb21tb24uVUlTdHJpbmcoJ0J5cGFzcyBTZXJ2aWNlIFdvcmtlciBhbmQgbG9hZCByZXNvdXJjZXMgZnJvbSB0aGUgbmV0d29yaycpKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGZhbGxiYWNrVG9OZXR3b3JrKTt0aGlzLl9ldmVudExpc3RlbmVycz1uZXcgTWFwKCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuU2VydmljZVdvcmtlck1hbmFnZXIsdGhpcyk7dGhpcy5fdXBkYXRlTGlzdFZpc2liaWxpdHkoKTt9Cm1vZGVsQWRkZWQoc2VydmljZVdvcmtlck1hbmFnZXIpe2lmKHRoaXMuX21hbmFnZXIpCnJldHVybjt0aGlzLl9tYW5hZ2VyPXNlcnZpY2VXb3JrZXJNYW5hZ2VyO3RoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlcj1zZXJ2aWNlV29ya2VyTWFuYWdlci50YXJnZXQoKS5tb2RlbChTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyKTtmb3IoY29uc3QgcmVnaXN0cmF0aW9uIG9mIHRoaXMuX21hbmFnZXIucmVnaXN0cmF0aW9ucygpLnZhbHVlcygpKQp0aGlzLl91cGRhdGVSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uKTt0aGlzLl9ldmVudExpc3RlbmVycy5zZXQoc2VydmljZVdvcmtlck1hbmFnZXIsW3RoaXMuX21hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VydmljZVdvcmtlck1hbmFnZXIuRXZlbnRzLlJlZ2lzdHJhdGlvblVwZGF0ZWQsdGhpcy5fcmVnaXN0cmF0aW9uVXBkYXRlZCx0aGlzKSx0aGlzLl9tYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlcnZpY2VXb3JrZXJNYW5hZ2VyLkV2ZW50cy5SZWdpc3RyYXRpb25EZWxldGVkLHRoaXMuX3JlZ2lzdHJhdGlvbkRlbGV0ZWQsdGhpcyksdGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlNlY3VyaXR5T3JpZ2luTWFuYWdlci5FdmVudHMuU2VjdXJpdHlPcmlnaW5BZGRlZCx0aGlzLl91cGRhdGVTZWN0aW9uVmlzaWJpbGl0eSx0aGlzKSx0aGlzLl9zZWN1cml0eU9yaWdpbk1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLkV2ZW50cy5TZWN1cml0eU9yaWdpblJlbW92ZWQsdGhpcy5fdXBkYXRlU2VjdGlvblZpc2liaWxpdHksdGhpcyksXSk7fQptb2RlbFJlbW92ZWQoc2VydmljZVdvcmtlck1hbmFnZXIpe2lmKCF0aGlzLl9tYW5hZ2VyfHx0aGlzLl9tYW5hZ2VyIT09c2VydmljZVdvcmtlck1hbmFnZXIpCnJldHVybjtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KHNlcnZpY2VXb3JrZXJNYW5hZ2VyKSk7dGhpcy5fZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKHNlcnZpY2VXb3JrZXJNYW5hZ2VyKTt0aGlzLl9tYW5hZ2VyPW51bGw7dGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyPW51bGw7fQpfdXBkYXRlU2VjdGlvblZpc2liaWxpdHkoKXtsZXQgaGFzT3RoZXJzPWZhbHNlO2xldCBoYXNUaGlzPWZhbHNlO2NvbnN0IG1vdmVkU2VjdGlvbnM9W107Zm9yKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMudmFsdWVzKCkpe2NvbnN0IGV4cGVjdGVkVmlldz10aGlzLl9nZXRSZXBvcnRWaWV3Rm9yT3JpZ2luKHNlY3Rpb24uX3JlZ2lzdHJhdGlvbi5zZWN1cml0eU9yaWdpbik7aGFzT3RoZXJzfD1leHBlY3RlZFZpZXc9PT10aGlzLl9vdGhlcldvcmtlcnNWaWV3O2hhc1RoaXN8PWV4cGVjdGVkVmlldz09PXRoaXMuX2N1cnJlbnRXb3JrZXJzVmlldztpZihzZWN0aW9uLl9zZWN0aW9uLnBhcmVudFdpZGdldCgpIT09ZXhwZWN0ZWRWaWV3KQptb3ZlZFNlY3Rpb25zLnB1c2goc2VjdGlvbik7fQpmb3IoY29uc3Qgc2VjdGlvbiBvZiBtb3ZlZFNlY3Rpb25zKXtjb25zdCByZWdpc3RyYXRpb249c2VjdGlvbi5fcmVnaXN0cmF0aW9uO3RoaXMuX3JlbW92ZVJlZ2lzdHJhdGlvbkZyb21MaXN0KHJlZ2lzdHJhdGlvbik7dGhpcy5fdXBkYXRlUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbix0cnVlKTt9CmNvbnN0IHNjb3Jlcj1uZXcgU291cmNlcy5GaWxlUGF0aFNjb3JlRnVuY3Rpb24odGhpcy5fZmlsdGVyLnZhbHVlKCkpO3RoaXMuX290aGVyV29ya2Vyc1ZpZXcuc29ydFNlY3Rpb25zKChhLGIpPT57Y29uc3QgY21wPXNjb3Jlci5zY29yZShiLnRpdGxlKCksbnVsbCktc2NvcmVyLnNjb3JlKGEudGl0bGUoKSxudWxsKTtyZXR1cm4gY21wPT09MD9hLnRpdGxlKCkubG9jYWxlQ29tcGFyZShiLnRpdGxlKCkpOmNtcDt9KTtmb3IoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9zZWN0aW9ucy52YWx1ZXMoKSl7aWYoc2VjdGlvbi5fc2VjdGlvbi5wYXJlbnRXaWRnZXQoKT09PXRoaXMuX2N1cnJlbnRXb3JrZXJzVmlld3x8dGhpcy5faXNSZWdpc3RyYXRpb25WaXNpYmxlKHNlY3Rpb24uX3JlZ2lzdHJhdGlvbikpCnNlY3Rpb24uX3NlY3Rpb24uc2hvd1dpZGdldCgpO2Vsc2UKc2VjdGlvbi5fc2VjdGlvbi5oaWRlV2lkZ2V0KCk7fQp0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3NlcnZpY2Utd29ya2VyLWhhcy1jdXJyZW50JyxoYXNUaGlzKTt0aGlzLl9vdGhlcldvcmtlcnMuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhaGFzT3RoZXJzKTt0aGlzLl91cGRhdGVMaXN0VmlzaWJpbGl0eSgpO30KX3JlZ2lzdHJhdGlvblVwZGF0ZWQoZXZlbnQpe2NvbnN0IHJlZ2lzdHJhdGlvbj0oZXZlbnQuZGF0YSk7dGhpcy5fdXBkYXRlUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbik7dGhpcy5fZ2NSZWdpc3RyYXRpb25zKCk7fQpfZ2NSZWdpc3RyYXRpb25zKCl7bGV0IGhhc05vbkRlbGV0ZWRSZWdpc3RyYXRpb25zPWZhbHNlO2NvbnN0IHNlY3VyaXR5T3JpZ2lucz1uZXcgU2V0KHRoaXMuX3NlY3VyaXR5T3JpZ2luTWFuYWdlci5zZWN1cml0eU9yaWdpbnMoKSk7Zm9yKGNvbnN0IHJlZ2lzdHJhdGlvbiBvZiB0aGlzLl9tYW5hZ2VyLnJlZ2lzdHJhdGlvbnMoKS52YWx1ZXMoKSl7aWYoIXNlY3VyaXR5T3JpZ2lucy5oYXMocmVnaXN0cmF0aW9uLnNlY3VyaXR5T3JpZ2luKSYmIXRoaXMuX2lzUmVnaXN0cmF0aW9uVmlzaWJsZShyZWdpc3RyYXRpb24pKQpjb250aW51ZTtpZighcmVnaXN0cmF0aW9uLmNhbkJlUmVtb3ZlZCgpKXtoYXNOb25EZWxldGVkUmVnaXN0cmF0aW9ucz10cnVlO2JyZWFrO319CmlmKCFoYXNOb25EZWxldGVkUmVnaXN0cmF0aW9ucykKcmV0dXJuO2Zvcihjb25zdCByZWdpc3RyYXRpb24gb2YgdGhpcy5fbWFuYWdlci5yZWdpc3RyYXRpb25zKCkudmFsdWVzKCkpe2NvbnN0IHZpc2libGU9c2VjdXJpdHlPcmlnaW5zLmhhcyhyZWdpc3RyYXRpb24uc2VjdXJpdHlPcmlnaW4pfHx0aGlzLl9pc1JlZ2lzdHJhdGlvblZpc2libGUocmVnaXN0cmF0aW9uKTtpZighdmlzaWJsZSYmcmVnaXN0cmF0aW9uLmNhbkJlUmVtb3ZlZCgpKQp0aGlzLl9yZW1vdmVSZWdpc3RyYXRpb25Gcm9tTGlzdChyZWdpc3RyYXRpb24pO319Cl9nZXRSZXBvcnRWaWV3Rm9yT3JpZ2luKG9yaWdpbil7aWYodGhpcy5fc2VjdXJpdHlPcmlnaW5NYW5hZ2VyLnNlY3VyaXR5T3JpZ2lucygpLmluY2x1ZGVzKG9yaWdpbikpCnJldHVybiB0aGlzLl9jdXJyZW50V29ya2Vyc1ZpZXc7ZWxzZQpyZXR1cm4gdGhpcy5fb3RoZXJXb3JrZXJzVmlldzt9Cl91cGRhdGVSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLHNraXBVcGRhdGUpe2xldCBzZWN0aW9uPXRoaXMuX3NlY3Rpb25zLmdldChyZWdpc3RyYXRpb24pO2lmKCFzZWN0aW9uKXtjb25zdCB0aXRsZT1SZXNvdXJjZXMuU2VydmljZVdvcmtlcnNWaWV3Ll9kaXNwbGF5U2NvcGVVUkwocmVnaXN0cmF0aW9uLnNjb3BlVVJMKTtzZWN0aW9uPW5ldyBSZXNvdXJjZXMuU2VydmljZVdvcmtlcnNWaWV3LlNlY3Rpb24oKHRoaXMuX21hbmFnZXIpLHRoaXMuX2dldFJlcG9ydFZpZXdGb3JPcmlnaW4ocmVnaXN0cmF0aW9uLnNlY3VyaXR5T3JpZ2luKS5hcHBlbmRTZWN0aW9uKHRpdGxlKSxyZWdpc3RyYXRpb24pO3RoaXMuX3NlY3Rpb25zLnNldChyZWdpc3RyYXRpb24sc2VjdGlvbik7fQppZihza2lwVXBkYXRlKQpyZXR1cm47dGhpcy5fdXBkYXRlU2VjdGlvblZpc2liaWxpdHkoKTtzZWN0aW9uLl9zY2hlZHVsZVVwZGF0ZSgpO30KX3JlZ2lzdHJhdGlvbkRlbGV0ZWQoZXZlbnQpe2NvbnN0IHJlZ2lzdHJhdGlvbj0oZXZlbnQuZGF0YSk7dGhpcy5fcmVtb3ZlUmVnaXN0cmF0aW9uRnJvbUxpc3QocmVnaXN0cmF0aW9uKTt9Cl9yZW1vdmVSZWdpc3RyYXRpb25Gcm9tTGlzdChyZWdpc3RyYXRpb24pe2NvbnN0IHNlY3Rpb249dGhpcy5fc2VjdGlvbnMuZ2V0KHJlZ2lzdHJhdGlvbik7aWYoc2VjdGlvbikKc2VjdGlvbi5fc2VjdGlvbi5kZXRhY2goKTt0aGlzLl9zZWN0aW9ucy5kZWxldGUocmVnaXN0cmF0aW9uKTt0aGlzLl91cGRhdGVTZWN0aW9uVmlzaWJpbGl0eSgpO30KX2lzUmVnaXN0cmF0aW9uVmlzaWJsZShyZWdpc3RyYXRpb24pe2NvbnN0IGZpbHRlclN0cmluZz10aGlzLl9maWx0ZXIudmFsdWUoKTtpZighZmlsdGVyU3RyaW5nfHwhcmVnaXN0cmF0aW9uLnNjb3BlVVJMKQpyZXR1cm4gdHJ1ZTtjb25zdCByZWdleD1TdHJpbmcuZmlsdGVyUmVnZXgoZmlsdGVyU3RyaW5nKTtyZXR1cm4gcmVnaXN0cmF0aW9uLnNjb3BlVVJMLm1hdGNoKHJlZ2V4KTt9Cl9maWx0ZXJDaGFuZ2VkKCl7dGhpcy5fdXBkYXRlQ29sbGFwc2VkU3R5bGUoKTt0aGlzLl9maWx0ZXJUaHJvdHRsZXIuc2NoZWR1bGUoKCk9PlByb21pc2UucmVzb2x2ZSh0aGlzLl91cGRhdGVTZWN0aW9uVmlzaWJpbGl0eSgpKSk7fQpfdXBkYXRlQ29sbGFwc2VkU3R5bGUoKXtjb25zdCBleHBhbmRlZD10aGlzLl9vdGhlclNXRmlsdGVyLmdldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJyk9PT0ndHJ1ZSc7dGhpcy5fb3RoZXJXb3JrZXJzLmNsYXNzTGlzdC50b2dnbGUoJ3NlcnZpY2Utd29ya2VyLWZpbHRlci1jb2xsYXBzZWQnLCFleHBhbmRlZCk7aWYoZXhwYW5kZWQpCnRoaXMuX290aGVyV29ya2Vyc1ZpZXcuc2hvd1dpZGdldCgpO2Vsc2UKdGhpcy5fb3RoZXJXb3JrZXJzVmlldy5oaWRlV2lkZ2V0KCk7dGhpcy5fb3RoZXJXb3JrZXJzVmlldy5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTt9CnN0YXRpYyBfZGlzcGxheVNjb3BlVVJMKHNjb3BlVVJMKXtjb25zdCBwYXJzZWRVUkw9c2NvcGVVUkwuYXNQYXJzZWRVUkwoKTtsZXQgcGF0aD1wYXJzZWRVUkwucGF0aDtpZihwYXRoLmVuZHNXaXRoKCcvJykpCnBhdGg9cGF0aC5zdWJzdHJpbmcoMCxwYXRoLmxlbmd0aC0xKTtyZXR1cm4gcGFyc2VkVVJMLmhvc3QrcGF0aDt9Cl91cGRhdGVMaXN0VmlzaWJpbGl0eSgpe3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc2VydmljZS13b3JrZXItbGlzdC1lbXB0eScsdGhpcy5fc2VjdGlvbnMuc2l6ZT09PTApO30KX3RvZ2dsZUZpbHRlcigpe2NvbnN0IGV4cGFuZGVkPXRoaXMuX290aGVyU1dGaWx0ZXIuZ2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnKT09PSd0cnVlJzt0aGlzLl9vdGhlclNXRmlsdGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywhZXhwYW5kZWQpO3RoaXMuX2ZpbHRlckNoYW5nZWQoKTt9fTtSZXNvdXJjZXMuU2VydmljZVdvcmtlcnNWaWV3LlNlY3Rpb249Y2xhc3N7Y29uc3RydWN0b3IobWFuYWdlcixzZWN0aW9uLHJlZ2lzdHJhdGlvbil7dGhpcy5fbWFuYWdlcj1tYW5hZ2VyO3RoaXMuX3NlY3Rpb249c2VjdGlvbjt0aGlzLl9yZWdpc3RyYXRpb249cmVnaXN0cmF0aW9uO3RoaXMuX2ZpbmdlcnByaW50PW51bGw7dGhpcy5fcHVzaE5vdGlmaWNhdGlvbkRhdGFTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ3B1c2hEYXRhJyxDb21tb24uVUlTdHJpbmcoJ1Rlc3QgcHVzaCBtZXNzYWdlIGZyb20gRGV2VG9vbHMuJykpO3RoaXMuX3N5bmNUYWdOYW1lU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlTG9jYWxTZXR0aW5nKCdzeW5jVGFnTmFtZScsJ3Rlc3QtdGFnLWZyb20tZGV2dG9vbHMnKTt0aGlzLl90b29sYmFyPXNlY3Rpb24uY3JlYXRlVG9vbGJhcigpO3RoaXMuX3Rvb2xiYXIucmVuZGVyQXNMaW5rcygpO3RoaXMuX3VwZGF0ZUJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1VwZGF0ZScpLHVuZGVmaW5lZCxDb21tb24uVUlTdHJpbmcoJ1VwZGF0ZScpKTt0aGlzLl91cGRhdGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl91cGRhdGVCdXR0b25DbGlja2VkLHRoaXMpO3RoaXMuX3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fdXBkYXRlQnV0dG9uKTt0aGlzLl9kZWxldGVCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdVbnJlZ2lzdGVyIHNlcnZpY2Ugd29ya2VyJyksdW5kZWZpbmVkLENvbW1vbi5VSVN0cmluZygnVW5yZWdpc3RlcicpKTt0aGlzLl9kZWxldGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl91bnJlZ2lzdGVyQnV0dG9uQ2xpY2tlZCx0aGlzKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2RlbGV0ZUJ1dHRvbik7dGhpcy5fc291cmNlRmllbGQ9dGhpcy5fd3JhcFdpZGdldCh0aGlzLl9zZWN0aW9uLmFwcGVuZEZpZWxkKENvbW1vbi5VSVN0cmluZygnU291cmNlJykpKTt0aGlzLl9zdGF0dXNGaWVsZD10aGlzLl93cmFwV2lkZ2V0KHRoaXMuX3NlY3Rpb24uYXBwZW5kRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdTdGF0dXMnKSkpO3RoaXMuX2NsaWVudHNGaWVsZD10aGlzLl93cmFwV2lkZ2V0KHRoaXMuX3NlY3Rpb24uYXBwZW5kRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdDbGllbnRzJykpKTt0aGlzLl9jcmVhdGVTeW5jTm90aWZpY2F0aW9uRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdQdXNoJyksdGhpcy5fcHVzaE5vdGlmaWNhdGlvbkRhdGFTZXR0aW5nLmdldCgpLENvbW1vbi5VSVN0cmluZygnUHVzaCBkYXRhJyksdGhpcy5fcHVzaC5iaW5kKHRoaXMpKTt0aGlzLl9jcmVhdGVTeW5jTm90aWZpY2F0aW9uRmllbGQoQ29tbW9uLlVJU3RyaW5nKCdTeW5jJyksdGhpcy5fc3luY1RhZ05hbWVTZXR0aW5nLmdldCgpLENvbW1vbi5VSVN0cmluZygnU3luYyB0YWcnKSx0aGlzLl9zeW5jLmJpbmQodGhpcykpO3RoaXMuX2xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoKTt0aGlzLl9jbGllbnRJbmZvQ2FjaGU9bmV3IE1hcCgpO3RoaXMuX3Rocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcig1MDApO30KX2NyZWF0ZVN5bmNOb3RpZmljYXRpb25GaWVsZChsYWJlbCxpbml0aWFsVmFsdWUscGxhY2Vob2xkZXIsY2FsbGJhY2spe2NvbnN0IGZvcm09dGhpcy5fd3JhcFdpZGdldCh0aGlzLl9zZWN0aW9uLmFwcGVuZEZpZWxkKGxhYmVsKSkuY3JlYXRlQ2hpbGQoJ2Zvcm0nLCdzZXJ2aWNlLXdvcmtlci1lZGl0b3Itd2l0aC1idXR0b24nKTtjb25zdCBlZGl0b3I9Zm9ybS5jcmVhdGVDaGlsZCgnaW5wdXQnLCdzb3VyY2UtY29kZSBzZXJ2aWNlLXdvcmtlci1ub3RpZmljYXRpb24tZWRpdG9yJyk7Y29uc3QgYnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24obGFiZWwpO2J1dHRvbi50eXBlPSdzdWJtaXQnO2Zvcm0uYXBwZW5kQ2hpbGQoYnV0dG9uKTtlZGl0b3IudmFsdWU9aW5pdGlhbFZhbHVlO2VkaXRvci5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjtmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsZT0+e2NhbGxiYWNrKGVkaXRvci52YWx1ZXx8JycpO2UuY29uc3VtZSh0cnVlKTt9KTt9Cl9zY2hlZHVsZVVwZGF0ZSgpe2lmKFJlc291cmNlcy5TZXJ2aWNlV29ya2Vyc1ZpZXcuX25vVGhyb3R0bGUpe3RoaXMuX3VwZGF0ZSgpO3JldHVybjt9CnRoaXMuX3Rocm90dGxlci5zY2hlZHVsZSh0aGlzLl91cGRhdGUuYmluZCh0aGlzKSk7fQpfdGFyZ2V0Rm9yVmVyc2lvbklkKHZlcnNpb25JZCl7Y29uc3QgdmVyc2lvbj10aGlzLl9tYW5hZ2VyLmZpbmRWZXJzaW9uKHZlcnNpb25JZCk7aWYoIXZlcnNpb258fCF2ZXJzaW9uLnRhcmdldElkKQpyZXR1cm4gbnVsbDtyZXR1cm4gU0RLLnRhcmdldE1hbmFnZXIudGFyZ2V0QnlJZCh2ZXJzaW9uLnRhcmdldElkKTt9Cl9hZGRWZXJzaW9uKHZlcnNpb25zU3RhY2ssaWNvbixsYWJlbCl7Y29uc3QgaW5zdGFsbGluZ0VudHJ5PXZlcnNpb25zU3RhY2suY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlcnZpY2Utd29ya2VyLXZlcnNpb24nKTtpbnN0YWxsaW5nRW50cnkuY3JlYXRlQ2hpbGQoJ2RpdicsaWNvbik7aW5zdGFsbGluZ0VudHJ5LmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9bGFiZWw7cmV0dXJuIGluc3RhbGxpbmdFbnRyeTt9Cl91cGRhdGVDbGllbnRzRmllbGQodmVyc2lvbil7dGhpcy5fY2xpZW50c0ZpZWxkLnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fc2VjdGlvbi5zZXRGaWVsZFZpc2libGUoQ29tbW9uLlVJU3RyaW5nKCdDbGllbnRzJyksdmVyc2lvbi5jb250cm9sbGVkQ2xpZW50cy5sZW5ndGgpO2Zvcihjb25zdCBjbGllbnQgb2YgdmVyc2lvbi5jb250cm9sbGVkQ2xpZW50cyl7Y29uc3QgY2xpZW50TGFiZWxUZXh0PXRoaXMuX2NsaWVudHNGaWVsZC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VydmljZS13b3JrZXItY2xpZW50Jyk7aWYodGhpcy5fY2xpZW50SW5mb0NhY2hlLmhhcyhjbGllbnQpKXt0aGlzLl91cGRhdGVDbGllbnRJbmZvKGNsaWVudExhYmVsVGV4dCwodGhpcy5fY2xpZW50SW5mb0NhY2hlLmdldChjbGllbnQpKSk7fQp0aGlzLl9tYW5hZ2VyLnRhcmdldCgpLnRhcmdldEFnZW50KCkuZ2V0VGFyZ2V0SW5mbyhjbGllbnQpLnRoZW4odGhpcy5fb25DbGllbnRJbmZvLmJpbmQodGhpcyxjbGllbnRMYWJlbFRleHQpKTt9fQpfdXBkYXRlU291cmNlRmllbGQodmVyc2lvbil7dGhpcy5fc291cmNlRmllbGQucmVtb3ZlQ2hpbGRyZW4oKTtjb25zdCBmaWxlTmFtZT1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3ROYW1lKHZlcnNpb24uc2NyaXB0VVJMKTtjb25zdCBuYW1lPXRoaXMuX3NvdXJjZUZpZWxkLmNyZWF0ZUNoaWxkKCdkaXYnLCdyZXBvcnQtZmllbGQtdmFsdWUtZmlsZW5hbWUnKTtuYW1lLmFwcGVuZENoaWxkKENvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwodmVyc2lvbi5zY3JpcHRVUkwse3RleHQ6ZmlsZU5hbWV9KSk7aWYodGhpcy5fcmVnaXN0cmF0aW9uLmVycm9ycy5sZW5ndGgpe2NvbnN0IGVycm9yc0xhYmVsPVVJLmNyZWF0ZUxhYmVsKFN0cmluZyh0aGlzLl9yZWdpc3RyYXRpb24uZXJyb3JzLmxlbmd0aCksJ3NtYWxsaWNvbi1lcnJvcicpO2Vycm9yc0xhYmVsLmNsYXNzTGlzdC5hZGQoJ2xpbmsnKTtlcnJvcnNMYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PkNvbW1vbi5jb25zb2xlLnNob3coKSk7bmFtZS5hcHBlbmRDaGlsZChlcnJvcnNMYWJlbCk7fQp0aGlzLl9zb3VyY2VGaWVsZC5jcmVhdGVDaGlsZCgnZGl2JywncmVwb3J0LWZpZWxkLXZhbHVlLXN1YnRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdSZWNlaXZlZCAlcycsbmV3IERhdGUodmVyc2lvbi5zY3JpcHRSZXNwb25zZVRpbWUqMTAwMCkudG9Mb2NhbGVTdHJpbmcoKSk7fQpfdXBkYXRlKCl7Y29uc3QgZmluZ2VycHJpbnQ9dGhpcy5fcmVnaXN0cmF0aW9uLmZpbmdlcnByaW50KCk7aWYoZmluZ2VycHJpbnQ9PT10aGlzLl9maW5nZXJwcmludCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RoaXMuX2ZpbmdlcnByaW50PWZpbmdlcnByaW50O3RoaXMuX3Rvb2xiYXIuc2V0RW5hYmxlZCghdGhpcy5fcmVnaXN0cmF0aW9uLmlzRGVsZXRlZCk7Y29uc3QgdmVyc2lvbnM9dGhpcy5fcmVnaXN0cmF0aW9uLnZlcnNpb25zQnlNb2RlKCk7Y29uc3Qgc2NvcGVVUkw9UmVzb3VyY2VzLlNlcnZpY2VXb3JrZXJzVmlldy5fZGlzcGxheVNjb3BlVVJMKHRoaXMuX3JlZ2lzdHJhdGlvbi5zY29wZVVSTCk7Y29uc3QgdGl0bGU9dGhpcy5fcmVnaXN0cmF0aW9uLmlzRGVsZXRlZD9Db21tb24uVUlTdHJpbmcoJyVzIC0gZGVsZXRlZCcsc2NvcGVVUkwpOnNjb3BlVVJMO3RoaXMuX3NlY3Rpb24uc2V0VGl0bGUodGl0bGUpO2NvbnN0IGFjdGl2ZT12ZXJzaW9ucy5nZXQoU0RLLlNlcnZpY2VXb3JrZXJWZXJzaW9uLk1vZGVzLkFjdGl2ZSk7Y29uc3Qgd2FpdGluZz12ZXJzaW9ucy5nZXQoU0RLLlNlcnZpY2VXb3JrZXJWZXJzaW9uLk1vZGVzLldhaXRpbmcpO2NvbnN0IGluc3RhbGxpbmc9dmVyc2lvbnMuZ2V0KFNESy5TZXJ2aWNlV29ya2VyVmVyc2lvbi5Nb2Rlcy5JbnN0YWxsaW5nKTtjb25zdCByZWR1bmRhbnQ9dmVyc2lvbnMuZ2V0KFNESy5TZXJ2aWNlV29ya2VyVmVyc2lvbi5Nb2Rlcy5SZWR1bmRhbnQpO3RoaXMuX3N0YXR1c0ZpZWxkLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgdmVyc2lvbnNTdGFjaz10aGlzLl9zdGF0dXNGaWVsZC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VydmljZS13b3JrZXItdmVyc2lvbi1zdGFjaycpO3ZlcnNpb25zU3RhY2suY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlcnZpY2Utd29ya2VyLXZlcnNpb24tc3RhY2stYmFyJyk7aWYoYWN0aXZlKXt0aGlzLl91cGRhdGVTb3VyY2VGaWVsZChhY3RpdmUpO2NvbnN0IGFjdGl2ZUVudHJ5PXRoaXMuX2FkZFZlcnNpb24odmVyc2lvbnNTdGFjaywnc2VydmljZS13b3JrZXItYWN0aXZlLWNpcmNsZScsQ29tbW9uLlVJU3RyaW5nKCcjJXMgYWN0aXZhdGVkIGFuZCBpcyAlcycsYWN0aXZlLmlkLGFjdGl2ZS5ydW5uaW5nU3RhdHVzKSk7aWYoYWN0aXZlLmlzUnVubmluZygpfHxhY3RpdmUuaXNTdGFydGluZygpKXtjcmVhdGVMaW5rKGFjdGl2ZUVudHJ5LENvbW1vbi5VSVN0cmluZygnc3RvcCcpLHRoaXMuX3N0b3BCdXR0b25DbGlja2VkLmJpbmQodGhpcyxhY3RpdmUuaWQpKTtpZighdGhpcy5fdGFyZ2V0Rm9yVmVyc2lvbklkKGFjdGl2ZS5pZCkpCmNyZWF0ZUxpbmsoYWN0aXZlRW50cnksQ29tbW9uLlVJU3RyaW5nKCdpbnNwZWN0JyksdGhpcy5faW5zcGVjdEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzLGFjdGl2ZS5pZCkpO31lbHNlIGlmKGFjdGl2ZS5pc1N0YXJ0YWJsZSgpKXtjcmVhdGVMaW5rKGFjdGl2ZUVudHJ5LENvbW1vbi5VSVN0cmluZygnc3RhcnQnKSx0aGlzLl9zdGFydEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSk7fQp0aGlzLl91cGRhdGVDbGllbnRzRmllbGQoYWN0aXZlKTt9ZWxzZSBpZihyZWR1bmRhbnQpe3RoaXMuX3VwZGF0ZVNvdXJjZUZpZWxkKHJlZHVuZGFudCk7dGhpcy5fYWRkVmVyc2lvbih2ZXJzaW9uc1N0YWNrLCdzZXJ2aWNlLXdvcmtlci1yZWR1bmRhbnQtY2lyY2xlJyxDb21tb24uVUlTdHJpbmcoJyMlcyBpcyByZWR1bmRhbnQnLHJlZHVuZGFudC5pZCkpO3RoaXMuX3VwZGF0ZUNsaWVudHNGaWVsZChyZWR1bmRhbnQpO30KaWYod2FpdGluZyl7Y29uc3Qgd2FpdGluZ0VudHJ5PXRoaXMuX2FkZFZlcnNpb24odmVyc2lvbnNTdGFjaywnc2VydmljZS13b3JrZXItd2FpdGluZy1jaXJjbGUnLENvbW1vbi5VSVN0cmluZygnIyVzIHdhaXRpbmcgdG8gYWN0aXZhdGUnLHdhaXRpbmcuaWQpKTtjcmVhdGVMaW5rKHdhaXRpbmdFbnRyeSxDb21tb24uVUlTdHJpbmcoJ3NraXBXYWl0aW5nJyksdGhpcy5fc2tpcEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSk7d2FpdGluZ0VudHJ5LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXJ2aWNlLXdvcmtlci1zdWJ0aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUmVjZWl2ZWQgJXMnLG5ldyBEYXRlKHdhaXRpbmcuc2NyaXB0UmVzcG9uc2VUaW1lKjEwMDApLnRvTG9jYWxlU3RyaW5nKCkpO2lmKCF0aGlzLl90YXJnZXRGb3JWZXJzaW9uSWQod2FpdGluZy5pZCkmJih3YWl0aW5nLmlzUnVubmluZygpfHx3YWl0aW5nLmlzU3RhcnRpbmcoKSkpCmNyZWF0ZUxpbmsod2FpdGluZ0VudHJ5LENvbW1vbi5VSVN0cmluZygnaW5zcGVjdCcpLHRoaXMuX2luc3BlY3RCdXR0b25DbGlja2VkLmJpbmQodGhpcyx3YWl0aW5nLmlkKSk7fQppZihpbnN0YWxsaW5nKXtjb25zdCBpbnN0YWxsaW5nRW50cnk9dGhpcy5fYWRkVmVyc2lvbih2ZXJzaW9uc1N0YWNrLCdzZXJ2aWNlLXdvcmtlci1pbnN0YWxsaW5nLWNpcmNsZScsQ29tbW9uLlVJU3RyaW5nKCcjJXMgaW5zdGFsbGluZycsaW5zdGFsbGluZy5pZCkpO2luc3RhbGxpbmdFbnRyeS5jcmVhdGVDaGlsZCgnZGl2Jywnc2VydmljZS13b3JrZXItc3VidGl0bGUnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1JlY2VpdmVkICVzJyxuZXcgRGF0ZShpbnN0YWxsaW5nLnNjcmlwdFJlc3BvbnNlVGltZSoxMDAwKS50b0xvY2FsZVN0cmluZygpKTtpZighdGhpcy5fdGFyZ2V0Rm9yVmVyc2lvbklkKGluc3RhbGxpbmcuaWQpJiYoaW5zdGFsbGluZy5pc1J1bm5pbmcoKXx8aW5zdGFsbGluZy5pc1N0YXJ0aW5nKCkpKQpjcmVhdGVMaW5rKGluc3RhbGxpbmdFbnRyeSxDb21tb24uVUlTdHJpbmcoJ2luc3BlY3QnKSx0aGlzLl9pbnNwZWN0QnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMsaW5zdGFsbGluZy5pZCkpO30KZnVuY3Rpb24gY3JlYXRlTGluayhwYXJlbnQsdGl0bGUsbGlzdGVuZXIpe2NvbnN0IHNwYW49cGFyZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnbGluaycpO3NwYW4udGV4dENvbnRlbnQ9dGl0bGU7c3Bhbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsbGlzdGVuZXIsZmFsc2UpO3JldHVybiBzcGFuO30KcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KX3VucmVnaXN0ZXJCdXR0b25DbGlja2VkKGV2ZW50KXt0aGlzLl9tYW5hZ2VyLmRlbGV0ZVJlZ2lzdHJhdGlvbih0aGlzLl9yZWdpc3RyYXRpb24uaWQpO30KX3VwZGF0ZUJ1dHRvbkNsaWNrZWQoZXZlbnQpe3RoaXMuX21hbmFnZXIudXBkYXRlUmVnaXN0cmF0aW9uKHRoaXMuX3JlZ2lzdHJhdGlvbi5pZCk7fQpfcHVzaChkYXRhKXt0aGlzLl9wdXNoTm90aWZpY2F0aW9uRGF0YVNldHRpbmcuc2V0KGRhdGEpO3RoaXMuX21hbmFnZXIuZGVsaXZlclB1c2hNZXNzYWdlKHRoaXMuX3JlZ2lzdHJhdGlvbi5pZCxkYXRhKTt9Cl9zeW5jKHRhZyl7dGhpcy5fc3luY1RhZ05hbWVTZXR0aW5nLnNldCh0YWcpO3RoaXMuX21hbmFnZXIuZGlzcGF0Y2hTeW5jRXZlbnQodGhpcy5fcmVnaXN0cmF0aW9uLmlkLHRhZyx0cnVlKTt9Cl9vbkNsaWVudEluZm8oZWxlbWVudCx0YXJnZXRJbmZvKXtpZighdGFyZ2V0SW5mbykKcmV0dXJuO3RoaXMuX2NsaWVudEluZm9DYWNoZS5zZXQodGFyZ2V0SW5mby50YXJnZXRJZCx0YXJnZXRJbmZvKTt0aGlzLl91cGRhdGVDbGllbnRJbmZvKGVsZW1lbnQsdGFyZ2V0SW5mbyk7fQpfdXBkYXRlQ2xpZW50SW5mbyhlbGVtZW50LHRhcmdldEluZm8pe2lmKHRhcmdldEluZm8udHlwZSE9PSdwYWdlJyYmdGFyZ2V0SW5mby50eXBlPT09J2lmcmFtZScpe2VsZW1lbnQuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnV29ya2VyOiAlcycsdGFyZ2V0SW5mby51cmwpKTtyZXR1cm47fQplbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7ZWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQodGFyZ2V0SW5mby51cmwpO2NvbnN0IGZvY3VzTGFiZWw9ZWxlbWVudC5jcmVhdGVDaGlsZCgnbGFiZWwnLCdsaW5rJyk7Zm9jdXNMYWJlbC5jcmVhdGVUZXh0Q2hpbGQoJ2ZvY3VzJyk7Zm9jdXNMYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fYWN0aXZhdGVUYXJnZXQuYmluZCh0aGlzLHRhcmdldEluZm8udGFyZ2V0SWQpLHRydWUpO30KX2FjdGl2YXRlVGFyZ2V0KHRhcmdldElkKXt0aGlzLl9tYW5hZ2VyLnRhcmdldCgpLnRhcmdldEFnZW50KCkuYWN0aXZhdGVUYXJnZXQodGFyZ2V0SWQpO30KX3N0YXJ0QnV0dG9uQ2xpY2tlZCgpe3RoaXMuX21hbmFnZXIuc3RhcnRXb3JrZXIodGhpcy5fcmVnaXN0cmF0aW9uLnNjb3BlVVJMKTt9Cl9za2lwQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX21hbmFnZXIuc2tpcFdhaXRpbmcodGhpcy5fcmVnaXN0cmF0aW9uLnNjb3BlVVJMKTt9Cl9zdG9wQnV0dG9uQ2xpY2tlZCh2ZXJzaW9uSWQpe3RoaXMuX21hbmFnZXIuc3RvcFdvcmtlcih2ZXJzaW9uSWQpO30KX2luc3BlY3RCdXR0b25DbGlja2VkKHZlcnNpb25JZCl7dGhpcy5fbWFuYWdlci5pbnNwZWN0V29ya2VyKHZlcnNpb25JZCk7fQpfd3JhcFdpZGdldChjb250YWluZXIpe2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKGNvbnRhaW5lcik7VUkuYXBwZW5kU3R5bGUoc2hhZG93Um9vdCwncmVzb3VyY2VzL3NlcnZpY2VXb3JrZXJzVmlldy5jc3MnKTtjb25zdCBjb250ZW50RWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtzaGFkb3dSb290LmFwcGVuZENoaWxkKGNvbnRlbnRFbGVtZW50KTtyZXR1cm4gY29udGVudEVsZW1lbnQ7fX07O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvYXBwTWFuaWZlc3RWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi8qIyBzb3VyY2VVUkw9cmVzb3VyY2VzL2FwcE1hbmlmZXN0Vmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvY2xlYXJTdG9yYWdlVmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ucmVwb3J0LXJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uY2xlYXItc3RvcmFnZS1idXR0b24gLnJlcG9ydC1yb3cge1xuICAgIG1hcmdpbjogMCAwIDAgMjBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xufVxuXG4ubGluayB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLnJlcG9ydC1yb3c6aG92ZXIgLmxpbmsge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLnVzYWdlLWJyZWFrZG93bi1yb3cge1xuICAgIG1pbi13aWR0aDogZml0LWNvbnRlbnQ7XG59XG5cbi51c2FnZS1icmVha2Rvd24tbGVnZW5kLXJvdyB7XG4gICAgbWFyZ2luOiA1cHggYXV0bztcbn1cblxuLnVzYWdlLWJyZWFrZG93bi1sZWdlbmQtdGl0bGUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnVzYWdlLWJyZWFrZG93bi1sZWdlbmQtdmFsdWUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogNzBweDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnVzYWdlLWJyZWFrZG93bi1sZWdlbmQtc3dhdGNoIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDExcHg7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIG1hcmdpbjogMCA2cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLyojIHNvdXJjZVVSTD1yZXNvdXJjZXMvY2xlYXJTdG9yYWdlVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvaW5kZXhlZERCVmlld3MuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuICogZGlzdHJpYnV0aW9uLlxuICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5pbmRleGVkLWRiLWRhdGFiYXNlLXZpZXcge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xufVxuXG4uaW5kZXhlZC1kYi1kYXRhLXZpZXcgLmRhdGEtdmlldy10b29sYmFyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbn1cblxuLmluZGV4ZWQtZGItZGF0YS12aWV3IC5kYXRhLWdyaWQge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5pbmRleGVkLWRiLWRhdGEtdmlldyAuZGF0YS1ncmlkIC5kYXRhLWNvbnRhaW5lciB0cjpudGgtbGFzdC1jaGlsZCgxKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi5pbmRleGVkLWRiLWRhdGEtdmlldyAuZGF0YS1ncmlkIC5kYXRhLWNvbnRhaW5lciB0cjpudGgtbGFzdC1jaGlsZCgxKSB0ZCB7XG4gICAgYm9yZGVyOiAwO1xufVxuXG4uaW5kZXhlZC1kYi1kYXRhLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YS1jb250YWluZXIgdHI6bnRoLWxhc3QtY2hpbGQoMikgdGQge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhO1xufVxuXG4uaW5kZXhlZC1kYi1kYXRhLXZpZXcgLmRhdGEtZ3JpZDpmb2N1cyAuZGF0YS1jb250YWluZXIgdHIuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjZGRkZjU7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5pbmRleGVkLWRiLWRhdGEtdmlldyAuc2VjdGlvbixcbi5pbmRleGVkLWRiLWRhdGEtdmlldyAuc2VjdGlvbiA+IC5oZWFkZXIsXG4uaW5kZXhlZC1kYi1kYXRhLXZpZXcgLnNlY3Rpb24gPiAuaGVhZGVyIC50aXRsZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cbi5pbmRleGVkLWRiLWRhdGEtdmlldyAucHJpbWl0aXZlLXZhbHVlIHtcbiAgICBwYWRkaW5nLXRvcDogMXB4O1xufVxuXG4uaW5kZXhlZC1kYi1kYXRhLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YS1jb250YWluZXIgdGQgLnNlY3Rpb24gLmhlYWRlciAudGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmluZGV4ZWQtZGIta2V5LXBhdGgge1xuICAgIGNvbG9yOiByZ2IoMTk2LCAyNiwgMjIpO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICB1bmljb2RlLWJpZGk6IC13ZWJraXQtaXNvbGF0ZTtcbn1cblxuLnNvdXJjZS1jb2RlLmluZGV4ZWQtZGIta2V5LXBhdGgge1xuICAgIGZvbnQtc2l6ZTogdW5zZXQgIWltcG9ydGFudDtcbn1cblxuLnJlc291cmNlcy10b29sYmFyIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4vKiMgc291cmNlVVJMPXJlc291cmNlcy9pbmRleGVkREJWaWV3cy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvcmVzb3VyY2VzUGFuZWwuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoQykgMjAwOSBBbnRob255IFJpY2F1ZCA8cmlrQHdlYmtpdC5vcmc+XG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKlxuICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoXCJBcHBsZVwiKSBub3IgdGhlIG5hbWVzIG9mXG4gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5yZXNvdXJjZXMtdG9vbGJhciB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG59XG5cbi50b3AtcmVzb3VyY2VzLXRvb2xiYXIge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xufVxuXG5saS5zZWxlY3RlZCAuYmFzZS1zdG9yYWdlLXRyZWUtZWxlbWVudC1zdWJ0aXRsZSB7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uYmFzZS1zdG9yYWdlLXRyZWUtZWxlbWVudC1zdWJ0aXRsZSB7XG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XG4gICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbn1cblxuLnJlc291cmNlcy5wYW5lbCAuc3RhdHVzIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gICAgaGVpZ2h0OiAxNnB4O1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxZW07XG59XG5cbi5zdG9yYWdlLXZpZXcge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnN0b3JhZ2UtdmlldyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnN0b3JhZ2UtdmlldyAuZGF0YS1ncmlkOm5vdCguaW5saW5lKSB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5zdG9yYWdlLXZpZXcgLnN0b3JhZ2UtdGFibGUtZXJyb3Ige1xuICAgIGNvbG9yOiByZ2IoNjYlLCAzMyUsIDMzJSk7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc3RvcmFnZS12aWV3LnF1ZXJ5IHtcbiAgICBwYWRkaW5nOiAycHggMDtcbiAgICBvdmVyZmxvdy15OiBvdmVybGF5O1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cblxuLnN0b3JhZ2UtdmlldyAuZmlsdGVyLWJhciB7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG59XG5cbi5kYXRhYmFzZS1xdWVyeS1wcm9tcHQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMXB4IDIycHggMXB4IDI0cHg7XG59XG5cbi5kYXRhYmFzZS1xdWVyeS1wcm9tcHQge1xuICAgIG1pbi1oZWlnaHQ6IDE2cHg7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxuXG4ucHJvbXB0LWljb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBsZWZ0OiA3cHg7XG4gICAgdG9wOiA5cHg7XG4gICAgbWFyZ2luLXRvcDogLTdweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uZGF0YWJhc2UtcXVlcnktcHJvbXB0LWNvbnRhaW5lciAucHJvbXB0LWljb24ge1xuICAgIHRvcDogMTBweDtcbn1cblxuLmRhdGFiYXNlLXVzZXItcXVlcnkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDI0NSwgMjQ1LCAyNDUpO1xuICAgIHBhZGRpbmc6IDFweCAyMnB4IDFweCAyNHB4O1xuICAgIG1pbi1oZWlnaHQ6IDE2cHg7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5kYXRhYmFzZS1xdWVyeS10ZXh0IHtcbiAgICBjb2xvcjogcmdiKDAsIDEyOCwgMjU1KTtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4uZGF0YWJhc2UtcXVlcnktcmVzdWx0IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMXB4IDIycHggMXB4IDI0cHg7XG4gICAgbWluLWhlaWdodDogMTZweDtcbiAgICBtYXJnaW4tbGVmdDogLTI0cHg7XG4gICAgcGFkZGluZy1yaWdodDogMDtcbn1cblxuLmRhdGFiYXNlLXF1ZXJ5LXJlc3VsdC5lcnJvciB7XG4gICAgY29sb3I6IHJlZDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4ucmVzb3VyY2Utc2lkZWJhci10cmVlLWl0ZW0gLmljb24ge1xuICAgIGNvbnRlbnQ6IHVybChJbWFnZXMvcmVzb3VyY2VQbGFpbkljb25TbWFsbC5wbmcpO1xufVxuXG4ucmVzb3VyY2Utc2lkZWJhci10cmVlLWl0ZW0ucmVzb3VyY2VzLXR5cGUtaW1hZ2UgLmljb24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL3Jlc291cmNlUGxhaW5JY29uLnBuZyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBjb250ZW50OiBcIlwiO1xufVxuXG4ucmVzb3VyY2VzLXR5cGUtaW1hZ2UgLmltYWdlLXJlc291cmNlLWljb24tcHJldmlldyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBtaW4td2lkdGg6IDFweDtcbiAgICBtaW4taGVpZ2h0OiAxcHg7XG4gICAgdG9wOiAycHg7XG4gICAgYm90dG9tOiAxcHg7XG4gICAgbGVmdDogM3B4O1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgbWF4LXdpZHRoOiA4cHg7XG4gICAgbWF4LWhlaWdodDogMTFweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVzb3VyY2VzLXNpZGViYXIge1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi8qIyBzb3VyY2VVUkw9cmVzb3VyY2VzL3Jlc291cmNlc1BhbmVsLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInJlc291cmNlcy9yZXNvdXJjZXNTaWRlYmFyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50cmVlLW91dGxpbmUge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBjb2xvcjogcmdiKDkwLCA5MCwgOTApO1xufVxuXG4udHJlZS1vdXRsaW5lID4gb2wge1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBtaW4taGVpZ2h0OiAyMHB4O1xufVxuXG5saS5zdG9yYWdlLWdyb3VwLWxpc3QtaXRlbSB7XG4gICAgcGFkZGluZzogMTBweCA4cHggNnB4IDhweDtcbn1cblxubGkuc3RvcmFnZS1ncm91cC1saXN0LWl0ZW06bm90KDpmaXJzdC1jaGlsZCkge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2IoMjMwLCAyMzAsIDIzMCk7XG59XG5cbmxpLnN0b3JhZ2UtZ3JvdXAtbGlzdC1pdGVtOjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5uYXZpZ2F0b3ItdHJlZS1pdGVtIHtcbiAgICBtYXJnaW46IC0zcHggLTdweCAtM3B4IC03cHg7XG59XG5cbi5uYXZpZ2F0b3ItZmlsZS10cmVlLWl0ZW0ge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDAsIDAlLCA1MCUpLCBoc2woMCwgMCUsIDcwJSkpO1xufVxuXG4ubmF2aWdhdG9yLWZvbGRlci10cmVlLWl0ZW0ge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDIxMCwgODIlLCA2NSUpLCBoc2woMjEwLCA4MiUsIDgwJSkpO1xufVxuXG4ubmF2aWdhdG9yLWZyYW1lLXRyZWUtaXRlbSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVhNWE1YTtcbn1cblxuLm5hdmlnYXRvci1zY3JpcHQtdHJlZS1pdGVtIHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCg0OCwgNzAlLCA1MCUpLCBoc2woNDgsIDcwJSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3Itc3R5bGVzaGVldC10cmVlLWl0ZW0ge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDI1NiwgNTAlLCA1MCUpLCBoc2woMjU2LCA1MCUsIDcwJSkpO1xufVxuXG4ubmF2aWdhdG9yLWltYWdlLXRyZWUtaXRlbSxcbi5uYXZpZ2F0b3ItZm9udC10cmVlLWl0ZW0ge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDEwOSwgMzMlLCA1MCUpLCBoc2woMTA5LCAzMyUsIDcwJSkpO1xufVxuXG4ucmVzb3VyY2UtdHJlZS1pdGVtIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkwLCA5MCwgOTAsIC43KTtcbn1cblxuLyojIHNvdXJjZVVSTD1yZXNvdXJjZXMvcmVzb3VyY2VzU2lkZWJhci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvc2VydmljZVdvcmtlckNhY2hlVmlld3MuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNlcnZpY2Utd29ya2VyLWNhY2hlLWRhdGEtdmlldyAuZGF0YS12aWV3LXRvb2xiYXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjO1xuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1jYWNoZS1kYXRhLXZpZXcgLmRhdGEtdmlldy10b29sYmFyIC5rZXktaW5wdXQge1xuICAgIG1hcmdpbjogYXV0byAwO1xuICAgIHdpZHRoOiAyMDBweDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWNhY2hlLWRhdGEtdmlldyAuZGF0YS1ncmlkIHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uc2VydmljZS13b3JrZXItY2FjaGUtZGF0YS12aWV3IC5kYXRhLWdyaWQgLmRhdGEtY29udGFpbmVyIHRyOm50aC1sYXN0LWNoaWxkKDEpIHRkIHtcbiAgICBib3JkZXI6IDA7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1jYWNoZS1kYXRhLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YS1jb250YWluZXIgdHI6bnRoLWxhc3QtY2hpbGQoMikgdGQge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhO1xufVxuXG4uc2VydmljZS13b3JrZXItY2FjaGUtZGF0YS12aWV3IC5kYXRhLWdyaWQgLmRhdGEtY29udGFpbmVyIHRyLnNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEyLCAyMTIsIDIxMik7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1jYWNoZS1kYXRhLXZpZXcgLmRhdGEtZ3JpZDpmb2N1cyAuZGF0YS1jb250YWluZXIgdHIuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlbGVjdGlvbi1iZy1jb2xvcik7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uc2VydmljZS13b3JrZXItY2FjaGUtZGF0YS12aWV3IC5zZWN0aW9uLFxuLnNlcnZpY2Utd29ya2VyLWNhY2hlLWRhdGEtdmlldyAuc2VjdGlvbiA+IC5oZWFkZXIsXG4uc2VydmljZS13b3JrZXItY2FjaGUtZGF0YS12aWV3IC5zZWN0aW9uID4gLmhlYWRlciAudGl0bGUge1xuICAgIG1hcmdpbjogMDtcbiAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xufVxuXG4uc2VydmljZS13b3JrZXItY2FjaGUtZGF0YS12aWV3IC5wcmltaXRpdmUtdmFsdWUge1xuICAgIHBhZGRpbmctdG9wOiAxcHg7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1jYWNoZS1kYXRhLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YS1jb250YWluZXIgdGQgLnNlY3Rpb24gLmhlYWRlciAudGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmNhY2hlLXByZXZpZXctcGFuZWwtcmVzaXplciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBoZWlnaHQ6IDRweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDY0JSwgNjQlLCA2NCUpO1xufVxuXG4vKiMgc291cmNlVVJMPXJlc291cmNlcy9zZXJ2aWNlV29ya2VyQ2FjaGVWaWV3cy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJyZXNvdXJjZXMvc2VydmljZVdvcmtlcnNWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zZXJ2aWNlLXdvcmtlci1lcnJvci1zdGFjayB7XG4gICAgbWF4LWhlaWdodDogMjAwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBmMDtcbiAgICBjb2xvcjogcmVkO1xuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICAgIG1hcmdpbjogMTBweCAycHggMCAtMTRweDtcbiAgICB3aGl0ZS1zcGFjZTogaW5pdGlhbDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWVycm9yLXN0YWNrID4gZGl2IHtcbiAgICBmbGV4OiBub25lO1xuICAgIHBhZGRpbmc6IDNweCA0cHg7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1lcnJvci1zdGFjayA+IGRpdjpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZDdkNztcbn1cblxuLnNlcnZpY2Utd29ya2VyLWVycm9yLXN0YWNrIGxhYmVsIHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uc2VydmljZS13b3JrZXItZXJyb3Itc3RhY2sgLmRldnRvb2xzLWxpbmsge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBjb2xvcjogcmdiKDMzJSwgMzMlLCAzMyUpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnNlcnZpY2Utd29ya2VyLXZlcnNpb24tc3RhY2sge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNlcnZpY2Utd29ya2VyLXZlcnNpb24tc3RhY2stYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAxMHB4O1xuICAgIGJvdHRvbTogMjBweDtcbiAgICBsZWZ0OiA0cHg7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM4ODg7XG4gICAgei1pbmRleDogMDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLXZlcnNpb246bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgbWFyZ2luLWJvdHRvbTogN3B4O1xufVxuXG4uc2VydmljZS13b3JrZXItYWN0aXZlLWNpcmNsZSxcbi5zZXJ2aWNlLXdvcmtlci1yZWR1bmRhbnQtY2lyY2xlLFxuLnNlcnZpY2Utd29ya2VyLXdhaXRpbmctY2lyY2xlLFxuLnNlcnZpY2Utd29ya2VyLWluc3RhbGxpbmctY2lyY2xlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzU1NTtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWFjdGl2ZS1jaXJjbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1MEIwNEY7XG59XG4uc2VydmljZS13b3JrZXItd2FpdGluZy1jaXJjbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMzhFMjQ7XG5cbn1cbi5zZXJ2aWNlLXdvcmtlci1pbnN0YWxsaW5nLWNpcmNsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1yZWR1bmRhbnQtY2lyY2xlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xufVxuXG4uc2VydmljZS13b3JrZXItc3VidGl0bGUge1xuICAgIHBhZGRpbmctbGVmdDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBjb2xvcjogIzg4ODtcbn1cblxuLmxpbmsge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uc2VydmljZS13b3JrZXItZWRpdG9yLXdpdGgtYnV0dG9uIHtcbiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLW5vdGlmaWNhdGlvbi1lZGl0b3Ige1xuICAgIGJvcmRlcjogc29saWQgMXB4ICNkOGQ4ZDg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIG1heC13aWR0aDogNDAwcHg7XG4gICAgbWluLXdpZHRoOiA4MHB4O1xufVxuXG4uc2VydmljZS13b3JrZXItbm90aWZpY2F0aW9uLWVkaXRvci5zb3VyY2UtY29kZSB7XG4gICAgLyoqIFNpbXVsYXRlIENvZGVNaXJyb3IgdGhhdCBpcyBzaG93biBhYm92ZSAqL1xuICAgIHBhZGRpbmc6IDRweDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWxpc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi5zZXJ2aWNlLXdvcmtlcnMtdGhpcy1vcmlnaW4ge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGZsZXgtZ3JvdzogMDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWhhcy1jdXJyZW50IC5zZXJ2aWNlLXdvcmtlcnMtb3RoZXItb3JpZ2luIHtcbiAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2IoMjMwLCAyMzAsIDIzMClcbn1cblxuLnNlcnZpY2Utd29ya2VyLWxpc3QtZW1wdHkgLnNlcnZpY2Utd29ya2Vycy1vdGhlci1vcmlnaW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zZXJ2aWNlLXdvcmtlcnMtdGhpcy1vcmlnaW4sXG4uc2VydmljZS13b3JrZXItZmlsdGVyLFxuLnNlcnZpY2Utd29ya2Vycy1vdGhlci1vcmlnaW4ge1xuICAgIG1pbi13aWR0aDogNDAwcHg7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1maWx0ZXIge1xuICAgIHBhZGRpbmc6IDE2cHggMjBweCAxMnB4IDEycHg7XG4gICAgZmxleC1ncm93OiAwO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCByZ2IoMjMwLCAyMzAsIDIzMCk7XG59XG5cbi5zZXJ2aWNlLXdvcmtlci1maWx0ZXItbGFiZWwge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtYXJnaW4tbGVmdDogNHB4O1xufVxuXG4uc2VydmljZS13b3JrZXItZmlsdGVyLWxhYmVsOjpiZWZvcmUge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoSW1hZ2VzL3RyZWVvdXRsaW5lVHJpYW5nbGVzLnBuZyk7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDMycHggMjRweDtcbiAgICBjb250ZW50OiBcImFhXCI7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgICBoZWlnaHQ6IDEycHg7XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbi5zZXJ2aWNlLXdvcmtlci1maWx0ZXItbGFiZWw6OmJlZm9yZSB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoSW1hZ2VzL3RyZWVvdXRsaW5lVHJpYW5nbGVzXzJ4LnBuZyk7XG59XG59IC8qIG1lZGlhICovXG5cbi5zZXJ2aWNlLXdvcmtlci1maWx0ZXJbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSAuc2VydmljZS13b3JrZXItZmlsdGVyLWxhYmVsOjpiZWZvcmUge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogLTE2cHggMDtcbn1cblxuLnNlcnZpY2Utd29ya2VyLWZpbHRlci10b29sYmFyIHtcbiAgICBtYXJnaW46IDhweCAxMHB4IDAgMTJweDtcbiAgICBtYXgtd2lkdGg6IDUzMHB4O1xufVxuXG4uc2VydmljZS13b3JrZXItZmlsdGVyLWNvbGxhcHNlZCAuc2VydmljZS13b3JrZXItZmlsdGVyLXRvb2xiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VVUkw9cmVzb3VyY2VzL3NlcnZpY2VXb3JrZXJzVmlldy5jc3MgKi8iO1NlYXJjaC5TZWFyY2hWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihzZXR0aW5nS2V5KXtzdXBlcih0cnVlKTt0aGlzLnNldE1pbmltdW1TaXplKDAsNDApO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc2VhcmNoL3NlYXJjaFZpZXcuY3NzJyk7dGhpcy5fZm9jdXNPblNob3c9ZmFsc2U7dGhpcy5faXNJbmRleGluZz1mYWxzZTt0aGlzLl9zZWFyY2hJZD0xO3RoaXMuX3NlYXJjaE1hdGNoZXNDb3VudD0wO3RoaXMuX3NlYXJjaFJlc3VsdHNDb3VudD0wO3RoaXMuX25vbkVtcHR5U2VhcmNoUmVzdWx0c0NvdW50PTA7dGhpcy5fc2VhcmNoaW5nVmlldz1udWxsO3RoaXMuX25vdEZvdW5kVmlldz1udWxsO3RoaXMuX3NlYXJjaENvbmZpZz1udWxsO3RoaXMuX3BlbmRpbmdTZWFyY2hDb25maWc9bnVsbDt0aGlzLl9zZWFyY2hSZXN1bHRzUGFuZT1udWxsO3RoaXMuX3Byb2dyZXNzSW5kaWNhdG9yPW51bGw7dGhpcy5fdmlzaWJsZVBhbmU9bnVsbDt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC12aWV3Jyk7dGhpcy5fc2VhcmNoUGFuZWxFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlYXJjaC1kcmF3ZXItaGVhZGVyJyk7dGhpcy5fc2VhcmNoUGFuZWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9zZWFyY2hSZXN1bHRzRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTt0aGlzLl9zZWFyY2hSZXN1bHRzRWxlbWVudC5jbGFzc05hbWU9J3NlYXJjaC1yZXN1bHRzJztjb25zdCBzZWFyY2hDb250YWluZXI9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7c2VhcmNoQ29udGFpbmVyLnN0eWxlLmZsZXg9J2F1dG8nO3NlYXJjaENvbnRhaW5lci5zdHlsZS5qdXN0aWZ5Q29udGVudD0nc3RhcnQnO3NlYXJjaENvbnRhaW5lci5zdHlsZS5tYXhXaWR0aD0nMzAwcHgnO3RoaXMuX3NlYXJjaD1VSS5IaXN0b3J5SW5wdXQuY3JlYXRlKCk7c2VhcmNoQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3NlYXJjaCk7dGhpcy5fc2VhcmNoLnBsYWNlaG9sZGVyPUNvbW1vbi5VSVN0cmluZygnU2VhcmNoJyk7dGhpcy5fc2VhcmNoLnNldEF0dHJpYnV0ZSgndHlwZScsJ3RleHQnKTt0aGlzLl9zZWFyY2guc2V0QXR0cmlidXRlKCdyZXN1bHRzJywnMCcpO3RoaXMuX3NlYXJjaC5zZXRBdHRyaWJ1dGUoJ3NpemUnLDQyKTtjb25zdCBzZWFyY2hJdGVtPW5ldyBVSS5Ub29sYmFySXRlbShzZWFyY2hDb250YWluZXIpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3NlYXJjaC10b29sYmFyJyx0aGlzLl9zZWFyY2hQYW5lbEVsZW1lbnQpO3RoaXMuX21hdGNoQ2FzZUJ1dHRvbj1TZWFyY2guU2VhcmNoVmlldy5fYXBwZW5kVG9vbGJhclRvZ2dsZSh0b29sYmFyLCdBYScsQ29tbW9uLlVJU3RyaW5nKCdNYXRjaCBDYXNlJykpO3RoaXMuX3JlZ2V4QnV0dG9uPVNlYXJjaC5TZWFyY2hWaWV3Ll9hcHBlbmRUb29sYmFyVG9nZ2xlKHRvb2xiYXIsJy4qJyxDb21tb24uVUlTdHJpbmcoJ1VzZSBSZWd1bGFyIEV4cHJlc3Npb24nKSk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShzZWFyY2hJdGVtKTtjb25zdCByZWZyZXNoQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLCdsYXJnZWljb24tcmVmcmVzaCcpO2NvbnN0IGNsZWFyQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xlYXInKSwnbGFyZ2VpY29uLWNsZWFyJyk7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShyZWZyZXNoQnV0dG9uKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGNsZWFyQnV0dG9uKTtyZWZyZXNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fb25BY3Rpb24uYmluZCh0aGlzKSk7Y2xlYXJCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+e3RoaXMuX3Jlc2V0U2VhcmNoKCk7dGhpcy5fb25TZWFyY2hJbnB1dENsZWFyKCk7fSk7Y29uc3Qgc2VhcmNoU3RhdHVzQmFyRWxlbWVudD10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZWFyY2gtdG9vbGJhci1zdW1tYXJ5Jyk7dGhpcy5fc2VhcmNoTWVzc2FnZUVsZW1lbnQ9c2VhcmNoU3RhdHVzQmFyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VhcmNoLW1lc3NhZ2UnKTt0aGlzLl9zZWFyY2hQcm9ncmVzc1BsYWNlaG9sZGVyRWxlbWVudD1zZWFyY2hTdGF0dXNCYXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmbGV4LWNlbnRlcmVkJyk7dGhpcy5fc2VhcmNoUmVzdWx0c01lc3NhZ2VFbGVtZW50PXNlYXJjaFN0YXR1c0JhckVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlYXJjaC1tZXNzYWdlJyk7dGhpcy5fYWR2YW5jZWRTZWFyY2hDb25maWc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZyhzZXR0aW5nS2V5KydTZWFyY2hDb25maWcnLG5ldyBTZWFyY2guU2VhcmNoQ29uZmlnKCcnLHRydWUsZmFsc2UpLnRvUGxhaW5PYmplY3QoKSk7dGhpcy5fbG9hZCgpO3RoaXMuX3NlYXJjaFNjb3BlPW51bGw7fQpzdGF0aWMgX2FwcGVuZFRvb2xiYXJUb2dnbGUodG9vbGJhcix0ZXh0LHRvb2x0aXApe2NvbnN0IHRvZ2dsZT1uZXcgVUkuVG9vbGJhclRvZ2dsZSh0b29sdGlwKTt0b2dnbGUuc2V0VGV4dCh0ZXh0KTt0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+dG9nZ2xlLnNldFRvZ2dsZWQoIXRvZ2dsZS50b2dnbGVkKCkpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRvZ2dsZSk7cmV0dXJuIHRvZ2dsZTt9Cl9idWlsZFNlYXJjaENvbmZpZygpe3JldHVybiBuZXcgU2VhcmNoLlNlYXJjaENvbmZpZyh0aGlzLl9zZWFyY2gudmFsdWUsIXRoaXMuX21hdGNoQ2FzZUJ1dHRvbi50b2dnbGVkKCksdGhpcy5fcmVnZXhCdXR0b24udG9nZ2xlZCgpKTt9CmFzeW5jIHRvZ2dsZShxdWVyeUNhbmRpZGF0ZSxzZWFyY2hJbW1lZGlhdGVseSl7aWYocXVlcnlDYW5kaWRhdGUpCnRoaXMuX3NlYXJjaC52YWx1ZT1xdWVyeUNhbmRpZGF0ZTtpZih0aGlzLmlzU2hvd2luZygpKQp0aGlzLmZvY3VzKCk7ZWxzZQp0aGlzLl9mb2N1c09uU2hvdz10cnVlO3RoaXMuX2luaXRTY29wZSgpO2lmKHNlYXJjaEltbWVkaWF0ZWx5KQp0aGlzLl9vbkFjdGlvbigpO2Vsc2UKdGhpcy5fc3RhcnRJbmRleGluZygpO30KY3JlYXRlU2NvcGUoKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KX2luaXRTY29wZSgpe3RoaXMuX3NlYXJjaFNjb3BlPXRoaXMuY3JlYXRlU2NvcGUoKTt9Cndhc1Nob3duKCl7aWYodGhpcy5fZm9jdXNPblNob3cpe3RoaXMuZm9jdXMoKTt0aGlzLl9mb2N1c09uU2hvdz1mYWxzZTt9fQpfb25JbmRleGluZ0ZpbmlzaGVkKCl7Y29uc3QgZmluaXNoZWQ9IXRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yLmlzQ2FuY2VsZWQoKTt0aGlzLl9wcm9ncmVzc0luZGljYXRvci5kb25lKCk7dGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3I9bnVsbDt0aGlzLl9pc0luZGV4aW5nPWZhbHNlO3RoaXMuX2luZGV4aW5nRmluaXNoZWQoZmluaXNoZWQpO2lmKCFmaW5pc2hlZCkKdGhpcy5fcGVuZGluZ1NlYXJjaENvbmZpZz1udWxsO2lmKCF0aGlzLl9wZW5kaW5nU2VhcmNoQ29uZmlnKQpyZXR1cm47Y29uc3Qgc2VhcmNoQ29uZmlnPXRoaXMuX3BlbmRpbmdTZWFyY2hDb25maWc7dGhpcy5fcGVuZGluZ1NlYXJjaENvbmZpZz1udWxsO3RoaXMuX2lubmVyU3RhcnRTZWFyY2goc2VhcmNoQ29uZmlnKTt9Cl9zdGFydEluZGV4aW5nKCl7dGhpcy5faXNJbmRleGluZz10cnVlO2lmKHRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yKQp0aGlzLl9wcm9ncmVzc0luZGljYXRvci5kb25lKCk7dGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3I9bmV3IFVJLlByb2dyZXNzSW5kaWNhdG9yKCk7dGhpcy5fc2VhcmNoTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdJbmRleGluZ1x1MjAyNicpO3RoaXMuX3Byb2dyZXNzSW5kaWNhdG9yLnNob3codGhpcy5fc2VhcmNoUHJvZ3Jlc3NQbGFjZWhvbGRlckVsZW1lbnQpO3RoaXMuX3NlYXJjaFNjb3BlLnBlcmZvcm1JbmRleGluZyhuZXcgQ29tbW9uLlByb2dyZXNzUHJveHkodGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3IsdGhpcy5fb25JbmRleGluZ0ZpbmlzaGVkLmJpbmQodGhpcykpKTt9Cl9vblNlYXJjaElucHV0Q2xlYXIoKXt0aGlzLl9zZWFyY2gudmFsdWU9Jyc7dGhpcy5mb2N1cygpO30KX29uU2VhcmNoUmVzdWx0KHNlYXJjaElkLHNlYXJjaFJlc3VsdCl7aWYoc2VhcmNoSWQhPT10aGlzLl9zZWFyY2hJZHx8IXRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yKQpyZXR1cm47aWYodGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3ImJnRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yLmlzQ2FuY2VsZWQoKSl7dGhpcy5fb25JbmRleGluZ0ZpbmlzaGVkKCk7cmV0dXJuO30KdGhpcy5fYWRkU2VhcmNoUmVzdWx0KHNlYXJjaFJlc3VsdCk7aWYoIXNlYXJjaFJlc3VsdC5tYXRjaGVzQ291bnQoKSkKcmV0dXJuO2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzUGFuZSl7dGhpcy5fc2VhcmNoUmVzdWx0c1BhbmU9bmV3IFNlYXJjaC5TZWFyY2hSZXN1bHRzUGFuZSgodGhpcy5fc2VhcmNoQ29uZmlnKSk7dGhpcy5fc2hvd1BhbmUodGhpcy5fc2VhcmNoUmVzdWx0c1BhbmUpO30KdGhpcy5fc2VhcmNoUmVzdWx0c1BhbmUuYWRkU2VhcmNoUmVzdWx0KHNlYXJjaFJlc3VsdCk7fQpfb25TZWFyY2hGaW5pc2hlZChzZWFyY2hJZCxmaW5pc2hlZCl7aWYoc2VhcmNoSWQhPT10aGlzLl9zZWFyY2hJZHx8IXRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yKQpyZXR1cm47aWYoIXRoaXMuX3NlYXJjaFJlc3VsdHNQYW5lKQp0aGlzLl9ub3RoaW5nRm91bmQoKTt0aGlzLl9zZWFyY2hGaW5pc2hlZChmaW5pc2hlZCk7dGhpcy5fc2VhcmNoQ29uZmlnPW51bGw7fQphc3luYyBfc3RhcnRTZWFyY2goc2VhcmNoQ29uZmlnKXt0aGlzLl9yZXNldFNlYXJjaCgpOysrdGhpcy5fc2VhcmNoSWQ7dGhpcy5faW5pdFNjb3BlKCk7aWYoIXRoaXMuX2lzSW5kZXhpbmcpCnRoaXMuX3N0YXJ0SW5kZXhpbmcoKTt0aGlzLl9wZW5kaW5nU2VhcmNoQ29uZmlnPXNlYXJjaENvbmZpZzt9Cl9pbm5lclN0YXJ0U2VhcmNoKHNlYXJjaENvbmZpZyl7dGhpcy5fc2VhcmNoQ29uZmlnPXNlYXJjaENvbmZpZztpZih0aGlzLl9wcm9ncmVzc0luZGljYXRvcikKdGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3IuZG9uZSgpO3RoaXMuX3Byb2dyZXNzSW5kaWNhdG9yPW5ldyBVSS5Qcm9ncmVzc0luZGljYXRvcigpO3RoaXMuX3NlYXJjaFN0YXJ0ZWQodGhpcy5fcHJvZ3Jlc3NJbmRpY2F0b3IpO3RoaXMuX3NlYXJjaFNjb3BlLnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yLHRoaXMuX29uU2VhcmNoUmVzdWx0LmJpbmQodGhpcyx0aGlzLl9zZWFyY2hJZCksdGhpcy5fb25TZWFyY2hGaW5pc2hlZC5iaW5kKHRoaXMsdGhpcy5fc2VhcmNoSWQpKTt9Cl9yZXNldFNlYXJjaCgpe3RoaXMuX3N0b3BTZWFyY2goKTt0aGlzLl9zaG93UGFuZShudWxsKTt0aGlzLl9zZWFyY2hSZXN1bHRzUGFuZT1udWxsO30KX3N0b3BTZWFyY2goKXtpZih0aGlzLl9wcm9ncmVzc0luZGljYXRvciYmIXRoaXMuX2lzSW5kZXhpbmcpCnRoaXMuX3Byb2dyZXNzSW5kaWNhdG9yLmNhbmNlbCgpO2lmKHRoaXMuX3NlYXJjaFNjb3BlKQp0aGlzLl9zZWFyY2hTY29wZS5zdG9wU2VhcmNoKCk7dGhpcy5fc2VhcmNoQ29uZmlnPW51bGw7fQpfc2VhcmNoU3RhcnRlZChwcm9ncmVzc0luZGljYXRvcil7dGhpcy5fcmVzZXRDb3VudGVycygpO2lmKCF0aGlzLl9zZWFyY2hpbmdWaWV3KQp0aGlzLl9zZWFyY2hpbmdWaWV3PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ1NlYXJjaGluZ1x1MjAyNicpKTt0aGlzLl9zaG93UGFuZSh0aGlzLl9zZWFyY2hpbmdWaWV3KTt0aGlzLl9zZWFyY2hNZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1NlYXJjaGluZ1x1MjAyNicpO3Byb2dyZXNzSW5kaWNhdG9yLnNob3codGhpcy5fc2VhcmNoUHJvZ3Jlc3NQbGFjZWhvbGRlckVsZW1lbnQpO3RoaXMuX3VwZGF0ZVNlYXJjaFJlc3VsdHNNZXNzYWdlKCk7fQpfaW5kZXhpbmdGaW5pc2hlZChmaW5pc2hlZCl7dGhpcy5fc2VhcmNoTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQ9ZmluaXNoZWQ/Jyc6Q29tbW9uLlVJU3RyaW5nKCdJbmRleGluZyBpbnRlcnJ1cHRlZC4nKTt9Cl91cGRhdGVTZWFyY2hSZXN1bHRzTWVzc2FnZSgpe2lmKHRoaXMuX3NlYXJjaE1hdGNoZXNDb3VudCYmdGhpcy5fc2VhcmNoUmVzdWx0c0NvdW50KXtpZih0aGlzLl9zZWFyY2hNYXRjaGVzQ291bnQ9PT0xJiZ0aGlzLl9ub25FbXB0eVNlYXJjaFJlc3VsdHNDb3VudD09PTEpe3RoaXMuX3NlYXJjaFJlc3VsdHNNZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0ZvdW5kIDEgbWF0Y2hpbmcgbGluZSBpbiAxIGZpbGUuJyk7fWVsc2UgaWYodGhpcy5fc2VhcmNoTWF0Y2hlc0NvdW50PjEmJnRoaXMuX25vbkVtcHR5U2VhcmNoUmVzdWx0c0NvdW50PT09MSl7dGhpcy5fc2VhcmNoUmVzdWx0c01lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRm91bmQgJWQgbWF0Y2hpbmcgbGluZXMgaW4gMSBmaWxlLicsdGhpcy5fc2VhcmNoTWF0Y2hlc0NvdW50KTt9ZWxzZXt0aGlzLl9zZWFyY2hSZXN1bHRzTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdGb3VuZCAlZCBtYXRjaGluZyBsaW5lcyBpbiAlZCBmaWxlcy4nLHRoaXMuX3NlYXJjaE1hdGNoZXNDb3VudCx0aGlzLl9ub25FbXB0eVNlYXJjaFJlc3VsdHNDb3VudCk7fX1lbHNle3RoaXMuX3NlYXJjaFJlc3VsdHNNZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD0nJzt9fQpfc2hvd1BhbmUocGFuZWwpe2lmKHRoaXMuX3Zpc2libGVQYW5lKQp0aGlzLl92aXNpYmxlUGFuZS5kZXRhY2goKTtpZihwYW5lbCkKcGFuZWwuc2hvdyh0aGlzLl9zZWFyY2hSZXN1bHRzRWxlbWVudCk7dGhpcy5fdmlzaWJsZVBhbmU9cGFuZWw7fQpfcmVzZXRDb3VudGVycygpe3RoaXMuX3NlYXJjaE1hdGNoZXNDb3VudD0wO3RoaXMuX3NlYXJjaFJlc3VsdHNDb3VudD0wO3RoaXMuX25vbkVtcHR5U2VhcmNoUmVzdWx0c0NvdW50PTA7fQpfbm90aGluZ0ZvdW5kKCl7aWYoIXRoaXMuX25vdEZvdW5kVmlldykKdGhpcy5fbm90Rm91bmRWaWV3PW5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ05vIG1hdGNoZXMgZm91bmQuJykpO3RoaXMuX3Nob3dQYW5lKHRoaXMuX25vdEZvdW5kVmlldyk7dGhpcy5fc2VhcmNoUmVzdWx0c01lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gbWF0Y2hlcyBmb3VuZC4nKTt9Cl9hZGRTZWFyY2hSZXN1bHQoc2VhcmNoUmVzdWx0KXtjb25zdCBtYXRjaGVzQ291bnQ9c2VhcmNoUmVzdWx0Lm1hdGNoZXNDb3VudCgpO3RoaXMuX3NlYXJjaE1hdGNoZXNDb3VudCs9bWF0Y2hlc0NvdW50O3RoaXMuX3NlYXJjaFJlc3VsdHNDb3VudCsrO2lmKG1hdGNoZXNDb3VudCkKdGhpcy5fbm9uRW1wdHlTZWFyY2hSZXN1bHRzQ291bnQrKzt0aGlzLl91cGRhdGVTZWFyY2hSZXN1bHRzTWVzc2FnZSgpO30KX3NlYXJjaEZpbmlzaGVkKGZpbmlzaGVkKXt0aGlzLl9zZWFyY2hNZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudD1maW5pc2hlZD9Db21tb24uVUlTdHJpbmcoJ1NlYXJjaCBmaW5pc2hlZC4nKTpDb21tb24uVUlTdHJpbmcoJ1NlYXJjaCBpbnRlcnJ1cHRlZC4nKTt9CmZvY3VzKCl7dGhpcy5fc2VhcmNoLmZvY3VzKCk7dGhpcy5fc2VhcmNoLnNlbGVjdCgpO30Kd2lsbEhpZGUoKXt0aGlzLl9zdG9wU2VhcmNoKCk7fQpfb25LZXlEb3duKGV2ZW50KXtzd2l0Y2goZXZlbnQua2V5Q29kZSl7Y2FzZSBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRW50ZXIuY29kZTp0aGlzLl9vbkFjdGlvbigpO2JyZWFrO319Cl9zYXZlKCl7dGhpcy5fYWR2YW5jZWRTZWFyY2hDb25maWcuc2V0KHRoaXMuX2J1aWxkU2VhcmNoQ29uZmlnKCkudG9QbGFpbk9iamVjdCgpKTt9Cl9sb2FkKCl7Y29uc3Qgc2VhcmNoQ29uZmlnPVNlYXJjaC5TZWFyY2hDb25maWcuZnJvbVBsYWluT2JqZWN0KHRoaXMuX2FkdmFuY2VkU2VhcmNoQ29uZmlnLmdldCgpKTt0aGlzLl9zZWFyY2gudmFsdWU9c2VhcmNoQ29uZmlnLnF1ZXJ5KCk7dGhpcy5fbWF0Y2hDYXNlQnV0dG9uLnNldFRvZ2dsZWQoIXNlYXJjaENvbmZpZy5pZ25vcmVDYXNlKCkpO3RoaXMuX3JlZ2V4QnV0dG9uLnNldFRvZ2dsZWQoc2VhcmNoQ29uZmlnLmlzUmVnZXgoKSk7fQpfb25BY3Rpb24oKXtjb25zdCBzZWFyY2hDb25maWc9dGhpcy5fYnVpbGRTZWFyY2hDb25maWcoKTtpZighc2VhcmNoQ29uZmlnLnF1ZXJ5KCl8fCFzZWFyY2hDb25maWcucXVlcnkoKS5sZW5ndGgpCnJldHVybjt0aGlzLl9zYXZlKCk7dGhpcy5fc3RhcnRTZWFyY2goc2VhcmNoQ29uZmlnKTt9fTs7U2VhcmNoLlNlYXJjaENvbmZpZz1jbGFzc3tjb25zdHJ1Y3RvcihxdWVyeSxpZ25vcmVDYXNlLGlzUmVnZXgpe3RoaXMuX3F1ZXJ5PXF1ZXJ5O3RoaXMuX2lnbm9yZUNhc2U9aWdub3JlQ2FzZTt0aGlzLl9pc1JlZ2V4PWlzUmVnZXg7dGhpcy5fcGFyc2UoKTt9CnN0YXRpYyBmcm9tUGxhaW5PYmplY3Qob2JqZWN0KXtyZXR1cm4gbmV3IFNlYXJjaC5TZWFyY2hDb25maWcob2JqZWN0LnF1ZXJ5LG9iamVjdC5pZ25vcmVDYXNlLG9iamVjdC5pc1JlZ2V4KTt9CnF1ZXJ5KCl7cmV0dXJuIHRoaXMuX3F1ZXJ5O30KaWdub3JlQ2FzZSgpe3JldHVybiB0aGlzLl9pZ25vcmVDYXNlO30KaXNSZWdleCgpe3JldHVybiB0aGlzLl9pc1JlZ2V4O30KdG9QbGFpbk9iamVjdCgpe3JldHVybntxdWVyeTp0aGlzLnF1ZXJ5KCksaWdub3JlQ2FzZTp0aGlzLmlnbm9yZUNhc2UoKSxpc1JlZ2V4OnRoaXMuaXNSZWdleCgpfTt9Cl9wYXJzZSgpe2NvbnN0IHF1b3RlZFBhdHRlcm49LyIoW15cXCJdfFxcLikrIi87Y29uc3QgdW5xdW90ZWRXb3JkUGF0dGVybj0vKFxzKig/IS0/ZihpbGUpPzopW15cXCBdfFxcLikrLztjb25zdCB1bnF1b3RlZFBhdHRlcm49dW5xdW90ZWRXb3JkUGF0dGVybi5zb3VyY2UrJyhcXHMrJyt1bnF1b3RlZFdvcmRQYXR0ZXJuLnNvdXJjZSsnKSonO2NvbnN0IHBhdHRlcm49WycoXFxzKicrU2VhcmNoLlNlYXJjaENvbmZpZy5GaWxlUGF0dGVyblJlZ2V4LnNvdXJjZSsnXFxzKiknLCcoJytxdW90ZWRQYXR0ZXJuLnNvdXJjZSsnKScsJygnK3VucXVvdGVkUGF0dGVybisnKScsXS5qb2luKCd8Jyk7Y29uc3QgcmVnZXhwPW5ldyBSZWdFeHAocGF0dGVybiwnZycpO2NvbnN0IHF1ZXJ5UGFydHM9dGhpcy5fcXVlcnkubWF0Y2gocmVnZXhwKXx8W107dGhpcy5fZmlsZVF1ZXJpZXM9W107dGhpcy5fcXVlcmllcz1bXTtmb3IobGV0IGk9MDtpPHF1ZXJ5UGFydHMubGVuZ3RoOysraSl7Y29uc3QgcXVlcnlQYXJ0PXF1ZXJ5UGFydHNbaV07aWYoIXF1ZXJ5UGFydCkKY29udGludWU7Y29uc3QgZmlsZVF1ZXJ5PXRoaXMuX3BhcnNlRmlsZVF1ZXJ5KHF1ZXJ5UGFydCk7aWYoZmlsZVF1ZXJ5KXt0aGlzLl9maWxlUXVlcmllcy5wdXNoKGZpbGVRdWVyeSk7dGhpcy5fZmlsZVJlZ2V4UXVlcmllcz10aGlzLl9maWxlUmVnZXhRdWVyaWVzfHxbXTt0aGlzLl9maWxlUmVnZXhRdWVyaWVzLnB1c2goe3JlZ2V4Om5ldyBSZWdFeHAoZmlsZVF1ZXJ5LnRleHQsdGhpcy5pZ25vcmVDYXNlPydpJzonJyksaXNOZWdhdGl2ZTpmaWxlUXVlcnkuaXNOZWdhdGl2ZX0pO2NvbnRpbnVlO30KaWYodGhpcy5faXNSZWdleCl7dGhpcy5fcXVlcmllcy5wdXNoKHF1ZXJ5UGFydCk7Y29udGludWU7fQppZihxdWVyeVBhcnQuc3RhcnRzV2l0aCgnIicpKXtpZighcXVlcnlQYXJ0LmVuZHNXaXRoKCciJykpCmNvbnRpbnVlO3RoaXMuX3F1ZXJpZXMucHVzaCh0aGlzLl9wYXJzZVF1b3RlZFF1ZXJ5KHF1ZXJ5UGFydCkpO2NvbnRpbnVlO30KdGhpcy5fcXVlcmllcy5wdXNoKHRoaXMuX3BhcnNlVW5xdW90ZWRRdWVyeShxdWVyeVBhcnQpKTt9fQpmaWxlUGF0aE1hdGNoZXNGaWxlUXVlcnkoZmlsZVBhdGgpe2lmKCF0aGlzLl9maWxlUmVnZXhRdWVyaWVzKQpyZXR1cm4gdHJ1ZTtmb3IobGV0IGk9MDtpPHRoaXMuX2ZpbGVSZWdleFF1ZXJpZXMubGVuZ3RoOysraSl7aWYoISFmaWxlUGF0aC5tYXRjaCh0aGlzLl9maWxlUmVnZXhRdWVyaWVzW2ldLnJlZ2V4KT09PXRoaXMuX2ZpbGVSZWdleFF1ZXJpZXNbaV0uaXNOZWdhdGl2ZSkKcmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fQpxdWVyaWVzKCl7cmV0dXJuIHRoaXMuX3F1ZXJpZXM7fQpfcGFyc2VVbnF1b3RlZFF1ZXJ5KHF1ZXJ5KXtyZXR1cm4gcXVlcnkucmVwbGFjZSgvXFwoLikvZywnJDEnKTt9Cl9wYXJzZVF1b3RlZFF1ZXJ5KHF1ZXJ5KXtyZXR1cm4gcXVlcnkuc3Vic3RyaW5nKDEscXVlcnkubGVuZ3RoLTEpLnJlcGxhY2UoL1xcKC4pL2csJyQxJyk7fQpfcGFyc2VGaWxlUXVlcnkocXVlcnkpe2NvbnN0IG1hdGNoPXF1ZXJ5Lm1hdGNoKFNlYXJjaC5TZWFyY2hDb25maWcuRmlsZVBhdHRlcm5SZWdleCk7aWYoIW1hdGNoKQpyZXR1cm4gbnVsbDtjb25zdCBpc05lZ2F0aXZlPSEhbWF0Y2hbMV07cXVlcnk9bWF0Y2hbM107bGV0IHJlc3VsdD0nJztmb3IobGV0IGk9MDtpPHF1ZXJ5Lmxlbmd0aDsrK2kpe2NvbnN0IGNoYXI9cXVlcnlbaV07aWYoY2hhcj09PScqJyl7cmVzdWx0Kz0nLionO31lbHNlIGlmKGNoYXI9PT0nXFwnKXsrK2k7Y29uc3QgbmV4dENoYXI9cXVlcnlbaV07aWYobmV4dENoYXI9PT0nICcpCnJlc3VsdCs9JyAnO31lbHNle2lmKFN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCkuaW5kZXhPZihxdWVyeS5jaGFyQXQoaSkpIT09LTEpCnJlc3VsdCs9J1xcJztyZXN1bHQrPXF1ZXJ5LmNoYXJBdChpKTt9fQpyZXR1cm4gbmV3IFNlYXJjaC5TZWFyY2hDb25maWcuUXVlcnlUZXJtKHJlc3VsdCxpc05lZ2F0aXZlKTt9fTtTZWFyY2guU2VhcmNoQ29uZmlnLkZpbGVQYXR0ZXJuUmVnZXg9LygtKT9mKGlsZSk/OigoPzpbXlxcIF18XFwuKSspLztTZWFyY2guU2VhcmNoQ29uZmlnLlJlZ2V4UXVlcnk7U2VhcmNoLlNlYXJjaENvbmZpZy5RdWVyeVRlcm09Y2xhc3N7Y29uc3RydWN0b3IodGV4dCxpc05lZ2F0aXZlKXt0aGlzLnRleHQ9dGV4dDt0aGlzLmlzTmVnYXRpdmU9aXNOZWdhdGl2ZTt9fTtTZWFyY2guU2VhcmNoUmVzdWx0PWZ1bmN0aW9uKCl7fTtTZWFyY2guU2VhcmNoUmVzdWx0LnByb3RvdHlwZT17bGFiZWwoKXt9LGRlc2NyaXB0aW9uKCl7fSxtYXRjaGVzQ291bnQoKXt9LG1hdGNoTGFiZWwoaW5kZXgpe30sbWF0Y2hMaW5lQ29udGVudChpbmRleCl7fSxtYXRjaFJldmVhbGFibGUoaW5kZXgpe319O1NlYXJjaC5TZWFyY2hTY29wZT1mdW5jdGlvbigpe307U2VhcmNoLlNlYXJjaFNjb3BlLnByb3RvdHlwZT17cGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcscHJvZ3Jlc3Msc2VhcmNoUmVzdWx0Q2FsbGJhY2ssc2VhcmNoRmluaXNoZWRDYWxsYmFjayl7fSxwZXJmb3JtSW5kZXhpbmcocHJvZ3Jlc3Mpe30sc3RvcFNlYXJjaCgpe319OztTZWFyY2guU2VhcmNoUmVzdWx0c1BhbmU9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHNlYXJjaENvbmZpZyl7c3VwZXIodHJ1ZSk7dGhpcy5fc2VhcmNoQ29uZmlnPXNlYXJjaENvbmZpZzt0aGlzLl9zZWFyY2hSZXN1bHRzPVtdO3RoaXMuX3RyZWVPdXRsaW5lPW5ldyBVSS5UcmVlT3V0bGluZUluU2hhZG93KCk7dGhpcy5fdHJlZU91dGxpbmUuaGlkZU92ZXJmbG93KCk7dGhpcy5fdHJlZU91dGxpbmUucmVnaXN0ZXJSZXF1aXJlZENTUygnc2VhcmNoL3NlYXJjaFJlc3VsdHNQYW5lLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudCk7dGhpcy5fbWF0Y2hlc0V4cGFuZGVkQ291bnQ9MDt9CmFkZFNlYXJjaFJlc3VsdChzZWFyY2hSZXN1bHQpe3RoaXMuX3NlYXJjaFJlc3VsdHMucHVzaChzZWFyY2hSZXN1bHQpO3RoaXMuX2FkZFRyZWVFbGVtZW50KHNlYXJjaFJlc3VsdCk7fQpfYWRkVHJlZUVsZW1lbnQoc2VhcmNoUmVzdWx0KXtjb25zdCB0cmVlRWxlbWVudD1uZXcgU2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLlNlYXJjaFJlc3VsdHNUcmVlRWxlbWVudCh0aGlzLl9zZWFyY2hDb25maWcsc2VhcmNoUmVzdWx0KTt0aGlzLl90cmVlT3V0bGluZS5hcHBlbmRDaGlsZCh0cmVlRWxlbWVudCk7aWYodGhpcy5fbWF0Y2hlc0V4cGFuZGVkQ291bnQ8U2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLl9tYXRjaGVzRXhwYW5kZWRCeURlZmF1bHQpCnRyZWVFbGVtZW50LmV4cGFuZCgpO3RoaXMuX21hdGNoZXNFeHBhbmRlZENvdW50Kz1zZWFyY2hSZXN1bHQubWF0Y2hlc0NvdW50KCk7fX07U2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLl9tYXRjaGVzRXhwYW5kZWRCeURlZmF1bHQ9MjA7U2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLl9tYXRjaGVzU2hvd25BdE9uY2U9MjA7U2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLlNlYXJjaFJlc3VsdHNUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHNlYXJjaENvbmZpZyxzZWFyY2hSZXN1bHQpe3N1cGVyKCcnLHRydWUpO3RoaXMuX3NlYXJjaENvbmZpZz1zZWFyY2hDb25maWc7dGhpcy5fc2VhcmNoUmVzdWx0PXNlYXJjaFJlc3VsdDt0aGlzLl9pbml0aWFsaXplZD1mYWxzZTt0aGlzLnRvZ2dsZU9uQ2xpY2s9dHJ1ZTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7fQpvbmV4cGFuZCgpe2lmKHRoaXMuX2luaXRpYWxpemVkKQpyZXR1cm47dGhpcy5fdXBkYXRlTWF0Y2hlc1VJKCk7dGhpcy5faW5pdGlhbGl6ZWQ9dHJ1ZTt9Cl91cGRhdGVNYXRjaGVzVUkoKXt0aGlzLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgdG9JbmRleD1NYXRoLm1pbih0aGlzLl9zZWFyY2hSZXN1bHQubWF0Y2hlc0NvdW50KCksU2VhcmNoLlNlYXJjaFJlc3VsdHNQYW5lLl9tYXRjaGVzU2hvd25BdE9uY2UpO2lmKHRvSW5kZXg8dGhpcy5fc2VhcmNoUmVzdWx0Lm1hdGNoZXNDb3VudCgpKXt0aGlzLl9hcHBlbmRTZWFyY2hNYXRjaGVzKDAsdG9JbmRleC0xKTt0aGlzLl9hcHBlbmRTaG93TW9yZU1hdGNoZXNFbGVtZW50KHRvSW5kZXgtMSk7fWVsc2V7dGhpcy5fYXBwZW5kU2VhcmNoTWF0Y2hlcygwLHRvSW5kZXgpO319Cm9uYXR0YWNoKCl7dGhpcy5fdXBkYXRlU2VhcmNoTWF0Y2hlcygpO30KX3VwZGF0ZVNlYXJjaE1hdGNoZXMoKXt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtcmVzdWx0Jyk7Y29uc3QgZmlsZU5hbWVTcGFuPXNwYW4odGhpcy5fc2VhcmNoUmVzdWx0LmxhYmVsKCksJ3NlYXJjaC1yZXN1bHQtZmlsZS1uYW1lJyk7ZmlsZU5hbWVTcGFuLmFwcGVuZENoaWxkKHNwYW4oJ1x1MjAxNCcsJ3NlYXJjaC1yZXN1bHQtZGFzaCcpKTtmaWxlTmFtZVNwYW4uYXBwZW5kQ2hpbGQoc3Bhbih0aGlzLl9zZWFyY2hSZXN1bHQuZGVzY3JpcHRpb24oKSwnc2VhcmNoLXJlc3VsdC1xdWFsaWZpZXInKSk7dGhpcy50b29sdGlwPXRoaXMuX3NlYXJjaFJlc3VsdC5kZXNjcmlwdGlvbigpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGZpbGVOYW1lU3Bhbik7Y29uc3QgbWF0Y2hlc0NvdW50U3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bWF0Y2hlc0NvdW50U3Bhbi5jbGFzc05hbWU9J3NlYXJjaC1yZXN1bHQtbWF0Y2hlcy1jb3VudCc7bWF0Y2hlc0NvdW50U3Bhbi50ZXh0Q29udGVudD1gJHt0aGlzLl9zZWFyY2hSZXN1bHQubWF0Y2hlc0NvdW50KCl9YDt0aGlzLmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZChtYXRjaGVzQ291bnRTcGFuKTtpZih0aGlzLmV4cGFuZGVkKQp0aGlzLl91cGRhdGVNYXRjaGVzVUkoKTtmdW5jdGlvbiBzcGFuKHRleHQsY2xhc3NOYW1lKXtjb25zdCBzcGFuPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtzcGFuLmNsYXNzTmFtZT1jbGFzc05hbWU7c3Bhbi50ZXh0Q29udGVudD10ZXh0O3JldHVybiBzcGFuO319Cl9hcHBlbmRTZWFyY2hNYXRjaGVzKGZyb21JbmRleCx0b0luZGV4KXtjb25zdCBzZWFyY2hSZXN1bHQ9dGhpcy5fc2VhcmNoUmVzdWx0O2NvbnN0IHF1ZXJpZXM9dGhpcy5fc2VhcmNoQ29uZmlnLnF1ZXJpZXMoKTtjb25zdCByZWdleGVzPVtdO2ZvcihsZXQgaT0wO2k8cXVlcmllcy5sZW5ndGg7KytpKQpyZWdleGVzLnB1c2goY3JlYXRlU2VhcmNoUmVnZXgocXVlcmllc1tpXSwhdGhpcy5fc2VhcmNoQ29uZmlnLmlnbm9yZUNhc2UoKSx0aGlzLl9zZWFyY2hDb25maWcuaXNSZWdleCgpKSk7Zm9yKGxldCBpPWZyb21JbmRleDtpPHRvSW5kZXg7KytpKXtjb25zdCBsaW5lQ29udGVudD1zZWFyY2hSZXN1bHQubWF0Y2hMaW5lQ29udGVudChpKS50cmltKCk7bGV0IG1hdGNoUmFuZ2VzPVtdO2ZvcihsZXQgaj0wO2o8cmVnZXhlcy5sZW5ndGg7KytqKQptYXRjaFJhbmdlcz1tYXRjaFJhbmdlcy5jb25jYXQodGhpcy5fcmVnZXhNYXRjaFJhbmdlcyhsaW5lQ29udGVudCxyZWdleGVzW2pdKSk7Y29uc3QgYW5jaG9yPUNvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlSZXZlYWxhYmxlKHNlYXJjaFJlc3VsdC5tYXRjaFJldmVhbGFibGUoaSksJycpO2FuY2hvci5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbWF0Y2gtbGluaycpO2NvbnN0IGxpbmVOdW1iZXJTcGFuPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtsaW5lTnVtYmVyU3Bhbi5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbWF0Y2gtbGluZS1udW1iZXInKTtsaW5lTnVtYmVyU3Bhbi50ZXh0Q29udGVudD1zZWFyY2hSZXN1bHQubWF0Y2hMYWJlbChpKTthbmNob3IuYXBwZW5kQ2hpbGQobGluZU51bWJlclNwYW4pO2NvbnN0IGNvbnRlbnRTcGFuPXRoaXMuX2NyZWF0ZUNvbnRlbnRTcGFuKGxpbmVDb250ZW50LG1hdGNoUmFuZ2VzKTthbmNob3IuYXBwZW5kQ2hpbGQoY29udGVudFNwYW4pO2NvbnN0IHNlYXJjaE1hdGNoRWxlbWVudD1uZXcgVUkuVHJlZUVsZW1lbnQoKTtzZWFyY2hNYXRjaEVsZW1lbnQuc2VsZWN0YWJsZT1mYWxzZTt0aGlzLmFwcGVuZENoaWxkKHNlYXJjaE1hdGNoRWxlbWVudCk7c2VhcmNoTWF0Y2hFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5jbGFzc05hbWU9J3NlYXJjaC1tYXRjaCc7c2VhcmNoTWF0Y2hFbGVtZW50Lmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZChhbmNob3IpO3NlYXJjaE1hdGNoRWxlbWVudC50b29sdGlwPWxpbmVDb250ZW50O319Cl9hcHBlbmRTaG93TW9yZU1hdGNoZXNFbGVtZW50KHN0YXJ0TWF0Y2hJbmRleCl7Y29uc3QgbWF0Y2hlc0xlZnRDb3VudD10aGlzLl9zZWFyY2hSZXN1bHQubWF0Y2hlc0NvdW50KCktc3RhcnRNYXRjaEluZGV4O2NvbnN0IHNob3dNb3JlTWF0Y2hlc1RleHQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93ICVkIG1vcmUnLG1hdGNoZXNMZWZ0Q291bnQpO2NvbnN0IHNob3dNb3JlTWF0Y2hlc1RyZWVFbGVtZW50PW5ldyBVSS5UcmVlRWxlbWVudChzaG93TW9yZU1hdGNoZXNUZXh0KTt0aGlzLmFwcGVuZENoaWxkKHNob3dNb3JlTWF0Y2hlc1RyZWVFbGVtZW50KTtzaG93TW9yZU1hdGNoZXNUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2hvdy1tb3JlLW1hdGNoZXMnKTtzaG93TW9yZU1hdGNoZXNUcmVlRWxlbWVudC5vbnNlbGVjdD10aGlzLl9zaG93TW9yZU1hdGNoZXNFbGVtZW50U2VsZWN0ZWQuYmluZCh0aGlzLHNob3dNb3JlTWF0Y2hlc1RyZWVFbGVtZW50LHN0YXJ0TWF0Y2hJbmRleCk7fQpfY3JlYXRlQ29udGVudFNwYW4obGluZUNvbnRlbnQsbWF0Y2hSYW5nZXMpe2xldCB0cmltQnk9MDtpZihtYXRjaFJhbmdlcy5sZW5ndGg+MCYmbWF0Y2hSYW5nZXNbMF0ub2Zmc2V0PjIwKQp0cmltQnk9MTU7bGluZUNvbnRlbnQ9bGluZUNvbnRlbnQuc3Vic3RyaW5nKHRyaW1CeSwxMDAwK3RyaW1CeSk7aWYodHJpbUJ5KXttYXRjaFJhbmdlcz1tYXRjaFJhbmdlcy5tYXAocmFuZ2U9Pm5ldyBUZXh0VXRpbHMuU291cmNlUmFuZ2UocmFuZ2Uub2Zmc2V0LXRyaW1CeSsxLHJhbmdlLmxlbmd0aCkpO2xpbmVDb250ZW50PSdcdTIwMjYnK2xpbmVDb250ZW50O30KY29uc3QgY29udGVudFNwYW49Y3JlYXRlRWxlbWVudCgnc3BhbicpO2NvbnRlbnRTcGFuLmNsYXNzTmFtZT0nc2VhcmNoLW1hdGNoLWNvbnRlbnQnO2NvbnRlbnRTcGFuLnRleHRDb250ZW50PWxpbmVDb250ZW50O1VJLmhpZ2hsaWdodFJhbmdlc1dpdGhTdHlsZUNsYXNzKGNvbnRlbnRTcGFuLG1hdGNoUmFuZ2VzLCdoaWdobGlnaHRlZC1tYXRjaCcpO3JldHVybiBjb250ZW50U3Bhbjt9Cl9yZWdleE1hdGNoUmFuZ2VzKGxpbmVDb250ZW50LHJlZ2V4KXtyZWdleC5sYXN0SW5kZXg9MDtsZXQgbWF0Y2g7Y29uc3QgbWF0Y2hSYW5nZXM9W107d2hpbGUoKHJlZ2V4Lmxhc3RJbmRleDxsaW5lQ29udGVudC5sZW5ndGgpJiYobWF0Y2g9cmVnZXguZXhlYyhsaW5lQ29udGVudCkpKQptYXRjaFJhbmdlcy5wdXNoKG5ldyBUZXh0VXRpbHMuU291cmNlUmFuZ2UobWF0Y2guaW5kZXgsbWF0Y2hbMF0ubGVuZ3RoKSk7cmV0dXJuIG1hdGNoUmFuZ2VzO30KX3Nob3dNb3JlTWF0Y2hlc0VsZW1lbnRTZWxlY3RlZChzaG93TW9yZU1hdGNoZXNUcmVlRWxlbWVudCxzdGFydE1hdGNoSW5kZXgpe3RoaXMucmVtb3ZlQ2hpbGQoc2hvd01vcmVNYXRjaGVzVHJlZUVsZW1lbnQpO3RoaXMuX2FwcGVuZFNlYXJjaE1hdGNoZXMoc3RhcnRNYXRjaEluZGV4LHRoaXMuX3NlYXJjaFJlc3VsdC5tYXRjaGVzQ291bnQoKSk7cmV0dXJuIGZhbHNlO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic2VhcmNoL3NlYXJjaFJlc3VsdHNQYW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4udHJlZS1vdXRsaW5lIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIG9sIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBoZWlnaHQ6IDE2cHg7XG59XG5cbmxpLnNlYXJjaC1yZXN1bHQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xuICAgIHBhZGRpbmc6IDJweCAwIDJweCA0cHg7XG4gICAgd29yZC13cmFwOiBub3JtYWw7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxubGkuc2VhcmNoLXJlc3VsdDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMjEsIDEyMSwgMTIxLCAwLjEpO1xufVxuXG5saS5zZWFyY2gtcmVzdWx0IC5zZWFyY2gtcmVzdWx0LWZpbGUtbmFtZSB7XG4gICAgY29sb3I6ICMyMjI7XG4gICAgZmxleDogMSAxO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxubGkuc2VhcmNoLXJlc3VsdCAuc2VhcmNoLXJlc3VsdC1tYXRjaGVzLWNvdW50IHtcbiAgICBjb2xvcjogIzg4ODtcbiAgICBtYXJnaW46IDAgOHB4O1xufVxuXG5saS5zZWFyY2gtcmVzdWx0LmV4cGFuZGVkIC5zZWFyY2gtcmVzdWx0LW1hdGNoZXMtY291bnQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbmxpLnNob3ctbW9yZS1tYXRjaGVzIHtcbiAgICBjb2xvcjogIzIyMjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luOiA4cHggMCAwIC00cHg7XG59XG5cbmxpLnNob3ctbW9yZS1tYXRjaGVzOmhvdmVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxubGkuc2VhcmNoLW1hdGNoIHtcbiAgICBtYXJnaW46IDJweCAwO1xuICAgIHdvcmQtd3JhcDogbm9ybWFsO1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG59XG5cbmxpLnNlYXJjaC1tYXRjaDo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG5saS5zZWFyY2gtbWF0Y2ggLnNlYXJjaC1tYXRjaC1saW5lLW51bWJlciB7XG4gICAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIHdvcmQtYnJlYWs6IG5vcm1hbDtcbiAgICBwYWRkaW5nOiAycHggNHB4IDJweCA2cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XG5cbmxpLnNlYXJjaC1tYXRjaDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NiwgMTIxLCAyMTcsIDAuMSk7XG59XG5cbmxpLnNlYXJjaC1tYXRjaCAuaGlnaGxpZ2h0ZWQtbWF0Y2gge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMUVBMDA7XG59XG5cbjpob3N0LWNvbnRleHQoLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCkgbGkuc2VhcmNoLW1hdGNoIC5oaWdobGlnaHRlZC1tYXRjaCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDEzMywgMTAwJSwgMzAlKSAhaW1wb3J0YW50O1xufVxuXG4udHJlZS1vdXRsaW5lIC5kZXZ0b29scy1saW5rIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZmxleDogYXV0bztcbn1cblxubGkuc2VhcmNoLW1hdGNoIC5zZWFyY2gtbWF0Y2gtY29udGVudCB7XG4gICAgY29sb3I6ICMwMDA7XG59XG5cbm9sLmNoaWxkcmVuLmV4cGFuZGVkIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogNHB4O1xufVxuXG4uc2VhcmNoLW1hdGNoLWxpbmsge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi5zZWFyY2gtcmVzdWx0LXF1YWxpZmllciB7XG4gICAgY29sb3I6ICNBQUE7XG59XG5cbi5zZWFyY2gtcmVzdWx0LWRhc2gge1xuICAgIGNvbG9yOiAjQUFBO1xuICAgIG1hcmdpbjogMCA0cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2VhcmNoL3NlYXJjaFJlc3VsdHNQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNlYXJjaC9zZWFyY2hWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zZWFyY2gtZHJhd2VyLWhlYWRlciB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uc2VhcmNoLXRvb2xiYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLnNlYXJjaC10b29sYmFyLXN1bW1hcnkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgZmxleDogMCAwIDE5cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG59XG5cbi5zZWFyY2gtdG9vbGJhci1zdW1tYXJ5IC5zZWFyY2gtbWVzc2FnZSB7XG4gICAgcGFkZGluZy10b3A6IDJweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDFleDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5zZWFyY2gtdmlldyAuc2VhcmNoLXJlc3VsdHMge1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4uc2VhcmNoLXZpZXcgLnNlYXJjaC1yZXN1bHRzID4gZGl2IHtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4vKiMgc291cmNlVVJMPXNlYXJjaC9zZWFyY2hWaWV3LmNzcyAqLyI7U2VjdXJpdHkuU2VjdXJpdHlNb2RlbD1jbGFzcyBleHRlbmRzIFNESy5TREtNb2RlbHtjb25zdHJ1Y3Rvcih0YXJnZXQpe3N1cGVyKHRhcmdldCk7dGhpcy5fZGlzcGF0Y2hlcj1uZXcgU2VjdXJpdHkuU2VjdXJpdHlEaXNwYXRjaGVyKHRoaXMpO3RoaXMuX3NlY3VyaXR5QWdlbnQ9dGFyZ2V0LnNlY3VyaXR5QWdlbnQoKTt0YXJnZXQucmVnaXN0ZXJTZWN1cml0eURpc3BhdGNoZXIodGhpcy5fZGlzcGF0Y2hlcik7dGhpcy5fc2VjdXJpdHlBZ2VudC5lbmFibGUoKTt9CnJlc291cmNlVHJlZU1vZGVsKCl7cmV0dXJuKHRoaXMudGFyZ2V0KCkubW9kZWwoU0RLLlJlc291cmNlVHJlZU1vZGVsKSk7fQpuZXR3b3JrTWFuYWdlcigpe3JldHVybih0aGlzLnRhcmdldCgpLm1vZGVsKFNESy5OZXR3b3JrTWFuYWdlcikpO30Kc3RhdGljIFNlY3VyaXR5U3RhdGVDb21wYXJhdG9yKGEsYil7bGV0IHNlY3VyaXR5U3RhdGVNYXA7aWYoU2VjdXJpdHkuU2VjdXJpdHlNb2RlbC5fc3ltYm9saWNUb051bWVyaWNTZWN1cml0eVN0YXRlKXtzZWN1cml0eVN0YXRlTWFwPVNlY3VyaXR5LlNlY3VyaXR5TW9kZWwuX3N5bWJvbGljVG9OdW1lcmljU2VjdXJpdHlTdGF0ZTt9ZWxzZXtzZWN1cml0eVN0YXRlTWFwPW5ldyBNYXAoKTtjb25zdCBvcmRlcmluZz1bUHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5JbmZvLFByb3RvY29sLlNlY3VyaXR5LlNlY3VyaXR5U3RhdGUuSW5zZWN1cmUsUHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5OZXV0cmFsLFByb3RvY29sLlNlY3VyaXR5LlNlY3VyaXR5U3RhdGUuU2VjdXJlLFByb3RvY29sLlNlY3VyaXR5LlNlY3VyaXR5U3RhdGUuVW5rbm93bl07Zm9yKGxldCBpPTA7aTxvcmRlcmluZy5sZW5ndGg7aSsrKQpzZWN1cml0eVN0YXRlTWFwLnNldChvcmRlcmluZ1tpXSxpKzEpO1NlY3VyaXR5LlNlY3VyaXR5TW9kZWwuX3N5bWJvbGljVG9OdW1lcmljU2VjdXJpdHlTdGF0ZT1zZWN1cml0eVN0YXRlTWFwO30KY29uc3QgYVNjb3JlPXNlY3VyaXR5U3RhdGVNYXAuZ2V0KGEpfHwwO2NvbnN0IGJTY29yZT1zZWN1cml0eVN0YXRlTWFwLmdldChiKXx8MDtyZXR1cm4gYVNjb3JlLWJTY29yZTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoU2VjdXJpdHkuU2VjdXJpdHlNb2RlbCxTREsuVGFyZ2V0LkNhcGFiaWxpdHkuU2VjdXJpdHksZmFsc2UpO1NlY3VyaXR5LlNlY3VyaXR5TW9kZWwuRXZlbnRzPXtTZWN1cml0eVN0YXRlQ2hhbmdlZDpTeW1ib2woJ1NlY3VyaXR5U3RhdGVDaGFuZ2VkJyl9O1NlY3VyaXR5LlBhZ2VTZWN1cml0eVN0YXRlPWNsYXNze2NvbnN0cnVjdG9yKHNlY3VyaXR5U3RhdGUsc2NoZW1lSXNDcnlwdG9ncmFwaGljLGV4cGxhbmF0aW9ucyxpbnNlY3VyZUNvbnRlbnRTdGF0dXMsc3VtbWFyeSl7dGhpcy5zZWN1cml0eVN0YXRlPXNlY3VyaXR5U3RhdGU7dGhpcy5zY2hlbWVJc0NyeXB0b2dyYXBoaWM9c2NoZW1lSXNDcnlwdG9ncmFwaGljO3RoaXMuZXhwbGFuYXRpb25zPWV4cGxhbmF0aW9uczt0aGlzLmluc2VjdXJlQ29udGVudFN0YXR1cz1pbnNlY3VyZUNvbnRlbnRTdGF0dXM7dGhpcy5zdW1tYXJ5PXN1bW1hcnk7fX07U2VjdXJpdHkuU2VjdXJpdHlEaXNwYXRjaGVyPWNsYXNze2NvbnN0cnVjdG9yKG1vZGVsKXt0aGlzLl9tb2RlbD1tb2RlbDt9CnNlY3VyaXR5U3RhdGVDaGFuZ2VkKHNlY3VyaXR5U3RhdGUsc2NoZW1lSXNDcnlwdG9ncmFwaGljLGV4cGxhbmF0aW9ucyxpbnNlY3VyZUNvbnRlbnRTdGF0dXMsc3VtbWFyeSl7Y29uc3QgcGFnZVNlY3VyaXR5U3RhdGU9bmV3IFNlY3VyaXR5LlBhZ2VTZWN1cml0eVN0YXRlKHNlY3VyaXR5U3RhdGUsc2NoZW1lSXNDcnlwdG9ncmFwaGljLGV4cGxhbmF0aW9ucyxpbnNlY3VyZUNvbnRlbnRTdGF0dXMsc3VtbWFyeXx8bnVsbCk7dGhpcy5fbW9kZWwuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNlY3VyaXR5LlNlY3VyaXR5TW9kZWwuRXZlbnRzLlNlY3VyaXR5U3RhdGVDaGFuZ2VkLHBhZ2VTZWN1cml0eVN0YXRlKTt9CmNlcnRpZmljYXRlRXJyb3IoZXZlbnRJZCxlcnJvclR5cGUscmVxdWVzdFVSTCl7fX07O1NlY3VyaXR5LlNlY3VyaXR5UGFuZWw9Y2xhc3MgZXh0ZW5kcyBVSS5QYW5lbFdpdGhTaWRlYmFye2NvbnN0cnVjdG9yKCl7c3VwZXIoJ3NlY3VyaXR5Jyk7dGhpcy5fbWFpblZpZXc9bmV3IFNlY3VyaXR5LlNlY3VyaXR5TWFpblZpZXcodGhpcyk7Y29uc3QgdGl0bGU9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ3RpdGxlJyk7dGl0bGUudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdPdmVydmlldycpO3RoaXMuX3NpZGViYXJNYWluVmlld0VsZW1lbnQ9bmV3IFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZUVsZW1lbnQodGl0bGUsdGhpcy5fc2V0VmlzaWJsZVZpZXcuYmluZCh0aGlzLHRoaXMuX21haW5WaWV3KSwnc2VjdXJpdHktbWFpbi12aWV3LXNpZGViYXItdHJlZS1pdGVtJywnbG9jay1pY29uJyk7dGhpcy5fc2lkZWJhclRyZWU9bmV3IFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZSh0aGlzLl9zaWRlYmFyTWFpblZpZXdFbGVtZW50LHRoaXMuc2hvd09yaWdpbi5iaW5kKHRoaXMpKTt0aGlzLnBhbmVsU2lkZWJhckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0aGlzLl9zaWRlYmFyVHJlZS5lbGVtZW50KTt0aGlzLl9sYXN0UmVzcG9uc2VSZWNlaXZlZEZvckxvYWRlcklkPW5ldyBNYXAoKTt0aGlzLl9vcmlnaW5zPW5ldyBNYXAoKTt0aGlzLl9maWx0ZXJSZXF1ZXN0Q291bnRzPW5ldyBNYXAoKTtTREsudGFyZ2V0TWFuYWdlci5vYnNlcnZlTW9kZWxzKFNlY3VyaXR5LlNlY3VyaXR5TW9kZWwsdGhpcyk7fQpzdGF0aWMgX2luc3RhbmNlKCl7cmV0dXJuKHNlbGYucnVudGltZS5zaGFyZWRJbnN0YW5jZShTZWN1cml0eS5TZWN1cml0eVBhbmVsKSk7fQpzdGF0aWMgY3JlYXRlQ2VydGlmaWNhdGVWaWV3ZXJCdXR0b25Gb3JPcmlnaW4odGV4dCxvcmlnaW4pe3JldHVybiBVSS5jcmVhdGVUZXh0QnV0dG9uKHRleHQsYXN5bmMgZT0+e2UuY29uc3VtZSgpO2NvbnN0IG5hbWVzPWF3YWl0IFNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLmdldENlcnRpZmljYXRlKG9yaWdpbik7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LnNob3dDZXJ0aWZpY2F0ZVZpZXdlcihuYW1lcyk7fSwnb3JpZ2luLWJ1dHRvbicpO30Kc3RhdGljIGNyZWF0ZUNlcnRpZmljYXRlVmlld2VyQnV0dG9uRm9yQ2VydCh0ZXh0LG5hbWVzKXtyZXR1cm4gVUkuY3JlYXRlVGV4dEJ1dHRvbih0ZXh0LGU9PntlLmNvbnN1bWUoKTtJbnNwZWN0b3JGcm9udGVuZEhvc3Quc2hvd0NlcnRpZmljYXRlVmlld2VyKG5hbWVzKTt9LCdzZWN1cml0eS1jZXJ0aWZpY2F0ZS1idXR0b24nKTt9CnN0YXRpYyBjcmVhdGVIaWdobGlnaHRlZFVybCh1cmwsc2VjdXJpdHlTdGF0ZSl7Y29uc3Qgc2NoZW1lU2VwYXJhdG9yPSc6Ly8nO2NvbnN0IGluZGV4PXVybC5pbmRleE9mKHNjaGVtZVNlcGFyYXRvcik7aWYoaW5kZXg9PT0tMSl7Y29uc3QgdGV4dD1jcmVhdGVFbGVtZW50KCdzcGFuJywnJyk7dGV4dC50ZXh0Q29udGVudD11cmw7cmV0dXJuIHRleHQ7fQpjb25zdCBoaWdobGlnaHRlZFVybD1jcmVhdGVFbGVtZW50KCdzcGFuJywndXJsLXRleHQnKTtjb25zdCBzY2hlbWU9dXJsLnN1YnN0cigwLGluZGV4KTtjb25zdCBjb250ZW50PXVybC5zdWJzdHIoaW5kZXgrc2NoZW1lU2VwYXJhdG9yLmxlbmd0aCk7aGlnaGxpZ2h0ZWRVcmwuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd1cmwtc2NoZW1lLScrc2VjdXJpdHlTdGF0ZSkudGV4dENvbnRlbnQ9c2NoZW1lO2hpZ2hsaWdodGVkVXJsLmNyZWF0ZUNoaWxkKCdzcGFuJywndXJsLXNjaGVtZS1zZXBhcmF0b3InKS50ZXh0Q29udGVudD1zY2hlbWVTZXBhcmF0b3I7aGlnaGxpZ2h0ZWRVcmwuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1jb250ZW50O3JldHVybiBoaWdobGlnaHRlZFVybDt9CnNldFJhbkluc2VjdXJlQ29udGVudFN0eWxlKHNlY3VyaXR5U3RhdGUpe3RoaXMuX3Jhbkluc2VjdXJlQ29udGVudFN0eWxlPXNlY3VyaXR5U3RhdGU7fQpzZXREaXNwbGF5ZWRJbnNlY3VyZUNvbnRlbnRTdHlsZShzZWN1cml0eVN0YXRlKXt0aGlzLl9kaXNwbGF5ZWRJbnNlY3VyZUNvbnRlbnRTdHlsZT1zZWN1cml0eVN0YXRlO30KX3VwZGF0ZVNlY3VyaXR5U3RhdGUobmV3U2VjdXJpdHlTdGF0ZSxzY2hlbWVJc0NyeXB0b2dyYXBoaWMsZXhwbGFuYXRpb25zLGluc2VjdXJlQ29udGVudFN0YXR1cyxzdW1tYXJ5KXt0aGlzLl9zaWRlYmFyTWFpblZpZXdFbGVtZW50LnNldFNlY3VyaXR5U3RhdGUobmV3U2VjdXJpdHlTdGF0ZSk7dGhpcy5fbWFpblZpZXcudXBkYXRlU2VjdXJpdHlTdGF0ZShuZXdTZWN1cml0eVN0YXRlLHNjaGVtZUlzQ3J5cHRvZ3JhcGhpYyxleHBsYW5hdGlvbnMsaW5zZWN1cmVDb250ZW50U3RhdHVzLHN1bW1hcnkpO30KX29uU2VjdXJpdHlTdGF0ZUNoYW5nZWQoZXZlbnQpe2NvbnN0IGRhdGE9KGV2ZW50LmRhdGEpO2NvbnN0IHNlY3VyaXR5U3RhdGU9KGRhdGEuc2VjdXJpdHlTdGF0ZSk7Y29uc3Qgc2NoZW1lSXNDcnlwdG9ncmFwaGljPShkYXRhLnNjaGVtZUlzQ3J5cHRvZ3JhcGhpYyk7Y29uc3QgZXhwbGFuYXRpb25zPShkYXRhLmV4cGxhbmF0aW9ucyk7Y29uc3QgaW5zZWN1cmVDb250ZW50U3RhdHVzPShkYXRhLmluc2VjdXJlQ29udGVudFN0YXR1cyk7Y29uc3Qgc3VtbWFyeT0oZGF0YS5zdW1tYXJ5KTt0aGlzLl91cGRhdGVTZWN1cml0eVN0YXRlKHNlY3VyaXR5U3RhdGUsc2NoZW1lSXNDcnlwdG9ncmFwaGljLGV4cGxhbmF0aW9ucyxpbnNlY3VyZUNvbnRlbnRTdGF0dXMsc3VtbWFyeSk7fQpzZWxlY3RBbmRTd2l0Y2hUb01haW5WaWV3KCl7dGhpcy5fc2lkZWJhck1haW5WaWV3RWxlbWVudC5zZWxlY3QodHJ1ZSk7fQpzaG93T3JpZ2luKG9yaWdpbil7Y29uc3Qgb3JpZ2luU3RhdGU9dGhpcy5fb3JpZ2lucy5nZXQob3JpZ2luKTtpZighb3JpZ2luU3RhdGUub3JpZ2luVmlldykKb3JpZ2luU3RhdGUub3JpZ2luVmlldz1uZXcgU2VjdXJpdHkuU2VjdXJpdHlPcmlnaW5WaWV3KHRoaXMsb3JpZ2luLG9yaWdpblN0YXRlKTt0aGlzLl9zZXRWaXNpYmxlVmlldyhvcmlnaW5TdGF0ZS5vcmlnaW5WaWV3KTt9Cndhc1Nob3duKCl7c3VwZXIud2FzU2hvd24oKTtpZighdGhpcy5fdmlzaWJsZVZpZXcpCnRoaXMuc2VsZWN0QW5kU3dpdGNoVG9NYWluVmlldygpO30KZm9jdXMoKXt0aGlzLl9zaWRlYmFyVHJlZS5mb2N1cygpO30KX3NldFZpc2libGVWaWV3KHZpZXcpe2lmKHRoaXMuX3Zpc2libGVWaWV3PT09dmlldykKcmV0dXJuO2lmKHRoaXMuX3Zpc2libGVWaWV3KQp0aGlzLl92aXNpYmxlVmlldy5kZXRhY2goKTt0aGlzLl92aXNpYmxlVmlldz12aWV3O2lmKHZpZXcpCnRoaXMuc3BsaXRXaWRnZXQoKS5zZXRNYWluV2lkZ2V0KHZpZXcpO30KX29uUmVzcG9uc2VSZWNlaXZlZChldmVudCl7Y29uc3QgcmVxdWVzdD0oZXZlbnQuZGF0YSk7aWYocmVxdWVzdC5yZXNvdXJjZVR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50KQp0aGlzLl9sYXN0UmVzcG9uc2VSZWNlaXZlZEZvckxvYWRlcklkLnNldChyZXF1ZXN0LmxvYWRlcklkLHJlcXVlc3QpO30KX3Byb2Nlc3NSZXF1ZXN0KHJlcXVlc3Qpe2NvbnN0IG9yaWdpbj1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RPcmlnaW4ocmVxdWVzdC51cmwoKSk7aWYoIW9yaWdpbil7cmV0dXJuO30KbGV0IHNlY3VyaXR5U3RhdGU9KHJlcXVlc3Quc2VjdXJpdHlTdGF0ZSgpKTtpZihyZXF1ZXN0Lm1peGVkQ29udGVudFR5cGU9PT1Qcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLkJsb2NrYWJsZSYmdGhpcy5fcmFuSW5zZWN1cmVDb250ZW50U3R5bGUpCnNlY3VyaXR5U3RhdGU9dGhpcy5fcmFuSW5zZWN1cmVDb250ZW50U3R5bGU7ZWxzZSBpZihyZXF1ZXN0Lm1peGVkQ29udGVudFR5cGU9PT1Qcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLk9wdGlvbmFsbHlCbG9ja2FibGUmJnRoaXMuX2Rpc3BsYXllZEluc2VjdXJlQ29udGVudFN0eWxlKQpzZWN1cml0eVN0YXRlPXRoaXMuX2Rpc3BsYXllZEluc2VjdXJlQ29udGVudFN0eWxlO2lmKHRoaXMuX29yaWdpbnMuaGFzKG9yaWdpbikpe2NvbnN0IG9yaWdpblN0YXRlPXRoaXMuX29yaWdpbnMuZ2V0KG9yaWdpbik7Y29uc3Qgb2xkU2VjdXJpdHlTdGF0ZT1vcmlnaW5TdGF0ZS5zZWN1cml0eVN0YXRlO29yaWdpblN0YXRlLnNlY3VyaXR5U3RhdGU9dGhpcy5fc2VjdXJpdHlTdGF0ZU1pbihvbGRTZWN1cml0eVN0YXRlLHNlY3VyaXR5U3RhdGUpO2lmKG9sZFNlY3VyaXR5U3RhdGUhPT1vcmlnaW5TdGF0ZS5zZWN1cml0eVN0YXRlKXtjb25zdCBzZWN1cml0eURldGFpbHM9KHJlcXVlc3Quc2VjdXJpdHlEZXRhaWxzKCkpO2lmKHNlY3VyaXR5RGV0YWlscykKb3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzPXNlY3VyaXR5RGV0YWlsczt0aGlzLl9zaWRlYmFyVHJlZS51cGRhdGVPcmlnaW4ob3JpZ2luLHNlY3VyaXR5U3RhdGUpO2lmKG9yaWdpblN0YXRlLm9yaWdpblZpZXcpCm9yaWdpblN0YXRlLm9yaWdpblZpZXcuc2V0U2VjdXJpdHlTdGF0ZShzZWN1cml0eVN0YXRlKTt9fWVsc2V7Y29uc3Qgb3JpZ2luU3RhdGU9e307b3JpZ2luU3RhdGUuc2VjdXJpdHlTdGF0ZT1zZWN1cml0eVN0YXRlO2NvbnN0IHNlY3VyaXR5RGV0YWlscz1yZXF1ZXN0LnNlY3VyaXR5RGV0YWlscygpO2lmKHNlY3VyaXR5RGV0YWlscykKb3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzPXNlY3VyaXR5RGV0YWlscztvcmlnaW5TdGF0ZS5sb2FkZWRGcm9tQ2FjaGU9cmVxdWVzdC5jYWNoZWQoKTt0aGlzLl9vcmlnaW5zLnNldChvcmlnaW4sb3JpZ2luU3RhdGUpO3RoaXMuX3NpZGViYXJUcmVlLmFkZE9yaWdpbihvcmlnaW4sc2VjdXJpdHlTdGF0ZSk7fX0KX29uUmVxdWVzdEZpbmlzaGVkKGV2ZW50KXtjb25zdCByZXF1ZXN0PShldmVudC5kYXRhKTt0aGlzLl91cGRhdGVGaWx0ZXJSZXF1ZXN0Q291bnRzKHJlcXVlc3QpO3RoaXMuX3Byb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpO30KX3VwZGF0ZUZpbHRlclJlcXVlc3RDb3VudHMocmVxdWVzdCl7aWYocmVxdWVzdC5taXhlZENvbnRlbnRUeXBlPT09UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5Ob25lKQpyZXR1cm47bGV0IGZpbHRlcktleT1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5BbGw7aWYocmVxdWVzdC53YXNCbG9ja2VkKCkpCmZpbHRlcktleT1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5CbG9ja2VkO2Vsc2UgaWYocmVxdWVzdC5taXhlZENvbnRlbnRUeXBlPT09UHJvdG9jb2wuU2VjdXJpdHkuTWl4ZWRDb250ZW50VHlwZS5CbG9ja2FibGUpCmZpbHRlcktleT1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5CbG9ja092ZXJyaWRkZW47ZWxzZSBpZihyZXF1ZXN0Lm1peGVkQ29udGVudFR5cGU9PT1Qcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLk9wdGlvbmFsbHlCbG9ja2FibGUpCmZpbHRlcktleT1OZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5EaXNwbGF5ZWQ7aWYoIXRoaXMuX2ZpbHRlclJlcXVlc3RDb3VudHMuaGFzKGZpbHRlcktleSkpCnRoaXMuX2ZpbHRlclJlcXVlc3RDb3VudHMuc2V0KGZpbHRlcktleSwxKTtlbHNlCnRoaXMuX2ZpbHRlclJlcXVlc3RDb3VudHMuc2V0KGZpbHRlcktleSx0aGlzLl9maWx0ZXJSZXF1ZXN0Q291bnRzLmdldChmaWx0ZXJLZXkpKzEpO3RoaXMuX21haW5WaWV3LnJlZnJlc2hFeHBsYW5hdGlvbnMoKTt9CmZpbHRlclJlcXVlc3RDb3VudChmaWx0ZXJLZXkpe3JldHVybiB0aGlzLl9maWx0ZXJSZXF1ZXN0Q291bnRzLmdldChmaWx0ZXJLZXkpfHwwO30KX3NlY3VyaXR5U3RhdGVNaW4oc3RhdGVBLHN0YXRlQil7cmV0dXJuIFNlY3VyaXR5LlNlY3VyaXR5TW9kZWwuU2VjdXJpdHlTdGF0ZUNvbXBhcmF0b3Ioc3RhdGVBLHN0YXRlQik8MD9zdGF0ZUE6c3RhdGVCO30KbW9kZWxBZGRlZChzZWN1cml0eU1vZGVsKXtpZih0aGlzLl9zZWN1cml0eU1vZGVsKQpyZXR1cm47dGhpcy5fc2VjdXJpdHlNb2RlbD1zZWN1cml0eU1vZGVsO2NvbnN0IHJlc291cmNlVHJlZU1vZGVsPXNlY3VyaXR5TW9kZWwucmVzb3VyY2VUcmVlTW9kZWwoKTtjb25zdCBuZXR3b3JrTWFuYWdlcj1zZWN1cml0eU1vZGVsLm5ldHdvcmtNYW5hZ2VyKCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3NlY3VyaXR5TW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTZWN1cml0eS5TZWN1cml0eU1vZGVsLkV2ZW50cy5TZWN1cml0eVN0YXRlQ2hhbmdlZCx0aGlzLl9vblNlY3VyaXR5U3RhdGVDaGFuZ2VkLHRoaXMpLHJlc291cmNlVHJlZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcy5fb25NYWluRnJhbWVOYXZpZ2F0ZWQsdGhpcykscmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkludGVyc3RpdGlhbFNob3duLHRoaXMuX29uSW50ZXJzdGl0aWFsU2hvd24sdGhpcykscmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkludGVyc3RpdGlhbEhpZGRlbix0aGlzLl9vbkludGVyc3RpdGlhbEhpZGRlbix0aGlzKSxuZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5OZXR3b3JrTWFuYWdlci5FdmVudHMuUmVzcG9uc2VSZWNlaXZlZCx0aGlzLl9vblJlc3BvbnNlUmVjZWl2ZWQsdGhpcyksbmV0d29ya01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlcXVlc3RGaW5pc2hlZCx0aGlzLl9vblJlcXVlc3RGaW5pc2hlZCx0aGlzKSxdO2lmKHJlc291cmNlVHJlZU1vZGVsLmlzSW50ZXJzdGl0aWFsU2hvd2luZygpKQp0aGlzLl9vbkludGVyc3RpdGlhbFNob3duKCk7fQptb2RlbFJlbW92ZWQoc2VjdXJpdHlNb2RlbCl7aWYodGhpcy5fc2VjdXJpdHlNb2RlbCE9PXNlY3VyaXR5TW9kZWwpCnJldHVybjtkZWxldGUgdGhpcy5fc2VjdXJpdHlNb2RlbDtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO30KX29uTWFpbkZyYW1lTmF2aWdhdGVkKGV2ZW50KXtjb25zdCBmcmFtZT0oZXZlbnQuZGF0YSk7Y29uc3QgcmVxdWVzdD10aGlzLl9sYXN0UmVzcG9uc2VSZWNlaXZlZEZvckxvYWRlcklkLmdldChmcmFtZS5sb2FkZXJJZCk7dGhpcy5zZWxlY3RBbmRTd2l0Y2hUb01haW5WaWV3KCk7dGhpcy5fc2lkZWJhclRyZWUuY2xlYXJPcmlnaW5zKCk7dGhpcy5fb3JpZ2lucy5jbGVhcigpO3RoaXMuX2xhc3RSZXNwb25zZVJlY2VpdmVkRm9yTG9hZGVySWQuY2xlYXIoKTt0aGlzLl9maWx0ZXJSZXF1ZXN0Q291bnRzLmNsZWFyKCk7dGhpcy5fbWFpblZpZXcucmVmcmVzaEV4cGxhbmF0aW9ucygpO2NvbnN0IG9yaWdpbj1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RPcmlnaW4ocmVxdWVzdD9yZXF1ZXN0LnVybCgpOmZyYW1lLnVybCk7dGhpcy5fc2lkZWJhclRyZWUuc2V0TWFpbk9yaWdpbihvcmlnaW4pO2lmKHJlcXVlc3QpCnRoaXMuX3Byb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpO30KX29uSW50ZXJzdGl0aWFsU2hvd24oKXt0aGlzLnNlbGVjdEFuZFN3aXRjaFRvTWFpblZpZXcoKTt0aGlzLl9zaWRlYmFyVHJlZS50b2dnbGVPcmlnaW5zTGlzdCh0cnVlKTt9Cl9vbkludGVyc3RpdGlhbEhpZGRlbigpe3RoaXMuX3NpZGViYXJUcmVlLnRvZ2dsZU9yaWdpbnNMaXN0KGZhbHNlKTt9fTtTZWN1cml0eS5TZWN1cml0eVBhbmVsLk9yaWdpbjtTZWN1cml0eS5TZWN1cml0eVBhbmVsLk9yaWdpblN0YXRlO1NlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZT1jbGFzcyBleHRlbmRzIFVJLlRyZWVPdXRsaW5lSW5TaGFkb3d7Y29uc3RydWN0b3IobWFpblZpZXdFbGVtZW50LHNob3dPcmlnaW5JblBhbmVsKXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc2VjdXJpdHkvc2lkZWJhci5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NlY3VyaXR5L2xvY2tJY29uLmNzcycpO3RoaXMuYXBwZW5kQ2hpbGQobWFpblZpZXdFbGVtZW50KTt0aGlzLl9zaG93T3JpZ2luSW5QYW5lbD1zaG93T3JpZ2luSW5QYW5lbDt0aGlzLl9tYWluT3JpZ2luPW51bGw7dGhpcy5fb3JpZ2luR3JvdXBzPW5ldyBNYXAoKTtmb3IoY29uc3Qga2V5IGluIFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZS5PcmlnaW5Hcm91cE5hbWUpe2NvbnN0IG9yaWdpbkdyb3VwTmFtZT1TZWN1cml0eS5TZWN1cml0eVBhbmVsU2lkZWJhclRyZWUuT3JpZ2luR3JvdXBOYW1lW2tleV07Y29uc3Qgb3JpZ2luR3JvdXA9bmV3IFVJLlRyZWVFbGVtZW50KG9yaWdpbkdyb3VwTmFtZSx0cnVlKTtvcmlnaW5Hcm91cC5zZWxlY3RhYmxlPWZhbHNlO29yaWdpbkdyb3VwLnNldENvbGxhcHNpYmxlKGZhbHNlKTtvcmlnaW5Hcm91cC5leHBhbmQoKTtvcmlnaW5Hcm91cC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VjdXJpdHktc2lkZWJhci1vcmlnaW5zJyk7dGhpcy5fb3JpZ2luR3JvdXBzLnNldChvcmlnaW5Hcm91cE5hbWUsb3JpZ2luR3JvdXApO3RoaXMuYXBwZW5kQ2hpbGQob3JpZ2luR3JvdXApO30KdGhpcy5fY2xlYXJPcmlnaW5Hcm91cHMoKTtjb25zdCBtYWluVmlld1JlbG9hZE1lc3NhZ2U9bmV3IFVJLlRyZWVFbGVtZW50KENvbW1vbi5VSVN0cmluZygnUmVsb2FkIHRvIHZpZXcgZGV0YWlscycpKTttYWluVmlld1JlbG9hZE1lc3NhZ2Uuc2VsZWN0YWJsZT1mYWxzZTttYWluVmlld1JlbG9hZE1lc3NhZ2UubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlY3VyaXR5LW1haW4tdmlldy1yZWxvYWQtbWVzc2FnZScpO3RoaXMuX29yaWdpbkdyb3Vwcy5nZXQoU2VjdXJpdHkuU2VjdXJpdHlQYW5lbFNpZGViYXJUcmVlLk9yaWdpbkdyb3VwTmFtZS5NYWluT3JpZ2luKS5hcHBlbmRDaGlsZChtYWluVmlld1JlbG9hZE1lc3NhZ2UpO3RoaXMuX2VsZW1lbnRzQnlPcmlnaW49bmV3IE1hcCgpO30KdG9nZ2xlT3JpZ2luc0xpc3QoaGlkZGVuKXtmb3IoY29uc3Qga2V5IGluIFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZS5PcmlnaW5Hcm91cE5hbWUpe2NvbnN0IG9yaWdpbkdyb3VwTmFtZT1TZWN1cml0eS5TZWN1cml0eVBhbmVsU2lkZWJhclRyZWUuT3JpZ2luR3JvdXBOYW1lW2tleV07Y29uc3QgZ3JvdXA9dGhpcy5fb3JpZ2luR3JvdXBzLmdldChvcmlnaW5Hcm91cE5hbWUpO2lmKGdyb3VwKQpncm91cC5oaWRkZW49aGlkZGVuO319CmFkZE9yaWdpbihvcmlnaW4sc2VjdXJpdHlTdGF0ZSl7Y29uc3Qgb3JpZ2luRWxlbWVudD1uZXcgU2VjdXJpdHkuU2VjdXJpdHlQYW5lbFNpZGViYXJUcmVlRWxlbWVudChTZWN1cml0eS5TZWN1cml0eVBhbmVsLmNyZWF0ZUhpZ2hsaWdodGVkVXJsKG9yaWdpbixzZWN1cml0eVN0YXRlKSx0aGlzLl9zaG93T3JpZ2luSW5QYW5lbC5iaW5kKHRoaXMsb3JpZ2luKSwnc2VjdXJpdHktc2lkZWJhci10cmVlLWl0ZW0nLCdzZWN1cml0eS1wcm9wZXJ0eScpO3RoaXMuX2VsZW1lbnRzQnlPcmlnaW4uc2V0KG9yaWdpbixvcmlnaW5FbGVtZW50KTt0aGlzLnVwZGF0ZU9yaWdpbihvcmlnaW4sc2VjdXJpdHlTdGF0ZSk7fQpzZXRNYWluT3JpZ2luKG9yaWdpbil7dGhpcy5fbWFpbk9yaWdpbj1vcmlnaW47fQp1cGRhdGVPcmlnaW4ob3JpZ2luLHNlY3VyaXR5U3RhdGUpe2NvbnN0IG9yaWdpbkVsZW1lbnQ9KHRoaXMuX2VsZW1lbnRzQnlPcmlnaW4uZ2V0KG9yaWdpbikpO29yaWdpbkVsZW1lbnQuc2V0U2VjdXJpdHlTdGF0ZShzZWN1cml0eVN0YXRlKTtsZXQgbmV3UGFyZW50O2lmKG9yaWdpbj09PXRoaXMuX21haW5PcmlnaW4pe25ld1BhcmVudD10aGlzLl9vcmlnaW5Hcm91cHMuZ2V0KFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZS5PcmlnaW5Hcm91cE5hbWUuTWFpbk9yaWdpbik7fWVsc2V7c3dpdGNoKHNlY3VyaXR5U3RhdGUpe2Nhc2UgUHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5TZWN1cmU6bmV3UGFyZW50PXRoaXMuX29yaWdpbkdyb3Vwcy5nZXQoU2VjdXJpdHkuU2VjdXJpdHlQYW5lbFNpZGViYXJUcmVlLk9yaWdpbkdyb3VwTmFtZS5TZWN1cmUpO2JyZWFrO2Nhc2UgUHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5Vbmtub3duOm5ld1BhcmVudD10aGlzLl9vcmlnaW5Hcm91cHMuZ2V0KFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZS5PcmlnaW5Hcm91cE5hbWUuVW5rbm93bik7YnJlYWs7ZGVmYXVsdDpuZXdQYXJlbnQ9dGhpcy5fb3JpZ2luR3JvdXBzLmdldChTZWN1cml0eS5TZWN1cml0eVBhbmVsU2lkZWJhclRyZWUuT3JpZ2luR3JvdXBOYW1lLk5vblNlY3VyZSk7YnJlYWs7fX0KY29uc3Qgb2xkUGFyZW50PW9yaWdpbkVsZW1lbnQucGFyZW50O2lmKG9sZFBhcmVudCE9PW5ld1BhcmVudCl7aWYob2xkUGFyZW50KXtvbGRQYXJlbnQucmVtb3ZlQ2hpbGQob3JpZ2luRWxlbWVudCk7aWYob2xkUGFyZW50LmNoaWxkQ291bnQoKT09PTApCm9sZFBhcmVudC5oaWRkZW49dHJ1ZTt9Cm5ld1BhcmVudC5hcHBlbmRDaGlsZChvcmlnaW5FbGVtZW50KTtuZXdQYXJlbnQuaGlkZGVuPWZhbHNlO319Cl9jbGVhck9yaWdpbkdyb3Vwcygpe2Zvcihjb25zdCBvcmlnaW5Hcm91cCBvZiB0aGlzLl9vcmlnaW5Hcm91cHMudmFsdWVzKCkpe29yaWdpbkdyb3VwLnJlbW92ZUNoaWxkcmVuKCk7b3JpZ2luR3JvdXAuaGlkZGVuPXRydWU7fQp0aGlzLl9vcmlnaW5Hcm91cHMuZ2V0KFNlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZS5PcmlnaW5Hcm91cE5hbWUuTWFpbk9yaWdpbikuaGlkZGVuPWZhbHNlO30KY2xlYXJPcmlnaW5zKCl7dGhpcy5fY2xlYXJPcmlnaW5Hcm91cHMoKTt0aGlzLl9lbGVtZW50c0J5T3JpZ2luLmNsZWFyKCk7fX07U2VjdXJpdHkuU2VjdXJpdHlQYW5lbFNpZGViYXJUcmVlLk9yaWdpbkdyb3VwTmFtZT17TWFpbk9yaWdpbjpDb21tb24uVUlTdHJpbmcoJ01haW4gb3JpZ2luJyksTm9uU2VjdXJlOkNvbW1vbi5VSVN0cmluZygnTm9uLXNlY3VyZSBvcmlnaW5zJyksU2VjdXJlOkNvbW1vbi5VSVN0cmluZygnU2VjdXJlIG9yaWdpbnMnKSxVbmtub3duOkNvbW1vbi5VSVN0cmluZygnVW5rbm93biAvIGNhbmNlbGVkJyl9O1NlY3VyaXR5LlNlY3VyaXR5UGFuZWxTaWRlYmFyVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3Rvcih0ZXh0RWxlbWVudCxzZWxlY3RDYWxsYmFjayxjbGFzc05hbWUsY3NzUHJlZml4KXtzdXBlcignJyxmYWxzZSk7dGhpcy5fc2VsZWN0Q2FsbGJhY2s9c2VsZWN0Q2FsbGJhY2s7dGhpcy5fY3NzUHJlZml4PWNzc1ByZWZpeDt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7dGhpcy5faWNvbkVsZW1lbnQ9dGhpcy5saXN0SXRlbUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2ljb24nKTt0aGlzLl9pY29uRWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuX2Nzc1ByZWZpeCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dEVsZW1lbnQpO3RoaXMuc2V0U2VjdXJpdHlTdGF0ZShQcm90b2NvbC5TZWN1cml0eS5TZWN1cml0eVN0YXRlLlVua25vd24pO30Kc3RhdGljIFNlY3VyaXR5U3RhdGVDb21wYXJhdG9yKGEsYil7cmV0dXJuIFNlY3VyaXR5LlNlY3VyaXR5TW9kZWwuU2VjdXJpdHlTdGF0ZUNvbXBhcmF0b3IoYS5zZWN1cml0eVN0YXRlKCksYi5zZWN1cml0eVN0YXRlKCkpO30Kc2V0U2VjdXJpdHlTdGF0ZShuZXdTZWN1cml0eVN0YXRlKXtpZih0aGlzLl9zZWN1cml0eVN0YXRlKQp0aGlzLl9pY29uRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2Nzc1ByZWZpeCsnLScrdGhpcy5fc2VjdXJpdHlTdGF0ZSk7dGhpcy5fc2VjdXJpdHlTdGF0ZT1uZXdTZWN1cml0eVN0YXRlO3RoaXMuX2ljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fY3NzUHJlZml4KyctJytuZXdTZWN1cml0eVN0YXRlKTt9CnNlY3VyaXR5U3RhdGUoKXtyZXR1cm4gdGhpcy5fc2VjdXJpdHlTdGF0ZTt9Cm9uc2VsZWN0KCl7dGhpcy5fc2VsZWN0Q2FsbGJhY2soKTtyZXR1cm4gdHJ1ZTt9fTtTZWN1cml0eS5TZWN1cml0eU1haW5WaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihwYW5lbCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzZWN1cml0eS9tYWluVmlldy5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NlY3VyaXR5L2xvY2tJY29uLmNzcycpO3RoaXMuc2V0TWluaW11bVNpemUoMjAwLDEwMCk7dGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWN1cml0eS1tYWluLXZpZXcnKTt0aGlzLl9wYW5lbD1wYW5lbDt0aGlzLl9zdW1tYXJ5U2VjdGlvbj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZWN1cml0eS1zdW1tYXJ5Jyk7dGhpcy5fc2VjdXJpdHlFeHBsYW5hdGlvbnNNYWluPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LWV4cGxhbmF0aW9uLWxpc3Qgc2VjdXJpdHktZXhwbGFuYXRpb25zLW1haW4nKTt0aGlzLl9zZWN1cml0eUV4cGxhbmF0aW9uc0V4dHJhPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LWV4cGxhbmF0aW9uLWxpc3Qgc2VjdXJpdHktZXhwbGFuYXRpb25zLWV4dHJhJyk7dGhpcy5fc3VtbWFyeVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LXN1bW1hcnktc2VjdGlvbi10aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnU2VjdXJpdHkgb3ZlcnZpZXcnKTtjb25zdCBsb2NrU3BlY3RydW09dGhpcy5fc3VtbWFyeVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ2xvY2stc3BlY3RydW0nKTtsb2NrU3BlY3RydW0uY3JlYXRlQ2hpbGQoJ2RpdicsJ2xvY2staWNvbiBsb2NrLWljb24tc2VjdXJlJykudGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTZWN1cmUnKTtsb2NrU3BlY3RydW0uY3JlYXRlQ2hpbGQoJ2RpdicsJ2xvY2staWNvbiBsb2NrLWljb24tbmV1dHJhbCcpLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnTm90IHNlY3VyZScpO2xvY2tTcGVjdHJ1bS5jcmVhdGVDaGlsZCgnZGl2JywnbG9jay1pY29uIGxvY2staWNvbi1pbnNlY3VyZScpLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnTm90IHNlY3VyZSAoYnJva2VuKScpO3RoaXMuX3N1bW1hcnlTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCd0cmlhbmdsZS1wb2ludGVyLWNvbnRhaW5lcicpLmNyZWF0ZUNoaWxkKCdkaXYnLCd0cmlhbmdsZS1wb2ludGVyLXdyYXBwZXInKS5jcmVhdGVDaGlsZCgnZGl2JywndHJpYW5nbGUtcG9pbnRlcicpO3RoaXMuX3N1bW1hcnlUZXh0PXRoaXMuX3N1bW1hcnlTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZWN1cml0eS1zdW1tYXJ5LXRleHQnKTt9Cl9hZGRFeHBsYW5hdGlvbihwYXJlbnQsZXhwbGFuYXRpb24pe2NvbnN0IGV4cGxhbmF0aW9uU2VjdGlvbj1wYXJlbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LWV4cGxhbmF0aW9uJyk7ZXhwbGFuYXRpb25TZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ3NlY3VyaXR5LWV4cGxhbmF0aW9uLScrZXhwbGFuYXRpb24uc2VjdXJpdHlTdGF0ZSk7ZXhwbGFuYXRpb25TZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZWN1cml0eS1wcm9wZXJ0eScpLmNsYXNzTGlzdC5hZGQoJ3NlY3VyaXR5LXByb3BlcnR5LScrZXhwbGFuYXRpb24uc2VjdXJpdHlTdGF0ZSk7Y29uc3QgdGV4dD1leHBsYW5hdGlvblNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LWV4cGxhbmF0aW9uLXRleHQnKTtjb25zdCBleHBsYW5hdGlvbkhlYWRlcj10ZXh0LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZWN1cml0eS1leHBsYW5hdGlvbi10aXRsZScpO2lmKGV4cGxhbmF0aW9uLnRpdGxlKXtleHBsYW5hdGlvbkhlYWRlci5jcmVhdGVDaGlsZCgnc3BhbicpLnRleHRDb250ZW50PWV4cGxhbmF0aW9uLnRpdGxlKycgLSAnO2V4cGxhbmF0aW9uSGVhZGVyLmNyZWF0ZUNoaWxkKCdzcGFuJywnc2VjdXJpdHktZXhwbGFuYXRpb24tdGl0bGUtJytleHBsYW5hdGlvbi5zZWN1cml0eVN0YXRlKS50ZXh0Q29udGVudD1leHBsYW5hdGlvbi5zdW1tYXJ5O31lbHNle2V4cGxhbmF0aW9uSGVhZGVyLnRleHRDb250ZW50PWV4cGxhbmF0aW9uLnN1bW1hcnk7fQp0ZXh0LmNyZWF0ZUNoaWxkKCdkaXYnKS50ZXh0Q29udGVudD1leHBsYW5hdGlvbi5kZXNjcmlwdGlvbjtpZihleHBsYW5hdGlvbi5jZXJ0aWZpY2F0ZS5sZW5ndGgpe3RleHQuYXBwZW5kQ2hpbGQoU2VjdXJpdHkuU2VjdXJpdHlQYW5lbC5jcmVhdGVDZXJ0aWZpY2F0ZVZpZXdlckJ1dHRvbkZvckNlcnQoQ29tbW9uLlVJU3RyaW5nKCdWaWV3IGNlcnRpZmljYXRlJyksZXhwbGFuYXRpb24uY2VydGlmaWNhdGUpKTt9CnJldHVybiB0ZXh0O30KdXBkYXRlU2VjdXJpdHlTdGF0ZShuZXdTZWN1cml0eVN0YXRlLHNjaGVtZUlzQ3J5cHRvZ3JhcGhpYyxleHBsYW5hdGlvbnMsaW5zZWN1cmVDb250ZW50U3RhdHVzLHN1bW1hcnkpe3RoaXMuX3N1bW1hcnlTZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ3NlY3VyaXR5LXN1bW1hcnktJyt0aGlzLl9zZWN1cml0eVN0YXRlKTt0aGlzLl9zZWN1cml0eVN0YXRlPW5ld1NlY3VyaXR5U3RhdGU7dGhpcy5fc3VtbWFyeVNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnc2VjdXJpdHktc3VtbWFyeS0nK3RoaXMuX3NlY3VyaXR5U3RhdGUpO2NvbnN0IHN1bW1hcnlFeHBsYW5hdGlvblN0cmluZ3M9eyd1bmtub3duJzpDb21tb24uVUlTdHJpbmcoJ1RoZSBzZWN1cml0eSBvZiB0aGlzIHBhZ2UgaXMgdW5rbm93bi4nKSwnaW5zZWN1cmUnOkNvbW1vbi5VSVN0cmluZygnVGhpcyBwYWdlIGlzIG5vdCBzZWN1cmUgKGJyb2tlbiBIVFRQUykuJyksJ25ldXRyYWwnOkNvbW1vbi5VSVN0cmluZygnVGhpcyBwYWdlIGlzIG5vdCBzZWN1cmUuJyksJ3NlY3VyZSc6Q29tbW9uLlVJU3RyaW5nKCdUaGlzIHBhZ2UgaXMgc2VjdXJlICh2YWxpZCBIVFRQUykuJyl9O3RoaXMuX3N1bW1hcnlUZXh0LnRleHRDb250ZW50PXN1bW1hcnl8fHN1bW1hcnlFeHBsYW5hdGlvblN0cmluZ3NbdGhpcy5fc2VjdXJpdHlTdGF0ZV07dGhpcy5fZXhwbGFuYXRpb25zPWV4cGxhbmF0aW9ucyx0aGlzLl9pbnNlY3VyZUNvbnRlbnRTdGF0dXM9aW5zZWN1cmVDb250ZW50U3RhdHVzO3RoaXMuX3NjaGVtZUlzQ3J5cHRvZ3JhcGhpYz1zY2hlbWVJc0NyeXB0b2dyYXBoaWM7dGhpcy5fcGFuZWwuc2V0UmFuSW5zZWN1cmVDb250ZW50U3R5bGUoaW5zZWN1cmVDb250ZW50U3RhdHVzLnJhbkluc2VjdXJlQ29udGVudFN0eWxlKTt0aGlzLl9wYW5lbC5zZXREaXNwbGF5ZWRJbnNlY3VyZUNvbnRlbnRTdHlsZShpbnNlY3VyZUNvbnRlbnRTdGF0dXMuZGlzcGxheWVkSW5zZWN1cmVDb250ZW50U3R5bGUpO3RoaXMucmVmcmVzaEV4cGxhbmF0aW9ucygpO30KcmVmcmVzaEV4cGxhbmF0aW9ucygpe3RoaXMuX3NlY3VyaXR5RXhwbGFuYXRpb25zTWFpbi5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3NlY3VyaXR5RXhwbGFuYXRpb25zRXh0cmEucmVtb3ZlQ2hpbGRyZW4oKTtmb3IoY29uc3QgZXhwbGFuYXRpb24gb2YgdGhpcy5fZXhwbGFuYXRpb25zKXtpZihleHBsYW5hdGlvbi5zZWN1cml0eVN0YXRlPT09UHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5JbmZvKXt0aGlzLl9hZGRFeHBsYW5hdGlvbih0aGlzLl9zZWN1cml0eUV4cGxhbmF0aW9uc0V4dHJhLGV4cGxhbmF0aW9uKTt9ZWxzZXtzd2l0Y2goZXhwbGFuYXRpb24ubWl4ZWRDb250ZW50VHlwZSl7Y2FzZSBQcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLkJsb2NrYWJsZTp0aGlzLl9hZGRNaXhlZENvbnRlbnRFeHBsYW5hdGlvbih0aGlzLl9zZWN1cml0eUV4cGxhbmF0aW9uc01haW4sZXhwbGFuYXRpb24sTmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuQmxvY2tPdmVycmlkZGVuKTticmVhaztjYXNlIFByb3RvY29sLlNlY3VyaXR5Lk1peGVkQ29udGVudFR5cGUuT3B0aW9uYWxseUJsb2NrYWJsZTp0aGlzLl9hZGRNaXhlZENvbnRlbnRFeHBsYW5hdGlvbih0aGlzLl9zZWN1cml0eUV4cGxhbmF0aW9uc01haW4sZXhwbGFuYXRpb24sTmV0d29yay5OZXR3b3JrTG9nVmlldy5NaXhlZENvbnRlbnRGaWx0ZXJWYWx1ZXMuRGlzcGxheWVkKTticmVhaztkZWZhdWx0OnRoaXMuX2FkZEV4cGxhbmF0aW9uKHRoaXMuX3NlY3VyaXR5RXhwbGFuYXRpb25zTWFpbixleHBsYW5hdGlvbik7YnJlYWs7fX19CmlmKHRoaXMuX3BhbmVsLmZpbHRlclJlcXVlc3RDb3VudChOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5CbG9ja2VkKT4wKXtjb25zdCBleHBsYW5hdGlvbj0oe3NlY3VyaXR5U3RhdGU6UHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5JbmZvLHN1bW1hcnk6Q29tbW9uLlVJU3RyaW5nKCdCbG9ja2VkIG1peGVkIGNvbnRlbnQnKSxkZXNjcmlwdGlvbjpDb21tb24uVUlTdHJpbmcoJ1lvdXIgcGFnZSByZXF1ZXN0ZWQgbm9uLXNlY3VyZSByZXNvdXJjZXMgdGhhdCB3ZXJlIGJsb2NrZWQuJyksbWl4ZWRDb250ZW50VHlwZTpQcm90b2NvbC5TZWN1cml0eS5NaXhlZENvbnRlbnRUeXBlLkJsb2NrYWJsZSxjZXJ0aWZpY2F0ZTpbXX0pO3RoaXMuX2FkZE1peGVkQ29udGVudEV4cGxhbmF0aW9uKHRoaXMuX3NlY3VyaXR5RXhwbGFuYXRpb25zTWFpbixleHBsYW5hdGlvbixOZXR3b3JrLk5ldHdvcmtMb2dWaWV3Lk1peGVkQ29udGVudEZpbHRlclZhbHVlcy5CbG9ja2VkKTt9fQpfYWRkTWl4ZWRDb250ZW50RXhwbGFuYXRpb24ocGFyZW50LGV4cGxhbmF0aW9uLGZpbHRlcktleSl7Y29uc3QgZWxlbWVudD10aGlzLl9hZGRFeHBsYW5hdGlvbihwYXJlbnQsZXhwbGFuYXRpb24pO2NvbnN0IGZpbHRlclJlcXVlc3RDb3VudD10aGlzLl9wYW5lbC5maWx0ZXJSZXF1ZXN0Q291bnQoZmlsdGVyS2V5KTtpZighZmlsdGVyUmVxdWVzdENvdW50KXtjb25zdCByZWZyZXNoUHJvbXB0PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NlY3VyaXR5LW1peGVkLWNvbnRlbnQnKTtyZWZyZXNoUHJvbXB0LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUmVsb2FkIHRoZSBwYWdlIHRvIHJlY29yZCByZXF1ZXN0cyBmb3IgSFRUUCByZXNvdXJjZXMuJyk7cmV0dXJuO30KY29uc3QgcmVxdWVzdHNBbmNob3I9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2VjdXJpdHktbWl4ZWQtY29udGVudCBsaW5rJyk7aWYoZmlsdGVyUmVxdWVzdENvdW50PT09MSkKcmVxdWVzdHNBbmNob3IudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdWaWV3ICVkIHJlcXVlc3QgaW4gTmV0d29yayBQYW5lbCcsZmlsdGVyUmVxdWVzdENvdW50KTtlbHNlCnJlcXVlc3RzQW5jaG9yLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVmlldyAlZCByZXF1ZXN0cyBpbiBOZXR3b3JrIFBhbmVsJyxmaWx0ZXJSZXF1ZXN0Q291bnQpO3JlcXVlc3RzQW5jaG9yLmhyZWY9Jyc7cmVxdWVzdHNBbmNob3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuc2hvd05ldHdvcmtGaWx0ZXIuYmluZCh0aGlzLGZpbHRlcktleSkpO30Kc2hvd05ldHdvcmtGaWx0ZXIoZmlsdGVyS2V5LGUpe2UuY29uc3VtZSgpO05ldHdvcmsuTmV0d29ya1BhbmVsLnJldmVhbEFuZEZpbHRlcihbe2ZpbHRlclR5cGU6TmV0d29yay5OZXR3b3JrTG9nVmlldy5GaWx0ZXJUeXBlLk1peGVkQ29udGVudCxmaWx0ZXJWYWx1ZTpmaWx0ZXJLZXl9XSk7fX07U2VjdXJpdHkuU2VjdXJpdHlPcmlnaW5WaWV3PWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihwYW5lbCxvcmlnaW4sb3JpZ2luU3RhdGUpe3N1cGVyKCk7dGhpcy5fcGFuZWw9cGFuZWw7dGhpcy5zZXRNaW5pbXVtU2l6ZSgyMDAsMTAwKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VjdXJpdHktb3JpZ2luLXZpZXcnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NlY3VyaXR5L29yaWdpblZpZXcuY3NzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzZWN1cml0eS9sb2NrSWNvbi5jc3MnKTtjb25zdCB0aXRsZVNlY3Rpb249dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aXRsZS1zZWN0aW9uJyk7dGl0bGVTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCd0aXRsZS1zZWN0aW9uLWhlYWRlcicpLnRleHRDb250ZW50PWxzYE9yaWdpbmA7Y29uc3Qgb3JpZ2luRGlzcGxheT10aXRsZVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ29yaWdpbi1kaXNwbGF5Jyk7dGhpcy5fb3JpZ2luTG9ja0ljb249b3JpZ2luRGlzcGxheS5jcmVhdGVDaGlsZCgnc3BhbicsJ3NlY3VyaXR5LXByb3BlcnR5Jyk7dGhpcy5fb3JpZ2luTG9ja0ljb24uY2xhc3NMaXN0LmFkZCgnc2VjdXJpdHktcHJvcGVydHktJytvcmlnaW5TdGF0ZS5zZWN1cml0eVN0YXRlKTtvcmlnaW5EaXNwbGF5LmFwcGVuZENoaWxkKFNlY3VyaXR5LlNlY3VyaXR5UGFuZWwuY3JlYXRlSGlnaGxpZ2h0ZWRVcmwob3JpZ2luLG9yaWdpblN0YXRlLnNlY3VyaXR5U3RhdGUpKTtjb25zdCBvcmlnaW5OZXR3b3JrQnV0dG9uPXRpdGxlU2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2Jywndmlldy1uZXR3b3JrLWJ1dHRvbicpO29yaWdpbk5ldHdvcmtCdXR0b24uYXBwZW5kQ2hpbGQoVUkuY3JlYXRlVGV4dEJ1dHRvbignVmlldyByZXF1ZXN0cyBpbiBOZXR3b3JrIFBhbmVsJyxlPT57ZS5jb25zdW1lKCk7Y29uc3QgcGFyc2VkVVJMPW5ldyBDb21tb24uUGFyc2VkVVJMKG9yaWdpbik7TmV0d29yay5OZXR3b3JrUGFuZWwucmV2ZWFsQW5kRmlsdGVyKFt7ZmlsdGVyVHlwZTpOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuRG9tYWluLGZpbHRlclZhbHVlOnBhcnNlZFVSTC5ob3N0fSx7ZmlsdGVyVHlwZTpOZXR3b3JrLk5ldHdvcmtMb2dWaWV3LkZpbHRlclR5cGUuU2NoZW1lLGZpbHRlclZhbHVlOnBhcnNlZFVSTC5zY2hlbWV9XSk7fSwnb3JpZ2luLWJ1dHRvbicpKTtpZihvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMpe2NvbnN0IGNvbm5lY3Rpb25TZWN0aW9uPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbicpO2Nvbm5lY3Rpb25TZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmlnaW4tdmlldy1zZWN0aW9uLXRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdDb25uZWN0aW9uJyk7bGV0IHRhYmxlPW5ldyBTZWN1cml0eS5TZWN1cml0eURldGFpbHNUYWJsZSgpO2Nvbm5lY3Rpb25TZWN0aW9uLmFwcGVuZENoaWxkKHRhYmxlLmVsZW1lbnQoKSk7dGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnUHJvdG9jb2wnKSxvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMucHJvdG9jb2wpO2lmKG9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5rZXlFeGNoYW5nZSkKdGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnS2V5IGV4Y2hhbmdlJyksb3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzLmtleUV4Y2hhbmdlKTtpZihvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMua2V5RXhjaGFuZ2VHcm91cCkKdGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnS2V5IGV4Y2hhbmdlIGdyb3VwJyksb3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzLmtleUV4Y2hhbmdlR3JvdXApO3RhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ0NpcGhlcicpLG9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5jaXBoZXIrCihvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMubWFjPycgd2l0aCAnK29yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5tYWM6JycpKTtjb25zdCBjZXJ0aWZpY2F0ZVNlY3Rpb249dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmlnaW4tdmlldy1zZWN0aW9uJyk7Y2VydGlmaWNhdGVTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmlnaW4tdmlldy1zZWN0aW9uLXRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdDZXJ0aWZpY2F0ZScpO2NvbnN0IHNjdExpc3RMZW5ndGg9b3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzLnNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdC5sZW5ndGg7Y29uc3QgY3RDb21wbGlhbmNlPW9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5jZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUNvbXBsaWFuY2U7bGV0IHNjdFNlY3Rpb247aWYoc2N0TGlzdExlbmd0aHx8Y3RDb21wbGlhbmNlIT09UHJvdG9jb2wuTmV0d29yay5DZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUNvbXBsaWFuY2UuVW5rbm93bil7c2N0U2VjdGlvbj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ29yaWdpbi12aWV3LXNlY3Rpb24nKTtzY3RTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmlnaW4tdmlldy1zZWN0aW9uLXRpdGxlJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdDZXJ0aWZpY2F0ZSBUcmFuc3BhcmVuY3knKTt9CmNvbnN0IHNhbkRpdj10aGlzLl9jcmVhdGVTYW5EaXYob3JpZ2luU3RhdGUuc2VjdXJpdHlEZXRhaWxzLnNhbkxpc3QpO2NvbnN0IHZhbGlkRnJvbVN0cmluZz1uZXcgRGF0ZSgxMDAwKm9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy52YWxpZEZyb20pLnRvVVRDU3RyaW5nKCk7Y29uc3QgdmFsaWRVbnRpbFN0cmluZz1uZXcgRGF0ZSgxMDAwKm9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy52YWxpZFRvKS50b1VUQ1N0cmluZygpO3RhYmxlPW5ldyBTZWN1cml0eS5TZWN1cml0eURldGFpbHNUYWJsZSgpO2NlcnRpZmljYXRlU2VjdGlvbi5hcHBlbmRDaGlsZCh0YWJsZS5lbGVtZW50KCkpO3RhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ1N1YmplY3QnKSxvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMuc3ViamVjdE5hbWUpO3RhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ1NBTicpLHNhbkRpdik7dGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnVmFsaWQgZnJvbScpLHZhbGlkRnJvbVN0cmluZyk7dGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnVmFsaWQgdW50aWwnKSx2YWxpZFVudGlsU3RyaW5nKTt0YWJsZS5hZGRSb3coQ29tbW9uLlVJU3RyaW5nKCdJc3N1ZXInKSxvcmlnaW5TdGF0ZS5zZWN1cml0eURldGFpbHMuaXNzdWVyKTt0YWJsZS5hZGRSb3coJycsU2VjdXJpdHkuU2VjdXJpdHlQYW5lbC5jcmVhdGVDZXJ0aWZpY2F0ZVZpZXdlckJ1dHRvbkZvck9yaWdpbihDb21tb24uVUlTdHJpbmcoJ09wZW4gZnVsbCBjZXJ0aWZpY2F0ZSBkZXRhaWxzJyksb3JpZ2luKSk7aWYoIXNjdFNlY3Rpb24pCnJldHVybjtjb25zdCBzY3RTdW1tYXJ5VGFibGU9bmV3IFNlY3VyaXR5LlNlY3VyaXR5RGV0YWlsc1RhYmxlKCk7c2N0U3VtbWFyeVRhYmxlLmVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCdzY3Qtc3VtbWFyeScpO3NjdFNlY3Rpb24uYXBwZW5kQ2hpbGQoc2N0U3VtbWFyeVRhYmxlLmVsZW1lbnQoKSk7Zm9yKGxldCBpPTA7aTxzY3RMaXN0TGVuZ3RoO2krKyl7Y29uc3Qgc2N0PW9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5zaWduZWRDZXJ0aWZpY2F0ZVRpbWVzdGFtcExpc3RbaV07c2N0U3VtbWFyeVRhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ1NDVCcpLHNjdC5sb2dEZXNjcmlwdGlvbisnICgnK3NjdC5vcmlnaW4rJywgJytzY3Quc3RhdHVzKycpJyk7fQpjb25zdCBzY3RUYWJsZVdyYXBwZXI9c2N0U2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2Jywnc2N0LWRldGFpbHMnKTtzY3RUYWJsZVdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7Zm9yKGxldCBpPTA7aTxzY3RMaXN0TGVuZ3RoO2krKyl7Y29uc3Qgc2N0VGFibGU9bmV3IFNlY3VyaXR5LlNlY3VyaXR5RGV0YWlsc1RhYmxlKCk7c2N0VGFibGVXcmFwcGVyLmFwcGVuZENoaWxkKHNjdFRhYmxlLmVsZW1lbnQoKSk7Y29uc3Qgc2N0PW9yaWdpblN0YXRlLnNlY3VyaXR5RGV0YWlscy5zaWduZWRDZXJ0aWZpY2F0ZVRpbWVzdGFtcExpc3RbaV07c2N0VGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnTG9nIG5hbWUnKSxzY3QubG9nRGVzY3JpcHRpb24pO3NjdFRhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ0xvZyBJRCcpLHNjdC5sb2dJZC5yZXBsYWNlKC8oLnsyfSkvZywnJDEgJykpO3NjdFRhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ1ZhbGlkYXRpb24gc3RhdHVzJyksc2N0LnN0YXR1cyk7c2N0VGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnU291cmNlJyksc2N0Lm9yaWdpbik7c2N0VGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnSXNzdWVkIGF0JyksbmV3IERhdGUoc2N0LnRpbWVzdGFtcCkudG9VVENTdHJpbmcoKSk7c2N0VGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnSGFzaCBhbGdvcml0aG0nKSxzY3QuaGFzaEFsZ29yaXRobSk7c2N0VGFibGUuYWRkUm93KENvbW1vbi5VSVN0cmluZygnU2lnbmF0dXJlIGFsZ29yaXRobScpLHNjdC5zaWduYXR1cmVBbGdvcml0aG0pO3NjdFRhYmxlLmFkZFJvdyhDb21tb24uVUlTdHJpbmcoJ1NpZ25hdHVyZSBkYXRhJyksc2N0LnNpZ25hdHVyZURhdGEucmVwbGFjZSgvKC57Mn0pL2csJyQxICcpKTt9CmlmKHNjdExpc3RMZW5ndGgpe2NvbnN0IHRvZ2dsZVNjdHNEZXRhaWxzTGluaz1zY3RTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCdsaW5rJyk7dG9nZ2xlU2N0c0RldGFpbHNMaW5rLmNsYXNzTGlzdC5hZGQoJ3NjdC10b2dnbGUnKTt0b2dnbGVTY3RzRGV0YWlsc0xpbmsudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IGZ1bGwgZGV0YWlscycpO2Z1bmN0aW9uIHRvZ2dsZVNjdERldGFpbHNEaXNwbGF5KCl7Y29uc3QgaXNEZXRhaWxzU2hvd249IXNjdFRhYmxlV3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpO2lmKGlzRGV0YWlsc1Nob3duKQp0b2dnbGVTY3RzRGV0YWlsc0xpbmsudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IGZ1bGwgZGV0YWlscycpO2Vsc2UKdG9nZ2xlU2N0c0RldGFpbHNMaW5rLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnSGlkZSBmdWxsIGRldGFpbHMnKTtzY3RTdW1tYXJ5VGFibGUuZWxlbWVudCgpLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicpO3NjdFRhYmxlV3JhcHBlci5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nKTt9CnRvZ2dsZVNjdHNEZXRhaWxzTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdG9nZ2xlU2N0RGV0YWlsc0Rpc3BsYXksZmFsc2UpO30Kc3dpdGNoKGN0Q29tcGxpYW5jZSl7Y2FzZSBQcm90b2NvbC5OZXR3b3JrLkNlcnRpZmljYXRlVHJhbnNwYXJlbmN5Q29tcGxpYW5jZS5Db21wbGlhbnQ6c2N0U2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbi1ub3RlcycpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVGhpcyByZXF1ZXN0IGNvbXBsaWVzIHdpdGggQ2hyb21lXCdzIENlcnRpZmljYXRlIFRyYW5zcGFyZW5jeSBwb2xpY3kuJyk7YnJlYWs7Y2FzZSBQcm90b2NvbC5OZXR3b3JrLkNlcnRpZmljYXRlVHJhbnNwYXJlbmN5Q29tcGxpYW5jZS5Ob3RDb21wbGlhbnQ6c2N0U2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbi1ub3RlcycpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVGhpcyByZXF1ZXN0IGRvZXMgbm90IGNvbXBseSB3aXRoIENocm9tZVwncyBDZXJ0aWZpY2F0ZSBUcmFuc3BhcmVuY3kgcG9saWN5LicpO2JyZWFrO2Nhc2UgUHJvdG9jb2wuTmV0d29yay5DZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUNvbXBsaWFuY2UuVW5rbm93bjpicmVhazt9CmNvbnN0IG5vdGVTZWN0aW9uPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbiBvcmlnaW4tdmlldy1ub3RlcycpO2lmKG9yaWdpblN0YXRlLmxvYWRlZEZyb21DYWNoZSl7bm90ZVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVGhpcyByZXNwb25zZSB3YXMgbG9hZGVkIGZyb20gY2FjaGUuIFNvbWUgc2VjdXJpdHkgZGV0YWlscyBtaWdodCBiZSBtaXNzaW5nLicpO30Kbm90ZVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnVGhlIHNlY3VyaXR5IGRldGFpbHMgYWJvdmUgYXJlIGZyb20gdGhlIGZpcnN0IGluc3BlY3RlZCByZXNwb25zZS4nKTt9ZWxzZSBpZihvcmlnaW5TdGF0ZS5zZWN1cml0eVN0YXRlIT09UHJvdG9jb2wuU2VjdXJpdHkuU2VjdXJpdHlTdGF0ZS5Vbmtub3duKXtjb25zdCBub3RTZWN1cmVTZWN0aW9uPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbicpO25vdFNlY3VyZVNlY3Rpb24uY3JlYXRlQ2hpbGQoJ2RpdicsJ29yaWdpbi12aWV3LXNlY3Rpb24tdGl0bGUnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05vdCBzZWN1cmUnKTtub3RTZWN1cmVTZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1lvdXIgY29ubmVjdGlvbiB0byB0aGlzIG9yaWdpbiBpcyBub3Qgc2VjdXJlLicpO31lbHNle2NvbnN0IG5vSW5mb1NlY3Rpb249dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdvcmlnaW4tdmlldy1zZWN0aW9uJyk7bm9JbmZvU2VjdGlvbi5jcmVhdGVDaGlsZCgnZGl2Jywnb3JpZ2luLXZpZXctc2VjdGlvbi10aXRsZScpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gc2VjdXJpdHkgaW5mb3JtYXRpb24nKTtub0luZm9TZWN0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05vIHNlY3VyaXR5IGRldGFpbHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBvcmlnaW4uJyk7fX0KX2NyZWF0ZVNhbkRpdihzYW5MaXN0KXtjb25zdCBzYW5EaXY9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7aWYoc2FuTGlzdC5sZW5ndGg9PT0wKXtzYW5EaXYudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCcobi9hKScpO3NhbkRpdi5jbGFzc0xpc3QuYWRkKCdlbXB0eS1zYW4nKTt9ZWxzZXtjb25zdCB0cnVuY2F0ZWROdW1Ub1Nob3c9Mjtjb25zdCBsaXN0SXNUcnVuY2F0ZWQ9c2FuTGlzdC5sZW5ndGg+dHJ1bmNhdGVkTnVtVG9TaG93KzE7Zm9yKGxldCBpPTA7aTxzYW5MaXN0Lmxlbmd0aDtpKyspe2NvbnN0IHNwYW49c2FuRGl2LmNyZWF0ZUNoaWxkKCdzcGFuJywnc2FuLWVudHJ5Jyk7c3Bhbi50ZXh0Q29udGVudD1zYW5MaXN0W2ldO2lmKGxpc3RJc1RydW5jYXRlZCYmaT49dHJ1bmNhdGVkTnVtVG9TaG93KQpzcGFuLmNsYXNzTGlzdC5hZGQoJ3RydW5jYXRlZC1lbnRyeScpO30KaWYobGlzdElzVHJ1bmNhdGVkKXtjb25zdCB0cnVuY2F0ZWRTQU5Ub2dnbGU9c2FuRGl2LmNyZWF0ZUNoaWxkKCdkaXYnLCdsaW5rJyk7dHJ1bmNhdGVkU0FOVG9nZ2xlLmhyZWY9Jyc7ZnVuY3Rpb24gdG9nZ2xlU0FOVHJ1bmNhdGlvbigpe2lmKHNhbkRpdi5jbGFzc0xpc3QuY29udGFpbnMoJ3RydW5jYXRlZC1zYW4nKSl7c2FuRGl2LmNsYXNzTGlzdC5yZW1vdmUoJ3RydW5jYXRlZC1zYW4nKTt0cnVuY2F0ZWRTQU5Ub2dnbGUudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IGxlc3MnKTt9ZWxzZXtzYW5EaXYuY2xhc3NMaXN0LmFkZCgndHJ1bmNhdGVkLXNhbicpO3RydW5jYXRlZFNBTlRvZ2dsZS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Nob3cgbW9yZSAoJWQgdG90YWwpJyxzYW5MaXN0Lmxlbmd0aCk7fX0KdHJ1bmNhdGVkU0FOVG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0b2dnbGVTQU5UcnVuY2F0aW9uLGZhbHNlKTt0b2dnbGVTQU5UcnVuY2F0aW9uKCk7fX0KcmV0dXJuIHNhbkRpdjt9CnNldFNlY3VyaXR5U3RhdGUobmV3U2VjdXJpdHlTdGF0ZSl7Zm9yKGNvbnN0IGNsYXNzTmFtZSBvZiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9vcmlnaW5Mb2NrSWNvbi5jbGFzc0xpc3QpKXtpZihjbGFzc05hbWUuc3RhcnRzV2l0aCgnc2VjdXJpdHktcHJvcGVydHktJykpCnRoaXMuX29yaWdpbkxvY2tJY29uLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTt9CnRoaXMuX29yaWdpbkxvY2tJY29uLmNsYXNzTGlzdC5hZGQoJ3NlY3VyaXR5LXByb3BlcnR5LScrbmV3U2VjdXJpdHlTdGF0ZSk7fX07U2VjdXJpdHkuU2VjdXJpdHlEZXRhaWxzVGFibGU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9lbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkZXRhaWxzLXRhYmxlJyk7fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQ7fQphZGRSb3coa2V5LHZhbHVlKXtjb25zdCByb3c9dGhpcy5fZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnZGV0YWlscy10YWJsZS1yb3cnKTtyb3cuY3JlYXRlQ2hpbGQoJ2RpdicpLnRleHRDb250ZW50PWtleTtjb25zdCB2YWx1ZURpdj1yb3cuY3JlYXRlQ2hpbGQoJ2RpdicpO2lmKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnKQp2YWx1ZURpdi50ZXh0Q29udGVudD12YWx1ZTtlbHNlCnZhbHVlRGl2LmFwcGVuZENoaWxkKHZhbHVlKTt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNlY3VyaXR5L2xvY2tJY29uLmNzcyJdPSIvKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5sb2NrLWljb24sXG4uc2VjdXJpdHktcHJvcGVydHkge1xuICAgIGhlaWdodDogMTZweDtcbiAgICB3aWR0aDogMTZweDtcblxuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9zZWN1cml0eUljb25zLnBuZyk7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDgwcHggMzJweDtcblxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4ODg7XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbiAgICAubG9jay1pY29uLFxuICAgIC5zZWN1cml0eS1wcm9wZXJ0eSB7XG4gICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9zZWN1cml0eUljb25zXzJ4LnBuZyk7XG4gICAgfVxufVxuXG4ubG9jay1pY29uLXNlY3VyZSB7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAwcHggMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwQjgwNDM7XG59XG5cbi5sb2NrLWljb24tdW5rbm93bixcbi5sb2NrLWljb24tbmV1dHJhbCB7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAtMTZweCAwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgLyogQmxhY2sgZm9yIGNsYXJpdHkgb24gbG93ZXIgRFBJIHNjcmVlbnMgKi9cbn1cblxuQG1lZGlhICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDEuMSkge1xuICAgIC5sb2NrLWljb24tdW5rbm93bixcbiAgICAubG9jay1pY29uLW5ldXRyYWwge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNUE1QTVBOyAvKiBHcmF5IGZvciBoaURQSSBzY3JlZW5zICovXG4gICAgfVxufVxuXG4ubG9jay1pY29uLWluc2VjdXJlIHtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IC0zMnB4IDBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQzYzNjI2O1xufVxuXG4uc2VjdXJpdHktcHJvcGVydHktc2VjdXJlIHtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IDBweCAtMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMEI4MDQzO1xufVxuXG4uc2VjdXJpdHktcHJvcGVydHktbmV1dHJhbCB7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAtMTZweCAtMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQzYzNjI2O1xufVxuXG4uc2VjdXJpdHktcHJvcGVydHktaW5zZWN1cmUge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogLTMycHggLTE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0M2MzYyNjtcbn1cblxuLnNlY3VyaXR5LXByb3BlcnR5LWluZm8ge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogLTQ4cHggLTE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuXG4uc2VjdXJpdHktcHJvcGVydHktdW5rbm93biB7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiAtNjRweCAtMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG5cbi51cmwtc2NoZW1lLXNlY3VyZSB7XG4gICAgY29sb3I6ICMwYjgwNDM7XG59XG5cbi51cmwtc2NoZW1lLW5ldXRyYWwsXG4udXJsLXNjaGVtZS1pbnNlY3VyZSB7XG4gICAgY29sb3I6ICNjYjM2MjY7XG59XG5cbi51cmwtc2NoZW1lLXNlcGFyYXRvciB7XG4gICAgY29sb3I6ICM4YThhOGE7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2VjdXJpdHkvbG9ja0ljb24uY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic2VjdXJpdHkvbWFpblZpZXcuY3NzIl09Ii8qIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNlY3VyaXR5LW1haW4tdmlldyB7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbn1cblxuLnNlY3VyaXR5LW1haW4tdmlldyA+IGRpdiB7XG4gICAgZmxleC1zaHJpbms6IDA7XG59XG5cbi5zZWN1cml0eS1zdW1tYXJ5LXNlY3Rpb24tdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBtYXJnaW46IDEycHggMTZweDtcbn1cblxuLmxvY2stc3BlY3RydW0ge1xuICAgIG1hcmdpbjogOHB4IDE2cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cblxuLnNlY3VyaXR5LXN1bW1hcnkgLmxvY2staWNvbiB7XG4gICAgZmxleDogbm9uZTtcbiAgICB3aWR0aDogMTZweDtcbiAgICBoZWlnaHQ6IDE2cHg7XG4gICAgbWFyZ2luOiAwIDA7XG59XG5cbi8qIFNlcGFyYXRlIHRoZSBtaWRkbGUgaWNvbiBmcm9tIHRoZSBvdGhlciB0d28uICovXG4uc2VjdXJpdHktc3VtbWFyeSAubG9jay1pY29uLW5ldXRyYWwge1xuICAgIG1hcmdpbjogMCAxNnB4O1xufVxuXG4uc2VjdXJpdHktc3VtbWFyeTpub3QoLnNlY3VyaXR5LXN1bW1hcnktc2VjdXJlKSAubG9jay1pY29uLXNlY3VyZSxcbi5zZWN1cml0eS1zdW1tYXJ5Om5vdCguc2VjdXJpdHktc3VtbWFyeS1uZXV0cmFsKSAubG9jay1pY29uLW5ldXRyYWwsXG4uc2VjdXJpdHktc3VtbWFyeTpub3QoLnNlY3VyaXR5LXN1bW1hcnktaW5zZWN1cmUpIC5sb2NrLWljb24taW5zZWN1cmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoOTAsIDkwLCA5MCwgMC4yNSk7XG59XG5cbi50cmlhbmdsZS1wb2ludGVyLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luOiA4cHggMjRweCAwO1xuICAgIHBhZGRpbmc6IDAgMDtcbn1cblxuLnRyaWFuZ2xlLXBvaW50ZXItd3JhcHBlciB7XG4gICAgLyogRGVmYXVsdHMgZm9yIGR5bmFtaWMgcHJvcGVydGllcy4gKi9cbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3M7XG59XG5cbi50cmlhbmdsZS1wb2ludGVyIHtcbiAgICB3aWR0aDogMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgbWFyZ2luLWJvdHRvbTogLTZweDtcbiAgICBtYXJnaW4tbGVmdDogLTZweDtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDtcblxuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjE3LCAyMTcsIDIxNyk7XG59XG5cbi5zZWN1cml0eS1zdW1tYXJ5LXNlY3VyZSAudHJpYW5nbGUtcG9pbnRlci13cmFwcGVyIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMHB4KTtcbn1cblxuLnNlY3VyaXR5LXN1bW1hcnktbmV1dHJhbCAudHJpYW5nbGUtcG9pbnRlci13cmFwcGVyIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMzJweCk7XG59XG5cbi5zZWN1cml0eS1zdW1tYXJ5LWluc2VjdXJlIC50cmlhbmdsZS1wb2ludGVyLXdyYXBwZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg2NHB4KTtcbn1cblxuLnNlY3VyaXR5LXN1bW1hcnktdGV4dCB7XG4gICAgcGFkZGluZzogMTZweCAyNHB4O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLXdpZHRoOiAxcHggMDtcbiAgICBmb250LXNpemU6IDE1cHg7XG5cbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJvcmRlci1jb2xvcjogcmdiKDIxNywgMjE3LCAyMTcpO1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDM2KTtcbn1cblxuLnNlY3VyaXR5LXN1bW1hcnktc2VjdXJlIC50cmlhbmdsZS1wb2ludGVyLFxuLnNlY3VyaXR5LXN1bW1hcnktc2VjdXJlIC5zZWN1cml0eS1zdW1tYXJ5LXRleHQsXG4uc2VjdXJpdHktZXhwbGFuYXRpb24tdGl0bGUtc2VjdXJlIHtcbiAgICBjb2xvcjogIzBiODA0Mztcbn1cblxuLnNlY3VyaXR5LXN1bW1hcnktbmV1dHJhbCAudHJpYW5nbGUtcG9pbnRlcixcbi5zZWN1cml0eS1zdW1tYXJ5LW5ldXRyYWwgLnNlY3VyaXR5LXN1bW1hcnktdGV4dCB7XG4gICAgY29sb3I6IHJnYigyNTMsIDE3NywgNDgpO1xufVxuXG4uc2VjdXJpdHktc3VtbWFyeS1pbnNlY3VyZSAudHJpYW5nbGUtcG9pbnRlcixcbi5zZWN1cml0eS1zdW1tYXJ5LWluc2VjdXJlIC5zZWN1cml0eS1zdW1tYXJ5LXRleHQsXG4uc2VjdXJpdHktZXhwbGFuYXRpb24tdGl0bGUtbmV1dHJhbCxcbi5zZWN1cml0eS1leHBsYW5hdGlvbi10aXRsZS1pbnNlY3VyZSB7XG4gICAgY29sb3I6ICNjYjM2MjY7XG59XG5cbi5zZWN1cml0eS1leHBsYW5hdGlvbi1saXN0IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMTZweDtcbn1cblxuLnNlY3VyaXR5LWV4cGxhbmF0aW9uLWxpc3Q6ZW1wdHkge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgcGFkZGluZzogMHB4O1xufVxuXG4uc2VjdXJpdHktZXhwbGFuYXRpb25zLW1haW4ge1xuICAgIG1hcmdpbi10b3A6IC01cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIzMCwgMjMwLCAyMzApO1xufVxuXG4uc2VjdXJpdHktZXhwbGFuYXRpb25zLWV4dHJhIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLnNlY3VyaXR5LWV4cGxhbmF0aW9uIHtcbiAgICBwYWRkaW5nOiAxMXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICM4YzhjOGM7XG59XG5cbi5zZWN1cml0eS1leHBsYW5hdGlvbi10ZXh0IHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gICAgbWF4LXdpZHRoOiA0MDBweDtcbn1cblxuLnNlY3VyaXR5LWNlcnRpZmljYXRlLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4uc2VjdXJpdHktZXhwbGFuYXRpb24gLnNlY3VyaXR5LXByb3BlcnR5IHtcbiAgICBmbGV4OiBub25lO1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTZweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7XG59XG5cbi5zZWN1cml0eS1leHBsYW5hdGlvbi10aXRsZSB7XG4gICAgY29sb3I6IHJnYig5MCwgOTAsIDkwKTtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuXG4uc2VjdXJpdHktZXhwbGFuYXRpb24tbmV1dHJhbCAuc2VjdXJpdHktc2VjdGlvbi10aXRsZSxcbi5zZWN1cml0eS1leHBsYW5hdGlvbi13YXJuaW5nIC5zZWN1cml0eS1zZWN0aW9uLXRpdGxlXG57XG4gICAgY29sb3I6ICNjYjM2MjY7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4uc2VjdXJpdHktZXhwbGFuYXRpb24taW5zZWN1cmUgLnNlY3VyaXR5LXNlY3Rpb24tdGl0bGVcbntcbiAgICBjb2xvcjogcmdiKDIxNiwgNzEsIDYwKTtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnNlY3VyaXR5LW1peGVkLWNvbnRlbnQge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLyojIHNvdXJjZVVSTD1zZWN1cml0eS9tYWluVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzZWN1cml0eS9vcmlnaW5WaWV3LmNzcyJdPSIvKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50aXRsZS1zZWN0aW9uIHtcbiAgICBwYWRkaW5nOiAxNnB4IDAgMjRweCAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjMwLCAyMzAsIDIzMCk7XG59XG5cbi50aXRsZS1zZWN0aW9uLWhlYWRlciB7XG4gICAgcGFkZGluZy1sZWZ0OiAxNnB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLnNlY3VyaXR5LW9yaWdpbi12aWV3IHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAub3JpZ2luLXZpZXctc2VjdGlvbiB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMzAsIDIzMCwgMjMwKTtcbiAgICBwYWRkaW5nOiAxMnB4IDZweCAxMnB4ICAyNHB4O1xuICAgIGZvbnQtc2l6ZToxMnB4O1xufVxuXG4ub3JpZ2luLXZpZXctbm90ZXMge1xuICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICBjb2xvcjogIzhjOGM4Yztcbn1cblxuLm9yaWdpbi12aWV3LXNlY3Rpb24tbm90ZXMge1xuICAgIG1hcmdpbi10b3A6IDZweDtcbiAgICBjb2xvcjogIzhjOGM4Yztcbn1cblxuLnNlY3VyaXR5LW9yaWdpbi12aWV3IC5vcmlnaW4tZGlzcGxheSB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIHBhZGRpbmctbGVmdDogMzhweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi50aXRsZS1zZWN0aW9uID4gLnZpZXctbmV0d29yay1idXR0b24ge1xuICAgIHBhZGRpbmc6IDZweCAwIDAgMTZweFxufVxuXG4uc2VjdXJpdHktb3JpZ2luLXZpZXcgLm9yaWdpbi1kaXNwbGF5IC5zZWN1cml0eS1wcm9wZXJ0eSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDE2cHg7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAub3JpZ2luLXZpZXctc2VjdGlvbi10aXRsZSB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnNlY3VyaXR5LW9yaWdpbi12aWV3IC5kZXRhaWxzLXRhYmxlLXJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAuZGV0YWlscy10YWJsZS1yb3cgPiBkaXYge1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuXG4uc2VjdXJpdHktb3JpZ2luLXZpZXcgLmRldGFpbHMtdGFibGUtcm93ID4gZGl2OmZpcnN0LWNoaWxkIHtcbiAgICBjb2xvcjogcmdiKDE0MCwgMTQwLCAxNDApO1xuICAgIHdpZHRoOiAxMTBweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAuZGV0YWlscy10YWJsZS1yb3cgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAuc2N0LWRldGFpbHMgLmRldGFpbHMtdGFibGUgLmRldGFpbHMtdGFibGUtcm93Omxhc3QtY2hpbGQgZGl2Omxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjMwLCAyMzAsIDIzMCk7XG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAuc2N0LWRldGFpbHMgLmRldGFpbHMtdGFibGU6bGFzdC1jaGlsZCAuZGV0YWlscy10YWJsZS1yb3c6bGFzdC1jaGlsZCBkaXY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbn1cblxuLnNlY3VyaXR5LW9yaWdpbi12aWV3IC5zY3QtdG9nZ2xlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE0M3B4O1xuICAgIHBhZGRpbmctdG9wOiA1cHg7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAuZGV0YWlscy10YWJsZSAuZW1wdHktc2FuIHtcbiAgICBjb2xvcjogcmdiKDE0MCwgMTQwLCAxNDApO1xufVxuXG4uc2VjdXJpdHktb3JpZ2luLXZpZXcgLmRldGFpbHMtdGFibGUgLnNhbi1lbnRyeSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5zZWN1cml0eS1vcmlnaW4tdmlldyAudHJ1bmNhdGVkLXNhbiAudHJ1bmNhdGVkLWVudHJ5IHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4ub3JpZ2luLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xufVxuXG4ub3JpZ2luLXZpZXctc2VjdGlvbjpsYXN0LWNoaWxkICB7XG4gICAgYm9yZGVyLWJvdHRvbTpub25lO1xufVxuXG4vKiMgc291cmNlVVJMPXNlY3VyaXR5L29yaWdpblZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic2VjdXJpdHkvc2lkZWJhci5jc3MiXT0iLyogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4udHJlZS1vdXRsaW5lIHtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAycHggNXB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWFyZ2luOiAycHggMDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5zZWxlY3RlZDpmb2N1cyAubG9jay1pY29uLFxuLnRyZWUtb3V0bGluZSAuc2VjdXJpdHktc2lkZWJhci10cmVlLWl0ZW0uc2VsZWN0ZWQ6Zm9jdXMgLmljb25cbntcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tZmctY29sb3IpO1xufVxuXG4udHJlZS1vdXRsaW5lIC5zZWN1cml0eS1tYWluLXZpZXctc2lkZWJhci10cmVlLWl0ZW0ge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjMwLCAyMzAsIDIzMCk7XG4gICAgcGFkZGluZzogMTZweCAwO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLnNlY3VyaXR5LXNpZGViYXItb3JpZ2lucyB7XG4gICAgcGFkZGluZzogMXB4IDhweCAxcHggMTNweDtcbiAgICBtYXJnaW4tdG9wOiAxZW07XG4gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07XG4gICAgY29sb3I6IHJnYig5MCwgOTAsIDkwKTtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICAgIHRleHQtc2hhZG93OiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpIDAgMXB4IDA7XG59XG5cbi50cmVlLW91dGxpbmUgb2wge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBub25lO1xufVxuXG4udHJlZS1vdXRsaW5lIC5zZWN1cml0eS1tYWluLXZpZXctc2lkZWJhci10cmVlLWl0ZW0sXG4udHJlZS1vdXRsaW5lIC5zZWN1cml0eS1zaWRlYmFyLW9yaWdpbnMsXG4udHJlZS1vdXRsaW5lIGxpLnNlY3VyaXR5LXNpZGViYXItb3JpZ2lucyArIC5jaGlsZHJlbiA+IGxpIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG59XG5cbi50cmVlLW91dGxpbmUgLmxvY2staWNvbixcbi50cmVlLW91dGxpbmUgLnNlY3VyaXR5LXByb3BlcnR5IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uc2VjdXJpdHktc2lkZWJhci10cmVlLWl0ZW0ge1xuICAgIHBhZGRpbmc6IDJweCAwO1xufVxuXG4uc2VjdXJpdHktc2lkZWJhci10cmVlLWl0ZW0gLnRpdGxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xufVxuXG4uc2VjdXJpdHktbWFpbi12aWV3LXJlbG9hZC1tZXNzYWdlIC50cmVlLWVsZW1lbnQtdGl0bGUge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgcGFkZGluZy1sZWZ0OiA4cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2VjdXJpdHkvc2lkZWJhci5jc3MgKi8iO1NldHRpbmdzLlNldHRpbmdzU2NyZWVuPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc2V0dGluZ3Mvc2V0dGluZ3NTY3JlZW4uY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC50YWJJbmRleD0wO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3Mtd2luZG93LW1haW4nKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zib3gnKTtjb25zdCBzZXR0aW5nc0xhYmVsRWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtVSS5jcmVhdGVTaGFkb3dSb290V2l0aENvcmVTdHlsZXMoc2V0dGluZ3NMYWJlbEVsZW1lbnQsJ3NldHRpbmdzL3NldHRpbmdzU2NyZWVuLmNzcycpLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy13aW5kb3ctdGl0bGUnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1NldHRpbmdzJyk7dGhpcy5fdGFiYmVkTG9jYXRpb249VUkudmlld01hbmFnZXIuY3JlYXRlVGFiYmVkTG9jYXRpb24oKCk9PlNldHRpbmdzLlNldHRpbmdzU2NyZWVuLl9zaG93U2V0dGluZ3NTY3JlZW4oKSwnc2V0dGluZ3MtdmlldycpO2NvbnN0IHRhYmJlZFBhbmU9dGhpcy5fdGFiYmVkTG9jYXRpb24udGFiYmVkUGFuZSgpO3RhYmJlZFBhbmUubGVmdFRvb2xiYXIoKS5hcHBlbmRUb29sYmFySXRlbShuZXcgVUkuVG9vbGJhckl0ZW0oc2V0dGluZ3NMYWJlbEVsZW1lbnQpKTt0YWJiZWRQYW5lLnNldFNocmlua2FibGVUYWJzKGZhbHNlKTt0YWJiZWRQYW5lLm1ha2VWZXJ0aWNhbFRhYkxheW91dCgpO2NvbnN0IHNob3J0Y3V0c1ZpZXc9bmV3IFVJLlNpbXBsZVZpZXcoQ29tbW9uLlVJU3RyaW5nKCdTaG9ydGN1dHMnKSk7VUkuc2hvcnRjdXRzU2NyZWVuLmNyZWF0ZVNob3J0Y3V0c1RhYlZpZXcoKS5zaG93KHNob3J0Y3V0c1ZpZXcuZWxlbWVudCk7dGhpcy5fdGFiYmVkTG9jYXRpb24uYXBwZW5kVmlldyhzaG9ydGN1dHNWaWV3KTt0YWJiZWRQYW5lLnNob3codGhpcy5jb250ZW50RWxlbWVudCk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2tleURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZGV2ZWxvcGVyTW9kZUNvdW50ZXI9MDt0aGlzLnNldERlZmF1bHRGb2N1c2VkRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50KTt9CnN0YXRpYyBfc2hvd1NldHRpbmdzU2NyZWVuKG5hbWUpe2NvbnN0IHNldHRpbmdzU2NyZWVuPShzZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoU2V0dGluZ3MuU2V0dGluZ3NTY3JlZW4pKTtpZihzZXR0aW5nc1NjcmVlbi5pc1Nob3dpbmcoKSkKcmV0dXJuO2NvbnN0IGRpYWxvZz1uZXcgVUkuRGlhbG9nKCk7ZGlhbG9nLmFkZENsb3NlQnV0dG9uKCk7c2V0dGluZ3NTY3JlZW4uc2hvdyhkaWFsb2cuY29udGVudEVsZW1lbnQpO2RpYWxvZy5zaG93KCk7c2V0dGluZ3NTY3JlZW4uX3NlbGVjdFRhYihuYW1lfHwncHJlZmVyZW5jZXMnKTt9CnJlc29sdmVMb2NhdGlvbihsb2NhdGlvbk5hbWUpe3JldHVybiB0aGlzLl90YWJiZWRMb2NhdGlvbjt9Cl9zZWxlY3RUYWIobmFtZSl7VUkudmlld01hbmFnZXIuc2hvd1ZpZXcobmFtZSk7fQpfa2V5RG93bihldmVudCl7Y29uc3Qgc2hpZnRLZXlDb2RlPTE2O2lmKGV2ZW50LmtleUNvZGU9PT1zaGlmdEtleUNvZGUmJisrdGhpcy5fZGV2ZWxvcGVyTW9kZUNvdW50ZXI+NSkKdGhpcy5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy1kZXZlbG9wZXItbW9kZScpO319O1NldHRpbmdzLlNldHRpbmdzVGFiPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihuYW1lLGlkKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10YWItY29udGFpbmVyJyk7aWYoaWQpCnRoaXMuZWxlbWVudC5pZD1pZDtjb25zdCBoZWFkZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdoZWFkZXInKTtoZWFkZXIuY3JlYXRlQ2hpbGQoJ2gzJykuY3JlYXRlVGV4dENoaWxkKG5hbWUpO3RoaXMuY29udGFpbmVyRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLWNvbnRhaW5lci13cmFwcGVyJykuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NldHRpbmdzLXRhYiBzZXR0aW5ncy1jb250ZW50IHNldHRpbmdzLWNvbnRhaW5lcicpO30KX2FwcGVuZFNlY3Rpb24obmFtZSl7Y29uc3QgYmxvY2s9dGhpcy5jb250YWluZXJFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy1ibG9jaycpO2lmKG5hbWUpCmJsb2NrLmNyZWF0ZUNoaWxkKCdkaXYnLCdzZXR0aW5ncy1zZWN0aW9uLXRpdGxlJykudGV4dENvbnRlbnQ9bmFtZTtyZXR1cm4gYmxvY2s7fX07U2V0dGluZ3MuR2VuZXJpY1NldHRpbmdzVGFiPWNsYXNzIGV4dGVuZHMgU2V0dGluZ3MuU2V0dGluZ3NUYWJ7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ1ByZWZlcmVuY2VzJyksJ3ByZWZlcmVuY2VzLXRhYi1jb250ZW50Jyk7Y29uc3QgZXhwbGljaXRTZWN0aW9uT3JkZXI9WycnLCdBcHBlYXJhbmNlJywnU291cmNlcycsJ0VsZW1lbnRzJywnTmV0d29yaycsJ1BlcmZvcm1hbmNlJywnQ29uc29sZScsJ0V4dGVuc2lvbnMnXTt0aGlzLl9uYW1lVG9TZWN0aW9uPW5ldyBNYXAoKTtmb3IoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZXhwbGljaXRTZWN0aW9uT3JkZXIpCnRoaXMuX3NlY3Rpb25FbGVtZW50KHNlY3Rpb25OYW1lKTtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygnc2V0dGluZycpLmZvckVhY2godGhpcy5fYWRkU2V0dGluZy5iaW5kKHRoaXMpKTtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucyhVSS5TZXR0aW5nVUkpLmZvckVhY2godGhpcy5fYWRkU2V0dGluZ1VJLmJpbmQodGhpcykpO3RoaXMuX2FwcGVuZFNlY3Rpb24oKS5hcHBlbmRDaGlsZChVSS5jcmVhdGVUZXh0QnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVzdG9yZSBkZWZhdWx0cyBhbmQgcmVsb2FkJykscmVzdG9yZUFuZFJlbG9hZCkpO2Z1bmN0aW9uIHJlc3RvcmVBbmRSZWxvYWQoKXtDb21tb24uc2V0dGluZ3MuY2xlYXJBbGwoKTtDb21wb25lbnRzLnJlbG9hZCgpO319CnN0YXRpYyBpc1NldHRpbmdWaXNpYmxlKGV4dGVuc2lvbil7Y29uc3QgZGVzY3JpcHRvcj1leHRlbnNpb24uZGVzY3JpcHRvcigpO2lmKCEoJ3RpdGxlJ2luIGRlc2NyaXB0b3IpKQpyZXR1cm4gZmFsc2U7aWYoISgnY2F0ZWdvcnknaW4gZGVzY3JpcHRvcikpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9Cl9hZGRTZXR0aW5nKGV4dGVuc2lvbil7aWYoIVNldHRpbmdzLkdlbmVyaWNTZXR0aW5nc1RhYi5pc1NldHRpbmdWaXNpYmxlKGV4dGVuc2lvbikpCnJldHVybjtjb25zdCBzZWN0aW9uRWxlbWVudD10aGlzLl9zZWN0aW9uRWxlbWVudChleHRlbnNpb24uZGVzY3JpcHRvcigpWydjYXRlZ29yeSddKTtjb25zdCBzZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKGV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3NldHRpbmdOYW1lJ10pO2NvbnN0IHNldHRpbmdDb250cm9sPVVJLlNldHRpbmdzVUkuY3JlYXRlQ29udHJvbEZvclNldHRpbmcoc2V0dGluZyk7aWYoc2V0dGluZ0NvbnRyb2wpCnNlY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHNldHRpbmdDb250cm9sKTt9Cl9hZGRTZXR0aW5nVUkoZXh0ZW5zaW9uKXtjb25zdCBkZXNjcmlwdG9yPWV4dGVuc2lvbi5kZXNjcmlwdG9yKCk7Y29uc3Qgc2VjdGlvbk5hbWU9ZGVzY3JpcHRvclsnY2F0ZWdvcnknXXx8Jyc7ZXh0ZW5zaW9uLmluc3RhbmNlKCkudGhlbihhcHBlbmRDdXN0b21TZXR0aW5nLmJpbmQodGhpcykpO2Z1bmN0aW9uIGFwcGVuZEN1c3RvbVNldHRpbmcob2JqZWN0KXtjb25zdCBzZXR0aW5nVUk9KG9iamVjdCk7Y29uc3QgZWxlbWVudD1zZXR0aW5nVUkuc2V0dGluZ0VsZW1lbnQoKTtpZihlbGVtZW50KQp0aGlzLl9zZWN0aW9uRWxlbWVudChzZWN0aW9uTmFtZSkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7fX0KX3NlY3Rpb25FbGVtZW50KHNlY3Rpb25OYW1lKXtsZXQgc2VjdGlvbkVsZW1lbnQ9dGhpcy5fbmFtZVRvU2VjdGlvbi5nZXQoc2VjdGlvbk5hbWUpO2lmKCFzZWN0aW9uRWxlbWVudCl7Y29uc3QgdWlTZWN0aW9uTmFtZT1zZWN0aW9uTmFtZSYmQ29tbW9uLlVJU3RyaW5nKHNlY3Rpb25OYW1lKTtzZWN0aW9uRWxlbWVudD10aGlzLl9hcHBlbmRTZWN0aW9uKHVpU2VjdGlvbk5hbWUpO3RoaXMuX25hbWVUb1NlY3Rpb24uc2V0KHNlY3Rpb25OYW1lLHNlY3Rpb25FbGVtZW50KTt9CnJldHVybiBzZWN0aW9uRWxlbWVudDt9fTtTZXR0aW5ncy5FeHBlcmltZW50c1NldHRpbmdzVGFiPWNsYXNzIGV4dGVuZHMgU2V0dGluZ3MuU2V0dGluZ3NUYWJ7Y29uc3RydWN0b3IoKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ0V4cGVyaW1lbnRzJyksJ2V4cGVyaW1lbnRzLXRhYi1jb250ZW50Jyk7Y29uc3QgZXhwZXJpbWVudHM9UnVudGltZS5leHBlcmltZW50cy5hbGxDb25maWd1cmFibGVFeHBlcmltZW50cygpO2lmKGV4cGVyaW1lbnRzLmxlbmd0aCl7Y29uc3QgZXhwZXJpbWVudHNTZWN0aW9uPXRoaXMuX2FwcGVuZFNlY3Rpb24oKTtleHBlcmltZW50c1NlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlRXhwZXJpbWVudHNXYXJuaW5nU3Vic2VjdGlvbigpKTtmb3IobGV0IGk9MDtpPGV4cGVyaW1lbnRzLmxlbmd0aDsrK2kpCmV4cGVyaW1lbnRzU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVFeHBlcmltZW50Q2hlY2tib3goZXhwZXJpbWVudHNbaV0pKTt9fQpfY3JlYXRlRXhwZXJpbWVudHNXYXJuaW5nU3Vic2VjdGlvbigpe2NvbnN0IHN1YnNlY3Rpb249Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Y29uc3Qgd2FybmluZz1zdWJzZWN0aW9uLmNyZWF0ZUNoaWxkKCdzcGFuJywnc2V0dGluZ3MtZXhwZXJpbWVudHMtd2FybmluZy1zdWJzZWN0aW9uLXdhcm5pbmcnKTt3YXJuaW5nLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnV0FSTklORzonKTtzdWJzZWN0aW9uLmNyZWF0ZVRleHRDaGlsZCgnICcpO2NvbnN0IG1lc3NhZ2U9c3Vic2VjdGlvbi5jcmVhdGVDaGlsZCgnc3BhbicsJ3NldHRpbmdzLWV4cGVyaW1lbnRzLXdhcm5pbmctc3Vic2VjdGlvbi1tZXNzYWdlJyk7bWVzc2FnZS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1RoZXNlIGV4cGVyaW1lbnRzIGNvdWxkIGJlIGRhbmdlcm91cyBhbmQgbWF5IHJlcXVpcmUgcmVzdGFydC4nKTtyZXR1cm4gc3Vic2VjdGlvbjt9Cl9jcmVhdGVFeHBlcmltZW50Q2hlY2tib3goZXhwZXJpbWVudCl7Y29uc3QgbGFiZWw9VUkuQ2hlY2tib3hMYWJlbC5jcmVhdGUoQ29tbW9uLlVJU3RyaW5nKGV4cGVyaW1lbnQudGl0bGUpLGV4cGVyaW1lbnQuaXNFbmFibGVkKCkpO2NvbnN0IGlucHV0PWxhYmVsLmNoZWNrYm94RWxlbWVudDtpbnB1dC5uYW1lPWV4cGVyaW1lbnQubmFtZTtmdW5jdGlvbiBsaXN0ZW5lcigpe2V4cGVyaW1lbnQuc2V0RW5hYmxlZChpbnB1dC5jaGVja2VkKTt9CmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxsaXN0ZW5lcixmYWxzZSk7Y29uc3QgcD1jcmVhdGVFbGVtZW50KCdwJyk7cC5jbGFzc05hbWU9ZXhwZXJpbWVudC5oaWRkZW4mJiFleHBlcmltZW50LmlzRW5hYmxlZCgpPydzZXR0aW5ncy1leHBlcmltZW50LWhpZGRlbic6Jyc7cC5hcHBlbmRDaGlsZChsYWJlbCk7cmV0dXJuIHA7fX07U2V0dGluZ3MuU2V0dGluZ3NTY3JlZW4uQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdzZXR0aW5ncy5zaG93JzpTZXR0aW5ncy5TZXR0aW5nc1NjcmVlbi5fc2hvd1NldHRpbmdzU2NyZWVuKCk7cmV0dXJuIHRydWU7Y2FzZSdzZXR0aW5ncy5kb2N1bWVudGF0aW9uJzpJbnNwZWN0b3JGcm9udGVuZEhvc3Qub3BlbkluTmV3VGFiKCdodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvY2hyb21lLWRldnRvb2xzLycpO3JldHVybiB0cnVlO2Nhc2Unc2V0dGluZ3Muc2hvcnRjdXRzJzpTZXR0aW5ncy5TZXR0aW5nc1NjcmVlbi5fc2hvd1NldHRpbmdzU2NyZWVuKENvbW1vbi5VSVN0cmluZygnU2hvcnRjdXRzJykpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319O1NldHRpbmdzLlNldHRpbmdzU2NyZWVuLlJldmVhbGVyPWNsYXNze3JldmVhbChvYmplY3Qpe2NvbnNvbGUuYXNzZXJ0KG9iamVjdCBpbnN0YW5jZW9mIENvbW1vbi5TZXR0aW5nKTtjb25zdCBzZXR0aW5nPShvYmplY3QpO2xldCBzdWNjZXNzPWZhbHNlO3NlbGYucnVudGltZS5leHRlbnNpb25zKCdzZXR0aW5nJykuZm9yRWFjaChyZXZlYWxNb2R1bGVTZXR0aW5nKTtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucyhVSS5TZXR0aW5nVUkpLmZvckVhY2gocmV2ZWFsU2V0dGluZ1VJKTtzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucygndmlldycpLmZvckVhY2gocmV2ZWFsU2V0dGluZ3NWaWV3KTtyZXR1cm4gc3VjY2Vzcz9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdCgpO2Z1bmN0aW9uIHJldmVhbE1vZHVsZVNldHRpbmcoZXh0ZW5zaW9uKXtpZighU2V0dGluZ3MuR2VuZXJpY1NldHRpbmdzVGFiLmlzU2V0dGluZ1Zpc2libGUoZXh0ZW5zaW9uKSkKcmV0dXJuO2lmKGV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3NldHRpbmdOYW1lJ109PT1zZXR0aW5nLm5hbWUpe0luc3BlY3RvckZyb250ZW5kSG9zdC5icmluZ1RvRnJvbnQoKTtTZXR0aW5ncy5TZXR0aW5nc1NjcmVlbi5fc2hvd1NldHRpbmdzU2NyZWVuKCk7c3VjY2Vzcz10cnVlO319CmZ1bmN0aW9uIHJldmVhbFNldHRpbmdVSShleHRlbnNpb24pe2NvbnN0IHNldHRpbmdzPWV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ3NldHRpbmdzJ107aWYoc2V0dGluZ3MmJnNldHRpbmdzLmluZGV4T2Yoc2V0dGluZy5uYW1lKSE9PS0xKXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuYnJpbmdUb0Zyb250KCk7U2V0dGluZ3MuU2V0dGluZ3NTY3JlZW4uX3Nob3dTZXR0aW5nc1NjcmVlbigpO3N1Y2Nlc3M9dHJ1ZTt9fQpmdW5jdGlvbiByZXZlYWxTZXR0aW5nc1ZpZXcoZXh0ZW5zaW9uKXtjb25zdCBsb2NhdGlvbj1leHRlbnNpb24uZGVzY3JpcHRvcigpWydsb2NhdGlvbiddO2lmKGxvY2F0aW9uIT09J3NldHRpbmdzLXZpZXcnKQpyZXR1cm47Y29uc3Qgc2V0dGluZ3M9ZXh0ZW5zaW9uLmRlc2NyaXB0b3IoKVsnc2V0dGluZ3MnXTtpZihzZXR0aW5ncyYmc2V0dGluZ3MuaW5kZXhPZihzZXR0aW5nLm5hbWUpIT09LTEpe0luc3BlY3RvckZyb250ZW5kSG9zdC5icmluZ1RvRnJvbnQoKTtTZXR0aW5ncy5TZXR0aW5nc1NjcmVlbi5fc2hvd1NldHRpbmdzU2NyZWVuKGV4dGVuc2lvbi5kZXNjcmlwdG9yKClbJ2lkJ10pO3N1Y2Nlc3M9dHJ1ZTt9fX19OztTZXR0aW5ncy5GcmFtZXdvcmtCbGFja2JveFNldHRpbmdzVGFiPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc2V0dGluZ3MvZnJhbWV3b3JrQmxhY2tib3hTZXR0aW5nc1RhYi5jc3MnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoZWFkZXInKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0ZyYW1ld29yayBCbGFja2JveCBQYXR0ZXJucycpO3RoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JsYWNrYm94LWNvbnRlbnQtc2NyaXB0cycpLmFwcGVuZENoaWxkKFVJLlNldHRpbmdzVUkuY3JlYXRlU2V0dGluZ0NoZWNrYm94KENvbW1vbi5VSVN0cmluZygnQmxhY2tib3ggY29udGVudCBzY3JpcHRzJyksQ29tbW9uLm1vZHVsZVNldHRpbmcoJ3NraXBDb250ZW50U2NyaXB0cycpLHRydWUpKTt0aGlzLl9ibGFja2JveExhYmVsPUNvbW1vbi5VSVN0cmluZygnQmxhY2tib3gnKTt0aGlzLl9kaXNhYmxlZExhYmVsPUNvbW1vbi5VSVN0cmluZygnRGlzYWJsZWQnKTt0aGlzLl9saXN0PW5ldyBVSS5MaXN0V2lkZ2V0KHRoaXMpO3RoaXMuX2xpc3QuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdibGFja2JveC1saXN0Jyk7dGhpcy5fbGlzdC5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzZXR0aW5ncy9mcmFtZXdvcmtCbGFja2JveFNldHRpbmdzVGFiLmNzcycpO2NvbnN0IHBsYWNlaG9sZGVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2JsYWNrYm94LWxpc3QtZW1wdHknKTtwbGFjZWhvbGRlci50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05vIGJsYWNrYm94ZWQgcGF0dGVybnMnKTt0aGlzLl9saXN0LnNldEVtcHR5UGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpO3RoaXMuX2xpc3Quc2hvdyh0aGlzLmNvbnRlbnRFbGVtZW50KTtjb25zdCBhZGRQYXR0ZXJuQnV0dG9uPVVJLmNyZWF0ZVRleHRCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgcGF0dGVybi4uLicpLHRoaXMuX2FkZEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSwnYWRkLWJ1dHRvbicpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYWRkUGF0dGVybkJ1dHRvbik7dGhpcy5fc2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpO3RoaXMuX3NldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fc2V0dGluZ1VwZGF0ZWQsdGhpcyk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQoYWRkUGF0dGVybkJ1dHRvbik7dGhpcy5jb250ZW50RWxlbWVudC50YWJJbmRleD0wO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO3RoaXMuX3NldHRpbmdVcGRhdGVkKCk7fQpfc2V0dGluZ1VwZGF0ZWQoKXt0aGlzLl9saXN0LmNsZWFyKCk7Y29uc3QgcGF0dGVybnM9dGhpcy5fc2V0dGluZy5nZXRBc0FycmF5KCk7Zm9yKGxldCBpPTA7aTxwYXR0ZXJucy5sZW5ndGg7KytpKQp0aGlzLl9saXN0LmFwcGVuZEl0ZW0ocGF0dGVybnNbaV0sdHJ1ZSk7fQpfYWRkQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX2xpc3QuYWRkTmV3SXRlbSh0aGlzLl9zZXR0aW5nLmdldEFzQXJyYXkoKS5sZW5ndGgse3BhdHRlcm46JycsZGlzYWJsZWQ6ZmFsc2V9KTt9CnJlbmRlckl0ZW0oaXRlbSxlZGl0YWJsZSl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdibGFja2JveC1saXN0LWl0ZW0nKTtjb25zdCBwYXR0ZXJuPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JsYWNrYm94LXBhdHRlcm4nKTtwYXR0ZXJuLnRleHRDb250ZW50PWl0ZW0ucGF0dGVybjtwYXR0ZXJuLnRpdGxlPWl0ZW0ucGF0dGVybjtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdibGFja2JveC1zZXBhcmF0b3InKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdibGFja2JveC1iZWhhdmlvcicpLnRleHRDb250ZW50PWl0ZW0uZGlzYWJsZWQ/dGhpcy5fZGlzYWJsZWRMYWJlbDp0aGlzLl9ibGFja2JveExhYmVsO2lmKGl0ZW0uZGlzYWJsZWQpCmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxhY2tib3gtZGlzYWJsZWQnKTtyZXR1cm4gZWxlbWVudDt9CnJlbW92ZUl0ZW1SZXF1ZXN0ZWQoaXRlbSxpbmRleCl7Y29uc3QgcGF0dGVybnM9dGhpcy5fc2V0dGluZy5nZXRBc0FycmF5KCk7cGF0dGVybnMuc3BsaWNlKGluZGV4LDEpO3RoaXMuX3NldHRpbmcuc2V0QXNBcnJheShwYXR0ZXJucyk7fQpjb21taXRFZGl0KGl0ZW0sZWRpdG9yLGlzTmV3KXtpdGVtLnBhdHRlcm49ZWRpdG9yLmNvbnRyb2woJ3BhdHRlcm4nKS52YWx1ZS50cmltKCk7aXRlbS5kaXNhYmxlZD1lZGl0b3IuY29udHJvbCgnYmVoYXZpb3InKS52YWx1ZT09PXRoaXMuX2Rpc2FibGVkTGFiZWw7Y29uc3QgbGlzdD10aGlzLl9zZXR0aW5nLmdldEFzQXJyYXkoKTtpZihpc05ldykKbGlzdC5wdXNoKGl0ZW0pO3RoaXMuX3NldHRpbmcuc2V0QXNBcnJheShsaXN0KTt9CmJlZ2luRWRpdChpdGVtKXtjb25zdCBlZGl0b3I9dGhpcy5fY3JlYXRlRWRpdG9yKCk7ZWRpdG9yLmNvbnRyb2woJ3BhdHRlcm4nKS52YWx1ZT1pdGVtLnBhdHRlcm47ZWRpdG9yLmNvbnRyb2woJ2JlaGF2aW9yJykudmFsdWU9aXRlbS5kaXNhYmxlZD90aGlzLl9kaXNhYmxlZExhYmVsOnRoaXMuX2JsYWNrYm94TGFiZWw7cmV0dXJuIGVkaXRvcjt9Cl9jcmVhdGVFZGl0b3IoKXtpZih0aGlzLl9lZGl0b3IpCnJldHVybiB0aGlzLl9lZGl0b3I7Y29uc3QgZWRpdG9yPW5ldyBVSS5MaXN0V2lkZ2V0LkVkaXRvcigpO3RoaXMuX2VkaXRvcj1lZGl0b3I7Y29uc3QgY29udGVudD1lZGl0b3IuY29udGVudEVsZW1lbnQoKTtjb25zdCB0aXRsZXM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmxhY2tib3gtZWRpdC1yb3cnKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JsYWNrYm94LXBhdHRlcm4nKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1BhdHRlcm4nKTt0aXRsZXMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JsYWNrYm94LXNlcGFyYXRvciBibGFja2JveC1zZXBhcmF0b3ItaW52aXNpYmxlJyk7dGl0bGVzLmNyZWF0ZUNoaWxkKCdkaXYnLCdibGFja2JveC1iZWhhdmlvcicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnQmVoYXZpb3InKTtjb25zdCBmaWVsZHM9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2JywnYmxhY2tib3gtZWRpdC1yb3cnKTtmaWVsZHMuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JsYWNrYm94LXBhdHRlcm4nKS5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlSW5wdXQoJ3BhdHRlcm4nLCd0ZXh0JywnL2ZyYW1ld29ya1xcLmpzJCcscGF0dGVyblZhbGlkYXRvci5iaW5kKHRoaXMpKSk7ZmllbGRzLmNyZWF0ZUNoaWxkKCdkaXYnLCdibGFja2JveC1zZXBhcmF0b3IgYmxhY2tib3gtc2VwYXJhdG9yLWludmlzaWJsZScpO2ZpZWxkcy5jcmVhdGVDaGlsZCgnZGl2JywnYmxhY2tib3gtYmVoYXZpb3InKS5hcHBlbmRDaGlsZChlZGl0b3IuY3JlYXRlU2VsZWN0KCdiZWhhdmlvcicsW3RoaXMuX2JsYWNrYm94TGFiZWwsdGhpcy5fZGlzYWJsZWRMYWJlbF0sYmVoYXZpb3JWYWxpZGF0b3IpKTtyZXR1cm4gZWRpdG9yO2Z1bmN0aW9uIHBhdHRlcm5WYWxpZGF0b3IoaXRlbSxpbmRleCxpbnB1dCl7Y29uc3QgcGF0dGVybj1pbnB1dC52YWx1ZS50cmltKCk7Y29uc3QgcGF0dGVybnM9dGhpcy5fc2V0dGluZy5nZXRBc0FycmF5KCk7Zm9yKGxldCBpPTA7aTxwYXR0ZXJucy5sZW5ndGg7KytpKXtpZihpIT09aW5kZXgmJnBhdHRlcm5zW2ldLnBhdHRlcm49PT1wYXR0ZXJuKQpyZXR1cm4gZmFsc2U7fQpsZXQgcmVnZXg7dHJ5e3JlZ2V4PW5ldyBSZWdFeHAocGF0dGVybik7fWNhdGNoKGUpe30KcmV0dXJuISEocGF0dGVybiYmcmVnZXgpO30KZnVuY3Rpb24gYmVoYXZpb3JWYWxpZGF0b3IoaXRlbSxpbmRleCxpbnB1dCl7cmV0dXJuIHRydWU7fX19OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic2V0dGluZ3MvZnJhbWV3b3JrQmxhY2tib3hTZXR0aW5nc1RhYi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gICAgb3ZlcmZsb3c6aGlkZGVuO1xufVxuXG4uaGVhZGVyIHtcbiAgICBwYWRkaW5nOiAwIDAgNnB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRUVFRUVFO1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5ibGFja2JveC1jb250ZW50LXNjcmlwdHMge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLmFkZC1idXR0b24ge1xuICAgIG1hcmdpbjogMTBweCAycHg7XG4gICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICBmbGV4OiBub25lO1xufVxuXG4uYmxhY2tib3gtbGlzdCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICAgIGZsZXg6IDAgMSBhdXRvO1xuICAgIG1pbi1oZWlnaHQ6IDMwcHg7XG59XG5cbi5ibGFja2JveC1saXN0LWVtcHR5IHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogMzBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5ibGFja2JveC1saXN0LWl0ZW0ge1xuICAgIHBhZGRpbmc6IDNweCA1cHggM3B4IDVweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBmbGV4OiBhdXRvIDEgMTtcbn1cblxuIC5ibGFja2JveC1saXN0LWl0ZW0gLmJsYWNrYm94LXBhdHRlcm4ge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICBjb2xvcjogIzIyMjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uYmxhY2tib3gtcGF0dGVybiB7XG4gICAgZmxleDogYXV0bztcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xufVxuXG4uYmxhY2tib3gtbGlzdC1pdGVtLmJsYWNrYm94LWRpc2FibGVkIC5ibGFja2JveC1wYXR0ZXJuIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLmJsYWNrYm94LWJlaGF2aW9yIHtcbiAgICBmbGV4OiAwIDAgMTAwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4uYmxhY2tib3gtYmVoYXZpb3IgPiBzZWxlY3Qge1xuICAgIG1hcmdpbi1sZWZ0OiAtMTBweDtcbn1cblxuLmJsYWNrYm94LXNlcGFyYXRvciB7XG4gICAgZmxleDogMCAwIDFweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMxLCAyMzEsIDIzMSk7XG4gICAgaGVpZ2h0OiAzMHB4O1xuICAgIG1hcmdpbjogMCA0cHg7XG59XG5cbi5ibGFja2JveC1zZXBhcmF0b3ItaW52aXNpYmxlIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5ibGFja2JveC1lZGl0LXJvdyB7XG4gICAgZmxleDogbm9uZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luOiA2cHggNXB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5ibGFja2JveC1lZGl0LXJvdyBpbnB1dCxcbi5ibGFja2JveC1lZGl0LXJvdyBzZWxlY3Qge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2V0dGluZ3MvZnJhbWV3b3JrQmxhY2tib3hTZXR0aW5nc1RhYi5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzZXR0aW5ncy9zZXR0aW5nc1NjcmVlbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNldHRpbmdzLXdpbmRvdy1tYWluIHtcbiAgICBjb2xvcjogcmdiKDQ4LCA1NywgNjYpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHBhZGRpbmc6IDExcHggMCAwIDA7XG59XG5cbi5zZXR0aW5ncy1jb250ZW50IHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBtYXJnaW46IDhweCA4cHggOHB4IDA7XG4gICAgcGFkZGluZzogMCA0cHg7XG4gICAgZmxleDogYXV0bztcbn1cblxuLnNldHRpbmdzLWZvb3Rub3RlIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI0VFRUVFRTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMTJweDtcbn1cblxuLnNldHRpbmdzLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLXdlYmtpdC1jb2x1bW4td2lkdGg6IDI4OHB4O1xufVxuXG4uc2V0dGluZ3MtYmxvY2sge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBhZGRpbmctYm90dG9tOiA5cHg7XG4gICAgd2lkdGg6IDI4OHB4O1xuICAgIC13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZTogYXZvaWQ7XG59XG5cbi5zZXR0aW5ncy10YWIuc2V0dGluZ3MtY29udGFpbmVyIHtcbiAgICAtd2Via2l0LWNvbHVtbi13aWR0aDogMzA4cHg7XG59XG5cbi5zZXR0aW5ncy10YWIgLnNldHRpbmdzLWJsb2NrIHtcbiAgICBtYXJnaW4tbGVmdDogMjBweDtcbn1cblxuLnNldHRpbmdzLXRhYiAuZmllbGQtZXJyb3ItbWVzc2FnZSB7XG4gICAgY29sb3I6IERhcmtSZWQ7XG4gICAgaGVpZ2h0OiAwOyAvKiBBdm9pZCBjaGFuZ2luZyBlbGVtZW50IGhlaWdodCB3aGVuIGNvbnRlbnQgaXMgc2V0LiAqL1xufVxuXG4uc2V0dGluZ3MtbGluZSB7XG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5zZXR0aW5ncy1rZXktY2VsbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxNTNweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgcGFkZGluZy1yaWdodDogNnB4O1xufVxuXG4uc2V0dGluZ3MtY2VsbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMzVweDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSB7XG4gICAgZm9udC1zaXplOiAxMjAlO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbi5zZXR0aW5ncy1rZXkge1xuICAgIHBhZGRpbmc6IDAuMWVtIDAuNmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMCAwIDJweCAjZmZmZmZmIGluc2V0O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luOiAwIDAuMWVtO1xuICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmY7XG4gICAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uc2V0dGluZ3MtY29tYmluZS1rZXlzLFxuLnNldHRpbmdzLWtleS1kZWxpbWl0ZXIge1xuICAgIGZvbnQtc2l6ZTogOXB4O1xufVxuXG4uc2V0dGluZ3MtY29tYmluZS1rZXlzIHtcbiAgICBtYXJnaW46IDAgMC4zZW07XG59XG5cbi5zZXR0aW5ncy1rZXktZGVsaW1pdGVyIHtcbiAgICBtYXJnaW46IDAgMC41ZW07XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuZmllbGRzZXQge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlcjogbm9uZTtcbn1cblxuLnNldHRpbmdzLXRhYiBsYWJlbCB7XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4jZ2VuZXJhbC10YWItY29udGVudCAuc2V0dGluZ3MtYmxvY2sgZmllbGRzZXQgbGVnZW5kIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5zZXR0aW5ncy1ibG9jayBwIHAge1xuICAgIHBhZGRpbmctbGVmdDogMzBweDtcbn1cblxuLnNldHRpbmdzLWNvbnRlbnQgcC5zZXR0aW5ncy1zZWN0aW9uIHtcbiAgICBtYXJnaW46IDAgMCAxNXB4IDA7XG59XG5cbi5zZXR0aW5ncy1leHBlcmltZW50cy13YXJuaW5nLXN1YnNlY3Rpb24td2FybmluZyB7XG4gICAgY29sb3I6IHJnYigyMDAsIDAsIDApO1xufVxuXG4uc2V0dGluZ3MtZXhwZXJpbWVudHMtd2FybmluZy1zdWJzZWN0aW9uLW1lc3NhZ2Uge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4uc2V0dGluZ3MtY29udGVudCBpbnB1dFt0eXBlPWNoZWNrYm94XSB7XG4gICAgbWFyZ2luOiAxcHggN3B4IDFweCAycHg7XG59XG5cbi5zZXR0aW5ncy13aW5kb3ctdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBjb2xvcjogcmdiKDQ4LCA1NywgNjYpO1xuICAgIHBhZGRpbmc6IDAgMCA1cHggMTNweDtcbn1cblxuLnNldHRpbmdzLWNvbnRhaW5lci13cmFwcGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAzMXB4O1xuICAgIGxlZnQ6IDBweDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcGFkZGluZy10b3A6IDlweDtcbn1cblxuLnNldHRpbmdzLXRhYi5zZXR0aW5ncy1jb250ZW50IHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLnNldHRpbmdzLXRhYiBpbnB1dC5udW1lcmljIHtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnNldHRpbmdzLXRhYi1jb250YWluZXIge1xuICAgIGZsZXg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNldHRpbmdzLXRhYi1jb250YWluZXIgaGVhZGVyIHtcbiAgICBwYWRkaW5nOiAwIDAgNnB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRUVFRUVFO1xufVxuXG4jZXhwZXJpbWVudHMtdGFiLWNvbnRlbnQgLnNldHRpbmdzLWNvbnRhaW5lciB7XG4gICAgLXdlYmtpdC1jb2x1bW4td2lkdGg6IDQ3MHB4O1xufVxuXG4jZXhwZXJpbWVudHMtdGFiLWNvbnRlbnQgLnNldHRpbmdzLWJsb2NrIHtcbiAgICB3aWR0aDogNDcwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG59XG5cbi5zZXR0aW5ncy10YWItY29udGFpbmVyIGhlYWRlciA+IGgzIHtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDNweDtcbn1cblxuLnNldHRpbmdzLXRhYiAuc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSB7XG4gICAgbWFyZ2luLWxlZnQ6IC0yMHB4O1xuICAgIGNvbG9yOiAjMjIyO1xufVxuXG4uc2V0dGluZ3MtdGFiIC5zZXR0aW5ncy1ibG9jayBmaWVsZHNldDpkaXNhYmxlZCBsYWJlbDpob3ZlciB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5zZXR0aW5ncy10YWIgLnNldHRpbmdzLWJsb2NrIGxhYmVsOmhvdmVyIHtcbiAgICBjb2xvcjogIzIyMjtcbn1cblxuLnNldHRpbmdzLXRhYiBwIHtcbiAgICBtYXJnaW46IDEycHggMDtcbn1cblxuLnNldHRpbmdzLXRhYiBzZWxlY3Qge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uc2V0dGluZ3MtaW5kZW50LWxhYmVscyBsYWJlbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuXG4uc2V0dGluZ3MtZXhwZXJpbWVudC1oaWRkZW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zZXR0aW5ncy1leHBlcmltZW50LWhpZGRlbiBsYWJlbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbn1cblxuLnNldHRpbmdzLWRldmVsb3Blci1tb2RlIC5zZXR0aW5ncy1leHBlcmltZW50LWhpZGRlbiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8qIyBzb3VyY2VVUkw9c2V0dGluZ3Mvc2V0dGluZ3NTY3JlZW4uY3NzICovIjtTbmlwcGV0cy5TbmlwcGV0U3RvcmFnZT1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3Ioc2V0dGluZ1ByZWZpeCxuYW1lUHJlZml4KXtzdXBlcigpO3RoaXMuX3NuaXBwZXRzPW5ldyBNYXAoKTt0aGlzLl9sYXN0U25pcHBldElkZW50aWZpZXJTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKHNldHRpbmdQcmVmaXgrJ1NuaXBwZXRzX2xhc3RJZGVudGlmaWVyJywwKTt0aGlzLl9zbmlwcGV0c1NldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoc2V0dGluZ1ByZWZpeCsnU25pcHBldHMnLFtdKTt0aGlzLl9uYW1lUHJlZml4PW5hbWVQcmVmaXg7dGhpcy5fbG9hZFNldHRpbmdzKCk7fQpnZXQgbmFtZVByZWZpeCgpe3JldHVybiB0aGlzLl9uYW1lUHJlZml4O30KX3NhdmVTZXR0aW5ncygpe2NvbnN0IHNhdmVkU25pcHBldHM9W107Zm9yKGNvbnN0IHNuaXBwZXQgb2YgdGhpcy5fc25pcHBldHMudmFsdWVzKCkpCnNhdmVkU25pcHBldHMucHVzaChzbmlwcGV0LnNlcmlhbGl6ZVRvT2JqZWN0KCkpO3RoaXMuX3NuaXBwZXRzU2V0dGluZy5zZXQoc2F2ZWRTbmlwcGV0cyk7fQpzbmlwcGV0cygpe3JldHVybiB0aGlzLl9zbmlwcGV0cy52YWx1ZXNBcnJheSgpO30Kc25pcHBldEZvcklkKGlkKXtyZXR1cm4gdGhpcy5fc25pcHBldHMuZ2V0KGlkKTt9CnNuaXBwZXRGb3JOYW1lKG5hbWUpe2Zvcihjb25zdCBzbmlwcGV0IG9mIHRoaXMuX3NuaXBwZXRzLnZhbHVlcygpKXtpZihzbmlwcGV0Lm5hbWU9PT1uYW1lKQpyZXR1cm4gc25pcHBldDt9CnJldHVybiBudWxsO30KX2xvYWRTZXR0aW5ncygpe2NvbnN0IHNhdmVkU25pcHBldHM9dGhpcy5fc25pcHBldHNTZXR0aW5nLmdldCgpO2ZvcihsZXQgaT0wO2k8c2F2ZWRTbmlwcGV0cy5sZW5ndGg7KytpKQp0aGlzLl9zbmlwcGV0QWRkZWQoU25pcHBldHMuU25pcHBldC5mcm9tT2JqZWN0KHRoaXMsc2F2ZWRTbmlwcGV0c1tpXSkpO30KZGVsZXRlU25pcHBldChzbmlwcGV0KXt0aGlzLl9zbmlwcGV0cy5kZWxldGUoc25pcHBldC5pZCk7dGhpcy5fc2F2ZVNldHRpbmdzKCk7fQpjcmVhdGVTbmlwcGV0KCl7Y29uc3QgbmV4dElkPXRoaXMuX2xhc3RTbmlwcGV0SWRlbnRpZmllclNldHRpbmcuZ2V0KCkrMTtjb25zdCBzbmlwcGV0SWQ9U3RyaW5nKG5leHRJZCk7dGhpcy5fbGFzdFNuaXBwZXRJZGVudGlmaWVyU2V0dGluZy5zZXQobmV4dElkKTtjb25zdCBzbmlwcGV0PW5ldyBTbmlwcGV0cy5TbmlwcGV0KHRoaXMsc25pcHBldElkKTt0aGlzLl9zbmlwcGV0QWRkZWQoc25pcHBldCk7dGhpcy5fc2F2ZVNldHRpbmdzKCk7cmV0dXJuIHNuaXBwZXQ7fQpfc25pcHBldEFkZGVkKHNuaXBwZXQpe3RoaXMuX3NuaXBwZXRzLnNldChzbmlwcGV0LmlkLHNuaXBwZXQpO319O1NuaXBwZXRzLlNuaXBwZXQ9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHN0b3JhZ2UsaWQsbmFtZSxjb250ZW50KXtzdXBlcigpO3RoaXMuX3N0b3JhZ2U9c3RvcmFnZTt0aGlzLl9pZD1pZDt0aGlzLl9uYW1lPW5hbWV8fHN0b3JhZ2UubmFtZVByZWZpeCtpZDt0aGlzLl9jb250ZW50PWNvbnRlbnR8fCcnO30Kc3RhdGljIGZyb21PYmplY3Qoc3RvcmFnZSxzZXJpYWxpemVkU25pcHBldCl7cmV0dXJuIG5ldyBTbmlwcGV0cy5TbmlwcGV0KHN0b3JhZ2Usc2VyaWFsaXplZFNuaXBwZXQuaWQsc2VyaWFsaXplZFNuaXBwZXQubmFtZSxzZXJpYWxpemVkU25pcHBldC5jb250ZW50KTt9CmdldCBpZCgpe3JldHVybiB0aGlzLl9pZDt9CmdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWU7fQpzZXQgbmFtZShuYW1lKXtpZih0aGlzLl9uYW1lPT09bmFtZSkKcmV0dXJuO3RoaXMuX25hbWU9bmFtZTt0aGlzLl9zdG9yYWdlLl9zYXZlU2V0dGluZ3MoKTt9CmdldCBjb250ZW50KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ7fQpzZXQgY29udGVudChjb250ZW50KXtpZih0aGlzLl9jb250ZW50PT09Y29udGVudCkKcmV0dXJuO3RoaXMuX2NvbnRlbnQ9Y29udGVudDt0aGlzLl9zdG9yYWdlLl9zYXZlU2V0dGluZ3MoKTt9CnNlcmlhbGl6ZVRvT2JqZWN0KCl7Y29uc3Qgc2VyaWFsaXplZFNuaXBwZXQ9e307c2VyaWFsaXplZFNuaXBwZXQuaWQ9dGhpcy5pZDtzZXJpYWxpemVkU25pcHBldC5uYW1lPXRoaXMubmFtZTtzZXJpYWxpemVkU25pcHBldC5jb250ZW50PXRoaXMuY29udGVudDtyZXR1cm4gc2VyaWFsaXplZFNuaXBwZXQ7fX07O1NuaXBwZXRzLlNjcmlwdFNuaXBwZXRNb2RlbD1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3Iod29ya3NwYWNlKXtzdXBlcigpO3RoaXMuX3dvcmtzcGFjZT13b3Jrc3BhY2U7dGhpcy5fdWlTb3VyY2VDb2RlRm9yU25pcHBldElkPXt9O3RoaXMuX3NuaXBwZXRJZEZvclVJU291cmNlQ29kZT1uZXcgTWFwKCk7dGhpcy5fbWFwcGluZ0ZvckRlYnVnZ2VyTW9kZWw9bmV3IE1hcCgpO3RoaXMuX3NuaXBwZXRTdG9yYWdlPW5ldyBTbmlwcGV0cy5TbmlwcGV0U3RvcmFnZSgnc2NyaXB0JywnU2NyaXB0IHNuaXBwZXQgIycpO3RoaXMuX2xhc3RTbmlwcGV0RXZhbHVhdGlvbkluZGV4U2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnbGFzdFNuaXBwZXRFdmFsdWF0aW9uSW5kZXgnLDApO3RoaXMuX3Byb2plY3Q9bmV3IFNuaXBwZXRzLlNuaXBwZXRzUHJvamVjdCh3b3Jrc3BhY2UsdGhpcyk7dGhpcy5fbG9hZFNuaXBwZXRzKCk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZU1vZGVscyhTREsuRGVidWdnZXJNb2RlbCx0aGlzKTtCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuYWRkU291cmNlTWFwcGluZyh0aGlzKTt9Cm1vZGVsQWRkZWQoZGVidWdnZXJNb2RlbCl7dGhpcy5fbWFwcGluZ0ZvckRlYnVnZ2VyTW9kZWwuc2V0KGRlYnVnZ2VyTW9kZWwsbmV3IFNuaXBwZXRzLlNuaXBwZXRTY3JpcHRNYXBwaW5nKGRlYnVnZ2VyTW9kZWwsdGhpcykpO30KbW9kZWxSZW1vdmVkKGRlYnVnZ2VyTW9kZWwpe3RoaXMuX21hcHBpbmdGb3JEZWJ1Z2dlck1vZGVsLnJlbW92ZShkZWJ1Z2dlck1vZGVsKTt9CnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKXtjb25zdCBtYXBwaW5nPXRoaXMuX21hcHBpbmdGb3JEZWJ1Z2dlck1vZGVsLmdldChyYXdMb2NhdGlvbi5kZWJ1Z2dlck1vZGVsKTtpZighbWFwcGluZykKcmV0dXJuIG51bGw7cmV0dXJuIG1hcHBpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO30KdWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtmb3IoY29uc3QgbWFwcGluZyBvZiB0aGlzLl9tYXBwaW5nRm9yRGVidWdnZXJNb2RlbC52YWx1ZXMoKSl7Y29uc3QgcmF3TG9jYXRpb249bWFwcGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpO2lmKHJhd0xvY2F0aW9uKQpyZXR1cm4gcmF3TG9jYXRpb247fQpyZXR1cm4gbnVsbDt9CnNuaXBwZXRTY3JpcHRNYXBwaW5nKGRlYnVnZ2VyTW9kZWwpe3JldHVybiB0aGlzLl9tYXBwaW5nRm9yRGVidWdnZXJNb2RlbC5nZXQoZGVidWdnZXJNb2RlbCk7fQpwcm9qZWN0KCl7cmV0dXJuIHRoaXMuX3Byb2plY3Q7fQpfbG9hZFNuaXBwZXRzKCl7Zm9yKGNvbnN0IHNuaXBwZXQgb2YgdGhpcy5fc25pcHBldFN0b3JhZ2Uuc25pcHBldHMoKSkKdGhpcy5fYWRkU2NyaXB0U25pcHBldChzbmlwcGV0KTt9CmNyZWF0ZVNjcmlwdFNuaXBwZXQoY29udGVudCl7Y29uc3Qgc25pcHBldD10aGlzLl9zbmlwcGV0U3RvcmFnZS5jcmVhdGVTbmlwcGV0KCk7c25pcHBldC5jb250ZW50PWNvbnRlbnQ7cmV0dXJuIHRoaXMuX2FkZFNjcmlwdFNuaXBwZXQoc25pcHBldCk7fQpfYWRkU2NyaXB0U25pcHBldChzbmlwcGV0KXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fcHJvamVjdC5hZGRTbmlwcGV0KHNuaXBwZXQubmFtZSxuZXcgU25pcHBldHMuU25pcHBldENvbnRlbnRQcm92aWRlcihzbmlwcGV0KSk7dWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX3dvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTt0aGlzLl9zbmlwcGV0SWRGb3JVSVNvdXJjZUNvZGUuc2V0KHVpU291cmNlQ29kZSxzbmlwcGV0LmlkKTtjb25zdCBicmVha3BvaW50TG9jYXRpb25zPXRoaXMuX3JlbW92ZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSk7dGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTt0aGlzLl91aVNvdXJjZUNvZGVGb3JTbmlwcGV0SWRbc25pcHBldC5pZF09dWlTb3VyY2VDb2RlO3JldHVybiB1aVNvdXJjZUNvZGU7fQpfd29ya2luZ0NvcHlDaGFuZ2VkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3NjcmlwdFNuaXBwZXRFZGl0ZWQodWlTb3VyY2VDb2RlKTt9CmRlbGV0ZVNjcmlwdFNuaXBwZXQodWlTb3VyY2VDb2RlKXtjb25zdCBzbmlwcGV0SWQ9dGhpcy5fc25pcHBldElkRm9yVUlTb3VyY2VDb2RlLmdldCh1aVNvdXJjZUNvZGUpfHwnJztjb25zdCBzbmlwcGV0PXRoaXMuX3NuaXBwZXRTdG9yYWdlLnNuaXBwZXRGb3JJZChzbmlwcGV0SWQpO2lmKCFzbmlwcGV0KQpyZXR1cm47dGhpcy5fc25pcHBldFN0b3JhZ2UuZGVsZXRlU25pcHBldChzbmlwcGV0KTt0aGlzLl9yZW1vdmVCcmVha3BvaW50cyh1aVNvdXJjZUNvZGUpO3RoaXMuX3JlbGVhc2VTbmlwcGV0U2NyaXB0KHVpU291cmNlQ29kZSk7ZGVsZXRlIHRoaXMuX3VpU291cmNlQ29kZUZvclNuaXBwZXRJZFtzbmlwcGV0LmlkXTt0aGlzLl9zbmlwcGV0SWRGb3JVSVNvdXJjZUNvZGUucmVtb3ZlKHVpU291cmNlQ29kZSk7dGhpcy5fcHJvamVjdC5yZW1vdmVGaWxlKHNuaXBwZXQubmFtZSk7fQpyZW5hbWVTY3JpcHRTbmlwcGV0KG5hbWUsbmV3TmFtZSxjYWxsYmFjayl7bmV3TmFtZT1uZXdOYW1lLnRyaW0oKTtpZighbmV3TmFtZXx8bmV3TmFtZS5pbmRleE9mKCcvJykhPT0tMXx8bmFtZT09PW5ld05hbWV8fHRoaXMuX3NuaXBwZXRTdG9yYWdlLnNuaXBwZXRGb3JOYW1lKG5ld05hbWUpKXtjYWxsYmFjayhmYWxzZSk7cmV0dXJuO30KY29uc3Qgc25pcHBldD10aGlzLl9zbmlwcGV0U3RvcmFnZS5zbmlwcGV0Rm9yTmFtZShuYW1lKTtjb25zb2xlLmFzc2VydChzbmlwcGV0LCdTbmlwcGV0IFwnJytuYW1lKydcJyB3YXMgbm90IGZvdW5kLicpO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl91aVNvdXJjZUNvZGVGb3JTbmlwcGV0SWRbc25pcHBldC5pZF07Y29uc29sZS5hc3NlcnQodWlTb3VyY2VDb2RlLCdObyB1aVNvdXJjZUNvZGUgd2FzIGZvdW5kIGZvciBzbmlwcGV0IFwnJytuYW1lKydcJy4nKTtjb25zdCBicmVha3BvaW50TG9jYXRpb25zPXRoaXMuX3JlbW92ZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSk7c25pcHBldC5uYW1lPW5ld05hbWU7dGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTtjYWxsYmFjayh0cnVlLG5ld05hbWUpO30KX3NldFNjcmlwdFNuaXBwZXRDb250ZW50KG5hbWUsbmV3Q29udGVudCl7Y29uc3Qgc25pcHBldD10aGlzLl9zbmlwcGV0U3RvcmFnZS5zbmlwcGV0Rm9yTmFtZShuYW1lKTtzbmlwcGV0LmNvbnRlbnQ9bmV3Q29udGVudDt9Cl9zY3JpcHRTbmlwcGV0RWRpdGVkKHVpU291cmNlQ29kZSl7Y29uc3QgYnJlYWtwb2ludExvY2F0aW9ucz10aGlzLl9yZW1vdmVCcmVha3BvaW50cyh1aVNvdXJjZUNvZGUpO3RoaXMuX3JlbGVhc2VTbmlwcGV0U2NyaXB0KHVpU291cmNlQ29kZSk7dGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTt0aGlzLl9tYXBwaW5nRm9yRGVidWdnZXJNb2RlbC52YWx1ZXNBcnJheSgpLmZvckVhY2goZnVuY3Rpb24obWFwcGluZyl7bWFwcGluZy5fcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTt9KTt9Cl9uZXh0RXZhbHVhdGlvbkluZGV4KCl7Y29uc3QgZXZhbHVhdGlvbkluZGV4PXRoaXMuX2xhc3RTbmlwcGV0RXZhbHVhdGlvbkluZGV4U2V0dGluZy5nZXQoKSsxO3RoaXMuX2xhc3RTbmlwcGV0RXZhbHVhdGlvbkluZGV4U2V0dGluZy5zZXQoZXZhbHVhdGlvbkluZGV4KTtyZXR1cm4gZXZhbHVhdGlvbkluZGV4O30KYXN5bmMgZXZhbHVhdGVTY3JpcHRTbmlwcGV0KGV4ZWN1dGlvbkNvbnRleHQsdWlTb3VyY2VDb2RlKXtjb25zb2xlLmFzc2VydCh1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU25pcHBldHMpO2xldCBicmVha3BvaW50TG9jYXRpb25zPXRoaXMuX3JlbW92ZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSk7dGhpcy5fcmVsZWFzZVNuaXBwZXRTY3JpcHQodWlTb3VyY2VDb2RlKTt0aGlzLl9yZXN0b3JlQnJlYWtwb2ludHModWlTb3VyY2VDb2RlLGJyZWFrcG9pbnRMb2NhdGlvbnMpO2NvbnN0IHJ1bnRpbWVNb2RlbD1leGVjdXRpb25Db250ZXh0LnJ1bnRpbWVNb2RlbDtjb25zdCBkZWJ1Z2dlck1vZGVsPWV4ZWN1dGlvbkNvbnRleHQuZGVidWdnZXJNb2RlbDtjb25zdCBldmFsdWF0aW9uSW5kZXg9dGhpcy5fbmV4dEV2YWx1YXRpb25JbmRleCgpO2NvbnN0IG1hcHBpbmc9dGhpcy5fbWFwcGluZ0ZvckRlYnVnZ2VyTW9kZWwuZ2V0KGRlYnVnZ2VyTW9kZWwpO21hcHBpbmcuX3NldEV2YWx1YXRpb25JbmRleChldmFsdWF0aW9uSW5kZXgsdWlTb3VyY2VDb2RlKTtjb25zdCBldmFsdWF0aW9uVXJsPW1hcHBpbmcuX2V2YWx1YXRpb25Tb3VyY2VVUkwodWlTb3VyY2VDb2RlKTthd2FpdCB1aVNvdXJjZUNvZGUucmVxdWVzdENvbnRlbnQoKTtjb25zdCBleHByZXNzaW9uPXVpU291cmNlQ29kZS53b3JraW5nQ29weSgpO0NvbW1vbi5jb25zb2xlLnNob3coKTtjb25zdCByZXN1bHQ9YXdhaXQgcnVudGltZU1vZGVsLmNvbXBpbGVTY3JpcHQoZXhwcmVzc2lvbiwnJyx0cnVlLGV4ZWN1dGlvbkNvbnRleHQuaWQpO2lmKCFyZXN1bHR8fG1hcHBpbmcuZXZhbHVhdGlvbkluZGV4KHVpU291cmNlQ29kZSkhPT1ldmFsdWF0aW9uSW5kZXgpCnJldHVybjtjb25zdCBzY3JpcHQ9KGRlYnVnZ2VyTW9kZWwuc2NyaXB0Rm9ySWQoKHJlc3VsdC5zY3JpcHRJZHx8cmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMuc2NyaXB0SWQpKSk7bWFwcGluZy5fYWRkU2NyaXB0KHNjcmlwdCx1aVNvdXJjZUNvZGUpO2lmKCFyZXN1bHQuc2NyaXB0SWQpe3RoaXMuX3ByaW50UnVuT3JDb21waWxlU2NyaXB0UmVzdWx0RmFpbHVyZShydW50aW1lTW9kZWwsKHJlc3VsdC5leGNlcHRpb25EZXRhaWxzKSxldmFsdWF0aW9uVXJsKTtyZXR1cm47fQpicmVha3BvaW50TG9jYXRpb25zPXRoaXMuX3JlbW92ZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSk7dGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTt0aGlzLl9ydW5TY3JpcHQoc2NyaXB0LnNjcmlwdElkLGV4ZWN1dGlvbkNvbnRleHQsZXZhbHVhdGlvblVybCk7fQphc3luYyBfcnVuU2NyaXB0KHNjcmlwdElkLGV4ZWN1dGlvbkNvbnRleHQsc291cmNlVVJMKXtjb25zdCBydW50aW1lTW9kZWw9ZXhlY3V0aW9uQ29udGV4dC5ydW50aW1lTW9kZWw7Y29uc3QgcmVzdWx0PWF3YWl0IHJ1bnRpbWVNb2RlbC5ydW5TY3JpcHQoc2NyaXB0SWQsZXhlY3V0aW9uQ29udGV4dC5pZCwnY29uc29sZScsZmFsc2UsdHJ1ZSxmYWxzZSx0cnVlKTtpZihyZXN1bHQuZXJyb3IpCnJldHVybjtpZighcmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMpCnRoaXMuX3ByaW50UnVuU2NyaXB0UmVzdWx0KHJ1bnRpbWVNb2RlbCxyZXN1bHQub2JqZWN0fHxudWxsLHNjcmlwdElkLHNvdXJjZVVSTCk7ZWxzZQp0aGlzLl9wcmludFJ1bk9yQ29tcGlsZVNjcmlwdFJlc3VsdEZhaWx1cmUocnVudGltZU1vZGVsLHJlc3VsdC5leGNlcHRpb25EZXRhaWxzLHNvdXJjZVVSTCk7fQpfcHJpbnRSdW5TY3JpcHRSZXN1bHQocnVudGltZU1vZGVsLHJlc3VsdCxzY3JpcHRJZCxzb3VyY2VVUkwpe2NvbnN0IGNvbnNvbGVNZXNzYWdlPW5ldyBTREsuQ29uc29sZU1lc3NhZ2UocnVudGltZU1vZGVsLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLkpTLFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwuSW5mbywnJyxTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGUuUmVzdWx0LHNvdXJjZVVSTCx1bmRlZmluZWQsdW5kZWZpbmVkLFtyZXN1bHRdLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHNjcmlwdElkKTtTREsuY29uc29sZU1vZGVsLmFkZE1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpO30KX3ByaW50UnVuT3JDb21waWxlU2NyaXB0UmVzdWx0RmFpbHVyZShydW50aW1lTW9kZWwsZXhjZXB0aW9uRGV0YWlscyxzb3VyY2VVUkwpe1NESy5jb25zb2xlTW9kZWwuYWRkTWVzc2FnZShTREsuQ29uc29sZU1lc3NhZ2UuZnJvbUV4Y2VwdGlvbihydW50aW1lTW9kZWwsZXhjZXB0aW9uRGV0YWlscyx1bmRlZmluZWQsdW5kZWZpbmVkLHNvdXJjZVVSTHx8dW5kZWZpbmVkKSk7fQpfcmVtb3ZlQnJlYWtwb2ludHModWlTb3VyY2VDb2RlKXtjb25zdCBicmVha3BvaW50TG9jYXRpb25zPUJpbmRpbmdzLmJyZWFrcG9pbnRNYW5hZ2VyLmJyZWFrcG9pbnRMb2NhdGlvbnNGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtmb3IobGV0IGk9MDtpPGJyZWFrcG9pbnRMb2NhdGlvbnMubGVuZ3RoOysraSkKYnJlYWtwb2ludExvY2F0aW9uc1tpXS5icmVha3BvaW50LnJlbW92ZShmYWxzZSk7cmV0dXJuIGJyZWFrcG9pbnRMb2NhdGlvbnM7fQpfcmVzdG9yZUJyZWFrcG9pbnRzKHVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKXtmb3IobGV0IGk9MDtpPGJyZWFrcG9pbnRMb2NhdGlvbnMubGVuZ3RoOysraSl7Y29uc3QgdWlMb2NhdGlvbj1icmVha3BvaW50TG9jYXRpb25zW2ldLnVpTG9jYXRpb247Y29uc3QgYnJlYWtwb2ludD1icmVha3BvaW50TG9jYXRpb25zW2ldLmJyZWFrcG9pbnQ7QmluZGluZ3MuYnJlYWtwb2ludE1hbmFnZXIuc2V0QnJlYWtwb2ludCh1aVNvdXJjZUNvZGUsdWlMb2NhdGlvbi5saW5lTnVtYmVyLHVpTG9jYXRpb24uY29sdW1uTnVtYmVyLGJyZWFrcG9pbnQuY29uZGl0aW9uKCksYnJlYWtwb2ludC5lbmFibGVkKCkpO319Cl9yZWxlYXNlU25pcHBldFNjcmlwdCh1aVNvdXJjZUNvZGUpe3RoaXMuX21hcHBpbmdGb3JEZWJ1Z2dlck1vZGVsLnZhbHVlc0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbihtYXBwaW5nKXttYXBwaW5nLl9yZWxlYXNlU25pcHBldFNjcmlwdCh1aVNvdXJjZUNvZGUpO30pO30KX3NuaXBwZXRJZEZvclNvdXJjZVVSTChzb3VyY2VVUkwpe2NvbnN0IHNuaXBwZXRQcmVmaXg9U25pcHBldHMuU2NyaXB0U25pcHBldE1vZGVsLnNuaXBwZXRTb3VyY2VVUkxQcmVmaXg7aWYoIXNvdXJjZVVSTC5zdGFydHNXaXRoKHNuaXBwZXRQcmVmaXgpKQpyZXR1cm4gbnVsbDtjb25zdCBzcGxpdFVSTD1zb3VyY2VVUkwuc3Vic3RyaW5nKHNuaXBwZXRQcmVmaXgubGVuZ3RoKS5zcGxpdCgnXycpO2NvbnN0IHNuaXBwZXRJZD1zcGxpdFVSTFswXTtyZXR1cm4gc25pcHBldElkO319O1NuaXBwZXRzLlNjcmlwdFNuaXBwZXRNb2RlbC5zbmlwcGV0U291cmNlVVJMUHJlZml4PSdzbmlwcGV0czovLy8nO1NuaXBwZXRzLlNuaXBwZXRTY3JpcHRNYXBwaW5nPWNsYXNze2NvbnN0cnVjdG9yKGRlYnVnZ2VyTW9kZWwsc2NyaXB0U25pcHBldE1vZGVsKXt0aGlzLl9kZWJ1Z2dlck1vZGVsPWRlYnVnZ2VyTW9kZWw7dGhpcy5fc2NyaXB0U25pcHBldE1vZGVsPXNjcmlwdFNuaXBwZXRNb2RlbDt0aGlzLl91aVNvdXJjZUNvZGVGb3JTY3JpcHRJZD17fTt0aGlzLl9zY3JpcHRGb3JVSVNvdXJjZUNvZGU9bmV3IE1hcCgpO3RoaXMuX2V2YWx1YXRpb25JbmRleEZvclVJU291cmNlQ29kZT1uZXcgTWFwKCk7ZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLHRoaXMuX3Jlc2V0LHRoaXMpO30KX3JlbGVhc2VTbmlwcGV0U2NyaXB0KHVpU291cmNlQ29kZSl7Y29uc3Qgc2NyaXB0PXRoaXMuX3NjcmlwdEZvclVJU291cmNlQ29kZS5nZXQodWlTb3VyY2VDb2RlKTtpZighc2NyaXB0KQpyZXR1cm47ZGVsZXRlIHRoaXMuX3VpU291cmNlQ29kZUZvclNjcmlwdElkW3NjcmlwdC5zY3JpcHRJZF07dGhpcy5fc2NyaXB0Rm9yVUlTb3VyY2VDb2RlLnJlbW92ZSh1aVNvdXJjZUNvZGUpO3RoaXMuX2V2YWx1YXRpb25JbmRleEZvclVJU291cmNlQ29kZS5yZW1vdmUodWlTb3VyY2VDb2RlKTt9Cl9zZXRFdmFsdWF0aW9uSW5kZXgoZXZhbHVhdGlvbkluZGV4LHVpU291cmNlQ29kZSl7dGhpcy5fZXZhbHVhdGlvbkluZGV4Rm9yVUlTb3VyY2VDb2RlLnNldCh1aVNvdXJjZUNvZGUsZXZhbHVhdGlvbkluZGV4KTt9CmV2YWx1YXRpb25JbmRleCh1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLl9ldmFsdWF0aW9uSW5kZXhGb3JVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSk7fQpfZXZhbHVhdGlvblNvdXJjZVVSTCh1aVNvdXJjZUNvZGUpe2NvbnN0IGV2YWx1YXRpb25TdWZmaXg9J18nK3RoaXMuX2V2YWx1YXRpb25JbmRleEZvclVJU291cmNlQ29kZS5nZXQodWlTb3VyY2VDb2RlKTtjb25zdCBzbmlwcGV0SWQ9dGhpcy5fc2NyaXB0U25pcHBldE1vZGVsLl9zbmlwcGV0SWRGb3JVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSk7cmV0dXJuIFNuaXBwZXRzLlNjcmlwdFNuaXBwZXRNb2RlbC5zbmlwcGV0U291cmNlVVJMUHJlZml4K3NuaXBwZXRJZCtldmFsdWF0aW9uU3VmZml4O30KX3Jlc2V0KCl7dGhpcy5fdWlTb3VyY2VDb2RlRm9yU2NyaXB0SWQ9e307dGhpcy5fc2NyaXB0Rm9yVUlTb3VyY2VDb2RlLmNsZWFyKCk7dGhpcy5fZXZhbHVhdGlvbkluZGV4Rm9yVUlTb3VyY2VDb2RlLmNsZWFyKCk7fQpyYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbil7Y29uc3QgZGVidWdnZXJNb2RlbExvY2F0aW9uPShyYXdMb2NhdGlvbik7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX3VpU291cmNlQ29kZUZvclNjcmlwdElkW2RlYnVnZ2VyTW9kZWxMb2NhdGlvbi5zY3JpcHRJZF07aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIG51bGw7cmV0dXJuIHVpU291cmNlQ29kZS51aUxvY2F0aW9uKGRlYnVnZ2VyTW9kZWxMb2NhdGlvbi5saW5lTnVtYmVyLGRlYnVnZ2VyTW9kZWxMb2NhdGlvbi5jb2x1bW5OdW1iZXJ8fDApO30KdWlMb2NhdGlvblRvUmF3TG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBzY3JpcHQ9dGhpcy5fc2NyaXB0Rm9yVUlTb3VyY2VDb2RlLmdldCh1aVNvdXJjZUNvZGUpO2lmKCFzY3JpcHQpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9kZWJ1Z2dlck1vZGVsLmNyZWF0ZVJhd0xvY2F0aW9uKHNjcmlwdCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fQpfYWRkU2NyaXB0KHNjcmlwdCx1aVNvdXJjZUNvZGUpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLl9zY3JpcHRGb3JVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSkpO3RoaXMuX3VpU291cmNlQ29kZUZvclNjcmlwdElkW3NjcmlwdC5zY3JpcHRJZF09dWlTb3VyY2VDb2RlO3RoaXMuX3NjcmlwdEZvclVJU291cmNlQ29kZS5zZXQodWlTb3VyY2VDb2RlLHNjcmlwdCk7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30KX3Jlc3RvcmVCcmVha3BvaW50cyh1aVNvdXJjZUNvZGUsYnJlYWtwb2ludExvY2F0aW9ucyl7Y29uc3Qgc2NyaXB0PXRoaXMuX3NjcmlwdEZvclVJU291cmNlQ29kZS5nZXQodWlTb3VyY2VDb2RlKTtpZighc2NyaXB0KQpyZXR1cm47Y29uc3QgcmF3TG9jYXRpb249KHRoaXMuX2RlYnVnZ2VyTW9kZWwuY3JlYXRlUmF3TG9jYXRpb24oc2NyaXB0LDAsMCkpO2NvbnN0IHVpTG9jYXRpb249QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKHJhd0xvY2F0aW9uKTtpZih1aUxvY2F0aW9uKQp0aGlzLl9zY3JpcHRTbmlwcGV0TW9kZWwuX3Jlc3RvcmVCcmVha3BvaW50cyh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSxicmVha3BvaW50TG9jYXRpb25zKTt9fTtTbmlwcGV0cy5TbmlwcGV0Q29udGVudFByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKHNuaXBwZXQpe3RoaXMuX3NuaXBwZXQ9c25pcHBldDt9CmNvbnRlbnRVUkwoKXtyZXR1cm4nJzt9CmNvbnRlbnRUeXBlKCl7cmV0dXJuIENvbW1vbi5yZXNvdXJjZVR5cGVzLlNuaXBwZXQ7fQpjb250ZW50RW5jb2RlZCgpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO30KcmVxdWVzdENvbnRlbnQoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCh0aGlzLl9zbmlwcGV0LmNvbnRlbnQpKTt9CmFzeW5jIHNlYXJjaEluQ29udGVudChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpe3JldHVybiBDb21tb24uQ29udGVudFByb3ZpZGVyLnBlcmZvcm1TZWFyY2hJbkNvbnRlbnQodGhpcy5fc25pcHBldC5jb250ZW50LHF1ZXJ5LGNhc2VTZW5zaXRpdmUsaXNSZWdleCk7fX07U25pcHBldHMuU25pcHBldHNQcm9qZWN0PWNsYXNzIGV4dGVuZHMgQmluZGluZ3MuQ29udGVudFByb3ZpZGVyQmFzZWRQcm9qZWN0e2NvbnN0cnVjdG9yKHdvcmtzcGFjZSxtb2RlbCl7c3VwZXIod29ya3NwYWNlLCdzbmlwcGV0czonLFdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU25pcHBldHMsJycsZmFsc2UpO3RoaXMuX21vZGVsPW1vZGVsO30KYWRkU25pcHBldChuYW1lLGNvbnRlbnRQcm92aWRlcil7cmV0dXJuIHRoaXMuYWRkQ29udGVudFByb3ZpZGVyKG5hbWUsY29udGVudFByb3ZpZGVyLCd0ZXh0L2phdmFzY3JpcHQnKTt9CmNhblNldEZpbGVDb250ZW50KCl7cmV0dXJuIHRydWU7fQphc3luYyBzZXRGaWxlQ29udGVudCh1aVNvdXJjZUNvZGUsbmV3Q29udGVudCxpc0Jhc2U2NCl7dGhpcy5fbW9kZWwuX3NldFNjcmlwdFNuaXBwZXRDb250ZW50KHVpU291cmNlQ29kZS51cmwoKSxuZXdDb250ZW50KTt9CmNhblJlbmFtZSgpe3JldHVybiB0cnVlO30KcGVyZm9ybVJlbmFtZSh1cmwsbmV3TmFtZSxjYWxsYmFjayl7dGhpcy5fbW9kZWwucmVuYW1lU2NyaXB0U25pcHBldCh1cmwsbmV3TmFtZSxjYWxsYmFjayk7fQpjcmVhdGVGaWxlKHVybCxuYW1lLGNvbnRlbnQsaXNCYXNlNjQpe3JldHVybihQcm9taXNlLnJlc29sdmUodGhpcy5fbW9kZWwuY3JlYXRlU2NyaXB0U25pcHBldChjb250ZW50KSkpO30KZGVsZXRlRmlsZSh1aVNvdXJjZUNvZGUpe3RoaXMuX21vZGVsLmRlbGV0ZVNjcmlwdFNuaXBwZXQodWlTb3VyY2VDb2RlKTt9fTtTbmlwcGV0cy5zY3JpcHRTbmlwcGV0TW9kZWw9bmV3IFNuaXBwZXRzLlNjcmlwdFNuaXBwZXRNb2RlbChXb3Jrc3BhY2Uud29ya3NwYWNlKTs7U25pcHBldHMuU25pcHBldHNRdWlja09wZW49Y2xhc3MgZXh0ZW5kcyBRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LlByb3ZpZGVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9zbmlwcGV0cz1bXTt9CnNlbGVjdEl0ZW0oaXRlbUluZGV4LHByb21wdFZhbHVlKXtpZihpdGVtSW5kZXg9PT1udWxsKQpyZXR1cm47Y29uc3QgY3VycmVudEV4ZWN1dGlvbkNvbnRleHQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKGN1cnJlbnRFeGVjdXRpb25Db250ZXh0KQpTbmlwcGV0cy5zY3JpcHRTbmlwcGV0TW9kZWwuZXZhbHVhdGVTY3JpcHRTbmlwcGV0KGN1cnJlbnRFeGVjdXRpb25Db250ZXh0LHRoaXMuX3NuaXBwZXRzW2l0ZW1JbmRleF0pO30Kbm90Rm91bmRUZXh0KHF1ZXJ5KXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdObyBzbmlwcGV0cyBmb3VuZC4nKTt9CmF0dGFjaCgpe3RoaXMuX3NuaXBwZXRzPVNuaXBwZXRzLnNjcmlwdFNuaXBwZXRNb2RlbC5wcm9qZWN0KCkudWlTb3VyY2VDb2RlcygpO30KZGV0YWNoKCl7dGhpcy5fc25pcHBldHM9W107fQppdGVtQ291bnQoKXtyZXR1cm4gdGhpcy5fc25pcHBldHMubGVuZ3RoO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7cmV0dXJuIHRoaXMuX3NuaXBwZXRzW2l0ZW1JbmRleF0ubmFtZSgpO30KcmVuZGVySXRlbShpdGVtSW5kZXgscXVlcnksdGl0bGVFbGVtZW50LHN1YnRpdGxlRWxlbWVudCl7dGl0bGVFbGVtZW50LnRleHRDb250ZW50PXRoaXMuX3NuaXBwZXRzW2l0ZW1JbmRleF0ubmFtZSgpO3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtb25vc3BhY2UnKTtRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LmhpZ2hsaWdodFJhbmdlcyh0aXRsZUVsZW1lbnQscXVlcnksdHJ1ZSk7fX07O1NvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yPWNsYXNzIGV4dGVuZHMgVGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvcntjb25zdHJ1Y3RvcihkZWxlZ2F0ZSl7c3VwZXIoe2xpbmVOdW1iZXJzOnRydWUsbGluZVdyYXBwaW5nOmZhbHNlLGJyYWNrZXRNYXRjaGluZ1NldHRpbmc6Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JCcmFja2V0TWF0Y2hpbmcnKSxwYWRCb3R0b206dHJ1ZX0pO3RoaXMuY29kZU1pcnJvcigpLmFkZEtleU1hcCh7J0VudGVyJzonc21hcnROZXdsaW5lQW5kSW5kZW50JywnRXNjJzonc291cmNlc0Rpc21pc3MnfSk7dGhpcy5fZGVsZWdhdGU9ZGVsZWdhdGU7dGhpcy5jb2RlTWlycm9yKCkub24oJ2N1cnNvckFjdGl2aXR5Jyx0aGlzLl9jdXJzb3JBY3Rpdml0eS5iaW5kKHRoaXMpKTt0aGlzLmNvZGVNaXJyb3IoKS5vbignZ3V0dGVyQ2xpY2snLHRoaXMuX2d1dHRlckNsaWNrLmJpbmQodGhpcykpO3RoaXMuY29kZU1pcnJvcigpLm9uKCdzY3JvbGwnLHRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpKTt0aGlzLmNvZGVNaXJyb3IoKS5vbignZm9jdXMnLHRoaXMuX2ZvY3VzLmJpbmQodGhpcykpO3RoaXMuY29kZU1pcnJvcigpLm9uKCdibHVyJyx0aGlzLl9ibHVyLmJpbmQodGhpcykpO3RoaXMuY29kZU1pcnJvcigpLm9uKCdiZWZvcmVTZWxlY3Rpb25DaGFuZ2UnLHRoaXMuX2ZpcmVCZWZvcmVTZWxlY3Rpb25DaGFuZ2VkLmJpbmQodGhpcykpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5jb2RlTWlycm9yKCkuYWRkS2V5TWFwKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLl9CbG9ja0luZGVudENvbnRyb2xsZXIpO3RoaXMuX3Rva2VuSGlnaGxpZ2h0ZXI9bmV3IFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLlRva2VuSGlnaGxpZ2h0ZXIodGhpcyx0aGlzLmNvZGVNaXJyb3IoKSk7dGhpcy5fZ3V0dGVycz1bJ0NvZGVNaXJyb3ItbGluZW51bWJlcnMnXTt0aGlzLmNvZGVNaXJyb3IoKS5zZXRPcHRpb24oJ2d1dHRlcnMnLHRoaXMuX2d1dHRlcnMuc2xpY2UoKSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdlbGVjdHJpY0NoYXJzJyxmYWxzZSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdzbWFydEluZGVudCcsZmFsc2UpO2Z1bmN0aW9uIHVwZGF0ZUFudGljaXBhdGVKdW1wRmxhZyh2YWx1ZSl7dGhpcy5faXNIYW5kbGluZ01vdXNlRG93bkV2ZW50PXZhbHVlO30KdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdXBkYXRlQW50aWNpcGF0ZUp1bXBGbGFnLmJpbmQodGhpcyx0cnVlKSx0cnVlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx1cGRhdGVBbnRpY2lwYXRlSnVtcEZsYWcuYmluZCh0aGlzLGZhbHNlKSxmYWxzZSk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JJbmRlbnQnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9vblVwZGF0ZUVkaXRvckluZGVudGF0aW9uLHRoaXMpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCd0ZXh0RWRpdG9yQXV0b0RldGVjdEluZGVudCcpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX29uVXBkYXRlRWRpdG9ySW5kZW50YXRpb24sdGhpcyk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dXaGl0ZXNwYWNlc0luRWRpdG9yJykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlV2hpdGVzcGFjZSx0aGlzKTt0aGlzLl9hdXRvY29tcGxldGVDb25maWc9e2lzV29yZENoYXI6VGV4dFV0aWxzLlRleHRVdGlscy5pc1dvcmRDaGFyfTtDb21tb24ubW9kdWxlU2V0dGluZygndGV4dEVkaXRvckF1dG9jb21wbGV0aW9uJykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlQXV0b2NvbXBsZXRlLHRoaXMpO3RoaXMuX3VwZGF0ZUF1dG9jb21wbGV0ZSgpO3RoaXMuX29uVXBkYXRlRWRpdG9ySW5kZW50YXRpb24oKTt0aGlzLl9zZXR1cFdoaXRlc3BhY2VIaWdobGlnaHQoKTt9CmF0dGFjaEluZm9iYXIoaW5mb2Jhcil7dGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShpbmZvYmFyLmVsZW1lbnQsdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpO2luZm9iYXIuc2V0UGFyZW50Vmlldyh0aGlzKTt0aGlzLmRvUmVzaXplKCk7fQpzdGF0aWMgX2d1ZXNzSW5kZW50YXRpb25MZXZlbChsaW5lcyl7Y29uc3QgdGFiUmVnZXg9L15cdCsvO2xldCB0YWJMaW5lcz0wO2NvbnN0IGluZGVudHM9e307Zm9yKGxldCBsaW5lTnVtYmVyPTA7bGluZU51bWJlcjxsaW5lcy5sZW5ndGg7KytsaW5lTnVtYmVyKXtjb25zdCB0ZXh0PWxpbmVzW2xpbmVOdW1iZXJdO2lmKHRleHQubGVuZ3RoPT09MHx8IVRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIodGV4dFswXSkpCmNvbnRpbnVlO2lmKHRhYlJlZ2V4LnRlc3QodGV4dCkpeysrdGFiTGluZXM7Y29udGludWU7fQpsZXQgaT0wO3doaWxlKGk8dGV4dC5sZW5ndGgmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIodGV4dFtpXSkpCisraTtpZihpJTIhPT0wKQpjb250aW51ZTtpbmRlbnRzW2ldPTErKGluZGVudHNbaV18fDApO30KY29uc3QgbGluZXNDb3VudFBlckluZGVudFRocmVzaG9sZD0zKmxpbmVzLmxlbmd0aC8xMDA7aWYodGFiTGluZXMmJnRhYkxpbmVzPmxpbmVzQ291bnRQZXJJbmRlbnRUaHJlc2hvbGQpCnJldHVybidcdCc7bGV0IG1pbmltdW1JbmRlbnQ9SW5maW5pdHk7Zm9yKGNvbnN0IGkgaW4gaW5kZW50cyl7aWYoaW5kZW50c1tpXTxsaW5lc0NvdW50UGVySW5kZW50VGhyZXNob2xkKQpjb250aW51ZTtjb25zdCBpbmRlbnQ9cGFyc2VJbnQoaSwxMCk7aWYobWluaW11bUluZGVudD5pbmRlbnQpCm1pbmltdW1JbmRlbnQ9aW5kZW50O30KaWYobWluaW11bUluZGVudD09PUluZmluaXR5KQpyZXR1cm4gQ29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JJbmRlbnQnKS5nZXQoKTtyZXR1cm4nICcucmVwZWF0KG1pbmltdW1JbmRlbnQpO30KX2lzU2VhcmNoQWN0aXZlKCl7cmV0dXJuISF0aGlzLl90b2tlbkhpZ2hsaWdodGVyLmhpZ2hsaWdodGVkUmVnZXgoKTt9CnNjcm9sbFRvTGluZShsaW5lTnVtYmVyKXtzdXBlci5zY3JvbGxUb0xpbmUobGluZU51bWJlcik7dGhpcy5fc2Nyb2xsKCk7fQpoaWdobGlnaHRTZWFyY2hSZXN1bHRzKHJlZ2V4LHJhbmdlKXtmdW5jdGlvbiBpbm5lckhpZ2hsaWdodFJlZ2V4KCl7aWYocmFuZ2Upe3RoaXMuc2Nyb2xsTGluZUludG9WaWV3KHJhbmdlLnN0YXJ0TGluZSk7aWYocmFuZ2UuZW5kQ29sdW1uPlRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IubWF4SGlnaGxpZ2h0TGVuZ3RoKQp0aGlzLnNldFNlbGVjdGlvbihyYW5nZSk7ZWxzZQp0aGlzLnNldFNlbGVjdGlvbihUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pKTt9CnRoaXMuX3Rva2VuSGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0U2VhcmNoUmVzdWx0cyhyZWdleCxyYW5nZSk7fQppZighdGhpcy5fc2VsZWN0aW9uQmVmb3JlU2VhcmNoKQp0aGlzLl9zZWxlY3Rpb25CZWZvcmVTZWFyY2g9dGhpcy5zZWxlY3Rpb24oKTt0aGlzLmNvZGVNaXJyb3IoKS5vcGVyYXRpb24oaW5uZXJIaWdobGlnaHRSZWdleC5iaW5kKHRoaXMpKTt9CmNhbmNlbFNlYXJjaFJlc3VsdHNIaWdobGlnaHQoKXt0aGlzLmNvZGVNaXJyb3IoKS5vcGVyYXRpb24odGhpcy5fdG9rZW5IaWdobGlnaHRlci5oaWdobGlnaHRTZWxlY3RlZFRva2Vucy5iaW5kKHRoaXMuX3Rva2VuSGlnaGxpZ2h0ZXIpKTtpZih0aGlzLl9zZWxlY3Rpb25CZWZvcmVTZWFyY2gpe3RoaXMuX3JlcG9ydEp1bXAodGhpcy5fc2VsZWN0aW9uQmVmb3JlU2VhcmNoLHRoaXMuc2VsZWN0aW9uKCkpO2RlbGV0ZSB0aGlzLl9zZWxlY3Rpb25CZWZvcmVTZWFyY2g7fX0KcmVtb3ZlSGlnaGxpZ2h0KGhpZ2hsaWdodERlc2NyaXB0b3Ipe2hpZ2hsaWdodERlc2NyaXB0b3IuY2xlYXIoKTt9CmhpZ2hsaWdodFJhbmdlKHJhbmdlLGNzc0NsYXNzKXtjc3NDbGFzcz0nQ29kZU1pcnJvci1wZXJzaXN0LWhpZ2hsaWdodCAnK2Nzc0NsYXNzO2NvbnN0IHBvcz1UZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1BvcyhyYW5nZSk7Kytwb3MuZW5kLmNoO3JldHVybiB0aGlzLmNvZGVNaXJyb3IoKS5tYXJrVGV4dChwb3Muc3RhcnQscG9zLmVuZCx7Y2xhc3NOYW1lOmNzc0NsYXNzLHN0YXJ0U3R5bGU6Y3NzQ2xhc3MrJy1zdGFydCcsZW5kU3R5bGU6Y3NzQ2xhc3MrJy1lbmQnfSk7fQppbnN0YWxsR3V0dGVyKHR5cGUsbGVmdFRvTnVtYmVycyl7aWYodGhpcy5fZ3V0dGVycy5pbmRleE9mKHR5cGUpIT09LTEpCnJldHVybjtpZihsZWZ0VG9OdW1iZXJzKQp0aGlzLl9ndXR0ZXJzLnVuc2hpZnQodHlwZSk7ZWxzZQp0aGlzLl9ndXR0ZXJzLnB1c2godHlwZSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdndXR0ZXJzJyx0aGlzLl9ndXR0ZXJzLnNsaWNlKCkpO3RoaXMucmVmcmVzaCgpO30KdW5pbnN0YWxsR3V0dGVyKHR5cGUpe2NvbnN0IGluZGV4PXRoaXMuX2d1dHRlcnMuaW5kZXhPZih0eXBlKTtpZihpbmRleD09PS0xKQpyZXR1cm47dGhpcy5jb2RlTWlycm9yKCkuY2xlYXJHdXR0ZXIodHlwZSk7dGhpcy5fZ3V0dGVycy5zcGxpY2UoaW5kZXgsMSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdndXR0ZXJzJyx0aGlzLl9ndXR0ZXJzLnNsaWNlKCkpO3RoaXMucmVmcmVzaCgpO30Kc2V0R3V0dGVyRGVjb3JhdGlvbihsaW5lTnVtYmVyLHR5cGUsZWxlbWVudCl7Y29uc29sZS5hc3NlcnQodGhpcy5fZ3V0dGVycy5pbmRleE9mKHR5cGUpIT09LTEsJ0Nhbm5vdCBkZWNvcmF0ZSB1bmV4aXN0aW5nIGd1dHRlci4nKTt0aGlzLmNvZGVNaXJyb3IoKS5zZXRHdXR0ZXJNYXJrZXIobGluZU51bWJlcix0eXBlLGVsZW1lbnQpO30Kc2V0RXhlY3V0aW9uTG9jYXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3RoaXMuY2xlYXJQb3NpdGlvbkhpZ2hsaWdodCgpO3RoaXMuX2V4ZWN1dGlvbkxpbmU9dGhpcy5jb2RlTWlycm9yKCkuZ2V0TGluZUhhbmRsZShsaW5lTnVtYmVyKTtpZighdGhpcy5fZXhlY3V0aW9uTGluZSkKcmV0dXJuO3RoaXMuc2hvd0V4ZWN1dGlvbkxpbmVCYWNrZ3JvdW5kKCk7dGhpcy5jb2RlTWlycm9yKCkuYWRkTGluZUNsYXNzKHRoaXMuX2V4ZWN1dGlvbkxpbmUsJ3dyYXAnLCdjbS1leGVjdXRpb24tbGluZS1vdXRsaW5lJyk7bGV0IHRva2VuPXRoaXMudG9rZW5BdFRleHRQb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7aWYodG9rZW4mJiF0b2tlbi50eXBlJiZ0b2tlbi5zdGFydENvbHVtbisxPT09dG9rZW4uZW5kQ29sdW1uKXtjb25zdCB0b2tlbkNvbnRlbnQ9dGhpcy5jb2RlTWlycm9yKCkuZ2V0TGluZShsaW5lTnVtYmVyKVt0b2tlbi5zdGFydENvbHVtbl07aWYodG9rZW5Db250ZW50PT09Jy4nfHx0b2tlbkNvbnRlbnQ9PT0nKCcpCnRva2VuPXRoaXMudG9rZW5BdFRleHRQb3NpdGlvbihsaW5lTnVtYmVyLHRva2VuLmVuZENvbHVtbisxKTt9CmxldCBlbmRDb2x1bW47aWYodG9rZW4mJnRva2VuLnR5cGUpCmVuZENvbHVtbj10b2tlbi5lbmRDb2x1bW47ZWxzZQplbmRDb2x1bW49dGhpcy5jb2RlTWlycm9yKCkuZ2V0TGluZShsaW5lTnVtYmVyKS5sZW5ndGg7dGhpcy5fZXhlY3V0aW9uTGluZVRhaWxNYXJrZXI9dGhpcy5jb2RlTWlycm9yKCkubWFya1RleHQoe2xpbmU6bGluZU51bWJlcixjaDpjb2x1bW5OdW1iZXJ9LHtsaW5lOmxpbmVOdW1iZXIsY2g6ZW5kQ29sdW1ufSx7Y2xhc3NOYW1lOidjbS1leGVjdXRpb24tbGluZS10YWlsJ30pO30Kc2hvd0V4ZWN1dGlvbkxpbmVCYWNrZ3JvdW5kKCl7aWYodGhpcy5fZXhlY3V0aW9uTGluZSkKdGhpcy5jb2RlTWlycm9yKCkuYWRkTGluZUNsYXNzKHRoaXMuX2V4ZWN1dGlvbkxpbmUsJ3dyYXAnLCdjbS1leGVjdXRpb24tbGluZScpO30KaGlkZUV4ZWN1dGlvbkxpbmVCYWNrZ3JvdW5kKCl7aWYodGhpcy5fZXhlY3V0aW9uTGluZSkKdGhpcy5jb2RlTWlycm9yKCkucmVtb3ZlTGluZUNsYXNzKHRoaXMuX2V4ZWN1dGlvbkxpbmUsJ3dyYXAnLCdjbS1leGVjdXRpb24tbGluZScpO30KY2xlYXJFeGVjdXRpb25MaW5lKCl7dGhpcy5jbGVhclBvc2l0aW9uSGlnaGxpZ2h0KCk7aWYodGhpcy5fZXhlY3V0aW9uTGluZSl7dGhpcy5oaWRlRXhlY3V0aW9uTGluZUJhY2tncm91bmQoKTt0aGlzLmNvZGVNaXJyb3IoKS5yZW1vdmVMaW5lQ2xhc3ModGhpcy5fZXhlY3V0aW9uTGluZSwnd3JhcCcsJ2NtLWV4ZWN1dGlvbi1saW5lLW91dGxpbmUnKTt9CmRlbGV0ZSB0aGlzLl9leGVjdXRpb25MaW5lO2lmKHRoaXMuX2V4ZWN1dGlvbkxpbmVUYWlsTWFya2VyKQp0aGlzLl9leGVjdXRpb25MaW5lVGFpbE1hcmtlci5jbGVhcigpO2RlbGV0ZSB0aGlzLl9leGVjdXRpb25MaW5lVGFpbE1hcmtlcjt9CnRvZ2dsZUxpbmVDbGFzcyhsaW5lTnVtYmVyLGNsYXNzTmFtZSx0b2dnbGVkKXtpZih0aGlzLmhhc0xpbmVDbGFzcyhsaW5lTnVtYmVyLGNsYXNzTmFtZSk9PT10b2dnbGVkKQpyZXR1cm47Y29uc3QgbGluZUhhbmRsZT10aGlzLmNvZGVNaXJyb3IoKS5nZXRMaW5lSGFuZGxlKGxpbmVOdW1iZXIpO2lmKCFsaW5lSGFuZGxlKQpyZXR1cm47aWYodG9nZ2xlZCl7dGhpcy5jb2RlTWlycm9yKCkuYWRkTGluZUNsYXNzKGxpbmVIYW5kbGUsJ2d1dHRlcicsY2xhc3NOYW1lKTt0aGlzLmNvZGVNaXJyb3IoKS5hZGRMaW5lQ2xhc3MobGluZUhhbmRsZSwnd3JhcCcsY2xhc3NOYW1lKTt9ZWxzZXt0aGlzLmNvZGVNaXJyb3IoKS5yZW1vdmVMaW5lQ2xhc3MobGluZUhhbmRsZSwnZ3V0dGVyJyxjbGFzc05hbWUpO3RoaXMuY29kZU1pcnJvcigpLnJlbW92ZUxpbmVDbGFzcyhsaW5lSGFuZGxlLCd3cmFwJyxjbGFzc05hbWUpO319Cmhhc0xpbmVDbGFzcyhsaW5lTnVtYmVyLGNsYXNzTmFtZSl7Y29uc3QgbGluZUluZm89dGhpcy5jb2RlTWlycm9yKCkubGluZUluZm8obGluZU51bWJlcik7Y29uc3Qgd3JhcENsYXNzPWxpbmVJbmZvLndyYXBDbGFzc3x8Jyc7Y29uc3QgY2xhc3NOYW1lcz13cmFwQ2xhc3Muc3BsaXQoJyAnKTtyZXR1cm4gY2xhc3NOYW1lcy5pbmRleE9mKGNsYXNzTmFtZSkhPT0tMTt9Cl9ndXR0ZXJDbGljayhpbnN0YW5jZSxsaW5lTnVtYmVyLGd1dHRlcixldmVudCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuRXZlbnRzLkd1dHRlckNsaWNrLHtsaW5lTnVtYmVyOmxpbmVOdW1iZXIsZXZlbnQ6ZXZlbnR9KTt9Cl9jb250ZXh0TWVudShldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtldmVudC5jb25zdW1lKHRydWUpO2NvbnN0IHdyYXBwZXI9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ0NvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXInKTtjb25zdCB0YXJnZXQ9d3JhcHBlcj93cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5Db2RlTWlycm9yLWxpbmVudW1iZXInKTpudWxsO2xldCBwcm9taXNlO2lmKHRhcmdldCl7cHJvbWlzZT10aGlzLl9kZWxlZ2F0ZS5wb3B1bGF0ZUxpbmVHdXR0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSxwYXJzZUludCh0YXJnZXQudGV4dENvbnRlbnQsMTApLTEpO31lbHNle2NvbnN0IHRleHRTZWxlY3Rpb249dGhpcy5zZWxlY3Rpb24oKTtwcm9taXNlPXRoaXMuX2RlbGVnYXRlLnBvcHVsYXRlVGV4dEFyZWFDb250ZXh0TWVudShjb250ZXh0TWVudSx0ZXh0U2VsZWN0aW9uLnN0YXJ0TGluZSx0ZXh0U2VsZWN0aW9uLnN0YXJ0Q29sdW1uKTt9CnByb21pc2UudGhlbihzaG93QXN5bmMuYmluZCh0aGlzKSk7ZnVuY3Rpb24gc2hvd0FzeW5jKCl7Y29udGV4dE1lbnUuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHRoaXMpO2NvbnRleHRNZW51LnNob3coKTt9fQplZGl0UmFuZ2UocmFuZ2UsdGV4dCxvcmlnaW4pe2NvbnN0IG5ld1JhbmdlPXN1cGVyLmVkaXRSYW5nZShyYW5nZSx0ZXh0LG9yaWdpbik7aWYoQ29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JBdXRvRGV0ZWN0SW5kZW50JykuZ2V0KCkpCnRoaXMuX29uVXBkYXRlRWRpdG9ySW5kZW50YXRpb24oKTtyZXR1cm4gbmV3UmFuZ2U7fQpfb25VcGRhdGVFZGl0b3JJbmRlbnRhdGlvbigpe3RoaXMuX3NldEVkaXRvckluZGVudGF0aW9uKFRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnB1bGxMaW5lcyh0aGlzLmNvZGVNaXJyb3IoKSxTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5MaW5lc1RvU2NhbkZvckluZGVudGF0aW9uR3Vlc3NpbmcpKTt9Cl9zZXRFZGl0b3JJbmRlbnRhdGlvbihsaW5lcyl7Y29uc3QgZXh0cmFLZXlzPXt9O2xldCBpbmRlbnQ9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JJbmRlbnQnKS5nZXQoKTtpZihDb21tb24ubW9kdWxlU2V0dGluZygndGV4dEVkaXRvckF1dG9EZXRlY3RJbmRlbnQnKS5nZXQoKSkKaW5kZW50PVNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLl9ndWVzc0luZGVudGF0aW9uTGV2ZWwobGluZXMpO2lmKGluZGVudD09PVRleHRVdGlscy5UZXh0VXRpbHMuSW5kZW50LlRhYkNoYXJhY3Rlcil7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdpbmRlbnRXaXRoVGFicycsdHJ1ZSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdpbmRlbnRVbml0Jyw0KTt9ZWxzZXt0aGlzLmNvZGVNaXJyb3IoKS5zZXRPcHRpb24oJ2luZGVudFdpdGhUYWJzJyxmYWxzZSk7dGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdpbmRlbnRVbml0JyxpbmRlbnQubGVuZ3RoKTtleHRyYUtleXMuVGFiPWZ1bmN0aW9uKGNvZGVNaXJyb3Ipe2lmKGNvZGVNaXJyb3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSkKcmV0dXJuIENvZGVNaXJyb3IuUGFzcztjb25zdCBwb3M9Y29kZU1pcnJvci5nZXRDdXJzb3IoJ2hlYWQnKTtjb2RlTWlycm9yLnJlcGxhY2VSYW5nZShpbmRlbnQuc3Vic3RyaW5nKHBvcy5jaCVpbmRlbnQubGVuZ3RoKSxjb2RlTWlycm9yLmdldEN1cnNvcigpKTt9O30KdGhpcy5jb2RlTWlycm9yKCkuc2V0T3B0aW9uKCdleHRyYUtleXMnLGV4dHJhS2V5cyk7dGhpcy5faW5kZW50YXRpb25MZXZlbD1pbmRlbnQ7fQppbmRlbnQoKXtyZXR1cm4gdGhpcy5faW5kZW50YXRpb25MZXZlbDt9Cl9vbkF1dG9BcHBlbmRlZFNwYWNlcygpe3RoaXMuX2F1dG9BcHBlbmRlZFNwYWNlcz10aGlzLl9hdXRvQXBwZW5kZWRTcGFjZXN8fFtdO2ZvcihsZXQgaT0wO2k8dGhpcy5fYXV0b0FwcGVuZGVkU3BhY2VzLmxlbmd0aDsrK2kpe2NvbnN0IHBvc2l0aW9uPXRoaXMuX2F1dG9BcHBlbmRlZFNwYWNlc1tpXS5yZXNvbHZlKCk7aWYoIXBvc2l0aW9uKQpjb250aW51ZTtjb25zdCBsaW5lPXRoaXMubGluZShwb3NpdGlvbi5saW5lTnVtYmVyKTtpZihsaW5lLmxlbmd0aD09PXBvc2l0aW9uLmNvbHVtbk51bWJlciYmVGV4dFV0aWxzLlRleHRVdGlscy5saW5lSW5kZW50KGxpbmUpLmxlbmd0aD09PWxpbmUubGVuZ3RoKXt0aGlzLmNvZGVNaXJyb3IoKS5yZXBsYWNlUmFuZ2UoJycsbmV3IENvZGVNaXJyb3IuUG9zKHBvc2l0aW9uLmxpbmVOdW1iZXIsMCksbmV3IENvZGVNaXJyb3IuUG9zKHBvc2l0aW9uLmxpbmVOdW1iZXIscG9zaXRpb24uY29sdW1uTnVtYmVyKSk7fX0KdGhpcy5fYXV0b0FwcGVuZGVkU3BhY2VzPVtdO2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5zZWxlY3Rpb25zKCk7Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zW2ldO3RoaXMuX2F1dG9BcHBlbmRlZFNwYWNlcy5wdXNoKHRoaXMudGV4dEVkaXRvclBvc2l0aW9uSGFuZGxlKHNlbGVjdGlvbi5zdGFydExpbmUsc2VsZWN0aW9uLnN0YXJ0Q29sdW1uKSk7fX0KX2N1cnNvckFjdGl2aXR5KCl7aWYoIXRoaXMuX2lzU2VhcmNoQWN0aXZlKCkpCnRoaXMuY29kZU1pcnJvcigpLm9wZXJhdGlvbih0aGlzLl90b2tlbkhpZ2hsaWdodGVyLmhpZ2hsaWdodFNlbGVjdGVkVG9rZW5zLmJpbmQodGhpcy5fdG9rZW5IaWdobGlnaHRlcikpO2NvbnN0IHN0YXJ0PXRoaXMuY29kZU1pcnJvcigpLmdldEN1cnNvcignYW5jaG9yJyk7Y29uc3QgZW5kPXRoaXMuY29kZU1pcnJvcigpLmdldEN1cnNvcignaGVhZCcpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5TZWxlY3Rpb25DaGFuZ2VkLFRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnRvUmFuZ2Uoc3RhcnQsZW5kKSk7fQpfcmVwb3J0SnVtcChmcm9tLHRvKXtpZihmcm9tJiZ0byYmZnJvbS5lcXVhbCh0bykpCnJldHVybjt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuSnVtcEhhcHBlbmVkLHtmcm9tOmZyb20sdG86dG99KTt9Cl9zY3JvbGwoKXtjb25zdCB0b3Btb3N0TGluZU51bWJlcj10aGlzLmNvZGVNaXJyb3IoKS5saW5lQXRIZWlnaHQodGhpcy5jb2RlTWlycm9yKCkuZ2V0U2Nyb2xsSW5mbygpLnRvcCwnbG9jYWwnKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuU2Nyb2xsQ2hhbmdlZCx0b3Btb3N0TGluZU51bWJlcik7fQpfZm9jdXMoKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuRWRpdG9yRm9jdXNlZCk7fQpfYmx1cigpe3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5FZGl0b3JCbHVycmVkKTt9Cl9maXJlQmVmb3JlU2VsZWN0aW9uQ2hhbmdlZChjb2RlTWlycm9yLHNlbGVjdGlvbil7aWYoIXRoaXMuX2lzSGFuZGxpbmdNb3VzZURvd25FdmVudCkKcmV0dXJuO2lmKCFzZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IHByaW1hcnlTZWxlY3Rpb249c2VsZWN0aW9uLnJhbmdlc1swXTt0aGlzLl9yZXBvcnRKdW1wKHRoaXMuc2VsZWN0aW9uKCksVGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9SYW5nZShwcmltYXJ5U2VsZWN0aW9uLmFuY2hvcixwcmltYXJ5U2VsZWN0aW9uLmhlYWQpKTt9CmRpc3Bvc2UoKXtzdXBlci5kaXNwb3NlKCk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3RleHRFZGl0b3JJbmRlbnQnKS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl9vblVwZGF0ZUVkaXRvckluZGVudGF0aW9uLHRoaXMpO0NvbW1vbi5tb2R1bGVTZXR0aW5nKCd0ZXh0RWRpdG9yQXV0b0RldGVjdEluZGVudCcpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuX29uVXBkYXRlRWRpdG9ySW5kZW50YXRpb24sdGhpcyk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dXaGl0ZXNwYWNlc0luRWRpdG9yJykucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlV2hpdGVzcGFjZSx0aGlzKTt9CnNldFRleHQodGV4dCl7dGhpcy5fc2V0RWRpdG9ySW5kZW50YXRpb24odGV4dC5zcGxpdCgnXG4nKS5zbGljZSgwLFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkxpbmVzVG9TY2FuRm9ySW5kZW50YXRpb25HdWVzc2luZykpO3N1cGVyLnNldFRleHQodGV4dCk7fQpfdXBkYXRlV2hpdGVzcGFjZSgpe3RoaXMuc2V0TWltZVR5cGUodGhpcy5taW1lVHlwZSgpKTt9CnJld3JpdGVNaW1lVHlwZShtaW1lVHlwZSl7dGhpcy5fc2V0dXBXaGl0ZXNwYWNlSGlnaGxpZ2h0KCk7Y29uc3Qgd2hpdGVzcGFjZU1vZGU9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dXaGl0ZXNwYWNlc0luRWRpdG9yJykuZ2V0KCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3Nob3ctd2hpdGVzcGFjZXMnLHdoaXRlc3BhY2VNb2RlPT09J2FsbCcpO2lmKHdoaXRlc3BhY2VNb2RlPT09J2FsbCcpCnJldHVybiB0aGlzLl9hbGxXaGl0ZXNwYWNlT3ZlcmxheU1vZGUobWltZVR5cGUpO2Vsc2UgaWYod2hpdGVzcGFjZU1vZGU9PT0ndHJhaWxpbmcnKQpyZXR1cm4gdGhpcy5fdHJhaWxpbmdXaGl0ZXNwYWNlT3ZlcmxheU1vZGUobWltZVR5cGUpO3JldHVybiBtaW1lVHlwZTt9Cl9hbGxXaGl0ZXNwYWNlT3ZlcmxheU1vZGUobWltZVR5cGUpe2xldCBtb2RlTmFtZT1Db2RlTWlycm9yLm1pbWVNb2Rlc1ttaW1lVHlwZV0/KENvZGVNaXJyb3IubWltZU1vZGVzW21pbWVUeXBlXS5uYW1lfHxDb2RlTWlycm9yLm1pbWVNb2Rlc1ttaW1lVHlwZV0pOkNvZGVNaXJyb3IubWltZU1vZGVzWyd0ZXh0L3BsYWluJ107bW9kZU5hbWUrPScrYWxsLXdoaXRlc3BhY2VzJztpZihDb2RlTWlycm9yLm1vZGVzW21vZGVOYW1lXSkKcmV0dXJuIG1vZGVOYW1lO2Z1bmN0aW9uIG1vZGVDb25zdHJ1Y3Rvcihjb25maWcscGFyc2VyQ29uZmlnKXtmdW5jdGlvbiBuZXh0VG9rZW4oc3RyZWFtKXtpZihzdHJlYW0ucGVlaygpPT09JyAnKXtsZXQgc3BhY2VzPTA7d2hpbGUoc3BhY2VzPFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLk1heGltdW1OdW1iZXJPZldoaXRlc3BhY2VzUGVyU2luZ2xlU3BhbiYmc3RyZWFtLnBlZWsoKT09PScgJyl7KytzcGFjZXM7c3RyZWFtLm5leHQoKTt9CnJldHVybid3aGl0ZXNwYWNlIHdoaXRlc3BhY2UtJytzcGFjZXM7fQp3aGlsZSghc3RyZWFtLmVvbCgpJiZzdHJlYW0ucGVlaygpIT09JyAnKQpzdHJlYW0ubmV4dCgpO3JldHVybiBudWxsO30KY29uc3Qgd2hpdGVzcGFjZU1vZGU9e3Rva2VuOm5leHRUb2tlbn07cmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZyxtaW1lVHlwZSksd2hpdGVzcGFjZU1vZGUsZmFsc2UpO30KQ29kZU1pcnJvci5kZWZpbmVNb2RlKG1vZGVOYW1lLG1vZGVDb25zdHJ1Y3Rvcik7cmV0dXJuIG1vZGVOYW1lO30KX3RyYWlsaW5nV2hpdGVzcGFjZU92ZXJsYXlNb2RlKG1pbWVUeXBlKXtsZXQgbW9kZU5hbWU9Q29kZU1pcnJvci5taW1lTW9kZXNbbWltZVR5cGVdPyhDb2RlTWlycm9yLm1pbWVNb2Rlc1ttaW1lVHlwZV0ubmFtZXx8Q29kZU1pcnJvci5taW1lTW9kZXNbbWltZVR5cGVdKTpDb2RlTWlycm9yLm1pbWVNb2Rlc1sndGV4dC9wbGFpbiddO21vZGVOYW1lKz0nK3RyYWlsaW5nLXdoaXRlc3BhY2VzJztpZihDb2RlTWlycm9yLm1vZGVzW21vZGVOYW1lXSkKcmV0dXJuIG1vZGVOYW1lO2Z1bmN0aW9uIG1vZGVDb25zdHJ1Y3Rvcihjb25maWcscGFyc2VyQ29uZmlnKXtmdW5jdGlvbiBuZXh0VG9rZW4oc3RyZWFtKXtpZihzdHJlYW0ubWF0Y2goL15ccyskLyx0cnVlKSkKcmV0dXJuIHRydWU/J3RyYWlsaW5nLXdoaXRlc3BhY2UnOm51bGw7ZG8Kc3RyZWFtLm5leHQoKTt3aGlsZSghc3RyZWFtLmVvbCgpJiZzdHJlYW0ucGVlaygpIT09JyAnKTtyZXR1cm4gbnVsbDt9CmNvbnN0IHdoaXRlc3BhY2VNb2RlPXt0b2tlbjpuZXh0VG9rZW59O3JldHVybiBDb2RlTWlycm9yLm92ZXJsYXlNb2RlKENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsbWltZVR5cGUpLHdoaXRlc3BhY2VNb2RlLGZhbHNlKTt9CkNvZGVNaXJyb3IuZGVmaW5lTW9kZShtb2RlTmFtZSxtb2RlQ29uc3RydWN0b3IpO3JldHVybiBtb2RlTmFtZTt9Cl9zZXR1cFdoaXRlc3BhY2VIaWdobGlnaHQoKXtjb25zdCBkb2M9dGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7aWYoZG9jLl9jb2RlTWlycm9yV2hpdGVzcGFjZVN0eWxlSW5qZWN0ZWR8fCFDb21tb24ubW9kdWxlU2V0dGluZygnc2hvd1doaXRlc3BhY2VzSW5FZGl0b3InKS5nZXQoKSkKcmV0dXJuO2RvYy5fY29kZU1pcnJvcldoaXRlc3BhY2VTdHlsZUluamVjdGVkPXRydWU7Y29uc3QgY2xhc3NCYXNlPScuc2hvdy13aGl0ZXNwYWNlcyAuQ29kZU1pcnJvciAuY20td2hpdGVzcGFjZS0nO2NvbnN0IHNwYWNlQ2hhcj0nwrcnO2xldCBzcGFjZUNoYXJzPScnO2xldCBydWxlcz0nJztmb3IobGV0IGk9MTtpPD1Tb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5NYXhpbXVtTnVtYmVyT2ZXaGl0ZXNwYWNlc1BlclNpbmdsZVNwYW47KytpKXtzcGFjZUNoYXJzKz1zcGFjZUNoYXI7Y29uc3QgcnVsZT1jbGFzc0Jhc2UraSsnOjpiZWZvcmUgeyBjb250ZW50OiBcJycrc3BhY2VDaGFycysnXCc7fVxuJztydWxlcys9cnVsZTt9CmNvbnN0IHN0eWxlPWRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlLnRleHRDb250ZW50PXJ1bGVzO2RvYy5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTt9CmNvbmZpZ3VyZUF1dG9jb21wbGV0ZShjb25maWcpe3RoaXMuX2F1dG9jb21wbGV0ZUNvbmZpZz1jb25maWc7dGhpcy5fdXBkYXRlQXV0b2NvbXBsZXRlKCk7fQpfdXBkYXRlQXV0b2NvbXBsZXRlKCl7c3VwZXIuY29uZmlndXJlQXV0b2NvbXBsZXRlKENvbW1vbi5tb2R1bGVTZXR0aW5nKCd0ZXh0RWRpdG9yQXV0b2NvbXBsZXRpb24nKS5nZXQoKT90aGlzLl9hdXRvY29tcGxldGVDb25maWc6bnVsbCk7fX07U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuR3V0dGVyQ2xpY2tFdmVudERhdGE7U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuRXZlbnRzPXtHdXR0ZXJDbGljazpTeW1ib2woJ0d1dHRlckNsaWNrJyksU2VsZWN0aW9uQ2hhbmdlZDpTeW1ib2woJ1NlbGVjdGlvbkNoYW5nZWQnKSxTY3JvbGxDaGFuZ2VkOlN5bWJvbCgnU2Nyb2xsQ2hhbmdlZCcpLEVkaXRvckZvY3VzZWQ6U3ltYm9sKCdFZGl0b3JGb2N1c2VkJyksRWRpdG9yQmx1cnJlZDpTeW1ib2woJ0VkaXRvckJsdXJyZWQnKSxKdW1wSGFwcGVuZWQ6U3ltYm9sKCdKdW1wSGFwcGVuZWQnKX07U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3JEZWxlZ2F0ZT1mdW5jdGlvbigpe307U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3JEZWxlZ2F0ZS5wcm90b3R5cGU9e3BvcHVsYXRlTGluZUd1dHRlckNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIpe30scG9wdWxhdGVUZXh0QXJlYUNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt9LH07Q29kZU1pcnJvci5jb21tYW5kcy5zbWFydE5ld2xpbmVBbmRJbmRlbnQ9ZnVuY3Rpb24oY29kZU1pcnJvcil7Y29kZU1pcnJvci5vcGVyYXRpb24oaW5uZXJTbWFydE5ld2xpbmVBbmRJbmRlbnQuYmluZChudWxsLGNvZGVNaXJyb3IpKTtmdW5jdGlvbiBpbm5lclNtYXJ0TmV3bGluZUFuZEluZGVudChjb2RlTWlycm9yKXtjb25zdCBzZWxlY3Rpb25zPWNvZGVNaXJyb3IubGlzdFNlbGVjdGlvbnMoKTtjb25zdCByZXBsYWNlbWVudHM9W107Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zW2ldO2NvbnN0IGN1cj1Db2RlTWlycm9yLmNtcFBvcyhzZWxlY3Rpb24uaGVhZCxzZWxlY3Rpb24uYW5jaG9yKTwwP3NlbGVjdGlvbi5oZWFkOnNlbGVjdGlvbi5hbmNob3I7Y29uc3QgbGluZT1jb2RlTWlycm9yLmdldExpbmUoY3VyLmxpbmUpO2NvbnN0IGluZGVudD1UZXh0VXRpbHMuVGV4dFV0aWxzLmxpbmVJbmRlbnQobGluZSk7cmVwbGFjZW1lbnRzLnB1c2goJ1xuJytpbmRlbnQuc3Vic3RyaW5nKDAsTWF0aC5taW4oY3VyLmNoLGluZGVudC5sZW5ndGgpKSk7fQpjb2RlTWlycm9yLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50cyk7Y29kZU1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuX29uQXV0b0FwcGVuZGVkU3BhY2VzKCk7fX07Q29kZU1pcnJvci5jb21tYW5kcy5zb3VyY2VzRGlzbWlzcz1mdW5jdGlvbihjb2RlbWlycm9yKXtpZihjb2RlbWlycm9yLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoPT09MSYmY29kZW1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuX2lzU2VhcmNoQWN0aXZlKCkpCnJldHVybiBDb2RlTWlycm9yLlBhc3M7cmV0dXJuIENvZGVNaXJyb3IuY29tbWFuZHMuZGlzbWlzcyhjb2RlbWlycm9yKTt9O1NvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLl9CbG9ja0luZGVudENvbnRyb2xsZXI9e25hbWU6J2Jsb2NrSW5kZW50S2V5bWFwJyxFbnRlcjpmdW5jdGlvbihjb2RlTWlycm9yKXtsZXQgc2VsZWN0aW9ucz1jb2RlTWlycm9yLmxpc3RTZWxlY3Rpb25zKCk7Y29uc3QgcmVwbGFjZW1lbnRzPVtdO2xldCBhbGxTZWxlY3Rpb25zQXJlQ29sbGFwc2VkQmxvY2tzPWZhbHNlO2ZvcihsZXQgaT0wO2k8c2VsZWN0aW9ucy5sZW5ndGg7KytpKXtjb25zdCBzZWxlY3Rpb249c2VsZWN0aW9uc1tpXTtjb25zdCBzdGFydD1Db2RlTWlycm9yLmNtcFBvcyhzZWxlY3Rpb24uaGVhZCxzZWxlY3Rpb24uYW5jaG9yKTwwP3NlbGVjdGlvbi5oZWFkOnNlbGVjdGlvbi5hbmNob3I7Y29uc3QgbGluZT1jb2RlTWlycm9yLmdldExpbmUoc3RhcnQubGluZSk7Y29uc3QgaW5kZW50PVRleHRVdGlscy5UZXh0VXRpbHMubGluZUluZGVudChsaW5lKTtsZXQgaW5kZW50VG9JbnNlcnQ9J1xuJytpbmRlbnQrY29kZU1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuaW5kZW50KCk7bGV0IGlzQ29sbGFwc2VkQmxvY2s9ZmFsc2U7aWYoc2VsZWN0aW9uLmhlYWQuY2g9PT0wKQpyZXR1cm4gQ29kZU1pcnJvci5QYXNzO2lmKGxpbmUuc3Vic3RyKHNlbGVjdGlvbi5oZWFkLmNoLTEsMik9PT0ne30nKXtpbmRlbnRUb0luc2VydCs9J1xuJytpbmRlbnQ7aXNDb2xsYXBzZWRCbG9jaz10cnVlO31lbHNlIGlmKGxpbmUuc3Vic3RyKHNlbGVjdGlvbi5oZWFkLmNoLTEsMSkhPT0neycpe3JldHVybiBDb2RlTWlycm9yLlBhc3M7fQppZihpPjAmJmFsbFNlbGVjdGlvbnNBcmVDb2xsYXBzZWRCbG9ja3MhPT1pc0NvbGxhcHNlZEJsb2NrKQpyZXR1cm4gQ29kZU1pcnJvci5QYXNzO3JlcGxhY2VtZW50cy5wdXNoKGluZGVudFRvSW5zZXJ0KTthbGxTZWxlY3Rpb25zQXJlQ29sbGFwc2VkQmxvY2tzPWlzQ29sbGFwc2VkQmxvY2s7fQpjb2RlTWlycm9yLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50cyk7aWYoIWFsbFNlbGVjdGlvbnNBcmVDb2xsYXBzZWRCbG9ja3Mpe2NvZGVNaXJyb3IuX2NvZGVNaXJyb3JUZXh0RWRpdG9yLl9vbkF1dG9BcHBlbmRlZFNwYWNlcygpO3JldHVybjt9CnNlbGVjdGlvbnM9Y29kZU1pcnJvci5saXN0U2VsZWN0aW9ucygpO2NvbnN0IHVwZGF0ZWRTZWxlY3Rpb25zPVtdO2ZvcihsZXQgaT0wO2k8c2VsZWN0aW9ucy5sZW5ndGg7KytpKXtjb25zdCBzZWxlY3Rpb249c2VsZWN0aW9uc1tpXTtjb25zdCBsaW5lPWNvZGVNaXJyb3IuZ2V0TGluZShzZWxlY3Rpb24uaGVhZC5saW5lLTEpO2NvbnN0IHBvc2l0aW9uPW5ldyBDb2RlTWlycm9yLlBvcyhzZWxlY3Rpb24uaGVhZC5saW5lLTEsbGluZS5sZW5ndGgpO3VwZGF0ZWRTZWxlY3Rpb25zLnB1c2goe2hlYWQ6cG9zaXRpb24sYW5jaG9yOnBvc2l0aW9ufSk7fQpjb2RlTWlycm9yLnNldFNlbGVjdGlvbnModXBkYXRlZFNlbGVjdGlvbnMpO2NvZGVNaXJyb3IuX2NvZGVNaXJyb3JUZXh0RWRpdG9yLl9vbkF1dG9BcHBlbmRlZFNwYWNlcygpO30sJ1wnfVwnJzpmdW5jdGlvbihjb2RlTWlycm9yKXtpZihjb2RlTWlycm9yLnNvbWV0aGluZ1NlbGVjdGVkKCkpCnJldHVybiBDb2RlTWlycm9yLlBhc3M7bGV0IHNlbGVjdGlvbnM9Y29kZU1pcnJvci5saXN0U2VsZWN0aW9ucygpO2xldCByZXBsYWNlbWVudHM9W107Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zW2ldO2NvbnN0IGxpbmU9Y29kZU1pcnJvci5nZXRMaW5lKHNlbGVjdGlvbi5oZWFkLmxpbmUpO2lmKGxpbmUhPT1UZXh0VXRpbHMuVGV4dFV0aWxzLmxpbmVJbmRlbnQobGluZSkpCnJldHVybiBDb2RlTWlycm9yLlBhc3M7cmVwbGFjZW1lbnRzLnB1c2goJ30nKTt9CmNvZGVNaXJyb3IucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTtzZWxlY3Rpb25zPWNvZGVNaXJyb3IubGlzdFNlbGVjdGlvbnMoKTtyZXBsYWNlbWVudHM9W107Y29uc3QgdXBkYXRlZFNlbGVjdGlvbnM9W107Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zW2ldO2NvbnN0IG1hdGNoaW5nQnJhY2tldD1jb2RlTWlycm9yLmZpbmRNYXRjaGluZ0JyYWNrZXQoc2VsZWN0aW9uLmhlYWQpO2lmKCFtYXRjaGluZ0JyYWNrZXR8fCFtYXRjaGluZ0JyYWNrZXQubWF0Y2gpCnJldHVybjt1cGRhdGVkU2VsZWN0aW9ucy5wdXNoKHtoZWFkOnNlbGVjdGlvbi5oZWFkLGFuY2hvcjpuZXcgQ29kZU1pcnJvci5Qb3Moc2VsZWN0aW9uLmhlYWQubGluZSwwKX0pO2NvbnN0IGxpbmU9Y29kZU1pcnJvci5nZXRMaW5lKG1hdGNoaW5nQnJhY2tldC50by5saW5lKTtjb25zdCBpbmRlbnQ9VGV4dFV0aWxzLlRleHRVdGlscy5saW5lSW5kZW50KGxpbmUpO3JlcGxhY2VtZW50cy5wdXNoKGluZGVudCsnfScpO30KY29kZU1pcnJvci5zZXRTZWxlY3Rpb25zKHVwZGF0ZWRTZWxlY3Rpb25zKTtjb2RlTWlycm9yLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50cyk7fX07U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuVG9rZW5IaWdobGlnaHRlcj1jbGFzc3tjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLGNvZGVNaXJyb3Ipe3RoaXMuX3RleHRFZGl0b3I9dGV4dEVkaXRvcjt0aGlzLl9jb2RlTWlycm9yPWNvZGVNaXJyb3I7fQpoaWdobGlnaHRTZWFyY2hSZXN1bHRzKHJlZ2V4LHJhbmdlKXtjb25zdCBvbGRSZWdleD10aGlzLl9oaWdobGlnaHRSZWdleDt0aGlzLl9oaWdobGlnaHRSZWdleD1yZWdleDt0aGlzLl9oaWdobGlnaHRSYW5nZT1yYW5nZTtpZih0aGlzLl9zZWFyY2hSZXN1bHRNYXJrZXIpe3RoaXMuX3NlYXJjaFJlc3VsdE1hcmtlci5jbGVhcigpO2RlbGV0ZSB0aGlzLl9zZWFyY2hSZXN1bHRNYXJrZXI7fQppZih0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yJiZ0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yLnNlbGVjdGlvblN0YXJ0KQp0aGlzLl9jb2RlTWlycm9yLnJlbW92ZUxpbmVDbGFzcyh0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yLnNlbGVjdGlvblN0YXJ0LmxpbmUsJ3dyYXAnLCdjbS1saW5lLXdpdGgtc2VsZWN0aW9uJyk7Y29uc3Qgc2VsZWN0aW9uU3RhcnQ9dGhpcy5faGlnaGxpZ2h0UmFuZ2U/bmV3IENvZGVNaXJyb3IuUG9zKHRoaXMuX2hpZ2hsaWdodFJhbmdlLnN0YXJ0TGluZSx0aGlzLl9oaWdobGlnaHRSYW5nZS5zdGFydENvbHVtbik6bnVsbDtpZihzZWxlY3Rpb25TdGFydCkKdGhpcy5fY29kZU1pcnJvci5hZGRMaW5lQ2xhc3Moc2VsZWN0aW9uU3RhcnQubGluZSwnd3JhcCcsJ2NtLWxpbmUtd2l0aC1zZWxlY3Rpb24nKTtpZihvbGRSZWdleCYmdGhpcy5faGlnaGxpZ2h0UmVnZXgudG9TdHJpbmcoKT09PW9sZFJlZ2V4LnRvU3RyaW5nKCkpe2lmKHRoaXMuX2hpZ2hsaWdodERlc2NyaXB0b3IpCnRoaXMuX2hpZ2hsaWdodERlc2NyaXB0b3Iuc2VsZWN0aW9uU3RhcnQ9c2VsZWN0aW9uU3RhcnQ7fWVsc2V7dGhpcy5fcmVtb3ZlSGlnaGxpZ2h0KCk7dGhpcy5fc2V0SGlnaGxpZ2h0ZXIodGhpcy5fc2VhcmNoSGlnaGxpZ2h0ZXIuYmluZCh0aGlzLHRoaXMuX2hpZ2hsaWdodFJlZ2V4KSxzZWxlY3Rpb25TdGFydCk7fQppZih0aGlzLl9oaWdobGlnaHRSYW5nZSl7Y29uc3QgcG9zPVRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnRvUG9zKHRoaXMuX2hpZ2hsaWdodFJhbmdlKTt0aGlzLl9zZWFyY2hSZXN1bHRNYXJrZXI9dGhpcy5fY29kZU1pcnJvci5tYXJrVGV4dChwb3Muc3RhcnQscG9zLmVuZCx7Y2xhc3NOYW1lOidjbS1jb2x1bW4td2l0aC1zZWxlY3Rpb24nfSk7fX0KaGlnaGxpZ2h0ZWRSZWdleCgpe3JldHVybiB0aGlzLl9oaWdobGlnaHRSZWdleDt9CmhpZ2hsaWdodFNlbGVjdGVkVG9rZW5zKCl7ZGVsZXRlIHRoaXMuX2hpZ2hsaWdodFJlZ2V4O2RlbGV0ZSB0aGlzLl9oaWdobGlnaHRSYW5nZTtpZih0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yJiZ0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yLnNlbGVjdGlvblN0YXJ0KQp0aGlzLl9jb2RlTWlycm9yLnJlbW92ZUxpbmVDbGFzcyh0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yLnNlbGVjdGlvblN0YXJ0LmxpbmUsJ3dyYXAnLCdjbS1saW5lLXdpdGgtc2VsZWN0aW9uJyk7dGhpcy5fcmVtb3ZlSGlnaGxpZ2h0KCk7Y29uc3Qgc2VsZWN0aW9uU3RhcnQ9dGhpcy5fY29kZU1pcnJvci5nZXRDdXJzb3IoJ3N0YXJ0Jyk7Y29uc3Qgc2VsZWN0aW9uRW5kPXRoaXMuX2NvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdlbmQnKTtpZihzZWxlY3Rpb25TdGFydC5saW5lIT09c2VsZWN0aW9uRW5kLmxpbmUpCnJldHVybjtpZihzZWxlY3Rpb25TdGFydC5jaD09PXNlbGVjdGlvbkVuZC5jaCkKcmV0dXJuO2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5fY29kZU1pcnJvci5nZXRTZWxlY3Rpb25zKCk7aWYoc2VsZWN0aW9ucy5sZW5ndGg+MSkKcmV0dXJuO2NvbnN0IHNlbGVjdGVkVGV4dD1zZWxlY3Rpb25zWzBdO2lmKHRoaXMuX2lzV29yZChzZWxlY3RlZFRleHQsc2VsZWN0aW9uU3RhcnQubGluZSxzZWxlY3Rpb25TdGFydC5jaCxzZWxlY3Rpb25FbmQuY2gpKXtpZihzZWxlY3Rpb25TdGFydCkKdGhpcy5fY29kZU1pcnJvci5hZGRMaW5lQ2xhc3Moc2VsZWN0aW9uU3RhcnQubGluZSwnd3JhcCcsJ2NtLWxpbmUtd2l0aC1zZWxlY3Rpb24nKTt0aGlzLl9zZXRIaWdobGlnaHRlcih0aGlzLl90b2tlbkhpZ2hsaWdodGVyLmJpbmQodGhpcyxzZWxlY3RlZFRleHQsc2VsZWN0aW9uU3RhcnQpLHNlbGVjdGlvblN0YXJ0KTt9fQpfaXNXb3JkKHNlbGVjdGVkVGV4dCxsaW5lTnVtYmVyLHN0YXJ0Q29sdW1uLGVuZENvbHVtbil7Y29uc3QgbGluZT10aGlzLl9jb2RlTWlycm9yLmdldExpbmUobGluZU51bWJlcik7Y29uc3QgbGVmdEJvdW5kPXN0YXJ0Q29sdW1uPT09MHx8IVRleHRVdGlscy5UZXh0VXRpbHMuaXNXb3JkQ2hhcihsaW5lLmNoYXJBdChzdGFydENvbHVtbi0xKSk7Y29uc3QgcmlnaHRCb3VuZD1lbmRDb2x1bW49PT1saW5lLmxlbmd0aHx8IVRleHRVdGlscy5UZXh0VXRpbHMuaXNXb3JkQ2hhcihsaW5lLmNoYXJBdChlbmRDb2x1bW4pKTtyZXR1cm4gbGVmdEJvdW5kJiZyaWdodEJvdW5kJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZChzZWxlY3RlZFRleHQpO30KX3JlbW92ZUhpZ2hsaWdodCgpe2lmKHRoaXMuX2hpZ2hsaWdodERlc2NyaXB0b3Ipe3RoaXMuX2NvZGVNaXJyb3IucmVtb3ZlT3ZlcmxheSh0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yLm92ZXJsYXkpO2RlbGV0ZSB0aGlzLl9oaWdobGlnaHREZXNjcmlwdG9yO319Cl9zZWFyY2hIaWdobGlnaHRlcihyZWdleCxzdHJlYW0pe2lmKHN0cmVhbS5jb2x1bW4oKT09PTApCmRlbGV0ZSB0aGlzLl9zZWFyY2hNYXRjaExlbmd0aDtpZih0aGlzLl9zZWFyY2hNYXRjaExlbmd0aCl7aWYodGhpcy5fc2VhcmNoTWF0Y2hMZW5ndGg+Mil7Zm9yKGxldCBpPTA7aTx0aGlzLl9zZWFyY2hNYXRjaExlbmd0aC0yOysraSkKc3RyZWFtLm5leHQoKTt0aGlzLl9zZWFyY2hNYXRjaExlbmd0aD0xO3JldHVybidzZWFyY2gtaGlnaGxpZ2h0Jzt9ZWxzZXtzdHJlYW0ubmV4dCgpO2RlbGV0ZSB0aGlzLl9zZWFyY2hNYXRjaExlbmd0aDtyZXR1cm4nc2VhcmNoLWhpZ2hsaWdodCBzZWFyY2gtaGlnaGxpZ2h0LWVuZCc7fX0KY29uc3QgbWF0Y2g9c3RyZWFtLm1hdGNoKHJlZ2V4LGZhbHNlKTtpZihtYXRjaCl7c3RyZWFtLm5leHQoKTtjb25zdCBtYXRjaExlbmd0aD1tYXRjaFswXS5sZW5ndGg7aWYobWF0Y2hMZW5ndGg9PT0xKQpyZXR1cm4nc2VhcmNoLWhpZ2hsaWdodCBzZWFyY2gtaGlnaGxpZ2h0LWZ1bGwnO3RoaXMuX3NlYXJjaE1hdGNoTGVuZ3RoPW1hdGNoTGVuZ3RoO3JldHVybidzZWFyY2gtaGlnaGxpZ2h0IHNlYXJjaC1oaWdobGlnaHQtc3RhcnQnO30Kd2hpbGUoIXN0cmVhbS5tYXRjaChyZWdleCxmYWxzZSkmJnN0cmVhbS5uZXh0KCkpe319Cl90b2tlbkhpZ2hsaWdodGVyKHRva2VuLHNlbGVjdGlvblN0YXJ0LHN0cmVhbSl7Y29uc3QgdG9rZW5GaXJzdENoYXI9dG9rZW4uY2hhckF0KDApO2lmKHN0cmVhbS5tYXRjaCh0b2tlbikmJihzdHJlYW0uZW9sKCl8fCFUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIoc3RyZWFtLnBlZWsoKSkpKQpyZXR1cm4gc3RyZWFtLmNvbHVtbigpPT09c2VsZWN0aW9uU3RhcnQuY2g/J3Rva2VuLWhpZ2hsaWdodCBjb2x1bW4td2l0aC1zZWxlY3Rpb24nOid0b2tlbi1oaWdobGlnaHQnO2xldCBlYXRlbkNoYXI7ZG8KZWF0ZW5DaGFyPXN0cmVhbS5uZXh0KCk7d2hpbGUoZWF0ZW5DaGFyJiYoVGV4dFV0aWxzLlRleHRVdGlscy5pc1dvcmRDaGFyKGVhdGVuQ2hhcil8fHN0cmVhbS5wZWVrKCkhPT10b2tlbkZpcnN0Q2hhcikpO30KX3NldEhpZ2hsaWdodGVyKGhpZ2hsaWdodGVyLHNlbGVjdGlvblN0YXJ0KXtjb25zdCBvdmVybGF5TW9kZT17dG9rZW46aGlnaGxpZ2h0ZXJ9O3RoaXMuX2NvZGVNaXJyb3IuYWRkT3ZlcmxheShvdmVybGF5TW9kZSk7dGhpcy5faGlnaGxpZ2h0RGVzY3JpcHRvcj17b3ZlcmxheTpvdmVybGF5TW9kZSxzZWxlY3Rpb25TdGFydDpzZWxlY3Rpb25TdGFydH07fX07U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuTGluZXNUb1NjYW5Gb3JJbmRlbnRhdGlvbkd1ZXNzaW5nPTEwMDA7U291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuTWF4aW11bU51bWJlck9mV2hpdGVzcGFjZXNQZXJTaW5nbGVTcGFuPTE2OztTb3VyY2VGcmFtZS5Gb250Vmlldz1jbGFzcyBleHRlbmRzIFVJLlNpbXBsZVZpZXd7Y29uc3RydWN0b3IobWltZVR5cGUsY29udGVudFByb3ZpZGVyKXtzdXBlcihDb21tb24uVUlTdHJpbmcoJ0ZvbnQnKSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzb3VyY2VfZnJhbWUvZm9udFZpZXcuY3NzJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZvbnQtdmlldycpO3RoaXMuX3VybD1jb250ZW50UHJvdmlkZXIuY29udGVudFVSTCgpO3RoaXMuX21pbWVUeXBlPW1pbWVUeXBlO3RoaXMuX2NvbnRlbnRQcm92aWRlcj1jb250ZW50UHJvdmlkZXI7dGhpcy5fbWltZVR5cGVMYWJlbD1uZXcgVUkuVG9vbGJhclRleHQobWltZVR5cGUpO30Kc3luY1Rvb2xiYXJJdGVtcygpe3JldHVyblt0aGlzLl9taW1lVHlwZUxhYmVsXTt9Cl9vbkZvbnRDb250ZW50TG9hZGVkKHVuaXF1ZUZvbnROYW1lLGNvbnRlbnQpe2NvbnN0IHVybD1jb250ZW50P0NvbW1vbi5Db250ZW50UHJvdmlkZXIuY29udGVudEFzRGF0YVVSTChjb250ZW50LHRoaXMuX21pbWVUeXBlLHRydWUpOnRoaXMuX3VybDt0aGlzLmZvbnRTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQ9U3RyaW5nLnNwcmludGYoJ0Bmb250LWZhY2UgeyBmb250LWZhbWlseTogIiVzIjsgc3JjOiB1cmwoJXMpOyB9Jyx1bmlxdWVGb250TmFtZSx1cmwpO30KX2NyZWF0ZUNvbnRlbnRJZk5lZWRlZCgpe2lmKHRoaXMuZm9udFByZXZpZXdFbGVtZW50KQpyZXR1cm47Y29uc3QgdW5pcXVlRm9udE5hbWU9J1dlYkluc3BlY3RvckZvbnRQcmV2aWV3JysoKytTb3VyY2VGcmFtZS5Gb250Vmlldy5fZm9udElkKTt0aGlzLmZvbnRTdHlsZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3R5bGUnKTt0aGlzLl9jb250ZW50UHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKS50aGVuKHRoaXMuX29uRm9udENvbnRlbnRMb2FkZWQuYmluZCh0aGlzLHVuaXF1ZUZvbnROYW1lKSk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZm9udFN0eWxlRWxlbWVudCk7Y29uc3QgZm9udFByZXZpZXc9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Zm9yKGxldCBpPTA7aTxTb3VyY2VGcmFtZS5Gb250Vmlldy5fZm9udFByZXZpZXdMaW5lcy5sZW5ndGg7KytpKXtpZihpPjApCmZvbnRQcmV2aWV3LmNyZWF0ZUNoaWxkKCdicicpO2ZvbnRQcmV2aWV3LmNyZWF0ZVRleHRDaGlsZChTb3VyY2VGcmFtZS5Gb250Vmlldy5fZm9udFByZXZpZXdMaW5lc1tpXSk7fQp0aGlzLmZvbnRQcmV2aWV3RWxlbWVudD1mb250UHJldmlldy5jbG9uZU5vZGUodHJ1ZSk7dGhpcy5mb250UHJldmlld0VsZW1lbnQuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbic7dGhpcy5mb250UHJldmlld0VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2ZvbnQtZmFtaWx5Jyx1bmlxdWVGb250TmFtZSk7dGhpcy5mb250UHJldmlld0VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTt0aGlzLl9kdW1teUVsZW1lbnQ9Zm9udFByZXZpZXc7dGhpcy5fZHVtbXlFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk9J2hpZGRlbic7dGhpcy5fZHVtbXlFbGVtZW50LnN0eWxlLnpJbmRleD0nLTEnO3RoaXMuX2R1bW15RWxlbWVudC5zdHlsZS5kaXNwbGF5PSdpbmxpbmUnO3RoaXMuX2R1bW15RWxlbWVudC5zdHlsZS5wb3NpdGlvbj0nYWJzb2x1dGUnO3RoaXMuX2R1bW15RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZm9udC1mYW1pbHknLHVuaXF1ZUZvbnROYW1lKTt0aGlzLl9kdW1teUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2ZvbnQtc2l6ZScsU291cmNlRnJhbWUuRm9udFZpZXcuX21lYXN1cmVGb250U2l6ZSsncHgnKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mb250UHJldmlld0VsZW1lbnQpO30Kd2FzU2hvd24oKXt0aGlzLl9jcmVhdGVDb250ZW50SWZOZWVkZWQoKTt0aGlzLnVwZGF0ZUZvbnRQcmV2aWV3U2l6ZSgpO30Kb25SZXNpemUoKXtpZih0aGlzLl9pblJlc2l6ZSkKcmV0dXJuO3RoaXMuX2luUmVzaXplPXRydWU7dHJ5e3RoaXMudXBkYXRlRm9udFByZXZpZXdTaXplKCk7fWZpbmFsbHl7ZGVsZXRlIHRoaXMuX2luUmVzaXplO319Cl9tZWFzdXJlRWxlbWVudCgpe3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kdW1teUVsZW1lbnQpO2NvbnN0IHJlc3VsdD17d2lkdGg6dGhpcy5fZHVtbXlFbGVtZW50Lm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLl9kdW1teUVsZW1lbnQub2Zmc2V0SGVpZ2h0fTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZHVtbXlFbGVtZW50KTtyZXR1cm4gcmVzdWx0O30KdXBkYXRlRm9udFByZXZpZXdTaXplKCl7aWYoIXRoaXMuZm9udFByZXZpZXdFbGVtZW50fHwhdGhpcy5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuZm9udFByZXZpZXdFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd2aXNpYmlsaXR5Jyk7Y29uc3QgZGltZW5zaW9uPXRoaXMuX21lYXN1cmVFbGVtZW50KCk7Y29uc3QgaGVpZ2h0PWRpbWVuc2lvbi5oZWlnaHQ7Y29uc3Qgd2lkdGg9ZGltZW5zaW9uLndpZHRoO2NvbnN0IGNvbnRhaW5lcldpZHRoPXRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aC01MDtjb25zdCBjb250YWluZXJIZWlnaHQ9dGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodC0zMDtpZighaGVpZ2h0fHwhd2lkdGh8fCFjb250YWluZXJXaWR0aHx8IWNvbnRhaW5lckhlaWdodCl7dGhpcy5mb250UHJldmlld0VsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2ZvbnQtc2l6ZScpO3JldHVybjt9CmNvbnN0IHdpZHRoUmF0aW89Y29udGFpbmVyV2lkdGgvd2lkdGg7Y29uc3QgaGVpZ2h0UmF0aW89Y29udGFpbmVySGVpZ2h0L2hlaWdodDtjb25zdCBmaW5hbEZvbnRTaXplPU1hdGguZmxvb3IoU291cmNlRnJhbWUuRm9udFZpZXcuX21lYXN1cmVGb250U2l6ZSpNYXRoLm1pbih3aWR0aFJhdGlvLGhlaWdodFJhdGlvKSktMjt0aGlzLmZvbnRQcmV2aWV3RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZm9udC1zaXplJyxmaW5hbEZvbnRTaXplKydweCcsbnVsbCk7fX07U291cmNlRnJhbWUuRm9udFZpZXcuX2ZvbnRQcmV2aWV3TGluZXM9WydBQkNERUZHSElKS0xNJywnTk9QUVJTVFVWV1hZWicsJ2FiY2RlZmdoaWprbG0nLCdub3BxcnN0dXZ3eHl6JywnMTIzNDU2Nzg5MCddO1NvdXJjZUZyYW1lLkZvbnRWaWV3Ll9mb250SWQ9MDtTb3VyY2VGcmFtZS5Gb250Vmlldy5fbWVhc3VyZUZvbnRTaXplPTUwOztTb3VyY2VGcmFtZS5JbWFnZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5TaW1wbGVWaWV3e2NvbnN0cnVjdG9yKG1pbWVUeXBlLGNvbnRlbnRQcm92aWRlcil7c3VwZXIoQ29tbW9uLlVJU3RyaW5nKCdJbWFnZScpKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZV9mcmFtZS9pbWFnZVZpZXcuY3NzJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ltYWdlLXZpZXcnKTt0aGlzLl91cmw9Y29udGVudFByb3ZpZGVyLmNvbnRlbnRVUkwoKTt0aGlzLl9wYXJzZWRVUkw9bmV3IENvbW1vbi5QYXJzZWRVUkwodGhpcy5fdXJsKTt0aGlzLl9taW1lVHlwZT1taW1lVHlwZTt0aGlzLl9jb250ZW50UHJvdmlkZXI9Y29udGVudFByb3ZpZGVyO3RoaXMuX3VpU291cmNlQ29kZT1jb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlPyhjb250ZW50UHJvdmlkZXIpOm51bGw7aWYodGhpcy5fdWlTb3VyY2VDb2RlKXt0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl93b3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTtuZXcgVUkuRHJvcFRhcmdldCh0aGlzLmVsZW1lbnQsW1VJLkRyb3BUYXJnZXQuVHlwZS5JbWFnZUZpbGUsVUkuRHJvcFRhcmdldC5UeXBlLlVSSV0sQ29tbW9uLlVJU3RyaW5nKCdEcm9wIGltYWdlIGZpbGUgaGVyZScpLHRoaXMuX2hhbmRsZURyb3AuYmluZCh0aGlzKSk7fQp0aGlzLl9zaXplTGFiZWw9bmV3IFVJLlRvb2xiYXJUZXh0KCk7dGhpcy5fZGltZW5zaW9uc0xhYmVsPW5ldyBVSS5Ub29sYmFyVGV4dCgpO3RoaXMuX21pbWVUeXBlTGFiZWw9bmV3IFVJLlRvb2xiYXJUZXh0KG1pbWVUeXBlKTt0aGlzLl9jb250YWluZXI9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdpbWFnZScpO3RoaXMuX2ltYWdlUHJldmlld0VsZW1lbnQ9dGhpcy5fY29udGFpbmVyLmNyZWF0ZUNoaWxkKCdpbWcnLCdyZXNvdXJjZS1pbWFnZS12aWV3Jyk7dGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSx0cnVlKTt9CnN5bmNUb29sYmFySXRlbXMoKXtyZXR1cm5bdGhpcy5fc2l6ZUxhYmVsLG5ldyBVSS5Ub29sYmFyU2VwYXJhdG9yKCksdGhpcy5fZGltZW5zaW9uc0xhYmVsLG5ldyBVSS5Ub29sYmFyU2VwYXJhdG9yKCksdGhpcy5fbWltZVR5cGVMYWJlbF07fQp3YXNTaG93bigpe3RoaXMuX3VwZGF0ZUNvbnRlbnRJZk5lZWRlZCgpO30KZGlzcG9zZVZpZXcoKXtpZih0aGlzLl91aVNvdXJjZUNvZGUpe3RoaXMuX3VpU291cmNlQ29kZS5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX3dvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMpO319Cl93b3JraW5nQ29weUNvbW1pdHRlZCgpe3RoaXMuX3VwZGF0ZUNvbnRlbnRJZk5lZWRlZCgpO30KYXN5bmMgX3VwZGF0ZUNvbnRlbnRJZk5lZWRlZCgpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgdGhpcy5fY29udGVudFByb3ZpZGVyLnJlcXVlc3RDb250ZW50KCk7aWYodGhpcy5fY2FjaGVkQ29udGVudD09PWNvbnRlbnQpCnJldHVybjtjb25zdCBjb250ZW50RW5jb2RlZD1hd2FpdCB0aGlzLl9jb250ZW50UHJvdmlkZXIuY29udGVudEVuY29kZWQoKTt0aGlzLl9jYWNoZWRDb250ZW50PWNvbnRlbnQ7bGV0IGltYWdlU3JjPSdkYXRhOicrdGhpcy5fbWltZVR5cGUrKGNvbnRlbnRFbmNvZGVkPyc7YmFzZTY0LCc6JywnKStjb250ZW50O2lmKGNvbnRlbnQ9PT1udWxsKQppbWFnZVNyYz10aGlzLl91cmw7Y29uc3QgbG9hZFByb21pc2U9bmV3IFByb21pc2UoeD0+dGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5vbmxvYWQ9eCk7dGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5zcmM9aW1hZ2VTcmM7dGhpcy5fc2l6ZUxhYmVsLnNldFRleHQoTnVtYmVyLmJ5dGVzVG9TdHJpbmcodGhpcy5fYmFzZTY0VG9TaXplKGNvbnRlbnQpKSk7YXdhaXQgbG9hZFByb21pc2U7dGhpcy5fZGltZW5zaW9uc0xhYmVsLnNldFRleHQoQ29tbW9uLlVJU3RyaW5nKCclZCDDlyAlZCcsdGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5uYXR1cmFsV2lkdGgsdGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5uYXR1cmFsSGVpZ2h0KSk7fQpfYmFzZTY0VG9TaXplKGNvbnRlbnQpe2lmKCFjb250ZW50fHwhY29udGVudC5sZW5ndGgpCnJldHVybiAwO2xldCBzaXplPShjb250ZW50Lmxlbmd0aHx8MCkqMy80O2lmKGNvbnRlbnQubGVuZ3RoPjAmJmNvbnRlbnRbY29udGVudC5sZW5ndGgtMV09PT0nPScpCnNpemUtLTtpZihjb250ZW50Lmxlbmd0aD4xJiZjb250ZW50W2NvbnRlbnQubGVuZ3RoLTJdPT09Jz0nKQpzaXplLS07cmV0dXJuIHNpemU7fQpfY29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7aWYoIXRoaXMuX3BhcnNlZFVSTC5pc0RhdGFVUkwoKSkKY29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGltYWdlIFVSTCcpLHRoaXMuX2NvcHlJbWFnZVVSTC5iaW5kKHRoaXMpKTtpZih0aGlzLl9pbWFnZVByZXZpZXdFbGVtZW50LnNyYyl7Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdDb3B5IGltYWdlIGFzIGRhdGEgVVJJJyksdGhpcy5fY29weUltYWdlQXNEYXRhVVJMLmJpbmQodGhpcykpO30KY29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdPcGVuIGltYWdlIGluIG5ldyB0YWInKSx0aGlzLl9vcGVuSW5OZXdUYWIuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuY2xpcGJvYXJkU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTYXZlXHUyMDI2JyksdGhpcy5fc2F2ZUltYWdlLmJpbmQodGhpcykpO2NvbnRleHRNZW51LnNob3coKTt9Cl9jb3B5SW1hZ2VBc0RhdGFVUkwoKXtJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQodGhpcy5faW1hZ2VQcmV2aWV3RWxlbWVudC5zcmMpO30KX2NvcHlJbWFnZVVSTCgpe0luc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dCh0aGlzLl91cmwpO30KX3NhdmVJbWFnZSgpe2NvbnN0IGxpbms9Y3JlYXRlRWxlbWVudCgnYScpO2xpbmsuZG93bmxvYWQ9dGhpcy5fcGFyc2VkVVJMLmRpc3BsYXlOYW1lO2xpbmsuaHJlZj10aGlzLl91cmw7bGluay5jbGljaygpO30KX29wZW5Jbk5ld1RhYigpe0luc3BlY3RvckZyb250ZW5kSG9zdC5vcGVuSW5OZXdUYWIodGhpcy5fdXJsKTt9CmFzeW5jIF9oYW5kbGVEcm9wKGRhdGFUcmFuc2Zlcil7Y29uc3QgaXRlbXM9ZGF0YVRyYW5zZmVyLml0ZW1zO2lmKCFpdGVtcy5sZW5ndGh8fGl0ZW1zWzBdLmtpbmQhPT0nZmlsZScpCnJldHVybjtjb25zdCBlbnRyeT1pdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5KCk7Y29uc3QgZW5jb2RlZD0hZW50cnkubmFtZS5lbmRzV2l0aCgnLnN2ZycpO2VudHJ5LmZpbGUoZmlsZT0+e2NvbnN0IHJlYWRlcj1uZXcgRmlsZVJlYWRlcigpO3JlYWRlci5vbmxvYWRlbmQ9KCk9PntsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9KHJlYWRlci5yZXN1bHQpO31jYXRjaChlKXtyZXN1bHQ9bnVsbDtjb25zb2xlLmVycm9yKCdDYW5cJ3QgcmVhZCBmaWxlOiAnK2UpO30KaWYodHlwZW9mIHJlc3VsdCE9PSdzdHJpbmcnKQpyZXR1cm47dGhpcy5fdWlTb3VyY2VDb2RlLnNldENvbnRlbnQoZW5jb2RlZD9idG9hKHJlc3VsdCk6cmVzdWx0LGVuY29kZWQpO307aWYoZW5jb2RlZCkKcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtlbHNlCnJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO30pO319OztTb3VyY2VGcmFtZS5Tb3VyY2VGcmFtZT1jbGFzcyBleHRlbmRzIFVJLlNpbXBsZVZpZXd7Y29uc3RydWN0b3IobGF6eUNvbnRlbnQpe3N1cGVyKENvbW1vbi5VSVN0cmluZygnU291cmNlJykpO3RoaXMuX2xhenlDb250ZW50PWxhenlDb250ZW50O3RoaXMuX3ByZXR0eT1mYWxzZTt0aGlzLl9yYXdDb250ZW50PW51bGw7dGhpcy5fZm9ybWF0dGVkQ29udGVudFByb21pc2U9bnVsbDt0aGlzLl9mb3JtYXR0ZWRNYXA9bnVsbDt0aGlzLl9wcmV0dHlUb2dnbGU9bmV3IFVJLlRvb2xiYXJUb2dnbGUobHNgUHJldHR5IHByaW50YCwnbGFyZ2VpY29uLXByZXR0eS1wcmludCcpO3RoaXMuX3ByZXR0eVRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT57dGhpcy5fc2V0UHJldHR5KCF0aGlzLl9wcmV0dHlUb2dnbGUudG9nZ2xlZCgpKTt9KTt0aGlzLl9zaG91bGRBdXRvUHJldHR5UHJpbnQ9ZmFsc2U7dGhpcy5fcHJldHR5VG9nZ2xlLnNldFZpc2libGUoZmFsc2UpO3RoaXMuX3RleHRFZGl0b3I9bmV3IFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yKHRoaXMpO3RoaXMuX3RleHRFZGl0b3Iuc2hvdyh0aGlzLmVsZW1lbnQpO3RoaXMuX3ByZXR0eUNsZWFuR2VuZXJhdGlvbj1udWxsO3RoaXMuX2NsZWFuR2VuZXJhdGlvbj0wO3RoaXMuX3NlYXJjaENvbmZpZz1udWxsO3RoaXMuX2RlbGF5ZWRGaW5kU2VhcmNoTWF0Y2hlcz1udWxsO3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0tMTt0aGlzLl9zZWFyY2hSZXN1bHRzPVtdO3RoaXMuX3NlYXJjaFJlZ2V4PW51bGw7dGhpcy5fdGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5FZGl0b3JGb2N1c2VkLHRoaXMuX3Jlc2V0Q3VycmVudFNlYXJjaFJlc3VsdEluZGV4LHRoaXMpO3RoaXMuX3RleHRFZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuU2VsZWN0aW9uQ2hhbmdlZCx0aGlzLl91cGRhdGVTb3VyY2VQb3NpdGlvbix0aGlzKTt0aGlzLl90ZXh0RWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGV4dEVkaXRvci5FdmVudHMuVGV4dENoYW5nZWQsZXZlbnQ9PntpZighdGhpcy5fbXV0ZUNoYW5nZUV2ZW50c0ZvclNldENvbnRlbnQpCnRoaXMub25UZXh0Q2hhbmdlZChldmVudC5kYXRhLm9sZFJhbmdlLGV2ZW50LmRhdGEubmV3UmFuZ2UpO30pO3RoaXMuX211dGVDaGFuZ2VFdmVudHNGb3JTZXRDb250ZW50PWZhbHNlO3RoaXMuX3NvdXJjZVBvc2l0aW9uPW5ldyBVSS5Ub29sYmFyVGV4dCgpO3RoaXMuX3NlYXJjaGFibGVWaWV3PW51bGw7dGhpcy5fZWRpdGFibGU9ZmFsc2U7dGhpcy5fdGV4dEVkaXRvci5zZXRSZWFkT25seSh0cnVlKTt0aGlzLl9wb3NpdGlvblRvUmV2ZWFsPW51bGw7dGhpcy5fbGluZVRvU2Nyb2xsVG89bnVsbDt0aGlzLl9zZWxlY3Rpb25Ub1NldD1udWxsO3RoaXMuX2xvYWRlZD1mYWxzZTt0aGlzLl9jb250ZW50UmVxdWVzdGVkPWZhbHNlO3RoaXMuX2hpZ2hsaWdodGVyVHlwZT0nJzt0aGlzLl90cmFuc2Zvcm1lcj17ZWRpdG9yVG9SYXdMb2NhdGlvbjooZWRpdG9yTGluZU51bWJlcixlZGl0b3JDb2x1bW5OdW1iZXI9MCk9PntpZighdGhpcy5fcHJldHR5KQpyZXR1cm5bZWRpdG9yTGluZU51bWJlcixlZGl0b3JDb2x1bW5OdW1iZXJdO3JldHVybiB0aGlzLl9wcmV0dHlUb1Jhd0xvY2F0aW9uKGVkaXRvckxpbmVOdW1iZXIsZWRpdG9yQ29sdW1uTnVtYmVyKTt9LHJhd1RvRWRpdG9yTG9jYXRpb246KGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyPTApPT57aWYoIXRoaXMuX3ByZXR0eSkKcmV0dXJuW2xpbmVOdW1iZXIsY29sdW1uTnVtYmVyXTtyZXR1cm4gdGhpcy5fcmF3VG9QcmV0dHlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fX07fQpzZXRDYW5QcmV0dHlQcmludChjYW5QcmV0dHlQcmludCxhdXRvUHJldHR5UHJpbnQpe3RoaXMuX3Nob3VsZEF1dG9QcmV0dHlQcmludD1jYW5QcmV0dHlQcmludCYmISFhdXRvUHJldHR5UHJpbnQ7dGhpcy5fcHJldHR5VG9nZ2xlLnNldFZpc2libGUoY2FuUHJldHR5UHJpbnQpO30KYXN5bmMgX3NldFByZXR0eSh2YWx1ZSl7dGhpcy5fcHJldHR5PXZhbHVlO3RoaXMuX3ByZXR0eVRvZ2dsZS5zZXRFbmFibGVkKGZhbHNlKTtjb25zdCB3YXNMb2FkZWQ9dGhpcy5sb2FkZWQ7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuc2VsZWN0aW9uKCk7bGV0IG5ld1NlbGVjdGlvbjtpZih0aGlzLl9wcmV0dHkpe2NvbnN0IGZvcm1hdEluZm89YXdhaXQgdGhpcy5fcmVxdWVzdEZvcm1hdHRlZENvbnRlbnQoKTt0aGlzLl9mb3JtYXR0ZWRNYXA9Zm9ybWF0SW5mby5tYXA7dGhpcy5zZXRDb250ZW50KGZvcm1hdEluZm8uY29udGVudCk7dGhpcy5fcHJldHR5Q2xlYW5HZW5lcmF0aW9uPXRoaXMuX3RleHRFZGl0b3IubWFya0NsZWFuKCk7Y29uc3Qgc3RhcnQ9dGhpcy5fcmF3VG9QcmV0dHlMb2NhdGlvbihzZWxlY3Rpb24uc3RhcnRMaW5lLHNlbGVjdGlvbi5zdGFydENvbHVtbik7Y29uc3QgZW5kPXRoaXMuX3Jhd1RvUHJldHR5TG9jYXRpb24oc2VsZWN0aW9uLmVuZExpbmUsc2VsZWN0aW9uLmVuZENvbHVtbik7bmV3U2VsZWN0aW9uPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0WzBdLHN0YXJ0WzFdLGVuZFswXSxlbmRbMV0pO31lbHNle3RoaXMuc2V0Q29udGVudCh0aGlzLl9yYXdDb250ZW50KTt0aGlzLl9jbGVhbkdlbmVyYXRpb249dGhpcy5fdGV4dEVkaXRvci5tYXJrQ2xlYW4oKTtjb25zdCBzdGFydD10aGlzLl9wcmV0dHlUb1Jhd0xvY2F0aW9uKHNlbGVjdGlvbi5zdGFydExpbmUsc2VsZWN0aW9uLnN0YXJ0Q29sdW1uKTtjb25zdCBlbmQ9dGhpcy5fcHJldHR5VG9SYXdMb2NhdGlvbihzZWxlY3Rpb24uZW5kTGluZSxzZWxlY3Rpb24uZW5kQ29sdW1uKTtuZXdTZWxlY3Rpb249bmV3IFRleHRVdGlscy5UZXh0UmFuZ2Uoc3RhcnRbMF0sc3RhcnRbMV0sZW5kWzBdLGVuZFsxXSk7fQppZih3YXNMb2FkZWQpe3RoaXMudGV4dEVkaXRvci5yZXZlYWxQb3NpdGlvbihuZXdTZWxlY3Rpb24uZW5kTGluZSxuZXdTZWxlY3Rpb24uZW5kQ29sdW1uLHRoaXMuX2VkaXRhYmxlKTt0aGlzLnRleHRFZGl0b3Iuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7fQp0aGlzLl9wcmV0dHlUb2dnbGUuc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl91cGRhdGVQcmV0dHlQcmludFN0YXRlKCk7fQpfdXBkYXRlUHJldHR5UHJpbnRTdGF0ZSgpe3RoaXMuX3ByZXR0eVRvZ2dsZS5zZXRUb2dnbGVkKHRoaXMuX3ByZXR0eSk7dGhpcy5fdGV4dEVkaXRvci5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3ByZXR0eS1wcmludGVkJyx0aGlzLl9wcmV0dHkpO2lmKHRoaXMuX3ByZXR0eSl7dGhpcy5fdGV4dEVkaXRvci5zZXRMaW5lTnVtYmVyRm9ybWF0dGVyKGxpbmVOdW1iZXI9Pntjb25zdCBsaW5lPXRoaXMuX3ByZXR0eVRvUmF3TG9jYXRpb24obGluZU51bWJlci0xLDApWzBdKzE7aWYobGluZU51bWJlcj09PTEpCnJldHVybiBTdHJpbmcobGluZSk7aWYobGluZSE9PXRoaXMuX3ByZXR0eVRvUmF3TG9jYXRpb24obGluZU51bWJlci0yLDApWzBdKzEpCnJldHVybiBTdHJpbmcobGluZSk7cmV0dXJuJy0nO30pO31lbHNle3RoaXMuX3RleHRFZGl0b3Iuc2V0TGluZU51bWJlckZvcm1hdHRlcihsaW5lTnVtYmVyPT57cmV0dXJuIFN0cmluZyhsaW5lTnVtYmVyKTt9KTt9fQp0cmFuc2Zvcm1lcigpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1lcjt9Cl9wcmV0dHlUb1Jhd0xvY2F0aW9uKGxpbmUsY29sdW1uKXtpZighdGhpcy5fZm9ybWF0dGVkTWFwKQpyZXR1cm5bbGluZSxjb2x1bW5dO3JldHVybiB0aGlzLl9mb3JtYXR0ZWRNYXAuZm9ybWF0dGVkVG9PcmlnaW5hbChsaW5lLGNvbHVtbik7fQpfcmF3VG9QcmV0dHlMb2NhdGlvbihsaW5lLGNvbHVtbil7aWYoIXRoaXMuX2Zvcm1hdHRlZE1hcCkKcmV0dXJuW2xpbmUsY29sdW1uXTtyZXR1cm4gdGhpcy5fZm9ybWF0dGVkTWFwLm9yaWdpbmFsVG9Gb3JtYXR0ZWQobGluZSxjb2x1bW4pO30Kc2V0RWRpdGFibGUoZWRpdGFibGUpe3RoaXMuX2VkaXRhYmxlPWVkaXRhYmxlO2lmKHRoaXMuX2xvYWRlZCkKdGhpcy5fdGV4dEVkaXRvci5zZXRSZWFkT25seSghZWRpdGFibGUpO30Kd2FzU2hvd24oKXt0aGlzLl9lbnN1cmVDb250ZW50TG9hZGVkKCk7dGhpcy5fd2FzU2hvd25PckxvYWRlZCgpO30Kd2lsbEhpZGUoKXtzdXBlci53aWxsSGlkZSgpO3RoaXMuX2NsZWFyUG9zaXRpb25Ub1JldmVhbCgpO30Kc3luY1Rvb2xiYXJJdGVtcygpe3JldHVyblt0aGlzLl9wcmV0dHlUb2dnbGUsdGhpcy5fc291cmNlUG9zaXRpb25dO30KZ2V0IGxvYWRlZCgpe3JldHVybiB0aGlzLl9sb2FkZWQ7fQpnZXQgdGV4dEVkaXRvcigpe3JldHVybiB0aGlzLl90ZXh0RWRpdG9yO30KZ2V0IHByZXR0eSgpe3JldHVybiB0aGlzLl9wcmV0dHk7fQphc3luYyBfZW5zdXJlQ29udGVudExvYWRlZCgpe2lmKCF0aGlzLl9jb250ZW50UmVxdWVzdGVkKXt0aGlzLl9jb250ZW50UmVxdWVzdGVkPXRydWU7Y29uc3QgY29udGVudD1hd2FpdCB0aGlzLl9sYXp5Q29udGVudCgpO3RoaXMuX3Jhd0NvbnRlbnQ9Y29udGVudHx8Jyc7dGhpcy5fZm9ybWF0dGVkQ29udGVudFByb21pc2U9bnVsbDt0aGlzLl9mb3JtYXR0ZWRNYXA9bnVsbDt0aGlzLl9wcmV0dHlUb2dnbGUuc2V0RW5hYmxlZCh0cnVlKTtpZih0aGlzLl9zaG91bGRBdXRvUHJldHR5UHJpbnQmJlRleHRVdGlscy5pc01pbmlmaWVkKGNvbnRlbnQpKQphd2FpdCB0aGlzLl9zZXRQcmV0dHkodHJ1ZSk7ZWxzZQp0aGlzLnNldENvbnRlbnQodGhpcy5fcmF3Q29udGVudCk7fX0KX3JlcXVlc3RGb3JtYXR0ZWRDb250ZW50KCl7aWYodGhpcy5fZm9ybWF0dGVkQ29udGVudFByb21pc2UpCnJldHVybiB0aGlzLl9mb3JtYXR0ZWRDb250ZW50UHJvbWlzZTtsZXQgZnVsZmlsbDt0aGlzLl9mb3JtYXR0ZWRDb250ZW50UHJvbWlzZT1uZXcgUHJvbWlzZSh4PT5mdWxmaWxsPXgpO25ldyBGb3JtYXR0ZXIuU2NyaXB0Rm9ybWF0dGVyKHRoaXMuX2hpZ2hsaWdodGVyVHlwZSx0aGlzLl9yYXdDb250ZW50fHwnJywoY29udGVudCxtYXApPT57ZnVsZmlsbCh7Y29udGVudCxtYXB9KTt9KTtyZXR1cm4gdGhpcy5fZm9ybWF0dGVkQ29udGVudFByb21pc2U7fQpyZXZlYWxQb3NpdGlvbihsaW5lLGNvbHVtbixzaG91bGRIaWdobGlnaHQpe3RoaXMuX2xpbmVUb1Njcm9sbFRvPW51bGw7dGhpcy5fc2VsZWN0aW9uVG9TZXQ9bnVsbDt0aGlzLl9wb3NpdGlvblRvUmV2ZWFsPXtsaW5lOmxpbmUsY29sdW1uOmNvbHVtbixzaG91bGRIaWdobGlnaHQ6c2hvdWxkSGlnaGxpZ2h0fTt0aGlzLl9pbm5lclJldmVhbFBvc2l0aW9uSWZOZWVkZWQoKTt9Cl9pbm5lclJldmVhbFBvc2l0aW9uSWZOZWVkZWQoKXtpZighdGhpcy5fcG9zaXRpb25Ub1JldmVhbCkKcmV0dXJuO2lmKCF0aGlzLmxvYWRlZHx8IXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjtjb25zdFtsaW5lLGNvbHVtbl09dGhpcy5fdHJhbnNmb3JtZXIucmF3VG9FZGl0b3JMb2NhdGlvbih0aGlzLl9wb3NpdGlvblRvUmV2ZWFsLmxpbmUsdGhpcy5fcG9zaXRpb25Ub1JldmVhbC5jb2x1bW4pO3RoaXMuX3RleHRFZGl0b3IucmV2ZWFsUG9zaXRpb24obGluZSxjb2x1bW4sdGhpcy5fcG9zaXRpb25Ub1JldmVhbC5zaG91bGRIaWdobGlnaHQpO3RoaXMuX3Bvc2l0aW9uVG9SZXZlYWw9bnVsbDt9Cl9jbGVhclBvc2l0aW9uVG9SZXZlYWwoKXt0aGlzLl90ZXh0RWRpdG9yLmNsZWFyUG9zaXRpb25IaWdobGlnaHQoKTt0aGlzLl9wb3NpdGlvblRvUmV2ZWFsPW51bGw7fQpzY3JvbGxUb0xpbmUobGluZSl7dGhpcy5fY2xlYXJQb3NpdGlvblRvUmV2ZWFsKCk7dGhpcy5fbGluZVRvU2Nyb2xsVG89bGluZTt0aGlzLl9pbm5lclNjcm9sbFRvTGluZUlmTmVlZGVkKCk7fQpfaW5uZXJTY3JvbGxUb0xpbmVJZk5lZWRlZCgpe2lmKHRoaXMuX2xpbmVUb1Njcm9sbFRvIT09bnVsbCl7aWYodGhpcy5sb2FkZWQmJnRoaXMuaXNTaG93aW5nKCkpe3RoaXMuX3RleHRFZGl0b3Iuc2Nyb2xsVG9MaW5lKHRoaXMuX2xpbmVUb1Njcm9sbFRvKTt0aGlzLl9saW5lVG9TY3JvbGxUbz1udWxsO319fQpzZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0RWRpdG9yLnNlbGVjdGlvbigpO30Kc2V0U2VsZWN0aW9uKHRleHRSYW5nZSl7dGhpcy5fc2VsZWN0aW9uVG9TZXQ9dGV4dFJhbmdlO3RoaXMuX2lubmVyU2V0U2VsZWN0aW9uSWZOZWVkZWQoKTt9Cl9pbm5lclNldFNlbGVjdGlvbklmTmVlZGVkKCl7aWYodGhpcy5fc2VsZWN0aW9uVG9TZXQmJnRoaXMubG9hZGVkJiZ0aGlzLmlzU2hvd2luZygpKXt0aGlzLl90ZXh0RWRpdG9yLnNldFNlbGVjdGlvbih0aGlzLl9zZWxlY3Rpb25Ub1NldCx0cnVlKTt0aGlzLl9zZWxlY3Rpb25Ub1NldD1udWxsO319Cl93YXNTaG93bk9yTG9hZGVkKCl7dGhpcy5faW5uZXJSZXZlYWxQb3NpdGlvbklmTmVlZGVkKCk7dGhpcy5faW5uZXJTZXRTZWxlY3Rpb25JZk5lZWRlZCgpO3RoaXMuX2lubmVyU2Nyb2xsVG9MaW5lSWZOZWVkZWQoKTt9Cm9uVGV4dENoYW5nZWQob2xkUmFuZ2UsbmV3UmFuZ2Upe2NvbnN0IHdhc1ByZXR0eT10aGlzLnByZXR0eTt0aGlzLl9wcmV0dHk9dGhpcy5fcHJldHR5Q2xlYW5HZW5lcmF0aW9uIT09bnVsbCYmdGhpcy50ZXh0RWRpdG9yLmlzQ2xlYW4odGhpcy5fcHJldHR5Q2xlYW5HZW5lcmF0aW9uKTtpZih0aGlzLl9wcmV0dHkhPT13YXNQcmV0dHkpCnRoaXMuX3VwZGF0ZVByZXR0eVByaW50U3RhdGUoKTt0aGlzLl9wcmV0dHlUb2dnbGUuc2V0RW5hYmxlZCh0aGlzLmlzQ2xlYW4oKSk7aWYodGhpcy5fc2VhcmNoQ29uZmlnJiZ0aGlzLl9zZWFyY2hhYmxlVmlldykKdGhpcy5wZXJmb3JtU2VhcmNoKHRoaXMuX3NlYXJjaENvbmZpZyxmYWxzZSxmYWxzZSk7fQppc0NsZWFuKCl7cmV0dXJuIHRoaXMudGV4dEVkaXRvci5pc0NsZWFuKHRoaXMuX2NsZWFuR2VuZXJhdGlvbil8fCh0aGlzLl9wcmV0dHlDbGVhbkdlbmVyYXRpb24hPT1udWxsJiZ0aGlzLnRleHRFZGl0b3IuaXNDbGVhbih0aGlzLl9wcmV0dHlDbGVhbkdlbmVyYXRpb24pKTt9CmNvbnRlbnRDb21taXR0ZWQoKXt0aGlzLl9jbGVhbkdlbmVyYXRpb249dGhpcy5fdGV4dEVkaXRvci5tYXJrQ2xlYW4oKTt0aGlzLl9wcmV0dHlDbGVhbkdlbmVyYXRpb249bnVsbDt0aGlzLl9yYXdDb250ZW50PXRoaXMudGV4dEVkaXRvci50ZXh0KCk7dGhpcy5fZm9ybWF0dGVkTWFwPW51bGw7dGhpcy5fZm9ybWF0dGVkQ29udGVudFByb21pc2U9bnVsbDtpZih0aGlzLl9wcmV0dHkpe3RoaXMuX3ByZXR0eT1mYWxzZTt0aGlzLl91cGRhdGVQcmV0dHlQcmludFN0YXRlKCk7fQp0aGlzLl9wcmV0dHlUb2dnbGUuc2V0RW5hYmxlZCh0cnVlKTt9Cl9zaW1wbGlmeU1pbWVUeXBlKGNvbnRlbnQsbWltZVR5cGUpe2lmKCFtaW1lVHlwZSkKcmV0dXJuJyc7aWYobWltZVR5cGUuaW5kZXhPZignamF2YXNjcmlwdCcpPj0wfHxtaW1lVHlwZS5pbmRleE9mKCdqc2NyaXB0Jyk+PTB8fG1pbWVUeXBlLmluZGV4T2YoJ2VjbWFzY3JpcHQnKT49MCkKcmV0dXJuJ3RleHQvamF2YXNjcmlwdCc7aWYobWltZVR5cGU9PT0ndGV4dC94LXBocCcmJmNvbnRlbnQubWF0Y2goL1w8XD8uKlw/XD4vZykpCnJldHVybidhcHBsaWNhdGlvbi94LWh0dHBkLXBocCc7cmV0dXJuIG1pbWVUeXBlO30Kc2V0SGlnaGxpZ2h0ZXJUeXBlKGhpZ2hsaWdodGVyVHlwZSl7dGhpcy5faGlnaGxpZ2h0ZXJUeXBlPWhpZ2hsaWdodGVyVHlwZTt0aGlzLl91cGRhdGVIaWdobGlnaHRlclR5cGUoJycpO30KaGlnaGxpZ2h0ZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVyVHlwZTt9Cl91cGRhdGVIaWdobGlnaHRlclR5cGUoY29udGVudCl7dGhpcy5fdGV4dEVkaXRvci5zZXRNaW1lVHlwZSh0aGlzLl9zaW1wbGlmeU1pbWVUeXBlKGNvbnRlbnQsdGhpcy5faGlnaGxpZ2h0ZXJUeXBlKSk7fQpzZXRDb250ZW50KGNvbnRlbnQpe3RoaXMuX211dGVDaGFuZ2VFdmVudHNGb3JTZXRDb250ZW50PXRydWU7aWYoIXRoaXMuX2xvYWRlZCl7dGhpcy5fbG9hZGVkPXRydWU7dGhpcy5fdGV4dEVkaXRvci5zZXRUZXh0KGNvbnRlbnR8fCcnKTt0aGlzLl9jbGVhbkdlbmVyYXRpb249dGhpcy5fdGV4dEVkaXRvci5tYXJrQ2xlYW4oKTt0aGlzLl90ZXh0RWRpdG9yLnNldFJlYWRPbmx5KCF0aGlzLl9lZGl0YWJsZSk7fWVsc2V7Y29uc3Qgc2Nyb2xsVG9wPXRoaXMuX3RleHRFZGl0b3Iuc2Nyb2xsVG9wKCk7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX3RleHRFZGl0b3Iuc2VsZWN0aW9uKCk7dGhpcy5fdGV4dEVkaXRvci5zZXRUZXh0KGNvbnRlbnR8fCcnKTt0aGlzLl90ZXh0RWRpdG9yLnNldFNjcm9sbFRvcChzY3JvbGxUb3ApO3RoaXMuX3RleHRFZGl0b3Iuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7fQp0aGlzLl91cGRhdGVIaWdobGlnaHRlclR5cGUoY29udGVudHx8JycpO3RoaXMuX3dhc1Nob3duT3JMb2FkZWQoKTtpZih0aGlzLl9kZWxheWVkRmluZFNlYXJjaE1hdGNoZXMpe3RoaXMuX2RlbGF5ZWRGaW5kU2VhcmNoTWF0Y2hlcygpO3RoaXMuX2RlbGF5ZWRGaW5kU2VhcmNoTWF0Y2hlcz1udWxsO30KdGhpcy5fbXV0ZUNoYW5nZUV2ZW50c0ZvclNldENvbnRlbnQ9ZmFsc2U7fQpzZXRTZWFyY2hhYmxlVmlldyh2aWV3KXt0aGlzLl9zZWFyY2hhYmxlVmlldz12aWV3O30KX2RvRmluZFNlYXJjaE1hdGNoZXMoc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7dGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4PS0xO3RoaXMuX3NlYXJjaFJlc3VsdHM9W107Y29uc3QgcmVnZXg9c2VhcmNoQ29uZmlnLnRvU2VhcmNoUmVnZXgoKTt0aGlzLl9zZWFyY2hSZWdleD1yZWdleDt0aGlzLl9zZWFyY2hSZXN1bHRzPXRoaXMuX2NvbGxlY3RSZWdleE1hdGNoZXMocmVnZXgpO2lmKHRoaXMuX3NlYXJjaGFibGVWaWV3KQp0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVTZWFyY2hNYXRjaGVzQ291bnQodGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpO2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKdGhpcy5fdGV4dEVkaXRvci5jYW5jZWxTZWFyY2hSZXN1bHRzSGlnaGxpZ2h0KCk7ZWxzZSBpZihzaG91bGRKdW1wJiZqdW1wQmFja3dhcmRzKQp0aGlzLmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCk7ZWxzZSBpZihzaG91bGRKdW1wKQp0aGlzLmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKTtlbHNlCnRoaXMuX3RleHRFZGl0b3IuaGlnaGxpZ2h0U2VhcmNoUmVzdWx0cyhyZWdleCxudWxsKTt9CnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7aWYodGhpcy5fc2VhcmNoYWJsZVZpZXcpCnRoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudCgwKTt0aGlzLl9yZXNldFNlYXJjaCgpO3RoaXMuX3NlYXJjaENvbmZpZz1zZWFyY2hDb25maWc7aWYodGhpcy5sb2FkZWQpCnRoaXMuX2RvRmluZFNlYXJjaE1hdGNoZXMoc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsISFqdW1wQmFja3dhcmRzKTtlbHNlCnRoaXMuX2RlbGF5ZWRGaW5kU2VhcmNoTWF0Y2hlcz10aGlzLl9kb0ZpbmRTZWFyY2hNYXRjaGVzLmJpbmQodGhpcyxzZWFyY2hDb25maWcsc2hvdWxkSnVtcCwhIWp1bXBCYWNrd2FyZHMpO3RoaXMuX2Vuc3VyZUNvbnRlbnRMb2FkZWQoKTt9Cl9yZXNldEN1cnJlbnRTZWFyY2hSZXN1bHRJbmRleCgpe2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0tMTtpZih0aGlzLl9zZWFyY2hhYmxlVmlldykKdGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlQ3VycmVudE1hdGNoSW5kZXgodGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4KTt0aGlzLl90ZXh0RWRpdG9yLmhpZ2hsaWdodFNlYXJjaFJlc3VsdHMoKHRoaXMuX3NlYXJjaFJlZ2V4KSxudWxsKTt9Cl9yZXNldFNlYXJjaCgpe3RoaXMuX3NlYXJjaENvbmZpZz1udWxsO3RoaXMuX2RlbGF5ZWRGaW5kU2VhcmNoTWF0Y2hlcz1udWxsO3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0tMTt0aGlzLl9zZWFyY2hSZXN1bHRzPVtdO3RoaXMuX3NlYXJjaFJlZ2V4PW51bGw7fQpzZWFyY2hDYW5jZWxlZCgpe2NvbnN0IHJhbmdlPXRoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleCE9PS0xP3RoaXMuX3NlYXJjaFJlc3VsdHNbdGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4XTpudWxsO3RoaXMuX3Jlc2V0U2VhcmNoKCk7aWYoIXRoaXMubG9hZGVkKQpyZXR1cm47dGhpcy5fdGV4dEVkaXRvci5jYW5jZWxTZWFyY2hSZXN1bHRzSGlnaGxpZ2h0KCk7aWYocmFuZ2UpCnRoaXMuc2V0U2VsZWN0aW9uKHJhbmdlKTt9Cmp1bXBUb0xhc3RTZWFyY2hSZXN1bHQoKXt0aGlzLmp1bXBUb1NlYXJjaFJlc3VsdCh0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aC0xKTt9Cl9zZWFyY2hSZXN1bHRJbmRleEZvckN1cnJlbnRTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VhcmNoUmVzdWx0cy5sb3dlckJvdW5kKHRoaXMuX3RleHRFZGl0b3Iuc2VsZWN0aW9uKCkuY29sbGFwc2VUb0VuZCgpLFRleHRVdGlscy5UZXh0UmFuZ2UuY29tcGFyYXRvcik7fQpqdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCl7Y29uc3QgY3VycmVudEluZGV4PXRoaXMuX3NlYXJjaFJlc3VsdEluZGV4Rm9yQ3VycmVudFNlbGVjdGlvbigpO2NvbnN0IG5leHRJbmRleD10aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXg9PT0tMT9jdXJyZW50SW5kZXg6Y3VycmVudEluZGV4KzE7dGhpcy5qdW1wVG9TZWFyY2hSZXN1bHQobmV4dEluZGV4KTt9Cmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCl7Y29uc3QgY3VycmVudEluZGV4PXRoaXMuX3NlYXJjaFJlc3VsdEluZGV4Rm9yQ3VycmVudFNlbGVjdGlvbigpO3RoaXMuanVtcFRvU2VhcmNoUmVzdWx0KGN1cnJlbnRJbmRleC0xKTt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiB0cnVlO30KanVtcFRvU2VhcmNoUmVzdWx0KGluZGV4KXtpZighdGhpcy5sb2FkZWR8fCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuX2N1cnJlbnRTZWFyY2hSZXN1bHRJbmRleD0oaW5kZXgrdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpJXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoO2lmKHRoaXMuX3NlYXJjaGFibGVWaWV3KQp0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVDdXJyZW50TWF0Y2hJbmRleCh0aGlzLl9jdXJyZW50U2VhcmNoUmVzdWx0SW5kZXgpO3RoaXMuX3RleHRFZGl0b3IuaGlnaGxpZ2h0U2VhcmNoUmVzdWx0cygodGhpcy5fc2VhcmNoUmVnZXgpLHRoaXMuX3NlYXJjaFJlc3VsdHNbdGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4XSk7fQpyZXBsYWNlU2VsZWN0aW9uV2l0aChzZWFyY2hDb25maWcscmVwbGFjZW1lbnQpe2NvbnN0IHJhbmdlPXRoaXMuX3NlYXJjaFJlc3VsdHNbdGhpcy5fY3VycmVudFNlYXJjaFJlc3VsdEluZGV4XTtpZighcmFuZ2UpCnJldHVybjt0aGlzLl90ZXh0RWRpdG9yLmhpZ2hsaWdodFNlYXJjaFJlc3VsdHMoKHRoaXMuX3NlYXJjaFJlZ2V4KSxudWxsKTtjb25zdCBvbGRUZXh0PXRoaXMuX3RleHRFZGl0b3IudGV4dChyYW5nZSk7Y29uc3QgcmVnZXg9c2VhcmNoQ29uZmlnLnRvU2VhcmNoUmVnZXgoKTtsZXQgdGV4dDtpZihyZWdleC5fX2Zyb21SZWdFeHBRdWVyeSl7dGV4dD1vbGRUZXh0LnJlcGxhY2UocmVnZXgscmVwbGFjZW1lbnQpO31lbHNle3RleHQ9b2xkVGV4dC5yZXBsYWNlKHJlZ2V4LGZ1bmN0aW9uKCl7cmV0dXJuIHJlcGxhY2VtZW50O30pO30KY29uc3QgbmV3UmFuZ2U9dGhpcy5fdGV4dEVkaXRvci5lZGl0UmFuZ2UocmFuZ2UsdGV4dCk7dGhpcy5fdGV4dEVkaXRvci5zZXRTZWxlY3Rpb24obmV3UmFuZ2UuY29sbGFwc2VUb0VuZCgpKTt9CnJlcGxhY2VBbGxXaXRoKHNlYXJjaENvbmZpZyxyZXBsYWNlbWVudCl7dGhpcy5fcmVzZXRDdXJyZW50U2VhcmNoUmVzdWx0SW5kZXgoKTtsZXQgdGV4dD10aGlzLl90ZXh0RWRpdG9yLnRleHQoKTtjb25zdCByYW5nZT10aGlzLl90ZXh0RWRpdG9yLmZ1bGxSYW5nZSgpO2NvbnN0IHJlZ2V4PXNlYXJjaENvbmZpZy50b1NlYXJjaFJlZ2V4KHRydWUpO2lmKHJlZ2V4Ll9fZnJvbVJlZ0V4cFF1ZXJ5KXt0ZXh0PXRleHQucmVwbGFjZShyZWdleCxyZXBsYWNlbWVudCk7fWVsc2V7dGV4dD10ZXh0LnJlcGxhY2UocmVnZXgsZnVuY3Rpb24oKXtyZXR1cm4gcmVwbGFjZW1lbnQ7fSk7fQpjb25zdCByYW5nZXM9dGhpcy5fY29sbGVjdFJlZ2V4TWF0Y2hlcyhyZWdleCk7aWYoIXJhbmdlcy5sZW5ndGgpCnJldHVybjtjb25zdCBjdXJyZW50UmFuZ2VJbmRleD1yYW5nZXMubG93ZXJCb3VuZCh0aGlzLl90ZXh0RWRpdG9yLnNlbGVjdGlvbigpLFRleHRVdGlscy5UZXh0UmFuZ2UuY29tcGFyYXRvcik7Y29uc3QgbGFzdFJhbmdlSW5kZXg9bW9kKGN1cnJlbnRSYW5nZUluZGV4LTEscmFuZ2VzLmxlbmd0aCk7Y29uc3QgbGFzdFJhbmdlPXJhbmdlc1tsYXN0UmFuZ2VJbmRleF07Y29uc3QgcmVwbGFjZW1lbnRMaW5lRW5kaW5ncz1yZXBsYWNlbWVudC5jb21wdXRlTGluZUVuZGluZ3MoKTtjb25zdCByZXBsYWNlbWVudExpbmVDb3VudD1yZXBsYWNlbWVudExpbmVFbmRpbmdzLmxlbmd0aDtjb25zdCBsYXN0TGluZU51bWJlcj1sYXN0UmFuZ2Uuc3RhcnRMaW5lK3JlcGxhY2VtZW50TGluZUVuZGluZ3MubGVuZ3RoLTE7bGV0IGxhc3RDb2x1bW5OdW1iZXI9bGFzdFJhbmdlLnN0YXJ0Q29sdW1uO2lmKHJlcGxhY2VtZW50TGluZUVuZGluZ3MubGVuZ3RoPjEpe2xhc3RDb2x1bW5OdW1iZXI9cmVwbGFjZW1lbnRMaW5lRW5kaW5nc1tyZXBsYWNlbWVudExpbmVDb3VudC0xXS1yZXBsYWNlbWVudExpbmVFbmRpbmdzW3JlcGxhY2VtZW50TGluZUNvdW50LTJdLTE7fQp0aGlzLl90ZXh0RWRpdG9yLmVkaXRSYW5nZShyYW5nZSx0ZXh0KTt0aGlzLl90ZXh0RWRpdG9yLnJldmVhbFBvc2l0aW9uKGxhc3RMaW5lTnVtYmVyLGxhc3RDb2x1bW5OdW1iZXIpO3RoaXMuX3RleHRFZGl0b3Iuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGxhc3RMaW5lTnVtYmVyLGxhc3RDb2x1bW5OdW1iZXIpKTt9Cl9jb2xsZWN0UmVnZXhNYXRjaGVzKHJlZ2V4T2JqZWN0KXtjb25zdCByYW5nZXM9W107Zm9yKGxldCBpPTA7aTx0aGlzLl90ZXh0RWRpdG9yLmxpbmVzQ291bnQ7KytpKXtsZXQgbGluZT10aGlzLl90ZXh0RWRpdG9yLmxpbmUoaSk7bGV0IG9mZnNldD0wO2xldCBtYXRjaDtkb3ttYXRjaD1yZWdleE9iamVjdC5leGVjKGxpbmUpO2lmKG1hdGNoKXtjb25zdCBtYXRjaEVuZEluZGV4PW1hdGNoLmluZGV4K01hdGgubWF4KG1hdGNoWzBdLmxlbmd0aCwxKTtpZihtYXRjaFswXS5sZW5ndGgpCnJhbmdlcy5wdXNoKG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGksb2Zmc2V0K21hdGNoLmluZGV4LGksb2Zmc2V0K21hdGNoRW5kSW5kZXgpKTtvZmZzZXQrPW1hdGNoRW5kSW5kZXg7bGluZT1saW5lLnN1YnN0cmluZyhtYXRjaEVuZEluZGV4KTt9fXdoaWxlKG1hdGNoJiZsaW5lKTt9CnJldHVybiByYW5nZXM7fQpwb3B1bGF0ZUxpbmVHdXR0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSxlZGl0b3JMaW5lTnVtYmVyKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpwb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnUoY29udGV4dE1lbnUsZWRpdG9yTGluZU51bWJlcixlZGl0b3JDb2x1bW5OdW1iZXIpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmNhbkVkaXRTb3VyY2UoKXtyZXR1cm4gdGhpcy5fZWRpdGFibGU7fQpfdXBkYXRlU291cmNlUG9zaXRpb24oKXtjb25zdCBzZWxlY3Rpb25zPXRoaXMuX3RleHRFZGl0b3Iuc2VsZWN0aW9ucygpO2lmKCFzZWxlY3Rpb25zLmxlbmd0aCkKcmV0dXJuO2lmKHNlbGVjdGlvbnMubGVuZ3RoPjEpe3RoaXMuX3NvdXJjZVBvc2l0aW9uLnNldFRleHQoQ29tbW9uLlVJU3RyaW5nKCclZCBzZWxlY3Rpb24gcmVnaW9ucycsc2VsZWN0aW9ucy5sZW5ndGgpKTtyZXR1cm47fQpsZXQgdGV4dFJhbmdlPXNlbGVjdGlvbnNbMF07aWYodGV4dFJhbmdlLmlzRW1wdHkoKSl7Y29uc3QgbG9jYXRpb249dGhpcy5fcHJldHR5VG9SYXdMb2NhdGlvbih0ZXh0UmFuZ2UuZW5kTGluZSx0ZXh0UmFuZ2UuZW5kQ29sdW1uKTt0aGlzLl9zb3VyY2VQb3NpdGlvbi5zZXRUZXh0KGBMaW5lICR7bG9jYXRpb25bMF0gKyAxfSwgQ29sdW1uICR7bG9jYXRpb25bMV0gKyAxfWApO3JldHVybjt9CnRleHRSYW5nZT10ZXh0UmFuZ2Uubm9ybWFsaXplKCk7Y29uc3Qgc2VsZWN0ZWRUZXh0PXRoaXMuX3RleHRFZGl0b3IudGV4dCh0ZXh0UmFuZ2UpO2lmKHRleHRSYW5nZS5zdGFydExpbmU9PT10ZXh0UmFuZ2UuZW5kTGluZSl7dGhpcy5fc291cmNlUG9zaXRpb24uc2V0VGV4dChDb21tb24uVUlTdHJpbmcoJyVkIGNoYXJhY3RlcnMgc2VsZWN0ZWQnLHNlbGVjdGVkVGV4dC5sZW5ndGgpKTt9ZWxzZXt0aGlzLl9zb3VyY2VQb3NpdGlvbi5zZXRUZXh0KENvbW1vbi5VSVN0cmluZygnJWQgbGluZXMsICVkIGNoYXJhY3RlcnMgc2VsZWN0ZWQnLHRleHRSYW5nZS5lbmRMaW5lLXRleHRSYW5nZS5zdGFydExpbmUrMSxzZWxlY3RlZFRleHQubGVuZ3RoKSk7fX19O1NvdXJjZUZyYW1lLkxpbmVEZWNvcmF0b3I9ZnVuY3Rpb24oKXt9O1NvdXJjZUZyYW1lLkxpbmVEZWNvcmF0b3IucHJvdG90eXBlPXtkZWNvcmF0ZSh1aVNvdXJjZUNvZGUsdGV4dEVkaXRvcil7fX07U291cmNlRnJhbWUuVHJhbnNmb3JtZXI7O1NvdXJjZUZyYW1lLlJlc291cmNlU291cmNlRnJhbWU9Y2xhc3MgZXh0ZW5kcyBTb3VyY2VGcmFtZS5Tb3VyY2VGcmFtZXtjb25zdHJ1Y3RvcihyZXNvdXJjZSxhdXRvUHJldHR5UHJpbnQpe3N1cGVyKHJlc291cmNlLnJlcXVlc3RDb250ZW50LmJpbmQocmVzb3VyY2UpKTt0aGlzLl9yZXNvdXJjZT1yZXNvdXJjZTt0aGlzLnNldENhblByZXR0eVByaW50KHRoaXMuX3Jlc291cmNlLmNvbnRlbnRUeXBlKCkuaXNEb2N1bWVudE9yU2NyaXB0T3JTdHlsZVNoZWV0KCksYXV0b1ByZXR0eVByaW50KTt9CnN0YXRpYyBjcmVhdGVTZWFyY2hhYmxlVmlldyhyZXNvdXJjZSxoaWdobGlnaHRlclR5cGUsYXV0b1ByZXR0eVByaW50KXtyZXR1cm4gbmV3IFNvdXJjZUZyYW1lLlJlc291cmNlU291cmNlRnJhbWUuU2VhcmNoYWJsZUNvbnRhaW5lcihyZXNvdXJjZSxoaWdobGlnaHRlclR5cGUsYXV0b1ByZXR0eVByaW50KTt9CmdldCByZXNvdXJjZSgpe3JldHVybiB0aGlzLl9yZXNvdXJjZTt9CnBvcHVsYXRlVGV4dEFyZWFDb250ZXh0TWVudShjb250ZXh0TWVudSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7Y29udGV4dE1lbnUuYXBwZW5kQXBwbGljYWJsZUl0ZW1zKHRoaXMuX3Jlc291cmNlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fX07U291cmNlRnJhbWUuUmVzb3VyY2VTb3VyY2VGcmFtZS5TZWFyY2hhYmxlQ29udGFpbmVyPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihyZXNvdXJjZSxoaWdobGlnaHRlclR5cGUsYXV0b1ByZXR0eVByaW50KXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZV9mcmFtZS9yZXNvdXJjZVNvdXJjZUZyYW1lLmNzcycpO2NvbnN0IHNvdXJjZUZyYW1lPW5ldyBTb3VyY2VGcmFtZS5SZXNvdXJjZVNvdXJjZUZyYW1lKHJlc291cmNlLGF1dG9QcmV0dHlQcmludCk7dGhpcy5fc291cmNlRnJhbWU9c291cmNlRnJhbWU7c291cmNlRnJhbWUuc2V0SGlnaGxpZ2h0ZXJUeXBlKGhpZ2hsaWdodGVyVHlwZSk7Y29uc3Qgc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KHNvdXJjZUZyYW1lKTtzZWFyY2hhYmxlVmlldy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlYXJjaGFibGUtdmlldycpO3NlYXJjaGFibGVWaWV3LnNldFBsYWNlaG9sZGVyKGxzYEZpbmRgKTtzb3VyY2VGcmFtZS5zaG93KHNlYXJjaGFibGVWaWV3LmVsZW1lbnQpO3NvdXJjZUZyYW1lLnNldFNlYXJjaGFibGVWaWV3KHNlYXJjaGFibGVWaWV3KTtzZWFyY2hhYmxlVmlldy5zaG93KHRoaXMuY29udGVudEVsZW1lbnQpO2NvbnN0IHRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3Rvb2xiYXInLHRoaXMuY29udGVudEVsZW1lbnQpO2Zvcihjb25zdCBpdGVtIG9mIHNvdXJjZUZyYW1lLnN5bmNUb29sYmFySXRlbXMoKSkKdG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShpdGVtKTt9CmFzeW5jIHJldmVhbFBvc2l0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXt0aGlzLl9zb3VyY2VGcmFtZS5yZXZlYWxQb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcix0cnVlKTt9fTs7U291cmNlRnJhbWUuSlNPTlZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHBhcnNlZEpTT04pe3N1cGVyKCk7dGhpcy5faW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzb3VyY2VfZnJhbWUvanNvblZpZXcuY3NzJyk7dGhpcy5fcGFyc2VkSlNPTj1wYXJzZWRKU09OO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqc29uLXZpZXcnKTt0aGlzLl9zZWFyY2hhYmxlVmlldzt0aGlzLl90cmVlT3V0bGluZTt0aGlzLl9jdXJyZW50U2VhcmNoRm9jdXNJbmRleD0wO3RoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHM9W107dGhpcy5fc2VhcmNoUmVnZXg9bnVsbDt9CnN0YXRpYyBhc3luYyBjcmVhdGVWaWV3KGNvbnRlbnQpe2NvbnN0IHBhcnNlZEpTT049YXdhaXQgU291cmNlRnJhbWUuSlNPTlZpZXcuX3BhcnNlSlNPTihjb250ZW50KTtpZighcGFyc2VkSlNPTnx8dHlwZW9mIHBhcnNlZEpTT04uZGF0YSE9PSdvYmplY3QnKQpyZXR1cm4gbnVsbDtjb25zdCBqc29uVmlldz1uZXcgU291cmNlRnJhbWUuSlNPTlZpZXcocGFyc2VkSlNPTik7Y29uc3Qgc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KGpzb25WaWV3KTtzZWFyY2hhYmxlVmlldy5zZXRQbGFjZWhvbGRlcihDb21tb24uVUlTdHJpbmcoJ0ZpbmQnKSk7anNvblZpZXcuX3NlYXJjaGFibGVWaWV3PXNlYXJjaGFibGVWaWV3O2pzb25WaWV3LnNob3coc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7anNvblZpZXcuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywwKTtyZXR1cm4gc2VhcmNoYWJsZVZpZXc7fQpzdGF0aWMgY3JlYXRlVmlld1N5bmMob2JqKXtjb25zdCBqc29uVmlldz1uZXcgU291cmNlRnJhbWUuSlNPTlZpZXcobmV3IFNvdXJjZUZyYW1lLlBhcnNlZEpTT04ob2JqLCcnLCcnKSk7Y29uc3Qgc2VhcmNoYWJsZVZpZXc9bmV3IFVJLlNlYXJjaGFibGVWaWV3KGpzb25WaWV3KTtzZWFyY2hhYmxlVmlldy5zZXRQbGFjZWhvbGRlcihDb21tb24uVUlTdHJpbmcoJ0ZpbmQnKSk7anNvblZpZXcuX3NlYXJjaGFibGVWaWV3PXNlYXJjaGFibGVWaWV3O2pzb25WaWV3LnNob3coc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7anNvblZpZXcuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywwKTtyZXR1cm4gc2VhcmNoYWJsZVZpZXc7fQpzdGF0aWMgX3BhcnNlSlNPTih0ZXh0KXtsZXQgcmV0dXJuT2JqPW51bGw7aWYodGV4dCkKcmV0dXJuT2JqPVNvdXJjZUZyYW1lLkpTT05WaWV3Ll9leHRyYWN0SlNPTigodGV4dCkpO2lmKCFyZXR1cm5PYmopCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtyZXR1cm4gRm9ybWF0dGVyLmZvcm1hdHRlcldvcmtlclBvb2woKS5wYXJzZUpTT05SZWxheGVkKHJldHVybk9iai5kYXRhKS50aGVuKGhhbmRsZVJldHVybmVkSlNPTik7ZnVuY3Rpb24gaGFuZGxlUmV0dXJuZWRKU09OKGRhdGEpe2lmKCFkYXRhKQpyZXR1cm4gbnVsbDtyZXR1cm5PYmouZGF0YT1kYXRhO3JldHVybiByZXR1cm5PYmo7fX0Kc3RhdGljIF9leHRyYWN0SlNPTih0ZXh0KXtpZih0ZXh0LnN0YXJ0c1dpdGgoJzwnKSkKcmV0dXJuIG51bGw7bGV0IGlubmVyPVNvdXJjZUZyYW1lLkpTT05WaWV3Ll9maW5kQnJhY2tldHModGV4dCwneycsJ30nKTtjb25zdCBpbm5lcjI9U291cmNlRnJhbWUuSlNPTlZpZXcuX2ZpbmRCcmFja2V0cyh0ZXh0LCdbJywnXScpO2lubmVyPWlubmVyMi5sZW5ndGg+aW5uZXIubGVuZ3RoP2lubmVyMjppbm5lcjtpZihpbm5lci5sZW5ndGg9PT0tMXx8dGV4dC5sZW5ndGgtaW5uZXIubGVuZ3RoPjgwKQpyZXR1cm4gbnVsbDtjb25zdCBwcmVmaXg9dGV4dC5zdWJzdHJpbmcoMCxpbm5lci5zdGFydCk7Y29uc3Qgc3VmZml4PXRleHQuc3Vic3RyaW5nKGlubmVyLmVuZCsxKTt0ZXh0PXRleHQuc3Vic3RyaW5nKGlubmVyLnN0YXJ0LGlubmVyLmVuZCsxKTtpZihzdWZmaXgudHJpbSgpLmxlbmd0aCYmIShzdWZmaXgudHJpbSgpLnN0YXJ0c1dpdGgoJyknKSYmcHJlZml4LnRyaW0oKS5lbmRzV2l0aCgnKCcpKSkKcmV0dXJuIG51bGw7cmV0dXJuIG5ldyBTb3VyY2VGcmFtZS5QYXJzZWRKU09OKHRleHQscHJlZml4LHN1ZmZpeCk7fQpzdGF0aWMgX2ZpbmRCcmFja2V0cyh0ZXh0LG9wZW4sY2xvc2Upe2NvbnN0IHN0YXJ0PXRleHQuaW5kZXhPZihvcGVuKTtjb25zdCBlbmQ9dGV4dC5sYXN0SW5kZXhPZihjbG9zZSk7bGV0IGxlbmd0aD1lbmQtc3RhcnQtMTtpZihzdGFydD09PS0xfHxlbmQ9PT0tMXx8ZW5kPHN0YXJ0KQpsZW5ndGg9LTE7cmV0dXJue3N0YXJ0OnN0YXJ0LGVuZDplbmQsbGVuZ3RoOmxlbmd0aH07fQp3YXNTaG93bigpe3RoaXMuX2luaXRpYWxpemUoKTt9Cl9pbml0aWFsaXplKCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpCnJldHVybjt0aGlzLl9pbml0aWFsaXplZD10cnVlO2NvbnN0IG9iaj1TREsuUmVtb3RlT2JqZWN0LmZyb21Mb2NhbE9iamVjdCh0aGlzLl9wYXJzZWRKU09OLmRhdGEpO2NvbnN0IHRpdGxlPXRoaXMuX3BhcnNlZEpTT04ucHJlZml4K29iai5kZXNjcmlwdGlvbit0aGlzLl9wYXJzZWRKU09OLnN1ZmZpeDt0aGlzLl90cmVlT3V0bGluZT1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24ob2JqLHRpdGxlKTt0aGlzLl90cmVlT3V0bGluZS5lbmFibGVDb250ZXh0TWVudSgpO3RoaXMuX3RyZWVPdXRsaW5lLnNldEVkaXRhYmxlKGZhbHNlKTt0aGlzLl90cmVlT3V0bGluZS5leHBhbmQoKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudCk7fQpfanVtcFRvTWF0Y2goaW5kZXgpe2lmKCF0aGlzLl9zZWFyY2hSZWdleCkKcmV0dXJuO2NvbnN0IHByZXZpb3VzRm9jdXNFbGVtZW50PXRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHNbdGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXhdO2lmKHByZXZpb3VzRm9jdXNFbGVtZW50KQpwcmV2aW91c0ZvY3VzRWxlbWVudC5zZXRTZWFyY2hSZWdleCh0aGlzLl9zZWFyY2hSZWdleCk7Y29uc3QgbmV3Rm9jdXNFbGVtZW50PXRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHNbaW5kZXhdO2lmKG5ld0ZvY3VzRWxlbWVudCl7dGhpcy5fdXBkYXRlU2VhcmNoSW5kZXgoaW5kZXgpO25ld0ZvY3VzRWxlbWVudC5zZXRTZWFyY2hSZWdleCh0aGlzLl9zZWFyY2hSZWdleCxVSS5oaWdobGlnaHRlZEN1cnJlbnRTZWFyY2hSZXN1bHRDbGFzc05hbWUpO25ld0ZvY3VzRWxlbWVudC5yZXZlYWwoKTt9ZWxzZXt0aGlzLl91cGRhdGVTZWFyY2hJbmRleCgwKTt9fQpfdXBkYXRlU2VhcmNoQ291bnQoY291bnQpe2lmKCF0aGlzLl9zZWFyY2hhYmxlVmlldykKcmV0dXJuO3RoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZVNlYXJjaE1hdGNoZXNDb3VudChjb3VudCk7fQpfdXBkYXRlU2VhcmNoSW5kZXgoaW5kZXgpe3RoaXMuX2N1cnJlbnRTZWFyY2hGb2N1c0luZGV4PWluZGV4O2lmKCF0aGlzLl9zZWFyY2hhYmxlVmlldykKcmV0dXJuO3RoaXMuX3NlYXJjaGFibGVWaWV3LnVwZGF0ZUN1cnJlbnRNYXRjaEluZGV4KGluZGV4KTt9CnNlYXJjaENhbmNlbGVkKCl7dGhpcy5fc2VhcmNoUmVnZXg9bnVsbDt0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzPVtdO2ZvcihsZXQgZWxlbWVudD10aGlzLl90cmVlT3V0bGluZS5yb290RWxlbWVudCgpO2VsZW1lbnQ7ZWxlbWVudD1lbGVtZW50LnRyYXZlcnNlTmV4dFRyZWVFbGVtZW50KGZhbHNlKSl7aWYoIShlbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0VUkuT2JqZWN0UHJvcGVydHlUcmVlRWxlbWVudCkpCmNvbnRpbnVlO2VsZW1lbnQucmV2ZXJ0SGlnaGxpZ2h0Q2hhbmdlcygpO30KdGhpcy5fdXBkYXRlU2VhcmNoQ291bnQoMCk7dGhpcy5fdXBkYXRlU2VhcmNoSW5kZXgoMCk7fQpwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpe2xldCBuZXdJbmRleD10aGlzLl9jdXJyZW50U2VhcmNoRm9jdXNJbmRleDtjb25zdCBwcmV2aW91c1NlYXJjaEZvY3VzRWxlbWVudD10aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzW25ld0luZGV4XTt0aGlzLnNlYXJjaENhbmNlbGVkKCk7dGhpcy5fc2VhcmNoUmVnZXg9c2VhcmNoQ29uZmlnLnRvU2VhcmNoUmVnZXgodHJ1ZSk7Zm9yKGxldCBlbGVtZW50PXRoaXMuX3RyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCk7ZWxlbWVudDtlbGVtZW50PWVsZW1lbnQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UpKXtpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RVSS5PYmplY3RQcm9wZXJ0eVRyZWVFbGVtZW50KSkKY29udGludWU7Y29uc3QgaGFzTWF0Y2g9ZWxlbWVudC5zZXRTZWFyY2hSZWdleCh0aGlzLl9zZWFyY2hSZWdleCk7aWYoaGFzTWF0Y2gpCnRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHMucHVzaChlbGVtZW50KTtpZihwcmV2aW91c1NlYXJjaEZvY3VzRWxlbWVudD09PWVsZW1lbnQpe2NvbnN0IGN1cnJlbnRJbmRleD10aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aC0xO2lmKGhhc01hdGNofHxqdW1wQmFja3dhcmRzKQpuZXdJbmRleD1jdXJyZW50SW5kZXg7ZWxzZQpuZXdJbmRleD1jdXJyZW50SW5kZXgrMTt9fQp0aGlzLl91cGRhdGVTZWFyY2hDb3VudCh0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCk7aWYoIXRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHMubGVuZ3RoKXt0aGlzLl91cGRhdGVTZWFyY2hJbmRleCgwKTtyZXR1cm47fQpuZXdJbmRleD1tb2QobmV3SW5kZXgsdGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgpO3RoaXMuX2p1bXBUb01hdGNoKG5ld0luZGV4KTt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgpCnJldHVybjtjb25zdCBuZXdJbmRleD1tb2QodGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXgrMSx0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCk7dGhpcy5fanVtcFRvTWF0Y2gobmV3SW5kZXgpO30KanVtcFRvUHJldmlvdXNTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgpCnJldHVybjtjb25zdCBuZXdJbmRleD1tb2QodGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXgtMSx0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCk7dGhpcy5fanVtcFRvTWF0Y2gobmV3SW5kZXgpO30Kc3VwcG9ydHNDYXNlU2Vuc2l0aXZlU2VhcmNoKCl7cmV0dXJuIHRydWU7fQpzdXBwb3J0c1JlZ2V4U2VhcmNoKCl7cmV0dXJuIHRydWU7fX07U291cmNlRnJhbWUuUGFyc2VkSlNPTj1jbGFzc3tjb25zdHJ1Y3RvcihkYXRhLHByZWZpeCxzdWZmaXgpe3RoaXMuZGF0YT1kYXRhO3RoaXMucHJlZml4PXByZWZpeDt0aGlzLnN1ZmZpeD1zdWZmaXg7fX07O1NvdXJjZUZyYW1lLlhNTFZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5XaWRnZXR7Y29uc3RydWN0b3IocGFyc2VkWE1MKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZV9mcmFtZS94bWxWaWV3LmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2hhZG93LXhtbC12aWV3Jywnc291cmNlLWNvZGUnKTt0aGlzLl90cmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMuX3RyZWVPdXRsaW5lLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZV9mcmFtZS94bWxUcmVlLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudCk7dGhpcy5fc2VhcmNoYWJsZVZpZXc7dGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXg9MDt0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzPVtdO3RoaXMuX3NlYXJjaENvbmZpZztTb3VyY2VGcmFtZS5YTUxWaWV3Lk5vZGUucG9wdWxhdGUodGhpcy5fdHJlZU91dGxpbmUscGFyc2VkWE1MLHRoaXMpO30Kc3RhdGljIGNyZWF0ZVNlYXJjaGFibGVWaWV3KHBhcnNlZFhNTCl7Y29uc3QgeG1sVmlldz1uZXcgU291cmNlRnJhbWUuWE1MVmlldyhwYXJzZWRYTUwpO2NvbnN0IHNlYXJjaGFibGVWaWV3PW5ldyBVSS5TZWFyY2hhYmxlVmlldyh4bWxWaWV3KTtzZWFyY2hhYmxlVmlldy5zZXRQbGFjZWhvbGRlcihDb21tb24uVUlTdHJpbmcoJ0ZpbmQnKSk7eG1sVmlldy5fc2VhcmNoYWJsZVZpZXc9c2VhcmNoYWJsZVZpZXc7eG1sVmlldy5zaG93KHNlYXJjaGFibGVWaWV3LmVsZW1lbnQpO3htbFZpZXcuY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsMCk7cmV0dXJuIHNlYXJjaGFibGVWaWV3O30Kc3RhdGljIHBhcnNlWE1MKHRleHQsbWltZVR5cGUpe2xldCBwYXJzZWRYTUw7dHJ5e3BhcnNlZFhNTD0obmV3IERPTVBhcnNlcigpKS5wYXJzZUZyb21TdHJpbmcodGV4dCxtaW1lVHlwZSk7fWNhdGNoKGUpe3JldHVybiBudWxsO30KaWYocGFyc2VkWE1MLmJvZHkpCnJldHVybiBudWxsO3JldHVybiBwYXJzZWRYTUw7fQpfanVtcFRvTWF0Y2goaW5kZXgsc2hvdWxkSnVtcCl7aWYoIXRoaXMuX3NlYXJjaENvbmZpZykKcmV0dXJuO2NvbnN0IHJlZ2V4PXRoaXMuX3NlYXJjaENvbmZpZy50b1NlYXJjaFJlZ2V4KHRydWUpO2NvbnN0IHByZXZpb3VzRm9jdXNFbGVtZW50PXRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHNbdGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXhdO2lmKHByZXZpb3VzRm9jdXNFbGVtZW50KQpwcmV2aW91c0ZvY3VzRWxlbWVudC5zZXRTZWFyY2hSZWdleChyZWdleCk7Y29uc3QgbmV3Rm9jdXNFbGVtZW50PXRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHNbaW5kZXhdO2lmKG5ld0ZvY3VzRWxlbWVudCl7dGhpcy5fdXBkYXRlU2VhcmNoSW5kZXgoaW5kZXgpO2lmKHNob3VsZEp1bXApCm5ld0ZvY3VzRWxlbWVudC5yZXZlYWwodHJ1ZSk7bmV3Rm9jdXNFbGVtZW50LnNldFNlYXJjaFJlZ2V4KHJlZ2V4LFVJLmhpZ2hsaWdodGVkQ3VycmVudFNlYXJjaFJlc3VsdENsYXNzTmFtZSk7fWVsc2V7dGhpcy5fdXBkYXRlU2VhcmNoSW5kZXgoMCk7fX0KX3VwZGF0ZVNlYXJjaENvdW50KGNvdW50KXtpZighdGhpcy5fc2VhcmNoYWJsZVZpZXcpCnJldHVybjt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVTZWFyY2hNYXRjaGVzQ291bnQoY291bnQpO30KX3VwZGF0ZVNlYXJjaEluZGV4KGluZGV4KXt0aGlzLl9jdXJyZW50U2VhcmNoRm9jdXNJbmRleD1pbmRleDtpZighdGhpcy5fc2VhcmNoYWJsZVZpZXcpCnJldHVybjt0aGlzLl9zZWFyY2hhYmxlVmlldy51cGRhdGVDdXJyZW50TWF0Y2hJbmRleChpbmRleCk7fQpfaW5uZXJQZXJmb3JtU2VhcmNoKHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7aWYoIXRoaXMuX3NlYXJjaENvbmZpZykKcmV0dXJuO2xldCBuZXdJbmRleD10aGlzLl9jdXJyZW50U2VhcmNoRm9jdXNJbmRleDtjb25zdCBwcmV2aW91c1NlYXJjaEZvY3VzRWxlbWVudD10aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzW25ld0luZGV4XTt0aGlzLl9pbm5lclNlYXJjaENhbmNlbGVkKCk7dGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cz1bXTtjb25zdCByZWdleD10aGlzLl9zZWFyY2hDb25maWcudG9TZWFyY2hSZWdleCh0cnVlKTtmb3IobGV0IGVsZW1lbnQ9dGhpcy5fdHJlZU91dGxpbmUucm9vdEVsZW1lbnQoKTtlbGVtZW50O2VsZW1lbnQ9ZWxlbWVudC50cmF2ZXJzZU5leHRUcmVlRWxlbWVudChmYWxzZSkpe2lmKCEoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZUZyYW1lLlhNTFZpZXcuTm9kZSkpCmNvbnRpbnVlO2NvbnN0IGhhc01hdGNoPWVsZW1lbnQuc2V0U2VhcmNoUmVnZXgocmVnZXgpO2lmKGhhc01hdGNoKQp0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLnB1c2goZWxlbWVudCk7aWYocHJldmlvdXNTZWFyY2hGb2N1c0VsZW1lbnQ9PT1lbGVtZW50KXtjb25zdCBjdXJyZW50SW5kZXg9dGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgtMTtpZihoYXNNYXRjaHx8anVtcEJhY2t3YXJkcykKbmV3SW5kZXg9Y3VycmVudEluZGV4O2Vsc2UKbmV3SW5kZXg9Y3VycmVudEluZGV4KzE7fX0KdGhpcy5fdXBkYXRlU2VhcmNoQ291bnQodGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgpO2lmKCF0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCl7dGhpcy5fdXBkYXRlU2VhcmNoSW5kZXgoMCk7cmV0dXJuO30KbmV3SW5kZXg9bW9kKG5ld0luZGV4LHRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHMubGVuZ3RoKTt0aGlzLl9qdW1wVG9NYXRjaChuZXdJbmRleCxzaG91bGRKdW1wKTt9Cl9pbm5lclNlYXJjaENhbmNlbGVkKCl7Zm9yKGxldCBlbGVtZW50PXRoaXMuX3RyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCk7ZWxlbWVudDtlbGVtZW50PWVsZW1lbnQudHJhdmVyc2VOZXh0VHJlZUVsZW1lbnQoZmFsc2UpKXtpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBTb3VyY2VGcmFtZS5YTUxWaWV3Lk5vZGUpKQpjb250aW51ZTtlbGVtZW50LnJldmVydEhpZ2hsaWdodENoYW5nZXMoKTt9CnRoaXMuX3VwZGF0ZVNlYXJjaENvdW50KDApO3RoaXMuX3VwZGF0ZVNlYXJjaEluZGV4KDApO30Kc2VhcmNoQ2FuY2VsZWQoKXt0aGlzLl9zZWFyY2hDb25maWc9bnVsbDt0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzPVtdO3RoaXMuX2lubmVyU2VhcmNoQ2FuY2VsZWQoKTt9CnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7dGhpcy5fc2VhcmNoQ29uZmlnPXNlYXJjaENvbmZpZzt0aGlzLl9pbm5lclBlcmZvcm1TZWFyY2goc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKTt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fY3VycmVudFNlYXJjaFRyZWVFbGVtZW50cy5sZW5ndGgpCnJldHVybjtjb25zdCBuZXdJbmRleD1tb2QodGhpcy5fY3VycmVudFNlYXJjaEZvY3VzSW5kZXgrMSx0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCk7dGhpcy5fanVtcFRvTWF0Y2gobmV3SW5kZXgsdHJ1ZSk7fQpqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9jdXJyZW50U2VhcmNoVHJlZUVsZW1lbnRzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IG5ld0luZGV4PW1vZCh0aGlzLl9jdXJyZW50U2VhcmNoRm9jdXNJbmRleC0xLHRoaXMuX2N1cnJlbnRTZWFyY2hUcmVlRWxlbWVudHMubGVuZ3RoKTt0aGlzLl9qdW1wVG9NYXRjaChuZXdJbmRleCx0cnVlKTt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiB0cnVlO319O1NvdXJjZUZyYW1lLlhNTFZpZXcuTm9kZT1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKG5vZGUsY2xvc2VUYWcseG1sVmlldyl7c3VwZXIoJycsIWNsb3NlVGFnJiYhIW5vZGUuY2hpbGRFbGVtZW50Q291bnQpO3RoaXMuX25vZGU9bm9kZTt0aGlzLl9jbG9zZVRhZz1jbG9zZVRhZzt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy5faGlnaGxpZ2h0Q2hhbmdlcz1bXTt0aGlzLl94bWxWaWV3PXhtbFZpZXc7dGhpcy5fdXBkYXRlVGl0bGUoKTt9CnN0YXRpYyBwb3B1bGF0ZShyb290LHhtbE5vZGUseG1sVmlldyl7bGV0IG5vZGU9eG1sTm9kZS5maXJzdENoaWxkO3doaWxlKG5vZGUpe2NvbnN0IGN1cnJlbnROb2RlPW5vZGU7bm9kZT1ub2RlLm5leHRTaWJsaW5nO2NvbnN0IG5vZGVUeXBlPWN1cnJlbnROb2RlLm5vZGVUeXBlO2lmKG5vZGVUeXBlPT09MyYmY3VycmVudE5vZGUubm9kZVZhbHVlLm1hdGNoKC9ccysvKSkKY29udGludWU7aWYoKG5vZGVUeXBlIT09MSkmJihub2RlVHlwZSE9PTMpJiYobm9kZVR5cGUhPT00KSYmKG5vZGVUeXBlIT09NykmJihub2RlVHlwZSE9PTgpKQpjb250aW51ZTtyb290LmFwcGVuZENoaWxkKG5ldyBTb3VyY2VGcmFtZS5YTUxWaWV3Lk5vZGUoY3VycmVudE5vZGUsZmFsc2UseG1sVmlldykpO319CnNldFNlYXJjaFJlZ2V4KHJlZ2V4LGFkZGl0aW9uYWxDc3NDbGFzc05hbWUpe3RoaXMucmV2ZXJ0SGlnaGxpZ2h0Q2hhbmdlcygpO2lmKCFyZWdleCkKcmV0dXJuIGZhbHNlO2lmKHRoaXMuX2Nsb3NlVGFnJiZ0aGlzLnBhcmVudCYmIXRoaXMucGFyZW50LmV4cGFuZGVkKQpyZXR1cm4gZmFsc2U7cmVnZXgubGFzdEluZGV4PTA7bGV0IGNzc0NsYXNzZXM9VUkuaGlnaGxpZ2h0ZWRTZWFyY2hSZXN1bHRDbGFzc05hbWU7aWYoYWRkaXRpb25hbENzc0NsYXNzTmFtZSkKY3NzQ2xhc3Nlcys9JyAnK2FkZGl0aW9uYWxDc3NDbGFzc05hbWU7Y29uc3QgY29udGVudD10aGlzLmxpc3RJdGVtRWxlbWVudC50ZXh0Q29udGVudC5yZXBsYWNlKC9ceEEwL2csJyAnKTtsZXQgbWF0Y2g9cmVnZXguZXhlYyhjb250ZW50KTtjb25zdCByYW5nZXM9W107d2hpbGUobWF0Y2gpe3Jhbmdlcy5wdXNoKG5ldyBUZXh0VXRpbHMuU291cmNlUmFuZ2UobWF0Y2guaW5kZXgsbWF0Y2hbMF0ubGVuZ3RoKSk7bWF0Y2g9cmVnZXguZXhlYyhjb250ZW50KTt9CmlmKHJhbmdlcy5sZW5ndGgpClVJLmhpZ2hsaWdodFJhbmdlc1dpdGhTdHlsZUNsYXNzKHRoaXMubGlzdEl0ZW1FbGVtZW50LHJhbmdlcyxjc3NDbGFzc2VzLHRoaXMuX2hpZ2hsaWdodENoYW5nZXMpO3JldHVybiEhdGhpcy5faGlnaGxpZ2h0Q2hhbmdlcy5sZW5ndGg7fQpyZXZlcnRIaWdobGlnaHRDaGFuZ2VzKCl7VUkucmV2ZXJ0RG9tQ2hhbmdlcyh0aGlzLl9oaWdobGlnaHRDaGFuZ2VzKTt0aGlzLl9oaWdobGlnaHRDaGFuZ2VzPVtdO30KX3VwZGF0ZVRpdGxlKCl7Y29uc3Qgbm9kZT10aGlzLl9ub2RlO3N3aXRjaChub2RlLm5vZGVUeXBlKXtjYXNlIDE6Y29uc3QgdGFnPW5vZGUudGFnTmFtZTtpZih0aGlzLl9jbG9zZVRhZyl7dGhpcy5fc2V0VGl0bGUoWyc8LycrdGFnKyc+Jywnc2hhZG93LXhtbC12aWV3LXRhZyddKTtyZXR1cm47fQpjb25zdCB0aXRsZUl0ZW1zPVsnPCcrdGFnLCdzaGFkb3cteG1sLXZpZXctdGFnJ107Y29uc3QgYXR0cmlidXRlcz1ub2RlLmF0dHJpYnV0ZXM7Zm9yKGxldCBpPTA7aTxhdHRyaWJ1dGVzLmxlbmd0aDsrK2kpe2NvbnN0IGF0dHJpYnV0ZU5vZGU9YXR0cmlidXRlcy5pdGVtKGkpO3RpdGxlSXRlbXMucHVzaCgnXHUwMGEwJywnc2hhZG93LXhtbC12aWV3LXRhZycsYXR0cmlidXRlTm9kZS5uYW1lLCdzaGFkb3cteG1sLXZpZXctYXR0cmlidXRlLW5hbWUnLCc9IicsJ3NoYWRvdy14bWwtdmlldy10YWcnLGF0dHJpYnV0ZU5vZGUudmFsdWUsJ3NoYWRvdy14bWwtdmlldy1hdHRyaWJ1dGUtdmFsdWUnLCciJywnc2hhZG93LXhtbC12aWV3LXRhZycpO30KaWYoIXRoaXMuZXhwYW5kZWQpe2lmKG5vZGUuY2hpbGRFbGVtZW50Q291bnQpe3RpdGxlSXRlbXMucHVzaCgnPicsJ3NoYWRvdy14bWwtdmlldy10YWcnLCdcdTIwMjYnLCdzaGFkb3cteG1sLXZpZXctY29tbWVudCcsJzwvJyt0YWcsJ3NoYWRvdy14bWwtdmlldy10YWcnKTt9ZWxzZSBpZih0aGlzLl9ub2RlLnRleHRDb250ZW50KXt0aXRsZUl0ZW1zLnB1c2goJz4nLCdzaGFkb3cteG1sLXZpZXctdGFnJyxub2RlLnRleHRDb250ZW50LCdzaGFkb3cteG1sLXZpZXctdGV4dCcsJzwvJyt0YWcsJ3NoYWRvdy14bWwtdmlldy10YWcnKTt9ZWxzZXt0aXRsZUl0ZW1zLnB1c2goJyAvJywnc2hhZG93LXhtbC12aWV3LXRhZycpO319CnRpdGxlSXRlbXMucHVzaCgnPicsJ3NoYWRvdy14bWwtdmlldy10YWcnKTt0aGlzLl9zZXRUaXRsZSh0aXRsZUl0ZW1zKTtyZXR1cm47Y2FzZSAzOnRoaXMuX3NldFRpdGxlKFtub2RlLm5vZGVWYWx1ZSwnc2hhZG93LXhtbC12aWV3LXRleHQnXSk7cmV0dXJuO2Nhc2UgNDp0aGlzLl9zZXRUaXRsZShbJzwhW0NEQVRBWycsJ3NoYWRvdy14bWwtdmlldy1jZGF0YScsbm9kZS5ub2RlVmFsdWUsJ3NoYWRvdy14bWwtdmlldy10ZXh0JywnXV0+Jywnc2hhZG93LXhtbC12aWV3LWNkYXRhJ10pO3JldHVybjtjYXNlIDc6dGhpcy5fc2V0VGl0bGUoWyc8Pycrbm9kZS5ub2RlTmFtZSsnICcrbm9kZS5ub2RlVmFsdWUrJz8+Jywnc2hhZG93LXhtbC12aWV3LXByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24nXSk7cmV0dXJuO2Nhc2UgODp0aGlzLl9zZXRUaXRsZShbJzwhLS0nK25vZGUubm9kZVZhbHVlKyctLT4nLCdzaGFkb3cteG1sLXZpZXctY29tbWVudCddKTtyZXR1cm47fX0KX3NldFRpdGxlKGl0ZW1zKXtjb25zdCB0aXRsZUZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGk9MDtpPGl0ZW1zLmxlbmd0aDtpKz0yKQp0aXRsZUZyYWdtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyxpdGVtc1tpKzFdKS50ZXh0Q29udGVudD1pdGVtc1tpXTt0aGlzLnRpdGxlPXRpdGxlRnJhZ21lbnQ7dGhpcy5feG1sVmlldy5faW5uZXJQZXJmb3JtU2VhcmNoKGZhbHNlLGZhbHNlKTt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc2hhZG93LXhtbC12aWV3LWNsb3NlLXRhZycsdGhpcy5fY2xvc2VUYWcpO30Kb25leHBhbmQoKXt0aGlzLl91cGRhdGVUaXRsZSgpO30Kb25jb2xsYXBzZSgpe3RoaXMuX3VwZGF0ZVRpdGxlKCk7fQpvbnBvcHVsYXRlKCl7U291cmNlRnJhbWUuWE1MVmlldy5Ob2RlLnBvcHVsYXRlKHRoaXMsdGhpcy5fbm9kZSx0aGlzLl94bWxWaWV3KTt0aGlzLmFwcGVuZENoaWxkKG5ldyBTb3VyY2VGcmFtZS5YTUxWaWV3Lk5vZGUodGhpcy5fbm9kZSx0cnVlLHRoaXMuX3htbFZpZXcpKTt9fTs7U291cmNlRnJhbWUuUHJldmlld0ZhY3Rvcnk9Y2xhc3N7c3RhdGljIGFzeW5jIGNyZWF0ZVByZXZpZXcocHJvdmlkZXIsbWltZVR5cGUpe2NvbnN0IGNvbnRlbnQ9YXdhaXQgcHJvdmlkZXIucmVxdWVzdENvbnRlbnQoKTtpZighY29udGVudCkKcmV0dXJuIG5ldyBVSS5FbXB0eVdpZGdldChDb21tb24uVUlTdHJpbmcoJ05vdGhpbmcgdG8gcHJldmlldycpKTtsZXQgcmVzb3VyY2VUeXBlPUNvbW1vbi5SZXNvdXJjZVR5cGUuZnJvbU1pbWVUeXBlKG1pbWVUeXBlKTtpZihyZXNvdXJjZVR5cGU9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5PdGhlcikKcmVzb3VyY2VUeXBlPXByb3ZpZGVyLmNvbnRlbnRUeXBlKCk7c3dpdGNoKHJlc291cmNlVHlwZSl7Y2FzZSBDb21tb24ucmVzb3VyY2VUeXBlcy5JbWFnZTpyZXR1cm4gbmV3IFNvdXJjZUZyYW1lLkltYWdlVmlldyhtaW1lVHlwZSxwcm92aWRlcik7Y2FzZSBDb21tb24ucmVzb3VyY2VUeXBlcy5Gb250OnJldHVybiBuZXcgU291cmNlRnJhbWUuRm9udFZpZXcobWltZVR5cGUscHJvdmlkZXIpO30KY29uc3QgcGFyc2VkWE1MPVNvdXJjZUZyYW1lLlhNTFZpZXcucGFyc2VYTUwoY29udGVudCxtaW1lVHlwZSk7aWYocGFyc2VkWE1MKQpyZXR1cm4gU291cmNlRnJhbWUuWE1MVmlldy5jcmVhdGVTZWFyY2hhYmxlVmlldyhwYXJzZWRYTUwpO2NvbnN0IGpzb25WaWV3PWF3YWl0IFNvdXJjZUZyYW1lLkpTT05WaWV3LmNyZWF0ZVZpZXcoY29udGVudCk7aWYoanNvblZpZXcpCnJldHVybiBqc29uVmlldztpZihyZXNvdXJjZVR5cGUuaXNUZXh0VHlwZSgpKXtjb25zdCBoaWdobGlnaHRlclR5cGU9cHJvdmlkZXIuY29udGVudFR5cGUoKS5jYW5vbmljYWxNaW1lVHlwZSgpfHxtaW1lVHlwZS5yZXBsYWNlKC87LiovLCcnKTtyZXR1cm4gU291cmNlRnJhbWUuUmVzb3VyY2VTb3VyY2VGcmFtZS5jcmVhdGVTZWFyY2hhYmxlVmlldyhwcm92aWRlcixoaWdobGlnaHRlclR5cGUsdHJ1ZSk7fQpyZXR1cm4gbnVsbDt9fTs7U291cmNlRnJhbWUuU291cmNlQ29kZURpZmY9Y2xhc3N7Y29uc3RydWN0b3IodGV4dEVkaXRvcil7dGhpcy5fdGV4dEVkaXRvcj10ZXh0RWRpdG9yO3RoaXMuX2FuaW1hdGVkTGluZXM9W107dGhpcy5fYW5pbWF0aW9uVGltZW91dD1udWxsO30KaGlnaGxpZ2h0TW9kaWZpZWRMaW5lcyhvbGRDb250ZW50LG5ld0NvbnRlbnQpe2lmKHR5cGVvZiBvbGRDb250ZW50IT09J3N0cmluZyd8fHR5cGVvZiBuZXdDb250ZW50IT09J3N0cmluZycpCnJldHVybjtjb25zdCBkaWZmPVNvdXJjZUZyYW1lLlNvdXJjZUNvZGVEaWZmLmNvbXB1dGVEaWZmKERpZmYuRGlmZi5saW5lRGlmZihvbGRDb250ZW50LnNwbGl0KCdcbicpLG5ld0NvbnRlbnQuc3BsaXQoJ1xuJykpKTtjb25zdCBjaGFuZ2VkTGluZXM9W107Zm9yKGxldCBpPTA7aTxkaWZmLmxlbmd0aDsrK2kpe2NvbnN0IGRpZmZFbnRyeT1kaWZmW2ldO2lmKGRpZmZFbnRyeS50eXBlPT09U291cmNlRnJhbWUuU291cmNlQ29kZURpZmYuRWRpdFR5cGUuRGVsZXRlKQpjb250aW51ZTtmb3IobGV0IGxpbmVOdW1iZXI9ZGlmZkVudHJ5LmZyb207bGluZU51bWJlcjxkaWZmRW50cnkudG87KytsaW5lTnVtYmVyKXtjb25zdCBwb3NpdGlvbj10aGlzLl90ZXh0RWRpdG9yLnRleHRFZGl0b3JQb3NpdGlvbkhhbmRsZShsaW5lTnVtYmVyLDApO2lmKHBvc2l0aW9uKQpjaGFuZ2VkTGluZXMucHVzaChwb3NpdGlvbik7fX0KdGhpcy5fdXBkYXRlSGlnaGxpZ2h0ZWRMaW5lcyhjaGFuZ2VkTGluZXMpO3RoaXMuX2FuaW1hdGlvblRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl91cGRhdGVIaWdobGlnaHRlZExpbmVzLmJpbmQodGhpcyxbXSksNDAwKTt9Cl91cGRhdGVIaWdobGlnaHRlZExpbmVzKG5ld0xpbmVzKXtpZih0aGlzLl9hbmltYXRpb25UaW1lb3V0KQpjbGVhclRpbWVvdXQodGhpcy5fYW5pbWF0aW9uVGltZW91dCk7dGhpcy5fYW5pbWF0aW9uVGltZW91dD1udWxsO3RoaXMuX3RleHRFZGl0b3Iub3BlcmF0aW9uKG9wZXJhdGlvbi5iaW5kKHRoaXMpKTtmdW5jdGlvbiBvcGVyYXRpb24oKXt0b2dnbGVMaW5lcy5jYWxsKHRoaXMsZmFsc2UpO3RoaXMuX2FuaW1hdGVkTGluZXM9bmV3TGluZXM7dG9nZ2xlTGluZXMuY2FsbCh0aGlzLHRydWUpO30KZnVuY3Rpb24gdG9nZ2xlTGluZXModmFsdWUpe2ZvcihsZXQgaT0wO2k8dGhpcy5fYW5pbWF0ZWRMaW5lcy5sZW5ndGg7KytpKXtjb25zdCBsb2NhdGlvbj10aGlzLl9hbmltYXRlZExpbmVzW2ldLnJlc29sdmUoKTtpZihsb2NhdGlvbikKdGhpcy5fdGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MobG9jYXRpb24ubGluZU51bWJlciwnaGlnaGxpZ2h0LWxpbmUtbW9kaWZpY2F0aW9uJyx2YWx1ZSk7fX19CnN0YXRpYyBjb21wdXRlRGlmZihkaWZmKXtjb25zdCByZXN1bHQ9W107bGV0IGhhc0FkZGVkPWZhbHNlO2xldCBoYXNSZW1vdmVkPWZhbHNlO2xldCBibG9ja1N0YXJ0TGluZU51bWJlcj0wO2xldCBjdXJyZW50TGluZU51bWJlcj0wO2xldCBpc0luc2lkZUJsb2NrPWZhbHNlO2ZvcihsZXQgaT0wO2k8ZGlmZi5sZW5ndGg7KytpKXtjb25zdCB0b2tlbj1kaWZmW2ldO2lmKHRva2VuWzBdPT09RGlmZi5EaWZmLk9wZXJhdGlvbi5FcXVhbCl7aWYoaXNJbnNpZGVCbG9jaykKZmx1c2goKTtjdXJyZW50TGluZU51bWJlcis9dG9rZW5bMV0ubGVuZ3RoO2NvbnRpbnVlO30KaWYoIWlzSW5zaWRlQmxvY2spe2lzSW5zaWRlQmxvY2s9dHJ1ZTtibG9ja1N0YXJ0TGluZU51bWJlcj1jdXJyZW50TGluZU51bWJlcjt9CmlmKHRva2VuWzBdPT09RGlmZi5EaWZmLk9wZXJhdGlvbi5EZWxldGUpe2hhc1JlbW92ZWQ9dHJ1ZTt9ZWxzZXtjdXJyZW50TGluZU51bWJlcis9dG9rZW5bMV0ubGVuZ3RoO2hhc0FkZGVkPXRydWU7fX0KaWYoaXNJbnNpZGVCbG9jaykKZmx1c2goKTtpZihyZXN1bHQubGVuZ3RoPjEmJnJlc3VsdFswXS5mcm9tPT09MCYmcmVzdWx0WzFdLmZyb209PT0wKXtjb25zdCBtZXJnZWQ9e3R5cGU6U291cmNlRnJhbWUuU291cmNlQ29kZURpZmYuRWRpdFR5cGUuTW9kaWZ5LGZyb206MCx0bzpyZXN1bHRbMV0udG99O3Jlc3VsdC5zcGxpY2UoMCwyLG1lcmdlZCk7fQpyZXR1cm4gcmVzdWx0O2Z1bmN0aW9uIGZsdXNoKCl7bGV0IHR5cGU9U291cmNlRnJhbWUuU291cmNlQ29kZURpZmYuRWRpdFR5cGUuSW5zZXJ0O2xldCBmcm9tPWJsb2NrU3RhcnRMaW5lTnVtYmVyO2xldCB0bz1jdXJyZW50TGluZU51bWJlcjtpZihoYXNBZGRlZCYmaGFzUmVtb3ZlZCl7dHlwZT1Tb3VyY2VGcmFtZS5Tb3VyY2VDb2RlRGlmZi5FZGl0VHlwZS5Nb2RpZnk7fWVsc2UgaWYoIWhhc0FkZGVkJiZoYXNSZW1vdmVkJiZmcm9tPT09MCYmdG89PT0wKXt0eXBlPVNvdXJjZUZyYW1lLlNvdXJjZUNvZGVEaWZmLkVkaXRUeXBlLk1vZGlmeTt0bz0xO31lbHNlIGlmKCFoYXNBZGRlZCYmaGFzUmVtb3ZlZCl7dHlwZT1Tb3VyY2VGcmFtZS5Tb3VyY2VDb2RlRGlmZi5FZGl0VHlwZS5EZWxldGU7ZnJvbS09MTt9CnJlc3VsdC5wdXNoKHt0eXBlOnR5cGUsZnJvbTpmcm9tLHRvOnRvfSk7aXNJbnNpZGVCbG9jaz1mYWxzZTtoYXNBZGRlZD1mYWxzZTtoYXNSZW1vdmVkPWZhbHNlO319fTtTb3VyY2VGcmFtZS5Tb3VyY2VDb2RlRGlmZi5FZGl0VHlwZT17SW5zZXJ0OlN5bWJvbCgnSW5zZXJ0JyksRGVsZXRlOlN5bWJvbCgnRGVsZXRlJyksTW9kaWZ5OlN5bWJvbCgnTW9kaWZ5JyksfTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNvdXJjZV9mcmFtZS9mb250Vmlldy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmZvbnQtdmlldyB7XG4gICAgZm9udC1zaXplOiA2MHB4O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDE1cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlX2ZyYW1lL2ZvbnRWaWV3LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNvdXJjZV9mcmFtZS9pbWFnZVZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5pbWFnZS12aWV3IHtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLmltYWdlLXZpZXcgPiAuaW1hZ2Uge1xuICAgIHBhZGRpbmc6IDIwcHggMjBweCAxMHB4IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uaW1hZ2UtdmlldyBpbWcucmVzb3VyY2UtaW1hZ2UtdmlldyB7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIG1heC1oZWlnaHQ6IDEwMDBweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2NoZWNrZXIucG5nKTtcbiAgICBib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIC13ZWJraXQtdXNlci1kcmFnOiBhdXRvO1xufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZV9mcmFtZS9pbWFnZVZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlX2ZyYW1lL2pzb25WaWV3LmNzcyJdPSIuanNvbi12aWV3IHtcbiAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZV9mcmFtZS9qc29uVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzb3VyY2VfZnJhbWUvbWVzc2FnZXNQb3BvdmVyLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50ZXh0LWVkaXRvci1tZXNzYWdlcy1kZXNjcmlwdGlvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnRleHQtZWRpdG9yLXJvdy1tZXNzYWdlOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xufVxuXG4udGV4dC1lZGl0b3Itcm93LW1lc3NhZ2Uge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIG1hcmdpbi10b3A6IDJweDtcbn1cblxuLnRleHQtZWRpdG9yLXJvdy1tZXNzYWdlLXJlcGVhdC1jb3VudCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwLjVlbTtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VfZnJhbWUvbWVzc2FnZXNQb3BvdmVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNvdXJjZV9mcmFtZS94bWxUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50cmVlLW91dGxpbmUgb2wge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgLXdlYmtpdC1wYWRkaW5nLXN0YXJ0OiAxNnB4O1xufVxuXG5vbC50cmVlLW91dGxpbmUge1xuICAgIC13ZWJraXQtcGFkZGluZy1zdGFydDogMDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSB7XG4gICAgbWluLWhlaWdodDogMTJweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaS5zaGFkb3cteG1sLXZpZXctY2xvc2UtdGFnIHtcbiAgICBtYXJnaW4tbGVmdDogLTE2cHg7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctdGFnIHtcbiAgICBjb2xvcjogcmdiKDEzNiwgMTgsIDEyOCk7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctY29tbWVudCB7XG4gICAgY29sb3I6IHJnYigzNSwgMTEwLCAzNyk7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctcHJvY2Vzc2luZy1pbnN0cnVjdGlvbiB7XG4gICAgY29sb3I6IHJnYigzNSwgMTEwLCAzNyk7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctYXR0cmlidXRlLW5hbWUge1xuICAgIGNvbG9yOiByZ2IoMTUzLCA2OSwgMCk7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctYXR0cmlidXRlLXZhbHVlIHtcbiAgICBjb2xvcjogcmdiKDI2LCAyNiwgMTY2KTtcbn1cblxuLnNoYWRvdy14bWwtdmlldy10ZXh0IHtcbiAgICBjb2xvcjogcmdiKDAsIDAsIDApO1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG59XG5cbi5zaGFkb3cteG1sLXZpZXctY2RhdGEge1xuICAgIGNvbG9yOiByZ2IoMCwgMCwgMCk7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlX2ZyYW1lL3htbFRyZWUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlX2ZyYW1lL3htbFZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zaGFkb3cteG1sLXZpZXcge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgcGFkZGluZzogMnB4IDRweDtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VfZnJhbWUveG1sVmlldy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzb3VyY2VfZnJhbWUvcmVzb3VyY2VTb3VyY2VGcmFtZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuLnNlYXJjaGFibGUtdmlldyB7XG4gIGZsZXg6IDE7XG59XG5cbi50b29sYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlX2ZyYW1lL3Jlc291cmNlU291cmNlRnJhbWUuY3NzICovIjtTb3VyY2VzLkFkZFNvdXJjZU1hcFVSTERpYWxvZz1jbGFzcyBleHRlbmRzIFVJLkhCb3h7Y29uc3RydWN0b3IoY2FsbGJhY2spe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc291cmNlcy9kaWFsb2cuY3NzJyk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnbGFiZWwnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1NvdXJjZSBtYXAgVVJMOiAnKTt0aGlzLl9pbnB1dD1VSS5jcmVhdGVJbnB1dCgpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faW5wdXQpO3RoaXMuX2lucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsJ3RleHQnKTt0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxmYWxzZSk7Y29uc3QgYWRkQnV0dG9uPXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2J1dHRvbicpO2FkZEJ1dHRvbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ0FkZCcpO2FkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fYXBwbHkuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5zZXREZWZhdWx0Rm9jdXNlZEVsZW1lbnQodGhpcy5faW5wdXQpO3RoaXMuX2NhbGxiYWNrPWNhbGxiYWNrO3RoaXMuY29udGVudEVsZW1lbnQudGFiSW5kZXg9MDt9CnN0YXRpYyBzaG93KGNhbGxiYWNrKXtjb25zdCBkaWFsb2c9bmV3IFVJLkRpYWxvZygpO2NvbnN0IGFkZFNvdXJjZU1hcFVSTERpYWxvZz1uZXcgU291cmNlcy5BZGRTb3VyY2VNYXBVUkxEaWFsb2coZG9uZSk7YWRkU291cmNlTWFwVVJMRGlhbG9nLnNob3coZGlhbG9nLmNvbnRlbnRFbGVtZW50KTtkaWFsb2cuc2V0U2l6ZUJlaGF2aW9yKFVJLkdsYXNzUGFuZS5TaXplQmVoYXZpb3IuTWVhc3VyZUNvbnRlbnQpO2RpYWxvZy5zaG93KCk7ZnVuY3Rpb24gZG9uZSh2YWx1ZSl7ZGlhbG9nLmhpZGUoKTtjYWxsYmFjayh2YWx1ZSk7fX0KX2FwcGx5KCl7dGhpcy5fY2FsbGJhY2sodGhpcy5faW5wdXQudmFsdWUpO30KX29uS2V5RG93bihldmVudCl7aWYoZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5FbnRlci5jb2RlKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FwcGx5KCk7fX19OztTb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuU2ltcGxlVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKENvbW1vbi5VSVN0cmluZygnQ2FsbCBTdGFjaycpLHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc291cmNlcy9jYWxsU3RhY2tTaWRlYmFyUGFuZS5jc3MnKTt0aGlzLl9ibGFja2JveGVkTWVzc2FnZUVsZW1lbnQ9dGhpcy5fY3JlYXRlQmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50KCk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9ibGFja2JveGVkTWVzc2FnZUVsZW1lbnQpO3RoaXMuX25vdFBhdXNlZE1lc3NhZ2VFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2dyYXktaW5mby1tZXNzYWdlJyk7dGhpcy5fbm90UGF1c2VkTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdOb3QgcGF1c2VkJyk7dGhpcy5faXRlbXM9bmV3IFVJLkxpc3RNb2RlbCgpO3RoaXMuX2xpc3Q9bmV3IFVJLkxpc3RDb250cm9sKHRoaXMuX2l0ZW1zLHRoaXMsVUkuTGlzdE1vZGUuTm9uVmlld3BvcnQpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbGlzdC5lbGVtZW50KTt0aGlzLl9saXN0LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbGlzdC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3Nob3dNb3JlTWVzc2FnZUVsZW1lbnQ9dGhpcy5fY3JlYXRlU2hvd01vcmVNZXNzYWdlRWxlbWVudCgpO3RoaXMuX3Nob3dNb3JlTWVzc2FnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zaG93TW9yZU1lc3NhZ2VFbGVtZW50KTt0aGlzLl9zaG93QmxhY2tib3hlZD1mYWxzZTtCaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlLmJpbmQodGhpcykpO3RoaXMuX2xvY2F0aW9uUG9vbD1uZXcgQmluZGluZ3MuTGl2ZUxvY2F0aW9uUG9vbCgpO3RoaXMuX3VwZGF0ZVRocm90dGxlcj1uZXcgQ29tbW9uLlRocm90dGxlcigxMDApO3RoaXMuX21heEFzeW5jU3RhY2tDaGFpbkRlcHRoPVNvdXJjZXMuQ2FsbFN0YWNrU2lkZWJhclBhbmUuX2RlZmF1bHRNYXhBc3luY1N0YWNrQ2hhaW5EZXB0aDt0aGlzLl91cGRhdGUoKTt9CmZsYXZvckNoYW5nZWQob2JqZWN0KXt0aGlzLl9zaG93QmxhY2tib3hlZD1mYWxzZTt0aGlzLl9tYXhBc3luY1N0YWNrQ2hhaW5EZXB0aD1Tb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lLl9kZWZhdWx0TWF4QXN5bmNTdGFja0NoYWluRGVwdGg7dGhpcy5fdXBkYXRlKCk7fQpfdXBkYXRlKCl7dGhpcy5fdXBkYXRlVGhyb3R0bGVyLnNjaGVkdWxlKCgpPT50aGlzLl9kb1VwZGF0ZSgpKTt9CmFzeW5jIF9kb1VwZGF0ZSgpe3RoaXMuX2xvY2F0aW9uUG9vbC5kaXNwb3NlQWxsKCk7Y29uc3QgZGV0YWlscz1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzKTtpZighZGV0YWlscyl7dGhpcy5fbm90UGF1c2VkTWVzc2FnZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5fYmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX3Nob3dNb3JlTWVzc2FnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dGhpcy5faXRlbXMucmVwbGFjZUFsbChbXSk7VUkuY29udGV4dC5zZXRGbGF2b3IoU0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lLG51bGwpO3JldHVybjt9CmxldCBkZWJ1Z2dlck1vZGVsPWRldGFpbHMuZGVidWdnZXJNb2RlbDt0aGlzLl9ub3RQYXVzZWRNZXNzYWdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtjb25zdCBzaG93QmxhY2tib3hlZD10aGlzLl9zaG93QmxhY2tib3hlZHx8ZGV0YWlscy5jYWxsRnJhbWVzLmV2ZXJ5KGZyYW1lPT5CaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuaXNCbGFja2JveGVkUmF3TG9jYXRpb24oZnJhbWUubG9jYXRpb24oKSkpO2xldCBoaWRkZW5DYWxsRnJhbWVzQ291bnQ9MDtsZXQgaXRlbXM9ZGV0YWlscy5jYWxsRnJhbWVzLm1hcChmcmFtZT0+KHtkZWJ1Z2dlckNhbGxGcmFtZTpmcmFtZSxkZWJ1Z2dlck1vZGVsOmRlYnVnZ2VyTW9kZWx9KSk7aWYoIXNob3dCbGFja2JveGVkKXtpdGVtcz1pdGVtcy5maWx0ZXIoaXRlbT0+IUJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5pc0JsYWNrYm94ZWRSYXdMb2NhdGlvbigodGhpcy5faXRlbUxvY2F0aW9uKGl0ZW0pKSkpO2hpZGRlbkNhbGxGcmFtZXNDb3VudCs9ZGV0YWlscy5jYWxsRnJhbWVzLmxlbmd0aC1pdGVtcy5sZW5ndGg7fQpsZXQgYXN5bmNTdGFja1RyYWNlPWRldGFpbHMuYXN5bmNTdGFja1RyYWNlO2lmKCFhc3luY1N0YWNrVHJhY2UmJmRldGFpbHMuYXN5bmNTdGFja1RyYWNlSWQpe2lmKGRldGFpbHMuYXN5bmNTdGFja1RyYWNlSWQuZGVidWdnZXJJZCkKZGVidWdnZXJNb2RlbD1TREsuRGVidWdnZXJNb2RlbC5tb2RlbEZvckRlYnVnZ2VySWQoZGV0YWlscy5hc3luY1N0YWNrVHJhY2VJZC5kZWJ1Z2dlcklkKTthc3luY1N0YWNrVHJhY2U9ZGVidWdnZXJNb2RlbD9hd2FpdCBkZWJ1Z2dlck1vZGVsLmZldGNoQXN5bmNTdGFja1RyYWNlKGRldGFpbHMuYXN5bmNTdGFja1RyYWNlSWQpOm51bGw7fQpsZXQgcGV2aW91c1N0YWNrVHJhY2U9ZGV0YWlscy5jYWxsRnJhbWVzO2xldCBtYXhBc3luY1N0YWNrQ2hhaW5EZXB0aD10aGlzLl9tYXhBc3luY1N0YWNrQ2hhaW5EZXB0aDt3aGlsZShhc3luY1N0YWNrVHJhY2UmJm1heEFzeW5jU3RhY2tDaGFpbkRlcHRoPjApe2xldCB0aXRsZT0nJztjb25zdCBpc0F3YWl0PWFzeW5jU3RhY2tUcmFjZS5kZXNjcmlwdGlvbj09PSdhc3luYyBmdW5jdGlvbic7aWYoaXNBd2FpdCYmcGV2aW91c1N0YWNrVHJhY2UubGVuZ3RoJiZhc3luY1N0YWNrVHJhY2UuY2FsbEZyYW1lcy5sZW5ndGgpe2NvbnN0IGxhc3RQcmV2aW91c0ZyYW1lPXBldmlvdXNTdGFja1RyYWNlW3BldmlvdXNTdGFja1RyYWNlLmxlbmd0aC0xXTtjb25zdCBsYXN0UHJldmlvdXNGcmFtZU5hbWU9VUkuYmVhdXRpZnlGdW5jdGlvbk5hbWUobGFzdFByZXZpb3VzRnJhbWUuZnVuY3Rpb25OYW1lKTt0aXRsZT1VSS5hc3luY1N0YWNrVHJhY2VMYWJlbCgnYXdhaXQgaW4gJytsYXN0UHJldmlvdXNGcmFtZU5hbWUpO31lbHNle3RpdGxlPVVJLmFzeW5jU3RhY2tUcmFjZUxhYmVsKGFzeW5jU3RhY2tUcmFjZS5kZXNjcmlwdGlvbik7fQpsZXQgYXN5bmNJdGVtcz1hc3luY1N0YWNrVHJhY2UuY2FsbEZyYW1lcy5tYXAoZnJhbWU9Pih7cnVudGltZUNhbGxGcmFtZTpmcmFtZSxkZWJ1Z2dlck1vZGVsOmRlYnVnZ2VyTW9kZWx9KSk7aWYoIXNob3dCbGFja2JveGVkKXthc3luY0l0ZW1zPWFzeW5jSXRlbXMuZmlsdGVyKGl0ZW09PiFCaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuaXNCbGFja2JveGVkUmF3TG9jYXRpb24oKHRoaXMuX2l0ZW1Mb2NhdGlvbihpdGVtKSkpKTtoaWRkZW5DYWxsRnJhbWVzQ291bnQrPWFzeW5jU3RhY2tUcmFjZS5jYWxsRnJhbWVzLmxlbmd0aC1hc3luY0l0ZW1zLmxlbmd0aDt9CmlmKGFzeW5jSXRlbXMubGVuZ3RoKXtpdGVtcy5wdXNoKHthc3luY1N0YWNrSGVhZGVyOnRpdGxlfSk7aXRlbXM9aXRlbXMuY29uY2F0KGFzeW5jSXRlbXMpO30KLS1tYXhBc3luY1N0YWNrQ2hhaW5EZXB0aDtwZXZpb3VzU3RhY2tUcmFjZT1hc3luY1N0YWNrVHJhY2UuY2FsbEZyYW1lcztpZihhc3luY1N0YWNrVHJhY2UucGFyZW50KXthc3luY1N0YWNrVHJhY2U9YXN5bmNTdGFja1RyYWNlLnBhcmVudDt9ZWxzZSBpZihhc3luY1N0YWNrVHJhY2UucGFyZW50SWQpe2lmKGFzeW5jU3RhY2tUcmFjZS5wYXJlbnRJZC5kZWJ1Z2dlcklkKQpkZWJ1Z2dlck1vZGVsPVNESy5EZWJ1Z2dlck1vZGVsLm1vZGVsRm9yRGVidWdnZXJJZChhc3luY1N0YWNrVHJhY2UucGFyZW50SWQuZGVidWdnZXJJZCk7YXN5bmNTdGFja1RyYWNlPWRlYnVnZ2VyTW9kZWw/YXdhaXQgZGVidWdnZXJNb2RlbC5mZXRjaEFzeW5jU3RhY2tUcmFjZShhc3luY1N0YWNrVHJhY2UucGFyZW50SWQpOm51bGw7fWVsc2V7YXN5bmNTdGFja1RyYWNlPW51bGw7fX0KaWYoYXN5bmNTdGFja1RyYWNlKQp0aGlzLl9zaG93TW9yZU1lc3NhZ2VFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2Vsc2UKdGhpcy5fc2hvd01vcmVNZXNzYWdlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtpZighaGlkZGVuQ2FsbEZyYW1lc0NvdW50KXt0aGlzLl9ibGFja2JveGVkTWVzc2FnZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7fWVsc2V7aWYoaGlkZGVuQ2FsbEZyYW1lc0NvdW50PT09MSl7dGhpcy5fYmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50LmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCcxIHN0YWNrIGZyYW1lIGlzIGhpZGRlbiAoYmxhY2tib3hlZCkuJyk7fWVsc2V7dGhpcy5fYmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50LmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclZCBzdGFjayBmcmFtZXMgYXJlIGhpZGRlbiAoYmxhY2tib3hlZCkuJyxoaWRkZW5DYWxsRnJhbWVzQ291bnQpO30KdGhpcy5fYmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO30KdGhpcy5faXRlbXMucmVwbGFjZUFsbChpdGVtcyk7aWYodGhpcy5fbWF4QXN5bmNTdGFja0NoYWluRGVwdGg9PT1Tb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lLl9kZWZhdWx0TWF4QXN5bmNTdGFja0NoYWluRGVwdGgpCnRoaXMuX2xpc3Quc2VsZWN0TmV4dEl0ZW0odHJ1ZSxmYWxzZSk7dGhpcy5fdXBkYXRlZEZvclRlc3QoKTt9Cl91cGRhdGVkRm9yVGVzdCgpe30KY3JlYXRlRWxlbWVudEZvckl0ZW0oaXRlbSl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdjYWxsLWZyYW1lLWl0ZW0nKTtjb25zdCB0aXRsZT1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjYWxsLWZyYW1lLWl0ZW0tdGl0bGUnKTt0aXRsZS5jcmVhdGVDaGlsZCgnZGl2JywnY2FsbC1mcmFtZS10aXRsZS10ZXh0JykudGV4dENvbnRlbnQ9dGhpcy5faXRlbVRpdGxlKGl0ZW0pO2lmKGl0ZW0uYXN5bmNTdGFja0hlYWRlcikKZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhc3luYy1oZWFkZXInKTtjb25zdCBsb2NhdGlvbj10aGlzLl9pdGVtTG9jYXRpb24oaXRlbSk7aWYobG9jYXRpb24pe2lmKEJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5pc0JsYWNrYm94ZWRSYXdMb2NhdGlvbihsb2NhdGlvbikpCmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxhY2tib3hlZC1jYWxsLWZyYW1lJyk7ZnVuY3Rpb24gdXBkYXRlTG9jYXRpb24obGl2ZUxvY2F0aW9uKXtjb25zdCB1aUxvY2F0aW9uPWxpdmVMb2NhdGlvbi51aUxvY2F0aW9uKCk7aWYoIXVpTG9jYXRpb24pCnJldHVybjtjb25zdCB0ZXh0PXVpTG9jYXRpb24ubGlua1RleHQoKTtsaW5rRWxlbWVudC50ZXh0Q29udGVudD10ZXh0LnRyaW1NaWRkbGUoMzApO2xpbmtFbGVtZW50LnRpdGxlPXRleHQ7fQpjb25zdCBsaW5rRWxlbWVudD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdjYWxsLWZyYW1lLWxvY2F0aW9uJyk7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLmNyZWF0ZUNhbGxGcmFtZUxpdmVMb2NhdGlvbihsb2NhdGlvbix1cGRhdGVMb2NhdGlvbix0aGlzLl9sb2NhdGlvblBvb2wpO30KZWxlbWVudC5hcHBlbmRDaGlsZChVSS5JY29uLmNyZWF0ZSgnc21hbGxpY29uLXRoaWNrLXJpZ2h0LWFycm93Jywnc2VsZWN0ZWQtY2FsbC1mcmFtZS1pY29uJykpO3JldHVybiBlbGVtZW50O30KaGVpZ2h0Rm9ySXRlbShpdGVtKXtjb25zb2xlLmFzc2VydChmYWxzZSk7cmV0dXJuIDA7fQppc0l0ZW1TZWxlY3RhYmxlKGl0ZW0pe3JldHVybiEhaXRlbS5kZWJ1Z2dlckNhbGxGcmFtZTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO2lmKHRvRWxlbWVudCkKdG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7aWYodG8pCnRoaXMuX2FjdGl2YXRlSXRlbSh0byk7fQpfaXRlbVRpdGxlKGl0ZW0pe2lmKGl0ZW0uZGVidWdnZXJDYWxsRnJhbWUpCnJldHVybiBVSS5iZWF1dGlmeUZ1bmN0aW9uTmFtZShpdGVtLmRlYnVnZ2VyQ2FsbEZyYW1lLmZ1bmN0aW9uTmFtZSk7aWYoaXRlbS5ydW50aW1lQ2FsbEZyYW1lKQpyZXR1cm4gVUkuYmVhdXRpZnlGdW5jdGlvbk5hbWUoaXRlbS5ydW50aW1lQ2FsbEZyYW1lLmZ1bmN0aW9uTmFtZSk7cmV0dXJuIGl0ZW0uYXN5bmNTdGFja0hlYWRlcnx8Jyc7fQpfaXRlbUxvY2F0aW9uKGl0ZW0pe2lmKGl0ZW0uZGVidWdnZXJDYWxsRnJhbWUpCnJldHVybiBpdGVtLmRlYnVnZ2VyQ2FsbEZyYW1lLmxvY2F0aW9uKCk7aWYoIWl0ZW0uZGVidWdnZXJNb2RlbCkKcmV0dXJuIG51bGw7aWYoaXRlbS5ydW50aW1lQ2FsbEZyYW1lKXtjb25zdCBmcmFtZT1pdGVtLnJ1bnRpbWVDYWxsRnJhbWU7cmV0dXJuIG5ldyBTREsuRGVidWdnZXJNb2RlbC5Mb2NhdGlvbihpdGVtLmRlYnVnZ2VyTW9kZWwsZnJhbWUuc2NyaXB0SWQsZnJhbWUubGluZU51bWJlcixmcmFtZS5jb2x1bW5OdW1iZXIpO30KcmV0dXJuIG51bGw7fQpfY3JlYXRlQmxhY2tib3hlZE1lc3NhZ2VFbGVtZW50KCl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdibGFja2JveGVkLW1lc3NhZ2UnKTtlbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJyk7Y29uc3Qgc2hvd0FsbExpbms9ZWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ2xpbmsnKTtzaG93QWxsTGluay50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1Nob3cnKTtzaG93QWxsTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9Pnt0aGlzLl9zaG93QmxhY2tib3hlZD10cnVlO3RoaXMuX3VwZGF0ZSgpO30sZmFsc2UpO3JldHVybiBlbGVtZW50O30KX2NyZWF0ZVNob3dNb3JlTWVzc2FnZUVsZW1lbnQoKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Nob3ctbW9yZS1tZXNzYWdlJyk7ZWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicpO2NvbnN0IHNob3dBbGxMaW5rPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdsaW5rJyk7c2hvd0FsbExpbmsudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTaG93IG1vcmUnKTtzaG93QWxsTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9Pnt0aGlzLl9tYXhBc3luY1N0YWNrQ2hhaW5EZXB0aCs9U291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZS5fZGVmYXVsdE1heEFzeW5jU3RhY2tDaGFpbkRlcHRoO3RoaXMuX3VwZGF0ZSgpO30sZmFsc2UpO3JldHVybiBlbGVtZW50O30KX29uQ29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGl0ZW09dGhpcy5fbGlzdC5pdGVtRm9yTm9kZSgoZXZlbnQudGFyZ2V0KSk7aWYoIWl0ZW0pCnJldHVybjtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO2lmKGl0ZW0uZGVidWdnZXJDYWxsRnJhbWUpCmNvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1Jlc3RhcnQgZnJhbWUnKSwoKT0+aXRlbS5kZWJ1Z2dlckNhbGxGcmFtZS5yZXN0YXJ0KCkpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvcHkgc3RhY2sgdHJhY2UnKSx0aGlzLl9jb3B5U3RhY2tUcmFjZS5iaW5kKHRoaXMpKTtjb25zdCBsb2NhdGlvbj10aGlzLl9pdGVtTG9jYXRpb24oaXRlbSk7Y29uc3QgdWlMb2NhdGlvbj1sb2NhdGlvbj9CaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24obG9jYXRpb24pOm51bGw7aWYodWlMb2NhdGlvbikKdGhpcy5hcHBlbmRCbGFja2JveFVSTENvbnRleHRNZW51SXRlbXMoY29udGV4dE1lbnUsdWlMb2NhdGlvbi51aVNvdXJjZUNvZGUpO2NvbnRleHRNZW51LnNob3coKTt9Cl9vbkNsaWNrKGV2ZW50KXtjb25zdCBpdGVtPXRoaXMuX2xpc3QuaXRlbUZvck5vZGUoKGV2ZW50LnRhcmdldCkpO2lmKGl0ZW0pCnRoaXMuX2FjdGl2YXRlSXRlbShpdGVtKTt9Cl9hY3RpdmF0ZUl0ZW0oaXRlbSl7Y29uc3QgbG9jYXRpb249dGhpcy5faXRlbUxvY2F0aW9uKGl0ZW0pO2lmKCFsb2NhdGlvbikKcmV0dXJuO2lmKGl0ZW0uZGVidWdnZXJDYWxsRnJhbWUmJlVJLmNvbnRleHQuZmxhdm9yKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSkhPT1pdGVtLmRlYnVnZ2VyQ2FsbEZyYW1lKXtpdGVtLmRlYnVnZ2VyTW9kZWwuc2V0U2VsZWN0ZWRDYWxsRnJhbWUoaXRlbS5kZWJ1Z2dlckNhbGxGcmFtZSk7VUkuY29udGV4dC5zZXRGbGF2b3IoU0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lLGl0ZW0uZGVidWdnZXJDYWxsRnJhbWUpO31lbHNle0NvbW1vbi5SZXZlYWxlci5yZXZlYWwoQmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKGxvY2F0aW9uKSk7fX0KYXBwZW5kQmxhY2tib3hVUkxDb250ZXh0TWVudUl0ZW1zKGNvbnRleHRNZW51LHVpU291cmNlQ29kZSl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7aWYoYmluZGluZykKdWlTb3VyY2VDb2RlPWJpbmRpbmcubmV0d29yaztpZih1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSkKcmV0dXJuO2NvbnN0IGNhbkJsYWNrYm94PUJpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5jYW5CbGFja2JveFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO2NvbnN0IGlzQmxhY2tib3hlZD1CaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuaXNCbGFja2JveGVkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7Y29uc3QgaXNDb250ZW50U2NyaXB0PXVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5Db250ZW50U2NyaXB0cztjb25zdCBtYW5hZ2VyPUJpbmRpbmdzLmJsYWNrYm94TWFuYWdlcjtpZihjYW5CbGFja2JveCl7aWYoaXNCbGFja2JveGVkKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdTdG9wIGJsYWNrYm94aW5nJyksbWFuYWdlci51bmJsYWNrYm94VUlTb3VyY2VDb2RlLmJpbmQobWFuYWdlcix1aVNvdXJjZUNvZGUpKTt9ZWxzZXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdCbGFja2JveCBzY3JpcHQnKSxtYW5hZ2VyLmJsYWNrYm94VUlTb3VyY2VDb2RlLmJpbmQobWFuYWdlcix1aVNvdXJjZUNvZGUpKTt9fQppZihpc0NvbnRlbnRTY3JpcHQpe2lmKGlzQmxhY2tib3hlZCl7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnU3RvcCBibGFja2JveGluZyBhbGwgY29udGVudCBzY3JpcHRzJyksbWFuYWdlci5ibGFja2JveENvbnRlbnRTY3JpcHRzLmJpbmQobWFuYWdlcikpO31lbHNle2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0JsYWNrYm94IGFsbCBjb250ZW50IHNjcmlwdHMnKSxtYW5hZ2VyLnVuYmxhY2tib3hDb250ZW50U2NyaXB0cy5iaW5kKG1hbmFnZXIpKTt9fX0KX3NlbGVjdE5leHRDYWxsRnJhbWVPblN0YWNrKCl7cmV0dXJuIHRoaXMuX2xpc3Quc2VsZWN0TmV4dEl0ZW0oZmFsc2UsZmFsc2UpO30KX3NlbGVjdFByZXZpb3VzQ2FsbEZyYW1lT25TdGFjaygpe3JldHVybiB0aGlzLl9saXN0LnNlbGVjdFByZXZpb3VzSXRlbShmYWxzZSxmYWxzZSk7fQpfY29weVN0YWNrVHJhY2UoKXtjb25zdCB0ZXh0PVtdO2Zvcihjb25zdCBpdGVtIG9mIHRoaXMuX2l0ZW1zKXtsZXQgaXRlbVRleHQ9dGhpcy5faXRlbVRpdGxlKGl0ZW0pO2NvbnN0IGxvY2F0aW9uPXRoaXMuX2l0ZW1Mb2NhdGlvbihpdGVtKTtjb25zdCB1aUxvY2F0aW9uPWxvY2F0aW9uP0JpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbihsb2NhdGlvbik6bnVsbDtpZih1aUxvY2F0aW9uKQppdGVtVGV4dCs9JyAoJyt1aUxvY2F0aW9uLmxpbmtUZXh0KHRydWUpKycpJzt0ZXh0LnB1c2goaXRlbVRleHQpO30KSW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KHRleHQuam9pbignXG4nKSk7fX07U291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZS5fZGVmYXVsdE1heEFzeW5jU3RhY2tDaGFpbkRlcHRoPTMyO1NvdXJjZXMuQ2FsbFN0YWNrU2lkZWJhclBhbmUuSXRlbTtTb3VyY2VzLkNhbGxTdGFja1NpZGViYXJQYW5lLkFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBjYWxsU3RhY2tTaWRlYmFyUGFuZT1zZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoU291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZSk7c3dpdGNoKGFjdGlvbklkKXtjYXNlJ2RlYnVnZ2VyLm5leHQtY2FsbC1mcmFtZSc6Y2FsbFN0YWNrU2lkZWJhclBhbmUuX3NlbGVjdE5leHRDYWxsRnJhbWVPblN0YWNrKCk7cmV0dXJuIHRydWU7Y2FzZSdkZWJ1Z2dlci5wcmV2aW91cy1jYWxsLWZyYW1lJzpjYWxsU3RhY2tTaWRlYmFyUGFuZS5fc2VsZWN0UHJldmlvdXNDYWxsRnJhbWVPblN0YWNrKCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fX07O1NvdXJjZXMuRGVidWdnZXJQYXVzZWRNZXNzYWdlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdwYXVzZWQtbWVzc2FnZSBmbGV4LW5vbmUnKTtjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLl9lbGVtZW50LCdzb3VyY2VzL2RlYnVnZ2VyUGF1c2VkTWVzc2FnZS5jc3MnKTt0aGlzLl9jb250ZW50RWxlbWVudD1yb290LmNyZWF0ZUNoaWxkKCdkaXYnKTt9CmVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudDt9CnN0YXRpYyBfZGVzY3JpcHRpb25XaXRob3V0U3RhY2soZGVzY3JpcHRpb24pe2NvbnN0IGZpcnN0Q2FsbEZyYW1lPS9eXHMrYXRccy9tLmV4ZWMoZGVzY3JpcHRpb24pO3JldHVybiBmaXJzdENhbGxGcmFtZT9kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCxmaXJzdENhbGxGcmFtZS5pbmRleC0xKTpkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCxkZXNjcmlwdGlvbi5sYXN0SW5kZXhPZignXG4nKSk7fQpzdGF0aWMgYXN5bmMgX2NyZWF0ZURPTUJyZWFrcG9pbnRIaXRNZXNzYWdlKGRldGFpbHMpe2NvbnN0IG1lc3NhZ2VXcmFwcGVyPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBkb21EZWJ1Z2dlck1vZGVsPWRldGFpbHMuZGVidWdnZXJNb2RlbC50YXJnZXQoKS5tb2RlbChTREsuRE9NRGVidWdnZXJNb2RlbCk7aWYoIWRldGFpbHMuYXV4RGF0YXx8IWRvbURlYnVnZ2VyTW9kZWwpCnJldHVybiBtZXNzYWdlV3JhcHBlcjtjb25zdCBkYXRhPWRvbURlYnVnZ2VyTW9kZWwucmVzb2x2ZURPTUJyZWFrcG9pbnREYXRhKChkZXRhaWxzLmF1eERhdGEpKTtpZighZGF0YSkKcmV0dXJuIG1lc3NhZ2VXcmFwcGVyO2NvbnN0IG1haW5FbGVtZW50PW1lc3NhZ2VXcmFwcGVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdzdGF0dXMtbWFpbicpO21haW5FbGVtZW50LmFwcGVuZENoaWxkKFVJLkljb24uY3JlYXRlKCdzbWFsbGljb24taW5mbycsJ3N0YXR1cy1pY29uJykpO21haW5FbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKFN0cmluZy5zcHJpbnRmKCdQYXVzZWQgb24gJXMnLFNvdXJjZXMuRGVidWdnZXJQYXVzZWRNZXNzYWdlLkJyZWFrcG9pbnRUeXBlTm91bnMuZ2V0KGRhdGEudHlwZSkpKSk7Y29uc3Qgc3ViRWxlbWVudD1tZXNzYWdlV3JhcHBlci5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhdHVzLXN1YiBtb25vc3BhY2UnKTtjb25zdCBsaW5raWZpZWROb2RlPWF3YWl0IENvbW1vbi5MaW5raWZpZXIubGlua2lmeShkYXRhLm5vZGUpO3N1YkVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua2lmaWVkTm9kZSk7aWYoZGF0YS50YXJnZXROb2RlKXtjb25zdCB0YXJnZXROb2RlTGluaz1hd2FpdCBDb21tb24uTGlua2lmaWVyLmxpbmtpZnkoZGF0YS50YXJnZXROb2RlKTtsZXQgbWVzc2FnZTtpZihkYXRhLmluc2VydGlvbikKbWVzc2FnZT1kYXRhLnRhcmdldE5vZGU9PT1kYXRhLm5vZGU/J0NoaWxkICVzIGFkZGVkJzonRGVzY2VuZGFudCAlcyBhZGRlZCc7ZWxzZQptZXNzYWdlPSdEZXNjZW5kYW50ICVzIHJlbW92ZWQnO3N1YkVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlRWxlbWVudCgnYnInKSk7c3ViRWxlbWVudC5hcHBlbmRDaGlsZChVSS5mb3JtYXRMb2NhbGl6ZWQobWVzc2FnZSxbdGFyZ2V0Tm9kZUxpbmtdKSk7fQpyZXR1cm4gbWVzc2FnZVdyYXBwZXI7fQphc3luYyByZW5kZXIoZGV0YWlscyxkZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcsYnJlYWtwb2ludE1hbmFnZXIpe3RoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5fY29udGVudEVsZW1lbnQuaGlkZGVuPSFkZXRhaWxzO2lmKCFkZXRhaWxzKQpyZXR1cm47Y29uc3Qgc3RhdHVzPXRoaXMuX2NvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwYXVzZWQtc3RhdHVzJyk7Y29uc3QgZXJyb3JMaWtlPWRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uRXhjZXB0aW9ufHxkZXRhaWxzLnJlYXNvbj09PVNESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uLlByb21pc2VSZWplY3Rpb258fGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uQXNzZXJ0fHxkZXRhaWxzLnJlYXNvbj09PVNESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uLk9PTTtsZXQgbWVzc2FnZVdyYXBwZXI7aWYoZGV0YWlscy5yZWFzb249PT1TREsuRGVidWdnZXJNb2RlbC5CcmVha1JlYXNvbi5ET00pe21lc3NhZ2VXcmFwcGVyPWF3YWl0IFNvdXJjZXMuRGVidWdnZXJQYXVzZWRNZXNzYWdlLl9jcmVhdGVET01CcmVha3BvaW50SGl0TWVzc2FnZShkZXRhaWxzKTt9ZWxzZSBpZihkZXRhaWxzLnJlYXNvbj09PVNESy5EZWJ1Z2dlck1vZGVsLkJyZWFrUmVhc29uLkV2ZW50TGlzdGVuZXIpe2xldCBldmVudE5hbWVGb3JVST0nJztpZihkZXRhaWxzLmF1eERhdGEpe2V2ZW50TmFtZUZvclVJPVNESy5kb21EZWJ1Z2dlck1hbmFnZXIucmVzb2x2ZUV2ZW50TGlzdGVuZXJCcmVha3BvaW50VGl0bGUoKGRldGFpbHMuYXV4RGF0YSkpO30KbWVzc2FnZVdyYXBwZXI9YnVpbGRXcmFwcGVyKENvbW1vbi5VSVN0cmluZygnUGF1c2VkIG9uIGV2ZW50IGxpc3RlbmVyJyksZXZlbnROYW1lRm9yVUkpO31lbHNlIGlmKGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uWEhSKXttZXNzYWdlV3JhcHBlcj1idWlsZFdyYXBwZXIoQ29tbW9uLlVJU3RyaW5nKCdQYXVzZWQgb24gWEhSIG9yIGZldGNoJyksZGV0YWlscy5hdXhEYXRhWyd1cmwnXXx8JycpO31lbHNlIGlmKGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uRXhjZXB0aW9uKXtjb25zdCBkZXNjcmlwdGlvbj1kZXRhaWxzLmF1eERhdGFbJ2Rlc2NyaXB0aW9uJ118fGRldGFpbHMuYXV4RGF0YVsndmFsdWUnXXx8Jyc7Y29uc3QgZGVzY3JpcHRpb25XaXRob3V0U3RhY2s9U291cmNlcy5EZWJ1Z2dlclBhdXNlZE1lc3NhZ2UuX2Rlc2NyaXB0aW9uV2l0aG91dFN0YWNrKGRlc2NyaXB0aW9uKTttZXNzYWdlV3JhcHBlcj1idWlsZFdyYXBwZXIoQ29tbW9uLlVJU3RyaW5nKCdQYXVzZWQgb24gZXhjZXB0aW9uJyksZGVzY3JpcHRpb25XaXRob3V0U3RhY2ssZGVzY3JpcHRpb24pO31lbHNlIGlmKGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uUHJvbWlzZVJlamVjdGlvbil7Y29uc3QgZGVzY3JpcHRpb249ZGV0YWlscy5hdXhEYXRhWydkZXNjcmlwdGlvbiddfHxkZXRhaWxzLmF1eERhdGFbJ3ZhbHVlJ118fCcnO2NvbnN0IGRlc2NyaXB0aW9uV2l0aG91dFN0YWNrPVNvdXJjZXMuRGVidWdnZXJQYXVzZWRNZXNzYWdlLl9kZXNjcmlwdGlvbldpdGhvdXRTdGFjayhkZXNjcmlwdGlvbik7bWVzc2FnZVdyYXBwZXI9YnVpbGRXcmFwcGVyKENvbW1vbi5VSVN0cmluZygnUGF1c2VkIG9uIHByb21pc2UgcmVqZWN0aW9uJyksZGVzY3JpcHRpb25XaXRob3V0U3RhY2ssZGVzY3JpcHRpb24pO31lbHNlIGlmKGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uQXNzZXJ0KXttZXNzYWdlV3JhcHBlcj1idWlsZFdyYXBwZXIoQ29tbW9uLlVJU3RyaW5nKCdQYXVzZWQgb24gYXNzZXJ0aW9uJykpO31lbHNlIGlmKGRldGFpbHMucmVhc29uPT09U0RLLkRlYnVnZ2VyTW9kZWwuQnJlYWtSZWFzb24uRGVidWdDb21tYW5kKXttZXNzYWdlV3JhcHBlcj1idWlsZFdyYXBwZXIoQ29tbW9uLlVJU3RyaW5nKCdQYXVzZWQgb24gZGVidWdnZWQgZnVuY3Rpb24nKSk7fWVsc2UgaWYoZGV0YWlscy5yZWFzb249PT1TREsuRGVidWdnZXJNb2RlbC5CcmVha1JlYXNvbi5PT00pe21lc3NhZ2VXcmFwcGVyPWJ1aWxkV3JhcHBlcihDb21tb24uVUlTdHJpbmcoJ1BhdXNlZCBiZWZvcmUgcG90ZW50aWFsIG91dC1vZi1tZW1vcnkgY3Jhc2gnKSk7fWVsc2UgaWYoZGV0YWlscy5jYWxsRnJhbWVzLmxlbmd0aCl7Y29uc3QgdWlMb2NhdGlvbj1kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24oZGV0YWlscy5jYWxsRnJhbWVzWzBdLmxvY2F0aW9uKCkpO2NvbnN0IGJyZWFrcG9pbnQ9dWlMb2NhdGlvbj9icmVha3BvaW50TWFuYWdlci5maW5kQnJlYWtwb2ludCh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSx1aUxvY2F0aW9uLmxpbmVOdW1iZXIsdWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpOm51bGw7Y29uc3QgZGVmYXVsdFRleHQ9YnJlYWtwb2ludD9Db21tb24uVUlTdHJpbmcoJ1BhdXNlZCBvbiBicmVha3BvaW50Jyk6Q29tbW9uLlVJU3RyaW5nKCdEZWJ1Z2dlciBwYXVzZWQnKTttZXNzYWdlV3JhcHBlcj1idWlsZFdyYXBwZXIoZGVmYXVsdFRleHQpO31lbHNle2NvbnNvbGUud2FybignU2NyaXB0c1BhbmVsIHBhdXNlZCwgYnV0IGNhbGxGcmFtZXMubGVuZ3RoIGlzIHplcm8uJyk7fQpzdGF0dXMuY2xhc3NMaXN0LnRvZ2dsZSgnZXJyb3ItcmVhc29uJyxlcnJvckxpa2UpO2lmKG1lc3NhZ2VXcmFwcGVyKQpzdGF0dXMuYXBwZW5kQ2hpbGQobWVzc2FnZVdyYXBwZXIpO2Z1bmN0aW9uIGJ1aWxkV3JhcHBlcihtYWluVGV4dCxzdWJUZXh0LHRpdGxlKXtjb25zdCBtZXNzYWdlV3JhcHBlcj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7Y29uc3QgbWFpbkVsZW1lbnQ9bWVzc2FnZVdyYXBwZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3N0YXR1cy1tYWluJyk7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZShlcnJvckxpa2U/J3NtYWxsaWNvbi1lcnJvcic6J3NtYWxsaWNvbi1pbmZvJywnc3RhdHVzLWljb24nKTttYWluRWxlbWVudC5hcHBlbmRDaGlsZChpY29uKTttYWluRWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVUZXh0Tm9kZShtYWluVGV4dCkpO2lmKHN1YlRleHQpe2NvbnN0IHN1YkVsZW1lbnQ9bWVzc2FnZVdyYXBwZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ3N0YXR1cy1zdWIgbW9ub3NwYWNlJyk7c3ViRWxlbWVudC50ZXh0Q29udGVudD1zdWJUZXh0O3N1YkVsZW1lbnQudGl0bGU9dGl0bGV8fHN1YlRleHQ7fQpyZXR1cm4gbWVzc2FnZVdyYXBwZXI7fX19O1NvdXJjZXMuRGVidWdnZXJQYXVzZWRNZXNzYWdlLkJyZWFrcG9pbnRUeXBlTm91bnM9bmV3IE1hcChbW1NESy5ET01EZWJ1Z2dlck1vZGVsLkRPTUJyZWFrcG9pbnQuVHlwZS5TdWJ0cmVlTW9kaWZpZWQsQ29tbW9uLlVJU3RyaW5nKCdzdWJ0cmVlIG1vZGlmaWNhdGlvbnMnKV0sW1NESy5ET01EZWJ1Z2dlck1vZGVsLkRPTUJyZWFrcG9pbnQuVHlwZS5BdHRyaWJ1dGVNb2RpZmllZCxDb21tb24uVUlTdHJpbmcoJ2F0dHJpYnV0ZSBtb2RpZmljYXRpb25zJyldLFtTREsuRE9NRGVidWdnZXJNb2RlbC5ET01CcmVha3BvaW50LlR5cGUuTm9kZVJlbW92ZWQsQ29tbW9uLlVJU3RyaW5nKCdub2RlIHJlbW92YWwnKV0sXSk7O1NvdXJjZXMuSGlzdG9yeUVudHJ5PWZ1bmN0aW9uKCl7fTtTb3VyY2VzLkhpc3RvcnlFbnRyeS5wcm90b3R5cGU9e3ZhbGlkKCl7fSxyZXZlYWwoKXt9fTtTb3VyY2VzLlNpbXBsZUhpc3RvcnlNYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKGhpc3RvcnlEZXB0aCl7dGhpcy5fZW50cmllcz1bXTt0aGlzLl9hY3RpdmVFbnRyeUluZGV4PS0xO3RoaXMuX2NvYWxlc2NpbmdSZWFkb25seT0wO3RoaXMuX2hpc3RvcnlEZXB0aD1oaXN0b3J5RGVwdGg7fQpyZWFkT25seUxvY2soKXsrK3RoaXMuX2NvYWxlc2NpbmdSZWFkb25seTt9CnJlbGVhc2VSZWFkT25seUxvY2soKXstLXRoaXMuX2NvYWxlc2NpbmdSZWFkb25seTt9CnJlYWRPbmx5KCl7cmV0dXJuISF0aGlzLl9jb2FsZXNjaW5nUmVhZG9ubHk7fQpmaWx0ZXJPdXQoZmlsdGVyT3V0Q2FsbGJhY2spe2lmKHRoaXMucmVhZE9ubHkoKSkKcmV0dXJuO2NvbnN0IGZpbHRlcmVkRW50cmllcz1bXTtsZXQgcmVtb3ZlZEJlZm9yZUFjdGl2ZUVudHJ5PTA7Zm9yKGxldCBpPTA7aTx0aGlzLl9lbnRyaWVzLmxlbmd0aDsrK2kpe2lmKCFmaWx0ZXJPdXRDYWxsYmFjayh0aGlzLl9lbnRyaWVzW2ldKSkKZmlsdGVyZWRFbnRyaWVzLnB1c2godGhpcy5fZW50cmllc1tpXSk7ZWxzZSBpZihpPD10aGlzLl9hY3RpdmVFbnRyeUluZGV4KQorK3JlbW92ZWRCZWZvcmVBY3RpdmVFbnRyeTt9CnRoaXMuX2VudHJpZXM9ZmlsdGVyZWRFbnRyaWVzO3RoaXMuX2FjdGl2ZUVudHJ5SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9hY3RpdmVFbnRyeUluZGV4LXJlbW92ZWRCZWZvcmVBY3RpdmVFbnRyeSk7fQplbXB0eSgpe3JldHVybiF0aGlzLl9lbnRyaWVzLmxlbmd0aDt9CmFjdGl2ZSgpe3JldHVybiB0aGlzLmVtcHR5KCk/bnVsbDp0aGlzLl9lbnRyaWVzW3RoaXMuX2FjdGl2ZUVudHJ5SW5kZXhdO30KcHVzaChlbnRyeSl7aWYodGhpcy5yZWFkT25seSgpKQpyZXR1cm47aWYoIXRoaXMuZW1wdHkoKSkKdGhpcy5fZW50cmllcy5zcGxpY2UodGhpcy5fYWN0aXZlRW50cnlJbmRleCsxKTt0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO2lmKHRoaXMuX2VudHJpZXMubGVuZ3RoPnRoaXMuX2hpc3RvcnlEZXB0aCkKdGhpcy5fZW50cmllcy5zaGlmdCgpO3RoaXMuX2FjdGl2ZUVudHJ5SW5kZXg9dGhpcy5fZW50cmllcy5sZW5ndGgtMTt9CnJvbGxiYWNrKCl7aWYodGhpcy5lbXB0eSgpKQpyZXR1cm4gZmFsc2U7bGV0IHJldmVhbEluZGV4PXRoaXMuX2FjdGl2ZUVudHJ5SW5kZXgtMTt3aGlsZShyZXZlYWxJbmRleD49MCYmIXRoaXMuX2VudHJpZXNbcmV2ZWFsSW5kZXhdLnZhbGlkKCkpCi0tcmV2ZWFsSW5kZXg7aWYocmV2ZWFsSW5kZXg8MCkKcmV0dXJuIGZhbHNlO3RoaXMucmVhZE9ubHlMb2NrKCk7dGhpcy5fZW50cmllc1tyZXZlYWxJbmRleF0ucmV2ZWFsKCk7dGhpcy5yZWxlYXNlUmVhZE9ubHlMb2NrKCk7dGhpcy5fYWN0aXZlRW50cnlJbmRleD1yZXZlYWxJbmRleDtyZXR1cm4gdHJ1ZTt9CnJvbGxvdmVyKCl7bGV0IHJldmVhbEluZGV4PXRoaXMuX2FjdGl2ZUVudHJ5SW5kZXgrMTt3aGlsZShyZXZlYWxJbmRleDx0aGlzLl9lbnRyaWVzLmxlbmd0aCYmIXRoaXMuX2VudHJpZXNbcmV2ZWFsSW5kZXhdLnZhbGlkKCkpCisrcmV2ZWFsSW5kZXg7aWYocmV2ZWFsSW5kZXg+PXRoaXMuX2VudHJpZXMubGVuZ3RoKQpyZXR1cm4gZmFsc2U7dGhpcy5yZWFkT25seUxvY2soKTt0aGlzLl9lbnRyaWVzW3JldmVhbEluZGV4XS5yZXZlYWwoKTt0aGlzLnJlbGVhc2VSZWFkT25seUxvY2soKTt0aGlzLl9hY3RpdmVFbnRyeUluZGV4PXJldmVhbEluZGV4O3JldHVybiB0cnVlO319OztTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlNYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKHNvdXJjZXNWaWV3LGN1cnJlbnRTb3VyY2VGcmFtZUNhbGxiYWNrKXt0aGlzLl9zb3VyY2VzVmlldz1zb3VyY2VzVmlldzt0aGlzLl9oaXN0b3J5TWFuYWdlcj1uZXcgU291cmNlcy5TaW1wbGVIaXN0b3J5TWFuYWdlcihTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlNYW5hZ2VyLkhpc3RvcnlEZXB0aCk7dGhpcy5fY3VycmVudFNvdXJjZUZyYW1lQ2FsbGJhY2s9Y3VycmVudFNvdXJjZUZyYW1lQ2FsbGJhY2s7fQp0cmFja1NvdXJjZUZyYW1lQ3Vyc29ySnVtcHMoc291cmNlRnJhbWUpe3NvdXJjZUZyYW1lLnRleHRFZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuSnVtcEhhcHBlbmVkLHRoaXMuX29uSnVtcEhhcHBlbmVkLmJpbmQodGhpcykpO30KX29uSnVtcEhhcHBlbmVkKGV2ZW50KXtpZihldmVudC5kYXRhLmZyb20pCnRoaXMuX3VwZGF0ZUFjdGl2ZVN0YXRlKGV2ZW50LmRhdGEuZnJvbSk7aWYoZXZlbnQuZGF0YS50bykKdGhpcy5fcHVzaEFjdGl2ZVN0YXRlKGV2ZW50LmRhdGEudG8pO30Kcm9sbGJhY2soKXt0aGlzLl9oaXN0b3J5TWFuYWdlci5yb2xsYmFjaygpO30Kcm9sbG92ZXIoKXt0aGlzLl9oaXN0b3J5TWFuYWdlci5yb2xsb3ZlcigpO30KdXBkYXRlQ3VycmVudFN0YXRlKCl7Y29uc3Qgc291cmNlRnJhbWU9dGhpcy5fY3VycmVudFNvdXJjZUZyYW1lQ2FsbGJhY2soKTtpZighc291cmNlRnJhbWUpCnJldHVybjt0aGlzLl91cGRhdGVBY3RpdmVTdGF0ZShzb3VyY2VGcmFtZS50ZXh0RWRpdG9yLnNlbGVjdGlvbigpKTt9CnB1c2hOZXdTdGF0ZSgpe2NvbnN0IHNvdXJjZUZyYW1lPXRoaXMuX2N1cnJlbnRTb3VyY2VGcmFtZUNhbGxiYWNrKCk7aWYoIXNvdXJjZUZyYW1lKQpyZXR1cm47dGhpcy5fcHVzaEFjdGl2ZVN0YXRlKHNvdXJjZUZyYW1lLnRleHRFZGl0b3Iuc2VsZWN0aW9uKCkpO30KX3VwZGF0ZUFjdGl2ZVN0YXRlKHNlbGVjdGlvbil7Y29uc3QgYWN0aXZlPXRoaXMuX2hpc3RvcnlNYW5hZ2VyLmFjdGl2ZSgpO2lmKCFhY3RpdmUpCnJldHVybjtjb25zdCBzb3VyY2VGcmFtZT10aGlzLl9jdXJyZW50U291cmNlRnJhbWVDYWxsYmFjaygpO2lmKCFzb3VyY2VGcmFtZSkKcmV0dXJuO2NvbnN0IGVudHJ5PW5ldyBTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlFbnRyeSh0aGlzLl9zb3VyY2VzVmlldyx0aGlzLHNvdXJjZUZyYW1lLHNlbGVjdGlvbik7YWN0aXZlLm1lcmdlKGVudHJ5KTt9Cl9wdXNoQWN0aXZlU3RhdGUoc2VsZWN0aW9uKXtjb25zdCBzb3VyY2VGcmFtZT10aGlzLl9jdXJyZW50U291cmNlRnJhbWVDYWxsYmFjaygpO2lmKCFzb3VyY2VGcmFtZSkKcmV0dXJuO2NvbnN0IGVudHJ5PW5ldyBTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlFbnRyeSh0aGlzLl9zb3VyY2VzVmlldyx0aGlzLHNvdXJjZUZyYW1lLHNlbGVjdGlvbik7dGhpcy5faGlzdG9yeU1hbmFnZXIucHVzaChlbnRyeSk7fQpyZW1vdmVIaXN0b3J5Rm9yU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe2Z1bmN0aW9uIGZpbHRlck91dChlbnRyeSl7cmV0dXJuIGVudHJ5Ll9wcm9qZWN0SWQ9PT11aVNvdXJjZUNvZGUucHJvamVjdCgpLmlkKCkmJmVudHJ5Ll91cmw9PT11aVNvdXJjZUNvZGUudXJsKCk7fQp0aGlzLl9oaXN0b3J5TWFuYWdlci5maWx0ZXJPdXQoZmlsdGVyT3V0KTt9fTtTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlNYW5hZ2VyLkhpc3RvcnlEZXB0aD0yMDtTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlFbnRyeT1jbGFzc3tjb25zdHJ1Y3Rvcihzb3VyY2VzVmlldyxlZGl0aW5nTG9jYXRpb25NYW5hZ2VyLHNvdXJjZUZyYW1lLHNlbGVjdGlvbil7dGhpcy5fc291cmNlc1ZpZXc9c291cmNlc1ZpZXc7dGhpcy5fZWRpdGluZ0xvY2F0aW9uTWFuYWdlcj1lZGl0aW5nTG9jYXRpb25NYW5hZ2VyO2NvbnN0IHVpU291cmNlQ29kZT1zb3VyY2VGcmFtZS51aVNvdXJjZUNvZGUoKTt0aGlzLl9wcm9qZWN0SWQ9dWlTb3VyY2VDb2RlLnByb2plY3QoKS5pZCgpO3RoaXMuX3VybD11aVNvdXJjZUNvZGUudXJsKCk7Y29uc3QgcG9zaXRpb249dGhpcy5fcG9zaXRpb25Gcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7dGhpcy5fcG9zaXRpb25IYW5kbGU9c291cmNlRnJhbWUudGV4dEVkaXRvci50ZXh0RWRpdG9yUG9zaXRpb25IYW5kbGUocG9zaXRpb24ubGluZU51bWJlcixwb3NpdGlvbi5jb2x1bW5OdW1iZXIpO30KbWVyZ2UoZW50cnkpe2lmKHRoaXMuX3Byb2plY3RJZCE9PWVudHJ5Ll9wcm9qZWN0SWR8fHRoaXMuX3VybCE9PWVudHJ5Ll91cmwpCnJldHVybjt0aGlzLl9wb3NpdGlvbkhhbmRsZT1lbnRyeS5fcG9zaXRpb25IYW5kbGU7fQpfcG9zaXRpb25Gcm9tU2VsZWN0aW9uKHNlbGVjdGlvbil7cmV0dXJue2xpbmVOdW1iZXI6c2VsZWN0aW9uLmVuZExpbmUsY29sdW1uTnVtYmVyOnNlbGVjdGlvbi5lbmRDb2x1bW59O30KdmFsaWQoKXtjb25zdCBwb3NpdGlvbj10aGlzLl9wb3NpdGlvbkhhbmRsZS5yZXNvbHZlKCk7Y29uc3QgdWlTb3VyY2VDb2RlPVdvcmtzcGFjZS53b3Jrc3BhY2UudWlTb3VyY2VDb2RlKHRoaXMuX3Byb2plY3RJZCx0aGlzLl91cmwpO3JldHVybiEhKHBvc2l0aW9uJiZ1aVNvdXJjZUNvZGUpO30KcmV2ZWFsKCl7Y29uc3QgcG9zaXRpb249dGhpcy5fcG9zaXRpb25IYW5kbGUucmVzb2x2ZSgpO2NvbnN0IHVpU291cmNlQ29kZT1Xb3Jrc3BhY2Uud29ya3NwYWNlLnVpU291cmNlQ29kZSh0aGlzLl9wcm9qZWN0SWQsdGhpcy5fdXJsKTtpZighcG9zaXRpb258fCF1aVNvdXJjZUNvZGUpCnJldHVybjt0aGlzLl9lZGl0aW5nTG9jYXRpb25NYW5hZ2VyLnVwZGF0ZUN1cnJlbnRTdGF0ZSgpO3RoaXMuX3NvdXJjZXNWaWV3LnNob3dTb3VyY2VMb2NhdGlvbih1aVNvdXJjZUNvZGUscG9zaXRpb24ubGluZU51bWJlcixwb3NpdGlvbi5jb2x1bW5OdW1iZXIpO319OztTb3VyY2VzLkZpbGVQYXRoU2NvcmVGdW5jdGlvbj1jbGFzc3tjb25zdHJ1Y3RvcihxdWVyeSl7dGhpcy5fcXVlcnk9cXVlcnk7dGhpcy5fcXVlcnlVcHBlckNhc2U9cXVlcnkudG9VcHBlckNhc2UoKTt0aGlzLl9zY29yZT1uZXcgSW50MzJBcnJheSgyMCoxMDApO3RoaXMuX3NlcXVlbmNlPW5ldyBJbnQzMkFycmF5KDIwKjEwMCk7dGhpcy5fZGF0YVVwcGVyQ2FzZT0nJzt0aGlzLl9maWxlTmFtZUluZGV4PTA7fQpzY29yZShkYXRhLG1hdGNoSW5kZXhlcyl7aWYoIWRhdGF8fCF0aGlzLl9xdWVyeSkKcmV0dXJuIDA7Y29uc3Qgbj10aGlzLl9xdWVyeS5sZW5ndGg7Y29uc3QgbT1kYXRhLmxlbmd0aDtpZighdGhpcy5fc2NvcmV8fHRoaXMuX3Njb3JlLmxlbmd0aDxuKm0pe3RoaXMuX3Njb3JlPW5ldyBJbnQzMkFycmF5KG4qbSoyKTt0aGlzLl9zZXF1ZW5jZT1uZXcgSW50MzJBcnJheShuKm0qMik7fQpjb25zdCBzY29yZT10aGlzLl9zY29yZTtjb25zdCBzZXF1ZW5jZT0odGhpcy5fc2VxdWVuY2UpO3RoaXMuX2RhdGFVcHBlckNhc2U9ZGF0YS50b1VwcGVyQ2FzZSgpO3RoaXMuX2ZpbGVOYW1lSW5kZXg9ZGF0YS5sYXN0SW5kZXhPZignLycpO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2ZvcihsZXQgaj0wO2o8bTsrK2ope2NvbnN0IHNraXBDaGFyU2NvcmU9aj09PTA/MDpzY29yZVtpKm0rai0xXTtjb25zdCBwcmV2Q2hhclNjb3JlPWk9PT0wfHxqPT09MD8wOnNjb3JlWyhpLTEpKm0rai0xXTtjb25zdCBjb25zZWN1dGl2ZU1hdGNoPWk9PT0wfHxqPT09MD8wOnNlcXVlbmNlWyhpLTEpKm0rai0xXTtjb25zdCBwaWNrQ2hhclNjb3JlPXRoaXMuX21hdGNoKHRoaXMuX3F1ZXJ5LGRhdGEsaSxqLGNvbnNlY3V0aXZlTWF0Y2gpO2lmKHBpY2tDaGFyU2NvcmUmJnByZXZDaGFyU2NvcmUrcGlja0NoYXJTY29yZT49c2tpcENoYXJTY29yZSl7c2VxdWVuY2VbaSptK2pdPWNvbnNlY3V0aXZlTWF0Y2grMTtzY29yZVtpKm0ral09KHByZXZDaGFyU2NvcmUrcGlja0NoYXJTY29yZSk7fWVsc2V7c2VxdWVuY2VbaSptK2pdPTA7c2NvcmVbaSptK2pdPXNraXBDaGFyU2NvcmU7fX19CmlmKG1hdGNoSW5kZXhlcykKdGhpcy5fcmVzdG9yZU1hdGNoSW5kZXhlcyhzZXF1ZW5jZSxuLG0sbWF0Y2hJbmRleGVzKTtjb25zdCBtYXhEYXRhTGVuZ3RoPTI1NjtyZXR1cm4gc2NvcmVbbiptLTFdKm1heERhdGFMZW5ndGgrKG1heERhdGFMZW5ndGgtZGF0YS5sZW5ndGgpO30KX3Rlc3RXb3JkU3RhcnQoZGF0YSxqKXtpZihqPT09MCkKcmV0dXJuIHRydWU7Y29uc3QgcHJldkNoYXI9ZGF0YS5jaGFyQXQoai0xKTtyZXR1cm4gcHJldkNoYXI9PT0nXyd8fHByZXZDaGFyPT09Jy0nfHxwcmV2Q2hhcj09PScvJ3x8KGRhdGFbai0xXSE9PXRoaXMuX2RhdGFVcHBlckNhc2Vbai0xXSYmZGF0YVtqXT09PXRoaXMuX2RhdGFVcHBlckNhc2Vbal0pO30KX3Jlc3RvcmVNYXRjaEluZGV4ZXMoc2VxdWVuY2UsbixtLG91dCl7bGV0IGk9bi0xLGo9bS0xO3doaWxlKGk+PTAmJmo+PTApe3N3aXRjaChzZXF1ZW5jZVtpKm0ral0pe2Nhc2UgMDotLWo7YnJlYWs7ZGVmYXVsdDpvdXQucHVzaChqKTstLWk7LS1qO2JyZWFrO319Cm91dC5yZXZlcnNlKCk7fQpfc2luZ2xlQ2hhclNjb3JlKHF1ZXJ5LGRhdGEsaSxqKXtjb25zdCBpc1dvcmRTdGFydD10aGlzLl90ZXN0V29yZFN0YXJ0KGRhdGEsaik7Y29uc3QgaXNGaWxlTmFtZT1qPnRoaXMuX2ZpbGVOYW1lSW5kZXg7Y29uc3QgaXNQYXRoVG9rZW5TdGFydD1qPT09MHx8ZGF0YVtqLTFdPT09Jy8nO2NvbnN0IGlzQ2Fwc01hdGNoPXF1ZXJ5W2ldPT09ZGF0YVtqXSYmcXVlcnlbaV09PT10aGlzLl9xdWVyeVVwcGVyQ2FzZVtpXTtsZXQgc2NvcmU9MTA7aWYoaXNQYXRoVG9rZW5TdGFydCkKc2NvcmUrPTQ7aWYoaXNXb3JkU3RhcnQpCnNjb3JlKz0yO2lmKGlzQ2Fwc01hdGNoKQpzY29yZSs9NjtpZihpc0ZpbGVOYW1lKQpzY29yZSs9NDtpZihqPT09dGhpcy5fZmlsZU5hbWVJbmRleCsxJiZpPT09MCkKc2NvcmUrPTU7aWYoaXNGaWxlTmFtZSYmaXNXb3JkU3RhcnQpCnNjb3JlKz0zO3JldHVybiBzY29yZTt9Cl9zZXF1ZW5jZUNoYXJTY29yZShxdWVyeSxkYXRhLGksaixzZXF1ZW5jZUxlbmd0aCl7Y29uc3QgaXNGaWxlTmFtZT1qPnRoaXMuX2ZpbGVOYW1lSW5kZXg7Y29uc3QgaXNQYXRoVG9rZW5TdGFydD1qPT09MHx8ZGF0YVtqLTFdPT09Jy8nO2xldCBzY29yZT0xMDtpZihpc0ZpbGVOYW1lKQpzY29yZSs9NDtpZihpc1BhdGhUb2tlblN0YXJ0KQpzY29yZSs9NTtzY29yZSs9c2VxdWVuY2VMZW5ndGgqNDtyZXR1cm4gc2NvcmU7fQpfbWF0Y2gocXVlcnksZGF0YSxpLGosY29uc2VjdXRpdmVNYXRjaCl7aWYodGhpcy5fcXVlcnlVcHBlckNhc2VbaV0hPT10aGlzLl9kYXRhVXBwZXJDYXNlW2pdKQpyZXR1cm4gMDtpZighY29uc2VjdXRpdmVNYXRjaCkKcmV0dXJuIHRoaXMuX3NpbmdsZUNoYXJTY29yZShxdWVyeSxkYXRhLGksaik7ZWxzZQpyZXR1cm4gdGhpcy5fc2VxdWVuY2VDaGFyU2NvcmUocXVlcnksZGF0YSxpLGotY29uc2VjdXRpdmVNYXRjaCxjb25zZWN1dGl2ZU1hdGNoKTt9fTs7U291cmNlcy5GaWx0ZXJlZFVJU291cmNlQ29kZUxpc3RQcm92aWRlcj1jbGFzcyBleHRlbmRzIFF1aWNrT3Blbi5GaWx0ZXJlZExpc3RXaWRnZXQuUHJvdmlkZXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3F1ZXJ5TGluZU51bWJlckFuZENvbHVtbk51bWJlcj0nJzt0aGlzLl9kZWZhdWx0U2NvcmVzPW51bGw7dGhpcy5fc2NvcmVyPW5ldyBTb3VyY2VzLkZpbGVQYXRoU2NvcmVGdW5jdGlvbignJyk7fQpfcHJvamVjdFJlbW92ZWQoZXZlbnQpe2NvbnN0IHByb2plY3Q9KGV2ZW50LmRhdGEpO3RoaXMuX3BvcHVsYXRlKHByb2plY3QpO3RoaXMucmVmcmVzaCgpO30KX3BvcHVsYXRlKHNraXBQcm9qZWN0KXt0aGlzLl91aVNvdXJjZUNvZGVzPVtdO2NvbnN0IHByb2plY3RzPVdvcmtzcGFjZS53b3Jrc3BhY2UucHJvamVjdHMoKS5maWx0ZXIodGhpcy5maWx0ZXJQcm9qZWN0LmJpbmQodGhpcykpO2ZvcihsZXQgaT0wO2k8cHJvamVjdHMubGVuZ3RoOysraSl7aWYoc2tpcFByb2plY3QmJnByb2plY3RzW2ldPT09c2tpcFByb2plY3QpCmNvbnRpbnVlO2NvbnN0IHVpU291cmNlQ29kZXM9cHJvamVjdHNbaV0udWlTb3VyY2VDb2RlcygpLmZpbHRlcih0aGlzLl9maWx0ZXJVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7dGhpcy5fdWlTb3VyY2VDb2Rlcz10aGlzLl91aVNvdXJjZUNvZGVzLmNvbmNhdCh1aVNvdXJjZUNvZGVzKTt9fQpfZmlsdGVyVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7cmV0dXJuIWJpbmRpbmd8fGJpbmRpbmcuZmlsZVN5c3RlbT09PXVpU291cmNlQ29kZTt9CnVpU291cmNlQ29kZVNlbGVjdGVkKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7fQpmaWx0ZXJQcm9qZWN0KHByb2plY3Qpe3JldHVybiB0cnVlO30KaXRlbUNvdW50KCl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZXMubGVuZ3RoO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZXNbaXRlbUluZGV4XS51cmwoKTt9CnNldERlZmF1bHRTY29yZXMoZGVmYXVsdFNjb3Jlcyl7dGhpcy5fZGVmYXVsdFNjb3Jlcz1kZWZhdWx0U2NvcmVzO30KaXRlbVNjb3JlQXQoaXRlbUluZGV4LHF1ZXJ5KXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fdWlTb3VyY2VDb2Rlc1tpdGVtSW5kZXhdO2NvbnN0IHNjb3JlPXRoaXMuX2RlZmF1bHRTY29yZXM/KHRoaXMuX2RlZmF1bHRTY29yZXMuZ2V0KHVpU291cmNlQ29kZSl8fDApOjA7aWYoIXF1ZXJ5fHxxdWVyeS5sZW5ndGg8MikKcmV0dXJuIHNjb3JlO2lmKHRoaXMuX3F1ZXJ5IT09cXVlcnkpe3RoaXMuX3F1ZXJ5PXF1ZXJ5O3RoaXMuX3Njb3Jlcj1uZXcgU291cmNlcy5GaWxlUGF0aFNjb3JlRnVuY3Rpb24ocXVlcnkpO30KbGV0IG11bHRpcGxpZXI9MTA7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0mJiFQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSkpCm11bHRpcGxpZXI9NTtjb25zdCBmdWxsRGlzcGxheU5hbWU9dWlTb3VyY2VDb2RlLmZ1bGxEaXNwbGF5TmFtZSgpO3JldHVybiBzY29yZSttdWx0aXBsaWVyKnRoaXMuX3Njb3Jlci5zY29yZShmdWxsRGlzcGxheU5hbWUsbnVsbCk7fQpyZW5kZXJJdGVtKGl0ZW1JbmRleCxxdWVyeSx0aXRsZUVsZW1lbnQsc3VidGl0bGVFbGVtZW50KXtxdWVyeT10aGlzLnJld3JpdGVRdWVyeShxdWVyeSk7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX3VpU291cmNlQ29kZXNbaXRlbUluZGV4XTtjb25zdCBmdWxsRGlzcGxheU5hbWU9dWlTb3VyY2VDb2RlLmZ1bGxEaXNwbGF5TmFtZSgpO2NvbnN0IGluZGV4ZXM9W107bmV3IFNvdXJjZXMuRmlsZVBhdGhTY29yZUZ1bmN0aW9uKHF1ZXJ5KS5zY29yZShmdWxsRGlzcGxheU5hbWUsaW5kZXhlcyk7Y29uc3QgZmlsZU5hbWVJbmRleD1mdWxsRGlzcGxheU5hbWUubGFzdEluZGV4T2YoJy8nKTt0aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbW9ub3NwYWNlJyk7c3VidGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vbm9zcGFjZScpO3RpdGxlRWxlbWVudC50ZXh0Q29udGVudD11aVNvdXJjZUNvZGUuZGlzcGxheU5hbWUoKSsodGhpcy5fcXVlcnlMaW5lTnVtYmVyQW5kQ29sdW1uTnVtYmVyfHwnJyk7dGhpcy5fcmVuZGVyU3VidGl0bGVFbGVtZW50KHN1YnRpdGxlRWxlbWVudCxmdWxsRGlzcGxheU5hbWUpO3N1YnRpdGxlRWxlbWVudC50aXRsZT1mdWxsRGlzcGxheU5hbWU7Y29uc3QgcmFuZ2VzPVtdO2ZvcihsZXQgaT0wO2k8aW5kZXhlcy5sZW5ndGg7KytpKQpyYW5nZXMucHVzaCh7b2Zmc2V0OmluZGV4ZXNbaV0sbGVuZ3RoOjF9KTtpZihpbmRleGVzWzBdPmZpbGVOYW1lSW5kZXgpe2ZvcihsZXQgaT0wO2k8cmFuZ2VzLmxlbmd0aDsrK2kpCnJhbmdlc1tpXS5vZmZzZXQtPWZpbGVOYW1lSW5kZXgrMTtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyh0aXRsZUVsZW1lbnQscmFuZ2VzLCdoaWdobGlnaHQnKTt9ZWxzZXtVSS5oaWdobGlnaHRSYW5nZXNXaXRoU3R5bGVDbGFzcyhzdWJ0aXRsZUVsZW1lbnQscmFuZ2VzLCdoaWdobGlnaHQnKTt9fQpfcmVuZGVyU3VidGl0bGVFbGVtZW50KGVsZW1lbnQsdGV4dCl7ZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2xldCBzcGxpdFBvc2l0aW9uPXRleHQubGFzdEluZGV4T2YoJy8nKTtpZih0ZXh0Lmxlbmd0aD41NSkKc3BsaXRQb3NpdGlvbj10ZXh0Lmxlbmd0aC01NTtjb25zdCBmaXJzdD1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmaXJzdC1wYXJ0Jyk7Zmlyc3QudGV4dENvbnRlbnQ9dGV4dC5zdWJzdHJpbmcoMCxzcGxpdFBvc2l0aW9uKTtjb25zdCBzZWNvbmQ9ZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2Vjb25kLXBhcnQnKTtzZWNvbmQudGV4dENvbnRlbnQ9dGV4dC5zdWJzdHJpbmcoc3BsaXRQb3NpdGlvbik7ZWxlbWVudC50aXRsZT10ZXh0O30Kc2VsZWN0SXRlbShpdGVtSW5kZXgscHJvbXB0VmFsdWUpe2NvbnN0IHBhcnNlZEV4cHJlc3Npb249cHJvbXB0VmFsdWUudHJpbSgpLm1hdGNoKC9eKFteOl0qKSg6XGQrKT8oOlxkKyk/JC8pO2lmKCFwYXJzZWRFeHByZXNzaW9uKQpyZXR1cm47bGV0IGxpbmVOdW1iZXI7bGV0IGNvbHVtbk51bWJlcjtpZihwYXJzZWRFeHByZXNzaW9uWzJdKQpsaW5lTnVtYmVyPXBhcnNlSW50KHBhcnNlZEV4cHJlc3Npb25bMl0uc3Vic3RyKDEpLDEwKS0xO2lmKHBhcnNlZEV4cHJlc3Npb25bM10pCmNvbHVtbk51bWJlcj1wYXJzZUludChwYXJzZWRFeHByZXNzaW9uWzNdLnN1YnN0cigxKSwxMCktMTtjb25zdCB1aVNvdXJjZUNvZGU9aXRlbUluZGV4IT09bnVsbD90aGlzLl91aVNvdXJjZUNvZGVzW2l0ZW1JbmRleF06bnVsbDt0aGlzLnVpU291cmNlQ29kZVNlbGVjdGVkKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7fQpyZXdyaXRlUXVlcnkocXVlcnkpe3F1ZXJ5PXF1ZXJ5P3F1ZXJ5LnRyaW0oKTonJztpZighcXVlcnl8fHF1ZXJ5PT09JzonKQpyZXR1cm4nJztjb25zdCBsaW5lTnVtYmVyTWF0Y2g9cXVlcnkubWF0Y2goL14oW146XSspKCg/OjpbXjpdKil7MCwyfSkkLyk7dGhpcy5fcXVlcnlMaW5lTnVtYmVyQW5kQ29sdW1uTnVtYmVyPWxpbmVOdW1iZXJNYXRjaD9saW5lTnVtYmVyTWF0Y2hbMl06Jyc7cmV0dXJuIGxpbmVOdW1iZXJNYXRjaD9saW5lTnVtYmVyTWF0Y2hbMV06cXVlcnk7fQpfdWlTb3VyY2VDb2RlQWRkZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7aWYoIXRoaXMuX2ZpbHRlclVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpfHwhdGhpcy5maWx0ZXJQcm9qZWN0KHVpU291cmNlQ29kZS5wcm9qZWN0KCkpKQpyZXR1cm47dGhpcy5fdWlTb3VyY2VDb2Rlcy5wdXNoKHVpU291cmNlQ29kZSk7dGhpcy5yZWZyZXNoKCk7fQpub3RGb3VuZFRleHQoKXtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdObyBmaWxlcyBmb3VuZCcpO30KYXR0YWNoKCl7V29ya3NwYWNlLndvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHRoaXMuX3VpU291cmNlQ29kZUFkZGVkLHRoaXMpO1dvcmtzcGFjZS53b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0UmVtb3ZlZCx0aGlzLl9wcm9qZWN0UmVtb3ZlZCx0aGlzKTt0aGlzLl9wb3B1bGF0ZSgpO30KZGV0YWNoKCl7V29ya3NwYWNlLndvcmtzcGFjZS5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHRoaXMuX3VpU291cmNlQ29kZUFkZGVkLHRoaXMpO1dvcmtzcGFjZS53b3Jrc3BhY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0UmVtb3ZlZCx0aGlzLl9wcm9qZWN0UmVtb3ZlZCx0aGlzKTt0aGlzLl9xdWVyeUxpbmVOdW1iZXJBbmRDb2x1bW5OdW1iZXI9Jyc7dGhpcy5fZGVmYXVsdFNjb3Jlcz1udWxsO319OztTb3VyY2VzLkdvVG9MaW5lUXVpY2tPcGVuPWNsYXNzIGV4dGVuZHMgUXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5Qcm92aWRlcntzZWxlY3RJdGVtKGl0ZW1JbmRleCxwcm9tcHRWYWx1ZSl7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2N1cnJlbnRVSVNvdXJjZUNvZGUoKTtpZighdWlTb3VyY2VDb2RlKQpyZXR1cm47Y29uc3QgcG9zaXRpb249dGhpcy5fcGFyc2VQb3NpdGlvbihwcm9tcHRWYWx1ZSk7aWYoIXBvc2l0aW9uKQpyZXR1cm47Q29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihwb3NpdGlvbi5saW5lLTEscG9zaXRpb24uY29sdW1uLTEpKTt9Cm5vdEZvdW5kVGV4dChxdWVyeSl7aWYoIXRoaXMuX2N1cnJlbnRVSVNvdXJjZUNvZGUoKSkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnTm8gZmlsZSBzZWxlY3RlZC4nKTtjb25zdCBwb3NpdGlvbj10aGlzLl9wYXJzZVBvc2l0aW9uKHF1ZXJ5KTtpZighcG9zaXRpb24pCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ1R5cGUgYSBudW1iZXIgdG8gZ28gdG8gdGhhdCBsaW5lLicpO2xldCB0ZXh0PUNvbW1vbi5VSVN0cmluZygnR28gdG8gbGluZSAnKStwb3NpdGlvbi5saW5lO2lmKHBvc2l0aW9uLmNvbHVtbiYmcG9zaXRpb24uY29sdW1uPjEpCnRleHQrPUNvbW1vbi5VSVN0cmluZygnIGFuZCBjb2x1bW4gJykrcG9zaXRpb24uY29sdW1uO3RleHQrPScuJztyZXR1cm4gdGV4dDt9Cl9wYXJzZVBvc2l0aW9uKHF1ZXJ5KXtjb25zdCBwYXJ0cz1xdWVyeS5tYXRjaCgvKFswLTldKykoXDpbMC05XSopPy8pO2lmKCFwYXJ0c3x8IXBhcnRzWzBdfHxwYXJ0c1swXS5sZW5ndGghPT1xdWVyeS5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGxpbmU9cGFyc2VJbnQocGFydHNbMV0sMTApO2xldCBjb2x1bW47aWYocGFydHNbMl0pCmNvbHVtbj1wYXJzZUludChwYXJ0c1syXS5zdWJzdHJpbmcoMSksMTApO3JldHVybntsaW5lOk1hdGgubWF4KGxpbmV8MCwxKSxjb2x1bW46TWF0aC5tYXgoY29sdW1ufDAsMSl9O30KX2N1cnJlbnRVSVNvdXJjZUNvZGUoKXtjb25zdCBzb3VyY2VzVmlldz1VSS5jb250ZXh0LmZsYXZvcihTb3VyY2VzLlNvdXJjZXNWaWV3KTtpZighc291cmNlc1ZpZXcpCnJldHVybiBudWxsO3JldHVybiBzb3VyY2VzVmlldy5jdXJyZW50VUlTb3VyY2VDb2RlKCk7fX07O1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlcj17fTtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX2NhY2hlZE1hcFN5bWJvbD1TeW1ib2woJ2NhY2hlJyk7U291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLl9jYWNoZWRJZGVudGlmaWVyc1N5bWJvbD1TeW1ib2woJ2NhY2hlZElkZW50aWZpZXJzJyk7U291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLklkZW50aWZpZXI9Y2xhc3N7Y29uc3RydWN0b3IobmFtZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7dGhpcy5uYW1lPW5hbWU7dGhpcy5saW5lTnVtYmVyPWxpbmVOdW1iZXI7dGhpcy5jb2x1bW5OdW1iZXI9Y29sdW1uTnVtYmVyO319O1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fc2NvcGVJZGVudGlmaWVycz1mdW5jdGlvbihzY29wZSl7Y29uc3Qgc3RhcnRMb2NhdGlvbj1zY29wZS5zdGFydExvY2F0aW9uKCk7Y29uc3QgZW5kTG9jYXRpb249c2NvcGUuZW5kTG9jYXRpb24oKTtpZihzY29wZS50eXBlKCk9PT1Qcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuR2xvYmFsfHwhc3RhcnRMb2NhdGlvbnx8IWVuZExvY2F0aW9ufHwhc3RhcnRMb2NhdGlvbi5zY3JpcHQoKXx8IXN0YXJ0TG9jYXRpb24uc2NyaXB0KCkuc291cmNlTWFwVVJMfHwoc3RhcnRMb2NhdGlvbi5zY3JpcHQoKSE9PWVuZExvY2F0aW9uLnNjcmlwdCgpKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgoW10pKTtjb25zdCBzY3JpcHQ9c3RhcnRMb2NhdGlvbi5zY3JpcHQoKTtyZXR1cm4gc2NyaXB0LnJlcXVlc3RDb250ZW50KCkudGhlbihvbkNvbnRlbnQpO2Z1bmN0aW9uIG9uQ29udGVudChjb250ZW50KXtpZighY29udGVudCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgoW10pKTtjb25zdCB0ZXh0PW5ldyBUZXh0VXRpbHMuVGV4dChjb250ZW50KTtjb25zdCBzY29wZVJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0TG9jYXRpb24ubGluZU51bWJlcixzdGFydExvY2F0aW9uLmNvbHVtbk51bWJlcixlbmRMb2NhdGlvbi5saW5lTnVtYmVyLGVuZExvY2F0aW9uLmNvbHVtbk51bWJlcik7Y29uc3Qgc2NvcGVUZXh0PXRleHQuZXh0cmFjdChzY29wZVJhbmdlKTtjb25zdCBzY29wZVN0YXJ0PXRleHQudG9Tb3VyY2VSYW5nZShzY29wZVJhbmdlKS5vZmZzZXQ7Y29uc3QgcHJlZml4PSdmdW5jdGlvbiBmdWknO3JldHVybiBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmphdmFTY3JpcHRJZGVudGlmaWVycyhwcmVmaXgrc2NvcGVUZXh0KS50aGVuKG9uSWRlbnRpZmllcnMuYmluZChudWxsLHRleHQsc2NvcGVTdGFydCxwcmVmaXgpKTt9CmZ1bmN0aW9uIG9uSWRlbnRpZmllcnModGV4dCxzY29wZVN0YXJ0LHByZWZpeCxpZGVudGlmaWVycyl7Y29uc3QgcmVzdWx0PVtdO2NvbnN0IGN1cnNvcj1uZXcgVGV4dFV0aWxzLlRleHRDdXJzb3IodGV4dC5saW5lRW5kaW5ncygpKTtmb3IobGV0IGk9MDtpPGlkZW50aWZpZXJzLmxlbmd0aDsrK2kpe2NvbnN0IGlkPWlkZW50aWZpZXJzW2ldO2lmKGlkLm9mZnNldDxwcmVmaXgubGVuZ3RoKQpjb250aW51ZTtjb25zdCBzdGFydD1zY29wZVN0YXJ0K2lkLm9mZnNldC1wcmVmaXgubGVuZ3RoO2N1cnNvci5yZXNldFRvKHN0YXJ0KTtyZXN1bHQucHVzaChuZXcgU291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLklkZW50aWZpZXIoaWQubmFtZSxjdXJzb3IubGluZU51bWJlcigpLGN1cnNvci5jb2x1bW5OdW1iZXIoKSkpO30KcmV0dXJuIHJlc3VsdDt9fTtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX3Jlc29sdmVTY29wZT1mdW5jdGlvbihzY29wZSl7bGV0IGlkZW50aWZpZXJzUHJvbWlzZT1zY29wZVtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX2NhY2hlZElkZW50aWZpZXJzU3ltYm9sXTtpZihpZGVudGlmaWVyc1Byb21pc2UpCnJldHVybiBpZGVudGlmaWVyc1Byb21pc2U7Y29uc3Qgc2NyaXB0PXNjb3BlLmNhbGxGcmFtZSgpLnNjcmlwdDtjb25zdCBzb3VyY2VNYXA9QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnNvdXJjZU1hcEZvclNjcmlwdChzY3JpcHQpO2lmKCFzb3VyY2VNYXApCnJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IE1hcCgpKTtjb25zdCB0ZXh0Q2FjaGU9bmV3IE1hcCgpO2lkZW50aWZpZXJzUHJvbWlzZT1Tb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX3Njb3BlSWRlbnRpZmllcnMoc2NvcGUpLnRoZW4ob25JZGVudGlmaWVycyk7c2NvcGVbU291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLl9jYWNoZWRJZGVudGlmaWVyc1N5bWJvbF09aWRlbnRpZmllcnNQcm9taXNlO3JldHVybiBpZGVudGlmaWVyc1Byb21pc2U7ZnVuY3Rpb24gb25JZGVudGlmaWVycyhpZGVudGlmaWVycyl7Y29uc3QgbmFtZXNNYXBwaW5nPW5ldyBNYXAoKTtmb3IobGV0IGk9MDtpPGlkZW50aWZpZXJzLmxlbmd0aDsrK2kpe2NvbnN0IGlkPWlkZW50aWZpZXJzW2ldO2NvbnN0IGVudHJ5PXNvdXJjZU1hcC5maW5kRW50cnkoaWQubGluZU51bWJlcixpZC5jb2x1bW5OdW1iZXIpO2lmKGVudHJ5JiZlbnRyeS5uYW1lKQpuYW1lc01hcHBpbmcuc2V0KGlkLm5hbWUsZW50cnkubmFtZSk7fQpjb25zdCBwcm9taXNlcz1bXTtmb3IobGV0IGk9MDtpPGlkZW50aWZpZXJzLmxlbmd0aDsrK2kpe2NvbnN0IGlkPWlkZW50aWZpZXJzW2ldO2lmKG5hbWVzTWFwcGluZy5oYXMoaWQubmFtZSkpCmNvbnRpbnVlO2NvbnN0IHByb21pc2U9cmVzb2x2ZVNvdXJjZU5hbWUoaWQpLnRoZW4ob25Tb3VyY2VOYW1lUmVzb2x2ZWQuYmluZChudWxsLG5hbWVzTWFwcGluZyxpZCkpO3Byb21pc2VzLnB1c2gocHJvbWlzZSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCk9PlNvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fc2NvcGVSZXNvbHZlZEZvclRlc3QoKSkudGhlbigoKT0+bmFtZXNNYXBwaW5nKTt9CmZ1bmN0aW9uIG9uU291cmNlTmFtZVJlc29sdmVkKG5hbWVzTWFwcGluZyxpZCxzb3VyY2VOYW1lKXtpZighc291cmNlTmFtZSkKcmV0dXJuO25hbWVzTWFwcGluZy5zZXQoaWQubmFtZSxzb3VyY2VOYW1lKTt9CmZ1bmN0aW9uIHJlc29sdmVTb3VyY2VOYW1lKGlkKXtjb25zdCBzdGFydEVudHJ5PXNvdXJjZU1hcC5maW5kRW50cnkoaWQubGluZU51bWJlcixpZC5jb2x1bW5OdW1iZXIpO2NvbnN0IGVuZEVudHJ5PXNvdXJjZU1hcC5maW5kRW50cnkoaWQubGluZU51bWJlcixpZC5jb2x1bW5OdW1iZXIraWQubmFtZS5sZW5ndGgpO2lmKCFzdGFydEVudHJ5fHwhZW5kRW50cnl8fCFzdGFydEVudHJ5LnNvdXJjZVVSTHx8c3RhcnRFbnRyeS5zb3VyY2VVUkwhPT1lbmRFbnRyeS5zb3VyY2VVUkx8fCFzdGFydEVudHJ5LnNvdXJjZUxpbmVOdW1iZXJ8fCFzdGFydEVudHJ5LnNvdXJjZUNvbHVtbk51bWJlcnx8IWVuZEVudHJ5LnNvdXJjZUxpbmVOdW1iZXJ8fCFlbmRFbnRyeS5zb3VyY2VDb2x1bW5OdW1iZXIpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtjb25zdCBzb3VyY2VUZXh0UmFuZ2U9bmV3IFRleHRVdGlscy5UZXh0UmFuZ2Uoc3RhcnRFbnRyeS5zb3VyY2VMaW5lTnVtYmVyLHN0YXJ0RW50cnkuc291cmNlQ29sdW1uTnVtYmVyLGVuZEVudHJ5LnNvdXJjZUxpbmVOdW1iZXIsZW5kRW50cnkuc291cmNlQ29sdW1uTnVtYmVyKTtjb25zdCB1aVNvdXJjZUNvZGU9QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVpU291cmNlQ29kZUZvclNvdXJjZU1hcFNvdXJjZVVSTChzY3JpcHQuZGVidWdnZXJNb2RlbCxzdGFydEVudHJ5LnNvdXJjZVVSTCxzY3JpcHQuaXNDb250ZW50U2NyaXB0KCkpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtyZXR1cm4gdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCkudGhlbihvblNvdXJjZUNvbnRlbnQuYmluZChudWxsLHNvdXJjZVRleHRSYW5nZSkpO30KZnVuY3Rpb24gb25Tb3VyY2VDb250ZW50KHNvdXJjZVRleHRSYW5nZSxjb250ZW50KXtpZighY29udGVudCkKcmV0dXJuIG51bGw7bGV0IHRleHQ9dGV4dENhY2hlLmdldChjb250ZW50KTtpZighdGV4dCl7dGV4dD1uZXcgVGV4dFV0aWxzLlRleHQoY29udGVudCk7dGV4dENhY2hlLnNldChjb250ZW50LHRleHQpO30KY29uc3Qgb3JpZ2luYWxJZGVudGlmaWVyPXRleHQuZXh0cmFjdChzb3VyY2VUZXh0UmFuZ2UpLnRyaW0oKTtyZXR1cm4vW2EtekEtWjAtOV8kXSsvLnRlc3Qob3JpZ2luYWxJZGVudGlmaWVyKT9vcmlnaW5hbElkZW50aWZpZXI6bnVsbDt9fTtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX3Njb3BlUmVzb2x2ZWRGb3JUZXN0PWZ1bmN0aW9uKCl7fTtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX2FsbFZhcmlhYmxlc0luQ2FsbEZyYW1lPWZ1bmN0aW9uKGNhbGxGcmFtZSl7Y29uc3QgY2FjaGVkPWNhbGxGcmFtZVtTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX2NhY2hlZE1hcFN5bWJvbF07aWYoY2FjaGVkKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNhY2hlZCk7Y29uc3QgcHJvbWlzZXM9W107Y29uc3Qgc2NvcGVDaGFpbj1jYWxsRnJhbWUuc2NvcGVDaGFpbigpO2ZvcihsZXQgaT0wO2k8c2NvcGVDaGFpbi5sZW5ndGg7KytpKQpwcm9taXNlcy5wdXNoKFNvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fcmVzb2x2ZVNjb3BlKHNjb3BlQ2hhaW5baV0pKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4obWVyZ2VWYXJpYWJsZXMpO2Z1bmN0aW9uIG1lcmdlVmFyaWFibGVzKG5hbWVNYXBwaW5ncyl7Y29uc3QgcmV2ZXJzZU1hcHBpbmc9bmV3IE1hcCgpO2Zvcihjb25zdCBtYXAgb2YgbmFtZU1hcHBpbmdzKXtmb3IoY29uc3QgY29tcGlsZWROYW1lIG9mIG1hcC5rZXlzKCkpe2NvbnN0IG9yaWdpbmFsTmFtZT1tYXAuZ2V0KGNvbXBpbGVkTmFtZSk7aWYoIXJldmVyc2VNYXBwaW5nLmhhcyhvcmlnaW5hbE5hbWUpKQpyZXZlcnNlTWFwcGluZy5zZXQob3JpZ2luYWxOYW1lLGNvbXBpbGVkTmFtZSk7fX0KY2FsbEZyYW1lW1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fY2FjaGVkTWFwU3ltYm9sXT1yZXZlcnNlTWFwcGluZztyZXR1cm4gcmV2ZXJzZU1hcHBpbmc7fX07U291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLnJlc29sdmVFeHByZXNzaW9uPWZ1bmN0aW9uKGNhbGxGcmFtZSxvcmlnaW5hbFRleHQsdWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsc3RhcnRDb2x1bW5OdW1iZXIsZW5kQ29sdW1uTnVtYmVyKXtpZighdWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCkuaXNGcm9tU291cmNlTWFwKCkpCnJldHVybiBQcm9taXNlLnJlc29sdmUoJycpO3JldHVybiBTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX2FsbFZhcmlhYmxlc0luQ2FsbEZyYW1lKGNhbGxGcmFtZSkudGhlbihmaW5kQ29tcGlsZWROYW1lKTtmdW5jdGlvbiBmaW5kQ29tcGlsZWROYW1lKHJldmVyc2VNYXBwaW5nKXtpZihyZXZlcnNlTWFwcGluZy5oYXMob3JpZ2luYWxUZXh0KSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXZlcnNlTWFwcGluZy5nZXQob3JpZ2luYWxUZXh0KXx8JycpO3JldHVybiBTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX3Jlc29sdmVFeHByZXNzaW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLHN0YXJ0Q29sdW1uTnVtYmVyLGVuZENvbHVtbk51bWJlcik7fX07U291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLl9yZXNvbHZlRXhwcmVzc2lvbj1mdW5jdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixzdGFydENvbHVtbk51bWJlcixlbmRDb2x1bW5OdW1iZXIpe2NvbnN0IHJhd0xvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsbGluZU51bWJlcixzdGFydENvbHVtbk51bWJlcik7aWYoIXJhd0xvY2F0aW9uKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTtjb25zdCBzY3JpcHQ9cmF3TG9jYXRpb24uc2NyaXB0KCk7aWYoIXNjcmlwdCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7Y29uc3Qgc291cmNlTWFwPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5zb3VyY2VNYXBGb3JTY3JpcHQoc2NyaXB0KTtpZighc291cmNlTWFwKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTtyZXR1cm4gc2NyaXB0LnJlcXVlc3RDb250ZW50KCkudGhlbihvbkNvbnRlbnQpO2Z1bmN0aW9uIG9uQ29udGVudChjb250ZW50KXtpZighY29udGVudCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnJyk7Y29uc3QgdGV4dD1uZXcgVGV4dFV0aWxzLlRleHQoY29udGVudCk7Y29uc3QgdGV4dFJhbmdlPXNvdXJjZU1hcC5yZXZlcnNlTWFwVGV4dFJhbmdlKHVpU291cmNlQ29kZS51cmwoKSxuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShsaW5lTnVtYmVyLHN0YXJ0Q29sdW1uTnVtYmVyLGxpbmVOdW1iZXIsZW5kQ29sdW1uTnVtYmVyKSk7Y29uc3Qgb3JpZ2luYWxUZXh0PXRleHQuZXh0cmFjdCh0ZXh0UmFuZ2UpO2lmKCFvcmlnaW5hbFRleHQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoJycpO3JldHVybiBGb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLmV2YWx1YXRhYmxlSmF2YVNjcmlwdFN1YnN0cmluZyhvcmlnaW5hbFRleHQpO319O1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5yZXNvbHZlVGhpc09iamVjdD1mdW5jdGlvbihjYWxsRnJhbWUpe2lmKCFjYWxsRnJhbWUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKG51bGwpKTtpZighY2FsbEZyYW1lLnNjb3BlQ2hhaW4oKS5sZW5ndGgpCnJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbEZyYW1lLnRoaXNPYmplY3QoKSk7cmV0dXJuIFNvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fcmVzb2x2ZVNjb3BlKGNhbGxGcmFtZS5zY29wZUNoYWluKClbMF0pLnRoZW4ob25TY29wZVJlc29sdmVkKTtmdW5jdGlvbiBvblNjb3BlUmVzb2x2ZWQobmFtZXNNYXBwaW5nKXtjb25zdCB0aGlzTWFwcGluZ3M9bmFtZXNNYXBwaW5nLmludmVyc2UoKS5nZXQoJ3RoaXMnKTtpZighdGhpc01hcHBpbmdzfHx0aGlzTWFwcGluZ3Muc2l6ZSE9PTEpCnJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbEZyYW1lLnRoaXNPYmplY3QoKSk7Y29uc3QgdGhpc01hcHBpbmc9dGhpc01hcHBpbmdzLnZhbHVlc0FycmF5KClbMF07cmV0dXJuIGNhbGxGcmFtZS5ldmFsdWF0ZSh7ZXhwcmVzc2lvbjp0aGlzTWFwcGluZyxvYmplY3RHcm91cDonYmFja3RyYWNlJyxpbmNsdWRlQ29tbWFuZExpbmVBUEk6ZmFsc2Usc2lsZW50OnRydWUscmV0dXJuQnlWYWx1ZTpmYWxzZSxnZW5lcmF0ZVByZXZpZXc6dHJ1ZX0pLnRoZW4ob25FdmFsdWF0ZWQpO30KZnVuY3Rpb24gb25FdmFsdWF0ZWQocmVzdWx0KXtyZXR1cm4hcmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMmJnJlc3VsdC5vYmplY3Q/cmVzdWx0Lm9iamVjdDpjYWxsRnJhbWUudGhpc09iamVjdCgpO319O1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5yZXNvbHZlU2NvcGVJbk9iamVjdD1mdW5jdGlvbihzY29wZSl7Y29uc3Qgc3RhcnRMb2NhdGlvbj1zY29wZS5zdGFydExvY2F0aW9uKCk7Y29uc3QgZW5kTG9jYXRpb249c2NvcGUuZW5kTG9jYXRpb24oKTtpZihzY29wZS50eXBlKCk9PT1Qcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuR2xvYmFsfHwhc3RhcnRMb2NhdGlvbnx8IWVuZExvY2F0aW9ufHwhc3RhcnRMb2NhdGlvbi5zY3JpcHQoKXx8IXN0YXJ0TG9jYXRpb24uc2NyaXB0KCkuc291cmNlTWFwVVJMfHxzdGFydExvY2F0aW9uLnNjcmlwdCgpIT09ZW5kTG9jYXRpb24uc2NyaXB0KCkpCnJldHVybiBzY29wZS5vYmplY3QoKTtyZXR1cm4gbmV3IFNvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5SZW1vdGVPYmplY3Qoc2NvcGUpO307U291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLlJlbW90ZU9iamVjdD1jbGFzcyBleHRlbmRzIFNESy5SZW1vdGVPYmplY3R7Y29uc3RydWN0b3Ioc2NvcGUpe3N1cGVyKCk7dGhpcy5fc2NvcGU9c2NvcGU7dGhpcy5fb2JqZWN0PXNjb3BlLm9iamVjdCgpO30KY3VzdG9tUHJldmlldygpe3JldHVybiB0aGlzLl9vYmplY3QuY3VzdG9tUHJldmlldygpO30KZ2V0IG9iamVjdElkKCl7cmV0dXJuIHRoaXMuX29iamVjdC5vYmplY3RJZDt9CmdldCB0eXBlKCl7cmV0dXJuIHRoaXMuX29iamVjdC50eXBlO30KZ2V0IHN1YnR5cGUoKXtyZXR1cm4gdGhpcy5fb2JqZWN0LnN1YnR5cGU7fQpnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fb2JqZWN0LnZhbHVlO30KZ2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuX29iamVjdC5kZXNjcmlwdGlvbjt9CmdldCBoYXNDaGlsZHJlbigpe3JldHVybiB0aGlzLl9vYmplY3QuaGFzQ2hpbGRyZW47fQpnZXQgcHJldmlldygpe3JldHVybiB0aGlzLl9vYmplY3QucHJldmlldzt9CmFycmF5TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX29iamVjdC5hcnJheUxlbmd0aCgpO30KZ2V0T3duUHJvcGVydGllcyhnZW5lcmF0ZVByZXZpZXcsY2FsbGJhY2spe3RoaXMuX29iamVjdC5nZXRPd25Qcm9wZXJ0aWVzKGdlbmVyYXRlUHJldmlldyxjYWxsYmFjayk7fQpnZXRBbGxQcm9wZXJ0aWVzKGFjY2Vzc29yUHJvcGVydGllc09ubHksZ2VuZXJhdGVQcmV2aWV3LGNhbGxiYWNrKXtmdW5jdGlvbiB3cmFwcGVkQ2FsbGJhY2socHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpe1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5fcmVzb2x2ZVNjb3BlKHRoaXMuX3Njb3BlKS50aGVuKHJlc29sdmVOYW1lcy5iaW5kKG51bGwscHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpKTt9CmZ1bmN0aW9uIHJlc29sdmVOYW1lcyhwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyxuYW1lc01hcHBpbmcpe2NvbnN0IG5ld1Byb3BlcnRpZXM9W107aWYocHJvcGVydGllcyl7Zm9yKGxldCBpPTA7aTxwcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe2NvbnN0IHByb3BlcnR5PXByb3BlcnRpZXNbaV07Y29uc3QgbmFtZT1uYW1lc01hcHBpbmcuZ2V0KHByb3BlcnR5Lm5hbWUpfHxwcm9wZXJ0aWVzW2ldLm5hbWU7bmV3UHJvcGVydGllcy5wdXNoKG5ldyBTREsuUmVtb3RlT2JqZWN0UHJvcGVydHkobmFtZSxwcm9wZXJ0eS52YWx1ZSxwcm9wZXJ0eS5lbnVtZXJhYmxlLHByb3BlcnR5LndyaXRhYmxlLHByb3BlcnR5LmlzT3duLHByb3BlcnR5Lndhc1Rocm93bixwcm9wZXJ0eS5zeW1ib2wscHJvcGVydHkuc3ludGhldGljKSk7fX0KY2FsbGJhY2sobmV3UHJvcGVydGllcyxpbnRlcm5hbFByb3BlcnRpZXMpO30KdGhpcy5fb2JqZWN0LmdldEFsbFByb3BlcnRpZXMoYWNjZXNzb3JQcm9wZXJ0aWVzT25seSxnZW5lcmF0ZVByZXZpZXcsd3JhcHBlZENhbGxiYWNrLmJpbmQodGhpcykpO30KYXN5bmMgc2V0UHJvcGVydHlWYWx1ZShhcmd1bWVudE5hbWUsdmFsdWUpe2NvbnN0IG5hbWVzTWFwcGluZz1hd2FpdCBTb3VyY2VzLlNvdXJjZU1hcE5hbWVzUmVzb2x2ZXIuX3Jlc29sdmVTY29wZSh0aGlzLl9zY29wZSk7bGV0IG5hbWU7aWYodHlwZW9mIGFyZ3VtZW50TmFtZT09PSdzdHJpbmcnKQpuYW1lPWFyZ3VtZW50TmFtZTtlbHNlCm5hbWU9KGFyZ3VtZW50TmFtZS52YWx1ZSk7bGV0IGFjdHVhbE5hbWU9bmFtZTtmb3IoY29uc3QgY29tcGlsZWROYW1lIG9mIG5hbWVzTWFwcGluZy5rZXlzKCkpe2lmKG5hbWVzTWFwcGluZy5nZXQoY29tcGlsZWROYW1lKT09PW5hbWUpe2FjdHVhbE5hbWU9Y29tcGlsZWROYW1lO2JyZWFrO319CnJldHVybiB0aGlzLl9vYmplY3Quc2V0UHJvcGVydHlWYWx1ZShhY3R1YWxOYW1lLHZhbHVlKTt9CmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCxjYWxsYmFjayl7dGhpcy5fb2JqZWN0LmdldFByb3BlcnR5KHByb3BlcnR5UGF0aCxjYWxsYmFjayk7fQphc3luYyBkZWxldGVQcm9wZXJ0eShuYW1lKXtyZXR1cm4gdGhpcy5fb2JqZWN0LmRlbGV0ZVByb3BlcnR5KG5hbWUpO30KY2FsbEZ1bmN0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sYXJncyxjYWxsYmFjayl7dGhpcy5fb2JqZWN0LmNhbGxGdW5jdGlvbihmdW5jdGlvbkRlY2xhcmF0aW9uLGFyZ3MsY2FsbGJhY2spO30KY2FsbEZ1bmN0aW9uSlNPTihmdW5jdGlvbkRlY2xhcmF0aW9uLGFyZ3MsY2FsbGJhY2spe3RoaXMuX29iamVjdC5jYWxsRnVuY3Rpb25KU09OKGZ1bmN0aW9uRGVjbGFyYXRpb24sYXJncyxjYWxsYmFjayk7fQpyZWxlYXNlKCl7dGhpcy5fb2JqZWN0LnJlbGVhc2UoKTt9CmRlYnVnZ2VyTW9kZWwoKXtyZXR1cm4gdGhpcy5fb2JqZWN0LmRlYnVnZ2VyTW9kZWwoKTt9CnJ1bnRpbWVNb2RlbCgpe3JldHVybiB0aGlzLl9vYmplY3QucnVudGltZU1vZGVsKCk7fQppc05vZGUoKXtyZXR1cm4gdGhpcy5fb2JqZWN0LmlzTm9kZSgpO319OztTb3VyY2VzLkphdmFTY3JpcHRCcmVha3BvaW50c1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVGhyb3R0bGVkV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzb3VyY2VzL2phdmFTY3JpcHRCcmVha3BvaW50c1NpZGViYXJQYW5lLmNzcycpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyPUJpbmRpbmdzLmJyZWFrcG9pbnRNYW5hZ2VyO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuRXZlbnRzLkJyZWFrcG9pbnRBZGRlZCx0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLl9icmVha3BvaW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKEJpbmRpbmdzLkJyZWFrcG9pbnRNYW5hZ2VyLkV2ZW50cy5CcmVha3BvaW50UmVtb3ZlZCx0aGlzLnVwZGF0ZSx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnYnJlYWtwb2ludHNBY3RpdmUnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLl9saXN0RWxlbWVudD1udWxsO3RoaXMudXBkYXRlKCk7fQpkb1VwZGF0ZSgpe2NvbnN0IGJyZWFrcG9pbnRMb2NhdGlvbnM9dGhpcy5fYnJlYWtwb2ludE1hbmFnZXIuYWxsQnJlYWtwb2ludExvY2F0aW9ucygpO2lmKCFicmVha3BvaW50TG9jYXRpb25zLmxlbmd0aCl7dGhpcy5fbGlzdEVsZW1lbnQ9bnVsbDt0aGlzLmNvbnRlbnRFbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgZW1wdHlFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2dyYXktaW5mby1tZXNzYWdlJyk7ZW1wdHlFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gYnJlYWtwb2ludHMnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVtcHR5RWxlbWVudCk7dGhpcy5fZGlkVXBkYXRlRm9yVGVzdCgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmlmKCF0aGlzLl9saXN0RWxlbWVudCl7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2xpc3RFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3RoaXMuY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbGlzdEVsZW1lbnQpO30KYnJlYWtwb2ludExvY2F0aW9ucy5zb3J0KChpdGVtMSxpdGVtMik9Pml0ZW0xLnVpTG9jYXRpb24uY29tcGFyZVRvKGl0ZW0yLnVpTG9jYXRpb24pKTtjb25zdCBsb2NhdGlvbkZvckVudHJ5PW5ldyBNdWx0aW1hcCgpO2Zvcihjb25zdCBicmVha3BvaW50TG9jYXRpb24gb2YgYnJlYWtwb2ludExvY2F0aW9ucyl7Y29uc3QgdWlMb2NhdGlvbj1icmVha3BvaW50TG9jYXRpb24udWlMb2NhdGlvbjtjb25zdCBlbnRyeURlc2NyaXB0b3I9dWlMb2NhdGlvbi51aVNvdXJjZUNvZGUudXJsKCkrJzonK3VpTG9jYXRpb24ubGluZU51bWJlcjtsb2NhdGlvbkZvckVudHJ5LnNldChlbnRyeURlc2NyaXB0b3IsYnJlYWtwb2ludExvY2F0aW9uKTt9CmNvbnN0IGRldGFpbHM9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyk7Y29uc3Qgc2VsZWN0ZWRVSUxvY2F0aW9uPWRldGFpbHMmJmRldGFpbHMuY2FsbEZyYW1lcy5sZW5ndGg/QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKGRldGFpbHMuY2FsbEZyYW1lc1swXS5sb2NhdGlvbigpKTpudWxsO2xldCBzaG91bGRTaG93Vmlldz1mYWxzZTtsZXQgZW50cnk9dGhpcy5fbGlzdEVsZW1lbnQuZmlyc3RDaGlsZDtjb25zdCBwcm9taXNlcz1bXTtmb3IoY29uc3QgZGVzY3JpcHRvciBvZiBsb2NhdGlvbkZvckVudHJ5LmtleXNBcnJheSgpKXtpZighZW50cnkpe2VudHJ5PXRoaXMuX2xpc3RFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdicmVha3BvaW50LWVudHJ5Jyk7ZW50cnkuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2JyZWFrcG9pbnRDb250ZXh0TWVudS5iaW5kKHRoaXMpLHRydWUpO2VudHJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9yZXZlYWxMb2NhdGlvbi5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCBjaGVja2JveExhYmVsPVVJLkNoZWNrYm94TGFiZWwuY3JlYXRlKCcnKTtjaGVja2JveExhYmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9icmVha3BvaW50Q2hlY2tib3hDbGlja2VkLmJpbmQodGhpcyksZmFsc2UpO2VudHJ5LmFwcGVuZENoaWxkKGNoZWNrYm94TGFiZWwpO2VudHJ5W1NvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuX2NoZWNrYm94TGFiZWxTeW1ib2xdPWNoZWNrYm94TGFiZWw7Y29uc3Qgc25pcHBldEVsZW1lbnQ9ZW50cnkuY3JlYXRlQ2hpbGQoJ2RpdicsJ3NvdXJjZS10ZXh0IG1vbm9zcGFjZScpO2VudHJ5W1NvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuX3NuaXBwZXRFbGVtZW50U3ltYm9sXT1zbmlwcGV0RWxlbWVudDt9CmNvbnN0IGxvY2F0aW9ucz1BcnJheS5mcm9tKGxvY2F0aW9uRm9yRW50cnkuZ2V0KGRlc2NyaXB0b3IpKTtjb25zdCB1aUxvY2F0aW9uPWxvY2F0aW9uc1swXS51aUxvY2F0aW9uO2NvbnN0IGlzU2VsZWN0ZWQ9ISFzZWxlY3RlZFVJTG9jYXRpb24mJmxvY2F0aW9ucy5zb21lKGxvY2F0aW9uPT5sb2NhdGlvbi51aUxvY2F0aW9uLmlkKCk9PT1zZWxlY3RlZFVJTG9jYXRpb24uaWQoKSk7Y29uc3QgaGFzRW5hYmxlZD1sb2NhdGlvbnMuc29tZShsb2NhdGlvbj0+bG9jYXRpb24uYnJlYWtwb2ludC5lbmFibGVkKCkpO2NvbnN0IGhhc0Rpc2FibGVkPWxvY2F0aW9ucy5zb21lKGxvY2F0aW9uPT4hbG9jYXRpb24uYnJlYWtwb2ludC5lbmFibGVkKCkpO3Byb21pc2VzLnB1c2godGhpcy5fcmVzZXRFbnRyeSgoZW50cnkpLHVpTG9jYXRpb24saXNTZWxlY3RlZCxoYXNFbmFibGVkLGhhc0Rpc2FibGVkKSk7aWYoaXNTZWxlY3RlZCkKc2hvdWxkU2hvd1ZpZXc9dHJ1ZTtlbnRyeT1lbnRyeS5uZXh0U2libGluZzt9CndoaWxlKGVudHJ5KXtjb25zdCBuZXh0PWVudHJ5Lm5leHRTaWJsaW5nO2VudHJ5LnJlbW92ZSgpO2VudHJ5PW5leHQ7fQppZihzaG91bGRTaG93VmlldykKVUkudmlld01hbmFnZXIuc2hvd1ZpZXcoJ3NvdXJjZXMuanNCcmVha3BvaW50cycpO3RoaXMuX2xpc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2JyZWFrcG9pbnRzLWxpc3QtZGVhY3RpdmF0ZWQnLCFDb21tb24ubW9kdWxlU2V0dGluZygnYnJlYWtwb2ludHNBY3RpdmUnKS5nZXQoKSk7UHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCk9PnRoaXMuX2RpZFVwZGF0ZUZvclRlc3QoKSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KX3Jlc2V0RW50cnkoZWxlbWVudCx1aUxvY2F0aW9uLGlzU2VsZWN0ZWQsaGFzRW5hYmxlZCxoYXNEaXNhYmxlZCl7ZWxlbWVudFtTb3VyY2VzLkphdmFTY3JpcHRCcmVha3BvaW50c1NpZGViYXJQYW5lLl9sb2NhdGlvblN5bWJvbF09dWlMb2NhdGlvbjtlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2JyZWFrcG9pbnQtaGl0Jyxpc1NlbGVjdGVkKTtjb25zdCBjaGVja2JveExhYmVsPWVsZW1lbnRbU291cmNlcy5KYXZhU2NyaXB0QnJlYWtwb2ludHNTaWRlYmFyUGFuZS5fY2hlY2tib3hMYWJlbFN5bWJvbF07Y2hlY2tib3hMYWJlbC50ZXh0RWxlbWVudC50ZXh0Q29udGVudD11aUxvY2F0aW9uLmxpbmtUZXh0KCk7Y2hlY2tib3hMYWJlbC5jaGVja2JveEVsZW1lbnQuY2hlY2tlZD1oYXNFbmFibGVkO2NoZWNrYm94TGFiZWwuY2hlY2tib3hFbGVtZW50LmluZGV0ZXJtaW5hdGU9aGFzRW5hYmxlZCYmaGFzRGlzYWJsZWQ7Y29uc3Qgc25pcHBldEVsZW1lbnQ9ZWxlbWVudFtTb3VyY2VzLkphdmFTY3JpcHRCcmVha3BvaW50c1NpZGViYXJQYW5lLl9zbmlwcGV0RWxlbWVudFN5bWJvbF07cmV0dXJuIHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCkudGhlbihmaWxsU25pcHBldEVsZW1lbnQuYmluZChudWxsLHNuaXBwZXRFbGVtZW50KSk7ZnVuY3Rpb24gZmlsbFNuaXBwZXRFbGVtZW50KHNuaXBwZXRFbGVtZW50LGNvbnRlbnQpe2NvbnN0IGxpbmVOdW1iZXI9dWlMb2NhdGlvbi5saW5lTnVtYmVyO2NvbnN0IHRleHQ9bmV3IFRleHRVdGlscy5UZXh0KGNvbnRlbnR8fCcnKTtpZihsaW5lTnVtYmVyPHRleHQubGluZUNvdW50KCkpe2NvbnN0IGxpbmVUZXh0PXRleHQubGluZUF0KGxpbmVOdW1iZXIpO2NvbnN0IG1heFNuaXBwZXRMZW5ndGg9MjAwO3NuaXBwZXRFbGVtZW50LnRleHRDb250ZW50PWxpbmVUZXh0LnRyaW1FbmQobWF4U25pcHBldExlbmd0aCk7fX19Cl91aUxvY2F0aW9uRnJvbUV2ZW50KGV2ZW50KXtjb25zdCBub2RlPWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdicmVha3BvaW50LWVudHJ5Jyk7aWYoIW5vZGUpCnJldHVybiBudWxsO3JldHVybiBub2RlW1NvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuX2xvY2F0aW9uU3ltYm9sXXx8bnVsbDt9Cl9icmVha3BvaW50Q2hlY2tib3hDbGlja2VkKGV2ZW50KXtjb25zdCB1aUxvY2F0aW9uPXRoaXMuX3VpTG9jYXRpb25Gcm9tRXZlbnQoZXZlbnQpO2lmKCF1aUxvY2F0aW9uKQpyZXR1cm47Y29uc3QgYnJlYWtwb2ludHM9dGhpcy5fYnJlYWtwb2ludE1hbmFnZXIuZmluZEJyZWFrcG9pbnRzKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlcik7Y29uc3QgbmV3U3RhdGU9ZXZlbnQudGFyZ2V0LmNoZWNrYm94RWxlbWVudC5jaGVja2VkO2Zvcihjb25zdCBicmVha3BvaW50IG9mIGJyZWFrcG9pbnRzKQpicmVha3BvaW50LnNldEVuYWJsZWQobmV3U3RhdGUpO2V2ZW50LmNvbnN1bWUoKTt9Cl9yZXZlYWxMb2NhdGlvbihldmVudCl7Y29uc3QgdWlMb2NhdGlvbj10aGlzLl91aUxvY2F0aW9uRnJvbUV2ZW50KGV2ZW50KTtpZih1aUxvY2F0aW9uKQpDb21tb24uUmV2ZWFsZXIucmV2ZWFsKHVpTG9jYXRpb24pO30KX2JyZWFrcG9pbnRDb250ZXh0TWVudShldmVudCl7Y29uc3QgdWlMb2NhdGlvbj10aGlzLl91aUxvY2F0aW9uRnJvbUV2ZW50KGV2ZW50KTtpZighdWlMb2NhdGlvbikKcmV0dXJuO2NvbnN0IGJyZWFrcG9pbnRzPXRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLmZpbmRCcmVha3BvaW50cyh1aUxvY2F0aW9uLnVpU291cmNlQ29kZSx1aUxvY2F0aW9uLmxpbmVOdW1iZXIpO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29uc3QgcmVtb3ZlRW50cnlUaXRsZT1icmVha3BvaW50cy5sZW5ndGg+MT9Db21tb24uVUlTdHJpbmcoJ1JlbW92ZSBhbGwgYnJlYWtwb2ludHMgaW4gbGluZScpOkNvbW1vbi5VSVN0cmluZygnUmVtb3ZlIGJyZWFrcG9pbnQnKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0ocmVtb3ZlRW50cnlUaXRsZSwoKT0+YnJlYWtwb2ludHMubWFwKGJyZWFrcG9pbnQ9PmJyZWFrcG9pbnQucmVtb3ZlKGZhbHNlKSkpO2NvbnN0IGJyZWFrcG9pbnRBY3RpdmU9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2JyZWFrcG9pbnRzQWN0aXZlJykuZ2V0KCk7Y29uc3QgYnJlYWtwb2ludEFjdGl2ZVRpdGxlPWJyZWFrcG9pbnRBY3RpdmU/Q29tbW9uLlVJU3RyaW5nKCdEZWFjdGl2YXRlIGJyZWFrcG9pbnRzJyk6Q29tbW9uLlVJU3RyaW5nKCdBY3RpdmF0ZSBicmVha3BvaW50cycpO2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShicmVha3BvaW50QWN0aXZlVGl0bGUsKCk9PkNvbW1vbi5tb2R1bGVTZXR0aW5nKCdicmVha3BvaW50c0FjdGl2ZScpLnNldCghYnJlYWtwb2ludEFjdGl2ZSkpO2lmKGJyZWFrcG9pbnRzLnNvbWUoYnJlYWtwb2ludD0+IWJyZWFrcG9pbnQuZW5hYmxlZCgpKSl7Y29uc3QgZW5hYmxlVGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdFbmFibGUgYWxsIGJyZWFrcG9pbnRzJyk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKGVuYWJsZVRpdGxlLHRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLnRvZ2dsZUFsbEJyZWFrcG9pbnRzLmJpbmQodGhpcy5fYnJlYWtwb2ludE1hbmFnZXIsdHJ1ZSkpO30KaWYoYnJlYWtwb2ludHMuc29tZShicmVha3BvaW50PT5icmVha3BvaW50LmVuYWJsZWQoKSkpe2NvbnN0IGRpc2FibGVUaXRsZT1Db21tb24uVUlTdHJpbmcoJ0Rpc2FibGUgYWxsIGJyZWFrcG9pbnRzJyk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKGRpc2FibGVUaXRsZSx0aGlzLl9icmVha3BvaW50TWFuYWdlci50b2dnbGVBbGxCcmVha3BvaW50cy5iaW5kKHRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLGZhbHNlKSk7fQpjb25zdCByZW1vdmVBbGxUaXRsZT1Db21tb24uVUlTdHJpbmcoJ1JlbW92ZSBhbGwgYnJlYWtwb2ludHMnKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0ocmVtb3ZlQWxsVGl0bGUsdGhpcy5fYnJlYWtwb2ludE1hbmFnZXIucmVtb3ZlQWxsQnJlYWtwb2ludHMuYmluZCh0aGlzLl9icmVha3BvaW50TWFuYWdlcikpO2NvbnN0IHJlbW92ZU90aGVyVGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgb3RoZXIgYnJlYWtwb2ludHMnKTtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0ocmVtb3ZlT3RoZXJUaXRsZSx0aGlzLl9icmVha3BvaW50TWFuYWdlci5yZW1vdmVPdGhlckJyZWFrcG9pbnRzLmJpbmQodGhpcy5fYnJlYWtwb2ludE1hbmFnZXIsbmV3IFNldChicmVha3BvaW50cykpKTtjb250ZXh0TWVudS5zaG93KCk7fQpmbGF2b3JDaGFuZ2VkKG9iamVjdCl7dGhpcy51cGRhdGUoKTt9Cl9kaWRVcGRhdGVGb3JUZXN0KCl7fX07U291cmNlcy5KYXZhU2NyaXB0QnJlYWtwb2ludHNTaWRlYmFyUGFuZS5fbG9jYXRpb25TeW1ib2w9U3ltYm9sKCdsb2NhdGlvbicpO1NvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuX2NoZWNrYm94TGFiZWxTeW1ib2w9U3ltYm9sKCdjaGVja2JveC1sYWJlbCcpO1NvdXJjZXMuSmF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuX3NuaXBwZXRFbGVtZW50U3ltYm9sPVN5bWJvbCgnc25pcHBldC1lbGVtZW50Jyk7O1NvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWU9Y2xhc3MgZXh0ZW5kcyBTb3VyY2VGcmFtZS5Tb3VyY2VGcmFtZXtjb25zdHJ1Y3Rvcih1aVNvdXJjZUNvZGUpe3N1cGVyKHdvcmtpbmdDb3B5KTt0aGlzLl91aVNvdXJjZUNvZGU9dWlTb3VyY2VDb2RlO2lmKFJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdzb3VyY2VEaWZmJykpCnRoaXMuX2RpZmY9bmV3IFNvdXJjZUZyYW1lLlNvdXJjZUNvZGVEaWZmKHRoaXMudGV4dEVkaXRvcik7dGhpcy5fbXV0ZVNvdXJjZUNvZGVFdmVudHM9ZmFsc2U7dGhpcy5faXNTZXR0aW5nQ29udGVudD1mYWxzZTt0aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmc9UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYmluZGluZyh1aVNvdXJjZUNvZGUpO3RoaXMuX3Jvd01lc3NhZ2VCdWNrZXRzPW5ldyBNYXAoKTt0aGlzLl90eXBlRGVjb3JhdGlvbnNQZW5kaW5nPW5ldyBTZXQoKTt0aGlzLl91aVNvdXJjZUNvZGVFdmVudExpc3RlbmVycz1bXTt0aGlzLl9tZXNzYWdlQW5kRGVjb3JhdGlvbkxpc3RlbmVycz1bXTt0aGlzLl9ib3VuZE9uQmluZGluZ0NoYW5nZWQ9dGhpcy5fb25CaW5kaW5nQ2hhbmdlZC5iaW5kKHRoaXMpO3RoaXMudGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5FZGl0b3JCbHVycmVkLCgpPT5VSS5jb250ZXh0LnNldEZsYXZvcihTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLG51bGwpKTt0aGlzLnRleHRFZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuRWRpdG9yRm9jdXNlZCwoKT0+VUkuY29udGV4dC5zZXRGbGF2b3IoU291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZSx0aGlzKSk7Q29tbW9uLnNldHRpbmdzLm1vZHVsZVNldHRpbmcoJ3BlcnNpc3RlbmNlTmV0d29ya092ZXJyaWRlc0VuYWJsZWQnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9vbk5ldHdvcmtQZXJzaXN0ZW5jZUNoYW5nZWQsdGhpcyk7dGhpcy5fZXJyb3JQb3BvdmVySGVscGVyPW5ldyBVSS5Qb3BvdmVySGVscGVyKHRoaXMuZWxlbWVudCx0aGlzLl9nZXRFcnJvclBvcG92ZXJDb250ZW50LmJpbmQodGhpcykpO3RoaXMuX2Vycm9yUG9wb3ZlckhlbHBlci5zZXRIYXNQYWRkaW5nKHRydWUpO3RoaXMuX2Vycm9yUG9wb3ZlckhlbHBlci5zZXRUaW1lb3V0KDEwMCwxMDApO3RoaXMuX3BsdWdpbnM9W107dGhpcy5faW5pdGlhbGl6ZVVJU291cmNlQ29kZSgpO2Z1bmN0aW9uIHdvcmtpbmdDb3B5KCl7aWYodWlTb3VyY2VDb2RlLmlzRGlydHkoKSkKcmV0dXJuKFByb21pc2UucmVzb2x2ZSh1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSkpO3JldHVybiB1aVNvdXJjZUNvZGUucmVxdWVzdENvbnRlbnQoKTt9fQpfaW5zdGFsbE1lc3NhZ2VBbmREZWNvcmF0aW9uTGlzdGVuZXJzKCl7aWYodGhpcy5fcGVyc2lzdGVuY2VCaW5kaW5nKXtjb25zdCBuZXR3b3JrU291cmNlQ29kZT10aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmcubmV0d29yaztjb25zdCBmaWxlU3lzdGVtU291cmNlQ29kZT10aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmcuZmlsZVN5c3RlbTt0aGlzLl9tZXNzYWdlQW5kRGVjb3JhdGlvbkxpc3RlbmVycz1bbmV0d29ya1NvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlQWRkZWQsdGhpcy5fb25NZXNzYWdlQWRkZWQsdGhpcyksbmV0d29ya1NvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlUmVtb3ZlZCx0aGlzLl9vbk1lc3NhZ2VSZW1vdmVkLHRoaXMpLG5ldHdvcmtTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuTGluZURlY29yYXRpb25BZGRlZCx0aGlzLl9vbkxpbmVEZWNvcmF0aW9uQWRkZWQsdGhpcyksbmV0d29ya1NvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5MaW5lRGVjb3JhdGlvblJlbW92ZWQsdGhpcy5fb25MaW5lRGVjb3JhdGlvblJlbW92ZWQsdGhpcyksZmlsZVN5c3RlbVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlQWRkZWQsdGhpcy5fb25NZXNzYWdlQWRkZWQsdGhpcyksZmlsZVN5c3RlbVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlUmVtb3ZlZCx0aGlzLl9vbk1lc3NhZ2VSZW1vdmVkLHRoaXMpLF07fWVsc2V7dGhpcy5fbWVzc2FnZUFuZERlY29yYXRpb25MaXN0ZW5lcnM9W3RoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLk1lc3NhZ2VBZGRlZCx0aGlzLl9vbk1lc3NhZ2VBZGRlZCx0aGlzKSx0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5NZXNzYWdlUmVtb3ZlZCx0aGlzLl9vbk1lc3NhZ2VSZW1vdmVkLHRoaXMpLHRoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLkxpbmVEZWNvcmF0aW9uQWRkZWQsdGhpcy5fb25MaW5lRGVjb3JhdGlvbkFkZGVkLHRoaXMpLHRoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLkxpbmVEZWNvcmF0aW9uUmVtb3ZlZCx0aGlzLl9vbkxpbmVEZWNvcmF0aW9uUmVtb3ZlZCx0aGlzKV07fX0KdWlTb3VyY2VDb2RlKCl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZTt9CnNldFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe3RoaXMuX3VubG9hZFVJU291cmNlQ29kZSgpO3RoaXMuX3VpU291cmNlQ29kZT11aVNvdXJjZUNvZGU7aWYodWlTb3VyY2VDb2RlLmNvbnRlbnRMb2FkZWQoKSl7aWYodWlTb3VyY2VDb2RlLndvcmtpbmdDb3B5KCkhPT10aGlzLnRleHRFZGl0b3IudGV4dCgpKQp0aGlzLl9pbm5lclNldENvbnRlbnQodWlTb3VyY2VDb2RlLndvcmtpbmdDb3B5KCkpO31lbHNle3VpU291cmNlQ29kZS5yZXF1ZXN0Q29udGVudCgpLnRoZW4oKCk9PntpZih0aGlzLl91aVNvdXJjZUNvZGUhPT11aVNvdXJjZUNvZGUpCnJldHVybjtpZih1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSE9PXRoaXMudGV4dEVkaXRvci50ZXh0KCkpCnRoaXMuX2lubmVyU2V0Q29udGVudCh1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSk7fSk7fQp0aGlzLl9pbml0aWFsaXplVUlTb3VyY2VDb2RlKCk7fQpfdW5sb2FkVUlTb3VyY2VDb2RlKCl7dGhpcy5fZGlzcG9zZVBsdWdpbnMoKTtmb3IoY29uc3QgbWVzc2FnZSBvZiB0aGlzLl9hbGxNZXNzYWdlcygpKQp0aGlzLl9yZW1vdmVNZXNzYWdlRnJvbVNvdXJjZShtZXNzYWdlKTtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fbWVzc2FnZUFuZERlY29yYXRpb25MaXN0ZW5lcnMpO0NvbW1vbi5FdmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLl91aVNvdXJjZUNvZGVFdmVudExpc3RlbmVycyk7dGhpcy5fdWlTb3VyY2VDb2RlLnJlbW92ZVdvcmtpbmdDb3B5R2V0dGVyKCk7UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UudW5zdWJzY3JpYmVGcm9tQmluZGluZ0V2ZW50KHRoaXMuX3VpU291cmNlQ29kZSx0aGlzLl9ib3VuZE9uQmluZGluZ0NoYW5nZWQpO30KX2luaXRpYWxpemVVSVNvdXJjZUNvZGUoKXt0aGlzLl91aVNvdXJjZUNvZGVFdmVudExpc3RlbmVycz1bdGhpcy5fdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX29uV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMpLHRoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX29uV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcyksdGhpcy5fdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuVGl0bGVDaGFuZ2VkLHRoaXMuX3JlZnJlc2hIaWdobGlnaHRlclR5cGUsdGhpcyldO1BlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnN1YnNjcmliZUZvckJpbmRpbmdFdmVudCh0aGlzLl91aVNvdXJjZUNvZGUsdGhpcy5fYm91bmRPbkJpbmRpbmdDaGFuZ2VkKTtmb3IoY29uc3QgbWVzc2FnZSBvZiB0aGlzLl9hbGxNZXNzYWdlcygpKQp0aGlzLl9hZGRNZXNzYWdlVG9Tb3VyY2UobWVzc2FnZSk7dGhpcy5faW5zdGFsbE1lc3NhZ2VBbmREZWNvcmF0aW9uTGlzdGVuZXJzKCk7dGhpcy5fdXBkYXRlU3R5bGUoKTt0aGlzLl9kZWNvcmF0ZUFsbFR5cGVzKCk7dGhpcy5fcmVmcmVzaEhpZ2hsaWdodGVyVHlwZSgpO2lmKFJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdzb3VyY2VzUHJldHR5UHJpbnQnKSl7Y29uc3Qgc3VwcG9ydGVkUHJldHR5VHlwZXM9bmV3IFNldChbJ3RleHQvaHRtbCcsJ3RleHQvY3NzJywndGV4dC9qYXZhc2NyaXB0J10pO3RoaXMuc2V0Q2FuUHJldHR5UHJpbnQoc3VwcG9ydGVkUHJldHR5VHlwZXMuaGFzKHRoaXMuaGlnaGxpZ2h0ZXJUeXBlKCkpLHRydWUpO30KdGhpcy5fZW5zdXJlUGx1Z2luc0xvYWRlZCgpO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO3NldEltbWVkaWF0ZSh0aGlzLl91cGRhdGVCdWNrZXREZWNvcmF0aW9ucy5iaW5kKHRoaXMpKTt0aGlzLnNldEVkaXRhYmxlKHRoaXMuX2NhbkVkaXRTb3VyY2UoKSk7Zm9yKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKQpwbHVnaW4ud2FzU2hvd24oKTt9CndpbGxIaWRlKCl7Zm9yKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKQpwbHVnaW4ud2lsbEhpZGUoKTtzdXBlci53aWxsSGlkZSgpO1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUsbnVsbCk7dGhpcy5fdWlTb3VyY2VDb2RlLnJlbW92ZVdvcmtpbmdDb3B5R2V0dGVyKCk7fQpfcmVmcmVzaEhpZ2hsaWdodGVyVHlwZSgpe2NvbnN0IGJpbmRpbmc9UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYmluZGluZyh0aGlzLl91aVNvdXJjZUNvZGUpO2NvbnN0IGhpZ2hsaWdodGVyVHlwZT1iaW5kaW5nP2JpbmRpbmcubmV0d29yay5taW1lVHlwZSgpOnRoaXMuX3VpU291cmNlQ29kZS5taW1lVHlwZSgpO2lmKHRoaXMuaGlnaGxpZ2h0ZXJUeXBlKCk9PT1oaWdobGlnaHRlclR5cGUpCnJldHVybjt0aGlzLl9kaXNwb3NlUGx1Z2lucygpO3RoaXMuc2V0SGlnaGxpZ2h0ZXJUeXBlKGhpZ2hsaWdodGVyVHlwZSk7dGhpcy5fZW5zdXJlUGx1Z2luc0xvYWRlZCgpO30KX2NhbkVkaXRTb3VyY2UoKXtpZihQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHRoaXMuX3VpU291cmNlQ29kZSkpCnJldHVybiB0cnVlO2lmKHRoaXMuX3VpU291cmNlQ29kZS5wcm9qZWN0KCkuY2FuU2V0RmlsZUNvbnRlbnQoKSkKcmV0dXJuIHRydWU7aWYodGhpcy5fdWlTb3VyY2VDb2RlLnByb2plY3QoKS5pc1NlcnZpY2VQcm9qZWN0KCkpCnJldHVybiBmYWxzZTtpZih0aGlzLl91aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuTmV0d29yayYmUGVyc2lzdGVuY2UubmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlci5hY3RpdmUoKSkKcmV0dXJuIHRydWU7aWYodGhpcy5wcmV0dHkmJnRoaXMuX3VpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmhhc1NjcmlwdHMoKSkKcmV0dXJuIGZhbHNlO3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKSE9PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50O30KX29uTmV0d29ya1BlcnNpc3RlbmNlQ2hhbmdlZCgpe3RoaXMuc2V0RWRpdGFibGUodGhpcy5fY2FuRWRpdFNvdXJjZSgpKTt9CmNvbW1pdEVkaXRpbmcoKXtpZighdGhpcy5fdWlTb3VyY2VDb2RlLmlzRGlydHkoKSkKcmV0dXJuO3RoaXMuX211dGVTb3VyY2VDb2RlRXZlbnRzPXRydWU7dGhpcy5fdWlTb3VyY2VDb2RlLmNvbW1pdFdvcmtpbmdDb3B5KCk7dGhpcy5fbXV0ZVNvdXJjZUNvZGVFdmVudHM9ZmFsc2U7fQpzZXRDb250ZW50KGNvbnRlbnQpe3RoaXMuX2Rpc3Bvc2VQbHVnaW5zKCk7dGhpcy5fcm93TWVzc2FnZUJ1Y2tldHMuY2xlYXIoKTtzdXBlci5zZXRDb250ZW50KGNvbnRlbnQpO2Zvcihjb25zdCBtZXNzYWdlIG9mIHRoaXMuX2FsbE1lc3NhZ2VzKCkpCnRoaXMuX2FkZE1lc3NhZ2VUb1NvdXJjZShtZXNzYWdlKTt0aGlzLl9kZWNvcmF0ZUFsbFR5cGVzKCk7dGhpcy5fZW5zdXJlUGx1Z2luc0xvYWRlZCgpO30KX2FsbE1lc3NhZ2VzKCl7aWYodGhpcy5fcGVyc2lzdGVuY2VCaW5kaW5nKXtjb25zdCBjb21iaW5lZFNldD10aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmcubmV0d29yay5tZXNzYWdlcygpO2NvbWJpbmVkU2V0LmFkZEFsbCh0aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmcuZmlsZVN5c3RlbS5tZXNzYWdlcygpKTtyZXR1cm4gY29tYmluZWRTZXQ7fQpyZXR1cm4gdGhpcy5fdWlTb3VyY2VDb2RlLm1lc3NhZ2VzKCk7fQpvblRleHRDaGFuZ2VkKG9sZFJhbmdlLG5ld1JhbmdlKXtjb25zdCB3YXNQcmV0dHk9dGhpcy5wcmV0dHk7c3VwZXIub25UZXh0Q2hhbmdlZChvbGRSYW5nZSxuZXdSYW5nZSk7dGhpcy5fZXJyb3JQb3BvdmVySGVscGVyLmhpZGVQb3BvdmVyKCk7aWYodGhpcy5faXNTZXR0aW5nQ29udGVudCkKcmV0dXJuO1NvdXJjZXMuU291cmNlc1BhbmVsLmluc3RhbmNlKCkudXBkYXRlTGFzdE1vZGlmaWNhdGlvblRpbWUoKTt0aGlzLl9tdXRlU291cmNlQ29kZUV2ZW50cz10cnVlO2lmKHRoaXMuaXNDbGVhbigpKQp0aGlzLl91aVNvdXJjZUNvZGUucmVzZXRXb3JraW5nQ29weSgpO2Vsc2UKdGhpcy5fdWlTb3VyY2VDb2RlLnNldFdvcmtpbmdDb3B5R2V0dGVyKHRoaXMudGV4dEVkaXRvci50ZXh0LmJpbmQodGhpcy50ZXh0RWRpdG9yKSk7dGhpcy5fbXV0ZVNvdXJjZUNvZGVFdmVudHM9ZmFsc2U7aWYod2FzUHJldHR5IT09dGhpcy5wcmV0dHkpe3RoaXMuX3VwZGF0ZVN0eWxlKCk7dGhpcy5fZGlzcG9zZVBsdWdpbnMoKTt0aGlzLl9lbnN1cmVQbHVnaW5zTG9hZGVkKCk7fX0KX29uV29ya2luZ0NvcHlDaGFuZ2VkKGV2ZW50KXtpZih0aGlzLl9tdXRlU291cmNlQ29kZUV2ZW50cykKcmV0dXJuO3RoaXMuX2lubmVyU2V0Q29udGVudCh0aGlzLl91aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSk7fQpfb25Xb3JraW5nQ29weUNvbW1pdHRlZChldmVudCl7aWYoIXRoaXMuX211dGVTb3VyY2VDb2RlRXZlbnRzKQp0aGlzLl9pbm5lclNldENvbnRlbnQodGhpcy5fdWlTb3VyY2VDb2RlLndvcmtpbmdDb3B5KCkpO3RoaXMuY29udGVudENvbW1pdHRlZCgpO3RoaXMuX3VwZGF0ZVN0eWxlKCk7fQpfZW5zdXJlUGx1Z2luc0xvYWRlZCgpe2lmKCF0aGlzLmxvYWRlZHx8dGhpcy5fcGx1Z2lucy5sZW5ndGgpCnJldHVybjtjb25zdCBiaW5kaW5nPVBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLmJpbmRpbmcodGhpcy5fdWlTb3VyY2VDb2RlKTtjb25zdCBwbHVnaW5VSVNvdXJjZUNvZGU9YmluZGluZz9iaW5kaW5nLm5ldHdvcms6dGhpcy5fdWlTb3VyY2VDb2RlO2lmKFNvdXJjZXMuRGVidWdnZXJQbHVnaW4uYWNjZXB0cyhwbHVnaW5VSVNvdXJjZUNvZGUpKQp0aGlzLl9wbHVnaW5zLnB1c2gobmV3IFNvdXJjZXMuRGVidWdnZXJQbHVnaW4odGhpcy50ZXh0RWRpdG9yLHBsdWdpblVJU291cmNlQ29kZSx0aGlzLnRyYW5zZm9ybWVyKCkpKTtpZihTb3VyY2VzLkNTU1BsdWdpbi5hY2NlcHRzKHBsdWdpblVJU291cmNlQ29kZSkpCnRoaXMuX3BsdWdpbnMucHVzaChuZXcgU291cmNlcy5DU1NQbHVnaW4odGhpcy50ZXh0RWRpdG9yKSk7aWYoIXRoaXMucHJldHR5JiZTb3VyY2VzLkphdmFTY3JpcHRDb21waWxlclBsdWdpbi5hY2NlcHRzKHBsdWdpblVJU291cmNlQ29kZSkpCnRoaXMuX3BsdWdpbnMucHVzaChuZXcgU291cmNlcy5KYXZhU2NyaXB0Q29tcGlsZXJQbHVnaW4odGhpcy50ZXh0RWRpdG9yLHBsdWdpblVJU291cmNlQ29kZSkpO2lmKFNvdXJjZXMuU25pcHBldHNQbHVnaW4uYWNjZXB0cyhwbHVnaW5VSVNvdXJjZUNvZGUpKQp0aGlzLl9wbHVnaW5zLnB1c2gobmV3IFNvdXJjZXMuU25pcHBldHNQbHVnaW4odGhpcy50ZXh0RWRpdG9yLHBsdWdpblVJU291cmNlQ29kZSkpO2lmKCF0aGlzLnByZXR0eSYmUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ3NvdXJjZURpZmYnKSYmU291cmNlcy5HdXR0ZXJEaWZmUGx1Z2luLmFjY2VwdHMocGx1Z2luVUlTb3VyY2VDb2RlKSkKdGhpcy5fcGx1Z2lucy5wdXNoKG5ldyBTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW4odGhpcy50ZXh0RWRpdG9yLHBsdWdpblVJU291cmNlQ29kZSkpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuRXZlbnRzLlRvb2xiYXJJdGVtc0NoYW5nZWQpO2Zvcihjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykKcGx1Z2luLndhc1Nob3duKCk7fQpfZGlzcG9zZVBsdWdpbnMoKXt0aGlzLnRleHRFZGl0b3Iub3BlcmF0aW9uKCgpPT57Zm9yKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKQpwbHVnaW4uZGlzcG9zZSgpO30pO3RoaXMuX3BsdWdpbnM9W107fQpfb25CaW5kaW5nQ2hhbmdlZCgpe2NvbnN0IGJpbmRpbmc9UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYmluZGluZyh0aGlzLl91aVNvdXJjZUNvZGUpO2lmKGJpbmRpbmc9PT10aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmcpCnJldHVybjt0aGlzLl91bmxvYWRVSVNvdXJjZUNvZGUoKTt0aGlzLl9wZXJzaXN0ZW5jZUJpbmRpbmc9YmluZGluZzt0aGlzLl9pbml0aWFsaXplVUlTb3VyY2VDb2RlKCk7fQpfdXBkYXRlU3R5bGUoKXt0aGlzLnNldEVkaXRhYmxlKHRoaXMuX2NhbkVkaXRTb3VyY2UoKSk7fQpfaW5uZXJTZXRDb250ZW50KGNvbnRlbnQpe3RoaXMuX2lzU2V0dGluZ0NvbnRlbnQ9dHJ1ZTtjb25zdCBvbGRDb250ZW50PXRoaXMudGV4dEVkaXRvci50ZXh0KCk7aWYodGhpcy5fZGlmZikKdGhpcy5fZGlmZi5oaWdobGlnaHRNb2RpZmllZExpbmVzKG9sZENvbnRlbnQsY29udGVudCk7aWYob2xkQ29udGVudCE9PWNvbnRlbnQpCnRoaXMuc2V0Q29udGVudChjb250ZW50KTt0aGlzLl9pc1NldHRpbmdDb250ZW50PWZhbHNlO30KYXN5bmMgcG9wdWxhdGVUZXh0QXJlYUNvbnRleHRNZW51KGNvbnRleHRNZW51LGVkaXRvckxpbmVOdW1iZXIsZWRpdG9yQ29sdW1uTnVtYmVyKXthd2FpdCBzdXBlci5wb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnUoY29udGV4dE1lbnUsZWRpdG9yTGluZU51bWJlcixlZGl0b3JDb2x1bW5OdW1iZXIpO2NvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyh0aGlzLl91aVNvdXJjZUNvZGUpO2NvbnN0IGxvY2F0aW9uPXRoaXMudHJhbnNmb3JtZXIoKS5lZGl0b3JUb1Jhd0xvY2F0aW9uKGVkaXRvckxpbmVOdW1iZXIsZWRpdG9yQ29sdW1uTnVtYmVyKTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXMobmV3IFdvcmtzcGFjZS5VSUxvY2F0aW9uKHRoaXMuX3VpU291cmNlQ29kZSxsb2NhdGlvblswXSxsb2NhdGlvblsxXSkpO2NvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyh0aGlzKTtmb3IoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpCmF3YWl0IHBsdWdpbi5wb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnUoY29udGV4dE1lbnUsZWRpdG9yTGluZU51bWJlcixlZGl0b3JDb2x1bW5OdW1iZXIpO30KZGlzcG9zZSgpe3RoaXMuX2Vycm9yUG9wb3ZlckhlbHBlci5kaXNwb3NlKCk7dGhpcy5fdW5sb2FkVUlTb3VyY2VDb2RlKCk7dGhpcy50ZXh0RWRpdG9yLmRpc3Bvc2UoKTt0aGlzLmRldGFjaCgpO0NvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdwZXJzaXN0ZW5jZU5ldHdvcmtPdmVycmlkZXNFbmFibGVkJykucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5fb25OZXR3b3JrUGVyc2lzdGVuY2VDaGFuZ2VkLHRoaXMpO30KX29uTWVzc2FnZUFkZGVkKGV2ZW50KXtjb25zdCBtZXNzYWdlPShldmVudC5kYXRhKTt0aGlzLl9hZGRNZXNzYWdlVG9Tb3VyY2UobWVzc2FnZSk7fQpfYWRkTWVzc2FnZVRvU291cmNlKG1lc3NhZ2Upe2lmKCF0aGlzLmxvYWRlZCkKcmV0dXJuO2NvbnN0IGVkaXRvckxvY2F0aW9uPXRoaXMudHJhbnNmb3JtZXIoKS5yYXdUb0VkaXRvckxvY2F0aW9uKG1lc3NhZ2UubGluZU51bWJlcigpLG1lc3NhZ2UuY29sdW1uTnVtYmVyKCkpO2xldCBlZGl0b3JMaW5lTnVtYmVyPWVkaXRvckxvY2F0aW9uWzBdO2lmKGVkaXRvckxpbmVOdW1iZXI+PXRoaXMudGV4dEVkaXRvci5saW5lc0NvdW50KQplZGl0b3JMaW5lTnVtYmVyPXRoaXMudGV4dEVkaXRvci5saW5lc0NvdW50LTE7aWYoZWRpdG9yTGluZU51bWJlcjwwKQplZGl0b3JMaW5lTnVtYmVyPTA7bGV0IG1lc3NhZ2VCdWNrZXQ9dGhpcy5fcm93TWVzc2FnZUJ1Y2tldHMuZ2V0KGVkaXRvckxpbmVOdW1iZXIpO2lmKCFtZXNzYWdlQnVja2V0KXttZXNzYWdlQnVja2V0PW5ldyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlJvd01lc3NhZ2VCdWNrZXQodGhpcyx0aGlzLnRleHRFZGl0b3IsZWRpdG9yTGluZU51bWJlcik7dGhpcy5fcm93TWVzc2FnZUJ1Y2tldHMuc2V0KGVkaXRvckxpbmVOdW1iZXIsbWVzc2FnZUJ1Y2tldCk7fQptZXNzYWdlQnVja2V0LmFkZE1lc3NhZ2UobWVzc2FnZSk7fQpfb25NZXNzYWdlUmVtb3ZlZChldmVudCl7Y29uc3QgbWVzc2FnZT0oZXZlbnQuZGF0YSk7dGhpcy5fcmVtb3ZlTWVzc2FnZUZyb21Tb3VyY2UobWVzc2FnZSk7fQpfcmVtb3ZlTWVzc2FnZUZyb21Tb3VyY2UobWVzc2FnZSl7aWYoIXRoaXMubG9hZGVkKQpyZXR1cm47Y29uc3QgZWRpdG9yTG9jYXRpb249dGhpcy50cmFuc2Zvcm1lcigpLnJhd1RvRWRpdG9yTG9jYXRpb24obWVzc2FnZS5saW5lTnVtYmVyKCksbWVzc2FnZS5jb2x1bW5OdW1iZXIoKSk7bGV0IGVkaXRvckxpbmVOdW1iZXI9ZWRpdG9yTG9jYXRpb25bMF07aWYoZWRpdG9yTGluZU51bWJlcj49dGhpcy50ZXh0RWRpdG9yLmxpbmVzQ291bnQpCmVkaXRvckxpbmVOdW1iZXI9dGhpcy50ZXh0RWRpdG9yLmxpbmVzQ291bnQtMTtpZihlZGl0b3JMaW5lTnVtYmVyPDApCmVkaXRvckxpbmVOdW1iZXI9MDtjb25zdCBtZXNzYWdlQnVja2V0PXRoaXMuX3Jvd01lc3NhZ2VCdWNrZXRzLmdldChlZGl0b3JMaW5lTnVtYmVyKTtpZighbWVzc2FnZUJ1Y2tldCkKcmV0dXJuO21lc3NhZ2VCdWNrZXQucmVtb3ZlTWVzc2FnZShtZXNzYWdlKTtpZighbWVzc2FnZUJ1Y2tldC51bmlxdWVNZXNzYWdlc0NvdW50KCkpe21lc3NhZ2VCdWNrZXQuZGV0YWNoRnJvbUVkaXRvcigpO3RoaXMuX3Jvd01lc3NhZ2VCdWNrZXRzLmRlbGV0ZShlZGl0b3JMaW5lTnVtYmVyKTt9fQpfZ2V0RXJyb3JQb3BvdmVyQ29udGVudChldmVudCl7Y29uc3QgZWxlbWVudD1ldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygndGV4dC1lZGl0b3ItbGluZS1kZWNvcmF0aW9uLWljb24nKXx8ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3RleHQtZWRpdG9yLWxpbmUtZGVjb3JhdGlvbi13YXZlJyk7aWYoIWVsZW1lbnQpCnJldHVybiBudWxsO2NvbnN0IGFuY2hvcj1lbGVtZW50LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3RleHQtZWRpdG9yLWxpbmUtZGVjb3JhdGlvbi1pY29uJyk/ZWxlbWVudC5ib3hJbldpbmRvdygpOm5ldyBBbmNob3JCb3goZXZlbnQuY2xpZW50WCxldmVudC5jbGllbnRZLDEsMSk7cmV0dXJue2JveDphbmNob3Isc2hvdzpwb3BvdmVyPT57Y29uc3QgbWVzc2FnZUJ1Y2tldD1lbGVtZW50LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3RleHQtZWRpdG9yLWxpbmUtZGVjb3JhdGlvbicpLl9tZXNzYWdlQnVja2V0O2NvbnN0IG1lc3NhZ2VzT3V0bGluZT1tZXNzYWdlQnVja2V0Lm1lc3NhZ2VzRGVzY3JpcHRpb24oKTtwb3BvdmVyLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKG1lc3NhZ2VzT3V0bGluZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTt9fTt9Cl91cGRhdGVCdWNrZXREZWNvcmF0aW9ucygpe2Zvcihjb25zdCBidWNrZXQgb2YgdGhpcy5fcm93TWVzc2FnZUJ1Y2tldHMudmFsdWVzKCkpCmJ1Y2tldC5fdXBkYXRlRGVjb3JhdGlvbigpO30KX29uTGluZURlY29yYXRpb25BZGRlZChldmVudCl7Y29uc3QgbWFya2VyPShldmVudC5kYXRhKTt0aGlzLl9kZWNvcmF0ZVR5cGVUaHJvdHRsZWQobWFya2VyLnR5cGUoKSk7fQpfb25MaW5lRGVjb3JhdGlvblJlbW92ZWQoZXZlbnQpe2NvbnN0IG1hcmtlcj0oZXZlbnQuZGF0YSk7dGhpcy5fZGVjb3JhdGVUeXBlVGhyb3R0bGVkKG1hcmtlci50eXBlKCkpO30KX2RlY29yYXRlVHlwZVRocm90dGxlZCh0eXBlKXtpZih0aGlzLl90eXBlRGVjb3JhdGlvbnNQZW5kaW5nLmhhcyh0eXBlKSkKcmV0dXJuO3RoaXMuX3R5cGVEZWNvcmF0aW9uc1BlbmRpbmcuYWRkKHR5cGUpO3NlbGYucnVudGltZS5leHRlbnNpb25zKFNvdXJjZUZyYW1lLkxpbmVEZWNvcmF0b3IpLmZpbmQoZXh0ZW5zaW9uPT5leHRlbnNpb24uZGVzY3JpcHRvcigpWydkZWNvcmF0b3JUeXBlJ109PT10eXBlKS5pbnN0YW5jZSgpLnRoZW4oZGVjb3JhdG9yPT57dGhpcy5fdHlwZURlY29yYXRpb25zUGVuZGluZy5kZWxldGUodHlwZSk7dGhpcy50ZXh0RWRpdG9yLmNvZGVNaXJyb3IoKS5vcGVyYXRpb24oKCk9PntkZWNvcmF0b3IuZGVjb3JhdGUodGhpcy5fcGVyc2lzdGVuY2VCaW5kaW5nP3RoaXMuX3BlcnNpc3RlbmNlQmluZGluZy5uZXR3b3JrOnRoaXMudWlTb3VyY2VDb2RlKCksdGhpcy50ZXh0RWRpdG9yKTt9KTt9KTt9Cl9kZWNvcmF0ZUFsbFR5cGVzKCl7aWYoIXRoaXMubG9hZGVkKQpyZXR1cm47Zm9yKGNvbnN0IGV4dGVuc2lvbiBvZiBzZWxmLnJ1bnRpbWUuZXh0ZW5zaW9ucyhTb3VyY2VGcmFtZS5MaW5lRGVjb3JhdG9yKSl7Y29uc3QgdHlwZT1leHRlbnNpb24uZGVzY3JpcHRvcigpWydkZWNvcmF0b3JUeXBlJ107aWYodGhpcy5fdWlTb3VyY2VDb2RlLmRlY29yYXRpb25zRm9yVHlwZSh0eXBlKSkKdGhpcy5fZGVjb3JhdGVUeXBlVGhyb3R0bGVkKHR5cGUpO319CnN5bmNUb29sYmFySXRlbXMoKXtjb25zdCBsZWZ0VG9vbGJhckl0ZW1zPXN1cGVyLnN5bmNUb29sYmFySXRlbXMoKTtjb25zdCByaWdodFRvb2xiYXJJdGVtcz1bXTtmb3IoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpe2xlZnRUb29sYmFySXRlbXMucHVzaEFsbChwbHVnaW4ubGVmdFRvb2xiYXJJdGVtcygpKTtyaWdodFRvb2xiYXJJdGVtcy5wdXNoQWxsKHBsdWdpbi5yaWdodFRvb2xiYXJJdGVtcygpKTt9CmlmKCFyaWdodFRvb2xiYXJJdGVtcy5sZW5ndGgpCnJldHVybiBsZWZ0VG9vbGJhckl0ZW1zO3JldHVyblsuLi5sZWZ0VG9vbGJhckl0ZW1zLG5ldyBVSS5Ub29sYmFyU2VwYXJhdG9yKHRydWUpLC4uLnJpZ2h0VG9vbGJhckl0ZW1zXTt9CmFzeW5jIHBvcHVsYXRlTGluZUd1dHRlckNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIpe2F3YWl0IHN1cGVyLnBvcHVsYXRlTGluZUd1dHRlckNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIpO2Zvcihjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykKYXdhaXQgcGx1Z2luLnBvcHVsYXRlTGluZUd1dHRlckNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIpO319O1NvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2ljb25DbGFzc1BlckxldmVsPXt9O1NvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2ljb25DbGFzc1BlckxldmVsW1dvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5MZXZlbC5FcnJvcl09J3NtYWxsaWNvbi1lcnJvcic7U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5faWNvbkNsYXNzUGVyTGV2ZWxbV29ya3NwYWNlLlVJU291cmNlQ29kZS5NZXNzYWdlLkxldmVsLldhcm5pbmddPSdzbWFsbGljb24td2FybmluZyc7U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5fYnViYmxlVHlwZVBlckxldmVsPXt9O1NvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2J1YmJsZVR5cGVQZXJMZXZlbFtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UuTGV2ZWwuRXJyb3JdPSdlcnJvcic7U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5fYnViYmxlVHlwZVBlckxldmVsW1dvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5MZXZlbC5XYXJuaW5nXT0nd2FybmluZyc7U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5fbGluZUNsYXNzUGVyTGV2ZWw9e307U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5fbGluZUNsYXNzUGVyTGV2ZWxbV29ya3NwYWNlLlVJU291cmNlQ29kZS5NZXNzYWdlLkxldmVsLkVycm9yXT0ndGV4dC1lZGl0b3ItbGluZS13aXRoLWVycm9yJztTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLl9saW5lQ2xhc3NQZXJMZXZlbFtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UuTGV2ZWwuV2FybmluZ109J3RleHQtZWRpdG9yLWxpbmUtd2l0aC13YXJuaW5nJztTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlJvd01lc3NhZ2U9Y2xhc3N7Y29uc3RydWN0b3IobWVzc2FnZSl7dGhpcy5fbWVzc2FnZT1tZXNzYWdlO3RoaXMuX3JlcGVhdENvdW50PTE7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RleHQtZWRpdG9yLXJvdy1tZXNzYWdlJyk7dGhpcy5faWNvbj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2xhYmVsJywnJywnZHQtaWNvbi1sYWJlbCcpO3RoaXMuX2ljb24udHlwZT1Tb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLl9pY29uQ2xhc3NQZXJMZXZlbFttZXNzYWdlLmxldmVsKCldO3RoaXMuX3JlcGVhdENvdW50RWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2xhYmVsJywndGV4dC1lZGl0b3Itcm93LW1lc3NhZ2UtcmVwZWF0LWNvdW50IGhpZGRlbicsJ2R0LXNtYWxsLWJ1YmJsZScpO3RoaXMuX3JlcGVhdENvdW50RWxlbWVudC50eXBlPVNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2J1YmJsZVR5cGVQZXJMZXZlbFttZXNzYWdlLmxldmVsKCldO2NvbnN0IGxpbmVzQ29udGFpbmVyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7Y29uc3QgbGluZXM9dGhpcy5fbWVzc2FnZS50ZXh0KCkuc3BsaXQoJ1xuJyk7Zm9yKGxldCBpPTA7aTxsaW5lcy5sZW5ndGg7KytpKXtjb25zdCBtZXNzYWdlTGluZT1saW5lc0NvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2Jyk7bWVzc2FnZUxpbmUudGV4dENvbnRlbnQ9bGluZXNbaV07fX0KbWVzc2FnZSgpe3JldHVybiB0aGlzLl9tZXNzYWdlO30KcmVwZWF0Q291bnQoKXtyZXR1cm4gdGhpcy5fcmVwZWF0Q291bnQ7fQpzZXRSZXBlYXRDb3VudChyZXBlYXRDb3VudCl7aWYodGhpcy5fcmVwZWF0Q291bnQ9PT1yZXBlYXRDb3VudCkKcmV0dXJuO3RoaXMuX3JlcGVhdENvdW50PXJlcGVhdENvdW50O3RoaXMuX3VwZGF0ZU1lc3NhZ2VSZXBlYXRDb3VudCgpO30KX3VwZGF0ZU1lc3NhZ2VSZXBlYXRDb3VudCgpe3RoaXMuX3JlcGVhdENvdW50RWxlbWVudC50ZXh0Q29udGVudD10aGlzLl9yZXBlYXRDb3VudDtjb25zdCBzaG93UmVwZWF0Q291bnQ9dGhpcy5fcmVwZWF0Q291bnQ+MTt0aGlzLl9yZXBlYXRDb3VudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhc2hvd1JlcGVhdENvdW50KTt0aGlzLl9pY29uLmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsc2hvd1JlcGVhdENvdW50KTt9fTtTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlJvd01lc3NhZ2VCdWNrZXQ9Y2xhc3N7Y29uc3RydWN0b3Ioc291cmNlRnJhbWUsdGV4dEVkaXRvcixlZGl0b3JMaW5lTnVtYmVyKXt0aGlzLl9zb3VyY2VGcmFtZT1zb3VyY2VGcmFtZTt0aGlzLnRleHRFZGl0b3I9dGV4dEVkaXRvcjt0aGlzLl9saW5lSGFuZGxlPXRleHRFZGl0b3IudGV4dEVkaXRvclBvc2l0aW9uSGFuZGxlKGVkaXRvckxpbmVOdW1iZXIsMCk7dGhpcy5fZGVjb3JhdGlvbj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0ZXh0LWVkaXRvci1saW5lLWRlY29yYXRpb24nKTt0aGlzLl9kZWNvcmF0aW9uLl9tZXNzYWdlQnVja2V0PXRoaXM7dGhpcy5fd2F2ZT10aGlzLl9kZWNvcmF0aW9uLmNyZWF0ZUNoaWxkKCdkaXYnLCd0ZXh0LWVkaXRvci1saW5lLWRlY29yYXRpb24td2F2ZScpO3RoaXMuX2ljb249dGhpcy5fd2F2ZS5jcmVhdGVDaGlsZCgnbGFiZWwnLCd0ZXh0LWVkaXRvci1saW5lLWRlY29yYXRpb24taWNvbicsJ2R0LWljb24tbGFiZWwnKTt0aGlzLl9kZWNvcmF0aW9uU3RhcnRDb2x1bW49bnVsbDt0aGlzLl9tZXNzYWdlc0Rlc2NyaXB0aW9uRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0ZXh0LWVkaXRvci1tZXNzYWdlcy1kZXNjcmlwdGlvbi1jb250YWluZXInKTt0aGlzLl9tZXNzYWdlcz1bXTt0aGlzLl9sZXZlbD1udWxsO30KX3VwZGF0ZVdhdmVQb3NpdGlvbihlZGl0b3JMaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7ZWRpdG9yTGluZU51bWJlcj1NYXRoLm1pbihlZGl0b3JMaW5lTnVtYmVyLHRoaXMudGV4dEVkaXRvci5saW5lc0NvdW50LTEpO2NvbnN0IGxpbmVUZXh0PXRoaXMudGV4dEVkaXRvci5saW5lKGVkaXRvckxpbmVOdW1iZXIpO2NvbHVtbk51bWJlcj1NYXRoLm1pbihjb2x1bW5OdW1iZXIsbGluZVRleHQubGVuZ3RoKTtjb25zdCBsaW5lSW5kZW50PVRleHRVdGlscy5UZXh0VXRpbHMubGluZUluZGVudChsaW5lVGV4dCkubGVuZ3RoO2NvbnN0IHN0YXJ0Q29sdW1uPU1hdGgubWF4KGNvbHVtbk51bWJlci0xLGxpbmVJbmRlbnQpO2lmKHRoaXMuX2RlY29yYXRpb25TdGFydENvbHVtbj09PXN0YXJ0Q29sdW1uKQpyZXR1cm47aWYodGhpcy5fZGVjb3JhdGlvblN0YXJ0Q29sdW1uIT09bnVsbCkKdGhpcy50ZXh0RWRpdG9yLnJlbW92ZURlY29yYXRpb24odGhpcy5fZGVjb3JhdGlvbixlZGl0b3JMaW5lTnVtYmVyKTt0aGlzLnRleHRFZGl0b3IuYWRkRGVjb3JhdGlvbih0aGlzLl9kZWNvcmF0aW9uLGVkaXRvckxpbmVOdW1iZXIsc3RhcnRDb2x1bW4pO3RoaXMuX2RlY29yYXRpb25TdGFydENvbHVtbj1zdGFydENvbHVtbjt9Cm1lc3NhZ2VzRGVzY3JpcHRpb24oKXt0aGlzLl9tZXNzYWdlc0Rlc2NyaXB0aW9uRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO1VJLmFwcGVuZFN0eWxlKHRoaXMuX21lc3NhZ2VzRGVzY3JpcHRpb25FbGVtZW50LCdzb3VyY2VfZnJhbWUvbWVzc2FnZXNQb3BvdmVyLmNzcycpO2ZvcihsZXQgaT0wO2k8dGhpcy5fbWVzc2FnZXMubGVuZ3RoOysraSkKdGhpcy5fbWVzc2FnZXNEZXNjcmlwdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbWVzc2FnZXNbaV0uZWxlbWVudCk7cmV0dXJuIHRoaXMuX21lc3NhZ2VzRGVzY3JpcHRpb25FbGVtZW50O30KZGV0YWNoRnJvbUVkaXRvcigpe2NvbnN0IHBvc2l0aW9uPXRoaXMuX2xpbmVIYW5kbGUucmVzb2x2ZSgpO2lmKCFwb3NpdGlvbikKcmV0dXJuO2NvbnN0IGVkaXRvckxpbmVOdW1iZXI9cG9zaXRpb24ubGluZU51bWJlcjtpZih0aGlzLl9sZXZlbCl7dGhpcy50ZXh0RWRpdG9yLnRvZ2dsZUxpbmVDbGFzcyhlZGl0b3JMaW5lTnVtYmVyLFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2xpbmVDbGFzc1BlckxldmVsW3RoaXMuX2xldmVsXSxmYWxzZSk7fQppZih0aGlzLl9kZWNvcmF0aW9uU3RhcnRDb2x1bW4hPT1udWxsKXt0aGlzLnRleHRFZGl0b3IucmVtb3ZlRGVjb3JhdGlvbih0aGlzLl9kZWNvcmF0aW9uLGVkaXRvckxpbmVOdW1iZXIpO3RoaXMuX2RlY29yYXRpb25TdGFydENvbHVtbj1udWxsO319CnVuaXF1ZU1lc3NhZ2VzQ291bnQoKXtyZXR1cm4gdGhpcy5fbWVzc2FnZXMubGVuZ3RoO30KYWRkTWVzc2FnZShtZXNzYWdlKXtmb3IobGV0IGk9MDtpPHRoaXMuX21lc3NhZ2VzLmxlbmd0aDsrK2kpe2NvbnN0IHJvd01lc3NhZ2U9dGhpcy5fbWVzc2FnZXNbaV07aWYocm93TWVzc2FnZS5tZXNzYWdlKCkuaXNFcXVhbChtZXNzYWdlKSl7cm93TWVzc2FnZS5zZXRSZXBlYXRDb3VudChyb3dNZXNzYWdlLnJlcGVhdENvdW50KCkrMSk7cmV0dXJuO319CmNvbnN0IHJvd01lc3NhZ2U9bmV3IFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuUm93TWVzc2FnZShtZXNzYWdlKTt0aGlzLl9tZXNzYWdlcy5wdXNoKHJvd01lc3NhZ2UpO3RoaXMuX3VwZGF0ZURlY29yYXRpb24oKTt9CnJlbW92ZU1lc3NhZ2UobWVzc2FnZSl7Zm9yKGxldCBpPTA7aTx0aGlzLl9tZXNzYWdlcy5sZW5ndGg7KytpKXtjb25zdCByb3dNZXNzYWdlPXRoaXMuX21lc3NhZ2VzW2ldO2lmKCFyb3dNZXNzYWdlLm1lc3NhZ2UoKS5pc0VxdWFsKG1lc3NhZ2UpKQpjb250aW51ZTtyb3dNZXNzYWdlLnNldFJlcGVhdENvdW50KHJvd01lc3NhZ2UucmVwZWF0Q291bnQoKS0xKTtpZighcm93TWVzc2FnZS5yZXBlYXRDb3VudCgpKQp0aGlzLl9tZXNzYWdlcy5zcGxpY2UoaSwxKTt0aGlzLl91cGRhdGVEZWNvcmF0aW9uKCk7cmV0dXJuO319Cl91cGRhdGVEZWNvcmF0aW9uKCl7aWYoIXRoaXMuX3NvdXJjZUZyYW1lLmlzU2hvd2luZygpKQpyZXR1cm47aWYoIXRoaXMuX21lc3NhZ2VzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IHBvc2l0aW9uPXRoaXMuX2xpbmVIYW5kbGUucmVzb2x2ZSgpO2lmKCFwb3NpdGlvbikKcmV0dXJuO2NvbnN0IGVkaXRvckxpbmVOdW1iZXI9cG9zaXRpb24ubGluZU51bWJlcjtsZXQgY29sdW1uTnVtYmVyPU51bWJlci5NQVhfVkFMVUU7bGV0IG1heE1lc3NhZ2U9bnVsbDtmb3IobGV0IGk9MDtpPHRoaXMuX21lc3NhZ2VzLmxlbmd0aDsrK2kpe2NvbnN0IG1lc3NhZ2U9dGhpcy5fbWVzc2FnZXNbaV0ubWVzc2FnZSgpO2NvbnN0IGVkaXRvckxvY2F0aW9uPXRoaXMuX3NvdXJjZUZyYW1lLnRyYW5zZm9ybWVyKCkucmF3VG9FZGl0b3JMb2NhdGlvbihlZGl0b3JMaW5lTnVtYmVyLG1lc3NhZ2UuY29sdW1uTnVtYmVyKCkpO2NvbHVtbk51bWJlcj1NYXRoLm1pbihjb2x1bW5OdW1iZXIsZWRpdG9yTG9jYXRpb25bMV0pO2lmKCFtYXhNZXNzYWdlfHxXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UubWVzc2FnZUxldmVsQ29tcGFyYXRvcihtYXhNZXNzYWdlLG1lc3NhZ2UpPDApCm1heE1lc3NhZ2U9bWVzc2FnZTt9CnRoaXMuX3VwZGF0ZVdhdmVQb3NpdGlvbihlZGl0b3JMaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7aWYodGhpcy5fbGV2ZWw9PT1tYXhNZXNzYWdlLmxldmVsKCkpCnJldHVybjtpZih0aGlzLl9sZXZlbCl7dGhpcy50ZXh0RWRpdG9yLnRvZ2dsZUxpbmVDbGFzcyhlZGl0b3JMaW5lTnVtYmVyLFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2xpbmVDbGFzc1BlckxldmVsW3RoaXMuX2xldmVsXSxmYWxzZSk7dGhpcy5faWNvbi50eXBlPScnO30KdGhpcy5fbGV2ZWw9bWF4TWVzc2FnZS5sZXZlbCgpO2lmKCF0aGlzLl9sZXZlbCkKcmV0dXJuO3RoaXMudGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MoZWRpdG9yTGluZU51bWJlcixTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLl9saW5lQ2xhc3NQZXJMZXZlbFt0aGlzLl9sZXZlbF0sdHJ1ZSk7dGhpcy5faWNvbi50eXBlPVNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUuX2ljb25DbGFzc1BlckxldmVsW3RoaXMuX2xldmVsXTt9fTtXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLk1lc3NhZ2UuX21lc3NhZ2VMZXZlbFByaW9yaXR5PXsnV2FybmluZyc6MywnRXJyb3InOjR9O1dvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5tZXNzYWdlTGV2ZWxDb21wYXJhdG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5fbWVzc2FnZUxldmVsUHJpb3JpdHlbYS5sZXZlbCgpXS0KV29ya3NwYWNlLlVJU291cmNlQ29kZS5NZXNzYWdlLl9tZXNzYWdlTGV2ZWxQcmlvcml0eVtiLmxldmVsKCldO307U291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5QbHVnaW49Y2xhc3N7c3RhdGljIGFjY2VwdHModWlTb3VyY2VDb2RlKXtyZXR1cm4gZmFsc2U7fQp3YXNTaG93bigpe30Kd2lsbEhpZGUoKXt9CnJpZ2h0VG9vbGJhckl0ZW1zKCl7cmV0dXJuW107fQpsZWZ0VG9vbGJhckl0ZW1zKCl7cmV0dXJuW107fQpwb3B1bGF0ZUxpbmVHdXR0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSxsaW5lTnVtYmVyKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpwb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnUoY29udGV4dE1lbnUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmRpc3Bvc2UoKXt9fTtTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLkV2ZW50cz17VG9vbGJhckl0ZW1zQ2hhbmdlZDpTeW1ib2woJ1Rvb2xiYXJJdGVtc0NoYW5nZWQnKX07O1NvdXJjZXMuRGVidWdnZXJQbHVnaW49Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlBsdWdpbntjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLHVpU291cmNlQ29kZSx0cmFuc2Zvcm1lcil7c3VwZXIoKTt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLl90cmFuc2Zvcm1lcj10cmFuc2Zvcm1lcjt0aGlzLl9jb25kaXRpb25FZGl0b3JFbGVtZW50PW51bGw7dGhpcy5fY29uZGl0aW9uRWxlbWVudD1udWxsO3RoaXMuX2V4ZWN1dGlvbkxvY2F0aW9uPW51bGw7dGhpcy5fY29udHJvbERvd249ZmFsc2U7dGhpcy5fYXN5bmNTdGVwSW5Ib3ZlcmVkTGluZT0wO3RoaXMuX2FzeW5jU3RlcEluSG92ZXJlZD1mYWxzZTt0aGlzLl9jbGVhclZhbHVlV2lkZ2V0c1RpbWVyPW51bGw7dGhpcy5fc291cmNlTWFwSW5mb2Jhcj1udWxsO3RoaXMuX2NvbnRyb2xUaW1lb3V0PW51bGw7dGhpcy5fc2NyaXB0c1BhbmVsPVNvdXJjZXMuU291cmNlc1BhbmVsLmluc3RhbmNlKCk7dGhpcy5fYnJlYWtwb2ludE1hbmFnZXI9QmluZGluZ3MuYnJlYWtwb2ludE1hbmFnZXI7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkRlYnVnZ2VyKQp0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc291cmNlLWZyYW1lLWRlYnVnZ2VyLXNjcmlwdCcpO3RoaXMuX3BvcG92ZXJIZWxwZXI9bmV3IFVJLlBvcG92ZXJIZWxwZXIodGhpcy5fc2NyaXB0c1BhbmVsLmVsZW1lbnQsdGhpcy5fZ2V0UG9wb3ZlclJlcXVlc3QuYmluZCh0aGlzKSk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXREaXNhYmxlT25DbGljayh0cnVlKTt0aGlzLl9wb3BvdmVySGVscGVyLnNldFRpbWVvdXQoMjUwLDI1MCk7dGhpcy5fcG9wb3ZlckhlbHBlci5zZXRIYXNQYWRkaW5nKHRydWUpO3RoaXMuX2JvdW5kUG9wb3ZlckhlbHBlckhpZGU9dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3Zlci5iaW5kKHRoaXMuX3BvcG92ZXJIZWxwZXIpO3RoaXMuX3NjcmlwdHNQYW5lbC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fYm91bmRQb3BvdmVySGVscGVySGlkZSx0cnVlKTt0aGlzLl9ib3VuZEtleURvd249KHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRLZXlEb3duLHRydWUpO3RoaXMuX2JvdW5kS2V5VXA9KHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSk7dGhpcy5fdGV4dEVkaXRvci5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJyx0aGlzLl9ib3VuZEtleVVwLHRydWUpO3RoaXMuX2JvdW5kTW91c2VNb3ZlPSh0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9ib3VuZE1vdXNlTW92ZSxmYWxzZSk7dGhpcy5fYm91bmRNb3VzZURvd249KHRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcykpO3RoaXMuX3RleHRFZGl0b3IuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHRoaXMuX2JvdW5kTW91c2VEb3duLHRydWUpO3RoaXMuX2JvdW5kQmx1cj10aGlzLl9vbkJsdXIuYmluZCh0aGlzKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLHRoaXMuX2JvdW5kQmx1cixmYWxzZSk7dGhpcy5fYm91bmRXaGVlbD1ldmVudD0+e2lmKFVJLktleWJvYXJkU2hvcnRjdXQuZXZlbnRIYXNDdHJsT3JNZXRhKGV2ZW50KSkKZXZlbnQucHJldmVudERlZmF1bHQoKTt9O3RoaXMuX3RleHRFZGl0b3IuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsdGhpcy5fYm91bmRXaGVlbCx0cnVlKTt0aGlzLl90ZXh0RWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoU291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuRXZlbnRzLkd1dHRlckNsaWNrLHRoaXMuX2hhbmRsZUd1dHRlckNsaWNrLHRoaXMpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuRXZlbnRzLkJyZWFrcG9pbnRBZGRlZCx0aGlzLl9icmVha3BvaW50QWRkZWQsdGhpcyk7dGhpcy5fYnJlYWtwb2ludE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5FdmVudHMuQnJlYWtwb2ludFJlbW92ZWQsdGhpcy5fYnJlYWtwb2ludFJlbW92ZWQsdGhpcyk7dGhpcy5fdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX3dvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTt0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl93b3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTt0aGlzLl9icmVha3BvaW50RGVjb3JhdGlvbnM9bmV3IFNldCgpO3RoaXMuX2RlY29yYXRpb25CeUJyZWFrcG9pbnQ9bmV3IE1hcCgpO3RoaXMuX3Bvc3NpYmxlQnJlYWtwb2ludHNSZXF1ZXN0ZWQ9bmV3IFNldCgpO3RoaXMuX3NjcmlwdEZpbGVGb3JEZWJ1Z2dlck1vZGVsPW5ldyBNYXAoKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3Nob3dCbGFja2JveEluZm9iYXJJZk5lZWRlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcENvbnRlbnRTY3JpcHRzJykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fc2hvd0JsYWNrYm94SW5mb2JhcklmTmVlZGVkLHRoaXMpO3RoaXMuX3ZhbHVlV2lkZ2V0cz1uZXcgTWFwKCk7dGhpcy5fY29udGludWVUb0xvY2F0aW9uRGVjb3JhdGlvbnM9bnVsbDtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSx0aGlzLl9jYWxsRnJhbWVDaGFuZ2VkLHRoaXMpO3RoaXMuX2xpdmVMb2NhdGlvblBvb2w9bmV3IEJpbmRpbmdzLkxpdmVMb2NhdGlvblBvb2woKTt0aGlzLl9jYWxsRnJhbWVDaGFuZ2VkKCk7dGhpcy5fdXBkYXRlU2NyaXB0RmlsZXMoKTtpZih0aGlzLl91aVNvdXJjZUNvZGUuaXNEaXJ0eSgpJiYhdGhpcy5fc3VwcG9ydHNFbmFibGVkQnJlYWtwb2ludHNXaGlsZUVkaXRpbmcoKSl7dGhpcy5fbXV0ZWQ9dHJ1ZTt0aGlzLl9tdXRlZEZyb21TdGFydD10cnVlO31lbHNle3RoaXMuX211dGVkPWZhbHNlO3RoaXMuX211dGVkRnJvbVN0YXJ0PWZhbHNlO3RoaXMuX2luaXRpYWxpemVCcmVha3BvaW50cygpO30KdGhpcy5fYmxhY2tib3hJbmZvYmFyPW51bGw7dGhpcy5fc2hvd0JsYWNrYm94SW5mb2JhcklmTmVlZGVkKCk7Y29uc3Qgc2NyaXB0RmlsZXM9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwudmFsdWVzQXJyYXkoKTtmb3IobGV0IGk9MDtpPHNjcmlwdEZpbGVzLmxlbmd0aDsrK2kpCnNjcmlwdEZpbGVzW2ldLmNoZWNrTWFwcGluZygpO3RoaXMuX2hhc0xpbmVXaXRob3V0TWFwcGluZz1mYWxzZTt0aGlzLl91cGRhdGVMaW5lc1dpdGhvdXRNYXBwaW5nSGlnaGxpZ2h0KCk7aWYoIVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdzb3VyY2VzUHJldHR5UHJpbnQnKSl7dGhpcy5fcHJldHR5UHJpbnRJbmZvYmFyPW51bGw7dGhpcy5fZGV0ZWN0TWluaWZpZWQoKTt9fQpzdGF0aWMgYWNjZXB0cyh1aVNvdXJjZUNvZGUpe3JldHVybiB1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5oYXNTY3JpcHRzKCk7fQpyaWdodFRvb2xiYXJJdGVtcygpe2NvbnN0IG9yaWdpblVSTD1CaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcudWlTb3VyY2VDb2RlT3JpZ2luKHRoaXMuX3VpU291cmNlQ29kZSk7aWYob3JpZ2luVVJMKXtjb25zdCBwYXJzZWRVUkw9b3JpZ2luVVJMLmFzUGFyc2VkVVJMKCk7aWYocGFyc2VkVVJMKQpyZXR1cm5bbmV3IFVJLlRvb2xiYXJUZXh0KENvbW1vbi5VSVN0cmluZygnKHNvdXJjZSBtYXBwZWQgZnJvbSAlcyknLHBhcnNlZFVSTC5kaXNwbGF5TmFtZSkpXTt9CnJldHVybltdO30KX3Nob3dCbGFja2JveEluZm9iYXJJZk5lZWRlZCgpe2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl91aVNvdXJjZUNvZGU7aWYoIXVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmhhc1NjcmlwdHMoKSkKcmV0dXJuO2NvbnN0IHByb2plY3RUeXBlPXVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpO2lmKCFCaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuaXNCbGFja2JveGVkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSkpe3RoaXMuX2hpZGVCbGFja2JveEluZm9iYXIoKTtyZXR1cm47fQppZih0aGlzLl9ibGFja2JveEluZm9iYXIpCnRoaXMuX2JsYWNrYm94SW5mb2Jhci5kaXNwb3NlKCk7Y29uc3QgaW5mb2Jhcj1uZXcgVUkuSW5mb2JhcihVSS5JbmZvYmFyLlR5cGUuV2FybmluZyxDb21tb24uVUlTdHJpbmcoJ1RoaXMgc2NyaXB0IGlzIGJsYWNrYm94ZWQgaW4gZGVidWdnZXInKSk7dGhpcy5fYmxhY2tib3hJbmZvYmFyPWluZm9iYXI7aW5mb2Jhci5jcmVhdGVEZXRhaWxzUm93TWVzc2FnZShDb21tb24uVUlTdHJpbmcoJ0RlYnVnZ2VyIHdpbGwgc2tpcCBzdGVwcGluZyB0aHJvdWdoIHRoaXMgc2NyaXB0LCBhbmQgd2lsbCBub3Qgc3RvcCBvbiBleGNlcHRpb25zJykpO2NvbnN0IHNjcmlwdEZpbGU9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwuc2l6ZT90aGlzLl9zY3JpcHRGaWxlRm9yRGVidWdnZXJNb2RlbC52YWx1ZXNBcnJheSgpWzBdOm51bGw7aWYoc2NyaXB0RmlsZSYmc2NyaXB0RmlsZS5oYXNTb3VyY2VNYXBVUkwoKSkKaW5mb2Jhci5jcmVhdGVEZXRhaWxzUm93TWVzc2FnZShDb21tb24uVUlTdHJpbmcoJ1NvdXJjZSBtYXAgZm91bmQsIGJ1dCBpZ25vcmVkIGZvciBibGFja2JveGVkIGZpbGUuJykpO2luZm9iYXIuY3JlYXRlRGV0YWlsc1Jvd01lc3NhZ2UoKTtpbmZvYmFyLmNyZWF0ZURldGFpbHNSb3dNZXNzYWdlKENvbW1vbi5VSVN0cmluZygnUG9zc2libGUgd2F5cyB0byBjYW5jZWwgdGhpcyBiZWhhdmlvciBhcmU6JykpO2luZm9iYXIuY3JlYXRlRGV0YWlsc1Jvd01lc3NhZ2UoJyAtICcpLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ0dvIHRvICIlcyIgdGFiIGluIHNldHRpbmdzJyxDb21tb24uVUlTdHJpbmcoJ0JsYWNrYm94aW5nJykpKTtjb25zdCB1bmJsYWNrYm94TGluaz1pbmZvYmFyLmNyZWF0ZURldGFpbHNSb3dNZXNzYWdlKCcgLSAnKS5jcmVhdGVDaGlsZCgnc3BhbicsJ2xpbmsnKTt1bmJsYWNrYm94TGluay50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1VuYmxhY2tib3ggdGhpcyBzY3JpcHQnKTt1bmJsYWNrYm94TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdW5ibGFja2JveCxmYWxzZSk7ZnVuY3Rpb24gdW5ibGFja2JveCgpe0JpbmRpbmdzLmJsYWNrYm94TWFuYWdlci51bmJsYWNrYm94VUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7aWYocHJvamVjdFR5cGU9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkNvbnRlbnRTY3JpcHRzKQpCaW5kaW5ncy5ibGFja2JveE1hbmFnZXIudW5ibGFja2JveENvbnRlbnRTY3JpcHRzKCk7fQp0aGlzLl90ZXh0RWRpdG9yLmF0dGFjaEluZm9iYXIodGhpcy5fYmxhY2tib3hJbmZvYmFyKTt9Cl9oaWRlQmxhY2tib3hJbmZvYmFyKCl7aWYoIXRoaXMuX2JsYWNrYm94SW5mb2JhcikKcmV0dXJuO3RoaXMuX2JsYWNrYm94SW5mb2Jhci5kaXNwb3NlKCk7dGhpcy5fYmxhY2tib3hJbmZvYmFyPW51bGw7fQp3YXNTaG93bigpe2lmKHRoaXMuX2V4ZWN1dGlvbkxvY2F0aW9uKXtzZXRJbW1lZGlhdGUoKCk9Pnt0aGlzLl9nZW5lcmF0ZVZhbHVlc0luU291cmNlKCk7fSk7fX0Kd2lsbEhpZGUoKXt0aGlzLl9wb3BvdmVySGVscGVyLmhpZGVQb3BvdmVyKCk7fQpwb3B1bGF0ZUxpbmVHdXR0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSxlZGl0b3JMaW5lTnVtYmVyKXtmdW5jdGlvbiBwb3B1bGF0ZShyZXNvbHZlLHJlamVjdCl7Y29uc3QgdWlMb2NhdGlvbj1uZXcgV29ya3NwYWNlLlVJTG9jYXRpb24odGhpcy5fdWlTb3VyY2VDb2RlLGVkaXRvckxpbmVOdW1iZXIsMCk7dGhpcy5fc2NyaXB0c1BhbmVsLmFwcGVuZFVJTG9jYXRpb25JdGVtcyhjb250ZXh0TWVudSx1aUxvY2F0aW9uKTtjb25zdCBicmVha3BvaW50cz10aGlzLl9saW5lQnJlYWtwb2ludERlY29yYXRpb25zKGVkaXRvckxpbmVOdW1iZXIpLm1hcChkZWNvcmF0aW9uPT5kZWNvcmF0aW9uLmJyZWFrcG9pbnQpLmZpbHRlcihicmVha3BvaW50PT4hIWJyZWFrcG9pbnQpO2lmKCFicmVha3BvaW50cy5sZW5ndGgpe2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdBZGQgYnJlYWtwb2ludCcpLHRoaXMuX2NyZWF0ZU5ld0JyZWFrcG9pbnQuYmluZCh0aGlzLGVkaXRvckxpbmVOdW1iZXIsJycsdHJ1ZSkpO2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdBZGQgY29uZGl0aW9uYWwgYnJlYWtwb2ludFx1MjAyNicpLHRoaXMuX2VkaXRCcmVha3BvaW50Q29uZGl0aW9uLmJpbmQodGhpcyxlZGl0b3JMaW5lTnVtYmVyLG51bGwsbnVsbCkpO2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdOZXZlciBwYXVzZSBoZXJlJyksdGhpcy5fY3JlYXRlTmV3QnJlYWtwb2ludC5iaW5kKHRoaXMsZWRpdG9yTGluZU51bWJlciwnZmFsc2UnLHRydWUpKTt9ZWxzZXtjb25zdCBoYXNPbmVCcmVha3BvaW50PWJyZWFrcG9pbnRzLmxlbmd0aD09PTE7Y29uc3QgcmVtb3ZlVGl0bGU9aGFzT25lQnJlYWtwb2ludD9Db21tb24uVUlTdHJpbmcoJ1JlbW92ZSBicmVha3BvaW50Jyk6Q29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgYWxsIGJyZWFrcG9pbnRzIGluIGxpbmUnKTtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKHJlbW92ZVRpdGxlLCgpPT5icmVha3BvaW50cy5tYXAoYnJlYWtwb2ludD0+YnJlYWtwb2ludC5yZW1vdmUoKSkpO2lmKGhhc09uZUJyZWFrcG9pbnQpe2NvbnRleHRNZW51LmRlYnVnU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdFZGl0IGJyZWFrcG9pbnRcdTIwMjYnKSx0aGlzLl9lZGl0QnJlYWtwb2ludENvbmRpdGlvbi5iaW5kKHRoaXMsZWRpdG9yTGluZU51bWJlcixicmVha3BvaW50c1swXSxudWxsKSk7fQpjb25zdCBoYXNFbmFibGVkPWJyZWFrcG9pbnRzLnNvbWUoYnJlYWtwb2ludD0+YnJlYWtwb2ludC5lbmFibGVkKCkpO2lmKGhhc0VuYWJsZWQpe2NvbnN0IHRpdGxlPWhhc09uZUJyZWFrcG9pbnQ/Q29tbW9uLlVJU3RyaW5nKCdEaXNhYmxlIGJyZWFrcG9pbnQnKTpDb21tb24uVUlTdHJpbmcoJ0Rpc2FibGUgYWxsIGJyZWFrcG9pbnRzIGluIGxpbmUnKTtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKHRpdGxlLCgpPT5icmVha3BvaW50cy5tYXAoYnJlYWtwb2ludD0+YnJlYWtwb2ludC5zZXRFbmFibGVkKGZhbHNlKSkpO30KY29uc3QgaGFzRGlzYWJsZWQ9YnJlYWtwb2ludHMuc29tZShicmVha3BvaW50PT4hYnJlYWtwb2ludC5lbmFibGVkKCkpO2lmKGhhc0Rpc2FibGVkKXtjb25zdCB0aXRsZT1oYXNPbmVCcmVha3BvaW50P0NvbW1vbi5VSVN0cmluZygnRW5hYmxlIGJyZWFrcG9pbnQnKTpDb21tb24uVUlTdHJpbmcoJ0VuYWJsZWQgYWxsIGJyZWFrcG9pbnRzIGluIGxpbmUnKTtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKHRpdGxlLCgpPT5icmVha3BvaW50cy5tYXAoYnJlYWtwb2ludD0+YnJlYWtwb2ludC5zZXRFbmFibGVkKHRydWUpKSk7fX0KcmVzb2x2ZSgpO30KcmV0dXJuIG5ldyBQcm9taXNlKHBvcHVsYXRlLmJpbmQodGhpcykpO30KcG9wdWxhdGVUZXh0QXJlYUNvbnRleHRNZW51KGNvbnRleHRNZW51LGVkaXRvckxpbmVOdW1iZXIsZWRpdG9yQ29sdW1uTnVtYmVyKXtmdW5jdGlvbiBhZGRTb3VyY2VNYXBVUkwoc2NyaXB0RmlsZSl7U291cmNlcy5BZGRTb3VyY2VNYXBVUkxEaWFsb2cuc2hvdyhhZGRTb3VyY2VNYXBVUkxEaWFsb2dDYWxsYmFjay5iaW5kKG51bGwsc2NyaXB0RmlsZSkpO30KZnVuY3Rpb24gYWRkU291cmNlTWFwVVJMRGlhbG9nQ2FsbGJhY2soc2NyaXB0RmlsZSx1cmwpe2lmKCF1cmwpCnJldHVybjtzY3JpcHRGaWxlLmFkZFNvdXJjZU1hcFVSTCh1cmwpO30KZnVuY3Rpb24gcG9wdWxhdGVTb3VyY2VNYXBNZW1iZXJzKCl7aWYodGhpcy5fdWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLk5ldHdvcmsmJkNvbW1vbi5tb2R1bGVTZXR0aW5nKCdqc1NvdXJjZU1hcHNFbmFibGVkJykuZ2V0KCkmJiFCaW5kaW5ncy5ibGFja2JveE1hbmFnZXIuaXNCbGFja2JveGVkVUlTb3VyY2VDb2RlKHRoaXMuX3VpU291cmNlQ29kZSkpe2lmKHRoaXMuX3NjcmlwdEZpbGVGb3JEZWJ1Z2dlck1vZGVsLnNpemUpe2NvbnN0IHNjcmlwdEZpbGU9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwudmFsdWVzQXJyYXkoKVswXTtjb25zdCBhZGRTb3VyY2VNYXBVUkxMYWJlbD1Db21tb24uVUlTdHJpbmcoJ0FkZCBzb3VyY2UgbWFwXHUyMDI2Jyk7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShhZGRTb3VyY2VNYXBVUkxMYWJlbCxhZGRTb3VyY2VNYXBVUkwuYmluZChudWxsLHNjcmlwdEZpbGUpKTt9fX0KcmV0dXJuIHN1cGVyLnBvcHVsYXRlVGV4dEFyZWFDb250ZXh0TWVudShjb250ZXh0TWVudSxlZGl0b3JMaW5lTnVtYmVyLGVkaXRvckNvbHVtbk51bWJlcikudGhlbihwb3B1bGF0ZVNvdXJjZU1hcE1lbWJlcnMuYmluZCh0aGlzKSk7fQpfd29ya2luZ0NvcHlDaGFuZ2VkKCl7aWYodGhpcy5fc3VwcG9ydHNFbmFibGVkQnJlYWtwb2ludHNXaGlsZUVkaXRpbmcoKXx8dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwuc2l6ZSkKcmV0dXJuO2lmKHRoaXMuX3VpU291cmNlQ29kZS5pc0RpcnR5KCkpCnRoaXMuX211dGVCcmVha3BvaW50c1doaWxlRWRpdGluZygpO2Vsc2UKdGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzQWZ0ZXJFZGl0aW5nKCk7fQpfd29ya2luZ0NvcHlDb21taXR0ZWQoZXZlbnQpe3RoaXMuX3NjcmlwdHNQYW5lbC51cGRhdGVMYXN0TW9kaWZpY2F0aW9uVGltZSgpO2lmKHRoaXMuX3N1cHBvcnRzRW5hYmxlZEJyZWFrcG9pbnRzV2hpbGVFZGl0aW5nKCkpCnJldHVybjtpZighdGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwuc2l6ZSkKdGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzQWZ0ZXJFZGl0aW5nKCk7fQpfZGlkTWVyZ2VUb1ZNKCl7aWYodGhpcy5fc3VwcG9ydHNFbmFibGVkQnJlYWtwb2ludHNXaGlsZUVkaXRpbmcoKSkKcmV0dXJuO3RoaXMuX3Jlc3RvcmVCcmVha3BvaW50c0lmQ29uc2lzdGVudFNjcmlwdHMoKTt9Cl9kaWREaXZlcmdlRnJvbVZNKCl7aWYodGhpcy5fc3VwcG9ydHNFbmFibGVkQnJlYWtwb2ludHNXaGlsZUVkaXRpbmcoKSkKcmV0dXJuO3RoaXMuX211dGVCcmVha3BvaW50c1doaWxlRWRpdGluZygpO30KX211dGVCcmVha3BvaW50c1doaWxlRWRpdGluZygpe2lmKHRoaXMuX211dGVkKQpyZXR1cm47Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zKQp0aGlzLl91cGRhdGVCcmVha3BvaW50RGVjb3JhdGlvbihkZWNvcmF0aW9uKTt0aGlzLl9tdXRlZD10cnVlO30KX3N1cHBvcnRzRW5hYmxlZEJyZWFrcG9pbnRzV2hpbGVFZGl0aW5nKCl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5TbmlwcGV0czt9Cl9yZXN0b3JlQnJlYWtwb2ludHNJZkNvbnNpc3RlbnRTY3JpcHRzKCl7Y29uc3Qgc2NyaXB0RmlsZXM9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwudmFsdWVzQXJyYXkoKTtmb3IobGV0IGk9MDtpPHNjcmlwdEZpbGVzLmxlbmd0aDsrK2kpe2lmKHNjcmlwdEZpbGVzW2ldLmhhc0RpdmVyZ2VkRnJvbVZNKCl8fHNjcmlwdEZpbGVzW2ldLmlzTWVyZ2luZ1RvVk0oKSkKcmV0dXJuO30KdGhpcy5fcmVzdG9yZUJyZWFrcG9pbnRzQWZ0ZXJFZGl0aW5nKCk7fQpfcmVzdG9yZUJyZWFrcG9pbnRzQWZ0ZXJFZGl0aW5nKCl7dGhpcy5fbXV0ZWQ9ZmFsc2U7aWYodGhpcy5fbXV0ZWRGcm9tU3RhcnQpe3RoaXMuX211dGVkRnJvbVN0YXJ0PWZhbHNlO3RoaXMuX2luaXRpYWxpemVCcmVha3BvaW50cygpO3JldHVybjt9CmNvbnN0IGRlY29yYXRpb25zPUFycmF5LmZyb20odGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zKTt0aGlzLl9icmVha3BvaW50RGVjb3JhdGlvbnMuY2xlYXIoKTt0aGlzLl90ZXh0RWRpdG9yLm9wZXJhdGlvbigoKT0+ZGVjb3JhdGlvbnMubWFwKGRlY29yYXRpb249PmRlY29yYXRpb24uaGlkZSgpKSk7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgZGVjb3JhdGlvbnMpe2lmKCFkZWNvcmF0aW9uLmJyZWFrcG9pbnQpCmNvbnRpbnVlO2NvbnN0IGVuYWJsZWQ9ZGVjb3JhdGlvbi5lbmFibGVkO2RlY29yYXRpb24uYnJlYWtwb2ludC5yZW1vdmUoKTtjb25zdCBsb2NhdGlvbj1kZWNvcmF0aW9uLmhhbmRsZS5yZXNvbHZlKCk7aWYobG9jYXRpb24pCnRoaXMuX3NldEJyZWFrcG9pbnQobG9jYXRpb24ubGluZU51bWJlcixsb2NhdGlvbi5jb2x1bW5OdW1iZXIsZGVjb3JhdGlvbi5jb25kaXRpb24sZW5hYmxlZCk7fX0KX2lzSWRlbnRpZmllcih0b2tlblR5cGUpe3JldHVybiB0b2tlblR5cGUuc3RhcnRzV2l0aCgnanMtdmFyaWFibGUnKXx8dG9rZW5UeXBlLnN0YXJ0c1dpdGgoJ2pzLXByb3BlcnR5Jyl8fHRva2VuVHlwZT09PSdqcy1kZWYnO30KX2dldFBvcG92ZXJSZXF1ZXN0KGV2ZW50KXtpZihVSS5LZXlib2FyZFNob3J0Y3V0LmV2ZW50SGFzQ3RybE9yTWV0YShldmVudCkpCnJldHVybiBudWxsO2NvbnN0IHRhcmdldD1VSS5jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KTtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldD90YXJnZXQubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOm51bGw7aWYoIWRlYnVnZ2VyTW9kZWx8fCFkZWJ1Z2dlck1vZGVsLmlzUGF1c2VkKCkpCnJldHVybiBudWxsO2NvbnN0IHRleHRQb3NpdGlvbj10aGlzLl90ZXh0RWRpdG9yLmNvb3JkaW5hdGVzVG9DdXJzb3JQb3NpdGlvbihldmVudC54LGV2ZW50LnkpO2lmKCF0ZXh0UG9zaXRpb24pCnJldHVybiBudWxsO2NvbnN0IG1vdXNlTGluZT10ZXh0UG9zaXRpb24uc3RhcnRMaW5lO2NvbnN0IG1vdXNlQ29sdW1uPXRleHRQb3NpdGlvbi5zdGFydENvbHVtbjtjb25zdCB0ZXh0U2VsZWN0aW9uPXRoaXMuX3RleHRFZGl0b3Iuc2VsZWN0aW9uKCkubm9ybWFsaXplKCk7bGV0IGFuY2hvckJveDtsZXQgZWRpdG9yTGluZU51bWJlcjtsZXQgc3RhcnRIaWdobGlnaHQ7bGV0IGVuZEhpZ2hsaWdodDtpZih0ZXh0U2VsZWN0aW9uJiYhdGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpe2lmKHRleHRTZWxlY3Rpb24uc3RhcnRMaW5lIT09dGV4dFNlbGVjdGlvbi5lbmRMaW5lfHx0ZXh0U2VsZWN0aW9uLnN0YXJ0TGluZSE9PW1vdXNlTGluZXx8bW91c2VDb2x1bW48dGV4dFNlbGVjdGlvbi5zdGFydENvbHVtbnx8bW91c2VDb2x1bW4+dGV4dFNlbGVjdGlvbi5lbmRDb2x1bW4pCnJldHVybiBudWxsO2NvbnN0IGxlZnRDb3JuZXI9dGhpcy5fdGV4dEVkaXRvci5jdXJzb3JQb3NpdGlvblRvQ29vcmRpbmF0ZXModGV4dFNlbGVjdGlvbi5zdGFydExpbmUsdGV4dFNlbGVjdGlvbi5zdGFydENvbHVtbik7Y29uc3QgcmlnaHRDb3JuZXI9dGhpcy5fdGV4dEVkaXRvci5jdXJzb3JQb3NpdGlvblRvQ29vcmRpbmF0ZXModGV4dFNlbGVjdGlvbi5lbmRMaW5lLHRleHRTZWxlY3Rpb24uZW5kQ29sdW1uKTthbmNob3JCb3g9bmV3IEFuY2hvckJveChsZWZ0Q29ybmVyLngsbGVmdENvcm5lci55LHJpZ2h0Q29ybmVyLngtbGVmdENvcm5lci54LGxlZnRDb3JuZXIuaGVpZ2h0KTtlZGl0b3JMaW5lTnVtYmVyPXRleHRTZWxlY3Rpb24uc3RhcnRMaW5lO3N0YXJ0SGlnaGxpZ2h0PXRleHRTZWxlY3Rpb24uc3RhcnRDb2x1bW47ZW5kSGlnaGxpZ2h0PXRleHRTZWxlY3Rpb24uZW5kQ29sdW1uLTE7fWVsc2V7Y29uc3QgdG9rZW49dGhpcy5fdGV4dEVkaXRvci50b2tlbkF0VGV4dFBvc2l0aW9uKHRleHRQb3NpdGlvbi5zdGFydExpbmUsdGV4dFBvc2l0aW9uLnN0YXJ0Q29sdW1uKTtpZighdG9rZW58fCF0b2tlbi50eXBlKQpyZXR1cm4gbnVsbDtlZGl0b3JMaW5lTnVtYmVyPXRleHRQb3NpdGlvbi5zdGFydExpbmU7Y29uc3QgbGluZT10aGlzLl90ZXh0RWRpdG9yLmxpbmUoZWRpdG9yTGluZU51bWJlcik7Y29uc3QgdG9rZW5Db250ZW50PWxpbmUuc3Vic3RyaW5nKHRva2VuLnN0YXJ0Q29sdW1uLHRva2VuLmVuZENvbHVtbik7Y29uc3QgaXNJZGVudGlmaWVyPXRoaXMuX2lzSWRlbnRpZmllcih0b2tlbi50eXBlKTtpZighaXNJZGVudGlmaWVyJiYodG9rZW4udHlwZSE9PSdqcy1rZXl3b3JkJ3x8dG9rZW5Db250ZW50IT09J3RoaXMnKSkKcmV0dXJuIG51bGw7Y29uc3QgbGVmdENvcm5lcj10aGlzLl90ZXh0RWRpdG9yLmN1cnNvclBvc2l0aW9uVG9Db29yZGluYXRlcyhlZGl0b3JMaW5lTnVtYmVyLHRva2VuLnN0YXJ0Q29sdW1uKTtjb25zdCByaWdodENvcm5lcj10aGlzLl90ZXh0RWRpdG9yLmN1cnNvclBvc2l0aW9uVG9Db29yZGluYXRlcyhlZGl0b3JMaW5lTnVtYmVyLHRva2VuLmVuZENvbHVtbi0xKTthbmNob3JCb3g9bmV3IEFuY2hvckJveChsZWZ0Q29ybmVyLngsbGVmdENvcm5lci55LHJpZ2h0Q29ybmVyLngtbGVmdENvcm5lci54LGxlZnRDb3JuZXIuaGVpZ2h0KTtzdGFydEhpZ2hsaWdodD10b2tlbi5zdGFydENvbHVtbjtlbmRIaWdobGlnaHQ9dG9rZW4uZW5kQ29sdW1uLTE7d2hpbGUoc3RhcnRIaWdobGlnaHQ+MSYmbGluZS5jaGFyQXQoc3RhcnRIaWdobGlnaHQtMSk9PT0nLicpe2NvbnN0IHRva2VuQmVmb3JlPXRoaXMuX3RleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihlZGl0b3JMaW5lTnVtYmVyLHN0YXJ0SGlnaGxpZ2h0LTIpO2lmKCF0b2tlbkJlZm9yZXx8IXRva2VuQmVmb3JlLnR5cGUpCnJldHVybiBudWxsO3N0YXJ0SGlnaGxpZ2h0PXRva2VuQmVmb3JlLnN0YXJ0Q29sdW1uO319CmxldCBvYmplY3RQb3BvdmVySGVscGVyO2xldCBoaWdobGlnaHREZXNjcmlwdG9yO3JldHVybntib3g6YW5jaG9yQm94LHNob3c6YXN5bmMgcG9wb3Zlcj0+e2NvbnN0IHNlbGVjdGVkQ2FsbEZyYW1lPVVJLmNvbnRleHQuZmxhdm9yKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSk7aWYoIXNlbGVjdGVkQ2FsbEZyYW1lKQpyZXR1cm4gZmFsc2U7Y29uc3QgZXZhbHVhdGlvblRleHQ9dGhpcy5fdGV4dEVkaXRvci5saW5lKGVkaXRvckxpbmVOdW1iZXIpLnN1YnN0cmluZyhzdGFydEhpZ2hsaWdodCxlbmRIaWdobGlnaHQrMSk7Y29uc3QgcmVzb2x2ZWRUZXh0PWF3YWl0IFNvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5yZXNvbHZlRXhwcmVzc2lvbigoc2VsZWN0ZWRDYWxsRnJhbWUpLGV2YWx1YXRpb25UZXh0LHRoaXMuX3VpU291cmNlQ29kZSxlZGl0b3JMaW5lTnVtYmVyLHN0YXJ0SGlnaGxpZ2h0LGVuZEhpZ2hsaWdodCk7Y29uc3QgcmVzdWx0PWF3YWl0IHNlbGVjdGVkQ2FsbEZyYW1lLmV2YWx1YXRlKHtleHByZXNzaW9uOnJlc29sdmVkVGV4dHx8ZXZhbHVhdGlvblRleHQsb2JqZWN0R3JvdXA6J3BvcG92ZXInLGluY2x1ZGVDb21tYW5kTGluZUFQSTpmYWxzZSxzaWxlbnQ6dHJ1ZSxyZXR1cm5CeVZhbHVlOmZhbHNlLGdlbmVyYXRlUHJldmlldzpmYWxzZX0pO2lmKCFyZXN1bHQub2JqZWN0KQpyZXR1cm4gZmFsc2U7b2JqZWN0UG9wb3ZlckhlbHBlcj1hd2FpdCBPYmplY3RVSS5PYmplY3RQb3BvdmVySGVscGVyLmJ1aWxkT2JqZWN0UG9wb3ZlcihyZXN1bHQub2JqZWN0LHBvcG92ZXIpO2NvbnN0IHBvdGVudGlhbGx5VXBkYXRlZENhbGxGcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUpO2lmKCFvYmplY3RQb3BvdmVySGVscGVyfHxzZWxlY3RlZENhbGxGcmFtZSE9PXBvdGVudGlhbGx5VXBkYXRlZENhbGxGcmFtZSl7ZGVidWdnZXJNb2RlbC5ydW50aW1lTW9kZWwoKS5yZWxlYXNlT2JqZWN0R3JvdXAoJ3BvcG92ZXInKTtpZihvYmplY3RQb3BvdmVySGVscGVyKQpvYmplY3RQb3BvdmVySGVscGVyLmRpc3Bvc2UoKTtyZXR1cm4gZmFsc2U7fQpjb25zdCBoaWdobGlnaHRSYW5nZT1uZXcgVGV4dFV0aWxzLlRleHRSYW5nZShlZGl0b3JMaW5lTnVtYmVyLHN0YXJ0SGlnaGxpZ2h0LGVkaXRvckxpbmVOdW1iZXIsZW5kSGlnaGxpZ2h0KTtoaWdobGlnaHREZXNjcmlwdG9yPXRoaXMuX3RleHRFZGl0b3IuaGlnaGxpZ2h0UmFuZ2UoaGlnaGxpZ2h0UmFuZ2UsJ3NvdXJjZS1mcmFtZS1ldmFsLWV4cHJlc3Npb24nKTtyZXR1cm4gdHJ1ZTt9LGhpZGU6KCk9PntvYmplY3RQb3BvdmVySGVscGVyLmRpc3Bvc2UoKTtkZWJ1Z2dlck1vZGVsLnJ1bnRpbWVNb2RlbCgpLnJlbGVhc2VPYmplY3RHcm91cCgncG9wb3ZlcicpO3RoaXMuX3RleHRFZGl0b3IucmVtb3ZlSGlnaGxpZ2h0KGhpZ2hsaWdodERlc2NyaXB0b3IpO319O30KX29uS2V5RG93bihldmVudCl7dGhpcy5fY2xlYXJDb250cm9sRG93bigpO2lmKGV2ZW50LmtleT09PSdFc2NhcGUnKXtpZih0aGlzLl9wb3BvdmVySGVscGVyLmlzUG9wb3ZlclZpc2libGUoKSl7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO2V2ZW50LmNvbnN1bWUoKTt9CnJldHVybjt9CmlmKFVJLnNob3J0Y3V0UmVnaXN0cnkuZXZlbnRNYXRjaGVzQWN0aW9uKGV2ZW50LCdkZWJ1Z2dlci50b2dnbGUtYnJlYWtwb2ludCcpKXtjb25zdCBzZWxlY3Rpb249dGhpcy5fdGV4dEVkaXRvci5zZWxlY3Rpb24oKTtpZighc2VsZWN0aW9uKQpyZXR1cm47dGhpcy5fdG9nZ2xlQnJlYWtwb2ludChzZWxlY3Rpb24uc3RhcnRMaW5lLGZhbHNlKTtldmVudC5jb25zdW1lKHRydWUpO3JldHVybjt9CmlmKFVJLnNob3J0Y3V0UmVnaXN0cnkuZXZlbnRNYXRjaGVzQWN0aW9uKGV2ZW50LCdkZWJ1Z2dlci50b2dnbGUtYnJlYWtwb2ludC1lbmFibGVkJykpe2NvbnN0IHNlbGVjdGlvbj10aGlzLl90ZXh0RWRpdG9yLnNlbGVjdGlvbigpO2lmKCFzZWxlY3Rpb24pCnJldHVybjt0aGlzLl90b2dnbGVCcmVha3BvaW50KHNlbGVjdGlvbi5zdGFydExpbmUsdHJ1ZSk7ZXZlbnQuY29uc3VtZSh0cnVlKTtyZXR1cm47fQppZihVSS5LZXlib2FyZFNob3J0Y3V0LmV2ZW50SGFzQ3RybE9yTWV0YShldmVudCkmJnRoaXMuX2V4ZWN1dGlvbkxvY2F0aW9uKXt0aGlzLl9jb250cm9sRG93bj10cnVlO2lmKGV2ZW50LmtleT09PShIb3N0LmlzTWFjKCk/J01ldGEnOidDb250cm9sJykpe3RoaXMuX2NvbnRyb2xUaW1lb3V0PXNldFRpbWVvdXQoKCk9PntpZih0aGlzLl9leGVjdXRpb25Mb2NhdGlvbiYmdGhpcy5fY29udHJvbERvd24pCnRoaXMuX3Nob3dDb250aW51ZVRvTG9jYXRpb25zKCk7fSwxNTApO319fQpfb25Nb3VzZU1vdmUoZXZlbnQpe2lmKHRoaXMuX2V4ZWN1dGlvbkxvY2F0aW9uJiZ0aGlzLl9jb250cm9sRG93biYmVUkuS2V5Ym9hcmRTaG9ydGN1dC5ldmVudEhhc0N0cmxPck1ldGEoZXZlbnQpKXtpZighdGhpcy5fY29udGludWVUb0xvY2F0aW9uRGVjb3JhdGlvbnMpCnRoaXMuX3Nob3dDb250aW51ZVRvTG9jYXRpb25zKCk7fQppZih0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucyl7Y29uc3QgdGV4dFBvc2l0aW9uPXRoaXMuX3RleHRFZGl0b3IuY29vcmRpbmF0ZXNUb0N1cnNvclBvc2l0aW9uKGV2ZW50LngsZXZlbnQueSk7Y29uc3QgaG92ZXJpbmc9ISFldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygnc291cmNlLWZyYW1lLWFzeW5jLXN0ZXAtaW4nKTt0aGlzLl9zZXRBc3luY1N0ZXBJbkhvdmVyZWRMaW5lKHRleHRQb3NpdGlvbj90ZXh0UG9zaXRpb24uc3RhcnRMaW5lOm51bGwsaG92ZXJpbmcpO319Cl9zZXRBc3luY1N0ZXBJbkhvdmVyZWRMaW5lKGVkaXRvckxpbmVOdW1iZXIsaG92ZXJlZCl7aWYodGhpcy5fYXN5bmNTdGVwSW5Ib3ZlcmVkTGluZT09PWVkaXRvckxpbmVOdW1iZXImJnRoaXMuX2FzeW5jU3RlcEluSG92ZXJlZD09PWhvdmVyZWQpCnJldHVybjtpZih0aGlzLl9hc3luY1N0ZXBJbkhvdmVyZWQmJnRoaXMuX2FzeW5jU3RlcEluSG92ZXJlZExpbmUpCnRoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKHRoaXMuX2FzeW5jU3RlcEluSG92ZXJlZExpbmUsJ3NvdXJjZS1mcmFtZS1hc3luYy1zdGVwLWluLWhvdmVyZWQnLGZhbHNlKTt0aGlzLl9hc3luY1N0ZXBJbkhvdmVyZWRMaW5lPWVkaXRvckxpbmVOdW1iZXI7dGhpcy5fYXN5bmNTdGVwSW5Ib3ZlcmVkPWhvdmVyZWQ7aWYodGhpcy5fYXN5bmNTdGVwSW5Ib3ZlcmVkJiZ0aGlzLl9hc3luY1N0ZXBJbkhvdmVyZWRMaW5lKQp0aGlzLl90ZXh0RWRpdG9yLnRvZ2dsZUxpbmVDbGFzcyh0aGlzLl9hc3luY1N0ZXBJbkhvdmVyZWRMaW5lLCdzb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbi1ob3ZlcmVkJyx0cnVlKTt9Cl9vbk1vdXNlRG93bihldmVudCl7aWYoIXRoaXMuX2V4ZWN1dGlvbkxvY2F0aW9ufHwhVUkuS2V5Ym9hcmRTaG9ydGN1dC5ldmVudEhhc0N0cmxPck1ldGEoZXZlbnQpKQpyZXR1cm47aWYoIXRoaXMuX2NvbnRpbnVlVG9Mb2NhdGlvbkRlY29yYXRpb25zKQpyZXR1cm47ZXZlbnQuY29uc3VtZSgpO2NvbnN0IHRleHRQb3NpdGlvbj10aGlzLl90ZXh0RWRpdG9yLmNvb3JkaW5hdGVzVG9DdXJzb3JQb3NpdGlvbihldmVudC54LGV2ZW50LnkpO2lmKCF0ZXh0UG9zaXRpb24pCnJldHVybjtmb3IoY29uc3QgZGVjb3JhdGlvbiBvZiB0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucy5rZXlzKCkpe2NvbnN0IHJhbmdlPWRlY29yYXRpb24uZmluZCgpO2lmKHJhbmdlLmZyb20ubGluZSE9PXRleHRQb3NpdGlvbi5zdGFydExpbmV8fHJhbmdlLnRvLmxpbmUhPT10ZXh0UG9zaXRpb24uc3RhcnRMaW5lKQpjb250aW51ZTtpZihyYW5nZS5mcm9tLmNoPD10ZXh0UG9zaXRpb24uc3RhcnRDb2x1bW4mJnRleHRQb3NpdGlvbi5zdGFydENvbHVtbjw9cmFuZ2UudG8uY2gpe3RoaXMuX2NvbnRpbnVlVG9Mb2NhdGlvbkRlY29yYXRpb25zLmdldChkZWNvcmF0aW9uKSgpO2JyZWFrO319fQpfb25CbHVyKGV2ZW50KXtpZih0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuaXNBbmNlc3RvcigoZXZlbnQudGFyZ2V0KSkpCnJldHVybjt0aGlzLl9jbGVhckNvbnRyb2xEb3duKCk7fQpfb25LZXlVcChldmVudCl7dGhpcy5fY2xlYXJDb250cm9sRG93bigpO30KX2NsZWFyQ29udHJvbERvd24oKXt0aGlzLl9jb250cm9sRG93bj1mYWxzZTt0aGlzLl9jbGVhckNvbnRpbnVlVG9Mb2NhdGlvbnMoKTtjbGVhclRpbWVvdXQodGhpcy5fY29udHJvbFRpbWVvdXQpO30KX2VkaXRCcmVha3BvaW50Q29uZGl0aW9uKGVkaXRvckxpbmVOdW1iZXIsYnJlYWtwb2ludCxsb2NhdGlvbil7dGhpcy5fY29uZGl0aW9uRWxlbWVudD10aGlzLl9jcmVhdGVDb25kaXRpb25FbGVtZW50KGVkaXRvckxpbmVOdW1iZXIpO3RoaXMuX3RleHRFZGl0b3IuYWRkRGVjb3JhdGlvbih0aGlzLl9jb25kaXRpb25FbGVtZW50LGVkaXRvckxpbmVOdW1iZXIpO2Z1bmN0aW9uIGZpbmlzaEVkaXRpbmcoY29tbWl0dGVkLGVsZW1lbnQsbmV3VGV4dCl7dGhpcy5fdGV4dEVkaXRvci5yZW1vdmVEZWNvcmF0aW9uKCh0aGlzLl9jb25kaXRpb25FbGVtZW50KSxlZGl0b3JMaW5lTnVtYmVyKTt0aGlzLl9jb25kaXRpb25FZGl0b3JFbGVtZW50PW51bGw7dGhpcy5fY29uZGl0aW9uRWxlbWVudD1udWxsO2lmKCFjb21taXR0ZWQpCnJldHVybjtpZihicmVha3BvaW50KQpicmVha3BvaW50LnNldENvbmRpdGlvbihuZXdUZXh0KTtlbHNlIGlmKGxvY2F0aW9uKQp0aGlzLl9zZXRCcmVha3BvaW50KGxvY2F0aW9uLmxpbmVOdW1iZXIsbG9jYXRpb24uY29sdW1uTnVtYmVyLG5ld1RleHQsdHJ1ZSk7ZWxzZQp0aGlzLl9jcmVhdGVOZXdCcmVha3BvaW50KGVkaXRvckxpbmVOdW1iZXIsbmV3VGV4dCx0cnVlKTt9CmNvbnN0IGNvbmZpZz1uZXcgVUkuSW5wbGFjZUVkaXRvci5Db25maWcoZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsdHJ1ZSksZmluaXNoRWRpdGluZy5iaW5kKHRoaXMsZmFsc2UpKTtVSS5JbnBsYWNlRWRpdG9yLnN0YXJ0RWRpdGluZygodGhpcy5fY29uZGl0aW9uRWRpdG9yRWxlbWVudCksY29uZmlnKTt0aGlzLl9jb25kaXRpb25FZGl0b3JFbGVtZW50LnZhbHVlPWJyZWFrcG9pbnQ/YnJlYWtwb2ludC5jb25kaXRpb24oKTonJzt0aGlzLl9jb25kaXRpb25FZGl0b3JFbGVtZW50LnNlbGVjdCgpO30KX2NyZWF0ZUNvbmRpdGlvbkVsZW1lbnQoZWRpdG9yTGluZU51bWJlcil7Y29uc3QgY29uZGl0aW9uRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdzb3VyY2UtZnJhbWUtYnJlYWtwb2ludC1jb25kaXRpb24nKTtjb25zdCBsYWJlbEVsZW1lbnQ9Y29uZGl0aW9uRWxlbWVudC5jcmVhdGVDaGlsZCgnbGFiZWwnLCdzb3VyY2UtZnJhbWUtYnJlYWtwb2ludC1tZXNzYWdlJyk7bGFiZWxFbGVtZW50Lmh0bWxGb3I9J3NvdXJjZS1mcmFtZS1icmVha3BvaW50LWNvbmRpdGlvbic7bGFiZWxFbGVtZW50LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1RoZSBicmVha3BvaW50IG9uIGxpbmUgJWQgd2lsbCBzdG9wIG9ubHkgaWYgdGhpcyBleHByZXNzaW9uIGlzIHRydWU6JyxlZGl0b3JMaW5lTnVtYmVyKzEpKTtjb25zdCBlZGl0b3JFbGVtZW50PVVJLmNyZWF0ZUlucHV0KCdtb25vc3BhY2UnLCd0ZXh0Jyk7Y29uZGl0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChlZGl0b3JFbGVtZW50KTtlZGl0b3JFbGVtZW50LmlkPSdzb3VyY2UtZnJhbWUtYnJlYWtwb2ludC1jb25kaXRpb24nO3RoaXMuX2NvbmRpdGlvbkVkaXRvckVsZW1lbnQ9ZWRpdG9yRWxlbWVudDtyZXR1cm4gY29uZGl0aW9uRWxlbWVudDt9Cl9leGVjdXRpb25MaW5lQ2hhbmdlZChsaXZlTG9jYXRpb24pe3RoaXMuX2NsZWFyRXhlY3V0aW9uTGluZSgpO2NvbnN0IHVpTG9jYXRpb249bGl2ZUxvY2F0aW9uLnVpTG9jYXRpb24oKTtpZighdWlMb2NhdGlvbnx8dWlMb2NhdGlvbi51aVNvdXJjZUNvZGUhPT10aGlzLl91aVNvdXJjZUNvZGUpe3RoaXMuX2V4ZWN1dGlvbkxvY2F0aW9uPW51bGw7cmV0dXJuO30KdGhpcy5fZXhlY3V0aW9uTG9jYXRpb249dWlMb2NhdGlvbjtjb25zdCBlZGl0b3JMb2NhdGlvbj10aGlzLl90cmFuc2Zvcm1lci5yYXdUb0VkaXRvckxvY2F0aW9uKHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcik7dGhpcy5fdGV4dEVkaXRvci5zZXRFeGVjdXRpb25Mb2NhdGlvbihlZGl0b3JMb2NhdGlvblswXSxlZGl0b3JMb2NhdGlvblsxXSk7aWYodGhpcy5fdGV4dEVkaXRvci5pc1Nob3dpbmcoKSl7c2V0SW1tZWRpYXRlKCgpPT57aWYodGhpcy5fY29udHJvbERvd24pCnRoaXMuX3Nob3dDb250aW51ZVRvTG9jYXRpb25zKCk7ZWxzZQp0aGlzLl9nZW5lcmF0ZVZhbHVlc0luU291cmNlKCk7fSk7fX0KX2dlbmVyYXRlVmFsdWVzSW5Tb3VyY2UoKXtpZighQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2lubGluZVZhcmlhYmxlVmFsdWVzJykuZ2V0KCkpCnJldHVybjtjb25zdCBleGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighZXhlY3V0aW9uQ29udGV4dCkKcmV0dXJuO2NvbnN0IGNhbGxGcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUpO2lmKCFjYWxsRnJhbWUpCnJldHVybjtjb25zdCBsb2NhbFNjb3BlPWNhbGxGcmFtZS5sb2NhbFNjb3BlKCk7Y29uc3QgZnVuY3Rpb25Mb2NhdGlvbj1jYWxsRnJhbWUuZnVuY3Rpb25Mb2NhdGlvbigpO2lmKGxvY2FsU2NvcGUmJmZ1bmN0aW9uTG9jYXRpb24pe1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5yZXNvbHZlU2NvcGVJbk9iamVjdChsb2NhbFNjb3BlKS5nZXRBbGxQcm9wZXJ0aWVzKGZhbHNlLGZhbHNlLHRoaXMuX3ByZXBhcmVTY29wZVZhcmlhYmxlcy5iaW5kKHRoaXMsY2FsbEZyYW1lKSk7fX0KX3Nob3dDb250aW51ZVRvTG9jYXRpb25zKCl7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKCFleGVjdXRpb25Db250ZXh0KQpyZXR1cm47Y29uc3QgY2FsbEZyYW1lPVVJLmNvbnRleHQuZmxhdm9yKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSk7aWYoIWNhbGxGcmFtZSkKcmV0dXJuO2NvbnN0IHN0YXJ0PWNhbGxGcmFtZS5mdW5jdGlvbkxvY2F0aW9uKCl8fGNhbGxGcmFtZS5sb2NhdGlvbigpO2NvbnN0IGRlYnVnZ2VyTW9kZWw9Y2FsbEZyYW1lLmRlYnVnZ2VyTW9kZWw7ZGVidWdnZXJNb2RlbC5nZXRQb3NzaWJsZUJyZWFrcG9pbnRzKHN0YXJ0LG51bGwsdHJ1ZSkudGhlbihsb2NhdGlvbnM9PnRoaXMuX3RleHRFZGl0b3Iub3BlcmF0aW9uKHJlbmRlckxvY2F0aW9ucy5iaW5kKHRoaXMsbG9jYXRpb25zKSkpO2Z1bmN0aW9uIHJlbmRlckxvY2F0aW9ucyhsb2NhdGlvbnMpe3RoaXMuX2NsZWFyQ29udGludWVUb0xvY2F0aW9uc05vUmVzdG9yZSgpO3RoaXMuX3RleHRFZGl0b3IuaGlkZUV4ZWN1dGlvbkxpbmVCYWNrZ3JvdW5kKCk7dGhpcy5fY2xlYXJWYWx1ZVdpZGdldHMoKTt0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucz1uZXcgTWFwKCk7bG9jYXRpb25zPWxvY2F0aW9ucy5yZXZlcnNlKCk7bGV0IHByZXZpb3VzQ2FsbExpbmU9LTE7Zm9yKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucyl7Y29uc3QgZWRpdG9yTG9jYXRpb249dGhpcy5fdHJhbnNmb3JtZXIucmF3VG9FZGl0b3JMb2NhdGlvbihsb2NhdGlvbi5saW5lTnVtYmVyLGxvY2F0aW9uLmNvbHVtbk51bWJlcik7bGV0IHRva2VuPXRoaXMuX3RleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihlZGl0b3JMb2NhdGlvblswXSxlZGl0b3JMb2NhdGlvblsxXSk7aWYoIXRva2VuKQpjb250aW51ZTtjb25zdCBsaW5lPXRoaXMuX3RleHRFZGl0b3IubGluZShlZGl0b3JMb2NhdGlvblswXSk7bGV0IHRva2VuQ29udGVudD1saW5lLnN1YnN0cmluZyh0b2tlbi5zdGFydENvbHVtbix0b2tlbi5lbmRDb2x1bW4pO2lmKCF0b2tlbi50eXBlJiZ0b2tlbkNvbnRlbnQ9PT0nLicpe3Rva2VuPXRoaXMuX3RleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihlZGl0b3JMb2NhdGlvblswXSx0b2tlbi5lbmRDb2x1bW4rMSk7dG9rZW5Db250ZW50PWxpbmUuc3Vic3RyaW5nKHRva2VuLnN0YXJ0Q29sdW1uLHRva2VuLmVuZENvbHVtbik7fQppZighdG9rZW4udHlwZSkKY29udGludWU7Y29uc3QgdmFsaWRLZXl3b3JkPXRva2VuLnR5cGU9PT0nanMta2V5d29yZCcmJih0b2tlbkNvbnRlbnQ9PT0ndGhpcyd8fHRva2VuQ29udGVudD09PSdyZXR1cm4nfHx0b2tlbkNvbnRlbnQ9PT0nbmV3J3x8dG9rZW5Db250ZW50PT09J2NvbnRpbnVlJ3x8dG9rZW5Db250ZW50PT09J2JyZWFrJyk7aWYoIXZhbGlkS2V5d29yZCYmIXRoaXMuX2lzSWRlbnRpZmllcih0b2tlbi50eXBlKSkKY29udGludWU7aWYocHJldmlvdXNDYWxsTGluZT09PWVkaXRvckxvY2F0aW9uWzBdJiZsb2NhdGlvbi50eXBlIT09UHJvdG9jb2wuRGVidWdnZXIuQnJlYWtMb2NhdGlvblR5cGUuQ2FsbCkKY29udGludWU7bGV0IGhpZ2hsaWdodFJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGVkaXRvckxvY2F0aW9uWzBdLHRva2VuLnN0YXJ0Q29sdW1uLGVkaXRvckxvY2F0aW9uWzBdLHRva2VuLmVuZENvbHVtbi0xKTtsZXQgZGVjb3JhdGlvbj10aGlzLl90ZXh0RWRpdG9yLmhpZ2hsaWdodFJhbmdlKGhpZ2hsaWdodFJhbmdlLCdzb3VyY2UtZnJhbWUtY29udGludWUtdG8tbG9jYXRpb24nKTt0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucy5zZXQoZGVjb3JhdGlvbixsb2NhdGlvbi5jb250aW51ZVRvTG9jYXRpb24uYmluZChsb2NhdGlvbikpO2lmKGxvY2F0aW9uLnR5cGU9PT1Qcm90b2NvbC5EZWJ1Z2dlci5CcmVha0xvY2F0aW9uVHlwZS5DYWxsKQpwcmV2aW91c0NhbGxMaW5lPWVkaXRvckxvY2F0aW9uWzBdO2xldCBpc0FzeW5jQ2FsbD0obGluZVt0b2tlbi5zdGFydENvbHVtbi0xXT09PScuJyYmdG9rZW5Db250ZW50PT09J3RoZW4nKXx8dG9rZW5Db250ZW50PT09J3NldFRpbWVvdXQnfHx0b2tlbkNvbnRlbnQ9PT0nc2V0SW50ZXJ2YWwnfHx0b2tlbkNvbnRlbnQ9PT0ncG9zdE1lc3NhZ2UnO2lmKHRva2VuQ29udGVudD09PSduZXcnKXt0b2tlbj10aGlzLl90ZXh0RWRpdG9yLnRva2VuQXRUZXh0UG9zaXRpb24oZWRpdG9yTG9jYXRpb25bMF0sdG9rZW4uZW5kQ29sdW1uKzEpO3Rva2VuQ29udGVudD1saW5lLnN1YnN0cmluZyh0b2tlbi5zdGFydENvbHVtbix0b2tlbi5lbmRDb2x1bW4pO2lzQXN5bmNDYWxsPXRva2VuQ29udGVudD09PSdXb3JrZXInO30KY29uc3QgaXNDdXJyZW50UG9zaXRpb249dGhpcy5fZXhlY3V0aW9uTG9jYXRpb24mJmxvY2F0aW9uLmxpbmVOdW1iZXI9PT10aGlzLl9leGVjdXRpb25Mb2NhdGlvbi5saW5lTnVtYmVyJiZsb2NhdGlvbi5jb2x1bW5OdW1iZXI9PT10aGlzLl9leGVjdXRpb25Mb2NhdGlvbi5jb2x1bW5OdW1iZXI7aWYobG9jYXRpb24udHlwZT09PVByb3RvY29sLkRlYnVnZ2VyLkJyZWFrTG9jYXRpb25UeXBlLkNhbGwmJmlzQXN5bmNDYWxsKXtjb25zdCBhc3luY1N0ZXBJblJhbmdlPXRoaXMuX2ZpbmRBc3luY1N0ZXBJblJhbmdlKHRoaXMuX3RleHRFZGl0b3IsZWRpdG9yTG9jYXRpb25bMF0sbGluZSx0b2tlbi5lbmRDb2x1bW4pO2lmKGFzeW5jU3RlcEluUmFuZ2Upe2hpZ2hsaWdodFJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGVkaXRvckxvY2F0aW9uWzBdLGFzeW5jU3RlcEluUmFuZ2UuZnJvbSxlZGl0b3JMb2NhdGlvblswXSxhc3luY1N0ZXBJblJhbmdlLnRvLTEpO2RlY29yYXRpb249dGhpcy5fdGV4dEVkaXRvci5oaWdobGlnaHRSYW5nZShoaWdobGlnaHRSYW5nZSwnc291cmNlLWZyYW1lLWFzeW5jLXN0ZXAtaW4nKTt0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucy5zZXQoZGVjb3JhdGlvbix0aGlzLl9hc3luY1N0ZXBJbi5iaW5kKHRoaXMsbG9jYXRpb24sISFpc0N1cnJlbnRQb3NpdGlvbikpO319fQp0aGlzLl9jb250aW51ZVRvTG9jYXRpb25SZW5kZXJlZEZvclRlc3QoKTt9fQpfY29udGludWVUb0xvY2F0aW9uUmVuZGVyZWRGb3JUZXN0KCl7fQpfZmluZEFzeW5jU3RlcEluUmFuZ2UodGV4dEVkaXRvcixlZGl0b3JMaW5lTnVtYmVyLGxpbmUsY29sdW1uKXtsZXQgdG9rZW47bGV0IHRva2VuVGV4dDtsZXQgZnJvbT1jb2x1bW47bGV0IHRvPWxpbmUubGVuZ3RoO2xldCBwb3NpdGlvbj1saW5lLmluZGV4T2YoJygnLGNvbHVtbik7Y29uc3QgYXJndW1lbnRzU3RhcnQ9cG9zaXRpb247aWYocG9zaXRpb249PT0tMSkKcmV0dXJuIG51bGw7cG9zaXRpb24rKztza2lwV2hpdGVzcGFjZSgpO2lmKHBvc2l0aW9uPj1saW5lLmxlbmd0aCkKcmV0dXJuIG51bGw7bmV4dFRva2VuKCk7aWYoIXRva2VuKQpyZXR1cm4gbnVsbDtmcm9tPXRva2VuLnN0YXJ0Q29sdW1uO2lmKHRva2VuLnR5cGU9PT0nanMta2V5d29yZCcmJnRva2VuVGV4dD09PSdhc3luYycpe3NraXBXaGl0ZXNwYWNlKCk7aWYocG9zaXRpb24+PWxpbmUubGVuZ3RoKQpyZXR1cm57ZnJvbTpmcm9tLHRvOnRvfTtuZXh0VG9rZW4oKTtpZighdG9rZW4pCnJldHVybntmcm9tOmZyb20sdG86dG99O30KaWYodG9rZW4udHlwZT09PSdqcy1rZXl3b3JkJyYmdG9rZW5UZXh0PT09J2Z1bmN0aW9uJykKcmV0dXJue2Zyb206ZnJvbSx0bzp0b307aWYodG9rZW4udHlwZT09PSdqcy1zdHJpbmcnKQpyZXR1cm57ZnJvbTphcmd1bWVudHNTdGFydCx0bzp0b307aWYodG9rZW4udHlwZSYmdGhpcy5faXNJZGVudGlmaWVyKHRva2VuLnR5cGUpKQpyZXR1cm57ZnJvbTpmcm9tLHRvOnRvfTtpZih0b2tlblRleHQhPT0nKCcpCnJldHVybiBudWxsO2NvbnN0IGNsb3NlUGFyZW49bGluZS5pbmRleE9mKCcpJyxwb3NpdGlvbik7aWYoY2xvc2VQYXJlbj09PS0xfHxsaW5lLnN1YnN0cmluZyhwb3NpdGlvbixjbG9zZVBhcmVuKS5pbmRleE9mKCcoJykhPT0tMSkKcmV0dXJue2Zyb206ZnJvbSx0bzp0b307cmV0dXJue2Zyb206ZnJvbSx0bzpjbG9zZVBhcmVuKzF9O2Z1bmN0aW9uIG5leHRUb2tlbigpe3Rva2VuPXRleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihlZGl0b3JMaW5lTnVtYmVyLHBvc2l0aW9uKTtpZih0b2tlbil7cG9zaXRpb249dG9rZW4uZW5kQ29sdW1uO3RvPXRva2VuLmVuZENvbHVtbjt0b2tlblRleHQ9bGluZS5zdWJzdHJpbmcodG9rZW4uc3RhcnRDb2x1bW4sdG9rZW4uZW5kQ29sdW1uKTt9fQpmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpe3doaWxlKHBvc2l0aW9uPGxpbmUubGVuZ3RoKXtpZihsaW5lW3Bvc2l0aW9uXT09PScgJyl7cG9zaXRpb24rKztjb250aW51ZTt9CmNvbnN0IHRva2VuPXRleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihlZGl0b3JMaW5lTnVtYmVyLHBvc2l0aW9uKTtpZih0b2tlbi50eXBlPT09J2pzLWNvbW1lbnQnKXtwb3NpdGlvbj10b2tlbi5lbmRDb2x1bW47Y29udGludWU7fQpicmVhazt9fX0KX2FzeW5jU3RlcEluKGxvY2F0aW9uLGlzQ3VycmVudFBvc2l0aW9uKXtpZighaXNDdXJyZW50UG9zaXRpb24pCmxvY2F0aW9uLmNvbnRpbnVlVG9Mb2NhdGlvbihhc3luY1N0ZXBJbik7ZWxzZQphc3luY1N0ZXBJbigpO2Z1bmN0aW9uIGFzeW5jU3RlcEluKCl7bG9jYXRpb24uZGVidWdnZXJNb2RlbC5zY2hlZHVsZVN0ZXBJbnRvQXN5bmMoKTt9fQpfcHJlcGFyZVNjb3BlVmFyaWFibGVzKGNhbGxGcmFtZSxwcm9wZXJ0aWVzLGludGVybmFsUHJvcGVydGllcyl7dGhpcy5fY2xlYXJWYWx1ZVdpZGdldHMoKTtpZighcHJvcGVydGllc3x8IXByb3BlcnRpZXMubGVuZ3RofHxwcm9wZXJ0aWVzLmxlbmd0aD41MDB8fCF0aGlzLl90ZXh0RWRpdG9yLmlzU2hvd2luZygpKQpyZXR1cm47Y29uc3QgZnVuY3Rpb25VSUxvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbigoY2FsbEZyYW1lLmZ1bmN0aW9uTG9jYXRpb24oKSkpO2NvbnN0IGV4ZWN1dGlvblVJTG9jYXRpb249QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnJhd0xvY2F0aW9uVG9VSUxvY2F0aW9uKGNhbGxGcmFtZS5sb2NhdGlvbigpKTtpZighZnVuY3Rpb25VSUxvY2F0aW9ufHwhZXhlY3V0aW9uVUlMb2NhdGlvbnx8ZnVuY3Rpb25VSUxvY2F0aW9uLnVpU291cmNlQ29kZSE9PXRoaXMuX3VpU291cmNlQ29kZXx8ZXhlY3V0aW9uVUlMb2NhdGlvbi51aVNvdXJjZUNvZGUhPT10aGlzLl91aVNvdXJjZUNvZGUpCnJldHVybjtjb25zdCBmdW5jdGlvbkVkaXRvckxvY2F0aW9uPXRoaXMuX3RyYW5zZm9ybWVyLnJhd1RvRWRpdG9yTG9jYXRpb24oZnVuY3Rpb25VSUxvY2F0aW9uLmxpbmVOdW1iZXIsZnVuY3Rpb25VSUxvY2F0aW9uLmNvbHVtbk51bWJlcik7Y29uc3QgZXhlY3V0aW9uRWRpdG9yTG9jYXRpb249dGhpcy5fdHJhbnNmb3JtZXIucmF3VG9FZGl0b3JMb2NhdGlvbihleGVjdXRpb25VSUxvY2F0aW9uLmxpbmVOdW1iZXIsZXhlY3V0aW9uVUlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2NvbnN0IGZyb21MaW5lPWZ1bmN0aW9uRWRpdG9yTG9jYXRpb25bMF07Y29uc3QgZnJvbUNvbHVtbj1mdW5jdGlvbkVkaXRvckxvY2F0aW9uWzFdO2NvbnN0IHRvTGluZT1leGVjdXRpb25FZGl0b3JMb2NhdGlvblswXTtpZihmcm9tTGluZT49dG9MaW5lfHx0b0xpbmUtZnJvbUxpbmU+NTAwfHxmcm9tTGluZTwwfHx0b0xpbmU+PXRoaXMuX3RleHRFZGl0b3IubGluZXNDb3VudCkKcmV0dXJuO2NvbnN0IHZhbHVlc01hcD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpCnZhbHVlc01hcC5zZXQocHJvcGVydHkubmFtZSxwcm9wZXJ0eS52YWx1ZSk7Y29uc3QgbmFtZXNQZXJMaW5lPW5ldyBNYXAoKTtsZXQgc2tpcE9iamVjdFByb3BlcnR5PWZhbHNlO2NvbnN0IHRva2VuaXplcj1uZXcgVGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMuVG9rZW5pemVyRmFjdG9yeSgpLmNyZWF0ZVRva2VuaXplcigndGV4dC9qYXZhc2NyaXB0Jyk7dG9rZW5pemVyKHRoaXMuX3RleHRFZGl0b3IubGluZShmcm9tTGluZSkuc3Vic3RyaW5nKGZyb21Db2x1bW4pLHByb2Nlc3NUb2tlbi5iaW5kKHRoaXMsZnJvbUxpbmUpKTtmb3IobGV0IGk9ZnJvbUxpbmUrMTtpPHRvTGluZTsrK2kpCnRva2VuaXplcih0aGlzLl90ZXh0RWRpdG9yLmxpbmUoaSkscHJvY2Vzc1Rva2VuLmJpbmQodGhpcyxpKSk7ZnVuY3Rpb24gcHJvY2Vzc1Rva2VuKGVkaXRvckxpbmVOdW1iZXIsdG9rZW5WYWx1ZSx0b2tlblR5cGUsY29sdW1uLG5ld0NvbHVtbil7aWYoIXNraXBPYmplY3RQcm9wZXJ0eSYmdG9rZW5UeXBlJiZ0aGlzLl9pc0lkZW50aWZpZXIodG9rZW5UeXBlKSYmdmFsdWVzTWFwLmdldCh0b2tlblZhbHVlKSl7bGV0IG5hbWVzPW5hbWVzUGVyTGluZS5nZXQoZWRpdG9yTGluZU51bWJlcik7aWYoIW5hbWVzKXtuYW1lcz1uZXcgU2V0KCk7bmFtZXNQZXJMaW5lLnNldChlZGl0b3JMaW5lTnVtYmVyLG5hbWVzKTt9Cm5hbWVzLmFkZCh0b2tlblZhbHVlKTt9CnNraXBPYmplY3RQcm9wZXJ0eT10b2tlblZhbHVlPT09Jy4nO30KdGhpcy5fdGV4dEVkaXRvci5vcGVyYXRpb24odGhpcy5fcmVuZGVyRGVjb3JhdGlvbnMuYmluZCh0aGlzLHZhbHVlc01hcCxuYW1lc1BlckxpbmUsZnJvbUxpbmUsdG9MaW5lKSk7fQpfcmVuZGVyRGVjb3JhdGlvbnModmFsdWVzTWFwLG5hbWVzUGVyTGluZSxmcm9tTGluZSx0b0xpbmUpe2NvbnN0IGZvcm1hdHRlcj1uZXcgT2JqZWN0VUkuUmVtb3RlT2JqZWN0UHJldmlld0Zvcm1hdHRlcigpO2ZvcihsZXQgaT1mcm9tTGluZTtpPHRvTGluZTsrK2kpe2NvbnN0IG5hbWVzPW5hbWVzUGVyTGluZS5nZXQoaSk7Y29uc3Qgb2xkV2lkZ2V0PXRoaXMuX3ZhbHVlV2lkZ2V0cy5nZXQoaSk7aWYoIW5hbWVzKXtpZihvbGRXaWRnZXQpe3RoaXMuX3ZhbHVlV2lkZ2V0cy5kZWxldGUoaSk7dGhpcy5fdGV4dEVkaXRvci5yZW1vdmVEZWNvcmF0aW9uKG9sZFdpZGdldCxpKTt9CmNvbnRpbnVlO30KY29uc3Qgd2lkZ2V0PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RleHQtZWRpdG9yLXZhbHVlLWRlY29yYXRpb24nKTtjb25zdCBiYXNlPXRoaXMuX3RleHRFZGl0b3IuY3Vyc29yUG9zaXRpb25Ub0Nvb3JkaW5hdGVzKGksMCk7Y29uc3Qgb2Zmc2V0PXRoaXMuX3RleHRFZGl0b3IuY3Vyc29yUG9zaXRpb25Ub0Nvb3JkaW5hdGVzKGksdGhpcy5fdGV4dEVkaXRvci5saW5lKGkpLmxlbmd0aCk7Y29uc3QgY29kZU1pcnJvckxpbmVzTGVmdFBhZGRpbmc9NDtjb25zdCBsZWZ0PW9mZnNldC54LWJhc2UueCtjb2RlTWlycm9yTGluZXNMZWZ0UGFkZGluZzt3aWRnZXQuc3R5bGUubGVmdD1sZWZ0KydweCc7d2lkZ2V0Ll9fbmFtZVRvVG9rZW49bmV3IE1hcCgpO2xldCByZW5kZXJlZE5hbWVDb3VudD0wO2Zvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtpZihyZW5kZXJlZE5hbWVDb3VudD4xMCkKYnJlYWs7aWYobmFtZXNQZXJMaW5lLmdldChpLTEpJiZuYW1lc1BlckxpbmUuZ2V0KGktMSkuaGFzKG5hbWUpKQpjb250aW51ZTtpZihyZW5kZXJlZE5hbWVDb3VudCkKd2lkZ2V0LmNyZWF0ZVRleHRDaGlsZCgnLCAnKTtjb25zdCBuYW1lVmFsdWVQYWlyPXdpZGdldC5jcmVhdGVDaGlsZCgnc3BhbicpO3dpZGdldC5fX25hbWVUb1Rva2VuLnNldChuYW1lLG5hbWVWYWx1ZVBhaXIpO25hbWVWYWx1ZVBhaXIuY3JlYXRlVGV4dENoaWxkKG5hbWUrJyA9ICcpO2NvbnN0IHZhbHVlPXZhbHVlc01hcC5nZXQobmFtZSk7Y29uc3QgcHJvcGVydHlDb3VudD12YWx1ZS5wcmV2aWV3P3ZhbHVlLnByZXZpZXcucHJvcGVydGllcy5sZW5ndGg6MDtjb25zdCBlbnRyeUNvdW50PXZhbHVlLnByZXZpZXcmJnZhbHVlLnByZXZpZXcuZW50cmllcz92YWx1ZS5wcmV2aWV3LmVudHJpZXMubGVuZ3RoOjA7aWYodmFsdWUucHJldmlldyYmcHJvcGVydHlDb3VudCtlbnRyeUNvdW50PDEwKXtmb3JtYXR0ZXIuYXBwZW5kT2JqZWN0UHJldmlldyhuYW1lVmFsdWVQYWlyLHZhbHVlLnByZXZpZXcsZmFsc2UpO31lbHNle25hbWVWYWx1ZVBhaXIuYXBwZW5kQ2hpbGQoT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24uY3JlYXRlVmFsdWVFbGVtZW50KHZhbHVlLGZhbHNlLGZhbHNlKSk7fQorK3JlbmRlcmVkTmFtZUNvdW50O30KbGV0IHdpZGdldENoYW5nZWQ9dHJ1ZTtpZihvbGRXaWRnZXQpe3dpZGdldENoYW5nZWQ9ZmFsc2U7Zm9yKGNvbnN0IG5hbWUgb2Ygd2lkZ2V0Ll9fbmFtZVRvVG9rZW4ua2V5cygpKXtjb25zdCBvbGRUZXh0PW9sZFdpZGdldC5fX25hbWVUb1Rva2VuLmdldChuYW1lKT9vbGRXaWRnZXQuX19uYW1lVG9Ub2tlbi5nZXQobmFtZSkudGV4dENvbnRlbnQ6Jyc7Y29uc3QgbmV3VGV4dD13aWRnZXQuX19uYW1lVG9Ub2tlbi5nZXQobmFtZSk/d2lkZ2V0Ll9fbmFtZVRvVG9rZW4uZ2V0KG5hbWUpLnRleHRDb250ZW50OicnO2lmKG5ld1RleHQhPT1vbGRUZXh0KXt3aWRnZXRDaGFuZ2VkPXRydWU7VUkucnVuQ1NTQW5pbWF0aW9uT25jZSgod2lkZ2V0Ll9fbmFtZVRvVG9rZW4uZ2V0KG5hbWUpKSwnc291cmNlLWZyYW1lLXZhbHVlLXVwZGF0ZS1oaWdobGlnaHQnKTt9fQppZih3aWRnZXRDaGFuZ2VkKXt0aGlzLl92YWx1ZVdpZGdldHMuZGVsZXRlKGkpO3RoaXMuX3RleHRFZGl0b3IucmVtb3ZlRGVjb3JhdGlvbihvbGRXaWRnZXQsaSk7fX0KaWYod2lkZ2V0Q2hhbmdlZCl7dGhpcy5fdmFsdWVXaWRnZXRzLnNldChpLHdpZGdldCk7dGhpcy5fdGV4dEVkaXRvci5hZGREZWNvcmF0aW9uKHdpZGdldCxpKTt9fX0KX2NsZWFyRXhlY3V0aW9uTGluZSgpe3RoaXMuX3RleHRFZGl0b3Iub3BlcmF0aW9uKCgpPT57aWYodGhpcy5fZXhlY3V0aW9uTG9jYXRpb24pCnRoaXMuX3RleHRFZGl0b3IuY2xlYXJFeGVjdXRpb25MaW5lKCk7dGhpcy5fZXhlY3V0aW9uTG9jYXRpb249bnVsbDtpZih0aGlzLl9jbGVhclZhbHVlV2lkZ2V0c1RpbWVyKXtjbGVhclRpbWVvdXQodGhpcy5fY2xlYXJWYWx1ZVdpZGdldHNUaW1lcik7dGhpcy5fY2xlYXJWYWx1ZVdpZGdldHNUaW1lcj1udWxsO30KdGhpcy5fY2xlYXJWYWx1ZVdpZGdldHNUaW1lcj1zZXRUaW1lb3V0KHRoaXMuX2NsZWFyVmFsdWVXaWRnZXRzLmJpbmQodGhpcyksMTAwMCk7dGhpcy5fY2xlYXJDb250aW51ZVRvTG9jYXRpb25zTm9SZXN0b3JlKCk7fSk7fQpfY2xlYXJWYWx1ZVdpZGdldHMoKXtjbGVhclRpbWVvdXQodGhpcy5fY2xlYXJWYWx1ZVdpZGdldHNUaW1lcik7dGhpcy5fY2xlYXJWYWx1ZVdpZGdldHNUaW1lcj1udWxsO3RoaXMuX3RleHRFZGl0b3Iub3BlcmF0aW9uKCgpPT57Zm9yKGNvbnN0IGxpbmUgb2YgdGhpcy5fdmFsdWVXaWRnZXRzLmtleXMoKSkKdGhpcy5fdGV4dEVkaXRvci5yZW1vdmVEZWNvcmF0aW9uKHRoaXMuX3ZhbHVlV2lkZ2V0cy5nZXQobGluZSksbGluZSk7dGhpcy5fdmFsdWVXaWRnZXRzLmNsZWFyKCk7fSk7fQpfY2xlYXJDb250aW51ZVRvTG9jYXRpb25zTm9SZXN0b3JlKCl7aWYoIXRoaXMuX2NvbnRpbnVlVG9Mb2NhdGlvbkRlY29yYXRpb25zKQpyZXR1cm47dGhpcy5fdGV4dEVkaXRvci5vcGVyYXRpb24oKCk9Pntmb3IoY29uc3QgZGVjb3JhdGlvbiBvZiB0aGlzLl9jb250aW51ZVRvTG9jYXRpb25EZWNvcmF0aW9ucy5rZXlzKCkpCnRoaXMuX3RleHRFZGl0b3IucmVtb3ZlSGlnaGxpZ2h0KGRlY29yYXRpb24pO3RoaXMuX2NvbnRpbnVlVG9Mb2NhdGlvbkRlY29yYXRpb25zPW51bGw7dGhpcy5fc2V0QXN5bmNTdGVwSW5Ib3ZlcmVkTGluZShudWxsLGZhbHNlKTt9KTt9Cl9jbGVhckNvbnRpbnVlVG9Mb2NhdGlvbnMoKXtpZighdGhpcy5fY29udGludWVUb0xvY2F0aW9uRGVjb3JhdGlvbnMpCnJldHVybjt0aGlzLl90ZXh0RWRpdG9yLm9wZXJhdGlvbigoKT0+e3RoaXMuX3RleHRFZGl0b3Iuc2hvd0V4ZWN1dGlvbkxpbmVCYWNrZ3JvdW5kKCk7dGhpcy5fZ2VuZXJhdGVWYWx1ZXNJblNvdXJjZSgpO3RoaXMuX2NsZWFyQ29udGludWVUb0xvY2F0aW9uc05vUmVzdG9yZSgpO30pO30KX2xpbmVCcmVha3BvaW50RGVjb3JhdGlvbnMobGluZU51bWJlcil7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zKS5maWx0ZXIoZGVjb3JhdGlvbj0+KGRlY29yYXRpb24uaGFuZGxlLnJlc29sdmUoKXx8e30pLmxpbmVOdW1iZXI9PT1saW5lTnVtYmVyKTt9Cl9icmVha3BvaW50RGVjb3JhdGlvbihlZGl0b3JMaW5lTnVtYmVyLGVkaXRvckNvbHVtbk51bWJlcil7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zKXtjb25zdCBsb2NhdGlvbj1kZWNvcmF0aW9uLmhhbmRsZS5yZXNvbHZlKCk7aWYoIWxvY2F0aW9uKQpjb250aW51ZTtpZihsb2NhdGlvbi5saW5lTnVtYmVyPT09ZWRpdG9yTGluZU51bWJlciYmbG9jYXRpb24uY29sdW1uTnVtYmVyPT09ZWRpdG9yQ29sdW1uTnVtYmVyKQpyZXR1cm4gZGVjb3JhdGlvbjt9CnJldHVybiBudWxsO30KX3VwZGF0ZUJyZWFrcG9pbnREZWNvcmF0aW9uKGRlY29yYXRpb24pe2lmKCF0aGlzLl9zY2hlZHVsZWRCcmVha3BvaW50RGVjb3JhdGlvblVwZGF0ZXMpe3RoaXMuX3NjaGVkdWxlZEJyZWFrcG9pbnREZWNvcmF0aW9uVXBkYXRlcz1uZXcgU2V0KCk7c2V0SW1tZWRpYXRlKCgpPT50aGlzLl90ZXh0RWRpdG9yLm9wZXJhdGlvbih1cGRhdGUuYmluZCh0aGlzKSkpO30KdGhpcy5fc2NoZWR1bGVkQnJlYWtwb2ludERlY29yYXRpb25VcGRhdGVzLmFkZChkZWNvcmF0aW9uKTtmdW5jdGlvbiB1cGRhdGUoKXtpZighdGhpcy5fc2NoZWR1bGVkQnJlYWtwb2ludERlY29yYXRpb25VcGRhdGVzKQpyZXR1cm47Y29uc3QgZWRpdG9yTGluZU51bWJlcnM9bmV3IFNldCgpO2Zvcihjb25zdCBkZWNvcmF0aW9uIG9mIHRoaXMuX3NjaGVkdWxlZEJyZWFrcG9pbnREZWNvcmF0aW9uVXBkYXRlcyl7Y29uc3QgbG9jYXRpb249ZGVjb3JhdGlvbi5oYW5kbGUucmVzb2x2ZSgpO2lmKCFsb2NhdGlvbikKY29udGludWU7ZWRpdG9yTGluZU51bWJlcnMuYWRkKGxvY2F0aW9uLmxpbmVOdW1iZXIpO30KdGhpcy5fc2NoZWR1bGVkQnJlYWtwb2ludERlY29yYXRpb25VcGRhdGVzPW51bGw7bGV0IHdhaXRpbmdGb3JJbmxpbmVEZWNvcmF0aW9ucz1mYWxzZTtmb3IoY29uc3QgbGluZU51bWJlciBvZiBlZGl0b3JMaW5lTnVtYmVycyl7Y29uc3QgZGVjb3JhdGlvbnM9dGhpcy5fbGluZUJyZWFrcG9pbnREZWNvcmF0aW9ucyhsaW5lTnVtYmVyKTt1cGRhdGVHdXR0ZXIuY2FsbCh0aGlzLGxpbmVOdW1iZXIsZGVjb3JhdGlvbnMpO2lmKHRoaXMuX3Bvc3NpYmxlQnJlYWtwb2ludHNSZXF1ZXN0ZWQuaGFzKGxpbmVOdW1iZXIpKXt3YWl0aW5nRm9ySW5saW5lRGVjb3JhdGlvbnM9dHJ1ZTtjb250aW51ZTt9CnVwZGF0ZUlubGluZURlY29yYXRpb25zLmNhbGwodGhpcyxsaW5lTnVtYmVyLGRlY29yYXRpb25zKTt9CmlmKCF3YWl0aW5nRm9ySW5saW5lRGVjb3JhdGlvbnMpCnRoaXMuX2JyZWFrcG9pbnREZWNvcmF0aW9uc1VwZGF0ZWRGb3JUZXN0KCk7fQpmdW5jdGlvbiB1cGRhdGVHdXR0ZXIoZWRpdG9yTGluZU51bWJlcixkZWNvcmF0aW9ucyl7dGhpcy5fdGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MoZWRpdG9yTGluZU51bWJlciwnY20tYnJlYWtwb2ludCcsZmFsc2UpO3RoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGVkaXRvckxpbmVOdW1iZXIsJ2NtLWJyZWFrcG9pbnQtZGlzYWJsZWQnLGZhbHNlKTt0aGlzLl90ZXh0RWRpdG9yLnRvZ2dsZUxpbmVDbGFzcyhlZGl0b3JMaW5lTnVtYmVyLCdjbS1icmVha3BvaW50LWNvbmRpdGlvbmFsJyxmYWxzZSk7aWYoZGVjb3JhdGlvbnMubGVuZ3RoKXtkZWNvcmF0aW9ucy5zb3J0KFNvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb24ubW9zdFNwZWNpZmljRmlyc3QpO3RoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGVkaXRvckxpbmVOdW1iZXIsJ2NtLWJyZWFrcG9pbnQnLHRydWUpO3RoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGVkaXRvckxpbmVOdW1iZXIsJ2NtLWJyZWFrcG9pbnQtZGlzYWJsZWQnLCFkZWNvcmF0aW9uc1swXS5lbmFibGVkfHx0aGlzLl9tdXRlZCk7dGhpcy5fdGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MoZWRpdG9yTGluZU51bWJlciwnY20tYnJlYWtwb2ludC1jb25kaXRpb25hbCcsISFkZWNvcmF0aW9uc1swXS5jb25kaXRpb24pO319CmZ1bmN0aW9uIHVwZGF0ZUlubGluZURlY29yYXRpb25zKGVkaXRvckxpbmVOdW1iZXIsZGVjb3JhdGlvbnMpe2NvbnN0IGFjdHVhbEJvb2ttYXJrcz1uZXcgU2V0KGRlY29yYXRpb25zLm1hcChkZWNvcmF0aW9uPT5kZWNvcmF0aW9uLmJvb2ttYXJrKS5maWx0ZXIoYm9va21hcms9PiEhYm9va21hcmspKTtjb25zdCBsaW5lRW5kPXRoaXMuX3RleHRFZGl0b3IubGluZShlZGl0b3JMaW5lTnVtYmVyKS5sZW5ndGg7Y29uc3QgYm9va21hcmtzPXRoaXMuX3RleHRFZGl0b3IuYm9va21hcmtzKG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKGVkaXRvckxpbmVOdW1iZXIsMCxlZGl0b3JMaW5lTnVtYmVyLGxpbmVFbmQpLFNvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb24uYm9va21hcmtTeW1ib2wpO2Zvcihjb25zdCBib29rbWFyayBvZiBib29rbWFya3Mpe2lmKCFhY3R1YWxCb29rbWFya3MuaGFzKGJvb2ttYXJrKSkKYm9va21hcmsuY2xlYXIoKTt9CmlmKCFkZWNvcmF0aW9ucy5sZW5ndGgpCnJldHVybjtpZihkZWNvcmF0aW9ucy5sZW5ndGg+MSl7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgZGVjb3JhdGlvbnMpe2RlY29yYXRpb24udXBkYXRlKCk7aWYoIXRoaXMuX211dGVkKQpkZWNvcmF0aW9uLnNob3coKTtlbHNlCmRlY29yYXRpb24uaGlkZSgpO319ZWxzZXtkZWNvcmF0aW9uc1swXS51cGRhdGUoKTtkZWNvcmF0aW9uc1swXS5oaWRlKCk7fX19Cl9icmVha3BvaW50RGVjb3JhdGlvbnNVcGRhdGVkRm9yVGVzdCgpe30KX2lubGluZUJyZWFrcG9pbnRDbGljayhkZWNvcmF0aW9uLGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO2lmKGRlY29yYXRpb24uYnJlYWtwb2ludCl7aWYoZXZlbnQuc2hpZnRLZXkpCmRlY29yYXRpb24uYnJlYWtwb2ludC5zZXRFbmFibGVkKCFkZWNvcmF0aW9uLmJyZWFrcG9pbnQuZW5hYmxlZCgpKTtlbHNlCmRlY29yYXRpb24uYnJlYWtwb2ludC5yZW1vdmUoKTt9ZWxzZXtjb25zdCBlZGl0b3JMb2NhdGlvbj1kZWNvcmF0aW9uLmhhbmRsZS5yZXNvbHZlKCk7aWYoIWVkaXRvckxvY2F0aW9uKQpyZXR1cm47Y29uc3QgbG9jYXRpb249dGhpcy5fdHJhbnNmb3JtZXIuZWRpdG9yVG9SYXdMb2NhdGlvbihlZGl0b3JMb2NhdGlvbi5saW5lTnVtYmVyLGVkaXRvckxvY2F0aW9uLmNvbHVtbk51bWJlcik7dGhpcy5fc2V0QnJlYWtwb2ludChsb2NhdGlvblswXSxsb2NhdGlvblsxXSxkZWNvcmF0aW9uLmNvbmRpdGlvbix0cnVlKTt9fQpfaW5saW5lQnJlYWtwb2ludENvbnRleHRNZW51KGRlY29yYXRpb24sZXZlbnQpe2V2ZW50LmNvbnN1bWUodHJ1ZSk7Y29uc3QgZWRpdG9yTG9jYXRpb249ZGVjb3JhdGlvbi5oYW5kbGUucmVzb2x2ZSgpO2lmKCFlZGl0b3JMb2NhdGlvbikKcmV0dXJuO2NvbnN0IGxvY2F0aW9uPXRoaXMuX3RyYW5zZm9ybWVyLmVkaXRvclRvUmF3TG9jYXRpb24oZWRpdG9yTG9jYXRpb25bMF0sZWRpdG9yTG9jYXRpb25bMV0pO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7aWYoZGVjb3JhdGlvbi5icmVha3BvaW50KXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRWRpdCBicmVha3BvaW50XHUyMDI2JyksdGhpcy5fZWRpdEJyZWFrcG9pbnRDb25kaXRpb24uYmluZCh0aGlzLGVkaXRvckxvY2F0aW9uLmxpbmVOdW1iZXIsZGVjb3JhdGlvbi5icmVha3BvaW50LG51bGwpKTt9ZWxzZXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQWRkIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnRcdTIwMjYnKSx0aGlzLl9lZGl0QnJlYWtwb2ludENvbmRpdGlvbi5iaW5kKHRoaXMsZWRpdG9yTG9jYXRpb24ubGluZU51bWJlcixudWxsLGVkaXRvckxvY2F0aW9uKSk7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ05ldmVyIHBhdXNlIGhlcmUnKSx0aGlzLl9zZXRCcmVha3BvaW50LmJpbmQodGhpcyxsb2NhdGlvblswXSxsb2NhdGlvblsxXSwnZmFsc2UnLHRydWUpKTt9CmNvbnRleHRNZW51LnNob3coKTt9Cl9zaG91bGRJZ25vcmVFeHRlcm5hbEJyZWFrcG9pbnRFdmVudHMoZXZlbnQpe2NvbnN0IHVpTG9jYXRpb249KGV2ZW50LmRhdGEudWlMb2NhdGlvbik7aWYodWlMb2NhdGlvbi51aVNvdXJjZUNvZGUhPT10aGlzLl91aVNvdXJjZUNvZGUpCnJldHVybiB0cnVlO2lmKHRoaXMuX3N1cHBvcnRzRW5hYmxlZEJyZWFrcG9pbnRzV2hpbGVFZGl0aW5nKCkpCnJldHVybiBmYWxzZTtpZih0aGlzLl9tdXRlZCkKcmV0dXJuIHRydWU7Y29uc3Qgc2NyaXB0RmlsZXM9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwudmFsdWVzQXJyYXkoKTtmb3IobGV0IGk9MDtpPHNjcmlwdEZpbGVzLmxlbmd0aDsrK2kpe2lmKHNjcmlwdEZpbGVzW2ldLmlzRGl2ZXJnaW5nRnJvbVZNKCl8fHNjcmlwdEZpbGVzW2ldLmlzTWVyZ2luZ1RvVk0oKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpfYnJlYWtwb2ludEFkZGVkKGV2ZW50KXtpZih0aGlzLl9zaG91bGRJZ25vcmVFeHRlcm5hbEJyZWFrcG9pbnRFdmVudHMoZXZlbnQpKQpyZXR1cm47Y29uc3QgdWlMb2NhdGlvbj0oZXZlbnQuZGF0YS51aUxvY2F0aW9uKTtjb25zdCBicmVha3BvaW50PShldmVudC5kYXRhLmJyZWFrcG9pbnQpO3RoaXMuX2FkZEJyZWFrcG9pbnQodWlMb2NhdGlvbixicmVha3BvaW50KTt9Cl9hZGRCcmVha3BvaW50KHVpTG9jYXRpb24sYnJlYWtwb2ludCl7Y29uc3QgZWRpdG9yTG9jYXRpb249dGhpcy5fdHJhbnNmb3JtZXIucmF3VG9FZGl0b3JMb2NhdGlvbih1aUxvY2F0aW9uLmxpbmVOdW1iZXIsdWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2NvbnN0IGxpbmVEZWNvcmF0aW9ucz10aGlzLl9saW5lQnJlYWtwb2ludERlY29yYXRpb25zKHVpTG9jYXRpb24ubGluZU51bWJlcik7bGV0IGRlY29yYXRpb249dGhpcy5fYnJlYWtwb2ludERlY29yYXRpb24oZWRpdG9yTG9jYXRpb25bMF0sZWRpdG9yTG9jYXRpb25bMV0pO2lmKGRlY29yYXRpb24pe2RlY29yYXRpb24uYnJlYWtwb2ludD1icmVha3BvaW50O2RlY29yYXRpb24uY29uZGl0aW9uPWJyZWFrcG9pbnQuY29uZGl0aW9uKCk7ZGVjb3JhdGlvbi5lbmFibGVkPWJyZWFrcG9pbnQuZW5hYmxlZCgpO31lbHNle2NvbnN0IGhhbmRsZT10aGlzLl90ZXh0RWRpdG9yLnRleHRFZGl0b3JQb3NpdGlvbkhhbmRsZShlZGl0b3JMb2NhdGlvblswXSxlZGl0b3JMb2NhdGlvblsxXSk7ZGVjb3JhdGlvbj1uZXcgU291cmNlcy5EZWJ1Z2dlclBsdWdpbi5CcmVha3BvaW50RGVjb3JhdGlvbih0aGlzLl90ZXh0RWRpdG9yLGhhbmRsZSxicmVha3BvaW50LmNvbmRpdGlvbigpLGJyZWFrcG9pbnQuZW5hYmxlZCgpLGJyZWFrcG9pbnQpO2RlY29yYXRpb24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faW5saW5lQnJlYWtwb2ludENsaWNrLmJpbmQodGhpcyxkZWNvcmF0aW9uKSx0cnVlKTtkZWNvcmF0aW9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2lubGluZUJyZWFrcG9pbnRDb250ZXh0TWVudS5iaW5kKHRoaXMsZGVjb3JhdGlvbiksdHJ1ZSk7dGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zLmFkZChkZWNvcmF0aW9uKTt9CnRoaXMuX2RlY29yYXRpb25CeUJyZWFrcG9pbnQuc2V0KGJyZWFrcG9pbnQsZGVjb3JhdGlvbik7dGhpcy5fdXBkYXRlQnJlYWtwb2ludERlY29yYXRpb24oZGVjb3JhdGlvbik7aWYoYnJlYWtwb2ludC5lbmFibGVkKCkmJiFsaW5lRGVjb3JhdGlvbnMubGVuZ3RoKXt0aGlzLl9wb3NzaWJsZUJyZWFrcG9pbnRzUmVxdWVzdGVkLmFkZChlZGl0b3JMb2NhdGlvblswXSk7Y29uc3Qgc3RhcnQ9dGhpcy5fdHJhbnNmb3JtZXIuZWRpdG9yVG9SYXdMb2NhdGlvbihlZGl0b3JMb2NhdGlvblswXSwwKTtjb25zdCBlbmQ9dGhpcy5fdHJhbnNmb3JtZXIuZWRpdG9yVG9SYXdMb2NhdGlvbihlZGl0b3JMb2NhdGlvblswXSsxLDApO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLnBvc3NpYmxlQnJlYWtwb2ludHModGhpcy5fdWlTb3VyY2VDb2RlLG5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0WzBdLHN0YXJ0WzFdLGVuZFswXSxlbmRbMV0pKS50aGVuKGFkZElubGluZURlY29yYXRpb25zLmJpbmQodGhpcyxlZGl0b3JMb2NhdGlvblswXSkpO30KZnVuY3Rpb24gYWRkSW5saW5lRGVjb3JhdGlvbnMoZWRpdG9yTGluZU51bWJlcixwb3NzaWJsZUxvY2F0aW9ucyl7dGhpcy5fcG9zc2libGVCcmVha3BvaW50c1JlcXVlc3RlZC5kZWxldGUoZWRpdG9yTGluZU51bWJlcik7Y29uc3QgZGVjb3JhdGlvbnM9dGhpcy5fbGluZUJyZWFrcG9pbnREZWNvcmF0aW9ucyhlZGl0b3JMaW5lTnVtYmVyKTtmb3IoY29uc3QgZGVjb3JhdGlvbiBvZiBkZWNvcmF0aW9ucykKdGhpcy5fdXBkYXRlQnJlYWtwb2ludERlY29yYXRpb24oZGVjb3JhdGlvbik7aWYoIWRlY29yYXRpb25zLnNvbWUoZGVjb3JhdGlvbj0+ISFkZWNvcmF0aW9uLmJyZWFrcG9pbnQpKQpyZXR1cm47Y29uc3QgY29sdW1ucz1uZXcgU2V0KCk7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgZGVjb3JhdGlvbnMpe2NvbnN0IGVkaXRvckxvY2F0aW9uPWRlY29yYXRpb24uaGFuZGxlLnJlc29sdmUoKTtpZighZWRpdG9yTG9jYXRpb24pCmNvbnRpbnVlO2NvbHVtbnMuYWRkKGVkaXRvckxvY2F0aW9uLmNvbHVtbk51bWJlcik7fQpmb3IoY29uc3QgbG9jYXRpb24gb2YgcG9zc2libGVMb2NhdGlvbnMpe2NvbnN0IGVkaXRvckxvY2F0aW9uPXRoaXMuX3RyYW5zZm9ybWVyLnJhd1RvRWRpdG9yTG9jYXRpb24obG9jYXRpb24ubGluZU51bWJlcixsb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2lmKGNvbHVtbnMuaGFzKGVkaXRvckxvY2F0aW9uWzFdKSkKY29udGludWU7Y29uc3QgaGFuZGxlPXRoaXMuX3RleHRFZGl0b3IudGV4dEVkaXRvclBvc2l0aW9uSGFuZGxlKGVkaXRvckxvY2F0aW9uWzBdLGVkaXRvckxvY2F0aW9uWzFdKTtjb25zdCBkZWNvcmF0aW9uPW5ldyBTb3VyY2VzLkRlYnVnZ2VyUGx1Z2luLkJyZWFrcG9pbnREZWNvcmF0aW9uKHRoaXMuX3RleHRFZGl0b3IsaGFuZGxlLCcnLGZhbHNlLG51bGwpO2RlY29yYXRpb24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5faW5saW5lQnJlYWtwb2ludENsaWNrLmJpbmQodGhpcyxkZWNvcmF0aW9uKSx0cnVlKTtkZWNvcmF0aW9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2lubGluZUJyZWFrcG9pbnRDb250ZXh0TWVudS5iaW5kKHRoaXMsZGVjb3JhdGlvbiksdHJ1ZSk7dGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zLmFkZChkZWNvcmF0aW9uKTt0aGlzLl91cGRhdGVCcmVha3BvaW50RGVjb3JhdGlvbihkZWNvcmF0aW9uKTt9fX0KX2JyZWFrcG9pbnRSZW1vdmVkKGV2ZW50KXtpZih0aGlzLl9zaG91bGRJZ25vcmVFeHRlcm5hbEJyZWFrcG9pbnRFdmVudHMoZXZlbnQpKQpyZXR1cm47Y29uc3QgdWlMb2NhdGlvbj0oZXZlbnQuZGF0YS51aUxvY2F0aW9uKTtjb25zdCBicmVha3BvaW50PShldmVudC5kYXRhLmJyZWFrcG9pbnQpO2NvbnN0IGRlY29yYXRpb249dGhpcy5fZGVjb3JhdGlvbkJ5QnJlYWtwb2ludC5nZXQoYnJlYWtwb2ludCk7aWYoIWRlY29yYXRpb24pCnJldHVybjt0aGlzLl9kZWNvcmF0aW9uQnlCcmVha3BvaW50LmRlbGV0ZShicmVha3BvaW50KTtjb25zdCBlZGl0b3JMb2NhdGlvbj10aGlzLl90cmFuc2Zvcm1lci5yYXdUb0VkaXRvckxvY2F0aW9uKHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcik7ZGVjb3JhdGlvbi5icmVha3BvaW50PW51bGw7ZGVjb3JhdGlvbi5lbmFibGVkPWZhbHNlO2NvbnN0IGxpbmVEZWNvcmF0aW9ucz10aGlzLl9saW5lQnJlYWtwb2ludERlY29yYXRpb25zKGVkaXRvckxvY2F0aW9uWzBdKTtpZighbGluZURlY29yYXRpb25zLnNvbWUoZGVjb3JhdGlvbj0+ISFkZWNvcmF0aW9uLmJyZWFrcG9pbnQpKXtmb3IoY29uc3QgbGluZURlY29yYXRpb24gb2YgbGluZURlY29yYXRpb25zKXt0aGlzLl9icmVha3BvaW50RGVjb3JhdGlvbnMuZGVsZXRlKGxpbmVEZWNvcmF0aW9uKTt0aGlzLl91cGRhdGVCcmVha3BvaW50RGVjb3JhdGlvbihsaW5lRGVjb3JhdGlvbik7fX1lbHNle3RoaXMuX3VwZGF0ZUJyZWFrcG9pbnREZWNvcmF0aW9uKGRlY29yYXRpb24pO319Cl9pbml0aWFsaXplQnJlYWtwb2ludHMoKXtjb25zdCBicmVha3BvaW50TG9jYXRpb25zPXRoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLmJyZWFrcG9pbnRMb2NhdGlvbnNGb3JVSVNvdXJjZUNvZGUodGhpcy5fdWlTb3VyY2VDb2RlKTtmb3IoY29uc3QgYnJlYWtwb2ludExvY2F0aW9uIG9mIGJyZWFrcG9pbnRMb2NhdGlvbnMpCnRoaXMuX2FkZEJyZWFrcG9pbnQoYnJlYWtwb2ludExvY2F0aW9uLnVpTG9jYXRpb24sYnJlYWtwb2ludExvY2F0aW9uLmJyZWFrcG9pbnQpO30KX3VwZGF0ZUxpbmVzV2l0aG91dE1hcHBpbmdIaWdobGlnaHQoKXtjb25zdCBpc1NvdXJjZU1hcFNvdXJjZT0hIUJpbmRpbmdzLkNvbXBpbGVyU2NyaXB0TWFwcGluZy51aVNvdXJjZUNvZGVPcmlnaW4odGhpcy5fdWlTb3VyY2VDb2RlKTtpZighaXNTb3VyY2VNYXBTb3VyY2UpCnJldHVybjtjb25zdCBsaW5lc0NvdW50PXRoaXMuX3RleHRFZGl0b3IubGluZXNDb3VudDtmb3IobGV0IGk9MDtpPGxpbmVzQ291bnQ7KytpKXtjb25zdCBsaW5lSGFzTWFwcGluZz1CaW5kaW5ncy5Db21waWxlclNjcmlwdE1hcHBpbmcudWlMaW5lSGFzTWFwcGluZyh0aGlzLl91aVNvdXJjZUNvZGUsaSk7aWYoIWxpbmVIYXNNYXBwaW5nKQp0aGlzLl9oYXNMaW5lV2l0aG91dE1hcHBpbmc9dHJ1ZTtpZih0aGlzLl9oYXNMaW5lV2l0aG91dE1hcHBpbmcpCnRoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGksJ2NtLWxpbmUtd2l0aG91dC1zb3VyY2UtbWFwcGluZycsIWxpbmVIYXNNYXBwaW5nKTt9fQpfdXBkYXRlU2NyaXB0RmlsZXMoKXtmb3IoY29uc3QgZGVidWdnZXJNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwpKXtjb25zdCBzY3JpcHRGaWxlPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5zY3JpcHRGaWxlKHRoaXMuX3VpU291cmNlQ29kZSxkZWJ1Z2dlck1vZGVsKTtpZihzY3JpcHRGaWxlKQp0aGlzLl91cGRhdGVTY3JpcHRGaWxlKGRlYnVnZ2VyTW9kZWwpO319Cl91cGRhdGVTY3JpcHRGaWxlKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IG9sZFNjcmlwdEZpbGU9dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwuZ2V0KGRlYnVnZ2VyTW9kZWwpO2NvbnN0IG5ld1NjcmlwdEZpbGU9QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnNjcmlwdEZpbGUodGhpcy5fdWlTb3VyY2VDb2RlLGRlYnVnZ2VyTW9kZWwpO3RoaXMuX3NjcmlwdEZpbGVGb3JEZWJ1Z2dlck1vZGVsLmRlbGV0ZShkZWJ1Z2dlck1vZGVsKTtpZihvbGRTY3JpcHRGaWxlKXtvbGRTY3JpcHRGaWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoQmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlLkV2ZW50cy5EaWRNZXJnZVRvVk0sdGhpcy5fZGlkTWVyZ2VUb1ZNLHRoaXMpO29sZFNjcmlwdEZpbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdEZpbGUuRXZlbnRzLkRpZERpdmVyZ2VGcm9tVk0sdGhpcy5fZGlkRGl2ZXJnZUZyb21WTSx0aGlzKTtpZih0aGlzLl9tdXRlZCYmIXRoaXMuX3VpU291cmNlQ29kZS5pc0RpcnR5KCkpCnRoaXMuX3Jlc3RvcmVCcmVha3BvaW50c0lmQ29uc2lzdGVudFNjcmlwdHMoKTt9CmlmKCFuZXdTY3JpcHRGaWxlKQpyZXR1cm47dGhpcy5fc2NyaXB0RmlsZUZvckRlYnVnZ2VyTW9kZWwuc2V0KGRlYnVnZ2VyTW9kZWwsbmV3U2NyaXB0RmlsZSk7bmV3U2NyaXB0RmlsZS5hZGRFdmVudExpc3RlbmVyKEJpbmRpbmdzLlJlc291cmNlU2NyaXB0RmlsZS5FdmVudHMuRGlkTWVyZ2VUb1ZNLHRoaXMuX2RpZE1lcmdlVG9WTSx0aGlzKTtuZXdTY3JpcHRGaWxlLmFkZEV2ZW50TGlzdGVuZXIoQmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlLkV2ZW50cy5EaWREaXZlcmdlRnJvbVZNLHRoaXMuX2RpZERpdmVyZ2VGcm9tVk0sdGhpcyk7bmV3U2NyaXB0RmlsZS5jaGVja01hcHBpbmcoKTtpZihuZXdTY3JpcHRGaWxlLmhhc1NvdXJjZU1hcFVSTCgpKQp0aGlzLl9zaG93U291cmNlTWFwSW5mb2JhcigpO30KX3Nob3dTb3VyY2VNYXBJbmZvYmFyKCl7aWYodGhpcy5fc291cmNlTWFwSW5mb2JhcikKcmV0dXJuO3RoaXMuX3NvdXJjZU1hcEluZm9iYXI9VUkuSW5mb2Jhci5jcmVhdGUoVUkuSW5mb2Jhci5UeXBlLkluZm8sQ29tbW9uLlVJU3RyaW5nKCdTb3VyY2UgTWFwIGRldGVjdGVkLicpLENvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdzb3VyY2VNYXBJbmZvYmFyRGlzYWJsZWQnLGZhbHNlKSk7aWYoIXRoaXMuX3NvdXJjZU1hcEluZm9iYXIpCnJldHVybjt0aGlzLl9zb3VyY2VNYXBJbmZvYmFyLmNyZWF0ZURldGFpbHNSb3dNZXNzYWdlKENvbW1vbi5VSVN0cmluZygnQXNzb2NpYXRlZCBmaWxlcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGZpbGUgdHJlZS4gWW91IGNhbiBkZWJ1ZyB0aGVzZSByZXNvbHZlZCBzb3VyY2UgZmlsZXMgYXMgcmVndWxhciBKYXZhU2NyaXB0IGZpbGVzLicpKTt0aGlzLl9zb3VyY2VNYXBJbmZvYmFyLmNyZWF0ZURldGFpbHNSb3dNZXNzYWdlKENvbW1vbi5VSVN0cmluZygnQXNzb2NpYXRlZCBmaWxlcyBhcmUgYXZhaWxhYmxlIHZpYSBmaWxlIHRyZWUgb3IgJXMuJyxVSS5zaG9ydGN1dFJlZ2lzdHJ5LnNob3J0Y3V0VGl0bGVGb3JBY3Rpb24oJ3F1aWNrT3Blbi5zaG93JykpKTt0aGlzLl9zb3VyY2VNYXBJbmZvYmFyLnNldENsb3NlQ2FsbGJhY2soKCk9PnRoaXMuX3NvdXJjZU1hcEluZm9iYXI9bnVsbCk7dGhpcy5fdGV4dEVkaXRvci5hdHRhY2hJbmZvYmFyKHRoaXMuX3NvdXJjZU1hcEluZm9iYXIpO30KX2RldGVjdE1pbmlmaWVkKCl7Y29uc3QgY29udGVudD10aGlzLl91aVNvdXJjZUNvZGUuY29udGVudCgpO2lmKCFjb250ZW50fHwhVGV4dFV0aWxzLmlzTWluaWZpZWQoY29udGVudCkpCnJldHVybjt0aGlzLl9wcmV0dHlQcmludEluZm9iYXI9VUkuSW5mb2Jhci5jcmVhdGUoVUkuSW5mb2Jhci5UeXBlLkluZm8sQ29tbW9uLlVJU3RyaW5nKCdQcmV0dHktcHJpbnQgdGhpcyBtaW5pZmllZCBmaWxlPycpLENvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdwcmV0dHlQcmludEluZm9iYXJEaXNhYmxlZCcsZmFsc2UpKTtpZighdGhpcy5fcHJldHR5UHJpbnRJbmZvYmFyKQpyZXR1cm47dGhpcy5fcHJldHR5UHJpbnRJbmZvYmFyLnNldENsb3NlQ2FsbGJhY2soKCk9PnRoaXMuX3ByZXR0eVByaW50SW5mb2Jhcj1udWxsKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnKTtjb25zdCBidXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oJycsJ2xhcmdlaWNvbi1wcmV0dHktcHJpbnQnKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGJ1dHRvbik7dG9vbGJhci5lbGVtZW50LnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7dG9vbGJhci5lbGVtZW50LnN0eWxlLnZlcnRpY2FsQWxpZ249J21pZGRsZSc7dG9vbGJhci5lbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbT0nM3B4Jzt0b29sYmFyLmVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cz0nbm9uZSc7Y29uc3QgZWxlbWVudD10aGlzLl9wcmV0dHlQcmludEluZm9iYXIuY3JlYXRlRGV0YWlsc1Jvd01lc3NhZ2UoKTtlbGVtZW50LmFwcGVuZENoaWxkKFVJLmZvcm1hdExvY2FsaXplZCgnWW91IGNhbiBjbGljayB0aGUgJXMgYnV0dG9uIG9uIHRoZSBib3R0b20gc3RhdHVzIGJhciwgYW5kIGNvbnRpbnVlIGRlYnVnZ2luZyB3aXRoIHRoZSBuZXcgZm9ybWF0dGVkIHNvdXJjZS4nLFt0b29sYmFyLmVsZW1lbnRdKSk7dGhpcy5fdGV4dEVkaXRvci5hdHRhY2hJbmZvYmFyKHRoaXMuX3ByZXR0eVByaW50SW5mb2Jhcik7fQpfaGFuZGxlR3V0dGVyQ2xpY2soZXZlbnQpe2lmKHRoaXMuX211dGVkKQpyZXR1cm47Y29uc3QgZXZlbnREYXRhPShldmVudC5kYXRhKTtjb25zdCBlZGl0b3JMaW5lTnVtYmVyPWV2ZW50RGF0YS5saW5lTnVtYmVyO2NvbnN0IGV2ZW50T2JqZWN0PWV2ZW50RGF0YS5ldmVudDtpZihldmVudE9iamVjdC5idXR0b24hPT0wfHxldmVudE9iamVjdC5hbHRLZXl8fGV2ZW50T2JqZWN0LmN0cmxLZXl8fGV2ZW50T2JqZWN0Lm1ldGFLZXkpCnJldHVybjt0aGlzLl90b2dnbGVCcmVha3BvaW50KGVkaXRvckxpbmVOdW1iZXIsZXZlbnRPYmplY3Quc2hpZnRLZXkpO2V2ZW50T2JqZWN0LmNvbnN1bWUodHJ1ZSk7fQpfdG9nZ2xlQnJlYWtwb2ludChlZGl0b3JMaW5lTnVtYmVyLG9ubHlEaXNhYmxlKXtjb25zdCBkZWNvcmF0aW9ucz10aGlzLl9saW5lQnJlYWtwb2ludERlY29yYXRpb25zKGVkaXRvckxpbmVOdW1iZXIpO2lmKCFkZWNvcmF0aW9ucy5sZW5ndGgpe3RoaXMuX2NyZWF0ZU5ld0JyZWFrcG9pbnQoZWRpdG9yTGluZU51bWJlciwnJyx0cnVlKTtyZXR1cm47fQpjb25zdCBoYXNEaXNhYmxlZD10aGlzLl90ZXh0RWRpdG9yLmhhc0xpbmVDbGFzcyhlZGl0b3JMaW5lTnVtYmVyLCdjbS1icmVha3BvaW50LWRpc2FibGVkJyk7Y29uc3QgYnJlYWtwb2ludHM9ZGVjb3JhdGlvbnMubWFwKGRlY29yYXRpb249PmRlY29yYXRpb24uYnJlYWtwb2ludCkuZmlsdGVyKGJyZWFrcG9pbnQ9PiEhYnJlYWtwb2ludCk7Zm9yKGNvbnN0IGJyZWFrcG9pbnQgb2YgYnJlYWtwb2ludHMpe2lmKG9ubHlEaXNhYmxlKQpicmVha3BvaW50LnNldEVuYWJsZWQoaGFzRGlzYWJsZWQpO2Vsc2UKYnJlYWtwb2ludC5yZW1vdmUoKTt9fQphc3luYyBfY3JlYXRlTmV3QnJlYWtwb2ludChlZGl0b3JMaW5lTnVtYmVyLGNvbmRpdGlvbixlbmFibGVkKXtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlNjcmlwdHNCcmVha3BvaW50U2V0KTtpZihlZGl0b3JMaW5lTnVtYmVyPHRoaXMuX3RleHRFZGl0b3IubGluZXNDb3VudCl7Y29uc3QgbGluZUxlbmd0aD1NYXRoLm1pbih0aGlzLl90ZXh0RWRpdG9yLmxpbmUoZWRpdG9yTGluZU51bWJlcikubGVuZ3RoLDEwMjQpO2NvbnN0IHN0YXJ0PXRoaXMuX3RyYW5zZm9ybWVyLmVkaXRvclRvUmF3TG9jYXRpb24oZWRpdG9yTGluZU51bWJlciwwKTtjb25zdCBlbmQ9dGhpcy5fdHJhbnNmb3JtZXIuZWRpdG9yVG9SYXdMb2NhdGlvbihlZGl0b3JMaW5lTnVtYmVyLGxpbmVMZW5ndGgpO2NvbnN0IGxvY2F0aW9ucz1hd2FpdCB0aGlzLl9icmVha3BvaW50TWFuYWdlci5wb3NzaWJsZUJyZWFrcG9pbnRzKHRoaXMuX3VpU291cmNlQ29kZSxuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShzdGFydFswXSxzdGFydFsxXSxlbmRbMF0sZW5kWzFdKSk7aWYobG9jYXRpb25zJiZsb2NhdGlvbnMubGVuZ3RoKXt0aGlzLl9zZXRCcmVha3BvaW50KGxvY2F0aW9uc1swXS5saW5lTnVtYmVyLGxvY2F0aW9uc1swXS5jb2x1bW5OdW1iZXIsY29uZGl0aW9uLGVuYWJsZWQpO3JldHVybjt9fQpjb25zdCBvcmlnaW49dGhpcy5fdHJhbnNmb3JtZXIuZWRpdG9yVG9SYXdMb2NhdGlvbihlZGl0b3JMaW5lTnVtYmVyLDApO2F3YWl0IHRoaXMuX3NldEJyZWFrcG9pbnQob3JpZ2luWzBdLG9yaWdpblsxXSxjb25kaXRpb24sZW5hYmxlZCk7fQp0b2dnbGVCcmVha3BvaW50T25DdXJyZW50TGluZShvbmx5RGlzYWJsZSl7aWYodGhpcy5fbXV0ZWQpCnJldHVybjtjb25zdCBzZWxlY3Rpb249dGhpcy5fdGV4dEVkaXRvci5zZWxlY3Rpb24oKTtpZighc2VsZWN0aW9uKQpyZXR1cm47dGhpcy5fdG9nZ2xlQnJlYWtwb2ludChzZWxlY3Rpb24uc3RhcnRMaW5lLG9ubHlEaXNhYmxlKTt9Cl9zZXRCcmVha3BvaW50KGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNvbmRpdGlvbixlbmFibGVkKXtpZighQmluZGluZ3MuQ29tcGlsZXJTY3JpcHRNYXBwaW5nLnVpTGluZUhhc01hcHBpbmcodGhpcy5fdWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIpKQpyZXR1cm47Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2JyZWFrcG9pbnRzQWN0aXZlJykuc2V0KHRydWUpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLnNldEJyZWFrcG9pbnQodGhpcy5fdWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLGNvbmRpdGlvbixlbmFibGVkKTt0aGlzLl9icmVha3BvaW50V2FzU2V0Rm9yVGVzdChsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixjb25kaXRpb24sZW5hYmxlZCk7fQpfYnJlYWtwb2ludFdhc1NldEZvclRlc3QobGluZU51bWJlcixjb2x1bW5OdW1iZXIsY29uZGl0aW9uLGVuYWJsZWQpe30KX2NhbGxGcmFtZUNoYW5nZWQoKXt0aGlzLl9saXZlTG9jYXRpb25Qb29sLmRpc3Bvc2VBbGwoKTtjb25zdCBjYWxsRnJhbWU9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lKTtpZighY2FsbEZyYW1lKXt0aGlzLl9jbGVhckV4ZWN1dGlvbkxpbmUoKTtyZXR1cm47fQpCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuY3JlYXRlQ2FsbEZyYW1lTGl2ZUxvY2F0aW9uKGNhbGxGcmFtZS5sb2NhdGlvbigpLHRoaXMuX2V4ZWN1dGlvbkxpbmVDaGFuZ2VkLmJpbmQodGhpcyksdGhpcy5fbGl2ZUxvY2F0aW9uUG9vbCk7fQpkaXNwb3NlKCl7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fYnJlYWtwb2ludERlY29yYXRpb25zKQpkZWNvcmF0aW9uLmRpc3Bvc2UoKTt0aGlzLl9icmVha3BvaW50RGVjb3JhdGlvbnMuY2xlYXIoKTtpZih0aGlzLl9zY2hlZHVsZWRCcmVha3BvaW50RGVjb3JhdGlvblVwZGF0ZXMpe2Zvcihjb25zdCBkZWNvcmF0aW9uIG9mIHRoaXMuX3NjaGVkdWxlZEJyZWFrcG9pbnREZWNvcmF0aW9uVXBkYXRlcykKZGVjb3JhdGlvbi5kaXNwb3NlKCk7dGhpcy5fc2NoZWR1bGVkQnJlYWtwb2ludERlY29yYXRpb25VcGRhdGVzLmNsZWFyKCk7fQp0aGlzLl9oaWRlQmxhY2tib3hJbmZvYmFyKCk7aWYodGhpcy5fc291cmNlTWFwSW5mb2JhcikKdGhpcy5fc291cmNlTWFwSW5mb2Jhci5kaXNwb3NlKCk7aWYodGhpcy5fcHJldHR5UHJpbnRJbmZvYmFyKQp0aGlzLl9wcmV0dHlQcmludEluZm9iYXIuZGlzcG9zZSgpO3RoaXMuX3NjcmlwdHNQYW5lbC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fYm91bmRQb3BvdmVySGVscGVySGlkZSx0cnVlKTtmb3IoY29uc3Qgc2NyaXB0IG9mIHRoaXMuX3NjcmlwdEZpbGVGb3JEZWJ1Z2dlck1vZGVsLnZhbHVlcygpKXtzY3JpcHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihCaW5kaW5ncy5SZXNvdXJjZVNjcmlwdEZpbGUuRXZlbnRzLkRpZE1lcmdlVG9WTSx0aGlzLl9kaWRNZXJnZVRvVk0sdGhpcyk7c2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoQmluZGluZ3MuUmVzb3VyY2VTY3JpcHRGaWxlLkV2ZW50cy5EaWREaXZlcmdlRnJvbVZNLHRoaXMuX2RpZERpdmVyZ2VGcm9tVk0sdGhpcyk7fQp0aGlzLl9zY3JpcHRGaWxlRm9yRGVidWdnZXJNb2RlbC5jbGVhcigpO3RoaXMuX3RleHRFZGl0b3IuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9ib3VuZEtleURvd24sdHJ1ZSk7dGhpcy5fdGV4dEVkaXRvci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJyx0aGlzLl9ib3VuZEtleVVwLHRydWUpO3RoaXMuX3RleHRFZGl0b3IuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX2JvdW5kTW91c2VNb3ZlLGZhbHNlKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9ib3VuZE1vdXNlRG93bix0cnVlKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLHRoaXMuX2JvdW5kQmx1cixmYWxzZSk7dGhpcy5fdGV4dEVkaXRvci5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJyx0aGlzLl9ib3VuZFdoZWVsLHRydWUpO3RoaXMuX3RleHRFZGl0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuR3V0dGVyQ2xpY2ssdGhpcy5faGFuZGxlR3V0dGVyQ2xpY2ssdGhpcyk7dGhpcy5fcG9wb3ZlckhlbHBlci5oaWRlUG9wb3ZlcigpO3RoaXMuX3BvcG92ZXJIZWxwZXIuZGlzcG9zZSgpO3RoaXMuX2JyZWFrcG9pbnRNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQmluZGluZ3MuQnJlYWtwb2ludE1hbmFnZXIuRXZlbnRzLkJyZWFrcG9pbnRBZGRlZCx0aGlzLl9icmVha3BvaW50QWRkZWQsdGhpcyk7dGhpcy5fYnJlYWtwb2ludE1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihCaW5kaW5ncy5CcmVha3BvaW50TWFuYWdlci5FdmVudHMuQnJlYWtwb2ludFJlbW92ZWQsdGhpcy5fYnJlYWtwb2ludFJlbW92ZWQsdGhpcyk7dGhpcy5fdWlTb3VyY2VDb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX3dvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTt0aGlzLl91aVNvdXJjZUNvZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl93b3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuX3Nob3dCbGFja2JveEluZm9iYXJJZk5lZWRlZCx0aGlzKTtDb21tb24ubW9kdWxlU2V0dGluZygnc2tpcENvbnRlbnRTY3JpcHRzJykucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5fc2hvd0JsYWNrYm94SW5mb2JhcklmTmVlZGVkLHRoaXMpO3N1cGVyLmRpc3Bvc2UoKTt0aGlzLl9jbGVhckV4ZWN1dGlvbkxpbmUoKTtVSS5jb250ZXh0LnJlbW92ZUZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSx0aGlzLl9jYWxsRnJhbWVDaGFuZ2VkLHRoaXMpO3RoaXMuX2xpdmVMb2NhdGlvblBvb2wuZGlzcG9zZUFsbCgpO319O1NvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb249Y2xhc3N7Y29uc3RydWN0b3IodGV4dEVkaXRvcixoYW5kbGUsY29uZGl0aW9uLGVuYWJsZWQsYnJlYWtwb2ludCl7dGhpcy5fdGV4dEVkaXRvcj10ZXh0RWRpdG9yO3RoaXMuaGFuZGxlPWhhbmRsZTt0aGlzLmNvbmRpdGlvbj1jb25kaXRpb247dGhpcy5lbmFibGVkPWVuYWJsZWQ7dGhpcy5icmVha3BvaW50PWJyZWFrcG9pbnQ7dGhpcy5lbGVtZW50PVVJLkljb24uY3JlYXRlKCdzbWFsbGljb24taW5saW5lLWJyZWFrcG9pbnQnKTt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnY20taW5saW5lLWJyZWFrcG9pbnQnLHRydWUpO3RoaXMuYm9va21hcms9bnVsbDt9CnN0YXRpYyBtb3N0U3BlY2lmaWNGaXJzdChkZWNvcmF0aW9uMSxkZWNvcmF0aW9uMil7aWYoZGVjb3JhdGlvbjEuZW5hYmxlZCE9PWRlY29yYXRpb24yLmVuYWJsZWQpCnJldHVybiBkZWNvcmF0aW9uMS5lbmFibGVkPy0xOjE7aWYoISFkZWNvcmF0aW9uMS5jb25kaXRpb24hPT0hIWRlY29yYXRpb24yLmNvbmRpdGlvbikKcmV0dXJuISFkZWNvcmF0aW9uMS5jb25kaXRpb24/LTE6MTtyZXR1cm4gMDt9CnVwZGF0ZSgpe2lmKCF0aGlzLmNvbmRpdGlvbikKdGhpcy5lbGVtZW50LnNldEljb25UeXBlKCdzbWFsbGljb24taW5saW5lLWJyZWFrcG9pbnQnKTtlbHNlCnRoaXMuZWxlbWVudC5zZXRJY29uVHlwZSgnc21hbGxpY29uLWlubGluZS1icmVha3BvaW50LWNvbmRpdGlvbmFsJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2NtLWlubGluZS1kaXNhYmxlZCcsIXRoaXMuZW5hYmxlZCk7fQpzaG93KCl7aWYodGhpcy5ib29rbWFyaykKcmV0dXJuO2NvbnN0IGVkaXRvckxvY2F0aW9uPXRoaXMuaGFuZGxlLnJlc29sdmUoKTtpZighZWRpdG9yTG9jYXRpb24pCnJldHVybjt0aGlzLmJvb2ttYXJrPXRoaXMuX3RleHRFZGl0b3IuYWRkQm9va21hcmsoZWRpdG9yTG9jYXRpb24ubGluZU51bWJlcixlZGl0b3JMb2NhdGlvbi5jb2x1bW5OdW1iZXIsdGhpcy5lbGVtZW50LFNvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb24uYm9va21hcmtTeW1ib2wpO3RoaXMuYm9va21hcmtbU291cmNlcy5EZWJ1Z2dlclBsdWdpbi5CcmVha3BvaW50RGVjb3JhdGlvbi5fZWxlbWVudFN5bWJvbEZvclRlc3RdPXRoaXMuZWxlbWVudDt9CmhpZGUoKXtpZighdGhpcy5ib29rbWFyaykKcmV0dXJuO3RoaXMuYm9va21hcmsuY2xlYXIoKTt0aGlzLmJvb2ttYXJrPW51bGw7fQpkaXNwb3NlKCl7Y29uc3QgbG9jYXRpb249dGhpcy5oYW5kbGUucmVzb2x2ZSgpO2lmKGxvY2F0aW9uKXt0aGlzLl90ZXh0RWRpdG9yLnRvZ2dsZUxpbmVDbGFzcyhsb2NhdGlvbi5saW5lTnVtYmVyLCdjbS1icmVha3BvaW50JyxmYWxzZSk7dGhpcy5fdGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MobG9jYXRpb24ubGluZU51bWJlciwnY20tYnJlYWtwb2ludC1kaXNhYmxlZCcsZmFsc2UpO3RoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGxvY2F0aW9uLmxpbmVOdW1iZXIsJ2NtLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwnLGZhbHNlKTt9CnRoaXMuaGlkZSgpO319O1NvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb24uYm9va21hcmtTeW1ib2w9U3ltYm9sKCdib29rbWFyaycpO1NvdXJjZXMuRGVidWdnZXJQbHVnaW4uQnJlYWtwb2ludERlY29yYXRpb24uX2VsZW1lbnRTeW1ib2xGb3JUZXN0PVN5bWJvbCgnZWxlbWVudCcpO1NvdXJjZXMuRGVidWdnZXJQbHVnaW4uY29udGludWVUb0xvY2F0aW9uRGVjb3JhdGlvblN5bWJvbD1TeW1ib2woJ2Jvb2ttYXJrJyk7O1NvdXJjZXMuQ1NTUGx1Z2luPWNsYXNzIGV4dGVuZHMgU291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5QbHVnaW57Y29uc3RydWN0b3IodGV4dEVkaXRvcil7c3VwZXIoKTt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlcj1uZXcgSW5saW5lRWRpdG9yLlN3YXRjaFBvcG92ZXJIZWxwZXIoKTt0aGlzLl9tdXRlU3dhdGNoUHJvY2Vzc2luZz1mYWxzZTt0aGlzLl9oYWRTd2F0Y2hDaGFuZ2U9ZmFsc2U7dGhpcy5fYmV6aWVyRWRpdG9yPW51bGw7dGhpcy5fZWRpdGVkU3dhdGNoVGV4dFJhbmdlPW51bGw7dGhpcy5fc3BlY3RydW09bnVsbDt0aGlzLl9jdXJyZW50U3dhdGNoPW51bGw7dGhpcy5fdGV4dEVkaXRvci5jb25maWd1cmVBdXRvY29tcGxldGUoe3N1Z2dlc3Rpb25zQ2FsbGJhY2s6dGhpcy5fY3NzU3VnZ2VzdGlvbnMuYmluZCh0aGlzKSxpc1dvcmRDaGFyOnRoaXMuX2lzV29yZENoYXIuYmluZCh0aGlzKX0pO3RoaXMuX3RleHRFZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuU2Nyb2xsQ2hhbmdlZCx0aGlzLl90ZXh0RWRpdG9yU2Nyb2xsZWQsdGhpcyk7dGhpcy5fdGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFVJLlRleHRFZGl0b3IuRXZlbnRzLlRleHRDaGFuZ2VkLHRoaXMuX29uVGV4dENoYW5nZWQsdGhpcyk7dGhpcy5fdXBkYXRlU3dhdGNoZXMoMCx0aGlzLl90ZXh0RWRpdG9yLmxpbmVzQ291bnQtMSk7dGhpcy5fc2hvcnRjdXRzPXt9O3RoaXMuX3JlZ2lzdGVyU2hvcnRjdXRzKCk7dGhpcy5fYm91bmRIYW5kbGVLZXlEb3duPXRoaXMuX2hhbmRsZUtleURvd24uYmluZCh0aGlzKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRIYW5kbGVLZXlEb3duLGZhbHNlKTt9CnN0YXRpYyBhY2NlcHRzKHVpU291cmNlQ29kZSl7cmV0dXJuIHVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzU3R5bGVTaGVldCgpO30KX3JlZ2lzdGVyU2hvcnRjdXRzKCl7Y29uc3Qgc2hvcnRjdXRLZXlzPVVJLlNob3J0Y3V0c1NjcmVlbi5Tb3VyY2VzUGFuZWxTaG9ydGN1dHM7Zm9yKGNvbnN0IGRlc2NyaXB0b3Igb2Ygc2hvcnRjdXRLZXlzLkluY3JlYXNlQ1NTVW5pdEJ5T25lKQp0aGlzLl9zaG9ydGN1dHNbZGVzY3JpcHRvci5rZXldPXRoaXMuX2hhbmRsZVVuaXRNb2RpZmljYXRpb24uYmluZCh0aGlzLDEpO2Zvcihjb25zdCBkZXNjcmlwdG9yIG9mIHNob3J0Y3V0S2V5cy5EZWNyZWFzZUNTU1VuaXRCeU9uZSkKdGhpcy5fc2hvcnRjdXRzW2Rlc2NyaXB0b3Iua2V5XT10aGlzLl9oYW5kbGVVbml0TW9kaWZpY2F0aW9uLmJpbmQodGhpcywtMSk7Zm9yKGNvbnN0IGRlc2NyaXB0b3Igb2Ygc2hvcnRjdXRLZXlzLkluY3JlYXNlQ1NTVW5pdEJ5VGVuKQp0aGlzLl9zaG9ydGN1dHNbZGVzY3JpcHRvci5rZXldPXRoaXMuX2hhbmRsZVVuaXRNb2RpZmljYXRpb24uYmluZCh0aGlzLDEwKTtmb3IoY29uc3QgZGVzY3JpcHRvciBvZiBzaG9ydGN1dEtleXMuRGVjcmVhc2VDU1NVbml0QnlUZW4pCnRoaXMuX3Nob3J0Y3V0c1tkZXNjcmlwdG9yLmtleV09dGhpcy5faGFuZGxlVW5pdE1vZGlmaWNhdGlvbi5iaW5kKHRoaXMsLTEwKTt9Cl9oYW5kbGVLZXlEb3duKGV2ZW50KXtjb25zdCBzaG9ydGN1dEtleT1VSS5LZXlib2FyZFNob3J0Y3V0Lm1ha2VLZXlGcm9tRXZlbnQoKGV2ZW50KSk7Y29uc3QgaGFuZGxlcj10aGlzLl9zaG9ydGN1dHNbc2hvcnRjdXRLZXldO2lmKGhhbmRsZXImJmhhbmRsZXIoKSkKZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl90ZXh0RWRpdG9yU2Nyb2xsZWQoKXtpZih0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLmlzU2hvd2luZygpKQp0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLmhpZGUodHJ1ZSk7fQpfbW9kaWZ5VW5pdCh1bml0LGNoYW5nZSl7Y29uc3QgdW5pdFZhbHVlPXBhcnNlSW50KHVuaXQsMTApO2lmKGlzTmFOKHVuaXRWYWx1ZSkpCnJldHVybiBudWxsO2NvbnN0IHRhaWw9dW5pdC5zdWJzdHJpbmcoKHVuaXRWYWx1ZSkudG9TdHJpbmcoKS5sZW5ndGgpO3JldHVybiBTdHJpbmcuc3ByaW50ZignJWQlcycsdW5pdFZhbHVlK2NoYW5nZSx0YWlsKTt9Cl9oYW5kbGVVbml0TW9kaWZpY2F0aW9uKGNoYW5nZSl7Y29uc3Qgc2VsZWN0aW9uPXRoaXMuX3RleHRFZGl0b3Iuc2VsZWN0aW9uKCkubm9ybWFsaXplKCk7bGV0IHRva2VuPXRoaXMuX3RleHRFZGl0b3IudG9rZW5BdFRleHRQb3NpdGlvbihzZWxlY3Rpb24uc3RhcnRMaW5lLHNlbGVjdGlvbi5zdGFydENvbHVtbik7aWYoIXRva2VuKXtpZihzZWxlY3Rpb24uc3RhcnRDb2x1bW4+MCkKdG9rZW49dGhpcy5fdGV4dEVkaXRvci50b2tlbkF0VGV4dFBvc2l0aW9uKHNlbGVjdGlvbi5zdGFydExpbmUsc2VsZWN0aW9uLnN0YXJ0Q29sdW1uLTEpO2lmKCF0b2tlbikKcmV0dXJuIGZhbHNlO30KaWYodG9rZW4udHlwZSE9PSdjc3MtbnVtYmVyJykKcmV0dXJuIGZhbHNlO2NvbnN0IGNzc1VuaXRSYW5nZT1uZXcgVGV4dFV0aWxzLlRleHRSYW5nZShzZWxlY3Rpb24uc3RhcnRMaW5lLHRva2VuLnN0YXJ0Q29sdW1uLHNlbGVjdGlvbi5zdGFydExpbmUsdG9rZW4uZW5kQ29sdW1uKTtjb25zdCBjc3NVbml0VGV4dD10aGlzLl90ZXh0RWRpdG9yLnRleHQoY3NzVW5pdFJhbmdlKTtjb25zdCBuZXdVbml0VGV4dD10aGlzLl9tb2RpZnlVbml0KGNzc1VuaXRUZXh0LGNoYW5nZSk7aWYoIW5ld1VuaXRUZXh0KQpyZXR1cm4gZmFsc2U7dGhpcy5fdGV4dEVkaXRvci5lZGl0UmFuZ2UoY3NzVW5pdFJhbmdlLG5ld1VuaXRUZXh0KTtzZWxlY3Rpb24uc3RhcnRDb2x1bW49dG9rZW4uc3RhcnRDb2x1bW47c2VsZWN0aW9uLmVuZENvbHVtbj1zZWxlY3Rpb24uc3RhcnRDb2x1bW4rbmV3VW5pdFRleHQubGVuZ3RoO3RoaXMuX3RleHRFZGl0b3Iuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7cmV0dXJuIHRydWU7fQpfdXBkYXRlU3dhdGNoZXMoc3RhcnRMaW5lLGVuZExpbmUpe2NvbnN0IHN3YXRjaGVzPVtdO2NvbnN0IHN3YXRjaFBvc2l0aW9ucz1bXTtjb25zdCByZWdleGVzPVtTREsuQ1NTTWV0YWRhdGEuVmFyaWFibGVSZWdleCxTREsuQ1NTTWV0YWRhdGEuVVJMUmVnZXgsVUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIuUmVnZXgsQ29tbW9uLkNvbG9yLlJlZ2V4XTtjb25zdCBoYW5kbGVycz1uZXcgTWFwKCk7aGFuZGxlcnMuc2V0KENvbW1vbi5Db2xvci5SZWdleCx0aGlzLl9jcmVhdGVDb2xvclN3YXRjaC5iaW5kKHRoaXMpKTtoYW5kbGVycy5zZXQoVUkuR2VvbWV0cnkuQ3ViaWNCZXppZXIuUmVnZXgsdGhpcy5fY3JlYXRlQmV6aWVyU3dhdGNoLmJpbmQodGhpcykpO2ZvcihsZXQgbGluZU51bWJlcj1zdGFydExpbmU7bGluZU51bWJlcjw9ZW5kTGluZTtsaW5lTnVtYmVyKyspe2NvbnN0IGxpbmU9dGhpcy5fdGV4dEVkaXRvci5saW5lKGxpbmVOdW1iZXIpLnN1YnN0cmluZygwLFNvdXJjZXMuQ1NTUGx1Z2luLm1heFN3YXRjaFByb2Nlc3NpbmdMZW5ndGgpO2NvbnN0IHJlc3VsdHM9VGV4dFV0aWxzLlRleHRVdGlscy5zcGxpdFN0cmluZ0J5UmVnZXhlcyhsaW5lLHJlZ2V4ZXMpO2ZvcihsZXQgaT0wO2k8cmVzdWx0cy5sZW5ndGg7aSsrKXtjb25zdCByZXN1bHQ9cmVzdWx0c1tpXTtpZihyZXN1bHQucmVnZXhJbmRleD09PS0xfHwhaGFuZGxlcnMuaGFzKHJlZ2V4ZXNbcmVzdWx0LnJlZ2V4SW5kZXhdKSkKY29udGludWU7Y29uc3QgZGVsaW1pdGVycz0vW1xzOjssKCl7fV0vO2NvbnN0IHBvc2l0aW9uQmVmb3JlPXJlc3VsdC5wb3NpdGlvbi0xO2NvbnN0IHBvc2l0aW9uQWZ0ZXI9cmVzdWx0LnBvc2l0aW9uK3Jlc3VsdC52YWx1ZS5sZW5ndGg7aWYocG9zaXRpb25CZWZvcmU+PTAmJiFkZWxpbWl0ZXJzLnRlc3QobGluZS5jaGFyQXQocG9zaXRpb25CZWZvcmUpKXx8cG9zaXRpb25BZnRlcjxsaW5lLmxlbmd0aCYmIWRlbGltaXRlcnMudGVzdChsaW5lLmNoYXJBdChwb3NpdGlvbkFmdGVyKSkpCmNvbnRpbnVlO2NvbnN0IHN3YXRjaD1oYW5kbGVycy5nZXQocmVnZXhlc1tyZXN1bHQucmVnZXhJbmRleF0pKHJlc3VsdC52YWx1ZSk7aWYoIXN3YXRjaCkKY29udGludWU7c3dhdGNoZXMucHVzaChzd2F0Y2gpO3N3YXRjaFBvc2l0aW9ucy5wdXNoKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmVOdW1iZXIscmVzdWx0LnBvc2l0aW9uKSk7fX0KdGhpcy5fdGV4dEVkaXRvci5vcGVyYXRpb24ocHV0U3dhdGNoZXNJbmxpbmUuYmluZCh0aGlzKSk7ZnVuY3Rpb24gcHV0U3dhdGNoZXNJbmxpbmUoKXtjb25zdCBjbGVhclJhbmdlPW5ldyBUZXh0VXRpbHMuVGV4dFJhbmdlKHN0YXJ0TGluZSwwLGVuZExpbmUsdGhpcy5fdGV4dEVkaXRvci5saW5lKGVuZExpbmUpLmxlbmd0aCk7dGhpcy5fdGV4dEVkaXRvci5ib29rbWFya3MoY2xlYXJSYW5nZSxTb3VyY2VzLkNTU1BsdWdpbi5Td2F0Y2hCb29rbWFyaykuZm9yRWFjaChtYXJrZXI9Pm1hcmtlci5jbGVhcigpKTtmb3IobGV0IGk9MDtpPHN3YXRjaGVzLmxlbmd0aDtpKyspe2NvbnN0IHN3YXRjaD1zd2F0Y2hlc1tpXTtjb25zdCBzd2F0Y2hQb3NpdGlvbj1zd2F0Y2hQb3NpdGlvbnNbaV07Y29uc3QgYm9va21hcms9dGhpcy5fdGV4dEVkaXRvci5hZGRCb29rbWFyayhzd2F0Y2hQb3NpdGlvbi5zdGFydExpbmUsc3dhdGNoUG9zaXRpb24uc3RhcnRDb2x1bW4sc3dhdGNoLFNvdXJjZXMuQ1NTUGx1Z2luLlN3YXRjaEJvb2ttYXJrKTtzd2F0Y2hbU291cmNlcy5DU1NQbHVnaW4uU3dhdGNoQm9va21hcmtdPWJvb2ttYXJrO319fQpfY3JlYXRlQ29sb3JTd2F0Y2godGV4dCl7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKHRleHQpO2lmKCFjb2xvcikKcmV0dXJuIG51bGw7Y29uc3Qgc3dhdGNoPUlubGluZUVkaXRvci5Db2xvclN3YXRjaC5jcmVhdGUoKTtzd2F0Y2guc2V0Q29sb3IoY29sb3IpO3N3YXRjaC5pY29uRWxlbWVudCgpLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnT3BlbiBjb2xvciBwaWNrZXIuJyk7c3dhdGNoLmljb25FbGVtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX3N3YXRjaEljb25DbGlja2VkLmJpbmQodGhpcyxzd2F0Y2gpLGZhbHNlKTtzd2F0Y2guaGlkZVRleHQodHJ1ZSk7cmV0dXJuIHN3YXRjaDt9Cl9jcmVhdGVCZXppZXJTd2F0Y2godGV4dCl7aWYoIVVJLkdlb21ldHJ5LkN1YmljQmV6aWVyLnBhcnNlKHRleHQpKQpyZXR1cm4gbnVsbDtjb25zdCBzd2F0Y2g9SW5saW5lRWRpdG9yLkJlemllclN3YXRjaC5jcmVhdGUoKTtzd2F0Y2guc2V0QmV6aWVyVGV4dCh0ZXh0KTtzd2F0Y2guaWNvbkVsZW1lbnQoKS50aXRsZT1Db21tb24uVUlTdHJpbmcoJ09wZW4gY3ViaWMgYmV6aWVyIGVkaXRvci4nKTtzd2F0Y2guaWNvbkVsZW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fc3dhdGNoSWNvbkNsaWNrZWQuYmluZCh0aGlzLHN3YXRjaCksZmFsc2UpO3N3YXRjaC5oaWRlVGV4dCh0cnVlKTtyZXR1cm4gc3dhdGNoO30KX3N3YXRjaEljb25DbGlja2VkKHN3YXRjaCxldmVudCl7ZXZlbnQuY29uc3VtZSh0cnVlKTt0aGlzLl9oYWRTd2F0Y2hDaGFuZ2U9ZmFsc2U7dGhpcy5fbXV0ZVN3YXRjaFByb2Nlc3Npbmc9dHJ1ZTtjb25zdCBzd2F0Y2hQb3NpdGlvbj1zd2F0Y2hbU291cmNlcy5DU1NQbHVnaW4uU3dhdGNoQm9va21hcmtdLnBvc2l0aW9uKCk7dGhpcy5fdGV4dEVkaXRvci5zZXRTZWxlY3Rpb24oc3dhdGNoUG9zaXRpb24pO3RoaXMuX2VkaXRlZFN3YXRjaFRleHRSYW5nZT1zd2F0Y2hQb3NpdGlvbi5jbG9uZSgpO3RoaXMuX2VkaXRlZFN3YXRjaFRleHRSYW5nZS5lbmRDb2x1bW4rPXN3YXRjaC50ZXh0Q29udGVudC5sZW5ndGg7dGhpcy5fY3VycmVudFN3YXRjaD1zd2F0Y2g7aWYoc3dhdGNoIGluc3RhbmNlb2YgSW5saW5lRWRpdG9yLkNvbG9yU3dhdGNoKQp0aGlzLl9zaG93U3BlY3RydW0oc3dhdGNoKTtlbHNlIGlmKHN3YXRjaCBpbnN0YW5jZW9mIElubGluZUVkaXRvci5CZXppZXJTd2F0Y2gpCnRoaXMuX3Nob3dCZXppZXJFZGl0b3Ioc3dhdGNoKTt9Cl9zaG93U3BlY3RydW0oc3dhdGNoKXtpZighdGhpcy5fc3BlY3RydW0pe3RoaXMuX3NwZWN0cnVtPW5ldyBDb2xvclBpY2tlci5TcGVjdHJ1bSgpO3RoaXMuX3NwZWN0cnVtLmFkZEV2ZW50TGlzdGVuZXIoQ29sb3JQaWNrZXIuU3BlY3RydW0uRXZlbnRzLlNpemVDaGFuZ2VkLHRoaXMuX3NwZWN0cnVtUmVzaXplZCx0aGlzKTt0aGlzLl9zcGVjdHJ1bS5hZGRFdmVudExpc3RlbmVyKENvbG9yUGlja2VyLlNwZWN0cnVtLkV2ZW50cy5Db2xvckNoYW5nZWQsdGhpcy5fc3BlY3RydW1DaGFuZ2VkLHRoaXMpO30KdGhpcy5fc3BlY3RydW0uc2V0Q29sb3Ioc3dhdGNoLmNvbG9yKCksc3dhdGNoLmZvcm1hdCgpKTt0aGlzLl9zd2F0Y2hQb3BvdmVySGVscGVyLnNob3codGhpcy5fc3BlY3RydW0sc3dhdGNoLmljb25FbGVtZW50KCksdGhpcy5fc3dhdGNoUG9wb3ZlckhpZGRlbi5iaW5kKHRoaXMpKTt9Cl9zcGVjdHJ1bVJlc2l6ZWQoZXZlbnQpe3RoaXMuX3N3YXRjaFBvcG92ZXJIZWxwZXIucmVwb3NpdGlvbigpO30KX3NwZWN0cnVtQ2hhbmdlZChldmVudCl7Y29uc3QgY29sb3JTdHJpbmc9KGV2ZW50LmRhdGEpO2NvbnN0IGNvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShjb2xvclN0cmluZyk7aWYoIWNvbG9yKQpyZXR1cm47dGhpcy5fY3VycmVudFN3YXRjaC5zZXRDb2xvcihjb2xvcik7dGhpcy5fY2hhbmdlU3dhdGNoVGV4dChjb2xvclN0cmluZyk7fQpfc2hvd0JlemllckVkaXRvcihzd2F0Y2gpe2lmKCF0aGlzLl9iZXppZXJFZGl0b3Ipe3RoaXMuX2JlemllckVkaXRvcj1uZXcgSW5saW5lRWRpdG9yLkJlemllckVkaXRvcigpO3RoaXMuX2JlemllckVkaXRvci5hZGRFdmVudExpc3RlbmVyKElubGluZUVkaXRvci5CZXppZXJFZGl0b3IuRXZlbnRzLkJlemllckNoYW5nZWQsdGhpcy5fYmV6aWVyQ2hhbmdlZCx0aGlzKTt9CmxldCBjdWJpY0Jlemllcj1VSS5HZW9tZXRyeS5DdWJpY0Jlemllci5wYXJzZShzd2F0Y2guYmV6aWVyVGV4dCgpKTtpZighY3ViaWNCZXppZXIpe2N1YmljQmV6aWVyPShVSS5HZW9tZXRyeS5DdWJpY0Jlemllci5wYXJzZSgnbGluZWFyJykpO30KdGhpcy5fYmV6aWVyRWRpdG9yLnNldEJlemllcihjdWJpY0Jlemllcik7dGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5zaG93KHRoaXMuX2JlemllckVkaXRvcixzd2F0Y2guaWNvbkVsZW1lbnQoKSx0aGlzLl9zd2F0Y2hQb3BvdmVySGlkZGVuLmJpbmQodGhpcykpO30KX2JlemllckNoYW5nZWQoZXZlbnQpe2NvbnN0IGJlemllclN0cmluZz0oZXZlbnQuZGF0YSk7dGhpcy5fY3VycmVudFN3YXRjaC5zZXRCZXppZXJUZXh0KGJlemllclN0cmluZyk7dGhpcy5fY2hhbmdlU3dhdGNoVGV4dChiZXppZXJTdHJpbmcpO30KX2NoYW5nZVN3YXRjaFRleHQodGV4dCl7dGhpcy5faGFkU3dhdGNoQ2hhbmdlPXRydWU7dGhpcy5fdGV4dEVkaXRvci5lZGl0UmFuZ2UoKHRoaXMuX2VkaXRlZFN3YXRjaFRleHRSYW5nZSksdGV4dCwnKnN3YXRjaC10ZXh0LWNoYW5nZWQnKTt0aGlzLl9lZGl0ZWRTd2F0Y2hUZXh0UmFuZ2UuZW5kQ29sdW1uPXRoaXMuX2VkaXRlZFN3YXRjaFRleHRSYW5nZS5zdGFydENvbHVtbit0ZXh0Lmxlbmd0aDt9Cl9zd2F0Y2hQb3BvdmVySGlkZGVuKGNvbW1pdEVkaXQpe3RoaXMuX211dGVTd2F0Y2hQcm9jZXNzaW5nPWZhbHNlO2lmKCFjb21taXRFZGl0JiZ0aGlzLl9oYWRTd2F0Y2hDaGFuZ2UpCnRoaXMuX3RleHRFZGl0b3IudW5kbygpO30KX29uVGV4dENoYW5nZWQoZXZlbnQpe2lmKCF0aGlzLl9tdXRlU3dhdGNoUHJvY2Vzc2luZykKdGhpcy5fdXBkYXRlU3dhdGNoZXMoZXZlbnQuZGF0YS5uZXdSYW5nZS5zdGFydExpbmUsZXZlbnQuZGF0YS5uZXdSYW5nZS5lbmRMaW5lKTt9Cl9pc1dvcmRDaGFyKGNoYXIpe3JldHVybiBUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIoY2hhcil8fGNoYXI9PT0nLid8fGNoYXI9PT0nLSd8fGNoYXI9PT0nJCc7fQpfY3NzU3VnZ2VzdGlvbnMocHJlZml4UmFuZ2Usc3Vic3RpdHV0ZVJhbmdlKXtjb25zdCBwcmVmaXg9dGhpcy5fdGV4dEVkaXRvci50ZXh0KHByZWZpeFJhbmdlKTtpZihwcmVmaXguc3RhcnRzV2l0aCgnJCcpKQpyZXR1cm4gbnVsbDtjb25zdCBwcm9wZXJ0eVRva2VuPXRoaXMuX2JhY2t0cmFja1Byb3BlcnR5VG9rZW4ocHJlZml4UmFuZ2Uuc3RhcnRMaW5lLHByZWZpeFJhbmdlLnN0YXJ0Q29sdW1uLTEpO2lmKCFwcm9wZXJ0eVRva2VuKQpyZXR1cm4gbnVsbDtjb25zdCBsaW5lPXRoaXMuX3RleHRFZGl0b3IubGluZShwcmVmaXhSYW5nZS5zdGFydExpbmUpO2NvbnN0IHRva2VuQ29udGVudD1saW5lLnN1YnN0cmluZyhwcm9wZXJ0eVRva2VuLnN0YXJ0Q29sdW1uLHByb3BlcnR5VG9rZW4uZW5kQ29sdW1uKTtjb25zdCBwcm9wZXJ0eVZhbHVlcz1TREsuY3NzTWV0YWRhdGEoKS5wcm9wZXJ0eVZhbHVlcyh0b2tlbkNvbnRlbnQpO3JldHVybiBQcm9taXNlLnJlc29sdmUocHJvcGVydHlWYWx1ZXMuZmlsdGVyKHZhbHVlPT52YWx1ZS5zdGFydHNXaXRoKHByZWZpeCkpLm1hcCh2YWx1ZT0+KHt0ZXh0OnZhbHVlfSkpKTt9Cl9iYWNrdHJhY2tQcm9wZXJ0eVRva2VuKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtjb25zdCBiYWNrdHJhY2tEZXB0aD0xMDtsZXQgdG9rZW5Qb3NpdGlvbj1jb2x1bW5OdW1iZXI7Y29uc3QgbGluZT10aGlzLl90ZXh0RWRpdG9yLmxpbmUobGluZU51bWJlcik7bGV0IHNlZW5Db2xvbj1mYWxzZTtmb3IobGV0IGk9MDtpPGJhY2t0cmFja0RlcHRoJiZ0b2tlblBvc2l0aW9uPj0wOysraSl7Y29uc3QgdG9rZW49dGhpcy5fdGV4dEVkaXRvci50b2tlbkF0VGV4dFBvc2l0aW9uKGxpbmVOdW1iZXIsdG9rZW5Qb3NpdGlvbik7aWYoIXRva2VuKQpyZXR1cm4gbnVsbDtpZih0b2tlbi50eXBlPT09J2Nzcy1wcm9wZXJ0eScpCnJldHVybiBzZWVuQ29sb24/dG9rZW46bnVsbDtpZih0b2tlbi50eXBlJiYhKHRva2VuLnR5cGUuaW5kZXhPZignd2hpdGVzcGFjZScpIT09LTF8fHRva2VuLnR5cGUuc3RhcnRzV2l0aCgnY3NzLWNvbW1lbnQnKSkpCnJldHVybiBudWxsO2lmKCF0b2tlbi50eXBlJiZsaW5lLnN1YnN0cmluZyh0b2tlbi5zdGFydENvbHVtbix0b2tlbi5lbmRDb2x1bW4pPT09JzonKXtpZighc2VlbkNvbG9uKQpzZWVuQ29sb249dHJ1ZTtlbHNlCnJldHVybiBudWxsO30KdG9rZW5Qb3NpdGlvbj10b2tlbi5zdGFydENvbHVtbi0xO30KcmV0dXJuIG51bGw7fQpkaXNwb3NlKCl7aWYodGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5pc1Nob3dpbmcoKSkKdGhpcy5fc3dhdGNoUG9wb3ZlckhlbHBlci5oaWRlKHRydWUpO3RoaXMuX3RleHRFZGl0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihTb3VyY2VGcmFtZS5Tb3VyY2VzVGV4dEVkaXRvci5FdmVudHMuU2Nyb2xsQ2hhbmdlZCx0aGlzLl90ZXh0RWRpdG9yU2Nyb2xsZWQsdGhpcyk7dGhpcy5fdGV4dEVkaXRvci5yZW1vdmVFdmVudExpc3RlbmVyKFVJLlRleHRFZGl0b3IuRXZlbnRzLlRleHRDaGFuZ2VkLHRoaXMuX29uVGV4dENoYW5nZWQsdGhpcyk7dGhpcy5fdGV4dEVkaXRvci5ib29rbWFya3ModGhpcy5fdGV4dEVkaXRvci5mdWxsUmFuZ2UoKSxTb3VyY2VzLkNTU1BsdWdpbi5Td2F0Y2hCb29rbWFyaykuZm9yRWFjaChtYXJrZXI9Pm1hcmtlci5jbGVhcigpKTt0aGlzLl90ZXh0RWRpdG9yLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fYm91bmRIYW5kbGVLZXlEb3duLGZhbHNlKTt9fTtTb3VyY2VzLkNTU1BsdWdpbi5tYXhTd2F0Y2hQcm9jZXNzaW5nTGVuZ3RoPTMwMDtTb3VyY2VzLkNTU1BsdWdpbi5Td2F0Y2hCb29rbWFyaz1TeW1ib2woJ3N3YXRjaCcpOztTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW49Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlBsdWdpbntjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLHVpU291cmNlQ29kZSl7c3VwZXIoKTt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLl9kZWNvcmF0aW9ucz1bXTt0aGlzLl90ZXh0RWRpdG9yLmluc3RhbGxHdXR0ZXIoU291cmNlcy5HdXR0ZXJEaWZmUGx1Z2luLkRpZmZHdXR0ZXJUeXBlLHRydWUpO3RoaXMuX3dvcmtzcGFjZURpZmY9V29ya3NwYWNlRGlmZi53b3Jrc3BhY2VEaWZmKCk7dGhpcy5fd29ya3NwYWNlRGlmZi5zdWJzY3JpYmVUb0RpZmZDaGFuZ2UodGhpcy5fdWlTb3VyY2VDb2RlLHRoaXMuX3VwZGF0ZSx0aGlzKTt0aGlzLl91cGRhdGUoKTt9CnN0YXRpYyBhY2NlcHRzKHVpU291cmNlQ29kZSl7cmV0dXJuIHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrO30KX3VwZGF0ZURlY29yYXRpb25zKHJlbW92ZWQsYWRkZWQpe3RoaXMuX3RleHRFZGl0b3Iub3BlcmF0aW9uKG9wZXJhdGlvbik7ZnVuY3Rpb24gb3BlcmF0aW9uKCl7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgcmVtb3ZlZCkKZGVjb3JhdGlvbi5yZW1vdmUoKTtmb3IoY29uc3QgZGVjb3JhdGlvbiBvZiBhZGRlZCkKZGVjb3JhdGlvbi5pbnN0YWxsKCk7fX0KX3VwZGF0ZSgpe2lmKHRoaXMuX3VpU291cmNlQ29kZSkKdGhpcy5fd29ya3NwYWNlRGlmZi5yZXF1ZXN0RGlmZih0aGlzLl91aVNvdXJjZUNvZGUpLnRoZW4odGhpcy5faW5uZXJVcGRhdGUuYmluZCh0aGlzKSk7ZWxzZQp0aGlzLl9pbm5lclVwZGF0ZShudWxsKTt9Cl9pbm5lclVwZGF0ZShsaW5lRGlmZil7aWYoIWxpbmVEaWZmKXt0aGlzLl91cGRhdGVEZWNvcmF0aW9ucyh0aGlzLl9kZWNvcmF0aW9ucyxbXSk7dGhpcy5fZGVjb3JhdGlvbnM9W107cmV0dXJuO30KY29uc3Qgb2xkRGVjb3JhdGlvbnM9bmV3IE1hcCgpO2ZvcihsZXQgaT0wO2k8dGhpcy5fZGVjb3JhdGlvbnMubGVuZ3RoOysraSl7Y29uc3QgZGVjb3JhdGlvbj10aGlzLl9kZWNvcmF0aW9uc1tpXTtjb25zdCBsaW5lTnVtYmVyPWRlY29yYXRpb24ubGluZU51bWJlcigpO2lmKGxpbmVOdW1iZXI9PT0tMSkKY29udGludWU7b2xkRGVjb3JhdGlvbnMuc2V0KGxpbmVOdW1iZXIsZGVjb3JhdGlvbik7fQpjb25zdCBkaWZmPVNvdXJjZUZyYW1lLlNvdXJjZUNvZGVEaWZmLmNvbXB1dGVEaWZmKGxpbmVEaWZmKTtjb25zdCBuZXdEZWNvcmF0aW9ucz1uZXcgTWFwKCk7Zm9yKGxldCBpPTA7aTxkaWZmLmxlbmd0aDsrK2kpe2NvbnN0IGRpZmZFbnRyeT1kaWZmW2ldO2ZvcihsZXQgbGluZU51bWJlcj1kaWZmRW50cnkuZnJvbTtsaW5lTnVtYmVyPGRpZmZFbnRyeS50bzsrK2xpbmVOdW1iZXIpCm5ld0RlY29yYXRpb25zLnNldChsaW5lTnVtYmVyLHtsaW5lTnVtYmVyOmxpbmVOdW1iZXIsdHlwZTpkaWZmRW50cnkudHlwZX0pO30KY29uc3QgZGVjb3JhdGlvbkRpZmY9b2xkRGVjb3JhdGlvbnMuZGlmZihuZXdEZWNvcmF0aW9ucywoZTEsZTIpPT5lMS50eXBlPT09ZTIudHlwZSk7Y29uc3QgYWRkZWREZWNvcmF0aW9ucz1kZWNvcmF0aW9uRGlmZi5hZGRlZC5tYXAoZW50cnk9Pm5ldyBTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW4uR3V0dGVyRGVjb3JhdGlvbih0aGlzLl90ZXh0RWRpdG9yLGVudHJ5LmxpbmVOdW1iZXIsZW50cnkudHlwZSkpO3RoaXMuX2RlY29yYXRpb25zPWRlY29yYXRpb25EaWZmLmVxdWFsLmNvbmNhdChhZGRlZERlY29yYXRpb25zKTt0aGlzLl91cGRhdGVEZWNvcmF0aW9ucyhkZWNvcmF0aW9uRGlmZi5yZW1vdmVkLGFkZGVkRGVjb3JhdGlvbnMpO3RoaXMuX2RlY29yYXRpb25zU2V0Rm9yVGVzdChuZXdEZWNvcmF0aW9ucyk7fQpfZGVjb3JhdGlvbnNTZXRGb3JUZXN0KGRlY29yYXRpb25zKXt9CmFzeW5jIHBvcHVsYXRlTGluZUd1dHRlckNvbnRleHRNZW51KGNvbnRleHRNZW51LGxpbmVOdW1iZXIpe1NvdXJjZXMuR3V0dGVyRGlmZlBsdWdpbi5fYXBwZW5kUmV2ZWFsRGlmZkNvbnRleHRNZW51KGNvbnRleHRNZW51LHRoaXMuX3VpU291cmNlQ29kZSk7fQphc3luYyBwb3B1bGF0ZVRleHRBcmVhQ29udGV4dE1lbnUoY29udGV4dE1lbnUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe1NvdXJjZXMuR3V0dGVyRGlmZlBsdWdpbi5fYXBwZW5kUmV2ZWFsRGlmZkNvbnRleHRNZW51KGNvbnRleHRNZW51LHRoaXMuX3VpU291cmNlQ29kZSk7fQpzdGF0aWMgX2FwcGVuZFJldmVhbERpZmZDb250ZXh0TWVudShjb250ZXh0TWVudSx1aVNvdXJjZUNvZGUpe2lmKCFXb3Jrc3BhY2VEaWZmLndvcmtzcGFjZURpZmYoKS5pc1VJU291cmNlQ29kZU1vZGlmaWVkKHVpU291cmNlQ29kZSkpCnJldHVybjtjb250ZXh0TWVudS5yZXZlYWxTZWN0aW9uKCkuYXBwZW5kSXRlbShsc2BMb2NhbCBNb2RpZmljYXRpb25zLi4uYCwoKT0+e0NvbW1vbi5SZXZlYWxlci5yZXZlYWwobmV3IFdvcmtzcGFjZURpZmYuRGlmZlVJTG9jYXRpb24odWlTb3VyY2VDb2RlKSk7fSk7fQpkaXNwb3NlKCl7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fZGVjb3JhdGlvbnMpCmRlY29yYXRpb24ucmVtb3ZlKCk7V29ya3NwYWNlRGlmZi53b3Jrc3BhY2VEaWZmKCkudW5zdWJzY3JpYmVGcm9tRGlmZkNoYW5nZSh0aGlzLl91aVNvdXJjZUNvZGUsdGhpcy5fdXBkYXRlLHRoaXMpO319O1NvdXJjZXMuR3V0dGVyRGlmZlBsdWdpbi5HdXR0ZXJEZWNvcmF0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHRleHRFZGl0b3IsbGluZU51bWJlcix0eXBlKXt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fcG9zaXRpb249dGhpcy5fdGV4dEVkaXRvci50ZXh0RWRpdG9yUG9zaXRpb25IYW5kbGUobGluZU51bWJlciwwKTt0aGlzLl9jbGFzc05hbWU9Jyc7aWYodHlwZT09PVNvdXJjZUZyYW1lLlNvdXJjZUNvZGVEaWZmLkVkaXRUeXBlLkluc2VydCkKdGhpcy5fY2xhc3NOYW1lPSdkaWZmLWVudHJ5LWluc2VydCc7ZWxzZSBpZih0eXBlPT09U291cmNlRnJhbWUuU291cmNlQ29kZURpZmYuRWRpdFR5cGUuRGVsZXRlKQp0aGlzLl9jbGFzc05hbWU9J2RpZmYtZW50cnktZGVsZXRlJztlbHNlIGlmKHR5cGU9PT1Tb3VyY2VGcmFtZS5Tb3VyY2VDb2RlRGlmZi5FZGl0VHlwZS5Nb2RpZnkpCnRoaXMuX2NsYXNzTmFtZT0nZGlmZi1lbnRyeS1tb2RpZnknO3RoaXMudHlwZT10eXBlO30KbGluZU51bWJlcigpe2NvbnN0IGxvY2F0aW9uPXRoaXMuX3Bvc2l0aW9uLnJlc29sdmUoKTtpZighbG9jYXRpb24pCnJldHVybi0xO3JldHVybiBsb2NhdGlvbi5saW5lTnVtYmVyO30KaW5zdGFsbCgpe2NvbnN0IGxvY2F0aW9uPXRoaXMuX3Bvc2l0aW9uLnJlc29sdmUoKTtpZighbG9jYXRpb24pCnJldHVybjtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2RpZmYtbWFya2VyJyk7ZWxlbWVudC50ZXh0Q29udGVudD0nXHUwMEEwJzt0aGlzLl90ZXh0RWRpdG9yLnNldEd1dHRlckRlY29yYXRpb24obG9jYXRpb24ubGluZU51bWJlcixTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW4uRGlmZkd1dHRlclR5cGUsZWxlbWVudCk7dGhpcy5fdGV4dEVkaXRvci50b2dnbGVMaW5lQ2xhc3MobG9jYXRpb24ubGluZU51bWJlcix0aGlzLl9jbGFzc05hbWUsdHJ1ZSk7fQpyZW1vdmUoKXtjb25zdCBsb2NhdGlvbj10aGlzLl9wb3NpdGlvbi5yZXNvbHZlKCk7aWYoIWxvY2F0aW9uKQpyZXR1cm47dGhpcy5fdGV4dEVkaXRvci5zZXRHdXR0ZXJEZWNvcmF0aW9uKGxvY2F0aW9uLmxpbmVOdW1iZXIsU291cmNlcy5HdXR0ZXJEaWZmUGx1Z2luLkRpZmZHdXR0ZXJUeXBlLG51bGwpO3RoaXMuX3RleHRFZGl0b3IudG9nZ2xlTGluZUNsYXNzKGxvY2F0aW9uLmxpbmVOdW1iZXIsdGhpcy5fY2xhc3NOYW1lLGZhbHNlKTt9fTtTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW4uRGlmZkd1dHRlclR5cGU9J0NvZGVNaXJyb3ItZ3V0dGVyLWRpZmYnO1NvdXJjZXMuR3V0dGVyRGlmZlBsdWdpbi5Db250ZXh0TWVudVByb3ZpZGVyPWNsYXNze2FwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpe2xldCB1aVNvdXJjZUNvZGU9KHRhcmdldCk7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7aWYoYmluZGluZykKdWlTb3VyY2VDb2RlPWJpbmRpbmcubmV0d29yaztTb3VyY2VzLkd1dHRlckRpZmZQbHVnaW4uX2FwcGVuZFJldmVhbERpZmZDb250ZXh0TWVudShjb250ZXh0TWVudSx1aVNvdXJjZUNvZGUpO319OztTb3VyY2VzLlNlYXJjaFNvdXJjZXNWaWV3PWNsYXNzIGV4dGVuZHMgU2VhcmNoLlNlYXJjaFZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcignc291cmNlcycpO30Kc3RhdGljIGFzeW5jIG9wZW5TZWFyY2gocXVlcnksc2VhcmNoSW1tZWRpYXRlbHkpe2NvbnN0IHZpZXc9VUkudmlld01hbmFnZXIudmlldygnc291cmNlcy5zZWFyY2gtc291cmNlcy10YWInKTtjb25zdCBsb2NhdGlvbj1hd2FpdCBVSS52aWV3TWFuYWdlci5yZXNvbHZlTG9jYXRpb24oJ2RyYXdlci12aWV3Jyk7bG9jYXRpb24uYXBwZW5kVmlldyh2aWV3KTthd2FpdCBVSS52aWV3TWFuYWdlci5yZXZlYWxWaWV3KCh2aWV3KSk7Y29uc3Qgd2lkZ2V0PShhd2FpdCB2aWV3LndpZGdldCgpKTt3aWRnZXQudG9nZ2xlKHF1ZXJ5LCEhc2VhcmNoSW1tZWRpYXRlbHkpO3JldHVybiB3aWRnZXQ7fQpjcmVhdGVTY29wZSgpe3JldHVybiBuZXcgU291cmNlcy5Tb3VyY2VzU2VhcmNoU2NvcGUoKTt9fTtTb3VyY2VzLlNlYXJjaFNvdXJjZXNWaWV3LkFjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXt0aGlzLl9zaG93U2VhcmNoKCk7cmV0dXJuIHRydWU7fQpfc2hvd1NlYXJjaCgpe2NvbnN0IHNlbGVjdGlvbj1VSS5pbnNwZWN0b3JWaWV3LmVsZW1lbnQud2luZG93KCkuZ2V0U2VsZWN0aW9uKCk7bGV0IHF1ZXJ5Q2FuZGlkYXRlPScnO2lmKHNlbGVjdGlvbi5yYW5nZUNvdW50KQpxdWVyeUNhbmRpZGF0ZT1zZWxlY3Rpb24udG9TdHJpbmcoKS5yZXBsYWNlKC9ccj9cbi4qLywnJyk7cmV0dXJuIFNvdXJjZXMuU2VhcmNoU291cmNlc1ZpZXcub3BlblNlYXJjaChxdWVyeUNhbmRpZGF0ZSk7fX07O1NvdXJjZXMuTmF2aWdhdG9yVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZXMvbmF2aWdhdG9yVmlldy5jc3MnKTt0aGlzLl9zY3JpcHRzVHJlZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RoaXMuX3NjcmlwdHNUcmVlLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZXMvbmF2aWdhdG9yVHJlZS5jc3MnKTt0aGlzLl9zY3JpcHRzVHJlZS5zZXRDb21wYXJhdG9yKFNvdXJjZXMuTmF2aWdhdG9yVmlldy5fdHJlZUVsZW1lbnRzQ29tcGFyZSk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zY3JpcHRzVHJlZS5lbGVtZW50KTt0aGlzLnNldERlZmF1bHRGb2N1c2VkRWxlbWVudCh0aGlzLl9zY3JpcHRzVHJlZS5lbGVtZW50KTt0aGlzLl91aVNvdXJjZUNvZGVOb2Rlcz1uZXcgTXVsdGltYXAoKTt0aGlzLl9zdWJmb2xkZXJOb2Rlcz1uZXcgTWFwKCk7dGhpcy5fcm9vdE5vZGU9bmV3IFNvdXJjZXMuTmF2aWdhdG9yUm9vdFRyZWVOb2RlKHRoaXMpO3RoaXMuX3Jvb3ROb2RlLnBvcHVsYXRlKCk7dGhpcy5fZnJhbWVOb2Rlcz1uZXcgTWFwKCk7dGhpcy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5oYW5kbGVDb250ZXh0TWVudS5iaW5kKHRoaXMpLGZhbHNlKTtVSS5zaG9ydGN1dFJlZ2lzdHJ5LmFkZFNob3J0Y3V0TGlzdGVuZXIodGhpcy5jb250ZW50RWxlbWVudCwnc291cmNlcy5yZW5hbWUnLHRoaXMuX3JlbmFtZVNob3J0Y3V0LmJpbmQodGhpcyksdHJ1ZSk7dGhpcy5fbmF2aWdhdG9yR3JvdXBCeUZvbGRlclNldHRpbmc9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ25hdmlnYXRvckdyb3VwQnlGb2xkZXInKTt0aGlzLl9uYXZpZ2F0b3JHcm91cEJ5Rm9sZGVyU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9ncm91cGluZ0NoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5faW5pdEdyb3VwaW5nKCk7UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYWRkRXZlbnRMaXN0ZW5lcihQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5FdmVudHMuQmluZGluZ0NyZWF0ZWQsdGhpcy5fb25CaW5kaW5nQ2hhbmdlZCx0aGlzKTtQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5hZGRFdmVudExpc3RlbmVyKFBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLkV2ZW50cy5CaW5kaW5nUmVtb3ZlZCx0aGlzLl9vbkJpbmRpbmdDaGFuZ2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoU0RLLlRhcmdldE1hbmFnZXIuRXZlbnRzLk5hbWVDaGFuZ2VkLHRoaXMuX3RhcmdldE5hbWVDaGFuZ2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVUYXJnZXRzKHRoaXMpO3RoaXMuX3Jlc2V0V29ya3NwYWNlKFdvcmtzcGFjZS53b3Jrc3BhY2UpO3RoaXMuX3dvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9hZGRVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7QmluZGluZ3MubmV0d29ya1Byb2plY3RNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoQmluZGluZ3MuTmV0d29ya1Byb2plY3RNYW5hZ2VyLkV2ZW50cy5GcmFtZUF0dHJpYnV0aW9uQWRkZWQsdGhpcy5fZnJhbWVBdHRyaWJ1dGlvbkFkZGVkLHRoaXMpO0JpbmRpbmdzLm5ldHdvcmtQcm9qZWN0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKEJpbmRpbmdzLk5ldHdvcmtQcm9qZWN0TWFuYWdlci5FdmVudHMuRnJhbWVBdHRyaWJ1dGlvblJlbW92ZWQsdGhpcy5fZnJhbWVBdHRyaWJ1dGlvblJlbW92ZWQsdGhpcyk7fQpzdGF0aWMgX3RyZWVFbGVtZW50T3JkZXIodHJlZUVsZW1lbnQpe2lmKHRyZWVFbGVtZW50Ll9ib29zdE9yZGVyKQpyZXR1cm4gMDtpZighU291cmNlcy5OYXZpZ2F0b3JWaWV3Ll90eXBlT3JkZXJzKXtjb25zdCB3ZWlnaHRzPXt9O2NvbnN0IHR5cGVzPVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlczt3ZWlnaHRzW3R5cGVzLlJvb3RdPTE7d2VpZ2h0c1t0eXBlcy5Eb21haW5dPTEwO3dlaWdodHNbdHlwZXMuRmlsZVN5c3RlbUZvbGRlcl09MTt3ZWlnaHRzW3R5cGVzLk5ldHdvcmtGb2xkZXJdPTE7d2VpZ2h0c1t0eXBlcy5Tb3VyY2VNYXBGb2xkZXJdPTI7d2VpZ2h0c1t0eXBlcy5GaWxlXT0xMDt3ZWlnaHRzW3R5cGVzLkZyYW1lXT03MDt3ZWlnaHRzW3R5cGVzLldvcmtlcl09OTA7d2VpZ2h0c1t0eXBlcy5GaWxlU3lzdGVtXT0xMDA7U291cmNlcy5OYXZpZ2F0b3JWaWV3Ll90eXBlT3JkZXJzPXdlaWdodHM7fQpsZXQgb3JkZXI9U291cmNlcy5OYXZpZ2F0b3JWaWV3Ll90eXBlT3JkZXJzW3RyZWVFbGVtZW50Ll9ub2RlVHlwZV07aWYodHJlZUVsZW1lbnQuX3VpU291cmNlQ29kZSl7Y29uc3QgY29udGVudFR5cGU9dHJlZUVsZW1lbnQuX3VpU291cmNlQ29kZS5jb250ZW50VHlwZSgpO2lmKGNvbnRlbnRUeXBlLmlzRG9jdW1lbnQoKSkKb3JkZXIrPTM7ZWxzZSBpZihjb250ZW50VHlwZS5pc1NjcmlwdCgpKQpvcmRlcis9NTtlbHNlIGlmKGNvbnRlbnRUeXBlLmlzU3R5bGVTaGVldCgpKQpvcmRlcis9MTA7ZWxzZQpvcmRlcis9MTU7fQpyZXR1cm4gb3JkZXI7fQpzdGF0aWMgYXBwZW5kQWRkRm9sZGVySXRlbShjb250ZXh0TWVudSl7ZnVuY3Rpb24gYWRkRm9sZGVyKCl7UGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5hZGRGaWxlU3lzdGVtKCk7fQpjb25zdCBhZGRGb2xkZXJMYWJlbD1Db21tb24uVUlTdHJpbmcoJ0FkZCBmb2xkZXIgdG8gd29ya3NwYWNlJyk7Y29udGV4dE1lbnUuZGVmYXVsdFNlY3Rpb24oKS5hcHBlbmRJdGVtKGFkZEZvbGRlckxhYmVsLGFkZEZvbGRlcik7fQpzdGF0aWMgYXBwZW5kU2VhcmNoSXRlbShjb250ZXh0TWVudSxwYXRoKXtmdW5jdGlvbiBzZWFyY2hQYXRoKCl7U291cmNlcy5TZWFyY2hTb3VyY2VzVmlldy5vcGVuU2VhcmNoKGBmaWxlOiR7cGF0aC50cmltKCl9YCk7fQpsZXQgc2VhcmNoTGFiZWw9Q29tbW9uLlVJU3RyaW5nKCdTZWFyY2ggaW4gZm9sZGVyJyk7aWYoIXBhdGh8fCFwYXRoLnRyaW0oKSl7cGF0aD0nKic7c2VhcmNoTGFiZWw9Q29tbW9uLlVJU3RyaW5nKCdTZWFyY2ggaW4gYWxsIGZpbGVzJyk7fQpjb250ZXh0TWVudS52aWV3U2VjdGlvbigpLmFwcGVuZEl0ZW0oc2VhcmNoTGFiZWwsc2VhcmNoUGF0aCk7fQpzdGF0aWMgX3RyZWVFbGVtZW50c0NvbXBhcmUodHJlZUVsZW1lbnQxLHRyZWVFbGVtZW50Mil7Y29uc3QgdHlwZVdlaWdodDE9U291cmNlcy5OYXZpZ2F0b3JWaWV3Ll90cmVlRWxlbWVudE9yZGVyKHRyZWVFbGVtZW50MSk7Y29uc3QgdHlwZVdlaWdodDI9U291cmNlcy5OYXZpZ2F0b3JWaWV3Ll90cmVlRWxlbWVudE9yZGVyKHRyZWVFbGVtZW50Mik7aWYodHlwZVdlaWdodDE+dHlwZVdlaWdodDIpCnJldHVybiAxO2lmKHR5cGVXZWlnaHQxPHR5cGVXZWlnaHQyKQpyZXR1cm4tMTtyZXR1cm4gdHJlZUVsZW1lbnQxLnRpdGxlQXNUZXh0KCkuY29tcGFyZVRvKHRyZWVFbGVtZW50Mi50aXRsZUFzVGV4dCgpKTt9Cl9vbkJpbmRpbmdDaGFuZ2VkKGV2ZW50KXtjb25zdCBiaW5kaW5nPShldmVudC5kYXRhKTtjb25zdCBuZXR3b3JrTm9kZXM9dGhpcy5fdWlTb3VyY2VDb2RlTm9kZXMuZ2V0KGJpbmRpbmcubmV0d29yayk7Zm9yKGNvbnN0IG5ldHdvcmtOb2RlIG9mIG5ldHdvcmtOb2RlcykKbmV0d29ya05vZGUudXBkYXRlVGl0bGUoKTtjb25zdCBmaWxlU3lzdGVtTm9kZXM9dGhpcy5fdWlTb3VyY2VDb2RlTm9kZXMuZ2V0KGJpbmRpbmcuZmlsZVN5c3RlbSk7Zm9yKGNvbnN0IGZpbGVTeXN0ZW1Ob2RlIG9mIGZpbGVTeXN0ZW1Ob2RlcykKZmlsZVN5c3RlbU5vZGUudXBkYXRlVGl0bGUoKTtjb25zdCBwYXRoVG9rZW5zPVBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLnJlbGF0aXZlUGF0aChiaW5kaW5nLmZpbGVTeXN0ZW0pO2xldCBmb2xkZXJQYXRoPScnO2ZvcihsZXQgaT0wO2k8cGF0aFRva2Vucy5sZW5ndGgtMTsrK2kpe2ZvbGRlclBhdGgrPXBhdGhUb2tlbnNbaV07Y29uc3QgZm9sZGVySWQ9dGhpcy5fZm9sZGVyTm9kZUlkKGJpbmRpbmcuZmlsZVN5c3RlbS5wcm9qZWN0KCksbnVsbCxudWxsLGJpbmRpbmcuZmlsZVN5c3RlbS5vcmlnaW4oKSxmb2xkZXJQYXRoKTtjb25zdCBmb2xkZXJOb2RlPXRoaXMuX3N1YmZvbGRlck5vZGVzLmdldChmb2xkZXJJZCk7aWYoZm9sZGVyTm9kZSkKZm9sZGVyTm9kZS51cGRhdGVUaXRsZSgpO2ZvbGRlclBhdGgrPScvJzt9CmNvbnN0IGZpbGVTeXN0ZW1Sb290PXRoaXMuX3Jvb3ROb2RlLmNoaWxkKGJpbmRpbmcuZmlsZVN5c3RlbS5wcm9qZWN0KCkuaWQoKSk7aWYoZmlsZVN5c3RlbVJvb3QpCmZpbGVTeXN0ZW1Sb290LnVwZGF0ZVRpdGxlKCk7fQpmb2N1cygpe3RoaXMuX3NjcmlwdHNUcmVlLmZvY3VzKCk7fQpfcmVzZXRXb3Jrc3BhY2Uod29ya3NwYWNlKXt0aGlzLl93b3Jrc3BhY2U9d29ya3NwYWNlO3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZUFkZGVkLHRoaXMuX3VpU291cmNlQ29kZUFkZGVkLHRoaXMpO3RoaXMuX3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZVJlbW92ZWQsdGhpcy5fdWlTb3VyY2VDb2RlUmVtb3ZlZCx0aGlzKTt0aGlzLl93b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5Qcm9qZWN0QWRkZWQsZXZlbnQ9Pntjb25zdCBwcm9qZWN0PShldmVudC5kYXRhKTt0aGlzLl9wcm9qZWN0QWRkZWQocHJvamVjdCk7aWYocHJvamVjdC50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pCnRoaXMuX2NvbXB1dGVVbmlxdWVGaWxlU3lzdGVtUHJvamVjdE5hbWVzKCk7fSk7dGhpcy5fd29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdFJlbW92ZWQsZXZlbnQ9Pntjb25zdCBwcm9qZWN0PShldmVudC5kYXRhKTt0aGlzLl9yZW1vdmVQcm9qZWN0KHByb2plY3QpO2lmKHByb2plY3QudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQp0aGlzLl9jb21wdXRlVW5pcXVlRmlsZVN5c3RlbVByb2plY3ROYW1lcygpO30pO3RoaXMuX3dvcmtzcGFjZS5wcm9qZWN0cygpLmZvckVhY2godGhpcy5fcHJvamVjdEFkZGVkLmJpbmQodGhpcykpO3RoaXMuX2NvbXB1dGVVbmlxdWVGaWxlU3lzdGVtUHJvamVjdE5hbWVzKCk7fQp3b3Jrc3BhY2UoKXtyZXR1cm4gdGhpcy5fd29ya3NwYWNlO30KYWNjZXB0UHJvamVjdChwcm9qZWN0KXtyZXR1cm4hcHJvamVjdC5pc1NlcnZpY2VQcm9qZWN0KCk7fQpfZnJhbWVBdHRyaWJ1dGlvbkFkZGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKTtpZighdGhpcy5fYWNjZXB0c1VJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpKQpyZXR1cm47Y29uc3QgYWRkZWRGcmFtZT0oZXZlbnQuZGF0YS5mcmFtZSk7dGhpcy5fYWRkVUlTb3VyY2VDb2RlTm9kZSh1aVNvdXJjZUNvZGUsYWRkZWRGcmFtZSk7fQpfZnJhbWVBdHRyaWJ1dGlvblJlbW92ZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO2lmKCF0aGlzLl9hY2NlcHRzVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSkpCnJldHVybjtjb25zdCByZW1vdmVkRnJhbWU9KGV2ZW50LmRhdGEuZnJhbWUpO2NvbnN0IG5vZGU9QXJyYXkuZnJvbSh0aGlzLl91aVNvdXJjZUNvZGVOb2Rlcy5nZXQodWlTb3VyY2VDb2RlKSkuZmluZChub2RlPT5ub2RlLmZyYW1lKCk9PT1yZW1vdmVkRnJhbWUpO3RoaXMuX3JlbW92ZVVJU291cmNlQ29kZU5vZGUobm9kZSk7fQpfYWNjZXB0c1VJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLmFjY2VwdFByb2plY3QodWlTb3VyY2VDb2RlLnByb2plY3QoKSk7fQpfYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7aWYoIXRoaXMuX2FjY2VwdHNVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKSkKcmV0dXJuO2NvbnN0IGZyYW1lcz1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC5mcmFtZXNGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtpZihmcmFtZXMubGVuZ3RoKXtmb3IoY29uc3QgZnJhbWUgb2YgZnJhbWVzKQp0aGlzLl9hZGRVSVNvdXJjZUNvZGVOb2RlKHVpU291cmNlQ29kZSxmcmFtZSk7fWVsc2V7dGhpcy5fYWRkVUlTb3VyY2VDb2RlTm9kZSh1aVNvdXJjZUNvZGUsbnVsbCk7fQp0aGlzLnVpU291cmNlQ29kZUFkZGVkKHVpU291cmNlQ29kZSk7fQpfYWRkVUlTb3VyY2VDb2RlTm9kZSh1aVNvdXJjZUNvZGUsZnJhbWUpe2NvbnN0IGlzRnJvbVNvdXJjZU1hcD11aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5pc0Zyb21Tb3VyY2VNYXAoKTtsZXQgcGF0aDtpZih1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSkKcGF0aD1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5yZWxhdGl2ZVBhdGgodWlTb3VyY2VDb2RlKS5zbGljZSgwLC0xKTtlbHNlCnBhdGg9Q29tbW9uLlBhcnNlZFVSTC5leHRyYWN0UGF0aCh1aVNvdXJjZUNvZGUudXJsKCkpLnNwbGl0KCcvJykuc2xpY2UoMSwtMSk7Y29uc3QgcHJvamVjdD11aVNvdXJjZUNvZGUucHJvamVjdCgpO2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtjb25zdCBmb2xkZXJOb2RlPXRoaXMuX2ZvbGRlck5vZGUodWlTb3VyY2VDb2RlLHByb2plY3QsdGFyZ2V0LGZyYW1lLHVpU291cmNlQ29kZS5vcmlnaW4oKSxwYXRoLGlzRnJvbVNvdXJjZU1hcCk7Y29uc3QgdWlTb3VyY2VDb2RlTm9kZT1uZXcgU291cmNlcy5OYXZpZ2F0b3JVSVNvdXJjZUNvZGVUcmVlTm9kZSh0aGlzLHVpU291cmNlQ29kZSxmcmFtZSk7Zm9sZGVyTm9kZS5hcHBlbmRDaGlsZCh1aVNvdXJjZUNvZGVOb2RlKTt0aGlzLl91aVNvdXJjZUNvZGVOb2Rlcy5zZXQodWlTb3VyY2VDb2RlLHVpU291cmNlQ29kZU5vZGUpO30KdWlTb3VyY2VDb2RlQWRkZWQodWlTb3VyY2VDb2RlKXt9Cl91aVNvdXJjZUNvZGVBZGRlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTt0aGlzLl9hZGRVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTt9Cl91aVNvdXJjZUNvZGVSZW1vdmVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO30KdHJ5QWRkUHJvamVjdChwcm9qZWN0KXt0aGlzLl9wcm9qZWN0QWRkZWQocHJvamVjdCk7cHJvamVjdC51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9hZGRVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7fQpfcHJvamVjdEFkZGVkKHByb2plY3Qpe2lmKCF0aGlzLmFjY2VwdFByb2plY3QocHJvamVjdCl8fHByb2plY3QudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtfHx0aGlzLl9yb290Tm9kZS5jaGlsZChwcm9qZWN0LmlkKCkpKQpyZXR1cm47dGhpcy5fcm9vdE5vZGUuYXBwZW5kQ2hpbGQobmV3IFNvdXJjZXMuTmF2aWdhdG9yR3JvdXBUcmVlTm9kZSh0aGlzLHByb2plY3QscHJvamVjdC5pZCgpLFNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5GaWxlU3lzdGVtLHByb2plY3QuZGlzcGxheU5hbWUoKSkpO30KX2NvbXB1dGVVbmlxdWVGaWxlU3lzdGVtUHJvamVjdE5hbWVzKCl7Y29uc3QgZmlsZVN5c3RlbVByb2plY3RzPXRoaXMuX3dvcmtzcGFjZS5wcm9qZWN0c0ZvclR5cGUoV29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKTtpZighZmlsZVN5c3RlbVByb2plY3RzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGVuY29kZXI9bmV3IFBlcnNpc3RlbmNlLlBhdGhFbmNvZGVyKCk7Y29uc3QgcmV2ZXJzZWRQYXRocz1maWxlU3lzdGVtUHJvamVjdHMubWFwKHByb2plY3Q9Pntjb25zdCBmaWxlU3lzdGVtPShwcm9qZWN0KTtyZXR1cm4gZW5jb2Rlci5lbmNvZGUoZmlsZVN5c3RlbS5maWxlU3lzdGVtUGF0aCgpKS5yZXZlcnNlKCk7fSk7Y29uc3QgcmV2ZXJzZWRJbmRleD1uZXcgQ29tbW9uLlRyaWUoKTtmb3IoY29uc3QgcmV2ZXJzZWRQYXRoIG9mIHJldmVyc2VkUGF0aHMpCnJldmVyc2VkSW5kZXguYWRkKHJldmVyc2VkUGF0aCk7Zm9yKGxldCBpPTA7aTxmaWxlU3lzdGVtUHJvamVjdHMubGVuZ3RoOysraSl7Y29uc3QgcmV2ZXJzZWRQYXRoPXJldmVyc2VkUGF0aHNbaV07Y29uc3QgcHJvamVjdD1maWxlU3lzdGVtUHJvamVjdHNbaV07cmV2ZXJzZWRJbmRleC5yZW1vdmUocmV2ZXJzZWRQYXRoKTtjb25zdCBjb21tb25QcmVmaXg9cmV2ZXJzZWRJbmRleC5sb25nZXN0UHJlZml4KHJldmVyc2VkUGF0aCxmYWxzZSk7cmV2ZXJzZWRJbmRleC5hZGQocmV2ZXJzZWRQYXRoKTtjb25zdCBwYXRoPWVuY29kZXIuZGVjb2RlKHJldmVyc2VkUGF0aC5zdWJzdHJpbmcoMCxjb21tb25QcmVmaXgubGVuZ3RoKzEpLnJldmVyc2UoKSk7Y29uc3QgZmlsZVN5c3RlbU5vZGU9dGhpcy5fcm9vdE5vZGUuY2hpbGQocHJvamVjdC5pZCgpKTtpZihmaWxlU3lzdGVtTm9kZSkKZmlsZVN5c3RlbU5vZGUuc2V0VGl0bGUocGF0aCk7fX0KX3JlbW92ZVByb2plY3QocHJvamVjdCl7Y29uc3QgdWlTb3VyY2VDb2Rlcz1wcm9qZWN0LnVpU291cmNlQ29kZXMoKTtmb3IobGV0IGk9MDtpPHVpU291cmNlQ29kZXMubGVuZ3RoOysraSkKdGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZXNbaV0pO2lmKHByb2plY3QudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpyZXR1cm47Y29uc3QgZmlsZVN5c3RlbU5vZGU9dGhpcy5fcm9vdE5vZGUuY2hpbGQocHJvamVjdC5pZCgpKTtpZighZmlsZVN5c3RlbU5vZGUpCnJldHVybjt0aGlzLl9yb290Tm9kZS5yZW1vdmVDaGlsZChmaWxlU3lzdGVtTm9kZSk7fQpfZm9sZGVyTm9kZUlkKHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4scGF0aCl7Y29uc3QgdGFyZ2V0SWQ9dGFyZ2V0P3RhcmdldC5pZCgpOicnO2NvbnN0IHByb2plY3RJZD1wcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbT9wcm9qZWN0LmlkKCk6Jyc7Y29uc3QgZnJhbWVJZD10aGlzLl9ncm91cEJ5RnJhbWUmJmZyYW1lP2ZyYW1lLmlkOicnO3JldHVybiB0YXJnZXRJZCsnOicrcHJvamVjdElkKyc6JytmcmFtZUlkKyc6Jytwcm9qZWN0T3JpZ2luKyc6JytwYXRoO30KX2ZvbGRlck5vZGUodWlTb3VyY2VDb2RlLHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4scGF0aCxmcm9tU291cmNlTWFwKXtpZihwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU25pcHBldHMpCnJldHVybiB0aGlzLl9yb290Tm9kZTtpZih0YXJnZXQmJiF0aGlzLl9ncm91cEJ5Rm9sZGVyJiYhZnJvbVNvdXJjZU1hcCkKcmV0dXJuIHRoaXMuX2RvbWFpbk5vZGUodWlTb3VyY2VDb2RlLHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4pO2NvbnN0IGZvbGRlclBhdGg9cGF0aC5qb2luKCcvJyk7Y29uc3QgZm9sZGVySWQ9dGhpcy5fZm9sZGVyTm9kZUlkKHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4sZm9sZGVyUGF0aCk7bGV0IGZvbGRlck5vZGU9dGhpcy5fc3ViZm9sZGVyTm9kZXMuZ2V0KGZvbGRlcklkKTtpZihmb2xkZXJOb2RlKQpyZXR1cm4gZm9sZGVyTm9kZTtpZighcGF0aC5sZW5ndGgpe2lmKHRhcmdldCkKcmV0dXJuIHRoaXMuX2RvbWFpbk5vZGUodWlTb3VyY2VDb2RlLHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4pO3JldHVybih0aGlzLl9yb290Tm9kZS5jaGlsZChwcm9qZWN0LmlkKCkpKTt9CmNvbnN0IHBhcmVudE5vZGU9dGhpcy5fZm9sZGVyTm9kZSh1aVNvdXJjZUNvZGUscHJvamVjdCx0YXJnZXQsZnJhbWUscHJvamVjdE9yaWdpbixwYXRoLnNsaWNlKDAsLTEpLGZyb21Tb3VyY2VNYXApO2xldCB0eXBlPWZyb21Tb3VyY2VNYXA/U291cmNlcy5OYXZpZ2F0b3JWaWV3LlR5cGVzLlNvdXJjZU1hcEZvbGRlcjpTb3VyY2VzLk5hdmlnYXRvclZpZXcuVHlwZXMuTmV0d29ya0ZvbGRlcjtpZihwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSkKdHlwZT1Tb3VyY2VzLk5hdmlnYXRvclZpZXcuVHlwZXMuRmlsZVN5c3RlbUZvbGRlcjtjb25zdCBuYW1lPXBhdGhbcGF0aC5sZW5ndGgtMV07Zm9sZGVyTm9kZT1uZXcgU291cmNlcy5OYXZpZ2F0b3JGb2xkZXJUcmVlTm9kZSh0aGlzLHByb2plY3QsZm9sZGVySWQsdHlwZSxmb2xkZXJQYXRoLG5hbWUpO3RoaXMuX3N1YmZvbGRlck5vZGVzLnNldChmb2xkZXJJZCxmb2xkZXJOb2RlKTtwYXJlbnROb2RlLmFwcGVuZENoaWxkKGZvbGRlck5vZGUpO3JldHVybiBmb2xkZXJOb2RlO30KX2RvbWFpbk5vZGUodWlTb3VyY2VDb2RlLHByb2plY3QsdGFyZ2V0LGZyYW1lLHByb2plY3RPcmlnaW4pe2NvbnN0IGZyYW1lTm9kZT10aGlzLl9mcmFtZU5vZGUocHJvamVjdCx0YXJnZXQsZnJhbWUpO2lmKCF0aGlzLl9ncm91cEJ5RG9tYWluKQpyZXR1cm4gZnJhbWVOb2RlO2xldCBkb21haW5Ob2RlPWZyYW1lTm9kZS5jaGlsZChwcm9qZWN0T3JpZ2luKTtpZihkb21haW5Ob2RlKQpyZXR1cm4gZG9tYWluTm9kZTtkb21haW5Ob2RlPW5ldyBTb3VyY2VzLk5hdmlnYXRvckdyb3VwVHJlZU5vZGUodGhpcyxwcm9qZWN0LHByb2plY3RPcmlnaW4sU291cmNlcy5OYXZpZ2F0b3JWaWV3LlR5cGVzLkRvbWFpbix0aGlzLl9jb21wdXRlUHJvamVjdERpc3BsYXlOYW1lKHRhcmdldCxwcm9qZWN0T3JpZ2luKSk7aWYoZnJhbWUmJnByb2plY3RPcmlnaW49PT1Db21tb24uUGFyc2VkVVJMLmV4dHJhY3RPcmlnaW4oZnJhbWUudXJsKSkKZG9tYWluTm9kZS50cmVlTm9kZSgpLl9ib29zdE9yZGVyPXRydWU7ZnJhbWVOb2RlLmFwcGVuZENoaWxkKGRvbWFpbk5vZGUpO3JldHVybiBkb21haW5Ob2RlO30KX2ZyYW1lTm9kZShwcm9qZWN0LHRhcmdldCxmcmFtZSl7aWYoIXRoaXMuX2dyb3VwQnlGcmFtZXx8IWZyYW1lKQpyZXR1cm4gdGhpcy5fdGFyZ2V0Tm9kZShwcm9qZWN0LHRhcmdldCk7bGV0IGZyYW1lTm9kZT10aGlzLl9mcmFtZU5vZGVzLmdldChmcmFtZSk7aWYoZnJhbWVOb2RlKQpyZXR1cm4gZnJhbWVOb2RlO2ZyYW1lTm9kZT1uZXcgU291cmNlcy5OYXZpZ2F0b3JHcm91cFRyZWVOb2RlKHRoaXMscHJvamVjdCx0YXJnZXQuaWQoKSsnOicrZnJhbWUuaWQsU291cmNlcy5OYXZpZ2F0b3JWaWV3LlR5cGVzLkZyYW1lLGZyYW1lLmRpc3BsYXlOYW1lKCkpO2ZyYW1lTm9kZS5zZXRIb3ZlckNhbGxiYWNrKGhvdmVyQ2FsbGJhY2spO3RoaXMuX2ZyYW1lTm9kZXMuc2V0KGZyYW1lLGZyYW1lTm9kZSk7Y29uc3QgcGFyZW50RnJhbWU9ZnJhbWUucGFyZW50RnJhbWV8fGZyYW1lLmNyb3NzVGFyZ2V0UGFyZW50RnJhbWUoKTt0aGlzLl9mcmFtZU5vZGUocHJvamVjdCxwYXJlbnRGcmFtZT9wYXJlbnRGcmFtZS5yZXNvdXJjZVRyZWVNb2RlbCgpLnRhcmdldCgpOnRhcmdldCxwYXJlbnRGcmFtZSkuYXBwZW5kQ2hpbGQoZnJhbWVOb2RlKTtpZighcGFyZW50RnJhbWUpCmZyYW1lTm9kZS50cmVlTm9kZSgpLl9ib29zdE9yZGVyPXRydWU7ZnVuY3Rpb24gaG92ZXJDYWxsYmFjayhob3ZlcmVkKXtpZihob3ZlcmVkKXtjb25zdCBvdmVybGF5TW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5PdmVybGF5TW9kZWwpO2lmKG92ZXJsYXlNb2RlbCkKb3ZlcmxheU1vZGVsLmhpZ2hsaWdodEZyYW1lKGZyYW1lLmlkKTt9ZWxzZXtTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7fX0KcmV0dXJuIGZyYW1lTm9kZTt9Cl90YXJnZXROb2RlKHByb2plY3QsdGFyZ2V0KXtpZih0YXJnZXQ9PT1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkpCnJldHVybiB0aGlzLl9yb290Tm9kZTtsZXQgdGFyZ2V0Tm9kZT10aGlzLl9yb290Tm9kZS5jaGlsZCgndGFyZ2V0OicrdGFyZ2V0LmlkKCkpO2lmKCF0YXJnZXROb2RlKXt0YXJnZXROb2RlPW5ldyBTb3VyY2VzLk5hdmlnYXRvckdyb3VwVHJlZU5vZGUodGhpcyxwcm9qZWN0LCd0YXJnZXQ6Jyt0YXJnZXQuaWQoKSwhdGFyZ2V0Lmhhc0Jyb3dzZXJDYXBhYmlsaXR5KCk/U291cmNlcy5OYXZpZ2F0b3JWaWV3LlR5cGVzLldvcmtlcjpTb3VyY2VzLk5hdmlnYXRvclZpZXcuVHlwZXMuRnJhbWUsdGFyZ2V0Lm5hbWUoKSk7dGhpcy5fcm9vdE5vZGUuYXBwZW5kQ2hpbGQodGFyZ2V0Tm9kZSk7fQpyZXR1cm4gdGFyZ2V0Tm9kZTt9Cl9jb21wdXRlUHJvamVjdERpc3BsYXlOYW1lKHRhcmdldCxwcm9qZWN0T3JpZ2luKXtjb25zdCBydW50aW1lTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5SdW50aW1lTW9kZWwpO2NvbnN0IGV4ZWN1dGlvbkNvbnRleHRzPXJ1bnRpbWVNb2RlbD9ydW50aW1lTW9kZWwuZXhlY3V0aW9uQ29udGV4dHMoKTpbXTtmb3IoY29uc3QgY29udGV4dCBvZiBleGVjdXRpb25Db250ZXh0cyl7aWYoY29udGV4dC5uYW1lJiZjb250ZXh0Lm9yaWdpbiYmcHJvamVjdE9yaWdpbi5zdGFydHNXaXRoKGNvbnRleHQub3JpZ2luKSkKcmV0dXJuIGNvbnRleHQubmFtZTt9CmlmKCFwcm9qZWN0T3JpZ2luKQpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCcobm8gZG9tYWluKScpO2NvbnN0IHBhcnNlZFVSTD1uZXcgQ29tbW9uLlBhcnNlZFVSTChwcm9qZWN0T3JpZ2luKTtjb25zdCBwcmV0dHlVUkw9cGFyc2VkVVJMLmlzVmFsaWQ/cGFyc2VkVVJMLmhvc3QrKHBhcnNlZFVSTC5wb3J0PygnOicrcGFyc2VkVVJMLnBvcnQpOicnKTonJztyZXR1cm4ocHJldHR5VVJMfHxwcm9qZWN0T3JpZ2luKTt9CnJldmVhbFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUsc2VsZWN0KXtjb25zdCBub2Rlcz10aGlzLl91aVNvdXJjZUNvZGVOb2Rlcy5nZXQodWlTb3VyY2VDb2RlKTtjb25zdCBub2RlPW5vZGVzLmZpcnN0VmFsdWUoKTtpZighbm9kZSkKcmV0dXJuIG51bGw7aWYodGhpcy5fc2NyaXB0c1RyZWUuc2VsZWN0ZWRUcmVlRWxlbWVudCkKdGhpcy5fc2NyaXB0c1RyZWUuc2VsZWN0ZWRUcmVlRWxlbWVudC5kZXNlbGVjdCgpO3RoaXMuX2xhc3RTZWxlY3RlZFVJU291cmNlQ29kZT11aVNvdXJjZUNvZGU7bm9kZS5yZXZlYWwoc2VsZWN0KTtyZXR1cm4gbm9kZTt9Cl9zb3VyY2VTZWxlY3RlZCh1aVNvdXJjZUNvZGUsZm9jdXNTb3VyY2Upe3RoaXMuX2xhc3RTZWxlY3RlZFVJU291cmNlQ29kZT11aVNvdXJjZUNvZGU7Q29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUsIWZvY3VzU291cmNlKTt9CnNvdXJjZURlbGV0ZWQodWlTb3VyY2VDb2RlKXt9Cl9yZW1vdmVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtjb25zdCBub2Rlcz10aGlzLl91aVNvdXJjZUNvZGVOb2Rlcy5nZXQodWlTb3VyY2VDb2RlKTtmb3IoY29uc3Qgbm9kZSBvZiBub2RlcykKdGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2RlTm9kZShub2RlKTt9Cl9yZW1vdmVVSVNvdXJjZUNvZGVOb2RlKG5vZGUpe2NvbnN0IHVpU291cmNlQ29kZT1ub2RlLnVpU291cmNlQ29kZSgpO3RoaXMuX3VpU291cmNlQ29kZU5vZGVzLmRlbGV0ZSh1aVNvdXJjZUNvZGUsbm9kZSk7Y29uc3QgcHJvamVjdD11aVNvdXJjZUNvZGUucHJvamVjdCgpO2NvbnN0IHRhcmdldD1CaW5kaW5ncy5OZXR3b3JrUHJvamVjdC50YXJnZXRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtjb25zdCBmcmFtZT1ub2RlLmZyYW1lKCk7bGV0IHBhcmVudE5vZGU9bm9kZS5wYXJlbnQ7cGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtub2RlPXBhcmVudE5vZGU7d2hpbGUobm9kZSl7cGFyZW50Tm9kZT1ub2RlLnBhcmVudDtpZighcGFyZW50Tm9kZXx8IW5vZGUuaXNFbXB0eSgpKQpicmVhaztpZihwYXJlbnROb2RlPT09dGhpcy5fcm9vdE5vZGUmJnByb2plY3QudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpicmVhaztpZighKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VzLk5hdmlnYXRvckdyb3VwVHJlZU5vZGV8fG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VzLk5hdmlnYXRvckZvbGRlclRyZWVOb2RlKSkKYnJlYWs7aWYobm9kZS5fdHlwZT09PVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5GcmFtZSl7dGhpcy5fZGlzY2FyZEZyYW1lKChmcmFtZSkpO2JyZWFrO30KY29uc3QgZm9sZGVySWQ9dGhpcy5fZm9sZGVyTm9kZUlkKHByb2plY3QsdGFyZ2V0LGZyYW1lLHVpU291cmNlQ29kZS5vcmlnaW4oKSxub2RlLl9mb2xkZXJQYXRoKTt0aGlzLl9zdWJmb2xkZXJOb2Rlcy5kZWxldGUoZm9sZGVySWQpO3BhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7bm9kZT1wYXJlbnROb2RlO319CnJlc2V0KCl7Zm9yKGNvbnN0IG5vZGUgb2YgdGhpcy5fdWlTb3VyY2VDb2RlTm9kZXMudmFsdWVzQXJyYXkoKSkKbm9kZS5kaXNwb3NlKCk7dGhpcy5fc2NyaXB0c1RyZWUucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl91aVNvdXJjZUNvZGVOb2Rlcy5jbGVhcigpO3RoaXMuX3N1YmZvbGRlck5vZGVzLmNsZWFyKCk7dGhpcy5fZnJhbWVOb2Rlcy5jbGVhcigpO3RoaXMuX3Jvb3ROb2RlLnJlc2V0KCk7fQpoYW5kbGVDb250ZXh0TWVudShldmVudCl7fQpfcmVuYW1lU2hvcnRjdXQoKXtjb25zdCBub2RlPXRoaXMuX3NjcmlwdHNUcmVlLnNlbGVjdGVkVHJlZUVsZW1lbnQmJnRoaXMuX3NjcmlwdHNUcmVlLnNlbGVjdGVkVHJlZUVsZW1lbnQuX25vZGU7aWYoIW5vZGV8fCFub2RlLl91aVNvdXJjZUNvZGV8fCFub2RlLl91aVNvdXJjZUNvZGUuY2FuUmVuYW1lKCkpCnJldHVybiBmYWxzZTt0aGlzLnJlbmFtZShub2RlLGZhbHNlKTtyZXR1cm4gdHJ1ZTt9Cl9oYW5kbGVDb250ZXh0TWVudUNyZWF0ZShwcm9qZWN0LHBhdGgsdWlTb3VyY2VDb2RlKXtpZih1aVNvdXJjZUNvZGUpe2NvbnN0IHJlbGF0aXZlUGF0aD1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5yZWxhdGl2ZVBhdGgodWlTb3VyY2VDb2RlKTtyZWxhdGl2ZVBhdGgucG9wKCk7cGF0aD1yZWxhdGl2ZVBhdGguam9pbignLycpO30KdGhpcy5jcmVhdGUocHJvamVjdCxwYXRoLHVpU291cmNlQ29kZSk7fQpfaGFuZGxlQ29udGV4dE1lbnVSZW5hbWUobm9kZSl7dGhpcy5yZW5hbWUobm9kZSxmYWxzZSk7fQpfaGFuZGxlQ29udGV4dE1lbnVFeGNsdWRlKHByb2plY3QscGF0aCl7Y29uc3Qgc2hvdWxkRXhjbHVkZT13aW5kb3cuY29uZmlybShDb21tb24uVUlTdHJpbmcoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBleGNsdWRlIHRoaXMgZm9sZGVyPycpKTtpZihzaG91bGRFeGNsdWRlKXtVSS5zdGFydEJhdGNoVXBkYXRlKCk7cHJvamVjdC5leGNsdWRlRm9sZGVyKFBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLmNvbXBsZXRlVVJMKHByb2plY3QscGF0aCkpO1VJLmVuZEJhdGNoVXBkYXRlKCk7fX0KX2hhbmRsZUNvbnRleHRNZW51RGVsZXRlKHVpU291cmNlQ29kZSl7Y29uc3Qgc2hvdWxkRGVsZXRlPXdpbmRvdy5jb25maXJtKENvbW1vbi5VSVN0cmluZygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/JykpO2lmKHNob3VsZERlbGV0ZSkKdWlTb3VyY2VDb2RlLnByb2plY3QoKS5kZWxldGVGaWxlKHVpU291cmNlQ29kZSk7fQpoYW5kbGVGaWxlQ29udGV4dE1lbnUoZXZlbnQsbm9kZSl7Y29uc3QgdWlTb3VyY2VDb2RlPW5vZGUudWlTb3VyY2VDb2RlKCk7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXModWlTb3VyY2VDb2RlKTtjb25zdCBwcm9qZWN0PXVpU291cmNlQ29kZS5wcm9qZWN0KCk7aWYocHJvamVjdC50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pe2NvbnRleHRNZW51LmVkaXRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlbmFtZVx1MjAyNicpLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51UmVuYW1lLmJpbmQodGhpcyxub2RlKSk7Y29udGV4dE1lbnUuZWRpdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnTWFrZSBhIGNvcHlcdTIwMjYnKSx0aGlzLl9oYW5kbGVDb250ZXh0TWVudUNyZWF0ZS5iaW5kKHRoaXMscHJvamVjdCwnJyx1aVNvdXJjZUNvZGUpKTtjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdEZWxldGUnKSx0aGlzLl9oYW5kbGVDb250ZXh0TWVudURlbGV0ZS5iaW5kKHRoaXMsdWlTb3VyY2VDb2RlKSk7fQpjb250ZXh0TWVudS5zaG93KCk7fQpoYW5kbGVGb2xkZXJDb250ZXh0TWVudShldmVudCxub2RlKXtjb25zdCBwYXRoPW5vZGUuX2ZvbGRlclBhdGh8fCcnO2NvbnN0IHByb2plY3Q9bm9kZS5fcHJvamVjdDtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO1NvdXJjZXMuTmF2aWdhdG9yVmlldy5hcHBlbmRTZWFyY2hJdGVtKGNvbnRleHRNZW51LHBhdGgpO2NvbnN0IGZvbGRlclBhdGg9Q29tbW9uLlBhcnNlZFVSTC51cmxUb1BsYXRmb3JtUGF0aChQZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5jb21wbGV0ZVVSTChwcm9qZWN0LHBhdGgpLEhvc3QuaXNXaW4oKSk7Y29udGV4dE1lbnUucmV2ZWFsU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdPcGVuIGZvbGRlcicpLCgpPT5JbnNwZWN0b3JGcm9udGVuZEhvc3Quc2hvd0l0ZW1JbkZvbGRlcihmb2xkZXJQYXRoKSk7aWYocHJvamVjdC5jYW5DcmVhdGVGaWxlKCkpe2NvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ05ldyBmaWxlJyksdGhpcy5faGFuZGxlQ29udGV4dE1lbnVDcmVhdGUuYmluZCh0aGlzLHByb2plY3QscGF0aCkpO30KaWYocHJvamVjdC5jYW5FeGNsdWRlRm9sZGVyKHBhdGgpKXtjb250ZXh0TWVudS5kZWZhdWx0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdFeGNsdWRlIGZvbGRlcicpLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXhjbHVkZS5iaW5kKHRoaXMscHJvamVjdCxwYXRoKSk7fQpmdW5jdGlvbiByZW1vdmVGb2xkZXIoKXtjb25zdCBzaG91bGRSZW1vdmU9d2luZG93LmNvbmZpcm0oQ29tbW9uLlVJU3RyaW5nKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgZm9sZGVyPycpKTtpZihzaG91bGRSZW1vdmUpCnByb2plY3QucmVtb3ZlKCk7fQppZihwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSl7U291cmNlcy5OYXZpZ2F0b3JWaWV3LmFwcGVuZEFkZEZvbGRlckl0ZW0oY29udGV4dE1lbnUpO2lmKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VzLk5hdmlnYXRvckdyb3VwVHJlZU5vZGUpCmNvbnRleHRNZW51LmRlZmF1bHRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlbW92ZSBmb2xkZXIgZnJvbSB3b3Jrc3BhY2UnKSxyZW1vdmVGb2xkZXIpO30KY29udGV4dE1lbnUuc2hvdygpO30KcmVuYW1lKG5vZGUsY3JlYXRpbmdOZXdVSVNvdXJjZUNvZGUpe2NvbnN0IHVpU291cmNlQ29kZT1ub2RlLnVpU291cmNlQ29kZSgpO25vZGUucmVuYW1lKGNhbGxiYWNrLmJpbmQodGhpcykpO2Z1bmN0aW9uIGNhbGxiYWNrKGNvbW1pdHRlZCl7aWYoIWNyZWF0aW5nTmV3VUlTb3VyY2VDb2RlKQpyZXR1cm47aWYoIWNvbW1pdHRlZCkKdWlTb3VyY2VDb2RlLnJlbW92ZSgpO2Vsc2UgaWYobm9kZS5fdHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50Lmhhc0ZvY3VzKCkpCnRoaXMuX3NvdXJjZVNlbGVjdGVkKHVpU291cmNlQ29kZSx0cnVlKTt9fQphc3luYyBjcmVhdGUocHJvamVjdCxwYXRoLHVpU291cmNlQ29kZVRvQ29weSl7bGV0IGNvbnRlbnQ9Jyc7aWYodWlTb3VyY2VDb2RlVG9Db3B5KQpjb250ZW50PShhd2FpdCB1aVNvdXJjZUNvZGVUb0NvcHkucmVxdWVzdENvbnRlbnQoKSl8fCcnO2NvbnN0IHVpU291cmNlQ29kZT1hd2FpdCBwcm9qZWN0LmNyZWF0ZUZpbGUocGF0aCxudWxsLGNvbnRlbnQpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybjt0aGlzLl9zb3VyY2VTZWxlY3RlZCh1aVNvdXJjZUNvZGUsZmFsc2UpO2NvbnN0IG5vZGU9dGhpcy5yZXZlYWxVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLHRydWUpO2lmKG5vZGUpCnRoaXMucmVuYW1lKG5vZGUsdHJ1ZSk7fQpfZ3JvdXBpbmdDaGFuZ2VkKCl7dGhpcy5yZXNldCgpO3RoaXMuX2luaXRHcm91cGluZygpO3RoaXMuX3dvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9hZGRVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7fQpfaW5pdEdyb3VwaW5nKCl7dGhpcy5fZ3JvdXBCeUZyYW1lPXRydWU7dGhpcy5fZ3JvdXBCeURvbWFpbj10aGlzLl9uYXZpZ2F0b3JHcm91cEJ5Rm9sZGVyU2V0dGluZy5nZXQoKTt0aGlzLl9ncm91cEJ5Rm9sZGVyPXRoaXMuX2dyb3VwQnlEb21haW47fQpfcmVzZXRGb3JUZXN0KCl7dGhpcy5yZXNldCgpO3RoaXMuX3dvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9hZGRVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7fQpfZGlzY2FyZEZyYW1lKGZyYW1lKXtjb25zdCBub2RlPXRoaXMuX2ZyYW1lTm9kZXMuZ2V0KGZyYW1lKTtpZighbm9kZSkKcmV0dXJuO2lmKG5vZGUucGFyZW50KQpub2RlLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKTt0aGlzLl9mcmFtZU5vZGVzLmRlbGV0ZShmcmFtZSk7Zm9yKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKQp0aGlzLl9kaXNjYXJkRnJhbWUoY2hpbGQpO30KdGFyZ2V0QWRkZWQodGFyZ2V0KXt9CnRhcmdldFJlbW92ZWQodGFyZ2V0KXtjb25zdCB0YXJnZXROb2RlPXRoaXMuX3Jvb3ROb2RlLmNoaWxkKCd0YXJnZXQ6Jyt0YXJnZXQuaWQoKSk7aWYodGFyZ2V0Tm9kZSkKdGhpcy5fcm9vdE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0Tm9kZSk7fQpfdGFyZ2V0TmFtZUNoYW5nZWQoZXZlbnQpe2NvbnN0IHRhcmdldD0oZXZlbnQuZGF0YSk7Y29uc3QgdGFyZ2V0Tm9kZT10aGlzLl9yb290Tm9kZS5jaGlsZCgndGFyZ2V0OicrdGFyZ2V0LmlkKCkpO2lmKHRhcmdldE5vZGUpCnRhcmdldE5vZGUuc2V0VGl0bGUodGFyZ2V0Lm5hbWUoKSk7fX07U291cmNlcy5OYXZpZ2F0b3JWaWV3LlR5cGVzPXtEb21haW46J2RvbWFpbicsRmlsZTonZmlsZScsRmlsZVN5c3RlbTonZnMnLEZpbGVTeXN0ZW1Gb2xkZXI6J2ZzLWZvbGRlcicsRnJhbWU6J2ZyYW1lJyxOZXR3b3JrRm9sZGVyOidudy1mb2xkZXInLFJvb3Q6J3Jvb3QnLFNvdXJjZU1hcEZvbGRlcjonc20tZm9sZGVyJyxXb3JrZXI6J3dvcmtlcid9O1NvdXJjZXMuTmF2aWdhdG9yRm9sZGVyVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihuYXZpZ2F0b3JWaWV3LHR5cGUsdGl0bGUsaG92ZXJDYWxsYmFjayl7c3VwZXIoJycsdHJ1ZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdG9yLScrdHlwZSsnLXRyZWUtaXRlbScsJ25hdmlnYXRvci1mb2xkZXItdHJlZS1pdGVtJyk7dGhpcy5fbm9kZVR5cGU9dHlwZTt0aGlzLnRpdGxlPXRpdGxlO3RoaXMudG9vbHRpcD10aXRsZTt0aGlzLl9uYXZpZ2F0b3JWaWV3PW5hdmlnYXRvclZpZXc7dGhpcy5faG92ZXJDYWxsYmFjaz1ob3ZlckNhbGxiYWNrO2xldCBpY29uVHlwZT0nbGFyZ2VpY29uLW5hdmlnYXRvci1mb2xkZXInO2lmKHR5cGU9PT1Tb3VyY2VzLk5hdmlnYXRvclZpZXcuVHlwZXMuRG9tYWluKQppY29uVHlwZT0nbGFyZ2VpY29uLW5hdmlnYXRvci1kb21haW4nO2Vsc2UgaWYodHlwZT09PVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5GcmFtZSkKaWNvblR5cGU9J2xhcmdlaWNvbi1uYXZpZ2F0b3ItZnJhbWUnO2Vsc2UgaWYodHlwZT09PVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5Xb3JrZXIpCmljb25UeXBlPSdsYXJnZWljb24tbmF2aWdhdG9yLXdvcmtlcic7dGhpcy5zZXRMZWFkaW5nSWNvbnMoW1VJLkljb24uY3JlYXRlKGljb25UeXBlLCdpY29uJyldKTt9Cm9ucG9wdWxhdGUoKXt0aGlzLl9ub2RlLnBvcHVsYXRlKCk7fQpvbmF0dGFjaCgpe3RoaXMuY29sbGFwc2UoKTt0aGlzLl9ub2RlLm9uYXR0YWNoKCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuX2hhbmRsZUNvbnRleHRNZW51RXZlbnQuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9tb3VzZU1vdmUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsdGhpcy5fbW91c2VMZWF2ZS5iaW5kKHRoaXMpLGZhbHNlKTt9CnNldE5vZGUobm9kZSl7dGhpcy5fbm9kZT1ub2RlO2NvbnN0IHBhdGhzPVtdO3doaWxlKG5vZGUmJiFub2RlLmlzUm9vdCgpKXtwYXRocy5wdXNoKG5vZGUuX3RpdGxlKTtub2RlPW5vZGUucGFyZW50O30KcGF0aHMucmV2ZXJzZSgpO3RoaXMudG9vbHRpcD1wYXRocy5qb2luKCcvJyk7fQpfaGFuZGxlQ29udGV4dE1lbnVFdmVudChldmVudCl7aWYoIXRoaXMuX25vZGUpCnJldHVybjt0aGlzLnNlbGVjdCgpO3RoaXMuX25hdmlnYXRvclZpZXcuaGFuZGxlRm9sZGVyQ29udGV4dE1lbnUoZXZlbnQsdGhpcy5fbm9kZSk7fQpfbW91c2VNb3ZlKGV2ZW50KXtpZih0aGlzLl9ob3ZlcmVkfHwhdGhpcy5faG92ZXJDYWxsYmFjaykKcmV0dXJuO3RoaXMuX2hvdmVyZWQ9dHJ1ZTt0aGlzLl9ob3ZlckNhbGxiYWNrKHRydWUpO30KX21vdXNlTGVhdmUoZXZlbnQpe2lmKCF0aGlzLl9ob3ZlckNhbGxiYWNrKQpyZXR1cm47dGhpcy5faG92ZXJlZD1mYWxzZTt0aGlzLl9ob3ZlckNhbGxiYWNrKGZhbHNlKTt9fTtTb3VyY2VzLk5hdmlnYXRvclNvdXJjZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3IobmF2aWdhdG9yVmlldyx1aVNvdXJjZUNvZGUsdGl0bGUsbm9kZSl7c3VwZXIoJycsZmFsc2UpO3RoaXMuX25vZGVUeXBlPVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5GaWxlO3RoaXMuX25vZGU9bm9kZTt0aGlzLnRpdGxlPXRpdGxlO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRvci0nK3VpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLm5hbWUoKSsnLXRyZWUtaXRlbScsJ25hdmlnYXRvci1maWxlLXRyZWUtaXRlbScpO3RoaXMudG9vbHRpcD11aVNvdXJjZUNvZGUudXJsKCk7dGhpcy5fbmF2aWdhdG9yVmlldz1uYXZpZ2F0b3JWaWV3O3RoaXMuX3VpU291cmNlQ29kZT11aVNvdXJjZUNvZGU7dGhpcy51cGRhdGVJY29uKCk7fQp1cGRhdGVJY29uKCl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHRoaXMuX3VpU291cmNlQ29kZSk7aWYoYmluZGluZyl7Y29uc3QgY29udGFpbmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdpY29uLXN0YWNrJyk7Y29uc3QgaWNvbj1VSS5JY29uLmNyZWF0ZSgnbGFyZ2VpY29uLW5hdmlnYXRvci1maWxlLXN5bmMnLCdpY29uJyk7Y29uc3QgYmFkZ2U9VUkuSWNvbi5jcmVhdGUoJ2JhZGdlLW5hdmlnYXRvci1maWxlLXN5bmMnLCdpY29uLWJhZGdlJyk7aWYoUGVyc2lzdGVuY2UubmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlci5wcm9qZWN0KCk9PT1iaW5kaW5nLmZpbGVTeXN0ZW0ucHJvamVjdCgpKQpiYWRnZS5zdHlsZS5maWx0ZXI9J2h1ZS1yb3RhdGUoMTYwZGVnKSc7Y29udGFpbmVyLmFwcGVuZENoaWxkKGljb24pO2NvbnRhaW5lci5hcHBlbmRDaGlsZChiYWRnZSk7Y29udGFpbmVyLnRpdGxlPVBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVXRpbHMudG9vbHRpcEZvclVJU291cmNlQ29kZSh0aGlzLl91aVNvdXJjZUNvZGUpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtjb250YWluZXJdKTt9ZWxzZXtsZXQgaWNvblR5cGU9J2xhcmdlaWNvbi1uYXZpZ2F0b3ItZmlsZSc7aWYodGhpcy5fdWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCk9PT1Db21tb24ucmVzb3VyY2VUeXBlcy5TbmlwcGV0KQppY29uVHlwZT0nbGFyZ2VpY29uLW5hdmlnYXRvci1zbmlwcGV0Jztjb25zdCBkZWZhdWx0SWNvbj1VSS5JY29uLmNyZWF0ZShpY29uVHlwZSwnaWNvbicpO3RoaXMuc2V0TGVhZGluZ0ljb25zKFtkZWZhdWx0SWNvbl0pO319CmdldCB1aVNvdXJjZUNvZGUoKXtyZXR1cm4gdGhpcy5fdWlTb3VyY2VDb2RlO30Kb25hdHRhY2goKXt0aGlzLmxpc3RJdGVtRWxlbWVudC5kcmFnZ2FibGU9dHJ1ZTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25jbGljay5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5faGFuZGxlQ29udGV4dE1lbnVFdmVudC5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLHRoaXMuX29uZHJhZ3N0YXJ0LmJpbmQodGhpcyksZmFsc2UpO30KX3Nob3VsZFJlbmFtZU9uTW91c2VEb3duKCl7aWYoIXRoaXMuX3VpU291cmNlQ29kZS5jYW5SZW5hbWUoKSkKcmV0dXJuIGZhbHNlO2NvbnN0IGlzU2VsZWN0ZWQ9dGhpcz09PXRoaXMudHJlZU91dGxpbmUuc2VsZWN0ZWRUcmVlRWxlbWVudDtyZXR1cm4gaXNTZWxlY3RlZCYmdGhpcy50cmVlT3V0bGluZS5lbGVtZW50Lmhhc0ZvY3VzKCkmJiFVSS5pc0JlaW5nRWRpdGVkKHRoaXMudHJlZU91dGxpbmUuZWxlbWVudCk7fQpzZWxlY3RPbk1vdXNlRG93bihldmVudCl7aWYoZXZlbnQud2hpY2ghPT0xfHwhdGhpcy5fc2hvdWxkUmVuYW1lT25Nb3VzZURvd24oKSl7c3VwZXIuc2VsZWN0T25Nb3VzZURvd24oZXZlbnQpO3JldHVybjt9CnNldFRpbWVvdXQocmVuYW1lLmJpbmQodGhpcyksMzAwKTtmdW5jdGlvbiByZW5hbWUoKXtpZih0aGlzLl9zaG91bGRSZW5hbWVPbk1vdXNlRG93bigpKQp0aGlzLl9uYXZpZ2F0b3JWaWV3LnJlbmFtZSh0aGlzLl9ub2RlLGZhbHNlKTt9fQpfb25kcmFnc3RhcnQoZXZlbnQpe2V2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJyx0aGlzLl91aVNvdXJjZUNvZGUudXJsKCkpO2V2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSdjb3B5Jzt9Cm9uc3BhY2UoKXt0aGlzLl9uYXZpZ2F0b3JWaWV3Ll9zb3VyY2VTZWxlY3RlZCh0aGlzLnVpU291cmNlQ29kZSx0cnVlKTtyZXR1cm4gdHJ1ZTt9Cl9vbmNsaWNrKGV2ZW50KXt0aGlzLl9uYXZpZ2F0b3JWaWV3Ll9zb3VyY2VTZWxlY3RlZCh0aGlzLnVpU291cmNlQ29kZSxmYWxzZSk7fQpvbmRibGNsaWNrKGV2ZW50KXtjb25zdCBtaWRkbGVDbGljaz1ldmVudC5idXR0b249PT0xO3RoaXMuX25hdmlnYXRvclZpZXcuX3NvdXJjZVNlbGVjdGVkKHRoaXMudWlTb3VyY2VDb2RlLCFtaWRkbGVDbGljayk7cmV0dXJuIGZhbHNlO30Kb25lbnRlcigpe3RoaXMuX25hdmlnYXRvclZpZXcuX3NvdXJjZVNlbGVjdGVkKHRoaXMudWlTb3VyY2VDb2RlLHRydWUpO3JldHVybiB0cnVlO30Kb25kZWxldGUoKXt0aGlzLl9uYXZpZ2F0b3JWaWV3LnNvdXJjZURlbGV0ZWQodGhpcy51aVNvdXJjZUNvZGUpO3JldHVybiB0cnVlO30KX2hhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQpe3RoaXMuc2VsZWN0KCk7dGhpcy5fbmF2aWdhdG9yVmlldy5oYW5kbGVGaWxlQ29udGV4dE1lbnUoZXZlbnQsdGhpcy5fbm9kZSk7fX07U291cmNlcy5OYXZpZ2F0b3JUcmVlTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihpZCx0eXBlKXt0aGlzLmlkPWlkO3RoaXMuX3R5cGU9dHlwZTt0aGlzLl9jaGlsZHJlbj1uZXcgTWFwKCk7fQp0cmVlTm9kZSgpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpkaXNwb3NlKCl7fQppc1Jvb3QoKXtyZXR1cm4gZmFsc2U7fQpoYXNDaGlsZHJlbigpe3JldHVybiB0cnVlO30Kb25hdHRhY2goKXt9CnNldFRpdGxlKHRpdGxlKXt0aHJvdydOb3QgaW1wbGVtZW50ZWQnO30KcG9wdWxhdGUoKXtpZih0aGlzLmlzUG9wdWxhdGVkKCkpCnJldHVybjtpZih0aGlzLnBhcmVudCkKdGhpcy5wYXJlbnQucG9wdWxhdGUoKTt0aGlzLl9wb3B1bGF0ZWQ9dHJ1ZTt0aGlzLndhc1BvcHVsYXRlZCgpO30Kd2FzUG9wdWxhdGVkKCl7Y29uc3QgY2hpbGRyZW49dGhpcy5jaGlsZHJlbigpO2ZvcihsZXQgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy50cmVlTm9kZSgpLmFwcGVuZENoaWxkKChjaGlsZHJlbltpXS50cmVlTm9kZSgpKSk7fQpkaWRBZGRDaGlsZChub2RlKXtpZih0aGlzLmlzUG9wdWxhdGVkKCkpCnRoaXMudHJlZU5vZGUoKS5hcHBlbmRDaGlsZCgobm9kZS50cmVlTm9kZSgpKSk7fQp3aWxsUmVtb3ZlQ2hpbGQobm9kZSl7aWYodGhpcy5pc1BvcHVsYXRlZCgpKQp0aGlzLnRyZWVOb2RlKCkucmVtb3ZlQ2hpbGQoKG5vZGUudHJlZU5vZGUoKSkpO30KaXNQb3B1bGF0ZWQoKXtyZXR1cm4gdGhpcy5fcG9wdWxhdGVkO30KaXNFbXB0eSgpe3JldHVybiF0aGlzLl9jaGlsZHJlbi5zaXplO30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4udmFsdWVzQXJyYXkoKTt9CmNoaWxkKGlkKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW4uZ2V0KGlkKXx8bnVsbDt9CmFwcGVuZENoaWxkKG5vZGUpe3RoaXMuX2NoaWxkcmVuLnNldChub2RlLmlkLG5vZGUpO25vZGUucGFyZW50PXRoaXM7dGhpcy5kaWRBZGRDaGlsZChub2RlKTt9CnJlbW92ZUNoaWxkKG5vZGUpe3RoaXMud2lsbFJlbW92ZUNoaWxkKG5vZGUpO3RoaXMuX2NoaWxkcmVuLnJlbW92ZShub2RlLmlkKTtkZWxldGUgbm9kZS5wYXJlbnQ7bm9kZS5kaXNwb3NlKCk7fQpyZXNldCgpe3RoaXMuX2NoaWxkcmVuLmNsZWFyKCk7fX07U291cmNlcy5OYXZpZ2F0b3JSb290VHJlZU5vZGU9Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLk5hdmlnYXRvclRyZWVOb2Rle2NvbnN0cnVjdG9yKG5hdmlnYXRvclZpZXcpe3N1cGVyKCcnLFNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5Sb290KTt0aGlzLl9uYXZpZ2F0b3JWaWV3PW5hdmlnYXRvclZpZXc7fQppc1Jvb3QoKXtyZXR1cm4gdHJ1ZTt9CnRyZWVOb2RlKCl7cmV0dXJuIHRoaXMuX25hdmlnYXRvclZpZXcuX3NjcmlwdHNUcmVlLnJvb3RFbGVtZW50KCk7fX07U291cmNlcy5OYXZpZ2F0b3JVSVNvdXJjZUNvZGVUcmVlTm9kZT1jbGFzcyBleHRlbmRzIFNvdXJjZXMuTmF2aWdhdG9yVHJlZU5vZGV7Y29uc3RydWN0b3IobmF2aWdhdG9yVmlldyx1aVNvdXJjZUNvZGUsZnJhbWUpe3N1cGVyKHVpU291cmNlQ29kZS5wcm9qZWN0KCkuaWQoKSsnOicrdWlTb3VyY2VDb2RlLnVybCgpLFNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5GaWxlKTt0aGlzLl9uYXZpZ2F0b3JWaWV3PW5hdmlnYXRvclZpZXc7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLl90cmVlRWxlbWVudD1udWxsO3RoaXMuX2V2ZW50TGlzdGVuZXJzPVtdO3RoaXMuX2ZyYW1lPWZyYW1lO30KZnJhbWUoKXtyZXR1cm4gdGhpcy5fZnJhbWU7fQp1aVNvdXJjZUNvZGUoKXtyZXR1cm4gdGhpcy5fdWlTb3VyY2VDb2RlO30KdHJlZU5vZGUoKXtpZih0aGlzLl90cmVlRWxlbWVudCkKcmV0dXJuIHRoaXMuX3RyZWVFbGVtZW50O3RoaXMuX3RyZWVFbGVtZW50PW5ldyBTb3VyY2VzLk5hdmlnYXRvclNvdXJjZVRyZWVFbGVtZW50KHRoaXMuX25hdmlnYXRvclZpZXcsdGhpcy5fdWlTb3VyY2VDb2RlLCcnLHRoaXMpO3RoaXMudXBkYXRlVGl0bGUoKTtjb25zdCB1cGRhdGVUaXRsZUJvdW5kPXRoaXMudXBkYXRlVGl0bGUuYmluZCh0aGlzLHVuZGVmaW5lZCk7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLlRpdGxlQ2hhbmdlZCx1cGRhdGVUaXRsZUJvdW5kKSx0aGlzLl91aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNoYW5nZWQsdXBkYXRlVGl0bGVCb3VuZCksdGhpcy5fdWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsdXBkYXRlVGl0bGVCb3VuZCldO3JldHVybiB0aGlzLl90cmVlRWxlbWVudDt9CnVwZGF0ZVRpdGxlKGlnbm9yZUlzRGlydHkpe2lmKCF0aGlzLl90cmVlRWxlbWVudCkKcmV0dXJuO2xldCB0aXRsZVRleHQ9dGhpcy5fdWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKCk7aWYoIWlnbm9yZUlzRGlydHkmJnRoaXMuX3VpU291cmNlQ29kZS5pc0RpcnR5KCkpCnRpdGxlVGV4dD0nKicrdGl0bGVUZXh0O3RoaXMuX3RyZWVFbGVtZW50LnRpdGxlPXRpdGxlVGV4dDt0aGlzLl90cmVlRWxlbWVudC51cGRhdGVJY29uKCk7bGV0IHRvb2x0aXA9dGhpcy5fdWlTb3VyY2VDb2RlLnVybCgpO2lmKHRoaXMuX3VpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzRnJvbVNvdXJjZU1hcCgpKQp0b29sdGlwPUNvbW1vbi5VSVN0cmluZygnJXMgKGZyb20gc291cmNlIG1hcCknLHRoaXMuX3VpU291cmNlQ29kZS5kaXNwbGF5TmFtZSgpKTt0aGlzLl90cmVlRWxlbWVudC50b29sdGlwPXRvb2x0aXA7fQpoYXNDaGlsZHJlbigpe3JldHVybiBmYWxzZTt9CmRpc3Bvc2UoKXtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO30KcmV2ZWFsKHNlbGVjdCl7dGhpcy5wYXJlbnQucG9wdWxhdGUoKTt0aGlzLnBhcmVudC50cmVlTm9kZSgpLmV4cGFuZCgpO3RoaXMuX3RyZWVFbGVtZW50LnJldmVhbCh0cnVlKTtpZihzZWxlY3QpCnRoaXMuX3RyZWVFbGVtZW50LnNlbGVjdCh0cnVlKTt9CnJlbmFtZShjYWxsYmFjayl7aWYoIXRoaXMuX3RyZWVFbGVtZW50KQpyZXR1cm47dGhpcy5fdHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmZvY3VzKCk7Y29uc3QgdHJlZU91dGxpbmVFbGVtZW50PXRoaXMuX3RyZWVFbGVtZW50LnRyZWVPdXRsaW5lLmVsZW1lbnQ7VUkubWFya0JlaW5nRWRpdGVkKHRyZWVPdXRsaW5lRWxlbWVudCx0cnVlKTtmdW5jdGlvbiBjb21taXRIYW5kbGVyKGVsZW1lbnQsbmV3VGl0bGUsb2xkVGl0bGUpe2lmKG5ld1RpdGxlIT09b2xkVGl0bGUpe3RoaXMuX3RyZWVFbGVtZW50LnRpdGxlPW5ld1RpdGxlO3RoaXMuX3VpU291cmNlQ29kZS5yZW5hbWUobmV3VGl0bGUpLnRoZW4ocmVuYW1lQ2FsbGJhY2suYmluZCh0aGlzKSk7cmV0dXJuO30KYWZ0ZXJFZGl0aW5nLmNhbGwodGhpcyx0cnVlKTt9CmZ1bmN0aW9uIHJlbmFtZUNhbGxiYWNrKHN1Y2Nlc3Mpe2lmKCFzdWNjZXNzKXtVSS5tYXJrQmVpbmdFZGl0ZWQodHJlZU91dGxpbmVFbGVtZW50LGZhbHNlKTt0aGlzLnVwZGF0ZVRpdGxlKCk7dGhpcy5yZW5hbWUoY2FsbGJhY2spO3JldHVybjt9CmFmdGVyRWRpdGluZy5jYWxsKHRoaXMsdHJ1ZSk7fQpmdW5jdGlvbiBhZnRlckVkaXRpbmcoY29tbWl0dGVkKXtVSS5tYXJrQmVpbmdFZGl0ZWQodHJlZU91dGxpbmVFbGVtZW50LGZhbHNlKTt0aGlzLnVwZGF0ZVRpdGxlKCk7aWYoY2FsbGJhY2spCmNhbGxiYWNrKGNvbW1pdHRlZCk7fQp0aGlzLnVwZGF0ZVRpdGxlKHRydWUpO3RoaXMuX3RyZWVFbGVtZW50LnN0YXJ0RWRpdGluZ1RpdGxlKG5ldyBVSS5JbnBsYWNlRWRpdG9yLkNvbmZpZyhjb21taXRIYW5kbGVyLmJpbmQodGhpcyksYWZ0ZXJFZGl0aW5nLmJpbmQodGhpcyxmYWxzZSkpKTt9fTtTb3VyY2VzLk5hdmlnYXRvckZvbGRlclRyZWVOb2RlPWNsYXNzIGV4dGVuZHMgU291cmNlcy5OYXZpZ2F0b3JUcmVlTm9kZXtjb25zdHJ1Y3RvcihuYXZpZ2F0b3JWaWV3LHByb2plY3QsaWQsdHlwZSxmb2xkZXJQYXRoLHRpdGxlKXtzdXBlcihpZCx0eXBlKTt0aGlzLl9uYXZpZ2F0b3JWaWV3PW5hdmlnYXRvclZpZXc7dGhpcy5fcHJvamVjdD1wcm9qZWN0O3RoaXMuX2ZvbGRlclBhdGg9Zm9sZGVyUGF0aDt0aGlzLl90aXRsZT10aXRsZTt9CnRyZWVOb2RlKCl7aWYodGhpcy5fdHJlZUVsZW1lbnQpCnJldHVybiB0aGlzLl90cmVlRWxlbWVudDt0aGlzLl90cmVlRWxlbWVudD10aGlzLl9jcmVhdGVUcmVlRWxlbWVudCh0aGlzLl90aXRsZSx0aGlzKTt0aGlzLnVwZGF0ZVRpdGxlKCk7cmV0dXJuIHRoaXMuX3RyZWVFbGVtZW50O30KdXBkYXRlVGl0bGUoKXtpZighdGhpcy5fdHJlZUVsZW1lbnR8fHRoaXMuX3Byb2plY3QudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5GaWxlU3lzdGVtKQpyZXR1cm47Y29uc3QgYWJzb2x1dGVGaWxlU3lzdGVtUGF0aD1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5maWxlU3lzdGVtUGF0aCh0aGlzLl9wcm9qZWN0LmlkKCkpKycvJyt0aGlzLl9mb2xkZXJQYXRoO2NvbnN0IGhhc01hcHBlZEZpbGVzPVBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLmZpbGVQYXRoSGFzQmluZGluZ3MoYWJzb2x1dGVGaWxlU3lzdGVtUGF0aCk7dGhpcy5fdHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hhcy1tYXBwZWQtZmlsZXMnLGhhc01hcHBlZEZpbGVzKTt9Cl9jcmVhdGVUcmVlRWxlbWVudCh0aXRsZSxub2RlKXtpZih0aGlzLl9wcm9qZWN0LnR5cGUoKSE9PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSl7dHJ5e3RpdGxlPWRlY29kZVVSSSh0aXRsZSk7fWNhdGNoKGUpe319CmNvbnN0IHRyZWVFbGVtZW50PW5ldyBTb3VyY2VzLk5hdmlnYXRvckZvbGRlclRyZWVFbGVtZW50KHRoaXMuX25hdmlnYXRvclZpZXcsdGhpcy5fdHlwZSx0aXRsZSk7dHJlZUVsZW1lbnQuc2V0Tm9kZShub2RlKTtyZXR1cm4gdHJlZUVsZW1lbnQ7fQp3YXNQb3B1bGF0ZWQoKXtpZighdGhpcy5fdHJlZUVsZW1lbnR8fHRoaXMuX3RyZWVFbGVtZW50Ll9ub2RlIT09dGhpcykKcmV0dXJuO3RoaXMuX2FkZENoaWxkcmVuUmVjdXJzaXZlKCk7fQpfYWRkQ2hpbGRyZW5SZWN1cnNpdmUoKXtjb25zdCBjaGlsZHJlbj10aGlzLmNoaWxkcmVuKCk7Zm9yKGxldCBpPTA7aTxjaGlsZHJlbi5sZW5ndGg7KytpKXtjb25zdCBjaGlsZD1jaGlsZHJlbltpXTt0aGlzLmRpZEFkZENoaWxkKGNoaWxkKTtpZihjaGlsZCBpbnN0YW5jZW9mIFNvdXJjZXMuTmF2aWdhdG9yRm9sZGVyVHJlZU5vZGUpCmNoaWxkLl9hZGRDaGlsZHJlblJlY3Vyc2l2ZSgpO319Cl9zaG91bGRNZXJnZShub2RlKXtyZXR1cm4gdGhpcy5fdHlwZSE9PVNvdXJjZXMuTmF2aWdhdG9yVmlldy5UeXBlcy5Eb21haW4mJm5vZGUgaW5zdGFuY2VvZiBTb3VyY2VzLk5hdmlnYXRvckZvbGRlclRyZWVOb2RlO30KZGlkQWRkQ2hpbGQobm9kZSl7ZnVuY3Rpb24gdGl0bGVGb3JOb2RlKG5vZGUpe3JldHVybiBub2RlLl90aXRsZTt9CmlmKCF0aGlzLl90cmVlRWxlbWVudCkKcmV0dXJuO2xldCBjaGlsZHJlbj10aGlzLmNoaWxkcmVuKCk7aWYoY2hpbGRyZW4ubGVuZ3RoPT09MSYmdGhpcy5fc2hvdWxkTWVyZ2Uobm9kZSkpe25vZGUuX2lzTWVyZ2VkPXRydWU7dGhpcy5fdHJlZUVsZW1lbnQudGl0bGU9dGhpcy5fdHJlZUVsZW1lbnQudGl0bGUrJy8nK25vZGUuX3RpdGxlO25vZGUuX3RyZWVFbGVtZW50PXRoaXMuX3RyZWVFbGVtZW50O3RoaXMuX3RyZWVFbGVtZW50LnNldE5vZGUobm9kZSk7cmV0dXJuO30KbGV0IG9sZE5vZGU7aWYoY2hpbGRyZW4ubGVuZ3RoPT09MikKb2xkTm9kZT1jaGlsZHJlblswXSE9PW5vZGU/Y2hpbGRyZW5bMF06Y2hpbGRyZW5bMV07aWYob2xkTm9kZSYmb2xkTm9kZS5faXNNZXJnZWQpe2RlbGV0ZSBvbGROb2RlLl9pc01lcmdlZDtjb25zdCBtZXJnZWRUb05vZGVzPVtdO21lcmdlZFRvTm9kZXMucHVzaCh0aGlzKTtsZXQgdHJlZU5vZGU9dGhpczt3aGlsZSh0cmVlTm9kZS5faXNNZXJnZWQpe3RyZWVOb2RlPXRyZWVOb2RlLnBhcmVudDttZXJnZWRUb05vZGVzLnB1c2godHJlZU5vZGUpO30KbWVyZ2VkVG9Ob2Rlcy5yZXZlcnNlKCk7Y29uc3QgdGl0bGVUZXh0PW1lcmdlZFRvTm9kZXMubWFwKHRpdGxlRm9yTm9kZSkuam9pbignLycpO2NvbnN0IG5vZGVzPVtdO3RyZWVOb2RlPW9sZE5vZGU7ZG97bm9kZXMucHVzaCh0cmVlTm9kZSk7Y2hpbGRyZW49dHJlZU5vZGUuY2hpbGRyZW4oKTt0cmVlTm9kZT1jaGlsZHJlbi5sZW5ndGg9PT0xP2NoaWxkcmVuWzBdOm51bGw7fXdoaWxlKHRyZWVOb2RlJiZ0cmVlTm9kZS5faXNNZXJnZWQpO2lmKCF0aGlzLmlzUG9wdWxhdGVkKCkpe3RoaXMuX3RyZWVFbGVtZW50LnRpdGxlPXRpdGxlVGV4dDt0aGlzLl90cmVlRWxlbWVudC5zZXROb2RlKHRoaXMpO2ZvcihsZXQgaT0wO2k8bm9kZXMubGVuZ3RoOysraSl7ZGVsZXRlIG5vZGVzW2ldLl90cmVlRWxlbWVudDtkZWxldGUgbm9kZXNbaV0uX2lzTWVyZ2VkO30KcmV0dXJuO30KY29uc3Qgb2xkVHJlZUVsZW1lbnQ9dGhpcy5fdHJlZUVsZW1lbnQ7Y29uc3QgdHJlZUVsZW1lbnQ9dGhpcy5fY3JlYXRlVHJlZUVsZW1lbnQodGl0bGVUZXh0LHRoaXMpO2ZvcihsZXQgaT0wO2k8bWVyZ2VkVG9Ob2Rlcy5sZW5ndGg7KytpKQptZXJnZWRUb05vZGVzW2ldLl90cmVlRWxlbWVudD10cmVlRWxlbWVudDtvbGRUcmVlRWxlbWVudC5wYXJlbnQuYXBwZW5kQ2hpbGQodHJlZUVsZW1lbnQpO29sZFRyZWVFbGVtZW50LnNldE5vZGUobm9kZXNbbm9kZXMubGVuZ3RoLTFdKTtvbGRUcmVlRWxlbWVudC50aXRsZT1ub2Rlcy5tYXAodGl0bGVGb3JOb2RlKS5qb2luKCcvJyk7b2xkVHJlZUVsZW1lbnQucGFyZW50LnJlbW92ZUNoaWxkKG9sZFRyZWVFbGVtZW50KTt0aGlzLl90cmVlRWxlbWVudC5hcHBlbmRDaGlsZChvbGRUcmVlRWxlbWVudCk7aWYob2xkVHJlZUVsZW1lbnQuZXhwYW5kZWQpCnRyZWVFbGVtZW50LmV4cGFuZCgpO30KaWYodGhpcy5pc1BvcHVsYXRlZCgpKQp0aGlzLl90cmVlRWxlbWVudC5hcHBlbmRDaGlsZChub2RlLnRyZWVOb2RlKCkpO30Kd2lsbFJlbW92ZUNoaWxkKG5vZGUpe2lmKG5vZGUuX2lzTWVyZ2VkfHwhdGhpcy5pc1BvcHVsYXRlZCgpKQpyZXR1cm47dGhpcy5fdHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZS5fdHJlZUVsZW1lbnQpO319O1NvdXJjZXMuTmF2aWdhdG9yR3JvdXBUcmVlTm9kZT1jbGFzcyBleHRlbmRzIFNvdXJjZXMuTmF2aWdhdG9yVHJlZU5vZGV7Y29uc3RydWN0b3IobmF2aWdhdG9yVmlldyxwcm9qZWN0LGlkLHR5cGUsdGl0bGUpe3N1cGVyKGlkLHR5cGUpO3RoaXMuX3Byb2plY3Q9cHJvamVjdDt0aGlzLl9uYXZpZ2F0b3JWaWV3PW5hdmlnYXRvclZpZXc7dGhpcy5fdGl0bGU9dGl0bGU7dGhpcy5wb3B1bGF0ZSgpO30Kc2V0SG92ZXJDYWxsYmFjayhob3ZlckNhbGxiYWNrKXt0aGlzLl9ob3ZlckNhbGxiYWNrPWhvdmVyQ2FsbGJhY2s7fQp0cmVlTm9kZSgpe2lmKHRoaXMuX3RyZWVFbGVtZW50KQpyZXR1cm4gdGhpcy5fdHJlZUVsZW1lbnQ7dGhpcy5fdHJlZUVsZW1lbnQ9bmV3IFNvdXJjZXMuTmF2aWdhdG9yRm9sZGVyVHJlZUVsZW1lbnQodGhpcy5fbmF2aWdhdG9yVmlldyx0aGlzLl90eXBlLHRoaXMuX3RpdGxlLHRoaXMuX2hvdmVyQ2FsbGJhY2spO3RoaXMuX3RyZWVFbGVtZW50LnNldE5vZGUodGhpcyk7cmV0dXJuIHRoaXMuX3RyZWVFbGVtZW50O30Kb25hdHRhY2goKXt0aGlzLnVwZGF0ZVRpdGxlKCk7fQp1cGRhdGVUaXRsZSgpe2lmKCF0aGlzLl90cmVlRWxlbWVudHx8dGhpcy5fcHJvamVjdC50eXBlKCkhPT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pCnJldHVybjtjb25zdCBmaWxlU3lzdGVtUGF0aD1QZXJzaXN0ZW5jZS5GaWxlU3lzdGVtV29ya3NwYWNlQmluZGluZy5maWxlU3lzdGVtUGF0aCh0aGlzLl9wcm9qZWN0LmlkKCkpO2NvbnN0IHdhc0FjdGl2ZT10aGlzLl90cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoYXMtbWFwcGVkLWZpbGVzJyk7Y29uc3QgaXNBY3RpdmU9UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuZmlsZVBhdGhIYXNCaW5kaW5ncyhmaWxlU3lzdGVtUGF0aCk7aWYod2FzQWN0aXZlPT09aXNBY3RpdmUpCnJldHVybjt0aGlzLl90cmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGFzLW1hcHBlZC1maWxlcycsaXNBY3RpdmUpO2lmKHRoaXMuX3RyZWVFbGVtZW50LmNoaWxkcmVuTGlzdEVsZW1lbnQuaGFzRm9jdXMoKSkKcmV0dXJuO2lmKGlzQWN0aXZlKQp0aGlzLl90cmVlRWxlbWVudC5leHBhbmQoKTtlbHNlCnRoaXMuX3RyZWVFbGVtZW50LmNvbGxhcHNlKCk7fQpzZXRUaXRsZSh0aXRsZSl7dGhpcy5fdGl0bGU9dGl0bGU7aWYodGhpcy5fdHJlZUVsZW1lbnQpCnRoaXMuX3RyZWVFbGVtZW50LnRpdGxlPXRoaXMuX3RpdGxlO319OztTb3VyY2VzLlNjb3BlQ2hhaW5TaWRlYmFyUGFuZT1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZXMvc2NvcGVDaGFpblNpZGViYXJQYW5lLmNzcycpO3RoaXMuX2V4cGFuZENvbnRyb2xsZXI9bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uRXhwYW5kQ29udHJvbGxlcigpO3RoaXMuX2xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoKTt0aGlzLl91cGRhdGUoKTt9CmZsYXZvckNoYW5nZWQob2JqZWN0KXt0aGlzLl91cGRhdGUoKTt9Cl91cGRhdGUoKXtjb25zdCBjYWxsRnJhbWU9VUkuY29udGV4dC5mbGF2b3IoU0RLLkRlYnVnZ2VyTW9kZWwuQ2FsbEZyYW1lKTtjb25zdCBkZXRhaWxzPVVJLmNvbnRleHQuZmxhdm9yKFNESy5EZWJ1Z2dlclBhdXNlZERldGFpbHMpO3RoaXMuX2xpbmtpZmllci5yZXNldCgpO1NvdXJjZXMuU291cmNlTWFwTmFtZXNSZXNvbHZlci5yZXNvbHZlVGhpc09iamVjdChjYWxsRnJhbWUpLnRoZW4odGhpcy5faW5uZXJVcGRhdGUuYmluZCh0aGlzLGRldGFpbHMsY2FsbEZyYW1lKSk7fQpfaW5uZXJVcGRhdGUoZGV0YWlscyxjYWxsRnJhbWUsdGhpc09iamVjdCl7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2lmKCFkZXRhaWxzfHwhY2FsbEZyYW1lKXtjb25zdCBpbmZvRWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtpbmZvRWxlbWVudC5jbGFzc05hbWU9J2dyYXktaW5mby1tZXNzYWdlJztpbmZvRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ05vdCBwYXVzZWQnKTt0aGlzLmNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGluZm9FbGVtZW50KTtyZXR1cm47fQpsZXQgZm91bmRMb2NhbFNjb3BlPWZhbHNlO2NvbnN0IHNjb3BlQ2hhaW49Y2FsbEZyYW1lLnNjb3BlQ2hhaW4oKTtmb3IobGV0IGk9MDtpPHNjb3BlQ2hhaW4ubGVuZ3RoOysraSl7Y29uc3Qgc2NvcGU9c2NvcGVDaGFpbltpXTtsZXQgdGl0bGU9c2NvcGUudHlwZU5hbWUoKTtsZXQgZW1wdHlQbGFjZWhvbGRlcj1udWxsO2NvbnN0IGV4dHJhUHJvcGVydGllcz1bXTtzd2l0Y2goc2NvcGUudHlwZSgpKXtjYXNlIFByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5Mb2NhbDpmb3VuZExvY2FsU2NvcGU9dHJ1ZTtlbXB0eVBsYWNlaG9sZGVyPUNvbW1vbi5VSVN0cmluZygnTm8gdmFyaWFibGVzJyk7aWYodGhpc09iamVjdCkKZXh0cmFQcm9wZXJ0aWVzLnB1c2gobmV3IFNESy5SZW1vdGVPYmplY3RQcm9wZXJ0eSgndGhpcycsdGhpc09iamVjdCkpO2lmKGk9PT0wKXtjb25zdCBleGNlcHRpb249ZGV0YWlscy5leGNlcHRpb24oKTtpZihleGNlcHRpb24pe2V4dHJhUHJvcGVydGllcy5wdXNoKG5ldyBTREsuUmVtb3RlT2JqZWN0UHJvcGVydHkoQ29tbW9uLlVJU3RyaW5nKCdFeGNlcHRpb24nKSxleGNlcHRpb24sdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx0cnVlKSk7fQpjb25zdCByZXR1cm5WYWx1ZT1jYWxsRnJhbWUucmV0dXJuVmFsdWUoKTtpZihyZXR1cm5WYWx1ZSl7ZXh0cmFQcm9wZXJ0aWVzLnB1c2gobmV3IFNESy5SZW1vdGVPYmplY3RQcm9wZXJ0eShDb21tb24uVUlTdHJpbmcoJ1JldHVybiB2YWx1ZScpLHJldHVyblZhbHVlLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdHJ1ZSxjYWxsRnJhbWUuc2V0UmV0dXJuVmFsdWUuYmluZChjYWxsRnJhbWUpKSk7fX0KYnJlYWs7Y2FzZSBQcm90b2NvbC5EZWJ1Z2dlci5TY29wZVR5cGUuQ2xvc3VyZTpjb25zdCBzY29wZU5hbWU9c2NvcGUubmFtZSgpO2lmKHNjb3BlTmFtZSkKdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdDbG9zdXJlICglcyknLFVJLmJlYXV0aWZ5RnVuY3Rpb25OYW1lKHNjb3BlTmFtZSkpO2Vsc2UKdGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdDbG9zdXJlJyk7ZW1wdHlQbGFjZWhvbGRlcj1Db21tb24uVUlTdHJpbmcoJ05vIHZhcmlhYmxlcycpO2JyZWFrO30KbGV0IHN1YnRpdGxlPXNjb3BlLmRlc2NyaXB0aW9uKCk7aWYoIXRpdGxlfHx0aXRsZT09PXN1YnRpdGxlKQpzdWJ0aXRsZT11bmRlZmluZWQ7Y29uc3QgdGl0bGVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3Njb3BlLWNoYWluLXNpZGViYXItcGFuZS1zZWN0aW9uLWhlYWRlcicpO3RpdGxlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc2NvcGUtY2hhaW4tc2lkZWJhci1wYW5lLXNlY3Rpb24tc3VidGl0bGUnKS50ZXh0Q29udGVudD1zdWJ0aXRsZTt0aXRsZUVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Njb3BlLWNoYWluLXNpZGViYXItcGFuZS1zZWN0aW9uLXRpdGxlJykudGV4dENvbnRlbnQ9dGl0bGU7Y29uc3Qgc2VjdGlvbj1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24oU291cmNlcy5Tb3VyY2VNYXBOYW1lc1Jlc29sdmVyLnJlc29sdmVTY29wZUluT2JqZWN0KHNjb3BlKSx0aXRsZUVsZW1lbnQsdGhpcy5fbGlua2lmaWVyLGVtcHR5UGxhY2Vob2xkZXIsdHJ1ZSxleHRyYVByb3BlcnRpZXMpO3RoaXMuX2V4cGFuZENvbnRyb2xsZXIud2F0Y2hTZWN0aW9uKHRpdGxlKyhzdWJ0aXRsZT8nOicrc3VidGl0bGU6JycpLHNlY3Rpb24pO2lmKHNjb3BlLnR5cGUoKT09PVByb3RvY29sLkRlYnVnZ2VyLlNjb3BlVHlwZS5HbG9iYWwpCnNlY3Rpb24ub2JqZWN0VHJlZUVsZW1lbnQoKS5jb2xsYXBzZSgpO2Vsc2UgaWYoIWZvdW5kTG9jYWxTY29wZXx8c2NvcGUudHlwZSgpPT09UHJvdG9jb2wuRGVidWdnZXIuU2NvcGVUeXBlLkxvY2FsKQpzZWN0aW9uLm9iamVjdFRyZWVFbGVtZW50KCkuZXhwYW5kKCk7c2VjdGlvbi5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Njb3BlLWNoYWluLXNpZGViYXItcGFuZS1zZWN0aW9uJyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChzZWN0aW9uLmVsZW1lbnQpO30KdGhpcy5fc2lkZWJhclBhbmVVcGRhdGVkRm9yVGVzdCgpO30KX3NpZGViYXJQYW5lVXBkYXRlZEZvclRlc3QoKXt9fTtTb3VyY2VzLlNjb3BlQ2hhaW5TaWRlYmFyUGFuZS5fcGF0aFN5bWJvbD1TeW1ib2woJ3BhdGgnKTs7U291cmNlcy5OZXR3b3JrTmF2aWdhdG9yVmlldz1jbGFzcyBleHRlbmRzIFNvdXJjZXMuTmF2aWdhdG9yVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzLl9pbnNwZWN0ZWRVUkxDaGFuZ2VkLHRoaXMpO30KYWNjZXB0UHJvamVjdChwcm9qZWN0KXtyZXR1cm4gcHJvamVjdC50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLk5ldHdvcms7fQpfaW5zcGVjdGVkVVJMQ2hhbmdlZChldmVudCl7Y29uc3QgbWFpblRhcmdldD1TREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7aWYoZXZlbnQuZGF0YSE9PW1haW5UYXJnZXQpCnJldHVybjtjb25zdCBpbnNwZWN0ZWRVUkw9bWFpblRhcmdldCYmbWFpblRhcmdldC5pbnNwZWN0ZWRVUkwoKTtpZighaW5zcGVjdGVkVVJMKQpyZXR1cm47Zm9yKGNvbnN0IHVpU291cmNlQ29kZSBvZiB0aGlzLndvcmtzcGFjZSgpLnVpU291cmNlQ29kZXMoKSl7aWYodGhpcy5hY2NlcHRQcm9qZWN0KHVpU291cmNlQ29kZS5wcm9qZWN0KCkpJiZ1aVNvdXJjZUNvZGUudXJsKCk9PT1pbnNwZWN0ZWRVUkwpCnRoaXMucmV2ZWFsVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSx0cnVlKTt9fQp1aVNvdXJjZUNvZGVBZGRlZCh1aVNvdXJjZUNvZGUpe2NvbnN0IG1haW5UYXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO2NvbnN0IGluc3BlY3RlZFVSTD1tYWluVGFyZ2V0JiZtYWluVGFyZ2V0Lmluc3BlY3RlZFVSTCgpO2lmKCFpbnNwZWN0ZWRVUkwpCnJldHVybjtpZih1aVNvdXJjZUNvZGUudXJsKCk9PT1pbnNwZWN0ZWRVUkwpCnRoaXMucmV2ZWFsVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSx0cnVlKTt9fTtTb3VyY2VzLkZpbGVzTmF2aWdhdG9yVmlldz1jbGFzcyBleHRlbmRzIFNvdXJjZXMuTmF2aWdhdG9yVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignbmF2aWdhdG9yLXRvb2xiYXInKTtjb25zdCB0aXRsZT1Db21tb24uVUlTdHJpbmcoJ0FkZCBmb2xkZXIgdG8gd29ya3NwYWNlJyk7Y29uc3QgYWRkQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKHRpdGxlLCdsYXJnZWljb24tYWRkJyx0aXRsZSk7YWRkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssKCk9PlBlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuYWRkRmlsZVN5c3RlbSgpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGFkZEJ1dHRvbik7dGhpcy5jb250ZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodG9vbGJhci5lbGVtZW50LHRoaXMuY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCk7fQphY2NlcHRQcm9qZWN0KHByb2plY3Qpe3JldHVybiBwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSYmUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuZmlsZVN5c3RlbVR5cGUocHJvamVjdCkhPT0nb3ZlcnJpZGVzJzt9CmhhbmRsZUNvbnRleHRNZW51KGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO1NvdXJjZXMuTmF2aWdhdG9yVmlldy5hcHBlbmRBZGRGb2xkZXJJdGVtKGNvbnRleHRNZW51KTtjb250ZXh0TWVudS5zaG93KCk7fX07U291cmNlcy5PdmVycmlkZXNOYXZpZ2F0b3JWaWV3PWNsYXNzIGV4dGVuZHMgU291cmNlcy5OYXZpZ2F0b3JWaWV3e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl90b29sYmFyPW5ldyBVSS5Ub29sYmFyKCduYXZpZ2F0b3ItdG9vbGJhcicpO3RoaXMuY29udGVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX3Rvb2xiYXIuZWxlbWVudCx0aGlzLmNvbnRlbnRFbGVtZW50Lmxhc3RDaGlsZCk7UGVyc2lzdGVuY2UubmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFBlcnNpc3RlbmNlLk5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIuRXZlbnRzLlByb2plY3RDaGFuZ2VkLHRoaXMuX3VwZGF0ZVByb2plY3RBbmRVSSx0aGlzKTt0aGlzLndvcmtzcGFjZSgpLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdEFkZGVkLHRoaXMuX29uUHJvamVjdEFkZE9yUmVtb3ZlZCx0aGlzKTt0aGlzLndvcmtzcGFjZSgpLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdFJlbW92ZWQsdGhpcy5fb25Qcm9qZWN0QWRkT3JSZW1vdmVkLHRoaXMpO3RoaXMuX3VwZGF0ZVByb2plY3RBbmRVSSgpO30KX29uUHJvamVjdEFkZE9yUmVtb3ZlZChldmVudCl7Y29uc3QgcHJvamVjdD0oZXZlbnQuZGF0YSk7aWYocHJvamVjdCYmcHJvamVjdC50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0mJlBlcnNpc3RlbmNlLkZpbGVTeXN0ZW1Xb3Jrc3BhY2VCaW5kaW5nLmZpbGVTeXN0ZW1UeXBlKHByb2plY3QpIT09J292ZXJyaWRlcycpCnJldHVybjt0aGlzLl91cGRhdGVVSSgpO30KX3VwZGF0ZVByb2plY3RBbmRVSSgpe3RoaXMucmVzZXQoKTtjb25zdCBwcm9qZWN0PVBlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIucHJvamVjdCgpO2lmKHByb2plY3QpCnRoaXMudHJ5QWRkUHJvamVjdChwcm9qZWN0KTt0aGlzLl91cGRhdGVVSSgpO30KX3VwZGF0ZVVJKCl7dGhpcy5fdG9vbGJhci5yZW1vdmVUb29sYmFySXRlbXMoKTtjb25zdCBwcm9qZWN0PVBlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIucHJvamVjdCgpO2lmKHByb2plY3Qpe2NvbnN0IGVuYWJsZUNoZWNrYm94PW5ldyBVSS5Ub29sYmFyU2V0dGluZ0NoZWNrYm94KENvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdwZXJzaXN0ZW5jZU5ldHdvcmtPdmVycmlkZXNFbmFibGVkJykpO3RoaXMuX3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oZW5hYmxlQ2hlY2tib3gpO3RoaXMuX3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0obmV3IFVJLlRvb2xiYXJTZXBhcmF0b3IodHJ1ZSkpO2NvbnN0IGNsZWFyQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnQ2xlYXIgY29uZmlndXJhdGlvbicpLCdsYXJnZWljb24tY2xlYXInKTtjbGVhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT57cHJvamVjdC5yZW1vdmUoKTt9KTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKGNsZWFyQnV0dG9uKTtyZXR1cm47fQpjb25zdCB0aXRsZT1Db21tb24uVUlTdHJpbmcoJ1NlbGVjdCBmb2xkZXIgZm9yIG92ZXJyaWRlcycpO2NvbnN0IHNldHVwQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKHRpdGxlLCdsYXJnZWljb24tYWRkJyx0aXRsZSk7c2V0dXBCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl9zZXR1cE5ld1dvcmtzcGFjZSx0aGlzKTt0aGlzLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHNldHVwQnV0dG9uKTt9CmFzeW5jIF9zZXR1cE5ld1dvcmtzcGFjZSgpe2NvbnN0IGZpbGVTeXN0ZW09YXdhaXQgUGVyc2lzdGVuY2UuaXNvbGF0ZWRGaWxlU3lzdGVtTWFuYWdlci5hZGRGaWxlU3lzdGVtKCdvdmVycmlkZXMnKTtpZighZmlsZVN5c3RlbSkKcmV0dXJuO0NvbW1vbi5zZXR0aW5ncy5tb2R1bGVTZXR0aW5nKCdwZXJzaXN0ZW5jZU5ldHdvcmtPdmVycmlkZXNFbmFibGVkJykuc2V0KHRydWUpO30KYWNjZXB0UHJvamVjdChwcm9qZWN0KXtyZXR1cm4gcHJvamVjdD09PVBlcnNpc3RlbmNlLm5ldHdvcmtQZXJzaXN0ZW5jZU1hbmFnZXIucHJvamVjdCgpO319O1NvdXJjZXMuQ29udGVudFNjcmlwdHNOYXZpZ2F0b3JWaWV3PWNsYXNzIGV4dGVuZHMgU291cmNlcy5OYXZpZ2F0b3JWaWV3e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt9CmFjY2VwdFByb2plY3QocHJvamVjdCl7cmV0dXJuIHByb2plY3QudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5Db250ZW50U2NyaXB0czt9fTtTb3VyY2VzLlNuaXBwZXRzTmF2aWdhdG9yVmlldz1jbGFzcyBleHRlbmRzIFNvdXJjZXMuTmF2aWdhdG9yVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgdG9vbGJhcj1uZXcgVUkuVG9vbGJhcignbmF2aWdhdG9yLXRvb2xiYXInKTtjb25zdCBuZXdCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oJycsJ2xhcmdlaWNvbi1hZGQnLENvbW1vbi5VSVN0cmluZygnTmV3IHNuaXBwZXQnKSk7bmV3QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5faGFuZGxlQ3JlYXRlU25pcHBldC5iaW5kKHRoaXMpKTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKG5ld0J1dHRvbik7dGhpcy5jb250ZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodG9vbGJhci5lbGVtZW50LHRoaXMuY29udGVudEVsZW1lbnQuZmlyc3RDaGlsZCk7fQphY2NlcHRQcm9qZWN0KHByb2plY3Qpe3JldHVybiBwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU25pcHBldHM7fQpoYW5kbGVDb250ZXh0TWVudShldmVudCl7Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS5oZWFkZXJTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ05ldycpLHRoaXMuX2hhbmRsZUNyZWF0ZVNuaXBwZXQuYmluZCh0aGlzKSk7Y29udGV4dE1lbnUuc2hvdygpO30KaGFuZGxlRmlsZUNvbnRleHRNZW51KGV2ZW50LG5vZGUpe2NvbnN0IHVpU291cmNlQ29kZT1ub2RlLnVpU291cmNlQ29kZSgpO2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuaGVhZGVyU2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSdW4nKSx0aGlzLl9oYW5kbGVFdmFsdWF0ZVNuaXBwZXQuYmluZCh0aGlzLHVpU291cmNlQ29kZSkpO2NvbnRleHRNZW51Lm5ld1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnTmV3JyksdGhpcy5faGFuZGxlQ3JlYXRlU25pcHBldC5iaW5kKHRoaXMpKTtjb250ZXh0TWVudS5lZGl0U2VjdGlvbigpLmFwcGVuZEl0ZW0oQ29tbW9uLlVJU3RyaW5nKCdSZW5hbWUnKSx0aGlzLnJlbmFtZS5iaW5kKHRoaXMsbm9kZSkpO2NvbnRleHRNZW51LmVkaXRTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JlbW92ZScpLHRoaXMuX2hhbmRsZVJlbW92ZVNuaXBwZXQuYmluZCh0aGlzLHVpU291cmNlQ29kZSkpO2NvbnRleHRNZW51LnNhdmVTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1NhdmUgYXMuLi4nKSx0aGlzLl9oYW5kbGVTYXZlQXMuYmluZCh0aGlzLHVpU291cmNlQ29kZSkpO2NvbnRleHRNZW51LnNob3coKTt9Cl9oYW5kbGVFdmFsdWF0ZVNuaXBwZXQodWlTb3VyY2VDb2RlKXtjb25zdCBleGVjdXRpb25Db250ZXh0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5FeGVjdXRpb25Db250ZXh0KTtpZighZXhlY3V0aW9uQ29udGV4dCkKcmV0dXJuO1NuaXBwZXRzLnNjcmlwdFNuaXBwZXRNb2RlbC5ldmFsdWF0ZVNjcmlwdFNuaXBwZXQoZXhlY3V0aW9uQ29udGV4dCx1aVNvdXJjZUNvZGUpO30KYXN5bmMgX2hhbmRsZVNhdmVBcyh1aVNvdXJjZUNvZGUpe2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5TbmlwcGV0cykKcmV0dXJuO3VpU291cmNlQ29kZS5jb21taXRXb3JraW5nQ29weSgpO2NvbnN0IGNvbnRlbnQ9YXdhaXQgdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCk7V29ya3NwYWNlLmZpbGVNYW5hZ2VyLnNhdmUodWlTb3VyY2VDb2RlLnVybCgpLGNvbnRlbnQsdHJ1ZSk7V29ya3NwYWNlLmZpbGVNYW5hZ2VyLmNsb3NlKHVpU291cmNlQ29kZS51cmwoKSk7fQpfaGFuZGxlUmVtb3ZlU25pcHBldCh1aVNvdXJjZUNvZGUpe2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5TbmlwcGV0cykKcmV0dXJuO3VpU291cmNlQ29kZS5yZW1vdmUoKTt9Cl9oYW5kbGVDcmVhdGVTbmlwcGV0KCl7dGhpcy5jcmVhdGUoU25pcHBldHMuc2NyaXB0U25pcHBldE1vZGVsLnByb2plY3QoKSwnJyk7fQpzb3VyY2VEZWxldGVkKHVpU291cmNlQ29kZSl7dGhpcy5faGFuZGxlUmVtb3ZlU25pcHBldCh1aVNvdXJjZUNvZGUpO319O1NvdXJjZXMuU25pcHBldHNOYXZpZ2F0b3JWaWV3LkNyZWF0aW5nQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdzb3VyY2VzLmNyZWF0ZS1zbmlwcGV0Jzpjb25zdCB1aVNvdXJjZUNvZGU9U25pcHBldHMuc2NyaXB0U25pcHBldE1vZGVsLmNyZWF0ZVNjcmlwdFNuaXBwZXQoJycpO0NvbW1vbi5SZXZlYWxlci5yZXZlYWwodWlTb3VyY2VDb2RlKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuYWRkLWZvbGRlci10by13b3Jrc3BhY2UnOlBlcnNpc3RlbmNlLmlzb2xhdGVkRmlsZVN5c3RlbU1hbmFnZXIuYWRkRmlsZVN5c3RlbSgpO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO319OztTb3VyY2VzLk91dGxpbmVRdWlja09wZW49Y2xhc3MgZXh0ZW5kcyBRdWlja09wZW4uRmlsdGVyZWRMaXN0V2lkZ2V0LlByb3ZpZGVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9pdGVtcz1bXTt0aGlzLl9hY3RpdmU9ZmFsc2U7fQphdHRhY2goKXt0aGlzLl9pdGVtcz1bXTt0aGlzLl9hY3RpdmU9ZmFsc2U7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2N1cnJlbnRVSVNvdXJjZUNvZGUoKTtpZih1aVNvdXJjZUNvZGUpe3RoaXMuX2FjdGl2ZT1Gb3JtYXR0ZXIuZm9ybWF0dGVyV29ya2VyUG9vbCgpLm91dGxpbmVGb3JNaW1ldHlwZSh1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSx1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5jYW5vbmljYWxNaW1lVHlwZSgpLHRoaXMuX2RpZEJ1aWxkT3V0bGluZUNodW5rLmJpbmQodGhpcykpO319Cl9kaWRCdWlsZE91dGxpbmVDaHVuayhpc0xhc3RDaHVuayxpdGVtcyl7dGhpcy5faXRlbXMucHVzaCguLi5pdGVtcyk7dGhpcy5yZWZyZXNoKCk7fQppdGVtQ291bnQoKXtyZXR1cm4gdGhpcy5faXRlbXMubGVuZ3RoO30KaXRlbUtleUF0KGl0ZW1JbmRleCl7Y29uc3QgaXRlbT10aGlzLl9pdGVtc1tpdGVtSW5kZXhdO3JldHVybiBpdGVtLnRpdGxlKyhpdGVtLnN1YnRpdGxlP2l0ZW0uc3VidGl0bGU6JycpO30KaXRlbVNjb3JlQXQoaXRlbUluZGV4LHF1ZXJ5KXtjb25zdCBpdGVtPXRoaXMuX2l0ZW1zW2l0ZW1JbmRleF07Y29uc3QgbWV0aG9kTmFtZT1xdWVyeS5zcGxpdCgnKCcpWzBdO2lmKG1ldGhvZE5hbWUudG9Mb3dlckNhc2UoKT09PWl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKSkKcmV0dXJuIDEvKDEraXRlbS5saW5lKTtyZXR1cm4taXRlbS5saW5lLTE7fQpyZW5kZXJJdGVtKGl0ZW1JbmRleCxxdWVyeSx0aXRsZUVsZW1lbnQsc3VidGl0bGVFbGVtZW50KXtjb25zdCBpdGVtPXRoaXMuX2l0ZW1zW2l0ZW1JbmRleF07dGl0bGVFbGVtZW50LnRleHRDb250ZW50PWl0ZW0udGl0bGUrKGl0ZW0uc3VidGl0bGU/aXRlbS5zdWJ0aXRsZTonJyk7UXVpY2tPcGVuLkZpbHRlcmVkTGlzdFdpZGdldC5oaWdobGlnaHRSYW5nZXModGl0bGVFbGVtZW50LHF1ZXJ5KTtzdWJ0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQ9JzonKyhpdGVtLmxpbmUrMSk7fQpzZWxlY3RJdGVtKGl0ZW1JbmRleCxwcm9tcHRWYWx1ZSl7aWYoaXRlbUluZGV4PT09bnVsbCkKcmV0dXJuO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl9jdXJyZW50VUlTb3VyY2VDb2RlKCk7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuO2NvbnN0IGxpbmVOdW1iZXI9dGhpcy5faXRlbXNbaXRlbUluZGV4XS5saW5lO2lmKCFpc05hTihsaW5lTnVtYmVyKSYmbGluZU51bWJlcj49MCkKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLHRoaXMuX2l0ZW1zW2l0ZW1JbmRleF0uY29sdW1uKSk7fQpfY3VycmVudFVJU291cmNlQ29kZSgpe2NvbnN0IHNvdXJjZXNWaWV3PVVJLmNvbnRleHQuZmxhdm9yKFNvdXJjZXMuU291cmNlc1ZpZXcpO2lmKCFzb3VyY2VzVmlldykKcmV0dXJuIG51bGw7cmV0dXJuIHNvdXJjZXNWaWV3LmN1cnJlbnRVSVNvdXJjZUNvZGUoKTt9Cm5vdEZvdW5kVGV4dCgpe2lmKCF0aGlzLl9jdXJyZW50VUlTb3VyY2VDb2RlKCkpCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ05vIGZpbGUgc2VsZWN0ZWQuJyk7aWYoIXRoaXMuX2FjdGl2ZSkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnT3BlbiBhIEphdmFTY3JpcHQgb3IgQ1NTIGZpbGUgdG8gc2VlIHN5bWJvbHMnKTtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdObyByZXN1bHRzIGZvdW5kJyk7fX07O1NvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyRGVsZWdhdGU9ZnVuY3Rpb24oKXt9O1NvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyRGVsZWdhdGUucHJvdG90eXBlPXt2aWV3Rm9yRmlsZSh1aVNvdXJjZUNvZGUpe30scmVjeWNsZVVJU291cmNlQ29kZUZyYW1lKHNvdXJjZUZyYW1lLHVpU291cmNlQ29kZSl7fSx9O1NvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihkZWxlZ2F0ZSxzZXR0aW5nLHBsYWNlaG9sZGVyRWxlbWVudCl7c3VwZXIoKTt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl90YWJiZWRQYW5lPW5ldyBVSS5UYWJiZWRQYW5lKCk7dGhpcy5fdGFiYmVkUGFuZS5zZXRQbGFjZWhvbGRlckVsZW1lbnQocGxhY2Vob2xkZXJFbGVtZW50KTt0aGlzLl90YWJiZWRQYW5lLnNldFRhYkRlbGVnYXRlKG5ldyBTb3VyY2VzLkVkaXRvckNvbnRhaW5lclRhYkRlbGVnYXRlKHRoaXMpKTt0aGlzLl90YWJiZWRQYW5lLnNldENsb3NlYWJsZVRhYnModHJ1ZSk7dGhpcy5fdGFiYmVkUGFuZS5zZXRBbGxvd1RhYlJlb3JkZXIodHJ1ZSx0cnVlKTt0aGlzLl90YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiQ2xvc2VkLHRoaXMuX3RhYkNsb3NlZCx0aGlzKTt0aGlzLl90YWJiZWRQYW5lLmFkZEV2ZW50TGlzdGVuZXIoVUkuVGFiYmVkUGFuZS5FdmVudHMuVGFiU2VsZWN0ZWQsdGhpcy5fdGFiU2VsZWN0ZWQsdGhpcyk7UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYWRkRXZlbnRMaXN0ZW5lcihQZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZS5FdmVudHMuQmluZGluZ0NyZWF0ZWQsdGhpcy5fb25CaW5kaW5nQ3JlYXRlZCx0aGlzKTtQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5hZGRFdmVudExpc3RlbmVyKFBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlLkV2ZW50cy5CaW5kaW5nUmVtb3ZlZCx0aGlzLl9vbkJpbmRpbmdSZW1vdmVkLHRoaXMpO3RoaXMuX3RhYklkcz1uZXcgTWFwKCk7dGhpcy5fZmlsZXM9e307dGhpcy5fcHJldmlvdXNseVZpZXdlZEZpbGVzU2V0dGluZz1zZXR0aW5nO3RoaXMuX2hpc3Rvcnk9U291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuSGlzdG9yeS5mcm9tT2JqZWN0KHRoaXMuX3ByZXZpb3VzbHlWaWV3ZWRGaWxlc1NldHRpbmcuZ2V0KCkpO30KX29uQmluZGluZ0NyZWF0ZWQoZXZlbnQpe2NvbnN0IGJpbmRpbmc9KGV2ZW50LmRhdGEpO3RoaXMuX3VwZGF0ZUZpbGVUaXRsZShiaW5kaW5nLmZpbGVTeXN0ZW0pO2NvbnN0IG5ldHdvcmtUYWJJZD10aGlzLl90YWJJZHMuZ2V0KGJpbmRpbmcubmV0d29yayk7bGV0IGZpbGVTeXN0ZW1UYWJJZD10aGlzLl90YWJJZHMuZ2V0KGJpbmRpbmcuZmlsZVN5c3RlbSk7Y29uc3Qgd2FzU2VsZWN0ZWRJbk5ldHdvcms9dGhpcy5fY3VycmVudEZpbGU9PT1iaW5kaW5nLm5ldHdvcms7Y29uc3QgY3VycmVudFNlbGVjdGlvblJhbmdlPXRoaXMuX2hpc3Rvcnkuc2VsZWN0aW9uUmFuZ2UoYmluZGluZy5uZXR3b3JrLnVybCgpKTtjb25zdCBjdXJyZW50U2Nyb2xsTGluZU51bWJlcj10aGlzLl9oaXN0b3J5LnNjcm9sbExpbmVOdW1iZXIoYmluZGluZy5uZXR3b3JrLnVybCgpKTt0aGlzLl9oaXN0b3J5LnJlbW92ZShiaW5kaW5nLm5ldHdvcmsudXJsKCkpO2lmKCFuZXR3b3JrVGFiSWQpCnJldHVybjtpZighZmlsZVN5c3RlbVRhYklkKXtjb25zdCBuZXR3b3JrVmlldz10aGlzLl90YWJiZWRQYW5lLnRhYlZpZXcobmV0d29ya1RhYklkKTtjb25zdCB0YWJJbmRleD10aGlzLl90YWJiZWRQYW5lLnRhYkluZGV4KG5ldHdvcmtUYWJJZCk7aWYobmV0d29ya1ZpZXcgaW5zdGFuY2VvZiBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKXt0aGlzLl9kZWxlZ2F0ZS5yZWN5Y2xlVUlTb3VyY2VDb2RlRnJhbWUobmV0d29ya1ZpZXcsYmluZGluZy5maWxlU3lzdGVtKTtmaWxlU3lzdGVtVGFiSWQ9dGhpcy5fYXBwZW5kRmlsZVRhYihiaW5kaW5nLmZpbGVTeXN0ZW0sZmFsc2UsdGFiSW5kZXgsbmV0d29ya1ZpZXcpO31lbHNle2ZpbGVTeXN0ZW1UYWJJZD10aGlzLl9hcHBlbmRGaWxlVGFiKGJpbmRpbmcuZmlsZVN5c3RlbSxmYWxzZSx0YWJJbmRleCk7Y29uc3QgZmlsZVN5c3RlbVRhYlZpZXc9KHRoaXMuX3RhYmJlZFBhbmUudGFiVmlldyhmaWxlU3lzdGVtVGFiSWQpKTt0aGlzLl9yZXN0b3JlRWRpdG9yUHJvcGVydGllcyhmaWxlU3lzdGVtVGFiVmlldyxjdXJyZW50U2VsZWN0aW9uUmFuZ2UsY3VycmVudFNjcm9sbExpbmVOdW1iZXIpO319CnRoaXMuX2Nsb3NlVGFicyhbbmV0d29ya1RhYklkXSx0cnVlKTtpZih3YXNTZWxlY3RlZEluTmV0d29yaykKdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIoZmlsZVN5c3RlbVRhYklkLGZhbHNlKTt0aGlzLl91cGRhdGVIaXN0b3J5KCk7fQpfb25CaW5kaW5nUmVtb3ZlZChldmVudCl7Y29uc3QgYmluZGluZz0oZXZlbnQuZGF0YSk7dGhpcy5fdXBkYXRlRmlsZVRpdGxlKGJpbmRpbmcuZmlsZVN5c3RlbSk7fQpnZXQgdmlldygpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lO30KZ2V0IHZpc2libGVWaWV3KCl7cmV0dXJuIHRoaXMuX3RhYmJlZFBhbmUudmlzaWJsZVZpZXc7fQpmaWxlVmlld3MoKXtyZXR1cm4odGhpcy5fdGFiYmVkUGFuZS50YWJWaWV3cygpKTt9CmxlZnRUb29sYmFyKCl7cmV0dXJuIHRoaXMuX3RhYmJlZFBhbmUubGVmdFRvb2xiYXIoKTt9CnJpZ2h0VG9vbGJhcigpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lLnJpZ2h0VG9vbGJhcigpO30Kc2hvdyhwYXJlbnRFbGVtZW50KXt0aGlzLl90YWJiZWRQYW5lLnNob3cocGFyZW50RWxlbWVudCk7fQpzaG93RmlsZSh1aVNvdXJjZUNvZGUpe3RoaXMuX2lubmVyU2hvd0ZpbGUodWlTb3VyY2VDb2RlLHRydWUpO30KY2xvc2VGaWxlKHVpU291cmNlQ29kZSl7Y29uc3QgdGFiSWQ9dGhpcy5fdGFiSWRzLmdldCh1aVNvdXJjZUNvZGUpO2lmKCF0YWJJZCkKcmV0dXJuO3RoaXMuX2Nsb3NlVGFicyhbdGFiSWRdKTt9CmNsb3NlQWxsRmlsZXMoKXt0aGlzLl9jbG9zZVRhYnModGhpcy5fdGFiYmVkUGFuZS5hbGxUYWJzKCkpO30KaGlzdG9yeVVJU291cmNlQ29kZXMoKXtjb25zdCB1cmlUb1VJU291cmNlQ29kZT17fTtmb3IoY29uc3QgaWQgaW4gdGhpcy5fZmlsZXMpe2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl9maWxlc1tpZF07dXJpVG9VSVNvdXJjZUNvZGVbdWlTb3VyY2VDb2RlLnVybCgpXT11aVNvdXJjZUNvZGU7fQpjb25zdCByZXN1bHQ9W107Y29uc3QgdXJpcz10aGlzLl9oaXN0b3J5Ll91cmxzKCk7Zm9yKGxldCBpPTA7aTx1cmlzLmxlbmd0aDsrK2kpe2NvbnN0IHVpU291cmNlQ29kZT11cmlUb1VJU291cmNlQ29kZVt1cmlzW2ldXTtpZih1aVNvdXJjZUNvZGUpCnJlc3VsdC5wdXNoKHVpU291cmNlQ29kZSk7fQpyZXR1cm4gcmVzdWx0O30KX2FkZFZpZXdMaXN0ZW5lcnMoKXtpZighdGhpcy5fY3VycmVudFZpZXd8fCF0aGlzLl9jdXJyZW50Vmlldy50ZXh0RWRpdG9yKQpyZXR1cm47dGhpcy5fY3VycmVudFZpZXcudGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5TY3JvbGxDaGFuZ2VkLHRoaXMuX3Njcm9sbENoYW5nZWQsdGhpcyk7dGhpcy5fY3VycmVudFZpZXcudGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFNvdXJjZUZyYW1lLlNvdXJjZXNUZXh0RWRpdG9yLkV2ZW50cy5TZWxlY3Rpb25DaGFuZ2VkLHRoaXMuX3NlbGVjdGlvbkNoYW5nZWQsdGhpcyk7fQpfcmVtb3ZlVmlld0xpc3RlbmVycygpe2lmKCF0aGlzLl9jdXJyZW50Vmlld3x8IXRoaXMuX2N1cnJlbnRWaWV3LnRleHRFZGl0b3IpCnJldHVybjt0aGlzLl9jdXJyZW50Vmlldy50ZXh0RWRpdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoU291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuRXZlbnRzLlNjcm9sbENoYW5nZWQsdGhpcy5fc2Nyb2xsQ2hhbmdlZCx0aGlzKTt0aGlzLl9jdXJyZW50Vmlldy50ZXh0RWRpdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoU291cmNlRnJhbWUuU291cmNlc1RleHRFZGl0b3IuRXZlbnRzLlNlbGVjdGlvbkNoYW5nZWQsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZCx0aGlzKTt9Cl9zY3JvbGxDaGFuZ2VkKGV2ZW50KXtpZih0aGlzLl9zY3JvbGxUaW1lcikKY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVyKTtjb25zdCBsaW5lTnVtYmVyPShldmVudC5kYXRhKTt0aGlzLl9zY3JvbGxUaW1lcj1zZXRUaW1lb3V0KHNhdmVIaXN0b3J5LmJpbmQodGhpcyksMTAwKTt0aGlzLl9oaXN0b3J5LnVwZGF0ZVNjcm9sbExpbmVOdW1iZXIodGhpcy5fY3VycmVudEZpbGUudXJsKCksbGluZU51bWJlcik7ZnVuY3Rpb24gc2F2ZUhpc3RvcnkoKXt0aGlzLl9oaXN0b3J5LnNhdmUodGhpcy5fcHJldmlvdXNseVZpZXdlZEZpbGVzU2V0dGluZyk7fX0KX3NlbGVjdGlvbkNoYW5nZWQoZXZlbnQpe2NvbnN0IHJhbmdlPShldmVudC5kYXRhKTt0aGlzLl9oaXN0b3J5LnVwZGF0ZVNlbGVjdGlvblJhbmdlKHRoaXMuX2N1cnJlbnRGaWxlLnVybCgpLHJhbmdlKTt0aGlzLl9oaXN0b3J5LnNhdmUodGhpcy5fcHJldmlvdXNseVZpZXdlZEZpbGVzU2V0dGluZyk7RXh0ZW5zaW9ucy5leHRlbnNpb25TZXJ2ZXIuc291cmNlU2VsZWN0aW9uQ2hhbmdlZCh0aGlzLl9jdXJyZW50RmlsZS51cmwoKSxyYW5nZSk7fQpfaW5uZXJTaG93RmlsZSh1aVNvdXJjZUNvZGUsdXNlckdlc3R1cmUpe2NvbnN0IGJpbmRpbmc9UGVyc2lzdGVuY2UucGVyc2lzdGVuY2UuYmluZGluZyh1aVNvdXJjZUNvZGUpO3VpU291cmNlQ29kZT1iaW5kaW5nP2JpbmRpbmcuZmlsZVN5c3RlbTp1aVNvdXJjZUNvZGU7aWYodGhpcy5fY3VycmVudEZpbGU9PT11aVNvdXJjZUNvZGUpCnJldHVybjt0aGlzLl9yZW1vdmVWaWV3TGlzdGVuZXJzKCk7dGhpcy5fY3VycmVudEZpbGU9dWlTb3VyY2VDb2RlO2NvbnN0IHRhYklkPXRoaXMuX3RhYklkcy5nZXQodWlTb3VyY2VDb2RlKXx8dGhpcy5fYXBwZW5kRmlsZVRhYih1aVNvdXJjZUNvZGUsdXNlckdlc3R1cmUpO3RoaXMuX3RhYmJlZFBhbmUuc2VsZWN0VGFiKHRhYklkLHVzZXJHZXN0dXJlKTtpZih1c2VyR2VzdHVyZSkKdGhpcy5fZWRpdG9yU2VsZWN0ZWRCeVVzZXJBY3Rpb24oKTtjb25zdCBwcmV2aW91c1ZpZXc9dGhpcy5fY3VycmVudFZpZXc7dGhpcy5fY3VycmVudFZpZXc9dGhpcy52aXNpYmxlVmlldzt0aGlzLl9hZGRWaWV3TGlzdGVuZXJzKCk7Y29uc3QgZXZlbnREYXRhPXtjdXJyZW50RmlsZTp0aGlzLl9jdXJyZW50RmlsZSxjdXJyZW50Vmlldzp0aGlzLl9jdXJyZW50VmlldyxwcmV2aW91c1ZpZXc6cHJldmlvdXNWaWV3LHVzZXJHZXN0dXJlOnVzZXJHZXN0dXJlfTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5FdmVudHMuRWRpdG9yU2VsZWN0ZWQsZXZlbnREYXRhKTt9Cl90aXRsZUZvckZpbGUodWlTb3VyY2VDb2RlKXtjb25zdCBtYXhEaXNwbGF5TmFtZUxlbmd0aD0zMDtsZXQgdGl0bGU9dWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKHRydWUpLnRyaW1NaWRkbGUobWF4RGlzcGxheU5hbWVMZW5ndGgpO2lmKHVpU291cmNlQ29kZS5pc0RpcnR5KCkpCnRpdGxlKz0nKic7cmV0dXJuIHRpdGxlO30KX21heWJlQ2xvc2VUYWIoaWQsbmV4dFRhYklkKXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fZmlsZXNbaWRdO2NvbnN0IHNob3VsZFByb21wdD11aVNvdXJjZUNvZGUuaXNEaXJ0eSgpJiZ1aVNvdXJjZUNvZGUucHJvamVjdCgpLmNhblNldEZpbGVDb250ZW50KCk7aWYoIXNob3VsZFByb21wdHx8Y29uZmlybShDb21tb24uVUlTdHJpbmcoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZSB1bnNhdmVkIGZpbGU6ICVzPycsdWlTb3VyY2VDb2RlLm5hbWUoKSkpKXt1aVNvdXJjZUNvZGUucmVzZXRXb3JraW5nQ29weSgpO2lmKG5leHRUYWJJZCkKdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIobmV4dFRhYklkLHRydWUpO3RoaXMuX3RhYmJlZFBhbmUuY2xvc2VUYWIoaWQsdHJ1ZSk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQpfY2xvc2VUYWJzKGlkcyxmb3JjZUNsb3NlRGlydHlUYWJzKXtjb25zdCBkaXJ0eVRhYnM9W107Y29uc3QgY2xlYW5UYWJzPVtdO2ZvcihsZXQgaT0wO2k8aWRzLmxlbmd0aDsrK2kpe2NvbnN0IGlkPWlkc1tpXTtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fZmlsZXNbaWRdO2lmKCFmb3JjZUNsb3NlRGlydHlUYWJzJiZ1aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKQpkaXJ0eVRhYnMucHVzaChpZCk7ZWxzZQpjbGVhblRhYnMucHVzaChpZCk7fQppZihkaXJ0eVRhYnMubGVuZ3RoKQp0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYihkaXJ0eVRhYnNbMF0sdHJ1ZSk7dGhpcy5fdGFiYmVkUGFuZS5jbG9zZVRhYnMoY2xlYW5UYWJzLHRydWUpO2ZvcihsZXQgaT0wO2k8ZGlydHlUYWJzLmxlbmd0aDsrK2kpe2NvbnN0IG5leHRUYWJJZD1pKzE8ZGlydHlUYWJzLmxlbmd0aD9kaXJ0eVRhYnNbaSsxXTpudWxsO2lmKCF0aGlzLl9tYXliZUNsb3NlVGFiKGRpcnR5VGFic1tpXSxuZXh0VGFiSWQpKQpicmVhazt9fQpfb25Db250ZXh0TWVudSh0YWJJZCxjb250ZXh0TWVudSl7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2ZpbGVzW3RhYklkXTtpZih1aVNvdXJjZUNvZGUpCmNvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyh1aVNvdXJjZUNvZGUpO30KYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7dWlTb3VyY2VDb2RlPWJpbmRpbmc/YmluZGluZy5maWxlU3lzdGVtOnVpU291cmNlQ29kZTtpZih0aGlzLl9jdXJyZW50RmlsZT09PXVpU291cmNlQ29kZSkKcmV0dXJuO2NvbnN0IHVyaT11aVNvdXJjZUNvZGUudXJsKCk7Y29uc3QgaW5kZXg9dGhpcy5faGlzdG9yeS5pbmRleCh1cmkpO2lmKGluZGV4PT09LTEpCnJldHVybjtpZighdGhpcy5fdGFiSWRzLmhhcyh1aVNvdXJjZUNvZGUpKQp0aGlzLl9hcHBlbmRGaWxlVGFiKHVpU291cmNlQ29kZSxmYWxzZSk7aWYoIWluZGV4KXt0aGlzLl9pbm5lclNob3dGaWxlKHVpU291cmNlQ29kZSxmYWxzZSk7cmV0dXJuO30KaWYoIXRoaXMuX2N1cnJlbnRGaWxlKQpyZXR1cm47Y29uc3QgY3VycmVudFByb2plY3RUeXBlPXRoaXMuX2N1cnJlbnRGaWxlLnByb2plY3QoKS50eXBlKCk7Y29uc3QgYWRkZWRQcm9qZWN0VHlwZT11aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKTtjb25zdCBzbmlwcGV0c1Byb2plY3RUeXBlPVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU25pcHBldHM7aWYodGhpcy5faGlzdG9yeS5pbmRleCh0aGlzLl9jdXJyZW50RmlsZS51cmwoKSkmJmN1cnJlbnRQcm9qZWN0VHlwZT09PXNuaXBwZXRzUHJvamVjdFR5cGUmJmFkZGVkUHJvamVjdFR5cGUhPT1zbmlwcGV0c1Byb2plY3RUeXBlKQp0aGlzLl9pbm5lclNob3dGaWxlKHVpU291cmNlQ29kZSxmYWxzZSk7fQpyZW1vdmVVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXt0aGlzLnJlbW92ZVVJU291cmNlQ29kZXMoW3VpU291cmNlQ29kZV0pO30KcmVtb3ZlVUlTb3VyY2VDb2Rlcyh1aVNvdXJjZUNvZGVzKXtjb25zdCB0YWJJZHM9W107Zm9yKGxldCBpPTA7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpe2NvbnN0IHVpU291cmNlQ29kZT11aVNvdXJjZUNvZGVzW2ldO2NvbnN0IHRhYklkPXRoaXMuX3RhYklkcy5nZXQodWlTb3VyY2VDb2RlKTtpZih0YWJJZCkKdGFiSWRzLnB1c2godGFiSWQpO30KdGhpcy5fdGFiYmVkUGFuZS5jbG9zZVRhYnModGFiSWRzKTt9Cl9lZGl0b3JDbG9zZWRCeVVzZXJBY3Rpb24odWlTb3VyY2VDb2RlKXt0aGlzLl9oaXN0b3J5LnJlbW92ZSh1aVNvdXJjZUNvZGUudXJsKCkpO3RoaXMuX3VwZGF0ZUhpc3RvcnkoKTt9Cl9lZGl0b3JTZWxlY3RlZEJ5VXNlckFjdGlvbigpe3RoaXMuX3VwZGF0ZUhpc3RvcnkoKTt9Cl91cGRhdGVIaXN0b3J5KCl7Y29uc3QgdGFiSWRzPXRoaXMuX3RhYmJlZFBhbmUubGFzdE9wZW5lZFRhYklkcyhTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5tYXhpbWFsUHJldmlvdXNseVZpZXdlZEZpbGVzQ291bnQpO2Z1bmN0aW9uIHRhYklkVG9VUkkodGFiSWQpe3JldHVybiB0aGlzLl9maWxlc1t0YWJJZF0udXJsKCk7fQp0aGlzLl9oaXN0b3J5LnVwZGF0ZSh0YWJJZHMubWFwKHRhYklkVG9VUkkuYmluZCh0aGlzKSkpO3RoaXMuX2hpc3Rvcnkuc2F2ZSh0aGlzLl9wcmV2aW91c2x5Vmlld2VkRmlsZXNTZXR0aW5nKTt9Cl90b29sdGlwRm9yRmlsZSh1aVNvdXJjZUNvZGUpe3VpU291cmNlQ29kZT1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5uZXR3b3JrKHVpU291cmNlQ29kZSl8fHVpU291cmNlQ29kZTtyZXR1cm4gdWlTb3VyY2VDb2RlLnVybCgpO30KX2FwcGVuZEZpbGVUYWIodWlTb3VyY2VDb2RlLHVzZXJHZXN0dXJlLGluZGV4LHJlcGxhY2VWaWV3KXtjb25zdCB2aWV3PXJlcGxhY2VWaWV3fHx0aGlzLl9kZWxlZ2F0ZS52aWV3Rm9yRmlsZSh1aVNvdXJjZUNvZGUpO2NvbnN0IHRpdGxlPXRoaXMuX3RpdGxlRm9yRmlsZSh1aVNvdXJjZUNvZGUpO2NvbnN0IHRvb2x0aXA9dGhpcy5fdG9vbHRpcEZvckZpbGUodWlTb3VyY2VDb2RlKTtjb25zdCB0YWJJZD10aGlzLl9nZW5lcmF0ZVRhYklkKCk7dGhpcy5fdGFiSWRzLnNldCh1aVNvdXJjZUNvZGUsdGFiSWQpO3RoaXMuX2ZpbGVzW3RhYklkXT11aVNvdXJjZUNvZGU7aWYoIXJlcGxhY2VWaWV3KXtjb25zdCBzYXZlZFNlbGVjdGlvblJhbmdlPXRoaXMuX2hpc3Rvcnkuc2VsZWN0aW9uUmFuZ2UodWlTb3VyY2VDb2RlLnVybCgpKTtjb25zdCBzYXZlZFNjcm9sbExpbmVOdW1iZXI9dGhpcy5faGlzdG9yeS5zY3JvbGxMaW5lTnVtYmVyKHVpU291cmNlQ29kZS51cmwoKSk7dGhpcy5fcmVzdG9yZUVkaXRvclByb3BlcnRpZXModmlldyxzYXZlZFNlbGVjdGlvblJhbmdlLHNhdmVkU2Nyb2xsTGluZU51bWJlcik7fQp0aGlzLl90YWJiZWRQYW5lLmFwcGVuZFRhYih0YWJJZCx0aXRsZSx2aWV3LHRvb2x0aXAsdXNlckdlc3R1cmUsdW5kZWZpbmVkLGluZGV4KTt0aGlzLl91cGRhdGVGaWxlVGl0bGUodWlTb3VyY2VDb2RlKTt0aGlzLl9hZGRVSVNvdXJjZUNvZGVMaXN0ZW5lcnModWlTb3VyY2VDb2RlKTtyZXR1cm4gdGFiSWQ7fQpfcmVzdG9yZUVkaXRvclByb3BlcnRpZXMoZWRpdG9yVmlldyxzZWxlY3Rpb24sZmlyc3RMaW5lTnVtYmVyKXtjb25zdCBzb3VyY2VGcmFtZT1lZGl0b3JWaWV3IGluc3RhbmNlb2YgU291cmNlRnJhbWUuU291cmNlRnJhbWU/KGVkaXRvclZpZXcpOm51bGw7aWYoIXNvdXJjZUZyYW1lKQpyZXR1cm47aWYoc2VsZWN0aW9uKQpzb3VyY2VGcmFtZS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtpZih0eXBlb2YgZmlyc3RMaW5lTnVtYmVyPT09J251bWJlcicpCnNvdXJjZUZyYW1lLnNjcm9sbFRvTGluZShmaXJzdExpbmVOdW1iZXIpO30KX3RhYkNsb3NlZChldmVudCl7Y29uc3QgdGFiSWQ9KGV2ZW50LmRhdGEudGFiSWQpO2NvbnN0IHVzZXJHZXN0dXJlPShldmVudC5kYXRhLmlzVXNlckdlc3R1cmUpO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl9maWxlc1t0YWJJZF07aWYodGhpcy5fY3VycmVudEZpbGU9PT11aVNvdXJjZUNvZGUpe3RoaXMuX3JlbW92ZVZpZXdMaXN0ZW5lcnMoKTtkZWxldGUgdGhpcy5fY3VycmVudFZpZXc7ZGVsZXRlIHRoaXMuX2N1cnJlbnRGaWxlO30KdGhpcy5fdGFiSWRzLnJlbW92ZSh1aVNvdXJjZUNvZGUpO2RlbGV0ZSB0aGlzLl9maWxlc1t0YWJJZF07dGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2RlTGlzdGVuZXJzKHVpU291cmNlQ29kZSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuRXZlbnRzLkVkaXRvckNsb3NlZCx1aVNvdXJjZUNvZGUpO2lmKHVzZXJHZXN0dXJlKQp0aGlzLl9lZGl0b3JDbG9zZWRCeVVzZXJBY3Rpb24odWlTb3VyY2VDb2RlKTt9Cl90YWJTZWxlY3RlZChldmVudCl7Y29uc3QgdGFiSWQ9KGV2ZW50LmRhdGEudGFiSWQpO2NvbnN0IHVzZXJHZXN0dXJlPShldmVudC5kYXRhLmlzVXNlckdlc3R1cmUpO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl9maWxlc1t0YWJJZF07dGhpcy5faW5uZXJTaG93RmlsZSh1aVNvdXJjZUNvZGUsdXNlckdlc3R1cmUpO30KX2FkZFVJU291cmNlQ29kZUxpc3RlbmVycyh1aVNvdXJjZUNvZGUpe3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLlRpdGxlQ2hhbmdlZCx0aGlzLl91aVNvdXJjZUNvZGVUaXRsZUNoYW5nZWQsdGhpcyk7dWlTb3VyY2VDb2RlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDaGFuZ2VkLHRoaXMuX3VpU291cmNlQ29kZVdvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzKTt1aVNvdXJjZUNvZGUuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5Xb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzLl91aVNvdXJjZUNvZGVXb3JraW5nQ29weUNvbW1pdHRlZCx0aGlzKTt9Cl9yZW1vdmVVSVNvdXJjZUNvZGVMaXN0ZW5lcnModWlTb3VyY2VDb2RlKXt1aVNvdXJjZUNvZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlLkV2ZW50cy5UaXRsZUNoYW5nZWQsdGhpcy5fdWlTb3VyY2VDb2RlVGl0bGVDaGFuZ2VkLHRoaXMpO3VpU291cmNlQ29kZS5yZW1vdmVFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzLl91aVNvdXJjZUNvZGVXb3JraW5nQ29weUNoYW5nZWQsdGhpcyk7dWlTb3VyY2VDb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLlVJU291cmNlQ29kZS5FdmVudHMuV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcy5fdWlTb3VyY2VDb2RlV29ya2luZ0NvcHlDb21taXR0ZWQsdGhpcyk7fQpfdXBkYXRlRmlsZVRpdGxlKHVpU291cmNlQ29kZSl7Y29uc3QgdGFiSWQ9dGhpcy5fdGFiSWRzLmdldCh1aVNvdXJjZUNvZGUpO2lmKHRhYklkKXtjb25zdCB0aXRsZT10aGlzLl90aXRsZUZvckZpbGUodWlTb3VyY2VDb2RlKTt0aGlzLl90YWJiZWRQYW5lLmNoYW5nZVRhYlRpdGxlKHRhYklkLHRpdGxlKTtsZXQgaWNvbj1udWxsO2lmKFBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLmhhc1Vuc2F2ZWRDb21taXR0ZWRDaGFuZ2VzKHVpU291cmNlQ29kZSkpe2ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi13YXJuaW5nJyk7aWNvbi50aXRsZT1Db21tb24uVUlTdHJpbmcoJ0NoYW5nZXMgdG8gdGhpcyBmaWxlIHdlcmUgbm90IHNhdmVkIHRvIGZpbGUgc3lzdGVtLicpO31lbHNle2ljb249UGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVdGlscy5pY29uRm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7fQp0aGlzLl90YWJiZWRQYW5lLnNldFRhYkljb24odGFiSWQsaWNvbik7fX0KX3VpU291cmNlQ29kZVRpdGxlQ2hhbmdlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTt0aGlzLl91cGRhdGVGaWxlVGl0bGUodWlTb3VyY2VDb2RlKTt0aGlzLl91cGRhdGVIaXN0b3J5KCk7fQpfdWlTb3VyY2VDb2RlV29ya2luZ0NvcHlDaGFuZ2VkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3VwZGF0ZUZpbGVUaXRsZSh1aVNvdXJjZUNvZGUpO30KX3VpU291cmNlQ29kZVdvcmtpbmdDb3B5Q29tbWl0dGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKTt0aGlzLl91cGRhdGVGaWxlVGl0bGUodWlTb3VyY2VDb2RlKTt9Cl9nZW5lcmF0ZVRhYklkKCl7cmV0dXJuJ3RhYl8nKyhTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5fdGFiSWQrKyk7fQpjdXJyZW50RmlsZSgpe3JldHVybiB0aGlzLl9jdXJyZW50RmlsZXx8bnVsbDt9fTtTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5FdmVudHM9e0VkaXRvclNlbGVjdGVkOlN5bWJvbCgnRWRpdG9yU2VsZWN0ZWQnKSxFZGl0b3JDbG9zZWQ6U3ltYm9sKCdFZGl0b3JDbG9zZWQnKX07U291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuX3RhYklkPTA7U291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIubWF4aW1hbFByZXZpb3VzbHlWaWV3ZWRGaWxlc0NvdW50PTMwO1NvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyLkhpc3RvcnlJdGVtPWNsYXNze2NvbnN0cnVjdG9yKHVybCxzZWxlY3Rpb25SYW5nZSxzY3JvbGxMaW5lTnVtYmVyKXt0aGlzLnVybD11cmw7dGhpcy5faXNTZXJpYWxpemFibGU9dXJsLmxlbmd0aDxTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5IaXN0b3J5SXRlbS5zZXJpYWxpemFibGVVcmxMZW5ndGhMaW1pdDt0aGlzLnNlbGVjdGlvblJhbmdlPXNlbGVjdGlvblJhbmdlO3RoaXMuc2Nyb2xsTGluZU51bWJlcj1zY3JvbGxMaW5lTnVtYmVyO30Kc3RhdGljIGZyb21PYmplY3Qoc2VyaWFsaXplZEhpc3RvcnlJdGVtKXtjb25zdCBzZWxlY3Rpb25SYW5nZT1zZXJpYWxpemVkSGlzdG9yeUl0ZW0uc2VsZWN0aW9uUmFuZ2U/VGV4dFV0aWxzLlRleHRSYW5nZS5mcm9tT2JqZWN0KHNlcmlhbGl6ZWRIaXN0b3J5SXRlbS5zZWxlY3Rpb25SYW5nZSk6dW5kZWZpbmVkO3JldHVybiBuZXcgU291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuSGlzdG9yeUl0ZW0oc2VyaWFsaXplZEhpc3RvcnlJdGVtLnVybCxzZWxlY3Rpb25SYW5nZSxzZXJpYWxpemVkSGlzdG9yeUl0ZW0uc2Nyb2xsTGluZU51bWJlcik7fQpzZXJpYWxpemVUb09iamVjdCgpe2lmKCF0aGlzLl9pc1NlcmlhbGl6YWJsZSkKcmV0dXJuIG51bGw7Y29uc3Qgc2VyaWFsaXplZEhpc3RvcnlJdGVtPXt9O3NlcmlhbGl6ZWRIaXN0b3J5SXRlbS51cmw9dGhpcy51cmw7c2VyaWFsaXplZEhpc3RvcnlJdGVtLnNlbGVjdGlvblJhbmdlPXRoaXMuc2VsZWN0aW9uUmFuZ2U7c2VyaWFsaXplZEhpc3RvcnlJdGVtLnNjcm9sbExpbmVOdW1iZXI9dGhpcy5zY3JvbGxMaW5lTnVtYmVyO3JldHVybiBzZXJpYWxpemVkSGlzdG9yeUl0ZW07fX07U291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuSGlzdG9yeUl0ZW0uc2VyaWFsaXphYmxlVXJsTGVuZ3RoTGltaXQ9NDA5NjtTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5IaXN0b3J5PWNsYXNze2NvbnN0cnVjdG9yKGl0ZW1zKXt0aGlzLl9pdGVtcz1pdGVtczt0aGlzLl9yZWJ1aWxkSXRlbUluZGV4KCk7fQpzdGF0aWMgZnJvbU9iamVjdChzZXJpYWxpemVkSGlzdG9yeSl7Y29uc3QgaXRlbXM9W107Zm9yKGxldCBpPTA7aTxzZXJpYWxpemVkSGlzdG9yeS5sZW5ndGg7KytpKQppdGVtcy5wdXNoKFNvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyLkhpc3RvcnlJdGVtLmZyb21PYmplY3Qoc2VyaWFsaXplZEhpc3RvcnlbaV0pKTtyZXR1cm4gbmV3IFNvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyLkhpc3RvcnkoaXRlbXMpO30KaW5kZXgodXJsKXtyZXR1cm4gdGhpcy5faXRlbXNJbmRleC5oYXModXJsKT8odGhpcy5faXRlbXNJbmRleC5nZXQodXJsKSk6LTE7fQpfcmVidWlsZEl0ZW1JbmRleCgpe3RoaXMuX2l0ZW1zSW5kZXg9bmV3IE1hcCgpO2ZvcihsZXQgaT0wO2k8dGhpcy5faXRlbXMubGVuZ3RoOysraSl7Y29uc29sZS5hc3NlcnQoIXRoaXMuX2l0ZW1zSW5kZXguaGFzKHRoaXMuX2l0ZW1zW2ldLnVybCkpO3RoaXMuX2l0ZW1zSW5kZXguc2V0KHRoaXMuX2l0ZW1zW2ldLnVybCxpKTt9fQpzZWxlY3Rpb25SYW5nZSh1cmwpe2NvbnN0IGluZGV4PXRoaXMuaW5kZXgodXJsKTtyZXR1cm4gaW5kZXghPT0tMT90aGlzLl9pdGVtc1tpbmRleF0uc2VsZWN0aW9uUmFuZ2U6dW5kZWZpbmVkO30KdXBkYXRlU2VsZWN0aW9uUmFuZ2UodXJsLHNlbGVjdGlvblJhbmdlKXtpZighc2VsZWN0aW9uUmFuZ2UpCnJldHVybjtjb25zdCBpbmRleD10aGlzLmluZGV4KHVybCk7aWYoaW5kZXg9PT0tMSkKcmV0dXJuO3RoaXMuX2l0ZW1zW2luZGV4XS5zZWxlY3Rpb25SYW5nZT1zZWxlY3Rpb25SYW5nZTt9CnNjcm9sbExpbmVOdW1iZXIodXJsKXtjb25zdCBpbmRleD10aGlzLmluZGV4KHVybCk7cmV0dXJuIGluZGV4IT09LTE/dGhpcy5faXRlbXNbaW5kZXhdLnNjcm9sbExpbmVOdW1iZXI6dW5kZWZpbmVkO30KdXBkYXRlU2Nyb2xsTGluZU51bWJlcih1cmwsc2Nyb2xsTGluZU51bWJlcil7Y29uc3QgaW5kZXg9dGhpcy5pbmRleCh1cmwpO2lmKGluZGV4PT09LTEpCnJldHVybjt0aGlzLl9pdGVtc1tpbmRleF0uc2Nyb2xsTGluZU51bWJlcj1zY3JvbGxMaW5lTnVtYmVyO30KdXBkYXRlKHVybHMpe2ZvcihsZXQgaT11cmxzLmxlbmd0aC0xO2k+PTA7LS1pKXtjb25zdCBpbmRleD10aGlzLmluZGV4KHVybHNbaV0pO2xldCBpdGVtO2lmKGluZGV4IT09LTEpe2l0ZW09dGhpcy5faXRlbXNbaW5kZXhdO3RoaXMuX2l0ZW1zLnNwbGljZShpbmRleCwxKTt9ZWxzZXtpdGVtPW5ldyBTb3VyY2VzLlRhYmJlZEVkaXRvckNvbnRhaW5lci5IaXN0b3J5SXRlbSh1cmxzW2ldKTt9CnRoaXMuX2l0ZW1zLnVuc2hpZnQoaXRlbSk7dGhpcy5fcmVidWlsZEl0ZW1JbmRleCgpO319CnJlbW92ZSh1cmwpe2NvbnN0IGluZGV4PXRoaXMuaW5kZXgodXJsKTtpZihpbmRleCE9PS0xKXt0aGlzLl9pdGVtcy5zcGxpY2UoaW5kZXgsMSk7dGhpcy5fcmVidWlsZEl0ZW1JbmRleCgpO319CnNhdmUoc2V0dGluZyl7c2V0dGluZy5zZXQodGhpcy5fc2VyaWFsaXplVG9PYmplY3QoKSk7fQpfc2VyaWFsaXplVG9PYmplY3QoKXtjb25zdCBzZXJpYWxpemVkSGlzdG9yeT1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX2l0ZW1zLmxlbmd0aDsrK2kpe2NvbnN0IHNlcmlhbGl6ZWRJdGVtPXRoaXMuX2l0ZW1zW2ldLnNlcmlhbGl6ZVRvT2JqZWN0KCk7aWYoc2VyaWFsaXplZEl0ZW0pCnNlcmlhbGl6ZWRIaXN0b3J5LnB1c2goc2VyaWFsaXplZEl0ZW0pO2lmKHNlcmlhbGl6ZWRIaXN0b3J5Lmxlbmd0aD09PVNvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyLm1heGltYWxQcmV2aW91c2x5Vmlld2VkRmlsZXNDb3VudCkKYnJlYWs7fQpyZXR1cm4gc2VyaWFsaXplZEhpc3Rvcnk7fQpfdXJscygpe2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX2l0ZW1zLmxlbmd0aDsrK2kpCnJlc3VsdC5wdXNoKHRoaXMuX2l0ZW1zW2ldLnVybCk7cmV0dXJuIHJlc3VsdDt9fTtTb3VyY2VzLkVkaXRvckNvbnRhaW5lclRhYkRlbGVnYXRlPWNsYXNze2NvbnN0cnVjdG9yKGVkaXRvckNvbnRhaW5lcil7dGhpcy5fZWRpdG9yQ29udGFpbmVyPWVkaXRvckNvbnRhaW5lcjt9CmNsb3NlVGFicyh0YWJiZWRQYW5lLGlkcyl7dGhpcy5fZWRpdG9yQ29udGFpbmVyLl9jbG9zZVRhYnMoaWRzKTt9Cm9uQ29udGV4dE1lbnUodGFiSWQsY29udGV4dE1lbnUpe3RoaXMuX2VkaXRvckNvbnRhaW5lci5fb25Db250ZXh0TWVudSh0YWJJZCxjb250ZXh0TWVudSk7fX07O1NvdXJjZXMuV2F0Y2hFeHByZXNzaW9uc1NpZGViYXJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVGhyb3R0bGVkV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdvYmplY3RfdWkvb2JqZWN0VmFsdWUuY3NzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzb3VyY2VzL3dhdGNoRXhwcmVzc2lvbnNTaWRlYmFyUGFuZS5jc3MnKTt0aGlzLl93YXRjaEV4cHJlc3Npb25zPVtdO3RoaXMuX3dhdGNoRXhwcmVzc2lvbnNTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ3dhdGNoRXhwcmVzc2lvbnMnLFtdKTt0aGlzLl9hZGRCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdBZGQgZXhwcmVzc2lvbicpLCdsYXJnZWljb24tYWRkJyk7dGhpcy5fYWRkQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fYWRkQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpKTt0aGlzLl9yZWZyZXNoQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnUmVmcmVzaCcpLCdsYXJnZWljb24tcmVmcmVzaCcpO3RoaXMuX3JlZnJlc2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLmNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3dhdGNoLWV4cHJlc3Npb25zJyk7dGhpcy5jb250ZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZXhwYW5kQ29udHJvbGxlcj1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb25FeHBhbmRDb250cm9sbGVyKCk7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRXhlY3V0aW9uQ29udGV4dCx0aGlzLnVwZGF0ZSx0aGlzKTtVSS5jb250ZXh0LmFkZEZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkNhbGxGcmFtZSx0aGlzLnVwZGF0ZSx0aGlzKTt0aGlzLl9saW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKCk7dGhpcy51cGRhdGUoKTt9CnRvb2xiYXJJdGVtcygpe3JldHVyblt0aGlzLl9hZGRCdXR0b24sdGhpcy5fcmVmcmVzaEJ1dHRvbl07fQpoYXNFeHByZXNzaW9ucygpe3JldHVybiEhdGhpcy5fd2F0Y2hFeHByZXNzaW9uc1NldHRpbmcuZ2V0KCkubGVuZ3RoO30KX3NhdmVFeHByZXNzaW9ucygpe2NvbnN0IHRvU2F2ZT1bXTtmb3IobGV0IGk9MDtpPHRoaXMuX3dhdGNoRXhwcmVzc2lvbnMubGVuZ3RoO2krKyl7aWYodGhpcy5fd2F0Y2hFeHByZXNzaW9uc1tpXS5leHByZXNzaW9uKCkpCnRvU2F2ZS5wdXNoKHRoaXMuX3dhdGNoRXhwcmVzc2lvbnNbaV0uZXhwcmVzc2lvbigpKTt9CnRoaXMuX3dhdGNoRXhwcmVzc2lvbnNTZXR0aW5nLnNldCh0b1NhdmUpO30KYXN5bmMgX2FkZEJ1dHRvbkNsaWNrZWQoKXthd2FpdCBVSS52aWV3TWFuYWdlci5zaG93Vmlldygnc291cmNlcy53YXRjaCcpO3RoaXMuX2NyZWF0ZVdhdGNoRXhwcmVzc2lvbihudWxsKS5zdGFydEVkaXRpbmcoKTt9CmRvVXBkYXRlKCl7dGhpcy5fbGlua2lmaWVyLnJlc2V0KCk7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3dhdGNoRXhwcmVzc2lvbnM9W107dGhpcy5fZW1wdHlFbGVtZW50PXRoaXMuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ2dyYXktaW5mby1tZXNzYWdlJyk7dGhpcy5fZW1wdHlFbGVtZW50LnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnTm8gd2F0Y2ggZXhwcmVzc2lvbnMnKTtjb25zdCB3YXRjaEV4cHJlc3Npb25TdHJpbmdzPXRoaXMuX3dhdGNoRXhwcmVzc2lvbnNTZXR0aW5nLmdldCgpO2ZvcihsZXQgaT0wO2k8d2F0Y2hFeHByZXNzaW9uU3RyaW5ncy5sZW5ndGg7KytpKXtjb25zdCBleHByZXNzaW9uPXdhdGNoRXhwcmVzc2lvblN0cmluZ3NbaV07aWYoIWV4cHJlc3Npb24pCmNvbnRpbnVlO3RoaXMuX2NyZWF0ZVdhdGNoRXhwcmVzc2lvbihleHByZXNzaW9uKTt9CnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt9Cl9jcmVhdGVXYXRjaEV4cHJlc3Npb24oZXhwcmVzc2lvbil7dGhpcy5fZW1wdHlFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO2NvbnN0IHdhdGNoRXhwcmVzc2lvbj1uZXcgU291cmNlcy5XYXRjaEV4cHJlc3Npb24oZXhwcmVzc2lvbix0aGlzLl9leHBhbmRDb250cm9sbGVyLHRoaXMuX2xpbmtpZmllcik7d2F0Y2hFeHByZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoU291cmNlcy5XYXRjaEV4cHJlc3Npb24uRXZlbnRzLkV4cHJlc3Npb25VcGRhdGVkLHRoaXMuX3dhdGNoRXhwcmVzc2lvblVwZGF0ZWQsdGhpcyk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh3YXRjaEV4cHJlc3Npb24uZWxlbWVudCgpKTt0aGlzLl93YXRjaEV4cHJlc3Npb25zLnB1c2god2F0Y2hFeHByZXNzaW9uKTtyZXR1cm4gd2F0Y2hFeHByZXNzaW9uO30KX3dhdGNoRXhwcmVzc2lvblVwZGF0ZWQoZXZlbnQpe2NvbnN0IHdhdGNoRXhwcmVzc2lvbj0oZXZlbnQuZGF0YSk7aWYoIXdhdGNoRXhwcmVzc2lvbi5leHByZXNzaW9uKCkpe3RoaXMuX3dhdGNoRXhwcmVzc2lvbnMucmVtb3ZlKHdhdGNoRXhwcmVzc2lvbik7dGhpcy5jb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZCh3YXRjaEV4cHJlc3Npb24uZWxlbWVudCgpKTt0aGlzLl9lbXB0eUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhIXRoaXMuX3dhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKTt9CnRoaXMuX3NhdmVFeHByZXNzaW9ucygpO30KX2NvbnRleHRNZW51KGV2ZW50KXtjb25zdCBjb250ZXh0TWVudT1uZXcgVUkuQ29udGV4dE1lbnUoZXZlbnQpO3RoaXMuX3BvcHVsYXRlQ29udGV4dE1lbnUoY29udGV4dE1lbnUsZXZlbnQpO2NvbnRleHRNZW51LnNob3coKTt9Cl9wb3B1bGF0ZUNvbnRleHRNZW51KGNvbnRleHRNZW51LGV2ZW50KXtsZXQgaXNFZGl0aW5nPWZhbHNlO2Zvcihjb25zdCB3YXRjaEV4cHJlc3Npb24gb2YgdGhpcy5fd2F0Y2hFeHByZXNzaW9ucykKaXNFZGl0aW5nfD13YXRjaEV4cHJlc3Npb24uaXNFZGl0aW5nKCk7aWYoIWlzRWRpdGluZykKY29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0FkZCB3YXRjaCBleHByZXNzaW9uJyksdGhpcy5fYWRkQnV0dG9uQ2xpY2tlZC5iaW5kKHRoaXMpKTtpZih0aGlzLl93YXRjaEV4cHJlc3Npb25zLmxlbmd0aD4xKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRGVsZXRlIGFsbCB3YXRjaCBleHByZXNzaW9ucycpLHRoaXMuX2RlbGV0ZUFsbEJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSk7fQpjb25zdCB0YXJnZXQ9ZXZlbnQuZGVlcEVsZW1lbnRGcm9tUG9pbnQoKTtpZighdGFyZ2V0KQpyZXR1cm47Zm9yKGNvbnN0IHdhdGNoRXhwcmVzc2lvbiBvZiB0aGlzLl93YXRjaEV4cHJlc3Npb25zKXtpZih3YXRjaEV4cHJlc3Npb24uZWxlbWVudCgpLmlzU2VsZk9yQW5jZXN0b3IodGFyZ2V0KSkKd2F0Y2hFeHByZXNzaW9uLl9wb3B1bGF0ZUNvbnRleHRNZW51KGNvbnRleHRNZW51LGV2ZW50KTt9fQpfZGVsZXRlQWxsQnV0dG9uQ2xpY2tlZCgpe3RoaXMuX3dhdGNoRXhwcmVzc2lvbnM9W107dGhpcy5fc2F2ZUV4cHJlc3Npb25zKCk7dGhpcy51cGRhdGUoKTt9Cl9mb2N1c0FuZEFkZEV4cHJlc3Npb25Ub1dhdGNoKGV4cHJlc3Npb24pe1VJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KCdzb3VyY2VzLndhdGNoJyk7dGhpcy5kb1VwZGF0ZSgpO3RoaXMuX2FkZEV4cHJlc3Npb25Ub1dhdGNoKGV4cHJlc3Npb24pO30KX2FkZEV4cHJlc3Npb25Ub1dhdGNoKGV4cHJlc3Npb24pe3RoaXMuX2NyZWF0ZVdhdGNoRXhwcmVzc2lvbihleHByZXNzaW9uKTt0aGlzLl9zYXZlRXhwcmVzc2lvbnMoKTt9CmhhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBmcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKTtpZighZnJhbWUpCnJldHVybiBmYWxzZTtjb25zdCB0ZXh0PWZyYW1lLnRleHRFZGl0b3IudGV4dChmcmFtZS50ZXh0RWRpdG9yLnNlbGVjdGlvbigpKTt0aGlzLl9mb2N1c0FuZEFkZEV4cHJlc3Npb25Ub1dhdGNoKHRleHQpO3JldHVybiB0cnVlO30KX2FkZFByb3BlcnR5UGF0aFRvV2F0Y2godGFyZ2V0KXt0aGlzLl9hZGRFeHByZXNzaW9uVG9XYXRjaCh0YXJnZXQucGF0aCgpKTt9CmFwcGVuZEFwcGxpY2FibGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpe2lmKHRhcmdldCBpbnN0YW5jZW9mIE9iamVjdFVJLk9iamVjdFByb3BlcnR5VHJlZUVsZW1lbnQmJiF0YXJnZXQucHJvcGVydHkuc3ludGhldGljKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKGxzYEFkZCBwcm9wZXJ0eSBwYXRoIHRvIHdhdGNoYCx0aGlzLl9hZGRQcm9wZXJ0eVBhdGhUb1dhdGNoLmJpbmQodGhpcyx0YXJnZXQpKTt9CmNvbnN0IGZyYW1lPVVJLmNvbnRleHQuZmxhdm9yKFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUpO2lmKCFmcmFtZXx8ZnJhbWUudGV4dEVkaXRvci5zZWxlY3Rpb24oKS5pc0VtcHR5KCkpCnJldHVybjtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRBY3Rpb24oJ3NvdXJjZXMuYWRkLXRvLXdhdGNoJyk7fX07U291cmNlcy5XYXRjaEV4cHJlc3Npb249Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKGV4cHJlc3Npb24sZXhwYW5kQ29udHJvbGxlcixsaW5raWZpZXIpe3N1cGVyKCk7dGhpcy5fZXhwcmVzc2lvbj1leHByZXNzaW9uO3RoaXMuX2V4cGFuZENvbnRyb2xsZXI9ZXhwYW5kQ29udHJvbGxlcjt0aGlzLl9lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3dhdGNoLWV4cHJlc3Npb24gbW9ub3NwYWNlJyk7dGhpcy5fZWRpdGluZz1mYWxzZTt0aGlzLl9saW5raWZpZXI9bGlua2lmaWVyO3RoaXMuX2NyZWF0ZVdhdGNoRXhwcmVzc2lvbigpO3RoaXMudXBkYXRlKCk7fQplbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQ7fQpleHByZXNzaW9uKCl7cmV0dXJuIHRoaXMuX2V4cHJlc3Npb247fQp1cGRhdGUoKXtjb25zdCBjdXJyZW50RXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoY3VycmVudEV4ZWN1dGlvbkNvbnRleHQmJnRoaXMuX2V4cHJlc3Npb24pe2N1cnJlbnRFeGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKHtleHByZXNzaW9uOnRoaXMuX2V4cHJlc3Npb24sb2JqZWN0R3JvdXA6U291cmNlcy5XYXRjaEV4cHJlc3Npb24uX3dhdGNoT2JqZWN0R3JvdXBJZCxpbmNsdWRlQ29tbWFuZExpbmVBUEk6ZmFsc2Usc2lsZW50OnRydWUscmV0dXJuQnlWYWx1ZTpmYWxzZSxnZW5lcmF0ZVByZXZpZXc6ZmFsc2V9LGZhbHNlLGZhbHNlKS50aGVuKHJlc3VsdD0+dGhpcy5fY3JlYXRlV2F0Y2hFeHByZXNzaW9uKHJlc3VsdC5vYmplY3QscmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMpKTt9fQpzdGFydEVkaXRpbmcoKXt0aGlzLl9lZGl0aW5nPXRydWU7dGhpcy5fZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9vYmplY3RQcmVzZW50YXRpb25FbGVtZW50KTtjb25zdCBuZXdEaXY9dGhpcy5fZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7bmV3RGl2LnRleHRDb250ZW50PXRoaXMuX25hbWVFbGVtZW50LnRleHRDb250ZW50O3RoaXMuX3RleHRQcm9tcHQ9bmV3IE9iamVjdFVJLk9iamVjdFByb3BlcnR5UHJvbXB0KCk7dGhpcy5fdGV4dFByb21wdC5yZW5kZXJBc0Jsb2NrKCk7Y29uc3QgcHJveHlFbGVtZW50PXRoaXMuX3RleHRQcm9tcHQuYXR0YWNoQW5kU3RhcnRFZGl0aW5nKG5ld0Rpdix0aGlzLl9maW5pc2hFZGl0aW5nLmJpbmQodGhpcykpO3Byb3h5RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3YXRjaC1leHByZXNzaW9uLXRleHQtcHJvbXB0LXByb3h5Jyk7cHJveHlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX3Byb21wdEtleURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZWxlbWVudC5nZXRDb21wb25lbnRTZWxlY3Rpb24oKS5zZWxlY3RBbGxDaGlsZHJlbihuZXdEaXYpO30KaXNFZGl0aW5nKCl7cmV0dXJuISF0aGlzLl9lZGl0aW5nO30KX2ZpbmlzaEVkaXRpbmcoZXZlbnQsY2FuY2VsZWQpe2lmKGV2ZW50KQpldmVudC5jb25zdW1lKGNhbmNlbGVkKTt0aGlzLl9lZGl0aW5nPWZhbHNlO3RoaXMuX3RleHRQcm9tcHQuZGV0YWNoKCk7Y29uc3QgbmV3RXhwcmVzc2lvbj1jYW5jZWxlZD90aGlzLl9leHByZXNzaW9uOnRoaXMuX3RleHRQcm9tcHQudGV4dCgpO2RlbGV0ZSB0aGlzLl90ZXh0UHJvbXB0O3RoaXMuX2VsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX29iamVjdFByZXNlbnRhdGlvbkVsZW1lbnQpO3RoaXMuX3VwZGF0ZUV4cHJlc3Npb24obmV3RXhwcmVzc2lvbik7fQpfZGJsQ2xpY2tPbldhdGNoRXhwcmVzc2lvbihldmVudCl7ZXZlbnQuY29uc3VtZSgpO2lmKCF0aGlzLmlzRWRpdGluZygpKQp0aGlzLnN0YXJ0RWRpdGluZygpO30KX3VwZGF0ZUV4cHJlc3Npb24obmV3RXhwcmVzc2lvbil7aWYodGhpcy5fZXhwcmVzc2lvbikKdGhpcy5fZXhwYW5kQ29udHJvbGxlci5zdG9wV2F0Y2hTZWN0aW9uc1dpdGhJZCh0aGlzLl9leHByZXNzaW9uKTt0aGlzLl9leHByZXNzaW9uPW5ld0V4cHJlc3Npb247dGhpcy51cGRhdGUoKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhTb3VyY2VzLldhdGNoRXhwcmVzc2lvbi5FdmVudHMuRXhwcmVzc2lvblVwZGF0ZWQsdGhpcyk7fQpfZGVsZXRlV2F0Y2hFeHByZXNzaW9uKGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX3VwZGF0ZUV4cHJlc3Npb24obnVsbCk7fQpfY3JlYXRlV2F0Y2hFeHByZXNzaW9uKHJlc3VsdCxleGNlcHRpb25EZXRhaWxzKXt0aGlzLl9yZXN1bHQ9cmVzdWx0fHxudWxsO2NvbnN0IGhlYWRlckVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnd2F0Y2gtZXhwcmVzc2lvbi1oZWFkZXInKTtjb25zdCBkZWxldGVCdXR0b249aGVhZGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnYnV0dG9uJywnd2F0Y2gtZXhwcmVzc2lvbi1kZWxldGUtYnV0dG9uJyk7ZGVsZXRlQnV0dG9uLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnRGVsZXRlIHdhdGNoIGV4cHJlc3Npb24nKTtkZWxldGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX2RlbGV0ZVdhdGNoRXhwcmVzc2lvbi5iaW5kKHRoaXMpLGZhbHNlKTtjb25zdCB0aXRsZUVsZW1lbnQ9aGVhZGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnd2F0Y2gtZXhwcmVzc2lvbi10aXRsZScpO3RoaXMuX25hbWVFbGVtZW50PU9iamVjdFVJLk9iamVjdFByb3BlcnRpZXNTZWN0aW9uLmNyZWF0ZU5hbWVFbGVtZW50KHRoaXMuX2V4cHJlc3Npb24pO2lmKCEhZXhjZXB0aW9uRGV0YWlsc3x8IXJlc3VsdCl7dGhpcy5fdmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCd3YXRjaC1leHByZXNzaW9uLWVycm9yIHZhbHVlJyk7dGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RpbW1lZCcpO3RoaXMuX3ZhbHVlRWxlbWVudC50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJzxub3QgYXZhaWxhYmxlPicpO31lbHNle3RoaXMuX3ZhbHVlRWxlbWVudD1PYmplY3RVSS5PYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5jcmVhdGVWYWx1ZUVsZW1lbnRXaXRoQ3VzdG9tU3VwcG9ydChyZXN1bHQsISFleGNlcHRpb25EZXRhaWxzLGZhbHNlLHRpdGxlRWxlbWVudCx0aGlzLl9saW5raWZpZXIpO30KY29uc3Qgc2VwYXJhdG9yRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnd2F0Y2gtZXhwcmVzc2lvbnMtc2VwYXJhdG9yJyk7c2VwYXJhdG9yRWxlbWVudC50ZXh0Q29udGVudD0nOiAnO3RpdGxlRWxlbWVudC5hcHBlbmRDaGlsZHJlbih0aGlzLl9uYW1lRWxlbWVudCxzZXBhcmF0b3JFbGVtZW50LHRoaXMuX3ZhbHVlRWxlbWVudCk7dGhpcy5fZWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX29iamVjdFByb3BlcnRpZXNTZWN0aW9uPW51bGw7aWYoIWV4Y2VwdGlvbkRldGFpbHMmJnJlc3VsdCYmcmVzdWx0Lmhhc0NoaWxkcmVuJiYhcmVzdWx0LmN1c3RvbVByZXZpZXcoKSl7aGVhZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3YXRjaC1leHByZXNzaW9uLW9iamVjdC1oZWFkZXInKTt0aGlzLl9vYmplY3RQcm9wZXJ0aWVzU2VjdGlvbj1uZXcgT2JqZWN0VUkuT2JqZWN0UHJvcGVydGllc1NlY3Rpb24ocmVzdWx0LGhlYWRlckVsZW1lbnQsdGhpcy5fbGlua2lmaWVyKTt0aGlzLl9vYmplY3RQcmVzZW50YXRpb25FbGVtZW50PXRoaXMuX29iamVjdFByb3BlcnRpZXNTZWN0aW9uLmVsZW1lbnQ7dGhpcy5fZXhwYW5kQ29udHJvbGxlci53YXRjaFNlY3Rpb24oKHRoaXMuX2V4cHJlc3Npb24pLHRoaXMuX29iamVjdFByb3BlcnRpZXNTZWN0aW9uKTtjb25zdCBvYmplY3RUcmVlRWxlbWVudD10aGlzLl9vYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5vYmplY3RUcmVlRWxlbWVudCgpO29iamVjdFRyZWVFbGVtZW50LnRvZ2dsZU9uQ2xpY2s9ZmFsc2U7b2JqZWN0VHJlZUVsZW1lbnQubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vblNlY3Rpb25DbGljay5iaW5kKHRoaXMpLGZhbHNlKTtvYmplY3RUcmVlRWxlbWVudC5saXN0SXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX2RibENsaWNrT25XYXRjaEV4cHJlc3Npb24uYmluZCh0aGlzKSk7fWVsc2V7dGhpcy5fb2JqZWN0UHJlc2VudGF0aW9uRWxlbWVudD1oZWFkZXJFbGVtZW50O3RoaXMuX29iamVjdFByZXNlbnRhdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLHRoaXMuX2RibENsaWNrT25XYXRjaEV4cHJlc3Npb24uYmluZCh0aGlzKSk7fQp0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX29iamVjdFByZXNlbnRhdGlvbkVsZW1lbnQpO30KX29uU2VjdGlvbkNsaWNrKGV2ZW50KXtldmVudC5jb25zdW1lKHRydWUpO2lmKGV2ZW50LmRldGFpbD09PTEpe3RoaXMuX3ByZXZlbnRDbGlja1RpbWVvdXQ9c2V0VGltZW91dChoYW5kbGVDbGljay5iaW5kKHRoaXMpLDMzMyk7fWVsc2V7Y2xlYXJUaW1lb3V0KHRoaXMuX3ByZXZlbnRDbGlja1RpbWVvdXQpO2RlbGV0ZSB0aGlzLl9wcmV2ZW50Q2xpY2tUaW1lb3V0O30KZnVuY3Rpb24gaGFuZGxlQ2xpY2soKXtpZighdGhpcy5fb2JqZWN0UHJvcGVydGllc1NlY3Rpb24pCnJldHVybjtjb25zdCBvYmplY3RUcmVlRWxlbWVudD10aGlzLl9vYmplY3RQcm9wZXJ0aWVzU2VjdGlvbi5vYmplY3RUcmVlRWxlbWVudCgpO2lmKG9iamVjdFRyZWVFbGVtZW50LmV4cGFuZGVkKQpvYmplY3RUcmVlRWxlbWVudC5jb2xsYXBzZSgpO2Vsc2UKb2JqZWN0VHJlZUVsZW1lbnQuZXhwYW5kKCk7fX0KX3Byb21wdEtleURvd24oZXZlbnQpe2lmKGlzRW50ZXJLZXkoZXZlbnQpfHxpc0VzY0tleShldmVudCkpCnRoaXMuX2ZpbmlzaEVkaXRpbmcoZXZlbnQsaXNFc2NLZXkoZXZlbnQpKTt9Cl9wb3B1bGF0ZUNvbnRleHRNZW51KGNvbnRleHRNZW51LGV2ZW50KXtpZighdGhpcy5pc0VkaXRpbmcoKSl7Y29udGV4dE1lbnUuZWRpdFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnRGVsZXRlIHdhdGNoIGV4cHJlc3Npb24nKSx0aGlzLl91cGRhdGVFeHByZXNzaW9uLmJpbmQodGhpcyxudWxsKSk7fQppZighdGhpcy5pc0VkaXRpbmcoKSYmdGhpcy5fcmVzdWx0JiYodGhpcy5fcmVzdWx0LnR5cGU9PT0nbnVtYmVyJ3x8dGhpcy5fcmVzdWx0LnR5cGU9PT0nc3RyaW5nJykpCmNvbnRleHRNZW51LmNsaXBib2FyZFNlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnQ29weSB2YWx1ZScpLHRoaXMuX2NvcHlWYWx1ZUJ1dHRvbkNsaWNrZWQuYmluZCh0aGlzKSk7Y29uc3QgdGFyZ2V0PWV2ZW50LmRlZXBFbGVtZW50RnJvbVBvaW50KCk7aWYodGFyZ2V0JiZ0aGlzLl92YWx1ZUVsZW1lbnQuaXNTZWxmT3JBbmNlc3Rvcih0YXJnZXQpKQpjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXModGhpcy5fcmVzdWx0KTt9Cl9jb3B5VmFsdWVCdXR0b25DbGlja2VkKCl7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmNvcHlUZXh0KHRoaXMuX3ZhbHVlRWxlbWVudC50ZXh0Q29udGVudCk7fX07U291cmNlcy5XYXRjaEV4cHJlc3Npb24uX3dhdGNoT2JqZWN0R3JvdXBJZD0nd2F0Y2gtZ3JvdXAnO1NvdXJjZXMuV2F0Y2hFeHByZXNzaW9uLkV2ZW50cz17RXhwcmVzc2lvblVwZGF0ZWQ6U3ltYm9sKCdFeHByZXNzaW9uVXBkYXRlZCcpfTs7U291cmNlcy5UaHJlYWRzU2lkZWJhclBhbmU9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIodHJ1ZSk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCdzb3VyY2VzL3RocmVhZHNTaWRlYmFyUGFuZS5jc3MnKTt0aGlzLl9pdGVtcz1uZXcgVUkuTGlzdE1vZGVsKCk7dGhpcy5fbGlzdD1uZXcgVUkuTGlzdENvbnRyb2wodGhpcy5faXRlbXMsdGhpcyxVSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCk7dGhpcy5jb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9saXN0LmVsZW1lbnQpO1VJLmNvbnRleHQuYWRkRmxhdm9yQ2hhbmdlTGlzdGVuZXIoU0RLLlRhcmdldCx0aGlzLl90YXJnZXRGbGF2b3JDaGFuZ2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwsdGhpcyk7fQpzdGF0aWMgc2hvdWxkQmVTaG93bigpe3JldHVybiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwpLmxlbmd0aD49Mjt9CmNyZWF0ZUVsZW1lbnRGb3JJdGVtKGRlYnVnZ2VyTW9kZWwpe2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndGhyZWFkLWl0ZW0nKTtjb25zdCB0aXRsZT1lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aHJlYWQtaXRlbS10aXRsZScpO2NvbnN0IHBhdXNlZFN0YXRlPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RocmVhZC1pdGVtLXBhdXNlZC1zdGF0ZScpO2VsZW1lbnQuYXBwZW5kQ2hpbGQoVUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10aGljay1yaWdodC1hcnJvdycsJ3NlbGVjdGVkLXRocmVhZC1pY29uJykpO2Z1bmN0aW9uIHVwZGF0ZVRpdGxlKCl7Y29uc3QgZXhlY3V0aW9uQ29udGV4dD1kZWJ1Z2dlck1vZGVsLnJ1bnRpbWVNb2RlbCgpLmRlZmF1bHRFeGVjdXRpb25Db250ZXh0KCk7dGl0bGUudGV4dENvbnRlbnQ9ZXhlY3V0aW9uQ29udGV4dCYmZXhlY3V0aW9uQ29udGV4dC5sYWJlbCgpP2V4ZWN1dGlvbkNvbnRleHQubGFiZWwoKTpkZWJ1Z2dlck1vZGVsLnRhcmdldCgpLm5hbWUoKTt9CmZ1bmN0aW9uIHVwZGF0ZVBhdXNlZFN0YXRlKCl7cGF1c2VkU3RhdGUudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKGRlYnVnZ2VyTW9kZWwuaXNQYXVzZWQoKT8ncGF1c2VkJzonJyk7fQpmdW5jdGlvbiB0YXJnZXROYW1lQ2hhbmdlZChldmVudCl7Y29uc3QgdGFyZ2V0PShldmVudC5kYXRhKTtpZih0YXJnZXQ9PT1kZWJ1Z2dlck1vZGVsLnRhcmdldCgpKQp1cGRhdGVUaXRsZSgpO30KZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclBhdXNlZCx1cGRhdGVQYXVzZWRTdGF0ZSk7ZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlclJlc3VtZWQsdXBkYXRlUGF1c2VkU3RhdGUpO2RlYnVnZ2VyTW9kZWwucnVudGltZU1vZGVsKCkuYWRkRXZlbnRMaXN0ZW5lcihTREsuUnVudGltZU1vZGVsLkV2ZW50cy5FeGVjdXRpb25Db250ZXh0Q2hhbmdlZCx1cGRhdGVUaXRsZSk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuTmFtZUNoYW5nZWQsdGFyZ2V0TmFtZUNoYW5nZWQpO3VwZGF0ZVBhdXNlZFN0YXRlKCk7dXBkYXRlVGl0bGUoKTtyZXR1cm4gZWxlbWVudDt9CmhlaWdodEZvckl0ZW0oZGVidWdnZXJNb2RlbCl7Y29uc29sZS5hc3NlcnQoZmFsc2UpO3JldHVybiAwO30KaXNJdGVtU2VsZWN0YWJsZShkZWJ1Z2dlck1vZGVsKXtyZXR1cm4gdHJ1ZTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO2lmKHRvRWxlbWVudCkKdG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7aWYodG8pClVJLmNvbnRleHQuc2V0Rmxhdm9yKFNESy5UYXJnZXQsdG8udGFyZ2V0KCkpO30KbW9kZWxBZGRlZChkZWJ1Z2dlck1vZGVsKXt0aGlzLl9pdGVtcy5pbnNlcnQodGhpcy5faXRlbXMubGVuZ3RoLGRlYnVnZ2VyTW9kZWwpO2NvbnN0IGN1cnJlbnRUYXJnZXQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLlRhcmdldCk7aWYoY3VycmVudFRhcmdldD09PWRlYnVnZ2VyTW9kZWwudGFyZ2V0KCkpCnRoaXMuX2xpc3Quc2VsZWN0SXRlbShkZWJ1Z2dlck1vZGVsKTt9Cm1vZGVsUmVtb3ZlZChkZWJ1Z2dlck1vZGVsKXt0aGlzLl9pdGVtcy5yZW1vdmUodGhpcy5faXRlbXMuaW5kZXhPZihkZWJ1Z2dlck1vZGVsKSk7fQpfdGFyZ2V0Rmxhdm9yQ2hhbmdlZChldmVudCl7Y29uc3QgdGFyZ2V0PShldmVudC5kYXRhKTtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7aWYoZGVidWdnZXJNb2RlbCkKdGhpcy5fbGlzdC5zZWxlY3RJdGVtKGRlYnVnZ2VyTW9kZWwpO319OztTb3VyY2VzLlNjcmlwdEZvcm1hdHRlckVkaXRvckFjdGlvbj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhdGhzVG9Gb3JtYXRPbkxvYWQ9bmV3IFNldCgpO30KX2VkaXRvclNlbGVjdGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3VwZGF0ZUJ1dHRvbih1aVNvdXJjZUNvZGUpO2lmKHRoaXMuX2lzRm9ybWF0YWJsZVNjcmlwdCh1aVNvdXJjZUNvZGUpJiZ0aGlzLl9wYXRoc1RvRm9ybWF0T25Mb2FkLmhhcyh1aVNvdXJjZUNvZGUudXJsKCkpJiYhU291cmNlcy5zb3VyY2VGb3JtYXR0ZXIuaGFzRm9ybWF0dGVkKHVpU291cmNlQ29kZSkpCnRoaXMuX3Nob3dGb3JtYXR0ZWQodWlTb3VyY2VDb2RlKTt9Cl9lZGl0b3JDbG9zZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YS51aVNvdXJjZUNvZGUpO2NvbnN0IHdhc1NlbGVjdGVkPShldmVudC5kYXRhLndhc1NlbGVjdGVkKTtpZih3YXNTZWxlY3RlZCkKdGhpcy5fdXBkYXRlQnV0dG9uKG51bGwpO2NvbnN0IG9yaWdpbmFsPVNvdXJjZXMuc291cmNlRm9ybWF0dGVyLmRpc2NhcmRGb3JtYXR0ZWRVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtpZihvcmlnaW5hbCkKdGhpcy5fcGF0aHNUb0Zvcm1hdE9uTG9hZC5kZWxldGUob3JpZ2luYWwudXJsKCkpO30KX3VwZGF0ZUJ1dHRvbih1aVNvdXJjZUNvZGUpe3RoaXMuX2J1dHRvbi5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZGRlbicsIXRoaXMuX2lzRm9ybWF0YWJsZVNjcmlwdCh1aVNvdXJjZUNvZGUpKTt9CmJ1dHRvbihzb3VyY2VzVmlldyl7aWYodGhpcy5fYnV0dG9uKQpyZXR1cm4gdGhpcy5fYnV0dG9uO3RoaXMuX3NvdXJjZXNWaWV3PXNvdXJjZXNWaWV3O3RoaXMuX3NvdXJjZXNWaWV3LmFkZEV2ZW50TGlzdGVuZXIoU291cmNlcy5Tb3VyY2VzVmlldy5FdmVudHMuRWRpdG9yU2VsZWN0ZWQsdGhpcy5fZWRpdG9yU2VsZWN0ZWQuYmluZCh0aGlzKSk7dGhpcy5fc291cmNlc1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VzLlNvdXJjZXNWaWV3LkV2ZW50cy5FZGl0b3JDbG9zZWQsdGhpcy5fZWRpdG9yQ2xvc2VkLmJpbmQodGhpcykpO3RoaXMuX2J1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1ByZXR0eSBwcmludCcpLCdsYXJnZWljb24tcHJldHR5LXByaW50Jyk7dGhpcy5fYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fdG9nZ2xlRm9ybWF0U2NyaXB0U291cmNlLHRoaXMpO3RoaXMuX3VwZGF0ZUJ1dHRvbihzb3VyY2VzVmlldy5jdXJyZW50VUlTb3VyY2VDb2RlKCkpO3JldHVybiB0aGlzLl9idXR0b247fQpfaXNGb3JtYXRhYmxlU2NyaXB0KHVpU291cmNlQ29kZSl7aWYoIXVpU291cmNlQ29kZSkKcmV0dXJuIGZhbHNlO2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkuY2FuU2V0RmlsZUNvbnRlbnQoKSkKcmV0dXJuIGZhbHNlO2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5Gb3JtYXR0ZXIpCnJldHVybiBmYWxzZTtpZihQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSkpCnJldHVybiBmYWxzZTtyZXR1cm4gdWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCkuaGFzU2NyaXB0cygpO30KX3RvZ2dsZUZvcm1hdFNjcmlwdFNvdXJjZShldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX3NvdXJjZXNWaWV3LmN1cnJlbnRVSVNvdXJjZUNvZGUoKTtpZighdGhpcy5faXNGb3JtYXRhYmxlU2NyaXB0KHVpU291cmNlQ29kZSkpCnJldHVybjt0aGlzLl9wYXRoc1RvRm9ybWF0T25Mb2FkLmFkZCh1aVNvdXJjZUNvZGUudXJsKCkpO3RoaXMuX3Nob3dGb3JtYXR0ZWQodWlTb3VyY2VDb2RlKTt9CmFzeW5jIF9zaG93Rm9ybWF0dGVkKHVpU291cmNlQ29kZSl7Y29uc3QgZm9ybWF0RGF0YT1hd2FpdCBTb3VyY2VzLnNvdXJjZUZvcm1hdHRlci5mb3JtYXQodWlTb3VyY2VDb2RlKTtpZih1aVNvdXJjZUNvZGUhPT10aGlzLl9zb3VyY2VzVmlldy5jdXJyZW50VUlTb3VyY2VDb2RlKCkpCnJldHVybjtjb25zdCBzb3VyY2VGcmFtZT10aGlzLl9zb3VyY2VzVmlldy52aWV3Rm9yRmlsZSh1aVNvdXJjZUNvZGUpO2xldCBzdGFydD1bMCwwXTtpZihzb3VyY2VGcmFtZSl7Y29uc3Qgc2VsZWN0aW9uPXNvdXJjZUZyYW1lLnNlbGVjdGlvbigpO3N0YXJ0PWZvcm1hdERhdGEubWFwcGluZy5vcmlnaW5hbFRvRm9ybWF0dGVkKHNlbGVjdGlvbi5zdGFydExpbmUsc2VsZWN0aW9uLnN0YXJ0Q29sdW1uKTt9CnRoaXMuX3NvdXJjZXNWaWV3LnNob3dTb3VyY2VMb2NhdGlvbihmb3JtYXREYXRhLmZvcm1hdHRlZFNvdXJjZUNvZGUsc3RhcnRbMF0sc3RhcnRbMV0pO319OztTb3VyY2VzLklucGxhY2VGb3JtYXR0ZXJFZGl0b3JBY3Rpb249Y2xhc3N7X2VkaXRvclNlbGVjdGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3VwZGF0ZUJ1dHRvbih1aVNvdXJjZUNvZGUpO30KX2VkaXRvckNsb3NlZChldmVudCl7Y29uc3Qgd2FzU2VsZWN0ZWQ9KGV2ZW50LmRhdGEud2FzU2VsZWN0ZWQpO2lmKHdhc1NlbGVjdGVkKQp0aGlzLl91cGRhdGVCdXR0b24obnVsbCk7fQpfdXBkYXRlQnV0dG9uKHVpU291cmNlQ29kZSl7dGhpcy5fYnV0dG9uLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZGVuJywhdGhpcy5faXNGb3JtYXR0YWJsZSh1aVNvdXJjZUNvZGUpKTt9CmJ1dHRvbihzb3VyY2VzVmlldyl7aWYodGhpcy5fYnV0dG9uKQpyZXR1cm4gdGhpcy5fYnV0dG9uO3RoaXMuX3NvdXJjZXNWaWV3PXNvdXJjZXNWaWV3O3RoaXMuX3NvdXJjZXNWaWV3LmFkZEV2ZW50TGlzdGVuZXIoU291cmNlcy5Tb3VyY2VzVmlldy5FdmVudHMuRWRpdG9yU2VsZWN0ZWQsdGhpcy5fZWRpdG9yU2VsZWN0ZWQuYmluZCh0aGlzKSk7dGhpcy5fc291cmNlc1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VzLlNvdXJjZXNWaWV3LkV2ZW50cy5FZGl0b3JDbG9zZWQsdGhpcy5fZWRpdG9yQ2xvc2VkLmJpbmQodGhpcykpO3RoaXMuX2J1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0Zvcm1hdCcpLCdsYXJnZWljb24tcHJldHR5LXByaW50Jyk7dGhpcy5fYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fZm9ybWF0U291cmNlSW5QbGFjZSx0aGlzKTt0aGlzLl91cGRhdGVCdXR0b24oc291cmNlc1ZpZXcuY3VycmVudFVJU291cmNlQ29kZSgpKTtyZXR1cm4gdGhpcy5fYnV0dG9uO30KX2lzRm9ybWF0dGFibGUodWlTb3VyY2VDb2RlKXtpZighdWlTb3VyY2VDb2RlKQpyZXR1cm4gZmFsc2U7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS5jYW5TZXRGaWxlQ29udGVudCgpKQpyZXR1cm4gdHJ1ZTtpZihQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSkpCnJldHVybiB0cnVlO3JldHVybiB1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKS5pc1N0eWxlU2hlZXQoKTt9Cl9mb3JtYXRTb3VyY2VJblBsYWNlKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fc291cmNlc1ZpZXcuY3VycmVudFVJU291cmNlQ29kZSgpO2lmKCF0aGlzLl9pc0Zvcm1hdHRhYmxlKHVpU291cmNlQ29kZSkpCnJldHVybjtpZih1aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKQpjb250ZW50TG9hZGVkLmNhbGwodGhpcyx1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSk7ZWxzZQp1aVNvdXJjZUNvZGUucmVxdWVzdENvbnRlbnQoKS50aGVuKGNvbnRlbnRMb2FkZWQuYmluZCh0aGlzKSk7ZnVuY3Rpb24gY29udGVudExvYWRlZChjb250ZW50KXtjb25zdCBoaWdobGlnaHRlclR5cGU9dWlTb3VyY2VDb2RlLm1pbWVUeXBlKCk7Rm9ybWF0dGVyLkZvcm1hdHRlci5mb3JtYXQodWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCksaGlnaGxpZ2h0ZXJUeXBlLGNvbnRlbnR8fCcnLGlubmVyQ2FsbGJhY2suYmluZCh0aGlzKSk7fQpmdW5jdGlvbiBpbm5lckNhbGxiYWNrKGZvcm1hdHRlZENvbnRlbnQsZm9ybWF0dGVyTWFwcGluZyl7aWYodWlTb3VyY2VDb2RlLndvcmtpbmdDb3B5KCk9PT1mb3JtYXR0ZWRDb250ZW50KQpyZXR1cm47Y29uc3Qgc291cmNlRnJhbWU9dGhpcy5fc291cmNlc1ZpZXcudmlld0ZvckZpbGUodWlTb3VyY2VDb2RlKTtsZXQgc3RhcnQ9WzAsMF07aWYoc291cmNlRnJhbWUpe2NvbnN0IHNlbGVjdGlvbj1zb3VyY2VGcmFtZS5zZWxlY3Rpb24oKTtzdGFydD1mb3JtYXR0ZXJNYXBwaW5nLm9yaWdpbmFsVG9Gb3JtYXR0ZWQoc2VsZWN0aW9uLnN0YXJ0TGluZSxzZWxlY3Rpb24uc3RhcnRDb2x1bW4pO30KdWlTb3VyY2VDb2RlLnNldFdvcmtpbmdDb3B5KGZvcm1hdHRlZENvbnRlbnQpO3RoaXMuX3NvdXJjZXNWaWV3LnNob3dTb3VyY2VMb2NhdGlvbih1aVNvdXJjZUNvZGUsc3RhcnRbMF0sc3RhcnRbMV0pO319fTs7U291cmNlcy5Tb3VyY2VGb3JtYXREYXRhPWNsYXNze2NvbnN0cnVjdG9yKG9yaWdpbmFsU291cmNlQ29kZSxmb3JtYXR0ZWRTb3VyY2VDb2RlLG1hcHBpbmcpe3RoaXMub3JpZ2luYWxTb3VyY2VDb2RlPW9yaWdpbmFsU291cmNlQ29kZTt0aGlzLmZvcm1hdHRlZFNvdXJjZUNvZGU9Zm9ybWF0dGVkU291cmNlQ29kZTt0aGlzLm1hcHBpbmc9bWFwcGluZzt9Cm9yaWdpbmFsUGF0aCgpe3JldHVybiB0aGlzLm9yaWdpbmFsU291cmNlQ29kZS5wcm9qZWN0KCkuaWQoKSsnOicrdGhpcy5vcmlnaW5hbFNvdXJjZUNvZGUudXJsKCk7fQpzdGF0aWMgX2ZvcihvYmplY3Qpe3JldHVybiBvYmplY3RbU291cmNlcy5Tb3VyY2VGb3JtYXREYXRhLl9mb3JtYXREYXRhU3ltYm9sXTt9fTtTb3VyY2VzLlNvdXJjZUZvcm1hdERhdGEuX2Zvcm1hdERhdGFTeW1ib2w9U3ltYm9sKCdmb3JtYXREYXRhJyk7U291cmNlcy5Tb3VyY2VGb3JtYXR0ZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9wcm9qZWN0SWQ9J2Zvcm1hdHRlcjonO3RoaXMuX3Byb2plY3Q9bmV3IEJpbmRpbmdzLkNvbnRlbnRQcm92aWRlckJhc2VkUHJvamVjdChXb3Jrc3BhY2Uud29ya3NwYWNlLHRoaXMuX3Byb2plY3RJZCxXb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZvcm1hdHRlciwnZm9ybWF0dGVyJyx0cnVlKTt0aGlzLl9mb3JtYXR0ZWRTb3VyY2VDb2Rlcz1uZXcgTWFwKCk7dGhpcy5fc2NyaXB0TWFwcGluZz1uZXcgU291cmNlcy5Tb3VyY2VGb3JtYXR0ZXIuU2NyaXB0TWFwcGluZygpO3RoaXMuX3N0eWxlTWFwcGluZz1uZXcgU291cmNlcy5Tb3VyY2VGb3JtYXR0ZXIuU3R5bGVNYXBwaW5nKCk7V29ya3NwYWNlLndvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlVJU291cmNlQ29kZVJlbW92ZWQsdGhpcy5fb25VSVNvdXJjZUNvZGVSZW1vdmVkLHRoaXMpO30KX29uVUlTb3VyY2VDb2RlUmVtb3ZlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTtjb25zdCBjYWNoZUVudHJ5PXRoaXMuX2Zvcm1hdHRlZFNvdXJjZUNvZGVzLmdldCh1aVNvdXJjZUNvZGUpO2lmKGNhY2hlRW50cnkmJmNhY2hlRW50cnkuZm9ybWF0RGF0YSkKdGhpcy5fZGlzY2FyZEZvcm1hdERhdGEoY2FjaGVFbnRyeS5mb3JtYXREYXRhKTt0aGlzLl9mb3JtYXR0ZWRTb3VyY2VDb2Rlcy5yZW1vdmUodWlTb3VyY2VDb2RlKTt9CmRpc2NhcmRGb3JtYXR0ZWRVSVNvdXJjZUNvZGUoZm9ybWF0dGVkVUlTb3VyY2VDb2RlKXtjb25zdCBmb3JtYXREYXRhPVNvdXJjZXMuU291cmNlRm9ybWF0RGF0YS5fZm9yKGZvcm1hdHRlZFVJU291cmNlQ29kZSk7aWYoIWZvcm1hdERhdGEpCnJldHVybiBudWxsO3RoaXMuX2Rpc2NhcmRGb3JtYXREYXRhKGZvcm1hdERhdGEpO3RoaXMuX2Zvcm1hdHRlZFNvdXJjZUNvZGVzLnJlbW92ZShmb3JtYXREYXRhLm9yaWdpbmFsU291cmNlQ29kZSk7cmV0dXJuIGZvcm1hdERhdGEub3JpZ2luYWxTb3VyY2VDb2RlO30KX2Rpc2NhcmRGb3JtYXREYXRhKGZvcm1hdERhdGEpe2RlbGV0ZSBmb3JtYXREYXRhLmZvcm1hdHRlZFNvdXJjZUNvZGVbU291cmNlcy5Tb3VyY2VGb3JtYXREYXRhLl9mb3JtYXREYXRhU3ltYm9sXTt0aGlzLl9zY3JpcHRNYXBwaW5nLl9zZXRTb3VyY2VNYXBwaW5nRW5hYmxlZChmb3JtYXREYXRhLGZhbHNlKTt0aGlzLl9zdHlsZU1hcHBpbmcuX3NldFNvdXJjZU1hcHBpbmdFbmFibGVkKGZvcm1hdERhdGEsZmFsc2UpO3RoaXMuX3Byb2plY3QucmVtb3ZlRmlsZShmb3JtYXREYXRhLmZvcm1hdHRlZFNvdXJjZUNvZGUudXJsKCkpO30KaGFzRm9ybWF0dGVkKHVpU291cmNlQ29kZSl7cmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFNvdXJjZUNvZGVzLmhhcyh1aVNvdXJjZUNvZGUpO30KYXN5bmMgZm9ybWF0KHVpU291cmNlQ29kZSl7Y29uc3QgY2FjaGVFbnRyeT10aGlzLl9mb3JtYXR0ZWRTb3VyY2VDb2Rlcy5nZXQodWlTb3VyY2VDb2RlKTtpZihjYWNoZUVudHJ5KQpyZXR1cm4gY2FjaGVFbnRyeS5wcm9taXNlO2xldCBmdWxmaWxsRm9ybWF0UHJvbWlzZTtjb25zdCByZXN1bHRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9PntmdWxmaWxsRm9ybWF0UHJvbWlzZT1mdWxmaWxsO30pO3RoaXMuX2Zvcm1hdHRlZFNvdXJjZUNvZGVzLnNldCh1aVNvdXJjZUNvZGUse3Byb21pc2U6cmVzdWx0UHJvbWlzZSxmb3JtYXREYXRhOm51bGx9KTtjb25zdCBjb250ZW50PWF3YWl0IHVpU291cmNlQ29kZS5yZXF1ZXN0Q29udGVudCgpO0Zvcm1hdHRlci5Gb3JtYXR0ZXIuZm9ybWF0KHVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLHVpU291cmNlQ29kZS5taW1lVHlwZSgpLGNvbnRlbnR8fCcnLGZvcm1hdERvbmUuYmluZCh0aGlzKSk7cmV0dXJuIHJlc3VsdFByb21pc2U7ZnVuY3Rpb24gZm9ybWF0RG9uZShmb3JtYXR0ZWRDb250ZW50LGZvcm1hdHRlck1hcHBpbmcpe2NvbnN0IGNhY2hlRW50cnk9dGhpcy5fZm9ybWF0dGVkU291cmNlQ29kZXMuZ2V0KHVpU291cmNlQ29kZSk7aWYoIWNhY2hlRW50cnl8fGNhY2hlRW50cnkucHJvbWlzZSE9PXJlc3VsdFByb21pc2UpCnJldHVybjtsZXQgZm9ybWF0dGVkVVJMO2xldCBjb3VudD0wO2xldCBzdWZmaXg9Jyc7ZG97Zm9ybWF0dGVkVVJMPWAke3VpU291cmNlQ29kZS51cmwoKX06Zm9ybWF0dGVkJHtzdWZmaXh9YDtzdWZmaXg9YDoke2NvdW50Kyt9YDt9d2hpbGUodGhpcy5fcHJvamVjdC51aVNvdXJjZUNvZGVGb3JVUkwoZm9ybWF0dGVkVVJMKSk7Y29uc3QgY29udGVudFByb3ZpZGVyPUNvbW1vbi5TdGF0aWNDb250ZW50UHJvdmlkZXIuZnJvbVN0cmluZyhmb3JtYXR0ZWRVUkwsdWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCksZm9ybWF0dGVkQ29udGVudCk7Y29uc3QgZm9ybWF0dGVkVUlTb3VyY2VDb2RlPXRoaXMuX3Byb2plY3QuYWRkQ29udGVudFByb3ZpZGVyKGZvcm1hdHRlZFVSTCxjb250ZW50UHJvdmlkZXIsdWlTb3VyY2VDb2RlLm1pbWVUeXBlKCkpO2NvbnN0IGZvcm1hdERhdGE9bmV3IFNvdXJjZXMuU291cmNlRm9ybWF0RGF0YSh1aVNvdXJjZUNvZGUsZm9ybWF0dGVkVUlTb3VyY2VDb2RlLGZvcm1hdHRlck1hcHBpbmcpO2Zvcm1hdHRlZFVJU291cmNlQ29kZVtTb3VyY2VzLlNvdXJjZUZvcm1hdERhdGEuX2Zvcm1hdERhdGFTeW1ib2xdPWZvcm1hdERhdGE7dGhpcy5fc2NyaXB0TWFwcGluZy5fc2V0U291cmNlTWFwcGluZ0VuYWJsZWQoZm9ybWF0RGF0YSx0cnVlKTt0aGlzLl9zdHlsZU1hcHBpbmcuX3NldFNvdXJjZU1hcHBpbmdFbmFibGVkKGZvcm1hdERhdGEsdHJ1ZSk7Y2FjaGVFbnRyeS5mb3JtYXREYXRhPWZvcm1hdERhdGE7Zm9yKGNvbnN0IGRlY29yYXRpb24gb2YgdWlTb3VyY2VDb2RlLmFsbERlY29yYXRpb25zKCkpe2NvbnN0IHJhbmdlPWRlY29yYXRpb24ucmFuZ2UoKTtjb25zdCBzdGFydExvY2F0aW9uPWZvcm1hdHRlck1hcHBpbmcub3JpZ2luYWxUb0Zvcm1hdHRlZChyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pO2NvbnN0IGVuZExvY2F0aW9uPWZvcm1hdHRlck1hcHBpbmcub3JpZ2luYWxUb0Zvcm1hdHRlZChyYW5nZS5lbmRMaW5lLHJhbmdlLmVuZENvbHVtbik7Zm9ybWF0dGVkVUlTb3VyY2VDb2RlLmFkZERlY29yYXRpb24obmV3IFRleHRVdGlscy5UZXh0UmFuZ2Uoc3RhcnRMb2NhdGlvblswXSxzdGFydExvY2F0aW9uWzFdLGVuZExvY2F0aW9uWzBdLGVuZExvY2F0aW9uWzFdKSwoZGVjb3JhdGlvbi50eXBlKCkpLGRlY29yYXRpb24uZGF0YSgpKTt9CmZ1bGZpbGxGb3JtYXRQcm9taXNlKGZvcm1hdERhdGEpO319fTtTb3VyY2VzLlNvdXJjZUZvcm1hdHRlci5TY3JpcHRNYXBwaW5nPWNsYXNze2NvbnN0cnVjdG9yKCl7QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLmFkZFNvdXJjZU1hcHBpbmcodGhpcyk7fQpyYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbil7Y29uc3Qgc2NyaXB0PXJhd0xvY2F0aW9uLnNjcmlwdCgpO2NvbnN0IGZvcm1hdERhdGE9c2NyaXB0JiZTb3VyY2VzLlNvdXJjZUZvcm1hdERhdGEuX2ZvcihzY3JpcHQpO2lmKCFmb3JtYXREYXRhKQpyZXR1cm4gbnVsbDtjb25zdCBsaW5lTnVtYmVyPXJhd0xvY2F0aW9uLmxpbmVOdW1iZXI7Y29uc3QgY29sdW1uTnVtYmVyPXJhd0xvY2F0aW9uLmNvbHVtbk51bWJlcnx8MDtjb25zdCBmb3JtYXR0ZWRMb2NhdGlvbj1mb3JtYXREYXRhLm1hcHBpbmcub3JpZ2luYWxUb0Zvcm1hdHRlZChsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7cmV0dXJuIGZvcm1hdERhdGEuZm9ybWF0dGVkU291cmNlQ29kZS51aUxvY2F0aW9uKGZvcm1hdHRlZExvY2F0aW9uWzBdLGZvcm1hdHRlZExvY2F0aW9uWzFdKTt9CnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7Y29uc3QgZm9ybWF0RGF0YT1Tb3VyY2VzLlNvdXJjZUZvcm1hdERhdGEuX2Zvcih1aVNvdXJjZUNvZGUpO2lmKCFmb3JtYXREYXRhKQpyZXR1cm4gbnVsbDtjb25zdCBvcmlnaW5hbExvY2F0aW9uPWZvcm1hdERhdGEubWFwcGluZy5mb3JtYXR0ZWRUb09yaWdpbmFsKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTtjb25zdCBzY3JpcHRzPXRoaXMuX3NjcmlwdHNGb3JVSVNvdXJjZUNvZGUoZm9ybWF0RGF0YS5vcmlnaW5hbFNvdXJjZUNvZGUpO2lmKCFzY3JpcHRzLmxlbmd0aCkKcmV0dXJuIG51bGw7cmV0dXJuIHNjcmlwdHNbMF0uZGVidWdnZXJNb2RlbC5jcmVhdGVSYXdMb2NhdGlvbihzY3JpcHRzWzBdLG9yaWdpbmFsTG9jYXRpb25bMF0sb3JpZ2luYWxMb2NhdGlvblsxXSk7fQpfc2V0U291cmNlTWFwcGluZ0VuYWJsZWQoZm9ybWF0RGF0YSxlbmFibGVkKXtjb25zdCBzY3JpcHRzPXRoaXMuX3NjcmlwdHNGb3JVSVNvdXJjZUNvZGUoZm9ybWF0RGF0YS5vcmlnaW5hbFNvdXJjZUNvZGUpO2lmKCFzY3JpcHRzLmxlbmd0aCkKcmV0dXJuO2lmKGVuYWJsZWQpe2Zvcihjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykKc2NyaXB0W1NvdXJjZXMuU291cmNlRm9ybWF0RGF0YS5fZm9ybWF0RGF0YVN5bWJvbF09Zm9ybWF0RGF0YTt9ZWxzZXtmb3IoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpCmRlbGV0ZSBzY3JpcHRbU291cmNlcy5Tb3VyY2VGb3JtYXREYXRhLl9mb3JtYXREYXRhU3ltYm9sXTt9CmZvcihjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykKQmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVwZGF0ZUxvY2F0aW9ucyhzY3JpcHQpO30KX3NjcmlwdHNGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKXtpZih1aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkRvY3VtZW50KXtjb25zdCB0YXJnZXQ9QmluZGluZ3MuTmV0d29ya1Byb2plY3QudGFyZ2V0Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7Y29uc3QgZGVidWdnZXJNb2RlbD10YXJnZXQmJnRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7aWYoZGVidWdnZXJNb2RlbCl7Y29uc3Qgc2NyaXB0cz1kZWJ1Z2dlck1vZGVsLnNjcmlwdHNGb3JTb3VyY2VVUkwodWlTb3VyY2VDb2RlLnVybCgpKS5maWx0ZXIoc2NyaXB0PT5zY3JpcHQuaXNJbmxpbmVTY3JpcHQoKSYmIXNjcmlwdC5oYXNTb3VyY2VVUkwpO3JldHVybiBzY3JpcHRzO319CmlmKHVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzU2NyaXB0KCkpe2NvbnN0IHJhd0xvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy51aUxvY2F0aW9uVG9SYXdMb2NhdGlvbih1aVNvdXJjZUNvZGUsMCwwKTtpZihyYXdMb2NhdGlvbikKcmV0dXJuW3Jhd0xvY2F0aW9uLnNjcmlwdCgpXTt9CnJldHVybltdO319O1NvdXJjZXMuU291cmNlRm9ybWF0dGVyLlN0eWxlTWFwcGluZz1jbGFzc3tjb25zdHJ1Y3Rvcigpe0JpbmRpbmdzLmNzc1dvcmtzcGFjZUJpbmRpbmcuYWRkU291cmNlTWFwcGluZyh0aGlzKTt0aGlzLl9oZWFkZXJzU3ltYm9sPVN5bWJvbCgnU291cmNlcy5Tb3VyY2VGb3JtYXR0ZXIuU3R5bGVNYXBwaW5nLl9oZWFkZXJzU3ltYm9sJyk7fQpyYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbil7Y29uc3Qgc3R5bGVIZWFkZXI9cmF3TG9jYXRpb24uaGVhZGVyKCk7Y29uc3QgZm9ybWF0RGF0YT1zdHlsZUhlYWRlciYmU291cmNlcy5Tb3VyY2VGb3JtYXREYXRhLl9mb3Ioc3R5bGVIZWFkZXIpO2lmKCFmb3JtYXREYXRhKQpyZXR1cm4gbnVsbDtjb25zdCBmb3JtYXR0ZWRMb2NhdGlvbj1mb3JtYXREYXRhLm1hcHBpbmcub3JpZ2luYWxUb0Zvcm1hdHRlZChyYXdMb2NhdGlvbi5saW5lTnVtYmVyLHJhd0xvY2F0aW9uLmNvbHVtbk51bWJlcnx8MCk7cmV0dXJuIGZvcm1hdERhdGEuZm9ybWF0dGVkU291cmNlQ29kZS51aUxvY2F0aW9uKGZvcm1hdHRlZExvY2F0aW9uWzBdLGZvcm1hdHRlZExvY2F0aW9uWzFdKTt9CnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9ucyh1aUxvY2F0aW9uKXtjb25zdCBmb3JtYXREYXRhPVNvdXJjZXMuU291cmNlRm9ybWF0RGF0YS5fZm9yKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlKTtpZighZm9ybWF0RGF0YSkKcmV0dXJuW107Y29uc3Qgb3JpZ2luYWxMb2NhdGlvbj1mb3JtYXREYXRhLm1hcHBpbmcuZm9ybWF0dGVkVG9PcmlnaW5hbCh1aUxvY2F0aW9uLmxpbmVOdW1iZXIsdWlMb2NhdGlvbi5jb2x1bW5OdW1iZXIpO2NvbnN0IGhlYWRlcnM9Zm9ybWF0RGF0YS5vcmlnaW5hbFNvdXJjZUNvZGVbdGhpcy5faGVhZGVyc1N5bWJvbF07cmV0dXJuIGhlYWRlcnMubWFwKGhlYWRlcj0+bmV3IFNESy5DU1NMb2NhdGlvbihoZWFkZXIsb3JpZ2luYWxMb2NhdGlvblswXSxvcmlnaW5hbExvY2F0aW9uWzFdKSk7fQpfc2V0U291cmNlTWFwcGluZ0VuYWJsZWQoZm9ybWF0RGF0YSxlbmFibGUpe2NvbnN0IG9yaWdpbmFsPWZvcm1hdERhdGEub3JpZ2luYWxTb3VyY2VDb2RlO2NvbnN0IHJhd0xvY2F0aW9ucz1CaW5kaW5ncy5jc3NXb3Jrc3BhY2VCaW5kaW5nLnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9ucyhvcmlnaW5hbC51aUxvY2F0aW9uKDAsMCkpO2NvbnN0IGhlYWRlcnM9cmF3TG9jYXRpb25zLm1hcChyYXdMb2NhdGlvbj0+cmF3TG9jYXRpb24uaGVhZGVyKCkpLmZpbHRlcihoZWFkZXI9PiEhaGVhZGVyKTtpZighaGVhZGVycy5sZW5ndGgpCnJldHVybjtpZihlbmFibGUpe29yaWdpbmFsW3RoaXMuX2hlYWRlcnNTeW1ib2xdPWhlYWRlcnM7aGVhZGVycy5mb3JFYWNoKGhlYWRlcj0+aGVhZGVyW1NvdXJjZXMuU291cmNlRm9ybWF0RGF0YS5fZm9ybWF0RGF0YVN5bWJvbF09Zm9ybWF0RGF0YSk7fWVsc2V7b3JpZ2luYWxbdGhpcy5faGVhZGVyc1N5bWJvbF09bnVsbDtoZWFkZXJzLmZvckVhY2goaGVhZGVyPT5kZWxldGUgaGVhZGVyW1NvdXJjZXMuU291cmNlRm9ybWF0RGF0YS5fZm9ybWF0RGF0YVN5bWJvbF0pO30KaGVhZGVycy5mb3JFYWNoKGhlYWRlcj0+QmluZGluZ3MuY3NzV29ya3NwYWNlQmluZGluZy51cGRhdGVMb2NhdGlvbnMoaGVhZGVyKSk7fX07U291cmNlcy5zb3VyY2VGb3JtYXR0ZXI9bmV3IFNvdXJjZXMuU291cmNlRm9ybWF0dGVyKCk7O1NvdXJjZXMuT3BlbkZpbGVRdWlja09wZW49Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLkZpbHRlcmVkVUlTb3VyY2VDb2RlTGlzdFByb3ZpZGVye2F0dGFjaCgpe3RoaXMuc2V0RGVmYXVsdFNjb3JlcyhTb3VyY2VzLlNvdXJjZXNWaWV3LmRlZmF1bHRVSVNvdXJjZUNvZGVTY29yZXMoKSk7c3VwZXIuYXR0YWNoKCk7fQp1aVNvdXJjZUNvZGVTZWxlY3RlZCh1aVNvdXJjZUNvZGUsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe0hvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uU2VsZWN0RmlsZUZyb21GaWxlUGlja2VyKTtpZighdWlTb3VyY2VDb2RlKQpyZXR1cm47aWYodHlwZW9mIGxpbmVOdW1iZXI9PT0nbnVtYmVyJykKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUudWlMb2NhdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcikpO2Vsc2UKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1aVNvdXJjZUNvZGUpO30KZmlsdGVyUHJvamVjdChwcm9qZWN0KXtyZXR1cm4hcHJvamVjdC5pc1NlcnZpY2VQcm9qZWN0KCk7fQpyZW5kZXJBc1R3b1Jvd3MoKXtyZXR1cm4gdHJ1ZTt9fTs7U291cmNlcy5Tb3VyY2VzVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnc291cmNlcy9zb3VyY2VzVmlldy5jc3MnKTt0aGlzLmVsZW1lbnQuaWQ9J3NvdXJjZXMtcGFuZWwtc291cmNlcy12aWV3Jzt0aGlzLnNldE1pbmltdW1BbmRQcmVmZXJyZWRTaXplcyg4OCw1MiwxNTAsMTAwKTtjb25zdCB3b3Jrc3BhY2U9V29ya3NwYWNlLndvcmtzcGFjZTt0aGlzLl9zZWFyY2hhYmxlVmlldz1uZXcgVUkuU2VhcmNoYWJsZVZpZXcodGhpcywnc291cmNlc1ZpZXdTZWFyY2hDb25maWcnKTt0aGlzLl9zZWFyY2hhYmxlVmlldy5zZXRNaW5pbWFsU2VhcmNoUXVlcnlTaXplKDApO3RoaXMuX3NlYXJjaGFibGVWaWV3LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9zb3VyY2VWaWV3QnlVSVNvdXJjZUNvZGU9bmV3IE1hcCgpO3RoaXMuX2VkaXRvckNvbnRhaW5lcj1uZXcgU291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIodGhpcyxDb21tb24uc2V0dGluZ3MuY3JlYXRlTG9jYWxTZXR0aW5nKCdwcmV2aW91c2x5Vmlld2VkRmlsZXMnLFtdKSx0aGlzLl9wbGFjZWhvbGRlckVsZW1lbnQoKSk7dGhpcy5fZWRpdG9yQ29udGFpbmVyLnNob3codGhpcy5fc2VhcmNoYWJsZVZpZXcuZWxlbWVudCk7dGhpcy5fZWRpdG9yQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoU291cmNlcy5UYWJiZWRFZGl0b3JDb250YWluZXIuRXZlbnRzLkVkaXRvclNlbGVjdGVkLHRoaXMuX2VkaXRvclNlbGVjdGVkLHRoaXMpO3RoaXMuX2VkaXRvckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFNvdXJjZXMuVGFiYmVkRWRpdG9yQ29udGFpbmVyLkV2ZW50cy5FZGl0b3JDbG9zZWQsdGhpcy5fZWRpdG9yQ2xvc2VkLHRoaXMpO3RoaXMuX2hpc3RvcnlNYW5hZ2VyPW5ldyBTb3VyY2VzLkVkaXRpbmdMb2NhdGlvbkhpc3RvcnlNYW5hZ2VyKHRoaXMsdGhpcy5jdXJyZW50U291cmNlRnJhbWUuYmluZCh0aGlzKSk7dGhpcy5fdG9vbGJhckNvbnRhaW5lckVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdzb3VyY2VzLXRvb2xiYXInKTtpZighUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ3NvdXJjZXNQcmV0dHlQcmludCcpKXt0aGlzLl90b29sYmFyRWRpdG9yQWN0aW9ucz1uZXcgVUkuVG9vbGJhcignJyx0aGlzLl90b29sYmFyQ29udGFpbmVyRWxlbWVudCk7c2VsZi5ydW50aW1lLmFsbEluc3RhbmNlcyhTb3VyY2VzLlNvdXJjZXNWaWV3LkVkaXRvckFjdGlvbikudGhlbihhcHBlbmRCdXR0b25zRm9yRXh0ZW5zaW9ucy5iaW5kKHRoaXMpKTt9CmZ1bmN0aW9uIGFwcGVuZEJ1dHRvbnNGb3JFeHRlbnNpb25zKGFjdGlvbnMpe2ZvcihsZXQgaT0wO2k8YWN0aW9ucy5sZW5ndGg7KytpKQp0aGlzLl90b29sYmFyRWRpdG9yQWN0aW9ucy5hcHBlbmRUb29sYmFySXRlbShhY3Rpb25zW2ldLmJ1dHRvbih0aGlzKSk7fQp0aGlzLl9zY3JpcHRWaWV3VG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0aGlzLl90b29sYmFyQ29udGFpbmVyRWxlbWVudCk7dGhpcy5fc2NyaXB0Vmlld1Rvb2xiYXIuZWxlbWVudC5zdHlsZS5mbGV4PSdhdXRvJzt0aGlzLl9ib3R0b21Ub29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLHRoaXMuX3Rvb2xiYXJDb250YWluZXJFbGVtZW50KTt0aGlzLl90b29sYmFyQ2hhbmdlZExpc3RlbmVyPW51bGw7VUkuc3RhcnRCYXRjaFVwZGF0ZSgpO3dvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl9hZGRVSVNvdXJjZUNvZGUuYmluZCh0aGlzKSk7VUkuZW5kQmF0Y2hVcGRhdGUoKTt3b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVBZGRlZCx0aGlzLl91aVNvdXJjZUNvZGVBZGRlZCx0aGlzKTt3b3Jrc3BhY2UuYWRkRXZlbnRMaXN0ZW5lcihXb3Jrc3BhY2UuV29ya3NwYWNlLkV2ZW50cy5VSVNvdXJjZUNvZGVSZW1vdmVkLHRoaXMuX3VpU291cmNlQ29kZVJlbW92ZWQsdGhpcyk7d29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuUHJvamVjdFJlbW92ZWQsdGhpcy5fcHJvamVjdFJlbW92ZWQuYmluZCh0aGlzKSx0aGlzKTtmdW5jdGlvbiBoYW5kbGVCZWZvcmVVbmxvYWQoZXZlbnQpe2lmKGV2ZW50LnJldHVyblZhbHVlKQpyZXR1cm47bGV0IHVuc2F2ZWRTb3VyY2VDb2Rlcz1bXTtjb25zdCBwcm9qZWN0cz1Xb3Jrc3BhY2Uud29ya3NwYWNlLnByb2plY3RzRm9yVHlwZShXb3Jrc3BhY2UucHJvamVjdFR5cGVzLkZpbGVTeXN0ZW0pO2ZvcihsZXQgaT0wO2k8cHJvamVjdHMubGVuZ3RoOysraSl7dW5zYXZlZFNvdXJjZUNvZGVzPXVuc2F2ZWRTb3VyY2VDb2Rlcy5jb25jYXQocHJvamVjdHNbaV0udWlTb3VyY2VDb2RlcygpLmZpbHRlcihzb3VyY2VDb2RlPT5zb3VyY2VDb2RlLmlzRGlydHkoKSkpO30KaWYoIXVuc2F2ZWRTb3VyY2VDb2Rlcy5sZW5ndGgpCnJldHVybjtldmVudC5yZXR1cm5WYWx1ZT1Db21tb24uVUlTdHJpbmcoJ0RldlRvb2xzIGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBwZXJtYW5lbnRseSBsb3N0LicpO1VJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KCdzb3VyY2VzJyk7Zm9yKGxldCBpPTA7aTx1bnNhdmVkU291cmNlQ29kZXMubGVuZ3RoOysraSkKQ29tbW9uLlJldmVhbGVyLnJldmVhbCh1bnNhdmVkU291cmNlQ29kZXNbaV0pO30KaWYoIXdpbmRvdy5vcGVuZXIpCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLGhhbmRsZUJlZm9yZVVubG9hZCx0cnVlKTt0aGlzLl9zaG9ydGN1dHM9e307dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2hhbmRsZUtleURvd24uYmluZCh0aGlzKSxmYWxzZSk7fQpfcGxhY2Vob2xkZXJFbGVtZW50KCl7Y29uc3Qgc2hvcnRjdXRzPVt7YWN0aW9uSWQ6J3F1aWNrT3Blbi5zaG93JyxkZXNjcmlwdGlvbjpDb21tb24uVUlTdHJpbmcoJ09wZW4gZmlsZScpfSx7YWN0aW9uSWQ6J2NvbW1hbmRNZW51LnNob3cnLGRlc2NyaXB0aW9uOkNvbW1vbi5VSVN0cmluZygnUnVuIGNvbW1hbmQnKX1dO2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ3RhYmJlZC1wYW5lLXBsYWNlaG9sZGVyJyk7Zm9yKGNvbnN0IHNob3J0Y3V0IG9mIHNob3J0Y3V0cyl7Y29uc3Qgc2hvcnRjdXRLZXlUZXh0PVVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXRUaXRsZUZvckFjdGlvbihzaG9ydGN1dC5hY3Rpb25JZCk7Y29uc3Qgcm93PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RhYmJlZC1wYW5lLXBsYWNlaG9sZGVyLXJvdycpO3Jvdy5jcmVhdGVDaGlsZCgnZGl2JywndGFiYmVkLXBhbmUtcGxhY2Vob2xkZXIta2V5JykudGV4dENvbnRlbnQ9c2hvcnRjdXRLZXlUZXh0O3Jvdy5jcmVhdGVDaGlsZCgnZGl2JywndGFiYmVkLXBhbmUtcGxhY2Vob2xkZXItdmFsdWUnKS50ZXh0Q29udGVudD1zaG9ydGN1dC5kZXNjcmlwdGlvbjt9CmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnRHJvcCBpbiBhIGZvbGRlciB0byBhZGQgdG8gd29ya3NwYWNlJyk7ZWxlbWVudC5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUoJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9jaHJvbWUtZGV2dG9vbHMvc291cmNlcz91dG1fc291cmNlPWRldnRvb2xzJnV0bV9jYW1wYWlnbj0yMDE4UTEnLCdMZWFybiBtb3JlJykpO3JldHVybiBlbGVtZW50O30Kc3RhdGljIGRlZmF1bHRVSVNvdXJjZUNvZGVTY29yZXMoKXtjb25zdCBkZWZhdWx0U2NvcmVzPW5ldyBNYXAoKTtjb25zdCBzb3VyY2VzVmlldz1VSS5jb250ZXh0LmZsYXZvcihTb3VyY2VzLlNvdXJjZXNWaWV3KTtpZihzb3VyY2VzVmlldyl7Y29uc3QgdWlTb3VyY2VDb2Rlcz1zb3VyY2VzVmlldy5fZWRpdG9yQ29udGFpbmVyLmhpc3RvcnlVSVNvdXJjZUNvZGVzKCk7Zm9yKGxldCBpPTE7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpCmRlZmF1bHRTY29yZXMuc2V0KHVpU291cmNlQ29kZXNbaV0sdWlTb3VyY2VDb2Rlcy5sZW5ndGgtaSk7fQpyZXR1cm4gZGVmYXVsdFNjb3Jlczt9CmxlZnRUb29sYmFyKCl7cmV0dXJuIHRoaXMuX2VkaXRvckNvbnRhaW5lci5sZWZ0VG9vbGJhcigpO30KcmlnaHRUb29sYmFyKCl7cmV0dXJuIHRoaXMuX2VkaXRvckNvbnRhaW5lci5yaWdodFRvb2xiYXIoKTt9CmJvdHRvbVRvb2xiYXIoKXtyZXR1cm4gdGhpcy5fYm90dG9tVG9vbGJhcjt9Cl9yZWdpc3RlclNob3J0Y3V0cyhrZXlzLGhhbmRsZXIpe2ZvcihsZXQgaT0wO2k8a2V5cy5sZW5ndGg7KytpKQp0aGlzLl9zaG9ydGN1dHNba2V5c1tpXS5rZXldPWhhbmRsZXI7fQpfaGFuZGxlS2V5RG93bihldmVudCl7Y29uc3Qgc2hvcnRjdXRLZXk9VUkuS2V5Ym9hcmRTaG9ydGN1dC5tYWtlS2V5RnJvbUV2ZW50KGV2ZW50KTtjb25zdCBoYW5kbGVyPXRoaXMuX3Nob3J0Y3V0c1tzaG9ydGN1dEtleV07aWYoaGFuZGxlciYmaGFuZGxlcigpKQpldmVudC5jb25zdW1lKHRydWUpO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNvdXJjZXMuU291cmNlc1ZpZXcsdGhpcyk7fQp3aWxsSGlkZSgpe1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNvdXJjZXMuU291cmNlc1ZpZXcsbnVsbCk7c3VwZXIud2lsbEhpZGUoKTt9CnRvb2xiYXJDb250YWluZXJFbGVtZW50KCl7cmV0dXJuIHRoaXMuX3Rvb2xiYXJDb250YWluZXJFbGVtZW50O30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc2VhcmNoYWJsZVZpZXc7fQp2aXNpYmxlVmlldygpe3JldHVybiB0aGlzLl9lZGl0b3JDb250YWluZXIudmlzaWJsZVZpZXc7fQpjdXJyZW50U291cmNlRnJhbWUoKXtjb25zdCB2aWV3PXRoaXMudmlzaWJsZVZpZXcoKTtpZighKHZpZXcgaW5zdGFuY2VvZiBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKSkKcmV0dXJuIG51bGw7cmV0dXJuKHZpZXcpO30KY3VycmVudFVJU291cmNlQ29kZSgpe3JldHVybiB0aGlzLl9lZGl0b3JDb250YWluZXIuY3VycmVudEZpbGUoKTt9Cl9vbkNsb3NlRWRpdG9yVGFiKCl7Y29uc3QgdWlTb3VyY2VDb2RlPXRoaXMuX2VkaXRvckNvbnRhaW5lci5jdXJyZW50RmlsZSgpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybiBmYWxzZTt0aGlzLl9lZGl0b3JDb250YWluZXIuY2xvc2VGaWxlKHVpU291cmNlQ29kZSk7cmV0dXJuIHRydWU7fQpfb25KdW1wVG9QcmV2aW91c0xvY2F0aW9uKCl7dGhpcy5faGlzdG9yeU1hbmFnZXIucm9sbGJhY2soKTt9Cl9vbkp1bXBUb05leHRMb2NhdGlvbigpe3RoaXMuX2hpc3RvcnlNYW5hZ2VyLnJvbGxvdmVyKCk7fQpfdWlTb3VyY2VDb2RlQWRkZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7dGhpcy5fYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7fQpfYWRkVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS5pc1NlcnZpY2VQcm9qZWN0KCkpCnJldHVybjtpZih1aVNvdXJjZUNvZGUucHJvamVjdCgpLnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuRmlsZVN5c3RlbSYmUGVyc2lzdGVuY2UuRmlsZVN5c3RlbVdvcmtzcGFjZUJpbmRpbmcuZmlsZVN5c3RlbVR5cGUodWlTb3VyY2VDb2RlLnByb2plY3QoKSk9PT0nb3ZlcnJpZGVzJykKcmV0dXJuO3RoaXMuX2VkaXRvckNvbnRhaW5lci5hZGRVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTt9Cl91aVNvdXJjZUNvZGVSZW1vdmVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO3RoaXMuX3JlbW92ZVVJU291cmNlQ29kZXMoW3VpU291cmNlQ29kZV0pO30KX3JlbW92ZVVJU291cmNlQ29kZXModWlTb3VyY2VDb2Rlcyl7dGhpcy5fZWRpdG9yQ29udGFpbmVyLnJlbW92ZVVJU291cmNlQ29kZXModWlTb3VyY2VDb2Rlcyk7Zm9yKGxldCBpPTA7aTx1aVNvdXJjZUNvZGVzLmxlbmd0aDsrK2kpe3RoaXMuX3JlbW92ZVNvdXJjZUZyYW1lKHVpU291cmNlQ29kZXNbaV0pO3RoaXMuX2hpc3RvcnlNYW5hZ2VyLnJlbW92ZUhpc3RvcnlGb3JTb3VyY2VDb2RlKHVpU291cmNlQ29kZXNbaV0pO319Cl9wcm9qZWN0UmVtb3ZlZChldmVudCl7Y29uc3QgcHJvamVjdD1ldmVudC5kYXRhO2NvbnN0IHVpU291cmNlQ29kZXM9cHJvamVjdC51aVNvdXJjZUNvZGVzKCk7dGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2Rlcyh1aVNvdXJjZUNvZGVzKTt9Cl91cGRhdGVTY3JpcHRWaWV3VG9vbGJhckl0ZW1zKCl7dGhpcy5fc2NyaXB0Vmlld1Rvb2xiYXIucmVtb3ZlVG9vbGJhckl0ZW1zKCk7Y29uc3Qgdmlldz10aGlzLnZpc2libGVWaWV3KCk7aWYodmlldyBpbnN0YW5jZW9mIFVJLlNpbXBsZVZpZXcpe2Zvcihjb25zdCBpdGVtIG9mKCh2aWV3KSkuc3luY1Rvb2xiYXJJdGVtcygpKQp0aGlzLl9zY3JpcHRWaWV3VG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShpdGVtKTt9fQpzaG93U291cmNlTG9jYXRpb24odWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLG9taXRGb2N1cyxvbWl0SGlnaGxpZ2h0KXt0aGlzLl9oaXN0b3J5TWFuYWdlci51cGRhdGVDdXJyZW50U3RhdGUoKTt0aGlzLl9lZGl0b3JDb250YWluZXIuc2hvd0ZpbGUodWlTb3VyY2VDb2RlKTtjb25zdCBjdXJyZW50U291cmNlRnJhbWU9dGhpcy5jdXJyZW50U291cmNlRnJhbWUoKTtpZihjdXJyZW50U291cmNlRnJhbWUmJnR5cGVvZiBsaW5lTnVtYmVyPT09J251bWJlcicpCmN1cnJlbnRTb3VyY2VGcmFtZS5yZXZlYWxQb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlciwhb21pdEhpZ2hsaWdodCk7dGhpcy5faGlzdG9yeU1hbmFnZXIucHVzaE5ld1N0YXRlKCk7aWYoIW9taXRGb2N1cykKdGhpcy52aXNpYmxlVmlldygpLmZvY3VzKCk7fQpfY3JlYXRlU291cmNlVmlldyh1aVNvdXJjZUNvZGUpe2xldCBzb3VyY2VGcmFtZTtsZXQgc291cmNlVmlldztjb25zdCBjb250ZW50VHlwZT11aVNvdXJjZUNvZGUuY29udGVudFR5cGUoKTtpZihjb250ZW50VHlwZT09PUNvbW1vbi5yZXNvdXJjZVR5cGVzLkltYWdlKQpzb3VyY2VWaWV3PW5ldyBTb3VyY2VGcmFtZS5JbWFnZVZpZXcodWlTb3VyY2VDb2RlLm1pbWVUeXBlKCksdWlTb3VyY2VDb2RlKTtlbHNlIGlmKGNvbnRlbnRUeXBlPT09Q29tbW9uLnJlc291cmNlVHlwZXMuRm9udCkKc291cmNlVmlldz1uZXcgU291cmNlRnJhbWUuRm9udFZpZXcodWlTb3VyY2VDb2RlLm1pbWVUeXBlKCksdWlTb3VyY2VDb2RlKTtlbHNlCnNvdXJjZUZyYW1lPW5ldyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKHVpU291cmNlQ29kZSk7aWYoc291cmNlRnJhbWUpCnRoaXMuX2hpc3RvcnlNYW5hZ2VyLnRyYWNrU291cmNlRnJhbWVDdXJzb3JKdW1wcyhzb3VyY2VGcmFtZSk7Y29uc3Qgd2lkZ2V0PShzb3VyY2VGcmFtZXx8c291cmNlVmlldyk7dGhpcy5fc291cmNlVmlld0J5VUlTb3VyY2VDb2RlLnNldCh1aVNvdXJjZUNvZGUsd2lkZ2V0KTtyZXR1cm4gd2lkZ2V0O30KX2dldE9yQ3JlYXRlU291cmNlVmlldyh1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLl9zb3VyY2VWaWV3QnlVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSl8fHRoaXMuX2NyZWF0ZVNvdXJjZVZpZXcodWlTb3VyY2VDb2RlKTt9CnJlY3ljbGVVSVNvdXJjZUNvZGVGcmFtZShzb3VyY2VGcmFtZSx1aVNvdXJjZUNvZGUpe3RoaXMuX3NvdXJjZVZpZXdCeVVJU291cmNlQ29kZS5kZWxldGUoc291cmNlRnJhbWUudWlTb3VyY2VDb2RlKCkpO3NvdXJjZUZyYW1lLnNldFVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO3RoaXMuX3NvdXJjZVZpZXdCeVVJU291cmNlQ29kZS5zZXQodWlTb3VyY2VDb2RlLHNvdXJjZUZyYW1lKTt9CnZpZXdGb3JGaWxlKHVpU291cmNlQ29kZSl7cmV0dXJuIHRoaXMuX2dldE9yQ3JlYXRlU291cmNlVmlldyh1aVNvdXJjZUNvZGUpO30KX3JlbW92ZVNvdXJjZUZyYW1lKHVpU291cmNlQ29kZSl7Y29uc3Qgc291cmNlVmlldz10aGlzLl9zb3VyY2VWaWV3QnlVSVNvdXJjZUNvZGUuZ2V0KHVpU291cmNlQ29kZSk7dGhpcy5fc291cmNlVmlld0J5VUlTb3VyY2VDb2RlLnJlbW92ZSh1aVNvdXJjZUNvZGUpO2lmKHNvdXJjZVZpZXcmJnNvdXJjZVZpZXcgaW5zdGFuY2VvZiBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKQooc291cmNlVmlldykuZGlzcG9zZSgpO30KX2VkaXRvckNsb3NlZChldmVudCl7Y29uc3QgdWlTb3VyY2VDb2RlPShldmVudC5kYXRhKTt0aGlzLl9oaXN0b3J5TWFuYWdlci5yZW1vdmVIaXN0b3J5Rm9yU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO2xldCB3YXNTZWxlY3RlZD1mYWxzZTtpZighdGhpcy5fZWRpdG9yQ29udGFpbmVyLmN1cnJlbnRGaWxlKCkpCndhc1NlbGVjdGVkPXRydWU7dGhpcy5fcmVtb3ZlVG9vbGJhckNoYW5nZWRMaXN0ZW5lcigpO3RoaXMuX3VwZGF0ZVNjcmlwdFZpZXdUb29sYmFySXRlbXMoKTt0aGlzLl9zZWFyY2hhYmxlVmlldy5yZXNldFNlYXJjaCgpO2NvbnN0IGRhdGE9e307ZGF0YS51aVNvdXJjZUNvZGU9dWlTb3VyY2VDb2RlO2RhdGEud2FzU2VsZWN0ZWQ9d2FzU2VsZWN0ZWQ7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoU291cmNlcy5Tb3VyY2VzVmlldy5FdmVudHMuRWRpdG9yQ2xvc2VkLGRhdGEpO30KX2VkaXRvclNlbGVjdGVkKGV2ZW50KXtjb25zdCBwcmV2aW91c1NvdXJjZUZyYW1lPWV2ZW50LmRhdGEucHJldmlvdXNWaWV3IGluc3RhbmNlb2YgU291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZT9ldmVudC5kYXRhLnByZXZpb3VzVmlldzpudWxsO2lmKHByZXZpb3VzU291cmNlRnJhbWUpCnByZXZpb3VzU291cmNlRnJhbWUuc2V0U2VhcmNoYWJsZVZpZXcobnVsbCk7Y29uc3QgY3VycmVudFNvdXJjZUZyYW1lPWV2ZW50LmRhdGEuY3VycmVudFZpZXcgaW5zdGFuY2VvZiBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lP2V2ZW50LmRhdGEuY3VycmVudFZpZXc6bnVsbDtpZihjdXJyZW50U291cmNlRnJhbWUpCmN1cnJlbnRTb3VyY2VGcmFtZS5zZXRTZWFyY2hhYmxlVmlldyh0aGlzLl9zZWFyY2hhYmxlVmlldyk7dGhpcy5fc2VhcmNoYWJsZVZpZXcuc2V0UmVwbGFjZWFibGUoISFjdXJyZW50U291cmNlRnJhbWUmJmN1cnJlbnRTb3VyY2VGcmFtZS5jYW5FZGl0U291cmNlKCkpO3RoaXMuX3NlYXJjaGFibGVWaWV3LnJlZnJlc2hTZWFyY2goKTt0aGlzLl91cGRhdGVUb29sYmFyQ2hhbmdlZExpc3RlbmVyKCk7dGhpcy5fdXBkYXRlU2NyaXB0Vmlld1Rvb2xiYXJJdGVtcygpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFNvdXJjZXMuU291cmNlc1ZpZXcuRXZlbnRzLkVkaXRvclNlbGVjdGVkLHRoaXMuX2VkaXRvckNvbnRhaW5lci5jdXJyZW50RmlsZSgpKTt9Cl9yZW1vdmVUb29sYmFyQ2hhbmdlZExpc3RlbmVyKCl7aWYodGhpcy5fdG9vbGJhckNoYW5nZWRMaXN0ZW5lcikKQ29tbW9uLkV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXJzKFt0aGlzLl90b29sYmFyQ2hhbmdlZExpc3RlbmVyXSk7dGhpcy5fdG9vbGJhckNoYW5nZWRMaXN0ZW5lcj1udWxsO30KX3VwZGF0ZVRvb2xiYXJDaGFuZ2VkTGlzdGVuZXIoKXt0aGlzLl9yZW1vdmVUb29sYmFyQ2hhbmdlZExpc3RlbmVyKCk7Y29uc3Qgc291cmNlRnJhbWU9dGhpcy5jdXJyZW50U291cmNlRnJhbWUoKTtpZighc291cmNlRnJhbWUpCnJldHVybjt0aGlzLl90b29sYmFyQ2hhbmdlZExpc3RlbmVyPXNvdXJjZUZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoU291cmNlcy5VSVNvdXJjZUNvZGVGcmFtZS5FdmVudHMuVG9vbGJhckl0ZW1zQ2hhbmdlZCx0aGlzLl91cGRhdGVTY3JpcHRWaWV3VG9vbGJhckl0ZW1zLHRoaXMpO30Kc2VhcmNoQ2FuY2VsZWQoKXtpZih0aGlzLl9zZWFyY2hWaWV3KQp0aGlzLl9zZWFyY2hWaWV3LnNlYXJjaENhbmNlbGVkKCk7ZGVsZXRlIHRoaXMuX3NlYXJjaFZpZXc7ZGVsZXRlIHRoaXMuX3NlYXJjaENvbmZpZzt9CnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHNob3VsZEp1bXAsanVtcEJhY2t3YXJkcyl7Y29uc3Qgc291cmNlRnJhbWU9dGhpcy5jdXJyZW50U291cmNlRnJhbWUoKTtpZighc291cmNlRnJhbWUpCnJldHVybjt0aGlzLl9zZWFyY2hWaWV3PXNvdXJjZUZyYW1lO3RoaXMuX3NlYXJjaENvbmZpZz1zZWFyY2hDb25maWc7dGhpcy5fc2VhcmNoVmlldy5wZXJmb3JtU2VhcmNoKHRoaXMuX3NlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpO30KanVtcFRvTmV4dFNlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9zZWFyY2hWaWV3KQpyZXR1cm47aWYodGhpcy5fc2VhcmNoVmlldyE9PXRoaXMuY3VycmVudFNvdXJjZUZyYW1lKCkpe3RoaXMucGVyZm9ybVNlYXJjaCh0aGlzLl9zZWFyY2hDb25maWcsdHJ1ZSk7cmV0dXJuO30KdGhpcy5fc2VhcmNoVmlldy5qdW1wVG9OZXh0U2VhcmNoUmVzdWx0KCk7fQpqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9zZWFyY2hWaWV3KQpyZXR1cm47aWYodGhpcy5fc2VhcmNoVmlldyE9PXRoaXMuY3VycmVudFNvdXJjZUZyYW1lKCkpe3RoaXMucGVyZm9ybVNlYXJjaCh0aGlzLl9zZWFyY2hDb25maWcsdHJ1ZSk7aWYodGhpcy5fc2VhcmNoVmlldykKdGhpcy5fc2VhcmNoVmlldy5qdW1wVG9MYXN0U2VhcmNoUmVzdWx0KCk7cmV0dXJuO30KdGhpcy5fc2VhcmNoVmlldy5qdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpO30Kc3VwcG9ydHNDYXNlU2Vuc2l0aXZlU2VhcmNoKCl7cmV0dXJuIHRydWU7fQpzdXBwb3J0c1JlZ2V4U2VhcmNoKCl7cmV0dXJuIHRydWU7fQpyZXBsYWNlU2VsZWN0aW9uV2l0aChzZWFyY2hDb25maWcscmVwbGFjZW1lbnQpe2NvbnN0IHNvdXJjZUZyYW1lPXRoaXMuY3VycmVudFNvdXJjZUZyYW1lKCk7aWYoIXNvdXJjZUZyYW1lKXtjb25zb2xlLmFzc2VydChzb3VyY2VGcmFtZSk7cmV0dXJuO30Kc291cmNlRnJhbWUucmVwbGFjZVNlbGVjdGlvbldpdGgoc2VhcmNoQ29uZmlnLHJlcGxhY2VtZW50KTt9CnJlcGxhY2VBbGxXaXRoKHNlYXJjaENvbmZpZyxyZXBsYWNlbWVudCl7Y29uc3Qgc291cmNlRnJhbWU9dGhpcy5jdXJyZW50U291cmNlRnJhbWUoKTtpZighc291cmNlRnJhbWUpe2NvbnNvbGUuYXNzZXJ0KHNvdXJjZUZyYW1lKTtyZXR1cm47fQpzb3VyY2VGcmFtZS5yZXBsYWNlQWxsV2l0aChzZWFyY2hDb25maWcscmVwbGFjZW1lbnQpO30KX3Nob3dPdXRsaW5lUXVpY2tPcGVuKCl7UXVpY2tPcGVuLlF1aWNrT3Blbi5zaG93KCdAJyk7fQpfc2hvd0dvVG9MaW5lUXVpY2tPcGVuKCl7aWYodGhpcy5fZWRpdG9yQ29udGFpbmVyLmN1cnJlbnRGaWxlKCkpClF1aWNrT3Blbi5RdWlja09wZW4uc2hvdygnOicpO30KX3NhdmUoKXt0aGlzLl9zYXZlU291cmNlRnJhbWUodGhpcy5jdXJyZW50U291cmNlRnJhbWUoKSk7fQpfc2F2ZUFsbCgpe2NvbnN0IHNvdXJjZUZyYW1lcz10aGlzLl9lZGl0b3JDb250YWluZXIuZmlsZVZpZXdzKCk7c291cmNlRnJhbWVzLmZvckVhY2godGhpcy5fc2F2ZVNvdXJjZUZyYW1lLmJpbmQodGhpcykpO30KX3NhdmVTb3VyY2VGcmFtZShzb3VyY2VGcmFtZSl7aWYoIShzb3VyY2VGcmFtZSBpbnN0YW5jZW9mIFNvdXJjZXMuVUlTb3VyY2VDb2RlRnJhbWUpKQpyZXR1cm47Y29uc3QgdWlTb3VyY2VDb2RlRnJhbWU9KHNvdXJjZUZyYW1lKTt1aVNvdXJjZUNvZGVGcmFtZS5jb21taXRFZGl0aW5nKCk7fQp0b2dnbGVCcmVha3BvaW50c0FjdGl2ZVN0YXRlKGFjdGl2ZSl7dGhpcy5fZWRpdG9yQ29udGFpbmVyLnZpZXcuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdicmVha3BvaW50cy1kZWFjdGl2YXRlZCcsIWFjdGl2ZSk7fX07U291cmNlcy5Tb3VyY2VzVmlldy5FdmVudHM9e0VkaXRvckNsb3NlZDpTeW1ib2woJ0VkaXRvckNsb3NlZCcpLEVkaXRvclNlbGVjdGVkOlN5bWJvbCgnRWRpdG9yU2VsZWN0ZWQnKSx9O1NvdXJjZXMuU291cmNlc1ZpZXcuRWRpdG9yQWN0aW9uPWZ1bmN0aW9uKCl7fTtTb3VyY2VzLlNvdXJjZXNWaWV3LkVkaXRvckFjdGlvbi5wcm90b3R5cGU9e2J1dHRvbihzb3VyY2VzVmlldyl7fX07U291cmNlcy5Tb3VyY2VzVmlldy5Td2l0Y2hGaWxlQWN0aW9uRGVsZWdhdGU9Y2xhc3N7c3RhdGljIF9uZXh0RmlsZShjdXJyZW50VUlTb3VyY2VDb2RlKXtmdW5jdGlvbiBmaWxlTmFtZVByZWZpeChuYW1lKXtjb25zdCBsYXN0RG90SW5kZXg9bmFtZS5sYXN0SW5kZXhPZignLicpO2NvbnN0IG5hbWVQcmVmaXg9bmFtZS5zdWJzdHIoMCxsYXN0RG90SW5kZXghPT0tMT9sYXN0RG90SW5kZXg6bmFtZS5sZW5ndGgpO3JldHVybiBuYW1lUHJlZml4LnRvTG93ZXJDYXNlKCk7fQpjb25zdCB1aVNvdXJjZUNvZGVzPWN1cnJlbnRVSVNvdXJjZUNvZGUucHJvamVjdCgpLnVpU291cmNlQ29kZXMoKTtjb25zdCBjYW5kaWRhdGVzPVtdO2NvbnN0IHVybD1jdXJyZW50VUlTb3VyY2VDb2RlLnBhcmVudFVSTCgpO2NvbnN0IG5hbWU9Y3VycmVudFVJU291cmNlQ29kZS5uYW1lKCk7Y29uc3QgbmFtZVByZWZpeD1maWxlTmFtZVByZWZpeChuYW1lKTtmb3IobGV0IGk9MDtpPHVpU291cmNlQ29kZXMubGVuZ3RoOysraSl7Y29uc3QgdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZXNbaV07aWYodXJsIT09dWlTb3VyY2VDb2RlLnBhcmVudFVSTCgpKQpjb250aW51ZTtpZihmaWxlTmFtZVByZWZpeCh1aVNvdXJjZUNvZGUubmFtZSgpKT09PW5hbWVQcmVmaXgpCmNhbmRpZGF0ZXMucHVzaCh1aVNvdXJjZUNvZGUubmFtZSgpKTt9CmNhbmRpZGF0ZXMuc29ydChTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcik7Y29uc3QgaW5kZXg9bW9kKGNhbmRpZGF0ZXMuaW5kZXhPZihuYW1lKSsxLGNhbmRpZGF0ZXMubGVuZ3RoKTtjb25zdCBmdWxsVVJMPSh1cmw/dXJsKycvJzonJykrY2FuZGlkYXRlc1tpbmRleF07Y29uc3QgbmV4dFVJU291cmNlQ29kZT1jdXJyZW50VUlTb3VyY2VDb2RlLnByb2plY3QoKS51aVNvdXJjZUNvZGVGb3JVUkwoZnVsbFVSTCk7cmV0dXJuIG5leHRVSVNvdXJjZUNvZGUhPT1jdXJyZW50VUlTb3VyY2VDb2RlP25leHRVSVNvdXJjZUNvZGU6bnVsbDt9CmhhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBzb3VyY2VzVmlldz1VSS5jb250ZXh0LmZsYXZvcihTb3VyY2VzLlNvdXJjZXNWaWV3KTtjb25zdCBjdXJyZW50VUlTb3VyY2VDb2RlPXNvdXJjZXNWaWV3LmN1cnJlbnRVSVNvdXJjZUNvZGUoKTtpZighY3VycmVudFVJU291cmNlQ29kZSkKcmV0dXJuIGZhbHNlO2NvbnN0IG5leHRVSVNvdXJjZUNvZGU9U291cmNlcy5Tb3VyY2VzVmlldy5Td2l0Y2hGaWxlQWN0aW9uRGVsZWdhdGUuX25leHRGaWxlKGN1cnJlbnRVSVNvdXJjZUNvZGUpO2lmKCFuZXh0VUlTb3VyY2VDb2RlKQpyZXR1cm4gZmFsc2U7c291cmNlc1ZpZXcuc2hvd1NvdXJjZUxvY2F0aW9uKG5leHRVSVNvdXJjZUNvZGUpO3JldHVybiB0cnVlO319O1NvdXJjZXMuU291cmNlc1ZpZXcuQWN0aW9uRGVsZWdhdGU9Y2xhc3N7aGFuZGxlQWN0aW9uKGNvbnRleHQsYWN0aW9uSWQpe2NvbnN0IHNvdXJjZXNWaWV3PVVJLmNvbnRleHQuZmxhdm9yKFNvdXJjZXMuU291cmNlc1ZpZXcpO2lmKCFzb3VyY2VzVmlldykKcmV0dXJuIGZhbHNlO3N3aXRjaChhY3Rpb25JZCl7Y2FzZSdzb3VyY2VzLmNsb3NlLWFsbCc6c291cmNlc1ZpZXcuX2VkaXRvckNvbnRhaW5lci5jbG9zZUFsbEZpbGVzKCk7cmV0dXJuIHRydWU7Y2FzZSdzb3VyY2VzLmp1bXAtdG8tcHJldmlvdXMtbG9jYXRpb24nOnNvdXJjZXNWaWV3Ll9vbkp1bXBUb1ByZXZpb3VzTG9jYXRpb24oKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuanVtcC10by1uZXh0LWxvY2F0aW9uJzpzb3VyY2VzVmlldy5fb25KdW1wVG9OZXh0TG9jYXRpb24oKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuY2xvc2UtZWRpdG9yLXRhYic6cmV0dXJuIHNvdXJjZXNWaWV3Ll9vbkNsb3NlRWRpdG9yVGFiKCk7Y2FzZSdzb3VyY2VzLmdvLXRvLWxpbmUnOnNvdXJjZXNWaWV3Ll9zaG93R29Ub0xpbmVRdWlja09wZW4oKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuZ28tdG8tbWVtYmVyJzpzb3VyY2VzVmlldy5fc2hvd091dGxpbmVRdWlja09wZW4oKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuc2F2ZSc6c291cmNlc1ZpZXcuX3NhdmUoKTtyZXR1cm4gdHJ1ZTtjYXNlJ3NvdXJjZXMuc2F2ZS1hbGwnOnNvdXJjZXNWaWV3Ll9zYXZlQWxsKCk7cmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fX07O1NvdXJjZXMuU291cmNlc1NlYXJjaFNjb3BlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fc2VhcmNoSWQ9MDt0aGlzLl9zZWFyY2hSZXN1bHRDYW5kaWRhdGVzPVtdO3RoaXMuX3NlYXJjaFJlc3VsdENhbGxiYWNrPW51bGw7dGhpcy5fc2VhcmNoRmluaXNoZWRDYWxsYmFjaz1udWxsO3RoaXMuX3NlYXJjaENvbmZpZz1udWxsO30Kc3RhdGljIF9maWxlc0NvbXBhcmF0b3IodWlTb3VyY2VDb2RlMSx1aVNvdXJjZUNvZGUyKXtpZih1aVNvdXJjZUNvZGUxLmlzRGlydHkoKSYmIXVpU291cmNlQ29kZTIuaXNEaXJ0eSgpKQpyZXR1cm4tMTtpZighdWlTb3VyY2VDb2RlMS5pc0RpcnR5KCkmJnVpU291cmNlQ29kZTIuaXNEaXJ0eSgpKQpyZXR1cm4gMTtjb25zdCB1cmwxPXVpU291cmNlQ29kZTEudXJsKCk7Y29uc3QgdXJsMj11aVNvdXJjZUNvZGUyLnVybCgpO2lmKHVybDEmJiF1cmwyKQpyZXR1cm4tMTtpZighdXJsMSYmdXJsMikKcmV0dXJuIDE7cmV0dXJuIFN0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yKHVpU291cmNlQ29kZTEuZnVsbERpc3BsYXlOYW1lKCksdWlTb3VyY2VDb2RlMi5mdWxsRGlzcGxheU5hbWUoKSk7fQpwZXJmb3JtSW5kZXhpbmcocHJvZ3Jlc3Mpe3RoaXMuc3RvcFNlYXJjaCgpO2NvbnN0IHByb2plY3RzPXRoaXMuX3Byb2plY3RzKCk7Y29uc3QgY29tcG9zaXRlUHJvZ3Jlc3M9bmV3IENvbW1vbi5Db21wb3NpdGVQcm9ncmVzcyhwcm9ncmVzcyk7Zm9yKGxldCBpPTA7aTxwcm9qZWN0cy5sZW5ndGg7KytpKXtjb25zdCBwcm9qZWN0PXByb2plY3RzW2ldO2NvbnN0IHByb2plY3RQcm9ncmVzcz1jb21wb3NpdGVQcm9ncmVzcy5jcmVhdGVTdWJQcm9ncmVzcyhwcm9qZWN0LnVpU291cmNlQ29kZXMoKS5sZW5ndGgpO3Byb2plY3QuaW5kZXhDb250ZW50KHByb2plY3RQcm9ncmVzcyk7fX0KX3Byb2plY3RzKCl7Y29uc3Qgc2VhcmNoSW5Bbm9ueW1vdXNBbmRDb250ZW50U2NyaXB0cz1Db21tb24ubW9kdWxlU2V0dGluZygnc2VhcmNoSW5Bbm9ueW1vdXNBbmRDb250ZW50U2NyaXB0cycpLmdldCgpO3JldHVybiBXb3Jrc3BhY2Uud29ya3NwYWNlLnByb2plY3RzKCkuZmlsdGVyKHByb2plY3Q9PntpZihwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuU2VydmljZSkKcmV0dXJuIGZhbHNlO2lmKCFzZWFyY2hJbkFub255bW91c0FuZENvbnRlbnRTY3JpcHRzJiZwcm9qZWN0LmlzU2VydmljZVByb2plY3QoKSkKcmV0dXJuIGZhbHNlO2lmKCFzZWFyY2hJbkFub255bW91c0FuZENvbnRlbnRTY3JpcHRzJiZwcm9qZWN0LnR5cGUoKT09PVdvcmtzcGFjZS5wcm9qZWN0VHlwZXMuQ29udGVudFNjcmlwdHMpCnJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTt9KTt9CnBlcmZvcm1TZWFyY2goc2VhcmNoQ29uZmlnLHByb2dyZXNzLHNlYXJjaFJlc3VsdENhbGxiYWNrLHNlYXJjaEZpbmlzaGVkQ2FsbGJhY2spe3RoaXMuc3RvcFNlYXJjaCgpO3RoaXMuX3NlYXJjaFJlc3VsdENhbmRpZGF0ZXM9W107dGhpcy5fc2VhcmNoUmVzdWx0Q2FsbGJhY2s9c2VhcmNoUmVzdWx0Q2FsbGJhY2s7dGhpcy5fc2VhcmNoRmluaXNoZWRDYWxsYmFjaz1zZWFyY2hGaW5pc2hlZENhbGxiYWNrO3RoaXMuX3NlYXJjaENvbmZpZz1zZWFyY2hDb25maWc7Y29uc3QgcHJvbWlzZXM9W107Y29uc3QgY29tcG9zaXRlUHJvZ3Jlc3M9bmV3IENvbW1vbi5Db21wb3NpdGVQcm9ncmVzcyhwcm9ncmVzcyk7Y29uc3Qgc2VhcmNoQ29udGVudFByb2dyZXNzPWNvbXBvc2l0ZVByb2dyZXNzLmNyZWF0ZVN1YlByb2dyZXNzKCk7Y29uc3QgZmluZE1hdGNoaW5nRmlsZXNQcm9ncmVzcz1uZXcgQ29tbW9uLkNvbXBvc2l0ZVByb2dyZXNzKGNvbXBvc2l0ZVByb2dyZXNzLmNyZWF0ZVN1YlByb2dyZXNzKCkpO2Zvcihjb25zdCBwcm9qZWN0IG9mIHRoaXMuX3Byb2plY3RzKCkpe2NvbnN0IHdlaWdodD1wcm9qZWN0LnVpU291cmNlQ29kZXMoKS5sZW5ndGg7Y29uc3QgZmluZE1hdGNoaW5nRmlsZXNJblByb2plY3RQcm9ncmVzcz1maW5kTWF0Y2hpbmdGaWxlc1Byb2dyZXNzLmNyZWF0ZVN1YlByb2dyZXNzKHdlaWdodCk7Y29uc3QgZmlsZXNNYXRoaW5nRmlsZVF1ZXJ5PXRoaXMuX3Byb2plY3RGaWxlc01hdGNoaW5nRmlsZVF1ZXJ5KHByb2plY3Qsc2VhcmNoQ29uZmlnKTtjb25zdCBwcm9taXNlPXByb2plY3QuZmluZEZpbGVzTWF0Y2hpbmdTZWFyY2hSZXF1ZXN0KHNlYXJjaENvbmZpZyxmaWxlc01hdGhpbmdGaWxlUXVlcnksZmluZE1hdGNoaW5nRmlsZXNJblByb2plY3RQcm9ncmVzcykudGhlbih0aGlzLl9wcm9jZXNzTWF0Y2hpbmdGaWxlc0ZvclByb2plY3QuYmluZCh0aGlzLHRoaXMuX3NlYXJjaElkLHByb2plY3Qsc2VhcmNoQ29uZmlnLGZpbGVzTWF0aGluZ0ZpbGVRdWVyeSkpO3Byb21pc2VzLnB1c2gocHJvbWlzZSk7fQpQcm9taXNlLmFsbChwcm9taXNlcykudGhlbih0aGlzLl9wcm9jZXNzTWF0Y2hpbmdGaWxlcy5iaW5kKHRoaXMsdGhpcy5fc2VhcmNoSWQsc2VhcmNoQ29udGVudFByb2dyZXNzLHRoaXMuX3NlYXJjaEZpbmlzaGVkQ2FsbGJhY2suYmluZCh0aGlzLHRydWUpKSk7fQpfcHJvamVjdEZpbGVzTWF0Y2hpbmdGaWxlUXVlcnkocHJvamVjdCxzZWFyY2hDb25maWcsZGlydHlPbmx5KXtjb25zdCByZXN1bHQ9W107Y29uc3QgdWlTb3VyY2VDb2Rlcz1wcm9qZWN0LnVpU291cmNlQ29kZXMoKTtmb3IobGV0IGk9MDtpPHVpU291cmNlQ29kZXMubGVuZ3RoOysraSl7Y29uc3QgdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZXNbaV07aWYoIXVpU291cmNlQ29kZS5jb250ZW50VHlwZSgpLmlzVGV4dFR5cGUoKSkKY29udGludWU7Y29uc3QgYmluZGluZz1QZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS5iaW5kaW5nKHVpU291cmNlQ29kZSk7aWYoYmluZGluZyYmYmluZGluZy5uZXR3b3JrPT09dWlTb3VyY2VDb2RlKQpjb250aW51ZTtpZihkaXJ0eU9ubHkmJiF1aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKQpjb250aW51ZTtpZihzZWFyY2hDb25maWcuZmlsZVBhdGhNYXRjaGVzRmlsZVF1ZXJ5KHVpU291cmNlQ29kZS5mdWxsRGlzcGxheU5hbWUoKSkpCnJlc3VsdC5wdXNoKHVpU291cmNlQ29kZS51cmwoKSk7fQpyZXN1bHQuc29ydChTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcik7cmV0dXJuIHJlc3VsdDt9Cl9wcm9jZXNzTWF0Y2hpbmdGaWxlc0ZvclByb2plY3Qoc2VhcmNoSWQscHJvamVjdCxzZWFyY2hDb25maWcsZmlsZXNNYXRoaW5nRmlsZVF1ZXJ5LGZpbGVzKXtpZihzZWFyY2hJZCE9PXRoaXMuX3NlYXJjaElkKXt0aGlzLl9zZWFyY2hGaW5pc2hlZENhbGxiYWNrKGZhbHNlKTtyZXR1cm47fQpmaWxlcy5zb3J0KFN0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yKTtmaWxlcz1maWxlcy5pbnRlcnNlY3RPcmRlcmVkKGZpbGVzTWF0aGluZ0ZpbGVRdWVyeSxTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcik7Y29uc3QgZGlydHlGaWxlcz10aGlzLl9wcm9qZWN0RmlsZXNNYXRjaGluZ0ZpbGVRdWVyeShwcm9qZWN0LHNlYXJjaENvbmZpZyx0cnVlKTtmaWxlcz1maWxlcy5tZXJnZU9yZGVyZWQoZGlydHlGaWxlcyxTdHJpbmcubmF0dXJhbE9yZGVyQ29tcGFyYXRvcik7Y29uc3QgdWlTb3VyY2VDb2Rlcz1bXTtmb3IoY29uc3QgZmlsZSBvZiBmaWxlcyl7Y29uc3QgdWlTb3VyY2VDb2RlPXByb2plY3QudWlTb3VyY2VDb2RlRm9yVVJMKGZpbGUpO2lmKCF1aVNvdXJjZUNvZGUpCmNvbnRpbnVlO2NvbnN0IHNjcmlwdD1CaW5kaW5ncy5EZWZhdWx0U2NyaXB0TWFwcGluZy5zY3JpcHRGb3JVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlKTtpZihzY3JpcHQmJiFzY3JpcHQuaXNBbm9ueW1vdXNTY3JpcHQoKSkKY29udGludWU7dWlTb3VyY2VDb2Rlcy5wdXNoKHVpU291cmNlQ29kZSk7fQp1aVNvdXJjZUNvZGVzLnNvcnQoU291cmNlcy5Tb3VyY2VzU2VhcmNoU2NvcGUuX2ZpbGVzQ29tcGFyYXRvcik7dGhpcy5fc2VhcmNoUmVzdWx0Q2FuZGlkYXRlcz10aGlzLl9zZWFyY2hSZXN1bHRDYW5kaWRhdGVzLm1lcmdlT3JkZXJlZCh1aVNvdXJjZUNvZGVzLFNvdXJjZXMuU291cmNlc1NlYXJjaFNjb3BlLl9maWxlc0NvbXBhcmF0b3IpO30KX3Byb2Nlc3NNYXRjaGluZ0ZpbGVzKHNlYXJjaElkLHByb2dyZXNzLGNhbGxiYWNrKXtpZihzZWFyY2hJZCE9PXRoaXMuX3NlYXJjaElkKXt0aGlzLl9zZWFyY2hGaW5pc2hlZENhbGxiYWNrKGZhbHNlKTtyZXR1cm47fQpjb25zdCBmaWxlcz10aGlzLl9zZWFyY2hSZXN1bHRDYW5kaWRhdGVzO2lmKCFmaWxlcy5sZW5ndGgpe3Byb2dyZXNzLmRvbmUoKTtjYWxsYmFjaygpO3JldHVybjt9CnByb2dyZXNzLnNldFRvdGFsV29yayhmaWxlcy5sZW5ndGgpO2xldCBmaWxlSW5kZXg9MDtjb25zdCBtYXhGaWxlQ29udGVudFJlcXVlc3RzPTIwO2xldCBjYWxsYmFja3NMZWZ0PTA7Zm9yKGxldCBpPTA7aTxtYXhGaWxlQ29udGVudFJlcXVlc3RzJiZpPGZpbGVzLmxlbmd0aDsrK2kpCnNjaGVkdWxlU2VhcmNoSW5OZXh0RmlsZU9yRmluaXNoLmNhbGwodGhpcyk7ZnVuY3Rpb24gc2VhcmNoSW5OZXh0RmlsZSh1aVNvdXJjZUNvZGUpe2lmKHVpU291cmNlQ29kZS5pc0RpcnR5KCkpCmNvbnRlbnRMb2FkZWQuY2FsbCh0aGlzLHVpU291cmNlQ29kZSx1aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKSk7ZWxzZQp1aVNvdXJjZUNvZGUucmVxdWVzdENvbnRlbnQoKS50aGVuKGNvbnRlbnRMb2FkZWQuYmluZCh0aGlzLHVpU291cmNlQ29kZSkpO30KZnVuY3Rpb24gc2NoZWR1bGVTZWFyY2hJbk5leHRGaWxlT3JGaW5pc2goKXtpZihmaWxlSW5kZXg+PWZpbGVzLmxlbmd0aCl7aWYoIWNhbGxiYWNrc0xlZnQpe3Byb2dyZXNzLmRvbmUoKTtjYWxsYmFjaygpO3JldHVybjt9CnJldHVybjt9CisrY2FsbGJhY2tzTGVmdDtjb25zdCB1aVNvdXJjZUNvZGU9ZmlsZXNbZmlsZUluZGV4KytdO3NldFRpbWVvdXQoc2VhcmNoSW5OZXh0RmlsZS5iaW5kKHRoaXMsdWlTb3VyY2VDb2RlKSwwKTt9CmZ1bmN0aW9uIGNvbnRlbnRMb2FkZWQodWlTb3VyY2VDb2RlLGNvbnRlbnQpe2Z1bmN0aW9uIG1hdGNoZXNDb21wYXJhdG9yKGEsYil7cmV0dXJuIGEubGluZU51bWJlci1iLmxpbmVOdW1iZXI7fQpwcm9ncmVzcy53b3JrZWQoMSk7bGV0IG1hdGNoZXM9W107Y29uc3QgcXVlcmllcz10aGlzLl9zZWFyY2hDb25maWcucXVlcmllcygpO2lmKGNvbnRlbnQhPT1udWxsKXtmb3IobGV0IGk9MDtpPHF1ZXJpZXMubGVuZ3RoOysraSl7Y29uc3QgbmV4dE1hdGNoZXM9Q29tbW9uLkNvbnRlbnRQcm92aWRlci5wZXJmb3JtU2VhcmNoSW5Db250ZW50KGNvbnRlbnQscXVlcmllc1tpXSwhdGhpcy5fc2VhcmNoQ29uZmlnLmlnbm9yZUNhc2UoKSx0aGlzLl9zZWFyY2hDb25maWcuaXNSZWdleCgpKTttYXRjaGVzPW1hdGNoZXMubWVyZ2VPcmRlcmVkKG5leHRNYXRjaGVzLG1hdGNoZXNDb21wYXJhdG9yKTt9fQppZihtYXRjaGVzKXtjb25zdCBzZWFyY2hSZXN1bHQ9bmV3IFNvdXJjZXMuRmlsZUJhc2VkU2VhcmNoUmVzdWx0KHVpU291cmNlQ29kZSxtYXRjaGVzKTt0aGlzLl9zZWFyY2hSZXN1bHRDYWxsYmFjayhzZWFyY2hSZXN1bHQpO30KLS1jYWxsYmFja3NMZWZ0O3NjaGVkdWxlU2VhcmNoSW5OZXh0RmlsZU9yRmluaXNoLmNhbGwodGhpcyk7fX0Kc3RvcFNlYXJjaCgpeysrdGhpcy5fc2VhcmNoSWQ7fX07U291cmNlcy5GaWxlQmFzZWRTZWFyY2hSZXN1bHQ9Y2xhc3N7Y29uc3RydWN0b3IodWlTb3VyY2VDb2RlLHNlYXJjaE1hdGNoZXMpe3RoaXMuX3VpU291cmNlQ29kZT11aVNvdXJjZUNvZGU7dGhpcy5fc2VhcmNoTWF0Y2hlcz1zZWFyY2hNYXRjaGVzO30KbGFiZWwoKXtyZXR1cm4gdGhpcy5fdWlTb3VyY2VDb2RlLmRpc3BsYXlOYW1lKCk7fQpkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGUuZnVsbERpc3BsYXlOYW1lKCk7fQptYXRjaGVzQ291bnQoKXtyZXR1cm4gdGhpcy5fc2VhcmNoTWF0Y2hlcy5sZW5ndGg7fQptYXRjaExpbmVDb250ZW50KGluZGV4KXtyZXR1cm4gdGhpcy5fc2VhcmNoTWF0Y2hlc1tpbmRleF0ubGluZUNvbnRlbnQ7fQptYXRjaFJldmVhbGFibGUoaW5kZXgpe2NvbnN0IG1hdGNoPXRoaXMuX3NlYXJjaE1hdGNoZXNbaW5kZXhdO3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGUudWlMb2NhdGlvbihtYXRjaC5saW5lTnVtYmVyLG1hdGNoLmNvbHVtbk51bWJlcik7fQptYXRjaExhYmVsKGluZGV4KXtyZXR1cm4gdGhpcy5fc2VhcmNoTWF0Y2hlc1tpbmRleF0ubGluZU51bWJlcisxO319OztTb3VyY2VzLlNvdXJjZXNQYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKCl7c3VwZXIoJ3NvdXJjZXMnKTtTb3VyY2VzLlNvdXJjZXNQYW5lbC5faW5zdGFuY2U9dGhpczt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3NvdXJjZXMvc291cmNlc1BhbmVsLmNzcycpO25ldyBVSS5Ecm9wVGFyZ2V0KHRoaXMuZWxlbWVudCxbVUkuRHJvcFRhcmdldC5UeXBlLkZvbGRlcl0sQ29tbW9uLlVJU3RyaW5nKCdEcm9wIHdvcmtzcGFjZSBmb2xkZXIgaGVyZScpLHRoaXMuX2hhbmRsZURyb3AuYmluZCh0aGlzKSk7dGhpcy5fd29ya3NwYWNlPVdvcmtzcGFjZS53b3Jrc3BhY2U7dGhpcy5fdG9nZ2xlUGF1c2VBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignZGVidWdnZXIudG9nZ2xlLXBhdXNlJykpO3RoaXMuX3N0ZXBPdmVyQWN0aW9uPShVSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24oJ2RlYnVnZ2VyLnN0ZXAtb3ZlcicpKTt0aGlzLl9zdGVwSW50b0FjdGlvbj0oVUkuYWN0aW9uUmVnaXN0cnkuYWN0aW9uKCdkZWJ1Z2dlci5zdGVwLWludG8nKSk7dGhpcy5fc3RlcE91dEFjdGlvbj0oVUkuYWN0aW9uUmVnaXN0cnkuYWN0aW9uKCdkZWJ1Z2dlci5zdGVwLW91dCcpKTt0aGlzLl9zdGVwQWN0aW9uPShVSS5hY3Rpb25SZWdpc3RyeS5hY3Rpb24oJ2RlYnVnZ2VyLnN0ZXAnKSk7dGhpcy5fdG9nZ2xlQnJlYWtwb2ludHNBY3RpdmVBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbignZGVidWdnZXIudG9nZ2xlLWJyZWFrcG9pbnRzLWFjdGl2ZScpKTt0aGlzLl9kZWJ1Z1Rvb2xiYXI9dGhpcy5fY3JlYXRlRGVidWdUb29sYmFyKCk7dGhpcy5fZGVidWdUb29sYmFyRHJhd2VyPXRoaXMuX2NyZWF0ZURlYnVnVG9vbGJhckRyYXdlcigpO3RoaXMuX2RlYnVnZ2VyUGF1c2VkTWVzc2FnZT1uZXcgU291cmNlcy5EZWJ1Z2dlclBhdXNlZE1lc3NhZ2UoKTtjb25zdCBpbml0aWFsRGVidWdTaWRlYmFyV2lkdGg9MjI1O3RoaXMuX3NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLHRydWUsJ3NvdXJjZXNQYW5lbFNwbGl0Vmlld1N0YXRlJyxpbml0aWFsRGVidWdTaWRlYmFyV2lkdGgpO3RoaXMuX3NwbGl0V2lkZ2V0LmVuYWJsZVNob3dNb2RlU2F2aW5nKCk7dGhpcy5fc3BsaXRXaWRnZXQuc2hvdyh0aGlzLmVsZW1lbnQpO2NvbnN0IGluaXRpYWxOYXZpZ2F0b3JXaWR0aD0yMjU7dGhpcy5lZGl0b3JWaWV3PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLGZhbHNlLCdzb3VyY2VzUGFuZWxOYXZpZ2F0b3JTcGxpdFZpZXdTdGF0ZScsaW5pdGlhbE5hdmlnYXRvcldpZHRoKTt0aGlzLmVkaXRvclZpZXcuZW5hYmxlU2hvd01vZGVTYXZpbmcoKTt0aGlzLmVkaXRvclZpZXcuZWxlbWVudC50YWJJbmRleD0wO3RoaXMuX3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5lZGl0b3JWaWV3KTt0aGlzLl9uYXZpZ2F0b3JUYWJiZWRMb2NhdGlvbj1VSS52aWV3TWFuYWdlci5jcmVhdGVUYWJiZWRMb2NhdGlvbih0aGlzLl9yZXZlYWxOYXZpZ2F0b3JTaWRlYmFyLmJpbmQodGhpcyksJ25hdmlnYXRvci12aWV3Jyx0cnVlKTtjb25zdCB0YWJiZWRQYW5lPXRoaXMuX25hdmlnYXRvclRhYmJlZExvY2F0aW9uLnRhYmJlZFBhbmUoKTt0YWJiZWRQYW5lLnNldE1pbmltdW1TaXplKDEwMCwyNSk7dGFiYmVkUGFuZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRvci10YWJiZWQtcGFuZScpO2NvbnN0IG5hdmlnYXRvck1lbnVCdXR0b249bmV3IFVJLlRvb2xiYXJNZW51QnV0dG9uKHRoaXMuX3BvcHVsYXRlTmF2aWdhdG9yTWVudS5iaW5kKHRoaXMpLHRydWUpO25hdmlnYXRvck1lbnVCdXR0b24uc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdNb3JlIG9wdGlvbnMnKSk7dGFiYmVkUGFuZS5yaWdodFRvb2xiYXIoKS5hcHBlbmRUb29sYmFySXRlbShuYXZpZ2F0b3JNZW51QnV0dG9uKTtpZihVSS52aWV3TWFuYWdlci5oYXNWaWV3c0ZvckxvY2F0aW9uKCdydW4tdmlldy1zaWRlYmFyJykpe2NvbnN0IG5hdmlnYXRvclNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSx0cnVlLCdzb3VyY2VQYW5lbE5hdmlnYXRvclNpZGViYXJTcGxpdFZpZXdTdGF0ZScpO25hdmlnYXRvclNwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGFiYmVkUGFuZSk7bmF2aWdhdG9yU3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldChVSS52aWV3TWFuYWdlci5jcmVhdGVUYWJiZWRMb2NhdGlvbih0aGlzLl9yZXZlYWxOYXZpZ2F0b3JTaWRlYmFyLmJpbmQodGhpcyksJ3J1bi12aWV3LXNpZGViYXInKS50YWJiZWRQYW5lKCkpO3RoaXMuZWRpdG9yVmlldy5zZXRTaWRlYmFyV2lkZ2V0KG5hdmlnYXRvclNwbGl0V2lkZ2V0KTt9ZWxzZXt0aGlzLmVkaXRvclZpZXcuc2V0U2lkZWJhcldpZGdldCh0YWJiZWRQYW5lKTt9CnRoaXMuX3NvdXJjZXNWaWV3PW5ldyBTb3VyY2VzLlNvdXJjZXNWaWV3KCk7dGhpcy5fc291cmNlc1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihTb3VyY2VzLlNvdXJjZXNWaWV3LkV2ZW50cy5FZGl0b3JTZWxlY3RlZCx0aGlzLl9lZGl0b3JTZWxlY3RlZC5iaW5kKHRoaXMpKTt0aGlzLl90b2dnbGVOYXZpZ2F0b3JTaWRlYmFyQnV0dG9uPXRoaXMuZWRpdG9yVmlldy5jcmVhdGVTaG93SGlkZVNpZGViYXJCdXR0b24oJ25hdmlnYXRvcicpO3RoaXMuX3RvZ2dsZURlYnVnZ2VyU2lkZWJhckJ1dHRvbj10aGlzLl9zcGxpdFdpZGdldC5jcmVhdGVTaG93SGlkZVNpZGViYXJCdXR0b24oJ2RlYnVnZ2VyJyk7dGhpcy5lZGl0b3JWaWV3LnNldE1haW5XaWRnZXQodGhpcy5fc291cmNlc1ZpZXcpO3RoaXMuX3RocmVhZHNTaWRlYmFyUGFuZT1udWxsO3RoaXMuX3dhdGNoU2lkZWJhclBhbmU9KFVJLnZpZXdNYW5hZ2VyLnZpZXcoJ3NvdXJjZXMud2F0Y2gnKSk7dGhpcy5fY2FsbHN0YWNrUGFuZT1zZWxmLnJ1bnRpbWUuc2hhcmVkSW5zdGFuY2UoU291cmNlcy5DYWxsU3RhY2tTaWRlYmFyUGFuZSk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3NpZGViYXJQb3NpdGlvbicpLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVNpZGViYXJQb3NpdGlvbi5iaW5kKHRoaXMpKTt0aGlzLl91cGRhdGVTaWRlYmFyUG9zaXRpb24oKTt0aGlzLl91cGRhdGVEZWJ1Z2dlckJ1dHRvbnNBbmRTdGF0dXMoKTt0aGlzLl9wYXVzZU9uRXhjZXB0aW9uRW5hYmxlZENoYW5nZWQoKTtDb21tb24ubW9kdWxlU2V0dGluZygncGF1c2VPbkV4Y2VwdGlvbkVuYWJsZWQnKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9wYXVzZU9uRXhjZXB0aW9uRW5hYmxlZENoYW5nZWQsdGhpcyk7dGhpcy5fbGl2ZUxvY2F0aW9uUG9vbD1uZXcgQmluZGluZ3MuTGl2ZUxvY2F0aW9uUG9vbCgpO3RoaXMuX3NldFRhcmdldChVSS5jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KSk7Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2JyZWFrcG9pbnRzQWN0aXZlJykuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fYnJlYWtwb2ludHNBY3RpdmVTdGF0ZUNoYW5nZWQsdGhpcyk7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuVGFyZ2V0LHRoaXMuX29uQ3VycmVudFRhcmdldENoYW5nZWQsdGhpcyk7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUsdGhpcy5fY2FsbEZyYW1lQ2hhbmdlZCx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5EZWJ1Z2dlcldhc0VuYWJsZWQsdGhpcy5fZGVidWdnZXJXYXNFbmFibGVkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyUGF1c2VkLHRoaXMuX2RlYnVnZ2VyUGF1c2VkLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkRlYnVnZ2VyUmVzdW1lZCxldmVudD0+dGhpcy5fZGVidWdnZXJSZXN1bWVkKChldmVudC5kYXRhKSkpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRlYnVnZ2VyTW9kZWwsU0RLLkRlYnVnZ2VyTW9kZWwuRXZlbnRzLkdsb2JhbE9iamVjdENsZWFyZWQsZXZlbnQ9PnRoaXMuX2RlYnVnZ2VyUmVzdW1lZCgoZXZlbnQuZGF0YSkpKTtFeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci5hZGRFdmVudExpc3RlbmVyKEV4dGVuc2lvbnMuRXh0ZW5zaW9uU2VydmVyLkV2ZW50cy5TaWRlYmFyUGFuZUFkZGVkLHRoaXMuX2V4dGVuc2lvblNpZGViYXJQYW5lQWRkZWQsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZVRhcmdldHModGhpcyk7fQpzdGF0aWMgaW5zdGFuY2UoKXtpZihTb3VyY2VzLlNvdXJjZXNQYW5lbC5faW5zdGFuY2UpCnJldHVybiBTb3VyY2VzLlNvdXJjZXNQYW5lbC5faW5zdGFuY2U7cmV0dXJuKHNlbGYucnVudGltZS5zaGFyZWRJbnN0YW5jZShTb3VyY2VzLlNvdXJjZXNQYW5lbCkpO30Kc3RhdGljIHVwZGF0ZVJlc2l6ZXJBbmRTaWRlYmFyQnV0dG9ucyhwYW5lbCl7cGFuZWwuX3NvdXJjZXNWaWV3LmxlZnRUb29sYmFyKCkucmVtb3ZlVG9vbGJhckl0ZW1zKCk7cGFuZWwuX3NvdXJjZXNWaWV3LnJpZ2h0VG9vbGJhcigpLnJlbW92ZVRvb2xiYXJJdGVtcygpO3BhbmVsLl9zb3VyY2VzVmlldy5ib3R0b21Ub29sYmFyKCkucmVtb3ZlVG9vbGJhckl0ZW1zKCk7Y29uc3QgaXNJbldyYXBwZXI9U291cmNlcy5Tb3VyY2VzUGFuZWwuV3JhcHBlclZpZXcuaXNTaG93aW5nKCkmJiFVSS5pbnNwZWN0b3JWaWV3LmlzRHJhd2VyTWluaW1pemVkKCk7aWYocGFuZWwuX3NwbGl0V2lkZ2V0LmlzVmVydGljYWwoKXx8aXNJbldyYXBwZXIpCnBhbmVsLl9zcGxpdFdpZGdldC51bmluc3RhbGxSZXNpemVyKHBhbmVsLl9zb3VyY2VzVmlldy50b29sYmFyQ29udGFpbmVyRWxlbWVudCgpKTtlbHNlCnBhbmVsLl9zcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcihwYW5lbC5fc291cmNlc1ZpZXcudG9vbGJhckNvbnRhaW5lckVsZW1lbnQoKSk7aWYoIWlzSW5XcmFwcGVyKXtwYW5lbC5fc291cmNlc1ZpZXcubGVmdFRvb2xiYXIoKS5hcHBlbmRUb29sYmFySXRlbShwYW5lbC5fdG9nZ2xlTmF2aWdhdG9yU2lkZWJhckJ1dHRvbik7aWYocGFuZWwuX3NwbGl0V2lkZ2V0LmlzVmVydGljYWwoKSkKcGFuZWwuX3NvdXJjZXNWaWV3LnJpZ2h0VG9vbGJhcigpLmFwcGVuZFRvb2xiYXJJdGVtKHBhbmVsLl90b2dnbGVEZWJ1Z2dlclNpZGViYXJCdXR0b24pO2Vsc2UKcGFuZWwuX3NvdXJjZXNWaWV3LmJvdHRvbVRvb2xiYXIoKS5hcHBlbmRUb29sYmFySXRlbShwYW5lbC5fdG9nZ2xlRGVidWdnZXJTaWRlYmFyQnV0dG9uKTt9fQp0YXJnZXRBZGRlZCh0YXJnZXQpe3RoaXMuX3Nob3dUaHJlYWRzSWZOZWVkZWQoKTt9CnRhcmdldFJlbW92ZWQodGFyZ2V0KXt9Cl9zaG93VGhyZWFkc0lmTmVlZGVkKCl7aWYoU291cmNlcy5UaHJlYWRzU2lkZWJhclBhbmUuc2hvdWxkQmVTaG93bigpJiYhdGhpcy5fdGhyZWFkc1NpZGViYXJQYW5lKXt0aGlzLl90aHJlYWRzU2lkZWJhclBhbmU9KFVJLnZpZXdNYW5hZ2VyLnZpZXcoJ3NvdXJjZXMudGhyZWFkcycpKTtpZih0aGlzLl9zaWRlYmFyUGFuZVN0YWNrKXt0aGlzLl9zaWRlYmFyUGFuZVN0YWNrLnNob3dWaWV3KHRoaXMuX3RocmVhZHNTaWRlYmFyUGFuZSx0aGlzLl9zcGxpdFdpZGdldC5pc1ZlcnRpY2FsKCk/dGhpcy5fd2F0Y2hTaWRlYmFyUGFuZTp0aGlzLl9jYWxsc3RhY2tQYW5lKTt9fX0KX3NldFRhcmdldCh0YXJnZXQpe2lmKCF0YXJnZXQpCnJldHVybjtjb25zdCBkZWJ1Z2dlck1vZGVsPXRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk7aWYoIWRlYnVnZ2VyTW9kZWwpCnJldHVybjtpZihkZWJ1Z2dlck1vZGVsLmlzUGF1c2VkKCkpe3RoaXMuX3Nob3dEZWJ1Z2dlclBhdXNlZERldGFpbHMoKGRlYnVnZ2VyTW9kZWwuZGVidWdnZXJQYXVzZWREZXRhaWxzKCkpKTt9ZWxzZXt0aGlzLl9wYXVzZWQ9ZmFsc2U7dGhpcy5fY2xlYXJJbnRlcmZhY2UoKTt0aGlzLl90b2dnbGVEZWJ1Z2dlclNpZGViYXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTt9fQpfb25DdXJyZW50VGFyZ2V0Q2hhbmdlZChldmVudCl7Y29uc3QgdGFyZ2V0PShldmVudC5kYXRhKTt0aGlzLl9zZXRUYXJnZXQodGFyZ2V0KTt9CnBhdXNlZCgpe3JldHVybiB0aGlzLl9wYXVzZWQ7fQp3YXNTaG93bigpe1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNvdXJjZXMuU291cmNlc1BhbmVsLHRoaXMpO3N1cGVyLndhc1Nob3duKCk7Y29uc3Qgd3JhcHBlcj1Tb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2U7aWYod3JhcHBlciYmd3JhcHBlci5pc1Nob3dpbmcoKSl7VUkuaW5zcGVjdG9yVmlldy5zZXREcmF3ZXJNaW5pbWl6ZWQodHJ1ZSk7U291cmNlcy5Tb3VyY2VzUGFuZWwudXBkYXRlUmVzaXplckFuZFNpZGViYXJCdXR0b25zKHRoaXMpO30KdGhpcy5lZGl0b3JWaWV3LnNldE1haW5XaWRnZXQodGhpcy5fc291cmNlc1ZpZXcpO30Kd2lsbEhpZGUoKXtzdXBlci53aWxsSGlkZSgpO1VJLmNvbnRleHQuc2V0Rmxhdm9yKFNvdXJjZXMuU291cmNlc1BhbmVsLG51bGwpO2lmKFNvdXJjZXMuU291cmNlc1BhbmVsLldyYXBwZXJWaWV3LmlzU2hvd2luZygpKXtTb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2UuX3Nob3dWaWV3SW5XcmFwcGVyKCk7VUkuaW5zcGVjdG9yVmlldy5zZXREcmF3ZXJNaW5pbWl6ZWQoZmFsc2UpO1NvdXJjZXMuU291cmNlc1BhbmVsLnVwZGF0ZVJlc2l6ZXJBbmRTaWRlYmFyQnV0dG9ucyh0aGlzKTt9fQpyZXNvbHZlTG9jYXRpb24obG9jYXRpb25OYW1lKXtpZihsb2NhdGlvbk5hbWU9PT0nc291cmNlcy1zaWRlYmFyJykKcmV0dXJuIHRoaXMuX3NpZGViYXJQYW5lU3RhY2s7ZWxzZQpyZXR1cm4gdGhpcy5fbmF2aWdhdG9yVGFiYmVkTG9jYXRpb247fQpfZW5zdXJlU291cmNlc1ZpZXdWaXNpYmxlKCl7aWYoU291cmNlcy5Tb3VyY2VzUGFuZWwuV3JhcHBlclZpZXcuaXNTaG93aW5nKCkpCnJldHVybiB0cnVlO2lmKCFVSS5pbnNwZWN0b3JWaWV3LmNhblNlbGVjdFBhbmVsKCdzb3VyY2VzJykpCnJldHVybiBmYWxzZTtVSS52aWV3TWFuYWdlci5zaG93Vmlldygnc291cmNlcycpO3JldHVybiB0cnVlO30Kb25SZXNpemUoKXtpZihDb21tb24ubW9kdWxlU2V0dGluZygnc2lkZWJhclBvc2l0aW9uJykuZ2V0KCk9PT0nYXV0bycpCnRoaXMuZWxlbWVudC53aW5kb3coKS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fdXBkYXRlU2lkZWJhclBvc2l0aW9uLmJpbmQodGhpcykpO30Kc2VhcmNoYWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc291cmNlc1ZpZXcuc2VhcmNoYWJsZVZpZXcoKTt9Cl9kZWJ1Z2dlclBhdXNlZChldmVudCl7Y29uc3QgZGVidWdnZXJNb2RlbD0oZXZlbnQuZGF0YSk7Y29uc3QgZGV0YWlscz1kZWJ1Z2dlck1vZGVsLmRlYnVnZ2VyUGF1c2VkRGV0YWlscygpO2lmKCF0aGlzLl9wYXVzZWQpCnRoaXMuX3NldEFzQ3VycmVudFBhbmVsKCk7aWYoVUkuY29udGV4dC5mbGF2b3IoU0RLLlRhcmdldCk9PT1kZWJ1Z2dlck1vZGVsLnRhcmdldCgpKQp0aGlzLl9zaG93RGVidWdnZXJQYXVzZWREZXRhaWxzKChkZXRhaWxzKSk7ZWxzZSBpZighdGhpcy5fcGF1c2VkKQpVSS5jb250ZXh0LnNldEZsYXZvcihTREsuVGFyZ2V0LGRlYnVnZ2VyTW9kZWwudGFyZ2V0KCkpO30KX3Nob3dEZWJ1Z2dlclBhdXNlZERldGFpbHMoZGV0YWlscyl7dGhpcy5fcGF1c2VkPXRydWU7dGhpcy5fdXBkYXRlRGVidWdnZXJCdXR0b25zQW5kU3RhdHVzKCk7VUkuY29udGV4dC5zZXRGbGF2b3IoU0RLLkRlYnVnZ2VyUGF1c2VkRGV0YWlscyxkZXRhaWxzKTt0aGlzLl90b2dnbGVEZWJ1Z2dlclNpZGViYXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fcmV2ZWFsRGVidWdnZXJTaWRlYmFyKCk7d2luZG93LmZvY3VzKCk7SW5zcGVjdG9yRnJvbnRlbmRIb3N0LmJyaW5nVG9Gcm9udCgpO30KX2RlYnVnZ2VyUmVzdW1lZChkZWJ1Z2dlck1vZGVsKXtjb25zdCB0YXJnZXQ9ZGVidWdnZXJNb2RlbC50YXJnZXQoKTtpZihVSS5jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KSE9PXRhcmdldCkKcmV0dXJuO3RoaXMuX3BhdXNlZD1mYWxzZTt0aGlzLl9jbGVhckludGVyZmFjZSgpO3RoaXMuX3RvZ2dsZURlYnVnZ2VyU2lkZWJhckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMuX3N3aXRjaFRvUGF1c2VkVGFyZ2V0VGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3N3aXRjaFRvUGF1c2VkVGFyZ2V0LmJpbmQodGhpcyxkZWJ1Z2dlck1vZGVsKSw1MDApO30KX2RlYnVnZ2VyV2FzRW5hYmxlZChldmVudCl7Y29uc3QgZGVidWdnZXJNb2RlbD0oZXZlbnQuZGF0YSk7aWYoVUkuY29udGV4dC5mbGF2b3IoU0RLLlRhcmdldCkhPT1kZWJ1Z2dlck1vZGVsLnRhcmdldCgpKQpyZXR1cm47dGhpcy5fdXBkYXRlRGVidWdnZXJCdXR0b25zQW5kU3RhdHVzKCk7fQpnZXQgdmlzaWJsZVZpZXcoKXtyZXR1cm4gdGhpcy5fc291cmNlc1ZpZXcudmlzaWJsZVZpZXcoKTt9CnNob3dVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLG9taXRGb2N1cyl7aWYob21pdEZvY3VzKXtjb25zdCB3cmFwcGVyU2hvd2luZz1Tb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2UmJlNvdXJjZXMuU291cmNlc1BhbmVsLldyYXBwZXJWaWV3Ll9pbnN0YW5jZS5pc1Nob3dpbmcoKTtpZighdGhpcy5pc1Nob3dpbmcoKSYmIXdyYXBwZXJTaG93aW5nKQpyZXR1cm47fWVsc2V7dGhpcy5fc2hvd0VkaXRvcigpO30KdGhpcy5fc291cmNlc1ZpZXcuc2hvd1NvdXJjZUxvY2F0aW9uKHVpU291cmNlQ29kZSxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixvbWl0Rm9jdXMpO30KX3Nob3dFZGl0b3IoKXtpZihTb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2UmJlNvdXJjZXMuU291cmNlc1BhbmVsLldyYXBwZXJWaWV3Ll9pbnN0YW5jZS5pc1Nob3dpbmcoKSkKcmV0dXJuO3RoaXMuX3NldEFzQ3VycmVudFBhbmVsKCk7fQpzaG93VUlMb2NhdGlvbih1aUxvY2F0aW9uLG9taXRGb2N1cyl7dGhpcy5zaG93VUlTb3VyY2VDb2RlKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcixvbWl0Rm9jdXMpO30KX3JldmVhbEluTmF2aWdhdG9yKHVpU291cmNlQ29kZSxza2lwUmV2ZWFsKXtjb25zdCBleHRlbnNpb25zPXNlbGYucnVudGltZS5leHRlbnNpb25zKFNvdXJjZXMuTmF2aWdhdG9yVmlldyk7UHJvbWlzZS5hbGwoZXh0ZW5zaW9ucy5tYXAoZXh0ZW5zaW9uPT5leHRlbnNpb24uaW5zdGFuY2UoKSkpLnRoZW4oZmlsdGVyTmF2aWdhdG9ycy5iaW5kKHRoaXMpKTtmdW5jdGlvbiBmaWx0ZXJOYXZpZ2F0b3JzKG9iamVjdHMpe2ZvcihsZXQgaT0wO2k8b2JqZWN0cy5sZW5ndGg7KytpKXtjb25zdCBuYXZpZ2F0b3JWaWV3PShvYmplY3RzW2ldKTtjb25zdCB2aWV3SWQ9ZXh0ZW5zaW9uc1tpXS5kZXNjcmlwdG9yKClbJ3ZpZXdJZCddO2lmKG5hdmlnYXRvclZpZXcuYWNjZXB0UHJvamVjdCh1aVNvdXJjZUNvZGUucHJvamVjdCgpKSl7bmF2aWdhdG9yVmlldy5yZXZlYWxVSVNvdXJjZUNvZGUodWlTb3VyY2VDb2RlLHRydWUpO2lmKHNraXBSZXZlYWwpCnRoaXMuX25hdmlnYXRvclRhYmJlZExvY2F0aW9uLnRhYmJlZFBhbmUoKS5zZWxlY3RUYWIodmlld0lkKTtlbHNlClVJLnZpZXdNYW5hZ2VyLnNob3dWaWV3KHZpZXdJZCk7fX19fQpfcG9wdWxhdGVOYXZpZ2F0b3JNZW51KGNvbnRleHRNZW51KXtjb25zdCBncm91cEJ5Rm9sZGVyU2V0dGluZz1Db21tb24ubW9kdWxlU2V0dGluZygnbmF2aWdhdG9yR3JvdXBCeUZvbGRlcicpO2NvbnRleHRNZW51LmFwcGVuZEl0ZW1zQXRMb2NhdGlvbignbmF2aWdhdG9yTWVudScpO2NvbnRleHRNZW51LnZpZXdTZWN0aW9uKCkuYXBwZW5kQ2hlY2tib3hJdGVtKENvbW1vbi5VSVN0cmluZygnR3JvdXAgYnkgZm9sZGVyJyksKCk9Pmdyb3VwQnlGb2xkZXJTZXR0aW5nLnNldCghZ3JvdXBCeUZvbGRlclNldHRpbmcuZ2V0KCkpLGdyb3VwQnlGb2xkZXJTZXR0aW5nLmdldCgpKTt9CnNldElnbm9yZUV4ZWN1dGlvbkxpbmVFdmVudHMoaWdub3JlRXhlY3V0aW9uTGluZUV2ZW50cyl7dGhpcy5faWdub3JlRXhlY3V0aW9uTGluZUV2ZW50cz1pZ25vcmVFeGVjdXRpb25MaW5lRXZlbnRzO30KdXBkYXRlTGFzdE1vZGlmaWNhdGlvblRpbWUoKXt0aGlzLl9sYXN0TW9kaWZpY2F0aW9uVGltZT13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7fQpfZXhlY3V0aW9uTGluZUNoYW5nZWQobGl2ZUxvY2F0aW9uKXtjb25zdCB1aUxvY2F0aW9uPWxpdmVMb2NhdGlvbi51aUxvY2F0aW9uKCk7aWYoIXVpTG9jYXRpb24pCnJldHVybjtpZih3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktdGhpcy5fbGFzdE1vZGlmaWNhdGlvblRpbWU8U291cmNlcy5Tb3VyY2VzUGFuZWwuX2xhc3RNb2RpZmljYXRpb25UaW1lb3V0KQpyZXR1cm47dGhpcy5fc291cmNlc1ZpZXcuc2hvd1NvdXJjZUxvY2F0aW9uKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlcix1aUxvY2F0aW9uLmNvbHVtbk51bWJlcix1bmRlZmluZWQsdHJ1ZSk7fQpfbGFzdE1vZGlmaWNhdGlvblRpbWVvdXRQYXNzZWRGb3JUZXN0KCl7U291cmNlcy5Tb3VyY2VzUGFuZWwuX2xhc3RNb2RpZmljYXRpb25UaW1lb3V0PU51bWJlci5NSU5fVkFMVUU7fQpfdXBkYXRlTGFzdE1vZGlmaWNhdGlvblRpbWVGb3JUZXN0KCl7U291cmNlcy5Tb3VyY2VzUGFuZWwuX2xhc3RNb2RpZmljYXRpb25UaW1lb3V0PU51bWJlci5NQVhfVkFMVUU7fQpfY2FsbEZyYW1lQ2hhbmdlZCgpe2NvbnN0IGNhbGxGcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTREsuRGVidWdnZXJNb2RlbC5DYWxsRnJhbWUpO2lmKCFjYWxsRnJhbWUpCnJldHVybjtpZih0aGlzLl9leGVjdXRpb25MaW5lTG9jYXRpb24pCnRoaXMuX2V4ZWN1dGlvbkxpbmVMb2NhdGlvbi5kaXNwb3NlKCk7dGhpcy5fZXhlY3V0aW9uTGluZUxvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5jcmVhdGVDYWxsRnJhbWVMaXZlTG9jYXRpb24oY2FsbEZyYW1lLmxvY2F0aW9uKCksdGhpcy5fZXhlY3V0aW9uTGluZUNoYW5nZWQuYmluZCh0aGlzKSx0aGlzLl9saXZlTG9jYXRpb25Qb29sKTt9Cl9wYXVzZU9uRXhjZXB0aW9uRW5hYmxlZENoYW5nZWQoKXtjb25zdCBlbmFibGVkPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uRXhjZXB0aW9uRW5hYmxlZCcpLmdldCgpO3RoaXMuX3BhdXNlT25FeGNlcHRpb25CdXR0b24uc2V0VG9nZ2xlZChlbmFibGVkKTt0aGlzLl9wYXVzZU9uRXhjZXB0aW9uQnV0dG9uLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZyhlbmFibGVkPydEb25cJ3QgcGF1c2Ugb24gZXhjZXB0aW9ucyc6J1BhdXNlIG9uIGV4Y2VwdGlvbnMnKSk7dGhpcy5fZGVidWdUb29sYmFyRHJhd2VyLmNsYXNzTGlzdC50b2dnbGUoJ2V4cGFuZGVkJyxlbmFibGVkKTt9CmFzeW5jIF91cGRhdGVEZWJ1Z2dlckJ1dHRvbnNBbmRTdGF0dXMoKXtjb25zdCBjdXJyZW50VGFyZ2V0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5UYXJnZXQpO2NvbnN0IGN1cnJlbnREZWJ1Z2dlck1vZGVsPWN1cnJlbnRUYXJnZXQ/Y3VycmVudFRhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk6bnVsbDtpZighY3VycmVudERlYnVnZ2VyTW9kZWwpe3RoaXMuX3RvZ2dsZVBhdXNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX3N0ZXBPdmVyQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX3N0ZXBJbnRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpO3RoaXMuX3N0ZXBPdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fc3RlcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTt9ZWxzZSBpZih0aGlzLl9wYXVzZWQpe3RoaXMuX3RvZ2dsZVBhdXNlQWN0aW9uLnNldFRvZ2dsZWQodHJ1ZSk7dGhpcy5fdG9nZ2xlUGF1c2VBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTt0aGlzLl9zdGVwT3ZlckFjdGlvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMuX3N0ZXBJbnRvQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7dGhpcy5fc3RlcE91dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpO3RoaXMuX3N0ZXBBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTt9ZWxzZXt0aGlzLl90b2dnbGVQYXVzZUFjdGlvbi5zZXRUb2dnbGVkKGZhbHNlKTt0aGlzLl90b2dnbGVQYXVzZUFjdGlvbi5zZXRFbmFibGVkKCFjdXJyZW50RGVidWdnZXJNb2RlbC5pc1BhdXNpbmcoKSk7dGhpcy5fc3RlcE92ZXJBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fc3RlcEludG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7dGhpcy5fc3RlcE91dEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTt0aGlzLl9zdGVwQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpO30KY29uc3QgZGV0YWlscz1jdXJyZW50RGVidWdnZXJNb2RlbD9jdXJyZW50RGVidWdnZXJNb2RlbC5kZWJ1Z2dlclBhdXNlZERldGFpbHMoKTpudWxsO2F3YWl0IHRoaXMuX2RlYnVnZ2VyUGF1c2VkTWVzc2FnZS5yZW5kZXIoZGV0YWlscyxCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcsQmluZGluZ3MuYnJlYWtwb2ludE1hbmFnZXIpO2lmKGRldGFpbHMpCnRoaXMuX3VwZGF0ZURlYnVnZ2VyQnV0dG9uc0FuZFN0YXR1c0ZvclRlc3QoKTt9Cl91cGRhdGVEZWJ1Z2dlckJ1dHRvbnNBbmRTdGF0dXNGb3JUZXN0KCl7fQpfY2xlYXJJbnRlcmZhY2UoKXt0aGlzLl91cGRhdGVEZWJ1Z2dlckJ1dHRvbnNBbmRTdGF0dXMoKTtVSS5jb250ZXh0LnNldEZsYXZvcihTREsuRGVidWdnZXJQYXVzZWREZXRhaWxzLG51bGwpO2lmKHRoaXMuX3N3aXRjaFRvUGF1c2VkVGFyZ2V0VGltZW91dCkKY2xlYXJUaW1lb3V0KHRoaXMuX3N3aXRjaFRvUGF1c2VkVGFyZ2V0VGltZW91dCk7dGhpcy5fbGl2ZUxvY2F0aW9uUG9vbC5kaXNwb3NlQWxsKCk7fQpfc3dpdGNoVG9QYXVzZWRUYXJnZXQoZGVidWdnZXJNb2RlbCl7ZGVsZXRlIHRoaXMuX3N3aXRjaFRvUGF1c2VkVGFyZ2V0VGltZW91dDtpZih0aGlzLl9wYXVzZWQpCnJldHVybjtpZihkZWJ1Z2dlck1vZGVsLmlzUGF1c2VkKCkpCnJldHVybjtjb25zdCBkZWJ1Z2dlck1vZGVscz1TREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwpO2ZvcihsZXQgaT0wO2k8ZGVidWdnZXJNb2RlbHMubGVuZ3RoOysraSl7aWYoZGVidWdnZXJNb2RlbHNbaV0uaXNQYXVzZWQoKSl7VUkuY29udGV4dC5zZXRGbGF2b3IoU0RLLlRhcmdldCxkZWJ1Z2dlck1vZGVsc1tpXS50YXJnZXQoKSk7YnJlYWs7fX19Cl90b2dnbGVQYXVzZU9uRXhjZXB0aW9ucygpe0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uRXhjZXB0aW9uRW5hYmxlZCcpLnNldCghdGhpcy5fcGF1c2VPbkV4Y2VwdGlvbkJ1dHRvbi50b2dnbGVkKCkpO30KX3J1blNuaXBwZXQoKXtjb25zdCB1aVNvdXJjZUNvZGU9dGhpcy5fc291cmNlc1ZpZXcuY3VycmVudFVJU291cmNlQ29kZSgpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybiBmYWxzZTtjb25zdCBjdXJyZW50RXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoIWN1cnJlbnRFeGVjdXRpb25Db250ZXh0KQpyZXR1cm4gZmFsc2U7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCkhPT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLlNuaXBwZXRzKQpyZXR1cm4gZmFsc2U7U25pcHBldHMuc2NyaXB0U25pcHBldE1vZGVsLmV2YWx1YXRlU2NyaXB0U25pcHBldChjdXJyZW50RXhlY3V0aW9uQ29udGV4dCx1aVNvdXJjZUNvZGUpO3JldHVybiB0cnVlO30KX2VkaXRvclNlbGVjdGVkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEpO2lmKHRoaXMuZWRpdG9yVmlldy5tYWluV2lkZ2V0KCkmJkNvbW1vbi5tb2R1bGVTZXR0aW5nKCdhdXRvUmV2ZWFsSW5OYXZpZ2F0b3InKS5nZXQoKSkKdGhpcy5fcmV2ZWFsSW5OYXZpZ2F0b3IodWlTb3VyY2VDb2RlLHRydWUpO30KX3RvZ2dsZVBhdXNlKCl7Y29uc3QgdGFyZ2V0PVVJLmNvbnRleHQuZmxhdm9yKFNESy5UYXJnZXQpO2lmKCF0YXJnZXQpCnJldHVybiB0cnVlO2NvbnN0IGRlYnVnZ2VyTW9kZWw9dGFyZ2V0Lm1vZGVsKFNESy5EZWJ1Z2dlck1vZGVsKTtpZighZGVidWdnZXJNb2RlbCkKcmV0dXJuIHRydWU7aWYodGhpcy5fcGF1c2VkKXt0aGlzLl9wYXVzZWQ9ZmFsc2U7ZGVidWdnZXJNb2RlbC5yZXN1bWUoKTt9ZWxzZXtkZWJ1Z2dlck1vZGVsLnBhdXNlKCk7fQp0aGlzLl9jbGVhckludGVyZmFjZSgpO3JldHVybiB0cnVlO30KX3ByZXBhcmVUb1Jlc3VtZSgpe2lmKCF0aGlzLl9wYXVzZWQpCnJldHVybiBudWxsO3RoaXMuX3BhdXNlZD1mYWxzZTt0aGlzLl9jbGVhckludGVyZmFjZSgpO2NvbnN0IHRhcmdldD1VSS5jb250ZXh0LmZsYXZvcihTREsuVGFyZ2V0KTtyZXR1cm4gdGFyZ2V0P3RhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk6bnVsbDt9Cl9sb25nUmVzdW1lKGV2ZW50KXtjb25zdCBkZWJ1Z2dlck1vZGVsPXRoaXMuX3ByZXBhcmVUb1Jlc3VtZSgpO2lmKCFkZWJ1Z2dlck1vZGVsKQpyZXR1cm47ZGVidWdnZXJNb2RlbC5za2lwQWxsUGF1c2VzVW50aWxSZWxvYWRPclRpbWVvdXQoNTAwKTtkZWJ1Z2dlck1vZGVsLnJlc3VtZSgpO30KX3Rlcm1pbmF0ZUV4ZWN1dGlvbihldmVudCl7Y29uc3QgZGVidWdnZXJNb2RlbD10aGlzLl9wcmVwYXJlVG9SZXN1bWUoKTtpZighZGVidWdnZXJNb2RlbCkKcmV0dXJuO2RlYnVnZ2VyTW9kZWwucnVudGltZU1vZGVsKCkudGVybWluYXRlRXhlY3V0aW9uKCk7ZGVidWdnZXJNb2RlbC5yZXN1bWUoKTt9Cl9zdGVwT3Zlcigpe2NvbnN0IGRlYnVnZ2VyTW9kZWw9dGhpcy5fcHJlcGFyZVRvUmVzdW1lKCk7aWYoIWRlYnVnZ2VyTW9kZWwpCnJldHVybiB0cnVlO2RlYnVnZ2VyTW9kZWwuc3RlcE92ZXIoKTtyZXR1cm4gdHJ1ZTt9Cl9zdGVwSW50bygpe2NvbnN0IGRlYnVnZ2VyTW9kZWw9dGhpcy5fcHJlcGFyZVRvUmVzdW1lKCk7aWYoIWRlYnVnZ2VyTW9kZWwpCnJldHVybiB0cnVlO2RlYnVnZ2VyTW9kZWwuc3RlcEludG8oKTtyZXR1cm4gdHJ1ZTt9Cl9zdGVwSW50b0FzeW5jKCl7Y29uc3QgZGVidWdnZXJNb2RlbD10aGlzLl9wcmVwYXJlVG9SZXN1bWUoKTtpZighZGVidWdnZXJNb2RlbCkKcmV0dXJuIHRydWU7ZGVidWdnZXJNb2RlbC5zY2hlZHVsZVN0ZXBJbnRvQXN5bmMoKTtyZXR1cm4gdHJ1ZTt9Cl9zdGVwT3V0KCl7Y29uc3QgZGVidWdnZXJNb2RlbD10aGlzLl9wcmVwYXJlVG9SZXN1bWUoKTtpZighZGVidWdnZXJNb2RlbCkKcmV0dXJuIHRydWU7ZGVidWdnZXJNb2RlbC5zdGVwT3V0KCk7cmV0dXJuIHRydWU7fQpfY29udGludWVUb0xvY2F0aW9uKHVpTG9jYXRpb24pe2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKCFleGVjdXRpb25Db250ZXh0KQpyZXR1cm47Y29uc3QgcmF3TG9jYXRpb249QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnVpTG9jYXRpb25Ub1Jhd0xvY2F0aW9uKHVpTG9jYXRpb24udWlTb3VyY2VDb2RlLHVpTG9jYXRpb24ubGluZU51bWJlciwwKTtpZighcmF3TG9jYXRpb258fHJhd0xvY2F0aW9uLmRlYnVnZ2VyTW9kZWwhPT1leGVjdXRpb25Db250ZXh0LmRlYnVnZ2VyTW9kZWwpCnJldHVybjtpZighdGhpcy5fcHJlcGFyZVRvUmVzdW1lKCkpCnJldHVybjtyYXdMb2NhdGlvbi5jb250aW51ZVRvTG9jYXRpb24oKTt9Cl90b2dnbGVCcmVha3BvaW50c0FjdGl2ZSgpe0NvbW1vbi5tb2R1bGVTZXR0aW5nKCdicmVha3BvaW50c0FjdGl2ZScpLnNldCghQ29tbW9uLm1vZHVsZVNldHRpbmcoJ2JyZWFrcG9pbnRzQWN0aXZlJykuZ2V0KCkpO30KX2JyZWFrcG9pbnRzQWN0aXZlU3RhdGVDaGFuZ2VkKCl7Y29uc3QgYWN0aXZlPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdicmVha3BvaW50c0FjdGl2ZScpLmdldCgpO3RoaXMuX3RvZ2dsZUJyZWFrcG9pbnRzQWN0aXZlQWN0aW9uLnNldFRvZ2dsZWQoIWFjdGl2ZSk7dGhpcy5fc291cmNlc1ZpZXcudG9nZ2xlQnJlYWtwb2ludHNBY3RpdmVTdGF0ZShhY3RpdmUpO30KX2NyZWF0ZURlYnVnVG9vbGJhcigpe2NvbnN0IGRlYnVnVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignc2NyaXB0cy1kZWJ1Zy10b29sYmFyJyk7Y29uc3QgbG9uZ1Jlc3VtZUJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1Jlc3VtZSB3aXRoIGFsbCBwYXVzZXMgYmxvY2tlZCBmb3IgNTAwIG1zJyksJ2xhcmdlaWNvbi1wbGF5Jyk7bG9uZ1Jlc3VtZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLHRoaXMuX2xvbmdSZXN1bWUsdGhpcyk7Y29uc3QgdGVybWluYXRlRXhlY3V0aW9uQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKGxzYFRlcm1pbmF0ZSBjdXJyZW50IEphdmFTY3JpcHQgY2FsbGAsJ2xhcmdlaWNvbi10ZXJtaW5hdGUtZXhlY3V0aW9uJyk7dGVybWluYXRlRXhlY3V0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhckJ1dHRvbi5FdmVudHMuQ2xpY2ssdGhpcy5fdGVybWluYXRlRXhlY3V0aW9uLHRoaXMpO2RlYnVnVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbih0aGlzLl90b2dnbGVQYXVzZUFjdGlvbixbdGVybWluYXRlRXhlY3V0aW9uQnV0dG9uLGxvbmdSZXN1bWVCdXR0b25dLFtdKSk7aWYoUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ3N0ZXBJbnRvQXN5bmMnKSl7ZGVidWdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHRoaXMuX3N0ZXBPdmVyQWN0aW9uKSk7ZGVidWdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHRoaXMuX3N0ZXBJbnRvQWN0aW9uKSk7ZGVidWdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHRoaXMuX3N0ZXBPdXRBY3Rpb24pKTtkZWJ1Z1Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fc3RlcEFjdGlvbikpO31lbHNle2RlYnVnVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbih0aGlzLl9zdGVwT3ZlckFjdGlvbikpO2RlYnVnVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbih0aGlzLl9zdGVwQWN0aW9uKSk7ZGVidWdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uKHRoaXMuX3N0ZXBPdXRBY3Rpb24pKTt9CmRlYnVnVG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoKTtkZWJ1Z1Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fdG9nZ2xlQnJlYWtwb2ludHNBY3RpdmVBY3Rpb24pKTt0aGlzLl9wYXVzZU9uRXhjZXB0aW9uQnV0dG9uPW5ldyBVSS5Ub29sYmFyVG9nZ2xlKCcnLCdsYXJnZWljb24tcGF1c2Utb24tZXhjZXB0aW9ucycpO3RoaXMuX3BhdXNlT25FeGNlcHRpb25CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljayx0aGlzLl90b2dnbGVQYXVzZU9uRXhjZXB0aW9ucyx0aGlzKTtkZWJ1Z1Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fcGF1c2VPbkV4Y2VwdGlvbkJ1dHRvbik7cmV0dXJuIGRlYnVnVG9vbGJhcjt9Cl9jcmVhdGVEZWJ1Z1Rvb2xiYXJEcmF3ZXIoKXtjb25zdCBkZWJ1Z1Rvb2xiYXJEcmF3ZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnc2NyaXB0cy1kZWJ1Zy10b29sYmFyLWRyYXdlcicpO2NvbnN0IGxhYmVsPUNvbW1vbi5VSVN0cmluZygnUGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMnKTtjb25zdCBzZXR0aW5nPUNvbW1vbi5tb2R1bGVTZXR0aW5nKCdwYXVzZU9uQ2F1Z2h0RXhjZXB0aW9uJyk7ZGVidWdUb29sYmFyRHJhd2VyLmFwcGVuZENoaWxkKFVJLlNldHRpbmdzVUkuY3JlYXRlU2V0dGluZ0NoZWNrYm94KGxhYmVsLHNldHRpbmcsdHJ1ZSkpO3JldHVybiBkZWJ1Z1Rvb2xiYXJEcmF3ZXI7fQphcHBlbmRBcHBsaWNhYmxlSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsdGFyZ2V0KXt0aGlzLl9hcHBlbmRVSVNvdXJjZUNvZGVJdGVtcyhldmVudCxjb250ZXh0TWVudSx0YXJnZXQpO3RoaXMuX2FwcGVuZFVJU291cmNlQ29kZUZyYW1lSXRlbXMoZXZlbnQsY29udGV4dE1lbnUsdGFyZ2V0KTt0aGlzLmFwcGVuZFVJTG9jYXRpb25JdGVtcyhjb250ZXh0TWVudSx0YXJnZXQpO3RoaXMuX2FwcGVuZFJlbW90ZU9iamVjdEl0ZW1zKGNvbnRleHRNZW51LHRhcmdldCk7dGhpcy5fYXBwZW5kTmV0d29ya1JlcXVlc3RJdGVtcyhjb250ZXh0TWVudSx0YXJnZXQpO30KX2FwcGVuZFVJU291cmNlQ29kZUl0ZW1zKGV2ZW50LGNvbnRleHRNZW51LHRhcmdldCl7aWYoISh0YXJnZXQgaW5zdGFuY2VvZiBXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlKSkKcmV0dXJuO2NvbnN0IHVpU291cmNlQ29kZT0odGFyZ2V0KTtpZighdWlTb3VyY2VDb2RlLnByb2plY3QoKS5pc1NlcnZpY2VQcm9qZWN0KCkmJiFldmVudC50YXJnZXQuaXNTZWxmT3JEZXNjZW5kYW50KHRoaXMuX25hdmlnYXRvclRhYmJlZExvY2F0aW9uLndpZGdldCgpLmVsZW1lbnQpKXtjb250ZXh0TWVudS5yZXZlYWxTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1JldmVhbCBpbiBzaWRlYmFyJyksdGhpcy5faGFuZGxlQ29udGV4dE1lbnVSZXZlYWwuYmluZCh0aGlzLHVpU291cmNlQ29kZSkpO319Cl9hcHBlbmRVSVNvdXJjZUNvZGVGcmFtZUl0ZW1zKGV2ZW50LGNvbnRleHRNZW51LHRhcmdldCl7aWYoISh0YXJnZXQgaW5zdGFuY2VvZiBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKSkKcmV0dXJuO2lmKHRhcmdldC51aVNvdXJjZUNvZGUoKS5jb250ZW50VHlwZSgpLmlzRnJvbVNvdXJjZU1hcCgpKQpyZXR1cm47Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kQWN0aW9uKCdkZWJ1Z2dlci5ldmFsdWF0ZS1zZWxlY3Rpb24nKTt9CmFwcGVuZFVJTG9jYXRpb25JdGVtcyhjb250ZXh0TWVudSxvYmplY3Qpe2lmKCEob2JqZWN0IGluc3RhbmNlb2YgV29ya3NwYWNlLlVJTG9jYXRpb24pKQpyZXR1cm47Y29uc3QgdWlMb2NhdGlvbj0ob2JqZWN0KTtjb25zdCB1aVNvdXJjZUNvZGU9dWlMb2NhdGlvbi51aVNvdXJjZUNvZGU7Y29uc3QgY29udGVudFR5cGU9dWlTb3VyY2VDb2RlLmNvbnRlbnRUeXBlKCk7aWYoY29udGVudFR5cGUuaGFzU2NyaXB0cygpKXtjb25zdCB0YXJnZXQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLlRhcmdldCk7Y29uc3QgZGVidWdnZXJNb2RlbD10YXJnZXQ/dGFyZ2V0Lm1vZGVsKFNESy5EZWJ1Z2dlck1vZGVsKTpudWxsO2lmKGRlYnVnZ2VyTW9kZWwmJmRlYnVnZ2VyTW9kZWwuaXNQYXVzZWQoKSl7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ0NvbnRpbnVlIHRvIGhlcmUnKSx0aGlzLl9jb250aW51ZVRvTG9jYXRpb24uYmluZCh0aGlzLHVpTG9jYXRpb24pKTt9CnRoaXMuX2NhbGxzdGFja1BhbmUuYXBwZW5kQmxhY2tib3hVUkxDb250ZXh0TWVudUl0ZW1zKGNvbnRleHRNZW51LHVpU291cmNlQ29kZSk7fX0KX2hhbmRsZUNvbnRleHRNZW51UmV2ZWFsKHVpU291cmNlQ29kZSl7dGhpcy5lZGl0b3JWaWV3LnNob3dCb3RoKCk7dGhpcy5fcmV2ZWFsSW5OYXZpZ2F0b3IodWlTb3VyY2VDb2RlKTt9Cl9hcHBlbmRSZW1vdGVPYmplY3RJdGVtcyhjb250ZXh0TWVudSx0YXJnZXQpe2lmKCEodGFyZ2V0IGluc3RhbmNlb2YgU0RLLlJlbW90ZU9iamVjdCkpCnJldHVybjtjb25zdCByZW1vdGVPYmplY3Q9KHRhcmdldCk7Y29udGV4dE1lbnUuZGVidWdTZWN0aW9uKCkuYXBwZW5kSXRlbShDb21tb24uVUlTdHJpbmcoJ1N0b3JlIGFzIGdsb2JhbCB2YXJpYWJsZScpLHRoaXMuX3NhdmVUb1RlbXBWYXJpYWJsZS5iaW5kKHRoaXMscmVtb3RlT2JqZWN0KSk7aWYocmVtb3RlT2JqZWN0LnR5cGU9PT0nZnVuY3Rpb24nKXtjb250ZXh0TWVudS5kZWJ1Z1NlY3Rpb24oKS5hcHBlbmRJdGVtKENvbW1vbi5VSVN0cmluZygnU2hvdyBmdW5jdGlvbiBkZWZpbml0aW9uJyksdGhpcy5fc2hvd0Z1bmN0aW9uRGVmaW5pdGlvbi5iaW5kKHRoaXMscmVtb3RlT2JqZWN0KSk7fX0KX2FwcGVuZE5ldHdvcmtSZXF1ZXN0SXRlbXMoY29udGV4dE1lbnUsdGFyZ2V0KXtpZighKHRhcmdldCBpbnN0YW5jZW9mIFNESy5OZXR3b3JrUmVxdWVzdCkpCnJldHVybjtjb25zdCByZXF1ZXN0PSh0YXJnZXQpO2NvbnN0IHVpU291cmNlQ29kZT10aGlzLl93b3Jrc3BhY2UudWlTb3VyY2VDb2RlRm9yVVJMKHJlcXVlc3QudXJsKCkpO2lmKCF1aVNvdXJjZUNvZGUpCnJldHVybjtjb25zdCBvcGVuVGV4dD1Db21tb24uVUlTdHJpbmcoJ09wZW4gaW4gU291cmNlcyBwYW5lbCcpO2NvbnRleHRNZW51LnJldmVhbFNlY3Rpb24oKS5hcHBlbmRJdGVtKG9wZW5UZXh0LHRoaXMuc2hvd1VJTG9jYXRpb24uYmluZCh0aGlzLHVpU291cmNlQ29kZS51aUxvY2F0aW9uKDAsMCkpKTt9CmFzeW5jIF9zYXZlVG9UZW1wVmFyaWFibGUocmVtb3RlT2JqZWN0KXtjb25zdCBjdXJyZW50RXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoIWN1cnJlbnRFeGVjdXRpb25Db250ZXh0KQpyZXR1cm47Y29uc3QgcmVzdWx0PWF3YWl0IGN1cnJlbnRFeGVjdXRpb25Db250ZXh0Lmdsb2JhbE9iamVjdCgnJyxmYWxzZSk7aWYoISFyZXN1bHQuZXhjZXB0aW9uRGV0YWlsc3x8IXJlc3VsdC5vYmplY3Qpe2ZhaWxlZFRvU2F2ZShyZXN1bHQub2JqZWN0fHxudWxsKTtyZXR1cm47fQpjb25zdCBnbG9iYWxPYmplY3Q9cmVzdWx0Lm9iamVjdDtjb25zdCBjYWxsRnVuY3Rpb25SZXN1bHQ9YXdhaXQgZ2xvYmFsT2JqZWN0LmNhbGxGdW5jdGlvblByb21pc2Uoc2F2ZVZhcmlhYmxlLFtTREsuUmVtb3RlT2JqZWN0LnRvQ2FsbEFyZ3VtZW50KHJlbW90ZU9iamVjdCldKTtnbG9iYWxPYmplY3QucmVsZWFzZSgpO2lmKGNhbGxGdW5jdGlvblJlc3VsdC53YXNUaHJvd258fCFjYWxsRnVuY3Rpb25SZXN1bHQub2JqZWN0fHxjYWxsRnVuY3Rpb25SZXN1bHQub2JqZWN0LnR5cGUhPT0nc3RyaW5nJyl7ZmFpbGVkVG9TYXZlKGNhbGxGdW5jdGlvblJlc3VsdC5vYmplY3R8fG51bGwpO31lbHNle2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9KGN1cnJlbnRFeGVjdXRpb25Db250ZXh0KTtsZXQgdGV4dD0oY2FsbEZ1bmN0aW9uUmVzdWx0Lm9iamVjdC52YWx1ZSk7Y29uc3QgbWVzc2FnZT1TREsuY29uc29sZU1vZGVsLmFkZENvbW1hbmRNZXNzYWdlKGV4ZWN1dGlvbkNvbnRleHQsdGV4dCk7dGV4dD1TREsuUnVudGltZU1vZGVsLndyYXBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbklmTmVlZGVkKHRleHQpO1NESy5jb25zb2xlTW9kZWwuZXZhbHVhdGVDb21tYW5kSW5Db25zb2xlKGV4ZWN1dGlvbkNvbnRleHQsbWVzc2FnZSx0ZXh0LGZhbHNlLGZhbHNlKTt9CmlmKGNhbGxGdW5jdGlvblJlc3VsdC5vYmplY3QpCmNhbGxGdW5jdGlvblJlc3VsdC5vYmplY3QucmVsZWFzZSgpO2Z1bmN0aW9uIHNhdmVWYXJpYWJsZSh2YWx1ZSl7Y29uc3QgcHJlZml4PSd0ZW1wJztsZXQgaW5kZXg9MTt3aGlsZSgocHJlZml4K2luZGV4KWluIHRoaXMpCisraW5kZXg7Y29uc3QgbmFtZT1wcmVmaXgraW5kZXg7dGhpc1tuYW1lXT12YWx1ZTtyZXR1cm4gbmFtZTt9CmZ1bmN0aW9uIGZhaWxlZFRvU2F2ZShyZXN1bHQpe2xldCBtZXNzYWdlPUNvbW1vbi5VSVN0cmluZygnRmFpbGVkIHRvIHNhdmUgdG8gdGVtcCB2YXJpYWJsZS4nKTtpZihyZXN1bHQpCm1lc3NhZ2UrPScgJytyZXN1bHQuZGVzY3JpcHRpb247Q29tbW9uLmNvbnNvbGUuZXJyb3IobWVzc2FnZSk7fX0KX3Nob3dGdW5jdGlvbkRlZmluaXRpb24ocmVtb3RlT2JqZWN0KXtyZW1vdGVPYmplY3QuZGVidWdnZXJNb2RlbCgpLmZ1bmN0aW9uRGV0YWlsc1Byb21pc2UocmVtb3RlT2JqZWN0KS50aGVuKHRoaXMuX2RpZEdldEZ1bmN0aW9uRGV0YWlscy5iaW5kKHRoaXMpKTt9Cl9kaWRHZXRGdW5jdGlvbkRldGFpbHMocmVzcG9uc2Upe2lmKCFyZXNwb25zZXx8IXJlc3BvbnNlLmxvY2F0aW9uKQpyZXR1cm47Y29uc3QgbG9jYXRpb249cmVzcG9uc2UubG9jYXRpb247aWYoIWxvY2F0aW9uKQpyZXR1cm47Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24obG9jYXRpb24pO2lmKHVpTG9jYXRpb24pCnRoaXMuc2hvd1VJTG9jYXRpb24odWlMb2NhdGlvbik7fQpfcmV2ZWFsTmF2aWdhdG9yU2lkZWJhcigpe3RoaXMuX3NldEFzQ3VycmVudFBhbmVsKCk7dGhpcy5lZGl0b3JWaWV3LnNob3dCb3RoKHRydWUpO30KX3JldmVhbERlYnVnZ2VyU2lkZWJhcigpe3RoaXMuX3NldEFzQ3VycmVudFBhbmVsKCk7dGhpcy5fc3BsaXRXaWRnZXQuc2hvd0JvdGgodHJ1ZSk7fQpfdXBkYXRlU2lkZWJhclBvc2l0aW9uKCl7bGV0IHZlcnRpY2FsbHk7Y29uc3QgcG9zaXRpb249Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3NpZGViYXJQb3NpdGlvbicpLmdldCgpO2lmKHBvc2l0aW9uPT09J3JpZ2h0JykKdmVydGljYWxseT1mYWxzZTtlbHNlIGlmKHBvc2l0aW9uPT09J2JvdHRvbScpCnZlcnRpY2FsbHk9dHJ1ZTtlbHNlCnZlcnRpY2FsbHk9VUkuaW5zcGVjdG9yVmlldy5lbGVtZW50Lm9mZnNldFdpZHRoPDY4MDtpZih0aGlzLnNpZGViYXJQYW5lVmlldyYmdmVydGljYWxseT09PSF0aGlzLl9zcGxpdFdpZGdldC5pc1ZlcnRpY2FsKCkpCnJldHVybjtpZih0aGlzLnNpZGViYXJQYW5lVmlldyYmdGhpcy5zaWRlYmFyUGFuZVZpZXcuc2hvdWxkSGlkZU9uRGV0YWNoKCkpCnJldHVybjtpZih0aGlzLnNpZGViYXJQYW5lVmlldykKdGhpcy5zaWRlYmFyUGFuZVZpZXcuZGV0YWNoKCk7dGhpcy5fc3BsaXRXaWRnZXQuc2V0VmVydGljYWwoIXZlcnRpY2FsbHkpO3RoaXMuX3NwbGl0V2lkZ2V0LmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnc291cmNlcy1zcGxpdC12aWV3LXZlcnRpY2FsJyx2ZXJ0aWNhbGx5KTtTb3VyY2VzLlNvdXJjZXNQYW5lbC51cGRhdGVSZXNpemVyQW5kU2lkZWJhckJ1dHRvbnModGhpcyk7Y29uc3QgdmJveD1uZXcgVUkuVkJveCgpO3Zib3guZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9kZWJ1Z1Rvb2xiYXJEcmF3ZXIpO3Zib3guc2V0TWluaW11bUFuZFByZWZlcnJlZFNpemVzKDI1LDI1LFNvdXJjZXMuU291cmNlc1BhbmVsLm1pblRvb2xiYXJXaWR0aCwxMDApO3RoaXMuX3NpZGViYXJQYW5lU3RhY2s9VUkudmlld01hbmFnZXIuY3JlYXRlU3RhY2tMb2NhdGlvbih0aGlzLl9yZXZlYWxEZWJ1Z2dlclNpZGViYXIuYmluZCh0aGlzKSk7dGhpcy5fc2lkZWJhclBhbmVTdGFjay53aWRnZXQoKS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93LWF1dG8nKTt0aGlzLl9zaWRlYmFyUGFuZVN0YWNrLndpZGdldCgpLnNob3codmJveC5lbGVtZW50KTt0aGlzLl9zaWRlYmFyUGFuZVN0YWNrLndpZGdldCgpLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZGVidWdnZXJQYXVzZWRNZXNzYWdlLmVsZW1lbnQoKSk7dmJveC5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2RlYnVnVG9vbGJhci5lbGVtZW50KTtpZih0aGlzLl90aHJlYWRzU2lkZWJhclBhbmUpCnRoaXMuX3NpZGViYXJQYW5lU3RhY2suc2hvd1ZpZXcodGhpcy5fdGhyZWFkc1NpZGViYXJQYW5lKTtpZighdmVydGljYWxseSkKdGhpcy5fc2lkZWJhclBhbmVTdGFjay5hcHBlbmRWaWV3KHRoaXMuX3dhdGNoU2lkZWJhclBhbmUpO3RoaXMuX3NpZGViYXJQYW5lU3RhY2suc2hvd1ZpZXcodGhpcy5fY2FsbHN0YWNrUGFuZSk7Y29uc3QganNCcmVha3BvaW50cz0oVUkudmlld01hbmFnZXIudmlldygnc291cmNlcy5qc0JyZWFrcG9pbnRzJykpO2NvbnN0IHNjb3BlQ2hhaW5WaWV3PShVSS52aWV3TWFuYWdlci52aWV3KCdzb3VyY2VzLnNjb3BlQ2hhaW4nKSk7aWYodGhpcy5fdGFiYmVkTG9jYXRpb25IZWFkZXIpe3RoaXMuX3NwbGl0V2lkZ2V0LnVuaW5zdGFsbFJlc2l6ZXIodGhpcy5fdGFiYmVkTG9jYXRpb25IZWFkZXIpO3RoaXMuX3RhYmJlZExvY2F0aW9uSGVhZGVyPW51bGw7fQppZighdmVydGljYWxseSl7dGhpcy5fc2lkZWJhclBhbmVTdGFjay5zaG93VmlldyhzY29wZUNoYWluVmlldyk7dGhpcy5fc2lkZWJhclBhbmVTdGFjay5zaG93Vmlldyhqc0JyZWFrcG9pbnRzKTt0aGlzLl9leHRlbnNpb25TaWRlYmFyUGFuZXNDb250YWluZXI9dGhpcy5fc2lkZWJhclBhbmVTdGFjazt0aGlzLnNpZGViYXJQYW5lVmlldz12Ym94O3RoaXMuX3NwbGl0V2lkZ2V0LnVuaW5zdGFsbFJlc2l6ZXIodGhpcy5fZGVidWdUb29sYmFyLmdyaXBFbGVtZW50Rm9yUmVzaXplKCkpO31lbHNle2NvbnN0IHNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLHRydWUsJ3NvdXJjZXNQYW5lbERlYnVnZ2VyU2lkZWJhclNwbGl0Vmlld1N0YXRlJywwLjUpO3NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodmJveCk7dGhpcy5fc2lkZWJhclBhbmVTdGFjay5zaG93Vmlldyhqc0JyZWFrcG9pbnRzKTtjb25zdCB0YWJiZWRMb2NhdGlvbj1VSS52aWV3TWFuYWdlci5jcmVhdGVUYWJiZWRMb2NhdGlvbih0aGlzLl9yZXZlYWxEZWJ1Z2dlclNpZGViYXIuYmluZCh0aGlzKSk7c3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0YWJiZWRMb2NhdGlvbi50YWJiZWRQYW5lKCkpO3RoaXMuX3RhYmJlZExvY2F0aW9uSGVhZGVyPXRhYmJlZExvY2F0aW9uLnRhYmJlZFBhbmUoKS5oZWFkZXJFbGVtZW50KCk7dGhpcy5fc3BsaXRXaWRnZXQuaW5zdGFsbFJlc2l6ZXIodGhpcy5fdGFiYmVkTG9jYXRpb25IZWFkZXIpO3RoaXMuX3NwbGl0V2lkZ2V0Lmluc3RhbGxSZXNpemVyKHRoaXMuX2RlYnVnVG9vbGJhci5ncmlwRWxlbWVudEZvclJlc2l6ZSgpKTt0YWJiZWRMb2NhdGlvbi5hcHBlbmRWaWV3KHNjb3BlQ2hhaW5WaWV3KTt0YWJiZWRMb2NhdGlvbi5hcHBlbmRWaWV3KHRoaXMuX3dhdGNoU2lkZWJhclBhbmUpO3RoaXMuX2V4dGVuc2lvblNpZGViYXJQYW5lc0NvbnRhaW5lcj10YWJiZWRMb2NhdGlvbjt0aGlzLnNpZGViYXJQYW5lVmlldz1zcGxpdFdpZGdldDt9CnRoaXMuX3NpZGViYXJQYW5lU3RhY2suYXBwZW5kQXBwbGljYWJsZUl0ZW1zKCdzb3VyY2VzLXNpZGViYXInKTtjb25zdCBleHRlbnNpb25TaWRlYmFyUGFuZXM9RXh0ZW5zaW9ucy5leHRlbnNpb25TZXJ2ZXIuc2lkZWJhclBhbmVzKCk7Zm9yKGxldCBpPTA7aTxleHRlbnNpb25TaWRlYmFyUGFuZXMubGVuZ3RoOysraSkKdGhpcy5fYWRkRXh0ZW5zaW9uU2lkZWJhclBhbmUoZXh0ZW5zaW9uU2lkZWJhclBhbmVzW2ldKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuc2lkZWJhclBhbmVWaWV3KTt9Cl9zZXRBc0N1cnJlbnRQYW5lbCgpe3JldHVybiBVSS52aWV3TWFuYWdlci5zaG93Vmlldygnc291cmNlcycpO30KX2V4dGVuc2lvblNpZGViYXJQYW5lQWRkZWQoZXZlbnQpe2NvbnN0IHBhbmU9KGV2ZW50LmRhdGEpO3RoaXMuX2FkZEV4dGVuc2lvblNpZGViYXJQYW5lKHBhbmUpO30KX2FkZEV4dGVuc2lvblNpZGViYXJQYW5lKHBhbmUpe2lmKHBhbmUucGFuZWxOYW1lKCk9PT10aGlzLm5hbWUpCnRoaXMuX2V4dGVuc2lvblNpZGViYXJQYW5lc0NvbnRhaW5lci5hcHBlbmRWaWV3KHBhbmUpO30Kc291cmNlc1ZpZXcoKXtyZXR1cm4gdGhpcy5fc291cmNlc1ZpZXc7fQpfaGFuZGxlRHJvcChkYXRhVHJhbnNmZXIpe2NvbnN0IGl0ZW1zPWRhdGFUcmFuc2Zlci5pdGVtcztpZighaXRlbXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgZW50cnk9aXRlbXNbMF0ud2Via2l0R2V0QXNFbnRyeSgpO2lmKCFlbnRyeS5pc0RpcmVjdG9yeSkKcmV0dXJuO0luc3BlY3RvckZyb250ZW5kSG9zdC51cGdyYWRlRHJhZ2dlZEZpbGVTeXN0ZW1QZXJtaXNzaW9ucyhlbnRyeS5maWxlc3lzdGVtKTt9fTtTb3VyY2VzLlNvdXJjZXNQYW5lbC5fbGFzdE1vZGlmaWNhdGlvblRpbWVvdXQ9MjAwO1NvdXJjZXMuU291cmNlc1BhbmVsLm1pblRvb2xiYXJXaWR0aD0yMTU7U291cmNlcy5Tb3VyY2VzUGFuZWwuVUlMb2NhdGlvblJldmVhbGVyPWNsYXNze3JldmVhbCh1aUxvY2F0aW9uLG9taXRGb2N1cyl7aWYoISh1aUxvY2F0aW9uIGluc3RhbmNlb2YgV29ya3NwYWNlLlVJTG9jYXRpb24pKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvcjogbm90IGEgdWkgbG9jYXRpb24nKSk7U291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKS5zaG93VUlMb2NhdGlvbih1aUxvY2F0aW9uLG9taXRGb2N1cyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319O1NvdXJjZXMuU291cmNlc1BhbmVsLkRlYnVnZ2VyTG9jYXRpb25SZXZlYWxlcj1jbGFzc3tyZXZlYWwocmF3TG9jYXRpb24sb21pdEZvY3VzKXtpZighKHJhd0xvY2F0aW9uIGluc3RhbmNlb2YgU0RLLkRlYnVnZ2VyTW9kZWwuTG9jYXRpb24pKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvcjogbm90IGEgZGVidWdnZXIgbG9jYXRpb24nKSk7Y29uc3QgdWlMb2NhdGlvbj1CaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcucmF3TG9jYXRpb25Ub1VJTG9jYXRpb24ocmF3TG9jYXRpb24pO2lmKCF1aUxvY2F0aW9uKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7U291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKS5zaG93VUlMb2NhdGlvbih1aUxvY2F0aW9uLG9taXRGb2N1cyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319O1NvdXJjZXMuU291cmNlc1BhbmVsLlVJU291cmNlQ29kZVJldmVhbGVyPWNsYXNze3JldmVhbCh1aVNvdXJjZUNvZGUsb21pdEZvY3VzKXtpZighKHVpU291cmNlQ29kZSBpbnN0YW5jZW9mIFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUpKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnRlcm5hbCBlcnJvcjogbm90IGEgdWkgc291cmNlIGNvZGUnKSk7U291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKS5zaG93VUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSx1bmRlZmluZWQsdW5kZWZpbmVkLG9taXRGb2N1cyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319O1NvdXJjZXMuU291cmNlc1BhbmVsLkRlYnVnZ2VyUGF1c2VkRGV0YWlsc1JldmVhbGVyPWNsYXNze3JldmVhbChvYmplY3Qpe3JldHVybiBTb3VyY2VzLlNvdXJjZXNQYW5lbC5pbnN0YW5jZSgpLl9zZXRBc0N1cnJlbnRQYW5lbCgpO319O1NvdXJjZXMuU291cmNlc1BhbmVsLlJldmVhbGluZ0FjdGlvbkRlbGVnYXRlPWNsYXNze2hhbmRsZUFjdGlvbihjb250ZXh0LGFjdGlvbklkKXtjb25zdCBwYW5lbD1Tb3VyY2VzLlNvdXJjZXNQYW5lbC5pbnN0YW5jZSgpO2lmKCFwYW5lbC5fZW5zdXJlU291cmNlc1ZpZXdWaXNpYmxlKCkpCnJldHVybiBmYWxzZTtzd2l0Y2goYWN0aW9uSWQpe2Nhc2UnZGVidWdnZXIudG9nZ2xlLXBhdXNlJzpwYW5lbC5fdG9nZ2xlUGF1c2UoKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtTb3VyY2VzLlNvdXJjZXNQYW5lbC5EZWJ1Z2dpbmdBY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7Y29uc3QgcGFuZWw9U291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKTtzd2l0Y2goYWN0aW9uSWQpe2Nhc2UnZGVidWdnZXIuc3RlcC1vdmVyJzpwYW5lbC5fc3RlcE92ZXIoKTtyZXR1cm4gdHJ1ZTtjYXNlJ2RlYnVnZ2VyLnN0ZXAtaW50byc6cGFuZWwuX3N0ZXBJbnRvQXN5bmMoKTtyZXR1cm4gdHJ1ZTtjYXNlJ2RlYnVnZ2VyLnN0ZXAnOnBhbmVsLl9zdGVwSW50bygpO3JldHVybiB0cnVlO2Nhc2UnZGVidWdnZXIuc3RlcC1vdXQnOnBhbmVsLl9zdGVwT3V0KCk7cmV0dXJuIHRydWU7Y2FzZSdkZWJ1Z2dlci5ydW4tc25pcHBldCc6cGFuZWwuX3J1blNuaXBwZXQoKTtyZXR1cm4gdHJ1ZTtjYXNlJ2RlYnVnZ2VyLnRvZ2dsZS1icmVha3BvaW50cy1hY3RpdmUnOnBhbmVsLl90b2dnbGVCcmVha3BvaW50c0FjdGl2ZSgpO3JldHVybiB0cnVlO2Nhc2UnZGVidWdnZXIuZXZhbHVhdGUtc2VsZWN0aW9uJzpjb25zdCBmcmFtZT1VSS5jb250ZXh0LmZsYXZvcihTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lKTtpZihmcmFtZSl7bGV0IHRleHQ9ZnJhbWUudGV4dEVkaXRvci50ZXh0KGZyYW1lLnRleHRFZGl0b3Iuc2VsZWN0aW9uKCkpO2NvbnN0IGV4ZWN1dGlvbkNvbnRleHQ9VUkuY29udGV4dC5mbGF2b3IoU0RLLkV4ZWN1dGlvbkNvbnRleHQpO2lmKGV4ZWN1dGlvbkNvbnRleHQpe2NvbnN0IG1lc3NhZ2U9U0RLLmNvbnNvbGVNb2RlbC5hZGRDb21tYW5kTWVzc2FnZShleGVjdXRpb25Db250ZXh0LHRleHQpO3RleHQ9U0RLLlJ1bnRpbWVNb2RlbC53cmFwT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25JZk5lZWRlZCh0ZXh0KTtTREsuY29uc29sZU1vZGVsLmV2YWx1YXRlQ29tbWFuZEluQ29uc29sZShleGVjdXRpb25Db250ZXh0LG1lc3NhZ2UsdGV4dCx0cnVlLGZhbHNlKTt9fQpyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtTb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzb3VyY2VzLXZpZXctd3JhcHBlcicpO1NvdXJjZXMuU291cmNlc1BhbmVsLldyYXBwZXJWaWV3Ll9pbnN0YW5jZT10aGlzO3RoaXMuX3ZpZXc9U291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKS5fc291cmNlc1ZpZXc7fQpzdGF0aWMgaXNTaG93aW5nKCl7cmV0dXJuISFTb3VyY2VzLlNvdXJjZXNQYW5lbC5XcmFwcGVyVmlldy5faW5zdGFuY2UmJlNvdXJjZXMuU291cmNlc1BhbmVsLldyYXBwZXJWaWV3Ll9pbnN0YW5jZS5pc1Nob3dpbmcoKTt9Cndhc1Nob3duKCl7aWYoIVNvdXJjZXMuU291cmNlc1BhbmVsLmluc3RhbmNlKCkuaXNTaG93aW5nKCkpCnRoaXMuX3Nob3dWaWV3SW5XcmFwcGVyKCk7ZWxzZQpVSS5pbnNwZWN0b3JWaWV3LnNldERyYXdlck1pbmltaXplZCh0cnVlKTtTb3VyY2VzLlNvdXJjZXNQYW5lbC51cGRhdGVSZXNpemVyQW5kU2lkZWJhckJ1dHRvbnMoU291cmNlcy5Tb3VyY2VzUGFuZWwuaW5zdGFuY2UoKSk7fQp3aWxsSGlkZSgpe1VJLmluc3BlY3RvclZpZXcuc2V0RHJhd2VyTWluaW1pemVkKGZhbHNlKTtzZXRJbW1lZGlhdGUoKCk9PlNvdXJjZXMuU291cmNlc1BhbmVsLnVwZGF0ZVJlc2l6ZXJBbmRTaWRlYmFyQnV0dG9ucyhTb3VyY2VzLlNvdXJjZXNQYW5lbC5pbnN0YW5jZSgpKSk7fQpfc2hvd1ZpZXdJbldyYXBwZXIoKXt0aGlzLl92aWV3LnNob3codGhpcy5lbGVtZW50KTt9fTs7U291cmNlcy5KYXZhU2NyaXB0Q29tcGlsZXJQbHVnaW49Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlBsdWdpbntjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLHVpU291cmNlQ29kZSl7c3VwZXIoKTt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt0aGlzLl9jb21waWxpbmc9ZmFsc2U7dGhpcy5fcmVjb21waWxlU2NoZWR1bGVkPWZhbHNlO3RoaXMuX3RpbWVvdXQ9bnVsbDt0aGlzLl9tZXNzYWdlPW51bGw7dGhpcy5fZGlzcG9zZWQ9ZmFsc2U7dGhpcy5fdGV4dEVkaXRvci5hZGRFdmVudExpc3RlbmVyKFVJLlRleHRFZGl0b3IuRXZlbnRzLlRleHRDaGFuZ2VkLHRoaXMuX3NjaGVkdWxlQ29tcGlsZSx0aGlzKTtpZih0aGlzLl91aVNvdXJjZUNvZGUuaGFzQ29tbWl0cygpfHx0aGlzLl91aVNvdXJjZUNvZGUuaXNEaXJ0eSgpKQp0aGlzLl9zY2hlZHVsZUNvbXBpbGUoKTt9CnN0YXRpYyBhY2NlcHRzKHVpU291cmNlQ29kZSl7aWYodWlTb3VyY2VDb2RlLmV4dGVuc2lvbigpPT09J2pzJykKcmV0dXJuIHRydWU7aWYodWlTb3VyY2VDb2RlLnByb2plY3QoKS50eXBlKCk9PT1Xb3Jrc3BhY2UucHJvamVjdFR5cGVzLlNuaXBwZXRzKQpyZXR1cm4gdHJ1ZTtmb3IoY29uc3QgZGVidWdnZXJNb2RlbCBvZiBTREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLkRlYnVnZ2VyTW9kZWwpKXtpZihCaW5kaW5ncy5kZWJ1Z2dlcldvcmtzcGFjZUJpbmRpbmcuc2NyaXB0RmlsZSh1aVNvdXJjZUNvZGUsZGVidWdnZXJNb2RlbCkpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30KX3NjaGVkdWxlQ29tcGlsZSgpe2lmKHRoaXMuX2NvbXBpbGluZyl7dGhpcy5fcmVjb21waWxlU2NoZWR1bGVkPXRydWU7cmV0dXJuO30KaWYodGhpcy5fdGltZW91dCkKY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO3RoaXMuX3RpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl9jb21waWxlLmJpbmQodGhpcyksU291cmNlcy5KYXZhU2NyaXB0Q29tcGlsZXJQbHVnaW4uQ29tcGlsZURlbGF5KTt9Cl9maW5kUnVudGltZU1vZGVsKCl7Y29uc3QgZGVidWdnZXJNb2RlbHM9U0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5EZWJ1Z2dlck1vZGVsKTtmb3IobGV0IGk9MDtpPGRlYnVnZ2VyTW9kZWxzLmxlbmd0aDsrK2kpe2NvbnN0IHNjcmlwdEZpbGU9QmluZGluZ3MuZGVidWdnZXJXb3Jrc3BhY2VCaW5kaW5nLnNjcmlwdEZpbGUodGhpcy5fdWlTb3VyY2VDb2RlLGRlYnVnZ2VyTW9kZWxzW2ldKTtpZihzY3JpcHRGaWxlKQpyZXR1cm4gZGVidWdnZXJNb2RlbHNbaV0ucnVudGltZU1vZGVsKCk7fQpyZXR1cm4gU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpP1NESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5tb2RlbChTREsuUnVudGltZU1vZGVsKTpudWxsO30KYXN5bmMgX2NvbXBpbGUoKXtjb25zdCBydW50aW1lTW9kZWw9dGhpcy5fZmluZFJ1bnRpbWVNb2RlbCgpO2lmKCFydW50aW1lTW9kZWwpCnJldHVybjtjb25zdCBjdXJyZW50RXhlY3V0aW9uQ29udGV4dD1VSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCk7aWYoIWN1cnJlbnRFeGVjdXRpb25Db250ZXh0KQpyZXR1cm47Y29uc3QgY29kZT10aGlzLl90ZXh0RWRpdG9yLnRleHQoKTtpZihjb2RlLmxlbmd0aD4xMDI0KjEwMCkKcmV0dXJuO3RoaXMuX2NvbXBpbGluZz10cnVlO2NvbnN0IHJlc3VsdD1hd2FpdCBydW50aW1lTW9kZWwuY29tcGlsZVNjcmlwdChjb2RlLCcnLGZhbHNlLGN1cnJlbnRFeGVjdXRpb25Db250ZXh0LmlkKTt0aGlzLl9jb21waWxpbmc9ZmFsc2U7aWYodGhpcy5fcmVjb21waWxlU2NoZWR1bGVkKXt0aGlzLl9yZWNvbXBpbGVTY2hlZHVsZWQ9ZmFsc2U7dGhpcy5fc2NoZWR1bGVDb21waWxlKCk7cmV0dXJuO30KaWYodGhpcy5fbWVzc2FnZSkKdGhpcy5fdWlTb3VyY2VDb2RlLnJlbW92ZU1lc3NhZ2UodGhpcy5fbWVzc2FnZSk7aWYodGhpcy5fZGlzcG9zZWR8fCFyZXN1bHR8fCFyZXN1bHQuZXhjZXB0aW9uRGV0YWlscykKcmV0dXJuO2NvbnN0IGV4Y2VwdGlvbkRldGFpbHM9cmVzdWx0LmV4Y2VwdGlvbkRldGFpbHM7Y29uc3QgdGV4dD1TREsuUnVudGltZU1vZGVsLnNpbXBsZVRleHRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbkRldGFpbHMpO3RoaXMuX21lc3NhZ2U9dGhpcy5fdWlTb3VyY2VDb2RlLmFkZExpbmVNZXNzYWdlKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuTWVzc2FnZS5MZXZlbC5FcnJvcix0ZXh0LGV4Y2VwdGlvbkRldGFpbHMubGluZU51bWJlcixleGNlcHRpb25EZXRhaWxzLmNvbHVtbk51bWJlcik7dGhpcy5fY29tcGlsYXRpb25GaW5pc2hlZEZvclRlc3QoKTt9Cl9jb21waWxhdGlvbkZpbmlzaGVkRm9yVGVzdCgpe30KZGlzcG9zZSgpe3RoaXMuX3RleHRFZGl0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihVSS5UZXh0RWRpdG9yLkV2ZW50cy5UZXh0Q2hhbmdlZCx0aGlzLl9zY2hlZHVsZUNvbXBpbGUsdGhpcyk7aWYodGhpcy5fbWVzc2FnZSkKdGhpcy5fdWlTb3VyY2VDb2RlLnJlbW92ZU1lc3NhZ2UodGhpcy5fbWVzc2FnZSk7dGhpcy5fZGlzcG9zZWQ9dHJ1ZTtpZih0aGlzLl90aW1lb3V0KQpjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7fX07U291cmNlcy5KYXZhU2NyaXB0Q29tcGlsZXJQbHVnaW4uQ29tcGlsZURlbGF5PTEwMDA7O1NvdXJjZXMuU25pcHBldHNQbHVnaW49Y2xhc3MgZXh0ZW5kcyBTb3VyY2VzLlVJU291cmNlQ29kZUZyYW1lLlBsdWdpbntjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLHVpU291cmNlQ29kZSl7c3VwZXIoKTt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fdWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt9CnN0YXRpYyBhY2NlcHRzKHVpU291cmNlQ29kZSl7cmV0dXJuIHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpPT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5TbmlwcGV0czt9CnJpZ2h0VG9vbGJhckl0ZW1zKCl7Y29uc3QgcnVuU25pcHBldD1VSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbkZvcklkKCdkZWJ1Z2dlci5ydW4tc25pcHBldCcpO3J1blNuaXBwZXQuc2V0VGV4dChIb3N0LmlzTWFjKCk/Q29tbW9uLlVJU3RyaW5nKCdcdTIzMTgrRW50ZXInKTpDb21tb24uVUlTdHJpbmcoJ0N0cmwrRW50ZXInKSk7cmV0dXJuW3J1blNuaXBwZXRdO319OztSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9jYWxsU3RhY2tTaWRlYmFyUGFuZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uYmxhY2tib3hlZC1tZXNzYWdlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBjb2xvcjogIzg4ODtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkMyO1xufVxuXG4uYmxhY2tib3hlZC1tZXNzYWdlID4gLmxpbmsge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG59XG5cbi5zaG93LW1vcmUtbWVzc2FnZSB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkOGQ4ZDg7XG59XG5cbi5zaG93LW1vcmUtbWVzc2FnZSA+IC5saW5rIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xufVxuXG4uY2FsbC1mcmFtZS1pdGVtIHtcbiAgICBwYWRkaW5nOiAzcHggOHB4IDNweCAyMHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuXG4uY2FsbC1mcmFtZS10aXRsZS10ZXh0IHtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uY2FsbC1mcmFtZS1pdGVtOm5vdCguYXN5bmMtaGVhZGVyKSB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZmVmZWY7XG59XG5cbi5jYWxsLWZyYW1lLWl0ZW06bm90KC5hc3luYy1oZWFkZXIpOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xufVxuXG4uYXN5bmMtaGVhZGVyICsgLmNhbGwtZnJhbWUtaXRlbSB7XG4gICAgYm9yZGVyLXRvcDogMDtcbn1cblxuLmNhbGwtZnJhbWUtaXRlbS10aXRsZSxcbi5jYWxsLWZyYW1lLWxvY2F0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jYWxsLWZyYW1lLWxvY2F0aW9uIHtcbiAgICBjb2xvcjogIzg4ODtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBwYWRkaW5nOiAwIDEwcHggMCAxMHB4O1xufVxuXG4uYXN5bmMtaGVhZGVyOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZDhkOGQ4O1xuICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogLTE7XG4gICAgbGVmdDogMDtcbn1cblxuLmFzeW5jLWhlYWRlciAuY2FsbC1mcmFtZS1pdGVtLXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBjb2xvcjogIzk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBtYXJnaW4tbGVmdDogLTVweDtcbiAgICBwYWRkaW5nOiAwIDVweDtcbn1cblxuLmJsYWNrYm94ZWQtY2FsbC1mcmFtZSB7XG4gICAgb3BhY2l0eTogMC42O1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLnNlbGVjdGVkLWNhbGwtZnJhbWUtaWNvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA1cHg7XG4gICAgbGVmdDogNHB4O1xufVxuXG4uY2FsbC1mcmFtZS1pdGVtLnNlbGVjdGVkIC5zZWxlY3RlZC1jYWxsLWZyYW1lLWljb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5ibGFja2JveGVkLW1lc3NhZ2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCg0NiwgOTglLCAyMiUpO1xuICAgIGNvbG9yOiAjYWFhO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC5ibGFja2JveGVkLW1lc3NhZ2UgPiAubGluayB7XG4gICAgY29sb3I6IGhzbCgwLCAwJSwgNjclKTtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VzL2NhbGxTdGFja1NpZGViYXJQYW5lLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNvdXJjZXMvZGVidWdnZXJQYXVzZWRNZXNzYWdlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTYgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5wYXVzZWQtc3RhdHVzIHtcbiAgICBwYWRkaW5nOiA2cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2IoMTg5LCAxODksIDE4OSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDUwLCAxMDAlLCA5NSUpO1xuICAgIGNvbG9yOiByZ2IoMTA3LCA5NywgNDgpO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5wYXVzZWQtc3RhdHVzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woNDYsIDk4JSwgMjIlKTtcbiAgICBjb2xvcjogI2NjYztcbn1cblxuLnBhdXNlZC1zdGF0dXMuZXJyb3ItcmVhc29uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMTAwJSwgOTclKTtcbiAgICBjb2xvcjogIzZiM2IzYjtcbn1cblxuLnN0YXR1cy1tYWluIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc3RhdHVzLXN1Yjpub3QoOmVtcHR5KSB7XG4gICAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICAgIHBhZGRpbmctdG9wOiA1cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLnBhdXNlZC1zdGF0dXMuZXJyb3ItcmVhc29uIC5zdGF0dXMtc3ViIHtcbiAgICBjb2xvcjogcmVkO1xuICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgIG1heC1oZWlnaHQ6IDI3cHg7XG59XG5cbi5zdGF0dXMtaWNvbiB7XG4gICAgLXdlYmtpdC1maWx0ZXI6IGh1ZS1yb3RhdGUoMTkwZGVnKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IGNhbGMoNTAlIC0gNXB4KTtcbn1cblxuLnBhdXNlZC1zdGF0dXMuZXJyb3ItcmVhc29uIC5zdGF0dXMtaWNvbiB7XG4gICAgLXdlYmtpdC1maWx0ZXI6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlcy9kZWJ1Z2dlclBhdXNlZE1lc3NhZ2UuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9qYXZhU2NyaXB0QnJlYWtwb2ludHNTaWRlYmFyUGFuZS5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uYnJlYWtwb2ludC1lbnRyeSB7XG4gICAgcGFkZGluZzogM3B4IDhweCAzcHggOHB4O1xuICAgIG1pbi1oZWlnaHQ6IDE4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE1cHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZmVmZWY7XG59XG5cbi5icmVha3BvaW50LWVudHJ5IFtpcz1kdC1jaGVja2JveF0ge1xuICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG46bm90KC5icmVha3BvaW50cy1saXN0LWRlYWN0aXZhdGVkKSA+IC5icmVha3BvaW50LWVudHJ5OmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xufVxuXG4uYnJlYWtwb2ludC1lbnRyeSA+IC5zb3VyY2UtdGV4dCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmJyZWFrcG9pbnRzLWxpc3QtZGVhY3RpdmF0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgb3BhY2l0eTogMC4zO1xufVxuXG4uYnJlYWtwb2ludC1oaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMTk0KTtcbn1cblxuOmhvc3QtY29udGV4dCguLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kKSAuYnJlYWtwb2ludC1oaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCg0NiwgOTglLCAyMiUpO1xuICAgIGNvbG9yOiAjY2NjO1xufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZXMvamF2YVNjcmlwdEJyZWFrcG9pbnRzU2lkZWJhclBhbmUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9uYXZpZ2F0b3JUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50aG9ueSBSaWNhdWQgPHJpa0B3ZWJraXQub3JnPlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICpcbiAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKFwiQXBwbGVcIikgbm9yIHRoZSBuYW1lcyBvZlxuICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4uaWNvbiwgLmljb24tYmFkZ2Uge1xuICAgIG1hcmdpbjogLTNweCAtNXB4IC0zcHggLTVweDtcbn1cblxuLmljb24tc3RhY2sge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxuLmljb24tc3RhY2sgPiBbaXM9dWktaWNvbl06bm90KDpmaXJzdC1jaGlsZCkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbn1cblxuLm5hdmlnYXRvci1maWxlLXRyZWUtaXRlbSAuaWNvbiB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCBoc2woMCwgMCUsIDUwJSksIGhzbCgwLCAwJSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3ItZnMtdHJlZS1pdGVtOm5vdCguaGFzLW1hcHBlZC1maWxlcyk6bm90KC5zZWxlY3RlZCkgPiA6bm90KC5zZWxlY3Rpb24pLFxuLm5hdmlnYXRvci1mcy1mb2xkZXItdHJlZS1pdGVtOm5vdCguaGFzLW1hcHBlZC1maWxlcyk6bm90KC5zZWxlY3RlZCkgPiA6bm90KC5zZWxlY3Rpb24pIHtcbiAgICBmaWx0ZXI6IGdyYXlzY2FsZSg1MCUpO1xuICAgIG9wYWNpdHk6IDAuNTtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaTpob3Zlcjpub3QoLnNlbGVjdGVkKSAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU2LCAxMjEsIDIxNywgMC4xKTtcbn1cblxuLm5hdmlnYXRvci1mb2xkZXItdHJlZS1pdGVtIC5pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1O1xufVxuXG4ubmF2aWdhdG9yLXNtLWZvbGRlci10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLWZzLXRyZWUtaXRlbSAuaWNvbixcbi5uYXZpZ2F0b3ItZnMtZm9sZGVyLXRyZWUtaXRlbSAuaWNvbiB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCBoc2woMjgsIDc1JSwgNTAlKSwgaHNsKDI4LCA3NSUsIDcwJSkpO1xufVxuXG4ubmF2aWdhdG9yLW53LWZvbGRlci10cmVlLWl0ZW0gLmljb24ge1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgaHNsKDIxMCwgODIlLCA2NSUpLCBoc2woMjEwLCA4MiUsIDgwJSkpO1xufVxuXG4ubmF2aWdhdG9yLXNtLXNjcmlwdC10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLXNjcmlwdC10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLXNuaXBwZXQtdHJlZS1pdGVtIC5pY29uIHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCg0OCwgNzAlLCA1MCUpLCBoc2woNDgsIDcwJSwgNzAlKSk7XG59XG5cbi5uYXZpZ2F0b3Itc20tc3R5bGVzaGVldC10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLXN0eWxlc2hlZXQtdHJlZS1pdGVtIC5pY29uIHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCgyNTYsIDUwJSwgNTAlKSwgaHNsKDI1NiwgNTAlLCA3MCUpKTtcbn1cblxuLm5hdmlnYXRvci1pbWFnZS10cmVlLWl0ZW0gLmljb24sXG4ubmF2aWdhdG9yLWZvbnQtdHJlZS1pdGVtIC5pY29uIHtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIGhzbCgxMDksIDMzJSwgNTAlKSwgaHNsKDEwOSwgMzMlLCA3MCUpKTtcbn1cblxuLm5hdmlnYXRvci1zbS1mb2xkZXItdHJlZS1pdGVtIC50cmVlLWVsZW1lbnQtdGl0bGUsXG4ubmF2aWdhdG9yLXNtLXNjcmlwdC10cmVlLWl0ZW0gLnRyZWUtZWxlbWVudC10aXRsZSxcbi5uYXZpZ2F0b3Itc20tc3R5bGVzaGVldC10cmVlLWl0ZW0gLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG46aG9zdHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZXMvbmF2aWdhdG9yVHJlZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzb3VyY2VzL25hdmlnYXRvclZpZXcuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLm5hdmlnYXRvci10b29sYmFyIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbiAgICBwYWRkaW5nLWxlZnQ6IDhweDtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VzL25hdmlnYXRvclZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9yZXZpc2lvbkhpc3RvcnkuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKlxuICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoXCJBcHBsZVwiKSBub3IgdGhlIG5hbWVzIG9mXG4gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5yZXZpc2lvbi1oaXN0b3J5LWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogIzAwZTtcbiAgICBwYWRkaW5nOiAwIDRweDtcbn1cblxuLnJldmlzaW9uLWhpc3RvcnktbGluay1yb3cge1xuICAgIHBhZGRpbmctbGVmdDogMTZweDtcbn1cblxubGkucmV2aXNpb24taGlzdG9yeS1saW5lIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG4ud2Via2l0LWxpbmUtbnVtYmVyIHtcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjQkJCO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGMEYwRjA7XG59XG5cbmxpLnJldmlzaW9uLWhpc3RvcnktcmV2aXNpb24ge1xuICAgIHBhZGRpbmctbGVmdDogMTZweDtcbn1cblxuLnJldmlzaW9uLWhpc3RvcnktbGluZS1hZGRlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1MywgMjM4LCAxNTMpO1xufVxuXG4ucmV2aXNpb24taGlzdG9yeS1saW5lLXJlbW92ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDIyMSwgMjIxKTtcbn1cblxuLnJldmlzaW9uLWhpc3RvcnktbGluZS1zZXBhcmF0b3IgLndlYmtpdC1saW5lLW51bWJlciB7XG4gICAgY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ucmV2aXNpb24taGlzdG9yeS1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZXMvcmV2aXNpb25IaXN0b3J5LmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInNvdXJjZXMvc2NvcGVDaGFpblNpZGViYXJQYW5lLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5zY29wZS1jaGFpbi1zaWRlYmFyLXBhbmUtc2VjdGlvbi1oZWFkZXIge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi5zY29wZS1jaGFpbi1zaWRlYmFyLXBhbmUtc2VjdGlvbi1zdWJ0aXRsZSB7XG4gICAgZmxvYXQ6IHJpZ2h0O1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgbWF4LXdpZHRoOiA1NSU7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNjb3BlLWNoYWluLXNpZGViYXItcGFuZS1zZWN0aW9uLXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4uc2NvcGUtY2hhaW4tc2lkZWJhci1wYW5lLXNlY3Rpb24ge1xuICAgIHBhZGRpbmc6IDJweCA0cHg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VzL3Njb3BlQ2hhaW5TaWRlYmFyUGFuZS5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzb3VyY2VzL3NlcnZpY2VXb3JrZXJzU2lkZWJhci5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uc2VydmljZS13b3JrZXIge1xuICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZXJ2aWNlLXdvcmtlcjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xufVxuXG4uc2VydmljZS13b3JrZXItc2NvcGUge1xuICAgIGNvbG9yOiAjNzc3O1xuICAgIGZsZXg6IGF1dG87XG4gICAgbWFyZ2luOiA1cHggNXB4IDAgMDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlcy9zZXJ2aWNlV29ya2Vyc1NpZGViYXIuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9zb3VyY2VzUGFuZWwuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoQykgMjAwOSBBbnRob255IFJpY2F1ZCA8cmlrQHdlYmtpdC5vcmc+XG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKlxuICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoXCJBcHBsZVwiKSBub3IgdGhlIG5hbWVzIG9mXG4gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi5zY3JpcHRzLWRlYnVnLXRvb2xiYXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNjcmlwdHMtZGVidWctdG9vbGJhci1kcmF3ZXIge1xuICAgIGZsZXg6IDAgMCA1MnB4O1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogbWFyZ2luLXRvcCAwLjFzIGVhc2UtaW4tb3V0O1xuICAgIG1hcmdpbi10b3A6IC0yNnB4O1xuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnNjcmlwdHMtZGVidWctdG9vbGJhci1kcmF3ZXIuZXhwYW5kZWQge1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5zY3JpcHRzLWRlYnVnLXRvb2xiYXItZHJhd2VyID4gbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcGFkZGluZy1sZWZ0OiAzcHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xufVxuXG4ucGFuZWwuc291cmNlcyAuc2lkZWJhci1wYW5lLXN0YWNrIHtcbiAgICBvdmVyZmxvdzogYXV0bztcbn1cblxuLmN1cnNvci1wb2ludGVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jdXJzb3ItYXV0byB7XG4gICAgY3Vyc29yOiBhdXRvO1xufVxuXG4ubmF2aWdhdG9yLXRhYmJlZC1wYW5lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbn1cblxuLyojIHNvdXJjZVVSTD1zb3VyY2VzL3NvdXJjZXNQYW5lbC5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJzb3VyY2VzL3NvdXJjZXNWaWV3LmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJcbiAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4jc291cmNlcy1wYW5lbC1zb3VyY2VzLXZpZXcge1xuICAgIGZsZXg6IGF1dG87XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4jc291cmNlcy1wYW5lbC1zb3VyY2VzLXZpZXcgLnNvdXJjZXMtdG9vbGJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4OiAwIDAgMjdweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10b29sYmFyLWJnLWNvbG9yKTtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB6LWluZGV4OiAwO1xufVxuXG4uc291cmNlcy10b29sYmFyIC50b29sYmFyIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5zb3VyY2VzLXRvb2xiYXItc3BhY2VyIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uc291cmNlLWZyYW1lLWRlYnVnZ2VyLXNjcmlwdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMTk0LCAwLjUpO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5zb3VyY2UtZnJhbWUtZGVidWdnZXItc2NyaXB0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDQ0O1xufVxuXG4uc291cmNlLWZyYW1lLWJyZWFrcG9pbnQtY29uZGl0aW9uIHtcbiAgICB6LWluZGV4OiAzMDtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjtcbiAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2JhYmFiYTtcbiAgICB3aWR0aDogOTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xufVxuXG4uc291cmNlLWZyYW1lLWJyZWFrcG9pbnQtbWVzc2FnZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgIGNvbG9yOiByZ2IoODUsIDg1LCA4NSk7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIG1hcmdpbjogMCAwIDJweCAwO1xufVxuXG4jc291cmNlLWZyYW1lLWJyZWFrcG9pbnQtY29uZGl0aW9uIHtcbiAgICBtYXJnaW46IDA7XG4gICAgYm9yZGVyOiAxcHggaW5zZXQgcmdiKDE5MCwgMTkwLCAxOTApICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHNvdXJjZS1mcmFtZS12YWx1ZS11cGRhdGUtaGlnaGxpZ2h0LWFuaW1hdGlvbiB7XG4gICAgZnJvbSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIH1cbiAgICAxMCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTU4LCA1NCwgMTUzKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIH1cbn1cblxuLnNvdXJjZS1mcmFtZS12YWx1ZS11cGRhdGUtaGlnaGxpZ2h0IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogc291cmNlLWZyYW1lLXZhbHVlLXVwZGF0ZS1oaWdobGlnaHQtYW5pbWF0aW9uIDAuOHMgMSBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5kaWZmLWVudHJ5LWluc2VydCAuZGlmZi1tYXJrZXIge1xuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgaHNsYSgxNDQsIDU1JSwgMzclLCAxKTtcbn1cblxuLmRpZmYtZW50cnktaW5zZXJ0IC5Db2RlTWlycm9yLWd1dHRlci1iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDE0NCw1NSUsNDklLC4yKTtcbn1cblxuLmRpZmYtZW50cnktbW9kaWZ5IC5kaWZmLW1hcmtlciB7XG4gICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjOUMyN0IwO1xufVxuXG4uZGlmZi1lbnRyeS1tb2RpZnkgLkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTg2LDEwNCwyMDAsMC4yKTtcbn1cblxuLmRpZmYtZW50cnktZGVsZXRlIC5kaWZmLW1hcmtlciB7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGJvcmRlci10b3A6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjRDMyRjJGO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IDZweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbGVmdDogMHB4O1xufVxuXG4uZGlmZi1lbnRyeS1kZWxldGUgLkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQge1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjRDMyRjJGO1xufVxuXG4uQ29kZU1pcnJvci1ndXR0ZXItZGlmZiB7XG4gICAgd2lkdGg6IDRweDtcbn1cblxuLmhpZ2hsaWdodC1saW5lLW1vZGlmaWNhdGlvbiB7XG4gICAgYW5pbWF0aW9uOiBzb3VyY2UtbGluZS1tb2RpZmljYXRpb24tYmFja2dyb3VuZC1mYWRlb3V0IDAuNHMgMHM7XG4gICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG59XG5cbi5oaWdobGlnaHQtbGluZS1tb2RpZmljYXRpb24gc3BhbiB7XG4gICAgYW5pbWF0aW9uOiBzb3VyY2UtbGluZS1tb2RpZmljYXRpb24tZm9yZWdyb3VuZC1mYWRlb3V0IDAuNHMgMHM7XG4gICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG59XG5cbkBrZXlmcmFtZXMgc291cmNlLWxpbmUtbW9kaWZpY2F0aW9uLWJhY2tncm91bmQtZmFkZW91dCB7XG4gICAgZnJvbSB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTU4LCA1NCwgMTUzLCAwLjUpOyB9XG4gICAgNTAlIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxNTgsIDU0LCAxNTMsIDAuNSk7IH1cbiAgICA5MCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE1OCwgNTQsIDE1MywgMCk7IH1cbiAgICB0byB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG59XG5cbkBrZXlmcmFtZXMgc291cmNlLWxpbmUtbW9kaWZpY2F0aW9uLWZvcmVncm91bmQtZmFkZW91dCB7XG4gICAgZnJvbSB7IGNvbG9yOiB3aGl0ZTsgfVxuICAgIDUwJSB7IGNvbG9yOiB3aGl0ZTsgfVxuICAgIDkwJSB7IGNvbG9yOiBpbml0aWFsOyB9XG4gICAgdG8geyBjb2xvcjogaW5pdGlhbDsgfVxufVxuXG4vKiMgc291cmNlVVJMPXNvdXJjZXMvc291cmNlc1ZpZXcuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy90aHJlYWRzU2lkZWJhclBhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnRocmVhZC1pdGVtIHtcbiAgICBwYWRkaW5nOiAzcHggOHB4IDNweCAyMHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuXG4udGhyZWFkLWl0ZW0gKyAudGhyZWFkLWl0ZW0ge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWZlZmVmO1xufVxuXG4udGhyZWFkLWl0ZW06aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi50aHJlYWQtaXRlbS10aXRsZSxcbi50aHJlYWQtaXRlbS1wYXVzZWQtc3RhdGUge1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRocmVhZC1pdGVtLXBhdXNlZC1zdGF0ZSB7XG4gICAgY29sb3I6ICM4ODg7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgcGFkZGluZzogMCAxMHB4IDAgMTBweDtcbn1cblxuLnNlbGVjdGVkLXRocmVhZC1pY29uIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDVweDtcbiAgICBsZWZ0OiA0cHg7XG59XG5cbi50aHJlYWQtaXRlbS5zZWxlY3RlZCAuc2VsZWN0ZWQtdGhyZWFkLWljb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5cbi8qIyBzb3VyY2VVUkw9c291cmNlcy90aHJlYWRzU2lkZWJhclBhbmUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy93YXRjaEV4cHJlc3Npb25zU2lkZWJhclBhbmUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLndhdGNoLWV4cHJlc3Npb24tZGVsZXRlLWJ1dHRvbiB7XG4gICAgd2lkdGg6IDEwcHg7XG4gICAgaGVpZ2h0OiAxMHB4O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChJbWFnZXMvZGVsZXRlSWNvbi5wbmcpO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGJvcmRlcjogMCBub25lIHRyYW5zcGFyZW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDRweDtcbiAgICByaWdodDogM3B4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi53YXRjaC1leHByZXNzaW9uLWhlYWRlcjpob3ZlciAud2F0Y2gtZXhwcmVzc2lvbi1kZWxldGUtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cbi53YXRjaC1leHByZXNzaW9ucyB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG1pbi1oZWlnaHQ6IDI2cHg7XG59XG5cbi53YXRjaC1leHByZXNzaW9ucyAuZGltbWVkIHtcbiAgICBvcGFjaXR5OiAwLjY7XG59XG5cbi53YXRjaC1leHByZXNzaW9uLXRpdGxlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDExcHg7XG59XG5cbi53YXRjaC1leHByZXNzaW9uLW9iamVjdC1oZWFkZXIgLndhdGNoLWV4cHJlc3Npb24tdGl0bGUge1xuICAgIG1hcmdpbi1sZWZ0OiAxcHg7XG59XG5cbi53YXRjaC1leHByZXNzaW9uIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxleDogbm9uZTtcbiAgICBtaW4taGVpZ2h0OiAyMHB4O1xufVxuXG4ud2F0Y2gtZXhwcmVzc2lvbnMgLm5hbWUge1xuICAgIGNvbG9yOiByZ2IoMTM2LCAxOSwgMTQ1KTtcbiAgICBmbGV4OiBub25lO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi53YXRjaC1leHByZXNzaW9uLWVycm9yIHtcbiAgICBjb2xvcjogcmVkO1xufVxuXG46aG9zdC1jb250ZXh0KC4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQpIC53YXRjaC1leHByZXNzaW9uLWVycm9yIHtcbiAgICBjb2xvcjogaHNsKDAsIDEwMCUsIDY1JSk7XG59XG5cbi53YXRjaC1leHByZXNzaW9ucy1zZXBhcmF0b3Ige1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi53YXRjaC1leHByZXNzaW9ucyAudmFsdWUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZGlzcGxheTogaW5saW5lO1xufVxuXG4ud2F0Y2gtZXhwcmVzc2lvbiAudGV4dC1wcm9tcHQge1xuICAgIHRleHQtb3ZlcmZsb3c6IGNsaXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBhZGRpbmctbGVmdDogNHB4O1xuICAgIG1pbi1oZWlnaHQ6IDE4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLndhdGNoLWV4cHJlc3Npb24tdGV4dC1wcm9tcHQtcHJveHkge1xuICAgIG1hcmdpbjogMnB4IDEycHg7XG59XG5cbi53YXRjaC1leHByZXNzaW9uLWhlYWRlciB7XG4gICAgZmxleDogYXV0bztcbiAgICBwYWRkaW5nOiAwIDZweDtcbn1cblxuLndhdGNoLWV4cHJlc3Npb24tb2JqZWN0LWhlYWRlciB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMnB4O1xuICAgIHBhZGRpbmctbGVmdDogMTJweDtcbn1cblxuLndhdGNoLWV4cHJlc3Npb24taGVhZGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDE0cHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlcy93YXRjaEV4cHJlc3Npb25zU2lkZWJhclBhbmUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sic291cmNlcy9kaWFsb2cuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbjpob3N0IHtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4ud2lkZ2V0IHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5sYWJlbCB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuaW5wdXRbdHlwZT10ZXh0XSB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGhlaWdodDogMjRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDJweDtcbiAgICBtYXJnaW46IDAgNXB4O1xufVxuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOmZvY3VzLFxuaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG59XG5cbmJ1dHRvbiB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KGhzbCgwLCAwJSwgOTMlKSwgaHNsKDAsIDAlLCA5MyUpIDM4JSwgaHNsKDAsIDAlLCA4NyUpKTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBoc2xhKDAsIDAlLCAwJSwgMC4yNSk7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDAgaHNsYSgwLCAwJSwgMCUsIDAuMDgpLCBpbnNldCAwIDFweCAycHggaHNsYSgwLCAxMDAlLCAxMDAlLCAwLjc1KTtcbiAgICBjb2xvcjogaHNsKDAsIDAlLCAyNyUpO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBtYXJnaW46IDAgNnB4IDAgNnB4O1xuICAgIHRleHQtc2hhZG93OiAwIDFweCAwIGhzbCgwLCAwJSwgOTQlKTtcbiAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG59XG5cbmJ1dHRvbjphY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMTUsIDIxNSwgMjE1KTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2IoMTk0LCAxOTQsIDE5NCksIHJnYigyMzksIDIzOSwgMjM5KSk7XG59XG5cbi8qIyBzb3VyY2VVUkw9c291cmNlcy9kaWFsb2cuY3NzICovIjsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO0NvZGVNaXJyb3IuZGVmaW5lTW9kZSgiY3NzIixmdW5jdGlvbihjb25maWcscGFyc2VyQ29uZmlnKXt2YXIgaW5saW5lPXBhcnNlckNvbmZpZy5pbmxpbmUKaWYoIXBhcnNlckNvbmZpZy5wcm9wZXJ0eUtleXdvcmRzKXBhcnNlckNvbmZpZz1Db2RlTWlycm9yLnJlc29sdmVNb2RlKCJ0ZXh0L2NzcyIpO3ZhciBpbmRlbnRVbml0PWNvbmZpZy5pbmRlbnRVbml0LHRva2VuSG9va3M9cGFyc2VyQ29uZmlnLnRva2VuSG9va3MsZG9jdW1lbnRUeXBlcz1wYXJzZXJDb25maWcuZG9jdW1lbnRUeXBlc3x8e30sbWVkaWFUeXBlcz1wYXJzZXJDb25maWcubWVkaWFUeXBlc3x8e30sbWVkaWFGZWF0dXJlcz1wYXJzZXJDb25maWcubWVkaWFGZWF0dXJlc3x8e30sbWVkaWFWYWx1ZUtleXdvcmRzPXBhcnNlckNvbmZpZy5tZWRpYVZhbHVlS2V5d29yZHN8fHt9LHByb3BlcnR5S2V5d29yZHM9cGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHN8fHt9LG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcz1wYXJzZXJDb25maWcubm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzfHx7fSxmb250UHJvcGVydGllcz1wYXJzZXJDb25maWcuZm9udFByb3BlcnRpZXN8fHt9LGNvdW50ZXJEZXNjcmlwdG9ycz1wYXJzZXJDb25maWcuY291bnRlckRlc2NyaXB0b3JzfHx7fSxjb2xvcktleXdvcmRzPXBhcnNlckNvbmZpZy5jb2xvcktleXdvcmRzfHx7fSx2YWx1ZUtleXdvcmRzPXBhcnNlckNvbmZpZy52YWx1ZUtleXdvcmRzfHx7fSxhbGxvd05lc3RlZD1wYXJzZXJDb25maWcuYWxsb3dOZXN0ZWQsbGluZUNvbW1lbnQ9cGFyc2VyQ29uZmlnLmxpbmVDb21tZW50LHN1cHBvcnRzQXRDb21wb25lbnQ9cGFyc2VyQ29uZmlnLnN1cHBvcnRzQXRDb21wb25lbnQ9PT10cnVlO3ZhciB0eXBlLG92ZXJyaWRlO2Z1bmN0aW9uIHJldChzdHlsZSx0cCl7dHlwZT10cDtyZXR1cm4gc3R5bGU7fQpmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLHN0YXRlKXt2YXIgY2g9c3RyZWFtLm5leHQoKTtpZih0b2tlbkhvb2tzW2NoXSl7dmFyIHJlc3VsdD10b2tlbkhvb2tzW2NoXShzdHJlYW0sc3RhdGUpO2lmKHJlc3VsdCE9PWZhbHNlKXJldHVybiByZXN1bHQ7fQppZihjaD09IkAiKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7cmV0dXJuIHJldCgiZGVmIixzdHJlYW0uY3VycmVudCgpKTt9ZWxzZSBpZihjaD09Ij0ifHwoY2g9PSJ+Inx8Y2g9PSJ8IikmJnN0cmVhbS5lYXQoIj0iKSl7cmV0dXJuIHJldChudWxsLCJjb21wYXJlIik7fWVsc2UgaWYoY2g9PSJcIiJ8fGNoPT0iJyIpe3N0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKGNoKTtyZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTt9ZWxzZSBpZihjaD09IiMiKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7cmV0dXJuIHJldCgiYXRvbSIsImhhc2giKTt9ZWxzZSBpZihjaD09IiEiKXtzdHJlYW0ubWF0Y2goL15ccypcdyovKTtyZXR1cm4gcmV0KCJrZXl3b3JkIiwiaW1wb3J0YW50Iik7fWVsc2UgaWYoL1xkLy50ZXN0KGNoKXx8Y2g9PSIuIiYmc3RyZWFtLmVhdCgvXGQvKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJ1bml0Iik7fWVsc2UgaWYoY2g9PT0iLSIpe2lmKC9bXGQuXS8udGVzdChzdHJlYW0ucGVlaygpKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJ1bml0Iik7fWVsc2UgaWYoc3RyZWFtLm1hdGNoKC9eLVtcd1xcXC1dKy8pKXtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7aWYoc3RyZWFtLm1hdGNoKC9eXHMqOi8sZmFsc2UpKQpyZXR1cm4gcmV0KCJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiIpO3JldHVybiByZXQoInZhcmlhYmxlLTIiLCJ2YXJpYWJsZSIpO31lbHNlIGlmKHN0cmVhbS5tYXRjaCgvXlx3Ky0vKSl7cmV0dXJuIHJldCgibWV0YSIsIm1ldGEiKTt9fWVsc2UgaWYoL1ssKz4qXC9dLy50ZXN0KGNoKSl7cmV0dXJuIHJldChudWxsLCJzZWxlY3Qtb3AiKTt9ZWxzZSBpZihjaD09Ii4iJiZzdHJlYW0ubWF0Y2goL14tP1tfYS16XVtfYS16MC05LV0qL2kpKXtyZXR1cm4gcmV0KCJxdWFsaWZpZXIiLCJxdWFsaWZpZXIiKTt9ZWxzZSBpZigvWzo7e31cW1xdXChcKV0vLnRlc3QoY2gpKXtyZXR1cm4gcmV0KG51bGwsY2gpO31lbHNlIGlmKChjaD09InUiJiZzdHJlYW0ubWF0Y2goL3JsKC1wcmVmaXgpP1woLykpfHwoY2g9PSJkIiYmc3RyZWFtLm1hdGNoKCJvbWFpbigiKSl8fChjaD09InIiJiZzdHJlYW0ubWF0Y2goImVnZXhwKCIpKSl7c3RyZWFtLmJhY2tVcCgxKTtzdGF0ZS50b2tlbml6ZT10b2tlblBhcmVudGhlc2l6ZWQ7cmV0dXJuIHJldCgicHJvcGVydHkiLCJ3b3JkIik7fWVsc2UgaWYoL1tcd1xcXC1dLy50ZXN0KGNoKSl7c3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pO3JldHVybiByZXQoInByb3BlcnR5Iiwid29yZCIpO31lbHNle3JldHVybiByZXQobnVsbCxudWxsKTt9fQpmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7dmFyIGVzY2FwZWQ9ZmFsc2UsY2g7d2hpbGUoKGNoPXN0cmVhbS5uZXh0KCkpIT1udWxsKXtpZihjaD09cXVvdGUmJiFlc2NhcGVkKXtpZihxdW90ZT09IikiKXN0cmVhbS5iYWNrVXAoMSk7YnJlYWs7fQplc2NhcGVkPSFlc2NhcGVkJiZjaD09IlxcIjt9CmlmKGNoPT1xdW90ZXx8IWVzY2FwZWQmJnF1b3RlIT0iKSIpc3RhdGUudG9rZW5pemU9bnVsbDtyZXR1cm4gcmV0KCJzdHJpbmciLCJzdHJpbmciKTt9O30KZnVuY3Rpb24gdG9rZW5QYXJlbnRoZXNpemVkKHN0cmVhbSxzdGF0ZSl7c3RyZWFtLm5leHQoKTtpZighc3RyZWFtLm1hdGNoKC9ccypbXCJcJyldLyxmYWxzZSkpCnN0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKCIpIik7ZWxzZQpzdGF0ZS50b2tlbml6ZT1udWxsO3JldHVybiByZXQobnVsbCwiKCIpO30KZnVuY3Rpb24gQ29udGV4dCh0eXBlLGluZGVudCxwcmV2KXt0aGlzLnR5cGU9dHlwZTt0aGlzLmluZGVudD1pbmRlbnQ7dGhpcy5wcmV2PXByZXY7fQpmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sdHlwZSxpbmRlbnQpe3N0YXRlLmNvbnRleHQ9bmV3IENvbnRleHQodHlwZSxzdHJlYW0uaW5kZW50YXRpb24oKSsoaW5kZW50PT09ZmFsc2U/MDppbmRlbnRVbml0KSxzdGF0ZS5jb250ZXh0KTtyZXR1cm4gdHlwZTt9CmZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpe2lmKHN0YXRlLmNvbnRleHQucHJldikKc3RhdGUuY29udGV4dD1zdGF0ZS5jb250ZXh0LnByZXY7cmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9CmZ1bmN0aW9uIHBhc3ModHlwZSxzdHJlYW0sc3RhdGUpe3JldHVybiBzdGF0ZXNbc3RhdGUuY29udGV4dC50eXBlXSh0eXBlLHN0cmVhbSxzdGF0ZSk7fQpmdW5jdGlvbiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlLG4pe2Zvcih2YXIgaT1ufHwxO2k+MDtpLS0pCnN0YXRlLmNvbnRleHQ9c3RhdGUuY29udGV4dC5wcmV2O3JldHVybiBwYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTt9CmZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHN0cmVhbSl7dmFyIHdvcmQ9c3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpO2lmKHZhbHVlS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpCm92ZXJyaWRlPSJhdG9tIjtlbHNlIGlmKGNvbG9yS2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpCm92ZXJyaWRlPSJrZXl3b3JkIjtlbHNlCm92ZXJyaWRlPSJ2YXJpYWJsZSI7fQp2YXIgc3RhdGVzPXt9O3N0YXRlcy50b3A9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7Iil7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiYmxvY2siKTt9ZWxzZSBpZih0eXBlPT0ifSImJnN0YXRlLmNvbnRleHQucHJldil7cmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO31lbHNlIGlmKHN1cHBvcnRzQXRDb21wb25lbnQmJi9AY29tcG9uZW50Ly50ZXN0KHR5cGUpKXtyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdENvbXBvbmVudEJsb2NrIik7fWVsc2UgaWYoL15AKC1tb3otKT9kb2N1bWVudCQvLnRlc3QodHlwZSkpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImRvY3VtZW50VHlwZXMiKTt9ZWxzZSBpZigvXkAobWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudHxpbXBvcnQpJC8udGVzdCh0eXBlKSl7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiYXRCbG9jayIpO31lbHNlIGlmKC9eQChmb250LWZhY2V8Y291bnRlci1zdHlsZSkvLnRlc3QodHlwZSkpe3N0YXRlLnN0YXRlQXJnPXR5cGU7cmV0dXJuInJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmUiO31lbHNlIGlmKC9eQCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXMkLy50ZXN0KHR5cGUpKXtyZXR1cm4ia2V5ZnJhbWVzIjt9ZWxzZSBpZih0eXBlJiZ0eXBlLmNoYXJBdCgwKT09IkAiKXtyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdCIpO31lbHNlIGlmKHR5cGU9PSJoYXNoIil7b3ZlcnJpZGU9ImJ1aWx0aW4iO31lbHNlIGlmKHR5cGU9PSJ3b3JkIil7b3ZlcnJpZGU9InRhZyI7fWVsc2UgaWYodHlwZT09InZhcmlhYmxlLWRlZmluaXRpb24iKXtyZXR1cm4ibWF5YmVwcm9wIjt9ZWxzZSBpZih0eXBlPT0iaW50ZXJwb2xhdGlvbiIpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImludGVycG9sYXRpb24iKTt9ZWxzZSBpZih0eXBlPT0iOiIpe3JldHVybiJwc2V1ZG8iO31lbHNlIGlmKGFsbG93TmVzdGVkJiZ0eXBlPT0iKCIpe3JldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sInBhcmVucyIpO30KcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5ibG9jaz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IndvcmQiKXt2YXIgd29yZD1zdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7aWYocHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSl7b3ZlcnJpZGU9InByb3BlcnR5IjtyZXR1cm4ibWF5YmVwcm9wIjt9ZWxzZSBpZihub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpe292ZXJyaWRlPSJzdHJpbmctMiI7cmV0dXJuIm1heWJlcHJvcCI7fWVsc2UgaWYoYWxsb3dOZXN0ZWQpe292ZXJyaWRlPXN0cmVhbS5tYXRjaCgvXlxzKjooPzpcc3wkKS8sZmFsc2UpPyJwcm9wZXJ0eSI6InRhZyI7cmV0dXJuImJsb2NrIjt9ZWxzZXtvdmVycmlkZSs9IiBlcnJvciI7cmV0dXJuIm1heWJlcHJvcCI7fX1lbHNlIGlmKHR5cGU9PSJtZXRhIil7cmV0dXJuImJsb2NrIjt9ZWxzZSBpZighYWxsb3dOZXN0ZWQmJih0eXBlPT0iaGFzaCJ8fHR5cGU9PSJxdWFsaWZpZXIiKSl7b3ZlcnJpZGU9ImVycm9yIjtyZXR1cm4iYmxvY2siO31lbHNle3JldHVybiBzdGF0ZXMudG9wKHR5cGUsc3RyZWFtLHN0YXRlKTt9fTtzdGF0ZXMubWF5YmVwcm9wPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOiIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicHJvcCIpO3JldHVybiBwYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTt9O3N0YXRlcy5wcm9wPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSJ7IiYmYWxsb3dOZXN0ZWQpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicHJvcEJsb2NrIik7aWYodHlwZT09In0ifHx0eXBlPT0ieyIpcmV0dXJuIHBvcEFuZFBhc3ModHlwZSxzdHJlYW0sc3RhdGUpO2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJwYXJlbnMiKTtpZih0eXBlPT0iaGFzaCImJiEvXiMoWzAtOWEtZkEtZl17Myw0fXxbMC05YS1mQS1mXXs2fXxbMC05YS1mQS1mXXs4fSkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKXtvdmVycmlkZSs9IiBlcnJvciI7fWVsc2UgaWYodHlwZT09IndvcmQiKXt3b3JkQXNWYWx1ZShzdHJlYW0pO31lbHNlIGlmKHR5cGU9PSJpbnRlcnBvbGF0aW9uIil7cmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiaW50ZXJwb2xhdGlvbiIpO30KcmV0dXJuInByb3AiO307c3RhdGVzLnByb3BCbG9jaz1mdW5jdGlvbih0eXBlLF9zdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ9IilyZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7aWYodHlwZT09IndvcmQiKXtvdmVycmlkZT0icHJvcGVydHkiO3JldHVybiJtYXliZXByb3AiO30KcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5wYXJlbnM9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7Inx8dHlwZT09In0iKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0iKSIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJwYXJlbnMiKTtpZih0eXBlPT0iaW50ZXJwb2xhdGlvbiIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwiaW50ZXJwb2xhdGlvbiIpO2lmKHR5cGU9PSJ3b3JkIil3b3JkQXNWYWx1ZShzdHJlYW0pO3JldHVybiJwYXJlbnMiO307c3RhdGVzLnBzZXVkbz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09Im1ldGEiKXJldHVybiJwc2V1ZG8iO2lmKHR5cGU9PSJ3b3JkIil7b3ZlcnJpZGU9InZhcmlhYmxlLTMiO3JldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7fQpyZXR1cm4gcGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7fTtzdGF0ZXMuZG9jdW1lbnRUeXBlcz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IndvcmQiJiZkb2N1bWVudFR5cGVzLmhhc093blByb3BlcnR5KHN0cmVhbS5jdXJyZW50KCkpKXtvdmVycmlkZT0idGFnIjtyZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO31lbHNle3JldHVybiBzdGF0ZXMuYXRCbG9jayh0eXBlLHN0cmVhbSxzdGF0ZSk7fX07c3RhdGVzLmF0QmxvY2s9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSIoIilyZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsc3RyZWFtLCJhdEJsb2NrX3BhcmVucyIpO2lmKHR5cGU9PSJ9Inx8dHlwZT09IjsiKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0ieyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpJiZwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sYWxsb3dOZXN0ZWQ/ImJsb2NrIjoidG9wIik7aWYodHlwZT09ImludGVycG9sYXRpb24iKXJldHVybiBwdXNoQ29udGV4dChzdGF0ZSxzdHJlYW0sImludGVycG9sYXRpb24iKTtpZih0eXBlPT0id29yZCIpe3ZhciB3b3JkPXN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTtpZih3b3JkPT0ib25seSJ8fHdvcmQ9PSJub3QifHx3b3JkPT0iYW5kInx8d29yZD09Im9yIikKb3ZlcnJpZGU9ImtleXdvcmQiO2Vsc2UgaWYobWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImF0dHJpYnV0ZSI7ZWxzZSBpZihtZWRpYUZlYXR1cmVzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0icHJvcGVydHkiO2Vsc2UgaWYobWVkaWFWYWx1ZUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0ia2V5d29yZCI7ZWxzZSBpZihwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0icHJvcGVydHkiO2Vsc2UgaWYobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQpvdmVycmlkZT0ic3RyaW5nLTIiO2Vsc2UgaWYodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImF0b20iO2Vsc2UgaWYoY29sb3JLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKb3ZlcnJpZGU9ImtleXdvcmQiO2Vsc2UKb3ZlcnJpZGU9ImVycm9yIjt9CnJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7fTtzdGF0ZXMuYXRDb21wb25lbnRCbG9jaz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09In0iKQpyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7aWYodHlwZT09InsiKQpyZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkmJnB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSxhbGxvd05lc3RlZD8iYmxvY2siOiJ0b3AiLGZhbHNlKTtpZih0eXBlPT0id29yZCIpCm92ZXJyaWRlPSJlcnJvciI7cmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTt9O3N0YXRlcy5hdEJsb2NrX3BhcmVucz1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09IikiKXJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtpZih0eXBlPT0ieyJ8fHR5cGU9PSJ9IilyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSwyKTtyZXR1cm4gc3RhdGVzLmF0QmxvY2sodHlwZSxzdHJlYW0sc3RhdGUpO307c3RhdGVzLnJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmU9ZnVuY3Rpb24odHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ7IikKcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwicmVzdHJpY3RlZF9hdEJsb2NrIik7aWYodHlwZT09IndvcmQiJiZzdGF0ZS5zdGF0ZUFyZz09IkBjb3VudGVyLXN0eWxlIil7b3ZlcnJpZGU9InZhcmlhYmxlIjtyZXR1cm4icmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZSI7fQpyZXR1cm4gcGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7fTtzdGF0ZXMucmVzdHJpY3RlZF9hdEJsb2NrPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ifSIpe3N0YXRlLnN0YXRlQXJnPW51bGw7cmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO30KaWYodHlwZT09IndvcmQiKXtpZigoc3RhdGUuc3RhdGVBcmc9PSJAZm9udC1mYWNlIiYmIWZvbnRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKSkpfHwoc3RhdGUuc3RhdGVBcmc9PSJAY291bnRlci1zdHlsZSImJiFjb3VudGVyRGVzY3JpcHRvcnMuaGFzT3duUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpKSkpCm92ZXJyaWRlPSJlcnJvciI7ZWxzZQpvdmVycmlkZT0icHJvcGVydHkiO3JldHVybiJtYXliZXByb3AiO30KcmV0dXJuInJlc3RyaWN0ZWRfYXRCbG9jayI7fTtzdGF0ZXMua2V5ZnJhbWVzPWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe292ZXJyaWRlPSJ2YXJpYWJsZSI7cmV0dXJuImtleWZyYW1lcyI7fQppZih0eXBlPT0ieyIpcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLHN0cmVhbSwidG9wIik7cmV0dXJuIHBhc3ModHlwZSxzdHJlYW0sc3RhdGUpO307c3RhdGVzLmF0PWZ1bmN0aW9uKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iOyIpcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO2lmKHR5cGU9PSJ7Inx8dHlwZT09In0iKXJldHVybiBwb3BBbmRQYXNzKHR5cGUsc3RyZWFtLHN0YXRlKTtpZih0eXBlPT0id29yZCIpb3ZlcnJpZGU9InRhZyI7ZWxzZSBpZih0eXBlPT0iaGFzaCIpb3ZlcnJpZGU9ImJ1aWx0aW4iO3JldHVybiJhdCI7fTtzdGF0ZXMuaW50ZXJwb2xhdGlvbj1mdW5jdGlvbih0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09In0iKXJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtpZih0eXBlPT0ieyJ8fHR5cGU9PSI7IilyZXR1cm4gcG9wQW5kUGFzcyh0eXBlLHN0cmVhbSxzdGF0ZSk7aWYodHlwZT09IndvcmQiKW92ZXJyaWRlPSJ2YXJpYWJsZSI7ZWxzZSBpZih0eXBlIT0idmFyaWFibGUiJiZ0eXBlIT0iKCImJnR5cGUhPSIpIilvdmVycmlkZT0iZXJyb3IiO3JldHVybiJpbnRlcnBvbGF0aW9uIjt9O3JldHVybntzdGFydFN0YXRlOmZ1bmN0aW9uKGJhc2Upe3JldHVybnt0b2tlbml6ZTpudWxsLHN0YXRlOmlubGluZT8iYmxvY2siOiJ0b3AiLHN0YXRlQXJnOm51bGwsY29udGV4dDpuZXcgQ29udGV4dChpbmxpbmU/ImJsb2NrIjoidG9wIixiYXNlfHwwLG51bGwpfTt9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnRva2VuaXplJiZzdHJlYW0uZWF0U3BhY2UoKSlyZXR1cm4gbnVsbDt2YXIgc3R5bGU9KHN0YXRlLnRva2VuaXplfHx0b2tlbkJhc2UpKHN0cmVhbSxzdGF0ZSk7aWYoc3R5bGUmJnR5cGVvZiBzdHlsZT09Im9iamVjdCIpe3R5cGU9c3R5bGVbMV07c3R5bGU9c3R5bGVbMF07fQpvdmVycmlkZT1zdHlsZTtpZih0eXBlIT0iY29tbWVudCIpCnN0YXRlLnN0YXRlPXN0YXRlc1tzdGF0ZS5zdGF0ZV0odHlwZSxzdHJlYW0sc3RhdGUpO3JldHVybiBvdmVycmlkZTt9LGluZGVudDpmdW5jdGlvbihzdGF0ZSx0ZXh0QWZ0ZXIpe3ZhciBjeD1zdGF0ZS5jb250ZXh0LGNoPXRleHRBZnRlciYmdGV4dEFmdGVyLmNoYXJBdCgwKTt2YXIgaW5kZW50PWN4LmluZGVudDtpZihjeC50eXBlPT0icHJvcCImJihjaD09In0ifHxjaD09IikiKSljeD1jeC5wcmV2O2lmKGN4LnByZXYpe2lmKGNoPT0ifSImJihjeC50eXBlPT0iYmxvY2sifHxjeC50eXBlPT0idG9wInx8Y3gudHlwZT09ImludGVycG9sYXRpb24ifHxjeC50eXBlPT0icmVzdHJpY3RlZF9hdEJsb2NrIikpe2N4PWN4LnByZXY7aW5kZW50PWN4LmluZGVudDt9ZWxzZSBpZihjaD09IikiJiYoY3gudHlwZT09InBhcmVucyJ8fGN4LnR5cGU9PSJhdEJsb2NrX3BhcmVucyIpfHxjaD09InsiJiYoY3gudHlwZT09ImF0Inx8Y3gudHlwZT09ImF0QmxvY2siKSl7aW5kZW50PU1hdGgubWF4KDAsY3guaW5kZW50LWluZGVudFVuaXQpO319CnJldHVybiBpbmRlbnQ7fSxlbGVjdHJpY0NoYXJzOiJ9IixibG9ja0NvbW1lbnRTdGFydDoiLyoiLGJsb2NrQ29tbWVudEVuZDoiKi8iLGJsb2NrQ29tbWVudENvbnRpbnVlOiIgKiAiLGxpbmVDb21tZW50OmxpbmVDb21tZW50LGZvbGQ6ImJyYWNlIn07fSk7ZnVuY3Rpb24ga2V5U2V0KGFycmF5KXt2YXIga2V5cz17fTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDsrK2kpe2tleXNbYXJyYXlbaV0udG9Mb3dlckNhc2UoKV09dHJ1ZTt9CnJldHVybiBrZXlzO30KdmFyIGRvY3VtZW50VHlwZXNfPVsiZG9tYWluIiwicmVnZXhwIiwidXJsIiwidXJsLXByZWZpeCJdLGRvY3VtZW50VHlwZXM9a2V5U2V0KGRvY3VtZW50VHlwZXNfKTt2YXIgbWVkaWFUeXBlc189WyJhbGwiLCJhdXJhbCIsImJyYWlsbGUiLCJoYW5kaGVsZCIsInByaW50IiwicHJvamVjdGlvbiIsInNjcmVlbiIsInR0eSIsInR2IiwiZW1ib3NzZWQiXSxtZWRpYVR5cGVzPWtleVNldChtZWRpYVR5cGVzXyk7dmFyIG1lZGlhRmVhdHVyZXNfPVsid2lkdGgiLCJtaW4td2lkdGgiLCJtYXgtd2lkdGgiLCJoZWlnaHQiLCJtaW4taGVpZ2h0IiwibWF4LWhlaWdodCIsImRldmljZS13aWR0aCIsIm1pbi1kZXZpY2Utd2lkdGgiLCJtYXgtZGV2aWNlLXdpZHRoIiwiZGV2aWNlLWhlaWdodCIsIm1pbi1kZXZpY2UtaGVpZ2h0IiwibWF4LWRldmljZS1oZWlnaHQiLCJhc3BlY3QtcmF0aW8iLCJtaW4tYXNwZWN0LXJhdGlvIiwibWF4LWFzcGVjdC1yYXRpbyIsImRldmljZS1hc3BlY3QtcmF0aW8iLCJtaW4tZGV2aWNlLWFzcGVjdC1yYXRpbyIsIm1heC1kZXZpY2UtYXNwZWN0LXJhdGlvIiwiY29sb3IiLCJtaW4tY29sb3IiLCJtYXgtY29sb3IiLCJjb2xvci1pbmRleCIsIm1pbi1jb2xvci1pbmRleCIsIm1heC1jb2xvci1pbmRleCIsIm1vbm9jaHJvbWUiLCJtaW4tbW9ub2Nocm9tZSIsIm1heC1tb25vY2hyb21lIiwicmVzb2x1dGlvbiIsIm1pbi1yZXNvbHV0aW9uIiwibWF4LXJlc29sdXRpb24iLCJzY2FuIiwiZ3JpZCIsIm9yaWVudGF0aW9uIiwiZGV2aWNlLXBpeGVsLXJhdGlvIiwibWluLWRldmljZS1waXhlbC1yYXRpbyIsIm1heC1kZXZpY2UtcGl4ZWwtcmF0aW8iLCJwb2ludGVyIiwiYW55LXBvaW50ZXIiLCJob3ZlciIsImFueS1ob3ZlciJdLG1lZGlhRmVhdHVyZXM9a2V5U2V0KG1lZGlhRmVhdHVyZXNfKTt2YXIgbWVkaWFWYWx1ZUtleXdvcmRzXz1bImxhbmRzY2FwZSIsInBvcnRyYWl0Iiwibm9uZSIsImNvYXJzZSIsImZpbmUiLCJvbi1kZW1hbmQiLCJob3ZlciIsImludGVybGFjZSIsInByb2dyZXNzaXZlIl0sbWVkaWFWYWx1ZUtleXdvcmRzPWtleVNldChtZWRpYVZhbHVlS2V5d29yZHNfKTt2YXIgcHJvcGVydHlLZXl3b3Jkc189WyJhbGlnbi1jb250ZW50IiwiYWxpZ24taXRlbXMiLCJhbGlnbi1zZWxmIiwiYWxpZ25tZW50LWFkanVzdCIsImFsaWdubWVudC1iYXNlbGluZSIsImFuY2hvci1wb2ludCIsImFuaW1hdGlvbiIsImFuaW1hdGlvbi1kZWxheSIsImFuaW1hdGlvbi1kaXJlY3Rpb24iLCJhbmltYXRpb24tZHVyYXRpb24iLCJhbmltYXRpb24tZmlsbC1tb2RlIiwiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIsImFuaW1hdGlvbi1uYW1lIiwiYW5pbWF0aW9uLXBsYXktc3RhdGUiLCJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIiwiYXBwZWFyYW5jZSIsImF6aW11dGgiLCJiYWNrZmFjZS12aXNpYmlsaXR5IiwiYmFja2dyb3VuZCIsImJhY2tncm91bmQtYXR0YWNobWVudCIsImJhY2tncm91bmQtYmxlbmQtbW9kZSIsImJhY2tncm91bmQtY2xpcCIsImJhY2tncm91bmQtY29sb3IiLCJiYWNrZ3JvdW5kLWltYWdlIiwiYmFja2dyb3VuZC1vcmlnaW4iLCJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwiYmFja2dyb3VuZC1yZXBlYXQiLCJiYWNrZ3JvdW5kLXNpemUiLCJiYXNlbGluZS1zaGlmdCIsImJpbmRpbmciLCJibGVlZCIsImJvb2ttYXJrLWxhYmVsIiwiYm9va21hcmstbGV2ZWwiLCJib29rbWFyay1zdGF0ZSIsImJvb2ttYXJrLXRhcmdldCIsImJvcmRlciIsImJvcmRlci1ib3R0b20iLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItY29sbGFwc2UiLCJib3JkZXItY29sb3IiLCJib3JkZXItaW1hZ2UiLCJib3JkZXItaW1hZ2Utb3V0c2V0IiwiYm9yZGVyLWltYWdlLXJlcGVhdCIsImJvcmRlci1pbWFnZS1zbGljZSIsImJvcmRlci1pbWFnZS1zb3VyY2UiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdCIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLWxlZnQtc3R5bGUiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yYWRpdXMiLCJib3JkZXItcmlnaHQiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItcmlnaHQtc3R5bGUiLCJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItc3BhY2luZyIsImJvcmRlci1zdHlsZSIsImJvcmRlci10b3AiLCJib3JkZXItdG9wLWNvbG9yIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1zdHlsZSIsImJvcmRlci10b3Atd2lkdGgiLCJib3JkZXItd2lkdGgiLCJib3R0b20iLCJib3gtZGVjb3JhdGlvbi1icmVhayIsImJveC1zaGFkb3ciLCJib3gtc2l6aW5nIiwiYnJlYWstYWZ0ZXIiLCJicmVhay1iZWZvcmUiLCJicmVhay1pbnNpZGUiLCJjYXB0aW9uLXNpZGUiLCJjYXJldC1jb2xvciIsImNsZWFyIiwiY2xpcCIsImNvbG9yIiwiY29sb3ItcHJvZmlsZSIsImNvbHVtbi1jb3VudCIsImNvbHVtbi1maWxsIiwiY29sdW1uLWdhcCIsImNvbHVtbi1ydWxlIiwiY29sdW1uLXJ1bGUtY29sb3IiLCJjb2x1bW4tcnVsZS1zdHlsZSIsImNvbHVtbi1ydWxlLXdpZHRoIiwiY29sdW1uLXNwYW4iLCJjb2x1bW4td2lkdGgiLCJjb2x1bW5zIiwiY29udGVudCIsImNvdW50ZXItaW5jcmVtZW50IiwiY291bnRlci1yZXNldCIsImNyb3AiLCJjdWUiLCJjdWUtYWZ0ZXIiLCJjdWUtYmVmb3JlIiwiY3Vyc29yIiwiZGlyZWN0aW9uIiwiZGlzcGxheSIsImRvbWluYW50LWJhc2VsaW5lIiwiZHJvcC1pbml0aWFsLWFmdGVyLWFkanVzdCIsImRyb3AtaW5pdGlhbC1hZnRlci1hbGlnbiIsImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0IiwiZHJvcC1pbml0aWFsLWJlZm9yZS1hbGlnbiIsImRyb3AtaW5pdGlhbC1zaXplIiwiZHJvcC1pbml0aWFsLXZhbHVlIiwiZWxldmF0aW9uIiwiZW1wdHktY2VsbHMiLCJmaXQiLCJmaXQtcG9zaXRpb24iLCJmbGV4IiwiZmxleC1iYXNpcyIsImZsZXgtZGlyZWN0aW9uIiwiZmxleC1mbG93IiwiZmxleC1ncm93IiwiZmxleC1zaHJpbmsiLCJmbGV4LXdyYXAiLCJmbG9hdCIsImZsb2F0LW9mZnNldCIsImZsb3ctZnJvbSIsImZsb3ctaW50byIsImZvbnQiLCJmb250LWZlYXR1cmUtc2V0dGluZ3MiLCJmb250LWZhbWlseSIsImZvbnQta2VybmluZyIsImZvbnQtbGFuZ3VhZ2Utb3ZlcnJpZGUiLCJmb250LXNpemUiLCJmb250LXNpemUtYWRqdXN0IiwiZm9udC1zdHJldGNoIiwiZm9udC1zdHlsZSIsImZvbnQtc3ludGhlc2lzIiwiZm9udC12YXJpYW50IiwiZm9udC12YXJpYW50LWFsdGVybmF0ZXMiLCJmb250LXZhcmlhbnQtY2FwcyIsImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIiwiZm9udC12YXJpYW50LWxpZ2F0dXJlcyIsImZvbnQtdmFyaWFudC1udW1lcmljIiwiZm9udC12YXJpYW50LXBvc2l0aW9uIiwiZm9udC13ZWlnaHQiLCJncmlkIiwiZ3JpZC1hcmVhIiwiZ3JpZC1hdXRvLWNvbHVtbnMiLCJncmlkLWF1dG8tZmxvdyIsImdyaWQtYXV0by1yb3dzIiwiZ3JpZC1jb2x1bW4iLCJncmlkLWNvbHVtbi1lbmQiLCJncmlkLWNvbHVtbi1nYXAiLCJncmlkLWNvbHVtbi1zdGFydCIsImdyaWQtZ2FwIiwiZ3JpZC1yb3ciLCJncmlkLXJvdy1lbmQiLCJncmlkLXJvdy1nYXAiLCJncmlkLXJvdy1zdGFydCIsImdyaWQtdGVtcGxhdGUiLCJncmlkLXRlbXBsYXRlLWFyZWFzIiwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIiwiZ3JpZC10ZW1wbGF0ZS1yb3dzIiwiaGFuZ2luZy1wdW5jdHVhdGlvbiIsImhlaWdodCIsImh5cGhlbnMiLCJpY29uIiwiaW1hZ2Utb3JpZW50YXRpb24iLCJpbWFnZS1yZW5kZXJpbmciLCJpbWFnZS1yZXNvbHV0aW9uIiwiaW5saW5lLWJveC1hbGlnbiIsImp1c3RpZnktY29udGVudCIsImp1c3RpZnktaXRlbXMiLCJqdXN0aWZ5LXNlbGYiLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJsaW5lLWJyZWFrIiwibGluZS1oZWlnaHQiLCJsaW5lLXN0YWNraW5nIiwibGluZS1zdGFja2luZy1ydWJ5IiwibGluZS1zdGFja2luZy1zaGlmdCIsImxpbmUtc3RhY2tpbmctc3RyYXRlZ3kiLCJsaXN0LXN0eWxlIiwibGlzdC1zdHlsZS1pbWFnZSIsImxpc3Qtc3R5bGUtcG9zaXRpb24iLCJsaXN0LXN0eWxlLXR5cGUiLCJtYXJnaW4iLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWFya3MiLCJtYXJxdWVlLWRpcmVjdGlvbiIsIm1hcnF1ZWUtbG9vcCIsIm1hcnF1ZWUtcGxheS1jb3VudCIsIm1hcnF1ZWUtc3BlZWQiLCJtYXJxdWVlLXN0eWxlIiwibWF4LWhlaWdodCIsIm1heC13aWR0aCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJtb3ZlLXRvIiwibmF2LWRvd24iLCJuYXYtaW5kZXgiLCJuYXYtbGVmdCIsIm5hdi1yaWdodCIsIm5hdi11cCIsIm9iamVjdC1maXQiLCJvYmplY3QtcG9zaXRpb24iLCJvcGFjaXR5Iiwib3JkZXIiLCJvcnBoYW5zIiwib3V0bGluZSIsIm91dGxpbmUtY29sb3IiLCJvdXRsaW5lLW9mZnNldCIsIm91dGxpbmUtc3R5bGUiLCJvdXRsaW5lLXdpZHRoIiwib3ZlcmZsb3ciLCJvdmVyZmxvdy1zdHlsZSIsIm92ZXJmbG93LXdyYXAiLCJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSIsInBhZGRpbmciLCJwYWRkaW5nLWJvdHRvbSIsInBhZGRpbmctbGVmdCIsInBhZGRpbmctcmlnaHQiLCJwYWRkaW5nLXRvcCIsInBhZ2UiLCJwYWdlLWJyZWFrLWFmdGVyIiwicGFnZS1icmVhay1iZWZvcmUiLCJwYWdlLWJyZWFrLWluc2lkZSIsInBhZ2UtcG9saWN5IiwicGF1c2UiLCJwYXVzZS1hZnRlciIsInBhdXNlLWJlZm9yZSIsInBlcnNwZWN0aXZlIiwicGVyc3BlY3RpdmUtb3JpZ2luIiwicGl0Y2giLCJwaXRjaC1yYW5nZSIsInBsYWNlLWNvbnRlbnQiLCJwbGFjZS1pdGVtcyIsInBsYWNlLXNlbGYiLCJwbGF5LWR1cmluZyIsInBvc2l0aW9uIiwicHJlc2VudGF0aW9uLWxldmVsIiwicHVuY3R1YXRpb24tdHJpbSIsInF1b3RlcyIsInJlZ2lvbi1icmVhay1hZnRlciIsInJlZ2lvbi1icmVhay1iZWZvcmUiLCJyZWdpb24tYnJlYWstaW5zaWRlIiwicmVnaW9uLWZyYWdtZW50IiwicmVuZGVyaW5nLWludGVudCIsInJlc2l6ZSIsInJlc3QiLCJyZXN0LWFmdGVyIiwicmVzdC1iZWZvcmUiLCJyaWNobmVzcyIsInJpZ2h0Iiwicm90YXRpb24iLCJyb3RhdGlvbi1wb2ludCIsInJ1YnktYWxpZ24iLCJydWJ5LW92ZXJoYW5nIiwicnVieS1wb3NpdGlvbiIsInJ1Ynktc3BhbiIsInNoYXBlLWltYWdlLXRocmVzaG9sZCIsInNoYXBlLWluc2lkZSIsInNoYXBlLW1hcmdpbiIsInNoYXBlLW91dHNpZGUiLCJzaXplIiwic3BlYWsiLCJzcGVhay1hcyIsInNwZWFrLWhlYWRlciIsInNwZWFrLW51bWVyYWwiLCJzcGVhay1wdW5jdHVhdGlvbiIsInNwZWVjaC1yYXRlIiwic3RyZXNzIiwic3RyaW5nLXNldCIsInRhYi1zaXplIiwidGFibGUtbGF5b3V0IiwidGFyZ2V0IiwidGFyZ2V0LW5hbWUiLCJ0YXJnZXQtbmV3IiwidGFyZ2V0LXBvc2l0aW9uIiwidGV4dC1hbGlnbiIsInRleHQtYWxpZ24tbGFzdCIsInRleHQtZGVjb3JhdGlvbiIsInRleHQtZGVjb3JhdGlvbi1jb2xvciIsInRleHQtZGVjb3JhdGlvbi1saW5lIiwidGV4dC1kZWNvcmF0aW9uLXNraXAiLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiLCJ0ZXh0LWVtcGhhc2lzIiwidGV4dC1lbXBoYXNpcy1jb2xvciIsInRleHQtZW1waGFzaXMtcG9zaXRpb24iLCJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwidGV4dC1oZWlnaHQiLCJ0ZXh0LWluZGVudCIsInRleHQtanVzdGlmeSIsInRleHQtb3V0bGluZSIsInRleHQtb3ZlcmZsb3ciLCJ0ZXh0LXNoYWRvdyIsInRleHQtc2l6ZS1hZGp1c3QiLCJ0ZXh0LXNwYWNlLWNvbGxhcHNlIiwidGV4dC10cmFuc2Zvcm0iLCJ0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiIsInRleHQtd3JhcCIsInRvcCIsInRyYW5zZm9ybSIsInRyYW5zZm9ybS1vcmlnaW4iLCJ0cmFuc2Zvcm0tc3R5bGUiLCJ0cmFuc2l0aW9uIiwidHJhbnNpdGlvbi1kZWxheSIsInRyYW5zaXRpb24tZHVyYXRpb24iLCJ0cmFuc2l0aW9uLXByb3BlcnR5IiwidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24iLCJ1bmljb2RlLWJpZGkiLCJ1c2VyLXNlbGVjdCIsInZlcnRpY2FsLWFsaWduIiwidmlzaWJpbGl0eSIsInZvaWNlLWJhbGFuY2UiLCJ2b2ljZS1kdXJhdGlvbiIsInZvaWNlLWZhbWlseSIsInZvaWNlLXBpdGNoIiwidm9pY2UtcmFuZ2UiLCJ2b2ljZS1yYXRlIiwidm9pY2Utc3RyZXNzIiwidm9pY2Utdm9sdW1lIiwidm9sdW1lIiwid2hpdGUtc3BhY2UiLCJ3aWRvd3MiLCJ3aWR0aCIsIndpbGwtY2hhbmdlIiwid29yZC1icmVhayIsIndvcmQtc3BhY2luZyIsIndvcmQtd3JhcCIsInotaW5kZXgiLCJjbGlwLXBhdGgiLCJjbGlwLXJ1bGUiLCJtYXNrIiwiZW5hYmxlLWJhY2tncm91bmQiLCJmaWx0ZXIiLCJmbG9vZC1jb2xvciIsImZsb29kLW9wYWNpdHkiLCJsaWdodGluZy1jb2xvciIsInN0b3AtY29sb3IiLCJzdG9wLW9wYWNpdHkiLCJwb2ludGVyLWV2ZW50cyIsImNvbG9yLWludGVycG9sYXRpb24iLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJjb2xvci1yZW5kZXJpbmciLCJmaWxsIiwiZmlsbC1vcGFjaXR5IiwiZmlsbC1ydWxlIiwiaW1hZ2UtcmVuZGVyaW5nIiwibWFya2VyIiwibWFya2VyLWVuZCIsIm1hcmtlci1taWQiLCJtYXJrZXItc3RhcnQiLCJzaGFwZS1yZW5kZXJpbmciLCJzdHJva2UiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtbGluZWNhcCIsInN0cm9rZS1saW5lam9pbiIsInN0cm9rZS1taXRlcmxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJ0ZXh0LXJlbmRlcmluZyIsImJhc2VsaW5lLXNoaWZ0IiwiZG9taW5hbnQtYmFzZWxpbmUiLCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIiwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLCJ0ZXh0LWFuY2hvciIsIndyaXRpbmctbW9kZSJdLHByb3BlcnR5S2V5d29yZHM9a2V5U2V0KHByb3BlcnR5S2V5d29yZHNfKTt2YXIgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXz1bInNjcm9sbGJhci1hcnJvdy1jb2xvciIsInNjcm9sbGJhci1iYXNlLWNvbG9yIiwic2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yIiwic2Nyb2xsYmFyLWZhY2UtY29sb3IiLCJzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yIiwic2Nyb2xsYmFyLXNoYWRvdy1jb2xvciIsInNjcm9sbGJhci0zZC1saWdodC1jb2xvciIsInNjcm9sbGJhci10cmFjay1jb2xvciIsInNoYXBlLWluc2lkZSIsInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b24iLCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCJ6b29tIl0sbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzPWtleVNldChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfKTt2YXIgZm9udFByb3BlcnRpZXNfPVsiZm9udC1mYW1pbHkiLCJzcmMiLCJ1bmljb2RlLXJhbmdlIiwiZm9udC12YXJpYW50IiwiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwiZm9udC1zdHJldGNoIiwiZm9udC13ZWlnaHQiLCJmb250LXN0eWxlIl0sZm9udFByb3BlcnRpZXM9a2V5U2V0KGZvbnRQcm9wZXJ0aWVzXyk7dmFyIGNvdW50ZXJEZXNjcmlwdG9yc189WyJhZGRpdGl2ZS1zeW1ib2xzIiwiZmFsbGJhY2siLCJuZWdhdGl2ZSIsInBhZCIsInByZWZpeCIsInJhbmdlIiwic3BlYWstYXMiLCJzdWZmaXgiLCJzeW1ib2xzIiwic3lzdGVtIl0sY291bnRlckRlc2NyaXB0b3JzPWtleVNldChjb3VudGVyRGVzY3JpcHRvcnNfKTt2YXIgY29sb3JLZXl3b3Jkc189WyJhbGljZWJsdWUiLCJhbnRpcXVld2hpdGUiLCJhcXVhIiwiYXF1YW1hcmluZSIsImF6dXJlIiwiYmVpZ2UiLCJiaXNxdWUiLCJibGFjayIsImJsYW5jaGVkYWxtb25kIiwiYmx1ZSIsImJsdWV2aW9sZXQiLCJicm93biIsImJ1cmx5d29vZCIsImNhZGV0Ymx1ZSIsImNoYXJ0cmV1c2UiLCJjaG9jb2xhdGUiLCJjb3JhbCIsImNvcm5mbG93ZXJibHVlIiwiY29ybnNpbGsiLCJjcmltc29uIiwiY3lhbiIsImRhcmtibHVlIiwiZGFya2N5YW4iLCJkYXJrZ29sZGVucm9kIiwiZGFya2dyYXkiLCJkYXJrZ3JlZW4iLCJkYXJra2hha2kiLCJkYXJrbWFnZW50YSIsImRhcmtvbGl2ZWdyZWVuIiwiZGFya29yYW5nZSIsImRhcmtvcmNoaWQiLCJkYXJrcmVkIiwiZGFya3NhbG1vbiIsImRhcmtzZWFncmVlbiIsImRhcmtzbGF0ZWJsdWUiLCJkYXJrc2xhdGVncmF5IiwiZGFya3R1cnF1b2lzZSIsImRhcmt2aW9sZXQiLCJkZWVwcGluayIsImRlZXBza3libHVlIiwiZGltZ3JheSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZXkiLCJncmVlbiIsImdyZWVueWVsbG93IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c3RlZWxibHVlIiwibGlnaHR5ZWxsb3ciLCJsaW1lIiwibGltZWdyZWVuIiwibGluZW4iLCJtYWdlbnRhIiwibWFyb29uIiwibWVkaXVtYXF1YW1hcmluZSIsIm1lZGl1bWJsdWUiLCJtZWRpdW1vcmNoaWQiLCJtZWRpdW1wdXJwbGUiLCJtZWRpdW1zZWFncmVlbiIsIm1lZGl1bXNsYXRlYmx1ZSIsIm1lZGl1bXNwcmluZ2dyZWVuIiwibWVkaXVtdHVycXVvaXNlIiwibWVkaXVtdmlvbGV0cmVkIiwibWlkbmlnaHRibHVlIiwibWludGNyZWFtIiwibWlzdHlyb3NlIiwibW9jY2FzaW4iLCJuYXZham93aGl0ZSIsIm5hdnkiLCJvbGRsYWNlIiwib2xpdmUiLCJvbGl2ZWRyYWIiLCJvcmFuZ2UiLCJvcmFuZ2VyZWQiLCJvcmNoaWQiLCJwYWxlZ29sZGVucm9kIiwicGFsZWdyZWVuIiwicGFsZXR1cnF1b2lzZSIsInBhbGV2aW9sZXRyZWQiLCJwYXBheWF3aGlwIiwicGVhY2hwdWZmIiwicGVydSIsInBpbmsiLCJwbHVtIiwicG93ZGVyYmx1ZSIsInB1cnBsZSIsInJlYmVjY2FwdXJwbGUiLCJyZWQiLCJyb3N5YnJvd24iLCJyb3lhbGJsdWUiLCJzYWRkbGVicm93biIsInNhbG1vbiIsInNhbmR5YnJvd24iLCJzZWFncmVlbiIsInNlYXNoZWxsIiwic2llbm5hIiwic2lsdmVyIiwic2t5Ymx1ZSIsInNsYXRlYmx1ZSIsInNsYXRlZ3JheSIsInNub3ciLCJzcHJpbmdncmVlbiIsInN0ZWVsYmx1ZSIsInRhbiIsInRlYWwiLCJ0aGlzdGxlIiwidG9tYXRvIiwidHVycXVvaXNlIiwidmlvbGV0Iiwid2hlYXQiLCJ3aGl0ZSIsIndoaXRlc21va2UiLCJ5ZWxsb3ciLCJ5ZWxsb3dncmVlbiJdLGNvbG9yS2V5d29yZHM9a2V5U2V0KGNvbG9yS2V5d29yZHNfKTt2YXIgdmFsdWVLZXl3b3Jkc189WyJhYm92ZSIsImFic29sdXRlIiwiYWN0aXZlYm9yZGVyIiwiYWRkaXRpdmUiLCJhY3RpdmVjYXB0aW9uIiwiYWZhciIsImFmdGVyLXdoaXRlLXNwYWNlIiwiYWhlYWQiLCJhbGlhcyIsImFsbCIsImFsbC1zY3JvbGwiLCJhbHBoYWJldGljIiwiYWx0ZXJuYXRlIiwiYWx3YXlzIiwiYW1oYXJpYyIsImFtaGFyaWMtYWJlZ2VkZSIsImFudGlhbGlhc2VkIiwiYXBwd29ya3NwYWNlIiwiYXJhYmljLWluZGljIiwiYXJtZW5pYW4iLCJhc3Rlcmlza3MiLCJhdHRyIiwiYXV0byIsImF1dG8tZmxvdyIsImF2b2lkIiwiYXZvaWQtY29sdW1uIiwiYXZvaWQtcGFnZSIsImF2b2lkLXJlZ2lvbiIsImJhY2tncm91bmQiLCJiYWNrd2FyZHMiLCJiYXNlbGluZSIsImJlbG93IiwiYmlkaS1vdmVycmlkZSIsImJpbmFyeSIsImJlbmdhbGkiLCJibGluayIsImJsb2NrIiwiYmxvY2stYXhpcyIsImJvbGQiLCJib2xkZXIiLCJib3JkZXIiLCJib3JkZXItYm94IiwiYm90aCIsImJvdHRvbSIsImJyZWFrIiwiYnJlYWstYWxsIiwiYnJlYWstd29yZCIsImJ1bGxldHMiLCJidXR0b24iLCJidXR0b24tYmV2ZWwiLCJidXR0b25mYWNlIiwiYnV0dG9uaGlnaGxpZ2h0IiwiYnV0dG9uc2hhZG93IiwiYnV0dG9udGV4dCIsImNhbGMiLCJjYW1ib2RpYW4iLCJjYXBpdGFsaXplIiwiY2Fwcy1sb2NrLWluZGljYXRvciIsImNhcHRpb24iLCJjYXB0aW9udGV4dCIsImNhcmV0IiwiY2VsbCIsImNlbnRlciIsImNoZWNrYm94IiwiY2lyY2xlIiwiY2prLWRlY2ltYWwiLCJjamstZWFydGhseS1icmFuY2giLCJjamstaGVhdmVubHktc3RlbSIsImNqay1pZGVvZ3JhcGhpYyIsImNsZWFyIiwiY2xpcCIsImNsb3NlLXF1b3RlIiwiY29sLXJlc2l6ZSIsImNvbGxhcHNlIiwiY29sb3IiLCJjb2xvci1idXJuIiwiY29sb3ItZG9kZ2UiLCJjb2x1bW4iLCJjb2x1bW4tcmV2ZXJzZSIsImNvbXBhY3QiLCJjb25kZW5zZWQiLCJjb250YWluIiwiY29udGVudCIsImNvbnRlbnRzIiwiY29udGVudC1ib3giLCJjb250ZXh0LW1lbnUiLCJjb250aW51b3VzIiwiY29weSIsImNvdW50ZXIiLCJjb3VudGVycyIsImNvdmVyIiwiY3JvcCIsImNyb3NzIiwiY3Jvc3NoYWlyIiwiY3VycmVudGNvbG9yIiwiY3Vyc2l2ZSIsImN5Y2xpYyIsImRhcmtlbiIsImRhc2hlZCIsImRlY2ltYWwiLCJkZWNpbWFsLWxlYWRpbmctemVybyIsImRlZmF1bHQiLCJkZWZhdWx0LWJ1dHRvbiIsImRlbnNlIiwiZGVzdGluYXRpb24tYXRvcCIsImRlc3RpbmF0aW9uLWluIiwiZGVzdGluYXRpb24tb3V0IiwiZGVzdGluYXRpb24tb3ZlciIsImRldmFuYWdhcmkiLCJkaWZmZXJlbmNlIiwiZGlzYyIsImRpc2NhcmQiLCJkaXNjbG9zdXJlLWNsb3NlZCIsImRpc2Nsb3N1cmUtb3BlbiIsImRvY3VtZW50IiwiZG90LWRhc2giLCJkb3QtZG90LWRhc2giLCJkb3R0ZWQiLCJkb3VibGUiLCJkb3duIiwiZS1yZXNpemUiLCJlYXNlIiwiZWFzZS1pbiIsImVhc2UtaW4tb3V0IiwiZWFzZS1vdXQiLCJlbGVtZW50IiwiZWxsaXBzZSIsImVsbGlwc2lzIiwiZW1iZWQiLCJlbmQiLCJldGhpb3BpYyIsImV0aGlvcGljLWFiZWdlZGUiLCJldGhpb3BpYy1hYmVnZWRlLWFtLWV0IiwiZXRoaW9waWMtYWJlZ2VkZS1nZXoiLCJldGhpb3BpYy1hYmVnZWRlLXRpLWVyIiwiZXRoaW9waWMtYWJlZ2VkZS10aS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLWFhLWVyIiwiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXQiLCJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLWdleiIsImV0aGlvcGljLWhhbGVoYW1lLW9tLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtc2lkLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtc28tZXQiLCJldGhpb3BpYy1oYWxlaGFtZS10aS1lciIsImV0aGlvcGljLWhhbGVoYW1lLXRpLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtdGlnIiwiZXRoaW9waWMtbnVtZXJpYyIsImV3LXJlc2l6ZSIsImV4Y2x1c2lvbiIsImV4cGFuZGVkIiwiZXh0ZW5kcyIsImV4dHJhLWNvbmRlbnNlZCIsImV4dHJhLWV4cGFuZGVkIiwiZmFudGFzeSIsImZhc3QiLCJmaWxsIiwiZml4ZWQiLCJmbGF0IiwiZmxleCIsImZsZXgtZW5kIiwiZmxleC1zdGFydCIsImZvb3Rub3RlcyIsImZvcndhcmRzIiwiZnJvbSIsImdlb21ldHJpY1ByZWNpc2lvbiIsImdlb3JnaWFuIiwiZ3JheXRleHQiLCJncmlkIiwiZ3Jvb3ZlIiwiZ3VqYXJhdGkiLCJndXJtdWtoaSIsImhhbmQiLCJoYW5ndWwiLCJoYW5ndWwtY29uc29uYW50IiwiaGFyZC1saWdodCIsImhlYnJldyIsImhlbHAiLCJoaWRkZW4iLCJoaWRlIiwiaGlnaGVyIiwiaGlnaGxpZ2h0IiwiaGlnaGxpZ2h0dGV4dCIsImhpcmFnYW5hIiwiaGlyYWdhbmEtaXJvaGEiLCJob3Jpem9udGFsIiwiaHNsIiwiaHNsYSIsImh1ZSIsImljb24iLCJpZ25vcmUiLCJpbmFjdGl2ZWJvcmRlciIsImluYWN0aXZlY2FwdGlvbiIsImluYWN0aXZlY2FwdGlvbnRleHQiLCJpbmZpbml0ZSIsImluZm9iYWNrZ3JvdW5kIiwiaW5mb3RleHQiLCJpbmhlcml0IiwiaW5pdGlhbCIsImlubGluZSIsImlubGluZS1heGlzIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lLWZsZXgiLCJpbmxpbmUtZ3JpZCIsImlubGluZS10YWJsZSIsImluc2V0IiwiaW5zaWRlIiwiaW50cmluc2ljIiwiaW52ZXJ0IiwiaXRhbGljIiwiamFwYW5lc2UtZm9ybWFsIiwiamFwYW5lc2UtaW5mb3JtYWwiLCJqdXN0aWZ5Iiwia2FubmFkYSIsImthdGFrYW5hIiwia2F0YWthbmEtaXJvaGEiLCJrZWVwLWFsbCIsImtobWVyIiwia29yZWFuLWhhbmd1bC1mb3JtYWwiLCJrb3JlYW4taGFuamEtZm9ybWFsIiwia29yZWFuLWhhbmphLWluZm9ybWFsIiwibGFuZHNjYXBlIiwibGFvIiwibGFyZ2UiLCJsYXJnZXIiLCJsZWZ0IiwibGV2ZWwiLCJsaWdodGVyIiwibGlnaHRlbiIsImxpbmUtdGhyb3VnaCIsImxpbmVhciIsImxpbmVhci1ncmFkaWVudCIsImxpbmVzIiwibGlzdC1pdGVtIiwibGlzdGJveCIsImxpc3RpdGVtIiwibG9jYWwiLCJsb2dpY2FsIiwibG91ZCIsImxvd2VyIiwibG93ZXItYWxwaGEiLCJsb3dlci1hcm1lbmlhbiIsImxvd2VyLWdyZWVrIiwibG93ZXItaGV4YWRlY2ltYWwiLCJsb3dlci1sYXRpbiIsImxvd2VyLW5vcndlZ2lhbiIsImxvd2VyLXJvbWFuIiwibG93ZXJjYXNlIiwibHRyIiwibHVtaW5vc2l0eSIsIm1hbGF5YWxhbSIsIm1hdGNoIiwibWF0cml4IiwibWF0cml4M2QiLCJtZWRpYS1jb250cm9scy1iYWNrZ3JvdW5kIiwibWVkaWEtY3VycmVudC10aW1lLWRpc3BsYXkiLCJtZWRpYS1mdWxsc2NyZWVuLWJ1dHRvbiIsIm1lZGlhLW11dGUtYnV0dG9uIiwibWVkaWEtcGxheS1idXR0b24iLCJtZWRpYS1yZXR1cm4tdG8tcmVhbHRpbWUtYnV0dG9uIiwibWVkaWEtcmV3aW5kLWJ1dHRvbiIsIm1lZGlhLXNlZWstYmFjay1idXR0b24iLCJtZWRpYS1zZWVrLWZvcndhcmQtYnV0dG9uIiwibWVkaWEtc2xpZGVyIiwibWVkaWEtc2xpZGVydGh1bWIiLCJtZWRpYS10aW1lLXJlbWFpbmluZy1kaXNwbGF5IiwibWVkaWEtdm9sdW1lLXNsaWRlciIsIm1lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyIiwibWVkaWEtdm9sdW1lLXNsaWRlcnRodW1iIiwibWVkaXVtIiwibWVudSIsIm1lbnVsaXN0IiwibWVudWxpc3QtYnV0dG9uIiwibWVudWxpc3QtdGV4dCIsIm1lbnVsaXN0LXRleHRmaWVsZCIsIm1lbnV0ZXh0IiwibWVzc2FnZS1ib3giLCJtaWRkbGUiLCJtaW4taW50cmluc2ljIiwibWl4IiwibW9uZ29saWFuIiwibW9ub3NwYWNlIiwibW92ZSIsIm11bHRpcGxlIiwibXVsdGlwbHkiLCJteWFubWFyIiwibi1yZXNpemUiLCJuYXJyb3dlciIsIm5lLXJlc2l6ZSIsIm5lc3ctcmVzaXplIiwibm8tY2xvc2UtcXVvdGUiLCJuby1kcm9wIiwibm8tb3Blbi1xdW90ZSIsIm5vLXJlcGVhdCIsIm5vbmUiLCJub3JtYWwiLCJub3QtYWxsb3dlZCIsIm5vd3JhcCIsIm5zLXJlc2l6ZSIsIm51bWJlcnMiLCJudW1lcmljIiwibnctcmVzaXplIiwibndzZS1yZXNpemUiLCJvYmxpcXVlIiwib2N0YWwiLCJvcGFjaXR5Iiwib3Blbi1xdW90ZSIsIm9wdGltaXplTGVnaWJpbGl0eSIsIm9wdGltaXplU3BlZWQiLCJvcml5YSIsIm9yb21vIiwib3V0c2V0Iiwib3V0c2lkZSIsIm91dHNpZGUtc2hhcGUiLCJvdmVybGF5Iiwib3ZlcmxpbmUiLCJwYWRkaW5nIiwicGFkZGluZy1ib3giLCJwYWludGVkIiwicGFnZSIsInBhdXNlZCIsInBlcnNpYW4iLCJwZXJzcGVjdGl2ZSIsInBsdXMtZGFya2VyIiwicGx1cy1saWdodGVyIiwicG9pbnRlciIsInBvbHlnb24iLCJwb3J0cmFpdCIsInByZSIsInByZS1saW5lIiwicHJlLXdyYXAiLCJwcmVzZXJ2ZS0zZCIsInByb2dyZXNzIiwicHVzaC1idXR0b24iLCJyYWRpYWwtZ3JhZGllbnQiLCJyYWRpbyIsInJlYWQtb25seSIsInJlYWQtd3JpdGUiLCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5IiwicmVjdGFuZ2xlIiwicmVnaW9uIiwicmVsYXRpdmUiLCJyZXBlYXQiLCJyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50IiwicmVwZWF0aW5nLXJhZGlhbC1ncmFkaWVudCIsInJlcGVhdC14IiwicmVwZWF0LXkiLCJyZXNldCIsInJldmVyc2UiLCJyZ2IiLCJyZ2JhIiwicmlkZ2UiLCJyaWdodCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwicm91bmQiLCJyb3ciLCJyb3ctcmVzaXplIiwicm93LXJldmVyc2UiLCJydGwiLCJydW4taW4iLCJydW5uaW5nIiwicy1yZXNpemUiLCJzYW5zLXNlcmlmIiwic2F0dXJhdGlvbiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNjcmVlbiIsInNjcm9sbCIsInNjcm9sbGJhciIsInNjcm9sbC1wb3NpdGlvbiIsInNlLXJlc2l6ZSIsInNlYXJjaGZpZWxkIiwic2VhcmNoZmllbGQtY2FuY2VsLWJ1dHRvbiIsInNlYXJjaGZpZWxkLWRlY29yYXRpb24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWJ1dHRvbiIsInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvbiIsInNlbGYtc3RhcnQiLCJzZWxmLWVuZCIsInNlbWktY29uZGVuc2VkIiwic2VtaS1leHBhbmRlZCIsInNlcGFyYXRlIiwic2VyaWYiLCJzaG93Iiwic2lkYW1hIiwic2ltcC1jaGluZXNlLWZvcm1hbCIsInNpbXAtY2hpbmVzZS1pbmZvcm1hbCIsInNpbmdsZSIsInNrZXciLCJza2V3WCIsInNrZXdZIiwic2tpcC13aGl0ZS1zcGFjZSIsInNsaWRlIiwic2xpZGVyLWhvcml6b250YWwiLCJzbGlkZXItdmVydGljYWwiLCJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsIiwic2xpZGVydGh1bWItdmVydGljYWwiLCJzbG93Iiwic21hbGwiLCJzbWFsbC1jYXBzIiwic21hbGwtY2FwdGlvbiIsInNtYWxsZXIiLCJzb2Z0LWxpZ2h0Iiwic29saWQiLCJzb21hbGkiLCJzb3VyY2UtYXRvcCIsInNvdXJjZS1pbiIsInNvdXJjZS1vdXQiLCJzb3VyY2Utb3ZlciIsInNwYWNlIiwic3BhY2UtYXJvdW5kIiwic3BhY2UtYmV0d2VlbiIsInNwYWNlLWV2ZW5seSIsInNwZWxsLW91dCIsInNxdWFyZSIsInNxdWFyZS1idXR0b24iLCJzdGFydCIsInN0YXRpYyIsInN0YXR1cy1iYXIiLCJzdHJldGNoIiwic3Ryb2tlIiwic3ViIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiLCJzdXBlciIsInN3LXJlc2l6ZSIsInN5bWJvbGljIiwic3ltYm9scyIsInN5c3RlbS11aSIsInRhYmxlIiwidGFibGUtY2FwdGlvbiIsInRhYmxlLWNlbGwiLCJ0YWJsZS1jb2x1bW4iLCJ0YWJsZS1jb2x1bW4tZ3JvdXAiLCJ0YWJsZS1mb290ZXItZ3JvdXAiLCJ0YWJsZS1oZWFkZXItZ3JvdXAiLCJ0YWJsZS1yb3ciLCJ0YWJsZS1yb3ctZ3JvdXAiLCJ0YW1pbCIsInRlbHVndSIsInRleHQiLCJ0ZXh0LWJvdHRvbSIsInRleHQtdG9wIiwidGV4dGFyZWEiLCJ0ZXh0ZmllbGQiLCJ0aGFpIiwidGhpY2siLCJ0aGluIiwidGhyZWVkZGFya3NoYWRvdyIsInRocmVlZGZhY2UiLCJ0aHJlZWRoaWdobGlnaHQiLCJ0aHJlZWRsaWdodHNoYWRvdyIsInRocmVlZHNoYWRvdyIsInRpYmV0YW4iLCJ0aWdyZSIsInRpZ3JpbnlhLWVyIiwidGlncmlueWEtZXItYWJlZ2VkZSIsInRpZ3JpbnlhLWV0IiwidGlncmlueWEtZXQtYWJlZ2VkZSIsInRvIiwidG9wIiwidHJhZC1jaGluZXNlLWZvcm1hbCIsInRyYWQtY2hpbmVzZS1pbmZvcm1hbCIsInRyYW5zZm9ybSIsInRyYW5zbGF0ZSIsInRyYW5zbGF0ZTNkIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIiwidHJhbnNwYXJlbnQiLCJ1bHRyYS1jb25kZW5zZWQiLCJ1bHRyYS1leHBhbmRlZCIsInVuZGVybGluZSIsInVuc2V0IiwidXAiLCJ1cHBlci1hbHBoYSIsInVwcGVyLWFybWVuaWFuIiwidXBwZXItZ3JlZWsiLCJ1cHBlci1oZXhhZGVjaW1hbCIsInVwcGVyLWxhdGluIiwidXBwZXItbm9yd2VnaWFuIiwidXBwZXItcm9tYW4iLCJ1cHBlcmNhc2UiLCJ1cmR1IiwidXJsIiwidmFyIiwidmVydGljYWwiLCJ2ZXJ0aWNhbC10ZXh0IiwidmlzaWJsZSIsInZpc2libGVGaWxsIiwidmlzaWJsZVBhaW50ZWQiLCJ2aXNpYmxlU3Ryb2tlIiwidmlzdWFsIiwidy1yZXNpemUiLCJ3YWl0Iiwid2F2ZSIsIndpZGVyIiwid2luZG93Iiwid2luZG93ZnJhbWUiLCJ3aW5kb3d0ZXh0Iiwid29yZHMiLCJ3cmFwIiwid3JhcC1yZXZlcnNlIiwieC1sYXJnZSIsIngtc21hbGwiLCJ4b3IiLCJ4eC1sYXJnZSIsInh4LXNtYWxsIl0sdmFsdWVLZXl3b3Jkcz1rZXlTZXQodmFsdWVLZXl3b3Jkc18pO3ZhciBhbGxXb3Jkcz1kb2N1bWVudFR5cGVzXy5jb25jYXQobWVkaWFUeXBlc18pLmNvbmNhdChtZWRpYUZlYXR1cmVzXykuY29uY2F0KG1lZGlhVmFsdWVLZXl3b3Jkc18pLmNvbmNhdChwcm9wZXJ0eUtleXdvcmRzXykuY29uY2F0KG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18pLmNvbmNhdChjb2xvcktleXdvcmRzXykuY29uY2F0KHZhbHVlS2V5d29yZHNfKTtDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCJjc3MiLGFsbFdvcmRzKTtmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSxzdGF0ZSl7dmFyIG1heWJlRW5kPWZhbHNlLGNoO3doaWxlKChjaD1zdHJlYW0ubmV4dCgpKSE9bnVsbCl7aWYobWF5YmVFbmQmJmNoPT0iLyIpe3N0YXRlLnRva2VuaXplPW51bGw7YnJlYWs7fQptYXliZUVuZD0oY2g9PSIqIik7fQpyZXR1cm5bImNvbW1lbnQiLCJjb21tZW50Il07fQpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvY3NzIix7ZG9jdW1lbnRUeXBlczpkb2N1bWVudFR5cGVzLG1lZGlhVHlwZXM6bWVkaWFUeXBlcyxtZWRpYUZlYXR1cmVzOm1lZGlhRmVhdHVyZXMsbWVkaWFWYWx1ZUtleXdvcmRzOm1lZGlhVmFsdWVLZXl3b3Jkcyxwcm9wZXJ0eUtleXdvcmRzOnByb3BlcnR5S2V5d29yZHMsbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOm5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcyxmb250UHJvcGVydGllczpmb250UHJvcGVydGllcyxjb3VudGVyRGVzY3JpcHRvcnM6Y291bnRlckRlc2NyaXB0b3JzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsdG9rZW5Ib29rczp7Ii8iOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0cmVhbS5lYXQoIioiKSlyZXR1cm4gZmFsc2U7c3RhdGUudG9rZW5pemU9dG9rZW5DQ29tbWVudDtyZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sc3RhdGUpO319LG5hbWU6ImNzcyJ9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zY3NzIix7bWVkaWFUeXBlczptZWRpYVR5cGVzLG1lZGlhRmVhdHVyZXM6bWVkaWFGZWF0dXJlcyxtZWRpYVZhbHVlS2V5d29yZHM6bWVkaWFWYWx1ZUtleXdvcmRzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsZm9udFByb3BlcnRpZXM6Zm9udFByb3BlcnRpZXMsYWxsb3dOZXN0ZWQ6dHJ1ZSxsaW5lQ29tbWVudDoiLy8iLHRva2VuSG9va3M6eyIvIjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpe2lmKHN0cmVhbS5lYXQoIi8iKSl7c3RyZWFtLnNraXBUb0VuZCgpO3JldHVyblsiY29tbWVudCIsImNvbW1lbnQiXTt9ZWxzZSBpZihzdHJlYW0uZWF0KCIqIikpe3N0YXRlLnRva2VuaXplPXRva2VuQ0NvbW1lbnQ7cmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLHN0YXRlKTt9ZWxzZXtyZXR1cm5bIm9wZXJhdG9yIiwib3BlcmF0b3IiXTt9fSwiOiI6ZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0ubWF0Y2goL1xzKlx7LyxmYWxzZSkpCnJldHVybltudWxsLG51bGxdCnJldHVybiBmYWxzZTt9LCIkIjpmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS5tYXRjaCgvXltcdy1dKy8pO2lmKHN0cmVhbS5tYXRjaCgvXlxzKjovLGZhbHNlKSkKcmV0dXJuWyJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiJdO3JldHVyblsidmFyaWFibGUtMiIsInZhcmlhYmxlIl07fSwiIyI6ZnVuY3Rpb24oc3RyZWFtKXtpZighc3RyZWFtLmVhdCgieyIpKXJldHVybiBmYWxzZTtyZXR1cm5bbnVsbCwiaW50ZXJwb2xhdGlvbiJdO319LG5hbWU6ImNzcyIsaGVscGVyVHlwZToic2NzcyJ9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1sZXNzIix7bWVkaWFUeXBlczptZWRpYVR5cGVzLG1lZGlhRmVhdHVyZXM6bWVkaWFGZWF0dXJlcyxtZWRpYVZhbHVlS2V5d29yZHM6bWVkaWFWYWx1ZUtleXdvcmRzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGNvbG9yS2V5d29yZHM6Y29sb3JLZXl3b3Jkcyx2YWx1ZUtleXdvcmRzOnZhbHVlS2V5d29yZHMsZm9udFByb3BlcnRpZXM6Zm9udFByb3BlcnRpZXMsYWxsb3dOZXN0ZWQ6dHJ1ZSxsaW5lQ29tbWVudDoiLy8iLHRva2VuSG9va3M6eyIvIjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpe2lmKHN0cmVhbS5lYXQoIi8iKSl7c3RyZWFtLnNraXBUb0VuZCgpO3JldHVyblsiY29tbWVudCIsImNvbW1lbnQiXTt9ZWxzZSBpZihzdHJlYW0uZWF0KCIqIikpe3N0YXRlLnRva2VuaXplPXRva2VuQ0NvbW1lbnQ7cmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLHN0YXRlKTt9ZWxzZXtyZXR1cm5bIm9wZXJhdG9yIiwib3BlcmF0b3IiXTt9fSwiQCI6ZnVuY3Rpb24oc3RyZWFtKXtpZihzdHJlYW0uZWF0KCJ7IikpcmV0dXJuW251bGwsImludGVycG9sYXRpb24iXTtpZihzdHJlYW0ubWF0Y2goL14oY2hhcnNldHxkb2N1bWVudHxmb250LWZhY2V8aW1wb3J0fCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXN8bWVkaWF8bmFtZXNwYWNlfHBhZ2V8c3VwcG9ydHMpXGIvLGZhbHNlKSlyZXR1cm4gZmFsc2U7c3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pO2lmKHN0cmVhbS5tYXRjaCgvXlxzKjovLGZhbHNlKSkKcmV0dXJuWyJ2YXJpYWJsZS0yIiwidmFyaWFibGUtZGVmaW5pdGlvbiJdO3JldHVyblsidmFyaWFibGUtMiIsInZhcmlhYmxlIl07fSwiJiI6ZnVuY3Rpb24oKXtyZXR1cm5bImF0b20iLCJhdG9tIl07fX0sbmFtZToiY3NzIixoZWxwZXJUeXBlOiJsZXNzIn0pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdzcyIse2RvY3VtZW50VHlwZXM6ZG9jdW1lbnRUeXBlcyxtZWRpYVR5cGVzOm1lZGlhVHlwZXMsbWVkaWFGZWF0dXJlczptZWRpYUZlYXR1cmVzLHByb3BlcnR5S2V5d29yZHM6cHJvcGVydHlLZXl3b3Jkcyxub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6bm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLGZvbnRQcm9wZXJ0aWVzOmZvbnRQcm9wZXJ0aWVzLGNvdW50ZXJEZXNjcmlwdG9yczpjb3VudGVyRGVzY3JpcHRvcnMsY29sb3JLZXl3b3Jkczpjb2xvcktleXdvcmRzLHZhbHVlS2V5d29yZHM6dmFsdWVLZXl3b3JkcyxzdXBwb3J0c0F0Q29tcG9uZW50OnRydWUsdG9rZW5Ib29rczp7Ii8iOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0cmVhbS5lYXQoIioiKSlyZXR1cm4gZmFsc2U7c3RhdGUudG9rZW5pemU9dG9rZW5DQ29tbWVudDtyZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sc3RhdGUpO319LG5hbWU6ImNzcyIsaGVscGVyVHlwZToiZ3NzIn0pO30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO0NvZGVNaXJyb3IuZGVmaW5lTW9kZSgiamF2YXNjcmlwdCIsZnVuY3Rpb24oY29uZmlnLHBhcnNlckNvbmZpZyl7dmFyIGluZGVudFVuaXQ9Y29uZmlnLmluZGVudFVuaXQ7dmFyIHN0YXRlbWVudEluZGVudD1wYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50O3ZhciBqc29ubGRNb2RlPXBhcnNlckNvbmZpZy5qc29ubGQ7dmFyIGpzb25Nb2RlPXBhcnNlckNvbmZpZy5qc29ufHxqc29ubGRNb2RlO3ZhciBpc1RTPXBhcnNlckNvbmZpZy50eXBlc2NyaXB0O3ZhciB3b3JkUkU9cGFyc2VyQ29uZmlnLndvcmRDaGFyYWN0ZXJzfHwvW1x3JFx4YTEtXHVmZmZmXS87dmFyIGtleXdvcmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24ga3codHlwZSl7cmV0dXJue3R5cGU6dHlwZSxzdHlsZToia2V5d29yZCJ9O30KdmFyIEE9a3coImtleXdvcmQgYSIpLEI9a3coImtleXdvcmQgYiIpLEM9a3coImtleXdvcmQgYyIpLEQ9a3coImtleXdvcmQgZCIpO3ZhciBvcGVyYXRvcj1rdygib3BlcmF0b3IiKSxhdG9tPXt0eXBlOiJhdG9tIixzdHlsZToiYXRvbSJ9O3ZhciBqc0tleXdvcmRzPXsiaWYiOmt3KCJpZiIpLCJ3aGlsZSI6QSwid2l0aCI6QSwiZWxzZSI6QiwiZG8iOkIsInRyeSI6QiwiZmluYWxseSI6QiwicmV0dXJuIjpELCJicmVhayI6RCwiY29udGludWUiOkQsIm5ldyI6a3coIm5ldyIpLCJkZWxldGUiOkMsInZvaWQiOkMsInRocm93IjpDLCJkZWJ1Z2dlciI6a3coImRlYnVnZ2VyIiksInZhciI6a3coInZhciIpLCJjb25zdCI6a3coInZhciIpLCJsZXQiOmt3KCJ2YXIiKSwiZnVuY3Rpb24iOmt3KCJmdW5jdGlvbiIpLCJjYXRjaCI6a3coImNhdGNoIiksImZvciI6a3coImZvciIpLCJzd2l0Y2giOmt3KCJzd2l0Y2giKSwiY2FzZSI6a3coImNhc2UiKSwiZGVmYXVsdCI6a3coImRlZmF1bHQiKSwiaW4iOm9wZXJhdG9yLCJ0eXBlb2YiOm9wZXJhdG9yLCJpbnN0YW5jZW9mIjpvcGVyYXRvciwidHJ1ZSI6YXRvbSwiZmFsc2UiOmF0b20sIm51bGwiOmF0b20sInVuZGVmaW5lZCI6YXRvbSwiTmFOIjphdG9tLCJJbmZpbml0eSI6YXRvbSwidGhpcyI6a3coInRoaXMiKSwiY2xhc3MiOmt3KCJjbGFzcyIpLCJzdXBlciI6a3coImF0b20iKSwieWllbGQiOkMsImV4cG9ydCI6a3coImV4cG9ydCIpLCJpbXBvcnQiOmt3KCJpbXBvcnQiKSwiZXh0ZW5kcyI6QywiYXdhaXQiOkN9O2lmKGlzVFMpe3ZhciB0eXBlPXt0eXBlOiJ2YXJpYWJsZSIsc3R5bGU6InR5cGUifTt2YXIgdHNLZXl3b3Jkcz17ImludGVyZmFjZSI6a3coImNsYXNzIiksImltcGxlbWVudHMiOkMsIm5hbWVzcGFjZSI6QywicHVibGljIjprdygibW9kaWZpZXIiKSwicHJpdmF0ZSI6a3coIm1vZGlmaWVyIiksInByb3RlY3RlZCI6a3coIm1vZGlmaWVyIiksImFic3RyYWN0IjprdygibW9kaWZpZXIiKSwicmVhZG9ubHkiOmt3KCJtb2RpZmllciIpLCJzdHJpbmciOnR5cGUsIm51bWJlciI6dHlwZSwiYm9vbGVhbiI6dHlwZSwiYW55Ijp0eXBlfTtmb3IodmFyIGF0dHIgaW4gdHNLZXl3b3Jkcyl7anNLZXl3b3Jkc1thdHRyXT10c0tleXdvcmRzW2F0dHJdO319CnJldHVybiBqc0tleXdvcmRzO30oKTt2YXIgaXNPcGVyYXRvckNoYXI9L1srXC0qJiU9PD4hP3x+XkBdLzt2YXIgaXNKc29ubGRLZXl3b3JkPS9eQChjb250ZXh0fGlkfHZhbHVlfGxhbmd1YWdlfHR5cGV8Y29udGFpbmVyfGxpc3R8c2V0fHJldmVyc2V8aW5kZXh8YmFzZXx2b2NhYnxncmFwaCkiLztmdW5jdGlvbiByZWFkUmVnZXhwKHN0cmVhbSl7dmFyIGVzY2FwZWQ9ZmFsc2UsbmV4dCxpblNldD1mYWxzZTt3aGlsZSgobmV4dD1zdHJlYW0ubmV4dCgpKSE9bnVsbCl7aWYoIWVzY2FwZWQpe2lmKG5leHQ9PSIvIiYmIWluU2V0KXJldHVybjtpZihuZXh0PT0iWyIpaW5TZXQ9dHJ1ZTtlbHNlIGlmKGluU2V0JiZuZXh0PT0iXSIpaW5TZXQ9ZmFsc2U7fQplc2NhcGVkPSFlc2NhcGVkJiZuZXh0PT0iXFwiO319CnZhciB0eXBlLGNvbnRlbnQ7ZnVuY3Rpb24gcmV0KHRwLHN0eWxlLGNvbnQpe3R5cGU9dHA7Y29udGVudD1jb250O3JldHVybiBzdHlsZTt9CmZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sc3RhdGUpe3ZhciBjaD1zdHJlYW0ubmV4dCgpO2lmKGNoPT0nIid8fGNoPT0iJyIpe3N0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKGNoKTtyZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTt9ZWxzZSBpZihjaD09Ii4iJiZzdHJlYW0ubWF0Y2goL15cZCsoPzpbZUVdWytcLV0/XGQrKT8vKSl7cmV0dXJuIHJldCgibnVtYmVyIiwibnVtYmVyIik7fWVsc2UgaWYoY2g9PSIuIiYmc3RyZWFtLm1hdGNoKCIuLiIpKXtyZXR1cm4gcmV0KCJzcHJlYWQiLCJtZXRhIik7fWVsc2UgaWYoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpe3JldHVybiByZXQoY2gpO31lbHNlIGlmKGNoPT0iPSImJnN0cmVhbS5lYXQoIj4iKSl7cmV0dXJuIHJldCgiPT4iLCJvcGVyYXRvciIpO31lbHNlIGlmKGNoPT0iMCImJnN0cmVhbS5lYXQoL3gvaSkpe3N0cmVhbS5lYXRXaGlsZSgvW1xkYS1mXS9pKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJudW1iZXIiKTt9ZWxzZSBpZihjaD09IjAiJiZzdHJlYW0uZWF0KC9vL2kpKXtzdHJlYW0uZWF0V2hpbGUoL1swLTddL2kpO3JldHVybiByZXQoIm51bWJlciIsIm51bWJlciIpO31lbHNlIGlmKGNoPT0iMCImJnN0cmVhbS5lYXQoL2IvaSkpe3N0cmVhbS5lYXRXaGlsZSgvWzAxXS9pKTtyZXR1cm4gcmV0KCJudW1iZXIiLCJudW1iZXIiKTt9ZWxzZSBpZigvXGQvLnRlc3QoY2gpKXtzdHJlYW0ubWF0Y2goL15cZCooPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/Lyk7cmV0dXJuIHJldCgibnVtYmVyIiwibnVtYmVyIik7fWVsc2UgaWYoY2g9PSIvIil7aWYoc3RyZWFtLmVhdCgiKiIpKXtzdGF0ZS50b2tlbml6ZT10b2tlbkNvbW1lbnQ7cmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sc3RhdGUpO31lbHNlIGlmKHN0cmVhbS5lYXQoIi8iKSl7c3RyZWFtLnNraXBUb0VuZCgpO3JldHVybiByZXQoImNvbW1lbnQiLCJjb21tZW50Iik7fWVsc2UgaWYoZXhwcmVzc2lvbkFsbG93ZWQoc3RyZWFtLHN0YXRlLDEpKXtyZWFkUmVnZXhwKHN0cmVhbSk7c3RyZWFtLm1hdGNoKC9eXGIoKFtnaW15dV0pKD8hW2dpbXl1XSpcMikpK1xiLyk7cmV0dXJuIHJldCgicmVnZXhwIiwic3RyaW5nLTIiKTt9ZWxzZXtzdHJlYW0uZWF0KCI9Iik7cmV0dXJuIHJldCgib3BlcmF0b3IiLCJvcGVyYXRvciIsc3RyZWFtLmN1cnJlbnQoKSk7fX1lbHNlIGlmKGNoPT0iYCIpe3N0YXRlLnRva2VuaXplPXRva2VuUXVhc2k7cmV0dXJuIHRva2VuUXVhc2koc3RyZWFtLHN0YXRlKTt9ZWxzZSBpZihjaD09IiMiKXtzdHJlYW0uc2tpcFRvRW5kKCk7cmV0dXJuIHJldCgiZXJyb3IiLCJlcnJvciIpO31lbHNlIGlmKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKXtpZihjaCE9Ij4ifHwhc3RhdGUubGV4aWNhbHx8c3RhdGUubGV4aWNhbC50eXBlIT0iPiIpe2lmKHN0cmVhbS5lYXQoIj0iKSl7aWYoY2g9PSIhInx8Y2g9PSI9IilzdHJlYW0uZWF0KCI9Iil9ZWxzZSBpZigvWzw+KitcLV0vLnRlc3QoY2gpKXtzdHJlYW0uZWF0KGNoKQppZihjaD09Ij4iKXN0cmVhbS5lYXQoY2gpfX0KcmV0dXJuIHJldCgib3BlcmF0b3IiLCJvcGVyYXRvciIsc3RyZWFtLmN1cnJlbnQoKSk7fWVsc2UgaWYod29yZFJFLnRlc3QoY2gpKXtzdHJlYW0uZWF0V2hpbGUod29yZFJFKTt2YXIgd29yZD1zdHJlYW0uY3VycmVudCgpCmlmKHN0YXRlLmxhc3RUeXBlIT0iLiIpe2lmKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKXt2YXIga3c9a2V5d29yZHNbd29yZF0KcmV0dXJuIHJldChrdy50eXBlLGt3LnN0eWxlLHdvcmQpfQppZih3b3JkPT0iYXN5bmMiJiZzdHJlYW0ubWF0Y2goL14oXHN8XC9cKi4qP1wqXC8pKltcKFx3XS8sZmFsc2UpKQpyZXR1cm4gcmV0KCJhc3luYyIsImtleXdvcmQiLHdvcmQpfQpyZXR1cm4gcmV0KCJ2YXJpYWJsZSIsInZhcmlhYmxlIix3b3JkKX19CmZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKXtyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXt2YXIgZXNjYXBlZD1mYWxzZSxuZXh0O2lmKGpzb25sZE1vZGUmJnN0cmVhbS5wZWVrKCk9PSJAIiYmc3RyZWFtLm1hdGNoKGlzSnNvbmxkS2V5d29yZCkpe3N0YXRlLnRva2VuaXplPXRva2VuQmFzZTtyZXR1cm4gcmV0KCJqc29ubGQta2V5d29yZCIsIm1ldGEiKTt9CndoaWxlKChuZXh0PXN0cmVhbS5uZXh0KCkpIT1udWxsKXtpZihuZXh0PT1xdW90ZSYmIWVzY2FwZWQpYnJlYWs7ZXNjYXBlZD0hZXNjYXBlZCYmbmV4dD09IlxcIjt9CmlmKCFlc2NhcGVkKXN0YXRlLnRva2VuaXplPXRva2VuQmFzZTtyZXR1cm4gcmV0KCJzdHJpbmciLCJzdHJpbmciKTt9O30KZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSxzdGF0ZSl7dmFyIG1heWJlRW5kPWZhbHNlLGNoO3doaWxlKGNoPXN0cmVhbS5uZXh0KCkpe2lmKGNoPT0iLyImJm1heWJlRW5kKXtzdGF0ZS50b2tlbml6ZT10b2tlbkJhc2U7YnJlYWs7fQptYXliZUVuZD0oY2g9PSIqIik7fQpyZXR1cm4gcmV0KCJjb21tZW50IiwiY29tbWVudCIpO30KZnVuY3Rpb24gdG9rZW5RdWFzaShzdHJlYW0sc3RhdGUpe3ZhciBlc2NhcGVkPWZhbHNlLG5leHQ7d2hpbGUoKG5leHQ9c3RyZWFtLm5leHQoKSkhPW51bGwpe2lmKCFlc2NhcGVkJiYobmV4dD09ImAifHxuZXh0PT0iJCImJnN0cmVhbS5lYXQoInsiKSkpe3N0YXRlLnRva2VuaXplPXRva2VuQmFzZTticmVhazt9CmVzY2FwZWQ9IWVzY2FwZWQmJm5leHQ9PSJcXCI7fQpyZXR1cm4gcmV0KCJxdWFzaSIsInN0cmluZy0yIixzdHJlYW0uY3VycmVudCgpKTt9CnZhciBicmFja2V0cz0iKFt7fV0pIjtmdW5jdGlvbiBmaW5kRmF0QXJyb3coc3RyZWFtLHN0YXRlKXtpZihzdGF0ZS5mYXRBcnJvd0F0KXN0YXRlLmZhdEFycm93QXQ9bnVsbDt2YXIgYXJyb3c9c3RyZWFtLnN0cmluZy5pbmRleE9mKCI9PiIsc3RyZWFtLnN0YXJ0KTtpZihhcnJvdzwwKXJldHVybjtpZihpc1RTKXt2YXIgbT0vOlxzKig/Olx3Kyg/OjxbXj5dKj58XFtcXSk/fFx7W159XSpcfSlccyokLy5leGVjKHN0cmVhbS5zdHJpbmcuc2xpY2Uoc3RyZWFtLnN0YXJ0LGFycm93KSkKaWYobSlhcnJvdz1tLmluZGV4fQp2YXIgZGVwdGg9MCxzYXdTb21ldGhpbmc9ZmFsc2U7Zm9yKHZhciBwb3M9YXJyb3ctMTtwb3M+PTA7LS1wb3Mpe3ZhciBjaD1zdHJlYW0uc3RyaW5nLmNoYXJBdChwb3MpO3ZhciBicmFja2V0PWJyYWNrZXRzLmluZGV4T2YoY2gpO2lmKGJyYWNrZXQ+PTAmJmJyYWNrZXQ8Myl7aWYoIWRlcHRoKXsrK3BvczticmVhazt9CmlmKC0tZGVwdGg9PTApe2lmKGNoPT0iKCIpc2F3U29tZXRoaW5nPXRydWU7YnJlYWs7fX1lbHNlIGlmKGJyYWNrZXQ+PTMmJmJyYWNrZXQ8Nil7KytkZXB0aDt9ZWxzZSBpZih3b3JkUkUudGVzdChjaCkpe3Nhd1NvbWV0aGluZz10cnVlO31lbHNlIGlmKC9bIidcL10vLnRlc3QoY2gpKXtyZXR1cm47fWVsc2UgaWYoc2F3U29tZXRoaW5nJiYhZGVwdGgpeysrcG9zO2JyZWFrO319CmlmKHNhd1NvbWV0aGluZyYmIWRlcHRoKXN0YXRlLmZhdEFycm93QXQ9cG9zO30KdmFyIGF0b21pY1R5cGVzPXsiYXRvbSI6dHJ1ZSwibnVtYmVyIjp0cnVlLCJ2YXJpYWJsZSI6dHJ1ZSwic3RyaW5nIjp0cnVlLCJyZWdleHAiOnRydWUsInRoaXMiOnRydWUsImpzb25sZC1rZXl3b3JkIjp0cnVlfTtmdW5jdGlvbiBKU0xleGljYWwoaW5kZW50ZWQsY29sdW1uLHR5cGUsYWxpZ24scHJldixpbmZvKXt0aGlzLmluZGVudGVkPWluZGVudGVkO3RoaXMuY29sdW1uPWNvbHVtbjt0aGlzLnR5cGU9dHlwZTt0aGlzLnByZXY9cHJldjt0aGlzLmluZm89aW5mbztpZihhbGlnbiE9bnVsbCl0aGlzLmFsaWduPWFsaWduO30KZnVuY3Rpb24gaW5TY29wZShzdGF0ZSx2YXJuYW1lKXtmb3IodmFyIHY9c3RhdGUubG9jYWxWYXJzO3Y7dj12Lm5leHQpCmlmKHYubmFtZT09dmFybmFtZSlyZXR1cm4gdHJ1ZTtmb3IodmFyIGN4PXN0YXRlLmNvbnRleHQ7Y3g7Y3g9Y3gucHJldil7Zm9yKHZhciB2PWN4LnZhcnM7djt2PXYubmV4dCkKaWYodi5uYW1lPT12YXJuYW1lKXJldHVybiB0cnVlO319CmZ1bmN0aW9uIHBhcnNlSlMoc3RhdGUsc3R5bGUsdHlwZSxjb250ZW50LHN0cmVhbSl7dmFyIGNjPXN0YXRlLmNjO2N4LnN0YXRlPXN0YXRlO2N4LnN0cmVhbT1zdHJlYW07Y3gubWFya2VkPW51bGwsY3guY2M9Y2M7Y3guc3R5bGU9c3R5bGU7aWYoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCnN0YXRlLmxleGljYWwuYWxpZ249dHJ1ZTt3aGlsZSh0cnVlKXt2YXIgY29tYmluYXRvcj1jYy5sZW5ndGg/Y2MucG9wKCk6anNvbk1vZGU/ZXhwcmVzc2lvbjpzdGF0ZW1lbnQ7aWYoY29tYmluYXRvcih0eXBlLGNvbnRlbnQpKXt3aGlsZShjYy5sZW5ndGgmJmNjW2NjLmxlbmd0aC0xXS5sZXgpCmNjLnBvcCgpKCk7aWYoY3gubWFya2VkKXJldHVybiBjeC5tYXJrZWQ7aWYodHlwZT09InZhcmlhYmxlIiYmaW5TY29wZShzdGF0ZSxjb250ZW50KSlyZXR1cm4idmFyaWFibGUtMiI7cmV0dXJuIHN0eWxlO319fQp2YXIgY3g9e3N0YXRlOm51bGwsY29sdW1uOm51bGwsbWFya2VkOm51bGwsY2M6bnVsbH07ZnVuY3Rpb24gcGFzcygpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49MDtpLS0pY3guY2MucHVzaChhcmd1bWVudHNbaV0pO30KZnVuY3Rpb24gY29udCgpe3Bhc3MuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiB0cnVlO30KZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSl7ZnVuY3Rpb24gaW5MaXN0KGxpc3Qpe2Zvcih2YXIgdj1saXN0O3Y7dj12Lm5leHQpCmlmKHYubmFtZT09dmFybmFtZSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2U7fQp2YXIgc3RhdGU9Y3guc3RhdGU7Y3gubWFya2VkPSJkZWYiO2lmKHN0YXRlLmNvbnRleHQpe2lmKGluTGlzdChzdGF0ZS5sb2NhbFZhcnMpKXJldHVybjtzdGF0ZS5sb2NhbFZhcnM9e25hbWU6dmFybmFtZSxuZXh0OnN0YXRlLmxvY2FsVmFyc307fWVsc2V7aWYoaW5MaXN0KHN0YXRlLmdsb2JhbFZhcnMpKXJldHVybjtpZihwYXJzZXJDb25maWcuZ2xvYmFsVmFycykKc3RhdGUuZ2xvYmFsVmFycz17bmFtZTp2YXJuYW1lLG5leHQ6c3RhdGUuZ2xvYmFsVmFyc307fX0KdmFyIGRlZmF1bHRWYXJzPXtuYW1lOiJ0aGlzIixuZXh0OntuYW1lOiJhcmd1bWVudHMifX07ZnVuY3Rpb24gcHVzaGNvbnRleHQoKXtjeC5zdGF0ZS5jb250ZXh0PXtwcmV2OmN4LnN0YXRlLmNvbnRleHQsdmFyczpjeC5zdGF0ZS5sb2NhbFZhcnN9O2N4LnN0YXRlLmxvY2FsVmFycz1kZWZhdWx0VmFyczt9CmZ1bmN0aW9uIHBvcGNvbnRleHQoKXtjeC5zdGF0ZS5sb2NhbFZhcnM9Y3guc3RhdGUuY29udGV4dC52YXJzO2N4LnN0YXRlLmNvbnRleHQ9Y3guc3RhdGUuY29udGV4dC5wcmV2O30KZnVuY3Rpb24gcHVzaGxleCh0eXBlLGluZm8pe3ZhciByZXN1bHQ9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9Y3guc3RhdGUsaW5kZW50PXN0YXRlLmluZGVudGVkO2lmKHN0YXRlLmxleGljYWwudHlwZT09InN0YXQiKWluZGVudD1zdGF0ZS5sZXhpY2FsLmluZGVudGVkO2Vsc2UgZm9yKHZhciBvdXRlcj1zdGF0ZS5sZXhpY2FsO291dGVyJiZvdXRlci50eXBlPT0iKSImJm91dGVyLmFsaWduO291dGVyPW91dGVyLnByZXYpCmluZGVudD1vdXRlci5pbmRlbnRlZDtzdGF0ZS5sZXhpY2FsPW5ldyBKU0xleGljYWwoaW5kZW50LGN4LnN0cmVhbS5jb2x1bW4oKSx0eXBlLG51bGwsc3RhdGUubGV4aWNhbCxpbmZvKTt9O3Jlc3VsdC5sZXg9dHJ1ZTtyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gcG9wbGV4KCl7dmFyIHN0YXRlPWN4LnN0YXRlO2lmKHN0YXRlLmxleGljYWwucHJldil7aWYoc3RhdGUubGV4aWNhbC50eXBlPT0iKSIpCnN0YXRlLmluZGVudGVkPXN0YXRlLmxleGljYWwuaW5kZW50ZWQ7c3RhdGUubGV4aWNhbD1zdGF0ZS5sZXhpY2FsLnByZXY7fX0KcG9wbGV4LmxleD10cnVlO2Z1bmN0aW9uIGV4cGVjdCh3YW50ZWQpe2Z1bmN0aW9uIGV4cCh0eXBlKXtpZih0eXBlPT13YW50ZWQpcmV0dXJuIGNvbnQoKTtlbHNlIGlmKHdhbnRlZD09IjsiKXJldHVybiBwYXNzKCk7ZWxzZSByZXR1cm4gY29udChleHApO307cmV0dXJuIGV4cDt9CmZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlLHZhbHVlKXtpZih0eXBlPT0idmFyIilyZXR1cm4gY29udChwdXNobGV4KCJ2YXJkZWYiLHZhbHVlLmxlbmd0aCksdmFyZGVmLGV4cGVjdCgiOyIpLHBvcGxleCk7aWYodHlwZT09ImtleXdvcmQgYSIpcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLHBhcmVuRXhwcixzdGF0ZW1lbnQscG9wbGV4KTtpZih0eXBlPT0ia2V5d29yZCBiIilyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksc3RhdGVtZW50LHBvcGxleCk7aWYodHlwZT09ImtleXdvcmQgZCIpcmV0dXJuIGN4LnN0cmVhbS5tYXRjaCgvXlxzKiQvLGZhbHNlKT9jb250KCk6Y29udChwdXNobGV4KCJzdGF0IiksbWF5YmVleHByZXNzaW9uLGV4cGVjdCgiOyIpLHBvcGxleCk7aWYodHlwZT09ImRlYnVnZ2VyIilyZXR1cm4gY29udChleHBlY3QoIjsiKSk7aWYodHlwZT09InsiKXJldHVybiBjb250KHB1c2hsZXgoIn0iKSxibG9jayxwb3BsZXgpO2lmKHR5cGU9PSI7IilyZXR1cm4gY29udCgpO2lmKHR5cGU9PSJpZiIpe2lmKGN4LnN0YXRlLmxleGljYWwuaW5mbz09ImVsc2UiJiZjeC5zdGF0ZS5jY1tjeC5zdGF0ZS5jYy5sZW5ndGgtMV09PXBvcGxleCkKY3guc3RhdGUuY2MucG9wKCkoKTtyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIikscGFyZW5FeHByLHN0YXRlbWVudCxwb3BsZXgsbWF5YmVlbHNlKTt9CmlmKHR5cGU9PSJmdW5jdGlvbiIpcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO2lmKHR5cGU9PSJmb3IiKXJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSxmb3JzcGVjLHN0YXRlbWVudCxwb3BsZXgpO2lmKHR5cGU9PSJ2YXJpYWJsZSIpe2lmKGlzVFMmJnZhbHVlPT0idHlwZSIpe2N4Lm1hcmtlZD0ia2V5d29yZCIKcmV0dXJuIGNvbnQodHlwZWV4cHIsZXhwZWN0KCJvcGVyYXRvciIpLHR5cGVleHByLGV4cGVjdCgiOyIpKTt9ZWxzZSBpZihpc1RTJiZ2YWx1ZT09ImRlY2xhcmUiKXtjeC5tYXJrZWQ9ImtleXdvcmQiCnJldHVybiBjb250KHN0YXRlbWVudCl9ZWxzZSBpZihpc1RTJiYodmFsdWU9PSJtb2R1bGUifHx2YWx1ZT09ImVudW0iKSYmY3guc3RyZWFtLm1hdGNoKC9eXHMqXHcvLGZhbHNlKSl7Y3gubWFya2VkPSJrZXl3b3JkIgpyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIikscGF0dGVybixleHBlY3QoInsiKSxwdXNobGV4KCJ9IiksYmxvY2sscG9wbGV4LHBvcGxleCl9ZWxzZXtyZXR1cm4gY29udChwdXNobGV4KCJzdGF0IiksbWF5YmVsYWJlbCk7fX0KaWYodHlwZT09InN3aXRjaCIpcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLHBhcmVuRXhwcixleHBlY3QoInsiKSxwdXNobGV4KCJ9Iiwic3dpdGNoIiksYmxvY2sscG9wbGV4LHBvcGxleCk7aWYodHlwZT09ImNhc2UiKXJldHVybiBjb250KGV4cHJlc3Npb24sZXhwZWN0KCI6IikpO2lmKHR5cGU9PSJkZWZhdWx0IilyZXR1cm4gY29udChleHBlY3QoIjoiKSk7aWYodHlwZT09ImNhdGNoIilyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIikscHVzaGNvbnRleHQsZXhwZWN0KCIoIiksZnVuYXJnLGV4cGVjdCgiKSIpLHN0YXRlbWVudCxwb3BsZXgscG9wY29udGV4dCk7aWYodHlwZT09ImNsYXNzIilyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksY2xhc3NOYW1lLHBvcGxleCk7aWYodHlwZT09ImV4cG9ydCIpcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLGFmdGVyRXhwb3J0LHBvcGxleCk7aWYodHlwZT09ImltcG9ydCIpcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLGFmdGVySW1wb3J0LHBvcGxleCk7aWYodHlwZT09ImFzeW5jIilyZXR1cm4gY29udChzdGF0ZW1lbnQpCmlmKHZhbHVlPT0iQCIpcmV0dXJuIGNvbnQoZXhwcmVzc2lvbixzdGF0ZW1lbnQpCnJldHVybiBwYXNzKHB1c2hsZXgoInN0YXQiKSxleHByZXNzaW9uLGV4cGVjdCgiOyIpLHBvcGxleCk7fQpmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpe3JldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSxmYWxzZSk7fQpmdW5jdGlvbiBleHByZXNzaW9uTm9Db21tYSh0eXBlKXtyZXR1cm4gZXhwcmVzc2lvbklubmVyKHR5cGUsdHJ1ZSk7fQpmdW5jdGlvbiBwYXJlbkV4cHIodHlwZSl7aWYodHlwZSE9IigiKXJldHVybiBwYXNzKCkKcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLGV4cHJlc3Npb24sZXhwZWN0KCIpIikscG9wbGV4KX0KZnVuY3Rpb24gZXhwcmVzc2lvbklubmVyKHR5cGUsbm9Db21tYSl7aWYoY3guc3RhdGUuZmF0QXJyb3dBdD09Y3guc3RyZWFtLnN0YXJ0KXt2YXIgYm9keT1ub0NvbW1hP2Fycm93Qm9keU5vQ29tbWE6YXJyb3dCb2R5O2lmKHR5cGU9PSIoIilyZXR1cm4gY29udChwdXNoY29udGV4dCxwdXNobGV4KCIpIiksY29tbWFzZXAoZnVuYXJnLCIpIikscG9wbGV4LGV4cGVjdCgiPT4iKSxib2R5LHBvcGNvbnRleHQpO2Vsc2UgaWYodHlwZT09InZhcmlhYmxlIilyZXR1cm4gcGFzcyhwdXNoY29udGV4dCxwYXR0ZXJuLGV4cGVjdCgiPT4iKSxib2R5LHBvcGNvbnRleHQpO30KdmFyIG1heWJlb3A9bm9Db21tYT9tYXliZW9wZXJhdG9yTm9Db21tYTptYXliZW9wZXJhdG9yQ29tbWE7aWYoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpcmV0dXJuIGNvbnQobWF5YmVvcCk7aWYodHlwZT09ImZ1bmN0aW9uIilyZXR1cm4gY29udChmdW5jdGlvbmRlZixtYXliZW9wKTtpZih0eXBlPT0iY2xhc3MiKXJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSxjbGFzc0V4cHJlc3Npb24scG9wbGV4KTtpZih0eXBlPT0ia2V5d29yZCBjInx8dHlwZT09ImFzeW5jIilyZXR1cm4gY29udChub0NvbW1hP2V4cHJlc3Npb25Ob0NvbW1hOmV4cHJlc3Npb24pO2lmKHR5cGU9PSIoIilyZXR1cm4gY29udChwdXNobGV4KCIpIiksbWF5YmVleHByZXNzaW9uLGV4cGVjdCgiKSIpLHBvcGxleCxtYXliZW9wKTtpZih0eXBlPT0ib3BlcmF0b3IifHx0eXBlPT0ic3ByZWFkIilyZXR1cm4gY29udChub0NvbW1hP2V4cHJlc3Npb25Ob0NvbW1hOmV4cHJlc3Npb24pO2lmKHR5cGU9PSJbIilyZXR1cm4gY29udChwdXNobGV4KCJdIiksYXJyYXlMaXRlcmFsLHBvcGxleCxtYXliZW9wKTtpZih0eXBlPT0ieyIpcmV0dXJuIGNvbnRDb21tYXNlcChvYmpwcm9wLCJ9IixudWxsLG1heWJlb3ApO2lmKHR5cGU9PSJxdWFzaSIpcmV0dXJuIHBhc3MocXVhc2ksbWF5YmVvcCk7aWYodHlwZT09Im5ldyIpcmV0dXJuIGNvbnQobWF5YmVUYXJnZXQobm9Db21tYSkpO3JldHVybiBjb250KCk7fQpmdW5jdGlvbiBtYXliZWV4cHJlc3Npb24odHlwZSl7aWYodHlwZS5tYXRjaCgvWztcfVwpXF0sXS8pKXJldHVybiBwYXNzKCk7cmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7fQpmdW5jdGlvbiBtYXliZW9wZXJhdG9yQ29tbWEodHlwZSx2YWx1ZSl7aWYodHlwZT09IiwiKXJldHVybiBjb250KGV4cHJlc3Npb24pO3JldHVybiBtYXliZW9wZXJhdG9yTm9Db21tYSh0eXBlLHZhbHVlLGZhbHNlKTt9CmZ1bmN0aW9uIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsdmFsdWUsbm9Db21tYSl7dmFyIG1lPW5vQ29tbWE9PWZhbHNlP21heWJlb3BlcmF0b3JDb21tYTptYXliZW9wZXJhdG9yTm9Db21tYTt2YXIgZXhwcj1ub0NvbW1hPT1mYWxzZT9leHByZXNzaW9uOmV4cHJlc3Npb25Ob0NvbW1hO2lmKHR5cGU9PSI9PiIpcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsbm9Db21tYT9hcnJvd0JvZHlOb0NvbW1hOmFycm93Qm9keSxwb3Bjb250ZXh0KTtpZih0eXBlPT0ib3BlcmF0b3IiKXtpZigvXCtcK3wtLS8udGVzdCh2YWx1ZSl8fGlzVFMmJnZhbHVlPT0iISIpcmV0dXJuIGNvbnQobWUpO2lmKHZhbHVlPT0iPyIpcmV0dXJuIGNvbnQoZXhwcmVzc2lvbixleHBlY3QoIjoiKSxleHByKTtyZXR1cm4gY29udChleHByKTt9CmlmKHR5cGU9PSJxdWFzaSIpe3JldHVybiBwYXNzKHF1YXNpLG1lKTt9CmlmKHR5cGU9PSI7IilyZXR1cm47aWYodHlwZT09IigiKXJldHVybiBjb250Q29tbWFzZXAoZXhwcmVzc2lvbk5vQ29tbWEsIikiLCJjYWxsIixtZSk7aWYodHlwZT09Ii4iKXJldHVybiBjb250KHByb3BlcnR5LG1lKTtpZih0eXBlPT0iWyIpcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLG1heWJlZXhwcmVzc2lvbixleHBlY3QoIl0iKSxwb3BsZXgsbWUpO2lmKGlzVFMmJnZhbHVlPT0iYXMiKXtjeC5tYXJrZWQ9ImtleXdvcmQiO3JldHVybiBjb250KHR5cGVleHByLG1lKX0KaWYodHlwZT09InJlZ2V4cCIpe2N4LnN0YXRlLmxhc3RUeXBlPWN4Lm1hcmtlZD0ib3BlcmF0b3IiCmN4LnN0cmVhbS5iYWNrVXAoY3guc3RyZWFtLnBvcy1jeC5zdHJlYW0uc3RhcnQtMSkKcmV0dXJuIGNvbnQoZXhwcil9fQpmdW5jdGlvbiBxdWFzaSh0eXBlLHZhbHVlKXtpZih0eXBlIT0icXVhc2kiKXJldHVybiBwYXNzKCk7aWYodmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoLTIpIT0iJHsiKXJldHVybiBjb250KHF1YXNpKTtyZXR1cm4gY29udChleHByZXNzaW9uLGNvbnRpbnVlUXVhc2kpO30KZnVuY3Rpb24gY29udGludWVRdWFzaSh0eXBlKXtpZih0eXBlPT0ifSIpe2N4Lm1hcmtlZD0ic3RyaW5nLTIiO2N4LnN0YXRlLnRva2VuaXplPXRva2VuUXVhc2k7cmV0dXJuIGNvbnQocXVhc2kpO319CmZ1bmN0aW9uIGFycm93Qm9keSh0eXBlKXtmaW5kRmF0QXJyb3coY3guc3RyZWFtLGN4LnN0YXRlKTtyZXR1cm4gcGFzcyh0eXBlPT0ieyI/c3RhdGVtZW50OmV4cHJlc3Npb24pO30KZnVuY3Rpb24gYXJyb3dCb2R5Tm9Db21tYSh0eXBlKXtmaW5kRmF0QXJyb3coY3guc3RyZWFtLGN4LnN0YXRlKTtyZXR1cm4gcGFzcyh0eXBlPT0ieyI/c3RhdGVtZW50OmV4cHJlc3Npb25Ob0NvbW1hKTt9CmZ1bmN0aW9uIG1heWJlVGFyZ2V0KG5vQ29tbWEpe3JldHVybiBmdW5jdGlvbih0eXBlKXtpZih0eXBlPT0iLiIpcmV0dXJuIGNvbnQobm9Db21tYT90YXJnZXROb0NvbW1hOnRhcmdldCk7ZWxzZSBpZih0eXBlPT0idmFyaWFibGUiJiZpc1RTKXJldHVybiBjb250KG1heWJlVHlwZUFyZ3Msbm9Db21tYT9tYXliZW9wZXJhdG9yTm9Db21tYTptYXliZW9wZXJhdG9yQ29tbWEpCmVsc2UgcmV0dXJuIHBhc3Mobm9Db21tYT9leHByZXNzaW9uTm9Db21tYTpleHByZXNzaW9uKTt9O30KZnVuY3Rpb24gdGFyZ2V0KF8sdmFsdWUpe2lmKHZhbHVlPT0idGFyZ2V0Iil7Y3gubWFya2VkPSJrZXl3b3JkIjtyZXR1cm4gY29udChtYXliZW9wZXJhdG9yQ29tbWEpO319CmZ1bmN0aW9uIHRhcmdldE5vQ29tbWEoXyx2YWx1ZSl7aWYodmFsdWU9PSJ0YXJnZXQiKXtjeC5tYXJrZWQ9ImtleXdvcmQiO3JldHVybiBjb250KG1heWJlb3BlcmF0b3JOb0NvbW1hKTt9fQpmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpe2lmKHR5cGU9PSI6IilyZXR1cm4gY29udChwb3BsZXgsc3RhdGVtZW50KTtyZXR1cm4gcGFzcyhtYXliZW9wZXJhdG9yQ29tbWEsZXhwZWN0KCI7IikscG9wbGV4KTt9CmZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpe2lmKHR5cGU9PSJ2YXJpYWJsZSIpe2N4Lm1hcmtlZD0icHJvcGVydHkiO3JldHVybiBjb250KCk7fX0KZnVuY3Rpb24gb2JqcHJvcCh0eXBlLHZhbHVlKXtpZih0eXBlPT0iYXN5bmMiKXtjeC5tYXJrZWQ9InByb3BlcnR5IjtyZXR1cm4gY29udChvYmpwcm9wKTt9ZWxzZSBpZih0eXBlPT0idmFyaWFibGUifHxjeC5zdHlsZT09ImtleXdvcmQiKXtjeC5tYXJrZWQ9InByb3BlcnR5IjtpZih2YWx1ZT09ImdldCJ8fHZhbHVlPT0ic2V0IilyZXR1cm4gY29udChnZXR0ZXJTZXR0ZXIpO3ZhciBtCmlmKGlzVFMmJmN4LnN0YXRlLmZhdEFycm93QXQ9PWN4LnN0cmVhbS5zdGFydCYmKG09Y3guc3RyZWFtLm1hdGNoKC9eXHMqOlxzKi8sZmFsc2UpKSkKY3guc3RhdGUuZmF0QXJyb3dBdD1jeC5zdHJlYW0ucG9zK21bMF0ubGVuZ3RoCnJldHVybiBjb250KGFmdGVycHJvcCk7fWVsc2UgaWYodHlwZT09Im51bWJlciJ8fHR5cGU9PSJzdHJpbmciKXtjeC5tYXJrZWQ9anNvbmxkTW9kZT8icHJvcGVydHkiOihjeC5zdHlsZSsiIHByb3BlcnR5Iik7cmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTt9ZWxzZSBpZih0eXBlPT0ianNvbmxkLWtleXdvcmQiKXtyZXR1cm4gY29udChhZnRlcnByb3ApO31lbHNlIGlmKHR5cGU9PSJtb2RpZmllciIpe3JldHVybiBjb250KG9ianByb3ApfWVsc2UgaWYodHlwZT09IlsiKXtyZXR1cm4gY29udChleHByZXNzaW9uLGV4cGVjdCgiXSIpLGFmdGVycHJvcCk7fWVsc2UgaWYodHlwZT09InNwcmVhZCIpe3JldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hLGFmdGVycHJvcCk7fWVsc2UgaWYodmFsdWU9PSIqIil7Y3gubWFya2VkPSJrZXl3b3JkIjtyZXR1cm4gY29udChvYmpwcm9wKTt9ZWxzZSBpZih0eXBlPT0iOiIpe3JldHVybiBwYXNzKGFmdGVycHJvcCl9fQpmdW5jdGlvbiBnZXR0ZXJTZXR0ZXIodHlwZSl7aWYodHlwZSE9InZhcmlhYmxlIilyZXR1cm4gcGFzcyhhZnRlcnByb3ApO2N4Lm1hcmtlZD0icHJvcGVydHkiO3JldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9CmZ1bmN0aW9uIGFmdGVycHJvcCh0eXBlKXtpZih0eXBlPT0iOiIpcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpO2lmKHR5cGU9PSIoIilyZXR1cm4gcGFzcyhmdW5jdGlvbmRlZik7fQpmdW5jdGlvbiBjb21tYXNlcCh3aGF0LGVuZCxzZXApe2Z1bmN0aW9uIHByb2NlZWQodHlwZSx2YWx1ZSl7aWYoc2VwP3NlcC5pbmRleE9mKHR5cGUpPi0xOnR5cGU9PSIsIil7dmFyIGxleD1jeC5zdGF0ZS5sZXhpY2FsO2lmKGxleC5pbmZvPT0iY2FsbCIpbGV4LnBvcz0obGV4LnBvc3x8MCkrMTtyZXR1cm4gY29udChmdW5jdGlvbih0eXBlLHZhbHVlKXtpZih0eXBlPT1lbmR8fHZhbHVlPT1lbmQpcmV0dXJuIHBhc3MoKQpyZXR1cm4gcGFzcyh3aGF0KX0scHJvY2VlZCk7fQppZih0eXBlPT1lbmR8fHZhbHVlPT1lbmQpcmV0dXJuIGNvbnQoKTtyZXR1cm4gY29udChleHBlY3QoZW5kKSk7fQpyZXR1cm4gZnVuY3Rpb24odHlwZSx2YWx1ZSl7aWYodHlwZT09ZW5kfHx2YWx1ZT09ZW5kKXJldHVybiBjb250KCk7cmV0dXJuIHBhc3Mod2hhdCxwcm9jZWVkKTt9O30KZnVuY3Rpb24gY29udENvbW1hc2VwKHdoYXQsZW5kLGluZm8pe2Zvcih2YXIgaT0zO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspCmN4LmNjLnB1c2goYXJndW1lbnRzW2ldKTtyZXR1cm4gY29udChwdXNobGV4KGVuZCxpbmZvKSxjb21tYXNlcCh3aGF0LGVuZCkscG9wbGV4KTt9CmZ1bmN0aW9uIGJsb2NrKHR5cGUpe2lmKHR5cGU9PSJ9IilyZXR1cm4gY29udCgpO3JldHVybiBwYXNzKHN0YXRlbWVudCxibG9jayk7fQpmdW5jdGlvbiBtYXliZXR5cGUodHlwZSx2YWx1ZSl7aWYoaXNUUyl7aWYodHlwZT09IjoiKXJldHVybiBjb250KHR5cGVleHByKTtpZih2YWx1ZT09Ij8iKXJldHVybiBjb250KG1heWJldHlwZSk7fX0KZnVuY3Rpb24gdHlwZWV4cHIodHlwZSx2YWx1ZSl7aWYodHlwZT09InZhcmlhYmxlInx8dmFsdWU9PSJ2b2lkIil7aWYodmFsdWU9PSJrZXlvZiIpe2N4Lm1hcmtlZD0ia2V5d29yZCIKcmV0dXJuIGNvbnQodHlwZWV4cHIpfWVsc2V7Y3gubWFya2VkPSJ0eXBlIgpyZXR1cm4gY29udChhZnRlclR5cGUpfX0KaWYodHlwZT09InN0cmluZyJ8fHR5cGU9PSJudW1iZXIifHx0eXBlPT0iYXRvbSIpcmV0dXJuIGNvbnQoYWZ0ZXJUeXBlKTtpZih0eXBlPT0iWyIpcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLGNvbW1hc2VwKHR5cGVleHByLCJdIiwiLCIpLHBvcGxleCxhZnRlclR5cGUpCmlmKHR5cGU9PSJ7IilyZXR1cm4gY29udChwdXNobGV4KCJ9IiksY29tbWFzZXAodHlwZXByb3AsIn0iLCIsOyIpLHBvcGxleCxhZnRlclR5cGUpCmlmKHR5cGU9PSIoIilyZXR1cm4gY29udChjb21tYXNlcCh0eXBlYXJnLCIpIiksbWF5YmVSZXR1cm5UeXBlKX0KZnVuY3Rpb24gbWF5YmVSZXR1cm5UeXBlKHR5cGUpe2lmKHR5cGU9PSI9PiIpcmV0dXJuIGNvbnQodHlwZWV4cHIpfQpmdW5jdGlvbiB0eXBlcHJvcCh0eXBlLHZhbHVlKXtpZih0eXBlPT0idmFyaWFibGUifHxjeC5zdHlsZT09ImtleXdvcmQiKXtjeC5tYXJrZWQ9InByb3BlcnR5IgpyZXR1cm4gY29udCh0eXBlcHJvcCl9ZWxzZSBpZih2YWx1ZT09Ij8iKXtyZXR1cm4gY29udCh0eXBlcHJvcCl9ZWxzZSBpZih0eXBlPT0iOiIpe3JldHVybiBjb250KHR5cGVleHByKX1lbHNlIGlmKHR5cGU9PSJbIil7cmV0dXJuIGNvbnQoZXhwcmVzc2lvbixtYXliZXR5cGUsZXhwZWN0KCJdIiksdHlwZXByb3ApfX0KZnVuY3Rpb24gdHlwZWFyZyh0eXBlKXtpZih0eXBlPT0idmFyaWFibGUiKXJldHVybiBjb250KHR5cGVhcmcpCmVsc2UgaWYodHlwZT09IjoiKXJldHVybiBjb250KHR5cGVleHByKX0KZnVuY3Rpb24gYWZ0ZXJUeXBlKHR5cGUsdmFsdWUpe2lmKHZhbHVlPT0iPCIpcmV0dXJuIGNvbnQocHVzaGxleCgiPiIpLGNvbW1hc2VwKHR5cGVleHByLCI+IikscG9wbGV4LGFmdGVyVHlwZSkKaWYodmFsdWU9PSJ8Inx8dHlwZT09Ii4iKXJldHVybiBjb250KHR5cGVleHByKQppZih0eXBlPT0iWyIpcmV0dXJuIGNvbnQoZXhwZWN0KCJdIiksYWZ0ZXJUeXBlKQppZih2YWx1ZT09ImV4dGVuZHMiKXJldHVybiBjb250KHR5cGVleHByKX0KZnVuY3Rpb24gbWF5YmVUeXBlQXJncyhfLHZhbHVlKXtpZih2YWx1ZT09IjwiKXJldHVybiBjb250KHB1c2hsZXgoIj4iKSxjb21tYXNlcCh0eXBlZXhwciwiPiIpLHBvcGxleCxhZnRlclR5cGUpfQpmdW5jdGlvbiB0eXBlcGFyYW0oKXtyZXR1cm4gcGFzcyh0eXBlZXhwcixtYXliZVR5cGVEZWZhdWx0KX0KZnVuY3Rpb24gbWF5YmVUeXBlRGVmYXVsdChfLHZhbHVlKXtpZih2YWx1ZT09Ij0iKXJldHVybiBjb250KHR5cGVleHByKX0KZnVuY3Rpb24gdmFyZGVmKCl7cmV0dXJuIHBhc3MocGF0dGVybixtYXliZXR5cGUsbWF5YmVBc3NpZ24sdmFyZGVmQ29udCk7fQpmdW5jdGlvbiBwYXR0ZXJuKHR5cGUsdmFsdWUpe2lmKHR5cGU9PSJtb2RpZmllciIpcmV0dXJuIGNvbnQocGF0dGVybikKaWYodHlwZT09InZhcmlhYmxlIil7cmVnaXN0ZXIodmFsdWUpO3JldHVybiBjb250KCk7fQppZih0eXBlPT0ic3ByZWFkIilyZXR1cm4gY29udChwYXR0ZXJuKTtpZih0eXBlPT0iWyIpcmV0dXJuIGNvbnRDb21tYXNlcChwYXR0ZXJuLCJdIik7aWYodHlwZT09InsiKXJldHVybiBjb250Q29tbWFzZXAocHJvcHBhdHRlcm4sIn0iKTt9CmZ1bmN0aW9uIHByb3BwYXR0ZXJuKHR5cGUsdmFsdWUpe2lmKHR5cGU9PSJ2YXJpYWJsZSImJiFjeC5zdHJlYW0ubWF0Y2goL15ccyo6LyxmYWxzZSkpe3JlZ2lzdGVyKHZhbHVlKTtyZXR1cm4gY29udChtYXliZUFzc2lnbik7fQppZih0eXBlPT0idmFyaWFibGUiKWN4Lm1hcmtlZD0icHJvcGVydHkiO2lmKHR5cGU9PSJzcHJlYWQiKXJldHVybiBjb250KHBhdHRlcm4pO2lmKHR5cGU9PSJ9IilyZXR1cm4gcGFzcygpO3JldHVybiBjb250KGV4cGVjdCgiOiIpLHBhdHRlcm4sbWF5YmVBc3NpZ24pO30KZnVuY3Rpb24gbWF5YmVBc3NpZ24oX3R5cGUsdmFsdWUpe2lmKHZhbHVlPT0iPSIpcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpO30KZnVuY3Rpb24gdmFyZGVmQ29udCh0eXBlKXtpZih0eXBlPT0iLCIpcmV0dXJuIGNvbnQodmFyZGVmKTt9CmZ1bmN0aW9uIG1heWJlZWxzZSh0eXBlLHZhbHVlKXtpZih0eXBlPT0ia2V5d29yZCBiIiYmdmFsdWU9PSJlbHNlIilyZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiwiZWxzZSIpLHN0YXRlbWVudCxwb3BsZXgpO30KZnVuY3Rpb24gZm9yc3BlYyh0eXBlKXtpZih0eXBlPT0iKCIpcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLGZvcnNwZWMxLGV4cGVjdCgiKSIpLHBvcGxleCk7fQpmdW5jdGlvbiBmb3JzcGVjMSh0eXBlKXtpZih0eXBlPT0idmFyIilyZXR1cm4gY29udCh2YXJkZWYsZXhwZWN0KCI7IiksZm9yc3BlYzIpO2lmKHR5cGU9PSI7IilyZXR1cm4gY29udChmb3JzcGVjMik7aWYodHlwZT09InZhcmlhYmxlIilyZXR1cm4gY29udChmb3JtYXliZWlub2YpO3JldHVybiBwYXNzKGV4cHJlc3Npb24sZXhwZWN0KCI7IiksZm9yc3BlYzIpO30KZnVuY3Rpb24gZm9ybWF5YmVpbm9mKF90eXBlLHZhbHVlKXtpZih2YWx1ZT09ImluInx8dmFsdWU9PSJvZiIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7fQpyZXR1cm4gY29udChtYXliZW9wZXJhdG9yQ29tbWEsZm9yc3BlYzIpO30KZnVuY3Rpb24gZm9yc3BlYzIodHlwZSx2YWx1ZSl7aWYodHlwZT09IjsiKXJldHVybiBjb250KGZvcnNwZWMzKTtpZih2YWx1ZT09ImluInx8dmFsdWU9PSJvZiIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7fQpyZXR1cm4gcGFzcyhleHByZXNzaW9uLGV4cGVjdCgiOyIpLGZvcnNwZWMzKTt9CmZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpe2lmKHR5cGUhPSIpIiljb250KGV4cHJlc3Npb24pO30KZnVuY3Rpb24gZnVuY3Rpb25kZWYodHlwZSx2YWx1ZSl7aWYodmFsdWU9PSIqIil7Y3gubWFya2VkPSJrZXl3b3JkIjtyZXR1cm4gY29udChmdW5jdGlvbmRlZik7fQppZih0eXBlPT0idmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7cmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO30KaWYodHlwZT09IigiKXJldHVybiBjb250KHB1c2hjb250ZXh0LHB1c2hsZXgoIikiKSxjb21tYXNlcChmdW5hcmcsIikiKSxwb3BsZXgsbWF5YmV0eXBlLHN0YXRlbWVudCxwb3Bjb250ZXh0KTtpZihpc1RTJiZ2YWx1ZT09IjwiKXJldHVybiBjb250KHB1c2hsZXgoIj4iKSxjb21tYXNlcCh0eXBlcGFyYW0sIj4iKSxwb3BsZXgsZnVuY3Rpb25kZWYpfQpmdW5jdGlvbiBmdW5hcmcodHlwZSx2YWx1ZSl7aWYodmFsdWU9PSJAIiljb250KGV4cHJlc3Npb24sZnVuYXJnKQppZih0eXBlPT0ic3ByZWFkInx8dHlwZT09Im1vZGlmaWVyIilyZXR1cm4gY29udChmdW5hcmcpO3JldHVybiBwYXNzKHBhdHRlcm4sbWF5YmV0eXBlLG1heWJlQXNzaWduKTt9CmZ1bmN0aW9uIGNsYXNzRXhwcmVzc2lvbih0eXBlLHZhbHVlKXtpZih0eXBlPT0idmFyaWFibGUiKXJldHVybiBjbGFzc05hbWUodHlwZSx2YWx1ZSk7cmV0dXJuIGNsYXNzTmFtZUFmdGVyKHR5cGUsdmFsdWUpO30KZnVuY3Rpb24gY2xhc3NOYW1lKHR5cGUsdmFsdWUpe2lmKHR5cGU9PSJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTtyZXR1cm4gY29udChjbGFzc05hbWVBZnRlcik7fX0KZnVuY3Rpb24gY2xhc3NOYW1lQWZ0ZXIodHlwZSx2YWx1ZSl7aWYodmFsdWU9PSI8IilyZXR1cm4gY29udChwdXNobGV4KCI+IiksY29tbWFzZXAodHlwZXBhcmFtLCI+IikscG9wbGV4LGNsYXNzTmFtZUFmdGVyKQppZih2YWx1ZT09ImV4dGVuZHMifHx2YWx1ZT09ImltcGxlbWVudHMifHwoaXNUUyYmdHlwZT09IiwiKSkKcmV0dXJuIGNvbnQoaXNUUz90eXBlZXhwcjpleHByZXNzaW9uLGNsYXNzTmFtZUFmdGVyKTtpZih0eXBlPT0ieyIpcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLGNsYXNzQm9keSxwb3BsZXgpO30KZnVuY3Rpb24gY2xhc3NCb2R5KHR5cGUsdmFsdWUpe2lmKHR5cGU9PSJtb2RpZmllciJ8fHR5cGU9PSJhc3luYyJ8fCh0eXBlPT0idmFyaWFibGUiJiYodmFsdWU9PSJzdGF0aWMifHx2YWx1ZT09ImdldCJ8fHZhbHVlPT0ic2V0IikmJmN4LnN0cmVhbS5tYXRjaCgvXlxzK1tcdyRceGExLVx1ZmZmZl0vLGZhbHNlKSkpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoY2xhc3NCb2R5KTt9CmlmKHR5cGU9PSJ2YXJpYWJsZSJ8fGN4LnN0eWxlPT0ia2V5d29yZCIpe2N4Lm1hcmtlZD0icHJvcGVydHkiO3JldHVybiBjb250KGlzVFM/Y2xhc3NmaWVsZDpmdW5jdGlvbmRlZixjbGFzc0JvZHkpO30KaWYodHlwZT09IlsiKQpyZXR1cm4gY29udChleHByZXNzaW9uLGV4cGVjdCgiXSIpLGlzVFM/Y2xhc3NmaWVsZDpmdW5jdGlvbmRlZixjbGFzc0JvZHkpCmlmKHZhbHVlPT0iKiIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoY2xhc3NCb2R5KTt9CmlmKHR5cGU9PSI7IilyZXR1cm4gY29udChjbGFzc0JvZHkpO2lmKHR5cGU9PSJ9IilyZXR1cm4gY29udCgpO2lmKHZhbHVlPT0iQCIpcmV0dXJuIGNvbnQoZXhwcmVzc2lvbixjbGFzc0JvZHkpfQpmdW5jdGlvbiBjbGFzc2ZpZWxkKHR5cGUsdmFsdWUpe2lmKHZhbHVlPT0iPyIpcmV0dXJuIGNvbnQoY2xhc3NmaWVsZCkKaWYodHlwZT09IjoiKXJldHVybiBjb250KHR5cGVleHByLG1heWJlQXNzaWduKQppZih2YWx1ZT09Ij0iKXJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKQpyZXR1cm4gcGFzcyhmdW5jdGlvbmRlZil9CmZ1bmN0aW9uIGFmdGVyRXhwb3J0KHR5cGUsdmFsdWUpe2lmKHZhbHVlPT0iKiIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQobWF5YmVGcm9tLGV4cGVjdCgiOyIpKTt9CmlmKHZhbHVlPT0iZGVmYXVsdCIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoZXhwcmVzc2lvbixleHBlY3QoIjsiKSk7fQppZih0eXBlPT0ieyIpcmV0dXJuIGNvbnQoY29tbWFzZXAoZXhwb3J0RmllbGQsIn0iKSxtYXliZUZyb20sZXhwZWN0KCI7IikpO3JldHVybiBwYXNzKHN0YXRlbWVudCk7fQpmdW5jdGlvbiBleHBvcnRGaWVsZCh0eXBlLHZhbHVlKXtpZih2YWx1ZT09ImFzIil7Y3gubWFya2VkPSJrZXl3b3JkIjtyZXR1cm4gY29udChleHBlY3QoInZhcmlhYmxlIikpO30KaWYodHlwZT09InZhcmlhYmxlIilyZXR1cm4gcGFzcyhleHByZXNzaW9uTm9Db21tYSxleHBvcnRGaWVsZCk7fQpmdW5jdGlvbiBhZnRlckltcG9ydCh0eXBlKXtpZih0eXBlPT0ic3RyaW5nIilyZXR1cm4gY29udCgpO3JldHVybiBwYXNzKGltcG9ydFNwZWMsbWF5YmVNb3JlSW1wb3J0cyxtYXliZUZyb20pO30KZnVuY3Rpb24gaW1wb3J0U3BlYyh0eXBlLHZhbHVlKXtpZih0eXBlPT0ieyIpcmV0dXJuIGNvbnRDb21tYXNlcChpbXBvcnRTcGVjLCJ9Iik7aWYodHlwZT09InZhcmlhYmxlIilyZWdpc3Rlcih2YWx1ZSk7aWYodmFsdWU9PSIqIiljeC5tYXJrZWQ9ImtleXdvcmQiO3JldHVybiBjb250KG1heWJlQXMpO30KZnVuY3Rpb24gbWF5YmVNb3JlSW1wb3J0cyh0eXBlKXtpZih0eXBlPT0iLCIpcmV0dXJuIGNvbnQoaW1wb3J0U3BlYyxtYXliZU1vcmVJbXBvcnRzKX0KZnVuY3Rpb24gbWF5YmVBcyhfdHlwZSx2YWx1ZSl7aWYodmFsdWU9PSJhcyIpe2N4Lm1hcmtlZD0ia2V5d29yZCI7cmV0dXJuIGNvbnQoaW1wb3J0U3BlYyk7fX0KZnVuY3Rpb24gbWF5YmVGcm9tKF90eXBlLHZhbHVlKXtpZih2YWx1ZT09ImZyb20iKXtjeC5tYXJrZWQ9ImtleXdvcmQiO3JldHVybiBjb250KGV4cHJlc3Npb24pO319CmZ1bmN0aW9uIGFycmF5TGl0ZXJhbCh0eXBlKXtpZih0eXBlPT0iXSIpcmV0dXJuIGNvbnQoKTtyZXR1cm4gcGFzcyhjb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwiXSIpKTt9CmZ1bmN0aW9uIGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLHRleHRBZnRlcil7cmV0dXJuIHN0YXRlLmxhc3RUeXBlPT0ib3BlcmF0b3IifHxzdGF0ZS5sYXN0VHlwZT09IiwifHxpc09wZXJhdG9yQ2hhci50ZXN0KHRleHRBZnRlci5jaGFyQXQoMCkpfHwvWywuXS8udGVzdCh0ZXh0QWZ0ZXIuY2hhckF0KDApKTt9CmZ1bmN0aW9uIGV4cHJlc3Npb25BbGxvd2VkKHN0cmVhbSxzdGF0ZSxiYWNrVXApe3JldHVybiBzdGF0ZS50b2tlbml6ZT09dG9rZW5CYXNlJiYvXig/Om9wZXJhdG9yfHNvZnxrZXl3b3JkIFtiY2RdfGNhc2V8bmV3fGV4cG9ydHxkZWZhdWx0fHNwcmVhZHxbXFt7fVwoLDs6XXw9PikkLy50ZXN0KHN0YXRlLmxhc3RUeXBlKXx8KHN0YXRlLmxhc3RUeXBlPT0icXVhc2kiJiYvXHtccyokLy50ZXN0KHN0cmVhbS5zdHJpbmcuc2xpY2UoMCxzdHJlYW0ucG9zLShiYWNrVXB8fDApKSkpfQpyZXR1cm57c3RhcnRTdGF0ZTpmdW5jdGlvbihiYXNlY29sdW1uKXt2YXIgc3RhdGU9e3Rva2VuaXplOnRva2VuQmFzZSxsYXN0VHlwZToic29mIixjYzpbXSxsZXhpY2FsOm5ldyBKU0xleGljYWwoKGJhc2Vjb2x1bW58fDApLWluZGVudFVuaXQsMCwiYmxvY2siLGZhbHNlKSxsb2NhbFZhcnM6cGFyc2VyQ29uZmlnLmxvY2FsVmFycyxjb250ZXh0OnBhcnNlckNvbmZpZy5sb2NhbFZhcnMmJnt2YXJzOnBhcnNlckNvbmZpZy5sb2NhbFZhcnN9LGluZGVudGVkOmJhc2Vjb2x1bW58fDB9O2lmKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzJiZ0eXBlb2YgcGFyc2VyQ29uZmlnLmdsb2JhbFZhcnM9PSJvYmplY3QiKQpzdGF0ZS5nbG9iYWxWYXJzPXBhcnNlckNvbmZpZy5nbG9iYWxWYXJzO3JldHVybiBzdGF0ZTt9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoc3RyZWFtLnNvbCgpKXtpZighc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKc3RhdGUubGV4aWNhbC5hbGlnbj1mYWxzZTtzdGF0ZS5pbmRlbnRlZD1zdHJlYW0uaW5kZW50YXRpb24oKTtmaW5kRmF0QXJyb3coc3RyZWFtLHN0YXRlKTt9CmlmKHN0YXRlLnRva2VuaXplIT10b2tlbkNvbW1lbnQmJnN0cmVhbS5lYXRTcGFjZSgpKXJldHVybiBudWxsO3ZhciBzdHlsZT1zdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO2lmKHR5cGU9PSJjb21tZW50IilyZXR1cm4gc3R5bGU7c3RhdGUubGFzdFR5cGU9dHlwZT09Im9wZXJhdG9yIiYmKGNvbnRlbnQ9PSIrKyJ8fGNvbnRlbnQ9PSItLSIpPyJpbmNkZWMiOnR5cGU7cmV0dXJuIHBhcnNlSlMoc3RhdGUsc3R5bGUsdHlwZSxjb250ZW50LHN0cmVhbSk7fSxpbmRlbnQ6ZnVuY3Rpb24oc3RhdGUsdGV4dEFmdGVyKXtpZihzdGF0ZS50b2tlbml6ZT09dG9rZW5Db21tZW50KXJldHVybiBDb2RlTWlycm9yLlBhc3M7aWYoc3RhdGUudG9rZW5pemUhPXRva2VuQmFzZSlyZXR1cm4gMDt2YXIgZmlyc3RDaGFyPXRleHRBZnRlciYmdGV4dEFmdGVyLmNoYXJBdCgwKSxsZXhpY2FsPXN0YXRlLmxleGljYWwsdG9wCmlmKCEvXlxzKmVsc2VcYi8udGVzdCh0ZXh0QWZ0ZXIpKWZvcih2YXIgaT1zdGF0ZS5jYy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIGM9c3RhdGUuY2NbaV07aWYoYz09cG9wbGV4KWxleGljYWw9bGV4aWNhbC5wcmV2O2Vsc2UgaWYoYyE9bWF5YmVlbHNlKWJyZWFrO30Kd2hpbGUoKGxleGljYWwudHlwZT09InN0YXQifHxsZXhpY2FsLnR5cGU9PSJmb3JtIikmJihmaXJzdENoYXI9PSJ9Inx8KCh0b3A9c3RhdGUuY2Nbc3RhdGUuY2MubGVuZ3RoLTFdKSYmKHRvcD09bWF5YmVvcGVyYXRvckNvbW1hfHx0b3A9PW1heWJlb3BlcmF0b3JOb0NvbW1hKSYmIS9eWyxcLj0rXC0qOj9bXChdLy50ZXN0KHRleHRBZnRlcikpKSkKbGV4aWNhbD1sZXhpY2FsLnByZXY7aWYoc3RhdGVtZW50SW5kZW50JiZsZXhpY2FsLnR5cGU9PSIpIiYmbGV4aWNhbC5wcmV2LnR5cGU9PSJzdGF0IikKbGV4aWNhbD1sZXhpY2FsLnByZXY7dmFyIHR5cGU9bGV4aWNhbC50eXBlLGNsb3Npbmc9Zmlyc3RDaGFyPT10eXBlO2lmKHR5cGU9PSJ2YXJkZWYiKXJldHVybiBsZXhpY2FsLmluZGVudGVkKyhzdGF0ZS5sYXN0VHlwZT09Im9wZXJhdG9yInx8c3RhdGUubGFzdFR5cGU9PSIsIj9sZXhpY2FsLmluZm8rMTowKTtlbHNlIGlmKHR5cGU9PSJmb3JtIiYmZmlyc3RDaGFyPT0ieyIpcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7ZWxzZSBpZih0eXBlPT0iZm9ybSIpcmV0dXJuIGxleGljYWwuaW5kZW50ZWQraW5kZW50VW5pdDtlbHNlIGlmKHR5cGU9PSJzdGF0IikKcmV0dXJuIGxleGljYWwuaW5kZW50ZWQrKGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLHRleHRBZnRlcik/c3RhdGVtZW50SW5kZW50fHxpbmRlbnRVbml0OjApO2Vsc2UgaWYobGV4aWNhbC5pbmZvPT0ic3dpdGNoIiYmIWNsb3NpbmcmJnBhcnNlckNvbmZpZy5kb3VibGVJbmRlbnRTd2l0Y2ghPWZhbHNlKQpyZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCsoL14oPzpjYXNlfGRlZmF1bHQpXGIvLnRlc3QodGV4dEFmdGVyKT9pbmRlbnRVbml0OjIqaW5kZW50VW5pdCk7ZWxzZSBpZihsZXhpY2FsLmFsaWduKXJldHVybiBsZXhpY2FsLmNvbHVtbisoY2xvc2luZz8wOjEpO2Vsc2UgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQrKGNsb3Npbmc/MDppbmRlbnRVbml0KTt9LGVsZWN0cmljSW5wdXQ6L15ccyooPzpjYXNlIC4qPzp8ZGVmYXVsdDp8XHt8XH0pJC8sYmxvY2tDb21tZW50U3RhcnQ6anNvbk1vZGU/bnVsbDoiLyoiLGJsb2NrQ29tbWVudEVuZDpqc29uTW9kZT9udWxsOiIqLyIsYmxvY2tDb21tZW50Q29udGludWU6anNvbk1vZGU/bnVsbDoiICogIixsaW5lQ29tbWVudDpqc29uTW9kZT9udWxsOiIvLyIsZm9sZDoiYnJhY2UiLGNsb3NlQnJhY2tldHM6IigpW117fScnXCJcImBgIixoZWxwZXJUeXBlOmpzb25Nb2RlPyJqc29uIjoiamF2YXNjcmlwdCIsanNvbmxkTW9kZTpqc29ubGRNb2RlLGpzb25Nb2RlOmpzb25Nb2RlLGV4cHJlc3Npb25BbGxvd2VkOmV4cHJlc3Npb25BbGxvd2VkLHNraXBFeHByZXNzaW9uOmZ1bmN0aW9uKHN0YXRlKXt2YXIgdG9wPXN0YXRlLmNjW3N0YXRlLmNjLmxlbmd0aC0xXQppZih0b3A9PWV4cHJlc3Npb258fHRvcD09ZXhwcmVzc2lvbk5vQ29tbWEpc3RhdGUuY2MucG9wKCl9fTt9KTtDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJ3b3JkQ2hhcnMiLCJqYXZhc2NyaXB0IiwvW1x3JF0vKTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvamF2YXNjcmlwdCIsImphdmFzY3JpcHQiKTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvZWNtYXNjcmlwdCIsImphdmFzY3JpcHQiKTtDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLCJqYXZhc2NyaXB0Iik7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCJqYXZhc2NyaXB0Iik7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0IiwiamF2YXNjcmlwdCIpO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vanNvbiIse25hbWU6ImphdmFzY3JpcHQiLGpzb246dHJ1ZX0pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1qc29uIix7bmFtZToiamF2YXNjcmlwdCIsanNvbjp0cnVlfSk7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9sZCtqc29uIix7bmFtZToiamF2YXNjcmlwdCIsanNvbmxkOnRydWV9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdHlwZXNjcmlwdCIse25hbWU6ImphdmFzY3JpcHQiLHR5cGVzY3JpcHQ6dHJ1ZX0pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vdHlwZXNjcmlwdCIse25hbWU6ImphdmFzY3JpcHQiLHR5cGVzY3JpcHQ6dHJ1ZX0pO30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKQpkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLG1vZCk7ZWxzZQptb2QoQ29kZU1pcnJvcik7fSkoZnVuY3Rpb24oQ29kZU1pcnJvcil7InVzZSBzdHJpY3QiO3ZhciBodG1sQ29uZmlnPXthdXRvU2VsZkNsb3NlcnM6eydhcmVhJzp0cnVlLCdiYXNlJzp0cnVlLCdicic6dHJ1ZSwnY29sJzp0cnVlLCdjb21tYW5kJzp0cnVlLCdlbWJlZCc6dHJ1ZSwnZnJhbWUnOnRydWUsJ2hyJzp0cnVlLCdpbWcnOnRydWUsJ2lucHV0Jzp0cnVlLCdrZXlnZW4nOnRydWUsJ2xpbmsnOnRydWUsJ21ldGEnOnRydWUsJ3BhcmFtJzp0cnVlLCdzb3VyY2UnOnRydWUsJ3RyYWNrJzp0cnVlLCd3YnInOnRydWUsJ21lbnVpdGVtJzp0cnVlfSxpbXBsaWNpdGx5Q2xvc2VkOnsnZGQnOnRydWUsJ2xpJzp0cnVlLCdvcHRncm91cCc6dHJ1ZSwnb3B0aW9uJzp0cnVlLCdwJzp0cnVlLCdycCc6dHJ1ZSwncnQnOnRydWUsJ3Rib2R5Jzp0cnVlLCd0ZCc6dHJ1ZSwndGZvb3QnOnRydWUsJ3RoJzp0cnVlLCd0cic6dHJ1ZX0sY29udGV4dEdyYWJiZXJzOnsnZGQnOnsnZGQnOnRydWUsJ2R0Jzp0cnVlfSwnZHQnOnsnZGQnOnRydWUsJ2R0Jzp0cnVlfSwnbGknOnsnbGknOnRydWV9LCdvcHRpb24nOnsnb3B0aW9uJzp0cnVlLCdvcHRncm91cCc6dHJ1ZX0sJ29wdGdyb3VwJzp7J29wdGdyb3VwJzp0cnVlfSwncCc6eydhZGRyZXNzJzp0cnVlLCdhcnRpY2xlJzp0cnVlLCdhc2lkZSc6dHJ1ZSwnYmxvY2txdW90ZSc6dHJ1ZSwnZGlyJzp0cnVlLCdkaXYnOnRydWUsJ2RsJzp0cnVlLCdmaWVsZHNldCc6dHJ1ZSwnZm9vdGVyJzp0cnVlLCdmb3JtJzp0cnVlLCdoMSc6dHJ1ZSwnaDInOnRydWUsJ2gzJzp0cnVlLCdoNCc6dHJ1ZSwnaDUnOnRydWUsJ2g2Jzp0cnVlLCdoZWFkZXInOnRydWUsJ2hncm91cCc6dHJ1ZSwnaHInOnRydWUsJ21lbnUnOnRydWUsJ25hdic6dHJ1ZSwnb2wnOnRydWUsJ3AnOnRydWUsJ3ByZSc6dHJ1ZSwnc2VjdGlvbic6dHJ1ZSwndGFibGUnOnRydWUsJ3VsJzp0cnVlfSwncnAnOnsncnAnOnRydWUsJ3J0Jzp0cnVlfSwncnQnOnsncnAnOnRydWUsJ3J0Jzp0cnVlfSwndGJvZHknOnsndGJvZHknOnRydWUsJ3Rmb290Jzp0cnVlfSwndGQnOnsndGQnOnRydWUsJ3RoJzp0cnVlfSwndGZvb3QnOnsndGJvZHknOnRydWV9LCd0aCc6eyd0ZCc6dHJ1ZSwndGgnOnRydWV9LCd0aGVhZCc6eyd0Ym9keSc6dHJ1ZSwndGZvb3QnOnRydWV9LCd0cic6eyd0cic6dHJ1ZX19LGRvTm90SW5kZW50OnsicHJlIjp0cnVlfSxhbGxvd1VucXVvdGVkOnRydWUsYWxsb3dNaXNzaW5nOnRydWUsY2FzZUZvbGQ6dHJ1ZX0KdmFyIHhtbENvbmZpZz17YXV0b1NlbGZDbG9zZXJzOnt9LGltcGxpY2l0bHlDbG9zZWQ6e30sY29udGV4dEdyYWJiZXJzOnt9LGRvTm90SW5kZW50Ont9LGFsbG93VW5xdW90ZWQ6ZmFsc2UsYWxsb3dNaXNzaW5nOmZhbHNlLGNhc2VGb2xkOmZhbHNlfQpDb2RlTWlycm9yLmRlZmluZU1vZGUoInhtbCIsZnVuY3Rpb24oZWRpdG9yQ29uZixjb25maWdfKXt2YXIgaW5kZW50VW5pdD1lZGl0b3JDb25mLmluZGVudFVuaXQKdmFyIGNvbmZpZz17fQp2YXIgZGVmYXVsdHM9Y29uZmlnXy5odG1sTW9kZT9odG1sQ29uZmlnOnhtbENvbmZpZwpmb3IodmFyIHByb3AgaW4gZGVmYXVsdHMpY29uZmlnW3Byb3BdPWRlZmF1bHRzW3Byb3BdCmZvcih2YXIgcHJvcCBpbiBjb25maWdfKWNvbmZpZ1twcm9wXT1jb25maWdfW3Byb3BdCnZhciB0eXBlLHNldFN0eWxlO2Z1bmN0aW9uIGluVGV4dChzdHJlYW0sc3RhdGUpe2Z1bmN0aW9uIGNoYWluKHBhcnNlcil7c3RhdGUudG9rZW5pemU9cGFyc2VyO3JldHVybiBwYXJzZXIoc3RyZWFtLHN0YXRlKTt9CnZhciBjaD1zdHJlYW0ubmV4dCgpO2lmKGNoPT0iPCIpe2lmKHN0cmVhbS5lYXQoIiEiKSl7aWYoc3RyZWFtLmVhdCgiWyIpKXtpZihzdHJlYW0ubWF0Y2goIkNEQVRBWyIpKXJldHVybiBjaGFpbihpbkJsb2NrKCJhdG9tIiwiXV0+IikpO2Vsc2UgcmV0dXJuIG51bGw7fWVsc2UgaWYoc3RyZWFtLm1hdGNoKCItLSIpKXtyZXR1cm4gY2hhaW4oaW5CbG9jaygiY29tbWVudCIsIi0tPiIpKTt9ZWxzZSBpZihzdHJlYW0ubWF0Y2goIkRPQ1RZUEUiLHRydWUsdHJ1ZSkpe3N0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7cmV0dXJuIGNoYWluKGRvY3R5cGUoMSkpO31lbHNle3JldHVybiBudWxsO319ZWxzZSBpZihzdHJlYW0uZWF0KCI/Iikpe3N0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7c3RhdGUudG9rZW5pemU9aW5CbG9jaygibWV0YSIsIj8+Iik7cmV0dXJuIm1ldGEiO31lbHNle3R5cGU9c3RyZWFtLmVhdCgiLyIpPyJjbG9zZVRhZyI6Im9wZW5UYWciO3N0YXRlLnRva2VuaXplPWluVGFnO3JldHVybiJ0YWcgYnJhY2tldCI7fX1lbHNlIGlmKGNoPT0iJiIpe3ZhciBvaztpZihzdHJlYW0uZWF0KCIjIikpe2lmKHN0cmVhbS5lYXQoIngiKSl7b2s9c3RyZWFtLmVhdFdoaWxlKC9bYS1mQS1GXGRdLykmJnN0cmVhbS5lYXQoIjsiKTt9ZWxzZXtvaz1zdHJlYW0uZWF0V2hpbGUoL1tcZF0vKSYmc3RyZWFtLmVhdCgiOyIpO319ZWxzZXtvaz1zdHJlYW0uZWF0V2hpbGUoL1tcd1wuXC06XS8pJiZzdHJlYW0uZWF0KCI7Iik7fQpyZXR1cm4gb2s/ImF0b20iOiJlcnJvciI7fWVsc2V7c3RyZWFtLmVhdFdoaWxlKC9bXiY8XS8pO3JldHVybiBudWxsO319CmluVGV4dC5pc0luVGV4dD10cnVlO2Z1bmN0aW9uIGluVGFnKHN0cmVhbSxzdGF0ZSl7dmFyIGNoPXN0cmVhbS5uZXh0KCk7aWYoY2g9PSI+Inx8KGNoPT0iLyImJnN0cmVhbS5lYXQoIj4iKSkpe3N0YXRlLnRva2VuaXplPWluVGV4dDt0eXBlPWNoPT0iPiI/ImVuZFRhZyI6InNlbGZjbG9zZVRhZyI7cmV0dXJuInRhZyBicmFja2V0Ijt9ZWxzZSBpZihjaD09Ij0iKXt0eXBlPSJlcXVhbHMiO3JldHVybiBudWxsO31lbHNlIGlmKGNoPT0iPCIpe3N0YXRlLnRva2VuaXplPWluVGV4dDtzdGF0ZS5zdGF0ZT1iYXNlU3RhdGU7c3RhdGUudGFnTmFtZT1zdGF0ZS50YWdTdGFydD1udWxsO3ZhciBuZXh0PXN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7cmV0dXJuIG5leHQ/bmV4dCsiIHRhZyBlcnJvciI6InRhZyBlcnJvciI7fWVsc2UgaWYoL1tcJ1wiXS8udGVzdChjaCkpe3N0YXRlLnRva2VuaXplPWluQXR0cmlidXRlKGNoKTtzdGF0ZS5zdHJpbmdTdGFydENvbD1zdHJlYW0uY29sdW1uKCk7cmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fWVsc2V7c3RyZWFtLm1hdGNoKC9eW15cc1x1MDBhMD08PlwiXCddKlteXHNcdTAwYTA9PD5cIlwnXC9dLyk7cmV0dXJuIndvcmQiO319CmZ1bmN0aW9uIGluQXR0cmlidXRlKHF1b3RlKXt2YXIgY2xvc3VyZT1mdW5jdGlvbihzdHJlYW0sc3RhdGUpe3doaWxlKCFzdHJlYW0uZW9sKCkpe2lmKHN0cmVhbS5uZXh0KCk9PXF1b3RlKXtzdGF0ZS50b2tlbml6ZT1pblRhZzticmVhazt9fQpyZXR1cm4ic3RyaW5nIjt9O2Nsb3N1cmUuaXNJbkF0dHJpYnV0ZT10cnVlO3JldHVybiBjbG9zdXJlO30KZnVuY3Rpb24gaW5CbG9jayhzdHlsZSx0ZXJtaW5hdG9yKXtyZXR1cm4gZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXt3aGlsZSghc3RyZWFtLmVvbCgpKXtpZihzdHJlYW0ubWF0Y2godGVybWluYXRvcikpe3N0YXRlLnRva2VuaXplPWluVGV4dDticmVhazt9CnN0cmVhbS5uZXh0KCk7fQpyZXR1cm4gc3R5bGU7fTt9CmZ1bmN0aW9uIGRvY3R5cGUoZGVwdGgpe3JldHVybiBmdW5jdGlvbihzdHJlYW0sc3RhdGUpe3ZhciBjaDt3aGlsZSgoY2g9c3RyZWFtLm5leHQoKSkhPW51bGwpe2lmKGNoPT0iPCIpe3N0YXRlLnRva2VuaXplPWRvY3R5cGUoZGVwdGgrMSk7cmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fWVsc2UgaWYoY2g9PSI+Iil7aWYoZGVwdGg9PTEpe3N0YXRlLnRva2VuaXplPWluVGV4dDticmVhazt9ZWxzZXtzdGF0ZS50b2tlbml6ZT1kb2N0eXBlKGRlcHRoLTEpO3JldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO319fQpyZXR1cm4ibWV0YSI7fTt9CmZ1bmN0aW9uIENvbnRleHQoc3RhdGUsdGFnTmFtZSxzdGFydE9mTGluZSl7dGhpcy5wcmV2PXN0YXRlLmNvbnRleHQ7dGhpcy50YWdOYW1lPXRhZ05hbWU7dGhpcy5pbmRlbnQ9c3RhdGUuaW5kZW50ZWQ7dGhpcy5zdGFydE9mTGluZT1zdGFydE9mTGluZTtpZihjb25maWcuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodGFnTmFtZSl8fChzdGF0ZS5jb250ZXh0JiZzdGF0ZS5jb250ZXh0Lm5vSW5kZW50KSkKdGhpcy5ub0luZGVudD10cnVlO30KZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSl7aWYoc3RhdGUuY29udGV4dClzdGF0ZS5jb250ZXh0PXN0YXRlLmNvbnRleHQucHJldjt9CmZ1bmN0aW9uIG1heWJlUG9wQ29udGV4dChzdGF0ZSxuZXh0VGFnTmFtZSl7dmFyIHBhcmVudFRhZ05hbWU7d2hpbGUodHJ1ZSl7aWYoIXN0YXRlLmNvbnRleHQpe3JldHVybjt9CnBhcmVudFRhZ05hbWU9c3RhdGUuY29udGV4dC50YWdOYW1lO2lmKCFjb25maWcuY29udGV4dEdyYWJiZXJzLmhhc093blByb3BlcnR5KHBhcmVudFRhZ05hbWUpfHwhY29uZmlnLmNvbnRleHRHcmFiYmVyc1twYXJlbnRUYWdOYW1lXS5oYXNPd25Qcm9wZXJ0eShuZXh0VGFnTmFtZSkpe3JldHVybjt9CnBvcENvbnRleHQoc3RhdGUpO319CmZ1bmN0aW9uIGJhc2VTdGF0ZSh0eXBlLHN0cmVhbSxzdGF0ZSl7aWYodHlwZT09Im9wZW5UYWciKXtzdGF0ZS50YWdTdGFydD1zdHJlYW0uY29sdW1uKCk7cmV0dXJuIHRhZ05hbWVTdGF0ZTt9ZWxzZSBpZih0eXBlPT0iY2xvc2VUYWciKXtyZXR1cm4gY2xvc2VUYWdOYW1lU3RhdGU7fWVsc2V7cmV0dXJuIGJhc2VTdGF0ZTt9fQpmdW5jdGlvbiB0YWdOYW1lU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpe2lmKHR5cGU9PSJ3b3JkIil7c3RhdGUudGFnTmFtZT1zdHJlYW0uY3VycmVudCgpO3NldFN0eWxlPSJ0YWciO3JldHVybiBhdHRyU3RhdGU7fWVsc2V7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gdGFnTmFtZVN0YXRlO319CmZ1bmN0aW9uIGNsb3NlVGFnTmFtZVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe3ZhciB0YWdOYW1lPXN0cmVhbS5jdXJyZW50KCk7aWYoc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50YWdOYW1lIT10YWdOYW1lJiZjb25maWcuaW1wbGljaXRseUNsb3NlZC5oYXNPd25Qcm9wZXJ0eShzdGF0ZS5jb250ZXh0LnRhZ05hbWUpKQpwb3BDb250ZXh0KHN0YXRlKTtpZigoc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50YWdOYW1lPT10YWdOYW1lKXx8Y29uZmlnLm1hdGNoQ2xvc2luZz09PWZhbHNlKXtzZXRTdHlsZT0idGFnIjtyZXR1cm4gY2xvc2VTdGF0ZTt9ZWxzZXtzZXRTdHlsZT0idGFnIGVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZUVycjt9fWVsc2V7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZUVycjt9fQpmdW5jdGlvbiBjbG9zZVN0YXRlKHR5cGUsX3N0cmVhbSxzdGF0ZSl7aWYodHlwZSE9ImVuZFRhZyIpe3NldFN0eWxlPSJlcnJvciI7cmV0dXJuIGNsb3NlU3RhdGU7fQpwb3BDb250ZXh0KHN0YXRlKTtyZXR1cm4gYmFzZVN0YXRlO30KZnVuY3Rpb24gY2xvc2VTdGF0ZUVycih0eXBlLHN0cmVhbSxzdGF0ZSl7c2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gY2xvc2VTdGF0ZSh0eXBlLHN0cmVhbSxzdGF0ZSk7fQpmdW5jdGlvbiBhdHRyU3RhdGUodHlwZSxfc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0id29yZCIpe3NldFN0eWxlPSJhdHRyaWJ1dGUiO3JldHVybiBhdHRyRXFTdGF0ZTt9ZWxzZSBpZih0eXBlPT0iZW5kVGFnInx8dHlwZT09InNlbGZjbG9zZVRhZyIpe3ZhciB0YWdOYW1lPXN0YXRlLnRhZ05hbWUsdGFnU3RhcnQ9c3RhdGUudGFnU3RhcnQ7c3RhdGUudGFnTmFtZT1zdGF0ZS50YWdTdGFydD1udWxsO2lmKHR5cGU9PSJzZWxmY2xvc2VUYWcifHxjb25maWcuYXV0b1NlbGZDbG9zZXJzLmhhc093blByb3BlcnR5KHRhZ05hbWUpKXttYXliZVBvcENvbnRleHQoc3RhdGUsdGFnTmFtZSk7fWVsc2V7bWF5YmVQb3BDb250ZXh0KHN0YXRlLHRhZ05hbWUpO3N0YXRlLmNvbnRleHQ9bmV3IENvbnRleHQoc3RhdGUsdGFnTmFtZSx0YWdTdGFydD09c3RhdGUuaW5kZW50ZWQpO30KcmV0dXJuIGJhc2VTdGF0ZTt9CnNldFN0eWxlPSJlcnJvciI7cmV0dXJuIGF0dHJTdGF0ZTt9CmZ1bmN0aW9uIGF0dHJFcVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0iZXF1YWxzIilyZXR1cm4gYXR0clZhbHVlU3RhdGU7aWYoIWNvbmZpZy5hbGxvd01pc3Npbmcpc2V0U3R5bGU9ImVycm9yIjtyZXR1cm4gYXR0clN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKTt9CmZ1bmN0aW9uIGF0dHJWYWx1ZVN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ic3RyaW5nIilyZXR1cm4gYXR0ckNvbnRpbnVlZFN0YXRlO2lmKHR5cGU9PSJ3b3JkIiYmY29uZmlnLmFsbG93VW5xdW90ZWQpe3NldFN0eWxlPSJzdHJpbmciO3JldHVybiBhdHRyU3RhdGU7fQpzZXRTdHlsZT0iZXJyb3IiO3JldHVybiBhdHRyU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpO30KZnVuY3Rpb24gYXR0ckNvbnRpbnVlZFN0YXRlKHR5cGUsc3RyZWFtLHN0YXRlKXtpZih0eXBlPT0ic3RyaW5nIilyZXR1cm4gYXR0ckNvbnRpbnVlZFN0YXRlO3JldHVybiBhdHRyU3RhdGUodHlwZSxzdHJlYW0sc3RhdGUpO30KcmV0dXJue3N0YXJ0U3RhdGU6ZnVuY3Rpb24oYmFzZUluZGVudCl7dmFyIHN0YXRlPXt0b2tlbml6ZTppblRleHQsc3RhdGU6YmFzZVN0YXRlLGluZGVudGVkOmJhc2VJbmRlbnR8fDAsdGFnTmFtZTpudWxsLHRhZ1N0YXJ0Om51bGwsY29udGV4dDpudWxsfQppZihiYXNlSW5kZW50IT1udWxsKXN0YXRlLmJhc2VJbmRlbnQ9YmFzZUluZGVudApyZXR1cm4gc3RhdGV9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnRhZ05hbWUmJnN0cmVhbS5zb2woKSkKc3RhdGUuaW5kZW50ZWQ9c3RyZWFtLmluZGVudGF0aW9uKCk7aWYoc3RyZWFtLmVhdFNwYWNlKCkpcmV0dXJuIG51bGw7dHlwZT1udWxsO3ZhciBzdHlsZT1zdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO2lmKChzdHlsZXx8dHlwZSkmJnN0eWxlIT0iY29tbWVudCIpe3NldFN0eWxlPW51bGw7c3RhdGUuc3RhdGU9c3RhdGUuc3RhdGUodHlwZXx8c3R5bGUsc3RyZWFtLHN0YXRlKTtpZihzZXRTdHlsZSkKc3R5bGU9c2V0U3R5bGU9PSJlcnJvciI/c3R5bGUrIiBlcnJvciI6c2V0U3R5bGU7fQpyZXR1cm4gc3R5bGU7fSxpbmRlbnQ6ZnVuY3Rpb24oc3RhdGUsdGV4dEFmdGVyLGZ1bGxMaW5lKXt2YXIgY29udGV4dD1zdGF0ZS5jb250ZXh0O2lmKHN0YXRlLnRva2VuaXplLmlzSW5BdHRyaWJ1dGUpe2lmKHN0YXRlLnRhZ1N0YXJ0PT1zdGF0ZS5pbmRlbnRlZCkKcmV0dXJuIHN0YXRlLnN0cmluZ1N0YXJ0Q29sKzE7ZWxzZQpyZXR1cm4gc3RhdGUuaW5kZW50ZWQraW5kZW50VW5pdDt9CmlmKGNvbnRleHQmJmNvbnRleHQubm9JbmRlbnQpcmV0dXJuIENvZGVNaXJyb3IuUGFzcztpZihzdGF0ZS50b2tlbml6ZSE9aW5UYWcmJnN0YXRlLnRva2VuaXplIT1pblRleHQpCnJldHVybiBmdWxsTGluZT9mdWxsTGluZS5tYXRjaCgvXihccyopLylbMF0ubGVuZ3RoOjA7aWYoc3RhdGUudGFnTmFtZSl7aWYoY29uZmlnLm11bHRpbGluZVRhZ0luZGVudFBhc3RUYWchPT1mYWxzZSkKcmV0dXJuIHN0YXRlLnRhZ1N0YXJ0K3N0YXRlLnRhZ05hbWUubGVuZ3RoKzI7ZWxzZQpyZXR1cm4gc3RhdGUudGFnU3RhcnQraW5kZW50VW5pdCooY29uZmlnLm11bHRpbGluZVRhZ0luZGVudEZhY3Rvcnx8MSk7fQppZihjb25maWcuYWxpZ25DREFUQSYmLzwhXFtDREFUQVxbLy50ZXN0KHRleHRBZnRlcikpcmV0dXJuIDA7dmFyIHRhZ0FmdGVyPXRleHRBZnRlciYmL148KFwvKT8oW1x3XzpcLi1dKikvLmV4ZWModGV4dEFmdGVyKTtpZih0YWdBZnRlciYmdGFnQWZ0ZXJbMV0pe3doaWxlKGNvbnRleHQpe2lmKGNvbnRleHQudGFnTmFtZT09dGFnQWZ0ZXJbMl0pe2NvbnRleHQ9Y29udGV4dC5wcmV2O2JyZWFrO31lbHNlIGlmKGNvbmZpZy5pbXBsaWNpdGx5Q2xvc2VkLmhhc093blByb3BlcnR5KGNvbnRleHQudGFnTmFtZSkpe2NvbnRleHQ9Y29udGV4dC5wcmV2O31lbHNle2JyZWFrO319fWVsc2UgaWYodGFnQWZ0ZXIpe3doaWxlKGNvbnRleHQpe3ZhciBncmFiYmVycz1jb25maWcuY29udGV4dEdyYWJiZXJzW2NvbnRleHQudGFnTmFtZV07aWYoZ3JhYmJlcnMmJmdyYWJiZXJzLmhhc093blByb3BlcnR5KHRhZ0FmdGVyWzJdKSkKY29udGV4dD1jb250ZXh0LnByZXY7ZWxzZQpicmVhazt9fQp3aGlsZShjb250ZXh0JiZjb250ZXh0LnByZXYmJiFjb250ZXh0LnN0YXJ0T2ZMaW5lKQpjb250ZXh0PWNvbnRleHQucHJldjtpZihjb250ZXh0KXJldHVybiBjb250ZXh0LmluZGVudCtpbmRlbnRVbml0O2Vsc2UgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnR8fDA7fSxlbGVjdHJpY0lucHV0Oi88XC9bXHNcdzpdKz4kLyxibG9ja0NvbW1lbnRTdGFydDoiPCEtLSIsYmxvY2tDb21tZW50RW5kOiItLT4iLGNvbmZpZ3VyYXRpb246Y29uZmlnLmh0bWxNb2RlPyJodG1sIjoieG1sIixoZWxwZXJUeXBlOmNvbmZpZy5odG1sTW9kZT8iaHRtbCI6InhtbCIsc2tpcEF0dHJpYnV0ZTpmdW5jdGlvbihzdGF0ZSl7aWYoc3RhdGUuc3RhdGU9PWF0dHJWYWx1ZVN0YXRlKQpzdGF0ZS5zdGF0ZT1hdHRyU3RhdGV9fTt9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveG1sIiwieG1sIik7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94bWwiLCJ4bWwiKTtpZighQ29kZU1pcnJvci5taW1lTW9kZXMuaGFzT3duUHJvcGVydHkoInRleHQvaHRtbCIpKQpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIse25hbWU6InhtbCIsaHRtbE1vZGU6dHJ1ZX0pO30pOzsoZnVuY3Rpb24obW9kKXtpZih0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiKQptb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSxyZXF1aXJlKCIuLi94bWwveG1sIikscmVxdWlyZSgiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IikscmVxdWlyZSgiLi4vY3NzL2NzcyIpKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpCmRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwiLi4veG1sL3htbCIsIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCIsIi4uL2Nzcy9jc3MiXSxtb2QpO2Vsc2UKbW9kKENvZGVNaXJyb3IpO30pKGZ1bmN0aW9uKENvZGVNaXJyb3IpeyJ1c2Ugc3RyaWN0Ijt2YXIgZGVmYXVsdFRhZ3M9e3NjcmlwdDpbWyJsYW5nIiwvKGphdmFzY3JpcHR8YmFiZWwpL2ksImphdmFzY3JpcHQiXSxbInR5cGUiLC9eKD86dGV4dHxhcHBsaWNhdGlvbilcLyg/OngtKT8oPzpqYXZhfGVjbWEpc2NyaXB0JHxebW9kdWxlJHxeJC9pLCJqYXZhc2NyaXB0Il0sWyJ0eXBlIiwvLi8sInRleHQvcGxhaW4iXSxbbnVsbCxudWxsLCJqYXZhc2NyaXB0Il1dLHN0eWxlOltbImxhbmciLC9eY3NzJC9pLCJjc3MiXSxbInR5cGUiLC9eKHRleHRcLyk/KHgtKT8oc3R5bGVzaGVldHxjc3MpJC9pLCJjc3MiXSxbInR5cGUiLC8uLywidGV4dC9wbGFpbiJdLFtudWxsLG51bGwsImNzcyJdXX07ZnVuY3Rpb24gbWF5YmVCYWNrdXAoc3RyZWFtLHBhdCxzdHlsZSl7dmFyIGN1cj1zdHJlYW0uY3VycmVudCgpLGNsb3NlPWN1ci5zZWFyY2gocGF0KTtpZihjbG9zZT4tMSl7c3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoLWNsb3NlKTt9ZWxzZSBpZihjdXIubWF0Y2goLzxcLz8kLykpe3N0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCk7aWYoIXN0cmVhbS5tYXRjaChwYXQsZmFsc2UpKXN0cmVhbS5tYXRjaChjdXIpO30KcmV0dXJuIHN0eWxlO30KdmFyIGF0dHJSZWdleHBDYWNoZT17fTtmdW5jdGlvbiBnZXRBdHRyUmVnZXhwKGF0dHIpe3ZhciByZWdleHA9YXR0clJlZ2V4cENhY2hlW2F0dHJdO2lmKHJlZ2V4cClyZXR1cm4gcmVnZXhwO3JldHVybiBhdHRyUmVnZXhwQ2FjaGVbYXR0cl09bmV3IFJlZ0V4cCgiXFxzKyIrYXR0cisiXFxzKj1cXHMqKCd8XCIpPyhbXidcIl0rKSgnfFwiKT9cXHMqIik7fQpmdW5jdGlvbiBnZXRBdHRyVmFsdWUodGV4dCxhdHRyKXt2YXIgbWF0Y2g9dGV4dC5tYXRjaChnZXRBdHRyUmVnZXhwKGF0dHIpKQpyZXR1cm4gbWF0Y2g/L15ccyooLio/KVxzKiQvLmV4ZWMobWF0Y2hbMl0pWzFdOiIifQpmdW5jdGlvbiBnZXRUYWdSZWdleHAodGFnTmFtZSxhbmNob3JlZCl7cmV0dXJuIG5ldyBSZWdFeHAoKGFuY2hvcmVkPyJeIjoiIikrIjxcL1xzKiIrdGFnTmFtZSsiXHMqPiIsImkiKTt9CmZ1bmN0aW9uIGFkZFRhZ3MoZnJvbSx0byl7Zm9yKHZhciB0YWcgaW4gZnJvbSl7dmFyIGRlc3Q9dG9bdGFnXXx8KHRvW3RhZ109W10pO3ZhciBzb3VyY2U9ZnJvbVt0YWddO2Zvcih2YXIgaT1zb3VyY2UubGVuZ3RoLTE7aT49MDtpLS0pCmRlc3QudW5zaGlmdChzb3VyY2VbaV0pfX0KZnVuY3Rpb24gZmluZE1hdGNoaW5nTW9kZSh0YWdJbmZvLHRhZ1RleHQpe2Zvcih2YXIgaT0wO2k8dGFnSW5mby5sZW5ndGg7aSsrKXt2YXIgc3BlYz10YWdJbmZvW2ldO2lmKCFzcGVjWzBdfHxzcGVjWzFdLnRlc3QoZ2V0QXR0clZhbHVlKHRhZ1RleHQsc3BlY1swXSkpKXJldHVybiBzcGVjWzJdO319CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaHRtbG1peGVkIixmdW5jdGlvbihjb25maWcscGFyc2VyQ29uZmlnKXt2YXIgaHRtbE1vZGU9Q29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZyx7bmFtZToieG1sIixodG1sTW9kZTp0cnVlLG11bHRpbGluZVRhZ0luZGVudEZhY3RvcjpwYXJzZXJDb25maWcubXVsdGlsaW5lVGFnSW5kZW50RmFjdG9yLG11bHRpbGluZVRhZ0luZGVudFBhc3RUYWc6cGFyc2VyQ29uZmlnLm11bHRpbGluZVRhZ0luZGVudFBhc3RUYWd9KTt2YXIgdGFncz17fTt2YXIgY29uZmlnVGFncz1wYXJzZXJDb25maWcmJnBhcnNlckNvbmZpZy50YWdzLGNvbmZpZ1NjcmlwdD1wYXJzZXJDb25maWcmJnBhcnNlckNvbmZpZy5zY3JpcHRUeXBlczthZGRUYWdzKGRlZmF1bHRUYWdzLHRhZ3MpO2lmKGNvbmZpZ1RhZ3MpYWRkVGFncyhjb25maWdUYWdzLHRhZ3MpO2lmKGNvbmZpZ1NjcmlwdClmb3IodmFyIGk9Y29uZmlnU2NyaXB0Lmxlbmd0aC0xO2k+PTA7aS0tKQp0YWdzLnNjcmlwdC51bnNoaWZ0KFsidHlwZSIsY29uZmlnU2NyaXB0W2ldLm1hdGNoZXMsY29uZmlnU2NyaXB0W2ldLm1vZGVdKQpmdW5jdGlvbiBodG1sKHN0cmVhbSxzdGF0ZSl7dmFyIHN0eWxlPWh0bWxNb2RlLnRva2VuKHN0cmVhbSxzdGF0ZS5odG1sU3RhdGUpLHRhZz0vXGJ0YWdcYi8udGVzdChzdHlsZSksdGFnTmFtZQppZih0YWcmJiEvWzw+XHNcL10vLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkmJih0YWdOYW1lPXN0YXRlLmh0bWxTdGF0ZS50YWdOYW1lJiZzdGF0ZS5odG1sU3RhdGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSYmdGFncy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSl7c3RhdGUuaW5UYWc9dGFnTmFtZSsiICJ9ZWxzZSBpZihzdGF0ZS5pblRhZyYmdGFnJiYvPiQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpe3ZhciBpblRhZz0vXihbXFNdKykgKC4qKS8uZXhlYyhzdGF0ZS5pblRhZykKc3RhdGUuaW5UYWc9bnVsbAp2YXIgbW9kZVNwZWM9c3RyZWFtLmN1cnJlbnQoKT09Ij4iJiZmaW5kTWF0Y2hpbmdNb2RlKHRhZ3NbaW5UYWdbMV1dLGluVGFnWzJdKQp2YXIgbW9kZT1Db2RlTWlycm9yLmdldE1vZGUoY29uZmlnLG1vZGVTcGVjKQp2YXIgZW5kVGFnQT1nZXRUYWdSZWdleHAoaW5UYWdbMV0sdHJ1ZSksZW5kVGFnPWdldFRhZ1JlZ2V4cChpblRhZ1sxXSxmYWxzZSk7c3RhdGUudG9rZW49ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXtpZihzdHJlYW0ubWF0Y2goZW5kVGFnQSxmYWxzZSkpe3N0YXRlLnRva2VuPWh0bWw7c3RhdGUubG9jYWxTdGF0ZT1zdGF0ZS5sb2NhbE1vZGU9bnVsbDtyZXR1cm4gbnVsbDt9CnJldHVybiBtYXliZUJhY2t1cChzdHJlYW0sZW5kVGFnLHN0YXRlLmxvY2FsTW9kZS50b2tlbihzdHJlYW0sc3RhdGUubG9jYWxTdGF0ZSkpO307c3RhdGUubG9jYWxNb2RlPW1vZGU7c3RhdGUubG9jYWxTdGF0ZT1Db2RlTWlycm9yLnN0YXJ0U3RhdGUobW9kZSxodG1sTW9kZS5pbmRlbnQoc3RhdGUuaHRtbFN0YXRlLCIiKSk7fWVsc2UgaWYoc3RhdGUuaW5UYWcpe3N0YXRlLmluVGFnKz1zdHJlYW0uY3VycmVudCgpCmlmKHN0cmVhbS5lb2woKSlzdGF0ZS5pblRhZys9IiAifQpyZXR1cm4gc3R5bGU7fTtyZXR1cm57c3RhcnRTdGF0ZTpmdW5jdGlvbigpe3ZhciBzdGF0ZT1Db2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpO3JldHVybnt0b2tlbjpodG1sLGluVGFnOm51bGwsbG9jYWxNb2RlOm51bGwsbG9jYWxTdGF0ZTpudWxsLGh0bWxTdGF0ZTpzdGF0ZX07fSxjb3B5U3RhdGU6ZnVuY3Rpb24oc3RhdGUpe3ZhciBsb2NhbDtpZihzdGF0ZS5sb2NhbFN0YXRlKXtsb2NhbD1Db2RlTWlycm9yLmNvcHlTdGF0ZShzdGF0ZS5sb2NhbE1vZGUsc3RhdGUubG9jYWxTdGF0ZSk7fQpyZXR1cm57dG9rZW46c3RhdGUudG9rZW4saW5UYWc6c3RhdGUuaW5UYWcsbG9jYWxNb2RlOnN0YXRlLmxvY2FsTW9kZSxsb2NhbFN0YXRlOmxvY2FsLGh0bWxTdGF0ZTpDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSxzdGF0ZS5odG1sU3RhdGUpfTt9LHRva2VuOmZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7cmV0dXJuIHN0YXRlLnRva2VuKHN0cmVhbSxzdGF0ZSk7fSxpbmRlbnQ6ZnVuY3Rpb24oc3RhdGUsdGV4dEFmdGVyLGxpbmUpe2lmKCFzdGF0ZS5sb2NhbE1vZGV8fC9eXHMqPFwvLy50ZXN0KHRleHRBZnRlcikpCnJldHVybiBodG1sTW9kZS5pbmRlbnQoc3RhdGUuaHRtbFN0YXRlLHRleHRBZnRlcik7ZWxzZSBpZihzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KQpyZXR1cm4gc3RhdGUubG9jYWxNb2RlLmluZGVudChzdGF0ZS5sb2NhbFN0YXRlLHRleHRBZnRlcixsaW5lKTtlbHNlCnJldHVybiBDb2RlTWlycm9yLlBhc3M7fSxpbm5lck1vZGU6ZnVuY3Rpb24oc3RhdGUpe3JldHVybntzdGF0ZTpzdGF0ZS5sb2NhbFN0YXRlfHxzdGF0ZS5odG1sU3RhdGUsbW9kZTpzdGF0ZS5sb2NhbE1vZGV8fGh0bWxNb2RlfTt9fTt9LCJ4bWwiLCJqYXZhc2NyaXB0IiwiY3NzIik7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2h0bWwiLCJodG1sbWl4ZWQiKTt9KTs7KGZ1bmN0aW9uKG1vZCl7aWYodHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IikKbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikscmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4IikpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCkKZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwiLi4vLi4vYWRkb24vbW9kZS9tdWx0aXBsZXgiXSxtb2QpO2Vsc2UKbW9kKENvZGVNaXJyb3IpO30pKGZ1bmN0aW9uKENvZGVNaXJyb3IpeyJ1c2Ugc3RyaWN0IjtDb2RlTWlycm9yLmRlZmluZU1vZGUoImh0bWxlbWJlZGRlZCIsZnVuY3Rpb24oY29uZmlnLHBhcnNlckNvbmZpZyl7cmV0dXJuIENvZGVNaXJyb3IubXVsdGlwbGV4aW5nTW9kZShDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCJodG1sbWl4ZWQiKSx7b3BlbjpwYXJzZXJDb25maWcub3Blbnx8cGFyc2VyQ29uZmlnLnNjcmlwdFN0YXJ0UmVnZXh8fCI8JSIsY2xvc2U6cGFyc2VyQ29uZmlnLmNsb3NlfHxwYXJzZXJDb25maWcuc2NyaXB0RW5kUmVnZXh8fCIlPiIsbW9kZTpDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLHBhcnNlckNvbmZpZy5zY3JpcHRpbmdNb2RlU3BlYyl9KTt9LCJodG1sbWl4ZWQiKTtDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtZWpzIix7bmFtZToiaHRtbGVtYmVkZGVkIixzY3JpcHRpbmdNb2RlU3BlYzoiamF2YXNjcmlwdCJ9KTtDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtYXNweCIse25hbWU6Imh0bWxlbWJlZGRlZCIsc2NyaXB0aW5nTW9kZVNwZWM6InRleHQveC1jc2hhcnAifSk7Q29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWpzcCIse25hbWU6Imh0bWxlbWJlZGRlZCIsc2NyaXB0aW5nTW9kZVNwZWM6InRleHQveC1qYXZhIn0pO0NvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1lcmIiLHtuYW1lOiJodG1sZW1iZWRkZWQiLHNjcmlwdGluZ01vZGVTcGVjOiJydWJ5In0pO30pOztUZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscz17fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1Bvcz1mdW5jdGlvbihyYW5nZSl7cmV0dXJue3N0YXJ0Om5ldyBDb2RlTWlycm9yLlBvcyhyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pLGVuZDpuZXcgQ29kZU1pcnJvci5Qb3MocmFuZ2UuZW5kTGluZSxyYW5nZS5lbmRDb2x1bW4pfTt9O1RleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnRvUmFuZ2U9ZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4gbmV3IFRleHRVdGlscy5UZXh0UmFuZ2Uoc3RhcnQubGluZSxzdGFydC5jaCxlbmQubGluZSxlbmQuY2gpO307VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMuY2hhbmdlT2JqZWN0VG9FZGl0T3BlcmF0aW9uPWZ1bmN0aW9uKGNoYW5nZU9iamVjdCl7Y29uc3Qgb2xkUmFuZ2U9VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9SYW5nZShjaGFuZ2VPYmplY3QuZnJvbSxjaGFuZ2VPYmplY3QudG8pO2NvbnN0IG5ld1JhbmdlPW9sZFJhbmdlLmNsb25lKCk7Y29uc3QgbGluZXNBZGRlZD1jaGFuZ2VPYmplY3QudGV4dC5sZW5ndGg7aWYobGluZXNBZGRlZD09PTApe25ld1JhbmdlLmVuZExpbmU9bmV3UmFuZ2Uuc3RhcnRMaW5lO25ld1JhbmdlLmVuZENvbHVtbj1uZXdSYW5nZS5zdGFydENvbHVtbjt9ZWxzZSBpZihsaW5lc0FkZGVkPT09MSl7bmV3UmFuZ2UuZW5kTGluZT1uZXdSYW5nZS5zdGFydExpbmU7bmV3UmFuZ2UuZW5kQ29sdW1uPW5ld1JhbmdlLnN0YXJ0Q29sdW1uK2NoYW5nZU9iamVjdC50ZXh0WzBdLmxlbmd0aDt9ZWxzZXtuZXdSYW5nZS5lbmRMaW5lPW5ld1JhbmdlLnN0YXJ0TGluZStsaW5lc0FkZGVkLTE7bmV3UmFuZ2UuZW5kQ29sdW1uPWNoYW5nZU9iamVjdC50ZXh0W2xpbmVzQWRkZWQtMV0ubGVuZ3RoO30KcmV0dXJue29sZFJhbmdlOm9sZFJhbmdlLG5ld1JhbmdlOm5ld1JhbmdlfTt9O1RleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnB1bGxMaW5lcz1mdW5jdGlvbihjb2RlTWlycm9yLGxpbmVzQ291bnQpe2NvbnN0IGxpbmVzPVtdO2NvZGVNaXJyb3IuZWFjaExpbmUoMCxsaW5lc0NvdW50LG9uTGluZUhhbmRsZSk7cmV0dXJuIGxpbmVzO2Z1bmN0aW9uIG9uTGluZUhhbmRsZShsaW5lSGFuZGxlKXtsaW5lcy5wdXNoKGxpbmVIYW5kbGUudGV4dCk7fX07VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMuYXBwZW5kVGhlbWVTdHlsZT1mdW5jdGlvbihlbGVtZW50KXtpZihVSS50aGVtZVN1cHBvcnQuaGFzVGhlbWUoKSkKcmV0dXJuO2NvbnN0IGJhY2tncm91bmRDb2xvcj1JbnNwZWN0b3JGcm9udGVuZEhvc3QuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7Y29uc3QgZm9yZWdyb3VuZENvbG9yPUluc3BlY3RvckZyb250ZW5kSG9zdC5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKTtjb25zdCBpbmFjdGl2ZUJhY2tncm91bmRDb2xvcj1JbnNwZWN0b3JGcm9udGVuZEhvc3QuZ2V0SW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKTtjb25zdCBpbmFjdGl2ZUZvcmVncm91bmRDb2xvcj1JbnNwZWN0b3JGcm9udGVuZEhvc3QuZ2V0SW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKTtjb25zdCBzdHlsZT1jcmVhdGVFbGVtZW50KCdzdHlsZScpO3N0eWxlLnRleHRDb250ZW50PWAKICAgIC5Db2RlTWlycm9yIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtpbmFjdGl2ZUJhY2tncm91bmRDb2xvcn07CiAgICB9CgogICAgLkNvZGVNaXJyb3IgLkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0Om5vdCguQ29kZU1pcnJvci1wZXJzaXN0LWhpZ2hsaWdodCkgewogICAgICBjb2xvcjogJHtpbmFjdGl2ZUZvcmVncm91bmRDb2xvcn0gIWltcG9ydGFudDsKICAgIH0KCiAgICAuQ29kZU1pcnJvci1mb2N1c2VkIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtiYWNrZ3JvdW5kQ29sb3J9OwogICAgfQoKICAgIC5Db2RlTWlycm9yLWZvY3VzZWQgLkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0Om5vdCguQ29kZU1pcnJvci1wZXJzaXN0LWhpZ2hsaWdodCkgewogICAgICBjb2xvcjogJHtmb3JlZ3JvdW5kQ29sb3J9ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkNvZGVNaXJyb3IgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLAogICAgLkNvZGVNaXJyb3IgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwKICAgIC5Db2RlTWlycm9yIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsKICAgICAgYmFja2dyb3VuZDogJHtiYWNrZ3JvdW5kQ29sb3J9OwogICAgICBjb2xvcjogJHtmb3JlZ3JvdW5kQ29sb3J9ICFpbXBvcnRhbnQ7CiAgICB9CiAgYDtlbGVtZW50LmFwcGVuZENoaWxkKHN0eWxlKTt9O1RleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLlRva2VuaXplckZhY3Rvcnk9Y2xhc3N7Y3JlYXRlVG9rZW5pemVyKG1pbWVUeXBlKXtjb25zdCBtb2RlPUNvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDoyfSxtaW1lVHlwZSk7Y29uc3Qgc3RhdGU9Q29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGUpO2Z1bmN0aW9uIHRva2VuaXplKGxpbmUsY2FsbGJhY2spe2NvbnN0IHN0cmVhbT1uZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZSk7d2hpbGUoIXN0cmVhbS5lb2woKSl7Y29uc3Qgc3R5bGU9bW9kZS50b2tlbihzdHJlYW0sc3RhdGUpO2NvbnN0IHZhbHVlPXN0cmVhbS5jdXJyZW50KCk7Y2FsbGJhY2sodmFsdWUsc3R5bGUsc3RyZWFtLnN0YXJ0LHN0cmVhbS5zdGFydCt2YWx1ZS5sZW5ndGgpO3N0cmVhbS5zdGFydD1zdHJlYW0ucG9zO319CnJldHVybiB0b2tlbml6ZTt9fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JDU1NMb2FkVmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2NtL2NvZGVtaXJyb3IuY3NzJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd0ZXh0X2VkaXRvci9jbWRldnRvb2xzLmNzcycpO1RleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLmFwcGVuZFRoZW1lU3R5bGUodGhpcy5lbGVtZW50KTt9fTs7VGV4dEVkaXRvci5UZXh0RWRpdG9yQXV0b2NvbXBsZXRlQ29udHJvbGxlcj1jbGFzc3tjb25zdHJ1Y3Rvcih0ZXh0RWRpdG9yLGNvZGVNaXJyb3IsY29uZmlnKXt0aGlzLl90ZXh0RWRpdG9yPXRleHRFZGl0b3I7dGhpcy5fY29kZU1pcnJvcj1jb2RlTWlycm9yO3RoaXMuX2NvbmZpZz1jb25maWc7dGhpcy5faW5pdGlhbGl6ZWQ9ZmFsc2U7dGhpcy5fb25TY3JvbGw9dGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9vbkN1cnNvckFjdGl2aXR5PXRoaXMuX29uQ3Vyc29yQWN0aXZpdHkuYmluZCh0aGlzKTt0aGlzLl9jaGFuZ2VzPXRoaXMuX2NoYW5nZXMuYmluZCh0aGlzKTt0aGlzLl9ibHVyPXRoaXMuX2JsdXIuYmluZCh0aGlzKTt0aGlzLl9iZWZvcmVDaGFuZ2U9dGhpcy5fYmVmb3JlQ2hhbmdlLmJpbmQodGhpcyk7dGhpcy5fbW91c2VEb3duPSgpPT57dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO3RoaXMuX3Rvb2x0aXBHbGFzc1BhbmUuaGlkZSgpO307dGhpcy5fY29kZU1pcnJvci5vbignY2hhbmdlcycsdGhpcy5fY2hhbmdlcyk7dGhpcy5fbGFzdEhpbnRUZXh0PScnO3RoaXMuX3N1Z2dlc3RCb3g9bnVsbDt0aGlzLl9jdXJyZW50U3VnZ2VzdGlvbj1udWxsO3RoaXMuX2hpbnRFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdhdXRvLWNvbXBsZXRlLXRleHQnKTt0aGlzLl90b29sdGlwR2xhc3NQYW5lPW5ldyBVSS5HbGFzc1BhbmUoKTt0aGlzLl90b29sdGlwR2xhc3NQYW5lLnNldFNpemVCZWhhdmlvcihVSS5HbGFzc1BhbmUuU2l6ZUJlaGF2aW9yLk1lYXN1cmVDb250ZW50KTt0aGlzLl90b29sdGlwR2xhc3NQYW5lLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKHRoaXMuX3Rvb2x0aXBHbGFzc1BhbmUuaGlkZS5iaW5kKHRoaXMuX3Rvb2x0aXBHbGFzc1BhbmUpKTt0aGlzLl90b29sdGlwRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdhdXRvY29tcGxldGUtdG9vbHRpcCcpO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuX3Rvb2x0aXBHbGFzc1BhbmUuY29udGVudEVsZW1lbnQsJ3RleHRfZWRpdG9yL2F1dG9jb21wbGV0ZVRvb2x0aXAuY3NzJyk7c2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLl90b29sdGlwRWxlbWVudCk7fQpfaW5pdGlhbGl6ZUlmTmVlZGVkKCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpCnJldHVybjt0aGlzLl9pbml0aWFsaXplZD10cnVlO3RoaXMuX2NvZGVNaXJyb3Iub24oJ3Njcm9sbCcsdGhpcy5fb25TY3JvbGwpO3RoaXMuX2NvZGVNaXJyb3Iub24oJ2N1cnNvckFjdGl2aXR5Jyx0aGlzLl9vbkN1cnNvckFjdGl2aXR5KTt0aGlzLl9jb2RlTWlycm9yLm9uKCdtb3VzZWRvd24nLHRoaXMuX21vdXNlRG93bik7dGhpcy5fY29kZU1pcnJvci5vbignYmx1cicsdGhpcy5fYmx1cik7aWYodGhpcy5fY29uZmlnLmlzV29yZENoYXIpe3RoaXMuX2NvZGVNaXJyb3Iub24oJ2JlZm9yZUNoYW5nZScsdGhpcy5fYmVmb3JlQ2hhbmdlKTt0aGlzLl9kaWN0aW9uYXJ5PW5ldyBDb21tb24uVGV4dERpY3Rpb25hcnkoKTt0aGlzLl9hZGRXb3Jkc0Zyb21UZXh0KHRoaXMuX2NvZGVNaXJyb3IuZ2V0VmFsdWUoKSk7fX0KZGlzcG9zZSgpe3RoaXMuX2NvZGVNaXJyb3Iub2ZmKCdjaGFuZ2VzJyx0aGlzLl9jaGFuZ2VzKTtpZih0aGlzLl9pbml0aWFsaXplZCl7dGhpcy5fY29kZU1pcnJvci5vZmYoJ3Njcm9sbCcsdGhpcy5fb25TY3JvbGwpO3RoaXMuX2NvZGVNaXJyb3Iub2ZmKCdjdXJzb3JBY3Rpdml0eScsdGhpcy5fb25DdXJzb3JBY3Rpdml0eSk7dGhpcy5fY29kZU1pcnJvci5vZmYoJ21vdXNlZG93bicsdGhpcy5fbW91c2VEb3duKTt0aGlzLl9jb2RlTWlycm9yLm9mZignYmx1cicsdGhpcy5fYmx1cik7fQppZih0aGlzLl9kaWN0aW9uYXJ5KXt0aGlzLl9jb2RlTWlycm9yLm9mZignYmVmb3JlQ2hhbmdlJyx0aGlzLl9iZWZvcmVDaGFuZ2UpO3RoaXMuX2RpY3Rpb25hcnkucmVzZXQoKTt9fQpfYmVmb3JlQ2hhbmdlKGNvZGVNaXJyb3IsY2hhbmdlT2JqZWN0KXt0aGlzLl91cGRhdGVkTGluZXM9dGhpcy5fdXBkYXRlZExpbmVzfHx7fTtmb3IobGV0IGk9Y2hhbmdlT2JqZWN0LmZyb20ubGluZTtpPD1jaGFuZ2VPYmplY3QudG8ubGluZTsrK2kpe2lmKHRoaXMuX3VwZGF0ZWRMaW5lc1tpXT09PXVuZGVmaW5lZCkKdGhpcy5fdXBkYXRlZExpbmVzW2ldPXRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZShpKTt9fQpfYWRkV29yZHNGcm9tVGV4dCh0ZXh0KXtUZXh0VXRpbHMuVGV4dFV0aWxzLnRleHRUb1dvcmRzKHRleHQsKHRoaXMuX2NvbmZpZy5pc1dvcmRDaGFyKSxhZGRXb3JkLmJpbmQodGhpcykpO2Z1bmN0aW9uIGFkZFdvcmQod29yZCl7aWYod29yZC5sZW5ndGgmJih3b3JkWzBdPCcwJ3x8d29yZFswXT4nOScpKQp0aGlzLl9kaWN0aW9uYXJ5LmFkZFdvcmQod29yZCk7fX0KX3JlbW92ZVdvcmRzRnJvbVRleHQodGV4dCl7VGV4dFV0aWxzLlRleHRVdGlscy50ZXh0VG9Xb3Jkcyh0ZXh0LCh0aGlzLl9jb25maWcuaXNXb3JkQ2hhciksd29yZD0+dGhpcy5fZGljdGlvbmFyeS5yZW1vdmVXb3JkKHdvcmQpKTt9Cl9zdWJzdGl0dXRlUmFuZ2UobGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2xldCByYW5nZT10aGlzLl9jb25maWcuc3Vic3RpdHV0ZVJhbmdlQ2FsbGJhY2s/dGhpcy5fY29uZmlnLnN1YnN0aXR1dGVSYW5nZUNhbGxiYWNrKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKTpudWxsO2lmKCFyYW5nZSYmdGhpcy5fY29uZmlnLmlzV29yZENoYXIpCnJhbmdlPXRoaXMuX3RleHRFZGl0b3Iud29yZFJhbmdlRm9yQ3Vyc29yUG9zaXRpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIsdGhpcy5fY29uZmlnLmlzV29yZENoYXIpO3JldHVybiByYW5nZTt9Cl93b3Jkc1dpdGhRdWVyeShxdWVyeVJhbmdlLHN1YnN0aXR1dGVSYW5nZSxmb3JjZSl7Y29uc3QgZXh0ZXJuYWw9dGhpcy5fY29uZmlnLnN1Z2dlc3Rpb25zQ2FsbGJhY2s/dGhpcy5fY29uZmlnLnN1Z2dlc3Rpb25zQ2FsbGJhY2socXVlcnlSYW5nZSxzdWJzdGl0dXRlUmFuZ2UsZm9yY2UpOm51bGw7aWYoZXh0ZXJuYWwpCnJldHVybiBleHRlcm5hbDtpZighdGhpcy5fZGljdGlvbmFyeXx8KCFmb3JjZSYmcXVlcnlSYW5nZS5pc0VtcHR5KCkpKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtsZXQgY29tcGxldGlvbnM9dGhpcy5fZGljdGlvbmFyeS53b3Jkc1dpdGhQcmVmaXgodGhpcy5fdGV4dEVkaXRvci50ZXh0KHF1ZXJ5UmFuZ2UpKTtjb25zdCBzdWJzdGl0dXRlV29yZD10aGlzLl90ZXh0RWRpdG9yLnRleHQoc3Vic3RpdHV0ZVJhbmdlKTtpZih0aGlzLl9kaWN0aW9uYXJ5LndvcmRDb3VudChzdWJzdGl0dXRlV29yZCk9PT0xKQpjb21wbGV0aW9ucz1jb21wbGV0aW9ucy5maWx0ZXIod29yZD0+d29yZCE9PXN1YnN0aXR1dGVXb3JkKTtjb21wbGV0aW9ucy5zb3J0KChhLGIpPT50aGlzLl9kaWN0aW9uYXJ5LndvcmRDb3VudChiKS10aGlzLl9kaWN0aW9uYXJ5LndvcmRDb3VudChhKXx8YS5sZW5ndGgtYi5sZW5ndGgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoY29tcGxldGlvbnMubWFwKGl0ZW09Pih7dGV4dDppdGVtfSkpKTt9Cl9jaGFuZ2VzKGNvZGVNaXJyb3IsY2hhbmdlcyl7aWYoIWNoYW5nZXMubGVuZ3RoKQpyZXR1cm47aWYodGhpcy5fZGljdGlvbmFyeSYmdGhpcy5fdXBkYXRlZExpbmVzKXtmb3IoY29uc3QgbGluZU51bWJlciBpbiB0aGlzLl91cGRhdGVkTGluZXMpCnRoaXMuX3JlbW92ZVdvcmRzRnJvbVRleHQodGhpcy5fdXBkYXRlZExpbmVzW2xpbmVOdW1iZXJdKTtkZWxldGUgdGhpcy5fdXBkYXRlZExpbmVzO2NvbnN0IGxpbmVzVG9VcGRhdGU9e307Zm9yKGxldCBjaGFuZ2VJbmRleD0wO2NoYW5nZUluZGV4PGNoYW5nZXMubGVuZ3RoOysrY2hhbmdlSW5kZXgpe2NvbnN0IGNoYW5nZU9iamVjdD1jaGFuZ2VzW2NoYW5nZUluZGV4XTtjb25zdCBlZGl0SW5mbz1UZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy5jaGFuZ2VPYmplY3RUb0VkaXRPcGVyYXRpb24oY2hhbmdlT2JqZWN0KTtmb3IobGV0IGk9ZWRpdEluZm8ubmV3UmFuZ2Uuc3RhcnRMaW5lO2k8PWVkaXRJbmZvLm5ld1JhbmdlLmVuZExpbmU7KytpKQpsaW5lc1RvVXBkYXRlW2ldPXRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZShpKTt9CmZvcihjb25zdCBsaW5lTnVtYmVyIGluIGxpbmVzVG9VcGRhdGUpCnRoaXMuX2FkZFdvcmRzRnJvbVRleHQobGluZXNUb1VwZGF0ZVtsaW5lTnVtYmVyXSk7fQpsZXQgc2luZ2xlQ2hhcklucHV0PWZhbHNlO2xldCBzaW5nbGVDaGFyRGVsZXRlPWZhbHNlO2NvbnN0IGN1cnNvcj10aGlzLl9jb2RlTWlycm9yLmdldEN1cnNvcignaGVhZCcpO2ZvcihsZXQgY2hhbmdlSW5kZXg9MDtjaGFuZ2VJbmRleDxjaGFuZ2VzLmxlbmd0aDsrK2NoYW5nZUluZGV4KXtjb25zdCBjaGFuZ2VPYmplY3Q9Y2hhbmdlc1tjaGFuZ2VJbmRleF07aWYoY2hhbmdlT2JqZWN0Lm9yaWdpbj09PScraW5wdXQnJiZjaGFuZ2VPYmplY3QudGV4dC5sZW5ndGg9PT0xJiZjaGFuZ2VPYmplY3QudGV4dFswXS5sZW5ndGg9PT0xJiZjaGFuZ2VPYmplY3QudG8ubGluZT09PWN1cnNvci5saW5lJiZjaGFuZ2VPYmplY3QudG8uY2grMT09PWN1cnNvci5jaCl7c2luZ2xlQ2hhcklucHV0PXRydWU7YnJlYWs7fQppZihjaGFuZ2VPYmplY3Qub3JpZ2luPT09JytkZWxldGUnJiZjaGFuZ2VPYmplY3QucmVtb3ZlZC5sZW5ndGg9PT0xJiZjaGFuZ2VPYmplY3QucmVtb3ZlZFswXS5sZW5ndGg9PT0xJiZjaGFuZ2VPYmplY3QudG8ubGluZT09PWN1cnNvci5saW5lJiZjaGFuZ2VPYmplY3QudG8uY2gtMT09PWN1cnNvci5jaCl7c2luZ2xlQ2hhckRlbGV0ZT10cnVlO2JyZWFrO319CmlmKHRoaXMuX3F1ZXJ5UmFuZ2Upe2lmKHNpbmdsZUNoYXJJbnB1dCkKdGhpcy5fcXVlcnlSYW5nZS5lbmRDb2x1bW4rKztlbHNlIGlmKHNpbmdsZUNoYXJEZWxldGUpCnRoaXMuX3F1ZXJ5UmFuZ2UuZW5kQ29sdW1uLS07aWYoc2luZ2xlQ2hhckRlbGV0ZXx8c2luZ2xlQ2hhcklucHV0KQp0aGlzLl9zZXRIaW50KHRoaXMuX2xhc3RIaW50VGV4dCk7fQppZihzaW5nbGVDaGFySW5wdXR8fHNpbmdsZUNoYXJEZWxldGUpCnNldEltbWVkaWF0ZSh0aGlzLmF1dG9jb21wbGV0ZS5iaW5kKHRoaXMpKTtlbHNlCnRoaXMuY2xlYXJBdXRvY29tcGxldGUoKTt9Cl9ibHVyKCl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO30KX3ZhbGlkYXRlU2VsZWN0aW9uc0NvbnRleHRzKG1haW5TZWxlY3Rpb24pe2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5fY29kZU1pcnJvci5saXN0U2VsZWN0aW9ucygpO2lmKHNlbGVjdGlvbnMubGVuZ3RoPD0xKQpyZXR1cm4gdHJ1ZTtjb25zdCBtYWluU2VsZWN0aW9uQ29udGV4dD10aGlzLl90ZXh0RWRpdG9yLnRleHQobWFpblNlbGVjdGlvbik7Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHdvcmRSYW5nZT10aGlzLl9zdWJzdGl0dXRlUmFuZ2Uoc2VsZWN0aW9uc1tpXS5oZWFkLmxpbmUsc2VsZWN0aW9uc1tpXS5oZWFkLmNoKTtpZighd29yZFJhbmdlKQpyZXR1cm4gZmFsc2U7Y29uc3QgY29udGV4dD10aGlzLl90ZXh0RWRpdG9yLnRleHQod29yZFJhbmdlKTtpZihjb250ZXh0IT09bWFpblNlbGVjdGlvbkNvbnRleHQpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30KYXV0b2NvbXBsZXRlKGZvcmNlKXt0aGlzLl9pbml0aWFsaXplSWZOZWVkZWQoKTtpZih0aGlzLl9jb2RlTWlycm9yLnNvbWV0aGluZ1NlbGVjdGVkKCkpe3RoaXMuX2hpZGVTdWdnZXN0Qm94KCk7cmV0dXJuO30KY29uc3QgY3Vyc29yPXRoaXMuX2NvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdoZWFkJyk7Y29uc3Qgc3Vic3RpdHV0ZVJhbmdlPXRoaXMuX3N1YnN0aXR1dGVSYW5nZShjdXJzb3IubGluZSxjdXJzb3IuY2gpO2lmKCFzdWJzdGl0dXRlUmFuZ2V8fCF0aGlzLl92YWxpZGF0ZVNlbGVjdGlvbnNDb250ZXh0cyhzdWJzdGl0dXRlUmFuZ2UpKXt0aGlzLl9oaWRlU3VnZ2VzdEJveCgpO3JldHVybjt9CmNvbnN0IHF1ZXJ5UmFuZ2U9c3Vic3RpdHV0ZVJhbmdlLmNsb25lKCk7cXVlcnlSYW5nZS5lbmRDb2x1bW49Y3Vyc29yLmNoO2NvbnN0IHF1ZXJ5PXRoaXMuX3RleHRFZGl0b3IudGV4dChxdWVyeVJhbmdlKTtsZXQgaGFkU3VnZ2VzdEJveD1mYWxzZTtpZih0aGlzLl9zdWdnZXN0Qm94KQpoYWRTdWdnZXN0Qm94PXRydWU7dGhpcy5fd29yZHNXaXRoUXVlcnkocXVlcnlSYW5nZSxzdWJzdGl0dXRlUmFuZ2UsZm9yY2UpLnRoZW4od29yZHNBY3F1aXJlZC5iaW5kKHRoaXMpKTtmdW5jdGlvbiB3b3Jkc0FjcXVpcmVkKHdvcmRzV2l0aFF1ZXJ5KXtpZighd29yZHNXaXRoUXVlcnkubGVuZ3RofHwod29yZHNXaXRoUXVlcnkubGVuZ3RoPT09MSYmcXVlcnk9PT13b3Jkc1dpdGhRdWVyeVswXS50ZXh0KXx8KCF0aGlzLl9zdWdnZXN0Qm94JiZoYWRTdWdnZXN0Qm94KSl7dGhpcy5faGlkZVN1Z2dlc3RCb3goKTt0aGlzLl9vblN1Z2dlc3Rpb25zU2hvd25Gb3JUZXN0KFtdKTtyZXR1cm47fQppZighdGhpcy5fc3VnZ2VzdEJveCl7dGhpcy5fc3VnZ2VzdEJveD1uZXcgVUkuU3VnZ2VzdEJveCh0aGlzLDIwKTtpZih0aGlzLl9jb25maWcuYW5jaG9yQmVoYXZpb3IpCnRoaXMuX3N1Z2dlc3RCb3guc2V0QW5jaG9yQmVoYXZpb3IodGhpcy5fY29uZmlnLmFuY2hvckJlaGF2aW9yKTt9CmNvbnN0IG9sZFF1ZXJ5UmFuZ2U9dGhpcy5fcXVlcnlSYW5nZTt0aGlzLl9xdWVyeVJhbmdlPXF1ZXJ5UmFuZ2U7aWYoIW9sZFF1ZXJ5UmFuZ2V8fHF1ZXJ5UmFuZ2Uuc3RhcnRMaW5lIT09b2xkUXVlcnlSYW5nZS5zdGFydExpbmV8fHF1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW4hPT1vbGRRdWVyeVJhbmdlLnN0YXJ0Q29sdW1uKQp0aGlzLl91cGRhdGVBbmNob3JCb3goKTt0aGlzLl9zdWdnZXN0Qm94LnVwZGF0ZVN1Z2dlc3Rpb25zKHRoaXMuX2FuY2hvckJveCx3b3Jkc1dpdGhRdWVyeSx0cnVlLCF0aGlzLl9pc0N1cnNvckF0RW5kT2ZMaW5lKCkscXVlcnkpO2lmKHRoaXMuX3N1Z2dlc3RCb3gudmlzaWJsZSkKdGhpcy5fdG9vbHRpcEdsYXNzUGFuZS5oaWRlKCk7dGhpcy5fb25TdWdnZXN0aW9uc1Nob3duRm9yVGVzdCh3b3Jkc1dpdGhRdWVyeSk7fX0KX3NldEhpbnQoaGludCl7Y29uc3QgcXVlcnk9dGhpcy5fdGV4dEVkaXRvci50ZXh0KHRoaXMuX3F1ZXJ5UmFuZ2UpO2lmKCFoaW50fHwhdGhpcy5faXNDdXJzb3JBdEVuZE9mTGluZSgpfHwhaGludC5zdGFydHNXaXRoKHF1ZXJ5KSl7dGhpcy5fY2xlYXJIaW50KCk7cmV0dXJuO30KY29uc3Qgc3VmZml4PWhpbnQuc3Vic3RyaW5nKHF1ZXJ5Lmxlbmd0aCkuc3BsaXQoJ1xuJylbMF07dGhpcy5faGludEVsZW1lbnQudGV4dENvbnRlbnQ9c3VmZml4O2NvbnN0IGN1cnNvcj10aGlzLl9jb2RlTWlycm9yLmdldEN1cnNvcigndG8nKTtpZih0aGlzLl9oaW50TWFya2VyKXtjb25zdCBwb3NpdGlvbj10aGlzLl9oaW50TWFya2VyLnBvc2l0aW9uKCk7aWYoIXBvc2l0aW9ufHwhcG9zaXRpb24uZXF1YWwoVGV4dFV0aWxzLlRleHRSYW5nZS5jcmVhdGVGcm9tTG9jYXRpb24oY3Vyc29yLmxpbmUsY3Vyc29yLmNoKSkpe3RoaXMuX2hpbnRNYXJrZXIuY2xlYXIoKTt0aGlzLl9oaW50TWFya2VyPW51bGw7fX0KaWYoIXRoaXMuX2hpbnRNYXJrZXIpe3RoaXMuX2hpbnRNYXJrZXI9dGhpcy5fdGV4dEVkaXRvci5hZGRCb29rbWFyayhjdXJzb3IubGluZSxjdXJzb3IuY2gsdGhpcy5faGludEVsZW1lbnQsVGV4dEVkaXRvci5UZXh0RWRpdG9yQXV0b2NvbXBsZXRlQ29udHJvbGxlci5IaW50Qm9va21hcmssdHJ1ZSk7fWVsc2UgaWYodGhpcy5fbGFzdEhpbnRUZXh0IT09aGludCl7dGhpcy5faGludE1hcmtlci5yZWZyZXNoKCk7fQp0aGlzLl9sYXN0SGludFRleHQ9aGludDt9Cl9jbGVhckhpbnQoKXtpZighdGhpcy5faGludEVsZW1lbnQudGV4dENvbnRlbnQpCnJldHVybjt0aGlzLl9sYXN0SGludFRleHQ9Jyc7dGhpcy5faGludEVsZW1lbnQudGV4dENvbnRlbnQ9Jyc7aWYodGhpcy5faGludE1hcmtlcikKdGhpcy5faGludE1hcmtlci5yZWZyZXNoKCk7fQpfb25TdWdnZXN0aW9uc1Nob3duRm9yVGVzdChzdWdnZXN0aW9ucyl7fQpfb25TdWdnZXN0aW9uc0hpZGRlbkZvclRlc3QoKXt9CmNsZWFyQXV0b2NvbXBsZXRlKCl7dGhpcy5fdG9vbHRpcEdsYXNzUGFuZS5oaWRlKCk7dGhpcy5faGlkZVN1Z2dlc3RCb3goKTt9Cl9oaWRlU3VnZ2VzdEJveCgpe2lmKCF0aGlzLl9zdWdnZXN0Qm94KQpyZXR1cm47dGhpcy5fc3VnZ2VzdEJveC5oaWRlKCk7dGhpcy5fc3VnZ2VzdEJveD1udWxsO3RoaXMuX3F1ZXJ5UmFuZ2U9bnVsbDt0aGlzLl9hbmNob3JCb3g9bnVsbDt0aGlzLl9jdXJyZW50U3VnZ2VzdGlvbj1udWxsO3RoaXMuX3RleHRFZGl0b3IuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFVJLlRleHRFZGl0b3IuRXZlbnRzLlN1Z2dlc3Rpb25DaGFuZ2VkKTt0aGlzLl9jbGVhckhpbnQoKTt0aGlzLl9vblN1Z2dlc3Rpb25zSGlkZGVuRm9yVGVzdCgpO30Ka2V5RG93bihldmVudCl7aWYodGhpcy5fdG9vbHRpcEdsYXNzUGFuZS5pc1Nob3dpbmcoKSYmZXZlbnQua2V5Q29kZT09PVVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5Fc2MuY29kZSl7dGhpcy5fdG9vbHRpcEdsYXNzUGFuZS5oaWRlKCk7cmV0dXJuIHRydWU7fQppZighdGhpcy5fc3VnZ2VzdEJveCkKcmV0dXJuIGZhbHNlO3N3aXRjaChldmVudC5rZXlDb2RlKXtjYXNlIFVJLktleWJvYXJkU2hvcnRjdXQuS2V5cy5UYWIuY29kZTp0aGlzLl9zdWdnZXN0Qm94LmFjY2VwdFN1Z2dlc3Rpb24oKTt0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7cmV0dXJuIHRydWU7Y2FzZSBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuRW5kLmNvZGU6Y2FzZSBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuUmlnaHQuY29kZTppZih0aGlzLl9pc0N1cnNvckF0RW5kT2ZMaW5lKCkpe3RoaXMuX3N1Z2dlc3RCb3guYWNjZXB0U3VnZ2VzdGlvbigpO3RoaXMuY2xlYXJBdXRvY29tcGxldGUoKTtyZXR1cm4gdHJ1ZTt9ZWxzZXt0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7cmV0dXJuIGZhbHNlO30KY2FzZSBVSS5LZXlib2FyZFNob3J0Y3V0LktleXMuTGVmdC5jb2RlOmNhc2UgVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkhvbWUuY29kZTp0aGlzLmNsZWFyQXV0b2NvbXBsZXRlKCk7cmV0dXJuIGZhbHNlO2Nhc2UgVUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVzYy5jb2RlOnRoaXMuY2xlYXJBdXRvY29tcGxldGUoKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiB0aGlzLl9zdWdnZXN0Qm94LmtleVByZXNzZWQoZXZlbnQpO30KX2lzQ3Vyc29yQXRFbmRPZkxpbmUoKXtjb25zdCBjdXJzb3I9dGhpcy5fY29kZU1pcnJvci5nZXRDdXJzb3IoJ3RvJyk7cmV0dXJuIGN1cnNvci5jaD09PXRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZShjdXJzb3IubGluZSkubGVuZ3RoO30KYXBwbHlTdWdnZXN0aW9uKHN1Z2dlc3Rpb24saXNJbnRlcm1lZGlhdGVTdWdnZXN0aW9uKXtjb25zdCBvbGRTdWdnZXN0aW9uPXRoaXMuX2N1cnJlbnRTdWdnZXN0aW9uO3RoaXMuX2N1cnJlbnRTdWdnZXN0aW9uPXN1Z2dlc3Rpb247dGhpcy5fc2V0SGludChzdWdnZXN0aW9uKTtpZihvbGRTdWdnZXN0aW9uIT09c3VnZ2VzdGlvbikKdGhpcy5fdGV4dEVkaXRvci5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVGV4dEVkaXRvci5FdmVudHMuU3VnZ2VzdGlvbkNoYW5nZWQpO30KYWNjZXB0U3VnZ2VzdGlvbigpe2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5fY29kZU1pcnJvci5saXN0U2VsZWN0aW9ucygpLnNsaWNlKCk7Y29uc3QgcXVlcnlMZW5ndGg9dGhpcy5fcXVlcnlSYW5nZS5lbmRDb2x1bW4tdGhpcy5fcXVlcnlSYW5nZS5zdGFydENvbHVtbjtjb25zdCBzdWdnZXN0aW9uPXRoaXMuX2N1cnJlbnRTdWdnZXN0aW9uO3RoaXMuX2NvZGVNaXJyb3Iub3BlcmF0aW9uKCgpPT57Zm9yKGxldCBpPXNlbGVjdGlvbnMubGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IHN0YXJ0PXNlbGVjdGlvbnNbaV0uaGVhZDtjb25zdCBlbmQ9bmV3IENvZGVNaXJyb3IuUG9zKHN0YXJ0LmxpbmUsc3RhcnQuY2gtcXVlcnlMZW5ndGgpO3RoaXMuX2NvZGVNaXJyb3IucmVwbGFjZVJhbmdlKHN1Z2dlc3Rpb24sc3RhcnQsZW5kLCcrYXV0b2NvbXBsZXRlJyk7fX0pO30KdGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpe2lmKCF0aGlzLl9xdWVyeVJhbmdlfHx0aGlzLl9jdXJyZW50U3VnZ2VzdGlvbj09PW51bGwpCnJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldFZhbHVlKCk7Y29uc3Qgc2VsZWN0aW9ucz10aGlzLl9jb2RlTWlycm9yLmxpc3RTZWxlY3Rpb25zKCkuc2xpY2UoKTtsZXQgbGFzdD17bGluZTowLGNvbHVtbjowfTtsZXQgdGV4dD0nJztjb25zdCBxdWVyeUxlbmd0aD10aGlzLl9xdWVyeVJhbmdlLmVuZENvbHVtbi10aGlzLl9xdWVyeVJhbmdlLnN0YXJ0Q29sdW1uO2Zvcihjb25zdCBzZWxlY3Rpb24gb2Ygc2VsZWN0aW9ucyl7Y29uc3QgcmFuZ2U9bmV3IFRleHRVdGlscy5UZXh0UmFuZ2UobGFzdC5saW5lLGxhc3QuY29sdW1uLHNlbGVjdGlvbi5oZWFkLmxpbmUsc2VsZWN0aW9uLmhlYWQuY2gtcXVlcnlMZW5ndGgpO3RleHQrPXRoaXMuX3RleHRFZGl0b3IudGV4dChyYW5nZSk7dGV4dCs9dGhpcy5fY3VycmVudFN1Z2dlc3Rpb247bGFzdD17bGluZTpzZWxlY3Rpb24uaGVhZC5saW5lLGNvbHVtbjpzZWxlY3Rpb24uaGVhZC5jaH07fQpjb25zdCByYW5nZT1uZXcgVGV4dFV0aWxzLlRleHRSYW5nZShsYXN0LmxpbmUsbGFzdC5jb2x1bW4sSW5maW5pdHksSW5maW5pdHkpO3RleHQrPXRoaXMuX3RleHRFZGl0b3IudGV4dChyYW5nZSk7cmV0dXJuIHRleHQ7fQpfb25TY3JvbGwoKXt0aGlzLl90b29sdGlwR2xhc3NQYW5lLmhpZGUoKTtpZighdGhpcy5fc3VnZ2VzdEJveCkKcmV0dXJuO2NvbnN0IGN1cnNvcj10aGlzLl9jb2RlTWlycm9yLmdldEN1cnNvcigpO2NvbnN0IHNjcm9sbEluZm89dGhpcy5fY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7Y29uc3QgdG9wbW9zdExpbmVOdW1iZXI9dGhpcy5fY29kZU1pcnJvci5saW5lQXRIZWlnaHQoc2Nyb2xsSW5mby50b3AsJ2xvY2FsJyk7Y29uc3QgYm90dG9tTGluZT10aGlzLl9jb2RlTWlycm9yLmxpbmVBdEhlaWdodChzY3JvbGxJbmZvLnRvcCtzY3JvbGxJbmZvLmNsaWVudEhlaWdodCwnbG9jYWwnKTtpZihjdXJzb3IubGluZTx0b3Btb3N0TGluZU51bWJlcnx8Y3Vyc29yLmxpbmU+Ym90dG9tTGluZSl7dGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO31lbHNle3RoaXMuX3VwZGF0ZUFuY2hvckJveCgpO3RoaXMuX3N1Z2dlc3RCb3guc2V0UG9zaXRpb24odGhpcy5fYW5jaG9yQm94KTt9fQphc3luYyBfdXBkYXRlVG9vbHRpcCgpe2NvbnN0IGN1cnNvcj10aGlzLl9jb2RlTWlycm9yLmdldEN1cnNvcigpO2NvbnN0IHRvb2x0aXA9dGhpcy5fY29uZmlnLnRvb2x0aXBDYWxsYmFjaz9hd2FpdCB0aGlzLl9jb25maWcudG9vbHRpcENhbGxiYWNrKGN1cnNvci5saW5lLGN1cnNvci5jaCk6bnVsbDtjb25zdCBuZXdDdXJzb3I9dGhpcy5fY29kZU1pcnJvci5nZXRDdXJzb3IoKTtpZihuZXdDdXJzb3IubGluZSE9PWN1cnNvci5saW5lJiZuZXdDdXJzb3IuY2ghPT1jdXJzb3IuY2gpCnJldHVybjtpZih0aGlzLl9zdWdnZXN0Qm94JiZ0aGlzLl9zdWdnZXN0Qm94LnZpc2libGUpCnJldHVybjtpZighdG9vbHRpcCl7dGhpcy5fdG9vbHRpcEdsYXNzUGFuZS5oaWRlKCk7cmV0dXJuO30KY29uc3QgbWV0cmljcz10aGlzLl90ZXh0RWRpdG9yLmN1cnNvclBvc2l0aW9uVG9Db29yZGluYXRlcyhjdXJzb3IubGluZSxjdXJzb3IuY2gpO2lmKCFtZXRyaWNzKXt0aGlzLl90b29sdGlwR2xhc3NQYW5lLmhpZGUoKTtyZXR1cm47fQp0aGlzLl90b29sdGlwR2xhc3NQYW5lLnNldENvbnRlbnRBbmNob3JCb3gobmV3IEFuY2hvckJveChtZXRyaWNzLngsbWV0cmljcy55LDAsbWV0cmljcy5oZWlnaHQpKTt0aGlzLl90b29sdGlwRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX3Rvb2x0aXBFbGVtZW50LmFwcGVuZENoaWxkKHRvb2x0aXApO3RoaXMuX3Rvb2x0aXBHbGFzc1BhbmUuc2hvdygodGhpcy5fdGV4dEVkaXRvci5lbGVtZW50Lm93bmVyRG9jdW1lbnQpKTt9Cl9vbkN1cnNvckFjdGl2aXR5KCl7dGhpcy5fdXBkYXRlVG9vbHRpcCgpO2lmKCF0aGlzLl9zdWdnZXN0Qm94KQpyZXR1cm47Y29uc3QgY3Vyc29yPXRoaXMuX2NvZGVNaXJyb3IuZ2V0Q3Vyc29yKCk7bGV0IHNob3VsZENsb3NlQXV0b2NvbXBsZXRlPSEoY3Vyc29yLmxpbmU9PT10aGlzLl9xdWVyeVJhbmdlLnN0YXJ0TGluZSYmdGhpcy5fcXVlcnlSYW5nZS5zdGFydENvbHVtbjw9Y3Vyc29yLmNoJiZjdXJzb3IuY2g8PXRoaXMuX3F1ZXJ5UmFuZ2UuZW5kQ29sdW1uKTtpZihjdXJzb3IubGluZT09PXRoaXMuX3F1ZXJ5UmFuZ2Uuc3RhcnRMaW5lJiZjdXJzb3IuY2g9PT10aGlzLl9xdWVyeVJhbmdlLmVuZENvbHVtbisxKXtjb25zdCBsaW5lPXRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZShjdXJzb3IubGluZSk7c2hvdWxkQ2xvc2VBdXRvY29tcGxldGU9dGhpcy5fY29uZmlnLmlzV29yZENoYXI/IXRoaXMuX2NvbmZpZy5pc1dvcmRDaGFyKGxpbmUuY2hhckF0KGN1cnNvci5jaC0xKSk6ZmFsc2U7fQppZihzaG91bGRDbG9zZUF1dG9jb21wbGV0ZSkKdGhpcy5jbGVhckF1dG9jb21wbGV0ZSgpO3RoaXMuX29uQ3Vyc29yQWN0aXZpdHlIYW5kbGVkRm9yVGVzdCgpO30KX29uQ3Vyc29yQWN0aXZpdHlIYW5kbGVkRm9yVGVzdCgpe30KX3VwZGF0ZUFuY2hvckJveCgpe2NvbnN0IGxpbmU9dGhpcy5fcXVlcnlSYW5nZS5zdGFydExpbmU7Y29uc3QgY29sdW1uPXRoaXMuX3F1ZXJ5UmFuZ2Uuc3RhcnRDb2x1bW47Y29uc3QgbWV0cmljcz10aGlzLl90ZXh0RWRpdG9yLmN1cnNvclBvc2l0aW9uVG9Db29yZGluYXRlcyhsaW5lLGNvbHVtbik7dGhpcy5fYW5jaG9yQm94PW1ldHJpY3M/bmV3IEFuY2hvckJveChtZXRyaWNzLngsbWV0cmljcy55LDAsbWV0cmljcy5oZWlnaHQpOm51bGw7fX07VGV4dEVkaXRvci5UZXh0RWRpdG9yQXV0b2NvbXBsZXRlQ29udHJvbGxlci5IaW50Qm9va21hcms9U3ltYm9sKCdoaW50Jyk7O1RleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3I9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKG9wdGlvbnMpe3N1cGVyKCk7dGhpcy5fb3B0aW9ucz1vcHRpb25zO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnY20vY29kZW1pcnJvci5jc3MnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3RleHRfZWRpdG9yL2NtZGV2dG9vbHMuY3NzJyk7VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMuYXBwZW5kVGhlbWVTdHlsZSh0aGlzLmVsZW1lbnQpO3RoaXMuX2NvZGVNaXJyb3I9bmV3IENvZGVNaXJyb3IodGhpcy5lbGVtZW50LHtsaW5lTnVtYmVyczpvcHRpb25zLmxpbmVOdW1iZXJzLG1hdGNoQnJhY2tldHM6dHJ1ZSxzbWFydEluZGVudDp0cnVlLHN0eWxlU2VsZWN0ZWRUZXh0OnRydWUsZWxlY3RyaWNDaGFyczp0cnVlLHN0eWxlQWN0aXZlTGluZTp0cnVlLGluZGVudFVuaXQ6NCxsaW5lV3JhcHBpbmc6b3B0aW9ucy5saW5lV3JhcHBpbmcsbGluZVdpc2VDb3B5Q3V0OmZhbHNlLHRhYkluZGV4OjAscG9sbEludGVydmFsOk1hdGgucG93KDIsMzEpLTEsaW5wdXRTdHlsZTonZGV2VG9vbHNBY2Nlc3NpYmxlVGV4dEFyZWEnfSk7dGhpcy5fY29kZU1pcnJvckVsZW1lbnQ9dGhpcy5lbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQ7dGhpcy5fY29kZU1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3I9dGhpcztDb2RlTWlycm9yLmtleU1hcFsnZGV2dG9vbHMtY29tbW9uJ109eydMZWZ0JzonZ29DaGFyTGVmdCcsJ1JpZ2h0JzonZ29DaGFyUmlnaHQnLCdVcCc6J2dvTGluZVVwJywnRG93bic6J2dvTGluZURvd24nLCdFbmQnOidnb0xpbmVFbmQnLCdIb21lJzonZ29MaW5lU3RhcnRTbWFydCcsJ1BhZ2VVcCc6J2dvU21hcnRQYWdlVXAnLCdQYWdlRG93bic6J2dvU21hcnRQYWdlRG93bicsJ0RlbGV0ZSc6J2RlbENoYXJBZnRlcicsJ0JhY2tzcGFjZSc6J2RlbENoYXJCZWZvcmUnLCdUYWInOidkZWZhdWx0VGFiJywnU2hpZnQtVGFiJzonaW5kZW50TGVzcycsJ0VudGVyJzonbmV3bGluZUFuZEluZGVudCcsJ0N0cmwtU3BhY2UnOidhdXRvY29tcGxldGUnLCdFc2MnOidkaXNtaXNzJywnQ3RybC1NJzonZ290b01hdGNoaW5nQnJhY2tldCd9O0NvZGVNaXJyb3Iua2V5TWFwWydkZXZ0b29scy1wYyddPXsnQ3RybC1BJzonc2VsZWN0QWxsJywnQ3RybC1aJzondW5kb0FuZFJldmVhbCcsJ1NoaWZ0LUN0cmwtWic6J3JlZG9BbmRSZXZlYWwnLCdDdHJsLVknOidyZWRvJywnQ3RybC1Ib21lJzonZ29Eb2NTdGFydCcsJ0N0cmwtVXAnOidnb0RvY1N0YXJ0JywnQ3RybC1FbmQnOidnb0RvY0VuZCcsJ0N0cmwtRG93bic6J2dvRG9jRW5kJywnQ3RybC1MZWZ0JzonZ29Hcm91cExlZnQnLCdDdHJsLVJpZ2h0JzonZ29Hcm91cFJpZ2h0JywnQWx0LUxlZnQnOidtb3ZlQ2FtZWxMZWZ0JywnQWx0LVJpZ2h0JzonbW92ZUNhbWVsUmlnaHQnLCdTaGlmdC1BbHQtTGVmdCc6J3NlbGVjdENhbWVsTGVmdCcsJ1NoaWZ0LUFsdC1SaWdodCc6J3NlbGVjdENhbWVsUmlnaHQnLCdDdHJsLUJhY2tzcGFjZSc6J2RlbEdyb3VwQmVmb3JlJywnQ3RybC1EZWxldGUnOidkZWxHcm91cEFmdGVyJywnQ3RybC0vJzondG9nZ2xlQ29tbWVudCcsJ0N0cmwtRCc6J3NlbGVjdE5leHRPY2N1cnJlbmNlJywnQ3RybC1VJzondW5kb0xhc3RTZWxlY3Rpb24nLGZhbGx0aHJvdWdoOidkZXZ0b29scy1jb21tb24nfTtDb2RlTWlycm9yLmtleU1hcFsnZGV2dG9vbHMtbWFjJ109eydDbWQtQSc6J3NlbGVjdEFsbCcsJ0NtZC1aJzondW5kb0FuZFJldmVhbCcsJ1NoaWZ0LUNtZC1aJzoncmVkb0FuZFJldmVhbCcsJ0NtZC1VcCc6J2dvRG9jU3RhcnQnLCdDbWQtRG93bic6J2dvRG9jRW5kJywnQWx0LUxlZnQnOidnb0dyb3VwTGVmdCcsJ0FsdC1SaWdodCc6J2dvR3JvdXBSaWdodCcsJ0N0cmwtTGVmdCc6J21vdmVDYW1lbExlZnQnLCdDdHJsLVJpZ2h0JzonbW92ZUNhbWVsUmlnaHQnLCdDdHJsLUEnOidnb0xpbmVMZWZ0JywnQ3RybC1FJzonZ29MaW5lUmlnaHQnLCdDdHJsLUInOidnb0NoYXJMZWZ0JywnQ3RybC1GJzonZ29DaGFyUmlnaHQnLCdDdHJsLUFsdC1CJzonZ29Hcm91cExlZnQnLCdDdHJsLUFsdC1GJzonZ29Hcm91cFJpZ2h0JywnQ3RybC1IJzonZGVsQ2hhckJlZm9yZScsJ0N0cmwtRCc6J2RlbENoYXJBZnRlcicsJ0N0cmwtSyc6J2tpbGxMaW5lJywnQ3RybC1UJzondHJhbnNwb3NlQ2hhcnMnLCdTaGlmdC1DdHJsLUxlZnQnOidzZWxlY3RDYW1lbExlZnQnLCdTaGlmdC1DdHJsLVJpZ2h0Jzonc2VsZWN0Q2FtZWxSaWdodCcsJ0NtZC1MZWZ0JzonZ29MaW5lU3RhcnRTbWFydCcsJ0NtZC1SaWdodCc6J2dvTGluZUVuZCcsJ0NtZC1CYWNrc3BhY2UnOidkZWxMaW5lTGVmdCcsJ0FsdC1CYWNrc3BhY2UnOidkZWxHcm91cEJlZm9yZScsJ0FsdC1EZWxldGUnOidkZWxHcm91cEFmdGVyJywnQ21kLS8nOid0b2dnbGVDb21tZW50JywnQ21kLUQnOidzZWxlY3ROZXh0T2NjdXJyZW5jZScsJ0NtZC1VJzondW5kb0xhc3RTZWxlY3Rpb24nLGZhbGx0aHJvdWdoOidkZXZ0b29scy1jb21tb24nfTtpZihvcHRpb25zLmJyYWNrZXRNYXRjaGluZ1NldHRpbmcpCm9wdGlvbnMuYnJhY2tldE1hdGNoaW5nU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl9lbmFibGVCcmFja2V0TWF0Y2hpbmdJZk5lZWRlZCx0aGlzKTt0aGlzLl9lbmFibGVCcmFja2V0TWF0Y2hpbmdJZk5lZWRlZCgpO3RoaXMuX2NvZGVNaXJyb3Iuc2V0T3B0aW9uKCdrZXlNYXAnLEhvc3QuaXNNYWMoKT8nZGV2dG9vbHMtbWFjJzonZGV2dG9vbHMtcGMnKTt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignZmxhdHRlblNwYW5zJyxmYWxzZSk7bGV0IG1heEhpZ2hsaWdodExlbmd0aD1vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aDtpZih0eXBlb2YgbWF4SGlnaGxpZ2h0TGVuZ3RoIT09J251bWJlcicpCm1heEhpZ2hsaWdodExlbmd0aD1UZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLm1heEhpZ2hsaWdodExlbmd0aDt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignbWF4SGlnaGxpZ2h0TGVuZ3RoJyxtYXhIaWdobGlnaHRMZW5ndGgpO3RoaXMuX2NvZGVNaXJyb3Iuc2V0T3B0aW9uKCdtb2RlJyxudWxsKTt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignY3J1ZGVNZWFzdXJpbmdGcm9tJywxMDAwKTt0aGlzLl9zaG91bGRDbGVhckhpc3Rvcnk9dHJ1ZTt0aGlzLl9saW5lU2VwYXJhdG9yPSdcbic7VGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvci5fZml4V29yZE1vdmVtZW50KHRoaXMuX2NvZGVNaXJyb3IpO3RoaXMuX3NlbGVjdE5leHRPY2N1cnJlbmNlQ29udHJvbGxlcj1uZXcgVGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvci5TZWxlY3ROZXh0T2NjdXJyZW5jZUNvbnRyb2xsZXIodGhpcyx0aGlzLl9jb2RlTWlycm9yKTt0aGlzLl9jb2RlTWlycm9yLm9uKCdjaGFuZ2VzJyx0aGlzLl9jaGFuZ2VzLmJpbmQodGhpcykpO3RoaXMuX2NvZGVNaXJyb3Iub24oJ2JlZm9yZVNlbGVjdGlvbkNoYW5nZScsdGhpcy5fYmVmb3JlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO3RoaXMuX2NvZGVNaXJyb3Iub24oJ2tleUhhbmRsZWQnLHRoaXMuX29uS2V5SGFuZGxlZC5iaW5kKHRoaXMpKTt0aGlzLmVsZW1lbnQuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbic7dGhpcy5fY29kZU1pcnJvckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc291cmNlLWNvZGUnKTt0aGlzLl9jb2RlTWlycm9yRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmaWxsJyk7dGhpcy5fZGVjb3JhdGlvbnM9bmV3IE11bHRpbWFwKCk7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2hhbmRsZUtleURvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5faGFuZGxlUG9zdEtleURvd24uYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fbmVlZHNSZWZyZXNoPXRydWU7dGhpcy5fcmVhZE9ubHk9ZmFsc2U7dGhpcy5fbWltZVR5cGU9Jyc7aWYob3B0aW9ucy5taW1lVHlwZSkKdGhpcy5zZXRNaW1lVHlwZShvcHRpb25zLm1pbWVUeXBlKTtpZihvcHRpb25zLmF1dG9IZWlnaHQpCnRoaXMuX2NvZGVNaXJyb3Iuc2V0U2l6ZShudWxsLCdhdXRvJyk7dGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50PW51bGw7aWYob3B0aW9ucy5wbGFjZWhvbGRlcil7dGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3ByZScpO3RoaXMuX3BsYWNlaG9sZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwbGFjZWhvbGRlci10ZXh0Jyk7dGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50LnRleHRDb250ZW50PW9wdGlvbnMucGxhY2Vob2xkZXI7dGhpcy5fdXBkYXRlUGxhY2Vob2xkZXIoKTt9fQpzdGF0aWMgYXV0b2NvbXBsZXRlQ29tbWFuZChjb2RlTWlycm9yKXtjb25zdCBhdXRvY29tcGxldGVDb250cm9sbGVyPWNvZGVNaXJyb3IuX2NvZGVNaXJyb3JUZXh0RWRpdG9yLl9hdXRvY29tcGxldGVDb250cm9sbGVyO2lmKGF1dG9jb21wbGV0ZUNvbnRyb2xsZXIpCmF1dG9jb21wbGV0ZUNvbnRyb2xsZXIuYXV0b2NvbXBsZXRlKHRydWUpO30Kc3RhdGljIHVuZG9MYXN0U2VsZWN0aW9uQ29tbWFuZChjb2RlTWlycm9yKXtjb2RlTWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5fc2VsZWN0TmV4dE9jY3VycmVuY2VDb250cm9sbGVyLnVuZG9MYXN0U2VsZWN0aW9uKCk7fQpzdGF0aWMgc2VsZWN0TmV4dE9jY3VycmVuY2VDb21tYW5kKGNvZGVNaXJyb3Ipe2NvZGVNaXJyb3IuX2NvZGVNaXJyb3JUZXh0RWRpdG9yLl9zZWxlY3ROZXh0T2NjdXJyZW5jZUNvbnRyb2xsZXIuc2VsZWN0TmV4dE9jY3VycmVuY2UoKTt9CnN0YXRpYyBtb3ZlQ2FtZWxMZWZ0Q29tbWFuZChzaGlmdCxjb2RlTWlycm9yKXtjb2RlTWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5fZG9DYW1lbENhc2VNb3ZlbWVudCgtMSxzaGlmdCk7fQpzdGF0aWMgbW92ZUNhbWVsUmlnaHRDb21tYW5kKHNoaWZ0LGNvZGVNaXJyb3Ipe2NvZGVNaXJyb3IuX2NvZGVNaXJyb3JUZXh0RWRpdG9yLl9kb0NhbWVsQ2FzZU1vdmVtZW50KDEsc2hpZnQpO30Kc3RhdGljIF9vdmVycmlkZU1vZGVXaXRoUHJlZml4ZWRUb2tlbnMobW9kZU5hbWUsdG9rZW5QcmVmaXgpe2NvbnN0IG9sZE1vZGVOYW1lPW1vZGVOYW1lKyctb2xkJztpZihDb2RlTWlycm9yLm1vZGVzW29sZE1vZGVOYW1lXSkKcmV0dXJuO0NvZGVNaXJyb3IuZGVmaW5lTW9kZShvbGRNb2RlTmFtZSxDb2RlTWlycm9yLm1vZGVzW21vZGVOYW1lXSk7Q29kZU1pcnJvci5kZWZpbmVNb2RlKG1vZGVOYW1lLG1vZGVDb25zdHJ1Y3Rvcik7ZnVuY3Rpb24gbW9kZUNvbnN0cnVjdG9yKGNvbmZpZyxwYXJzZXJDb25maWcpe2NvbnN0IGlubmVyQ29uZmlnPXt9O2Zvcihjb25zdCBpIGluIHBhcnNlckNvbmZpZykKaW5uZXJDb25maWdbaV09cGFyc2VyQ29uZmlnW2ldO2lubmVyQ29uZmlnLm5hbWU9b2xkTW9kZU5hbWU7Y29uc3QgY29kZU1pcnJvck1vZGU9Q29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZyxpbm5lckNvbmZpZyk7Y29kZU1pcnJvck1vZGUubmFtZT1tb2RlTmFtZTtjb2RlTWlycm9yTW9kZS50b2tlbj10b2tlbk92ZXJyaWRlLmJpbmQobnVsbCxjb2RlTWlycm9yTW9kZS50b2tlbik7cmV0dXJuIGNvZGVNaXJyb3JNb2RlO30KZnVuY3Rpb24gdG9rZW5PdmVycmlkZShzdXBlclRva2VuLHN0cmVhbSxzdGF0ZSl7Y29uc3QgdG9rZW49c3VwZXJUb2tlbihzdHJlYW0sc3RhdGUpO3JldHVybiB0b2tlbj90b2tlblByZWZpeCt0b2tlbi5zcGxpdCgvICsvKS5qb2luKCcgJyt0b2tlblByZWZpeCk6dG9rZW47fX0Kc3RhdGljIF9jb2xsZWN0VW5pbnN0YWxsZWRNb2RlcyhtaW1lVHlwZSl7Y29uc3QgaW5zdGFsbGVkPVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuX2xvYWRlZE1pbWVNb2RlRXh0ZW5zaW9ucztjb25zdCBuYW1lVG9FeHRlbnNpb249bmV3IE1hcCgpO2NvbnN0IGV4dGVuc2lvbnM9c2VsZi5ydW50aW1lLmV4dGVuc2lvbnMoVGV4dEVkaXRvci5Db2RlTWlycm9yTWltZU1vZGUpO2Zvcihjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykKbmFtZVRvRXh0ZW5zaW9uLnNldChleHRlbnNpb24uZGVzY3JpcHRvcigpWydmaWxlTmFtZSddLGV4dGVuc2lvbik7Y29uc3QgbW9kZXNUb0xvYWQ9bmV3IFNldCgpO2Zvcihjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucyl7Y29uc3QgZGVzY3JpcHRvcj1leHRlbnNpb24uZGVzY3JpcHRvcigpO2lmKGluc3RhbGxlZC5oYXMoZXh0ZW5zaW9uKXx8ZGVzY3JpcHRvclsnbWltZVR5cGVzJ10uaW5kZXhPZihtaW1lVHlwZSk9PT0tMSkKY29udGludWU7bW9kZXNUb0xvYWQuYWRkKGV4dGVuc2lvbik7Y29uc3QgZGVwcz1kZXNjcmlwdG9yWydkZXBlbmRlbmNpZXMnXXx8W107Zm9yKGxldCBpPTA7aTxkZXBzLmxlbmd0aDsrK2kpe2NvbnN0IGV4dGVuc2lvbj1uYW1lVG9FeHRlbnNpb24uZ2V0KGRlcHNbaV0pO2lmKGV4dGVuc2lvbiYmIWluc3RhbGxlZC5oYXMoZXh0ZW5zaW9uKSkKbW9kZXNUb0xvYWQuYWRkKGV4dGVuc2lvbik7fX0KcmV0dXJuIEFycmF5LmZyb20obW9kZXNUb0xvYWQpO30Kc3RhdGljIF9pbnN0YWxsTWltZVR5cGVNb2RlcyhleHRlbnNpb25zKXtjb25zdCBwcm9taXNlcz1leHRlbnNpb25zLm1hcChleHRlbnNpb249PmV4dGVuc2lvbi5pbnN0YW5jZSgpLnRoZW4oaW5zdGFsbE1vZGUuYmluZChudWxsLGV4dGVuc2lvbikpKTtyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO2Z1bmN0aW9uIGluc3RhbGxNb2RlKGV4dGVuc2lvbixpbnN0YW5jZSl7aWYoVGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvci5fbG9hZGVkTWltZU1vZGVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKQpyZXR1cm47Y29uc3QgbW9kZT0oaW5zdGFuY2UpO21vZGUuaW5zdGFsbChleHRlbnNpb24pO1RleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuX2xvYWRlZE1pbWVNb2RlRXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTt9fQpzdGF0aWMgX2ZpeFdvcmRNb3ZlbWVudChjb2RlTWlycm9yKXtmdW5jdGlvbiBtb3ZlTGVmdChzaGlmdCxjb2RlTWlycm9yKXtjb2RlTWlycm9yLnNldEV4dGVuZGluZyhzaGlmdCk7Y29uc3QgY3Vyc29yPWNvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdoZWFkJyk7Y29kZU1pcnJvci5leGVjQ29tbWFuZCgnZ29Hcm91cExlZnQnKTtjb25zdCBuZXdDdXJzb3I9Y29kZU1pcnJvci5nZXRDdXJzb3IoJ2hlYWQnKTtpZihuZXdDdXJzb3IuY2g9PT0wJiZuZXdDdXJzb3IubGluZSE9PTApe2NvZGVNaXJyb3Iuc2V0RXh0ZW5kaW5nKGZhbHNlKTtyZXR1cm47fQpjb25zdCBza2lwcGVkVGV4dD1jb2RlTWlycm9yLmdldFJhbmdlKG5ld0N1cnNvcixjdXJzb3IsJyMnKTtpZigvXlxzKyQvLnRlc3Qoc2tpcHBlZFRleHQpKQpjb2RlTWlycm9yLmV4ZWNDb21tYW5kKCdnb0dyb3VwTGVmdCcpO2NvZGVNaXJyb3Iuc2V0RXh0ZW5kaW5nKGZhbHNlKTt9CmZ1bmN0aW9uIG1vdmVSaWdodChzaGlmdCxjb2RlTWlycm9yKXtjb2RlTWlycm9yLnNldEV4dGVuZGluZyhzaGlmdCk7Y29uc3QgY3Vyc29yPWNvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdoZWFkJyk7Y29kZU1pcnJvci5leGVjQ29tbWFuZCgnZ29Hcm91cFJpZ2h0Jyk7Y29uc3QgbmV3Q3Vyc29yPWNvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdoZWFkJyk7aWYobmV3Q3Vyc29yLmNoPT09MCYmbmV3Q3Vyc29yLmxpbmUhPT0wKXtjb2RlTWlycm9yLnNldEV4dGVuZGluZyhmYWxzZSk7cmV0dXJuO30KY29uc3Qgc2tpcHBlZFRleHQ9Y29kZU1pcnJvci5nZXRSYW5nZShjdXJzb3IsbmV3Q3Vyc29yLCcjJyk7aWYoL15ccyskLy50ZXN0KHNraXBwZWRUZXh0KSkKY29kZU1pcnJvci5leGVjQ29tbWFuZCgnZ29Hcm91cFJpZ2h0Jyk7Y29kZU1pcnJvci5zZXRFeHRlbmRpbmcoZmFsc2UpO30KY29uc3QgbW9kaWZpZXJLZXk9SG9zdC5pc01hYygpPydBbHQnOidDdHJsJztjb25zdCBsZWZ0S2V5PW1vZGlmaWVyS2V5KyctTGVmdCc7Y29uc3QgcmlnaHRLZXk9bW9kaWZpZXJLZXkrJy1SaWdodCc7Y29uc3Qga2V5TWFwPXt9O2tleU1hcFtsZWZ0S2V5XT1tb3ZlTGVmdC5iaW5kKG51bGwsZmFsc2UpO2tleU1hcFtyaWdodEtleV09bW92ZVJpZ2h0LmJpbmQobnVsbCxmYWxzZSk7a2V5TWFwWydTaGlmdC0nK2xlZnRLZXldPW1vdmVMZWZ0LmJpbmQobnVsbCx0cnVlKTtrZXlNYXBbJ1NoaWZ0LScrcmlnaHRLZXldPW1vdmVSaWdodC5iaW5kKG51bGwsdHJ1ZSk7Y29kZU1pcnJvci5hZGRLZXlNYXAoa2V5TWFwKTt9CmNvZGVNaXJyb3IoKXtyZXR1cm4gdGhpcy5fY29kZU1pcnJvcjt9CndpZGdldCgpe3JldHVybiB0aGlzO30KX29uS2V5SGFuZGxlZCgpe1VJLnNob3J0Y3V0UmVnaXN0cnkuZGlzbWlzc1BlbmRpbmdTaG9ydGN1dEFjdGlvbigpO30KX25vcm1hbGl6ZVBvc2l0aW9uRm9yT3ZlcmxhcHBpbmdDb2x1bW4obGluZU51bWJlcixsaW5lTGVuZ3RoLGNoYXJOdW1iZXIpe2NvbnN0IGxpbmVzQ291bnQ9dGhpcy5fY29kZU1pcnJvci5saW5lQ291bnQoKTtsZXQgY29sdW1uTnVtYmVyPWNoYXJOdW1iZXI7aWYoY2hhck51bWJlcjwwJiZsaW5lTnVtYmVyPjApey0tbGluZU51bWJlcjtjb2x1bW5OdW1iZXI9dGhpcy5saW5lKGxpbmVOdW1iZXIpLmxlbmd0aDt9ZWxzZSBpZihjaGFyTnVtYmVyPj1saW5lTGVuZ3RoJiZsaW5lTnVtYmVyPGxpbmVzQ291bnQtMSl7KytsaW5lTnVtYmVyO2NvbHVtbk51bWJlcj0wO31lbHNle2NvbHVtbk51bWJlcj1OdW1iZXIuY29uc3RyYWluKGNoYXJOdW1iZXIsMCxsaW5lTGVuZ3RoKTt9CnJldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNvbHVtbk51bWJlcn07fQpfY2FtZWxDYXNlTW92ZUZyb21Qb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbk51bWJlcixkaXJlY3Rpb24pe2Z1bmN0aW9uIHZhbGlkKGNoYXJOdW1iZXIsbGVuZ3RoKXtyZXR1cm4gY2hhck51bWJlcj49MCYmY2hhck51bWJlcjxsZW5ndGg7fQpmdW5jdGlvbiBpc1dvcmRTdGFydCh0ZXh0LGNoYXJOdW1iZXIpe2NvbnN0IHBvc2l0aW9uPWNoYXJOdW1iZXI7Y29uc3QgbmV4dFBvc2l0aW9uPWNoYXJOdW1iZXIrMTtyZXR1cm4gdmFsaWQocG9zaXRpb24sdGV4dC5sZW5ndGgpJiZ2YWxpZChuZXh0UG9zaXRpb24sdGV4dC5sZW5ndGgpJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIodGV4dFtwb3NpdGlvbl0pJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIodGV4dFtuZXh0UG9zaXRpb25dKSYmVGV4dFV0aWxzLlRleHRVdGlscy5pc1VwcGVyQ2FzZSh0ZXh0W3Bvc2l0aW9uXSkmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNMb3dlckNhc2UodGV4dFtuZXh0UG9zaXRpb25dKTt9CmZ1bmN0aW9uIGlzV29yZEVuZCh0ZXh0LGNoYXJOdW1iZXIpe2NvbnN0IHBvc2l0aW9uPWNoYXJOdW1iZXI7Y29uc3QgcHJldlBvc2l0aW9uPWNoYXJOdW1iZXItMTtyZXR1cm4gdmFsaWQocG9zaXRpb24sdGV4dC5sZW5ndGgpJiZ2YWxpZChwcmV2UG9zaXRpb24sdGV4dC5sZW5ndGgpJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIodGV4dFtwb3NpdGlvbl0pJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIodGV4dFtwcmV2UG9zaXRpb25dKSYmVGV4dFV0aWxzLlRleHRVdGlscy5pc1VwcGVyQ2FzZSh0ZXh0W3Bvc2l0aW9uXSkmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNMb3dlckNhc2UodGV4dFtwcmV2UG9zaXRpb25dKTt9CmZ1bmN0aW9uIGNvbnN0cmFpblBvc2l0aW9uKGxpbmVOdW1iZXIsbGluZUxlbmd0aCxjb2x1bW5OdW1iZXIpe3JldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOk51bWJlci5jb25zdHJhaW4oY29sdW1uTnVtYmVyLDAsbGluZUxlbmd0aCl9O30KY29uc3QgdGV4dD10aGlzLmxpbmUobGluZU51bWJlcik7Y29uc3QgbGVuZ3RoPXRleHQubGVuZ3RoO2lmKChjb2x1bW5OdW1iZXI9PT1sZW5ndGgmJmRpcmVjdGlvbj09PTEpfHwoY29sdW1uTnVtYmVyPT09MCYmZGlyZWN0aW9uPT09LTEpKQpyZXR1cm4gdGhpcy5fbm9ybWFsaXplUG9zaXRpb25Gb3JPdmVybGFwcGluZ0NvbHVtbihsaW5lTnVtYmVyLGxlbmd0aCxjb2x1bW5OdW1iZXIrZGlyZWN0aW9uKTtsZXQgY2hhck51bWJlcj1kaXJlY3Rpb249PT0xP2NvbHVtbk51bWJlcjpjb2x1bW5OdW1iZXItMTt3aGlsZSh2YWxpZChjaGFyTnVtYmVyLGxlbmd0aCkmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNTcGFjZUNoYXIodGV4dFtjaGFyTnVtYmVyXSkpCmNoYXJOdW1iZXIrPWRpcmVjdGlvbjtpZighdmFsaWQoY2hhck51bWJlcixsZW5ndGgpKQpyZXR1cm4gY29uc3RyYWluUG9zaXRpb24obGluZU51bWJlcixsZW5ndGgsY2hhck51bWJlcik7aWYoVGV4dFV0aWxzLlRleHRVdGlscy5pc1N0b3BDaGFyKHRleHRbY2hhck51bWJlcl0pKXt3aGlsZSh2YWxpZChjaGFyTnVtYmVyLGxlbmd0aCkmJlRleHRVdGlscy5UZXh0VXRpbHMuaXNTdG9wQ2hhcih0ZXh0W2NoYXJOdW1iZXJdKSkKY2hhck51bWJlcis9ZGlyZWN0aW9uO2lmKCF2YWxpZChjaGFyTnVtYmVyLGxlbmd0aCkpCnJldHVybiBjb25zdHJhaW5Qb3NpdGlvbihsaW5lTnVtYmVyLGxlbmd0aCxjaGFyTnVtYmVyKTtyZXR1cm57bGluZU51bWJlcjpsaW5lTnVtYmVyLGNvbHVtbk51bWJlcjpkaXJlY3Rpb249PT0tMT9jaGFyTnVtYmVyKzE6Y2hhck51bWJlcn07fQpjaGFyTnVtYmVyKz1kaXJlY3Rpb247d2hpbGUodmFsaWQoY2hhck51bWJlcixsZW5ndGgpJiYhaXNXb3JkU3RhcnQodGV4dCxjaGFyTnVtYmVyKSYmIWlzV29yZEVuZCh0ZXh0LGNoYXJOdW1iZXIpJiZUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIodGV4dFtjaGFyTnVtYmVyXSkpCmNoYXJOdW1iZXIrPWRpcmVjdGlvbjtpZighdmFsaWQoY2hhck51bWJlcixsZW5ndGgpKQpyZXR1cm4gY29uc3RyYWluUG9zaXRpb24obGluZU51bWJlcixsZW5ndGgsY2hhck51bWJlcik7aWYoaXNXb3JkU3RhcnQodGV4dCxjaGFyTnVtYmVyKXx8aXNXb3JkRW5kKHRleHQsY2hhck51bWJlcikpCnJldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNoYXJOdW1iZXJ9O3JldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmRpcmVjdGlvbj09PS0xP2NoYXJOdW1iZXIrMTpjaGFyTnVtYmVyfTt9Cl9kb0NhbWVsQ2FzZU1vdmVtZW50KGRpcmVjdGlvbixzaGlmdCl7Y29uc3Qgc2VsZWN0aW9ucz10aGlzLnNlbGVjdGlvbnMoKTtmb3IobGV0IGk9MDtpPHNlbGVjdGlvbnMubGVuZ3RoOysraSl7Y29uc3Qgc2VsZWN0aW9uPXNlbGVjdGlvbnNbaV07Y29uc3QgbW92ZT10aGlzLl9jYW1lbENhc2VNb3ZlRnJvbVBvc2l0aW9uKHNlbGVjdGlvbi5lbmRMaW5lLHNlbGVjdGlvbi5lbmRDb2x1bW4sZGlyZWN0aW9uKTtzZWxlY3Rpb24uZW5kTGluZT1tb3ZlLmxpbmVOdW1iZXI7c2VsZWN0aW9uLmVuZENvbHVtbj1tb3ZlLmNvbHVtbk51bWJlcjtpZighc2hpZnQpCnNlbGVjdGlvbnNbaV09c2VsZWN0aW9uLmNvbGxhcHNlVG9FbmQoKTt9CnRoaXMuc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTt9CmRpc3Bvc2UoKXtpZih0aGlzLl9vcHRpb25zLmJyYWNrZXRNYXRjaGluZ1NldHRpbmcpCnRoaXMuX29wdGlvbnMuYnJhY2tldE1hdGNoaW5nU2V0dGluZy5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl9lbmFibGVCcmFja2V0TWF0Y2hpbmdJZk5lZWRlZCx0aGlzKTt9Cl9lbmFibGVCcmFja2V0TWF0Y2hpbmdJZk5lZWRlZCgpe3RoaXMuX2NvZGVNaXJyb3Iuc2V0T3B0aW9uKCdhdXRvQ2xvc2VCcmFja2V0cycsKHRoaXMuX29wdGlvbnMuYnJhY2tldE1hdGNoaW5nU2V0dGluZyYmdGhpcy5fb3B0aW9ucy5icmFja2V0TWF0Y2hpbmdTZXR0aW5nLmdldCgpKT97ZXhwbG9kZTpmYWxzZX06ZmFsc2UpO30Kd2FzU2hvd24oKXtpZih0aGlzLl9uZWVkc1JlZnJlc2gpCnRoaXMucmVmcmVzaCgpO30KcmVmcmVzaCgpe2lmKHRoaXMuaXNTaG93aW5nKCkpe3RoaXMuX2NvZGVNaXJyb3IucmVmcmVzaCgpO3RoaXMuX25lZWRzUmVmcmVzaD1mYWxzZTtyZXR1cm47fQp0aGlzLl9uZWVkc1JlZnJlc2g9dHJ1ZTt9CndpbGxIaWRlKCl7ZGVsZXRlIHRoaXMuX2VkaXRvclNpemVJblN5bmM7fQp1bmRvKCl7dGhpcy5fY29kZU1pcnJvci51bmRvKCk7fQpyZWRvKCl7dGhpcy5fY29kZU1pcnJvci5yZWRvKCk7fQpfaGFuZGxlS2V5RG93bihlKXtpZih0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyJiZ0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyLmtleURvd24oZSkpCmUuY29uc3VtZSh0cnVlKTt9Cl9oYW5kbGVQb3N0S2V5RG93bihlKXtpZihlLmRlZmF1bHRQcmV2ZW50ZWQpCmUuY29uc3VtZSh0cnVlKTt9CmNvbmZpZ3VyZUF1dG9jb21wbGV0ZShjb25maWcpe2lmKHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRyb2xsZXIpe3RoaXMuX2F1dG9jb21wbGV0ZUNvbnRyb2xsZXIuZGlzcG9zZSgpO2RlbGV0ZSB0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyO30KaWYoY29uZmlnKQp0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyPW5ldyBUZXh0RWRpdG9yLlRleHRFZGl0b3JBdXRvY29tcGxldGVDb250cm9sbGVyKHRoaXMsdGhpcy5fY29kZU1pcnJvcixjb25maWcpO30KY3Vyc29yUG9zaXRpb25Ub0Nvb3JkaW5hdGVzKGxpbmVOdW1iZXIsY29sdW1uKXtpZihsaW5lTnVtYmVyPj10aGlzLl9jb2RlTWlycm9yLmxpbmVDb3VudCgpfHxsaW5lTnVtYmVyPDB8fGNvbHVtbjwwfHxjb2x1bW4+dGhpcy5fY29kZU1pcnJvci5nZXRMaW5lKGxpbmVOdW1iZXIpLmxlbmd0aCkKcmV0dXJuIG51bGw7Y29uc3QgbWV0cmljcz10aGlzLl9jb2RlTWlycm9yLmN1cnNvckNvb3JkcyhuZXcgQ29kZU1pcnJvci5Qb3MobGluZU51bWJlcixjb2x1bW4pKTtyZXR1cm57eDptZXRyaWNzLmxlZnQseTptZXRyaWNzLnRvcCxoZWlnaHQ6bWV0cmljcy5ib3R0b20tbWV0cmljcy50b3B9O30KY29vcmRpbmF0ZXNUb0N1cnNvclBvc2l0aW9uKHgseSl7Y29uc3QgZWxlbWVudD10aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgseSk7aWYoIWVsZW1lbnR8fCFlbGVtZW50LmlzU2VsZk9yRGVzY2VuZGFudCh0aGlzLl9jb2RlTWlycm9yLmdldFdyYXBwZXJFbGVtZW50KCkpKQpyZXR1cm4gbnVsbDtjb25zdCBndXR0ZXJCb3g9dGhpcy5fY29kZU1pcnJvci5nZXRHdXR0ZXJFbGVtZW50KCkuYm94SW5XaW5kb3coKTtpZih4Pj1ndXR0ZXJCb3gueCYmeDw9Z3V0dGVyQm94LngrZ3V0dGVyQm94LndpZHRoJiZ5Pj1ndXR0ZXJCb3gueSYmeTw9Z3V0dGVyQm94LnkrZ3V0dGVyQm94LmhlaWdodCkKcmV0dXJuIG51bGw7Y29uc3QgY29vcmRzPXRoaXMuX2NvZGVNaXJyb3IuY29vcmRzQ2hhcih7bGVmdDp4LHRvcDp5fSk7cmV0dXJuIFRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnRvUmFuZ2UoY29vcmRzLGNvb3Jkcyk7fQp2aXN1YWxDb29yZGluYXRlcyhsaW5lTnVtYmVyLGNvbHVtbk51bWJlcil7Y29uc3QgbWV0cmljcz10aGlzLl9jb2RlTWlycm9yLmN1cnNvckNvb3JkcyhuZXcgQ29kZU1pcnJvci5Qb3MobGluZU51bWJlcixjb2x1bW5OdW1iZXIpKTtyZXR1cm57eDptZXRyaWNzLmxlZnQseTptZXRyaWNzLnRvcH07fQp0b2tlbkF0VGV4dFBvc2l0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtpZihsaW5lTnVtYmVyPDB8fGxpbmVOdW1iZXI+PXRoaXMuX2NvZGVNaXJyb3IubGluZUNvdW50KCkpCnJldHVybiBudWxsO2NvbnN0IHRva2VuPXRoaXMuX2NvZGVNaXJyb3IuZ2V0VG9rZW5BdChuZXcgQ29kZU1pcnJvci5Qb3MobGluZU51bWJlciwoY29sdW1uTnVtYmVyfHwwKSsxKSk7aWYoIXRva2VuKQpyZXR1cm4gbnVsbDtyZXR1cm57c3RhcnRDb2x1bW46dG9rZW4uc3RhcnQsZW5kQ29sdW1uOnRva2VuLmVuZCx0eXBlOnRva2VuLnR5cGV9O30KaXNDbGVhbihnZW5lcmF0aW9uKXtyZXR1cm4gdGhpcy5fY29kZU1pcnJvci5pc0NsZWFuKGdlbmVyYXRpb24pO30KbWFya0NsZWFuKCl7cmV0dXJuIHRoaXMuX2NvZGVNaXJyb3IuY2hhbmdlR2VuZXJhdGlvbih0cnVlKTt9Cl9oYXNMb25nTGluZXMoKXtmdW5jdGlvbiBsaW5lSXRlcmF0b3IobGluZUhhbmRsZSl7aWYobGluZUhhbmRsZS50ZXh0Lmxlbmd0aD5UZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLkxvbmdMaW5lTW9kZUxpbmVMZW5ndGhUaHJlc2hvbGQpCmhhc0xvbmdMaW5lcz10cnVlO3JldHVybiBoYXNMb25nTGluZXM7fQpsZXQgaGFzTG9uZ0xpbmVzPWZhbHNlO3RoaXMuX2NvZGVNaXJyb3IuZWFjaExpbmUobGluZUl0ZXJhdG9yKTtyZXR1cm4gaGFzTG9uZ0xpbmVzO30KX2VuYWJsZUxvbmdMaW5lc01vZGUoKXt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignc3R5bGVTZWxlY3RlZFRleHQnLGZhbHNlKTt9Cl9kaXNhYmxlTG9uZ0xpbmVzTW9kZSgpe3RoaXMuX2NvZGVNaXJyb3Iuc2V0T3B0aW9uKCdzdHlsZVNlbGVjdGVkVGV4dCcsdHJ1ZSk7fQpzZXRNaW1lVHlwZShtaW1lVHlwZSl7dGhpcy5fbWltZVR5cGU9bWltZVR5cGU7Y29uc3QgbW9kZXNUb0xvYWQ9VGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvci5fY29sbGVjdFVuaW5zdGFsbGVkTW9kZXMobWltZVR5cGUpO2lmKCFtb2Rlc1RvTG9hZC5sZW5ndGgpCnNldE1vZGUuY2FsbCh0aGlzKTtlbHNlClRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuX2luc3RhbGxNaW1lVHlwZU1vZGVzKG1vZGVzVG9Mb2FkKS50aGVuKHNldE1vZGUuYmluZCh0aGlzKSk7ZnVuY3Rpb24gc2V0TW9kZSgpe2NvbnN0IHJld3JpdHRlbk1pbWVUeXBlPXRoaXMucmV3cml0ZU1pbWVUeXBlKG1pbWVUeXBlKTtpZih0aGlzLl9jb2RlTWlycm9yLm9wdGlvbnMubW9kZSE9PXJld3JpdHRlbk1pbWVUeXBlKQp0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignbW9kZScscmV3cml0dGVuTWltZVR5cGUpO319CnNldEhpZ2hsaWdodE1vZGUobW9kZSl7dGhpcy5fbWltZVR5cGU9Jyc7dGhpcy5fY29kZU1pcnJvci5zZXRPcHRpb24oJ21vZGUnLG1vZGUpO30KcmV3cml0ZU1pbWVUeXBlKG1pbWVUeXBlKXtyZXR1cm4gbWltZVR5cGU7fQptaW1lVHlwZSgpe3JldHVybiB0aGlzLl9taW1lVHlwZTt9CnNldFJlYWRPbmx5KHJlYWRPbmx5KXtpZih0aGlzLl9yZWFkT25seT09PXJlYWRPbmx5KQpyZXR1cm47dGhpcy5jbGVhclBvc2l0aW9uSGlnaGxpZ2h0KCk7dGhpcy5fcmVhZE9ubHk9cmVhZE9ubHk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ0NvZGVNaXJyb3ItcmVhZG9ubHknLHJlYWRPbmx5KTt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbigncmVhZE9ubHknLHJlYWRPbmx5KTt9CnJlYWRPbmx5KCl7cmV0dXJuISF0aGlzLl9jb2RlTWlycm9yLmdldE9wdGlvbigncmVhZE9ubHknKTt9CnNldExpbmVOdW1iZXJGb3JtYXR0ZXIoZm9ybWF0dGVyKXt0aGlzLl9jb2RlTWlycm9yLnNldE9wdGlvbignbGluZU51bWJlckZvcm1hdHRlcicsZm9ybWF0dGVyKTt9CmFkZEtleURvd25IYW5kbGVyKGhhbmRsZXIpe3RoaXMuX2NvZGVNaXJyb3Iub24oJ2tleWRvd24nLChDb2RlTWlycm9yLGV2ZW50KT0+aGFuZGxlcihldmVudCkpO30KYWRkQm9va21hcmsobGluZU51bWJlcixjb2x1bW5OdW1iZXIsZWxlbWVudCx0eXBlLGluc2VydEJlZm9yZSl7Y29uc3QgYm9va21hcms9bmV3IFRleHRFZGl0b3IuVGV4dEVkaXRvckJvb2tNYXJrKHRoaXMuX2NvZGVNaXJyb3Iuc2V0Qm9va21hcmsobmV3IENvZGVNaXJyb3IuUG9zKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKSx7d2lkZ2V0OmVsZW1lbnQsaW5zZXJ0TGVmdDppbnNlcnRCZWZvcmV9KSx0eXBlLHRoaXMpO3RoaXMuX3VwZGF0ZURlY29yYXRpb25zKGxpbmVOdW1iZXIpO3JldHVybiBib29rbWFyazt9CmJvb2ttYXJrcyhyYW5nZSx0eXBlKXtjb25zdCBwb3M9VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9Qb3MocmFuZ2UpO2xldCBtYXJrZXJzPXRoaXMuX2NvZGVNaXJyb3IuZmluZE1hcmtzQXQocG9zLnN0YXJ0KTtpZighcmFuZ2UuaXNFbXB0eSgpKXtjb25zdCBtaWRkbGVNYXJrZXJzPXRoaXMuX2NvZGVNaXJyb3IuZmluZE1hcmtzKHBvcy5zdGFydCxwb3MuZW5kKTtjb25zdCBlbmRNYXJrZXJzPXRoaXMuX2NvZGVNaXJyb3IuZmluZE1hcmtzQXQocG9zLmVuZCk7bWFya2Vycz1tYXJrZXJzLmNvbmNhdChtaWRkbGVNYXJrZXJzLGVuZE1hcmtlcnMpO30KY29uc3QgYm9va21hcmtzPVtdO2ZvcihsZXQgaT0wO2k8bWFya2Vycy5sZW5ndGg7aSsrKXtjb25zdCBib29rbWFyaz1tYXJrZXJzW2ldW1RleHRFZGl0b3IuVGV4dEVkaXRvckJvb2tNYXJrLl9zeW1ib2xdO2lmKGJvb2ttYXJrJiYoIXR5cGV8fGJvb2ttYXJrLnR5cGUoKT09PXR5cGUpKQpib29rbWFya3MucHVzaChib29rbWFyayk7fQpyZXR1cm4gYm9va21hcmtzO30KZm9jdXMoKXt0aGlzLl9jb2RlTWlycm9yLmZvY3VzKCk7fQpoYXNGb2N1cygpe3JldHVybiB0aGlzLl9jb2RlTWlycm9yLmhhc0ZvY3VzKCk7fQpvcGVyYXRpb24ob3BlcmF0aW9uKXt0aGlzLl9jb2RlTWlycm9yLm9wZXJhdGlvbihvcGVyYXRpb24pO30Kc2Nyb2xsTGluZUludG9WaWV3KGxpbmVOdW1iZXIpe3RoaXMuX2lubmVyUmV2ZWFsTGluZShsaW5lTnVtYmVyLHRoaXMuX2NvZGVNaXJyb3IuZ2V0U2Nyb2xsSW5mbygpKTt9Cl9pbm5lclJldmVhbExpbmUobGluZU51bWJlcixzY3JvbGxJbmZvKXtjb25zdCB0b3BMaW5lPXRoaXMuX2NvZGVNaXJyb3IubGluZUF0SGVpZ2h0KHNjcm9sbEluZm8udG9wLCdsb2NhbCcpO2NvbnN0IGJvdHRvbUxpbmU9dGhpcy5fY29kZU1pcnJvci5saW5lQXRIZWlnaHQoc2Nyb2xsSW5mby50b3Arc2Nyb2xsSW5mby5jbGllbnRIZWlnaHQsJ2xvY2FsJyk7Y29uc3QgbGluZXNQZXJTY3JlZW49Ym90dG9tTGluZS10b3BMaW5lKzE7aWYobGluZU51bWJlcjx0b3BMaW5lKXtjb25zdCB0b3BMaW5lVG9SZXZlYWw9TWF0aC5tYXgobGluZU51bWJlci0obGluZXNQZXJTY3JlZW4vMikrMSwwKXwwO3RoaXMuX2NvZGVNaXJyb3Iuc2Nyb2xsSW50b1ZpZXcobmV3IENvZGVNaXJyb3IuUG9zKHRvcExpbmVUb1JldmVhbCwwKSk7fWVsc2UgaWYobGluZU51bWJlcj5ib3R0b21MaW5lKXtjb25zdCBib3R0b21MaW5lVG9SZXZlYWw9TWF0aC5taW4obGluZU51bWJlcisobGluZXNQZXJTY3JlZW4vMiktMSx0aGlzLmxpbmVzQ291bnQtMSl8MDt0aGlzLl9jb2RlTWlycm9yLnNjcm9sbEludG9WaWV3KG5ldyBDb2RlTWlycm9yLlBvcyhib3R0b21MaW5lVG9SZXZlYWwsMCkpO319CmFkZERlY29yYXRpb24oZWxlbWVudCxsaW5lTnVtYmVyLHN0YXJ0Q29sdW1uLGVuZENvbHVtbil7Y29uc3Qgd2lkZ2V0PXRoaXMuX2NvZGVNaXJyb3IuYWRkTGluZVdpZGdldChsaW5lTnVtYmVyLGVsZW1lbnQpO2xldCB1cGRhdGU9bnVsbDtpZih0eXBlb2Ygc3RhcnRDb2x1bW4hPT0ndW5kZWZpbmVkJyl7aWYodHlwZW9mIGVuZENvbHVtbj09PSd1bmRlZmluZWQnKQplbmRDb2x1bW49SW5maW5pdHk7dXBkYXRlPXRoaXMuX3VwZGF0ZUZsb2F0aW5nRGVjb3JhdGlvbi5iaW5kKHRoaXMsZWxlbWVudCxsaW5lTnVtYmVyLHN0YXJ0Q29sdW1uLGVuZENvbHVtbik7dXBkYXRlKCk7fQp0aGlzLl9kZWNvcmF0aW9ucy5zZXQobGluZU51bWJlcix7ZWxlbWVudDplbGVtZW50LHVwZGF0ZTp1cGRhdGUsd2lkZ2V0OndpZGdldH0pO30KX3VwZGF0ZUZsb2F0aW5nRGVjb3JhdGlvbihlbGVtZW50LGxpbmVOdW1iZXIsc3RhcnRDb2x1bW4sZW5kQ29sdW1uKXtjb25zdCBiYXNlPXRoaXMuX2NvZGVNaXJyb3IuY3Vyc29yQ29vcmRzKG5ldyBDb2RlTWlycm9yLlBvcyhsaW5lTnVtYmVyLDApLCdwYWdlJyk7Y29uc3Qgc3RhcnQ9dGhpcy5fY29kZU1pcnJvci5jdXJzb3JDb29yZHMobmV3IENvZGVNaXJyb3IuUG9zKGxpbmVOdW1iZXIsc3RhcnRDb2x1bW4pLCdwYWdlJyk7Y29uc3QgZW5kPXRoaXMuX2NvZGVNaXJyb3IuY2hhckNvb3JkcyhuZXcgQ29kZU1pcnJvci5Qb3MobGluZU51bWJlcixlbmRDb2x1bW4pLCdwYWdlJyk7ZWxlbWVudC5zdHlsZS53aWR0aD0oZW5kLnJpZ2h0LXN0YXJ0LmxlZnQpKydweCc7ZWxlbWVudC5zdHlsZS5sZWZ0PShzdGFydC5sZWZ0LWJhc2UubGVmdCkrJ3B4Jzt9Cl91cGRhdGVEZWNvcmF0aW9ucyhsaW5lTnVtYmVyKXt0aGlzLl9kZWNvcmF0aW9ucy5nZXQobGluZU51bWJlcikuZm9yRWFjaChpbm5lclVwZGF0ZURlY29yYXRpb25zKTtmdW5jdGlvbiBpbm5lclVwZGF0ZURlY29yYXRpb25zKGRlY29yYXRpb24pe2lmKGRlY29yYXRpb24udXBkYXRlKQpkZWNvcmF0aW9uLnVwZGF0ZSgpO319CnJlbW92ZURlY29yYXRpb24oZWxlbWVudCxsaW5lTnVtYmVyKXt0aGlzLl9kZWNvcmF0aW9ucy5nZXQobGluZU51bWJlcikuZm9yRWFjaChpbm5lclJlbW92ZURlY29yYXRpb24uYmluZCh0aGlzKSk7ZnVuY3Rpb24gaW5uZXJSZW1vdmVEZWNvcmF0aW9uKGRlY29yYXRpb24pe2lmKGRlY29yYXRpb24uZWxlbWVudCE9PWVsZW1lbnQpCnJldHVybjt0aGlzLl9jb2RlTWlycm9yLnJlbW92ZUxpbmVXaWRnZXQoZGVjb3JhdGlvbi53aWRnZXQpO3RoaXMuX2RlY29yYXRpb25zLmRlbGV0ZShsaW5lTnVtYmVyLGRlY29yYXRpb24pO319CnJldmVhbFBvc2l0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyLHNob3VsZEhpZ2hsaWdodCl7bGluZU51bWJlcj1OdW1iZXIuY29uc3RyYWluKGxpbmVOdW1iZXIsMCx0aGlzLl9jb2RlTWlycm9yLmxpbmVDb3VudCgpLTEpO2lmKHR5cGVvZiBjb2x1bW5OdW1iZXIhPT0nbnVtYmVyJykKY29sdW1uTnVtYmVyPTA7Y29sdW1uTnVtYmVyPU51bWJlci5jb25zdHJhaW4oY29sdW1uTnVtYmVyLDAsdGhpcy5fY29kZU1pcnJvci5nZXRMaW5lKGxpbmVOdW1iZXIpLmxlbmd0aCk7dGhpcy5jbGVhclBvc2l0aW9uSGlnaGxpZ2h0KCk7dGhpcy5faGlnaGxpZ2h0ZWRMaW5lPXRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZUhhbmRsZShsaW5lTnVtYmVyKTtpZighdGhpcy5faGlnaGxpZ2h0ZWRMaW5lKQpyZXR1cm47dGhpcy5zY3JvbGxMaW5lSW50b1ZpZXcobGluZU51bWJlcik7aWYoc2hvdWxkSGlnaGxpZ2h0KXt0aGlzLl9jb2RlTWlycm9yLmFkZExpbmVDbGFzcyh0aGlzLl9oaWdobGlnaHRlZExpbmUsbnVsbCx0aGlzLl9yZWFkT25seT8nY20tcmVhZG9ubHktaGlnaGxpZ2h0JzonY20taGlnaGxpZ2h0Jyk7aWYoIXRoaXMuX3JlYWRPbmx5KQp0aGlzLl9jbGVhckhpZ2hsaWdodFRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLmNsZWFyUG9zaXRpb25IaWdobGlnaHQuYmluZCh0aGlzKSwyMDAwKTt9CnRoaXMuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKSk7fQpjbGVhclBvc2l0aW9uSGlnaGxpZ2h0KCl7aWYodGhpcy5fY2xlYXJIaWdobGlnaHRUaW1lb3V0KQpjbGVhclRpbWVvdXQodGhpcy5fY2xlYXJIaWdobGlnaHRUaW1lb3V0KTtkZWxldGUgdGhpcy5fY2xlYXJIaWdobGlnaHRUaW1lb3V0O2lmKHRoaXMuX2hpZ2hsaWdodGVkTGluZSl7dGhpcy5fY29kZU1pcnJvci5yZW1vdmVMaW5lQ2xhc3ModGhpcy5faGlnaGxpZ2h0ZWRMaW5lLG51bGwsdGhpcy5fcmVhZE9ubHk/J2NtLXJlYWRvbmx5LWhpZ2hsaWdodCc6J2NtLWhpZ2hsaWdodCcpO30KZGVsZXRlIHRoaXMuX2hpZ2hsaWdodGVkTGluZTt9CmVsZW1lbnRzVG9SZXN0b3JlU2Nyb2xsUG9zaXRpb25zRm9yKCl7cmV0dXJuW107fQpfdXBkYXRlUGFkZGluZ0JvdHRvbSh3aWR0aCxoZWlnaHQpe2lmKCF0aGlzLl9vcHRpb25zLnBhZEJvdHRvbSkKcmV0dXJuO2NvbnN0IHNjcm9sbEluZm89dGhpcy5fY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7bGV0IG5ld1BhZGRpbmdCb3R0b207Y29uc3QgbGluZXNFbGVtZW50PXRoaXMuX2NvZGVNaXJyb3JFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5Db2RlTWlycm9yLWxpbmVzJyk7Y29uc3QgbGluZUNvdW50PXRoaXMuX2NvZGVNaXJyb3IubGluZUNvdW50KCk7aWYobGluZUNvdW50PD0xKXtuZXdQYWRkaW5nQm90dG9tPTA7fWVsc2V7bmV3UGFkZGluZ0JvdHRvbT1NYXRoLm1heChzY3JvbGxJbmZvLmNsaWVudEhlaWdodC10aGlzLl9jb2RlTWlycm9yLmdldExpbmVIYW5kbGUodGhpcy5fY29kZU1pcnJvci5sYXN0TGluZSgpKS5oZWlnaHQsMCk7fQpuZXdQYWRkaW5nQm90dG9tKz0ncHgnO2xpbmVzRWxlbWVudC5zdHlsZS5wYWRkaW5nQm90dG9tPW5ld1BhZGRpbmdCb3R0b207dGhpcy5fY29kZU1pcnJvci5zZXRTaXplKHdpZHRoLGhlaWdodCk7fQpfcmVzaXplRWRpdG9yKCl7Y29uc3QgcGFyZW50RWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudDtpZighcGFyZW50RWxlbWVudHx8IXRoaXMuaXNTaG93aW5nKCkpCnJldHVybjt0aGlzLl9jb2RlTWlycm9yLm9wZXJhdGlvbigoKT0+e2NvbnN0IHNjcm9sbExlZnQ9dGhpcy5fY29kZU1pcnJvci5kb2Muc2Nyb2xsTGVmdDtjb25zdCBzY3JvbGxUb3A9dGhpcy5fY29kZU1pcnJvci5kb2Muc2Nyb2xsVG9wO2NvbnN0IHdpZHRoPXBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7Y29uc3QgaGVpZ2h0PXBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LXRoaXMuZWxlbWVudC5vZmZzZXRUb3A7aWYodGhpcy5fb3B0aW9ucy5hdXRvSGVpZ2h0KXt0aGlzLl9jb2RlTWlycm9yLnNldFNpemUod2lkdGgsJ2F1dG8nKTt9ZWxzZXt0aGlzLl9jb2RlTWlycm9yLnNldFNpemUod2lkdGgsaGVpZ2h0KTt0aGlzLl91cGRhdGVQYWRkaW5nQm90dG9tKHdpZHRoLGhlaWdodCk7fQp0aGlzLl9jb2RlTWlycm9yLnNjcm9sbFRvKHNjcm9sbExlZnQsc2Nyb2xsVG9wKTt9KTt9Cm9uUmVzaXplKCl7aWYodGhpcy5fYXV0b2NvbXBsZXRlQ29udHJvbGxlcikKdGhpcy5fYXV0b2NvbXBsZXRlQ29udHJvbGxlci5jbGVhckF1dG9jb21wbGV0ZSgpO3RoaXMuX3Jlc2l6ZUVkaXRvcigpO3RoaXMuX2VkaXRvclNpemVJblN5bmM9dHJ1ZTtpZih0aGlzLl9zZWxlY3Rpb25TZXRTY2hlZHVsZWQpe2RlbGV0ZSB0aGlzLl9zZWxlY3Rpb25TZXRTY2hlZHVsZWQ7dGhpcy5zZXRTZWxlY3Rpb24odGhpcy5fbGFzdFNlbGVjdGlvbik7fX0KZWRpdFJhbmdlKHJhbmdlLHRleHQsb3JpZ2luKXtjb25zdCBwb3M9VGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9Qb3MocmFuZ2UpO3RoaXMuX2NvZGVNaXJyb3IucmVwbGFjZVJhbmdlKHRleHQscG9zLnN0YXJ0LHBvcy5lbmQsb3JpZ2luKTtjb25zdCBuZXdSYW5nZT1UZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1JhbmdlKHBvcy5zdGFydCx0aGlzLl9jb2RlTWlycm9yLnBvc0Zyb21JbmRleCh0aGlzLl9jb2RlTWlycm9yLmluZGV4RnJvbVBvcyhwb3Muc3RhcnQpK3RleHQubGVuZ3RoKSk7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVGV4dEVkaXRvci5FdmVudHMuVGV4dENoYW5nZWQse29sZFJhbmdlOnJhbmdlLG5ld1JhbmdlOm5ld1JhbmdlfSk7cmV0dXJuIG5ld1JhbmdlO30KY2xlYXJBdXRvY29tcGxldGUoKXtpZih0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyKQp0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyLmNsZWFyQXV0b2NvbXBsZXRlKCk7fQp3b3JkUmFuZ2VGb3JDdXJzb3JQb3NpdGlvbihsaW5lTnVtYmVyLGNvbHVtbixpc1dvcmRDaGFyKXtjb25zdCBsaW5lPXRoaXMubGluZShsaW5lTnVtYmVyKTtsZXQgd29yZFN0YXJ0PWNvbHVtbjtpZihjb2x1bW4hPT0wJiZpc1dvcmRDaGFyKGxpbmUuY2hhckF0KGNvbHVtbi0xKSkpe3dvcmRTdGFydD1jb2x1bW4tMTt3aGlsZSh3b3JkU3RhcnQ+MCYmaXNXb3JkQ2hhcihsaW5lLmNoYXJBdCh3b3JkU3RhcnQtMSkpKQotLXdvcmRTdGFydDt9CmxldCB3b3JkRW5kPWNvbHVtbjt3aGlsZSh3b3JkRW5kPGxpbmUubGVuZ3RoJiZpc1dvcmRDaGFyKGxpbmUuY2hhckF0KHdvcmRFbmQpKSkKKyt3b3JkRW5kO3JldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShsaW5lTnVtYmVyLHdvcmRTdGFydCxsaW5lTnVtYmVyLHdvcmRFbmQpO30KX2NoYW5nZXMoY29kZU1pcnJvcixjaGFuZ2VzKXtpZighY2hhbmdlcy5sZW5ndGgpCnJldHVybjt0aGlzLl91cGRhdGVQbGFjZWhvbGRlcigpO2NvbnN0IGhhc09uZUxpbmU9dGhpcy5fY29kZU1pcnJvci5saW5lQ291bnQoKT09PTE7aWYoaGFzT25lTGluZSE9PXRoaXMuX2hhc09uZUxpbmUpCnRoaXMuX3Jlc2l6ZUVkaXRvcigpO3RoaXMuX2hhc09uZUxpbmU9aGFzT25lTGluZTt0aGlzLl9kZWNvcmF0aW9ucy52YWx1ZXNBcnJheSgpLmZvckVhY2goZGVjb3JhdGlvbj0+dGhpcy5fY29kZU1pcnJvci5yZW1vdmVMaW5lV2lkZ2V0KGRlY29yYXRpb24ud2lkZ2V0KSk7dGhpcy5fZGVjb3JhdGlvbnMuY2xlYXIoKTtjb25zdCBlZGl0cz1bXTtsZXQgY3VycmVudEVkaXQ7Zm9yKGxldCBjaGFuZ2VJbmRleD0wO2NoYW5nZUluZGV4PGNoYW5nZXMubGVuZ3RoOysrY2hhbmdlSW5kZXgpe2NvbnN0IGNoYW5nZU9iamVjdD1jaGFuZ2VzW2NoYW5nZUluZGV4XTtjb25zdCBlZGl0PVRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLmNoYW5nZU9iamVjdFRvRWRpdE9wZXJhdGlvbihjaGFuZ2VPYmplY3QpO2lmKGN1cnJlbnRFZGl0JiZlZGl0Lm9sZFJhbmdlLmVxdWFsKGN1cnJlbnRFZGl0Lm5ld1JhbmdlKSl7Y3VycmVudEVkaXQubmV3UmFuZ2U9ZWRpdC5uZXdSYW5nZTt9ZWxzZXtjdXJyZW50RWRpdD1lZGl0O2VkaXRzLnB1c2goY3VycmVudEVkaXQpO319CmZvcihsZXQgaT0wO2k8ZWRpdHMubGVuZ3RoO2krKyl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVUkuVGV4dEVkaXRvci5FdmVudHMuVGV4dENoYW5nZWQse29sZFJhbmdlOmVkaXRzW2ldLm9sZFJhbmdlLG5ld1JhbmdlOmVkaXRzW2ldLm5ld1JhbmdlfSk7fX0KX2JlZm9yZVNlbGVjdGlvbkNoYW5nZShjb2RlTWlycm9yLHNlbGVjdGlvbil7dGhpcy5fc2VsZWN0TmV4dE9jY3VycmVuY2VDb250cm9sbGVyLnNlbGVjdGlvbldpbGxDaGFuZ2UoKTt9CnNjcm9sbFRvTGluZShsaW5lTnVtYmVyKXtjb25zdCBwb3M9bmV3IENvZGVNaXJyb3IuUG9zKGxpbmVOdW1iZXIsMCk7Y29uc3QgY29vcmRzPXRoaXMuX2NvZGVNaXJyb3IuY2hhckNvb3Jkcyhwb3MsJ2xvY2FsJyk7dGhpcy5fY29kZU1pcnJvci5zY3JvbGxUbygwLGNvb3Jkcy50b3ApO30KZmlyc3RWaXNpYmxlTGluZSgpe3JldHVybiB0aGlzLl9jb2RlTWlycm9yLmxpbmVBdEhlaWdodCh0aGlzLl9jb2RlTWlycm9yLmdldFNjcm9sbEluZm8oKS50b3AsJ2xvY2FsJyk7fQpzY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5fY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCkudG9wO30Kc2V0U2Nyb2xsVG9wKHNjcm9sbFRvcCl7dGhpcy5fY29kZU1pcnJvci5zY3JvbGxUbygwLHNjcm9sbFRvcCk7fQpsYXN0VmlzaWJsZUxpbmUoKXtjb25zdCBzY3JvbGxJbmZvPXRoaXMuX2NvZGVNaXJyb3IuZ2V0U2Nyb2xsSW5mbygpO3JldHVybiB0aGlzLl9jb2RlTWlycm9yLmxpbmVBdEhlaWdodChzY3JvbGxJbmZvLnRvcCtzY3JvbGxJbmZvLmNsaWVudEhlaWdodCwnbG9jYWwnKTt9CnNlbGVjdGlvbigpe2NvbnN0IHN0YXJ0PXRoaXMuX2NvZGVNaXJyb3IuZ2V0Q3Vyc29yKCdhbmNob3InKTtjb25zdCBlbmQ9dGhpcy5fY29kZU1pcnJvci5nZXRDdXJzb3IoJ2hlYWQnKTtyZXR1cm4gVGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9SYW5nZShzdGFydCxlbmQpO30Kc2VsZWN0aW9ucygpe2NvbnN0IHNlbGVjdGlvbkxpc3Q9dGhpcy5fY29kZU1pcnJvci5saXN0U2VsZWN0aW9ucygpO2NvbnN0IHJlc3VsdD1bXTtmb3IobGV0IGk9MDtpPHNlbGVjdGlvbkxpc3QubGVuZ3RoOysraSl7Y29uc3Qgc2VsZWN0aW9uPXNlbGVjdGlvbkxpc3RbaV07cmVzdWx0LnB1c2goVGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9SYW5nZShzZWxlY3Rpb24uYW5jaG9yLHNlbGVjdGlvbi5oZWFkKSk7fQpyZXR1cm4gcmVzdWx0O30KbGFzdFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9sYXN0U2VsZWN0aW9uO30Kc2V0U2VsZWN0aW9uKHRleHRSYW5nZSxkb250U2Nyb2xsKXt0aGlzLl9sYXN0U2VsZWN0aW9uPXRleHRSYW5nZTtpZighdGhpcy5fZWRpdG9yU2l6ZUluU3luYyl7dGhpcy5fc2VsZWN0aW9uU2V0U2NoZWR1bGVkPXRydWU7cmV0dXJuO30KY29uc3QgcG9zPVRleHRFZGl0b3IuQ29kZU1pcnJvclV0aWxzLnRvUG9zKHRleHRSYW5nZSk7dGhpcy5fY29kZU1pcnJvci5zZXRTZWxlY3Rpb24ocG9zLnN0YXJ0LHBvcy5lbmQse3Njcm9sbDohZG9udFNjcm9sbH0pO30Kc2V0U2VsZWN0aW9ucyhyYW5nZXMscHJpbWFyeVNlbGVjdGlvbkluZGV4KXtjb25zdCBzZWxlY3Rpb25zPVtdO2ZvcihsZXQgaT0wO2k8cmFuZ2VzLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1UZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1BvcyhyYW5nZXNbaV0pO3NlbGVjdGlvbnMucHVzaCh7YW5jaG9yOnNlbGVjdGlvbi5zdGFydCxoZWFkOnNlbGVjdGlvbi5lbmR9KTt9CnByaW1hcnlTZWxlY3Rpb25JbmRleD1wcmltYXJ5U2VsZWN0aW9uSW5kZXh8fDA7dGhpcy5fY29kZU1pcnJvci5zZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnMscHJpbWFyeVNlbGVjdGlvbkluZGV4LHtzY3JvbGw6ZmFsc2V9KTt9Cl9kZXRlY3RMaW5lU2VwYXJhdG9yKHRleHQpe3RoaXMuX2xpbmVTZXBhcmF0b3I9dGV4dC5pbmRleE9mKCdcclxuJyk+PTA/J1xyXG4nOidcbic7fQpzZXRUZXh0KHRleHQpe2lmKHRleHQubGVuZ3RoPlRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuTWF4RWRpdGFibGVUZXh0U2l6ZSl7dGhpcy5jb25maWd1cmVBdXRvY29tcGxldGUobnVsbCk7dGhpcy5zZXRSZWFkT25seSh0cnVlKTt9CnRoaXMuX2NvZGVNaXJyb3Iuc2V0VmFsdWUodGV4dCk7aWYodGhpcy5fc2hvdWxkQ2xlYXJIaXN0b3J5KXt0aGlzLl9jb2RlTWlycm9yLmNsZWFySGlzdG9yeSgpO3RoaXMuX3Nob3VsZENsZWFySGlzdG9yeT1mYWxzZTt9CnRoaXMuX2RldGVjdExpbmVTZXBhcmF0b3IodGV4dCk7aWYodGhpcy5faGFzTG9uZ0xpbmVzKCkpCnRoaXMuX2VuYWJsZUxvbmdMaW5lc01vZGUoKTtlbHNlCnRoaXMuX2Rpc2FibGVMb25nTGluZXNNb2RlKCk7aWYoIXRoaXMuaXNTaG93aW5nKCkpCnRoaXMucmVmcmVzaCgpO30KdGV4dCh0ZXh0UmFuZ2Upe2lmKCF0ZXh0UmFuZ2UpCnJldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldFZhbHVlKHRoaXMuX2xpbmVTZXBhcmF0b3IpO2NvbnN0IHBvcz1UZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1Bvcyh0ZXh0UmFuZ2Uubm9ybWFsaXplKCkpO3JldHVybiB0aGlzLl9jb2RlTWlycm9yLmdldFJhbmdlKHBvcy5zdGFydCxwb3MuZW5kLHRoaXMuX2xpbmVTZXBhcmF0b3IpO30KdGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpe2lmKCF0aGlzLl9hdXRvY29tcGxldGVDb250cm9sbGVyKQpyZXR1cm4gdGhpcy50ZXh0KCk7cmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZUNvbnRyb2xsZXIudGV4dFdpdGhDdXJyZW50U3VnZ2VzdGlvbigpO30KZnVsbFJhbmdlKCl7Y29uc3QgbGluZUNvdW50PXRoaXMubGluZXNDb3VudDtjb25zdCBsYXN0TGluZT10aGlzLl9jb2RlTWlycm9yLmdldExpbmUobGluZUNvdW50LTEpO3JldHVybiBUZXh0RWRpdG9yLkNvZGVNaXJyb3JVdGlscy50b1JhbmdlKG5ldyBDb2RlTWlycm9yLlBvcygwLDApLG5ldyBDb2RlTWlycm9yLlBvcyhsaW5lQ291bnQtMSxsYXN0TGluZS5sZW5ndGgpKTt9CmxpbmUobGluZU51bWJlcil7cmV0dXJuIHRoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZShsaW5lTnVtYmVyKTt9CmdldCBsaW5lc0NvdW50KCl7cmV0dXJuIHRoaXMuX2NvZGVNaXJyb3IubGluZUNvdW50KCk7fQpuZXdsaW5lQW5kSW5kZW50KCl7dGhpcy5fY29kZU1pcnJvci5leGVjQ29tbWFuZCgnbmV3bGluZUFuZEluZGVudCcpO30KdGV4dEVkaXRvclBvc2l0aW9uSGFuZGxlKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKXtyZXR1cm4gbmV3IFRleHRFZGl0b3IuQ29kZU1pcnJvclBvc2l0aW9uSGFuZGxlKHRoaXMuX2NvZGVNaXJyb3IsbmV3IENvZGVNaXJyb3IuUG9zKGxpbmVOdW1iZXIsY29sdW1uTnVtYmVyKSk7fQpfdXBkYXRlUGxhY2Vob2xkZXIoKXtpZighdGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50KQpyZXR1cm47dGhpcy5fcGxhY2Vob2xkZXJFbGVtZW50LnJlbW92ZSgpO2lmKHRoaXMubGluZXNDb3VudD09PTEmJiF0aGlzLmxpbmUoMCkpe3RoaXMuX2NvZGVNaXJyb3IuZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKHRoaXMuX3BsYWNlaG9sZGVyRWxlbWVudCx0aGlzLl9jb2RlTWlycm9yLmRpc3BsYXkubGluZVNwYWNlLmZpcnN0Q2hpbGQpO319fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLm1heEhpZ2hsaWdodExlbmd0aD0xMDAwO0NvZGVNaXJyb3IuY29tbWFuZHMuYXV0b2NvbXBsZXRlPVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuYXV0b2NvbXBsZXRlQ29tbWFuZDtDb2RlTWlycm9yLmNvbW1hbmRzLnVuZG9MYXN0U2VsZWN0aW9uPVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IudW5kb0xhc3RTZWxlY3Rpb25Db21tYW5kO0NvZGVNaXJyb3IuY29tbWFuZHMuc2VsZWN0TmV4dE9jY3VycmVuY2U9VGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvci5zZWxlY3ROZXh0T2NjdXJyZW5jZUNvbW1hbmQ7Q29kZU1pcnJvci5jb21tYW5kcy5tb3ZlQ2FtZWxMZWZ0PVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IubW92ZUNhbWVsTGVmdENvbW1hbmQuYmluZChudWxsLGZhbHNlKTtDb2RlTWlycm9yLmNvbW1hbmRzLnNlbGVjdENhbWVsTGVmdD1UZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLm1vdmVDYW1lbExlZnRDb21tYW5kLmJpbmQobnVsbCx0cnVlKTtDb2RlTWlycm9yLmNvbW1hbmRzLm1vdmVDYW1lbFJpZ2h0PVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IubW92ZUNhbWVsUmlnaHRDb21tYW5kLmJpbmQobnVsbCxmYWxzZSk7Q29kZU1pcnJvci5jb21tYW5kcy5zZWxlY3RDYW1lbFJpZ2h0PVRleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IubW92ZUNhbWVsUmlnaHRDb21tYW5kLmJpbmQobnVsbCx0cnVlKTtDb2RlTWlycm9yLmNvbW1hbmRzLmdvdG9NYXRjaGluZ0JyYWNrZXQ9ZnVuY3Rpb24oY29kZU1pcnJvcil7Y29uc3QgdXBkYXRlZFNlbGVjdGlvbnM9W107Y29uc3Qgc2VsZWN0aW9ucz1jb2RlTWlycm9yLmxpc3RTZWxlY3Rpb25zKCk7Zm9yKGxldCBpPTA7aTxzZWxlY3Rpb25zLmxlbmd0aDsrK2kpe2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zW2ldO2NvbnN0IGN1cnNvcj1zZWxlY3Rpb24uaGVhZDtjb25zdCBtYXRjaGluZ0JyYWNrZXQ9Y29kZU1pcnJvci5maW5kTWF0Y2hpbmdCcmFja2V0KGN1cnNvcixmYWxzZSx7bWF4U2NhbkxpbmVzOjEwMDAwfSk7bGV0IHVwZGF0ZWRIZWFkPWN1cnNvcjtpZihtYXRjaGluZ0JyYWNrZXQmJm1hdGNoaW5nQnJhY2tldC5tYXRjaCl7Y29uc3QgY29sdW1uQ29ycmVjdGlvbj1Db2RlTWlycm9yLmNtcFBvcyhtYXRjaGluZ0JyYWNrZXQuZnJvbSxjdXJzb3IpPT09MD8xOjA7dXBkYXRlZEhlYWQ9bmV3IENvZGVNaXJyb3IuUG9zKG1hdGNoaW5nQnJhY2tldC50by5saW5lLG1hdGNoaW5nQnJhY2tldC50by5jaCtjb2x1bW5Db3JyZWN0aW9uKTt9CnVwZGF0ZWRTZWxlY3Rpb25zLnB1c2goe2FuY2hvcjp1cGRhdGVkSGVhZCxoZWFkOnVwZGF0ZWRIZWFkfSk7fQpjb2RlTWlycm9yLnNldFNlbGVjdGlvbnModXBkYXRlZFNlbGVjdGlvbnMpO307Q29kZU1pcnJvci5jb21tYW5kcy51bmRvQW5kUmV2ZWFsPWZ1bmN0aW9uKGNvZGVtaXJyb3Ipe2NvbnN0IHNjcm9sbEluZm89Y29kZW1pcnJvci5nZXRTY3JvbGxJbmZvKCk7Y29kZW1pcnJvci5leGVjQ29tbWFuZCgndW5kbycpO2NvbnN0IGN1cnNvcj1jb2RlbWlycm9yLmdldEN1cnNvcignc3RhcnQnKTtjb2RlbWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5faW5uZXJSZXZlYWxMaW5lKGN1cnNvci5saW5lLHNjcm9sbEluZm8pO2NvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xsZXI9Y29kZW1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuX2F1dG9jb21wbGV0ZUNvbnRyb2xsZXI7aWYoYXV0b2NvbXBsZXRlQ29udHJvbGxlcikKYXV0b2NvbXBsZXRlQ29udHJvbGxlci5jbGVhckF1dG9jb21wbGV0ZSgpO307Q29kZU1pcnJvci5jb21tYW5kcy5yZWRvQW5kUmV2ZWFsPWZ1bmN0aW9uKGNvZGVtaXJyb3Ipe2NvbnN0IHNjcm9sbEluZm89Y29kZW1pcnJvci5nZXRTY3JvbGxJbmZvKCk7Y29kZW1pcnJvci5leGVjQ29tbWFuZCgncmVkbycpO2NvbnN0IGN1cnNvcj1jb2RlbWlycm9yLmdldEN1cnNvcignc3RhcnQnKTtjb2RlbWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5faW5uZXJSZXZlYWxMaW5lKGN1cnNvci5saW5lLHNjcm9sbEluZm8pO2NvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xsZXI9Y29kZW1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuX2F1dG9jb21wbGV0ZUNvbnRyb2xsZXI7aWYoYXV0b2NvbXBsZXRlQ29udHJvbGxlcikKYXV0b2NvbXBsZXRlQ29udHJvbGxlci5jbGVhckF1dG9jb21wbGV0ZSgpO307Q29kZU1pcnJvci5jb21tYW5kcy5kaXNtaXNzPWZ1bmN0aW9uKGNvZGVtaXJyb3Ipe2NvbnN0IHNlbGVjdGlvbnM9Y29kZW1pcnJvci5saXN0U2VsZWN0aW9ucygpO2NvbnN0IHNlbGVjdGlvbj1zZWxlY3Rpb25zWzBdO2lmKHNlbGVjdGlvbnMubGVuZ3RoPT09MSl7aWYoVGV4dEVkaXRvci5Db2RlTWlycm9yVXRpbHMudG9SYW5nZShzZWxlY3Rpb24uYW5jaG9yLHNlbGVjdGlvbi5oZWFkKS5pc0VtcHR5KCkpCnJldHVybiBDb2RlTWlycm9yLlBhc3M7Y29kZW1pcnJvci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLmFuY2hvcixzZWxlY3Rpb24uYW5jaG9yLHtzY3JvbGw6ZmFsc2V9KTtjb2RlbWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5zY3JvbGxMaW5lSW50b1ZpZXcoc2VsZWN0aW9uLmFuY2hvci5saW5lKTtyZXR1cm47fQpjb2RlbWlycm9yLnNldFNlbGVjdGlvbihzZWxlY3Rpb24uYW5jaG9yLHNlbGVjdGlvbi5oZWFkLHtzY3JvbGw6ZmFsc2V9KTtjb2RlbWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5zY3JvbGxMaW5lSW50b1ZpZXcoc2VsZWN0aW9uLmFuY2hvci5saW5lKTt9O0NvZGVNaXJyb3IuY29tbWFuZHMuZ29TbWFydFBhZ2VVcD1mdW5jdGlvbihjb2RlbWlycm9yKXtpZihjb2RlbWlycm9yLl9jb2RlTWlycm9yVGV4dEVkaXRvci5zZWxlY3Rpb24oKS5lcXVhbChUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbigwLDApKSkKcmV0dXJuIENvZGVNaXJyb3IuUGFzcztjb2RlbWlycm9yLmV4ZWNDb21tYW5kKCdnb1BhZ2VVcCcpO307Q29kZU1pcnJvci5jb21tYW5kcy5nb1NtYXJ0UGFnZURvd249ZnVuY3Rpb24oY29kZW1pcnJvcil7aWYoY29kZW1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3Iuc2VsZWN0aW9uKCkuZXF1YWwoY29kZW1pcnJvci5fY29kZU1pcnJvclRleHRFZGl0b3IuZnVsbFJhbmdlKCkuY29sbGFwc2VUb0VuZCgpKSkKcmV0dXJuIENvZGVNaXJyb3IuUGFzcztjb2RlbWlycm9yLmV4ZWNDb21tYW5kKCdnb1BhZ2VEb3duJyk7fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLkxvbmdMaW5lTW9kZUxpbmVMZW5ndGhUaHJlc2hvbGQ9MjAwMDtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLk1heEVkaXRhYmxlVGV4dFNpemU9MTAyNCoxMDI0KjEwO1RleHRFZGl0b3IuQ29kZU1pcnJvclBvc2l0aW9uSGFuZGxlPWNsYXNze2NvbnN0cnVjdG9yKGNvZGVNaXJyb3IscG9zKXt0aGlzLl9jb2RlTWlycm9yPWNvZGVNaXJyb3I7dGhpcy5fbGluZUhhbmRsZT1jb2RlTWlycm9yLmdldExpbmVIYW5kbGUocG9zLmxpbmUpO3RoaXMuX2NvbHVtbk51bWJlcj1wb3MuY2g7fQpyZXNvbHZlKCl7Y29uc3QgbGluZU51bWJlcj10aGlzLl9saW5lSGFuZGxlP3RoaXMuX2NvZGVNaXJyb3IuZ2V0TGluZU51bWJlcih0aGlzLl9saW5lSGFuZGxlKTpudWxsO2lmKHR5cGVvZiBsaW5lTnVtYmVyIT09J251bWJlcicpCnJldHVybiBudWxsO3JldHVybntsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuX2NvbHVtbk51bWJlcn07fQplcXVhbChwb3NpdGlvbkhhbmRsZSl7cmV0dXJuIHBvc2l0aW9uSGFuZGxlLl9saW5lSGFuZGxlPT09dGhpcy5fbGluZUhhbmRsZSYmcG9zaXRpb25IYW5kbGUuX2NvbHVtbk51bWJlcj09PXRoaXMuX2NvbHVtbk51bWJlciYmcG9zaXRpb25IYW5kbGUuX2NvZGVNaXJyb3I9PT10aGlzLl9jb2RlTWlycm9yO319O1RleHRFZGl0b3IuQ29kZU1pcnJvclRleHRFZGl0b3IuU2VsZWN0TmV4dE9jY3VycmVuY2VDb250cm9sbGVyPWNsYXNze2NvbnN0cnVjdG9yKHRleHRFZGl0b3IsY29kZU1pcnJvcil7dGhpcy5fdGV4dEVkaXRvcj10ZXh0RWRpdG9yO3RoaXMuX2NvZGVNaXJyb3I9Y29kZU1pcnJvcjt9CnNlbGVjdGlvbldpbGxDaGFuZ2UoKXtpZighdGhpcy5fbXV0ZVNlbGVjdGlvbkxpc3RlbmVyKQpkZWxldGUgdGhpcy5fZnVsbFdvcmRTZWxlY3Rpb247fQpfZmluZFJhbmdlKHNlbGVjdGlvbnMscmFuZ2Upe2ZvcihsZXQgaT0wO2k8c2VsZWN0aW9ucy5sZW5ndGg7KytpKXtpZihyYW5nZS5lcXVhbChzZWxlY3Rpb25zW2ldKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fQp1bmRvTGFzdFNlbGVjdGlvbigpe3RoaXMuX211dGVTZWxlY3Rpb25MaXN0ZW5lcj10cnVlO3RoaXMuX2NvZGVNaXJyb3IuZXhlY0NvbW1hbmQoJ3VuZG9TZWxlY3Rpb24nKTt0aGlzLl9tdXRlU2VsZWN0aW9uTGlzdGVuZXI9ZmFsc2U7fQpzZWxlY3ROZXh0T2NjdXJyZW5jZSgpe2NvbnN0IHNlbGVjdGlvbnM9dGhpcy5fdGV4dEVkaXRvci5zZWxlY3Rpb25zKCk7bGV0IGFueUVtcHR5U2VsZWN0aW9uPWZhbHNlO2ZvcihsZXQgaT0wO2k8c2VsZWN0aW9ucy5sZW5ndGg7KytpKXtjb25zdCBzZWxlY3Rpb249c2VsZWN0aW9uc1tpXTthbnlFbXB0eVNlbGVjdGlvbj1hbnlFbXB0eVNlbGVjdGlvbnx8c2VsZWN0aW9uLmlzRW1wdHkoKTtpZihzZWxlY3Rpb24uc3RhcnRMaW5lIT09c2VsZWN0aW9uLmVuZExpbmUpCnJldHVybjt9CmlmKGFueUVtcHR5U2VsZWN0aW9uKXt0aGlzLl9leHBhbmRTZWxlY3Rpb25zVG9Xb3JkcyhzZWxlY3Rpb25zKTtyZXR1cm47fQpjb25zdCBsYXN0PXNlbGVjdGlvbnNbc2VsZWN0aW9ucy5sZW5ndGgtMV07bGV0IG5leHQ9bGFzdDtkbwpuZXh0PXRoaXMuX2ZpbmROZXh0T2NjdXJyZW5jZShuZXh0LCEhdGhpcy5fZnVsbFdvcmRTZWxlY3Rpb24pO3doaWxlKG5leHQmJnRoaXMuX2ZpbmRSYW5nZShzZWxlY3Rpb25zLG5leHQpJiYhbmV4dC5lcXVhbChsYXN0KSk7aWYoIW5leHQpCnJldHVybjtzZWxlY3Rpb25zLnB1c2gobmV4dCk7dGhpcy5fbXV0ZVNlbGVjdGlvbkxpc3RlbmVyPXRydWU7dGhpcy5fdGV4dEVkaXRvci5zZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnMsc2VsZWN0aW9ucy5sZW5ndGgtMSk7ZGVsZXRlIHRoaXMuX211dGVTZWxlY3Rpb25MaXN0ZW5lcjt0aGlzLl90ZXh0RWRpdG9yLnNjcm9sbExpbmVJbnRvVmlldyhuZXh0LnN0YXJ0TGluZSk7fQpfZXhwYW5kU2VsZWN0aW9uc1RvV29yZHMoc2VsZWN0aW9ucyl7Y29uc3QgbmV3U2VsZWN0aW9ucz1bXTtmb3IobGV0IGk9MDtpPHNlbGVjdGlvbnMubGVuZ3RoOysraSl7Y29uc3Qgc2VsZWN0aW9uPXNlbGVjdGlvbnNbaV07Y29uc3Qgc3RhcnRSYW5nZVdvcmQ9dGhpcy5fdGV4dEVkaXRvci53b3JkUmFuZ2VGb3JDdXJzb3JQb3NpdGlvbihzZWxlY3Rpb24uc3RhcnRMaW5lLHNlbGVjdGlvbi5zdGFydENvbHVtbixUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIpfHxUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihzZWxlY3Rpb24uc3RhcnRMaW5lLHNlbGVjdGlvbi5zdGFydENvbHVtbik7Y29uc3QgZW5kUmFuZ2VXb3JkPXRoaXMuX3RleHRFZGl0b3Iud29yZFJhbmdlRm9yQ3Vyc29yUG9zaXRpb24oc2VsZWN0aW9uLmVuZExpbmUsc2VsZWN0aW9uLmVuZENvbHVtbixUZXh0VXRpbHMuVGV4dFV0aWxzLmlzV29yZENoYXIpfHxUZXh0VXRpbHMuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbihzZWxlY3Rpb24uZW5kTGluZSxzZWxlY3Rpb24uZW5kQ29sdW1uKTtjb25zdCBuZXdTZWxlY3Rpb249bmV3IFRleHRVdGlscy5UZXh0UmFuZ2Uoc3RhcnRSYW5nZVdvcmQuc3RhcnRMaW5lLHN0YXJ0UmFuZ2VXb3JkLnN0YXJ0Q29sdW1uLGVuZFJhbmdlV29yZC5lbmRMaW5lLGVuZFJhbmdlV29yZC5lbmRDb2x1bW4pO25ld1NlbGVjdGlvbnMucHVzaChuZXdTZWxlY3Rpb24pO30KdGhpcy5fdGV4dEVkaXRvci5zZXRTZWxlY3Rpb25zKG5ld1NlbGVjdGlvbnMsbmV3U2VsZWN0aW9ucy5sZW5ndGgtMSk7dGhpcy5fZnVsbFdvcmRTZWxlY3Rpb249dHJ1ZTt9Cl9maW5kTmV4dE9jY3VycmVuY2UocmFuZ2UsZnVsbFdvcmQpe3JhbmdlPXJhbmdlLm5vcm1hbGl6ZSgpO2xldCBtYXRjaGVkTGluZU51bWJlcjtsZXQgbWF0Y2hlZENvbHVtbk51bWJlcjtjb25zdCB0ZXh0VG9GaW5kPXRoaXMuX3RleHRFZGl0b3IudGV4dChyYW5nZSk7ZnVuY3Rpb24gZmluZFdvcmRJbkxpbmUod29yZFJlZ2V4LGxpbmVOdW1iZXIsbGluZVRleHQsZnJvbSx0byl7aWYodHlwZW9mIG1hdGNoZWRMaW5lTnVtYmVyPT09J251bWJlcicpCnJldHVybiB0cnVlO3dvcmRSZWdleC5sYXN0SW5kZXg9ZnJvbTtjb25zdCByZXN1bHQ9d29yZFJlZ2V4LmV4ZWMobGluZVRleHQpO2lmKCFyZXN1bHR8fHJlc3VsdC5pbmRleCt0ZXh0VG9GaW5kLmxlbmd0aD50bykKcmV0dXJuIGZhbHNlO21hdGNoZWRMaW5lTnVtYmVyPWxpbmVOdW1iZXI7bWF0Y2hlZENvbHVtbk51bWJlcj1yZXN1bHQuaW5kZXg7cmV0dXJuIHRydWU7fQpsZXQgaXRlcmF0ZWRMaW5lTnVtYmVyO2Z1bmN0aW9uIGxpbmVJdGVyYXRvcihyZWdleCxsaW5lSGFuZGxlKXtpZihmaW5kV29yZEluTGluZShyZWdleCxpdGVyYXRlZExpbmVOdW1iZXIrKyxsaW5lSGFuZGxlLnRleHQsMCxsaW5lSGFuZGxlLnRleHQubGVuZ3RoKSkKcmV0dXJuIHRydWU7fQpsZXQgcmVnZXhTb3VyY2U9dGV4dFRvRmluZC5lc2NhcGVGb3JSZWdFeHAoKTtpZihmdWxsV29yZCkKcmVnZXhTb3VyY2U9J1xcYicrcmVnZXhTb3VyY2UrJ1xcYic7Y29uc3Qgd29yZFJlZ2V4PW5ldyBSZWdFeHAocmVnZXhTb3VyY2UsJ2cnKTtjb25zdCBjdXJyZW50TGluZVRleHQ9dGhpcy5fY29kZU1pcnJvci5nZXRMaW5lKHJhbmdlLnN0YXJ0TGluZSk7ZmluZFdvcmRJbkxpbmUod29yZFJlZ2V4LHJhbmdlLnN0YXJ0TGluZSxjdXJyZW50TGluZVRleHQscmFuZ2UuZW5kQ29sdW1uLGN1cnJlbnRMaW5lVGV4dC5sZW5ndGgpO2l0ZXJhdGVkTGluZU51bWJlcj1yYW5nZS5zdGFydExpbmUrMTt0aGlzLl9jb2RlTWlycm9yLmVhY2hMaW5lKHJhbmdlLnN0YXJ0TGluZSsxLHRoaXMuX2NvZGVNaXJyb3IubGluZUNvdW50KCksbGluZUl0ZXJhdG9yLmJpbmQobnVsbCx3b3JkUmVnZXgpKTtpdGVyYXRlZExpbmVOdW1iZXI9MDt0aGlzLl9jb2RlTWlycm9yLmVhY2hMaW5lKDAscmFuZ2Uuc3RhcnRMaW5lLGxpbmVJdGVyYXRvci5iaW5kKG51bGwsd29yZFJlZ2V4KSk7ZmluZFdvcmRJbkxpbmUod29yZFJlZ2V4LHJhbmdlLnN0YXJ0TGluZSxjdXJyZW50TGluZVRleHQsMCxyYW5nZS5zdGFydENvbHVtbik7aWYodHlwZW9mIG1hdGNoZWRMaW5lTnVtYmVyIT09J251bWJlcicpCnJldHVybiBudWxsO3JldHVybiBuZXcgVGV4dFV0aWxzLlRleHRSYW5nZShtYXRjaGVkTGluZU51bWJlcixtYXRjaGVkQ29sdW1uTnVtYmVyLG1hdGNoZWRMaW5lTnVtYmVyLG1hdGNoZWRDb2x1bW5OdW1iZXIrdGV4dFRvRmluZC5sZW5ndGgpO319O1RleHRFZGl0b3IuVGV4dEVkaXRvclBvc2l0aW9uSGFuZGxlPWZ1bmN0aW9uKCl7fTtUZXh0RWRpdG9yLlRleHRFZGl0b3JQb3NpdGlvbkhhbmRsZS5wcm90b3R5cGU9e3Jlc29sdmUoKXt9LGVxdWFsKHBvc2l0aW9uSGFuZGxlKXt9fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLl9vdmVycmlkZU1vZGVXaXRoUHJlZml4ZWRUb2tlbnMoJ2NzcycsJ2Nzcy0nKTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLl9vdmVycmlkZU1vZGVXaXRoUHJlZml4ZWRUb2tlbnMoJ2phdmFzY3JpcHQnLCdqcy0nKTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLl9vdmVycmlkZU1vZGVXaXRoUHJlZml4ZWRUb2tlbnMoJ3htbCcsJ3htbC0nKTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLl9sb2FkZWRNaW1lTW9kZUV4dGVuc2lvbnM9bmV3IFNldCgpO1RleHRFZGl0b3IuQ29kZU1pcnJvck1pbWVNb2RlPWZ1bmN0aW9uKCl7fTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JNaW1lTW9kZS5wcm90b3R5cGU9e2luc3RhbGwoZXh0ZW5zaW9uKXt9fTtUZXh0RWRpdG9yLlRleHRFZGl0b3JCb29rTWFyaz1jbGFzc3tjb25zdHJ1Y3RvcihtYXJrZXIsdHlwZSxlZGl0b3Ipe21hcmtlcltUZXh0RWRpdG9yLlRleHRFZGl0b3JCb29rTWFyay5fc3ltYm9sXT10aGlzO3RoaXMuX21hcmtlcj1tYXJrZXI7dGhpcy5fdHlwZT10eXBlO3RoaXMuX2VkaXRvcj1lZGl0b3I7fQpjbGVhcigpe2NvbnN0IHBvc2l0aW9uPXRoaXMuX21hcmtlci5maW5kKCk7dGhpcy5fbWFya2VyLmNsZWFyKCk7aWYocG9zaXRpb24pCnRoaXMuX2VkaXRvci5fdXBkYXRlRGVjb3JhdGlvbnMocG9zaXRpb24ubGluZSk7fQpyZWZyZXNoKCl7dGhpcy5fbWFya2VyLmNoYW5nZWQoKTtjb25zdCBwb3NpdGlvbj10aGlzLl9tYXJrZXIuZmluZCgpO2lmKHBvc2l0aW9uKQp0aGlzLl9lZGl0b3IuX3VwZGF0ZURlY29yYXRpb25zKHBvc2l0aW9uLmxpbmUpO30KdHlwZSgpe3JldHVybiB0aGlzLl90eXBlO30KcG9zaXRpb24oKXtjb25zdCBwb3M9dGhpcy5fbWFya2VyLmZpbmQoKTtyZXR1cm4gcG9zP1RleHRVdGlscy5UZXh0UmFuZ2UuY3JlYXRlRnJvbUxvY2F0aW9uKHBvcy5saW5lLHBvcy5jaCk6bnVsbDt9fTtUZXh0RWRpdG9yLlRleHRFZGl0b3JCb29rTWFyay5fc3ltYm9sPVN5bWJvbCgnVGV4dEVkaXRvci5UZXh0RWRpdG9yQm9va01hcmsnKTtUZXh0RWRpdG9yLkNvZGVNaXJyb3JUZXh0RWRpdG9yLkRlY29yYXRpb247VGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvckZhY3Rvcnk9Y2xhc3N7Y3JlYXRlRWRpdG9yKG9wdGlvbnMpe3JldHVybiBuZXcgVGV4dEVkaXRvci5Db2RlTWlycm9yVGV4dEVkaXRvcihvcHRpb25zKTt9fTtDb2RlTWlycm9yLmlucHV0U3R5bGVzLmRldlRvb2xzQWNjZXNzaWJsZVRleHRBcmVhPWNsYXNzIGV4dGVuZHMgQ29kZU1pcnJvci5pbnB1dFN0eWxlcy50ZXh0YXJlYXtpbml0KGRpc3BsYXkpe3N1cGVyLmluaXQoZGlzcGxheSk7VUkuQVJJQVV0aWxzLnNldEFjY2Vzc2libGVOYW1lKHRoaXMudGV4dGFyZWEsbHNgQ29kZSBlZGl0b3JgKTt0aGlzLnRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBvc2l0aW9uc3RhcnQnLHRoaXMuX29uQ29tcG9zaXRpb25TdGFydC5iaW5kKHRoaXMpKTt9Cl9vbkNvbXBvc2l0aW9uU3RhcnQoKXtpZih0aGlzLnRleHRhcmVhLnNlbGVjdGlvbkVuZD09PXRoaXMudGV4dGFyZWEudmFsdWUubGVuZ3RoKQpyZXR1cm47dGhpcy50ZXh0YXJlYS52YWx1ZT10aGlzLnRleHRhcmVhLnZhbHVlLnN1YnN0cmluZygwLHRoaXMudGV4dGFyZWEuc2VsZWN0aW9uRW5kKTt0aGlzLnRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKHRoaXMudGV4dGFyZWEudmFsdWUubGVuZ3RoLHRoaXMudGV4dGFyZWEudmFsdWUubGVuZ3RoKTt0aGlzLnByZXZJbnB1dD10aGlzLnRleHRhcmVhLnZhbHVlO30KcmVzZXQodHlwaW5nKXtpZih0eXBpbmd8fHRoaXMuY29udGV4dE1lbnVQZW5kaW5nfHx0aGlzLmNvbXBvc2luZ3x8dGhpcy5jbS5zb21ldGhpbmdTZWxlY3RlZCgpKXtzdXBlci5yZXNldCh0eXBpbmcpO3JldHVybjt9CmNvbnN0IGN1cnNvcj10aGlzLmNtLmdldEN1cnNvcigpO2xldCBzdGFydCxlbmQ7aWYodGhpcy5jbS5vcHRpb25zLmxpbmVXcmFwcGluZyl7Y29uc3QgdG9wPXRoaXMuY20uY2hhckNvb3JkcyhjdXJzb3IsJ3BhZ2UnKS50b3A7c3RhcnQ9dGhpcy5jbS5jb29yZHNDaGFyKHtsZWZ0Oi1JbmZpbml0eSx0b3B9KTtlbmQ9dGhpcy5jbS5jb29yZHNDaGFyKHtsZWZ0OkluZmluaXR5LHRvcH0pO31lbHNle2NvbnN0IG9mZnNldD1NYXRoLmZsb29yKGN1cnNvci5jaC8xMDAwKSoxMDAwO3N0YXJ0PXtjaDpvZmZzZXQsbGluZTpjdXJzb3IubGluZX07ZW5kPXtjaDpvZmZzZXQrMTAwMCxsaW5lOmN1cnNvci5saW5lfTt9CnRoaXMudGV4dGFyZWEudmFsdWU9dGhpcy5jbS5nZXRSYW5nZShzdGFydCxlbmQpO2NvbnN0IGNhcmV0UG9zaXRpb249Y3Vyc29yLmNoLXN0YXJ0LmNoO3RoaXMudGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXRQb3NpdGlvbixjYXJldFBvc2l0aW9uKTt0aGlzLnByZXZJbnB1dD10aGlzLnRleHRhcmVhLnZhbHVlO30KcG9sbCgpe2lmKHRoaXMuY29udGV4dE1lbnVQZW5kaW5nfHx0aGlzLmNvbXBvc2luZykKcmV0dXJuIHN1cGVyLnBvbGwoKTtjb25zdCB0ZXh0PXRoaXMudGV4dGFyZWEudmFsdWU7bGV0IHN0YXJ0PTA7Y29uc3QgbGVuZ3RoPU1hdGgubWluKHRoaXMucHJldklucHV0Lmxlbmd0aCx0ZXh0Lmxlbmd0aCk7d2hpbGUoc3RhcnQ8bGVuZ3RoJiZ0aGlzLnByZXZJbnB1dFtzdGFydF09PT10ZXh0W3N0YXJ0XSkKKytzdGFydDtsZXQgZW5kPTA7d2hpbGUoZW5kPGxlbmd0aC1zdGFydCYmdGhpcy5wcmV2SW5wdXRbdGhpcy5wcmV2SW5wdXQubGVuZ3RoLWVuZC0xXT09PXRleHRbdGV4dC5sZW5ndGgtZW5kLTFdKQorK2VuZDtjb25zdCBwbGFjZWhvbGRlcj10aGlzLnRleHRhcmVhO3RoaXMudGV4dGFyZWE9KGNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJykpO3RoaXMudGV4dGFyZWEudmFsdWU9dGV4dC5zdWJzdHJpbmcoc3RhcnQsdGV4dC5sZW5ndGgtZW5kKTt0aGlzLnRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKHBsYWNlaG9sZGVyLnNlbGVjdGlvblN0YXJ0LXN0YXJ0LHBsYWNlaG9sZGVyLnNlbGVjdGlvbkVuZC1zdGFydCk7dGhpcy5wcmV2SW5wdXQ9Jyc7Y29uc3QgcmVzdWx0PXN1cGVyLnBvbGwoKTt0aGlzLnByZXZJbnB1dD10ZXh0O3RoaXMudGV4dGFyZWE9cGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdDt9fTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRleHRfZWRpdG9yL2F1dG9jb21wbGV0ZVRvb2x0aXAuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG4uYXV0b2NvbXBsZXRlLXRvb2x0aXAge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IC0zcHg7XG59XG5cbi5hdXRvY29tcGxldGUtdG9vbHRpcCA+IGRpdiA+ICoge1xuICBwYWRkaW5nOiAwcHggNHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xuICB3aWR0aDogZml0LWNvbnRlbnQ7XG59XG4vKiMgc291cmNlVVJMPXRleHRfZWRpdG9yL2F1dG9jb21wbGV0ZVRvb2x0aXAuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1sidGV4dF9lZGl0b3IvY21kZXZ0b29scy5jc3MiXT0iLkNvZGVNaXJyb3Ige1xuICAgIGxpbmUtaGVpZ2h0OiAxLjJlbSAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMyMjI7XG4gICAgaGVpZ2h0OiAzMDBweDtcbn1cblxuLkNvZGVNaXJyb3ItbGluZXdpZGdldCB7XG4gICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDtcbn1cblxuLkNvZGVNaXJyb3ItZ3V0dGVyLXBlcmZvcm1hbmNlIHtcbiAgICB3aWR0aDogNzRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xufVxuXG4uQ29kZU1pcnJvci1ndXR0ZXItY292ZXJhZ2Uge1xuICAgIHdpZHRoOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgbWFyZ2luLWxlZnQ6IDNweDtcbn1cblxuLkNvZGVNaXJyb3IgLnNvdXJjZS1mcmFtZS1ldmFsLWV4cHJlc3Npb24ge1xuICAgIG91dGxpbmU6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MywgNDEsIDM0KTtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxOTQpO1xufVxuXG4uQ29kZU1pcnJvciAuc291cmNlLWZyYW1lLWV2YWwtZXhwcmVzc2lvbi1zdGFydCB7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDtcbiAgICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLkNvZGVNaXJyb3IgLnNvdXJjZS1mcmFtZS1ldmFsLWV4cHJlc3Npb24tZW5kIHtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5Db2RlTWlycm9yIC5zb3VyY2UtZnJhbWUtY29udGludWUtdG8tbG9jYXRpb24ge1xuICAgIG91dGxpbmU6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzAsIDIzNiwgMjU1KTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5Db2RlTWlycm9yIC5zb3VyY2UtZnJhbWUtY29udGludWUtdG8tbG9jYXRpb246aG92ZXIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjEsIDE0MSwgMjU0KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcxLCAxOTEsIDI1NCk7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLkNvZGVNaXJyb3IgLnNvdXJjZS1mcmFtZS1jb250aW51ZS10by1sb2NhdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzE0NTIyYjtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuQ29kZU1pcnJvciAuc291cmNlLWZyYW1lLWNvbnRpbnVlLXRvLWxvY2F0aW9uOmhvdmVyIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMzNjYzZiO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxNDUyMmI7XG59XG5cbi5Db2RlTWlycm9yIC5zb3VyY2UtZnJhbWUtY29udGludWUtdG8tbG9jYXRpb24tc3RhcnQge1xuICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5Db2RlTWlycm9yIC5zb3VyY2UtZnJhbWUtY29udGludWUtdG8tbG9jYXRpb24tZW5kIHtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDFweDtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG59XG5cbi5Db2RlTWlycm9yIC5zb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbiB7XG4gICAgb3V0bGluZTogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDEwMCwgNDYlLCA4MCUsIDEpO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7XG59XG5cbi5zb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbi1ob3ZlcmVkIC5zb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDk2LCA1MyUsIDY1JSk7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMTAwLCAxNTQsIDEwMCk7XG59XG5cbi5zb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbi1ob3ZlcmVkIC5zb3VyY2UtZnJhbWUtYXN5bmMtc3RlcC1pbi1zdGFydCB7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDtcbiAgICBtYXJnaW4tbGVmdDogLTFweDtcbn1cblxuLnNvdXJjZS1mcmFtZS1hc3luYy1zdGVwLWluLWhvdmVyZWQgLnNvdXJjZS1mcmFtZS1hc3luYy1zdGVwLWluLWVuZCB7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xufVxuXG4uQ29kZU1pcnJvci1yZWFkb25seSAuQ29kZU1pcnJvci1jdXJzb3Ige1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5Db2RlTWlycm9yLWd1dHRlcnMge1xuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IpO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi5Db2RlTWlycm9yLWxpbmVudW1iZXIge1xuICAgIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7XG4gICAgcGFkZGluZzogMCAzcHggMCA1cHg7XG4gICAgbWluLXdpZHRoOiAyMnB4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5wcmV0dHktcHJpbnRlZCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICBjb2xvcjogdmFyKCAtLWFjY2VudC1jb2xvci1iKTtcbn1cblxuLmNtLWhpZ2hsaWdodCB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGZhZGVvdXQgMnMgMHM7XG59XG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jbS1oaWdobGlnaHQge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBmYWRlb3V0LWRhcmsgMnMgMHM7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZW91dCB7XG4gICAgZnJvbSB7YmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxMjApOyB9XG4gICAgdG8geyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVvdXQtZGFyayB7XG4gICAgZnJvbSB7YmFja2dyb3VuZC1jb2xvcjogaHNsYSgxMzMsIDEwMCUsIDMwJSwgMC41KTsgfVxuICAgIHRvIHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbn1cblxuLmNtLXJlYWRvbmx5LWhpZ2hsaWdodCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxMjApO1xufVxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuY20tcmVhZG9ubHktaGlnaGxpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDEzMywgMTAwJSwgMzAlLCAwLjUpO1xufVxuXG4uY20taGlnaGxpZ2h0LmNtLWV4ZWN1dGlvbi1saW5lIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogZmFkZW91dC1leGVjdXRpb24tbGluZSAxcyAwcztcbn1cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmNtLWhpZ2hsaWdodC5jbS1leGVjdXRpb24tbGluZSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGZhZGVvdXQtZXhlY3V0aW9uLWxpbmUtZGFyayAxcyAwcztcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVvdXQtZXhlY3V0aW9uLWxpbmUge1xuICAgIGZyb20ge2JhY2tncm91bmQtY29sb3I6IHJnYigxMjEsIDE0MSwgMjU0KTsgfVxuICAgIHRvIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE3MSwgMTkxLCAyNTQpOyB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZW91dC1leGVjdXRpb24tbGluZS1kYXJrIHtcbiAgICBmcm9tIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMjA4MDQzOyB9XG4gICAgdG8geyBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ1MjJiOyB9XG59XG5cbi5jbS1icmVha3BvaW50IC5Db2RlTWlycm9yLWd1dHRlci13cmFwcGVyIC5Db2RlTWlycm9yLWxpbmVudW1iZXIsIC10aGVtZS1wcmVzZXJ2ZSB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci13aWR0aDogMXB4IDRweCAxcHggMXB4ICFpbXBvcnRhbnQ7XG4gICAgLXdlYmtpdC1ib3JkZXItaW1hZ2U6IHVybChJbWFnZXMvYnJlYWtwb2ludC5wbmcpIDEgNCAxIDE7XG4gICAgbWFyZ2luOiAwIDAgMCAzcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxcHg7XG4gICAgaGVpZ2h0OiAxMXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbn1cblxuLmNtLWxpbmUtd2l0aG91dC1zb3VyY2UtbWFwcGluZyAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICBjb2xvcjogcmdiYSgxMjgsIDEyOCwgMTI4LCAwLjQpO1xufVxuXG4uY20tYnJlYWtwb2ludC5jbS1icmVha3BvaW50LWNvbmRpdGlvbmFsIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge1xuICAgIC13ZWJraXQtYm9yZGVyLWltYWdlOiB1cmwoSW1hZ2VzL2JyZWFrcG9pbnRDb25kaXRpb25hbC5wbmcpIDEgNCAxIDE7XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbi5jbS1icmVha3BvaW50IC5Db2RlTWlycm9yLWd1dHRlci13cmFwcGVyIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge1xuICAgIC13ZWJraXQtYm9yZGVyLWltYWdlOiB1cmwoSW1hZ2VzL2JyZWFrcG9pbnRfMngucG5nKSAyIDggMiAyO1xufVxuLmNtLWJyZWFrcG9pbnQuY20tYnJlYWtwb2ludC1jb25kaXRpb25hbCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICAtd2Via2l0LWJvcmRlci1pbWFnZTogdXJsKEltYWdlcy9icmVha3BvaW50Q29uZGl0aW9uYWxfMngucG5nKSAyIDggMiAyO1xufVxufSAvKiBtZWRpYSAqL1xuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jbS1icmVha3BvaW50Om5vdCguY20tYnJlYWtwb2ludC1jb25kaXRpb25hbCkgLkNvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXIgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7XG4gICAgZmlsdGVyOiBodWUtcm90YXRlKC0xMzlkZWcpO1xufVxuXG4uY20tYnJlYWtwb2ludC1kaXNhYmxlZCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi5icmVha3BvaW50cy1kZWFjdGl2YXRlZCAuY20tYnJlYWtwb2ludCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICBvcGFjaXR5OiAwLjU7XG59XG5cbi5icmVha3BvaW50cy1kZWFjdGl2YXRlZCAuY20tYnJlYWtwb2ludC1kaXNhYmxlZCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgICBvcGFjaXR5OiAwLjM7XG59XG5cbi5jbS1pbmxpbmUtYnJlYWtwb2ludCB7XG4gICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgdG9wOiAycHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY20tZXhlY3V0aW9uLWxpbmUtdGFpbCArIC5Db2RlTWlycm9yLXdpZGdldCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2FiYmZmZTtcbn1cblxuLnNvdXJjZS1mcmFtZS1ldmFsLWV4cHJlc3Npb24gKyAuQ29kZU1pcnJvci13aWRnZXQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjMsIDQxLCAzNCk7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMTk0KTtcbn1cblxuLmNtLWlubGluZS1icmVha3BvaW50LmNtLWV4ZWN1dGlvbi1saW5lLXRhaWwge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM2OThjZmU7XG59XG5cbi5jbS1leGVjdXRpb24tbGluZS10YWlsIC5jbS1pbmxpbmUtYnJlYWtwb2ludCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVcbn1cblxuLmNtLWlubGluZS1icmVha3BvaW50LmNtLWlubGluZS1jb25kaXRpb25hbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmOWQwZDtcbn1cblxuLmNtLWlubGluZS1icmVha3BvaW50LmNtLWlubGluZS1kaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4uY20tY29udGludWUtdG8tbG9jYXRpb24ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwLjg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMnB4O1xufVxuXG4uY20tY29udGludWUtdG8tbG9jYXRpb246aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG5cbmRpdi5Db2RlTWlycm9yIHNwYW4uQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNyk7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuZGl2LkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsIDAuMDcpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMCwgMCwgMC41KTtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCBkaXYuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIxNywyMTcsMjE3KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOmluaXRpYWw7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgZGl2LkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyNTUsIDI2LCAyNik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjppbml0aWFsO1xufVxuXG4uY20td2hpdGVzcGFjZTo6YmVmb3JlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgY29sb3I6IHJnYigxNzUsIDE3NSwgMTc1KTtcbn1cblxuLmNtLXRhYiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jbS10YWI6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIGNvbnRlbnQ6IFwiLlwiO1xuICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE3NSwgMTc1LCAxNzUpO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogOTAlO1xuICAgIGJvdHRvbTogNTAlO1xuICAgIGxlZnQ6IDUlO1xufVxuXG4uc2hvdy13aGl0ZXNwYWNlcyAuQ29kZU1pcnJvciAuY20tdGFiOmJlZm9yZSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbn1cblxuLmNtLWV4ZWN1dGlvbi1saW5lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDU5LCAyNTUsIDAuMTApO1xufVxuXG4uY20tZXhlY3V0aW9uLWxpbmUtb3V0bGluZSB7XG4gICAgb3V0bGluZTogMXB4IHNvbGlkIHJnYig2NCwgMTE1LCAyNDQpO1xufVxuXG4uY20tZXhlY3V0aW9uLWxpbmUtdGFpbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE3MSwgMTkxLCAyNTQpO1xufVxuXG4uY20tZXhlY3V0aW9uLWxpbmUgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7XG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiKDY0LCAxMTUsIDI0NCk7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmNtLWV4ZWN1dGlvbi1saW5lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ1MjJiO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jbS1leGVjdXRpb24tbGluZS1vdXRsaW5lIHtcbiAgICBvdXRsaW5lOiAxcHggc29saWQgIzMzY2M2Yjtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuY20tZXhlY3V0aW9uLWxpbmUtdGFpbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NzEzMjtcbn1cblxuLmNtLXRva2VuLWhpZ2hsaWdodCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uY20tdG9rZW4taGlnaGxpZ2h0OmJlZm9yZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIHRvcDogMDtcbiAgICBib3R0b206IC0xcHg7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBjb250ZW50OiBcIlwiO1xufVxuXG4uY20tbGluZS13aXRoLXNlbGVjdGlvbiAuY20tY29sdW1uLXdpdGgtc2VsZWN0aW9uOmJlZm9yZSB7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uY20tc2VhcmNoLWhpZ2hsaWdodCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uY20tc2VhcmNoLWhpZ2hsaWdodDpiZWZvcmUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiBncmF5O1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IGdyYXk7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbiAgICB0b3A6IC0xcHg7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgY29udGVudDogXCJcIjtcbn1cblxuLmNtLXNlYXJjaC1oaWdobGlnaHQtZnVsbDpiZWZvcmUge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uY20tc2VhcmNoLWhpZ2hsaWdodC1zdGFydDpiZWZvcmUge1xuICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4O1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDtcbiAgICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6IGdyYXk7XG59XG5cbi5jbS1zZWFyY2gtaGlnaGxpZ2h0LWVuZDpiZWZvcmUge1xuICAgIGJvcmRlci1yaWdodC13aWR0aDogMXB4O1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7XG4gICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDtcbiAgICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1yaWdodC1jb2xvcjogZ3JheTtcbn1cblxuLmNtLWxpbmUtd2l0aC1zZWxlY3Rpb24gLmNtLWNvbHVtbi13aXRoLXNlbGVjdGlvbi5jbS1zZWFyY2gtaGlnaGxpZ2h0LWZ1bGw6YmVmb3JlIHtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG59XG5cbi5jbS1saW5lLXdpdGgtc2VsZWN0aW9uIC5jbS1jb2x1bW4td2l0aC1zZWxlY3Rpb24uY20tc2VhcmNoLWhpZ2hsaWdodC1zdGFydDpiZWZvcmUge1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDFweDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxcHg7XG59XG5cbi5jbS1saW5lLXdpdGgtc2VsZWN0aW9uIC5jbS1jb2x1bW4td2l0aC1zZWxlY3Rpb24uY20tc2VhcmNoLWhpZ2hsaWdodC1lbmQ6YmVmb3JlIHtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMXB4O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxcHg7XG59XG5cbi5jbS1saW5lLXdpdGgtc2VsZWN0aW9uIC5jbS1jb2x1bW4td2l0aC1zZWxlY3Rpb24uY20tc2VhcmNoLWhpZ2hsaWdodDpiZWZvcmUge1xuICAgIG1hcmdpbjogLTFweCAtMXB4IC0xcHggLTFweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQxLCAyMzQsIDApO1xuICAgIHotaW5kZXg6IC0xO1xufVxuXG4uLXRoZW1lLXdpdGgtZGFyay1iYWNrZ3JvdW5kIC5jbS1saW5lLXdpdGgtc2VsZWN0aW9uIC5jbS1jb2x1bW4td2l0aC1zZWxlY3Rpb24uY20tc2VhcmNoLWhpZ2hsaWdodDpiZWZvcmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgxMzMsIDEwMCUsIDMwJSk7XG59XG5cbi4tdGhlbWUtd2l0aC1kYXJrLWJhY2tncm91bmQgLmNtLWxpbmUtd2l0aC1zZWxlY3Rpb24gLmNtLXNlYXJjaC1oaWdobGlnaHQge1xuICAgIGNvbG9yOiAjZWVlO1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItbGluZS1tYXJrZXItcGVyZm9ybWFuY2Uge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmctcmlnaHQ6IDNweDtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLWNvdmVyYWdlLXVudXNlZC1tYXJrZXIge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmctcmlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTU3MzczO1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItY292ZXJhZ2UtdW51c2VkLW1hcmtlcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIFwiO1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItY292ZXJhZ2UtdXNlZC1tYXJrZXIge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIHBhZGRpbmctcmlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODFDNzg0O1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItY292ZXJhZ2UtdXNlZC1tYXJrZXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiBcIjtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLWxpbmUtZGVjb3JhdGlvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItbGluZS1kZWNvcmF0aW9uLXdhdmUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IC0ycHg7XG4gICAgcmlnaHQ6IC00cHg7XG4gICAgbGVmdDogNHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBoZWlnaHQ6IDRweDtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLXZhbHVlLWRlY29yYXRpb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG1heC13aWR0aDogMTAwMHB4O1xuICAgIG9wYWNpdHk6IDAuODtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZFM0M3O1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIHBhZGRpbmctbGVmdDogNXB4O1xuICAgIGNvbG9yOiAjMjIyO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7XG59XG5cbi5Db2RlTWlycm9yIC5jbS1leGVjdXRpb24tbGluZSAudGV4dC1lZGl0b3ItdmFsdWUtZGVjb3JhdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgb3BhY2l0eTogMC41O1xufVxuXG4uQ29kZU1pcnJvciAudGV4dC1lZGl0b3ItbGluZS1kZWNvcmF0aW9uLWljb24ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcmlnaHQ6IC0xNnB4O1xuICAgIHRvcDogLTlweDtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLWxpbmUtd2l0aC13YXJuaW5nOm5vdCguY20tZXhlY3V0aW9uLWxpbmUpOm5vdCguY20tcmVhZG9ubHktaGlnaGxpZ2h0KSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIzMCwgMCwgMC4xKTtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLWxpbmUtd2l0aC1lcnJvcjpub3QoLmNtLWV4ZWN1dGlvbi1saW5lKTpub3QoLmNtLXJlYWRvbmx5LWhpZ2hsaWdodCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjA1KTtcbn1cblxuLkNvZGVNaXJyb3IgLnRleHQtZWRpdG9yLWxpbmUtZGVjb3JhdGlvbi13YXZlIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoSW1hZ2VzL2Vycm9yV2F2ZS5wbmcpO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbi5Db2RlTWlycm9yIC50ZXh0LWVkaXRvci1saW5lLWRlY29yYXRpb24td2F2ZSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy9lcnJvcldhdmVfMngucG5nKTtcbn1cbn0gLyogbWVkaWEgKi9cblxuLyoqIEBzZWUgY3JidWcuY29tLzM1ODE2MSAqL1xuLkNvZGVNaXJyb3IgLkNvZGVNaXJyb3ItdnNjcm9sbGJhciwgLkNvZGVNaXJyb3IgLkNvZGVNaXJyb3ItaHNjcm9sbGJhciB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xufVxuXG4uY20tdHJhaWxpbmctd2hpdGVzcGFjZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsIDAuMDUpO1xufVxuXG4uQ29kZU1pcnJvci1hY3RpdmVsaW5lIC5jbS10cmFpbGluZy13aGl0ZXNwYWNlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLi10aGVtZS13aXRoLWRhcmstYmFja2dyb3VuZCAuQ29kZU1pcnJvciAuQ29kZU1pcnJvci1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQ1NDU0NTtcbn1cblxuLkNvZGVNaXJyb3IgLmF1dG8tY29tcGxldGUtdGV4dCB7XG4gICAgY29sb3I6IHJnYigxMjgsMTI4LDEyOCk7XG59XG5cbi5Db2RlTWlycm9yIC5wbGFjZWhvbGRlci10ZXh0IHtcbiAgICBoZWlnaHQ6IDA7XG4gICAgY29sb3I6IHJnYigxMjgsMTI4LDEyOCk7XG59XG5cbi8qKiBQcmV2ZW50IHRoZSBjb2RlbWlycm9yIHRleHRhcmVhIGZyb20gc3RlYWxpbmcgUGFnZVVwIGV2ZW50cyAqKi9cbi5Db2RlTWlycm9yIHRleHRhcmVhIHtcbiAgICByZXNpemU6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLkNvZGVNaXJyb3ItbGluZXMge1xuICAgIHBhZGRpbmc6IDRweCAwOyAvKiBWZXJ0aWNhbCBwYWRkaW5nIGFyb3VuZCBjb250ZW50ICovXG59XG5cbi5Db2RlTWlycm9yIHByZSB7XG4gICAgcGFkZGluZzogMCA0cHg7IC8qIEhvcml6b250YWwgcGFkZGluZyBvZiBjb250ZW50ICovXG59XG5cbi5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAvKiBUaGUgbGl0dGxlIHNxdWFyZSBiZXR3ZWVuIEggYW5kIFYgc2Nyb2xsYmFycyAqL1xufVxuXG4uQ29kZU1pcnJvci1jdXJzb3Ige1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7XG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xuICAgIHdpZHRoOiAwO1xufVxuXG4vKiBTaG93biB3aGVuIG1vdmluZyBpbiBiaS1kaXJlY3Rpb25hbCB0ZXh0ICovXG4uQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3Ige1xuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgc2lsdmVyO1xufVxuXG4uQ29kZU1pcnJvci1jb21wb3Npbmcge1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZDtcbn1cblxuLnByZXR0eS1wcmludGVkIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge1xuICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtY29sb3ItYik7XG59XG5cbi8qIyBzb3VyY2VVUkw9dGV4dF9lZGl0b3IvY21kZXZ0b29scy5jc3MgKi8iO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbEZpbHRlcj1jbGFzc3thY2NlcHQoZXZlbnQpe3JldHVybiB0cnVlO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVWaXNpYmxlRXZlbnRzRmlsdGVyPWNsYXNzIGV4dGVuZHMgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsRmlsdGVye2NvbnN0cnVjdG9yKHZpc2libGVUeXBlcyl7c3VwZXIoKTt0aGlzLl92aXNpYmxlVHlwZXM9bmV3IFNldCh2aXNpYmxlVHlwZXMpO30KYWNjZXB0KGV2ZW50KXtyZXR1cm4gdGhpcy5fdmlzaWJsZVR5cGVzLmhhcyhUaW1lbGluZU1vZGVsLlRpbWVsaW5lVmlzaWJsZUV2ZW50c0ZpbHRlci5fZXZlbnRUeXBlKGV2ZW50KSk7fQpzdGF0aWMgX2V2ZW50VHlwZShldmVudCl7aWYoZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkNvbnNvbGUpKQpyZXR1cm4gVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuQ29uc29sZVRpbWU7aWYoZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LlVzZXJUaW1pbmcpKQpyZXR1cm4gVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuVXNlclRpbWluZztpZihldmVudC5oYXNDYXRlZ29yeShUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQ2F0ZWdvcnkuTGF0ZW5jeUluZm8pKQpyZXR1cm4gVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuTGF0ZW5jeUluZm87cmV0dXJuKGV2ZW50Lm5hbWUpO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJbnZpc2libGVFdmVudHNGaWx0ZXI9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWxGaWx0ZXJ7Y29uc3RydWN0b3IoaW52aXNpYmxlVHlwZXMpe3N1cGVyKCk7dGhpcy5faW52aXNpYmxlVHlwZXM9bmV3IFNldChpbnZpc2libGVUeXBlcyk7fQphY2NlcHQoZXZlbnQpe3JldHVybiF0aGlzLl9pbnZpc2libGVUeXBlcy5oYXMoVGltZWxpbmVNb2RlbC5UaW1lbGluZVZpc2libGVFdmVudHNGaWx0ZXIuX2V2ZW50VHlwZShldmVudCkpO319O1RpbWVsaW5lTW9kZWwuRXhjbHVzaXZlTmFtZUZpbHRlcj1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbEZpbHRlcntjb25zdHJ1Y3RvcihleGNsdWRlTmFtZXMpe3N1cGVyKCk7dGhpcy5fZXhjbHVkZU5hbWVzPW5ldyBTZXQoZXhjbHVkZU5hbWVzKTt9CmFjY2VwdChldmVudCl7cmV0dXJuIXRoaXMuX2V4Y2x1ZGVOYW1lcy5oYXMoZXZlbnQubmFtZSk7fX07VGltZWxpbmVNb2RlbC5FeGNsdWRlVG9wTGV2ZWxGaWx0ZXI9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWxGaWx0ZXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO30KYWNjZXB0KGV2ZW50KXtyZXR1cm4hU0RLLlRyYWNpbmdNb2RlbC5pc1RvcExldmVsRXZlbnQoZXZlbnQpO319OztUaW1lbGluZU1vZGVsLlRyYWNpbmdMYXllclBheWxvYWQ7VGltZWxpbmVNb2RlbC5UcmFjaW5nTGF5ZXJUaWxlO1RpbWVsaW5lTW9kZWwuVHJhY2luZ0xheWVyVHJlZT1jbGFzcyBleHRlbmRzIFNESy5MYXllclRyZWVCYXNle2NvbnN0cnVjdG9yKHRhcmdldCl7c3VwZXIodGFyZ2V0KTt0aGlzLl90aWxlQnlJZD1uZXcgTWFwKCk7dGhpcy5fcGFpbnRQcm9maWxlck1vZGVsPXRhcmdldCYmdGFyZ2V0Lm1vZGVsKFNESy5QYWludFByb2ZpbGVyTW9kZWwpO30KYXN5bmMgc2V0TGF5ZXJzKHJvb3QsbGF5ZXJzLHBhaW50cyl7Y29uc3QgaWRzVG9SZXNvbHZlPW5ldyBTZXQoKTtpZihyb290KXt0aGlzLl9leHRyYWN0Tm9kZUlkc1RvUmVzb2x2ZShpZHNUb1Jlc29sdmUse30scm9vdCk7fWVsc2V7Zm9yKGxldCBpPTA7aTxsYXllcnMubGVuZ3RoOysraSkKdGhpcy5fZXh0cmFjdE5vZGVJZHNUb1Jlc29sdmUoaWRzVG9SZXNvbHZlLHt9LGxheWVyc1tpXSk7fQphd2FpdCB0aGlzLnJlc29sdmVCYWNrZW5kTm9kZUlkcyhpZHNUb1Jlc29sdmUpO2NvbnN0IG9sZExheWVyc0J5SWQ9dGhpcy5fbGF5ZXJzQnlJZDt0aGlzLl9sYXllcnNCeUlkPXt9O3RoaXMuc2V0Q29udGVudFJvb3QobnVsbCk7aWYocm9vdCl7Y29uc3QgY29udmVydGVkTGF5ZXJzPXRoaXMuX2lubmVyU2V0TGF5ZXJzKG9sZExheWVyc0J5SWQscm9vdCk7dGhpcy5zZXRSb290KGNvbnZlcnRlZExheWVycyk7fWVsc2V7Y29uc3QgcHJvY2Vzc2VkTGF5ZXJzPWxheWVycy5tYXAodGhpcy5faW5uZXJTZXRMYXllcnMuYmluZCh0aGlzLG9sZExheWVyc0J5SWQpKTtjb25zdCBjb250ZW50Um9vdD10aGlzLmNvbnRlbnRSb290KCk7dGhpcy5zZXRSb290KGNvbnRlbnRSb290KTtmb3IobGV0IGk9MDtpPHByb2Nlc3NlZExheWVycy5sZW5ndGg7KytpKXtpZihwcm9jZXNzZWRMYXllcnNbaV0uaWQoKSE9PWNvbnRlbnRSb290LmlkKCkpCmNvbnRlbnRSb290LmFkZENoaWxkKHByb2Nlc3NlZExheWVyc1tpXSk7fX0KdGhpcy5fc2V0UGFpbnRzKHBhaW50cyk7fQpzZXRUaWxlcyh0aWxlcyl7dGhpcy5fdGlsZUJ5SWQ9bmV3IE1hcCgpO2Zvcihjb25zdCB0aWxlIG9mIHRpbGVzKQp0aGlzLl90aWxlQnlJZC5zZXQodGlsZS5pZCx0aWxlKTt9CnBpY3R1cmVGb3JSYXN0ZXJUaWxlKHRpbGVJZCl7Y29uc3QgdGlsZT10aGlzLl90aWxlQnlJZC5nZXQoJ2NjOjpUaWxlLycrdGlsZUlkKTtpZighdGlsZSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoYFRpbGUgJHt0aWxlSWR9IGlzIG1pc3NpbmdgKTtyZXR1cm4oUHJvbWlzZS5yZXNvbHZlKG51bGwpKTt9CmNvbnN0IGxheWVyPXRoaXMubGF5ZXJCeUlkKHRpbGUubGF5ZXJfaWQpO2lmKCFsYXllcil7Q29tbW9uLmNvbnNvbGUuZXJyb3IoYExheWVyICR7dGlsZS5sYXllcl9pZH0gZm9yIHRpbGUgJHt0aWxlSWR9IGlzIG5vdCBmb3VuZGApO3JldHVybihQcm9taXNlLnJlc29sdmUobnVsbCkpO30KcmV0dXJuIGxheWVyLl9waWN0dXJlRm9yUmVjdCh0aWxlLmNvbnRlbnRfcmVjdCk7fQpfc2V0UGFpbnRzKHBhaW50cyl7Zm9yKGxldCBpPTA7aTxwYWludHMubGVuZ3RoOysraSl7Y29uc3QgbGF5ZXI9dGhpcy5fbGF5ZXJzQnlJZFtwYWludHNbaV0ubGF5ZXJJZCgpXTtpZihsYXllcikKbGF5ZXIuX2FkZFBhaW50RXZlbnQocGFpbnRzW2ldKTt9fQpfaW5uZXJTZXRMYXllcnMob2xkTGF5ZXJzQnlJZCxwYXlsb2FkKXtsZXQgbGF5ZXI9KG9sZExheWVyc0J5SWRbcGF5bG9hZC5sYXllcl9pZF0pO2lmKGxheWVyKQpsYXllci5fcmVzZXQocGF5bG9hZCk7ZWxzZQpsYXllcj1uZXcgVGltZWxpbmVNb2RlbC5UcmFjaW5nTGF5ZXIodGhpcy5fcGFpbnRQcm9maWxlck1vZGVsLHBheWxvYWQpO3RoaXMuX2xheWVyc0J5SWRbcGF5bG9hZC5sYXllcl9pZF09bGF5ZXI7aWYocGF5bG9hZC5vd25lcl9ub2RlKQpsYXllci5fc2V0Tm9kZSh0aGlzLmJhY2tlbmROb2RlSWRUb05vZGUoKS5nZXQocGF5bG9hZC5vd25lcl9ub2RlKXx8bnVsbCk7aWYoIXRoaXMuY29udGVudFJvb3QoKSYmbGF5ZXIuZHJhd3NDb250ZW50KCkpCnRoaXMuc2V0Q29udGVudFJvb3QobGF5ZXIpO2ZvcihsZXQgaT0wO3BheWxvYWQuY2hpbGRyZW4mJmk8cGF5bG9hZC5jaGlsZHJlbi5sZW5ndGg7KytpKQpsYXllci5hZGRDaGlsZCh0aGlzLl9pbm5lclNldExheWVycyhvbGRMYXllcnNCeUlkLHBheWxvYWQuY2hpbGRyZW5baV0pKTtyZXR1cm4gbGF5ZXI7fQpfZXh0cmFjdE5vZGVJZHNUb1Jlc29sdmUobm9kZUlkc1RvUmVzb2x2ZSxzZWVuTm9kZUlkcyxwYXlsb2FkKXtjb25zdCBiYWNrZW5kTm9kZUlkPXBheWxvYWQub3duZXJfbm9kZTtpZihiYWNrZW5kTm9kZUlkJiYhdGhpcy5iYWNrZW5kTm9kZUlkVG9Ob2RlKCkuaGFzKGJhY2tlbmROb2RlSWQpKQpub2RlSWRzVG9SZXNvbHZlLmFkZChiYWNrZW5kTm9kZUlkKTtmb3IobGV0IGk9MDtwYXlsb2FkLmNoaWxkcmVuJiZpPHBheWxvYWQuY2hpbGRyZW4ubGVuZ3RoOysraSkKdGhpcy5fZXh0cmFjdE5vZGVJZHNUb1Jlc29sdmUobm9kZUlkc1RvUmVzb2x2ZSxzZWVuTm9kZUlkcyxwYXlsb2FkLmNoaWxkcmVuW2ldKTt9fTtUaW1lbGluZU1vZGVsLlRyYWNpbmdMYXllcj1jbGFzc3tjb25zdHJ1Y3RvcihwYWludFByb2ZpbGVyTW9kZWwscGF5bG9hZCl7dGhpcy5fcGFpbnRQcm9maWxlck1vZGVsPXBhaW50UHJvZmlsZXJNb2RlbDt0aGlzLl9yZXNldChwYXlsb2FkKTt9Cl9yZXNldChwYXlsb2FkKXt0aGlzLl9ub2RlPW51bGw7dGhpcy5fbGF5ZXJJZD1TdHJpbmcocGF5bG9hZC5sYXllcl9pZCk7dGhpcy5fb2Zmc2V0WD1wYXlsb2FkLnBvc2l0aW9uWzBdO3RoaXMuX29mZnNldFk9cGF5bG9hZC5wb3NpdGlvblsxXTt0aGlzLl93aWR0aD1wYXlsb2FkLmJvdW5kcy53aWR0aDt0aGlzLl9oZWlnaHQ9cGF5bG9hZC5ib3VuZHMuaGVpZ2h0O3RoaXMuX2NoaWxkcmVuPVtdO3RoaXMuX3BhcmVudExheWVySWQ9bnVsbDt0aGlzLl9wYXJlbnQ9bnVsbDt0aGlzLl9xdWFkPXBheWxvYWQubGF5ZXJfcXVhZHx8W107dGhpcy5fY3JlYXRlU2Nyb2xsUmVjdHMocGF5bG9hZCk7dGhpcy5fY29tcG9zaXRpbmdSZWFzb25zPXBheWxvYWQuY29tcG9zaXRpbmdfcmVhc29uc3x8W107dGhpcy5fZHJhd3NDb250ZW50PSEhcGF5bG9hZC5kcmF3c19jb250ZW50O3RoaXMuX2dwdU1lbW9yeVVzYWdlPXBheWxvYWQuZ3B1X21lbW9yeV91c2FnZTt0aGlzLl9wYWludHM9W107fQppZCgpe3JldHVybiB0aGlzLl9sYXllcklkO30KcGFyZW50SWQoKXtyZXR1cm4gdGhpcy5fcGFyZW50TGF5ZXJJZDt9CnBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnQ7fQppc1Jvb3QoKXtyZXR1cm4hdGhpcy5wYXJlbnRJZCgpO30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW47fQphZGRDaGlsZChjaGlsZCl7aWYoY2hpbGQuX3BhcmVudCkKY29uc29sZS5hc3NlcnQoZmFsc2UsJ0NoaWxkIGFscmVhZHkgaGFzIGEgcGFyZW50Jyk7dGhpcy5fY2hpbGRyZW4ucHVzaChjaGlsZCk7Y2hpbGQuX3BhcmVudD10aGlzO2NoaWxkLl9wYXJlbnRMYXllcklkPXRoaXMuX2xheWVySWQ7fQpfc2V0Tm9kZShub2RlKXt0aGlzLl9ub2RlPW5vZGU7fQpub2RlKCl7cmV0dXJuIHRoaXMuX25vZGU7fQpub2RlRm9yU2VsZk9yQW5jZXN0b3IoKXtmb3IobGV0IGxheWVyPXRoaXM7bGF5ZXI7bGF5ZXI9bGF5ZXIuX3BhcmVudCl7aWYobGF5ZXIuX25vZGUpCnJldHVybiBsYXllci5fbm9kZTt9CnJldHVybiBudWxsO30Kb2Zmc2V0WCgpe3JldHVybiB0aGlzLl9vZmZzZXRYO30Kb2Zmc2V0WSgpe3JldHVybiB0aGlzLl9vZmZzZXRZO30Kd2lkdGgoKXtyZXR1cm4gdGhpcy5fd2lkdGg7fQpoZWlnaHQoKXtyZXR1cm4gdGhpcy5faGVpZ2h0O30KdHJhbnNmb3JtKCl7cmV0dXJuIG51bGw7fQpxdWFkKCl7cmV0dXJuIHRoaXMuX3F1YWQ7fQphbmNob3JQb2ludCgpe3JldHVyblswLjUsMC41LDBdO30KaW52aXNpYmxlKCl7cmV0dXJuIGZhbHNlO30KcGFpbnRDb3VudCgpe3JldHVybiAwO30KbGFzdFBhaW50UmVjdCgpe3JldHVybiBudWxsO30Kc2Nyb2xsUmVjdHMoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsUmVjdHM7fQpzdGlja3lQb3NpdGlvbkNvbnN0cmFpbnQoKXtyZXR1cm4gbnVsbDt9CmdwdU1lbW9yeVVzYWdlKCl7cmV0dXJuIHRoaXMuX2dwdU1lbW9yeVVzYWdlO30Kc25hcHNob3RzKCl7cmV0dXJuIHRoaXMuX3BhaW50cy5tYXAocGFpbnQ9PnBhaW50LnNuYXBzaG90UHJvbWlzZSgpLnRoZW4oc25hcHNob3Q9PntpZighc25hcHNob3QpCnJldHVybiBudWxsO2NvbnN0IHJlY3Q9e3g6c25hcHNob3QucmVjdFswXSx5OnNuYXBzaG90LnJlY3RbMV0sd2lkdGg6c25hcHNob3QucmVjdFsyXSxoZWlnaHQ6c25hcHNob3QucmVjdFszXX07cmV0dXJue3JlY3Q6cmVjdCxzbmFwc2hvdDpzbmFwc2hvdC5zbmFwc2hvdH07fSkpO30KX3BpY3R1cmVGb3JSZWN0KHRhcmdldFJlY3Qpe3JldHVybiBQcm9taXNlLmFsbCh0aGlzLl9wYWludHMubWFwKHBhaW50PT5wYWludC5waWN0dXJlUHJvbWlzZSgpKSkudGhlbihwaWN0dXJlcz0+e2NvbnN0IGZyYWdtZW50cz1waWN0dXJlcy5maWx0ZXIocGljdHVyZT0+cGljdHVyZSYmcmVjdHNPdmVybGFwKHBpY3R1cmUucmVjdCx0YXJnZXRSZWN0KSkubWFwKHBpY3R1cmU9Pih7eDpwaWN0dXJlLnJlY3RbMF0seTpwaWN0dXJlLnJlY3RbMV0scGljdHVyZTpwaWN0dXJlLnNlcmlhbGl6ZWRQaWN0dXJlfSkpO2lmKCFmcmFnbWVudHMubGVuZ3RofHwhdGhpcy5fcGFpbnRQcm9maWxlck1vZGVsKQpyZXR1cm4gbnVsbDtjb25zdCB4MD1mcmFnbWVudHMucmVkdWNlKChtaW4saXRlbSk9Pk1hdGgubWluKG1pbixpdGVtLngpLEluZmluaXR5KTtjb25zdCB5MD1mcmFnbWVudHMucmVkdWNlKChtaW4saXRlbSk9Pk1hdGgubWluKG1pbixpdGVtLnkpLEluZmluaXR5KTtjb25zdCByZWN0PXt4OnRhcmdldFJlY3RbMF0teDAseTp0YXJnZXRSZWN0WzFdLXkwLHdpZHRoOnRhcmdldFJlY3RbMl0saGVpZ2h0OnRhcmdldFJlY3RbM119O3JldHVybiB0aGlzLl9wYWludFByb2ZpbGVyTW9kZWwubG9hZFNuYXBzaG90RnJvbUZyYWdtZW50cyhmcmFnbWVudHMpLnRoZW4oc25hcHNob3Q9PnNuYXBzaG90P3tyZWN0OnJlY3Qsc25hcHNob3Q6c25hcHNob3R9Om51bGwpO30pO2Z1bmN0aW9uIHNlZ21lbnRzT3ZlcmxhcChhMSxhMixiMSxiMil7Y29uc29sZS5hc3NlcnQoYTE8PWEyJiZiMTw9YjIsJ3NlZ21lbnRzIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgb3JkZXJlZCBwYWlycycpO3JldHVybiBhMj5iMSYmYTE8YjI7fQpmdW5jdGlvbiByZWN0c092ZXJsYXAoYSxiKXtyZXR1cm4gc2VnbWVudHNPdmVybGFwKGFbMF0sYVswXSthWzJdLGJbMF0sYlswXStiWzJdKSYmc2VnbWVudHNPdmVybGFwKGFbMV0sYVsxXSthWzNdLGJbMV0sYlsxXStiWzNdKTt9fQpfc2Nyb2xsUmVjdHNGcm9tUGFyYW1zKHBhcmFtcyx0eXBlKXtyZXR1cm57cmVjdDp7eDpwYXJhbXNbMF0seTpwYXJhbXNbMV0sd2lkdGg6cGFyYW1zWzJdLGhlaWdodDpwYXJhbXNbM119LHR5cGU6dHlwZX07fQpfY3JlYXRlU2Nyb2xsUmVjdHMocGF5bG9hZCl7dGhpcy5fc2Nyb2xsUmVjdHM9W107aWYocGF5bG9hZC5ub25fZmFzdF9zY3JvbGxhYmxlX3JlZ2lvbil7dGhpcy5fc2Nyb2xsUmVjdHMucHVzaCh0aGlzLl9zY3JvbGxSZWN0c0Zyb21QYXJhbXMocGF5bG9hZC5ub25fZmFzdF9zY3JvbGxhYmxlX3JlZ2lvbixTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuTm9uRmFzdFNjcm9sbGFibGUubmFtZSkpO30KaWYocGF5bG9hZC50b3VjaF9ldmVudF9oYW5kbGVyX3JlZ2lvbil7dGhpcy5fc2Nyb2xsUmVjdHMucHVzaCh0aGlzLl9zY3JvbGxSZWN0c0Zyb21QYXJhbXMocGF5bG9hZC50b3VjaF9ldmVudF9oYW5kbGVyX3JlZ2lvbixTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuVG91Y2hFdmVudEhhbmRsZXIubmFtZSkpO30KaWYocGF5bG9hZC53aGVlbF9ldmVudF9oYW5kbGVyX3JlZ2lvbil7dGhpcy5fc2Nyb2xsUmVjdHMucHVzaCh0aGlzLl9zY3JvbGxSZWN0c0Zyb21QYXJhbXMocGF5bG9hZC53aGVlbF9ldmVudF9oYW5kbGVyX3JlZ2lvbixTREsuTGF5ZXIuU2Nyb2xsUmVjdFR5cGUuV2hlZWxFdmVudEhhbmRsZXIubmFtZSkpO30KaWYocGF5bG9hZC5zY3JvbGxfZXZlbnRfaGFuZGxlcl9yZWdpb24pe3RoaXMuX3Njcm9sbFJlY3RzLnB1c2godGhpcy5fc2Nyb2xsUmVjdHNGcm9tUGFyYW1zKHBheWxvYWQuc2Nyb2xsX2V2ZW50X2hhbmRsZXJfcmVnaW9uLFNESy5MYXllci5TY3JvbGxSZWN0VHlwZS5SZXBhaW50c09uU2Nyb2xsLm5hbWUpKTt9fQpfYWRkUGFpbnRFdmVudChwYWludCl7dGhpcy5fcGFpbnRzLnB1c2gocGFpbnQpO30KcmVxdWVzdENvbXBvc2l0aW5nUmVhc29ucygpe3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcG9zaXRpbmdSZWFzb25zKTt9CmRyYXdzQ29udGVudCgpe3JldHVybiB0aGlzLl9kcmF3c0NvbnRlbnQ7fX07O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3Jlc2V0KCk7fQpzdGF0aWMgZm9yRWFjaEV2ZW50KGV2ZW50cyxvblN0YXJ0RXZlbnQsb25FbmRFdmVudCxvbkluc3RhbnRFdmVudCxzdGFydFRpbWUsZW5kVGltZSxmaWx0ZXIpe3N0YXJ0VGltZT1zdGFydFRpbWV8fDA7ZW5kVGltZT1lbmRUaW1lfHxJbmZpbml0eTtjb25zdCBzdGFjaz1bXTtjb25zdCBzdGFydEV2ZW50PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5fdG9wTGV2ZWxFdmVudEVuZGluZ0FmdGVyKGV2ZW50cyxzdGFydFRpbWUpO2ZvcihsZXQgaT1zdGFydEV2ZW50O2k8ZXZlbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGU9ZXZlbnRzW2ldO2lmKChlLmVuZFRpbWV8fGUuc3RhcnRUaW1lKTxzdGFydFRpbWUpCmNvbnRpbnVlO2lmKGUuc3RhcnRUaW1lPj1lbmRUaW1lKQpicmVhaztpZihTREsuVHJhY2luZ01vZGVsLmlzQXN5bmNQaGFzZShlLnBoYXNlKXx8U0RLLlRyYWNpbmdNb2RlbC5pc0Zsb3dQaGFzZShlLnBoYXNlKSkKY29udGludWU7d2hpbGUoc3RhY2subGVuZ3RoJiZzdGFjay5wZWVrTGFzdCgpLmVuZFRpbWU8PWUuc3RhcnRUaW1lKQpvbkVuZEV2ZW50KHN0YWNrLnBvcCgpKTtpZihmaWx0ZXImJiFmaWx0ZXIoZSkpCmNvbnRpbnVlO2lmKGUuZHVyYXRpb24pe29uU3RhcnRFdmVudChlKTtzdGFjay5wdXNoKGUpO31lbHNle29uSW5zdGFudEV2ZW50JiZvbkluc3RhbnRFdmVudChlLHN0YWNrLnBlZWtMYXN0KCl8fG51bGwpO319CndoaWxlKHN0YWNrLmxlbmd0aCkKb25FbmRFdmVudChzdGFjay5wb3AoKSk7fQpzdGF0aWMgX3RvcExldmVsRXZlbnRFbmRpbmdBZnRlcihldmVudHMsdGltZSl7bGV0IGluZGV4PWV2ZW50cy51cHBlckJvdW5kKHRpbWUsKHRpbWUsZXZlbnQpPT50aW1lLWV2ZW50LnN0YXJ0VGltZSktMTt3aGlsZShpbmRleD4wJiYhU0RLLlRyYWNpbmdNb2RlbC5pc1RvcExldmVsRXZlbnQoZXZlbnRzW2luZGV4XSkpCmluZGV4LS07cmV0dXJuIE1hdGgubWF4KGluZGV4LDApO30Kc3RhdGljIGlzTWFya2VyRXZlbnQoZXZlbnQpe2NvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO3N3aXRjaChldmVudC5uYW1lKXtjYXNlIHJlY29yZFR5cGVzLkZyYW1lU3RhcnRlZExvYWRpbmc6Y2FzZSByZWNvcmRUeXBlcy5UaW1lU3RhbXA6Y2FzZSByZWNvcmRUeXBlcy5NYXJrRmlyc3RQYWludDpjYXNlIHJlY29yZFR5cGVzLk1hcmtGQ1A6Y2FzZSByZWNvcmRUeXBlcy5NYXJrRk1QOmNhc2UgcmVjb3JkVHlwZXMuTWFya0ZNUENhbmRpZGF0ZTpyZXR1cm4gdHJ1ZTtjYXNlIHJlY29yZFR5cGVzLk1hcmtET01Db250ZW50OmNhc2UgcmVjb3JkVHlwZXMuTWFya0xvYWQ6cmV0dXJuIGV2ZW50LmFyZ3NbJ2RhdGEnXVsnaXNNYWluRnJhbWUnXTtkZWZhdWx0OnJldHVybiBmYWxzZTt9fQpzdGF0aWMgZ2xvYmFsRXZlbnRJZChldmVudCxmaWVsZCl7Y29uc3QgZGF0YT1ldmVudC5hcmdzWydkYXRhJ118fGV2ZW50LmFyZ3NbJ2JlZ2luRGF0YSddO2NvbnN0IGlkPWRhdGEmJmRhdGFbZmllbGRdO2lmKCFpZCkKcmV0dXJuJyc7cmV0dXJuYCR7ZXZlbnQudGhyZWFkLnByb2Nlc3MoKS5pZCgpfS4ke2lkfWA7fQpzdGF0aWMgZXZlbnRGcmFtZUlkKGV2ZW50KXtjb25zdCBkYXRhPWV2ZW50LmFyZ3NbJ2RhdGEnXXx8ZXZlbnQuYXJnc1snYmVnaW5EYXRhJ107cmV0dXJuIGRhdGEmJmRhdGFbJ2ZyYW1lJ118fCcnO30KY3B1UHJvZmlsZXMoKXtyZXR1cm4gdGhpcy5fY3B1UHJvZmlsZXM7fQp0YXJnZXRCeUV2ZW50KGV2ZW50KXtjb25zdCB3b3JrZXJJZD10aGlzLl93b3JrZXJJZEJ5VGhyZWFkLmdldChldmVudC50aHJlYWQpO2NvbnN0IG1haW5UYXJnZXQ9U0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpO3JldHVybiB3b3JrZXJJZD9TREsudGFyZ2V0TWFuYWdlci50YXJnZXRCeUlkKHdvcmtlcklkKTptYWluVGFyZ2V0O30Kc2V0RXZlbnRzKHRyYWNpbmdNb2RlbCl7dGhpcy5fcmVzZXQoKTt0aGlzLl9yZXNldFByb2Nlc3NpbmdTdGF0ZSgpO3RoaXMuX3RyYWNpbmdNb2RlbD10cmFjaW5nTW9kZWw7dGhpcy5fbWluaW11bVJlY29yZFRpbWU9dHJhY2luZ01vZGVsLm1pbmltdW1SZWNvcmRUaW1lKCk7dGhpcy5fbWF4aW11bVJlY29yZFRpbWU9dHJhY2luZ01vZGVsLm1heGltdW1SZWNvcmRUaW1lKCk7dGhpcy5fcHJvY2Vzc1N5bmNCcm93c2VyRXZlbnRzKHRyYWNpbmdNb2RlbCk7aWYodGhpcy5fYnJvd3NlckZyYW1lVHJhY2tpbmcpe3RoaXMuX3Byb2Nlc3NUaHJlYWRzRm9yQnJvd3NlckZyYW1lcyh0cmFjaW5nTW9kZWwpO31lbHNle2NvbnN0IG1ldGFkYXRhRXZlbnRzPXRoaXMuX3Byb2Nlc3NNZXRhZGF0YUV2ZW50cyh0cmFjaW5nTW9kZWwpO3RoaXMuX2lzR2VuZXJpY1RyYWNlPSFtZXRhZGF0YUV2ZW50cztpZihtZXRhZGF0YUV2ZW50cykKdGhpcy5fcHJvY2Vzc01ldGFkYXRhQW5kVGhyZWFkcyh0cmFjaW5nTW9kZWwsbWV0YWRhdGFFdmVudHMpO2Vsc2UKdGhpcy5fcHJvY2Vzc0dlbmVyaWNUcmFjZSh0cmFjaW5nTW9kZWwpO30KdGhpcy5faW5zcGVjdGVkVGFyZ2V0RXZlbnRzLnN0YWJsZVNvcnQoU0RLLlRyYWNpbmdNb2RlbC5FdmVudC5jb21wYXJlU3RhcnRUaW1lKTt0aGlzLl9wcm9jZXNzQXN5bmNCcm93c2VyRXZlbnRzKHRyYWNpbmdNb2RlbCk7dGhpcy5fYnVpbGRHUFVFdmVudHModHJhY2luZ01vZGVsKTt0aGlzLl9yZXNldFByb2Nlc3NpbmdTdGF0ZSgpO30KX3Byb2Nlc3NHZW5lcmljVHJhY2UodHJhY2luZ01vZGVsKXtjb25zdCBicm93c2VyTWFpblRocmVhZD1TREsuVHJhY2luZ01vZGVsLmJyb3dzZXJNYWluVGhyZWFkKHRyYWNpbmdNb2RlbCl8fHRyYWNpbmdNb2RlbC5zb3J0ZWRQcm9jZXNzZXMoKVswXS5zb3J0ZWRUaHJlYWRzKClbMF07Zm9yKGNvbnN0IHByb2Nlc3Mgb2YgdHJhY2luZ01vZGVsLnNvcnRlZFByb2Nlc3NlcygpKXtmb3IoY29uc3QgdGhyZWFkIG9mIHByb2Nlc3Muc29ydGVkVGhyZWFkcygpKXt0aGlzLl9wcm9jZXNzVGhyZWFkRXZlbnRzKHRyYWNpbmdNb2RlbCxbe2Zyb206MCx0bzpJbmZpbml0eX1dLHRocmVhZCx0aHJlYWQ9PT1icm93c2VyTWFpblRocmVhZCxmYWxzZSx0cnVlLG51bGwpO319fQpfcHJvY2Vzc01ldGFkYXRhQW5kVGhyZWFkcyh0cmFjaW5nTW9kZWwsbWV0YWRhdGFFdmVudHMpe2xldCBzdGFydFRpbWU9MDtmb3IobGV0IGk9MCxsZW5ndGg9bWV0YWRhdGFFdmVudHMucGFnZS5sZW5ndGg7aTxsZW5ndGg7aSsrKXtjb25zdCBtZXRhRXZlbnQ9bWV0YWRhdGFFdmVudHMucGFnZVtpXTtjb25zdCBwcm9jZXNzPW1ldGFFdmVudC50aHJlYWQucHJvY2VzcygpO2NvbnN0IGVuZFRpbWU9aSsxPGxlbmd0aD9tZXRhZGF0YUV2ZW50cy5wYWdlW2krMV0uc3RhcnRUaW1lOkluZmluaXR5O3RoaXMuX2xlZ2FjeUN1cnJlbnRQYWdlPW1ldGFFdmVudC5hcmdzWydkYXRhJ10mJm1ldGFFdmVudC5hcmdzWydkYXRhJ11bJ3BhZ2UnXTtmb3IoY29uc3QgdGhyZWFkIG9mIHByb2Nlc3Muc29ydGVkVGhyZWFkcygpKXtsZXQgd29ya2VyVXJsPW51bGw7aWYodGhyZWFkLm5hbWUoKT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5Xb3JrZXJUaHJlYWROYW1lfHx0aHJlYWQubmFtZSgpPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLldvcmtlclRocmVhZE5hbWVMZWdhY3kpe2NvbnN0IHdvcmtlck1ldGFFdmVudD1tZXRhZGF0YUV2ZW50cy53b3JrZXJzLmZpbmQoZT0+e2lmKGUuYXJnc1snZGF0YSddWyd3b3JrZXJUaHJlYWRJZCddIT09dGhyZWFkLmlkKCkpCnJldHVybiBmYWxzZTtpZihlLmFyZ3NbJ2RhdGEnXVsnc2Vzc2lvbklkJ109PT10aGlzLl9zZXNzaW9uSWQpCnJldHVybiB0cnVlO3JldHVybiEhdGhpcy5fcGFnZUZyYW1lcy5nZXQoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLmV2ZW50RnJhbWVJZChlKSk7fSk7aWYoIXdvcmtlck1ldGFFdmVudCkKY29udGludWU7Y29uc3Qgd29ya2VySWQ9d29ya2VyTWV0YUV2ZW50LmFyZ3NbJ2RhdGEnXVsnd29ya2VySWQnXTtpZih3b3JrZXJJZCkKdGhpcy5fd29ya2VySWRCeVRocmVhZC5zZXQodGhyZWFkLHdvcmtlcklkKTt3b3JrZXJVcmw9d29ya2VyTWV0YUV2ZW50LmFyZ3NbJ2RhdGEnXVsndXJsJ118fCcnO30KdGhpcy5fcHJvY2Vzc1RocmVhZEV2ZW50cyh0cmFjaW5nTW9kZWwsW3tmcm9tOnN0YXJ0VGltZSx0bzplbmRUaW1lfV0sdGhyZWFkLHRocmVhZD09PW1ldGFFdmVudC50aHJlYWQsISF3b3JrZXJVcmwsdHJ1ZSx3b3JrZXJVcmwpO30Kc3RhcnRUaW1lPWVuZFRpbWU7fX0KX3Byb2Nlc3NUaHJlYWRzRm9yQnJvd3NlckZyYW1lcyh0cmFjaW5nTW9kZWwpe2NvbnN0IHByb2Nlc3NEYXRhPW5ldyBNYXAoKTtmb3IoY29uc3QgZnJhbWUgb2YgdGhpcy5fcGFnZUZyYW1lcy52YWx1ZXMoKSl7Zm9yKGxldCBpPTA7aTxmcmFtZS5wcm9jZXNzZXMubGVuZ3RoO2krKyl7Y29uc3QgcGlkPWZyYW1lLnByb2Nlc3Nlc1tpXS5wcm9jZXNzSWQ7bGV0IGRhdGE9cHJvY2Vzc0RhdGEuZ2V0KHBpZCk7aWYoIWRhdGEpe2RhdGE9W107cHJvY2Vzc0RhdGEuc2V0KHBpZCxkYXRhKTt9CmNvbnN0IHRvPWk9PT1mcmFtZS5wcm9jZXNzZXMubGVuZ3RoLTE/KGZyYW1lLmRlbGV0ZWRUaW1lfHx0aGlzLl9tYXhpbXVtUmVjb3JkVGltZSk6ZnJhbWUucHJvY2Vzc2VzW2krMV0udGltZTtkYXRhLnB1c2goe2Zyb206ZnJhbWUucHJvY2Vzc2VzW2ldLnRpbWUsdG86dG8sbWFpbjohZnJhbWUucGFyZW50LHVybDpmcmFtZS5wcm9jZXNzZXNbaV0udXJsfSk7fX0KY29uc3QgYWxsTWV0YWRhdGFFdmVudHM9dHJhY2luZ01vZGVsLmRldlRvb2xzTWV0YWRhdGFFdmVudHMoKTtmb3IoY29uc3QgcHJvY2VzcyBvZiB0cmFjaW5nTW9kZWwuc29ydGVkUHJvY2Vzc2VzKCkpe2NvbnN0IGRhdGE9cHJvY2Vzc0RhdGEuZ2V0KHByb2Nlc3MuaWQoKSk7aWYoIWRhdGEpCmNvbnRpbnVlO2RhdGEuc29ydCgoYSxiKT0+YS5mcm9tLWIuZnJvbXx8YS50by1iLnRvKTtjb25zdCByYW5nZXM9W107bGV0IGxhc3RVcmw9bnVsbDtsZXQgbGFzdE1haW5Vcmw9bnVsbDtsZXQgaGFzTWFpbj1mYWxzZTtmb3IoY29uc3QgaXRlbSBvZiBkYXRhKXtpZighcmFuZ2VzLmxlbmd0aHx8aXRlbS5mcm9tPnJhbmdlcy5wZWVrTGFzdCgpLnRvKQpyYW5nZXMucHVzaCh7ZnJvbTppdGVtLmZyb20sdG86aXRlbS50b30pO2Vsc2UKcmFuZ2VzLnBlZWtMYXN0KCkudG89aXRlbS50bztpZihpdGVtLm1haW4pCmhhc01haW49dHJ1ZTtpZihpdGVtLnVybCl7aWYoaXRlbS5tYWluKQpsYXN0TWFpblVybD1pdGVtLnVybDtsYXN0VXJsPWl0ZW0udXJsO319CmZvcihjb25zdCB0aHJlYWQgb2YgcHJvY2Vzcy5zb3J0ZWRUaHJlYWRzKCkpe2lmKHRocmVhZC5uYW1lKCk9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVuZGVyZXJNYWluVGhyZWFkTmFtZSl7dGhpcy5fcHJvY2Vzc1RocmVhZEV2ZW50cyh0cmFjaW5nTW9kZWwscmFuZ2VzLHRocmVhZCx0cnVlLGZhbHNlLGhhc01haW4saGFzTWFpbj9sYXN0TWFpblVybDpsYXN0VXJsKTt9ZWxzZSBpZih0aHJlYWQubmFtZSgpPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLldvcmtlclRocmVhZE5hbWV8fHRocmVhZC5uYW1lKCk9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuV29ya2VyVGhyZWFkTmFtZUxlZ2FjeSl7Y29uc3Qgd29ya2VyTWV0YUV2ZW50PWFsbE1ldGFkYXRhRXZlbnRzLmZpbmQoZT0+e2lmKGUubmFtZSE9PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5EZXZUb29sc01ldGFkYXRhRXZlbnQuVHJhY2luZ1Nlc3Npb25JZEZvcldvcmtlcikKcmV0dXJuIGZhbHNlO2lmKGUudGhyZWFkLnByb2Nlc3MoKSE9PXByb2Nlc3MpCnJldHVybiBmYWxzZTtpZihlLmFyZ3NbJ2RhdGEnXVsnd29ya2VyVGhyZWFkSWQnXSE9PXRocmVhZC5pZCgpKQpyZXR1cm4gZmFsc2U7cmV0dXJuISF0aGlzLl9wYWdlRnJhbWVzLmdldChUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuZXZlbnRGcmFtZUlkKGUpKTt9KTtpZighd29ya2VyTWV0YUV2ZW50KQpjb250aW51ZTt0aGlzLl93b3JrZXJJZEJ5VGhyZWFkLnNldCh0aHJlYWQsd29ya2VyTWV0YUV2ZW50LmFyZ3NbJ2RhdGEnXVsnd29ya2VySWQnXXx8JycpO3RoaXMuX3Byb2Nlc3NUaHJlYWRFdmVudHModHJhY2luZ01vZGVsLHJhbmdlcyx0aHJlYWQsZmFsc2UsdHJ1ZSxmYWxzZSx3b3JrZXJNZXRhRXZlbnQuYXJnc1snZGF0YSddWyd1cmwnXXx8JycpO31lbHNle3RoaXMuX3Byb2Nlc3NUaHJlYWRFdmVudHModHJhY2luZ01vZGVsLHJhbmdlcyx0aHJlYWQsZmFsc2UsZmFsc2UsZmFsc2UsbnVsbCk7fX19fQpfcHJvY2Vzc01ldGFkYXRhRXZlbnRzKHRyYWNpbmdNb2RlbCl7Y29uc3QgbWV0YWRhdGFFdmVudHM9dHJhY2luZ01vZGVsLmRldlRvb2xzTWV0YWRhdGFFdmVudHMoKTtjb25zdCBwYWdlRGV2VG9vbHNNZXRhZGF0YUV2ZW50cz1bXTtjb25zdCB3b3JrZXJzRGV2VG9vbHNNZXRhZGF0YUV2ZW50cz1bXTtmb3IoY29uc3QgZXZlbnQgb2YgbWV0YWRhdGFFdmVudHMpe2lmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50LlRyYWNpbmdTdGFydGVkSW5QYWdlKXtwYWdlRGV2VG9vbHNNZXRhZGF0YUV2ZW50cy5wdXNoKGV2ZW50KTtpZihldmVudC5hcmdzWydkYXRhJ10mJmV2ZW50LmFyZ3NbJ2RhdGEnXVsncGVyc2lzdGVudElkcyddKQp0aGlzLl9wZXJzaXN0ZW50SWRzPXRydWU7Y29uc3QgZnJhbWVzPSgoZXZlbnQuYXJnc1snZGF0YSddJiZldmVudC5hcmdzWydkYXRhJ11bJ2ZyYW1lcyddKXx8W10pO2ZyYW1lcy5mb3JFYWNoKHBheWxvYWQ9PnRoaXMuX2FkZFBhZ2VGcmFtZShldmVudCxwYXlsb2FkKSk7dGhpcy5fbWFpbkZyYW1lPXRoaXMucm9vdEZyYW1lcygpWzBdO31lbHNlIGlmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50LlRyYWNpbmdTZXNzaW9uSWRGb3JXb3JrZXIpe3dvcmtlcnNEZXZUb29sc01ldGFkYXRhRXZlbnRzLnB1c2goZXZlbnQpO31lbHNlIGlmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50LlRyYWNpbmdTdGFydGVkSW5Ccm93c2VyKXtjb25zb2xlLmFzc2VydCghdGhpcy5fbWFpbkZyYW1lTm9kZUlkLCdNdWx0aXBsZSBzZXNzaW9ucyBpbiB0cmFjZScpO3RoaXMuX21haW5GcmFtZU5vZGVJZD1ldmVudC5hcmdzWydmcmFtZVRyZWVOb2RlSWQnXTt9fQppZighcGFnZURldlRvb2xzTWV0YWRhdGFFdmVudHMubGVuZ3RoKQpyZXR1cm4gbnVsbDtjb25zdCBzZXNzaW9uSWQ9cGFnZURldlRvb2xzTWV0YWRhdGFFdmVudHNbMF0uYXJnc1snc2Vzc2lvbklkJ118fHBhZ2VEZXZUb29sc01ldGFkYXRhRXZlbnRzWzBdLmFyZ3NbJ2RhdGEnXVsnc2Vzc2lvbklkJ107dGhpcy5fc2Vzc2lvbklkPXNlc3Npb25JZDtjb25zdCBtaXNtYXRjaGluZ0lkcz1uZXcgU2V0KCk7ZnVuY3Rpb24gY2hlY2tTZXNzaW9uSWQoZXZlbnQpe2xldCBhcmdzPWV2ZW50LmFyZ3M7aWYoYXJnc1snZGF0YSddKQphcmdzPWFyZ3NbJ2RhdGEnXTtjb25zdCBpZD1hcmdzWydzZXNzaW9uSWQnXTtpZihpZD09PXNlc3Npb25JZCkKcmV0dXJuIHRydWU7bWlzbWF0Y2hpbmdJZHMuYWRkKGlkKTtyZXR1cm4gZmFsc2U7fQpjb25zdCByZXN1bHQ9e3BhZ2U6cGFnZURldlRvb2xzTWV0YWRhdGFFdmVudHMuZmlsdGVyKGNoZWNrU2Vzc2lvbklkKS5zb3J0KFNESy5UcmFjaW5nTW9kZWwuRXZlbnQuY29tcGFyZVN0YXJ0VGltZSksd29ya2Vyczp3b3JrZXJzRGV2VG9vbHNNZXRhZGF0YUV2ZW50cy5zb3J0KFNESy5UcmFjaW5nTW9kZWwuRXZlbnQuY29tcGFyZVN0YXJ0VGltZSl9O2lmKG1pc21hdGNoaW5nSWRzLnNpemUpe0NvbW1vbi5jb25zb2xlLmVycm9yKCdUaW1lbGluZSByZWNvcmRpbmcgd2FzIHN0YXJ0ZWQgaW4gbW9yZSB0aGFuIG9uZSBwYWdlIHNpbXVsdGFuZW91c2x5LiBTZXNzaW9uIGlkIG1pc21hdGNoOiAnKwp0aGlzLl9zZXNzaW9uSWQrJyBhbmQgJyttaXNtYXRjaGluZ0lkcy52YWx1ZXNBcnJheSgpKycuJyk7fQpyZXR1cm4gcmVzdWx0O30KX3Byb2Nlc3NTeW5jQnJvd3NlckV2ZW50cyh0cmFjaW5nTW9kZWwpe2NvbnN0IGJyb3dzZXJNYWluPVNESy5UcmFjaW5nTW9kZWwuYnJvd3Nlck1haW5UaHJlYWQodHJhY2luZ01vZGVsKTtpZihicm93c2VyTWFpbikKYnJvd3Nlck1haW4uZXZlbnRzKCkuZm9yRWFjaCh0aGlzLl9wcm9jZXNzQnJvd3NlckV2ZW50LHRoaXMpO30KX3Byb2Nlc3NBc3luY0Jyb3dzZXJFdmVudHModHJhY2luZ01vZGVsKXtjb25zdCBicm93c2VyTWFpbj1TREsuVHJhY2luZ01vZGVsLmJyb3dzZXJNYWluVGhyZWFkKHRyYWNpbmdNb2RlbCk7aWYoYnJvd3Nlck1haW4pCnRoaXMuX3Byb2Nlc3NBc3luY0V2ZW50cyhicm93c2VyTWFpbixbe2Zyb206MCx0bzpJbmZpbml0eX1dKTt9Cl9idWlsZEdQVUV2ZW50cyh0cmFjaW5nTW9kZWwpe2NvbnN0IHRocmVhZD10cmFjaW5nTW9kZWwudGhyZWFkQnlOYW1lKCdHUFUgUHJvY2VzcycsJ0NyR3B1TWFpbicpO2lmKCF0aHJlYWQpCnJldHVybjtjb25zdCBncHVFdmVudE5hbWU9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuR1BVVGFzaztjb25zdCB0cmFjaz10aGlzLl9lbnN1cmVOYW1lZFRyYWNrKFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuR1BVKTt0cmFjay50aHJlYWQ9dGhyZWFkO3RyYWNrLmV2ZW50cz10aHJlYWQuZXZlbnRzKCkuZmlsdGVyKGV2ZW50PT5ldmVudC5uYW1lPT09Z3B1RXZlbnROYW1lKTt9Cl9yZXNldFByb2Nlc3NpbmdTdGF0ZSgpe3RoaXMuX2FzeW5jRXZlbnRUcmFja2VyPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lQXN5bmNFdmVudFRyYWNrZXIoKTt0aGlzLl9pbnZhbGlkYXRpb25UcmFja2VyPW5ldyBUaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNrZXIoKTt0aGlzLl9sYXlvdXRJbnZhbGlkYXRlPXt9O3RoaXMuX2xhc3RTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbj17fTt0aGlzLl9wYWludEltYWdlRXZlbnRCeVBpeGVsUmVmSWQ9e307dGhpcy5fbGFzdFBhaW50Rm9yTGF5ZXI9e307dGhpcy5fbGFzdFJlY2FsY3VsYXRlU3R5bGVzRXZlbnQ9bnVsbDt0aGlzLl9jdXJyZW50U2NyaXB0RXZlbnQ9bnVsbDt0aGlzLl9ldmVudFN0YWNrPVtdO3RoaXMuX2tub3duSW5wdXRFdmVudHM9bmV3IFNldCgpO3RoaXMuX2Jyb3dzZXJGcmFtZVRyYWNraW5nPWZhbHNlO3RoaXMuX3BlcnNpc3RlbnRJZHM9ZmFsc2U7dGhpcy5fbGVnYWN5Q3VycmVudFBhZ2U9bnVsbDt9Cl9leHRyYWN0Q3B1UHJvZmlsZSh0cmFjaW5nTW9kZWwsdGhyZWFkKXtjb25zdCBldmVudHM9dGhyZWFkLmV2ZW50cygpO2xldCBjcHVQcm9maWxlO2xldCBjcHVQcm9maWxlRXZlbnQ9ZXZlbnRzLnBlZWtMYXN0KCk7aWYoY3B1UHJvZmlsZUV2ZW50JiZjcHVQcm9maWxlRXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkNwdVByb2ZpbGUpe2NvbnN0IGV2ZW50RGF0YT1jcHVQcm9maWxlRXZlbnQuYXJnc1snZGF0YSddO2NwdVByb2ZpbGU9KGV2ZW50RGF0YSYmZXZlbnREYXRhWydjcHVQcm9maWxlJ10pO30KaWYoIWNwdVByb2ZpbGUpe2NwdVByb2ZpbGVFdmVudD1ldmVudHMuZmluZChlPT5lLm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5Qcm9maWxlKTtpZighY3B1UHJvZmlsZUV2ZW50KQpyZXR1cm4gbnVsbDtjb25zdCBwcm9maWxlR3JvdXA9dHJhY2luZ01vZGVsLnByb2ZpbGVHcm91cChjcHVQcm9maWxlRXZlbnQpO2lmKCFwcm9maWxlR3JvdXApe0NvbW1vbi5jb25zb2xlLmVycm9yKCdJbnZhbGlkIENQVSBwcm9maWxlIGZvcm1hdC4nKTtyZXR1cm4gbnVsbDt9CmNwdVByb2ZpbGU9KHtzdGFydFRpbWU6Y3B1UHJvZmlsZUV2ZW50LmFyZ3NbJ2RhdGEnXVsnc3RhcnRUaW1lJ10sZW5kVGltZTowLG5vZGVzOltdLHNhbXBsZXM6W10sdGltZURlbHRhczpbXX0pO2Zvcihjb25zdCBwcm9maWxlRXZlbnQgb2YgcHJvZmlsZUdyb3VwLmNoaWxkcmVuKXtjb25zdCBldmVudERhdGE9cHJvZmlsZUV2ZW50LmFyZ3NbJ2RhdGEnXTtpZignc3RhcnRUaW1lJ2luIGV2ZW50RGF0YSkKY3B1UHJvZmlsZS5zdGFydFRpbWU9ZXZlbnREYXRhWydzdGFydFRpbWUnXTtpZignZW5kVGltZSdpbiBldmVudERhdGEpCmNwdVByb2ZpbGUuZW5kVGltZT1ldmVudERhdGFbJ2VuZFRpbWUnXTtjb25zdCBub2Rlc0FuZFNhbXBsZXM9ZXZlbnREYXRhWydjcHVQcm9maWxlJ118fHt9O2NwdVByb2ZpbGUubm9kZXMucHVzaEFsbChub2Rlc0FuZFNhbXBsZXNbJ25vZGVzJ118fFtdKTtjcHVQcm9maWxlLnNhbXBsZXMucHVzaEFsbChub2Rlc0FuZFNhbXBsZXNbJ3NhbXBsZXMnXXx8W10pO2NwdVByb2ZpbGUudGltZURlbHRhcy5wdXNoQWxsKGV2ZW50RGF0YVsndGltZURlbHRhcyddfHxbXSk7aWYoY3B1UHJvZmlsZS5zYW1wbGVzLmxlbmd0aCE9PWNwdVByb2ZpbGUudGltZURlbHRhcy5sZW5ndGgpe0NvbW1vbi5jb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgQ1BVIHByb2ZpbGUuJyk7cmV0dXJuIG51bGw7fX0KaWYoIWNwdVByb2ZpbGUuZW5kVGltZSkKY3B1UHJvZmlsZS5lbmRUaW1lPWNwdVByb2ZpbGUudGltZURlbHRhcy5yZWR1Y2UoKHgseSk9PngreSxjcHVQcm9maWxlLnN0YXJ0VGltZSk7fQp0cnl7Y29uc3QganNQcm9maWxlTW9kZWw9bmV3IFNESy5DUFVQcm9maWxlRGF0YU1vZGVsKGNwdVByb2ZpbGUpO3RoaXMuX2NwdVByb2ZpbGVzLnB1c2goanNQcm9maWxlTW9kZWwpO3JldHVybiBqc1Byb2ZpbGVNb2RlbDt9Y2F0Y2goZSl7Q29tbW9uLmNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBDUFUgcHJvZmlsZS4nKTt9CnJldHVybiBudWxsO30KX2luamVjdEpTRnJhbWVFdmVudHModHJhY2luZ01vZGVsLHRocmVhZCl7Y29uc3QganNQcm9maWxlTW9kZWw9dGhpcy5fZXh0cmFjdENwdVByb2ZpbGUodHJhY2luZ01vZGVsLHRocmVhZCk7bGV0IGV2ZW50cz10aHJlYWQuZXZlbnRzKCk7Y29uc3QganNTYW1wbGVzPWpzUHJvZmlsZU1vZGVsP1RpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuZ2VuZXJhdGVUcmFjaW5nRXZlbnRzRnJvbUNwdVByb2ZpbGUoanNQcm9maWxlTW9kZWwsdGhyZWFkKTpudWxsO2lmKGpzU2FtcGxlcyYmanNTYW1wbGVzLmxlbmd0aCkKZXZlbnRzPWV2ZW50cy5tZXJnZU9yZGVyZWQoanNTYW1wbGVzLFNESy5UcmFjaW5nTW9kZWwuRXZlbnQub3JkZXJlZENvbXBhcmVTdGFydFRpbWUpO2lmKGpzU2FtcGxlc3x8ZXZlbnRzLnNvbWUoZT0+ZS5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSlNTYW1wbGUpKXtjb25zdCBqc0ZyYW1lRXZlbnRzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuZ2VuZXJhdGVKU0ZyYW1lRXZlbnRzKGV2ZW50cyk7aWYoanNGcmFtZUV2ZW50cyYmanNGcmFtZUV2ZW50cy5sZW5ndGgpCmV2ZW50cz1qc0ZyYW1lRXZlbnRzLm1lcmdlT3JkZXJlZChldmVudHMsU0RLLlRyYWNpbmdNb2RlbC5FdmVudC5vcmRlcmVkQ29tcGFyZVN0YXJ0VGltZSk7fQpyZXR1cm4gZXZlbnRzO30KX3Byb2Nlc3NUaHJlYWRFdmVudHModHJhY2luZ01vZGVsLHJhbmdlcyx0aHJlYWQsaXNNYWluVGhyZWFkLGlzV29ya2VyLGZvck1haW5GcmFtZSx1cmwpe2NvbnN0IHRyYWNrPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2soKTt0cmFjay5uYW1lPXRocmVhZC5uYW1lKCl8fGxzYFRocmVhZCAke3RocmVhZC5pZCgpfWA7dHJhY2sudHlwZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLk90aGVyO3RyYWNrLnRocmVhZD10aHJlYWQ7aWYoaXNNYWluVGhyZWFkKXt0cmFjay50eXBlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuTWFpblRocmVhZDt0cmFjay51cmw9dXJsfHxudWxsO3RyYWNrLmZvck1haW5GcmFtZT1mb3JNYWluRnJhbWU7fWVsc2UgaWYoaXNXb3JrZXIpe3RyYWNrLnR5cGU9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5Xb3JrZXI7dHJhY2sudXJsPXVybDt9ZWxzZSBpZih0aHJlYWQubmFtZSgpLnN0YXJ0c1dpdGgoJ0NvbXBvc2l0b3JUaWxlV29ya2VyJykpe3RyYWNrLnR5cGU9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5SYXN0ZXI7fQp0aGlzLl90cmFja3MucHVzaCh0cmFjayk7Y29uc3QgZXZlbnRzPXRoaXMuX2luamVjdEpTRnJhbWVFdmVudHModHJhY2luZ01vZGVsLHRocmVhZCk7dGhpcy5fZXZlbnRTdGFjaz1bXTtjb25zdCBldmVudFN0YWNrPXRoaXMuX2V2ZW50U3RhY2s7Zm9yKGNvbnN0IHJhbmdlIG9mIHJhbmdlcyl7bGV0IGk9ZXZlbnRzLmxvd2VyQm91bmQocmFuZ2UuZnJvbSwodGltZSxldmVudCk9PnRpbWUtZXZlbnQuc3RhcnRUaW1lKTtmb3IoO2k8ZXZlbnRzLmxlbmd0aDtpKyspe2NvbnN0IGV2ZW50PWV2ZW50c1tpXTtpZihldmVudC5zdGFydFRpbWU+PXJhbmdlLnRvKQpicmVhazt3aGlsZShldmVudFN0YWNrLmxlbmd0aCYmZXZlbnRTdGFjay5wZWVrTGFzdCgpLmVuZFRpbWU8PWV2ZW50LnN0YXJ0VGltZSkKZXZlbnRTdGFjay5wb3AoKTtpZighdGhpcy5fcHJvY2Vzc0V2ZW50KGV2ZW50KSkKY29udGludWU7aWYoIVNESy5UcmFjaW5nTW9kZWwuaXNBc3luY1BoYXNlKGV2ZW50LnBoYXNlKSYmZXZlbnQuZHVyYXRpb24pe2lmKGV2ZW50U3RhY2subGVuZ3RoKXtjb25zdCBwYXJlbnQ9ZXZlbnRTdGFjay5wZWVrTGFzdCgpO3BhcmVudC5zZWxmVGltZS09ZXZlbnQuZHVyYXRpb247aWYocGFyZW50LnNlbGZUaW1lPDApCnRoaXMuX2ZpeE5lZ2F0aXZlRHVyYXRpb24ocGFyZW50LGV2ZW50KTt9CmV2ZW50LnNlbGZUaW1lPWV2ZW50LmR1cmF0aW9uO2lmKCFldmVudFN0YWNrLmxlbmd0aCkKdHJhY2sudGFza3MucHVzaChldmVudCk7ZXZlbnRTdGFjay5wdXNoKGV2ZW50KTt9CmlmKFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5pc01hcmtlckV2ZW50KGV2ZW50KSkKdGhpcy5fdGltZU1hcmtlckV2ZW50cy5wdXNoKGV2ZW50KTt0cmFjay5ldmVudHMucHVzaChldmVudCk7dGhpcy5faW5zcGVjdGVkVGFyZ2V0RXZlbnRzLnB1c2goZXZlbnQpO319CnRoaXMuX3Byb2Nlc3NBc3luY0V2ZW50cyh0aHJlYWQscmFuZ2VzKTt9Cl9maXhOZWdhdGl2ZUR1cmF0aW9uKGV2ZW50LGNoaWxkKXtjb25zdCBlcHNpbG9uPTFlLTM7aWYoZXZlbnQuc2VsZlRpbWU8LWVwc2lsb24pe2NvbnNvbGUuZXJyb3IoYENoaWxkcmVuIGFyZSBsb25nZXIgdGhhbiBwYXJlbnQgYXQgJHtldmVudC5zdGFydFRpbWV9IGArYCgkeyhjaGlsZC5zdGFydFRpbWUgLSB0aGlzLm1pbmltdW1SZWNvcmRUaW1lKCkpLnRvRml4ZWQoMyl9IGJ5ICR7KC1ldmVudC5zZWxmVGltZSkudG9GaXhlZCgzKX1gKTt9CmV2ZW50LnNlbGZUaW1lPTA7fQpfcHJvY2Vzc0FzeW5jRXZlbnRzKHRocmVhZCxyYW5nZXMpe2NvbnN0IGFzeW5jRXZlbnRzPXRocmVhZC5hc3luY0V2ZW50cygpO2NvbnN0IGdyb3Vwcz1uZXcgTWFwKCk7ZnVuY3Rpb24gZ3JvdXAodHlwZSl7aWYoIWdyb3Vwcy5oYXModHlwZSkpCmdyb3Vwcy5zZXQodHlwZSxbXSk7cmV0dXJuIGdyb3Vwcy5nZXQodHlwZSk7fQpmb3IoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKXtsZXQgaT1hc3luY0V2ZW50cy5sb3dlckJvdW5kKHJhbmdlLmZyb20sZnVuY3Rpb24odGltZSxhc3luY0V2ZW50KXtyZXR1cm4gdGltZS1hc3luY0V2ZW50LnN0YXJ0VGltZTt9KTtmb3IoO2k8YXN5bmNFdmVudHMubGVuZ3RoOysraSl7Y29uc3QgYXN5bmNFdmVudD1hc3luY0V2ZW50c1tpXTtpZihhc3luY0V2ZW50LnN0YXJ0VGltZT49cmFuZ2UudG8pCmJyZWFrO2lmKGFzeW5jRXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkNvbnNvbGUpKXtncm91cChUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkNvbnNvbGUpLnB1c2goYXN5bmNFdmVudCk7Y29udGludWU7fQppZihhc3luY0V2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5Vc2VyVGltaW5nKSl7Z3JvdXAoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5Vc2VyVGltaW5nKS5wdXNoKGFzeW5jRXZlbnQpO2NvbnRpbnVlO30KaWYoYXN5bmNFdmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuQW5pbWF0aW9uKXtncm91cChUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkFuaW1hdGlvbikucHVzaChhc3luY0V2ZW50KTtjb250aW51ZTt9CmlmKGFzeW5jRXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkxhdGVuY3lJbmZvKXx8YXN5bmNFdmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSW1wbFNpZGVGbGluZyl7Y29uc3QgbGFzdFN0ZXA9YXN5bmNFdmVudC5zdGVwcy5wZWVrTGFzdCgpO2lmKGxhc3RTdGVwLnBoYXNlIT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5Bc3luY0VuZCkKY29udGludWU7Y29uc3QgZGF0YT1sYXN0U3RlcC5hcmdzWydkYXRhJ107YXN5bmNFdmVudC5jYXVzZWRGcmFtZT0hIShkYXRhJiZkYXRhWydJTlBVVF9FVkVOVF9MQVRFTkNZX1JFTkRFUkVSX1NXQVBfQ09NUE9ORU5UJ10pO2lmKGFzeW5jRXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkxhdGVuY3lJbmZvKSl7aWYoIXRoaXMuX2tub3duSW5wdXRFdmVudHMuaGFzKGxhc3RTdGVwLmlkKSkKY29udGludWU7aWYoYXN5bmNFdmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSW5wdXRMYXRlbmN5TW91c2VNb3ZlJiYhYXN5bmNFdmVudC5jYXVzZWRGcmFtZSkKY29udGludWU7Y29uc3QgcmVuZGVyZXJNYWluPWRhdGFbJ0lOUFVUX0VWRU5UX0xBVEVOQ1lfUkVOREVSRVJfTUFJTl9DT01QT05FTlQnXTtpZihyZW5kZXJlck1haW4pe2NvbnN0IHRpbWU9cmVuZGVyZXJNYWluWyd0aW1lJ10vMTAwMDtUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChhc3luY0V2ZW50LnN0ZXBzWzBdKS50aW1lV2FpdGluZ0Zvck1haW5UaHJlYWQ9dGltZS1hc3luY0V2ZW50LnN0ZXBzWzBdLnN0YXJ0VGltZTt9fQpncm91cChUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLklucHV0KS5wdXNoKGFzeW5jRXZlbnQpO2NvbnRpbnVlO319fQpmb3IoY29uc3RbdHlwZSxldmVudHNdb2YgZ3JvdXBzKXtjb25zdCB0cmFjaz10aGlzLl9lbnN1cmVOYW1lZFRyYWNrKHR5cGUpO3RyYWNrLnRocmVhZD10aHJlYWQ7dHJhY2suYXN5bmNFdmVudHM9dHJhY2suYXN5bmNFdmVudHMubWVyZ2VPcmRlcmVkKGV2ZW50cyxTREsuVHJhY2luZ01vZGVsLkV2ZW50LmNvbXBhcmVTdGFydFRpbWUpO319Cl9wcm9jZXNzRXZlbnQoZXZlbnQpe2NvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2NvbnN0IGV2ZW50U3RhY2s9dGhpcy5fZXZlbnRTdGFjaztpZighZXZlbnRTdGFjay5sZW5ndGgpe2lmKHRoaXMuX2N1cnJlbnRUYXNrTGF5b3V0QW5kUmVjYWxjRXZlbnRzJiZ0aGlzLl9jdXJyZW50VGFza0xheW91dEFuZFJlY2FsY0V2ZW50cy5sZW5ndGgpe2NvbnN0IHRvdGFsVGltZT10aGlzLl9jdXJyZW50VGFza0xheW91dEFuZFJlY2FsY0V2ZW50cy5yZWR1Y2UoKHRpbWUsZXZlbnQpPT50aW1lK2V2ZW50LmR1cmF0aW9uLDApO2lmKHRvdGFsVGltZT5UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVGhyZXNob2xkcy5Gb3JjZWRMYXlvdXQpe2Zvcihjb25zdCBlIG9mIHRoaXMuX2N1cnJlbnRUYXNrTGF5b3V0QW5kUmVjYWxjRXZlbnRzKXtjb25zdCB0aW1lbGluZURhdGE9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZSk7dGltZWxpbmVEYXRhLndhcm5pbmc9ZS5uYW1lPT09cmVjb3JkVHlwZXMuTGF5b3V0P1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5XYXJuaW5nVHlwZS5Gb3JjZWRMYXlvdXQ6VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLldhcm5pbmdUeXBlLkZvcmNlZFN0eWxlO319fQp0aGlzLl9jdXJyZW50VGFza0xheW91dEFuZFJlY2FsY0V2ZW50cz1bXTt9CmlmKHRoaXMuX2N1cnJlbnRTY3JpcHRFdmVudCYmZXZlbnQuc3RhcnRUaW1lPnRoaXMuX2N1cnJlbnRTY3JpcHRFdmVudC5lbmRUaW1lKQp0aGlzLl9jdXJyZW50U2NyaXB0RXZlbnQ9bnVsbDtjb25zdCBldmVudERhdGE9ZXZlbnQuYXJnc1snZGF0YSddfHxldmVudC5hcmdzWydiZWdpbkRhdGEnXXx8e307Y29uc3QgdGltZWxpbmVEYXRhPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KTtpZihldmVudERhdGFbJ3N0YWNrVHJhY2UnXSkKdGltZWxpbmVEYXRhLnN0YWNrVHJhY2U9ZXZlbnREYXRhWydzdGFja1RyYWNlJ107aWYodGltZWxpbmVEYXRhLnN0YWNrVHJhY2UmJmV2ZW50Lm5hbWUhPT1yZWNvcmRUeXBlcy5KU1NhbXBsZSl7Zm9yKGxldCBpPTA7aTx0aW1lbGluZURhdGEuc3RhY2tUcmFjZS5sZW5ndGg7KytpKXstLXRpbWVsaW5lRGF0YS5zdGFja1RyYWNlW2ldLmxpbmVOdW1iZXI7LS10aW1lbGluZURhdGEuc3RhY2tUcmFjZVtpXS5jb2x1bW5OdW1iZXI7fX0KbGV0IHBhZ2VGcmFtZUlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5ldmVudEZyYW1lSWQoZXZlbnQpO2lmKCFwYWdlRnJhbWVJZCYmZXZlbnRTdGFjay5sZW5ndGgpCnBhZ2VGcmFtZUlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50U3RhY2sucGVla0xhc3QoKSkuZnJhbWVJZDt0aW1lbGluZURhdGEuZnJhbWVJZD1wYWdlRnJhbWVJZHx8KHRoaXMuX21haW5GcmFtZSYmdGhpcy5fbWFpbkZyYW1lLmZyYW1lSWQpfHwnJzt0aGlzLl9hc3luY0V2ZW50VHJhY2tlci5wcm9jZXNzRXZlbnQoZXZlbnQpO3N3aXRjaChldmVudC5uYW1lKXtjYXNlIHJlY29yZFR5cGVzLlJlc291cmNlU2VuZFJlcXVlc3Q6Y2FzZSByZWNvcmRUeXBlcy5XZWJTb2NrZXRDcmVhdGU6dGltZWxpbmVEYXRhLnNldEluaXRpYXRvcihldmVudFN0YWNrLnBlZWtMYXN0KCl8fG51bGwpO3RpbWVsaW5lRGF0YS51cmw9ZXZlbnREYXRhWyd1cmwnXTticmVhaztjYXNlIHJlY29yZFR5cGVzLlNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uOnRoaXMuX2xhc3RTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbltldmVudERhdGFbJ2ZyYW1lJ11dPWV2ZW50O2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuVXBkYXRlTGF5b3V0VHJlZTpjYXNlIHJlY29yZFR5cGVzLlJlY2FsY3VsYXRlU3R5bGVzOnRoaXMuX2ludmFsaWRhdGlvblRyYWNrZXIuZGlkUmVjYWxjU3R5bGUoZXZlbnQpO2lmKGV2ZW50LmFyZ3NbJ2JlZ2luRGF0YSddKQp0aW1lbGluZURhdGEuc2V0SW5pdGlhdG9yKHRoaXMuX2xhc3RTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbltldmVudC5hcmdzWydiZWdpbkRhdGEnXVsnZnJhbWUnXV0pO3RoaXMuX2xhc3RSZWNhbGN1bGF0ZVN0eWxlc0V2ZW50PWV2ZW50O2lmKHRoaXMuX2N1cnJlbnRTY3JpcHRFdmVudCkKdGhpcy5fY3VycmVudFRhc2tMYXlvdXRBbmRSZWNhbGNFdmVudHMucHVzaChldmVudCk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5TY2hlZHVsZVN0eWxlSW52YWxpZGF0aW9uVHJhY2tpbmc6Y2FzZSByZWNvcmRUeXBlcy5TdHlsZVJlY2FsY0ludmFsaWRhdGlvblRyYWNraW5nOmNhc2UgcmVjb3JkVHlwZXMuU3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvblRyYWNraW5nOmNhc2UgcmVjb3JkVHlwZXMuTGF5b3V0SW52YWxpZGF0aW9uVHJhY2tpbmc6Y2FzZSByZWNvcmRUeXBlcy5MYXllckludmFsaWRhdGlvblRyYWNraW5nOmNhc2UgcmVjb3JkVHlwZXMuUGFpbnRJbnZhbGlkYXRpb25UcmFja2luZzpjYXNlIHJlY29yZFR5cGVzLlNjcm9sbEludmFsaWRhdGlvblRyYWNraW5nOnRoaXMuX2ludmFsaWRhdGlvblRyYWNrZXIuYWRkSW52YWxpZGF0aW9uKG5ldyBUaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNraW5nRXZlbnQoZXZlbnQpKTticmVhaztjYXNlIHJlY29yZFR5cGVzLkludmFsaWRhdGVMYXlvdXQ6e2xldCBsYXlvdXRJbml0YXRvcj1ldmVudDtjb25zdCBmcmFtZUlkPWV2ZW50RGF0YVsnZnJhbWUnXTtpZighdGhpcy5fbGF5b3V0SW52YWxpZGF0ZVtmcmFtZUlkXSYmdGhpcy5fbGFzdFJlY2FsY3VsYXRlU3R5bGVzRXZlbnQmJnRoaXMuX2xhc3RSZWNhbGN1bGF0ZVN0eWxlc0V2ZW50LmVuZFRpbWU+ZXZlbnQuc3RhcnRUaW1lKQpsYXlvdXRJbml0YXRvcj1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudCh0aGlzLl9sYXN0UmVjYWxjdWxhdGVTdHlsZXNFdmVudCkuaW5pdGlhdG9yKCk7dGhpcy5fbGF5b3V0SW52YWxpZGF0ZVtmcmFtZUlkXT1sYXlvdXRJbml0YXRvcjticmVhazt9CmNhc2UgcmVjb3JkVHlwZXMuTGF5b3V0Ont0aGlzLl9pbnZhbGlkYXRpb25UcmFja2VyLmRpZExheW91dChldmVudCk7Y29uc3QgZnJhbWVJZD1ldmVudC5hcmdzWydiZWdpbkRhdGEnXVsnZnJhbWUnXTt0aW1lbGluZURhdGEuc2V0SW5pdGlhdG9yKHRoaXMuX2xheW91dEludmFsaWRhdGVbZnJhbWVJZF0pO2lmKGV2ZW50LmFyZ3NbJ2VuZERhdGEnXSkKdGltZWxpbmVEYXRhLmJhY2tlbmROb2RlSWQ9ZXZlbnQuYXJnc1snZW5kRGF0YSddWydyb290Tm9kZSddO3RoaXMuX2xheW91dEludmFsaWRhdGVbZnJhbWVJZF09bnVsbDtpZih0aGlzLl9jdXJyZW50U2NyaXB0RXZlbnQpCnRoaXMuX2N1cnJlbnRUYXNrTGF5b3V0QW5kUmVjYWxjRXZlbnRzLnB1c2goZXZlbnQpO2JyZWFrO30KY2FzZSByZWNvcmRUeXBlcy5FdmVudERpc3BhdGNoOmlmKGV2ZW50LmR1cmF0aW9uPlRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UaHJlc2hvbGRzLlJlY3VycmluZ0hhbmRsZXIpCnRpbWVsaW5lRGF0YS53YXJuaW5nPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5XYXJuaW5nVHlwZS5Mb25nSGFuZGxlcjticmVhaztjYXNlIHJlY29yZFR5cGVzLlRpbWVyRmlyZTpjYXNlIHJlY29yZFR5cGVzLkZpcmVBbmltYXRpb25GcmFtZTppZihldmVudC5kdXJhdGlvbj5UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVGhyZXNob2xkcy5SZWN1cnJpbmdIYW5kbGVyKQp0aW1lbGluZURhdGEud2FybmluZz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuV2FybmluZ1R5cGUuTG9uZ1JlY3VycmluZ0hhbmRsZXI7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5GdW5jdGlvbkNhbGw6aWYodHlwZW9mIGV2ZW50RGF0YVsnc2NyaXB0TmFtZSddPT09J3N0cmluZycpCmV2ZW50RGF0YVsndXJsJ109ZXZlbnREYXRhWydzY3JpcHROYW1lJ107aWYodHlwZW9mIGV2ZW50RGF0YVsnc2NyaXB0TGluZSddPT09J251bWJlcicpCmV2ZW50RGF0YVsnbGluZU51bWJlciddPWV2ZW50RGF0YVsnc2NyaXB0TGluZSddO2Nhc2UgcmVjb3JkVHlwZXMuRXZhbHVhdGVTY3JpcHQ6Y2FzZSByZWNvcmRUeXBlcy5Db21waWxlU2NyaXB0OmlmKHR5cGVvZiBldmVudERhdGFbJ2xpbmVOdW1iZXInXT09PSdudW1iZXInKQotLWV2ZW50RGF0YVsnbGluZU51bWJlciddO2lmKHR5cGVvZiBldmVudERhdGFbJ2NvbHVtbk51bWJlciddPT09J251bWJlcicpCi0tZXZlbnREYXRhWydjb2x1bW5OdW1iZXInXTtjYXNlIHJlY29yZFR5cGVzLlJ1bk1pY3JvdGFza3M6aWYoIXRoaXMuX2N1cnJlbnRTY3JpcHRFdmVudCkKdGhpcy5fY3VycmVudFNjcmlwdEV2ZW50PWV2ZW50O2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuU2V0TGF5ZXJUcmVlSWQ6aWYodGhpcy5fc2Vzc2lvbklkJiZldmVudERhdGFbJ3Nlc3Npb25JZCddJiZ0aGlzLl9zZXNzaW9uSWQ9PT1ldmVudERhdGFbJ3Nlc3Npb25JZCddKXt0aGlzLl9tYWluRnJhbWVMYXllclRyZWVJZD1ldmVudERhdGFbJ2xheWVyVHJlZUlkJ107YnJlYWs7fQpjb25zdCBmcmFtZUlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5ldmVudEZyYW1lSWQoZXZlbnQpO2NvbnN0IHBhZ2VGcmFtZT10aGlzLl9wYWdlRnJhbWVzLmdldChmcmFtZUlkKTtpZighcGFnZUZyYW1lfHxwYWdlRnJhbWUucGFyZW50KQpyZXR1cm4gZmFsc2U7dGhpcy5fbWFpbkZyYW1lTGF5ZXJUcmVlSWQ9ZXZlbnREYXRhWydsYXllclRyZWVJZCddO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuUGFpbnQ6e3RoaXMuX2ludmFsaWRhdGlvblRyYWNrZXIuZGlkUGFpbnQoZXZlbnQpO3RpbWVsaW5lRGF0YS5iYWNrZW5kTm9kZUlkPWV2ZW50RGF0YVsnbm9kZUlkJ107aWYoIWV2ZW50RGF0YVsnbGF5ZXJJZCddKQpicmVhaztjb25zdCBsYXllcklkPWV2ZW50RGF0YVsnbGF5ZXJJZCddO3RoaXMuX2xhc3RQYWludEZvckxheWVyW2xheWVySWRdPWV2ZW50O2JyZWFrO30KY2FzZSByZWNvcmRUeXBlcy5EaXNwbGF5SXRlbUxpc3RTbmFwc2hvdDpjYXNlIHJlY29yZFR5cGVzLlBpY3R1cmVTbmFwc2hvdDp7Y29uc3QgbGF5ZXJVcGRhdGVFdmVudD10aGlzLl9maW5kQW5jZXN0b3JFdmVudChyZWNvcmRUeXBlcy5VcGRhdGVMYXllcik7aWYoIWxheWVyVXBkYXRlRXZlbnR8fGxheWVyVXBkYXRlRXZlbnQuYXJnc1snbGF5ZXJUcmVlSWQnXSE9PXRoaXMuX21haW5GcmFtZUxheWVyVHJlZUlkKQpicmVhaztjb25zdCBwYWludEV2ZW50PXRoaXMuX2xhc3RQYWludEZvckxheWVyW2xheWVyVXBkYXRlRXZlbnQuYXJnc1snbGF5ZXJJZCddXTtpZihwYWludEV2ZW50KXtUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChwYWludEV2ZW50KS5waWN0dXJlPShldmVudCk7fQpicmVhazt9CmNhc2UgcmVjb3JkVHlwZXMuU2Nyb2xsTGF5ZXI6dGltZWxpbmVEYXRhLmJhY2tlbmROb2RlSWQ9ZXZlbnREYXRhWydub2RlSWQnXTticmVhaztjYXNlIHJlY29yZFR5cGVzLlBhaW50SW1hZ2U6dGltZWxpbmVEYXRhLmJhY2tlbmROb2RlSWQ9ZXZlbnREYXRhWydub2RlSWQnXTt0aW1lbGluZURhdGEudXJsPWV2ZW50RGF0YVsndXJsJ107YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5EZWNvZGVJbWFnZTpjYXNlIHJlY29yZFR5cGVzLlJlc2l6ZUltYWdlOntsZXQgcGFpbnRJbWFnZUV2ZW50PXRoaXMuX2ZpbmRBbmNlc3RvckV2ZW50KHJlY29yZFR5cGVzLlBhaW50SW1hZ2UpO2lmKCFwYWludEltYWdlRXZlbnQpe2NvbnN0IGRlY29kZUxhenlQaXhlbFJlZkV2ZW50PXRoaXMuX2ZpbmRBbmNlc3RvckV2ZW50KHJlY29yZFR5cGVzLkRlY29kZUxhenlQaXhlbFJlZik7cGFpbnRJbWFnZUV2ZW50PWRlY29kZUxhenlQaXhlbFJlZkV2ZW50JiZ0aGlzLl9wYWludEltYWdlRXZlbnRCeVBpeGVsUmVmSWRbZGVjb2RlTGF6eVBpeGVsUmVmRXZlbnQuYXJnc1snTGF6eVBpeGVsUmVmJ11dO30KaWYoIXBhaW50SW1hZ2VFdmVudCkKYnJlYWs7Y29uc3QgcGFpbnRJbWFnZURhdGE9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQocGFpbnRJbWFnZUV2ZW50KTt0aW1lbGluZURhdGEuYmFja2VuZE5vZGVJZD1wYWludEltYWdlRGF0YS5iYWNrZW5kTm9kZUlkO3RpbWVsaW5lRGF0YS51cmw9cGFpbnRJbWFnZURhdGEudXJsO2JyZWFrO30KY2FzZSByZWNvcmRUeXBlcy5EcmF3TGF6eVBpeGVsUmVmOntjb25zdCBwYWludEltYWdlRXZlbnQ9dGhpcy5fZmluZEFuY2VzdG9yRXZlbnQocmVjb3JkVHlwZXMuUGFpbnRJbWFnZSk7aWYoIXBhaW50SW1hZ2VFdmVudCkKYnJlYWs7dGhpcy5fcGFpbnRJbWFnZUV2ZW50QnlQaXhlbFJlZklkW2V2ZW50LmFyZ3NbJ0xhenlQaXhlbFJlZiddXT1wYWludEltYWdlRXZlbnQ7Y29uc3QgcGFpbnRJbWFnZURhdGE9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQocGFpbnRJbWFnZUV2ZW50KTt0aW1lbGluZURhdGEuYmFja2VuZE5vZGVJZD1wYWludEltYWdlRGF0YS5iYWNrZW5kTm9kZUlkO3RpbWVsaW5lRGF0YS51cmw9cGFpbnRJbWFnZURhdGEudXJsO2JyZWFrO30KY2FzZSByZWNvcmRUeXBlcy5GcmFtZVN0YXJ0ZWRMb2FkaW5nOmlmKHRpbWVsaW5lRGF0YS5mcmFtZUlkIT09ZXZlbnQuYXJnc1snZnJhbWUnXSkKcmV0dXJuIGZhbHNlO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuTWFya0RPTUNvbnRlbnQ6Y2FzZSByZWNvcmRUeXBlcy5NYXJrTG9hZDp7Y29uc3QgZnJhbWVJZD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuZXZlbnRGcmFtZUlkKGV2ZW50KTtpZighdGhpcy5fcGFnZUZyYW1lcy5oYXMoZnJhbWVJZCkpCnJldHVybiBmYWxzZTticmVhazt9CmNhc2UgcmVjb3JkVHlwZXMuQ29tbWl0TG9hZDp7aWYodGhpcy5fYnJvd3NlckZyYW1lVHJhY2tpbmcpCmJyZWFrO2NvbnN0IGZyYW1lSWQ9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLmV2ZW50RnJhbWVJZChldmVudCk7Y29uc3QgaXNNYWluRnJhbWU9ISFldmVudERhdGFbJ2lzTWFpbkZyYW1lJ107Y29uc3QgcGFnZUZyYW1lPXRoaXMuX3BhZ2VGcmFtZXMuZ2V0KGZyYW1lSWQpO2lmKHBhZ2VGcmFtZSl7cGFnZUZyYW1lLnVwZGF0ZShldmVudC5zdGFydFRpbWUsZXZlbnREYXRhKTt9ZWxzZXtpZighdGhpcy5fcGVyc2lzdGVudElkcyl7aWYoZXZlbnREYXRhWydwYWdlJ10mJmV2ZW50RGF0YVsncGFnZSddIT09dGhpcy5fbGVnYWN5Q3VycmVudFBhZ2UpCnJldHVybiBmYWxzZTt9ZWxzZSBpZihpc01haW5GcmFtZSl7cmV0dXJuIGZhbHNlO31lbHNlIGlmKCF0aGlzLl9hZGRQYWdlRnJhbWUoZXZlbnQsZXZlbnREYXRhKSl7cmV0dXJuIGZhbHNlO319CmlmKGlzTWFpbkZyYW1lKQp0aGlzLl9tYWluRnJhbWU9dGhpcy5fcGFnZUZyYW1lcy5nZXQoZnJhbWVJZCk7YnJlYWs7fQpjYXNlIHJlY29yZFR5cGVzLkZpcmVJZGxlQ2FsbGJhY2s6aWYoZXZlbnQuZHVyYXRpb24+ZXZlbnREYXRhWydhbGxvdHRlZE1pbGxpc2Vjb25kcyddK1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UaHJlc2hvbGRzLklkbGVDYWxsYmFja0FkZG9uKQp0aW1lbGluZURhdGEud2FybmluZz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuV2FybmluZ1R5cGUuSWRsZURlYWRsaW5lRXhjZWVkZWQ7YnJlYWs7fQpyZXR1cm4gdHJ1ZTt9Cl9wcm9jZXNzQnJvd3NlckV2ZW50KGV2ZW50KXtpZihldmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuTGF0ZW5jeUluZm9GbG93KXtjb25zdCBmcmFtZUlkPWV2ZW50LmFyZ3NbJ2ZyYW1lVHJlZU5vZGVJZCddO2lmKHR5cGVvZiBmcmFtZUlkPT09J251bWJlcicmJmZyYW1lSWQ9PT10aGlzLl9tYWluRnJhbWVOb2RlSWQpCnRoaXMuX2tub3duSW5wdXRFdmVudHMuYWRkKGV2ZW50LmJpbmRfaWQpO3JldHVybjt9CmlmKGV2ZW50Lmhhc0NhdGVnb3J5KFNESy5UcmFjaW5nTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50Q2F0ZWdvcnkpJiZldmVudC5hcmdzWydkYXRhJ10pe2NvbnN0IGRhdGE9ZXZlbnQuYXJnc1snZGF0YSddO2lmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50LlRyYWNpbmdTdGFydGVkSW5Ccm93c2VyKXtpZighZGF0YVsncGVyc2lzdGVudElkcyddKQpyZXR1cm47dGhpcy5fYnJvd3NlckZyYW1lVHJhY2tpbmc9dHJ1ZTt0aGlzLl9tYWluRnJhbWVOb2RlSWQ9ZGF0YVsnZnJhbWVUcmVlTm9kZUlkJ107Y29uc3QgZnJhbWVzPWRhdGFbJ2ZyYW1lcyddfHxbXTtmcmFtZXMuZm9yRWFjaChwYXlsb2FkPT57Y29uc3QgcGFyZW50PXBheWxvYWRbJ3BhcmVudCddJiZ0aGlzLl9wYWdlRnJhbWVzLmdldChwYXlsb2FkWydwYXJlbnQnXSk7aWYocGF5bG9hZFsncGFyZW50J10mJiFwYXJlbnQpCnJldHVybjtsZXQgZnJhbWU9dGhpcy5fcGFnZUZyYW1lcy5nZXQocGF5bG9hZFsnZnJhbWUnXSk7aWYoIWZyYW1lKXtmcmFtZT1uZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlBhZ2VGcmFtZShwYXlsb2FkKTt0aGlzLl9wYWdlRnJhbWVzLnNldChmcmFtZS5mcmFtZUlkLGZyYW1lKTtpZihwYXJlbnQpCnBhcmVudC5hZGRDaGlsZChmcmFtZSk7ZWxzZQp0aGlzLl9tYWluRnJhbWU9ZnJhbWU7fQpmcmFtZS51cGRhdGUodGhpcy5fbWluaW11bVJlY29yZFRpbWUscGF5bG9hZCk7fSk7cmV0dXJuO30KaWYoZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5EZXZUb29sc01ldGFkYXRhRXZlbnQuRnJhbWVDb21taXR0ZWRJbkJyb3dzZXImJnRoaXMuX2Jyb3dzZXJGcmFtZVRyYWNraW5nKXtsZXQgZnJhbWU9dGhpcy5fcGFnZUZyYW1lcy5nZXQoZGF0YVsnZnJhbWUnXSk7aWYoIWZyYW1lKXtjb25zdCBwYXJlbnQ9ZGF0YVsncGFyZW50J10mJnRoaXMuX3BhZ2VGcmFtZXMuZ2V0KGRhdGFbJ3BhcmVudCddKTtpZighcGFyZW50KQpyZXR1cm47ZnJhbWU9bmV3IFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5QYWdlRnJhbWUoZGF0YSk7dGhpcy5fcGFnZUZyYW1lcy5zZXQoZnJhbWUuZnJhbWVJZCxmcmFtZSk7cGFyZW50LmFkZENoaWxkKGZyYW1lKTt9CmZyYW1lLnVwZGF0ZShldmVudC5zdGFydFRpbWUsZGF0YSk7cmV0dXJuO30KaWYoZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5EZXZUb29sc01ldGFkYXRhRXZlbnQuUHJvY2Vzc1JlYWR5SW5Ccm93c2VyJiZ0aGlzLl9icm93c2VyRnJhbWVUcmFja2luZyl7Y29uc3QgZnJhbWU9dGhpcy5fcGFnZUZyYW1lcy5nZXQoZGF0YVsnZnJhbWUnXSk7aWYoZnJhbWUpCmZyYW1lLnByb2Nlc3NSZWFkeShkYXRhWydwcm9jZXNzUHNldWRvSWQnXSxkYXRhWydwcm9jZXNzSWQnXSk7cmV0dXJuO30KaWYoZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5EZXZUb29sc01ldGFkYXRhRXZlbnQuRnJhbWVEZWxldGVkSW5Ccm93c2VyJiZ0aGlzLl9icm93c2VyRnJhbWVUcmFja2luZyl7Y29uc3QgZnJhbWU9dGhpcy5fcGFnZUZyYW1lcy5nZXQoZGF0YVsnZnJhbWUnXSk7aWYoZnJhbWUpCmZyYW1lLmRlbGV0ZWRUaW1lPWV2ZW50LnN0YXJ0VGltZTtyZXR1cm47fX19Cl9lbnN1cmVOYW1lZFRyYWNrKHR5cGUpe2lmKCF0aGlzLl9uYW1lZFRyYWNrcy5oYXModHlwZSkpe2NvbnN0IHRyYWNrPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2soKTt0cmFjay50eXBlPXR5cGU7dGhpcy5fdHJhY2tzLnB1c2godHJhY2spO3RoaXMuX25hbWVkVHJhY2tzLnNldCh0eXBlLHRyYWNrKTt9CnJldHVybiB0aGlzLl9uYW1lZFRyYWNrcy5nZXQodHlwZSk7fQpfZmluZEFuY2VzdG9yRXZlbnQobmFtZSl7Zm9yKGxldCBpPXRoaXMuX2V2ZW50U3RhY2subGVuZ3RoLTE7aT49MDstLWkpe2NvbnN0IGV2ZW50PXRoaXMuX2V2ZW50U3RhY2tbaV07aWYoZXZlbnQubmFtZT09PW5hbWUpCnJldHVybiBldmVudDt9CnJldHVybiBudWxsO30KX2FkZFBhZ2VGcmFtZShldmVudCxwYXlsb2FkKXtjb25zdCBwYXJlbnQ9cGF5bG9hZFsncGFyZW50J10mJnRoaXMuX3BhZ2VGcmFtZXMuZ2V0KHBheWxvYWRbJ3BhcmVudCddKTtpZihwYXlsb2FkWydwYXJlbnQnXSYmIXBhcmVudCkKcmV0dXJuIGZhbHNlO2NvbnN0IHBhZ2VGcmFtZT1uZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlBhZ2VGcmFtZShwYXlsb2FkKTt0aGlzLl9wYWdlRnJhbWVzLnNldChwYWdlRnJhbWUuZnJhbWVJZCxwYWdlRnJhbWUpO3BhZ2VGcmFtZS51cGRhdGUoZXZlbnQuc3RhcnRUaW1lLHBheWxvYWQpO2lmKHBhcmVudCkKcGFyZW50LmFkZENoaWxkKHBhZ2VGcmFtZSk7cmV0dXJuIHRydWU7fQpfcmVzZXQoKXt0aGlzLl9pc0dlbmVyaWNUcmFjZT1mYWxzZTt0aGlzLl90cmFja3M9W107dGhpcy5fbmFtZWRUcmFja3M9bmV3IE1hcCgpO3RoaXMuX2luc3BlY3RlZFRhcmdldEV2ZW50cz1bXTt0aGlzLl90aW1lTWFya2VyRXZlbnRzPVtdO3RoaXMuX3Nlc3Npb25JZD1udWxsO3RoaXMuX21haW5GcmFtZU5vZGVJZD1udWxsO3RoaXMuX2NwdVByb2ZpbGVzPVtdO3RoaXMuX3dvcmtlcklkQnlUaHJlYWQ9bmV3IFdlYWtNYXAoKTt0aGlzLl9wYWdlRnJhbWVzPW5ldyBNYXAoKTt0aGlzLl9tYWluRnJhbWU9bnVsbDt0aGlzLl9taW5pbXVtUmVjb3JkVGltZT0wO3RoaXMuX21heGltdW1SZWNvcmRUaW1lPTA7fQppc0dlbmVyaWNUcmFjZSgpe3JldHVybiB0aGlzLl9pc0dlbmVyaWNUcmFjZTt9CnRyYWNpbmdNb2RlbCgpe3JldHVybiB0aGlzLl90cmFjaW5nTW9kZWw7fQptaW5pbXVtUmVjb3JkVGltZSgpe3JldHVybiB0aGlzLl9taW5pbXVtUmVjb3JkVGltZTt9Cm1heGltdW1SZWNvcmRUaW1lKCl7cmV0dXJuIHRoaXMuX21heGltdW1SZWNvcmRUaW1lO30KaW5zcGVjdGVkVGFyZ2V0RXZlbnRzKCl7cmV0dXJuIHRoaXMuX2luc3BlY3RlZFRhcmdldEV2ZW50czt9CnRyYWNrcygpe3JldHVybiB0aGlzLl90cmFja3M7fQppc0VtcHR5KCl7cmV0dXJuIHRoaXMubWluaW11bVJlY29yZFRpbWUoKT09PTAmJnRoaXMubWF4aW11bVJlY29yZFRpbWUoKT09PTA7fQp0aW1lTWFya2VyRXZlbnRzKCl7cmV0dXJuIHRoaXMuX3RpbWVNYXJrZXJFdmVudHM7fQpyb290RnJhbWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fcGFnZUZyYW1lcy52YWx1ZXMoKSkuZmlsdGVyKGZyYW1lPT4hZnJhbWUucGFyZW50KTt9CnBhZ2VVUkwoKXtyZXR1cm4gdGhpcy5fbWFpbkZyYW1lJiZ0aGlzLl9tYWluRnJhbWUudXJsfHwnJzt9CnBhZ2VGcmFtZUJ5SWQoZnJhbWVJZCl7cmV0dXJuIGZyYW1lSWQ/dGhpcy5fcGFnZUZyYW1lcy5nZXQoZnJhbWVJZCl8fG51bGw6bnVsbDt9Cm5ldHdvcmtSZXF1ZXN0cygpe2lmKHRoaXMuaXNHZW5lcmljVHJhY2UoKSkKcmV0dXJuW107Y29uc3QgcmVxdWVzdHM9bmV3IE1hcCgpO2NvbnN0IHJlcXVlc3RzTGlzdD1bXTtjb25zdCB6ZXJvU3RhcnRSZXF1ZXN0c0xpc3Q9W107Y29uc3QgdHlwZXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGU7Y29uc3QgcmVzb3VyY2VUeXBlcz1uZXcgU2V0KFt0eXBlcy5SZXNvdXJjZVNlbmRSZXF1ZXN0LHR5cGVzLlJlc291cmNlUmVjZWl2ZVJlc3BvbnNlLHR5cGVzLlJlc291cmNlUmVjZWl2ZWREYXRhLHR5cGVzLlJlc291cmNlRmluaXNoXSk7Y29uc3QgZXZlbnRzPXRoaXMuaW5zcGVjdGVkVGFyZ2V0RXZlbnRzKCk7Zm9yKGxldCBpPTA7aTxldmVudHMubGVuZ3RoOysraSl7Y29uc3QgZT1ldmVudHNbaV07aWYoIXJlc291cmNlVHlwZXMuaGFzKGUubmFtZSkpCmNvbnRpbnVlO2NvbnN0IGlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5nbG9iYWxFdmVudElkKGUsJ3JlcXVlc3RJZCcpO2xldCByZXF1ZXN0PXJlcXVlc3RzLmdldChpZCk7aWYocmVxdWVzdCl7cmVxdWVzdC5hZGRFdmVudChlKTt9ZWxzZXtyZXF1ZXN0PW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuTmV0d29ya1JlcXVlc3QoZSk7cmVxdWVzdHMuc2V0KGlkLHJlcXVlc3QpO2lmKHJlcXVlc3Quc3RhcnRUaW1lKQpyZXF1ZXN0c0xpc3QucHVzaChyZXF1ZXN0KTtlbHNlCnplcm9TdGFydFJlcXVlc3RzTGlzdC5wdXNoKHJlcXVlc3QpO319CnJldHVybiB6ZXJvU3RhcnRSZXF1ZXN0c0xpc3QuY29uY2F0KHJlcXVlc3RzTGlzdCk7fX07VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGU9e1Rhc2s6J1Rhc2snLFByb2dyYW06J1Byb2dyYW0nLEV2ZW50RGlzcGF0Y2g6J0V2ZW50RGlzcGF0Y2gnLEdQVVRhc2s6J0dQVVRhc2snLEFuaW1hdGlvbjonQW5pbWF0aW9uJyxSZXF1ZXN0TWFpblRocmVhZEZyYW1lOidSZXF1ZXN0TWFpblRocmVhZEZyYW1lJyxCZWdpbkZyYW1lOidCZWdpbkZyYW1lJyxOZWVkc0JlZ2luRnJhbWVDaGFuZ2VkOidOZWVkc0JlZ2luRnJhbWVDaGFuZ2VkJyxCZWdpbk1haW5UaHJlYWRGcmFtZTonQmVnaW5NYWluVGhyZWFkRnJhbWUnLEFjdGl2YXRlTGF5ZXJUcmVlOidBY3RpdmF0ZUxheWVyVHJlZScsRHJhd0ZyYW1lOidEcmF3RnJhbWUnLEhpdFRlc3Q6J0hpdFRlc3QnLFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uOidTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbicsUmVjYWxjdWxhdGVTdHlsZXM6J1JlY2FsY3VsYXRlU3R5bGVzJyxVcGRhdGVMYXlvdXRUcmVlOidVcGRhdGVMYXlvdXRUcmVlJyxJbnZhbGlkYXRlTGF5b3V0OidJbnZhbGlkYXRlTGF5b3V0JyxMYXlvdXQ6J0xheW91dCcsVXBkYXRlTGF5ZXI6J1VwZGF0ZUxheWVyJyxVcGRhdGVMYXllclRyZWU6J1VwZGF0ZUxheWVyVHJlZScsUGFpbnRTZXR1cDonUGFpbnRTZXR1cCcsUGFpbnQ6J1BhaW50JyxQYWludEltYWdlOidQYWludEltYWdlJyxSYXN0ZXJpemU6J1Jhc3Rlcml6ZScsUmFzdGVyVGFzazonUmFzdGVyVGFzaycsU2Nyb2xsTGF5ZXI6J1Njcm9sbExheWVyJyxDb21wb3NpdGVMYXllcnM6J0NvbXBvc2l0ZUxheWVycycsU2NoZWR1bGVTdHlsZUludmFsaWRhdGlvblRyYWNraW5nOidTY2hlZHVsZVN0eWxlSW52YWxpZGF0aW9uVHJhY2tpbmcnLFN0eWxlUmVjYWxjSW52YWxpZGF0aW9uVHJhY2tpbmc6J1N0eWxlUmVjYWxjSW52YWxpZGF0aW9uVHJhY2tpbmcnLFN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb25UcmFja2luZzonU3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvblRyYWNraW5nJyxMYXlvdXRJbnZhbGlkYXRpb25UcmFja2luZzonTGF5b3V0SW52YWxpZGF0aW9uVHJhY2tpbmcnLExheWVySW52YWxpZGF0aW9uVHJhY2tpbmc6J0xheWVySW52YWxpZGF0aW9uVHJhY2tpbmcnLFBhaW50SW52YWxpZGF0aW9uVHJhY2tpbmc6J1BhaW50SW52YWxpZGF0aW9uVHJhY2tpbmcnLFNjcm9sbEludmFsaWRhdGlvblRyYWNraW5nOidTY3JvbGxJbnZhbGlkYXRpb25UcmFja2luZycsUGFyc2VIVE1MOidQYXJzZUhUTUwnLFBhcnNlQXV0aG9yU3R5bGVTaGVldDonUGFyc2VBdXRob3JTdHlsZVNoZWV0JyxUaW1lckluc3RhbGw6J1RpbWVySW5zdGFsbCcsVGltZXJSZW1vdmU6J1RpbWVyUmVtb3ZlJyxUaW1lckZpcmU6J1RpbWVyRmlyZScsWEhSUmVhZHlTdGF0ZUNoYW5nZTonWEhSUmVhZHlTdGF0ZUNoYW5nZScsWEhSTG9hZDonWEhSTG9hZCcsQ29tcGlsZVNjcmlwdDondjguY29tcGlsZScsRXZhbHVhdGVTY3JpcHQ6J0V2YWx1YXRlU2NyaXB0JyxDb21waWxlTW9kdWxlOid2OC5jb21waWxlTW9kdWxlJyxFdmFsdWF0ZU1vZHVsZTondjguZXZhbHVhdGVNb2R1bGUnLEZyYW1lU3RhcnRlZExvYWRpbmc6J0ZyYW1lU3RhcnRlZExvYWRpbmcnLENvbW1pdExvYWQ6J0NvbW1pdExvYWQnLE1hcmtMb2FkOidNYXJrTG9hZCcsTWFya0RPTUNvbnRlbnQ6J01hcmtET01Db250ZW50JyxNYXJrRmlyc3RQYWludDonTWFya0ZpcnN0UGFpbnQnLE1hcmtGQ1A6J2ZpcnN0Q29udGVudGZ1bFBhaW50JyxNYXJrRk1QOidmaXJzdE1lYW5pbmdmdWxQYWludCcsTWFya0ZNUENhbmRpZGF0ZTonZmlyc3RNZWFuaW5nZnVsUGFpbnRDYW5kaWRhdGUnLFRpbWVTdGFtcDonVGltZVN0YW1wJyxDb25zb2xlVGltZTonQ29uc29sZVRpbWUnLFVzZXJUaW1pbmc6J1VzZXJUaW1pbmcnLFJlc291cmNlU2VuZFJlcXVlc3Q6J1Jlc291cmNlU2VuZFJlcXVlc3QnLFJlc291cmNlUmVjZWl2ZVJlc3BvbnNlOidSZXNvdXJjZVJlY2VpdmVSZXNwb25zZScsUmVzb3VyY2VSZWNlaXZlZERhdGE6J1Jlc291cmNlUmVjZWl2ZWREYXRhJyxSZXNvdXJjZUZpbmlzaDonUmVzb3VyY2VGaW5pc2gnLFJ1bk1pY3JvdGFza3M6J1J1bk1pY3JvdGFza3MnLEZ1bmN0aW9uQ2FsbDonRnVuY3Rpb25DYWxsJyxHQ0V2ZW50OidHQ0V2ZW50JyxNYWpvckdDOidNYWpvckdDJyxNaW5vckdDOidNaW5vckdDJyxKU0ZyYW1lOidKU0ZyYW1lJyxKU1NhbXBsZTonSlNTYW1wbGUnLFY4U2FtcGxlOidWOFNhbXBsZScsSml0Q29kZUFkZGVkOidKaXRDb2RlQWRkZWQnLEppdENvZGVNb3ZlZDonSml0Q29kZU1vdmVkJyxQYXJzZVNjcmlwdE9uQmFja2dyb3VuZDondjgucGFyc2VPbkJhY2tncm91bmQnLFY4RXhlY3V0ZTonVjguRXhlY3V0ZScsVXBkYXRlQ291bnRlcnM6J1VwZGF0ZUNvdW50ZXJzJyxSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6J1JlcXVlc3RBbmltYXRpb25GcmFtZScsQ2FuY2VsQW5pbWF0aW9uRnJhbWU6J0NhbmNlbEFuaW1hdGlvbkZyYW1lJyxGaXJlQW5pbWF0aW9uRnJhbWU6J0ZpcmVBbmltYXRpb25GcmFtZScsUmVxdWVzdElkbGVDYWxsYmFjazonUmVxdWVzdElkbGVDYWxsYmFjaycsQ2FuY2VsSWRsZUNhbGxiYWNrOidDYW5jZWxJZGxlQ2FsbGJhY2snLEZpcmVJZGxlQ2FsbGJhY2s6J0ZpcmVJZGxlQ2FsbGJhY2snLFdlYlNvY2tldENyZWF0ZTonV2ViU29ja2V0Q3JlYXRlJyxXZWJTb2NrZXRTZW5kSGFuZHNoYWtlUmVxdWVzdDonV2ViU29ja2V0U2VuZEhhbmRzaGFrZVJlcXVlc3QnLFdlYlNvY2tldFJlY2VpdmVIYW5kc2hha2VSZXNwb25zZTonV2ViU29ja2V0UmVjZWl2ZUhhbmRzaGFrZVJlc3BvbnNlJyxXZWJTb2NrZXREZXN0cm95OidXZWJTb2NrZXREZXN0cm95JyxFbWJlZGRlckNhbGxiYWNrOidFbWJlZGRlckNhbGxiYWNrJyxTZXRMYXllclRyZWVJZDonU2V0TGF5ZXJUcmVlSWQnLFRyYWNpbmdTdGFydGVkSW5QYWdlOidUcmFjaW5nU3RhcnRlZEluUGFnZScsVHJhY2luZ1Nlc3Npb25JZEZvcldvcmtlcjonVHJhY2luZ1Nlc3Npb25JZEZvcldvcmtlcicsRGVjb2RlSW1hZ2U6J0RlY29kZSBJbWFnZScsUmVzaXplSW1hZ2U6J1Jlc2l6ZSBJbWFnZScsRHJhd0xhenlQaXhlbFJlZjonRHJhdyBMYXp5UGl4ZWxSZWYnLERlY29kZUxhenlQaXhlbFJlZjonRGVjb2RlIExhenlQaXhlbFJlZicsTGF6eVBpeGVsUmVmOidMYXp5UGl4ZWxSZWYnLExheWVyVHJlZUhvc3RJbXBsU25hcHNob3Q6J2NjOjpMYXllclRyZWVIb3N0SW1wbCcsUGljdHVyZVNuYXBzaG90OidjYzo6UGljdHVyZScsRGlzcGxheUl0ZW1MaXN0U25hcHNob3Q6J2NjOjpEaXNwbGF5SXRlbUxpc3QnLExhdGVuY3lJbmZvOidMYXRlbmN5SW5mbycsTGF0ZW5jeUluZm9GbG93OidMYXRlbmN5SW5mby5GbG93JyxJbnB1dExhdGVuY3lNb3VzZU1vdmU6J0lucHV0TGF0ZW5jeTo6TW91c2VNb3ZlJyxJbnB1dExhdGVuY3lNb3VzZVdoZWVsOidJbnB1dExhdGVuY3k6Ok1vdXNlV2hlZWwnLEltcGxTaWRlRmxpbmc6J0lucHV0SGFuZGxlclByb3h5OjpIYW5kbGVHZXN0dXJlRmxpbmc6OnN0YXJ0ZWQnLEdDSWRsZUxhenlTd2VlcDonVGhyZWFkU3RhdGU6OnBlcmZvcm1JZGxlTGF6eVN3ZWVwJyxHQ0NvbXBsZXRlU3dlZXA6J1RocmVhZFN0YXRlOjpjb21wbGV0ZVN3ZWVwJyxHQ0NvbGxlY3RHYXJiYWdlOidCbGlua0dDTWFya2luZycsQ3J5cHRvRG9FbmNyeXB0OidEb0VuY3J5cHQnLENyeXB0b0RvRW5jcnlwdFJlcGx5OidEb0VuY3J5cHRSZXBseScsQ3J5cHRvRG9EZWNyeXB0OidEb0RlY3J5cHQnLENyeXB0b0RvRGVjcnlwdFJlcGx5OidEb0RlY3J5cHRSZXBseScsQ3J5cHRvRG9EaWdlc3Q6J0RvRGlnZXN0JyxDcnlwdG9Eb0RpZ2VzdFJlcGx5OidEb0RpZ2VzdFJlcGx5JyxDcnlwdG9Eb1NpZ246J0RvU2lnbicsQ3J5cHRvRG9TaWduUmVwbHk6J0RvU2lnblJlcGx5JyxDcnlwdG9Eb1ZlcmlmeTonRG9WZXJpZnknLENyeXB0b0RvVmVyaWZ5UmVwbHk6J0RvVmVyaWZ5UmVwbHknLENwdVByb2ZpbGU6J0NwdVByb2ZpbGUnLFByb2ZpbGU6J1Byb2ZpbGUnLEFzeW5jVGFzazonQXN5bmNUYXNrJyx9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeT17Q29uc29sZTonYmxpbmsuY29uc29sZScsVXNlclRpbWluZzonYmxpbmsudXNlcl90aW1pbmcnLExhdGVuY3lJbmZvOidsYXRlbmN5SW5mbyd9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5XYXJuaW5nVHlwZT17Rm9yY2VkU3R5bGU6J0ZvcmNlZFN0eWxlJyxGb3JjZWRMYXlvdXQ6J0ZvcmNlZExheW91dCcsSWRsZURlYWRsaW5lRXhjZWVkZWQ6J0lkbGVEZWFkbGluZUV4Y2VlZGVkJyxMb25nSGFuZGxlcjonTG9uZ0hhbmRsZXInLExvbmdSZWN1cnJpbmdIYW5kbGVyOidMb25nUmVjdXJyaW5nSGFuZGxlcicsVjhEZW9wdDonVjhEZW9wdCd9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5Xb3JrZXJUaHJlYWROYW1lPSdEZWRpY2F0ZWRXb3JrZXIgdGhyZWFkJztUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuV29ya2VyVGhyZWFkTmFtZUxlZ2FjeT0nRGVkaWNhdGVkV29ya2VyIFRocmVhZCc7VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlbmRlcmVyTWFpblRocmVhZE5hbWU9J0NyUmVuZGVyZXJNYWluJztUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQnJvd3Nlck1haW5UaHJlYWROYW1lPSdDckJyb3dzZXJNYWluJztUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50PXtUcmFjaW5nU3RhcnRlZEluQnJvd3NlcjonVHJhY2luZ1N0YXJ0ZWRJbkJyb3dzZXInLFRyYWNpbmdTdGFydGVkSW5QYWdlOidUcmFjaW5nU3RhcnRlZEluUGFnZScsVHJhY2luZ1Nlc3Npb25JZEZvcldvcmtlcjonVHJhY2luZ1Nlc3Npb25JZEZvcldvcmtlcicsRnJhbWVDb21taXR0ZWRJbkJyb3dzZXI6J0ZyYW1lQ29tbWl0dGVkSW5Ccm93c2VyJyxQcm9jZXNzUmVhZHlJbkJyb3dzZXI6J1Byb2Nlc3NSZWFkeUluQnJvd3NlcicsRnJhbWVEZWxldGVkSW5Ccm93c2VyOidGcmFtZURlbGV0ZWRJbkJyb3dzZXInLH07VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRocmVzaG9sZHM9e0hhbmRsZXI6MTUwLFJlY3VycmluZ0hhbmRsZXI6NTAsRm9yY2VkTGF5b3V0OjMwLElkbGVDYWxsYmFja0FkZG9uOjV9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFjaz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubmFtZT0nJzt0aGlzLnR5cGU9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5PdGhlcjt0aGlzLmZvck1haW5GcmFtZT1mYWxzZTt0aGlzLnVybD0nJzt0aGlzLmV2ZW50cz1bXTt0aGlzLmFzeW5jRXZlbnRzPVtdO3RoaXMudGFza3M9W107dGhpcy5fc3luY0V2ZW50cz1udWxsO3RoaXMudGhyZWFkPW51bGw7fQpzeW5jRXZlbnRzKCl7aWYodGhpcy5ldmVudHMubGVuZ3RoKQpyZXR1cm4gdGhpcy5ldmVudHM7aWYodGhpcy5fc3luY0V2ZW50cykKcmV0dXJuIHRoaXMuX3N5bmNFdmVudHM7Y29uc3Qgc3RhY2s9W107dGhpcy5fc3luY0V2ZW50cz1bXTtmb3IoY29uc3QgZXZlbnQgb2YgdGhpcy5hc3luY0V2ZW50cyl7Y29uc3Qgc3RhcnRUaW1lPWV2ZW50LnN0YXJ0VGltZTtjb25zdCBlbmRUaW1lPWV2ZW50LmVuZFRpbWU7d2hpbGUoc3RhY2subGVuZ3RoJiZzdGFydFRpbWU+PXN0YWNrLnBlZWtMYXN0KCkuZW5kVGltZSkKc3RhY2sucG9wKCk7aWYoc3RhY2subGVuZ3RoJiZlbmRUaW1lPnN0YWNrLnBlZWtMYXN0KCkuZW5kVGltZSl7dGhpcy5fc3luY0V2ZW50cz1bXTticmVhazt9CmNvbnN0IHN5bmNFdmVudD1uZXcgU0RLLlRyYWNpbmdNb2RlbC5FdmVudChldmVudC5jYXRlZ29yaWVzU3RyaW5nLGV2ZW50Lm5hbWUsU0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5Db21wbGV0ZSxzdGFydFRpbWUsZXZlbnQudGhyZWFkKTtzeW5jRXZlbnQuc2V0RW5kVGltZShlbmRUaW1lKTtzeW5jRXZlbnQuYWRkQXJncyhldmVudC5hcmdzKTt0aGlzLl9zeW5jRXZlbnRzLnB1c2goc3luY0V2ZW50KTtzdGFjay5wdXNoKHN5bmNFdmVudCk7fQpyZXR1cm4gdGhpcy5fc3luY0V2ZW50czt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlPXtNYWluVGhyZWFkOlN5bWJvbCgnTWFpblRocmVhZCcpLFdvcmtlcjpTeW1ib2woJ1dvcmtlcicpLElucHV0OlN5bWJvbCgnSW5wdXQnKSxBbmltYXRpb246U3ltYm9sKCdBbmltYXRpb24nKSxVc2VyVGltaW5nOlN5bWJvbCgnVXNlclRpbWluZycpLENvbnNvbGU6U3ltYm9sKCdDb25zb2xlJyksUmFzdGVyOlN5bWJvbCgnUmFzdGVyJyksR1BVOlN5bWJvbCgnR1BVJyksT3RoZXI6U3ltYm9sKCdPdGhlcicpLH07VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlBhZ2VGcmFtZT1jbGFzc3tjb25zdHJ1Y3RvcihwYXlsb2FkKXt0aGlzLmZyYW1lSWQ9cGF5bG9hZFsnZnJhbWUnXTt0aGlzLnVybD1wYXlsb2FkWyd1cmwnXXx8Jyc7dGhpcy5uYW1lPXBheWxvYWRbJ25hbWUnXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMucGFyZW50PW51bGw7dGhpcy5wcm9jZXNzZXM9W107dGhpcy5kZWxldGVkVGltZT1udWxsO3RoaXMub3duZXJOb2RlPW51bGw7fQp1cGRhdGUodGltZSxwYXlsb2FkKXt0aGlzLnVybD1wYXlsb2FkWyd1cmwnXXx8Jyc7dGhpcy5uYW1lPXBheWxvYWRbJ25hbWUnXTtpZihwYXlsb2FkWydwcm9jZXNzSWQnXSl7dGhpcy5wcm9jZXNzZXMucHVzaCh7dGltZTp0aW1lLHByb2Nlc3NJZDpwYXlsb2FkWydwcm9jZXNzSWQnXSxwcm9jZXNzUHNldWRvSWQ6JycsdXJsOnBheWxvYWRbJ3VybCddfHwnJ30pO31lbHNle3RoaXMucHJvY2Vzc2VzLnB1c2goe3RpbWU6dGltZSxwcm9jZXNzSWQ6LTEscHJvY2Vzc1BzZXVkb0lkOnBheWxvYWRbJ3Byb2Nlc3NQc2V1ZG9JZCddLHVybDpwYXlsb2FkWyd1cmwnXXx8Jyd9KTt9fQpwcm9jZXNzUmVhZHkocHJvY2Vzc1BzZXVkb0lkLHByb2Nlc3NJZCl7Zm9yKGNvbnN0IHByb2Nlc3Mgb2YgdGhpcy5wcm9jZXNzZXMpe2lmKHByb2Nlc3MucHJvY2Vzc1BzZXVkb0lkPT09cHJvY2Vzc1BzZXVkb0lkKXtwcm9jZXNzLnByb2Nlc3NQc2V1ZG9JZD0nJztwcm9jZXNzLnByb2Nlc3NJZD1wcm9jZXNzSWQ7fX19CmFkZENoaWxkKGNoaWxkKXt0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO2NoaWxkLnBhcmVudD10aGlzO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5NZXRhZGF0YUV2ZW50cztUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuTmV0d29ya1JlcXVlc3Q9Y2xhc3N7Y29uc3RydWN0b3IoZXZlbnQpe3RoaXMuc3RhcnRUaW1lPWV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5SZXNvdXJjZVNlbmRSZXF1ZXN0P2V2ZW50LnN0YXJ0VGltZTowO3RoaXMuZW5kVGltZT1JbmZpbml0eTt0aGlzLmVuY29kZWREYXRhTGVuZ3RoPTA7dGhpcy5kZWNvZGVkQm9keUxlbmd0aD0wO3RoaXMuY2hpbGRyZW49W107dGhpcy50aW1pbmc7dGhpcy5taW1lVHlwZTt0aGlzLnVybDt0aGlzLnJlcXVlc3RNZXRob2Q7dGhpcy5hZGRFdmVudChldmVudCk7fQphZGRFdmVudChldmVudCl7dGhpcy5jaGlsZHJlbi5wdXNoKGV2ZW50KTtjb25zdCByZWNvcmRUeXBlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO3RoaXMuc3RhcnRUaW1lPU1hdGgubWluKHRoaXMuc3RhcnRUaW1lLGV2ZW50LnN0YXJ0VGltZSk7Y29uc3QgZXZlbnREYXRhPWV2ZW50LmFyZ3NbJ2RhdGEnXTtpZihldmVudERhdGFbJ21pbWVUeXBlJ10pCnRoaXMubWltZVR5cGU9ZXZlbnREYXRhWydtaW1lVHlwZSddO2lmKCdwcmlvcml0eSdpbiBldmVudERhdGEpCnRoaXMucHJpb3JpdHk9ZXZlbnREYXRhWydwcmlvcml0eSddO2lmKGV2ZW50Lm5hbWU9PT1yZWNvcmRUeXBlLlJlc291cmNlRmluaXNoKQp0aGlzLmVuZFRpbWU9ZXZlbnQuc3RhcnRUaW1lO2lmKGV2ZW50RGF0YVsnZmluaXNoVGltZSddKQp0aGlzLmZpbmlzaFRpbWU9ZXZlbnREYXRhWydmaW5pc2hUaW1lJ10qMTAwMDtpZighdGhpcy5yZXNwb25zZVRpbWUmJihldmVudC5uYW1lPT09cmVjb3JkVHlwZS5SZXNvdXJjZVJlY2VpdmVSZXNwb25zZXx8ZXZlbnQubmFtZT09PXJlY29yZFR5cGUuUmVzb3VyY2VSZWNlaXZlZERhdGEpKQp0aGlzLnJlc3BvbnNlVGltZT1ldmVudC5zdGFydFRpbWU7Y29uc3QgZW5jb2RlZERhdGFMZW5ndGg9ZXZlbnREYXRhWydlbmNvZGVkRGF0YUxlbmd0aCddfHwwO2lmKGV2ZW50Lm5hbWU9PT1yZWNvcmRUeXBlLlJlc291cmNlUmVjZWl2ZVJlc3BvbnNlKXtpZihldmVudERhdGFbJ2Zyb21DYWNoZSddKQp0aGlzLmZyb21DYWNoZT10cnVlO2lmKGV2ZW50RGF0YVsnZnJvbVNlcnZpY2VXb3JrZXInXSkKdGhpcy5mcm9tU2VydmljZVdvcmtlcj10cnVlO3RoaXMuZW5jb2RlZERhdGFMZW5ndGg9ZW5jb2RlZERhdGFMZW5ndGg7fQppZihldmVudC5uYW1lPT09cmVjb3JkVHlwZS5SZXNvdXJjZVJlY2VpdmVkRGF0YSkKdGhpcy5lbmNvZGVkRGF0YUxlbmd0aCs9ZW5jb2RlZERhdGFMZW5ndGg7aWYoZXZlbnQubmFtZT09PXJlY29yZFR5cGUuUmVzb3VyY2VGaW5pc2gmJmVuY29kZWREYXRhTGVuZ3RoKQp0aGlzLmVuY29kZWREYXRhTGVuZ3RoPWVuY29kZWREYXRhTGVuZ3RoO2NvbnN0IGRlY29kZWRCb2R5TGVuZ3RoPWV2ZW50RGF0YVsnZGVjb2RlZEJvZHlMZW5ndGgnXTtpZihldmVudC5uYW1lPT09cmVjb3JkVHlwZS5SZXNvdXJjZUZpbmlzaCYmZGVjb2RlZEJvZHlMZW5ndGgpCnRoaXMuZGVjb2RlZEJvZHlMZW5ndGg9ZGVjb2RlZEJvZHlMZW5ndGg7aWYoIXRoaXMudXJsKQp0aGlzLnVybD1ldmVudERhdGFbJ3VybCddO2lmKCF0aGlzLnJlcXVlc3RNZXRob2QpCnRoaXMucmVxdWVzdE1ldGhvZD1ldmVudERhdGFbJ3JlcXVlc3RNZXRob2QnXTtpZighdGhpcy50aW1pbmcpCnRoaXMudGltaW5nPWV2ZW50RGF0YVsndGltaW5nJ107aWYoZXZlbnREYXRhWydmcm9tU2VydmljZVdvcmtlciddKQp0aGlzLmZyb21TZXJ2aWNlV29ya2VyPXRydWU7fQpiZWdpblRpbWUoKXtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGFydFRpbWUsdGhpcy50aW1pbmcmJnRoaXMudGltaW5nLnB1c2hTdGFydCoxMDAwfHxJbmZpbml0eSk7fX07VGltZWxpbmVNb2RlbC5JbnZhbGlkYXRpb25UcmFja2luZ0V2ZW50PWNsYXNze2NvbnN0cnVjdG9yKGV2ZW50KXt0aGlzLnR5cGU9ZXZlbnQubmFtZTt0aGlzLnN0YXJ0VGltZT1ldmVudC5zdGFydFRpbWU7dGhpcy5fdHJhY2luZ0V2ZW50PWV2ZW50O2NvbnN0IGV2ZW50RGF0YT1ldmVudC5hcmdzWydkYXRhJ107dGhpcy5mcmFtZT1ldmVudERhdGFbJ2ZyYW1lJ107dGhpcy5ub2RlSWQ9ZXZlbnREYXRhWydub2RlSWQnXTt0aGlzLm5vZGVOYW1lPWV2ZW50RGF0YVsnbm9kZU5hbWUnXTt0aGlzLnBhaW50SWQ9ZXZlbnREYXRhWydwYWludElkJ107dGhpcy5pbnZhbGlkYXRpb25TZXQ9ZXZlbnREYXRhWydpbnZhbGlkYXRpb25TZXQnXTt0aGlzLmludmFsaWRhdGVkU2VsZWN0b3JJZD1ldmVudERhdGFbJ2ludmFsaWRhdGVkU2VsZWN0b3JJZCddO3RoaXMuY2hhbmdlZElkPWV2ZW50RGF0YVsnY2hhbmdlZElkJ107dGhpcy5jaGFuZ2VkQ2xhc3M9ZXZlbnREYXRhWydjaGFuZ2VkQ2xhc3MnXTt0aGlzLmNoYW5nZWRBdHRyaWJ1dGU9ZXZlbnREYXRhWydjaGFuZ2VkQXR0cmlidXRlJ107dGhpcy5jaGFuZ2VkUHNldWRvPWV2ZW50RGF0YVsnY2hhbmdlZFBzZXVkbyddO3RoaXMuc2VsZWN0b3JQYXJ0PWV2ZW50RGF0YVsnc2VsZWN0b3JQYXJ0J107dGhpcy5leHRyYURhdGE9ZXZlbnREYXRhWydleHRyYURhdGEnXTt0aGlzLmludmFsaWRhdGlvbkxpc3Q9ZXZlbnREYXRhWydpbnZhbGlkYXRpb25MaXN0J107dGhpcy5jYXVzZT17cmVhc29uOmV2ZW50RGF0YVsncmVhc29uJ10sc3RhY2tUcmFjZTpldmVudERhdGFbJ3N0YWNrVHJhY2UnXX07aWYoIXRoaXMuY2F1c2UucmVhc29uJiZ0aGlzLmNhdXNlLnN0YWNrVHJhY2UmJnRoaXMudHlwZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkxheW91dEludmFsaWRhdGlvblRyYWNraW5nKQp0aGlzLmNhdXNlLnJlYXNvbj0nTGF5b3V0IGZvcmNlZCc7fX07VGltZWxpbmVNb2RlbC5JbnZhbGlkYXRpb25DYXVzZTtUaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNrZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9sYXN0UmVjYWxjU3R5bGU9bnVsbDt0aGlzLl9sYXN0UGFpbnRXaXRoTGF5ZXI9bnVsbDt0aGlzLl9kaWRQYWludD1mYWxzZTt0aGlzLl9pbml0aWFsaXplUGVyRnJhbWVTdGF0ZSgpO30Kc3RhdGljIGludmFsaWRhdGlvbkV2ZW50c0ZvcihldmVudCl7cmV0dXJuIGV2ZW50W1RpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5faW52YWxpZGF0aW9uVHJhY2tpbmdFdmVudHNTeW1ib2xdfHxudWxsO30KYWRkSW52YWxpZGF0aW9uKGludmFsaWRhdGlvbil7dGhpcy5fc3RhcnROZXdGcmFtZUlmTmVlZGVkKCk7aWYoIWludmFsaWRhdGlvbi5ub2RlSWQmJiFpbnZhbGlkYXRpb24ucGFpbnRJZCl7Y29uc29sZS5lcnJvcignSW52YWxpZGF0aW9uIGxhY2tzIG5vZGUgaW5mb3JtYXRpb24uJyk7Y29uc29sZS5lcnJvcihpbnZhbGlkYXRpb24pO3JldHVybjt9CmNvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2lmKGludmFsaWRhdGlvbi50eXBlPT09cmVjb3JkVHlwZXMuUGFpbnRJbnZhbGlkYXRpb25UcmFja2luZyYmaW52YWxpZGF0aW9uLm5vZGVJZCl7Y29uc3QgaW52YWxpZGF0aW9ucz10aGlzLl9pbnZhbGlkYXRpb25zQnlOb2RlSWRbaW52YWxpZGF0aW9uLm5vZGVJZF18fFtdO2ZvcihsZXQgaT0wO2k8aW52YWxpZGF0aW9ucy5sZW5ndGg7KytpKQppbnZhbGlkYXRpb25zW2ldLnBhaW50SWQ9aW52YWxpZGF0aW9uLnBhaW50SWQ7cmV0dXJuO30KaWYoaW52YWxpZGF0aW9uLnR5cGU9PT1yZWNvcmRUeXBlcy5TdHlsZVJlY2FsY0ludmFsaWRhdGlvblRyYWNraW5nJiZpbnZhbGlkYXRpb24uY2F1c2UucmVhc29uPT09J1N0eWxlSW52YWxpZGF0b3InKQpyZXR1cm47Y29uc3Qgc3R5bGVSZWNhbGNJbnZhbGlkYXRpb249KGludmFsaWRhdGlvbi50eXBlPT09cmVjb3JkVHlwZXMuU2NoZWR1bGVTdHlsZUludmFsaWRhdGlvblRyYWNraW5nfHxpbnZhbGlkYXRpb24udHlwZT09PXJlY29yZFR5cGVzLlN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb25UcmFja2luZ3x8aW52YWxpZGF0aW9uLnR5cGU9PT1yZWNvcmRUeXBlcy5TdHlsZVJlY2FsY0ludmFsaWRhdGlvblRyYWNraW5nKTtpZihzdHlsZVJlY2FsY0ludmFsaWRhdGlvbil7Y29uc3QgZHVyaW5nUmVjYWxjU3R5bGU9aW52YWxpZGF0aW9uLnN0YXJ0VGltZSYmdGhpcy5fbGFzdFJlY2FsY1N0eWxlJiZpbnZhbGlkYXRpb24uc3RhcnRUaW1lPj10aGlzLl9sYXN0UmVjYWxjU3R5bGUuc3RhcnRUaW1lJiZpbnZhbGlkYXRpb24uc3RhcnRUaW1lPD10aGlzLl9sYXN0UmVjYWxjU3R5bGUuZW5kVGltZTtpZihkdXJpbmdSZWNhbGNTdHlsZSkKdGhpcy5fYXNzb2NpYXRlV2l0aExhc3RSZWNhbGNTdHlsZUV2ZW50KGludmFsaWRhdGlvbik7fQppZih0aGlzLl9pbnZhbGlkYXRpb25zW2ludmFsaWRhdGlvbi50eXBlXSkKdGhpcy5faW52YWxpZGF0aW9uc1tpbnZhbGlkYXRpb24udHlwZV0ucHVzaChpbnZhbGlkYXRpb24pO2Vsc2UKdGhpcy5faW52YWxpZGF0aW9uc1tpbnZhbGlkYXRpb24udHlwZV09W2ludmFsaWRhdGlvbl07aWYoaW52YWxpZGF0aW9uLm5vZGVJZCl7aWYodGhpcy5faW52YWxpZGF0aW9uc0J5Tm9kZUlkW2ludmFsaWRhdGlvbi5ub2RlSWRdKQp0aGlzLl9pbnZhbGlkYXRpb25zQnlOb2RlSWRbaW52YWxpZGF0aW9uLm5vZGVJZF0ucHVzaChpbnZhbGlkYXRpb24pO2Vsc2UKdGhpcy5faW52YWxpZGF0aW9uc0J5Tm9kZUlkW2ludmFsaWRhdGlvbi5ub2RlSWRdPVtpbnZhbGlkYXRpb25dO319CmRpZFJlY2FsY1N0eWxlKHJlY2FsY1N0eWxlRXZlbnQpe3RoaXMuX2xhc3RSZWNhbGNTdHlsZT1yZWNhbGNTdHlsZUV2ZW50O2NvbnN0IHR5cGVzPVtUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5TY2hlZHVsZVN0eWxlSW52YWxpZGF0aW9uVHJhY2tpbmcsVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuU3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvblRyYWNraW5nLFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLlN0eWxlUmVjYWxjSW52YWxpZGF0aW9uVHJhY2tpbmddO2Zvcihjb25zdCBpbnZhbGlkYXRpb24gb2YgdGhpcy5faW52YWxpZGF0aW9uc09mVHlwZXModHlwZXMpKQp0aGlzLl9hc3NvY2lhdGVXaXRoTGFzdFJlY2FsY1N0eWxlRXZlbnQoaW52YWxpZGF0aW9uKTt9Cl9hc3NvY2lhdGVXaXRoTGFzdFJlY2FsY1N0eWxlRXZlbnQoaW52YWxpZGF0aW9uKXtpZihpbnZhbGlkYXRpb24ubGlua2VkUmVjYWxjU3R5bGVFdmVudCkKcmV0dXJuO2NvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2NvbnN0IHJlY2FsY1N0eWxlRnJhbWVJZD10aGlzLl9sYXN0UmVjYWxjU3R5bGUuYXJnc1snYmVnaW5EYXRhJ11bJ2ZyYW1lJ107aWYoaW52YWxpZGF0aW9uLnR5cGU9PT1yZWNvcmRUeXBlcy5TdHlsZUludmFsaWRhdG9ySW52YWxpZGF0aW9uVHJhY2tpbmcpe3RoaXMuX2FkZFN5bnRoZXRpY1N0eWxlUmVjYWxjSW52YWxpZGF0aW9ucyh0aGlzLl9sYXN0UmVjYWxjU3R5bGUscmVjYWxjU3R5bGVGcmFtZUlkLGludmFsaWRhdGlvbik7fWVsc2UgaWYoaW52YWxpZGF0aW9uLnR5cGU9PT1yZWNvcmRUeXBlcy5TY2hlZHVsZVN0eWxlSW52YWxpZGF0aW9uVHJhY2tpbmcpe31lbHNle3RoaXMuX2FkZEludmFsaWRhdGlvblRvRXZlbnQodGhpcy5fbGFzdFJlY2FsY1N0eWxlLHJlY2FsY1N0eWxlRnJhbWVJZCxpbnZhbGlkYXRpb24pO30KaW52YWxpZGF0aW9uLmxpbmtlZFJlY2FsY1N0eWxlRXZlbnQ9dHJ1ZTt9Cl9hZGRTeW50aGV0aWNTdHlsZVJlY2FsY0ludmFsaWRhdGlvbnMoZXZlbnQsZnJhbWVJZCxzdHlsZUludmFsaWRhdG9ySW52YWxpZGF0aW9uKXtpZighc3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvbi5pbnZhbGlkYXRpb25MaXN0KXt0aGlzLl9hZGRTeW50aGV0aWNTdHlsZVJlY2FsY0ludmFsaWRhdGlvbihzdHlsZUludmFsaWRhdG9ySW52YWxpZGF0aW9uLl90cmFjaW5nRXZlbnQsc3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvbik7cmV0dXJuO30KaWYoIXN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24ubm9kZUlkKXtjb25zb2xlLmVycm9yKCdJbnZhbGlkYXRpb24gbGFja3Mgbm9kZSBpbmZvcm1hdGlvbi4nKTtjb25zb2xlLmVycm9yKHN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24pO3JldHVybjt9CmZvcihsZXQgaT0wO2k8c3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvbi5pbnZhbGlkYXRpb25MaXN0Lmxlbmd0aDtpKyspe2NvbnN0IHNldElkPXN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24uaW52YWxpZGF0aW9uTGlzdFtpXVsnaWQnXTtsZXQgbGFzdFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uO2NvbnN0IG5vZGVJbnZhbGlkYXRpb25zPXRoaXMuX2ludmFsaWRhdGlvbnNCeU5vZGVJZFtzdHlsZUludmFsaWRhdG9ySW52YWxpZGF0aW9uLm5vZGVJZF18fFtdO2ZvcihsZXQgaj0wO2o8bm9kZUludmFsaWRhdGlvbnMubGVuZ3RoO2orKyl7Y29uc3QgaW52YWxpZGF0aW9uPW5vZGVJbnZhbGlkYXRpb25zW2pdO2lmKGludmFsaWRhdGlvbi5mcmFtZSE9PWZyYW1lSWR8fGludmFsaWRhdGlvbi5pbnZhbGlkYXRpb25TZXQhPT1zZXRJZHx8aW52YWxpZGF0aW9uLnR5cGUhPT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5TY2hlZHVsZVN0eWxlSW52YWxpZGF0aW9uVHJhY2tpbmcpCmNvbnRpbnVlO2xhc3RTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbj1pbnZhbGlkYXRpb247fQppZighbGFzdFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKXtjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9va3VwIHRoZSBldmVudCB0aGF0IHNjaGVkdWxlZCBhIHN0eWxlIGludmFsaWRhdG9yIGludmFsaWRhdGlvbi4nKTtjb250aW51ZTt9CnRoaXMuX2FkZFN5bnRoZXRpY1N0eWxlUmVjYWxjSW52YWxpZGF0aW9uKGxhc3RTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbi5fdHJhY2luZ0V2ZW50LHN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24pO319Cl9hZGRTeW50aGV0aWNTdHlsZVJlY2FsY0ludmFsaWRhdGlvbihiYXNlRXZlbnQsc3R5bGVJbnZhbGlkYXRvckludmFsaWRhdGlvbil7Y29uc3QgaW52YWxpZGF0aW9uPW5ldyBUaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNraW5nRXZlbnQoYmFzZUV2ZW50KTtpbnZhbGlkYXRpb24udHlwZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5TdHlsZVJlY2FsY0ludmFsaWRhdGlvblRyYWNraW5nO2lmKHN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24uY2F1c2UucmVhc29uKQppbnZhbGlkYXRpb24uY2F1c2UucmVhc29uPXN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24uY2F1c2UucmVhc29uO2lmKHN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24uc2VsZWN0b3JQYXJ0KQppbnZhbGlkYXRpb24uc2VsZWN0b3JQYXJ0PXN0eWxlSW52YWxpZGF0b3JJbnZhbGlkYXRpb24uc2VsZWN0b3JQYXJ0O3RoaXMuYWRkSW52YWxpZGF0aW9uKGludmFsaWRhdGlvbik7aWYoIWludmFsaWRhdGlvbi5saW5rZWRSZWNhbGNTdHlsZUV2ZW50KQp0aGlzLl9hc3NvY2lhdGVXaXRoTGFzdFJlY2FsY1N0eWxlRXZlbnQoaW52YWxpZGF0aW9uKTt9CmRpZExheW91dChsYXlvdXRFdmVudCl7Y29uc3QgbGF5b3V0RnJhbWVJZD1sYXlvdXRFdmVudC5hcmdzWydiZWdpbkRhdGEnXVsnZnJhbWUnXTtmb3IoY29uc3QgaW52YWxpZGF0aW9uIG9mIHRoaXMuX2ludmFsaWRhdGlvbnNPZlR5cGVzKFtUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5MYXlvdXRJbnZhbGlkYXRpb25UcmFja2luZ10pKXtpZihpbnZhbGlkYXRpb24ubGlua2VkTGF5b3V0RXZlbnQpCmNvbnRpbnVlO3RoaXMuX2FkZEludmFsaWRhdGlvblRvRXZlbnQobGF5b3V0RXZlbnQsbGF5b3V0RnJhbWVJZCxpbnZhbGlkYXRpb24pO2ludmFsaWRhdGlvbi5saW5rZWRMYXlvdXRFdmVudD10cnVlO319CmRpZFBhaW50KHBhaW50RXZlbnQpe3RoaXMuX2RpZFBhaW50PXRydWU7Y29uc3QgbGF5ZXJJZD1wYWludEV2ZW50LmFyZ3NbJ2RhdGEnXVsnbGF5ZXJJZCddO2lmKGxheWVySWQpCnRoaXMuX2xhc3RQYWludFdpdGhMYXllcj1wYWludEV2ZW50O2lmKCF0aGlzLl9sYXN0UGFpbnRXaXRoTGF5ZXIpCnJldHVybjtjb25zdCBlZmZlY3RpdmVQYWludElkPXRoaXMuX2xhc3RQYWludFdpdGhMYXllci5hcmdzWydkYXRhJ11bJ25vZGVJZCddO2NvbnN0IHBhaW50RnJhbWVJZD1wYWludEV2ZW50LmFyZ3NbJ2RhdGEnXVsnZnJhbWUnXTtjb25zdCB0eXBlcz1bVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuU3R5bGVSZWNhbGNJbnZhbGlkYXRpb25UcmFja2luZyxUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5MYXlvdXRJbnZhbGlkYXRpb25UcmFja2luZyxUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5QYWludEludmFsaWRhdGlvblRyYWNraW5nLFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLlNjcm9sbEludmFsaWRhdGlvblRyYWNraW5nXTtmb3IoY29uc3QgaW52YWxpZGF0aW9uIG9mIHRoaXMuX2ludmFsaWRhdGlvbnNPZlR5cGVzKHR5cGVzKSl7aWYoaW52YWxpZGF0aW9uLnBhaW50SWQ9PT1lZmZlY3RpdmVQYWludElkKQp0aGlzLl9hZGRJbnZhbGlkYXRpb25Ub0V2ZW50KHBhaW50RXZlbnQscGFpbnRGcmFtZUlkLGludmFsaWRhdGlvbik7fX0KX2FkZEludmFsaWRhdGlvblRvRXZlbnQoZXZlbnQsZXZlbnRGcmFtZUlkLGludmFsaWRhdGlvbil7aWYoZXZlbnRGcmFtZUlkIT09aW52YWxpZGF0aW9uLmZyYW1lKQpyZXR1cm47aWYoIWV2ZW50W1RpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5faW52YWxpZGF0aW9uVHJhY2tpbmdFdmVudHNTeW1ib2xdKQpldmVudFtUaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNrZXIuX2ludmFsaWRhdGlvblRyYWNraW5nRXZlbnRzU3ltYm9sXT1baW52YWxpZGF0aW9uXTtlbHNlCmV2ZW50W1RpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5faW52YWxpZGF0aW9uVHJhY2tpbmdFdmVudHNTeW1ib2xdLnB1c2goaW52YWxpZGF0aW9uKTt9Cl9pbnZhbGlkYXRpb25zT2ZUeXBlcyh0eXBlcyl7Y29uc3QgaW52YWxpZGF0aW9ucz10aGlzLl9pbnZhbGlkYXRpb25zO2lmKCF0eXBlcykKdHlwZXM9T2JqZWN0LmtleXMoaW52YWxpZGF0aW9ucyk7ZnVuY3Rpb24qZ2VuZXJhdG9yKCl7Zm9yKGxldCBpPTA7aTx0eXBlcy5sZW5ndGg7KytpKXtjb25zdCBpbnZhbGlkYXRpb25MaXN0PWludmFsaWRhdGlvbnNbdHlwZXNbaV1dfHxbXTtmb3IobGV0IGo9MDtqPGludmFsaWRhdGlvbkxpc3QubGVuZ3RoOysraikKeWllbGQgaW52YWxpZGF0aW9uTGlzdFtqXTt9fQpyZXR1cm4gZ2VuZXJhdG9yKCk7fQpfc3RhcnROZXdGcmFtZUlmTmVlZGVkKCl7aWYoIXRoaXMuX2RpZFBhaW50KQpyZXR1cm47dGhpcy5faW5pdGlhbGl6ZVBlckZyYW1lU3RhdGUoKTt9Cl9pbml0aWFsaXplUGVyRnJhbWVTdGF0ZSgpe3RoaXMuX2ludmFsaWRhdGlvbnM9e307dGhpcy5faW52YWxpZGF0aW9uc0J5Tm9kZUlkPXt9O3RoaXMuX2xhc3RSZWNhbGNTdHlsZT1udWxsO3RoaXMuX2xhc3RQYWludFdpdGhMYXllcj1udWxsO3RoaXMuX2RpZFBhaW50PWZhbHNlO319O1RpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5faW52YWxpZGF0aW9uVHJhY2tpbmdFdmVudHNTeW1ib2w9U3ltYm9sKCdpbnZhbGlkYXRpb25UcmFja2luZ0V2ZW50cycpO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe1RpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5faW5pdGlhbGl6ZSgpO3RoaXMuX2luaXRpYXRvckJ5VHlwZT1uZXcgTWFwKCk7Zm9yKGNvbnN0IGluaXRpYXRvciBvZiBUaW1lbGluZU1vZGVsLlRpbWVsaW5lQXN5bmNFdmVudFRyYWNrZXIuX2FzeW5jRXZlbnRzLmtleXMoKSkKdGhpcy5faW5pdGlhdG9yQnlUeXBlLnNldChpbml0aWF0b3IsbmV3IE1hcCgpKTt9CnN0YXRpYyBfaW5pdGlhbGl6ZSgpe2lmKFRpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fYXN5bmNFdmVudHMpCnJldHVybjtjb25zdCBldmVudHM9bmV3IE1hcCgpO2xldCB0eXBlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2V2ZW50cy5zZXQodHlwZS5UaW1lckluc3RhbGwse2NhdXNlczpbdHlwZS5UaW1lckZpcmVdLGpvaW5CeTondGltZXJJZCd9KTtldmVudHMuc2V0KHR5cGUuUmVzb3VyY2VTZW5kUmVxdWVzdCx7Y2F1c2VzOlt0eXBlLlJlc291cmNlUmVjZWl2ZVJlc3BvbnNlLHR5cGUuUmVzb3VyY2VSZWNlaXZlZERhdGEsdHlwZS5SZXNvdXJjZUZpbmlzaF0sam9pbkJ5OidyZXF1ZXN0SWQnfSk7ZXZlbnRzLnNldCh0eXBlLlJlcXVlc3RBbmltYXRpb25GcmFtZSx7Y2F1c2VzOlt0eXBlLkZpcmVBbmltYXRpb25GcmFtZV0sam9pbkJ5OidpZCd9KTtldmVudHMuc2V0KHR5cGUuUmVxdWVzdElkbGVDYWxsYmFjayx7Y2F1c2VzOlt0eXBlLkZpcmVJZGxlQ2FsbGJhY2tdLGpvaW5CeTonaWQnfSk7ZXZlbnRzLnNldCh0eXBlLldlYlNvY2tldENyZWF0ZSx7Y2F1c2VzOlt0eXBlLldlYlNvY2tldFNlbmRIYW5kc2hha2VSZXF1ZXN0LHR5cGUuV2ViU29ja2V0UmVjZWl2ZUhhbmRzaGFrZVJlc3BvbnNlLHR5cGUuV2ViU29ja2V0RGVzdHJveV0sam9pbkJ5OidpZGVudGlmaWVyJ30pO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fYXN5bmNFdmVudHM9ZXZlbnRzO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fdHlwZVRvSW5pdGlhdG9yPW5ldyBNYXAoKTtmb3IoY29uc3QgZW50cnkgb2YgZXZlbnRzKXtjb25zdCB0eXBlcz1lbnRyeVsxXS5jYXVzZXM7Zm9yKHR5cGUgb2YgdHlwZXMpClRpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fdHlwZVRvSW5pdGlhdG9yLnNldCh0eXBlLGVudHJ5WzBdKTt9fQpwcm9jZXNzRXZlbnQoZXZlbnQpe2xldCBpbml0aWF0b3JUeXBlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fdHlwZVRvSW5pdGlhdG9yLmdldCgoZXZlbnQubmFtZSkpO2NvbnN0IGlzSW5pdGlhdG9yPSFpbml0aWF0b3JUeXBlO2lmKCFpbml0aWF0b3JUeXBlKQppbml0aWF0b3JUeXBlPShldmVudC5uYW1lKTtjb25zdCBpbml0aWF0b3JJbmZvPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVBc3luY0V2ZW50VHJhY2tlci5fYXN5bmNFdmVudHMuZ2V0KGluaXRpYXRvclR5cGUpO2lmKCFpbml0aWF0b3JJbmZvKQpyZXR1cm47Y29uc3QgaWQ9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLmdsb2JhbEV2ZW50SWQoZXZlbnQsaW5pdGlhdG9ySW5mby5qb2luQnkpO2lmKCFpZCkKcmV0dXJuO2NvbnN0IGluaXRpYXRvck1hcD10aGlzLl9pbml0aWF0b3JCeVR5cGUuZ2V0KGluaXRpYXRvclR5cGUpO2lmKGlzSW5pdGlhdG9yKXtpbml0aWF0b3JNYXAuc2V0KGlkLGV2ZW50KTtyZXR1cm47fQpjb25zdCBpbml0aWF0b3I9aW5pdGlhdG9yTWFwLmdldChpZCl8fG51bGw7Y29uc3QgdGltZWxpbmVEYXRhPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KTt0aW1lbGluZURhdGEuc2V0SW5pdGlhdG9yKGluaXRpYXRvcik7aWYoIXRpbWVsaW5lRGF0YS5mcmFtZUlkJiZpbml0aWF0b3IpCnRpbWVsaW5lRGF0YS5mcmFtZUlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5ldmVudEZyYW1lSWQoaW5pdGlhdG9yKTt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMud2FybmluZz1udWxsO3RoaXMucHJldmlld0VsZW1lbnQ9bnVsbDt0aGlzLnVybD1udWxsO3RoaXMuYmFja2VuZE5vZGVJZD0wO3RoaXMuc3RhY2tUcmFjZT1udWxsO3RoaXMucGljdHVyZT1udWxsO3RoaXMuX2luaXRpYXRvcj1udWxsO3RoaXMuZnJhbWVJZD0nJzt0aGlzLnRpbWVXYWl0aW5nRm9yTWFpblRocmVhZDt9CnNldEluaXRpYXRvcihpbml0aWF0b3Ipe3RoaXMuX2luaXRpYXRvcj1pbml0aWF0b3I7aWYoIWluaXRpYXRvcnx8dGhpcy51cmwpCnJldHVybjtjb25zdCBpbml0aWF0b3JVUkw9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoaW5pdGlhdG9yKS51cmw7aWYoaW5pdGlhdG9yVVJMKQp0aGlzLnVybD1pbml0aWF0b3JVUkw7fQppbml0aWF0b3IoKXtyZXR1cm4gdGhpcy5faW5pdGlhdG9yO30KdG9wRnJhbWUoKXtjb25zdCBzdGFja1RyYWNlPXRoaXMuc3RhY2tUcmFjZUZvclNlbGZPckluaXRpYXRvcigpO3JldHVybiBzdGFja1RyYWNlJiZzdGFja1RyYWNlWzBdfHxudWxsO30Kc3RhY2tUcmFjZUZvclNlbGZPckluaXRpYXRvcigpe3JldHVybiB0aGlzLnN0YWNrVHJhY2V8fCh0aGlzLl9pbml0aWF0b3ImJlRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KHRoaXMuX2luaXRpYXRvcikuc3RhY2tUcmFjZSk7fQpzdGF0aWMgZm9yRXZlbnQoZXZlbnQpe2xldCBkYXRhPWV2ZW50W1RpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLl9zeW1ib2xdO2lmKCFkYXRhKXtkYXRhPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YSgpO2V2ZW50W1RpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLl9zeW1ib2xdPWRhdGE7fQpyZXR1cm4gZGF0YTt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5fc3ltYm9sPVN5bWJvbCgndGltZWxpbmVEYXRhJyk7O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5yZXNldCgpO30Kc3RhdGljIHBoYXNlRm9yRXZlbnQoZXZlbnQpe3JldHVybiBldmVudFtUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5fZXZlbnRJUlBoYXNlXTt9CnBvcHVsYXRlKGlucHV0TGF0ZW5jaWVzLGFuaW1hdGlvbnMpe3RoaXMucmVzZXQoKTtpZighaW5wdXRMYXRlbmNpZXMpCnJldHVybjt0aGlzLl9wcm9jZXNzSW5wdXRMYXRlbmNpZXMoaW5wdXRMYXRlbmNpZXMpO2lmKGFuaW1hdGlvbnMpCnRoaXMuX3Byb2Nlc3NBbmltYXRpb25zKGFuaW1hdGlvbnMpO2NvbnN0IHJhbmdlPW5ldyBDb21tb24uU2VnbWVudGVkUmFuZ2UoKTtyYW5nZS5hcHBlbmRSYW5nZSh0aGlzLl9kcmFncyk7cmFuZ2UuYXBwZW5kUmFuZ2UodGhpcy5fY3NzQW5pbWF0aW9ucyk7cmFuZ2UuYXBwZW5kUmFuZ2UodGhpcy5fc2Nyb2xscyk7cmFuZ2UuYXBwZW5kUmFuZ2UodGhpcy5fcmVzcG9uc2VzKTt0aGlzLl9zZWdtZW50cz1yYW5nZS5zZWdtZW50cygpO30KX3Byb2Nlc3NJbnB1dExhdGVuY2llcyhldmVudHMpe2NvbnN0IGV2ZW50VHlwZXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuSW5wdXRFdmVudHM7Y29uc3QgcGhhc2VzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLlBoYXNlcztjb25zdCB0aHJlc2hvbGRzTXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuX21lcmdlVGhyZXNob2xkc01zO2xldCBzY3JvbGxTdGFydDtsZXQgZmxpbmdTdGFydDtsZXQgdG91Y2hTdGFydDtsZXQgZmlyc3RUb3VjaE1vdmU7bGV0IG1vdXNlV2hlZWw7bGV0IG1vdXNlRG93bjtsZXQgbW91c2VNb3ZlO2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV2ZW50PWV2ZW50c1tpXTtpZihpPjAmJmV2ZW50c1tpXS5zdGFydFRpbWU8ZXZlbnRzW2ktMV0uc3RhcnRUaW1lKQpjb25zb2xlLmFzc2VydChmYWxzZSwnVW5vcmRlcmVkIGlucHV0IGV2ZW50cycpO2NvbnN0IHR5cGU9dGhpcy5faW5wdXRFdmVudFR5cGUoZXZlbnQubmFtZSk7c3dpdGNoKHR5cGUpe2Nhc2UgZXZlbnRUeXBlcy5TY3JvbGxCZWdpbjp0aGlzLl9zY3JvbGxzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnQoZXZlbnQscGhhc2VzLlNjcm9sbCkpO3Njcm9sbFN0YXJ0PWV2ZW50O2JyZWFrO2Nhc2UgZXZlbnRUeXBlcy5TY3JvbGxFbmQ6aWYoc2Nyb2xsU3RhcnQpCnRoaXMuX3Njcm9sbHMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudFJhbmdlKHNjcm9sbFN0YXJ0LGV2ZW50LHBoYXNlcy5TY3JvbGwpKTtlbHNlCnRoaXMuX3Njcm9sbHMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudChldmVudCxwaGFzZXMuU2Nyb2xsKSk7c2Nyb2xsU3RhcnQ9bnVsbDticmVhaztjYXNlIGV2ZW50VHlwZXMuU2Nyb2xsVXBkYXRlOnRvdWNoU3RhcnQ9bnVsbDt0aGlzLl9zY3JvbGxzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnQoZXZlbnQscGhhc2VzLlNjcm9sbCkpO2JyZWFrO2Nhc2UgZXZlbnRUeXBlcy5GbGluZ1N0YXJ0OmlmKGZsaW5nU3RhcnQpe0NvbW1vbi5jb25zb2xlLmVycm9yKENvbW1vbi5VSVN0cmluZygnVHdvIGZsaW5ncyBhdCB0aGUgc2FtZSB0aW1lPyAlcyB2cyAlcycsZmxpbmdTdGFydC5zdGFydFRpbWUsZXZlbnQuc3RhcnRUaW1lKSk7YnJlYWs7fQpmbGluZ1N0YXJ0PWV2ZW50O2JyZWFrO2Nhc2UgZXZlbnRUeXBlcy5GbGluZ0NhbmNlbDppZighZmxpbmdTdGFydCkKYnJlYWs7dGhpcy5fc2Nyb2xscy5hcHBlbmQodGhpcy5fc2VnbWVudEZvckV2ZW50UmFuZ2UoZmxpbmdTdGFydCxldmVudCxwaGFzZXMuRmxpbmcpKTtmbGluZ1N0YXJ0PW51bGw7YnJlYWs7Y2FzZSBldmVudFR5cGVzLkltcGxTaWRlRmxpbmc6dGhpcy5fc2Nyb2xscy5hcHBlbmQodGhpcy5fc2VnbWVudEZvckV2ZW50KGV2ZW50LHBoYXNlcy5GbGluZykpO2JyZWFrO2Nhc2UgZXZlbnRUeXBlcy5TaG93UHJlc3M6Y2FzZSBldmVudFR5cGVzLlRhcDpjYXNlIGV2ZW50VHlwZXMuS2V5RG93bjpjYXNlIGV2ZW50VHlwZXMuS2V5RG93blJhdzpjYXNlIGV2ZW50VHlwZXMuS2V5VXA6Y2FzZSBldmVudFR5cGVzLkNoYXI6Y2FzZSBldmVudFR5cGVzLkNsaWNrOmNhc2UgZXZlbnRUeXBlcy5Db250ZXh0TWVudTp0aGlzLl9yZXNwb25zZXMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudChldmVudCxwaGFzZXMuUmVzcG9uc2UpKTticmVhaztjYXNlIGV2ZW50VHlwZXMuVG91Y2hTdGFydDppZih0b3VjaFN0YXJ0KXtDb21tb24uY29uc29sZS5lcnJvcihDb21tb24uVUlTdHJpbmcoJ1R3byB0b3VjaGVzIGF0IHRoZSBzYW1lIHRpbWU/ICVzIHZzICVzJyx0b3VjaFN0YXJ0LnN0YXJ0VGltZSxldmVudC5zdGFydFRpbWUpKTticmVhazt9CnRvdWNoU3RhcnQ9ZXZlbnQ7ZXZlbnQuc3RlcHNbMF1bVGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuX2V2ZW50SVJQaGFzZV09cGhhc2VzLlJlc3BvbnNlO2ZpcnN0VG91Y2hNb3ZlPW51bGw7YnJlYWs7Y2FzZSBldmVudFR5cGVzLlRvdWNoQ2FuY2VsOnRvdWNoU3RhcnQ9bnVsbDticmVhaztjYXNlIGV2ZW50VHlwZXMuVG91Y2hNb3ZlOmlmKGZpcnN0VG91Y2hNb3ZlKXt0aGlzLl9kcmFncy5hcHBlbmQodGhpcy5fc2VnbWVudEZvckV2ZW50KGV2ZW50LHBoYXNlcy5EcmFnKSk7fWVsc2UgaWYodG91Y2hTdGFydCl7Zmlyc3RUb3VjaE1vdmU9ZXZlbnQ7dGhpcy5fcmVzcG9uc2VzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnRSYW5nZSh0b3VjaFN0YXJ0LGV2ZW50LHBoYXNlcy5SZXNwb25zZSkpO30KYnJlYWs7Y2FzZSBldmVudFR5cGVzLlRvdWNoRW5kOnRvdWNoU3RhcnQ9bnVsbDticmVhaztjYXNlIGV2ZW50VHlwZXMuTW91c2VEb3duOm1vdXNlRG93bj1ldmVudDttb3VzZU1vdmU9bnVsbDticmVhaztjYXNlIGV2ZW50VHlwZXMuTW91c2VNb3ZlOmlmKG1vdXNlRG93biYmIW1vdXNlTW92ZSYmbW91c2VEb3duLnN0YXJ0VGltZSt0aHJlc2hvbGRzTXMubW91c2U+ZXZlbnQuc3RhcnRUaW1lKXt0aGlzLl9yZXNwb25zZXMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudChtb3VzZURvd24scGhhc2VzLlJlc3BvbnNlKSk7dGhpcy5fcmVzcG9uc2VzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnQoZXZlbnQscGhhc2VzLlJlc3BvbnNlKSk7fWVsc2UgaWYobW91c2VEb3duKXt0aGlzLl9kcmFncy5hcHBlbmQodGhpcy5fc2VnbWVudEZvckV2ZW50KGV2ZW50LHBoYXNlcy5EcmFnKSk7fQptb3VzZU1vdmU9ZXZlbnQ7YnJlYWs7Y2FzZSBldmVudFR5cGVzLk1vdXNlVXA6dGhpcy5fcmVzcG9uc2VzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnQoZXZlbnQscGhhc2VzLlJlc3BvbnNlKSk7bW91c2VEb3duPW51bGw7YnJlYWs7Y2FzZSBldmVudFR5cGVzLk1vdXNlV2hlZWw6aWYobW91c2VXaGVlbCYmY2FuTWVyZ2UodGhyZXNob2xkc01zLm1vdXNlLG1vdXNlV2hlZWwsZXZlbnQpKQp0aGlzLl9zY3JvbGxzLmFwcGVuZCh0aGlzLl9zZWdtZW50Rm9yRXZlbnRSYW5nZShtb3VzZVdoZWVsLGV2ZW50LHBoYXNlcy5TY3JvbGwpKTtlbHNlCnRoaXMuX3Njcm9sbHMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudChldmVudCxwaGFzZXMuU2Nyb2xsKSk7bW91c2VXaGVlbD1ldmVudDticmVhazt9fQpmdW5jdGlvbiBjYW5NZXJnZSh0aHJlc2hvbGQsZmlyc3Qsc2Vjb25kKXtyZXR1cm4gZmlyc3QuZW5kVGltZTxzZWNvbmQuc3RhcnRUaW1lJiZzZWNvbmQuc3RhcnRUaW1lPGZpcnN0LmVuZFRpbWUrdGhyZXNob2xkO319Cl9wcm9jZXNzQW5pbWF0aW9ucyhldmVudHMpe2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDsrK2kpCnRoaXMuX2Nzc0FuaW1hdGlvbnMuYXBwZW5kKHRoaXMuX3NlZ21lbnRGb3JFdmVudChldmVudHNbaV0sVGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuUGhhc2VzLkFuaW1hdGlvbikpO30KX3NlZ21lbnRGb3JFdmVudChldmVudCxwaGFzZSl7dGhpcy5fc2V0UGhhc2VGb3JFdmVudChldmVudCxwaGFzZSk7cmV0dXJuIG5ldyBDb21tb24uU2VnbWVudChldmVudC5zdGFydFRpbWUsZXZlbnQuZW5kVGltZSxwaGFzZSk7fQpfc2VnbWVudEZvckV2ZW50UmFuZ2Uoc3RhcnRFdmVudCxlbmRFdmVudCxwaGFzZSl7dGhpcy5fc2V0UGhhc2VGb3JFdmVudChzdGFydEV2ZW50LHBoYXNlKTt0aGlzLl9zZXRQaGFzZUZvckV2ZW50KGVuZEV2ZW50LHBoYXNlKTtyZXR1cm4gbmV3IENvbW1vbi5TZWdtZW50KHN0YXJ0RXZlbnQuc3RhcnRUaW1lLGVuZEV2ZW50LmVuZFRpbWUscGhhc2UpO30KX3NldFBoYXNlRm9yRXZlbnQoYXN5bmNFdmVudCxwaGFzZSl7YXN5bmNFdmVudC5zdGVwc1swXVtUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5fZXZlbnRJUlBoYXNlXT1waGFzZTt9CmludGVyYWN0aW9uUmVjb3Jkcygpe3JldHVybiB0aGlzLl9zZWdtZW50czt9CnJlc2V0KCl7Y29uc3QgdGhyZXNob2xkc01zPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLl9tZXJnZVRocmVzaG9sZHNNczt0aGlzLl9zZWdtZW50cz1bXTt0aGlzLl9kcmFncz1uZXcgQ29tbW9uLlNlZ21lbnRlZFJhbmdlKG1lcmdlLmJpbmQobnVsbCx0aHJlc2hvbGRzTXMubW91c2UpKTt0aGlzLl9jc3NBbmltYXRpb25zPW5ldyBDb21tb24uU2VnbWVudGVkUmFuZ2UobWVyZ2UuYmluZChudWxsLHRocmVzaG9sZHNNcy5hbmltYXRpb24pKTt0aGlzLl9yZXNwb25zZXM9bmV3IENvbW1vbi5TZWdtZW50ZWRSYW5nZShtZXJnZS5iaW5kKG51bGwsMCkpO3RoaXMuX3Njcm9sbHM9bmV3IENvbW1vbi5TZWdtZW50ZWRSYW5nZShtZXJnZS5iaW5kKG51bGwsdGhyZXNob2xkc01zLmFuaW1hdGlvbikpO2Z1bmN0aW9uIG1lcmdlKHRocmVzaG9sZCxmaXJzdCxzZWNvbmQpe3JldHVybiBmaXJzdC5lbmQrdGhyZXNob2xkPj1zZWNvbmQuYmVnaW4mJmZpcnN0LmRhdGE9PT1zZWNvbmQuZGF0YT9maXJzdDpudWxsO319Cl9pbnB1dEV2ZW50VHlwZShldmVudE5hbWUpe2NvbnN0IHByZWZpeD0nSW5wdXRMYXRlbmN5OjonO2lmKCFldmVudE5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKXtpZihldmVudE5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5JbnB1dEV2ZW50cy5JbXBsU2lkZUZsaW5nKQpyZXR1cm4oZXZlbnROYW1lKTtjb25zb2xlLmVycm9yKCdVbnJlY29nbml6ZWQgaW5wdXQgbGF0ZW5jeSBldmVudDogJytldmVudE5hbWUpO3JldHVybiBudWxsO30KcmV0dXJuKGV2ZW50TmFtZS5zdWJzdHIocHJlZml4Lmxlbmd0aCkpO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLlBoYXNlcz17SWRsZTonSWRsZScsUmVzcG9uc2U6J1Jlc3BvbnNlJyxTY3JvbGw6J1Njcm9sbCcsRmxpbmc6J0ZsaW5nJyxEcmFnOidEcmFnJyxBbmltYXRpb246J0FuaW1hdGlvbicsVW5jYXRlZ29yaXplZDonVW5jYXRlZ29yaXplZCd9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLklucHV0RXZlbnRzPXtDaGFyOidDaGFyJyxDbGljazonR2VzdHVyZUNsaWNrJyxDb250ZXh0TWVudTonQ29udGV4dE1lbnUnLEZsaW5nQ2FuY2VsOidHZXN0dXJlRmxpbmdDYW5jZWwnLEZsaW5nU3RhcnQ6J0dlc3R1cmVGbGluZ1N0YXJ0JyxJbXBsU2lkZUZsaW5nOlRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkltcGxTaWRlRmxpbmcsS2V5RG93bjonS2V5RG93bicsS2V5RG93blJhdzonUmF3S2V5RG93bicsS2V5VXA6J0tleVVwJyxMYXRlbmN5U2Nyb2xsVXBkYXRlOidTY3JvbGxVcGRhdGUnLE1vdXNlRG93bjonTW91c2VEb3duJyxNb3VzZU1vdmU6J01vdXNlTW92ZScsTW91c2VVcDonTW91c2VVcCcsTW91c2VXaGVlbDonTW91c2VXaGVlbCcsUGluY2hCZWdpbjonR2VzdHVyZVBpbmNoQmVnaW4nLFBpbmNoRW5kOidHZXN0dXJlUGluY2hFbmQnLFBpbmNoVXBkYXRlOidHZXN0dXJlUGluY2hVcGRhdGUnLFNjcm9sbEJlZ2luOidHZXN0dXJlU2Nyb2xsQmVnaW4nLFNjcm9sbEVuZDonR2VzdHVyZVNjcm9sbEVuZCcsU2Nyb2xsVXBkYXRlOidHZXN0dXJlU2Nyb2xsVXBkYXRlJyxTY3JvbGxVcGRhdGVSZW5kZXJlcjonU2Nyb2xsVXBkYXRlJyxTaG93UHJlc3M6J0dlc3R1cmVTaG93UHJlc3MnLFRhcDonR2VzdHVyZVRhcCcsVGFwQ2FuY2VsOidHZXN0dXJlVGFwQ2FuY2VsJyxUYXBEb3duOidHZXN0dXJlVGFwRG93bicsVG91Y2hDYW5jZWw6J1RvdWNoQ2FuY2VsJyxUb3VjaEVuZDonVG91Y2hFbmQnLFRvdWNoTW92ZTonVG91Y2hNb3ZlJyxUb3VjaFN0YXJ0OidUb3VjaFN0YXJ0J307VGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuX21lcmdlVGhyZXNob2xkc01zPXthbmltYXRpb246MSxtb3VzZTo0MCx9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLl9ldmVudElSUGhhc2U9U3ltYm9sKCdldmVudElSUGhhc2UnKTs7VGltZWxpbmVNb2RlbC5UaW1lbGluZUpTUHJvZmlsZVByb2Nlc3Nvcj1jbGFzc3tzdGF0aWMgZ2VuZXJhdGVUcmFjaW5nRXZlbnRzRnJvbUNwdVByb2ZpbGUoanNQcm9maWxlTW9kZWwsdGhyZWFkKXtjb25zdCBpZGxlTm9kZT1qc1Byb2ZpbGVNb2RlbC5pZGxlTm9kZTtjb25zdCBwcm9ncmFtTm9kZT1qc1Byb2ZpbGVNb2RlbC5wcm9ncmFtTm9kZTtjb25zdCBnY05vZGU9anNQcm9maWxlTW9kZWwuZ2NOb2RlO2NvbnN0IHNhbXBsZXM9anNQcm9maWxlTW9kZWwuc2FtcGxlcztjb25zdCB0aW1lc3RhbXBzPWpzUHJvZmlsZU1vZGVsLnRpbWVzdGFtcHM7Y29uc3QganNFdmVudHM9W107Y29uc3Qgbm9kZVRvU3RhY2tNYXA9bmV3IE1hcCgpO25vZGVUb1N0YWNrTWFwLnNldChwcm9ncmFtTm9kZSxbXSk7Zm9yKGxldCBpPTA7aTxzYW1wbGVzLmxlbmd0aDsrK2kpe2xldCBub2RlPWpzUHJvZmlsZU1vZGVsLm5vZGVCeUluZGV4KGkpO2lmKCFub2RlKXtjb25zb2xlLmVycm9yKGBOb2RlIHdpdGggdW5rbm93biBpZCAke3NhbXBsZXNbaV19IGF0IGluZGV4ICR7aX1gKTtjb250aW51ZTt9CmlmKG5vZGU9PT1nY05vZGV8fG5vZGU9PT1pZGxlTm9kZSkKY29udGludWU7bGV0IGNhbGxGcmFtZXM9bm9kZVRvU3RhY2tNYXAuZ2V0KG5vZGUpO2lmKCFjYWxsRnJhbWVzKXtjYWxsRnJhbWVzPShuZXcgQXJyYXkobm9kZS5kZXB0aCsxKSk7bm9kZVRvU3RhY2tNYXAuc2V0KG5vZGUsY2FsbEZyYW1lcyk7Zm9yKGxldCBqPTA7bm9kZS5wYXJlbnQ7bm9kZT1ub2RlLnBhcmVudCkKY2FsbEZyYW1lc1tqKytdPShub2RlKTt9CmNvbnN0IGpzU2FtcGxlRXZlbnQ9bmV3IFNESy5UcmFjaW5nTW9kZWwuRXZlbnQoU0RLLlRyYWNpbmdNb2RlbC5EZXZUb29sc1RpbWVsaW5lRXZlbnRDYXRlZ29yeSxUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5KU1NhbXBsZSxTREsuVHJhY2luZ01vZGVsLlBoYXNlLkluc3RhbnQsdGltZXN0YW1wc1tpXSx0aHJlYWQpO2pzU2FtcGxlRXZlbnQuYXJnc1snZGF0YSddPXtzdGFja1RyYWNlOmNhbGxGcmFtZXN9O2pzRXZlbnRzLnB1c2goanNTYW1wbGVFdmVudCk7fQpyZXR1cm4ganNFdmVudHM7fQpzdGF0aWMgZ2VuZXJhdGVKU0ZyYW1lRXZlbnRzKGV2ZW50cyl7ZnVuY3Rpb24gZXF1YWxGcmFtZXMoZnJhbWUxLGZyYW1lMil7cmV0dXJuIGZyYW1lMS5zY3JpcHRJZD09PWZyYW1lMi5zY3JpcHRJZCYmZnJhbWUxLmZ1bmN0aW9uTmFtZT09PWZyYW1lMi5mdW5jdGlvbk5hbWUmJmZyYW1lMS5saW5lTnVtYmVyPT09ZnJhbWUyLmxpbmVOdW1iZXI7fQpmdW5jdGlvbiBpc0pTSW52b2NhdGlvbkV2ZW50KGUpe3N3aXRjaChlLm5hbWUpe2Nhc2UgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuUnVuTWljcm90YXNrczpjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkZ1bmN0aW9uQ2FsbDpjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkV2YWx1YXRlU2NyaXB0OmNhc2UgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuRXZhbHVhdGVNb2R1bGU6Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5FdmVudERpc3BhdGNoOmNhc2UgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuVjhFeGVjdXRlOnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30KY29uc3QganNGcmFtZUV2ZW50cz1bXTtjb25zdCBqc0ZyYW1lc1N0YWNrPVtdO2NvbnN0IGxvY2tlZEpzU3RhY2tEZXB0aD1bXTtsZXQgb3JkaW5hbD0wO2NvbnN0IHNob3dBbGxFdmVudHM9UnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ3RpbWVsaW5lU2hvd0FsbEV2ZW50cycpO2NvbnN0IHNob3dSdW50aW1lQ2FsbFN0YXRzPVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCd0aW1lbGluZVY4UnVudGltZUNhbGxTdGF0cycpO2NvbnN0IHNob3dOYXRpdmVGdW5jdGlvbnM9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ3Nob3dOYXRpdmVGdW5jdGlvbnNJbkpTUHJvZmlsZScpLmdldCgpO2Z1bmN0aW9uIG9uU3RhcnRFdmVudChlKXtlLm9yZGluYWw9KytvcmRpbmFsO2V4dHJhY3RTdGFja1RyYWNlKGUpO2xvY2tlZEpzU3RhY2tEZXB0aC5wdXNoKGpzRnJhbWVzU3RhY2subGVuZ3RoKTt9CmZ1bmN0aW9uIG9uSW5zdGFudEV2ZW50KGUscGFyZW50KXtlLm9yZGluYWw9KytvcmRpbmFsO2lmKHBhcmVudCYmaXNKU0ludm9jYXRpb25FdmVudChwYXJlbnQpKQpleHRyYWN0U3RhY2tUcmFjZShlKTt9CmZ1bmN0aW9uIG9uRW5kRXZlbnQoZSl7dHJ1bmNhdGVKU1N0YWNrKGxvY2tlZEpzU3RhY2tEZXB0aC5wb3AoKSxlLmVuZFRpbWUpO30KZnVuY3Rpb24gdHJ1bmNhdGVKU1N0YWNrKGRlcHRoLHRpbWUpe2lmKGxvY2tlZEpzU3RhY2tEZXB0aC5sZW5ndGgpe2NvbnN0IGxvY2tlZERlcHRoPWxvY2tlZEpzU3RhY2tEZXB0aC5wZWVrTGFzdCgpO2lmKGRlcHRoPGxvY2tlZERlcHRoKXtjb25zb2xlLmVycm9yKGBDaGlsZCBzdGFjayBpcyBzaGFsbG93ZXIgKCR7ZGVwdGh9KSB0aGFuIHRoZSBwYXJlbnQgc3RhY2sgKCR7bG9ja2VkRGVwdGh9KSBhdCAke3RpbWV9YCk7ZGVwdGg9bG9ja2VkRGVwdGg7fX0KaWYoanNGcmFtZXNTdGFjay5sZW5ndGg8ZGVwdGgpe2NvbnNvbGUuZXJyb3IoYFRyeWluZyB0byB0cnVuY2F0ZSBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBzdGFjayBzaXplIGF0ICR7dGltZX1gKTtkZXB0aD1qc0ZyYW1lc1N0YWNrLmxlbmd0aDt9CmZvcihsZXQgaz0wO2s8anNGcmFtZXNTdGFjay5sZW5ndGg7KytrKQpqc0ZyYW1lc1N0YWNrW2tdLnNldEVuZFRpbWUodGltZSk7anNGcmFtZXNTdGFjay5sZW5ndGg9ZGVwdGg7fQpmdW5jdGlvbiBzaG93TmF0aXZlTmFtZShuYW1lKXtyZXR1cm4gc2hvd1J1bnRpbWVDYWxsU3RhdHMmJiEhVGltZWxpbmVNb2RlbC5UaW1lbGluZUpTUHJvZmlsZVByb2Nlc3Nvci5uYXRpdmVHcm91cChuYW1lKTt9CmZ1bmN0aW9uIGZpbHRlclN0YWNrRnJhbWVzKHN0YWNrKXtpZihzaG93QWxsRXZlbnRzKQpyZXR1cm47bGV0IHByZXZpb3VzTmF0aXZlRnJhbWVOYW1lPW51bGw7bGV0IGo9MDtmb3IobGV0IGk9MDtpPHN0YWNrLmxlbmd0aDsrK2kpe2NvbnN0IGZyYW1lPXN0YWNrW2ldO2NvbnN0IHVybD1mcmFtZS51cmw7Y29uc3QgaXNOYXRpdmVGcmFtZT11cmwmJnVybC5zdGFydHNXaXRoKCduYXRpdmUgJyk7aWYoIXNob3dOYXRpdmVGdW5jdGlvbnMmJmlzTmF0aXZlRnJhbWUpCmNvbnRpbnVlO2NvbnN0IGlzTmF0aXZlUnVudGltZUZyYW1lPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuaXNOYXRpdmVSdW50aW1lRnJhbWUoZnJhbWUpO2lmKGlzTmF0aXZlUnVudGltZUZyYW1lJiYhc2hvd05hdGl2ZU5hbWUoZnJhbWUuZnVuY3Rpb25OYW1lKSkKY29udGludWU7Y29uc3QgbmF0aXZlRnJhbWVOYW1lPWlzTmF0aXZlUnVudGltZUZyYW1lP1RpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IubmF0aXZlR3JvdXAoZnJhbWUuZnVuY3Rpb25OYW1lKTpudWxsO2lmKHByZXZpb3VzTmF0aXZlRnJhbWVOYW1lJiZwcmV2aW91c05hdGl2ZUZyYW1lTmFtZT09PW5hdGl2ZUZyYW1lTmFtZSkKY29udGludWU7cHJldmlvdXNOYXRpdmVGcmFtZU5hbWU9bmF0aXZlRnJhbWVOYW1lO3N0YWNrW2orK109ZnJhbWU7fQpzdGFjay5sZW5ndGg9ajt9CmZ1bmN0aW9uIGV4dHJhY3RTdGFja1RyYWNlKGUpe2NvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2NvbnN0IGNhbGxGcmFtZXM9ZS5uYW1lPT09cmVjb3JkVHlwZXMuSlNTYW1wbGU/ZS5hcmdzWydkYXRhJ11bJ3N0YWNrVHJhY2UnXS5zbGljZSgpLnJldmVyc2UoKTpqc0ZyYW1lc1N0YWNrLm1hcChmcmFtZUV2ZW50PT5mcmFtZUV2ZW50LmFyZ3NbJ2RhdGEnXSk7ZmlsdGVyU3RhY2tGcmFtZXMoY2FsbEZyYW1lcyk7Y29uc3QgZW5kVGltZT1lLmVuZFRpbWV8fGUuc3RhcnRUaW1lO2NvbnN0IG1pbkZyYW1lcz1NYXRoLm1pbihjYWxsRnJhbWVzLmxlbmd0aCxqc0ZyYW1lc1N0YWNrLmxlbmd0aCk7bGV0IGk7Zm9yKGk9bG9ja2VkSnNTdGFja0RlcHRoLnBlZWtMYXN0KCl8fDA7aTxtaW5GcmFtZXM7KytpKXtjb25zdCBuZXdGcmFtZT1jYWxsRnJhbWVzW2ldO2NvbnN0IG9sZEZyYW1lPWpzRnJhbWVzU3RhY2tbaV0uYXJnc1snZGF0YSddO2lmKCFlcXVhbEZyYW1lcyhuZXdGcmFtZSxvbGRGcmFtZSkpCmJyZWFrO2pzRnJhbWVzU3RhY2tbaV0uc2V0RW5kVGltZShNYXRoLm1heChqc0ZyYW1lc1N0YWNrW2ldLmVuZFRpbWUsZW5kVGltZSkpO30KdHJ1bmNhdGVKU1N0YWNrKGksZS5zdGFydFRpbWUpO2Zvcig7aTxjYWxsRnJhbWVzLmxlbmd0aDsrK2kpe2NvbnN0IGZyYW1lPWNhbGxGcmFtZXNbaV07Y29uc3QganNGcmFtZUV2ZW50PW5ldyBTREsuVHJhY2luZ01vZGVsLkV2ZW50KFNESy5UcmFjaW5nTW9kZWwuRGV2VG9vbHNUaW1lbGluZUV2ZW50Q2F0ZWdvcnkscmVjb3JkVHlwZXMuSlNGcmFtZSxTREsuVHJhY2luZ01vZGVsLlBoYXNlLkNvbXBsZXRlLGUuc3RhcnRUaW1lLGUudGhyZWFkKTtqc0ZyYW1lRXZlbnQub3JkaW5hbD1lLm9yZGluYWw7anNGcmFtZUV2ZW50LmFkZEFyZ3Moe2RhdGE6ZnJhbWV9KTtqc0ZyYW1lRXZlbnQuc2V0RW5kVGltZShlbmRUaW1lKTtqc0ZyYW1lc1N0YWNrLnB1c2goanNGcmFtZUV2ZW50KTtqc0ZyYW1lRXZlbnRzLnB1c2goanNGcmFtZUV2ZW50KTt9fQpjb25zdCBmaXJzdFRvcExldmVsRXZlbnQ9ZXZlbnRzLmZpbmQoU0RLLlRyYWNpbmdNb2RlbC5pc1RvcExldmVsRXZlbnQpO2NvbnN0IHN0YXJ0VGltZT1maXJzdFRvcExldmVsRXZlbnQ/Zmlyc3RUb3BMZXZlbEV2ZW50LnN0YXJ0VGltZTowO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5mb3JFYWNoRXZlbnQoZXZlbnRzLG9uU3RhcnRFdmVudCxvbkVuZEV2ZW50LG9uSW5zdGFudEV2ZW50LHN0YXJ0VGltZSk7cmV0dXJuIGpzRnJhbWVFdmVudHM7fQpzdGF0aWMgaXNOYXRpdmVSdW50aW1lRnJhbWUoZnJhbWUpe3JldHVybiBmcmFtZS51cmw9PT0nbmF0aXZlIFY4UnVudGltZSc7fQpzdGF0aWMgbmF0aXZlR3JvdXAobmF0aXZlTmFtZSl7aWYobmF0aXZlTmFtZS5zdGFydHNXaXRoKCdQYXJzZScpKQpyZXR1cm4gVGltZWxpbmVNb2RlbC5UaW1lbGluZUpTUHJvZmlsZVByb2Nlc3Nvci5OYXRpdmVHcm91cHMuUGFyc2U7aWYobmF0aXZlTmFtZS5zdGFydHNXaXRoKCdDb21waWxlJyl8fG5hdGl2ZU5hbWUuc3RhcnRzV2l0aCgnUmVjb21waWxlJykpCnJldHVybiBUaW1lbGluZU1vZGVsLlRpbWVsaW5lSlNQcm9maWxlUHJvY2Vzc29yLk5hdGl2ZUdyb3Vwcy5Db21waWxlO3JldHVybiBudWxsO30Kc3RhdGljIGJ1aWxkVHJhY2VQcm9maWxlRnJvbUNwdVByb2ZpbGUocHJvZmlsZSl7aWYoIXByb2ZpbGUpCnJldHVybltdO2NvbnN0IGV2ZW50cz1bXTthcHBlbmRFdmVudCgnVHJhY2luZ1N0YXJ0ZWRJblBhZ2UnLHsnc2Vzc2lvbklkJzonMSd9LDAsMCwnTScpO2NvbnN0IGlkVG9Ob2RlPW5ldyBNYXAoKTtjb25zdCBub2Rlcz1wcm9maWxlWydub2RlcyddO2ZvcihsZXQgaT0wO2k8bm9kZXMubGVuZ3RoOysraSkKaWRUb05vZGUuc2V0KG5vZGVzW2ldLmlkLG5vZGVzW2ldKTtsZXQgcHJvZ3JhbUV2ZW50PW51bGw7bGV0IGZ1bmN0aW9uRXZlbnQ9bnVsbDtsZXQgbmV4dFRpbWU9cHJvZmlsZS5zdGFydFRpbWU7bGV0IGN1cnJlbnRUaW1lO2NvbnN0IHNhbXBsZXM9cHJvZmlsZVsnc2FtcGxlcyddO2NvbnN0IHRpbWVEZWx0YXM9cHJvZmlsZVsndGltZURlbHRhcyddO2ZvcihsZXQgaT0wO2k8c2FtcGxlcy5sZW5ndGg7KytpKXtjdXJyZW50VGltZT1uZXh0VGltZTtuZXh0VGltZSs9dGltZURlbHRhc1tpXTtjb25zdCBub2RlPWlkVG9Ob2RlLmdldChzYW1wbGVzW2ldKTtjb25zdCBuYW1lPW5vZGUuY2FsbEZyYW1lLmZ1bmN0aW9uTmFtZTtpZihuYW1lPT09JyhpZGxlKScpe2Nsb3NlRXZlbnRzKCk7Y29udGludWU7fQppZighcHJvZ3JhbUV2ZW50KQpwcm9ncmFtRXZlbnQ9YXBwZW5kRXZlbnQoJ01lc3NhZ2VMb29wOjpSdW5UYXNrJyx7fSxjdXJyZW50VGltZSwwLCdYJywndG9wbGV2ZWwnKTtpZihuYW1lPT09Jyhwcm9ncmFtKScpe2lmKGZ1bmN0aW9uRXZlbnQpe2Z1bmN0aW9uRXZlbnQuZHVyPWN1cnJlbnRUaW1lLWZ1bmN0aW9uRXZlbnQudHM7ZnVuY3Rpb25FdmVudD1udWxsO319ZWxzZXtpZighZnVuY3Rpb25FdmVudCkKZnVuY3Rpb25FdmVudD1hcHBlbmRFdmVudCgnRnVuY3Rpb25DYWxsJyx7J3Nlc3Npb25JZCc6JzEnfSxjdXJyZW50VGltZSk7fX0KY2xvc2VFdmVudHMoKTthcHBlbmRFdmVudCgnQ3B1UHJvZmlsZScseydjcHVQcm9maWxlJzpwcm9maWxlfSxwcm9maWxlLmVuZFRpbWUsMCwnSScpO3JldHVybiBldmVudHM7ZnVuY3Rpb24gY2xvc2VFdmVudHMoKXtpZihwcm9ncmFtRXZlbnQpCnByb2dyYW1FdmVudC5kdXI9Y3VycmVudFRpbWUtcHJvZ3JhbUV2ZW50LnRzO2lmKGZ1bmN0aW9uRXZlbnQpCmZ1bmN0aW9uRXZlbnQuZHVyPWN1cnJlbnRUaW1lLWZ1bmN0aW9uRXZlbnQudHM7cHJvZ3JhbUV2ZW50PW51bGw7ZnVuY3Rpb25FdmVudD1udWxsO30KZnVuY3Rpb24gYXBwZW5kRXZlbnQobmFtZSxkYXRhLHRzLGR1cixwaCxjYXQpe2NvbnN0IGV2ZW50PSh7Y2F0OmNhdHx8J2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLG5hbWU6bmFtZSxwaDpwaHx8J1gnLHBpZDoxLHRpZDoxLHRzOnRzLGFyZ3M6e2RhdGE6ZGF0YX19KTtpZihkdXIpCmV2ZW50LmR1cj1kdXI7ZXZlbnRzLnB1c2goZXZlbnQpO3JldHVybiBldmVudDt9fX07VGltZWxpbmVNb2RlbC5UaW1lbGluZUpTUHJvZmlsZVByb2Nlc3Nvci5OYXRpdmVHcm91cHM9eydDb21waWxlJzonQ29tcGlsZScsJ1BhcnNlJzonUGFyc2UnfTs7VGltZWxpbmVNb2RlbC5UaW1lbGluZUZyYW1lTW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IoY2F0ZWdvcnlNYXBwZXIpe3RoaXMuX2NhdGVnb3J5TWFwcGVyPWNhdGVnb3J5TWFwcGVyO3RoaXMucmVzZXQoKTt9CmZyYW1lcyhzdGFydFRpbWUsZW5kVGltZSl7aWYoIXN0YXJ0VGltZSYmIWVuZFRpbWUpCnJldHVybiB0aGlzLl9mcmFtZXM7Y29uc3QgZmlyc3RGcmFtZT10aGlzLl9mcmFtZXMubG93ZXJCb3VuZChzdGFydFRpbWV8fDAsKHRpbWUsZnJhbWUpPT50aW1lLWZyYW1lLmVuZFRpbWUpO2NvbnN0IGxhc3RGcmFtZT10aGlzLl9mcmFtZXMubG93ZXJCb3VuZChlbmRUaW1lfHxJbmZpbml0eSwodGltZSxmcmFtZSk9PnRpbWUtZnJhbWUuc3RhcnRUaW1lKTtyZXR1cm4gdGhpcy5fZnJhbWVzLnNsaWNlKGZpcnN0RnJhbWUsbGFzdEZyYW1lKTt9Cmhhc1Jhc3RlclRpbGUocmFzdGVyVGFzayl7Y29uc3QgZGF0YT1yYXN0ZXJUYXNrLmFyZ3NbJ3RpbGVEYXRhJ107aWYoIWRhdGEpCnJldHVybiBmYWxzZTtjb25zdCBmcmFtZUlkPWRhdGFbJ3NvdXJjZUZyYW1lTnVtYmVyJ107Y29uc3QgZnJhbWU9ZnJhbWVJZCYmdGhpcy5fZnJhbWVCeUlkW2ZyYW1lSWRdO2lmKCFmcmFtZXx8IWZyYW1lLmxheWVyVHJlZSkKcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO30KcmFzdGVyVGlsZVByb21pc2UocmFzdGVyVGFzayl7aWYoIXRoaXMuX3RhcmdldCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtjb25zdCBkYXRhPXJhc3RlclRhc2suYXJnc1sndGlsZURhdGEnXTtjb25zdCBmcmFtZUlkPWRhdGFbJ3NvdXJjZUZyYW1lTnVtYmVyJ107Y29uc3QgdGlsZUlkPWRhdGFbJ3RpbGVJZCddJiZkYXRhWyd0aWxlSWQnXVsnaWRfcmVmJ107Y29uc3QgZnJhbWU9ZnJhbWVJZCYmdGhpcy5fZnJhbWVCeUlkW2ZyYW1lSWRdO2lmKCFmcmFtZXx8IWZyYW1lLmxheWVyVHJlZXx8IXRpbGVJZCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtyZXR1cm4gZnJhbWUubGF5ZXJUcmVlLmxheWVyVHJlZVByb21pc2UoKS50aGVuKGxheWVyVHJlZT0+bGF5ZXJUcmVlJiZsYXllclRyZWUucGljdHVyZUZvclJhc3RlclRpbGUodGlsZUlkKSk7fQpyZXNldCgpe3RoaXMuX21pbmltdW1SZWNvcmRUaW1lPUluZmluaXR5O3RoaXMuX2ZyYW1lcz1bXTt0aGlzLl9mcmFtZUJ5SWQ9e307dGhpcy5fbGFzdEZyYW1lPW51bGw7dGhpcy5fbGFzdExheWVyVHJlZT1udWxsO3RoaXMuX21haW5GcmFtZUNvbW1pdHRlZD1mYWxzZTt0aGlzLl9tYWluRnJhbWVSZXF1ZXN0ZWQ9ZmFsc2U7dGhpcy5fZnJhbWVQZW5kaW5nQ29tbWl0PW51bGw7dGhpcy5fbGFzdEJlZ2luRnJhbWU9bnVsbDt0aGlzLl9sYXN0TmVlZHNCZWdpbkZyYW1lPW51bGw7dGhpcy5fZnJhbWVQZW5kaW5nQWN0aXZhdGlvbj1udWxsO3RoaXMuX2xhc3RUYXNrQmVnaW5UaW1lPW51bGw7dGhpcy5fdGFyZ2V0PW51bGw7dGhpcy5fbGF5ZXJUcmVlSWQ9bnVsbDt0aGlzLl9jdXJyZW50VGFza1RpbWVCeUNhdGVnb3J5PXt9O30KaGFuZGxlQmVnaW5GcmFtZShzdGFydFRpbWUpe2lmKCF0aGlzLl9sYXN0RnJhbWUpCnRoaXMuX3N0YXJ0RnJhbWUoc3RhcnRUaW1lKTt0aGlzLl9sYXN0QmVnaW5GcmFtZT1zdGFydFRpbWU7fQpoYW5kbGVEcmF3RnJhbWUoc3RhcnRUaW1lKXtpZighdGhpcy5fbGFzdEZyYW1lKXt0aGlzLl9zdGFydEZyYW1lKHN0YXJ0VGltZSk7cmV0dXJuO30KaWYodGhpcy5fbWFpbkZyYW1lQ29tbWl0dGVkfHwhdGhpcy5fbWFpbkZyYW1lUmVxdWVzdGVkKXtpZih0aGlzLl9sYXN0TmVlZHNCZWdpbkZyYW1lKXtjb25zdCBpZGxlVGltZUVuZD10aGlzLl9mcmFtZVBlbmRpbmdBY3RpdmF0aW9uP3RoaXMuX2ZyYW1lUGVuZGluZ0FjdGl2YXRpb24udHJpZ2dlclRpbWU6KHRoaXMuX2xhc3RCZWdpbkZyYW1lfHx0aGlzLl9sYXN0TmVlZHNCZWdpbkZyYW1lKTtpZihpZGxlVGltZUVuZD50aGlzLl9sYXN0RnJhbWUuc3RhcnRUaW1lKXt0aGlzLl9sYXN0RnJhbWUuaWRsZT10cnVlO3RoaXMuX3N0YXJ0RnJhbWUoaWRsZVRpbWVFbmQpO2lmKHRoaXMuX2ZyYW1lUGVuZGluZ0FjdGl2YXRpb24pCnRoaXMuX2NvbW1pdFBlbmRpbmdGcmFtZSgpO3RoaXMuX2xhc3RCZWdpbkZyYW1lPW51bGw7fQp0aGlzLl9sYXN0TmVlZHNCZWdpbkZyYW1lPW51bGw7fQp0aGlzLl9zdGFydEZyYW1lKHN0YXJ0VGltZSk7fQp0aGlzLl9tYWluRnJhbWVDb21taXR0ZWQ9ZmFsc2U7fQpoYW5kbGVBY3RpdmF0ZUxheWVyVHJlZSgpe2lmKCF0aGlzLl9sYXN0RnJhbWUpCnJldHVybjtpZih0aGlzLl9mcmFtZVBlbmRpbmdBY3RpdmF0aW9uJiYhdGhpcy5fbGFzdE5lZWRzQmVnaW5GcmFtZSkKdGhpcy5fY29tbWl0UGVuZGluZ0ZyYW1lKCk7fQpoYW5kbGVSZXF1ZXN0TWFpblRocmVhZEZyYW1lKCl7aWYoIXRoaXMuX2xhc3RGcmFtZSkKcmV0dXJuO3RoaXMuX21haW5GcmFtZVJlcXVlc3RlZD10cnVlO30KaGFuZGxlQ29tcG9zaXRlTGF5ZXJzKCl7aWYoIXRoaXMuX2ZyYW1lUGVuZGluZ0NvbW1pdCkKcmV0dXJuO3RoaXMuX2ZyYW1lUGVuZGluZ0FjdGl2YXRpb249dGhpcy5fZnJhbWVQZW5kaW5nQ29tbWl0O3RoaXMuX2ZyYW1lUGVuZGluZ0NvbW1pdD1udWxsO3RoaXMuX21haW5GcmFtZVJlcXVlc3RlZD1mYWxzZTt0aGlzLl9tYWluRnJhbWVDb21taXR0ZWQ9dHJ1ZTt9CmhhbmRsZUxheWVyVHJlZVNuYXBzaG90KGxheWVyVHJlZSl7dGhpcy5fbGFzdExheWVyVHJlZT1sYXllclRyZWU7fQpoYW5kbGVOZWVkRnJhbWVDaGFuZ2VkKHN0YXJ0VGltZSxuZWVkc0JlZ2luRnJhbWUpe2lmKG5lZWRzQmVnaW5GcmFtZSkKdGhpcy5fbGFzdE5lZWRzQmVnaW5GcmFtZT1zdGFydFRpbWU7fQpfc3RhcnRGcmFtZShzdGFydFRpbWUpe2lmKHRoaXMuX2xhc3RGcmFtZSkKdGhpcy5fZmx1c2hGcmFtZSh0aGlzLl9sYXN0RnJhbWUsc3RhcnRUaW1lKTt0aGlzLl9sYXN0RnJhbWU9bmV3IFRpbWVsaW5lTW9kZWwuVGltZWxpbmVGcmFtZShzdGFydFRpbWUsc3RhcnRUaW1lLXRoaXMuX21pbmltdW1SZWNvcmRUaW1lKTt9Cl9mbHVzaEZyYW1lKGZyYW1lLGVuZFRpbWUpe2ZyYW1lLl9zZXRMYXllclRyZWUodGhpcy5fbGFzdExheWVyVHJlZSk7ZnJhbWUuX3NldEVuZFRpbWUoZW5kVGltZSk7aWYodGhpcy5fbGFzdExheWVyVHJlZSkKdGhpcy5fbGFzdExheWVyVHJlZS5fc2V0UGFpbnRzKGZyYW1lLl9wYWludHMpO2lmKHRoaXMuX2ZyYW1lcy5sZW5ndGgmJihmcmFtZS5zdGFydFRpbWUhPT10aGlzLl9mcmFtZXMucGVla0xhc3QoKS5lbmRUaW1lfHxmcmFtZS5zdGFydFRpbWU+ZnJhbWUuZW5kVGltZSkpe2NvbnNvbGUuYXNzZXJ0KGZhbHNlLGBJbmNvbnNpc3RlbnQgZnJhbWUgdGltZSBmb3IgZnJhbWUgJHt0aGlzLl9mcmFtZXMubGVuZ3RofSAoJHtmcmFtZS5zdGFydFRpbWV9IC0gJHtmcmFtZS5lbmRUaW1lfSlgKTt9CnRoaXMuX2ZyYW1lcy5wdXNoKGZyYW1lKTtpZih0eXBlb2YgZnJhbWUuX21haW5GcmFtZUlkPT09J251bWJlcicpCnRoaXMuX2ZyYW1lQnlJZFtmcmFtZS5fbWFpbkZyYW1lSWRdPWZyYW1lO30KX2NvbW1pdFBlbmRpbmdGcmFtZSgpe3RoaXMuX2xhc3RGcmFtZS5fYWRkVGltZUZvckNhdGVnb3JpZXModGhpcy5fZnJhbWVQZW5kaW5nQWN0aXZhdGlvbi50aW1lQnlDYXRlZ29yeSk7dGhpcy5fbGFzdEZyYW1lLl9wYWludHM9dGhpcy5fZnJhbWVQZW5kaW5nQWN0aXZhdGlvbi5wYWludHM7dGhpcy5fbGFzdEZyYW1lLl9tYWluRnJhbWVJZD10aGlzLl9mcmFtZVBlbmRpbmdBY3RpdmF0aW9uLm1haW5GcmFtZUlkO3RoaXMuX2ZyYW1lUGVuZGluZ0FjdGl2YXRpb249bnVsbDt9CmFkZFRyYWNlRXZlbnRzKHRhcmdldCxldmVudHMsdGhyZWFkRGF0YSl7dGhpcy5fdGFyZ2V0PXRhcmdldDtsZXQgaj0wO3RoaXMuX2N1cnJlbnRQcm9jZXNzTWFpblRocmVhZD10aHJlYWREYXRhLmxlbmd0aCYmdGhyZWFkRGF0YVswXS50aHJlYWR8fG51bGw7Zm9yKGxldCBpPTA7aTxldmVudHMubGVuZ3RoOysraSl7d2hpbGUoaisxPHRocmVhZERhdGEubGVuZ3RoJiZ0aHJlYWREYXRhW2orMV0udGltZTw9ZXZlbnRzW2ldLnN0YXJ0VGltZSkKdGhpcy5fY3VycmVudFByb2Nlc3NNYWluVGhyZWFkPXRocmVhZERhdGFbKytqXS50aHJlYWQ7dGhpcy5fYWRkVHJhY2VFdmVudChldmVudHNbaV0pO30KdGhpcy5fY3VycmVudFByb2Nlc3NNYWluVGhyZWFkPW51bGw7fQpfYWRkVHJhY2VFdmVudChldmVudCl7Y29uc3QgZXZlbnROYW1lcz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtpZihldmVudC5zdGFydFRpbWUmJmV2ZW50LnN0YXJ0VGltZTx0aGlzLl9taW5pbXVtUmVjb3JkVGltZSkKdGhpcy5fbWluaW11bVJlY29yZFRpbWU9ZXZlbnQuc3RhcnRUaW1lO2lmKGV2ZW50Lm5hbWU9PT1ldmVudE5hbWVzLlNldExheWVyVHJlZUlkKXt0aGlzLl9sYXllclRyZWVJZD1ldmVudC5hcmdzWydsYXllclRyZWVJZCddfHxldmVudC5hcmdzWydkYXRhJ11bJ2xheWVyVHJlZUlkJ107fWVsc2UgaWYoZXZlbnQucGhhc2U9PT1TREsuVHJhY2luZ01vZGVsLlBoYXNlLlNuYXBzaG90T2JqZWN0JiZldmVudC5uYW1lPT09ZXZlbnROYW1lcy5MYXllclRyZWVIb3N0SW1wbFNuYXBzaG90JiZwYXJzZUludChldmVudC5pZCwwKT09PXRoaXMuX2xheWVyVHJlZUlkKXtjb25zdCBzbmFwc2hvdD0oZXZlbnQpO3RoaXMuaGFuZGxlTGF5ZXJUcmVlU25hcHNob3QobmV3IFRpbWVsaW5lTW9kZWwuVHJhY2luZ0ZyYW1lTGF5ZXJUcmVlKHRoaXMuX3RhcmdldCxzbmFwc2hvdCkpO31lbHNle3RoaXMuX3Byb2Nlc3NDb21wb3NpdG9yRXZlbnRzKGV2ZW50KTtpZihldmVudC50aHJlYWQ9PT10aGlzLl9jdXJyZW50UHJvY2Vzc01haW5UaHJlYWQpCnRoaXMuX2FkZE1haW5UaHJlYWRUcmFjZUV2ZW50KGV2ZW50KTtlbHNlIGlmKHRoaXMuX2xhc3RGcmFtZSYmZXZlbnQuc2VsZlRpbWUmJiFTREsuVHJhY2luZ01vZGVsLmlzVG9wTGV2ZWxFdmVudChldmVudCkpCnRoaXMuX2xhc3RGcmFtZS5fYWRkVGltZUZvckNhdGVnb3J5KHRoaXMuX2NhdGVnb3J5TWFwcGVyKGV2ZW50KSxldmVudC5zZWxmVGltZSk7fX0KX3Byb2Nlc3NDb21wb3NpdG9yRXZlbnRzKGV2ZW50KXtjb25zdCBldmVudE5hbWVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2lmKGV2ZW50LmFyZ3NbJ2xheWVyVHJlZUlkJ10hPT10aGlzLl9sYXllclRyZWVJZCkKcmV0dXJuO2NvbnN0IHRpbWVzdGFtcD1ldmVudC5zdGFydFRpbWU7aWYoZXZlbnQubmFtZT09PWV2ZW50TmFtZXMuQmVnaW5GcmFtZSkKdGhpcy5oYW5kbGVCZWdpbkZyYW1lKHRpbWVzdGFtcCk7ZWxzZSBpZihldmVudC5uYW1lPT09ZXZlbnROYW1lcy5EcmF3RnJhbWUpCnRoaXMuaGFuZGxlRHJhd0ZyYW1lKHRpbWVzdGFtcCk7ZWxzZSBpZihldmVudC5uYW1lPT09ZXZlbnROYW1lcy5BY3RpdmF0ZUxheWVyVHJlZSkKdGhpcy5oYW5kbGVBY3RpdmF0ZUxheWVyVHJlZSgpO2Vsc2UgaWYoZXZlbnQubmFtZT09PWV2ZW50TmFtZXMuUmVxdWVzdE1haW5UaHJlYWRGcmFtZSkKdGhpcy5oYW5kbGVSZXF1ZXN0TWFpblRocmVhZEZyYW1lKCk7ZWxzZSBpZihldmVudC5uYW1lPT09ZXZlbnROYW1lcy5OZWVkc0JlZ2luRnJhbWVDaGFuZ2VkKQp0aGlzLmhhbmRsZU5lZWRGcmFtZUNoYW5nZWQodGltZXN0YW1wLGV2ZW50LmFyZ3NbJ2RhdGEnXSYmZXZlbnQuYXJnc1snZGF0YSddWyduZWVkc0JlZ2luRnJhbWUnXSk7fQpfYWRkTWFpblRocmVhZFRyYWNlRXZlbnQoZXZlbnQpe2NvbnN0IGV2ZW50TmFtZXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGU7aWYoU0RLLlRyYWNpbmdNb2RlbC5pc1RvcExldmVsRXZlbnQoZXZlbnQpKXt0aGlzLl9jdXJyZW50VGFza1RpbWVCeUNhdGVnb3J5PXt9O3RoaXMuX2xhc3RUYXNrQmVnaW5UaW1lPWV2ZW50LnN0YXJ0VGltZTt9CmlmKCF0aGlzLl9mcmFtZVBlbmRpbmdDb21taXQmJlRpbWVsaW5lTW9kZWwuVGltZWxpbmVGcmFtZU1vZGVsLl9tYWluRnJhbWVNYXJrZXJzLmluZGV4T2YoZXZlbnQubmFtZSk+PTApe3RoaXMuX2ZyYW1lUGVuZGluZ0NvbW1pdD1uZXcgVGltZWxpbmVNb2RlbC5QZW5kaW5nRnJhbWUodGhpcy5fbGFzdFRhc2tCZWdpblRpbWV8fGV2ZW50LnN0YXJ0VGltZSx0aGlzLl9jdXJyZW50VGFza1RpbWVCeUNhdGVnb3J5KTt9CmlmKCF0aGlzLl9mcmFtZVBlbmRpbmdDb21taXQpe3RoaXMuX2FkZFRpbWVGb3JDYXRlZ29yeSh0aGlzLl9jdXJyZW50VGFza1RpbWVCeUNhdGVnb3J5LGV2ZW50KTtyZXR1cm47fQp0aGlzLl9hZGRUaW1lRm9yQ2F0ZWdvcnkodGhpcy5fZnJhbWVQZW5kaW5nQ29tbWl0LnRpbWVCeUNhdGVnb3J5LGV2ZW50KTtpZihldmVudC5uYW1lPT09ZXZlbnROYW1lcy5CZWdpbk1haW5UaHJlYWRGcmFtZSYmZXZlbnQuYXJnc1snZGF0YSddJiZldmVudC5hcmdzWydkYXRhJ11bJ2ZyYW1lSWQnXSkKdGhpcy5fZnJhbWVQZW5kaW5nQ29tbWl0Lm1haW5GcmFtZUlkPWV2ZW50LmFyZ3NbJ2RhdGEnXVsnZnJhbWVJZCddO2lmKGV2ZW50Lm5hbWU9PT1ldmVudE5hbWVzLlBhaW50JiZldmVudC5hcmdzWydkYXRhJ11bJ2xheWVySWQnXSYmVGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLnBpY3R1cmUmJnRoaXMuX3RhcmdldCkKdGhpcy5fZnJhbWVQZW5kaW5nQ29tbWl0LnBhaW50cy5wdXNoKG5ldyBUaW1lbGluZU1vZGVsLkxheWVyUGFpbnRFdmVudChldmVudCx0aGlzLl90YXJnZXQpKTtpZihldmVudC5uYW1lPT09ZXZlbnROYW1lcy5Db21wb3NpdGVMYXllcnMmJmV2ZW50LmFyZ3NbJ2xheWVyVHJlZUlkJ109PT10aGlzLl9sYXllclRyZWVJZCkKdGhpcy5oYW5kbGVDb21wb3NpdGVMYXllcnMoKTt9Cl9hZGRUaW1lRm9yQ2F0ZWdvcnkodGltZUJ5Q2F0ZWdvcnksZXZlbnQpe2lmKCFldmVudC5zZWxmVGltZSkKcmV0dXJuO2NvbnN0IGNhdGVnb3J5TmFtZT10aGlzLl9jYXRlZ29yeU1hcHBlcihldmVudCk7dGltZUJ5Q2F0ZWdvcnlbY2F0ZWdvcnlOYW1lXT0odGltZUJ5Q2F0ZWdvcnlbY2F0ZWdvcnlOYW1lXXx8MCkrZXZlbnQuc2VsZlRpbWU7fX07VGltZWxpbmVNb2RlbC5UaW1lbGluZUZyYW1lTW9kZWwuX21haW5GcmFtZU1hcmtlcnM9W1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLlNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uLFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkludmFsaWRhdGVMYXlvdXQsVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuQmVnaW5NYWluVGhyZWFkRnJhbWUsVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuU2Nyb2xsTGF5ZXJdO1RpbWVsaW5lTW9kZWwuVHJhY2luZ0ZyYW1lTGF5ZXJUcmVlPWNsYXNze2NvbnN0cnVjdG9yKHRhcmdldCxzbmFwc2hvdCl7dGhpcy5fdGFyZ2V0PXRhcmdldDt0aGlzLl9zbmFwc2hvdD1zbmFwc2hvdDt0aGlzLl9wYWludHM7fQphc3luYyBsYXllclRyZWVQcm9taXNlKCl7Y29uc3QgcmVzdWx0PWF3YWl0IHRoaXMuX3NuYXBzaG90Lm9iamVjdFByb21pc2UoKTtpZighcmVzdWx0KQpyZXR1cm4gbnVsbDtjb25zdCB2aWV3cG9ydD1yZXN1bHRbJ2RldmljZV92aWV3cG9ydF9zaXplJ107Y29uc3QgdGlsZXM9cmVzdWx0WydhY3RpdmVfdGlsZXMnXTtjb25zdCByb290TGF5ZXI9cmVzdWx0WydhY3RpdmVfdHJlZSddWydyb290X2xheWVyJ107Y29uc3QgbGF5ZXJzPXJlc3VsdFsnYWN0aXZlX3RyZWUnXVsnbGF5ZXJzJ107Y29uc3QgbGF5ZXJUcmVlPW5ldyBUaW1lbGluZU1vZGVsLlRyYWNpbmdMYXllclRyZWUodGhpcy5fdGFyZ2V0KTtsYXllclRyZWUuc2V0Vmlld3BvcnRTaXplKHZpZXdwb3J0KTtsYXllclRyZWUuc2V0VGlsZXModGlsZXMpO2F3YWl0IGxheWVyVHJlZS5zZXRMYXllcnMocm9vdExheWVyLGxheWVycyx0aGlzLl9wYWludHN8fFtdKTtyZXR1cm4gbGF5ZXJUcmVlO30KcGFpbnRzKCl7cmV0dXJuIHRoaXMuX3BhaW50c3x8W107fQpfc2V0UGFpbnRzKHBhaW50cyl7dGhpcy5fcGFpbnRzPXBhaW50czt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lRnJhbWU9Y2xhc3N7Y29uc3RydWN0b3Ioc3RhcnRUaW1lLHN0YXJ0VGltZU9mZnNldCl7dGhpcy5zdGFydFRpbWU9c3RhcnRUaW1lO3RoaXMuc3RhcnRUaW1lT2Zmc2V0PXN0YXJ0VGltZU9mZnNldDt0aGlzLmVuZFRpbWU9dGhpcy5zdGFydFRpbWU7dGhpcy5kdXJhdGlvbj0wO3RoaXMudGltZUJ5Q2F0ZWdvcnk9e307dGhpcy5jcHVUaW1lPTA7dGhpcy5pZGxlPWZhbHNlO3RoaXMubGF5ZXJUcmVlPW51bGw7dGhpcy5fcGFpbnRzPVtdO3RoaXMuX21haW5GcmFtZUlkPXVuZGVmaW5lZDt9Cmhhc1dhcm5pbmdzKCl7cmV0dXJuIGZhbHNlO30KX3NldEVuZFRpbWUoZW5kVGltZSl7dGhpcy5lbmRUaW1lPWVuZFRpbWU7dGhpcy5kdXJhdGlvbj10aGlzLmVuZFRpbWUtdGhpcy5zdGFydFRpbWU7fQpfc2V0TGF5ZXJUcmVlKGxheWVyVHJlZSl7dGhpcy5sYXllclRyZWU9bGF5ZXJUcmVlO30KX2FkZFRpbWVGb3JDYXRlZ29yaWVzKHRpbWVCeUNhdGVnb3J5KXtmb3IoY29uc3QgY2F0ZWdvcnkgaW4gdGltZUJ5Q2F0ZWdvcnkpCnRoaXMuX2FkZFRpbWVGb3JDYXRlZ29yeShjYXRlZ29yeSx0aW1lQnlDYXRlZ29yeVtjYXRlZ29yeV0pO30KX2FkZFRpbWVGb3JDYXRlZ29yeShjYXRlZ29yeSx0aW1lKXt0aGlzLnRpbWVCeUNhdGVnb3J5W2NhdGVnb3J5XT0odGhpcy50aW1lQnlDYXRlZ29yeVtjYXRlZ29yeV18fDApK3RpbWU7dGhpcy5jcHVUaW1lKz10aW1lO319O1RpbWVsaW5lTW9kZWwuTGF5ZXJQYWludEV2ZW50PWNsYXNze2NvbnN0cnVjdG9yKGV2ZW50LHRhcmdldCl7dGhpcy5fZXZlbnQ9ZXZlbnQ7dGhpcy5fdGFyZ2V0PXRhcmdldDt9CmxheWVySWQoKXtyZXR1cm4gdGhpcy5fZXZlbnQuYXJnc1snZGF0YSddWydsYXllcklkJ107fQpldmVudCgpe3JldHVybiB0aGlzLl9ldmVudDt9CnBpY3R1cmVQcm9taXNlKCl7Y29uc3QgcGljdHVyZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudCh0aGlzLl9ldmVudCkucGljdHVyZTtyZXR1cm4gcGljdHVyZS5vYmplY3RQcm9taXNlKCkudGhlbihyZXN1bHQ9PntpZighcmVzdWx0KQpyZXR1cm4gbnVsbDtjb25zdCByZWN0PXJlc3VsdFsncGFyYW1zJ10mJnJlc3VsdFsncGFyYW1zJ11bJ2xheWVyX3JlY3QnXTtjb25zdCBwaWN0dXJlPXJlc3VsdFsnc2twNjQnXTtyZXR1cm4gcmVjdCYmcGljdHVyZT97cmVjdDpyZWN0LHNlcmlhbGl6ZWRQaWN0dXJlOnBpY3R1cmV9Om51bGw7fSk7fQpzbmFwc2hvdFByb21pc2UoKXtjb25zdCBwYWludFByb2ZpbGVyTW9kZWw9dGhpcy5fdGFyZ2V0JiZ0aGlzLl90YXJnZXQubW9kZWwoU0RLLlBhaW50UHJvZmlsZXJNb2RlbCk7cmV0dXJuIHRoaXMucGljdHVyZVByb21pc2UoKS50aGVuKHBpY3R1cmU9PntpZighcGljdHVyZXx8IXBhaW50UHJvZmlsZXJNb2RlbCkKcmV0dXJuIG51bGw7cmV0dXJuIHBhaW50UHJvZmlsZXJNb2RlbC5sb2FkU25hcHNob3QocGljdHVyZS5zZXJpYWxpemVkUGljdHVyZSkudGhlbihzbmFwc2hvdD0+c25hcHNob3Q/e3JlY3Q6cGljdHVyZS5yZWN0LHNuYXBzaG90OnNuYXBzaG90fTpudWxsKTt9KTt9fTtUaW1lbGluZU1vZGVsLlBlbmRpbmdGcmFtZT1jbGFzc3tjb25zdHJ1Y3Rvcih0cmlnZ2VyVGltZSx0aW1lQnlDYXRlZ29yeSl7dGhpcy50aW1lQnlDYXRlZ29yeT10aW1lQnlDYXRlZ29yeTt0aGlzLnBhaW50cz1bXTt0aGlzLm1haW5GcmFtZUlkPXVuZGVmaW5lZDt0aGlzLnRyaWdnZXJUaW1lPXRyaWdnZXJUaW1lO319OztUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWU9e307VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLk5vZGU9Y2xhc3N7Y29uc3RydWN0b3IoaWQsZXZlbnQpe3RoaXMudG90YWxUaW1lPTA7dGhpcy5zZWxmVGltZT0wO3RoaXMuaWQ9aWQ7dGhpcy5ldmVudD1ldmVudDt0aGlzLnBhcmVudDt0aGlzLl9ncm91cElkPScnO3RoaXMuX2lzR3JvdXBOb2RlPWZhbHNlO30KaXNHcm91cE5vZGUoKXtyZXR1cm4gdGhpcy5faXNHcm91cE5vZGU7fQpoYXNDaGlsZHJlbigpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpjaGlsZHJlbigpe3Rocm93J05vdCBpbXBsZW1lbnRlZCc7fQpzZWFyY2hUcmVlKG1hdGNoRnVuY3Rpb24scmVzdWx0cyl7cmVzdWx0cz1yZXN1bHRzfHxbXTtpZih0aGlzLmV2ZW50JiZtYXRjaEZ1bmN0aW9uKHRoaXMuZXZlbnQpKQpyZXN1bHRzLnB1c2godGhpcyk7Zm9yKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4oKS52YWx1ZXMoKSkKY2hpbGQuc2VhcmNoVHJlZShtYXRjaEZ1bmN0aW9uLHJlc3VsdHMpO3JldHVybiByZXN1bHRzO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Ub3BEb3duTm9kZT1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Ob2Rle2NvbnN0cnVjdG9yKGlkLGV2ZW50LHBhcmVudCl7c3VwZXIoaWQsZXZlbnQpO3RoaXMuX3Jvb3Q9cGFyZW50JiZwYXJlbnQuX3Jvb3Q7dGhpcy5faGFzQ2hpbGRyZW49ZmFsc2U7dGhpcy5fY2hpbGRyZW49bnVsbDt0aGlzLnBhcmVudD1wYXJlbnQ7fQpoYXNDaGlsZHJlbigpe3JldHVybiB0aGlzLl9oYXNDaGlsZHJlbjt9CmNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVufHx0aGlzLl9idWlsZENoaWxkcmVuKCk7fQpfYnVpbGRDaGlsZHJlbigpe2NvbnN0IHBhdGg9W107Zm9yKGxldCBub2RlPXRoaXM7bm9kZS5wYXJlbnQmJiFub2RlLl9pc0dyb3VwTm9kZTtub2RlPW5vZGUucGFyZW50KQpwYXRoLnB1c2goKG5vZGUpKTtwYXRoLnJldmVyc2UoKTtjb25zdCBjaGlsZHJlbj1uZXcgTWFwKCk7Y29uc3Qgc2VsZj10aGlzO2NvbnN0IHJvb3Q9dGhpcy5fcm9vdDtjb25zdCBzdGFydFRpbWU9cm9vdC5fc3RhcnRUaW1lO2NvbnN0IGVuZFRpbWU9cm9vdC5fZW5kVGltZTtjb25zdCBpbnN0YW50RXZlbnRDYWxsYmFjaz1yb290Ll9kb05vdEFnZ3JlZ2F0ZT9vbkluc3RhbnRFdmVudDp1bmRlZmluZWQ7Y29uc3QgZXZlbnRJZENhbGxiYWNrPXJvb3QuX2RvTm90QWdncmVnYXRlP3VuZGVmaW5lZDpUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuX2V2ZW50SWQ7Y29uc3QgZXZlbnRHcm91cElkQ2FsbGJhY2s9cm9vdC5fZXZlbnRHcm91cElkQ2FsbGJhY2s7bGV0IGRlcHRoPTA7bGV0IG1hdGNoZWREZXB0aD0wO2xldCBjdXJyZW50RGlyZWN0Q2hpbGQ9bnVsbDtUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuZm9yRWFjaEV2ZW50KHJvb3QuX2V2ZW50cyxvblN0YXJ0RXZlbnQsb25FbmRFdmVudCxpbnN0YW50RXZlbnRDYWxsYmFjayxzdGFydFRpbWUsZW5kVGltZSxyb290Ll9maWx0ZXIpO2Z1bmN0aW9uIG9uU3RhcnRFdmVudChlKXsrK2RlcHRoO2lmKGRlcHRoPnBhdGgubGVuZ3RoKzIpCnJldHVybjtpZighbWF0Y2hQYXRoKGUpKQpyZXR1cm47Y29uc3QgZHVyYXRpb249TWF0aC5taW4oZW5kVGltZSxlLmVuZFRpbWUpLU1hdGgubWF4KHN0YXJ0VGltZSxlLnN0YXJ0VGltZSk7aWYoZHVyYXRpb248MCkKY29uc29sZS5lcnJvcignTmVnYXRpdmUgZXZlbnQgZHVyYXRpb24nKTtwcm9jZXNzRXZlbnQoZSxkdXJhdGlvbik7fQpmdW5jdGlvbiBvbkluc3RhbnRFdmVudChlKXsrK2RlcHRoO2lmKG1hdGNoZWREZXB0aD09PXBhdGgubGVuZ3RoJiZkZXB0aDw9cGF0aC5sZW5ndGgrMikKcHJvY2Vzc0V2ZW50KGUsMCk7LS1kZXB0aDt9CmZ1bmN0aW9uIHByb2Nlc3NFdmVudChlLGR1cmF0aW9uKXtpZihkZXB0aD09PXBhdGgubGVuZ3RoKzIpe2N1cnJlbnREaXJlY3RDaGlsZC5faGFzQ2hpbGRyZW49dHJ1ZTtjdXJyZW50RGlyZWN0Q2hpbGQuc2VsZlRpbWUtPWR1cmF0aW9uO3JldHVybjt9CmxldCBpZDtsZXQgZ3JvdXBJZD0nJztpZighZXZlbnRJZENhbGxiYWNrKXtpZD1TeW1ib2woJ3VuaXF1ZUlkJyk7fWVsc2V7aWQ9ZXZlbnRJZENhbGxiYWNrKGUpO2dyb3VwSWQ9ZXZlbnRHcm91cElkQ2FsbGJhY2s/ZXZlbnRHcm91cElkQ2FsbGJhY2soZSk6Jyc7aWYoZ3JvdXBJZCkKaWQrPScvJytncm91cElkO30KbGV0IG5vZGU9Y2hpbGRyZW4uZ2V0KGlkKTtpZighbm9kZSl7bm9kZT1uZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLlRvcERvd25Ob2RlKGlkLGUsc2VsZik7bm9kZS5fZ3JvdXBJZD1ncm91cElkO2NoaWxkcmVuLnNldChpZCxub2RlKTt9Cm5vZGUuc2VsZlRpbWUrPWR1cmF0aW9uO25vZGUudG90YWxUaW1lKz1kdXJhdGlvbjtjdXJyZW50RGlyZWN0Q2hpbGQ9bm9kZTt9CmZ1bmN0aW9uIG1hdGNoUGF0aChlKXtpZihtYXRjaGVkRGVwdGg9PT1wYXRoLmxlbmd0aCkKcmV0dXJuIHRydWU7aWYobWF0Y2hlZERlcHRoIT09ZGVwdGgtMSkKcmV0dXJuIGZhbHNlO2lmKCFlLmVuZFRpbWUpCnJldHVybiBmYWxzZTtpZighZXZlbnRJZENhbGxiYWNrKXtpZihlPT09cGF0aFttYXRjaGVkRGVwdGhdLmV2ZW50KQorK21hdGNoZWREZXB0aDtyZXR1cm4gZmFsc2U7fQpsZXQgaWQ9ZXZlbnRJZENhbGxiYWNrKGUpO2NvbnN0IGdyb3VwSWQ9ZXZlbnRHcm91cElkQ2FsbGJhY2s/ZXZlbnRHcm91cElkQ2FsbGJhY2soZSk6Jyc7aWYoZ3JvdXBJZCkKaWQrPScvJytncm91cElkO2lmKGlkPT09cGF0aFttYXRjaGVkRGVwdGhdLmlkKQorK21hdGNoZWREZXB0aDtyZXR1cm4gZmFsc2U7fQpmdW5jdGlvbiBvbkVuZEV2ZW50KGUpey0tZGVwdGg7aWYobWF0Y2hlZERlcHRoPmRlcHRoKQptYXRjaGVkRGVwdGg9ZGVwdGg7fQp0aGlzLl9jaGlsZHJlbj1jaGlsZHJlbjtyZXR1cm4gY2hpbGRyZW47fX07VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLlRvcERvd25Sb290Tm9kZT1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Ub3BEb3duTm9kZXtjb25zdHJ1Y3RvcihldmVudHMsZmlsdGVycyxzdGFydFRpbWUsZW5kVGltZSxkb05vdEFnZ3JlZ2F0ZSxldmVudEdyb3VwSWRDYWxsYmFjayl7c3VwZXIoJycsbnVsbCxudWxsKTt0aGlzLl9yb290PXRoaXM7dGhpcy5fZXZlbnRzPWV2ZW50czt0aGlzLl9maWx0ZXI9ZT0+ZmlsdGVycy5ldmVyeShmPT5mLmFjY2VwdChlKSk7dGhpcy5fc3RhcnRUaW1lPXN0YXJ0VGltZTt0aGlzLl9lbmRUaW1lPWVuZFRpbWU7dGhpcy5fZXZlbnRHcm91cElkQ2FsbGJhY2s9ZXZlbnRHcm91cElkQ2FsbGJhY2s7dGhpcy5fZG9Ob3RBZ2dyZWdhdGU9ZG9Ob3RBZ2dyZWdhdGU7dGhpcy50b3RhbFRpbWU9ZW5kVGltZS1zdGFydFRpbWU7dGhpcy5zZWxmVGltZT10aGlzLnRvdGFsVGltZTt9CmNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVufHx0aGlzLl9ncm91cHBlZFRvcE5vZGVzKCk7fQpfZ3JvdXBwZWRUb3BOb2Rlcygpe2NvbnN0IGZsYXROb2Rlcz1zdXBlci5jaGlsZHJlbigpO2Zvcihjb25zdCBub2RlIG9mIGZsYXROb2Rlcy52YWx1ZXMoKSkKdGhpcy5zZWxmVGltZS09bm9kZS50b3RhbFRpbWU7aWYoIXRoaXMuX2V2ZW50R3JvdXBJZENhbGxiYWNrKQpyZXR1cm4gZmxhdE5vZGVzO2NvbnN0IGdyb3VwTm9kZXM9bmV3IE1hcCgpO2Zvcihjb25zdCBub2RlIG9mIGZsYXROb2Rlcy52YWx1ZXMoKSl7Y29uc3QgZ3JvdXBJZD10aGlzLl9ldmVudEdyb3VwSWRDYWxsYmFjaygobm9kZS5ldmVudCkpO2xldCBncm91cE5vZGU9Z3JvdXBOb2Rlcy5nZXQoZ3JvdXBJZCk7aWYoIWdyb3VwTm9kZSl7Z3JvdXBOb2RlPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuR3JvdXBOb2RlKGdyb3VwSWQsdGhpcywobm9kZS5ldmVudCkpO2dyb3VwTm9kZXMuc2V0KGdyb3VwSWQsZ3JvdXBOb2RlKTt9Cmdyb3VwTm9kZS5hZGRDaGlsZChub2RlLG5vZGUuc2VsZlRpbWUsbm9kZS50b3RhbFRpbWUpO30KdGhpcy5fY2hpbGRyZW49Z3JvdXBOb2RlcztyZXR1cm4gZ3JvdXBOb2Rlczt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuQm90dG9tVXBSb290Tm9kZT1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Ob2Rle2NvbnN0cnVjdG9yKGV2ZW50cyxmaWx0ZXJzLHN0YXJ0VGltZSxlbmRUaW1lLGV2ZW50R3JvdXBJZENhbGxiYWNrKXtzdXBlcignJyxudWxsKTt0aGlzLl9jaGlsZHJlbj1udWxsO3RoaXMuX2V2ZW50cz1ldmVudHM7dGhpcy5fZmlsdGVyPWU9PmZpbHRlcnMuZXZlcnkoZj0+Zi5hY2NlcHQoZSkpO3RoaXMuX3N0YXJ0VGltZT1zdGFydFRpbWU7dGhpcy5fZW5kVGltZT1lbmRUaW1lO3RoaXMuX2V2ZW50R3JvdXBJZENhbGxiYWNrPWV2ZW50R3JvdXBJZENhbGxiYWNrO3RoaXMudG90YWxUaW1lPWVuZFRpbWUtc3RhcnRUaW1lO30KaGFzQ2hpbGRyZW4oKXtyZXR1cm4gdHJ1ZTt9CmNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVufHx0aGlzLl9ncm91cHBlZFRvcE5vZGVzKCk7fQpfdW5ncm91cHBlZFRvcE5vZGVzKCl7Y29uc3Qgcm9vdD10aGlzO2NvbnN0IHN0YXJ0VGltZT10aGlzLl9zdGFydFRpbWU7Y29uc3QgZW5kVGltZT10aGlzLl9lbmRUaW1lO2NvbnN0IG5vZGVCeUlkPW5ldyBNYXAoKTtjb25zdCBzZWxmVGltZVN0YWNrPVtlbmRUaW1lLXN0YXJ0VGltZV07Y29uc3QgZmlyc3ROb2RlU3RhY2s9W107Y29uc3QgdG90YWxUaW1lQnlJZD1uZXcgTWFwKCk7VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLmZvckVhY2hFdmVudCh0aGlzLl9ldmVudHMsb25TdGFydEV2ZW50LG9uRW5kRXZlbnQsdW5kZWZpbmVkLHN0YXJ0VGltZSxlbmRUaW1lLHRoaXMuX2ZpbHRlcik7ZnVuY3Rpb24gb25TdGFydEV2ZW50KGUpe2NvbnN0IGR1cmF0aW9uPU1hdGgubWluKGUuZW5kVGltZSxlbmRUaW1lKS1NYXRoLm1heChlLnN0YXJ0VGltZSxzdGFydFRpbWUpO3NlbGZUaW1lU3RhY2tbc2VsZlRpbWVTdGFjay5sZW5ndGgtMV0tPWR1cmF0aW9uO3NlbGZUaW1lU3RhY2sucHVzaChkdXJhdGlvbik7Y29uc3QgaWQ9VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLl9ldmVudElkKGUpO2NvbnN0IG5vTm9kZU9uU3RhY2s9IXRvdGFsVGltZUJ5SWQuaGFzKGlkKTtpZihub05vZGVPblN0YWNrKQp0b3RhbFRpbWVCeUlkLnNldChpZCxkdXJhdGlvbik7Zmlyc3ROb2RlU3RhY2sucHVzaChub05vZGVPblN0YWNrKTt9CmZ1bmN0aW9uIG9uRW5kRXZlbnQoZSl7Y29uc3QgaWQ9VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLl9ldmVudElkKGUpO2xldCBub2RlPW5vZGVCeUlkLmdldChpZCk7aWYoIW5vZGUpe25vZGU9bmV3IFRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Cb3R0b21VcE5vZGUocm9vdCxpZCxlLHRydWUscm9vdCk7bm9kZUJ5SWQuc2V0KGlkLG5vZGUpO30Kbm9kZS5zZWxmVGltZSs9c2VsZlRpbWVTdGFjay5wb3AoKTtpZihmaXJzdE5vZGVTdGFjay5wb3AoKSl7bm9kZS50b3RhbFRpbWUrPXRvdGFsVGltZUJ5SWQuZ2V0KGlkKTt0b3RhbFRpbWVCeUlkLmRlbGV0ZShpZCk7fX0KdGhpcy5zZWxmVGltZT1zZWxmVGltZVN0YWNrLnBvcCgpO2Zvcihjb25zdCBwYWlyIG9mIG5vZGVCeUlkKXtpZihwYWlyWzFdLnNlbGZUaW1lPD0wKQpub2RlQnlJZC5kZWxldGUoKHBhaXJbMF0pKTt9CnJldHVybiBub2RlQnlJZDt9Cl9ncm91cHBlZFRvcE5vZGVzKCl7Y29uc3QgZmxhdE5vZGVzPXRoaXMuX3VuZ3JvdXBwZWRUb3BOb2RlcygpO2lmKCF0aGlzLl9ldmVudEdyb3VwSWRDYWxsYmFjayl7dGhpcy5fY2hpbGRyZW49ZmxhdE5vZGVzO3JldHVybiBmbGF0Tm9kZXM7fQpjb25zdCBncm91cE5vZGVzPW5ldyBNYXAoKTtmb3IoY29uc3Qgbm9kZSBvZiBmbGF0Tm9kZXMudmFsdWVzKCkpe2NvbnN0IGdyb3VwSWQ9dGhpcy5fZXZlbnRHcm91cElkQ2FsbGJhY2soKG5vZGUuZXZlbnQpKTtsZXQgZ3JvdXBOb2RlPWdyb3VwTm9kZXMuZ2V0KGdyb3VwSWQpO2lmKCFncm91cE5vZGUpe2dyb3VwTm9kZT1uZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLkdyb3VwTm9kZShncm91cElkLHRoaXMsKG5vZGUuZXZlbnQpKTtncm91cE5vZGVzLnNldChncm91cElkLGdyb3VwTm9kZSk7fQpncm91cE5vZGUuYWRkQ2hpbGQobm9kZSxub2RlLnNlbGZUaW1lLG5vZGUuc2VsZlRpbWUpO30KdGhpcy5fY2hpbGRyZW49Z3JvdXBOb2RlcztyZXR1cm4gZ3JvdXBOb2Rlczt9fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuR3JvdXBOb2RlPWNsYXNzIGV4dGVuZHMgVGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLk5vZGV7Y29uc3RydWN0b3IoaWQscGFyZW50LGV2ZW50KXtzdXBlcihpZCxldmVudCk7dGhpcy5fY2hpbGRyZW49bmV3IE1hcCgpO3RoaXMucGFyZW50PXBhcmVudDt0aGlzLl9pc0dyb3VwTm9kZT10cnVlO30KYWRkQ2hpbGQoY2hpbGQsc2VsZlRpbWUsdG90YWxUaW1lKXt0aGlzLl9jaGlsZHJlbi5zZXQoY2hpbGQuaWQsY2hpbGQpO3RoaXMuc2VsZlRpbWUrPXNlbGZUaW1lO3RoaXMudG90YWxUaW1lKz10b3RhbFRpbWU7Y2hpbGQucGFyZW50PXRoaXM7fQpoYXNDaGlsZHJlbigpe3JldHVybiB0cnVlO30KY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fY2hpbGRyZW47fX07VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLkJvdHRvbVVwTm9kZT1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5Ob2Rle2NvbnN0cnVjdG9yKHJvb3QsaWQsZXZlbnQsaGFzQ2hpbGRyZW4scGFyZW50KXtzdXBlcihpZCxldmVudCk7dGhpcy5wYXJlbnQ9cGFyZW50O3RoaXMuX3Jvb3Q9cm9vdDt0aGlzLl9kZXB0aD0ocGFyZW50Ll9kZXB0aHx8MCkrMTt0aGlzLl9jYWNoZWRDaGlsZHJlbj1udWxsO3RoaXMuX2hhc0NoaWxkcmVuPWhhc0NoaWxkcmVuO30KaGFzQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5faGFzQ2hpbGRyZW47fQpjaGlsZHJlbigpe2lmKHRoaXMuX2NhY2hlZENoaWxkcmVuKQpyZXR1cm4gdGhpcy5fY2FjaGVkQ2hpbGRyZW47Y29uc3Qgc2VsZlRpbWVTdGFjaz1bMF07Y29uc3QgZXZlbnRJZFN0YWNrPVtdO2NvbnN0IGV2ZW50U3RhY2s9W107Y29uc3Qgbm9kZUJ5SWQ9bmV3IE1hcCgpO2NvbnN0IHN0YXJ0VGltZT10aGlzLl9yb290Ll9zdGFydFRpbWU7Y29uc3QgZW5kVGltZT10aGlzLl9yb290Ll9lbmRUaW1lO2xldCBsYXN0VGltZU1hcmtlcj1zdGFydFRpbWU7Y29uc3Qgc2VsZj10aGlzO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5mb3JFYWNoRXZlbnQodGhpcy5fcm9vdC5fZXZlbnRzLG9uU3RhcnRFdmVudCxvbkVuZEV2ZW50LHVuZGVmaW5lZCxzdGFydFRpbWUsZW5kVGltZSx0aGlzLl9yb290Ll9maWx0ZXIpO2Z1bmN0aW9uIG9uU3RhcnRFdmVudChlKXtjb25zdCBkdXJhdGlvbj1NYXRoLm1pbihlLmVuZFRpbWUsZW5kVGltZSktTWF0aC5tYXgoZS5zdGFydFRpbWUsc3RhcnRUaW1lKTtpZihkdXJhdGlvbjwwKQpjb25zb2xlLmFzc2VydChmYWxzZSwnTmVnYXRpdmUgZHVyYXRpb24gb2YgYW4gZXZlbnQnKTtzZWxmVGltZVN0YWNrW3NlbGZUaW1lU3RhY2subGVuZ3RoLTFdLT1kdXJhdGlvbjtzZWxmVGltZVN0YWNrLnB1c2goZHVyYXRpb24pO2NvbnN0IGlkPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5fZXZlbnRJZChlKTtldmVudElkU3RhY2sucHVzaChpZCk7ZXZlbnRTdGFjay5wdXNoKGUpO30KZnVuY3Rpb24gb25FbmRFdmVudChlKXtjb25zdCBzZWxmVGltZT1zZWxmVGltZVN0YWNrLnBvcCgpO2NvbnN0IGlkPWV2ZW50SWRTdGFjay5wb3AoKTtldmVudFN0YWNrLnBvcCgpO2xldCBub2RlO2Zvcihub2RlPXNlbGY7bm9kZS5fZGVwdGg+MTtub2RlPW5vZGUucGFyZW50KXtpZihub2RlLmlkIT09ZXZlbnRJZFN0YWNrW2V2ZW50SWRTdGFjay5sZW5ndGgrMS1ub2RlLl9kZXB0aF0pCnJldHVybjt9CmlmKG5vZGUuaWQhPT1pZHx8ZXZlbnRJZFN0YWNrLmxlbmd0aDxzZWxmLl9kZXB0aCkKcmV0dXJuO2NvbnN0IGNoaWxkSWQ9ZXZlbnRJZFN0YWNrW2V2ZW50SWRTdGFjay5sZW5ndGgtc2VsZi5fZGVwdGhdO25vZGU9bm9kZUJ5SWQuZ2V0KGNoaWxkSWQpO2lmKCFub2RlKXtjb25zdCBldmVudD1ldmVudFN0YWNrW2V2ZW50U3RhY2subGVuZ3RoLXNlbGYuX2RlcHRoXTtjb25zdCBoYXNDaGlsZHJlbj1ldmVudFN0YWNrLmxlbmd0aD5zZWxmLl9kZXB0aDtub2RlPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuQm90dG9tVXBOb2RlKHNlbGYuX3Jvb3QsY2hpbGRJZCxldmVudCxoYXNDaGlsZHJlbixzZWxmKTtub2RlQnlJZC5zZXQoY2hpbGRJZCxub2RlKTt9CmNvbnN0IHRvdGFsVGltZT1NYXRoLm1pbihlLmVuZFRpbWUsZW5kVGltZSktTWF0aC5tYXgoZS5zdGFydFRpbWUsbGFzdFRpbWVNYXJrZXIpO25vZGUuc2VsZlRpbWUrPXNlbGZUaW1lO25vZGUudG90YWxUaW1lKz10b3RhbFRpbWU7bGFzdFRpbWVNYXJrZXI9TWF0aC5taW4oZS5lbmRUaW1lLGVuZFRpbWUpO30KdGhpcy5fY2FjaGVkQ2hpbGRyZW49bm9kZUJ5SWQ7cmV0dXJuIG5vZGVCeUlkO30Kc2VhcmNoVHJlZShtYXRjaEZ1bmN0aW9uLHJlc3VsdHMpe3Jlc3VsdHM9cmVzdWx0c3x8W107aWYodGhpcy5ldmVudCYmbWF0Y2hGdW5jdGlvbih0aGlzLmV2ZW50KSkKcmVzdWx0cy5wdXNoKHRoaXMpO3JldHVybiByZXN1bHRzO319O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5ldmVudFVSTD1mdW5jdGlvbihldmVudCl7Y29uc3QgZGF0YT1ldmVudC5hcmdzWydkYXRhJ118fGV2ZW50LmFyZ3NbJ2JlZ2luRGF0YSddO2lmKGRhdGEmJmRhdGFbJ3VybCddKQpyZXR1cm4gZGF0YVsndXJsJ107bGV0IGZyYW1lPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5ldmVudFN0YWNrRnJhbWUoZXZlbnQpO3doaWxlKGZyYW1lKXtjb25zdCB1cmw9ZnJhbWVbJ3VybCddO2lmKHVybCkKcmV0dXJuIHVybDtmcmFtZT1mcmFtZS5wYXJlbnQ7fQpyZXR1cm4gbnVsbDt9O1RpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5ldmVudFN0YWNrRnJhbWU9ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5KU0ZyYW1lKQpyZXR1cm4oZXZlbnQuYXJnc1snZGF0YSddfHxudWxsKTtyZXR1cm4gVGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLnRvcEZyYW1lKCk7fTtUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuX2V2ZW50SWQ9ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5UaW1lU3RhbXApCnJldHVybmAke2V2ZW50Lm5hbWV9OiR7ZXZlbnQuYXJncy5kYXRhLm1lc3NhZ2V9YDtpZihldmVudC5uYW1lIT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSlNGcmFtZSkKcmV0dXJuIGV2ZW50Lm5hbWU7Y29uc3QgZnJhbWU9ZXZlbnQuYXJnc1snZGF0YSddO2NvbnN0IGxvY2F0aW9uPWZyYW1lWydzY3JpcHRJZCddfHxmcmFtZVsndXJsJ118fCcnO2NvbnN0IGZ1bmN0aW9uTmFtZT1mcmFtZVsnZnVuY3Rpb25OYW1lJ107Y29uc3QgbmFtZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lSlNQcm9maWxlUHJvY2Vzc29yLmlzTmF0aXZlUnVudGltZUZyYW1lKGZyYW1lKT9UaW1lbGluZU1vZGVsLlRpbWVsaW5lSlNQcm9maWxlUHJvY2Vzc29yLm5hdGl2ZUdyb3VwKGZ1bmN0aW9uTmFtZSl8fGZ1bmN0aW9uTmFtZTpgJHtmdW5jdGlvbk5hbWV9OiR7ZnJhbWVbJ2xpbmVOdW1iZXInXX06JHtmcmFtZVsnY29sdW1uTnVtYmVyJ119YDtyZXR1cm5gZjoke25hbWV9QCR7bG9jYXRpb259YDt9OztUaW1lbGluZS5Db3VudGVyc0dyYXBoPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihkZWxlZ2F0ZSl7c3VwZXIoKTt0aGlzLmVsZW1lbnQuaWQ9J21lbW9yeS1ncmFwaHMtY29udGFpbmVyJzt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl9jYWxjdWxhdG9yPW5ldyBUaW1lbGluZS5Db3VudGVyc0dyYXBoLkNhbGN1bGF0b3IoKTt0aGlzLl9oZWFkZXI9bmV3IFVJLkhCb3goKTt0aGlzLl9oZWFkZXIuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1tZW1vcnktaGVhZGVyJyk7dGhpcy5faGVhZGVyLnNob3codGhpcy5lbGVtZW50KTt0aGlzLl90b29sYmFyPW5ldyBVSS5Ub29sYmFyKCd0aW1lbGluZS1tZW1vcnktdG9vbGJhcicpO3RoaXMuX2hlYWRlci5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3Rvb2xiYXIuZWxlbWVudCk7dGhpcy5fZ3JhcGhzQ29udGFpbmVyPW5ldyBVSS5WQm94KCk7dGhpcy5fZ3JhcGhzQ29udGFpbmVyLnNob3codGhpcy5lbGVtZW50KTtjb25zdCBjYW52YXNXaWRnZXQ9bmV3IFVJLlZCb3hXaXRoUmVzaXplQ2FsbGJhY2sodGhpcy5fcmVzaXplLmJpbmQodGhpcykpO2NhbnZhc1dpZGdldC5zaG93KHRoaXMuX2dyYXBoc0NvbnRhaW5lci5lbGVtZW50KTt0aGlzLl9jcmVhdGVDdXJyZW50VmFsdWVzQmFyKCk7dGhpcy5fY2FudmFzQ29udGFpbmVyPWNhbnZhc1dpZGdldC5lbGVtZW50O3RoaXMuX2NhbnZhc0NvbnRhaW5lci5pZD0nbWVtb3J5LWdyYXBocy1jYW52YXMtY29udGFpbmVyJzt0aGlzLl9jYW52YXM9dGhpcy5fY2FudmFzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdjYW52YXMnKTt0aGlzLl9jYW52YXMuaWQ9J21lbW9yeS1jb3VudGVycy1ncmFwaCc7dGhpcy5fY2FudmFzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsdGhpcy5fb25Nb3VzZU1vdmUuYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9jYW52YXNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2NhbnZhc0NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyx0aGlzLl9vbk1vdXNlTGVhdmUuYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9jYW52YXNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKSx0cnVlKTt0aGlzLl90aW1lbGluZUdyaWQ9bmV3IFBlcmZVSS5UaW1lbGluZUdyaWQoKTt0aGlzLl9jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fdGltZWxpbmVHcmlkLmRpdmlkZXJzRWxlbWVudCk7dGhpcy5fY291bnRlcnM9W107dGhpcy5fY291bnRlclVJPVtdO3RoaXMuX2NvdW50ZXJzQnlOYW1lPXt9O3RoaXMuX2NvdW50ZXJzQnlOYW1lWydqc0hlYXBTaXplVXNlZCddPXRoaXMuX2NyZWF0ZUNvdW50ZXIoQ29tbW9uLlVJU3RyaW5nKCdKUyBIZWFwJyksQ29tbW9uLlVJU3RyaW5nKCdKUyBIZWFwOiAlcycpLCdoc2woMjIwLCA5MCUsIDQzJSknLE51bWJlci5ieXRlc1RvU3RyaW5nKTt0aGlzLl9jb3VudGVyc0J5TmFtZVsnZG9jdW1lbnRzJ109dGhpcy5fY3JlYXRlQ291bnRlcihDb21tb24uVUlTdHJpbmcoJ0RvY3VtZW50cycpLENvbW1vbi5VSVN0cmluZygnRG9jdW1lbnRzOiAlcycpLCdoc2woMCwgOTAlLCA0MyUpJyk7dGhpcy5fY291bnRlcnNCeU5hbWVbJ25vZGVzJ109dGhpcy5fY3JlYXRlQ291bnRlcihDb21tb24uVUlTdHJpbmcoJ05vZGVzJyksQ29tbW9uLlVJU3RyaW5nKCdOb2RlczogJXMnKSwnaHNsKDEyMCwgOTAlLCA0MyUpJyk7dGhpcy5fY291bnRlcnNCeU5hbWVbJ2pzRXZlbnRMaXN0ZW5lcnMnXT10aGlzLl9jcmVhdGVDb3VudGVyKENvbW1vbi5VSVN0cmluZygnTGlzdGVuZXJzJyksQ29tbW9uLlVJU3RyaW5nKCdMaXN0ZW5lcnM6ICVzJyksJ2hzbCgzOCwgOTAlLCA0MyUpJyk7dGhpcy5fZ3B1TWVtb3J5Q291bnRlcj10aGlzLl9jcmVhdGVDb3VudGVyKENvbW1vbi5VSVN0cmluZygnR1BVIE1lbW9yeScpLENvbW1vbi5VSVN0cmluZygnR1BVIE1lbW9yeSBbS0JdOiAlcycpLCdoc2woMzAwLCA5MCUsIDQzJSknLE51bWJlci5ieXRlc1RvU3RyaW5nKTt0aGlzLl9jb3VudGVyc0J5TmFtZVsnZ3B1TWVtb3J5VXNlZEtCJ109dGhpcy5fZ3B1TWVtb3J5Q291bnRlcjt9CnNldE1vZGVsKG1vZGVsLHRyYWNrKXtpZih0aGlzLl9tb2RlbCE9PW1vZGVsKXtpZih0aGlzLl9tb2RlbCkKdGhpcy5fbW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihUaW1lbGluZS5QZXJmb3JtYW5jZU1vZGVsLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZCx0aGlzKTt0aGlzLl9tb2RlbD1tb2RlbDtpZih0aGlzLl9tb2RlbCkKdGhpcy5fbW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihUaW1lbGluZS5QZXJmb3JtYW5jZU1vZGVsLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZCx0aGlzKTt9CnRoaXMuX2NhbGN1bGF0b3Iuc2V0WmVyb1RpbWUobW9kZWw/bW9kZWwudGltZWxpbmVNb2RlbCgpLm1pbmltdW1SZWNvcmRUaW1lKCk6MCk7Zm9yKGxldCBpPTA7aTx0aGlzLl9jb3VudGVycy5sZW5ndGg7KytpKXt0aGlzLl9jb3VudGVyc1tpXS5yZXNldCgpO3RoaXMuX2NvdW50ZXJVSVtpXS5yZXNldCgpO30KdGhpcy5zY2hlZHVsZVJlZnJlc2goKTt0aGlzLl90cmFjaz10cmFjaztpZighdHJhY2spCnJldHVybjtjb25zdCBldmVudHM9dHJhY2suc3luY0V2ZW50cygpO2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV2ZW50PWV2ZW50c1tpXTtpZihldmVudC5uYW1lIT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuVXBkYXRlQ291bnRlcnMpCmNvbnRpbnVlO2NvbnN0IGNvdW50ZXJzPWV2ZW50LmFyZ3MuZGF0YTtpZighY291bnRlcnMpCnJldHVybjtmb3IoY29uc3QgbmFtZSBpbiBjb3VudGVycyl7Y29uc3QgY291bnRlcj10aGlzLl9jb3VudGVyc0J5TmFtZVtuYW1lXTtpZihjb3VudGVyKQpjb3VudGVyLmFwcGVuZFNhbXBsZShldmVudC5zdGFydFRpbWUsY291bnRlcnNbbmFtZV0pO30KY29uc3QgZ3B1TWVtb3J5TGltaXRDb3VudGVyTmFtZT0nZ3B1TWVtb3J5TGltaXRLQic7aWYoZ3B1TWVtb3J5TGltaXRDb3VudGVyTmFtZSBpbiBjb3VudGVycykKdGhpcy5fZ3B1TWVtb3J5Q291bnRlci5zZXRMaW1pdChjb3VudGVyc1tncHVNZW1vcnlMaW1pdENvdW50ZXJOYW1lXSk7fX0KX2NyZWF0ZUN1cnJlbnRWYWx1ZXNCYXIoKXt0aGlzLl9jdXJyZW50VmFsdWVzQmFyPXRoaXMuX2dyYXBoc0NvbnRhaW5lci5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKTt0aGlzLl9jdXJyZW50VmFsdWVzQmFyLmlkPSdjb3VudGVyLXZhbHVlcy1iYXInO30KX2NyZWF0ZUNvdW50ZXIodWlOYW1lLHVpVmFsdWVUZW1wbGF0ZSxjb2xvcixmb3JtYXR0ZXIpe2NvbnN0IGNvdW50ZXI9bmV3IFRpbWVsaW5lLkNvdW50ZXJzR3JhcGguQ291bnRlcigpO3RoaXMuX2NvdW50ZXJzLnB1c2goY291bnRlcik7dGhpcy5fY291bnRlclVJLnB1c2gobmV3IFRpbWVsaW5lLkNvdW50ZXJzR3JhcGguQ291bnRlclVJKHRoaXMsdWlOYW1lLHVpVmFsdWVUZW1wbGF0ZSxjb2xvcixjb3VudGVyLGZvcm1hdHRlcikpO3JldHVybiBjb3VudGVyO30KcmVzaXplckVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faGVhZGVyLmVsZW1lbnQ7fQpfcmVzaXplKCl7Y29uc3QgcGFyZW50RWxlbWVudD10aGlzLl9jYW52YXMucGFyZW50RWxlbWVudDt0aGlzLl9jYW52YXMud2lkdGg9cGFyZW50RWxlbWVudC5jbGllbnRXaWR0aCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9jYW52YXMuaGVpZ2h0PXBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3RoaXMuX2NhbGN1bGF0b3Iuc2V0RGlzcGxheVdpZHRoKHRoaXMuX2NhbnZhcy53aWR0aCk7dGhpcy5yZWZyZXNoKCk7fQpfb25XaW5kb3dDaGFuZ2VkKGV2ZW50KXtjb25zdCB3aW5kb3c9KGV2ZW50LmRhdGEud2luZG93KTt0aGlzLl9jYWxjdWxhdG9yLnNldFdpbmRvdyh3aW5kb3cubGVmdCx3aW5kb3cucmlnaHQpO3RoaXMuc2NoZWR1bGVSZWZyZXNoKCk7fQpzY2hlZHVsZVJlZnJlc2goKXtVSS5pbnZva2VPbmNlQWZ0ZXJCYXRjaFVwZGF0ZSh0aGlzLHRoaXMucmVmcmVzaCk7fQpkcmF3KCl7dGhpcy5fY2xlYXIoKTtmb3IoY29uc3QgY291bnRlciBvZiB0aGlzLl9jb3VudGVycyl7Y291bnRlci5fY2FsY3VsYXRlVmlzaWJsZUluZGV4ZXModGhpcy5fY2FsY3VsYXRvcik7Y291bnRlci5fY2FsY3VsYXRlWFZhbHVlcyh0aGlzLl9jYW52YXMud2lkdGgpO30KZm9yKGNvbnN0IGNvdW50ZXJVSSBvZiB0aGlzLl9jb3VudGVyVUkpCmNvdW50ZXJVSS5fZHJhd0dyYXBoKHRoaXMuX2NhbnZhcyk7fQpfb25DbGljayhldmVudCl7Y29uc3QgeD1ldmVudC54LXRoaXMuX2NhbnZhc0NvbnRhaW5lci50b3RhbE9mZnNldExlZnQoKTtsZXQgbWluRGlzdGFuY2U9SW5maW5pdHk7bGV0IGJlc3RUaW1lO2Zvcihjb25zdCBjb3VudGVyVUkgb2YgdGhpcy5fY291bnRlclVJKXtpZighY291bnRlclVJLmNvdW50ZXIudGltZXMubGVuZ3RoKQpjb250aW51ZTtjb25zdCBpbmRleD1jb3VudGVyVUkuX3JlY29yZEluZGV4QXQoeCk7Y29uc3QgZGlzdGFuY2U9TWF0aC5hYnMoeCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpby1jb3VudGVyVUkuY291bnRlci54W2luZGV4XSk7aWYoZGlzdGFuY2U8bWluRGlzdGFuY2Upe21pbkRpc3RhbmNlPWRpc3RhbmNlO2Jlc3RUaW1lPWNvdW50ZXJVSS5jb3VudGVyLnRpbWVzW2luZGV4XTt9fQppZihiZXN0VGltZSE9PXVuZGVmaW5lZCl7dGhpcy5fZGVsZWdhdGUuc2VsZWN0RW50cnlBdFRpbWUodGhpcy5fdHJhY2suZXZlbnRzLmxlbmd0aD90aGlzLl90cmFjay5ldmVudHM6dGhpcy5fdHJhY2suYXN5bmNFdmVudHMsYmVzdFRpbWUpO319Cl9vbk1vdXNlTGVhdmUoZXZlbnQpe2RlbGV0ZSB0aGlzLl9tYXJrZXJYUG9zaXRpb247dGhpcy5fY2xlYXJDdXJyZW50VmFsdWVBbmRNYXJrZXIoKTt9Cl9jbGVhckN1cnJlbnRWYWx1ZUFuZE1hcmtlcigpe2ZvcihsZXQgaT0wO2k8dGhpcy5fY291bnRlclVJLmxlbmd0aDtpKyspCnRoaXMuX2NvdW50ZXJVSVtpXS5fY2xlYXJDdXJyZW50VmFsdWVBbmRNYXJrZXIoKTt9Cl9vbk1vdXNlTW92ZShldmVudCl7Y29uc3QgeD1ldmVudC54LXRoaXMuX2NhbnZhc0NvbnRhaW5lci50b3RhbE9mZnNldExlZnQoKTt0aGlzLl9tYXJrZXJYUG9zaXRpb249eDt0aGlzLl9yZWZyZXNoQ3VycmVudFZhbHVlcygpO30KX3JlZnJlc2hDdXJyZW50VmFsdWVzKCl7aWYodGhpcy5fbWFya2VyWFBvc2l0aW9uPT09dW5kZWZpbmVkKQpyZXR1cm47Zm9yKGxldCBpPTA7aTx0aGlzLl9jb3VudGVyVUkubGVuZ3RoOysraSkKdGhpcy5fY291bnRlclVJW2ldLnVwZGF0ZUN1cnJlbnRWYWx1ZSh0aGlzLl9tYXJrZXJYUG9zaXRpb24pO30KcmVmcmVzaCgpe3RoaXMuX3RpbWVsaW5lR3JpZC51cGRhdGVEaXZpZGVycyh0aGlzLl9jYWxjdWxhdG9yKTt0aGlzLmRyYXcoKTt0aGlzLl9yZWZyZXNoQ3VycmVudFZhbHVlcygpO30KX2NsZWFyKCl7Y29uc3QgY3R4PXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2N0eC5jbGVhclJlY3QoMCwwLGN0eC5jYW52YXMud2lkdGgsY3R4LmNhbnZhcy5oZWlnaHQpO319O1RpbWVsaW5lLkNvdW50ZXJzR3JhcGguQ291bnRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudGltZXM9W107dGhpcy52YWx1ZXM9W107fQphcHBlbmRTYW1wbGUodGltZSx2YWx1ZSl7aWYodGhpcy52YWx1ZXMubGVuZ3RoJiZ0aGlzLnZhbHVlcy5wZWVrTGFzdCgpPT09dmFsdWUpCnJldHVybjt0aGlzLnRpbWVzLnB1c2godGltZSk7dGhpcy52YWx1ZXMucHVzaCh2YWx1ZSk7fQpyZXNldCgpe3RoaXMudGltZXM9W107dGhpcy52YWx1ZXM9W107fQpzZXRMaW1pdCh2YWx1ZSl7dGhpcy5fbGltaXRWYWx1ZT12YWx1ZTt9Cl9jYWxjdWxhdGVCb3VuZHMoKXtsZXQgbWF4VmFsdWU7bGV0IG1pblZhbHVlO2ZvcihsZXQgaT10aGlzLl9taW5pbXVtSW5kZXg7aTw9dGhpcy5fbWF4aW11bUluZGV4O2krKyl7Y29uc3QgdmFsdWU9dGhpcy52YWx1ZXNbaV07aWYobWluVmFsdWU9PT11bmRlZmluZWR8fHZhbHVlPG1pblZhbHVlKQptaW5WYWx1ZT12YWx1ZTtpZihtYXhWYWx1ZT09PXVuZGVmaW5lZHx8dmFsdWU+bWF4VmFsdWUpCm1heFZhbHVlPXZhbHVlO30KbWluVmFsdWU9bWluVmFsdWV8fDA7bWF4VmFsdWU9bWF4VmFsdWV8fDE7aWYodGhpcy5fbGltaXRWYWx1ZSl7aWYobWF4VmFsdWU+dGhpcy5fbGltaXRWYWx1ZSowLjUpCm1heFZhbHVlPU1hdGgubWF4KG1heFZhbHVlLHRoaXMuX2xpbWl0VmFsdWUpO21pblZhbHVlPU1hdGgubWluKG1pblZhbHVlLHRoaXMuX2xpbWl0VmFsdWUpO30KcmV0dXJue21pbjptaW5WYWx1ZSxtYXg6bWF4VmFsdWV9O30KX2NhbGN1bGF0ZVZpc2libGVJbmRleGVzKGNhbGN1bGF0b3Ipe2NvbnN0IHN0YXJ0PWNhbGN1bGF0b3IubWluaW11bUJvdW5kYXJ5KCk7Y29uc3QgZW5kPWNhbGN1bGF0b3IubWF4aW11bUJvdW5kYXJ5KCk7dGhpcy5fbWluaW11bUluZGV4PU51bWJlci5jb25zdHJhaW4odGhpcy50aW1lcy51cHBlckJvdW5kKHN0YXJ0KS0xLDAsdGhpcy50aW1lcy5sZW5ndGgtMSk7dGhpcy5fbWF4aW11bUluZGV4PU51bWJlci5jb25zdHJhaW4odGhpcy50aW1lcy5sb3dlckJvdW5kKGVuZCksMCx0aGlzLnRpbWVzLmxlbmd0aC0xKTt0aGlzLl9taW5UaW1lPXN0YXJ0O3RoaXMuX21heFRpbWU9ZW5kO30KX2NhbGN1bGF0ZVhWYWx1ZXMod2lkdGgpe2lmKCF0aGlzLnZhbHVlcy5sZW5ndGgpCnJldHVybjtjb25zdCB4RmFjdG9yPXdpZHRoLyh0aGlzLl9tYXhUaW1lLXRoaXMuX21pblRpbWUpO3RoaXMueD1uZXcgQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKTtmb3IobGV0IGk9dGhpcy5fbWluaW11bUluZGV4KzE7aTw9dGhpcy5fbWF4aW11bUluZGV4O2krKykKdGhpcy54W2ldPXhGYWN0b3IqKHRoaXMudGltZXNbaV0tdGhpcy5fbWluVGltZSk7fX07VGltZWxpbmUuQ291bnRlcnNHcmFwaC5Db3VudGVyVUk9Y2xhc3N7Y29uc3RydWN0b3IoY291bnRlcnNQYW5lLHRpdGxlLGN1cnJlbnRWYWx1ZUxhYmVsLGdyYXBoQ29sb3IsY291bnRlcixmb3JtYXR0ZXIpe3RoaXMuX2NvdW50ZXJzUGFuZT1jb3VudGVyc1BhbmU7dGhpcy5jb3VudGVyPWNvdW50ZXI7dGhpcy5fZm9ybWF0dGVyPWZvcm1hdHRlcnx8TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3I7dGhpcy5fc2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVDb3VudGVyc0dyYXBoLScrdGl0bGUsdHJ1ZSk7dGhpcy5fc2V0dGluZy5zZXRUaXRsZSh0aXRsZSk7dGhpcy5fZmlsdGVyPW5ldyBVSS5Ub29sYmFyU2V0dGluZ0NoZWNrYm94KHRoaXMuX3NldHRpbmcsdGl0bGUpO3RoaXMuX2ZpbHRlci5pbnB1dEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnLXRoZW1lLXByZXNlcnZlJyk7Y29uc3QgY29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGdyYXBoQ29sb3IpLnNldEFscGhhKDAuNSkuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTtpZihjb2xvcil7dGhpcy5fZmlsdGVyLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yPWNvbG9yO3RoaXMuX2ZpbHRlci5lbGVtZW50LmJvcmRlckNvbG9yPSd0cmFuc3BhcmVudCc7fQp0aGlzLl9maWx0ZXIuaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl90b2dnbGVDb3VudGVyR3JhcGguYmluZCh0aGlzKSk7Y291bnRlcnNQYW5lLl90b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2ZpbHRlcik7dGhpcy5fcmFuZ2U9dGhpcy5fZmlsdGVyLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdyYW5nZScpO3RoaXMuX3ZhbHVlPWNvdW50ZXJzUGFuZS5fY3VycmVudFZhbHVlc0Jhci5jcmVhdGVDaGlsZCgnc3BhbicsJ21lbW9yeS1jb3VudGVyLXZhbHVlJyk7dGhpcy5fdmFsdWUuc3R5bGUuY29sb3I9Z3JhcGhDb2xvcjt0aGlzLmdyYXBoQ29sb3I9Z3JhcGhDb2xvcjt0aGlzLmxpbWl0Q29sb3I9Q29tbW9uLkNvbG9yLnBhcnNlKGdyYXBoQ29sb3IpLnNldEFscGhhKDAuMykuYXNTdHJpbmcoQ29tbW9uLkNvbG9yLkZvcm1hdC5SR0JBKTt0aGlzLmdyYXBoWVZhbHVlcz1bXTt0aGlzLl92ZXJ0aWNhbFBhZGRpbmc9MTA7dGhpcy5fY3VycmVudFZhbHVlTGFiZWw9Y3VycmVudFZhbHVlTGFiZWw7dGhpcy5fbWFya2VyPWNvdW50ZXJzUGFuZS5fY2FudmFzQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnLCdtZW1vcnktY291bnRlci1tYXJrZXInKTt0aGlzLl9tYXJrZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPWdyYXBoQ29sb3I7dGhpcy5fY2xlYXJDdXJyZW50VmFsdWVBbmRNYXJrZXIoKTt9CnJlc2V0KCl7dGhpcy5fcmFuZ2UudGV4dENvbnRlbnQ9Jyc7fQpzZXRSYW5nZShtaW5WYWx1ZSxtYXhWYWx1ZSl7Y29uc3QgbWluPXRoaXMuX2Zvcm1hdHRlcihtaW5WYWx1ZSk7Y29uc3QgbWF4PXRoaXMuX2Zvcm1hdHRlcihtYXhWYWx1ZSk7dGhpcy5fcmFuZ2UudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdbJXNceGEwXHUyMDEzXHhhMCVzXScsbWluLG1heCk7fQpfdG9nZ2xlQ291bnRlckdyYXBoKGV2ZW50KXt0aGlzLl92YWx1ZS5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCF0aGlzLl9maWx0ZXIuY2hlY2tlZCgpKTt0aGlzLl9jb3VudGVyc1BhbmUucmVmcmVzaCgpO30KX3JlY29yZEluZGV4QXQoeCl7cmV0dXJuIHRoaXMuY291bnRlci54LnVwcGVyQm91bmQoeCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxudWxsLHRoaXMuY291bnRlci5fbWluaW11bUluZGV4KzEsdGhpcy5jb3VudGVyLl9tYXhpbXVtSW5kZXgrMSktCjE7fQp1cGRhdGVDdXJyZW50VmFsdWUoeCl7aWYoIXRoaXMudmlzaWJsZSgpfHwhdGhpcy5jb3VudGVyLnZhbHVlcy5sZW5ndGh8fCF0aGlzLmNvdW50ZXIueCkKcmV0dXJuO2NvbnN0IGluZGV4PXRoaXMuX3JlY29yZEluZGV4QXQoeCk7Y29uc3QgdmFsdWU9TnVtYmVyLndpdGhUaG91c2FuZHNTZXBhcmF0b3IodGhpcy5jb3VudGVyLnZhbHVlc1tpbmRleF0pO3RoaXMuX3ZhbHVlLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZyh0aGlzLl9jdXJyZW50VmFsdWVMYWJlbCx2YWx1ZSk7Y29uc3QgeT10aGlzLmdyYXBoWVZhbHVlc1tpbmRleF0vd2luZG93LmRldmljZVBpeGVsUmF0aW87dGhpcy5fbWFya2VyLnN0eWxlLmxlZnQ9eCsncHgnO3RoaXMuX21hcmtlci5zdHlsZS50b3A9eSsncHgnO3RoaXMuX21hcmtlci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTt9Cl9jbGVhckN1cnJlbnRWYWx1ZUFuZE1hcmtlcigpe3RoaXMuX3ZhbHVlLnRleHRDb250ZW50PScnO3RoaXMuX21hcmtlci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt9Cl9kcmF3R3JhcGgoY2FudmFzKXtjb25zdCBjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7Y29uc3Qgd2lkdGg9Y2FudmFzLndpZHRoO2NvbnN0IGhlaWdodD1jYW52YXMuaGVpZ2h0LTIqdGhpcy5fdmVydGljYWxQYWRkaW5nO2lmKGhlaWdodDw9MCl7dGhpcy5ncmFwaFlWYWx1ZXM9W107cmV0dXJuO30KY29uc3Qgb3JpZ2luWT10aGlzLl92ZXJ0aWNhbFBhZGRpbmc7Y29uc3QgY291bnRlcj10aGlzLmNvdW50ZXI7Y29uc3QgdmFsdWVzPWNvdW50ZXIudmFsdWVzO2lmKCF2YWx1ZXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgYm91bmRzPWNvdW50ZXIuX2NhbGN1bGF0ZUJvdW5kcygpO2NvbnN0IG1pblZhbHVlPWJvdW5kcy5taW47Y29uc3QgbWF4VmFsdWU9Ym91bmRzLm1heDt0aGlzLnNldFJhbmdlKG1pblZhbHVlLG1heFZhbHVlKTtpZighdGhpcy52aXNpYmxlKCkpCnJldHVybjtjb25zdCB5VmFsdWVzPXRoaXMuZ3JhcGhZVmFsdWVzO2NvbnN0IG1heFlSYW5nZT1tYXhWYWx1ZS1taW5WYWx1ZTtjb25zdCB5RmFjdG9yPW1heFlSYW5nZT9oZWlnaHQvKG1heFlSYW5nZSk6MTtjdHguc2F2ZSgpO2N0eC5saW5lV2lkdGg9d2luZG93LmRldmljZVBpeGVsUmF0aW87aWYoY3R4LmxpbmVXaWR0aCUyKQpjdHgudHJhbnNsYXRlKDAuNSwwLjUpO2N0eC5iZWdpblBhdGgoKTtsZXQgdmFsdWU9dmFsdWVzW2NvdW50ZXIuX21pbmltdW1JbmRleF07bGV0IGN1cnJlbnRZPU1hdGgucm91bmQob3JpZ2luWStoZWlnaHQtKHZhbHVlLW1pblZhbHVlKSp5RmFjdG9yKTtjdHgubW92ZVRvKDAsY3VycmVudFkpO2xldCBpPWNvdW50ZXIuX21pbmltdW1JbmRleDtmb3IoO2k8PWNvdW50ZXIuX21heGltdW1JbmRleDtpKyspe2NvbnN0IHg9TWF0aC5yb3VuZChjb3VudGVyLnhbaV0pO2N0eC5saW5lVG8oeCxjdXJyZW50WSk7Y29uc3QgY3VycmVudFZhbHVlPXZhbHVlc1tpXTtpZih0eXBlb2YgY3VycmVudFZhbHVlIT09J3VuZGVmaW5lZCcpCnZhbHVlPWN1cnJlbnRWYWx1ZTtjdXJyZW50WT1NYXRoLnJvdW5kKG9yaWdpblkraGVpZ2h0LSh2YWx1ZS1taW5WYWx1ZSkqeUZhY3Rvcik7Y3R4LmxpbmVUbyh4LGN1cnJlbnRZKTt5VmFsdWVzW2ldPWN1cnJlbnRZO30KeVZhbHVlcy5sZW5ndGg9aTtjdHgubGluZVRvKHdpZHRoLGN1cnJlbnRZKTtjdHguc3Ryb2tlU3R5bGU9dGhpcy5ncmFwaENvbG9yO2N0eC5zdHJva2UoKTtpZihjb3VudGVyLl9saW1pdFZhbHVlKXtjb25zdCBsaW1pdExpbmVZPU1hdGgucm91bmQob3JpZ2luWStoZWlnaHQtKGNvdW50ZXIuX2xpbWl0VmFsdWUtbWluVmFsdWUpKnlGYWN0b3IpO2N0eC5tb3ZlVG8oMCxsaW1pdExpbmVZKTtjdHgubGluZVRvKHdpZHRoLGxpbWl0TGluZVkpO2N0eC5zdHJva2VTdHlsZT10aGlzLmxpbWl0Q29sb3I7Y3R4LnN0cm9rZSgpO30KY3R4LmNsb3NlUGF0aCgpO2N0eC5yZXN0b3JlKCk7fQp2aXNpYmxlKCl7cmV0dXJuIHRoaXMuX2ZpbHRlci5jaGVja2VkKCk7fX07VGltZWxpbmUuQ291bnRlcnNHcmFwaC5DYWxjdWxhdG9yPWNsYXNze3NldFplcm9UaW1lKHRpbWUpe3RoaXMuX3plcm9UaW1lPXRpbWU7fQpjb21wdXRlUG9zaXRpb24odGltZSl7cmV0dXJuKHRpbWUtdGhpcy5fbWluaW11bUJvdW5kYXJ5KS90aGlzLmJvdW5kYXJ5U3BhbigpKnRoaXMuX3dvcmtpbmdBcmVhO30Kc2V0V2luZG93KG1pbmltdW1Cb3VuZGFyeSxtYXhpbXVtQm91bmRhcnkpe3RoaXMuX21pbmltdW1Cb3VuZGFyeT1taW5pbXVtQm91bmRhcnk7dGhpcy5fbWF4aW11bUJvdW5kYXJ5PW1heGltdW1Cb3VuZGFyeTt9CnNldERpc3BsYXlXaWR0aChjbGllbnRXaWR0aCl7dGhpcy5fd29ya2luZ0FyZWE9Y2xpZW50V2lkdGg7fQpmb3JtYXRWYWx1ZSh2YWx1ZSxwcmVjaXNpb24pe3JldHVybiBOdW1iZXIucHJlY2lzZU1pbGxpc1RvU3RyaW5nKHZhbHVlLXRoaXMuemVyb1RpbWUoKSxwcmVjaXNpb24pO30KbWF4aW11bUJvdW5kYXJ5KCl7cmV0dXJuIHRoaXMuX21heGltdW1Cb3VuZGFyeTt9Cm1pbmltdW1Cb3VuZGFyeSgpe3JldHVybiB0aGlzLl9taW5pbXVtQm91bmRhcnk7fQp6ZXJvVGltZSgpe3JldHVybiB0aGlzLl96ZXJvVGltZTt9CmJvdW5kYXJ5U3Bhbigpe3JldHVybiB0aGlzLl9tYXhpbXVtQm91bmRhcnktdGhpcy5fbWluaW11bUJvdW5kYXJ5O319OztUaW1lbGluZS5FeHRlbnNpb25UcmFjaW5nU2Vzc2lvbj1jbGFzc3tjb25zdHJ1Y3Rvcihwcm92aWRlcixwZXJmb3JtYW5jZU1vZGVsKXt0aGlzLl9wcm92aWRlcj1wcm92aWRlcjt0aGlzLl9wZXJmb3JtYW5jZU1vZGVsPXBlcmZvcm1hbmNlTW9kZWw7dGhpcy5fY29tcGxldGlvbkNhbGxiYWNrO3RoaXMuX2NvbXBsZXRpb25Qcm9taXNlPW5ldyBQcm9taXNlKGZ1bGZpbGw9Pnt0aGlzLl9jb21wbGV0aW9uQ2FsbGJhY2s9ZnVsZmlsbDt9KTt0aGlzLl90aW1lT2Zmc2V0PTA7fQpsb2FkaW5nU3RhcnRlZCgpe30KcHJvY2Vzc2luZ1N0YXJ0ZWQoKXt9CmxvYWRpbmdQcm9ncmVzcyhwcm9ncmVzcyl7fQpsb2FkaW5nQ29tcGxldGUodHJhY2luZ01vZGVsKXtpZighdHJhY2luZ01vZGVsKQpyZXR1cm47dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5hZGRFeHRlbnNpb25FdmVudHModGhpcy5fcHJvdmlkZXIubG9uZ0Rpc3BsYXlOYW1lKCksdHJhY2luZ01vZGVsLHRoaXMuX3RpbWVPZmZzZXQpO3RoaXMuX2NvbXBsZXRpb25DYWxsYmFjaygpO30KY29tcGxldGUodXJsLHRpbWVPZmZzZXRNaWNyb3NlY29uZHMpe2lmKCF1cmwpe3RoaXMuX2NvbXBsZXRpb25DYWxsYmFjaygpO3JldHVybjt9CnRoaXMuX3RpbWVPZmZzZXQ9dGltZU9mZnNldE1pY3Jvc2Vjb25kcztUaW1lbGluZS5UaW1lbGluZUxvYWRlci5sb2FkRnJvbVVSTCh1cmwsdGhpcyk7fQpzdGFydCgpe3RoaXMuX3Byb3ZpZGVyLnN0YXJ0KHRoaXMpO30Kc3RvcCgpe3RoaXMuX3Byb3ZpZGVyLnN0b3AoKTtyZXR1cm4gdGhpcy5fY29tcGxldGlvblByb21pc2U7fX07O1RpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWw9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9tYWluVGFyZ2V0PW51bGw7dGhpcy5fdHJhY2luZ01vZGVsPW51bGw7dGhpcy5fZmlsdGVycz1bXTt0aGlzLl90aW1lbGluZU1vZGVsPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwoKTt0aGlzLl9mcmFtZU1vZGVsPW5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lRnJhbWVNb2RlbChldmVudD0+VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUoZXZlbnQpLmNhdGVnb3J5Lm5hbWUpO3RoaXMuX2ZpbG1TdHJpcE1vZGVsPW51bGw7dGhpcy5faXJNb2RlbD1uZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwoKTt0aGlzLl93aW5kb3c9e2xlZnQ6MCxyaWdodDpJbmZpbml0eX07dGhpcy5fZXh0ZW5zaW9uVHJhY2luZ01vZGVscz1bXTt0aGlzLl9yZWNvcmRTdGFydFRpbWU9dW5kZWZpbmVkO30Kc2V0TWFpblRhcmdldCh0YXJnZXQpe3RoaXMuX21haW5UYXJnZXQ9dGFyZ2V0O30Kc2V0UmVjb3JkU3RhcnRUaW1lKHRpbWUpe3RoaXMuX3JlY29yZFN0YXJ0VGltZT10aW1lO30KcmVjb3JkU3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3JlY29yZFN0YXJ0VGltZTt9CnNldEZpbHRlcnMoZmlsdGVycyl7dGhpcy5fZmlsdGVycz1maWx0ZXJzO30KZmlsdGVycygpe3JldHVybiB0aGlzLl9maWx0ZXJzO30KaXNWaXNpYmxlKGV2ZW50KXtyZXR1cm4gdGhpcy5fZmlsdGVycy5ldmVyeShmPT5mLmFjY2VwdChldmVudCkpO30Kc2V0VHJhY2luZ01vZGVsKG1vZGVsKXt0aGlzLl90cmFjaW5nTW9kZWw9bW9kZWw7dGhpcy5fdGltZWxpbmVNb2RlbC5zZXRFdmVudHMobW9kZWwpO2xldCBpbnB1dEV2ZW50cz1udWxsO2xldCBhbmltYXRpb25FdmVudHM9bnVsbDtmb3IoY29uc3QgdHJhY2sgb2YgdGhpcy5fdGltZWxpbmVNb2RlbC50cmFja3MoKSl7aWYodHJhY2sudHlwZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuSW5wdXQpCmlucHV0RXZlbnRzPXRyYWNrLmFzeW5jRXZlbnRzO2lmKHRyYWNrLnR5cGU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkFuaW1hdGlvbikKYW5pbWF0aW9uRXZlbnRzPXRyYWNrLmFzeW5jRXZlbnRzO30KaWYoaW5wdXRFdmVudHN8fGFuaW1hdGlvbkV2ZW50cykKdGhpcy5faXJNb2RlbC5wb3B1bGF0ZShpbnB1dEV2ZW50c3x8W10sYW5pbWF0aW9uRXZlbnRzfHxbXSk7Y29uc3QgbWFpblRyYWNrcz10aGlzLl90aW1lbGluZU1vZGVsLnRyYWNrcygpLmZpbHRlcih0cmFjaz0+dHJhY2sudHlwZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuTWFpblRocmVhZCYmdHJhY2suZm9yTWFpbkZyYW1lJiZ0cmFjay5ldmVudHMubGVuZ3RoKTtjb25zdCB0aHJlYWREYXRhPW1haW5UcmFja3MubWFwKHRyYWNrPT57Y29uc3QgZXZlbnQ9dHJhY2suZXZlbnRzWzBdO3JldHVybnt0aHJlYWQ6ZXZlbnQudGhyZWFkLHRpbWU6ZXZlbnQuc3RhcnRUaW1lfTt9KTt0aGlzLl9mcmFtZU1vZGVsLmFkZFRyYWNlRXZlbnRzKHRoaXMuX21haW5UYXJnZXQsdGhpcy5fdGltZWxpbmVNb2RlbC5pbnNwZWN0ZWRUYXJnZXRFdmVudHMoKSx0aHJlYWREYXRhKTtmb3IoY29uc3QgZW50cnkgb2YgdGhpcy5fZXh0ZW5zaW9uVHJhY2luZ01vZGVscyl7ZW50cnkubW9kZWwuYWRqdXN0VGltZSh0aGlzLl90cmFjaW5nTW9kZWwubWluaW11bVJlY29yZFRpbWUoKSsoZW50cnkudGltZU9mZnNldC8xMDAwKS10aGlzLl9yZWNvcmRTdGFydFRpbWUpO30KdGhpcy5fYXV0b1dpbmRvd1RpbWVzKCk7fQphZGRFeHRlbnNpb25FdmVudHModGl0bGUsbW9kZWwsdGltZU9mZnNldCl7dGhpcy5fZXh0ZW5zaW9uVHJhY2luZ01vZGVscy5wdXNoKHttb2RlbDptb2RlbCx0aXRsZTp0aXRsZSx0aW1lT2Zmc2V0OnRpbWVPZmZzZXR9KTtpZighdGhpcy5fdHJhY2luZ01vZGVsKQpyZXR1cm47bW9kZWwuYWRqdXN0VGltZSh0aGlzLl90cmFjaW5nTW9kZWwubWluaW11bVJlY29yZFRpbWUoKSsodGltZU9mZnNldC8xMDAwKS10aGlzLl9yZWNvcmRTdGFydFRpbWUpO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFRpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuRXZlbnRzLkV4dGVuc2lvbkRhdGFBZGRlZCk7fQp0cmFjaW5nTW9kZWwoKXtpZighdGhpcy5fdHJhY2luZ01vZGVsKQp0aHJvdydjYWxsIHNldFRyYWNpbmdNb2RlbCBiZWZvcmUgYWNjZXNzaW5nIFBlcmZvcm1hbmNlTW9kZWwnO3JldHVybiB0aGlzLl90cmFjaW5nTW9kZWw7fQp0aW1lbGluZU1vZGVsKCl7cmV0dXJuIHRoaXMuX3RpbWVsaW5lTW9kZWw7fQpmaWxtU3RyaXBNb2RlbCgpe2lmKHRoaXMuX2ZpbG1TdHJpcE1vZGVsKQpyZXR1cm4gdGhpcy5fZmlsbVN0cmlwTW9kZWw7aWYoIXRoaXMuX3RyYWNpbmdNb2RlbCkKdGhyb3cnY2FsbCBzZXRUcmFjaW5nTW9kZWwgYmVmb3JlIGFjY2Vzc2luZyBQZXJmb3JtYW5jZU1vZGVsJzt0aGlzLl9maWxtU3RyaXBNb2RlbD1uZXcgU0RLLkZpbG1TdHJpcE1vZGVsKHRoaXMuX3RyYWNpbmdNb2RlbCk7cmV0dXJuIHRoaXMuX2ZpbG1TdHJpcE1vZGVsO30KZnJhbWVzKCl7cmV0dXJuIHRoaXMuX2ZyYW1lTW9kZWwuZnJhbWVzKCk7fQpmcmFtZU1vZGVsKCl7cmV0dXJuIHRoaXMuX2ZyYW1lTW9kZWw7fQppbnRlcmFjdGlvblJlY29yZHMoKXtyZXR1cm4gdGhpcy5faXJNb2RlbC5pbnRlcmFjdGlvblJlY29yZHMoKTt9CmV4dGVuc2lvbkluZm8oKXtyZXR1cm4gdGhpcy5fZXh0ZW5zaW9uVHJhY2luZ01vZGVsczt9CmRpc3Bvc2UoKXtpZih0aGlzLl90cmFjaW5nTW9kZWwpCnRoaXMuX3RyYWNpbmdNb2RlbC5kaXNwb3NlKCk7Zm9yKGNvbnN0IGV4dGVuc2lvbkVudHJ5IG9mIHRoaXMuX2V4dGVuc2lvblRyYWNpbmdNb2RlbHMpCmV4dGVuc2lvbkVudHJ5Lm1vZGVsLmRpc3Bvc2UoKTt9CmZpbG1TdHJpcE1vZGVsRnJhbWUoZnJhbWUpe2NvbnN0IHNjcmVlbnNob3RUaW1lPWZyYW1lLmlkbGU/ZnJhbWUuc3RhcnRUaW1lOmZyYW1lLmVuZFRpbWU7Y29uc3QgZmlsbVN0cmlwRnJhbWU9dGhpcy5fZmlsbVN0cmlwTW9kZWwuZnJhbWVCeVRpbWVzdGFtcChzY3JlZW5zaG90VGltZSk7cmV0dXJuIGZpbG1TdHJpcEZyYW1lJiZmaWxtU3RyaXBGcmFtZS50aW1lc3RhbXAtZnJhbWUuZW5kVGltZTwxMD9maWxtU3RyaXBGcmFtZTpudWxsO30Kc2F2ZShzdHJlYW0pe2NvbnN0IGJhY2tpbmdTdG9yYWdlPSh0aGlzLl90cmFjaW5nTW9kZWwuYmFja2luZ1N0b3JhZ2UoKSk7cmV0dXJuIGJhY2tpbmdTdG9yYWdlLndyaXRlVG9TdHJlYW0oc3RyZWFtKTt9CnNldFdpbmRvdyh3aW5kb3csYW5pbWF0ZSl7dGhpcy5fd2luZG93PXdpbmRvdzt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhUaW1lbGluZS5QZXJmb3JtYW5jZU1vZGVsLkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHt3aW5kb3csYW5pbWF0ZX0pO30Kd2luZG93KCl7cmV0dXJuIHRoaXMuX3dpbmRvdzt9Cl9hdXRvV2luZG93VGltZXMoKXtjb25zdCB0aW1lbGluZU1vZGVsPXRoaXMuX3RpbWVsaW5lTW9kZWw7bGV0IHRhc2tzPVtdO2Zvcihjb25zdCB0cmFjayBvZiB0aW1lbGluZU1vZGVsLnRyYWNrcygpKXtpZih0cmFjay50eXBlPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5NYWluVGhyZWFkJiZ0cmFjay5mb3JNYWluRnJhbWUpCnRhc2tzPXRyYWNrLnRhc2tzO30KaWYoIXRhc2tzLmxlbmd0aCl7dGhpcy5zZXRXaW5kb3coe2xlZnQ6dGltZWxpbmVNb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpLHJpZ2h0OnRpbWVsaW5lTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKX0pO3JldHVybjt9CmZ1bmN0aW9uIGZpbmRMb3dVdGlsaXphdGlvblJlZ2lvbihzdGFydEluZGV4LHN0b3BJbmRleCl7Y29uc3QgdGhyZXNob2xkPTAuMTtsZXQgY3V0SW5kZXg9c3RhcnRJbmRleDtsZXQgY3V0VGltZT0odGFza3NbY3V0SW5kZXhdLnN0YXJ0VGltZSt0YXNrc1tjdXRJbmRleF0uZW5kVGltZSkvMjtsZXQgdXNlZFRpbWU9MDtjb25zdCBzdGVwPU1hdGguc2lnbihzdG9wSW5kZXgtc3RhcnRJbmRleCk7Zm9yKGxldCBpPXN0YXJ0SW5kZXg7aSE9PXN0b3BJbmRleDtpKz1zdGVwKXtjb25zdCB0YXNrPXRhc2tzW2ldO2NvbnN0IHRhc2tUaW1lPSh0YXNrLnN0YXJ0VGltZSt0YXNrLmVuZFRpbWUpLzI7Y29uc3QgaW50ZXJ2YWw9TWF0aC5hYnMoY3V0VGltZS10YXNrVGltZSk7aWYodXNlZFRpbWU8dGhyZXNob2xkKmludGVydmFsKXtjdXRJbmRleD1pO2N1dFRpbWU9dGFza1RpbWU7dXNlZFRpbWU9MDt9CnVzZWRUaW1lKz10YXNrLmR1cmF0aW9uO30KcmV0dXJuIGN1dEluZGV4O30KY29uc3QgcmlnaHRJbmRleD1maW5kTG93VXRpbGl6YXRpb25SZWdpb24odGFza3MubGVuZ3RoLTEsMCk7Y29uc3QgbGVmdEluZGV4PWZpbmRMb3dVdGlsaXphdGlvblJlZ2lvbigwLHJpZ2h0SW5kZXgpO2xldCBsZWZ0VGltZT10YXNrc1tsZWZ0SW5kZXhdLnN0YXJ0VGltZTtsZXQgcmlnaHRUaW1lPXRhc2tzW3JpZ2h0SW5kZXhdLmVuZFRpbWU7Y29uc3Qgc3Bhbj1yaWdodFRpbWUtbGVmdFRpbWU7Y29uc3QgdG90YWxTcGFuPXRpbWVsaW5lTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKS10aW1lbGluZU1vZGVsLm1pbmltdW1SZWNvcmRUaW1lKCk7aWYoc3Bhbjx0b3RhbFNwYW4qMC4xKXtsZWZ0VGltZT10aW1lbGluZU1vZGVsLm1pbmltdW1SZWNvcmRUaW1lKCk7cmlnaHRUaW1lPXRpbWVsaW5lTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKTt9ZWxzZXtsZWZ0VGltZT1NYXRoLm1heChsZWZ0VGltZS0wLjA1KnNwYW4sdGltZWxpbmVNb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpKTtyaWdodFRpbWU9TWF0aC5taW4ocmlnaHRUaW1lKzAuMDUqc3Bhbix0aW1lbGluZU1vZGVsLm1heGltdW1SZWNvcmRUaW1lKCkpO30KdGhpcy5zZXRXaW5kb3coe2xlZnQ6bGVmdFRpbWUscmlnaHQ6cmlnaHRUaW1lfSk7fX07VGltZWxpbmUuUGVyZm9ybWFuY2VNb2RlbC5FdmVudHM9e0V4dGVuc2lvbkRhdGFBZGRlZDpTeW1ib2woJ0V4dGVuc2lvbkRhdGFBZGRlZCcpLFdpbmRvd0NoYW5nZWQ6U3ltYm9sKCdXaW5kb3dDaGFuZ2VkJyl9O1RpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuV2luZG93OztUaW1lbGluZS5UaW1lbGluZUNvbnRyb2xsZXI9Y2xhc3N7Y29uc3RydWN0b3IodGFyZ2V0LGNsaWVudCl7dGhpcy5fdHJhY2luZ01hbmFnZXI9dGFyZ2V0Lm1vZGVsKFNESy5UcmFjaW5nTWFuYWdlcik7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbD1uZXcgVGltZWxpbmUuUGVyZm9ybWFuY2VNb2RlbCgpO3RoaXMuX3BlcmZvcm1hbmNlTW9kZWwuc2V0TWFpblRhcmdldCh0YXJnZXQpO3RoaXMuX2NsaWVudD1jbGllbnQ7Y29uc3QgYmFja2luZ1N0b3JhZ2U9bmV3IEJpbmRpbmdzLlRlbXBGaWxlQmFja2luZ1N0b3JhZ2UoKTt0aGlzLl90cmFjaW5nTW9kZWw9bmV3IFNESy5UcmFjaW5nTW9kZWwoYmFja2luZ1N0b3JhZ2UpO3RoaXMuX2V4dGVuc2lvblNlc3Npb25zPVtdO1NESy50YXJnZXRNYW5hZ2VyLm9ic2VydmVNb2RlbHMoU0RLLkNQVVByb2ZpbGVyTW9kZWwsdGhpcyk7fQpkaXNwb3NlKCl7U0RLLnRhcmdldE1hbmFnZXIudW5vYnNlcnZlTW9kZWxzKFNESy5DUFVQcm9maWxlck1vZGVsLHRoaXMpO30KbWFpblRhcmdldCgpe3JldHVybiB0aGlzLl90cmFjaW5nTWFuYWdlci50YXJnZXQoKTt9CnN0YXJ0UmVjb3JkaW5nKG9wdGlvbnMscHJvdmlkZXJzKXt0aGlzLl9leHRlbnNpb25UcmFjZVByb3ZpZGVycz1FeHRlbnNpb25zLmV4dGVuc2lvblNlcnZlci50cmFjZVByb3ZpZGVycygpLnNsaWNlKCk7ZnVuY3Rpb24gZGlzYWJsZWRCeURlZmF1bHQoY2F0ZWdvcnkpe3JldHVybidkaXNhYmxlZC1ieS1kZWZhdWx0LScrY2F0ZWdvcnk7fQpjb25zdCBjYXRlZ29yaWVzQXJyYXk9WyctKicsJ2RldnRvb2xzLnRpbWVsaW5lJywndjguZXhlY3V0ZScsZGlzYWJsZWRCeURlZmF1bHQoJ2RldnRvb2xzLnRpbWVsaW5lJyksZGlzYWJsZWRCeURlZmF1bHQoJ2RldnRvb2xzLnRpbWVsaW5lLmZyYW1lJyksU0RLLlRyYWNpbmdNb2RlbC5Ub3BMZXZlbEV2ZW50Q2F0ZWdvcnksVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkNvbnNvbGUsVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LlVzZXJUaW1pbmddO2NhdGVnb3JpZXNBcnJheS5wdXNoKFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5MYXRlbmN5SW5mbyk7aWYoUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ3RpbWVsaW5lRmxvd0V2ZW50cycpKQpjYXRlZ29yaWVzQXJyYXkucHVzaCgnZGV2dG9vbHMudGltZWxpbmUuYXN5bmMnKTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgndGltZWxpbmVWOFJ1bnRpbWVDYWxsU3RhdHMnKSYmb3B0aW9ucy5lbmFibGVKU1NhbXBsaW5nKQpjYXRlZ29yaWVzQXJyYXkucHVzaChkaXNhYmxlZEJ5RGVmYXVsdCgndjgucnVudGltZV9zdGF0c19zYW1wbGluZycpKTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgndGltZWxpbmVUcmFjaW5nSlNQcm9maWxlJykmJm9wdGlvbnMuZW5hYmxlSlNTYW1wbGluZyl7Y2F0ZWdvcmllc0FycmF5LnB1c2goZGlzYWJsZWRCeURlZmF1bHQoJ3Y4LmNwdV9wcm9maWxlcicpKTtpZihDb21tb24ubW9kdWxlU2V0dGluZygnaGlnaFJlc29sdXRpb25DcHVQcm9maWxpbmcnKS5nZXQoKSkKY2F0ZWdvcmllc0FycmF5LnB1c2goZGlzYWJsZWRCeURlZmF1bHQoJ3Y4LmNwdV9wcm9maWxlci5oaXJlcycpKTt9CmNhdGVnb3JpZXNBcnJheS5wdXNoKGRpc2FibGVkQnlEZWZhdWx0KCdkZXZ0b29scy50aW1lbGluZS5zdGFjaycpKTtpZihSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgndGltZWxpbmVJbnZhbGlkYXRpb25UcmFja2luZycpKQpjYXRlZ29yaWVzQXJyYXkucHVzaChkaXNhYmxlZEJ5RGVmYXVsdCgnZGV2dG9vbHMudGltZWxpbmUuaW52YWxpZGF0aW9uVHJhY2tpbmcnKSk7aWYob3B0aW9ucy5jYXB0dXJlUGljdHVyZXMpe2NhdGVnb3JpZXNBcnJheS5wdXNoKGRpc2FibGVkQnlEZWZhdWx0KCdkZXZ0b29scy50aW1lbGluZS5sYXllcnMnKSxkaXNhYmxlZEJ5RGVmYXVsdCgnZGV2dG9vbHMudGltZWxpbmUucGljdHVyZScpLGRpc2FibGVkQnlEZWZhdWx0KCdibGluay5ncmFwaGljc19jb250ZXh0X2Fubm90YXRpb25zJykpO30KaWYob3B0aW9ucy5jYXB0dXJlRmlsbVN0cmlwKQpjYXRlZ29yaWVzQXJyYXkucHVzaChkaXNhYmxlZEJ5RGVmYXVsdCgnZGV2dG9vbHMuc2NyZWVuc2hvdCcpKTt0aGlzLl9leHRlbnNpb25TZXNzaW9ucz1wcm92aWRlcnMubWFwKHByb3ZpZGVyPT5uZXcgVGltZWxpbmUuRXh0ZW5zaW9uVHJhY2luZ1Nlc3Npb24ocHJvdmlkZXIsdGhpcy5fcGVyZm9ybWFuY2VNb2RlbCkpO3RoaXMuX2V4dGVuc2lvblNlc3Npb25zLmZvckVhY2goc2Vzc2lvbj0+c2Vzc2lvbi5zdGFydCgpKTtjb25zdCBzdGFydFByb21pc2U9dGhpcy5fc3RhcnRSZWNvcmRpbmdXaXRoQ2F0ZWdvcmllcyhjYXRlZ29yaWVzQXJyYXkuam9pbignLCcpLG9wdGlvbnMuZW5hYmxlSlNTYW1wbGluZyk7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5zZXRSZWNvcmRTdGFydFRpbWUoRGF0ZS5ub3coKSk7cmV0dXJuIHN0YXJ0UHJvbWlzZTt9CmFzeW5jIHN0b3BSZWNvcmRpbmcoKXtjb25zdCB0cmFjaW5nU3RvcHBlZFByb21pc2VzPVtdO3RyYWNpbmdTdG9wcGVkUHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZShyZXNvbHZlPT50aGlzLl90cmFjaW5nQ29tcGxldGVDYWxsYmFjaz1yZXNvbHZlKSk7dHJhY2luZ1N0b3BwZWRQcm9taXNlcy5wdXNoKHRoaXMuX3N0b3BQcm9maWxpbmdPbkFsbE1vZGVscygpKTt0aGlzLl90cmFjaW5nTWFuYWdlci5zdG9wKCk7dHJhY2luZ1N0b3BwZWRQcm9taXNlcy5wdXNoKFNESy50YXJnZXRNYW5hZ2VyLnJlc3VtZUFsbFRhcmdldHMoKSk7dGhpcy5fY2xpZW50LmxvYWRpbmdTdGFydGVkKCk7Y29uc3QgZXh0ZW5zaW9uQ29tcGxldGlvblByb21pc2VzPXRoaXMuX2V4dGVuc2lvblNlc3Npb25zLm1hcChzZXNzaW9uPT5zZXNzaW9uLnN0b3AoKSk7aWYoZXh0ZW5zaW9uQ29tcGxldGlvblByb21pc2VzLmxlbmd0aCl7dHJhY2luZ1N0b3BwZWRQcm9taXNlcy5wdXNoKFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwoZXh0ZW5zaW9uQ29tcGxldGlvblByb21pc2VzKSxuZXcgUHJvbWlzZShyPT5zZXRUaW1lb3V0KHIsNTAwMCkpXSkpO30KYXdhaXQgUHJvbWlzZS5hbGwodHJhY2luZ1N0b3BwZWRQcm9taXNlcyk7dGhpcy5fYWxsU291cmNlc0ZpbmlzaGVkKCk7cmV0dXJuIHRoaXMuX3BlcmZvcm1hbmNlTW9kZWw7fQptb2RlbEFkZGVkKGNwdVByb2ZpbGVyTW9kZWwpe2lmKHRoaXMuX3Byb2ZpbGluZykKY3B1UHJvZmlsZXJNb2RlbC5zdGFydFJlY29yZGluZygpO30KbW9kZWxSZW1vdmVkKGNwdVByb2ZpbGVyTW9kZWwpe30KX3N0YXJ0UHJvZmlsaW5nT25BbGxNb2RlbHMoKXt0aGlzLl9wcm9maWxpbmc9dHJ1ZTtjb25zdCBtb2RlbHM9U0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5DUFVQcm9maWxlck1vZGVsKTtyZXR1cm4gUHJvbWlzZS5hbGwobW9kZWxzLm1hcChtb2RlbD0+bW9kZWwuc3RhcnRSZWNvcmRpbmcoKSkpO30KX2FkZENwdVByb2ZpbGUodGFyZ2V0SWQsY3B1UHJvZmlsZSl7aWYoIWNwdVByb2ZpbGUpe0NvbW1vbi5jb25zb2xlLndhcm4oQ29tbW9uLlVJU3RyaW5nKCdDUFUgcHJvZmlsZSBmb3IgYSB0YXJnZXQgaXMgbm90IGF2YWlsYWJsZS4nKSk7cmV0dXJuO30KaWYoIXRoaXMuX2NwdVByb2ZpbGVzKQp0aGlzLl9jcHVQcm9maWxlcz1uZXcgTWFwKCk7dGhpcy5fY3B1UHJvZmlsZXMuc2V0KHRhcmdldElkLGNwdVByb2ZpbGUpO30KX3N0b3BQcm9maWxpbmdPbkFsbE1vZGVscygpe2NvbnN0IG1vZGVscz10aGlzLl9wcm9maWxpbmc/U0RLLnRhcmdldE1hbmFnZXIubW9kZWxzKFNESy5DUFVQcm9maWxlck1vZGVsKTpbXTt0aGlzLl9wcm9maWxpbmc9ZmFsc2U7Y29uc3QgcHJvbWlzZXM9W107Zm9yKGNvbnN0IG1vZGVsIG9mIG1vZGVscyl7Y29uc3QgdGFyZ2V0SWQ9bW9kZWwudGFyZ2V0KCkuaWQoKTtjb25zdCBtb2RlbFByb21pc2U9bW9kZWwuc3RvcFJlY29yZGluZygpLnRoZW4odGhpcy5fYWRkQ3B1UHJvZmlsZS5iaW5kKHRoaXMsdGFyZ2V0SWQpKTtwcm9taXNlcy5wdXNoKG1vZGVsUHJvbWlzZSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30KX3N0YXJ0UmVjb3JkaW5nV2l0aENhdGVnb3JpZXMoY2F0ZWdvcmllcyxlbmFibGVKU1NhbXBsaW5nKXtTREsudGFyZ2V0TWFuYWdlci5zdXNwZW5kQWxsVGFyZ2V0cygpO2NvbnN0IHByb2ZpbGluZ1N0YXJ0ZWRQcm9taXNlPWVuYWJsZUpTU2FtcGxpbmcmJiFSdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgndGltZWxpbmVUcmFjaW5nSlNQcm9maWxlJyk/dGhpcy5fc3RhcnRQcm9maWxpbmdPbkFsbE1vZGVscygpOlByb21pc2UucmVzb2x2ZSgpO2NvbnN0IHNhbXBsaW5nRnJlcXVlbmN5SHo9Q29tbW9uLm1vZHVsZVNldHRpbmcoJ2hpZ2hSZXNvbHV0aW9uQ3B1UHJvZmlsaW5nJykuZ2V0KCk/MTAwMDA6MTAwMDtjb25zdCBvcHRpb25zPSdzYW1wbGluZy1mcmVxdWVuY3k9JytzYW1wbGluZ0ZyZXF1ZW5jeUh6O3JldHVybiBwcm9maWxpbmdTdGFydGVkUHJvbWlzZS50aGVuKCgpPT50aGlzLl90cmFjaW5nTWFuYWdlci5zdGFydCh0aGlzLGNhdGVnb3JpZXMsb3B0aW9ucykpO30KdHJhY2VFdmVudHNDb2xsZWN0ZWQoZXZlbnRzKXt0aGlzLl90cmFjaW5nTW9kZWwuYWRkRXZlbnRzKGV2ZW50cyk7fQp0cmFjaW5nQ29tcGxldGUoKXt0aGlzLl90cmFjaW5nQ29tcGxldGVDYWxsYmFjaygpO3RoaXMuX3RyYWNpbmdDb21wbGV0ZUNhbGxiYWNrPW51bGw7fQpfYWxsU291cmNlc0ZpbmlzaGVkKCl7dGhpcy5fY2xpZW50LnByb2Nlc3NpbmdTdGFydGVkKCk7c2V0VGltZW91dCgoKT0+dGhpcy5fZmluYWxpemVUcmFjZSgpLDApO30KX2ZpbmFsaXplVHJhY2UoKXt0aGlzLl9pbmplY3RDcHVQcm9maWxlRXZlbnRzKCk7dGhpcy5fdHJhY2luZ01vZGVsLnRyYWNpbmdDb21wbGV0ZSgpO3RoaXMuX2NsaWVudC5sb2FkaW5nQ29tcGxldGUodGhpcy5fdHJhY2luZ01vZGVsKTt9Cl9pbmplY3RDcHVQcm9maWxlRXZlbnQocGlkLHRpZCxjcHVQcm9maWxlKXtpZighY3B1UHJvZmlsZSkKcmV0dXJuO2NvbnN0IGNwdVByb2ZpbGVFdmVudD0oe2NhdDpTREsuVHJhY2luZ01vZGVsLkRldlRvb2xzTWV0YWRhdGFFdmVudENhdGVnb3J5LHBoOlNESy5UcmFjaW5nTW9kZWwuUGhhc2UuSW5zdGFudCx0czp0aGlzLl90cmFjaW5nTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKSoxMDAwLHBpZDpwaWQsdGlkOnRpZCxuYW1lOlRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkNwdVByb2ZpbGUsYXJnczp7ZGF0YTp7Y3B1UHJvZmlsZTpjcHVQcm9maWxlfX19KTt0aGlzLl90cmFjaW5nTW9kZWwuYWRkRXZlbnRzKFtjcHVQcm9maWxlRXZlbnRdKTt9Cl9idWlsZFRhcmdldFRvUHJvY2Vzc0lkTWFwKCl7Y29uc3QgbWV0YWRhdGFFdmVudFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5EZXZUb29sc01ldGFkYXRhRXZlbnQ7Y29uc3QgbWV0YWRhdGFFdmVudHM9dGhpcy5fdHJhY2luZ01vZGVsLmRldlRvb2xzTWV0YWRhdGFFdmVudHMoKTtjb25zdCBicm93c2VyTWV0YUV2ZW50PW1ldGFkYXRhRXZlbnRzLmZpbmQoZT0+ZS5uYW1lPT09bWV0YWRhdGFFdmVudFR5cGVzLlRyYWNpbmdTdGFydGVkSW5Ccm93c2VyKTtpZighYnJvd3Nlck1ldGFFdmVudCkKcmV0dXJuIG51bGw7Y29uc3QgcHNldWRvUGlkVG9GcmFtZXM9bmV3IE11bHRpbWFwKCk7Y29uc3QgdGFyZ2V0SWRUb1BpZD1uZXcgTWFwKCk7Y29uc3QgZnJhbWVzPWJyb3dzZXJNZXRhRXZlbnQuYXJncy5kYXRhWydmcmFtZXMnXTtmb3IoY29uc3QgZnJhbWVJbmZvIG9mIGZyYW1lcykKdGFyZ2V0SWRUb1BpZC5zZXQoZnJhbWVJbmZvLmZyYW1lLGZyYW1lSW5mby5wcm9jZXNzSWQpO2Zvcihjb25zdCBldmVudCBvZiBtZXRhZGF0YUV2ZW50cyl7Y29uc3QgZGF0YT1ldmVudC5hcmdzLmRhdGE7c3dpdGNoKGV2ZW50Lm5hbWUpe2Nhc2UgbWV0YWRhdGFFdmVudFR5cGVzLkZyYW1lQ29tbWl0dGVkSW5Ccm93c2VyOmlmKGRhdGEucHJvY2Vzc0lkKQp0YXJnZXRJZFRvUGlkLnNldChkYXRhLmZyYW1lLGRhdGEucHJvY2Vzc0lkKTtlbHNlCnBzZXVkb1BpZFRvRnJhbWVzLnNldChkYXRhLnByb2Nlc3NQc2V1ZG9JZCxkYXRhLmZyYW1lKTticmVhaztjYXNlIG1ldGFkYXRhRXZlbnRUeXBlcy5Qcm9jZXNzUmVhZHlJbkJyb3dzZXI6Zm9yKGNvbnN0IGZyYW1lIG9mIHBzZXVkb1BpZFRvRnJhbWVzLmdldChkYXRhLnByb2Nlc3NQc2V1ZG9JZCl8fFtdKQp0YXJnZXRJZFRvUGlkLnNldChmcmFtZSxkYXRhLnByb2Nlc3NJZCk7YnJlYWs7fX0KY29uc3QgbWFpbkZyYW1lPWZyYW1lcy5maW5kKGZyYW1lPT4hZnJhbWUucGFyZW50KTtjb25zdCBtYWluUmVuZGVyZXJQcm9jZXNzSWQ9bWFpbkZyYW1lLnByb2Nlc3NJZDtjb25zdCBtYWluUHJvY2Vzcz10aGlzLl90cmFjaW5nTW9kZWwucHJvY2Vzc0J5SWQobWFpblJlbmRlcmVyUHJvY2Vzc0lkKTtpZihtYWluUHJvY2VzcykKdGFyZ2V0SWRUb1BpZC5zZXQoU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlkKCksbWFpblByb2Nlc3MuaWQoKSk7cmV0dXJuIHRhcmdldElkVG9QaWQ7fQpfaW5qZWN0Q3B1UHJvZmlsZUV2ZW50cygpe2lmKCF0aGlzLl9jcHVQcm9maWxlcykKcmV0dXJuO2NvbnN0IG1ldGFkYXRhRXZlbnRUeXBlcz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuRGV2VG9vbHNNZXRhZGF0YUV2ZW50O2NvbnN0IG1ldGFkYXRhRXZlbnRzPXRoaXMuX3RyYWNpbmdNb2RlbC5kZXZUb29sc01ldGFkYXRhRXZlbnRzKCk7Y29uc3QgdGFyZ2V0SWRUb1BpZD10aGlzLl9idWlsZFRhcmdldFRvUHJvY2Vzc0lkTWFwKCk7aWYodGFyZ2V0SWRUb1BpZCl7Zm9yKGNvbnN0W2lkLHByb2ZpbGVdb2YgdGhpcy5fY3B1UHJvZmlsZXMpe2NvbnN0IHBpZD10YXJnZXRJZFRvUGlkLmdldChpZCk7aWYoIXBpZCkKY29udGludWU7Y29uc3QgcHJvY2Vzcz10aGlzLl90cmFjaW5nTW9kZWwucHJvY2Vzc0J5SWQocGlkKTtjb25zdCB0aHJlYWQ9cHJvY2VzcyYmcHJvY2Vzcy50aHJlYWRCeU5hbWUoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlbmRlcmVyTWFpblRocmVhZE5hbWUpO2lmKHRocmVhZCkKdGhpcy5faW5qZWN0Q3B1UHJvZmlsZUV2ZW50KHBpZCx0aHJlYWQuaWQoKSxwcm9maWxlKTt9fWVsc2V7Y29uc3QgbWFpbk1ldGFFdmVudD1tZXRhZGF0YUV2ZW50cy5maWx0ZXIoZXZlbnQ9PmV2ZW50Lm5hbWU9PT1tZXRhZGF0YUV2ZW50VHlwZXMuVHJhY2luZ1N0YXJ0ZWRJblBhZ2UpLnBlZWtMYXN0KCk7aWYobWFpbk1ldGFFdmVudCl7Y29uc3QgcGlkPW1haW5NZXRhRXZlbnQudGhyZWFkLnByb2Nlc3MoKS5pZCgpO2NvbnN0IG1haW5DcHVQcm9maWxlPXRoaXMuX2NwdVByb2ZpbGVzLmdldCh0aGlzLl90cmFjaW5nTWFuYWdlci50YXJnZXQoKS5pZCgpKTt0aGlzLl9pbmplY3RDcHVQcm9maWxlRXZlbnQocGlkLG1haW5NZXRhRXZlbnQudGhyZWFkLmlkKCksbWFpbkNwdVByb2ZpbGUpO319CmNvbnN0IHdvcmtlck1ldGFFdmVudHM9bWV0YWRhdGFFdmVudHMuZmlsdGVyKGV2ZW50PT5ldmVudC5uYW1lPT09bWV0YWRhdGFFdmVudFR5cGVzLlRyYWNpbmdTZXNzaW9uSWRGb3JXb3JrZXIpO2Zvcihjb25zdCBtZXRhRXZlbnQgb2Ygd29ya2VyTWV0YUV2ZW50cyl7Y29uc3Qgd29ya2VySWQ9bWV0YUV2ZW50LmFyZ3NbJ2RhdGEnXVsnd29ya2VySWQnXTtjb25zdCBjcHVQcm9maWxlPXRoaXMuX2NwdVByb2ZpbGVzLmdldCh3b3JrZXJJZCk7dGhpcy5faW5qZWN0Q3B1UHJvZmlsZUV2ZW50KG1ldGFFdmVudC50aHJlYWQucHJvY2VzcygpLmlkKCksbWV0YUV2ZW50LmFyZ3NbJ2RhdGEnXVsnd29ya2VyVGhyZWFkSWQnXSxjcHVQcm9maWxlKTt9CnRoaXMuX2NwdVByb2ZpbGVzPW51bGw7fQp0cmFjaW5nQnVmZmVyVXNhZ2UodXNhZ2Upe3RoaXMuX2NsaWVudC5yZWNvcmRpbmdQcm9ncmVzcyh1c2FnZSk7fQpldmVudHNSZXRyaWV2YWxQcm9ncmVzcyhwcm9ncmVzcyl7dGhpcy5fY2xpZW50LmxvYWRpbmdQcm9ncmVzcyhwcm9ncmVzcyk7fX07VGltZWxpbmUuVGltZWxpbmVDb250cm9sbGVyLkNsaWVudD1mdW5jdGlvbigpe307VGltZWxpbmUuVGltZWxpbmVDb250cm9sbGVyLkNsaWVudC5wcm90b3R5cGU9e3JlY29yZGluZ1Byb2dyZXNzKHVzYWdlKXt9LH07VGltZWxpbmUuVGltZWxpbmVDb250cm9sbGVyLlJlY29yZGluZ09wdGlvbnM7O1RpbWVsaW5lLlRpbWVsaW5lRGV0YWlsc1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKGRlbGVnYXRlKXtzdXBlcigpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1kZXRhaWxzJyk7dGhpcy5fZGV0YWlsc0xpbmtpZmllcj1uZXcgQ29tcG9uZW50cy5MaW5raWZpZXIoKTt0aGlzLl9iYWRnZVBvb2w9bmV3IFByb2R1Y3RSZWdpc3RyeS5CYWRnZVBvb2woKTt0aGlzLl9iYWRnZVBvb2wuc2V0U2hvd1RpdGxlcyh0cnVlKTt0aGlzLl90YWJiZWRQYW5lPW5ldyBVSS5UYWJiZWRQYW5lKCk7dGhpcy5fdGFiYmVkUGFuZS5zaG93KHRoaXMuZWxlbWVudCk7Y29uc3QgdGFiSWRzPVRpbWVsaW5lLlRpbWVsaW5lRGV0YWlsc1ZpZXcuVGFiO3RoaXMuX2RlZmF1bHREZXRhaWxzV2lkZ2V0PW5ldyBVSS5WQm94KCk7dGhpcy5fZGVmYXVsdERldGFpbHNXaWRnZXQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1kZXRhaWxzLXZpZXcnKTt0aGlzLl9kZWZhdWx0RGV0YWlsc0NvbnRlbnRFbGVtZW50PXRoaXMuX2RlZmF1bHREZXRhaWxzV2lkZ2V0LmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1ib2R5IHZib3gnKTt0aGlzLl9kZWZhdWx0RGV0YWlsc0NvbnRlbnRFbGVtZW50LnRhYkluZGV4PTA7dGhpcy5fYXBwZW5kVGFiKHRhYklkcy5EZXRhaWxzLENvbW1vbi5VSVN0cmluZygnU3VtbWFyeScpLHRoaXMuX2RlZmF1bHREZXRhaWxzV2lkZ2V0KTt0aGlzLnNldFByZWZlcnJlZFRhYih0YWJJZHMuRGV0YWlscyk7dGhpcy5fcmFuZ2VEZXRhaWxWaWV3cz1uZXcgTWFwKCk7Y29uc3QgYm90dG9tVXBWaWV3PW5ldyBUaW1lbGluZS5Cb3R0b21VcFRpbWVsaW5lVHJlZVZpZXcoKTt0aGlzLl9hcHBlbmRUYWIodGFiSWRzLkJvdHRvbVVwLENvbW1vbi5VSVN0cmluZygnQm90dG9tLVVwJyksYm90dG9tVXBWaWV3KTt0aGlzLl9yYW5nZURldGFpbFZpZXdzLnNldCh0YWJJZHMuQm90dG9tVXAsYm90dG9tVXBWaWV3KTtjb25zdCBjYWxsVHJlZVZpZXc9bmV3IFRpbWVsaW5lLkNhbGxUcmVlVGltZWxpbmVUcmVlVmlldygpO3RoaXMuX2FwcGVuZFRhYih0YWJJZHMuQ2FsbFRyZWUsQ29tbW9uLlVJU3RyaW5nKCdDYWxsIFRyZWUnKSxjYWxsVHJlZVZpZXcpO3RoaXMuX3JhbmdlRGV0YWlsVmlld3Muc2V0KHRhYklkcy5DYWxsVHJlZSxjYWxsVHJlZVZpZXcpO2NvbnN0IGV2ZW50c1ZpZXc9bmV3IFRpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXcoZGVsZWdhdGUpO3RoaXMuX2FwcGVuZFRhYih0YWJJZHMuRXZlbnRMb2csQ29tbW9uLlVJU3RyaW5nKCdFdmVudCBMb2cnKSxldmVudHNWaWV3KTt0aGlzLl9yYW5nZURldGFpbFZpZXdzLnNldCh0YWJJZHMuRXZlbnRMb2csZXZlbnRzVmlldyk7dGhpcy5fdGFiYmVkUGFuZS5hZGRFdmVudExpc3RlbmVyKFVJLlRhYmJlZFBhbmUuRXZlbnRzLlRhYlNlbGVjdGVkLHRoaXMuX3RhYlNlbGVjdGVkLHRoaXMpO30Kc2V0TW9kZWwobW9kZWwsdHJhY2spe2lmKHRoaXMuX21vZGVsIT09bW9kZWwpe2lmKHRoaXMuX21vZGVsKQp0aGlzLl9tb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFRpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25XaW5kb3dDaGFuZ2VkLHRoaXMpO3RoaXMuX21vZGVsPW1vZGVsO2lmKHRoaXMuX21vZGVsKQp0aGlzLl9tb2RlbC5hZGRFdmVudExpc3RlbmVyKFRpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25XaW5kb3dDaGFuZ2VkLHRoaXMpO30KdGhpcy5fdHJhY2s9dHJhY2s7dGhpcy5fdGFiYmVkUGFuZS5jbG9zZVRhYnMoW1RpbWVsaW5lLlRpbWVsaW5lRGV0YWlsc1ZpZXcuVGFiLlBhaW50UHJvZmlsZXIsVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzVmlldy5UYWIuTGF5ZXJWaWV3ZXJdLGZhbHNlKTtmb3IoY29uc3QgdmlldyBvZiB0aGlzLl9yYW5nZURldGFpbFZpZXdzLnZhbHVlcygpKQp2aWV3LnNldE1vZGVsKG1vZGVsLHRyYWNrKTt0aGlzLl9sYXp5UGFpbnRQcm9maWxlclZpZXc9bnVsbDt0aGlzLl9sYXp5TGF5ZXJzVmlldz1udWxsO3RoaXMuc2V0U2VsZWN0aW9uKG51bGwpO30KX3NldENvbnRlbnQobm9kZSl7Y29uc3QgYWxsVGFicz10aGlzLl90YWJiZWRQYW5lLm90aGVyVGFicyhUaW1lbGluZS5UaW1lbGluZURldGFpbHNWaWV3LlRhYi5EZXRhaWxzKTtmb3IobGV0IGk9MDtpPGFsbFRhYnMubGVuZ3RoOysraSl7aWYoIXRoaXMuX3JhbmdlRGV0YWlsVmlld3MuaGFzKGFsbFRhYnNbaV0pKQp0aGlzLl90YWJiZWRQYW5lLmNsb3NlVGFiKGFsbFRhYnNbaV0pO30KdGhpcy5fZGVmYXVsdERldGFpbHNDb250ZW50RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuX2RlZmF1bHREZXRhaWxzQ29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7fQpfdXBkYXRlQ29udGVudHMoKXtjb25zdCB2aWV3PXRoaXMuX3JhbmdlRGV0YWlsVmlld3MuZ2V0KHRoaXMuX3RhYmJlZFBhbmUuc2VsZWN0ZWRUYWJJZHx8JycpO2lmKHZpZXcpe2NvbnN0IHdpbmRvdz10aGlzLl9tb2RlbC53aW5kb3coKTt2aWV3LnVwZGF0ZUNvbnRlbnRzKHRoaXMuX3NlbGVjdGlvbnx8VGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbVJhbmdlKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCkpO319Cl9hcHBlbmRUYWIoaWQsdGFiVGl0bGUsdmlldyxpc0Nsb3NlYWJsZSl7dGhpcy5fdGFiYmVkUGFuZS5hcHBlbmRUYWIoaWQsdGFiVGl0bGUsdmlldyx1bmRlZmluZWQsdW5kZWZpbmVkLGlzQ2xvc2VhYmxlKTtpZih0aGlzLl9wcmVmZXJyZWRUYWJJZCE9PXRoaXMuX3RhYmJlZFBhbmUuc2VsZWN0ZWRUYWJJZCkKdGhpcy5fdGFiYmVkUGFuZS5zZWxlY3RUYWIoaWQpO30KaGVhZGVyRWxlbWVudCgpe3JldHVybiB0aGlzLl90YWJiZWRQYW5lLmhlYWRlckVsZW1lbnQoKTt9CnNldFByZWZlcnJlZFRhYih0YWJJZCl7dGhpcy5fcHJlZmVycmVkVGFiSWQ9dGFiSWQ7fQpfb25XaW5kb3dDaGFuZ2VkKGV2ZW50KXtpZighdGhpcy5fc2VsZWN0aW9uKQp0aGlzLl91cGRhdGVDb250ZW50c0Zyb21XaW5kb3coKTt9Cl91cGRhdGVDb250ZW50c0Zyb21XaW5kb3coKXtpZighdGhpcy5fbW9kZWwpCnJldHVybjtjb25zdCB3aW5kb3c9dGhpcy5fbW9kZWwud2luZG93KCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWRSYW5nZVN0YXRzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCk7dGhpcy5fdXBkYXRlQ29udGVudHMoKTt9CnNldFNlbGVjdGlvbihzZWxlY3Rpb24pe3RoaXMuX2RldGFpbHNMaW5raWZpZXIucmVzZXQoKTt0aGlzLl9iYWRnZVBvb2wucmVzZXQoKTt0aGlzLl9zZWxlY3Rpb249c2VsZWN0aW9uO2lmKCF0aGlzLl9zZWxlY3Rpb24pe3RoaXMuX3VwZGF0ZUNvbnRlbnRzRnJvbVdpbmRvdygpO3JldHVybjt9CnN3aXRjaCh0aGlzLl9zZWxlY3Rpb24udHlwZSgpKXtjYXNlIFRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLlR5cGUuVHJhY2VFdmVudDpjb25zdCBldmVudD0odGhpcy5fc2VsZWN0aW9uLm9iamVjdCgpKTtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuYnVpbGRUcmFjZUV2ZW50RGV0YWlscyhldmVudCx0aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCksdGhpcy5fZGV0YWlsc0xpbmtpZmllcix0aGlzLl9iYWRnZVBvb2wsdHJ1ZSkudGhlbihmcmFnbWVudD0+dGhpcy5fYXBwZW5kRGV0YWlsc1RhYnNGb3JUcmFjZUV2ZW50QW5kU2hvd0RldGFpbHMoZXZlbnQsZnJhZ21lbnQpKTticmVhaztjYXNlIFRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLlR5cGUuRnJhbWU6Y29uc3QgZnJhbWU9KHRoaXMuX3NlbGVjdGlvbi5vYmplY3QoKSk7Y29uc3QgZmlsbVN0cmlwRnJhbWU9dGhpcy5fbW9kZWwuZmlsbVN0cmlwTW9kZWxGcmFtZShmcmFtZSk7dGhpcy5fc2V0Q29udGVudChUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZ2VuZXJhdGVEZXRhaWxzQ29udGVudEZvckZyYW1lKGZyYW1lLGZpbG1TdHJpcEZyYW1lKSk7aWYoZnJhbWUubGF5ZXJUcmVlKXtjb25zdCBsYXllcnNWaWV3PXRoaXMuX2xheWVyc1ZpZXcoKTtsYXllcnNWaWV3LnNob3dMYXllclRyZWUoZnJhbWUubGF5ZXJUcmVlKTtpZighdGhpcy5fdGFiYmVkUGFuZS5oYXNUYWIoVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzVmlldy5UYWIuTGF5ZXJWaWV3ZXIpKQp0aGlzLl9hcHBlbmRUYWIoVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzVmlldy5UYWIuTGF5ZXJWaWV3ZXIsQ29tbW9uLlVJU3RyaW5nKCdMYXllcnMnKSxsYXllcnNWaWV3KTt9CmJyZWFrO2Nhc2UgVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uVHlwZS5OZXR3b3JrUmVxdWVzdDpjb25zdCByZXF1ZXN0PSh0aGlzLl9zZWxlY3Rpb24ub2JqZWN0KCkpO1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5idWlsZE5ldHdvcmtSZXF1ZXN0RGV0YWlscyhyZXF1ZXN0LHRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKSx0aGlzLl9kZXRhaWxzTGlua2lmaWVyLHRoaXMuX2JhZGdlUG9vbCkudGhlbih0aGlzLl9zZXRDb250ZW50LmJpbmQodGhpcykpO2JyZWFrO2Nhc2UgVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uVHlwZS5SYW5nZTp0aGlzLl91cGRhdGVTZWxlY3RlZFJhbmdlU3RhdHModGhpcy5fc2VsZWN0aW9uLnN0YXJ0VGltZSgpLHRoaXMuX3NlbGVjdGlvbi5lbmRUaW1lKCkpO2JyZWFrO30KdGhpcy5fdXBkYXRlQ29udGVudHMoKTt9Cl90YWJTZWxlY3RlZChldmVudCl7aWYoIWV2ZW50LmRhdGEuaXNVc2VyR2VzdHVyZSkKcmV0dXJuO3RoaXMuc2V0UHJlZmVycmVkVGFiKGV2ZW50LmRhdGEudGFiSWQpO3RoaXMuX3VwZGF0ZUNvbnRlbnRzKCk7fQpfbGF5ZXJzVmlldygpe2lmKHRoaXMuX2xhenlMYXllcnNWaWV3KQpyZXR1cm4gdGhpcy5fbGF6eUxheWVyc1ZpZXc7dGhpcy5fbGF6eUxheWVyc1ZpZXc9bmV3IFRpbWVsaW5lLlRpbWVsaW5lTGF5ZXJzVmlldyh0aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCksdGhpcy5fc2hvd1NuYXBzaG90SW5QYWludFByb2ZpbGVyLmJpbmQodGhpcykpO3JldHVybiB0aGlzLl9sYXp5TGF5ZXJzVmlldzt9Cl9wYWludFByb2ZpbGVyVmlldygpe2lmKHRoaXMuX2xhenlQYWludFByb2ZpbGVyVmlldykKcmV0dXJuIHRoaXMuX2xhenlQYWludFByb2ZpbGVyVmlldzt0aGlzLl9sYXp5UGFpbnRQcm9maWxlclZpZXc9bmV3IFRpbWVsaW5lLlRpbWVsaW5lUGFpbnRQcm9maWxlclZpZXcodGhpcy5fbW9kZWwuZnJhbWVNb2RlbCgpKTtyZXR1cm4gdGhpcy5fbGF6eVBhaW50UHJvZmlsZXJWaWV3O30KX3Nob3dTbmFwc2hvdEluUGFpbnRQcm9maWxlcihzbmFwc2hvdCl7Y29uc3QgcGFpbnRQcm9maWxlclZpZXc9dGhpcy5fcGFpbnRQcm9maWxlclZpZXcoKTtwYWludFByb2ZpbGVyVmlldy5zZXRTbmFwc2hvdChzbmFwc2hvdCk7aWYoIXRoaXMuX3RhYmJlZFBhbmUuaGFzVGFiKFRpbWVsaW5lLlRpbWVsaW5lRGV0YWlsc1ZpZXcuVGFiLlBhaW50UHJvZmlsZXIpKXt0aGlzLl9hcHBlbmRUYWIoVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzVmlldy5UYWIuUGFpbnRQcm9maWxlcixDb21tb24uVUlTdHJpbmcoJ1BhaW50IFByb2ZpbGVyJykscGFpbnRQcm9maWxlclZpZXcsdHJ1ZSk7fQp0aGlzLl90YWJiZWRQYW5lLnNlbGVjdFRhYihUaW1lbGluZS5UaW1lbGluZURldGFpbHNWaWV3LlRhYi5QYWludFByb2ZpbGVyLHRydWUpO30KX2FwcGVuZERldGFpbHNUYWJzRm9yVHJhY2VFdmVudEFuZFNob3dEZXRhaWxzKGV2ZW50LGNvbnRlbnQpe3RoaXMuX3NldENvbnRlbnQoY29udGVudCk7aWYoZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLlBhaW50fHxldmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuUmFzdGVyVGFzaykKdGhpcy5fc2hvd0V2ZW50SW5QYWludFByb2ZpbGVyKGV2ZW50KTt9Cl9zaG93RXZlbnRJblBhaW50UHJvZmlsZXIoZXZlbnQpe2NvbnN0IHBhaW50UHJvZmlsZXJNb2RlbD1TREsudGFyZ2V0TWFuYWdlci5tb2RlbHMoU0RLLlBhaW50UHJvZmlsZXJNb2RlbClbMF07aWYoIXBhaW50UHJvZmlsZXJNb2RlbCkKcmV0dXJuO2NvbnN0IHBhaW50UHJvZmlsZXJWaWV3PXRoaXMuX3BhaW50UHJvZmlsZXJWaWV3KCk7Y29uc3QgaGFzUHJvZmlsZURhdGE9cGFpbnRQcm9maWxlclZpZXcuc2V0RXZlbnQocGFpbnRQcm9maWxlck1vZGVsLGV2ZW50KTtpZighaGFzUHJvZmlsZURhdGEpCnJldHVybjtpZih0aGlzLl90YWJiZWRQYW5lLmhhc1RhYihUaW1lbGluZS5UaW1lbGluZURldGFpbHNWaWV3LlRhYi5QYWludFByb2ZpbGVyKSkKcmV0dXJuO3RoaXMuX2FwcGVuZFRhYihUaW1lbGluZS5UaW1lbGluZURldGFpbHNWaWV3LlRhYi5QYWludFByb2ZpbGVyLENvbW1vbi5VSVN0cmluZygnUGFpbnQgUHJvZmlsZXInKSxwYWludFByb2ZpbGVyVmlldyk7fQpfdXBkYXRlU2VsZWN0ZWRSYW5nZVN0YXRzKHN0YXJ0VGltZSxlbmRUaW1lKXtpZighdGhpcy5fbW9kZWx8fCF0aGlzLl90cmFjaykKcmV0dXJuO2NvbnN0IGFnZ3JlZ2F0ZWRTdGF0cz1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuc3RhdHNGb3JUaW1lUmFuZ2UodGhpcy5fdHJhY2suc3luY0V2ZW50cygpLHN0YXJ0VGltZSxlbmRUaW1lKTtjb25zdCBzdGFydE9mZnNldD1zdGFydFRpbWUtdGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1pbmltdW1SZWNvcmRUaW1lKCk7Y29uc3QgZW5kT2Zmc2V0PWVuZFRpbWUtdGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1pbmltdW1SZWNvcmRUaW1lKCk7Y29uc3QgY29udGVudEhlbHBlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzQ29udGVudEhlbHBlcihudWxsLG51bGwpO2NvbnRlbnRIZWxwZXIuYWRkU2VjdGlvbihsc2BSYW5nZTogICR7TnVtYmVyLm1pbGxpc1RvU3RyaW5nKHN0YXJ0T2Zmc2V0KX0gXHUyMDEzICR7TnVtYmVyLm1pbGxpc1RvU3RyaW5nKGVuZE9mZnNldCl9YCk7Y29uc3QgcGllQ2hhcnQ9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmdlbmVyYXRlUGllQ2hhcnQoYWdncmVnYXRlZFN0YXRzKTtjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3coJycscGllQ2hhcnQpO3RoaXMuX3NldENvbnRlbnQoY29udGVudEhlbHBlci5mcmFnbWVudCk7fX07VGltZWxpbmUuVGltZWxpbmVEZXRhaWxzVmlldy5UYWI9e0RldGFpbHM6J0RldGFpbHMnLEV2ZW50TG9nOidFdmVudExvZycsQ2FsbFRyZWU6J0NhbGxUcmVlJyxCb3R0b21VcDonQm90dG9tVXAnLFBhaW50UHJvZmlsZXI6J1BhaW50UHJvZmlsZXInLExheWVyVmlld2VyOidMYXllclZpZXdlcid9OztUaW1lbGluZS5UaW1lbGluZUxvYWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihjbGllbnQpe3RoaXMuX2NsaWVudD1jbGllbnQ7dGhpcy5fYmFja2luZ1N0b3JhZ2U9bmV3IEJpbmRpbmdzLlRlbXBGaWxlQmFja2luZ1N0b3JhZ2UoKTt0aGlzLl90cmFjaW5nTW9kZWw9bmV3IFNESy5UcmFjaW5nTW9kZWwodGhpcy5fYmFja2luZ1N0b3JhZ2UpO3RoaXMuX2NhbmNlbGVkQ2FsbGJhY2s9bnVsbDt0aGlzLl9zdGF0ZT1UaW1lbGluZS5UaW1lbGluZUxvYWRlci5TdGF0ZS5Jbml0aWFsO3RoaXMuX2J1ZmZlcj0nJzt0aGlzLl9maXJzdFJhd0NodW5rPXRydWU7dGhpcy5fZmlyc3RDaHVuaz10cnVlO3RoaXMuX2xvYWRlZEJ5dGVzPTA7dGhpcy5fdG90YWxTaXplO3RoaXMuX2pzb25Ub2tlbml6ZXI9bmV3IFRleHRVdGlscy5UZXh0VXRpbHMuQmFsYW5jZWRKU09OVG9rZW5pemVyKHRoaXMuX3dyaXRlQmFsYW5jZWRKU09OLmJpbmQodGhpcyksdHJ1ZSk7fQpzdGF0aWMgbG9hZEZyb21GaWxlKGZpbGUsY2xpZW50KXtjb25zdCBsb2FkZXI9bmV3IFRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyKGNsaWVudCk7Y29uc3QgZmlsZVJlYWRlcj1uZXcgQmluZGluZ3MuQ2h1bmtlZEZpbGVSZWFkZXIoZmlsZSxUaW1lbGluZS5UaW1lbGluZUxvYWRlci5UcmFuc2ZlckNodW5rTGVuZ3RoQnl0ZXMpO2xvYWRlci5fY2FuY2VsZWRDYWxsYmFjaz1maWxlUmVhZGVyLmNhbmNlbC5iaW5kKGZpbGVSZWFkZXIpO2xvYWRlci5fdG90YWxTaXplPWZpbGUuc2l6ZTtmaWxlUmVhZGVyLnJlYWQobG9hZGVyKS50aGVuKHN1Y2Nlc3M9PntpZighc3VjY2VzcykKdGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKGZpbGVSZWFkZXIuZXJyb3IoKS5tZXNzYWdlKTt9KTtyZXR1cm4gbG9hZGVyO30Kc3RhdGljIGxvYWRGcm9tRXZlbnRzKGV2ZW50cyxjbGllbnQpe2NvbnN0IGxvYWRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVMb2FkZXIoY2xpZW50KTtzZXRUaW1lb3V0KGFzeW5jKCk9Pntjb25zdCBldmVudHNQZXJDaHVuaz01MDAwO2NsaWVudC5sb2FkaW5nU3RhcnRlZCgpO2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDtpKz1ldmVudHNQZXJDaHVuayl7Y29uc3QgY2h1bms9ZXZlbnRzLnNsaWNlKGksaStldmVudHNQZXJDaHVuayk7bG9hZGVyLl90cmFjaW5nTW9kZWwuYWRkRXZlbnRzKGNodW5rKTtjbGllbnQubG9hZGluZ1Byb2dyZXNzKChpK2NodW5rLmxlbmd0aCkvZXZlbnRzLmxlbmd0aCk7YXdhaXQgbmV3IFByb21pc2Uocj0+c2V0VGltZW91dChyKSk7fQpsb2FkZXIuY2xvc2UoKTt9KTtyZXR1cm4gbG9hZGVyO30Kc3RhdGljIGxvYWRGcm9tVVJMKHVybCxjbGllbnQpe2NvbnN0IGxvYWRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVMb2FkZXIoY2xpZW50KTtIb3N0LlJlc291cmNlTG9hZGVyLmxvYWRBc1N0cmVhbSh1cmwsbnVsbCxsb2FkZXIpO3JldHVybiBsb2FkZXI7fQpjYW5jZWwoKXt0aGlzLl90cmFjaW5nTW9kZWw9bnVsbDt0aGlzLl9iYWNraW5nU3RvcmFnZS5yZXNldCgpO3RoaXMuX2NsaWVudC5sb2FkaW5nQ29tcGxldGUobnVsbCk7dGhpcy5fY2xpZW50PW51bGw7aWYodGhpcy5fY2FuY2VsZWRDYWxsYmFjaykKdGhpcy5fY2FuY2VsZWRDYWxsYmFjaygpO30Kd3JpdGUoY2h1bmspe2lmKCF0aGlzLl9jbGllbnQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0aGlzLl9sb2FkZWRCeXRlcys9Y2h1bmsubGVuZ3RoO2lmKHRoaXMuX2ZpcnN0UmF3Q2h1bmspCnRoaXMuX2NsaWVudC5sb2FkaW5nU3RhcnRlZCgpO2Vsc2UKdGhpcy5fY2xpZW50LmxvYWRpbmdQcm9ncmVzcyh0aGlzLl90b3RhbFNpemU/dGhpcy5fbG9hZGVkQnl0ZXMvdGhpcy5fdG90YWxTaXplOnVuZGVmaW5lZCk7dGhpcy5fZmlyc3RSYXdDaHVuaz1mYWxzZTtpZih0aGlzLl9zdGF0ZT09PVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLkluaXRpYWwpe2lmKGNodW5rLnN0YXJ0c1dpdGgoJ3sibm9kZXMiOlsnKSl7dGhpcy5fc3RhdGU9VGltZWxpbmUuVGltZWxpbmVMb2FkZXIuU3RhdGUuTG9hZGluZ0NQVVByb2ZpbGVGb3JtYXQ7fWVsc2UgaWYoY2h1bmtbMF09PT0neycpe3RoaXMuX3N0YXRlPVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLkxvb2tpbmdGb3JFdmVudHM7fWVsc2UgaWYoY2h1bmtbMF09PT0nWycpe3RoaXMuX3N0YXRlPVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlJlYWRpbmdFdmVudHM7fWVsc2V7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKENvbW1vbi5VSVN0cmluZygnTWFsZm9ybWVkIHRpbWVsaW5lIGRhdGE6IFVua25vd24gSlNPTiBmb3JtYXQnKSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO319CmlmKHRoaXMuX3N0YXRlPT09VGltZWxpbmUuVGltZWxpbmVMb2FkZXIuU3RhdGUuTG9hZGluZ0NQVVByb2ZpbGVGb3JtYXQpe3RoaXMuX2J1ZmZlcis9Y2h1bms7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30KaWYodGhpcy5fc3RhdGU9PT1UaW1lbGluZS5UaW1lbGluZUxvYWRlci5TdGF0ZS5Mb29raW5nRm9yRXZlbnRzKXtjb25zdCBvYmplY3ROYW1lPScidHJhY2VFdmVudHMiOic7Y29uc3Qgc3RhcnRQb3M9dGhpcy5fYnVmZmVyLmxlbmd0aC1vYmplY3ROYW1lLmxlbmd0aDt0aGlzLl9idWZmZXIrPWNodW5rO2NvbnN0IHBvcz10aGlzLl9idWZmZXIuaW5kZXhPZihvYmplY3ROYW1lLHN0YXJ0UG9zKTtpZihwb3M9PT0tMSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NodW5rPXRoaXMuX2J1ZmZlci5zbGljZShwb3Mrb2JqZWN0TmFtZS5sZW5ndGgpO3RoaXMuX3N0YXRlPVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlJlYWRpbmdFdmVudHM7fQppZih0aGlzLl9zdGF0ZSE9PVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlJlYWRpbmdFdmVudHMpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZih0aGlzLl9qc29uVG9rZW5pemVyLndyaXRlKGNodW5rKSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RoaXMuX3N0YXRlPVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlNraXBwaW5nVGFpbDtpZih0aGlzLl9maXJzdENodW5rKQp0aGlzLl9yZXBvcnRFcnJvckFuZENhbmNlbExvYWRpbmcoQ29tbW9uLlVJU3RyaW5nKCdNYWxmb3JtZWQgdGltZWxpbmUgaW5wdXQsIHdyb25nIEpTT04gYnJhY2tldHMgYmFsYW5jZScpKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpfd3JpdGVCYWxhbmNlZEpTT04oZGF0YSl7bGV0IGpzb249ZGF0YSsnXSc7aWYoIXRoaXMuX2ZpcnN0Q2h1bmspe2NvbnN0IGNvbW1hSW5kZXg9anNvbi5pbmRleE9mKCcsJyk7aWYoY29tbWFJbmRleCE9PS0xKQpqc29uPWpzb24uc2xpY2UoY29tbWFJbmRleCsxKTtqc29uPSdbJytqc29uO30KbGV0IGl0ZW1zO3RyeXtpdGVtcz0oSlNPTi5wYXJzZShqc29uKSk7fWNhdGNoKGUpe3RoaXMuX3JlcG9ydEVycm9yQW5kQ2FuY2VsTG9hZGluZyhDb21tb24uVUlTdHJpbmcoJ01hbGZvcm1lZCB0aW1lbGluZSBkYXRhOiAlcycsZS50b1N0cmluZygpKSk7cmV0dXJuO30KaWYodGhpcy5fZmlyc3RDaHVuayl7dGhpcy5fZmlyc3RDaHVuaz1mYWxzZTtpZih0aGlzLl9sb29rc0xpa2VBcHBWZXJzaW9uKGl0ZW1zWzBdKSl7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKENvbW1vbi5VSVN0cmluZygnTGVnYWN5IFRpbWVsaW5lIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicpKTtyZXR1cm47fX0KdHJ5e3RoaXMuX3RyYWNpbmdNb2RlbC5hZGRFdmVudHMoaXRlbXMpO31jYXRjaChlKXt0aGlzLl9yZXBvcnRFcnJvckFuZENhbmNlbExvYWRpbmcoQ29tbW9uLlVJU3RyaW5nKCdNYWxmb3JtZWQgdGltZWxpbmUgZGF0YTogJXMnLGUudG9TdHJpbmcoKSkpO319Cl9yZXBvcnRFcnJvckFuZENhbmNlbExvYWRpbmcobWVzc2FnZSl7aWYobWVzc2FnZSkKQ29tbW9uLmNvbnNvbGUuZXJyb3IobWVzc2FnZSk7dGhpcy5jYW5jZWwoKTt9Cl9sb29rc0xpa2VBcHBWZXJzaW9uKGl0ZW0pe3JldHVybiB0eXBlb2YgaXRlbT09PSdzdHJpbmcnJiZpdGVtLmluZGV4T2YoJ0Nocm9tZScpIT09LTE7fQpjbG9zZSgpe2lmKCF0aGlzLl9jbGllbnQpCnJldHVybjt0aGlzLl9jbGllbnQucHJvY2Vzc2luZ1N0YXJ0ZWQoKTtzZXRUaW1lb3V0KCgpPT50aGlzLl9maW5hbGl6ZVRyYWNlKCksMCk7fQpfZmluYWxpemVUcmFjZSgpe2lmKHRoaXMuX3N0YXRlPT09VGltZWxpbmUuVGltZWxpbmVMb2FkZXIuU3RhdGUuTG9hZGluZ0NQVVByb2ZpbGVGb3JtYXQpe3RoaXMuX3BhcnNlQ1BVUHJvZmlsZUZvcm1hdCh0aGlzLl9idWZmZXIpO3RoaXMuX2J1ZmZlcj0nJzt9CnRoaXMuX3RyYWNpbmdNb2RlbC50cmFjaW5nQ29tcGxldGUoKTt0aGlzLl9jbGllbnQubG9hZGluZ0NvbXBsZXRlKHRoaXMuX3RyYWNpbmdNb2RlbCk7fQpfcGFyc2VDUFVQcm9maWxlRm9ybWF0KHRleHQpe2xldCB0cmFjZUV2ZW50czt0cnl7Y29uc3QgcHJvZmlsZT1KU09OLnBhcnNlKHRleHQpO3RyYWNlRXZlbnRzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuYnVpbGRUcmFjZVByb2ZpbGVGcm9tQ3B1UHJvZmlsZShwcm9maWxlKTt9Y2F0Y2goZSl7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKENvbW1vbi5VSVN0cmluZygnTWFsZm9ybWVkIENQVSBwcm9maWxlIGZvcm1hdCcpKTtyZXR1cm47fQp0aGlzLl90cmFjaW5nTW9kZWwuYWRkRXZlbnRzKHRyYWNlRXZlbnRzKTt9fTtUaW1lbGluZS5UaW1lbGluZUxvYWRlci5UcmFuc2ZlckNodW5rTGVuZ3RoQnl0ZXM9NTAwMDAwMDtUaW1lbGluZS5UaW1lbGluZUxvYWRlci5DbGllbnQ9ZnVuY3Rpb24oKXt9O1RpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLkNsaWVudC5wcm90b3R5cGU9e2xvYWRpbmdTdGFydGVkKCl7fSxsb2FkaW5nUHJvZ3Jlc3MocHJvZ3Jlc3Mpe30scHJvY2Vzc2luZ1N0YXJ0ZWQoKXt9LGxvYWRpbmdDb21wbGV0ZSh0cmFjaW5nTW9kZWwpe30sfTtUaW1lbGluZS5UaW1lbGluZUxvYWRlci5TdGF0ZT17SW5pdGlhbDpTeW1ib2woJ0luaXRpYWwnKSxMb29raW5nRm9yRXZlbnRzOlN5bWJvbCgnTG9va2luZ0ZvckV2ZW50cycpLFJlYWRpbmdFdmVudHM6U3ltYm9sKCdSZWFkaW5nRXZlbnRzJyksU2tpcHBpbmdUYWlsOlN5bWJvbCgnU2tpcHBpbmdUYWlsJyksTG9hZGluZ0NQVVByb2ZpbGVGb3JtYXQ6U3ltYm9sKCdMb2FkaW5nQ1BVUHJvZmlsZUZvcm1hdCcpfTs7VGltZWxpbmUuVGltZWxpbmVFdmVudE92ZXJ2aWV3PWNsYXNzIGV4dGVuZHMgUGVyZlVJLlRpbWVsaW5lT3ZlcnZpZXdCYXNle2NvbnN0cnVjdG9yKGlkLHRpdGxlKXtzdXBlcigpO3RoaXMuZWxlbWVudC5pZD0ndGltZWxpbmUtb3ZlcnZpZXctJytpZDt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3ZlcnZpZXctc3RyaXAnKTt0aGlzLl9tb2RlbD1udWxsO2lmKHRpdGxlKQp0aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLW92ZXJ2aWV3LXN0cmlwLXRpdGxlJykudGV4dENvbnRlbnQ9dGl0bGU7fQpzZXRNb2RlbChtb2RlbCl7dGhpcy5fbW9kZWw9bW9kZWw7fQpfcmVuZGVyQmFyKGJlZ2luLGVuZCxwb3NpdGlvbixoZWlnaHQsY29sb3Ipe2NvbnN0IHg9YmVnaW47Y29uc3Qgd2lkdGg9ZW5kLWJlZ2luO2NvbnN0IGN0eD10aGlzLmNvbnRleHQoKTtjdHguZmlsbFN0eWxlPWNvbG9yO2N0eC5maWxsUmVjdCh4LHBvc2l0aW9uLHdpZHRoLGhlaWdodCk7fX07VGltZWxpbmUuVGltZWxpbmVFdmVudE92ZXJ2aWV3SW5wdXQ9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcignaW5wdXQnLG51bGwpO30KdXBkYXRlKCl7c3VwZXIudXBkYXRlKCk7aWYoIXRoaXMuX21vZGVsKQpyZXR1cm47Y29uc3QgaGVpZ2h0PXRoaXMuaGVpZ2h0KCk7Y29uc3QgZGVzY3JpcHRvcnM9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50RGlzcGF0Y2hEZXNjaXB0b3JzKCk7Y29uc3QgZGVzY3JpcHRvcnNCeVR5cGU9bmV3IE1hcCgpO2xldCBtYXhQcmlvcml0eT0tMTtmb3IoY29uc3QgZGVzY3JpcHRvciBvZiBkZXNjcmlwdG9ycyl7Zm9yKGNvbnN0IHR5cGUgb2YgZGVzY3JpcHRvci5ldmVudFR5cGVzKQpkZXNjcmlwdG9yc0J5VHlwZS5zZXQodHlwZSxkZXNjcmlwdG9yKTttYXhQcmlvcml0eT1NYXRoLm1heChtYXhQcmlvcml0eSxkZXNjcmlwdG9yLnByaW9yaXR5KTt9CmNvbnN0IG1pbldpZHRoPTIqd2luZG93LmRldmljZVBpeGVsUmF0aW87Y29uc3QgdGltZU9mZnNldD10aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCkubWluaW11bVJlY29yZFRpbWUoKTtjb25zdCB0aW1lU3Bhbj10aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCkubWF4aW11bVJlY29yZFRpbWUoKS10aW1lT2Zmc2V0O2NvbnN0IGNhbnZhc1dpZHRoPXRoaXMud2lkdGgoKTtjb25zdCBzY2FsZT1jYW52YXNXaWR0aC90aW1lU3Bhbjtmb3IobGV0IHByaW9yaXR5PTA7cHJpb3JpdHk8PW1heFByaW9yaXR5OysrcHJpb3JpdHkpe2Zvcihjb25zdCB0cmFjayBvZiB0aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCkudHJhY2tzKCkpe2ZvcihsZXQgaT0wO2k8dHJhY2suZXZlbnRzLmxlbmd0aDsrK2kpe2NvbnN0IGV2ZW50PXRyYWNrLmV2ZW50c1tpXTtpZihldmVudC5uYW1lIT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuRXZlbnREaXNwYXRjaCkKY29udGludWU7Y29uc3QgZGVzY3JpcHRvcj1kZXNjcmlwdG9yc0J5VHlwZS5nZXQoZXZlbnQuYXJnc1snZGF0YSddWyd0eXBlJ10pO2lmKCFkZXNjcmlwdG9yfHxkZXNjcmlwdG9yLnByaW9yaXR5IT09cHJpb3JpdHkpCmNvbnRpbnVlO2NvbnN0IHN0YXJ0PU51bWJlci5jb25zdHJhaW4oTWF0aC5mbG9vcigoZXZlbnQuc3RhcnRUaW1lLXRpbWVPZmZzZXQpKnNjYWxlKSwwLGNhbnZhc1dpZHRoKTtjb25zdCBlbmQ9TnVtYmVyLmNvbnN0cmFpbihNYXRoLmNlaWwoKGV2ZW50LmVuZFRpbWUtdGltZU9mZnNldCkqc2NhbGUpLDAsY2FudmFzV2lkdGgpO2NvbnN0IHdpZHRoPU1hdGgubWF4KGVuZC1zdGFydCxtaW5XaWR0aCk7dGhpcy5fcmVuZGVyQmFyKHN0YXJ0LHN0YXJ0K3dpZHRoLDAsaGVpZ2h0LGRlc2NyaXB0b3IuY29sb3IpO319fX19O1RpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld05ldHdvcms9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcignbmV0d29yaycsQ29tbW9uLlVJU3RyaW5nKCdORVQnKSk7fQp1cGRhdGUoKXtzdXBlci51cGRhdGUoKTtpZighdGhpcy5fbW9kZWwpCnJldHVybjtjb25zdCB0aW1lbGluZU1vZGVsPXRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKTtjb25zdCBiYW5kSGVpZ2h0PXRoaXMuaGVpZ2h0KCkvMjtjb25zdCB0aW1lT2Zmc2V0PXRpbWVsaW5lTW9kZWwubWluaW11bVJlY29yZFRpbWUoKTtjb25zdCB0aW1lU3Bhbj10aW1lbGluZU1vZGVsLm1heGltdW1SZWNvcmRUaW1lKCktdGltZU9mZnNldDtjb25zdCBjYW52YXNXaWR0aD10aGlzLndpZHRoKCk7Y29uc3Qgc2NhbGU9Y2FudmFzV2lkdGgvdGltZVNwYW47Y29uc3QgaGlnaFBhdGg9bmV3IFBhdGgyRCgpO2NvbnN0IGxvd1BhdGg9bmV3IFBhdGgyRCgpO2NvbnN0IHByaW9yaXRpZXM9UHJvdG9jb2wuTmV0d29yay5SZXNvdXJjZVByaW9yaXR5O2NvbnN0IGhpZ2hQcmlvcml0eVNldD1uZXcgU2V0KFtwcmlvcml0aWVzLlZlcnlIaWdoLHByaW9yaXRpZXMuSGlnaCxwcmlvcml0aWVzLk1lZGl1bV0pO2Zvcihjb25zdCByZXF1ZXN0IG9mIHRpbWVsaW5lTW9kZWwubmV0d29ya1JlcXVlc3RzKCkpe2NvbnN0IHBhdGg9aGlnaFByaW9yaXR5U2V0LmhhcyhyZXF1ZXN0LnByaW9yaXR5KT9oaWdoUGF0aDpsb3dQYXRoO2NvbnN0IHM9TWF0aC5tYXgoTWF0aC5mbG9vcigocmVxdWVzdC5zdGFydFRpbWUtdGltZU9mZnNldCkqc2NhbGUpLDApO2NvbnN0IGU9TWF0aC5taW4oTWF0aC5jZWlsKChyZXF1ZXN0LmVuZFRpbWUtdGltZU9mZnNldCkqc2NhbGUrMSksY2FudmFzV2lkdGgpO3BhdGgucmVjdChzLDAsZS1zLGJhbmRIZWlnaHQtMSk7fQpjb25zdCBjdHg9dGhpcy5jb250ZXh0KCk7Y3R4LnNhdmUoKTtjdHguZmlsbFN0eWxlPSdoc2woMjE0LCA2MCUsIDYwJSknO2N0eC5maWxsKChoaWdoUGF0aCkpO2N0eC50cmFuc2xhdGUoMCxiYW5kSGVpZ2h0KTtjdHguZmlsbFN0eWxlPSdoc2woMjE0LCA4MCUsIDgwJSknO2N0eC5maWxsKChsb3dQYXRoKSk7Y3R4LnJlc3RvcmUoKTt9fTtUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdDUFVBY3Rpdml0eT1jbGFzcyBleHRlbmRzIFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCdjcHUtYWN0aXZpdHknLENvbW1vbi5VSVN0cmluZygnQ1BVJykpO3RoaXMuX2JhY2tncm91bmRDYW52YXM9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdjYW52YXMnLCdmaWxsIGJhY2tncm91bmQnKTt9CnJlc2V0Q2FudmFzKCl7c3VwZXIucmVzZXRDYW52YXMoKTt0aGlzLl9iYWNrZ3JvdW5kQ2FudmFzLndpZHRoPXRoaXMuZWxlbWVudC5jbGllbnRXaWR0aCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLl9iYWNrZ3JvdW5kQ2FudmFzLmhlaWdodD10aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0KndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO30KdXBkYXRlKCl7c3VwZXIudXBkYXRlKCk7aWYoIXRoaXMuX21vZGVsKQpyZXR1cm47Y29uc3QgdGltZWxpbmVNb2RlbD10aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCk7Y29uc3QgcXVhbnRTaXplUHg9NCp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCB3aWR0aD10aGlzLndpZHRoKCk7Y29uc3QgaGVpZ2h0PXRoaXMuaGVpZ2h0KCk7Y29uc3QgYmFzZUxpbmU9aGVpZ2h0O2NvbnN0IHRpbWVPZmZzZXQ9dGltZWxpbmVNb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpO2NvbnN0IHRpbWVTcGFuPXRpbWVsaW5lTW9kZWwubWF4aW11bVJlY29yZFRpbWUoKS10aW1lT2Zmc2V0O2NvbnN0IHNjYWxlPXdpZHRoL3RpbWVTcGFuO2NvbnN0IHF1YW50VGltZT1xdWFudFNpemVQeC9zY2FsZTtjb25zdCBjYXRlZ29yaWVzPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5jYXRlZ29yaWVzKCk7Y29uc3QgY2F0ZWdvcnlPcmRlcj1bJ2lkbGUnLCdsb2FkaW5nJywncGFpbnRpbmcnLCdyZW5kZXJpbmcnLCdzY3JpcHRpbmcnLCdvdGhlciddO2NvbnN0IG90aGVySW5kZXg9Y2F0ZWdvcnlPcmRlci5pbmRleE9mKCdvdGhlcicpO2NvbnN0IGlkbGVJbmRleD0wO2NvbnNvbGUuYXNzZXJ0KGlkbGVJbmRleD09PWNhdGVnb3J5T3JkZXIuaW5kZXhPZignaWRsZScpKTtmb3IobGV0IGk9aWRsZUluZGV4KzE7aTxjYXRlZ29yeU9yZGVyLmxlbmd0aDsrK2kpCmNhdGVnb3JpZXNbY2F0ZWdvcnlPcmRlcltpXV0uX292ZXJ2aWV3SW5kZXg9aTtjb25zdCBiYWNrZ3JvdW5kQ29udGV4dD10aGlzLl9iYWNrZ3JvdW5kQ2FudmFzLmdldENvbnRleHQoJzJkJyk7Zm9yKGNvbnN0IHRyYWNrIG9mIHRpbWVsaW5lTW9kZWwudHJhY2tzKCkpe2lmKHRyYWNrLnR5cGU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLk1haW5UaHJlYWQmJnRyYWNrLmZvck1haW5GcmFtZSkKZHJhd1RocmVhZEV2ZW50cyh0aGlzLmNvbnRleHQoKSx0cmFjay5ldmVudHMpO2Vsc2UKZHJhd1RocmVhZEV2ZW50cyhiYWNrZ3JvdW5kQ29udGV4dCx0cmFjay5ldmVudHMpO30KYXBwbHlQYXR0ZXJuKGJhY2tncm91bmRDb250ZXh0KTtmdW5jdGlvbiBkcmF3VGhyZWFkRXZlbnRzKGN0eCxldmVudHMpe2NvbnN0IHF1YW50aXplcj1uZXcgVGltZWxpbmUuUXVhbnRpemVyKHRpbWVPZmZzZXQscXVhbnRUaW1lLGRyYXdTYW1wbGUpO2xldCB4PTA7Y29uc3QgY2F0ZWdvcnlJbmRleFN0YWNrPVtdO2NvbnN0IHBhdGhzPVtdO2NvbnN0IGxhc3RZPVtdO2ZvcihsZXQgaT0wO2k8Y2F0ZWdvcnlPcmRlci5sZW5ndGg7KytpKXtwYXRoc1tpXT1uZXcgUGF0aDJEKCk7cGF0aHNbaV0ubW92ZVRvKDAsaGVpZ2h0KTtsYXN0WVtpXT1oZWlnaHQ7fQpmdW5jdGlvbiBkcmF3U2FtcGxlKGNvdW50ZXJzKXtsZXQgeT1iYXNlTGluZTtmb3IobGV0IGk9aWRsZUluZGV4KzE7aTxjYXRlZ29yeU9yZGVyLmxlbmd0aDsrK2kpe2NvbnN0IGg9KGNvdW50ZXJzW2ldfHwwKS9xdWFudFRpbWUqaGVpZ2h0O3ktPWg7cGF0aHNbaV0uYmV6aWVyQ3VydmVUbyh4LGxhc3RZW2ldLHgseSx4K3F1YW50U2l6ZVB4LzIseSk7bGFzdFlbaV09eTt9CngrPXF1YW50U2l6ZVB4O30KZnVuY3Rpb24gb25FdmVudFN0YXJ0KGUpe2NvbnN0IGluZGV4PWNhdGVnb3J5SW5kZXhTdGFjay5sZW5ndGg/Y2F0ZWdvcnlJbmRleFN0YWNrLnBlZWtMYXN0KCk6aWRsZUluZGV4O3F1YW50aXplci5hcHBlbmRJbnRlcnZhbChlLnN0YXJ0VGltZSxpbmRleCk7Y2F0ZWdvcnlJbmRleFN0YWNrLnB1c2goVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUoZSkuY2F0ZWdvcnkuX292ZXJ2aWV3SW5kZXh8fG90aGVySW5kZXgpO30KZnVuY3Rpb24gb25FdmVudEVuZChlKXtxdWFudGl6ZXIuYXBwZW5kSW50ZXJ2YWwoZS5lbmRUaW1lLGNhdGVnb3J5SW5kZXhTdGFjay5wb3AoKSk7fQpUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuZm9yRWFjaEV2ZW50KGV2ZW50cyxvbkV2ZW50U3RhcnQsb25FdmVudEVuZCk7cXVhbnRpemVyLmFwcGVuZEludGVydmFsKHRpbWVPZmZzZXQrdGltZVNwYW4rcXVhbnRUaW1lLGlkbGVJbmRleCk7Zm9yKGxldCBpPWNhdGVnb3J5T3JkZXIubGVuZ3RoLTE7aT4wOy0taSl7cGF0aHNbaV0ubGluZVRvKHdpZHRoLGhlaWdodCk7Y3R4LmZpbGxTdHlsZT1jYXRlZ29yaWVzW2NhdGVnb3J5T3JkZXJbaV1dLmNvbG9yO2N0eC5maWxsKHBhdGhzW2ldKTt9fQpmdW5jdGlvbiBhcHBseVBhdHRlcm4oY3R4KXtjb25zdCBzdGVwPTQqd2luZG93LmRldmljZVBpeGVsUmF0aW87Y3R4LnNhdmUoKTtjdHgubGluZVdpZHRoPXN0ZXAvTWF0aC5zcXJ0KDgpO2ZvcihsZXQgeD0wLjU7eDx3aWR0aCtoZWlnaHQ7eCs9c3RlcCl7Y3R4Lm1vdmVUbyh4LDApO2N0eC5saW5lVG8oeC1oZWlnaHQsaGVpZ2h0KTt9CmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249J2Rlc3RpbmF0aW9uLW91dCc7Y3R4LnN0cm9rZSgpO2N0eC5yZXN0b3JlKCk7fX19O1RpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld1Jlc3BvbnNpdmVuZXNzPWNsYXNzIGV4dGVuZHMgVGltZWxpbmUuVGltZWxpbmVFdmVudE92ZXJ2aWV3e2NvbnN0cnVjdG9yKCl7c3VwZXIoJ3Jlc3BvbnNpdmVuZXNzJyxudWxsKTt9CnVwZGF0ZSgpe3N1cGVyLnVwZGF0ZSgpO2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuO2NvbnN0IGhlaWdodD10aGlzLmhlaWdodCgpO2NvbnN0IHRpbWVPZmZzZXQ9dGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1pbmltdW1SZWNvcmRUaW1lKCk7Y29uc3QgdGltZVNwYW49dGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1heGltdW1SZWNvcmRUaW1lKCktdGltZU9mZnNldDtjb25zdCBzY2FsZT10aGlzLndpZHRoKCkvdGltZVNwYW47Y29uc3QgZnJhbWVzPXRoaXMuX21vZGVsLmZyYW1lcygpO2NvbnN0IGN0eD0odGhpcy5jb250ZXh0KCkpO2NvbnN0IGZpbGxQYXRoPW5ldyBQYXRoMkQoKTtjb25zdCBtYXJrZXJzUGF0aD1uZXcgUGF0aDJEKCk7Zm9yKGxldCBpPTA7aTxmcmFtZXMubGVuZ3RoOysraSl7Y29uc3QgZnJhbWU9ZnJhbWVzW2ldO2lmKCFmcmFtZS5oYXNXYXJuaW5ncygpKQpjb250aW51ZTtwYWludFdhcm5pbmdEZWNvcmF0aW9uKGZyYW1lLnN0YXJ0VGltZSxmcmFtZS5kdXJhdGlvbik7fQpmb3IoY29uc3QgdHJhY2sgb2YgdGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLnRyYWNrcygpKXtjb25zdCBldmVudHM9dHJhY2suZXZlbnRzO2ZvcihsZXQgaT0wO2k8ZXZlbnRzLmxlbmd0aDsrK2kpe2lmKCFUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudHNbaV0pLndhcm5pbmcpCmNvbnRpbnVlO3BhaW50V2FybmluZ0RlY29yYXRpb24oZXZlbnRzW2ldLnN0YXJ0VGltZSxldmVudHNbaV0uZHVyYXRpb24pO319CmN0eC5maWxsU3R5bGU9J2hzbCgwLCA4MCUsIDkwJSknO2N0eC5zdHJva2VTdHlsZT0ncmVkJztjdHgubGluZVdpZHRoPTIqd2luZG93LmRldmljZVBpeGVsUmF0aW87Y3R4LmZpbGwoZmlsbFBhdGgpO2N0eC5zdHJva2UobWFya2Vyc1BhdGgpO2Z1bmN0aW9uIHBhaW50V2FybmluZ0RlY29yYXRpb24odGltZSxkdXJhdGlvbil7Y29uc3QgeD1NYXRoLnJvdW5kKHNjYWxlKih0aW1lLXRpbWVPZmZzZXQpKTtjb25zdCB3PU1hdGgucm91bmQoc2NhbGUqZHVyYXRpb24pO2ZpbGxQYXRoLnJlY3QoeCwwLHcsaGVpZ2h0KTttYXJrZXJzUGF0aC5tb3ZlVG8oeCt3LDApO21hcmtlcnNQYXRoLmxpbmVUbyh4K3csaGVpZ2h0KTt9fX07VGltZWxpbmUuVGltZWxpbmVGaWxtU3RyaXBPdmVydmlldz1jbGFzcyBleHRlbmRzIFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCdmaWxtc3RyaXAnLG51bGwpO3RoaXMucmVzZXQoKTt9CnVwZGF0ZSgpe3N1cGVyLnVwZGF0ZSgpO2NvbnN0IGZyYW1lcz10aGlzLl9tb2RlbD90aGlzLl9tb2RlbC5maWxtU3RyaXBNb2RlbCgpLmZyYW1lcygpOltdO2lmKCFmcmFtZXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgZHJhd0dlbmVyYXRpb249U3ltYm9sKCdkcmF3R2VuZXJhdGlvbicpO3RoaXMuX2RyYXdHZW5lcmF0aW9uPWRyYXdHZW5lcmF0aW9uO3RoaXMuX2ltYWdlQnlGcmFtZShmcmFtZXNbMF0pLnRoZW4oaW1hZ2U9PntpZih0aGlzLl9kcmF3R2VuZXJhdGlvbiE9PWRyYXdHZW5lcmF0aW9uKQpyZXR1cm47aWYoIWltYWdlfHwhaW1hZ2UubmF0dXJhbFdpZHRofHwhaW1hZ2UubmF0dXJhbEhlaWdodCkKcmV0dXJuO2NvbnN0IGltYWdlSGVpZ2h0PXRoaXMuaGVpZ2h0KCktMipUaW1lbGluZS5UaW1lbGluZUZpbG1TdHJpcE92ZXJ2aWV3LlBhZGRpbmc7Y29uc3QgaW1hZ2VXaWR0aD1NYXRoLmNlaWwoaW1hZ2VIZWlnaHQqaW1hZ2UubmF0dXJhbFdpZHRoL2ltYWdlLm5hdHVyYWxIZWlnaHQpO2NvbnN0IHBvcG92ZXJTY2FsZT1NYXRoLm1pbigyMDAvaW1hZ2UubmF0dXJhbFdpZHRoLDEpO3RoaXMuX2VtcHR5SW1hZ2U9bmV3IEltYWdlKGltYWdlLm5hdHVyYWxXaWR0aCpwb3BvdmVyU2NhbGUsaW1hZ2UubmF0dXJhbEhlaWdodCpwb3BvdmVyU2NhbGUpO3RoaXMuX2RyYXdGcmFtZXMoaW1hZ2VXaWR0aCxpbWFnZUhlaWdodCk7fSk7fQpfaW1hZ2VCeUZyYW1lKGZyYW1lKXtsZXQgaW1hZ2VQcm9taXNlPXRoaXMuX2ZyYW1lVG9JbWFnZVByb21pc2UuZ2V0KGZyYW1lKTtpZighaW1hZ2VQcm9taXNlKXtpbWFnZVByb21pc2U9ZnJhbWUuaW1hZ2VEYXRhUHJvbWlzZSgpLnRoZW4oZGF0YT0+VUkubG9hZEltYWdlRnJvbURhdGEoZGF0YSkpO3RoaXMuX2ZyYW1lVG9JbWFnZVByb21pc2Uuc2V0KGZyYW1lLGltYWdlUHJvbWlzZSk7fQpyZXR1cm4gaW1hZ2VQcm9taXNlO30KX2RyYXdGcmFtZXMoaW1hZ2VXaWR0aCxpbWFnZUhlaWdodCl7aWYoIWltYWdlV2lkdGh8fCF0aGlzLl9tb2RlbCkKcmV0dXJuO2NvbnN0IGZpbG1TdHJpcE1vZGVsPXRoaXMuX21vZGVsLmZpbG1TdHJpcE1vZGVsKCk7aWYoIWZpbG1TdHJpcE1vZGVsLmZyYW1lcygpLmxlbmd0aCkKcmV0dXJuO2NvbnN0IHBhZGRpbmc9VGltZWxpbmUuVGltZWxpbmVGaWxtU3RyaXBPdmVydmlldy5QYWRkaW5nO2NvbnN0IHdpZHRoPXRoaXMud2lkdGgoKTtjb25zdCB6ZXJvVGltZT1maWxtU3RyaXBNb2RlbC56ZXJvVGltZSgpO2NvbnN0IHNwYW5UaW1lPWZpbG1TdHJpcE1vZGVsLnNwYW5UaW1lKCk7Y29uc3Qgc2NhbGU9c3BhblRpbWUvd2lkdGg7Y29uc3QgY29udGV4dD10aGlzLmNvbnRleHQoKTtjb25zdCBkcmF3R2VuZXJhdGlvbj10aGlzLl9kcmF3R2VuZXJhdGlvbjtjb250ZXh0LmJlZ2luUGF0aCgpO2ZvcihsZXQgeD1wYWRkaW5nO3g8d2lkdGg7eCs9aW1hZ2VXaWR0aCsyKnBhZGRpbmcpe2NvbnN0IHRpbWU9emVyb1RpbWUrKHgraW1hZ2VXaWR0aC8yKSpzY2FsZTtjb25zdCBmcmFtZT1maWxtU3RyaXBNb2RlbC5mcmFtZUJ5VGltZXN0YW1wKHRpbWUpO2lmKCFmcmFtZSkKY29udGludWU7Y29udGV4dC5yZWN0KHgtMC41LDAuNSxpbWFnZVdpZHRoKzEsaW1hZ2VIZWlnaHQrMSk7dGhpcy5faW1hZ2VCeUZyYW1lKGZyYW1lKS50aGVuKGRyYXdGcmFtZUltYWdlLmJpbmQodGhpcyx4KSk7fQpjb250ZXh0LnN0cm9rZVN0eWxlPScjZGRkJztjb250ZXh0LnN0cm9rZSgpO2Z1bmN0aW9uIGRyYXdGcmFtZUltYWdlKHgsaW1hZ2Upe2lmKHRoaXMuX2RyYXdHZW5lcmF0aW9uIT09ZHJhd0dlbmVyYXRpb258fCFpbWFnZSkKcmV0dXJuO2NvbnRleHQuZHJhd0ltYWdlKGltYWdlLHgsMSxpbWFnZVdpZHRoLGltYWdlSGVpZ2h0KTt9fQpvdmVydmlld0luZm9Qcm9taXNlKHgpe2lmKCF0aGlzLl9tb2RlbHx8IXRoaXMuX21vZGVsLmZpbG1TdHJpcE1vZGVsKCkuZnJhbWVzKCkubGVuZ3RoKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChudWxsKSk7Y29uc3QgdGltZT10aGlzLmNhbGN1bGF0b3IoKS5wb3NpdGlvblRvVGltZSh4KTtjb25zdCBmcmFtZT10aGlzLl9tb2RlbC5maWxtU3RyaXBNb2RlbCgpLmZyYW1lQnlUaW1lc3RhbXAodGltZSk7aWYoZnJhbWU9PT10aGlzLl9sYXN0RnJhbWUpCnJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFzdEVsZW1lbnQpO2NvbnN0IGltYWdlUHJvbWlzZT1mcmFtZT90aGlzLl9pbWFnZUJ5RnJhbWUoZnJhbWUpOlByb21pc2UucmVzb2x2ZSh0aGlzLl9lbXB0eUltYWdlKTtyZXR1cm4gaW1hZ2VQcm9taXNlLnRoZW4oY3JlYXRlRnJhbWVFbGVtZW50LmJpbmQodGhpcykpO2Z1bmN0aW9uIGNyZWF0ZUZyYW1lRWxlbWVudChpbWFnZSl7Y29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdmcmFtZScpO2lmKGltYWdlKQplbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aHVtYm5haWwnKS5hcHBlbmRDaGlsZChpbWFnZSk7dGhpcy5fbGFzdEZyYW1lPWZyYW1lO3RoaXMuX2xhc3RFbGVtZW50PWVsZW1lbnQ7cmV0dXJuIGVsZW1lbnQ7fX0KcmVzZXQoKXt0aGlzLl9sYXN0RnJhbWU9dW5kZWZpbmVkO3RoaXMuX2xhc3RFbGVtZW50PW51bGw7dGhpcy5fZnJhbWVUb0ltYWdlUHJvbWlzZT1uZXcgTWFwKCk7dGhpcy5faW1hZ2VXaWR0aD0wO319O1RpbWVsaW5lLlRpbWVsaW5lRmlsbVN0cmlwT3ZlcnZpZXcuUGFkZGluZz0yO1RpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld0ZyYW1lcz1jbGFzcyBleHRlbmRzIFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCdmcmFtZXJhdGUnLENvbW1vbi5VSVN0cmluZygnRlBTJykpO30KdXBkYXRlKCl7c3VwZXIudXBkYXRlKCk7aWYoIXRoaXMuX21vZGVsKQpyZXR1cm47Y29uc3QgZnJhbWVzPXRoaXMuX21vZGVsLmZyYW1lcygpO2lmKCFmcmFtZXMubGVuZ3RoKQpyZXR1cm47Y29uc3QgaGVpZ2h0PXRoaXMuaGVpZ2h0KCk7Y29uc3QgcGFkZGluZz0xKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO2NvbnN0IGJhc2VGcmFtZUR1cmF0aW9uTXM9MWUzLzYwO2NvbnN0IHZpc3VhbEhlaWdodD1oZWlnaHQtMipwYWRkaW5nO2NvbnN0IHRpbWVPZmZzZXQ9dGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1pbmltdW1SZWNvcmRUaW1lKCk7Y29uc3QgdGltZVNwYW49dGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLm1heGltdW1SZWNvcmRUaW1lKCktdGltZU9mZnNldDtjb25zdCBzY2FsZT10aGlzLndpZHRoKCkvdGltZVNwYW47Y29uc3QgYmFzZVk9aGVpZ2h0LXBhZGRpbmc7Y29uc3QgY3R4PXRoaXMuY29udGV4dCgpO2NvbnN0IGJvdHRvbVk9YmFzZVkrMTAqd2luZG93LmRldmljZVBpeGVsUmF0aW87bGV0IHg9MDtsZXQgeT1ib3R0b21ZO2NvbnN0IGxpbmVXaWR0aD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjb25zdCBvZmZzZXQ9bGluZVdpZHRoJjE/MC41OjA7Y29uc3QgdGlja0RlcHRoPTEuNSp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbygwLHkpO2ZvcihsZXQgaT0wO2k8ZnJhbWVzLmxlbmd0aDsrK2kpe2NvbnN0IGZyYW1lPWZyYW1lc1tpXTt4PU1hdGgucm91bmQoKGZyYW1lLnN0YXJ0VGltZS10aW1lT2Zmc2V0KSpzY2FsZSkrb2Zmc2V0O2N0eC5saW5lVG8oeCx5KTtjdHgubGluZVRvKHgseSt0aWNrRGVwdGgpO3k9ZnJhbWUuaWRsZT9ib3R0b21ZOk1hdGgucm91bmQoYmFzZVktdmlzdWFsSGVpZ2h0Kk1hdGgubWluKGJhc2VGcmFtZUR1cmF0aW9uTXMvZnJhbWUuZHVyYXRpb24sMSkpLW9mZnNldDtjdHgubGluZVRvKHgseSt0aWNrRGVwdGgpO2N0eC5saW5lVG8oeCx5KTt9CmNvbnN0IGxhc3RGcmFtZT1mcmFtZXMucGVla0xhc3QoKTt4PU1hdGgucm91bmQoKGxhc3RGcmFtZS5zdGFydFRpbWUrbGFzdEZyYW1lLmR1cmF0aW9uLXRpbWVPZmZzZXQpKnNjYWxlKStvZmZzZXQ7Y3R4LmxpbmVUbyh4LHkpO2N0eC5saW5lVG8oeCxib3R0b21ZKTtjdHguZmlsbFN0eWxlPSdoc2woMTEwLCA1MCUsIDg4JSknO2N0eC5zdHJva2VTdHlsZT0naHNsKDExMCwgNTAlLCA2MCUpJztjdHgubGluZVdpZHRoPWxpbmVXaWR0aDtjdHguZmlsbCgpO2N0eC5zdHJva2UoKTt9fTtUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdNZW1vcnk9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcignbWVtb3J5JyxDb21tb24uVUlTdHJpbmcoJ0hFQVAnKSk7dGhpcy5faGVhcFNpemVMYWJlbD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ21lbW9yeS1ncmFwaC1sYWJlbCcpO30KcmVzZXRIZWFwU2l6ZUxhYmVscygpe3RoaXMuX2hlYXBTaXplTGFiZWwudGV4dENvbnRlbnQ9Jyc7fQp1cGRhdGUoKXtzdXBlci51cGRhdGUoKTtjb25zdCByYXRpbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztpZighdGhpcy5fbW9kZWwpe3RoaXMucmVzZXRIZWFwU2l6ZUxhYmVscygpO3JldHVybjt9CmNvbnN0IHRyYWNrcz10aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCkudHJhY2tzKCkuZmlsdGVyKHRyYWNrPT50cmFjay50eXBlPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5NYWluVGhyZWFkJiZ0cmFjay5mb3JNYWluRnJhbWUpO2NvbnN0IHRyYWNrRXZlbnRzPXRyYWNrcy5tYXAodHJhY2s9PnRyYWNrLmV2ZW50cyk7Y29uc3QgbG93ZXJPZmZzZXQ9MypyYXRpbztsZXQgbWF4VXNlZEhlYXBTaXplPTA7bGV0IG1pblVzZWRIZWFwU2l6ZT0xMDAwMDAwMDAwMDA7Y29uc3QgbWluVGltZT10aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCkubWluaW11bVJlY29yZFRpbWUoKTtjb25zdCBtYXhUaW1lPXRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKS5tYXhpbXVtUmVjb3JkVGltZSgpO2Z1bmN0aW9uIGlzVXBkYXRlQ291bnRlcnNFdmVudChldmVudCl7cmV0dXJuIGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5VcGRhdGVDb3VudGVyczt9CmZvcihsZXQgaT0wO2k8dHJhY2tFdmVudHMubGVuZ3RoO2krKykKdHJhY2tFdmVudHNbaV09dHJhY2tFdmVudHNbaV0uZmlsdGVyKGlzVXBkYXRlQ291bnRlcnNFdmVudCk7ZnVuY3Rpb24gY2FsY3VsYXRlTWluTWF4U2l6ZXMoZXZlbnQpe2NvbnN0IGNvdW50ZXJzPWV2ZW50LmFyZ3MuZGF0YTtpZighY291bnRlcnN8fCFjb3VudGVycy5qc0hlYXBTaXplVXNlZCkKcmV0dXJuO21heFVzZWRIZWFwU2l6ZT1NYXRoLm1heChtYXhVc2VkSGVhcFNpemUsY291bnRlcnMuanNIZWFwU2l6ZVVzZWQpO21pblVzZWRIZWFwU2l6ZT1NYXRoLm1pbihtaW5Vc2VkSGVhcFNpemUsY291bnRlcnMuanNIZWFwU2l6ZVVzZWQpO30KZm9yKGxldCBpPTA7aTx0cmFja0V2ZW50cy5sZW5ndGg7aSsrKQp0cmFja0V2ZW50c1tpXS5mb3JFYWNoKGNhbGN1bGF0ZU1pbk1heFNpemVzKTttaW5Vc2VkSGVhcFNpemU9TWF0aC5taW4obWluVXNlZEhlYXBTaXplLG1heFVzZWRIZWFwU2l6ZSk7Y29uc3QgbGluZVdpZHRoPTE7Y29uc3Qgd2lkdGg9dGhpcy53aWR0aCgpO2NvbnN0IGhlaWdodD10aGlzLmhlaWdodCgpLWxvd2VyT2Zmc2V0O2NvbnN0IHhGYWN0b3I9d2lkdGgvKG1heFRpbWUtbWluVGltZSk7Y29uc3QgeUZhY3Rvcj0oaGVpZ2h0LWxpbmVXaWR0aCkvTWF0aC5tYXgobWF4VXNlZEhlYXBTaXplLW1pblVzZWRIZWFwU2l6ZSwxKTtjb25zdCBoaXN0b2dyYW09bmV3IEFycmF5KHdpZHRoKTtmdW5jdGlvbiBidWlsZEhpc3RvZ3JhbShldmVudCl7Y29uc3QgY291bnRlcnM9ZXZlbnQuYXJncy5kYXRhO2lmKCFjb3VudGVyc3x8IWNvdW50ZXJzLmpzSGVhcFNpemVVc2VkKQpyZXR1cm47Y29uc3QgeD1NYXRoLnJvdW5kKChldmVudC5zdGFydFRpbWUtbWluVGltZSkqeEZhY3Rvcik7Y29uc3QgeT1NYXRoLnJvdW5kKChjb3VudGVycy5qc0hlYXBTaXplVXNlZC1taW5Vc2VkSGVhcFNpemUpKnlGYWN0b3IpO2hpc3RvZ3JhbVt4XT1NYXRoLm1heChoaXN0b2dyYW1beF18fDAseSk7fQpmb3IobGV0IGk9MDtpPHRyYWNrRXZlbnRzLmxlbmd0aDtpKyspCnRyYWNrRXZlbnRzW2ldLmZvckVhY2goYnVpbGRIaXN0b2dyYW0pO2NvbnN0IGN0eD10aGlzLmNvbnRleHQoKTtjb25zdCBoZWlnaHRCZXlvbmRWaWV3PWhlaWdodCtsb3dlck9mZnNldCtsaW5lV2lkdGg7Y3R4LnRyYW5zbGF0ZSgwLjUsMC41KTtjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbygtbGluZVdpZHRoLGhlaWdodEJleW9uZFZpZXcpO2xldCB5PTA7bGV0IGlzRmlyc3RQb2ludD10cnVlO2xldCBsYXN0WD0wO2ZvcihsZXQgeD0wO3g8aGlzdG9ncmFtLmxlbmd0aDt4Kyspe2lmKHR5cGVvZiBoaXN0b2dyYW1beF09PT0ndW5kZWZpbmVkJykKY29udGludWU7aWYoaXNGaXJzdFBvaW50KXtpc0ZpcnN0UG9pbnQ9ZmFsc2U7eT1oaXN0b2dyYW1beF07Y3R4LmxpbmVUbygtbGluZVdpZHRoLGhlaWdodC15KTt9CmNvbnN0IG5leHRZPWhpc3RvZ3JhbVt4XTtpZihNYXRoLmFicyhuZXh0WS15KT4yJiZNYXRoLmFicyh4LWxhc3RYKT4xKQpjdHgubGluZVRvKHgsaGVpZ2h0LXkpO3k9bmV4dFk7Y3R4LmxpbmVUbyh4LGhlaWdodC15KTtsYXN0WD14O30KY3R4LmxpbmVUbyh3aWR0aCtsaW5lV2lkdGgsaGVpZ2h0LXkpO2N0eC5saW5lVG8od2lkdGgrbGluZVdpZHRoLGhlaWdodEJleW9uZFZpZXcpO2N0eC5jbG9zZVBhdGgoKTtjdHguZmlsbFN0eWxlPSdoc2xhKDIyMCwgOTAlLCA3MCUsIDAuMiknO2N0eC5maWxsKCk7Y3R4LmxpbmVXaWR0aD1saW5lV2lkdGg7Y3R4LnN0cm9rZVN0eWxlPSdoc2woMjIwLCA5MCUsIDcwJSknO2N0eC5zdHJva2UoKTt0aGlzLl9oZWFwU2l6ZUxhYmVsLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnJXMgXHUyMDEzICVzJyxOdW1iZXIuYnl0ZXNUb1N0cmluZyhtaW5Vc2VkSGVhcFNpemUpLE51bWJlci5ieXRlc1RvU3RyaW5nKG1heFVzZWRIZWFwU2l6ZSkpO319O1RpbWVsaW5lLlF1YW50aXplcj1jbGFzc3tjb25zdHJ1Y3RvcihzdGFydFRpbWUscXVhbnREdXJhdGlvbixjYWxsYmFjayl7dGhpcy5fbGFzdFRpbWU9c3RhcnRUaW1lO3RoaXMuX3F1YW50RHVyYXRpb249cXVhbnREdXJhdGlvbjt0aGlzLl9jYWxsYmFjaz1jYWxsYmFjazt0aGlzLl9jb3VudGVycz1bXTt0aGlzLl9yZW1haW5kZXI9cXVhbnREdXJhdGlvbjt9CmFwcGVuZEludGVydmFsKHRpbWUsZ3JvdXApe2xldCBpbnRlcnZhbD10aW1lLXRoaXMuX2xhc3RUaW1lO2lmKGludGVydmFsPD10aGlzLl9yZW1haW5kZXIpe3RoaXMuX2NvdW50ZXJzW2dyb3VwXT0odGhpcy5fY291bnRlcnNbZ3JvdXBdfHwwKStpbnRlcnZhbDt0aGlzLl9yZW1haW5kZXItPWludGVydmFsO3RoaXMuX2xhc3RUaW1lPXRpbWU7cmV0dXJuO30KdGhpcy5fY291bnRlcnNbZ3JvdXBdPSh0aGlzLl9jb3VudGVyc1tncm91cF18fDApK3RoaXMuX3JlbWFpbmRlcjt0aGlzLl9jYWxsYmFjayh0aGlzLl9jb3VudGVycyk7aW50ZXJ2YWwtPXRoaXMuX3JlbWFpbmRlcjt3aGlsZShpbnRlcnZhbD49dGhpcy5fcXVhbnREdXJhdGlvbil7Y29uc3QgY291bnRlcnM9W107Y291bnRlcnNbZ3JvdXBdPXRoaXMuX3F1YW50RHVyYXRpb247dGhpcy5fY2FsbGJhY2soY291bnRlcnMpO2ludGVydmFsLT10aGlzLl9xdWFudER1cmF0aW9uO30KdGhpcy5fY291bnRlcnM9W107dGhpcy5fY291bnRlcnNbZ3JvdXBdPWludGVydmFsO3RoaXMuX2xhc3RUaW1lPXRpbWU7dGhpcy5fcmVtYWluZGVyPXRoaXMuX3F1YW50RHVyYXRpb24taW50ZXJ2YWw7fX07O1RpbWVsaW5lLlRpbWVsaW5lRmlsdGVycz17fTtUaW1lbGluZS5UaW1lbGluZUZpbHRlcnMuSXNMb25nPWNsYXNzIGV4dGVuZHMgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsRmlsdGVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9taW5pbXVtUmVjb3JkRHVyYXRpb249MDt9CnNldE1pbmltdW1SZWNvcmREdXJhdGlvbih2YWx1ZSl7dGhpcy5fbWluaW11bVJlY29yZER1cmF0aW9uPXZhbHVlO30KYWNjZXB0KGV2ZW50KXtjb25zdCBkdXJhdGlvbj1ldmVudC5lbmRUaW1lP2V2ZW50LmVuZFRpbWUtZXZlbnQuc3RhcnRUaW1lOjA7cmV0dXJuIGR1cmF0aW9uPj10aGlzLl9taW5pbXVtUmVjb3JkRHVyYXRpb247fX07VGltZWxpbmUuVGltZWxpbmVGaWx0ZXJzLkNhdGVnb3J5PWNsYXNzIGV4dGVuZHMgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsRmlsdGVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt9CmFjY2VwdChldmVudCl7cmV0dXJuIVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFN0eWxlKGV2ZW50KS5jYXRlZ29yeS5oaWRkZW47fX07VGltZWxpbmUuVGltZWxpbmVGaWx0ZXJzLlJlZ0V4cD1jbGFzcyBleHRlbmRzIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbEZpbHRlcntjb25zdHJ1Y3RvcihyZWdFeHApe3N1cGVyKCk7dGhpcy5fcmVnRXhwO3RoaXMuc2V0UmVnRXhwKHJlZ0V4cHx8bnVsbCk7fQpzZXRSZWdFeHAocmVnRXhwKXt0aGlzLl9yZWdFeHA9cmVnRXhwO30KcmVnRXhwKCl7cmV0dXJuIHRoaXMuX3JlZ0V4cDt9CmFjY2VwdChldmVudCl7cmV0dXJuIXRoaXMuX3JlZ0V4cHx8VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLnRlc3RDb250ZW50TWF0Y2hpbmcoZXZlbnQsdGhpcy5fcmVnRXhwKTt9fTs7VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyPWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5yZXNldCgpO3RoaXMuX2ZvbnQ9JzExcHggJytIb3N0LmZvbnRGYW1pbHkoKTt0aGlzLl90aW1lbGluZURhdGE9bnVsbDt0aGlzLl9jdXJyZW50TGV2ZWw9MDt0aGlzLl9wZXJmb3JtYW5jZU1vZGVsPW51bGw7dGhpcy5fbW9kZWw9bnVsbDt0aGlzLl9taW5pbXVtQm91bmRhcnk9MDt0aGlzLl9tYXhpbXVtQm91bmRhcnk9MDt0aGlzLl90aW1lU3Bhbj0wO3RoaXMuX2NvbnNvbGVDb2xvckdlbmVyYXRvcj1uZXcgQ29tbW9uLkNvbG9yLkdlbmVyYXRvcih7bWluOjMwLG1heDo1NX0se21pbjo3MCxtYXg6MTAwLGNvdW50OjZ9LDUwLDAuNyk7dGhpcy5fZXh0ZW5zaW9uQ29sb3JHZW5lcmF0b3I9bmV3IENvbW1vbi5Db2xvci5HZW5lcmF0b3Ioe21pbjoyMTAsbWF4OjMwMH0se21pbjo3MCxtYXg6MTAwLGNvdW50OjZ9LDcwLDAuNyk7dGhpcy5faGVhZGVyTGV2ZWwxPXRoaXMuX2J1aWxkR3JvdXBTdHlsZSh7c2hhcmVIZWFkZXJMaW5lOmZhbHNlfSk7dGhpcy5faGVhZGVyTGV2ZWwyPXRoaXMuX2J1aWxkR3JvdXBTdHlsZSh7cGFkZGluZzoyLG5lc3RpbmdMZXZlbDoxLGNvbGxhcHNpYmxlOmZhbHNlfSk7dGhpcy5fc3RhdGljSGVhZGVyPXRoaXMuX2J1aWxkR3JvdXBTdHlsZSh7Y29sbGFwc2libGU6ZmFsc2V9KTt0aGlzLl9mcmFtZXNIZWFkZXI9dGhpcy5fYnVpbGRHcm91cFN0eWxlKHt1c2VGaXJzdExpbmVGb3JPdmVydmlldzp0cnVlfSk7dGhpcy5fc2NyZWVuc2hvdHNIZWFkZXI9dGhpcy5fYnVpbGRHcm91cFN0eWxlKHt1c2VGaXJzdExpbmVGb3JPdmVydmlldzp0cnVlLG5lc3RpbmdMZXZlbDoxLGNvbGxhcHNpYmxlOmZhbHNlLGl0ZW1zSGVpZ2h0OjE1MH0pO3RoaXMuX2ludGVyYWN0aW9uc0hlYWRlckxldmVsMT10aGlzLl9idWlsZEdyb3VwU3R5bGUoe3VzZUZpcnN0TGluZUZvck92ZXJ2aWV3OnRydWV9KTt0aGlzLl9pbnRlcmFjdGlvbnNIZWFkZXJMZXZlbDI9dGhpcy5fYnVpbGRHcm91cFN0eWxlKHtwYWRkaW5nOjIsbmVzdGluZ0xldmVsOjF9KTt0aGlzLl9mbG93RXZlbnRJbmRleEJ5SWQ9bmV3IE1hcCgpO30KX2J1aWxkR3JvdXBTdHlsZShleHRyYSl7Y29uc3QgZGVmYXVsdEdyb3VwU3R5bGU9e3BhZGRpbmc6NCxoZWlnaHQ6MTcsY29sbGFwc2libGU6dHJ1ZSxjb2xvcjpVSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyMyMjInLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpLGJhY2tncm91bmRDb2xvcjpVSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJ3doaXRlJyxVSS5UaGVtZVN1cHBvcnQuQ29sb3JVc2FnZS5CYWNrZ3JvdW5kKSxmb250OnRoaXMuX2ZvbnQsbmVzdGluZ0xldmVsOjAsc2hhcmVIZWFkZXJMaW5lOnRydWV9O3JldHVybihPYmplY3QuYXNzaWduKGRlZmF1bHRHcm91cFN0eWxlLGV4dHJhKSk7fQpzZXRNb2RlbChwZXJmb3JtYW5jZU1vZGVsKXt0aGlzLnJlc2V0KCk7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbD1wZXJmb3JtYW5jZU1vZGVsO3RoaXMuX21vZGVsPXBlcmZvcm1hbmNlTW9kZWwmJnBlcmZvcm1hbmNlTW9kZWwudGltZWxpbmVNb2RlbCgpO30KZ3JvdXBUcmFjayhncm91cCl7cmV0dXJuIGdyb3VwLl90cmFja3x8bnVsbDt9CmVudHJ5VGl0bGUoZW50cnlJbmRleCl7Y29uc3QgZW50cnlUeXBlcz1UaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRW50cnlUeXBlO2NvbnN0IGVudHJ5VHlwZT10aGlzLl9lbnRyeVR5cGUoZW50cnlJbmRleCk7aWYoZW50cnlUeXBlPT09ZW50cnlUeXBlcy5FdmVudCl7Y29uc3QgZXZlbnQ9KHRoaXMuX2VudHJ5RGF0YVtlbnRyeUluZGV4XSk7aWYoZXZlbnQucGhhc2U9PT1TREsuVHJhY2luZ01vZGVsLlBoYXNlLkFzeW5jU3RlcEludG98fGV2ZW50LnBoYXNlPT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5Bc3luY1N0ZXBQYXN0KQpyZXR1cm4gZXZlbnQubmFtZSsnOicrZXZlbnQuYXJnc1snc3RlcCddO2lmKGV2ZW50Ll9ibGFja2JveFJvb3QpCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ0JsYWNrYm94ZWQnKTtjb25zdCBuYW1lPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFN0eWxlKGV2ZW50KS50aXRsZTtjb25zdCBkZXRhaWxzVGV4dD1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuYnVpbGREZXRhaWxzVGV4dEZvclRyYWNlRXZlbnQoZXZlbnQsdGhpcy5fbW9kZWwudGFyZ2V0QnlFdmVudChldmVudCkpO2lmKGV2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5KU0ZyYW1lJiZkZXRhaWxzVGV4dCkKcmV0dXJuIGRldGFpbHNUZXh0O3JldHVybiBkZXRhaWxzVGV4dD9Db21tb24uVUlTdHJpbmcoJyVzICglcyknLG5hbWUsZGV0YWlsc1RleHQpOm5hbWU7fQppZihlbnRyeVR5cGU9PT1lbnRyeVR5cGVzLkV4dGVuc2lvbkV2ZW50KXtjb25zdCBldmVudD0odGhpcy5fZW50cnlEYXRhW2VudHJ5SW5kZXhdKTtyZXR1cm4gZXZlbnQubmFtZTt9CmlmKGVudHJ5VHlwZT09PWVudHJ5VHlwZXMuU2NyZWVuc2hvdCkKcmV0dXJuJyc7bGV0IHRpdGxlPXRoaXMuX2VudHJ5SW5kZXhUb1RpdGxlW2VudHJ5SW5kZXhdO2lmKCF0aXRsZSl7dGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdVbmV4cGVjdGVkIGVudHJ5SW5kZXggJWQnLGVudHJ5SW5kZXgpO2NvbnNvbGUuZXJyb3IodGl0bGUpO30KcmV0dXJuIHRpdGxlO30KdGV4dENvbG9yKGluZGV4KXtjb25zdCBldmVudD10aGlzLl9lbnRyeURhdGFbaW5kZXhdO3JldHVybiBldmVudCYmZXZlbnQuX2JsYWNrYm94Um9vdD8nIzg4OCc6VGltZWxpbmUuRmxhbWVDaGFydFN0eWxlLnRleHRDb2xvcjt9CmVudHJ5Rm9udChpbmRleCl7cmV0dXJuIHRoaXMuX2ZvbnQ7fQpyZXNldCgpe3RoaXMuX2N1cnJlbnRMZXZlbD0wO3RoaXMuX3RpbWVsaW5lRGF0YT1udWxsO3RoaXMuX2VudHJ5RGF0YT1bXTt0aGlzLl9lbnRyeVBhcmVudD1bXTt0aGlzLl9lbnRyeVR5cGVCeUxldmVsPVtdO3RoaXMuX2VudHJ5SW5kZXhUb1RpdGxlPVtdO3RoaXMuX21hcmtlcnM9W107dGhpcy5fYXN5bmNDb2xvckJ5Q2F0ZWdvcnk9bmV3IE1hcCgpO3RoaXMuX2FzeW5jQ29sb3JCeUludGVyYWN0aW9uUGhhc2U9bmV3IE1hcCgpO3RoaXMuX2V4dGVuc2lvbkluZm89W107dGhpcy5fc2NyZWVuc2hvdEltYWdlQ2FjaGU9bmV3IE1hcCgpO30KbWF4U3RhY2tEZXB0aCgpe3JldHVybiB0aGlzLl9jdXJyZW50TGV2ZWw7fQp0aW1lbGluZURhdGEoKXtpZih0aGlzLl90aW1lbGluZURhdGEpCnJldHVybiB0aGlzLl90aW1lbGluZURhdGE7dGhpcy5fdGltZWxpbmVEYXRhPW5ldyBQZXJmVUkuRmxhbWVDaGFydC5UaW1lbGluZURhdGEoW10sW10sW10sW10pO2lmKCF0aGlzLl9tb2RlbCkKcmV0dXJuIHRoaXMuX3RpbWVsaW5lRGF0YTt0aGlzLl9mbG93RXZlbnRJbmRleEJ5SWQuY2xlYXIoKTt0aGlzLl9taW5pbXVtQm91bmRhcnk9dGhpcy5fbW9kZWwubWluaW11bVJlY29yZFRpbWUoKTt0aGlzLl90aW1lU3Bhbj10aGlzLl9tb2RlbC5pc0VtcHR5KCk/MTAwMDp0aGlzLl9tb2RlbC5tYXhpbXVtUmVjb3JkVGltZSgpLXRoaXMuX21pbmltdW1Cb3VuZGFyeTt0aGlzLl9jdXJyZW50TGV2ZWw9MDtpZih0aGlzLl9tb2RlbC5pc0dlbmVyaWNUcmFjZSgpKQp0aGlzLl9wcm9jZXNzR2VuZXJpY1RyYWNlKCk7ZWxzZQp0aGlzLl9wcm9jZXNzSW5zcGVjdG9yVHJhY2UoKTtyZXR1cm4gdGhpcy5fdGltZWxpbmVEYXRhO30KX3Byb2Nlc3NHZW5lcmljVHJhY2UoKXtjb25zdCBwcm9jZXNzR3JvdXBTdHlsZT10aGlzLl9idWlsZEdyb3VwU3R5bGUoe3NoYXJlSGVhZGVyTGluZTpmYWxzZX0pO2NvbnN0IHRocmVhZEdyb3VwU3R5bGU9dGhpcy5fYnVpbGRHcm91cFN0eWxlKHtwYWRkaW5nOjIsbmVzdGluZ0xldmVsOjEsc2hhcmVIZWFkZXJMaW5lOmZhbHNlfSk7Y29uc3QgZXZlbnRFbnRyeVR5cGU9VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5FdmVudDtjb25zdCB0cmFja3NCeVByb2Nlc3M9bmV3IE11bHRpbWFwKCk7Zm9yKGNvbnN0IHRyYWNrIG9mIHRoaXMuX21vZGVsLnRyYWNrcygpKQp0cmFja3NCeVByb2Nlc3Muc2V0KHRyYWNrLnRocmVhZC5wcm9jZXNzKCksdHJhY2spO2Zvcihjb25zdCBwcm9jZXNzIG9mIHRyYWNrc0J5UHJvY2Vzcy5rZXlzQXJyYXkoKSl7aWYodHJhY2tzQnlQcm9jZXNzLnNpemU+MSl7Y29uc3QgbmFtZT1gJHtwcm9jZXNzLm5hbWUoKX0gJHtwcm9jZXNzLmlkKCl9YDt0aGlzLl9hcHBlbmRIZWFkZXIobmFtZSxwcm9jZXNzR3JvdXBTdHlsZSxmYWxzZSk7fQpmb3IoY29uc3QgdHJhY2sgb2YgdHJhY2tzQnlQcm9jZXNzLmdldChwcm9jZXNzKSl7Y29uc3QgZ3JvdXA9dGhpcy5fYXBwZW5kU3luY0V2ZW50cyh0cmFjayx0cmFjay5ldmVudHMsdHJhY2submFtZSx0aHJlYWRHcm91cFN0eWxlLGV2ZW50RW50cnlUeXBlLHRydWUpO2lmKCF0aGlzLl90aW1lbGluZURhdGEuc2VsZWN0ZWRHcm91cHx8dHJhY2submFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5Ccm93c2VyTWFpblRocmVhZE5hbWUpCnRoaXMuX3RpbWVsaW5lRGF0YS5zZWxlY3RlZEdyb3VwPWdyb3VwO319fQpfcHJvY2Vzc0luc3BlY3RvclRyYWNlKCl7dGhpcy5fYXBwZW5kRnJhbWVCYXJzKCk7dGhpcy5fYXBwZW5kSW50ZXJhY3Rpb25SZWNvcmRzKCk7Y29uc3QgZXZlbnRFbnRyeVR5cGU9VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5FdmVudDtjb25zdCB3ZWlnaHQ9dHJhY2s9Pntzd2l0Y2godHJhY2sudHlwZSl7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLklucHV0OnJldHVybiAwO2Nhc2UgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5BbmltYXRpb246cmV0dXJuIDE7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLlVzZXJUaW1pbmc6cmV0dXJuIDI7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkNvbnNvbGU6cmV0dXJuIDM7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLk1haW5UaHJlYWQ6cmV0dXJuIHRyYWNrLmZvck1haW5GcmFtZT80OjU7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLldvcmtlcjpyZXR1cm4gNjtjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuUmFzdGVyOnJldHVybiA3O2Nhc2UgVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlRyYWNrVHlwZS5HUFU6cmV0dXJuIDg7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLk90aGVyOnJldHVybiA5O319O2NvbnN0IHRyYWNrcz10aGlzLl9tb2RlbC50cmFja3MoKS5zbGljZSgpO3RyYWNrcy5zdGFibGVTb3J0KChhLGIpPT53ZWlnaHQoYSktd2VpZ2h0KGIpKTtsZXQgcmFzdGVyQ291bnQ9MDtmb3IoY29uc3QgdHJhY2sgb2YgdHJhY2tzKXtzd2l0Y2godHJhY2sudHlwZSl7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLklucHV0OnRoaXMuX2FwcGVuZEFzeW5jRXZlbnRzR3JvdXAodHJhY2ssbHNgSW5wdXRgLHRyYWNrLmFzeW5jRXZlbnRzLHRoaXMuX2ludGVyYWN0aW9uc0hlYWRlckxldmVsMixldmVudEVudHJ5VHlwZSxmYWxzZSk7YnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkFuaW1hdGlvbjp0aGlzLl9hcHBlbmRBc3luY0V2ZW50c0dyb3VwKHRyYWNrLGxzYEFuaW1hdGlvbmAsdHJhY2suYXN5bmNFdmVudHMsdGhpcy5faW50ZXJhY3Rpb25zSGVhZGVyTGV2ZWwyLGV2ZW50RW50cnlUeXBlLGZhbHNlKTticmVhaztjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuVXNlclRpbWluZzp0aGlzLl9hcHBlbmRBc3luY0V2ZW50c0dyb3VwKHRyYWNrLGxzYFVzZXIgVGltaW5nYCx0cmFjay5hc3luY0V2ZW50cyx0aGlzLl9oZWFkZXJMZXZlbDEsZXZlbnRFbnRyeVR5cGUsdHJ1ZSk7YnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkNvbnNvbGU6dGhpcy5fYXBwZW5kQXN5bmNFdmVudHNHcm91cCh0cmFjayxsc2BDb25zb2xlYCx0cmFjay5hc3luY0V2ZW50cyx0aGlzLl9oZWFkZXJMZXZlbDEsZXZlbnRFbnRyeVR5cGUsdHJ1ZSk7YnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLk1haW5UaHJlYWQ6aWYodHJhY2suZm9yTWFpbkZyYW1lKXtjb25zdCBncm91cD10aGlzLl9hcHBlbmRTeW5jRXZlbnRzKHRyYWNrLHRyYWNrLmV2ZW50cyx0cmFjay51cmw/bHNgTWFpbiBcdTIwMTQgJHt0cmFjay51cmx9YDpsc2BNYWluYCx0aGlzLl9oZWFkZXJMZXZlbDEsZXZlbnRFbnRyeVR5cGUsdHJ1ZSk7aWYoZ3JvdXApCnRoaXMuX3RpbWVsaW5lRGF0YS5zZWxlY3RlZEdyb3VwPWdyb3VwO31lbHNle3RoaXMuX2FwcGVuZFN5bmNFdmVudHModHJhY2ssdHJhY2suZXZlbnRzLHRyYWNrLnVybD9sc2BGcmFtZSBcdTIwMTQgJHt0cmFjay51cmx9YDpsc2BTdWJmcmFtZWAsdGhpcy5faGVhZGVyTGV2ZWwxLGV2ZW50RW50cnlUeXBlLHRydWUpO30KYnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLldvcmtlcjp0aGlzLl9hcHBlbmRTeW5jRXZlbnRzKHRyYWNrLHRyYWNrLmV2ZW50cyx0cmFjay51cmw/bHNgV29ya2VyIFx1MjAxNCAke3RyYWNrLnVybH1gOmxzYERlZGljYXRlZCBXb3JrZXJgLHRoaXMuX2hlYWRlckxldmVsMSxldmVudEVudHJ5VHlwZSx0cnVlKTticmVhaztjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuUmFzdGVyOmlmKCFyYXN0ZXJDb3VudCkKdGhpcy5fYXBwZW5kSGVhZGVyKGxzYFJhc3RlcmAsdGhpcy5faGVhZGVyTGV2ZWwxLGZhbHNlKTsrK3Jhc3RlckNvdW50O3RoaXMuX2FwcGVuZFN5bmNFdmVudHModHJhY2ssdHJhY2suZXZlbnRzLGxzYFJhc3Rlcml6ZXIgVGhyZWFkICR7cmFzdGVyQ291bnR9YCx0aGlzLl9oZWFkZXJMZXZlbDIsZXZlbnRFbnRyeVR5cGUsdHJ1ZSk7YnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuVHJhY2tUeXBlLkdQVTp0aGlzLl9hcHBlbmRTeW5jRXZlbnRzKHRyYWNrLHRyYWNrLmV2ZW50cyxsc2BHUFVgLHRoaXMuX2hlYWRlckxldmVsMSxldmVudEVudHJ5VHlwZSx0cnVlKTticmVhaztjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuT3RoZXI6dGhpcy5fYXBwZW5kU3luY0V2ZW50cyh0cmFjayx0cmFjay5ldmVudHMsdHJhY2submFtZXx8bHNgVGhyZWFkYCx0aGlzLl9oZWFkZXJMZXZlbDEsZXZlbnRFbnRyeVR5cGUsdHJ1ZSk7dGhpcy5fYXBwZW5kQXN5bmNFdmVudHNHcm91cCh0cmFjayx0cmFjay5uYW1lLHRyYWNrLmFzeW5jRXZlbnRzLHRoaXMuX2hlYWRlckxldmVsMSxldmVudEVudHJ5VHlwZSx0cnVlKTticmVhazt9fQppZih0aGlzLl90aW1lbGluZURhdGEuc2VsZWN0ZWRHcm91cCkKdGhpcy5fdGltZWxpbmVEYXRhLnNlbGVjdGVkR3JvdXAuZXhwYW5kZWQ9dHJ1ZTtmb3IobGV0IGV4dGVuc2lvbkluZGV4PTA7ZXh0ZW5zaW9uSW5kZXg8dGhpcy5fZXh0ZW5zaW9uSW5mby5sZW5ndGg7ZXh0ZW5zaW9uSW5kZXgrKykKdGhpcy5faW5uZXJBcHBlbmRFeHRlbnNpb25FdmVudHMoZXh0ZW5zaW9uSW5kZXgpO3RoaXMuX21hcmtlcnMuc29ydCgoYSxiKT0+YS5zdGFydFRpbWUoKS1iLnN0YXJ0VGltZSgpKTt0aGlzLl90aW1lbGluZURhdGEubWFya2Vycz10aGlzLl9tYXJrZXJzO3RoaXMuX2Zsb3dFdmVudEluZGV4QnlJZC5jbGVhcigpO30KbWluaW11bUJvdW5kYXJ5KCl7cmV0dXJuIHRoaXMuX21pbmltdW1Cb3VuZGFyeTt9CnRvdGFsVGltZSgpe3JldHVybiB0aGlzLl90aW1lU3Bhbjt9CnNlYXJjaChzdGFydFRpbWUsZW5kVGltZSxmaWx0ZXIpe2NvbnN0IHJlc3VsdD1bXTtjb25zdCBlbnRyeVR5cGVzPVRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5FbnRyeVR5cGU7dGhpcy50aW1lbGluZURhdGEoKTtmb3IobGV0IGk9MDtpPHRoaXMuX2VudHJ5RGF0YS5sZW5ndGg7KytpKXtpZih0aGlzLl9lbnRyeVR5cGUoaSkhPT1lbnRyeVR5cGVzLkV2ZW50KQpjb250aW51ZTtjb25zdCBldmVudD0odGhpcy5fZW50cnlEYXRhW2ldKTtpZihldmVudC5zdGFydFRpbWU+ZW5kVGltZSkKY29udGludWU7aWYoKGV2ZW50LmVuZFRpbWV8fGV2ZW50LnN0YXJ0VGltZSk8c3RhcnRUaW1lKQpjb250aW51ZTtpZihmaWx0ZXIuYWNjZXB0KGV2ZW50KSkKcmVzdWx0LnB1c2goaSk7fQpyZXN1bHQuc29ydCgoYSxiKT0+U0RLLlRyYWNpbmdNb2RlbC5FdmVudC5jb21wYXJlU3RhcnRUaW1lKCh0aGlzLl9lbnRyeURhdGFbYV0pLCh0aGlzLl9lbnRyeURhdGFbYl0pKSk7cmV0dXJuIHJlc3VsdDt9Cl9hcHBlbmRTeW5jRXZlbnRzKHRyYWNrLGV2ZW50cyx0aXRsZSxzdHlsZSxlbnRyeVR5cGUsc2VsZWN0YWJsZSl7aWYoIWV2ZW50cy5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGlzRXh0ZW5zaW9uPWVudHJ5VHlwZT09PVRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5FbnRyeVR5cGUuRXh0ZW5zaW9uRXZlbnQ7Y29uc3Qgb3BlbkV2ZW50cz1bXTtjb25zdCBmbG93RXZlbnRzRW5hYmxlZD1SdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZCgndGltZWxpbmVGbG93RXZlbnRzJyk7Y29uc3QgYmxhY2tib3hpbmdFbmFibGVkPSFpc0V4dGVuc2lvbiYmUnVudGltZS5leHBlcmltZW50cy5pc0VuYWJsZWQoJ2JsYWNrYm94SlNGcmFtZXNPblRpbWVsaW5lJyk7bGV0IG1heFN0YWNrRGVwdGg9MDtsZXQgZ3JvdXA9bnVsbDtpZih0cmFjayYmdHJhY2sudHlwZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5UcmFja1R5cGUuTWFpblRocmVhZCl7Z3JvdXA9dGhpcy5fYXBwZW5kSGVhZGVyKHRpdGxlLHN0eWxlLHNlbGVjdGFibGUpO2dyb3VwLl90cmFjaz10cmFjazt9CmNvbnN0IG1hcmtlckV2ZW50c0ZpbHRlcj1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMucGFpbnRFdmVudHNGaWx0ZXIoKTtmb3IobGV0IGk9MDtpPGV2ZW50cy5sZW5ndGg7KytpKXtjb25zdCBlPWV2ZW50c1tpXTtpZighaXNFeHRlbnNpb24mJlRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5pc01hcmtlckV2ZW50KGUpJiZtYXJrZXJFdmVudHNGaWx0ZXIuYWNjZXB0KGUpKXt0aGlzLl9tYXJrZXJzLnB1c2gobmV3IFRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydE1hcmtlcihlLnN0YXJ0VGltZSxlLnN0YXJ0VGltZS10aGlzLl9tb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpLFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5tYXJrZXJTdHlsZUZvckV2ZW50KGUpKSk7fQppZighU0RLLlRyYWNpbmdNb2RlbC5pc0Zsb3dQaGFzZShlLnBoYXNlKSl7aWYoIWUuZW5kVGltZSYmZS5waGFzZSE9PVNESy5UcmFjaW5nTW9kZWwuUGhhc2UuSW5zdGFudCkKY29udGludWU7aWYoU0RLLlRyYWNpbmdNb2RlbC5pc0FzeW5jUGhhc2UoZS5waGFzZSkpCmNvbnRpbnVlO2lmKCFpc0V4dGVuc2lvbiYmIXRoaXMuX3BlcmZvcm1hbmNlTW9kZWwuaXNWaXNpYmxlKGUpKQpjb250aW51ZTt9CndoaWxlKG9wZW5FdmVudHMubGVuZ3RoJiZvcGVuRXZlbnRzLnBlZWtMYXN0KCkuZW5kVGltZTw9ZS5zdGFydFRpbWUpCm9wZW5FdmVudHMucG9wKCk7ZS5fYmxhY2tib3hSb290PWZhbHNlO2lmKGJsYWNrYm94aW5nRW5hYmxlZCYmdGhpcy5faXNCbGFja2JveGVkRXZlbnQoZSkpe2NvbnN0IHBhcmVudD1vcGVuRXZlbnRzLnBlZWtMYXN0KCk7aWYocGFyZW50JiZwYXJlbnQuX2JsYWNrYm94Um9vdCkKY29udGludWU7ZS5fYmxhY2tib3hSb290PXRydWU7fQppZighZ3JvdXApe2dyb3VwPXRoaXMuX2FwcGVuZEhlYWRlcih0aXRsZSxzdHlsZSxzZWxlY3RhYmxlKTtpZihzZWxlY3RhYmxlKQpncm91cC5fdHJhY2s9dHJhY2s7fQpjb25zdCBsZXZlbD10aGlzLl9jdXJyZW50TGV2ZWwrb3BlbkV2ZW50cy5sZW5ndGg7aWYoZmxvd0V2ZW50c0VuYWJsZWQpCnRoaXMuX2FwcGVuZEZsb3dFdmVudChlLGxldmVsKTtjb25zdCBpbmRleD10aGlzLl9hcHBlbmRFdmVudChlLGxldmVsKTtpZihvcGVuRXZlbnRzLmxlbmd0aCkKdGhpcy5fZW50cnlQYXJlbnRbaW5kZXhdPW9wZW5FdmVudHMucGVla0xhc3QoKTtpZighaXNFeHRlbnNpb24mJlRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5pc01hcmtlckV2ZW50KGUpKQp0aGlzLl90aW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzW3RoaXMuX2VudHJ5RGF0YS5sZW5ndGhdPXVuZGVmaW5lZDttYXhTdGFja0RlcHRoPU1hdGgubWF4KG1heFN0YWNrRGVwdGgsb3BlbkV2ZW50cy5sZW5ndGgrMSk7aWYoZS5lbmRUaW1lKQpvcGVuRXZlbnRzLnB1c2goZSk7fQp0aGlzLl9lbnRyeVR5cGVCeUxldmVsLmxlbmd0aD10aGlzLl9jdXJyZW50TGV2ZWwrbWF4U3RhY2tEZXB0aDt0aGlzLl9lbnRyeVR5cGVCeUxldmVsLmZpbGwoZW50cnlUeXBlLHRoaXMuX2N1cnJlbnRMZXZlbCk7dGhpcy5fY3VycmVudExldmVsKz1tYXhTdGFja0RlcHRoO3JldHVybiBncm91cDt9Cl9pc0JsYWNrYm94ZWRFdmVudChldmVudCl7aWYoZXZlbnQubmFtZSE9PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkpTRnJhbWUpCnJldHVybiBmYWxzZTtjb25zdCB1cmw9ZXZlbnQuYXJnc1snZGF0YSddWyd1cmwnXTtyZXR1cm4gdXJsJiZ0aGlzLl9pc0JsYWNrYm94ZWRVUkwodXJsKTt9Cl9pc0JsYWNrYm94ZWRVUkwodXJsKXtyZXR1cm4gQmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmlzQmxhY2tib3hlZFVSTCh1cmwpO30KX2FwcGVuZEFzeW5jRXZlbnRzR3JvdXAodHJhY2ssaGVhZGVyLGV2ZW50cyxzdHlsZSxlbnRyeVR5cGUsc2VsZWN0YWJsZSl7aWYoIWV2ZW50cy5sZW5ndGgpCnJldHVybiBudWxsO2NvbnN0IGxhc3RVc2VkVGltZUJ5TGV2ZWw9W107bGV0IGdyb3VwPW51bGw7Zm9yKGxldCBpPTA7aTxldmVudHMubGVuZ3RoOysraSl7Y29uc3QgYXN5bmNFdmVudD1ldmVudHNbaV07aWYoIXRoaXMuX3BlcmZvcm1hbmNlTW9kZWwuaXNWaXNpYmxlKGFzeW5jRXZlbnQpKQpjb250aW51ZTtpZighZ3JvdXApe2dyb3VwPXRoaXMuX2FwcGVuZEhlYWRlcihoZWFkZXIsc3R5bGUsc2VsZWN0YWJsZSk7aWYoc2VsZWN0YWJsZSkKZ3JvdXAuX3RyYWNrPXRyYWNrO30KY29uc3Qgc3RhcnRUaW1lPWFzeW5jRXZlbnQuc3RhcnRUaW1lO2xldCBsZXZlbDtmb3IobGV2ZWw9MDtsZXZlbDxsYXN0VXNlZFRpbWVCeUxldmVsLmxlbmd0aCYmbGFzdFVzZWRUaW1lQnlMZXZlbFtsZXZlbF0+c3RhcnRUaW1lOysrbGV2ZWwpe30KdGhpcy5fYXBwZW5kQXN5bmNFdmVudChhc3luY0V2ZW50LHRoaXMuX2N1cnJlbnRMZXZlbCtsZXZlbCk7bGFzdFVzZWRUaW1lQnlMZXZlbFtsZXZlbF09YXN5bmNFdmVudC5lbmRUaW1lO30KdGhpcy5fZW50cnlUeXBlQnlMZXZlbC5sZW5ndGg9dGhpcy5fY3VycmVudExldmVsK2xhc3RVc2VkVGltZUJ5TGV2ZWwubGVuZ3RoO3RoaXMuX2VudHJ5VHlwZUJ5TGV2ZWwuZmlsbChlbnRyeVR5cGUsdGhpcy5fY3VycmVudExldmVsKTt0aGlzLl9jdXJyZW50TGV2ZWwrPWxhc3RVc2VkVGltZUJ5TGV2ZWwubGVuZ3RoO3JldHVybiBncm91cDt9Cl9hcHBlbmRJbnRlcmFjdGlvblJlY29yZHMoKXtjb25zdCBpbnRlcmFjdGlvblJlY29yZHM9dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5pbnRlcmFjdGlvblJlY29yZHMoKTtpZighaW50ZXJhY3Rpb25SZWNvcmRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuX2FwcGVuZEhlYWRlcihsc2BJbnRlcmFjdGlvbnNgLHRoaXMuX2ludGVyYWN0aW9uc0hlYWRlckxldmVsMSxmYWxzZSk7Zm9yKGNvbnN0IHNlZ21lbnQgb2YgaW50ZXJhY3Rpb25SZWNvcmRzKXtjb25zdCBpbmRleD10aGlzLl9lbnRyeURhdGEubGVuZ3RoO3RoaXMuX2VudHJ5RGF0YS5wdXNoKChzZWdtZW50LmRhdGEpKTt0aGlzLl9lbnRyeUluZGV4VG9UaXRsZVtpbmRleF09KHNlZ21lbnQuZGF0YSk7dGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW2luZGV4XT10aGlzLl9jdXJyZW50TGV2ZWw7dGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lc1tpbmRleF09c2VnbWVudC5lbmQtc2VnbWVudC5iZWdpbjt0aGlzLl90aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2luZGV4XT1zZWdtZW50LmJlZ2luO30KdGhpcy5fZW50cnlUeXBlQnlMZXZlbFt0aGlzLl9jdXJyZW50TGV2ZWwrK109VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5JbnRlcmFjdGlvblJlY29yZDt9Cl9hcHBlbmRGcmFtZUJhcnMoKXtjb25zdCBzY3JlZW5zaG90cz10aGlzLl9wZXJmb3JtYW5jZU1vZGVsLmZpbG1TdHJpcE1vZGVsKCkuZnJhbWVzKCk7Y29uc3QgaGFzRmlsbVN0cmlwPSEhc2NyZWVuc2hvdHMubGVuZ3RoO3RoaXMuX2ZyYW1lc0hlYWRlci5jb2xsYXBzaWJsZT1oYXNGaWxtU3RyaXA7dGhpcy5fYXBwZW5kSGVhZGVyKENvbW1vbi5VSVN0cmluZygnRnJhbWVzJyksdGhpcy5fZnJhbWVzSGVhZGVyLGZhbHNlKTt0aGlzLl9mcmFtZUdyb3VwPXRoaXMuX3RpbWVsaW5lRGF0YS5ncm91cHMucGVla0xhc3QoKTtjb25zdCBzdHlsZT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMubWFya2VyU3R5bGVGb3JGcmFtZSgpO3RoaXMuX2VudHJ5VHlwZUJ5TGV2ZWxbdGhpcy5fY3VycmVudExldmVsXT1UaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRW50cnlUeXBlLkZyYW1lO2Zvcihjb25zdCBmcmFtZSBvZiB0aGlzLl9wZXJmb3JtYW5jZU1vZGVsLmZyYW1lcygpKXt0aGlzLl9tYXJrZXJzLnB1c2gobmV3IFRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydE1hcmtlcihmcmFtZS5zdGFydFRpbWUsZnJhbWUuc3RhcnRUaW1lLXRoaXMuX21vZGVsLm1pbmltdW1SZWNvcmRUaW1lKCksc3R5bGUpKTt0aGlzLl9hcHBlbmRGcmFtZShmcmFtZSk7fQorK3RoaXMuX2N1cnJlbnRMZXZlbDtpZighaGFzRmlsbVN0cmlwKQpyZXR1cm47dGhpcy5fYXBwZW5kSGVhZGVyKCcnLHRoaXMuX3NjcmVlbnNob3RzSGVhZGVyLGZhbHNlKTt0aGlzLl9lbnRyeVR5cGVCeUxldmVsW3RoaXMuX2N1cnJlbnRMZXZlbF09VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5TY3JlZW5zaG90O2xldCBwcmV2VGltZXN0YW1wO2Zvcihjb25zdCBzY3JlZW5zaG90IG9mIHNjcmVlbnNob3RzKXt0aGlzLl9lbnRyeURhdGEucHVzaChzY3JlZW5zaG90KTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHMucHVzaCh0aGlzLl9jdXJyZW50TGV2ZWwpO3RoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXMucHVzaChzY3JlZW5zaG90LnRpbWVzdGFtcCk7aWYocHJldlRpbWVzdGFtcCkKdGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lcy5wdXNoKHNjcmVlbnNob3QudGltZXN0YW1wLXByZXZUaW1lc3RhbXApO3ByZXZUaW1lc3RhbXA9c2NyZWVuc2hvdC50aW1lc3RhbXA7fQppZihzY3JlZW5zaG90cy5sZW5ndGgpCnRoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXMucHVzaCh0aGlzLl9tb2RlbC5tYXhpbXVtUmVjb3JkVGltZSgpLXByZXZUaW1lc3RhbXApOysrdGhpcy5fY3VycmVudExldmVsO30KX2VudHJ5VHlwZShlbnRyeUluZGV4KXtyZXR1cm4gdGhpcy5fZW50cnlUeXBlQnlMZXZlbFt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHNbZW50cnlJbmRleF1dO30KcHJlcGFyZUhpZ2hsaWdodGVkRW50cnlJbmZvKGVudHJ5SW5kZXgpe2xldCB0aW1lPScnO2xldCB0aXRsZTtsZXQgd2FybmluZztjb25zdCB0eXBlPXRoaXMuX2VudHJ5VHlwZShlbnRyeUluZGV4KTtpZih0eXBlPT09VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5FdmVudCl7Y29uc3QgZXZlbnQ9KHRoaXMuX2VudHJ5RGF0YVtlbnRyeUluZGV4XSk7Y29uc3QgdG90YWxUaW1lPWV2ZW50LmR1cmF0aW9uO2NvbnN0IHNlbGZUaW1lPWV2ZW50LnNlbGZUaW1lO2NvbnN0IGVwcz0xZS02O2lmKHR5cGVvZiB0b3RhbFRpbWU9PT0nbnVtYmVyJyl7dGltZT1NYXRoLmFicyh0b3RhbFRpbWUtc2VsZlRpbWUpPmVwcyYmc2VsZlRpbWU+ZXBzP0NvbW1vbi5VSVN0cmluZygnJXMgKHNlbGYgJXMpJyxOdW1iZXIubWlsbGlzVG9TdHJpbmcodG90YWxUaW1lLHRydWUpLE51bWJlci5taWxsaXNUb1N0cmluZyhzZWxmVGltZSx0cnVlKSk6TnVtYmVyLm1pbGxpc1RvU3RyaW5nKHRvdGFsVGltZSx0cnVlKTt9CnRpdGxlPXRoaXMuZW50cnlUaXRsZShlbnRyeUluZGV4KTt3YXJuaW5nPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFdhcm5pbmcoZXZlbnQpO31lbHNlIGlmKHR5cGU9PT1UaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRW50cnlUeXBlLkZyYW1lKXtjb25zdCBmcmFtZT0odGhpcy5fZW50cnlEYXRhW2VudHJ5SW5kZXhdKTt0aW1lPUNvbW1vbi5VSVN0cmluZygnJXMgfiAlLjBmXHhhMGZwcycsTnVtYmVyLnByZWNpc2VNaWxsaXNUb1N0cmluZyhmcmFtZS5kdXJhdGlvbiwxKSwoMTAwMC9mcmFtZS5kdXJhdGlvbikpO3RpdGxlPWZyYW1lLmlkbGU/Q29tbW9uLlVJU3RyaW5nKCdJZGxlIEZyYW1lJyk6Q29tbW9uLlVJU3RyaW5nKCdGcmFtZScpO2lmKGZyYW1lLmhhc1dhcm5pbmdzKCkpe3dhcm5pbmc9Y3JlYXRlRWxlbWVudCgnc3BhbicpO3dhcm5pbmcudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdMb25nIGZyYW1lJyk7fX1lbHNle3JldHVybiBudWxsO30KY29uc3QgZWxlbWVudD1jcmVhdGVFbGVtZW50KCdkaXYnKTtjb25zdCByb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyhlbGVtZW50LCd0aW1lbGluZS90aW1lbGluZUZsYW1lY2hhcnRQb3BvdmVyLmNzcycpO2NvbnN0IGNvbnRlbnRzPXJvb3QuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWZsYW1lY2hhcnQtcG9wb3ZlcicpO2NvbnRlbnRzLmNyZWF0ZUNoaWxkKCdzcGFuJywndGltZWxpbmUtaW5mby10aW1lJykudGV4dENvbnRlbnQ9dGltZTtjb250ZW50cy5jcmVhdGVDaGlsZCgnc3BhbicsJ3RpbWVsaW5lLWluZm8tdGl0bGUnKS50ZXh0Q29udGVudD10aXRsZTtpZih3YXJuaW5nKXt3YXJuaW5nLmNsYXNzTGlzdC5hZGQoJ3RpbWVsaW5lLWluZm8td2FybmluZycpO2NvbnRlbnRzLmFwcGVuZENoaWxkKHdhcm5pbmcpO30KcmV0dXJuIGVsZW1lbnQ7fQplbnRyeUNvbG9yKGVudHJ5SW5kZXgpe2Z1bmN0aW9uIHBhdGNoQ29sb3JBbmRDYWNoZShjYWNoZSxrZXksbG9va3VwQ29sb3Ipe2xldCBjb2xvcj1jYWNoZS5nZXQoa2V5KTtpZihjb2xvcikKcmV0dXJuIGNvbG9yO2NvbnN0IHBhcnNlZENvbG9yPUNvbW1vbi5Db2xvci5wYXJzZShsb29rdXBDb2xvcihrZXkpKTtjb2xvcj1wYXJzZWRDb2xvci5zZXRBbHBoYSgwLjcpLmFzU3RyaW5nKENvbW1vbi5Db2xvci5Gb3JtYXQuUkdCQSl8fCcnO2NhY2hlLnNldChrZXksY29sb3IpO3JldHVybiBjb2xvcjt9CmNvbnN0IGVudHJ5VHlwZXM9VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZTtjb25zdCB0eXBlPXRoaXMuX2VudHJ5VHlwZShlbnRyeUluZGV4KTtpZih0eXBlPT09ZW50cnlUeXBlcy5FdmVudCl7Y29uc3QgZXZlbnQ9KHRoaXMuX2VudHJ5RGF0YVtlbnRyeUluZGV4XSk7aWYodGhpcy5fbW9kZWwuaXNHZW5lcmljVHJhY2UoKSkKcmV0dXJuIHRoaXMuX2dlbmVyaWNUcmFjZUV2ZW50Q29sb3IoZXZlbnQpO2lmKCFTREsuVHJhY2luZ01vZGVsLmlzQXN5bmNQaGFzZShldmVudC5waGFzZSkpCnJldHVybiB0aGlzLl9jb2xvckZvckV2ZW50KGV2ZW50KTtpZihldmVudC5oYXNDYXRlZ29yeShUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQ2F0ZWdvcnkuQ29uc29sZSl8fGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5Vc2VyVGltaW5nKSkKcmV0dXJuIHRoaXMuX2NvbnNvbGVDb2xvckdlbmVyYXRvci5jb2xvckZvcklEKGV2ZW50Lm5hbWUpO2lmKGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5MYXRlbmN5SW5mbykpe2NvbnN0IHBoYXNlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLnBoYXNlRm9yRXZlbnQoZXZlbnQpfHxUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5QaGFzZXMuVW5jYXRlZ29yaXplZDtyZXR1cm4gcGF0Y2hDb2xvckFuZENhY2hlKHRoaXMuX2FzeW5jQ29sb3JCeUludGVyYWN0aW9uUGhhc2UscGhhc2UsVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmludGVyYWN0aW9uUGhhc2VDb2xvcik7fQpjb25zdCBjYXRlZ29yeT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRTdHlsZShldmVudCkuY2F0ZWdvcnk7cmV0dXJuIHBhdGNoQ29sb3JBbmRDYWNoZSh0aGlzLl9hc3luY0NvbG9yQnlDYXRlZ29yeSxjYXRlZ29yeSwoKT0+Y2F0ZWdvcnkuY29sb3IpO30KaWYodHlwZT09PWVudHJ5VHlwZXMuRnJhbWUpCnJldHVybid3aGl0ZSc7aWYodHlwZT09PWVudHJ5VHlwZXMuSW50ZXJhY3Rpb25SZWNvcmQpCnJldHVybid0cmFuc3BhcmVudCc7aWYodHlwZT09PWVudHJ5VHlwZXMuRXh0ZW5zaW9uRXZlbnQpe2NvbnN0IGV2ZW50PSh0aGlzLl9lbnRyeURhdGFbZW50cnlJbmRleF0pO3JldHVybiB0aGlzLl9leHRlbnNpb25Db2xvckdlbmVyYXRvci5jb2xvckZvcklEKGV2ZW50Lm5hbWUpO30KcmV0dXJuJyc7fQpfZ2VuZXJpY1RyYWNlRXZlbnRDb2xvcihldmVudCl7Y29uc3Qga2V5PWV2ZW50LmNhdGVnb3JpZXNTdHJpbmd8fGV2ZW50Lm5hbWU7cmV0dXJuIGtleT9gaHNsKCR7U3RyaW5nLmhhc2hDb2RlKGtleSkgJSAzMDAgKyAzMH0sIDQwJSwgNzAlKWA6JyNjY2MnO30KX2RyYXdGcmFtZShlbnRyeUluZGV4LGNvbnRleHQsdGV4dCxiYXJYLGJhclksYmFyV2lkdGgsYmFySGVpZ2h0KXtjb25zdCBoUGFkZGluZz0xO2NvbnN0IGZyYW1lPSh0aGlzLl9lbnRyeURhdGFbZW50cnlJbmRleF0pO2JhclgrPWhQYWRkaW5nO2JhcldpZHRoLT0yKmhQYWRkaW5nO2NvbnRleHQuZmlsbFN0eWxlPWZyYW1lLmlkbGU/J3doaXRlJzooZnJhbWUuaGFzV2FybmluZ3MoKT8nI2ZhZDFkMSc6JyNkN2YwZDEnKTtjb250ZXh0LmZpbGxSZWN0KGJhclgsYmFyWSxiYXJXaWR0aCxiYXJIZWlnaHQpO2NvbnN0IGZyYW1lRHVyYXRpb25UZXh0PU51bWJlci5wcmVjaXNlTWlsbGlzVG9TdHJpbmcoZnJhbWUuZHVyYXRpb24sMSk7Y29uc3QgdGV4dFdpZHRoPWNvbnRleHQubWVhc3VyZVRleHQoZnJhbWVEdXJhdGlvblRleHQpLndpZHRoO2lmKHRleHRXaWR0aDw9YmFyV2lkdGgpe2NvbnRleHQuZmlsbFN0eWxlPXRoaXMudGV4dENvbG9yKGVudHJ5SW5kZXgpO2NvbnRleHQuZmlsbFRleHQoZnJhbWVEdXJhdGlvblRleHQsYmFyWCsoYmFyV2lkdGgtdGV4dFdpZHRoKS8yLGJhclkrYmFySGVpZ2h0LTQpO319CmFzeW5jIF9kcmF3U2NyZWVuc2hvdChlbnRyeUluZGV4LGNvbnRleHQsYmFyWCxiYXJZLGJhcldpZHRoLGJhckhlaWdodCl7Y29uc3Qgc2NyZWVuc2hvdD0odGhpcy5fZW50cnlEYXRhW2VudHJ5SW5kZXhdKTtpZighdGhpcy5fc2NyZWVuc2hvdEltYWdlQ2FjaGUuaGFzKHNjcmVlbnNob3QpKXt0aGlzLl9zY3JlZW5zaG90SW1hZ2VDYWNoZS5zZXQoc2NyZWVuc2hvdCxudWxsKTtjb25zdCBkYXRhPWF3YWl0IHNjcmVlbnNob3QuaW1hZ2VEYXRhUHJvbWlzZSgpO2NvbnN0IGltYWdlPWF3YWl0IFVJLmxvYWRJbWFnZUZyb21EYXRhKGRhdGEpO3RoaXMuX3NjcmVlbnNob3RJbWFnZUNhY2hlLnNldChzY3JlZW5zaG90LGltYWdlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRXZlbnRzLkRhdGFDaGFuZ2VkKTtyZXR1cm47fQpjb25zdCBpbWFnZT10aGlzLl9zY3JlZW5zaG90SW1hZ2VDYWNoZS5nZXQoc2NyZWVuc2hvdCk7aWYoIWltYWdlKQpyZXR1cm47Y29uc3QgaW1hZ2VYPWJhclgrMTtjb25zdCBpbWFnZVk9YmFyWSsxO2NvbnN0IGltYWdlSGVpZ2h0PWJhckhlaWdodC0yO2NvbnN0IHNjYWxlPWltYWdlSGVpZ2h0L2ltYWdlLm5hdHVyYWxIZWlnaHQ7Y29uc3QgaW1hZ2VXaWR0aD1NYXRoLmZsb29yKGltYWdlLm5hdHVyYWxXaWR0aCpzY2FsZSk7Y29udGV4dC5zYXZlKCk7Y29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LnJlY3QoYmFyWCxiYXJZLGJhcldpZHRoLGJhckhlaWdodCk7Y29udGV4dC5jbGlwKCk7Y29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsaW1hZ2VYLGltYWdlWSxpbWFnZVdpZHRoLGltYWdlSGVpZ2h0KTtjb250ZXh0LnN0cm9rZVN0eWxlPScjY2NjJztjb250ZXh0LnN0cm9rZVJlY3QoaW1hZ2VYLTAuNSxpbWFnZVktMC41LE1hdGgubWluKGJhcldpZHRoLTEsaW1hZ2VXaWR0aCsxKSxpbWFnZUhlaWdodCk7Y29udGV4dC5yZXN0b3JlKCk7fQpkZWNvcmF0ZUVudHJ5KGVudHJ5SW5kZXgsY29udGV4dCx0ZXh0LGJhclgsYmFyWSxiYXJXaWR0aCxiYXJIZWlnaHQsdW5jbGlwcGVkQmFyWCx0aW1lVG9QaXhlbHMpe2NvbnN0IGRhdGE9dGhpcy5fZW50cnlEYXRhW2VudHJ5SW5kZXhdO2NvbnN0IHR5cGU9dGhpcy5fZW50cnlUeXBlKGVudHJ5SW5kZXgpO2NvbnN0IGVudHJ5VHlwZXM9VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZTtpZih0eXBlPT09ZW50cnlUeXBlcy5GcmFtZSl7dGhpcy5fZHJhd0ZyYW1lKGVudHJ5SW5kZXgsY29udGV4dCx0ZXh0LGJhclgsYmFyWSxiYXJXaWR0aCxiYXJIZWlnaHQpO3JldHVybiB0cnVlO30KaWYodHlwZT09PWVudHJ5VHlwZXMuU2NyZWVuc2hvdCl7dGhpcy5fZHJhd1NjcmVlbnNob3QoZW50cnlJbmRleCxjb250ZXh0LGJhclgsYmFyWSxiYXJXaWR0aCxiYXJIZWlnaHQpO3JldHVybiB0cnVlO30KaWYodHlwZT09PWVudHJ5VHlwZXMuSW50ZXJhY3Rpb25SZWNvcmQpe2NvbnN0IGNvbG9yPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5pbnRlcmFjdGlvblBoYXNlQ29sb3IoKGRhdGEpKTtjb250ZXh0LmZpbGxTdHlsZT1jb2xvcjtjb250ZXh0LmZpbGxSZWN0KGJhclgsYmFyWSxiYXJXaWR0aC0xLDIpO2NvbnRleHQuZmlsbFJlY3QoYmFyWCxiYXJZLTMsMiwzKTtjb250ZXh0LmZpbGxSZWN0KGJhclgrYmFyV2lkdGgtMyxiYXJZLTMsMiwzKTtyZXR1cm4gZmFsc2U7fQppZih0eXBlPT09ZW50cnlUeXBlcy5FdmVudCl7Y29uc3QgZXZlbnQ9KGRhdGEpO2lmKGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5MYXRlbmN5SW5mbykpe2NvbnN0IHRpbWVXYWl0aW5nRm9yTWFpblRocmVhZD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkudGltZVdhaXRpbmdGb3JNYWluVGhyZWFkO2lmKHRpbWVXYWl0aW5nRm9yTWFpblRocmVhZCl7Y29udGV4dC5maWxsU3R5bGU9J2hzbGEoMCwgNzAlLCA2MCUsIDEpJztjb25zdCB3aWR0aD1NYXRoLmZsb29yKHVuY2xpcHBlZEJhclgtYmFyWCt0aW1lV2FpdGluZ0Zvck1haW5UaHJlYWQqdGltZVRvUGl4ZWxzKTtjb250ZXh0LmZpbGxSZWN0KGJhclgsYmFyWStiYXJIZWlnaHQtMyx3aWR0aCwyKTt9fQppZihUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkud2FybmluZykKcGFpbnRXYXJuaW5nRGVjb3JhdGlvbihiYXJYLGJhcldpZHRoLTEuNSk7fQpmdW5jdGlvbiBwYWludFdhcm5pbmdEZWNvcmF0aW9uKHgsd2lkdGgpe2NvbnN0IHRyaWFuZ2xlU2l6ZT04O2NvbnRleHQuc2F2ZSgpO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5yZWN0KHgsYmFyWSx3aWR0aCxiYXJIZWlnaHQpO2NvbnRleHQuY2xpcCgpO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5maWxsU3R5bGU9J3JlZCc7Y29udGV4dC5tb3ZlVG8oeCt3aWR0aC10cmlhbmdsZVNpemUsYmFyWSk7Y29udGV4dC5saW5lVG8oeCt3aWR0aCxiYXJZKTtjb250ZXh0LmxpbmVUbyh4K3dpZHRoLGJhclkrdHJpYW5nbGVTaXplKTtjb250ZXh0LmZpbGwoKTtjb250ZXh0LnJlc3RvcmUoKTt9CnJldHVybiBmYWxzZTt9CmZvcmNlRGVjb3JhdGlvbihlbnRyeUluZGV4KXtjb25zdCBlbnRyeVR5cGVzPVRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5FbnRyeVR5cGU7Y29uc3QgdHlwZT10aGlzLl9lbnRyeVR5cGUoZW50cnlJbmRleCk7aWYodHlwZT09PWVudHJ5VHlwZXMuRnJhbWUpCnJldHVybiB0cnVlO2lmKHR5cGU9PT1lbnRyeVR5cGVzLlNjcmVlbnNob3QpCnJldHVybiB0cnVlO2lmKHR5cGU9PT1lbnRyeVR5cGVzLkV2ZW50KXtjb25zdCBldmVudD0odGhpcy5fZW50cnlEYXRhW2VudHJ5SW5kZXhdKTtyZXR1cm4hIVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KS53YXJuaW5nO30KcmV0dXJuIGZhbHNlO30KYXBwZW5kRXh0ZW5zaW9uRXZlbnRzKGVudHJ5KXt0aGlzLl9leHRlbnNpb25JbmZvLnB1c2goZW50cnkpO2lmKHRoaXMuX3RpbWVsaW5lRGF0YSkKdGhpcy5faW5uZXJBcHBlbmRFeHRlbnNpb25FdmVudHModGhpcy5fZXh0ZW5zaW9uSW5mby5sZW5ndGgtMSk7fQpfaW5uZXJBcHBlbmRFeHRlbnNpb25FdmVudHMoaW5kZXgpe2NvbnN0IGVudHJ5PXRoaXMuX2V4dGVuc2lvbkluZm9baW5kZXhdO2NvbnN0IGVudHJ5VHlwZT1UaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRW50cnlUeXBlLkV4dGVuc2lvbkV2ZW50O2NvbnN0IGFsbFRocmVhZHM9W10uY29uY2F0KC4uLmVudHJ5Lm1vZGVsLnNvcnRlZFByb2Nlc3NlcygpLm1hcChwcm9jZXNzPT5wcm9jZXNzLnNvcnRlZFRocmVhZHMoKSkpO2lmKCFhbGxUaHJlYWRzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IHNpbmdsZVRyYWNrPWFsbFRocmVhZHMubGVuZ3RoPT09MSYmKCFhbGxUaHJlYWRzWzBdLmV2ZW50cygpLmxlbmd0aHx8IWFsbFRocmVhZHNbMF0uYXN5bmNFdmVudHMoKS5sZW5ndGgpO2lmKCFzaW5nbGVUcmFjaykKdGhpcy5fYXBwZW5kSGVhZGVyKGVudHJ5LnRpdGxlLHRoaXMuX2hlYWRlckxldmVsMSxmYWxzZSk7Y29uc3Qgc3R5bGU9c2luZ2xlVHJhY2s/dGhpcy5faGVhZGVyTGV2ZWwyOnRoaXMuX2hlYWRlckxldmVsMTtsZXQgdGhyZWFkSW5kZXg9MDtmb3IoY29uc3QgdGhyZWFkIG9mIGFsbFRocmVhZHMpe2NvbnN0IHRpdGxlPXNpbmdsZVRyYWNrP2VudHJ5LnRpdGxlOnRocmVhZC5uYW1lKCl8fGxzYFRocmVhZCAkeysrdGhyZWFkSW5kZXh9YDt0aGlzLl9hcHBlbmRBc3luY0V2ZW50c0dyb3VwKG51bGwsdGl0bGUsdGhyZWFkLmFzeW5jRXZlbnRzKCksc3R5bGUsZW50cnlUeXBlLGZhbHNlKTt0aGlzLl9hcHBlbmRTeW5jRXZlbnRzKG51bGwsdGhyZWFkLmV2ZW50cygpLHRpdGxlLHN0eWxlLGVudHJ5VHlwZSxmYWxzZSk7fX0KX2FwcGVuZEhlYWRlcih0aXRsZSxzdHlsZSxzZWxlY3RhYmxlKXtjb25zdCBncm91cD17c3RhcnRMZXZlbDp0aGlzLl9jdXJyZW50TGV2ZWwsbmFtZTp0aXRsZSxzdHlsZTpzdHlsZSxzZWxlY3RhYmxlOnNlbGVjdGFibGV9O3RoaXMuX3RpbWVsaW5lRGF0YS5ncm91cHMucHVzaChncm91cCk7cmV0dXJuIGdyb3VwO30KX2FwcGVuZEV2ZW50KGV2ZW50LGxldmVsKXtjb25zdCBpbmRleD10aGlzLl9lbnRyeURhdGEubGVuZ3RoO3RoaXMuX2VudHJ5RGF0YS5wdXNoKGV2ZW50KTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHNbaW5kZXhdPWxldmVsO3RoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXNbaW5kZXhdPWV2ZW50LmR1cmF0aW9ufHxUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuSW5zdGFudEV2ZW50VmlzaWJsZUR1cmF0aW9uTXM7dGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5U3RhcnRUaW1lc1tpbmRleF09ZXZlbnQuc3RhcnRUaW1lO2V2ZW50W1RpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5faW5kZXhTeW1ib2xdPWluZGV4O3JldHVybiBpbmRleDt9Cl9hcHBlbmRBc3luY0V2ZW50KGFzeW5jRXZlbnQsbGV2ZWwpe2lmKFNESy5UcmFjaW5nTW9kZWwuaXNOZXN0YWJsZUFzeW5jUGhhc2UoYXN5bmNFdmVudC5waGFzZSkpe3RoaXMuX2FwcGVuZEV2ZW50KGFzeW5jRXZlbnQsbGV2ZWwpO3JldHVybjt9CmNvbnN0IHN0ZXBzPWFzeW5jRXZlbnQuc3RlcHM7Y29uc3QgZXZlbnRPZmZzZXQ9c3RlcHMubGVuZ3RoPjEmJnN0ZXBzWzFdLnBoYXNlPT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5Bc3luY1N0ZXBQYXN0PzE6MDtmb3IobGV0IGk9MDtpPHN0ZXBzLmxlbmd0aC0xOysraSl7Y29uc3QgaW5kZXg9dGhpcy5fZW50cnlEYXRhLmxlbmd0aDt0aGlzLl9lbnRyeURhdGEucHVzaChzdGVwc1tpK2V2ZW50T2Zmc2V0XSk7Y29uc3Qgc3RhcnRUaW1lPXN0ZXBzW2ldLnN0YXJ0VGltZTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHNbaW5kZXhdPWxldmVsO3RoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeVRvdGFsVGltZXNbaW5kZXhdPXN0ZXBzW2krMV0uc3RhcnRUaW1lLXN0YXJ0VGltZTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2luZGV4XT1zdGFydFRpbWU7fX0KX2FwcGVuZEZsb3dFdmVudChldmVudCxsZXZlbCl7Y29uc3QgdGltZWxpbmVEYXRhPXRoaXMuX3RpbWVsaW5lRGF0YTtmdW5jdGlvbiBwdXNoU3RhcnRGbG93KGV2ZW50KXtjb25zdCBmbG93SW5kZXg9dGltZWxpbmVEYXRhLmZsb3dTdGFydFRpbWVzLmxlbmd0aDt0aW1lbGluZURhdGEuZmxvd1N0YXJ0VGltZXMucHVzaChldmVudC5zdGFydFRpbWUpO3RpbWVsaW5lRGF0YS5mbG93U3RhcnRMZXZlbHMucHVzaChsZXZlbCk7cmV0dXJuIGZsb3dJbmRleDt9CmZ1bmN0aW9uIHB1c2hFbmRGbG93KGV2ZW50LGZsb3dJbmRleCl7dGltZWxpbmVEYXRhLmZsb3dFbmRUaW1lc1tmbG93SW5kZXhdPWV2ZW50LnN0YXJ0VGltZTt0aW1lbGluZURhdGEuZmxvd0VuZExldmVsc1tmbG93SW5kZXhdPWxldmVsO30Kc3dpdGNoKGV2ZW50LnBoYXNlKXtjYXNlIFNESy5UcmFjaW5nTW9kZWwuUGhhc2UuRmxvd0JlZ2luOnRoaXMuX2Zsb3dFdmVudEluZGV4QnlJZC5zZXQoZXZlbnQuaWQscHVzaFN0YXJ0RmxvdyhldmVudCkpO2JyZWFrO2Nhc2UgU0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5GbG93U3RlcDpwdXNoRW5kRmxvdyhldmVudCx0aGlzLl9mbG93RXZlbnRJbmRleEJ5SWQuZ2V0KGV2ZW50LmlkKSk7dGhpcy5fZmxvd0V2ZW50SW5kZXhCeUlkLnNldChldmVudC5pZCxwdXNoU3RhcnRGbG93KGV2ZW50KSk7YnJlYWs7Y2FzZSBTREsuVHJhY2luZ01vZGVsLlBoYXNlLkZsb3dFbmQ6cHVzaEVuZEZsb3coZXZlbnQsdGhpcy5fZmxvd0V2ZW50SW5kZXhCeUlkLmdldChldmVudC5pZCkpO3RoaXMuX2Zsb3dFdmVudEluZGV4QnlJZC5kZWxldGUoZXZlbnQuaWQpO2JyZWFrO319Cl9hcHBlbmRGcmFtZShmcmFtZSl7Y29uc3QgaW5kZXg9dGhpcy5fZW50cnlEYXRhLmxlbmd0aDt0aGlzLl9lbnRyeURhdGEucHVzaChmcmFtZSk7dGhpcy5fZW50cnlJbmRleFRvVGl0bGVbaW5kZXhdPU51bWJlci5taWxsaXNUb1N0cmluZyhmcmFtZS5kdXJhdGlvbix0cnVlKTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHNbaW5kZXhdPXRoaXMuX2N1cnJlbnRMZXZlbDt0aGlzLl90aW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzW2luZGV4XT1mcmFtZS5kdXJhdGlvbjt0aGlzLl90aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzW2luZGV4XT1mcmFtZS5zdGFydFRpbWU7fQpjcmVhdGVTZWxlY3Rpb24oZW50cnlJbmRleCl7Y29uc3QgdHlwZT10aGlzLl9lbnRyeVR5cGUoZW50cnlJbmRleCk7bGV0IHRpbWVsaW5lU2VsZWN0aW9uPW51bGw7aWYodHlwZT09PVRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5FbnRyeVR5cGUuRXZlbnQpe3RpbWVsaW5lU2VsZWN0aW9uPVRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLmZyb21UcmFjZUV2ZW50KCh0aGlzLl9lbnRyeURhdGFbZW50cnlJbmRleF0pKTt9ZWxzZSBpZih0eXBlPT09VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkVudHJ5VHlwZS5GcmFtZSl7dGltZWxpbmVTZWxlY3Rpb249VGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbUZyYW1lKCh0aGlzLl9lbnRyeURhdGFbZW50cnlJbmRleF0pKTt9CmlmKHRpbWVsaW5lU2VsZWN0aW9uKQp0aGlzLl9sYXN0U2VsZWN0aW9uPW5ldyBUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnRWaWV3LlNlbGVjdGlvbih0aW1lbGluZVNlbGVjdGlvbixlbnRyeUluZGV4KTtyZXR1cm4gdGltZWxpbmVTZWxlY3Rpb247fQpmb3JtYXRWYWx1ZSh2YWx1ZSxwcmVjaXNpb24pe3JldHVybiBOdW1iZXIucHJlY2lzZU1pbGxpc1RvU3RyaW5nKHZhbHVlLHByZWNpc2lvbik7fQpjYW5KdW1wVG9FbnRyeShlbnRyeUluZGV4KXtyZXR1cm4gZmFsc2U7fQplbnRyeUluZGV4Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbil7aWYoIXNlbGVjdGlvbnx8c2VsZWN0aW9uLnR5cGUoKT09PVRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLlR5cGUuUmFuZ2UpCnJldHVybi0xO2lmKHRoaXMuX2xhc3RTZWxlY3Rpb24mJnRoaXMuX2xhc3RTZWxlY3Rpb24udGltZWxpbmVTZWxlY3Rpb24ub2JqZWN0KCk9PT1zZWxlY3Rpb24ub2JqZWN0KCkpCnJldHVybiB0aGlzLl9sYXN0U2VsZWN0aW9uLmVudHJ5SW5kZXg7Y29uc3QgaW5kZXg9dGhpcy5fZW50cnlEYXRhLmluZGV4T2YoKHNlbGVjdGlvbi5vYmplY3QoKSkpO2lmKGluZGV4IT09LTEpCnRoaXMuX2xhc3RTZWxlY3Rpb249bmV3IFRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydFZpZXcuU2VsZWN0aW9uKHNlbGVjdGlvbixpbmRleCk7cmV0dXJuIGluZGV4O30KYnVpbGRGbG93Rm9ySW5pdGlhdG9yKGVudHJ5SW5kZXgpe2lmKHRoaXMuX2xhc3RJbml0aWF0b3JFbnRyeT09PWVudHJ5SW5kZXgpCnJldHVybiBmYWxzZTt0aGlzLl9sYXN0SW5pdGlhdG9yRW50cnk9ZW50cnlJbmRleDtsZXQgZXZlbnQ9dGhpcy5ldmVudEJ5SW5kZXgoZW50cnlJbmRleCk7Y29uc3QgdGQ9dGhpcy5fdGltZWxpbmVEYXRhO3RkLmZsb3dTdGFydFRpbWVzPVtdO3RkLmZsb3dTdGFydExldmVscz1bXTt0ZC5mbG93RW5kVGltZXM9W107dGQuZmxvd0VuZExldmVscz1bXTt3aGlsZShldmVudCl7bGV0IGluaXRpYXRvcjtmb3IoO2V2ZW50O2V2ZW50PXRoaXMuX2V2ZW50UGFyZW50KGV2ZW50KSl7aW5pdGlhdG9yPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KS5pbml0aWF0b3IoKTtpZihpbml0aWF0b3IpCmJyZWFrO30KaWYoIWluaXRpYXRvcikKYnJlYWs7Y29uc3QgZXZlbnRJbmRleD1ldmVudFtUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuX2luZGV4U3ltYm9sXTtjb25zdCBpbml0aWF0b3JJbmRleD1pbml0aWF0b3JbVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLl9pbmRleFN5bWJvbF07dGQuZmxvd1N0YXJ0VGltZXMucHVzaChpbml0aWF0b3IuZW5kVGltZXx8aW5pdGlhdG9yLnN0YXJ0VGltZSk7dGQuZmxvd1N0YXJ0TGV2ZWxzLnB1c2godGQuZW50cnlMZXZlbHNbaW5pdGlhdG9ySW5kZXhdKTt0ZC5mbG93RW5kVGltZXMucHVzaChldmVudC5zdGFydFRpbWUpO3RkLmZsb3dFbmRMZXZlbHMucHVzaCh0ZC5lbnRyeUxldmVsc1tldmVudEluZGV4XSk7ZXZlbnQ9aW5pdGlhdG9yO30KcmV0dXJuIHRydWU7fQpfZXZlbnRQYXJlbnQoZXZlbnQpe3JldHVybiB0aGlzLl9lbnRyeVBhcmVudFtldmVudFtUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuX2luZGV4U3ltYm9sXV18fG51bGw7fQpldmVudEJ5SW5kZXgoZW50cnlJbmRleCl7cmV0dXJuIGVudHJ5SW5kZXg+PTAmJnRoaXMuX2VudHJ5VHlwZShlbnRyeUluZGV4KT09PVRpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydERhdGFQcm92aWRlci5FbnRyeVR5cGUuRXZlbnQ/KHRoaXMuX2VudHJ5RGF0YVtlbnRyeUluZGV4XSk6bnVsbDt9CnNldEV2ZW50Q29sb3JNYXBwaW5nKGNvbG9yRm9yRXZlbnQpe3RoaXMuX2NvbG9yRm9yRXZlbnQ9Y29sb3JGb3JFdmVudDt9fTtUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuSW5zdGFudEV2ZW50VmlzaWJsZUR1cmF0aW9uTXM9MC4wMDE7VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLl9pbmRleFN5bWJvbD1TeW1ib2woJ2luZGV4Jyk7VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkV2ZW50cz17RGF0YUNoYW5nZWQ6U3ltYm9sKCdEYXRhQ2hhbmdlZCcpfTtUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIuRW50cnlUeXBlPXtGcmFtZTpTeW1ib2woJ0ZyYW1lJyksRXZlbnQ6U3ltYm9sKCdFdmVudCcpLEludGVyYWN0aW9uUmVjb3JkOlN5bWJvbCgnSW50ZXJhY3Rpb25SZWNvcmQnKSxFeHRlbnNpb25FdmVudDpTeW1ib2woJ0V4dGVuc2lvbkV2ZW50JyksU2NyZWVuc2hvdDpTeW1ib2woJ1NjcmVlbnNob3QnKSx9OztUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnROZXR3b3JrRGF0YVByb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZm9udD0nMTFweCAnK0hvc3QuZm9udEZhbWlseSgpO3RoaXMuc2V0TW9kZWwobnVsbCk7dGhpcy5fc3R5bGU9e3BhZGRpbmc6NCxoZWlnaHQ6MTcsY29sbGFwc2libGU6dHJ1ZSxjb2xvcjpVSS50aGVtZVN1cHBvcnQucGF0Y2hDb2xvclRleHQoJyMyMjInLFVJLlRoZW1lU3VwcG9ydC5Db2xvclVzYWdlLkZvcmVncm91bmQpLGZvbnQ6dGhpcy5fZm9udCxiYWNrZ3JvdW5kQ29sb3I6VUkudGhlbWVTdXBwb3J0LnBhdGNoQ29sb3JUZXh0KCd3aGl0ZScsVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZCksbmVzdGluZ0xldmVsOjAsdXNlRmlyc3RMaW5lRm9yT3ZlcnZpZXc6ZmFsc2UsdXNlRGVjb3JhdG9yc0Zvck92ZXJ2aWV3OnRydWUsc2hhcmVIZWFkZXJMaW5lOmZhbHNlfTt0aGlzLl9ncm91cD17c3RhcnRMZXZlbDowLG5hbWU6Q29tbW9uLlVJU3RyaW5nKCdOZXR3b3JrJyksZXhwYW5kZWQ6ZmFsc2Usc3R5bGU6dGhpcy5fc3R5bGV9O3RoaXMuX21pbmltdW1Cb3VuZGFyeT0wO3RoaXMuX21heGltdW1Cb3VuZGFyeT0wO3RoaXMuX3RpbWVTcGFuPTA7fQpzZXRNb2RlbChwZXJmb3JtYW5jZU1vZGVsKXt0aGlzLl9tb2RlbD1wZXJmb3JtYW5jZU1vZGVsJiZwZXJmb3JtYW5jZU1vZGVsLnRpbWVsaW5lTW9kZWwoKTt0aGlzLl9tYXhMZXZlbD0wO3RoaXMuX3RpbWVsaW5lRGF0YT1udWxsO3RoaXMuX3JlcXVlc3RzPVtdO30KaXNFbXB0eSgpe3RoaXMudGltZWxpbmVEYXRhKCk7cmV0dXJuIXRoaXMuX3JlcXVlc3RzLmxlbmd0aDt9Cm1heFN0YWNrRGVwdGgoKXtyZXR1cm4gdGhpcy5fbWF4TGV2ZWw7fQp0aW1lbGluZURhdGEoKXtpZih0aGlzLl90aW1lbGluZURhdGEpCnJldHVybiB0aGlzLl90aW1lbGluZURhdGE7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fdGltZWxpbmVEYXRhPW5ldyBQZXJmVUkuRmxhbWVDaGFydC5UaW1lbGluZURhdGEoW10sW10sW10sW10pO2lmKHRoaXMuX21vZGVsKQp0aGlzLl9hcHBlbmRUaW1lbGluZURhdGEoKTtyZXR1cm4gdGhpcy5fdGltZWxpbmVEYXRhO30KbWluaW11bUJvdW5kYXJ5KCl7cmV0dXJuIHRoaXMuX21pbmltdW1Cb3VuZGFyeTt9CnRvdGFsVGltZSgpe3JldHVybiB0aGlzLl90aW1lU3Bhbjt9CnNldFdpbmRvd1RpbWVzKHN0YXJ0VGltZSxlbmRUaW1lKXt0aGlzLl9zdGFydFRpbWU9c3RhcnRUaW1lO3RoaXMuX2VuZFRpbWU9ZW5kVGltZTt0aGlzLl91cGRhdGVUaW1lbGluZURhdGEoKTt9CmNyZWF0ZVNlbGVjdGlvbihpbmRleCl7aWYoaW5kZXg9PT0tMSkKcmV0dXJuIG51bGw7Y29uc3QgcmVxdWVzdD10aGlzLl9yZXF1ZXN0c1tpbmRleF07dGhpcy5fbGFzdFNlbGVjdGlvbj1uZXcgVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0Vmlldy5TZWxlY3Rpb24oVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbU5ldHdvcmtSZXF1ZXN0KHJlcXVlc3QpLGluZGV4KTtyZXR1cm4gdGhpcy5fbGFzdFNlbGVjdGlvbi50aW1lbGluZVNlbGVjdGlvbjt9CmVudHJ5SW5kZXhGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKXtpZighc2VsZWN0aW9uKQpyZXR1cm4tMTtpZih0aGlzLl9sYXN0U2VsZWN0aW9uJiZ0aGlzLl9sYXN0U2VsZWN0aW9uLnRpbWVsaW5lU2VsZWN0aW9uLm9iamVjdCgpPT09c2VsZWN0aW9uLm9iamVjdCgpKQpyZXR1cm4gdGhpcy5fbGFzdFNlbGVjdGlvbi5lbnRyeUluZGV4O2lmKHNlbGVjdGlvbi50eXBlKCkhPT1UaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5UeXBlLk5ldHdvcmtSZXF1ZXN0KQpyZXR1cm4tMTtjb25zdCByZXF1ZXN0PShzZWxlY3Rpb24ub2JqZWN0KCkpO2NvbnN0IGluZGV4PXRoaXMuX3JlcXVlc3RzLmluZGV4T2YocmVxdWVzdCk7aWYoaW5kZXghPT0tMSl7dGhpcy5fbGFzdFNlbGVjdGlvbj1uZXcgVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0Vmlldy5TZWxlY3Rpb24oVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbU5ldHdvcmtSZXF1ZXN0KHJlcXVlc3QpLGluZGV4KTt9CnJldHVybiBpbmRleDt9CmVudHJ5Q29sb3IoaW5kZXgpe2NvbnN0IHJlcXVlc3Q9KHRoaXMuX3JlcXVlc3RzW2luZGV4XSk7Y29uc3QgY2F0ZWdvcnk9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLm5ldHdvcmtSZXF1ZXN0Q2F0ZWdvcnkocmVxdWVzdCk7cmV0dXJuIFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5uZXR3b3JrQ2F0ZWdvcnlDb2xvcihjYXRlZ29yeSk7fQp0ZXh0Q29sb3IoaW5kZXgpe3JldHVybiBUaW1lbGluZS5GbGFtZUNoYXJ0U3R5bGUudGV4dENvbG9yO30KZW50cnlUaXRsZShpbmRleCl7Y29uc3QgcmVxdWVzdD0odGhpcy5fcmVxdWVzdHNbaW5kZXhdKTtjb25zdCBwYXJzZWRVUkw9bmV3IENvbW1vbi5QYXJzZWRVUkwocmVxdWVzdC51cmx8fCcnKTtyZXR1cm4gcGFyc2VkVVJMLmlzVmFsaWQ/YCR7cGFyc2VkVVJMLmRpc3BsYXlOYW1lfSAoJHtwYXJzZWRVUkwuaG9zdH0pYDpyZXF1ZXN0LnVybHx8bnVsbDt9CmVudHJ5Rm9udChpbmRleCl7cmV0dXJuIHRoaXMuX2ZvbnQ7fQpkZWNvcmF0ZUVudHJ5KGluZGV4LGNvbnRleHQsdGV4dCxiYXJYLGJhclksYmFyV2lkdGgsYmFySGVpZ2h0LHVuY2xpcHBlZEJhclgsdGltZVRvUGl4ZWxSYXRpbyl7Y29uc3QgcmVxdWVzdD0odGhpcy5fcmVxdWVzdHNbaW5kZXhdKTtpZighcmVxdWVzdC50aW1pbmcpCnJldHVybiBmYWxzZTtmdW5jdGlvbiB0aW1lVG9QaXhlbCh0aW1lKXtyZXR1cm4gTWF0aC5mbG9vcih1bmNsaXBwZWRCYXJYKyh0aW1lLWJlZ2luVGltZSkqdGltZVRvUGl4ZWxSYXRpbyk7fQpjb25zdCBtaW5CYXJXaWR0aFB4PTI7Y29uc3QgYmVnaW5UaW1lPXJlcXVlc3QuYmVnaW5UaW1lKCk7Y29uc3Qgc3RhcnRUaW1lPXJlcXVlc3Quc3RhcnRUaW1lO2NvbnN0IGVuZFRpbWU9cmVxdWVzdC5lbmRUaW1lO2NvbnN0IHJlcXVlc3RUaW1lPXJlcXVlc3QudGltaW5nLnJlcXVlc3RUaW1lKjEwMDA7Y29uc3Qgc2VuZFN0YXJ0PU1hdGgubWF4KHRpbWVUb1BpeGVsKHJlcXVlc3RUaW1lK3JlcXVlc3QudGltaW5nLnNlbmRTdGFydCksdW5jbGlwcGVkQmFyWCk7Y29uc3QgaGVhZGVyc0VuZD1NYXRoLm1heCh0aW1lVG9QaXhlbChyZXF1ZXN0VGltZStyZXF1ZXN0LnRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZCksc2VuZFN0YXJ0KTtjb25zdCBmaW5pc2g9TWF0aC5tYXgodGltZVRvUGl4ZWwocmVxdWVzdC5maW5pc2hUaW1lfHxlbmRUaW1lKSxoZWFkZXJzRW5kK21pbkJhcldpZHRoUHgpO2NvbnN0IHN0YXJ0PXRpbWVUb1BpeGVsKHN0YXJ0VGltZSk7Y29uc3QgZW5kPU1hdGgubWF4KHRpbWVUb1BpeGVsKGVuZFRpbWUpLGZpbmlzaCk7Y29udGV4dC5maWxsU3R5bGU9J2hzbGEoMCwgMTAwJSwgMTAwJSwgMC44KSc7Y29udGV4dC5maWxsUmVjdChzZW5kU3RhcnQrMC41LGJhclkrMC41LGhlYWRlcnNFbmQtc2VuZFN0YXJ0LTAuNSxiYXJIZWlnaHQtMik7Y29udGV4dC5maWxsU3R5bGU9VUkudGhlbWVTdXBwb3J0LnBhdGNoQ29sb3JUZXh0KCd3aGl0ZScsVUkuVGhlbWVTdXBwb3J0LkNvbG9yVXNhZ2UuQmFja2dyb3VuZCk7Y29udGV4dC5maWxsUmVjdChiYXJYLGJhclktMC41LHNlbmRTdGFydC1iYXJYLGJhckhlaWdodCk7Y29udGV4dC5maWxsUmVjdChmaW5pc2gsYmFyWS0wLjUsYmFyWCtiYXJXaWR0aC1maW5pc2gsYmFySGVpZ2h0KTtpZihyZXF1ZXN0LnRpbWluZy5wdXNoU3RhcnQpe2NvbnN0IHB1c2hTdGFydD10aW1lVG9QaXhlbChyZXF1ZXN0LnRpbWluZy5wdXNoU3RhcnQqMTAwMCk7Y29uc3QgcHVzaEVuZD10aW1lVG9QaXhlbChyZXF1ZXN0LnRpbWluZy5wdXNoRW5kKjEwMDApO2NvbnN0IGRlbnRTaXplPU51bWJlci5jb25zdHJhaW4ocHVzaEVuZC1wdXNoU3RhcnQtMiwwLDQpO2NvbnN0IHBhZGRpbmc9MTtjb250ZXh0LnNhdmUoKTtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKHB1c2hTdGFydCtkZW50U2l6ZSxiYXJZK2JhckhlaWdodC8yKTtjb250ZXh0LmxpbmVUbyhwdXNoU3RhcnQsYmFyWStwYWRkaW5nKTtjb250ZXh0LmxpbmVUbyhwdXNoRW5kLWRlbnRTaXplLGJhclkrcGFkZGluZyk7Y29udGV4dC5saW5lVG8ocHVzaEVuZCxiYXJZK2JhckhlaWdodC8yKTtjb250ZXh0LmxpbmVUbyhwdXNoRW5kLWRlbnRTaXplLGJhclkrYmFySGVpZ2h0LXBhZGRpbmcpO2NvbnRleHQubGluZVRvKHB1c2hTdGFydCxiYXJZK2JhckhlaWdodC1wYWRkaW5nKTtjb250ZXh0LmNsb3NlUGF0aCgpO2NvbnRleHQuZmlsbFN0eWxlPXRoaXMuZW50cnlDb2xvcihpbmRleCk7Y29udGV4dC5nbG9iYWxBbHBoYT0wLjM7Y29udGV4dC5maWxsKCk7Y29udGV4dC5yZXN0b3JlKCk7fQpmdW5jdGlvbiBkcmF3VGljayhiZWdpbixlbmQseSl7Y29uc3QgdGlja0hlaWdodFB4PTY7Y29udGV4dC5tb3ZlVG8oYmVnaW4seS10aWNrSGVpZ2h0UHgvMik7Y29udGV4dC5saW5lVG8oYmVnaW4seSt0aWNrSGVpZ2h0UHgvMik7Y29udGV4dC5tb3ZlVG8oYmVnaW4seSk7Y29udGV4dC5saW5lVG8oZW5kLHkpO30KY29udGV4dC5iZWdpblBhdGgoKTtjb250ZXh0LmxpbmVXaWR0aD0xO2NvbnRleHQuc3Ryb2tlU3R5bGU9JyNjY2MnO2NvbnN0IGxpbmVZPU1hdGguZmxvb3IoYmFyWStiYXJIZWlnaHQvMikrMC41O2NvbnN0IGxlZnRUaWNrPXN0YXJ0KzAuNTtjb25zdCByaWdodFRpY2s9ZW5kLTAuNTtkcmF3VGljayhsZWZ0VGljayxzZW5kU3RhcnQsbGluZVkpO2RyYXdUaWNrKHJpZ2h0VGljayxmaW5pc2gsbGluZVkpO2NvbnRleHQuc3Ryb2tlKCk7aWYodHlwZW9mIHJlcXVlc3QucHJpb3JpdHk9PT0nc3RyaW5nJyl7Y29uc3QgY29sb3I9dGhpcy5fY29sb3JGb3JQcmlvcml0eShyZXF1ZXN0LnByaW9yaXR5KTtpZihjb2xvcil7Y29udGV4dC5maWxsU3R5bGU9Y29sb3I7Y29udGV4dC5maWxsUmVjdChzZW5kU3RhcnQrMC41LGJhclkrMC41LDMuNSwzLjUpO319CmNvbnN0IHRleHRTdGFydD1NYXRoLm1heChzZW5kU3RhcnQsMCk7Y29uc3QgdGV4dFdpZHRoPWZpbmlzaC10ZXh0U3RhcnQ7Y29uc3QgbWluVGV4dFdpZHRoUHg9MjA7aWYodGV4dFdpZHRoPj1taW5UZXh0V2lkdGhQeCl7dGV4dD10aGlzLmVudHJ5VGl0bGUoaW5kZXgpfHwnJztpZihyZXF1ZXN0LmZyb21TZXJ2aWNlV29ya2VyKQp0ZXh0PSfimpkgJyt0ZXh0O2lmKHRleHQpe2NvbnN0IHRleHRQYWRkaW5nPTQ7Y29uc3QgdGV4dEJhc2VsaW5lPTU7Y29uc3QgdGV4dEJhc2VIZWlnaHQ9YmFySGVpZ2h0LXRleHRCYXNlbGluZTtjb25zdCB0cmltbWVkVGV4dD1VSS50cmltVGV4dEVuZChjb250ZXh0LHRleHQsdGV4dFdpZHRoLTIqdGV4dFBhZGRpbmcpO2NvbnRleHQuZmlsbFN0eWxlPScjMzMzJztjb250ZXh0LmZpbGxUZXh0KHRyaW1tZWRUZXh0LHRleHRTdGFydCt0ZXh0UGFkZGluZyxiYXJZK3RleHRCYXNlSGVpZ2h0KTt9fQpyZXR1cm4gdHJ1ZTt9CmZvcmNlRGVjb3JhdGlvbihpbmRleCl7cmV0dXJuIHRydWU7fQpwcmVwYXJlSGlnaGxpZ2h0ZWRFbnRyeUluZm8oaW5kZXgpe2NvbnN0IG1heFVSTENoYXJzPTgwO2NvbnN0IHJlcXVlc3Q9KHRoaXMuX3JlcXVlc3RzW2luZGV4XSk7aWYoIXJlcXVlc3QudXJsKQpyZXR1cm4gbnVsbDtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO2NvbnN0IHJvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKGVsZW1lbnQsJ3RpbWVsaW5lL3RpbWVsaW5lRmxhbWVjaGFydFBvcG92ZXIuY3NzJyk7Y29uc3QgY29udGVudHM9cm9vdC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZmxhbWVjaGFydC1wb3BvdmVyJyk7Y29uc3QgZHVyYXRpb249cmVxdWVzdC5lbmRUaW1lLXJlcXVlc3Quc3RhcnRUaW1lO2lmKHJlcXVlc3Quc3RhcnRUaW1lJiZpc0Zpbml0ZShkdXJhdGlvbikpCmNvbnRlbnRzLmNyZWF0ZUNoaWxkKCdzcGFuJywndGltZWxpbmUtaW5mby1uZXR3b3JrLXRpbWUnKS50ZXh0Q29udGVudD1OdW1iZXIubWlsbGlzVG9TdHJpbmcoZHVyYXRpb24pO2lmKHR5cGVvZiByZXF1ZXN0LnByaW9yaXR5PT09J3N0cmluZycpe2NvbnN0IGRpdj1jb250ZW50cy5jcmVhdGVDaGlsZCgnc3BhbicpO2Rpdi50ZXh0Q29udGVudD1QZXJmVUkudWlMYWJlbEZvck5ldHdvcmtQcmlvcml0eSgocmVxdWVzdC5wcmlvcml0eSkpO2Rpdi5zdHlsZS5jb2xvcj10aGlzLl9jb2xvckZvclByaW9yaXR5KHJlcXVlc3QucHJpb3JpdHkpfHwnYmxhY2snO30KY29udGVudHMuY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD1yZXF1ZXN0LnVybC50cmltTWlkZGxlKG1heFVSTENoYXJzKTtyZXR1cm4gZWxlbWVudDt9Cl9jb2xvckZvclByaW9yaXR5KHByaW9yaXR5KXtpZighdGhpcy5fcHJpb3JpdHlUb1ZhbHVlKXtjb25zdCBwcmlvcml0aWVzPVByb3RvY29sLk5ldHdvcmsuUmVzb3VyY2VQcmlvcml0eTt0aGlzLl9wcmlvcml0eVRvVmFsdWU9bmV3IE1hcChbW3ByaW9yaXRpZXMuVmVyeUxvdywxXSxbcHJpb3JpdGllcy5Mb3csMl0sW3ByaW9yaXRpZXMuTWVkaXVtLDNdLFtwcmlvcml0aWVzLkhpZ2gsNF0sW3ByaW9yaXRpZXMuVmVyeUhpZ2gsNV1dKTt9CmNvbnN0IHZhbHVlPXRoaXMuX3ByaW9yaXR5VG9WYWx1ZS5nZXQocHJpb3JpdHkpO3JldHVybiB2YWx1ZT9gaHNsYSgyMTQsIDgwJSwgNTAlLCAke3ZhbHVlIC8gNX0pYDpudWxsO30KX2FwcGVuZFRpbWVsaW5lRGF0YSgpe3RoaXMuX21pbmltdW1Cb3VuZGFyeT10aGlzLl9tb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpO3RoaXMuX21heGltdW1Cb3VuZGFyeT10aGlzLl9tb2RlbC5tYXhpbXVtUmVjb3JkVGltZSgpO3RoaXMuX3RpbWVTcGFuPXRoaXMuX21vZGVsLmlzRW1wdHkoKT8xMDAwOnRoaXMuX21heGltdW1Cb3VuZGFyeS10aGlzLl9taW5pbXVtQm91bmRhcnk7dGhpcy5fbW9kZWwubmV0d29ya1JlcXVlc3RzKCkuZm9yRWFjaCh0aGlzLl9hcHBlbmRFbnRyeS5iaW5kKHRoaXMpKTt0aGlzLl91cGRhdGVUaW1lbGluZURhdGEoKTt9Cl91cGRhdGVUaW1lbGluZURhdGEoKXtpZighdGhpcy5fdGltZWxpbmVEYXRhKQpyZXR1cm47Y29uc3QgbGFzdFRpbWVCeUxldmVsPVtdO2xldCBtYXhMZXZlbD0wO2ZvcihsZXQgaT0wO2k8dGhpcy5fcmVxdWVzdHMubGVuZ3RoOysraSl7Y29uc3Qgcj10aGlzLl9yZXF1ZXN0c1tpXTtjb25zdCBiZWdpblRpbWU9ci5iZWdpblRpbWUoKTtjb25zdCB2aXNpYmxlPWJlZ2luVGltZTx0aGlzLl9lbmRUaW1lJiZyLmVuZFRpbWU+dGhpcy5fc3RhcnRUaW1lO2lmKCF2aXNpYmxlKXt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHNbaV09LTE7Y29udGludWU7fQp3aGlsZShsYXN0VGltZUJ5TGV2ZWwubGVuZ3RoJiZsYXN0VGltZUJ5TGV2ZWwucGVla0xhc3QoKTw9YmVnaW5UaW1lKQpsYXN0VGltZUJ5TGV2ZWwucG9wKCk7dGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW2ldPWxhc3RUaW1lQnlMZXZlbC5sZW5ndGg7bGFzdFRpbWVCeUxldmVsLnB1c2goci5lbmRUaW1lKTttYXhMZXZlbD1NYXRoLm1heChtYXhMZXZlbCxsYXN0VGltZUJ5TGV2ZWwubGVuZ3RoKTt9CmZvcihsZXQgaT0wO2k8dGhpcy5fcmVxdWVzdHMubGVuZ3RoOysraSl7aWYodGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5TGV2ZWxzW2ldPT09LTEpCnRoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeUxldmVsc1tpXT1tYXhMZXZlbDt9CnRoaXMuX3RpbWVsaW5lRGF0YT1uZXcgUGVyZlVJLkZsYW1lQ2hhcnQuVGltZWxpbmVEYXRhKHRoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeUxldmVscyx0aGlzLl90aW1lbGluZURhdGEuZW50cnlUb3RhbFRpbWVzLHRoaXMuX3RpbWVsaW5lRGF0YS5lbnRyeVN0YXJ0VGltZXMsW3RoaXMuX2dyb3VwXSk7dGhpcy5fbWF4TGV2ZWw9bWF4TGV2ZWw7fQpfYXBwZW5kRW50cnkocmVxdWVzdCl7dGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0KTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlTdGFydFRpbWVzLnB1c2gocmVxdWVzdC5iZWdpblRpbWUoKSk7dGhpcy5fdGltZWxpbmVEYXRhLmVudHJ5VG90YWxUaW1lcy5wdXNoKHJlcXVlc3QuZW5kVGltZS1yZXF1ZXN0LmJlZ2luVGltZSgpKTt0aGlzLl90aW1lbGluZURhdGEuZW50cnlMZXZlbHMucHVzaCh0aGlzLl9yZXF1ZXN0cy5sZW5ndGgtMSk7fQpwcmVmZXJyZWRIZWlnaHQoKXtyZXR1cm4gdGhpcy5fc3R5bGUuaGVpZ2h0Kih0aGlzLl9ncm91cC5leHBhbmRlZD9OdW1iZXIuY29uc3RyYWluKHRoaXMuX21heExldmVsKzEsNCw4LjUpOjEpO30KaXNFeHBhbmRlZCgpe3JldHVybiB0aGlzLl9ncm91cC5leHBhbmRlZDt9CmZvcm1hdFZhbHVlKHZhbHVlLHByZWNpc2lvbil7cmV0dXJuIE51bWJlci5wcmVjaXNlTWlsbGlzVG9TdHJpbmcodmFsdWUscHJlY2lzaW9uKTt9CmNhbkp1bXBUb0VudHJ5KGVudHJ5SW5kZXgpe3JldHVybiBmYWxzZTt9fTs7VGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0Vmlldz1jbGFzcyBleHRlbmRzIFVJLlZCb3h7Y29uc3RydWN0b3IoZGVsZWdhdGUpe3N1cGVyKCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RpbWVsaW5lLWZsYW1lY2hhcnQnKTt0aGlzLl9kZWxlZ2F0ZT1kZWxlZ2F0ZTt0aGlzLl9tb2RlbD1udWxsO3RoaXMuX3NlYXJjaFJlc3VsdHM7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W107dGhpcy5fc2hvd01lbW9yeUdyYXBoU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVTaG93TWVtb3J5JyxmYWxzZSk7dGhpcy5fbmV0d29ya1NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSxmYWxzZSwndGltZWxpbmVGbGFtZWNoYXJ0TWFpblZpZXcnLDE1MCk7Y29uc3QgbWFpblZpZXdHcm91cEV4cGFuc2lvblNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3RpbWVsaW5lRmxhbWVjaGFydE1haW5WaWV3R3JvdXBFeHBhbnNpb24nLHt9KTt0aGlzLl9tYWluRGF0YVByb3ZpZGVyPW5ldyBUaW1lbGluZS5UaW1lbGluZUZsYW1lQ2hhcnREYXRhUHJvdmlkZXIoKTt0aGlzLl9tYWluRGF0YVByb3ZpZGVyLmFkZEV2ZW50TGlzdGVuZXIoVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0RGF0YVByb3ZpZGVyLkV2ZW50cy5EYXRhQ2hhbmdlZCwoKT0+dGhpcy5fbWFpbkZsYW1lQ2hhcnQuc2NoZWR1bGVVcGRhdGUoKSk7dGhpcy5fbWFpbkZsYW1lQ2hhcnQ9bmV3IFBlcmZVSS5GbGFtZUNoYXJ0KHRoaXMuX21haW5EYXRhUHJvdmlkZXIsdGhpcyxtYWluVmlld0dyb3VwRXhwYW5zaW9uU2V0dGluZyk7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuYWx3YXlzU2hvd1ZlcnRpY2FsU2Nyb2xsKCk7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuZW5hYmxlUnVsZXIoZmFsc2UpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0R3JvdXBFeHBhbnNpb25TZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZUZsYW1lY2hhcnROZXR3b3JrVmlld0dyb3VwRXhwYW5zaW9uJyx7fSk7dGhpcy5fbmV0d29ya0RhdGFQcm92aWRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0TmV0d29ya0RhdGFQcm92aWRlcigpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0PW5ldyBQZXJmVUkuRmxhbWVDaGFydCh0aGlzLl9uZXR3b3JrRGF0YVByb3ZpZGVyLHRoaXMsdGhpcy5fbmV0d29ya0ZsYW1lQ2hhcnRHcm91cEV4cGFuc2lvblNldHRpbmcpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0LmFsd2F5c1Nob3dWZXJ0aWNhbFNjcm9sbCgpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0LmRpc2FibGVSYW5nZVNlbGVjdGlvbigpO3RoaXMuX25ldHdvcmtQYW5lPW5ldyBVSS5WQm94KCk7dGhpcy5fbmV0d29ya1BhbmUuc2V0TWluaW11bVNpemUoMjMsMjMpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0LnNob3codGhpcy5fbmV0d29ya1BhbmUuZWxlbWVudCk7dGhpcy5fc3BsaXRSZXNpemVyPXRoaXMuX25ldHdvcmtQYW5lLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWZsYW1lY2hhcnQtcmVzaXplcicpO3RoaXMuX25ldHdvcmtTcGxpdFdpZGdldC5oaWRlRGVmYXVsdFJlc2l6ZXIodHJ1ZSk7dGhpcy5fbmV0d29ya1NwbGl0V2lkZ2V0Lmluc3RhbGxSZXNpemVyKHRoaXMuX3NwbGl0UmVzaXplcik7dGhpcy5fbmV0d29ya1NwbGl0V2lkZ2V0LnNldE1haW5XaWRnZXQodGhpcy5fbWFpbkZsYW1lQ2hhcnQpO3RoaXMuX25ldHdvcmtTcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuX25ldHdvcmtQYW5lKTt0aGlzLl9jaGFydFNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSx0cnVlLCd0aW1lbGluZUNvdW50ZXJzU3BsaXRWaWV3U3RhdGUnKTt0aGlzLl9jb3VudGVyc1ZpZXc9bmV3IFRpbWVsaW5lLkNvdW50ZXJzR3JhcGgodGhpcy5fZGVsZWdhdGUpO3RoaXMuX2NoYXJ0U3BsaXRXaWRnZXQuc2V0TWFpbldpZGdldCh0aGlzLl9uZXR3b3JrU3BsaXRXaWRnZXQpO3RoaXMuX2NoYXJ0U3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9jb3VudGVyc1ZpZXcpO3RoaXMuX2NoYXJ0U3BsaXRXaWRnZXQuaGlkZURlZmF1bHRSZXNpemVyKCk7dGhpcy5fY2hhcnRTcGxpdFdpZGdldC5pbnN0YWxsUmVzaXplcigodGhpcy5fY291bnRlcnNWaWV3LnJlc2l6ZXJFbGVtZW50KCkpKTt0aGlzLl91cGRhdGVDb3VudGVyc0dyYXBoVG9nZ2xlKCk7dGhpcy5fZGV0YWlsc1NwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldChmYWxzZSx0cnVlLCd0aW1lbGluZVBhbmVsRGV0YWlsc1NwbGl0Vmlld1N0YXRlJyk7dGhpcy5fZGV0YWlsc1NwbGl0V2lkZ2V0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtZGV0YWlscy1zcGxpdCcpO3RoaXMuX2RldGFpbHNWaWV3PW5ldyBUaW1lbGluZS5UaW1lbGluZURldGFpbHNWaWV3KGRlbGVnYXRlKTt0aGlzLl9kZXRhaWxzU3BsaXRXaWRnZXQuaW5zdGFsbFJlc2l6ZXIodGhpcy5fZGV0YWlsc1ZpZXcuaGVhZGVyRWxlbWVudCgpKTt0aGlzLl9kZXRhaWxzU3BsaXRXaWRnZXQuc2V0TWFpbldpZGdldCh0aGlzLl9jaGFydFNwbGl0V2lkZ2V0KTt0aGlzLl9kZXRhaWxzU3BsaXRXaWRnZXQuc2V0U2lkZWJhcldpZGdldCh0aGlzLl9kZXRhaWxzVmlldyk7dGhpcy5fZGV0YWlsc1NwbGl0V2lkZ2V0LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9vbk1haW5FbnRyeVNlbGVjdGVkPXRoaXMuX29uRW50cnlTZWxlY3RlZC5iaW5kKHRoaXMsdGhpcy5fbWFpbkRhdGFQcm92aWRlcik7dGhpcy5fb25OZXR3b3JrRW50cnlTZWxlY3RlZD10aGlzLl9vbkVudHJ5U2VsZWN0ZWQuYmluZCh0aGlzLHRoaXMuX25ldHdvcmtEYXRhUHJvdmlkZXIpO3RoaXMuX21haW5GbGFtZUNoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoUGVyZlVJLkZsYW1lQ2hhcnQuRXZlbnRzLkVudHJ5U2VsZWN0ZWQsdGhpcy5fb25NYWluRW50cnlTZWxlY3RlZCx0aGlzKTt0aGlzLl9uZXR3b3JrRmxhbWVDaGFydC5hZGRFdmVudExpc3RlbmVyKFBlcmZVSS5GbGFtZUNoYXJ0LkV2ZW50cy5FbnRyeVNlbGVjdGVkLHRoaXMuX29uTmV0d29ya0VudHJ5U2VsZWN0ZWQsdGhpcyk7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuRmxhbWVDaGFydC5FdmVudHMuRW50cnlIaWdobGlnaHRlZCx0aGlzLl9vbkVudHJ5SGlnaGxpZ2h0ZWQsdGhpcyk7dGhpcy5fbmV4dEV4dGVuc2lvbkluZGV4PTA7dGhpcy5fYm91bmRSZWZyZXNoPXRoaXMuX3JlZnJlc2guYmluZCh0aGlzKTt0aGlzLl9zZWxlY3RlZFRyYWNrPW51bGw7dGhpcy5fbWFpbkRhdGFQcm92aWRlci5zZXRFdmVudENvbG9yTWFwcGluZyhUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRDb2xvcik7dGhpcy5fZ3JvdXBCeVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3RpbWVsaW5lVHJlZUdyb3VwQnknLFRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Lkdyb3VwQnkuTm9uZSk7dGhpcy5fZ3JvdXBCeVNldHRpbmcuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5fdXBkYXRlQ29sb3JNYXBwZXIsdGhpcyk7dGhpcy5fdXBkYXRlQ29sb3JNYXBwZXIoKTtQcm9kdWN0UmVnaXN0cnkuaW5zdGFuY2UoKS50aGVuKHJlZ2lzdHJ5PT50aGlzLl9wcm9kdWN0UmVnaXN0cnk9cmVnaXN0cnkpO30KX3VwZGF0ZUNvbG9yTWFwcGVyKCl7dGhpcy5fdXJsVG9Db2xvckNhY2hlPW5ldyBNYXAoKTtpZighdGhpcy5fbW9kZWwpCnJldHVybjtjb25zdCBjb2xvckJ5UHJvZHVjdD10aGlzLl9ncm91cEJ5U2V0dGluZy5nZXQoKT09PVRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Lkdyb3VwQnkuUHJvZHVjdDt0aGlzLl9tYWluRGF0YVByb3ZpZGVyLnNldEV2ZW50Q29sb3JNYXBwaW5nKGNvbG9yQnlQcm9kdWN0P3RoaXMuX2NvbG9yQnlQcm9kdWN0Rm9yRXZlbnQuYmluZCh0aGlzKTpUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRDb2xvcik7dGhpcy5fbWFpbkZsYW1lQ2hhcnQudXBkYXRlKCk7fQpfY29sb3JCeVByb2R1Y3RGb3JFdmVudChldmVudCl7cmV0dXJuIFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudENvbG9yQnlQcm9kdWN0KHRoaXMuX3Byb2R1Y3RSZWdpc3RyeSx0aGlzLl9tb2RlbC50aW1lbGluZU1vZGVsKCksdGhpcy5fdXJsVG9Db2xvckNhY2hlLGV2ZW50KTt9Cl9vbldpbmRvd0NoYW5nZWQoZXZlbnQpe2NvbnN0IHdpbmRvdz0oZXZlbnQuZGF0YS53aW5kb3cpO2NvbnN0IGFuaW1hdGU9ISFldmVudC5kYXRhLmFuaW1hdGU7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuc2V0V2luZG93VGltZXMod2luZG93LmxlZnQsd2luZG93LnJpZ2h0LGFuaW1hdGUpO3RoaXMuX25ldHdvcmtGbGFtZUNoYXJ0LnNldFdpbmRvd1RpbWVzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCxhbmltYXRlKTt0aGlzLl9uZXR3b3JrRGF0YVByb3ZpZGVyLnNldFdpbmRvd1RpbWVzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCk7dGhpcy5fdXBkYXRlU2VhcmNoUmVzdWx0cyhmYWxzZSxmYWxzZSk7fQp3aW5kb3dDaGFuZ2VkKHdpbmRvd1N0YXJ0VGltZSx3aW5kb3dFbmRUaW1lLGFuaW1hdGUpe3RoaXMuX21vZGVsLnNldFdpbmRvdyh7bGVmdDp3aW5kb3dTdGFydFRpbWUscmlnaHQ6d2luZG93RW5kVGltZX0sYW5pbWF0ZSk7fQp1cGRhdGVSYW5nZVNlbGVjdGlvbihzdGFydFRpbWUsZW5kVGltZSl7dGhpcy5fZGVsZWdhdGUuc2VsZWN0KFRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLmZyb21SYW5nZShzdGFydFRpbWUsZW5kVGltZSkpO30KdXBkYXRlU2VsZWN0ZWRHcm91cChmbGFtZUNoYXJ0LGdyb3VwKXtpZihmbGFtZUNoYXJ0IT09dGhpcy5fbWFpbkZsYW1lQ2hhcnQpCnJldHVybjtjb25zdCB0cmFjaz1ncm91cD90aGlzLl9tYWluRGF0YVByb3ZpZGVyLmdyb3VwVHJhY2soZ3JvdXApOm51bGw7dGhpcy5fc2VsZWN0ZWRUcmFjaz10cmFjazt0aGlzLl91cGRhdGVUcmFjaygpO30Kc2V0TW9kZWwobW9kZWwpe2lmKG1vZGVsPT09dGhpcy5fbW9kZWwpCnJldHVybjtDb21tb24uRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5fZXZlbnRMaXN0ZW5lcnMpO3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX3NlbGVjdGVkVHJhY2s9bnVsbDt0aGlzLl9tYWluRGF0YVByb3ZpZGVyLnNldE1vZGVsKHRoaXMuX21vZGVsKTt0aGlzLl9uZXR3b3JrRGF0YVByb3ZpZGVyLnNldE1vZGVsKHRoaXMuX21vZGVsKTtpZih0aGlzLl9tb2RlbCl7dGhpcy5fZXZlbnRMaXN0ZW5lcnM9W3RoaXMuX21vZGVsLmFkZEV2ZW50TGlzdGVuZXIoVGltZWxpbmUuUGVyZm9ybWFuY2VNb2RlbC5FdmVudHMuV2luZG93Q2hhbmdlZCx0aGlzLl9vbldpbmRvd0NoYW5nZWQsdGhpcyksdGhpcy5fbW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihUaW1lbGluZS5QZXJmb3JtYW5jZU1vZGVsLkV2ZW50cy5FeHRlbnNpb25EYXRhQWRkZWQsdGhpcy5fYXBwZW5kRXh0ZW5zaW9uRGF0YSx0aGlzKV07Y29uc3Qgd2luZG93PW1vZGVsLndpbmRvdygpO3RoaXMuX21haW5GbGFtZUNoYXJ0LnNldFdpbmRvd1RpbWVzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCk7dGhpcy5fbmV0d29ya0ZsYW1lQ2hhcnQuc2V0V2luZG93VGltZXMod2luZG93LmxlZnQsd2luZG93LnJpZ2h0KTt0aGlzLl9uZXR3b3JrRGF0YVByb3ZpZGVyLnNldFdpbmRvd1RpbWVzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCk7dGhpcy5fdXBkYXRlU2VhcmNoUmVzdWx0cyhmYWxzZSxmYWxzZSk7fQp0aGlzLl91cGRhdGVDb2xvck1hcHBlcigpO3RoaXMuX3VwZGF0ZVRyYWNrKCk7dGhpcy5fbmV4dEV4dGVuc2lvbkluZGV4PTA7dGhpcy5fYXBwZW5kRXh0ZW5zaW9uRGF0YSgpO3RoaXMuX3JlZnJlc2goKTt9Cl91cGRhdGVUcmFjaygpe3RoaXMuX2NvdW50ZXJzVmlldy5zZXRNb2RlbCh0aGlzLl9tb2RlbCx0aGlzLl9zZWxlY3RlZFRyYWNrKTt0aGlzLl9kZXRhaWxzVmlldy5zZXRNb2RlbCh0aGlzLl9tb2RlbCx0aGlzLl9zZWxlY3RlZFRyYWNrKTt9Cl9yZWZyZXNoKCl7aWYodGhpcy5fbmV0d29ya0RhdGFQcm92aWRlci5pc0VtcHR5KCkpe3RoaXMuX21haW5GbGFtZUNoYXJ0LmVuYWJsZVJ1bGVyKHRydWUpO3RoaXMuX25ldHdvcmtTcGxpdFdpZGdldC5oaWRlU2lkZWJhcigpO31lbHNle3RoaXMuX21haW5GbGFtZUNoYXJ0LmVuYWJsZVJ1bGVyKGZhbHNlKTt0aGlzLl9uZXR3b3JrU3BsaXRXaWRnZXQuc2hvd0JvdGgoKTt0aGlzLnJlc2l6ZVRvUHJlZmVycmVkSGVpZ2h0cygpO30KdGhpcy5fbWFpbkZsYW1lQ2hhcnQucmVzZXQoKTt0aGlzLl9uZXR3b3JrRmxhbWVDaGFydC5yZXNldCgpO3RoaXMuX3VwZGF0ZVNlYXJjaFJlc3VsdHMoZmFsc2UsZmFsc2UpO30KX2FwcGVuZEV4dGVuc2lvbkRhdGEoKXtpZighdGhpcy5fbW9kZWwpCnJldHVybjtjb25zdCBleHRlbnNpb25zPXRoaXMuX21vZGVsLmV4dGVuc2lvbkluZm8oKTt3aGlsZSh0aGlzLl9uZXh0RXh0ZW5zaW9uSW5kZXg8ZXh0ZW5zaW9ucy5sZW5ndGgpCnRoaXMuX21haW5EYXRhUHJvdmlkZXIuYXBwZW5kRXh0ZW5zaW9uRXZlbnRzKGV4dGVuc2lvbnNbdGhpcy5fbmV4dEV4dGVuc2lvbkluZGV4KytdKTt0aGlzLl9tYWluRmxhbWVDaGFydC5zY2hlZHVsZVVwZGF0ZSgpO30KX29uRW50cnlIaWdobGlnaHRlZChjb21tb25FdmVudCl7U0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO2NvbnN0IGVudHJ5SW5kZXg9KGNvbW1vbkV2ZW50LmRhdGEpO2NvbnN0IGV2ZW50PXRoaXMuX21haW5EYXRhUHJvdmlkZXIuZXZlbnRCeUluZGV4KGVudHJ5SW5kZXgpO2lmKCFldmVudCkKcmV0dXJuO2NvbnN0IHRhcmdldD10aGlzLl9tb2RlbCYmdGhpcy5fbW9kZWwudGltZWxpbmVNb2RlbCgpLnRhcmdldEJ5RXZlbnQoZXZlbnQpO2lmKCF0YXJnZXQpCnJldHVybjtjb25zdCB0aW1lbGluZURhdGE9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpO2NvbnN0IGJhY2tlbmROb2RlSWQ9dGltZWxpbmVEYXRhLmJhY2tlbmROb2RlSWQ7aWYoIWJhY2tlbmROb2RlSWQpCnJldHVybjtuZXcgU0RLLkRlZmVycmVkRE9NTm9kZSh0YXJnZXQsYmFja2VuZE5vZGVJZCkuaGlnaGxpZ2h0KCk7fQpoaWdobGlnaHRFdmVudChldmVudCl7Y29uc3QgZW50cnlJbmRleD1ldmVudD90aGlzLl9tYWluRGF0YVByb3ZpZGVyLmVudHJ5SW5kZXhGb3JTZWxlY3Rpb24oVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbVRyYWNlRXZlbnQoZXZlbnQpKTotMTtpZihlbnRyeUluZGV4Pj0wKQp0aGlzLl9tYWluRmxhbWVDaGFydC5oaWdobGlnaHRFbnRyeShlbnRyeUluZGV4KTtlbHNlCnRoaXMuX21haW5GbGFtZUNoYXJ0LmhpZGVIaWdobGlnaHQoKTt9CndpbGxIaWRlKCl7dGhpcy5fbmV0d29ya0ZsYW1lQ2hhcnRHcm91cEV4cGFuc2lvblNldHRpbmcucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNpemVUb1ByZWZlcnJlZEhlaWdodHMsdGhpcyk7dGhpcy5fc2hvd01lbW9yeUdyYXBoU2V0dGluZy5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGVDb3VudGVyc0dyYXBoVG9nZ2xlLHRoaXMpO0JpbmRpbmdzLmJsYWNrYm94TWFuYWdlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLl9ib3VuZFJlZnJlc2gpO30Kd2FzU2hvd24oKXt0aGlzLl9uZXR3b3JrRmxhbWVDaGFydEdyb3VwRXhwYW5zaW9uU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc2l6ZVRvUHJlZmVycmVkSGVpZ2h0cyx0aGlzKTt0aGlzLl9zaG93TWVtb3J5R3JhcGhTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZUNvdW50ZXJzR3JhcGhUb2dnbGUsdGhpcyk7QmluZGluZ3MuYmxhY2tib3hNYW5hZ2VyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX2JvdW5kUmVmcmVzaCk7aWYodGhpcy5fbmVlZHNSZXNpemVUb1ByZWZlcnJlZEhlaWdodHMpCnRoaXMucmVzaXplVG9QcmVmZXJyZWRIZWlnaHRzKCk7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuc2NoZWR1bGVVcGRhdGUoKTt0aGlzLl9uZXR3b3JrRmxhbWVDaGFydC5zY2hlZHVsZVVwZGF0ZSgpO30KX3VwZGF0ZUNvdW50ZXJzR3JhcGhUb2dnbGUoKXtpZih0aGlzLl9zaG93TWVtb3J5R3JhcGhTZXR0aW5nLmdldCgpKQp0aGlzLl9jaGFydFNwbGl0V2lkZ2V0LnNob3dCb3RoKCk7ZWxzZQp0aGlzLl9jaGFydFNwbGl0V2lkZ2V0LmhpZGVTaWRlYmFyKCk7fQpzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKXtsZXQgaW5kZXg9dGhpcy5fbWFpbkRhdGFQcm92aWRlci5lbnRyeUluZGV4Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7dGhpcy5fbWFpbkZsYW1lQ2hhcnQuc2V0U2VsZWN0ZWRFbnRyeShpbmRleCk7aW5kZXg9dGhpcy5fbmV0d29ya0RhdGFQcm92aWRlci5lbnRyeUluZGV4Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7dGhpcy5fbmV0d29ya0ZsYW1lQ2hhcnQuc2V0U2VsZWN0ZWRFbnRyeShpbmRleCk7aWYodGhpcy5fZGV0YWlsc1ZpZXcpCnRoaXMuX2RldGFpbHNWaWV3LnNldFNlbGVjdGlvbihzZWxlY3Rpb24pO30KX29uRW50cnlTZWxlY3RlZChkYXRhUHJvdmlkZXIsZXZlbnQpe2NvbnN0IGVudHJ5SW5kZXg9KGV2ZW50LmRhdGEpO2lmKFJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCd0aW1lbGluZUV2ZW50SW5pdGlhdG9ycycpJiZkYXRhUHJvdmlkZXI9PT10aGlzLl9tYWluRGF0YVByb3ZpZGVyKXtpZih0aGlzLl9tYWluRGF0YVByb3ZpZGVyLmJ1aWxkRmxvd0ZvckluaXRpYXRvcihlbnRyeUluZGV4KSkKdGhpcy5fbWFpbkZsYW1lQ2hhcnQuc2NoZWR1bGVVcGRhdGUoKTt9CnRoaXMuX2RlbGVnYXRlLnNlbGVjdChkYXRhUHJvdmlkZXIuY3JlYXRlU2VsZWN0aW9uKGVudHJ5SW5kZXgpKTt9CnJlc2l6ZVRvUHJlZmVycmVkSGVpZ2h0cygpe2lmKCF0aGlzLmlzU2hvd2luZygpKXt0aGlzLl9uZWVkc1Jlc2l6ZVRvUHJlZmVycmVkSGVpZ2h0cz10cnVlO3JldHVybjt9CnRoaXMuX25lZWRzUmVzaXplVG9QcmVmZXJyZWRIZWlnaHRzPWZhbHNlO3RoaXMuX25ldHdvcmtQYW5lLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgndGltZWxpbmUtbmV0d29yay1yZXNpemVyLWRpc2FibGVkJywhdGhpcy5fbmV0d29ya0RhdGFQcm92aWRlci5pc0V4cGFuZGVkKCkpO3RoaXMuX25ldHdvcmtTcGxpdFdpZGdldC5zZXRTaWRlYmFyU2l6ZSh0aGlzLl9uZXR3b3JrRGF0YVByb3ZpZGVyLnByZWZlcnJlZEhlaWdodCgpK3RoaXMuX3NwbGl0UmVzaXplci5jbGllbnRIZWlnaHQrUGVyZlVJLkZsYW1lQ2hhcnQuSGVhZGVySGVpZ2h0KwoyKTt9CnNldFNlYXJjaGFibGVWaWV3KHNlYXJjaGFibGVWaWV3KXt0aGlzLl9zZWFyY2hhYmxlVmlldz1zZWFyY2hhYmxlVmlldzt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fc2VhcmNoUmVzdWx0c3x8IXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKQpyZXR1cm47Y29uc3QgaW5kZXg9dHlwZW9mIHRoaXMuX3NlbGVjdGVkU2VhcmNoUmVzdWx0IT09J3VuZGVmaW5lZCc/dGhpcy5fc2VhcmNoUmVzdWx0cy5pbmRleE9mKHRoaXMuX3NlbGVjdGVkU2VhcmNoUmVzdWx0KTotMTt0aGlzLl9zZWxlY3RTZWFyY2hSZXN1bHQobW9kKGluZGV4KzEsdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpKTt9Cmp1bXBUb1ByZXZpb3VzU2VhcmNoUmVzdWx0KCl7aWYoIXRoaXMuX3NlYXJjaFJlc3VsdHN8fCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO2NvbnN0IGluZGV4PXR5cGVvZiB0aGlzLl9zZWxlY3RlZFNlYXJjaFJlc3VsdCE9PSd1bmRlZmluZWQnP3RoaXMuX3NlYXJjaFJlc3VsdHMuaW5kZXhPZih0aGlzLl9zZWxlY3RlZFNlYXJjaFJlc3VsdCk6MDt0aGlzLl9zZWxlY3RTZWFyY2hSZXN1bHQobW9kKGluZGV4LTEsdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpKTt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiB0cnVlO30KX3NlbGVjdFNlYXJjaFJlc3VsdChpbmRleCl7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlQ3VycmVudE1hdGNoSW5kZXgoaW5kZXgpO3RoaXMuX3NlbGVjdGVkU2VhcmNoUmVzdWx0PXRoaXMuX3NlYXJjaFJlc3VsdHNbaW5kZXhdO3RoaXMuX2RlbGVnYXRlLnNlbGVjdCh0aGlzLl9tYWluRGF0YVByb3ZpZGVyLmNyZWF0ZVNlbGVjdGlvbih0aGlzLl9zZWxlY3RlZFNlYXJjaFJlc3VsdCkpO30KX3VwZGF0ZVNlYXJjaFJlc3VsdHMoc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXtjb25zdCBvbGRTZWxlY3RlZFNlYXJjaFJlc3VsdD10aGlzLl9zZWxlY3RlZFNlYXJjaFJlc3VsdDtkZWxldGUgdGhpcy5fc2VsZWN0ZWRTZWFyY2hSZXN1bHQ7dGhpcy5fc2VhcmNoUmVzdWx0cz1bXTtpZighdGhpcy5fc2VhcmNoUmVnZXh8fCF0aGlzLl9tb2RlbCkKcmV0dXJuO2NvbnN0IHJlZ0V4cEZpbHRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVGaWx0ZXJzLlJlZ0V4cCh0aGlzLl9zZWFyY2hSZWdleCk7Y29uc3Qgd2luZG93PXRoaXMuX21vZGVsLndpbmRvdygpO3RoaXMuX3NlYXJjaFJlc3VsdHM9dGhpcy5fbWFpbkRhdGFQcm92aWRlci5zZWFyY2god2luZG93LmxlZnQsd2luZG93LnJpZ2h0LHJlZ0V4cEZpbHRlcik7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKTtpZighc2hvdWxkSnVtcHx8IXRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKQpyZXR1cm47bGV0IHNlbGVjdGVkSW5kZXg9dGhpcy5fc2VhcmNoUmVzdWx0cy5pbmRleE9mKG9sZFNlbGVjdGVkU2VhcmNoUmVzdWx0KTtpZihzZWxlY3RlZEluZGV4PT09LTEpCnNlbGVjdGVkSW5kZXg9anVtcEJhY2t3YXJkcz90aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aC0xOjA7dGhpcy5fc2VsZWN0U2VhcmNoUmVzdWx0KHNlbGVjdGVkSW5kZXgpO30Kc2VhcmNoQ2FuY2VsZWQoKXtpZih0eXBlb2YgdGhpcy5fc2VsZWN0ZWRTZWFyY2hSZXN1bHQhPT0ndW5kZWZpbmVkJykKdGhpcy5fZGVsZWdhdGUuc2VsZWN0KG51bGwpO2RlbGV0ZSB0aGlzLl9zZWFyY2hSZXN1bHRzO2RlbGV0ZSB0aGlzLl9zZWxlY3RlZFNlYXJjaFJlc3VsdDtkZWxldGUgdGhpcy5fc2VhcmNoUmVnZXg7fQpwZXJmb3JtU2VhcmNoKHNlYXJjaENvbmZpZyxzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpe3RoaXMuX3NlYXJjaFJlZ2V4PXNlYXJjaENvbmZpZy50b1NlYXJjaFJlZ2V4KCk7dGhpcy5fdXBkYXRlU2VhcmNoUmVzdWx0cyhzaG91bGRKdW1wLGp1bXBCYWNrd2FyZHMpO319O1RpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydFZpZXcuU2VsZWN0aW9uPWNsYXNze2NvbnN0cnVjdG9yKHNlbGVjdGlvbixlbnRyeUluZGV4KXt0aGlzLnRpbWVsaW5lU2VsZWN0aW9uPXNlbGVjdGlvbjt0aGlzLmVudHJ5SW5kZXg9ZW50cnlJbmRleDt9fTtUaW1lbGluZS5GbGFtZUNoYXJ0U3R5bGU9e3RleHRDb2xvcjonIzMzMyd9O1RpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydE1hcmtlcj1jbGFzc3tjb25zdHJ1Y3RvcihzdGFydFRpbWUsc3RhcnRPZmZzZXQsc3R5bGUpe3RoaXMuX3N0YXJ0VGltZT1zdGFydFRpbWU7dGhpcy5fc3RhcnRPZmZzZXQ9c3RhcnRPZmZzZXQ7dGhpcy5fc3R5bGU9c3R5bGU7fQpzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lO30KY29sb3IoKXtyZXR1cm4gdGhpcy5fc3R5bGUuY29sb3I7fQp0aXRsZSgpe2NvbnN0IHN0YXJ0VGltZT1OdW1iZXIubWlsbGlzVG9TdHJpbmcodGhpcy5fc3RhcnRPZmZzZXQpO3JldHVybiBDb21tb24uVUlTdHJpbmcoJyVzIGF0ICVzJyx0aGlzLl9zdHlsZS50aXRsZSxzdGFydFRpbWUpO30KZHJhdyhjb250ZXh0LHgsaGVpZ2h0LHBpeGVsc1Blck1pbGxpc2Vjb25kKXtjb25zdCBsb3dQcmlvcml0eVZpc2liaWxpdHlUaHJlc2hvbGRJblBpeGVsc1Blck1zPTQ7aWYodGhpcy5fc3R5bGUubG93UHJpb3JpdHkmJnBpeGVsc1Blck1pbGxpc2Vjb25kPGxvd1ByaW9yaXR5VmlzaWJpbGl0eVRocmVzaG9sZEluUGl4ZWxzUGVyTXMpCnJldHVybjtjb250ZXh0LnNhdmUoKTtpZighdGhpcy5fc3R5bGUubG93UHJpb3JpdHkpe2NvbnRleHQuc3Ryb2tlU3R5bGU9dGhpcy5fc3R5bGUuY29sb3I7Y29udGV4dC5saW5lV2lkdGg9Mjtjb250ZXh0LmJlZ2luUGF0aCgpO2NvbnRleHQubW92ZVRvKHgsMCk7Y29udGV4dC5saW5lVG8oeCxoZWlnaHQpO2NvbnRleHQuc3Ryb2tlKCk7fQppZih0aGlzLl9zdHlsZS50YWxsKXtjb250ZXh0LnN0cm9rZVN0eWxlPXRoaXMuX3N0eWxlLmNvbG9yO2NvbnRleHQubGluZVdpZHRoPXRoaXMuX3N0eWxlLmxpbmVXaWR0aDtjb250ZXh0LnRyYW5zbGF0ZSh0aGlzLl9zdHlsZS5saW5lV2lkdGg8MXx8KHRoaXMuX3N0eWxlLmxpbmVXaWR0aCYxKT8wLjU6MCwwLjUpO2NvbnRleHQuYmVnaW5QYXRoKCk7Y29udGV4dC5tb3ZlVG8oeCxoZWlnaHQpO2NvbnRleHQuc2V0TGluZURhc2godGhpcy5fc3R5bGUuZGFzaFN0eWxlKTtjb250ZXh0LmxpbmVUbyh4LGNvbnRleHQuY2FudmFzLmhlaWdodCk7Y29udGV4dC5zdHJva2UoKTt9CmNvbnRleHQucmVzdG9yZSgpO319O1RpbWVsaW5lLlRpbWVsaW5lRmxhbWVDaGFydFZpZXcuX0NvbG9yQnk9e1VSTDonVVJMJyxQcm9kdWN0OidQcm9kdWN0J307O1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9yZWNvcmRpbmdzPVtdO3RoaXMuX2FjdGlvbj0oVUkuYWN0aW9uUmVnaXN0cnkuYWN0aW9uKCd0aW1lbGluZS5zaG93LWhpc3RvcnknKSk7dGhpcy5fbmV4dE51bWJlckJ5RG9tYWluPW5ldyBNYXAoKTt0aGlzLl9idXR0b249bmV3IFRpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuVG9vbGJhckJ1dHRvbih0aGlzLl9hY3Rpb24pO3RoaXMuY2xlYXIoKTt0aGlzLl9hbGxPdmVydmlld3M9W3tjb25zdHJ1Y3RvcjpUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdSZXNwb25zaXZlbmVzcyxoZWlnaHQ6M30se2NvbnN0cnVjdG9yOlRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld0ZyYW1lcyxoZWlnaHQ6MTZ9LHtjb25zdHJ1Y3RvcjpUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdDUFVBY3Rpdml0eSxoZWlnaHQ6MjB9LHtjb25zdHJ1Y3RvcjpUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdOZXR3b3JrLGhlaWdodDo4fV07dGhpcy5fdG90YWxIZWlnaHQ9dGhpcy5fYWxsT3ZlcnZpZXdzLnJlZHVjZSgoYWNjLGVudHJ5KT0+YWNjK2VudHJ5LmhlaWdodCwwKTt0aGlzLl9lbmFibGVkPXRydWU7dGhpcy5fbGFzdEFjdGl2ZU1vZGVsPW51bGw7fQphZGRSZWNvcmRpbmcocGVyZm9ybWFuY2VNb2RlbCl7dGhpcy5fbGFzdEFjdGl2ZU1vZGVsPXBlcmZvcm1hbmNlTW9kZWw7dGhpcy5fcmVjb3JkaW5ncy51bnNoaWZ0KHBlcmZvcm1hbmNlTW9kZWwpO3RoaXMuX2J1aWxkUHJldmlldyhwZXJmb3JtYW5jZU1vZGVsKTt0aGlzLl9idXR0b24uc2V0VGV4dCh0aGlzLl90aXRsZShwZXJmb3JtYW5jZU1vZGVsKSk7dGhpcy5fdXBkYXRlU3RhdGUoKTtpZih0aGlzLl9yZWNvcmRpbmdzLmxlbmd0aDw9VGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fbWF4UmVjb3JkaW5ncykKcmV0dXJuO2NvbnN0IGxydU1vZGVsPXRoaXMuX3JlY29yZGluZ3MucmVkdWNlKChhLGIpPT5sYXN0VXNlZFRpbWUoYSk8bGFzdFVzZWRUaW1lKGIpP2E6Yik7dGhpcy5fcmVjb3JkaW5ncy5zcGxpY2UodGhpcy5fcmVjb3JkaW5ncy5pbmRleE9mKGxydU1vZGVsKSwxKTtscnVNb2RlbC5kaXNwb3NlKCk7ZnVuY3Rpb24gbGFzdFVzZWRUaW1lKG1vZGVsKXtyZXR1cm4gVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fZGF0YUZvck1vZGVsKG1vZGVsKS5sYXN0VXNlZDt9fQpzZXRFbmFibGVkKGVuYWJsZWQpe3RoaXMuX2VuYWJsZWQ9ZW5hYmxlZDt0aGlzLl91cGRhdGVTdGF0ZSgpO30KYnV0dG9uKCl7cmV0dXJuIHRoaXMuX2J1dHRvbjt9CmNsZWFyKCl7dGhpcy5fcmVjb3JkaW5ncy5mb3JFYWNoKG1vZGVsPT5tb2RlbC5kaXNwb3NlKCkpO3RoaXMuX3JlY29yZGluZ3M9W107dGhpcy5fbGFzdEFjdGl2ZU1vZGVsPW51bGw7dGhpcy5fdXBkYXRlU3RhdGUoKTt0aGlzLl9idXR0b24uc2V0VGV4dChDb21tb24uVUlTdHJpbmcoJyhubyByZWNvcmRpbmdzKScpKTt0aGlzLl9uZXh0TnVtYmVyQnlEb21haW4uY2xlYXIoKTt9CmFzeW5jIHNob3dIaXN0b3J5RHJvcERvd24oKXtpZih0aGlzLl9yZWNvcmRpbmdzLmxlbmd0aDwyfHwhdGhpcy5fZW5hYmxlZCkKcmV0dXJuIG51bGw7Y29uc3QgbW9kZWw9YXdhaXQgVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5Ecm9wRG93bi5zaG93KHRoaXMuX3JlY29yZGluZ3MsKHRoaXMuX2xhc3RBY3RpdmVNb2RlbCksdGhpcy5fYnV0dG9uLmVsZW1lbnQpO2lmKCFtb2RlbCkKcmV0dXJuIG51bGw7Y29uc3QgaW5kZXg9dGhpcy5fcmVjb3JkaW5ncy5pbmRleE9mKG1vZGVsKTtpZihpbmRleDwwKXtjb25zb2xlLmFzc2VydChmYWxzZSxgc2VsZWN0ZWQgcmVjb3JkaW5nIG5vdCBmb3VuZGApO3JldHVybiBudWxsO30KdGhpcy5fc2V0Q3VycmVudE1vZGVsKG1vZGVsKTtyZXR1cm4gbW9kZWw7fQpjYW5jZWxJZlNob3dpbmcoKXtUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLkRyb3BEb3duLmNhbmNlbElmU2hvd2luZygpO30KbmF2aWdhdGUoZGlyZWN0aW9uKXtpZighdGhpcy5fZW5hYmxlZHx8IXRoaXMuX2xhc3RBY3RpdmVNb2RlbCkKcmV0dXJuIG51bGw7Y29uc3QgaW5kZXg9dGhpcy5fcmVjb3JkaW5ncy5pbmRleE9mKHRoaXMuX2xhc3RBY3RpdmVNb2RlbCk7aWYoaW5kZXg8MCkKcmV0dXJuIG51bGw7Y29uc3QgbmV3SW5kZXg9TnVtYmVyLmNvbnN0cmFpbihpbmRleCtkaXJlY3Rpb24sMCx0aGlzLl9yZWNvcmRpbmdzLmxlbmd0aC0xKTtjb25zdCBtb2RlbD10aGlzLl9yZWNvcmRpbmdzW25ld0luZGV4XTt0aGlzLl9zZXRDdXJyZW50TW9kZWwobW9kZWwpO3JldHVybiBtb2RlbDt9Cl9zZXRDdXJyZW50TW9kZWwobW9kZWwpe1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX2RhdGFGb3JNb2RlbChtb2RlbCkubGFzdFVzZWQ9RGF0ZS5ub3coKTt0aGlzLl9sYXN0QWN0aXZlTW9kZWw9bW9kZWw7dGhpcy5fYnV0dG9uLnNldFRleHQodGhpcy5fdGl0bGUobW9kZWwpKTt9Cl91cGRhdGVTdGF0ZSgpe3RoaXMuX2FjdGlvbi5zZXRFbmFibGVkKHRoaXMuX3JlY29yZGluZ3MubGVuZ3RoPjEmJnRoaXMuX2VuYWJsZWQpO30Kc3RhdGljIF9wcmV2aWV3RWxlbWVudChwZXJmb3JtYW5jZU1vZGVsKXtjb25zdCBkYXRhPVRpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX2RhdGFGb3JNb2RlbChwZXJmb3JtYW5jZU1vZGVsKTtjb25zdCBzdGFydGVkQXQ9cGVyZm9ybWFuY2VNb2RlbC5yZWNvcmRTdGFydFRpbWUoKTtkYXRhLnRpbWUudGV4dENvbnRlbnQ9c3RhcnRlZEF0P0NvbW1vbi5VSVN0cmluZygnKCVzIGFnbyknLFRpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX2NvYXJzZUFnZShzdGFydGVkQXQpKTonJztyZXR1cm4gZGF0YS5wcmV2aWV3O30Kc3RhdGljIF9jb2Fyc2VBZ2UodGltZSl7Y29uc3Qgc2Vjb25kcz1NYXRoLnJvdW5kKChEYXRlLm5vdygpLXRpbWUpLzEwMDApO2lmKHNlY29uZHM8NTApCnJldHVybiBDb21tb24uVUlTdHJpbmcoJ21vbWVudHMnKTtjb25zdCBtaW51dGVzPU1hdGgucm91bmQoc2Vjb25kcy82MCk7aWYobWludXRlczw1MCkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJXMgbScsbWludXRlcyk7Y29uc3QgaG91cnM9TWF0aC5yb3VuZChtaW51dGVzLzYwKTtyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCclcyBoJyxob3Vycyk7fQpfdGl0bGUocGVyZm9ybWFuY2VNb2RlbCl7cmV0dXJuIFRpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX2RhdGFGb3JNb2RlbChwZXJmb3JtYW5jZU1vZGVsKS50aXRsZTt9Cl9idWlsZFByZXZpZXcocGVyZm9ybWFuY2VNb2RlbCl7Y29uc3QgcGFyc2VkVVJMPXBlcmZvcm1hbmNlTW9kZWwudGltZWxpbmVNb2RlbCgpLnBhZ2VVUkwoKS5hc1BhcnNlZFVSTCgpO2NvbnN0IGRvbWFpbj1wYXJzZWRVUkw/cGFyc2VkVVJMLmhvc3Q6Jyc7Y29uc3Qgc2VxdWVuY2VOdW1iZXI9dGhpcy5fbmV4dE51bWJlckJ5RG9tYWluLmdldChkb21haW4pfHwxO2NvbnN0IHRpdGxlPUNvbW1vbi5VSVN0cmluZygnJXMgIyVkJyxkb21haW4sc2VxdWVuY2VOdW1iZXIpO3RoaXMuX25leHROdW1iZXJCeURvbWFpbi5zZXQoZG9tYWluLHNlcXVlbmNlTnVtYmVyKzEpO2NvbnN0IHRpbWVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBwcmV2aWV3PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3ByZXZpZXctaXRlbSB2Ym94Jyk7Y29uc3QgZGF0YT17cHJldmlldzpwcmV2aWV3LHRpdGxlOnRpdGxlLHRpbWU6dGltZUVsZW1lbnQsbGFzdFVzZWQ6RGF0ZS5ub3coKX07cGVyZm9ybWFuY2VNb2RlbFtUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLl9wcmV2aWV3RGF0YVN5bWJvbF09ZGF0YTtwcmV2aWV3LmFwcGVuZENoaWxkKHRoaXMuX2J1aWxkVGV4dERldGFpbHMocGVyZm9ybWFuY2VNb2RlbCx0aXRsZSx0aW1lRWxlbWVudCkpO2NvbnN0IHNjcmVlbnNob3RBbmRPdmVydmlldz1wcmV2aWV3LmNyZWF0ZUNoaWxkKCdkaXYnLCdoYm94Jyk7c2NyZWVuc2hvdEFuZE92ZXJ2aWV3LmFwcGVuZENoaWxkKHRoaXMuX2J1aWxkU2NyZWVuc2hvdFRodW1ibmFpbChwZXJmb3JtYW5jZU1vZGVsKSk7c2NyZWVuc2hvdEFuZE92ZXJ2aWV3LmFwcGVuZENoaWxkKHRoaXMuX2J1aWxkT3ZlcnZpZXcocGVyZm9ybWFuY2VNb2RlbCkpO3JldHVybiBkYXRhLnByZXZpZXc7fQpfYnVpbGRUZXh0RGV0YWlscyhwZXJmb3JtYW5jZU1vZGVsLHRpdGxlLHRpbWVFbGVtZW50KXtjb25zdCBjb250YWluZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndGV4dC1kZXRhaWxzIGhib3gnKTtjb250YWluZXIuY3JlYXRlQ2hpbGQoJ3NwYW4nLCduYW1lJykudGV4dENvbnRlbnQ9dGl0bGU7Y29uc3QgdHJhY2luZ01vZGVsPXBlcmZvcm1hbmNlTW9kZWwudHJhY2luZ01vZGVsKCk7Y29uc3QgZHVyYXRpb249TnVtYmVyLm1pbGxpc1RvU3RyaW5nKHRyYWNpbmdNb2RlbC5tYXhpbXVtUmVjb3JkVGltZSgpLXRyYWNpbmdNb2RlbC5taW5pbXVtUmVjb3JkVGltZSgpLGZhbHNlKTtjb25zdCB0aW1lQ29udGFpbmVyPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnc3BhbicsJ3RpbWUnKTt0aW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKGNyZWF0ZVRleHROb2RlKGR1cmF0aW9uKSk7dGltZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aW1lRWxlbWVudCk7cmV0dXJuIGNvbnRhaW5lcjt9Cl9idWlsZFNjcmVlbnNob3RUaHVtYm5haWwocGVyZm9ybWFuY2VNb2RlbCl7Y29uc3QgY29udGFpbmVyPWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3NjcmVlbnNob3QtdGh1bWInKTtjb25zdCB0aHVtYm5haWxBc3BlY3RSYXRpbz0zLzI7Y29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMuX3RvdGFsSGVpZ2h0KnRodW1ibmFpbEFzcGVjdFJhdGlvKydweCc7Y29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLl90b3RhbEhlaWdodCsncHgnO2NvbnN0IGZpbG1TdHJpcE1vZGVsPXBlcmZvcm1hbmNlTW9kZWwuZmlsbVN0cmlwTW9kZWwoKTtjb25zdCBsYXN0RnJhbWU9ZmlsbVN0cmlwTW9kZWwuZnJhbWVzKCkucGVla0xhc3QoKTtpZighbGFzdEZyYW1lKQpyZXR1cm4gY29udGFpbmVyO2xhc3RGcmFtZS5pbWFnZURhdGFQcm9taXNlKCkudGhlbihkYXRhPT5VSS5sb2FkSW1hZ2VGcm9tRGF0YShkYXRhKSkudGhlbihpbWFnZT0+aW1hZ2UmJmNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSkpO3JldHVybiBjb250YWluZXI7fQpfYnVpbGRPdmVydmlldyhwZXJmb3JtYW5jZU1vZGVsKXtjb25zdCBjb250YWluZXI9Y3JlYXRlRWxlbWVudCgnZGl2Jyk7Y29udGFpbmVyLnN0eWxlLndpZHRoPVRpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX3ByZXZpZXdXaWR0aCsncHgnO2NvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5fdG90YWxIZWlnaHQrJ3B4Jztjb25zdCBjYW52YXM9Y29udGFpbmVyLmNyZWF0ZUNoaWxkKCdjYW52YXMnKTtjYW52YXMud2lkdGg9d2luZG93LmRldmljZVBpeGVsUmF0aW8qVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fcHJldmlld1dpZHRoO2NhbnZhcy5oZWlnaHQ9d2luZG93LmRldmljZVBpeGVsUmF0aW8qdGhpcy5fdG90YWxIZWlnaHQ7Y29uc3QgY3R4PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2xldCB5T2Zmc2V0PTA7Zm9yKGNvbnN0IG92ZXJ2aWV3IG9mIHRoaXMuX2FsbE92ZXJ2aWV3cyl7Y29uc3QgdGltZWxpbmVPdmVydmlldz1uZXcgb3ZlcnZpZXcuY29uc3RydWN0b3IoKTt0aW1lbGluZU92ZXJ2aWV3LnNldENhbnZhc1NpemUoVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fcHJldmlld1dpZHRoLG92ZXJ2aWV3LmhlaWdodCk7dGltZWxpbmVPdmVydmlldy5zZXRNb2RlbChwZXJmb3JtYW5jZU1vZGVsKTt0aW1lbGluZU92ZXJ2aWV3LnVwZGF0ZSgpO2NvbnN0IHNvdXJjZUNvbnRleHQ9dGltZWxpbmVPdmVydmlldy5jb250ZXh0KCk7Y29uc3QgaW1hZ2VEYXRhPXNvdXJjZUNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCxzb3VyY2VDb250ZXh0LmNhbnZhcy53aWR0aCxzb3VyY2VDb250ZXh0LmNhbnZhcy5oZWlnaHQpO2N0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLDAseU9mZnNldCk7eU9mZnNldCs9b3ZlcnZpZXcuaGVpZ2h0KndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO30KcmV0dXJuIGNvbnRhaW5lcjt9CnN0YXRpYyBfZGF0YUZvck1vZGVsKG1vZGVsKXtyZXR1cm4gbW9kZWxbVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fcHJldmlld0RhdGFTeW1ib2xdfHxudWxsO319O1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuUHJldmlld0RhdGE7VGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fbWF4UmVjb3JkaW5ncz01O1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuX3ByZXZpZXdXaWR0aD00NTA7VGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5fcHJldmlld0RhdGFTeW1ib2w9U3ltYm9sKCdwcmV2aWV3RGF0YScpO1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuRHJvcERvd249Y2xhc3N7Y29uc3RydWN0b3IobW9kZWxzKXt0aGlzLl9nbGFzc1BhbmU9bmV3IFVJLkdsYXNzUGFuZSgpO3RoaXMuX2dsYXNzUGFuZS5zZXRTaXplQmVoYXZpb3IoVUkuR2xhc3NQYW5lLlNpemVCZWhhdmlvci5NZWFzdXJlQ29udGVudCk7dGhpcy5fZ2xhc3NQYW5lLnNldE91dHNpZGVDbGlja0NhbGxiYWNrKCgpPT50aGlzLl9jbG9zZShudWxsKSk7dGhpcy5fZ2xhc3NQYW5lLnNldFBvaW50ZXJFdmVudHNCZWhhdmlvcihVSS5HbGFzc1BhbmUuUG9pbnRlckV2ZW50c0JlaGF2aW9yLkJsb2NrZWRCeUdsYXNzUGFuZSk7dGhpcy5fZ2xhc3NQYW5lLnNldEFuY2hvckJlaGF2aW9yKFVJLkdsYXNzUGFuZS5BbmNob3JCZWhhdmlvci5QcmVmZXJCb3R0b20pO2NvbnN0IHNoYWRvd1Jvb3Q9VUkuY3JlYXRlU2hhZG93Um9vdFdpdGhDb3JlU3R5bGVzKHRoaXMuX2dsYXNzUGFuZS5jb250ZW50RWxlbWVudCwndGltZWxpbmUvdGltZWxpbmVIaXN0b3J5TWFuYWdlci5jc3MnKTtjb25zdCBjb250ZW50RWxlbWVudD1zaGFkb3dSb290LmNyZWF0ZUNoaWxkKCdkaXYnLCdkcm9wLWRvd24nKTtjb25zdCBsaXN0TW9kZWw9bmV3IFVJLkxpc3RNb2RlbCgpO3RoaXMuX2xpc3RDb250cm9sPW5ldyBVSS5MaXN0Q29udHJvbChsaXN0TW9kZWwsdGhpcyxVSS5MaXN0TW9kZS5Ob25WaWV3cG9ydCk7dGhpcy5fbGlzdENvbnRyb2wuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyksZmFsc2UpO2xpc3RNb2RlbC5yZXBsYWNlQWxsKG1vZGVscyk7Y29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbGlzdENvbnRyb2wuZWxlbWVudCk7Y29udGVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksZmFsc2UpO2NvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3NlbGVjdGlvbkRvbmU9bnVsbDt9CnN0YXRpYyBzaG93KG1vZGVscyxjdXJyZW50TW9kZWwsYW5jaG9yKXtpZihUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLkRyb3BEb3duLl9pbnN0YW5jZSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgobnVsbCkpO2NvbnN0IGluc3RhbmNlPW5ldyBUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLkRyb3BEb3duKG1vZGVscyk7cmV0dXJuIGluc3RhbmNlLl9zaG93KGFuY2hvcixjdXJyZW50TW9kZWwpO30Kc3RhdGljIGNhbmNlbElmU2hvd2luZygpe2lmKCFUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLkRyb3BEb3duLl9pbnN0YW5jZSkKcmV0dXJuO1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuRHJvcERvd24uX2luc3RhbmNlLl9jbG9zZShudWxsKTt9Cl9zaG93KGFuY2hvcixjdXJyZW50TW9kZWwpe1RpbWVsaW5lLlRpbWVsaW5lSGlzdG9yeU1hbmFnZXIuRHJvcERvd24uX2luc3RhbmNlPXRoaXM7dGhpcy5fZ2xhc3NQYW5lLnNldENvbnRlbnRBbmNob3JCb3goYW5jaG9yLmJveEluV2luZG93KCkpO3RoaXMuX2dsYXNzUGFuZS5zaG93KCh0aGlzLl9nbGFzc1BhbmUuY29udGVudEVsZW1lbnQub3duZXJEb2N1bWVudCkpO3RoaXMuX2xpc3RDb250cm9sLmVsZW1lbnQuZm9jdXMoKTt0aGlzLl9saXN0Q29udHJvbC5zZWxlY3RJdGVtKGN1cnJlbnRNb2RlbCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bGZpbGw9PnRoaXMuX3NlbGVjdGlvbkRvbmU9ZnVsZmlsbCk7fQpfb25Nb3VzZU1vdmUoZXZlbnQpe2NvbnN0IG5vZGU9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ3ByZXZpZXctaXRlbScpO2NvbnN0IGxpc3RJdGVtPW5vZGUmJnRoaXMuX2xpc3RDb250cm9sLml0ZW1Gb3JOb2RlKG5vZGUpO2lmKCFsaXN0SXRlbSkKcmV0dXJuO3RoaXMuX2xpc3RDb250cm9sLnNlbGVjdEl0ZW0obGlzdEl0ZW0pO30KX29uQ2xpY2soZXZlbnQpe2lmKCFldmVudC50YXJnZXQuZW5jbG9zaW5nTm9kZU9yU2VsZldpdGhDbGFzcygncHJldmlldy1pdGVtJykpCnJldHVybjt0aGlzLl9jbG9zZSh0aGlzLl9saXN0Q29udHJvbC5zZWxlY3RlZEl0ZW0oKSk7fQpfb25LZXlEb3duKGV2ZW50KXtzd2l0Y2goZXZlbnQua2V5KXtjYXNlJ0VzY2FwZSc6dGhpcy5fY2xvc2UobnVsbCk7YnJlYWs7Y2FzZSdFbnRlcic6dGhpcy5fY2xvc2UodGhpcy5fbGlzdENvbnRyb2wuc2VsZWN0ZWRJdGVtKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuO30KZXZlbnQuY29uc3VtZSh0cnVlKTt9Cl9jbG9zZShtb2RlbCl7dGhpcy5fc2VsZWN0aW9uRG9uZShtb2RlbCk7dGhpcy5fZ2xhc3NQYW5lLmhpZGUoKTtUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLkRyb3BEb3duLl9pbnN0YW5jZT1udWxsO30KY3JlYXRlRWxlbWVudEZvckl0ZW0oaXRlbSl7Y29uc3QgZWxlbWVudD1UaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLl9wcmV2aWV3RWxlbWVudChpdGVtKTtlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7cmV0dXJuIGVsZW1lbnQ7fQpoZWlnaHRGb3JJdGVtKGl0ZW0pe2NvbnNvbGUuYXNzZXJ0KGZhbHNlLCdTaG91bGQgbm90IGJlIGNhbGxlZCcpO3JldHVybiAwO30KaXNJdGVtU2VsZWN0YWJsZShpdGVtKXtyZXR1cm4gdHJ1ZTt9CnNlbGVjdGVkSXRlbUNoYW5nZWQoZnJvbSx0byxmcm9tRWxlbWVudCx0b0VsZW1lbnQpe2lmKGZyb21FbGVtZW50KQpmcm9tRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO2lmKHRvRWxlbWVudCkKdG9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7fX07VGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlci5Ecm9wRG93bi5faW5zdGFuY2U9bnVsbDtUaW1lbGluZS5UaW1lbGluZUhpc3RvcnlNYW5hZ2VyLlRvb2xiYXJCdXR0b249Y2xhc3MgZXh0ZW5kcyBVSS5Ub29sYmFySXRlbXtjb25zdHJ1Y3RvcihhY3Rpb24pe3N1cGVyKGNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2J1dHRvbicsJ2Ryb3Bkb3duLWJ1dHRvbicpKTtjb25zdCBzaGFkb3dSb290PVVJLmNyZWF0ZVNoYWRvd1Jvb3RXaXRoQ29yZVN0eWxlcyh0aGlzLmVsZW1lbnQsJ3RpbWVsaW5lL2hpc3RvcnlUb29sYmFyQnV0dG9uLmNzcycpO3RoaXMuX2NvbnRlbnRFbGVtZW50PXNoYWRvd1Jvb3QuY3JlYXRlQ2hpbGQoJ3NwYW4nLCdjb250ZW50Jyk7Y29uc3QgZHJvcGRvd25BcnJvd0ljb249VUkuSWNvbi5jcmVhdGUoJ3NtYWxsaWNvbi10cmlhbmdsZS1kb3duJyk7c2hhZG93Um9vdC5hcHBlbmRDaGlsZChkcm9wZG93bkFycm93SWNvbik7dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+dm9pZCBhY3Rpb24uZXhlY3V0ZSgpLGZhbHNlKTt0aGlzLnNldEVuYWJsZWQoYWN0aW9uLmVuYWJsZWQoKSk7YWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoVUkuQWN0aW9uLkV2ZW50cy5FbmFibGVkLGV2ZW50PT50aGlzLnNldEVuYWJsZWQoKGV2ZW50LmRhdGEpKSk7dGhpcy5zZXRUaXRsZShhY3Rpb24udGl0bGUoKSk7fQpzZXRUZXh0KHRleHQpe3RoaXMuX2NvbnRlbnRFbGVtZW50LnRleHRDb250ZW50PXRleHQ7fX07O1RpbWVsaW5lLlRpbWVsaW5lVHJlZVZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9tb2RlbD1udWxsO3RoaXMuX3RyYWNrPW51bGw7dGhpcy5fdHJlZT1udWxsO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS10cmVlLXZpZXcnKTt9CnN0YXRpYyBldmVudE5hbWVGb3JTb3J0aW5nKGV2ZW50KXtpZihldmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSlNGcmFtZSl7Y29uc3QgZGF0YT1ldmVudC5hcmdzWydkYXRhJ107cmV0dXJuIGRhdGFbJ2Z1bmN0aW9uTmFtZSddKydAJysoZGF0YVsnc2NyaXB0SWQnXXx8ZGF0YVsndXJsJ118fCcnKTt9CnJldHVybiBldmVudC5uYW1lKyc6QCcrVGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLmV2ZW50VVJMKGV2ZW50KTt9CnNldFNlYXJjaGFibGVWaWV3KHNlYXJjaGFibGVWaWV3KXt0aGlzLl9zZWFyY2hhYmxlVmlldz1zZWFyY2hhYmxlVmlldzt9CnNldE1vZGVsKG1vZGVsLHRyYWNrKXt0aGlzLl9tb2RlbD1tb2RlbDt0aGlzLl90cmFjaz10cmFjazt0aGlzLnJlZnJlc2hUcmVlKCk7fQptb2RlbCgpe3JldHVybiB0aGlzLl9tb2RlbDt9CmluaXQoKXt0aGlzLl9saW5raWZpZXI9bmV3IENvbXBvbmVudHMuTGlua2lmaWVyKCk7dGhpcy5fdGV4dEZpbHRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVGaWx0ZXJzLlJlZ0V4cCgpO3RoaXMuX2N1cnJlbnRUaHJlYWRTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZVRyZWVDdXJyZW50VGhyZWFkJywwKTt0aGlzLl9jdXJyZW50VGhyZWFkU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlZnJlc2hUcmVlLHRoaXMpO2NvbnN0IGNvbHVtbnM9KFtdKTt0aGlzLnBvcHVsYXRlQ29sdW1ucyhjb2x1bW5zKTt0aGlzLl9zcGxpdFdpZGdldD1uZXcgVUkuU3BsaXRXaWRnZXQodHJ1ZSx0cnVlLCd0aW1lbGluZVRyZWVWaWV3RGV0YWlsc1NwbGl0V2lkZ2V0Jyk7Y29uc3QgbWFpblZpZXc9bmV3IFVJLlZCb3goKTtjb25zdCB0b29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLG1haW5WaWV3LmVsZW1lbnQpO3RoaXMucG9wdWxhdGVUb29sYmFyKHRvb2xiYXIpO3RoaXMuX2RhdGFHcmlkPW5ldyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkKGNvbHVtbnMpO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNvcnRpbmdDaGFuZ2VkLHRoaXMuX3NvcnRpbmdDaGFuZ2VkLHRoaXMpO3RoaXMuX2RhdGFHcmlkLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLHRydWUpO3RoaXMuX2RhdGFHcmlkLnNldFJlc2l6ZU1ldGhvZChEYXRhR3JpZC5EYXRhR3JpZC5SZXNpemVNZXRob2QuTGFzdCk7dGhpcy5fZGF0YUdyaWQuc2V0Um93Q29udGV4dE1lbnVDYWxsYmFjayh0aGlzLl9vbkNvbnRleHRNZW51LmJpbmQodGhpcykpO3RoaXMuX2RhdGFHcmlkLmFzV2lkZ2V0KCkuc2hvdyhtYWluVmlldy5lbGVtZW50KTt0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVyKERhdGFHcmlkLkRhdGFHcmlkLkV2ZW50cy5TZWxlY3RlZE5vZGUsdGhpcy5fdXBkYXRlRGV0YWlsc0ZvclNlbGVjdGlvbix0aGlzKTt0aGlzLl9kZXRhaWxzVmlldz1uZXcgVUkuVkJveCgpO3RoaXMuX2RldGFpbHNWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtZGV0YWlscy12aWV3JywndGltZWxpbmUtZGV0YWlscy12aWV3LWJvZHknKTt0aGlzLl9zcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KG1haW5WaWV3KTt0aGlzLl9zcGxpdFdpZGdldC5zZXRTaWRlYmFyV2lkZ2V0KHRoaXMuX2RldGFpbHNWaWV3KTt0aGlzLl9zcGxpdFdpZGdldC5oaWRlU2lkZWJhcigpO3RoaXMuX3NwbGl0V2lkZ2V0LnNob3codGhpcy5lbGVtZW50KTt0aGlzLl9zcGxpdFdpZGdldC5hZGRFdmVudExpc3RlbmVyKFVJLlNwbGl0V2lkZ2V0LkV2ZW50cy5TaG93TW9kZUNoYW5nZWQsdGhpcy5fb25TaG93TW9kZUNoYW5nZWQsdGhpcyk7dGhpcy5fbGFzdFNlbGVjdGVkTm9kZTt9Cmxhc3RTZWxlY3RlZE5vZGUoKXtyZXR1cm4gdGhpcy5fbGFzdFNlbGVjdGVkTm9kZTt9CnVwZGF0ZUNvbnRlbnRzKHNlbGVjdGlvbil7dGhpcy5zZXRSYW5nZShzZWxlY3Rpb24uc3RhcnRUaW1lKCksc2VsZWN0aW9uLmVuZFRpbWUoKSk7fQpzZXRSYW5nZShzdGFydFRpbWUsZW5kVGltZSl7dGhpcy5fc3RhcnRUaW1lPXN0YXJ0VGltZTt0aGlzLl9lbmRUaW1lPWVuZFRpbWU7dGhpcy5yZWZyZXNoVHJlZSgpO30KZmlsdGVycygpe3JldHVyblt0aGlzLl90ZXh0RmlsdGVyLC4uLnRoaXMuX21vZGVsLmZpbHRlcnMoKV07fQpfZXhwb3NlUGVyY2VudGFnZXMoKXtyZXR1cm4gZmFsc2U7fQpwb3B1bGF0ZVRvb2xiYXIodG9vbGJhcil7dGhpcy5fdGV4dEZpbHRlclVJPW5ldyBVSS5Ub29sYmFySW5wdXQoQ29tbW9uLlVJU3RyaW5nKCdGaWx0ZXInKSk7dGhpcy5fdGV4dEZpbHRlclVJLmFkZEV2ZW50TGlzdGVuZXIoVUkuVG9vbGJhcklucHV0LkV2ZW50LlRleHRDaGFuZ2VkLHRleHRGaWx0ZXJDaGFuZ2VkLHRoaXMpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fdGV4dEZpbHRlclVJKTtmdW5jdGlvbiB0ZXh0RmlsdGVyQ2hhbmdlZCgpe2NvbnN0IHNlYXJjaFF1ZXJ5PXRoaXMuX3RleHRGaWx0ZXJVSS52YWx1ZSgpO3RoaXMuX3RleHRGaWx0ZXIuc2V0UmVnRXhwKHNlYXJjaFF1ZXJ5P2NyZWF0ZVBsYWluVGV4dFNlYXJjaFJlZ2V4KHNlYXJjaFF1ZXJ5LCdpJyk6bnVsbCk7dGhpcy5yZWZyZXNoVHJlZSgpO319Cl9tb2RlbEV2ZW50cygpe3JldHVybiB0aGlzLl90cmFjaz90aGlzLl90cmFjay5zeW5jRXZlbnRzKCk6W107fQpfb25Ib3Zlcihub2RlKXt9Cl9hcHBlbmRDb250ZXh0TWVudUl0ZW1zKGNvbnRleHRNZW51LG5vZGUpe30KX2xpbmtpZnlMb2NhdGlvbihldmVudCl7Y29uc3QgdGFyZ2V0PXRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKS50YXJnZXRCeUV2ZW50KGV2ZW50KTtpZighdGFyZ2V0KQpyZXR1cm4gbnVsbDtjb25zdCBmcmFtZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuZXZlbnRTdGFja0ZyYW1lKGV2ZW50KTtpZighZnJhbWUpCnJldHVybiBudWxsO3JldHVybiB0aGlzLl9saW5raWZpZXIubWF5YmVMaW5raWZ5Q29uc29sZUNhbGxGcmFtZSh0YXJnZXQsZnJhbWUpO30Kc2VsZWN0UHJvZmlsZU5vZGUodHJlZU5vZGUsc3VwcHJlc3NTZWxlY3RlZEV2ZW50KXtjb25zdCBwYXRoVG9Sb290PVtdO2ZvcihsZXQgbm9kZT10cmVlTm9kZTtub2RlO25vZGU9bm9kZS5wYXJlbnQpCnBhdGhUb1Jvb3QucHVzaChub2RlKTtmb3IobGV0IGk9cGF0aFRvUm9vdC5sZW5ndGgtMTtpPjA7LS1pKXtjb25zdCBncmlkTm9kZT10aGlzLmRhdGFHcmlkTm9kZUZvclRyZWVOb2RlKHBhdGhUb1Jvb3RbaV0pO2lmKGdyaWROb2RlJiZncmlkTm9kZS5kYXRhR3JpZCkKZ3JpZE5vZGUuZXhwYW5kKCk7fQpjb25zdCBncmlkTm9kZT10aGlzLmRhdGFHcmlkTm9kZUZvclRyZWVOb2RlKHRyZWVOb2RlKTtpZihncmlkTm9kZS5kYXRhR3JpZCl7Z3JpZE5vZGUucmV2ZWFsKCk7Z3JpZE5vZGUuc2VsZWN0KHN1cHByZXNzU2VsZWN0ZWRFdmVudCk7fX0KcmVmcmVzaFRyZWUoKXt0aGlzLl9saW5raWZpZXIucmVzZXQoKTt0aGlzLl9kYXRhR3JpZC5yb290Tm9kZSgpLnJlbW92ZUNoaWxkcmVuKCk7aWYoIXRoaXMuX21vZGVsKXt0aGlzLl91cGRhdGVEZXRhaWxzRm9yU2VsZWN0aW9uKCk7cmV0dXJuO30KdGhpcy5fcm9vdD10aGlzLl9idWlsZFRyZWUoKTtjb25zdCBjaGlsZHJlbj10aGlzLl9yb290LmNoaWxkcmVuKCk7bGV0IG1heFNlbGZUaW1lPTA7bGV0IG1heFRvdGFsVGltZT0wO2NvbnN0IHRvdGFsVXNlZFRpbWU9dGhpcy5fcm9vdC50b3RhbFRpbWUtdGhpcy5fcm9vdC5zZWxmVGltZTtmb3IoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4udmFsdWVzKCkpe21heFNlbGZUaW1lPU1hdGgubWF4KG1heFNlbGZUaW1lLGNoaWxkLnNlbGZUaW1lKTttYXhUb3RhbFRpbWU9TWF0aC5tYXgobWF4VG90YWxUaW1lLGNoaWxkLnRvdGFsVGltZSk7fQpmb3IoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4udmFsdWVzKCkpe2NvbnN0IGdyaWROb2RlPW5ldyBUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LlRyZWVHcmlkTm9kZShjaGlsZCx0b3RhbFVzZWRUaW1lLG1heFNlbGZUaW1lLG1heFRvdGFsVGltZSx0aGlzKTt0aGlzLl9kYXRhR3JpZC5pbnNlcnRDaGlsZChncmlkTm9kZSk7fQp0aGlzLl9zb3J0aW5nQ2hhbmdlZCgpO3RoaXMuX3VwZGF0ZURldGFpbHNGb3JTZWxlY3Rpb24oKTtpZih0aGlzLl9zZWFyY2hhYmxlVmlldykKdGhpcy5fc2VhcmNoYWJsZVZpZXcucmVmcmVzaFNlYXJjaCgpO30KX2J1aWxkVHJlZSgpe3Rocm93IG5ldyBFcnJvcignTm90IEltcGxlbWVudGVkJyk7fQpidWlsZFRvcERvd25UcmVlKGRvTm90QWdncmVnYXRlLGdyb3VwSWRDYWxsYmFjayl7cmV0dXJuIG5ldyBUaW1lbGluZU1vZGVsLlRpbWVsaW5lUHJvZmlsZVRyZWUuVG9wRG93blJvb3ROb2RlKHRoaXMuX21vZGVsRXZlbnRzKCksdGhpcy5maWx0ZXJzKCksdGhpcy5fc3RhcnRUaW1lLHRoaXMuX2VuZFRpbWUsZG9Ob3RBZ2dyZWdhdGUsZ3JvdXBJZENhbGxiYWNrKTt9CnBvcHVsYXRlQ29sdW1ucyhjb2x1bW5zKXtjb2x1bW5zLnB1c2goe2lkOidzZWxmJyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ1NlbGYgVGltZScpLHdpZHRoOicxMjBweCcsZml4ZWRXaWR0aDp0cnVlLHNvcnRhYmxlOnRydWV9KTtjb2x1bW5zLnB1c2goe2lkOid0b3RhbCcsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUb3RhbCBUaW1lJyksd2lkdGg6JzEyMHB4JyxmaXhlZFdpZHRoOnRydWUsc29ydGFibGU6dHJ1ZX0pO2NvbHVtbnMucHVzaCh7aWQ6J2FjdGl2aXR5Jyx0aXRsZTpDb21tb24uVUlTdHJpbmcoJ0FjdGl2aXR5JyksZGlzY2xvc3VyZTp0cnVlLHNvcnRhYmxlOnRydWV9KTt9Cl9zb3J0aW5nQ2hhbmdlZCgpe2NvbnN0IGNvbHVtbklkPXRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZCgpO2lmKCFjb2x1bW5JZCkKcmV0dXJuO2xldCBzb3J0RnVuY3Rpb247c3dpdGNoKGNvbHVtbklkKXtjYXNlJ3N0YXJ0VGltZSc6c29ydEZ1bmN0aW9uPWNvbXBhcmVTdGFydFRpbWU7YnJlYWs7Y2FzZSdzZWxmJzpzb3J0RnVuY3Rpb249Y29tcGFyZU51bWVyaWNGaWVsZC5iaW5kKG51bGwsJ3NlbGZUaW1lJyk7YnJlYWs7Y2FzZSd0b3RhbCc6c29ydEZ1bmN0aW9uPWNvbXBhcmVOdW1lcmljRmllbGQuYmluZChudWxsLCd0b3RhbFRpbWUnKTticmVhaztjYXNlJ2FjdGl2aXR5Jzpzb3J0RnVuY3Rpb249Y29tcGFyZU5hbWU7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmFzc2VydChmYWxzZSwnVW5rbm93biBzb3J0IGZpZWxkOiAnK2NvbHVtbklkKTtyZXR1cm47fQp0aGlzLl9kYXRhR3JpZC5zb3J0Tm9kZXMoc29ydEZ1bmN0aW9uLCF0aGlzLl9kYXRhR3JpZC5pc1NvcnRPcmRlckFzY2VuZGluZygpKTtmdW5jdGlvbiBjb21wYXJlTnVtZXJpY0ZpZWxkKGZpZWxkLGEsYil7Y29uc3Qgbm9kZUE9KGEpO2NvbnN0IG5vZGVCPShiKTtyZXR1cm4gbm9kZUEuX3Byb2ZpbGVOb2RlW2ZpZWxkXS1ub2RlQi5fcHJvZmlsZU5vZGVbZmllbGRdO30KZnVuY3Rpb24gY29tcGFyZVN0YXJ0VGltZShhLGIpe2NvbnN0IG5vZGVBPShhKTtjb25zdCBub2RlQj0oYik7cmV0dXJuIG5vZGVBLl9wcm9maWxlTm9kZS5ldmVudC5zdGFydFRpbWUtbm9kZUIuX3Byb2ZpbGVOb2RlLmV2ZW50LnN0YXJ0VGltZTt9CmZ1bmN0aW9uIGNvbXBhcmVOYW1lKGEsYil7Y29uc3Qgbm9kZUE9KGEpO2NvbnN0IG5vZGVCPShiKTtjb25zdCBuYW1lQT1UaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LmV2ZW50TmFtZUZvclNvcnRpbmcobm9kZUEuX3Byb2ZpbGVOb2RlLmV2ZW50KTtjb25zdCBuYW1lQj1UaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LmV2ZW50TmFtZUZvclNvcnRpbmcobm9kZUIuX3Byb2ZpbGVOb2RlLmV2ZW50KTtyZXR1cm4gbmFtZUEubG9jYWxlQ29tcGFyZShuYW1lQik7fX0KX29uU2hvd01vZGVDaGFuZ2VkKCl7aWYodGhpcy5fc3BsaXRXaWRnZXQuc2hvd01vZGUoKT09PVVJLlNwbGl0V2lkZ2V0LlNob3dNb2RlLk9ubHlNYWluKQpyZXR1cm47dGhpcy5fbGFzdFNlbGVjdGVkTm9kZT11bmRlZmluZWQ7dGhpcy5fdXBkYXRlRGV0YWlsc0ZvclNlbGVjdGlvbigpO30KX3VwZGF0ZURldGFpbHNGb3JTZWxlY3Rpb24oKXtjb25zdCBzZWxlY3RlZE5vZGU9dGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlPyh0aGlzLl9kYXRhR3JpZC5zZWxlY3RlZE5vZGUpLl9wcm9maWxlTm9kZTpudWxsO2lmKHNlbGVjdGVkTm9kZT09PXRoaXMuX2xhc3RTZWxlY3RlZE5vZGUpCnJldHVybjt0aGlzLl9sYXN0U2VsZWN0ZWROb2RlPXNlbGVjdGVkTm9kZTtpZih0aGlzLl9zcGxpdFdpZGdldC5zaG93TW9kZSgpPT09VUkuU3BsaXRXaWRnZXQuU2hvd01vZGUuT25seU1haW4pCnJldHVybjt0aGlzLl9kZXRhaWxzVmlldy5kZXRhY2hDaGlsZFdpZGdldHMoKTt0aGlzLl9kZXRhaWxzVmlldy5lbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7aWYoc2VsZWN0ZWROb2RlJiZ0aGlzLl9zaG93RGV0YWlsc0Zvck5vZGUoc2VsZWN0ZWROb2RlKSkKcmV0dXJuO2NvbnN0IGJhbm5lcj10aGlzLl9kZXRhaWxzVmlldy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdmdWxsLXdpZGdldC1kaW1tZWQtYmFubmVyJyk7YmFubmVyLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1NlbGVjdCBpdGVtIGZvciBkZXRhaWxzLicpKTt9Cl9zaG93RGV0YWlsc0Zvck5vZGUobm9kZSl7cmV0dXJuIGZhbHNlO30KX29uTW91c2VNb3ZlKGV2ZW50KXtjb25zdCBncmlkTm9kZT1ldmVudC50YXJnZXQmJihldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlKT8odGhpcy5fZGF0YUdyaWQuZGF0YUdyaWROb2RlRnJvbU5vZGUoKGV2ZW50LnRhcmdldCkpKTpudWxsO2NvbnN0IHByb2ZpbGVOb2RlPWdyaWROb2RlJiZncmlkTm9kZS5fcHJvZmlsZU5vZGU7aWYocHJvZmlsZU5vZGU9PT10aGlzLl9sYXN0SG92ZXJlZFByb2ZpbGVOb2RlKQpyZXR1cm47dGhpcy5fbGFzdEhvdmVyZWRQcm9maWxlTm9kZT1wcm9maWxlTm9kZTt0aGlzLl9vbkhvdmVyKHByb2ZpbGVOb2RlKTt9Cl9vbkNvbnRleHRNZW51KGNvbnRleHRNZW51LGdyaWROb2RlKXtjb25zdCBwcm9maWxlTm9kZT1ncmlkTm9kZS5fcHJvZmlsZU5vZGU7aWYoIXByb2ZpbGVOb2RlKQpyZXR1cm47dGhpcy5fYXBwZW5kQ29udGV4dE1lbnVJdGVtcyhjb250ZXh0TWVudSxwcm9maWxlTm9kZSk7fQpkYXRhR3JpZE5vZGVGb3JUcmVlTm9kZSh0cmVlTm9kZSl7cmV0dXJuIHRyZWVOb2RlW1RpbWVsaW5lLlRpbWVsaW5lVHJlZVZpZXcuVHJlZUdyaWROb2RlLl9ncmlkTm9kZVN5bWJvbF18fG51bGw7fQpzZWFyY2hDYW5jZWxlZCgpe3RoaXMuX3NlYXJjaFJlc3VsdHM9W107dGhpcy5fY3VycmVudFJlc3VsdD0wO30KcGVyZm9ybVNlYXJjaChzZWFyY2hDb25maWcsc2hvdWxkSnVtcCxqdW1wQmFja3dhcmRzKXt0aGlzLl9zZWFyY2hSZXN1bHRzPVtdO3RoaXMuX2N1cnJlbnRSZXN1bHQ9MDtpZighdGhpcy5fcm9vdCkKcmV0dXJuO2NvbnN0IHNlYXJjaFJlZ2V4PXNlYXJjaENvbmZpZy50b1NlYXJjaFJlZ2V4KCk7dGhpcy5fc2VhcmNoUmVzdWx0cz10aGlzLl9yb290LnNlYXJjaFRyZWUoZXZlbnQ9PlRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy50ZXN0Q29udGVudE1hdGNoaW5nKGV2ZW50LHNlYXJjaFJlZ2V4KSk7dGhpcy5fc2VhcmNoYWJsZVZpZXcudXBkYXRlU2VhcmNoTWF0Y2hlc0NvdW50KHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKTt9Cmp1bXBUb05leHRTZWFyY2hSZXN1bHQoKXtpZighdGhpcy5fc2VhcmNoUmVzdWx0cy5sZW5ndGgpCnJldHVybjt0aGlzLnNlbGVjdFByb2ZpbGVOb2RlKHRoaXMuX3NlYXJjaFJlc3VsdHNbdGhpcy5fY3VycmVudFJlc3VsdF0sZmFsc2UpO3RoaXMuX2N1cnJlbnRSZXN1bHQ9bW9kKHRoaXMuX2N1cnJlbnRSZXN1bHQrMSx0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCk7fQpqdW1wVG9QcmV2aW91c1NlYXJjaFJlc3VsdCgpe2lmKCF0aGlzLl9zZWFyY2hSZXN1bHRzLmxlbmd0aCkKcmV0dXJuO3RoaXMuc2VsZWN0UHJvZmlsZU5vZGUodGhpcy5fc2VhcmNoUmVzdWx0c1t0aGlzLl9jdXJyZW50UmVzdWx0XSxmYWxzZSk7dGhpcy5fY3VycmVudFJlc3VsdD1tb2QodGhpcy5fY3VycmVudFJlc3VsdC0xLHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoKTt9CnN1cHBvcnRzQ2FzZVNlbnNpdGl2ZVNlYXJjaCgpe3JldHVybiB0cnVlO30Kc3VwcG9ydHNSZWdleFNlYXJjaCgpe3JldHVybiB0cnVlO319O1RpbWVsaW5lLlRpbWVsaW5lVHJlZVZpZXcuR3JpZE5vZGU9Y2xhc3MgZXh0ZW5kcyBEYXRhR3JpZC5Tb3J0YWJsZURhdGFHcmlkTm9kZXtjb25zdHJ1Y3Rvcihwcm9maWxlTm9kZSxncmFuZFRvdGFsVGltZSxtYXhTZWxmVGltZSxtYXhUb3RhbFRpbWUsdHJlZVZpZXcpe3N1cGVyKG51bGwsZmFsc2UpO3RoaXMuX3BvcHVsYXRlZD1mYWxzZTt0aGlzLl9wcm9maWxlTm9kZT1wcm9maWxlTm9kZTt0aGlzLl90cmVlVmlldz10cmVlVmlldzt0aGlzLl9ncmFuZFRvdGFsVGltZT1ncmFuZFRvdGFsVGltZTt0aGlzLl9tYXhTZWxmVGltZT1tYXhTZWxmVGltZTt0aGlzLl9tYXhUb3RhbFRpbWU9bWF4VG90YWxUaW1lO30KY3JlYXRlQ2VsbChjb2x1bW5JZCl7aWYoY29sdW1uSWQ9PT0nYWN0aXZpdHknKQpyZXR1cm4gdGhpcy5fY3JlYXRlTmFtZUNlbGwoY29sdW1uSWQpO3JldHVybiB0aGlzLl9jcmVhdGVWYWx1ZUNlbGwoY29sdW1uSWQpfHxzdXBlci5jcmVhdGVDZWxsKGNvbHVtbklkKTt9Cl9jcmVhdGVOYW1lQ2VsbChjb2x1bW5JZCl7Y29uc3QgY2VsbD10aGlzLmNyZWF0ZVREKGNvbHVtbklkKTtjb25zdCBjb250YWluZXI9Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnbmFtZS1jb250YWluZXInKTtjb25zdCBpY29uQ29udGFpbmVyPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYWN0aXZpdHktaWNvbi1jb250YWluZXInKTtjb25zdCBpY29uPWljb25Db250YWluZXIuY3JlYXRlQ2hpbGQoJ2RpdicsJ2FjdGl2aXR5LWljb24nKTtjb25zdCBuYW1lPWNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYWN0aXZpdHktbmFtZScpO2NvbnN0IGV2ZW50PXRoaXMuX3Byb2ZpbGVOb2RlLmV2ZW50O2lmKHRoaXMuX3Byb2ZpbGVOb2RlLmlzR3JvdXBOb2RlKCkpe2NvbnN0IHRyZWVWaWV3PSh0aGlzLl90cmVlVmlldyk7Y29uc3QgaW5mbz10cmVlVmlldy5fZGlzcGxheUluZm9Gb3JHcm91cE5vZGUodGhpcy5fcHJvZmlsZU5vZGUpO25hbWUudGV4dENvbnRlbnQ9aW5mby5uYW1lO2ljb24uc3R5bGUuYmFja2dyb3VuZENvbG9yPWluZm8uY29sb3I7aWYoaW5mby5pY29uKQppY29uQ29udGFpbmVyLmluc2VydEJlZm9yZShpbmZvLmljb24saWNvbik7fWVsc2UgaWYoZXZlbnQpe2NvbnN0IGRhdGE9ZXZlbnQuYXJnc1snZGF0YSddO2NvbnN0IGRlb3B0UmVhc29uPWRhdGEmJmRhdGFbJ2Rlb3B0UmVhc29uJ107aWYoZGVvcHRSZWFzb24pCmNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYWN0aXZpdHktd2FybmluZycpLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnTm90IG9wdGltaXplZDogJXMnLGRlb3B0UmVhc29uKTtuYW1lLnRleHRDb250ZW50PVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFRpdGxlKGV2ZW50KTtjb25zdCBsaW5rPXRoaXMuX3RyZWVWaWV3Ll9saW5raWZ5TG9jYXRpb24oZXZlbnQpO2lmKGxpbmspCmNvbnRhaW5lci5jcmVhdGVDaGlsZCgnZGl2JywnYWN0aXZpdHktbGluaycpLmFwcGVuZENoaWxkKGxpbmspO2ljb24uc3R5bGUuYmFja2dyb3VuZENvbG9yPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudENvbG9yKGV2ZW50KTt9CnJldHVybiBjZWxsO30KX2NyZWF0ZVZhbHVlQ2VsbChjb2x1bW5JZCl7aWYoY29sdW1uSWQhPT0nc2VsZicmJmNvbHVtbklkIT09J3RvdGFsJyYmY29sdW1uSWQhPT0nc3RhcnRUaW1lJykKcmV0dXJuIG51bGw7bGV0IHNob3dQZXJjZW50cz1mYWxzZTtsZXQgdmFsdWU7bGV0IG1heFRpbWU7c3dpdGNoKGNvbHVtbklkKXtjYXNlJ3N0YXJ0VGltZSc6dmFsdWU9dGhpcy5fcHJvZmlsZU5vZGUuZXZlbnQuc3RhcnRUaW1lLXRoaXMuX3RyZWVWaWV3Ll9tb2RlbC50aW1lbGluZU1vZGVsKCkubWluaW11bVJlY29yZFRpbWUoKTticmVhaztjYXNlJ3NlbGYnOnZhbHVlPXRoaXMuX3Byb2ZpbGVOb2RlLnNlbGZUaW1lO21heFRpbWU9dGhpcy5fbWF4U2VsZlRpbWU7c2hvd1BlcmNlbnRzPXRydWU7YnJlYWs7Y2FzZSd0b3RhbCc6dmFsdWU9dGhpcy5fcHJvZmlsZU5vZGUudG90YWxUaW1lO21heFRpbWU9dGhpcy5fbWF4VG90YWxUaW1lO3Nob3dQZXJjZW50cz10cnVlO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGw7fQpjb25zdCBjZWxsPXRoaXMuY3JlYXRlVEQoY29sdW1uSWQpO2NlbGwuY2xhc3NOYW1lPSdudW1lcmljLWNvbHVtbic7Y29uc3QgdGV4dERpdj1jZWxsLmNyZWF0ZUNoaWxkKCdkaXYnKTt0ZXh0RGl2LmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclLjFmXHhhMG1zJyx2YWx1ZSk7aWYoc2hvd1BlcmNlbnRzJiZ0aGlzLl90cmVlVmlldy5fZXhwb3NlUGVyY2VudGFnZXMoKSl7dGV4dERpdi5jcmVhdGVDaGlsZCgnc3BhbicsJ3BlcmNlbnQtY29sdW1uJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCclLjFmXHhhMCUlJyx2YWx1ZS90aGlzLl9ncmFuZFRvdGFsVGltZSoxMDApO30KaWYobWF4VGltZSl7dGV4dERpdi5jbGFzc0xpc3QuYWRkKCdiYWNrZ3JvdW5kLXBlcmNlbnQtYmFyJyk7Y2VsbC5jcmVhdGVDaGlsZCgnZGl2JywnYmFja2dyb3VuZC1iYXItY29udGFpbmVyJykuY3JlYXRlQ2hpbGQoJ2RpdicsJ2JhY2tncm91bmQtYmFyJykuc3R5bGUud2lkdGg9KHZhbHVlKjEwMC9tYXhUaW1lKS50b0ZpeGVkKDEpKyclJzt9CnJldHVybiBjZWxsO319O1RpbWVsaW5lLlRpbWVsaW5lVHJlZVZpZXcuVHJlZUdyaWROb2RlPWNsYXNzIGV4dGVuZHMgVGltZWxpbmUuVGltZWxpbmVUcmVlVmlldy5HcmlkTm9kZXtjb25zdHJ1Y3Rvcihwcm9maWxlTm9kZSxncmFuZFRvdGFsVGltZSxtYXhTZWxmVGltZSxtYXhUb3RhbFRpbWUsdHJlZVZpZXcpe3N1cGVyKHByb2ZpbGVOb2RlLGdyYW5kVG90YWxUaW1lLG1heFNlbGZUaW1lLG1heFRvdGFsVGltZSx0cmVlVmlldyk7dGhpcy5zZXRIYXNDaGlsZHJlbih0aGlzLl9wcm9maWxlTm9kZS5oYXNDaGlsZHJlbigpKTtwcm9maWxlTm9kZVtUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LlRyZWVHcmlkTm9kZS5fZ3JpZE5vZGVTeW1ib2xdPXRoaXM7fQpwb3B1bGF0ZSgpe2lmKHRoaXMuX3BvcHVsYXRlZCkKcmV0dXJuO3RoaXMuX3BvcHVsYXRlZD10cnVlO2lmKCF0aGlzLl9wcm9maWxlTm9kZS5jaGlsZHJlbikKcmV0dXJuO2Zvcihjb25zdCBub2RlIG9mIHRoaXMuX3Byb2ZpbGVOb2RlLmNoaWxkcmVuKCkudmFsdWVzKCkpe2NvbnN0IGdyaWROb2RlPW5ldyBUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LlRyZWVHcmlkTm9kZShub2RlLHRoaXMuX2dyYW5kVG90YWxUaW1lLHRoaXMuX21heFNlbGZUaW1lLHRoaXMuX21heFRvdGFsVGltZSx0aGlzLl90cmVlVmlldyk7dGhpcy5pbnNlcnRDaGlsZE9yZGVyZWQoZ3JpZE5vZGUpO319fTtUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LlRyZWVHcmlkTm9kZS5fZ3JpZE5vZGVTeW1ib2w9U3ltYm9sKCd0cmVlR3JpZE5vZGUnKTtUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldz1jbGFzcyBleHRlbmRzIFRpbWVsaW5lLlRpbWVsaW5lVHJlZVZpZXd7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2dyb3VwQnlTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZVRyZWVHcm91cEJ5JyxUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5Lk5vbmUpO3RoaXMuX2dyb3VwQnlTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMucmVmcmVzaFRyZWUuYmluZCh0aGlzKSk7dGhpcy5pbml0KCk7dGhpcy5fc3RhY2tWaWV3PW5ldyBUaW1lbGluZS5UaW1lbGluZVN0YWNrVmlldyh0aGlzKTt0aGlzLl9zdGFja1ZpZXcuYWRkRXZlbnRMaXN0ZW5lcihUaW1lbGluZS5UaW1lbGluZVN0YWNrVmlldy5FdmVudHMuU2VsZWN0aW9uQ2hhbmdlZCx0aGlzLl9vblN0YWNrVmlld1NlbGVjdGlvbkNoYW5nZWQsdGhpcyk7dGhpcy5fYmFkZ2VQb29sPW5ldyBQcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sKHRydWUpO3RoaXMuX3Byb2R1Y3RCeVVSTENhY2hlPW5ldyBNYXAoKTt0aGlzLl9jb2xvckJ5VVJMQ2FjaGU9bmV3IE1hcCgpO1Byb2R1Y3RSZWdpc3RyeS5pbnN0YW5jZSgpLnRoZW4ocmVnaXN0cnk9Pnt0aGlzLl9wcm9kdWN0UmVnaXN0cnk9cmVnaXN0cnk7dGhpcy5yZWZyZXNoVHJlZSgpO30pO30Kc2V0TW9kZWwobW9kZWwsdHJhY2spe3RoaXMuX2JhZGdlUG9vbC5yZXNldCgpO3N1cGVyLnNldE1vZGVsKG1vZGVsLHRyYWNrKTt9CnVwZGF0ZUNvbnRlbnRzKHNlbGVjdGlvbil7dGhpcy5fdXBkYXRlRXh0ZW5zaW9uUmVzb2x2ZXIoKTtzdXBlci51cGRhdGVDb250ZW50cyhzZWxlY3Rpb24pO2NvbnN0IHJvb3ROb2RlPXRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCk7aWYocm9vdE5vZGUuY2hpbGRyZW4ubGVuZ3RoKQpyb290Tm9kZS5jaGlsZHJlblswXS5yZXZlYWxBbmRTZWxlY3QoKTt9Cl91cGRhdGVFeHRlbnNpb25SZXNvbHZlcigpe3RoaXMuX2V4ZWN1dGlvbkNvbnRleHROYW1lc0J5T3JpZ2luPW5ldyBNYXAoKTtmb3IoY29uc3QgcnVudGltZU1vZGVsIG9mIFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuUnVudGltZU1vZGVsKSl7Zm9yKGNvbnN0IGNvbnRleHQgb2YgcnVudGltZU1vZGVsLmV4ZWN1dGlvbkNvbnRleHRzKCkpCnRoaXMuX2V4ZWN1dGlvbkNvbnRleHROYW1lc0J5T3JpZ2luLnNldChjb250ZXh0Lm9yaWdpbixjb250ZXh0Lm5hbWUpO319Cl9iZWF1dGlmeURvbWFpbk5hbWUobmFtZSl7aWYoVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuX2lzRXh0ZW5zaW9uSW50ZXJuYWxVUkwobmFtZSkpCm5hbWU9Q29tbW9uLlVJU3RyaW5nKCdbQ2hyb21lIGV4dGVuc2lvbnMgb3ZlcmhlYWRdJyk7ZWxzZSBpZihUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5faXNWOE5hdGl2ZVVSTChuYW1lKSkKbmFtZT1Db21tb24uVUlTdHJpbmcoJ1tWOCBSdW50aW1lXScpO2Vsc2UgaWYobmFtZS5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uJykpCm5hbWU9dGhpcy5fZXhlY3V0aW9uQ29udGV4dE5hbWVzQnlPcmlnaW4uZ2V0KG5hbWUpfHxuYW1lO3JldHVybiBuYW1lO30KX2Rpc3BsYXlJbmZvRm9yR3JvdXBOb2RlKG5vZGUpe2NvbnN0IGNhdGVnb3JpZXM9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNhdGVnb3JpZXMoKTtsZXQgY29sb3I9bm9kZS5pZD9UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRDb2xvcigobm9kZS5ldmVudCkpOmNhdGVnb3JpZXNbJ290aGVyJ10uY29sb3I7Y29uc3QgdW5hdHRyaWJ1dGVkPUNvbW1vbi5VSVN0cmluZygnW3VuYXR0cmlidXRlZF0nKTtzd2l0Y2godGhpcy5fZ3JvdXBCeVNldHRpbmcuZ2V0KCkpe2Nhc2UgVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuR3JvdXBCeS5DYXRlZ29yeTp7Y29uc3QgY2F0ZWdvcnk9Y2F0ZWdvcmllc1tub2RlLmlkXXx8Y2F0ZWdvcmllc1snb3RoZXInXTtyZXR1cm57bmFtZTpjYXRlZ29yeS50aXRsZSxjb2xvcjpjYXRlZ29yeS5jb2xvcn07fQpjYXNlIFRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Lkdyb3VwQnkuRG9tYWluOmNhc2UgVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuR3JvdXBCeS5TdWJkb21haW46e2xldCBkb21haW5OYW1lPXRoaXMuX2JlYXV0aWZ5RG9tYWluTmFtZShub2RlLmlkKTtpZihkb21haW5OYW1lKXtjb25zdCBwcm9kdWN0TmFtZT10aGlzLl9wcm9kdWN0QnlFdmVudCgobm9kZS5ldmVudCkpO2lmKHByb2R1Y3ROYW1lKQpkb21haW5OYW1lKz0nIFx1MjAxNCAnK3Byb2R1Y3ROYW1lO30KcmV0dXJue25hbWU6ZG9tYWluTmFtZXx8dW5hdHRyaWJ1dGVkLGNvbG9yOmNvbG9yfTt9CmNhc2UgVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuR3JvdXBCeS5FdmVudE5hbWU6e2NvbnN0IG5hbWU9bm9kZS5ldmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuSlNGcmFtZT9Db21tb24uVUlTdHJpbmcoJ0phdmFTY3JpcHQnKTpUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRUaXRsZShub2RlLmV2ZW50KTtyZXR1cm57bmFtZTpuYW1lLGNvbG9yOm5vZGUuZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkpTRnJhbWU/VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUobm9kZS5ldmVudCkuY2F0ZWdvcnkuY29sb3I6Y29sb3J9O30KY2FzZSBUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5LlByb2R1Y3Q6e2NvbnN0IGV2ZW50PShub2RlLmV2ZW50KTtjb25zdCBpbmZvPXRoaXMuX3Byb2R1Y3RBbmRCYWRnZUJ5RXZlbnQoZXZlbnQpO2NvbnN0IG5hbWU9aW5mbyYmaW5mby5uYW1lfHx1bmF0dHJpYnV0ZWQ7Y29sb3I9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50Q29sb3JCeVByb2R1Y3QodGhpcy5fcHJvZHVjdFJlZ2lzdHJ5LHRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKSx0aGlzLl9jb2xvckJ5VVJMQ2FjaGUsZXZlbnQpO3JldHVybntuYW1lOm5hbWUsY29sb3I6Y29sb3IsaWNvbjppbmZvJiZpbmZvLmJhZGdlfHx1bmRlZmluZWR9O30KY2FzZSBUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5LlVSTDpicmVhaztjYXNlIFRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Lkdyb3VwQnkuRnJhbWU6e2NvbnN0IGZyYW1lPXRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKS5wYWdlRnJhbWVCeUlkKG5vZGUuaWQpO2NvbnN0IGZyYW1lTmFtZT1mcmFtZT9UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZGlzcGxheU5hbWVGb3JGcmFtZShmcmFtZSw4MCk6Q29tbW9uLlVJU3RyaW5nKCdQYWdlJyk7cmV0dXJue25hbWU6ZnJhbWVOYW1lLGNvbG9yOmNvbG9yfTt9CmRlZmF1bHQ6Y29uc29sZS5hc3NlcnQoZmFsc2UsJ1VuZXhwZWN0ZWQgZ3JvdXBpbmcgdHlwZScpO30KcmV0dXJue25hbWU6bm9kZS5pZHx8dW5hdHRyaWJ1dGVkLGNvbG9yOmNvbG9yfTt9CnBvcHVsYXRlVG9vbGJhcih0b29sYmFyKXtzdXBlci5wb3B1bGF0ZVRvb2xiYXIodG9vbGJhcik7Y29uc3QgZ3JvdXBCeT1UaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5O2NvbnN0IG9wdGlvbnM9W3tsYWJlbDpDb21tb24uVUlTdHJpbmcoJ05vIEdyb3VwaW5nJyksdmFsdWU6Z3JvdXBCeS5Ob25lfSx7bGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdHcm91cCBieSBBY3Rpdml0eScpLHZhbHVlOmdyb3VwQnkuRXZlbnROYW1lfSx7bGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdHcm91cCBieSBDYXRlZ29yeScpLHZhbHVlOmdyb3VwQnkuQ2F0ZWdvcnl9LHtsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0dyb3VwIGJ5IERvbWFpbicpLHZhbHVlOmdyb3VwQnkuRG9tYWlufSx7bGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdHcm91cCBieSBGcmFtZScpLHZhbHVlOmdyb3VwQnkuRnJhbWV9LHtsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0dyb3VwIGJ5IFByb2R1Y3QnKSx2YWx1ZTpncm91cEJ5LlByb2R1Y3R9LHtsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0dyb3VwIGJ5IFN1YmRvbWFpbicpLHZhbHVlOmdyb3VwQnkuU3ViZG9tYWlufSx7bGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdHcm91cCBieSBVUkwnKSx2YWx1ZTpncm91cEJ5LlVSTH0sXTt0b29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKG5ldyBVSS5Ub29sYmFyU2V0dGluZ0NvbWJvQm94KG9wdGlvbnMsdGhpcy5fZ3JvdXBCeVNldHRpbmcpKTt0b29sYmFyLmFwcGVuZFNwYWNlcigpO3Rvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fc3BsaXRXaWRnZXQuY3JlYXRlU2hvd0hpZGVTaWRlYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnaGVhdmllc3Qgc3RhY2snKSkpO30KX2J1aWxkSGVhdmllc3RTdGFjayh0cmVlTm9kZSl7Y29uc29sZS5hc3NlcnQoISF0cmVlTm9kZS5wYXJlbnQsJ0F0dGVtcHQgdG8gYnVpbGQgc3RhY2sgZm9yIHRyZWUgcm9vdCcpO2xldCByZXN1bHQ9W107Zm9yKGxldCBub2RlPXRyZWVOb2RlO25vZGUmJm5vZGUucGFyZW50O25vZGU9bm9kZS5wYXJlbnQpCnJlc3VsdC5wdXNoKG5vZGUpO3Jlc3VsdD1yZXN1bHQucmV2ZXJzZSgpO2ZvcihsZXQgbm9kZT10cmVlTm9kZTtub2RlJiZub2RlLmNoaWxkcmVuKCkmJm5vZGUuY2hpbGRyZW4oKS5zaXplOyl7Y29uc3QgY2hpbGRyZW49QXJyYXkuZnJvbShub2RlLmNoaWxkcmVuKCkudmFsdWVzKCkpO25vZGU9Y2hpbGRyZW4ucmVkdWNlKChhLGIpPT5hLnRvdGFsVGltZT5iLnRvdGFsVGltZT9hOmIpO3Jlc3VsdC5wdXNoKG5vZGUpO30KcmV0dXJuIHJlc3VsdDt9Cl9leHBvc2VQZXJjZW50YWdlcygpe3JldHVybiB0cnVlO30KX29uU3RhY2tWaWV3U2VsZWN0aW9uQ2hhbmdlZCgpe2NvbnN0IHRyZWVOb2RlPXRoaXMuX3N0YWNrVmlldy5zZWxlY3RlZFRyZWVOb2RlKCk7aWYodHJlZU5vZGUpCnRoaXMuc2VsZWN0UHJvZmlsZU5vZGUodHJlZU5vZGUsdHJ1ZSk7fQpfc2hvd0RldGFpbHNGb3JOb2RlKG5vZGUpe2NvbnN0IHN0YWNrPXRoaXMuX2J1aWxkSGVhdmllc3RTdGFjayhub2RlKTt0aGlzLl9zdGFja1ZpZXcuc2V0U3RhY2soc3RhY2ssbm9kZSk7dGhpcy5fc3RhY2tWaWV3LnNob3codGhpcy5fZGV0YWlsc1ZpZXcuZWxlbWVudCk7cmV0dXJuIHRydWU7fQpfZ3JvdXBpbmdGdW5jdGlvbihncm91cEJ5KXtjb25zdCBHcm91cEJ5PVRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Lkdyb3VwQnk7c3dpdGNoKGdyb3VwQnkpe2Nhc2UgR3JvdXBCeS5Ob25lOnJldHVybiBudWxsO2Nhc2UgR3JvdXBCeS5FdmVudE5hbWU6cmV0dXJuIGV2ZW50PT5UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRTdHlsZShldmVudCkudGl0bGU7Y2FzZSBHcm91cEJ5LkNhdGVnb3J5OnJldHVybiBldmVudD0+VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUoZXZlbnQpLmNhdGVnb3J5Lm5hbWU7Y2FzZSBHcm91cEJ5LlN1YmRvbWFpbjpyZXR1cm4gdGhpcy5fZG9tYWluQnlFdmVudC5iaW5kKHRoaXMsZmFsc2UpO2Nhc2UgR3JvdXBCeS5Eb21haW46cmV0dXJuIHRoaXMuX2RvbWFpbkJ5RXZlbnQuYmluZCh0aGlzLHRydWUpO2Nhc2UgR3JvdXBCeS5Qcm9kdWN0OnJldHVybiBldmVudD0+dGhpcy5fcHJvZHVjdEJ5RXZlbnQoZXZlbnQpfHx0aGlzLl9kb21haW5CeUV2ZW50KHRydWUsZXZlbnQpfHwnJztjYXNlIEdyb3VwQnkuVVJMOnJldHVybiBldmVudD0+VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLmV2ZW50VVJMKGV2ZW50KXx8Jyc7Y2FzZSBHcm91cEJ5LkZyYW1lOnJldHVybiBldmVudD0+VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLmZyYW1lSWQ7ZGVmYXVsdDpjb25zb2xlLmFzc2VydChmYWxzZSxgVW5leHBlY3RlZCBhZ2dyZWdhdGlvbiBzZXR0aW5nOiAke2dyb3VwQnl9YCk7cmV0dXJuIG51bGw7fX0KX2RvbWFpbkJ5RXZlbnQoZ3JvdXBTdWJkb21haW5zLGV2ZW50KXtjb25zdCB1cmw9VGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLmV2ZW50VVJMKGV2ZW50KTtpZighdXJsKQpyZXR1cm4nJztpZihUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5faXNFeHRlbnNpb25JbnRlcm5hbFVSTCh1cmwpKQpyZXR1cm4gVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuX2V4dGVuc2lvbkludGVybmFsUHJlZml4O2lmKFRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Ll9pc1Y4TmF0aXZlVVJMKHVybCkpCnJldHVybiBUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5fdjhOYXRpdmVQcmVmaXg7Y29uc3QgcGFyc2VkVVJMPXVybC5hc1BhcnNlZFVSTCgpO2lmKCFwYXJzZWRVUkwpCnJldHVybicnO2lmKHBhcnNlZFVSTC5zY2hlbWU9PT0nY2hyb21lLWV4dGVuc2lvbicpCnJldHVybiBwYXJzZWRVUkwuc2NoZW1lKyc6Ly8nK3BhcnNlZFVSTC5ob3N0O2lmKCFncm91cFN1YmRvbWFpbnMpCnJldHVybiBwYXJzZWRVUkwuaG9zdDtpZigvXlsuMC05XSskLy50ZXN0KHBhcnNlZFVSTC5ob3N0KSkKcmV0dXJuIHBhcnNlZFVSTC5ob3N0O2NvbnN0IGRvbWFpbk1hdGNoPS8oW14uXSpcLik/W14uXSokLy5leGVjKHBhcnNlZFVSTC5ob3N0KTtyZXR1cm4gZG9tYWluTWF0Y2gmJmRvbWFpbk1hdGNoWzBdfHwnJzt9Cl9wcm9kdWN0QnlFdmVudChldmVudCl7Y29uc3QgdXJsPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5ldmVudFVSTChldmVudCk7aWYoIXVybCkKcmV0dXJuJyc7aWYodGhpcy5fcHJvZHVjdEJ5VVJMQ2FjaGUuaGFzKHVybCkpCnJldHVybiB0aGlzLl9wcm9kdWN0QnlVUkxDYWNoZS5nZXQodXJsKTtpZighdGhpcy5fcHJvZHVjdFJlZ2lzdHJ5KQpyZXR1cm4nJztjb25zdCBwYXJzZWRVUkw9dXJsLmFzUGFyc2VkVVJMKCk7Y29uc3QgbmFtZT1wYXJzZWRVUkwmJnRoaXMuX3Byb2R1Y3RSZWdpc3RyeS5uYW1lRm9yVXJsKHBhcnNlZFVSTCl8fCcnO3RoaXMuX3Byb2R1Y3RCeVVSTENhY2hlLnNldCh1cmwsbmFtZSk7cmV0dXJuIG5hbWU7fQpfcHJvZHVjdEFuZEJhZGdlQnlFdmVudChldmVudCl7Y29uc3QgdXJsPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVQcm9maWxlVHJlZS5ldmVudFVSTChldmVudCk7aWYoIXVybHx8IXRoaXMuX3Byb2R1Y3RSZWdpc3RyeSkKcmV0dXJuIG51bGw7Y29uc3QgcGFyc2VkVVJMPXVybC5hc1BhcnNlZFVSTCgpO2NvbnN0IG5hbWU9cGFyc2VkVVJMJiZ0aGlzLl9wcm9kdWN0UmVnaXN0cnkubmFtZUZvclVybChwYXJzZWRVUkwpfHx0aGlzLl9kb21haW5CeUV2ZW50KHRydWUsZXZlbnQpO2lmKCFuYW1lKQpyZXR1cm4gbnVsbDtjb25zdCBpY29uPXBhcnNlZFVSTCYmdGhpcy5fYmFkZ2VQb29sLmJhZGdlRm9yVVJMKHBhcnNlZFVSTCk7cmV0dXJue25hbWU6dGhpcy5fYmVhdXRpZnlEb21haW5OYW1lKG5hbWUpLGJhZGdlOmljb259O30KX2FwcGVuZENvbnRleHRNZW51SXRlbXMoY29udGV4dE1lbnUsbm9kZSl7aWYodGhpcy5fZ3JvdXBCeVNldHRpbmcuZ2V0KCkhPT1UaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5LkZyYW1lKQpyZXR1cm47aWYoIW5vZGUuaXNHcm91cE5vZGUoKSkKcmV0dXJuO2NvbnN0IGZyYW1lPXRoaXMuX21vZGVsLnRpbWVsaW5lTW9kZWwoKS5wYWdlRnJhbWVCeUlkKG5vZGUuaWQpO2lmKCFmcmFtZXx8IWZyYW1lLm93bmVyTm9kZSkKcmV0dXJuO2NvbnRleHRNZW51LmFwcGVuZEFwcGxpY2FibGVJdGVtcyhmcmFtZS5vd25lck5vZGUpO30Kc3RhdGljIF9pc0V4dGVuc2lvbkludGVybmFsVVJMKHVybCl7cmV0dXJuIHVybC5zdGFydHNXaXRoKFRpbWVsaW5lLkFnZ3JlZ2F0ZWRUaW1lbGluZVRyZWVWaWV3Ll9leHRlbnNpb25JbnRlcm5hbFByZWZpeCk7fQpzdGF0aWMgX2lzVjhOYXRpdmVVUkwodXJsKXtyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoVGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuX3Y4TmF0aXZlUHJlZml4KTt9fTtUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5fZXh0ZW5zaW9uSW50ZXJuYWxQcmVmaXg9J2V4dGVuc2lvbnM6Oic7VGltZWxpbmUuQWdncmVnYXRlZFRpbWVsaW5lVHJlZVZpZXcuX3Y4TmF0aXZlUHJlZml4PSduYXRpdmUgJztUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlldy5Hcm91cEJ5PXtOb25lOidOb25lJyxFdmVudE5hbWU6J0V2ZW50TmFtZScsQ2F0ZWdvcnk6J0NhdGVnb3J5JyxEb21haW46J0RvbWFpbicsU3ViZG9tYWluOidTdWJkb21haW4nLFByb2R1Y3Q6J1Byb2R1Y3QnLFVSTDonVVJMJyxGcmFtZTonRnJhbWUnfTtUaW1lbGluZS5DYWxsVHJlZVRpbWVsaW5lVHJlZVZpZXc9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZGF0YUdyaWQubWFya0NvbHVtbkFzU29ydGVkQnkoJ3RvdGFsJyxEYXRhR3JpZC5EYXRhR3JpZC5PcmRlci5EZXNjZW5kaW5nKTt9Cl9idWlsZFRyZWUoKXtjb25zdCBncm91cGluZz10aGlzLl9ncm91cEJ5U2V0dGluZy5nZXQoKTtyZXR1cm4gdGhpcy5idWlsZFRvcERvd25UcmVlKGZhbHNlLHRoaXMuX2dyb3VwaW5nRnVuY3Rpb24oZ3JvdXBpbmcpKTt9fTtUaW1lbGluZS5Cb3R0b21VcFRpbWVsaW5lVHJlZVZpZXc9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5BZ2dyZWdhdGVkVGltZWxpbmVUcmVlVmlld3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZGF0YUdyaWQubWFya0NvbHVtbkFzU29ydGVkQnkoJ3NlbGYnLERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkRlc2NlbmRpbmcpO30KX2J1aWxkVHJlZSgpe3JldHVybiBuZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZVByb2ZpbGVUcmVlLkJvdHRvbVVwUm9vdE5vZGUodGhpcy5fbW9kZWxFdmVudHMoKSx0aGlzLmZpbHRlcnMoKSx0aGlzLl9zdGFydFRpbWUsdGhpcy5fZW5kVGltZSx0aGlzLl9ncm91cGluZ0Z1bmN0aW9uKHRoaXMuX2dyb3VwQnlTZXR0aW5nLmdldCgpKSk7fX07VGltZWxpbmUuVGltZWxpbmVTdGFja1ZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5WQm94e2NvbnN0cnVjdG9yKHRyZWVWaWV3KXtzdXBlcigpO2NvbnN0IGhlYWRlcj10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLXN0YWNrLXZpZXctaGVhZGVyJyk7aGVhZGVyLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnSGVhdmllc3Qgc3RhY2snKTt0aGlzLl90cmVlVmlldz10cmVlVmlldztjb25zdCBjb2x1bW5zPShbe2lkOid0b3RhbCcsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdUb3RhbCBUaW1lJyksZml4ZWRXaWR0aDp0cnVlLHdpZHRoOicxMTBweCd9LHtpZDonYWN0aXZpdHknLHRpdGxlOkNvbW1vbi5VSVN0cmluZygnQWN0aXZpdHknKX1dKTt0aGlzLl9kYXRhR3JpZD1uZXcgRGF0YUdyaWQuVmlld3BvcnREYXRhR3JpZChjb2x1bW5zKTt0aGlzLl9kYXRhR3JpZC5zZXRSZXNpemVNZXRob2QoRGF0YUdyaWQuRGF0YUdyaWQuUmVzaXplTWV0aG9kLkxhc3QpO3RoaXMuX2RhdGFHcmlkLmFkZEV2ZW50TGlzdGVuZXIoRGF0YUdyaWQuRGF0YUdyaWQuRXZlbnRzLlNlbGVjdGVkTm9kZSx0aGlzLl9vblNlbGVjdGlvbkNoYW5nZWQsdGhpcyk7dGhpcy5fZGF0YUdyaWQuYXNXaWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7fQpzZXRTdGFjayhzdGFjayxzZWxlY3RlZE5vZGUpe2NvbnN0IHJvb3ROb2RlPXRoaXMuX2RhdGFHcmlkLnJvb3ROb2RlKCk7cm9vdE5vZGUucmVtb3ZlQ2hpbGRyZW4oKTtsZXQgbm9kZVRvUmV2ZWFsPW51bGw7Y29uc3QgdG90YWxUaW1lPU1hdGgubWF4LmFwcGx5KE1hdGgsc3RhY2subWFwKG5vZGU9Pm5vZGUudG90YWxUaW1lKSk7Zm9yKGNvbnN0IG5vZGUgb2Ygc3RhY2spe2NvbnN0IGdyaWROb2RlPW5ldyBUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3LkdyaWROb2RlKG5vZGUsdG90YWxUaW1lLHRvdGFsVGltZSx0b3RhbFRpbWUsdGhpcy5fdHJlZVZpZXcpO3Jvb3ROb2RlLmFwcGVuZENoaWxkKGdyaWROb2RlKTtpZihub2RlPT09c2VsZWN0ZWROb2RlKQpub2RlVG9SZXZlYWw9Z3JpZE5vZGU7fQpub2RlVG9SZXZlYWwucmV2ZWFsQW5kU2VsZWN0KCk7fQpzZWxlY3RlZFRyZWVOb2RlKCl7Y29uc3Qgc2VsZWN0ZWROb2RlPXRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTtyZXR1cm4gc2VsZWN0ZWROb2RlJiYoc2VsZWN0ZWROb2RlKS5fcHJvZmlsZU5vZGU7fQpfb25TZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVGltZWxpbmUuVGltZWxpbmVTdGFja1ZpZXcuRXZlbnRzLlNlbGVjdGlvbkNoYW5nZWQpO319O1RpbWVsaW5lLlRpbWVsaW5lU3RhY2tWaWV3LkV2ZW50cz17U2VsZWN0aW9uQ2hhbmdlZDpTeW1ib2woJ1NlbGVjdGlvbkNoYW5nZWQnKX07O1RpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXc9Y2xhc3MgZXh0ZW5kcyBUaW1lbGluZS5UaW1lbGluZVRyZWVWaWV3e2NvbnN0cnVjdG9yKGRlbGVnYXRlKXtzdXBlcigpO3RoaXMuX2ZpbHRlcnNDb250cm9sPW5ldyBUaW1lbGluZS5FdmVudHNUaW1lbGluZVRyZWVWaWV3LkZpbHRlcnMoKTt0aGlzLl9maWx0ZXJzQ29udHJvbC5hZGRFdmVudExpc3RlbmVyKFRpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXcuRmlsdGVycy5FdmVudHMuRmlsdGVyQ2hhbmdlZCx0aGlzLl9vbkZpbHRlckNoYW5nZWQsdGhpcyk7dGhpcy5pbml0KCk7dGhpcy5fZGVsZWdhdGU9ZGVsZWdhdGU7dGhpcy5fYmFkZ2VQb29sPW5ldyBQcm9kdWN0UmVnaXN0cnkuQmFkZ2VQb29sKHRydWUpO3RoaXMuX2RhdGFHcmlkLm1hcmtDb2x1bW5Bc1NvcnRlZEJ5KCdzdGFydFRpbWUnLERhdGFHcmlkLkRhdGFHcmlkLk9yZGVyLkFzY2VuZGluZyk7dGhpcy5fc3BsaXRXaWRnZXQuc2hvd0JvdGgoKTt9CmZpbHRlcnMoKXtyZXR1cm5bLi4uc3VwZXIuZmlsdGVycygpLC4uLnRoaXMuX2ZpbHRlcnNDb250cm9sLmZpbHRlcnMoKV07fQp1cGRhdGVDb250ZW50cyhzZWxlY3Rpb24pe3RoaXMuX2JhZGdlUG9vbC5yZXNldCgpO3N1cGVyLnVwZGF0ZUNvbnRlbnRzKHNlbGVjdGlvbik7aWYoc2VsZWN0aW9uLnR5cGUoKT09PVRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLlR5cGUuVHJhY2VFdmVudCl7Y29uc3QgZXZlbnQ9KHNlbGVjdGlvbi5vYmplY3QoKSk7dGhpcy5fc2VsZWN0RXZlbnQoZXZlbnQsdHJ1ZSk7fX0KX2J1aWxkVHJlZSgpe3RoaXMuX2N1cnJlbnRUcmVlPXRoaXMuYnVpbGRUb3BEb3duVHJlZSh0cnVlLG51bGwpO3JldHVybiB0aGlzLl9jdXJyZW50VHJlZTt9Cl9vbkZpbHRlckNoYW5nZWQoKXtjb25zdCBzZWxlY3RlZEV2ZW50PXRoaXMubGFzdFNlbGVjdGVkTm9kZSgpJiZ0aGlzLmxhc3RTZWxlY3RlZE5vZGUoKS5ldmVudDt0aGlzLnJlZnJlc2hUcmVlKCk7aWYoc2VsZWN0ZWRFdmVudCkKdGhpcy5fc2VsZWN0RXZlbnQoc2VsZWN0ZWRFdmVudCxmYWxzZSk7fQpfZmluZE5vZGVXaXRoRXZlbnQoZXZlbnQpe2NvbnN0IGl0ZXJhdG9ycz1bdGhpcy5fY3VycmVudFRyZWUuY2hpbGRyZW4oKS52YWx1ZXMoKV07d2hpbGUoaXRlcmF0b3JzLmxlbmd0aCl7Y29uc3QgaXRlcmF0b3I9aXRlcmF0b3JzLnBlZWtMYXN0KCkubmV4dCgpO2lmKGl0ZXJhdG9yLmRvbmUpe2l0ZXJhdG9ycy5wb3AoKTtjb250aW51ZTt9CmNvbnN0IGNoaWxkPShpdGVyYXRvci52YWx1ZSk7aWYoY2hpbGQuZXZlbnQ9PT1ldmVudCkKcmV0dXJuIGNoaWxkO2l0ZXJhdG9ycy5wdXNoKGNoaWxkLmNoaWxkcmVuKCkudmFsdWVzKCkpO30KcmV0dXJuIG51bGw7fQpfc2VsZWN0RXZlbnQoZXZlbnQsZXhwYW5kKXtjb25zdCBub2RlPXRoaXMuX2ZpbmROb2RlV2l0aEV2ZW50KGV2ZW50KTtpZighbm9kZSkKcmV0dXJuO3RoaXMuc2VsZWN0UHJvZmlsZU5vZGUobm9kZSxmYWxzZSk7aWYoZXhwYW5kKQp0aGlzLmRhdGFHcmlkTm9kZUZvclRyZWVOb2RlKG5vZGUpLmV4cGFuZCgpO30KcG9wdWxhdGVDb2x1bW5zKGNvbHVtbnMpe2NvbHVtbnMucHVzaCh7aWQ6J3N0YXJ0VGltZScsdGl0bGU6Q29tbW9uLlVJU3RyaW5nKCdTdGFydCBUaW1lJyksd2lkdGg6JzgwcHgnLGZpeGVkV2lkdGg6dHJ1ZSxzb3J0YWJsZTp0cnVlfSk7c3VwZXIucG9wdWxhdGVDb2x1bW5zKGNvbHVtbnMpO2NvbHVtbnMuZmlsdGVyKGM9PmMuZml4ZWRXaWR0aCkuZm9yRWFjaChjPT5jLndpZHRoPSc4MHB4Jyk7fQpwb3B1bGF0ZVRvb2xiYXIodG9vbGJhcil7c3VwZXIucG9wdWxhdGVUb29sYmFyKHRvb2xiYXIpO3RoaXMuX2ZpbHRlcnNDb250cm9sLnBvcHVsYXRlVG9vbGJhcih0b29sYmFyKTt9Cl9zaG93RGV0YWlsc0Zvck5vZGUobm9kZSl7Y29uc3QgdHJhY2VFdmVudD1ub2RlLmV2ZW50O2lmKCF0cmFjZUV2ZW50KQpyZXR1cm4gZmFsc2U7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmJ1aWxkVHJhY2VFdmVudERldGFpbHModHJhY2VFdmVudCx0aGlzLm1vZGVsKCkudGltZWxpbmVNb2RlbCgpLHRoaXMuX2xpbmtpZmllcix0aGlzLl9iYWRnZVBvb2wsZmFsc2UpLnRoZW4oZnJhZ21lbnQ9PnRoaXMuX2RldGFpbHNWaWV3LmVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpKTtyZXR1cm4gdHJ1ZTt9Cl9vbkhvdmVyKG5vZGUpe3RoaXMuX2RlbGVnYXRlLmhpZ2hsaWdodEV2ZW50KG5vZGUmJm5vZGUuZXZlbnQpO319O1RpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXcuRmlsdGVycz1jbGFzcyBleHRlbmRzIENvbW1vbi5PYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2NhdGVnb3J5RmlsdGVyPW5ldyBUaW1lbGluZS5UaW1lbGluZUZpbHRlcnMuQ2F0ZWdvcnkoKTt0aGlzLl9kdXJhdGlvbkZpbHRlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVGaWx0ZXJzLklzTG9uZygpO3RoaXMuX2ZpbHRlcnM9W3RoaXMuX2NhdGVnb3J5RmlsdGVyLHRoaXMuX2R1cmF0aW9uRmlsdGVyXTt9CmZpbHRlcnMoKXtyZXR1cm4gdGhpcy5fZmlsdGVyczt9CnBvcHVsYXRlVG9vbGJhcih0b29sYmFyKXtjb25zdCBkdXJhdGlvbkZpbHRlclVJPW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3goZHVyYXRpb25GaWx0ZXJDaGFuZ2VkLmJpbmQodGhpcykpO2Zvcihjb25zdCBkdXJhdGlvbk1zIG9mIFRpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXcuRmlsdGVycy5fZHVyYXRpb25GaWx0ZXJQcmVzZXRzTXMpe2R1cmF0aW9uRmlsdGVyVUkuYWRkT3B0aW9uKGR1cmF0aW9uRmlsdGVyVUkuY3JlYXRlT3B0aW9uKGR1cmF0aW9uTXM/Q29tbW9uLlVJU3RyaW5nKCdcdTIyNjUgJWRceGEwbXMnLGR1cmF0aW9uTXMpOkNvbW1vbi5VSVN0cmluZygnQWxsJyksZHVyYXRpb25Ncz9Db21tb24uVUlTdHJpbmcoJ0hpZGUgcmVjb3JkcyBzaG9ydGVyIHRoYW4gJWRceGEwbXMnLGR1cmF0aW9uTXMpOkNvbW1vbi5VSVN0cmluZygnU2hvdyBhbGwgcmVjb3JkcycpLFN0cmluZyhkdXJhdGlvbk1zKSkpO30KdG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShkdXJhdGlvbkZpbHRlclVJKTtjb25zdCBjYXRlZ29yeUZpbHRlcnNVST17fTtjb25zdCBjYXRlZ29yaWVzPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5jYXRlZ29yaWVzKCk7Zm9yKGNvbnN0IGNhdGVnb3J5TmFtZSBpbiBjYXRlZ29yaWVzKXtjb25zdCBjYXRlZ29yeT1jYXRlZ29yaWVzW2NhdGVnb3J5TmFtZV07aWYoIWNhdGVnb3J5LnZpc2libGUpCmNvbnRpbnVlO2NvbnN0IGNoZWNrYm94PW5ldyBVSS5Ub29sYmFyQ2hlY2tib3goY2F0ZWdvcnkudGl0bGUsdW5kZWZpbmVkLGNhdGVnb3JpZXNGaWx0ZXJDaGFuZ2VkLmJpbmQodGhpcyxjYXRlZ29yeU5hbWUpKTtjaGVja2JveC5zZXRDaGVja2VkKHRydWUpO2NoZWNrYm94LmlucHV0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y2F0ZWdvcnkuY29sb3I7Y2F0ZWdvcnlGaWx0ZXJzVUlbY2F0ZWdvcnkubmFtZV09Y2hlY2tib3g7dG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShjaGVja2JveCk7fQpmdW5jdGlvbiBkdXJhdGlvbkZpbHRlckNoYW5nZWQoKXtjb25zdCBkdXJhdGlvbj1kdXJhdGlvbkZpbHRlclVJLnNlbGVjdGVkT3B0aW9uKCkudmFsdWU7Y29uc3QgbWluaW11bVJlY29yZER1cmF0aW9uPXBhcnNlSW50KGR1cmF0aW9uLDEwKTt0aGlzLl9kdXJhdGlvbkZpbHRlci5zZXRNaW5pbXVtUmVjb3JkRHVyYXRpb24obWluaW11bVJlY29yZER1cmF0aW9uKTt0aGlzLl9ub3RpZnlGaWx0ZXJzQ2hhbmdlZCgpO30KZnVuY3Rpb24gY2F0ZWdvcmllc0ZpbHRlckNoYW5nZWQobmFtZSl7Y29uc3QgY2F0ZWdvcmllcz1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY2F0ZWdvcmllcygpO2NhdGVnb3JpZXNbbmFtZV0uaGlkZGVuPSFjYXRlZ29yeUZpbHRlcnNVSVtuYW1lXS5jaGVja2VkKCk7dGhpcy5fbm90aWZ5RmlsdGVyc0NoYW5nZWQoKTt9fQpfbm90aWZ5RmlsdGVyc0NoYW5nZWQoKXt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhUaW1lbGluZS5FdmVudHNUaW1lbGluZVRyZWVWaWV3LkZpbHRlcnMuRXZlbnRzLkZpbHRlckNoYW5nZWQpO319O1RpbWVsaW5lLkV2ZW50c1RpbWVsaW5lVHJlZVZpZXcuRmlsdGVycy5fZHVyYXRpb25GaWx0ZXJQcmVzZXRzTXM9WzAsMSwxNV07VGltZWxpbmUuRXZlbnRzVGltZWxpbmVUcmVlVmlldy5GaWx0ZXJzLkV2ZW50cz17RmlsdGVyQ2hhbmdlZDpTeW1ib2woJ0ZpbHRlckNoYW5nZWQnKX07O1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscz1jbGFzc3tzdGF0aWMgX2luaXRFdmVudFN0eWxlcygpe2lmKFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fZXZlbnRTdHlsZXNNYXApCnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2V2ZW50U3R5bGVzTWFwO2NvbnN0IHJlY29yZFR5cGVzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2NvbnN0IGNhdGVnb3JpZXM9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNhdGVnb3JpZXMoKTtjb25zdCBldmVudFN0eWxlcz17fTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5UYXNrXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1Rhc2snKSxjYXRlZ29yaWVzWydvdGhlciddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5Qcm9ncmFtXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ090aGVyJyksY2F0ZWdvcmllc1snb3RoZXInXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuQW5pbWF0aW9uXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0FuaW1hdGlvbicpLGNhdGVnb3JpZXNbJ3JlbmRlcmluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5FdmVudERpc3BhdGNoXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0V2ZW50JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlJlcXVlc3RNYWluVGhyZWFkRnJhbWVdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnUmVxdWVzdCBNYWluIFRocmVhZCBGcmFtZScpLGNhdGVnb3JpZXNbJ3JlbmRlcmluZyddLHRydWUpO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkJlZ2luRnJhbWVdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRnJhbWUgU3RhcnQnKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5CZWdpbk1haW5UaHJlYWRGcmFtZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdGcmFtZSBTdGFydCAobWFpbiB0aHJlYWQpJyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10sdHJ1ZSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuRHJhd0ZyYW1lXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0RyYXcgRnJhbWUnKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5IaXRUZXN0XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0hpdCBUZXN0JyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1NjaGVkdWxlIFN0eWxlIFJlY2FsY3VsYXRpb24nKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5SZWNhbGN1bGF0ZVN0eWxlc109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdSZWNhbGN1bGF0ZSBTdHlsZScpLGNhdGVnb3JpZXNbJ3JlbmRlcmluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5VcGRhdGVMYXlvdXRUcmVlXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1JlY2FsY3VsYXRlIFN0eWxlJyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkludmFsaWRhdGVMYXlvdXRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnSW52YWxpZGF0ZSBMYXlvdXQnKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5MYXlvdXRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnTGF5b3V0JyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlBhaW50U2V0dXBdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnUGFpbnQgU2V0dXAnKSxjYXRlZ29yaWVzWydwYWludGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5QYWludEltYWdlXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1BhaW50IEltYWdlJyksY2F0ZWdvcmllc1sncGFpbnRpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5VcGRhdGVMYXllcl09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdVcGRhdGUgTGF5ZXInKSxjYXRlZ29yaWVzWydwYWludGluZyddLHRydWUpO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlVwZGF0ZUxheWVyVHJlZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdVcGRhdGUgTGF5ZXIgVHJlZScpLGNhdGVnb3JpZXNbJ3JlbmRlcmluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5QYWludF09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdQYWludCcpLGNhdGVnb3JpZXNbJ3BhaW50aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlJhc3RlclRhc2tdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnUmFzdGVyaXplIFBhaW50JyksY2F0ZWdvcmllc1sncGFpbnRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuU2Nyb2xsTGF5ZXJdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnU2Nyb2xsJyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNvbXBvc2l0ZUxheWVyc109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdDb21wb3NpdGUgTGF5ZXJzJyksY2F0ZWdvcmllc1sncGFpbnRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuUGFyc2VIVE1MXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1BhcnNlIEhUTUwnKSxjYXRlZ29yaWVzWydsb2FkaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlBhcnNlQXV0aG9yU3R5bGVTaGVldF09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdQYXJzZSBTdHlsZXNoZWV0JyksY2F0ZWdvcmllc1snbG9hZGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5UaW1lckluc3RhbGxdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnSW5zdGFsbCBUaW1lcicpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5UaW1lclJlbW92ZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdSZW1vdmUgVGltZXInKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuVGltZXJGaXJlXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1RpbWVyIEZpcmVkJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlhIUlJlYWR5U3RhdGVDaGFuZ2VdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnWEhSIFJlYWR5IFN0YXRlIENoYW5nZScpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5YSFJMb2FkXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1hIUiBMb2FkJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNvbXBpbGVTY3JpcHRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnQ29tcGlsZSBTY3JpcHQnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuRXZhbHVhdGVTY3JpcHRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRXZhbHVhdGUgU2NyaXB0JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNvbXBpbGVNb2R1bGVdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnQ29tcGlsZSBNb2R1bGUnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuRXZhbHVhdGVNb2R1bGVdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRXZhbHVhdGUgTW9kdWxlJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlBhcnNlU2NyaXB0T25CYWNrZ3JvdW5kXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1BhcnNlIFNjcmlwdCcpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5GcmFtZVN0YXJ0ZWRMb2FkaW5nXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0ZyYW1lIFN0YXJ0ZWQgTG9hZGluZycpLGNhdGVnb3JpZXNbJ2xvYWRpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5NYXJrTG9hZF09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdMb2FkIGV2ZW50JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10sdHJ1ZSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuTWFya0RPTUNvbnRlbnRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRE9NQ29udGVudExvYWRlZCBldmVudCcpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddLHRydWUpO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLk1hcmtGaXJzdFBhaW50XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0ZpcnN0IHBhaW50JyksY2F0ZWdvcmllc1sncGFpbnRpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5NYXJrRkNQXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0ZpcnN0IGNvbnRlbnRmdWwgcGFpbnQnKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5NYXJrRk1QXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0ZpcnN0IG1lYW5pbmdmdWwgcGFpbnQnKSxjYXRlZ29yaWVzWydyZW5kZXJpbmcnXSx0cnVlKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5NYXJrRk1QQ2FuZGlkYXRlXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ01lYW5pbmdmdWwgcGFpbnQgY2FuZGlkYXRlJyksY2F0ZWdvcmllc1sncmVuZGVyaW5nJ10sdHJ1ZSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuVGltZVN0YW1wXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1RpbWVzdGFtcCcpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5Db25zb2xlVGltZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdDb25zb2xlIFRpbWUnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuVXNlclRpbWluZ109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdVc2VyIFRpbWluZycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5SZXNvdXJjZVNlbmRSZXF1ZXN0XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1NlbmQgUmVxdWVzdCcpLGNhdGVnb3JpZXNbJ2xvYWRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuUmVzb3VyY2VSZWNlaXZlUmVzcG9uc2VdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnUmVjZWl2ZSBSZXNwb25zZScpLGNhdGVnb3JpZXNbJ2xvYWRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuUmVzb3VyY2VGaW5pc2hdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRmluaXNoIExvYWRpbmcnKSxjYXRlZ29yaWVzWydsb2FkaW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlJlc291cmNlUmVjZWl2ZWREYXRhXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1JlY2VpdmUgRGF0YScpLGNhdGVnb3JpZXNbJ2xvYWRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuUnVuTWljcm90YXNrc109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdSdW4gTWljcm90YXNrcycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5GdW5jdGlvbkNhbGxdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRnVuY3Rpb24gQ2FsbCcpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5HQ0V2ZW50XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0dDIEV2ZW50JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLk1ham9yR0NdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnTWFqb3IgR0MnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuTWlub3JHQ109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdNaW5vciBHQycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5KU0ZyYW1lXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0pTIEZyYW1lJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLlJlcXVlc3RBbmltYXRpb25GcmFtZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZScpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5DYW5jZWxBbmltYXRpb25GcmFtZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdDYW5jZWwgQW5pbWF0aW9uIEZyYW1lJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkZpcmVBbmltYXRpb25GcmFtZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdBbmltYXRpb24gRnJhbWUgRmlyZWQnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuUmVxdWVzdElkbGVDYWxsYmFja109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdSZXF1ZXN0IElkbGUgQ2FsbGJhY2snKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuQ2FuY2VsSWRsZUNhbGxiYWNrXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0NhbmNlbCBJZGxlIENhbGxiYWNrJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkZpcmVJZGxlQ2FsbGJhY2tdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRmlyZSBJZGxlIENhbGxiYWNrJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLldlYlNvY2tldENyZWF0ZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdDcmVhdGUgV2ViU29ja2V0JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLldlYlNvY2tldFNlbmRIYW5kc2hha2VSZXF1ZXN0XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1NlbmQgV2ViU29ja2V0IEhhbmRzaGFrZScpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5XZWJTb2NrZXRSZWNlaXZlSGFuZHNoYWtlUmVzcG9uc2VdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnUmVjZWl2ZSBXZWJTb2NrZXQgSGFuZHNoYWtlJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLldlYlNvY2tldERlc3Ryb3ldPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRGVzdHJveSBXZWJTb2NrZXQnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuRW1iZWRkZXJDYWxsYmFja109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdFbWJlZGRlciBDYWxsYmFjaycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5EZWNvZGVJbWFnZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdJbWFnZSBEZWNvZGUnKSxjYXRlZ29yaWVzWydwYWludGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5SZXNpemVJbWFnZV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdJbWFnZSBSZXNpemUnKSxjYXRlZ29yaWVzWydwYWludGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5HUFVUYXNrXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0dQVScpLGNhdGVnb3JpZXNbJ2dwdSddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5MYXRlbmN5SW5mb109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdJbnB1dCBMYXRlbmN5JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkdDSWRsZUxhenlTd2VlcF09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdET00gR0MnKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuR0NDb21wbGV0ZVN3ZWVwXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0RPTSBHQycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5HQ0NvbGxlY3RHYXJiYWdlXT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0RPTSBHQycpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5DcnlwdG9Eb0VuY3J5cHRdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRW5jcnlwdCcpLGNhdGVnb3JpZXNbJ3NjcmlwdGluZyddKTtldmVudFN0eWxlc1tyZWNvcmRUeXBlcy5DcnlwdG9Eb0VuY3J5cHRSZXBseV09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdFbmNyeXB0IFJlcGx5JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvRGVjcnlwdF09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdEZWNyeXB0JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvRGVjcnlwdFJlcGx5XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ0RlY3J5cHQgUmVwbHknKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuQ3J5cHRvRG9EaWdlc3RdPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRGlnZXN0JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvRGlnZXN0UmVwbHldPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnRGlnZXN0IFJlcGx5JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvU2lnbl09bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdTaWduJyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvU2lnblJlcGx5XT1uZXcgVGltZWxpbmUuVGltZWxpbmVSZWNvcmRTdHlsZShDb21tb24uVUlTdHJpbmcoJ1NpZ24gUmVwbHknKSxjYXRlZ29yaWVzWydzY3JpcHRpbmcnXSk7ZXZlbnRTdHlsZXNbcmVjb3JkVHlwZXMuQ3J5cHRvRG9WZXJpZnldPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnVmVyaWZ5JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkNyeXB0b0RvVmVyaWZ5UmVwbHldPW5ldyBUaW1lbGluZS5UaW1lbGluZVJlY29yZFN0eWxlKENvbW1vbi5VSVN0cmluZygnVmVyaWZ5IFJlcGx5JyksY2F0ZWdvcmllc1snc2NyaXB0aW5nJ10pO2V2ZW50U3R5bGVzW3JlY29yZFR5cGVzLkFzeW5jVGFza109bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoQ29tbW9uLlVJU3RyaW5nKCdBc3luYyBUYXNrJyksY2F0ZWdvcmllc1snYXN5bmMnXSk7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9ldmVudFN0eWxlc01hcD1ldmVudFN0eWxlcztyZXR1cm4gZXZlbnRTdHlsZXM7fQpzdGF0aWMgaW5wdXRFdmVudERpc3BsYXlOYW1lKGlucHV0RXZlbnRUeXBlKXtpZighVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9pbnB1dEV2ZW50VG9EaXNwbGF5TmFtZSl7Y29uc3QgaW5wdXRFdmVudD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5JbnB1dEV2ZW50cztUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2lucHV0RXZlbnRUb0Rpc3BsYXlOYW1lPW5ldyBNYXAoW1tpbnB1dEV2ZW50LkNoYXIsQ29tbW9uLlVJU3RyaW5nKCdLZXkgQ2hhcmFjdGVyJyldLFtpbnB1dEV2ZW50LktleURvd24sQ29tbW9uLlVJU3RyaW5nKCdLZXkgRG93bicpXSxbaW5wdXRFdmVudC5LZXlEb3duUmF3LENvbW1vbi5VSVN0cmluZygnS2V5IERvd24nKV0sW2lucHV0RXZlbnQuS2V5VXAsQ29tbW9uLlVJU3RyaW5nKCdLZXkgVXAnKV0sW2lucHV0RXZlbnQuQ2xpY2ssQ29tbW9uLlVJU3RyaW5nKCdDbGljaycpXSxbaW5wdXRFdmVudC5Db250ZXh0TWVudSxDb21tb24uVUlTdHJpbmcoJ0NvbnRleHQgTWVudScpXSxbaW5wdXRFdmVudC5Nb3VzZURvd24sQ29tbW9uLlVJU3RyaW5nKCdNb3VzZSBEb3duJyldLFtpbnB1dEV2ZW50Lk1vdXNlTW92ZSxDb21tb24uVUlTdHJpbmcoJ01vdXNlIE1vdmUnKV0sW2lucHV0RXZlbnQuTW91c2VVcCxDb21tb24uVUlTdHJpbmcoJ01vdXNlIFVwJyldLFtpbnB1dEV2ZW50Lk1vdXNlV2hlZWwsQ29tbW9uLlVJU3RyaW5nKCdNb3VzZSBXaGVlbCcpXSxbaW5wdXRFdmVudC5TY3JvbGxCZWdpbixDb21tb24uVUlTdHJpbmcoJ1Njcm9sbCBCZWdpbicpXSxbaW5wdXRFdmVudC5TY3JvbGxFbmQsQ29tbW9uLlVJU3RyaW5nKCdTY3JvbGwgRW5kJyldLFtpbnB1dEV2ZW50LlNjcm9sbFVwZGF0ZSxDb21tb24uVUlTdHJpbmcoJ1Njcm9sbCBVcGRhdGUnKV0sW2lucHV0RXZlbnQuRmxpbmdTdGFydCxDb21tb24uVUlTdHJpbmcoJ0ZsaW5nIFN0YXJ0JyldLFtpbnB1dEV2ZW50LkZsaW5nQ2FuY2VsLENvbW1vbi5VSVN0cmluZygnRmxpbmcgSGFsdCcpXSxbaW5wdXRFdmVudC5UYXAsQ29tbW9uLlVJU3RyaW5nKCdUYXAnKV0sW2lucHV0RXZlbnQuVGFwQ2FuY2VsLENvbW1vbi5VSVN0cmluZygnVGFwIEhhbHQnKV0sW2lucHV0RXZlbnQuU2hvd1ByZXNzLENvbW1vbi5VSVN0cmluZygnVGFwIEJlZ2luJyldLFtpbnB1dEV2ZW50LlRhcERvd24sQ29tbW9uLlVJU3RyaW5nKCdUYXAgRG93bicpXSxbaW5wdXRFdmVudC5Ub3VjaENhbmNlbCxDb21tb24uVUlTdHJpbmcoJ1RvdWNoIENhbmNlbCcpXSxbaW5wdXRFdmVudC5Ub3VjaEVuZCxDb21tb24uVUlTdHJpbmcoJ1RvdWNoIEVuZCcpXSxbaW5wdXRFdmVudC5Ub3VjaE1vdmUsQ29tbW9uLlVJU3RyaW5nKCdUb3VjaCBNb3ZlJyldLFtpbnB1dEV2ZW50LlRvdWNoU3RhcnQsQ29tbW9uLlVJU3RyaW5nKCdUb3VjaCBTdGFydCcpXSxbaW5wdXRFdmVudC5QaW5jaEJlZ2luLENvbW1vbi5VSVN0cmluZygnUGluY2ggQmVnaW4nKV0sW2lucHV0RXZlbnQuUGluY2hFbmQsQ29tbW9uLlVJU3RyaW5nKCdQaW5jaCBFbmQnKV0sW2lucHV0RXZlbnQuUGluY2hVcGRhdGUsQ29tbW9uLlVJU3RyaW5nKCdQaW5jaCBVcGRhdGUnKV1dKTt9CnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2lucHV0RXZlbnRUb0Rpc3BsYXlOYW1lLmdldChpbnB1dEV2ZW50VHlwZSl8fG51bGw7fQpzdGF0aWMgZnJhbWVEaXNwbGF5TmFtZShmcmFtZSl7aWYoIVRpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuaXNOYXRpdmVSdW50aW1lRnJhbWUoZnJhbWUpKQpyZXR1cm4gVUkuYmVhdXRpZnlGdW5jdGlvbk5hbWUoZnJhbWUuZnVuY3Rpb25OYW1lKTtjb25zdCBuYXRpdmVHcm91cD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lSlNQcm9maWxlUHJvY2Vzc29yLm5hdGl2ZUdyb3VwKGZyYW1lLmZ1bmN0aW9uTmFtZSk7Y29uc3QgZ3JvdXBzPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVKU1Byb2ZpbGVQcm9jZXNzb3IuTmF0aXZlR3JvdXBzO3N3aXRjaChuYXRpdmVHcm91cCl7Y2FzZSBncm91cHMuQ29tcGlsZTpyZXR1cm4gQ29tbW9uLlVJU3RyaW5nKCdDb21waWxlJyk7Y2FzZSBncm91cHMuUGFyc2U6cmV0dXJuIENvbW1vbi5VSVN0cmluZygnUGFyc2UnKTt9CnJldHVybiBmcmFtZS5mdW5jdGlvbk5hbWU7fQpzdGF0aWMgdGVzdENvbnRlbnRNYXRjaGluZyh0cmFjZUV2ZW50LHJlZ0V4cCl7Y29uc3QgdGl0bGU9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUodHJhY2VFdmVudCkudGl0bGU7Y29uc3QgdG9rZW5zPVt0aXRsZV07Y29uc3QgdXJsPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KHRyYWNlRXZlbnQpLnVybDtpZih1cmwpCnRva2Vucy5wdXNoKHVybCk7YXBwZW5kT2JqZWN0UHJvcGVydGllcyh0cmFjZUV2ZW50LmFyZ3MsMik7cmV0dXJuIHJlZ0V4cC50ZXN0KHRva2Vucy5qb2luKCd8JykpO2Z1bmN0aW9uIGFwcGVuZE9iamVjdFByb3BlcnRpZXMob2JqZWN0LGRlcHRoKXtpZighZGVwdGgpCnJldHVybjtmb3IoY29uc3Qga2V5IGluIG9iamVjdCl7Y29uc3QgdmFsdWU9b2JqZWN0W2tleV07Y29uc3QgdHlwZT10eXBlb2YgdmFsdWU7aWYodHlwZT09PSdzdHJpbmcnKQp0b2tlbnMucHVzaCh2YWx1ZSk7ZWxzZSBpZih0eXBlPT09J251bWJlcicpCnRva2Vucy5wdXNoKFN0cmluZyh2YWx1ZSkpO2Vsc2UgaWYodHlwZT09PSdvYmplY3QnKQphcHBlbmRPYmplY3RQcm9wZXJ0aWVzKHZhbHVlLGRlcHRoLTEpO319fQpzdGF0aWMgZXZlbnRVUkwoZXZlbnQpe2NvbnN0IGRhdGE9ZXZlbnQuYXJnc1snZGF0YSddfHxldmVudC5hcmdzWydiZWdpbkRhdGEnXTtjb25zdCB1cmw9ZGF0YSYmZGF0YS51cmw7aWYodXJsKQpyZXR1cm4gdXJsO2NvbnN0IHN0YWNrVHJhY2U9ZGF0YSYmZGF0YVsnc3RhY2tUcmFjZSddO2NvbnN0IGZyYW1lPXN0YWNrVHJhY2UmJnN0YWNrVHJhY2UubGVuZ3RoJiZzdGFja1RyYWNlWzBdfHxUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkudG9wRnJhbWUoKTtyZXR1cm4gZnJhbWUmJmZyYW1lLnVybHx8bnVsbDt9CnN0YXRpYyBldmVudFN0eWxlKGV2ZW50KXtjb25zdCBldmVudFN0eWxlcz1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2luaXRFdmVudFN0eWxlcygpO2lmKGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5Db25zb2xlKXx8ZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LlVzZXJUaW1pbmcpKQpyZXR1cm57dGl0bGU6ZXZlbnQubmFtZSxjYXRlZ29yeTpUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY2F0ZWdvcmllcygpWydzY3JpcHRpbmcnXX07aWYoZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkxhdGVuY3lJbmZvKSl7Y29uc3QgcHJlZml4PSdJbnB1dExhdGVuY3k6Oic7Y29uc3QgaW5wdXRFdmVudFR5cGU9ZXZlbnQubmFtZS5zdGFydHNXaXRoKHByZWZpeCk/ZXZlbnQubmFtZS5zdWJzdHIocHJlZml4Lmxlbmd0aCk6ZXZlbnQubmFtZTtjb25zdCBkaXNwbGF5TmFtZT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuaW5wdXRFdmVudERpc3BsYXlOYW1lKChpbnB1dEV2ZW50VHlwZSkpO3JldHVybnt0aXRsZTpkaXNwbGF5TmFtZXx8aW5wdXRFdmVudFR5cGUsY2F0ZWdvcnk6VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNhdGVnb3JpZXMoKVsnc2NyaXB0aW5nJ119O30KbGV0IHJlc3VsdD1ldmVudFN0eWxlc1tldmVudC5uYW1lXTtpZighcmVzdWx0KXtyZXN1bHQ9bmV3IFRpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGUoZXZlbnQubmFtZSxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY2F0ZWdvcmllcygpWydvdGhlciddLHRydWUpO2V2ZW50U3R5bGVzW2V2ZW50Lm5hbWVdPXJlc3VsdDt9CnJldHVybiByZXN1bHQ7fQpzdGF0aWMgZXZlbnRDb2xvcihldmVudCl7aWYoZXZlbnQubmFtZT09PVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLkpTRnJhbWUpe2NvbnN0IGZyYW1lPWV2ZW50LmFyZ3NbJ2RhdGEnXTtpZihUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuaXNVc2VyRnJhbWUoZnJhbWUpKQpyZXR1cm4gVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNvbG9yRm9ySWQoZnJhbWUudXJsKTt9CnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRTdHlsZShldmVudCkuY2F0ZWdvcnkuY29sb3I7fQpzdGF0aWMgZXZlbnRDb2xvckJ5UHJvZHVjdChwcm9kdWN0UmVnaXN0cnksbW9kZWwsdXJsVG9Db2xvckNhY2hlLGV2ZW50KXtjb25zdCB1cmw9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50VVJMKGV2ZW50KXx8Jyc7bGV0IGNvbG9yPXVybFRvQ29sb3JDYWNoZS5nZXQodXJsKTtpZihjb2xvcikKcmV0dXJuIGNvbG9yO2NvbnN0IGRlZmF1bHRDb2xvcj0nI2YyZWNkYyc7Y29uc3QgcGFyc2VkVVJMPXVybC5hc1BhcnNlZFVSTCgpO2lmKCFwYXJzZWRVUkwpCnJldHVybiBkZWZhdWx0Q29sb3I7bGV0IG5hbWU9cHJvZHVjdFJlZ2lzdHJ5JiZwcm9kdWN0UmVnaXN0cnkubmFtZUZvclVybChwYXJzZWRVUkwpO2lmKCFuYW1lKXtuYW1lPXBhcnNlZFVSTC5ob3N0O2NvbnN0IHJvb3RGcmFtZXM9bW9kZWwucm9vdEZyYW1lcygpO2lmKHJvb3RGcmFtZXMuc29tZShwYWdlRnJhbWU9Pm5ldyBDb21tb24uUGFyc2VkVVJMKHBhZ2VGcmFtZS51cmwpLmhvc3Q9PT1uYW1lKSkKY29sb3I9ZGVmYXVsdENvbG9yO30KaWYoIWNvbG9yKQpjb2xvcj1uYW1lP1Byb2R1Y3RSZWdpc3RyeS5CYWRnZVBvb2wuY29sb3JGb3JFbnRyeU5hbWUobmFtZSk6ZGVmYXVsdENvbG9yO3VybFRvQ29sb3JDYWNoZS5zZXQodXJsLGNvbG9yKTtyZXR1cm4gY29sb3I7fQpzdGF0aWMgZXZlbnRUaXRsZShldmVudCl7Y29uc3QgcmVjb3JkVHlwZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtjb25zdCBldmVudERhdGE9ZXZlbnQuYXJnc1snZGF0YSddO2lmKGV2ZW50Lm5hbWU9PT1yZWNvcmRUeXBlLkpTRnJhbWUpCnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZnJhbWVEaXNwbGF5TmFtZShldmVudERhdGEpO2NvbnN0IHRpdGxlPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFN0eWxlKGV2ZW50KS50aXRsZTtpZihldmVudC5oYXNDYXRlZ29yeShUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQ2F0ZWdvcnkuQ29uc29sZSkpCnJldHVybiB0aXRsZTtpZihldmVudC5uYW1lPT09cmVjb3JkVHlwZS5UaW1lU3RhbXApCnJldHVybiBDb21tb24uVUlTdHJpbmcoJyVzOiAlcycsdGl0bGUsZXZlbnREYXRhWydtZXNzYWdlJ10pO2lmKGV2ZW50Lm5hbWU9PT1yZWNvcmRUeXBlLkFuaW1hdGlvbiYmZXZlbnREYXRhJiZldmVudERhdGFbJ25hbWUnXSkKcmV0dXJuIENvbW1vbi5VSVN0cmluZygnJXM6ICVzJyx0aXRsZSxldmVudERhdGFbJ25hbWUnXSk7cmV0dXJuIHRpdGxlO30Kc3RhdGljIF9pbnRlcmFjdGlvblBoYXNlU3R5bGVzKCl7bGV0IG1hcD1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2ludGVyYWN0aW9uUGhhc2VTdHlsZXNNYXA7aWYoIW1hcCl7bWFwPW5ldyBNYXAoW1tUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5QaGFzZXMuSWRsZSx7Y29sb3I6J3doaXRlJyxsYWJlbDonSWRsZSd9XSxbVGltZWxpbmVNb2RlbC5UaW1lbGluZUlSTW9kZWwuUGhhc2VzLlJlc3BvbnNlLHtjb2xvcjonaHNsKDQzLCA4MyUsIDY0JSknLGxhYmVsOkNvbW1vbi5VSVN0cmluZygnUmVzcG9uc2UnKX1dLFtUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5QaGFzZXMuU2Nyb2xsLHtjb2xvcjonaHNsKDI1NiwgNjclLCA3MCUpJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ1Njcm9sbCcpfV0sW1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLlBoYXNlcy5GbGluZyx7Y29sb3I6J2hzbCgyNTYsIDY3JSwgNzAlKScsbGFiZWw6Q29tbW9uLlVJU3RyaW5nKCdGbGluZycpfV0sW1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLlBoYXNlcy5EcmFnLHtjb2xvcjonaHNsKDI1NiwgNjclLCA3MCUpJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0RyYWcnKX1dLFtUaW1lbGluZU1vZGVsLlRpbWVsaW5lSVJNb2RlbC5QaGFzZXMuQW5pbWF0aW9uLHtjb2xvcjonaHNsKDI1NiwgNjclLCA3MCUpJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ0FuaW1hdGlvbicpfV0sW1RpbWVsaW5lTW9kZWwuVGltZWxpbmVJUk1vZGVsLlBoYXNlcy5VbmNhdGVnb3JpemVkLHtjb2xvcjonaHNsKDAsIDAlLCA4NyUpJyxsYWJlbDpDb21tb24uVUlTdHJpbmcoJ1VuY2F0ZWdvcml6ZWQnKX1dXSk7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9pbnRlcmFjdGlvblBoYXNlU3R5bGVzTWFwPW1hcDt9CnJldHVybiBtYXA7fQpzdGF0aWMgaW50ZXJhY3Rpb25QaGFzZUNvbG9yKHBoYXNlKXtyZXR1cm4gVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9pbnRlcmFjdGlvblBoYXNlU3R5bGVzKCkuZ2V0KHBoYXNlKS5jb2xvcjt9CnN0YXRpYyBpbnRlcmFjdGlvblBoYXNlTGFiZWwocGhhc2Upe3JldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2ludGVyYWN0aW9uUGhhc2VTdHlsZXMoKS5nZXQocGhhc2UpLmxhYmVsO30Kc3RhdGljIGlzVXNlckZyYW1lKGZyYW1lKXtyZXR1cm4gZnJhbWUuc2NyaXB0SWQhPT0nMCcmJiEoZnJhbWUudXJsJiZmcmFtZS51cmwuc3RhcnRzV2l0aCgnbmF0aXZlICcpKTt9CnN0YXRpYyBuZXR3b3JrUmVxdWVzdENhdGVnb3J5KHJlcXVlc3Qpe2NvbnN0IGNhdGVnb3JpZXM9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLk5ldHdvcmtDYXRlZ29yeTtzd2l0Y2gocmVxdWVzdC5taW1lVHlwZSl7Y2FzZSd0ZXh0L2h0bWwnOnJldHVybiBjYXRlZ29yaWVzLkhUTUw7Y2FzZSdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JzpjYXNlJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCc6Y2FzZSd0ZXh0L2phdmFzY3JpcHQnOnJldHVybiBjYXRlZ29yaWVzLlNjcmlwdDtjYXNlJ3RleHQvY3NzJzpyZXR1cm4gY2F0ZWdvcmllcy5TdHlsZTtjYXNlJ2F1ZGlvL29nZyc6Y2FzZSdpbWFnZS9naWYnOmNhc2UnaW1hZ2UvanBlZyc6Y2FzZSdpbWFnZS9wbmcnOmNhc2UnaW1hZ2Uvc3ZnK3htbCc6Y2FzZSdpbWFnZS93ZWJwJzpjYXNlJ2ltYWdlL3gtaWNvbic6Y2FzZSdmb250L29wZW50eXBlJzpjYXNlJ2ZvbnQvd29mZjInOmNhc2UnYXBwbGljYXRpb24vZm9udC13b2ZmJzpyZXR1cm4gY2F0ZWdvcmllcy5NZWRpYTtkZWZhdWx0OnJldHVybiBjYXRlZ29yaWVzLk90aGVyO319CnN0YXRpYyBuZXR3b3JrQ2F0ZWdvcnlDb2xvcihjYXRlZ29yeSl7Y29uc3QgY2F0ZWdvcmllcz1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuTmV0d29ya0NhdGVnb3J5O3N3aXRjaChjYXRlZ29yeSl7Y2FzZSBjYXRlZ29yaWVzLkhUTUw6cmV0dXJuJ2hzbCgyMTQsIDY3JSwgNjYlKSc7Y2FzZSBjYXRlZ29yaWVzLlNjcmlwdDpyZXR1cm4naHNsKDQzLCA4MyUsIDY0JSknO2Nhc2UgY2F0ZWdvcmllcy5TdHlsZTpyZXR1cm4naHNsKDI1NiwgNjclLCA3MCUpJztjYXNlIGNhdGVnb3JpZXMuTWVkaWE6cmV0dXJuJ2hzbCgxMDksIDMzJSwgNTUlKSc7ZGVmYXVsdDpyZXR1cm4naHNsKDAsIDAlLCA3MCUpJzt9fQpzdGF0aWMgYnVpbGREZXRhaWxzVGV4dEZvclRyYWNlRXZlbnQoZXZlbnQsdGFyZ2V0KXtjb25zdCByZWNvcmRUeXBlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlO2xldCBkZXRhaWxzVGV4dDtjb25zdCBldmVudERhdGE9ZXZlbnQuYXJnc1snZGF0YSddO3N3aXRjaChldmVudC5uYW1lKXtjYXNlIHJlY29yZFR5cGUuR0NFdmVudDpjYXNlIHJlY29yZFR5cGUuTWFqb3JHQzpjYXNlIHJlY29yZFR5cGUuTWlub3JHQzp7Y29uc3QgZGVsdGE9ZXZlbnQuYXJnc1sndXNlZEhlYXBTaXplQmVmb3JlJ10tZXZlbnQuYXJnc1sndXNlZEhlYXBTaXplQWZ0ZXInXTtkZXRhaWxzVGV4dD1Db21tb24uVUlTdHJpbmcoJyVzIGNvbGxlY3RlZCcsTnVtYmVyLmJ5dGVzVG9TdHJpbmcoZGVsdGEpKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZS5GdW5jdGlvbkNhbGw6aWYoZXZlbnREYXRhKXtkZXRhaWxzVGV4dD1saW5raWZ5TG9jYXRpb25Bc1RleHQoZXZlbnREYXRhWydzY3JpcHRJZCddLGV2ZW50RGF0YVsnbGluZU51bWJlciddLGV2ZW50RGF0YVsnY29sdW1uTnVtYmVyJ10pO30KYnJlYWs7Y2FzZSByZWNvcmRUeXBlLkpTRnJhbWU6ZGV0YWlsc1RleHQ9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmZyYW1lRGlzcGxheU5hbWUoZXZlbnREYXRhKTticmVhaztjYXNlIHJlY29yZFR5cGUuRXZlbnREaXNwYXRjaDpkZXRhaWxzVGV4dD1ldmVudERhdGE/ZXZlbnREYXRhWyd0eXBlJ106bnVsbDticmVhaztjYXNlIHJlY29yZFR5cGUuUGFpbnQ6e2NvbnN0IHdpZHRoPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5xdWFkV2lkdGgoZXZlbnREYXRhLmNsaXApO2NvbnN0IGhlaWdodD1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMucXVhZEhlaWdodChldmVudERhdGEuY2xpcCk7aWYod2lkdGgmJmhlaWdodCkKZGV0YWlsc1RleHQ9Q29tbW9uLlVJU3RyaW5nKCclZFx4YTBcdTAwZDdceGEwJWQnLHdpZHRoLGhlaWdodCk7YnJlYWs7fQpjYXNlIHJlY29yZFR5cGUuUGFyc2VIVE1MOntjb25zdCBlbmRMaW5lPWV2ZW50LmFyZ3NbJ2VuZERhdGEnXSYmZXZlbnQuYXJnc1snZW5kRGF0YSddWydlbmRMaW5lJ107Y29uc3QgdXJsPUJpbmRpbmdzLmRpc3BsYXlOYW1lRm9yVVJMKGV2ZW50LmFyZ3NbJ2JlZ2luRGF0YSddWyd1cmwnXSk7ZGV0YWlsc1RleHQ9Q29tbW9uLlVJU3RyaW5nKCclcyBbJXNcdTIwMjYlc10nLHVybCxldmVudC5hcmdzWydiZWdpbkRhdGEnXVsnc3RhcnRMaW5lJ10rMSxlbmRMaW5lPj0wP2VuZExpbmUrMTonJyk7YnJlYWs7fQpjYXNlIHJlY29yZFR5cGUuQ29tcGlsZU1vZHVsZTpkZXRhaWxzVGV4dD1CaW5kaW5ncy5kaXNwbGF5TmFtZUZvclVSTChldmVudC5hcmdzWydmaWxlTmFtZSddKTticmVhaztjYXNlIHJlY29yZFR5cGUuQ29tcGlsZVNjcmlwdDpjYXNlIHJlY29yZFR5cGUuRXZhbHVhdGVTY3JpcHQ6e2NvbnN0IHVybD1ldmVudERhdGEmJmV2ZW50RGF0YVsndXJsJ107aWYodXJsKQpkZXRhaWxzVGV4dD1CaW5kaW5ncy5kaXNwbGF5TmFtZUZvclVSTCh1cmwpKyc6JysoZXZlbnREYXRhWydsaW5lTnVtYmVyJ10rMSk7YnJlYWs7fQpjYXNlIHJlY29yZFR5cGUuUGFyc2VTY3JpcHRPbkJhY2tncm91bmQ6Y2FzZSByZWNvcmRUeXBlLlhIUlJlYWR5U3RhdGVDaGFuZ2U6Y2FzZSByZWNvcmRUeXBlLlhIUkxvYWQ6e2NvbnN0IHVybD1ldmVudERhdGFbJ3VybCddO2lmKHVybCkKZGV0YWlsc1RleHQ9QmluZGluZ3MuZGlzcGxheU5hbWVGb3JVUkwodXJsKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZS5UaW1lU3RhbXA6ZGV0YWlsc1RleHQ9ZXZlbnREYXRhWydtZXNzYWdlJ107YnJlYWs7Y2FzZSByZWNvcmRUeXBlLldlYlNvY2tldENyZWF0ZTpjYXNlIHJlY29yZFR5cGUuV2ViU29ja2V0U2VuZEhhbmRzaGFrZVJlcXVlc3Q6Y2FzZSByZWNvcmRUeXBlLldlYlNvY2tldFJlY2VpdmVIYW5kc2hha2VSZXNwb25zZTpjYXNlIHJlY29yZFR5cGUuV2ViU29ja2V0RGVzdHJveTpjYXNlIHJlY29yZFR5cGUuUmVzb3VyY2VTZW5kUmVxdWVzdDpjYXNlIHJlY29yZFR5cGUuUmVzb3VyY2VSZWNlaXZlZERhdGE6Y2FzZSByZWNvcmRUeXBlLlJlc291cmNlUmVjZWl2ZVJlc3BvbnNlOmNhc2UgcmVjb3JkVHlwZS5SZXNvdXJjZUZpbmlzaDpjYXNlIHJlY29yZFR5cGUuUGFpbnRJbWFnZTpjYXNlIHJlY29yZFR5cGUuRGVjb2RlSW1hZ2U6Y2FzZSByZWNvcmRUeXBlLlJlc2l6ZUltYWdlOmNhc2UgcmVjb3JkVHlwZS5EZWNvZGVMYXp5UGl4ZWxSZWY6e2NvbnN0IHVybD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkudXJsO2lmKHVybCkKZGV0YWlsc1RleHQ9QmluZGluZ3MuZGlzcGxheU5hbWVGb3JVUkwodXJsKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZS5FbWJlZGRlckNhbGxiYWNrOmRldGFpbHNUZXh0PWV2ZW50RGF0YVsnY2FsbGJhY2tOYW1lJ107YnJlYWs7Y2FzZSByZWNvcmRUeXBlLkFuaW1hdGlvbjpkZXRhaWxzVGV4dD1ldmVudERhdGEmJmV2ZW50RGF0YVsnbmFtZSddO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZS5HQ0lkbGVMYXp5U3dlZXA6ZGV0YWlsc1RleHQ9Q29tbW9uLlVJU3RyaW5nKCdpZGxlIHN3ZWVwJyk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlLkdDQ29tcGxldGVTd2VlcDpkZXRhaWxzVGV4dD1Db21tb24uVUlTdHJpbmcoJ2NvbXBsZXRlIHN3ZWVwJyk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlLkdDQ29sbGVjdEdhcmJhZ2U6ZGV0YWlsc1RleHQ9Q29tbW9uLlVJU3RyaW5nKCdjb2xsZWN0Jyk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlLkFzeW5jVGFzazpkZXRhaWxzVGV4dD1ldmVudERhdGE/ZXZlbnREYXRhWyduYW1lJ106bnVsbDticmVhaztkZWZhdWx0OmlmKGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5Db25zb2xlKSkKZGV0YWlsc1RleHQ9bnVsbDtlbHNlCmRldGFpbHNUZXh0PWxpbmtpZnlUb3BDYWxsRnJhbWVBc1RleHQoKTticmVhazt9CnJldHVybiBkZXRhaWxzVGV4dDtmdW5jdGlvbiBsaW5raWZ5TG9jYXRpb25Bc1RleHQoc2NyaXB0SWQsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe2NvbnN0IGRlYnVnZ2VyTW9kZWw9dGFyZ2V0P3RhcmdldC5tb2RlbChTREsuRGVidWdnZXJNb2RlbCk6bnVsbDtpZighdGFyZ2V0fHx0YXJnZXQuaXNEaXNwb3NlZCgpfHwhc2NyaXB0SWR8fCFkZWJ1Z2dlck1vZGVsKQpyZXR1cm4gbnVsbDtjb25zdCByYXdMb2NhdGlvbj1kZWJ1Z2dlck1vZGVsLmNyZWF0ZVJhd0xvY2F0aW9uQnlTY3JpcHRJZChzY3JpcHRJZCxsaW5lTnVtYmVyLGNvbHVtbk51bWJlcik7aWYoIXJhd0xvY2F0aW9uKQpyZXR1cm4gbnVsbDtjb25zdCB1aUxvY2F0aW9uPUJpbmRpbmdzLmRlYnVnZ2VyV29ya3NwYWNlQmluZGluZy5yYXdMb2NhdGlvblRvVUlMb2NhdGlvbihyYXdMb2NhdGlvbik7cmV0dXJuIHVpTG9jYXRpb24/dWlMb2NhdGlvbi5saW5rVGV4dCgpOm51bGw7fQpmdW5jdGlvbiBsaW5raWZ5VG9wQ2FsbEZyYW1lQXNUZXh0KCl7Y29uc3QgZnJhbWU9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLnRvcEZyYW1lKCk7aWYoIWZyYW1lKQpyZXR1cm4gbnVsbDtsZXQgdGV4dD1saW5raWZ5TG9jYXRpb25Bc1RleHQoZnJhbWUuc2NyaXB0SWQsZnJhbWUubGluZU51bWJlcixmcmFtZS5jb2x1bW5OdW1iZXIpO2lmKCF0ZXh0KXt0ZXh0PWZyYW1lLnVybDtpZih0eXBlb2YgZnJhbWUubGluZU51bWJlcj09PSdudW1iZXInKQp0ZXh0Kz0nOicrKGZyYW1lLmxpbmVOdW1iZXIrMSk7fQpyZXR1cm4gdGV4dDt9fQpzdGF0aWMgYnVpbGREZXRhaWxzTm9kZUZvclRyYWNlRXZlbnQoZXZlbnQsdGFyZ2V0LGxpbmtpZmllcil7Y29uc3QgcmVjb3JkVHlwZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtsZXQgZGV0YWlscz1udWxsO2xldCBkZXRhaWxzVGV4dDtjb25zdCBldmVudERhdGE9ZXZlbnQuYXJnc1snZGF0YSddO3N3aXRjaChldmVudC5uYW1lKXtjYXNlIHJlY29yZFR5cGUuR0NFdmVudDpjYXNlIHJlY29yZFR5cGUuTWFqb3JHQzpjYXNlIHJlY29yZFR5cGUuTWlub3JHQzpjYXNlIHJlY29yZFR5cGUuRXZlbnREaXNwYXRjaDpjYXNlIHJlY29yZFR5cGUuUGFpbnQ6Y2FzZSByZWNvcmRUeXBlLkFuaW1hdGlvbjpjYXNlIHJlY29yZFR5cGUuRW1iZWRkZXJDYWxsYmFjazpjYXNlIHJlY29yZFR5cGUuUGFyc2VIVE1MOmNhc2UgcmVjb3JkVHlwZS5XZWJTb2NrZXRDcmVhdGU6Y2FzZSByZWNvcmRUeXBlLldlYlNvY2tldFNlbmRIYW5kc2hha2VSZXF1ZXN0OmNhc2UgcmVjb3JkVHlwZS5XZWJTb2NrZXRSZWNlaXZlSGFuZHNoYWtlUmVzcG9uc2U6Y2FzZSByZWNvcmRUeXBlLldlYlNvY2tldERlc3Ryb3k6Y2FzZSByZWNvcmRUeXBlLkdDSWRsZUxhenlTd2VlcDpjYXNlIHJlY29yZFR5cGUuR0NDb21wbGV0ZVN3ZWVwOmNhc2UgcmVjb3JkVHlwZS5HQ0NvbGxlY3RHYXJiYWdlOmRldGFpbHNUZXh0PVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5idWlsZERldGFpbHNUZXh0Rm9yVHJhY2VFdmVudChldmVudCx0YXJnZXQpO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZS5QYWludEltYWdlOmNhc2UgcmVjb3JkVHlwZS5EZWNvZGVJbWFnZTpjYXNlIHJlY29yZFR5cGUuUmVzaXplSW1hZ2U6Y2FzZSByZWNvcmRUeXBlLkRlY29kZUxhenlQaXhlbFJlZjpjYXNlIHJlY29yZFR5cGUuWEhSUmVhZHlTdGF0ZUNoYW5nZTpjYXNlIHJlY29yZFR5cGUuWEhSTG9hZDpjYXNlIHJlY29yZFR5cGUuUmVzb3VyY2VTZW5kUmVxdWVzdDpjYXNlIHJlY29yZFR5cGUuUmVzb3VyY2VSZWNlaXZlZERhdGE6Y2FzZSByZWNvcmRUeXBlLlJlc291cmNlUmVjZWl2ZVJlc3BvbnNlOmNhc2UgcmVjb3JkVHlwZS5SZXNvdXJjZUZpbmlzaDp7Y29uc3QgdXJsPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KS51cmw7aWYodXJsKQpkZXRhaWxzPUNvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwodXJsKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZS5GdW5jdGlvbkNhbGw6Y2FzZSByZWNvcmRUeXBlLkpTRnJhbWU6ZGV0YWlscz1jcmVhdGVFbGVtZW50KCdzcGFuJyk7ZGV0YWlscy5jcmVhdGVUZXh0Q2hpbGQoVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmZyYW1lRGlzcGxheU5hbWUoZXZlbnREYXRhKSk7Y29uc3QgbG9jYXRpb249bGlua2lmeUxvY2F0aW9uKGV2ZW50RGF0YVsnc2NyaXB0SWQnXSxldmVudERhdGFbJ3VybCddLGV2ZW50RGF0YVsnbGluZU51bWJlciddLGV2ZW50RGF0YVsnY29sdW1uTnVtYmVyJ10pO2lmKGxvY2F0aW9uKXtkZXRhaWxzLmNyZWF0ZVRleHRDaGlsZCgnIEAgJyk7ZGV0YWlscy5hcHBlbmRDaGlsZChsb2NhdGlvbik7fQpicmVhaztjYXNlIHJlY29yZFR5cGUuQ29tcGlsZU1vZHVsZTpkZXRhaWxzPWxpbmtpZnlMb2NhdGlvbignJyxldmVudC5hcmdzWydmaWxlTmFtZSddLDAsMCk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlLkNvbXBpbGVTY3JpcHQ6Y2FzZSByZWNvcmRUeXBlLkV2YWx1YXRlU2NyaXB0Ontjb25zdCB1cmw9ZXZlbnREYXRhWyd1cmwnXTtpZih1cmwpCmRldGFpbHM9bGlua2lmeUxvY2F0aW9uKCcnLHVybCxldmVudERhdGFbJ2xpbmVOdW1iZXInXSwwKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZS5QYXJzZVNjcmlwdE9uQmFja2dyb3VuZDp7Y29uc3QgdXJsPWV2ZW50RGF0YVsndXJsJ107aWYodXJsKQpkZXRhaWxzPWxpbmtpZnlMb2NhdGlvbignJyx1cmwsMCwwKTticmVhazt9CmRlZmF1bHQ6aWYoZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LkNvbnNvbGUpKQpkZXRhaWxzVGV4dD1udWxsO2Vsc2UKZGV0YWlscz1saW5raWZ5VG9wQ2FsbEZyYW1lKCk7YnJlYWs7fQppZighZGV0YWlscyYmZGV0YWlsc1RleHQpCmRldGFpbHM9Y3JlYXRlVGV4dE5vZGUoZGV0YWlsc1RleHQpO3JldHVybiBkZXRhaWxzO2Z1bmN0aW9uIGxpbmtpZnlMb2NhdGlvbihzY3JpcHRJZCx1cmwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIpe3JldHVybiBsaW5raWZpZXIubGlua2lmeVNjcmlwdExvY2F0aW9uKHRhcmdldCxzY3JpcHRJZCx1cmwsbGluZU51bWJlcixjb2x1bW5OdW1iZXIsJ3RpbWVsaW5lLWRldGFpbHMnKTt9CmZ1bmN0aW9uIGxpbmtpZnlUb3BDYWxsRnJhbWUoKXtjb25zdCBmcmFtZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkudG9wRnJhbWUoKTtyZXR1cm4gZnJhbWU/bGlua2lmaWVyLm1heWJlTGlua2lmeUNvbnNvbGVDYWxsRnJhbWUodGFyZ2V0LGZyYW1lLCd0aW1lbGluZS1kZXRhaWxzJyk6bnVsbDt9fQpzdGF0aWMgYXN5bmMgYnVpbGRUcmFjZUV2ZW50RGV0YWlscyhldmVudCxtb2RlbCxsaW5raWZpZXIsYmFkZ2VQb29sLGRldGFpbGVkKXtjb25zdCBtYXliZVRhcmdldD1tb2RlbC50YXJnZXRCeUV2ZW50KGV2ZW50KTtsZXQgcmVsYXRlZE5vZGVzTWFwPW51bGw7aWYobWF5YmVUYXJnZXQpe2NvbnN0IHRhcmdldD0obWF5YmVUYXJnZXQpO2lmKHR5cGVvZiBldmVudFtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX3ByZXZpZXdFbGVtZW50U3ltYm9sXT09PSd1bmRlZmluZWQnKXtsZXQgcHJldmlld0VsZW1lbnQ9bnVsbDtjb25zdCB1cmw9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLnVybDtpZih1cmwpCnByZXZpZXdFbGVtZW50PWF3YWl0IEJyb3dzZXJDb21wb25lbnRzLkltYWdlUHJldmlldy5idWlsZCh0YXJnZXQsdXJsLGZhbHNlKTtlbHNlIGlmKFRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KS5waWN0dXJlKQpwcmV2aWV3RWxlbWVudD1hd2FpdCBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuYnVpbGRQaWN0dXJlUHJldmlld0NvbnRlbnQoZXZlbnQsdGFyZ2V0KTtldmVudFtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX3ByZXZpZXdFbGVtZW50U3ltYm9sXT1wcmV2aWV3RWxlbWVudDt9CmNvbnN0IG5vZGVJZHNUb1Jlc29sdmU9bmV3IFNldCgpO2NvbnN0IHRpbWVsaW5lRGF0YT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCk7aWYodGltZWxpbmVEYXRhLmJhY2tlbmROb2RlSWQpCm5vZGVJZHNUb1Jlc29sdmUuYWRkKHRpbWVsaW5lRGF0YS5iYWNrZW5kTm9kZUlkKTtjb25zdCBpbnZhbGlkYXRpb25UcmFja2luZ0V2ZW50cz1UaW1lbGluZU1vZGVsLkludmFsaWRhdGlvblRyYWNrZXIuaW52YWxpZGF0aW9uRXZlbnRzRm9yKGV2ZW50KTtpZihpbnZhbGlkYXRpb25UcmFja2luZ0V2ZW50cykKVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9jb2xsZWN0SW52YWxpZGF0aW9uTm9kZUlkcyhub2RlSWRzVG9SZXNvbHZlLGludmFsaWRhdGlvblRyYWNraW5nRXZlbnRzKTtpZihub2RlSWRzVG9SZXNvbHZlLnNpemUpe2NvbnN0IGRvbU1vZGVsPXRhcmdldC5tb2RlbChTREsuRE9NTW9kZWwpO2lmKGRvbU1vZGVsKQpyZWxhdGVkTm9kZXNNYXA9YXdhaXQgZG9tTW9kZWwucHVzaE5vZGVzQnlCYWNrZW5kSWRzVG9Gcm9udGVuZChub2RlSWRzVG9SZXNvbHZlKTt9fQpjb25zdCByZWNvcmRUeXBlcz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtsZXQgcmVsYXRlZE5vZGVMYWJlbDtjb25zdCBjb250ZW50SGVscGVyPW5ldyBUaW1lbGluZS5UaW1lbGluZURldGFpbHNDb250ZW50SGVscGVyKG1vZGVsLnRhcmdldEJ5RXZlbnQoZXZlbnQpLGxpbmtpZmllcik7Y29udGVudEhlbHBlci5hZGRTZWN0aW9uKFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFRpdGxlKGV2ZW50KSxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRTdHlsZShldmVudCkuY2F0ZWdvcnkuY29sb3IpO2NvbnN0IGV2ZW50RGF0YT1ldmVudC5hcmdzWydkYXRhJ107Y29uc3QgdGltZWxpbmVEYXRhPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KTtjb25zdCBpbml0aWF0b3I9dGltZWxpbmVEYXRhLmluaXRpYXRvcigpO2xldCB1cmw9bnVsbDtpZih0aW1lbGluZURhdGEud2FybmluZykKY29udGVudEhlbHBlci5hcHBlbmRXYXJuaW5nUm93KGV2ZW50KTtpZihldmVudC5uYW1lPT09cmVjb3JkVHlwZXMuSlNGcmFtZSYmZXZlbnREYXRhWydkZW9wdFJlYXNvbiddKQpjb250ZW50SGVscGVyLmFwcGVuZFdhcm5pbmdSb3coZXZlbnQsVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLldhcm5pbmdUeXBlLlY4RGVvcHQpO2lmKGRldGFpbGVkKXtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdUb3RhbCBUaW1lJyksTnVtYmVyLm1pbGxpc1RvU3RyaW5nKGV2ZW50LmR1cmF0aW9ufHwwLHRydWUpKTtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdTZWxmIFRpbWUnKSxOdW1iZXIubWlsbGlzVG9TdHJpbmcoZXZlbnQuc2VsZlRpbWUsdHJ1ZSkpO30KaWYobW9kZWwuaXNHZW5lcmljVHJhY2UoKSl7Zm9yKGNvbnN0IGtleSBpbiBldmVudC5hcmdzKXt0cnl7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KGtleSxKU09OLnN0cmluZ2lmeShldmVudC5hcmdzW2tleV0pKTt9Y2F0Y2goZSl7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KGtleSxgPCR7dHlwZW9mIGV2ZW50LmFyZ3Nba2V5XX0+YCk7fX0KcmV0dXJuIGNvbnRlbnRIZWxwZXIuZnJhZ21lbnQ7fQpzd2l0Y2goZXZlbnQubmFtZSl7Y2FzZSByZWNvcmRUeXBlcy5HQ0V2ZW50OmNhc2UgcmVjb3JkVHlwZXMuTWFqb3JHQzpjYXNlIHJlY29yZFR5cGVzLk1pbm9yR0M6Y29uc3QgZGVsdGE9ZXZlbnQuYXJnc1sndXNlZEhlYXBTaXplQmVmb3JlJ10tZXZlbnQuYXJnc1sndXNlZEhlYXBTaXplQWZ0ZXInXTtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDb2xsZWN0ZWQnKSxOdW1iZXIuYnl0ZXNUb1N0cmluZyhkZWx0YSkpO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuSlNGcmFtZTpjYXNlIHJlY29yZFR5cGVzLkZ1bmN0aW9uQ2FsbDpjb25zdCBkZXRhaWxzTm9kZT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuYnVpbGREZXRhaWxzTm9kZUZvclRyYWNlRXZlbnQoZXZlbnQsbW9kZWwudGFyZ2V0QnlFdmVudChldmVudCksbGlua2lmaWVyKTtpZihkZXRhaWxzTm9kZSkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KENvbW1vbi5VSVN0cmluZygnRnVuY3Rpb24nKSxkZXRhaWxzTm9kZSk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5UaW1lckZpcmU6Y2FzZSByZWNvcmRUeXBlcy5UaW1lckluc3RhbGw6Y2FzZSByZWNvcmRUeXBlcy5UaW1lclJlbW92ZTpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdUaW1lciBJRCcpLGV2ZW50RGF0YVsndGltZXJJZCddKTtpZihldmVudC5uYW1lPT09cmVjb3JkVHlwZXMuVGltZXJJbnN0YWxsKXtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdUaW1lb3V0JyksTnVtYmVyLm1pbGxpc1RvU3RyaW5nKGV2ZW50RGF0YVsndGltZW91dCddKSk7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnUmVwZWF0cycpLCFldmVudERhdGFbJ3NpbmdsZVNob3QnXSk7fQpicmVhaztjYXNlIHJlY29yZFR5cGVzLkZpcmVBbmltYXRpb25GcmFtZTpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDYWxsYmFjayBJRCcpLGV2ZW50RGF0YVsnaWQnXSk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5SZXNvdXJjZVNlbmRSZXF1ZXN0OmNhc2UgcmVjb3JkVHlwZXMuUmVzb3VyY2VSZWNlaXZlUmVzcG9uc2U6Y2FzZSByZWNvcmRUeXBlcy5SZXNvdXJjZVJlY2VpdmVkRGF0YTpjYXNlIHJlY29yZFR5cGVzLlJlc291cmNlRmluaXNoOnVybD10aW1lbGluZURhdGEudXJsO2lmKHVybCkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KENvbW1vbi5VSVN0cmluZygnUmVzb3VyY2UnKSxDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5VVJMKHVybCkpO2lmKGV2ZW50RGF0YVsncmVxdWVzdE1ldGhvZCddKQpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdSZXF1ZXN0IE1ldGhvZCcpLGV2ZW50RGF0YVsncmVxdWVzdE1ldGhvZCddKTtpZih0eXBlb2YgZXZlbnREYXRhWydzdGF0dXNDb2RlJ109PT0nbnVtYmVyJykKY29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnU3RhdHVzIENvZGUnKSxldmVudERhdGFbJ3N0YXR1c0NvZGUnXSk7aWYoZXZlbnREYXRhWydtaW1lVHlwZSddKQpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdNSU1FIFR5cGUnKSxldmVudERhdGFbJ21pbWVUeXBlJ10pO2lmKCdwcmlvcml0eSdpbiBldmVudERhdGEpe2NvbnN0IHByaW9yaXR5PVBlcmZVSS51aUxhYmVsRm9yTmV0d29ya1ByaW9yaXR5KGV2ZW50RGF0YVsncHJpb3JpdHknXSk7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnUHJpb3JpdHknKSxwcmlvcml0eSk7fQppZihldmVudERhdGFbJ2VuY29kZWREYXRhTGVuZ3RoJ10pe2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0VuY29kZWQgRGF0YScpLENvbW1vbi5VSVN0cmluZygnJWQgQnl0ZXMnLGV2ZW50RGF0YVsnZW5jb2RlZERhdGFMZW5ndGgnXSkpO30KaWYoZXZlbnREYXRhWydkZWNvZGVkQm9keUxlbmd0aCddKXtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdEZWNvZGVkIEJvZHknKSxDb21tb24uVUlTdHJpbmcoJyVkIEJ5dGVzJyxldmVudERhdGFbJ2RlY29kZWRCb2R5TGVuZ3RoJ10pKTt9CmJyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuQ29tcGlsZU1vZHVsZTpjb250ZW50SGVscGVyLmFwcGVuZExvY2F0aW9uUm93KENvbW1vbi5VSVN0cmluZygnTW9kdWxlJyksZXZlbnQuYXJnc1snZmlsZU5hbWUnXSwwKTticmVhaztjYXNlIHJlY29yZFR5cGVzLkNvbXBpbGVTY3JpcHQ6dXJsPWV2ZW50RGF0YSYmZXZlbnREYXRhWyd1cmwnXTtpZih1cmwpe2NvbnRlbnRIZWxwZXIuYXBwZW5kTG9jYXRpb25Sb3coQ29tbW9uLlVJU3RyaW5nKCdTY3JpcHQnKSx1cmwsZXZlbnREYXRhWydsaW5lTnVtYmVyJ10sZXZlbnREYXRhWydjb2x1bW5OdW1iZXInXSk7fQpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdTdHJlYW1lZCcpLENvbW1vbi5VSVN0cmluZygnJXMnLGV2ZW50RGF0YVsnc3RyZWFtZWQnXSkpO2NvbnN0IGNhY2hlUHJvZHVjZU9wdGlvbnM9ZXZlbnREYXRhJiZldmVudERhdGFbJ2NhY2hlUHJvZHVjZU9wdGlvbnMnXTtpZihjYWNoZVByb2R1Y2VPcHRpb25zKXtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDYWNoZSBQcm9kdWNlIE9wdGlvbnMnKSxDb21tb24uVUlTdHJpbmcoJyVzJyxjYWNoZVByb2R1Y2VPcHRpb25zKSk7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnUHJvZHVjZWQgQ2FjaGUgU2l6ZScpLENvbW1vbi5VSVN0cmluZygnJWQnLGV2ZW50RGF0YVsncHJvZHVjZWRDYWNoZVNpemUnXSkpO30KY29uc3QgY2FjaGVDb25zdW1lT3B0aW9ucz1ldmVudERhdGEmJmV2ZW50RGF0YVsnY2FjaGVDb25zdW1lT3B0aW9ucyddO2lmKGNhY2hlQ29uc3VtZU9wdGlvbnMpe2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0NhY2hlIENvbnN1bWUgT3B0aW9ucycpLENvbW1vbi5VSVN0cmluZygnJXMnLGNhY2hlQ29uc3VtZU9wdGlvbnMpKTtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDb25zdW1lZCBDYWNoZSBTaXplJyksQ29tbW9uLlVJU3RyaW5nKCclZCcsZXZlbnREYXRhWydjb25zdW1lZENhY2hlU2l6ZSddKSk7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnQ2FjaGUgUmVqZWN0ZWQnKSxDb21tb24uVUlTdHJpbmcoJyVzJyxldmVudERhdGFbJ2NhY2hlUmVqZWN0ZWQnXSkpO30KYnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5FdmFsdWF0ZVNjcmlwdDp1cmw9ZXZlbnREYXRhJiZldmVudERhdGFbJ3VybCddO2lmKHVybCl7Y29udGVudEhlbHBlci5hcHBlbmRMb2NhdGlvblJvdyhDb21tb24uVUlTdHJpbmcoJ1NjcmlwdCcpLHVybCxldmVudERhdGFbJ2xpbmVOdW1iZXInXSxldmVudERhdGFbJ2NvbHVtbk51bWJlciddKTt9CmJyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuUGFpbnQ6Y29uc3QgY2xpcD1ldmVudERhdGFbJ2NsaXAnXTtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdMb2NhdGlvbicpLENvbW1vbi5VSVN0cmluZygnKCVkLCAlZCknLGNsaXBbMF0sY2xpcFsxXSkpO2NvbnN0IGNsaXBXaWR0aD1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMucXVhZFdpZHRoKGNsaXApO2NvbnN0IGNsaXBIZWlnaHQ9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLnF1YWRIZWlnaHQoY2xpcCk7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnRGltZW5zaW9ucycpLENvbW1vbi5VSVN0cmluZygnJWQgw5cgJWQnLGNsaXBXaWR0aCxjbGlwSGVpZ2h0KSk7Y2FzZSByZWNvcmRUeXBlcy5QYWludFNldHVwOmNhc2UgcmVjb3JkVHlwZXMuUmFzdGVyaXplOmNhc2UgcmVjb3JkVHlwZXMuU2Nyb2xsTGF5ZXI6cmVsYXRlZE5vZGVMYWJlbD1Db21tb24uVUlTdHJpbmcoJ0xheWVyIFJvb3QnKTticmVhaztjYXNlIHJlY29yZFR5cGVzLlBhaW50SW1hZ2U6Y2FzZSByZWNvcmRUeXBlcy5EZWNvZGVMYXp5UGl4ZWxSZWY6Y2FzZSByZWNvcmRUeXBlcy5EZWNvZGVJbWFnZTpjYXNlIHJlY29yZFR5cGVzLlJlc2l6ZUltYWdlOmNhc2UgcmVjb3JkVHlwZXMuRHJhd0xhenlQaXhlbFJlZjpyZWxhdGVkTm9kZUxhYmVsPUNvbW1vbi5VSVN0cmluZygnT3duZXIgRWxlbWVudCcpO3VybD10aW1lbGluZURhdGEudXJsO2lmKHVybCkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KENvbW1vbi5VSVN0cmluZygnSW1hZ2UgVVJMJyksQ29tcG9uZW50cy5MaW5raWZpZXIubGlua2lmeVVSTCh1cmwpKTticmVhaztjYXNlIHJlY29yZFR5cGVzLlBhcnNlQXV0aG9yU3R5bGVTaGVldDp1cmw9ZXZlbnREYXRhWydzdHlsZVNoZWV0VXJsJ107aWYodXJsKQpjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3coQ29tbW9uLlVJU3RyaW5nKCdTdHlsZXNoZWV0IFVSTCcpLENvbXBvbmVudHMuTGlua2lmaWVyLmxpbmtpZnlVUkwodXJsKSk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5VcGRhdGVMYXlvdXRUcmVlOmNhc2UgcmVjb3JkVHlwZXMuUmVjYWxjdWxhdGVTdHlsZXM6Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnRWxlbWVudHMgQWZmZWN0ZWQnKSxldmVudC5hcmdzWydlbGVtZW50Q291bnQnXSk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5MYXlvdXQ6Y29uc3QgYmVnaW5EYXRhPWV2ZW50LmFyZ3NbJ2JlZ2luRGF0YSddO2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ05vZGVzIFRoYXQgTmVlZCBMYXlvdXQnKSxDb21tb24uVUlTdHJpbmcoJyVzIG9mICVzJyxiZWdpbkRhdGFbJ2RpcnR5T2JqZWN0cyddLGJlZ2luRGF0YVsndG90YWxPYmplY3RzJ10pKTtyZWxhdGVkTm9kZUxhYmVsPUNvbW1vbi5VSVN0cmluZygnTGF5b3V0IHJvb3QnKTticmVhaztjYXNlIHJlY29yZFR5cGVzLkNvbnNvbGVUaW1lOmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ01lc3NhZ2UnKSxldmVudC5uYW1lKTticmVhaztjYXNlIHJlY29yZFR5cGVzLldlYlNvY2tldENyZWF0ZTpjYXNlIHJlY29yZFR5cGVzLldlYlNvY2tldFNlbmRIYW5kc2hha2VSZXF1ZXN0OmNhc2UgcmVjb3JkVHlwZXMuV2ViU29ja2V0UmVjZWl2ZUhhbmRzaGFrZVJlc3BvbnNlOmNhc2UgcmVjb3JkVHlwZXMuV2ViU29ja2V0RGVzdHJveTpjb25zdCBpbml0aWF0b3JEYXRhPWluaXRpYXRvcj9pbml0aWF0b3IuYXJnc1snZGF0YSddOmV2ZW50RGF0YTtpZih0eXBlb2YgaW5pdGlhdG9yRGF0YVsnd2ViU29ja2V0VVJMJ10hPT0ndW5kZWZpbmVkJykKY29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnVVJMJyksaW5pdGlhdG9yRGF0YVsnd2ViU29ja2V0VVJMJ10pO2lmKHR5cGVvZiBpbml0aWF0b3JEYXRhWyd3ZWJTb2NrZXRQcm90b2NvbCddIT09J3VuZGVmaW5lZCcpCmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ1dlYlNvY2tldCBQcm90b2NvbCcpLGluaXRpYXRvckRhdGFbJ3dlYlNvY2tldFByb3RvY29sJ10pO2lmKHR5cGVvZiBldmVudERhdGFbJ21lc3NhZ2UnXSE9PSd1bmRlZmluZWQnKQpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdNZXNzYWdlJyksZXZlbnREYXRhWydtZXNzYWdlJ10pO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuRW1iZWRkZXJDYWxsYmFjazpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDYWxsYmFjayBGdW5jdGlvbicpLGV2ZW50RGF0YVsnY2FsbGJhY2tOYW1lJ10pO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuQW5pbWF0aW9uOmlmKGV2ZW50LnBoYXNlPT09U0RLLlRyYWNpbmdNb2RlbC5QaGFzZS5OZXN0YWJsZUFzeW5jSW5zdGFudCkKY29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnU3RhdGUnKSxldmVudERhdGFbJ3N0YXRlJ10pO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuUGFyc2VIVE1MOntjb25zdCBiZWdpbkRhdGE9ZXZlbnQuYXJnc1snYmVnaW5EYXRhJ107Y29uc3Qgc3RhcnRMaW5lPWJlZ2luRGF0YVsnc3RhcnRMaW5lJ10tMTtjb25zdCBlbmRMaW5lPWV2ZW50LmFyZ3NbJ2VuZERhdGEnXT9ldmVudC5hcmdzWydlbmREYXRhJ11bJ2VuZExpbmUnXS0xOnVuZGVmaW5lZDt1cmw9YmVnaW5EYXRhWyd1cmwnXTtpZih1cmwpCmNvbnRlbnRIZWxwZXIuYXBwZW5kTG9jYXRpb25SYW5nZShDb21tb24uVUlTdHJpbmcoJ1JhbmdlJyksdXJsLHN0YXJ0TGluZSxlbmRMaW5lKTticmVhazt9CmNhc2UgcmVjb3JkVHlwZXMuRmlyZUlkbGVDYWxsYmFjazpjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdBbGxvdHRlZCBUaW1lJyksTnVtYmVyLm1pbGxpc1RvU3RyaW5nKGV2ZW50RGF0YVsnYWxsb3R0ZWRNaWxsaXNlY29uZHMnXSkpO2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0ludm9rZWQgYnkgVGltZW91dCcpLGV2ZW50RGF0YVsndGltZWRPdXQnXSk7Y2FzZSByZWNvcmRUeXBlcy5SZXF1ZXN0SWRsZUNhbGxiYWNrOmNhc2UgcmVjb3JkVHlwZXMuQ2FuY2VsSWRsZUNhbGxiYWNrOmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0NhbGxiYWNrIElEJyksZXZlbnREYXRhWydpZCddKTticmVhaztjYXNlIHJlY29yZFR5cGVzLkV2ZW50RGlzcGF0Y2g6Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnVHlwZScpLGV2ZW50RGF0YVsndHlwZSddKTticmVhaztkZWZhdWx0Ontjb25zdCBkZXRhaWxzTm9kZT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuYnVpbGREZXRhaWxzTm9kZUZvclRyYWNlRXZlbnQoZXZlbnQsbW9kZWwudGFyZ2V0QnlFdmVudChldmVudCksbGlua2lmaWVyKTtpZihkZXRhaWxzTm9kZSkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KENvbW1vbi5VSVN0cmluZygnRGV0YWlscycpLGRldGFpbHNOb2RlKTticmVhazt9fQpUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX21heWJlQXBwZW5kUHJvZHVjdFRvRGV0YWlscyhjb250ZW50SGVscGVyLGJhZGdlUG9vbCx1cmx8fGV2ZW50RGF0YSYmZXZlbnREYXRhWyd1cmwnXSk7aWYodGltZWxpbmVEYXRhLnRpbWVXYWl0aW5nRm9yTWFpblRocmVhZCl7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnVGltZSBXYWl0aW5nIGZvciBNYWluIFRocmVhZCcpLE51bWJlci5taWxsaXNUb1N0cmluZyh0aW1lbGluZURhdGEudGltZVdhaXRpbmdGb3JNYWluVGhyZWFkLHRydWUpKTt9CmNvbnN0IHJlbGF0ZWROb2RlPXJlbGF0ZWROb2Rlc01hcCYmcmVsYXRlZE5vZGVzTWFwLmdldCh0aW1lbGluZURhdGEuYmFja2VuZE5vZGVJZCk7aWYocmVsYXRlZE5vZGUpe2NvbnN0IG5vZGVTcGFuPWF3YWl0IENvbW1vbi5MaW5raWZpZXIubGlua2lmeShyZWxhdGVkTm9kZSk7Y29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KHJlbGF0ZWROb2RlTGFiZWx8fENvbW1vbi5VSVN0cmluZygnUmVsYXRlZCBOb2RlJyksbm9kZVNwYW4pO30KaWYoZXZlbnRbVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9wcmV2aWV3RWxlbWVudFN5bWJvbF0pe2NvbnRlbnRIZWxwZXIuYWRkU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ1ByZXZpZXcnKSk7Y29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KCcnLGV2ZW50W1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fcHJldmlld0VsZW1lbnRTeW1ib2xdKTt9CmlmKGluaXRpYXRvcnx8dGltZWxpbmVEYXRhLnN0YWNrVHJhY2VGb3JTZWxmT3JJbml0aWF0b3IoKXx8VGltZWxpbmVNb2RlbC5JbnZhbGlkYXRpb25UcmFja2VyLmludmFsaWRhdGlvbkV2ZW50c0ZvcihldmVudCkpClRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fZ2VuZXJhdGVDYXVzZXMoZXZlbnQsbW9kZWwudGFyZ2V0QnlFdmVudChldmVudCkscmVsYXRlZE5vZGVzTWFwLGNvbnRlbnRIZWxwZXIpO2NvbnN0IHN0YXRzPXt9O2NvbnN0IHNob3dQaWVDaGFydD1kZXRhaWxlZCYmVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9hZ2dyZWdhdGVkU3RhdHNGb3JUcmFjZUV2ZW50KHN0YXRzLG1vZGVsLGV2ZW50KTtpZihzaG93UGllQ2hhcnQpe2NvbnRlbnRIZWxwZXIuYWRkU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0FnZ3JlZ2F0ZWQgVGltZScpKTtjb25zdCBwaWVDaGFydD1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZ2VuZXJhdGVQaWVDaGFydChzdGF0cyxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRTdHlsZShldmVudCkuY2F0ZWdvcnksZXZlbnQuc2VsZlRpbWUpO2NvbnRlbnRIZWxwZXIuYXBwZW5kRWxlbWVudFJvdygnJyxwaWVDaGFydCk7fQpyZXR1cm4gY29udGVudEhlbHBlci5mcmFnbWVudDt9CnN0YXRpYyBfbWF5YmVBcHBlbmRQcm9kdWN0VG9EZXRhaWxzKGNvbnRlbnRIZWxwZXIsYmFkZ2VQb29sLHVybCl7Y29uc3QgcGFyc2VkVVJMPXVybD91cmwuYXNQYXJzZWRVUkwoKTpudWxsO2lmKHBhcnNlZFVSTCkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KCcnLGJhZGdlUG9vbC5iYWRnZUZvclVSTChwYXJzZWRVUkwpKTt9CnN0YXRpYyBzdGF0c0ZvclRpbWVSYW5nZShldmVudHMsc3RhcnRUaW1lLGVuZFRpbWUpe2lmKCFldmVudHMubGVuZ3RoKQpyZXR1cm57J2lkbGUnOmVuZFRpbWUtc3RhcnRUaW1lfTtjb25zdCBzeW1ib2w9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9jYXRlZ29yeUJyZWFrZG93bkNhY2hlU3ltYm9sO1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fYnVpbGRSYW5nZVN0YXRzQ2FjaGVJZk5lZWRlZChldmVudHMpO2NvbnN0IGJlZm9yZT1maW5kQ2FjaGVkU3RhdHNBZnRlclRpbWUoc3RhcnRUaW1lKTtjb25zdCBzdGF0c0JlZm9yZT1zdWJ0cmFjdFN0YXRzKGJlZm9yZS5zdGF0cyxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX3Nsb3dTdGF0c0ZvclRpbWVSYW5nZShldmVudHMsc3RhcnRUaW1lLGJlZm9yZS50aW1lKSk7Y29uc3QgYWZ0ZXI9ZmluZENhY2hlZFN0YXRzQWZ0ZXJUaW1lKGVuZFRpbWUpO2NvbnN0IHN0YXRzQWZ0ZXI9c3VidHJhY3RTdGF0cyhhZnRlci5zdGF0cyxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX3Nsb3dTdGF0c0ZvclRpbWVSYW5nZShldmVudHMsZW5kVGltZSxhZnRlci50aW1lKSk7Y29uc3QgYWdncmVnYXRlZFN0YXRzPXN1YnRyYWN0U3RhdHMoc3RhdHNBZnRlcixzdGF0c0JlZm9yZSk7Y29uc3QgYWdncmVnYXRlZFRvdGFsPU9iamVjdC52YWx1ZXMoYWdncmVnYXRlZFN0YXRzKS5yZWR1Y2UoKGEsYik9PmErYiwwKTthZ2dyZWdhdGVkU3RhdHNbJ2lkbGUnXT1NYXRoLm1heCgwLGVuZFRpbWUtc3RhcnRUaW1lLWFnZ3JlZ2F0ZWRUb3RhbCk7cmV0dXJuIGFnZ3JlZ2F0ZWRTdGF0cztmdW5jdGlvbiBmaW5kQ2FjaGVkU3RhdHNBZnRlclRpbWUoYXRUaW1lKXtsZXQgaW5kZXg9ZXZlbnRzLmxvd2VyQm91bmQoYXRUaW1lLCh0aW1lLGV2ZW50KT0+dGltZS0oZXZlbnQuZW5kVGltZXx8ZXZlbnQuc3RhcnRUaW1lKSk7d2hpbGUoaW5kZXg8ZXZlbnRzLmxlbmd0aCYmIWV2ZW50c1tpbmRleF1bc3ltYm9sXSkKaW5kZXgrKztpZihpbmRleD09PWV2ZW50cy5sZW5ndGgpe2NvbnN0IGxhc3RFdmVudD1ldmVudHMucGVla0xhc3QoKTtyZXR1cm57dGltZTpsYXN0RXZlbnQuZW5kVGltZXx8bGFzdEV2ZW50LnN0YXJ0VGltZSxzdGF0czpldmVudHNbc3ltYm9sXX07fQpjb25zdCBldmVudD1ldmVudHNbaW5kZXhdO3JldHVybnt0aW1lOmV2ZW50LmVuZFRpbWV8fGV2ZW50LnN0YXJ0VGltZSxzdGF0czpldmVudFtzeW1ib2xdfTt9CmZ1bmN0aW9uIHN1YnRyYWN0U3RhdHMoYSxiKXtjb25zdCByZXN1bHQ9T2JqZWN0LmFzc2lnbih7fSxhKTtmb3IoY29uc3Qga2V5IGluIGIpCnJlc3VsdFtrZXldLT1iW2tleV07cmV0dXJuIHJlc3VsdDt9fQpzdGF0aWMgX3Nsb3dTdGF0c0ZvclRpbWVSYW5nZShldmVudHMsc3RhcnRUaW1lLGVuZFRpbWUpe2NvbnN0IHN0YXRzPXt9O2NvbnN0IG93blRpbWVzPVtdO1RpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5mb3JFYWNoRXZlbnQoZXZlbnRzLG9uU3RhcnRFdmVudCxvbkVuZEV2ZW50LHVuZGVmaW5lZCxzdGFydFRpbWUsZW5kVGltZSxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2ZpbHRlckZvclN0YXRzKCkpO2Z1bmN0aW9uIG9uU3RhcnRFdmVudChlKXtjb25zdCBkdXJhdGlvbj1NYXRoLm1pbihlLmVuZFRpbWUsZW5kVGltZSktTWF0aC5tYXgoZS5zdGFydFRpbWUsc3RhcnRUaW1lKTtpZihvd25UaW1lcy5sZW5ndGgpCm93blRpbWVzW293blRpbWVzLmxlbmd0aC0xXS09ZHVyYXRpb247b3duVGltZXMucHVzaChkdXJhdGlvbik7fQpmdW5jdGlvbiBvbkVuZEV2ZW50KGUpe2NvbnN0IGNhdGVnb3J5PVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFN0eWxlKGUpLmNhdGVnb3J5Lm5hbWU7c3RhdHNbY2F0ZWdvcnldPShzdGF0c1tjYXRlZ29yeV18fDApK293blRpbWVzLnBvcCgpO30KcmV0dXJuIHN0YXRzO30Kc3RhdGljIF9maWx0ZXJGb3JTdGF0cygpe2NvbnN0IHZpc2libGVFdmVudHNGaWx0ZXI9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLnZpc2libGVFdmVudHNGaWx0ZXIoKTtyZXR1cm4gZXZlbnQ9PnZpc2libGVFdmVudHNGaWx0ZXIuYWNjZXB0KGV2ZW50KXx8U0RLLlRyYWNpbmdNb2RlbC5pc1RvcExldmVsRXZlbnQoZXZlbnQpO30Kc3RhdGljIF9idWlsZFJhbmdlU3RhdHNDYWNoZUlmTmVlZGVkKGV2ZW50cyl7aWYoZXZlbnRzW1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fY2F0ZWdvcnlCcmVha2Rvd25DYWNoZVN5bWJvbF0pCnJldHVybjtjb25zdCBhZ2dyZWdhdGVkU3RhdHM9e307Y29uc3Qgb3duVGltZXM9W107VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLmZvckVhY2hFdmVudChldmVudHMsb25TdGFydEV2ZW50LG9uRW5kRXZlbnQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9maWx0ZXJGb3JTdGF0cygpKTtmdW5jdGlvbiBvblN0YXJ0RXZlbnQoZSl7aWYob3duVGltZXMubGVuZ3RoKQpvd25UaW1lc1tvd25UaW1lcy5sZW5ndGgtMV0tPWUuZHVyYXRpb247b3duVGltZXMucHVzaChlLmR1cmF0aW9uKTt9CmZ1bmN0aW9uIG9uRW5kRXZlbnQoZSl7Y29uc3QgY2F0ZWdvcnk9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50U3R5bGUoZSkuY2F0ZWdvcnkubmFtZTthZ2dyZWdhdGVkU3RhdHNbY2F0ZWdvcnldPShhZ2dyZWdhdGVkU3RhdHNbY2F0ZWdvcnldfHwwKStvd25UaW1lcy5wb3AoKTtpZighb3duVGltZXMubGVuZ3RoKQplW1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fY2F0ZWdvcnlCcmVha2Rvd25DYWNoZVN5bWJvbF09T2JqZWN0LmFzc2lnbih7fSxhZ2dyZWdhdGVkU3RhdHMpO30KY29uc3Qgb2JqPShldmVudHMpO29ialtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2NhdGVnb3J5QnJlYWtkb3duQ2FjaGVTeW1ib2xdPU9iamVjdC5hc3NpZ24oe30sYWdncmVnYXRlZFN0YXRzKTt9CnN0YXRpYyBhc3luYyBidWlsZE5ldHdvcmtSZXF1ZXN0RGV0YWlscyhyZXF1ZXN0LG1vZGVsLGxpbmtpZmllcixiYWRnZVBvb2wpe2NvbnN0IHRhcmdldD1tb2RlbC50YXJnZXRCeUV2ZW50KHJlcXVlc3QuY2hpbGRyZW5bMF0pO2NvbnN0IGNvbnRlbnRIZWxwZXI9bmV3IFRpbWVsaW5lLlRpbWVsaW5lRGV0YWlsc0NvbnRlbnRIZWxwZXIodGFyZ2V0LGxpbmtpZmllcik7Y29uc3QgY2F0ZWdvcnk9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLm5ldHdvcmtSZXF1ZXN0Q2F0ZWdvcnkocmVxdWVzdCk7Y29uc3QgY29sb3I9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLm5ldHdvcmtDYXRlZ29yeUNvbG9yKGNhdGVnb3J5KTtjb250ZW50SGVscGVyLmFkZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdOZXR3b3JrIHJlcXVlc3QnKSxjb2xvcik7Y29uc3QgZHVyYXRpb249cmVxdWVzdC5lbmRUaW1lLShyZXF1ZXN0LnN0YXJ0VGltZXx8LUluZmluaXR5KTtpZihyZXF1ZXN0LnVybCkKY29udGVudEhlbHBlci5hcHBlbmRFbGVtZW50Um93KENvbW1vbi5VSVN0cmluZygnVVJMJyksQ29tcG9uZW50cy5MaW5raWZpZXIubGlua2lmeVVSTChyZXF1ZXN0LnVybCkpO1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fbWF5YmVBcHBlbmRQcm9kdWN0VG9EZXRhaWxzKGNvbnRlbnRIZWxwZXIsYmFkZ2VQb29sLHJlcXVlc3QudXJsKTtpZihpc0Zpbml0ZShkdXJhdGlvbikpCmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0R1cmF0aW9uJyksTnVtYmVyLm1pbGxpc1RvU3RyaW5nKGR1cmF0aW9uLHRydWUpKTtpZihyZXF1ZXN0LnJlcXVlc3RNZXRob2QpCmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ1JlcXVlc3QgTWV0aG9kJykscmVxdWVzdC5yZXF1ZXN0TWV0aG9kKTtpZih0eXBlb2YgcmVxdWVzdC5wcmlvcml0eT09PSdzdHJpbmcnKXtjb25zdCBwcmlvcml0eT1QZXJmVUkudWlMYWJlbEZvck5ldHdvcmtQcmlvcml0eSgocmVxdWVzdC5wcmlvcml0eSkpO2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ1ByaW9yaXR5JykscHJpb3JpdHkpO30KaWYocmVxdWVzdC5taW1lVHlwZSkKY29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnTWltZSBUeXBlJykscmVxdWVzdC5taW1lVHlwZSk7bGV0IGxlbmd0aFRleHQ9Jyc7aWYocmVxdWVzdC5mcm9tQ2FjaGUpCmxlbmd0aFRleHQrPUNvbW1vbi5VSVN0cmluZygnIChmcm9tIGNhY2hlKScpO2lmKHJlcXVlc3QuZnJvbVNlcnZpY2VXb3JrZXIpCmxlbmd0aFRleHQrPUNvbW1vbi5VSVN0cmluZygnIChmcm9tIHNlcnZpY2Ugd29ya2VyKScpO2lmKHJlcXVlc3QuZW5jb2RlZERhdGFMZW5ndGh8fCFsZW5ndGhUZXh0KQpsZW5ndGhUZXh0PWAke051bWJlci5ieXRlc1RvU3RyaW5nKHJlcXVlc3QuZW5jb2RlZERhdGFMZW5ndGgpfSR7bGVuZ3RoVGV4dH1gO2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0VuY29kZWQgRGF0YScpLGxlbmd0aFRleHQpO2lmKHJlcXVlc3QuZGVjb2RlZEJvZHlMZW5ndGgpCmNvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ0RlY29kZWQgQm9keScpLE51bWJlci5ieXRlc1RvU3RyaW5nKHJlcXVlc3QuZGVjb2RlZEJvZHlMZW5ndGgpKTtjb25zdCB0aXRsZT1Db21tb24uVUlTdHJpbmcoJ0luaXRpYXRvcicpO2NvbnN0IHNlbmRSZXF1ZXN0PXJlcXVlc3QuY2hpbGRyZW5bMF07Y29uc3QgdG9wRnJhbWU9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoc2VuZFJlcXVlc3QpLnRvcEZyYW1lKCk7aWYodG9wRnJhbWUpe2NvbnN0IGxpbms9bGlua2lmaWVyLm1heWJlTGlua2lmeUNvbnNvbGVDYWxsRnJhbWUodGFyZ2V0LHRvcEZyYW1lKTtpZihsaW5rKQpjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3codGl0bGUsbGluayk7fWVsc2V7Y29uc3QgaW5pdGlhdG9yPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KHNlbmRSZXF1ZXN0KS5pbml0aWF0b3IoKTtpZihpbml0aWF0b3Ipe2NvbnN0IGluaXRpYXRvclVSTD1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChpbml0aWF0b3IpLnVybDtpZihpbml0aWF0b3JVUkwpe2NvbnN0IGxpbms9bGlua2lmaWVyLm1heWJlTGlua2lmeVNjcmlwdExvY2F0aW9uKHRhcmdldCxudWxsLGluaXRpYXRvclVSTCwwKTtpZihsaW5rKQpjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3codGl0bGUsbGluayk7fX19CmlmKCFyZXF1ZXN0LnByZXZpZXdFbGVtZW50JiZyZXF1ZXN0LnVybCYmdGFyZ2V0KQpyZXF1ZXN0LnByZXZpZXdFbGVtZW50PWF3YWl0IEJyb3dzZXJDb21wb25lbnRzLkltYWdlUHJldmlldy5idWlsZCh0YXJnZXQscmVxdWVzdC51cmwsZmFsc2UpO2lmKHJlcXVlc3QucHJldmlld0VsZW1lbnQpCmNvbnRlbnRIZWxwZXIuYXBwZW5kRWxlbWVudFJvdyhDb21tb24uVUlTdHJpbmcoJ1ByZXZpZXcnKSxyZXF1ZXN0LnByZXZpZXdFbGVtZW50KTtyZXR1cm4gY29udGVudEhlbHBlci5mcmFnbWVudDt9CnN0YXRpYyBfc3RhY2tUcmFjZUZyb21DYWxsRnJhbWVzKGNhbGxGcmFtZXMpe3JldHVybih7Y2FsbEZyYW1lczpjYWxsRnJhbWVzfSk7fQpzdGF0aWMgX2dlbmVyYXRlQ2F1c2VzKGV2ZW50LHRhcmdldCxyZWxhdGVkTm9kZXNNYXAsY29udGVudEhlbHBlcil7Y29uc3QgcmVjb3JkVHlwZXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGU7bGV0IGNhbGxTaXRlU3RhY2tMYWJlbDtsZXQgc3RhY2tMYWJlbDtzd2l0Y2goZXZlbnQubmFtZSl7Y2FzZSByZWNvcmRUeXBlcy5UaW1lckZpcmU6Y2FsbFNpdGVTdGFja0xhYmVsPUNvbW1vbi5VSVN0cmluZygnVGltZXIgSW5zdGFsbGVkJyk7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5GaXJlQW5pbWF0aW9uRnJhbWU6Y2FsbFNpdGVTdGFja0xhYmVsPUNvbW1vbi5VSVN0cmluZygnQW5pbWF0aW9uIEZyYW1lIFJlcXVlc3RlZCcpO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuRmlyZUlkbGVDYWxsYmFjazpjYWxsU2l0ZVN0YWNrTGFiZWw9Q29tbW9uLlVJU3RyaW5nKCdJZGxlIENhbGxiYWNrIFJlcXVlc3RlZCcpO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuVXBkYXRlTGF5b3V0VHJlZTpjYXNlIHJlY29yZFR5cGVzLlJlY2FsY3VsYXRlU3R5bGVzOnN0YWNrTGFiZWw9Q29tbW9uLlVJU3RyaW5nKCdSZWNhbGN1bGF0aW9uIEZvcmNlZCcpO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuTGF5b3V0OmNhbGxTaXRlU3RhY2tMYWJlbD1Db21tb24uVUlTdHJpbmcoJ0ZpcnN0IExheW91dCBJbnZhbGlkYXRpb24nKTtzdGFja0xhYmVsPUNvbW1vbi5VSVN0cmluZygnTGF5b3V0IEZvcmNlZCcpO2JyZWFrO30KY29uc3QgdGltZWxpbmVEYXRhPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGV2ZW50KTtpZih0aW1lbGluZURhdGEuc3RhY2tUcmFjZSYmdGltZWxpbmVEYXRhLnN0YWNrVHJhY2UubGVuZ3RoKXtjb250ZW50SGVscGVyLmFkZFNlY3Rpb24oQ29tbW9uLlVJU3RyaW5nKCdDYWxsIFN0YWNrcycpKTtjb250ZW50SGVscGVyLmFwcGVuZFN0YWNrVHJhY2Uoc3RhY2tMYWJlbHx8Q29tbW9uLlVJU3RyaW5nKCdTdGFjayBUcmFjZScpLFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fc3RhY2tUcmFjZUZyb21DYWxsRnJhbWVzKHRpbWVsaW5lRGF0YS5zdGFja1RyYWNlKSk7fQpjb25zdCBpbml0aWF0b3I9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpLmluaXRpYXRvcigpO2lmKFRpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5pbnZhbGlkYXRpb25FdmVudHNGb3IoZXZlbnQpJiZ0YXJnZXQpe2NvbnRlbnRIZWxwZXIuYWRkU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0ludmFsaWRhdGlvbnMnKSk7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9nZW5lcmF0ZUludmFsaWRhdGlvbnMoZXZlbnQsdGFyZ2V0LHJlbGF0ZWROb2Rlc01hcCxjb250ZW50SGVscGVyKTt9ZWxzZSBpZihpbml0aWF0b3Ipe2NvbnN0IGRlbGF5PWV2ZW50LnN0YXJ0VGltZS1pbml0aWF0b3Iuc3RhcnRUaW1lO2NvbnRlbnRIZWxwZXIuYXBwZW5kVGV4dFJvdyhDb21tb24uVUlTdHJpbmcoJ1BlbmRpbmcgZm9yJyksTnVtYmVyLnByZWNpc2VNaWxsaXNUb1N0cmluZyhkZWxheSwxKSk7Y29uc3QgbGluaz1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnZGV2dG9vbHMtbGluaycpO2xpbmsudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdyZXZlYWwnKTtsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywoKT0+e1RpbWVsaW5lLlRpbWVsaW5lUGFuZWwuaW5zdGFuY2UoKS5zZWxlY3QoVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uZnJvbVRyYWNlRXZlbnQoKGluaXRpYXRvcikpKTt9KTtjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3coQ29tbW9uLlVJU3RyaW5nKCdJbml0aWF0b3InKSxsaW5rKTtjb25zdCBpbml0aWF0b3JTdGFja1RyYWNlPVRpbWVsaW5lTW9kZWwuVGltZWxpbmVEYXRhLmZvckV2ZW50KGluaXRpYXRvcikuc3RhY2tUcmFjZTtpZihpbml0aWF0b3JTdGFja1RyYWNlKXtjb250ZW50SGVscGVyLmFwcGVuZFN0YWNrVHJhY2UoY2FsbFNpdGVTdGFja0xhYmVsfHxDb21tb24uVUlTdHJpbmcoJ0ZpcnN0IEludmFsaWRhdGVkJyksVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9zdGFja1RyYWNlRnJvbUNhbGxGcmFtZXMoaW5pdGlhdG9yU3RhY2tUcmFjZSkpO319fQpzdGF0aWMgX2dlbmVyYXRlSW52YWxpZGF0aW9ucyhldmVudCx0YXJnZXQscmVsYXRlZE5vZGVzTWFwLGNvbnRlbnRIZWxwZXIpe2NvbnN0IGludmFsaWRhdGlvblRyYWNraW5nRXZlbnRzPVRpbWVsaW5lTW9kZWwuSW52YWxpZGF0aW9uVHJhY2tlci5pbnZhbGlkYXRpb25FdmVudHNGb3IoZXZlbnQpO2NvbnN0IGludmFsaWRhdGlvbnM9e307aW52YWxpZGF0aW9uVHJhY2tpbmdFdmVudHMuZm9yRWFjaChmdW5jdGlvbihpbnZhbGlkYXRpb24pe2lmKCFpbnZhbGlkYXRpb25zW2ludmFsaWRhdGlvbi50eXBlXSkKaW52YWxpZGF0aW9uc1tpbnZhbGlkYXRpb24udHlwZV09W2ludmFsaWRhdGlvbl07ZWxzZQppbnZhbGlkYXRpb25zW2ludmFsaWRhdGlvbi50eXBlXS5wdXNoKGludmFsaWRhdGlvbik7fSk7T2JqZWN0LmtleXMoaW52YWxpZGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbih0eXBlKXtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2dlbmVyYXRlSW52YWxpZGF0aW9uc0ZvclR5cGUodHlwZSx0YXJnZXQsaW52YWxpZGF0aW9uc1t0eXBlXSxyZWxhdGVkTm9kZXNNYXAsY29udGVudEhlbHBlcik7fSk7fQpzdGF0aWMgX2dlbmVyYXRlSW52YWxpZGF0aW9uc0ZvclR5cGUodHlwZSx0YXJnZXQsaW52YWxpZGF0aW9ucyxyZWxhdGVkTm9kZXNNYXAsY29udGVudEhlbHBlcil7bGV0IHRpdGxlO3N3aXRjaCh0eXBlKXtjYXNlIFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5SZWNvcmRUeXBlLlN0eWxlUmVjYWxjSW52YWxpZGF0aW9uVHJhY2tpbmc6dGl0bGU9Q29tbW9uLlVJU3RyaW5nKCdTdHlsZSBJbnZhbGlkYXRpb25zJyk7YnJlYWs7Y2FzZSBUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5MYXlvdXRJbnZhbGlkYXRpb25UcmFja2luZzp0aXRsZT1Db21tb24uVUlTdHJpbmcoJ0xheW91dCBJbnZhbGlkYXRpb25zJyk7YnJlYWs7ZGVmYXVsdDp0aXRsZT1Db21tb24uVUlTdHJpbmcoJ090aGVyIEludmFsaWRhdGlvbnMnKTticmVhazt9CmNvbnN0IGludmFsaWRhdGlvbnNUcmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO2ludmFsaWRhdGlvbnNUcmVlT3V0bGluZS5yZWdpc3RlclJlcXVpcmVkQ1NTKCd0aW1lbGluZS9pbnZhbGlkYXRpb25zVHJlZS5jc3MnKTtpbnZhbGlkYXRpb25zVHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpbnZhbGlkYXRpb25zLXRyZWUnKTtjb25zdCBpbnZhbGlkYXRpb25Hcm91cHM9Z3JvdXBJbnZhbGlkYXRpb25zQnlDYXVzZShpbnZhbGlkYXRpb25zKTtpbnZhbGlkYXRpb25Hcm91cHMuZm9yRWFjaChmdW5jdGlvbihncm91cCl7Y29uc3QgZ3JvdXBFbGVtZW50PW5ldyBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuSW52YWxpZGF0aW9uc0dyb3VwRWxlbWVudCh0YXJnZXQscmVsYXRlZE5vZGVzTWFwLGNvbnRlbnRIZWxwZXIsZ3JvdXApO2ludmFsaWRhdGlvbnNUcmVlT3V0bGluZS5hcHBlbmRDaGlsZChncm91cEVsZW1lbnQpO30pO2NvbnRlbnRIZWxwZXIuYXBwZW5kRWxlbWVudFJvdyh0aXRsZSxpbnZhbGlkYXRpb25zVHJlZU91dGxpbmUuZWxlbWVudCxmYWxzZSx0cnVlKTtmdW5jdGlvbiBncm91cEludmFsaWRhdGlvbnNCeUNhdXNlKGludmFsaWRhdGlvbnMpe2NvbnN0IGNhdXNlVG9JbnZhbGlkYXRpb25NYXA9bmV3IE1hcCgpO2ZvcihsZXQgaW5kZXg9MDtpbmRleDxpbnZhbGlkYXRpb25zLmxlbmd0aDtpbmRleCsrKXtjb25zdCBpbnZhbGlkYXRpb249aW52YWxpZGF0aW9uc1tpbmRleF07bGV0IGNhdXNlS2V5PScnO2lmKGludmFsaWRhdGlvbi5jYXVzZS5yZWFzb24pCmNhdXNlS2V5Kz1pbnZhbGlkYXRpb24uY2F1c2UucmVhc29uKycuJztpZihpbnZhbGlkYXRpb24uY2F1c2Uuc3RhY2tUcmFjZSl7aW52YWxpZGF0aW9uLmNhdXNlLnN0YWNrVHJhY2UuZm9yRWFjaChmdW5jdGlvbihzdGFja0ZyYW1lKXtjYXVzZUtleSs9c3RhY2tGcmFtZVsnZnVuY3Rpb25OYW1lJ10rJy4nO2NhdXNlS2V5Kz1zdGFja0ZyYW1lWydzY3JpcHRJZCddKycuJztjYXVzZUtleSs9c3RhY2tGcmFtZVsndXJsJ10rJy4nO2NhdXNlS2V5Kz1zdGFja0ZyYW1lWydsaW5lTnVtYmVyJ10rJy4nO2NhdXNlS2V5Kz1zdGFja0ZyYW1lWydjb2x1bW5OdW1iZXInXSsnLic7fSk7fQppZihjYXVzZVRvSW52YWxpZGF0aW9uTWFwLmhhcyhjYXVzZUtleSkpCmNhdXNlVG9JbnZhbGlkYXRpb25NYXAuZ2V0KGNhdXNlS2V5KS5wdXNoKGludmFsaWRhdGlvbik7ZWxzZQpjYXVzZVRvSW52YWxpZGF0aW9uTWFwLnNldChjYXVzZUtleSxbaW52YWxpZGF0aW9uXSk7fQpyZXR1cm4gY2F1c2VUb0ludmFsaWRhdGlvbk1hcC52YWx1ZXNBcnJheSgpO319CnN0YXRpYyBfY29sbGVjdEludmFsaWRhdGlvbk5vZGVJZHMobm9kZUlkcyxpbnZhbGlkYXRpb25zKXtub2RlSWRzLmFkZEFsbChpbnZhbGlkYXRpb25zLm1hcChpbnZhbGlkYXRpb249PmludmFsaWRhdGlvbi5ub2RlSWQpLmZpbHRlcihpZD0+aWQpKTt9CnN0YXRpYyBfYWdncmVnYXRlZFN0YXRzRm9yVHJhY2VFdmVudCh0b3RhbCxtb2RlbCxldmVudCl7Y29uc3QgZXZlbnRzPW1vZGVsLmluc3BlY3RlZFRhcmdldEV2ZW50cygpO2Z1bmN0aW9uIGV2ZW50Q29tcGFyYXRvcihzdGFydFRpbWUsZSl7cmV0dXJuIHN0YXJ0VGltZS1lLnN0YXJ0VGltZTt9CmNvbnN0IGluZGV4PWV2ZW50cy5iaW5hcnlJbmRleE9mKGV2ZW50LnN0YXJ0VGltZSxldmVudENvbXBhcmF0b3IpO2lmKGluZGV4PDApCnJldHVybiBmYWxzZTtsZXQgaGFzQ2hpbGRyZW49ZmFsc2U7Y29uc3QgZW5kVGltZT1ldmVudC5lbmRUaW1lO2lmKGVuZFRpbWUpe2ZvcihsZXQgaT1pbmRleDtpPGV2ZW50cy5sZW5ndGg7aSsrKXtjb25zdCBuZXh0RXZlbnQ9ZXZlbnRzW2ldO2lmKG5leHRFdmVudC5zdGFydFRpbWU+PWVuZFRpbWUpCmJyZWFrO2lmKCFuZXh0RXZlbnQuc2VsZlRpbWUpCmNvbnRpbnVlO2lmKG5leHRFdmVudC50aHJlYWQhPT1ldmVudC50aHJlYWQpCmNvbnRpbnVlO2lmKGk+aW5kZXgpCmhhc0NoaWxkcmVuPXRydWU7Y29uc3QgY2F0ZWdvcnlOYW1lPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFN0eWxlKG5leHRFdmVudCkuY2F0ZWdvcnkubmFtZTt0b3RhbFtjYXRlZ29yeU5hbWVdPSh0b3RhbFtjYXRlZ29yeU5hbWVdfHwwKStuZXh0RXZlbnQuc2VsZlRpbWU7fX0KaWYoU0RLLlRyYWNpbmdNb2RlbC5pc0FzeW5jUGhhc2UoZXZlbnQucGhhc2UpKXtpZihldmVudC5lbmRUaW1lKXtsZXQgYWdncmVnYXRlZFRvdGFsPTA7Zm9yKGNvbnN0IGNhdGVnb3J5TmFtZSBpbiB0b3RhbCkKYWdncmVnYXRlZFRvdGFsKz10b3RhbFtjYXRlZ29yeU5hbWVdO3RvdGFsWydpZGxlJ109TWF0aC5tYXgoMCxldmVudC5lbmRUaW1lLWV2ZW50LnN0YXJ0VGltZS1hZ2dyZWdhdGVkVG90YWwpO30KcmV0dXJuIGZhbHNlO30KcmV0dXJuIGhhc0NoaWxkcmVuO30Kc3RhdGljIGFzeW5jIGJ1aWxkUGljdHVyZVByZXZpZXdDb250ZW50KGV2ZW50LHRhcmdldCl7Y29uc3Qgc25hcHNob3RXaXRoUmVjdD1hd2FpdCBuZXcgVGltZWxpbmVNb2RlbC5MYXllclBhaW50RXZlbnQoZXZlbnQsdGFyZ2V0KS5zbmFwc2hvdFByb21pc2UoKTtpZighc25hcHNob3RXaXRoUmVjdCkKcmV0dXJuIG51bGw7Y29uc3QgaW1hZ2VVUkxQcm9taXNlPXNuYXBzaG90V2l0aFJlY3Quc25hcHNob3QucmVwbGF5KCk7c25hcHNob3RXaXRoUmVjdC5zbmFwc2hvdC5yZWxlYXNlKCk7Y29uc3QgaW1hZ2VVUkw9YXdhaXQgaW1hZ2VVUkxQcm9taXNlO2lmKCFpbWFnZVVSTCkKcmV0dXJuIG51bGw7Y29uc3QgY29udGFpbmVyPWNyZWF0ZUVsZW1lbnQoJ2RpdicpO1VJLmFwcGVuZFN0eWxlKGNvbnRhaW5lciwnYnJvd3Nlcl9jb21wb25lbnRzL2ltYWdlUHJldmlldy5jc3MnKTtjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnaW1hZ2UtcHJldmlldy1jb250YWluZXInLCd2Ym94JywnbGluaycpO2NvbnN0IGltZz1jb250YWluZXIuY3JlYXRlQ2hpbGQoJ2ltZycpO2ltZy5zcmM9aW1hZ2VVUkw7Y29uc3QgcGFpbnRQcm9maWxlckJ1dHRvbj1jb250YWluZXIuY3JlYXRlQ2hpbGQoJ2EnKTtwYWludFByb2ZpbGVyQnV0dG9uLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnUGFpbnQgUHJvZmlsZXInKTtjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT5UaW1lbGluZS5UaW1lbGluZVBhbmVsLmluc3RhbmNlKCkuc2VsZWN0KFRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLmZyb21UcmFjZUV2ZW50KGV2ZW50KSksZmFsc2UpO3JldHVybiBjb250YWluZXI7fQpzdGF0aWMgY3JlYXRlRXZlbnREaXZpZGVyKGV2ZW50LHplcm9UaW1lKXtjb25zdCBldmVudERpdmlkZXI9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywncmVzb3VyY2VzLWV2ZW50LWRpdmlkZXInKTtjb25zdCBzdGFydFRpbWU9TnVtYmVyLm1pbGxpc1RvU3RyaW5nKGV2ZW50LnN0YXJ0VGltZS16ZXJvVGltZSk7ZXZlbnREaXZpZGVyLnRpdGxlPUNvbW1vbi5VSVN0cmluZygnJXMgYXQgJXMnLFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5ldmVudFRpdGxlKGV2ZW50KSxzdGFydFRpbWUpO2NvbnN0IHN0eWxlPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5tYXJrZXJTdHlsZUZvckV2ZW50KGV2ZW50KTtpZihzdHlsZS50YWxsKQpldmVudERpdmlkZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPXN0eWxlLmNvbG9yO3JldHVybiBldmVudERpdmlkZXI7fQpzdGF0aWMgX3Zpc2libGVUeXBlcygpe2NvbnN0IGV2ZW50U3R5bGVzPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5faW5pdEV2ZW50U3R5bGVzKCk7Y29uc3QgcmVzdWx0PVtdO2Zvcihjb25zdCBuYW1lIGluIGV2ZW50U3R5bGVzKXtpZighZXZlbnRTdHlsZXNbbmFtZV0uaGlkZGVuKQpyZXN1bHQucHVzaChuYW1lKTt9CnJldHVybiByZXN1bHQ7fQpzdGF0aWMgdmlzaWJsZUV2ZW50c0ZpbHRlcigpe3JldHVybiBuZXcgVGltZWxpbmVNb2RlbC5UaW1lbGluZVZpc2libGVFdmVudHNGaWx0ZXIoVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl92aXNpYmxlVHlwZXMoKSk7fQpzdGF0aWMgcGFpbnRFdmVudHNGaWx0ZXIoKXtjb25zdCByZWNvcmRUeXBlcz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtyZXR1cm4gbmV3IFRpbWVsaW5lTW9kZWwuVGltZWxpbmVJbnZpc2libGVFdmVudHNGaWx0ZXIoIVJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCd0aW1lbGluZVBhaW50VGltaW5nTWFya2VycycpP1tyZWNvcmRUeXBlcy5NYXJrRkNQLHJlY29yZFR5cGVzLk1hcmtGTVAscmVjb3JkVHlwZXMuTWFya0ZNUENhbmRpZGF0ZV06W10pO30Kc3RhdGljIGNhdGVnb3JpZXMoKXtpZihUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2NhdGVnb3JpZXMpCnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2NhdGVnb3JpZXM7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9jYXRlZ29yaWVzPXtsb2FkaW5nOm5ldyBUaW1lbGluZS5UaW1lbGluZUNhdGVnb3J5KCdsb2FkaW5nJyxDb21tb24uVUlTdHJpbmcoJ0xvYWRpbmcnKSx0cnVlLCdoc2woMjE0LCA2NyUsIDc0JSknLCdoc2woMjE0LCA2NyUsIDY2JSknKSxzY3JpcHRpbmc6bmV3IFRpbWVsaW5lLlRpbWVsaW5lQ2F0ZWdvcnkoJ3NjcmlwdGluZycsQ29tbW9uLlVJU3RyaW5nKCdTY3JpcHRpbmcnKSx0cnVlLCdoc2woNDMsIDgzJSwgNzIlKScsJ2hzbCg0MywgODMlLCA2NCUpICcpLHJlbmRlcmluZzpuZXcgVGltZWxpbmUuVGltZWxpbmVDYXRlZ29yeSgncmVuZGVyaW5nJyxDb21tb24uVUlTdHJpbmcoJ1JlbmRlcmluZycpLHRydWUsJ2hzbCgyNTYsIDY3JSwgNzYlKScsJ2hzbCgyNTYsIDY3JSwgNzAlKScpLHBhaW50aW5nOm5ldyBUaW1lbGluZS5UaW1lbGluZUNhdGVnb3J5KCdwYWludGluZycsQ29tbW9uLlVJU3RyaW5nKCdQYWludGluZycpLHRydWUsJ2hzbCgxMDksIDMzJSwgNjQlKScsJ2hzbCgxMDksIDMzJSwgNTUlKScpLGdwdTpuZXcgVGltZWxpbmUuVGltZWxpbmVDYXRlZ29yeSgnZ3B1JyxDb21tb24uVUlTdHJpbmcoJ0dQVScpLGZhbHNlLCdoc2woMTA5LCAzMyUsIDY0JSknLCdoc2woMTA5LCAzMyUsIDU1JSknKSxhc3luYzpuZXcgVGltZWxpbmUuVGltZWxpbmVDYXRlZ29yeSgnYXN5bmMnLENvbW1vbi5VSVN0cmluZygnQXN5bmMnKSxmYWxzZSwnaHNsKDAsIDEwMCUsIDUwJSknLCdoc2woMCwgMTAwJSwgNDAlKScpLG90aGVyOm5ldyBUaW1lbGluZS5UaW1lbGluZUNhdGVnb3J5KCdvdGhlcicsQ29tbW9uLlVJU3RyaW5nKCdPdGhlcicpLGZhbHNlLCdoc2woMCwgMCUsIDg3JSknLCdoc2woMCwgMCUsIDc5JSknKSxpZGxlOm5ldyBUaW1lbGluZS5UaW1lbGluZUNhdGVnb3J5KCdpZGxlJyxDb21tb24uVUlTdHJpbmcoJ0lkbGUnKSxmYWxzZSwnaHNsKDAsIDAlLCA5OCUpJywnaHNsKDAsIDAlLCA5OCUpJyl9O3JldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2NhdGVnb3JpZXM7fQpzdGF0aWMgZ2VuZXJhdGVQaWVDaGFydChhZ2dyZWdhdGVkU3RhdHMsc2VsZkNhdGVnb3J5LHNlbGZUaW1lKXtsZXQgdG90YWw9MDtmb3IoY29uc3QgY2F0ZWdvcnlOYW1lIGluIGFnZ3JlZ2F0ZWRTdGF0cykKdG90YWwrPWFnZ3JlZ2F0ZWRTdGF0c1tjYXRlZ29yeU5hbWVdO2NvbnN0IGVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXBpZS1jaGFydC13cmFwcGVyIGhib3gnKTtjb25zdCBwaWVDaGFydD1uZXcgUGVyZlVJLlBpZUNoYXJ0KDExMCx2YWx1ZT0+TnVtYmVyLnByZWNpc2VNaWxsaXNUb1N0cmluZyh2YWx1ZSksdHJ1ZSk7cGllQ2hhcnQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1kZXRhaWxzLXZpZXctcGllLWNoYXJ0Jyk7cGllQ2hhcnQuc2V0VG90YWwodG90YWwpO2NvbnN0IHBpZUNoYXJ0Q29udGFpbmVyPWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Zib3gnKTtwaWVDaGFydENvbnRhaW5lci5hcHBlbmRDaGlsZChwaWVDaGFydC5lbGVtZW50KTtjb25zdCBmb290ZXJFbGVtZW50PWVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWFnZ3JlZ2F0ZWQtaW5mby1sZWdlbmQnKTtmdW5jdGlvbiBhcHBlbmRMZWdlbmRSb3cobmFtZSx0aXRsZSx2YWx1ZSxjb2xvcil7aWYoIXZhbHVlKQpyZXR1cm47cGllQ2hhcnQuYWRkU2xpY2UodmFsdWUsY29sb3IpO2NvbnN0IHJvd0VsZW1lbnQ9Zm9vdGVyRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jyk7cm93RWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3RpbWVsaW5lLWFnZ3JlZ2F0ZWQtbGVnZW5kLXZhbHVlJykudGV4dENvbnRlbnQ9TnVtYmVyLnByZWNpc2VNaWxsaXNUb1N0cmluZyh2YWx1ZSwxKTtyb3dFbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywndGltZWxpbmUtYWdncmVnYXRlZC1sZWdlbmQtc3dhdGNoJykuc3R5bGUuYmFja2dyb3VuZENvbG9yPWNvbG9yO3Jvd0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ3NwYW4nLCd0aW1lbGluZS1hZ2dyZWdhdGVkLWxlZ2VuZC10aXRsZScpLnRleHRDb250ZW50PXRpdGxlO30KaWYoc2VsZkNhdGVnb3J5KXtpZihzZWxmVGltZSl7YXBwZW5kTGVnZW5kUm93KHNlbGZDYXRlZ29yeS5uYW1lLENvbW1vbi5VSVN0cmluZygnJXMgKHNlbGYpJyxzZWxmQ2F0ZWdvcnkudGl0bGUpLHNlbGZUaW1lLHNlbGZDYXRlZ29yeS5jb2xvcik7fQpjb25zdCBjYXRlZ29yeVRpbWU9YWdncmVnYXRlZFN0YXRzW3NlbGZDYXRlZ29yeS5uYW1lXTtjb25zdCB2YWx1ZT1jYXRlZ29yeVRpbWUtc2VsZlRpbWU7aWYodmFsdWU+MCl7YXBwZW5kTGVnZW5kUm93KHNlbGZDYXRlZ29yeS5uYW1lLENvbW1vbi5VSVN0cmluZygnJXMgKGNoaWxkcmVuKScsc2VsZkNhdGVnb3J5LnRpdGxlKSx2YWx1ZSxzZWxmQ2F0ZWdvcnkuY2hpbGRDb2xvcik7fX0KZm9yKGNvbnN0IGNhdGVnb3J5TmFtZSBpbiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY2F0ZWdvcmllcygpKXtjb25zdCBjYXRlZ29yeT1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY2F0ZWdvcmllcygpW2NhdGVnb3J5TmFtZV07aWYoY2F0ZWdvcnk9PT1zZWxmQ2F0ZWdvcnkpCmNvbnRpbnVlO2FwcGVuZExlZ2VuZFJvdyhjYXRlZ29yeS5uYW1lLGNhdGVnb3J5LnRpdGxlLGFnZ3JlZ2F0ZWRTdGF0c1tjYXRlZ29yeS5uYW1lXSxjYXRlZ29yeS5jaGlsZENvbG9yKTt9CnJldHVybiBlbGVtZW50O30Kc3RhdGljIGdlbmVyYXRlRGV0YWlsc0NvbnRlbnRGb3JGcmFtZShmcmFtZSxmaWxtU3RyaXBGcmFtZSl7Y29uc3QgY29udGVudEhlbHBlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVEZXRhaWxzQ29udGVudEhlbHBlcihudWxsLG51bGwpO2NvbnRlbnRIZWxwZXIuYWRkU2VjdGlvbihDb21tb24uVUlTdHJpbmcoJ0ZyYW1lJykpO2NvbnN0IGR1cmF0aW9uPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5mcmFtZUR1cmF0aW9uKGZyYW1lKTtjb250ZW50SGVscGVyLmFwcGVuZEVsZW1lbnRSb3coQ29tbW9uLlVJU3RyaW5nKCdEdXJhdGlvbicpLGR1cmF0aW9uLGZyYW1lLmhhc1dhcm5pbmdzKCkpO2NvbnN0IGR1cmF0aW9uSW5NaWxsaXM9ZnJhbWUuZW5kVGltZS1mcmFtZS5zdGFydFRpbWU7Y29udGVudEhlbHBlci5hcHBlbmRUZXh0Um93KENvbW1vbi5VSVN0cmluZygnRlBTJyksTWF0aC5mbG9vcigxMDAwL2R1cmF0aW9uSW5NaWxsaXMpKTtjb250ZW50SGVscGVyLmFwcGVuZFRleHRSb3coQ29tbW9uLlVJU3RyaW5nKCdDUFUgdGltZScpLE51bWJlci5taWxsaXNUb1N0cmluZyhmcmFtZS5jcHVUaW1lLHRydWUpKTtpZihmaWxtU3RyaXBGcmFtZSl7Y29uc3QgZmlsbVN0cmlwUHJldmlldz1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd0aW1lbGluZS1maWxtc3RyaXAtcHJldmlldycpO2ZpbG1TdHJpcEZyYW1lLmltYWdlRGF0YVByb21pc2UoKS50aGVuKGRhdGE9PlVJLmxvYWRJbWFnZUZyb21EYXRhKGRhdGEpKS50aGVuKGltYWdlPT5pbWFnZSYmZmlsbVN0cmlwUHJldmlldy5hcHBlbmRDaGlsZChpbWFnZSkpO2NvbnRlbnRIZWxwZXIuYXBwZW5kRWxlbWVudFJvdygnJyxmaWxtU3RyaXBQcmV2aWV3KTtmaWxtU3RyaXBQcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmcmFtZUNsaWNrZWQuYmluZChudWxsLGZpbG1TdHJpcEZyYW1lKSxmYWxzZSk7fQppZihmcmFtZS5sYXllclRyZWUpe2NvbnRlbnRIZWxwZXIuYXBwZW5kRWxlbWVudFJvdyhDb21tb24uVUlTdHJpbmcoJ0xheWVyIHRyZWUnKSxDb21wb25lbnRzLkxpbmtpZmllci5saW5raWZ5UmV2ZWFsYWJsZShmcmFtZS5sYXllclRyZWUsQ29tbW9uLlVJU3RyaW5nKCdzaG93JykpKTt9CmZ1bmN0aW9uIGZyYW1lQ2xpY2tlZChmaWxtU3RyaXBGcmFtZSl7bmV3IFBlcmZVSS5GaWxtU3RyaXBWaWV3LkRpYWxvZyhmaWxtU3RyaXBGcmFtZSwwKTt9CnJldHVybiBjb250ZW50SGVscGVyLmZyYWdtZW50O30Kc3RhdGljIGZyYW1lRHVyYXRpb24oZnJhbWUpe2NvbnN0IGR1cmF0aW9uVGV4dD1Db21tb24uVUlTdHJpbmcoJyVzIChhdCAlcyknLE51bWJlci5taWxsaXNUb1N0cmluZyhmcmFtZS5lbmRUaW1lLWZyYW1lLnN0YXJ0VGltZSx0cnVlKSxOdW1iZXIubWlsbGlzVG9TdHJpbmcoZnJhbWUuc3RhcnRUaW1lT2Zmc2V0LHRydWUpKTtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtlbGVtZW50LmNyZWF0ZVRleHRDaGlsZChkdXJhdGlvblRleHQpO2lmKCFmcmFtZS5oYXNXYXJuaW5ncygpKQpyZXR1cm4gZWxlbWVudDtlbGVtZW50LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJy4gTG9uZyBmcmFtZSB0aW1lcyBhcmUgYW4gaW5kaWNhdGlvbiBvZiAnKSk7ZWxlbWVudC5hcHBlbmRDaGlsZChVSS5YTGluay5jcmVhdGUoJ2h0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvcGVyZm9ybWFuY2UvcmVuZGVyaW5nLycsQ29tbW9uLlVJU3RyaW5nKCdqYW5rJykpKTtlbGVtZW50LmNyZWF0ZVRleHRDaGlsZCgnLicpO3JldHVybiBlbGVtZW50O30Kc3RhdGljIGNyZWF0ZUZpbGxTdHlsZShjb250ZXh0LHdpZHRoLGhlaWdodCxjb2xvcjAsY29sb3IxLGNvbG9yMil7Y29uc3QgZ3JhZGllbnQ9Y29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLDAsd2lkdGgsaGVpZ2h0KTtncmFkaWVudC5hZGRDb2xvclN0b3AoMCxjb2xvcjApO2dyYWRpZW50LmFkZENvbG9yU3RvcCgwLjI1LGNvbG9yMSk7Z3JhZGllbnQuYWRkQ29sb3JTdG9wKDAuNzUsY29sb3IxKTtncmFkaWVudC5hZGRDb2xvclN0b3AoMSxjb2xvcjIpO3JldHVybiBncmFkaWVudDt9CnN0YXRpYyBxdWFkV2lkdGgocXVhZCl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KHF1YWRbMF0tcXVhZFsyXSwyKStNYXRoLnBvdyhxdWFkWzFdLXF1YWRbM10sMikpKTt9CnN0YXRpYyBxdWFkSGVpZ2h0KHF1YWQpe3JldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyhxdWFkWzBdLXF1YWRbNl0sMikrTWF0aC5wb3cocXVhZFsxXS1xdWFkWzddLDIpKSk7fQpzdGF0aWMgZXZlbnREaXNwYXRjaERlc2NpcHRvcnMoKXtpZihUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2V2ZW50RGlzcGF0Y2hEZXNjaXB0b3JzKQpyZXR1cm4gVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9ldmVudERpc3BhdGNoRGVzY2lwdG9ycztjb25zdCBsaWdodE9yYW5nZT0naHNsKDQwLDEwMCUsODAlKSc7Y29uc3Qgb3JhbmdlPSdoc2woNDAsMTAwJSw1MCUpJztjb25zdCBncmVlbj0naHNsKDkwLDEwMCUsNDAlKSc7Y29uc3QgcHVycGxlPSdoc2woMjU2LDEwMCUsNzUlKSc7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9ldmVudERpc3BhdGNoRGVzY2lwdG9ycz1bbmV3IFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5FdmVudERpc3BhdGNoVHlwZURlc2NyaXB0b3IoMSxsaWdodE9yYW5nZSxbJ21vdXNlbW92ZScsJ21vdXNlZW50ZXInLCdtb3VzZWxlYXZlJywnbW91c2VvdXQnLCdtb3VzZW92ZXInXSksbmV3IFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5FdmVudERpc3BhdGNoVHlwZURlc2NyaXB0b3IoMSxsaWdodE9yYW5nZSxbJ3BvaW50ZXJvdmVyJywncG9pbnRlcm91dCcsJ3BvaW50ZXJlbnRlcicsJ3BvaW50ZXJsZWF2ZScsJ3BvaW50ZXJtb3ZlJ10pLG5ldyBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuRXZlbnREaXNwYXRjaFR5cGVEZXNjcmlwdG9yKDIsZ3JlZW4sWyd3aGVlbCddKSxuZXcgVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLkV2ZW50RGlzcGF0Y2hUeXBlRGVzY3JpcHRvcigzLG9yYW5nZSxbJ2NsaWNrJywnbW91c2Vkb3duJywnbW91c2V1cCddKSxuZXcgVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLkV2ZW50RGlzcGF0Y2hUeXBlRGVzY3JpcHRvcigzLG9yYW5nZSxbJ3RvdWNoc3RhcnQnLCd0b3VjaGVuZCcsJ3RvdWNobW92ZScsJ3RvdWNoY2FuY2VsJ10pLG5ldyBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuRXZlbnREaXNwYXRjaFR5cGVEZXNjcmlwdG9yKDMsb3JhbmdlLFsncG9pbnRlcmRvd24nLCdwb2ludGVydXAnLCdwb2ludGVyY2FuY2VsJywnZ290cG9pbnRlcmNhcHR1cmUnLCdsb3N0cG9pbnRlcmNhcHR1cmUnXSksbmV3IFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5FdmVudERpc3BhdGNoVHlwZURlc2NyaXB0b3IoMyxwdXJwbGUsWydrZXlkb3duJywna2V5dXAnLCdrZXlwcmVzcyddKV07cmV0dXJuIFRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5fZXZlbnREaXNwYXRjaERlc2NpcHRvcnM7fQpzdGF0aWMgbWFya2VyU3R5bGVGb3JFdmVudChldmVudCl7Y29uc3QgdGFsbE1hcmtlckRhc2hTdHlsZT1bMTAsNV07Y29uc3QgdGl0bGU9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmV2ZW50VGl0bGUoZXZlbnQpO2lmKGV2ZW50Lmhhc0NhdGVnb3J5KFRpbWVsaW5lTW9kZWwuVGltZWxpbmVNb2RlbC5DYXRlZ29yeS5Db25zb2xlKXx8ZXZlbnQuaGFzQ2F0ZWdvcnkoVGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLkNhdGVnb3J5LlVzZXJUaW1pbmcpKXtyZXR1cm57dGl0bGU6dGl0bGUsZGFzaFN0eWxlOnRhbGxNYXJrZXJEYXNoU3R5bGUsbGluZVdpZHRoOjAuNSxjb2xvcjpldmVudC5oYXNDYXRlZ29yeShUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQ2F0ZWdvcnkuVXNlclRpbWluZyk/J3B1cnBsZSc6J29yYW5nZScsdGFsbDpmYWxzZSxsb3dQcmlvcml0eTpmYWxzZSx9O30KY29uc3QgcmVjb3JkVHlwZXM9VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGU7bGV0IHRhbGw9ZmFsc2U7bGV0IGNvbG9yPSdncmV5Jztzd2l0Y2goZXZlbnQubmFtZSl7Y2FzZSByZWNvcmRUeXBlcy5GcmFtZVN0YXJ0ZWRMb2FkaW5nOmNvbG9yPSdncmVlbic7dGFsbD10cnVlO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuTWFya0RPTUNvbnRlbnQ6Y29sb3I9J2JsdWUnO3RhbGw9dHJ1ZTticmVhaztjYXNlIHJlY29yZFR5cGVzLk1hcmtMb2FkOmNvbG9yPSdyZWQnO3RhbGw9dHJ1ZTticmVhaztjYXNlIHJlY29yZFR5cGVzLk1hcmtGaXJzdFBhaW50OmNvbG9yPSdoc2woMTgwLCA0NSUsIDc5JSknO3RhbGw9dHJ1ZTticmVhaztjYXNlIHJlY29yZFR5cGVzLk1hcmtGQ1A6Y29sb3I9J2hzbCgxNjAsIDQzJSwgNTglKSc7dGFsbD10cnVlO2JyZWFrO2Nhc2UgcmVjb3JkVHlwZXMuTWFya0ZNUENhbmRpZGF0ZTpjb2xvcj0naHNsKDE0NiwgNTclLCA0MCUpJzt0YWxsPXRydWU7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5NYXJrRk1QOmNvbG9yPSdoc2woMTQ0LCAxMDAlLCAyMSUpJzt0YWxsPXRydWU7YnJlYWs7Y2FzZSByZWNvcmRUeXBlcy5UaW1lU3RhbXA6Y29sb3I9J29yYW5nZSc7YnJlYWs7fQpyZXR1cm57dGl0bGU6dGl0bGUsZGFzaFN0eWxlOnRhbGxNYXJrZXJEYXNoU3R5bGUsbGluZVdpZHRoOjAuNSxjb2xvcjpjb2xvcix0YWxsOnRhbGwsbG93UHJpb3JpdHk6ZmFsc2UsfTt9CnN0YXRpYyBtYXJrZXJTdHlsZUZvckZyYW1lKCl7cmV0dXJue3RpdGxlOkNvbW1vbi5VSVN0cmluZygnRnJhbWUnKSxjb2xvcjoncmdiYSgxMDAsIDEwMCwgMTAwLCAwLjQpJyxsaW5lV2lkdGg6MyxkYXNoU3R5bGU6WzNdLHRhbGw6dHJ1ZSxsb3dQcmlvcml0eTp0cnVlfTt9CnN0YXRpYyBjb2xvckZvcklkKGlkKXtpZighVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNvbG9yRm9ySWQuX2NvbG9yR2VuZXJhdG9yKXtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY29sb3JGb3JJZC5fY29sb3JHZW5lcmF0b3I9bmV3IENvbW1vbi5Db2xvci5HZW5lcmF0b3Ioe21pbjozMCxtYXg6MzMwfSx7bWluOjUwLG1heDo4MCxjb3VudDozfSw4NSk7VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmNvbG9yRm9ySWQuX2NvbG9yR2VuZXJhdG9yLnNldENvbG9yRm9ySUQoJycsJyNmMmVjZGMnKTt9CnJldHVybiBUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY29sb3JGb3JJZC5fY29sb3JHZW5lcmF0b3IuY29sb3JGb3JJRChpZCk7fQpzdGF0aWMgZXZlbnRXYXJuaW5nKGV2ZW50LHdhcm5pbmdUeXBlKXtjb25zdCB0aW1lbGluZURhdGE9VGltZWxpbmVNb2RlbC5UaW1lbGluZURhdGEuZm9yRXZlbnQoZXZlbnQpO2NvbnN0IHdhcm5pbmc9d2FybmluZ1R5cGV8fHRpbWVsaW5lRGF0YS53YXJuaW5nO2lmKCF3YXJuaW5nKQpyZXR1cm4gbnVsbDtjb25zdCB3YXJuaW5ncz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuV2FybmluZ1R5cGU7Y29uc3Qgc3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7Y29uc3QgZXZlbnREYXRhPWV2ZW50LmFyZ3NbJ2RhdGEnXTtzd2l0Y2god2FybmluZyl7Y2FzZSB3YXJuaW5ncy5Gb3JjZWRTdHlsZTpjYXNlIHdhcm5pbmdzLkZvcmNlZExheW91dDpzcGFuLmFwcGVuZENoaWxkKFVJLmNyZWF0ZURvY3VtZW50YXRpb25MaW5rKCcuLi8uLi9mdW5kYW1lbnRhbHMvcGVyZm9ybWFuY2UvcmVuZGVyaW5nL2F2b2lkLWxhcmdlLWNvbXBsZXgtbGF5b3V0cy1hbmQtbGF5b3V0LXRocmFzaGluZyNhdm9pZC1mb3JjZWQtc3luY2hyb25vdXMtbGF5b3V0cycsQ29tbW9uLlVJU3RyaW5nKCdGb3JjZWQgcmVmbG93JykpKTtzcGFuLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJyBpcyBhIGxpa2VseSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrLicpKTticmVhaztjYXNlIHdhcm5pbmdzLklkbGVEZWFkbGluZUV4Y2VlZGVkOnNwYW4udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdJZGxlIGNhbGxiYWNrIGV4ZWN1dGlvbiBleHRlbmRlZCBiZXlvbmQgZGVhZGxpbmUgYnkgJysKTnVtYmVyLm1pbGxpc1RvU3RyaW5nKGV2ZW50LmR1cmF0aW9uLWV2ZW50RGF0YVsnYWxsb3R0ZWRNaWxsaXNlY29uZHMnXSx0cnVlKSk7YnJlYWs7Y2FzZSB3YXJuaW5ncy5Mb25nSGFuZGxlcjpzcGFuLnRleHRDb250ZW50PUNvbW1vbi5VSVN0cmluZygnSGFuZGxlciB0b29rICVzJyxOdW1iZXIubWlsbGlzVG9TdHJpbmcoZXZlbnQuZHVyYXRpb24sdHJ1ZSkpO2JyZWFrO2Nhc2Ugd2FybmluZ3MuTG9uZ1JlY3VycmluZ0hhbmRsZXI6c3Bhbi50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1JlY3VycmluZyBoYW5kbGVyIHRvb2sgJXMnLE51bWJlci5taWxsaXNUb1N0cmluZyhldmVudC5kdXJhdGlvbix0cnVlKSk7YnJlYWs7Y2FzZSB3YXJuaW5ncy5WOERlb3B0OnNwYW4uYXBwZW5kQ2hpbGQoVUkuWExpbmsuY3JlYXRlKCdodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL2RldnRvb2xzLWRvY3MvaXNzdWVzLzUzJyxDb21tb24uVUlTdHJpbmcoJ05vdCBvcHRpbWl6ZWQnKSkpO3NwYW4uY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnOiAlcycsZXZlbnREYXRhWydkZW9wdFJlYXNvbiddKSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmFzc2VydChmYWxzZSwnVW5oYW5kbGVkIFRpbWVsaW5lTW9kZWwuV2FybmluZ1R5cGUnKTt9CnJldHVybiBzcGFuO30Kc3RhdGljIGRpc3BsYXlOYW1lRm9yRnJhbWUoZnJhbWUsdHJpbUF0KXtjb25zdCB1cmw9ZnJhbWUudXJsO2lmKCF0cmltQXQpCnRyaW1BdD0zMDtyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoJ2Fib3V0OicpP2AiJHtmcmFtZS5uYW1lLnRyaW1NaWRkbGUodHJpbUF0KX0iYDpmcmFtZS51cmwudHJpbUVuZCh0cmltQXQpO319O1RpbWVsaW5lLlRpbWVsaW5lUmVjb3JkU3R5bGU9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGUsY2F0ZWdvcnksaGlkZGVuKXt0aGlzLnRpdGxlPXRpdGxlO3RoaXMuY2F0ZWdvcnk9Y2F0ZWdvcnk7dGhpcy5oaWRkZW49ISFoaWRkZW47fX07VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLk5ldHdvcmtDYXRlZ29yeT17SFRNTDpTeW1ib2woJ0hUTUwnKSxTY3JpcHQ6U3ltYm9sKCdTY3JpcHQnKSxTdHlsZTpTeW1ib2woJ1N0eWxlJyksTWVkaWE6U3ltYm9sKCdNZWRpYScpLE90aGVyOlN5bWJvbCgnT3RoZXInKX07VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9hZ2dyZWdhdGVkU3RhdHNLZXk9U3ltYm9sKCdhZ2dyZWdhdGVkU3RhdHMnKTtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuSW52YWxpZGF0aW9uc0dyb3VwRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHRhcmdldCxyZWxhdGVkTm9kZXNNYXAsY29udGVudEhlbHBlcixpbnZhbGlkYXRpb25zKXtzdXBlcignJyx0cnVlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInKTt0aGlzLnNlbGVjdGFibGU9ZmFsc2U7dGhpcy50b2dnbGVPbkNsaWNrPXRydWU7dGhpcy5fcmVsYXRlZE5vZGVzTWFwPXJlbGF0ZWROb2Rlc01hcDt0aGlzLl9jb250ZW50SGVscGVyPWNvbnRlbnRIZWxwZXI7dGhpcy5faW52YWxpZGF0aW9ucz1pbnZhbGlkYXRpb25zO3RoaXMudGl0bGU9dGhpcy5fY3JlYXRlVGl0bGUodGFyZ2V0KTt9Cl9jcmVhdGVUaXRsZSh0YXJnZXQpe2NvbnN0IGZpcnN0PXRoaXMuX2ludmFsaWRhdGlvbnNbMF07Y29uc3QgcmVhc29uPWZpcnN0LmNhdXNlLnJlYXNvbjtjb25zdCB0b3BGcmFtZT1maXJzdC5jYXVzZS5zdGFja1RyYWNlJiZmaXJzdC5jYXVzZS5zdGFja1RyYWNlWzBdO2NvbnN0IHRpdGxlPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtpZihyZWFzb24pCnRpdGxlLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJyVzIGZvciAnLHJlYXNvbikpO2Vsc2UKdGl0bGUuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnVW5rbm93biBjYXVzZSBmb3IgJykpO3RoaXMuX2FwcGVuZFRydW5jYXRlZE5vZGVMaXN0KHRpdGxlLHRoaXMuX2ludmFsaWRhdGlvbnMpO2lmKHRvcEZyYW1lJiZ0aGlzLl9jb250ZW50SGVscGVyLmxpbmtpZmllcigpKXt0aXRsZS5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcuICcpKTtjb25zdCBzdGFjaz10aXRsZS5jcmVhdGVDaGlsZCgnc3BhbicsJ21vbm9zcGFjZScpO3N0YWNrLmNyZWF0ZUNoaWxkKCdzcGFuJykudGV4dENvbnRlbnQ9VGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLmZyYW1lRGlzcGxheU5hbWUodG9wRnJhbWUpO2NvbnN0IGxpbms9dGhpcy5fY29udGVudEhlbHBlci5saW5raWZpZXIoKS5tYXliZUxpbmtpZnlDb25zb2xlQ2FsbEZyYW1lKHRhcmdldCx0b3BGcmFtZSk7aWYobGluayl7c3RhY2suY3JlYXRlQ2hpbGQoJ3NwYW4nKS50ZXh0Q29udGVudD0nIEAgJztzdGFjay5jcmVhdGVDaGlsZCgnc3BhbicpLmFwcGVuZENoaWxkKGxpbmspO319CnJldHVybiB0aXRsZTt9Cm9ucG9wdWxhdGUoKXtjb25zdCBjb250ZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2NvbnRlbnQnKTtjb25zdCBmaXJzdD10aGlzLl9pbnZhbGlkYXRpb25zWzBdO2lmKGZpcnN0LmNhdXNlLnN0YWNrVHJhY2Upe2NvbnN0IHN0YWNrPWNvbnRlbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO3N0YWNrLmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJ1N0YWNrIHRyYWNlOicpKTt0aGlzLl9jb250ZW50SGVscGVyLmNyZWF0ZUNoaWxkU3RhY2tUcmFjZUVsZW1lbnQoc3RhY2ssVGltZWxpbmUuVGltZWxpbmVVSVV0aWxzLl9zdGFja1RyYWNlRnJvbUNhbGxGcmFtZXMoZmlyc3QuY2F1c2Uuc3RhY2tUcmFjZSkpO30KY29udGVudC5jcmVhdGVUZXh0Q2hpbGQodGhpcy5faW52YWxpZGF0aW9ucy5sZW5ndGg+MT9Db21tb24uVUlTdHJpbmcoJ05vZGVzOicpOkNvbW1vbi5VSVN0cmluZygnTm9kZTonKSk7Y29uc3Qgbm9kZUxpc3Q9Y29udGVudC5jcmVhdGVDaGlsZCgnZGl2Jywnbm9kZS1saXN0Jyk7bGV0IGZpcnN0Tm9kZT10cnVlO2ZvcihsZXQgaT0wO2k8dGhpcy5faW52YWxpZGF0aW9ucy5sZW5ndGg7aSsrKXtjb25zdCBpbnZhbGlkYXRpb249dGhpcy5faW52YWxpZGF0aW9uc1tpXTtjb25zdCBpbnZhbGlkYXRpb25Ob2RlPXRoaXMuX2NyZWF0ZUludmFsaWRhdGlvbk5vZGUoaW52YWxpZGF0aW9uLHRydWUpO2lmKGludmFsaWRhdGlvbk5vZGUpe2lmKCFmaXJzdE5vZGUpCm5vZGVMaXN0LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJywgJykpO2ZpcnN0Tm9kZT1mYWxzZTtub2RlTGlzdC5hcHBlbmRDaGlsZChpbnZhbGlkYXRpb25Ob2RlKTtjb25zdCBleHRyYURhdGE9aW52YWxpZGF0aW9uLmV4dHJhRGF0YT8nLCAnK2ludmFsaWRhdGlvbi5leHRyYURhdGE6Jyc7aWYoaW52YWxpZGF0aW9uLmNoYW5nZWRJZCl7bm9kZUxpc3QuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnKGNoYW5nZWQgaWQgdG8gIiVzIiVzKScsaW52YWxpZGF0aW9uLmNoYW5nZWRJZCxleHRyYURhdGEpKTt9ZWxzZSBpZihpbnZhbGlkYXRpb24uY2hhbmdlZENsYXNzKXtub2RlTGlzdC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcoY2hhbmdlZCBjbGFzcyB0byAiJXMiJXMpJyxpbnZhbGlkYXRpb24uY2hhbmdlZENsYXNzLGV4dHJhRGF0YSkpO31lbHNlIGlmKGludmFsaWRhdGlvbi5jaGFuZ2VkQXR0cmlidXRlKXtub2RlTGlzdC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcoY2hhbmdlZCBhdHRyaWJ1dGUgdG8gIiVzIiVzKScsaW52YWxpZGF0aW9uLmNoYW5nZWRBdHRyaWJ1dGUsZXh0cmFEYXRhKSk7fWVsc2UgaWYoaW52YWxpZGF0aW9uLmNoYW5nZWRQc2V1ZG8pe25vZGVMaXN0LmNyZWF0ZVRleHRDaGlsZChDb21tb24uVUlTdHJpbmcoJyhjaGFuZ2VkIHBlc3VkbyB0byAiJXMiJXMpJyxpbnZhbGlkYXRpb24uY2hhbmdlZFBzZXVkbyxleHRyYURhdGEpKTt9ZWxzZSBpZihpbnZhbGlkYXRpb24uc2VsZWN0b3JQYXJ0KXtub2RlTGlzdC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcoY2hhbmdlZCAiJXMiJXMpJyxpbnZhbGlkYXRpb24uc2VsZWN0b3JQYXJ0LGV4dHJhRGF0YSkpO319fQpjb25zdCBjb250ZW50VHJlZUVsZW1lbnQ9bmV3IFVJLlRyZWVFbGVtZW50KGNvbnRlbnQsZmFsc2UpO2NvbnRlbnRUcmVlRWxlbWVudC5zZWxlY3RhYmxlPWZhbHNlO3RoaXMuYXBwZW5kQ2hpbGQoY29udGVudFRyZWVFbGVtZW50KTt9Cl9hcHBlbmRUcnVuY2F0ZWROb2RlTGlzdChwYXJlbnRFbGVtZW50LGludmFsaWRhdGlvbnMpe2NvbnN0IGludmFsaWRhdGlvbk5vZGVzPVtdO2NvbnN0IGludmFsaWRhdGlvbk5vZGVJZE1hcD17fTtmb3IobGV0IGk9MDtpPGludmFsaWRhdGlvbnMubGVuZ3RoO2krKyl7Y29uc3QgaW52YWxpZGF0aW9uPWludmFsaWRhdGlvbnNbaV07Y29uc3QgaW52YWxpZGF0aW9uTm9kZT10aGlzLl9jcmVhdGVJbnZhbGlkYXRpb25Ob2RlKGludmFsaWRhdGlvbixmYWxzZSk7aW52YWxpZGF0aW9uTm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZT0+ZS5jb25zdW1lKCksZmFsc2UpO2lmKGludmFsaWRhdGlvbk5vZGUmJiFpbnZhbGlkYXRpb25Ob2RlSWRNYXBbaW52YWxpZGF0aW9uLm5vZGVJZF0pe2ludmFsaWRhdGlvbk5vZGVzLnB1c2goaW52YWxpZGF0aW9uTm9kZSk7aW52YWxpZGF0aW9uTm9kZUlkTWFwW2ludmFsaWRhdGlvbi5ub2RlSWRdPXRydWU7fX0KaWYoaW52YWxpZGF0aW9uTm9kZXMubGVuZ3RoPT09MSl7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChpbnZhbGlkYXRpb25Ob2Rlc1swXSk7fWVsc2UgaWYoaW52YWxpZGF0aW9uTm9kZXMubGVuZ3RoPT09Mil7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChpbnZhbGlkYXRpb25Ob2Rlc1swXSk7cGFyZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcgYW5kICcpKTtwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGludmFsaWRhdGlvbk5vZGVzWzFdKTt9ZWxzZSBpZihpbnZhbGlkYXRpb25Ob2Rlcy5sZW5ndGg+PTMpe3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW52YWxpZGF0aW9uTm9kZXNbMF0pO3BhcmVudEVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKENvbW1vbi5VSVN0cmluZygnLCAnKSk7cGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChpbnZhbGlkYXRpb25Ob2Rlc1sxXSk7cGFyZW50RWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCcsIGFuZCAlcyBvdGhlcnMnLGludmFsaWRhdGlvbk5vZGVzLmxlbmd0aC0yKSk7fX0KX2NyZWF0ZUludmFsaWRhdGlvbk5vZGUoaW52YWxpZGF0aW9uLHNob3dVbmtub3duTm9kZXMpe2NvbnN0IG5vZGU9KGludmFsaWRhdGlvbi5ub2RlSWQmJnRoaXMuX3JlbGF0ZWROb2Rlc01hcCk/dGhpcy5fcmVsYXRlZE5vZGVzTWFwLmdldChpbnZhbGlkYXRpb24ubm9kZUlkKTpudWxsO2lmKG5vZGUpe2NvbnN0IG5vZGVTcGFuPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtDb21tb24uTGlua2lmaWVyLmxpbmtpZnkobm9kZSkudGhlbihsaW5rPT5ub2RlU3Bhbi5hcHBlbmRDaGlsZChsaW5rKSk7cmV0dXJuIG5vZGVTcGFuO30KaWYoaW52YWxpZGF0aW9uLm5vZGVOYW1lKXtjb25zdCBub2RlU3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bm9kZVNwYW4udGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdbICVzIF0nLGludmFsaWRhdGlvbi5ub2RlTmFtZSk7cmV0dXJuIG5vZGVTcGFuO30KaWYoc2hvd1Vua25vd25Ob2Rlcyl7Y29uc3Qgbm9kZVNwYW49Y3JlYXRlRWxlbWVudCgnc3BhbicpO3JldHVybiBub2RlU3Bhbi5jcmVhdGVUZXh0Q2hpbGQoQ29tbW9uLlVJU3RyaW5nKCdbIHVua25vd24gbm9kZSBdJykpO319fTtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX3ByZXZpZXdFbGVtZW50U3ltYm9sPVN5bWJvbCgncHJldmlld0VsZW1lbnQnKTtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuRXZlbnREaXNwYXRjaFR5cGVEZXNjcmlwdG9yPWNsYXNze2NvbnN0cnVjdG9yKHByaW9yaXR5LGNvbG9yLGV2ZW50VHlwZXMpe3RoaXMucHJpb3JpdHk9cHJpb3JpdHk7dGhpcy5jb2xvcj1jb2xvcjt0aGlzLmV2ZW50VHlwZXM9ZXZlbnRUeXBlczt9fTtUaW1lbGluZS5UaW1lbGluZUNhdGVnb3J5PWNsYXNzIGV4dGVuZHMgQ29tbW9uLk9iamVjdHtjb25zdHJ1Y3RvcihuYW1lLHRpdGxlLHZpc2libGUsY2hpbGRDb2xvcixjb2xvcil7c3VwZXIoKTt0aGlzLm5hbWU9bmFtZTt0aGlzLnRpdGxlPXRpdGxlO3RoaXMudmlzaWJsZT12aXNpYmxlO3RoaXMuY2hpbGRDb2xvcj1jaGlsZENvbG9yO3RoaXMuY29sb3I9Y29sb3I7dGhpcy5oaWRkZW49ZmFsc2U7fQpnZXQgaGlkZGVuKCl7cmV0dXJuIHRoaXMuX2hpZGRlbjt9CnNldCBoaWRkZW4oaGlkZGVuKXt0aGlzLl9oaWRkZW49aGlkZGVuO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFRpbWVsaW5lLlRpbWVsaW5lQ2F0ZWdvcnkuRXZlbnRzLlZpc2liaWxpdHlDaGFuZ2VkLHRoaXMpO319O1RpbWVsaW5lLlRpbWVsaW5lQ2F0ZWdvcnkuRXZlbnRzPXtWaXNpYmlsaXR5Q2hhbmdlZDpTeW1ib2woJ1Zpc2liaWxpdHlDaGFuZ2VkJyl9O1RpbWVsaW5lLlRpbWVsaW5lTWFya2VyU3R5bGU7VGltZWxpbmUuVGltZWxpbmVQb3B1cENvbnRlbnRIZWxwZXI9Y2xhc3N7Y29uc3RydWN0b3IodGl0bGUpe3RoaXMuX2NvbnRlbnRUYWJsZT1jcmVhdGVFbGVtZW50KCd0YWJsZScpO2NvbnN0IHRpdGxlQ2VsbD10aGlzLl9jcmVhdGVDZWxsKENvbW1vbi5VSVN0cmluZygnJXMgLSBEZXRhaWxzJyx0aXRsZSksJ3RpbWVsaW5lLWRldGFpbHMtdGl0bGUnKTt0aXRsZUNlbGwuY29sU3Bhbj0yO2NvbnN0IHRpdGxlUm93PWNyZWF0ZUVsZW1lbnQoJ3RyJyk7dGl0bGVSb3cuYXBwZW5kQ2hpbGQodGl0bGVDZWxsKTt0aGlzLl9jb250ZW50VGFibGUuYXBwZW5kQ2hpbGQodGl0bGVSb3cpO30KY29udGVudFRhYmxlKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRUYWJsZTt9Cl9jcmVhdGVDZWxsKGNvbnRlbnQsc3R5bGVOYW1lKXtjb25zdCB0ZXh0PWNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7dGV4dC5jcmVhdGVUZXh0Q2hpbGQoU3RyaW5nKGNvbnRlbnQpKTtjb25zdCBjZWxsPWNyZWF0ZUVsZW1lbnQoJ3RkJyk7Y2VsbC5jbGFzc05hbWU9J3RpbWVsaW5lLWRldGFpbHMnO2lmKHN0eWxlTmFtZSkKY2VsbC5jbGFzc05hbWUrPScgJytzdHlsZU5hbWU7Y2VsbC50ZXh0Q29udGVudD1jb250ZW50O3JldHVybiBjZWxsO30KYXBwZW5kVGV4dFJvdyh0aXRsZSxjb250ZW50KXtjb25zdCByb3c9Y3JlYXRlRWxlbWVudCgndHInKTtyb3cuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlQ2VsbCh0aXRsZSwndGltZWxpbmUtZGV0YWlscy1yb3ctdGl0bGUnKSk7cm93LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUNlbGwoY29udGVudCwndGltZWxpbmUtZGV0YWlscy1yb3ctZGF0YScpKTt0aGlzLl9jb250ZW50VGFibGUuYXBwZW5kQ2hpbGQocm93KTt9CmFwcGVuZEVsZW1lbnRSb3codGl0bGUsY29udGVudCl7Y29uc3Qgcm93PWNyZWF0ZUVsZW1lbnQoJ3RyJyk7Y29uc3QgdGl0bGVDZWxsPXRoaXMuX2NyZWF0ZUNlbGwodGl0bGUsJ3RpbWVsaW5lLWRldGFpbHMtcm93LXRpdGxlJyk7cm93LmFwcGVuZENoaWxkKHRpdGxlQ2VsbCk7Y29uc3QgY2VsbD1jcmVhdGVFbGVtZW50KCd0ZCcpO2NlbGwuY2xhc3NOYW1lPSdkZXRhaWxzJztpZihjb250ZW50IGluc3RhbmNlb2YgTm9kZSkKY2VsbC5hcHBlbmRDaGlsZChjb250ZW50KTtlbHNlCmNlbGwuY3JlYXRlVGV4dENoaWxkKGNvbnRlbnR8fCcnKTtyb3cuYXBwZW5kQ2hpbGQoY2VsbCk7dGhpcy5fY29udGVudFRhYmxlLmFwcGVuZENoaWxkKHJvdyk7fX07VGltZWxpbmUuVGltZWxpbmVEZXRhaWxzQ29udGVudEhlbHBlcj1jbGFzc3tjb25zdHJ1Y3Rvcih0YXJnZXQsbGlua2lmaWVyKXt0aGlzLmZyYWdtZW50PWNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt0aGlzLl9saW5raWZpZXI9bGlua2lmaWVyO3RoaXMuX3RhcmdldD10YXJnZXQ7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1ibG9jaycpO3RoaXMuX3RhYmxlRWxlbWVudD10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3Zib3ggdGltZWxpbmUtZGV0YWlscy1jaGlwLWJvZHknKTt0aGlzLmZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7fQphZGRTZWN0aW9uKHRpdGxlLHN3YXRjaENvbG9yKXtpZighdGhpcy5fdGFibGVFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSl7dGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7fWVsc2V7dGhpcy5lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1ibG9jaycpO3RoaXMuZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTt9CmlmKHRpdGxlKXtjb25zdCB0aXRsZUVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aW1lbGluZS1kZXRhaWxzLWNoaXAtdGl0bGUnKTtpZihzd2F0Y2hDb2xvcikKdGl0bGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9c3dhdGNoQ29sb3I7dGl0bGVFbGVtZW50LmNyZWF0ZVRleHRDaGlsZCh0aXRsZSk7fQp0aGlzLl90YWJsZUVsZW1lbnQ9dGhpcy5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd2Ym94IHRpbWVsaW5lLWRldGFpbHMtY2hpcC1ib2R5Jyk7dGhpcy5mcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO30KbGlua2lmaWVyKCl7cmV0dXJuIHRoaXMuX2xpbmtpZmllcjt9CmFwcGVuZFRleHRSb3codGl0bGUsdmFsdWUpe2NvbnN0IHJvd0VsZW1lbnQ9dGhpcy5fdGFibGVFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCd0aW1lbGluZS1kZXRhaWxzLXZpZXctcm93Jyk7cm93RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXJvdy10aXRsZScpLnRleHRDb250ZW50PXRpdGxlO3Jvd0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdmFsdWUnKS50ZXh0Q29udGVudD12YWx1ZTt9CmFwcGVuZEVsZW1lbnRSb3codGl0bGUsY29udGVudCxpc1dhcm5pbmcsaXNTdGFja2VkKXtjb25zdCByb3dFbGVtZW50PXRoaXMuX3RhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXJvdycpO2lmKGlzV2FybmluZykKcm93RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1kZXRhaWxzLXdhcm5pbmcnKTtpZihpc1N0YWNrZWQpCnJvd0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtZGV0YWlscy1zdGFjay12YWx1ZXMnKTtjb25zdCB0aXRsZUVsZW1lbnQ9cm93RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXJvdy10aXRsZScpO3RpdGxlRWxlbWVudC50ZXh0Q29udGVudD10aXRsZTtjb25zdCB2YWx1ZUVsZW1lbnQ9cm93RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXJvdy12YWx1ZScpO2lmKGNvbnRlbnQgaW5zdGFuY2VvZiBOb2RlKQp2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7ZWxzZQp2YWx1ZUVsZW1lbnQuY3JlYXRlVGV4dENoaWxkKGNvbnRlbnR8fCcnKTt9CmFwcGVuZExvY2F0aW9uUm93KHRpdGxlLHVybCxzdGFydExpbmUsc3RhcnRDb2x1bW4pe2lmKCF0aGlzLl9saW5raWZpZXJ8fCF0aGlzLl90YXJnZXQpCnJldHVybjtjb25zdCBsaW5rPXRoaXMuX2xpbmtpZmllci5tYXliZUxpbmtpZnlTY3JpcHRMb2NhdGlvbih0aGlzLl90YXJnZXQsbnVsbCx1cmwsc3RhcnRMaW5lLHN0YXJ0Q29sdW1uKTtpZighbGluaykKcmV0dXJuO3RoaXMuYXBwZW5kRWxlbWVudFJvdyh0aXRsZSxsaW5rKTt9CmFwcGVuZExvY2F0aW9uUmFuZ2UodGl0bGUsdXJsLHN0YXJ0TGluZSxlbmRMaW5lKXtpZighdGhpcy5fbGlua2lmaWVyfHwhdGhpcy5fdGFyZ2V0KQpyZXR1cm47Y29uc3QgbG9jYXRpb25Db250ZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBsaW5rPXRoaXMuX2xpbmtpZmllci5tYXliZUxpbmtpZnlTY3JpcHRMb2NhdGlvbih0aGlzLl90YXJnZXQsbnVsbCx1cmwsc3RhcnRMaW5lKTtpZighbGluaykKcmV0dXJuO2xvY2F0aW9uQ29udGVudC5hcHBlbmRDaGlsZChsaW5rKTtsb2NhdGlvbkNvbnRlbnQuY3JlYXRlVGV4dENoaWxkKFN0cmluZy5zcHJpbnRmKCcgWyVzXHUyMDI2JXNdJyxzdGFydExpbmUrMSxlbmRMaW5lKzF8fCcnKSk7dGhpcy5hcHBlbmRFbGVtZW50Um93KHRpdGxlLGxvY2F0aW9uQ29udGVudCk7fQphcHBlbmRTdGFja1RyYWNlKHRpdGxlLHN0YWNrVHJhY2Upe2lmKCF0aGlzLl9saW5raWZpZXJ8fCF0aGlzLl90YXJnZXQpCnJldHVybjtjb25zdCByb3dFbGVtZW50PXRoaXMuX3RhYmxlRWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtZGV0YWlscy12aWV3LXJvdycpO3Jvd0VsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdGl0bGUnKS50ZXh0Q29udGVudD10aXRsZTt0aGlzLmNyZWF0ZUNoaWxkU3RhY2tUcmFjZUVsZW1lbnQocm93RWxlbWVudCxzdGFja1RyYWNlKTt9CmNyZWF0ZUNoaWxkU3RhY2tUcmFjZUVsZW1lbnQocGFyZW50RWxlbWVudCxzdGFja1RyYWNlKXtpZighdGhpcy5fbGlua2lmaWVyfHwhdGhpcy5fdGFyZ2V0KQpyZXR1cm47cGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1kZXRhaWxzLXN0YWNrLXZhbHVlcycpO2NvbnN0IHN0YWNrVHJhY2VFbGVtZW50PXBhcmVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsJ3RpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdmFsdWUgdGltZWxpbmUtZGV0YWlscy12aWV3LXJvdy1zdGFjay10cmFjZScpO2NvbnN0IGNhbGxGcmFtZUVsZW09Q29tcG9uZW50cy5KU1ByZXNlbnRhdGlvblV0aWxzLmJ1aWxkU3RhY2tUcmFjZVByZXZpZXdDb250ZW50cyh0aGlzLl90YXJnZXQsdGhpcy5fbGlua2lmaWVyLHN0YWNrVHJhY2UpO3N0YWNrVHJhY2VFbGVtZW50LmFwcGVuZENoaWxkKGNhbGxGcmFtZUVsZW0pO30KYXBwZW5kV2FybmluZ1JvdyhldmVudCx3YXJuaW5nVHlwZSl7Y29uc3Qgd2FybmluZz1UaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuZXZlbnRXYXJuaW5nKGV2ZW50LHdhcm5pbmdUeXBlKTtpZih3YXJuaW5nKQp0aGlzLmFwcGVuZEVsZW1lbnRSb3coQ29tbW9uLlVJU3RyaW5nKCdXYXJuaW5nJyksd2FybmluZyx0cnVlKTt9fTtUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuX2NhdGVnb3J5QnJlYWtkb3duQ2FjaGVTeW1ib2w9U3ltYm9sKCdjYXRlZ29yeUJyZWFrZG93bkNhY2hlJyk7O1RpbWVsaW5lLlRpbWVsaW5lTGF5ZXJzVmlldz1jbGFzcyBleHRlbmRzIFVJLlNwbGl0V2lkZ2V0e2NvbnN0cnVjdG9yKG1vZGVsLHNob3dQYWludFByb2ZpbGVyQ2FsbGJhY2spe3N1cGVyKHRydWUsZmFsc2UsJ3RpbWVsaW5lTGF5ZXJzVmlldycpO3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX3Nob3dQYWludFByb2ZpbGVyQ2FsbGJhY2s9c2hvd1BhaW50UHJvZmlsZXJDYWxsYmFjazt0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtbGF5ZXJzLXZpZXcnKTt0aGlzLl9yaWdodFNwbGl0V2lkZ2V0PW5ldyBVSS5TcGxpdFdpZGdldCh0cnVlLHRydWUsJ3RpbWVsaW5lTGF5ZXJzVmlld0RldGFpbHMnKTt0aGlzLl9yaWdodFNwbGl0V2lkZ2V0LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtbGF5ZXJzLXZpZXctcHJvcGVydGllcycpO3RoaXMuc2V0TWFpbldpZGdldCh0aGlzLl9yaWdodFNwbGl0V2lkZ2V0KTtjb25zdCB2Ym94PW5ldyBVSS5WQm94KCk7dGhpcy5zZXRTaWRlYmFyV2lkZ2V0KHZib3gpO3RoaXMuX2xheWVyVmlld0hvc3Q9bmV3IExheWVyVmlld2VyLkxheWVyVmlld0hvc3QoKTtjb25zdCBsYXllclRyZWVPdXRsaW5lPW5ldyBMYXllclZpZXdlci5MYXllclRyZWVPdXRsaW5lKHRoaXMuX2xheWVyVmlld0hvc3QpO3Zib3guZWxlbWVudC5hcHBlbmRDaGlsZChsYXllclRyZWVPdXRsaW5lLmVsZW1lbnQpO3RoaXMuX2xheWVyczNEVmlldz1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJzM0RWaWV3KHRoaXMuX2xheWVyVmlld0hvc3QpO3RoaXMuX2xheWVyczNEVmlldy5hZGRFdmVudExpc3RlbmVyKExheWVyVmlld2VyLkxheWVyczNEVmlldy5FdmVudHMuUGFpbnRQcm9maWxlclJlcXVlc3RlZCx0aGlzLl9vblBhaW50UHJvZmlsZXJSZXF1ZXN0ZWQsdGhpcyk7dGhpcy5fcmlnaHRTcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX2xheWVyczNEVmlldyk7Y29uc3QgbGF5ZXJEZXRhaWxzVmlldz1uZXcgTGF5ZXJWaWV3ZXIuTGF5ZXJEZXRhaWxzVmlldyh0aGlzLl9sYXllclZpZXdIb3N0KTt0aGlzLl9yaWdodFNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQobGF5ZXJEZXRhaWxzVmlldyk7bGF5ZXJEZXRhaWxzVmlldy5hZGRFdmVudExpc3RlbmVyKExheWVyVmlld2VyLkxheWVyRGV0YWlsc1ZpZXcuRXZlbnRzLlBhaW50UHJvZmlsZXJSZXF1ZXN0ZWQsdGhpcy5fb25QYWludFByb2ZpbGVyUmVxdWVzdGVkLHRoaXMpO30Kc2hvd0xheWVyVHJlZShmcmFtZUxheWVyVHJlZSl7dGhpcy5fZnJhbWVMYXllclRyZWU9ZnJhbWVMYXllclRyZWU7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fdXBkYXRlKCk7ZWxzZQp0aGlzLl91cGRhdGVXaGVuVmlzaWJsZT10cnVlO30Kd2FzU2hvd24oKXtpZih0aGlzLl91cGRhdGVXaGVuVmlzaWJsZSl7dGhpcy5fdXBkYXRlV2hlblZpc2libGU9ZmFsc2U7dGhpcy5fdXBkYXRlKCk7fX0KX29uUGFpbnRQcm9maWxlclJlcXVlc3RlZChldmVudCl7Y29uc3Qgc2VsZWN0aW9uPShldmVudC5kYXRhKTt0aGlzLl9sYXllcnMzRFZpZXcuc25hcHNob3RGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKS50aGVuKHNuYXBzaG90V2l0aFJlY3Q9PntpZihzbmFwc2hvdFdpdGhSZWN0KQp0aGlzLl9zaG93UGFpbnRQcm9maWxlckNhbGxiYWNrKHNuYXBzaG90V2l0aFJlY3Quc25hcHNob3QpO30pO30KX3VwZGF0ZSgpe3RoaXMuX2ZyYW1lTGF5ZXJUcmVlLmxheWVyVHJlZVByb21pc2UoKS50aGVuKGxheWVyVHJlZT0+dGhpcy5fbGF5ZXJWaWV3SG9zdC5zZXRMYXllclRyZWUobGF5ZXJUcmVlKSk7fX07O1RpbWVsaW5lLlRpbWVsaW5lUGFpbnRQcm9maWxlclZpZXc9Y2xhc3MgZXh0ZW5kcyBVSS5TcGxpdFdpZGdldHtjb25zdHJ1Y3RvcihmcmFtZU1vZGVsKXtzdXBlcihmYWxzZSxmYWxzZSk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RpbWVsaW5lLXBhaW50LXByb2ZpbGVyLXZpZXcnKTt0aGlzLnNldFNpZGViYXJTaXplKDYwKTt0aGlzLnNldFJlc2l6YWJsZShmYWxzZSk7dGhpcy5fZnJhbWVNb2RlbD1mcmFtZU1vZGVsO3RoaXMuX2xvZ0FuZEltYWdlU3BsaXRXaWRnZXQ9bmV3IFVJLlNwbGl0V2lkZ2V0KHRydWUsZmFsc2UpO3RoaXMuX2xvZ0FuZEltYWdlU3BsaXRXaWRnZXQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1wYWludC1wcm9maWxlci1sb2ctc3BsaXQnKTt0aGlzLnNldE1haW5XaWRnZXQodGhpcy5fbG9nQW5kSW1hZ2VTcGxpdFdpZGdldCk7dGhpcy5faW1hZ2VWaWV3PW5ldyBUaW1lbGluZS5UaW1lbGluZVBhaW50SW1hZ2VWaWV3KCk7dGhpcy5fbG9nQW5kSW1hZ2VTcGxpdFdpZGdldC5zZXRNYWluV2lkZ2V0KHRoaXMuX2ltYWdlVmlldyk7dGhpcy5fcGFpbnRQcm9maWxlclZpZXc9bmV3IExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3KHRoaXMuX2ltYWdlVmlldy5zaG93SW1hZ2UuYmluZCh0aGlzLl9pbWFnZVZpZXcpKTt0aGlzLl9wYWludFByb2ZpbGVyVmlldy5hZGRFdmVudExpc3RlbmVyKExheWVyVmlld2VyLlBhaW50UHJvZmlsZXJWaWV3LkV2ZW50cy5XaW5kb3dDaGFuZ2VkLHRoaXMuX29uV2luZG93Q2hhbmdlZCx0aGlzKTt0aGlzLnNldFNpZGViYXJXaWRnZXQodGhpcy5fcGFpbnRQcm9maWxlclZpZXcpO3RoaXMuX2xvZ1RyZWVWaWV3PW5ldyBMYXllclZpZXdlci5QYWludFByb2ZpbGVyQ29tbWFuZExvZ1ZpZXcoKTt0aGlzLl9sb2dBbmRJbWFnZVNwbGl0V2lkZ2V0LnNldFNpZGViYXJXaWRnZXQodGhpcy5fbG9nVHJlZVZpZXcpO3RoaXMuX25lZWRzVXBkYXRlV2hlblZpc2libGU9ZmFsc2U7dGhpcy5fcGVuZGluZ1NuYXBzaG90PW51bGw7dGhpcy5fZXZlbnQ9bnVsbDt0aGlzLl9wYWludFByb2ZpbGVyTW9kZWw9bnVsbDt0aGlzLl9sYXN0TG9hZGVkU25hcHNob3Q9bnVsbDt9Cndhc1Nob3duKCl7aWYodGhpcy5fbmVlZHNVcGRhdGVXaGVuVmlzaWJsZSl7dGhpcy5fbmVlZHNVcGRhdGVXaGVuVmlzaWJsZT1mYWxzZTt0aGlzLl91cGRhdGUoKTt9fQpzZXRTbmFwc2hvdChzbmFwc2hvdCl7dGhpcy5fcmVsZWFzZVNuYXBzaG90KCk7dGhpcy5fcGVuZGluZ1NuYXBzaG90PXNuYXBzaG90O3RoaXMuX2V2ZW50PW51bGw7dGhpcy5fdXBkYXRlV2hlblZpc2libGUoKTt9CnNldEV2ZW50KHBhaW50UHJvZmlsZXJNb2RlbCxldmVudCl7dGhpcy5fcmVsZWFzZVNuYXBzaG90KCk7dGhpcy5fcGFpbnRQcm9maWxlck1vZGVsPXBhaW50UHJvZmlsZXJNb2RlbDt0aGlzLl9wZW5kaW5nU25hcHNob3Q9bnVsbDt0aGlzLl9ldmVudD1ldmVudDt0aGlzLl91cGRhdGVXaGVuVmlzaWJsZSgpO2lmKHRoaXMuX2V2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5QYWludCkKcmV0dXJuISFUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChldmVudCkucGljdHVyZTtpZih0aGlzLl9ldmVudC5uYW1lPT09VGltZWxpbmVNb2RlbC5UaW1lbGluZU1vZGVsLlJlY29yZFR5cGUuUmFzdGVyVGFzaykKcmV0dXJuIHRoaXMuX2ZyYW1lTW9kZWwuaGFzUmFzdGVyVGlsZSh0aGlzLl9ldmVudCk7cmV0dXJuIGZhbHNlO30KX3VwZGF0ZVdoZW5WaXNpYmxlKCl7aWYodGhpcy5pc1Nob3dpbmcoKSkKdGhpcy5fdXBkYXRlKCk7ZWxzZQp0aGlzLl9uZWVkc1VwZGF0ZVdoZW5WaXNpYmxlPXRydWU7fQpfdXBkYXRlKCl7dGhpcy5fbG9nVHJlZVZpZXcuc2V0Q29tbWFuZExvZyhbXSk7dGhpcy5fcGFpbnRQcm9maWxlclZpZXcuc2V0U25hcHNob3RBbmRMb2cobnVsbCxbXSxudWxsKTtsZXQgc25hcHNob3RQcm9taXNlO2lmKHRoaXMuX3BlbmRpbmdTbmFwc2hvdCl7c25hcHNob3RQcm9taXNlPVByb21pc2UucmVzb2x2ZSh7cmVjdDpudWxsLHNuYXBzaG90OnRoaXMuX3BlbmRpbmdTbmFwc2hvdH0pO31lbHNlIGlmKHRoaXMuX2V2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5QYWludCl7Y29uc3QgcGljdHVyZT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudCh0aGlzLl9ldmVudCkucGljdHVyZTtzbmFwc2hvdFByb21pc2U9cGljdHVyZS5vYmplY3RQcm9taXNlKCkudGhlbihkYXRhPT50aGlzLl9wYWludFByb2ZpbGVyTW9kZWwubG9hZFNuYXBzaG90KGRhdGFbJ3NrcDY0J10pKS50aGVuKHNuYXBzaG90PT5zbmFwc2hvdCYme3JlY3Q6bnVsbCxzbmFwc2hvdDpzbmFwc2hvdH0pO31lbHNlIGlmKHRoaXMuX2V2ZW50Lm5hbWU9PT1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZS5SYXN0ZXJUYXNrKXtzbmFwc2hvdFByb21pc2U9dGhpcy5fZnJhbWVNb2RlbC5yYXN0ZXJUaWxlUHJvbWlzZSh0aGlzLl9ldmVudCk7fWVsc2V7Y29uc29sZS5hc3NlcnQoZmFsc2UsJ1VuZXhwZWN0ZWQgZXZlbnQgdHlwZSBvciBubyBzbmFwc2hvdCcpO3JldHVybjt9CnNuYXBzaG90UHJvbWlzZS50aGVuKHNuYXBzaG90V2l0aFJlY3Q9Pnt0aGlzLl9yZWxlYXNlU25hcHNob3QoKTtpZighc25hcHNob3RXaXRoUmVjdCl7dGhpcy5faW1hZ2VWaWV3LnNob3dJbWFnZSgpO3JldHVybjt9CmNvbnN0IHNuYXBzaG90PXNuYXBzaG90V2l0aFJlY3Quc25hcHNob3Q7dGhpcy5fbGFzdExvYWRlZFNuYXBzaG90PXNuYXBzaG90O3RoaXMuX2ltYWdlVmlldy5zZXRNYXNrKHNuYXBzaG90V2l0aFJlY3QucmVjdCk7c25hcHNob3QuY29tbWFuZExvZygpLnRoZW4obG9nPT5vbkNvbW1hbmRMb2dEb25lLmNhbGwodGhpcyxzbmFwc2hvdCxzbmFwc2hvdFdpdGhSZWN0LnJlY3QsbG9nKSk7fSk7ZnVuY3Rpb24gb25Db21tYW5kTG9nRG9uZShzbmFwc2hvdCxjbGlwUmVjdCxsb2cpe3RoaXMuX2xvZ1RyZWVWaWV3LnNldENvbW1hbmRMb2cobG9nfHxbXSk7dGhpcy5fcGFpbnRQcm9maWxlclZpZXcuc2V0U25hcHNob3RBbmRMb2coc25hcHNob3QsbG9nfHxbXSxjbGlwUmVjdCk7fX0KX3JlbGVhc2VTbmFwc2hvdCgpe2lmKCF0aGlzLl9sYXN0TG9hZGVkU25hcHNob3QpCnJldHVybjt0aGlzLl9sYXN0TG9hZGVkU25hcHNob3QucmVsZWFzZSgpO3RoaXMuX2xhc3RMb2FkZWRTbmFwc2hvdD1udWxsO30KX29uV2luZG93Q2hhbmdlZCgpe3RoaXMuX2xvZ1RyZWVWaWV3LnVwZGF0ZVdpbmRvdyh0aGlzLl9wYWludFByb2ZpbGVyVmlldy5zZWxlY3Rpb25XaW5kb3coKSk7fX07VGltZWxpbmUuVGltZWxpbmVQYWludEltYWdlVmlldz1jbGFzcyBleHRlbmRzIFVJLldpZGdldHtjb25zdHJ1Y3Rvcigpe3N1cGVyKHRydWUpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygndGltZWxpbmUvdGltZWxpbmVQYWludFByb2ZpbGVyLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmlsbCcsJ3BhaW50LXByb2ZpbGVyLWltYWdlLXZpZXcnKTt0aGlzLl9pbWFnZUNvbnRhaW5lcj10aGlzLmNvbnRlbnRFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdwYWludC1wcm9maWxlci1pbWFnZS1jb250YWluZXInKTt0aGlzLl9pbWFnZUVsZW1lbnQ9dGhpcy5faW1hZ2VDb250YWluZXIuY3JlYXRlQ2hpbGQoJ2ltZycpO3RoaXMuX21hc2tFbGVtZW50PXRoaXMuX2ltYWdlQ29udGFpbmVyLmNyZWF0ZUNoaWxkKCdkaXYnKTt0aGlzLl9pbWFnZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsdGhpcy5fdXBkYXRlSW1hZ2VQb3NpdGlvbi5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl90cmFuc2Zvcm1Db250cm9sbGVyPW5ldyBMYXllclZpZXdlci5UcmFuc2Zvcm1Db250cm9sbGVyKHRoaXMuY29udGVudEVsZW1lbnQsdHJ1ZSk7dGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKExheWVyVmlld2VyLlRyYW5zZm9ybUNvbnRyb2xsZXIuRXZlbnRzLlRyYW5zZm9ybUNoYW5nZWQsdGhpcy5fdXBkYXRlSW1hZ2VQb3NpdGlvbix0aGlzKTt9Cm9uUmVzaXplKCl7aWYodGhpcy5faW1hZ2VFbGVtZW50LnNyYykKdGhpcy5fdXBkYXRlSW1hZ2VQb3NpdGlvbigpO30KX3VwZGF0ZUltYWdlUG9zaXRpb24oKXtjb25zdCB3aWR0aD10aGlzLl9pbWFnZUVsZW1lbnQubmF0dXJhbFdpZHRoO2NvbnN0IGhlaWdodD10aGlzLl9pbWFnZUVsZW1lbnQubmF0dXJhbEhlaWdodDtjb25zdCBjbGllbnRXaWR0aD10aGlzLmNvbnRlbnRFbGVtZW50LmNsaWVudFdpZHRoO2NvbnN0IGNsaWVudEhlaWdodD10aGlzLmNvbnRlbnRFbGVtZW50LmNsaWVudEhlaWdodDtjb25zdCBwYWRkaW5nRnJhY3Rpb249MC4xO2NvbnN0IHBhZGRpbmdYPWNsaWVudFdpZHRoKnBhZGRpbmdGcmFjdGlvbjtjb25zdCBwYWRkaW5nWT1jbGllbnRIZWlnaHQqcGFkZGluZ0ZyYWN0aW9uO2NvbnN0IHNjYWxlWD0oY2xpZW50V2lkdGgtcGFkZGluZ1gpL3dpZHRoO2NvbnN0IHNjYWxlWT0oY2xpZW50SGVpZ2h0LXBhZGRpbmdZKS9oZWlnaHQ7Y29uc3Qgc2NhbGU9TWF0aC5taW4oc2NhbGVYLHNjYWxlWSk7aWYodGhpcy5fbWFza1JlY3RhbmdsZSl7Y29uc3Qgc3R5bGU9dGhpcy5fbWFza0VsZW1lbnQuc3R5bGU7c3R5bGUud2lkdGg9d2lkdGgrJ3B4JztzdHlsZS5oZWlnaHQ9aGVpZ2h0KydweCc7c3R5bGUuYm9yZGVyTGVmdFdpZHRoPXRoaXMuX21hc2tSZWN0YW5nbGUueCsncHgnO3N0eWxlLmJvcmRlclRvcFdpZHRoPXRoaXMuX21hc2tSZWN0YW5nbGUueSsncHgnO3N0eWxlLmJvcmRlclJpZ2h0V2lkdGg9KHdpZHRoLXRoaXMuX21hc2tSZWN0YW5nbGUueC10aGlzLl9tYXNrUmVjdGFuZ2xlLndpZHRoKSsncHgnO3N0eWxlLmJvcmRlckJvdHRvbVdpZHRoPShoZWlnaHQtdGhpcy5fbWFza1JlY3RhbmdsZS55LXRoaXMuX21hc2tSZWN0YW5nbGUuaGVpZ2h0KSsncHgnO30KdGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5zZXRTY2FsZUNvbnN0cmFpbnRzKDAuNSwxMC9zY2FsZSk7bGV0IG1hdHJpeD1uZXcgV2ViS2l0Q1NTTWF0cml4KCkuc2NhbGUodGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5zY2FsZSgpLHRoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIuc2NhbGUoKSkudHJhbnNsYXRlKGNsaWVudFdpZHRoLzIsY2xpZW50SGVpZ2h0LzIpLnNjYWxlKHNjYWxlLHNjYWxlKS50cmFuc2xhdGUoLXdpZHRoLzIsLWhlaWdodC8yKTtjb25zdCBib3VuZHM9VUkuR2VvbWV0cnkuYm91bmRzRm9yVHJhbnNmb3JtZWRQb2ludHMobWF0cml4LFswLDAsMCx3aWR0aCxoZWlnaHQsMF0pO3RoaXMuX3RyYW5zZm9ybUNvbnRyb2xsZXIuY2xhbXBPZmZzZXRzKHBhZGRpbmdYLWJvdW5kcy5tYXhYLGNsaWVudFdpZHRoLXBhZGRpbmdYLWJvdW5kcy5taW5YLHBhZGRpbmdZLWJvdW5kcy5tYXhZLGNsaWVudEhlaWdodC1wYWRkaW5nWS1ib3VuZHMubWluWSk7bWF0cml4PW5ldyBXZWJLaXRDU1NNYXRyaXgoKS50cmFuc2xhdGUodGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5vZmZzZXRYKCksdGhpcy5fdHJhbnNmb3JtQ29udHJvbGxlci5vZmZzZXRZKCkpLm11bHRpcGx5KG1hdHJpeCk7dGhpcy5faW1hZ2VDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPW1hdHJpeC50b1N0cmluZygpO30Kc2hvd0ltYWdlKGltYWdlVVJMKXt0aGlzLl9pbWFnZUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFpbWFnZVVSTCk7aWYoaW1hZ2VVUkwpCnRoaXMuX2ltYWdlRWxlbWVudC5zcmM9aW1hZ2VVUkw7fQpzZXRNYXNrKG1hc2tSZWN0YW5nbGUpe3RoaXMuX21hc2tSZWN0YW5nbGU9bWFza1JlY3RhbmdsZTt0aGlzLl9tYXNrRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFtYXNrUmVjdGFuZ2xlKTt9fTs7VGltZWxpbmUuVGltZWxpbmVQYW5lbD1jbGFzcyBleHRlbmRzIFVJLlBhbmVse2NvbnN0cnVjdG9yKCl7c3VwZXIoJ3RpbWVsaW5lJyk7dGhpcy5yZWdpc3RlclJlcXVpcmVkQ1NTKCd0aW1lbGluZS90aW1lbGluZVBhbmVsLmNzcycpO3RoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnUuYmluZCh0aGlzKSxmYWxzZSk7dGhpcy5fZHJvcFRhcmdldD1uZXcgVUkuRHJvcFRhcmdldCh0aGlzLmVsZW1lbnQsW1VJLkRyb3BUYXJnZXQuVHlwZS5GaWxlLFVJLkRyb3BUYXJnZXQuVHlwZS5VUkldLENvbW1vbi5VSVN0cmluZygnRHJvcCB0aW1lbGluZSBmaWxlIG9yIFVSTCBoZXJlJyksdGhpcy5faGFuZGxlRHJvcC5iaW5kKHRoaXMpKTt0aGlzLl9yZWNvcmRpbmdPcHRpb25VSUNvbnRyb2xzPVtdO3RoaXMuX3N0YXRlPVRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuSWRsZTt0aGlzLl9yZWNvcmRpbmdQYWdlUmVsb2FkPWZhbHNlO3RoaXMuX21pbGxpc2Vjb25kc1RvUmVjb3JkQWZ0ZXJMb2FkRXZlbnQ9MzAwMDt0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbigndGltZWxpbmUudG9nZ2xlLXJlY29yZGluZycpKTt0aGlzLl9yZWNvcmRSZWxvYWRBY3Rpb249KFVJLmFjdGlvblJlZ2lzdHJ5LmFjdGlvbigndGltZWxpbmUucmVjb3JkLXJlbG9hZCcpKTt0aGlzLl9oaXN0b3J5TWFuYWdlcj1uZXcgVGltZWxpbmUuVGltZWxpbmVIaXN0b3J5TWFuYWdlcigpO3RoaXMuX3BlcmZvcm1hbmNlTW9kZWw9bnVsbDt0aGlzLl92aWV3TW9kZVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3RpbWVsaW5lVmlld01vZGUnLFRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuVmlld01vZGUuRmxhbWVDaGFydCk7dGhpcy5fZGlzYWJsZUNhcHR1cmVKU1Byb2ZpbGVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZURpc2FibGVKU1NhbXBsaW5nJyxmYWxzZSk7dGhpcy5fZGlzYWJsZUNhcHR1cmVKU1Byb2ZpbGVTZXR0aW5nLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnRGlzYWJsZSBKYXZhU2NyaXB0IHNhbXBsZXMnKSk7dGhpcy5fY2FwdHVyZUxheWVyc0FuZFBpY3R1cmVzU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVDYXB0dXJlTGF5ZXJzQW5kUGljdHVyZXMnLGZhbHNlKTt0aGlzLl9jYXB0dXJlTGF5ZXJzQW5kUGljdHVyZXNTZXR0aW5nLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnRW5hYmxlIGFkdmFuY2VkIHBhaW50IGluc3RydW1lbnRhdGlvbiAoc2xvdyknKSk7dGhpcy5fc2hvd1NjcmVlbnNob3RzU2V0dGluZz1Db21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVTaG93U2NyZWVuc2hvdHMnLHRydWUpO3RoaXMuX3Nob3dTY3JlZW5zaG90c1NldHRpbmcuc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdTY3JlZW5zaG90cycpKTt0aGlzLl9zaG93U2NyZWVuc2hvdHNTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZU92ZXJ2aWV3Q29udHJvbHMsdGhpcyk7dGhpcy5fc2hvd01lbW9yeVNldHRpbmc9Q29tbW9uLnNldHRpbmdzLmNyZWF0ZVNldHRpbmcoJ3RpbWVsaW5lU2hvd01lbW9yeScsZmFsc2UpO3RoaXMuX3Nob3dNZW1vcnlTZXR0aW5nLnNldFRpdGxlKENvbW1vbi5VSVN0cmluZygnTWVtb3J5JykpO3RoaXMuX3Nob3dNZW1vcnlTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX29uTW9kZUNoYW5nZWQsdGhpcyk7Y29uc3QgdGltZWxpbmVUb29sYmFyQ29udGFpbmVyPXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywndGltZWxpbmUtdG9vbGJhci1jb250YWluZXInKTt0aGlzLl9wYW5lbFRvb2xiYXI9bmV3IFVJLlRvb2xiYXIoJ3RpbWVsaW5lLW1haW4tdG9vbGJhcicsdGltZWxpbmVUb29sYmFyQ29udGFpbmVyKTt0aGlzLl9wYW5lbFJpZ2h0VG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0aW1lbGluZVRvb2xiYXJDb250YWluZXIpO3RoaXMuX2NyZWF0ZVNldHRpbmdzUGFuZSgpO3RoaXMuX3VwZGF0ZVNob3dTZXR0aW5nc1Rvb2xiYXJCdXR0b24oKTt0aGlzLl90aW1lbGluZVBhbmU9bmV3IFVJLlZCb3goKTt0aGlzLl90aW1lbGluZVBhbmUuc2hvdyh0aGlzLmVsZW1lbnQpO2NvbnN0IHRvcFBhbmVFbGVtZW50PXRoaXMuX3RpbWVsaW5lUGFuZS5lbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnLCdoYm94Jyk7dG9wUGFuZUVsZW1lbnQuaWQ9J3RpbWVsaW5lLW92ZXJ2aWV3LXBhbmVsJzt0aGlzLl9vdmVydmlld1BhbmU9bmV3IFBlcmZVSS5UaW1lbGluZU92ZXJ2aWV3UGFuZSgndGltZWxpbmUnKTt0aGlzLl9vdmVydmlld1BhbmUuYWRkRXZlbnRMaXN0ZW5lcihQZXJmVUkuVGltZWxpbmVPdmVydmlld1BhbmUuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25PdmVydmlld1dpbmRvd0NoYW5nZWQuYmluZCh0aGlzKSk7dGhpcy5fb3ZlcnZpZXdQYW5lLnNob3codG9wUGFuZUVsZW1lbnQpO3RoaXMuX292ZXJ2aWV3Q29udHJvbHM9W107dGhpcy5fc3RhdHVzUGFuZUNvbnRhaW5lcj10aGlzLl90aW1lbGluZVBhbmUuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhdHVzLXBhbmUtY29udGFpbmVyIGZpbGwnKTt0aGlzLl9jcmVhdGVGaWxlU2VsZWN0b3IoKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5SZXNvdXJjZVRyZWVNb2RlbCxTREsuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkxvYWQsdGhpcy5fbG9hZEV2ZW50RmlyZWQsdGhpcyk7dGhpcy5fZmxhbWVDaGFydD1uZXcgVGltZWxpbmUuVGltZWxpbmVGbGFtZUNoYXJ0Vmlldyh0aGlzKTt0aGlzLl9zZWFyY2hhYmxlVmlldz1uZXcgVUkuU2VhcmNoYWJsZVZpZXcodGhpcy5fZmxhbWVDaGFydCk7dGhpcy5fc2VhcmNoYWJsZVZpZXcuc2V0TWluaW11bVNpemUoMCwxMDApO3RoaXMuX3NlYXJjaGFibGVWaWV3LmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VhcmNoYWJsZS12aWV3Jyk7dGhpcy5fc2VhcmNoYWJsZVZpZXcuc2hvdyh0aGlzLl90aW1lbGluZVBhbmUuZWxlbWVudCk7dGhpcy5fZmxhbWVDaGFydC5zaG93KHRoaXMuX3NlYXJjaGFibGVWaWV3LmVsZW1lbnQpO3RoaXMuX2ZsYW1lQ2hhcnQuc2V0U2VhcmNoYWJsZVZpZXcodGhpcy5fc2VhcmNoYWJsZVZpZXcpO3RoaXMuX29uTW9kZUNoYW5nZWQoKTt0aGlzLl9wb3B1bGF0ZVRvb2xiYXIoKTt0aGlzLl9zaG93TGFuZGluZ1BhZ2UoKTt0aGlzLl91cGRhdGVUaW1lbGluZUNvbnRyb2xzKCk7RXh0ZW5zaW9ucy5leHRlbnNpb25TZXJ2ZXIuYWRkRXZlbnRMaXN0ZW5lcihFeHRlbnNpb25zLkV4dGVuc2lvblNlcnZlci5FdmVudHMuVHJhY2VQcm92aWRlckFkZGVkLHRoaXMuX2FwcGVuZEV4dGVuc2lvbnNUb1Rvb2xiYXIsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihTREsuVGFyZ2V0TWFuYWdlci5FdmVudHMuU3VzcGVuZFN0YXRlQ2hhbmdlZCx0aGlzLl9vblN1c3BlbmRTdGF0ZUNoYW5nZWQsdGhpcyk7fQpzdGF0aWMgaW5zdGFuY2UoKXtyZXR1cm4oc2VsZi5ydW50aW1lLnNoYXJlZEluc3RhbmNlKFRpbWVsaW5lLlRpbWVsaW5lUGFuZWwpKTt9CnNlYXJjaGFibGVWaWV3KCl7cmV0dXJuIHRoaXMuX3NlYXJjaGFibGVWaWV3O30Kd2FzU2hvd24oKXtVSS5jb250ZXh0LnNldEZsYXZvcihUaW1lbGluZS5UaW1lbGluZVBhbmVsLHRoaXMpO30Kd2lsbEhpZGUoKXtVSS5jb250ZXh0LnNldEZsYXZvcihUaW1lbGluZS5UaW1lbGluZVBhbmVsLG51bGwpO3RoaXMuX2hpc3RvcnlNYW5hZ2VyLmNhbmNlbElmU2hvd2luZygpO30KbG9hZEZyb21FdmVudHMoZXZlbnRzKXtpZih0aGlzLl9zdGF0ZSE9PVRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuSWRsZSkKcmV0dXJuO3RoaXMuX3ByZXBhcmVUb0xvYWRUaW1lbGluZSgpO3RoaXMuX2xvYWRlcj1UaW1lbGluZS5UaW1lbGluZUxvYWRlci5sb2FkRnJvbUV2ZW50cyhldmVudHMsdGhpcyk7fQpfb25PdmVydmlld1dpbmRvd0NoYW5nZWQoZXZlbnQpe2NvbnN0IGxlZnQ9ZXZlbnQuZGF0YS5zdGFydFRpbWU7Y29uc3QgcmlnaHQ9ZXZlbnQuZGF0YS5lbmRUaW1lO3RoaXMuX3BlcmZvcm1hbmNlTW9kZWwuc2V0V2luZG93KHtsZWZ0LHJpZ2h0fSx0cnVlKTt9Cl9vbk1vZGVsV2luZG93Q2hhbmdlZChldmVudCl7Y29uc3Qgd2luZG93PShldmVudC5kYXRhLndpbmRvdyk7dGhpcy5fb3ZlcnZpZXdQYW5lLnNldFdpbmRvd1RpbWVzKHdpbmRvdy5sZWZ0LHdpbmRvdy5yaWdodCk7fQpfc2V0U3RhdGUoc3RhdGUpe3RoaXMuX3N0YXRlPXN0YXRlO3RoaXMuX3VwZGF0ZVRpbWVsaW5lQ29udHJvbHMoKTt9Cl9jcmVhdGVTZXR0aW5nQ2hlY2tib3goc2V0dGluZyx0b29sdGlwKXtjb25zdCBjaGVja2JveEl0ZW09bmV3IFVJLlRvb2xiYXJTZXR0aW5nQ2hlY2tib3goc2V0dGluZyx0b29sdGlwKTt0aGlzLl9yZWNvcmRpbmdPcHRpb25VSUNvbnRyb2xzLnB1c2goY2hlY2tib3hJdGVtKTtyZXR1cm4gY2hlY2tib3hJdGVtO30KX3BvcHVsYXRlVG9vbGJhcigpe3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbih0aGlzLl90b2dnbGVSZWNvcmRBY3Rpb24pKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fcmVjb3JkUmVsb2FkQWN0aW9uKSk7dGhpcy5fY2xlYXJCdXR0b249bmV3IFVJLlRvb2xiYXJCdXR0b24oQ29tbW9uLlVJU3RyaW5nKCdDbGVhcicpLCdsYXJnZWljb24tY2xlYXInKTt0aGlzLl9jbGVhckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFVJLlRvb2xiYXJCdXR0b24uRXZlbnRzLkNsaWNrLCgpPT50aGlzLl9vbkNsZWFyQnV0dG9uKCkpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jbGVhckJ1dHRvbik7dGhpcy5fbG9hZEJ1dHRvbj1uZXcgVUkuVG9vbGJhckJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ0xvYWQgcHJvZmlsZS4uLicpLCdsYXJnZWljb24tbG9hZCcpO3RoaXMuX2xvYWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+dGhpcy5fc2VsZWN0RmlsZVRvTG9hZCgpKTt0aGlzLl9zYXZlQnV0dG9uPW5ldyBVSS5Ub29sYmFyQnV0dG9uKENvbW1vbi5VSVN0cmluZygnU2F2ZSBwcm9maWxlLi4uJyksJ2xhcmdlaWNvbi1kb3dubG9hZCcpO3RoaXMuX3NhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihVSS5Ub29sYmFyQnV0dG9uLkV2ZW50cy5DbGljaywoKT0+dGhpcy5fc2F2ZVRvRmlsZSgpKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2xvYWRCdXR0b24pO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9zYXZlQnV0dG9uKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2hpc3RvcnlNYW5hZ2VyLmJ1dHRvbigpKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKCk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3RoaXMuX3Nob3dTY3JlZW5zaG90c1Rvb2xiYXJDaGVja2JveD10aGlzLl9jcmVhdGVTZXR0aW5nQ2hlY2tib3godGhpcy5fc2hvd1NjcmVlbnNob3RzU2V0dGluZyxDb21tb24uVUlTdHJpbmcoJ0NhcHR1cmUgc2NyZWVuc2hvdHMnKSk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3Nob3dTY3JlZW5zaG90c1Rvb2xiYXJDaGVja2JveCk7dGhpcy5fc2hvd01lbW9yeVRvb2xiYXJDaGVja2JveD10aGlzLl9jcmVhdGVTZXR0aW5nQ2hlY2tib3godGhpcy5fc2hvd01lbW9yeVNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdTaG93IG1lbW9yeSB0aW1lbGluZScpKTt0aGlzLl9wYW5lbFRvb2xiYXIuYXBwZW5kVG9vbGJhckl0ZW0odGhpcy5fc2hvd01lbW9yeVRvb2xiYXJDaGVja2JveCk7dGhpcy5fcGFuZWxUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKFVJLlRvb2xiYXIuY3JlYXRlQWN0aW9uQnV0dG9uRm9ySWQoJ2NvbXBvbmVudHMuY29sbGVjdC1nYXJiYWdlJykpO3RoaXMuX3BhbmVsUmlnaHRUb29sYmFyLmFwcGVuZFNlcGFyYXRvcigpO3RoaXMuX3BhbmVsUmlnaHRUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX3Nob3dTZXR0aW5nc1BhbmVCdXR0b24pO30KX2NyZWF0ZVNldHRpbmdzUGFuZSgpe3RoaXMuX3Nob3dTZXR0aW5nc1BhbmVTZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCd0aW1lbGluZVNob3dTZXR0aW5nc1Rvb2xiYXInLGZhbHNlKTt0aGlzLl9zaG93U2V0dGluZ3NQYW5lQnV0dG9uPW5ldyBVSS5Ub29sYmFyU2V0dGluZ1RvZ2dsZSh0aGlzLl9zaG93U2V0dGluZ3NQYW5lU2V0dGluZywnbGFyZ2VpY29uLXNldHRpbmdzLWdlYXInLENvbW1vbi5VSVN0cmluZygnQ2FwdHVyZSBzZXR0aW5ncycpKTtTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFNESy5NdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLkV2ZW50cy5Db25kaXRpb25zQ2hhbmdlZCx0aGlzLl91cGRhdGVTaG93U2V0dGluZ3NUb29sYmFyQnV0dG9uLHRoaXMpO01vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5hZGRFdmVudExpc3RlbmVyKE1vYmlsZVRocm90dGxpbmcuVGhyb3R0bGluZ01hbmFnZXIuRXZlbnRzLlJhdGVDaGFuZ2VkLHRoaXMuX3VwZGF0ZVNob3dTZXR0aW5nc1Rvb2xiYXJCdXR0b24sdGhpcyk7dGhpcy5fZGlzYWJsZUNhcHR1cmVKU1Byb2ZpbGVTZXR0aW5nLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuX3VwZGF0ZVNob3dTZXR0aW5nc1Rvb2xiYXJCdXR0b24sdGhpcyk7dGhpcy5fY2FwdHVyZUxheWVyc0FuZFBpY3R1cmVzU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGVTaG93U2V0dGluZ3NUb29sYmFyQnV0dG9uLHRoaXMpO3RoaXMuX3NldHRpbmdzUGFuZT1uZXcgVUkuSEJveCgpO3RoaXMuX3NldHRpbmdzUGFuZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RpbWVsaW5lLXNldHRpbmdzLXBhbmUnKTt0aGlzLl9zZXR0aW5nc1BhbmUuc2hvdyh0aGlzLmVsZW1lbnQpO2NvbnN0IGNhcHR1cmVUb29sYmFyPW5ldyBVSS5Ub29sYmFyKCcnLHRoaXMuX3NldHRpbmdzUGFuZS5lbGVtZW50KTtjYXB0dXJlVG9vbGJhci5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsZXgtYXV0bycpO2NhcHR1cmVUb29sYmFyLm1ha2VWZXJ0aWNhbCgpO2NhcHR1cmVUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX2NyZWF0ZVNldHRpbmdDaGVja2JveCh0aGlzLl9kaXNhYmxlQ2FwdHVyZUpTUHJvZmlsZVNldHRpbmcsQ29tbW9uLlVJU3RyaW5nKCdEaXNhYmxlcyBKYXZhU2NyaXB0IHNhbXBsaW5nLCByZWR1Y2VzIG92ZXJoZWFkIHdoZW4gcnVubmluZyBhZ2FpbnN0IG1vYmlsZSBkZXZpY2VzJykpKTtjYXB0dXJlVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jcmVhdGVTZXR0aW5nQ2hlY2tib3godGhpcy5fY2FwdHVyZUxheWVyc0FuZFBpY3R1cmVzU2V0dGluZyxDb21tb24uVUlTdHJpbmcoJ0NhcHR1cmVzIGFkdmFuY2VkIHBhaW50IGluc3RydW1lbnRhdGlvbiwgaW50cm9kdWNlcyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBvdmVyaGVhZCcpKSk7Y29uc3QgdGhyb3R0bGluZ1BhbmU9bmV3IFVJLlZCb3goKTt0aHJvdHRsaW5nUGFuZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZsZXgtYXV0bycpO3Rocm90dGxpbmdQYW5lLnNob3codGhpcy5fc2V0dGluZ3NQYW5lLmVsZW1lbnQpO2NvbnN0IG5ldHdvcmtUaHJvdHRsaW5nVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0aHJvdHRsaW5nUGFuZS5lbGVtZW50KTtuZXR3b3JrVGhyb3R0bGluZ1Rvb2xiYXIuYXBwZW5kVGV4dChDb21tb24uVUlTdHJpbmcoJ05ldHdvcms6JykpO3RoaXMuX25ldHdvcmtUaHJvdHRsaW5nU2VsZWN0PXRoaXMuX2NyZWF0ZU5ldHdvcmtDb25kaXRpb25zU2VsZWN0KCk7bmV0d29ya1Rocm90dGxpbmdUb29sYmFyLmFwcGVuZFRvb2xiYXJJdGVtKHRoaXMuX25ldHdvcmtUaHJvdHRsaW5nU2VsZWN0KTtjb25zdCBjcHVUaHJvdHRsaW5nVG9vbGJhcj1uZXcgVUkuVG9vbGJhcignJyx0aHJvdHRsaW5nUGFuZS5lbGVtZW50KTtjcHVUaHJvdHRsaW5nVG9vbGJhci5hcHBlbmRUZXh0KENvbW1vbi5VSVN0cmluZygnQ1BVOicpKTt0aGlzLl9jcHVUaHJvdHRsaW5nU2VsZWN0PU1vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5jcmVhdGVDUFVUaHJvdHRsaW5nU2VsZWN0b3IoKTtjcHVUaHJvdHRsaW5nVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbSh0aGlzLl9jcHVUaHJvdHRsaW5nU2VsZWN0KTt0aGlzLl9zaG93U2V0dGluZ3NQYW5lU2V0dGluZy5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLl91cGRhdGVTZXR0aW5nc1BhbmVWaXNpYmlsaXR5LmJpbmQodGhpcykpO3RoaXMuX3VwZGF0ZVNldHRpbmdzUGFuZVZpc2liaWxpdHkoKTt9Cl9hcHBlbmRFeHRlbnNpb25zVG9Ub29sYmFyKGV2ZW50KXtjb25zdCBwcm92aWRlcj0oZXZlbnQuZGF0YSk7Y29uc3Qgc2V0dGluZz1UaW1lbGluZS5UaW1lbGluZVBhbmVsLl9zZXR0aW5nRm9yVHJhY2VQcm92aWRlcihwcm92aWRlcik7Y29uc3QgY2hlY2tib3g9dGhpcy5fY3JlYXRlU2V0dGluZ0NoZWNrYm94KHNldHRpbmcscHJvdmlkZXIubG9uZ0Rpc3BsYXlOYW1lKCkpO3RoaXMuX3BhbmVsVG9vbGJhci5hcHBlbmRUb29sYmFySXRlbShjaGVja2JveCk7fQpzdGF0aWMgX3NldHRpbmdGb3JUcmFjZVByb3ZpZGVyKHRyYWNlUHJvdmlkZXIpe2xldCBzZXR0aW5nPXRyYWNlUHJvdmlkZXJbVGltZWxpbmUuVGltZWxpbmVQYW5lbC5fdHJhY2VQcm92aWRlclNldHRpbmdTeW1ib2xdO2lmKCFzZXR0aW5nKXtjb25zdCBwcm92aWRlcklkPXRyYWNlUHJvdmlkZXIucGVyc2lzdGVudElkZW50aWZpZXIoKTtzZXR0aW5nPUNvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKHByb3ZpZGVySWQsZmFsc2UpO3NldHRpbmcuc2V0VGl0bGUodHJhY2VQcm92aWRlci5zaG9ydERpc3BsYXlOYW1lKCkpO3RyYWNlUHJvdmlkZXJbVGltZWxpbmUuVGltZWxpbmVQYW5lbC5fdHJhY2VQcm92aWRlclNldHRpbmdTeW1ib2xdPXNldHRpbmc7fQpyZXR1cm4gc2V0dGluZzt9Cl9jcmVhdGVOZXR3b3JrQ29uZGl0aW9uc1NlbGVjdCgpe2NvbnN0IHRvb2xiYXJJdGVtPW5ldyBVSS5Ub29sYmFyQ29tYm9Cb3gobnVsbCk7dG9vbGJhckl0ZW0uc2V0TWF4V2lkdGgoMTQwKTtNb2JpbGVUaHJvdHRsaW5nLnRocm90dGxpbmdNYW5hZ2VyKCkuZGVjb3JhdGVTZWxlY3RXaXRoTmV0d29ya1Rocm90dGxpbmcodG9vbGJhckl0ZW0uc2VsZWN0RWxlbWVudCgpKTtyZXR1cm4gdG9vbGJhckl0ZW07fQpfcHJlcGFyZVRvTG9hZFRpbWVsaW5lKCl7Y29uc29sZS5hc3NlcnQodGhpcy5fc3RhdGU9PT1UaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLklkbGUpO3RoaXMuX3NldFN0YXRlKFRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuTG9hZGluZyk7aWYodGhpcy5fcGVyZm9ybWFuY2VNb2RlbCl7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5kaXNwb3NlKCk7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbD1udWxsO319Cl9jcmVhdGVGaWxlU2VsZWN0b3IoKXtpZih0aGlzLl9maWxlU2VsZWN0b3JFbGVtZW50KQp0aGlzLl9maWxlU2VsZWN0b3JFbGVtZW50LnJlbW92ZSgpO3RoaXMuX2ZpbGVTZWxlY3RvckVsZW1lbnQ9VUkuY3JlYXRlRmlsZVNlbGVjdG9yRWxlbWVudCh0aGlzLl9sb2FkRnJvbUZpbGUuYmluZCh0aGlzKSk7dGhpcy5fdGltZWxpbmVQYW5lLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZmlsZVNlbGVjdG9yRWxlbWVudCk7fQpfY29udGV4dE1lbnUoZXZlbnQpe2NvbnN0IGNvbnRleHRNZW51PW5ldyBVSS5Db250ZXh0TWVudShldmVudCk7Y29udGV4dE1lbnUuYXBwZW5kSXRlbXNBdExvY2F0aW9uKCd0aW1lbGluZU1lbnUnKTtjb250ZXh0TWVudS5zaG93KCk7fQphc3luYyBfc2F2ZVRvRmlsZSgpe2lmKHRoaXMuX3N0YXRlIT09VGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0ZS5JZGxlKQpyZXR1cm47Y29uc3QgcGVyZm9ybWFuY2VNb2RlbD10aGlzLl9wZXJmb3JtYW5jZU1vZGVsO2lmKCFwZXJmb3JtYW5jZU1vZGVsKQpyZXR1cm47Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgZmlsZU5hbWU9J1Byb2ZpbGUtJytub3cudG9JU084NjAxQ29tcGFjdCgpKycuanNvbic7Y29uc3Qgc3RyZWFtPW5ldyBCaW5kaW5ncy5GaWxlT3V0cHV0U3RyZWFtKCk7Y29uc3QgYWNjZXB0ZWQ9YXdhaXQgc3RyZWFtLm9wZW4oZmlsZU5hbWUpO2lmKCFhY2NlcHRlZCkKcmV0dXJuO2NvbnN0IGVycm9yPWF3YWl0IHBlcmZvcm1hbmNlTW9kZWwuc2F2ZShzdHJlYW0pO2lmKCFlcnJvcikKcmV0dXJuO0NvbW1vbi5jb25zb2xlLmVycm9yKENvbW1vbi5VSVN0cmluZygnRmFpbGVkIHRvIHNhdmUgdGltZWxpbmU6ICVzICglcywgJXMpJyxlcnJvci5tZXNzYWdlLGVycm9yLm5hbWUsZXJyb3IuY29kZSkpO30KYXN5bmMgX3Nob3dIaXN0b3J5KCl7Y29uc3QgbW9kZWw9YXdhaXQgdGhpcy5faGlzdG9yeU1hbmFnZXIuc2hvd0hpc3RvcnlEcm9wRG93bigpO2lmKG1vZGVsJiZtb2RlbCE9PXRoaXMuX3BlcmZvcm1hbmNlTW9kZWwpCnRoaXMuX3NldE1vZGVsKG1vZGVsKTt9Cl9uYXZpZ2F0ZUhpc3RvcnkoZGlyZWN0aW9uKXtjb25zdCBtb2RlbD10aGlzLl9oaXN0b3J5TWFuYWdlci5uYXZpZ2F0ZShkaXJlY3Rpb24pO2lmKG1vZGVsJiZtb2RlbCE9PXRoaXMuX3BlcmZvcm1hbmNlTW9kZWwpCnRoaXMuX3NldE1vZGVsKG1vZGVsKTtyZXR1cm4gdHJ1ZTt9Cl9zZWxlY3RGaWxlVG9Mb2FkKCl7dGhpcy5fZmlsZVNlbGVjdG9yRWxlbWVudC5jbGljaygpO30KX2xvYWRGcm9tRmlsZShmaWxlKXtpZih0aGlzLl9zdGF0ZSE9PVRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuSWRsZSkKcmV0dXJuO3RoaXMuX3ByZXBhcmVUb0xvYWRUaW1lbGluZSgpO3RoaXMuX2xvYWRlcj1UaW1lbGluZS5UaW1lbGluZUxvYWRlci5sb2FkRnJvbUZpbGUoZmlsZSx0aGlzKTt0aGlzLl9jcmVhdGVGaWxlU2VsZWN0b3IoKTt9Cl9sb2FkRnJvbVVSTCh1cmwpe2lmKHRoaXMuX3N0YXRlIT09VGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0ZS5JZGxlKQpyZXR1cm47dGhpcy5fcHJlcGFyZVRvTG9hZFRpbWVsaW5lKCk7dGhpcy5fbG9hZGVyPVRpbWVsaW5lLlRpbWVsaW5lTG9hZGVyLmxvYWRGcm9tVVJMKHVybCx0aGlzKTt9Cl91cGRhdGVPdmVydmlld0NvbnRyb2xzKCl7dGhpcy5fb3ZlcnZpZXdDb250cm9scz1bXTt0aGlzLl9vdmVydmlld0NvbnRyb2xzLnB1c2gobmV3IFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld1Jlc3BvbnNpdmVuZXNzKCkpO2lmKFJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCdpbnB1dEV2ZW50c09uVGltZWxpbmVPdmVydmlldycpKQp0aGlzLl9vdmVydmlld0NvbnRyb2xzLnB1c2gobmV3IFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld0lucHV0KCkpO3RoaXMuX292ZXJ2aWV3Q29udHJvbHMucHVzaChuZXcgVGltZWxpbmUuVGltZWxpbmVFdmVudE92ZXJ2aWV3RnJhbWVzKCkpO3RoaXMuX292ZXJ2aWV3Q29udHJvbHMucHVzaChuZXcgVGltZWxpbmUuVGltZWxpbmVFdmVudE92ZXJ2aWV3Q1BVQWN0aXZpdHkoKSk7dGhpcy5fb3ZlcnZpZXdDb250cm9scy5wdXNoKG5ldyBUaW1lbGluZS5UaW1lbGluZUV2ZW50T3ZlcnZpZXdOZXR3b3JrKCkpO2lmKHRoaXMuX3Nob3dTY3JlZW5zaG90c1NldHRpbmcuZ2V0KCkmJnRoaXMuX3BlcmZvcm1hbmNlTW9kZWwmJnRoaXMuX3BlcmZvcm1hbmNlTW9kZWwuZnJhbWVNb2RlbCgpLmZyYW1lcygpLmxlbmd0aCkKdGhpcy5fb3ZlcnZpZXdDb250cm9scy5wdXNoKG5ldyBUaW1lbGluZS5UaW1lbGluZUZpbG1TdHJpcE92ZXJ2aWV3KCkpO2lmKHRoaXMuX3Nob3dNZW1vcnlTZXR0aW5nLmdldCgpKQp0aGlzLl9vdmVydmlld0NvbnRyb2xzLnB1c2gobmV3IFRpbWVsaW5lLlRpbWVsaW5lRXZlbnRPdmVydmlld01lbW9yeSgpKTtmb3IoY29uc3QgY29udHJvbCBvZiB0aGlzLl9vdmVydmlld0NvbnRyb2xzKQpjb250cm9sLnNldE1vZGVsKHRoaXMuX3BlcmZvcm1hbmNlTW9kZWwpO3RoaXMuX292ZXJ2aWV3UGFuZS5zZXRPdmVydmlld0NvbnRyb2xzKHRoaXMuX292ZXJ2aWV3Q29udHJvbHMpO30KX29uTW9kZUNoYW5nZWQoKXt0aGlzLl91cGRhdGVPdmVydmlld0NvbnRyb2xzKCk7dGhpcy5kb1Jlc2l6ZSgpO3RoaXMuc2VsZWN0KG51bGwpO30KX3VwZGF0ZVNldHRpbmdzUGFuZVZpc2liaWxpdHkoKXtpZih0aGlzLl9zaG93U2V0dGluZ3NQYW5lU2V0dGluZy5nZXQoKSkKdGhpcy5fc2V0dGluZ3NQYW5lLnNob3dXaWRnZXQoKTtlbHNlCnRoaXMuX3NldHRpbmdzUGFuZS5oaWRlV2lkZ2V0KCk7fQpfdXBkYXRlU2hvd1NldHRpbmdzVG9vbGJhckJ1dHRvbigpe2NvbnN0IG1lc3NhZ2VzPVtdO2lmKE1vYmlsZVRocm90dGxpbmcudGhyb3R0bGluZ01hbmFnZXIoKS5jcHVUaHJvdHRsaW5nUmF0ZSgpIT09MSkKbWVzc2FnZXMucHVzaChDb21tb24uVUlTdHJpbmcoJy0gQ1BVIHRocm90dGxpbmcgaXMgZW5hYmxlZCcpKTtpZihTREsubXVsdGl0YXJnZXROZXR3b3JrTWFuYWdlci5pc1Rocm90dGxpbmcoKSkKbWVzc2FnZXMucHVzaChDb21tb24uVUlTdHJpbmcoJy0gTmV0d29yayB0aHJvdHRsaW5nIGlzIGVuYWJsZWQnKSk7aWYodGhpcy5fY2FwdHVyZUxheWVyc0FuZFBpY3R1cmVzU2V0dGluZy5nZXQoKSkKbWVzc2FnZXMucHVzaChDb21tb24uVUlTdHJpbmcoJy0gU2lnbmlmaWNhbnQgb3ZlcmhlYWQgZHVlIHRvIHBhaW50IGluc3RydW1lbnRhdGlvbicpKTtpZih0aGlzLl9kaXNhYmxlQ2FwdHVyZUpTUHJvZmlsZVNldHRpbmcuZ2V0KCkpCm1lc3NhZ2VzLnB1c2goQ29tbW9uLlVJU3RyaW5nKCctIEphdmFTY3JpcHQgc2FtcGxpbmcgaXMgZGlzYWJsZWQnKSk7dGhpcy5fc2hvd1NldHRpbmdzUGFuZUJ1dHRvbi5zZXREZWZhdWx0V2l0aFJlZENvbG9yKG1lc3NhZ2VzLmxlbmd0aCk7dGhpcy5fc2hvd1NldHRpbmdzUGFuZUJ1dHRvbi5zZXRUb2dnbGVXaXRoUmVkQ29sb3IobWVzc2FnZXMubGVuZ3RoKTtpZihtZXNzYWdlcy5sZW5ndGgpe2NvbnN0IHRvb2x0aXBFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2RpdicpO21lc3NhZ2VzLmZvckVhY2gobWVzc2FnZT0+e3Rvb2x0aXBFbGVtZW50LmNyZWF0ZUNoaWxkKCdkaXYnKS50ZXh0Q29udGVudD1tZXNzYWdlO30pO3RoaXMuX3Nob3dTZXR0aW5nc1BhbmVCdXR0b24uc2V0VGl0bGUodG9vbHRpcEVsZW1lbnQpO31lbHNle3RoaXMuX3Nob3dTZXR0aW5nc1BhbmVCdXR0b24uc2V0VGl0bGUoQ29tbW9uLlVJU3RyaW5nKCdDYXB0dXJlIHNldHRpbmdzJykpO319Cl9zZXRVSUNvbnRyb2xzRW5hYmxlZChlbmFibGVkKXt0aGlzLl9yZWNvcmRpbmdPcHRpb25VSUNvbnRyb2xzLmZvckVhY2goY29udHJvbD0+Y29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpKTt9CmFzeW5jIF9zdGFydFJlY29yZGluZygpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLl9zdGF0dXNQYW5lLCdTdGF0dXMgcGFuZSBpcyBhbHJlYWR5IG9wZW5lZC4nKTt0aGlzLl9zZXRTdGF0ZShUaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLlN0YXJ0UGVuZGluZyk7dGhpcy5fc2hvd1JlY29yZGluZ1N0YXJ0ZWQoKTtjb25zdCBlbmFibGVkVHJhY2VQcm92aWRlcnM9RXh0ZW5zaW9ucy5leHRlbnNpb25TZXJ2ZXIudHJhY2VQcm92aWRlcnMoKS5maWx0ZXIocHJvdmlkZXI9PlRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuX3NldHRpbmdGb3JUcmFjZVByb3ZpZGVyKHByb3ZpZGVyKS5nZXQoKSk7Y29uc3QgcmVjb3JkaW5nT3B0aW9ucz17ZW5hYmxlSlNTYW1wbGluZzohdGhpcy5fZGlzYWJsZUNhcHR1cmVKU1Byb2ZpbGVTZXR0aW5nLmdldCgpLGNhcHR1cmVQaWN0dXJlczp0aGlzLl9jYXB0dXJlTGF5ZXJzQW5kUGljdHVyZXNTZXR0aW5nLmdldCgpLGNhcHR1cmVGaWxtU3RyaXA6dGhpcy5fc2hvd1NjcmVlbnNob3RzU2V0dGluZy5nZXQoKX07Y29uc3QgbWFpblRhcmdldD0oU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpKTt0aGlzLl9jb250cm9sbGVyPW5ldyBUaW1lbGluZS5UaW1lbGluZUNvbnRyb2xsZXIobWFpblRhcmdldCx0aGlzKTt0aGlzLl9zZXRVSUNvbnRyb2xzRW5hYmxlZChmYWxzZSk7dGhpcy5faGlkZUxhbmRpbmdQYWdlKCk7YXdhaXQgdGhpcy5fY29udHJvbGxlci5zdGFydFJlY29yZGluZyhyZWNvcmRpbmdPcHRpb25zLGVuYWJsZWRUcmFjZVByb3ZpZGVycyk7dGhpcy5fcmVjb3JkaW5nU3RhcnRlZCgpO30KYXN5bmMgX3N0b3BSZWNvcmRpbmcoKXtpZih0aGlzLl9zdGF0dXNQYW5lKXt0aGlzLl9zdGF0dXNQYW5lLmZpbmlzaCgpO3RoaXMuX3N0YXR1c1BhbmUudXBkYXRlU3RhdHVzKENvbW1vbi5VSVN0cmluZygnU3RvcHBpbmcgdGltZWxpbmVcdTIwMjYnKSk7dGhpcy5fc3RhdHVzUGFuZS51cGRhdGVQcm9ncmVzc0JhcihDb21tb24uVUlTdHJpbmcoJ1JlY2VpdmVkJyksMCk7fQp0aGlzLl9zZXRTdGF0ZShUaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLlN0b3BQZW5kaW5nKTt0aGlzLl9wZXJmb3JtYW5jZU1vZGVsPWF3YWl0IHRoaXMuX2NvbnRyb2xsZXIuc3RvcFJlY29yZGluZygpO3RoaXMuX3NldFVJQ29udHJvbHNFbmFibGVkKHRydWUpO3RoaXMuX2NvbnRyb2xsZXIuZGlzcG9zZSgpO3RoaXMuX2NvbnRyb2xsZXI9bnVsbDt9Cl9vblN1c3BlbmRTdGF0ZUNoYW5nZWQoKXt0aGlzLl91cGRhdGVUaW1lbGluZUNvbnRyb2xzKCk7fQpfdXBkYXRlVGltZWxpbmVDb250cm9scygpe2NvbnN0IHN0YXRlPVRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGU7dGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uLnNldFRvZ2dsZWQodGhpcy5fc3RhdGU9PT1zdGF0ZS5SZWNvcmRpbmcpO3RoaXMuX3RvZ2dsZVJlY29yZEFjdGlvbi5zZXRFbmFibGVkKHRoaXMuX3N0YXRlPT09c3RhdGUuUmVjb3JkaW5nfHx0aGlzLl9zdGF0ZT09PXN0YXRlLklkbGUpO3RoaXMuX3JlY29yZFJlbG9hZEFjdGlvbi5zZXRFbmFibGVkKHRoaXMuX3N0YXRlPT09c3RhdGUuSWRsZSk7dGhpcy5faGlzdG9yeU1hbmFnZXIuc2V0RW5hYmxlZCh0aGlzLl9zdGF0ZT09PXN0YXRlLklkbGUpO3RoaXMuX2NsZWFyQnV0dG9uLnNldEVuYWJsZWQodGhpcy5fc3RhdGU9PT1zdGF0ZS5JZGxlKTt0aGlzLl9wYW5lbFRvb2xiYXIuc2V0RW5hYmxlZCh0aGlzLl9zdGF0ZSE9PXN0YXRlLkxvYWRpbmcpO3RoaXMuX3BhbmVsUmlnaHRUb29sYmFyLnNldEVuYWJsZWQodGhpcy5fc3RhdGUhPT1zdGF0ZS5Mb2FkaW5nKTt0aGlzLl9kcm9wVGFyZ2V0LnNldEVuYWJsZWQodGhpcy5fc3RhdGU9PT1zdGF0ZS5JZGxlKTt0aGlzLl9sb2FkQnV0dG9uLnNldEVuYWJsZWQodGhpcy5fc3RhdGU9PT1zdGF0ZS5JZGxlKTt0aGlzLl9zYXZlQnV0dG9uLnNldEVuYWJsZWQodGhpcy5fc3RhdGU9PT1zdGF0ZS5JZGxlJiYhIXRoaXMuX3BlcmZvcm1hbmNlTW9kZWwpO30KX3RvZ2dsZVJlY29yZGluZygpe2lmKHRoaXMuX3N0YXRlPT09VGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0ZS5JZGxlKXt0aGlzLl9yZWNvcmRpbmdQYWdlUmVsb2FkPWZhbHNlO3RoaXMuX3N0YXJ0UmVjb3JkaW5nKCk7SG9zdC51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihIb3N0LlVzZXJNZXRyaWNzLkFjdGlvbi5UaW1lbGluZVN0YXJ0ZWQpO31lbHNlIGlmKHRoaXMuX3N0YXRlPT09VGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0ZS5SZWNvcmRpbmcpe3RoaXMuX3N0b3BSZWNvcmRpbmcoKTt9fQpfcmVjb3JkUmVsb2FkKCl7aWYodGhpcy5fc3RhdGUhPT1UaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLklkbGUpCnJldHVybjt0aGlzLl9yZWNvcmRpbmdQYWdlUmVsb2FkPXRydWU7dGhpcy5fc3RhcnRSZWNvcmRpbmcoKTtIb3N0LnVzZXJNZXRyaWNzLmFjdGlvblRha2VuKEhvc3QuVXNlck1ldHJpY3MuQWN0aW9uLlRpbWVsaW5lUGFnZVJlbG9hZFN0YXJ0ZWQpO30KX29uQ2xlYXJCdXR0b24oKXt0aGlzLl9oaXN0b3J5TWFuYWdlci5jbGVhcigpO3RoaXMuX2NsZWFyKCk7fQpfY2xlYXIoKXt0aGlzLl9zaG93TGFuZGluZ1BhZ2UoKTt0aGlzLl9yZXNldCgpO30KX3Jlc2V0KCl7UGVyZlVJLkxpbmVMZXZlbFByb2ZpbGUuaW5zdGFuY2UoKS5yZXNldCgpO3RoaXMuX3NldE1vZGVsKG51bGwpO30KX2FwcGx5RmlsdGVycyhtb2RlbCl7aWYobW9kZWwudGltZWxpbmVNb2RlbCgpLmlzR2VuZXJpY1RyYWNlKCl8fFJ1bnRpbWUuZXhwZXJpbWVudHMuaXNFbmFibGVkKCd0aW1lbGluZVNob3dBbGxFdmVudHMnKSkKcmV0dXJuO21vZGVsLnNldEZpbHRlcnMoW1RpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy52aXNpYmxlRXZlbnRzRmlsdGVyKCksbmV3IFRpbWVsaW5lTW9kZWwuRXhjbHVkZVRvcExldmVsRmlsdGVyKCldKTt9Cl9zZXRNb2RlbChtb2RlbCl7aWYodGhpcy5fcGVyZm9ybWFuY2VNb2RlbCl7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFRpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25Nb2RlbFdpbmRvd0NoYW5nZWQsdGhpcyk7fQp0aGlzLl9wZXJmb3JtYW5jZU1vZGVsPW1vZGVsO2lmKG1vZGVsKQp0aGlzLl9hcHBseUZpbHRlcnMobW9kZWwpO3RoaXMuX2ZsYW1lQ2hhcnQuc2V0TW9kZWwobW9kZWwpO3RoaXMuX3VwZGF0ZU92ZXJ2aWV3Q29udHJvbHMoKTt0aGlzLl9vdmVydmlld1BhbmUucmVzZXQoKTtpZihtb2RlbCl7dGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5hZGRFdmVudExpc3RlbmVyKFRpbWVsaW5lLlBlcmZvcm1hbmNlTW9kZWwuRXZlbnRzLldpbmRvd0NoYW5nZWQsdGhpcy5fb25Nb2RlbFdpbmRvd0NoYW5nZWQsdGhpcyk7dGhpcy5fb3ZlcnZpZXdQYW5lLnNldEJvdW5kcyhtb2RlbC50aW1lbGluZU1vZGVsKCkubWluaW11bVJlY29yZFRpbWUoKSxtb2RlbC50aW1lbGluZU1vZGVsKCkubWF4aW11bVJlY29yZFRpbWUoKSk7Zm9yKGNvbnN0IHByb2ZpbGUgb2YgbW9kZWwudGltZWxpbmVNb2RlbCgpLmNwdVByb2ZpbGVzKCkpClBlcmZVSS5MaW5lTGV2ZWxQcm9maWxlLmluc3RhbmNlKCkuYXBwZW5kQ1BVUHJvZmlsZShwcm9maWxlKTt0aGlzLl9zZXRNYXJrZXJzKG1vZGVsLnRpbWVsaW5lTW9kZWwoKSk7dGhpcy5fZmxhbWVDaGFydC5zZXRTZWxlY3Rpb24obnVsbCk7dGhpcy5fb3ZlcnZpZXdQYW5lLnNldFdpbmRvd1RpbWVzKG1vZGVsLndpbmRvdygpLmxlZnQsbW9kZWwud2luZG93KCkucmlnaHQpO30KZm9yKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5fb3ZlcnZpZXdDb250cm9scykKY29udHJvbC5zZXRNb2RlbChtb2RlbCk7aWYodGhpcy5fZmxhbWVDaGFydCkKdGhpcy5fZmxhbWVDaGFydC5yZXNpemVUb1ByZWZlcnJlZEhlaWdodHMoKTt0aGlzLl91cGRhdGVUaW1lbGluZUNvbnRyb2xzKCk7fQpfcmVjb3JkaW5nU3RhcnRlZCgpe2lmKHRoaXMuX3JlY29yZGluZ1BhZ2VSZWxvYWQpe2NvbnN0IHRhcmdldD10aGlzLl9jb250cm9sbGVyLm1haW5UYXJnZXQoKTtjb25zdCByZXNvdXJjZU1vZGVsPXRhcmdldC5tb2RlbChTREsuUmVzb3VyY2VUcmVlTW9kZWwpO2lmKHJlc291cmNlTW9kZWwpCnJlc291cmNlTW9kZWwucmVsb2FkUGFnZSgpO30KdGhpcy5fcmVzZXQoKTt0aGlzLl9zZXRTdGF0ZShUaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLlJlY29yZGluZyk7dGhpcy5fc2hvd1JlY29yZGluZ1N0YXJ0ZWQoKTt0aGlzLl9zdGF0dXNQYW5lLnVwZGF0ZVN0YXR1cyhDb21tb24uVUlTdHJpbmcoJ1Byb2ZpbGluZ1x1MjAyNicpKTt0aGlzLl9zdGF0dXNQYW5lLnVwZGF0ZVByb2dyZXNzQmFyKENvbW1vbi5VSVN0cmluZygnQnVmZmVyIHVzYWdlJyksMCk7dGhpcy5fc3RhdHVzUGFuZS5zdGFydFRpbWVyKCk7dGhpcy5faGlkZUxhbmRpbmdQYWdlKCk7fQpyZWNvcmRpbmdQcm9ncmVzcyh1c2FnZSl7dGhpcy5fc3RhdHVzUGFuZS51cGRhdGVQcm9ncmVzc0JhcihDb21tb24uVUlTdHJpbmcoJ0J1ZmZlciB1c2FnZScpLHVzYWdlKjEwMCk7fQpfc2hvd0xhbmRpbmdQYWdlKCl7aWYodGhpcy5fbGFuZGluZ1BhZ2Upe3RoaXMuX2xhbmRpbmdQYWdlLnNob3codGhpcy5fc3RhdHVzUGFuZUNvbnRhaW5lcik7cmV0dXJuO30KZnVuY3Rpb24gZW5jbG9zZVdpdGhUYWcodGFnTmFtZSxjb250ZW50cyl7Y29uc3QgZT1jcmVhdGVFbGVtZW50KHRhZ05hbWUpO2UudGV4dENvbnRlbnQ9Y29udGVudHM7cmV0dXJuIGU7fQpjb25zdCBsZWFybk1vcmVOb2RlPVVJLlhMaW5rLmNyZWF0ZSgnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2Nocm9tZS1kZXZ0b29scy9ldmFsdWF0ZS1wZXJmb3JtYW5jZS8nLENvbW1vbi5VSVN0cmluZygnTGVhcm5ceGEwbW9yZScpKTtjb25zdCByZWNvcmRLZXk9ZW5jbG9zZVdpdGhUYWcoJ2InLFVJLnNob3J0Y3V0UmVnaXN0cnkuc2hvcnRjdXREZXNjcmlwdG9yc0ZvckFjdGlvbigndGltZWxpbmUudG9nZ2xlLXJlY29yZGluZycpWzBdLm5hbWUpO2NvbnN0IHJlbG9hZEtleT1lbmNsb3NlV2l0aFRhZygnYicsVUkuc2hvcnRjdXRSZWdpc3RyeS5zaG9ydGN1dERlc2NyaXB0b3JzRm9yQWN0aW9uKCd0aW1lbGluZS5yZWNvcmQtcmVsb2FkJylbMF0ubmFtZSk7Y29uc3QgbmF2aWdhdGVOb2RlPWVuY2xvc2VXaXRoVGFnKCdiJyxDb21tb24uVUlTdHJpbmcoJ1dBU0QnKSk7dGhpcy5fbGFuZGluZ1BhZ2U9bmV3IFVJLlZCb3goKTt0aGlzLl9sYW5kaW5nUGFnZS5jb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aW1lbGluZS1sYW5kaW5nLXBhZ2UnLCdmaWxsJyk7Y29uc3QgY2VudGVyZWQ9dGhpcy5fbGFuZGluZ1BhZ2UuY29udGVudEVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicpO2NvbnN0IHJlY29yZEJ1dHRvbj1VSS5jcmVhdGVJbmxpbmVCdXR0b24oVUkuVG9vbGJhci5jcmVhdGVBY3Rpb25CdXR0b24odGhpcy5fdG9nZ2xlUmVjb3JkQWN0aW9uKSk7Y29uc3QgcmVsb2FkQnV0dG9uPVVJLmNyZWF0ZUlubGluZUJ1dHRvbihVSS5Ub29sYmFyLmNyZWF0ZUFjdGlvbkJ1dHRvbkZvcklkKCd0aW1lbGluZS5yZWNvcmQtcmVsb2FkJykpO2NlbnRlcmVkLmNyZWF0ZUNoaWxkKCdwJykuYXBwZW5kQ2hpbGQoVUkuZm9ybWF0TG9jYWxpemVkKCdDbGljayB0aGUgcmVjb3JkIGJ1dHRvbiAlcyBvciBoaXQgJXMgdG8gc3RhcnQgYSBuZXcgcmVjb3JkaW5nLlxuJysnQ2xpY2sgdGhlIHJlbG9hZCBidXR0b24gJXMgb3IgaGl0ICVzIHRvIHJlY29yZCB0aGUgcGFnZSBsb2FkLicsW3JlY29yZEJ1dHRvbixyZWNvcmRLZXkscmVsb2FkQnV0dG9uLHJlbG9hZEtleV0pKTtjZW50ZXJlZC5jcmVhdGVDaGlsZCgncCcpLmFwcGVuZENoaWxkKFVJLmZvcm1hdExvY2FsaXplZCgnQWZ0ZXIgcmVjb3JkaW5nLCBzZWxlY3QgYW4gYXJlYSBvZiBpbnRlcmVzdCBpbiB0aGUgb3ZlcnZpZXcgYnkgZHJhZ2dpbmcuXG4nKydUaGVuLCB6b29tIGFuZCBwYW4gdGhlIHRpbWVsaW5lIHdpdGggdGhlIG1vdXNld2hlZWwgb3IgJXMga2V5cy5cbiVzJyxbbmF2aWdhdGVOb2RlLGxlYXJuTW9yZU5vZGVdKSk7dGhpcy5fbGFuZGluZ1BhZ2Uuc2hvdyh0aGlzLl9zdGF0dXNQYW5lQ29udGFpbmVyKTt9Cl9oaWRlTGFuZGluZ1BhZ2UoKXt0aGlzLl9sYW5kaW5nUGFnZS5kZXRhY2goKTt9CmxvYWRpbmdTdGFydGVkKCl7dGhpcy5faGlkZUxhbmRpbmdQYWdlKCk7aWYodGhpcy5fc3RhdHVzUGFuZSkKdGhpcy5fc3RhdHVzUGFuZS5oaWRlKCk7dGhpcy5fc3RhdHVzUGFuZT1uZXcgVGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0dXNQYW5lKGZhbHNlLHRoaXMuX2NhbmNlbExvYWRpbmcuYmluZCh0aGlzKSk7dGhpcy5fc3RhdHVzUGFuZS5zaG93UGFuZSh0aGlzLl9zdGF0dXNQYW5lQ29udGFpbmVyKTt0aGlzLl9zdGF0dXNQYW5lLnVwZGF0ZVN0YXR1cyhDb21tb24uVUlTdHJpbmcoJ0xvYWRpbmcgcHJvZmlsZVx1MjAyNicpKTtpZighdGhpcy5fbG9hZGVyKQp0aGlzLl9zdGF0dXNQYW5lLmZpbmlzaCgpO3RoaXMubG9hZGluZ1Byb2dyZXNzKDApO30KbG9hZGluZ1Byb2dyZXNzKHByb2dyZXNzKXtpZih0eXBlb2YgcHJvZ3Jlc3M9PT0nbnVtYmVyJykKdGhpcy5fc3RhdHVzUGFuZS51cGRhdGVQcm9ncmVzc0JhcihDb21tb24uVUlTdHJpbmcoJ1JlY2VpdmVkJykscHJvZ3Jlc3MqMTAwKTt9CnByb2Nlc3NpbmdTdGFydGVkKCl7dGhpcy5fc3RhdHVzUGFuZS51cGRhdGVTdGF0dXMoQ29tbW9uLlVJU3RyaW5nKCdQcm9jZXNzaW5nIHByb2ZpbGVcdTIwMjYnKSk7fQpsb2FkaW5nQ29tcGxldGUodHJhY2luZ01vZGVsKXtkZWxldGUgdGhpcy5fbG9hZGVyO3RoaXMuX3NldFN0YXRlKFRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuSWRsZSk7aWYodGhpcy5fc3RhdHVzUGFuZSkKdGhpcy5fc3RhdHVzUGFuZS5oaWRlKCk7ZGVsZXRlIHRoaXMuX3N0YXR1c1BhbmU7aWYoIXRyYWNpbmdNb2RlbCl7dGhpcy5fY2xlYXIoKTtyZXR1cm47fQppZighdGhpcy5fcGVyZm9ybWFuY2VNb2RlbCkKdGhpcy5fcGVyZm9ybWFuY2VNb2RlbD1uZXcgVGltZWxpbmUuUGVyZm9ybWFuY2VNb2RlbCgpO3RoaXMuX3BlcmZvcm1hbmNlTW9kZWwuc2V0VHJhY2luZ01vZGVsKHRyYWNpbmdNb2RlbCk7dGhpcy5fc2V0TW9kZWwodGhpcy5fcGVyZm9ybWFuY2VNb2RlbCk7dGhpcy5faGlzdG9yeU1hbmFnZXIuYWRkUmVjb3JkaW5nKHRoaXMuX3BlcmZvcm1hbmNlTW9kZWwpO30KX3Nob3dSZWNvcmRpbmdTdGFydGVkKCl7aWYodGhpcy5fc3RhdHVzUGFuZSkKcmV0dXJuO3RoaXMuX3N0YXR1c1BhbmU9bmV3IFRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdHVzUGFuZSh0cnVlLHRoaXMuX3N0b3BSZWNvcmRpbmcuYmluZCh0aGlzKSk7dGhpcy5fc3RhdHVzUGFuZS5zaG93UGFuZSh0aGlzLl9zdGF0dXNQYW5lQ29udGFpbmVyKTt0aGlzLl9zdGF0dXNQYW5lLnVwZGF0ZVN0YXR1cyhDb21tb24uVUlTdHJpbmcoJ0luaXRpYWxpemluZyBwcm9maWxlclx1MjAyNicpKTt9Cl9jYW5jZWxMb2FkaW5nKCl7aWYodGhpcy5fbG9hZGVyKQp0aGlzLl9sb2FkZXIuY2FuY2VsKCk7fQpfc2V0TWFya2Vycyh0aW1lbGluZU1vZGVsKXtjb25zdCBtYXJrZXJzPW5ldyBNYXAoKTtjb25zdCByZWNvcmRUeXBlcz1UaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuUmVjb3JkVHlwZTtjb25zdCB6ZXJvVGltZT10aW1lbGluZU1vZGVsLm1pbmltdW1SZWNvcmRUaW1lKCk7Y29uc3QgZmlsdGVyPVRpbWVsaW5lLlRpbWVsaW5lVUlVdGlscy5wYWludEV2ZW50c0ZpbHRlcigpO2Zvcihjb25zdCBldmVudCBvZiB0aW1lbGluZU1vZGVsLnRpbWVNYXJrZXJFdmVudHMoKSl7aWYoZXZlbnQubmFtZT09PXJlY29yZFR5cGVzLlRpbWVTdGFtcHx8ZXZlbnQubmFtZT09PXJlY29yZFR5cGVzLkNvbnNvbGVUaW1lKQpjb250aW51ZTtpZighZmlsdGVyLmFjY2VwdChldmVudCkpCmNvbnRpbnVlO21hcmtlcnMuc2V0KGV2ZW50LnN0YXJ0VGltZSxUaW1lbGluZS5UaW1lbGluZVVJVXRpbHMuY3JlYXRlRXZlbnREaXZpZGVyKGV2ZW50LHplcm9UaW1lKSk7fQp0aGlzLl9vdmVydmlld1BhbmUuc2V0TWFya2VycyhtYXJrZXJzKTt9CmFzeW5jIF9sb2FkRXZlbnRGaXJlZChldmVudCl7aWYodGhpcy5fc3RhdGUhPT1UaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlLlJlY29yZGluZ3x8IXRoaXMuX3JlY29yZGluZ1BhZ2VSZWxvYWR8fHRoaXMuX2NvbnRyb2xsZXIubWFpblRhcmdldCgpIT09ZXZlbnQuZGF0YS5yZXNvdXJjZVRyZWVNb2RlbC50YXJnZXQoKSkKcmV0dXJuO2NvbnN0IGNvbnRyb2xsZXI9dGhpcy5fY29udHJvbGxlcjthd2FpdCBuZXcgUHJvbWlzZShyPT5zZXRUaW1lb3V0KHIsdGhpcy5fbWlsbGlzZWNvbmRzVG9SZWNvcmRBZnRlckxvYWRFdmVudCkpO2lmKGNvbnRyb2xsZXIhPT10aGlzLl9jb250cm9sbGVyfHx0aGlzLl9zdGF0ZSE9PVRpbWVsaW5lLlRpbWVsaW5lUGFuZWwuU3RhdGUuUmVjb3JkaW5nKQpyZXR1cm47dGhpcy5fc3RvcFJlY29yZGluZygpO30KX2ZyYW1lRm9yU2VsZWN0aW9uKHNlbGVjdGlvbil7c3dpdGNoKHNlbGVjdGlvbi50eXBlKCkpe2Nhc2UgVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uVHlwZS5GcmFtZTpyZXR1cm4oc2VsZWN0aW9uLm9iamVjdCgpKTtjYXNlIFRpbWVsaW5lLlRpbWVsaW5lU2VsZWN0aW9uLlR5cGUuUmFuZ2U6cmV0dXJuIG51bGw7Y2FzZSBUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5UeXBlLlRyYWNlRXZlbnQ6cmV0dXJuIHRoaXMuX3BlcmZvcm1hbmNlTW9kZWwuZnJhbWVNb2RlbCgpLmZyYW1lcyhzZWxlY3Rpb24uX2VuZFRpbWUsc2VsZWN0aW9uLl9lbmRUaW1lKVswXTtkZWZhdWx0OmNvbnNvbGUuYXNzZXJ0KGZhbHNlLCdTaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCcpO3JldHVybiBudWxsO319Cl9qdW1wVG9GcmFtZShvZmZzZXQpe2NvbnN0IGN1cnJlbnRGcmFtZT10aGlzLl9zZWxlY3Rpb24mJnRoaXMuX2ZyYW1lRm9yU2VsZWN0aW9uKHRoaXMuX3NlbGVjdGlvbik7aWYoIWN1cnJlbnRGcmFtZSkKcmV0dXJuO2NvbnN0IGZyYW1lcz10aGlzLl9wZXJmb3JtYW5jZU1vZGVsLmZyYW1lcygpO2xldCBpbmRleD1mcmFtZXMuaW5kZXhPZihjdXJyZW50RnJhbWUpO2NvbnNvbGUuYXNzZXJ0KGluZGV4Pj0wLCdDYW5cJ3QgZmluZCBjdXJyZW50IGZyYW1lIGluIHRoZSBmcmFtZSBsaXN0Jyk7aW5kZXg9TnVtYmVyLmNvbnN0cmFpbihpbmRleCtvZmZzZXQsMCxmcmFtZXMubGVuZ3RoLTEpO2NvbnN0IGZyYW1lPWZyYW1lc1tpbmRleF07dGhpcy5fcmV2ZWFsVGltZVJhbmdlKGZyYW1lLnN0YXJ0VGltZSxmcmFtZS5lbmRUaW1lKTt0aGlzLnNlbGVjdChUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5mcm9tRnJhbWUoZnJhbWUpKTtyZXR1cm4gdHJ1ZTt9CnNlbGVjdChzZWxlY3Rpb24pe3RoaXMuX3NlbGVjdGlvbj1zZWxlY3Rpb247dGhpcy5fZmxhbWVDaGFydC5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTt9CnNlbGVjdEVudHJ5QXRUaW1lKGV2ZW50cyx0aW1lKXtpZighZXZlbnRzKQpyZXR1cm47Zm9yKGxldCBpbmRleD1ldmVudHMudXBwZXJCb3VuZCh0aW1lLCh0aW1lLGV2ZW50KT0+dGltZS1ldmVudC5zdGFydFRpbWUpLTE7aW5kZXg+PTA7LS1pbmRleCl7Y29uc3QgZXZlbnQ9ZXZlbnRzW2luZGV4XTtjb25zdCBlbmRUaW1lPWV2ZW50LmVuZFRpbWV8fGV2ZW50LnN0YXJ0VGltZTtpZihTREsuVHJhY2luZ01vZGVsLmlzVG9wTGV2ZWxFdmVudChldmVudCkmJmVuZFRpbWU8dGltZSkKYnJlYWs7aWYodGhpcy5fcGVyZm9ybWFuY2VNb2RlbC5pc1Zpc2libGUoZXZlbnQpJiZlbmRUaW1lPj10aW1lKXt0aGlzLnNlbGVjdChUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5mcm9tVHJhY2VFdmVudChldmVudCkpO3JldHVybjt9fQp0aGlzLnNlbGVjdChudWxsKTt9CmhpZ2hsaWdodEV2ZW50KGV2ZW50KXt0aGlzLl9mbGFtZUNoYXJ0LmhpZ2hsaWdodEV2ZW50KGV2ZW50KTt9Cl9yZXZlYWxUaW1lUmFuZ2Uoc3RhcnRUaW1lLGVuZFRpbWUpe2NvbnN0IHdpbmRvdz10aGlzLl9wZXJmb3JtYW5jZU1vZGVsLndpbmRvdygpO2xldCBvZmZzZXQ9MDtpZih3aW5kb3cucmlnaHQ8ZW5kVGltZSkKb2Zmc2V0PWVuZFRpbWUtd2luZG93LnJpZ2h0O2Vsc2UgaWYod2luZG93LmxlZnQ+c3RhcnRUaW1lKQpvZmZzZXQ9c3RhcnRUaW1lLXdpbmRvdy5sZWZ0O3RoaXMuX3BlcmZvcm1hbmNlTW9kZWwuc2V0V2luZG93KHtsZWZ0OndpbmRvdy5sZWZ0K29mZnNldCxyaWdodDp3aW5kb3cucmlnaHQrb2Zmc2V0fSx0cnVlKTt9Cl9oYW5kbGVEcm9wKGRhdGFUcmFuc2Zlcil7Y29uc3QgaXRlbXM9ZGF0YVRyYW5zZmVyLml0ZW1zO2lmKCFpdGVtcy5sZW5ndGgpCnJldHVybjtjb25zdCBpdGVtPWl0ZW1zWzBdO2lmKGl0ZW0ua2luZD09PSdzdHJpbmcnKXtjb25zdCB1cmw9ZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvdXJpLWxpc3QnKTtpZihuZXcgQ29tbW9uLlBhcnNlZFVSTCh1cmwpLmlzVmFsaWQpCnRoaXMuX2xvYWRGcm9tVVJMKHVybCk7fWVsc2UgaWYoaXRlbS5raW5kPT09J2ZpbGUnKXtjb25zdCBlbnRyeT1pdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5KCk7aWYoIWVudHJ5LmlzRmlsZSkKcmV0dXJuO2VudHJ5LmZpbGUodGhpcy5fbG9hZEZyb21GaWxlLmJpbmQodGhpcykpO319fTtUaW1lbGluZS5UaW1lbGluZVBhbmVsLlN0YXRlPXtJZGxlOlN5bWJvbCgnSWRsZScpLFN0YXJ0UGVuZGluZzpTeW1ib2woJ1N0YXJ0UGVuZGluZycpLFJlY29yZGluZzpTeW1ib2woJ1JlY29yZGluZycpLFN0b3BQZW5kaW5nOlN5bWJvbCgnU3RvcFBlbmRpbmcnKSxMb2FkaW5nOlN5bWJvbCgnTG9hZGluZycpfTtUaW1lbGluZS5UaW1lbGluZVBhbmVsLlZpZXdNb2RlPXtGbGFtZUNoYXJ0OidGbGFtZUNoYXJ0JyxCb3R0b21VcDonQm90dG9tVXAnLENhbGxUcmVlOidDYWxsVHJlZScsRXZlbnRMb2c6J0V2ZW50TG9nJ307VGltZWxpbmUuVGltZWxpbmVQYW5lbC5yb3dIZWlnaHQ9MTg7VGltZWxpbmUuVGltZWxpbmVQYW5lbC5oZWFkZXJIZWlnaHQ9MjA7VGltZWxpbmUuVGltZWxpbmVQYW5lbC5Nb2RlbFNlbGVjdGlvbkRhdGE7VGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb249Y2xhc3N7Y29uc3RydWN0b3IodHlwZSxzdGFydFRpbWUsZW5kVGltZSxvYmplY3Qpe3RoaXMuX3R5cGU9dHlwZTt0aGlzLl9zdGFydFRpbWU9c3RhcnRUaW1lO3RoaXMuX2VuZFRpbWU9ZW5kVGltZTt0aGlzLl9vYmplY3Q9b2JqZWN0fHxudWxsO30Kc3RhdGljIGZyb21GcmFtZShmcmFtZSl7cmV0dXJuIG5ldyBUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbihUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5UeXBlLkZyYW1lLGZyYW1lLnN0YXJ0VGltZSxmcmFtZS5lbmRUaW1lLGZyYW1lKTt9CnN0YXRpYyBmcm9tTmV0d29ya1JlcXVlc3QocmVxdWVzdCl7cmV0dXJuIG5ldyBUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbihUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5UeXBlLk5ldHdvcmtSZXF1ZXN0LHJlcXVlc3Quc3RhcnRUaW1lLHJlcXVlc3QuZW5kVGltZXx8cmVxdWVzdC5zdGFydFRpbWUscmVxdWVzdCk7fQpzdGF0aWMgZnJvbVRyYWNlRXZlbnQoZXZlbnQpe3JldHVybiBuZXcgVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24oVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uVHlwZS5UcmFjZUV2ZW50LGV2ZW50LnN0YXJ0VGltZSxldmVudC5lbmRUaW1lfHwoZXZlbnQuc3RhcnRUaW1lKzEpLGV2ZW50KTt9CnN0YXRpYyBmcm9tUmFuZ2Uoc3RhcnRUaW1lLGVuZFRpbWUpe3JldHVybiBuZXcgVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24oVGltZWxpbmUuVGltZWxpbmVTZWxlY3Rpb24uVHlwZS5SYW5nZSxzdGFydFRpbWUsZW5kVGltZSk7fQp0eXBlKCl7cmV0dXJuIHRoaXMuX3R5cGU7fQpvYmplY3QoKXtyZXR1cm4gdGhpcy5fb2JqZWN0O30Kc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZTt9CmVuZFRpbWUoKXtyZXR1cm4gdGhpcy5fZW5kVGltZTt9fTtUaW1lbGluZS5UaW1lbGluZVNlbGVjdGlvbi5UeXBlPXtGcmFtZTonRnJhbWUnLE5ldHdvcmtSZXF1ZXN0OidOZXR3b3JrUmVxdWVzdCcsVHJhY2VFdmVudDonVHJhY2VFdmVudCcsUmFuZ2U6J1JhbmdlJ307VGltZWxpbmUuVGltZWxpbmVNb2RlVmlld0RlbGVnYXRlPWZ1bmN0aW9uKCl7fTtUaW1lbGluZS5UaW1lbGluZU1vZGVWaWV3RGVsZWdhdGUucHJvdG90eXBlPXtzZWxlY3Qoc2VsZWN0aW9uKXt9LHNlbGVjdEVudHJ5QXRUaW1lKGV2ZW50cyx0aW1lKXt9LGhpZ2hsaWdodEV2ZW50KGV2ZW50KXt9LH07VGltZWxpbmUuVGltZWxpbmVQYW5lbC5TdGF0dXNQYW5lPWNsYXNzIGV4dGVuZHMgVUkuVkJveHtjb25zdHJ1Y3RvcihzaG93VGltZXIsc3RvcENhbGxiYWNrKXtzdXBlcih0cnVlKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ3RpbWVsaW5lL3RpbWVsaW5lU3RhdHVzRGlhbG9nLmNzcycpO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGltZWxpbmUtc3RhdHVzLWRpYWxvZycpO2NvbnN0IHN0YXR1c0xpbmU9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhdHVzLWRpYWxvZy1saW5lIHN0YXR1cycpO3N0YXR1c0xpbmUuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhYmVsJykudGV4dENvbnRlbnQ9Q29tbW9uLlVJU3RyaW5nKCdTdGF0dXMnKTt0aGlzLl9zdGF0dXM9c3RhdHVzTGluZS5jcmVhdGVDaGlsZCgnZGl2JywnY29udGVudCcpO2lmKHNob3dUaW1lcil7Y29uc3QgdGltZUxpbmU9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhdHVzLWRpYWxvZy1saW5lIHRpbWUnKTt0aW1lTGluZS5jcmVhdGVDaGlsZCgnZGl2JywnbGFiZWwnKS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJ1RpbWUnKTt0aGlzLl90aW1lPXRpbWVMaW5lLmNyZWF0ZUNoaWxkKCdkaXYnLCdjb250ZW50Jyk7fQpjb25zdCBwcm9ncmVzc0xpbmU9dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3RhdHVzLWRpYWxvZy1saW5lIHByb2dyZXNzJyk7dGhpcy5fcHJvZ3Jlc3NMYWJlbD1wcm9ncmVzc0xpbmUuY3JlYXRlQ2hpbGQoJ2RpdicsJ2xhYmVsJyk7dGhpcy5fcHJvZ3Jlc3NCYXI9cHJvZ3Jlc3NMaW5lLmNyZWF0ZUNoaWxkKCdkaXYnLCdpbmRpY2F0b3ItY29udGFpbmVyJykuY3JlYXRlQ2hpbGQoJ2RpdicsJ2luZGljYXRvcicpO3RoaXMuX3N0b3BCdXR0b249VUkuY3JlYXRlVGV4dEJ1dHRvbihDb21tb24uVUlTdHJpbmcoJ1N0b3AnKSxzdG9wQ2FsbGJhY2ssJycsdHJ1ZSk7dGhpcy5jb250ZW50RWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2Jywnc3RvcC1idXR0b24nKS5hcHBlbmRDaGlsZCh0aGlzLl9zdG9wQnV0dG9uKTt9CmZpbmlzaCgpe3RoaXMuX3N0b3BUaW1lcigpO3RoaXMuX3N0b3BCdXR0b24uZGlzYWJsZWQ9dHJ1ZTt9CmhpZGUoKXt0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCd0aW50ZWQnKTt0aGlzLmVsZW1lbnQucmVtb3ZlKCk7fQpzaG93UGFuZShwYXJlbnQpe3RoaXMuc2hvdyhwYXJlbnQpO3BhcmVudC5jbGFzc0xpc3QuYWRkKCd0aW50ZWQnKTt0aGlzLl9zdG9wQnV0dG9uLmZvY3VzKCk7fQp1cGRhdGVTdGF0dXModGV4dCl7dGhpcy5fc3RhdHVzLnRleHRDb250ZW50PXRleHQ7fQp1cGRhdGVQcm9ncmVzc0JhcihhY3Rpdml0eSxwZXJjZW50KXt0aGlzLl9wcm9ncmVzc0xhYmVsLnRleHRDb250ZW50PWFjdGl2aXR5O3RoaXMuX3Byb2dyZXNzQmFyLnN0eWxlLndpZHRoPXBlcmNlbnQudG9GaXhlZCgxKSsnJSc7dGhpcy5fdXBkYXRlVGltZXIoKTt9CnN0YXJ0VGltZXIoKXt0aGlzLl9zdGFydFRpbWU9RGF0ZS5ub3coKTt0aGlzLl90aW1lVXBkYXRlVGltZXI9c2V0SW50ZXJ2YWwodGhpcy5fdXBkYXRlVGltZXIuYmluZCh0aGlzLGZhbHNlKSwxMDAwKTt0aGlzLl91cGRhdGVUaW1lcigpO30KX3N0b3BUaW1lcigpe2lmKCF0aGlzLl90aW1lVXBkYXRlVGltZXIpCnJldHVybjtjbGVhckludGVydmFsKHRoaXMuX3RpbWVVcGRhdGVUaW1lcik7dGhpcy5fdXBkYXRlVGltZXIodHJ1ZSk7ZGVsZXRlIHRoaXMuX3RpbWVVcGRhdGVUaW1lcjt9Cl91cGRhdGVUaW1lcihwcmVjaXNlKXtpZighdGhpcy5fdGltZVVwZGF0ZVRpbWVyKQpyZXR1cm47Y29uc3QgZWxhcHNlZD0oRGF0ZS5ub3coKS10aGlzLl9zdGFydFRpbWUpLzEwMDA7dGhpcy5fdGltZS50ZXh0Q29udGVudD1Db21tb24uVUlTdHJpbmcoJyVzXHhhMHNlYycsZWxhcHNlZC50b0ZpeGVkKHByZWNpc2U/MTowKSk7fX07VGltZWxpbmUuTG9hZFRpbWVsaW5lSGFuZGxlcj1jbGFzc3toYW5kbGVRdWVyeVBhcmFtKHZhbHVlKXtVSS52aWV3TWFuYWdlci5zaG93VmlldygndGltZWxpbmUnKS50aGVuKCgpPT57VGltZWxpbmUuVGltZWxpbmVQYW5lbC5pbnN0YW5jZSgpLl9sb2FkRnJvbVVSTCh3aW5kb3cuZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7fSk7fX07VGltZWxpbmUuVGltZWxpbmVQYW5lbC5BY3Rpb25EZWxlZ2F0ZT1jbGFzc3toYW5kbGVBY3Rpb24oY29udGV4dCxhY3Rpb25JZCl7Y29uc3QgcGFuZWw9VUkuY29udGV4dC5mbGF2b3IoVGltZWxpbmUuVGltZWxpbmVQYW5lbCk7Y29uc29sZS5hc3NlcnQocGFuZWwmJnBhbmVsIGluc3RhbmNlb2YgVGltZWxpbmUuVGltZWxpbmVQYW5lbCk7c3dpdGNoKGFjdGlvbklkKXtjYXNlJ3RpbWVsaW5lLnRvZ2dsZS1yZWNvcmRpbmcnOnBhbmVsLl90b2dnbGVSZWNvcmRpbmcoKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLnJlY29yZC1yZWxvYWQnOnBhbmVsLl9yZWNvcmRSZWxvYWQoKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLnNhdmUtdG8tZmlsZSc6cGFuZWwuX3NhdmVUb0ZpbGUoKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLmxvYWQtZnJvbS1maWxlJzpwYW5lbC5fc2VsZWN0RmlsZVRvTG9hZCgpO3JldHVybiB0cnVlO2Nhc2UndGltZWxpbmUuanVtcC10by1wcmV2aW91cy1mcmFtZSc6cGFuZWwuX2p1bXBUb0ZyYW1lKC0xKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLmp1bXAtdG8tbmV4dC1mcmFtZSc6cGFuZWwuX2p1bXBUb0ZyYW1lKDEpO3JldHVybiB0cnVlO2Nhc2UndGltZWxpbmUuc2hvdy1oaXN0b3J5JzpwYW5lbC5fc2hvd0hpc3RvcnkoKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLnByZXZpb3VzLXJlY29yZGluZyc6cGFuZWwuX25hdmlnYXRlSGlzdG9yeSgxKTtyZXR1cm4gdHJ1ZTtjYXNlJ3RpbWVsaW5lLm5leHQtcmVjb3JkaW5nJzpwYW5lbC5fbmF2aWdhdGVIaXN0b3J5KC0xKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9fTtUaW1lbGluZS5UaW1lbGluZVBhbmVsLl90cmFjZVByb3ZpZGVyU2V0dGluZ1N5bWJvbD1TeW1ib2woJ3RyYWNlUHJvdmlkZXJTZXR0aW5nJyk7O1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ0aW1lbGluZS9oaXN0b3J5VG9vbGJhckJ1dHRvbi5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG46aG9zdCB7XG4gIHdpZHRoOiAxNjBweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBkaXNwbGF5OiBmbGV4O1xufVxuXG46aG9zdChbZGlzYWJsZWRdKSB7XG4gIG9wYWNpdHk6IC41O1xufVxuXG4uY29udGVudCB7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIGZsZXg6IDEgMTtcbiAgbWluLXdpZHRoOiAzNXB4O1xufVxuXG4vKiMgc291cmNlVVJMPXRpbWVsaW5lL2hpc3RvcnlUb29sYmFyQnV0dG9uLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRpbWVsaW5lL2ludmFsaWRhdGlvbnNUcmVlLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi5oZWFkZXIsIC5jaGlsZHJlbiwgLmNvbnRlbnQge1xuICAgIG1pbi1oZWlnaHQ6IGluaXRpYWw7XG4gICAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XG59XG5cbi8qIFRoaXMgVHJlZUVsZW1lbnQgaXMgYWx3YXlzIGV4cGFuZGVkIGFuZCBoYXMgbm8gYXJyb3cuICAgKi9cbi8qIEZJWE1FKGNyYnVnLmNvbS80NzU2MTgpOiBJbXBsZW1lbnQgdGhpcyBpbiBUcmVlRWxlbWVudC4gKi9cbi5jaGlsZHJlbiBsaTo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uY29udGVudCB7XG4gICAgbWFyZ2luLWJvdHRvbTogNHB4O1xufVxuXG4uY29udGVudCAuc3RhY2stcHJldmlldy1jb250YWluZXIge1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG59XG5cbi5jb250ZW50IC5ub2RlLWxpc3Qge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4vKiMgc291cmNlVVJMPXRpbWVsaW5lL2ludmFsaWRhdGlvbnNUcmVlLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRpbWVsaW5lL3RpbWVsaW5lRmxhbWVjaGFydFBvcG92ZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuICovXG5cbi50aW1lbGluZS1mbGFtZWNoYXJ0LXBvcG92ZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi50aW1lbGluZS1mbGFtZWNoYXJ0LXBvcG92ZXIgc3BhbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XG5cbi50aW1lbGluZS1mbGFtZWNoYXJ0LXBvcG92ZXIgc3Bhbi50aW1lbGluZS1pbmZvLW5ldHdvcmstdGltZSB7XG4gICAgY29sb3I6ICMwMDk7XG59XG5cbi50aW1lbGluZS1mbGFtZWNoYXJ0LXBvcG92ZXIgc3Bhbi50aW1lbGluZS1pbmZvLXRpbWUge1xuICAgIGNvbG9yOiAjMjgyO1xufVxuXG4udGltZWxpbmUtZmxhbWVjaGFydC1wb3BvdmVyIHNwYW4udGltZWxpbmUtaW5mby13YXJuaW5nIHtcbiAgICBjb2xvcjogI2U0NDtcbn1cblxuLnRpbWVsaW5lLWZsYW1lY2hhcnQtcG9wb3ZlciBzcGFuLnRpbWVsaW5lLWluZm8td2FybmluZyAqIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLyojIHNvdXJjZVVSTD10aW1lbGluZS90aW1lbGluZUZsYW1lY2hhcnRQb3BvdmVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRpbWVsaW5lL3RpbWVsaW5lSGlzdG9yeU1hbmFnZXIuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmRyb3AtZG93biB7XG4gIHBhZGRpbmc6IDFweDtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHJvcC1zaGFkb3cpO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLnByZXZpZXctaXRlbSB7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogMXB4IDVweDtcbiAgcGFkZGluZzogMnB4IDBweDtcbiAgbWFyZ2luOiAycHggMXB4O1xufVxuXG4ucHJldmlldy1pdGVtLnNlbGVjdGVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zZWxlY3Rpb24tYmctY29sb3IpO1xufVxuXG4ucHJldmlldy1pdGVtIGNhbnZhcyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi50ZXh0LWRldGFpbHMge1xuICBmb250LXNpemU6IDExcHg7XG4gIHBhZGRpbmc6IDNweDtcbn1cblxuLnRleHQtZGV0YWlscyBzcGFuIHtcbiAgZmxleDogMSAwO1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xufVxuXG4udGV4dC1kZXRhaWxzIC5uYW1lIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi50ZXh0LWRldGFpbHMgc3Bhbi50aW1lIHtcbiAgY29sb3I6ICM1NTU7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4uc2NyZWVuc2hvdC10aHVtYiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gIG1hcmdpbjogMnB4IDRweDtcbn1cblxuLnNjcmVlbnNob3QtdGh1bWIgaW1nIHtcbiAgbWFyZ2luOiBhdXRvO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG5cbi8qIyBzb3VyY2VVUkw9dGltZWxpbmUvdGltZWxpbmVIaXN0b3J5TWFuYWdlci5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJ0aW1lbGluZS90aW1lbGluZVBhbmVsLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW50aG9ueSBSaWNhdWQgPHJpa0B3ZWJraXQub3JnPlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICpcbiAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKFwiQXBwbGVcIikgbm9yIHRoZSBuYW1lcyBvZlxuICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG4udGltZWxpbmUtdG9vbGJhci1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogbm9uZTtcbn1cblxuLnRpbWVsaW5lLXRvb2xiYXItY29udGFpbmVyID4gLnRvb2xiYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLnRpbWVsaW5lLW1haW4tdG9vbGJhciB7XG4gICAgZmxleDogMSAxIGF1dG87XG59XG5cbi50aW1lbGluZS1zZXR0aW5ncy1wYW5lIHtcbiAgICBmbGV4OiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LXBhbmVsIHtcbiAgICBmbGV4OiBub25lO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LXBhbmVsIC50aW1lbGluZS1ncmFwaC1iYXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4jdGltZWxpbmUtb3ZlcnZpZXctZ3JpZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xufVxuXG4jdGltZWxpbmUtb3ZlcnZpZXctZ3JpZCAudGltZWxpbmUtZ3JpZC1oZWFkZXIge1xuICAgIGhlaWdodDogMTJweDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWdyaWQgLnJlc291cmNlcy1kaXZpZGVycy1sYWJlbC1iYXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIGhlaWdodDogMTJweDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWdyaWQgLnJlc291cmNlcy1kaXZpZGVyLWxhYmVsIHtcbiAgICB0b3A6IDFweDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtc3BsaXQge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbi50aW1lbGluZS12aWV3LXN0YWNrIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbiN0aW1lbGluZS1jb250YWluZXIgLmRldnRvb2xzLWxpbmsge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4udGltZWxpbmUtZ3JhcGgtc2lkZS5ob3ZlcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpICFpbXBvcnRhbnQ7XG59XG5cbi50aW1lbGluZS5wYW5lbCAuc3RhdHVzLXBhbmUtY29udGFpbmVyIHtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnRpbWVsaW5lLnBhbmVsIC5zdGF0dXMtcGFuZS1jb250YWluZXIudGludGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDAsIDAlLCA5MCUsIDAuOCk7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbi50aW1lbGluZS5wYW5lbCAuc3RhdHVzLXBhbmUtY29udGFpbmVyID4gZGl2IHtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LXBhbmVsIC5vdmVydmlldy1zdHJpcCB7XG4gICAgbWFyZ2luLXRvcDogMnB4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4jdGltZWxpbmUtb3ZlcnZpZXctcGFuZWwgLm92ZXJ2aWV3LXN0cmlwIC50aW1lbGluZS1vdmVydmlldy1zdHJpcC10aXRsZSB7XG4gICAgY29sb3I6ICM2NjY7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gICAgcGFkZGluZzogMCA0cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogLTJweDtcbiAgICByaWdodDogMDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWNwdS1hY3Rpdml0eSB7XG4gICAgZmxleC1iYXNpczogMjBweDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LW5ldHdvcmsge1xuICAgIGZsZXgtYmFzaXM6IDhweDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWZyYW1lcmF0ZSB7XG4gICAgZmxleC1iYXNpczogMTZweDtcbiAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7XG59XG5cbiN0aW1lbGluZS1vdmVydmlldy1maWxtc3RyaXAge1xuICAgIGZsZXgtYmFzaXM6IDMwcHg7XG59XG5cbiN0aW1lbGluZS1vdmVydmlldy1tZW1vcnkge1xuICAgIGZsZXgtYmFzaXM6IDIwcHg7XG59XG5cbiN0aW1lbGluZS1vdmVydmlldy1mcmFtZXJhdGU6OmJlZm9yZSxcbiN0aW1lbGluZS1vdmVydmlldy1uZXR3b3JrOjpiZWZvcmUsXG4jdGltZWxpbmUtb3ZlcnZpZXctY3B1LWFjdGl2aXR5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBoc2xhKDAsIDAlLCAwJSwgMC4wNik7XG4gICAgei1pbmRleDogLTIwMDtcbn1cblxuLm92ZXJ2aWV3LXN0cmlwIC5iYWNrZ3JvdW5kIHtcbiAgICB6LWluZGV4OiAtMTA7XG59XG5cbiN0aW1lbGluZS1vdmVydmlldy1yZXNwb25zaXZlbmVzcyB7XG4gICAgZmxleC1iYXNpczogNXB4O1xuICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWlucHV0IHtcbiAgICBmbGV4LWJhc2lzOiA2cHg7XG59XG5cbiN0aW1lbGluZS1vdmVydmlldy1wYW5lIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4jdGltZWxpbmUtb3ZlcnZpZXctY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleDogbm9uZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuI3RpbWVsaW5lLW92ZXJ2aWV3LWNvbnRhaW5lciBjYW52YXMge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbn1cblxuI3RpbWVsaW5lLWdyYXBocyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICB0b3A6IDIwcHg7XG59XG5cbi50aW1lbGluZS1hZ2dyZWdhdGVkLWxlZ2VuZC10aXRsZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4udGltZWxpbmUtYWdncmVnYXRlZC1sZWdlbmQtdmFsdWUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogNzBweDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLnRpbWVsaW5lLWFnZ3JlZ2F0ZWQtbGVnZW5kLXN3YXRjaCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMXB4O1xuICAgIGhlaWdodDogMTFweDtcbiAgICBtYXJnaW46IDAgNnB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IDFweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG59XG5cbi5wb3BvdmVyIHVsIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG59XG5cbiNyZXNvdXJjZXMtY29udGFpbmVyLWNvbnRlbnQge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgbWluLWhlaWdodDogMTAwJTtcbn1cblxuLm1lbW9yeS1ncmFwaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBmb250LXNpemU6IDlweDtcbiAgICBjb2xvcjogIzg4ODtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBhZGRpbmc6IDAgNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDEwMCUsIDAuOCk7XG59XG5cbiNtZW1vcnktZ3JhcGhzLWNhbnZhcy1jb250YWluZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbiNtZW1vcnktY291bnRlcnMtZ3JhcGgge1xuICAgIGZsZXg6IGF1dG87XG59XG5cbiNtZW1vcnktZ3JhcGhzLWNhbnZhcy1jb250YWluZXIgLm1lbW9yeS1jb3VudGVyLW1hcmtlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICB3aWR0aDogNXB4O1xuICAgIGhlaWdodDogNXB4O1xuICAgIG1hcmdpbi1sZWZ0OiAtM3B4O1xuICAgIG1hcmdpbi10b3A6IC0ycHg7XG59XG5cbiNtZW1vcnktZ3JhcGhzLWNvbnRhaW5lciAudGltZWxpbmUtbWVtb3J5LWhlYWRlciB7XG4gICAgZmxleDogMCAwIDI2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbiNtZW1vcnktZ3JhcGhzLWNvbnRhaW5lciAudGltZWxpbmUtbWVtb3J5LWhlYWRlcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKEltYWdlcy90b29sYmFyUmVzaXplclZlcnRpY2FsLnBuZyk7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCBjZW50ZXIsIGNlbnRlcjtcbiAgICBmbGV4OiAyMHB4IDAgMDtcbiAgICBtYXJnaW46IDAgNHB4O1xufVxuXG4udGltZWxpbmUtbWVtb3J5LXRvb2xiYXIge1xuICAgIGZsZXgtc2hyaW5rOiAxO1xufVxuXG4ubWVtb3J5LWNvdW50ZXItc2VsZWN0b3ItaW5mbyB7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ubWVtb3J5LWNvdW50ZXItc2VsZWN0b3ItaW5mbyAucmFuZ2Uge1xuICAgIG1hcmdpbjogMCA0cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxuLm1lbW9yeS1jb3VudGVyLXZhbHVlIHtcbiAgICBtYXJnaW46IDhweDtcbn1cblxuI2NvdW50ZXItdmFsdWVzLWJhciB7XG4gICAgZmxleDogMCAwIDIwcHg7XG4gICAgYm9yZGVyLXRvcDogc29saWQgMXB4IGxpZ2h0Z3JheTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xufVxuXG4udGltZWxpbmUtZmlsdGVycy1oZWFkZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleDogbm9uZTtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMge1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXRpdGxlIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0I4QjhCODtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgIHBhZGRpbmctdG9wOiAwO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXJvdy10aXRsZSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtcm93LWRhdGEge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXZpZXcge1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXZpZXctYm9keSB7XG4gICAgZmxleDogYXV0bztcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1ib2R5ID4gZGl2IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udGltZWxpbmUtZGV0YWlscy12aWV3LWJsb2NrIHtcbiAgICBmbGV4OiBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgIGJvcmRlci1ib3R0b206IHZhcigtLWRpdmlkZXItYm9yZGVyKTtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1yb3cge1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbGluZS1oZWlnaHQ6IDIwcHg7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXZpZXctYmxvY2sgLnRpbWVsaW5lLWRldGFpbHMtc3RhY2stdmFsdWVzIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uICFpbXBvcnRhbnQ7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLWNoaXAtdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4udGltZWxpbmUtZGV0YWlscy1jaGlwLXRpdGxlID4gZGl2IHtcbiAgICB3aWR0aDogMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICBjb250ZW50OiBcIiBcIjtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdGl0bGU6bm90KDplbXB0eSkge1xuICAgIGNvbG9yOiByZ2IoMTUyLCAxNTIsIDE1Mik7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxuXG4udGltZWxpbmUtZGV0YWlscy13YXJuaW5nIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1MCwgMjA5LCAyMDksIDAuNDgpO1xufVxuXG4udGltZWxpbmUtZGV0YWlscy13YXJuaW5nIC50aW1lbGluZS1kZXRhaWxzLXZpZXctcm93LXRpdGxlIHtcbiAgICBjb2xvcjogcmVkO1xufVxuXG4udGltZWxpbmUtZGV0YWlscy13YXJuaW5nIC50aW1lbGluZS1kZXRhaWxzLXZpZXctcm93LXZhbHVlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzLXZpZXctcm93LXZhbHVlIHtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdmFsdWUgLnN0YWNrLXByZXZpZXctY29udGFpbmVyIHtcbiAgICBsaW5lLWhlaWdodDogMTFweDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctdmFsdWUgLnRpbWVsaW5lLWRldGFpbHMtd2FybmluZy1tYXJrZXIge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1waWUtY2hhcnQtd3JhcHBlciB7XG4gICAgbWFyZ2luOiA0cHggMDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1waWUtY2hhcnQge1xuICAgIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLnRpbWVsaW5lLWRldGFpbHMtdmlldy1yb3ctc3RhY2stdHJhY2Uge1xuICAgIHBhZGRpbmc6IDRweCAwO1xuICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xufVxuXG4udGltZWxpbmUtZGV0YWlscy12aWV3LXJvdy1zdGFjay10cmFjZSBkaXYge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XG59XG5cbi50aW1lbGluZS1hZ2dyZWdhdGVkLWluZm8tbGVnZW5kID4gZGl2IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi50aW1lbGluZS1mbGFtZWNoYXJ0IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udGltZWxpbmUtZmxhbWVjaGFydC1yZXNpemVyIHtcbiAgICBmbGV4OiA4cHggMCAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRvb2xiYXItYmctY29sb3IpO1xuICAgIGJvcmRlcjogMXB4ICNhM2EzYTM7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZCBub25lO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi50aW1lbGluZS1uZXR3b3JrLXJlc2l6ZXItZGlzYWJsZWQgPiAudGltZWxpbmUtZmxhbWVjaGFydC1yZXNpemVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4udGltZWxpbmUtZmxhbWVjaGFydC1yZXNpemVyOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIi4uLlwiO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBtYXJnaW4tYm90dG9tOiAtMXB4O1xufVxuXG4udGltZWxpbmUtc3RhdHVzLXBhbmUuZnVsbC13aWRnZXQtZGltbWVkLWJhbm5lciB7XG4gICAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50O1xufVxuXG4udGltZWxpbmUtbGF5ZXJzLXZpZXcgPiBkaXY6bGFzdC1jaGlsZCxcbi50aW1lbGluZS1sYXllcnMtdmlldy1wcm9wZXJ0aWVzID4gZGl2Omxhc3QtY2hpbGQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG59XG5cbi50aW1lbGluZS1sYXllcnMtdmlldy1wcm9wZXJ0aWVzIHRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxuXG4udGltZWxpbmUtbGF5ZXJzLXZpZXctcHJvcGVydGllcyB0ZCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2UxZTFlMTtcbiAgICBsaW5lLWhlaWdodDogMjJweDtcbn1cblxuLnRpbWVsaW5lLXBhaW50LXByb2ZpbGVyLWxvZy1zcGxpdCA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIHotaW5kZXg6IDA7XG59XG5cbi50aW1lbGluZS1nYXAge1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi50aW1lbGluZS1maWxtc3RyaXAtcHJldmlldyA+IGltZyB7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xuICAgIG1heC13aWR0aDogNTAwcHg7XG4gICAgbWF4LWhlaWdodDogMzAwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAudG9vbGJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tZGl2aWRlci1ib3JkZXIpO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmbGV4OiBhdXRvO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLmRhdGEtY29udGFpbmVyIHtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZC5kYXRhLWdyaWQtZml0cy12aWV3cG9ydCAuY29ybmVyIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgdGFibGUuZGF0YSB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCB0cjpub3QoLnNlbGVjdGVkKSAuaGlnaGxpZ2h0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyMzAsIDE3OSk7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCB0cjpob3ZlciB0ZDpub3QoLmJvdHRvbS1maWxsZXItdGQpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMSk7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCB0ZC5udW1lcmljLWNvbHVtbiB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgZGl2LmJhY2tncm91bmQtcGVyY2VudC1iYXIge1xuICAgIGZsb2F0OiByaWdodDtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAuZGF0YS1ncmlkIHNwYW4ucGVyY2VudC1jb2x1bW4ge1xuICAgIGNvbG9yOiAjODg4O1xuICAgIHdpZHRoOiA0NXB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAuZGF0YS1ncmlkIHRyLnNlbGVjdGVkIHNwYW4ge1xuICAgIGNvbG9yOiBpbmhlcml0O1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLm5hbWUtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCAubmFtZS1jb250YWluZXIgZGl2IHtcbiAgICBmbGV4OiBub25lO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLm5hbWUtY29udGFpbmVyIC5hY3Rpdml0eS1pY29uIHtcbiAgICB3aWR0aDogMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICBtYXJnaW46IDNweCAwO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLm5hbWUtY29udGFpbmVyIC5hY3Rpdml0eS1pY29uLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLXJpZ2h0OiAzcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB3aWR0aDogMThweDtcbiAgICBoZWlnaHQ6IDE4cHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAuZGF0YS1ncmlkIC5uYW1lLWNvbnRhaW5lciAuYWN0aXZpdHktd2FybmluZzo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiW2Rlb3B0XVwiO1xuICAgIG1hcmdpbjogMCA0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIGNvbG9yOiAjNzc3O1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgdHIuc2VsZWN0ZWQgLm5hbWUtY29udGFpbmVyIC5hY3Rpdml0eS13YXJuaW5nOjphZnRlciB7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLm5hbWUtY29udGFpbmVyIC5hY3Rpdml0eS1saW5rIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAuZGF0YS1ncmlkIC5iYWNrZ3JvdW5kLWJhci1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAzcHg7XG4gICAgcmlnaHQ6IDA7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCAuYmFja2dyb3VuZC1iYXIge1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBoZWlnaHQ6IDE4cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSg0MywgODQlLCA2NCUsIDAuMik7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGhzbCg0MywgODQlLCA2NCUpO1xufVxuXG4udGltZWxpbmUtdHJlZS12aWV3IC5kYXRhLWdyaWQgLnNlbGVjdGVkIC5iYWNrZ3JvdW5kLWJhciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAudGltZWxpbmUtZGV0YWlscy12aWV3LWJvZHkgLmZ1bGwtd2lkZ2V0LWRpbW1lZC1iYW5uZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XG5cbi50aW1lbGluZS1kZXRhaWxzIC5maWx0ZXItaW5wdXQtZmllbGQge1xuICAgIHdpZHRoOiAxMjBweDtcbn1cblxuLnRpbWVsaW5lLXRyZWUtdmlldyAuZGF0YS1ncmlkIC5oZWFkZXItY29udGFpbmVyIHtcbiAgICBoZWlnaHQ6IDIxcHg7XG59XG5cbi50aW1lbGluZS10cmVlLXZpZXcgLmRhdGEtZ3JpZCAuZGF0YS1jb250YWluZXIge1xuICAgIHRvcDogMjFweDtcbn1cblxuLnRpbWVsaW5lLXN0YWNrLXZpZXctaGVhZGVyIHtcbiAgICBoZWlnaHQ6IDI3cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdG9vbGJhci1iZy1jb2xvcik7XG4gICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgY29sb3I6ICM1YTVhNWE7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBib3JkZXItYm90dG9tOiB2YXIoLS1kaXZpZGVyLWJvcmRlcik7XG59XG5cbi50aW1lbGluZS1sYW5kaW5nLXBhZ2Uge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBjb2xvcjogIzc3Nztcbn1cblxuLnRpbWVsaW5lLWxhbmRpbmctcGFnZSA+IGRpdiB7XG4gICAgbWF4LXdpZHRoOiA0NTBweDtcbiAgICBtYXJnaW46IDEwcHg7XG59XG5cbi50aW1lbGluZS1sYW5kaW5nLXBhZ2UgPiBkaXYgPiBwIHtcbiAgICBmbGV4OiBub25lO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbn1cblxuLyojIHNvdXJjZVVSTD10aW1lbGluZS90aW1lbGluZVBhbmVsLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRpbWVsaW5lL3RpbWVsaW5lUGFpbnRQcm9maWxlci5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE2IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4ucGFpbnQtcHJvZmlsZXItaW1hZ2UtdmlldyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBhaW50LXByb2ZpbGVyLWltYWdlLXZpZXcgLnBhaW50LXByb2ZpbGVyLWltYWdlLWNvbnRhaW5lciB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwIDA7XG59XG5cbi5wYWludC1wcm9maWxlci1pbWFnZS12aWV3IC5wYWludC1wcm9maWxlci1pbWFnZS1jb250YWluZXIgZGl2IHtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMTAwLCAxMDAsIDEwMCwgMC40KTtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG59XG5cbi5wYWludC1wcm9maWxlci1pbWFnZS12aWV3IGltZyB7XG4gICAgYm9yZGVyOiBzb2xpZCAxcHggYmxhY2s7XG59XG5cbi8qIyBzb3VyY2VVUkw9dGltZWxpbmUvdGltZWxpbmVQYWludFByb2ZpbGVyLmNzcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbInRpbWVsaW5lL3RpbWVsaW5lU3RhdHVzRGlhbG9nLmNzcyJdPSIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4udGltZWxpbmUtc3RhdHVzLWRpYWxvZyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBhZGRpbmc6IDE2cHggMTZweCAxMnB4IDE2cHg7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IHZhcigtLWRyb3Atc2hhZG93KTtcbn1cblxuLnN0YXR1cy1kaWFsb2ctbGluZSB7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xufVxuXG4uc3RhdHVzLWRpYWxvZy1saW5lIC5sYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiA4MHB4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIGNvbG9yOiAjYWFhO1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbn1cblxuLnRpbWVsaW5lLXN0YXR1cy1kaWFsb2cgLnByb2dyZXNzIC5pbmRpY2F0b3ItY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDIwMHB4O1xuICAgIGhlaWdodDogOHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjogMCAxMHB4IDAgMDtcbn1cblxuLnRpbWVsaW5lLXN0YXR1cy1kaWFsb2cgLnByb2dyZXNzIC5pbmRpY2F0b3Ige1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTIsIDE2NiwgMjU1KTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDA7XG4gICAgbWFyZ2luOiAwO1xufVxuXG4udGltZWxpbmUtc3RhdHVzLWRpYWxvZyAuc3RvcC1idXR0b24ge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xufVxuXG4udGltZWxpbmUtc3RhdHVzLWRpYWxvZyAuc3RvcC1idXR0b24gYnV0dG9uIHtcbiAgICBtaW4td2lkdGg6IDgwcHg7XG59XG5cbi8qIyBzb3VyY2VVUkw9dGltZWxpbmUvdGltZWxpbmVTdGF0dXNEaWFsb2cuY3NzICovIjtXb3Jrc3BhY2VEaWZmLldvcmtzcGFjZURpZmY9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHdvcmtzcGFjZSl7c3VwZXIoKTt0aGlzLl91aVNvdXJjZUNvZGVEaWZmcz1uZXcgV2Vha01hcCgpO3RoaXMuX2xvYWRpbmdVSVNvdXJjZUNvZGVzPW5ldyBNYXAoKTt0aGlzLl9tb2RpZmllZFVJU291cmNlQ29kZXM9bmV3IFNldCgpO3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzLl91aVNvdXJjZUNvZGVDaGFuZ2VkLHRoaXMpO3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX3VpU291cmNlQ29kZUNoYW5nZWQsdGhpcyk7d29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlQWRkZWQsdGhpcy5fdWlTb3VyY2VDb2RlQWRkZWQsdGhpcyk7d29ya3NwYWNlLmFkZEV2ZW50TGlzdGVuZXIoV29ya3NwYWNlLldvcmtzcGFjZS5FdmVudHMuVUlTb3VyY2VDb2RlUmVtb3ZlZCx0aGlzLl91aVNvdXJjZUNvZGVSZW1vdmVkLHRoaXMpO3dvcmtzcGFjZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5Xb3Jrc3BhY2UuRXZlbnRzLlByb2plY3RSZW1vdmVkLHRoaXMuX3Byb2plY3RSZW1vdmVkLHRoaXMpO3dvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCkuZm9yRWFjaCh0aGlzLl91cGRhdGVNb2RpZmllZFN0YXRlLmJpbmQodGhpcykpO30KcmVxdWVzdERpZmYodWlTb3VyY2VDb2RlKXtyZXR1cm4gdGhpcy5fdWlTb3VyY2VDb2RlRGlmZih1aVNvdXJjZUNvZGUpLnJlcXVlc3REaWZmKCk7fQpzdWJzY3JpYmVUb0RpZmZDaGFuZ2UodWlTb3VyY2VDb2RlLGNhbGxiYWNrLHRoaXNPYmope3RoaXMuX3VpU291cmNlQ29kZURpZmYodWlTb3VyY2VDb2RlKS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZURpZmYuRXZlbnRzLkRpZmZDaGFuZ2VkLGNhbGxiYWNrLHRoaXNPYmopO30KdW5zdWJzY3JpYmVGcm9tRGlmZkNoYW5nZSh1aVNvdXJjZUNvZGUsY2FsbGJhY2ssdGhpc09iail7dGhpcy5fdWlTb3VyY2VDb2RlRGlmZih1aVNvdXJjZUNvZGUpLnJlbW92ZUV2ZW50TGlzdGVuZXIoV29ya3NwYWNlRGlmZi5FdmVudHMuRGlmZkNoYW5nZWQsY2FsbGJhY2ssdGhpc09iaik7fQptb2RpZmllZFVJU291cmNlQ29kZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9tb2RpZmllZFVJU291cmNlQ29kZXMpO30KaXNVSVNvdXJjZUNvZGVNb2RpZmllZCh1aVNvdXJjZUNvZGUpe3JldHVybiB0aGlzLl9tb2RpZmllZFVJU291cmNlQ29kZXMuaGFzKHVpU291cmNlQ29kZSl8fHRoaXMuX2xvYWRpbmdVSVNvdXJjZUNvZGVzLmhhcyh1aVNvdXJjZUNvZGUpO30KX3VpU291cmNlQ29kZURpZmYodWlTb3VyY2VDb2RlKXtpZighdGhpcy5fdWlTb3VyY2VDb2RlRGlmZnMuaGFzKHVpU291cmNlQ29kZSkpCnRoaXMuX3VpU291cmNlQ29kZURpZmZzLnNldCh1aVNvdXJjZUNvZGUsbmV3IFdvcmtzcGFjZURpZmYuV29ya3NwYWNlRGlmZi5VSVNvdXJjZUNvZGVEaWZmKHVpU291cmNlQ29kZSkpO3JldHVybiB0aGlzLl91aVNvdXJjZUNvZGVEaWZmcy5nZXQodWlTb3VyY2VDb2RlKTt9Cl91aVNvdXJjZUNvZGVDaGFuZ2VkKGV2ZW50KXtjb25zdCB1aVNvdXJjZUNvZGU9KGV2ZW50LmRhdGEudWlTb3VyY2VDb2RlKTt0aGlzLl91cGRhdGVNb2RpZmllZFN0YXRlKHVpU291cmNlQ29kZSk7fQpfdWlTb3VyY2VDb2RlQWRkZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7dGhpcy5fdXBkYXRlTW9kaWZpZWRTdGF0ZSh1aVNvdXJjZUNvZGUpO30KX3VpU291cmNlQ29kZVJlbW92ZWQoZXZlbnQpe2NvbnN0IHVpU291cmNlQ29kZT0oZXZlbnQuZGF0YSk7dGhpcy5fcmVtb3ZlVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSk7fQpfcHJvamVjdFJlbW92ZWQoZXZlbnQpe2NvbnN0IHByb2plY3Q9KGV2ZW50LmRhdGEpO2Zvcihjb25zdCB1aVNvdXJjZUNvZGUgb2YgcHJvamVjdC51aVNvdXJjZUNvZGVzKCkpCnRoaXMuX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpO30KX3JlbW92ZVVJU291cmNlQ29kZSh1aVNvdXJjZUNvZGUpe3RoaXMuX2xvYWRpbmdVSVNvdXJjZUNvZGVzLmRlbGV0ZSh1aVNvdXJjZUNvZGUpO2NvbnN0IHVpU291cmNlQ29kZURpZmY9dGhpcy5fdWlTb3VyY2VDb2RlRGlmZnMuZ2V0KHVpU291cmNlQ29kZSk7aWYodWlTb3VyY2VDb2RlRGlmZikKdWlTb3VyY2VDb2RlRGlmZi5fZGlzcG9zZT10cnVlO3RoaXMuX21hcmtBc1VubW9kaWZpZWQodWlTb3VyY2VDb2RlKTt9Cl9tYXJrQXNVbm1vZGlmaWVkKHVpU291cmNlQ29kZSl7dGhpcy5fdWlTb3VyY2VDb2RlUHJvY2Vzc2VkRm9yVGVzdCgpO2lmKHRoaXMuX21vZGlmaWVkVUlTb3VyY2VDb2Rlcy5kZWxldGUodWlTb3VyY2VDb2RlKSkKdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV29ya3NwYWNlRGlmZi5FdmVudHMuTW9kaWZpZWRTdGF0dXNDaGFuZ2VkLHt1aVNvdXJjZUNvZGUsaXNNb2RpZmllZDpmYWxzZX0pO30KX21hcmtBc01vZGlmaWVkKHVpU291cmNlQ29kZSl7dGhpcy5fdWlTb3VyY2VDb2RlUHJvY2Vzc2VkRm9yVGVzdCgpO2lmKHRoaXMuX21vZGlmaWVkVUlTb3VyY2VDb2Rlcy5oYXModWlTb3VyY2VDb2RlKSkKcmV0dXJuO3RoaXMuX21vZGlmaWVkVUlTb3VyY2VDb2Rlcy5hZGQodWlTb3VyY2VDb2RlKTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXb3Jrc3BhY2VEaWZmLkV2ZW50cy5Nb2RpZmllZFN0YXR1c0NoYW5nZWQse3VpU291cmNlQ29kZSxpc01vZGlmaWVkOnRydWV9KTt9Cl91aVNvdXJjZUNvZGVQcm9jZXNzZWRGb3JUZXN0KCl7fQphc3luYyBfdXBkYXRlTW9kaWZpZWRTdGF0ZSh1aVNvdXJjZUNvZGUpe3RoaXMuX2xvYWRpbmdVSVNvdXJjZUNvZGVzLmRlbGV0ZSh1aVNvdXJjZUNvZGUpO2lmKHVpU291cmNlQ29kZS5wcm9qZWN0KCkudHlwZSgpIT09V29ya3NwYWNlLnByb2plY3RUeXBlcy5OZXR3b3JrKXt0aGlzLl9tYXJrQXNVbm1vZGlmaWVkKHVpU291cmNlQ29kZSk7cmV0dXJuO30KaWYodWlTb3VyY2VDb2RlLmlzRGlydHkoKSl7dGhpcy5fbWFya0FzTW9kaWZpZWQodWlTb3VyY2VDb2RlKTtyZXR1cm47fQppZighdWlTb3VyY2VDb2RlLmhhc0NvbW1pdHMoKSl7dGhpcy5fbWFya0FzVW5tb2RpZmllZCh1aVNvdXJjZUNvZGUpO3JldHVybjt9CmNvbnN0IGNvbnRlbnRzUHJvbWlzZT1Qcm9taXNlLmFsbChbdGhpcy5yZXF1ZXN0T3JpZ2luYWxDb250ZW50Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSksdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCldKTt0aGlzLl9sb2FkaW5nVUlTb3VyY2VDb2Rlcy5zZXQodWlTb3VyY2VDb2RlLGNvbnRlbnRzUHJvbWlzZSk7Y29uc3QgY29udGVudHM9YXdhaXQgY29udGVudHNQcm9taXNlO2lmKHRoaXMuX2xvYWRpbmdVSVNvdXJjZUNvZGVzLmdldCh1aVNvdXJjZUNvZGUpIT09Y29udGVudHNQcm9taXNlKQpyZXR1cm47dGhpcy5fbG9hZGluZ1VJU291cmNlQ29kZXMuZGVsZXRlKHVpU291cmNlQ29kZSk7aWYoY29udGVudHNbMF0hPT1udWxsJiZjb250ZW50c1sxXSE9PW51bGwmJmNvbnRlbnRzWzBdIT09Y29udGVudHNbMV0pCnRoaXMuX21hcmtBc01vZGlmaWVkKHVpU291cmNlQ29kZSk7ZWxzZQp0aGlzLl9tYXJrQXNVbm1vZGlmaWVkKHVpU291cmNlQ29kZSk7fQpyZXF1ZXN0T3JpZ2luYWxDb250ZW50Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSl7cmV0dXJuIHRoaXMuX3VpU291cmNlQ29kZURpZmYodWlTb3VyY2VDb2RlKS5fb3JpZ2luYWxDb250ZW50KCk7fQpyZXZlcnRUb09yaWdpbmFsKHVpU291cmNlQ29kZSl7ZnVuY3Rpb24gY2FsbGJhY2soY29udGVudCl7aWYodHlwZW9mIGNvbnRlbnQhPT0nc3RyaW5nJykKcmV0dXJuO3VpU291cmNlQ29kZS5hZGRSZXZpc2lvbihjb250ZW50KTt9Ckhvc3QudXNlck1ldHJpY3MuYWN0aW9uVGFrZW4oSG9zdC5Vc2VyTWV0cmljcy5BY3Rpb24uUmV2aXNpb25BcHBsaWVkKTtyZXR1cm4gdGhpcy5yZXF1ZXN0T3JpZ2luYWxDb250ZW50Rm9yVUlTb3VyY2VDb2RlKHVpU291cmNlQ29kZSkudGhlbihjYWxsYmFjayk7fX07V29ya3NwYWNlRGlmZi5Xb3Jrc3BhY2VEaWZmLlVJU291cmNlQ29kZURpZmY9Y2xhc3MgZXh0ZW5kcyBDb21tb24uT2JqZWN0e2NvbnN0cnVjdG9yKHVpU291cmNlQ29kZSl7c3VwZXIoKTt0aGlzLl91aVNvdXJjZUNvZGU9dWlTb3VyY2VDb2RlO3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q2hhbmdlZCx0aGlzLl91aVNvdXJjZUNvZGVDaGFuZ2VkLHRoaXMpO3VpU291cmNlQ29kZS5hZGRFdmVudExpc3RlbmVyKFdvcmtzcGFjZS5VSVNvdXJjZUNvZGUuRXZlbnRzLldvcmtpbmdDb3B5Q29tbWl0dGVkLHRoaXMuX3VpU291cmNlQ29kZUNoYW5nZWQsdGhpcyk7dGhpcy5fcmVxdWVzdERpZmZQcm9taXNlPW51bGw7dGhpcy5fcGVuZGluZ0NoYW5nZXM9bnVsbDt0aGlzLl9kaXNwb3NlPWZhbHNlO30KX3VpU291cmNlQ29kZUNoYW5nZWQoKXtpZih0aGlzLl9wZW5kaW5nQ2hhbmdlcyl7Y2xlYXJUaW1lb3V0KHRoaXMuX3BlbmRpbmdDaGFuZ2VzKTt0aGlzLl9wZW5kaW5nQ2hhbmdlcz1udWxsO30KdGhpcy5fcmVxdWVzdERpZmZQcm9taXNlPW51bGw7Y29uc3QgY29udGVudD10aGlzLl91aVNvdXJjZUNvZGUuY29udGVudCgpO2NvbnN0IGRlbGF5PSghY29udGVudHx8Y29udGVudC5sZW5ndGg8NjU1MzYpPzA6V29ya3NwYWNlRGlmZi5Xb3Jrc3BhY2VEaWZmLlVwZGF0ZVRpbWVvdXQ7dGhpcy5fcGVuZGluZ0NoYW5nZXM9c2V0VGltZW91dChlbWl0RGlmZkNoYW5nZWQuYmluZCh0aGlzKSxkZWxheSk7ZnVuY3Rpb24gZW1pdERpZmZDaGFuZ2VkKCl7aWYodGhpcy5fZGlzcG9zZSkKcmV0dXJuO3RoaXMuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdvcmtzcGFjZURpZmYuRXZlbnRzLkRpZmZDaGFuZ2VkKTt0aGlzLl9wZW5kaW5nQ2hhbmdlcz1udWxsO319CnJlcXVlc3REaWZmKCl7aWYoIXRoaXMuX3JlcXVlc3REaWZmUHJvbWlzZSkKdGhpcy5fcmVxdWVzdERpZmZQcm9taXNlPXRoaXMuX2lubmVyUmVxdWVzdERpZmYoKTtyZXR1cm4gdGhpcy5fcmVxdWVzdERpZmZQcm9taXNlO30KX29yaWdpbmFsQ29udGVudCgpe2NvbnN0IG9yaWdpbmFsTmV0d29ya0NvbnRlbnQ9UGVyc2lzdGVuY2UubmV0d29ya1BlcnNpc3RlbmNlTWFuYWdlci5vcmlnaW5hbENvbnRlbnRGb3JVSVNvdXJjZUNvZGUodGhpcy5fdWlTb3VyY2VDb2RlKTtpZihvcmlnaW5hbE5ldHdvcmtDb250ZW50KQpyZXR1cm4gb3JpZ2luYWxOZXR3b3JrQ29udGVudDtsZXQgY2FsbGJhY2s7Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT5jYWxsYmFjaz1mdWxmaWxsKTt0aGlzLl91aVNvdXJjZUNvZGUucHJvamVjdCgpLnJlcXVlc3RGaWxlQ29udGVudCh0aGlzLl91aVNvdXJjZUNvZGUsY2FsbGJhY2spO3JldHVybiBwcm9taXNlO30KYXN5bmMgX2lubmVyUmVxdWVzdERpZmYoKXtpZih0aGlzLl9kaXNwb3NlKQpyZXR1cm4gbnVsbDtjb25zdCBiYXNlbGluZT1hd2FpdCB0aGlzLl9vcmlnaW5hbENvbnRlbnQoKTtpZihiYXNlbGluZS5sZW5ndGg+MTAyNCoxMDI0KQpyZXR1cm4gbnVsbDtpZih0aGlzLl9kaXNwb3NlKQpyZXR1cm4gbnVsbDtsZXQgY3VycmVudD10aGlzLl91aVNvdXJjZUNvZGUud29ya2luZ0NvcHkoKTtpZighY3VycmVudCYmIXRoaXMuX3VpU291cmNlQ29kZS5jb250ZW50TG9hZGVkKCkpCmN1cnJlbnQ9YXdhaXQgdGhpcy5fdWlTb3VyY2VDb2RlLnJlcXVlc3RDb250ZW50KCk7aWYoY3VycmVudC5sZW5ndGg+MTAyNCoxMDI0KQpyZXR1cm4gbnVsbDtpZih0aGlzLl9kaXNwb3NlKQpyZXR1cm4gbnVsbDtpZihjdXJyZW50PT09bnVsbHx8YmFzZWxpbmU9PT1udWxsKQpyZXR1cm4gbnVsbDtyZXR1cm4gRGlmZi5EaWZmLmxpbmVEaWZmKGJhc2VsaW5lLnNwbGl0KC9cclxufFxufFxyLyksY3VycmVudC5zcGxpdCgvXHJcbnxcbnxcci8pKTt9fTtXb3Jrc3BhY2VEaWZmLkV2ZW50cz17RGlmZkNoYW5nZWQ6U3ltYm9sKCdEaWZmQ2hhbmdlZCcpLE1vZGlmaWVkU3RhdHVzQ2hhbmdlZDpTeW1ib2woJ01vZGlmaWVkU3RhdHVzQ2hhbmdlZCcpfTtXb3Jrc3BhY2VEaWZmLndvcmtzcGFjZURpZmY9ZnVuY3Rpb24oKXtpZighV29ya3NwYWNlRGlmZi5Xb3Jrc3BhY2VEaWZmLl9pbnN0YW5jZSkKV29ya3NwYWNlRGlmZi5Xb3Jrc3BhY2VEaWZmLl9pbnN0YW5jZT1uZXcgV29ya3NwYWNlRGlmZi5Xb3Jrc3BhY2VEaWZmKFdvcmtzcGFjZS53b3Jrc3BhY2UpO3JldHVybiBXb3Jrc3BhY2VEaWZmLldvcmtzcGFjZURpZmYuX2luc3RhbmNlO307V29ya3NwYWNlRGlmZi5EaWZmVUlMb2NhdGlvbj1jbGFzc3tjb25zdHJ1Y3Rvcih1aVNvdXJjZUNvZGUpe3RoaXMudWlTb3VyY2VDb2RlPXVpU291cmNlQ29kZTt9fTtXb3Jrc3BhY2VEaWZmLldvcmtzcGFjZURpZmYuVXBkYXRlVGltZW91dD0yMDA7Oy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqLwooZnVuY3Rpb24od2luZG93KSB7CgogIC8vIERldlRvb2xzQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgICogQHVucmVzdHJpY3RlZAogICAqLwogIGNvbnN0IERldlRvb2xzQVBJSW1wbCA9IGNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAvKioKICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICovCiAgICAgIHRoaXMuX2xhc3RDYWxsSWQgPSAwOwoKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHshT2JqZWN0LjxudW1iZXIsIGZ1bmN0aW9uKD9PYmplY3QpPn0KICAgICAgICovCiAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtudW1iZXJ9IGlkCiAgICAgKiBAcGFyYW0gez9PYmplY3R9IGFyZwogICAgICovCiAgICBlbWJlZGRlck1lc3NhZ2VBY2soaWQsIGFyZykgewogICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrc1tpZF07CiAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbaWRdOwogICAgICBpZiAoY2FsbGJhY2spCiAgICAgICAgY2FsbGJhY2soYXJnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QKICAgICAqIEBwYXJhbSB7IUFycmF5LjwqPn0gYXJncwogICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oP09iamVjdCl9IGNhbGxiYWNrCiAgICAgKi8KICAgIHNlbmRNZXNzYWdlVG9FbWJlZGRlcihtZXRob2QsIGFyZ3MsIGNhbGxiYWNrKSB7CiAgICAgIGNvbnN0IGNhbGxJZCA9ICsrdGhpcy5fbGFzdENhbGxJZDsKICAgICAgaWYgKGNhbGxiYWNrKQogICAgICAgIHRoaXMuX2NhbGxiYWNrc1tjYWxsSWRdID0gY2FsbGJhY2s7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7J2lkJzogY2FsbElkLCAnbWV0aG9kJzogbWV0aG9kfTsKICAgICAgaWYgKGFyZ3MubGVuZ3RoKQogICAgICAgIG1lc3NhZ2UucGFyYW1zID0gYXJnczsKICAgICAgRGV2VG9vbHNIb3N0LnNlbmRNZXNzYWdlVG9FbWJlZGRlcihKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kCiAgICAgKiBAcGFyYW0geyFBcnJheTwqPn0gYXJncwogICAgICovCiAgICBfZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKG1ldGhvZCwgYXJncykgewogICAgICBjb25zdCBpbnNwZWN0b3JGcm9udGVuZEFQSSA9IC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsIGZ1bmN0aW9uKCk+fSAqLyAod2luZG93WydJbnNwZWN0b3JGcm9udGVuZEFQSSddKTsKICAgICAgaW5zcGVjdG9yRnJvbnRlbmRBUElbbWV0aG9kXS5hcHBseShpbnNwZWN0b3JGcm9udGVuZEFQSSwgYXJncyk7CiAgICB9CgogICAgLy8gQVBJIG1ldGhvZHMgYmVsb3cgdGhpcyBsaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheS48IUV4dGVuc2lvbkRlc2NyaXB0b3I+fSBleHRlbnNpb25zCiAgICAgKi8KICAgIGFkZEV4dGVuc2lvbnMoZXh0ZW5zaW9ucykgewogICAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE00MSkuCiAgICAgIGlmICh3aW5kb3dbJ1dlYkluc3BlY3RvciddICYmIHdpbmRvd1snV2ViSW5zcGVjdG9yJ11bJ2FkZEV4dGVuc2lvbnMnXSkgewogICAgICAgIHdpbmRvd1snV2ViSW5zcGVjdG9yJ11bJ2FkZEV4dGVuc2lvbnMnXShleHRlbnNpb25zKTsKICAgICAgfSBlbHNlIGlmICh3aW5kb3dbJ0luc3BlY3RvckZyb250ZW5kQVBJJ10pIHsKICAgICAgICAvLyBUaGUgYWRkRXh0ZW5zaW9ucyBjb21tYW5kIGlzIHNlbnQgYXMgdGhlIG9ubG9hZCBldmVudCBoYXBwZW5zIGZvcgogICAgICAgIC8vIERldlRvb2xzIGZyb250LWVuZC4gSW4gY2FzZSBvZiBob3N0ZWQgbW9kZSwgdGhpcwogICAgICAgIC8vIGhhcHBlbnMgYmVmb3JlIHRoZSBJbnNwZWN0b3JGcm9udGVuZEFQSSBpcyBpbml0aWFsaXplZC4KICAgICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2FkZEV4dGVuc2lvbnMnLCBbZXh0ZW5zaW9uc10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsCiAgICAgKi8KICAgIGFwcGVuZGVkVG9VUkwodXJsKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnYXBwZW5kZWRUb1VSTCcsIFt1cmxdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqLwogICAgY2FuY2VsZWRTYXZlVVJMKHVybCkgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2NhbmNlbGVkU2F2ZVVSTCcsIFt1cmxdKTsKICAgIH0KCiAgICBjb250ZXh0TWVudUNsZWFyZWQoKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnY29udGV4dE1lbnVDbGVhcmVkJywgW10pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkCiAgICAgKi8KICAgIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKGlkKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQnLCBbaWRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudAogICAgICovCiAgICBkZXZpY2VDb3VudFVwZGF0ZWQoY291bnQpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdkZXZpY2VDb3VudFVwZGF0ZWQnLCBbY291bnRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUFkYi5Db25maWd9IGNvbmZpZwogICAgICovCiAgICBkZXZpY2VzRGlzY292ZXJ5Q29uZmlnQ2hhbmdlZChjb25maWcpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdkZXZpY2VzRGlzY292ZXJ5Q29uZmlnQ2hhbmdlZCcsIFtjb25maWddKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUFkYi5Qb3J0Rm9yd2FyZGluZ1N0YXR1c30gc3RhdHVzCiAgICAgKi8KICAgIGRldmljZXNQb3J0Rm9yd2FyZGluZ1N0YXR1c0NoYW5nZWQoc3RhdHVzKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnZGV2aWNlc1BvcnRGb3J3YXJkaW5nU3RhdHVzQ2hhbmdlZCcsIFtzdGF0dXNdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUFycmF5LjwhQWRiLkRldmljZT59IGRldmljZXMKICAgICAqLwogICAgZGV2aWNlc1VwZGF0ZWQoZGV2aWNlcykgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2RldmljZXNVcGRhdGVkJywgW2RldmljZXNdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlCiAgICAgKi8KICAgIGRpc3BhdGNoTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnZGlzcGF0Y2hNZXNzYWdlJywgW21lc3NhZ2VdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlQ2h1bmsKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtZXNzYWdlU2l6ZQogICAgICovCiAgICBkaXNwYXRjaE1lc3NhZ2VDaHVuayhtZXNzYWdlQ2h1bmssIG1lc3NhZ2VTaXplKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnZGlzcGF0Y2hNZXNzYWdlQ2h1bmsnLCBbbWVzc2FnZUNodW5rLCBtZXNzYWdlU2l6ZV0pOwogICAgfQoKICAgIGVudGVySW5zcGVjdEVsZW1lbnRNb2RlKCkgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2VudGVySW5zcGVjdEVsZW1lbnRNb2RlJywgW10pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshe3I6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcn19IGNvbG9yCiAgICAgKi8KICAgIGV5ZURyb3BwZXJQaWNrZWRDb2xvcihjb2xvcikgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2V5ZURyb3BwZXJQaWNrZWRDb2xvcicsIFtjb2xvcl0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXkuPCF7ZmlsZVN5c3RlbU5hbWU6IHN0cmluZywgcm9vdFVSTDogc3RyaW5nLCBmaWxlU3lzdGVtUGF0aDogc3RyaW5nfT59IGZpbGVTeXN0ZW1zCiAgICAgKi8KICAgIGZpbGVTeXN0ZW1zTG9hZGVkKGZpbGVTeXN0ZW1zKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnZmlsZVN5c3RlbXNMb2FkZWQnLCBbZmlsZVN5c3RlbXNdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlU3lzdGVtUGF0aAogICAgICovCiAgICBmaWxlU3lzdGVtUmVtb3ZlZChmaWxlU3lzdGVtUGF0aCkgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2ZpbGVTeXN0ZW1SZW1vdmVkJywgW2ZpbGVTeXN0ZW1QYXRoXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGVycm9yCiAgICAgKiBAcGFyYW0gez97dHlwZTogc3RyaW5nLCBmaWxlU3lzdGVtTmFtZTogc3RyaW5nLCByb290VVJMOiBzdHJpbmcsIGZpbGVTeXN0ZW1QYXRoOiBzdHJpbmd9fSBmaWxlU3lzdGVtCiAgICAgKi8KICAgIGZpbGVTeXN0ZW1BZGRlZChlcnJvciwgZmlsZVN5c3RlbSkgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ2ZpbGVTeXN0ZW1BZGRlZCcsIFtlcnJvciwgZmlsZVN5c3RlbV0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gY2hhbmdlZFBhdGhzCiAgICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBhZGRlZFBhdGhzCiAgICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZW1vdmVkUGF0aHMKICAgICAqLwogICAgZmlsZVN5c3RlbUZpbGVzQ2hhbmdlZEFkZGVkUmVtb3ZlZChjaGFuZ2VkUGF0aHMsIGFkZGVkUGF0aHMsIHJlbW92ZWRQYXRocykgewogICAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE01OCkKICAgICAgaWYgKHdpbmRvd1snSW5zcGVjdG9yRnJvbnRlbmRBUEknXSAmJiB3aW5kb3dbJ0luc3BlY3RvckZyb250ZW5kQVBJJ11bJ2ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWQnXSkgewogICAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgKICAgICAgICAgICAgJ2ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWQnLCBbY2hhbmdlZFBhdGhzLmNvbmNhdChhZGRlZFBhdGhzKS5jb25jYXQocmVtb3ZlZFBhdGhzKV0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgKICAgICAgICAgICAgJ2ZpbGVTeXN0ZW1GaWxlc0NoYW5nZWRBZGRlZFJlbW92ZWQnLCBbY2hhbmdlZFBhdGhzLCBhZGRlZFBhdGhzLCByZW1vdmVkUGF0aHNdKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtudW1iZXJ9IHJlcXVlc3RJZAogICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVTeXN0ZW1QYXRoCiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG90YWxXb3JrCiAgICAgKi8KICAgIGluZGV4aW5nVG90YWxXb3JrQ2FsY3VsYXRlZChyZXF1ZXN0SWQsIGZpbGVTeXN0ZW1QYXRoLCB0b3RhbFdvcmspIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdpbmRleGluZ1RvdGFsV29ya0NhbGN1bGF0ZWQnLCBbcmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aCwgdG90YWxXb3JrXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdElkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVN5c3RlbVBhdGgKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JrZWQKICAgICAqLwogICAgaW5kZXhpbmdXb3JrZWQocmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aCwgd29ya2VkKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnaW5kZXhpbmdXb3JrZWQnLCBbcmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aCwgd29ya2VkXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdElkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVN5c3RlbVBhdGgKICAgICAqLwogICAgaW5kZXhpbmdEb25lKHJlcXVlc3RJZCwgZmlsZVN5c3RlbVBhdGgpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdpbmRleGluZ0RvbmUnLCBbcmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aF0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHt7dHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgY29kZTogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIG1vZGlmaWVyczogbnVtYmVyfX0gZXZlbnQKICAgICAqLwogICAga2V5RXZlbnRVbmhhbmRsZWQoZXZlbnQpIHsKICAgICAgZXZlbnQua2V5SWRlbnRpZmllciA9IGtleUNvZGVUb0tleUlkZW50aWZpZXIoZXZlbnQua2V5Q29kZSk7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgna2V5RXZlbnRVbmhhbmRsZWQnLCBbZXZlbnRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFyZAogICAgICovCiAgICByZWxvYWRJbnNwZWN0ZWRQYWdlKGhhcmQpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdyZWxvYWRJbnNwZWN0ZWRQYWdlJywgW2hhcmRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lTnVtYmVyCiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uTnVtYmVyCiAgICAgKi8KICAgIHJldmVhbFNvdXJjZUxpbmUodXJsLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdyZXZlYWxTb3VyY2VMaW5lJywgW3VybCwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGZpbGVTeXN0ZW1QYXRoCiAgICAgKi8KICAgIHNhdmVkVVJMKHVybCwgZmlsZVN5c3RlbVBhdGgpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdzYXZlZFVSTCcsIFt1cmwsIGZpbGVTeXN0ZW1QYXRoXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdElkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVN5c3RlbVBhdGgKICAgICAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBmaWxlcwogICAgICovCiAgICBzZWFyY2hDb21wbGV0ZWQocmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aCwgZmlsZXMpIHsKICAgICAgdGhpcy5fZGlzcGF0Y2hPbkluc3BlY3RvckZyb250ZW5kQVBJKCdzZWFyY2hDb21wbGV0ZWQnLCBbcmVxdWVzdElkLCBmaWxlU3lzdGVtUGF0aCwgZmlsZXNdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJJZAogICAgICovCiAgICBzZXRJbnNwZWN0ZWRUYWJJZCh0YWJJZCkgewogICAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE00MSkuCiAgICAgIGlmICh3aW5kb3dbJ1dlYkluc3BlY3RvciddICYmIHdpbmRvd1snV2ViSW5zcGVjdG9yJ11bJ3NldEluc3BlY3RlZFRhYklkJ10pCiAgICAgICAgd2luZG93WydXZWJJbnNwZWN0b3InXVsnc2V0SW5zcGVjdGVkVGFiSWQnXSh0YWJJZCk7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ3NldEluc3BlY3RlZFRhYklkJywgW3RhYklkXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZVNvZnRNZW51CiAgICAgKi8KICAgIHNldFVzZVNvZnRNZW51KHVzZVNvZnRNZW51KSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnc2V0VXNlU29mdE1lbnUnLCBbdXNlU29mdE1lbnVdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYW5lbE5hbWUKICAgICAqLwogICAgc2hvd1BhbmVsKHBhbmVsTmFtZSkgewogICAgICB0aGlzLl9kaXNwYXRjaE9uSW5zcGVjdG9yRnJvbnRlbmRBUEkoJ3Nob3dQYW5lbCcsIFtwYW5lbE5hbWVdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZAogICAgICogQHBhcmFtIHtzdHJpbmd9IGNodW5rCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuY29kZWQKICAgICAqLwogICAgc3RyZWFtV3JpdGUoaWQsIGNodW5rLCBlbmNvZGVkKSB7CiAgICAgIHRoaXMuX2Rpc3BhdGNoT25JbnNwZWN0b3JGcm9udGVuZEFQSSgnc3RyZWFtV3JpdGUnLCBbaWQsIGVuY29kZWQgPyB0aGlzLl9kZWNvZGVCYXNlNjQoY2h1bmspIDogY2h1bmtdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaHVuawogICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICovCiAgICBfZGVjb2RlQmFzZTY0KGNodW5rKSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgcmVxdWVzdC5vcGVuKCdHRVQnLCAnZGF0YTp0ZXh0L3BsYWluO2Jhc2U2NCwnICsgY2h1bmssIGZhbHNlKTsKICAgICAgcmVxdWVzdC5zZW5kKG51bGwpOwogICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkgewogICAgICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlVGV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBkZWNvZGluZyBjaHVuayBpbiBzdHJlYW1Xcml0ZScpOwogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgfQogIH07CgogIGNvbnN0IERldlRvb2xzQVBJID0gbmV3IERldlRvb2xzQVBJSW1wbCgpOwogIHdpbmRvdy5EZXZUb29sc0FQSSA9IERldlRvb2xzQVBJOwoKICAvLyBJbnNwZWN0b3JGcm9udGVuZEhvc3RJbXBsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEBpbXBsZW1lbnRzIHtJbnNwZWN0b3JGcm9udGVuZEhvc3RBUEl9CiAgICogQHVucmVzdHJpY3RlZAogICAqLwogIGNvbnN0IEluc3BlY3RvckZyb250ZW5kSG9zdEltcGwgPSBjbGFzcyB7CiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICovCiAgICBnZXRTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSB7CiAgICAgIHJldHVybiBEZXZUb29sc0hvc3QuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgewogICAgICByZXR1cm4gRGV2VG9vbHNIb3N0LmdldFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGdldEluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgewogICAgICByZXR1cm4gRGV2VG9vbHNIb3N0LmdldEluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZ2V0SW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSB7CiAgICAgIHJldHVybiBEZXZUb29sc0hvc3QuZ2V0SW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICovCiAgICBwbGF0Zm9ybSgpIHsKICAgICAgcmV0dXJuIERldlRvb2xzSG9zdC5wbGF0Zm9ybSgpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIGxvYWRDb21wbGV0ZWQoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignbG9hZENvbXBsZXRlZCcsIFtdLCBudWxsKTsKICAgICAgLy8gU3VwcG9ydCBmb3IgbGVnYWN5ICg8NTcpIGZyb250ZW5kcy4KICAgICAgaWYgKHdpbmRvdy5SdW50aW1lICYmIHdpbmRvdy5SdW50aW1lLnF1ZXJ5UGFyYW0pIHsKICAgICAgICBjb25zdCBwYW5lbFRvT3BlbiA9IHdpbmRvdy5SdW50aW1lLnF1ZXJ5UGFyYW0oJ3BhbmVsJyk7CiAgICAgICAgaWYgKHBhbmVsVG9PcGVuKQogICAgICAgICAgd2luZG93LkRldlRvb2xzQVBJLnNob3dQYW5lbChwYW5lbFRvT3Blbik7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICovCiAgICBicmluZ1RvRnJvbnQoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignYnJpbmdUb0Zyb250JywgW10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIGNsb3NlV2luZG93KCkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ2Nsb3NlV2luZG93JywgW10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRG9ja2VkCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrCiAgICAgKi8KICAgIHNldElzRG9ja2VkKGlzRG9ja2VkLCBjYWxsYmFjaykgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3NldElzRG9ja2VkJywgW2lzRG9ja2VkXSwgY2FsbGJhY2spOwogICAgfQoKICAgIC8qKgogICAgICogUmVxdWVzdHMgaW5zcGVjdGVkIHBhZ2UgdG8gYmUgcGxhY2VkIGF0b3Agb2YgdGhlIGluc3BlY3RvciBmcm9udGVuZCB3aXRoIHNwZWNpZmllZCBib3VuZHMuCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7e3g6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcn19IGJvdW5kcwogICAgICovCiAgICBzZXRJbnNwZWN0ZWRQYWdlQm91bmRzKGJvdW5kcykgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3NldEluc3BlY3RlZFBhZ2VCb3VuZHMnLCBbYm91bmRzXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqLwogICAgaW5zcGVjdEVsZW1lbnRDb21wbGV0ZWQoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignaW5zcGVjdEVsZW1lbnRDb21wbGV0ZWQnLCBbXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJzCiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RyZWFtSWQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5Mb2FkTmV0d29ya1Jlc291cmNlUmVzdWx0KX0gY2FsbGJhY2sKICAgICAqLwogICAgbG9hZE5ldHdvcmtSZXNvdXJjZSh1cmwsIGhlYWRlcnMsIHN0cmVhbUlkLCBjYWxsYmFjaykgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoCiAgICAgICAgICAnbG9hZE5ldHdvcmtSZXNvdXJjZScsIFt1cmwsIGhlYWRlcnMsIHN0cmVhbUlkXSwgLyoqIEB0eXBlIHtmdW5jdGlvbig/T2JqZWN0KX0gKi8gKGNhbGxiYWNrKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIU9iamVjdDxzdHJpbmcsIHN0cmluZz4pfSBjYWxsYmFjawogICAgICovCiAgICBnZXRQcmVmZXJlbmNlcyhjYWxsYmFjaykgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ2dldFByZWZlcmVuY2VzJywgW10sIC8qKiBAdHlwZSB7ZnVuY3Rpb24oP09iamVjdCl9ICovIChjYWxsYmFjaykpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICAgKi8KICAgIHNldFByZWZlcmVuY2UobmFtZSwgdmFsdWUpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdzZXRQcmVmZXJlbmNlJywgW25hbWUsIHZhbHVlXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICAgKi8KICAgIHJlbW92ZVByZWZlcmVuY2UobmFtZSkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3JlbW92ZVByZWZlcmVuY2UnLCBbbmFtZV0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIGNsZWFyUHJlZmVyZW5jZXMoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignY2xlYXJQcmVmZXJlbmNlcycsIFtdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbgogICAgICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdAogICAgICovCiAgICBzZXRJbmplY3RlZFNjcmlwdEZvck9yaWdpbihvcmlnaW4sIHNjcmlwdCkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3JlZ2lzdGVyRXh0ZW5zaW9uc0FQSScsIFtvcmlnaW4sIHNjcmlwdF0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsCiAgICAgKi8KICAgIGluc3BlY3RlZFVSTENoYW5nZWQodXJsKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignaW5zcGVjdGVkVVJMQ2hhbmdlZCcsIFt1cmxdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICAgICAqLwogICAgY29weVRleHQodGV4dCkgewogICAgICBEZXZUb29sc0hvc3QuY29weVRleHQodGV4dCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqLwogICAgb3BlbkluTmV3VGFiKHVybCkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ29wZW5Jbk5ld1RhYicsIFt1cmxdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVTeXN0ZW1QYXRoCiAgICAgKi8KICAgIHNob3dJdGVtSW5Gb2xkZXIoZmlsZVN5c3RlbVBhdGgpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdzaG93SXRlbUluRm9sZGVyJywgW2ZpbGVTeXN0ZW1QYXRoXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50CiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlU2F2ZUFzCiAgICAgKi8KICAgIHNhdmUodXJsLCBjb250ZW50LCBmb3JjZVNhdmVBcykgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3NhdmUnLCBbdXJsLCBjb250ZW50LCBmb3JjZVNhdmVBc10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudAogICAgICovCiAgICBhcHBlbmQodXJsLCBjb250ZW50KSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignYXBwZW5kJywgW3VybCwgY29udGVudF0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZQogICAgICovCiAgICBzZW5kTWVzc2FnZVRvQmFja2VuZChtZXNzYWdlKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignZGlzcGF0Y2hQcm90b2NvbE1lc3NhZ2UnLCBbbWVzc2FnZV0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZQogICAgICogQHBhcmFtIHtudW1iZXJ9IGFjdGlvbkNvZGUKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBidWNrZXRTaXplCiAgICAgKi8KICAgIHJlY29yZEVudW1lcmF0ZWRIaXN0b2dyYW0oYWN0aW9uTmFtZSwgYWN0aW9uQ29kZSwgYnVja2V0U2l6ZSkgewogICAgICAvLyBTdXBwb3J0IGZvciBNNDkgZnJvbnRlbmQuCiAgICAgIGlmIChhY3Rpb25OYW1lID09PSAnRGV2VG9vbHMuRHJhd2VyU2hvd24nKQogICAgICAgIHJldHVybjsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdyZWNvcmRFbnVtZXJhdGVkSGlzdG9ncmFtJywgW2FjdGlvbk5hbWUsIGFjdGlvbkNvZGUsIGJ1Y2tldFNpemVdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICovCiAgICByZXF1ZXN0RmlsZVN5c3RlbXMoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcigncmVxdWVzdEZpbGVTeXN0ZW1zJywgW10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUKICAgICAqLwogICAgYWRkRmlsZVN5c3RlbSh0eXBlKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignYWRkRmlsZVN5c3RlbScsIFt0eXBlIHx8ICcnXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlU3lzdGVtUGF0aAogICAgICovCiAgICByZW1vdmVGaWxlU3lzdGVtKGZpbGVTeXN0ZW1QYXRoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcigncmVtb3ZlRmlsZVN5c3RlbScsIFtmaWxlU3lzdGVtUGF0aF0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVN5c3RlbUlkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0ZXJlZE5hbWUKICAgICAqIEByZXR1cm4gez9ET01GaWxlU3lzdGVtfQogICAgICovCiAgICBpc29sYXRlZEZpbGVTeXN0ZW0oZmlsZVN5c3RlbUlkLCByZWdpc3RlcmVkTmFtZSkgewogICAgICByZXR1cm4gRGV2VG9vbHNIb3N0Lmlzb2xhdGVkRmlsZVN5c3RlbShmaWxlU3lzdGVtSWQsIHJlZ2lzdGVyZWROYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHshRmlsZVN5c3RlbX0gZmlsZVN5c3RlbQogICAgICovCiAgICB1cGdyYWRlRHJhZ2dlZEZpbGVTeXN0ZW1QZXJtaXNzaW9ucyhmaWxlU3lzdGVtKSB7CiAgICAgIERldlRvb2xzSG9zdC51cGdyYWRlRHJhZ2dlZEZpbGVTeXN0ZW1QZXJtaXNzaW9ucyhmaWxlU3lzdGVtKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtudW1iZXJ9IHJlcXVlc3RJZAogICAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVTeXN0ZW1QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjbHVkZWRGb2xkZXJzCiAgICAgKi8KICAgIGluZGV4UGF0aChyZXF1ZXN0SWQsIGZpbGVTeXN0ZW1QYXRoLCBleGNsdWRlZEZvbGRlcnMpIHsKICAgICAgLy8gfGV4Y2x1ZGVkRm9sZGVyc3wgYWRkZWQgaW4gTTY3LiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKICAgICAgLy8gcGFzcyBlbXB0eSBhcnJheS4KICAgICAgZXhjbHVkZWRGb2xkZXJzID0gZXhjbHVkZWRGb2xkZXJzIHx8ICdbXSc7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignaW5kZXhQYXRoJywgW3JlcXVlc3RJZCwgZmlsZVN5c3RlbVBhdGgsIGV4Y2x1ZGVkRm9sZGVyc10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdElkCiAgICAgKi8KICAgIHN0b3BJbmRleGluZyhyZXF1ZXN0SWQpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdzdG9wSW5kZXhpbmcnLCBbcmVxdWVzdElkXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXF1ZXN0SWQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlU3lzdGVtUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5CiAgICAgKi8KICAgIHNlYXJjaEluUGF0aChyZXF1ZXN0SWQsIGZpbGVTeXN0ZW1QYXRoLCBxdWVyeSkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ3NlYXJjaEluUGF0aCcsIFtyZXF1ZXN0SWQsIGZpbGVTeXN0ZW1QYXRoLCBxdWVyeV0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICAgKi8KICAgIHpvb21GYWN0b3IoKSB7CiAgICAgIHJldHVybiBEZXZUb29sc0hvc3Quem9vbUZhY3RvcigpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIHpvb21JbigpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCd6b29tSW4nLCBbXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqLwogICAgem9vbU91dCgpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCd6b29tT3V0JywgW10sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIHJlc2V0Wm9vbSgpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdyZXNldFpvb20nLCBbXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaG9ydGN1dHMKICAgICAqLwogICAgc2V0V2hpdGVsaXN0ZWRTaG9ydGN1dHMoc2hvcnRjdXRzKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignc2V0V2hpdGVsaXN0ZWRTaG9ydGN1dHMnLCBbc2hvcnRjdXRzXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWN0aXZlCiAgICAgKi8KICAgIHNldEV5ZURyb3BwZXJBY3RpdmUoYWN0aXZlKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignc2V0RXllRHJvcHBlckFjdGl2ZScsIFthY3RpdmVdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gY2VydENoYWluCiAgICAgKi8KICAgIHNob3dDZXJ0aWZpY2F0ZVZpZXdlcihjZXJ0Q2hhaW4pIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdzaG93Q2VydGlmaWNhdGVWaWV3ZXInLCBbSlNPTi5zdHJpbmdpZnkoY2VydENoYWluKV0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrCiAgICAgKi8KICAgIHJlYXR0YWNoKGNhbGxiYWNrKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcigncmVhdHRhY2gnLCBbXSwgY2FsbGJhY2spOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIHJlYWR5Rm9yVGVzdCgpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdyZWFkeUZvclRlc3QnLCBbXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqLwogICAgY29ubmVjdGlvblJlYWR5KCkgewogICAgICBEZXZUb29sc0FQSS5zZW5kTWVzc2FnZVRvRW1iZWRkZXIoJ2Nvbm5lY3Rpb25SZWFkeScsIFtdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZQogICAgICovCiAgICBzZXRPcGVuTmV3V2luZG93Rm9yUG9wdXBzKHZhbHVlKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignc2V0T3Blbk5ld1dpbmRvd0ZvclBvcHVwcycsIFt2YWx1ZV0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0geyFBZGIuQ29uZmlnfSBjb25maWcKICAgICAqLwogICAgc2V0RGV2aWNlc0Rpc2NvdmVyeUNvbmZpZyhjb25maWcpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKAogICAgICAgICAgJ3NldERldmljZXNEaXNjb3ZlcnlDb25maWcnLAogICAgICAgICAgWwogICAgICAgICAgICBjb25maWcuZGlzY292ZXJVc2JEZXZpY2VzLCBjb25maWcucG9ydEZvcndhcmRpbmdFbmFibGVkLCBKU09OLnN0cmluZ2lmeShjb25maWcucG9ydEZvcndhcmRpbmdDb25maWcpLAogICAgICAgICAgICBjb25maWcubmV0d29ya0Rpc2NvdmVyeUVuYWJsZWQsIEpTT04uc3RyaW5naWZ5KGNvbmZpZy5uZXR3b3JrRGlzY292ZXJ5Q29uZmlnKQogICAgICAgICAgXSwKICAgICAgICAgIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQKICAgICAqLwogICAgc2V0RGV2aWNlc1VwZGF0ZXNFbmFibGVkKGVuYWJsZWQpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdzZXREZXZpY2VzVXBkYXRlc0VuYWJsZWQnLCBbZW5hYmxlZF0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFnZUlkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uCiAgICAgKi8KICAgIHBlcmZvcm1BY3Rpb25PblJlbW90ZVBhZ2UocGFnZUlkLCBhY3Rpb24pIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdwZXJmb3JtQWN0aW9uT25SZW1vdGVQYWdlJywgW3BhZ2VJZCwgYWN0aW9uXSwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBicm93c2VySWQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgICAqLwogICAgb3BlblJlbW90ZVBhZ2UoYnJvd3NlcklkLCB1cmwpIHsKICAgICAgRGV2VG9vbHNBUEkuc2VuZE1lc3NhZ2VUb0VtYmVkZGVyKCdvcGVuUmVtb3RlUGFnZScsIFticm93c2VySWQsIHVybF0sIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogQG92ZXJyaWRlCiAgICAgKi8KICAgIG9wZW5Ob2RlRnJvbnRlbmQoKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignb3Blbk5vZGVGcm9udGVuZCcsIFtdLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBvdmVycmlkZQogICAgICogQHBhcmFtIHtudW1iZXJ9IHgKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5CiAgICAgKiBAcGFyYW0geyFBcnJheS48IUluc3BlY3RvckZyb250ZW5kSG9zdEFQSS5Db250ZXh0TWVudURlc2NyaXB0b3I+fSBpdGVtcwogICAgICogQHBhcmFtIHshRG9jdW1lbnR9IGRvY3VtZW50CiAgICAgKi8KICAgIHNob3dDb250ZXh0TWVudUF0UG9pbnQoeCwgeSwgaXRlbXMsIGRvY3VtZW50KSB7CiAgICAgIERldlRvb2xzSG9zdC5zaG93Q29udGV4dE1lbnVBdFBvaW50KHgsIHksIGl0ZW1zLCBkb2N1bWVudCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGlzSG9zdGVkTW9kZSgpIHsKICAgICAgcmV0dXJuIERldlRvb2xzSG9zdC5pc0hvc3RlZE1vZGUoKTsKICAgIH0KCiAgICAvLyBCYWNrd2FyZC1jb21wYXRpYmxlIG1ldGhvZHMgYmVsb3cgdGhpcyBsaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE02NSkuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufQogICAgICovCiAgICBpc1VuZGVyVGVzdCgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNNTApLgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UKICAgICAqLwogICAgc2VuZEZyb250ZW5kQVBJTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHsKICAgIH0KCiAgICAvKioKICAgICAqIFN1cHBvcnQgZm9yIGxlZ2FjeSBmcm9udC1lbmRzICg8TTQxKS4KICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgcG9ydCgpIHsKICAgICAgcmV0dXJuICd1bmtub3duJzsKICAgIH0KCiAgICAvKioKICAgICAqIFN1cHBvcnQgZm9yIGxlZ2FjeSBmcm9udC1lbmRzICg8TTM4KS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tRmFjdG9yCiAgICAgKi8KICAgIHNldFpvb21GYWN0b3Ioem9vbUZhY3RvcikgewogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNMzQpLgogICAgICovCiAgICBzZW5kTWVzc2FnZVRvRW1iZWRkZXIoKSB7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE0zNCkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9ja1NpZGUKICAgICAqLwogICAgcmVxdWVzdFNldERvY2tTaWRlKGRvY2tTaWRlKSB7CiAgICAgIERldlRvb2xzQVBJLnNlbmRNZXNzYWdlVG9FbWJlZGRlcignc2V0SXNEb2NrZWQnLCBbZG9ja1NpZGUgIT09ICd1bmRvY2tlZCddLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIFN1cHBvcnQgZm9yIGxlZ2FjeSBmcm9udC1lbmRzICg8TTM0KS4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIHN1cHBvcnRzRmlsZVN5c3RlbXMoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNMjgpLgogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgY2FuSW5zcGVjdFdvcmtlcnMoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNMjgpLgogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgY2FuU2F2ZUFzKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFN1cHBvcnQgZm9yIGxlZ2FjeSBmcm9udC1lbmRzICg8TTI4KS4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGNhblNhdmUoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNMjgpLgogICAgICovCiAgICBsb2FkZWQoKSB7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE0yOCkuCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGhpZGRlblBhbmVscygpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNMjgpLgogICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICovCiAgICBsb2NhbGl6ZWRTdHJpbmdzVVJMKCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdXBwb3J0IGZvciBsZWdhY3kgZnJvbnQtZW5kcyAoPE0yOCkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsCiAgICAgKi8KICAgIGNsb3NlKHVybCkgewogICAgfQoKICAgIC8qKgogICAgICogU3VwcG9ydCBmb3IgbGVnYWN5IGZyb250LWVuZHMgKDxNNDQpLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGFjdGlvbkNvZGUKICAgICAqLwogICAgcmVjb3JkQWN0aW9uVGFrZW4oYWN0aW9uQ29kZSkgewogICAgICB0aGlzLnJlY29yZEVudW1lcmF0ZWRIaXN0b2dyYW0oJ0RldlRvb2xzLkFjdGlvblRha2VuJywgYWN0aW9uQ29kZSwgMTAwKTsKICAgIH0KCiAgICAvKioKICAgICAqIFN1cHBvcnQgZm9yIGxlZ2FjeSBmcm9udC1lbmRzICg8TTQ0KS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYW5lbENvZGUKICAgICAqLwogICAgcmVjb3JkUGFuZWxTaG93bihwYW5lbENvZGUpIHsKICAgICAgdGhpcy5yZWNvcmRFbnVtZXJhdGVkSGlzdG9ncmFtKCdEZXZUb29scy5QYW5lbFNob3duJywgcGFuZWxDb2RlLCAyMCk7CiAgICB9CiAgfTsKCiAgd2luZG93Lkluc3BlY3RvckZyb250ZW5kSG9zdCA9IG5ldyBJbnNwZWN0b3JGcm9udGVuZEhvc3RJbXBsKCk7CgogIC8vIERldlRvb2xzQXBwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBmdW5jdGlvbiBpbnN0YWxsT2JqZWN0T2JzZXJ2ZSgpIHsKICAgIC8qKiBAdHlwZSB7IUFycmF5PHN0cmluZz59ICovCiAgICBjb25zdCBwcm9wZXJ0aWVzID0gWwogICAgICAnYWR2YW5jZWRTZWFyY2hDb25maWcnLAogICAgICAnYXVkaXRzUGFuZWxTcGxpdFZpZXdTdGF0ZScsCiAgICAgICdhdWRpdHNTaWRlYmFyV2lkdGgnLAogICAgICAnYmxvY2tlZFVSTHMnLAogICAgICAnYnJlYWtwb2ludHMnLAogICAgICAnY2FjaGVEaXNhYmxlZCcsCiAgICAgICdjb2xvckZvcm1hdCcsCiAgICAgICdjb25zb2xlSGlzdG9yeScsCiAgICAgICdjb25zb2xlVGltZXN0YW1wc0VuYWJsZWQnLAogICAgICAnY3B1UHJvZmlsZXJWaWV3JywKICAgICAgJ2Nzc1NvdXJjZU1hcHNFbmFibGVkJywKICAgICAgJ2N1cnJlbnREb2NrU3RhdGUnLAogICAgICAnY3VzdG9tQ29sb3JQYWxldHRlJywKICAgICAgJ2N1c3RvbURldmljZVByZXNldHMnLAogICAgICAnY3VzdG9tRW11bGF0ZWREZXZpY2VMaXN0JywKICAgICAgJ2N1c3RvbUZvcm1hdHRlcnMnLAogICAgICAnY3VzdG9tVXNlckFnZW50JywKICAgICAgJ2RhdGFiYXNlVGFibGVWaWV3VmlzaWJsZUNvbHVtbnMnLAogICAgICAnZGF0YUdyaWQtY29va2llc1RhYmxlJywKICAgICAgJ2RhdGFHcmlkLURPTVN0b3JhZ2VJdGVtc1ZpZXcnLAogICAgICAnZGVidWdnZXJTaWRlYmFySGlkZGVuJywKICAgICAgJ2Rpc2FibGVEYXRhU2F2ZXJJbmZvYmFyJywKICAgICAgJ2Rpc2FibGVQYXVzZWRTdGF0ZU92ZXJsYXknLAogICAgICAnZG9tQnJlYWtwb2ludHMnLAogICAgICAnZG9tV29yZFdyYXAnLAogICAgICAnZWxlbWVudHNQYW5lbFNwbGl0Vmlld1N0YXRlJywKICAgICAgJ2VsZW1lbnRzU2lkZWJhcldpZHRoJywKICAgICAgJ2VtdWxhdGlvbi5kZXZpY2VIZWlnaHQnLAogICAgICAnZW11bGF0aW9uLmRldmljZU1vZGVWYWx1ZScsCiAgICAgICdlbXVsYXRpb24uZGV2aWNlT3JpZW50YXRpb25PdmVycmlkZScsCiAgICAgICdlbXVsYXRpb24uZGV2aWNlU2NhbGUnLAogICAgICAnZW11bGF0aW9uLmRldmljZVNjYWxlRmFjdG9yJywKICAgICAgJ2VtdWxhdGlvbi5kZXZpY2VVQScsCiAgICAgICdlbXVsYXRpb24uZGV2aWNlV2lkdGgnLAogICAgICAnZW11bGF0aW9uLmdlb2xvY2F0aW9uT3ZlcnJpZGUnLAogICAgICAnZW11bGF0aW9uLnNob3dEZXZpY2VNb2RlJywKICAgICAgJ2VtdWxhdGlvbi5zaG93UnVsZXJzJywKICAgICAgJ2VuYWJsZUFzeW5jU3RhY2tUcmFjZXMnLAogICAgICAnZXZlbnRMaXN0ZW5lckJyZWFrcG9pbnRzJywKICAgICAgJ2ZpbGVNYXBwaW5nRW50cmllcycsCiAgICAgICdmaWxlU3lzdGVtTWFwcGluZycsCiAgICAgICdGaWxlU3lzdGVtVmlld1NpZGViYXJXaWR0aCcsCiAgICAgICdmaWxlU3lzdGVtVmlld1NwbGl0Vmlld1N0YXRlJywKICAgICAgJ2ZpbHRlckJhci1jb25zb2xlVmlldycsCiAgICAgICdmaWx0ZXJCYXItbmV0d29ya1BhbmVsJywKICAgICAgJ2ZpbHRlckJhci1wcm9taXNlUGFuZScsCiAgICAgICdmaWx0ZXJCYXItdGltZWxpbmVQYW5lbCcsCiAgICAgICdmcmFtZVZpZXdlckhpZGVDaHJvbWVXaW5kb3cnLAogICAgICAnaGVhcFNuYXBzaG90UmV0YWluZXJzVmlld1NpemUnLAogICAgICAnaGVhcFNuYXBzaG90U3BsaXRWaWV3U3RhdGUnLAogICAgICAnaGlkZUNvbGxlY3RlZFByb21pc2VzJywKICAgICAgJ2hpZGVOZXR3b3JrTWVzc2FnZXMnLAogICAgICAnaGlnaGxpZ2h0Tm9kZU9uSG92ZXJJbk92ZXJsYXknLAogICAgICAnaGlnaFJlc29sdXRpb25DcHVQcm9maWxpbmcnLAogICAgICAnaW5saW5lVmFyaWFibGVWYWx1ZXMnLAogICAgICAnSW5zcGVjdG9yLmRyYXdlclNwbGl0VmlldycsCiAgICAgICdJbnNwZWN0b3IuZHJhd2VyU3BsaXRWaWV3U3RhdGUnLAogICAgICAnSW5zcGVjdG9yVmlldy5wYW5lbE9yZGVyJywKICAgICAgJ0luc3BlY3RvclZpZXcuc2NyZWVuY2FzdFNwbGl0VmlldycsCiAgICAgICdJbnNwZWN0b3JWaWV3LnNjcmVlbmNhc3RTcGxpdFZpZXdTdGF0ZScsCiAgICAgICdJbnNwZWN0b3JWaWV3LnNwbGl0VmlldycsCiAgICAgICdJbnNwZWN0b3JWaWV3LnNwbGl0Vmlld1N0YXRlJywKICAgICAgJ2phdmFTY3JpcHREaXNhYmxlZCcsCiAgICAgICdqc1NvdXJjZU1hcHNFbmFibGVkJywKICAgICAgJ2xhc3RBY3RpdmVQYW5lbCcsCiAgICAgICdsYXN0RG9ja1N0YXRlJywKICAgICAgJ2xhc3RTZWxlY3RlZFNvdXJjZXNTaWRlYmFyUGFuZVRhYicsCiAgICAgICdsYXN0U25pcHBldEV2YWx1YXRpb25JbmRleCcsCiAgICAgICdsYXllckRldGFpbHNTcGxpdFZpZXcnLAogICAgICAnbGF5ZXJEZXRhaWxzU3BsaXRWaWV3U3RhdGUnLAogICAgICAnbGF5ZXJzUGFuZWxTcGxpdFZpZXdTdGF0ZScsCiAgICAgICdsYXllcnNTaG93SW50ZXJuYWxMYXllcnMnLAogICAgICAnbGF5ZXJzU2lkZWJhcldpZHRoJywKICAgICAgJ21lc3NhZ2VMZXZlbEZpbHRlcnMnLAogICAgICAnbWVzc2FnZVVSTEZpbHRlcnMnLAogICAgICAnbW9uaXRvcmluZ1hIUkVuYWJsZWQnLAogICAgICAnbmF2aWdhdG9yR3JvdXBCeUZvbGRlcicsCiAgICAgICduYXZpZ2F0b3JIaWRkZW4nLAogICAgICAnbmV0d29ya0NvbG9yQ29kZVJlc291cmNlVHlwZXMnLAogICAgICAnbmV0d29ya0NvbmRpdGlvbnMnLAogICAgICAnbmV0d29ya0NvbmRpdGlvbnNDdXN0b21Qcm9maWxlcycsCiAgICAgICduZXR3b3JrSGlkZURhdGFVUkwnLAogICAgICAnbmV0d29ya0xvZ0NvbHVtbnNWaXNpYmlsaXR5JywKICAgICAgJ25ldHdvcmtMb2dMYXJnZVJvd3MnLAogICAgICAnbmV0d29ya0xvZ1Nob3dPdmVydmlldycsCiAgICAgICduZXR3b3JrUGFuZWxTcGxpdFZpZXdTdGF0ZScsCiAgICAgICduZXR3b3JrUmVjb3JkRmlsbVN0cmlwU2V0dGluZycsCiAgICAgICduZXR3b3JrUmVzb3VyY2VUeXBlRmlsdGVycycsCiAgICAgICduZXR3b3JrU2hvd1ByaW1hcnlMb2FkV2F0ZXJmYWxsJywKICAgICAgJ25ldHdvcmtTaWRlYmFyV2lkdGgnLAogICAgICAnb3BlbkxpbmtIYW5kbGVyJywKICAgICAgJ3BhdXNlT25DYXVnaHRFeGNlcHRpb24nLAogICAgICAncGF1c2VPbkV4Y2VwdGlvbkVuYWJsZWQnLAogICAgICAncHJlc2VydmVDb25zb2xlTG9nJywKICAgICAgJ3ByZXR0eVByaW50SW5mb2JhckRpc2FibGVkJywKICAgICAgJ3ByZXZpb3VzbHlWaWV3ZWRGaWxlcycsCiAgICAgICdwcm9maWxlc1BhbmVsU3BsaXRWaWV3U3RhdGUnLAogICAgICAncHJvZmlsZXNTaWRlYmFyV2lkdGgnLAogICAgICAncHJvbWlzZVN0YXR1c0ZpbHRlcnMnLAogICAgICAncmVjb3JkQWxsb2NhdGlvblN0YWNrcycsCiAgICAgICdyZXF1ZXN0SGVhZGVyRmlsdGVyU2V0dGluZycsCiAgICAgICdyZXF1ZXN0LWluZm8tZm9ybURhdGEtY2F0ZWdvcnktZXhwYW5kZWQnLAogICAgICAncmVxdWVzdC1pbmZvLWdlbmVyYWwtY2F0ZWdvcnktZXhwYW5kZWQnLAogICAgICAncmVxdWVzdC1pbmZvLXF1ZXJ5U3RyaW5nLWNhdGVnb3J5LWV4cGFuZGVkJywKICAgICAgJ3JlcXVlc3QtaW5mby1yZXF1ZXN0SGVhZGVycy1jYXRlZ29yeS1leHBhbmRlZCcsCiAgICAgICdyZXF1ZXN0LWluZm8tcmVxdWVzdFBheWxvYWQtY2F0ZWdvcnktZXhwYW5kZWQnLAogICAgICAncmVxdWVzdC1pbmZvLXJlc3BvbnNlSGVhZGVycy1jYXRlZ29yeS1leHBhbmRlZCcsCiAgICAgICdyZXNvdXJjZXMnLAogICAgICAncmVzb3VyY2VzTGFzdFNlbGVjdGVkSXRlbScsCiAgICAgICdyZXNvdXJjZXNQYW5lbFNwbGl0Vmlld1N0YXRlJywKICAgICAgJ3Jlc291cmNlc1NpZGViYXJXaWR0aCcsCiAgICAgICdyZXNvdXJjZVZpZXdUYWInLAogICAgICAnc2F2ZWRVUkxzJywKICAgICAgJ3NjcmVlbmNhc3RFbmFibGVkJywKICAgICAgJ3NjcmlwdHNQYW5lbE5hdmlnYXRvclNpZGViYXJXaWR0aCcsCiAgICAgICdzZWFyY2hJbkNvbnRlbnRTY3JpcHRzJywKICAgICAgJ3NlbGVjdGVkQXVkaXRDYXRlZ29yaWVzJywKICAgICAgJ3NlbGVjdGVkQ29sb3JQYWxldHRlJywKICAgICAgJ3NlbGVjdGVkUHJvZmlsZVR5cGUnLAogICAgICAnc2hvcnRjdXRQYW5lbFN3aXRjaCcsCiAgICAgICdzaG93QWR2YW5jZWRIZWFwU25hcHNob3RQcm9wZXJ0aWVzJywKICAgICAgJ3Nob3dFdmVudExpc3RlbmVyc0ZvckFuY2VzdG9ycycsCiAgICAgICdzaG93RnJhbWVvd2tyTGlzdGVuZXJzJywKICAgICAgJ3Nob3dIZWFTbmFwc2hvdE9iamVjdHNIaWRkZW5Qcm9wZXJ0aWVzJywKICAgICAgJ3Nob3dJbmhlcml0ZWRDb21wdXRlZFN0eWxlUHJvcGVydGllcycsCiAgICAgICdzaG93TWVkaWFRdWVyeUluc3BlY3RvcicsCiAgICAgICdzaG93TmF0aXZlRnVuY3Rpb25zSW5KU1Byb2ZpbGUnLAogICAgICAnc2hvd1VBU2hhZG93RE9NJywKICAgICAgJ3Nob3dXaGl0ZXNwYWNlc0luRWRpdG9yJywKICAgICAgJ3NpZGViYXJQb3NpdGlvbicsCiAgICAgICdza2lwQ29udGVudFNjcmlwdHMnLAogICAgICAnc2tpcFN0YWNrRnJhbWVzUGF0dGVybicsCiAgICAgICdzb3VyY2VNYXBJbmZvYmFyRGlzYWJsZWQnLAogICAgICAnc291cmNlc1BhbmVsRGVidWdnZXJTaWRlYmFyU3BsaXRWaWV3U3RhdGUnLAogICAgICAnc291cmNlc1BhbmVsTmF2aWdhdG9yU3BsaXRWaWV3U3RhdGUnLAogICAgICAnc291cmNlc1BhbmVsU3BsaXRTaWRlYmFyUmF0aW8nLAogICAgICAnc291cmNlc1BhbmVsU3BsaXRWaWV3U3RhdGUnLAogICAgICAnc291cmNlc1NpZGViYXJXaWR0aCcsCiAgICAgICdzdGFuZGFyZEVtdWxhdGVkRGV2aWNlTGlzdCcsCiAgICAgICdTdHlsZXNQYW5lU3BsaXRSYXRpbycsCiAgICAgICdzdHlsZXNQYW5lU3BsaXRWaWV3U3RhdGUnLAogICAgICAndGV4dEVkaXRvckF1dG9jb21wbGV0aW9uJywKICAgICAgJ3RleHRFZGl0b3JBdXRvRGV0ZWN0SW5kZW50JywKICAgICAgJ3RleHRFZGl0b3JCcmFja2V0TWF0Y2hpbmcnLAogICAgICAndGV4dEVkaXRvckluZGVudCcsCiAgICAgICd0aW1lbGluZUNhcHR1cmVGaWxtU3RyaXAnLAogICAgICAndGltZWxpbmVDYXB0dXJlTGF5ZXJzQW5kUGljdHVyZXMnLAogICAgICAndGltZWxpbmVDYXB0dXJlTWVtb3J5JywKICAgICAgJ3RpbWVsaW5lQ2FwdHVyZU5ldHdvcmsnLAogICAgICAndGltZWxpbmUtZGV0YWlscycsCiAgICAgICd0aW1lbGluZUVuYWJsZUpTU2FtcGxpbmcnLAogICAgICAndGltZWxpbmVPdmVydmlld01vZGUnLAogICAgICAndGltZWxpbmVQYW5lbERldGFpbHNTcGxpdFZpZXdTdGF0ZScsCiAgICAgICd0aW1lbGluZVBhbmVsUmVjb3JzU3BsaXRWaWV3U3RhdGUnLAogICAgICAndGltZWxpbmVQYW5lbFRpbWVsaW5lU3RhY2tTcGxpdFZpZXdTdGF0ZScsCiAgICAgICd0aW1lbGluZVBlcnNwZWN0aXZlJywKICAgICAgJ3RpbWVsaW5lLXNwbGl0JywKICAgICAgJ3RpbWVsaW5lVHJlZUdyb3VwQnknLAogICAgICAndGltZWxpbmUtdmlldycsCiAgICAgICd0aW1lbGluZVZpZXdNb2RlJywKICAgICAgJ3VpVGhlbWUnLAogICAgICAnd2F0Y2hFeHByZXNzaW9ucycsCiAgICAgICdXZWJJbnNwZWN0b3IuRHJhd2VyLmxhc3RTZWxlY3RlZFZpZXcnLAogICAgICAnV2ViSW5zcGVjdG9yLkRyYXdlci5zaG93T25Mb2FkJywKICAgICAgJ3dvcmtzcGFjZUV4Y2x1ZGVkRm9sZGVycycsCiAgICAgICd3b3Jrc3BhY2VGb2xkZXJFeGNsdWRlUGF0dGVybicsCiAgICAgICd3b3Jrc3BhY2VJbmZvYmFyRGlzYWJsZWQnLAogICAgICAnd29ya3NwYWNlTWFwcGluZ0luZm9iYXJEaXNhYmxlZCcsCiAgICAgICd4aHJCcmVha3BvaW50cycKICAgIF07CgogICAgLyoqCiAgICAgKiBAdGhpcyB7IXtfc3RvcmFnZTogT2JqZWN0LCBfbmFtZTogc3RyaW5nfX0KICAgICAqLwogICAgZnVuY3Rpb24gc2V0dGluZ1JlbW92ZSgpIHsKICAgICAgdGhpcy5fc3RvcmFnZVt0aGlzLl9uYW1lXSA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2JqZWN0CiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFBcnJheTwhe25hbWU6IHN0cmluZ30+KX0gb2JzZXJ2ZXIKICAgICAqLwogICAgZnVuY3Rpb24gb2JqZWN0T2JzZXJ2ZShvYmplY3QsIG9ic2VydmVyKSB7CiAgICAgIGlmICh3aW5kb3dbJ1dlYkluc3BlY3RvciddKSB7CiAgICAgICAgY29uc3Qgc2V0dGluZ1Byb3RvdHlwZSA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHdpbmRvd1snV2ViSW5zcGVjdG9yJ11bJ1NldHRpbmcnXVsncHJvdG90eXBlJ10pOwogICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ1Byb3RvdHlwZVsncmVtb3ZlJ10gPT09ICdmdW5jdGlvbicpCiAgICAgICAgICBzZXR0aW5nUHJvdG90eXBlWydyZW1vdmUnXSA9IHNldHRpbmdSZW1vdmU7CiAgICAgIH0KICAgICAgLyoqIEB0eXBlIHshU2V0PHN0cmluZz59ICovCiAgICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IFNldCgpOwogICAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CgogICAgICBmdW5jdGlvbiBzY2hlZHVsZU9ic2VydmVyKCkgewogICAgICAgIGlmIChzY2hlZHVsZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgc2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbE9ic2VydmVyKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2FsbE9ic2VydmVyKCkgewogICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGNoYW5nZXMgPSAvKiogQHR5cGUgeyFBcnJheTwhe25hbWU6IHN0cmluZ30+fSAqLyAoW10pOwogICAgICAgIGNoYW5nZWRQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgY2hhbmdlcy5wdXNoKHtuYW1lOiBuYW1lfSk7CiAgICAgICAgfSk7CiAgICAgICAgY2hhbmdlZFByb3BlcnRpZXMuY2xlYXIoKTsKICAgICAgICBvYnNlcnZlci5jYWxsKG51bGwsIGNoYW5nZXMpOwogICAgICB9CgogICAgICAvKiogQHR5cGUgeyFNYXA8c3RyaW5nLCAqPn0gKi8KICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBNYXAoKTsKCiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgaWYgKHByb3BlcnR5IGluIG9iamVjdCkgewogICAgICAgICAgc3RvcmFnZS5zZXQocHJvcGVydHksIG9iamVjdFtwcm9wZXJ0eV0pOwogICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgICAgICovCiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc3RvcmFnZS5nZXQocHJvcGVydHkpOwogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUKICAgICAgICAgICAqLwogICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBzdG9yYWdlLnNldChwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgICAgICBjaGFuZ2VkUHJvcGVydGllcy5hZGQocHJvcGVydHkpOwogICAgICAgICAgICBzY2hlZHVsZU9ic2VydmVyKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsraSkKICAgICAgICBkZWZpbmVQcm9wZXJ0eShwcm9wZXJ0aWVzW2ldKTsKICAgIH0KCiAgICB3aW5kb3cuT2JqZWN0Lm9ic2VydmUgPSBvYmplY3RPYnNlcnZlOwogIH0KCiAgLyoqIEB0eXBlIHshTWFwPG51bWJlciwgc3RyaW5nPn0gKi8KICBjb25zdCBzdGF0aWNLZXlJZGVudGlmaWVycyA9IG5ldyBNYXAoWwogICAgWzB4MTIsICdBbHQnXSwKICAgIFsweDExLCAnQ29udHJvbCddLAogICAgWzB4MTAsICdTaGlmdCddLAogICAgWzB4MTQsICdDYXBzTG9jayddLAogICAgWzB4NWIsICdXaW4nXSwKICAgIFsweDVjLCAnV2luJ10sCiAgICBbMHgwYywgJ0NsZWFyJ10sCiAgICBbMHgyOCwgJ0Rvd24nXSwKICAgIFsweDIzLCAnRW5kJ10sCiAgICBbMHgwYSwgJ0VudGVyJ10sCiAgICBbMHgwZCwgJ0VudGVyJ10sCiAgICBbMHgyYiwgJ0V4ZWN1dGUnXSwKICAgIFsweDcwLCAnRjEnXSwKICAgIFsweDcxLCAnRjInXSwKICAgIFsweDcyLCAnRjMnXSwKICAgIFsweDczLCAnRjQnXSwKICAgIFsweDc0LCAnRjUnXSwKICAgIFsweDc1LCAnRjYnXSwKICAgIFsweDc2LCAnRjcnXSwKICAgIFsweDc3LCAnRjgnXSwKICAgIFsweDc4LCAnRjknXSwKICAgIFsweDc5LCAnRjEwJ10sCiAgICBbMHg3YSwgJ0YxMSddLAogICAgWzB4N2IsICdGMTInXSwKICAgIFsweDdjLCAnRjEzJ10sCiAgICBbMHg3ZCwgJ0YxNCddLAogICAgWzB4N2UsICdGMTUnXSwKICAgIFsweDdmLCAnRjE2J10sCiAgICBbMHg4MCwgJ0YxNyddLAogICAgWzB4ODEsICdGMTgnXSwKICAgIFsweDgyLCAnRjE5J10sCiAgICBbMHg4MywgJ0YyMCddLAogICAgWzB4ODQsICdGMjEnXSwKICAgIFsweDg1LCAnRjIyJ10sCiAgICBbMHg4NiwgJ0YyMyddLAogICAgWzB4ODcsICdGMjQnXSwKICAgIFsweDJmLCAnSGVscCddLAogICAgWzB4MjQsICdIb21lJ10sCiAgICBbMHgyZCwgJ0luc2VydCddLAogICAgWzB4MjUsICdMZWZ0J10sCiAgICBbMHgyMiwgJ1BhZ2VEb3duJ10sCiAgICBbMHgyMSwgJ1BhZ2VVcCddLAogICAgWzB4MTMsICdQYXVzZSddLAogICAgWzB4MmMsICdQcmludFNjcmVlbiddLAogICAgWzB4MjcsICdSaWdodCddLAogICAgWzB4OTEsICdTY3JvbGwnXSwKICAgIFsweDI5LCAnU2VsZWN0J10sCiAgICBbMHgyNiwgJ1VwJ10sCiAgICBbMHgyZSwgJ1UrMDA3RiddLCAgLy8gU3RhbmRhcmQgc2F5cyB0aGF0IERFTCBiZWNvbWVzIFUrMDA3Ri4KICAgIFsweGIwLCAnTWVkaWFOZXh0VHJhY2snXSwKICAgIFsweGIxLCAnTWVkaWFQcmV2aW91c1RyYWNrJ10sCiAgICBbMHhiMiwgJ01lZGlhU3RvcCddLAogICAgWzB4YjMsICdNZWRpYVBsYXlQYXVzZSddLAogICAgWzB4YWQsICdWb2x1bWVNdXRlJ10sCiAgICBbMHhhZSwgJ1ZvbHVtZURvd24nXSwKICAgIFsweGFmLCAnVm9sdW1lVXAnXSwKICBdKTsKCiAgLyoqCiAgICogQHBhcmFtIHtudW1iZXJ9IGtleUNvZGUKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICovCiAgZnVuY3Rpb24ga2V5Q29kZVRvS2V5SWRlbnRpZmllcihrZXlDb2RlKSB7CiAgICBsZXQgcmVzdWx0ID0gc3RhdGljS2V5SWRlbnRpZmllcnMuZ2V0KGtleUNvZGUpOwogICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gcmVzdWx0OwogICAgcmVzdWx0ID0gJ1UrJzsKICAgIGNvbnN0IGhleFN0cmluZyA9IGtleUNvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICBmb3IgKGxldCBpID0gaGV4U3RyaW5nLmxlbmd0aDsgaSA8IDQ7ICsraSkKICAgICAgcmVzdWx0ICs9ICcwJzsKICAgIHJlc3VsdCArPSBoZXhTdHJpbmc7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gaW5zdGFsbEJhY2t3YXJkc0NvbXBhdGliaWxpdHkoKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignL3JlbW90ZS8nKSA9PT0gLTEpCiAgICAgIHJldHVybjsKCiAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgKDxNNjUpIGZyb250ZW5kcy4KICAgIC8qKiBAdHlwZSB7KCFmdW5jdGlvbihudW1iZXIsIG51bWJlcik6RWxlbWVudHx1bmRlZmluZWQpfSAqLwogICAgU2hhZG93Um9vdC5wcm90b3R5cGUuX19vcmlnaW5hbFNoYWRvd1Jvb3RFbGVtZW50RnJvbVBvaW50OwoKICAgIGlmICghU2hhZG93Um9vdC5wcm90b3R5cGUuX19vcmlnaW5hbFNoYWRvd1Jvb3RFbGVtZW50RnJvbVBvaW50KSB7CiAgICAgIFNoYWRvd1Jvb3QucHJvdG90eXBlLl9fb3JpZ2luYWxTaGFkb3dSb290RWxlbWVudEZyb21Qb2ludCA9IFNoYWRvd1Jvb3QucHJvdG90eXBlLmVsZW1lbnRGcm9tUG9pbnQ7CiAgICAgIC8qKgogICAgICAgKiAgQHBhcmFtIHtudW1iZXJ9IHgKICAgICAgICogIEBwYXJhbSB7bnVtYmVyfSB5CiAgICAgICAqICBAcmV0dXJuIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgU2hhZG93Um9vdC5wcm90b3R5cGUuZWxlbWVudEZyb21Qb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9IFNoYWRvd1Jvb3QucHJvdG90eXBlLl9fb3JpZ2luYWxTaGFkb3dSb290RWxlbWVudEZyb21Qb2ludC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh0aGlzLmhvc3QgJiYgb3JpZ2luYWxSZXN1bHQgPT09IHRoaXMuaG9zdCkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBvcmlnaW5hbFJlc3VsdDsKICAgICAgfTsKICAgIH0KCiAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgKDxNNTMpIGZyb250ZW5kcy4KICAgIGlmICghd2luZG93LktleWJvYXJkRXZlbnQucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdrZXlJZGVudGlmaWVyJykpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5LZXlib2FyZEV2ZW50LnByb3RvdHlwZSwgJ2tleUlkZW50aWZpZXInLCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICAgICAqIEB0aGlzIHtLZXlib2FyZEV2ZW50fQogICAgICAgICAqLwogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4ga2V5Q29kZVRvS2V5SWRlbnRpZmllcih0aGlzLmtleUNvZGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLy8gU3VwcG9ydCBmb3IgbGVnYWN5ICg8TTUwKSBmcm9udGVuZHMuCiAgICBpbnN0YWxsT2JqZWN0T2JzZXJ2ZSgpOwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICAgKiBAcmV0dXJuIHshQ1NTVmFsdWV8bnVsbH0KICAgICAqIEB0aGlzIHtDU1NTdHlsZURlY2xhcmF0aW9ufQogICAgICovCiAgICBmdW5jdGlvbiBnZXRWYWx1ZShwcm9wZXJ0eSkgewogICAgICAvLyBOb3RlIHRoYXQgfHByb3BlcnR5fCBjb21lcyBmcm9tIGFub3RoZXIgY29udGV4dCwgc28gd2UgY2FuJ3QgdXNlID09PSBoZXJlLgogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxCiAgICAgIGlmIChwcm9wZXJ0eSA9PSAncGFkZGluZy1sZWZ0JykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFDU1NWYWx1ZX0gKi8gKHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHJldHVybiB7bnVtYmVyfQogICAgICAgICAgICogQHRoaXMgeyF7X19wYWRkaW5nTGVmdDogbnVtYmVyfX0KICAgICAgICAgICAqLwogICAgICAgICAgZ2V0RmxvYXRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fcGFkZGluZ0xlZnQ7CiAgICAgICAgICB9LAogICAgICAgICAgX19wYWRkaW5nTGVmdDogcGFyc2VGbG9hdCh0aGlzLnBhZGRpbmdMZWZ0KQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0UHJvcGVydHlDU1NWYWx1ZSBpcyB1bmRlZmluZWQnKTsKICAgIH0KCiAgICAvLyBTdXBwb3J0IGZvciBsZWdhY3kgKDxNNDEpIGZyb250ZW5kcy4KICAgIHdpbmRvdy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZS5nZXRQcm9wZXJ0eUNTU1ZhbHVlID0gZ2V0VmFsdWU7CgogICAgZnVuY3Rpb24gQ1NTUHJpbWl0aXZlVmFsdWUoKSB7CiAgICB9CiAgICBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggPSA1OwogICAgd2luZG93LkNTU1ByaW1pdGl2ZVZhbHVlID0gQ1NTUHJpbWl0aXZlVmFsdWU7CgogICAgLy8gU3VwcG9ydCBmb3IgbGVnYWN5ICg8TTQ0KSBmcm9udGVuZHMuCiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgIHN0eWxlRWxlbWVudC50eXBlID0gJ3RleHQvY3NzJzsKICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9ICdodG1sIC9kZWVwLyAqIHsgbWluLXdpZHRoOiAwOyBtaW4taGVpZ2h0OiAwOyB9JzsKCiAgICAvLyBTdXBwb3J0IGZvciBxdWlya3kgYm9yZGVyLWltYWdlIGJlaGF2aW9yICg8TTUxKSwgc2VlOgogICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTU5MjU4CiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgKz0KICAgICAgICAnXG5odG1sIC9kZWVwLyAuY20tYnJlYWtwb2ludCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZCAhaW1wb3J0YW50OyB9JzsKICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCArPQogICAgICAgICdcbmh0bWwgL2RlZXAvIC5jbS1icmVha3BvaW50LmNtLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGJvcmRlci1zdHlsZTogc29saWQgIWltcG9ydGFudDsgfSc7CiAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwoKICAgIC8vIFN1cHBvcnQgZm9yIGxlZ2FjeSAoPE00OSkgZnJvbnRlbmRzLgogICAgRXZlbnQucHJvdG90eXBlLmRlZXBQYXRoID0gdW5kZWZpbmVkOwoKICAgIC8vIFN1cHBvcnQgZm9yIGxlZ2FjeSAoPDUzKSBmcm9udGVuZHMuCiAgICB3aW5kb3cuRmlsZUVycm9yID0gLyoqIEB0eXBlIHshZnVuY3Rpb24gKG5ldzogRmlsZUVycm9yKSA6ID99ICovICh7CiAgICAgIE5PVF9GT1VORF9FUlI6IERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLAogICAgICBBQk9SVF9FUlI6IERPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsCiAgICAgIElOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUjogRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwKICAgICAgTk9UX1JFQURBQkxFX0VSUjogMCAgLy8gTm8gbWF0Y2hpbmcgRE9NRXhjZXB0aW9uLCBzbyBjb2RlIHdpbGwgYmUgMC4KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gd2luZG93TG9hZGVkKCkgewogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3aW5kb3dMb2FkZWQsIGZhbHNlKTsKICAgIGluc3RhbGxCYWNrd2FyZHNDb21wYXRpYmlsaXR5KCk7CiAgfQoKICBpZiAod2luZG93LmRvY3VtZW50LmhlYWQgJiYKICAgICAgKHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnIHx8IHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSkKICAgIGluc3RhbGxCYWNrd2FyZHNDb21wYXRpYmlsaXR5KCk7CiAgZWxzZQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3aW5kb3dMb2FkZWQsIGZhbHNlKTsKCiAgLyoqIEB0eXBlIHsoIWZ1bmN0aW9uKHN0cmluZywgYm9vbGVhbj0pOmJvb2xlYW4pfHVuZGVmaW5lZH0gKi8KICBET01Ub2tlbkxpc3QucHJvdG90eXBlLl9fb3JpZ2luYWxET01Ub2tlbkxpc3RUb2dnbGU7CgogIGlmICghRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5fX29yaWdpbmFsRE9NVG9rZW5MaXN0VG9nZ2xlKSB7CiAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLl9fb3JpZ2luYWxET01Ub2tlbkxpc3RUb2dnbGUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTsKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBmb3JjZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbih0b2tlbiwgZm9yY2UpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpCiAgICAgICAgZm9yY2UgPSAhdGhpcy5jb250YWlucyh0b2tlbik7CiAgICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxET01Ub2tlbkxpc3RUb2dnbGUodG9rZW4sICEhZm9yY2UpOwogICAgfTsKICB9Cgp9KSh3aW5kb3cpOwovKgogKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqIGRpc3RyaWJ1dGlvbi4KICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwovKiBlc2xpbnQtZGlzYWJsZSBpbmRlbnQgKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IFRoaXMgZmlsZSBjb250YWlucyBzbWFsbCB0ZXN0aW5nIGZyYW1ld29yayBhbG9uZyB3aXRoIHRoZQogKiB0ZXN0IHN1aXRlIGZvciB0aGUgZnJvbnRlbmQuIFRoZXNlIHRlc3RzIGFyZSBhIHBhcnQgb2YgdGhlIGNvbnRpbnVlcyBidWlsZAogKiBhbmQgYXJlIGV4ZWN1dGVkIGJ5IHRoZSBkZXZ0b29sc19zYW5pdHlfdW5pdHRlc3QuY2MgYXMgYSBwYXJ0IG9mIHRoZQogKiBJbnRlcmFjdGl2ZSBVSSBUZXN0IHN1aXRlLgogKiBGSVhNRTogY2hhbmdlIGZpZWxkIG5hbWluZyBzdHlsZSB0byB1c2UgdHJhaWxpbmcgdW5kZXJzY29yZS4KICovCgooZnVuY3Rpb24gY3JlYXRlVGVzdFN1aXRlKHdpbmRvdykgewoKICAvKioKICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY29uc3QgVGVzdFN1aXRlID0gY2xhc3MgewogICAgLyoqCiAgICAgKiBUZXN0IHN1aXRlIGZvciBpbnRlcmFjdGl2ZSBVSSB0ZXN0cy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb21BdXRvbWF0aW9uQ29udHJvbGxlciBEb21BdXRvbWF0aW9uQ29udHJvbGxlciBpbnN0YW5jZS4KICAgICAqLwogICAgY29uc3RydWN0b3IoZG9tQXV0b21hdGlvbkNvbnRyb2xsZXIpIHsKICAgICAgdGhpcy5kb21BdXRvbWF0aW9uQ29udHJvbGxlcl8gPSBkb21BdXRvbWF0aW9uQ29udHJvbGxlcjsKICAgICAgdGhpcy5jb250cm9sVGFrZW5fID0gZmFsc2U7CiAgICAgIHRoaXMudGltZXJJZF8gPSAtMTsKICAgICAgdGhpcy5fYXN5bmNJbnZvY2F0aW9uSWQgPSAwOwogICAgfQoKICAgIC8qKgogICAgICogS2V5IGV2ZW50IHdpdGggZ2l2ZW4ga2V5IGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHN0YXRpYyBjcmVhdGVLZXlFdmVudChrZXkpIHsKICAgICAgcmV0dXJuIG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge2J1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGtleToga2V5fSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogUmVwb3J0cyB0ZXN0IGZhaWx1cmUuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgRmFpbHVyZSBkZXNjcmlwdGlvbi4KICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLmZhaWwgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICBpZiAodGhpcy5jb250cm9sVGFrZW5fKQogICAgICB0aGlzLnJlcG9ydEZhaWx1cmVfKG1lc3NhZ2UpOwogICAgZWxzZQogICAgICB0aHJvdyBtZXNzYWdlOwogIH07CgogIC8qKgogICAqIEVxdWFscyBhc3NlcnRpb24gdGVzdHMgdGhhdCBleHBlY3RlZCA9PT0gYWN0dWFsLgogICAqIEBwYXJhbSB7IU9iamVjdHxib29sZWFufSBleHBlY3RlZCBFeHBlY3RlZCBvYmplY3QuCiAgICogQHBhcmFtIHshT2JqZWN0fGJvb2xlYW59IGFjdHVhbCBBY3R1YWwgb2JqZWN0LgogICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRfbWVzc2FnZSBVc2VyIG1lc3NhZ2UgdG8gcHJpbnQgaWYgdGhlIHRlc3QgZmFpbHMuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5hc3NlcnRFcXVhbHMgPSBmdW5jdGlvbihleHBlY3RlZCwgYWN0dWFsLCBvcHRfbWVzc2FnZSkgewogICAgaWYgKGV4cGVjdGVkICE9PSBhY3R1YWwpIHsKICAgICAgbGV0IG1lc3NhZ2UgPSAnRXhwZWN0ZWQ6IFwnJyArIGV4cGVjdGVkICsgJ1wnLCBidXQgd2FzIFwnJyArIGFjdHVhbCArICdcJyc7CiAgICAgIGlmIChvcHRfbWVzc2FnZSkKICAgICAgICBtZXNzYWdlID0gb3B0X21lc3NhZ2UgKyAnKCcgKyBtZXNzYWdlICsgJyknOwogICAgICB0aGlzLmZhaWwobWVzc2FnZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVHJ1ZSBhc3NlcnRpb24gdGVzdHMgdGhhdCB2YWx1ZSA9PSB0cnVlLgogICAqIEBwYXJhbSB7IU9iamVjdH0gdmFsdWUgQWN0dWFsIG9iamVjdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0X21lc3NhZ2UgVXNlciBtZXNzYWdlIHRvIHByaW50IGlmIHRoZSB0ZXN0IGZhaWxzLgogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUuYXNzZXJ0VHJ1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBvcHRfbWVzc2FnZSkgewogICAgdGhpcy5hc3NlcnRFcXVhbHModHJ1ZSwgISF2YWx1ZSwgb3B0X21lc3NhZ2UpOwogIH07CgogIC8qKgogICAqIFRha2VzIGNvbnRyb2wgb3ZlciBleGVjdXRpb24uCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50YWtlQ29udHJvbCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jb250cm9sVGFrZW5fID0gdHJ1ZTsKICAgIC8vIFNldCB1cCBndWFyZCB0aW1lci4KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgdGhpcy50aW1lcklkXyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHNlbGYucmVwb3J0RmFpbHVyZV8oJ1RpbWVvdXQgZXhjZWVkZWQ6IDIwIHNlYycpOwogICAgfSwgMjAwMDApOwogIH07CgogIC8qKgogICAqIFJlbGVhc2VzIGNvbnRyb2wgb3ZlciBleGVjdXRpb24uCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5yZWxlYXNlQ29udHJvbCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMudGltZXJJZF8gIT09IC0xKSB7CiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWRfKTsKICAgICAgdGhpcy50aW1lcklkXyA9IC0xOwogICAgfQogICAgdGhpcy5jb250cm9sVGFrZW5fID0gZmFsc2U7CiAgICB0aGlzLnJlcG9ydE9rXygpOwogIH07CgogIC8qKgogICAqIEFzeW5jIHRlc3RzIHVzZSB0aGlzIG9uZSB0byByZXBvcnQgdGhhdCB0aGV5IGFyZSBjb21wbGV0ZWQuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5yZXBvcnRPa18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZG9tQXV0b21hdGlvbkNvbnRyb2xsZXJfLnNlbmQoJ1tPS10nKTsKICB9OwoKICAvKioKICAgKiBBc3luYyB0ZXN0cyB1c2UgdGhpcyBvbmUgdG8gcmVwb3J0IGZhaWx1cmVzLgogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUucmVwb3J0RmFpbHVyZV8gPSBmdW5jdGlvbihlcnJvcikgewogICAgaWYgKHRoaXMudGltZXJJZF8gIT09IC0xKSB7CiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWRfKTsKICAgICAgdGhpcy50aW1lcklkXyA9IC0xOwogICAgfQogICAgdGhpcy5kb21BdXRvbWF0aW9uQ29udHJvbGxlcl8uc2VuZCgnW0ZBSUxFRF0gJyArIGVycm9yKTsKICB9OwoKICAvKioKICAgKiBSdW4gc3BlY2lmaWVkIHRlc3Qgb24gYSBmcmVzaCBpbnN0YW5jZSBvZiB0aGUgdGVzdCBzdWl0ZS4KICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MgbWV0aG9kIG5hbWUgZm9sbG93ZWQgYnkgaXRzIHBhcmFtZXRlcnMuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5kaXNwYXRjaE9uVGVzdFN1aXRlID0gZnVuY3Rpb24oYXJncykgewogICAgY29uc3QgbWV0aG9kTmFtZSA9IGFyZ3Muc2hpZnQoKTsKICAgIHRyeSB7CiAgICAgIHRoaXNbbWV0aG9kTmFtZV0uYXBwbHkodGhpcywgYXJncyk7CiAgICAgIGlmICghdGhpcy5jb250cm9sVGFrZW5fKQogICAgICAgIHRoaXMucmVwb3J0T2tfKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRoaXMucmVwb3J0RmFpbHVyZV8oZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogV3JhcCBhbiBhc3luYyBtZXRob2Qgd2l0aCBUZXN0U3VpdGUue3Rha2VDb250cm9sKCksIHJlbGVhc2VDb250cm9sKCl9CiAgICogYW5kIGludm9rZSBUZXN0U3VpdGUucmVwb3J0T2tfIHVwb24gY29tcGxldGlvbi4KICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MgbWV0aG9kIG5hbWUgZm9sbG93ZWQgYnkgaXRzIHBhcmFtZXRlcnMuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS53YWl0Rm9yQXN5bmMgPSBmdW5jdGlvbih2YXJfYXJncykgewogICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgICBhcmdzLnB1c2godGhpcy5yZWxlYXNlQ29udHJvbC5iaW5kKHRoaXMpKTsKICAgIHRoaXMuZGlzcGF0Y2hPblRlc3RTdWl0ZShhcmdzKTsKICB9OwoKICAvKioKICAgKiBPdmVycmlkZXMgdGhlIG1ldGhvZCB3aXRoIHNwZWNpZmllZCBuYW1lIHVudGlsIGl0J3MgY2FsbGVkIGZpcnN0IHRpbWUuCiAgICogQHBhcmFtIHshT2JqZWN0fSByZWNlaXZlciBBbiBvYmplY3Qgd2hvc2UgbWV0aG9kIHRvIG92ZXJyaWRlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgdGhlIG1ldGhvZCB0byBvdmVycmlkZS4KICAgKiBAcGFyYW0geyFGdW5jdGlvbn0gb3ZlcnJpZGUgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlCiAgICogICAgIG92ZXJyaWRkZW4gbWV0aG9kIHJldHVybnMuCiAgICogQHBhcmFtIHs/Ym9vbGVhbn0gb3B0X3N0aWNreSBXaGV0aGVyIHJlc3RvcmUgb3JpZ2luYWwgbWV0aG9kIGFmdGVyIGZpcnN0IHJ1bgogICAqICAgICBvciBub3QuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5hZGRTbmlmZmVyID0gZnVuY3Rpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG92ZXJyaWRlLCBvcHRfc3RpY2t5KSB7CiAgICBjb25zdCBvcmlnID0gcmVjZWl2ZXJbbWV0aG9kTmFtZV07CiAgICBpZiAodHlwZW9mIG9yaWcgIT09ICdmdW5jdGlvbicpCiAgICAgIHRoaXMuZmFpbCgnQ2Fubm90IGZpbmQgbWV0aG9kIHRvIG92ZXJyaWRlOiAnICsgbWV0aG9kTmFtZSk7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIHJlY2VpdmVyW21ldGhvZE5hbWVdID0gZnVuY3Rpb24odmFyX2FyZ3MpIHsKICAgICAgbGV0IHJlc3VsdDsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQgPSBvcmlnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKCFvcHRfc3RpY2t5KQogICAgICAgICAgcmVjZWl2ZXJbbWV0aG9kTmFtZV0gPSBvcmlnOwogICAgICB9CiAgICAgIC8vIEluIGNhc2Ugb2YgZXhjZXB0aW9uIHRoZSBvdmVycmlkZSB3b24ndCBiZSBjYWxsZWQuCiAgICAgIHRyeSB7CiAgICAgICAgb3ZlcnJpZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRlc3QuZmFpbCgnRXhjZXB0aW9uIGluIG92ZXJyaWRlbiBtZXRob2QgXCcnICsgbWV0aG9kTmFtZSArICdcJzogJyArIGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIH07CgogIC8qKgogICAqIFdhaXRzIGZvciBjdXJyZW50IHRocm90dGxlciBpbnZvY2F0aW9ucywgaWYgYW55LgogICAqIEBwYXJhbSB7IUNvbW1vbi5UaHJvdHRsZXJ9IHRocm90dGxlcgogICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sKICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLndhaXRGb3JUaHJvdHRsZXIgPSBmdW5jdGlvbih0aHJvdHRsZXIsIGNhbGxiYWNrKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIGxldCBzY2hlZHVsZVNob3VsZEZhaWwgPSB0cnVlOwogICAgdGVzdC5hZGRTbmlmZmVyKHRocm90dGxlciwgJ3NjaGVkdWxlJywgb25TY2hlZHVsZSk7CgogICAgZnVuY3Rpb24gaGFzU29tZXRoaW5nU2NoZWR1bGVkKCkgewogICAgICByZXR1cm4gdGhyb3R0bGVyLl9pc1J1bm5pbmdQcm9jZXNzIHx8IHRocm90dGxlci5fcHJvY2VzczsKICAgIH0KCiAgICBmdW5jdGlvbiBjaGVja1N0YXRlKCkgewogICAgICBpZiAoIWhhc1NvbWV0aGluZ1NjaGVkdWxlZCgpKSB7CiAgICAgICAgc2NoZWR1bGVTaG91bGRGYWlsID0gZmFsc2U7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRlc3QuYWRkU25pZmZlcih0aHJvdHRsZXIsICdfcHJvY2Vzc0NvbXBsZXRlZEZvclRlc3RzJywgY2hlY2tTdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25TY2hlZHVsZSgpIHsKICAgICAgaWYgKHNjaGVkdWxlU2hvdWxkRmFpbCkKICAgICAgICB0ZXN0LmZhaWwoJ1VuZXhwZWN0ZWQgVGhyb3R0bGVyLnNjaGVkdWxlJyk7CiAgICB9CgogICAgY2hlY2tTdGF0ZSgpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYW5lbE5hbWUgTmFtZSBvZiB0aGUgcGFuZWwgdG8gc2hvdy4KICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLnNob3dQYW5lbCA9IGZ1bmN0aW9uKHBhbmVsTmFtZSkgewogICAgcmV0dXJuIFVJLmluc3BlY3RvclZpZXcuc2hvd1BhbmVsKHBhbmVsTmFtZSk7CiAgfTsKCiAgLy8gVUkgVGVzdHMKCiAgLyoqCiAgICogVGVzdHMgdGhhdCBzY3JpcHRzIHRhYiBjYW4gYmUgb3BlbiBhbmQgcG9wdWxhdGVkIHdpdGggaW5zcGVjdGVkIHNjcmlwdHMuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0U2hvd1NjcmlwdHNUYWIgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgdGhpcy5zaG93UGFuZWwoJ3NvdXJjZXMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3QgbWFpbiBwYWdlIHNjcmlwdC4KICAgICAgdGhpcy5fd2FpdFVudGlsU2NyaXB0c0FyZVBhcnNlZChbJ2RlYnVnZ2VyX3Rlc3RfcGFnZS5odG1sJ10sIGZ1bmN0aW9uKCkgewogICAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogICAgLy8gV2FpdCB1bnRpbCBhbGwgc2NyaXB0cyBhcmUgYWRkZWQgdG8gdGhlIGRlYnVnZ2VyLgogICAgdGhpcy50YWtlQ29udHJvbCgpOwogIH07CgogIC8qKgogICAqIFRlc3RzIHRoYXQgc2NyaXB0cyB0YWIgaXMgcG9wdWxhdGVkIHdpdGggaW5zcGVjdGVkIHNjcmlwdHMgZXZlbiBpZiBpdAogICAqIGhhZG4ndCBiZWVuIHNob3duIGJ5IHRoZSBtb21lbnQgaW5zcGVjdGVkIHBhZ2VkIHJlZnJlc2hlZC4KICAgKiBAc2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMjYzMTIKICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RTY3JpcHRzVGFiSXNQb3B1bGF0ZWRPbkluc3BlY3RlZFBhZ2VSZWZyZXNoID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIGNvbnN0IGRlYnVnZ2VyTW9kZWwgPSBTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOwogICAgZGVidWdnZXJNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5EZWJ1Z2dlck1vZGVsLkV2ZW50cy5HbG9iYWxPYmplY3RDbGVhcmVkLCB3YWl0VW50aWxTY3JpcHRJc1BhcnNlZCk7CgogICAgdGhpcy5zaG93UGFuZWwoJ2VsZW1lbnRzJykudGhlbihmdW5jdGlvbigpIHsKICAgICAgLy8gUmVsb2FkIGluc3BlY3RlZCBwYWdlLiBJdCB3aWxsIHJlc2V0IHRoZSBkZWJ1Z2dlciBhZ2VudC4KICAgICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7JywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwogICAgfSk7CgogICAgZnVuY3Rpb24gd2FpdFVudGlsU2NyaXB0SXNQYXJzZWQoKSB7CiAgICAgIGRlYnVnZ2VyTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuRGVidWdnZXJNb2RlbC5FdmVudHMuR2xvYmFsT2JqZWN0Q2xlYXJlZCwgd2FpdFVudGlsU2NyaXB0SXNQYXJzZWQpOwogICAgICB0ZXN0LnNob3dQYW5lbCgnc291cmNlcycpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgdGVzdC5fd2FpdFVudGlsU2NyaXB0c0FyZVBhcnNlZChbJ2RlYnVnZ2VyX3Rlc3RfcGFnZS5odG1sJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBXYWl0IHVudGlsIGFsbCBzY3JpcHRzIGFyZSBhZGRlZCB0byB0aGUgZGVidWdnZXIuCiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgLyoqCiAgICogVGVzdHMgdGhhdCBzY3JpcHRzIGxpc3QgY29udGFpbnMgY29udGVudCBzY3JpcHRzLgogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdENvbnRlbnRTY3JpcHRJc1ByZXNlbnQgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgdGhpcy5zaG93UGFuZWwoJ3NvdXJjZXMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICB0ZXN0Ll93YWl0VW50aWxTY3JpcHRzQXJlUGFyc2VkKFsncGFnZV93aXRoX2NvbnRlbnRfc2NyaXB0Lmh0bWwnLCAnc2ltcGxlX2NvbnRlbnRfc2NyaXB0LmpzJ10sIGZ1bmN0aW9uKCkgewogICAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICAvLyBXYWl0IHVudGlsIGFsbCBzY3JpcHRzIGFyZSBhZGRlZCB0byB0aGUgZGVidWdnZXIuCiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgLyoqCiAgICogVGVzdHMgdGhhdCBzY3JpcHRzIGFyZSBub3QgZHVwbGljYWVkIG9uIFNjcmlwdHMgdGFiIHN3aXRjaC4KICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3ROb1NjcmlwdER1cGxpY2F0ZXNPblBhbmVsU3dpdGNoID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKCiAgICBmdW5jdGlvbiBzd2l0Y2hUb0VsZW1lbnRzVGFiKCkgewogICAgICB0ZXN0LnNob3dQYW5lbCgnZWxlbWVudHMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgIHNldFRpbWVvdXQoc3dpdGNoVG9TY3JpcHRzVGFiLCAwKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3dpdGNoVG9TY3JpcHRzVGFiKCkgewogICAgICB0ZXN0LnNob3dQYW5lbCgnc291cmNlcycpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0VGltZW91dChjaGVja1NjcmlwdHNQYW5lbCwgMCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrU2NyaXB0c1BhbmVsKCkgewogICAgICB0ZXN0LmFzc2VydFRydWUodGVzdC5fc2NyaXB0c0FyZVBhcnNlZChbJ2RlYnVnZ2VyX3Rlc3RfcGFnZS5odG1sJ10pLCAnU29tZSBzY3JpcHRzIGFyZSBtaXNzaW5nLicpOwogICAgICBjaGVja05vRHVwbGljYXRlcygpOwogICAgICB0ZXN0LnJlbGVhc2VDb250cm9sKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2tOb0R1cGxpY2F0ZXMoKSB7CiAgICAgIGNvbnN0IHVpU291cmNlQ29kZXMgPSB0ZXN0Lm5vbkFub255bW91c1VJU291cmNlQ29kZXNfKCk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdWlTb3VyY2VDb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHVpU291cmNlQ29kZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHRlc3QuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICB1aVNvdXJjZUNvZGVzW2ldLnVybCgpICE9PSB1aVNvdXJjZUNvZGVzW2pdLnVybCgpLAogICAgICAgICAgICAgICdGb3VuZCBzY3JpcHQgZHVwbGljYXRlczogJyArIHRlc3QudWlTb3VyY2VDb2Rlc1RvU3RyaW5nXyh1aVNvdXJjZUNvZGVzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdGhpcy5zaG93UGFuZWwoJ3NvdXJjZXMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICB0ZXN0Ll93YWl0VW50aWxTY3JpcHRzQXJlUGFyc2VkKFsnZGVidWdnZXJfdGVzdF9wYWdlLmh0bWwnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgY2hlY2tOb0R1cGxpY2F0ZXMoKTsKICAgICAgICBzZXRUaW1lb3V0KHN3aXRjaFRvRWxlbWVudHNUYWIsIDApOwogICAgICB9KTsKICAgIH0pOwoKICAgIC8vIFdhaXQgdW50aWwgYWxsIHNjcmlwdHMgYXJlIGFkZGVkIHRvIHRoZSBkZWJ1Z2dlci4KICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICB9OwoKICAvLyBUZXN0cyB0aGF0IGRlYnVnZ2VyIHdvcmtzIGNvcnJlY3RseSBpZiBwYXVzZSBldmVudCBvY2N1cnMgd2hlbiBEZXZUb29scwogIC8vIGZyb250ZW5kIGlzIGJlaW5nIGxvYWRlZC4KICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RQYXVzZVdoZW5Mb2FkaW5nRGV2VG9vbHMgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IGRlYnVnZ2VyTW9kZWwgPSBTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOwogICAgaWYgKGRlYnVnZ2VyTW9kZWwuZGVidWdnZXJQYXVzZWREZXRhaWxzKQogICAgICByZXR1cm47CgogICAgdGhpcy5zaG93UGFuZWwoJ3NvdXJjZXMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAvLyBTY3JpcHQgZXhlY3V0aW9uIGNhbiBhbHJlYWR5IGJlIHBhdXNlZC4KCiAgICAgIHRoaXMuX3dhaXRGb3JTY3JpcHRQYXVzZSh0aGlzLnJlbGVhc2VDb250cm9sLmJpbmQodGhpcykpOwogICAgfS5iaW5kKHRoaXMpKTsKCiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgLy8gVGVzdHMgdGhhdCBwcmVzc2luZyAiUGF1c2UiIHdpbGwgcGF1c2Ugc2NyaXB0IGV4ZWN1dGlvbiBpZiB0aGUgc2NyaXB0CiAgLy8gaXMgYWxyZWFkeSBydW5uaW5nLgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdFBhdXNlV2hlblNjcmlwdElzUnVubmluZyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaG93UGFuZWwoJ3NvdXJjZXMnKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmV2YWx1YXRlSW5Db25zb2xlXygnc2V0VGltZW91dCgiaGFuZGxlQ2xpY2soKSIsIDApJywgZGlkRXZhbHVhdGVJbkNvbnNvbGUuYmluZCh0aGlzKSk7CiAgICB9LmJpbmQodGhpcykpOwoKICAgIGZ1bmN0aW9uIGRpZEV2YWx1YXRlSW5Db25zb2xlKHJlc3VsdFRleHQpIHsKICAgICAgdGhpcy5hc3NlcnRUcnVlKCFpc05hTihyZXN1bHRUZXh0KSwgJ0ZhaWxlZCB0byBnZXQgdGltZXIgaWQ6ICcgKyByZXN1bHRUZXh0KTsKICAgICAgLy8gV2FpdCBmb3Igc29tZSB0aW1lIHRvIG1ha2Ugc3VyZSB0aGF0IGluc3BlY3RlZCBwYWdlIGlzIHJ1bm5pbmcgdGhlCiAgICAgIC8vIGluZmluaXRlIGxvb3AuCiAgICAgIHNldFRpbWVvdXQodGVzdFNjcmlwdFBhdXNlLmJpbmQodGhpcyksIDMwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gdGVzdFNjcmlwdFBhdXNlKCkgewogICAgICAvLyBUaGUgc2NyaXB0IHNob3VsZCBiZSBpbiBpbmZpbml0ZSBsb29wLiBDbGljayAiUGF1c2UiIGJ1dHRvbiB0bwogICAgICAvLyBwYXVzZSBpdCBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdC4KICAgICAgVUkucGFuZWxzLnNvdXJjZXMuX3RvZ2dsZVBhdXNlKCk7CgogICAgICB0aGlzLl93YWl0Rm9yU2NyaXB0UGF1c2UodGhpcy5yZWxlYXNlQ29udHJvbC5iaW5kKHRoaXMpKTsKICAgIH0KCiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgLyoqCiAgICogVGVzdHMgbmV0d29yayBzaXplLgogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdE5ldHdvcmtTaXplID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKCiAgICBmdW5jdGlvbiBmaW5pc2hSZXF1ZXN0KHJlcXVlc3QsIGZpbmlzaFRpbWUpIHsKICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoMjUsIHJlcXVlc3QucmVzb3VyY2VTaXplLCAnSW5jb3JyZWN0IHRvdGFsIGRhdGEgbGVuZ3RoJyk7CiAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgIH0KCiAgICB0aGlzLmFkZFNuaWZmZXIoU0RLLk5ldHdvcmtEaXNwYXRjaGVyLnByb3RvdHlwZSwgJ19maW5pc2hOZXR3b3JrUmVxdWVzdCcsIGZpbmlzaFJlcXVlc3QpOwoKICAgIC8vIFJlbG9hZCBpbnNwZWN0ZWQgcGFnZSB0byBzbmlmZiBuZXR3b3JrIGV2ZW50cwogICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7JywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwoKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICB9OwoKICAvKioKICAgKiBUZXN0cyBuZXR3b3JrIHN5bmMgc2l6ZS4KICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3ROZXR3b3JrU3luY1NpemUgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwoKICAgIGZ1bmN0aW9uIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgZmluaXNoVGltZSkgewogICAgICB0ZXN0LmFzc2VydEVxdWFscygyNSwgcmVxdWVzdC5yZXNvdXJjZVNpemUsICdJbmNvcnJlY3QgdG90YWwgZGF0YSBsZW5ndGgnKTsKICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgfQoKICAgIHRoaXMuYWRkU25pZmZlcihTREsuTmV0d29ya0Rpc3BhdGNoZXIucHJvdG90eXBlLCAnX2ZpbmlzaE5ldHdvcmtSZXF1ZXN0JywgZmluaXNoUmVxdWVzdCk7CgogICAgLy8gU2VuZCBzeW5jaHJvbm91cyBYSFIgdG8gc25pZmYgbmV0d29yayBldmVudHMKICAgIHRlc3QuZXZhbHVhdGVJbkNvbnNvbGVfKAogICAgICAgICdsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IHhoci5vcGVuKCJHRVQiLCAiY2h1bmtlZCIsIGZhbHNlKTsgeGhyLnNlbmQobnVsbCk7JywgZnVuY3Rpb24oKSB7fSk7CgogICAgdGhpcy50YWtlQ29udHJvbCgpOwogIH07CgogIC8qKgogICAqIFRlc3RzIG5ldHdvcmsgcmF3IGhlYWRlcnMgdGV4dC4KICAgKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3ROZXR3b3JrUmF3SGVhZGVyc1RleHQgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwoKICAgIGZ1bmN0aW9uIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgZmluaXNoVGltZSkgewogICAgICBpZiAoIXJlcXVlc3QucmVzcG9uc2VIZWFkZXJzVGV4dCkKICAgICAgICB0ZXN0LmZhaWwoJ0ZhaWx1cmU6IHJlc291cmNlIGRvZXMgbm90IGhhdmUgcmVzcG9uc2UgaGVhZGVycyB0ZXh0Jyk7CiAgICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5yZXNwb25zZUhlYWRlcnNUZXh0LmluZGV4T2YoJ0RhdGU6Jyk7CiAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgMTEyLCByZXF1ZXN0LnJlc3BvbnNlSGVhZGVyc1RleHQuc3Vic3RyaW5nKGluZGV4KS5sZW5ndGgsICdJbmNvcnJlY3QgcmVzcG9uc2UgaGVhZGVycyB0ZXh0IGxlbmd0aCcpOwogICAgICB0ZXN0LnJlbGVhc2VDb250cm9sKCk7CiAgICB9CgogICAgdGhpcy5hZGRTbmlmZmVyKFNESy5OZXR3b3JrRGlzcGF0Y2hlci5wcm90b3R5cGUsICdfZmluaXNoTmV0d29ya1JlcXVlc3QnLCBmaW5pc2hSZXF1ZXN0KTsKCiAgICAvLyBSZWxvYWQgaW5zcGVjdGVkIHBhZ2UgdG8gc25pZmYgbmV0d29yayBldmVudHMKICAgIHRlc3QuZXZhbHVhdGVJbkNvbnNvbGVfKCd3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpOycsIGZ1bmN0aW9uKHJlc3VsdFRleHQpIHt9KTsKCiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgLyoqCiAgICogVGVzdHMgbmV0d29yayB0aW1pbmcuCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0TmV0d29ya1RpbWluZyA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGVzdCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmluaXNoUmVxdWVzdChyZXF1ZXN0LCBmaW5pc2hUaW1lKSB7CiAgICAgIC8vIFNldHRpbmcgcmVsYXhlZCBleHBlY3RhdGlvbnMgdG8gcmVkdWNlIGZsYWtpbmVzcy4KICAgICAgLy8gU2VydmVyIHNlbmRzIGhlYWRlcnMgYWZ0ZXIgMTAwbXMsIHRoZW4gc2VuZHMgZGF0YSBkdXJpbmcgYW5vdGhlciAxMDBtcy4KICAgICAgLy8gV2UgZXhwZWN0IHRoZXNlIHRpbWVzIHRvIGJlIG1lYXN1cmVkIGF0IGxlYXN0IGFzIDcwbXMuCiAgICAgIHRlc3QuYXNzZXJ0VHJ1ZSgKICAgICAgICAgIHJlcXVlc3QudGltaW5nLnJlY2VpdmVIZWFkZXJzRW5kIC0gcmVxdWVzdC50aW1pbmcuY29ubmVjdFN0YXJ0ID49IDcwLAogICAgICAgICAgJ1RpbWUgYmV0d2VlbiByZWNlaXZlSGVhZGVyc0VuZCBhbmQgY29ubmVjdFN0YXJ0IHNob3VsZCBiZSA+PTcwbXMsIGJ1dCB3YXMgJyArCiAgICAgICAgICAgICAgJ3JlY2VpdmVIZWFkZXJzRW5kPScgKyByZXF1ZXN0LnRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZCArICcsIGNvbm5lY3RTdGFydD0nICsKICAgICAgICAgICAgICByZXF1ZXN0LnRpbWluZy5jb25uZWN0U3RhcnQgKyAnLicpOwogICAgICB0ZXN0LmFzc2VydFRydWUoCiAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlUmVjZWl2ZWRUaW1lIC0gcmVxdWVzdC5zdGFydFRpbWUgPj0gMC4wNywKICAgICAgICAgICdUaW1lIGJldHdlZW4gcmVzcG9uc2VSZWNlaXZlZFRpbWUgYW5kIHN0YXJ0VGltZSBzaG91bGQgYmUgPj0wLjA3cywgYnV0IHdhcyAnICsKICAgICAgICAgICAgICAncmVzcG9uc2VSZWNlaXZlZFRpbWU9JyArIHJlcXVlc3QucmVzcG9uc2VSZWNlaXZlZFRpbWUgKyAnLCBzdGFydFRpbWU9JyArIHJlcXVlc3Quc3RhcnRUaW1lICsgJy4nKTsKICAgICAgdGVzdC5hc3NlcnRUcnVlKAogICAgICAgICAgcmVxdWVzdC5lbmRUaW1lIC0gcmVxdWVzdC5zdGFydFRpbWUgPj0gMC4xNCwKICAgICAgICAgICdUaW1lIGJldHdlZW4gZW5kVGltZSBhbmQgc3RhcnRUaW1lIHNob3VsZCBiZSA+PTAuMTRzLCBidXQgd2FzICcgKwogICAgICAgICAgICAgICdlbmR0aW1lPScgKyByZXF1ZXN0LmVuZFRpbWUgKyAnLCBzdGFydFRpbWU9JyArIHJlcXVlc3Quc3RhcnRUaW1lICsgJy4nKTsKCiAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgIH0KCiAgICB0aGlzLmFkZFNuaWZmZXIoU0RLLk5ldHdvcmtEaXNwYXRjaGVyLnByb3RvdHlwZSwgJ19maW5pc2hOZXR3b3JrUmVxdWVzdCcsIGZpbmlzaFJlcXVlc3QpOwoKICAgIC8vIFJlbG9hZCBpbnNwZWN0ZWQgcGFnZSB0byBzbmlmZiBuZXR3b3JrIGV2ZW50cwogICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7JywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwoKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RQdXNoVGltZXMgPSBmdW5jdGlvbih1cmwpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgbGV0IHBlbmRpbmdSZXF1ZXN0Q291bnQgPSAyOwoKICAgIGZ1bmN0aW9uIGZpbmlzaFJlcXVlc3QocmVxdWVzdCwgZmluaXNoVGltZSkgewogICAgICB0ZXN0LmFzc2VydFRydWUoCiAgICAgICAgICB0eXBlb2YgcmVxdWVzdC50aW1pbmcucHVzaFN0YXJ0ID09PSAnbnVtYmVyJyAmJiByZXF1ZXN0LnRpbWluZy5wdXNoU3RhcnQgPiAwLAogICAgICAgICAgYHB1c2hTdGFydCBpcyBpbnZhbGlkOiAke3JlcXVlc3QudGltaW5nLnB1c2hTdGFydH1gKTsKICAgICAgdGVzdC5hc3NlcnRUcnVlKHR5cGVvZiByZXF1ZXN0LnRpbWluZy5wdXNoRW5kID09PSAnbnVtYmVyJywgYHB1c2hFbmQgaXMgaW52YWxpZDogJHtyZXF1ZXN0LnRpbWluZy5wdXNoRW5kfWApOwogICAgICB0ZXN0LmFzc2VydFRydWUocmVxdWVzdC50aW1pbmcucHVzaFN0YXJ0IDwgcmVxdWVzdC5zdGFydFRpbWUsICdwdXNoU3RhcnQgc2hvdWxkIGJlIGJlZm9yZSBzdGFydFRpbWUnKTsKICAgICAgaWYgKHJlcXVlc3QudXJsKCkuZW5kc1dpdGgoJz9wdXNoVXNlTnVsbEVuZFRpbWUnKSkgewogICAgICAgIHRlc3QuYXNzZXJ0VHJ1ZShyZXF1ZXN0LnRpbWluZy5wdXNoRW5kID09PSAwLCBgcHVzaEVuZCBzaG91bGQgYmUgMCBidXQgaXMgJHtyZXF1ZXN0LnRpbWluZy5wdXNoRW5kfWApOwogICAgICB9IGVsc2UgewogICAgICAgIHRlc3QuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgcmVxdWVzdC50aW1pbmcucHVzaFN0YXJ0IDwgcmVxdWVzdC50aW1pbmcucHVzaEVuZCwKICAgICAgICAgICAgYHB1c2hTdGFydCBzaG91bGQgYmUgYmVmb3JlIHB1c2hFbmQgKCR7cmVxdWVzdC50aW1pbmcucHVzaFN0YXJ0fSA+PSAke3JlcXVlc3QudGltaW5nLnB1c2hFbmR9KWApOwogICAgICAgIC8vIFRoZSBiZWxvdyBhc3NlcnRpb24gaXMganVzdCBkdWUgdG8gdGhlIHdheSB3ZSBnZW5lcmF0ZSB0aW1lcyBpbiB0aGUgbW9jaCBVUkxSZXF1ZXN0Sm9iIGFuZCBpcyBub3QgZ2VuZXJhbGx5IGFuIGludmFyaWFudC4KICAgICAgICB0ZXN0LmFzc2VydFRydWUocmVxdWVzdC50aW1pbmcucHVzaEVuZCA8IHJlcXVlc3QuZW5kVGltZSwgJ3B1c2hFbmQgc2hvdWxkIGJlIGJlZm9yZSBlbmRUaW1lJyk7CiAgICAgICAgdGVzdC5hc3NlcnRUcnVlKHJlcXVlc3Quc3RhcnRUaW1lIDwgcmVxdWVzdC50aW1pbmcucHVzaEVuZCwgJ3B1c2hFbmQgc2hvdWxkIGJlIGFmdGVyIHN0YXJ0VGltZScpOwogICAgICB9CiAgICAgIGlmICghLS1wZW5kaW5nUmVxdWVzdENvdW50KQogICAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgIH0KCiAgICB0aGlzLmFkZFNuaWZmZXIoU0RLLk5ldHdvcmtEaXNwYXRjaGVyLnByb3RvdHlwZSwgJ19maW5pc2hOZXR3b3JrUmVxdWVzdCcsIGZpbmlzaFJlcXVlc3QsIHRydWUpOwoKICAgIHRlc3QuZXZhbHVhdGVJbkNvbnNvbGVfKCdhZGRJbWFnZShcJycgKyB1cmwgKyAnXCcpJywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwogICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ2FkZEltYWdlKFwnJyArIHVybCArICc/cHVzaFVzZU51bGxFbmRUaW1lXCcpJywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwogICAgdGhpcy50YWtlQ29udHJvbCgpOwogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdENvbnNvbGVPbk5hdmlnYXRlQmFjayA9IGZ1bmN0aW9uKCkgewoKICAgIGZ1bmN0aW9uIGZpbHRlcmVkTWVzc2FnZXMoKSB7CiAgICAgIHJldHVybiBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCkuZmlsdGVyKGEgPT4gYS5zb3VyY2UgIT09IFNESy5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlLlZpb2xhdGlvbik7CiAgICB9CgogICAgaWYgKGZpbHRlcmVkTWVzc2FnZXMoKS5sZW5ndGggPT09IDEpCiAgICAgIGZpcnN0Q29uc29sZU1lc3NhZ2VSZWNlaXZlZC5jYWxsKHRoaXMsIG51bGwpOwogICAgZWxzZQogICAgICBTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLCBmaXJzdENvbnNvbGVNZXNzYWdlUmVjZWl2ZWQsIHRoaXMpOwoKCiAgICBmdW5jdGlvbiBmaXJzdENvbnNvbGVNZXNzYWdlUmVjZWl2ZWQoZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmRhdGEuc291cmNlID09PSBTREsuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVNvdXJjZS5WaW9sYXRpb24pCiAgICAgICAgcmV0dXJuOwogICAgICBTREsuY29uc29sZU1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLCBmaXJzdENvbnNvbGVNZXNzYWdlUmVjZWl2ZWQsIHRoaXMpOwogICAgICB0aGlzLmV2YWx1YXRlSW5Db25zb2xlXygnY2xpY2tMaW5rKCk7JywgZGlkQ2xpY2tMaW5rLmJpbmQodGhpcykpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpZENsaWNrTGluaygpIHsKICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbmV3IG1lc3NhZ2VzKGNvbW1hbmQgaXMgbm90IGEgbWVzc2FnZSkuCiAgICAgIHRoaXMuYXNzZXJ0RXF1YWxzKDMsIGZpbHRlcmVkTWVzc2FnZXMoKS5sZW5ndGgpOwogICAgICB0aGlzLmV2YWx1YXRlSW5Db25zb2xlXygnaGlzdG9yeS5iYWNrKCk7JywgZGlkTmF2aWdhdGVCYWNrLmJpbmQodGhpcykpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpZE5hdmlnYXRlQmFjaygpIHsKICAgICAgLy8gTWFrZSBzdXJlIG5hdmlnYXRpb24gY29tcGxldGVkIGFuZCBwb3NzaWJsZSBjb25zb2xlIG1lc3NhZ2VzIHdlcmUgcHVzaGVkLgogICAgICB0aGlzLmV2YWx1YXRlSW5Db25zb2xlXygndm9pZCAwOycsIGRpZENvbXBsZXRlTmF2aWdhdGlvbi5iaW5kKHRoaXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaWRDb21wbGV0ZU5hdmlnYXRpb24oKSB7CiAgICAgIHRoaXMuYXNzZXJ0RXF1YWxzKDcsIGZpbHRlcmVkTWVzc2FnZXMoKS5sZW5ndGgpOwogICAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgICB9CgogICAgdGhpcy50YWtlQ29udHJvbCgpOwogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdFNoYXJlZFdvcmtlciA9IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gZGlkRXZhbHVhdGVJbkNvbnNvbGUocmVzdWx0VGV4dCkgewogICAgICB0aGlzLmFzc2VydEVxdWFscygnMjAxMScsIHJlc3VsdFRleHQpOwogICAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgICB9CiAgICB0aGlzLmV2YWx1YXRlSW5Db25zb2xlXygnZ2xvYmFsVmFyJywgZGlkRXZhbHVhdGVJbkNvbnNvbGUuYmluZCh0aGlzKSk7CiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0UGF1c2VJblNoYXJlZFdvcmtlckluaXRpYWxpemF0aW9uMSA9IGZ1bmN0aW9uKCkgewogICAgLy8gTWFrZSBzdXJlIHRoZSB3b3JrZXIgaXMgbG9hZGVkLgogICAgdGhpcy50YWtlQ29udHJvbCgpOwogICAgdGhpcy5fd2FpdEZvclRhcmdldHMoMiwgY2FsbGJhY2suYmluZCh0aGlzKSk7CgogICAgZnVuY3Rpb24gY2FsbGJhY2soKSB7CiAgICAgIFByb3RvY29sLkluc3BlY3RvckJhY2tlbmQuZGVwcmVjYXRlZFJ1bkFmdGVyUGVuZGluZ0Rpc3BhdGNoZXModGhpcy5yZWxlYXNlQ29udHJvbC5iaW5kKHRoaXMpKTsKICAgIH0KICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RQYXVzZUluU2hhcmVkV29ya2VySW5pdGlhbGl6YXRpb24yID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgICB0aGlzLl93YWl0Rm9yVGFyZ2V0cygyLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKCiAgICBmdW5jdGlvbiBjYWxsYmFjaygpIHsKICAgICAgY29uc3QgZGVidWdnZXJNb2RlbCA9IFNESy50YXJnZXRNYW5hZ2VyLm1vZGVscyhTREsuRGVidWdnZXJNb2RlbClbMF07CiAgICAgIGlmIChkZWJ1Z2dlck1vZGVsLmlzUGF1c2VkKCkpIHsKICAgICAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3dhaXRGb3JTY3JpcHRQYXVzZSh0aGlzLnJlbGVhc2VDb250cm9sLmJpbmQodGhpcykpOwogICAgfQogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUuZW5hYmxlVG91Y2hFbXVsYXRpb24gPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IGRldmljZU1vZGVNb2RlbCA9IG5ldyBFbXVsYXRpb24uRGV2aWNlTW9kZU1vZGVsKGZ1bmN0aW9uKCkge30pOwogICAgZGV2aWNlTW9kZU1vZGVsLl90YXJnZXQgPSBTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCk7CiAgICBkZXZpY2VNb2RlTW9kZWwuX2FwcGx5VG91Y2godHJ1ZSwgdHJ1ZSk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS53YWl0Rm9yRGVidWdnZXJQYXVzZWQgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IGRlYnVnZ2VyTW9kZWwgPSBTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkubW9kZWwoU0RLLkRlYnVnZ2VyTW9kZWwpOwogICAgaWYgKGRlYnVnZ2VyTW9kZWwuZGVidWdnZXJQYXVzZWREZXRhaWxzKQogICAgICByZXR1cm47CgogICAgdGhpcy50YWtlQ29udHJvbCgpOwogICAgdGhpcy5fd2FpdEZvclNjcmlwdFBhdXNlKHRoaXMucmVsZWFzZUNvbnRyb2wuYmluZCh0aGlzKSk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5zd2l0Y2hUb1BhbmVsID0gZnVuY3Rpb24ocGFuZWxOYW1lKSB7CiAgICB0aGlzLnNob3dQYW5lbChwYW5lbE5hbWUpLnRoZW4odGhpcy5yZWxlYXNlQ29udHJvbC5iaW5kKHRoaXMpKTsKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICB9OwoKICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGNyYnVnLmNvbS8zNzAwMzUuCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0RGV2aWNlTWV0cmljc092ZXJyaWRlcyA9IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gZHVtcFBhZ2VNZXRyaWNzKCkgewogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICB7d2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLCBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCwgZGV2aWNlU2NhbGVGYWN0b3I6IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfSk7CiAgICB9CgogICAgY29uc3QgdGVzdCA9IHRoaXM7CgogICAgYXN5bmMgZnVuY3Rpb24gdGVzdE92ZXJyaWRlcyhwYXJhbXMsIG1ldHJpY3MsIGNhbGxiYWNrKSB7CiAgICAgIGF3YWl0IFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5lbXVsYXRpb25BZ2VudCgpLmludm9rZV9zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUocGFyYW1zKTsKICAgICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJygnICsgZHVtcFBhZ2VNZXRyaWNzLnRvU3RyaW5nKCkgKyAnKSgpJywgY2hlY2tNZXRyaWNzKTsKCiAgICAgIGZ1bmN0aW9uIGNoZWNrTWV0cmljcyhjb25zb2xlUmVzdWx0KSB7CiAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoCiAgICAgICAgICAgICciJyArIEpTT04uc3RyaW5naWZ5KG1ldHJpY3MpICsgJyInLCBjb25zb2xlUmVzdWx0LCAnV3JvbmcgbWV0cmljcyBmb3IgcGFyYW1zOiAnICsgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAxKCkgewogICAgICB0ZXN0T3ZlcnJpZGVzKAogICAgICAgICAge3dpZHRoOiAxMjAwLCBoZWlnaHQ6IDEwMDAsIGRldmljZVNjYWxlRmFjdG9yOiAxLCBtb2JpbGU6IGZhbHNlLCBmaXRXaW5kb3c6IHRydWV9LAogICAgICAgICAge3dpZHRoOiAxMjAwLCBoZWlnaHQ6IDEwMDAsIGRldmljZVNjYWxlRmFjdG9yOiAxfSwgc3RlcDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXAyKCkgewogICAgICB0ZXN0T3ZlcnJpZGVzKAogICAgICAgICAge3dpZHRoOiAxMjAwLCBoZWlnaHQ6IDEwMDAsIGRldmljZVNjYWxlRmFjdG9yOiAxLCBtb2JpbGU6IGZhbHNlLCBmaXRXaW5kb3c6IGZhbHNlfSwKICAgICAgICAgIHt3aWR0aDogMTIwMCwgaGVpZ2h0OiAxMDAwLCBkZXZpY2VTY2FsZUZhY3RvcjogMX0sIHN0ZXAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwMygpIHsKICAgICAgdGVzdE92ZXJyaWRlcygKICAgICAgICAgIHt3aWR0aDogMTIwMCwgaGVpZ2h0OiAxMDAwLCBkZXZpY2VTY2FsZUZhY3RvcjogMywgbW9iaWxlOiBmYWxzZSwgZml0V2luZG93OiB0cnVlfSwKICAgICAgICAgIHt3aWR0aDogMTIwMCwgaGVpZ2h0OiAxMDAwLCBkZXZpY2VTY2FsZUZhY3RvcjogM30sIHN0ZXA0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwNCgpIHsKICAgICAgdGVzdE92ZXJyaWRlcygKICAgICAgICAgIHt3aWR0aDogMTIwMCwgaGVpZ2h0OiAxMDAwLCBkZXZpY2VTY2FsZUZhY3RvcjogMywgbW9iaWxlOiBmYWxzZSwgZml0V2luZG93OiBmYWxzZX0sCiAgICAgICAgICB7d2lkdGg6IDEyMDAsIGhlaWdodDogMTAwMCwgZGV2aWNlU2NhbGVGYWN0b3I6IDN9LCBmaW5pc2gpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmlzaCgpIHsKICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgfQoKICAgIHRlc3QudGFrZUNvbnRyb2woKTsKICAgIHN0ZXAxKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0RGlzcGF0Y2hLZXlFdmVudFNob3dzQXV0b0ZpbGwgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgbGV0IHJlY2VpdmVkUmVhZHkgPSBmYWxzZTsKCiAgICBmdW5jdGlvbiBzaWduYWxUb1Nob3dBdXRvZmlsbCgpIHsKICAgICAgU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlucHV0QWdlbnQoKS5pbnZva2VfZGlzcGF0Y2hLZXlFdmVudCgKICAgICAgICAgIHt0eXBlOiAncmF3S2V5RG93bicsIGtleTogJ0Rvd24nLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IDQwLCBuYXRpdmVWaXJ0dWFsS2V5Q29kZTogNDB9KTsKICAgICAgU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlucHV0QWdlbnQoKS5pbnZva2VfZGlzcGF0Y2hLZXlFdmVudCgKICAgICAgICAgIHt0eXBlOiAna2V5VXAnLCBrZXk6ICdEb3duJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiA0MCwgbmF0aXZlVmlydHVhbEtleUNvZGU6IDQwfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0VG9wQXV0b0ZpbGwoKSB7CiAgICAgIFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5pbnB1dEFnZW50KCkuaW52b2tlX2Rpc3BhdGNoS2V5RXZlbnQoCiAgICAgICAgICB7dHlwZTogJ3Jhd0tleURvd24nLCBrZXk6ICdEb3duJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiA0MCwgbmF0aXZlVmlydHVhbEtleUNvZGU6IDQwfSk7CiAgICAgIFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5pbnB1dEFnZW50KCkuaW52b2tlX2Rpc3BhdGNoS2V5RXZlbnQoCiAgICAgICAgICB7dHlwZTogJ2tleVVwJywga2V5OiAnRG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogNDAsIG5hdGl2ZVZpcnR1YWxLZXlDb2RlOiA0MH0pOwogICAgICBTREsudGFyZ2V0TWFuYWdlci5tYWluVGFyZ2V0KCkuaW5wdXRBZ2VudCgpLmludm9rZV9kaXNwYXRjaEtleUV2ZW50KAogICAgICAgICAge3R5cGU6ICdyYXdLZXlEb3duJywga2V5OiAnRW50ZXInLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IDEzLCBuYXRpdmVWaXJ0dWFsS2V5Q29kZTogMTN9KTsKICAgICAgU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlucHV0QWdlbnQoKS5pbnZva2VfZGlzcGF0Y2hLZXlFdmVudCgKICAgICAgICAgIHt0eXBlOiAna2V5VXAnLCBrZXk6ICdFbnRlcicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogMTMsIG5hdGl2ZVZpcnR1YWxLZXlDb2RlOiAxM30pOwoKICAgICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYW1lIikudmFsdWUnLCBvblJlc3VsdE9mSW5wdXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVzdWx0T2ZJbnB1dCh2YWx1ZSkgewogICAgICAvLyBDb25zb2xlIGFkZHMgIiIgYXJvdW5kIHRoZSByZXNwb25zZS4KICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJyJBYmJmIicsIHZhbHVlKTsKICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uQ29uc29sZU1lc3NhZ2UoZXZlbnQpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGEubWVzc2FnZVRleHQ7CiAgICAgIGlmIChtZXNzYWdlID09PSAncmVhZHknICYmICFyZWNlaXZlZFJlYWR5KSB7CiAgICAgICAgcmVjZWl2ZWRSZWFkeSA9IHRydWU7CiAgICAgICAgc2lnbmFsVG9TaG93QXV0b2ZpbGwoKTsKICAgICAgfQogICAgICAvLyBUaGlzIGxvZyBjb21lcyBmcm9tIHRoZSBicm93c2VyIHVuaXR0ZXN0IGNvZGUuCiAgICAgIGlmIChtZXNzYWdlID09PSAnZGlkU2hvd1N1Z2dlc3Rpb25zJykKICAgICAgICBzZWxlY3RUb3BBdXRvRmlsbCgpOwogICAgfQoKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKCiAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHJlYWR5IGNvbnNvbGUgbWVzc2FnYWdlIHRvIGJlIGFscmVhZHkgcmVjZWl2ZWQgYnV0IG5vdCBoYW5kbGVkCiAgICAvLyBvciByZWNlaXZlZCBsYXRlci4gVGhpcyBlbnN1cmVzIHdlIGNhbiBjYXRjaCBib3RoIGNhc2VzLgogICAgU0RLLmNvbnNvbGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLk1lc3NhZ2VBZGRlZCwgb25Db25zb2xlTWVzc2FnZSwgdGhpcyk7CgogICAgY29uc3QgbWVzc2FnZXMgPSBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCk7CiAgICBpZiAobWVzc2FnZXMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHRleHQgPSBtZXNzYWdlc1swXS5tZXNzYWdlVGV4dDsKICAgICAgdGhpcy5hc3NlcnRFcXVhbHMoJ3JlYWR5JywgdGV4dCk7CiAgICAgIHNpZ25hbFRvU2hvd0F1dG9maWxsKCk7CiAgICB9CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0RGlzcGF0Y2hLZXlFdmVudERvZXNOb3RDcmFzaCA9IGZ1bmN0aW9uKCkgewogICAgU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlucHV0QWdlbnQoKS5pbnZva2VfZGlzcGF0Y2hLZXlFdmVudCgKICAgICAgICB7dHlwZTogJ3Jhd0tleURvd24nLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IDB4MjMsIGtleTogJ0VuZCd9KTsKICAgIFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5pbnB1dEFnZW50KCkuaW52b2tlX2Rpc3BhdGNoS2V5RXZlbnQoCiAgICAgICAge3R5cGU6ICdrZXlVcCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogMHgyMywga2V5OiAnRW5kJ30pOwogIH07CgogIC8vIFNpbXBsZSBzYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIG5ldHdvcmsgdGhyb3R0bGluZyBpcyB3aXJlZCB1cAogIC8vIFNlZSBjcmJ1Zy5jb20vNzQ3NzI0CiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0T2ZmbGluZU5ldHdvcmtDb25kaXRpb25zID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIFNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKFNESy5OZXR3b3JrTWFuYWdlci5PZmZsaW5lQ29uZGl0aW9ucyk7CgogICAgZnVuY3Rpb24gZmluaXNoUmVxdWVzdChyZXF1ZXN0KSB7CiAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgJ25ldDo6RVJSX0lOVEVSTkVUX0RJU0NPTk5FQ1RFRCcsIHJlcXVlc3QubG9jYWxpemVkRmFpbERlc2NyaXB0aW9uLCAnUmVxdWVzdCBzaG91bGQgaGF2ZSBmYWlsZWQnKTsKICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgfQoKICAgIHRoaXMuYWRkU25pZmZlcihTREsuTmV0d29ya0Rpc3BhdGNoZXIucHJvdG90eXBlLCAnX2ZpbmlzaE5ldHdvcmtSZXF1ZXN0JywgZmluaXNoUmVxdWVzdCk7CgogICAgdGVzdC50YWtlQ29udHJvbCgpOwogICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8oJ3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7JywgZnVuY3Rpb24ocmVzdWx0VGV4dCkge30pOwogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdEVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGVzdCA9IHRoaXM7CgogICAgZnVuY3Rpb24gdGVzdFByZXNldChwcmVzZXQsIG1lc3NhZ2VzLCBuZXh0KSB7CiAgICAgIGZ1bmN0aW9uIG9uQ29uc29sZU1lc3NhZ2UoZXZlbnQpIHsKICAgICAgICBjb25zdCBpbmRleCA9IG1lc3NhZ2VzLmluZGV4T2YoZXZlbnQuZGF0YS5tZXNzYWdlVGV4dCk7CiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgICAgdGVzdC5mYWlsKCdVbmV4cGVjdGVkIG1lc3NhZ2U6ICcgKyBldmVudC5kYXRhLm1lc3NhZ2VUZXh0KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG1lc3NhZ2VzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgaWYgKCFtZXNzYWdlcy5sZW5ndGgpIHsKICAgICAgICAgIFNESy5jb25zb2xlTW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5NZXNzYWdlQWRkZWQsIG9uQ29uc29sZU1lc3NhZ2UsIHRoaXMpOwogICAgICAgICAgbmV4dCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgU0RLLmNvbnNvbGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLk1lc3NhZ2VBZGRlZCwgb25Db25zb2xlTWVzc2FnZSwgdGhpcyk7CiAgICAgIFNESy5tdWx0aXRhcmdldE5ldHdvcmtNYW5hZ2VyLnNldE5ldHdvcmtDb25kaXRpb25zKHByZXNldCk7CiAgICB9CgogICAgdGVzdC50YWtlQ29udHJvbCgpOwogICAgc3RlcDEoKTsKCiAgICBmdW5jdGlvbiBzdGVwMSgpIHsKICAgICAgdGVzdFByZXNldCgKICAgICAgICAgIE1vYmlsZVRocm90dGxpbmcubmV0d29ya1ByZXNldHNbMl0sCiAgICAgICAgICBbCiAgICAgICAgICAgICdvZmZsaW5lIGV2ZW50OiBvbmxpbmUgPSBmYWxzZScsICdjb25uZWN0aW9uIGNoYW5nZSBldmVudDogdHlwZSA9IG5vbmU7IGRvd25saW5rTWF4ID0gMDsgZWZmZWN0aXZlVHlwZSA9IDRnJwogICAgICAgICAgXSwKICAgICAgICAgIHN0ZXAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwMigpIHsKICAgICAgdGVzdFByZXNldCgKICAgICAgICAgIE1vYmlsZVRocm90dGxpbmcubmV0d29ya1ByZXNldHNbMV0sCiAgICAgICAgICBbCiAgICAgICAgICAgICdvbmxpbmUgZXZlbnQ6IG9ubGluZSA9IHRydWUnLAogICAgICAgICAgICAnY29ubmVjdGlvbiBjaGFuZ2UgZXZlbnQ6IHR5cGUgPSBjZWxsdWxhcjsgZG93bmxpbmtNYXggPSAwLjM5MDYyNTsgZWZmZWN0aXZlVHlwZSA9IDJnJwogICAgICAgICAgXSwKICAgICAgICAgIHN0ZXAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwMygpIHsKICAgICAgdGVzdFByZXNldCgKICAgICAgICAgIE1vYmlsZVRocm90dGxpbmcubmV0d29ya1ByZXNldHNbMF0sCiAgICAgICAgICBbJ2Nvbm5lY3Rpb24gY2hhbmdlIGV2ZW50OiB0eXBlID0gY2VsbHVsYXI7IGRvd25saW5rTWF4ID0gMS40NDAwMDAwMDAwMDAwMDAyOyBlZmZlY3RpdmVUeXBlID0gM2cnXSwKICAgICAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2wuYmluZCh0ZXN0KSk7CiAgICB9CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0U2NyZWVuc2hvdFJlY29yZGluZyA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgdGVzdCA9IHRoaXM7CgogICAgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbnNJblBhZ2UoY2FsbGJhY2spIHsKICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2xlZnQ6IDBweDsgdG9wOiAwcHg7IHdpZHRoOiAxMDBweDsgaGVpZ2h0OiAxMDBweDsgcG9zaXRpb246IGFic29sdXRlOycpOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgICAgIGZ1bmN0aW9uIGZyYW1lKCkgewogICAgICAgIGNvbnN0IGNvbG9yID0gWzAsIDAsIDBdOwogICAgICAgIGNvbG9yW2NvdW50ICUgM10gPSAyNTU7CiAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2IoJyArIGNvbG9yLmpvaW4oJywnKSArICcpJzsKICAgICAgICBpZiAoKytjb3VudCA+IDEwKQogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOwogICAgICB9CiAgICB9CgogICAgY29uc3QgY2FwdHVyZUZpbG1TdHJpcFNldHRpbmcgPSBDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygndGltZWxpbmVDYXB0dXJlRmlsbVN0cmlwJywgZmFsc2UpOwogICAgY2FwdHVyZUZpbG1TdHJpcFNldHRpbmcuc2V0KHRydWUpOwogICAgdGVzdC5ldmFsdWF0ZUluQ29uc29sZV8ocGVyZm9ybUFjdGlvbnNJblBhZ2UudG9TdHJpbmcoKSwgZnVuY3Rpb24oKSB7fSk7CiAgICB0ZXN0Lmludm9rZUFzeW5jV2l0aFRpbWVsaW5lXygncGVyZm9ybUFjdGlvbnNJblBhZ2UnLCBvblRpbWVsaW5lRG9uZSk7CgogICAgZnVuY3Rpb24gb25UaW1lbGluZURvbmUoKSB7CiAgICAgIGNhcHR1cmVGaWxtU3RyaXBTZXR0aW5nLnNldChmYWxzZSk7CiAgICAgIGNvbnN0IGZpbG1TdHJpcE1vZGVsID0gVUkucGFuZWxzLnRpbWVsaW5lLl9wZXJmb3JtYW5jZU1vZGVsLmZpbG1TdHJpcE1vZGVsKCk7CiAgICAgIGNvbnN0IGZyYW1lcyA9IGZpbG1TdHJpcE1vZGVsLmZyYW1lcygpOwogICAgICB0ZXN0LmFzc2VydFRydWUoZnJhbWVzLmxlbmd0aCA+IDQgJiYgdHlwZW9mIGZyYW1lcy5sZW5ndGggPT09ICdudW1iZXInKTsKICAgICAgbG9hZEZyYW1lSW1hZ2VzKGZyYW1lcyk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZEZyYW1lSW1hZ2VzKGZyYW1lcykgewogICAgICBjb25zdCByZWFkeUltYWdlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGZyYW1lIG9mIGZyYW1lcykKICAgICAgICBmcmFtZS5pbWFnZURhdGFQcm9taXNlKCkudGhlbihvbkdvdEltYWdlRGF0YSk7CgogICAgICBmdW5jdGlvbiBvbkdvdEltYWdlRGF0YShkYXRhKSB7CiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICAgICAgICB0ZXN0LmFzc2VydFRydWUoISFkYXRhLCAnTm8gaW1hZ2UgZGF0YSBmb3IgZnJhbWUnKTsKICAgICAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTsKICAgICAgICBpbWFnZS5zcmMgPSAnZGF0YTppbWFnZS9qcGc7YmFzZTY0LCcgKyBkYXRhOwogICAgICB9CgogICAgICBmdW5jdGlvbiBvbkxvYWQoZXZlbnQpIHsKICAgICAgICByZWFkeUltYWdlcy5wdXNoKGV2ZW50LnRhcmdldCk7CiAgICAgICAgaWYgKHJlYWR5SW1hZ2VzLmxlbmd0aCA9PT0gZnJhbWVzLmxlbmd0aCkKICAgICAgICAgIHZhbGlkYXRlSW1hZ2VzQW5kQ29tcGxldGVUZXN0KHJlYWR5SW1hZ2VzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2VzQW5kQ29tcGxldGVUZXN0KGltYWdlcykgewogICAgICBsZXQgcmVkQ291bnQgPSAwOwogICAgICBsZXQgZ3JlZW5Db3VudCA9IDA7CiAgICAgIGxldCBibHVlQ291bnQgPSAwOwoKICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykgewogICAgICAgIHRlc3QuYXNzZXJ0VHJ1ZShpbWFnZS5uYXR1cmFsV2lkdGggPiAxMCk7CiAgICAgICAgdGVzdC5hc3NlcnRUcnVlKGltYWdlLm5hdHVyYWxIZWlnaHQgPiAxMCk7CiAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2UubmF0dXJhbFdpZHRoOwogICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0OwogICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwogICAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpOwogICAgICAgIGNvbnN0IGNvbG9yID0gQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChkYXRhLmRhdGEsICcsJyk7CiAgICAgICAgaWYgKGRhdGEuZGF0YVswXSA+IDIwMCkKICAgICAgICAgIHJlZENvdW50Kys7CiAgICAgICAgZWxzZSBpZiAoZGF0YS5kYXRhWzFdID4gMjAwKQogICAgICAgICAgZ3JlZW5Db3VudCsrOwogICAgICAgIGVsc2UgaWYgKGRhdGEuZGF0YVsyXSA+IDIwMCkKICAgICAgICAgIGJsdWVDb3VudCsrOwogICAgICAgIGVsc2UKICAgICAgICAgIHRlc3QuZmFpbCgnVW5leHBlY3RlZCBjb2xvcjogJyArIGNvbG9yKTsKICAgICAgfQogICAgICB0ZXN0LmFzc2VydFRydWUocmVkQ291bnQgJiYgZ3JlZW5Db3VudCAmJiBibHVlQ291bnQsICdDb2xvciBzYW5pdHkgY2hlY2sgZmFpbGVkJyk7CiAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgIH0KCiAgICB0ZXN0LnRha2VDb250cm9sKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0U2V0dGluZ3MgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwoKICAgIGNyZWF0ZVNldHRpbmdzKCk7CiAgICB0ZXN0LnRha2VDb250cm9sKCk7CiAgICBzZXRUaW1lb3V0KHJlc2V0LCAwKTsKCiAgICBmdW5jdGlvbiBjcmVhdGVTZXR0aW5ncygpIHsKICAgICAgY29uc3QgbG9jYWxTZXR0aW5nID0gQ29tbW9uLnNldHRpbmdzLmNyZWF0ZUxvY2FsU2V0dGluZygnbG9jYWwnLCB1bmRlZmluZWQpOwogICAgICBsb2NhbFNldHRpbmcuc2V0KHtzOiAnbG9jYWwnLCBuOiAxfSk7CiAgICAgIGNvbnN0IGdsb2JhbFNldHRpbmcgPSBDb21tb24uc2V0dGluZ3MuY3JlYXRlU2V0dGluZygnZ2xvYmFsJywgdW5kZWZpbmVkKTsKICAgICAgZ2xvYmFsU2V0dGluZy5zZXQoe3M6ICdnbG9iYWwnLCBuOiAyfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIFJ1bnRpbWUuZXhwZXJpbWVudHMuY2xlYXJGb3JUZXN0KCk7CiAgICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5nZXRQcmVmZXJlbmNlcyhnb3RQcmVmZXJlbmNlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ290UHJlZmVyZW5jZXMocHJlZnMpIHsKICAgICAgTWFpbi5NYWluLl9pbnN0YW5jZUZvclRlc3QuX2NyZWF0ZVNldHRpbmdzKHByZWZzKTsKCiAgICAgIGNvbnN0IGxvY2FsU2V0dGluZyA9IENvbW1vbi5zZXR0aW5ncy5jcmVhdGVMb2NhbFNldHRpbmcoJ2xvY2FsJywgdW5kZWZpbmVkKTsKICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJ29iamVjdCcsIHR5cGVvZiBsb2NhbFNldHRpbmcuZ2V0KCkpOwogICAgICB0ZXN0LmFzc2VydEVxdWFscygnbG9jYWwnLCBsb2NhbFNldHRpbmcuZ2V0KCkucyk7CiAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKDEsIGxvY2FsU2V0dGluZy5nZXQoKS5uKTsKICAgICAgY29uc3QgZ2xvYmFsU2V0dGluZyA9IENvbW1vbi5zZXR0aW5ncy5jcmVhdGVTZXR0aW5nKCdnbG9iYWwnLCB1bmRlZmluZWQpOwogICAgICB0ZXN0LmFzc2VydEVxdWFscygnb2JqZWN0JywgdHlwZW9mIGdsb2JhbFNldHRpbmcuZ2V0KCkpOwogICAgICB0ZXN0LmFzc2VydEVxdWFscygnZ2xvYmFsJywgZ2xvYmFsU2V0dGluZy5nZXQoKS5zKTsKICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoMiwgZ2xvYmFsU2V0dGluZy5nZXQoKS5uKTsKICAgICAgdGVzdC5yZWxlYXNlQ29udHJvbCgpOwogICAgfQogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdFdpbmRvd0luaXRpYWxpemVkT25OYXZpZ2F0ZUJhY2sgPSBmdW5jdGlvbigpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgdGVzdC50YWtlQ29udHJvbCgpOwogICAgY29uc3QgbWVzc2FnZXMgPSBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCk7CiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxKQogICAgICBjaGVja01lc3NhZ2VzKCk7CiAgICBlbHNlCiAgICAgIFNESy5jb25zb2xlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihTREsuQ29uc29sZU1vZGVsLkV2ZW50cy5NZXNzYWdlQWRkZWQsIGNoZWNrTWVzc2FnZXMuYmluZCh0aGlzKSwgdGhpcyk7CgogICAgZnVuY3Rpb24gY2hlY2tNZXNzYWdlcygpIHsKICAgICAgY29uc3QgbWVzc2FnZXMgPSBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCk7CiAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VzLmxlbmd0aCk7CiAgICAgIHRlc3QuYXNzZXJ0VHJ1ZShtZXNzYWdlc1swXS5tZXNzYWdlVGV4dC5pbmRleE9mKCdVbmNhdWdodCcpID09PSAtMSk7CiAgICAgIHRlc3QucmVsZWFzZUNvbnRyb2woKTsKICAgIH0KICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RDb25zb2xlQ29udGV4dE5hbWVzID0gZnVuY3Rpb24oKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIHRlc3QudGFrZUNvbnRyb2woKTsKICAgIHRoaXMuc2hvd1BhbmVsKCdjb25zb2xlJykudGhlbigoKSA9PiB0aGlzLl93YWl0Rm9yRXhlY3V0aW9uQ29udGV4dHMoMiwgb25FeGVjdXRpb25Db250ZXh0cy5iaW5kKHRoaXMpKSk7CgogICAgZnVuY3Rpb24gb25FeGVjdXRpb25Db250ZXh0cygpIHsKICAgICAgY29uc3QgY29uc29sZVZpZXcgPSBDb25zb2xlLkNvbnNvbGVWaWV3Lmluc3RhbmNlKCk7CiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc29sZVZpZXcuX2NvbnNvbGVDb250ZXh0U2VsZWN0b3I7CiAgICAgIGNvbnN0IHZhbHVlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2VsZWN0b3IuX2l0ZW1zKQogICAgICAgIHZhbHVlcy5wdXNoKHNlbGVjdG9yLnRpdGxlRm9yKGl0ZW0pKTsKICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJ3RvcCcsIHZhbHVlc1swXSk7CiAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKCdTaW1wbGUgY29udGVudCBzY3JpcHQnLCB2YWx1ZXNbMV0pOwogICAgICB0ZXN0LnJlbGVhc2VDb250cm9sKCk7CiAgICB9CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0UmF3SGVhZGVyc1dpdGhIU1RTID0gZnVuY3Rpb24odXJsKSB7CiAgICBjb25zdCB0ZXN0ID0gdGhpczsKICAgIHRlc3QudGFrZUNvbnRyb2woKTsKICAgIFNESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoCiAgICAgICAgU0RLLk5ldHdvcmtNYW5hZ2VyLCBTREsuTmV0d29ya01hbmFnZXIuRXZlbnRzLlJlc3BvbnNlUmVjZWl2ZWQsIG9uUmVzcG9uc2VSZWNlaXZlZCk7CgogICAgdGhpcy5ldmFsdWF0ZUluQ29uc29sZV8oYAogICAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgIGltZy5zcmMgPSAiJHt1cmx9IjsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWcpOwogICAgYCwgKCkgPT4ge30pOwoKICAgIGxldCBjb3VudCA9IDA7CiAgICBmdW5jdGlvbiBvblJlc3BvbnNlUmVjZWl2ZWQoZXZlbnQpIHsKICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3QgPSBldmVudC5kYXRhOwogICAgICBpZiAoIW5ldHdvcmtSZXF1ZXN0LnVybCgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSkKICAgICAgICByZXR1cm47CiAgICAgIHN3aXRjaCAoKytjb3VudCkgewogICAgICAgIGNhc2UgMTogIC8vIE9yaWdpbmFsIHJlZGlyZWN0CiAgICAgICAgICB0ZXN0LmFzc2VydEVxdWFscygzMDEsIG5ldHdvcmtSZXF1ZXN0LnN0YXR1c0NvZGUpOwogICAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJ01vdmVkIFBlcm1hbmVudGx5JywgbmV0d29ya1JlcXVlc3Quc3RhdHVzVGV4dCk7CiAgICAgICAgICB0ZXN0LmFzc2VydFRydWUodXJsLmVuZHNXaXRoKG5ldHdvcmtSZXF1ZXN0LnJlc3BvbnNlSGVhZGVyVmFsdWUoJ0xvY2F0aW9uJykpKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6ICAvLyBIU1RTIGludGVybmFsIHJlZGlyZWN0CiAgICAgICAgICB0ZXN0LmFzc2VydFRydWUobmV0d29ya1JlcXVlc3QudXJsKCkuc3RhcnRzV2l0aCgnaHR0cDovLycpKTsKICAgICAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKHVuZGVmaW5lZCwgbmV0d29ya1JlcXVlc3QucmVxdWVzdEhlYWRlcnNUZXh0KCkpOwogICAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoMzA3LCBuZXR3b3JrUmVxdWVzdC5zdGF0dXNDb2RlKTsKICAgICAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKCdJbnRlcm5hbCBSZWRpcmVjdCcsIG5ldHdvcmtSZXF1ZXN0LnN0YXR1c1RleHQpOwogICAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJ0hTVFMnLCBuZXR3b3JrUmVxdWVzdC5yZXNwb25zZUhlYWRlclZhbHVlKCdOb24tQXV0aG9yaXRhdGl2ZS1SZWFzb24nKSk7CiAgICAgICAgICB0ZXN0LmFzc2VydFRydWUobmV0d29ya1JlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZSgnTG9jYXRpb24nKS5zdGFydHNXaXRoKCdodHRwczovLycpKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDM6ICAvLyBGaW5hbCByZXNwb25zZQogICAgICAgICAgdGVzdC5hc3NlcnRUcnVlKG5ldHdvcmtSZXF1ZXN0LnVybCgpLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpOwogICAgICAgICAgdGVzdC5hc3NlcnRUcnVlKG5ldHdvcmtSZXF1ZXN0LnJlcXVlc3RIZWFkZXJWYWx1ZSgnUmVmZXJlcicpLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8xMjcuMC4wLjEnKSk7CiAgICAgICAgICB0ZXN0LmFzc2VydEVxdWFscygyMDAsIG5ldHdvcmtSZXF1ZXN0LnN0YXR1c0NvZGUpOwogICAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoJ09LJywgbmV0d29ya1JlcXVlc3Quc3RhdHVzVGV4dCk7CiAgICAgICAgICB0ZXN0LmFzc2VydEVxdWFscygnMTMyJywgbmV0d29ya1JlcXVlc3QucmVzcG9uc2VIZWFkZXJWYWx1ZSgnQ29udGVudC1MZW5ndGgnKSk7CiAgICAgICAgICB0ZXN0LnJlbGVhc2VDb250cm9sKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RET01XYXJuaW5ncyA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgbWVzc2FnZXMgPSBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCk7CiAgICB0aGlzLmFzc2VydEVxdWFscygxLCBtZXNzYWdlcy5sZW5ndGgpOwogICAgY29uc3QgZXhwZWN0ZWRQcmVmaXggPSAnW0RPTV0gRm91bmQgMiBlbGVtZW50cyB3aXRoIG5vbi11bmlxdWUgaWQgI2R1cDonOwogICAgdGhpcy5hc3NlcnRUcnVlKG1lc3NhZ2VzWzBdLm1lc3NhZ2VUZXh0LnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKTsKICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLndhaXRGb3JUZXN0UmVzdWx0c0luQ29uc29sZSA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgbWVzc2FnZXMgPSBTREsuY29uc29sZU1vZGVsLm1lc3NhZ2VzKCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbnN0IHRleHQgPSBtZXNzYWdlc1tpXS5tZXNzYWdlVGV4dDsKICAgICAgaWYgKHRleHQgPT09ICdQQVNTJykKICAgICAgICByZXR1cm47CiAgICAgIGVsc2UgaWYgKC9eRkFJTC8udGVzdCh0ZXh0KSkKICAgICAgICB0aGlzLmZhaWwodGV4dCk7ICAvLyBUaGlzIHdpbGwgdGhyb3cuCiAgICB9CiAgICAvLyBOZWl0aGVyIFBBU1Mgbm9yIEZBSUwsIHNvIHdhaXQgZm9yIG1vcmUgbWVzc2FnZXMuCiAgICBmdW5jdGlvbiBvbkNvbnNvbGVNZXNzYWdlKGV2ZW50KSB7CiAgICAgIGNvbnN0IHRleHQgPSBldmVudC5kYXRhLm1lc3NhZ2VUZXh0OwogICAgICBpZiAodGV4dCA9PT0gJ1BBU1MnKQogICAgICAgIHRoaXMucmVsZWFzZUNvbnRyb2woKTsKICAgICAgZWxzZSBpZiAoL15GQUlMLy50ZXN0KHRleHQpKQogICAgICAgIHRoaXMuZmFpbCh0ZXh0KTsKICAgIH0KCiAgICBTREsuY29uc29sZU1vZGVsLmFkZEV2ZW50TGlzdGVuZXIoU0RLLkNvbnNvbGVNb2RlbC5FdmVudHMuTWVzc2FnZUFkZGVkLCBvbkNvbnNvbGVNZXNzYWdlLCB0aGlzKTsKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLl9vdmVycmlkZU1ldGhvZCA9IGZ1bmN0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBvdmVycmlkZSkgewogICAgY29uc3Qgb3JpZ2luYWwgPSByZWNlaXZlclttZXRob2ROYW1lXTsKICAgIGlmICh0eXBlb2Ygb3JpZ2luYWwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdGhpcy5mYWlsKGBUZXN0U3VpdGUuX292ZXJyaWRlTWV0aG9kOiAkW21ldGhvZE5hbWVdIGlzIG5vdCBhIGZ1bmN0aW9uYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJlY2VpdmVyW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCB2YWx1ZTsKICAgICAgdHJ5IHsKICAgICAgICB2YWx1ZSA9IG9yaWdpbmFsLmFwcGx5KHJlY2VpdmVyLCBhcmd1bWVudHMpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHJlY2VpdmVyW21ldGhvZE5hbWVdID0gb3JpZ2luYWw7CiAgICAgIH0KICAgICAgb3ZlcnJpZGUuYXBwbHkob3JpZ2luYWwsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5zdGFydFRpbWVsaW5lID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgdGhpcy5zaG93UGFuZWwoJ3RpbWVsaW5lJykudGhlbihmdW5jdGlvbigpIHsKICAgICAgY29uc3QgdGltZWxpbmUgPSBVSS5wYW5lbHMudGltZWxpbmU7CiAgICAgIHRlc3QuX292ZXJyaWRlTWV0aG9kKHRpbWVsaW5lLCAnX3JlY29yZGluZ1N0YXJ0ZWQnLCBjYWxsYmFjayk7CiAgICAgIHRpbWVsaW5lLl90b2dnbGVSZWNvcmRpbmcoKTsKICAgIH0pOwogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUuc3RvcFRpbWVsaW5lID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIGNvbnN0IHRpbWVsaW5lID0gVUkucGFuZWxzLnRpbWVsaW5lOwogICAgdGhpcy5fb3ZlcnJpZGVNZXRob2QodGltZWxpbmUsICdsb2FkaW5nQ29tcGxldGUnLCBjYWxsYmFjayk7CiAgICB0aW1lbGluZS5fdG9nZ2xlUmVjb3JkaW5nKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5pbnZva2VQYWdlRnVuY3Rpb25Bc3luYyA9IGZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgb3B0X2FyZ3MsIGNhbGxiYWNrX2lzX2Fsd2F5c19sYXN0KSB7CiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07CiAgICBjb25zdCBkb25lTWVzc2FnZSA9IGBET05FOiAke2Z1bmN0aW9uTmFtZX0uJHsrK3RoaXMuX2FzeW5jSW52b2NhdGlvbklkfWA7CiAgICBjb25zdCBhcmdzU3RyaW5nID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPwogICAgICAgICcnIDoKICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEsIC0xKS5tYXAoYXJnID0+IEpTT04uc3RyaW5naWZ5KGFyZykpLmpvaW4oJywnKSArICcsJzsKICAgIHRoaXMuZXZhbHVhdGVJbkNvbnNvbGVfKAogICAgICAgIGAke2Z1bmN0aW9uTmFtZX0oJHthcmdzU3RyaW5nfSBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJyR7ZG9uZU1lc3NhZ2V9Jyk7IH0pO2AsIGZ1bmN0aW9uKCkge30pOwogICAgU0RLLmNvbnNvbGVNb2RlbC5hZGRFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLk1lc3NhZ2VBZGRlZCwgb25Db25zb2xlTWVzc2FnZSk7CgogICAgZnVuY3Rpb24gb25Db25zb2xlTWVzc2FnZShldmVudCkgewogICAgICBjb25zdCB0ZXh0ID0gZXZlbnQuZGF0YS5tZXNzYWdlVGV4dDsKICAgICAgaWYgKHRleHQgPT09IGRvbmVNZXNzYWdlKSB7CiAgICAgICAgU0RLLmNvbnNvbGVNb2RlbC5yZW1vdmVFdmVudExpc3RlbmVyKFNESy5Db25zb2xlTW9kZWwuRXZlbnRzLk1lc3NhZ2VBZGRlZCwgb25Db25zb2xlTWVzc2FnZSk7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgfQogICAgfQogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUuaW52b2tlQXN5bmNXaXRoVGltZWxpbmVfID0gZnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBjYWxsYmFjaykgewogICAgY29uc3QgdGVzdCA9IHRoaXM7CgogICAgdGhpcy5zdGFydFRpbWVsaW5lKG9uUmVjb3JkaW5nU3RhcnRlZCk7CgogICAgZnVuY3Rpb24gb25SZWNvcmRpbmdTdGFydGVkKCkgewogICAgICB0ZXN0Lmludm9rZVBhZ2VGdW5jdGlvbkFzeW5jKGZ1bmN0aW9uTmFtZSwgcGFnZUFjdGlvbnNEb25lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYWdlQWN0aW9uc0RvbmUoKSB7CiAgICAgIHRlc3Quc3RvcFRpbWVsaW5lKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLmVuYWJsZUV4cGVyaW1lbnQgPSBmdW5jdGlvbihuYW1lKSB7CiAgICBSdW50aW1lLmV4cGVyaW1lbnRzLmVuYWJsZUZvclRlc3QobmFtZSk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5jaGVja0lucHV0RXZlbnRzUHJlc2VudCA9IGZ1bmN0aW9uKCkgewogICAgY29uc3QgZXhwZWN0ZWRFdmVudHMgPSBuZXcgU2V0KGFyZ3VtZW50cyk7CiAgICBjb25zdCBtb2RlbCA9IFVJLnBhbmVscy50aW1lbGluZS5fcGVyZm9ybWFuY2VNb2RlbC50aW1lbGluZU1vZGVsKCk7CiAgICBjb25zdCBhc3luY0V2ZW50cyA9IG1vZGVsLnZpcnR1YWxUaHJlYWRzKCkuZmluZCh0aHJlYWQgPT4gdGhyZWFkLmlzTWFpbkZyYW1lKS5hc3luY0V2ZW50c0J5R3JvdXA7CiAgICBjb25zdCBpbnB1dCA9IGFzeW5jRXZlbnRzLmdldChUaW1lbGluZU1vZGVsLlRpbWVsaW5lTW9kZWwuQXN5bmNFdmVudEdyb3VwLmlucHV0KSB8fCBbXTsKICAgIGNvbnN0IHByZWZpeCA9ICdJbnB1dExhdGVuY3k6Oic7CiAgICBmb3IgKGNvbnN0IGUgb2YgaW5wdXQpIHsKICAgICAgaWYgKCFlLm5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKQogICAgICAgIGNvbnRpbnVlOwogICAgICBpZiAoZS5zdGVwcy5sZW5ndGggPCAyKQogICAgICAgIGNvbnRpbnVlOwogICAgICBpZiAoZS5uYW1lLnN0YXJ0c1dpdGgocHJlZml4ICsgJ01vdXNlJykgJiYKICAgICAgICAgIHR5cGVvZiBUaW1lbGluZU1vZGVsLlRpbWVsaW5lRGF0YS5mb3JFdmVudChlLnN0ZXBzWzBdKS50aW1lV2FpdGluZ0Zvck1haW5UaHJlYWQgIT09ICdudW1iZXInKQogICAgICAgIHRocm93IGBNaXNzaW5nIHRpbWVXYWl0aW5nRm9yTWFpblRocmVhZCBvbiAke2UubmFtZX1gOwogICAgICBleHBlY3RlZEV2ZW50cy5kZWxldGUoZS5uYW1lLnN1YnN0cihwcmVmaXgubGVuZ3RoKSk7CiAgICB9CiAgICBpZiAoZXhwZWN0ZWRFdmVudHMuc2l6ZSkKICAgICAgdGhyb3cgJ1NvbWUgZXhwZWN0ZWQgZXZlbnRzIGFyZSBub3QgZm91bmQ6ICcgKyBBcnJheS5mcm9tKGV4cGVjdGVkRXZlbnRzLmtleXMoKSkuam9pbignLCcpOwogIH07CgogIFRlc3RTdWl0ZS5wcm90b3R5cGUudGVzdEluc3BlY3RlZEVsZW1lbnRJcyA9IGFzeW5jIGZ1bmN0aW9uKG5vZGVOYW1lKSB7CiAgICB0aGlzLnRha2VDb250cm9sKCk7CiAgICBhd2FpdCBzZWxmLnJ1bnRpbWUubG9hZE1vZHVsZVByb21pc2UoJ2VsZW1lbnRzJyk7CiAgICBpZiAoIUVsZW1lbnRzLkVsZW1lbnRzUGFuZWwuX2ZpcnN0SW5zcGVjdEVsZW1lbnROb2RlTmFtZUZvclRlc3QpCiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4gdGhpcy5hZGRTbmlmZmVyKEVsZW1lbnRzLkVsZW1lbnRzUGFuZWwsICdfZmlyc3RJbnNwZWN0RWxlbWVudENvbXBsZXRlZEZvclRlc3QnLCBmKSk7CiAgICB0aGlzLmFzc2VydEVxdWFscyhub2RlTmFtZSwgRWxlbWVudHMuRWxlbWVudHNQYW5lbC5fZmlyc3RJbnNwZWN0RWxlbWVudE5vZGVOYW1lRm9yVGVzdCk7CiAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0RGlzcG9zZUVtcHR5QnJvd3NlckNvbnRleHQgPSBhc3luYyBmdW5jdGlvbih1cmwpIHsKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICAgIGNvbnN0IHRhcmdldEFnZW50ID0gU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLnRhcmdldEFnZW50KCk7CiAgICBjb25zdCB7YnJvd3NlckNvbnRleHRJZH0gPSBhd2FpdCB0YXJnZXRBZ2VudC5pbnZva2VfY3JlYXRlQnJvd3NlckNvbnRleHQoKTsKICAgIGNvbnN0IHJlc3BvbnNlMSA9IGF3YWl0IHRhcmdldEFnZW50Lmludm9rZV9nZXRCcm93c2VyQ29udGV4dHMoKTsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlMS5icm93c2VyQ29udGV4dElkcy5sZW5ndGgsIDEpOwogICAgYXdhaXQgdGFyZ2V0QWdlbnQuaW52b2tlX2Rpc3Bvc2VCcm93c2VyQ29udGV4dCh7YnJvd3NlckNvbnRleHRJZH0pOwogICAgY29uc3QgcmVzcG9uc2UyID0gYXdhaXQgdGFyZ2V0QWdlbnQuaW52b2tlX2dldEJyb3dzZXJDb250ZXh0cygpOwogICAgdGhpcy5hc3NlcnRFcXVhbHMocmVzcG9uc2UyLmJyb3dzZXJDb250ZXh0SWRzLmxlbmd0aCwgMCk7CiAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS50ZXN0Q3JlYXRlQnJvd3NlckNvbnRleHQgPSBhc3luYyBmdW5jdGlvbih1cmwpIHsKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICAgIGNvbnN0IGJyb3dzZXJDb250ZXh0SWRzID0gW107CiAgICBjb25zdCB0YXJnZXRBZ2VudCA9IFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS50YXJnZXRBZ2VudCgpOwoKICAgIGNvbnN0IHRhcmdldDEgPSBhd2FpdCBjcmVhdGVJc29sYXRlZFRhcmdldCh1cmwpOwogICAgY29uc3QgdGFyZ2V0MiA9IGF3YWl0IGNyZWF0ZUlzb2xhdGVkVGFyZ2V0KHVybCk7CgogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0YXJnZXRBZ2VudC5pbnZva2VfZ2V0QnJvd3NlckNvbnRleHRzKCk7CiAgICB0aGlzLmFzc2VydEVxdWFscyhyZXNwb25zZS5icm93c2VyQ29udGV4dElkcy5sZW5ndGgsIDIpOwogICAgdGhpcy5hc3NlcnRUcnVlKHJlc3BvbnNlLmJyb3dzZXJDb250ZXh0SWRzLmluY2x1ZGVzKGJyb3dzZXJDb250ZXh0SWRzWzBdKSk7CiAgICB0aGlzLmFzc2VydFRydWUocmVzcG9uc2UuYnJvd3NlckNvbnRleHRJZHMuaW5jbHVkZXMoYnJvd3NlckNvbnRleHRJZHNbMV0pKTsKCiAgICBhd2FpdCBldmFsQ29kZSh0YXJnZXQxLCAnbG9jYWxTdG9yYWdlLnNldEl0ZW0oInBhZ2UxIiwgInBhZ2UxIiknKTsKICAgIGF3YWl0IGV2YWxDb2RlKHRhcmdldDIsICdsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicGFnZTIiLCAicGFnZTIiKScpOwoKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGF3YWl0IGV2YWxDb2RlKHRhcmdldDEsICdsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGFnZTEiKScpLCAncGFnZTEnKTsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGF3YWl0IGV2YWxDb2RlKHRhcmdldDEsICdsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGFnZTIiKScpLCBudWxsKTsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGF3YWl0IGV2YWxDb2RlKHRhcmdldDIsICdsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGFnZTEiKScpLCBudWxsKTsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGF3YWl0IGV2YWxDb2RlKHRhcmdldDIsICdsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGFnZTIiKScpLCAncGFnZTInKTsKCiAgICBjb25zdCByZW1vdmVkVGFyZ2V0cyA9IFtdOwogICAgU0RLLnRhcmdldE1hbmFnZXIub2JzZXJ2ZVRhcmdldHMoe3RhcmdldEFkZGVkOiAoKSA9PiB7fSwgdGFyZ2V0UmVtb3ZlZDogdGFyZ2V0ID0+IHJlbW92ZWRUYXJnZXRzLnB1c2godGFyZ2V0KX0pOwogICAgYXdhaXQgUHJvbWlzZS5hbGwoW2Rpc3Bvc2VCcm93c2VyQ29udGV4dChicm93c2VyQ29udGV4dElkc1swXSksIGRpc3Bvc2VCcm93c2VyQ29udGV4dChicm93c2VyQ29udGV4dElkc1sxXSldKTsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKHJlbW92ZWRUYXJnZXRzLmxlbmd0aCwgMik7CiAgICB0aGlzLmFzc2VydEVxdWFscyhyZW1vdmVkVGFyZ2V0cy5pbmRleE9mKHRhcmdldDEpICE9PSAtMSwgdHJ1ZSk7CiAgICB0aGlzLmFzc2VydEVxdWFscyhyZW1vdmVkVGFyZ2V0cy5pbmRleE9mKHRhcmdldDIpICE9PSAtMSwgdHJ1ZSk7CgogICAgdGhpcy5yZWxlYXNlQ29udHJvbCgpOwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybAogICAgICogQHJldHVybiB7IVByb21pc2U8IVNESy5UYXJnZXQ+fQogICAgICovCiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVJc29sYXRlZFRhcmdldCh1cmwpIHsKICAgICAgY29uc3Qge2Jyb3dzZXJDb250ZXh0SWR9ID0gYXdhaXQgdGFyZ2V0QWdlbnQuaW52b2tlX2NyZWF0ZUJyb3dzZXJDb250ZXh0KCk7CiAgICAgIGJyb3dzZXJDb250ZXh0SWRzLnB1c2goYnJvd3NlckNvbnRleHRJZCk7CgogICAgICBjb25zdCB7dGFyZ2V0SWR9ID0gYXdhaXQgdGFyZ2V0QWdlbnQuaW52b2tlX2NyZWF0ZVRhcmdldCh7dXJsOiAnYWJvdXQ6YmxhbmsnLCBicm93c2VyQ29udGV4dElkfSk7CiAgICAgIGF3YWl0IHRhcmdldEFnZW50Lmludm9rZV9hdHRhY2hUb1RhcmdldCh7dGFyZ2V0SWR9KTsKCiAgICAgIGNvbnN0IHRhcmdldCA9IFNESy50YXJnZXRNYW5hZ2VyLnRhcmdldHMoKS5maW5kKHRhcmdldCA9PiB0YXJnZXQuaWQoKSA9PT0gdGFyZ2V0SWQpOwogICAgICBjb25zdCBwYWdlQWdlbnQgPSB0YXJnZXQucGFnZUFnZW50KCk7CiAgICAgIGF3YWl0IHBhZ2VBZ2VudC5pbnZva2VfZW5hYmxlKCk7CiAgICAgIGF3YWl0IHBhZ2VBZ2VudC5pbnZva2VfbmF2aWdhdGUoe3VybH0pOwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VCcm93c2VyQ29udGV4dChicm93c2VyQ29udGV4dElkKSB7CiAgICAgIGNvbnN0IHRhcmdldEFnZW50ID0gU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLnRhcmdldEFnZW50KCk7CiAgICAgIGF3YWl0IHRhcmdldEFnZW50Lmludm9rZV9kaXNwb3NlQnJvd3NlckNvbnRleHQoe2Jyb3dzZXJDb250ZXh0SWR9KTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBldmFsQ29kZSh0YXJnZXQsIGNvZGUpIHsKICAgICAgcmV0dXJuIChhd2FpdCB0YXJnZXQucnVudGltZUFnZW50KCkuaW52b2tlX2V2YWx1YXRlKHtleHByZXNzaW9uOiBjb2RlfSkpLnJlc3VsdC52YWx1ZTsKICAgIH0KICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RJbnB1dERpc3BhdGNoRXZlbnRzVG9PT1BJRiA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgdGhpcy50YWtlQ29udHJvbCgpOwoKICAgIGF3YWl0IG5ldyBQcm9taXNlKGNhbGxiYWNrID0+IHRoaXMuX3dhaXRGb3JUYXJnZXRzKDIsIGNhbGxiYWNrKSk7CgogICAgYXN5bmMgZnVuY3Rpb24gdGFrZUxvZ3ModGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvZGUgPSBgCiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHdpbmRvdy5sb2dzLmpvaW4oJyAnKTsKICAgICAgICAgIHdpbmRvdy5sb2dzID0gW107CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pKCkKICAgICAgYDsKICAgICAgcmV0dXJuIChhd2FpdCB0YXJnZXQucnVudGltZUFnZW50KCkuaW52b2tlX2V2YWx1YXRlKHtleHByZXNzaW9uOiBjb2RlfSkpLnJlc3VsdC52YWx1ZTsKICAgIH0KCiAgICBsZXQgcGFyZW50RnJhbWVPdXRwdXQ7CiAgICBsZXQgY2hpbGRGcmFtZU91dHB1dDsKCiAgICBjb25zdCBpbnB1dEFnZW50ID0gU0RLLnRhcmdldE1hbmFnZXIubWFpblRhcmdldCgpLmlucHV0QWdlbnQoKTsKICAgIGNvbnN0IHJ1bnRpbWVBZ2VudCA9IFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5ydW50aW1lQWdlbnQoKTsKICAgIGF3YWl0IGlucHV0QWdlbnQuaW52b2tlX2Rpc3BhdGNoTW91c2VFdmVudCh7dHlwZTogJ21vdXNlUHJlc3NlZCcsIGJ1dHRvbjogJ2xlZnQnLCBjbGlja0NvdW50OiAxLCB4OiAxMCwgeTogMTB9KTsKICAgIGF3YWl0IGlucHV0QWdlbnQuaW52b2tlX2Rpc3BhdGNoTW91c2VFdmVudCh7dHlwZTogJ21vdXNlTW92ZWQnLCBidXR0b246ICdsZWZ0JywgY2xpY2tDb3VudDogMSwgeDogMTAsIHk6IDIwfSk7CiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaE1vdXNlRXZlbnQoe3R5cGU6ICdtb3VzZVJlbGVhc2VkJywgYnV0dG9uOiAnbGVmdCcsIGNsaWNrQ291bnQ6IDEsIHg6IDEwLCB5OiAyMH0pOwogICAgYXdhaXQgaW5wdXRBZ2VudC5pbnZva2VfZGlzcGF0Y2hNb3VzZUV2ZW50KHt0eXBlOiAnbW91c2VQcmVzc2VkJywgYnV0dG9uOiAnbGVmdCcsIGNsaWNrQ291bnQ6IDEsIHg6IDIzMCwgeTogMTQwfSk7CiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaE1vdXNlRXZlbnQoe3R5cGU6ICdtb3VzZU1vdmVkJywgYnV0dG9uOiAnbGVmdCcsIGNsaWNrQ291bnQ6IDEsIHg6IDIzMCwgeTogMTUwfSk7CiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaE1vdXNlRXZlbnQoe3R5cGU6ICdtb3VzZVJlbGVhc2VkJywgYnV0dG9uOiAnbGVmdCcsIGNsaWNrQ291bnQ6IDEsIHg6IDIzMCwgeTogMTUwfSk7CiAgICBwYXJlbnRGcmFtZU91dHB1dCA9ICdFdmVudCB0eXBlOiBtb3VzZWRvd24gYnV0dG9uOiAwIHg6IDEwIHk6IDEwIEV2ZW50IHR5cGU6IG1vdXNldXAgYnV0dG9uOiAwIHg6IDEwIHk6IDIwJzsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKHBhcmVudEZyYW1lT3V0cHV0LCBhd2FpdCB0YWtlTG9ncyhTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKClbMF0pKTsKICAgIGNoaWxkRnJhbWVPdXRwdXQgPSAnRXZlbnQgdHlwZTogbW91c2Vkb3duIGJ1dHRvbjogMCB4OiAzMCB5OiA0MCBFdmVudCB0eXBlOiBtb3VzZXVwIGJ1dHRvbjogMCB4OiAzMCB5OiA1MCc7CiAgICB0aGlzLmFzc2VydEVxdWFscyhjaGlsZEZyYW1lT3V0cHV0LCBhd2FpdCB0YWtlTG9ncyhTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKClbMV0pKTsKCgogICAgYXdhaXQgaW5wdXRBZ2VudC5pbnZva2VfZGlzcGF0Y2hLZXlFdmVudCh7dHlwZTogJ2tleURvd24nLCBrZXk6ICdhJ30pOwogICAgYXdhaXQgcnVudGltZUFnZW50Lmludm9rZV9ldmFsdWF0ZSh7ZXhwcmVzc2lvbjogYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpLmZvY3VzKClgfSk7CiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaEtleUV2ZW50KHt0eXBlOiAna2V5RG93bicsIGtleTogJ2EnfSk7CiAgICBwYXJlbnRGcmFtZU91dHB1dCA9ICdFdmVudCB0eXBlOiBrZXlkb3duJzsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKHBhcmVudEZyYW1lT3V0cHV0LCBhd2FpdCB0YWtlTG9ncyhTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKClbMF0pKTsKICAgIGNoaWxkRnJhbWVPdXRwdXQgPSAnRXZlbnQgdHlwZToga2V5ZG93bic7CiAgICB0aGlzLmFzc2VydEVxdWFscyhjaGlsZEZyYW1lT3V0cHV0LCBhd2FpdCB0YWtlTG9ncyhTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKClbMV0pKTsKCiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaFRvdWNoRXZlbnQoe3R5cGU6ICd0b3VjaFN0YXJ0JywgdG91Y2hQb2ludHM6IFt7eDogMTAsIHk6IDEwfV19KTsKICAgIGF3YWl0IGlucHV0QWdlbnQuaW52b2tlX2Rpc3BhdGNoVG91Y2hFdmVudCh7dHlwZTogJ3RvdWNoRW5kJywgdG91Y2hQb2ludHM6IFtdfSk7CiAgICBhd2FpdCBpbnB1dEFnZW50Lmludm9rZV9kaXNwYXRjaFRvdWNoRXZlbnQoe3R5cGU6ICd0b3VjaFN0YXJ0JywgdG91Y2hQb2ludHM6IFt7eDogMjMwLCB5OiAxNDB9XX0pOwogICAgYXdhaXQgaW5wdXRBZ2VudC5pbnZva2VfZGlzcGF0Y2hUb3VjaEV2ZW50KHt0eXBlOiAndG91Y2hFbmQnLCB0b3VjaFBvaW50czogW119KTsKICAgIHBhcmVudEZyYW1lT3V0cHV0ID0gJ0V2ZW50IHR5cGU6IHRvdWNoc3RhcnQgdG91Y2ggeDogMTAgdG91Y2ggeTogMTAnOwogICAgdGhpcy5hc3NlcnRFcXVhbHMocGFyZW50RnJhbWVPdXRwdXQsIGF3YWl0IHRha2VMb2dzKFNESy50YXJnZXRNYW5hZ2VyLnRhcmdldHMoKVswXSkpOwogICAgY2hpbGRGcmFtZU91dHB1dCA9ICdFdmVudCB0eXBlOiB0b3VjaHN0YXJ0IHRvdWNoIHg6IDMwIHRvdWNoIHk6IDQwJzsKICAgIHRoaXMuYXNzZXJ0RXF1YWxzKGNoaWxkRnJhbWVPdXRwdXQsIGF3YWl0IHRha2VMb2dzKFNESy50YXJnZXRNYW5hZ2VyLnRhcmdldHMoKVsxXSkpOwoKICAgIHRoaXMucmVsZWFzZUNvbnRyb2woKTsKICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLnRlc3RMb2FkUmVzb3VyY2VGb3JGcm9udGVuZCA9IGFzeW5jIGZ1bmN0aW9uKGJhc2VVUkwpIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwogICAgY29uc3QgbG9nZ2VkSGVhZGVycyA9IG5ldyBTZXQoWydjYWNoZS1jb250cm9sJywgJ3ByYWdtYSddKTsKICAgIGZ1bmN0aW9uIHRlc3RDYXNlKHVybCwgaGVhZGVycywgZXhwZWN0ZWRTdGF0dXMsIGV4cGVjdGVkSGVhZGVycywgZXhwZWN0ZWRDb250ZW50KSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdWxmaWxsID0+IHsKICAgICAgICBIb3N0LlJlc291cmNlTG9hZGVyLmxvYWQodXJsLCBoZWFkZXJzLCBjYWxsYmFjayk7CgogICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrKHN0YXR1c0NvZGUsIGhlYWRlcnMsIGNvbnRlbnQpIHsKICAgICAgICAgIHRlc3QuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhdHVzLCBzdGF0dXNDb2RlKTsKCiAgICAgICAgICBjb25zdCBoZWFkZXJzQXJyYXkgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBoZWFkZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWVMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKGxvZ2dlZEhlYWRlcnMuaGFzKG5hbWVMb3dlcikpCiAgICAgICAgICAgICAgaGVhZGVyc0FycmF5LnB1c2gobmFtZUxvd2VyKTsKICAgICAgICAgIH0KICAgICAgICAgIGhlYWRlcnNBcnJheS5zb3J0KCk7CiAgICAgICAgICB0ZXN0LmFzc2VydEVxdWFscyhleHBlY3RlZEhlYWRlcnMuam9pbignLCAnKSwgaGVhZGVyc0FycmF5LmpvaW4oJywgJykpOwogICAgICAgICAgdGVzdC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb250ZW50LCBjb250ZW50KTsKICAgICAgICAgIGZ1bGZpbGwoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHRoaXMudGFrZUNvbnRyb2woKTsKICAgIGF3YWl0IHRlc3RDYXNlKGJhc2VVUkwgKyAnbm9uLWV4aXN0ZW50Lmh0bWwnLCB1bmRlZmluZWQsIDQwNCwgW10sICcnKTsKICAgIGF3YWl0IHRlc3RDYXNlKGJhc2VVUkwgKyAnaGVsbG8uaHRtbCcsIHVuZGVmaW5lZCwgMjAwLCBbXSwgJzwhZG9jdHlwZSBodG1sPlxuPHA+aGVsbG88L3A+XG4nKTsKICAgIGF3YWl0IHRlc3RDYXNlKGJhc2VVUkwgKyAnZWNob2hlYWRlcj94LWRldnRvb2xzLXRlc3QnLCB7J3gtZGV2dG9vbHMtdGVzdCc6ICdGb28nfSwgMjAwLCBbJ2NhY2hlLWNvbnRyb2wnXSwgJ0ZvbycpOwogICAgYXdhaXQgdGVzdENhc2UoYmFzZVVSTCArICdzZXQtaGVhZGVyP3ByYWdtYTolMjBuby1jYWNoZScsIHVuZGVmaW5lZCwgMjAwLCBbJ3ByYWdtYSddLCAncHJhZ21hOiBuby1jYWNoZScpOwoKICAgIGF3YWl0IFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5ydW50aW1lQWdlbnQoKS5pbnZva2VfZXZhbHVhdGUoewogICAgICBleHByZXNzaW9uOiBgZmV0Y2goIi9zZXQtY29va2llP2RldnRvb2xzLXRlc3QtY29va2llPUJhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICB7Y3JlZGVudGlhbHM6ICdpbmNsdWRlJ30pYCwKICAgICAgYXdhaXRQcm9taXNlOiB0cnVlCiAgICB9KTsKICAgIGF3YWl0IHRlc3RDYXNlKGJhc2VVUkwgKyAnZWNob2hlYWRlcj9Db29raWUnLCB1bmRlZmluZWQsIDIwMCwgWydjYWNoZS1jb250cm9sJ10sICdkZXZ0b29scy10ZXN0LWNvb2tpZT1CYXInKTsKCiAgICB0aGlzLnJlbGVhc2VDb250cm9sKCk7CiAgfTsKCiAgLyoqCiAgICogU2VyaWFsaXplcyBhcnJheSBvZiB1aVNvdXJjZUNvZGVzIHRvIHN0cmluZy4KICAgKiBAcGFyYW0geyFBcnJheS48IVdvcmtzcGFjZS5VSVNvdXJjZUNvZGU+fSB1aVNvdXJjZUNvZGVzCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUudWlTb3VyY2VDb2Rlc1RvU3RyaW5nXyA9IGZ1bmN0aW9uKHVpU291cmNlQ29kZXMpIHsKICAgIGNvbnN0IG5hbWVzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVpU291cmNlQ29kZXMubGVuZ3RoOyBpKyspCiAgICAgIG5hbWVzLnB1c2goJyInICsgdWlTb3VyY2VDb2Rlc1tpXS51cmwoKSArICciJyk7CiAgICByZXR1cm4gbmFtZXMuam9pbignLCcpOwogIH07CgogIC8qKgogICAqIFJldHVybnMgYWxsIGxvYWRlZCBub24gYW5vbnltb3VzIHVpU291cmNlQ29kZXMuCiAgICogQHJldHVybiB7IUFycmF5LjwhV29ya3NwYWNlLlVJU291cmNlQ29kZT59CiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5ub25Bbm9ueW1vdXNVSVNvdXJjZUNvZGVzXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqCiAgICAgKiBAcGFyYW0geyFXb3Jrc3BhY2UuVUlTb3VyY2VDb2RlfSB1aVNvdXJjZUNvZGUKICAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyT3V0U2VydmljZSh1aVNvdXJjZUNvZGUpIHsKICAgICAgcmV0dXJuICF1aVNvdXJjZUNvZGUucHJvamVjdCgpLmlzU2VydmljZVByb2plY3QoKTsKICAgIH0KCiAgICBjb25zdCB1aVNvdXJjZUNvZGVzID0gV29ya3NwYWNlLndvcmtzcGFjZS51aVNvdXJjZUNvZGVzKCk7CiAgICByZXR1cm4gdWlTb3VyY2VDb2Rlcy5maWx0ZXIoZmlsdGVyT3V0U2VydmljZSk7CiAgfTsKCiAgLyoKICogRXZhbHVhdGVzIHRoZSBjb2RlIGluIHRoZSBjb25zb2xlIGFzIGlmIHVzZXIgdHlwZWQgaXQgbWFudWFsbHkgYW5kIGludm9rZXMKICogdGhlIGNhbGxiYWNrIHdoZW4gdGhlIHJlc3VsdCBtZXNzYWdlIGlzIHJlY2VpdmVkIGFuZCBhZGRlZCB0byB0aGUgY29uc29sZS4KICogQHBhcmFtIHtzdHJpbmd9IGNvZGUKICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBjYWxsYmFjawogKi8KICBUZXN0U3VpdGUucHJvdG90eXBlLmV2YWx1YXRlSW5Db25zb2xlXyA9IGZ1bmN0aW9uKGNvZGUsIGNhbGxiYWNrKSB7CiAgICBmdW5jdGlvbiBpbm5lckV2YWx1YXRlKCkgewogICAgICBVSS5jb250ZXh0LnJlbW92ZUZsYXZvckNoYW5nZUxpc3RlbmVyKFNESy5FeGVjdXRpb25Db250ZXh0LCBzaG93Q29uc29sZUFuZEV2YWx1YXRlLCB0aGlzKTsKICAgICAgY29uc3QgY29uc29sZVZpZXcgPSBDb25zb2xlLkNvbnNvbGVWaWV3Lmluc3RhbmNlKCk7CiAgICAgIGNvbnNvbGVWaWV3Ll9wcm9tcHQuX2FwcGVuZENvbW1hbmQoY29kZSk7CgogICAgICB0aGlzLmFkZFNuaWZmZXIoQ29uc29sZS5Db25zb2xlVmlldy5wcm90b3R5cGUsICdfY29uc29sZU1lc3NhZ2VBZGRlZEZvclRlc3QnLCBmdW5jdGlvbih2aWV3TWVzc2FnZSkgewogICAgICAgIGNhbGxiYWNrKHZpZXdNZXNzYWdlLnRvTWVzc2FnZUVsZW1lbnQoKS5kZWVwVGV4dENvbnRlbnQoKSk7CiAgICAgIH0uYmluZCh0aGlzKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0NvbnNvbGVBbmRFdmFsdWF0ZSgpIHsKICAgICAgQ29tbW9uLmNvbnNvbGUuc2hvd1Byb21pc2UoKS50aGVuKGlubmVyRXZhbHVhdGUuYmluZCh0aGlzKSk7CiAgICB9CgogICAgaWYgKCFVSS5jb250ZXh0LmZsYXZvcihTREsuRXhlY3V0aW9uQ29udGV4dCkpIHsKICAgICAgVUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRXhlY3V0aW9uQ29udGV4dCwgc2hvd0NvbnNvbGVBbmRFdmFsdWF0ZSwgdGhpcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNob3dDb25zb2xlQW5kRXZhbHVhdGUuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBDaGVja3MgdGhhdCBhbGwgZXhwZWN0ZWQgc2NyaXB0cyBhcmUgcHJlc2VudCBpbiB0aGUgc2NyaXB0cyBsaXN0CiAgICogaW4gdGhlIFNjcmlwdHMgcGFuZWwuCiAgICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGV4cGVjdGVkIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVzY3JpYmluZwogICAqICAgICBleHBlY3RlZCBzY3JpcHQgbmFtZXMuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhbGwgdGhlIHNjcmlwdHMgYXJlIGluICJzY3JpcHRzLWZpbGVzIiBzZWxlY3QKICAgKiAgICAgYm94CiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5fc2NyaXB0c0FyZVBhcnNlZCA9IGZ1bmN0aW9uKGV4cGVjdGVkKSB7CiAgICBjb25zdCB1aVNvdXJjZUNvZGVzID0gdGhpcy5ub25Bbm9ueW1vdXNVSVNvdXJjZUNvZGVzXygpOwogICAgLy8gQ2hlY2sgdGhhdCBhdCBsZWFzdCBhbGwgdGhlIGV4cGVjdGVkIHNjcmlwdHMgYXJlIHByZXNlbnQuCiAgICBjb25zdCBtaXNzaW5nID0gZXhwZWN0ZWQuc2xpY2UoMCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVpU291cmNlQ29kZXMubGVuZ3RoOyArK2kpIHsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtaXNzaW5nLmxlbmd0aDsgKytqKSB7CiAgICAgICAgaWYgKHVpU291cmNlQ29kZXNbaV0ubmFtZSgpLnNlYXJjaChtaXNzaW5nW2pdKSAhPT0gLTEpIHsKICAgICAgICAgIG1pc3Npbmcuc3BsaWNlKGosIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWlzc2luZy5sZW5ndGggPT09IDA7CiAgfTsKCiAgLyoqCiAgICogV2FpdHMgZm9yIHNjcmlwdCBwYXVzZSwgY2hlY2tzIGV4cGVjdGF0aW9ucywgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrLgogICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFjawogICAqLwogIFRlc3RTdWl0ZS5wcm90b3R5cGUuX3dhaXRGb3JTY3JpcHRQYXVzZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB0aGlzLmFkZFNuaWZmZXIoU0RLLkRlYnVnZ2VyTW9kZWwucHJvdG90eXBlLCAnX3BhdXNlZFNjcmlwdCcsIGNhbGxiYWNrKTsKICB9OwoKICAvKioKICAgKiBXYWl0cyB1bnRpbCBhbGwgdGhlIHNjcmlwdHMgYXJlIHBhcnNlZCBhbmQgaW52b2tlcyB0aGUgY2FsbGJhY2suCiAgICovCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5fd2FpdFVudGlsU2NyaXB0c0FyZVBhcnNlZCA9IGZ1bmN0aW9uKGV4cGVjdGVkU2NyaXB0cywgY2FsbGJhY2spIHsKICAgIGNvbnN0IHRlc3QgPSB0aGlzOwoKICAgIGZ1bmN0aW9uIHdhaXRGb3JBbGxTY3JpcHRzKCkgewogICAgICBpZiAodGVzdC5fc2NyaXB0c0FyZVBhcnNlZChleHBlY3RlZFNjcmlwdHMpKQogICAgICAgIGNhbGxiYWNrKCk7CiAgICAgIGVsc2UKICAgICAgICB0ZXN0LmFkZFNuaWZmZXIoVUkucGFuZWxzLnNvdXJjZXMuc291cmNlc1ZpZXcoKSwgJ19hZGRVSVNvdXJjZUNvZGUnLCB3YWl0Rm9yQWxsU2NyaXB0cyk7CiAgICB9CgogICAgd2FpdEZvckFsbFNjcmlwdHMoKTsKICB9OwoKICBUZXN0U3VpdGUucHJvdG90eXBlLl93YWl0Rm9yVGFyZ2V0cyA9IGZ1bmN0aW9uKG4sIGNhbGxiYWNrKSB7CiAgICBjaGVja1RhcmdldHMuY2FsbCh0aGlzKTsKCiAgICBmdW5jdGlvbiBjaGVja1RhcmdldHMoKSB7CiAgICAgIGlmIChTREsudGFyZ2V0TWFuYWdlci50YXJnZXRzKCkubGVuZ3RoID49IG4pCiAgICAgICAgY2FsbGJhY2suY2FsbChudWxsKTsKICAgICAgZWxzZQogICAgICAgIHRoaXMuYWRkU25pZmZlcihTREsuVGFyZ2V0TWFuYWdlci5wcm90b3R5cGUsICdjcmVhdGVUYXJnZXQnLCBjaGVja1RhcmdldHMuYmluZCh0aGlzKSk7CiAgICB9CiAgfTsKCiAgVGVzdFN1aXRlLnByb3RvdHlwZS5fd2FpdEZvckV4ZWN1dGlvbkNvbnRleHRzID0gZnVuY3Rpb24obiwgY2FsbGJhY2spIHsKICAgIGNvbnN0IHJ1bnRpbWVNb2RlbCA9IFNESy50YXJnZXRNYW5hZ2VyLm1haW5UYXJnZXQoKS5tb2RlbChTREsuUnVudGltZU1vZGVsKTsKICAgIGNoZWNrRm9yRXhlY3V0aW9uQ29udGV4dHMuY2FsbCh0aGlzKTsKCiAgICBmdW5jdGlvbiBjaGVja0ZvckV4ZWN1dGlvbkNvbnRleHRzKCkgewogICAgICBpZiAocnVudGltZU1vZGVsLmV4ZWN1dGlvbkNvbnRleHRzKCkubGVuZ3RoID49IG4pCiAgICAgICAgY2FsbGJhY2suY2FsbChudWxsKTsKICAgICAgZWxzZQogICAgICAgIHRoaXMuYWRkU25pZmZlcihTREsuUnVudGltZU1vZGVsLnByb3RvdHlwZSwgJ19leGVjdXRpb25Db250ZXh0Q3JlYXRlZCcsIGNoZWNrRm9yRXhlY3V0aW9uQ29udGV4dHMuYmluZCh0aGlzKSk7CiAgICB9CiAgfTsKCgogIHdpbmRvdy51aVRlc3RzID0gbmV3IFRlc3RTdWl0ZSh3aW5kb3cuZG9tQXV0b21hdGlvbkNvbnRyb2xsZXIpOwp9KSh3aW5kb3cpOwooZnVuY3Rpb24oKSB7CiAgICAvKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKICogbWV0OgogKgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqIGRpc3RyaWJ1dGlvbi4KICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovCgpmdW5jdGlvbiBkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzKGFwaVByaXZhdGUpIHsKICBpZiAoIWFwaVByaXZhdGUucGFuZWxzKQogICAgYXBpUHJpdmF0ZS5wYW5lbHMgPSB7fTsKICBhcGlQcml2YXRlLnBhbmVscy5TZWFyY2hBY3Rpb24gPSB7CiAgICBDYW5jZWxTZWFyY2g6ICdjYW5jZWxTZWFyY2gnLAogICAgUGVyZm9ybVNlYXJjaDogJ3BlcmZvcm1TZWFyY2gnLAogICAgTmV4dFNlYXJjaFJlc3VsdDogJ25leHRTZWFyY2hSZXN1bHQnLAogICAgUHJldmlvdXNTZWFyY2hSZXN1bHQ6ICdwcmV2aW91c1NlYXJjaFJlc3VsdCcKICB9OwoKICAvKiogQGVudW0ge3N0cmluZ30gKi8KICBhcGlQcml2YXRlLkV2ZW50cyA9IHsKICAgIEJ1dHRvbkNsaWNrZWQ6ICdidXR0b24tY2xpY2tlZC0nLAogICAgUGFuZWxPYmplY3RTZWxlY3RlZDogJ3BhbmVsLW9iamVjdFNlbGVjdGVkLScsCiAgICBOZXR3b3JrUmVxdWVzdEZpbmlzaGVkOiAnbmV0d29yay1yZXF1ZXN0LWZpbmlzaGVkJywKICAgIE9wZW5SZXNvdXJjZTogJ29wZW4tcmVzb3VyY2UnLAogICAgUGFuZWxTZWFyY2g6ICdwYW5lbC1zZWFyY2gtJywKICAgIFJlY29yZGluZ1N0YXJ0ZWQ6ICd0cmFjZS1yZWNvcmRpbmctc3RhcnRlZC0nLAogICAgUmVjb3JkaW5nU3RvcHBlZDogJ3RyYWNlLXJlY29yZGluZy1zdG9wcGVkLScsCiAgICBSZXNvdXJjZUFkZGVkOiAncmVzb3VyY2UtYWRkZWQnLAogICAgUmVzb3VyY2VDb250ZW50Q29tbWl0dGVkOiAncmVzb3VyY2UtY29udGVudC1jb21taXR0ZWQnLAogICAgVmlld1Nob3duOiAndmlldy1zaG93bi0nLAogICAgVmlld0hpZGRlbjogJ3ZpZXctaGlkZGVuLScKICB9OwoKICAvKiogQGVudW0ge3N0cmluZ30gKi8KICBhcGlQcml2YXRlLkNvbW1hbmRzID0gewogICAgQWRkUmVxdWVzdEhlYWRlcnM6ICdhZGRSZXF1ZXN0SGVhZGVycycsCiAgICBBZGRUcmFjZVByb3ZpZGVyOiAnYWRkVHJhY2VQcm92aWRlcicsCiAgICBBcHBseVN0eWxlU2hlZXQ6ICdhcHBseVN0eWxlU2hlZXQnLAogICAgQ29tcGxldGVUcmFjZVNlc3Npb246ICdjb21wbGV0ZVRyYWNlU2Vzc2lvbicsCiAgICBDcmVhdGVQYW5lbDogJ2NyZWF0ZVBhbmVsJywKICAgIENyZWF0ZVNpZGViYXJQYW5lOiAnY3JlYXRlU2lkZWJhclBhbmUnLAogICAgQ3JlYXRlVG9vbGJhckJ1dHRvbjogJ2NyZWF0ZVRvb2xiYXJCdXR0b24nLAogICAgRXZhbHVhdGVPbkluc3BlY3RlZFBhZ2U6ICdldmFsdWF0ZU9uSW5zcGVjdGVkUGFnZScsCiAgICBGb3J3YXJkS2V5Ym9hcmRFdmVudDogJ19mb3J3YXJkS2V5Ym9hcmRFdmVudCcsCiAgICBHZXRIQVI6ICdnZXRIQVInLAogICAgR2V0UGFnZVJlc291cmNlczogJ2dldFBhZ2VSZXNvdXJjZXMnLAogICAgR2V0UmVxdWVzdENvbnRlbnQ6ICdnZXRSZXF1ZXN0Q29udGVudCcsCiAgICBHZXRSZXNvdXJjZUNvbnRlbnQ6ICdnZXRSZXNvdXJjZUNvbnRlbnQnLAogICAgSW5zcGVjdGVkVVJMQ2hhbmdlZDogJ2luc3BlY3RlZFVSTENoYW5nZWQnLAogICAgT3BlblJlc291cmNlOiAnb3BlblJlc291cmNlJywKICAgIFJlbG9hZDogJ1JlbG9hZCcsCiAgICBTdWJzY3JpYmU6ICdzdWJzY3JpYmUnLAogICAgU2V0T3BlblJlc291cmNlSGFuZGxlcjogJ3NldE9wZW5SZXNvdXJjZUhhbmRsZXInLAogICAgU2V0UmVzb3VyY2VDb250ZW50OiAnc2V0UmVzb3VyY2VDb250ZW50JywKICAgIFNldFNpZGViYXJDb250ZW50OiAnc2V0U2lkZWJhckNvbnRlbnQnLAogICAgU2V0U2lkZWJhckhlaWdodDogJ3NldFNpZGViYXJIZWlnaHQnLAogICAgU2V0U2lkZWJhclBhZ2U6ICdzZXRTaWRlYmFyUGFnZScsCiAgICBTaG93UGFuZWw6ICdzaG93UGFuZWwnLAogICAgVW5zdWJzY3JpYmU6ICd1bnN1YnNjcmliZScsCiAgICBVcGRhdGVCdXR0b246ICd1cGRhdGVCdXR0b24nCiAgfTsKfQoKLyoqCiAqIEBwYXJhbSB7IUV4dGVuc2lvbkRlc2NyaXB0b3J9IGV4dGVuc2lvbkluZm8KICogQHBhcmFtIHtzdHJpbmd9IGluc3BlY3RlZFRhYklkCiAqIEBwYXJhbSB7c3RyaW5nfSB0aGVtZU5hbWUKICogQHBhcmFtIHtudW1iZXJ9IGluamVjdGVkU2NyaXB0SWQKICogQHBhcmFtIHtmdW5jdGlvbighT2JqZWN0LCAhT2JqZWN0KX0gdGVzdEhvb2sKICogQHN1cHByZXNzR2xvYmFsUHJvcGVydGllc0NoZWNrCiAqLwpmdW5jdGlvbiBpbmplY3RlZEV4dGVuc2lvbkFQSShleHRlbnNpb25JbmZvLCBpbnNwZWN0ZWRUYWJJZCwgdGhlbWVOYW1lLCB0ZXN0SG9vaywgaW5qZWN0ZWRTY3JpcHRJZCkgewogIGNvbnN0IGNocm9tZSA9IHdpbmRvdy5jaHJvbWUgfHwge307CiAgY29uc3QgZGV2dG9vbHNfZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2hyb21lLCAnZGV2dG9vbHMnKTsKICBpZiAoZGV2dG9vbHNfZGVzY3JpcHRvcikKICAgIHJldHVybjsKCiAgY29uc3QgYXBpUHJpdmF0ZSA9IHt9OwoKICBkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzKGFwaVByaXZhdGUpOwoKICBjb25zdCBjb21tYW5kcyA9IGFwaVByaXZhdGUuQ29tbWFuZHM7CiAgY29uc3QgZXZlbnRzID0gYXBpUHJpdmF0ZS5FdmVudHM7CiAgbGV0IHVzZXJBY3Rpb24gPSBmYWxzZTsKCiAgLy8gSGVyZSBhbmQgYmVsb3csIGFsbCBjb25zdHJ1Y3RvcnMgYXJlIHByaXZhdGUgdG8gQVBJIGltcGxlbWVudGF0aW9uLgogIC8vIEZvciBhIHB1YmxpYyB0eXBlIEZvbywgaWYgaW50ZXJuYWwgZmllbGRzIGFyZSBwcmVzZW50LCB0aGVzZSBhcmUgb24KICAvLyBhIHByaXZhdGUgRm9vSW1wbCB0eXBlLCBhbiBpbnN0YW5jZSBvZiBGb29JbXBsIGlzIHVzZWQgaW4gYSBjbG9zdXJlCiAgLy8gYnkgRm9vIGNvbnN1dHJjdG9yIHRvIHJlLWJpbmQgcHVibGljbHkgZXhwb3J0ZWQgbWVtYmVycyB0byBhbiBpbnN0YW5jZQogIC8vIG9mIEZvby4KCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICovCiAgZnVuY3Rpb24gRXZlbnRTaW5rSW1wbCh0eXBlLCBjdXN0b21EaXNwYXRjaCkgewogICAgdGhpcy5fdHlwZSA9IHR5cGU7CiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgIHRoaXMuX2N1c3RvbURpc3BhdGNoID0gY3VzdG9tRGlzcGF0Y2g7CiAgfQoKICBFdmVudFNpbmtJbXBsLnByb3RvdHlwZSA9IHsKICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKQogICAgICAgIHRocm93ICdhZGRMaXN0ZW5lcjogY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24nOwogICAgICBpZiAodGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkKICAgICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6IGNvbW1hbmRzLlN1YnNjcmliZSwgdHlwZTogdGhpcy5fdHlwZX0pOwogICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7CiAgICAgIGV4dGVuc2lvblNlcnZlci5yZWdpc3RlckhhbmRsZXIoJ25vdGlmeS0nICsgdGhpcy5fdHlwZSwgdGhpcy5fZGlzcGF0Y2guYmluZCh0aGlzKSk7CiAgICB9LAoKICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewogICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGNhbGxiYWNrKSB7CiAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID09PSAwKQogICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDogY29tbWFuZHMuVW5zdWJzY3JpYmUsIHR5cGU6IHRoaXMuX3R5cGV9KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0gey4uLn0gdmFyYXJnCiAgICAgKi8KICAgIF9maXJlOiBmdW5jdGlvbih2YXJhcmcpIHsKICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLnNsaWNlKCk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKQogICAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgfSwKCiAgICBfZGlzcGF0Y2g6IGZ1bmN0aW9uKHJlcXVlc3QpIHsKICAgICAgaWYgKHRoaXMuX2N1c3RvbURpc3BhdGNoKQogICAgICAgIHRoaXMuX2N1c3RvbURpc3BhdGNoLmNhbGwodGhpcywgcmVxdWVzdCk7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLl9maXJlLmFwcGx5KHRoaXMsIHJlcXVlc3QuYXJndW1lbnRzKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKi8KICBmdW5jdGlvbiBJbnNwZWN0b3JFeHRlbnNpb25BUEkoKSB7CiAgICB0aGlzLmluc3BlY3RlZFdpbmRvdyA9IG5ldyBJbnNwZWN0ZWRXaW5kb3coKTsKICAgIHRoaXMucGFuZWxzID0gbmV3IFBhbmVscygpOwogICAgdGhpcy5uZXR3b3JrID0gbmV3IE5ldHdvcmsoKTsKICAgIHRoaXMudGltZWxpbmUgPSBuZXcgVGltZWxpbmUoKTsKICAgIGRlZmluZURlcHJlY2F0ZWRQcm9wZXJ0eSh0aGlzLCAnd2ViSW5zcGVjdG9yJywgJ3Jlc291cmNlcycsICduZXR3b3JrJyk7CiAgfQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKi8KICBmdW5jdGlvbiBOZXR3b3JrKCkgewogICAgLyoqCiAgICAgKiBAdGhpcyB7RXZlbnRTaW5rSW1wbH0KICAgICAqLwogICAgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0RXZlbnQobWVzc2FnZSkgewogICAgICBjb25zdCByZXF1ZXN0ID0gbWVzc2FnZS5hcmd1bWVudHNbMV07CiAgICAgIHJlcXVlc3QuX19wcm90b19fID0gbmV3IFJlcXVlc3QobWVzc2FnZS5hcmd1bWVudHNbMF0pOwogICAgICB0aGlzLl9maXJlKHJlcXVlc3QpOwogICAgfQogICAgdGhpcy5vblJlcXVlc3RGaW5pc2hlZCA9IG5ldyBFdmVudFNpbmsoZXZlbnRzLk5ldHdvcmtSZXF1ZXN0RmluaXNoZWQsIGRpc3BhdGNoUmVxdWVzdEV2ZW50KTsKICAgIGRlZmluZURlcHJlY2F0ZWRQcm9wZXJ0eSh0aGlzLCAnbmV0d29yaycsICdvbkZpbmlzaGVkJywgJ29uUmVxdWVzdEZpbmlzaGVkJyk7CiAgICB0aGlzLm9uTmF2aWdhdGVkID0gbmV3IEV2ZW50U2luayhldmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCk7CiAgfQoKICBOZXR3b3JrLnByb3RvdHlwZSA9IHsKICAgIGdldEhBUjogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3VsdCkgewogICAgICAgIGNvbnN0IGVudHJpZXMgPSAocmVzdWx0ICYmIHJlc3VsdC5lbnRyaWVzKSB8fCBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGVudHJpZXNbaV0uX19wcm90b19fID0gbmV3IFJlcXVlc3QoZW50cmllc1tpXS5fcmVxdWVzdElkKTsKICAgICAgICAgIGRlbGV0ZSBlbnRyaWVzW2ldLl9yZXF1ZXN0SWQ7CiAgICAgICAgfQogICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgICAgIH0KICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOiBjb21tYW5kcy5HZXRIQVJ9LCBjYWxsYmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOwogICAgfSwKCiAgICBhZGRSZXF1ZXN0SGVhZGVyczogZnVuY3Rpb24oaGVhZGVycykgewogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoCiAgICAgICAgICB7Y29tbWFuZDogY29tbWFuZHMuQWRkUmVxdWVzdEhlYWRlcnMsIGhlYWRlcnM6IGhlYWRlcnMsIGV4dGVuc2lvbklkOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKi8KICBmdW5jdGlvbiBSZXF1ZXN0SW1wbChpZCkgewogICAgdGhpcy5faWQgPSBpZDsKICB9CgogIFJlcXVlc3RJbXBsLnByb3RvdHlwZSA9IHsKICAgIGdldENvbnRlbnQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXNwb25zZSkgewogICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlLmNvbnRlbnQsIHJlc3BvbnNlLmVuY29kaW5nKTsKICAgICAgfQogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6IGNvbW1hbmRzLkdldFJlcXVlc3RDb250ZW50LCBpZDogdGhpcy5faWR9LCBjYWxsYmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOwogICAgfQogIH07CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqLwogIGZ1bmN0aW9uIFBhbmVscygpIHsKICAgIGNvbnN0IHBhbmVscyA9IHsKICAgICAgZWxlbWVudHM6IG5ldyBFbGVtZW50c1BhbmVsKCksCiAgICAgIHNvdXJjZXM6IG5ldyBTb3VyY2VzUGFuZWwoKSwKICAgIH07CgogICAgZnVuY3Rpb24gcGFuZWxHZXR0ZXIobmFtZSkgewogICAgICByZXR1cm4gcGFuZWxzW25hbWVdOwogICAgfQogICAgZm9yIChjb25zdCBwYW5lbCBpbiBwYW5lbHMpCiAgICAgIHRoaXMuX19kZWZpbmVHZXR0ZXJfXyhwYW5lbCwgcGFuZWxHZXR0ZXIuYmluZChudWxsLCBwYW5lbCkpOwogICAgdGhpcy5hcHBseVN0eWxlU2hlZXQgPSBmdW5jdGlvbihzdHlsZVNoZWV0KSB7CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDogY29tbWFuZHMuQXBwbHlTdHlsZVNoZWV0LCBzdHlsZVNoZWV0OiBzdHlsZVNoZWV0fSk7CiAgICB9OwogIH0KCiAgUGFuZWxzLnByb3RvdHlwZSA9IHsKICAgIGNyZWF0ZTogZnVuY3Rpb24odGl0bGUsIGljb24sIHBhZ2UsIGNhbGxiYWNrKSB7CiAgICAgIGNvbnN0IGlkID0gJ2V4dGVuc2lvbi1wYW5lbC0nICsgZXh0ZW5zaW9uU2VydmVyLm5leHRPYmplY3RJZCgpOwogICAgICBjb25zdCByZXF1ZXN0ID0ge2NvbW1hbmQ6IGNvbW1hbmRzLkNyZWF0ZVBhbmVsLCBpZDogaWQsIHRpdGxlOiB0aXRsZSwgaWNvbjogaWNvbiwgcGFnZTogcGFnZX07CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0LCBjYWxsYmFjayAmJiBjYWxsYmFjay5iaW5kKHRoaXMsIG5ldyBFeHRlbnNpb25QYW5lbChpZCkpKTsKICAgIH0sCgogICAgc2V0T3BlblJlc291cmNlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgY29uc3QgaGFkSGFuZGxlciA9IGV4dGVuc2lvblNlcnZlci5oYXNIYW5kbGVyKGV2ZW50cy5PcGVuUmVzb3VyY2UpOwoKICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKG1lc3NhZ2UpIHsKICAgICAgICAvLyBBbGxvdyB0aGUgcGFuZWwgdG8gc2hvdyBpdHNlbGYgd2hlbiBoYW5kbGluZyB0aGUgZXZlbnQuCiAgICAgICAgdXNlckFjdGlvbiA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgbmV3IFJlc291cmNlKG1lc3NhZ2UucmVzb3VyY2UpLCBtZXNzYWdlLmxpbmVOdW1iZXIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB1c2VyQWN0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIWNhbGxiYWNrKQogICAgICAgIGV4dGVuc2lvblNlcnZlci51bnJlZ2lzdGVySGFuZGxlcihldmVudHMuT3BlblJlc291cmNlKTsKICAgICAgZWxzZQogICAgICAgIGV4dGVuc2lvblNlcnZlci5yZWdpc3RlckhhbmRsZXIoZXZlbnRzLk9wZW5SZXNvdXJjZSwgY2FsbGJhY2tXcmFwcGVyKTsKCiAgICAgIC8vIE9ubHkgc2VuZCBjb21tYW5kIGlmIHdlIGVpdGhlciByZW1vdmVkIGFuIGV4aXN0aW5nIGhhbmRsZXIgb3IgYWRkZWQgaGFuZGxlciBhbmQgaGFkIG5vbmUgYmVmb3JlLgogICAgICBpZiAoaGFkSGFuZGxlciA9PT0gIWNhbGxiYWNrKQogICAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCh7Y29tbWFuZDogY29tbWFuZHMuU2V0T3BlblJlc291cmNlSGFuZGxlciwgJ2hhbmRsZXJQcmVzZW50JzogISFjYWxsYmFja30pOwogICAgfSwKCiAgICBvcGVuUmVzb3VyY2U6IGZ1bmN0aW9uKHVybCwgbGluZU51bWJlciwgY2FsbGJhY2spIHsKICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOiBjb21tYW5kcy5PcGVuUmVzb3VyY2UsICd1cmwnOiB1cmwsICdsaW5lTnVtYmVyJzogbGluZU51bWJlcn0sIGNhbGxiYWNrKTsKICAgIH0sCgogICAgZ2V0IFNlYXJjaEFjdGlvbigpIHsKICAgICAgcmV0dXJuIGFwaVByaXZhdGUucGFuZWxzLlNlYXJjaEFjdGlvbjsKICAgIH0KICB9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKi8KICBmdW5jdGlvbiBFeHRlbnNpb25WaWV3SW1wbChpZCkgewogICAgdGhpcy5faWQgPSBpZDsKCiAgICAvKioKICAgICAqIEB0aGlzIHtFdmVudFNpbmtJbXBsfQogICAgICovCiAgICBmdW5jdGlvbiBkaXNwYXRjaFNob3dFdmVudChtZXNzYWdlKSB7CiAgICAgIGNvbnN0IGZyYW1lSW5kZXggPSBtZXNzYWdlLmFyZ3VtZW50c1swXTsKICAgICAgaWYgKHR5cGVvZiBmcmFtZUluZGV4ID09PSAnbnVtYmVyJykKICAgICAgICB0aGlzLl9maXJlKHdpbmRvdy5wYXJlbnQuZnJhbWVzW2ZyYW1lSW5kZXhdKTsKICAgICAgZWxzZQogICAgICAgIHRoaXMuX2ZpcmUoKTsKICAgIH0KCiAgICBpZiAoaWQpIHsKICAgICAgdGhpcy5vblNob3duID0gbmV3IEV2ZW50U2luayhldmVudHMuVmlld1Nob3duICsgaWQsIGRpc3BhdGNoU2hvd0V2ZW50KTsKICAgICAgdGhpcy5vbkhpZGRlbiA9IG5ldyBFdmVudFNpbmsoZXZlbnRzLlZpZXdIaWRkZW4gKyBpZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uVmlld0ltcGx9CiAgICogQHBhcmFtIHtzdHJpbmd9IGhvc3RQYW5lbE5hbWUKICAgKi8KICBmdW5jdGlvbiBQYW5lbFdpdGhTaWRlYmFySW1wbChob3N0UGFuZWxOYW1lKSB7CiAgICBFeHRlbnNpb25WaWV3SW1wbC5jYWxsKHRoaXMsIG51bGwpOwogICAgdGhpcy5faG9zdFBhbmVsTmFtZSA9IGhvc3RQYW5lbE5hbWU7CiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudFNpbmsoZXZlbnRzLlBhbmVsT2JqZWN0U2VsZWN0ZWQgKyBob3N0UGFuZWxOYW1lKTsKICB9CgogIFBhbmVsV2l0aFNpZGViYXJJbXBsLnByb3RvdHlwZSA9IHsKICAgIGNyZWF0ZVNpZGViYXJQYW5lOiBmdW5jdGlvbih0aXRsZSwgY2FsbGJhY2spIHsKICAgICAgY29uc3QgaWQgPSAnZXh0ZW5zaW9uLXNpZGViYXItJyArIGV4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQoKTsKICAgICAgY29uc3QgcmVxdWVzdCA9IHtjb21tYW5kOiBjb21tYW5kcy5DcmVhdGVTaWRlYmFyUGFuZSwgcGFuZWw6IHRoaXMuX2hvc3RQYW5lbE5hbWUsIGlkOiBpZCwgdGl0bGU6IHRpdGxlfTsKICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKCkgewogICAgICAgIGNhbGxiYWNrKG5ldyBFeHRlbnNpb25TaWRlYmFyUGFuZShpZCkpOwogICAgICB9CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0LCBjYWxsYmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOwogICAgfSwKCiAgICBfX3Byb3RvX186IEV4dGVuc2lvblZpZXdJbXBsLnByb3RvdHlwZQogIH07CgogIGZ1bmN0aW9uIGRlY2xhcmVJbnRlcmZhY2VDbGFzcyhpbXBsQ29uc3RydWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgaW1wbCA9IHtfX3Byb3RvX186IGltcGxDb25zdHJ1Y3Rvci5wcm90b3R5cGV9OwogICAgICBpbXBsQ29uc3RydWN0b3IuYXBwbHkoaW1wbCwgYXJndW1lbnRzKTsKICAgICAgcG9wdWxhdGVJbnRlcmZhY2VDbGFzcyh0aGlzLCBpbXBsKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBkZWZpbmVEZXByZWNhdGVkUHJvcGVydHkob2JqZWN0LCBjbGFzc05hbWUsIG9sZE5hbWUsIG5ld05hbWUpIHsKICAgIGxldCB3YXJuaW5nR2l2ZW4gPSBmYWxzZTsKICAgIGZ1bmN0aW9uIGdldHRlcigpIHsKICAgICAgaWYgKCF3YXJuaW5nR2l2ZW4pIHsKICAgICAgICBjb25zb2xlLndhcm4oY2xhc3NOYW1lICsgJy4nICsgb2xkTmFtZSArICcgaXMgZGVwcmVjYXRlZC4gVXNlICcgKyBjbGFzc05hbWUgKyAnLicgKyBuZXdOYW1lICsgJyBpbnN0ZWFkJyk7CiAgICAgICAgd2FybmluZ0dpdmVuID0gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0W25ld05hbWVdOwogICAgfQogICAgb2JqZWN0Ll9fZGVmaW5lR2V0dGVyX18ob2xkTmFtZSwgZ2V0dGVyKTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RDYWxsYmFja0FyZ3VtZW50KGFyZ3MpIHsKICAgIGNvbnN0IGxhc3RBcmd1bWVudCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKICAgIHJldHVybiB0eXBlb2YgbGFzdEFyZ3VtZW50ID09PSAnZnVuY3Rpb24nID8gbGFzdEFyZ3VtZW50IDogdW5kZWZpbmVkOwogIH0KCiAgY29uc3QgQnV0dG9uID0gZGVjbGFyZUludGVyZmFjZUNsYXNzKEJ1dHRvbkltcGwpOwogIGNvbnN0IEV2ZW50U2luayA9IGRlY2xhcmVJbnRlcmZhY2VDbGFzcyhFdmVudFNpbmtJbXBsKTsKICBjb25zdCBFeHRlbnNpb25QYW5lbCA9IGRlY2xhcmVJbnRlcmZhY2VDbGFzcyhFeHRlbnNpb25QYW5lbEltcGwpOwogIGNvbnN0IEV4dGVuc2lvblNpZGViYXJQYW5lID0gZGVjbGFyZUludGVyZmFjZUNsYXNzKEV4dGVuc2lvblNpZGViYXJQYW5lSW1wbCk7CiAgY29uc3QgUGFuZWxXaXRoU2lkZWJhciA9IGRlY2xhcmVJbnRlcmZhY2VDbGFzcyhQYW5lbFdpdGhTaWRlYmFySW1wbCk7CiAgY29uc3QgUmVxdWVzdCA9IGRlY2xhcmVJbnRlcmZhY2VDbGFzcyhSZXF1ZXN0SW1wbCk7CiAgY29uc3QgUmVzb3VyY2UgPSBkZWNsYXJlSW50ZXJmYWNlQ2xhc3MoUmVzb3VyY2VJbXBsKTsKICBjb25zdCBUcmFjZVNlc3Npb24gPSBkZWNsYXJlSW50ZXJmYWNlQ2xhc3MoVHJhY2VTZXNzaW9uSW1wbCk7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtQYW5lbFdpdGhTaWRlYmFyfQogICAqLwogIGZ1bmN0aW9uIEVsZW1lbnRzUGFuZWwoKSB7CiAgICBQYW5lbFdpdGhTaWRlYmFyLmNhbGwodGhpcywgJ2VsZW1lbnRzJyk7CiAgfQoKICBFbGVtZW50c1BhbmVsLnByb3RvdHlwZSA9IHtfX3Byb3RvX186IFBhbmVsV2l0aFNpZGViYXIucHJvdG90eXBlfTsKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGV4dGVuZHMge1BhbmVsV2l0aFNpZGViYXJ9CiAgICovCiAgZnVuY3Rpb24gU291cmNlc1BhbmVsKCkgewogICAgUGFuZWxXaXRoU2lkZWJhci5jYWxsKHRoaXMsICdzb3VyY2VzJyk7CiAgfQoKICBTb3VyY2VzUGFuZWwucHJvdG90eXBlID0ge19fcHJvdG9fXzogUGFuZWxXaXRoU2lkZWJhci5wcm90b3R5cGV9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uVmlld0ltcGx9CiAgICovCiAgZnVuY3Rpb24gRXh0ZW5zaW9uUGFuZWxJbXBsKGlkKSB7CiAgICBFeHRlbnNpb25WaWV3SW1wbC5jYWxsKHRoaXMsIGlkKTsKICAgIHRoaXMub25TZWFyY2ggPSBuZXcgRXZlbnRTaW5rKGV2ZW50cy5QYW5lbFNlYXJjaCArIGlkKTsKICB9CgogIEV4dGVuc2lvblBhbmVsSW1wbC5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIEByZXR1cm4geyFPYmplY3R9CiAgICAgKi8KICAgIGNyZWF0ZVN0YXR1c0JhckJ1dHRvbjogZnVuY3Rpb24oaWNvblBhdGgsIHRvb2x0aXBUZXh0LCBkaXNhYmxlZCkgewogICAgICBjb25zdCBpZCA9ICdidXR0b24tJyArIGV4dGVuc2lvblNlcnZlci5uZXh0T2JqZWN0SWQoKTsKICAgICAgY29uc3QgcmVxdWVzdCA9IHsKICAgICAgICBjb21tYW5kOiBjb21tYW5kcy5DcmVhdGVUb29sYmFyQnV0dG9uLAogICAgICAgIHBhbmVsOiB0aGlzLl9pZCwKICAgICAgICBpZDogaWQsCiAgICAgICAgaWNvbjogaWNvblBhdGgsCiAgICAgICAgdG9vbHRpcDogdG9vbHRpcFRleHQsCiAgICAgICAgZGlzYWJsZWQ6ICEhZGlzYWJsZWQKICAgICAgfTsKICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHJlcXVlc3QpOwogICAgICByZXR1cm4gbmV3IEJ1dHRvbihpZCk7CiAgICB9LAoKICAgIHNob3c6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXVzZXJBY3Rpb24pCiAgICAgICAgcmV0dXJuOwoKICAgICAgY29uc3QgcmVxdWVzdCA9IHtjb21tYW5kOiBjb21tYW5kcy5TaG93UGFuZWwsIGlkOiB0aGlzLl9pZH07CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0KTsKICAgIH0sCgogICAgX19wcm90b19fOiBFeHRlbnNpb25WaWV3SW1wbC5wcm90b3R5cGUKICB9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uVmlld0ltcGx9CiAgICovCiAgZnVuY3Rpb24gRXh0ZW5zaW9uU2lkZWJhclBhbmVJbXBsKGlkKSB7CiAgICBFeHRlbnNpb25WaWV3SW1wbC5jYWxsKHRoaXMsIGlkKTsKICB9CgogIEV4dGVuc2lvblNpZGViYXJQYW5lSW1wbC5wcm90b3R5cGUgPSB7CiAgICBzZXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCkgewogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6IGNvbW1hbmRzLlNldFNpZGViYXJIZWlnaHQsIGlkOiB0aGlzLl9pZCwgaGVpZ2h0OiBoZWlnaHR9KTsKICAgIH0sCgogICAgc2V0RXhwcmVzc2lvbjogZnVuY3Rpb24oZXhwcmVzc2lvbiwgcm9vdFRpdGxlLCBldmFsdWF0ZU9wdGlvbnMpIHsKICAgICAgY29uc3QgcmVxdWVzdCA9IHsKICAgICAgICBjb21tYW5kOiBjb21tYW5kcy5TZXRTaWRlYmFyQ29udGVudCwKICAgICAgICBpZDogdGhpcy5faWQsCiAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbiwKICAgICAgICByb290VGl0bGU6IHJvb3RUaXRsZSwKICAgICAgICBldmFsdWF0ZU9uUGFnZTogdHJ1ZSwKICAgICAgfTsKICAgICAgaWYgKHR5cGVvZiBldmFsdWF0ZU9wdGlvbnMgPT09ICdvYmplY3QnKQogICAgICAgIHJlcXVlc3QuZXZhbHVhdGVPcHRpb25zID0gZXZhbHVhdGVPcHRpb25zOwogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCwgZXh0cmFjdENhbGxiYWNrQXJndW1lbnQoYXJndW1lbnRzKSk7CiAgICB9LAoKICAgIHNldE9iamVjdDogZnVuY3Rpb24oanNvbk9iamVjdCwgcm9vdFRpdGxlLCBjYWxsYmFjaykgewogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QoCiAgICAgICAgICB7Y29tbWFuZDogY29tbWFuZHMuU2V0U2lkZWJhckNvbnRlbnQsIGlkOiB0aGlzLl9pZCwgZXhwcmVzc2lvbjoganNvbk9iamVjdCwgcm9vdFRpdGxlOiByb290VGl0bGV9LCBjYWxsYmFjayk7CiAgICB9LAoKICAgIHNldFBhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOiBjb21tYW5kcy5TZXRTaWRlYmFyUGFnZSwgaWQ6IHRoaXMuX2lkLCBwYWdlOiBwYWdlfSk7CiAgICB9LAoKICAgIF9fcHJvdG9fXzogRXh0ZW5zaW9uVmlld0ltcGwucHJvdG90eXBlCiAgfTsKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICovCiAgZnVuY3Rpb24gQnV0dG9uSW1wbChpZCkgewogICAgdGhpcy5faWQgPSBpZDsKICAgIHRoaXMub25DbGlja2VkID0gbmV3IEV2ZW50U2luayhldmVudHMuQnV0dG9uQ2xpY2tlZCArIGlkKTsKICB9CgogIEJ1dHRvbkltcGwucHJvdG90eXBlID0gewogICAgdXBkYXRlOiBmdW5jdGlvbihpY29uUGF0aCwgdG9vbHRpcFRleHQsIGRpc2FibGVkKSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPQogICAgICAgICAge2NvbW1hbmQ6IGNvbW1hbmRzLlVwZGF0ZUJ1dHRvbiwgaWQ6IHRoaXMuX2lkLCBpY29uOiBpY29uUGF0aCwgdG9vbHRpcDogdG9vbHRpcFRleHQsIGRpc2FibGVkOiAhIWRpc2FibGVkfTsKICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHJlcXVlc3QpOwogICAgfQogIH07CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqLwogIGZ1bmN0aW9uIFRpbWVsaW5lKCkgewogIH0KCiAgVGltZWxpbmUucHJvdG90eXBlID0gewogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnlOYW1lCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnlUb29sdGlwCiAgICAgKiBAcmV0dXJuIHshVHJhY2VQcm92aWRlcn0KICAgICAqLwogICAgYWRkVHJhY2VQcm92aWRlcjogZnVuY3Rpb24oY2F0ZWdvcnlOYW1lLCBjYXRlZ29yeVRvb2x0aXApIHsKICAgICAgY29uc3QgaWQgPSAnZXh0ZW5zaW9uLXRyYWNlLXByb3ZpZGVyLScgKyBleHRlbnNpb25TZXJ2ZXIubmV4dE9iamVjdElkKCk7CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCgKICAgICAgICAgIHtjb21tYW5kOiBjb21tYW5kcy5BZGRUcmFjZVByb3ZpZGVyLCBpZDogaWQsIGNhdGVnb3J5TmFtZTogY2F0ZWdvcnlOYW1lLCBjYXRlZ29yeVRvb2x0aXA6IGNhdGVnb3J5VG9vbHRpcH0pOwogICAgICByZXR1cm4gbmV3IFRyYWNlUHJvdmlkZXIoaWQpOwogICAgfQogIH07CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBwYXJhbSB7c3RyaW5nfSBpZAogICAqLwogIGZ1bmN0aW9uIFRyYWNlU2Vzc2lvbkltcGwoaWQpIHsKICAgIHRoaXMuX2lkID0gaWQ7CiAgfQoKICBUcmFjZVNlc3Npb25JbXBsLnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmc9fSB1cmwKICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gdGltZU9mZnNldAogICAgICovCiAgICBjb21wbGV0ZTogZnVuY3Rpb24odXJsLCB0aW1lT2Zmc2V0KSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPQogICAgICAgICAge2NvbW1hbmQ6IGNvbW1hbmRzLkNvbXBsZXRlVHJhY2VTZXNzaW9uLCBpZDogdGhpcy5faWQsIHVybDogdXJsIHx8ICcnLCB0aW1lT2Zmc2V0OiB0aW1lT2Zmc2V0IHx8IDB9OwogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3QocmVxdWVzdCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICogQHBhcmFtIHtzdHJpbmd9IGlkCiAgICovCiAgZnVuY3Rpb24gVHJhY2VQcm92aWRlcihpZCkgewogICAgLyoqCiAgICAgKiBAdGhpcyB7RXZlbnRTaW5rSW1wbH0KICAgICAqLwogICAgZnVuY3Rpb24gZGlzcGF0Y2hSZWNvcmRpbmdTdGFydGVkKG1lc3NhZ2UpIHsKICAgICAgY29uc3Qgc2Vzc2lvbklkID0gbWVzc2FnZS5hcmd1bWVudHNbMF07CiAgICAgIHRoaXMuX2ZpcmUobmV3IFRyYWNlU2Vzc2lvbihzZXNzaW9uSWQpKTsKICAgIH0KCiAgICB0aGlzLm9uUmVjb3JkaW5nU3RhcnRlZCA9IG5ldyBFdmVudFNpbmsoZXZlbnRzLlJlY29yZGluZ1N0YXJ0ZWQgKyBpZCwgZGlzcGF0Y2hSZWNvcmRpbmdTdGFydGVkKTsKICAgIHRoaXMub25SZWNvcmRpbmdTdG9wcGVkID0gbmV3IEV2ZW50U2luayhldmVudHMuUmVjb3JkaW5nU3RvcHBlZCArIGlkKTsKICB9CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqLwogIGZ1bmN0aW9uIEluc3BlY3RlZFdpbmRvdygpIHsKICAgIC8qKgogICAgICogQHRoaXMge0V2ZW50U2lua0ltcGx9CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3BhdGNoUmVzb3VyY2VFdmVudChtZXNzYWdlKSB7CiAgICAgIHRoaXMuX2ZpcmUobmV3IFJlc291cmNlKG1lc3NhZ2UuYXJndW1lbnRzWzBdKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhpcyB7RXZlbnRTaW5rSW1wbH0KICAgICAqLwogICAgZnVuY3Rpb24gZGlzcGF0Y2hSZXNvdXJjZUNvbnRlbnRFdmVudChtZXNzYWdlKSB7CiAgICAgIHRoaXMuX2ZpcmUobmV3IFJlc291cmNlKG1lc3NhZ2UuYXJndW1lbnRzWzBdKSwgbWVzc2FnZS5hcmd1bWVudHNbMV0pOwogICAgfQoKICAgIHRoaXMub25SZXNvdXJjZUFkZGVkID0gbmV3IEV2ZW50U2luayhldmVudHMuUmVzb3VyY2VBZGRlZCwgZGlzcGF0Y2hSZXNvdXJjZUV2ZW50KTsKICAgIHRoaXMub25SZXNvdXJjZUNvbnRlbnRDb21taXR0ZWQgPSBuZXcgRXZlbnRTaW5rKGV2ZW50cy5SZXNvdXJjZUNvbnRlbnRDb21taXR0ZWQsIGRpc3BhdGNoUmVzb3VyY2VDb250ZW50RXZlbnQpOwogIH0KCiAgSW5zcGVjdGVkV2luZG93LnByb3RvdHlwZSA9IHsKICAgIHJlbG9hZDogZnVuY3Rpb24ob3B0aW9uc09yVXNlckFnZW50KSB7CiAgICAgIGxldCBvcHRpb25zID0gbnVsbDsKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zT3JVc2VyQWdlbnQgPT09ICdvYmplY3QnKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPclVzZXJBZ2VudDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc09yVXNlckFnZW50ID09PSAnc3RyaW5nJykgewogICAgICAgIG9wdGlvbnMgPSB7dXNlckFnZW50OiBvcHRpb25zT3JVc2VyQWdlbnR9OwogICAgICAgIGNvbnNvbGUud2FybigKICAgICAgICAgICAgJ1Bhc3NpbmcgdXNlckFnZW50IGFzIHN0cmluZyBwYXJhbWV0ZXIgdG8gaW5zcGVjdGVkV2luZG93LnJlbG9hZCgpIGlzIGRlcHJlY2F0ZWQuICcgKwogICAgICAgICAgICAnVXNlIGluc3BlY3RlZFdpbmRvdy5yZWxvYWQoeyB1c2VyQWdlbnQ6IHZhbHVlfSkgaW5zdGVhZC4nKTsKICAgICAgfQogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6IGNvbW1hbmRzLlJlbG9hZCwgb3B0aW9uczogb3B0aW9uc30pOwogICAgfSwKCiAgICAvKioKICAgICAqIEByZXR1cm4gez9PYmplY3R9CiAgICAgKi8KICAgIGV2YWw6IGZ1bmN0aW9uKGV4cHJlc3Npb24sIGV2YWx1YXRlT3B0aW9ucykgewogICAgICBjb25zdCBjYWxsYmFjayA9IGV4dHJhY3RDYWxsYmFja0FyZ3VtZW50KGFyZ3VtZW50cyk7CiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrV3JhcHBlcihyZXN1bHQpIHsKICAgICAgICBpZiAocmVzdWx0LmlzRXJyb3IgfHwgcmVzdWx0LmlzRXhjZXB0aW9uKQogICAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCByZXN1bHQpOwogICAgICAgIGVsc2UKICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdC52YWx1ZSk7CiAgICAgIH0KICAgICAgY29uc3QgcmVxdWVzdCA9IHtjb21tYW5kOiBjb21tYW5kcy5FdmFsdWF0ZU9uSW5zcGVjdGVkUGFnZSwgZXhwcmVzc2lvbjogZXhwcmVzc2lvbn07CiAgICAgIGlmICh0eXBlb2YgZXZhbHVhdGVPcHRpb25zID09PSAnb2JqZWN0JykKICAgICAgICByZXF1ZXN0LmV2YWx1YXRlT3B0aW9ucyA9IGV2YWx1YXRlT3B0aW9uczsKICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHJlcXVlc3QsIGNhbGxiYWNrICYmIGNhbGxiYWNrV3JhcHBlcik7CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICBnZXRSZXNvdXJjZXM6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgIGZ1bmN0aW9uIHdyYXBSZXNvdXJjZShyZXNvdXJjZURhdGEpIHsKICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlKHJlc291cmNlRGF0YSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc291cmNlcykgewogICAgICAgIGNhbGxiYWNrKHJlc291cmNlcy5tYXAod3JhcFJlc291cmNlKSk7CiAgICAgIH0KICAgICAgZXh0ZW5zaW9uU2VydmVyLnNlbmRSZXF1ZXN0KHtjb21tYW5kOiBjb21tYW5kcy5HZXRQYWdlUmVzb3VyY2VzfSwgY2FsbGJhY2sgJiYgY2FsbGJhY2tXcmFwcGVyKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKi8KICBmdW5jdGlvbiBSZXNvdXJjZUltcGwocmVzb3VyY2VEYXRhKSB7CiAgICB0aGlzLl91cmwgPSByZXNvdXJjZURhdGEudXJsOwogICAgdGhpcy5fdHlwZSA9IHJlc291cmNlRGF0YS50eXBlOwogIH0KCiAgUmVzb3VyY2VJbXBsLnByb3RvdHlwZSA9IHsKICAgIGdldCB1cmwoKSB7CiAgICAgIHJldHVybiB0aGlzLl91cmw7CiAgICB9LAoKICAgIGdldCB0eXBlKCkgewogICAgICByZXR1cm4gdGhpcy5fdHlwZTsKICAgIH0sCgogICAgZ2V0Q29udGVudDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgZnVuY3Rpb24gY2FsbGJhY2tXcmFwcGVyKHJlc3BvbnNlKSB7CiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuY29udGVudCwgcmVzcG9uc2UuZW5jb2RpbmcpOwogICAgICB9CgogICAgICBleHRlbnNpb25TZXJ2ZXIuc2VuZFJlcXVlc3Qoe2NvbW1hbmQ6IGNvbW1hbmRzLkdldFJlc291cmNlQ29udGVudCwgdXJsOiB0aGlzLl91cmx9LCBjYWxsYmFjayAmJiBjYWxsYmFja1dyYXBwZXIpOwogICAgfSwKCiAgICBzZXRDb250ZW50OiBmdW5jdGlvbihjb250ZW50LCBjb21taXQsIGNhbGxiYWNrKSB7CiAgICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdCgKICAgICAgICAgIHtjb21tYW5kOiBjb21tYW5kcy5TZXRSZXNvdXJjZUNvbnRlbnQsIHVybDogdGhpcy5fdXJsLCBjb250ZW50OiBjb250ZW50LCBjb21taXQ6IGNvbW1pdH0sIGNhbGxiYWNrKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBnZXRUYWJJZCgpIHsKICAgIHJldHVybiBpbnNwZWN0ZWRUYWJJZDsKICB9CgogIGxldCBrZXlib2FyZEV2ZW50UmVxdWVzdFF1ZXVlID0gW107CiAgbGV0IGZvcndhcmRUaW1lciA9IG51bGw7CgogIGZ1bmN0aW9uIGZvcndhcmRLZXlib2FyZEV2ZW50KGV2ZW50KSB7CiAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgZ2xvYmFsIGhvdGtleXMsIG5vdCBhYm91dCByYW5kb20gdGV4dAogICAgaWYgKCFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgIS9eRlxkKyQvLnRlc3QoZXZlbnQua2V5KSAmJiBldmVudC5rZXkgIT09ICdFc2NhcGUnKQogICAgICByZXR1cm47CiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsKICAgICAgZXZlbnRUeXBlOiBldmVudC50eXBlLAogICAgICBjdHJsS2V5OiBldmVudC5jdHJsS2V5LAogICAgICBhbHRLZXk6IGV2ZW50LmFsdEtleSwKICAgICAgbWV0YUtleTogZXZlbnQubWV0YUtleSwKICAgICAga2V5SWRlbnRpZmllcjogZXZlbnQua2V5SWRlbnRpZmllciwKICAgICAga2V5OiBldmVudC5rZXksCiAgICAgIGNvZGU6IGV2ZW50LmNvZGUsCiAgICAgIGxvY2F0aW9uOiBldmVudC5sb2NhdGlvbiwKICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZQogICAgfTsKICAgIGtleWJvYXJkRXZlbnRSZXF1ZXN0UXVldWUucHVzaChyZXF1ZXN0UGF5bG9hZCk7CiAgICBpZiAoIWZvcndhcmRUaW1lcikKICAgICAgZm9yd2FyZFRpbWVyID0gc2V0VGltZW91dChmb3J3YXJkRXZlbnRRdWV1ZSwgMCk7CiAgfQoKICBmdW5jdGlvbiBmb3J3YXJkRXZlbnRRdWV1ZSgpIHsKICAgIGZvcndhcmRUaW1lciA9IG51bGw7CiAgICBjb25zdCByZXF1ZXN0ID0ge2NvbW1hbmQ6IGNvbW1hbmRzLkZvcndhcmRLZXlib2FyZEV2ZW50LCBlbnRyaWVzOiBrZXlib2FyZEV2ZW50UmVxdWVzdFF1ZXVlfTsKICAgIGV4dGVuc2lvblNlcnZlci5zZW5kUmVxdWVzdChyZXF1ZXN0KTsKICAgIGtleWJvYXJkRXZlbnRSZXF1ZXN0UXVldWUgPSBbXTsKICB9CgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmb3J3YXJkS2V5Ym9hcmRFdmVudCwgZmFsc2UpOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgZm9yd2FyZEtleWJvYXJkRXZlbnQsIGZhbHNlKTsKCiAgLyoqCiAgICogQGNvbnN0cnVjdG9yCiAgICovCiAgZnVuY3Rpb24gRXh0ZW5zaW9uU2VydmVyQ2xpZW50KCkgewogICAgdGhpcy5fY2FsbGJhY2tzID0ge307CiAgICB0aGlzLl9oYW5kbGVycyA9IHt9OwogICAgdGhpcy5fbGFzdFJlcXVlc3RJZCA9IDA7CiAgICB0aGlzLl9sYXN0T2JqZWN0SWQgPSAwOwoKICAgIHRoaXMucmVnaXN0ZXJIYW5kbGVyKCdjYWxsYmFjaycsIHRoaXMuX29uQ2FsbGJhY2suYmluZCh0aGlzKSk7CgogICAgY29uc3QgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogICAgdGhpcy5fcG9ydCA9IGNoYW5uZWwucG9ydDE7CiAgICB0aGlzLl9wb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKSwgZmFsc2UpOwogICAgdGhpcy5fcG9ydC5zdGFydCgpOwoKICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoJ3JlZ2lzdGVyRXh0ZW5zaW9uJywgJyonLCBbY2hhbm5lbC5wb3J0Ml0pOwogIH0KCiAgRXh0ZW5zaW9uU2VydmVyQ2xpZW50LnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogQHBhcmFtIHshT2JqZWN0fSBtZXNzYWdlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk9fSBjYWxsYmFjawogICAgICovCiAgICBzZW5kUmVxdWVzdDogZnVuY3Rpb24obWVzc2FnZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICBtZXNzYWdlLnJlcXVlc3RJZCA9IHRoaXMuX3JlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOwogICAgICB0aGlzLl9wb3J0LnBvc3RNZXNzYWdlKG1lc3NhZ2UpOwogICAgfSwKCiAgICAvKioKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc0hhbmRsZXI6IGZ1bmN0aW9uKGNvbW1hbmQpIHsKICAgICAgcmV0dXJuICEhdGhpcy5faGFuZGxlcnNbY29tbWFuZF07CiAgICB9LAoKICAgIHJlZ2lzdGVySGFuZGxlcjogZnVuY3Rpb24oY29tbWFuZCwgaGFuZGxlcikgewogICAgICB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXSA9IGhhbmRsZXI7CiAgICB9LAoKICAgIHVucmVnaXN0ZXJIYW5kbGVyOiBmdW5jdGlvbihjb21tYW5kKSB7CiAgICAgIGRlbGV0ZSB0aGlzLl9oYW5kbGVyc1tjb21tYW5kXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIG5leHRPYmplY3RJZDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpbmplY3RlZFNjcmlwdElkLnRvU3RyaW5nKCkgKyAnXycgKyArK3RoaXMuX2xhc3RPYmplY3RJZDsKICAgIH0sCgogICAgX3JlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgIGNvbnN0IGlkID0gKyt0aGlzLl9sYXN0UmVxdWVzdElkOwogICAgICB0aGlzLl9jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7CiAgICAgIHJldHVybiBpZDsKICAgIH0sCgogICAgX29uQ2FsbGJhY2s6IGZ1bmN0aW9uKHJlcXVlc3QpIHsKICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdElkIGluIHRoaXMuX2NhbGxiYWNrcykgewogICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2tzW3JlcXVlc3QucmVxdWVzdElkXTsKICAgICAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW3JlcXVlc3QucmVxdWVzdElkXTsKICAgICAgICBjYWxsYmFjayhyZXF1ZXN0LnJlc3VsdCk7CiAgICAgIH0KICAgIH0sCgogICAgX29uTWVzc2FnZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LmRhdGE7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLl9oYW5kbGVyc1tyZXF1ZXN0LmNvbW1hbmRdOwogICAgICBpZiAoaGFuZGxlcikKICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgcmVxdWVzdCk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gcG9wdWxhdGVJbnRlcmZhY2VDbGFzcyhpbnRlcmZhemUsIGltcGxlbWVudGF0aW9uKSB7CiAgICBmb3IgKGNvbnN0IG1lbWJlciBpbiBpbXBsZW1lbnRhdGlvbikgewogICAgICBpZiAobWVtYmVyLmNoYXJBdCgwKSA9PT0gJ18nKQogICAgICAgIGNvbnRpbnVlOwogICAgICBsZXQgZGVzY3JpcHRvciA9IG51bGw7CiAgICAgIC8vIFRyYXZlcnNlIHByb3RvdHlwZSBjaGFpbiB1bnRpbCB3ZSBmaW5kIHRoZSBvd25lci4KICAgICAgZm9yIChsZXQgb3duZXIgPSBpbXBsZW1lbnRhdGlvbjsgb3duZXIgJiYgIWRlc2NyaXB0b3I7IG93bmVyID0gb3duZXIuX19wcm90b19fKQogICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBtZW1iZXIpOwogICAgICBpZiAoIWRlc2NyaXB0b3IpCiAgICAgICAgY29udGludWU7CiAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICBpbnRlcmZhemVbbWVtYmVyXSA9IGRlc2NyaXB0b3IudmFsdWUuYmluZChpbXBsZW1lbnRhdGlvbik7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICBpbnRlcmZhemUuX19kZWZpbmVHZXR0ZXJfXyhtZW1iZXIsIGRlc2NyaXB0b3IuZ2V0LmJpbmQoaW1wbGVtZW50YXRpb24pKTsKICAgICAgZWxzZQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnRlcmZhemUsIG1lbWJlciwgZGVzY3JpcHRvcik7CiAgICB9CiAgfQoKICBjb25zdCBleHRlbnNpb25TZXJ2ZXIgPSBuZXcgRXh0ZW5zaW9uU2VydmVyQ2xpZW50KCk7CiAgY29uc3QgY29yZUFQSSA9IG5ldyBJbnNwZWN0b3JFeHRlbnNpb25BUEkoKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNocm9tZSwgJ2RldnRvb2xzJywge3ZhbHVlOiB7fSwgZW51bWVyYWJsZTogdHJ1ZX0pOwoKICAvLyBPbmx5IGV4cG9zZSB0YWJJZCBvbiBjaHJvbWUuZGV2dG9vbHMuaW5zcGVjdGVkV2luZG93LCBub3Qgd2ViSW5zcGVjdG9yLmluc3BlY3RlZFdpbmRvdy4KICBjaHJvbWUuZGV2dG9vbHMuaW5zcGVjdGVkV2luZG93ID0ge307CiAgY2hyb21lLmRldnRvb2xzLmluc3BlY3RlZFdpbmRvdy5fX2RlZmluZUdldHRlcl9fKCd0YWJJZCcsIGdldFRhYklkKTsKICBjaHJvbWUuZGV2dG9vbHMuaW5zcGVjdGVkV2luZG93Ll9fcHJvdG9fXyA9IGNvcmVBUEkuaW5zcGVjdGVkV2luZG93OwogIGNocm9tZS5kZXZ0b29scy5uZXR3b3JrID0gY29yZUFQSS5uZXR3b3JrOwogIGNocm9tZS5kZXZ0b29scy5wYW5lbHMgPSBjb3JlQVBJLnBhbmVsczsKICBjaHJvbWUuZGV2dG9vbHMucGFuZWxzLnRoZW1lTmFtZSA9IHRoZW1lTmFtZTsKCiAgLy8gZGVmYXVsdCB0byBleHBvc2UgZXhwZXJpbWVudGFsIEFQSXMgZm9yIG5vdy4KICBpZiAoZXh0ZW5zaW9uSW5mby5leHBvc2VFeHBlcmltZW50YWxBUElzICE9PSBmYWxzZSkgewogICAgY2hyb21lLmV4cGVyaW1lbnRhbCA9IGNocm9tZS5leHBlcmltZW50YWwgfHwge307CiAgICBjaHJvbWUuZXhwZXJpbWVudGFsLmRldnRvb2xzID0gY2hyb21lLmV4cGVyaW1lbnRhbC5kZXZ0b29scyB8fCB7fTsKCiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29yZUFQSSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29yZUFQSSwgcHJvcGVydGllc1tpXSk7CiAgICAgIGlmIChkZXNjcmlwdG9yKQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaHJvbWUuZXhwZXJpbWVudGFsLmRldnRvb2xzLCBwcm9wZXJ0aWVzW2ldLCBkZXNjcmlwdG9yKTsKICAgIH0KICAgIGNocm9tZS5leHBlcmltZW50YWwuZGV2dG9vbHMuaW5zcGVjdGVkV2luZG93ID0gY2hyb21lLmRldnRvb2xzLmluc3BlY3RlZFdpbmRvdzsKICB9CgogIGlmIChleHRlbnNpb25JbmZvLmV4cG9zZVdlYkluc3BlY3Rvck5hbWVzcGFjZSkKICAgIHdpbmRvdy53ZWJJbnNwZWN0b3IgPSBjb3JlQVBJOwogIHRlc3RIb29rKGV4dGVuc2lvblNlcnZlciwgY29yZUFQSSk7Cn0KCi8qKgogKiBAcGFyYW0geyFFeHRlbnNpb25EZXNjcmlwdG9yfSBleHRlbnNpb25JbmZvCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnNwZWN0ZWRUYWJJZAogKiBAcGFyYW0ge3N0cmluZ30gdGhlbWVOYW1lCiAqIEBwYXJhbSB7ZnVuY3Rpb24oIU9iamVjdCwgIU9iamVjdCl8dW5kZWZpbmVkfSB0ZXN0SG9vawogKiBAcmV0dXJuIHtzdHJpbmd9CiAqLwpmdW5jdGlvbiBidWlsZEV4dGVuc2lvbkFQSUluamVjdGVkU2NyaXB0KGV4dGVuc2lvbkluZm8sIGluc3BlY3RlZFRhYklkLCB0aGVtZU5hbWUsIHRlc3RIb29rKSB7CiAgY29uc3QgYXJndW1lbnRzSlNPTiA9IFtleHRlbnNpb25JbmZvLCBpbnNwZWN0ZWRUYWJJZCB8fCBudWxsLCB0aGVtZU5hbWVdLm1hcChfID0+IEpTT04uc3RyaW5naWZ5KF8pKS5qb2luKCcsJyk7CiAgaWYgKCF0ZXN0SG9vaykKICAgIHRlc3RIb29rID0gKCkgPT4ge307CiAgcmV0dXJuICcoZnVuY3Rpb24oaW5qZWN0ZWRTY3JpcHRJZCl7ICcgKyBkZWZpbmVDb21tb25FeHRlbnNpb25TeW1ib2xzLnRvU3RyaW5nKCkgKyAnOycgKwogICAgICAnKCcgKyBpbmplY3RlZEV4dGVuc2lvbkFQSS50b1N0cmluZygpICsgJykoJyArIGFyZ3VtZW50c0pTT04gKyAnLCcgKyB0ZXN0SG9vayArICcsIGluamVjdGVkU2NyaXB0SWQpOycgKwogICAgICAnfSknOwp9CgogICAgICAgIHZhciB0YWJJZDsKICAgICAgICB2YXIgZXh0ZW5zaW9uSW5mbyA9IHt9OwogICAgICAgIHZhciBleHRlbnNpb25TZXJ2ZXI7CiAgICAgICAgcGxhdGZvcm1FeHRlbnNpb25BUEkoaW5qZWN0ZWRFeHRlbnNpb25BUEkoInJlbW90ZS0iICsgd2luZG93LnBhcmVudC5mcmFtZXMubGVuZ3RoKSk7CiAgICB9KSgpO0FjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGU9Y2xhc3N7Y29uc3RydWN0b3IoYWNjZXNzaWJpbGl0eU1vZGVsLHBheWxvYWQpe3RoaXMuX2FjY2Vzc2liaWxpdHlNb2RlbD1hY2Nlc3NpYmlsaXR5TW9kZWw7dGhpcy5fYWdlbnQ9YWNjZXNzaWJpbGl0eU1vZGVsLl9hZ2VudDt0aGlzLl9pZD1wYXlsb2FkLm5vZGVJZDthY2Nlc3NpYmlsaXR5TW9kZWwuX3NldEFYTm9kZUZvckFYSWQodGhpcy5faWQsdGhpcyk7aWYocGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkKXthY2Nlc3NpYmlsaXR5TW9kZWwuX3NldEFYTm9kZUZvckJhY2tlbmRET01Ob2RlSWQocGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkLHRoaXMpO3RoaXMuX2JhY2tlbmRET01Ob2RlSWQ9cGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkO3RoaXMuX2RlZmVycmVkRE9NTm9kZT1uZXcgU0RLLkRlZmVycmVkRE9NTm9kZShhY2Nlc3NpYmlsaXR5TW9kZWwudGFyZ2V0KCkscGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkKTt9ZWxzZXt0aGlzLl9iYWNrZW5kRE9NTm9kZUlkPW51bGw7dGhpcy5fZGVmZXJyZWRET01Ob2RlPW51bGw7fQp0aGlzLl9pZ25vcmVkPXBheWxvYWQuaWdub3JlZDtpZih0aGlzLl9pZ25vcmVkJiYnaWdub3JlZFJlYXNvbnMnaW4gcGF5bG9hZCkKdGhpcy5faWdub3JlZFJlYXNvbnM9cGF5bG9hZC5pZ25vcmVkUmVhc29uczt0aGlzLl9yb2xlPXBheWxvYWQucm9sZXx8bnVsbDt0aGlzLl9uYW1lPXBheWxvYWQubmFtZXx8bnVsbDt0aGlzLl9kZXNjcmlwdGlvbj1wYXlsb2FkLmRlc2NyaXB0aW9ufHxudWxsO3RoaXMuX3ZhbHVlPXBheWxvYWQudmFsdWV8fG51bGw7dGhpcy5fcHJvcGVydGllcz1wYXlsb2FkLnByb3BlcnRpZXN8fG51bGw7dGhpcy5fY2hpbGRJZHM9cGF5bG9hZC5jaGlsZElkc3x8bnVsbDt0aGlzLl9wYXJlbnROb2RlPW51bGw7fQphY2Nlc3NpYmlsaXR5TW9kZWwoKXtyZXR1cm4gdGhpcy5fYWNjZXNzaWJpbGl0eU1vZGVsO30KaWdub3JlZCgpe3JldHVybiB0aGlzLl9pZ25vcmVkO30KaWdub3JlZFJlYXNvbnMoKXtyZXR1cm4gdGhpcy5faWdub3JlZFJlYXNvbnN8fG51bGw7fQpyb2xlKCl7cmV0dXJuIHRoaXMuX3JvbGV8fG51bGw7fQpjb3JlUHJvcGVydGllcygpe2NvbnN0IHByb3BlcnRpZXM9W107aWYodGhpcy5fbmFtZSkKcHJvcGVydGllcy5wdXNoKCh7bmFtZTonbmFtZScsdmFsdWU6dGhpcy5fbmFtZX0pKTtpZih0aGlzLl9kZXNjcmlwdGlvbil7cHJvcGVydGllcy5wdXNoKCh7bmFtZTonZGVzY3JpcHRpb24nLHZhbHVlOnRoaXMuX2Rlc2NyaXB0aW9ufSkpO30KaWYodGhpcy5fdmFsdWUpCnByb3BlcnRpZXMucHVzaCgoe25hbWU6J3ZhbHVlJyx2YWx1ZTp0aGlzLl92YWx1ZX0pKTtyZXR1cm4gcHJvcGVydGllczt9Cm5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZXx8bnVsbDt9CmRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9ufHxudWxsO30KdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWV8fG51bGw7fQpwcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnRpZXN8fG51bGw7fQpwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX3BhcmVudE5vZGU7fQpfc2V0UGFyZW50Tm9kZShwYXJlbnROb2RlKXt0aGlzLl9wYXJlbnROb2RlPXBhcmVudE5vZGU7fQppc0RPTU5vZGUoKXtyZXR1cm4hIXRoaXMuX2JhY2tlbmRET01Ob2RlSWQ7fQpiYWNrZW5kRE9NTm9kZUlkKCl7cmV0dXJuIHRoaXMuX2JhY2tlbmRET01Ob2RlSWQ7fQpkZWZlcnJlZERPTU5vZGUoKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRET01Ob2RlO30KaGlnaGxpZ2h0RE9NTm9kZSgpe2lmKCF0aGlzLmRlZmVycmVkRE9NTm9kZSgpKQpyZXR1cm47dGhpcy5kZWZlcnJlZERPTU5vZGUoKS5oaWdobGlnaHQoKTt0aGlzLmRlZmVycmVkRE9NTm9kZSgpLnJlc29sdmVQcm9taXNlKCkudGhlbihub2RlPT57aWYoIW5vZGUpCnJldHVybjtub2RlLmRvbU1vZGVsKCkub3ZlcmxheU1vZGVsKCkubm9kZUhpZ2hsaWdodFJlcXVlc3RlZChub2RlLmlkKTt9KTt9CmNoaWxkcmVuKCl7Y29uc3QgY2hpbGRyZW49W107aWYoIXRoaXMuX2NoaWxkSWRzKQpyZXR1cm4gY2hpbGRyZW47Zm9yKGNvbnN0IGNoaWxkSWQgb2YgdGhpcy5fY2hpbGRJZHMpe2NvbnN0IGNoaWxkPXRoaXMuX2FjY2Vzc2liaWxpdHlNb2RlbC5heE5vZGVGb3JJZChjaGlsZElkKTtpZihjaGlsZCkKY2hpbGRyZW4ucHVzaChjaGlsZCk7fQpyZXR1cm4gY2hpbGRyZW47fQpudW1DaGlsZHJlbigpe2lmKCF0aGlzLl9jaGlsZElkcykKcmV0dXJuIDA7cmV0dXJuIHRoaXMuX2NoaWxkSWRzLmxlbmd0aDt9Cmhhc09ubHlVbmxvYWRlZENoaWxkcmVuKCl7aWYoIXRoaXMuX2NoaWxkSWRzfHwhdGhpcy5fY2hpbGRJZHMubGVuZ3RoKQpyZXR1cm4gZmFsc2U7cmV0dXJuIXRoaXMuX2NoaWxkSWRzLnNvbWUoaWQ9PnRoaXMuX2FjY2Vzc2liaWxpdHlNb2RlbC5heE5vZGVGb3JJZChpZCkhPT11bmRlZmluZWQpO30KcHJpbnRTZWxmQW5kQ2hpbGRyZW4oaW5zcGVjdGVkTm9kZSxsZWFkaW5nU3BhY2Upe2xldCBzdHJpbmc9bGVhZGluZ1NwYWNlfHwnJztpZih0aGlzLl9yb2xlKQpzdHJpbmcrPXRoaXMuX3JvbGUudmFsdWU7ZWxzZQpzdHJpbmcrPSc8bm8gcm9sZT4nO3N0cmluZys9KHRoaXMuX25hbWU/JyAnK3RoaXMuX25hbWUudmFsdWU6JycpO3N0cmluZys9JyAnK3RoaXMuX2lkO2lmKHRoaXMuX2RvbU5vZGUpCnN0cmluZys9JyAoJyt0aGlzLl9kb21Ob2RlLm5vZGVOYW1lKCkrJyknO2lmKHRoaXM9PT1pbnNwZWN0ZWROb2RlKQpzdHJpbmcrPScgKic7Zm9yKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4oKSkKc3RyaW5nKz0nXG4nK2NoaWxkLnByaW50U2VsZkFuZENoaWxkcmVuKGluc3BlY3RlZE5vZGUsKGxlYWRpbmdTcGFjZXx8JycpKycgICcpO3JldHVybiBzdHJpbmc7fX07QWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TW9kZWw9Y2xhc3MgZXh0ZW5kcyBTREsuU0RLTW9kZWx7Y29uc3RydWN0b3IodGFyZ2V0KXtzdXBlcih0YXJnZXQpO3RoaXMuX2FnZW50PXRhcmdldC5hY2Nlc3NpYmlsaXR5QWdlbnQoKTt0aGlzLl9heElkVG9BWE5vZGU9bmV3IE1hcCgpO3RoaXMuX2JhY2tlbmRET01Ob2RlSWRUb0FYTm9kZT1uZXcgTWFwKCk7fQpjbGVhcigpe3RoaXMuX2F4SWRUb0FYTm9kZS5jbGVhcigpO30KYXN5bmMgcmVxdWVzdFBhcnRpYWxBWFRyZWUobm9kZSl7Y29uc3QgcGF5bG9hZHM9YXdhaXQgdGhpcy5fYWdlbnQuZ2V0UGFydGlhbEFYVHJlZShub2RlLmlkLHVuZGVmaW5lZCx1bmRlZmluZWQsdHJ1ZSk7aWYoIXBheWxvYWRzKQpyZXR1cm47Zm9yKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHMpCm5ldyBBY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlKHRoaXMscGF5bG9hZCk7Zm9yKGNvbnN0IGF4Tm9kZSBvZiB0aGlzLl9heElkVG9BWE5vZGUudmFsdWVzKCkpe2Zvcihjb25zdCBheENoaWxkIG9mIGF4Tm9kZS5jaGlsZHJlbigpKQpheENoaWxkLl9zZXRQYXJlbnROb2RlKGF4Tm9kZSk7fX0KYXhOb2RlRm9ySWQoYXhJZCl7cmV0dXJuIHRoaXMuX2F4SWRUb0FYTm9kZS5nZXQoYXhJZCk7fQpfc2V0QVhOb2RlRm9yQVhJZChheElkLGF4Tm9kZSl7dGhpcy5fYXhJZFRvQVhOb2RlLnNldChheElkLGF4Tm9kZSk7fQpheE5vZGVGb3JET01Ob2RlKGRvbU5vZGUpe2lmKCFkb21Ob2RlKQpyZXR1cm4gbnVsbDtyZXR1cm4gdGhpcy5fYmFja2VuZERPTU5vZGVJZFRvQVhOb2RlLmdldChkb21Ob2RlLmJhY2tlbmROb2RlSWQoKSk7fQpfc2V0QVhOb2RlRm9yQmFja2VuZERPTU5vZGVJZChiYWNrZW5kRE9NTm9kZUlkLGF4Tm9kZSl7dGhpcy5fYmFja2VuZERPTU5vZGVJZFRvQVhOb2RlLnNldChiYWNrZW5kRE9NTm9kZUlkLGF4Tm9kZSk7fQpsb2dUcmVlKGluc3BlY3RlZE5vZGUpe2xldCByb290Tm9kZT1pbnNwZWN0ZWROb2RlO3doaWxlKHJvb3ROb2RlLnBhcmVudE5vZGUoKSkKcm9vdE5vZGU9cm9vdE5vZGUucGFyZW50Tm9kZSgpO2NvbnNvbGUubG9nKHJvb3ROb2RlLnByaW50U2VsZkFuZENoaWxkcmVuKGluc3BlY3RlZE5vZGUpKTt9fTtTREsuU0RLTW9kZWwucmVnaXN0ZXIoQWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TW9kZWwsU0RLLlRhcmdldC5DYXBhYmlsaXR5LkRPTSxmYWxzZSk7O0FjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVNpZGViYXJWaWV3PWNsYXNzIGV4dGVuZHMgVUkuVGhyb3R0bGVkV2lkZ2V0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9ub2RlPW51bGw7dGhpcy5fYXhOb2RlPW51bGw7dGhpcy5fc2tpcE5leHRQdWxsTm9kZT1mYWxzZTt0aGlzLl9zaWRlYmFyUGFuZVN0YWNrPVVJLnZpZXdNYW5hZ2VyLmNyZWF0ZVN0YWNrTG9jYXRpb24oKTt0aGlzLl9icmVhZGNydW1ic1N1YlBhbmU9bmV3IEFjY2Vzc2liaWxpdHkuQVhCcmVhZGNydW1ic1BhbmUodGhpcyk7dGhpcy5fc2lkZWJhclBhbmVTdGFjay5zaG93Vmlldyh0aGlzLl9icmVhZGNydW1ic1N1YlBhbmUpO3RoaXMuX2FyaWFTdWJQYW5lPW5ldyBBY2Nlc3NpYmlsaXR5LkFSSUFBdHRyaWJ1dGVzUGFuZSgpO3RoaXMuX3NpZGViYXJQYW5lU3RhY2suc2hvd1ZpZXcodGhpcy5fYXJpYVN1YlBhbmUpO3RoaXMuX2F4Tm9kZVN1YlBhbmU9bmV3IEFjY2Vzc2liaWxpdHkuQVhOb2RlU3ViUGFuZSgpO3RoaXMuX3NpZGViYXJQYW5lU3RhY2suc2hvd1ZpZXcodGhpcy5fYXhOb2RlU3ViUGFuZSk7dGhpcy5fc2lkZWJhclBhbmVTdGFjay53aWRnZXQoKS5zaG93KHRoaXMuZWxlbWVudCk7VUkuY29udGV4dC5hZGRGbGF2b3JDaGFuZ2VMaXN0ZW5lcihTREsuRE9NTm9kZSx0aGlzLl9wdWxsTm9kZSx0aGlzKTt0aGlzLl9wdWxsTm9kZSgpO30Kbm9kZSgpe3JldHVybiB0aGlzLl9ub2RlO30KYXhOb2RlKCl7cmV0dXJuIHRoaXMuX2F4Tm9kZTt9CnNldE5vZGUobm9kZSxmcm9tQVhUcmVlKXt0aGlzLl9za2lwTmV4dFB1bGxOb2RlPSEhZnJvbUFYVHJlZTt0aGlzLl9ub2RlPW5vZGU7dGhpcy51cGRhdGUoKTt9CmFjY2Vzc2liaWxpdHlOb2RlQ2FsbGJhY2soYXhOb2RlKXtpZighYXhOb2RlKQpyZXR1cm47dGhpcy5fYXhOb2RlPWF4Tm9kZTtpZihheE5vZGUuaXNET01Ob2RlKCkpCnRoaXMuX3NpZGViYXJQYW5lU3RhY2suc2hvd1ZpZXcodGhpcy5fYXJpYVN1YlBhbmUsdGhpcy5fYXhOb2RlU3ViUGFuZSk7ZWxzZQp0aGlzLl9zaWRlYmFyUGFuZVN0YWNrLnJlbW92ZVZpZXcodGhpcy5fYXJpYVN1YlBhbmUpO2lmKHRoaXMuX2F4Tm9kZVN1YlBhbmUpCnRoaXMuX2F4Tm9kZVN1YlBhbmUuc2V0QVhOb2RlKGF4Tm9kZSk7aWYodGhpcy5fYnJlYWRjcnVtYnNTdWJQYW5lKQp0aGlzLl9icmVhZGNydW1ic1N1YlBhbmUuc2V0QVhOb2RlKGF4Tm9kZSk7fQpkb1VwZGF0ZSgpe2NvbnN0IG5vZGU9dGhpcy5ub2RlKCk7dGhpcy5fYXhOb2RlU3ViUGFuZS5zZXROb2RlKG5vZGUpO3RoaXMuX2FyaWFTdWJQYW5lLnNldE5vZGUobm9kZSk7dGhpcy5fYnJlYWRjcnVtYnNTdWJQYW5lLnNldE5vZGUobm9kZSk7aWYoIW5vZGUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCBhY2Nlc3NpYmlsaXR5TW9kZWw9bm9kZS5kb21Nb2RlbCgpLnRhcmdldCgpLm1vZGVsKEFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1vZGVsKTthY2Nlc3NpYmlsaXR5TW9kZWwuY2xlYXIoKTtyZXR1cm4gYWNjZXNzaWJpbGl0eU1vZGVsLnJlcXVlc3RQYXJ0aWFsQVhUcmVlKG5vZGUpLnRoZW4oKCk9Pnt0aGlzLmFjY2Vzc2liaWxpdHlOb2RlQ2FsbGJhY2soYWNjZXNzaWJpbGl0eU1vZGVsLmF4Tm9kZUZvckRPTU5vZGUobm9kZSkpO30pO30Kd2FzU2hvd24oKXtzdXBlci53YXNTaG93bigpO3RoaXMuX2JyZWFkY3J1bWJzU3ViUGFuZS5zZXROb2RlKHRoaXMubm9kZSgpKTt0aGlzLl9icmVhZGNydW1ic1N1YlBhbmUuc2V0QVhOb2RlKHRoaXMuYXhOb2RlKCkpO3RoaXMuX2F4Tm9kZVN1YlBhbmUuc2V0Tm9kZSh0aGlzLm5vZGUoKSk7dGhpcy5fYXhOb2RlU3ViUGFuZS5zZXRBWE5vZGUodGhpcy5heE5vZGUoKSk7dGhpcy5fYXJpYVN1YlBhbmUuc2V0Tm9kZSh0aGlzLm5vZGUoKSk7U0RLLnRhcmdldE1hbmFnZXIuYWRkTW9kZWxMaXN0ZW5lcihTREsuRE9NTW9kZWwsU0RLLkRPTU1vZGVsLkV2ZW50cy5BdHRyTW9kaWZpZWQsdGhpcy5fb25BdHRyQ2hhbmdlLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRPTU1vZGVsLFNESy5ET01Nb2RlbC5FdmVudHMuQXR0clJlbW92ZWQsdGhpcy5fb25BdHRyQ2hhbmdlLHRoaXMpO1NESy50YXJnZXRNYW5hZ2VyLmFkZE1vZGVsTGlzdGVuZXIoU0RLLkRPTU1vZGVsLFNESy5ET01Nb2RlbC5FdmVudHMuQ2hhcmFjdGVyRGF0YU1vZGlmaWVkLHRoaXMuX29uTm9kZUNoYW5nZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5hZGRNb2RlbExpc3RlbmVyKFNESy5ET01Nb2RlbCxTREsuRE9NTW9kZWwuRXZlbnRzLkNoaWxkTm9kZUNvdW50VXBkYXRlZCx0aGlzLl9vbk5vZGVDaGFuZ2UsdGhpcyk7fQp3aWxsSGlkZSgpe1NESy50YXJnZXRNYW5hZ2VyLnJlbW92ZU1vZGVsTGlzdGVuZXIoU0RLLkRPTU1vZGVsLFNESy5ET01Nb2RlbC5FdmVudHMuQXR0ck1vZGlmaWVkLHRoaXMuX29uQXR0ckNoYW5nZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5yZW1vdmVNb2RlbExpc3RlbmVyKFNESy5ET01Nb2RlbCxTREsuRE9NTW9kZWwuRXZlbnRzLkF0dHJSZW1vdmVkLHRoaXMuX29uQXR0ckNoYW5nZSx0aGlzKTtTREsudGFyZ2V0TWFuYWdlci5yZW1vdmVNb2RlbExpc3RlbmVyKFNESy5ET01Nb2RlbCxTREsuRE9NTW9kZWwuRXZlbnRzLkNoYXJhY3RlckRhdGFNb2RpZmllZCx0aGlzLl9vbk5vZGVDaGFuZ2UsdGhpcyk7U0RLLnRhcmdldE1hbmFnZXIucmVtb3ZlTW9kZWxMaXN0ZW5lcihTREsuRE9NTW9kZWwsU0RLLkRPTU1vZGVsLkV2ZW50cy5DaGlsZE5vZGVDb3VudFVwZGF0ZWQsdGhpcy5fb25Ob2RlQ2hhbmdlLHRoaXMpO30KX3B1bGxOb2RlKCl7aWYodGhpcy5fc2tpcE5leHRQdWxsTm9kZSl7dGhpcy5fc2tpcE5leHRQdWxsTm9kZT1mYWxzZTtyZXR1cm47fQp0aGlzLnNldE5vZGUoVUkuY29udGV4dC5mbGF2b3IoU0RLLkRPTU5vZGUpKTt9Cl9vbkF0dHJDaGFuZ2UoZXZlbnQpe2lmKCF0aGlzLm5vZGUoKSkKcmV0dXJuO2NvbnN0IG5vZGU9ZXZlbnQuZGF0YS5ub2RlO2lmKHRoaXMubm9kZSgpIT09bm9kZSkKcmV0dXJuO3RoaXMudXBkYXRlKCk7fQpfb25Ob2RlQ2hhbmdlKGV2ZW50KXtpZighdGhpcy5ub2RlKCkpCnJldHVybjtjb25zdCBub2RlPWV2ZW50LmRhdGE7aWYodGhpcy5ub2RlKCkhPT1ub2RlKQpyZXR1cm47dGhpcy51cGRhdGUoKTt9fTtBY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlTdWJQYW5lPWNsYXNzIGV4dGVuZHMgVUkuU2ltcGxlVmlld3tjb25zdHJ1Y3RvcihuYW1lKXtzdXBlcihuYW1lKTt0aGlzLl9heE5vZGU9bnVsbDt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eVByb3BlcnRpZXMuY3NzJyk7fQpzZXRBWE5vZGUoYXhOb2RlKXt9Cm5vZGUoKXtyZXR1cm4gdGhpcy5fbm9kZTt9CnNldE5vZGUobm9kZSl7dGhpcy5fbm9kZT1ub2RlO30KY3JlYXRlSW5mbyh0ZXh0Q29udGVudCxjbGFzc05hbWUpe2NvbnN0IGNsYXNzTmFtZU9yRGVmYXVsdD1jbGFzc05hbWV8fCdncmF5LWluZm8tbWVzc2FnZSc7Y29uc3QgaW5mbz10aGlzLmVsZW1lbnQuY3JlYXRlQ2hpbGQoJ2RpdicsY2xhc3NOYW1lT3JEZWZhdWx0KTtpbmZvLnRleHRDb250ZW50PXRleHRDb250ZW50O3JldHVybiBpbmZvO30KY3JlYXRlVHJlZU91dGxpbmUoKXtjb25zdCB0cmVlT3V0bGluZT1uZXcgVUkuVHJlZU91dGxpbmVJblNoYWRvdygpO3RyZWVPdXRsaW5lLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eU5vZGUuY3NzJyk7dHJlZU91dGxpbmUucmVnaXN0ZXJSZXF1aXJlZENTUygnYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5UHJvcGVydGllcy5jc3MnKTt0cmVlT3V0bGluZS5yZWdpc3RlclJlcXVpcmVkQ1NTKCdvYmplY3RfdWkvb2JqZWN0VmFsdWUuY3NzJyk7dHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0cmVlT3V0bGluZS5oaWRlT3ZlcmZsb3coKTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodHJlZU91dGxpbmUuZWxlbWVudCk7cmV0dXJuIHRyZWVPdXRsaW5lO319OztBY2Nlc3NpYmlsaXR5LkFYTm9kZVN1YlBhbmU9Y2xhc3MgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlTdWJQYW5le2NvbnN0cnVjdG9yKCl7c3VwZXIobHNgQ29tcHV0ZWQgUHJvcGVydGllc2ApO3RoaXMuY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXgtc3VicGFuZScpO3RoaXMuX25vTm9kZUluZm89dGhpcy5jcmVhdGVJbmZvKGxzYE5vIGFjY2Vzc2liaWxpdHkgbm9kZWApO3RoaXMuX2lnbm9yZWRJbmZvPXRoaXMuY3JlYXRlSW5mbyhsc2BBY2Nlc3NpYmlsaXR5IG5vZGUgbm90IGV4cG9zZWRgLCdheC1pZ25vcmVkLWluZm8gaGlkZGVuJyk7dGhpcy5fdHJlZU91dGxpbmU9dGhpcy5jcmVhdGVUcmVlT3V0bGluZSgpO3RoaXMuX2lnbm9yZWRSZWFzb25zVHJlZT10aGlzLmNyZWF0ZVRyZWVPdXRsaW5lKCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjY2Vzc2liaWxpdHktY29tcHV0ZWQnKTt0aGlzLnJlZ2lzdGVyUmVxdWlyZWRDU1MoJ2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eU5vZGUuY3NzJyk7fQpzZXRBWE5vZGUoYXhOb2RlKXtpZih0aGlzLl9heE5vZGU9PT1heE5vZGUpCnJldHVybjt0aGlzLl9heE5vZGU9YXhOb2RlO2NvbnN0IHRyZWVPdXRsaW5lPXRoaXMuX3RyZWVPdXRsaW5lO3RyZWVPdXRsaW5lLnJlbW92ZUNoaWxkcmVuKCk7Y29uc3QgaWdub3JlZFJlYXNvbnM9dGhpcy5faWdub3JlZFJlYXNvbnNUcmVlO2lnbm9yZWRSZWFzb25zLnJlbW92ZUNoaWxkcmVuKCk7aWYoIWF4Tm9kZSl7dHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0aGlzLl9pZ25vcmVkSW5mby5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtpZ25vcmVkUmVhc29ucy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX25vTm9kZUluZm8uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2F4LWlnbm9yZWQtbm9kZS1wYW5lJyk7cmV0dXJuO30KaWYoYXhOb2RlLmlnbm9yZWQoKSl7dGhpcy5fbm9Ob2RlSW5mby5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTt0cmVlT3V0bGluZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1pZ25vcmVkLW5vZGUtcGFuZScpO3RoaXMuX2lnbm9yZWRJbmZvLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2lnbm9yZWRSZWFzb25zLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7ZnVuY3Rpb24gYWRkSWdub3JlZFJlYXNvbihwcm9wZXJ0eSl7aWdub3JlZFJlYXNvbnMuYXBwZW5kQ2hpbGQobmV3IEFjY2Vzc2liaWxpdHkuQVhOb2RlSWdub3JlZFJlYXNvblRyZWVFbGVtZW50KHByb3BlcnR5LChheE5vZGUpKSk7fQpjb25zdCBpZ25vcmVkUmVhc29uc0FycmF5PShheE5vZGUuaWdub3JlZFJlYXNvbnMoKSk7Zm9yKGNvbnN0IHJlYXNvbiBvZiBpZ25vcmVkUmVhc29uc0FycmF5KQphZGRJZ25vcmVkUmVhc29uKHJlYXNvbik7aWYoIWlnbm9yZWRSZWFzb25zLmZpcnN0Q2hpbGQoKSkKaWdub3JlZFJlYXNvbnMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtyZXR1cm47fQp0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYXgtaWdub3JlZC1ub2RlLXBhbmUnKTt0aGlzLl9pZ25vcmVkSW5mby5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtpZ25vcmVkUmVhc29ucy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO3RoaXMuX25vTm9kZUluZm8uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7dHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtmdW5jdGlvbiBhZGRQcm9wZXJ0eShwcm9wZXJ0eSl7dHJlZU91dGxpbmUuYXBwZW5kQ2hpbGQobmV3IEFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlUHJvcGVydHlFbGVtZW50KHByb3BlcnR5LChheE5vZGUpKSk7fQpmb3IoY29uc3QgcHJvcGVydHkgb2YgYXhOb2RlLmNvcmVQcm9wZXJ0aWVzKCkpCmFkZFByb3BlcnR5KHByb3BlcnR5KTtjb25zdCByb2xlUHJvcGVydHk9KHtuYW1lOidyb2xlJyx2YWx1ZTpheE5vZGUucm9sZSgpfSk7YWRkUHJvcGVydHkocm9sZVByb3BlcnR5KTtmb3IoY29uc3QgcHJvcGVydHkgb2YoYXhOb2RlLnByb3BlcnRpZXMoKSkpCmFkZFByb3BlcnR5KHByb3BlcnR5KTt9CnNldE5vZGUobm9kZSl7c3VwZXIuc2V0Tm9kZShub2RlKTt0aGlzLl9heE5vZGU9bnVsbDt9fTtBY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBVSS5UcmVlRWxlbWVudHtjb25zdHJ1Y3RvcihheE5vZGUpe3N1cGVyKCcnKTt0aGlzLl9heE5vZGU9YXhOb2RlO30Kc3RhdGljIGNyZWF0ZVNpbXBsZVZhbHVlRWxlbWVudCh0eXBlLHZhbHVlKXtsZXQgdmFsdWVFbGVtZW50O2NvbnN0IEFYVmFsdWVUeXBlPVByb3RvY29sLkFjY2Vzc2liaWxpdHkuQVhWYWx1ZVR5cGU7aWYoIXR5cGV8fHR5cGU9PT1BWFZhbHVlVHlwZS5WYWx1ZVVuZGVmaW5lZHx8dHlwZT09PUFYVmFsdWVUeXBlLkNvbXB1dGVkU3RyaW5nKQp2YWx1ZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudCgnc3BhbicpO2Vsc2UKdmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdtb25vc3BhY2UnKTtsZXQgdmFsdWVUZXh0O2NvbnN0IGlzU3RyaW5nUHJvcGVydHk9dHlwZSYmQWNjZXNzaWJpbGl0eS5BWE5vZGVQcm9wZXJ0eVRyZWVFbGVtZW50LlN0cmluZ1Byb3BlcnRpZXMuaGFzKHR5cGUpO2lmKGlzU3RyaW5nUHJvcGVydHkpe3ZhbHVlVGV4dD0nIicrdmFsdWUucmVwbGFjZSgvXG4vZywnXHUyMUI1JykrJyInO3ZhbHVlRWxlbWVudC5fb3JpZ2luYWxUZXh0Q29udGVudD12YWx1ZTt9ZWxzZXt2YWx1ZVRleHQ9U3RyaW5nKHZhbHVlKTt9CmlmKHR5cGUmJnR5cGUgaW4gQWNjZXNzaWJpbGl0eS5BWE5vZGVQcm9wZXJ0eVRyZWVFbGVtZW50LlR5cGVTdHlsZXMpCnZhbHVlRWxlbWVudC5jbGFzc0xpc3QuYWRkKEFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlRWxlbWVudC5UeXBlU3R5bGVzW3R5cGVdKTt2YWx1ZUVsZW1lbnQuc2V0VGV4dENvbnRlbnRUcnVuY2F0ZWRJZk5lZWRlZCh2YWx1ZVRleHR8fCcnKTt2YWx1ZUVsZW1lbnQudGl0bGU9U3RyaW5nKHZhbHVlKXx8Jyc7cmV0dXJuIHZhbHVlRWxlbWVudDt9CnN0YXRpYyBjcmVhdGVFeGNsYW1hdGlvbk1hcmsodG9vbHRpcCl7Y29uc3QgZXhjbGFtYXRpb25FbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywnZHQtaWNvbi1sYWJlbCcpO2V4Y2xhbWF0aW9uRWxlbWVudC50eXBlPSdzbWFsbGljb24td2FybmluZyc7ZXhjbGFtYXRpb25FbGVtZW50LnRpdGxlPXRvb2x0aXA7cmV0dXJuIGV4Y2xhbWF0aW9uRWxlbWVudDt9CmFwcGVuZE5hbWVFbGVtZW50KG5hbWUpe2NvbnN0IG5hbWVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBBWEF0dHJpYnV0ZXM9QWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5U3RyaW5ncy5BWEF0dHJpYnV0ZXM7aWYobmFtZSBpbiBBWEF0dHJpYnV0ZXMpe25hbWVFbGVtZW50LnRleHRDb250ZW50PWxzKEFYQXR0cmlidXRlc1tuYW1lXS5uYW1lKTtuYW1lRWxlbWVudC50aXRsZT1BWEF0dHJpYnV0ZXNbbmFtZV0uZGVzY3JpcHRpb247bmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXgtcmVhZGFibGUtbmFtZScpO31lbHNle25hbWVFbGVtZW50LnRleHRDb250ZW50PW5hbWU7bmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXgtbmFtZScpO25hbWVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vbm9zcGFjZScpO30KdGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQobmFtZUVsZW1lbnQpO30KYXBwZW5kVmFsdWVFbGVtZW50KHZhbHVlKXtjb25zdCBBWFZhbHVlVHlwZT1Qcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVUeXBlO2lmKHZhbHVlLnR5cGU9PT1BWFZhbHVlVHlwZS5JZHJlZnx8dmFsdWUudHlwZT09PUFYVmFsdWVUeXBlLk5vZGV8fHZhbHVlLnR5cGU9PT1BWFZhbHVlVHlwZS5JZHJlZkxpc3R8fHZhbHVlLnR5cGU9PT1BWFZhbHVlVHlwZS5Ob2RlTGlzdCl7dGhpcy5hcHBlbmRSZWxhdGVkTm9kZUxpc3RWYWx1ZUVsZW1lbnQodmFsdWUpO3JldHVybjt9ZWxzZSBpZih2YWx1ZS5zb3VyY2VzKXtjb25zdCBzb3VyY2VzPXZhbHVlLnNvdXJjZXM7Zm9yKGxldCBpPTA7aTxzb3VyY2VzLmxlbmd0aDtpKyspe2NvbnN0IHNvdXJjZT1zb3VyY2VzW2ldO2NvbnN0IGNoaWxkPW5ldyBBY2Nlc3NpYmlsaXR5LkFYVmFsdWVTb3VyY2VUcmVlRWxlbWVudChzb3VyY2UsdGhpcy5fYXhOb2RlKTt0aGlzLmFwcGVuZENoaWxkKGNoaWxkKTt9CnRoaXMuZXhwYW5kKCk7fQpjb25zdCBlbGVtZW50PUFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlRWxlbWVudC5jcmVhdGVTaW1wbGVWYWx1ZUVsZW1lbnQodmFsdWUudHlwZSxTdHJpbmcodmFsdWUudmFsdWUpKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTt9CmFwcGVuZFJlbGF0ZWROb2RlKHJlbGF0ZWROb2RlLGluZGV4KXtjb25zdCBkZWZlcnJlZE5vZGU9bmV3IFNESy5EZWZlcnJlZERPTU5vZGUodGhpcy5fYXhOb2RlLmFjY2Vzc2liaWxpdHlNb2RlbCgpLnRhcmdldCgpLHJlbGF0ZWROb2RlLmJhY2tlbmRET01Ob2RlSWQpO2NvbnN0IG5vZGVUcmVlRWxlbWVudD1uZXcgQWNjZXNzaWJpbGl0eS5BWFJlbGF0ZWROb2RlU291cmNlVHJlZUVsZW1lbnQoe2RlZmVycmVkTm9kZTpkZWZlcnJlZE5vZGV9LHJlbGF0ZWROb2RlKTt0aGlzLmFwcGVuZENoaWxkKG5vZGVUcmVlRWxlbWVudCk7fQphcHBlbmRSZWxhdGVkTm9kZUlubGluZShyZWxhdGVkTm9kZSl7Y29uc3QgZGVmZXJyZWROb2RlPW5ldyBTREsuRGVmZXJyZWRET01Ob2RlKHRoaXMuX2F4Tm9kZS5hY2Nlc3NpYmlsaXR5TW9kZWwoKS50YXJnZXQoKSxyZWxhdGVkTm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtjb25zdCBsaW5rZWROb2RlPW5ldyBBY2Nlc3NpYmlsaXR5LkFYUmVsYXRlZE5vZGVFbGVtZW50KHtkZWZlcnJlZE5vZGU6ZGVmZXJyZWROb2RlfSxyZWxhdGVkTm9kZSk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua2VkTm9kZS5yZW5kZXIoKSk7fQphcHBlbmRSZWxhdGVkTm9kZUxpc3RWYWx1ZUVsZW1lbnQodmFsdWUpe2lmKHZhbHVlLnJlbGF0ZWROb2Rlcy5sZW5ndGg9PT0xJiYhdmFsdWUudmFsdWUpe3RoaXMuYXBwZW5kUmVsYXRlZE5vZGVJbmxpbmUodmFsdWUucmVsYXRlZE5vZGVzWzBdKTtyZXR1cm47fQp2YWx1ZS5yZWxhdGVkTm9kZXMuZm9yRWFjaCh0aGlzLmFwcGVuZFJlbGF0ZWROb2RlLHRoaXMpO2lmKHZhbHVlLnJlbGF0ZWROb2Rlcy5sZW5ndGg8PTMpCnRoaXMuZXhwYW5kKCk7ZWxzZQp0aGlzLmNvbGxhcHNlKCk7fX07QWNjZXNzaWJpbGl0eS5BWE5vZGVQcm9wZXJ0eVRyZWVFbGVtZW50LlR5cGVTdHlsZXM9e2F0dHJpYnV0ZTonYXgtdmFsdWUtc3RyaW5nJyxib29sZWFuOidvYmplY3QtdmFsdWUtYm9vbGVhbicsYm9vbGVhbk9yVW5kZWZpbmVkOidvYmplY3QtdmFsdWUtYm9vbGVhbicsY29tcHV0ZWRTdHJpbmc6J2F4LXJlYWRhYmxlLXN0cmluZycsaWRyZWY6J2F4LXZhbHVlLXN0cmluZycsaWRyZWZMaXN0OidheC12YWx1ZS1zdHJpbmcnLGludGVnZXI6J29iamVjdC12YWx1ZS1udW1iZXInLGludGVybmFsUm9sZTonYXgtaW50ZXJuYWwtcm9sZScsbnVtYmVyOidheC12YWx1ZS1udW1iZXInLHJvbGU6J2F4LXJvbGUnLHN0cmluZzonYXgtdmFsdWUtc3RyaW5nJyx0cmlzdGF0ZTonb2JqZWN0LXZhbHVlLWJvb2xlYW4nLHZhbHVlVW5kZWZpbmVkOidheC12YWx1ZS11bmRlZmluZWQnfTtBY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZUVsZW1lbnQuU3RyaW5nUHJvcGVydGllcz1uZXcgU2V0KFtQcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVUeXBlLlN0cmluZyxQcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVUeXBlLkNvbXB1dGVkU3RyaW5nLFByb3RvY29sLkFjY2Vzc2liaWxpdHkuQVhWYWx1ZVR5cGUuSWRyZWZMaXN0LFByb3RvY29sLkFjY2Vzc2liaWxpdHkuQVhWYWx1ZVR5cGUuSWRyZWZdKTtBY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZVByb3BlcnR5RWxlbWVudD1jbGFzcyBleHRlbmRzIEFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlRWxlbWVudHtjb25zdHJ1Y3Rvcihwcm9wZXJ0eSxheE5vZGUpe3N1cGVyKGF4Tm9kZSk7dGhpcy5fcHJvcGVydHk9cHJvcGVydHk7dGhpcy50b2dnbGVPbkNsaWNrPXRydWU7dGhpcy5zZWxlY3RhYmxlPWZhbHNlO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Byb3BlcnR5Jyk7fQpvbmF0dGFjaCgpe3RoaXMuX3VwZGF0ZSgpO30KX3VwZGF0ZSgpe3RoaXMubGlzdEl0ZW1FbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7dGhpcy5hcHBlbmROYW1lRWxlbWVudCh0aGlzLl9wcm9wZXJ0eS5uYW1lKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVDaGlsZCgnc3BhbicsJ3NlcGFyYXRvcicpLnRleHRDb250ZW50PSc6XHUwMEEwJzt0aGlzLmFwcGVuZFZhbHVlRWxlbWVudCh0aGlzLl9wcm9wZXJ0eS52YWx1ZSk7fX07QWNjZXNzaWJpbGl0eS5BWFZhbHVlU291cmNlVHJlZUVsZW1lbnQ9Y2xhc3MgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZUVsZW1lbnR7Y29uc3RydWN0b3Ioc291cmNlLGF4Tm9kZSl7c3VwZXIoYXhOb2RlKTt0aGlzLl9zb3VyY2U9c291cmNlO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt9Cm9uYXR0YWNoKCl7dGhpcy5fdXBkYXRlKCk7fQphcHBlbmRSZWxhdGVkTm9kZVdpdGhJZHJlZihyZWxhdGVkTm9kZSxpbmRleCxpZHJlZil7Y29uc3QgZGVmZXJyZWROb2RlPW5ldyBTREsuRGVmZXJyZWRET01Ob2RlKHRoaXMuX2F4Tm9kZS5hY2Nlc3NpYmlsaXR5TW9kZWwoKS50YXJnZXQoKSxyZWxhdGVkTm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtjb25zdCBub2RlVHJlZUVsZW1lbnQ9bmV3IEFjY2Vzc2liaWxpdHkuQVhSZWxhdGVkTm9kZVNvdXJjZVRyZWVFbGVtZW50KHtkZWZlcnJlZE5vZGU6ZGVmZXJyZWROb2RlLGlkcmVmOmlkcmVmfSxyZWxhdGVkTm9kZSk7dGhpcy5hcHBlbmRDaGlsZChub2RlVHJlZUVsZW1lbnQpO30KYXBwZW5kSURSZWZWYWx1ZUVsZW1lbnQodmFsdWUpe2NvbnN0IHJlbGF0ZWROb2Rlcz12YWx1ZS5yZWxhdGVkTm9kZXM7Y29uc3QgaWRyZWZzPXZhbHVlLnZhbHVlLnRyaW0oKS5zcGxpdCgvXHMrLyk7aWYoaWRyZWZzLmxlbmd0aD09PTEpe2NvbnN0IGlkcmVmPWlkcmVmc1swXTtjb25zdCBtYXRjaGluZ05vZGU9cmVsYXRlZE5vZGVzLmZpbmQobm9kZT0+bm9kZS5pZHJlZj09PWlkcmVmKTtpZihtYXRjaGluZ05vZGUpCnRoaXMuYXBwZW5kUmVsYXRlZE5vZGVXaXRoSWRyZWYobWF0Y2hpbmdOb2RlLDAsaWRyZWYpO2Vsc2UKdGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IEFjY2Vzc2liaWxpdHkuQVhSZWxhdGVkTm9kZUVsZW1lbnQoe2lkcmVmOmlkcmVmfSkucmVuZGVyKCkpO31lbHNle2ZvcihsZXQgaT0wO2k8aWRyZWZzLmxlbmd0aDsrK2kpe2NvbnN0IGlkcmVmPWlkcmVmc1tpXTtjb25zdCBtYXRjaGluZ05vZGU9cmVsYXRlZE5vZGVzLmZpbmQobm9kZT0+bm9kZS5pZHJlZj09PWlkcmVmKTtpZihtYXRjaGluZ05vZGUpCnRoaXMuYXBwZW5kUmVsYXRlZE5vZGVXaXRoSWRyZWYobWF0Y2hpbmdOb2RlLGksaWRyZWYpO2Vsc2UKdGhpcy5hcHBlbmRDaGlsZChuZXcgQWNjZXNzaWJpbGl0eS5BWFJlbGF0ZWROb2RlU291cmNlVHJlZUVsZW1lbnQoe2lkcmVmOmlkcmVmfSkpO319fQphcHBlbmRSZWxhdGVkTm9kZUxpc3RWYWx1ZUVsZW1lbnQodmFsdWUpe2NvbnN0IHJlbGF0ZWROb2Rlcz12YWx1ZS5yZWxhdGVkTm9kZXM7Y29uc3QgbnVtTm9kZXM9cmVsYXRlZE5vZGVzLmxlbmd0aDtpZih2YWx1ZS50eXBlPT09UHJvdG9jb2wuQWNjZXNzaWJpbGl0eS5BWFZhbHVlVHlwZS5JZHJlZkxpc3R8fHZhbHVlLnR5cGU9PT1Qcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVUeXBlLklkcmVmKQp0aGlzLmFwcGVuZElEUmVmVmFsdWVFbGVtZW50KHZhbHVlKTtlbHNlCnN1cGVyLmFwcGVuZFJlbGF0ZWROb2RlTGlzdFZhbHVlRWxlbWVudCh2YWx1ZSk7aWYobnVtTm9kZXM8PTMpCnRoaXMuZXhwYW5kKCk7ZWxzZQp0aGlzLmNvbGxhcHNlKCk7fQphcHBlbmRTb3VyY2VOYW1lRWxlbWVudChzb3VyY2Upe2NvbnN0IG5hbWVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtjb25zdCBBWFZhbHVlU291cmNlVHlwZT1Qcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVTb3VyY2VUeXBlO2NvbnN0IHR5cGU9c291cmNlLnR5cGU7c3dpdGNoKHR5cGUpe2Nhc2UgQVhWYWx1ZVNvdXJjZVR5cGUuQXR0cmlidXRlOmNhc2UgQVhWYWx1ZVNvdXJjZVR5cGUuUGxhY2Vob2xkZXI6Y2FzZSBBWFZhbHVlU291cmNlVHlwZS5SZWxhdGVkRWxlbWVudDppZihzb3VyY2UubmF0aXZlU291cmNlKXtjb25zdCBBWE5hdGl2ZVNvdXJjZVR5cGVzPUFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVN0cmluZ3MuQVhOYXRpdmVTb3VyY2VUeXBlcztjb25zdCBuYXRpdmVTb3VyY2U9c291cmNlLm5hdGl2ZVNvdXJjZTtuYW1lRWxlbWVudC50ZXh0Q29udGVudD1scyhBWE5hdGl2ZVNvdXJjZVR5cGVzW25hdGl2ZVNvdXJjZV0ubmFtZSk7bmFtZUVsZW1lbnQudGl0bGU9bHMoQVhOYXRpdmVTb3VyY2VUeXBlc1tuYXRpdmVTb3VyY2VdLmRlc2NyaXB0aW9uKTtuYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1yZWFkYWJsZS1uYW1lJyk7YnJlYWs7fQpuYW1lRWxlbWVudC50ZXh0Q29udGVudD1zb3VyY2UuYXR0cmlidXRlO25hbWVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2F4LW5hbWUnKTtuYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtb25vc3BhY2UnKTticmVhaztkZWZhdWx0OmNvbnN0IEFYU291cmNlVHlwZXM9QWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5U3RyaW5ncy5BWFNvdXJjZVR5cGVzO2lmKHR5cGUgaW4gQVhTb3VyY2VUeXBlcyl7bmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bHMoQVhTb3VyY2VUeXBlc1t0eXBlXS5uYW1lKTtuYW1lRWxlbWVudC50aXRsZT1scyhBWFNvdXJjZVR5cGVzW3R5cGVdLmRlc2NyaXB0aW9uKTtuYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1yZWFkYWJsZS1uYW1lJyk7fWVsc2V7Y29uc29sZS53YXJuKHR5cGUsJ25vdCBpbiBBWFNvdXJjZVR5cGVzJyk7bmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bHModHlwZSk7fX0KdGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQobmFtZUVsZW1lbnQpO30KX3VwZGF0ZSgpe3RoaXMubGlzdEl0ZW1FbGVtZW50LnJlbW92ZUNoaWxkcmVuKCk7aWYodGhpcy5fc291cmNlLmludmFsaWQpe2NvbnN0IGV4Y2xhbWF0aW9uTWFyaz1BY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZUVsZW1lbnQuY3JlYXRlRXhjbGFtYXRpb25NYXJrKGxzYEludmFsaWQgc291cmNlLmApO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGV4Y2xhbWF0aW9uTWFyayk7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXgtdmFsdWUtc291cmNlLWludmFsaWQnKTt9ZWxzZSBpZih0aGlzLl9zb3VyY2Uuc3VwZXJzZWRlZCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYXgtdmFsdWUtc291cmNlLXVudXNlZCcpO30KdGhpcy5hcHBlbmRTb3VyY2VOYW1lRWxlbWVudCh0aGlzLl9zb3VyY2UpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc2VwYXJhdG9yJykudGV4dENvbnRlbnQ9JzpcdTAwYTAnO2lmKHRoaXMuX3NvdXJjZS5hdHRyaWJ1dGVWYWx1ZSl7dGhpcy5hcHBlbmRWYWx1ZUVsZW1lbnQodGhpcy5fc291cmNlLmF0dHJpYnV0ZVZhbHVlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJ1x1MDBhMCcpO31lbHNlIGlmKHRoaXMuX3NvdXJjZS5uYXRpdmVTb3VyY2VWYWx1ZSl7dGhpcy5hcHBlbmRWYWx1ZUVsZW1lbnQodGhpcy5fc291cmNlLm5hdGl2ZVNvdXJjZVZhbHVlKTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQoJ1x1MDBhMCcpO2lmKHRoaXMuX3NvdXJjZS52YWx1ZSkKdGhpcy5hcHBlbmRWYWx1ZUVsZW1lbnQodGhpcy5fc291cmNlLnZhbHVlKTt9ZWxzZSBpZih0aGlzLl9zb3VyY2UudmFsdWUpe3RoaXMuYXBwZW5kVmFsdWVFbGVtZW50KHRoaXMuX3NvdXJjZS52YWx1ZSk7fWVsc2V7Y29uc3QgdmFsdWVFbGVtZW50PUFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlRWxlbWVudC5jcmVhdGVTaW1wbGVWYWx1ZUVsZW1lbnQoUHJvdG9jb2wuQWNjZXNzaWJpbGl0eS5BWFZhbHVlVHlwZS5WYWx1ZVVuZGVmaW5lZCxsc2BOb3Qgc3BlY2lmaWVkYCk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTt0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC12YWx1ZS1zb3VyY2UtdW51c2VkJyk7fQppZih0aGlzLl9zb3VyY2UudmFsdWUmJnRoaXMuX3NvdXJjZS5zdXBlcnNlZGVkKQp0aGlzLmxpc3RJdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC12YWx1ZS1zb3VyY2Utc3VwZXJzZWRlZCcpO319O0FjY2Vzc2liaWxpdHkuQVhSZWxhdGVkTm9kZVNvdXJjZVRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgVUkuVHJlZUVsZW1lbnR7Y29uc3RydWN0b3Iobm9kZSx2YWx1ZSl7c3VwZXIoJycpO3RoaXMuX3ZhbHVlPXZhbHVlO3RoaXMuX2F4UmVsYXRlZE5vZGVFbGVtZW50PW5ldyBBY2Nlc3NpYmlsaXR5LkFYUmVsYXRlZE5vZGVFbGVtZW50KG5vZGUsdmFsdWUpO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fYXhSZWxhdGVkTm9kZUVsZW1lbnQucmVuZGVyKCkpO2lmKCF0aGlzLl92YWx1ZSkKcmV0dXJuO2lmKHRoaXMuX3ZhbHVlLnRleHQpe3RoaXMubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKEFjY2Vzc2liaWxpdHkuQVhOb2RlUHJvcGVydHlUcmVlRWxlbWVudC5jcmVhdGVTaW1wbGVWYWx1ZUVsZW1lbnQoUHJvdG9jb2wuQWNjZXNzaWJpbGl0eS5BWFZhbHVlVHlwZS5Db21wdXRlZFN0cmluZyx0aGlzLl92YWx1ZS50ZXh0KSk7fX19O0FjY2Vzc2liaWxpdHkuQVhSZWxhdGVkTm9kZUVsZW1lbnQ9Y2xhc3N7Y29uc3RydWN0b3Iobm9kZSx2YWx1ZSl7dGhpcy5fZGVmZXJyZWROb2RlPW5vZGUuZGVmZXJyZWROb2RlO3RoaXMuX2lkcmVmPW5vZGUuaWRyZWY7dGhpcy5fdmFsdWU9dmFsdWU7fQpyZW5kZXIoKXtjb25zdCBlbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtsZXQgdmFsdWVFbGVtZW50O2lmKHRoaXMuX2RlZmVycmVkTm9kZSl7dmFsdWVFbGVtZW50PWNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtlbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlRWxlbWVudCk7Q29tbW9uLkxpbmtpZmllci5saW5raWZ5KHRoaXMuX2RlZmVycmVkTm9kZSkudGhlbihsaW5rZmllZD0+dmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKGxpbmtmaWVkKSk7fWVsc2UgaWYodGhpcy5faWRyZWYpe2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaW52YWxpZCcpO3ZhbHVlRWxlbWVudD1BY2Nlc3NpYmlsaXR5LkFYTm9kZVByb3BlcnR5VHJlZUVsZW1lbnQuY3JlYXRlRXhjbGFtYXRpb25NYXJrKGxzYE5vIG5vZGUgd2l0aCB0aGlzIElELmApO3ZhbHVlRWxlbWVudC5jcmVhdGVUZXh0Q2hpbGQodGhpcy5faWRyZWYpO2VsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTt9CnJldHVybiBlbGVtZW50O319O0FjY2Vzc2liaWxpdHkuQVhOb2RlSWdub3JlZFJlYXNvblRyZWVFbGVtZW50PWNsYXNzIGV4dGVuZHMgQWNjZXNzaWJpbGl0eS5BWE5vZGVQcm9wZXJ0eVRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHByb3BlcnR5LGF4Tm9kZSl7c3VwZXIoYXhOb2RlKTt0aGlzLl9wcm9wZXJ0eT1wcm9wZXJ0eTt0aGlzLl9heE5vZGU9YXhOb2RlO3RoaXMudG9nZ2xlT25DbGljaz10cnVlO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt9CnN0YXRpYyBjcmVhdGVSZWFzb25FbGVtZW50KHJlYXNvbixheE5vZGUpe2xldCByZWFzb25FbGVtZW50PW51bGw7c3dpdGNoKHJlYXNvbil7Y2FzZSdhY3RpdmVNb2RhbERpYWxvZyc6cmVhc29uRWxlbWVudD1VSS5mb3JtYXRMb2NhbGl6ZWQoJ0VsZW1lbnQgaXMgaGlkZGVuIGJ5IGFjdGl2ZSBtb2RhbCBkaWFsb2c6XHUwMGEwJyxbXSk7YnJlYWs7Y2FzZSdhbmNlc3RvcklzTGVhZk5vZGUnOnJlYXNvbkVsZW1lbnQ9VUkuZm9ybWF0TG9jYWxpemVkKCdBbmNlc3RvclwncyBjaGlsZHJlbiBhcmUgYWxsIHByZXNlbnRhdGlvbmFsOlx1MDBhMCcsW10pO2JyZWFrO2Nhc2UnYXJpYUhpZGRlbkVsZW1lbnQnOntjb25zdCBhcmlhSGlkZGVuU3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJywnc291cmNlLWNvZGUnKS50ZXh0Q29udGVudD0nYXJpYS1oaWRkZW4nO3JlYXNvbkVsZW1lbnQ9VUkuZm9ybWF0TG9jYWxpemVkKCdFbGVtZW50IGlzICVzLicsW2FyaWFIaWRkZW5TcGFuXSk7YnJlYWs7fQpjYXNlJ2FyaWFIaWRkZW5TdWJ0cmVlJzp7Y29uc3QgYXJpYUhpZGRlblNwYW49Y3JlYXRlRWxlbWVudCgnc3BhbicsJ3NvdXJjZS1jb2RlJykudGV4dENvbnRlbnQ9J2FyaWEtaGlkZGVuJztjb25zdCB0cnVlU3Bhbj1jcmVhdGVFbGVtZW50KCdzcGFuJywnc291cmNlLWNvZGUnKS50ZXh0Q29udGVudD0ndHJ1ZSc7cmVhc29uRWxlbWVudD1VSS5mb3JtYXRMb2NhbGl6ZWQoJyVzIGlzICVzIG9uIGFuY2VzdG9yOlx1MDBhMCcsW2FyaWFIaWRkZW5TcGFuLHRydWVTcGFuXSk7YnJlYWs7fQpjYXNlJ2VtcHR5QWx0JzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBoYXMgZW1wdHkgYWx0IHRleHQuJyxbXSk7YnJlYWs7Y2FzZSdlbXB0eVRleHQnOnJlYXNvbkVsZW1lbnQ9VUkuZm9ybWF0TG9jYWxpemVkKCdObyB0ZXh0IGNvbnRlbnQuJyxbXSk7YnJlYWs7Y2FzZSdpbmVydEVsZW1lbnQnOnJlYXNvbkVsZW1lbnQ9VUkuZm9ybWF0TG9jYWxpemVkKCdFbGVtZW50IGlzIGluZXJ0LicsW10pO2JyZWFrO2Nhc2UnaW5lcnRTdWJ0cmVlJzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBpcyBpbiBhbiBpbmVydCBzdWJ0cmVlIGZyb21cdTAwYTAnLFtdKTticmVhaztjYXNlJ2luaGVyaXRzUHJlc2VudGF0aW9uJzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBpbmhlcml0cyBwcmVzZW50YXRpb25hbCByb2xlIGZyb21cdTAwYTAnLFtdKTticmVhaztjYXNlJ2xhYmVsQ29udGFpbmVyJzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnUGFydCBvZiBsYWJlbCBlbGVtZW50Olx1MDBhMCcsW10pO2JyZWFrO2Nhc2UnbGFiZWxGb3InOnJlYXNvbkVsZW1lbnQ9VUkuZm9ybWF0TG9jYWxpemVkKCdMYWJlbCBmb3JcdTAwYTAnLFtdKTticmVhaztjYXNlJ25vdFJlbmRlcmVkJzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBpcyBub3QgcmVuZGVyZWQuJyxbXSk7YnJlYWs7Y2FzZSdub3RWaXNpYmxlJzpyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBpcyBub3QgdmlzaWJsZS4nLFtdKTticmVhaztjYXNlJ3ByZXNlbnRhdGlvbmFsUm9sZSc6e2NvbnN0IHJvbGVQcmVzZW50YXRpb25TcGFuPWNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCdzb3VyY2UtY29kZScpLnRleHRDb250ZW50PSdyb2xlPScrYXhOb2RlLnJvbGUoKS52YWx1ZTtyZWFzb25FbGVtZW50PVVJLmZvcm1hdExvY2FsaXplZCgnRWxlbWVudCBoYXMgJXMuJyxbcm9sZVByZXNlbnRhdGlvblNwYW5dKTticmVhazt9CmNhc2UncHJvYmFibHlQcmVzZW50YXRpb25hbCc6cmVhc29uRWxlbWVudD1VSS5mb3JtYXRMb2NhbGl6ZWQoJ0VsZW1lbnQgaXMgcHJlc2VudGF0aW9uYWwuJyxbXSk7YnJlYWs7Y2FzZSdzdGF0aWNUZXh0VXNlZEFzTmFtZUZvcic6cmVhc29uRWxlbWVudD1VSS5mb3JtYXRMb2NhbGl6ZWQoJ1N0YXRpYyB0ZXh0IG5vZGUgaXMgdXNlZCBhcyBuYW1lIGZvclx1MDBhMCcsW10pO2JyZWFrO2Nhc2UndW5pbnRlcmVzdGluZyc6cmVhc29uRWxlbWVudD1VSS5mb3JtYXRMb2NhbGl6ZWQoJ0VsZW1lbnQgbm90IGludGVyZXN0aW5nIGZvciBhY2Nlc3NpYmlsaXR5LicsW10pO2JyZWFrO30KaWYocmVhc29uRWxlbWVudCkKcmVhc29uRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1yZWFzb24nKTtyZXR1cm4gcmVhc29uRWxlbWVudDt9Cm9uYXR0YWNoKCl7dGhpcy5saXN0SXRlbUVsZW1lbnQucmVtb3ZlQ2hpbGRyZW4oKTt0aGlzLl9yZWFzb25FbGVtZW50PUFjY2Vzc2liaWxpdHkuQVhOb2RlSWdub3JlZFJlYXNvblRyZWVFbGVtZW50LmNyZWF0ZVJlYXNvbkVsZW1lbnQodGhpcy5fcHJvcGVydHkubmFtZSx0aGlzLl9heE5vZGUpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3JlYXNvbkVsZW1lbnQpO2NvbnN0IHZhbHVlPXRoaXMuX3Byb3BlcnR5LnZhbHVlO2lmKHZhbHVlLnR5cGU9PT1Qcm90b2NvbC5BY2Nlc3NpYmlsaXR5LkFYVmFsdWVUeXBlLklkcmVmKQp0aGlzLmFwcGVuZFJlbGF0ZWROb2RlTGlzdFZhbHVlRWxlbWVudCh2YWx1ZSk7fX07O0FjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVN0cmluZ3M9e307QWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5U3RyaW5ncy5BWEF0dHJpYnV0ZXM9eydkaXNhYmxlZCc6e25hbWU6J0Rpc2FibGVkJyxkZXNjcmlwdGlvbjonSWYgdHJ1ZSwgdGhpcyBlbGVtZW50IGN1cnJlbnRseSBjYW5ub3QgYmUgaW50ZXJhY3RlZCB3aXRoLicsZ3JvdXA6J0FYR2xvYmFsU3RhdGVzJ30sJ2ludmFsaWQnOntuYW1lOidJbnZhbGlkIHVzZXIgZW50cnknLGRlc2NyaXB0aW9uOidJZiB0cnVlLCB0aGlzIGVsZW1lbnRcJ3MgdXNlci1lbnRlcmVkIHZhbHVlIGRvZXMgbm90IGNvbmZvcm0gdG8gdmFsaWRhdGlvbiByZXF1aXJlbWVudC4nLGdyb3VwOidBWEdsb2JhbFN0YXRlcyd9LCdsaXZlJzp7bmFtZTonTGl2ZSByZWdpb24nLGRlc2NyaXB0aW9uOidXaGV0aGVyIGFuZCB3aGF0IHByaW9yaXR5IG9mIGxpdmUgdXBkYXRlcyBtYXkgYmUgZXhwZWN0ZWQgZm9yIHRoaXMgZWxlbWVudC4nLGdyb3VwOidBWExpdmVSZWdpb25BdHRyaWJ1dGVzJ30sJ2F0b21pYyc6e25hbWU6J0F0b21pYyAobGl2ZSByZWdpb25zKScsZGVzY3JpcHRpb246J0lmIHRoaXMgZWxlbWVudCBtYXkgcmVjZWl2ZSBsaXZlIHVwZGF0ZXMsIHdoZXRoZXIgdGhlIGVudGlyZSBsaXZlIHJlZ2lvbiBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIG9uIGNoYW5nZXMsIG9yIG9ubHkgY2hhbmdlZCBub2Rlcy4nLGdyb3VwOidBWExpdmVSZWdpb25BdHRyaWJ1dGVzJ30sJ3JlbGV2YW50Jzp7bmFtZTonUmVsZXZhbnQgKGxpdmUgcmVnaW9ucyknLGRlc2NyaXB0aW9uOidJZiB0aGlzIGVsZW1lbnQgbWF5IHJlY2VpdmUgbGl2ZSB1cGRhdGVzLCB3aGF0IHR5cGUgb2YgdXBkYXRlcyBzaG91bGQgdHJpZ2dlciBhIG5vdGlmaWNhdGlvbi4nLGdyb3VwOidBWExpdmVSZWdpb25BdHRyaWJ1dGVzJ30sJ2J1c3knOntuYW1lOidCdXN5IChsaXZlIHJlZ2lvbnMpJyxkZXNjcmlwdGlvbjonV2hldGhlciB0aGlzIGVsZW1lbnQgb3IgaXRzIHN1YnRyZWUgYXJlIGN1cnJlbnRseSBiZWluZyB1cGRhdGVkIChhbmQgdGh1cyBtYXkgYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlKS4nLGdyb3VwOidBWExpdmVSZWdpb25BdHRyaWJ1dGVzJ30sJ3Jvb3QnOntuYW1lOidMaXZlIHJlZ2lvbiByb290JyxkZXNjcmlwdGlvbjonSWYgdGhpcyBlbGVtZW50IG1heSByZWNlaXZlIGxpdmUgdXBkYXRlcywgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgY29udGFpbmluZyBsaXZlIHJlZ2lvbi4nLGdyb3VwOidBWExpdmVSZWdpb25BdHRyaWJ1dGVzJ30sJ2F1dG9jb21wbGV0ZSc6e25hbWU6J0hhcyBhdXRvY29tcGxldGUnLGRlc2NyaXB0aW9uOidXaGV0aGVyIGFuZCB3aGF0IHR5cGUgb2YgYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zIGFyZSBjdXJyZW50bHkgcHJvdmlkZWQgYnkgdGhpcyBlbGVtZW50LicsZ3JvdXA6J0FYV2lkZ2V0QXR0cmlidXRlcyd9LCdoYXNwb3B1cCc6e25hbWU6J0hhcyBwb3B1cCcsZGVzY3JpcHRpb246J1doZXRoZXIgdGhpcyBlbGVtZW50IGhhcyBjYXVzZWQgc29tZSBraW5kIG9mIHBvcC11cCAoc3VjaCBhcyBhIG1lbnUpIHRvIGFwcGVhci4nLGdyb3VwOidBWFdpZGdldEF0dHJpYnV0ZXMnfSwnbGV2ZWwnOntuYW1lOidMZXZlbCcsZGVzY3JpcHRpb246J1RoZSBoaWVyYXJjaGljYWwgbGV2ZWwgb2YgdGhpcyBlbGVtZW50LicsZ3JvdXA6J0FYV2lkZ2V0QXR0cmlidXRlcyd9LCdtdWx0aXNlbGVjdGFibGUnOntuYW1lOidNdWx0aS1zZWxlY3RhYmxlJyxkZXNjcmlwdGlvbjonV2hldGhlciBhIHVzZXIgbWF5IHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgd2lkZ2V0LicsZ3JvdXA6J0FYV2lkZ2V0QXR0cmlidXRlcyd9LCdvcmllbnRhdGlvbic6e25hbWU6J09yaWVudGF0aW9uJyxkZXNjcmlwdGlvbjonV2hldGhlciB0aGlzIGxpbmVhciBlbGVtZW50XCdzIG9yaWVudGF0aW9uIGlzIGhvcml6b250YWwgb3IgdmVydGljYWwuJyxncm91cDonQVhXaWRnZXRBdHRyaWJ1dGVzJ30sJ211bHRpbGluZSc6e25hbWU6J011bHRpLWxpbmUnLGRlc2NyaXB0aW9uOidXaGV0aGVyIHRoaXMgdGV4dGJveCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIGxpbmUuJyxncm91cDonQVhXaWRnZXRBdHRyaWJ1dGVzJ30sJ3JlYWRvbmx5Jzp7bmFtZTonUmVhZC1vbmx5JyxkZXNjcmlwdGlvbjonSWYgdHJ1ZSwgdGhpcyBlbGVtZW50IG1heSBiZSBpbnRlcmFjdGVkIHdpdGgsIGJ1dCBpdHMgdmFsdWUgY2Fubm90IGJlIGNoYW5nZWQuJyxncm91cDonQVhXaWRnZXRBdHRyaWJ1dGVzJ30sJ3JlcXVpcmVkJzp7bmFtZTonUmVxdWlyZWQnLGRlc2NyaXB0aW9uOidXaGV0aGVyIHRoaXMgZWxlbWVudCBpcyBhIHJlcXVpcmVkIGZpZWxkIGluIGEgZm9ybS4nLGdyb3VwOidBWFdpZGdldEF0dHJpYnV0ZXMnfSwndmFsdWVtaW4nOntuYW1lOidNaW5pbXVtIHZhbHVlJyxkZXNjcmlwdGlvbjonRm9yIGEgcmFuZ2Ugd2lkZ2V0LCB0aGUgbWluaW11bSBhbGxvd2VkIHZhbHVlLicsZ3JvdXA6J0FYV2lkZ2V0QXR0cmlidXRlcyd9LCd2YWx1ZW1heCc6e25hbWU6J01heGltdW0gdmFsdWUnLGRlc2NyaXB0aW9uOidGb3IgYSByYW5nZSB3aWRnZXQsIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuJyxncm91cDonQVhXaWRnZXRBdHRyaWJ1dGVzJ30sJ3ZhbHVldGV4dCc6e25hbWU6J1ZhbHVlIGRlc2NyaXB0aW9uJyxkZXNjcmlwdGlvbjonQSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSB2YWx1ZSBvZiBhIHJhbmdlIHdpZGdldCAod2hlcmUgbmVjZXNzYXJ5KS4nLGdyb3VwOidBWFdpZGdldEF0dHJpYnV0ZXMnfSwnY2hlY2tlZCc6e25hbWU6J0NoZWNrZWQnLGRlc2NyaXB0aW9uOidXaGV0aGVyIHRoaXMgY2hlY2tib3gsIHJhZGlvIGJ1dHRvbiBvciB0cmVlIGl0ZW0gaXMgY2hlY2tlZCwgdW5jaGVja2VkLCBvciBtaXhlZCAoZS5nLiBoYXMgYm90aCBjaGVja2VkIGFuZCB1bi1jaGVja2VkIGNoaWxkcmVuKS4nLGdyb3VwOidBWFdpZGdldFN0YXRlcyd9LCdleHBhbmRlZCc6e25hbWU6J0V4cGFuZGVkJyxkZXNjcmlwdGlvbjonV2hldGhlciB0aGlzIGVsZW1lbnQsIG9yIGFub3RoZXIgZ3JvdXBpbmcgZWxlbWVudCBpdCBjb250cm9scywgaXMgZXhwYW5kZWQuJyxncm91cDonQVhXaWRnZXRTdGF0ZXMnfSwncHJlc3NlZCc6e25hbWU6J1ByZXNzZWQnLGRlc2NyaXB0aW9uOidXaGV0aGVyIHRoaXMgdG9nZ2xlIGJ1dHRvbiBpcyBjdXJyZW50bHkgaW4gYSBwcmVzc2VkIHN0YXRlLicsZ3JvdXA6J0FYV2lkZ2V0U3RhdGVzJ30sJ3NlbGVjdGVkJzp7bmFtZTonU2VsZWN0ZWQnLGRlc2NyaXB0aW9uOidXaGV0aGVyIHRoZSBvcHRpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBlbGVtZW50IGlzIGN1cnJlbnRseSBzZWxlY3RlZC4nLGdyb3VwOidBWFdpZGdldFN0YXRlcyd9LCdhY3RpdmVkZXNjZW5kYW50Jzp7bmFtZTonQWN0aXZlIGRlc2NlbmRhbnQnLGRlc2NyaXB0aW9uOidUaGUgZGVzY2VuZGFudCBvZiB0aGlzIGVsZW1lbnQgd2hpY2ggaXMgYWN0aXZlOyBpLmUuIHRoZSBlbGVtZW50IHRvIHdoaWNoIGZvY3VzIHNob3VsZCBiZSBkZWxlZ2F0ZWQuJyxncm91cDonQVhSZWxhdGlvbnNoaXBBdHRyaWJ1dGVzJ30sJ2Zsb3d0byc6e25hbWU6J0Zsb3dzIHRvJyxkZXNjcmlwdGlvbjonRWxlbWVudCB0byB3aGljaCB0aGUgdXNlciBtYXkgY2hvb3NlIHRvIG5hdmlnYXRlIGFmdGVyIHRoaXMgb25lLCBpbnN0ZWFkIG9mIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIERPTSBvcmRlci4nLGdyb3VwOidBWFJlbGF0aW9uc2hpcEF0dHJpYnV0ZXMnfSwnY29udHJvbHMnOntuYW1lOidDb250cm9scycsZGVzY3JpcHRpb246J0VsZW1lbnQgb3IgZWxlbWVudHMgd2hvc2UgY29udGVudCBvciBwcmVzZW5jZSBpcy9hcmUgY29udHJvbGxlZCBieSB0aGlzIHdpZGdldC4nLGdyb3VwOidBWFJlbGF0aW9uc2hpcEF0dHJpYnV0ZXMnfSwnZGVzY3JpYmVkYnknOntuYW1lOidEZXNjcmliZWQgYnknLGRlc2NyaXB0aW9uOidFbGVtZW50IG9yIGVsZW1lbnRzIHdoaWNoIGZvcm0gdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZWxlbWVudC4nLGdyb3VwOidBWFJlbGF0aW9uc2hpcEF0dHJpYnV0ZXMnfSwnbGFiZWxsZWRieSc6e25hbWU6J0xhYmVsZWQgYnknLGRlc2NyaXB0aW9uOidFbGVtZW50IG9yIGVsZW1lbnRzIHdoaWNoIG1heSBmb3JtIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4nLGdyb3VwOidBWFJlbGF0aW9uc2hpcEF0dHJpYnV0ZXMnfSwnb3ducyc6e25hbWU6J093bnMnLGRlc2NyaXB0aW9uOidFbGVtZW50IG9yIGVsZW1lbnRzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlc2NlbmRhbnRzIG9mIHRoaXMgZWxlbWVudCwgZGVzcGl0ZSBub3QgYmVpbmcgZGVzY2VuZGFudHMgaW4gdGhlIERPTS4nLGdyb3VwOidBWFJlbGF0aW9uc2hpcEF0dHJpYnV0ZXMnfSwnbmFtZSc6e25hbWU6J05hbWUnLGRlc2NyaXB0aW9uOidUaGUgY29tcHV0ZWQgbmFtZSBvZiB0aGlzIGVsZW1lbnQuJyxncm91cDonRGVmYXVsdCd9LCdyb2xlJzp7bmFtZTonUm9sZScsZGVzY3JpcHRpb246J0luZGljYXRlcyB0aGUgcHVycG9zZSBvZiB0aGlzIGVsZW1lbnQsIHN1Y2ggYXMgYSB1c2VyIGludGVyZmFjZSBpZGlvbSBmb3IgYSB3aWRnZXQsIG9yIHN0cnVjdHVyYWwgcm9sZSB3aXRoaW4gYSBkb2N1bWVudC4nLGdyb3VwOidEZWZhdWx0J30sJ3ZhbHVlJzp7bmFtZTonVmFsdWUnLGRlc2NyaXB0aW9uOidUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50OyB0aGlzIG1heSBiZSB1c2VyLXByb3ZpZGVkIG9yIGRldmVsb3Blci1wcm92aWRlZCwgZGVwZW5kaW5nIG9uIHRoZSBlbGVtZW50LicsZ3JvdXA6J0RlZmF1bHQnfSwnaGVscCc6e25hbWU6J0hlbHAnLGRlc2NyaXB0aW9uOidUaGUgY29tcHV0ZWQgaGVscCB0ZXh0IGZvciB0aGlzIGVsZW1lbnQuJyxncm91cDonRGVmYXVsdCd9LCdkZXNjcmlwdGlvbic6e25hbWU6J0Rlc2NyaXB0aW9uJyxkZXNjcmlwdGlvbjonVGhlIGFjY2Vzc2libGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgZWxlbWVudC4nLGdyb3VwOidEZWZhdWx0J319O0FjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVN0cmluZ3MuQVhTb3VyY2VUeXBlcz17J2F0dHJpYnV0ZSc6e25hbWU6J0Zyb20gYXR0cmlidXRlJyxkZXNjcmlwdGlvbjonVmFsdWUgZnJvbSBhdHRyaWJ1dGUuJ30sJ2ltcGxpY2l0Jzp7bmFtZTonSW1wbGljaXQnLGRlc2NyaXB0aW9uOidJbXBsaWNpdCB2YWx1ZS4nLH0sJ3N0eWxlJzp7bmFtZTonRnJvbSBzdHlsZScsZGVzY3JpcHRpb246J1ZhbHVlIGZyb20gc3R5bGUuJ30sJ2NvbnRlbnRzJzp7bmFtZTonQ29udGVudHMnLGRlc2NyaXB0aW9uOidWYWx1ZSBmcm9tIGVsZW1lbnQgY29udGVudHMuJ30sJ3BsYWNlaG9sZGVyJzp7bmFtZTonRnJvbSBwbGFjZWhvbGRlciBhdHRyaWJ1dGUnLGRlc2NyaXB0aW9uOidWYWx1ZSBmcm9tIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZS4nfSwncmVsYXRlZEVsZW1lbnQnOntuYW1lOidSZWxhdGVkIGVsZW1lbnQnLGRlc2NyaXB0aW9uOidWYWx1ZSBmcm9tIHJlbGF0ZWQgZWxlbWVudC4nfX07QWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5U3RyaW5ncy5BWE5hdGl2ZVNvdXJjZVR5cGVzPXsnZmlnY2FwdGlvbic6e25hbWU6J0Zyb20gY2FwdGlvbicsZGVzY3JpcHRpb246J1ZhbHVlIGZyb20gZmlnY2FwdGlvbiBlbGVtZW50Lid9LCdsYWJlbCc6e25hbWU6J0Zyb20gbGFiZWwnLGRlc2NyaXB0aW9uOidWYWx1ZSBmcm9tIGxhYmVsIGVsZW1lbnQuJ30sJ2xhYmVsZm9yJzp7bmFtZTonRnJvbSBsYWJlbCAoZm9yKScsZGVzY3JpcHRpb246J1ZhbHVlIGZyb20gbGFiZWwgZWxlbWVudCB3aXRoIGZvcj0gYXR0cmlidXRlLid9LCdsYWJlbHdyYXBwZWQnOntuYW1lOidGcm9tIGxhYmVsICh3cmFwcGVkKScsZGVzY3JpcHRpb246J1ZhbHVlIGZyb20gbGFiZWwgZWxlbWVudCB3cmFwcGVkLid9LCd0YWJsZWNhcHRpb24nOntuYW1lOidGcm9tIGNhcHRpb24nLGRlc2NyaXB0aW9uOidWYWx1ZSBmcm9tIHRhYmxlIGNhcHRpb24uJ30sJ3RpdGxlJzp7J25hbWUnOidGcm9tIHRpdGxlJywnZGVzY3JpcHRpb24nOidWYWx1ZSBmcm9tIHRpdGxlIGF0dHJpYnV0ZS4nfSwnb3RoZXInOntuYW1lOidGcm9tIG5hdGl2ZSBIVE1MJyxkZXNjcmlwdGlvbjonVmFsdWUgZnJvbSBuYXRpdmUgSFRNTCAodW5rbm93biBzb3VyY2UpLid9LH07O0FjY2Vzc2liaWxpdHkuQVJJQUF0dHJpYnV0ZXNQYW5lPWNsYXNzIGV4dGVuZHMgQWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5U3ViUGFuZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKGxzYEFSSUEgQXR0cmlidXRlc2ApO3RoaXMuX25vUHJvcGVydGllc0luZm89dGhpcy5jcmVhdGVJbmZvKGxzYE5vIEFSSUEgYXR0cmlidXRlc2ApO3RoaXMuX3RyZWVPdXRsaW5lPXRoaXMuY3JlYXRlVHJlZU91dGxpbmUoKTt9CnNldE5vZGUobm9kZSl7c3VwZXIuc2V0Tm9kZShub2RlKTt0aGlzLl90cmVlT3V0bGluZS5yZW1vdmVDaGlsZHJlbigpO2lmKCF0aGlzLm5vZGUoKSkKcmV0dXJuO2NvbnN0IHRhcmdldD10aGlzLm5vZGUoKS5kb21Nb2RlbCgpLnRhcmdldCgpO2NvbnN0IGF0dHJpYnV0ZXM9bm9kZS5hdHRyaWJ1dGVzKCk7Zm9yKGxldCBpPTA7aTxhdHRyaWJ1dGVzLmxlbmd0aDsrK2kpe2NvbnN0IGF0dHJpYnV0ZT1hdHRyaWJ1dGVzW2ldO2lmKEFjY2Vzc2liaWxpdHkuQVJJQUF0dHJpYnV0ZXNQYW5lLl9hdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlLm5hbWUpPDApCmNvbnRpbnVlO3RoaXMuX3RyZWVPdXRsaW5lLmFwcGVuZENoaWxkKG5ldyBBY2Nlc3NpYmlsaXR5LkFSSUFBdHRyaWJ1dGVzVHJlZUVsZW1lbnQodGhpcyxhdHRyaWJ1dGUsdGFyZ2V0KSk7fQpjb25zdCBmb3VuZEF0dHJpYnV0ZXM9KHRoaXMuX3RyZWVPdXRsaW5lLnJvb3RFbGVtZW50KCkuY2hpbGRDb3VudCgpIT09MCk7dGhpcy5fbm9Qcm9wZXJ0aWVzSW5mby5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLGZvdW5kQXR0cmlidXRlcyk7dGhpcy5fdHJlZU91dGxpbmUuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRkZW4nLCFmb3VuZEF0dHJpYnV0ZXMpO319O0FjY2Vzc2liaWxpdHkuQVJJQUF0dHJpYnV0ZXNUcmVlRWxlbWVudD1jbGFzcyBleHRlbmRzIFVJLlRyZWVFbGVtZW50e2NvbnN0cnVjdG9yKHBhcmVudFBhbmUsYXR0cmlidXRlLHRhcmdldCl7c3VwZXIoJycpO3RoaXMuX3BhcmVudFBhbmU9cGFyZW50UGFuZTt0aGlzLl9hdHRyaWJ1dGU9YXR0cmlidXRlO3RoaXMuc2VsZWN0YWJsZT1mYWxzZTt9CnN0YXRpYyBjcmVhdGVBUklBVmFsdWVFbGVtZW50KHZhbHVlKXtjb25zdCB2YWx1ZUVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnc3BhbicsJ21vbm9zcGFjZScpO3ZhbHVlRWxlbWVudC5zZXRUZXh0Q29udGVudFRydW5jYXRlZElmTmVlZGVkKHZhbHVlfHwnJyk7cmV0dXJuIHZhbHVlRWxlbWVudDt9Cm9uYXR0YWNoKCl7dGhpcy5fcG9wdWxhdGVMaXN0SXRlbSgpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9tb3VzZUNsaWNrLmJpbmQodGhpcykpO30KX3BvcHVsYXRlTGlzdEl0ZW0oKXt0aGlzLmxpc3RJdGVtRWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO3RoaXMuYXBwZW5kTmFtZUVsZW1lbnQodGhpcy5fYXR0cmlidXRlLm5hbWUpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmNyZWF0ZUNoaWxkKCdzcGFuJywnc2VwYXJhdG9yJykudGV4dENvbnRlbnQ9JzpcdTAwQTAnO3RoaXMuYXBwZW5kQXR0cmlidXRlVmFsdWVFbGVtZW50KHRoaXMuX2F0dHJpYnV0ZS52YWx1ZSk7fQphcHBlbmROYW1lRWxlbWVudChuYW1lKXt0aGlzLl9uYW1lRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7dGhpcy5fbmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9bmFtZTt0aGlzLl9uYW1lRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1uYW1lJyk7dGhpcy5fbmFtZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbW9ub3NwYWNlJyk7dGhpcy5saXN0SXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbmFtZUVsZW1lbnQpO30KYXBwZW5kQXR0cmlidXRlVmFsdWVFbGVtZW50KHZhbHVlKXt0aGlzLl92YWx1ZUVsZW1lbnQ9QWNjZXNzaWJpbGl0eS5BUklBQXR0cmlidXRlc1RyZWVFbGVtZW50LmNyZWF0ZUFSSUFWYWx1ZUVsZW1lbnQodmFsdWUpO3RoaXMubGlzdEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3ZhbHVlRWxlbWVudCk7fQpfbW91c2VDbGljayhldmVudCl7aWYoZXZlbnQudGFyZ2V0PT09dGhpcy5saXN0SXRlbUVsZW1lbnQpCnJldHVybjtldmVudC5jb25zdW1lKHRydWUpO3RoaXMuX3N0YXJ0RWRpdGluZygpO30KX3N0YXJ0RWRpdGluZygpe2NvbnN0IHZhbHVlRWxlbWVudD10aGlzLl92YWx1ZUVsZW1lbnQ7aWYoVUkuaXNCZWluZ0VkaXRlZCh2YWx1ZUVsZW1lbnQpKQpyZXR1cm47Y29uc3QgcHJldmlvdXNDb250ZW50PXZhbHVlRWxlbWVudC50ZXh0Q29udGVudDtmdW5jdGlvbiBibHVyTGlzdGVuZXIocHJldmlvdXNDb250ZW50LGV2ZW50KXtjb25zdCB0ZXh0PWV2ZW50LnRhcmdldC50ZXh0Q29udGVudDt0aGlzLl9lZGl0aW5nQ29tbWl0dGVkKHRleHQscHJldmlvdXNDb250ZW50KTt9CnRoaXMuX3Byb21wdD1uZXcgQWNjZXNzaWJpbGl0eS5BUklBQXR0cmlidXRlc1BhbmUuQVJJQUF0dHJpYnV0ZVByb21wdChBY2Nlc3NpYmlsaXR5LmFyaWFNZXRhZGF0YSgpLnZhbHVlc0ZvclByb3BlcnR5KHRoaXMuX25hbWVFbGVtZW50LnRleHRDb250ZW50KSx0aGlzKTt0aGlzLl9wcm9tcHQuc2V0QXV0b2NvbXBsZXRpb25UaW1lb3V0KDApO2NvbnN0IHByb3h5RWxlbWVudD10aGlzLl9wcm9tcHQuYXR0YWNoQW5kU3RhcnRFZGl0aW5nKHZhbHVlRWxlbWVudCxibHVyTGlzdGVuZXIuYmluZCh0aGlzLHByZXZpb3VzQ29udGVudCkpO3Byb3h5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9lZGl0aW5nVmFsdWVLZXlEb3duLmJpbmQodGhpcyxwcmV2aW91c0NvbnRlbnQpLGZhbHNlKTt2YWx1ZUVsZW1lbnQuZ2V0Q29tcG9uZW50U2VsZWN0aW9uKCkuc2VsZWN0QWxsQ2hpbGRyZW4odmFsdWVFbGVtZW50KTt9Cl9yZW1vdmVQcm9tcHQoKXtpZighdGhpcy5fcHJvbXB0KQpyZXR1cm47dGhpcy5fcHJvbXB0LmRldGFjaCgpO2RlbGV0ZSB0aGlzLl9wcm9tcHQ7fQpfZWRpdGluZ0NvbW1pdHRlZCh1c2VySW5wdXQscHJldmlvdXNDb250ZW50KXt0aGlzLl9yZW1vdmVQcm9tcHQoKTtpZih1c2VySW5wdXQhPT1wcmV2aW91c0NvbnRlbnQpCnRoaXMuX3BhcmVudFBhbmUubm9kZSgpLnNldEF0dHJpYnV0ZVZhbHVlKHRoaXMuX2F0dHJpYnV0ZS5uYW1lLHVzZXJJbnB1dCk7fQpfZWRpdGluZ0NhbmNlbGxlZCgpe3RoaXMuX3JlbW92ZVByb21wdCgpO3RoaXMuX3BvcHVsYXRlTGlzdEl0ZW0oKTt9Cl9lZGl0aW5nVmFsdWVLZXlEb3duKHByZXZpb3VzQ29udGVudCxldmVudCl7aWYoZXZlbnQuaGFuZGxlZCkKcmV0dXJuO2lmKGlzRW50ZXJLZXkoZXZlbnQpKXt0aGlzLl9lZGl0aW5nQ29tbWl0dGVkKGV2ZW50LnRhcmdldC50ZXh0Q29udGVudCxwcmV2aW91c0NvbnRlbnQpO2V2ZW50LmNvbnN1bWUoKTtyZXR1cm47fQppZihldmVudC5rZXlDb2RlPT09VUkuS2V5Ym9hcmRTaG9ydGN1dC5LZXlzLkVzYy5jb2RlfHxldmVudC5rZXlJZGVudGlmaWVyPT09J1UrMDAxQicpe3RoaXMuX2VkaXRpbmdDYW5jZWxsZWQoKTtldmVudC5jb25zdW1lKCk7cmV0dXJuO319fTtBY2Nlc3NpYmlsaXR5LkFSSUFBdHRyaWJ1dGVzUGFuZS5BUklBQXR0cmlidXRlUHJvbXB0PWNsYXNzIGV4dGVuZHMgVUkuVGV4dFByb21wdHtjb25zdHJ1Y3RvcihhcmlhQ29tcGxldGlvbnMsdHJlZUVsZW1lbnQpe3N1cGVyKCk7dGhpcy5pbml0aWFsaXplKHRoaXMuX2J1aWxkUHJvcGVydHlDb21wbGV0aW9ucy5iaW5kKHRoaXMpKTt0aGlzLl9hcmlhQ29tcGxldGlvbnM9YXJpYUNvbXBsZXRpb25zO3RoaXMuX3RyZWVFbGVtZW50PXRyZWVFbGVtZW50O30KX2J1aWxkUHJvcGVydHlDb21wbGV0aW9ucyhleHByZXNzaW9uLHByZWZpeCxmb3JjZSl7cHJlZml4PXByZWZpeC50b0xvd2VyQ2FzZSgpO2lmKCFwcmVmaXgmJiFmb3JjZSYmKHRoaXMuX2lzRWRpdGluZ05hbWV8fGV4cHJlc3Npb24pKQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FyaWFDb21wbGV0aW9ucy5maWx0ZXIodmFsdWU9PnZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSkubWFwKGM9Pih7dGV4dDpjfSkpKTt9fTtBY2Nlc3NpYmlsaXR5LkFSSUFBdHRyaWJ1dGVzUGFuZS5fYXR0cmlidXRlcz1bJ3JvbGUnLCdhcmlhLWJ1c3knLCdhcmlhLWNoZWNrZWQnLCdhcmlhLWRpc2FibGVkJywnYXJpYS1leHBhbmRlZCcsJ2FyaWEtZ3JhYmJlZCcsJ2FyaWEtaGlkZGVuJywnYXJpYS1pbnZhbGlkJywnYXJpYS1wcmVzc2VkJywnYXJpYS1zZWxlY3RlZCcsJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsJ2FyaWEtYXRvbWljJywnYXJpYS1hdXRvY29tcGxldGUnLCdhcmlhLWNvbnRyb2xzJywnYXJpYS1kZXNjcmliZWRieScsJ2FyaWEtZHJvcGVmZmVjdCcsJ2FyaWEtZmxvd3RvJywnYXJpYS1oYXNwb3B1cCcsJ2FyaWEtbGFiZWwnLCdhcmlhLWxhYmVsbGVkYnknLCdhcmlhLWxldmVsJywnYXJpYS1saXZlJywnYXJpYS1tdWx0aWxpbmUnLCdhcmlhLW11bHRpc2VsZWN0YWJsZScsJ2FyaWEtb3JpZW50YXRpb24nLCdhcmlhLW93bnMnLCdhcmlhLXBvc2luc2V0JywnYXJpYS1yZWFkb25seScsJ2FyaWEtcmVsZXZhbnQnLCdhcmlhLXJlcXVpcmVkJywnYXJpYS1zZXRzaXplJywnYXJpYS1zb3J0JywnYXJpYS12YWx1ZW1heCcsJ2FyaWEtdmFsdWVtaW4nLCdhcmlhLXZhbHVlbm93JywnYXJpYS12YWx1ZXRleHQnLF07O0FjY2Vzc2liaWxpdHkuQVJJQU1ldGFkYXRhPWNsYXNze2NvbnN0cnVjdG9yKGNvbmZpZyl7dGhpcy5fYXR0cmlidXRlcz1uZXcgTWFwKCk7aWYoY29uZmlnKQp0aGlzLl9pbml0aWFsaXplKGNvbmZpZyk7fQpfaW5pdGlhbGl6ZShjb25maWcpe2NvbnN0IGF0dHJpYnV0ZXM9Y29uZmlnWydhdHRyaWJ1dGVzJ107Y29uc3QgYm9vbGVhbkVudW09Wyd0cnVlJywnZmFsc2UnXTtmb3IoY29uc3QgYXR0cmlidXRlQ29uZmlnIG9mIGF0dHJpYnV0ZXMpe2lmKGF0dHJpYnV0ZUNvbmZpZy50eXBlPT09J2Jvb2xlYW4nKQphdHRyaWJ1dGVDb25maWcuZW51bT1ib29sZWFuRW51bTt0aGlzLl9hdHRyaWJ1dGVzLnNldChhdHRyaWJ1dGVDb25maWcubmFtZSxuZXcgQWNjZXNzaWJpbGl0eS5BUklBTWV0YWRhdGEuQXR0cmlidXRlKGF0dHJpYnV0ZUNvbmZpZykpO30KdGhpcy5fcm9sZU5hbWVzPWNvbmZpZ1sncm9sZXMnXS5tYXAocm9sZUNvbmZpZz0+cm9sZUNvbmZpZy5uYW1lKTt9CnZhbHVlc0ZvclByb3BlcnR5KHByb3BlcnR5KXtpZih0aGlzLl9hdHRyaWJ1dGVzLmhhcyhwcm9wZXJ0eSkpCnJldHVybiB0aGlzLl9hdHRyaWJ1dGVzLmdldChwcm9wZXJ0eSkuZ2V0RW51bSgpO2lmKHByb3BlcnR5PT09J3JvbGUnKQpyZXR1cm4gdGhpcy5fcm9sZU5hbWVzO3JldHVybltdO319O0FjY2Vzc2liaWxpdHkuYXJpYU1ldGFkYXRhPWZ1bmN0aW9uKCl7aWYoIUFjY2Vzc2liaWxpdHkuQVJJQU1ldGFkYXRhLl9pbnN0YW5jZSkKQWNjZXNzaWJpbGl0eS5BUklBTWV0YWRhdGEuX2luc3RhbmNlPW5ldyBBY2Nlc3NpYmlsaXR5LkFSSUFNZXRhZGF0YShBY2Nlc3NpYmlsaXR5LkFSSUFNZXRhZGF0YS5fY29uZmlnfHxudWxsKTtyZXR1cm4gQWNjZXNzaWJpbGl0eS5BUklBTWV0YWRhdGEuX2luc3RhbmNlO307QWNjZXNzaWJpbGl0eS5BUklBTWV0YWRhdGEuQXR0cmlidXRlPWNsYXNze2NvbnN0cnVjdG9yKGNvbmZpZyl7dGhpcy5fZW51bT1bXTtpZignZW51bSdpbiBjb25maWcpCnRoaXMuX2VudW09Y29uZmlnLmVudW07fQpnZXRFbnVtKCl7cmV0dXJuIHRoaXMuX2VudW07fX07O0FjY2Vzc2liaWxpdHkuQVJJQU1ldGFkYXRhLl9jb25maWc9eyJhdHRyaWJ1dGVzIjpbeyJ0eXBlIjoiSURSRUYiLCJuYW1lIjoiYXJpYS1hY3RpdmVkZXNjZW5kYW50In0seyJkZWZhdWx0IjoiZmFsc2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm5hbWUiOiJhcmlhLWF0b21pYyJ9LHsiZGVmYXVsdCI6Im5vbmUiLCJlbnVtIjpbImlubGluZSIsImxpc3QiLCJib3RoIiwibm9uZSJdLCJ0eXBlIjoidG9rZW4iLCJuYW1lIjoiYXJpYS1hdXRvY29tcGxldGUifSx7ImRlZmF1bHQiOiJmYWxzZSIsInR5cGUiOiJib29sZWFuIiwibmFtZSI6ImFyaWEtYnVzeSJ9LHsiZGVmYXVsdCI6InVuZGVmaW5lZCIsImVudW0iOlsidHJ1ZSIsImZhbHNlIiwibWl4ZWQiLCJ1bmRlZmluZWQiXSwidHlwZSI6InRva2VuIiwibmFtZSI6ImFyaWEtY2hlY2tlZCJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1jb2xjb3VudCJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1jb2xpbmRleCJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1jb2xzcGFuIn0seyJ0eXBlIjoiSURSRUZfbGlzdCIsIm5hbWUiOiJhcmlhLWNvbnRyb2xzIn0seyJkZWZhdWx0IjoiZmFsc2UiLCJlbnVtIjpbInBhZ2UiLCJzdGVwIiwibG9jYXRpb24iLCJkYXRlIiwidGltZSIsInRydWUiLCJmYWxzZSJdLCJ0eXBlIjoidG9rZW4iLCJuYW1lIjoiYXJpYS1jdXJyZW50In0seyJ0eXBlIjoiSURSRUZfbGlzdCIsIm5hbWUiOiJhcmlhLWRlc2NyaWJlZGJ5In0seyJ0eXBlIjoiSURSRUYiLCJuYW1lIjoiYXJpYS1kZXRhaWxzIn0seyJkZWZhdWx0IjoiZmFsc2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm5hbWUiOiJhcmlhLWRpc2FibGVkIn0seyJkZWZhdWx0Ijoibm9uZSIsImVudW0iOlsiY29weSIsIm1vdmUiLCJsaW5rIiwiZXhlY3V0ZSIsInBvcHVwIiwibm9uZSJdLCJ0eXBlIjoidG9rZW5fbGlzdCIsIm5hbWUiOiJhcmlhLWRyb3BlZmZlY3QifSx7InR5cGUiOiJJRFJFRiIsIm5hbWUiOiJhcmlhLWVycm9ybWVzc2FnZSJ9LHsiZGVmYXVsdCI6InVuZGVmaW5lZCIsImVudW0iOlsidHJ1ZSIsImZhbHNlIiwidW5kZWZpbmVkIl0sInR5cGUiOiJ0b2tlbiIsIm5hbWUiOiJhcmlhLWV4cGFuZGVkIn0seyJ0eXBlIjoiSURSRUZfbGlzdCIsIm5hbWUiOiJhcmlhLWZsb3d0byJ9LHsiZGVmYXVsdCI6InVuZGVmaW5lZCIsImVudW0iOlsidHJ1ZSIsImZhbHNlIiwidW5kZWZpbmVkIl0sInR5cGUiOiJ0b2tlbiIsIm5hbWUiOiJhcmlhLWdyYWJiZWQifSx7ImRlZmF1bHQiOiJmYWxzZSIsImVudW0iOlsiZmFsc2UiLCJ0cnVlIiwibWVudSIsImxpc3Rib3giLCJ0cmVlIiwiZ3JpZCIsImRpYWxvZyJdLCJ0eXBlIjoidG9rZW4iLCJuYW1lIjoiYXJpYS1oYXNwb3B1cCJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJhcmlhLWhlbHAifSx7ImRlZmF1bHQiOiJ1bmRlZmluZWQiLCJlbnVtIjpbInRydWUiLCJmYWxzZSIsInVuZGVmaW5lZCJdLCJ0eXBlIjoidG9rZW4iLCJuYW1lIjoiYXJpYS1oaWRkZW4ifSx7ImRlZmF1bHQiOiJmYWxzZSIsImVudW0iOlsiZ3JhbW1hciIsImZhbHNlIiwic3BlbGxpbmciLCJ0cnVlIl0sInR5cGUiOiJ0b2tlbiIsIm5hbWUiOiJhcmlhLWludmFsaWQifSx7InR5cGUiOiJzdHJpbmciLCJuYW1lIjoiYXJpYS1rZXlzaG9ydGN1dHMifSx7InR5cGUiOiJzdHJpbmciLCJuYW1lIjoiYXJpYS1sYWJlbCJ9LHsidHlwZSI6IklEUkVGX2xpc3QiLCJuYW1lIjoiYXJpYS1sYWJlbGxlZGJ5In0seyJ0eXBlIjoiSURSRUZfbGlzdCIsIm5hbWUiOiJhcmlhLWxhYmVsZWRieSJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1sZXZlbCJ9LHsiZGVmYXVsdCI6Im9mZiIsImVudW0iOlsib2ZmIiwicG9saXRlIiwiYXNzZXJ0aXZlIl0sInR5cGUiOiJ0b2tlbiIsIm5hbWUiOiJhcmlhLWxpdmUifSx7ImRlZmF1bHQiOiJmYWxzZSIsInR5cGUiOiJib29sZWFuIiwibmFtZSI6ImFyaWEtbW9kYWwifSx7ImRlZmF1bHQiOiJmYWxzZSIsInR5cGUiOiJib29sZWFuIiwibmFtZSI6ImFyaWEtbXVsdGlsaW5lIn0seyJkZWZhdWx0IjoiZmFsc2UiLCJ0eXBlIjoiYm9vbGVhbiIsIm5hbWUiOiJhcmlhLW11bHRpc2VsZWN0YWJsZSJ9LHsiZGVmYXVsdCI6InVuZGVmaW5lZCIsImVudW0iOlsiaG9yaXpvbnRhbCIsInVuZGVmaW5lZCIsInZlcnRpY2FsIl0sInR5cGUiOiJ0b2tlbiIsIm5hbWUiOiJhcmlhLW9yaWVudGF0aW9uIn0seyJ0eXBlIjoiSURSRUZfbGlzdCIsIm5hbWUiOiJhcmlhLW93bnMifSx7InR5cGUiOiJzdHJpbmciLCJuYW1lIjoiYXJpYS1wbGFjZWhvbGRlciJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1wb3NpbnNldCJ9LHsiZGVmYXVsdCI6InVuZGVmaW5lZCIsImVudW0iOlsidHJ1ZSIsImZhbHNlIiwibWl4ZWQiLCJ1bmRlZmluZWQiXSwidHlwZSI6InRva2VuIiwibmFtZSI6ImFyaWEtcHJlc3NlZCJ9LHsiZGVmYXVsdCI6ImZhbHNlIiwidHlwZSI6ImJvb2xlYW4iLCJuYW1lIjoiYXJpYS1yZWFkb25seSJ9LHsiZGVmYXVsdCI6ImFkZGl0aW9ucyB0ZXh0IiwiZW51bSI6WyJhZGRpdGlvbnMiLCJyZW1vdmFscyIsInRleHQiLCJhbGwiXSwidHlwZSI6InRva2VuX2xpc3QiLCJuYW1lIjoiYXJpYS1yZWxldmFudCJ9LHsiZGVmYXVsdCI6ImZhbHNlIiwidHlwZSI6ImJvb2xlYW4iLCJuYW1lIjoiYXJpYS1yZXF1aXJlZCJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJhcmlhLXJvbGVkZXNjcmlwdGlvbiJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1yb3djb3VudCJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1yb3dpbmRleCJ9LHsidHlwZSI6ImludGVnZXIiLCJuYW1lIjoiYXJpYS1yb3dzcGFuIn0seyJkZWZhdWx0IjoidW5kZWZpbmVkIiwiZW51bSI6WyJ0cnVlIiwiZmFsc2UiLCJ1bmRlZmluZWQiXSwidHlwZSI6InRva2VuIiwibmFtZSI6ImFyaWEtc2VsZWN0ZWQifSx7InR5cGUiOiJpbnRlZ2VyIiwibmFtZSI6ImFyaWEtc2V0c2l6ZSJ9LHsiZGVmYXVsdCI6Im5vbmUiLCJlbnVtIjpbImFzY2VuZGluZyIsImRlc2NlbmRpbmciLCJub25lIiwib3RoZXIiXSwidHlwZSI6InRva2VuIiwibmFtZSI6ImFyaWEtc29ydCJ9LHsidHlwZSI6ImRlY2ltYWwiLCJuYW1lIjoiYXJpYS12YWx1ZW1heCJ9LHsidHlwZSI6ImRlY2ltYWwiLCJuYW1lIjoiYXJpYS12YWx1ZW1pbiJ9LHsidHlwZSI6ImRlY2ltYWwiLCJuYW1lIjoiYXJpYS12YWx1ZW5vdyJ9LHsidHlwZSI6InN0cmluZyIsIm5hbWUiOiJhcmlhLXZhbHVldGV4dCJ9XSwicm9sZXMiOlt7ImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtYXRvbWljIjoidHJ1ZSIsImFyaWEtbGl2ZSI6ImFzc2VydGl2ZSJ9LCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoiYWxlcnQiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsiYWxlcnQiLCJkaWFsb2ciXSwibmFtZSI6ImFsZXJ0ZGlhbG9nIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsic3RydWN0dXJlIl0sIm5hbWUiOiJhcHBsaWNhdGlvbiIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXBvc2luc2V0IiwiYXJpYS1zZXRzaXplIl0sInN1cGVyY2xhc3NlcyI6WyJkb2N1bWVudCJdLCJuYW1lIjoiYXJ0aWNsZSIsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InN1cGVyY2xhc3NlcyI6WyJsYW5kbWFyayJdLCJuYW1lIjoiYmFubmVyIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsibmFtZSI6ImJ1dHRvbiIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWV4cGFuZGVkIiwiYXJpYS1wcmVzc2VkIl0sInN1cGVyY2xhc3NlcyI6WyJjb21tYW5kIl0sImNoaWxkcmVuUHJlc2VudGF0aW9uYWwiOnRydWV9LHsic2NvcGUiOiJyb3ciLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtY29saW5kZXgiLCJhcmlhLWNvbHNwYW4iLCJhcmlhLXJvd2luZGV4IiwiYXJpYS1yb3dzcGFuIl0sInN1cGVyY2xhc3NlcyI6WyJzZWN0aW9uIl0sIm5hbWUiOiJjZWxsIiwibmFtZWZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXX0seyJuYW1lIjoiY2hlY2tib3giLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtY2hlY2tlZCI6ZmFsc2V9LCJyZXF1aXJlZEF0dHJpYnV0ZXMiOlsiYXJpYS1jaGVja2VkIl0sIm5hbWVGcm9tIjpbImNvbnRlbnRzIiwiYXV0aG9yIl0sInN1cHBvcnRlZEF0dHJpYnV0ZXMiOlsiYXJpYS1yZWFkb25seSJdLCJzdXBlcmNsYXNzZXMiOlsiaW5wdXQiXX0seyJuYW1lIjoiY29sdW1uaGVhZGVyIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtc29ydCJdLCJzdXBlcmNsYXNzZXMiOlsiZ3JpZGNlbGwiLCJzZWN0aW9uaGVhZCIsIndpZGdldCJdLCJzY29wZSI6WyJyb3ciXX0seyJuYW1lIjoiY29tYm9ib3giLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtaGFzcG9wdXAiOiJsaXN0Ym94IiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0sInJlcXVpcmVkQXR0cmlidXRlcyI6WyJhcmlhLWNvbnRyb2xzIiwiYXJpYS1leHBhbmRlZCJdLCJtdXN0Q29udGFpbiI6WyJ0ZXh0Ym94Il0sIm5hbWVGcm9tIjpbImF1dGhvciJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtYXV0b2NvbXBsZXRlIiwiYXJpYS1yZWFkb25seSIsImFyaWEtcmVxdWlyZWQiXSwic3VwZXJjbGFzc2VzIjpbInNlbGVjdCJdfSx7ImFic3RyYWN0Ijp0cnVlLCJzdXBlcmNsYXNzZXMiOlsid2lkZ2V0Il0sIm5hbWUiOiJjb21tYW5kIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbImxhbmRtYXJrIl0sIm5hbWUiOiJjb21wbGVtZW50YXJ5IiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiXSwiYWJzdHJhY3QiOnRydWUsInN1cGVyY2xhc3NlcyI6WyJ3aWRnZXQiXSwibmFtZSI6ImNvbXBvc2l0ZSIsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InN1cGVyY2xhc3NlcyI6WyJsYW5kbWFyayJdLCJuYW1lIjoiY29udGVudGluZm8iLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoiZGVmaW5pdGlvbiIsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InN1cGVyY2xhc3NlcyI6WyJ3aW5kb3ciXSwibmFtZSI6ImRpYWxvZyIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbImxpc3QiXSwibmFtZSI6ImRpcmVjdG9yeSIsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InN1cHBvcnRlZEF0dHJpYnV0ZXMiOlsiYXJpYS1leHBhbmRlZCJdLCJzdXBlcmNsYXNzZXMiOlsic3RydWN0dXJlIl0sIm5hbWUiOiJkb2N1bWVudCIsIm5hbWVSZXF1aXJlZCI6ZmFsc2UsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7Im5hbWVSZXF1aXJlZCI6ZmFsc2UsInN1cGVyY2xhc3NlcyI6WyJsaXN0Il0sIm5hbWUiOiJmZWVkIiwibXVzdENvbnRhaW4iOlsiYXJ0aWNsZSJdLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoiZmlndXJlIiwibmFtZVJlcXVpcmVkIjpmYWxzZSwibmFtZWZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbImxhbmRtYXJrIl0sIm5hbWUiOiJmb3JtIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsibmFtZSI6ImdyaWQiLCJuYW1lUmVxdWlyZWQiOnRydWUsIm5hbWVGcm9tIjpbImF1dGhvciJdLCJtdXN0Q29udGFpbiI6WyJyb3ciXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWxldmVsIiwiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJhcmlhLXJlYWRvbmx5Il0sInN1cGVyY2xhc3NlcyI6WyJjb21wb3NpdGUiLCJ0YWJsZSJdfSx7Im5hbWUiOiJncmlkY2VsbCIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXJlYWRvbmx5IiwiYXJpYS1yZXF1aXJlZCIsImFyaWEtc2VsZWN0ZWQiXSwic3VwZXJjbGFzc2VzIjpbImNlbGwiLCJ3aWRnZXQiXSwic2NvcGUiOlsicm93Il19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiXSwic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXSwibmFtZSI6Imdyb3VwIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsibmFtZSI6ImhlYWRpbmciLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtbGV2ZWwiOiIyIn0sIm5hbWVmcm9tIjpbImNvbnRlbnRzIiwiYXV0aG9yIl0sInN1cHBvcnRlZEF0dHJpYnV0ZXMiOlsiYXJpYS1sZXZlbCJdLCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbmhlYWQiXX0seyJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoiaW1nIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJhYnN0cmFjdCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbIndpZGdldCJdLCJuYW1lIjoiaW5wdXQiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJhYnN0cmFjdCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXSwibmFtZSI6ImxhbmRtYXJrIiwibmFtZVJlcXVpcmVkIjpmYWxzZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWV4cGFuZGVkIl0sInN1cGVyY2xhc3NlcyI6WyJjb21tYW5kIl0sIm5hbWUiOiJsaW5rIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdfSx7ImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoibGlzdCIsIm11c3RDb250YWluIjpbImxpc3RpdGVtIl0sIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7Im5hbWUiOiJsaXN0Ym94IiwibmFtZVJlcXVpcmVkIjp0cnVlLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLW9yaWVudGF0aW9uIjoidmVydGljYWwifSwibmFtZUZyb20iOlsiYXV0aG9yIl0sIm11c3RDb250YWluIjpbIm9wdGlvbiJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwiYXJpYS1yZWFkb25seSIsImFyaWEtcmVxdWlyZWQiXSwic3VwZXJjbGFzc2VzIjpbInNlbGVjdCJdfSx7InNjb3BlIjpbImdyb3VwIiwibGlzdCJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtbGV2ZWwiLCJhcmlhLXBvc2luc2V0IiwiYXJpYS1zZXRzaXplIl0sInN1cGVyY2xhc3NlcyI6WyJzZWN0aW9uIl0sIm5hbWUiOiJsaXN0aXRlbSIsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7ImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtbGl2ZSI6InBvbGl0ZSJ9LCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoibG9nIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsibGFuZG1hcmsiXSwibmFtZSI6Im1haW4iLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoibWFycXVlZSIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsiY2hpbGRyZW5QcmVzZW50YXRpb25hbCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXSwibmFtZSI6Im1hdGgiLCJuYW1lUmVxdWlyZWQiOnRydWUsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7ImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LCJzdXBlcmNsYXNzZXMiOlsic2VsZWN0Il0sIm5hbWUiOiJtZW51IiwibXVzdENvbnRhaW4iOlsiZ3JvdXAiLCJtZW51aXRlbXJhZGlvIiwibWVudWl0ZW0iLCJtZW51aXRlbWNoZWNrYm94IiwibWVudWl0ZW1yYWRpbyJdLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LCJzdXBlcmNsYXNzZXMiOlsibWVudSJdLCJuYW1lIjoibWVudWJhciIsIm11c3RDb250YWluIjpbIm1lbnVpdGVtIiwibWVudWl0ZW1yYWRpbyIsIm1lbnVpdGVtY2hlY2tib3giXSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic2NvcGUiOlsiZ3JvdXAiLCJtZW51IiwibWVudWJhciJdLCJzdXBlcmNsYXNzZXMiOlsiY29tbWFuZCJdLCJuYW1lIjoibWVudWl0ZW0iLCJuYW1lUmVxdWlyZWQiOnRydWUsIm5hbWVGcm9tIjpbImNvbnRlbnRzIiwiYXV0aG9yIl19LHsibmFtZSI6Im1lbnVpdGVtY2hlY2tib3giLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtY2hlY2tlZCI6ZmFsc2V9LCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdLCJzdXBlcmNsYXNzZXMiOlsiY2hlY2tib3giLCJtZW51aXRlbSJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzY29wZSI6WyJtZW51IiwibWVudWJhciJdfSx7Im5hbWUiOiJtZW51aXRlbXJhZGlvIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLWNoZWNrZWQiOmZhbHNlfSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwZXJjbGFzc2VzIjpbIm1lbnVpdGVtY2hlY2tib3giLCJyYWRpbyJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzY29wZSI6WyJtZW51IiwibWVudWJhciIsImdyb3VwIl19LHsic3VwZXJjbGFzc2VzIjpbImxhbmRtYXJrIl0sIm5hbWUiOiJuYXZpZ2F0aW9uIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsibmFtZSI6Im5vbmUiLCJzdXBlcmNsYXNzZXMiOlsic3RydWN0dXJlIl19LHsic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXSwibmFtZSI6Im5vdGUiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJuYW1lIjoib3B0aW9uIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UifSwicmVxdWlyZWRBdHRyaWJ1dGVzIjpbImFyaWEtc2VsZWN0ZWQiXSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWNoZWNrZWQiLCJhcmlhLXBvc2luc2V0IiwiYXJpYS1zZXRzaXplIl0sInN1cGVyY2xhc3NlcyI6WyJpbnB1dCJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzY29wZSI6WyJsaXN0Ym94Il19LHsibmFtZSI6InByZXNlbnRhdGlvbiIsInN1cGVyY2xhc3NlcyI6WyJzdHJ1Y3R1cmUiXX0seyJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzdXBlcmNsYXNzZXMiOlsicmFuZ2UiXSwibmFtZSI6InByb2dyZXNzYmFyIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJuYW1lIjoicmFkaW8iLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtY2hlY2tlZCI6ImZhbHNlIn0sInJlcXVpcmVkQXR0cmlidXRlcyI6WyJhcmlhLWNoZWNrZWQiXSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXBvc2luc2V0IiwiYXJpYS1zZXRzaXplIl0sInN1cGVyY2xhc3NlcyI6WyJpbnB1dCJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJyYWRpb2dyb3VwIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXSwibXVzdENvbnRhaW4iOlsicmFkaW8iXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXJlYWRvbmx5IiwiYXJpYS1yZXF1aXJlZCJdLCJzdXBlcmNsYXNzZXMiOlsic2VsZWN0Il19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXZhbHVlbWF4IiwiYXJpYS12YWx1ZW1pbiIsImFyaWEtdmFsdWVub3ciLCJhcmlhLXZhbHVldGV4dCJdLCJhYnN0cmFjdCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbIndpZGdldCJdLCJuYW1lIjoicmFuZ2UiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBlcmNsYXNzZXMiOlsibGFuZG1hcmsiXSwibmFtZSI6InJlZ2lvbiIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWF0b21pYyIsImFyaWEtYnVzeSIsImFyaWEtY29udHJvbHMiLCJhcmlhLWN1cnJlbnQiLCJhcmlhLWRlc2NyaWJlZGJ5IiwiYXJpYS1kZXRhaWxzIiwiYXJpYS1kaXNhYmxlZCIsImFyaWEtZHJvcGVmZmVjdCIsImFyaWEtZXJyb3JtZXNzYWdlIiwiYXJpYS1mbG93dG8iLCJhcmlhLWdyYWJiZWQiLCJhcmlhLWhhc3BvcHVwIiwiYXJpYS1oaWRkZW4iLCJhcmlhLWludmFsaWQiLCJhcmlhLWtleXNob3J0Y3V0cyIsImFyaWEtbGFiZWwiLCJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhLWxpdmUiLCJhcmlhLW93bnMiLCJhcmlhLXJlbGV2YW50IiwiYXJpYS1yb2xlZGVzY3JpcHRpb24iXSwiYWJzdHJhY3QiOnRydWUsIm5hbWUiOiJyb2xldHlwZSJ9LHsibmFtZSI6InJvdyIsIm5hbWVGcm9tIjpbImNvbnRlbnRzIiwiYXV0aG9yIl0sIm11c3RDb250YWluIjpbImNlbGwiLCJjb2x1bW5oZWFkZXIiLCJncmlkY2VsbCIsInJvd2hlYWRlciJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtY29saW5kZXgiLCJhcmlhLWxldmVsIiwiYXJpYS1yb3dpbmRleCIsImFyaWEtc2VsZWN0ZWQiLCJhcmlhLXNldHNpemUiLCJhcmlhLXBvc2luc2V0Il0sInN1cGVyY2xhc3NlcyI6WyJncm91cCIsIndpZGdldCJdLCJzY29wZSI6WyJncmlkIiwicm93Z3JvdXAiLCJ0YWJsZSIsInRyZWVncmlkIl19LHsic2NvcGUiOlsiZ3JpZCIsInRhYmxlIiwidHJlZWdyaWQiXSwic3VwZXJjbGFzc2VzIjpbInN0cnVjdHVyZSJdLCJuYW1lIjoicm93Z3JvdXAiLCJtdXN0Q29udGFpbiI6WyJyb3ciXSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXX0seyJuYW1lIjoicm93aGVhZGVyIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtc29ydCJdLCJzdXBlcmNsYXNzZXMiOlsiY2VsbCIsImdyaWRjZWxsIiwic2VjdGlvbmhlYWQiXSwic2NvcGUiOlsicm93Il19LHsibmFtZSI6InNjcm9sbGJhciIsIm5hbWVSZXF1aXJlZCI6ZmFsc2UsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtdmFsdWVtYXgiOiIxMDAiLCJhcmlhLXZhbHVlbWluIjoiMCIsImFyaWEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LCJuYW1lRnJvbSI6WyJhdXRob3IiXSwicmVxdWlyZWRBdHRyaWJ1dGVzIjpbImFyaWEtY29udHJvbHMiLCJhcmlhLW9yaWVudGF0aW9uIiwiYXJpYS12YWx1ZW1heCIsImFyaWEtdmFsdWVtaW4iLCJhcmlhLXZhbHVlbm93Il0sInN1cGVyY2xhc3NlcyI6WyJyYW5nZSJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlfSx7InN1cGVyY2xhc3NlcyI6WyJsYW5kbWFyayJdLCJuYW1lIjoic2VhcmNoIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbInRleHRib3giXSwibmFtZSI6InNlYXJjaGJveCIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWV4cGFuZGVkIl0sImFic3RyYWN0Ijp0cnVlLCJuYW1lIjoic2VjdGlvbiIsInN1cGVyY2xhc3NlcyI6WyJzdHJ1Y3R1cmUiXX0seyJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtZXhwYW5kZWQiXSwiYWJzdHJhY3QiOnRydWUsInN1cGVyY2xhc3NlcyI6WyJzdHJ1Y3R1cmUiXSwibmFtZSI6InNlY3Rpb25oZWFkIiwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXX0seyJhYnN0cmFjdCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbImNvbXBvc2l0ZSIsImdyb3VwIl0sIm5hbWUiOiJzZWxlY3QiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtb3JpZW50YXRpb24iLCJhcmlhLXZhbHVlbWluIiwiYXJpYS12YWx1ZW1heCIsImFyaWEtdmFsdWVub3ciLCJhcmlhLXZhbHVldGV4dCJdLCJzdXBlcmNsYXNzZXMiOlsic3RydWN0dXJlIl0sIm5hbWUiOiJzZXBhcmF0b3IiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJuYW1lIjoic2xpZGVyIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLXZhbHVlbWF4IjoiMTAwIiwiYXJpYS12YWx1ZW1pbiI6IjAiLCJhcmlhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LCJyZXF1aXJlZEF0dHJpYnV0ZXMiOlsiYXJpYS12YWx1ZW1heCIsImFyaWEtdmFsdWVtaW4iLCJhcmlhLXZhbHVlbm93Il0sIm5hbWVGcm9tIjpbImF1dGhvciJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtb3JpZW50YXRpb24iXSwic3VwZXJjbGFzc2VzIjpbImlucHV0IiwicmFuZ2UiXSwiY2hpbGRyZW5QcmVzZW50YXRpb25hbCI6dHJ1ZX0seyJuYW1lIjoic3BpbmJ1dHRvbiIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwiaW1wbGljaXRWYWx1ZXMiOnsiYXJpYS12YWx1ZW5vdyI6IjAifSwicmVxdWlyZWRBdHRyaWJ1dGVzIjpbImFyaWEtdmFsdWVtYXgiLCJhcmlhLXZhbHVlbWluIiwiYXJpYS12YWx1ZW5vdyJdLCJuYW1lRnJvbSI6WyJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXJlcXVpcmVkIiwiYXJpYS1yZWFkb25seSJdLCJzdXBlcmNsYXNzZXMiOlsiY29tcG9zaXRlIiwiaW5wdXQiLCJyYW5nZSJdfSx7ImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtYXRvbWljIjoidHJ1ZSIsImFyaWEtbGl2ZSI6InBvbGl0ZSJ9LCJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoic3RhdHVzIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsiYWJzdHJhY3QiOnRydWUsIm5hbWUiOiJzdHJ1Y3R1cmUiLCJzdXBlcmNsYXNzZXMiOlsicm9sZXR5cGUiXX0seyJuYW1lIjoic3dpdGNoIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLWNoZWNrZWQiOiJmYWxzZSJ9LCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdLCJyZXF1aXJlZEF0dHJpYnV0ZXMiOlsiYXJpYS1jaGVja2VkIl0sInN1cGVyY2xhc3NlcyI6WyJjaGVja2JveCJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlfSx7Im5hbWUiOiJ0YWIiLCJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UifSwibmFtZUZyb20iOlsiY29udGVudHMiLCJhdXRob3IiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLXNlbGVjdGVkIl0sInN1cGVyY2xhc3NlcyI6WyJzZWN0aW9uaGVhZCIsIndpZGdldCJdLCJjaGlsZHJlblByZXNlbnRhdGlvbmFsIjp0cnVlLCJzY29wZSI6WyJ0YWJsaXN0Il19LHsibmFtZSI6InRhYmxlIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJhdXRob3IiXSwibXVzdENvbnRhaW4iOlsicm93Il0sInN1cHBvcnRlZEF0dHJpYnV0ZXMiOlsiYXJpYS1jb2xjb3VudCIsImFyaWEtcm93Y291bnQiXSwic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXX0seyJuYW1lIjoidGFibGlzdCIsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtb3JpZW50YXRpb24iOiJob3Jpem9udGFsIn0sIm5hbWVGcm9tIjpbImF1dGhvciJdLCJtdXN0Q29udGFpbiI6WyJ0YWIiXSwic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWxldmVsIiwiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJhcmlhLW9yaWVudGF0aW9uIl0sInN1cGVyY2xhc3NlcyI6WyJjb21wb3NpdGUiXX0seyJzdXBlcmNsYXNzZXMiOlsic2VjdGlvbiJdLCJuYW1lIjoidGFicGFuZWwiLCJuYW1lUmVxdWlyZWQiOnRydWUsIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InN1cGVyY2xhc3NlcyI6WyJzZWN0aW9uIl0sIm5hbWUiOiJ0ZXJtIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLCJhcmlhLWF1dG9jb21wbGV0ZSIsImFyaWEtbXVsdGlsaW5lIiwiYXJpYS1wbGFjZWhvbGRlciIsImFyaWEtcmVhZG9ubHkiLCJhcmlhLXJlcXVpcmVkIl0sInN1cGVyY2xhc3NlcyI6WyJpbnB1dCJdLCJuYW1lIjoidGV4dGJveCIsIm5hbWVSZXF1aXJlZCI6dHJ1ZSwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbInN0YXR1cyJdLCJuYW1lIjoidGltZXIiLCJuYW1lRnJvbSI6WyJhdXRob3IiXX0seyJpbXBsaWNpdFZhbHVlcyI6eyJhcmlhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtb3JpZW50YXRpb24iXSwic3VwZXJjbGFzc2VzIjpbImdyb3VwIl0sIm5hbWUiOiJ0b29sYmFyIiwibmFtZUZyb20iOlsiYXV0aG9yIl19LHsic3VwZXJjbGFzc2VzIjpbInNlY3Rpb24iXSwibmFtZSI6InRvb2x0aXAiLCJuYW1lUmVxdWlyZWQiOnRydWUsIm5hbWVGcm9tIjpbImNvbnRlbnRzIiwiYXV0aG9yIl19LHsibmFtZSI6InRyZWUiLCJuYW1lUmVxdWlyZWQiOnRydWUsImltcGxpY2l0VmFsdWVzIjp7ImFyaWEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LCJuYW1lRnJvbSI6WyJhdXRob3IiXSwibXVzdENvbnRhaW4iOlsiZ3JvdXAiLCJ0cmVlaXRlbSJdLCJzdXBwb3J0ZWRBdHRyaWJ1dGVzIjpbImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwiYXJpYS1yZXF1aXJlZCJdLCJzdXBlcmNsYXNzZXMiOlsic2VsZWN0Il19LHsibmFtZVJlcXVpcmVkIjp0cnVlLCJzdXBlcmNsYXNzZXMiOlsiZ3JpZCIsInRyZWUiXSwibmFtZSI6InRyZWVncmlkIiwibXVzdENvbnRhaW4iOlsicm93Il0sIm5hbWVGcm9tIjpbImF1dGhvciJdfSx7InNjb3BlIjpbImdyb3VwIiwidHJlZSJdLCJzdXBlcmNsYXNzZXMiOlsibGlzdGl0ZW0iLCJvcHRpb24iXSwibmFtZSI6InRyZWVpdGVtIiwibmFtZVJlcXVpcmVkIjp0cnVlLCJuYW1lRnJvbSI6WyJjb250ZW50cyIsImF1dGhvciJdfSx7ImFic3RyYWN0Ijp0cnVlLCJuYW1lIjoid2lkZ2V0Iiwic3VwZXJjbGFzc2VzIjpbInJvbGV0eXBlIl19LHsic3VwcG9ydGVkQXR0cmlidXRlcyI6WyJhcmlhLWV4cGFuZGVkIiwiYXJpYS1tb2RhbCJdLCJhYnN0cmFjdCI6dHJ1ZSwic3VwZXJjbGFzc2VzIjpbInJvbGV0eXBlIl0sIm5hbWUiOiJ3aW5kb3ciLCJuYW1lRnJvbSI6WyJhdXRob3IiXX1dLCJtZXRhZGF0YSI6eyJuYW1lc3BhY2VVUkkiOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiYXR0cnNOdWxsTmFtZXNwYWNlIjp0cnVlLCJuYW1lc3BhY2UiOiJIVE1MIiwiZXhwb3J0IjoiQ09SRV9FWFBPUlQiLCJuYW1lc3BhY2VQcmVmaXgiOiJ4aHRtbCJ9fTs7QWNjZXNzaWJpbGl0eS5BWEJyZWFkY3J1bWJzUGFuZT1jbGFzcyBleHRlbmRzIEFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVN1YlBhbmV7Y29uc3RydWN0b3IoYXhTaWRlYmFyVmlldyl7c3VwZXIobHNgQWNjZXNzaWJpbGl0eSBUcmVlYCk7dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2F4LXN1YnBhbmUnKTtVSS5BUklBVXRpbHMubWFya0FzVHJlZSh0aGlzLmVsZW1lbnQpO3RoaXMuZWxlbWVudC50YWJJbmRleD0tMTt0aGlzLl9heFNpZGViYXJWaWV3PWF4U2lkZWJhclZpZXc7dGhpcy5fcHJlc2VsZWN0ZWRCcmVhZGNydW1iPW51bGw7dGhpcy5faW5zcGVjdGVkTm9kZUJyZWFkY3J1bWI9bnVsbDt0aGlzLl9ob3ZlcmVkQnJlYWRjcnVtYj1udWxsO3RoaXMuX3Jvb3RFbGVtZW50PXRoaXMuZWxlbWVudC5jcmVhdGVDaGlsZCgnZGl2JywnYXgtYnJlYWRjcnVtYnMnKTt0aGlzLl9yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSx0cnVlKTt0aGlzLl9yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3Jvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLHRoaXMuX29uTW91c2VMZWF2ZS5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5fb25DbGljay5iaW5kKHRoaXMpLGZhbHNlKTt0aGlzLl9yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5fY29udGV4dE1lbnVFdmVudEZpcmVkLmJpbmQodGhpcyksZmFsc2UpO3RoaXMuX3Jvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jyx0aGlzLl9vbkZvY3VzT3V0LmJpbmQodGhpcyksZmFsc2UpO3RoaXMucmVnaXN0ZXJSZXF1aXJlZENTUygnYWNjZXNzaWJpbGl0eS9heEJyZWFkY3J1bWJzLmNzcycpO30KZm9jdXMoKXtpZih0aGlzLl9pbnNwZWN0ZWROb2RlQnJlYWRjcnVtYikKdGhpcy5faW5zcGVjdGVkTm9kZUJyZWFkY3J1bWIubm9kZUVsZW1lbnQoKS5mb2N1cygpO2Vsc2UKdGhpcy5lbGVtZW50LmZvY3VzKCk7fQpzZXRBWE5vZGUoYXhOb2RlKXtjb25zdCBoYWRGb2N1cz10aGlzLmVsZW1lbnQuaGFzRm9jdXMoKTtzdXBlci5zZXRBWE5vZGUoYXhOb2RlKTt0aGlzLl9yb290RWxlbWVudC5yZW1vdmVDaGlsZHJlbigpO2lmKCFheE5vZGUpCnJldHVybjtjb25zdCBhbmNlc3RvckNoYWluPVtdO2xldCBhbmNlc3Rvcj1heE5vZGU7d2hpbGUoYW5jZXN0b3Ipe2FuY2VzdG9yQ2hhaW4ucHVzaChhbmNlc3Rvcik7YW5jZXN0b3I9YW5jZXN0b3IucGFyZW50Tm9kZSgpO30KYW5jZXN0b3JDaGFpbi5yZXZlcnNlKCk7bGV0IGRlcHRoPTA7bGV0IGJyZWFkY3J1bWI9bnVsbDtsZXQgcGFyZW50PW51bGw7Zm9yKGFuY2VzdG9yIG9mIGFuY2VzdG9yQ2hhaW4pe2JyZWFkY3J1bWI9bmV3IEFjY2Vzc2liaWxpdHkuQVhCcmVhZGNydW1iKGFuY2VzdG9yLGRlcHRoLChhbmNlc3Rvcj09PWF4Tm9kZSkpO2lmKHBhcmVudCkKcGFyZW50LmFwcGVuZENoaWxkKGJyZWFkY3J1bWIpO2Vsc2UKdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnJlYWRjcnVtYi5lbGVtZW50KCkpO3BhcmVudD1icmVhZGNydW1iO2RlcHRoKys7fQp0aGlzLl9pbnNwZWN0ZWROb2RlQnJlYWRjcnVtYj1icmVhZGNydW1iO3RoaXMuX2luc3BlY3RlZE5vZGVCcmVhZGNydW1iLnNldFByZXNlbGVjdGVkKHRydWUsaGFkRm9jdXMpO3RoaXMuX3NldFByZXNlbGVjdGVkQnJlYWRjcnVtYih0aGlzLl9pbnNwZWN0ZWROb2RlQnJlYWRjcnVtYik7ZnVuY3Rpb24gYXBwZW5kKHBhcmVudEJyZWFkY3J1bWIsYXhOb2RlLGxvY2FsRGVwdGgpe2NvbnN0IGNoaWxkQnJlYWRjcnVtYj1uZXcgQWNjZXNzaWJpbGl0eS5BWEJyZWFkY3J1bWIoYXhOb2RlLGxvY2FsRGVwdGgsZmFsc2UpO3BhcmVudEJyZWFkY3J1bWIuYXBwZW5kQ2hpbGQoY2hpbGRCcmVhZGNydW1iKTtmb3IoY29uc3QgY2hpbGQgb2YgYXhOb2RlLmNoaWxkcmVuKCkpCmFwcGVuZChjaGlsZEJyZWFkY3J1bWIsY2hpbGQsbG9jYWxEZXB0aCsxKTt9CmZvcihjb25zdCBjaGlsZCBvZiBheE5vZGUuY2hpbGRyZW4oKSkKYXBwZW5kKHRoaXMuX2luc3BlY3RlZE5vZGVCcmVhZGNydW1iLGNoaWxkLGRlcHRoKTt9CndpbGxIaWRlKCl7dGhpcy5fc2V0UHJlc2VsZWN0ZWRCcmVhZGNydW1iKG51bGwpO30KX29uS2V5RG93bihldmVudCl7aWYoIXRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYikKcmV0dXJuO2lmKCFldmVudC5wYXRoLnNvbWUoZWxlbWVudD0+ZWxlbWVudD09PXRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYi5lbGVtZW50KCkpKQpyZXR1cm47aWYoZXZlbnQuc2hpZnRLZXl8fGV2ZW50Lm1ldGFLZXl8fGV2ZW50LmN0cmxLZXkpCnJldHVybjtsZXQgaGFuZGxlZD1mYWxzZTtpZigoZXZlbnQua2V5PT09J0Fycm93VXAnfHxldmVudC5rZXk9PT0nQXJyb3dMZWZ0JykmJiFldmVudC5hbHRLZXkpCmhhbmRsZWQ9dGhpcy5fcHJlc2VsZWN0UHJldmlvdXMoKTtlbHNlIGlmKChldmVudC5rZXk9PT0nQXJyb3dEb3duJ3x8ZXZlbnQua2V5PT09J0Fycm93UmlnaHQnKSYmIWV2ZW50LmFsdEtleSkKaGFuZGxlZD10aGlzLl9wcmVzZWxlY3ROZXh0KCk7ZWxzZSBpZihpc0VudGVyS2V5KGV2ZW50KSkKaGFuZGxlZD10aGlzLl9pbnNwZWN0RE9NTm9kZSh0aGlzLl9wcmVzZWxlY3RlZEJyZWFkY3J1bWIuYXhOb2RlKCkpO2lmKGhhbmRsZWQpCmV2ZW50LmNvbnN1bWUodHJ1ZSk7fQpfcHJlc2VsZWN0UHJldmlvdXMoKXtjb25zdCBwcmV2aW91c0JyZWFkY3J1bWI9dGhpcy5fcHJlc2VsZWN0ZWRCcmVhZGNydW1iLnByZXZpb3VzQnJlYWRjcnVtYigpO2lmKCFwcmV2aW91c0JyZWFkY3J1bWIpCnJldHVybiBmYWxzZTt0aGlzLl9zZXRQcmVzZWxlY3RlZEJyZWFkY3J1bWIocHJldmlvdXNCcmVhZGNydW1iKTtyZXR1cm4gdHJ1ZTt9Cl9wcmVzZWxlY3ROZXh0KCl7Y29uc3QgbmV4dEJyZWFkY3J1bWI9dGhpcy5fcHJlc2VsZWN0ZWRCcmVhZGNydW1iLm5leHRCcmVhZGNydW1iKCk7aWYoIW5leHRCcmVhZGNydW1iKQpyZXR1cm4gZmFsc2U7dGhpcy5fc2V0UHJlc2VsZWN0ZWRCcmVhZGNydW1iKG5leHRCcmVhZGNydW1iKTtyZXR1cm4gdHJ1ZTt9Cl9zZXRQcmVzZWxlY3RlZEJyZWFkY3J1bWIoYnJlYWRjcnVtYil7aWYoYnJlYWRjcnVtYj09PXRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYikKcmV0dXJuO2NvbnN0IGhhZEZvY3VzPXRoaXMuZWxlbWVudC5oYXNGb2N1cygpO2lmKHRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYikKdGhpcy5fcHJlc2VsZWN0ZWRCcmVhZGNydW1iLnNldFByZXNlbGVjdGVkKGZhbHNlLGhhZEZvY3VzKTtpZihicmVhZGNydW1iKQp0aGlzLl9wcmVzZWxlY3RlZEJyZWFkY3J1bWI9YnJlYWRjcnVtYjtlbHNlCnRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYj10aGlzLl9pbnNwZWN0ZWROb2RlQnJlYWRjcnVtYjt0aGlzLl9wcmVzZWxlY3RlZEJyZWFkY3J1bWIuc2V0UHJlc2VsZWN0ZWQodHJ1ZSxoYWRGb2N1cyk7aWYoIWJyZWFkY3J1bWImJmhhZEZvY3VzKQpTREsuT3ZlcmxheU1vZGVsLmhpZGVET01Ob2RlSGlnaGxpZ2h0KCk7fQpfb25Nb3VzZUxlYXZlKGV2ZW50KXt0aGlzLl9zZXRIb3ZlcmVkQnJlYWRjcnVtYihudWxsKTt9Cl9vbk1vdXNlTW92ZShldmVudCl7Y29uc3QgYnJlYWRjcnVtYkVsZW1lbnQ9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ2F4LWJyZWFkY3J1bWInKTtpZighYnJlYWRjcnVtYkVsZW1lbnQpe3RoaXMuX3NldEhvdmVyZWRCcmVhZGNydW1iKG51bGwpO3JldHVybjt9CmNvbnN0IGJyZWFkY3J1bWI9YnJlYWRjcnVtYkVsZW1lbnQuYnJlYWRjcnVtYjtpZighYnJlYWRjcnVtYi5pc0RPTU5vZGUoKSkKcmV0dXJuO3RoaXMuX3NldEhvdmVyZWRCcmVhZGNydW1iKGJyZWFkY3J1bWIpO30KX29uRm9jdXNPdXQoZXZlbnQpe2lmKCF0aGlzLl9wcmVzZWxlY3RlZEJyZWFkY3J1bWJ8fGV2ZW50LnRhcmdldCE9PXRoaXMuX3ByZXNlbGVjdGVkQnJlYWRjcnVtYi5ub2RlRWxlbWVudCgpKQpyZXR1cm47dGhpcy5fc2V0UHJlc2VsZWN0ZWRCcmVhZGNydW1iKG51bGwpO30KX29uQ2xpY2soZXZlbnQpe2NvbnN0IGJyZWFkY3J1bWJFbGVtZW50PWV2ZW50LnRhcmdldC5lbmNsb3NpbmdOb2RlT3JTZWxmV2l0aENsYXNzKCdheC1icmVhZGNydW1iJyk7aWYoIWJyZWFkY3J1bWJFbGVtZW50KXt0aGlzLl9zZXRIb3ZlcmVkQnJlYWRjcnVtYihudWxsKTtyZXR1cm47fQpjb25zdCBicmVhZGNydW1iPWJyZWFkY3J1bWJFbGVtZW50LmJyZWFkY3J1bWI7aWYoYnJlYWRjcnVtYi5pbnNwZWN0ZWQoKSl7YnJlYWRjcnVtYi5ub2RlRWxlbWVudCgpLmZvY3VzKCk7cmV0dXJuO30KaWYoIWJyZWFkY3J1bWIuaXNET01Ob2RlKCkpCnJldHVybjt0aGlzLl9pbnNwZWN0RE9NTm9kZShicmVhZGNydW1iLmF4Tm9kZSgpKTt9Cl9zZXRIb3ZlcmVkQnJlYWRjcnVtYihicmVhZGNydW1iKXtpZihicmVhZGNydW1iPT09dGhpcy5faG92ZXJlZEJyZWFkY3J1bWIpCnJldHVybjtpZih0aGlzLl9ob3ZlcmVkQnJlYWRjcnVtYikKdGhpcy5faG92ZXJlZEJyZWFkY3J1bWIuc2V0SG92ZXJlZChmYWxzZSk7aWYoYnJlYWRjcnVtYil7YnJlYWRjcnVtYi5zZXRIb3ZlcmVkKHRydWUpO31lbHNlIGlmKHRoaXMubm9kZSgpKXt0aGlzLm5vZGUoKS5kb21Nb2RlbCgpLm92ZXJsYXlNb2RlbCgpLm5vZGVIaWdobGlnaHRSZXF1ZXN0ZWQodGhpcy5ub2RlKCkuaWQpO30KdGhpcy5faG92ZXJlZEJyZWFkY3J1bWI9YnJlYWRjcnVtYjt9Cl9pbnNwZWN0RE9NTm9kZShheE5vZGUpe2lmKCFheE5vZGUuaXNET01Ob2RlKCkpCnJldHVybiBmYWxzZTtheE5vZGUuZGVmZXJyZWRET01Ob2RlKCkucmVzb2x2ZShkb21Ob2RlPT57dGhpcy5fYXhTaWRlYmFyVmlldy5zZXROb2RlKGRvbU5vZGUsdHJ1ZSk7Q29tbW9uLlJldmVhbGVyLnJldmVhbChkb21Ob2RlLHRydWUpO30pO3JldHVybiB0cnVlO30KX2NvbnRleHRNZW51RXZlbnRGaXJlZChldmVudCl7Y29uc3QgYnJlYWRjcnVtYkVsZW1lbnQ9ZXZlbnQudGFyZ2V0LmVuY2xvc2luZ05vZGVPclNlbGZXaXRoQ2xhc3MoJ2F4LWJyZWFkY3J1bWInKTtpZighYnJlYWRjcnVtYkVsZW1lbnQpCnJldHVybjtjb25zdCBheE5vZGU9YnJlYWRjcnVtYkVsZW1lbnQuYnJlYWRjcnVtYi5heE5vZGUoKTtpZighYXhOb2RlLmlzRE9NTm9kZSgpfHwhYXhOb2RlLmRlZmVycmVkRE9NTm9kZSgpKQpyZXR1cm47Y29uc3QgY29udGV4dE1lbnU9bmV3IFVJLkNvbnRleHRNZW51KGV2ZW50KTtjb250ZXh0TWVudS52aWV3U2VjdGlvbigpLmFwcGVuZEl0ZW0obHNgU2Nyb2xsIGludG8gdmlld2AsKCk9PntheE5vZGUuZGVmZXJyZWRET01Ob2RlKCkucmVzb2x2ZVByb21pc2UoKS50aGVuKGRvbU5vZGU9PntpZighZG9tTm9kZSkKcmV0dXJuO2RvbU5vZGUuc2Nyb2xsSW50b1ZpZXcoKTt9KTt9KTtjb250ZXh0TWVudS5hcHBlbmRBcHBsaWNhYmxlSXRlbXMoYXhOb2RlLmRlZmVycmVkRE9NTm9kZSgpKTtjb250ZXh0TWVudS5zaG93KCk7fX07QWNjZXNzaWJpbGl0eS5BWEJyZWFkY3J1bWI9Y2xhc3N7Y29uc3RydWN0b3IoYXhOb2RlLGRlcHRoLGluc3BlY3RlZCl7dGhpcy5fYXhOb2RlPWF4Tm9kZTt0aGlzLl9lbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ2RpdicsJ2F4LWJyZWFkY3J1bWInKTt0aGlzLl9lbGVtZW50LmJyZWFkY3J1bWI9dGhpczt0aGlzLl9ub2RlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdheC1ub2RlJyk7VUkuQVJJQVV0aWxzLm1hcmtBc1RyZWVpdGVtKHRoaXMuX25vZGVFbGVtZW50KTt0aGlzLl9ub2RlRWxlbWVudC50YWJJbmRleD0tMTt0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX25vZGVFbGVtZW50KTt0aGlzLl9ub2RlV3JhcHBlcj1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCd3cmFwcGVyJyk7dGhpcy5fbm9kZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbm9kZVdyYXBwZXIpO3RoaXMuX3NlbGVjdGlvbkVsZW1lbnQ9Y3JlYXRlRWxlbWVudFdpdGhDbGFzcygnZGl2Jywnc2VsZWN0aW9uIGZpbGwnKTt0aGlzLl9ub2RlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWxlY3Rpb25FbGVtZW50KTt0aGlzLl9jaGlsZHJlbkdyb3VwRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdkaXYnLCdjaGlsZHJlbicpO1VJLkFSSUFVdGlscy5tYXJrQXNHcm91cCh0aGlzLl9jaGlsZHJlbkdyb3VwRWxlbWVudCk7dGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jaGlsZHJlbkdyb3VwRWxlbWVudCk7dGhpcy5fY2hpbGRyZW49W107dGhpcy5faG92ZXJlZD1mYWxzZTt0aGlzLl9wcmVzZWxlY3RlZD1mYWxzZTt0aGlzLl9wYXJlbnQ9bnVsbDt0aGlzLl9pbnNwZWN0ZWQ9aW5zcGVjdGVkO3RoaXMuX25vZGVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2luc3BlY3RlZCcsaW5zcGVjdGVkKTt0aGlzLl9ub2RlRWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD0oMTYqZGVwdGgrNCkrJ3B4JztpZih0aGlzLl9heE5vZGUuaWdub3JlZCgpKXt0aGlzLl9hcHBlbmRJZ25vcmVkTm9kZUVsZW1lbnQoKTt9ZWxzZXt0aGlzLl9hcHBlbmRSb2xlRWxlbWVudCh0aGlzLl9heE5vZGUucm9sZSgpKTtpZih0aGlzLl9heE5vZGUubmFtZSgpJiZ0aGlzLl9heE5vZGUubmFtZSgpLnZhbHVlKXt0aGlzLl9ub2RlV3JhcHBlci5jcmVhdGVDaGlsZCgnc3BhbicsJ3NlcGFyYXRvcicpLnRleHRDb250ZW50PSdcdTAwQTAnO3RoaXMuX2FwcGVuZE5hbWVFbGVtZW50KCh0aGlzLl9heE5vZGUubmFtZSgpLnZhbHVlKSk7fX0KaWYodGhpcy5fYXhOb2RlLmhhc09ubHlVbmxvYWRlZENoaWxkcmVuKCkpCnRoaXMuX25vZGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NoaWxkcmVuLXVubG9hZGVkJyk7aWYoIXRoaXMuX2F4Tm9kZS5pc0RPTU5vZGUoKSkKdGhpcy5fbm9kZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbm8tZG9tLW5vZGUnKTt9CmVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudDt9Cm5vZGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuX25vZGVFbGVtZW50O30KYXBwZW5kQ2hpbGQoYnJlYWRjcnVtYil7dGhpcy5fY2hpbGRyZW4ucHVzaChicmVhZGNydW1iKTticmVhZGNydW1iLnNldFBhcmVudCh0aGlzKTt0aGlzLl9ub2RlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYXJlbnQnKTtVSS5BUklBVXRpbHMuc2V0RXhwYW5kZWQodGhpcy5fbm9kZUVsZW1lbnQsdHJ1ZSk7dGhpcy5fY2hpbGRyZW5Hcm91cEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnJlYWRjcnVtYi5lbGVtZW50KCkpO30Kc2V0UGFyZW50KGJyZWFkY3J1bWIpe3RoaXMuX3BhcmVudD1icmVhZGNydW1iO30KcHJlc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fcHJlc2VsZWN0ZWQ7fQpzZXRQcmVzZWxlY3RlZChwcmVzZWxlY3RlZCxzZWxlY3RlZEJ5VXNlcil7aWYodGhpcy5fcHJlc2VsZWN0ZWQ9PT1wcmVzZWxlY3RlZCkKcmV0dXJuO3RoaXMuX3ByZXNlbGVjdGVkPXByZXNlbGVjdGVkO3RoaXMuX25vZGVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3ByZXNlbGVjdGVkJyxwcmVzZWxlY3RlZCk7aWYocHJlc2VsZWN0ZWQpCnRoaXMuX25vZGVFbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLDApO2Vsc2UKdGhpcy5fbm9kZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsLTEpO2lmKHRoaXMuX3ByZXNlbGVjdGVkKXtpZihzZWxlY3RlZEJ5VXNlcikKdGhpcy5fbm9kZUVsZW1lbnQuZm9jdXMoKTtpZighdGhpcy5faW5zcGVjdGVkKQp0aGlzLl9heE5vZGUuaGlnaGxpZ2h0RE9NTm9kZSgpO2Vsc2UKU0RLLk92ZXJsYXlNb2RlbC5oaWRlRE9NTm9kZUhpZ2hsaWdodCgpO319CnNldEhvdmVyZWQoaG92ZXJlZCl7aWYodGhpcy5faG92ZXJlZD09PWhvdmVyZWQpCnJldHVybjt0aGlzLl9ob3ZlcmVkPWhvdmVyZWQ7dGhpcy5fbm9kZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaG92ZXJlZCcsaG92ZXJlZCk7aWYodGhpcy5faG92ZXJlZCl7dGhpcy5fbm9kZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaG92ZXJlZCcsdHJ1ZSk7dGhpcy5fYXhOb2RlLmhpZ2hsaWdodERPTU5vZGUoKTt9fQpheE5vZGUoKXtyZXR1cm4gdGhpcy5fYXhOb2RlO30KaW5zcGVjdGVkKCl7cmV0dXJuIHRoaXMuX2luc3BlY3RlZDt9CmlzRE9NTm9kZSgpe3JldHVybiB0aGlzLl9heE5vZGUuaXNET01Ob2RlKCk7fQpuZXh0QnJlYWRjcnVtYigpe2lmKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCkKcmV0dXJuIHRoaXMuX2NoaWxkcmVuWzBdO2NvbnN0IG5leHRTaWJsaW5nPXRoaXMuZWxlbWVudCgpLm5leHRTaWJsaW5nO2lmKG5leHRTaWJsaW5nKQpyZXR1cm4gbmV4dFNpYmxpbmcuYnJlYWRjcnVtYjtyZXR1cm4gbnVsbDt9CnByZXZpb3VzQnJlYWRjcnVtYigpe2NvbnN0IHByZXZpb3VzU2libGluZz10aGlzLmVsZW1lbnQoKS5wcmV2aW91c1NpYmxpbmc7aWYocHJldmlvdXNTaWJsaW5nKQpyZXR1cm4gcHJldmlvdXNTaWJsaW5nLmJyZWFkY3J1bWI7cmV0dXJuIHRoaXMuX3BhcmVudDt9Cl9hcHBlbmROYW1lRWxlbWVudChuYW1lKXtjb25zdCBuYW1lRWxlbWVudD1jcmVhdGVFbGVtZW50KCdzcGFuJyk7bmFtZUVsZW1lbnQudGV4dENvbnRlbnQ9JyInK25hbWUrJyInO25hbWVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2F4LXJlYWRhYmxlLXN0cmluZycpO3RoaXMuX25vZGVXcmFwcGVyLmFwcGVuZENoaWxkKG5hbWVFbGVtZW50KTt9Cl9hcHBlbmRSb2xlRWxlbWVudChyb2xlKXtpZighcm9sZSkKcmV0dXJuO2NvbnN0IHJvbGVFbGVtZW50PWNyZWF0ZUVsZW1lbnRXaXRoQ2xhc3MoJ3NwYW4nLCdtb25vc3BhY2UnKTtyb2xlRWxlbWVudC5jbGFzc0xpc3QuYWRkKEFjY2Vzc2liaWxpdHkuQVhCcmVhZGNydW1iLlJvbGVTdHlsZXNbcm9sZS50eXBlXSk7cm9sZUVsZW1lbnQuc2V0VGV4dENvbnRlbnRUcnVuY2F0ZWRJZk5lZWRlZChyb2xlLnZhbHVlfHwnJyk7dGhpcy5fbm9kZVdyYXBwZXIuYXBwZW5kQ2hpbGQocm9sZUVsZW1lbnQpO30KX2FwcGVuZElnbm9yZWROb2RlRWxlbWVudCgpe2NvbnN0IGlnbm9yZWROb2RlRWxlbWVudD1jcmVhdGVFbGVtZW50V2l0aENsYXNzKCdzcGFuJywnbW9ub3NwYWNlJyk7aWdub3JlZE5vZGVFbGVtZW50LnRleHRDb250ZW50PWxzYElnbm9yZWRgO2lnbm9yZWROb2RlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdheC1icmVhZGNydW1icy1pZ25vcmVkLW5vZGUnKTt0aGlzLl9ub2RlV3JhcHBlci5hcHBlbmRDaGlsZChpZ25vcmVkTm9kZUVsZW1lbnQpO319O0FjY2Vzc2liaWxpdHkuQVhCcmVhZGNydW1iLlJvbGVTdHlsZXM9e2ludGVybmFsUm9sZTonYXgtaW50ZXJuYWwtcm9sZScscm9sZTonYXgtcm9sZScsfTs7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImFjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eU5vZGUuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLnNpZGViYXItcGFuZS5hY2Nlc3NpYmlsaXR5LWNvbXB1dGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDMpO1xufVxuXG4ud2lkZ2V0LmF4LXN1YnBhbmUge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG5kaXYuYXgtdGV4dC1hbHRlcm5hdGl2ZXMge1xuICAgIG1hcmdpbi1ib3R0b206IDNweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0JGQkZCRjtcbn1cblxuLmF4LWlnbm9yZWQtaW5mbyB7XG4gICAgcGFkZGluZzogNnB4O1xufVxuXG4uYXgtaWdub3JlZC1ub2RlLXBhbmUge1xuICAgIGZsZXg6IG5vbmU7XG59XG5cbi5pbnZhbGlkIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuc3Bhbi5heC12YWx1ZS11bmRlZmluZWQge1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLmF4LXZhbHVlLXNvdXJjZS11bnVzZWQge1xuICAgIG9wYWNpdHk6IDAuNztcbn1cblxuLmF4LXZhbHVlLXNvdXJjZS1zdXBlcnNlZGVkLFxuLmF4LXZhbHVlLXNvdXJjZS1pbnZhbGlkIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLnNpZGViYXItcGFuZS1zdGFjayAuc2lkZWJhci1wYW5lIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsYWJlbFtpcz1kdC1pY29uLWxhYmVsXSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGxlZnQ6IC0xMXB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxpIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgcGFkZGluZy1sZWZ0OiAxcHg7XG4gICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgd2lkdGg6IDE0cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLnByb3BlcnR5IHtcbiAgICBjb2xvcjogcmdiKDMzLCAzMywgMzMpO1xufVxuXG4udHJlZS1vdXRsaW5lIGxpLmludmFsaWQge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtMnB4O1xufVxuXG4udHJlZS1vdXRsaW5lIGxhYmVsW2lzPWR0LWljb24tbGFiZWxdICsgLmF4LW5hbWUge1xuICAgIG1hcmdpbi1sZWZ0OiAtMTFweDtcbn1cblxuLnRyZWUtb3V0bGluZSBsaSBzcGFuIHtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4vKiMgc291cmNlVVJMPWFjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eU5vZGUuY3NzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5UHJvcGVydGllcy5jc3MiXT0iLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cbiAqL1xuXG4uYXgtbmFtZSB7XG4gICAgY29sb3I6IHJnYigxNTMsIDY5LCAwKTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLmF4LXJlYWRhYmxlLW5hbWUge1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIHBhZGRpbmctbGVmdDogMnB4O1xufVxuXG4uYXgtcmVhZGFibGUtc3RyaW5nIHtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5heC12YWx1ZS1zdHJpbmcge1xuICAgIGNvbG9yOiByZ2IoMjAwLCAwLCAwKTtcbn1cblxuc3Bhbi5heC1pbnRlcm5hbC1yb2xlIHtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8qIyBzb3VyY2VVUkw9YWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5UHJvcGVydGllcy5jc3MgKi8iO1J1bnRpbWUuY2FjaGVkUmVzb3VyY2VzWyJhY2Nlc3NpYmlsaXR5L2F4QnJlYWRjcnVtYnMuY3NzIl09Ii8qXG4gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuLmF4LWJyZWFkY3J1bWJzLWlnbm9yZWQtbm9kZSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIG9wYWNpdHk6IDAuNztcbn1cblxuLmF4LWJyZWFkY3J1bWJzIHtcbiAgICBwYWRkaW5nLXRvcDogMXB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZSB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgbWluLWhlaWdodDogMTZweDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICAgIHBhZGRpbmctdG9wOiAxcHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZSBzcGFuIHtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4uYXgtYnJlYWRjcnVtYnMgLmF4LW5vZGUgLndyYXBwZXIge1xuICAgIHBhZGRpbmctbGVmdDogMTJweDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZTo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChJbWFnZXMvY2hldnJvbnMucG5nKTtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IDAgMDtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMzBweCAxMHB4O1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNDgsIDU3LCA2Nik7XG4gICAgY29udGVudDogXCJcIjtcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0ycHg7XG4gICAgaGVpZ2h0OiAxMnB4O1xuICAgIHdpZHRoOiAxNHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbkBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjEpIHtcbiAgICAuYXgtYnJlYWRjcnVtYnMgLmF4LW5vZGU6OmJlZm9yZSB7XG4gICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKEltYWdlcy9jaGV2cm9uc18yeC5wbmcpO1xuICAgIH1cbn0gLyogbWVkaWEgKi9cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlOm5vdCgucGFyZW50KTpub3QoLmNoaWxkcmVuLXVubG9hZGVkKTo6YmVmb3JlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlLnBhcmVudDo6YmVmb3JlIHtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IC0yMHB4IDFweDtcbn1cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlLmNoaWxkcmVuLXVubG9hZGVkOjpiZWZvcmUge1xuICAgIC13ZWJraXQtbWFzay1wb3NpdGlvbjogMHB4IDFweDtcbiAgICB3aWR0aDogMTNweDtcbn1cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlLm5vLWRvbS1ub2RlIHtcbiAgICBvcGFjaXR5OiAwLjc7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5jaGlsZHJlbi11bmxvYWRlZDo6YmVmb3JlIHtcbiAgICBvcGFjaXR5OiAwLjQ7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5wcmVzZWxlY3RlZDpub3QoLmluc3BlY3RlZCkgLnNlbGVjdGlvbixcbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5ob3ZlcmVkOm5vdCguaW5zcGVjdGVkKSAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBsZWZ0OiAycHg7XG4gICAgcmlnaHQ6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU2LCAxMjEsIDIxNywgMC4xKTtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5wcmVzZWxlY3RlZDpub3QoLmluc3BlY3RlZCk6Zm9jdXMgLnNlbGVjdGlvbiB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTIxLCAyMTcsIDAuNCk7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZSAuc2VsZWN0aW9uIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHotaW5kZXg6IC0xO1xufVxuXG4uYXgtYnJlYWRjcnVtYnMgLmF4LW5vZGUuaW5zcGVjdGVkIC5zZWxlY3Rpb24ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5pbnNwZWN0ZWQ6Zm9jdXMgLnNlbGVjdGlvbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2VsZWN0aW9uLWJnLWNvbG9yKTtcbn1cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlLnBhcmVudC5pbnNwZWN0ZWQ6Zm9jdXM6OmJlZm9yZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi5heC1icmVhZGNydW1icyAuYXgtbm9kZS5pbnNwZWN0ZWQ6Zm9jdXMge1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLmF4LWJyZWFkY3J1bWJzIC5heC1ub2RlLmluc3BlY3RlZDpmb2N1cyAqIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbn1cblxuLyojIHNvdXJjZVVSTD1hY2Nlc3NpYmlsaXR5L2F4QnJlYWRjcnVtYnMuY3NzICovIjtyZXF1aXJlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitpKyInIik7dGhyb3cgYS5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixhO312YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cik7fSxwLHAuZXhwb3J0cyxyLGUsbix0KTt9cmV0dXJuIG5baV0uZXhwb3J0czt9Zm9yKHZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvO31yZXR1cm4gcjt9KCkoeyIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9hY2Nlc3NrZXlzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgQWNjZXNza2V5cyBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonYWNjZXNza2V5cycsdGl0bGU6J2BbYWNjZXNza2V5XWAgdmFsdWVzIGFyZSB1bmlxdWUnLGZhaWx1cmVUaXRsZTonYFthY2Nlc3NrZXldYCB2YWx1ZXMgYXJlIG5vdCB1bmlxdWUnLGRlc2NyaXB0aW9uOidBY2Nlc3Mga2V5cyBsZXQgdXNlcnMgcXVpY2tseSBmb2N1cyBhIHBhcnQgb2YgdGhlIHBhZ2UuIEZvciBwcm9wZXIgJysnbmF2aWdhdGlvbiwgZWFjaCBhY2Nlc3Mga2V5IG11c3QgYmUgdW5pcXVlLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYWNjZXNza2V5cz9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1BY2Nlc3NrZXlzO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9hcmlhLWFsbG93ZWQtYXR0ciI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIEFSSUFBbGxvd2VkQXR0ciBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonYXJpYS1hbGxvd2VkLWF0dHInLHRpdGxlOidgW2FyaWEtKl1gIGF0dHJpYnV0ZXMgbWF0Y2ggdGhlaXIgcm9sZXMnLGZhaWx1cmVUaXRsZTonYFthcmlhLSpdYCBhdHRyaWJ1dGVzIGRvIG5vdCBtYXRjaCB0aGVpciByb2xlcycsZGVzY3JpcHRpb246J0VhY2ggQVJJQSBgcm9sZWAgc3VwcG9ydHMgYSBzcGVjaWZpYyBzdWJzZXQgb2YgYGFyaWEtKmAgYXR0cmlidXRlcy4gJysnTWlzbWF0Y2hpbmcgdGhlc2UgaW52YWxpZGF0ZXMgdGhlIGBhcmlhLSpgIGF0dHJpYnV0ZXMuIFtMZWFybiAnKydtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9hcmlhLWFsbG93ZWQtYXR0cj9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1BUklBQWxsb3dlZEF0dHI7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2FyaWEtcmVxdWlyZWQtYXR0ciI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIEFSSUFSZXF1aXJlZEF0dHIgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2FyaWEtcmVxdWlyZWQtYXR0cicsdGl0bGU6J2Bbcm9sZV1gcyBoYXZlIGFsbCByZXF1aXJlZCBgW2FyaWEtKl1gIGF0dHJpYnV0ZXMnLGZhaWx1cmVUaXRsZTonYFtyb2xlXWBzIGRvIG5vdCBoYXZlIGFsbCByZXF1aXJlZCBgW2FyaWEtKl1gIGF0dHJpYnV0ZXMnLGRlc2NyaXB0aW9uOidTb21lIEFSSUEgcm9sZXMgaGF2ZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHRoYXQgZGVzY3JpYmUgdGhlIHN0YXRlICcrJ29mIHRoZSBlbGVtZW50IHRvIHNjcmVlbiByZWFkZXJzLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYXJpYS1yZXF1aXJlZC1hdHRyP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUFSSUFSZXF1aXJlZEF0dHI7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2FyaWEtcmVxdWlyZWQtY2hpbGRyZW4iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBBcmlhUmVxdWlyZWRDaGlsZHJlbiBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonYXJpYS1yZXF1aXJlZC1jaGlsZHJlbicsdGl0bGU6J0VsZW1lbnRzIHdpdGggYFtyb2xlXWAgdGhhdCByZXF1aXJlIHNwZWNpZmljIGNoaWxkcmVuIGBbcm9sZV1gcywgYXJlIHByZXNlbnQnLGZhaWx1cmVUaXRsZTonRWxlbWVudHMgd2l0aCBgW3JvbGVdYCB0aGF0IHJlcXVpcmUgc3BlY2lmaWMgY2hpbGRyZW4gYFtyb2xlXWBzLCAnKydhcmUgbWlzc2luZy4nLGRlc2NyaXB0aW9uOidTb21lIEFSSUEgcGFyZW50IHJvbGVzIG11c3QgY29udGFpbiBzcGVjaWZpYyBjaGlsZCByb2xlcyB0byBwZXJmb3JtICcrJ3RoZWlyIGludGVuZGVkIGFjY2Vzc2liaWxpdHkgZnVuY3Rpb25zLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYXJpYS1yZXF1aXJlZC1jaGlsZHJlbj9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1BcmlhUmVxdWlyZWRDaGlsZHJlbjt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvYXJpYS1yZXF1aXJlZC1wYXJlbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBBcmlhUmVxdWlyZWRQYXJlbnQgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2FyaWEtcmVxdWlyZWQtcGFyZW50Jyx0aXRsZTonYFtyb2xlXWBzIGFyZSBjb250YWluZWQgYnkgdGhlaXIgcmVxdWlyZWQgcGFyZW50IGVsZW1lbnQnLGZhaWx1cmVUaXRsZTonYFtyb2xlXWBzIGFyZSBub3QgY29udGFpbmVkIGJ5IHRoZWlyIHJlcXVpcmVkIHBhcmVudCBlbGVtZW50JyxkZXNjcmlwdGlvbjonU29tZSBBUklBIGNoaWxkIHJvbGVzIG11c3QgYmUgY29udGFpbmVkIGJ5IHNwZWNpZmljIHBhcmVudCByb2xlcyB0byAnKydwcm9wZXJseSBwZXJmb3JtIHRoZWlyIGludGVuZGVkIGFjY2Vzc2liaWxpdHkgZnVuY3Rpb25zLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYXJpYS1yZXF1aXJlZC1wYXJlbnQ/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9QXJpYVJlcXVpcmVkUGFyZW50O30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9hcmlhLXJvbGVzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgQXJpYVJvbGVzIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidhcmlhLXJvbGVzJyx0aXRsZTonYFtyb2xlXWAgdmFsdWVzIGFyZSB2YWxpZCcsZmFpbHVyZVRpdGxlOidgW3JvbGVdYCB2YWx1ZXMgYXJlIG5vdCB2YWxpZCcsZGVzY3JpcHRpb246J0FSSUEgcm9sZXMgbXVzdCBoYXZlIHZhbGlkIHZhbHVlcyBpbiBvcmRlciB0byBwZXJmb3JtIHRoZWlyICcrJ2ludGVuZGVkIGFjY2Vzc2liaWxpdHkgZnVuY3Rpb25zLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYXJpYS1yb2xlcz9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1BcmlhUm9sZXM7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2FyaWEtdmFsaWQtYXR0ci12YWx1ZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIEFSSUFWYWxpZEF0dHIgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2FyaWEtdmFsaWQtYXR0ci12YWx1ZScsdGl0bGU6J2BbYXJpYS0qXWAgYXR0cmlidXRlcyBoYXZlIHZhbGlkIHZhbHVlcycsZmFpbHVyZVRpdGxlOidgW2FyaWEtKl1gIGF0dHJpYnV0ZXMgZG8gbm90IGhhdmUgdmFsaWQgdmFsdWVzJyxkZXNjcmlwdGlvbjonQXNzaXN0aXZlIHRlY2hub2xvZ2llcywgbGlrZSBzY3JlZW4gcmVhZGVycywgY2FuXCd0IGludGVycHJldCBBUklBICcrJ2F0dHJpYnV0ZXMgd2l0aCBpbnZhbGlkIHZhbHVlcy4gW0xlYXJuICcrJ21vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2FyaWEtdmFsaWQtYXR0ci12YWx1ZT9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1BUklBVmFsaWRBdHRyO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9hcmlhLXZhbGlkLWF0dHIiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBBUklBVmFsaWRBdHRyIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidhcmlhLXZhbGlkLWF0dHInLHRpdGxlOidgW2FyaWEtKl1gIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGFuZCBub3QgbWlzc3BlbGxlZCcsZmFpbHVyZVRpdGxlOidgW2FyaWEtKl1gIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZCBvciBtaXNzcGVsbGVkJyxkZXNjcmlwdGlvbjonQXNzaXN0aXZlIHRlY2hub2xvZ2llcywgbGlrZSBzY3JlZW4gcmVhZGVycywgY2FuXCd0IGludGVycHJldCBBUklBICcrJ2F0dHJpYnV0ZXMgd2l0aCBpbnZhbGlkIG5hbWVzLiBbTGVhcm4gJysnbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYXJpYS12YWxpZC1hdHRyP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUFSSUFWYWxpZEF0dHI7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2F1ZGlvLWNhcHRpb24iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBBdWRpb0NhcHRpb24gZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2F1ZGlvLWNhcHRpb24nLHRpdGxlOidgPGF1ZGlvPmAgZWxlbWVudHMgY29udGFpbiBhIGA8dHJhY2s+YCBlbGVtZW50IHdpdGggYFtraW5kPSJjYXB0aW9ucyJdYCcsZmFpbHVyZVRpdGxlOidgPGF1ZGlvPmAgZWxlbWVudHMgYXJlIG1pc3NpbmcgYSBgPHRyYWNrPmAgZWxlbWVudCB3aXRoICcrJ2Bba2luZD0iY2FwdGlvbnMiXWAuJyxkZXNjcmlwdGlvbjonQ2FwdGlvbnMgbWFrZSBhdWRpbyBlbGVtZW50cyB1c2FibGUgZm9yIGRlYWYgb3IgaGVhcmluZy1pbXBhaXJlZCB1c2VycywgJysncHJvdmlkaW5nIGNyaXRpY2FsIGluZm9ybWF0aW9uIHN1Y2ggYXMgd2hvIGlzIHRhbGtpbmcsIHdoYXQgdGhleVwncmUgc2F5aW5nLCAnKydhbmQgb3RoZXIgbm9uLXNwZWVjaCBpbmZvcm1hdGlvbi4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2F1ZGlvLWNhcHRpb24/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9QXVkaW9DYXB0aW9uO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9idXR0b24tbmFtZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIEJ1dHRvbk5hbWUgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2J1dHRvbi1uYW1lJyx0aXRsZTonQnV0dG9ucyBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZScsZmFpbHVyZVRpdGxlOidCdXR0b25zIGRvIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZScsZGVzY3JpcHRpb246J1doZW4gYSBidXR0b24gZG9lc25cJ3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUsIHNjcmVlbiByZWFkZXJzIGFubm91bmNlIGl0ICcrJ2FzICJidXR0b24iLCBtYWtpbmcgaXQgdW51c2FibGUgZm9yIHVzZXJzIHdobyByZWx5IG9uIHNjcmVlbiByZWFkZXJzLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYnV0dG9uLW5hbWU/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9QnV0dG9uTmFtZTt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvYnlwYXNzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgQnlwYXNzIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidieXBhc3MnLHRpdGxlOidUaGUgcGFnZSBjb250YWlucyBhIGhlYWRpbmcsIHNraXAgbGluaywgb3IgbGFuZG1hcmsgcmVnaW9uJyxmYWlsdXJlVGl0bGU6J1RoZSBwYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBoZWFkaW5nLCBza2lwIGxpbmssIG9yIGxhbmRtYXJrIHJlZ2lvbicsZGVzY3JpcHRpb246J0FkZGluZyB3YXlzIHRvIGJ5cGFzcyByZXBldGl0aXZlIGNvbnRlbnQgbGV0cyBrZXlib2FyZCB1c2VycyBuYXZpZ2F0ZSB0aGUgJysncGFnZSBtb3JlIGVmZmljaWVudGx5LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvYnlwYXNzP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUJ5cGFzczt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvY29sb3ItY29udHJhc3QiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBDb2xvckNvbnRyYXN0IGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidjb2xvci1jb250cmFzdCcsdGl0bGU6J0JhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29sb3JzIGhhdmUgYSBzdWZmaWNpZW50IGNvbnRyYXN0IHJhdGlvJyxmYWlsdXJlVGl0bGU6J0JhY2tncm91bmQgYW5kIGZvcmVncm91bmQgY29sb3JzIGRvIG5vdCBoYXZlIGEgJysnc3VmZmljaWVudCBjb250cmFzdCByYXRpby4nLGRlc2NyaXB0aW9uOidMb3ctY29udHJhc3QgdGV4dCBpcyBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSBmb3IgbWFueSB1c2VycyB0byByZWFkLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvY29sb3ItY29udHJhc3Q/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9Q29sb3JDb250cmFzdDt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvZGVmaW5pdGlvbi1saXN0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgRGVmaW5pdGlvbkxpc3QgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2RlZmluaXRpb24tbGlzdCcsdGl0bGU6J2A8ZGw+YFwncyBjb250YWluIG9ubHkgcHJvcGVybHktb3JkZXJlZCBgPGR0PmAgYW5kIGA8ZGQ+YCBncm91cHMsIGA8c2NyaXB0PmAgJysnb3IgYDx0ZW1wbGF0ZT5gIGVsZW1lbnRzLicsZmFpbHVyZVRpdGxlOidgPGRsPmBcJ3MgZG8gbm90IGNvbnRhaW4gb25seSBwcm9wZXJseS1vcmRlcmVkIGA8ZHQ+YCBhbmQgYDxkZD5gICcrJ2dyb3VwcywgYDxzY3JpcHQ+YCBvciBgPHRlbXBsYXRlPmAgZWxlbWVudHMuJyxkZXNjcmlwdGlvbjonV2hlbiBkZWZpbml0aW9uIGxpc3RzIGFyZSBub3QgcHJvcGVybHkgbWFya2VkIHVwLCBzY3JlZW4gcmVhZGVycyBtYXkgcHJvZHVjZSAnKydjb25mdXNpbmcgb3IgaW5hY2N1cmF0ZSBvdXRwdXQuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9kZWZpbml0aW9uLWxpc3Q/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9RGVmaW5pdGlvbkxpc3Q7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2RsaXRlbSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIERMSXRlbSBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZGxpdGVtJyx0aXRsZTonRGVmaW5pdGlvbiBsaXN0IGl0ZW1zIGFyZSB3cmFwcGVkIGluIGA8ZGw+YCBlbGVtZW50cycsZmFpbHVyZVRpdGxlOidEZWZpbml0aW9uIGxpc3QgaXRlbXMgYXJlIG5vdCB3cmFwcGVkIGluIGA8ZGw+YCBlbGVtZW50cycsZGVzY3JpcHRpb246J0RlZmluaXRpb24gbGlzdCBpdGVtcyAoYDxkdD5gIGFuZCBgPGRkPmApIG11c3QgYmUgd3JhcHBlZCBpbiBhICcrJ3BhcmVudCBgPGRsPmAgZWxlbWVudCB0byBlbnN1cmUgdGhhdCBzY3JlZW4gcmVhZGVycyBjYW4gcHJvcGVybHkgYW5ub3VuY2UgdGhlbS4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2RsaXRlbT9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1ETEl0ZW07fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2RvY3VtZW50LXRpdGxlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgRG9jdW1lbnRUaXRsZSBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZG9jdW1lbnQtdGl0bGUnLHRpdGxlOidEb2N1bWVudCBoYXMgYSBgPHRpdGxlPmAgZWxlbWVudCcsZmFpbHVyZVRpdGxlOidEb2N1bWVudCBkb2VzblwndCBoYXZlIGEgYDx0aXRsZT5gIGVsZW1lbnQnLGRlc2NyaXB0aW9uOidUaGUgdGl0bGUgZ2l2ZXMgc2NyZWVuIHJlYWRlciB1c2VycyBhbiBvdmVydmlldyBvZiB0aGUgcGFnZSwgYW5kIHNlYXJjaCAnKydlbmdpbmUgdXNlcnMgcmVseSBvbiBpdCBoZWF2aWx5IHRvIGRldGVybWluZSBpZiBhIHBhZ2UgaXMgcmVsZXZhbnQgdG8gdGhlaXIgc2VhcmNoLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL3RpdGxlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1Eb2N1bWVudFRpdGxlO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9kdXBsaWNhdGUtaWQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBEdXBsaWNhdGVJZCBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZHVwbGljYXRlLWlkJyx0aXRsZTonYFtpZF1gIGF0dHJpYnV0ZXMgb24gdGhlIHBhZ2UgYXJlIHVuaXF1ZScsZmFpbHVyZVRpdGxlOidgW2lkXWAgYXR0cmlidXRlcyBvbiB0aGUgcGFnZSBhcmUgbm90IHVuaXF1ZScsZGVzY3JpcHRpb246J1RoZSB2YWx1ZSBvZiBhbiBpZCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmlxdWUgdG8gcHJldmVudCAnKydvdGhlciBpbnN0YW5jZXMgZnJvbSBiZWluZyBvdmVybG9va2VkIGJ5IGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9kdXBsaWNhdGUtaWQ/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9RHVwbGljYXRlSWQ7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2ZyYW1lLXRpdGxlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgRnJhbWVUaXRsZSBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZnJhbWUtdGl0bGUnLHRpdGxlOidgPGZyYW1lPmAgb3IgYDxpZnJhbWU+YCBlbGVtZW50cyBoYXZlIGEgdGl0bGUnLGZhaWx1cmVUaXRsZTonYDxmcmFtZT5gIG9yIGA8aWZyYW1lPmAgZWxlbWVudHMgZG8gbm90IGhhdmUgYSB0aXRsZScsZGVzY3JpcHRpb246J1NjcmVlbiByZWFkZXIgdXNlcnMgcmVseSBvbiBmcmFtZSB0aXRsZXMgdG8gZGVzY3JpYmUgdGhlIGNvbnRlbnRzIG9mIGZyYW1lcy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2ZyYW1lLXRpdGxlP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUZyYW1lVGl0bGU7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2h0bWwtaGFzLWxhbmciOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBIVE1MSGFzTGFuZyBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaHRtbC1oYXMtbGFuZycsdGl0bGU6J2A8aHRtbD5gIGVsZW1lbnQgaGFzIGEgYFtsYW5nXWAgYXR0cmlidXRlJyxmYWlsdXJlVGl0bGU6J2A8aHRtbD5gIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIGBbbGFuZ11gIGF0dHJpYnV0ZScsZGVzY3JpcHRpb246J0lmIGEgcGFnZSBkb2VzblwndCBzcGVjaWZ5IGEgbGFuZyBhdHRyaWJ1dGUsIGEgc2NyZWVuIHJlYWRlciBhc3N1bWVzICcrJ3RoYXQgdGhlIHBhZ2UgaXMgaW4gdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdGhhdCB0aGUgdXNlciBjaG9zZSB3aGVuIHNldHRpbmcgdXAgdGhlICcrJ3NjcmVlbiByZWFkZXIuIElmIHRoZSBwYWdlIGlzblwndCBhY3R1YWxseSBpbiB0aGUgZGVmYXVsdCBsYW5ndWFnZSwgdGhlbiB0aGUgc2NyZWVuICcrJ3JlYWRlciBtaWdodCBub3QgYW5ub3VuY2UgdGhlIHBhZ2VcJ3MgdGV4dCBjb3JyZWN0bHkuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9odG1sLWxhbmc/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9SFRNTEhhc0xhbmc7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2h0bWwtbGFuZy12YWxpZCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIEhUTUxMYW5nVmFsaWQgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2h0bWwtbGFuZy12YWxpZCcsdGl0bGU6J2A8aHRtbD5gIGVsZW1lbnQgaGFzIGEgdmFsaWQgdmFsdWUgZm9yIGl0cyBgW2xhbmddYCBhdHRyaWJ1dGUnLGZhaWx1cmVUaXRsZTonYDxodG1sPmAgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmFsdWUgZm9yICcrJ2l0cyBgW2xhbmddYCBhdHRyaWJ1dGUuJyxkZXNjcmlwdGlvbjonU3BlY2lmeWluZyBhIHZhbGlkIFtCQ1AgNDcgbGFuZ3VhZ2VdKGh0dHBzOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1jaG9vc2luZy1sYW5ndWFnZS10YWdzI3F1ZXN0aW9uKSAnKydoZWxwcyBzY3JlZW4gcmVhZGVycyBhbm5vdW5jZSB0ZXh0IHByb3Blcmx5LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvdmFsaWQtbGFuZz9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1IVE1MTGFuZ1ZhbGlkO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9pbWFnZS1hbHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBJbWFnZUFsdCBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaW1hZ2UtYWx0Jyx0aXRsZTonSW1hZ2UgZWxlbWVudHMgaGF2ZSBgW2FsdF1gIGF0dHJpYnV0ZXMnLGZhaWx1cmVUaXRsZTonSW1hZ2UgZWxlbWVudHMgZG8gbm90IGhhdmUgYFthbHRdYCBhdHRyaWJ1dGVzJyxkZXNjcmlwdGlvbjonSW5mb3JtYXRpdmUgZWxlbWVudHMgc2hvdWxkIGFpbSBmb3Igc2hvcnQsIGRlc2NyaXB0aXZlIGFsdGVybmF0ZSB0ZXh0LiAnKydEZWNvcmF0aXZlIGVsZW1lbnRzIGNhbiBiZSBpZ25vcmVkIHdpdGggYW4gZW1wdHkgYWx0IGF0dHJpYnV0ZS4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2ltYWdlLWFsdD9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1JbWFnZUFsdDt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvaW5wdXQtaW1hZ2UtYWx0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgSW5wdXRJbWFnZUFsdCBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaW5wdXQtaW1hZ2UtYWx0Jyx0aXRsZTonYDxpbnB1dCB0eXBlPSJpbWFnZSI+YCBlbGVtZW50cyBoYXZlIGBbYWx0XWAgdGV4dCcsZmFpbHVyZVRpdGxlOidgPGlucHV0IHR5cGU9ImltYWdlIj5gIGVsZW1lbnRzIGRvIG5vdCBoYXZlIGBbYWx0XWAgdGV4dCcsZGVzY3JpcHRpb246J1doZW4gYW4gaW1hZ2UgaXMgYmVpbmcgdXNlZCBhcyBhbiBgPGlucHV0PmAgYnV0dG9uLCBwcm92aWRpbmcgYWx0ZXJuYXRpdmUgJysndGV4dCBjYW4gaGVscCBzY3JlZW4gcmVhZGVyIHVzZXJzIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgdGhlIGJ1dHRvbi4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL2lucHV0LWltYWdlLWFsdD9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1JbnB1dEltYWdlQWx0O30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9sYWJlbCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIExhYmVsIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidsYWJlbCcsdGl0bGU6J0Zvcm0gZWxlbWVudHMgaGF2ZSBhc3NvY2lhdGVkIGxhYmVscycsZmFpbHVyZVRpdGxlOidGb3JtIGVsZW1lbnRzIGRvIG5vdCBoYXZlIGFzc29jaWF0ZWQgbGFiZWxzJyxkZXNjcmlwdGlvbjonTGFiZWxzIGVuc3VyZSB0aGF0IGZvcm0gY29udHJvbHMgYXJlIGFubm91bmNlZCBwcm9wZXJseSBieSBhc3Npc3RpdmUgJysndGVjaG5vbG9naWVzLCBsaWtlIHNjcmVlbiByZWFkZXJzLiBbTGVhcm4gJysnbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvbGFiZWw/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9TGFiZWw7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2xheW91dC10YWJsZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIExheW91dFRhYmxlIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidsYXlvdXQtdGFibGUnLHRpdGxlOidQcmVzZW50YXRpb25hbCBgPHRhYmxlPmAgZWxlbWVudHMgYXZvaWQgdXNpbmcgYDx0aD5gLCBgPGNhcHRpb24+YCBvciB0aGUgJysnYFtzdW1tYXJ5XWAgYXR0cmlidXRlLicsZmFpbHVyZVRpdGxlOidQcmVzZW50YXRpb25hbCBgPHRhYmxlPmAgZWxlbWVudHMgZG8gbm90IGF2b2lkIHVzaW5nIGA8dGg+YCwgJysnYDxjYXB0aW9uPmAgb3IgdGhlIGBbc3VtbWFyeV1gIGF0dHJpYnV0ZS4nLGRlc2NyaXB0aW9uOidBIHRhYmxlIGJlaW5nIHVzZWQgZm9yIGxheW91dCBwdXJwb3NlcyBzaG91bGQgbm90IGluY2x1ZGUgZGF0YSBlbGVtZW50cywgJysnc3VjaCBhcyB0aGUgdGggb3IgY2FwdGlvbiBlbGVtZW50cyBvciB0aGUgc3VtbWFyeSBhdHRyaWJ1dGUsIGJlY2F1c2UgdGhpcyBjYW4gJysnY3JlYXRlIGEgY29uZnVzaW5nIGV4cGVyaWVuY2UgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9sYXlvdXQtdGFibGU/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9TGF5b3V0VGFibGU7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L2xpbmstbmFtZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIExpbmtOYW1lIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidsaW5rLW5hbWUnLHRpdGxlOidMaW5rcyBoYXZlIGEgZGlzY2VybmlibGUgbmFtZScsZmFpbHVyZVRpdGxlOidMaW5rcyBkbyBub3QgaGF2ZSBhIGRpc2Nlcm5pYmxlIG5hbWUnLGRlc2NyaXB0aW9uOidMaW5rIHRleHQgKGFuZCBhbHRlcm5hdGUgdGV4dCBmb3IgaW1hZ2VzLCB3aGVuIHVzZWQgYXMgbGlua3MpIHRoYXQgaXMgJysnZGlzY2VybmlibGUsIHVuaXF1ZSwgYW5kIGZvY3VzYWJsZSBpbXByb3ZlcyB0aGUgbmF2aWdhdGlvbiBleHBlcmllbmNlIGZvciAnKydzY3JlZW4gcmVhZGVyIHVzZXJzLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvbGluay1uYW1lP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUxpbmtOYW1lO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9saXN0aXRlbSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIExpc3RJdGVtIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidsaXN0aXRlbScsdGl0bGU6J0xpc3QgaXRlbXMgKGA8bGk+YCkgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYDx1bD5gIG9yIGA8b2w+YCBwYXJlbnQgZWxlbWVudHMnLGZhaWx1cmVUaXRsZTonTGlzdCBpdGVtcyAoYDxsaT5gKSBhcmUgbm90IGNvbnRhaW5lZCB3aXRoaW4gYDx1bD5gICcrJ29yIGA8b2w+YCBwYXJlbnQgZWxlbWVudHMuJyxkZXNjcmlwdGlvbjonU2NyZWVuIHJlYWRlcnMgcmVxdWlyZSBsaXN0IGl0ZW1zIChgPGxpPmApIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSAnKydwYXJlbnQgYDx1bD5gIG9yIGA8b2w+YCB0byBiZSBhbm5vdW5jZWQgcHJvcGVybHkuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9saXN0aXRlbT9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1MaXN0SXRlbTt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbGlzdCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIExpc3QgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2xpc3QnLHRpdGxlOidMaXN0cyBjb250YWluIG9ubHkgYDxsaT5gIGVsZW1lbnRzIGFuZCBzY3JpcHQgc3VwcG9ydGluZyBlbGVtZW50cyAnKycoYDxzY3JpcHQ+YCBhbmQgYDx0ZW1wbGF0ZT5gKS4nLGZhaWx1cmVUaXRsZTonTGlzdHMgZG8gbm90IGNvbnRhaW4gb25seSBgPGxpPmAgZWxlbWVudHMgYW5kIHNjcmlwdCAnKydzdXBwb3J0aW5nIGVsZW1lbnRzIChgPHNjcmlwdD5gIGFuZCBgPHRlbXBsYXRlPmApLicsZGVzY3JpcHRpb246J1NjcmVlbiByZWFkZXJzIGhhdmUgYSBzcGVjaWZpYyB3YXkgb2YgYW5ub3VuY2luZyBsaXN0cy4gRW5zdXJpbmcgcHJvcGVyIGxpc3QgJysnc3RydWN0dXJlIGFpZHMgc2NyZWVuIHJlYWRlciBvdXRwdXQuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi9saXN0P2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPUxpc3Q7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L21hbnVhbC9jdXN0b20tY29udHJvbHMtbGFiZWxzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQnKTtjbGFzcyBDdXN0b21Db250cm9sc0xhYmVscyBleHRlbmRzIE1hbnVhbEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybiBPYmplY3QuYXNzaWduKHtpZDonY3VzdG9tLWNvbnRyb2xzLWxhYmVscycsZGVzY3JpcHRpb246J0N1c3RvbSBpbnRlcmFjdGl2ZSBjb250cm9scyBoYXZlIGFzc29jaWF0ZWQgbGFiZWxzLCBwcm92aWRlZCBieSBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieS4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvYWNjZXNzaWJpbGl0eS9ob3ctdG8tcmV2aWV3I3RyeV9pdF93aXRoX2Ffc2NyZWVuX3JlYWRlcikuJyx0aXRsZTonQ3VzdG9tIGNvbnRyb2xzIGhhdmUgYXNzb2NpYXRlZCBsYWJlbHMnfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9Q3VzdG9tQ29udHJvbHNMYWJlbHM7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL2N1c3RvbS1jb250cm9scy1yb2xlcyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNYW51YWxBdWRpdD1yZXF1aXJlKCcuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Jyk7Y2xhc3MgQ3VzdG9tQ29udHJvbHNSb2xlcyBleHRlbmRzIE1hbnVhbEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybiBPYmplY3QuYXNzaWduKHtpZDonY3VzdG9tLWNvbnRyb2xzLXJvbGVzJyxkZXNjcmlwdGlvbjonQ3VzdG9tIGludGVyYWN0aXZlIGNvbnRyb2xzIGhhdmUgYXBwcm9wcmlhdGUgQVJJQSByb2xlcy4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvYWNjZXNzaWJpbGl0eS9ob3ctdG8tcmV2aWV3I3RyeV9pdF93aXRoX2Ffc2NyZWVuX3JlYWRlcikuJyx0aXRsZTonQ3VzdG9tIGNvbnRyb2xzIGhhdmUgQVJJQSByb2xlcyd9LHN1cGVyLnBhcnRpYWxNZXRhKTt9fQptb2R1bGUuZXhwb3J0cz1DdXN0b21Db250cm9sc1JvbGVzO30seyIuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Ijo0fV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L21hbnVhbC9mb2N1cy10cmFwcyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNYW51YWxBdWRpdD1yZXF1aXJlKCcuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Jyk7Y2xhc3MgRm9jdXNUcmFwcyBleHRlbmRzIE1hbnVhbEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybiBPYmplY3QuYXNzaWduKHtpZDonZm9jdXMtdHJhcHMnLGRlc2NyaXB0aW9uOidBIHVzZXIgY2FuIHRhYiBpbnRvIGFuZCBvdXQgb2YgYW55IGNvbnRyb2wgb3IgcmVnaW9uIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHRyYXBwaW5nIHRoZWlyIGZvY3VzLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9hY2Nlc3NpYmlsaXR5L2hvdy10by1yZXZpZXcjc3RhcnRfd2l0aF90aGVfa2V5Ym9hcmQpLicsdGl0bGU6J1VzZXIgZm9jdXMgaXMgbm90IGFjY2lkZW50YWxseSB0cmFwcGVkIGluIGEgcmVnaW9uJ30sc3VwZXIucGFydGlhbE1ldGEpO319Cm1vZHVsZS5leHBvcnRzPUZvY3VzVHJhcHM7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL2ZvY3VzYWJsZS1jb250cm9scyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNYW51YWxBdWRpdD1yZXF1aXJlKCcuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Jyk7Y2xhc3MgRm9jdXNhYmxlQ29udHJvbHMgZXh0ZW5kcyBNYW51YWxBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7aWQ6J2ZvY3VzYWJsZS1jb250cm9scycsZGVzY3JpcHRpb246J0N1c3RvbSBpbnRlcmFjdGl2ZSBjb250cm9scyBhcmUga2V5Ym9hcmQgZm9jdXNhYmxlIGFuZCBkaXNwbGF5IGEgZm9jdXMgaW5kaWNhdG9yLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9hY2Nlc3NpYmlsaXR5L2hvdy10by1yZXZpZXcjc3RhcnRfd2l0aF90aGVfa2V5Ym9hcmQpLicsdGl0bGU6J0ludGVyYWN0aXZlIGNvbnRyb2xzIGFyZSBrZXlib2FyZCBmb2N1c2FibGUnfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9Rm9jdXNhYmxlQ29udHJvbHM7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL2hlYWRpbmctbGV2ZWxzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQnKTtjbGFzcyBIZWFkaW5nTGV2ZWxzIGV4dGVuZHMgTWFudWFsQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOidoZWFkaW5nLWxldmVscycsZGVzY3JpcHRpb246J0hlYWRpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbiBvdXRsaW5lIGZvciB0aGUgcGFnZSBhbmQgaGVhZGluZyBsZXZlbHMgYXJlIG5vdCBza2lwcGVkLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9hY2Nlc3NpYmlsaXR5L2hvdy10by1yZXZpZXcjdGFrZV9hZHZhbnRhZ2Vfb2ZfaGVhZGluZ3NfYW5kX2xhbmRtYXJrcykuJyx0aXRsZTonSGVhZGluZ3MgZG9uXCd0IHNraXAgbGV2ZWxzJ30sc3VwZXIucGFydGlhbE1ldGEpO319Cm1vZHVsZS5leHBvcnRzPUhlYWRpbmdMZXZlbHM7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL2xvZ2ljYWwtdGFiLW9yZGVyIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQnKTtjbGFzcyBMb2dpY2FsVGFiT3JkZXIgZXh0ZW5kcyBNYW51YWxBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7aWQ6J2xvZ2ljYWwtdGFiLW9yZGVyJyxkZXNjcmlwdGlvbjonVGFiYmluZyB0aHJvdWdoIHRoZSBwYWdlIGZvbGxvd3MgdGhlIHZpc3VhbCBsYXlvdXQuIFVzZXJzIGNhbm5vdCBmb2N1cyBlbGVtZW50cyB0aGF0IGFyZSBvZmZzY3JlZW4uIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL2FjY2Vzc2liaWxpdHkvaG93LXRvLXJldmlldyNzdGFydF93aXRoX3RoZV9rZXlib2FyZCkuJyx0aXRsZTonVGhlIHBhZ2UgaGFzIGEgbG9naWNhbCB0YWIgb3JkZXInfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9TG9naWNhbFRhYk9yZGVyO30seyIuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Ijo0fV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L21hbnVhbC9tYW5hZ2VkLWZvY3VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQnKTtjbGFzcyBNYW5hZ2VkRm9jdXMgZXh0ZW5kcyBNYW51YWxBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7aWQ6J21hbmFnZWQtZm9jdXMnLGRlc2NyaXB0aW9uOidJZiBuZXcgY29udGVudCwgc3VjaCBhcyBhIGRpYWxvZywgaXMgYWRkZWQgdG8gdGhlIHBhZ2UsIHRoZSB1c2VyXCdzIGZvY3VzIGlzIGRpcmVjdGVkIHRvIGl0LiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9hY2Nlc3NpYmlsaXR5L2hvdy10by1yZXZpZXcjc3RhcnRfd2l0aF90aGVfa2V5Ym9hcmQpLicsdGl0bGU6J1RoZSB1c2VyXCdzIGZvY3VzIGlzIGRpcmVjdGVkIHRvIG5ldyBjb250ZW50IGFkZGVkIHRvIHRoZSBwYWdlJ30sc3VwZXIucGFydGlhbE1ldGEpO319Cm1vZHVsZS5leHBvcnRzPU1hbmFnZWRGb2N1czt9LHsiLi4vLi4vbWFudWFsL21hbnVhbC1hdWRpdCI6NH1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS9tYW51YWwvb2Zmc2NyZWVuLWNvbnRlbnQtaGlkZGVuIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQnKTtjbGFzcyBPZmZzY3JlZW5Db250ZW50SGlkZGVuIGV4dGVuZHMgTWFudWFsQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOidvZmZzY3JlZW4tY29udGVudC1oaWRkZW4nLGRlc2NyaXB0aW9uOidPZmZzY3JlZW4gY29udGVudCBpcyBoaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lIG9yIGFyaWEtaGlkZGVuPXRydWUuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL2FjY2Vzc2liaWxpdHkvaG93LXRvLXJldmlldyN0cnlfaXRfd2l0aF9hX3NjcmVlbl9yZWFkZXIpLicsdGl0bGU6J09mZnNjcmVlbiBjb250ZW50IGlzIGhpZGRlbiBmcm9tIGFzc2lzdGl2ZSB0ZWNobm9sb2d5J30sc3VwZXIucGFydGlhbE1ldGEpO319Cm1vZHVsZS5leHBvcnRzPU9mZnNjcmVlbkNvbnRlbnRIaWRkZW47fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL3VzZS1sYW5kbWFya3MiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWFudWFsQXVkaXQ9cmVxdWlyZSgnLi4vLi4vbWFudWFsL21hbnVhbC1hdWRpdCcpO2NsYXNzIFVzZUxhbmRtYXJrcyBleHRlbmRzIE1hbnVhbEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybiBPYmplY3QuYXNzaWduKHtpZDondXNlLWxhbmRtYXJrcycsZGVzY3JpcHRpb246J0xhbmRtYXJrIGVsZW1lbnRzICg8bWFpbj4sIDxuYXY+LCBldGMuKSBhcmUgdXNlZCB0byBpbXByb3ZlIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIG9mIHRoZSBwYWdlIGZvciBhc3Npc3RpdmUgdGVjaG5vbG9neS4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvYWNjZXNzaWJpbGl0eS9ob3ctdG8tcmV2aWV3I3Rha2VfYWR2YW50YWdlX29mX2hlYWRpbmdzX2FuZF9sYW5kbWFya3MpLicsdGl0bGU6J0hUTUw1IGxhbmRtYXJrIGVsZW1lbnRzIGFyZSB1c2VkIHRvIGltcHJvdmUgbmF2aWdhdGlvbid9LHN1cGVyLnBhcnRpYWxNZXRhKTt9fQptb2R1bGUuZXhwb3J0cz1Vc2VMYW5kbWFya3M7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWFudWFsL3Zpc3VhbC1vcmRlci1mb2xsb3dzLWRvbSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNYW51YWxBdWRpdD1yZXF1aXJlKCcuLi8uLi9tYW51YWwvbWFudWFsLWF1ZGl0Jyk7Y2xhc3MgVmlzdWFsT3JkZXJGb2xsb3dzRE9NIGV4dGVuZHMgTWFudWFsQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOid2aXN1YWwtb3JkZXItZm9sbG93cy1kb20nLGRlc2NyaXB0aW9uOidET00gb3JkZXIgbWF0Y2hlcyB0aGUgdmlzdWFsIG9yZGVyLCBpbXByb3ZpbmcgbmF2aWdhdGlvbiBmb3IgYXNzaXN0aXZlIHRlY2hub2xvZ3kuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL2FjY2Vzc2liaWxpdHkvaG93LXRvLXJldmlldyN0cnlfaXRfd2l0aF9hX3NjcmVlbl9yZWFkZXIpLicsdGl0bGU6J1Zpc3VhbCBvcmRlciBvbiB0aGUgcGFnZSBmb2xsb3dzIERPTSBvcmRlcid9LHN1cGVyLnBhcnRpYWxNZXRhKTt9fQptb2R1bGUuZXhwb3J0cz1WaXN1YWxPcmRlckZvbGxvd3NET007fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWV0YS1yZWZyZXNoIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgTWV0YVJlZnJlc2ggZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J21ldGEtcmVmcmVzaCcsdGl0bGU6J1RoZSBkb2N1bWVudCBkb2VzIG5vdCB1c2UgYDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giPmAnLGZhaWx1cmVUaXRsZTonVGhlIGRvY3VtZW50IHVzZXMgYDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giPmAnLGRlc2NyaXB0aW9uOidVc2VycyBkbyBub3QgZXhwZWN0IGEgcGFnZSB0byByZWZyZXNoIGF1dG9tYXRpY2FsbHksIGFuZCBkb2luZyBzbyB3aWxsIG1vdmUgJysnZm9jdXMgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLiBUaGlzIG1heSBjcmVhdGUgYSBmcnVzdHJhdGluZyBvciAnKydjb25mdXNpbmcgZXhwZXJpZW5jZS4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL21ldGEtcmVmcmVzaD9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1NZXRhUmVmcmVzaDt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvbWV0YS12aWV3cG9ydCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIE1ldGFWaWV3cG9ydCBleHRlbmRzIEF4ZUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonbWV0YS12aWV3cG9ydCcsdGl0bGU6J2BbdXNlci1zY2FsYWJsZT0ibm8iXWAgaXMgbm90IHVzZWQgaW4gdGhlIGA8bWV0YSBuYW1lPSJ2aWV3cG9ydCI+YCAnKydlbGVtZW50IGFuZCB0aGUgYFttYXhpbXVtLXNjYWxlXWAgYXR0cmlidXRlIGlzIG5vdCBsZXNzIHRoYW4gNS4nLGZhaWx1cmVUaXRsZTonYFt1c2VyLXNjYWxhYmxlPSJubyJdYCBpcyB1c2VkIGluIHRoZSBgPG1ldGEgbmFtZT0idmlld3BvcnQiPmAgJysnZWxlbWVudCBvciB0aGUgYFttYXhpbXVtLXNjYWxlXWAgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiA1LicsZGVzY3JpcHRpb246J0Rpc2FibGluZyB6b29taW5nIGlzIHByb2JsZW1hdGljIGZvciB1c2VycyB3aXRoIGxvdyB2aXNpb24gd2hvIHJlbHkgb24gJysnc2NyZWVuIG1hZ25pZmljYXRpb24gdG8gcHJvcGVybHkgc2VlIHRoZSBjb250ZW50cyBvZiBhIHdlYiBwYWdlLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvbWV0YS12aWV3cG9ydD9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1NZXRhVmlld3BvcnQ7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L29iamVjdC1hbHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBPYmplY3RBbHQgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J29iamVjdC1hbHQnLHRpdGxlOidgPG9iamVjdD5gIGVsZW1lbnRzIGhhdmUgYFthbHRdYCB0ZXh0JyxmYWlsdXJlVGl0bGU6J2A8b2JqZWN0PmAgZWxlbWVudHMgZG8gbm90IGhhdmUgYFthbHRdYCB0ZXh0JyxkZXNjcmlwdGlvbjonU2NyZWVuIHJlYWRlcnMgY2Fubm90IHRyYW5zbGF0ZSBub24tdGV4dCBjb250ZW50LiBBZGRpbmcgYWx0IHRleHQgdG8gJysnYDxvYmplY3Q+YCBlbGVtZW50cyBoZWxwcyBzY3JlZW4gcmVhZGVycyBjb252ZXkgbWVhbmluZyB0byB1c2Vycy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL29iamVjdC1hbHQ/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9T2JqZWN0QWx0O30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS90YWJpbmRleCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIFRhYkluZGV4IGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid0YWJpbmRleCcsdGl0bGU6J05vIGVsZW1lbnQgaGFzIGEgYFt0YWJpbmRleF1gIHZhbHVlIGdyZWF0ZXIgdGhhbiAwJyxmYWlsdXJlVGl0bGU6J1NvbWUgZWxlbWVudHMgaGF2ZSBhIGBbdGFiaW5kZXhdYCB2YWx1ZSBncmVhdGVyIHRoYW4gMCcsZGVzY3JpcHRpb246J0EgdmFsdWUgZ3JlYXRlciB0aGFuIDAgaW1wbGllcyBhbiBleHBsaWNpdCBuYXZpZ2F0aW9uIG9yZGVyaW5nLiAnKydBbHRob3VnaCB0ZWNobmljYWxseSB2YWxpZCwgdGhpcyBvZnRlbiBjcmVhdGVzIGZydXN0cmF0aW5nIGV4cGVyaWVuY2VzICcrJ2ZvciB1c2VycyB3aG8gcmVseSBvbiBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvdGFiaW5kZXg/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9VGFiSW5kZXg7fSx7Ii4vYXhlLWF1ZGl0IjoxfV0sIi4uL2F1ZGl0cy9hY2Nlc3NpYmlsaXR5L3RkLWhlYWRlcnMtYXR0ciI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIFRESGVhZGVyc0F0dHIgZXh0ZW5kcyBBeGVBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3RkLWhlYWRlcnMtYXR0cicsdGl0bGU6J0NlbGxzIGluIGEgYDx0YWJsZT5gIGVsZW1lbnQgdGhhdCB1c2UgdGhlIGBbaGVhZGVyc11gIGF0dHJpYnV0ZSBvbmx5IHJlZmVyICcrJ3RvIG90aGVyIGNlbGxzIG9mIHRoYXQgc2FtZSB0YWJsZS4nLGZhaWx1cmVUaXRsZTonQ2VsbHMgaW4gYSBgPHRhYmxlPmAgZWxlbWVudCB0aGF0IHVzZSB0aGUgYFtoZWFkZXJzXWAgJysnYXR0cmlidXRlIHJlZmVycyB0byBvdGhlciBjZWxscyBvZiB0aGF0IHNhbWUgdGFibGUuJyxkZXNjcmlwdGlvbjonU2NyZWVuIHJlYWRlcnMgaGF2ZSBmZWF0dXJlcyB0byBtYWtlIG5hdmlnYXRpbmcgdGFibGVzIGVhc2llci4gRW5zdXJpbmcgJysnYDx0ZD5gIGNlbGxzIHVzaW5nIHRoZSBgW2hlYWRlcnNdYCBhdHRyaWJ1dGUgb25seSByZWZlciB0byBvdGhlciBjZWxscyBpbiB0aGUgc2FtZSAnKyd0YWJsZSBtYXkgaW1wcm92ZSB0aGUgZXhwZXJpZW5jZSBmb3Igc2NyZWVuIHJlYWRlciB1c2Vycy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL3RkLWhlYWRlcnMtYXR0cj9hcHBsaWNhdGlvbj1saWdodGhvdXNlKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQWNjZXNzaWJpbGl0eSddfTt9fQptb2R1bGUuZXhwb3J0cz1UREhlYWRlcnNBdHRyO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS90aC1oYXMtZGF0YS1jZWxscyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBeGVBdWRpdD1yZXF1aXJlKCcuL2F4ZS1hdWRpdCcpO2NsYXNzIFRISGFzRGF0YUNlbGxzIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid0aC1oYXMtZGF0YS1jZWxscycsdGl0bGU6J2A8dGg+YCBlbGVtZW50cyBhbmQgZWxlbWVudHMgd2l0aCBgW3JvbGU9ImNvbHVtbmhlYWRlciIvInJvd2hlYWRlciJdYCBoYXZlICcrJ2RhdGEgY2VsbHMgdGhleSBkZXNjcmliZS4nLGZhaWx1cmVUaXRsZTonYDx0aD5gIGVsZW1lbnRzIGFuZCBlbGVtZW50cyB3aXRoICcrJ2Bbcm9sZT0iY29sdW1uaGVhZGVyIi8icm93aGVhZGVyIl1gIGRvIG5vdCBoYXZlIGRhdGEgY2VsbHMgdGhleSBkZXNjcmliZS4nLGRlc2NyaXB0aW9uOidTY3JlZW4gcmVhZGVycyBoYXZlIGZlYXR1cmVzIHRvIG1ha2UgbmF2aWdhdGluZyB0YWJsZXMgZWFzaWVyLiBFbnN1cmluZyAnKyd0YWJsZSBoZWFkZXJzIGFsd2F5cyByZWZlciB0byBzb21lIHNldCBvZiBjZWxscyBtYXkgaW1wcm92ZSB0aGUgZXhwZXJpZW5jZSBmb3Igc2NyZWVuICcrJ3JlYWRlciB1c2Vycy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL3RoLWhhcy1kYXRhLWNlbGxzP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPVRISGFzRGF0YUNlbGxzO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS92YWxpZC1sYW5nIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgVmFsaWRMYW5nIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid2YWxpZC1sYW5nJyx0aXRsZTonYFtsYW5nXWAgYXR0cmlidXRlcyBoYXZlIGEgdmFsaWQgdmFsdWUnLGZhaWx1cmVUaXRsZTonYFtsYW5nXWAgYXR0cmlidXRlcyBkbyBub3QgaGF2ZSBhIHZhbGlkIHZhbHVlJyxkZXNjcmlwdGlvbjonU3BlY2lmeWluZyBhIHZhbGlkIFtCQ1AgNDcgbGFuZ3VhZ2VdKGh0dHBzOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1jaG9vc2luZy1sYW5ndWFnZS10YWdzI3F1ZXN0aW9uKSAnKydvbiBlbGVtZW50cyBoZWxwcyBlbnN1cmUgdGhhdCB0ZXh0IGlzIHByb25vdW5jZWQgY29ycmVjdGx5IGJ5IGEgc2NyZWVuIHJlYWRlci4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9ydWxlcy9heGUvMi4yL3ZhbGlkLWxhbmc/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9VmFsaWRMYW5nO30seyIuL2F4ZS1hdWRpdCI6MX1dLCIuLi9hdWRpdHMvYWNjZXNzaWJpbGl0eS92aWRlby1jYXB0aW9uIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF4ZUF1ZGl0PXJlcXVpcmUoJy4vYXhlLWF1ZGl0Jyk7Y2xhc3MgVmlkZW9DYXB0aW9uIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid2aWRlby1jYXB0aW9uJyx0aXRsZTonYDx2aWRlbz5gIGVsZW1lbnRzIGNvbnRhaW4gYSBgPHRyYWNrPmAgZWxlbWVudCB3aXRoIGBba2luZD0iY2FwdGlvbnMiXWAnLGZhaWx1cmVUaXRsZTonYDx2aWRlbz5gIGVsZW1lbnRzIGRvIG5vdCBjb250YWluIGEgYDx0cmFjaz5gIGVsZW1lbnQgJysnd2l0aCBgW2tpbmQ9ImNhcHRpb25zIl1gLicsZGVzY3JpcHRpb246J1doZW4gYSB2aWRlbyBwcm92aWRlcyBhIGNhcHRpb24gaXQgaXMgZWFzaWVyIGZvciBkZWFmIGFuZCBoZWFyaW5nIGltcGFpcmVkICcrJ3VzZXJzIHRvIGFjY2VzcyBpdHMgaW5mb3JtYXRpb24uICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RlcXVldW5pdmVyc2l0eS5jb20vcnVsZXMvYXhlLzIuMi92aWRlby1jYXB0aW9uP2FwcGxpY2F0aW9uPWxpZ2h0aG91c2UpLicscmVxdWlyZWRBcnRpZmFjdHM6WydBY2Nlc3NpYmlsaXR5J119O319Cm1vZHVsZS5leHBvcnRzPVZpZGVvQ2FwdGlvbjt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2FjY2Vzc2liaWxpdHkvdmlkZW8tZGVzY3JpcHRpb24iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXhlQXVkaXQ9cmVxdWlyZSgnLi9heGUtYXVkaXQnKTtjbGFzcyBWaWRlb0Rlc2NyaXB0aW9uIGV4dGVuZHMgQXhlQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid2aWRlby1kZXNjcmlwdGlvbicsdGl0bGU6J2A8dmlkZW8+YCBlbGVtZW50cyBjb250YWluIGEgYDx0cmFjaz5gIGVsZW1lbnQgd2l0aCBgW2tpbmQ9ImRlc2NyaXB0aW9uIl1gJyxmYWlsdXJlVGl0bGU6J2A8dmlkZW8+YCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBhIGA8dHJhY2s+YCBlbGVtZW50IHdpdGggJysnYFtraW5kPSJkZXNjcmlwdGlvbiJdYC4nLGRlc2NyaXB0aW9uOidBdWRpbyBkZXNjcmlwdGlvbnMgcHJvdmlkZSByZWxldmFudCBpbmZvcm1hdGlvbiBmb3IgdmlkZW9zIHRoYXQgZGlhbG9ndWUgJysnY2Fubm90LCBzdWNoIGFzIGZhY2lhbCBleHByZXNzaW9ucyBhbmQgc2NlbmVzLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL2F4ZS8yLjIvdmlkZW8tZGVzY3JpcHRpb24/YXBwbGljYXRpb249bGlnaHRob3VzZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FjY2Vzc2liaWxpdHknXX07fX0KbW9kdWxlLmV4cG9ydHM9VmlkZW9EZXNjcmlwdGlvbjt9LHsiLi9heGUtYXVkaXQiOjF9XSwiLi4vYXVkaXRzL2Jvb3R1cC10aW1lIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjb25zdCBOZXR3b3JrUmVxdWVzdD1yZXF1aXJlKCcuLi9saWIvbmV0d29yay1yZXF1ZXN0Jyk7Y29uc3R7dGFza0dyb3Vwc309cmVxdWlyZSgnLi4vbGliL3Rhc2stZ3JvdXBzJyk7Y2xhc3MgQm9vdHVwVGltZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonYm9vdHVwLXRpbWUnLHRpdGxlOidKYXZhU2NyaXB0IGJvb3QtdXAgdGltZScsZmFpbHVyZVRpdGxlOidKYXZhU2NyaXB0IGJvb3QtdXAgdGltZSBpcyB0b28gaGlnaCcsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMsZGVzY3JpcHRpb246J0NvbnNpZGVyIHJlZHVjaW5nIHRoZSB0aW1lIHNwZW50IHBhcnNpbmcsIGNvbXBpbGluZywgYW5kIGV4ZWN1dGluZyBKUy4gJysnWW91IG1heSBmaW5kIGRlbGl2ZXJpbmcgc21hbGxlciBKUyBwYXlsb2FkcyBoZWxwcyB3aXRoIHRoaXMuIFtMZWFybiAnKydtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvYm9vdHVwKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6NjAwLHNjb3JlTWVkaWFuOjM1MDAsdGhyZXNob2xkSW5Nczo1MH07fQpzdGF0aWMgZ2V0SmF2YVNjcmlwdFVSTHMocmVjb3Jkcyl7Y29uc3QgdXJscz1uZXcgU2V0KCk7Zm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtpZihyZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuU2NyaXB0KXt1cmxzLmFkZChyZWNvcmQudXJsKTt9fQpyZXR1cm4gdXJsczt9CnN0YXRpYyBnZXRFeGVjdXRpb25UaW1pbmdzQnlVUkwodGFza3MsanNVUkxzKXtjb25zdCByZXN1bHQ9bmV3IE1hcCgpO2Zvcihjb25zdCB0YXNrIG9mIHRhc2tzKXtjb25zdCBqc1VSTD10YXNrLmF0dHJpYnV0YWJsZVVSTHMuZmluZCh1cmw9PmpzVVJMcy5oYXModXJsKSk7Y29uc3QgZmFsbGJhY2tVUkw9dGFzay5hdHRyaWJ1dGFibGVVUkxzWzBdO2NvbnN0IGF0dHJpYnV0YWJsZVVSTD1qc1VSTHx8ZmFsbGJhY2tVUkw7aWYoIWF0dHJpYnV0YWJsZVVSTHx8YXR0cmlidXRhYmxlVVJMPT09J2Fib3V0OmJsYW5rJyljb250aW51ZTtjb25zdCB0aW1pbmdCeUdyb3VwSWQ9cmVzdWx0LmdldChhdHRyaWJ1dGFibGVVUkwpfHx7fTtjb25zdCBvcmlnaW5hbFRpbWU9dGltaW5nQnlHcm91cElkW3Rhc2suZ3JvdXAuaWRdfHwwO3RpbWluZ0J5R3JvdXBJZFt0YXNrLmdyb3VwLmlkXT1vcmlnaW5hbFRpbWUrdGFzay5zZWxmVGltZTtyZXN1bHQuc2V0KGF0dHJpYnV0YWJsZVVSTCx0aW1pbmdCeUdyb3VwSWQpO30KcmV0dXJuIHJlc3VsdDt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3Qgc2V0dGluZ3M9Y29udGV4dC5zZXR0aW5nc3x8e307Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tCb290dXBUaW1lLkRFRkFVTFRfUEFTU107Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tCb290dXBUaW1lLkRFRkFVTFRfUEFTU107Y29uc3QgbmV0d29ya1JlY29yZHM9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3JkcyhkZXZ0b29sc0xvZyk7Y29uc3QgdGFza3M9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RNYWluVGhyZWFkVGFza3ModHJhY2UpO2NvbnN0IG11bHRpcGxpZXI9c2V0dGluZ3MudGhyb3R0bGluZ01ldGhvZD09PSdzaW11bGF0ZSc/c2V0dGluZ3MudGhyb3R0bGluZy5jcHVTbG93ZG93bk11bHRpcGxpZXI6MTtjb25zdCBqc1VSTHM9Qm9vdHVwVGltZS5nZXRKYXZhU2NyaXB0VVJMcyhuZXR3b3JrUmVjb3Jkcyk7Y29uc3QgZXhlY3V0aW9uVGltaW5ncz1Cb290dXBUaW1lLmdldEV4ZWN1dGlvblRpbWluZ3NCeVVSTCh0YXNrcyxqc1VSTHMpO2xldCB0b3RhbEJvb3R1cFRpbWU9MDtjb25zdCByZXN1bHRzPUFycmF5LmZyb20oZXhlY3V0aW9uVGltaW5ncykubWFwKChbdXJsLHRpbWluZ0J5R3JvdXBJZF0pPT57bGV0IGJvb3R1cFRpbWVGb3JVUkw9MDtmb3IoY29uc3RbZ3JvdXBJZCx0aW1lc3Bhbk1zXW9mIE9iamVjdC5lbnRyaWVzKHRpbWluZ0J5R3JvdXBJZCkpe3RpbWluZ0J5R3JvdXBJZFtncm91cElkXT10aW1lc3Bhbk1zKm11bHRpcGxpZXI7Ym9vdHVwVGltZUZvclVSTCs9dGltZXNwYW5NcyptdWx0aXBsaWVyO30KaWYoYm9vdHVwVGltZUZvclVSTD49Y29udGV4dC5vcHRpb25zLnRocmVzaG9sZEluTXMpe3RvdGFsQm9vdHVwVGltZSs9Ym9vdHVwVGltZUZvclVSTDt9CmNvbnN0IHNjcmlwdGluZ1RvdGFsPXRpbWluZ0J5R3JvdXBJZFt0YXNrR3JvdXBzLnNjcmlwdEV2YWx1YXRpb24uaWRdfHwwO2NvbnN0IHBhcnNlQ29tcGlsZVRvdGFsPXRpbWluZ0J5R3JvdXBJZFt0YXNrR3JvdXBzLnNjcmlwdFBhcnNlQ29tcGlsZS5pZF18fDA7cmV0dXJue3VybDp1cmwsdG90YWw6Ym9vdHVwVGltZUZvclVSTCxzY3JpcHRpbmc6c2NyaXB0aW5nVG90YWwsc2NyaXB0UGFyc2VDb21waWxlOnBhcnNlQ29tcGlsZVRvdGFsfTt9KS5maWx0ZXIocmVzdWx0PT5yZXN1bHQudG90YWw+PWNvbnRleHQub3B0aW9ucy50aHJlc2hvbGRJbk1zKS5zb3J0KChhLGIpPT5iLnRvdGFsLWEudG90YWwpO2NvbnN0IHN1bW1hcnk9e3dhc3RlZE1zOnRvdGFsQm9vdHVwVGltZX07Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTondG90YWwnLGdyYW51bGFyaXR5OjEsaXRlbVR5cGU6J21zJyx0ZXh0OidUb3RhbCd9LHtrZXk6J3NjcmlwdGluZycsZ3JhbnVsYXJpdHk6MSxpdGVtVHlwZTonbXMnLHRleHQ6dGFza0dyb3Vwcy5zY3JpcHRFdmFsdWF0aW9uLmxhYmVsfSx7a2V5OidzY3JpcHRQYXJzZUNvbXBpbGUnLGdyYW51bGFyaXR5OjEsaXRlbVR5cGU6J21zJyx0ZXh0OnRhc2tHcm91cHMuc2NyaXB0UGFyc2VDb21waWxlLmxhYmVsfV07Y29uc3QgZGV0YWlscz1Cb290dXBUaW1lLm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyxzdW1tYXJ5KTtjb25zdCBzY29yZT1BdWRpdC5jb21wdXRlTG9nTm9ybWFsU2NvcmUodG90YWxCb290dXBUaW1lLGNvbnRleHQub3B0aW9ucy5zY29yZVBPRFIsY29udGV4dC5vcHRpb25zLnNjb3JlTWVkaWFuKTtyZXR1cm57c2NvcmUscmF3VmFsdWU6dG90YWxCb290dXBUaW1lLGRpc3BsYXlWYWx1ZTpbVXRpbC5NU19ESVNQTEFZX1ZBTFVFLHRvdGFsQm9vdHVwVGltZV0sZGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9Qm9vdHVwVGltZTt9LHsiLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uL2xpYi90YXNrLWdyb3VwcyI6NDMsIi4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwiOjQ4LCIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9ieXRlLWVmZmljaWVuY3kvZWZmaWNpZW50LWFuaW1hdGVkLWNvbnRlbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBHSUZfQllURV9USFJFU0hPTEQ9MTAwKjEwMjQ7Y2xhc3MgRWZmaWNpZW50QW5pbWF0ZWRDb250ZW50IGV4dGVuZHMgQnl0ZUVmZmljaWVuY3lBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2VmZmljaWVudC1hbmltYXRlZC1jb250ZW50JyxzY29yZURpc3BsYXlNb2RlOkJ5dGVFZmZpY2llbmN5QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHRpdGxlOidVc2UgdmlkZW8gZm9ybWF0cyBmb3IgYW5pbWF0ZWQgY29udGVudCcsZGVzY3JpcHRpb246J0xhcmdlIEdJRnMgYXJlIGluZWZmaWNpZW50IGZvciBkZWxpdmVyaW5nIGFuaW1hdGVkIGNvbnRlbnQuIENvbnNpZGVyIHVzaW5nICcrJ01QRUc0L1dlYk0gdmlkZW9zIGZvciBhbmltYXRpb25zIGFuZCBQTkcvV2ViUCBmb3Igc3RhdGljIGltYWdlcyBpbnN0ZWFkIG9mIEdJRiB0byBzYXZlICcrJ25ldHdvcmsgYnl0ZXMuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL3BlcmZvcm1hbmNlL29wdGltaXppbmctY29udGVudC1lZmZpY2llbmN5L3JlcGxhY2UtYW5pbWF0ZWQtZ2lmcy13aXRoLXZpZGVvLyknLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGdldFBlcmNlbnRTYXZpbmdzKGJ5dGVzKXtyZXR1cm4gTWF0aC5yb3VuZCgyOS4xKk1hdGgubG9nMTAoYnl0ZXMpLTEwMC43KS8xMDA7fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyxuZXR3b3JrUmVjb3Jkcyl7Y29uc3QgdW5vcHRpbWl6ZWRDb250ZW50PW5ldHdvcmtSZWNvcmRzLmZpbHRlcihyZWNvcmQ9PnJlY29yZC5taW1lVHlwZT09PSdpbWFnZS9naWYnJiZyZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuSW1hZ2UmJihyZWNvcmQucmVzb3VyY2VTaXplfHwwKT5HSUZfQllURV9USFJFU0hPTEQpO2NvbnN0IGl0ZW1zPXVub3B0aW1pemVkQ29udGVudC5tYXAocmVjb3JkPT57Y29uc3QgcmVzb3VyY2VTaXplPXJlY29yZC5yZXNvdXJjZVNpemV8fDA7cmV0dXJue3VybDpyZWNvcmQudXJsLHRvdGFsQnl0ZXM6cmVzb3VyY2VTaXplLHdhc3RlZEJ5dGVzOk1hdGgucm91bmQocmVzb3VyY2VTaXplKkVmZmljaWVudEFuaW1hdGVkQ29udGVudC5nZXRQZXJjZW50U2F2aW5ncyhyZXNvdXJjZVNpemUpKX07fSk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsdmFsdWVUeXBlOid1cmwnLGxhYmVsOidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonVHJhbnNmZXIgU2l6ZSd9LHtrZXk6J3dhc3RlZEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonQnl0ZSBTYXZpbmdzJ31dO3JldHVybntpdGVtcyxoZWFkaW5nc307fX0KbW9kdWxlLmV4cG9ydHM9RWZmaWNpZW50QW5pbWF0ZWRDb250ZW50O30seyIuLi8uLi9saWIvbmV0d29yay1yZXF1ZXN0IjozOCwiLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjN9XSwiLi4vYXVkaXRzL2J5dGUtZWZmaWNpZW5jeS9vZmZzY3JlZW4taW1hZ2VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBTZW50cnk9cmVxdWlyZSgnLi4vLi4vbGliL3NlbnRyeScpO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi8uLi9saWIvdXJsLXNoaW0nKTtjb25zdCBBTExPV0FCTEVfT0ZGU0NSRUVOX1g9MTAwO2NvbnN0IEFMTE9XQUJMRV9PRkZTQ1JFRU5fWT0yMDA7Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFUz0yMDQ4O2NvbnN0IElHTk9SRV9USFJFU0hPTERfSU5fUEVSQ0VOVD03NTtjb25zdCBJR05PUkVfVEhSRVNIT0xEX0lOX01TPTUwO2NsYXNzIE9mZnNjcmVlbkltYWdlcyBleHRlbmRzIEJ5dGVFZmZpY2llbmN5QXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidvZmZzY3JlZW4taW1hZ2VzJyx0aXRsZTonRGVmZXIgb2Zmc2NyZWVuIGltYWdlcycsc2NvcmVEaXNwbGF5TW9kZTpCeXRlRWZmaWNpZW5jeUF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxkZXNjcmlwdGlvbjonQ29uc2lkZXIgbGF6eS1sb2FkaW5nIG9mZnNjcmVlbiBhbmQgaGlkZGVuIGltYWdlcyBhZnRlciBhbGwgY3JpdGljYWwgcmVzb3VyY2VzIGhhdmUgJysnZmluaXNoZWQgbG9hZGluZyB0byBsb3dlciB0aW1lIHRvIGludGVyYWN0aXZlLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL29mZnNjcmVlbi1pbWFnZXMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydJbWFnZVVzYWdlJywnVmlld3BvcnREaW1lbnNpb25zJywndHJhY2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGNvbXB1dGVWaXNpYmxlUGl4ZWxzKGltYWdlUmVjdCx2aWV3cG9ydERpbWVuc2lvbnMpe2NvbnN0IGlubmVyV2lkdGg9dmlld3BvcnREaW1lbnNpb25zLmlubmVyV2lkdGg7Y29uc3QgaW5uZXJIZWlnaHQ9dmlld3BvcnREaW1lbnNpb25zLmlubmVySGVpZ2h0O2NvbnN0IHRvcD1NYXRoLm1heChpbWFnZVJlY3QudG9wLC0xKkFMTE9XQUJMRV9PRkZTQ1JFRU5fWSk7Y29uc3QgcmlnaHQ9TWF0aC5taW4oaW1hZ2VSZWN0LnJpZ2h0LGlubmVyV2lkdGgrQUxMT1dBQkxFX09GRlNDUkVFTl9YKTtjb25zdCBib3R0b209TWF0aC5taW4oaW1hZ2VSZWN0LmJvdHRvbSxpbm5lckhlaWdodCtBTExPV0FCTEVfT0ZGU0NSRUVOX1kpO2NvbnN0IGxlZnQ9TWF0aC5tYXgoaW1hZ2VSZWN0LmxlZnQsLTEqQUxMT1dBQkxFX09GRlNDUkVFTl9YKTtyZXR1cm4gTWF0aC5tYXgocmlnaHQtbGVmdCwwKSpNYXRoLm1heChib3R0b20tdG9wLDApO30Kc3RhdGljIGNvbXB1dGVXYXN0ZShpbWFnZSx2aWV3cG9ydERpbWVuc2lvbnMpe2lmKCFpbWFnZS5uZXR3b3JrUmVjb3JkKXtyZXR1cm4gbnVsbDt9CmNvbnN0IHVybD1VUkwuZWxpZGVEYXRhVVJJKGltYWdlLnNyYyk7Y29uc3QgdG90YWxQaXhlbHM9aW1hZ2UuY2xpZW50V2lkdGgqaW1hZ2UuY2xpZW50SGVpZ2h0O2NvbnN0IHZpc2libGVQaXhlbHM9dGhpcy5jb21wdXRlVmlzaWJsZVBpeGVscyhpbWFnZS5jbGllbnRSZWN0LHZpZXdwb3J0RGltZW5zaW9ucyk7Y29uc3Qgd2FzdGVkUmF0aW89dG90YWxQaXhlbHM9PT0wPzE6MS12aXNpYmxlUGl4ZWxzL3RvdGFsUGl4ZWxzO2NvbnN0IHRvdGFsQnl0ZXM9aW1hZ2UubmV0d29ya1JlY29yZC5yZXNvdXJjZVNpemU7Y29uc3Qgd2FzdGVkQnl0ZXM9TWF0aC5yb3VuZCh0b3RhbEJ5dGVzKndhc3RlZFJhdGlvKTtpZighTnVtYmVyLmlzRmluaXRlKHdhc3RlZFJhdGlvKSl7cmV0dXJuIG5ldyBFcnJvcihgSW52YWxpZCBpbWFnZSBzaXppbmcgaW5mb3JtYXRpb24gJHt1cmx9YCk7fQpyZXR1cm57dXJsLHJlcXVlc3RTdGFydFRpbWU6aW1hZ2UubmV0d29ya1JlY29yZC5zdGFydFRpbWUsdG90YWxCeXRlcyx3YXN0ZWRCeXRlcyx3YXN0ZWRQZXJjZW50OjEwMCp3YXN0ZWRSYXRpb307fQpzdGF0aWMgZmlsdGVyTGFudGVyblJlc3VsdHMoaW1hZ2VzLGxhbnRlcm5NZXRyaWNEYXRhKXtjb25zdCBub2RlVGltaW5ncz1sYW50ZXJuTWV0cmljRGF0YS5wZXNzaW1pc3RpY0VzdGltYXRlLm5vZGVUaW1pbmdzO2xldCBsYXN0TG9uZ1Rhc2tTdGFydFRpbWU9MDtjb25zdCBzdGFydFRpbWVzQnlVUkw9bmV3IE1hcCgpO2Zvcihjb25zdFtub2RlLHRpbWluZ11vZiBub2RlVGltaW5ncyl7aWYobm9kZS50eXBlPT09J2NwdScmJnRpbWluZy5kdXJhdGlvbj49NTApe2xhc3RMb25nVGFza1N0YXJ0VGltZT1NYXRoLm1heChsYXN0TG9uZ1Rhc2tTdGFydFRpbWUsdGltaW5nLnN0YXJ0VGltZSk7fWVsc2UgaWYobm9kZS50eXBlPT09J25ldHdvcmsnKXtjb25zdCBuZXR3b3JrTm9kZT1ub2RlO3N0YXJ0VGltZXNCeVVSTC5zZXQobmV0d29ya05vZGUucmVjb3JkLnVybCx0aW1pbmcuc3RhcnRUaW1lKTt9fQpyZXR1cm4gaW1hZ2VzLmZpbHRlcihpbWFnZT0+e2lmKGltYWdlLndhc3RlZEJ5dGVzPElHTk9SRV9USFJFU0hPTERfSU5fQllURVMpcmV0dXJuIGZhbHNlO2lmKGltYWdlLndhc3RlZFBlcmNlbnQ8SUdOT1JFX1RIUkVTSE9MRF9JTl9QRVJDRU5UKXJldHVybiBmYWxzZTtjb25zdCBpbWFnZVJlcXVlc3RTdGFydFRpbWU9c3RhcnRUaW1lc0J5VVJMLmdldChpbWFnZS51cmwpfHwwO3JldHVybiBpbWFnZVJlcXVlc3RTdGFydFRpbWU8bGFzdExvbmdUYXNrU3RhcnRUaW1lLUlHTk9SRV9USFJFU0hPTERfSU5fTVM7fSk7fQpzdGF0aWMgZmlsdGVyT2JzZXJ2ZWRSZXN1bHRzKGltYWdlcyxpbnRlcmFjdGl2ZVRpbWVzdGFtcCl7cmV0dXJuIGltYWdlcy5maWx0ZXIoaW1hZ2U9PntpZihpbWFnZS53YXN0ZWRCeXRlczxJR05PUkVfVEhSRVNIT0xEX0lOX0JZVEVTKXJldHVybiBmYWxzZTtpZihpbWFnZS53YXN0ZWRQZXJjZW50PElHTk9SRV9USFJFU0hPTERfSU5fUEVSQ0VOVClyZXR1cm4gZmFsc2U7cmV0dXJuIGltYWdlLnJlcXVlc3RTdGFydFRpbWU8aW50ZXJhY3RpdmVUaW1lc3RhbXAvMWU2LUlHTk9SRV9USFJFU0hPTERfSU5fTVMvMTAwMDt9KTt9CnN0YXRpYyBjb21wdXRlV2FzdGVXaXRoVFRJR3JhcGgocmVzdWx0cyxncmFwaCxzaW11bGF0b3Ipe3JldHVybiBzdXBlci5jb21wdXRlV2FzdGVXaXRoVFRJR3JhcGgocmVzdWx0cyxncmFwaCxzaW11bGF0b3Ise2luY2x1ZGVMb2FkOmZhbHNlfSk7fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyxuZXR3b3JrUmVjb3Jkcyxjb250ZXh0KXtjb25zdCBpbWFnZXM9YXJ0aWZhY3RzLkltYWdlVXNhZ2U7Y29uc3Qgdmlld3BvcnREaW1lbnNpb25zPWFydGlmYWN0cy5WaWV3cG9ydERpbWVuc2lvbnM7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tCeXRlRWZmaWNpZW5jeUF1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tCeXRlRWZmaWNpZW5jeUF1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3Qgd2FybmluZ3M9W107Y29uc3QgcmVzdWx0c01hcD1pbWFnZXMucmVkdWNlKChyZXN1bHRzLGltYWdlKT0+e2NvbnN0IHByb2Nlc3NlZD1PZmZzY3JlZW5JbWFnZXMuY29tcHV0ZVdhc3RlKGltYWdlLHZpZXdwb3J0RGltZW5zaW9ucyk7aWYocHJvY2Vzc2VkPT09bnVsbCl7cmV0dXJuIHJlc3VsdHM7fQppZihwcm9jZXNzZWQgaW5zdGFuY2VvZiBFcnJvcil7d2FybmluZ3MucHVzaChwcm9jZXNzZWQubWVzc2FnZSk7U2VudHJ5LmNhcHR1cmVFeGNlcHRpb24ocHJvY2Vzc2VkLHt0YWdzOnthdWRpdDp0aGlzLm1ldGEuaWR9LGxldmVsOid3YXJuaW5nJ30pO3JldHVybiByZXN1bHRzO30KY29uc3QgZXhpc3Rpbmc9cmVzdWx0cy5nZXQocHJvY2Vzc2VkLnVybCk7aWYoIWV4aXN0aW5nfHxleGlzdGluZy53YXN0ZWRCeXRlcz5wcm9jZXNzZWQud2FzdGVkQnl0ZXMpe3Jlc3VsdHMuc2V0KHByb2Nlc3NlZC51cmwscHJvY2Vzc2VkKTt9CnJldHVybiByZXN1bHRzO30sbmV3IE1hcCgpKTtjb25zdCBzZXR0aW5ncz1jb250ZXh0LnNldHRpbmdzO3JldHVybiBhcnRpZmFjdHMucmVxdWVzdEludGVyYWN0aXZlKHt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nc30pLnRoZW4oaW50ZXJhY3RpdmU9Pntjb25zdCB1bmZpbHRlcmVkUmVzdWx0cz1BcnJheS5mcm9tKHJlc3VsdHNNYXAudmFsdWVzKCkpO2NvbnN0IGxhbnRlcm5JbnRlcmFjdGl2ZT1pbnRlcmFjdGl2ZTtjb25zdCBpdGVtcz1jb250ZXh0LnNldHRpbmdzLnRocm90dGxpbmdNZXRob2Q9PT0nc2ltdWxhdGUnP09mZnNjcmVlbkltYWdlcy5maWx0ZXJMYW50ZXJuUmVzdWx0cyh1bmZpbHRlcmVkUmVzdWx0cyxsYW50ZXJuSW50ZXJhY3RpdmUpOk9mZnNjcmVlbkltYWdlcy5maWx0ZXJPYnNlcnZlZFJlc3VsdHModW5maWx0ZXJlZFJlc3VsdHMsaW50ZXJhY3RpdmUudGltZXN0YW1wKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyx2YWx1ZVR5cGU6J3RodW1ibmFpbCcsbGFiZWw6Jyd9LHtrZXk6J3VybCcsdmFsdWVUeXBlOid1cmwnLGxhYmVsOidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonT3JpZ2luYWwnfSx7a2V5Oid3YXN0ZWRCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J1BvdGVudGlhbCBTYXZpbmdzJ31dO3JldHVybnt3YXJuaW5ncyxpdGVtcyxoZWFkaW5nc307fSk7fX0KbW9kdWxlLmV4cG9ydHM9T2Zmc2NyZWVuSW1hZ2VzO30seyIuLi8uLi9saWIvc2VudHJ5Ijo0MCwiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjN9XSwiLi4vYXVkaXRzL2J5dGUtZWZmaWNpZW5jeS9yZW5kZXItYmxvY2tpbmctcmVzb3VyY2VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgQmFzZU5vZGU9cmVxdWlyZSgnLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvYmFzZS1ub2RlJyk7Y29uc3QgQnl0ZUVmZmljaWVuY3lBdWRpdD1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCcpO2NvbnN0IFVudXNlZENTUz1yZXF1aXJlKCcuL3VudXNlZC1jc3MtcnVsZXMnKTtjb25zdCBOZXR3b3JrUmVxdWVzdD1yZXF1aXJlKCcuLi8uLi9saWIvbmV0d29yay1yZXF1ZXN0Jyk7Y29uc3QgTUlOSU1VTV9XQVNURURfTVM9NTA7ZnVuY3Rpb24gZ2V0Tm9kZXNBbmRUaW1pbmdCeVVybChub2RlVGltaW5ncyl7Y29uc3QgdXJsTWFwPXt9O2NvbnN0IG5vZGVzPUFycmF5LmZyb20obm9kZVRpbWluZ3Mua2V5cygpKTtub2Rlcy5mb3JFYWNoKG5vZGU9PntpZihub2RlLnR5cGUhPT0nbmV0d29yaycpcmV0dXJuO2NvbnN0IG5vZGVUaW1pbmc9bm9kZVRpbWluZ3MuZ2V0KG5vZGUpO2lmKCFub2RlVGltaW5nKXJldHVybjt1cmxNYXBbbm9kZS5yZWNvcmQudXJsXT17bm9kZSxub2RlVGltaW5nfTt9KTtyZXR1cm4gdXJsTWFwO30KY2xhc3MgUmVuZGVyQmxvY2tpbmdSZXNvdXJjZXMgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3JlbmRlci1ibG9ja2luZy1yZXNvdXJjZXMnLHRpdGxlOidFbGltaW5hdGUgcmVuZGVyLWJsb2NraW5nIHJlc291cmNlcycsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMsZGVzY3JpcHRpb246J1Jlc291cmNlcyBhcmUgYmxvY2tpbmcgdGhlIGZpcnN0IHBhaW50IG9mIHlvdXIgcGFnZS4gQ29uc2lkZXIgJysnZGVsaXZlcmluZyBjcml0aWNhbCBKUy9DU1MgaW5saW5lIGFuZCBkZWZlcnJpbmcgYWxsIG5vbi1jcml0aWNhbCAnKydKUy9zdHlsZXMuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvYmxvY2tpbmctcmVzb3VyY2VzKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnVVJMJywnVGFnc0Jsb2NraW5nRmlyc3RQYWludCcsJ3RyYWNlcyddfTt9CnN0YXRpYyBhc3luYyBjb21wdXRlUmVzdWx0cyhhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBzaW11bGF0b3JEYXRhPXtkZXZ0b29sc0xvZyxzZXR0aW5nczpjb250ZXh0LnNldHRpbmdzfTtjb25zdCB0cmFjZU9mVGFiPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0VHJhY2VPZlRhYih0cmFjZSk7Y29uc3Qgc2ltdWxhdG9yPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TG9hZFNpbXVsYXRvcihzaW11bGF0b3JEYXRhKTtjb25zdCB3YXN0ZWRDc3NCeXRlcz1hd2FpdCBSZW5kZXJCbG9ja2luZ1Jlc291cmNlcy5jb21wdXRlV2FzdGVkQ1NTQnl0ZXMoYXJ0aWZhY3RzLGNvbnRleHQpO2NvbnN0IG1ldHJpY1NldHRpbmdzPXt0aHJvdHRsaW5nTWV0aG9kOidzaW11bGF0ZSd9O2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csc2ltdWxhdG9yLHNldHRpbmdzOm1ldHJpY1NldHRpbmdzfTtjb25zdCBmY3BTaW11bGF0aW9uPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0Rmlyc3RDb250ZW50ZnVsUGFpbnQobWV0cmljQ29tcHV0YXRpb25EYXRhKTtjb25zdCBmY3BUc0luTXM9dHJhY2VPZlRhYi50aW1lc3RhbXBzLmZpcnN0Q29udGVudGZ1bFBhaW50LzEwMDA7Y29uc3Qgbm9kZXNCeVVybD1nZXROb2Rlc0FuZFRpbWluZ0J5VXJsKGZjcFNpbXVsYXRpb24ub3B0aW1pc3RpY0VzdGltYXRlLm5vZGVUaW1pbmdzKTtjb25zdCByZXN1bHRzPVtdO2NvbnN0IGRlZmVycmVkTm9kZUlkcz1uZXcgU2V0KCk7Zm9yKGNvbnN0IHJlc291cmNlIG9mIGFydGlmYWN0cy5UYWdzQmxvY2tpbmdGaXJzdFBhaW50KXtpZihyZXNvdXJjZS5lbmRUaW1lKjEwMDA+ZmNwVHNJbk1zKWNvbnRpbnVlO2lmKCFub2Rlc0J5VXJsW3Jlc291cmNlLnRhZy51cmxdKWNvbnRpbnVlO2NvbnN0e25vZGUsbm9kZVRpbWluZ309bm9kZXNCeVVybFtyZXNvdXJjZS50YWcudXJsXTtub2RlLnRyYXZlcnNlKG5vZGU9PmRlZmVycmVkTm9kZUlkcy5hZGQobm9kZS5pZCkpO2NvbnN0IHdhc3RlZE1zPU1hdGgucm91bmQobm9kZVRpbWluZy5kdXJhdGlvbik7aWYod2FzdGVkTXM8TUlOSU1VTV9XQVNURURfTVMpY29udGludWU7cmVzdWx0cy5wdXNoKHt1cmw6cmVzb3VyY2UudGFnLnVybCx0b3RhbEJ5dGVzOnJlc291cmNlLnRyYW5zZmVyU2l6ZSx3YXN0ZWRNc30pO30KaWYoIXJlc3VsdHMubGVuZ3RoKXtyZXR1cm57cmVzdWx0cyx3YXN0ZWRNczowfTt9CmNvbnN0IHdhc3RlZE1zPVJlbmRlckJsb2NraW5nUmVzb3VyY2VzLmVzdGltYXRlU2F2aW5nc1dpdGhHcmFwaHMoc2ltdWxhdG9yLGZjcFNpbXVsYXRpb24ub3B0aW1pc3RpY0dyYXBoLGRlZmVycmVkTm9kZUlkcyx3YXN0ZWRDc3NCeXRlcyk7cmV0dXJue3Jlc3VsdHMsd2FzdGVkTXN9O30Kc3RhdGljIGVzdGltYXRlU2F2aW5nc1dpdGhHcmFwaHMoc2ltdWxhdG9yLGZjcEdyYXBoLGRlZmVycmVkSWRzLHdhc3RlZENzc0J5dGVzQnlVcmwpe2NvbnN0IG9yaWdpbmFsRXN0aW1hdGU9c2ltdWxhdG9yLnNpbXVsYXRlKGZjcEdyYXBoKS50aW1lSW5NcztsZXQgdG90YWxDaGlsZE5ldHdvcmtCeXRlcz0wO2NvbnN0IG1pbmltYWxGQ1BHcmFwaD1mY3BHcmFwaC5jbG9uZVdpdGhSZWxhdGlvbnNoaXBzKG5vZGU9Pntjb25zdCBjYW5EZWZlclJlcXVlc3Q9ZGVmZXJyZWRJZHMuaGFzKG5vZGUuaWQpO2lmKG5vZGUudHlwZSE9PUJhc2VOb2RlLlRZUEVTLk5FVFdPUkspcmV0dXJuIWNhbkRlZmVyUmVxdWVzdDtjb25zdCBpc1N0eWxlc2hlZXQ9bm9kZS5yZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuU3R5bGVzaGVldDtpZihjYW5EZWZlclJlcXVlc3QmJmlzU3R5bGVzaGVldCl7Y29uc3Qgd2FzdGVkQnl0ZXM9d2FzdGVkQ3NzQnl0ZXNCeVVybC5nZXQobm9kZS5yZWNvcmQudXJsKXx8MDt0b3RhbENoaWxkTmV0d29ya0J5dGVzKz0obm9kZS5yZWNvcmQudHJhbnNmZXJTaXplfHwwKS13YXN0ZWRCeXRlczt9CnJldHVybiFjYW5EZWZlclJlcXVlc3Q7fSk7Y29uc3Qgb3JpZ2luYWxUcmFuc2ZlclNpemU9bWluaW1hbEZDUEdyYXBoLnJlY29yZC50cmFuc2ZlclNpemU7Y29uc3Qgc2FmZVRyYW5zZmVyU2l6ZT1vcmlnaW5hbFRyYW5zZmVyU2l6ZXx8MDttaW5pbWFsRkNQR3JhcGgucmVjb3JkLnRyYW5zZmVyU2l6ZT1zYWZlVHJhbnNmZXJTaXplK3RvdGFsQ2hpbGROZXR3b3JrQnl0ZXM7Y29uc3QgZXN0aW1hdGVBZnRlcklubGluZT1zaW11bGF0b3Iuc2ltdWxhdGUobWluaW1hbEZDUEdyYXBoKS50aW1lSW5NczttaW5pbWFsRkNQR3JhcGgucmVjb3JkLnRyYW5zZmVyU2l6ZT1vcmlnaW5hbFRyYW5zZmVyU2l6ZTtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1heChvcmlnaW5hbEVzdGltYXRlLWVzdGltYXRlQWZ0ZXJJbmxpbmUsMCkpO30Kc3RhdGljIGFzeW5jIGNvbXB1dGVXYXN0ZWRDU1NCeXRlcyhhcnRpZmFjdHMsY29udGV4dCl7Y29uc3Qgd2FzdGVkQnl0ZXNCeVVybD1uZXcgTWFwKCk7dHJ5e2NvbnN0IHJlc3VsdHM9YXdhaXQgVW51c2VkQ1NTLmF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KTtmb3IoY29uc3QgaXRlbSBvZiByZXN1bHRzLmRldGFpbHMuaXRlbXMpe3dhc3RlZEJ5dGVzQnlVcmwuc2V0KGl0ZW0udXJsLGl0ZW0ud2FzdGVkQnl0ZXMpO319Y2F0Y2goXyl7fQpyZXR1cm4gd2FzdGVkQnl0ZXNCeVVybDt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3R7cmVzdWx0cyx3YXN0ZWRNc309YXdhaXQgUmVuZGVyQmxvY2tpbmdSZXNvdXJjZXMuY29tcHV0ZVJlc3VsdHMoYXJ0aWZhY3RzLGNvbnRleHQpO2xldCBkaXNwbGF5VmFsdWU9Jyc7aWYocmVzdWx0cy5sZW5ndGg+MSl7ZGlzcGxheVZhbHVlPWAke3Jlc3VsdHMubGVuZ3RofSByZXNvdXJjZXMgZGVsYXllZCBmaXJzdCBwYWludCBieSAke3dhc3RlZE1zfW1zYDt9ZWxzZSBpZihyZXN1bHRzLmxlbmd0aD09PTEpe2Rpc3BsYXlWYWx1ZT1gJHtyZXN1bHRzLmxlbmd0aH0gcmVzb3VyY2UgZGVsYXllZCBmaXJzdCBwYWludCBieSAke3dhc3RlZE1zfW1zYDt9CmNvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLHZhbHVlVHlwZTondXJsJyxsYWJlbDonVVJMJ30se2tleTondG90YWxCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J1NpemUgKEtCKSd9LHtrZXk6J3dhc3RlZE1zJyx2YWx1ZVR5cGU6J3RpbWVzcGFuTXMnLGxhYmVsOidEb3dubG9hZCBUaW1lIChtcyknfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlT3Bwb3J0dW5pdHlEZXRhaWxzKGhlYWRpbmdzLHJlc3VsdHMsd2FzdGVkTXMpO3JldHVybntkaXNwbGF5VmFsdWUsc2NvcmU6Qnl0ZUVmZmljaWVuY3lBdWRpdC5zY29yZUZvcldhc3RlZE1zKHdhc3RlZE1zKSxyYXdWYWx1ZTp3YXN0ZWRNcyxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1SZW5kZXJCbG9ja2luZ1Jlc291cmNlczt9LHsiLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvYmFzZS1ub2RlIjoyMiwiLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uL2F1ZGl0IjoyLCIuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6MywiLi91bnVzZWQtY3NzLXJ1bGVzIjoiLi4vYXVkaXRzL2J5dGUtZWZmaWNpZW5jeS91bnVzZWQtY3NzLXJ1bGVzIn1dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3RvdGFsLWJ5dGUtd2VpZ2h0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjbGFzcyBUb3RhbEJ5dGVXZWlnaHQgZXh0ZW5kcyBCeXRlRWZmaWNpZW5jeUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondG90YWwtYnl0ZS13ZWlnaHQnLHRpdGxlOidBdm9pZHMgZW5vcm1vdXMgbmV0d29yayBwYXlsb2FkcycsZmFpbHVyZVRpdGxlOidIYXMgZW5vcm1vdXMgbmV0d29yayBwYXlsb2Fkcycsc2NvcmVEaXNwbGF5TW9kZTpCeXRlRWZmaWNpZW5jeUF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxkZXNjcmlwdGlvbjonTGFyZ2UgbmV0d29yayBwYXlsb2FkcyBjb3N0IHVzZXJzIHJlYWwgbW9uZXkgYW5kIGFyZSBoaWdobHkgY29ycmVsYXRlZCB3aXRoICcrJ2xvbmcgbG9hZCB0aW1lcy4gW0xlYXJuICcrJ21vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9uZXR3b3JrLXBheWxvYWRzKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6MjUwMCoxMDI0LHNjb3JlTWVkaWFuOjQwMDAqMTAyNH07fQpzdGF0aWMgYXN5bmMgYXVkaXQoYXJ0aWZhY3RzLGNvbnRleHQpe2NvbnN0IGRldnRvb2xzTG9ncz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0J5dGVFZmZpY2llbmN5QXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdFtuZXR3b3JrUmVjb3JkcyxuZXR3b3JrVGhyb3VnaHB1dF09YXdhaXQgUHJvbWlzZS5hbGwoW2FydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2dzKSxhcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtUaHJvdWdocHV0KGRldnRvb2xzTG9ncyldKTtsZXQgdG90YWxCeXRlcz0wO2xldCByZXN1bHRzPVtdO25ldHdvcmtSZWNvcmRzLmZvckVhY2gocmVjb3JkPT57aWYocmVjb3JkLnBhcnNlZFVSTC5zY2hlbWU9PT0nZGF0YSd8fCFyZWNvcmQuZmluaXNoZWQpcmV0dXJuO2NvbnN0IHJlc3VsdD17dXJsOnJlY29yZC51cmwsdG90YWxCeXRlczpyZWNvcmQudHJhbnNmZXJTaXplLHRvdGFsTXM6Qnl0ZUVmZmljaWVuY3lBdWRpdC5ieXRlc1RvTXMocmVjb3JkLnRyYW5zZmVyU2l6ZSxuZXR3b3JrVGhyb3VnaHB1dCl9O3RvdGFsQnl0ZXMrPXJlc3VsdC50b3RhbEJ5dGVzO3Jlc3VsdHMucHVzaChyZXN1bHQpO30pO2NvbnN0IHRvdGFsQ29tcGxldGVkUmVxdWVzdHM9cmVzdWx0cy5sZW5ndGg7cmVzdWx0cz1yZXN1bHRzLnNvcnQoKGl0ZW1BLGl0ZW1CKT0+aXRlbUIudG90YWxCeXRlcy1pdGVtQS50b3RhbEJ5dGVzKS5zbGljZSgwLDEwKTtjb25zdCBzY29yZT1CeXRlRWZmaWNpZW5jeUF1ZGl0LmNvbXB1dGVMb2dOb3JtYWxTY29yZSh0b3RhbEJ5dGVzLGNvbnRleHQub3B0aW9ucy5zY29yZVBPRFIsY29udGV4dC5vcHRpb25zLnNjb3JlTWVkaWFuKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyxpdGVtVHlwZTondXJsJyx0ZXh0OidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyxpdGVtVHlwZTonYnl0ZXMnLGRpc3BsYXlVbml0OidrYicsZ3JhbnVsYXJpdHk6MSx0ZXh0OidUb3RhbCBTaXplJ30se2tleTondG90YWxNcycsaXRlbVR5cGU6J21zJyx0ZXh0OidUcmFuc2ZlciBUaW1lJ31dO2NvbnN0IHRhYmxlRGV0YWlscz1CeXRlRWZmaWNpZW5jeUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyk7cmV0dXJue3Njb3JlLHJhd1ZhbHVlOnRvdGFsQnl0ZXMsZGlzcGxheVZhbHVlOlsnVG90YWwgc2l6ZSB3YXMgJWRceGEwS0InLHRvdGFsQnl0ZXMvMTAyNF0sZXh0ZW5kZWRJbmZvOnt2YWx1ZTp7cmVzdWx0cyx0b3RhbENvbXBsZXRlZFJlcXVlc3RzfX0sZGV0YWlsczp0YWJsZURldGFpbHN9O319Cm1vZHVsZS5leHBvcnRzPVRvdGFsQnl0ZVdlaWdodDt9LHsiLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjN9XSwiLi4vYXVkaXRzL2J5dGUtZWZmaWNpZW5jeS91bm1pbmlmaWVkLWNzcyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBCeXRlRWZmaWNpZW5jeUF1ZGl0PXJlcXVpcmUoJy4vYnl0ZS1lZmZpY2llbmN5LWF1ZGl0Jyk7Y29uc3QgVW51c2VkQ1NTUnVsZXM9cmVxdWlyZSgnLi91bnVzZWQtY3NzLXJ1bGVzJyk7Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9QRVJDRU5UPTU7Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFUz0yMDQ4O2NsYXNzIFVubWluaWZpZWRDU1MgZXh0ZW5kcyBCeXRlRWZmaWNpZW5jeUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondW5taW5pZmllZC1jc3MnLHRpdGxlOidNaW5pZnkgQ1NTJyxzY29yZURpc3BsYXlNb2RlOkJ5dGVFZmZpY2llbmN5QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLGRlc2NyaXB0aW9uOidNaW5pZnlpbmcgQ1NTIGZpbGVzIGNhbiByZWR1Y2UgbmV0d29yayBwYXlsb2FkIHNpemVzLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL21pbmlmeS1jc3MpLicscmVxdWlyZWRBcnRpZmFjdHM6WydDU1NVc2FnZScsJ2RldnRvb2xzTG9ncyddfTt9CnN0YXRpYyBjb21wdXRlVG9rZW5MZW5ndGgoY29udGVudCl7bGV0IHRvdGFsVG9rZW5MZW5ndGg9MDtsZXQgaXNJbkNvbW1lbnQ9ZmFsc2U7bGV0IGlzSW5MaWNlbnNlQ29tbWVudD1mYWxzZTtsZXQgaXNJblN0cmluZz1mYWxzZTtsZXQgc3RyaW5nT3BlbkNoYXI9bnVsbDtmb3IobGV0IGk9MDtpPGNvbnRlbnQubGVuZ3RoO2krKyl7Y29uc3QgdHdvQ2hhcnM9Y29udGVudC5zdWJzdHIoaSwyKTtjb25zdCBjaGFyPXR3b0NoYXJzLmNoYXJBdCgwKTtjb25zdCBpc1doaXRlc3BhY2U9Y2hhcj09PScgJ3x8Y2hhcj09PSdcbid8fGNoYXI9PT0nXHQnO2NvbnN0IGlzQVN0cmluZ09wZW5DaGFyPWNoYXI9PT1gJ2B8fGNoYXI9PT0nIic7aWYoaXNJbkNvbW1lbnQpe2lmKGlzSW5MaWNlbnNlQ29tbWVudCl0b3RhbFRva2VuTGVuZ3RoKys7aWYodHdvQ2hhcnM9PT0nKi8nKXtpZihpc0luTGljZW5zZUNvbW1lbnQpdG90YWxUb2tlbkxlbmd0aCsrO2lzSW5Db21tZW50PWZhbHNlO2krKzt9fWVsc2UgaWYoaXNJblN0cmluZyl7dG90YWxUb2tlbkxlbmd0aCsrO2lmKGNoYXI9PT0nXFwnKXt0b3RhbFRva2VuTGVuZ3RoKys7aSsrO31lbHNlIGlmKGNoYXI9PT1zdHJpbmdPcGVuQ2hhcil7aXNJblN0cmluZz1mYWxzZTt9fWVsc2V7aWYodHdvQ2hhcnM9PT0nLyonKXtpc0luQ29tbWVudD10cnVlO2lzSW5MaWNlbnNlQ29tbWVudD1jb250ZW50LmNoYXJBdChpKzIpPT09JyEnO2lmKGlzSW5MaWNlbnNlQ29tbWVudCl0b3RhbFRva2VuTGVuZ3RoKz0yO2krKzt9ZWxzZSBpZihpc0FTdHJpbmdPcGVuQ2hhcil7aXNJblN0cmluZz10cnVlO3N0cmluZ09wZW5DaGFyPWNoYXI7dG90YWxUb2tlbkxlbmd0aCsrO31lbHNlIGlmKCFpc1doaXRlc3BhY2Upe3RvdGFsVG9rZW5MZW5ndGgrKzt9fX0KaWYoaXNJbkNvbW1lbnR8fGlzSW5TdHJpbmcpe3JldHVybiBjb250ZW50Lmxlbmd0aDt9CnJldHVybiB0b3RhbFRva2VuTGVuZ3RoO30Kc3RhdGljIGNvbXB1dGVXYXN0ZShzdHlsZXNoZWV0LG5ldHdvcmtSZWNvcmQscGFnZVVybCl7Y29uc3QgY29udGVudD1zdHlsZXNoZWV0LmNvbnRlbnQ7Y29uc3QgdG90YWxUb2tlbkxlbmd0aD1Vbm1pbmlmaWVkQ1NTLmNvbXB1dGVUb2tlbkxlbmd0aChjb250ZW50KTtsZXQgdXJsPXN0eWxlc2hlZXQuaGVhZGVyLnNvdXJjZVVSTDtpZighdXJsfHx1cmw9PT1wYWdlVXJsKXtjb25zdCBjb250ZW50UHJldmlldz1VbnVzZWRDU1NSdWxlcy5kZXRlcm1pbmVDb250ZW50UHJldmlldyhzdHlsZXNoZWV0LmNvbnRlbnQpO3VybD1jb250ZW50UHJldmlldzt9CmNvbnN0IHRvdGFsQnl0ZXM9Qnl0ZUVmZmljaWVuY3lBdWRpdC5lc3RpbWF0ZVRyYW5zZmVyU2l6ZShuZXR3b3JrUmVjb3JkLGNvbnRlbnQubGVuZ3RoLCdTdHlsZXNoZWV0Jyk7Y29uc3Qgd2FzdGVkUmF0aW89MS10b3RhbFRva2VuTGVuZ3RoL2NvbnRlbnQubGVuZ3RoO2NvbnN0IHdhc3RlZEJ5dGVzPU1hdGgucm91bmQodG90YWxCeXRlcyp3YXN0ZWRSYXRpbyk7cmV0dXJue3VybCx0b3RhbEJ5dGVzLHdhc3RlZEJ5dGVzLHdhc3RlZFBlcmNlbnQ6MTAwKndhc3RlZFJhdGlvfTt9CnN0YXRpYyBhdWRpdF8oYXJ0aWZhY3RzLG5ldHdvcmtSZWNvcmRzKXtjb25zdCBwYWdlVXJsPWFydGlmYWN0cy5VUkwuZmluYWxVcmw7Y29uc3QgaXRlbXM9W107Zm9yKGNvbnN0IHN0eWxlc2hlZXQgb2YgYXJ0aWZhY3RzLkNTU1VzYWdlLnN0eWxlc2hlZXRzKXtjb25zdCBuZXR3b3JrUmVjb3JkPW5ldHdvcmtSZWNvcmRzLmZpbmQocmVjb3JkPT5yZWNvcmQudXJsPT09c3R5bGVzaGVldC5oZWFkZXIuc291cmNlVVJMKTtpZighc3R5bGVzaGVldC5jb250ZW50KWNvbnRpbnVlO2NvbnN0IHJlc3VsdD1Vbm1pbmlmaWVkQ1NTLmNvbXB1dGVXYXN0ZShzdHlsZXNoZWV0LG5ldHdvcmtSZWNvcmQscGFnZVVybCk7aWYocmVzdWx0Lndhc3RlZFBlcmNlbnQ8SUdOT1JFX1RIUkVTSE9MRF9JTl9QRVJDRU5UfHxyZXN1bHQud2FzdGVkQnl0ZXM8SUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFU3x8IU51bWJlci5pc0Zpbml0ZShyZXN1bHQud2FzdGVkQnl0ZXMpKWNvbnRpbnVlO2l0ZW1zLnB1c2gocmVzdWx0KTt9CnJldHVybntpdGVtcyxoZWFkaW5nczpbe2tleTondXJsJyx2YWx1ZVR5cGU6J3VybCcsbGFiZWw6J1VSTCd9LHtrZXk6J3RvdGFsQnl0ZXMnLHZhbHVlVHlwZTonYnl0ZXMnLGxhYmVsOidPcmlnaW5hbCd9LHtrZXk6J3dhc3RlZEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonUG90ZW50aWFsIFNhdmluZ3MnfV19O319Cm1vZHVsZS5leHBvcnRzPVVubWluaWZpZWRDU1M7fSx7Ii4vYnl0ZS1lZmZpY2llbmN5LWF1ZGl0IjozLCIuL3VudXNlZC1jc3MtcnVsZXMiOiIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VudXNlZC1jc3MtcnVsZXMifV0sIi4uL2F1ZGl0cy9ieXRlLWVmZmljaWVuY3kvdW5taW5pZmllZC1qYXZhc2NyaXB0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBlc3ByaW1hPXJlcXVpcmUoJ2VzcHJpbWEnKTtjb25zdCBJR05PUkVfVEhSRVNIT0xEX0lOX1BFUkNFTlQ9MTA7Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFUz0yMDQ4O2NsYXNzIFVubWluaWZpZWRKYXZhU2NyaXB0IGV4dGVuZHMgQnl0ZUVmZmljaWVuY3lBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VubWluaWZpZWQtamF2YXNjcmlwdCcsdGl0bGU6J01pbmlmeSBKYXZhU2NyaXB0JyxzY29yZURpc3BsYXlNb2RlOkJ5dGVFZmZpY2llbmN5QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLGRlc2NyaXB0aW9uOidNaW5pZnlpbmcgSmF2YVNjcmlwdCBmaWxlcyBjYW4gcmVkdWNlIHBheWxvYWQgc2l6ZXMgYW5kIHNjcmlwdCBwYXJzZSB0aW1lLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvZG9jcy9pbnNpZ2h0cy9NaW5pZnlSZXNvdXJjZXMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydTY3JpcHRzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGNvbXB1dGVXYXN0ZShzY3JpcHRDb250ZW50LG5ldHdvcmtSZWNvcmQpe2NvbnN0IGNvbnRlbnRMZW5ndGg9c2NyaXB0Q29udGVudC5sZW5ndGg7bGV0IHRvdGFsVG9rZW5MZW5ndGg9MDtjb25zdCB0b2tlbnM9ZXNwcmltYS50b2tlbml6ZShzY3JpcHRDb250ZW50LHt0b2xlcmFudDp0cnVlfSk7aWYoIXRva2Vucy5sZW5ndGgmJnRva2Vucy5lcnJvcnMmJnRva2Vucy5lcnJvcnMubGVuZ3RoKXt0aHJvdyB0b2tlbnMuZXJyb3JzWzBdO30KZm9yKGNvbnN0IHRva2VuIG9mIHRva2Vucyl7dG90YWxUb2tlbkxlbmd0aCs9dG9rZW4udmFsdWUubGVuZ3RoO30KY29uc3QgdG90YWxCeXRlcz1CeXRlRWZmaWNpZW5jeUF1ZGl0LmVzdGltYXRlVHJhbnNmZXJTaXplKG5ldHdvcmtSZWNvcmQsY29udGVudExlbmd0aCwnU2NyaXB0Jyk7Y29uc3Qgd2FzdGVkUmF0aW89MS10b3RhbFRva2VuTGVuZ3RoL2NvbnRlbnRMZW5ndGg7Y29uc3Qgd2FzdGVkQnl0ZXM9TWF0aC5yb3VuZCh0b3RhbEJ5dGVzKndhc3RlZFJhdGlvKTtyZXR1cm57dXJsOm5ldHdvcmtSZWNvcmQudXJsLHRvdGFsQnl0ZXMsd2FzdGVkQnl0ZXMsd2FzdGVkUGVyY2VudDoxMDAqd2FzdGVkUmF0aW99O30Kc3RhdGljIGF1ZGl0XyhhcnRpZmFjdHMsbmV0d29ya1JlY29yZHMpe2NvbnN0IGl0ZW1zPVtdO2NvbnN0IHdhcm5pbmdzPVtdO2Zvcihjb25zdCByZXF1ZXN0SWQgb2YgT2JqZWN0LmtleXMoYXJ0aWZhY3RzLlNjcmlwdHMpKXtjb25zdCBzY3JpcHRDb250ZW50PWFydGlmYWN0cy5TY3JpcHRzW3JlcXVlc3RJZF07Y29uc3QgbmV0d29ya1JlY29yZD1uZXR3b3JrUmVjb3Jkcy5maW5kKHJlY29yZD0+cmVjb3JkLnJlcXVlc3RJZD09PXJlcXVlc3RJZCk7aWYoIW5ldHdvcmtSZWNvcmR8fCFzY3JpcHRDb250ZW50KWNvbnRpbnVlO3RyeXtjb25zdCByZXN1bHQ9VW5taW5pZmllZEphdmFTY3JpcHQuY29tcHV0ZVdhc3RlKHNjcmlwdENvbnRlbnQsbmV0d29ya1JlY29yZCk7aWYocmVzdWx0Lndhc3RlZFBlcmNlbnQ8SUdOT1JFX1RIUkVTSE9MRF9JTl9QRVJDRU5UfHxyZXN1bHQud2FzdGVkQnl0ZXM8SUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFU3x8IU51bWJlci5pc0Zpbml0ZShyZXN1bHQud2FzdGVkQnl0ZXMpKWNvbnRpbnVlO2l0ZW1zLnB1c2gocmVzdWx0KTt9Y2F0Y2goZXJyKXt3YXJuaW5ncy5wdXNoKGBVbmFibGUgdG8gcHJvY2VzcyAke25ldHdvcmtSZWNvcmQudXJsfTogJHtlcnIubWVzc2FnZX1gKTt9fQpyZXR1cm57aXRlbXMsd2FybmluZ3MsaGVhZGluZ3M6W3trZXk6J3VybCcsdmFsdWVUeXBlOid1cmwnLGxhYmVsOidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonT3JpZ2luYWwnfSx7a2V5Oid3YXN0ZWRCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J1BvdGVudGlhbCBTYXZpbmdzJ31dfTt9fQptb2R1bGUuZXhwb3J0cz1Vbm1pbmlmaWVkSmF2YVNjcmlwdDt9LHsiLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjMsImVzcHJpbWEiOjExOH1dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VudXNlZC1jc3MtcnVsZXMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQnl0ZUVmZmljaWVuY3lBdWRpdD1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCcpO2NvbnN0IElHTk9SRV9USFJFU0hPTERfSU5fQllURVM9MjA0ODtjb25zdCBQUkVWSUVXX0xFTkdUSD0xMDA7Y2xhc3MgVW51c2VkQ1NTUnVsZXMgZXh0ZW5kcyBCeXRlRWZmaWNpZW5jeUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondW51c2VkLWNzcy1ydWxlcycsdGl0bGU6J0RlZmVyIHVudXNlZCBDU1MnLHNjb3JlRGlzcGxheU1vZGU6Qnl0ZUVmZmljaWVuY3lBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMsZGVzY3JpcHRpb246J1JlbW92ZSB1bnVzZWQgcnVsZXMgZnJvbSBzdHlsZXNoZWV0cyB0byByZWR1Y2UgdW5uZWNlc3NhcnkgJysnYnl0ZXMgY29uc3VtZWQgYnkgbmV0d29yayBhY3Rpdml0eS4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL2RvY3MvaW5zaWdodHMvT3B0aW1pemVDU1NEZWxpdmVyeSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0NTU1VzYWdlJywnVVJMJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGluZGV4U3R5bGVzaGVldHNCeUlkKHN0eWxlcyxuZXR3b3JrUmVjb3Jkcyl7Y29uc3QgaW5kZXhlZE5ldHdvcmtSZWNvcmRzPW5ldHdvcmtSZWNvcmRzLnJlZHVjZSgoaW5kZXhlZCxyZWNvcmQpPT57aW5kZXhlZFtyZWNvcmQudXJsXT1yZWNvcmQ7cmV0dXJuIGluZGV4ZWQ7fSx7fSk7cmV0dXJuIHN0eWxlcy5yZWR1Y2UoKGluZGV4ZWQsc3R5bGVzaGVldCk9PntpbmRleGVkW3N0eWxlc2hlZXQuaGVhZGVyLnN0eWxlU2hlZXRJZF09T2JqZWN0LmFzc2lnbih7dXNlZFJ1bGVzOltdLG5ldHdvcmtSZWNvcmQ6aW5kZXhlZE5ldHdvcmtSZWNvcmRzW3N0eWxlc2hlZXQuaGVhZGVyLnNvdXJjZVVSTF19LHN0eWxlc2hlZXQpO3JldHVybiBpbmRleGVkO30se30pO30Kc3RhdGljIGluZGV4VXNlZFJ1bGVzKHJ1bGVzLGluZGV4ZWRTdHlsZXNoZWV0cyl7cnVsZXMuZm9yRWFjaChydWxlPT57Y29uc3Qgc3R5bGVzaGVldEluZm89aW5kZXhlZFN0eWxlc2hlZXRzW3J1bGUuc3R5bGVTaGVldElkXTtpZighc3R5bGVzaGVldEluZm8pe3JldHVybjt9CmlmKHJ1bGUudXNlZCl7c3R5bGVzaGVldEluZm8udXNlZFJ1bGVzLnB1c2gocnVsZSk7fX0pO30Kc3RhdGljIGNvbXB1dGVVc2FnZShzdHlsZXNoZWV0SW5mbyl7bGV0IHVzZWRVbmNvbXByZXNzZWRCeXRlcz0wO2NvbnN0IHRvdGFsVW5jb21wcmVzc2VkQnl0ZXM9c3R5bGVzaGVldEluZm8uY29udGVudC5sZW5ndGg7Zm9yKGNvbnN0IHVzZWRSdWxlIG9mIHN0eWxlc2hlZXRJbmZvLnVzZWRSdWxlcyl7dXNlZFVuY29tcHJlc3NlZEJ5dGVzKz11c2VkUnVsZS5lbmRPZmZzZXQtdXNlZFJ1bGUuc3RhcnRPZmZzZXQ7fQpjb25zdCB0b3RhbFRyYW5zZmVycmVkQnl0ZXM9Qnl0ZUVmZmljaWVuY3lBdWRpdC5lc3RpbWF0ZVRyYW5zZmVyU2l6ZShzdHlsZXNoZWV0SW5mby5uZXR3b3JrUmVjb3JkLHRvdGFsVW5jb21wcmVzc2VkQnl0ZXMsJ1N0eWxlc2hlZXQnKTtjb25zdCBwZXJjZW50VW51c2VkPSh0b3RhbFVuY29tcHJlc3NlZEJ5dGVzLXVzZWRVbmNvbXByZXNzZWRCeXRlcykvdG90YWxVbmNvbXByZXNzZWRCeXRlcztjb25zdCB3YXN0ZWRCeXRlcz1NYXRoLnJvdW5kKHBlcmNlbnRVbnVzZWQqdG90YWxUcmFuc2ZlcnJlZEJ5dGVzKTtyZXR1cm57d2FzdGVkQnl0ZXMsd2FzdGVkUGVyY2VudDpwZXJjZW50VW51c2VkKjEwMCx0b3RhbEJ5dGVzOnRvdGFsVHJhbnNmZXJyZWRCeXRlc307fQpzdGF0aWMgZGV0ZXJtaW5lQ29udGVudFByZXZpZXcoY29udGVudCl7bGV0IHByZXZpZXc9KGNvbnRlbnR8fCcnKS5zbGljZSgwLFBSRVZJRVdfTEVOR1RIKjUpLnJlcGxhY2UoLyggezIsfXxcdCkrL2csJyAgJykucmVwbGFjZSgvXG5ccyt9L2csJ1xufScpLnRyaW0oKTtpZihwcmV2aWV3Lmxlbmd0aD5QUkVWSUVXX0xFTkdUSCl7Y29uc3QgZmlyc3RSdWxlU3RhcnQ9cHJldmlldy5pbmRleE9mKCd7Jyk7Y29uc3QgZmlyc3RSdWxlRW5kPXByZXZpZXcuaW5kZXhPZignfScpO2lmKGZpcnN0UnVsZVN0YXJ0PT09LTF8fGZpcnN0UnVsZUVuZD09PS0xfHxmaXJzdFJ1bGVTdGFydD5maXJzdFJ1bGVFbmR8fGZpcnN0UnVsZVN0YXJ0PlBSRVZJRVdfTEVOR1RIKXtwcmV2aWV3PXByZXZpZXcuc2xpY2UoMCxQUkVWSUVXX0xFTkdUSCkrJy4uLic7fWVsc2UgaWYoZmlyc3RSdWxlRW5kPFBSRVZJRVdfTEVOR1RIKXtwcmV2aWV3PXByZXZpZXcuc2xpY2UoMCxmaXJzdFJ1bGVFbmQrMSkrJyAuLi4nO31lbHNle2NvbnN0IGxhc3RTZW1pY29sb25JbmRleD1wcmV2aWV3LnNsaWNlKDAsUFJFVklFV19MRU5HVEgpLmxhc3RJbmRleE9mKCc7Jyk7cHJldmlldz1sYXN0U2VtaWNvbG9uSW5kZXg8Zmlyc3RSdWxlU3RhcnQ/cHJldmlldy5zbGljZSgwLFBSRVZJRVdfTEVOR1RIKSsnLi4uIH0gLi4uJzpwcmV2aWV3LnNsaWNlKDAsbGFzdFNlbWljb2xvbkluZGV4KzEpKycgLi4uIH0gLi4uJzt9fQpyZXR1cm4gcHJldmlldzt9CnN0YXRpYyBtYXBTaGVldFRvUmVzdWx0KHN0eWxlc2hlZXRJbmZvLHBhZ2VVcmwpe2xldCB1cmw9c3R5bGVzaGVldEluZm8uaGVhZGVyLnNvdXJjZVVSTDtpZighdXJsfHx1cmw9PT1wYWdlVXJsKXtjb25zdCBjb250ZW50UHJldmlldz1VbnVzZWRDU1NSdWxlcy5kZXRlcm1pbmVDb250ZW50UHJldmlldyhzdHlsZXNoZWV0SW5mby5jb250ZW50KTt1cmw9Y29udGVudFByZXZpZXc7fQpjb25zdCB1c2FnZT1VbnVzZWRDU1NSdWxlcy5jb21wdXRlVXNhZ2Uoc3R5bGVzaGVldEluZm8pO2NvbnN0IHJlc3VsdD17dXJsfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihyZXN1bHQsdXNhZ2UpO30Kc3RhdGljIGF1ZGl0XyhhcnRpZmFjdHMpe2NvbnN0IHN0eWxlcz1hcnRpZmFjdHMuQ1NTVXNhZ2Uuc3R5bGVzaGVldHM7Y29uc3QgdXNhZ2U9YXJ0aWZhY3RzLkNTU1VzYWdlLnJ1bGVzO2NvbnN0IHBhZ2VVcmw9YXJ0aWZhY3RzLlVSTC5maW5hbFVybDtjb25zdCBkZXZ0b29sc0xvZ3M9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tCeXRlRWZmaWNpZW5jeUF1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2dzKS50aGVuKG5ldHdvcmtSZWNvcmRzPT57Y29uc3QgaW5kZXhlZFNoZWV0cz1VbnVzZWRDU1NSdWxlcy5pbmRleFN0eWxlc2hlZXRzQnlJZChzdHlsZXMsbmV0d29ya1JlY29yZHMpO1VudXNlZENTU1J1bGVzLmluZGV4VXNlZFJ1bGVzKHVzYWdlLGluZGV4ZWRTaGVldHMpO2NvbnN0IGl0ZW1zPU9iamVjdC5rZXlzKGluZGV4ZWRTaGVldHMpLm1hcChzaGVldElkPT5VbnVzZWRDU1NSdWxlcy5tYXBTaGVldFRvUmVzdWx0KGluZGV4ZWRTaGVldHNbc2hlZXRJZF0scGFnZVVybCkpLmZpbHRlcihzaGVldD0+c2hlZXQmJnNoZWV0Lndhc3RlZEJ5dGVzPklHTk9SRV9USFJFU0hPTERfSU5fQllURVMpO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLHZhbHVlVHlwZTondXJsJyxsYWJlbDonVVJMJ30se2tleTondG90YWxCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J09yaWdpbmFsJ30se2tleTond2FzdGVkQnl0ZXMnLHZhbHVlVHlwZTonYnl0ZXMnLGxhYmVsOidQb3RlbnRpYWwgU2F2aW5ncyd9XTtyZXR1cm57aXRlbXMsaGVhZGluZ3N9O30pO319Cm1vZHVsZS5leHBvcnRzPVVudXNlZENTU1J1bGVzO30seyIuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6M31dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VudXNlZC1qYXZhc2NyaXB0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBJR05PUkVfVEhSRVNIT0xEX0lOX0JZVEVTPTIwNDg7Y2xhc3MgVW51c2VkSmF2YVNjcmlwdCBleHRlbmRzIEJ5dGVFZmZpY2llbmN5QXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid1bnVzZWQtamF2YXNjcmlwdCcsdGl0bGU6J1VudXNlZCBKYXZhU2NyaXB0JyxzY29yZURpc3BsYXlNb2RlOkJ5dGVFZmZpY2llbmN5QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLGRlc2NyaXB0aW9uOidSZW1vdmUgdW51c2VkIEphdmFTY3JpcHQgdG8gcmVkdWNlIGJ5dGVzIGNvbnN1bWVkIGJ5IG5ldHdvcmsgYWN0aXZpdHkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0pzVXNhZ2UnLCdkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgY29tcHV0ZVdhc3RlKHNjcmlwdCl7bGV0IG1heGltdW1FbmRPZmZzZXQ9MDtmb3IoY29uc3QgZnVuYyBvZiBzY3JpcHQuZnVuY3Rpb25zKXtmb3IoY29uc3QgcmFuZ2Ugb2YgZnVuYy5yYW5nZXMpe21heGltdW1FbmRPZmZzZXQ9TWF0aC5tYXgobWF4aW11bUVuZE9mZnNldCxyYW5nZS5lbmRPZmZzZXQpO319CmNvbnN0IHVudXNlZEJ5SW5kZXg9bmV3IFVpbnQ4QXJyYXkobWF4aW11bUVuZE9mZnNldCk7Zm9yKGNvbnN0IGZ1bmMgb2Ygc2NyaXB0LmZ1bmN0aW9ucyl7Zm9yKGNvbnN0IHJhbmdlIG9mIGZ1bmMucmFuZ2VzKXtpZihyYW5nZS5jb3VudD09PTApe2ZvcihsZXQgaT1yYW5nZS5zdGFydE9mZnNldDtpPHJhbmdlLmVuZE9mZnNldDtpKyspe3VudXNlZEJ5SW5kZXhbaV09MTt9fX19CmxldCB1bnVzZWQ9MDtmb3IoY29uc3QgeCBvZiB1bnVzZWRCeUluZGV4KXt1bnVzZWQrPXg7fQpyZXR1cm57dW51c2VkTGVuZ3RoOnVudXNlZCxjb250ZW50TGVuZ3RoOm1heGltdW1FbmRPZmZzZXR9O30Kc3RhdGljIG1lcmdlV2FzdGUod2FzdGVEYXRhLG5ldHdvcmtSZWNvcmQpe2xldCB1bnVzZWRMZW5ndGg9MDtsZXQgY29udGVudExlbmd0aD0wO2Zvcihjb25zdCB1c2FnZSBvZiB3YXN0ZURhdGEpe3VudXNlZExlbmd0aCs9dXNhZ2UudW51c2VkTGVuZ3RoO2NvbnRlbnRMZW5ndGgrPXVzYWdlLmNvbnRlbnRMZW5ndGg7fQpjb25zdCB0b3RhbEJ5dGVzPUJ5dGVFZmZpY2llbmN5QXVkaXQuZXN0aW1hdGVUcmFuc2ZlclNpemUobmV0d29ya1JlY29yZCxjb250ZW50TGVuZ3RoLCdTY3JpcHQnKTtjb25zdCB3YXN0ZWRSYXRpbz11bnVzZWRMZW5ndGgvY29udGVudExlbmd0aHx8MDtjb25zdCB3YXN0ZWRCeXRlcz1NYXRoLnJvdW5kKHRvdGFsQnl0ZXMqd2FzdGVkUmF0aW8pO3JldHVybnt1cmw6bmV0d29ya1JlY29yZC51cmwsdG90YWxCeXRlcyx3YXN0ZWRCeXRlcyx3YXN0ZWRQZXJjZW50OjEwMCp3YXN0ZWRSYXRpb307fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyxuZXR3b3JrUmVjb3Jkcyl7Y29uc3Qgc2NyaXB0c0J5VXJsPW5ldyBNYXAoKTtmb3IoY29uc3Qgc2NyaXB0IG9mIGFydGlmYWN0cy5Kc1VzYWdlKXtjb25zdCBzY3JpcHRzPXNjcmlwdHNCeVVybC5nZXQoc2NyaXB0LnVybCl8fFtdO3NjcmlwdHMucHVzaChzY3JpcHQpO3NjcmlwdHNCeVVybC5zZXQoc2NyaXB0LnVybCxzY3JpcHRzKTt9CmNvbnN0IGl0ZW1zPVtdO2Zvcihjb25zdFt1cmwsc2NyaXB0c11vZiBzY3JpcHRzQnlVcmwuZW50cmllcygpKXtjb25zdCBuZXR3b3JrUmVjb3JkPW5ldHdvcmtSZWNvcmRzLmZpbmQocmVjb3JkPT5yZWNvcmQudXJsPT09dXJsKTtpZighbmV0d29ya1JlY29yZCljb250aW51ZTtjb25zdCB3YXN0ZURhdGE9c2NyaXB0cy5tYXAoVW51c2VkSmF2YVNjcmlwdC5jb21wdXRlV2FzdGUpO2NvbnN0IGl0ZW09VW51c2VkSmF2YVNjcmlwdC5tZXJnZVdhc3RlKHdhc3RlRGF0YSxuZXR3b3JrUmVjb3JkKTtpZihpdGVtLndhc3RlZEJ5dGVzPD1JR05PUkVfVEhSRVNIT0xEX0lOX0JZVEVTKWNvbnRpbnVlO2l0ZW1zLnB1c2goaXRlbSk7fQpyZXR1cm57aXRlbXMsaGVhZGluZ3M6W3trZXk6J3VybCcsdmFsdWVUeXBlOid1cmwnLGxhYmVsOidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonT3JpZ2luYWwnfSx7a2V5Oid3YXN0ZWRCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J1BvdGVudGlhbCBTYXZpbmdzJ31dfTt9fQptb2R1bGUuZXhwb3J0cz1VbnVzZWRKYXZhU2NyaXB0O30seyIuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6M31dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VzZXMtbG9uZy1jYWNoZS10dGwiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgYXNzZXJ0PXJlcXVpcmUoJ2Fzc2VydCcpO2NvbnN0IHBhcnNlQ2FjaGVDb250cm9sPXJlcXVpcmUoJ3BhcnNlLWNhY2hlLWNvbnRyb2wnKTtjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NvbnN0IE5ldHdvcmtSZXF1ZXN0PXJlcXVpcmUoJy4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgbGluZWFySW50ZXJwb2xhdGlvbj1yZXF1aXJlKCcuLi8uLi9saWIvc3RhdGlzdGljcycpLmxpbmVhckludGVycG9sYXRpb247Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9QRVJDRU5UPTAuOTI1O2NsYXNzIENhY2hlSGVhZGVycyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondXNlcy1sb25nLWNhY2hlLXR0bCcsdGl0bGU6J1VzZXMgZWZmaWNpZW50IGNhY2hlIHBvbGljeSBvbiBzdGF0aWMgYXNzZXRzJyxmYWlsdXJlVGl0bGU6J1VzZXMgaW5lZmZpY2llbnQgY2FjaGUgcG9saWN5IG9uIHN0YXRpYyBhc3NldHMnLGRlc2NyaXB0aW9uOidBIGxvbmcgY2FjaGUgbGlmZXRpbWUgY2FuIHNwZWVkIHVwIHJlcGVhdCB2aXNpdHMgdG8geW91ciBwYWdlLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2NhY2hlLXBvbGljeSkuJyxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxyZXF1aXJlZEFydGlmYWN0czpbJ2RldnRvb2xzTG9ncyddfTt9CnN0YXRpYyBnZXQgZGVmYXVsdE9wdGlvbnMoKXtyZXR1cm57c2NvcmVQT0RSOjQqMTAyNCxzY29yZU1lZGlhbjoxMjgqMTAyNH07fQpzdGF0aWMgZ2V0Q2FjaGVIaXRQcm9iYWJpbGl0eShtYXhBZ2VJblNlY29uZHMpe2NvbnN0IFJFU09VUkNFX0FHRV9JTl9IT1VSU19ERUNJTEVTPVswLDAuMiwxLDMsOCwxMiwyNCw0OCw3MiwxNjgsODc2MCxJbmZpbml0eV07YXNzZXJ0Lm9rKFJFU09VUkNFX0FHRV9JTl9IT1VSU19ERUNJTEVTLmxlbmd0aD09PTEyLCdkZWNpbGVzIDAtMTAgYW5kIDEgZm9yIG92ZXJmbG93Jyk7Y29uc3QgbWF4QWdlSW5Ib3Vycz1tYXhBZ2VJblNlY29uZHMvMzYwMDtjb25zdCB1cHBlckRlY2lsZUluZGV4PVJFU09VUkNFX0FHRV9JTl9IT1VSU19ERUNJTEVTLmZpbmRJbmRleChkZWNpbGU9PmRlY2lsZT49bWF4QWdlSW5Ib3Vycyk7aWYodXBwZXJEZWNpbGVJbmRleD09PVJFU09VUkNFX0FHRV9JTl9IT1VSU19ERUNJTEVTLmxlbmd0aC0xKXJldHVybiAxO2lmKHVwcGVyRGVjaWxlSW5kZXg9PT0wKXJldHVybiAwO2NvbnN0IHVwcGVyRGVjaWxlVmFsdWU9UkVTT1VSQ0VfQUdFX0lOX0hPVVJTX0RFQ0lMRVNbdXBwZXJEZWNpbGVJbmRleF07Y29uc3QgbG93ZXJEZWNpbGVWYWx1ZT1SRVNPVVJDRV9BR0VfSU5fSE9VUlNfREVDSUxFU1t1cHBlckRlY2lsZUluZGV4LTFdO2NvbnN0IHVwcGVyRGVjaWxlPXVwcGVyRGVjaWxlSW5kZXgvMTA7Y29uc3QgbG93ZXJEZWNpbGU9KHVwcGVyRGVjaWxlSW5kZXgtMSkvMTA7cmV0dXJuIGxpbmVhckludGVycG9sYXRpb24obG93ZXJEZWNpbGVWYWx1ZSxsb3dlckRlY2lsZSx1cHBlckRlY2lsZVZhbHVlLHVwcGVyRGVjaWxlLG1heEFnZUluSG91cnMpO30Kc3RhdGljIGNvbXB1dGVDYWNoZUxpZmV0aW1lSW5TZWNvbmRzKGhlYWRlcnMsY2FjaGVDb250cm9sKXtpZihjYWNoZUNvbnRyb2wpe2lmKGNhY2hlQ29udHJvbFsnbm8tY2FjaGUnXXx8Y2FjaGVDb250cm9sWyduby1zdG9yZSddKXJldHVybiAwO2NvbnN0IG1heEFnZT1jYWNoZUNvbnRyb2xbJ21heC1hZ2UnXTtpZihtYXhBZ2UhPT11bmRlZmluZWQmJk51bWJlci5pc0Zpbml0ZShtYXhBZ2UpKXJldHVybiBNYXRoLm1heChtYXhBZ2UsMCk7fWVsc2UgaWYoKGhlYWRlcnMuZ2V0KCdwcmFnbWEnKXx8JycpLmluY2x1ZGVzKCduby1jYWNoZScpKXtyZXR1cm4gMDt9CmNvbnN0IGV4cGlyZXNIZWFkZXJzPWhlYWRlcnMuZ2V0KCdleHBpcmVzJyk7aWYoZXhwaXJlc0hlYWRlcnMpe2NvbnN0IGV4cGlyZXM9bmV3IERhdGUoZXhwaXJlc0hlYWRlcnMpLmdldFRpbWUoKTtpZighZXhwaXJlcylyZXR1cm4gMDtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmNlaWwoKGV4cGlyZXMtRGF0ZS5ub3coKSkvMTAwMCkpO30KcmV0dXJuIG51bGw7fQpzdGF0aWMgaXNDYWNoZWFibGVBc3NldChyZWNvcmQpe2NvbnN0IENBQ0hFQUJMRV9TVEFUVVNfQ09ERVM9bmV3IFNldChbMjAwLDIwMywyMDZdKTtjb25zdCBTVEFUSUNfUkVTT1VSQ0VfVFlQRVM9bmV3IFNldChbTmV0d29ya1JlcXVlc3QuVFlQRVMuRm9udCxOZXR3b3JrUmVxdWVzdC5UWVBFUy5JbWFnZSxOZXR3b3JrUmVxdWVzdC5UWVBFUy5NZWRpYSxOZXR3b3JrUmVxdWVzdC5UWVBFUy5TY3JpcHQsTmV0d29ya1JlcXVlc3QuVFlQRVMuU3R5bGVzaGVldF0pO2NvbnN0IHJlc291cmNlVXJsPXJlY29yZC51cmw7cmV0dXJuKENBQ0hFQUJMRV9TVEFUVVNfQ09ERVMuaGFzKHJlY29yZC5zdGF0dXNDb2RlKSYmU1RBVElDX1JFU09VUkNFX1RZUEVTLmhhcyhyZWNvcmQucmVzb3VyY2VUeXBlfHwnT3RoZXInKSYmIXJlc291cmNlVXJsLmluY2x1ZGVzKCdkYXRhOicpKTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgZGV2dG9vbHNMb2dzPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtyZXR1cm4gYXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3JkcyhkZXZ0b29sc0xvZ3MpLnRoZW4ocmVjb3Jkcz0+e2NvbnN0IHJlc3VsdHM9W107bGV0IHF1ZXJ5U3RyaW5nQ291bnQ9MDtsZXQgdG90YWxXYXN0ZWRCeXRlcz0wO2Zvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7aWYoIUNhY2hlSGVhZGVycy5pc0NhY2hlYWJsZUFzc2V0KHJlY29yZCkpY29udGludWU7Y29uc3QgaGVhZGVycz1uZXcgTWFwKCk7Zm9yKGNvbnN0IGhlYWRlciBvZiByZWNvcmQucmVzcG9uc2VIZWFkZXJzfHxbXSl7aGVhZGVycy5zZXQoaGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKSxoZWFkZXIudmFsdWUpO30KY29uc3QgY2FjaGVDb250cm9sPXBhcnNlQ2FjaGVDb250cm9sKGhlYWRlcnMuZ2V0KCdjYWNoZS1jb250cm9sJykpO2xldCBjYWNoZUxpZmV0aW1lSW5TZWNvbmRzPUNhY2hlSGVhZGVycy5jb21wdXRlQ2FjaGVMaWZldGltZUluU2Vjb25kcyhoZWFkZXJzLGNhY2hlQ29udHJvbCk7aWYoY2FjaGVMaWZldGltZUluU2Vjb25kcz09PTApY29udGludWU7Y2FjaGVMaWZldGltZUluU2Vjb25kcz1jYWNoZUxpZmV0aW1lSW5TZWNvbmRzfHwwO2NvbnN0IGNhY2hlSGl0UHJvYmFiaWxpdHk9Q2FjaGVIZWFkZXJzLmdldENhY2hlSGl0UHJvYmFiaWxpdHkoY2FjaGVMaWZldGltZUluU2Vjb25kcyk7aWYoY2FjaGVIaXRQcm9iYWJpbGl0eT5JR05PUkVfVEhSRVNIT0xEX0lOX1BFUkNFTlQpY29udGludWU7Y29uc3QgdXJsPVVSTC5lbGlkZURhdGFVUkkocmVjb3JkLnVybCk7Y29uc3QgdG90YWxCeXRlcz1yZWNvcmQudHJhbnNmZXJTaXplfHwwO2NvbnN0IHdhc3RlZEJ5dGVzPSgxLWNhY2hlSGl0UHJvYmFiaWxpdHkpKnRvdGFsQnl0ZXM7dG90YWxXYXN0ZWRCeXRlcys9d2FzdGVkQnl0ZXM7aWYodXJsLmluY2x1ZGVzKCc/JykpcXVlcnlTdHJpbmdDb3VudCsrO3Jlc3VsdHMucHVzaCh7dXJsLGNhY2hlQ29udHJvbCxjYWNoZUxpZmV0aW1lTXM6Y2FjaGVMaWZldGltZUluU2Vjb25kcyoxMDAwLGNhY2hlSGl0UHJvYmFiaWxpdHksdG90YWxCeXRlcyx3YXN0ZWRCeXRlc30pO30KcmVzdWx0cy5zb3J0KChhLGIpPT5hLmNhY2hlTGlmZXRpbWVNcy1iLmNhY2hlTGlmZXRpbWVNc3x8Yi50b3RhbEJ5dGVzLWEudG90YWxCeXRlcyk7Y29uc3Qgc2NvcmU9QXVkaXQuY29tcHV0ZUxvZ05vcm1hbFNjb3JlKHRvdGFsV2FzdGVkQnl0ZXMsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLGl0ZW1UeXBlOid1cmwnLHRleHQ6J1VSTCd9LHtrZXk6J2NhY2hlTGlmZXRpbWVNcycsaXRlbVR5cGU6J21zJyx0ZXh0OidDYWNoZSBUVEwnLGRpc3BsYXlVbml0OidkdXJhdGlvbid9LHtrZXk6J3RvdGFsQnl0ZXMnLGl0ZW1UeXBlOidieXRlcycsdGV4dDonU2l6ZSAoS0IpJyxkaXNwbGF5VW5pdDona2InLGdyYW51bGFyaXR5OjF9XTtjb25zdCBzdW1tYXJ5PXt3YXN0ZWRCeXRlczp0b3RhbFdhc3RlZEJ5dGVzfTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyxzdW1tYXJ5KTtyZXR1cm57c2NvcmUscmF3VmFsdWU6dG90YWxXYXN0ZWRCeXRlcyxkaXNwbGF5VmFsdWU6YCR7cmVzdWx0cy5sZW5ndGh9IGFzc2V0JHtyZXN1bHRzLmxlbmd0aCE9PTE/J3MnOicnfSBmb3VuZGAsZXh0ZW5kZWRJbmZvOnt2YWx1ZTp7cmVzdWx0cyxxdWVyeVN0cmluZ0NvdW50fX0sZGV0YWlsc307fSk7fX0KbW9kdWxlLmV4cG9ydHM9Q2FjaGVIZWFkZXJzO30seyIuLi8uLi9saWIvbmV0d29yay1yZXF1ZXN0IjozOCwiLi4vLi4vbGliL3N0YXRpc3RpY3MiOjQxLCIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuLi9hdWRpdCI6MiwiYXNzZXJ0Ijo1MywicGFyc2UtY2FjaGUtY29udHJvbCI6MTI5fV0sIi4uL2F1ZGl0cy9ieXRlLWVmZmljaWVuY3kvdXNlcy1vcHRpbWl6ZWQtaW1hZ2VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJ5dGVFZmZpY2llbmN5QXVkaXQ9cmVxdWlyZSgnLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgSUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFUz00MDk2O2NsYXNzIFVzZXNPcHRpbWl6ZWRJbWFnZXMgZXh0ZW5kcyBCeXRlRWZmaWNpZW5jeUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondXNlcy1vcHRpbWl6ZWQtaW1hZ2VzJyx0aXRsZTonRWZmaWNpZW50bHkgZW5jb2RlIGltYWdlcycsc2NvcmVEaXNwbGF5TW9kZTpCeXRlRWZmaWNpZW5jeUF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxkZXNjcmlwdGlvbjonT3B0aW1pemVkIGltYWdlcyBsb2FkIGZhc3RlciBhbmQgY29uc3VtZSBsZXNzIGNlbGx1bGFyIGRhdGEuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvb3B0aW1pemUtaW1hZ2VzKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnT3B0aW1pemVkSW1hZ2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGNvbXB1dGVTYXZpbmdzKGltYWdlKXtjb25zdCBieXRlcz1pbWFnZS5vcmlnaW5hbFNpemUtaW1hZ2UuanBlZ1NpemU7Y29uc3QgcGVyY2VudD0xMDAqYnl0ZXMvaW1hZ2Uub3JpZ2luYWxTaXplO3JldHVybntieXRlcyxwZXJjZW50fTt9CnN0YXRpYyBhdWRpdF8oYXJ0aWZhY3RzKXtjb25zdCBpbWFnZXM9YXJ0aWZhY3RzLk9wdGltaXplZEltYWdlcztjb25zdCBpdGVtcz1bXTtjb25zdCB3YXJuaW5ncz1bXTtmb3IoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VzKXtpZihpbWFnZS5mYWlsZWQpe3dhcm5pbmdzLnB1c2goYFVuYWJsZSB0byBkZWNvZGUgJHtVUkwuZ2V0VVJMRGlzcGxheU5hbWUoaW1hZ2UudXJsKX1gKTtjb250aW51ZTt9ZWxzZSBpZigvKGpwZWd8Ym1wKS8udGVzdChpbWFnZS5taW1lVHlwZSk9PT1mYWxzZXx8aW1hZ2Uub3JpZ2luYWxTaXplPGltYWdlLmpwZWdTaXplK0lHTk9SRV9USFJFU0hPTERfSU5fQllURVMpe2NvbnRpbnVlO30KY29uc3QgdXJsPVVSTC5lbGlkZURhdGFVUkkoaW1hZ2UudXJsKTtjb25zdCBqcGVnU2F2aW5ncz1Vc2VzT3B0aW1pemVkSW1hZ2VzLmNvbXB1dGVTYXZpbmdzKGltYWdlKTtpdGVtcy5wdXNoKHt1cmwsZnJvbVByb3RvY29sOmltYWdlLmZyb21Qcm90b2NvbCxpc0Nyb3NzT3JpZ2luOiFpbWFnZS5pc1NhbWVPcmlnaW4sdG90YWxCeXRlczppbWFnZS5vcmlnaW5hbFNpemUsd2FzdGVkQnl0ZXM6anBlZ1NhdmluZ3MuYnl0ZXN9KTt9CmNvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLHZhbHVlVHlwZTondGh1bWJuYWlsJyxsYWJlbDonJ30se2tleTondXJsJyx2YWx1ZVR5cGU6J3VybCcsbGFiZWw6J1VSTCd9LHtrZXk6J3RvdGFsQnl0ZXMnLHZhbHVlVHlwZTonYnl0ZXMnLGxhYmVsOidPcmlnaW5hbCd9LHtrZXk6J3dhc3RlZEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonUG90ZW50aWFsIFNhdmluZ3MnfV07cmV0dXJue3dhcm5pbmdzLGl0ZW1zLGhlYWRpbmdzfTt9fQptb2R1bGUuZXhwb3J0cz1Vc2VzT3B0aW1pemVkSW1hZ2VzO30seyIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6M31dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VzZXMtcmVzcG9uc2l2ZS1pbWFnZXMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQnl0ZUVmZmljaWVuY3lBdWRpdD1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCcpO2NvbnN0IFNlbnRyeT1yZXF1aXJlKCcuLi8uLi9saWIvc2VudHJ5Jyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IElHTk9SRV9USFJFU0hPTERfSU5fQllURVM9MjA0ODtjbGFzcyBVc2VzUmVzcG9uc2l2ZUltYWdlcyBleHRlbmRzIEJ5dGVFZmZpY2llbmN5QXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid1c2VzLXJlc3BvbnNpdmUtaW1hZ2VzJyx0aXRsZTonUHJvcGVybHkgc2l6ZSBpbWFnZXMnLHNjb3JlRGlzcGxheU1vZGU6Qnl0ZUVmZmljaWVuY3lBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMsZGVzY3JpcHRpb246J1NlcnZlIGltYWdlcyB0aGF0IGFyZSBhcHByb3ByaWF0ZWx5LXNpemVkIHRvIHNhdmUgY2VsbHVsYXIgZGF0YSAnKydhbmQgaW1wcm92ZSBsb2FkIHRpbWUuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvb3ZlcnNpemVkLWltYWdlcykuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0ltYWdlVXNhZ2UnLCdWaWV3cG9ydERpbWVuc2lvbnMnLCdkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgY29tcHV0ZVdhc3RlKGltYWdlLERQUil7aWYoIWltYWdlLm5ldHdvcmtSZWNvcmQpe3JldHVybiBudWxsO30KY29uc3QgdXJsPVVSTC5lbGlkZURhdGFVUkkoaW1hZ2Uuc3JjKTtjb25zdCBhY3R1YWxQaXhlbHM9aW1hZ2UubmF0dXJhbFdpZHRoKmltYWdlLm5hdHVyYWxIZWlnaHQ7Y29uc3QgdXNlZFBpeGVscz1pbWFnZS5jbGllbnRXaWR0aCppbWFnZS5jbGllbnRIZWlnaHQqTWF0aC5wb3coRFBSLDIpO2NvbnN0IHdhc3RlZFJhdGlvPTEtdXNlZFBpeGVscy9hY3R1YWxQaXhlbHM7Y29uc3QgdG90YWxCeXRlcz1pbWFnZS5uZXR3b3JrUmVjb3JkLnJlc291cmNlU2l6ZTtjb25zdCB3YXN0ZWRCeXRlcz1NYXRoLnJvdW5kKHRvdGFsQnl0ZXMqd2FzdGVkUmF0aW8pO2lmKCF1c2VkUGl4ZWxzKXtyZXR1cm4gbnVsbDt9CmlmKCFOdW1iZXIuaXNGaW5pdGUod2FzdGVkUmF0aW8pKXtyZXR1cm4gbmV3IEVycm9yKGBJbnZhbGlkIGltYWdlIHNpemluZyBpbmZvcm1hdGlvbiAke3VybH1gKTt9CnJldHVybnt1cmwsdG90YWxCeXRlcyx3YXN0ZWRCeXRlcyx3YXN0ZWRQZXJjZW50OjEwMCp3YXN0ZWRSYXRpb307fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyl7Y29uc3QgaW1hZ2VzPWFydGlmYWN0cy5JbWFnZVVzYWdlO2NvbnN0IERQUj1hcnRpZmFjdHMuVmlld3BvcnREaW1lbnNpb25zLmRldmljZVBpeGVsUmF0aW87Y29uc3Qgd2FybmluZ3M9W107Y29uc3QgcmVzdWx0c01hcD1uZXcgTWFwKCk7aW1hZ2VzLmZvckVhY2goaW1hZ2U9PntpZighaW1hZ2UubmV0d29ya1JlY29yZHx8aW1hZ2UubmV0d29ya1JlY29yZC5taW1lVHlwZT09PSdpbWFnZS9zdmcreG1sJyl7cmV0dXJuO30KY29uc3QgcHJvY2Vzc2VkPVVzZXNSZXNwb25zaXZlSW1hZ2VzLmNvbXB1dGVXYXN0ZShpbWFnZSxEUFIpO2lmKCFwcm9jZXNzZWQpcmV0dXJuO2lmKHByb2Nlc3NlZCBpbnN0YW5jZW9mIEVycm9yKXt3YXJuaW5ncy5wdXNoKHByb2Nlc3NlZC5tZXNzYWdlKTtTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihwcm9jZXNzZWQse3RhZ3M6e2F1ZGl0OnRoaXMubWV0YS5pZH0sbGV2ZWw6J3dhcm5pbmcnfSk7cmV0dXJuO30KY29uc3QgZXhpc3Rpbmc9cmVzdWx0c01hcC5nZXQocHJvY2Vzc2VkLnVybCk7aWYoIWV4aXN0aW5nfHxleGlzdGluZy53YXN0ZWRCeXRlcz5wcm9jZXNzZWQud2FzdGVkQnl0ZXMpe3Jlc3VsdHNNYXAuc2V0KHByb2Nlc3NlZC51cmwscHJvY2Vzc2VkKTt9fSk7Y29uc3QgaXRlbXM9QXJyYXkuZnJvbShyZXN1bHRzTWFwLnZhbHVlcygpKS5maWx0ZXIoaXRlbT0+aXRlbS53YXN0ZWRCeXRlcz5JR05PUkVfVEhSRVNIT0xEX0lOX0JZVEVTKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyx2YWx1ZVR5cGU6J3RodW1ibmFpbCcsbGFiZWw6Jyd9LHtrZXk6J3VybCcsdmFsdWVUeXBlOid1cmwnLGxhYmVsOidVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonT3JpZ2luYWwnfSx7a2V5Oid3YXN0ZWRCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J1BvdGVudGlhbCBTYXZpbmdzJ31dO3JldHVybnt3YXJuaW5ncyxpdGVtcyxoZWFkaW5nc307fX0KbW9kdWxlLmV4cG9ydHM9VXNlc1Jlc3BvbnNpdmVJbWFnZXM7fSx7Ii4uLy4uL2xpYi9zZW50cnkiOjQwLCIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuL2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6M31dLCIuLi9hdWRpdHMvYnl0ZS1lZmZpY2llbmN5L3VzZXMtdGV4dC1jb21wcmVzc2lvbiI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBCeXRlRWZmaWNpZW5jeUF1ZGl0PXJlcXVpcmUoJy4vYnl0ZS1lZmZpY2llbmN5LWF1ZGl0Jyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IElHTk9SRV9USFJFU0hPTERfSU5fQllURVM9MTQwMDtjb25zdCBJR05PUkVfVEhSRVNIT0xEX0lOX1BFUkNFTlQ9MC4xO2NsYXNzIFJlc3BvbnNlc0FyZUNvbXByZXNzZWQgZXh0ZW5kcyBCeXRlRWZmaWNpZW5jeUF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondXNlcy10ZXh0LWNvbXByZXNzaW9uJyxzY29yZURpc3BsYXlNb2RlOkJ5dGVFZmZpY2llbmN5QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHRpdGxlOidFbmFibGUgdGV4dCBjb21wcmVzc2lvbicsZGVzY3JpcHRpb246J1RleHQtYmFzZWQgcmVzcG9uc2VzIHNob3VsZCBiZSBzZXJ2ZWQgd2l0aCBjb21wcmVzc2lvbiAoZ3ppcCwgZGVmbGF0ZSBvcicrJyBicm90bGkpIHRvIG1pbmltaXplIHRvdGFsIG5ldHdvcmsgYnl0ZXMuJysnIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvdGV4dC1jb21wcmVzc2lvbikuJyxyZXF1aXJlZEFydGlmYWN0czpbJ1Jlc3BvbnNlQ29tcHJlc3Npb24nLCdkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyl7Y29uc3QgdW5jb21wcmVzc2VkUmVzcG9uc2VzPWFydGlmYWN0cy5SZXNwb25zZUNvbXByZXNzaW9uO2NvbnN0IGl0ZW1zPVtdO3VuY29tcHJlc3NlZFJlc3BvbnNlcy5mb3JFYWNoKHJlY29yZD0+e2lmKCFyZWNvcmQuZ3ppcFNpemV8fHJlY29yZC5nemlwU2l6ZTwwKXJldHVybjtjb25zdCBvcmlnaW5hbFNpemU9cmVjb3JkLnJlc291cmNlU2l6ZTtjb25zdCBnemlwU2l6ZT1yZWNvcmQuZ3ppcFNpemU7Y29uc3QgZ3ppcFNhdmluZ3M9b3JpZ2luYWxTaXplLWd6aXBTaXplO2lmKDEtZ3ppcFNpemUvb3JpZ2luYWxTaXplPElHTk9SRV9USFJFU0hPTERfSU5fUEVSQ0VOVHx8Z3ppcFNhdmluZ3M8SUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFU3x8cmVjb3JkLnRyYW5zZmVyU2l6ZTxnemlwU2l6ZSkKe3JldHVybjt9CmNvbnN0IHVybD1VUkwuZWxpZGVEYXRhVVJJKHJlY29yZC51cmwpO2NvbnN0IGlzRHVwbGljYXRlPWl0ZW1zLmZpbmQoaXRlbT0+aXRlbS51cmw9PT11cmwmJml0ZW0udG90YWxCeXRlcz09PXJlY29yZC5yZXNvdXJjZVNpemUpO2lmKGlzRHVwbGljYXRlKXtyZXR1cm47fQppdGVtcy5wdXNoKHt1cmwsdG90YWxCeXRlczpvcmlnaW5hbFNpemUsd2FzdGVkQnl0ZXM6Z3ppcFNhdmluZ3N9KTt9KTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyx2YWx1ZVR5cGU6J3VybCcsbGFiZWw6J1VuY29tcHJlc3NlZCByZXNvdXJjZSBVUkwnfSx7a2V5Oid0b3RhbEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonT3JpZ2luYWwnfSx7a2V5Oid3YXN0ZWRCeXRlcycsdmFsdWVUeXBlOidieXRlcycsbGFiZWw6J0daSVAgU2F2aW5ncyd9XTtyZXR1cm57aXRlbXMsaGVhZGluZ3N9O319Cm1vZHVsZS5leHBvcnRzPVJlc3BvbnNlc0FyZUNvbXByZXNzZWQ7fSx7Ii4uLy4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4vYnl0ZS1lZmZpY2llbmN5LWF1ZGl0IjozfV0sIi4uL2F1ZGl0cy9ieXRlLWVmZmljaWVuY3kvdXNlcy13ZWJwLWltYWdlcyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBCeXRlRWZmaWNpZW5jeUF1ZGl0PXJlcXVpcmUoJy4vYnl0ZS1lZmZpY2llbmN5LWF1ZGl0Jyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IElHTk9SRV9USFJFU0hPTERfSU5fQllURVM9ODE5MjtjbGFzcyBVc2VzV2ViUEltYWdlcyBleHRlbmRzIEJ5dGVFZmZpY2llbmN5QXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid1c2VzLXdlYnAtaW1hZ2VzJyx0aXRsZTonU2VydmUgaW1hZ2VzIGluIG5leHQtZ2VuIGZvcm1hdHMnLHNjb3JlRGlzcGxheU1vZGU6Qnl0ZUVmZmljaWVuY3lBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMsZGVzY3JpcHRpb246J0ltYWdlIGZvcm1hdHMgbGlrZSBKUEVHIDIwMDAsIEpQRUcgWFIsIGFuZCBXZWJQIG9mdGVuIHByb3ZpZGUgYmV0dGVyICcrJ2NvbXByZXNzaW9uIHRoYW4gUE5HIG9yIEpQRUcsIHdoaWNoIG1lYW5zIGZhc3RlciBkb3dubG9hZHMgYW5kIGxlc3MgZGF0YSBjb25zdW1wdGlvbi4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy93ZWJwKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnT3B0aW1pemVkSW1hZ2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGNvbXB1dGVTYXZpbmdzKGltYWdlKXtjb25zdCBieXRlcz1pbWFnZS5vcmlnaW5hbFNpemUtaW1hZ2Uud2VicFNpemU7Y29uc3QgcGVyY2VudD0xMDAqYnl0ZXMvaW1hZ2Uub3JpZ2luYWxTaXplO3JldHVybntieXRlcyxwZXJjZW50fTt9CnN0YXRpYyBhdWRpdF8oYXJ0aWZhY3RzKXtjb25zdCBpbWFnZXM9YXJ0aWZhY3RzLk9wdGltaXplZEltYWdlcztjb25zdCBpdGVtcz1bXTtjb25zdCB3YXJuaW5ncz1bXTtmb3IoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VzKXtpZihpbWFnZS5mYWlsZWQpe3dhcm5pbmdzLnB1c2goYFVuYWJsZSB0byBkZWNvZGUgJHtVUkwuZ2V0VVJMRGlzcGxheU5hbWUoaW1hZ2UudXJsKX1gKTtjb250aW51ZTt9ZWxzZSBpZihpbWFnZS5vcmlnaW5hbFNpemU8aW1hZ2Uud2VicFNpemUrSUdOT1JFX1RIUkVTSE9MRF9JTl9CWVRFUyl7Y29udGludWU7fQpjb25zdCB1cmw9VVJMLmVsaWRlRGF0YVVSSShpbWFnZS51cmwpO2NvbnN0IHdlYnBTYXZpbmdzPVVzZXNXZWJQSW1hZ2VzLmNvbXB1dGVTYXZpbmdzKGltYWdlKTtpdGVtcy5wdXNoKHt1cmwsZnJvbVByb3RvY29sOmltYWdlLmZyb21Qcm90b2NvbCxpc0Nyb3NzT3JpZ2luOiFpbWFnZS5pc1NhbWVPcmlnaW4sdG90YWxCeXRlczppbWFnZS5vcmlnaW5hbFNpemUsd2FzdGVkQnl0ZXM6d2VicFNhdmluZ3MuYnl0ZXN9KTt9CmNvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLHZhbHVlVHlwZTondGh1bWJuYWlsJyxsYWJlbDonJ30se2tleTondXJsJyx2YWx1ZVR5cGU6J3VybCcsbGFiZWw6J1VSTCd9LHtrZXk6J3RvdGFsQnl0ZXMnLHZhbHVlVHlwZTonYnl0ZXMnLGxhYmVsOidPcmlnaW5hbCd9LHtrZXk6J3dhc3RlZEJ5dGVzJyx2YWx1ZVR5cGU6J2J5dGVzJyxsYWJlbDonUG90ZW50aWFsIFNhdmluZ3MnfV07cmV0dXJue3dhcm5pbmdzLGl0ZW1zLGhlYWRpbmdzfTt9fQptb2R1bGUuZXhwb3J0cz1Vc2VzV2ViUEltYWdlczt9LHsiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjN9XSwiLi4vYXVkaXRzL2NvbnRlbnQtd2lkdGgiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NsYXNzIENvbnRlbnRXaWR0aCBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonY29udGVudC13aWR0aCcsdGl0bGU6J0NvbnRlbnQgaXMgc2l6ZWQgY29ycmVjdGx5IGZvciB0aGUgdmlld3BvcnQnLGZhaWx1cmVUaXRsZTonQ29udGVudCBpcyBub3Qgc2l6ZWQgY29ycmVjdGx5IGZvciB0aGUgdmlld3BvcnQnLGRlc2NyaXB0aW9uOidJZiB0aGUgd2lkdGggb2YgeW91ciBhcHBcJ3MgY29udGVudCBkb2VzblwndCBtYXRjaCB0aGUgd2lkdGggJysnb2YgdGhlIHZpZXdwb3J0LCB5b3VyIGFwcCBtaWdodCBub3QgYmUgb3B0aW1pemVkIGZvciBtb2JpbGUgc2NyZWVucy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9jb250ZW50LXNpemVkLWNvcnJlY3RseS1mb3Itdmlld3BvcnQpLicscmVxdWlyZWRBcnRpZmFjdHM6WydWaWV3cG9ydERpbWVuc2lvbnMnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCB2aWV3cG9ydFdpZHRoPWFydGlmYWN0cy5WaWV3cG9ydERpbWVuc2lvbnMuaW5uZXJXaWR0aDtjb25zdCB3aW5kb3dXaWR0aD1hcnRpZmFjdHMuVmlld3BvcnREaW1lbnNpb25zLm91dGVyV2lkdGg7Y29uc3Qgd2lkdGhzTWF0Y2g9dmlld3BvcnRXaWR0aD09PXdpbmRvd1dpZHRoO3JldHVybntyYXdWYWx1ZTp3aWR0aHNNYXRjaCxleHBsYW5hdGlvbjp0aGlzLmNyZWF0ZUV4cGxhbmF0aW9uKHdpZHRoc01hdGNoLGFydGlmYWN0cy5WaWV3cG9ydERpbWVuc2lvbnMpfTt9CnN0YXRpYyBjcmVhdGVFeHBsYW5hdGlvbihtYXRjaCxhcnRpZmFjdCl7aWYobWF0Y2gpe3JldHVybicnO30KcmV0dXJuJ1RoZSB2aWV3cG9ydCBzaXplIGlzICcrYXJ0aWZhY3QuaW5uZXJXaWR0aCsncHgsICcrJ3doZXJlYXMgdGhlIHdpbmRvdyBzaXplIGlzICcrYXJ0aWZhY3Qub3V0ZXJXaWR0aCsncHguJzt9fQptb2R1bGUuZXhwb3J0cz1Db250ZW50V2lkdGg7fSx7Ii4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL2NyaXRpY2FsLXJlcXVlc3QtY2hhaW5zIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjbGFzcyBDcml0aWNhbFJlcXVlc3RDaGFpbnMgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2NyaXRpY2FsLXJlcXVlc3QtY2hhaW5zJyx0aXRsZTonQ3JpdGljYWwgUmVxdWVzdCBDaGFpbnMnLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5JTkZPUk1BVElWRSxkZXNjcmlwdGlvbjonVGhlIENyaXRpY2FsIFJlcXVlc3QgQ2hhaW5zIGJlbG93IHNob3cgeW91IHdoYXQgcmVzb3VyY2VzIGFyZSAnKydpc3N1ZWQgd2l0aCBhIGhpZ2ggcHJpb3JpdHkuIENvbnNpZGVyIHJlZHVjaW5nICcrJ3RoZSBsZW5ndGggb2YgY2hhaW5zLCByZWR1Y2luZyB0aGUgZG93bmxvYWQgc2l6ZSBvZiByZXNvdXJjZXMsIG9yICcrJ2RlZmVycmluZyB0aGUgZG93bmxvYWQgb2YgdW5uZWNlc3NhcnkgcmVzb3VyY2VzIHRvIGltcHJvdmUgcGFnZSBsb2FkLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2NyaXRpY2FsLXJlcXVlc3QtY2hhaW5zKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJywnVVJMJ119O30Kc3RhdGljIF90cmF2ZXJzZSh0cmVlLGNiKXtmdW5jdGlvbiB3YWxrKG5vZGUsZGVwdGgsc3RhcnRUaW1lLHRyYW5zZmVyU2l6ZT0wKXtjb25zdCBjaGlsZHJlbj1PYmplY3Qua2V5cyhub2RlKTtpZihjaGlsZHJlbi5sZW5ndGg9PT0wKXtyZXR1cm47fQpjaGlsZHJlbi5mb3JFYWNoKGlkPT57Y29uc3QgY2hpbGQ9bm9kZVtpZF07aWYoIXN0YXJ0VGltZSl7c3RhcnRUaW1lPWNoaWxkLnJlcXVlc3Quc3RhcnRUaW1lO30KY2Ioe2RlcHRoLGlkLG5vZGU6Y2hpbGQsY2hhaW5EdXJhdGlvbjooY2hpbGQucmVxdWVzdC5lbmRUaW1lLXN0YXJ0VGltZSkqMTAwMCxjaGFpblRyYW5zZmVyU2l6ZTp0cmFuc2ZlclNpemUrY2hpbGQucmVxdWVzdC50cmFuc2ZlclNpemV9KTt3YWxrKGNoaWxkLmNoaWxkcmVuLGRlcHRoKzEsc3RhcnRUaW1lKTt9LCcnKTt9CndhbGsodHJlZSwwKTt9CnN0YXRpYyBfZ2V0TG9uZ2VzdENoYWluKHRyZWUpe2NvbnN0IGxvbmdlc3Q9e2R1cmF0aW9uOjAsbGVuZ3RoOjAsdHJhbnNmZXJTaXplOjB9O0NyaXRpY2FsUmVxdWVzdENoYWlucy5fdHJhdmVyc2UodHJlZSxvcHRzPT57Y29uc3QgZHVyYXRpb249b3B0cy5jaGFpbkR1cmF0aW9uO2lmKGR1cmF0aW9uPmxvbmdlc3QuZHVyYXRpb24pe2xvbmdlc3QuZHVyYXRpb249ZHVyYXRpb247bG9uZ2VzdC50cmFuc2ZlclNpemU9b3B0cy5jaGFpblRyYW5zZmVyU2l6ZTtsb25nZXN0Lmxlbmd0aD1vcHRzLmRlcHRoO319KTtsb25nZXN0Lmxlbmd0aCsrO3JldHVybiBsb25nZXN0O30Kc3RhdGljIGZsYXR0ZW5SZXF1ZXN0cyh0cmVlKXtjb25zdCBmbGF0dGVuZENoYWlucz17fTtjb25zdCBjaGFpbk1hcD1uZXcgTWFwKCk7ZnVuY3Rpb24gZmxhdHRlbihvcHRzKXtjb25zdCByZXF1ZXN0PW9wdHMubm9kZS5yZXF1ZXN0O2NvbnN0IHNpbXBsZVJlcXVlc3Q9e3VybDpyZXF1ZXN0LnVybCxzdGFydFRpbWU6cmVxdWVzdC5zdGFydFRpbWUsZW5kVGltZTpyZXF1ZXN0LmVuZFRpbWUscmVzcG9uc2VSZWNlaXZlZFRpbWU6cmVxdWVzdC5yZXNwb25zZVJlY2VpdmVkVGltZSx0cmFuc2ZlclNpemU6cmVxdWVzdC50cmFuc2ZlclNpemV9O2xldCBjaGFpbj1jaGFpbk1hcC5nZXQob3B0cy5pZCk7aWYoY2hhaW4pe2NoYWluLnJlcXVlc3Q9c2ltcGxlUmVxdWVzdDt9ZWxzZXtjaGFpbj17cmVxdWVzdDpzaW1wbGVSZXF1ZXN0LGNoaWxkcmVuOnt9fTtmbGF0dGVuZENoYWluc1tvcHRzLmlkXT1jaGFpbjt9CmZvcihjb25zdCBjaGFpbklkIG9mIE9iamVjdC5rZXlzKG9wdHMubm9kZS5jaGlsZHJlbikpe2NvbnN0IGNoaWxkQ2hhaW49e3JlcXVlc3Q6e30sY2hpbGRyZW46e319O2NoYWluTWFwLnNldChjaGFpbklkLGNoaWxkQ2hhaW4pO2NoYWluLmNoaWxkcmVuW2NoYWluSWRdPWNoaWxkQ2hhaW47fQpjaGFpbk1hcC5zZXQob3B0cy5pZCxjaGFpbik7fQpDcml0aWNhbFJlcXVlc3RDaGFpbnMuX3RyYXZlcnNlKHRyZWUsZmxhdHRlbik7cmV0dXJuIGZsYXR0ZW5kQ2hhaW5zO30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IFVSTD1hcnRpZmFjdHMuVVJMO3JldHVybiBhcnRpZmFjdHMucmVxdWVzdENyaXRpY2FsUmVxdWVzdENoYWlucyh7ZGV2dG9vbHNMb2csVVJMfSkudGhlbihjaGFpbnM9PntsZXQgY2hhaW5Db3VudD0wO2Z1bmN0aW9uIHdhbGsobm9kZSxkZXB0aCl7Y29uc3QgY2hpbGRyZW49T2JqZWN0LmtleXMobm9kZSk7aWYoY2hpbGRyZW4ubGVuZ3RoPT09MCl7Y2hhaW5Db3VudCsrO30KY2hpbGRyZW4uZm9yRWFjaChpZD0+e2NvbnN0IGNoaWxkPW5vZGVbaWRdO3dhbGsoY2hpbGQuY2hpbGRyZW4sZGVwdGgrMSk7fSwnJyk7fQpjb25zdCBmbGF0dGVuZWRDaGFpbnM9Q3JpdGljYWxSZXF1ZXN0Q2hhaW5zLmZsYXR0ZW5SZXF1ZXN0cyhjaGFpbnMpO2NvbnN0IGluaXRpYWxOYXZLZXk9T2JqZWN0LmtleXMoZmxhdHRlbmVkQ2hhaW5zKVswXTtjb25zdCBpbml0aWFsTmF2Q2hpbGRyZW49aW5pdGlhbE5hdktleSYmZmxhdHRlbmVkQ2hhaW5zW2luaXRpYWxOYXZLZXldLmNoaWxkcmVuO2lmKGluaXRpYWxOYXZDaGlsZHJlbiYmT2JqZWN0LmtleXMoaW5pdGlhbE5hdkNoaWxkcmVuKS5sZW5ndGg+MCl7d2Fsayhpbml0aWFsTmF2Q2hpbGRyZW4sMCk7fQpjb25zdCBsb25nZXN0Q2hhaW49Q3JpdGljYWxSZXF1ZXN0Q2hhaW5zLl9nZXRMb25nZXN0Q2hhaW4oZmxhdHRlbmVkQ2hhaW5zKTtyZXR1cm57cmF3VmFsdWU6Y2hhaW5Db3VudD09PTAsbm90QXBwbGljYWJsZTpjaGFpbkNvdW50PT09MCxkaXNwbGF5VmFsdWU6Y2hhaW5Db3VudD9gJHtVdGlsLmZvcm1hdE51bWJlcihjaGFpbkNvdW50KX0gY2hhaW5zIGZvdW5kYDonJyxleHRlbmRlZEluZm86e3ZhbHVlOntjaGFpbnM6ZmxhdHRlbmVkQ2hhaW5zLGxvbmdlc3RDaGFpbn19LGRldGFpbHM6e3R5cGU6J2NyaXRpY2FscmVxdWVzdGNoYWluJyxoZWFkZXI6e3R5cGU6J3RleHQnLHRleHQ6J1ZpZXcgY3JpdGljYWwgbmV0d29yayB3YXRlcmZhbGw6J30sY2hhaW5zOmZsYXR0ZW5lZENoYWlucyxsb25nZXN0Q2hhaW59fTt9KTt9fQptb2R1bGUuZXhwb3J0cz1Dcml0aWNhbFJlcXVlc3RDaGFpbnM7fSx7Ii4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwiOjQ4LCIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9kZXByZWNhdGlvbnMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NvbnN0IFV0aWw9cmVxdWlyZSgnLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCcpO2NsYXNzIERlcHJlY2F0aW9ucyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZGVwcmVjYXRpb25zJyx0aXRsZTonQXZvaWRzIGRlcHJlY2F0ZWQgQVBJcycsZmFpbHVyZVRpdGxlOidVc2VzIGRlcHJlY2F0ZWQgQVBJXCdzJyxkZXNjcmlwdGlvbjonRGVwcmVjYXRlZCBBUElzIHdpbGwgZXZlbnR1YWxseSBiZSByZW1vdmVkIGZyb20gdGhlIGJyb3dzZXIuICcrJ1tMZWFybiBtb3JlXShodHRwczovL3d3dy5jaHJvbWVzdGF0dXMuY29tL2ZlYXR1cmVzI2RlcHJlY2F0ZWQpLicscmVxdWlyZWRBcnRpZmFjdHM6WydDaHJvbWVDb25zb2xlTWVzc2FnZXMnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBlbnRyaWVzPWFydGlmYWN0cy5DaHJvbWVDb25zb2xlTWVzc2FnZXM7Y29uc3QgZGVwcmVjYXRpb25zPWVudHJpZXMuZmlsdGVyKGxvZz0+bG9nLmVudHJ5LnNvdXJjZT09PSdkZXByZWNhdGlvbicpLm1hcChsb2c9PntyZXR1cm57dmFsdWU6bG9nLmVudHJ5LnRleHQsdXJsOmxvZy5lbnRyeS51cmx8fCcnLHNvdXJjZTpsb2cuZW50cnkuc291cmNlLGxpbmVOdW1iZXI6bG9nLmVudHJ5LmxpbmVOdW1iZXJ9O30pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid2YWx1ZScsaXRlbVR5cGU6J2NvZGUnLHRleHQ6J0RlcHJlY2F0aW9uIC8gV2FybmluZyd9LHtrZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTonbGluZU51bWJlcicsaXRlbVR5cGU6J3RleHQnLHRleHQ6J0xpbmUnfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLGRlcHJlY2F0aW9ucyk7bGV0IGRpc3BsYXlWYWx1ZT0nJztpZihkZXByZWNhdGlvbnMubGVuZ3RoPjEpe2Rpc3BsYXlWYWx1ZT1gJHtVdGlsLmZvcm1hdE51bWJlcihkZXByZWNhdGlvbnMubGVuZ3RoKX0gd2FybmluZ3MgZm91bmRgO31lbHNlIGlmKGRlcHJlY2F0aW9ucy5sZW5ndGg9PT0xKXtkaXNwbGF5VmFsdWU9YCR7ZGVwcmVjYXRpb25zLmxlbmd0aH0gd2FybmluZyBmb3VuZGA7fQpyZXR1cm57cmF3VmFsdWU6ZGVwcmVjYXRpb25zLmxlbmd0aD09PTAsZGlzcGxheVZhbHVlLGV4dGVuZGVkSW5mbzp7dmFsdWU6ZGVwcmVjYXRpb25zfSxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1EZXByZWNhdGlvbnM7fSx7Ii4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwiOjQ4LCIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9kb2JldHRlcndlYi9hcHBjYWNoZS1tYW5pZmVzdCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIEFwcENhY2hlTWFuaWZlc3RBdHRyIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidhcHBjYWNoZS1tYW5pZmVzdCcsdGl0bGU6J0F2b2lkcyBBcHBsaWNhdGlvbiBDYWNoZScsZmFpbHVyZVRpdGxlOidVc2VzIEFwcGxpY2F0aW9uIENhY2hlJyxkZXNjcmlwdGlvbjonQXBwbGljYXRpb24gQ2FjaGUgaXMgZGVwcmVjYXRlZC4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9hcHBjYWNoZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0FwcENhY2hlTWFuaWZlc3QnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCB1c2luZ0FwcGNhY2hlPWFydGlmYWN0cy5BcHBDYWNoZU1hbmlmZXN0IT09bnVsbDtjb25zdCBkaXNwbGF5VmFsdWU9dXNpbmdBcHBjYWNoZT9gRm91bmQgIiR7YXJ0aWZhY3RzLkFwcENhY2hlTWFuaWZlc3R9ImA6Jyc7cmV0dXJue3Jhd1ZhbHVlOiF1c2luZ0FwcGNhY2hlLGRpc3BsYXlWYWx1ZX07fX0KbW9kdWxlLmV4cG9ydHM9QXBwQ2FjaGVNYW5pZmVzdEF0dHI7fSx7Ii4uL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9kb2JldHRlcndlYi9kb2N0eXBlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y2xhc3MgRG9jdHlwZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZG9jdHlwZScsdGl0bGU6J1BhZ2UgaGFzIHRoZSBIVE1MIGRvY3R5cGUnLGZhaWx1cmVUaXRsZTonUGFnZSBpcyBtaXNzaW5nIHRoZSBIVE1MIGRvY3R5cGUnLGRlc2NyaXB0aW9uOidTcGVjaWZ5aW5nIGEgZG9jdHlwZSBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHN3aXRjaGluZyB0byBxdWlya3MtbW9kZS4nKydSZWFkIG1vcmUgb24gdGhlICcrJ1tNRE4gV2ViIERvY3MgcGFnZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9Eb2N0eXBlKScscmVxdWlyZWRBcnRpZmFjdHM6WydEb2N0eXBlJ119O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7aWYoIWFydGlmYWN0cy5Eb2N0eXBlKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZXhwbGFuYXRpb246J0RvY3VtZW50IG11c3QgY29udGFpbiBhIGRvY3R5cGUnfTt9CmNvbnN0IGRvY3R5cGVOYW1lPWFydGlmYWN0cy5Eb2N0eXBlLm5hbWUudHJpbSgpO2NvbnN0IGRvY3R5cGVQdWJsaWNJZD1hcnRpZmFjdHMuRG9jdHlwZS5wdWJsaWNJZDtjb25zdCBkb2N0eXBlU3lzdGVtSWQ9YXJ0aWZhY3RzLkRvY3R5cGUuc3lzdGVtSWQ7aWYoZG9jdHlwZVB1YmxpY0lkIT09Jycpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjonRXhwZWN0ZWQgcHVibGljSWQgdG8gYmUgYW4gZW1wdHkgc3RyaW5nJ307fQppZihkb2N0eXBlU3lzdGVtSWQhPT0nJyl7cmV0dXJue3Jhd1ZhbHVlOmZhbHNlLGV4cGxhbmF0aW9uOidFeHBlY3RlZCBzeXN0ZW1JZCB0byBiZSBhbiBlbXB0eSBzdHJpbmcnfTt9CmlmKGRvY3R5cGVOYW1lPT09J2h0bWwnKXtyZXR1cm57cmF3VmFsdWU6dHJ1ZX07fWVsc2V7cmV0dXJue3Jhd1ZhbHVlOmZhbHNlLGV4cGxhbmF0aW9uOidEb2N0eXBlIG5hbWUgbXVzdCBiZSB0aGUgbG93ZXJjYXNlIHN0cmluZyBgaHRtbGAnfTt9fX0KbW9kdWxlLmV4cG9ydHM9RG9jdHlwZTt9LHsiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL2RvYmV0dGVyd2ViL2RvbS1zaXplIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgVXRpbD1yZXF1aXJlKCcuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsLmpzJyk7Y29uc3QgTUFYX0RPTV9OT0RFUz0xNTAwO2NvbnN0IE1BWF9ET01fVFJFRV9XSURUSD02MDtjb25zdCBNQVhfRE9NX1RSRUVfREVQVEg9MzI7Y2xhc3MgRE9NU2l6ZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgTUFYX0RPTV9OT0RFUygpe3JldHVybiBNQVhfRE9NX05PREVTO30Kc3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidkb20tc2l6ZScsdGl0bGU6J0F2b2lkcyBhbiBleGNlc3NpdmUgRE9NIHNpemUnLGZhaWx1cmVUaXRsZTonVXNlcyBhbiBleGNlc3NpdmUgRE9NIHNpemUnLGRlc2NyaXB0aW9uOidCcm93c2VyIGVuZ2luZWVycyByZWNvbW1lbmQgcGFnZXMgY29udGFpbiBmZXdlciB0aGFuICcrYH4ke1V0aWwuZm9ybWF0TnVtYmVyKERPTVNpemUuTUFYX0RPTV9OT0RFUyl9IERPTSBub2Rlcy4gVGhlIHN3ZWV0IHNwb3QgaXMgYSB0cmVlIGArYGRlcHRoIDwgJHtNQVhfRE9NX1RSRUVfREVQVEh9IGVsZW1lbnRzIGFuZCBmZXdlciB0aGFuICR7TUFYX0RPTV9UUkVFX1dJRFRIfSBgKydjaGlsZHJlbi9wYXJlbnQgZWxlbWVudC4gQSBsYXJnZSBET00gY2FuIGluY3JlYXNlIG1lbW9yeSB1c2FnZSwgY2F1c2UgbG9uZ2VyICcrJ1tzdHlsZSBjYWxjdWxhdGlvbnNdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvcGVyZm9ybWFuY2UvcmVuZGVyaW5nL3JlZHVjZS10aGUtc2NvcGUtYW5kLWNvbXBsZXhpdHktb2Ytc3R5bGUtY2FsY3VsYXRpb25zKSwgJysnYW5kIHByb2R1Y2UgY29zdGx5IFtsYXlvdXQgcmVmbG93c10oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvYXJ0aWNsZXMvcmVmbG93KS4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9kb20tc2l6ZSkuJyxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxyZXF1aXJlZEFydGlmYWN0czpbJ0RPTVN0YXRzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6NzAwLHNjb3JlTWVkaWFuOjE0MDB9O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCBzdGF0cz1hcnRpZmFjdHMuRE9NU3RhdHM7Y29uc3Qgc2NvcmU9QXVkaXQuY29tcHV0ZUxvZ05vcm1hbFNjb3JlKHN0YXRzLnRvdGFsRE9NTm9kZXMsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid0b3RhbE5vZGVzJyxpdGVtVHlwZTondGV4dCcsdGV4dDonVG90YWwgRE9NIE5vZGVzJ30se2tleTonZGVwdGgnLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidNYXhpbXVtIERPTSBEZXB0aCd9LHtrZXk6J3dpZHRoJyxpdGVtVHlwZTondGV4dCcsdGV4dDonTWF4aW11bSBDaGlsZHJlbid9XTtjb25zdCBpdGVtcz1be3RvdGFsTm9kZXM6VXRpbC5mb3JtYXROdW1iZXIoc3RhdHMudG90YWxET01Ob2RlcyksZGVwdGg6VXRpbC5mb3JtYXROdW1iZXIoc3RhdHMuZGVwdGgubWF4KSx3aWR0aDpVdGlsLmZvcm1hdE51bWJlcihzdGF0cy53aWR0aC5tYXgpfSx7dG90YWxOb2RlczonJyxkZXB0aDp7dHlwZTonY29kZScsdmFsdWU6c3RhdHMuZGVwdGguc25pcHBldH0sd2lkdGg6e3R5cGU6J2NvZGUnLHZhbHVlOnN0YXRzLndpZHRoLnNuaXBwZXR9fV07cmV0dXJue3Njb3JlLHJhd1ZhbHVlOnN0YXRzLnRvdGFsRE9NTm9kZXMsZGlzcGxheVZhbHVlOlsnJWQgbm9kZXMnLHN0YXRzLnRvdGFsRE9NTm9kZXNdLGV4dGVuZGVkSW5mbzp7dmFsdWU6aXRlbXN9LGRldGFpbHM6QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxpdGVtcyl9O319Cm1vZHVsZS5leHBvcnRzPURPTVNpemU7fSx7Ii4uLy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwuanMiOjQ4LCIuLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvZG9iZXR0ZXJ3ZWIvZXh0ZXJuYWwtYW5jaG9ycy11c2UtcmVsLW5vb3BlbmVyIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi8uLi9saWIvdXJsLXNoaW0nKTtjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIEV4dGVybmFsQW5jaG9yc1VzZVJlbE5vb3BlbmVyQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2V4dGVybmFsLWFuY2hvcnMtdXNlLXJlbC1ub29wZW5lcicsdGl0bGU6J0xpbmtzIHRvIGNyb3NzLW9yaWdpbiBkZXN0aW5hdGlvbnMgYXJlIHNhZmUnLGZhaWx1cmVUaXRsZTonTGlua3MgdG8gY3Jvc3Mtb3JpZ2luIGRlc3RpbmF0aW9ucyBhcmUgdW5zYWZlJyxkZXNjcmlwdGlvbjonQWRkIGByZWw9Im5vb3BlbmVyImAgb3IgYHJlbD0ibm9yZWZlcnJlciJgIHRvIGFueSBleHRlcm5hbCBsaW5rcyB0byBpbXByb3ZlICcrJ3BlcmZvcm1hbmNlIGFuZCBwcmV2ZW50IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9ub29wZW5lcikuJyxyZXF1aXJlZEFydGlmYWN0czpbJ1VSTCcsJ0FuY2hvcnNXaXRoTm9SZWxOb29wZW5lciddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IHdhcm5pbmdzPVtdO2NvbnN0IHBhZ2VIb3N0PW5ldyBVUkwoYXJ0aWZhY3RzLlVSTC5maW5hbFVybCkuaG9zdDtjb25zdCBmYWlsaW5nQW5jaG9ycz1hcnRpZmFjdHMuQW5jaG9yc1dpdGhOb1JlbE5vb3BlbmVyLmZpbHRlcihhbmNob3I9Pnt0cnl7cmV0dXJuIG5ldyBVUkwoYW5jaG9yLmhyZWYpLmhvc3QhPT1wYWdlSG9zdDt9Y2F0Y2goZXJyKXt3YXJuaW5ncy5wdXNoKCdVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb3IgYW5jaG9yIHRhZy4gJysnSWYgbm90IHVzZWQgYXMgYSBoeXBlcmxpbmssIGNvbnNpZGVyIHJlbW92aW5nIHRhcmdldD1fYmxhbmsuJyk7cmV0dXJuIHRydWU7fX0pLmZpbHRlcihhbmNob3I9PntyZXR1cm4hYW5jaG9yLmhyZWZ8fGFuY2hvci5ocmVmLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpO30pLm1hcChhbmNob3I9PntyZXR1cm57aHJlZjphbmNob3IuaHJlZnx8J1Vua25vd24nLHRhcmdldDphbmNob3IudGFyZ2V0fHwnJyxyZWw6YW5jaG9yLnJlbHx8JycsdXJsOic8YScrKGFuY2hvci5ocmVmP2AgaHJlZj0iJHthbmNob3IuaHJlZn0iYDonJykrKGFuY2hvci50YXJnZXQ/YCB0YXJnZXQ9IiR7YW5jaG9yLnRhcmdldH0iYDonJykrKGFuY2hvci5yZWw/YCByZWw9IiR7YW5jaG9yLnJlbH0iYDonJykrJz4nfTt9KTtjb25zdCBoZWFkaW5ncz1be2tleTonaHJlZicsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTondGFyZ2V0JyxpdGVtVHlwZTondGV4dCcsdGV4dDonVGFyZ2V0J30se2tleToncmVsJyxpdGVtVHlwZTondGV4dCcsdGV4dDonUmVsJ31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxmYWlsaW5nQW5jaG9ycyk7cmV0dXJue3Jhd1ZhbHVlOmZhaWxpbmdBbmNob3JzLmxlbmd0aD09PTAsZXh0ZW5kZWRJbmZvOnt2YWx1ZTpmYWlsaW5nQW5jaG9yc30sZGV0YWlscyx3YXJuaW5nc307fX0KbW9kdWxlLmV4cG9ydHM9RXh0ZXJuYWxBbmNob3JzVXNlUmVsTm9vcGVuZXJBdWRpdDt9LHsiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL2RvYmV0dGVyd2ViL2dlb2xvY2F0aW9uLW9uLXN0YXJ0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFZpb2xhdGlvbkF1ZGl0PXJlcXVpcmUoJy4uL3Zpb2xhdGlvbi1hdWRpdCcpO2NsYXNzIEdlb2xvY2F0aW9uT25TdGFydCBleHRlbmRzIFZpb2xhdGlvbkF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZ2VvbG9jYXRpb24tb24tc3RhcnQnLHRpdGxlOidBdm9pZHMgcmVxdWVzdGluZyB0aGUgZ2VvbG9jYXRpb24gcGVybWlzc2lvbiBvbiBwYWdlIGxvYWQnLGZhaWx1cmVUaXRsZTonUmVxdWVzdHMgdGhlIGdlb2xvY2F0aW9uIHBlcm1pc3Npb24gb24gcGFnZSBsb2FkJyxkZXNjcmlwdGlvbjonVXNlcnMgYXJlIG1pc3RydXN0ZnVsIG9mIG9yIGNvbmZ1c2VkIGJ5IHNpdGVzIHRoYXQgcmVxdWVzdCB0aGVpciAnKydsb2NhdGlvbiB3aXRob3V0IGNvbnRleHQuIENvbnNpZGVyIHR5aW5nIHRoZSByZXF1ZXN0IHRvIHVzZXIgZ2VzdHVyZXMgaW5zdGVhZC4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9nZW9sb2NhdGlvbi1vbi1sb2FkKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQ2hyb21lQ29uc29sZU1lc3NhZ2VzJ119O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgcmVzdWx0cz1WaW9sYXRpb25BdWRpdC5nZXRWaW9sYXRpb25SZXN1bHRzKGFydGlmYWN0cywvZ2VvbG9jYXRpb24vKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyxpdGVtVHlwZTondXJsJyx0ZXh0OidVUkwnfSx7a2V5OidsYWJlbCcsaXRlbVR5cGU6J3RleHQnLHRleHQ6J0xvY2F0aW9uJ31dO2NvbnN0IGRldGFpbHM9VmlvbGF0aW9uQXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxyZXN1bHRzKTtyZXR1cm57cmF3VmFsdWU6cmVzdWx0cy5sZW5ndGg9PT0wLGV4dGVuZGVkSW5mbzp7dmFsdWU6cmVzdWx0c30sZGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9R2VvbG9jYXRpb25PblN0YXJ0O30seyIuLi92aW9sYXRpb24tYXVkaXQiOjZ9XSwiLi4vYXVkaXRzL2RvYmV0dGVyd2ViL25vLWRvY3VtZW50LXdyaXRlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFZpb2xhdGlvbkF1ZGl0PXJlcXVpcmUoJy4uL3Zpb2xhdGlvbi1hdWRpdCcpO2NsYXNzIE5vRG9jV3JpdGVBdWRpdCBleHRlbmRzIFZpb2xhdGlvbkF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonbm8tZG9jdW1lbnQtd3JpdGUnLHRpdGxlOidBdm9pZHMgYGRvY3VtZW50LndyaXRlKClgJyxmYWlsdXJlVGl0bGU6J1VzZXMgYGRvY3VtZW50LndyaXRlKClgJyxkZXNjcmlwdGlvbjonRm9yIHVzZXJzIG9uIHNsb3cgY29ubmVjdGlvbnMsIGV4dGVybmFsIHNjcmlwdHMgZHluYW1pY2FsbHkgaW5qZWN0ZWQgdmlhICcrJ2Bkb2N1bWVudC53cml0ZSgpYCBjYW4gZGVsYXkgcGFnZSBsb2FkIGJ5IHRlbnMgb2Ygc2Vjb25kcy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9kb2N1bWVudC13cml0ZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0Nocm9tZUNvbnNvbGVNZXNzYWdlcyddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IHJlc3VsdHM9VmlvbGF0aW9uQXVkaXQuZ2V0VmlvbGF0aW9uUmVzdWx0cyhhcnRpZmFjdHMsL2RvY3VtZW50XC53cml0ZS8pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLGl0ZW1UeXBlOid1cmwnLHRleHQ6J1VSTCd9LHtrZXk6J2xhYmVsJyxpdGVtVHlwZTondGV4dCcsdGV4dDonTG9jYXRpb24nfV07Y29uc3QgZGV0YWlscz1WaW9sYXRpb25BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHJlc3VsdHMpO3JldHVybntyYXdWYWx1ZTpyZXN1bHRzLmxlbmd0aD09PTAsZXh0ZW5kZWRJbmZvOnt2YWx1ZTpyZXN1bHRzfSxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1Ob0RvY1dyaXRlQXVkaXQ7fSx7Ii4uL3Zpb2xhdGlvbi1hdWRpdCI6Nn1dLCIuLi9hdWRpdHMvZG9iZXR0ZXJ3ZWIvbm8tdnVsbmVyYWJsZS1saWJyYXJpZXMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBTZW50cnk9cmVxdWlyZSgnLi4vLi4vbGliL3NlbnRyeScpO2NvbnN0IHNlbXZlcj1yZXF1aXJlKCdzZW12ZXInKTtjb25zdCBzbnlrRGF0YWJhc2U9cmVxdWlyZSgnLi4vLi4vLi4vdGhpcmQtcGFydHkvc255ay9zbmFwc2hvdC5qc29uJyk7Y29uc3QgU0VNVkVSX1JFR0VYPS9eKFxkK1wuXGQrXC5cZCspW14tMC05XSsvO2NsYXNzIE5vVnVsbmVyYWJsZUxpYnJhcmllc0F1ZGl0IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOiduby12dWxuZXJhYmxlLWxpYnJhcmllcycsdGl0bGU6J0F2b2lkcyBmcm9udC1lbmQgSmF2YVNjcmlwdCBsaWJyYXJpZXMnKycgd2l0aCBrbm93biBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMnLGZhaWx1cmVUaXRsZTonSW5jbHVkZXMgZnJvbnQtZW5kIEphdmFTY3JpcHQgbGlicmFyaWVzJysnIHdpdGgga25vd24gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzJyxkZXNjcmlwdGlvbjonU29tZSB0aGlyZC1wYXJ0eSBzY3JpcHRzIG1heSBjb250YWluIGtub3duIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyAnKyd0aGF0IGFyZSBlYXNpbHkgaWRlbnRpZmllZCBhbmQgZXhwbG9pdGVkIGJ5IGF0dGFja2Vycy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy92dWxuZXJhYmlsaXRpZXMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydKU0xpYnJhcmllcyddfTt9CnN0YXRpYyBnZXQgc255a0RCKCl7cmV0dXJuIHNueWtEYXRhYmFzZTt9CnN0YXRpYyBnZXQgc2V2ZXJpdHlNYXAoKXtyZXR1cm57aGlnaDozLG1lZGl1bToyLGxvdzoxfTt9CnN0YXRpYyBub3JtYWxpemVWZXJzaW9uKHZlcnNpb24pe2lmKCF2ZXJzaW9uKXJldHVybiB2ZXJzaW9uO2lmKHNlbXZlci52YWxpZCh2ZXJzaW9uKSlyZXR1cm4gdmVyc2lvbjtpZigvXlxkK1wuXGQrJC8udGVzdCh2ZXJzaW9uKSlyZXR1cm5gJHt2ZXJzaW9ufS4wYDtjb25zdCB2ZXJzaW9uTWF0Y2g9dmVyc2lvbi5tYXRjaChTRU1WRVJfUkVHRVgpO2lmKHZlcnNpb25NYXRjaClyZXR1cm4gdmVyc2lvbk1hdGNoWzFdO3JldHVybiB2ZXJzaW9uO30Kc3RhdGljIGdldFZ1bG5lcmFiaWxpdGllcyhub3JtYWxpemVkVmVyc2lvbixsaWIpe2NvbnN0IHNueWtEQj1Ob1Z1bG5lcmFibGVMaWJyYXJpZXNBdWRpdC5zbnlrREI7aWYoIWxpYi5ucG1Qa2dOYW1lfHwhc255a0RCLm5wbVtsaWIubnBtUGtnTmFtZV0pe3JldHVybltdO30KdHJ5e3NlbXZlci5zYXRpc2ZpZXMobm9ybWFsaXplZFZlcnNpb24sJyonKTt9Y2F0Y2goZXJyKXtlcnIucGtnTmFtZT1saWIubnBtUGtnTmFtZTtTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnIse2xldmVsOid3YXJuaW5nJ30pO3JldHVybltdO30KY29uc3Qgc255a0luZm89c255a0RCLm5wbVtsaWIubnBtUGtnTmFtZV07Y29uc3QgdnVsbnM9c255a0luZm8uZmlsdGVyKHZ1bG49PnNlbXZlci5zYXRpc2ZpZXMobm9ybWFsaXplZFZlcnNpb24sdnVsbi5zZW12ZXIudnVsbmVyYWJsZVswXSkpLm1hcCh2dWxuPT57cmV0dXJue3NldmVyaXR5OnZ1bG4uc2V2ZXJpdHksbnVtZXJpY1NldmVyaXR5OnRoaXMuc2V2ZXJpdHlNYXBbdnVsbi5zZXZlcml0eV0sbGlicmFyeTpgJHtsaWIubmFtZX1AJHtub3JtYWxpemVkVmVyc2lvbn1gLHVybDonaHR0cHM6Ly9zbnlrLmlvL3Z1bG4vJyt2dWxuLmlkfTt9KTtyZXR1cm4gdnVsbnM7fQpzdGF0aWMgaGlnaGVzdFNldmVyaXR5KHZ1bG5lcmFiaWxpdGllcyl7Y29uc3Qgc29ydGVkVnVsbnM9dnVsbmVyYWJpbGl0aWVzLnNvcnQoKGEsYik9PmIubnVtZXJpY1NldmVyaXR5LWEubnVtZXJpY1NldmVyaXR5KTtyZXR1cm4gc29ydGVkVnVsbnNbMF0uc2V2ZXJpdHk7fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBmb3VuZExpYnJhcmllcz1hcnRpZmFjdHMuSlNMaWJyYXJpZXM7aWYoIWZvdW5kTGlicmFyaWVzLmxlbmd0aCl7cmV0dXJue3Jhd1ZhbHVlOnRydWV9O30KbGV0IHRvdGFsVnVsbnM9MDtjb25zdCB2dWxuZXJhYmlsaXR5UmVzdWx0cz1bXTtjb25zdCBsaWJyYXJ5VnVsbnM9Zm91bmRMaWJyYXJpZXMubWFwKGxpYj0+e2NvbnN0IHZlcnNpb249dGhpcy5ub3JtYWxpemVWZXJzaW9uKGxpYi52ZXJzaW9uKXx8Jyc7Y29uc3QgdnVsbnM9dGhpcy5nZXRWdWxuZXJhYmlsaXRpZXModmVyc2lvbixsaWIpO2NvbnN0IHZ1bG5Db3VudD12dWxucy5sZW5ndGg7dG90YWxWdWxucys9dnVsbkNvdW50O2xldCBoaWdoZXN0U2V2ZXJpdHk7aWYodnVsbnMubGVuZ3RoPjApe2hpZ2hlc3RTZXZlcml0eT10aGlzLmhpZ2hlc3RTZXZlcml0eSh2dWxucykucmVwbGFjZSgvXlx3LyxsPT5sLnRvVXBwZXJDYXNlKCkpO3Z1bG5lcmFiaWxpdHlSZXN1bHRzLnB1c2goe2hpZ2hlc3RTZXZlcml0eSx2dWxuQ291bnQsZGV0ZWN0ZWRMaWI6e3RleHQ6bGliLm5hbWUrJ0AnK3ZlcnNpb24sdXJsOmBodHRwczovL3NueWsuaW8vdnVsbi9ucG06JHtsaWIubnBtUGtnTmFtZX0/bGhAJHt2ZXJzaW9ufWAsdHlwZTonbGluayd9fSk7fQpyZXR1cm57bmFtZTpsaWIubmFtZSxucG1Qa2dOYW1lOmxpYi5ucG1Qa2dOYW1lLHZlcnNpb24sdnVsbnMsaGlnaGVzdFNldmVyaXR5fTt9KTtsZXQgZGlzcGxheVZhbHVlPScnO2lmKHRvdGFsVnVsbnM+MSl7ZGlzcGxheVZhbHVlPWAke3RvdGFsVnVsbnN9IHZ1bG5lcmFiaWxpdGllcyBkZXRlY3RlZGA7fWVsc2UgaWYodG90YWxWdWxucz09PTEpe2Rpc3BsYXlWYWx1ZT1gJHt0b3RhbFZ1bG5zfSB2dWxuZXJhYmlsaXR5IGRldGVjdGVkYDt9CmNvbnN0IGhlYWRpbmdzPVt7a2V5OidkZXRlY3RlZExpYicsaXRlbVR5cGU6J2xpbmsnLHRleHQ6J0xpYnJhcnkgVmVyc2lvbid9LHtrZXk6J3Z1bG5Db3VudCcsaXRlbVR5cGU6J3RleHQnLHRleHQ6J1Z1bG5lcmFiaWxpdHkgQ291bnQnfSx7a2V5OidoaWdoZXN0U2V2ZXJpdHknLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidIaWdoZXN0IFNldmVyaXR5J31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyx2dWxuZXJhYmlsaXR5UmVzdWx0cyx7fSk7cmV0dXJue3Jhd1ZhbHVlOnRvdGFsVnVsbnM9PT0wLGRpc3BsYXlWYWx1ZSxleHRlbmRlZEluZm86e2pzTGliczpsaWJyYXJ5VnVsbnMsdnVsbmVyYWJpbGl0aWVzOnZ1bG5lcmFiaWxpdHlSZXN1bHRzfSxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1Ob1Z1bG5lcmFibGVMaWJyYXJpZXNBdWRpdDt9LHsiLi4vLi4vLi4vdGhpcmQtcGFydHkvc255ay9zbmFwc2hvdC5qc29uIjoxMzcsIi4uLy4uL2xpYi9zZW50cnkiOjQwLCIuLi9hdWRpdCI6Miwic2VtdmVyIjoxMzJ9XSwiLi4vYXVkaXRzL2RvYmV0dGVyd2ViL25vLXdlYnNxbCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIE5vV2ViU1FMQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J25vLXdlYnNxbCcsdGl0bGU6J0F2b2lkcyBXZWJTUUwgREInLGZhaWx1cmVUaXRsZTonVXNlcyBXZWJTUUwgREInLGRlc2NyaXB0aW9uOidXZWIgU1FMIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHVzaW5nIEluZGV4ZWREQiBpbnN0ZWFkLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL3dlYi1zcWwpLicscmVxdWlyZWRBcnRpZmFjdHM6WydXZWJTUUwnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBkYj1hcnRpZmFjdHMuV2ViU1FMO2NvbnN0IGRpc3BsYXlWYWx1ZT1kYj9gRm91bmQgIiR7ZGIubmFtZX0iICh2JHtkYi52ZXJzaW9ufSlgOicnO3JldHVybntyYXdWYWx1ZTohZGIsZGlzcGxheVZhbHVlfTt9fQptb2R1bGUuZXhwb3J0cz1Ob1dlYlNRTEF1ZGl0O30seyIuLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvZG9iZXR0ZXJ3ZWIvbm90aWZpY2F0aW9uLW9uLXN0YXJ0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFZpb2xhdGlvbkF1ZGl0PXJlcXVpcmUoJy4uL3Zpb2xhdGlvbi1hdWRpdCcpO2NsYXNzIE5vdGlmaWNhdGlvbk9uU3RhcnQgZXh0ZW5kcyBWaW9sYXRpb25BdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J25vdGlmaWNhdGlvbi1vbi1zdGFydCcsdGl0bGU6J0F2b2lkcyByZXF1ZXN0aW5nIHRoZSBub3RpZmljYXRpb24gcGVybWlzc2lvbiBvbiBwYWdlIGxvYWQnLGZhaWx1cmVUaXRsZTonUmVxdWVzdHMgdGhlIG5vdGlmaWNhdGlvbiBwZXJtaXNzaW9uIG9uIHBhZ2UgbG9hZCcsZGVzY3JpcHRpb246J1VzZXJzIGFyZSBtaXN0cnVzdGZ1bCBvZiBvciBjb25mdXNlZCBieSBzaXRlcyB0aGF0IHJlcXVlc3QgdG8gc2VuZCAnKydub3RpZmljYXRpb25zIHdpdGhvdXQgY29udGV4dC4gQ29uc2lkZXIgdHlpbmcgdGhlIHJlcXVlc3QgdG8gdXNlciBnZXN0dXJlcyAnKydpbnN0ZWFkLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL25vdGlmaWNhdGlvbnMtb24tbG9hZCkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0Nocm9tZUNvbnNvbGVNZXNzYWdlcyddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IHJlc3VsdHM9VmlvbGF0aW9uQXVkaXQuZ2V0VmlvbGF0aW9uUmVzdWx0cyhhcnRpZmFjdHMsL25vdGlmaWNhdGlvbiBwZXJtaXNzaW9uLyk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTonbGFiZWwnLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidMb2NhdGlvbid9XTtjb25zdCBkZXRhaWxzPVZpb2xhdGlvbkF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyk7cmV0dXJue3Jhd1ZhbHVlOnJlc3VsdHMubGVuZ3RoPT09MCxleHRlbmRlZEluZm86e3ZhbHVlOnJlc3VsdHN9LGRldGFpbHN9O319Cm1vZHVsZS5leHBvcnRzPU5vdGlmaWNhdGlvbk9uU3RhcnQ7fSx7Ii4uL3Zpb2xhdGlvbi1hdWRpdCI6Nn1dLCIuLi9hdWRpdHMvZG9iZXR0ZXJ3ZWIvcGFzc3dvcmQtaW5wdXRzLWNhbi1iZS1wYXN0ZWQtaW50byI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIFBhc3N3b3JkSW5wdXRzQ2FuQmVQYXN0ZWRJbnRvQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3Bhc3N3b3JkLWlucHV0cy1jYW4tYmUtcGFzdGVkLWludG8nLHRpdGxlOidBbGxvd3MgdXNlcnMgdG8gcGFzdGUgaW50byBwYXNzd29yZCBmaWVsZHMnLGZhaWx1cmVUaXRsZTonUHJldmVudHMgdXNlcnMgdG8gcGFzdGUgaW50byBwYXNzd29yZCBmaWVsZHMnLGRlc2NyaXB0aW9uOidQcmV2ZW50aW5nIHBhc3N3b3JkIHBhc3RpbmcgdW5kZXJtaW5lcyBnb29kIHNlY3VyaXR5IHBvbGljeS4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9wYXNzd29yZC1wYXN0aW5nKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnUGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGUnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBwYXNzd29yZElucHV0c1dpdGhQcmV2ZW50ZWRQYXN0ZT1hcnRpZmFjdHMuUGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGU7Y29uc3QgaXRlbXM9W107cGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGUuZm9yRWFjaChpbnB1dD0+e2l0ZW1zLnB1c2goe25vZGU6e3R5cGU6J25vZGUnLHNuaXBwZXQ6aW5wdXQuc25pcHBldH19KTt9KTtjb25zdCBoZWFkaW5ncz1be2tleTonbm9kZScsaXRlbVR5cGU6J25vZGUnLHRleHQ6J0ZhaWxpbmcgRWxlbWVudHMnfV07cmV0dXJue3Jhd1ZhbHVlOnBhc3N3b3JkSW5wdXRzV2l0aFByZXZlbnRlZFBhc3RlLmxlbmd0aD09PTAsZXh0ZW5kZWRJbmZvOnt2YWx1ZTpwYXNzd29yZElucHV0c1dpdGhQcmV2ZW50ZWRQYXN0ZX0sZGV0YWlsczpBdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLGl0ZW1zKX07fX0KbW9kdWxlLmV4cG9ydHM9UGFzc3dvcmRJbnB1dHNDYW5CZVBhc3RlZEludG9BdWRpdDt9LHsiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL2RvYmV0dGVyd2ViL3VzZXMtaHR0cDIiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgVXRpbD1yZXF1aXJlKCcuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsLmpzJyk7Y2xhc3MgVXNlc0hUVFAyQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VzZXMtaHR0cDInLHRpdGxlOidVc2VzIEhUVFAvMiBmb3IgaXRzIG93biByZXNvdXJjZXMnLGZhaWx1cmVUaXRsZTonRG9lcyBub3QgdXNlIEhUVFAvMiBmb3IgYWxsIG9mIGl0cyByZXNvdXJjZXMnLGRlc2NyaXB0aW9uOidIVFRQLzIgb2ZmZXJzIG1hbnkgYmVuZWZpdHMgb3ZlciBIVFRQLzEuMSwgaW5jbHVkaW5nIGJpbmFyeSBoZWFkZXJzLCAnKydtdWx0aXBsZXhpbmcsIGFuZCBzZXJ2ZXIgcHVzaC4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9odHRwMikuJyxyZXF1aXJlZEFydGlmYWN0czpbJ1VSTCcsJ2RldnRvb2xzTG9ncyddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGRldnRvb2xzTG9ncz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2dzKS50aGVuKG5ldHdvcmtSZWNvcmRzPT57Y29uc3QgZmluYWxIb3N0PW5ldyBVUkwoYXJ0aWZhY3RzLlVSTC5maW5hbFVybCkuaG9zdDtjb25zdCBzZWVuVVJMcz1uZXcgU2V0KCk7Y29uc3QgcmVzb3VyY2VzPW5ldHdvcmtSZWNvcmRzLmZpbHRlcihyZWNvcmQ9Pntjb25zdCBpc09sZEh0dHA9L0hUVFBcL1swMV1bLlxkXT8vaS50ZXN0KHJlY29yZC5wcm90b2NvbCk7aWYoIWlzT2xkSHR0cClyZXR1cm4gZmFsc2U7Y29uc3QgcmVxdWVzdEhvc3Q9bmV3IFVSTChyZWNvcmQudXJsKS5ob3N0O3JldHVybiByZXF1ZXN0SG9zdD09PWZpbmFsSG9zdDt9KS5tYXAocmVjb3JkPT57cmV0dXJue3Byb3RvY29sOnJlY29yZC5wcm90b2NvbCx1cmw6cmVjb3JkLnVybH07fSkuZmlsdGVyKHJlY29yZD0+e2lmKHNlZW5VUkxzLmhhcyhyZWNvcmQudXJsKSlyZXR1cm4gZmFsc2U7c2VlblVSTHMuYWRkKHJlY29yZC51cmwpO3JldHVybiB0cnVlO30pO2xldCBkaXNwbGF5VmFsdWU9Jyc7aWYocmVzb3VyY2VzLmxlbmd0aD4xKXtkaXNwbGF5VmFsdWU9YCR7VXRpbC5mb3JtYXROdW1iZXIocmVzb3VyY2VzLmxlbmd0aCl9IHJlcXVlc3RzIG5vdCBzZXJ2ZWQgdmlhIEhUVFAvMmA7fWVsc2UgaWYocmVzb3VyY2VzLmxlbmd0aD09PTEpe2Rpc3BsYXlWYWx1ZT1gJHtyZXNvdXJjZXMubGVuZ3RofSByZXF1ZXN0IG5vdCBzZXJ2ZWQgdmlhIEhUVFAvMmA7fQpjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyxpdGVtVHlwZTondXJsJyx0ZXh0OidVUkwnfSx7a2V5Oidwcm90b2NvbCcsaXRlbVR5cGU6J3RleHQnLHRleHQ6J1Byb3RvY29sJ31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxyZXNvdXJjZXMpO3JldHVybntyYXdWYWx1ZTpyZXNvdXJjZXMubGVuZ3RoPT09MCxkaXNwbGF5VmFsdWU6ZGlzcGxheVZhbHVlLGV4dGVuZGVkSW5mbzp7dmFsdWU6e3Jlc3VsdHM6cmVzb3VyY2VzfX0sZGV0YWlsc307fSk7fX0KbW9kdWxlLmV4cG9ydHM9VXNlc0hUVFAyQXVkaXQ7fSx7Ii4uLy4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4uLy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwuanMiOjQ4LCIuLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvZG9iZXR0ZXJ3ZWIvdXNlcy1wYXNzaXZlLWV2ZW50LWxpc3RlbmVycyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBWaW9sYXRpb25BdWRpdD1yZXF1aXJlKCcuLi92aW9sYXRpb24tYXVkaXQnKTtjbGFzcyBQYXNzaXZlRXZlbnRzQXVkaXQgZXh0ZW5kcyBWaW9sYXRpb25BdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VzZXMtcGFzc2l2ZS1ldmVudC1saXN0ZW5lcnMnLHRpdGxlOidVc2VzIHBhc3NpdmUgbGlzdGVuZXJzIHRvIGltcHJvdmUgc2Nyb2xsaW5nIHBlcmZvcm1hbmNlJyxmYWlsdXJlVGl0bGU6J0RvZXMgbm90IHVzZSBwYXNzaXZlIGxpc3RlbmVycyB0byBpbXByb3ZlIHNjcm9sbGluZyBwZXJmb3JtYW5jZScsZGVzY3JpcHRpb246J0NvbnNpZGVyIG1hcmtpbmcgeW91ciB0b3VjaCBhbmQgd2hlZWwgZXZlbnQgbGlzdGVuZXJzIGFzIGBwYXNzaXZlYCAnKyd0byBpbXByb3ZlIHlvdXIgcGFnZVwncyBzY3JvbGwgcGVyZm9ybWFuY2UuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvcGFzc2l2ZS1ldmVudC1saXN0ZW5lcnMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydDaHJvbWVDb25zb2xlTWVzc2FnZXMnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCByZXN1bHRzPVZpb2xhdGlvbkF1ZGl0LmdldFZpb2xhdGlvblJlc3VsdHMoYXJ0aWZhY3RzLC9wYXNzaXZlIGV2ZW50IGxpc3RlbmVyLyk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTonbGFiZWwnLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidMb2NhdGlvbid9XTtjb25zdCBkZXRhaWxzPVZpb2xhdGlvbkF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyk7cmV0dXJue3Jhd1ZhbHVlOnJlc3VsdHMubGVuZ3RoPT09MCxleHRlbmRlZEluZm86e3ZhbHVlOnJlc3VsdHN9LGRldGFpbHN9O319Cm1vZHVsZS5leHBvcnRzPVBhc3NpdmVFdmVudHNBdWRpdDt9LHsiLi4vdmlvbGF0aW9uLWF1ZGl0Ijo2fV0sIi4uL2F1ZGl0cy9lcnJvcnMtaW4tY29uc29sZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y2xhc3MgRXJyb3JMb2dzIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidlcnJvcnMtaW4tY29uc29sZScsdGl0bGU6J05vIGJyb3dzZXIgZXJyb3JzIGxvZ2dlZCB0byB0aGUgY29uc29sZScsZGVzY3JpcHRpb246J0Vycm9ycyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgaW5kaWNhdGUgdW5yZXNvbHZlZCBwcm9ibGVtcy4gJysnVGhleSBjYW4gY29tZSBmcm9tIG5ldHdvcmsgcmVxdWVzdCBmYWlsdXJlcyBhbmQgb3RoZXIgYnJvd3NlciBjb25jZXJucy4nLGZhaWx1cmVUaXRsZTonQnJvd3NlciBlcnJvcnMgd2VyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUnLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQ2hyb21lQ29uc29sZU1lc3NhZ2VzJywnUnVudGltZUV4Y2VwdGlvbnMnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBjb25zb2xlRW50cmllcz1hcnRpZmFjdHMuQ2hyb21lQ29uc29sZU1lc3NhZ2VzO2NvbnN0IHJ1bnRpbWVFeGNlcHRpb25zPWFydGlmYWN0cy5SdW50aW1lRXhjZXB0aW9ucztjb25zdCBjb25zb2xlUm93cz1jb25zb2xlRW50cmllcy5maWx0ZXIobG9nPT5sb2cuZW50cnkmJmxvZy5lbnRyeS5sZXZlbD09PSdlcnJvcicpLm1hcChpdGVtPT57cmV0dXJue3NvdXJjZTppdGVtLmVudHJ5LnNvdXJjZSxkZXNjcmlwdGlvbjppdGVtLmVudHJ5LnRleHQsdXJsOml0ZW0uZW50cnkudXJsfTt9KTtjb25zdCBydW50aW1lRXhSb3dzPXJ1bnRpbWVFeGNlcHRpb25zLmZpbHRlcihlbnRyeT0+ZW50cnkuZXhjZXB0aW9uRGV0YWlscyE9PXVuZGVmaW5lZCkubWFwKGVudHJ5PT57Y29uc3QgZGVzY3JpcHRpb249ZW50cnkuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24/ZW50cnkuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24uZGVzY3JpcHRpb246ZW50cnkuZXhjZXB0aW9uRGV0YWlscy50ZXh0O3JldHVybntzb3VyY2U6J1J1bnRpbWUuZXhjZXB0aW9uJyxkZXNjcmlwdGlvbix1cmw6ZW50cnkuZXhjZXB0aW9uRGV0YWlscy51cmx9O30pO2NvbnN0IHRhYmxlUm93cz1jb25zb2xlUm93cy5jb25jYXQocnVudGltZUV4Um93cyk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTonZGVzY3JpcHRpb24nLGl0ZW1UeXBlOidjb2RlJyx0ZXh0OidEZXNjcmlwdGlvbid9XTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MsdGFibGVSb3dzKTtjb25zdCBudW1FcnJvcnM9dGFibGVSb3dzLmxlbmd0aDtyZXR1cm57c2NvcmU6TnVtYmVyKG51bUVycm9ycz09PTApLHJhd1ZhbHVlOm51bUVycm9ycyxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1FcnJvckxvZ3M7fSx7Ii4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL2ZvbnQtZGlzcGxheSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NvbnN0IGFsbG93ZWRGb250RmFjZURpc3BsYXlzPVsnYmxvY2snLCdmYWxsYmFjaycsJ29wdGlvbmFsJywnc3dhcCddO2NsYXNzIEZvbnREaXNwbGF5IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidmb250LWRpc3BsYXknLHRpdGxlOidBbGwgdGV4dCByZW1haW5zIHZpc2libGUgZHVyaW5nIHdlYmZvbnQgbG9hZHMnLGZhaWx1cmVUaXRsZTonVGV4dCBpcyBpbnZpc2libGUgd2hpbGUgd2ViZm9udHMgYXJlIGxvYWRpbmcnLGRlc2NyaXB0aW9uOidMZXZlcmFnZSB0aGUgZm9udC1kaXNwbGF5IENTUyBmZWF0dXJlIHRvIGVuc3VyZSB0ZXh0IGlzIHVzZXItdmlzaWJsZSB3aGlsZSAnKyd3ZWJmb250cyBhcmUgbG9hZGluZy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTYvMDIvZm9udC1kaXNwbGF5KS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJywnRm9udHMnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBkZXZ0b29sc0xvZ3M9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1t0aGlzLkRFRkFVTFRfUEFTU107Y29uc3QgZm9udEZhY2VzPWFydGlmYWN0cy5Gb250cztjb25zdCBmb250c1dpdGhvdXRQcm9wZXJEaXNwbGF5PWZvbnRGYWNlcy5maWx0ZXIoZm9udEZhY2U9PiFmb250RmFjZS5kaXNwbGF5fHwhYWxsb3dlZEZvbnRGYWNlRGlzcGxheXMuaW5jbHVkZXMoZm9udEZhY2UuZGlzcGxheSkpO3JldHVybiBhcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9ncykudGhlbihuZXR3b3JrUmVjb3Jkcz0+e2NvbnN0IHJlc3VsdHM9bmV0d29ya1JlY29yZHMuZmlsdGVyKHJlY29yZD0+e2NvbnN0IGlzRm9udD1yZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuRm9udDtyZXR1cm4gaXNGb250O30pLmZpbHRlcihmb250UmVjb3JkPT57cmV0dXJuISFmb250c1dpdGhvdXRQcm9wZXJEaXNwbGF5LmZpbmQoZm9udEZhY2U9PntyZXR1cm4hIWZvbnRGYWNlLnNyYyYmISFmb250RmFjZS5zcmMuZmluZChzcmM9PmZvbnRSZWNvcmQudXJsPT09c3JjKTt9KTt9KS5tYXAocmVjb3JkPT57Y29uc3Qgd2FzdGVkVGltZT1NYXRoLm1pbigocmVjb3JkLmVuZFRpbWUtcmVjb3JkLnN0YXJ0VGltZSkqMTAwMCwzMDAwKTtyZXR1cm57dXJsOnJlY29yZC51cmwsd2FzdGVkVGltZX07fSk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonRm9udCBVUkwnfSx7a2V5Oid3YXN0ZWRUaW1lJyxpdGVtVHlwZTonbXMnLGdyYW51bGFyaXR5OjEsdGV4dDonRm9udCBkb3dubG9hZCB0aW1lJ31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxyZXN1bHRzKTtyZXR1cm57c2NvcmU6TnVtYmVyKHJlc3VsdHMubGVuZ3RoPT09MCkscmF3VmFsdWU6cmVzdWx0cy5sZW5ndGg9PT0wLGRldGFpbHN9O30pO319Cm1vZHVsZS5leHBvcnRzPUZvbnREaXNwbGF5O30seyIuLi9saWIvbmV0d29yay1yZXF1ZXN0IjozOCwiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvaW1hZ2UtYXNwZWN0LXJhdGlvIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y29uc3QgVEhSRVNIT0xEX1BYPTI7Y2xhc3MgSW1hZ2VBc3BlY3RSYXRpbyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaW1hZ2UtYXNwZWN0LXJhdGlvJyx0aXRsZTonRGlzcGxheXMgaW1hZ2VzIHdpdGggY29ycmVjdCBhc3BlY3QgcmF0aW8nLGZhaWx1cmVUaXRsZTonRGlzcGxheXMgaW1hZ2VzIHdpdGggaW5jb3JyZWN0IGFzcGVjdCByYXRpbycsZGVzY3JpcHRpb246J0ltYWdlIGRpc3BsYXkgZGltZW5zaW9ucyBzaG91bGQgbWF0Y2ggbmF0dXJhbCBhc3BlY3QgcmF0aW8uICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvYXNwZWN0LXJhdGlvKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnSW1hZ2VVc2FnZSddfTt9CnN0YXRpYyBjb21wdXRlQXNwZWN0UmF0aW9zKGltYWdlKXtjb25zdCB1cmw9VVJMLmVsaWRlRGF0YVVSSShpbWFnZS5zcmMpO2NvbnN0IGFjdHVhbEFzcGVjdFJhdGlvPWltYWdlLm5hdHVyYWxXaWR0aC9pbWFnZS5uYXR1cmFsSGVpZ2h0O2NvbnN0IGRpc3BsYXllZEFzcGVjdFJhdGlvPWltYWdlLndpZHRoL2ltYWdlLmhlaWdodDtjb25zdCB0YXJnZXREaXNwbGF5SGVpZ2h0PWltYWdlLndpZHRoL2FjdHVhbEFzcGVjdFJhdGlvO2NvbnN0IGRvUmF0aW9zTWF0Y2g9TWF0aC5hYnModGFyZ2V0RGlzcGxheUhlaWdodC1pbWFnZS5oZWlnaHQpPFRIUkVTSE9MRF9QWDtpZighTnVtYmVyLmlzRmluaXRlKGFjdHVhbEFzcGVjdFJhdGlvKXx8IU51bWJlci5pc0Zpbml0ZShkaXNwbGF5ZWRBc3BlY3RSYXRpbykpe3JldHVybiBuZXcgRXJyb3IoYEludmFsaWQgaW1hZ2Ugc2l6aW5nIGluZm9ybWF0aW9uICR7dXJsfWApO30KcmV0dXJue3VybCxkaXNwbGF5ZWRBc3BlY3RSYXRpbzpgJHtpbWFnZS53aWR0aH0geCAke2ltYWdlLmhlaWdodH0KICAgICAgICAoJHtkaXNwbGF5ZWRBc3BlY3RSYXRpby50b0ZpeGVkKDIpfSlgLGFjdHVhbEFzcGVjdFJhdGlvOmAke2ltYWdlLm5hdHVyYWxXaWR0aH0geCAke2ltYWdlLm5hdHVyYWxIZWlnaHR9CiAgICAgICAgKCR7YWN0dWFsQXNwZWN0UmF0aW8udG9GaXhlZCgyKX0pYCxkb1JhdGlvc01hdGNofTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGltYWdlcz1hcnRpZmFjdHMuSW1hZ2VVc2FnZTtjb25zdCB3YXJuaW5ncz1bXTtjb25zdCByZXN1bHRzPVtdO2ltYWdlcy5maWx0ZXIoaW1hZ2U9PntyZXR1cm4gaW1hZ2UubmV0d29ya1JlY29yZCYmaW1hZ2UubmV0d29ya1JlY29yZC5taW1lVHlwZSE9PSdpbWFnZS9zdmcreG1sJyYmaW1hZ2Uud2lkdGgmJmltYWdlLmhlaWdodCYmIWltYWdlLnVzZXNPYmplY3RGaXQ7fSkuZm9yRWFjaChpbWFnZT0+e2NvbnN0IHdlbGxEZWZpbmVkSW1hZ2U9aW1hZ2U7Y29uc3QgcHJvY2Vzc2VkPUltYWdlQXNwZWN0UmF0aW8uY29tcHV0ZUFzcGVjdFJhdGlvcyh3ZWxsRGVmaW5lZEltYWdlKTtpZihwcm9jZXNzZWQgaW5zdGFuY2VvZiBFcnJvcil7d2FybmluZ3MucHVzaChwcm9jZXNzZWQubWVzc2FnZSk7cmV0dXJuO30KaWYoIXByb2Nlc3NlZC5kb1JhdGlvc01hdGNoKXJlc3VsdHMucHVzaChwcm9jZXNzZWQpO30pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLGl0ZW1UeXBlOid0aHVtYm5haWwnLHRleHQ6Jyd9LHtrZXk6J3VybCcsaXRlbVR5cGU6J3VybCcsdGV4dDonVVJMJ30se2tleTonZGlzcGxheWVkQXNwZWN0UmF0aW8nLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidBc3BlY3QgUmF0aW8gKERpc3BsYXllZCknfSx7a2V5OidhY3R1YWxBc3BlY3RSYXRpbycsaXRlbVR5cGU6J3RleHQnLHRleHQ6J0FzcGVjdCBSYXRpbyAoQWN0dWFsKSd9XTtyZXR1cm57cmF3VmFsdWU6cmVzdWx0cy5sZW5ndGg9PT0wLHdhcm5pbmdzLGRldGFpbHM6QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxyZXN1bHRzKX07fX0KbW9kdWxlLmV4cG9ydHM9SW1hZ2VBc3BlY3RSYXRpbzt9LHsiLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvaXMtb24taHR0cHMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi9saWIvdXJsLXNoaW0nKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjb25zdCBTRUNVUkVfU0NIRU1FUz1bJ2RhdGEnLCdodHRwcycsJ3dzcycsJ2Jsb2InLCdjaHJvbWUnLCdjaHJvbWUtZXh0ZW5zaW9uJywnYWJvdXQnXTtjb25zdCBTRUNVUkVfRE9NQUlOUz1bJ2xvY2FsaG9zdCcsJzEyNy4wLjAuMSddO2NsYXNzIEhUVFBTIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidpcy1vbi1odHRwcycsdGl0bGU6J1VzZXMgSFRUUFMnLGZhaWx1cmVUaXRsZTonRG9lcyBub3QgdXNlIEhUVFBTJyxkZXNjcmlwdGlvbjonQWxsIHNpdGVzIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aCBIVFRQUywgZXZlbiBvbmVzIHRoYXQgZG9uXCd0IGhhbmRsZSAnKydzZW5zaXRpdmUgZGF0YS4gSFRUUFMgcHJldmVudHMgaW50cnVkZXJzIGZyb20gdGFtcGVyaW5nIHdpdGggb3IgcGFzc2l2ZWx5IGxpc3RlbmluZyAnKydpbiBvbiB0aGUgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB5b3VyIGFwcCBhbmQgeW91ciB1c2VycywgYW5kIGlzIGEgcHJlcmVxdWlzaXRlIGZvciAnKydIVFRQLzIgYW5kIG1hbnkgbmV3IHdlYiBwbGF0Zm9ybSBBUElzLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2h0dHBzKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGlzU2VjdXJlUmVjb3JkKHJlY29yZCl7cmV0dXJuIFNFQ1VSRV9TQ0hFTUVTLmluY2x1ZGVzKHJlY29yZC5wYXJzZWRVUkwuc2NoZW1lKXx8U0VDVVJFX1NDSEVNRVMuaW5jbHVkZXMocmVjb3JkLnByb3RvY29sKXx8U0VDVVJFX0RPTUFJTlMuaW5jbHVkZXMocmVjb3JkLnBhcnNlZFVSTC5ob3N0KTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGRldnRvb2xzTG9ncz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2dzKS50aGVuKG5ldHdvcmtSZWNvcmRzPT57Y29uc3QgaW5zZWN1cmVVUkxzPW5ldHdvcmtSZWNvcmRzLmZpbHRlcihyZWNvcmQ9PiFIVFRQUy5pc1NlY3VyZVJlY29yZChyZWNvcmQpKS5tYXAocmVjb3JkPT5VUkwuZWxpZGVEYXRhVVJJKHJlY29yZC51cmwpKTtsZXQgZGlzcGxheVZhbHVlPScnO2lmKGluc2VjdXJlVVJMcy5sZW5ndGg+MSl7ZGlzcGxheVZhbHVlPWAke1V0aWwuZm9ybWF0TnVtYmVyKGluc2VjdXJlVVJMcy5sZW5ndGgpfSBpbnNlY3VyZSByZXF1ZXN0cyBmb3VuZGA7fWVsc2UgaWYoaW5zZWN1cmVVUkxzLmxlbmd0aD09PTEpe2Rpc3BsYXlWYWx1ZT1gJHtpbnNlY3VyZVVSTHMubGVuZ3RofSBpbnNlY3VyZSByZXF1ZXN0IGZvdW5kYDt9CmNvbnN0IGl0ZW1zPUFycmF5LmZyb20obmV3IFNldChpbnNlY3VyZVVSTHMpKS5tYXAodXJsPT4oe3VybH0pKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyxpdGVtVHlwZTondXJsJyx0ZXh0OidJbnNlY3VyZSBVUkwnfV07cmV0dXJue3Jhd1ZhbHVlOml0ZW1zLmxlbmd0aD09PTAsZGlzcGxheVZhbHVlLGV4dGVuZGVkSW5mbzp7dmFsdWU6aXRlbXN9LGRldGFpbHM6QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxpdGVtcyl9O30pO319Cm1vZHVsZS5leHBvcnRzPUhUVFBTO30seyIuLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsIjo0OCwiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvbG9hZC1mYXN0LWVub3VnaC1mb3ItcHdhIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IGlzRGVlcEVxdWFsPXJlcXVpcmUoJ2xvZGFzaC5pc2VxdWFsJyk7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NvbnN0IG1vYmlsZTNHVGhyb3R0bGluZz1yZXF1aXJlKCcuLi9jb25maWcvY29uc3RhbnRzJykudGhyb3R0bGluZy5tb2JpbGUzRztjb25zdCBNQVhJTVVNX1RUST0xMCoxMDAwO2NsYXNzIExvYWRGYXN0RW5vdWdoNFB3YSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonbG9hZC1mYXN0LWVub3VnaC1mb3ItcHdhJyx0aXRsZTonUGFnZSBsb2FkIGlzIGZhc3QgZW5vdWdoIG9uIDNHJyxmYWlsdXJlVGl0bGU6J1BhZ2UgbG9hZCBpcyBub3QgZmFzdCBlbm91Z2ggb24gM0cnLGRlc2NyaXB0aW9uOidBIGZhc3QgcGFnZSBsb2FkIG92ZXIgYSAzRyBuZXR3b3JrIGVuc3VyZXMgYSBnb29kIG1vYmlsZSB1c2VyIGV4cGVyaWVuY2UuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvZmFzdC0zZykuJyxyZXF1aXJlZEFydGlmYWN0czpbJ3RyYWNlcycsJ2RldnRvb2xzTG9ncyddfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBzZXR0aW5nT3ZlcnJpZGVzPXt0aHJvdHRsaW5nTWV0aG9kOidzaW11bGF0ZScsdGhyb3R0bGluZzptb2JpbGUzR1Rocm90dGxpbmd9O2NvbnN0IHNldHRpbmdzPWNvbnRleHQuc2V0dGluZ3MudGhyb3R0bGluZ01ldGhvZCE9PSdwcm92aWRlZCcmJmlzRGVlcEVxdWFsKGNvbnRleHQuc2V0dGluZ3MudGhyb3R0bGluZyxtb2JpbGUzR1Rocm90dGxpbmcpP2NvbnRleHQuc2V0dGluZ3M6T2JqZWN0LmFzc2lnbih7fSxjb250ZXh0LnNldHRpbmdzLHNldHRpbmdPdmVycmlkZXMpO2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3N9O2NvbnN0IHR0aT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdEludGVyYWN0aXZlKG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3Qgc2NvcmU9TnVtYmVyKHR0aS50aW1pbmc8TUFYSU1VTV9UVEkpO2xldCBkaXNwbGF5VmFsdWU7bGV0IGV4cGxhbmF0aW9uO2lmKCFzY29yZSl7ZGlzcGxheVZhbHVlPVtgSW50ZXJhY3RpdmUgYXQgJWRceGEwc2AsdHRpLnRpbWluZy8xMDAwXTtleHBsYW5hdGlvbj0nWW91ciBwYWdlIGxvYWRzIHRvbyBzbG93bHkgYW5kIGlzIG5vdCBpbnRlcmFjdGl2ZSB3aXRoaW4gMTAgc2Vjb25kcy4gJysnTG9vayBhdCB0aGUgb3Bwb3J0dW5pdGllcyBhbmQgZGlhZ25vc3RpY3MgaW4gdGhlICJQZXJmb3JtYW5jZSIgc2VjdGlvbiB0byBsZWFybiBob3cgdG8gJysnaW1wcm92ZS4nO30KcmV0dXJue3Njb3JlLGRpc3BsYXlWYWx1ZSxleHBsYW5hdGlvbixyYXdWYWx1ZTp0dGkudGltaW5nfTt9fQptb2R1bGUuZXhwb3J0cz1Mb2FkRmFzdEVub3VnaDRQd2E7fSx7Ii4uL2NvbmZpZy9jb25zdGFudHMiOjgsIi4vYXVkaXQiOjIsImxvZGFzaC5pc2VxdWFsIjoxMjZ9XSwiLi4vYXVkaXRzL21haW50aHJlYWQtd29yay1icmVha2Rvd24iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NvbnN0IFV0aWw9cmVxdWlyZSgnLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCcpO2NvbnN0e3Rhc2tHcm91cHN9PXJlcXVpcmUoJy4uL2xpYi90YXNrLWdyb3VwcycpO2NsYXNzIE1haW5UaHJlYWRXb3JrQnJlYWtkb3duIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidtYWludGhyZWFkLXdvcmstYnJlYWtkb3duJyx0aXRsZTonTWluaW1pemVzIG1haW4gdGhyZWFkIHdvcmsnLGZhaWx1cmVUaXRsZTonSGFzIHNpZ25pZmljYW50IG1haW4gdGhyZWFkIHdvcmsnLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLGRlc2NyaXB0aW9uOidDb25zaWRlciByZWR1Y2luZyB0aGUgdGltZSBzcGVudCBwYXJzaW5nLCBjb21waWxpbmcgYW5kIGV4ZWN1dGluZyBKUy4gJysnWW91IG1heSBmaW5kIGRlbGl2ZXJpbmcgc21hbGxlciBKUyBwYXlsb2FkcyBoZWxwcyB3aXRoIHRoaXMuJyxyZXF1aXJlZEFydGlmYWN0czpbJ3RyYWNlcyddfTt9CnN0YXRpYyBnZXQgZGVmYXVsdE9wdGlvbnMoKXtyZXR1cm57c2NvcmVQT0RSOjE1MDAsc2NvcmVNZWRpYW46NDAwMH07fQpzdGF0aWMgZ2V0RXhlY3V0aW9uVGltaW5nc0J5R3JvdXAodGFza3Mpe2NvbnN0IHJlc3VsdD1uZXcgTWFwKCk7Zm9yKGNvbnN0IHRhc2sgb2YgdGFza3Mpe2NvbnN0IG9yaWdpbmFsVGltZT1yZXN1bHQuZ2V0KHRhc2suZ3JvdXAuaWQpfHwwO3Jlc3VsdC5zZXQodGFzay5ncm91cC5pZCxvcmlnaW5hbFRpbWUrdGFzay5zZWxmVGltZSk7fQpyZXR1cm4gcmVzdWx0O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCBzZXR0aW5ncz1jb250ZXh0LnNldHRpbmdzfHx7fTtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW01haW5UaHJlYWRXb3JrQnJlYWtkb3duLkRFRkFVTFRfUEFTU107Y29uc3QgdGFza3M9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RNYWluVGhyZWFkVGFza3ModHJhY2UpO2NvbnN0IG11bHRpcGxpZXI9c2V0dGluZ3MudGhyb3R0bGluZ01ldGhvZD09PSdzaW11bGF0ZSc/c2V0dGluZ3MudGhyb3R0bGluZy5jcHVTbG93ZG93bk11bHRpcGxpZXI6MTtjb25zdCBleGVjdXRpb25UaW1pbmdzPU1haW5UaHJlYWRXb3JrQnJlYWtkb3duLmdldEV4ZWN1dGlvblRpbWluZ3NCeUdyb3VwKHRhc2tzKTtsZXQgdG90YWxFeGVjdXRpb25UaW1lPTA7Y29uc3QgY2F0ZWdvcnlUb3RhbHM9e307Y29uc3QgcmVzdWx0cz1BcnJheS5mcm9tKGV4ZWN1dGlvblRpbWluZ3MpLm1hcCgoW2dyb3VwSWQscmF3RHVyYXRpb25dKT0+e2NvbnN0IGR1cmF0aW9uPXJhd0R1cmF0aW9uKm11bHRpcGxpZXI7dG90YWxFeGVjdXRpb25UaW1lKz1kdXJhdGlvbjtjb25zdCBjYXRlZ29yeVRvdGFsPWNhdGVnb3J5VG90YWxzW2dyb3VwSWRdfHwwO2NhdGVnb3J5VG90YWxzW2dyb3VwSWRdPWNhdGVnb3J5VG90YWwrZHVyYXRpb247cmV0dXJue2dyb3VwOmdyb3VwSWQsZ3JvdXBMYWJlbDp0YXNrR3JvdXBzW2dyb3VwSWRdLmxhYmVsLGR1cmF0aW9uOmR1cmF0aW9ufTt9KTtjb25zdCBoZWFkaW5ncz1be2tleTonZ3JvdXBMYWJlbCcsaXRlbVR5cGU6J3RleHQnLHRleHQ6J0NhdGVnb3J5J30se2tleTonZHVyYXRpb24nLGl0ZW1UeXBlOidtcycsZ3JhbnVsYXJpdHk6MSx0ZXh0OidUaW1lIFNwZW50J31dO3Jlc3VsdHMuc29ydCgoYSxiKT0+Y2F0ZWdvcnlUb3RhbHNbYi5ncm91cF0tY2F0ZWdvcnlUb3RhbHNbYS5ncm91cF0pO2NvbnN0IHRhYmxlRGV0YWlscz1NYWluVGhyZWFkV29ya0JyZWFrZG93bi5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHJlc3VsdHMpO2NvbnN0IHNjb3JlPUF1ZGl0LmNvbXB1dGVMb2dOb3JtYWxTY29yZSh0b3RhbEV4ZWN1dGlvblRpbWUsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pO3JldHVybntzY29yZSxyYXdWYWx1ZTp0b3RhbEV4ZWN1dGlvblRpbWUsZGlzcGxheVZhbHVlOltVdGlsLk1TX0RJU1BMQVlfVkFMVUUsdG90YWxFeGVjdXRpb25UaW1lXSxkZXRhaWxzOnRhYmxlRGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9TWFpblRocmVhZFdvcmtCcmVha2Rvd247fSx7Ii4uL2xpYi90YXNrLWdyb3VwcyI6NDMsIi4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwiOjQ4LCIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9tYW5pZmVzdC1zaG9ydC1uYW1lLWxlbmd0aCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y2xhc3MgTWFuaWZlc3RTaG9ydE5hbWVMZW5ndGggZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J21hbmlmZXN0LXNob3J0LW5hbWUtbGVuZ3RoJyx0aXRsZTonVGhlIGBzaG9ydF9uYW1lYCB3b25cJ3QgYmUgdHJ1bmNhdGVkIG9uIHRoZSBob21lc2NyZWVuJyxmYWlsdXJlVGl0bGU6J1RoZSBgc2hvcnRfbmFtZWAgd2lsbCBiZSB0cnVuY2F0ZWQgb24gdGhlIGhvbWVzY3JlZW4nLGRlc2NyaXB0aW9uOidNYWtlIHlvdXIgYXBwXCdzIGBzaG9ydF9uYW1lYCBmZXdlciB0aGFuIDEyIGNoYXJhY3RlcnMgdG8gJysnZW5zdXJlIHRoYXQgaXRcJ3Mgbm90IHRydW5jYXRlZCBvbiBob21lc2NyZWVucy4gW0xlYXJuICcrJ21vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9tYW5pZmVzdC1zaG9ydF9uYW1lLWlzLW5vdC10cnVuY2F0ZWQpLicscmVxdWlyZWRBcnRpZmFjdHM6WydNYW5pZmVzdCddfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IG1hbmlmZXN0VmFsdWVzPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TWFuaWZlc3RWYWx1ZXMoYXJ0aWZhY3RzLk1hbmlmZXN0KTtpZihtYW5pZmVzdFZhbHVlcy5pc1BhcnNlRmFpbHVyZSl7cmV0dXJue3Jhd1ZhbHVlOnRydWUsbm90QXBwbGljYWJsZTp0cnVlfTt9CmNvbnN0IHNob3J0TmFtZUNoZWNrPW1hbmlmZXN0VmFsdWVzLmFsbENoZWNrcy5maW5kKGk9PmkuaWQ9PT0naGFzU2hvcnROYW1lJyk7Y29uc3Qgc2hvcnROYW1lTGVuZ3RoQ2hlY2s9bWFuaWZlc3RWYWx1ZXMuYWxsQ2hlY2tzLmZpbmQoaT0+aS5pZD09PSdzaG9ydE5hbWVMZW5ndGgnKTtpZihzaG9ydE5hbWVDaGVjayYmIXNob3J0TmFtZUNoZWNrLnBhc3Npbmcpe3JldHVybntyYXdWYWx1ZTp0cnVlLG5vdEFwcGxpY2FibGU6dHJ1ZX07fQppZihzaG9ydE5hbWVMZW5ndGhDaGVjayYmIXNob3J0TmFtZUxlbmd0aENoZWNrLnBhc3Npbmcpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjpgRmFpbHVyZTogJHtzaG9ydE5hbWVMZW5ndGhDaGVjay5mYWlsdXJlVGV4dH0uYH07fQpyZXR1cm57cmF3VmFsdWU6dHJ1ZX07fX0KbW9kdWxlLmV4cG9ydHM9TWFuaWZlc3RTaG9ydE5hbWVMZW5ndGg7fSx7Ii4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21hbnVhbC9wd2EtY3Jvc3MtYnJvd3NlciI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNYW51YWxBdWRpdD1yZXF1aXJlKCcuL21hbnVhbC1hdWRpdCcpO2NsYXNzIFBXQUNyb3NzQnJvd3NlciBleHRlbmRzIE1hbnVhbEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybiBPYmplY3QuYXNzaWduKHtpZDoncHdhLWNyb3NzLWJyb3dzZXInLGRlc2NyaXB0aW9uOidUbyByZWFjaCB0aGUgbW9zdCBudW1iZXIgb2YgdXNlcnMsIHNpdGVzIHNob3VsZCB3b3JrIGFjcm9zcyAnKydldmVyeSBtYWpvciBicm93c2VyLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Byb2dyZXNzaXZlLXdlYi1hcHBzL2NoZWNrbGlzdCNzaXRlLXdvcmtzLWNyb3NzLWJyb3dzZXIpLicsdGl0bGU6J1NpdGUgd29ya3MgY3Jvc3MtYnJvd3Nlcid9LHN1cGVyLnBhcnRpYWxNZXRhKTt9fQptb2R1bGUuZXhwb3J0cz1QV0FDcm9zc0Jyb3dzZXI7fSx7Ii4vbWFudWFsLWF1ZGl0Ijo0fV0sIi4uL2F1ZGl0cy9tYW51YWwvcHdhLWVhY2gtcGFnZS1oYXMtdXJsIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1hbnVhbEF1ZGl0PXJlcXVpcmUoJy4vbWFudWFsLWF1ZGl0Jyk7Y2xhc3MgUFdBRWFjaFBhZ2VIYXNVUkwgZXh0ZW5kcyBNYW51YWxBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7aWQ6J3B3YS1lYWNoLXBhZ2UtaGFzLXVybCcsZGVzY3JpcHRpb246J0Vuc3VyZSBpbmRpdmlkdWFsIHBhZ2VzIGFyZSBkZWVwIGxpbmthYmxlIHZpYSB0aGUgVVJMcyBhbmQgdGhhdCBVUkxzIGFyZSAnKyd1bmlxdWUgZm9yIHRoZSBwdXJwb3NlIG9mIHNoYXJlYWJpbGl0eSBvbiBzb2NpYWwgbWVkaWEuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvcHJvZ3Jlc3NpdmUtd2ViLWFwcHMvY2hlY2tsaXN0I2VhY2gtcGFnZS1oYXMtYS11cmwpLicsdGl0bGU6J0VhY2ggcGFnZSBoYXMgYSBVUkwnfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9UFdBRWFjaFBhZ2VIYXNVUkw7fSx7Ii4vbWFudWFsLWF1ZGl0Ijo0fV0sIi4uL2F1ZGl0cy9tYW51YWwvcHdhLXBhZ2UtdHJhbnNpdGlvbnMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWFudWFsQXVkaXQ9cmVxdWlyZSgnLi9tYW51YWwtYXVkaXQnKTtjbGFzcyBQV0FQYWdlVHJhbnNpdGlvbnMgZXh0ZW5kcyBNYW51YWxBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7aWQ6J3B3YS1wYWdlLXRyYW5zaXRpb25zJyxkZXNjcmlwdGlvbjonVHJhbnNpdGlvbnMgc2hvdWxkIGZlZWwgc25hcHB5IGFzIHlvdSB0YXAgYXJvdW5kLCBldmVuIG9uIGEgc2xvdyBuZXR3b3JrLCBhICcrJ2tleSB0byBwZXJjZWl2ZWQgcGVyZm9ybWFuY2UuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvcHJvZ3Jlc3NpdmUtd2ViLWFwcHMvY2hlY2tsaXN0I3BhZ2UtdHJhbnNpdGlvbnMtZG9udC1mZWVsLWxpa2UtdGhleS1ibG9jay1vbi10aGUtbmV0d29yaykuJyx0aXRsZTonUGFnZSB0cmFuc2l0aW9ucyBkb25cJ3QgZmVlbCBsaWtlIHRoZXkgYmxvY2sgb24gdGhlIG5ldHdvcmsnfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9UFdBUGFnZVRyYW5zaXRpb25zO30seyIuL21hbnVhbC1hdWRpdCI6NH1dLCIuLi9hdWRpdHMvbWV0cmljcy9lc3RpbWF0ZWQtaW5wdXQtbGF0ZW5jeSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIEVzdGltYXRlZElucHV0TGF0ZW5jeSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonZXN0aW1hdGVkLWlucHV0LWxhdGVuY3knLHRpdGxlOidFc3RpbWF0ZWQgSW5wdXQgTGF0ZW5jeScsZGVzY3JpcHRpb246J1RoZSBzY29yZSBhYm92ZSBpcyBhbiBlc3RpbWF0ZSBvZiBob3cgbG9uZyB5b3VyIGFwcCB0YWtlcyB0byByZXNwb25kIHRvIHVzZXIgJysnaW5wdXQsIGluIG1pbGxpc2Vjb25kcywgZHVyaW5nIHRoZSBidXNpZXN0IDVzIHdpbmRvdyBvZiBwYWdlIGxvYWQuIElmIHlvdXIgJysnbGF0ZW5jeSBpcyBoaWdoZXIgdGhhbiA1MCBtcywgdXNlcnMgbWF5IHBlcmNlaXZlIHlvdXIgYXBwIGFzIGxhZ2d5LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2VzdGltYXRlZC1pbnB1dC1sYXRlbmN5KS4nLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6NTAsc2NvcmVNZWRpYW46MTAwfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBtZXRyaWNDb21wdXRhdGlvbkRhdGE9e3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzOmNvbnRleHQuc2V0dGluZ3N9O2NvbnN0IG1ldHJpY1Jlc3VsdD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdEVzdGltYXRlZElucHV0TGF0ZW5jeShtZXRyaWNDb21wdXRhdGlvbkRhdGEpO3JldHVybntzY29yZTpBdWRpdC5jb21wdXRlTG9nTm9ybWFsU2NvcmUobWV0cmljUmVzdWx0LnRpbWluZyxjb250ZXh0Lm9wdGlvbnMuc2NvcmVQT0RSLGNvbnRleHQub3B0aW9ucy5zY29yZU1lZGlhbikscmF3VmFsdWU6bWV0cmljUmVzdWx0LnRpbWluZyxkaXNwbGF5VmFsdWU6WyclZFx4YTBtcycsbWV0cmljUmVzdWx0LnRpbWluZ119O319Cm1vZHVsZS5leHBvcnRzPUVzdGltYXRlZElucHV0TGF0ZW5jeTt9LHsiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21ldHJpY3MvZmlyc3QtY29udGVudGZ1bC1wYWludCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NvbnN0IFV0aWw9cmVxdWlyZSgnLi4vLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbC5qcycpO2NsYXNzIEZpcnN0Q29udGVudGZ1bFBhaW50IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidmaXJzdC1jb250ZW50ZnVsLXBhaW50Jyx0aXRsZTonRmlyc3QgQ29udGVudGZ1bCBQYWludCcsZGVzY3JpcHRpb246J0ZpcnN0IGNvbnRlbnRmdWwgcGFpbnQgbWFya3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGZpcnN0IHRleHQvaW1hZ2UgaXMgJytgcGFpbnRlZC4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvcGVyZm9ybWFuY2UvdXNlci1jZW50cmljLXBlcmZvcm1hbmNlLW1ldHJpY3MjZmlyc3RfcGFpbnRfYW5kX2ZpcnN0X2NvbnRlbnRmdWxfcGFpbnQpLmAsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMscmVxdWlyZWRBcnRpZmFjdHM6Wyd0cmFjZXMnLCdkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgZ2V0IGRlZmF1bHRPcHRpb25zKCl7cmV0dXJue3Njb3JlUE9EUjoyMDAwLHNjb3JlTWVkaWFuOjQwMDB9O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3M6Y29udGV4dC5zZXR0aW5nc307Y29uc3QgbWV0cmljUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0Rmlyc3RDb250ZW50ZnVsUGFpbnQobWV0cmljQ29tcHV0YXRpb25EYXRhKTtyZXR1cm57c2NvcmU6QXVkaXQuY29tcHV0ZUxvZ05vcm1hbFNjb3JlKG1ldHJpY1Jlc3VsdC50aW1pbmcsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pLHJhd1ZhbHVlOm1ldHJpY1Jlc3VsdC50aW1pbmcsZGlzcGxheVZhbHVlOltVdGlsLk1TX0RJU1BMQVlfVkFMVUUsbWV0cmljUmVzdWx0LnRpbWluZ119O319Cm1vZHVsZS5leHBvcnRzPUZpcnN0Q29udGVudGZ1bFBhaW50O30seyIuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsLmpzIjo0OCwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21ldHJpY3MvZmlyc3QtY3B1LWlkbGUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uLy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwuanMnKTtjbGFzcyBGaXJzdENQVUlkbGUgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2ZpcnN0LWNwdS1pZGxlJyx0aXRsZTonRmlyc3QgQ1BVIElkbGUnLGRlc2NyaXB0aW9uOidGaXJzdCBDUFUgSWRsZSBtYXJrcyB0aGUgZmlyc3QgdGltZSBhdCB3aGljaCB0aGUgcGFnZVwncyBtYWluIHRocmVhZCBpcyAnKydxdWlldCBlbm91Z2ggdG8gaGFuZGxlIGlucHV0LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2ZpcnN0LWludGVyYWN0aXZlKS4nLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6MjkwMCxzY29yZU1lZGlhbjo2NTAwfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBtZXRyaWNDb21wdXRhdGlvbkRhdGE9e3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzOmNvbnRleHQuc2V0dGluZ3N9O2NvbnN0IG1ldHJpY1Jlc3VsdD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdEZpcnN0Q1BVSWRsZShtZXRyaWNDb21wdXRhdGlvbkRhdGEpO3JldHVybntzY29yZTpBdWRpdC5jb21wdXRlTG9nTm9ybWFsU2NvcmUobWV0cmljUmVzdWx0LnRpbWluZyxjb250ZXh0Lm9wdGlvbnMuc2NvcmVQT0RSLGNvbnRleHQub3B0aW9ucy5zY29yZU1lZGlhbikscmF3VmFsdWU6bWV0cmljUmVzdWx0LnRpbWluZyxkaXNwbGF5VmFsdWU6W1V0aWwuTVNfRElTUExBWV9WQUxVRSxtZXRyaWNSZXN1bHQudGltaW5nXX07fX0KbW9kdWxlLmV4cG9ydHM9Rmlyc3RDUFVJZGxlO30seyIuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsLmpzIjo0OCwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21ldHJpY3MvZmlyc3QtbWVhbmluZ2Z1bC1wYWludCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NvbnN0IFV0aWw9cmVxdWlyZSgnLi4vLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCcpO2NsYXNzIEZpcnN0TWVhbmluZ2Z1bFBhaW50IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidmaXJzdC1tZWFuaW5nZnVsLXBhaW50Jyx0aXRsZTonRmlyc3QgTWVhbmluZ2Z1bCBQYWludCcsZGVzY3JpcHRpb246J0ZpcnN0IE1lYW5pbmdmdWwgUGFpbnQgbWVhc3VyZXMgd2hlbiB0aGUgcHJpbWFyeSBjb250ZW50IG9mIGEgcGFnZSBpcyAnKyd2aXNpYmxlLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2ZpcnN0LW1lYW5pbmdmdWwtcGFpbnQpLicsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMscmVxdWlyZWRBcnRpZmFjdHM6Wyd0cmFjZXMnXX07fQpzdGF0aWMgZ2V0IGRlZmF1bHRPcHRpb25zKCl7cmV0dXJue3Njb3JlUE9EUjoyMDAwLHNjb3JlTWVkaWFuOjQwMDB9O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3M6Y29udGV4dC5zZXR0aW5nc307Y29uc3QgbWV0cmljUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0Rmlyc3RNZWFuaW5nZnVsUGFpbnQobWV0cmljQ29tcHV0YXRpb25EYXRhKTtyZXR1cm57c2NvcmU6QXVkaXQuY29tcHV0ZUxvZ05vcm1hbFNjb3JlKG1ldHJpY1Jlc3VsdC50aW1pbmcsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pLHJhd1ZhbHVlOm1ldHJpY1Jlc3VsdC50aW1pbmcsZGlzcGxheVZhbHVlOltVdGlsLk1TX0RJU1BMQVlfVkFMVUUsbWV0cmljUmVzdWx0LnRpbWluZ119O319Cm1vZHVsZS5leHBvcnRzPUZpcnN0TWVhbmluZ2Z1bFBhaW50O30seyIuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsIjo0OCwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21ldHJpY3MvaW50ZXJhY3RpdmUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uLy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjbGFzcyBJbnRlcmFjdGl2ZU1ldHJpYyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaW50ZXJhY3RpdmUnLHRpdGxlOidUaW1lIHRvIEludGVyYWN0aXZlJyxkZXNjcmlwdGlvbjonSW50ZXJhY3RpdmUgbWFya3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHBhZ2UgaXMgZnVsbHkgaW50ZXJhY3RpdmUuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvY29uc2lzdGVudGx5LWludGVyYWN0aXZlKS4nLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpe3JldHVybntzY29yZVBPRFI6MjkwMCxzY29yZU1lZGlhbjo3MzAwfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBtZXRyaWNDb21wdXRhdGlvbkRhdGE9e3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzOmNvbnRleHQuc2V0dGluZ3N9O2NvbnN0IG1ldHJpY1Jlc3VsdD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdEludGVyYWN0aXZlKG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3QgdGltZUluTXM9bWV0cmljUmVzdWx0LnRpbWluZztjb25zdCBleHRlbmRlZEluZm89e3RpbWVJbk1zLHRpbWVzdGFtcDptZXRyaWNSZXN1bHQudGltZXN0YW1wLG9wdGltaXN0aWM6bWV0cmljUmVzdWx0Lm9wdGltaXN0aWNFc3RpbWF0ZSYmbWV0cmljUmVzdWx0Lm9wdGltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcyxwZXNzaW1pc3RpYzptZXRyaWNSZXN1bHQucGVzc2ltaXN0aWNFc3RpbWF0ZSYmbWV0cmljUmVzdWx0LnBlc3NpbWlzdGljRXN0aW1hdGUudGltZUluTXN9O3JldHVybntzY29yZTpBdWRpdC5jb21wdXRlTG9nTm9ybWFsU2NvcmUodGltZUluTXMsY29udGV4dC5vcHRpb25zLnNjb3JlUE9EUixjb250ZXh0Lm9wdGlvbnMuc2NvcmVNZWRpYW4pLHJhd1ZhbHVlOnRpbWVJbk1zLGRpc3BsYXlWYWx1ZTpbVXRpbC5NU19ESVNQTEFZX1ZBTFVFLHRpbWVJbk1zXSxleHRlbmRlZEluZm86e3ZhbHVlOmV4dGVuZGVkSW5mb319O319Cm1vZHVsZS5leHBvcnRzPUludGVyYWN0aXZlTWV0cmljO30seyIuLi8uLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsIjo0OCwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL21ldHJpY3Mvc3BlZWQtaW5kZXgiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uLy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjbGFzcyBTcGVlZEluZGV4IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidzcGVlZC1pbmRleCcsdGl0bGU6J1NwZWVkIEluZGV4JyxkZXNjcmlwdGlvbjonU3BlZWQgSW5kZXggc2hvd3MgaG93IHF1aWNrbHkgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSBhcmUgdmlzaWJseSBwb3B1bGF0ZWQuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvc3BlZWQtaW5kZXgpLicsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUMscmVxdWlyZWRBcnRpZmFjdHM6Wyd0cmFjZXMnLCdkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgZ2V0IGRlZmF1bHRPcHRpb25zKCl7cmV0dXJue3Njb3JlUE9EUjoyOTAwLHNjb3JlTWVkaWFuOjU4MDB9O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3M6Y29udGV4dC5zZXR0aW5nc307Y29uc3QgbWV0cmljUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0U3BlZWRJbmRleChtZXRyaWNDb21wdXRhdGlvbkRhdGEpO3JldHVybntzY29yZTpBdWRpdC5jb21wdXRlTG9nTm9ybWFsU2NvcmUobWV0cmljUmVzdWx0LnRpbWluZyxjb250ZXh0Lm9wdGlvbnMuc2NvcmVQT0RSLGNvbnRleHQub3B0aW9ucy5zY29yZU1lZGlhbikscmF3VmFsdWU6bWV0cmljUmVzdWx0LnRpbWluZyxkaXNwbGF5VmFsdWU6W1V0aWwuTVNfRElTUExBWV9WQUxVRSxtZXRyaWNSZXN1bHQudGltaW5nXX07fX0KbW9kdWxlLmV4cG9ydHM9U3BlZWRJbmRleDt9LHsiLi4vLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCI6NDgsIi4uL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9tZXRyaWNzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjbGFzcyBNZXRyaWNzIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidtZXRyaWNzJyxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuSU5GT1JNQVRJVkUsdGl0bGU6J01ldHJpY3MnLGRlc2NyaXB0aW9uOidDb2xsZWN0cyBhbGwgYXZhaWxhYmxlIG1ldHJpY3MuJyxyZXF1aXJlZEFydGlmYWN0czpbJ3RyYWNlcycsJ2RldnRvb2xzTG9ncyddfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBtZXRyaWNDb21wdXRhdGlvbkRhdGE9e3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzOmNvbnRleHQuc2V0dGluZ3N9O2NvbnN0IHRyYWNlT2ZUYWI9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RUcmFjZU9mVGFiKHRyYWNlKTtjb25zdCBzcGVlZGxpbmU9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RTcGVlZGxpbmUodHJhY2UpO2NvbnN0IGZpcnN0Q29udGVudGZ1bFBhaW50PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0Rmlyc3RDb250ZW50ZnVsUGFpbnQobWV0cmljQ29tcHV0YXRpb25EYXRhKTtjb25zdCBmaXJzdE1lYW5pbmdmdWxQYWludD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdEZpcnN0TWVhbmluZ2Z1bFBhaW50KG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3QgZmlyc3RDUFVJZGxlPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0Rmlyc3RDUFVJZGxlKG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3QgaW50ZXJhY3RpdmU9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RJbnRlcmFjdGl2ZShtZXRyaWNDb21wdXRhdGlvbkRhdGEpO2NvbnN0IHNwZWVkSW5kZXg9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RTcGVlZEluZGV4KG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3QgZXN0aW1hdGVkSW5wdXRMYXRlbmN5PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0RXN0aW1hdGVkSW5wdXRMYXRlbmN5KG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3QgbWV0cmljcz17Zmlyc3RDb250ZW50ZnVsUGFpbnQ6Zmlyc3RDb250ZW50ZnVsUGFpbnQudGltaW5nLGZpcnN0Q29udGVudGZ1bFBhaW50VHM6Zmlyc3RDb250ZW50ZnVsUGFpbnQudGltZXN0YW1wLGZpcnN0TWVhbmluZ2Z1bFBhaW50OmZpcnN0TWVhbmluZ2Z1bFBhaW50LnRpbWluZyxmaXJzdE1lYW5pbmdmdWxQYWludFRzOmZpcnN0TWVhbmluZ2Z1bFBhaW50LnRpbWVzdGFtcCxmaXJzdENQVUlkbGU6Zmlyc3RDUFVJZGxlLnRpbWluZyxmaXJzdENQVUlkbGVUczpmaXJzdENQVUlkbGUudGltZXN0YW1wLGludGVyYWN0aXZlOmludGVyYWN0aXZlLnRpbWluZyxpbnRlcmFjdGl2ZVRzOmludGVyYWN0aXZlLnRpbWVzdGFtcCxzcGVlZEluZGV4OnNwZWVkSW5kZXgudGltaW5nLHNwZWVkSW5kZXhUczpzcGVlZEluZGV4LnRpbWVzdGFtcCxlc3RpbWF0ZWRJbnB1dExhdGVuY3k6ZXN0aW1hdGVkSW5wdXRMYXRlbmN5LnRpbWluZyxlc3RpbWF0ZWRJbnB1dExhdGVuY3lUczplc3RpbWF0ZWRJbnB1dExhdGVuY3kudGltZXN0YW1wLG9ic2VydmVkTmF2aWdhdGlvblN0YXJ0OnRyYWNlT2ZUYWIudGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQsb2JzZXJ2ZWROYXZpZ2F0aW9uU3RhcnRUczp0cmFjZU9mVGFiLnRpbWVzdGFtcHMubmF2aWdhdGlvblN0YXJ0LG9ic2VydmVkRmlyc3RQYWludDp0cmFjZU9mVGFiLnRpbWluZ3MuZmlyc3RQYWludCxvYnNlcnZlZEZpcnN0UGFpbnRUczp0cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RQYWludCxvYnNlcnZlZEZpcnN0Q29udGVudGZ1bFBhaW50OnRyYWNlT2ZUYWIudGltaW5ncy5maXJzdENvbnRlbnRmdWxQYWludCxvYnNlcnZlZEZpcnN0Q29udGVudGZ1bFBhaW50VHM6dHJhY2VPZlRhYi50aW1lc3RhbXBzLmZpcnN0Q29udGVudGZ1bFBhaW50LG9ic2VydmVkRmlyc3RNZWFuaW5nZnVsUGFpbnQ6dHJhY2VPZlRhYi50aW1pbmdzLmZpcnN0TWVhbmluZ2Z1bFBhaW50LG9ic2VydmVkRmlyc3RNZWFuaW5nZnVsUGFpbnRUczp0cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RNZWFuaW5nZnVsUGFpbnQsb2JzZXJ2ZWRUcmFjZUVuZDp0cmFjZU9mVGFiLnRpbWluZ3MudHJhY2VFbmQsb2JzZXJ2ZWRUcmFjZUVuZFRzOnRyYWNlT2ZUYWIudGltZXN0YW1wcy50cmFjZUVuZCxvYnNlcnZlZExvYWQ6dHJhY2VPZlRhYi50aW1pbmdzLmxvYWQsb2JzZXJ2ZWRMb2FkVHM6dHJhY2VPZlRhYi50aW1lc3RhbXBzLmxvYWQsb2JzZXJ2ZWREb21Db250ZW50TG9hZGVkOnRyYWNlT2ZUYWIudGltaW5ncy5kb21Db250ZW50TG9hZGVkLG9ic2VydmVkRG9tQ29udGVudExvYWRlZFRzOnRyYWNlT2ZUYWIudGltZXN0YW1wcy5kb21Db250ZW50TG9hZGVkLG9ic2VydmVkRmlyc3RWaXN1YWxDaGFuZ2U6c3BlZWRsaW5lLmZpcnN0LG9ic2VydmVkRmlyc3RWaXN1YWxDaGFuZ2VUczooc3BlZWRsaW5lLmZpcnN0K3NwZWVkbGluZS5iZWdpbm5pbmcpKjEwMDAsb2JzZXJ2ZWRMYXN0VmlzdWFsQ2hhbmdlOnNwZWVkbGluZS5jb21wbGV0ZSxvYnNlcnZlZExhc3RWaXN1YWxDaGFuZ2VUczooc3BlZWRsaW5lLmNvbXBsZXRlK3NwZWVkbGluZS5iZWdpbm5pbmcpKjEwMDAsb2JzZXJ2ZWRTcGVlZEluZGV4OnNwZWVkbGluZS5zcGVlZEluZGV4LG9ic2VydmVkU3BlZWRJbmRleFRzOihzcGVlZGxpbmUuc3BlZWRJbmRleCtzcGVlZGxpbmUuYmVnaW5uaW5nKSoxMDAwfTtmb3IoY29uc3RbbmFtZSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhtZXRyaWNzKSl7Y29uc3Qga2V5PW5hbWU7aWYodHlwZW9mIHZhbHVlIT09J3VuZGVmaW5lZCcpe21ldHJpY3Nba2V5XT1NYXRoLnJvdW5kKHZhbHVlKTt9fQpjb25zdCBkZXRhaWxzPXtpdGVtczpbbWV0cmljc119O3JldHVybntzY29yZToxLHJhd1ZhbHVlOmludGVyYWN0aXZlLnRpbWluZyxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1NZXRyaWNzO30seyIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9taXhlZC1jb250ZW50IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y29uc3QgVXRpbD1yZXF1aXJlKCcuLi9yZXBvcnQvaHRtbC9yZW5kZXJlci91dGlsJyk7Y2xhc3MgTWl4ZWRDb250ZW50IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidtaXhlZC1jb250ZW50Jyx0aXRsZTonQWxsIHJlc291cmNlcyBsb2FkZWQgYXJlIHNlY3VyZScsZmFpbHVyZVRpdGxlOidTb21lIGluc2VjdXJlIHJlc291cmNlcyBjYW4gYmUgdXBncmFkZWQgdG8gSFRUUFMnLGRlc2NyaXB0aW9uOmBNaXhlZCBjb250ZW50IHdhcm5pbmdzIGNhbiBwcmV2ZW50IHlvdSBmcm9tIHVwZ3JhZGluZyB0byBIVFRQUy4KICAgICAgVGhpcyBhdWRpdCBzaG93cyB3aGljaCBpbnNlY3VyZSByZXNvdXJjZXMgdGhpcyBwYWdlIHVzZXMgdGhhdCBjYW4gYmUKICAgICAgdXBncmFkZWQgdG8gSFRUUFMuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvbWl4ZWQtY29udGVudClgLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJywnTWl4ZWRDb250ZW50J119O30Kc3RhdGljIHVwZ3JhZGVVUkwodXJsKXtjb25zdCBwYXJzZWRVUkw9bmV3IFVSTCh1cmwpO3BhcnNlZFVSTC5wcm90b2NvbD0naHR0cHM6JztyZXR1cm4gcGFyc2VkVVJMLmhyZWY7fQpzdGF0aWMgc2ltcGxpZnlVUkwodXJsKXtjb25zdCBwYXJzZWRVUkw9bmV3IFVSTCh1cmwpO3BhcnNlZFVSTC5oYXNoPScnO3BhcnNlZFVSTC5zZWFyY2g9Jyc7cmV0dXJuIHBhcnNlZFVSTC5ocmVmO30Kc3RhdGljIGRpc3BsYXlVUkwodXJsPScnKXtjb25zdCBkaXNwbGF5T3B0aW9ucz17bnVtUGF0aFBhcnRzOjQscHJlc2VydmVRdWVyeTpmYWxzZSxwcmVzZXJ2ZUhvc3Q6dHJ1ZX07cmV0dXJuIFVSTC5nZXRVUkxEaXNwbGF5TmFtZSh1cmwsZGlzcGxheU9wdGlvbnMpO30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgZGVmYXVsdExvZ3M9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IHVwZ3JhZGVMb2dzPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbJ21peGVkQ29udGVudFBhc3MnXTtjb25zdCBiYXNlSG9zdG5hbWU9bmV3IFVSTChhcnRpZmFjdHMuTWl4ZWRDb250ZW50LnVybCkuaG9zdDtjb25zdCBjb21wdXRlZEFydGlmYWN0cz1bYXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3JkcyhkZWZhdWx0TG9ncyksYXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3Jkcyh1cGdyYWRlTG9ncyldO3JldHVybiBQcm9taXNlLmFsbChjb21wdXRlZEFydGlmYWN0cykudGhlbigoW2RlZmF1bHRSZWNvcmRzLHVwZ3JhZGVkUmVjb3Jkc10pPT57Y29uc3QgaW5zZWN1cmVSZWNvcmRzPWRlZmF1bHRSZWNvcmRzLmZpbHRlcihyZWNvcmQ9PiFyZWNvcmQuaXNTZWN1cmUpO2NvbnN0IHNlY3VyZVJlY29yZHM9ZGVmYXVsdFJlY29yZHMuZmlsdGVyKHJlY29yZD0+cmVjb3JkLmlzU2VjdXJlKTtjb25zdCB1cGdyYWRlUGFzc0hvc3RzPW5ldyBTZXQoKTtjb25zdCB1cGdyYWRlUGFzc1NlY3VyZUhvc3RzPW5ldyBTZXQoKTt1cGdyYWRlZFJlY29yZHMuZm9yRWFjaChyZWNvcmQ9Pnt1cGdyYWRlUGFzc0hvc3RzLmFkZChuZXcgVVJMKHJlY29yZC51cmwpLmhvc3RuYW1lKTtpZihyZWNvcmQuaXNTZWN1cmUmJnJlY29yZC5maW5pc2hlZCYmIXJlY29yZC5mYWlsZWQpe3VwZ3JhZGVQYXNzU2VjdXJlSG9zdHMuYWRkKG5ldyBVUkwocmVjb3JkLnVybCkuaG9zdG5hbWUpO319KTtjb25zdCBzZWVuPW5ldyBTZXQoKTtjb25zdCB1cGdyYWRlYWJsZVJlc291cmNlcz1bXTtmb3IoY29uc3QgcmVjb3JkIG9mIGluc2VjdXJlUmVjb3Jkcyl7Y29uc3Qgc2ltcGxlVXJsPXRoaXMuc2ltcGxpZnlVUkwocmVjb3JkLnVybCk7aWYoc2Vlbi5oYXMoc2ltcGxlVXJsKSljb250aW51ZTtzZWVuLmFkZChzaW1wbGVVcmwpO2NvbnN0IHJlc291cmNlPXtob3N0Om5ldyBVUkwocmVjb3JkLnVybCkuaG9zdG5hbWUsZnVsbFVybDpyZWNvcmQudXJsLHJlZmVycmVyRG9jVXJsOnRoaXMuZGlzcGxheVVSTChyZWNvcmQuZG9jdW1lbnRVUkwpfTtpZighdXBncmFkZVBhc3NTZWN1cmVIb3N0cy5oYXMocmVzb3VyY2UuaG9zdCkpY29udGludWU7aWYoIXJlc291cmNlLnJlZmVycmVyRG9jVXJsLmluY2x1ZGVzKGJhc2VIb3N0bmFtZSkpY29udGludWU7dXBncmFkZWFibGVSZXNvdXJjZXMucHVzaChyZXNvdXJjZSk7fQpjb25zdCBkaXNwbGF5VmFsdWU9YCR7VXRpbC5mb3JtYXROdW1iZXIodXBncmFkZWFibGVSZXNvdXJjZXMubGVuZ3RoKX0KICAgICAgICAgICR7dXBncmFkZWFibGVSZXNvdXJjZXMubGVuZ3RoPT09MT8ncmVxdWVzdCc6J3JlcXVlc3RzJ31gO2NvbnN0IGhlYWRpbmdzPVt7a2V5OidmdWxsVXJsJyxpdGVtVHlwZTondXJsJyx0ZXh0OidVUkwnfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHVwZ3JhZGVhYmxlUmVzb3VyY2VzKTtjb25zdCB0b3RhbFJlY29yZHM9ZGVmYXVsdFJlY29yZHMubGVuZ3RoO2NvbnN0IHNjb3JlPShzZWN1cmVSZWNvcmRzLmxlbmd0aCswLjUqdXBncmFkZWFibGVSZXNvdXJjZXMubGVuZ3RoKS90b3RhbFJlY29yZHM7cmV0dXJue3Jhd1ZhbHVlOnVwZ3JhZGVhYmxlUmVzb3VyY2VzLmxlbmd0aD09PTAsc2NvcmUsZGlzcGxheVZhbHVlOmRpc3BsYXlWYWx1ZSxkZXRhaWxzfTt9KTt9fQptb2R1bGUuZXhwb3J0cz1NaXhlZENvbnRlbnQ7fSx7Ii4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwiOjQ4LCIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9uZXR3b3JrLXJlcXVlc3RzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y2xhc3MgTmV0d29ya1JlcXVlc3RzIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOiduZXR3b3JrLXJlcXVlc3RzJyxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuSU5GT1JNQVRJVkUsdGl0bGU6J05ldHdvcmsgUmVxdWVzdHMnLGRlc2NyaXB0aW9uOidMaXN0cyB0aGUgbmV0d29yayByZXF1ZXN0cyB0aGF0IHdlcmUgbWFkZSBkdXJpbmcgcGFnZSBsb2FkLicscmVxdWlyZWRBcnRpZmFjdHM6WydkZXZ0b29sc0xvZ3MnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2cpLnRoZW4ocmVjb3Jkcz0+e2NvbnN0IGVhcmxpZXN0U3RhcnRUaW1lPXJlY29yZHMucmVkdWNlKChtaW4scmVjb3JkKT0+TWF0aC5taW4obWluLHJlY29yZC5zdGFydFRpbWUpLEluZmluaXR5KTtjb25zdCB0aW1lVG9Ncz10aW1lPT50aW1lPGVhcmxpZXN0U3RhcnRUaW1lfHwhTnVtYmVyLmlzRmluaXRlKHRpbWUpP3VuZGVmaW5lZDoodGltZS1lYXJsaWVzdFN0YXJ0VGltZSkqMTAwMDtjb25zdCByZXN1bHRzPXJlY29yZHMubWFwKHJlY29yZD0+e3JldHVybnt1cmw6VVJMLmVsaWRlRGF0YVVSSShyZWNvcmQudXJsKSxzdGFydFRpbWU6dGltZVRvTXMocmVjb3JkLnN0YXJ0VGltZSksZW5kVGltZTp0aW1lVG9NcyhyZWNvcmQuZW5kVGltZSksdHJhbnNmZXJTaXplOnJlY29yZC50cmFuc2ZlclNpemUsc3RhdHVzQ29kZTpyZWNvcmQuc3RhdHVzQ29kZSxtaW1lVHlwZTpyZWNvcmQubWltZVR5cGUscmVzb3VyY2VUeXBlOnJlY29yZC5yZXNvdXJjZVR5cGV9O30pO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLGl0ZW1UeXBlOid1cmwnLHRleHQ6J1VSTCd9LHtrZXk6J3N0YXJ0VGltZScsaXRlbVR5cGU6J21zJyxncmFudWxhcml0eToxLHRleHQ6J1N0YXJ0IFRpbWUnfSx7a2V5OidlbmRUaW1lJyxpdGVtVHlwZTonbXMnLGdyYW51bGFyaXR5OjEsdGV4dDonRW5kIFRpbWUnfSx7a2V5Oid0cmFuc2ZlclNpemUnLGl0ZW1UeXBlOidieXRlcycsZGlzcGxheVVuaXQ6J2tiJyxncmFudWxhcml0eToxLHRleHQ6J1RyYW5zZmVyIFNpemUnfSx7a2V5OidzdGF0dXNDb2RlJyxpdGVtVHlwZTondGV4dCcsdGV4dDonU3RhdHVzIENvZGUnfSx7a2V5OidtaW1lVHlwZScsaXRlbVR5cGU6J3RleHQnLHRleHQ6J01JTUUgVHlwZSd9LHtrZXk6J3Jlc291cmNlVHlwZScsaXRlbVR5cGU6J3RleHQnLHRleHQ6J1Jlc291cmNlIFR5cGUnfV07Y29uc3QgdGFibGVEZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyk7cmV0dXJue3Njb3JlOjEscmF3VmFsdWU6cmVzdWx0cy5sZW5ndGgsZGV0YWlsczp0YWJsZURldGFpbHN9O30pO319Cm1vZHVsZS5leHBvcnRzPU5ldHdvcmtSZXF1ZXN0czt9LHsiLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvcHJlZGljdGl2ZS1wZXJmIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjb25zdCBTQ09SSU5HX1BPSU5UX09GX0RJTUlOSVNISU5HX1JFVFVSTlM9MTcwMDtjb25zdCBTQ09SSU5HX01FRElBTj0xMDAwMDtjbGFzcyBQcmVkaWN0aXZlUGVyZiBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDoncHJlZGljdGl2ZS1wZXJmJyx0aXRsZTonUHJlZGljdGVkIFBlcmZvcm1hbmNlIChiZXRhKScsZGVzY3JpcHRpb246J1ByZWRpY3RlZCBwZXJmb3JtYW5jZSBldmFsdWF0ZXMgaG93IHlvdXIgc2l0ZSB3aWxsIHBlcmZvcm0gdW5kZXIgJysnYSAzRyBjb25uZWN0aW9uIG9uIGEgbW9iaWxlIGRldmljZS4nLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBzZXR0aW5ncz17fTtjb25zdCBmY3A9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RMYW50ZXJuRmlyc3RDb250ZW50ZnVsUGFpbnQoe3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzfSk7Y29uc3QgZm1wPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TGFudGVybkZpcnN0TWVhbmluZ2Z1bFBhaW50KHt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nc30pO2NvbnN0IHR0aT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdExhbnRlcm5JbnRlcmFjdGl2ZSh7dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3N9KTtjb25zdCB0dGZjcHVpPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TGFudGVybkZpcnN0Q1BVSWRsZSh7dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3N9KTtjb25zdCBzaT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdExhbnRlcm5TcGVlZEluZGV4KHt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nc30pO2NvbnN0IGVpbD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdExhbnRlcm5Fc3RpbWF0ZWRJbnB1dExhdGVuY3koe3RyYWNlLGRldnRvb2xzTG9nLHNldHRpbmdzfSk7Y29uc3QgdmFsdWVzPXtyb3VnaEVzdGltYXRlT2ZGQ1A6ZmNwLnRpbWluZyxvcHRpbWlzdGljRkNQOmZjcC5vcHRpbWlzdGljRXN0aW1hdGUudGltZUluTXMscGVzc2ltaXN0aWNGQ1A6ZmNwLnBlc3NpbWlzdGljRXN0aW1hdGUudGltZUluTXMscm91Z2hFc3RpbWF0ZU9mRk1QOmZtcC50aW1pbmcsb3B0aW1pc3RpY0ZNUDpmbXAub3B0aW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zLHBlc3NpbWlzdGljRk1QOmZtcC5wZXNzaW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zLHJvdWdoRXN0aW1hdGVPZlRUSTp0dGkudGltaW5nLG9wdGltaXN0aWNUVEk6dHRpLm9wdGltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcyxwZXNzaW1pc3RpY1RUSTp0dGkucGVzc2ltaXN0aWNFc3RpbWF0ZS50aW1lSW5Ncyxyb3VnaEVzdGltYXRlT2ZUVEZDUFVJOnR0ZmNwdWkudGltaW5nLG9wdGltaXN0aWNUVEZDUFVJOnR0ZmNwdWkub3B0aW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zLHBlc3NpbWlzdGljVFRGQ1BVSTp0dGZjcHVpLnBlc3NpbWlzdGljRXN0aW1hdGUudGltZUluTXMscm91Z2hFc3RpbWF0ZU9mU0k6c2kudGltaW5nLG9wdGltaXN0aWNTSTpzaS5vcHRpbWlzdGljRXN0aW1hdGUudGltZUluTXMscGVzc2ltaXN0aWNTSTpzaS5wZXNzaW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zLHJvdWdoRXN0aW1hdGVPZkVJTDplaWwudGltaW5nLG9wdGltaXN0aWNFSUw6ZWlsLm9wdGltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcyxwZXNzaW1pc3RpY0VJTDplaWwucGVzc2ltaXN0aWNFc3RpbWF0ZS50aW1lSW5Nc307Y29uc3Qgc2NvcmU9QXVkaXQuY29tcHV0ZUxvZ05vcm1hbFNjb3JlKHZhbHVlcy5yb3VnaEVzdGltYXRlT2ZUVEksU0NPUklOR19QT0lOVF9PRl9ESU1JTklTSElOR19SRVRVUk5TLFNDT1JJTkdfTUVESUFOKTtyZXR1cm57c2NvcmUscmF3VmFsdWU6dmFsdWVzLnJvdWdoRXN0aW1hdGVPZlRUSSxkaXNwbGF5VmFsdWU6VXRpbC5mb3JtYXRNaWxsaXNlY29uZHModmFsdWVzLnJvdWdoRXN0aW1hdGVPZlRUSSksZGV0YWlsczp7aXRlbXM6W3ZhbHVlc119fTt9fQptb2R1bGUuZXhwb3J0cz1QcmVkaWN0aXZlUGVyZjt9LHsiLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCI6NDgsIi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL3JlZGlyZWN0cy1odHRwIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjbGFzcyBSZWRpcmVjdHNIVFRQIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidyZWRpcmVjdHMtaHR0cCcsdGl0bGU6J1JlZGlyZWN0cyBIVFRQIHRyYWZmaWMgdG8gSFRUUFMnLGZhaWx1cmVUaXRsZTonRG9lcyBub3QgcmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTJyxkZXNjcmlwdGlvbjonSWYgeW91XCd2ZSBhbHJlYWR5IHNldCB1cCBIVFRQUywgbWFrZSBzdXJlIHRoYXQgeW91IHJlZGlyZWN0IGFsbCBIVFRQICcrJ3RyYWZmaWMgdG8gSFRUUFMuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvaHR0cC1yZWRpcmVjdHMtdG8taHR0cHMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydIVFRQUmVkaXJlY3QnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtyZXR1cm57cmF3VmFsdWU6YXJ0aWZhY3RzLkhUVFBSZWRpcmVjdC52YWx1ZX07fX0KbW9kdWxlLmV4cG9ydHM9UmVkaXJlY3RzSFRUUDt9LHsiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvcmVkaXJlY3RzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVbnVzZWRCeXRlcz1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjbGFzcyBSZWRpcmVjdHMgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3JlZGlyZWN0cycsdGl0bGU6J0F2b2lkIG11bHRpcGxlIHBhZ2UgcmVkaXJlY3RzJyxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQyxkZXNjcmlwdGlvbjonUmVkaXJlY3RzIGludHJvZHVjZSBhZGRpdGlvbmFsIGRlbGF5cyBiZWZvcmUgdGhlIHBhZ2UgY2FuIGJlIGxvYWRlZC4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9yZWRpcmVjdHMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydVUkwnLCdkZXZ0b29sc0xvZ3MnLCd0cmFjZXMnXX07fQpzdGF0aWMgYXN5bmMgYXVkaXQoYXJ0aWZhY3RzLGNvbnRleHQpe2NvbnN0IHNldHRpbmdzPWNvbnRleHQuc2V0dGluZ3M7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCB0cmFjZU9mVGFiPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0VHJhY2VPZlRhYih0cmFjZSk7Y29uc3QgbmV0d29ya1JlY29yZHM9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3JkcyhkZXZ0b29sc0xvZyk7Y29uc3QgbWFpblJlc291cmNlPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TWFpblJlc291cmNlKHtVUkw6YXJ0aWZhY3RzLlVSTCxkZXZ0b29sc0xvZ30pO2NvbnN0IG1ldHJpY0NvbXB1dGF0aW9uRGF0YT17dHJhY2UsZGV2dG9vbHNMb2csdHJhY2VPZlRhYixuZXR3b3JrUmVjb3JkcyxzZXR0aW5nc307Y29uc3QgbWV0cmljUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TGFudGVybkludGVyYWN0aXZlKG1ldHJpY0NvbXB1dGF0aW9uRGF0YSk7Y29uc3Qgbm9kZVRpbWluZ3NCeVVybD1uZXcgTWFwKCk7Zm9yKGNvbnN0W25vZGUsdGltaW5nXW9mIG1ldHJpY1Jlc3VsdC5wZXNzaW1pc3RpY0VzdGltYXRlLm5vZGVUaW1pbmdzLmVudHJpZXMoKSl7aWYobm9kZS50eXBlPT09J25ldHdvcmsnKXtjb25zdCBuZXR3b3JrTm9kZT1ub2RlO25vZGVUaW1pbmdzQnlVcmwuc2V0KG5ldHdvcmtOb2RlLnJlY29yZC51cmwsdGltaW5nKTt9fQpjb25zdCByZWRpcmVjdFJlcXVlc3RzPUFycmF5LmZyb20obWFpblJlc291cmNlLnJlZGlyZWN0c3x8W10pO3JlZGlyZWN0UmVxdWVzdHMucHVzaChtYWluUmVzb3VyY2UpO2xldCB0b3RhbFdhc3RlZE1zPTA7Y29uc3QgcGFnZVJlZGlyZWN0cz1bXTtpZihyZWRpcmVjdFJlcXVlc3RzLmxlbmd0aD4xKXtwYWdlUmVkaXJlY3RzLnB1c2goe3VybDpgKEluaXRpYWw6ICR7cmVkaXJlY3RSZXF1ZXN0c1swXS51cmx9KWAsd2FzdGVkTXM6MH0pO30KZm9yKGxldCBpPTE7aTxyZWRpcmVjdFJlcXVlc3RzLmxlbmd0aDtpKyspe2NvbnN0IGluaXRpYWxSZXF1ZXN0PXJlZGlyZWN0UmVxdWVzdHNbaS0xXTtjb25zdCByZWRpcmVjdGVkUmVxdWVzdD1yZWRpcmVjdFJlcXVlc3RzW2ldO2NvbnN0IGluaXRpYWxUaW1pbmc9bm9kZVRpbWluZ3NCeVVybC5nZXQoaW5pdGlhbFJlcXVlc3QudXJsKTtjb25zdCByZWRpcmVjdGVkVGltaW5nPW5vZGVUaW1pbmdzQnlVcmwuZ2V0KHJlZGlyZWN0ZWRSZXF1ZXN0LnVybCk7aWYoIWluaXRpYWxUaW1pbmd8fCFyZWRpcmVjdGVkVGltaW5nKXt0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0cyBpbiBncmFwaCcpO30KY29uc3Qgd2FzdGVkTXM9cmVkaXJlY3RlZFRpbWluZy5zdGFydFRpbWUtaW5pdGlhbFRpbWluZy5zdGFydFRpbWU7dG90YWxXYXN0ZWRNcys9d2FzdGVkTXM7cGFnZVJlZGlyZWN0cy5wdXNoKHt1cmw6cmVkaXJlY3RlZFJlcXVlc3QudXJsLHdhc3RlZE1zfSk7fQpjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyxpdGVtVHlwZTondGV4dCcsdGV4dDonUmVkaXJlY3RlZCBVUkwnfSx7a2V5Oid3YXN0ZWRNcycsaXRlbVR5cGU6J21zJyx0ZXh0OidUaW1lIGZvciBSZWRpcmVjdCd9XTtjb25zdCBzdW1tYXJ5PXt3YXN0ZWRNczp0b3RhbFdhc3RlZE1zfTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MscGFnZVJlZGlyZWN0cyxzdW1tYXJ5KTtyZXR1cm57c2NvcmU6cmVkaXJlY3RSZXF1ZXN0cy5sZW5ndGg8PTI/MTpVbnVzZWRCeXRlcy5zY29yZUZvcldhc3RlZE1zKHRvdGFsV2FzdGVkTXMpLHJhd1ZhbHVlOnRvdGFsV2FzdGVkTXMsZGlzcGxheVZhbHVlOlsnJWRceGEwbXMnLHRvdGFsV2FzdGVkTXNdLGV4dGVuZGVkSW5mbzp7dmFsdWU6e3dhc3RlZE1zOnRvdGFsV2FzdGVkTXN9fSxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1SZWRpcmVjdHM7fSx7Ii4vYXVkaXQiOjIsIi4vYnl0ZS1lZmZpY2llbmN5L2J5dGUtZWZmaWNpZW5jeS1hdWRpdCI6M31dLCIuLi9hdWRpdHMvc2NyZWVuc2hvdC10aHVtYm5haWxzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBMSEVycm9yPXJlcXVpcmUoJy4uL2xpYi9lcnJvcnMnKTtjb25zdCBqcGVnPXJlcXVpcmUoJ2pwZWctanMnKTtjb25zdCBOVU1CRVJfT0ZfVEhVTUJOQUlMUz0xMDtjb25zdCBUSFVNQk5BSUxfV0lEVEg9MTIwO2NsYXNzIFNjcmVlbnNob3RUaHVtYm5haWxzIGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidzY3JlZW5zaG90LXRodW1ibmFpbHMnLHNjb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5JTkZPUk1BVElWRSx0aXRsZTonU2NyZWVuc2hvdCBUaHVtYm5haWxzJyxkZXNjcmlwdGlvbjonVGhpcyBpcyB3aGF0IHRoZSBsb2FkIG9mIHlvdXIgc2l0ZSBsb29rZWQgbGlrZS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsndHJhY2VzJywnZGV2dG9vbHNMb2dzJ119O30Kc3RhdGljIHNjYWxlSW1hZ2VUb1RodW1ibmFpbChpbWFnZURhdGEpe2NvbnN0IHNjYWxlZFdpZHRoPVRIVU1CTkFJTF9XSURUSDtjb25zdCBzY2FsZUZhY3Rvcj1pbWFnZURhdGEud2lkdGgvc2NhbGVkV2lkdGg7Y29uc3Qgc2NhbGVkSGVpZ2h0PU1hdGguZmxvb3IoaW1hZ2VEYXRhLmhlaWdodC9zY2FsZUZhY3Rvcik7Y29uc3Qgb3V0UGl4ZWxzPW5ldyBVaW50OEFycmF5KHNjYWxlZFdpZHRoKnNjYWxlZEhlaWdodCo0KTtmb3IobGV0IGk9MDtpPHNjYWxlZFdpZHRoO2krKyl7Zm9yKGxldCBqPTA7ajxzY2FsZWRIZWlnaHQ7aisrKXtjb25zdCBvcmlnWD1NYXRoLmZsb29yKGkqc2NhbGVGYWN0b3IpO2NvbnN0IG9yaWdZPU1hdGguZmxvb3IoaipzY2FsZUZhY3Rvcik7Y29uc3Qgb3JpZ1Bvcz0ob3JpZ1kqaW1hZ2VEYXRhLndpZHRoK29yaWdYKSo0O2NvbnN0IG91dFBvcz0oaipzY2FsZWRXaWR0aCtpKSo0O291dFBpeGVsc1tvdXRQb3NdPWltYWdlRGF0YS5kYXRhW29yaWdQb3NdO291dFBpeGVsc1tvdXRQb3MrMV09aW1hZ2VEYXRhLmRhdGFbb3JpZ1BvcysxXTtvdXRQaXhlbHNbb3V0UG9zKzJdPWltYWdlRGF0YS5kYXRhW29yaWdQb3MrMl07b3V0UGl4ZWxzW291dFBvcyszXT1pbWFnZURhdGEuZGF0YVtvcmlnUG9zKzNdO319CnJldHVybnt3aWR0aDpzY2FsZWRXaWR0aCxoZWlnaHQ6c2NhbGVkSGVpZ2h0LGRhdGE6b3V0UGl4ZWxzfTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1tBdWRpdC5ERUZBVUxUX1BBU1NdO2NvbnN0IGNhY2hlZFRodW1ibmFpbHM9bmV3IE1hcCgpO2NvbnN0IHNwZWVkbGluZT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdFNwZWVkbGluZSh0cmFjZSk7bGV0IG1pbmltdW1UaW1lbGluZUR1cmF0aW9uPWNvbnRleHQub3B0aW9ucy5taW5pbXVtVGltZWxpbmVEdXJhdGlvbnx8MzAwMDtpZihjb250ZXh0LnNldHRpbmdzLnRocm90dGxpbmdNZXRob2QhPT0nc2ltdWxhdGUnKXtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgbWV0cmljQ29tcHV0YXRpb25EYXRhPXt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nczpjb250ZXh0LnNldHRpbmdzfTtjb25zdCB0dGk9YXJ0aWZhY3RzLnJlcXVlc3RJbnRlcmFjdGl2ZShtZXRyaWNDb21wdXRhdGlvbkRhdGEpO3RyeXttaW5pbXVtVGltZWxpbmVEdXJhdGlvbj1NYXRoLm1heCgoYXdhaXQgdHRpKS50aW1pbmcsbWluaW11bVRpbWVsaW5lRHVyYXRpb24pO31jYXRjaChfKXt9fQpjb25zdCB0aHVtYm5haWxzPVtdO2NvbnN0IGFuYWx5emVkRnJhbWVzPXNwZWVkbGluZS5mcmFtZXMuZmlsdGVyKGZyYW1lPT4hZnJhbWUuaXNQcm9ncmVzc0ludGVycG9sYXRlZCgpKTtjb25zdCBtYXhGcmFtZVRpbWU9c3BlZWRsaW5lLmNvbXBsZXRlfHxNYXRoLm1heCguLi5zcGVlZGxpbmUuZnJhbWVzLm1hcChmcmFtZT0+ZnJhbWUuZ2V0VGltZVN0YW1wKCktc3BlZWRsaW5lLmJlZ2lubmluZykpO2NvbnN0IHRpbWVsaW5lRW5kPU1hdGgubWF4KG1heEZyYW1lVGltZSxtaW5pbXVtVGltZWxpbmVEdXJhdGlvbik7aWYoIWFuYWx5emVkRnJhbWVzLmxlbmd0aHx8IU51bWJlci5pc0Zpbml0ZSh0aW1lbGluZUVuZCkpe3Rocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLklOVkFMSURfU1BFRURMSU5FKTt9CmZvcihsZXQgaT0xO2k8PU5VTUJFUl9PRl9USFVNQk5BSUxTO2krKyl7Y29uc3QgdGFyZ2V0VGltZXN0YW1wPXNwZWVkbGluZS5iZWdpbm5pbmcrdGltZWxpbmVFbmQqaS9OVU1CRVJfT0ZfVEhVTUJOQUlMUztsZXQgZnJhbWVGb3JUaW1lc3RhbXA9bnVsbDtpZihpPT09TlVNQkVSX09GX1RIVU1CTkFJTFMpe2ZyYW1lRm9yVGltZXN0YW1wPWFuYWx5emVkRnJhbWVzW2FuYWx5emVkRnJhbWVzLmxlbmd0aC0xXTt9ZWxzZXthbmFseXplZEZyYW1lcy5mb3JFYWNoKGZyYW1lPT57aWYoZnJhbWUuZ2V0VGltZVN0YW1wKCk8PXRhcmdldFRpbWVzdGFtcCl7ZnJhbWVGb3JUaW1lc3RhbXA9ZnJhbWU7fX0pO30KY29uc3QgaW1hZ2VEYXRhPWZyYW1lRm9yVGltZXN0YW1wLmdldFBhcnNlZEltYWdlKCk7Y29uc3QgdGh1bWJuYWlsSW1hZ2VEYXRhPVNjcmVlbnNob3RUaHVtYm5haWxzLnNjYWxlSW1hZ2VUb1RodW1ibmFpbChpbWFnZURhdGEpO2NvbnN0IGJhc2U2NERhdGE9Y2FjaGVkVGh1bWJuYWlscy5nZXQoZnJhbWVGb3JUaW1lc3RhbXApfHxqcGVnLmVuY29kZSh0aHVtYm5haWxJbWFnZURhdGEsOTApLmRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpO2NhY2hlZFRodW1ibmFpbHMuc2V0KGZyYW1lRm9yVGltZXN0YW1wLGJhc2U2NERhdGEpO3RodW1ibmFpbHMucHVzaCh7dGltaW5nOk1hdGgucm91bmQodGFyZ2V0VGltZXN0YW1wLXNwZWVkbGluZS5iZWdpbm5pbmcpLHRpbWVzdGFtcDp0YXJnZXRUaW1lc3RhbXAqMTAwMCxkYXRhOmJhc2U2NERhdGF9KTt9CnJldHVybntzY29yZToxLHJhd1ZhbHVlOnRodW1ibmFpbHMubGVuZ3RoPjAsZGV0YWlsczp7dHlwZTonZmlsbXN0cmlwJyxzY2FsZTp0aW1lbGluZUVuZCxpdGVtczp0aHVtYm5haWxzfX07fX0KbW9kdWxlLmV4cG9ydHM9U2NyZWVuc2hvdFRodW1ibmFpbHM7fSx7Ii4uL2xpYi9lcnJvcnMiOjMzLCIuL2F1ZGl0IjoyLCJqcGVnLWpzIjoxMjJ9XSwiLi4vYXVkaXRzL3Nlby9jYW5vbmljYWwiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBMaW5rSGVhZGVyPXJlcXVpcmUoJ2h0dHAtbGluay1oZWFkZXInKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgTElOS19IRUFERVI9J2xpbmsnO2Z1bmN0aW9uIGdldENhbm9uaWNhbExpbmtzRnJvbUhlYWRlcihoZWFkZXJWYWx1ZSl7Y29uc3QgbGlua0hlYWRlcj1MaW5rSGVhZGVyLnBhcnNlKGhlYWRlclZhbHVlKTtyZXR1cm4gbGlua0hlYWRlci5nZXQoJ3JlbCcsJ2Nhbm9uaWNhbCcpLm1hcChjPT5jLnVyaSk7fQpmdW5jdGlvbiBnZXRIcmVmbGFuZ3NGcm9tSGVhZGVyKGhlYWRlclZhbHVlKXtjb25zdCBsaW5rSGVhZGVyPUxpbmtIZWFkZXIucGFyc2UoaGVhZGVyVmFsdWUpO3JldHVybiBsaW5rSGVhZGVyLmdldCgncmVsJywnYWx0ZXJuYXRlJykubWFwKGg9PmgudXJpKTt9CmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZU9yQWJzb2x1dGVVUkwodXJsKXt0cnl7bmV3IFVSTCh1cmwsJ2h0dHBzOi8vZXhhbXBsZS5jb20vJyk7cmV0dXJuIHRydWU7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9fQpmdW5jdGlvbiBnZXRQcmltYXJ5RG9tYWluKHVybCl7cmV0dXJuIHVybC5ob3N0bmFtZS5zcGxpdCgnLicpLnNsaWNlKC0yKS5qb2luKCcuJyk7fQpjbGFzcyBDYW5vbmljYWwgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2Nhbm9uaWNhbCcsdGl0bGU6J0RvY3VtZW50IGhhcyBhIHZhbGlkIGByZWw9Y2Fub25pY2FsYCcsZmFpbHVyZVRpdGxlOidEb2N1bWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgYHJlbD1jYW5vbmljYWxgJyxkZXNjcmlwdGlvbjonQ2Fub25pY2FsIGxpbmtzIHN1Z2dlc3Qgd2hpY2ggVVJMIHRvIHNob3cgaW4gc2VhcmNoIHJlc3VsdHMuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvY2Fub25pY2FsKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnQ2Fub25pY2FsJywnSHJlZmxhbmcnLCdVUkwnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TWFpblJlc291cmNlKHtkZXZ0b29sc0xvZyxVUkw6YXJ0aWZhY3RzLlVSTH0pLnRoZW4obWFpblJlc291cmNlPT57Y29uc3QgYmFzZVVSTD1uZXcgVVJMKG1haW5SZXNvdXJjZS51cmwpO2xldCBjYW5vbmljYWxzPVtdO2xldCBocmVmbGFuZ3M9W107bWFpblJlc291cmNlLnJlc3BvbnNlSGVhZGVycyYmbWFpblJlc291cmNlLnJlc3BvbnNlSGVhZGVycy5maWx0ZXIoaD0+aC5uYW1lLnRvTG93ZXJDYXNlKCk9PT1MSU5LX0hFQURFUikuZm9yRWFjaChoPT57Y2Fub25pY2Fscz1jYW5vbmljYWxzLmNvbmNhdChnZXRDYW5vbmljYWxMaW5rc0Zyb21IZWFkZXIoaC52YWx1ZSkpO2hyZWZsYW5ncz1ocmVmbGFuZ3MuY29uY2F0KGdldEhyZWZsYW5nc0Zyb21IZWFkZXIoaC52YWx1ZSkpO30pO2Zvcihjb25zdCBjYW5vbmljYWwgb2YgYXJ0aWZhY3RzLkNhbm9uaWNhbCl7aWYoY2Fub25pY2FsIT09bnVsbCl7Y2Fub25pY2Fscy5wdXNoKGNhbm9uaWNhbCk7fX0KY2Fub25pY2Fscz1BcnJheS5mcm9tKG5ldyBTZXQoY2Fub25pY2FscykpO2FydGlmYWN0cy5IcmVmbGFuZy5mb3JFYWNoKCh7aHJlZn0pPT5ocmVmbGFuZ3MucHVzaChocmVmKSk7aHJlZmxhbmdzPWhyZWZsYW5ncy5maWx0ZXIoaHJlZj0+aXNWYWxpZFJlbGF0aXZlT3JBYnNvbHV0ZVVSTChocmVmKSkubWFwKGhyZWY9Pm5ldyBVUkwoaHJlZixiYXNlVVJMKS5ocmVmKTtpZihjYW5vbmljYWxzLmxlbmd0aD09PTApe3JldHVybntyYXdWYWx1ZTp0cnVlLG5vdEFwcGxpY2FibGU6dHJ1ZX07fQppZihjYW5vbmljYWxzLmxlbmd0aD4xKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZXhwbGFuYXRpb246YE11bHRpcGxlIGNvbmZsaWN0aW5nIFVSTHMgKCR7Y2Fub25pY2Fscy5qb2luKCcsICcpfSlgfTt9CmNvbnN0IGNhbm9uaWNhbD1jYW5vbmljYWxzWzBdO2lmKCFpc1ZhbGlkUmVsYXRpdmVPckFic29sdXRlVVJMKGNhbm9uaWNhbCkpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjpgSW52YWxpZCBVUkwgKCR7Y2Fub25pY2FsfSlgfTt9CmlmKCFVUkwuaXNWYWxpZChjYW5vbmljYWwpKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZXhwbGFuYXRpb246YFJlbGF0aXZlIFVSTCAoJHtjYW5vbmljYWx9KWB9O30KY29uc3QgY2Fub25pY2FsVVJMPW5ldyBVUkwoY2Fub25pY2FsKTtpZihocmVmbGFuZ3MuaW5jbHVkZXMoYmFzZVVSTC5ocmVmKSYmaHJlZmxhbmdzLmluY2x1ZGVzKGNhbm9uaWNhbFVSTC5ocmVmKSYmYmFzZVVSTC5ocmVmIT09Y2Fub25pY2FsVVJMLmhyZWYpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjpgUG9pbnRzIHRvIGFub3RoZXIgaHJlZmxhbmcgbG9jYXRpb24gKCR7YmFzZVVSTC5ocmVmfSlgfTt9CmlmKGdldFByaW1hcnlEb21haW4oY2Fub25pY2FsVVJMKSE9PWdldFByaW1hcnlEb21haW4oYmFzZVVSTCkpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjpgUG9pbnRzIHRvIGEgZGlmZmVyZW50IGRvbWFpbiAoJHtjYW5vbmljYWxVUkx9KWB9O30KaWYoY2Fub25pY2FsVVJMLm9yaWdpbj09PWJhc2VVUkwub3JpZ2luJiZjYW5vbmljYWxVUkwucGF0aG5hbWU9PT0nLycmJmJhc2VVUkwucGF0aG5hbWUhPT0nLycpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjonUG9pbnRzIHRvIGEgcm9vdCBvZiB0aGUgc2FtZSBvcmlnaW4nfTt9CnJldHVybntyYXdWYWx1ZTp0cnVlfTt9KTt9fQptb2R1bGUuZXhwb3J0cz1DYW5vbmljYWw7fSx7Ii4uLy4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4uL2F1ZGl0IjoyLCJodHRwLWxpbmstaGVhZGVyIjoxMTl9XSwiLi4vYXVkaXRzL3Nlby9mb250LXNpemUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgVmlld3BvcnRBdWRpdD1yZXF1aXJlKCcuLi92aWV3cG9ydCcpO2NvbnN0IFdlYkluc3BlY3Rvcj1yZXF1aXJlKCcuLi8uLi9saWIvd2ViLWluc3BlY3RvcicpO2NvbnN0IENTU1N0eWxlRGVjbGFyYXRpb249V2ViSW5zcGVjdG9yLkNTU1N0eWxlRGVjbGFyYXRpb247Y29uc3QgTUlOSU1BTF9QRVJDRU5UQUdFX09GX0xFR0lCTEVfVEVYVD02MDtmdW5jdGlvbiBnZXRVbmlxdWVGYWlsaW5nUnVsZXMoZm9udFNpemVBcnRpZmFjdCl7Y29uc3QgZmFpbGluZ1J1bGVzPW5ldyBNYXAoKTtmb250U2l6ZUFydGlmYWN0LmZvckVhY2goKHtjc3NSdWxlLGZvbnRTaXplLHRleHRMZW5ndGgsbm9kZX0pPT57Y29uc3QgYXJ0aWZhY3RJZD1nZXRGb250QXJ0aWZhY3RJZChjc3NSdWxlLG5vZGUpO2NvbnN0IGZhaWxpbmdSdWxlPWZhaWxpbmdSdWxlcy5nZXQoYXJ0aWZhY3RJZCk7aWYoIWZhaWxpbmdSdWxlKXtmYWlsaW5nUnVsZXMuc2V0KGFydGlmYWN0SWQse25vZGUsY3NzUnVsZSxmb250U2l6ZSx0ZXh0TGVuZ3RofSk7fWVsc2V7ZmFpbGluZ1J1bGUudGV4dExlbmd0aCs9dGV4dExlbmd0aDt9fSk7cmV0dXJuWy4uLmZhaWxpbmdSdWxlcy52YWx1ZXMoKV07fQpmdW5jdGlvbiBnZXRBdHRyaWJ1dGVNYXAoYXR0cmlidXRlcz1bXSl7Y29uc3QgbWFwPW5ldyBNYXAoKTtmb3IobGV0IGk9MDtpPGF0dHJpYnV0ZXMubGVuZ3RoO2krPTIpe2NvbnN0IG5hbWU9YXR0cmlidXRlc1tpXS50b0xvd2VyQ2FzZSgpO2NvbnN0IHZhbHVlPWF0dHJpYnV0ZXNbaSsxXS50cmltKCk7aWYodmFsdWUpe21hcC5zZXQobmFtZSx2YWx1ZSk7fX0KcmV0dXJuIG1hcDt9CmZ1bmN0aW9uIGdldFNlbGVjdG9yKG5vZGUpe2NvbnN0IGF0dHJpYnV0ZU1hcD1nZXRBdHRyaWJ1dGVNYXAobm9kZS5hdHRyaWJ1dGVzKTtpZihhdHRyaWJ1dGVNYXAuaGFzKCdpZCcpKXtyZXR1cm4nIycrYXR0cmlidXRlTWFwLmdldCgnaWQnKTt9ZWxzZXtjb25zdCBhdHRyQ2xhc3M9YXR0cmlidXRlTWFwLmdldCgnY2xhc3MnKTtpZihhdHRyQ2xhc3Mpe3JldHVybicuJythdHRyQ2xhc3Muc3BsaXQoL1xzKy8pLmpvaW4oJy4nKTt9fQpyZXR1cm4gbm9kZS5sb2NhbE5hbWUudG9Mb3dlckNhc2UoKTt9CmZ1bmN0aW9uIG5vZGVUb1RhYmxlTm9kZShub2RlKXtjb25zdCBhdHRyaWJ1dGVzPW5vZGUuYXR0cmlidXRlc3x8W107Y29uc3QgYXR0cmlidXRlc1N0cmluZz1hdHRyaWJ1dGVzLm1hcCgodmFsdWUsaWR4KT0+aWR4JTI9PT0wP2AgJHt2YWx1ZX1gOmA9IiR7dmFsdWV9ImApLmpvaW4oJycpO3JldHVybnt0eXBlOidub2RlJyxzZWxlY3Rvcjpub2RlLnBhcmVudE5vZGU/Z2V0U2VsZWN0b3Iobm9kZS5wYXJlbnROb2RlKTonJyxzbmlwcGV0OmA8JHtub2RlLmxvY2FsTmFtZX0ke2F0dHJpYnV0ZXNTdHJpbmd9PmB9O30KZnVuY3Rpb24gZmluZFN0eWxlUnVsZVNvdXJjZShiYXNlVVJMLHN0eWxlRGVjbGFyYXRpb24sbm9kZSl7aWYoIXN0eWxlRGVjbGFyYXRpb258fHN0eWxlRGVjbGFyYXRpb24udHlwZT09PUNTU1N0eWxlRGVjbGFyYXRpb24uVHlwZS5BdHRyaWJ1dGVzfHxzdHlsZURlY2xhcmF0aW9uLnR5cGU9PT1DU1NTdHlsZURlY2xhcmF0aW9uLlR5cGUuSW5saW5lKQp7cmV0dXJue3NlbGVjdG9yOm5vZGVUb1RhYmxlTm9kZShub2RlKSxzb3VyY2U6YmFzZVVSTH07fQppZihzdHlsZURlY2xhcmF0aW9uLnBhcmVudFJ1bGUmJnN0eWxlRGVjbGFyYXRpb24ucGFyZW50UnVsZS5vcmlnaW49PT0ndXNlci1hZ2VudCcpe3JldHVybntzZWxlY3RvcjpzdHlsZURlY2xhcmF0aW9uLnBhcmVudFJ1bGUuc2VsZWN0b3JzLm1hcChpdGVtPT5pdGVtLnRleHQpLmpvaW4oJywgJyksc291cmNlOidVc2VyIEFnZW50IFN0eWxlc2hlZXQnfTt9CmlmKHN0eWxlRGVjbGFyYXRpb24udHlwZT09PUNTU1N0eWxlRGVjbGFyYXRpb24uVHlwZS5SZWd1bGFyJiZzdHlsZURlY2xhcmF0aW9uLnBhcmVudFJ1bGUpe2NvbnN0IHJ1bGU9c3R5bGVEZWNsYXJhdGlvbi5wYXJlbnRSdWxlO2NvbnN0IHN0eWxlc2hlZXQ9c3R5bGVEZWNsYXJhdGlvbi5zdHlsZXNoZWV0O2lmKHN0eWxlc2hlZXQpe2xldCBzb3VyY2U7Y29uc3Qgc2VsZWN0b3I9cnVsZS5zZWxlY3RvcnMubWFwKGl0ZW09Pml0ZW0udGV4dCkuam9pbignLCAnKTtpZihzdHlsZXNoZWV0LnNvdXJjZVVSTCl7Y29uc3QgdXJsPW5ldyBVUkwoc3R5bGVzaGVldC5zb3VyY2VVUkwsYmFzZVVSTCk7Y29uc3QgcmFuZ2U9c3R5bGVEZWNsYXJhdGlvbi5yYW5nZTtzb3VyY2U9YCR7dXJsLmhyZWZ9YDtpZihyYW5nZSl7Y29uc3QgYWJzb2x1dGVTdGFydExpbmU9cmFuZ2Uuc3RhcnRMaW5lK3N0eWxlc2hlZXQuc3RhcnRMaW5lKzE7Y29uc3QgYWJzb2x1dGVTdGFydENvbHVtbj1yYW5nZS5zdGFydENvbHVtbitzdHlsZXNoZWV0LnN0YXJ0Q29sdW1uKzE7c291cmNlKz1gOiR7YWJzb2x1dGVTdGFydExpbmV9OiR7YWJzb2x1dGVTdGFydENvbHVtbn1gO319ZWxzZXtzb3VyY2U9J2R5bmFtaWMnO30KcmV0dXJue3NlbGVjdG9yLHNvdXJjZX07fX0KcmV0dXJue3NlbGVjdG9yOicnLHNvdXJjZTonVW5rbm93bid9O30KZnVuY3Rpb24gZ2V0Rm9udEFydGlmYWN0SWQoc3R5bGVEZWNsYXJhdGlvbixub2RlKXtpZihzdHlsZURlY2xhcmF0aW9uJiZzdHlsZURlY2xhcmF0aW9uLnR5cGU9PT1DU1NTdHlsZURlY2xhcmF0aW9uLlR5cGUuUmVndWxhcil7Y29uc3Qgc3RhcnRMaW5lPXN0eWxlRGVjbGFyYXRpb24ucmFuZ2U/c3R5bGVEZWNsYXJhdGlvbi5yYW5nZS5zdGFydExpbmU6MDtjb25zdCBzdGFydENvbHVtbj1zdHlsZURlY2xhcmF0aW9uLnJhbmdlP3N0eWxlRGVjbGFyYXRpb24ucmFuZ2Uuc3RhcnRDb2x1bW46MDtyZXR1cm5gJHtzdHlsZURlY2xhcmF0aW9uLnN0eWxlU2hlZXRJZH1AJHtzdGFydExpbmV9OiR7c3RhcnRDb2x1bW59YDt9ZWxzZXtyZXR1cm5gbm9kZV8ke25vZGUubm9kZUlkfWA7fX0KY2xhc3MgRm9udFNpemUgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J2ZvbnQtc2l6ZScsdGl0bGU6J0RvY3VtZW50IHVzZXMgbGVnaWJsZSBmb250IHNpemVzJyxmYWlsdXJlVGl0bGU6J0RvY3VtZW50IGRvZXNuXCd0IHVzZSBsZWdpYmxlIGZvbnQgc2l6ZXMnLGRlc2NyaXB0aW9uOidGb250IHNpemVzIGxlc3MgdGhhbiAxMnB4IGFyZSB0b28gc21hbGwgdG8gYmUgbGVnaWJsZSBhbmQgcmVxdWlyZSBtb2JpbGUgJysndmlzaXRvcnMgdG8g4oCccGluY2ggdG8gem9vbeKAnSBpbiBvcmRlciB0byByZWFkLiBTdHJpdmUgdG8gaGF2ZSA+NjAlIG9mIHBhZ2UgdGV4dCDiiaUxMnB4LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2ZvbnQtc2l6ZXMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydGb250U2l6ZScsJ1VSTCcsJ1ZpZXdwb3J0J119O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgaGFzVmlld3BvcnRTZXQ9Vmlld3BvcnRBdWRpdC5hdWRpdChhcnRpZmFjdHMpLnJhd1ZhbHVlO2lmKCFoYXNWaWV3cG9ydFNldCl7cmV0dXJue3Jhd1ZhbHVlOmZhbHNlLGV4cGxhbmF0aW9uOidUZXh0IGlzIGlsbGVnaWJsZSBiZWNhdXNlIG9mIGEgbWlzc2luZyB2aWV3cG9ydCBjb25maWcnfTt9CmNvbnN0e2FuYWx5emVkRmFpbGluZ05vZGVzRGF0YSxhbmFseXplZEZhaWxpbmdUZXh0TGVuZ3RoLGZhaWxpbmdUZXh0TGVuZ3RoLHZpc2l0ZWRUZXh0TGVuZ3RoLHRvdGFsVGV4dExlbmd0aH09YXJ0aWZhY3RzLkZvbnRTaXplO2lmKHRvdGFsVGV4dExlbmd0aD09PTApe3JldHVybntyYXdWYWx1ZTp0cnVlfTt9CmNvbnN0IGZhaWxpbmdSdWxlcz1nZXRVbmlxdWVGYWlsaW5nUnVsZXMoYW5hbHl6ZWRGYWlsaW5nTm9kZXNEYXRhKTtjb25zdCBwZXJjZW50YWdlT2ZQYXNzaW5nVGV4dD0odmlzaXRlZFRleHRMZW5ndGgtZmFpbGluZ1RleHRMZW5ndGgpL3Zpc2l0ZWRUZXh0TGVuZ3RoKjEwMDtjb25zdCBwYWdlVXJsPWFydGlmYWN0cy5VUkwuZmluYWxVcmw7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3NvdXJjZScsaXRlbVR5cGU6J3VybCcsdGV4dDonU291cmNlJ30se2tleTonc2VsZWN0b3InLGl0ZW1UeXBlOidjb2RlJyx0ZXh0OidTZWxlY3Rvcid9LHtrZXk6J2NvdmVyYWdlJyxpdGVtVHlwZTondGV4dCcsdGV4dDonJSBvZiBQYWdlIFRleHQnfSx7a2V5Oidmb250U2l6ZScsaXRlbVR5cGU6J3RleHQnLHRleHQ6J0ZvbnQgU2l6ZSd9XTtjb25zdCB0YWJsZURhdGE9ZmFpbGluZ1J1bGVzLnNvcnQoKGEsYik9PmIudGV4dExlbmd0aC1hLnRleHRMZW5ndGgpLm1hcCgoe2Nzc1J1bGUsdGV4dExlbmd0aCxmb250U2l6ZSxub2RlfSk9Pntjb25zdCBwZXJjZW50YWdlT2ZBZmZlY3RlZFRleHQ9dGV4dExlbmd0aC92aXNpdGVkVGV4dExlbmd0aCoxMDA7Y29uc3Qgb3JpZ2luPWZpbmRTdHlsZVJ1bGVTb3VyY2UocGFnZVVybCxjc3NSdWxlLG5vZGUpO3JldHVybntzb3VyY2U6b3JpZ2luLnNvdXJjZSxzZWxlY3RvcjpvcmlnaW4uc2VsZWN0b3IsY292ZXJhZ2U6YCR7cGVyY2VudGFnZU9mQWZmZWN0ZWRUZXh0LnRvRml4ZWQoMil9JWAsZm9udFNpemU6YCR7Zm9udFNpemV9cHhgfTt9KTtpZihhbmFseXplZEZhaWxpbmdUZXh0TGVuZ3RoPGZhaWxpbmdUZXh0TGVuZ3RoKXtjb25zdCBwZXJjZW50YWdlT2ZVbmFuYWx5emVkRmFpbGluZ1RleHQ9KGZhaWxpbmdUZXh0TGVuZ3RoLWFuYWx5emVkRmFpbGluZ1RleHRMZW5ndGgpL3Zpc2l0ZWRUZXh0TGVuZ3RoKjEwMDt0YWJsZURhdGEucHVzaCh7c291cmNlOidBZGRcJ2wgaWxsZWdpYmxlIHRleHQnLHNlbGVjdG9yOicnLGNvdmVyYWdlOmAke3BlcmNlbnRhZ2VPZlVuYW5hbHl6ZWRGYWlsaW5nVGV4dC50b0ZpeGVkKDIpfSVgLGZvbnRTaXplOic8IDEycHgnfSk7fQppZihwZXJjZW50YWdlT2ZQYXNzaW5nVGV4dD4wKXt0YWJsZURhdGEucHVzaCh7c291cmNlOidMZWdpYmxlIHRleHQnLHNlbGVjdG9yOicnLGNvdmVyYWdlOmAke3BlcmNlbnRhZ2VPZlBhc3NpbmdUZXh0LnRvRml4ZWQoMil9JWAsZm9udFNpemU6J+KJpSAxMnB4J30pO30KY29uc3QgZGlzcGxheVZhbHVlPVsnJS4xZCUgbGVnaWJsZSB0ZXh0JyxwZXJjZW50YWdlT2ZQYXNzaW5nVGV4dF07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHRhYmxlRGF0YSk7Y29uc3QgcGFzc2VkPXBlcmNlbnRhZ2VPZlBhc3NpbmdUZXh0Pj1NSU5JTUFMX1BFUkNFTlRBR0VfT0ZfTEVHSUJMRV9URVhUO2xldCBleHBsYW5hdGlvbjtpZighcGFzc2VkKXtjb25zdCBwZXJjZW50YWdlT2ZGYWlsaW5nVGV4dD1wYXJzZUZsb2F0KCgxMDAtcGVyY2VudGFnZU9mUGFzc2luZ1RleHQpLnRvRml4ZWQoMikpO2xldCBkaXNjbGFpbWVyPScnO2lmKHZpc2l0ZWRUZXh0TGVuZ3RoPHRvdGFsVGV4dExlbmd0aCl7Y29uc3QgcGVyY2VudGFnZU9mVmlzaXRlZFRleHQ9dmlzaXRlZFRleHRMZW5ndGgvdG90YWxUZXh0TGVuZ3RoKjEwMDtkaXNjbGFpbWVyPWAgKGJhc2VkIG9uICR7cGVyY2VudGFnZU9mVmlzaXRlZFRleHQudG9GaXhlZCgpfSUgc2FtcGxlKWA7fQpleHBsYW5hdGlvbj1gJHtwZXJjZW50YWdlT2ZGYWlsaW5nVGV4dH0lIG9mIHRleHQgaXMgdG9vIHNtYWxsJHtkaXNjbGFpbWVyfS5gO30KcmV0dXJue3Jhd1ZhbHVlOnBhc3NlZCxkZXRhaWxzLGRpc3BsYXlWYWx1ZSxleHBsYW5hdGlvbn07fX0KbW9kdWxlLmV4cG9ydHM9Rm9udFNpemU7fSx7Ii4uLy4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4uLy4uL2xpYi93ZWItaW5zcGVjdG9yIjo0NywiLi4vYXVkaXQiOjIsIi4uL3ZpZXdwb3J0IjoiLi4vYXVkaXRzL3ZpZXdwb3J0In1dLCIuLi9hdWRpdHMvc2VvL2hyZWZsYW5nIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgTGlua0hlYWRlcj1yZXF1aXJlKCdodHRwLWxpbmstaGVhZGVyJyk7Y29uc3QgVkFMSURfTEFOR1M9aW1wb3J0VmFsaWRMYW5ncygpO2NvbnN0IExJTktfSEVBREVSPSdsaW5rJztjb25zdCBOT19MQU5HVUFHRT0neC1kZWZhdWx0JztmdW5jdGlvbiBpbXBvcnRWYWxpZExhbmdzKCl7Y29uc3QgYXhlQ2FjaGU9Z2xvYmFsLmF4ZTtnbG9iYWwuYXhlPXt1dGlsczp7fX07cmVxdWlyZSgnYXhlLWNvcmUvbGliL2NvbW1vbnMvdXRpbHMvdmFsaWQtbGFuZ3MuanMnKTtjb25zdCB2YWxpZExhbmdzPWdsb2JhbC5heGUudXRpbHMudmFsaWRMYW5ncygpO2dsb2JhbC5heGU9YXhlQ2FjaGU7cmV0dXJuIHZhbGlkTGFuZ3M7fQpmdW5jdGlvbiBpc1ZhbGlkSHJlZmxhbmcoaHJlZmxhbmcpe2lmKGhyZWZsYW5nLnRvTG93ZXJDYXNlKCk9PT1OT19MQU5HVUFHRSl7cmV0dXJuIHRydWU7fQpjb25zdFtsYW5nXT1ocmVmbGFuZy5zcGxpdCgnLScpO3JldHVybiBWQUxJRF9MQU5HUy5pbmNsdWRlcyhsYW5nLnRvTG93ZXJDYXNlKCkpO30KZnVuY3Rpb24gaGVhZGVySGFzVmFsaWRIcmVmbGFuZ3MoaGVhZGVyVmFsdWUpe2NvbnN0IGxpbmtIZWFkZXI9TGlua0hlYWRlci5wYXJzZShoZWFkZXJWYWx1ZSk7cmV0dXJuIGxpbmtIZWFkZXIuZ2V0KCdyZWwnLCdhbHRlcm5hdGUnKS5ldmVyeShsaW5rPT4hIWxpbmsuaHJlZmxhbmcmJmlzVmFsaWRIcmVmbGFuZyhsaW5rLmhyZWZsYW5nKSk7fQpjbGFzcyBIcmVmbGFuZyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaHJlZmxhbmcnLHRpdGxlOidEb2N1bWVudCBoYXMgYSB2YWxpZCBgaHJlZmxhbmdgJyxmYWlsdXJlVGl0bGU6J0RvY3VtZW50IGRvZXNuXCd0IGhhdmUgYSB2YWxpZCBgaHJlZmxhbmdgJyxkZXNjcmlwdGlvbjonaHJlZmxhbmcgbGlua3MgdGVsbCBzZWFyY2ggZW5naW5lcyB3aGF0IHZlcnNpb24gb2YgYSBwYWdlIHRoZXkgc2hvdWxkICcrJ2xpc3QgaW4gc2VhcmNoIHJlc3VsdHMgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgcmVnaW9uLiBbTGVhcm4gbW9yZV0nKycoaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2hyZWZsYW5nKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnSHJlZmxhbmcnLCdVUkwnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgVVJMPWFydGlmYWN0cy5VUkw7cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TWFpblJlc291cmNlKHtkZXZ0b29sc0xvZyxVUkx9KS50aGVuKG1haW5SZXNvdXJjZT0+e2NvbnN0IGludmFsaWRIcmVmbGFuZ3M9W107aWYoYXJ0aWZhY3RzLkhyZWZsYW5nKXthcnRpZmFjdHMuSHJlZmxhbmcuZm9yRWFjaCgoe2hyZWYsaHJlZmxhbmd9KT0+e2lmKCFpc1ZhbGlkSHJlZmxhbmcoaHJlZmxhbmcpKXtpbnZhbGlkSHJlZmxhbmdzLnB1c2goe3NvdXJjZTp7dHlwZTonbm9kZScsc25pcHBldDpgPGxpbmsgbmFtZT0iYWx0ZXJuYXRlIiBocmVmbGFuZz0iJHtocmVmbGFuZ30iIGhyZWY9IiR7aHJlZn0iIC8+YH19KTt9fSk7fQptYWluUmVzb3VyY2UucmVzcG9uc2VIZWFkZXJzJiZtYWluUmVzb3VyY2UucmVzcG9uc2VIZWFkZXJzLmZpbHRlcihoPT5oLm5hbWUudG9Mb3dlckNhc2UoKT09PUxJTktfSEVBREVSJiYhaGVhZGVySGFzVmFsaWRIcmVmbGFuZ3MoaC52YWx1ZSkpLmZvckVhY2goaD0+aW52YWxpZEhyZWZsYW5ncy5wdXNoKHtzb3VyY2U6YCR7aC5uYW1lfTogJHtoLnZhbHVlfWB9KSk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J3NvdXJjZScsaXRlbVR5cGU6J2NvZGUnLHRleHQ6J1NvdXJjZSd9XTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MsaW52YWxpZEhyZWZsYW5ncyk7cmV0dXJue3Jhd1ZhbHVlOmludmFsaWRIcmVmbGFuZ3MubGVuZ3RoPT09MCxkZXRhaWxzfTt9KTt9fQptb2R1bGUuZXhwb3J0cz1IcmVmbGFuZzt9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7Ii4uL2F1ZGl0IjoyLCJheGUtY29yZS9saWIvY29tbW9ucy91dGlscy92YWxpZC1sYW5ncy5qcyI6OTgsImh0dHAtbGluay1oZWFkZXIiOjExOX1dLCIuLi9hdWRpdHMvc2VvL2h0dHAtc3RhdHVzLWNvZGUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBIVFRQX1VOU1VDQ0VTU0ZVTF9DT0RFX0xPVz00MDA7Y29uc3QgSFRUUF9VTlNVQ0NFU1NGVUxfQ09ERV9ISUdIPTU5OTtjbGFzcyBIVFRQU3RhdHVzQ29kZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaHR0cC1zdGF0dXMtY29kZScsdGl0bGU6J1BhZ2UgaGFzIHN1Y2Nlc3NmdWwgSFRUUCBzdGF0dXMgY29kZScsZmFpbHVyZVRpdGxlOidQYWdlIGhhcyB1bnN1Y2Nlc3NmdWwgSFRUUCBzdGF0dXMgY29kZScsZGVzY3JpcHRpb246J1BhZ2VzIHdpdGggdW5zdWNjZXNzZnVsIEhUVFAgc3RhdHVzIGNvZGVzIG1heSBub3QgYmUgaW5kZXhlZCBwcm9wZXJseS4gJysnW0xlYXJuIG1vcmVdJysnKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9zdWNjZXNzZnVsLWh0dHAtY29kZSkuJyxyZXF1aXJlZEFydGlmYWN0czpbJ2RldnRvb2xzTG9ncycsJ1VSTCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBVUkw9YXJ0aWZhY3RzLlVSTDtyZXR1cm4gYXJ0aWZhY3RzLnJlcXVlc3RNYWluUmVzb3VyY2Uoe2RldnRvb2xzTG9nLFVSTH0pLnRoZW4obWFpblJlc291cmNlPT57Y29uc3Qgc3RhdHVzQ29kZT1tYWluUmVzb3VyY2Uuc3RhdHVzQ29kZTtpZihzdGF0dXNDb2RlPj1IVFRQX1VOU1VDQ0VTU0ZVTF9DT0RFX0xPVyYmc3RhdHVzQ29kZTw9SFRUUF9VTlNVQ0NFU1NGVUxfQ09ERV9ISUdIKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZGlzcGxheVZhbHVlOmAke3N0YXR1c0NvZGV9YH07fQpyZXR1cm57cmF3VmFsdWU6dHJ1ZX07fSk7fX0KbW9kdWxlLmV4cG9ydHM9SFRUUFN0YXR1c0NvZGU7fSx7Ii4uL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9zZW8vaXMtY3Jhd2xhYmxlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3Qgcm9ib3RzUGFyc2VyPXJlcXVpcmUoJ3JvYm90cy1wYXJzZXInKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgQkxPQ0tMSVNUPW5ldyBTZXQoWydub2luZGV4Jywnbm9uZSddKTtjb25zdCBST0JPVFNfSEVBREVSPSd4LXJvYm90cy10YWcnO2NvbnN0IFVOQVZBSUxBQkxFX0FGVEVSPSd1bmF2YWlsYWJsZV9hZnRlcic7ZnVuY3Rpb24gaXNVbmF2YWlsYWJsZShkaXJlY3RpdmUpe2NvbnN0IHBhcnRzPWRpcmVjdGl2ZS5zcGxpdCgnOicpO2lmKHBhcnRzLmxlbmd0aDw9MXx8cGFydHNbMF0hPT1VTkFWQUlMQUJMRV9BRlRFUil7cmV0dXJuIGZhbHNlO30KY29uc3QgZGF0ZT1EYXRlLnBhcnNlKHBhcnRzLnNsaWNlKDEpLmpvaW4oJzonKSk7cmV0dXJuIWlzTmFOKGRhdGUpJiZkYXRlPERhdGUubm93KCk7fQpmdW5jdGlvbiBoYXNCbG9ja2luZ0RpcmVjdGl2ZShkaXJlY3RpdmVzKXtyZXR1cm4gZGlyZWN0aXZlcy5zcGxpdCgnLCcpLm1hcChkPT5kLnRvTG93ZXJDYXNlKCkudHJpbSgpKS5zb21lKGQ9PkJMT0NLTElTVC5oYXMoZCl8fGlzVW5hdmFpbGFibGUoZCkpO30KZnVuY3Rpb24gaGFzVXNlckFnZW50KGRpcmVjdGl2ZXMpe2NvbnN0IHBhcnRzPWRpcmVjdGl2ZXMubWF0Y2goL14oW14sOl0rKTovKTtyZXR1cm4hIXBhcnRzJiZwYXJ0c1sxXS50b0xvd2VyQ2FzZSgpIT09VU5BVkFJTEFCTEVfQUZURVI7fQpjbGFzcyBJc0NyYXdsYWJsZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonaXMtY3Jhd2xhYmxlJyx0aXRsZTonUGFnZSBpc27igJl0IGJsb2NrZWQgZnJvbSBpbmRleGluZycsZmFpbHVyZVRpdGxlOidQYWdlIGlzIGJsb2NrZWQgZnJvbSBpbmRleGluZycsZGVzY3JpcHRpb246J1NlYXJjaCBlbmdpbmVzIGFyZSB1bmFibGUgdG8gaW5jbHVkZSB5b3VyIHBhZ2VzIGluIHNlYXJjaCByZXN1bHRzICcrJ2lmIHRoZXkgZG9uXCd0IGhhdmUgcGVybWlzc2lvbiB0byBjcmF3bCB0aGVtLiBbTGVhcm4gJysnbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2luZGV4aW5nKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnTWV0YVJvYm90cycsJ1JvYm90c1R4dCcsJ1VSTCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGRldnRvb2xzTG9nPWFydGlmYWN0cy5kZXZ0b29sc0xvZ3NbQXVkaXQuREVGQVVMVF9QQVNTXTtyZXR1cm4gYXJ0aWZhY3RzLnJlcXVlc3RNYWluUmVzb3VyY2Uoe2RldnRvb2xzTG9nLFVSTDphcnRpZmFjdHMuVVJMfSkudGhlbihtYWluUmVzb3VyY2U9Pntjb25zdCBibG9ja2luZ0RpcmVjdGl2ZXM9W107aWYoYXJ0aWZhY3RzLk1ldGFSb2JvdHMpe2NvbnN0IGlzQmxvY2tpbmc9aGFzQmxvY2tpbmdEaXJlY3RpdmUoYXJ0aWZhY3RzLk1ldGFSb2JvdHMpO2lmKGlzQmxvY2tpbmcpe2Jsb2NraW5nRGlyZWN0aXZlcy5wdXNoKHtzb3VyY2U6e3R5cGU6J25vZGUnLHNuaXBwZXQ6YDxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0iJHthcnRpZmFjdHMuTWV0YVJvYm90c30iIC8+YH19KTt9fQptYWluUmVzb3VyY2UucmVzcG9uc2VIZWFkZXJzJiZtYWluUmVzb3VyY2UucmVzcG9uc2VIZWFkZXJzLmZpbHRlcihoPT5oLm5hbWUudG9Mb3dlckNhc2UoKT09PVJPQk9UU19IRUFERVImJiFoYXNVc2VyQWdlbnQoaC52YWx1ZSkmJmhhc0Jsb2NraW5nRGlyZWN0aXZlKGgudmFsdWUpKS5mb3JFYWNoKGg9PmJsb2NraW5nRGlyZWN0aXZlcy5wdXNoKHtzb3VyY2U6YCR7aC5uYW1lfTogJHtoLnZhbHVlfWB9KSk7aWYoYXJ0aWZhY3RzLlJvYm90c1R4dC5jb250ZW50KXtjb25zdCByb2JvdHNGaWxlVXJsPW5ldyBVUkwoJy9yb2JvdHMudHh0JyxtYWluUmVzb3VyY2UudXJsKTtjb25zdCByb2JvdHNUeHQ9cm9ib3RzUGFyc2VyKHJvYm90c0ZpbGVVcmwuaHJlZixhcnRpZmFjdHMuUm9ib3RzVHh0LmNvbnRlbnQpO2lmKCFyb2JvdHNUeHQuaXNBbGxvd2VkKG1haW5SZXNvdXJjZS51cmwpKXtibG9ja2luZ0RpcmVjdGl2ZXMucHVzaCh7c291cmNlOnt0eXBlOid1cmwnLHZhbHVlOnJvYm90c0ZpbGVVcmwuaHJlZn19KTt9fQpjb25zdCBoZWFkaW5ncz1be2tleTonc291cmNlJyxpdGVtVHlwZTonY29kZScsdGV4dDonQmxvY2tpbmcgRGlyZWN0aXZlIFNvdXJjZSd9XTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MsYmxvY2tpbmdEaXJlY3RpdmVzKTtyZXR1cm57cmF3VmFsdWU6YmxvY2tpbmdEaXJlY3RpdmVzLmxlbmd0aD09PTAsZGV0YWlsc307fSk7fX0KbW9kdWxlLmV4cG9ydHM9SXNDcmF3bGFibGU7fSx7Ii4uLy4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4uL2F1ZGl0IjoyLCJyb2JvdHMtcGFyc2VyIjoxMzF9XSwiLi4vYXVkaXRzL3Nlby9saW5rLXRleHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgQkxPQ0tMSVNUPW5ldyBTZXQoWydjbGljayBoZXJlJywnY2xpY2sgdGhpcycsJ2dvJywnaGVyZScsJ3RoaXMnLCdzdGFydCcsJ3JpZ2h0IGhlcmUnLCdtb3JlJywnbGVhcm4gbW9yZSddKTtjbGFzcyBMaW5rVGV4dCBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonbGluay10ZXh0Jyx0aXRsZTonTGlua3MgaGF2ZSBkZXNjcmlwdGl2ZSB0ZXh0JyxmYWlsdXJlVGl0bGU6J0xpbmtzIGRvIG5vdCBoYXZlIGRlc2NyaXB0aXZlIHRleHQnLGRlc2NyaXB0aW9uOidEZXNjcmlwdGl2ZSBsaW5rIHRleHQgaGVscHMgc2VhcmNoIGVuZ2luZXMgdW5kZXJzdGFuZCB5b3VyIGNvbnRlbnQuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvZGVzY3JpcHRpdmUtbGluay10ZXh0KS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnVVJMJywnQ3Jhd2xhYmxlTGlua3MnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBmYWlsaW5nTGlua3M9YXJ0aWZhY3RzLkNyYXdsYWJsZUxpbmtzLmZpbHRlcihsaW5rPT57aWYobGluay5ocmVmLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnamF2YXNjcmlwdDonKXx8VVJMLmVxdWFsV2l0aEV4Y2x1ZGVkRnJhZ21lbnRzKGxpbmsuaHJlZixhcnRpZmFjdHMuVVJMLmZpbmFsVXJsKSkKe3JldHVybiBmYWxzZTt9CnJldHVybiBCTE9DS0xJU1QuaGFzKGxpbmsudGV4dC50cmltKCkudG9Mb3dlckNhc2UoKSk7fSk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J2hyZWYnLGl0ZW1UeXBlOid1cmwnLHRleHQ6J0xpbmsgZGVzdGluYXRpb24nfSx7a2V5Oid0ZXh0JyxpdGVtVHlwZTondGV4dCcsdGV4dDonTGluayBUZXh0J31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZVRhYmxlRGV0YWlscyhoZWFkaW5ncyxmYWlsaW5nTGlua3Mse30pO2xldCBkaXNwbGF5VmFsdWU7aWYoZmFpbGluZ0xpbmtzLmxlbmd0aCl7ZGlzcGxheVZhbHVlPWZhaWxpbmdMaW5rcy5sZW5ndGg+MT9gJHtmYWlsaW5nTGlua3MubGVuZ3RofSBsaW5rcyBmb3VuZGA6JzEgbGluayBmb3VuZCc7fQpyZXR1cm57cmF3VmFsdWU6ZmFpbGluZ0xpbmtzLmxlbmd0aD09PTAsZGV0YWlscyxkaXNwbGF5VmFsdWV9O319Cm1vZHVsZS5leHBvcnRzPUxpbmtUZXh0O30seyIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvc2VvL21hbnVhbC9tb2JpbGUtZnJpZW5kbHkiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWFudWFsQXVkaXQ9cmVxdWlyZSgnLi4vLi4vbWFudWFsL21hbnVhbC1hdWRpdCcpO2NsYXNzIE1vYmlsZUZyaWVuZGx5IGV4dGVuZHMgTWFudWFsQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOidtb2JpbGUtZnJpZW5kbHknLGRlc2NyaXB0aW9uOidUYWtlIHRoZSBbTW9iaWxlLUZyaWVuZGx5IFRlc3RdKGh0dHBzOi8vc2VhcmNoLmdvb2dsZS5jb20vdGVzdC9tb2JpbGUtZnJpZW5kbHkpIHRvIGNoZWNrIGZvciBhdWRpdHMgbm90IGNvdmVyZWQgYnkgTGlnaHRob3VzZSwgbGlrZSBzaXppbmcgdGFwIHRhcmdldHMgYXBwcm9wcmlhdGVseS4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NlYXJjaC9tb2JpbGUtc2l0ZXMvKS4nLHRpdGxlOidQYWdlIGlzIG1vYmlsZSBmcmllbmRseSd9LHN1cGVyLnBhcnRpYWxNZXRhKTt9fQptb2R1bGUuZXhwb3J0cz1Nb2JpbGVGcmllbmRseTt9LHsiLi4vLi4vbWFudWFsL21hbnVhbC1hdWRpdCI6NH1dLCIuLi9hdWRpdHMvc2VvL21hbnVhbC9zdHJ1Y3R1cmVkLWRhdGEiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWFudWFsQXVkaXQ9cmVxdWlyZSgnLi4vLi4vbWFudWFsL21hbnVhbC1hdWRpdCcpO2NsYXNzIFN0cnVjdHVyZWREYXRhIGV4dGVuZHMgTWFudWFsQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2lkOidzdHJ1Y3R1cmVkLWRhdGEnLGRlc2NyaXB0aW9uOidSdW4gdGhlIFtTdHJ1Y3R1cmVkIERhdGEgVGVzdGluZyBUb29sXShodHRwczovL3NlYXJjaC5nb29nbGUuY29tL3N0cnVjdHVyZWQtZGF0YS90ZXN0aW5nLXRvb2wvKSBhbmQgdGhlIFtTdHJ1Y3R1cmVkIERhdGEgTGludGVyXShodHRwOi8vbGludGVyLnN0cnVjdHVyZWQtZGF0YS5vcmcvKSB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmVkIGRhdGEuIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zZWFyY2gvZG9jcy9ndWlkZXMvbWFyay11cC1jb250ZW50KS4nLHRpdGxlOidTdHJ1Y3R1cmVkIGRhdGEgaXMgdmFsaWQnfSxzdXBlci5wYXJ0aWFsTWV0YSk7fX0KbW9kdWxlLmV4cG9ydHM9U3RydWN0dXJlZERhdGE7fSx7Ii4uLy4uL21hbnVhbC9tYW51YWwtYXVkaXQiOjR9XSwiLi4vYXVkaXRzL3Nlby9tZXRhLWRlc2NyaXB0aW9uIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y2xhc3MgRGVzY3JpcHRpb24gZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J21ldGEtZGVzY3JpcHRpb24nLHRpdGxlOidEb2N1bWVudCBoYXMgYSBtZXRhIGRlc2NyaXB0aW9uJyxmYWlsdXJlVGl0bGU6J0RvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBtZXRhIGRlc2NyaXB0aW9uJyxkZXNjcmlwdGlvbjonTWV0YSBkZXNjcmlwdGlvbnMgbWF5IGJlIGluY2x1ZGVkIGluIHNlYXJjaCByZXN1bHRzIHRvIGNvbmNpc2VseSBzdW1tYXJpemUgJysncGFnZSBjb250ZW50LiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2Rlc2NyaXB0aW9uKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnTWV0YURlc2NyaXB0aW9uJ119O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7aWYoYXJ0aWZhY3RzLk1ldGFEZXNjcmlwdGlvbj09PW51bGwpe3JldHVybntyYXdWYWx1ZTpmYWxzZX07fQppZihhcnRpZmFjdHMuTWV0YURlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGg9PT0wKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZXhwbGFuYXRpb246J0Rlc2NyaXB0aW9uIHRleHQgaXMgZW1wdHkuJ307fQpyZXR1cm57cmF3VmFsdWU6dHJ1ZX07fX0KbW9kdWxlLmV4cG9ydHM9RGVzY3JpcHRpb247fSx7Ii4uL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy9zZW8vcGx1Z2lucyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi8uLi9saWIvdXJsLXNoaW0nKTtjb25zdCBKQVZBX0FQUExFVF9UWVBFPSdhcHBsaWNhdGlvbi94LWphdmEtYXBwbGV0Jztjb25zdCBKQVZBX0JFQU5fVFlQRT0nYXBwbGljYXRpb24veC1qYXZhLWJlYW4nO2NvbnN0IFRZUEVfQkxPQ0tMSVNUPW5ldyBTZXQoWydhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsSkFWQV9BUFBMRVRfVFlQRSxKQVZBX0JFQU5fVFlQRSwnYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodCcsJ2FwcGxpY2F0aW9uL3gtc2lsdmVybGlnaHQtMiddKTtjb25zdCBGSUxFX0VYVEVOU0lPTl9CTE9DS0xJU1Q9bmV3IFNldChbJ3N3ZicsJ2ZsdicsJ2NsYXNzJywneGFwJ10pO2NvbnN0IFNPVVJDRV9QQVJBTVM9bmV3IFNldChbJ2NvZGUnLCdtb3ZpZScsJ3NvdXJjZScsJ3NyYyddKTtmdW5jdGlvbiBpc1BsdWdpblR5cGUodHlwZSl7dHlwZT10eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVybiBUWVBFX0JMT0NLTElTVC5oYXModHlwZSl8fHR5cGUuc3RhcnRzV2l0aChKQVZBX0FQUExFVF9UWVBFKXx8dHlwZS5zdGFydHNXaXRoKEpBVkFfQkVBTl9UWVBFKTt9CmZ1bmN0aW9uIGlzUGx1Z2luVVJMKHVybCl7dHJ5e2NvbnN0IGZpbGVQYXRoPW5ldyBVUkwodXJsLCdodHRwOi8vZXhhbXBsZS5jb20nKS5wYXRobmFtZTtjb25zdCBwYXJ0cz1maWxlUGF0aC5zcGxpdCgnLicpO2lmKHBhcnRzLmxlbmd0aDwyKXtyZXR1cm4gZmFsc2U7fQpjb25zdCBwYXJ0PXBhcnRzLnBvcCgpO3JldHVybiBGSUxFX0VYVEVOU0lPTl9CTE9DS0xJU1QuaGFzKHBhcnQudHJpbSgpLnRvTG93ZXJDYXNlKCkpO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fX0KY2xhc3MgUGx1Z2lucyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDoncGx1Z2lucycsdGl0bGU6J0RvY3VtZW50IGF2b2lkcyBwbHVnaW5zJyxmYWlsdXJlVGl0bGU6J0RvY3VtZW50IHVzZXMgcGx1Z2lucycsZGVzY3JpcHRpb246J1NlYXJjaCBlbmdpbmVzIGNhblwndCBpbmRleCBwbHVnaW4gY29udGVudCwgYW5kICcrJ21hbnkgZGV2aWNlcyByZXN0cmljdCBwbHVnaW5zIG9yIGRvblwndCBzdXBwb3J0IHRoZW0uICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvcGx1Z2lucykuJyxyZXF1aXJlZEFydGlmYWN0czpbJ0VtYmVkZGVkQ29udGVudCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IHBsdWdpbnM9YXJ0aWZhY3RzLkVtYmVkZGVkQ29udGVudC5maWx0ZXIoaXRlbT0+e2lmKGl0ZW0udGFnTmFtZT09PSdBUFBMRVQnKXtyZXR1cm4gdHJ1ZTt9CmlmKChpdGVtLnRhZ05hbWU9PT0nRU1CRUQnfHxpdGVtLnRhZ05hbWU9PT0nT0JKRUNUJykmJml0ZW0udHlwZSYmaXNQbHVnaW5UeXBlKGl0ZW0udHlwZSkpCntyZXR1cm4gdHJ1ZTt9CmNvbnN0IGVtYmVkU3JjPWl0ZW0uc3JjfHxpdGVtLmNvZGU7aWYoaXRlbS50YWdOYW1lPT09J0VNQkVEJyYmZW1iZWRTcmMmJmlzUGx1Z2luVVJMKGVtYmVkU3JjKSl7cmV0dXJuIHRydWU7fQppZihpdGVtLnRhZ05hbWU9PT0nT0JKRUNUJyYmaXRlbS5kYXRhJiZpc1BsdWdpblVSTChpdGVtLmRhdGEpKXtyZXR1cm4gdHJ1ZTt9CmNvbnN0IGZhaWxpbmdQYXJhbXM9aXRlbS5wYXJhbXMuZmlsdGVyKHBhcmFtPT5TT1VSQ0VfUEFSQU1TLmhhcyhwYXJhbS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSYmaXNQbHVnaW5VUkwocGFyYW0udmFsdWUpKTtyZXR1cm4gZmFpbGluZ1BhcmFtcy5sZW5ndGg+MDt9KS5tYXAocGx1Z2luPT57Y29uc3QgdGFnTmFtZT1wbHVnaW4udGFnTmFtZS50b0xvd2VyQ2FzZSgpO2NvbnN0IGF0dHJpYnV0ZUtleXM9WydzcmMnLCdkYXRhJywnY29kZScsJ3R5cGUnXTtjb25zdCBhdHRyaWJ1dGVzPWF0dHJpYnV0ZUtleXMucmVkdWNlKChyZXN1bHQsYXR0cik9PntpZihwbHVnaW5bYXR0cl0hPT1udWxsKXtyZXN1bHQrPWAgJHthdHRyfT0iJHtwbHVnaW5bYXR0cl19ImA7fQpyZXR1cm4gcmVzdWx0O30sJycpO2NvbnN0IHBhcmFtcz1wbHVnaW4ucGFyYW1zLmZpbHRlcihwYXJhbT0+U09VUkNFX1BBUkFNUy5oYXMocGFyYW0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSkpLm1hcChwYXJhbT0+YDxwYXJhbSAke3BhcmFtLm5hbWV9PSIke3BhcmFtLnZhbHVlfSIgLz5gKS5qb2luKCcnKTtyZXR1cm57c291cmNlOnt0eXBlOidub2RlJyxzbmlwcGV0OmA8JHt0YWdOYW1lfSR7YXR0cmlidXRlc30+JHtwYXJhbXN9PC8ke3RhZ05hbWV9PmB9fTt9KTtjb25zdCBoZWFkaW5ncz1be2tleTonc291cmNlJyxpdGVtVHlwZTonY29kZScsdGV4dDonRWxlbWVudCBzb3VyY2UnfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHBsdWdpbnMpO3JldHVybntyYXdWYWx1ZTpwbHVnaW5zLmxlbmd0aD09PTAsZGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9UGx1Z2luczt9LHsiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL3Nlby9yb2JvdHMtdHh0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IEhUVFBfQ0xJRU5UX0VSUk9SX0NPREVfTE9XPTQwMDtjb25zdCBIVFRQX1NFUlZFUl9FUlJPUl9DT0RFX0xPVz01MDA7Y29uc3QgRElSRUNUSVZFX1NJVEVNQVA9J3NpdGVtYXAnO2NvbnN0IERJUkVDVElWRV9VU0VSX0FHRU5UPSd1c2VyLWFnZW50Jztjb25zdCBESVJFQ1RJVkVfQUxMT1c9J2FsbG93Jztjb25zdCBESVJFQ1RJVkVfRElTQUxMT1c9J2Rpc2FsbG93Jztjb25zdCBESVJFQ1RJVkVTX0dST1VQX01FTUJFUlM9bmV3IFNldChbRElSRUNUSVZFX0FMTE9XLERJUkVDVElWRV9ESVNBTExPV10pO2NvbnN0IERJUkVDVElWRV9TQUZFTElTVD1uZXcgU2V0KFtESVJFQ1RJVkVfVVNFUl9BR0VOVCxESVJFQ1RJVkVfRElTQUxMT1csRElSRUNUSVZFX0FMTE9XLERJUkVDVElWRV9TSVRFTUFQLCdjcmF3bC1kZWxheScsJ2NsZWFuLXBhcmFtJywnaG9zdCcsJ3JlcXVlc3QtcmF0ZScsJ3Zpc2l0LXRpbWUnLCdub2luZGV4J10pO2NvbnN0IFNJVEVNQVBfVkFMSURfUFJPVE9DT0xTPW5ldyBTZXQoWydodHRwczonLCdodHRwOicsJ2Z0cDonXSk7ZnVuY3Rpb24gdmVyaWZ5RGlyZWN0aXZlKGRpcmVjdGl2ZU5hbWUsZGlyZWN0aXZlVmFsdWUpe2lmKCFESVJFQ1RJVkVfU0FGRUxJU1QuaGFzKGRpcmVjdGl2ZU5hbWUpKXt0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGlyZWN0aXZlJyk7fQppZihkaXJlY3RpdmVOYW1lPT09RElSRUNUSVZFX1NJVEVNQVApe2xldCBzaXRlbWFwVXJsO3RyeXtzaXRlbWFwVXJsPW5ldyBVUkwoZGlyZWN0aXZlVmFsdWUpO31jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2l0ZW1hcCBVUkwnKTt9CmlmKCFTSVRFTUFQX1ZBTElEX1BST1RPQ09MUy5oYXMoc2l0ZW1hcFVybC5wcm90b2NvbCkpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBzaXRlbWFwIFVSTCBwcm90b2NvbCcpO319CmlmKGRpcmVjdGl2ZU5hbWU9PT1ESVJFQ1RJVkVfVVNFUl9BR0VOVCYmIWRpcmVjdGl2ZVZhbHVlKXt0aHJvdyBuZXcgRXJyb3IoJ05vIHVzZXItYWdlbnQgc3BlY2lmaWVkJyk7fQppZihkaXJlY3RpdmVOYW1lPT09RElSRUNUSVZFX0FMTE9XfHxkaXJlY3RpdmVOYW1lPT09RElSRUNUSVZFX0RJU0FMTE9XKXtpZihkaXJlY3RpdmVWYWx1ZSE9PScnJiZkaXJlY3RpdmVWYWx1ZVswXSE9PScvJyYmZGlyZWN0aXZlVmFsdWVbMF0hPT0nKicpe3Rocm93IG5ldyBFcnJvcignUGF0dGVybiBzaG91bGQgZWl0aGVyIGJlIGVtcHR5LCBzdGFydCB3aXRoICIvIiBvciAiKiInKTt9CmNvbnN0IGRvbGxhckluZGV4PWRpcmVjdGl2ZVZhbHVlLmluZGV4T2YoJyQnKTtpZihkb2xsYXJJbmRleCE9PS0xJiZkb2xsYXJJbmRleCE9PWRpcmVjdGl2ZVZhbHVlLmxlbmd0aC0xKXt0aHJvdyBuZXcgRXJyb3IoJyIkIiBzaG91bGQgb25seSBiZSB1c2VkIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4nKTt9fX0KZnVuY3Rpb24gcGFyc2VMaW5lKGxpbmUpe2NvbnN0IGhhc2hJbmRleD1saW5lLmluZGV4T2YoJyMnKTtpZihoYXNoSW5kZXghPT0tMSl7bGluZT1saW5lLnN1YnN0cigwLGhhc2hJbmRleCk7fQpsaW5lPWxpbmUudHJpbSgpO2lmKGxpbmUubGVuZ3RoPT09MCl7cmV0dXJuIG51bGw7fQpjb25zdCBjb2xvbkluZGV4PWxpbmUuaW5kZXhPZignOicpO2lmKGNvbG9uSW5kZXg9PT0tMSl7dGhyb3cgbmV3IEVycm9yKCdTeW50YXggbm90IHVuZGVyc3Rvb2QnKTt9CmNvbnN0IGRpcmVjdGl2ZU5hbWU9bGluZS5zbGljZSgwLGNvbG9uSW5kZXgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2NvbnN0IGRpcmVjdGl2ZVZhbHVlPWxpbmUuc2xpY2UoY29sb25JbmRleCsxKS50cmltKCk7dmVyaWZ5RGlyZWN0aXZlKGRpcmVjdGl2ZU5hbWUsZGlyZWN0aXZlVmFsdWUpO3JldHVybntkaXJlY3RpdmU6ZGlyZWN0aXZlTmFtZSx2YWx1ZTpkaXJlY3RpdmVWYWx1ZX07fQpmdW5jdGlvbiB2YWxpZGF0ZVJvYm90cyhjb250ZW50KXtjb25zdCBlcnJvcnM9W107bGV0IGluR3JvdXA9ZmFsc2U7Y29udGVudC5zcGxpdCgvXHJcbnxccnxcbi8pLmZvckVhY2goKGxpbmUsaW5kZXgpPT57bGV0IHBhcnNlZExpbmU7dHJ5e3BhcnNlZExpbmU9cGFyc2VMaW5lKGxpbmUpO31jYXRjaChlKXtlcnJvcnMucHVzaCh7aW5kZXg6KGluZGV4KzEpLnRvU3RyaW5nKCksbGluZTpsaW5lLG1lc3NhZ2U6ZS5tZXNzYWdlLnRvU3RyaW5nKCl9KTt9CmlmKCFwYXJzZWRMaW5lKXtyZXR1cm47fQppZihwYXJzZWRMaW5lLmRpcmVjdGl2ZT09PURJUkVDVElWRV9VU0VSX0FHRU5UKXtpbkdyb3VwPXRydWU7fWVsc2UgaWYoIWluR3JvdXAmJkRJUkVDVElWRVNfR1JPVVBfTUVNQkVSUy5oYXMocGFyc2VkTGluZS5kaXJlY3RpdmUpKXtlcnJvcnMucHVzaCh7aW5kZXg6KGluZGV4KzEpLnRvU3RyaW5nKCksbGluZTpsaW5lLG1lc3NhZ2U6J05vIHVzZXItYWdlbnQgc3BlY2lmaWVkJ30pO319KTtyZXR1cm4gZXJyb3JzO30KY2xhc3MgUm9ib3RzVHh0IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidyb2JvdHMtdHh0Jyx0aXRsZToncm9ib3RzLnR4dCBpcyB2YWxpZCcsZmFpbHVyZVRpdGxlOidyb2JvdHMudHh0IGlzIG5vdCB2YWxpZCcsZGVzY3JpcHRpb246J0lmIHlvdXIgcm9ib3RzLnR4dCBmaWxlIGlzIG1hbGZvcm1lZCwgY3Jhd2xlcnMgbWF5IG5vdCBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgJysnaG93IHlvdSB3YW50IHlvdXIgd2Vic2l0ZSB0byBiZSBjcmF3bGVkIG9yIGluZGV4ZWQuJyxyZXF1aXJlZEFydGlmYWN0czpbJ1JvYm90c1R4dCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0e3N0YXR1cyxjb250ZW50fT1hcnRpZmFjdHMuUm9ib3RzVHh0O2lmKCFzdGF0dXMpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjonTGlnaHRob3VzZSB3YXMgdW5hYmxlIHRvIGRvd25sb2FkIHlvdXIgcm9ib3RzLnR4dCBmaWxlJ307fQppZihzdGF0dXM+PUhUVFBfU0VSVkVSX0VSUk9SX0NPREVfTE9XKXtyZXR1cm57cmF3VmFsdWU6ZmFsc2UsZGlzcGxheVZhbHVlOmByZXF1ZXN0IGZvciByb2JvdHMudHh0IHJldHVybmVkIEhUVFAke3N0YXR1c31gfTt9ZWxzZSBpZihzdGF0dXM+PUhUVFBfQ0xJRU5UX0VSUk9SX0NPREVfTE9XfHxjb250ZW50PT09Jycpe3JldHVybntyYXdWYWx1ZTp0cnVlLG5vdEFwcGxpY2FibGU6dHJ1ZX07fQppZihjb250ZW50PT09bnVsbCl7dGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtzdGF0dXN9IHdhcyB2YWxpZCwgYnV0IGNvbnRlbnQgd2FzIG51bGxgKTt9CmNvbnN0IHZhbGlkYXRpb25FcnJvcnM9dmFsaWRhdGVSb2JvdHMoY29udGVudCk7Y29uc3QgaGVhZGluZ3M9W3trZXk6J2luZGV4JyxpdGVtVHlwZTondGV4dCcsdGV4dDonTGluZSAjJ30se2tleTonbGluZScsaXRlbVR5cGU6J2NvZGUnLHRleHQ6J0NvbnRlbnQnfSx7a2V5OidtZXNzYWdlJyxpdGVtVHlwZTonY29kZScsdGV4dDonRXJyb3InfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHZhbGlkYXRpb25FcnJvcnMse30pO2xldCBkaXNwbGF5VmFsdWU7aWYodmFsaWRhdGlvbkVycm9ycy5sZW5ndGgpe2Rpc3BsYXlWYWx1ZT12YWxpZGF0aW9uRXJyb3JzLmxlbmd0aD4xP2Ake3ZhbGlkYXRpb25FcnJvcnMubGVuZ3RofSBlcnJvcnMgZm91bmRgOicxIGVycm9yIGZvdW5kJzt9CnJldHVybntyYXdWYWx1ZTp2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aD09PTAsZGV0YWlscyxkaXNwbGF5VmFsdWV9O319Cm1vZHVsZS5leHBvcnRzPVJvYm90c1R4dDt9LHsiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL3NlcnZpY2Utd29ya2VyIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi9saWIvdXJsLXNoaW0nKTtjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y2xhc3MgU2VydmljZVdvcmtlciBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDonc2VydmljZS13b3JrZXInLHRpdGxlOidSZWdpc3RlcnMgYSBzZXJ2aWNlIHdvcmtlcicsZmFpbHVyZVRpdGxlOidEb2VzIG5vdCByZWdpc3RlciBhIHNlcnZpY2Ugd29ya2VyJyxkZXNjcmlwdGlvbjonVGhlIHNlcnZpY2Ugd29ya2VyIGlzIHRoZSB0ZWNobm9sb2d5IHRoYXQgZW5hYmxlcyB5b3VyIGFwcCB0byB1c2UgbWFueSAnKydQcm9ncmVzc2l2ZSBXZWIgQXBwIGZlYXR1cmVzLCBzdWNoIGFzIG9mZmxpbmUsIGFkZCB0byBob21lc2NyZWVuLCBhbmQgcHVzaCAnKydub3RpZmljYXRpb25zLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL3JlZ2lzdGVyZWQtc2VydmljZS13b3JrZXIpLicscmVxdWlyZWRBcnRpZmFjdHM6WydVUkwnLCdTZXJ2aWNlV29ya2VyJ119O30Kc3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3QgdmVyc2lvbnM9YXJ0aWZhY3RzLlNlcnZpY2VXb3JrZXIudmVyc2lvbnM7Y29uc3QgdXJsPWFydGlmYWN0cy5VUkwuZmluYWxVcmw7Y29uc3Qgb3JpZ2luPW5ldyBVUkwodXJsKS5vcmlnaW47Y29uc3QgbWF0Y2hpbmdTVz12ZXJzaW9ucy5maWx0ZXIodj0+di5zdGF0dXM9PT0nYWN0aXZhdGVkJykuZmluZCh2PT5uZXcgVVJMKHYuc2NyaXB0VVJMKS5vcmlnaW49PT1vcmlnaW4pO3JldHVybntyYXdWYWx1ZTohIW1hdGNoaW5nU1d9O319Cm1vZHVsZS5leHBvcnRzPVNlcnZpY2VXb3JrZXI7fSx7Ii4uL2xpYi91cmwtc2hpbSI6InVybCIsIi4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL3NwbGFzaC1zY3JlZW4iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTXVsdGlDaGVja0F1ZGl0PXJlcXVpcmUoJy4vbXVsdGktY2hlY2stYXVkaXQnKTtjbGFzcyBTcGxhc2hTY3JlZW4gZXh0ZW5kcyBNdWx0aUNoZWNrQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOidzcGxhc2gtc2NyZWVuJyx0aXRsZTonQ29uZmlndXJlZCBmb3IgYSBjdXN0b20gc3BsYXNoIHNjcmVlbicsZmFpbHVyZVRpdGxlOidJcyBub3QgY29uZmlndXJlZCBmb3IgYSBjdXN0b20gc3BsYXNoIHNjcmVlbicsZGVzY3JpcHRpb246J0EgdGhlbWVkIHNwbGFzaCBzY3JlZW4gZW5zdXJlcyBhIGhpZ2gtcXVhbGl0eSBleHBlcmllbmNlIHdoZW4gJysndXNlcnMgbGF1bmNoIHlvdXIgYXBwIGZyb20gdGhlaXIgaG9tZXNjcmVlbnMuIFtMZWFybiAnKydtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvY3VzdG9tLXNwbGFzaC1zY3JlZW4pLicscmVxdWlyZWRBcnRpZmFjdHM6WydNYW5pZmVzdCddfTt9CnN0YXRpYyBhc3Nlc3NNYW5pZmVzdChtYW5pZmVzdFZhbHVlcyxmYWlsdXJlcyl7aWYobWFuaWZlc3RWYWx1ZXMuaXNQYXJzZUZhaWx1cmUmJm1hbmlmZXN0VmFsdWVzLnBhcnNlRmFpbHVyZVJlYXNvbil7ZmFpbHVyZXMucHVzaChtYW5pZmVzdFZhbHVlcy5wYXJzZUZhaWx1cmVSZWFzb24pO3JldHVybjt9CmNvbnN0IHNwbGFzaFNjcmVlbkNoZWNrSWRzPVsnaGFzTmFtZScsJ2hhc0JhY2tncm91bmRDb2xvcicsJ2hhc1RoZW1lQ29sb3InLCdoYXNJY29uc0F0TGVhc3Q1MTJweCddO21hbmlmZXN0VmFsdWVzLmFsbENoZWNrcy5maWx0ZXIoaXRlbT0+c3BsYXNoU2NyZWVuQ2hlY2tJZHMuaW5jbHVkZXMoaXRlbS5pZCkpLmZvckVhY2goaXRlbT0+e2lmKCFpdGVtLnBhc3Npbmcpe2ZhaWx1cmVzLnB1c2goaXRlbS5mYWlsdXJlVGV4dCk7fX0pO30Kc3RhdGljIGF1ZGl0XyhhcnRpZmFjdHMpe2NvbnN0IGZhaWx1cmVzPVtdO3JldHVybiBhcnRpZmFjdHMucmVxdWVzdE1hbmlmZXN0VmFsdWVzKGFydGlmYWN0cy5NYW5pZmVzdCkudGhlbihtYW5pZmVzdFZhbHVlcz0+e1NwbGFzaFNjcmVlbi5hc3Nlc3NNYW5pZmVzdChtYW5pZmVzdFZhbHVlcyxmYWlsdXJlcyk7cmV0dXJue2ZhaWx1cmVzLG1hbmlmZXN0VmFsdWVzfTt9KTt9fQptb2R1bGUuZXhwb3J0cz1TcGxhc2hTY3JlZW47fSx7Ii4vbXVsdGktY2hlY2stYXVkaXQiOjV9XSwiLi4vYXVkaXRzL3RoZW1lZC1vbW5pYm94IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE11bHRpQ2hlY2tBdWRpdD1yZXF1aXJlKCcuL211bHRpLWNoZWNrLWF1ZGl0Jyk7Y29uc3QgdmFsaWRDb2xvcj1yZXF1aXJlKCcuLi9saWIvd2ViLWluc3BlY3RvcicpLkNvbG9yLnBhcnNlO2NsYXNzIFRoZW1lZE9tbmlib3ggZXh0ZW5kcyBNdWx0aUNoZWNrQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid0aGVtZWQtb21uaWJveCcsdGl0bGU6J0FkZHJlc3MgYmFyIG1hdGNoZXMgYnJhbmQgY29sb3JzJyxmYWlsdXJlVGl0bGU6J0FkZHJlc3MgYmFyIGRvZXMgbm90IG1hdGNoIGJyYW5kIGNvbG9ycycsZGVzY3JpcHRpb246J1RoZSBicm93c2VyIGFkZHJlc3MgYmFyIGNhbiBiZSB0aGVtZWQgdG8gbWF0Y2ggeW91ciBzaXRlLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL2FkZHJlc3MtYmFyKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnTWFuaWZlc3QnLCdUaGVtZUNvbG9yJ119O30Kc3RhdGljIGFzc2Vzc01ldGFUaGVtZWNvbG9yKHRoZW1lQ29sb3JNZXRhLGZhaWx1cmVzKXtpZih0aGVtZUNvbG9yTWV0YT09PW51bGwpe2ZhaWx1cmVzLnB1c2goJ05vIGA8bWV0YSBuYW1lPSJ0aGVtZS1jb2xvciI+YCB0YWcgZm91bmQnKTt9ZWxzZSBpZighdmFsaWRDb2xvcih0aGVtZUNvbG9yTWV0YSkpe2ZhaWx1cmVzLnB1c2goJ1RoZSB0aGVtZS1jb2xvciBtZXRhIHRhZyBkaWQgbm90IGNvbnRhaW4gYSB2YWxpZCBDU1MgY29sb3InKTt9fQpzdGF0aWMgYXNzZXNzTWFuaWZlc3QobWFuaWZlc3RWYWx1ZXMsZmFpbHVyZXMpe2lmKG1hbmlmZXN0VmFsdWVzLmlzUGFyc2VGYWlsdXJlJiZtYW5pZmVzdFZhbHVlcy5wYXJzZUZhaWx1cmVSZWFzb24pe2ZhaWx1cmVzLnB1c2gobWFuaWZlc3RWYWx1ZXMucGFyc2VGYWlsdXJlUmVhc29uKTtyZXR1cm47fQpjb25zdCB0aGVtZUNvbG9yQ2hlY2s9bWFuaWZlc3RWYWx1ZXMuYWxsQ2hlY2tzLmZpbmQoaT0+aS5pZD09PSdoYXNUaGVtZUNvbG9yJyk7aWYodGhlbWVDb2xvckNoZWNrJiYhdGhlbWVDb2xvckNoZWNrLnBhc3Npbmcpe2ZhaWx1cmVzLnB1c2godGhlbWVDb2xvckNoZWNrLmZhaWx1cmVUZXh0KTt9fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyl7Y29uc3QgZmFpbHVyZXM9W107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TWFuaWZlc3RWYWx1ZXMoYXJ0aWZhY3RzLk1hbmlmZXN0KS50aGVuKG1hbmlmZXN0VmFsdWVzPT57VGhlbWVkT21uaWJveC5hc3Nlc3NNYW5pZmVzdChtYW5pZmVzdFZhbHVlcyxmYWlsdXJlcyk7VGhlbWVkT21uaWJveC5hc3Nlc3NNZXRhVGhlbWVjb2xvcihhcnRpZmFjdHMuVGhlbWVDb2xvcixmYWlsdXJlcyk7cmV0dXJue2ZhaWx1cmVzLG1hbmlmZXN0VmFsdWVzLHRoZW1lQ29sb3I6YXJ0aWZhY3RzLlRoZW1lQ29sb3J9O30pO319Cm1vZHVsZS5leHBvcnRzPVRoZW1lZE9tbmlib3g7fSx7Ii4uL2xpYi93ZWItaW5zcGVjdG9yIjo0NywiLi9tdWx0aS1jaGVjay1hdWRpdCI6NX1dLCIuLi9hdWRpdHMvdGltZS10by1maXJzdC1ieXRlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBUVEZCX1RIUkVTSE9MRD02MDA7Y2xhc3MgVFRGQk1ldHJpYyBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondGltZS10by1maXJzdC1ieXRlJyx0aXRsZTonS2VlcCBzZXJ2ZXIgcmVzcG9uc2UgdGltZXMgbG93IChUVEZCKScsZGVzY3JpcHRpb246J1RpbWUgVG8gRmlyc3QgQnl0ZSBpZGVudGlmaWVzIHRoZSB0aW1lIGF0IHdoaWNoIHlvdXIgc2VydmVyIHNlbmRzIGEgcmVzcG9uc2UuJysnIFtMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvdHRmYikuJyxyZXF1aXJlZEFydGlmYWN0czpbJ2RldnRvb2xzTG9ncycsJ1VSTCddfTt9CnN0YXRpYyBjYWNsdWxhdGVUVEZCKHJlY29yZCl7Y29uc3QgdGltaW5nPXJlY29yZC50aW1pbmc7cmV0dXJuIHRpbWluZz90aW1pbmcucmVjZWl2ZUhlYWRlcnNFbmQtdGltaW5nLnNlbmRFbmQ6MDt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IGRldnRvb2xzTG9ncz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2dzKS50aGVuKG5ldHdvcmtSZWNvcmRzPT57bGV0IGRpc3BsYXlWYWx1ZT0nJztjb25zdCBmaW5hbFVybD1hcnRpZmFjdHMuVVJMLmZpbmFsVXJsO2NvbnN0IGZpbmFsVXJsUmVxdWVzdD1uZXR3b3JrUmVjb3Jkcy5maW5kKHJlY29yZD0+cmVjb3JkLnVybD09PWZpbmFsVXJsKTtpZighZmluYWxVcmxSZXF1ZXN0KXt0aHJvdyBuZXcgRXJyb3IoYGZpbmFsVXJsICcke2ZpbmFsVXJsfSBub3QgZm91bmQgaW4gbmV0d29yayByZWNvcmRzLmApO30KY29uc3QgdHRmYj1UVEZCTWV0cmljLmNhY2x1bGF0ZVRURkIoZmluYWxVcmxSZXF1ZXN0KTtjb25zdCBwYXNzZWQ9dHRmYjxUVEZCX1RIUkVTSE9MRDtpZighcGFzc2VkKXtkaXNwbGF5VmFsdWU9WydSb290IGRvY3VtZW50IHRvb2sgJTEwZCcsdHRmYl07fQpjb25zdCBkZXRhaWxzPXt0eXBlOidvcHBvcnR1bml0eScsb3ZlcmFsbFNhdmluZ3NNczp0dGZiLVRURkJfVEhSRVNIT0xELGhlYWRpbmdzOltdLGl0ZW1zOltdfTtyZXR1cm57cmF3VmFsdWU6dHRmYixzY29yZTpOdW1iZXIocGFzc2VkKSxkaXNwbGF5VmFsdWUsZGV0YWlscyxleHRlbmRlZEluZm86e3ZhbHVlOnt3YXN0ZWRNczp0dGZiLVRURkJfVEhSRVNIT0xEfX19O30pO319Cm1vZHVsZS5leHBvcnRzPVRURkJNZXRyaWM7fSx7Ii4vYXVkaXQiOjJ9XSwiLi4vYXVkaXRzL3VzZXItdGltaW5ncyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y2xhc3MgVXNlclRpbWluZ3MgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VzZXItdGltaW5ncycsc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLklORk9STUFUSVZFLHRpdGxlOidVc2VyIFRpbWluZyBtYXJrcyBhbmQgbWVhc3VyZXMnLGRlc2NyaXB0aW9uOidDb25zaWRlciBpbnN0cnVtZW50aW5nIHlvdXIgYXBwIHdpdGggdGhlIFVzZXIgVGltaW5nIEFQSSB0byBjcmVhdGUgY3VzdG9tLCAnKydyZWFsLXdvcmxkIG1lYXN1cmVtZW50cyBvZiBrZXkgdXNlciBleHBlcmllbmNlcy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy91c2VyLXRpbWluZykuJyxyZXF1aXJlZEFydGlmYWN0czpbJ3RyYWNlcyddfTt9CnN0YXRpYyBmaWx0ZXJUcmFjZSh0YWJUcmFjZSl7Y29uc3QgdXNlclRpbWluZ3M9W107Y29uc3QgbWVhc3VyZXNTdGFydFRpbWVzPXt9O3RhYlRyYWNlLnByb2Nlc3NFdmVudHMuZmlsdGVyKGV2dD0+e2lmKCFldnQuY2F0LmluY2x1ZGVzKCdibGluay51c2VyX3RpbWluZycpKXtyZXR1cm4gZmFsc2U7fQpyZXR1cm4gZXZ0Lm5hbWUhPT0ncmVxdWVzdFN0YXJ0JyYmZXZ0Lm5hbWUhPT0nbmF2aWdhdGlvblN0YXJ0JyYmZXZ0Lm5hbWUhPT0ncGFpbnROb25EZWZhdWx0QmFja2dyb3VuZENvbG9yJyYmZXZ0LmFyZ3MuZnJhbWU9PT11bmRlZmluZWQ7fSkuZm9yRWFjaCh1dD0+e2lmKHV0LnBoPT09J1InfHx1dC5waC50b1VwcGVyQ2FzZSgpPT09J0knKXt1c2VyVGltaW5ncy5wdXNoKHtuYW1lOnV0Lm5hbWUsaXNNYXJrOnRydWUsYXJnczp1dC5hcmdzLHN0YXJ0VGltZTp1dC50c30pO31lbHNlIGlmKHV0LnBoLnRvTG93ZXJDYXNlKCk9PT0nYicpe21lYXN1cmVzU3RhcnRUaW1lc1t1dC5uYW1lXT11dC50czt9ZWxzZSBpZih1dC5waC50b0xvd2VyQ2FzZSgpPT09J2UnKXt1c2VyVGltaW5ncy5wdXNoKHtuYW1lOnV0Lm5hbWUsaXNNYXJrOmZhbHNlLGFyZ3M6dXQuYXJncyxzdGFydFRpbWU6bWVhc3VyZXNTdGFydFRpbWVzW3V0Lm5hbWVdLGVuZFRpbWU6dXQudHMsZHVyYXRpb246dXQudHMtbWVhc3VyZXNTdGFydFRpbWVzW3V0Lm5hbWVdfSk7fX0pO3VzZXJUaW1pbmdzLmZvckVhY2godXQ9Pnt1dC5zdGFydFRpbWU9KHV0LnN0YXJ0VGltZS10YWJUcmFjZS5uYXZpZ2F0aW9uU3RhcnRFdnQudHMpLzEwMDA7aWYoIXV0LmlzTWFyayl7dXQuZW5kVGltZT0odXQuZW5kVGltZS10YWJUcmFjZS5uYXZpZ2F0aW9uU3RhcnRFdnQudHMpLzEwMDA7dXQuZHVyYXRpb249dXQuZHVyYXRpb24vMTAwMDt9fSk7cmV0dXJuIHVzZXJUaW1pbmdzO30Kc3RhdGljIGdldCBibGFja2xpc3RlZFByZWZpeGVzKCl7cmV0dXJuWydnb29nXyddO30Kc3RhdGljIGV4Y2x1ZGVCbGFja2xpc3RlZChldnQpe3JldHVybiBVc2VyVGltaW5ncy5ibGFja2xpc3RlZFByZWZpeGVzLmV2ZXJ5KHByZWZpeD0+IWV2dC5uYW1lLnN0YXJ0c1dpdGgocHJlZml4KSk7fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW0F1ZGl0LkRFRkFVTFRfUEFTU107cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0VHJhY2VPZlRhYih0cmFjZSkudGhlbih0YWJUcmFjZT0+e2NvbnN0IHVzZXJUaW1pbmdzPXRoaXMuZmlsdGVyVHJhY2UodGFiVHJhY2UpLmZpbHRlcihVc2VyVGltaW5ncy5leGNsdWRlQmxhY2tsaXN0ZWQpO2NvbnN0IHRhYmxlUm93cz11c2VyVGltaW5ncy5tYXAoaXRlbT0+e3JldHVybntuYW1lOml0ZW0ubmFtZSxzdGFydFRpbWU6aXRlbS5zdGFydFRpbWUsZHVyYXRpb246aXRlbS5pc01hcms/dW5kZWZpbmVkOml0ZW0uZHVyYXRpb24sdGltaW5nVHlwZTppdGVtLmlzTWFyaz8nTWFyayc6J01lYXN1cmUnfTt9KS5zb3J0KChpdGVtQSxpdGVtQik9PntpZihpdGVtQS50aW1pbmdUeXBlPT09aXRlbUIudGltaW5nVHlwZSl7cmV0dXJuIGl0ZW1BLnN0YXJ0VGltZS1pdGVtQi5zdGFydFRpbWU7fWVsc2UgaWYoaXRlbUEudGltaW5nVHlwZT09PSdNZWFzdXJlJyl7cmV0dXJuLTE7fWVsc2V7cmV0dXJuIDE7fX0pO2NvbnN0IGhlYWRpbmdzPVt7a2V5OiduYW1lJyxpdGVtVHlwZTondGV4dCcsdGV4dDonTmFtZSd9LHtrZXk6J3RpbWluZ1R5cGUnLGl0ZW1UeXBlOid0ZXh0Jyx0ZXh0OidUeXBlJ30se2tleTonc3RhcnRUaW1lJyxpdGVtVHlwZTonbXMnLGdyYW51bGFyaXR5OjAuMDEsdGV4dDonU3RhcnQgVGltZSd9LHtrZXk6J2R1cmF0aW9uJyxpdGVtVHlwZTonbXMnLGdyYW51bGFyaXR5OjAuMDEsdGV4dDonRHVyYXRpb24nfV07Y29uc3QgZGV0YWlscz1BdWRpdC5tYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHRhYmxlUm93cyk7bGV0IGRpc3BsYXlWYWx1ZTtpZih1c2VyVGltaW5ncy5sZW5ndGgpe2Rpc3BsYXlWYWx1ZT1bdXNlclRpbWluZ3MubGVuZ3RoPT09MT8nJWQgdXNlciB0aW1pbmcnOiclZCB1c2VyIHRpbWluZ3MnLHVzZXJUaW1pbmdzLmxlbmd0aF07fQpyZXR1cm57cmF3VmFsdWU6dXNlclRpbWluZ3MubGVuZ3RoPT09MCxub3RBcHBsaWNhYmxlOnVzZXJUaW1pbmdzLmxlbmd0aD09PTAsZGlzcGxheVZhbHVlLGV4dGVuZGVkSW5mbzp7dmFsdWU6dXNlclRpbWluZ3N9LGRldGFpbHN9O30pO319Cm1vZHVsZS5leHBvcnRzPVVzZXJUaW1pbmdzO30seyIuL2F1ZGl0IjoyfV0sIi4uL2F1ZGl0cy91c2VzLXJlbC1wcmVjb25uZWN0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVbnVzZWRCeXRlcz1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBQUkVDT05ORUNUX1NPQ0tFVF9NQVhfSURMRT0xNTtjb25zdCBJR05PUkVfVEhSRVNIT0xEX0lOX01TPTUwO2NsYXNzIFVzZXNSZWxQcmVjb25uZWN0QXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VzZXMtcmVsLXByZWNvbm5lY3QnLHRpdGxlOidBdm9pZCBtdWx0aXBsZSwgY29zdGx5IHJvdW5kIHRyaXBzIHRvIGFueSBvcmlnaW4nLGRlc2NyaXB0aW9uOidDb25zaWRlciBhZGRpbmcgcHJlY29ubmVjdCBvciBkbnMtcHJlZmV0Y2ggcmVzb3VyY2UgaGludHMgdG8gZXN0YWJsaXNoIGVhcmx5ICcrYGNvbm5lY3Rpb25zIHRvIGltcG9ydGFudCB0aGlyZC1wYXJ0eSBvcmlnaW5zLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9wZXJmb3JtYW5jZS9yZXNvdXJjZS1wcmlvcml0aXphdGlvbiNwcmVjb25uZWN0KS5gLHJlcXVpcmVkQXJ0aWZhY3RzOlsnZGV2dG9vbHNMb2dzJywnVVJMJ10sc2NvcmVEaXNwbGF5TW9kZTpBdWRpdC5TQ09SSU5HX01PREVTLk5VTUVSSUN9O30Kc3RhdGljIGhhc1ZhbGlkVGltaW5nKHJlY29yZCl7cmV0dXJuISFyZWNvcmQudGltaW5nJiZyZWNvcmQudGltaW5nLmNvbm5lY3RFbmQ+MCYmcmVjb3JkLnRpbWluZy5jb25uZWN0U3RhcnQ+MDt9CnN0YXRpYyBoYXNBbHJlYWR5Q29ubmVjdGVkVG9PcmlnaW4ocmVjb3JkKXtyZXR1cm4oISFyZWNvcmQudGltaW5nJiZyZWNvcmQudGltaW5nLmRuc0VuZC1yZWNvcmQudGltaW5nLmRuc1N0YXJ0PT09MCYmcmVjb3JkLnRpbWluZy5jb25uZWN0RW5kLXJlY29yZC50aW1pbmcuY29ubmVjdFN0YXJ0PT09MCk7fQpzdGF0aWMgc29ja2V0U3RhcnRUaW1lSXNCZWxvd1RocmVzaG9sZChyZWNvcmQsbWFpblJlc291cmNlKXtyZXR1cm4gTWF0aC5tYXgoMCxyZWNvcmQuc3RhcnRUaW1lLW1haW5SZXNvdXJjZS5lbmRUaW1lKTxQUkVDT05ORUNUX1NPQ0tFVF9NQVhfSURMRTt9CnN0YXRpYyBhc3luYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1tVc2VzUmVsUHJlY29ubmVjdEF1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3QgVVJMPWFydGlmYWN0cy5VUkw7Y29uc3Qgc2V0dGluZ3M9Y29udGV4dC5zZXR0aW5ncztsZXQgbWF4V2FzdGVkPTA7Y29uc3RbbmV0d29ya1JlY29yZHMsbWFpblJlc291cmNlLGxvYWRTaW11bGF0b3JdPWF3YWl0IFByb21pc2UuYWxsKFthcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9nKSxhcnRpZmFjdHMucmVxdWVzdE1haW5SZXNvdXJjZSh7ZGV2dG9vbHNMb2csVVJMfSksYXJ0aWZhY3RzLnJlcXVlc3RMb2FkU2ltdWxhdG9yKHtkZXZ0b29sc0xvZyxzZXR0aW5nc30pXSk7Y29uc3R7cnR0LGFkZGl0aW9uYWxSdHRCeU9yaWdpbn09bG9hZFNpbXVsYXRvci5nZXRPcHRpb25zKCk7Y29uc3Qgb3JpZ2lucz1uZXcgTWFwKCk7bmV0d29ya1JlY29yZHMuZm9yRWFjaChyZWNvcmQ9PntpZighVXNlc1JlbFByZWNvbm5lY3RBdWRpdC5oYXNWYWxpZFRpbWluZyhyZWNvcmQpfHxyZWNvcmQuaW5pdGlhdG9yLnVybD09PW1haW5SZXNvdXJjZS51cmx8fCFyZWNvcmQucGFyc2VkVVJMfHwhcmVjb3JkLnBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbnx8bWFpblJlc291cmNlLnBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbj09PXJlY29yZC5wYXJzZWRVUkwuc2VjdXJpdHlPcmlnaW58fFVzZXNSZWxQcmVjb25uZWN0QXVkaXQuaGFzQWxyZWFkeUNvbm5lY3RlZFRvT3JpZ2luKHJlY29yZCl8fCFVc2VzUmVsUHJlY29ubmVjdEF1ZGl0LnNvY2tldFN0YXJ0VGltZUlzQmVsb3dUaHJlc2hvbGQocmVjb3JkLG1haW5SZXNvdXJjZSkpCntyZXR1cm47fQpjb25zdCBzZWN1cml0eU9yaWdpbj1yZWNvcmQucGFyc2VkVVJMLnNlY3VyaXR5T3JpZ2luO2NvbnN0IHJlY29yZHM9b3JpZ2lucy5nZXQoc2VjdXJpdHlPcmlnaW4pfHxbXTtyZWNvcmRzLnB1c2gocmVjb3JkKTtvcmlnaW5zLnNldChzZWN1cml0eU9yaWdpbixyZWNvcmRzKTt9KTtsZXQgcmVzdWx0cz1bXTtvcmlnaW5zLmZvckVhY2gocmVjb3Jkcz0+e2NvbnN0IGZpcnN0UmVjb3JkT2ZPcmlnaW49cmVjb3Jkcy5yZWR1Y2UoKGZpcnN0UmVjb3JkLHJlY29yZCk9PntyZXR1cm4gcmVjb3JkLnN0YXJ0VGltZTxmaXJzdFJlY29yZC5zdGFydFRpbWU/cmVjb3JkOmZpcnN0UmVjb3JkO30pO2lmKCFmaXJzdFJlY29yZE9mT3JpZ2luLnRpbWluZylyZXR1cm47Y29uc3Qgc2VjdXJpdHlPcmlnaW49Zmlyc3RSZWNvcmRPZk9yaWdpbi5wYXJzZWRVUkwuc2VjdXJpdHlPcmlnaW47Y29uc3QgYWRkaXRpb25hbFJ0dD1hZGRpdGlvbmFsUnR0QnlPcmlnaW4uZ2V0KHNlY3VyaXR5T3JpZ2luKXx8MDtsZXQgY29ubmVjdGlvblRpbWU9cnR0K2FkZGl0aW9uYWxSdHQ7aWYoZmlyc3RSZWNvcmRPZk9yaWdpbi5wYXJzZWRVUkwuc2NoZW1lPT09J2h0dHBzJyljb25uZWN0aW9uVGltZT1jb25uZWN0aW9uVGltZSoyO2NvbnN0IHRpbWVCZXR3ZWVuTWFpblJlc291cmNlQW5kRG5zU3RhcnQ9Zmlyc3RSZWNvcmRPZk9yaWdpbi5zdGFydFRpbWUqMTAwMC0KbWFpblJlc291cmNlLmVuZFRpbWUqMTAwMCsKZmlyc3RSZWNvcmRPZk9yaWdpbi50aW1pbmcuZG5zU3RhcnQ7Y29uc3Qgd2FzdGVkTXM9TWF0aC5taW4oY29ubmVjdGlvblRpbWUsdGltZUJldHdlZW5NYWluUmVzb3VyY2VBbmREbnNTdGFydCk7aWYod2FzdGVkTXM8SUdOT1JFX1RIUkVTSE9MRF9JTl9NUylyZXR1cm47bWF4V2FzdGVkPU1hdGgubWF4KHdhc3RlZE1zLG1heFdhc3RlZCk7cmVzdWx0cy5wdXNoKHt1cmw6c2VjdXJpdHlPcmlnaW4sd2FzdGVkTXM6d2FzdGVkTXN9KTt9KTtyZXN1bHRzPXJlc3VsdHMuc29ydCgoYSxiKT0+Yi53YXN0ZWRNcy1hLndhc3RlZE1zKTtjb25zdCBoZWFkaW5ncz1be2tleTondXJsJyx2YWx1ZVR5cGU6J3VybCcsbGFiZWw6J09yaWdpbid9LHtrZXk6J3dhc3RlZE1zJyx2YWx1ZVR5cGU6J3RpbWVzcGFuTXMnLGxhYmVsOidQb3RlbnRpYWwgU2F2aW5ncyd9XTtjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VPcHBvcnR1bml0eURldGFpbHMoaGVhZGluZ3MscmVzdWx0cyxtYXhXYXN0ZWQpO3JldHVybntzY29yZTpVbnVzZWRCeXRlcy5zY29yZUZvcldhc3RlZE1zKG1heFdhc3RlZCkscmF3VmFsdWU6bWF4V2FzdGVkLGRpc3BsYXlWYWx1ZTpbJ1BvdGVudGlhbCBzYXZpbmdzIG9mICUxMGRceGEwbXMnLG1heFdhc3RlZF0sZXh0ZW5kZWRJbmZvOnt2YWx1ZTpyZXN1bHRzfSxkZXRhaWxzfTt9fQptb2R1bGUuZXhwb3J0cz1Vc2VzUmVsUHJlY29ubmVjdEF1ZGl0O30seyIuL2F1ZGl0IjoyLCIuL2J5dGUtZWZmaWNpZW5jeS9ieXRlLWVmZmljaWVuY3ktYXVkaXQiOjN9XSwiLi4vYXVkaXRzL3VzZXMtcmVsLXByZWxvYWQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgVVJMPXJlcXVpcmUoJy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4vYXVkaXQnKTtjb25zdCBVbnVzZWRCeXRlcz1yZXF1aXJlKCcuL2J5dGUtZWZmaWNpZW5jeS9ieXRlLWVmZmljaWVuY3ktYXVkaXQnKTtjb25zdCBUSFJFU0hPTERfSU5fTVM9MTAwO2NsYXNzIFVzZXNSZWxQcmVsb2FkQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3VzZXMtcmVsLXByZWxvYWQnLHRpdGxlOidQcmVsb2FkIGtleSByZXF1ZXN0cycsZGVzY3JpcHRpb246J0NvbnNpZGVyIHVzaW5nIDxsaW5rIHJlbD1wcmVsb2FkPiB0byBwcmlvcml0aXplIGZldGNoaW5nIGxhdGUtZGlzY292ZXJlZCAnKydyZXNvdXJjZXMgc29vbmVyLiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Rvb2xzL2xpZ2h0aG91c2UvYXVkaXRzL3ByZWxvYWQpLicscmVxdWlyZWRBcnRpZmFjdHM6WydkZXZ0b29sc0xvZ3MnLCd0cmFjZXMnLCdVUkwnXSxzY29yZURpc3BsYXlNb2RlOkF1ZGl0LlNDT1JJTkdfTU9ERVMuTlVNRVJJQ307fQpzdGF0aWMgX2ZsYXR0ZW5SZXF1ZXN0cyhjaGFpbnMsbWF4TGV2ZWwsbWluTGV2ZWw9MCl7Y29uc3QgcmVxdWVzdHM9W107Y29uc3QgZmxhdHRlbj0oY2hhaW5zLGxldmVsKT0+e09iamVjdC5rZXlzKGNoYWlucykuZm9yRWFjaChjaGFpbj0+e2lmKGNoYWluc1tjaGFpbl0pe2NvbnN0IGN1cnJlbnRDaGFpbj1jaGFpbnNbY2hhaW5dO2lmKGxldmVsPj1taW5MZXZlbCl7cmVxdWVzdHMucHVzaChjdXJyZW50Q2hhaW4ucmVxdWVzdCk7fQppZihsZXZlbDxtYXhMZXZlbCl7ZmxhdHRlbihjdXJyZW50Q2hhaW4uY2hpbGRyZW4sbGV2ZWwrMSk7fX19KTt9O2ZsYXR0ZW4oY2hhaW5zLDApO3JldHVybiByZXF1ZXN0czt9CnN0YXRpYyBzaG91bGRQcmVsb2FkKHJlcXVlc3QsbWFpblJlc291cmNlKXtpZihyZXF1ZXN0LmlzTGlua1ByZWxvYWR8fFVSTC5OT05fTkVUV09SS19QUk9UT0NPTFMuaW5jbHVkZXMocmVxdWVzdC5wcm90b2NvbCkpe3JldHVybiBmYWxzZTt9CnJldHVybiBVUkwucm9vdERvbWFpbnNNYXRjaChyZXF1ZXN0LnVybCxtYWluUmVzb3VyY2UudXJsKTt9CnN0YXRpYyBjb21wdXRlV2FzdGVXaXRoR3JhcGgodXJscyxncmFwaCxzaW11bGF0b3Ipe2lmKCF1cmxzLnNpemUpe3JldHVybnt3YXN0ZWRNczowLHJlc3VsdHM6W119O30KY29uc3Qgc2ltdWxhdGlvbkJlZm9yZUNoYW5nZXM9c2ltdWxhdG9yLnNpbXVsYXRlKGdyYXBoLHtmbGV4aWJsZU9yZGVyaW5nOnRydWV9KTtjb25zdCBtb2RpZmllZEdyYXBoPWdyYXBoLmNsb25lV2l0aFJlbGF0aW9uc2hpcHMoKTtjb25zdCBub2Rlc1RvUHJlbG9hZD1bXTtsZXQgbWFpbkRvY3VtZW50Tm9kZT1udWxsO21vZGlmaWVkR3JhcGgudHJhdmVyc2Uobm9kZT0+e2lmKG5vZGUudHlwZSE9PSduZXR3b3JrJylyZXR1cm47Y29uc3QgbmV0d29ya05vZGU9bm9kZTtpZihub2RlLmlzTWFpbkRvY3VtZW50KCkpe21haW5Eb2N1bWVudE5vZGU9bmV0d29ya05vZGU7fWVsc2UgaWYobmV0d29ya05vZGUucmVjb3JkJiZ1cmxzLmhhcyhuZXR3b3JrTm9kZS5yZWNvcmQudXJsKSl7bm9kZXNUb1ByZWxvYWQucHVzaChuZXR3b3JrTm9kZSk7fX0pO2lmKCFtYWluRG9jdW1lbnROb2RlKXt0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIG1haW4gZG9jdW1lbnQgbm9kZScpO30KZm9yKGNvbnN0IG5vZGUgb2Ygbm9kZXNUb1ByZWxvYWQpe25vZGUucmVtb3ZlQWxsRGVwZW5kZW5jaWVzKCk7bm9kZS5hZGREZXBlbmRlbmN5KG1haW5Eb2N1bWVudE5vZGUpO30KY29uc3Qgc2ltdWxhdGlvbkFmdGVyQ2hhbmdlcz1zaW11bGF0b3Iuc2ltdWxhdGUobW9kaWZpZWRHcmFwaCx7ZmxleGlibGVPcmRlcmluZzp0cnVlfSk7Y29uc3Qgb3JpZ2luYWxOb2Rlc0J5UmVjb3JkPUFycmF5LmZyb20oc2ltdWxhdGlvbkJlZm9yZUNoYW5nZXMubm9kZVRpbWluZ3Mua2V5cygpKS5yZWR1Y2UoKG1hcCxub2RlKT0+bWFwLnNldChub2RlLnJlY29yZCxub2RlKSxuZXcgTWFwKCkpO2NvbnN0IHJlc3VsdHM9W107Zm9yKGNvbnN0IG5vZGUgb2Ygbm9kZXNUb1ByZWxvYWQpe2NvbnN0IG9yaWdpbmFsTm9kZT1vcmlnaW5hbE5vZGVzQnlSZWNvcmQuZ2V0KG5vZGUucmVjb3JkKTtjb25zdCB0aW1pbmdBZnRlcj1zaW11bGF0aW9uQWZ0ZXJDaGFuZ2VzLm5vZGVUaW1pbmdzLmdldChub2RlKTtjb25zdCB0aW1pbmdCZWZvcmU9c2ltdWxhdGlvbkJlZm9yZUNoYW5nZXMubm9kZVRpbWluZ3MuZ2V0KG9yaWdpbmFsTm9kZSk7aWYoIXRpbWluZ0JlZm9yZXx8IXRpbWluZ0FmdGVyKXRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcmVsb2FkIG5vZGUnKTtjb25zdCB3YXN0ZWRNcz1NYXRoLnJvdW5kKHRpbWluZ0JlZm9yZS5lbmRUaW1lLXRpbWluZ0FmdGVyLmVuZFRpbWUpO2lmKHdhc3RlZE1zPFRIUkVTSE9MRF9JTl9NUyljb250aW51ZTtyZXN1bHRzLnB1c2goe3VybDpub2RlLnJlY29yZC51cmwsd2FzdGVkTXN9KTt9CmlmKCFyZXN1bHRzLmxlbmd0aCl7cmV0dXJue3dhc3RlZE1zOjAscmVzdWx0c307fQpyZXR1cm57d2FzdGVkTXM6TWF0aC5tYXgoLi4ucmVzdWx0cy5tYXAoaXRlbT0+aXRlbS53YXN0ZWRNcykpLHJlc3VsdHN9O30Kc3RhdGljIGFzeW5jIGF1ZGl0KGFydGlmYWN0cyxjb250ZXh0KXtjb25zdCB0cmFjZT1hcnRpZmFjdHMudHJhY2VzW1VzZXNSZWxQcmVsb2FkQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW1VzZXNSZWxQcmVsb2FkQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBVUkw9YXJ0aWZhY3RzLlVSTDtjb25zdCBzaW11bGF0b3JPcHRpb25zPXt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nczpjb250ZXh0LnNldHRpbmdzfTtjb25zdFtjcml0Q2hhaW5zLG1haW5SZXNvdXJjZSxncmFwaCxzaW11bGF0b3JdPWF3YWl0IFByb21pc2UuYWxsKFthcnRpZmFjdHMucmVxdWVzdENyaXRpY2FsUmVxdWVzdENoYWlucyh7ZGV2dG9vbHNMb2csVVJMfSksYXJ0aWZhY3RzLnJlcXVlc3RNYWluUmVzb3VyY2Uoe2RldnRvb2xzTG9nLFVSTH0pLGFydGlmYWN0cy5yZXF1ZXN0UGFnZURlcGVuZGVuY3lHcmFwaCh7dHJhY2UsZGV2dG9vbHNMb2d9KSxhcnRpZmFjdHMucmVxdWVzdExvYWRTaW11bGF0b3Ioc2ltdWxhdG9yT3B0aW9ucyldKTtjb25zdCBtYWluUmVzb3VyY2VJbmRleD1tYWluUmVzb3VyY2UucmVkaXJlY3RzP21haW5SZXNvdXJjZS5yZWRpcmVjdHMubGVuZ3RoOjA7Y29uc3QgY3JpdGljYWxSZXF1ZXN0cz1Vc2VzUmVsUHJlbG9hZEF1ZGl0Ll9mbGF0dGVuUmVxdWVzdHMoY3JpdENoYWlucywzK21haW5SZXNvdXJjZUluZGV4LDIrbWFpblJlc291cmNlSW5kZXgpO2NvbnN0IHVybHM9bmV3IFNldCgpO2Zvcihjb25zdCBuZXR3b3JrUmVjb3JkIG9mIGNyaXRpY2FsUmVxdWVzdHMpe2lmKFVzZXNSZWxQcmVsb2FkQXVkaXQuc2hvdWxkUHJlbG9hZChuZXR3b3JrUmVjb3JkLG1haW5SZXNvdXJjZSkpe3VybHMuYWRkKG5ldHdvcmtSZWNvcmQudXJsKTt9fQpjb25zdHtyZXN1bHRzLHdhc3RlZE1zfT1Vc2VzUmVsUHJlbG9hZEF1ZGl0LmNvbXB1dGVXYXN0ZVdpdGhHcmFwaCh1cmxzLGdyYXBoLHNpbXVsYXRvcik7cmVzdWx0cy5zb3J0KChhLGIpPT5iLndhc3RlZE1zLWEud2FzdGVkTXMpO2NvbnN0IGhlYWRpbmdzPVt7a2V5Oid1cmwnLHZhbHVlVHlwZTondXJsJyxsYWJlbDonVVJMJ30se2tleTond2FzdGVkTXMnLHZhbHVlVHlwZTondGltZXNwYW5NcycsbGFiZWw6J1BvdGVudGlhbCBTYXZpbmdzJ31dO2NvbnN0IGRldGFpbHM9QXVkaXQubWFrZU9wcG9ydHVuaXR5RGV0YWlscyhoZWFkaW5ncyxyZXN1bHRzLHdhc3RlZE1zKTtyZXR1cm57c2NvcmU6VW51c2VkQnl0ZXMuc2NvcmVGb3JXYXN0ZWRNcyh3YXN0ZWRNcykscmF3VmFsdWU6d2FzdGVkTXMsZGlzcGxheVZhbHVlOlsnUG90ZW50aWFsIHNhdmluZ3Mgb2YgJTEwZFx4YTBtcycsd2FzdGVkTXNdLGV4dGVuZGVkSW5mbzp7dmFsdWU6cmVzdWx0c30sZGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9VXNlc1JlbFByZWxvYWRBdWRpdDt9LHsiLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9hdWRpdCI6MiwiLi9ieXRlLWVmZmljaWVuY3kvYnl0ZS1lZmZpY2llbmN5LWF1ZGl0IjozfV0sIi4uL2F1ZGl0cy92aWV3cG9ydCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y29uc3QgUGFyc2VyPXJlcXVpcmUoJ21ldGF2aWV3cG9ydC1wYXJzZXInKTtjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDondmlld3BvcnQnLHRpdGxlOidIYXMgYSBgPG1ldGEgbmFtZT0idmlld3BvcnQiPmAgdGFnIHdpdGggYHdpZHRoYCBvciBgaW5pdGlhbC1zY2FsZWAnLGZhaWx1cmVUaXRsZTonRG9lcyBub3QgaGF2ZSBhIGA8bWV0YSBuYW1lPSJ2aWV3cG9ydCI+YCB0YWcgd2l0aCBgd2lkdGhgICcrJ29yIGBpbml0aWFsLXNjYWxlYCcsZGVzY3JpcHRpb246J0FkZCBhIHZpZXdwb3J0IG1ldGEgdGFnIHRvIG9wdGltaXplIHlvdXIgYXBwIGZvciBtb2JpbGUgc2NyZWVucy4gJysnW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9saWdodGhvdXNlL2F1ZGl0cy9oYXMtdmlld3BvcnQtbWV0YS10YWcpLicscmVxdWlyZWRBcnRpZmFjdHM6WydWaWV3cG9ydCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2lmKGFydGlmYWN0cy5WaWV3cG9ydD09PW51bGwpe3JldHVybntleHBsYW5hdGlvbjonTm8gdmlld3BvcnQgbWV0YSB0YWcgZm91bmQnLHJhd1ZhbHVlOmZhbHNlfTt9CmNvbnN0IHdhcm5pbmdzPVtdO2NvbnN0IHBhcnNlZFByb3BzPVBhcnNlci5wYXJzZU1ldGFWaWV3UG9ydENvbnRlbnQoYXJ0aWZhY3RzLlZpZXdwb3J0KTtpZihPYmplY3Qua2V5cyhwYXJzZWRQcm9wcy51bmtub3duUHJvcGVydGllcykubGVuZ3RoKXt3YXJuaW5ncy5wdXNoKGBJbnZhbGlkIHByb3BlcnRpZXMgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkocGFyc2VkUHJvcHMudW5rbm93blByb3BlcnRpZXMpfWApO30KaWYoT2JqZWN0LmtleXMocGFyc2VkUHJvcHMuaW52YWxpZFZhbHVlcykubGVuZ3RoKXt3YXJuaW5ncy5wdXNoKGBJbnZhbGlkIHZhbHVlcyBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShwYXJzZWRQcm9wcy5pbnZhbGlkVmFsdWVzKX1gKTt9CmNvbnN0IHZpZXdwb3J0UHJvcHM9cGFyc2VkUHJvcHMudmFsaWRQcm9wZXJ0aWVzO2NvbnN0IGhhc01vYmlsZVZpZXdwb3J0PXZpZXdwb3J0UHJvcHMud2lkdGh8fHZpZXdwb3J0UHJvcHNbJ2luaXRpYWwtc2NhbGUnXTtyZXR1cm57cmF3VmFsdWU6ISFoYXNNb2JpbGVWaWV3cG9ydCx3YXJuaW5nc307fX0KbW9kdWxlLmV4cG9ydHM9Vmlld3BvcnQ7fSx7Ii4vYXVkaXQiOjIsIm1ldGF2aWV3cG9ydC1wYXJzZXIiOjEyN31dLCIuLi9hdWRpdHMvd2ViYXBwLWluc3RhbGwtYmFubmVyIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE11bHRpQ2hlY2tBdWRpdD1yZXF1aXJlKCcuL211bHRpLWNoZWNrLWF1ZGl0Jyk7Y29uc3QgU1dBdWRpdD1yZXF1aXJlKCcuL3NlcnZpY2Utd29ya2VyJyk7Y2xhc3MgV2ViYXBwSW5zdGFsbEJhbm5lciBleHRlbmRzIE11bHRpQ2hlY2tBdWRpdHtzdGF0aWMgZ2V0IG1ldGEoKXtyZXR1cm57aWQ6J3dlYmFwcC1pbnN0YWxsLWJhbm5lcicsdGl0bGU6J1VzZXIgY2FuIGJlIHByb21wdGVkIHRvIEluc3RhbGwgdGhlIFdlYiBBcHAnLGZhaWx1cmVUaXRsZTonVXNlciB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byBJbnN0YWxsIHRoZSBXZWIgQXBwJyxkZXNjcmlwdGlvbjonQnJvd3NlcnMgY2FuIHByb2FjdGl2ZWx5IHByb21wdCB1c2VycyB0byBhZGQgeW91ciBhcHAgdG8gdGhlaXIgaG9tZXNjcmVlbiwgJysnd2hpY2ggY2FuIGxlYWQgdG8gaGlnaGVyIGVuZ2FnZW1lbnQuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvaW5zdGFsbC1wcm9tcHQpLicscmVxdWlyZWRBcnRpZmFjdHM6WydVUkwnLCdTZXJ2aWNlV29ya2VyJywnTWFuaWZlc3QnLCdTdGFydFVybCddfTt9CnN0YXRpYyBhc3Nlc3NNYW5pZmVzdChtYW5pZmVzdFZhbHVlcyl7aWYobWFuaWZlc3RWYWx1ZXMuaXNQYXJzZUZhaWx1cmUmJm1hbmlmZXN0VmFsdWVzLnBhcnNlRmFpbHVyZVJlYXNvbil7cmV0dXJuW21hbmlmZXN0VmFsdWVzLnBhcnNlRmFpbHVyZVJlYXNvbl07fQpjb25zdCBmYWlsdXJlcz1bXTtjb25zdCBiYW5uZXJDaGVja0lkcz1bJ2hhc05hbWUnLCdoYXNTaG9ydE5hbWUnLCdoYXNTdGFydFVybCcsJ2hhc1BXQURpc3BsYXlWYWx1ZScsJ2hhc0ljb25zQXRMZWFzdDE5MnB4J107bWFuaWZlc3RWYWx1ZXMuYWxsQ2hlY2tzLmZpbHRlcihpdGVtPT5iYW5uZXJDaGVja0lkcy5pbmNsdWRlcyhpdGVtLmlkKSkuZm9yRWFjaChpdGVtPT57aWYoIWl0ZW0ucGFzc2luZyl7ZmFpbHVyZXMucHVzaChpdGVtLmZhaWx1cmVUZXh0KTt9fSk7cmV0dXJuIGZhaWx1cmVzO30Kc3RhdGljIGFzc2Vzc1NlcnZpY2VXb3JrZXIoYXJ0aWZhY3RzKXtjb25zdCBmYWlsdXJlcz1bXTtjb25zdCBoYXNTZXJ2aWNlV29ya2VyPVNXQXVkaXQuYXVkaXQoYXJ0aWZhY3RzKS5yYXdWYWx1ZTtpZighaGFzU2VydmljZVdvcmtlcil7ZmFpbHVyZXMucHVzaCgnU2l0ZSBkb2VzIG5vdCByZWdpc3RlciBhIHNlcnZpY2Ugd29ya2VyJyk7fQpyZXR1cm4gZmFpbHVyZXM7fQpzdGF0aWMgYXNzZXNzT2ZmbGluZVN0YXJ0VXJsKGFydGlmYWN0cyl7Y29uc3QgZmFpbHVyZXM9W107Y29uc3Qgd2FybmluZ3M9W107Y29uc3QgaGFzT2ZmbGluZVN0YXJ0VXJsPWFydGlmYWN0cy5TdGFydFVybC5zdGF0dXNDb2RlPT09MjAwO2lmKCFoYXNPZmZsaW5lU3RhcnRVcmwpe2ZhaWx1cmVzLnB1c2goJ1NlcnZpY2Ugd29ya2VyIGRvZXMgbm90IHN1Y2Nlc3NmdWxseSBzZXJ2ZSB0aGUgbWFuaWZlc3RcJ3Mgc3RhcnRfdXJsJyk7aWYoYXJ0aWZhY3RzLlN0YXJ0VXJsLmRlYnVnU3RyaW5nKXtmYWlsdXJlcy5wdXNoKGFydGlmYWN0cy5TdGFydFVybC5kZWJ1Z1N0cmluZyk7fX0KaWYoYXJ0aWZhY3RzLlN0YXJ0VXJsLmRlYnVnU3RyaW5nKXt3YXJuaW5ncy5wdXNoKGFydGlmYWN0cy5TdGFydFVybC5kZWJ1Z1N0cmluZyk7fQpyZXR1cm57ZmFpbHVyZXMsd2FybmluZ3N9O30Kc3RhdGljIGF1ZGl0XyhhcnRpZmFjdHMpe2xldCBvZmZsaW5lRmFpbHVyZXM9W107bGV0IG9mZmxpbmVXYXJuaW5ncz1bXTtyZXR1cm4gYXJ0aWZhY3RzLnJlcXVlc3RNYW5pZmVzdFZhbHVlcyhhcnRpZmFjdHMuTWFuaWZlc3QpLnRoZW4obWFuaWZlc3RWYWx1ZXM9Pntjb25zdCBtYW5pZmVzdEZhaWx1cmVzPVdlYmFwcEluc3RhbGxCYW5uZXIuYXNzZXNzTWFuaWZlc3QobWFuaWZlc3RWYWx1ZXMpO2NvbnN0IHN3RmFpbHVyZXM9V2ViYXBwSW5zdGFsbEJhbm5lci5hc3Nlc3NTZXJ2aWNlV29ya2VyKGFydGlmYWN0cyk7aWYoIXN3RmFpbHVyZXMubGVuZ3RoKXtjb25zdHtmYWlsdXJlcyx3YXJuaW5nc309V2ViYXBwSW5zdGFsbEJhbm5lci5hc3Nlc3NPZmZsaW5lU3RhcnRVcmwoYXJ0aWZhY3RzKTtvZmZsaW5lRmFpbHVyZXM9ZmFpbHVyZXM7b2ZmbGluZVdhcm5pbmdzPXdhcm5pbmdzO30KcmV0dXJue3dhcm5pbmdzOm9mZmxpbmVXYXJuaW5ncyxmYWlsdXJlczpbLi4ubWFuaWZlc3RGYWlsdXJlcywuLi5zd0ZhaWx1cmVzLC4uLm9mZmxpbmVGYWlsdXJlc10sbWFuaWZlc3RWYWx1ZXN9O30pO319Cm1vZHVsZS5leHBvcnRzPVdlYmFwcEluc3RhbGxCYW5uZXI7fSx7Ii4vbXVsdGktY2hlY2stYXVkaXQiOjUsIi4vc2VydmljZS13b3JrZXIiOiIuLi9hdWRpdHMvc2VydmljZS13b3JrZXIifV0sIi4uL2F1ZGl0cy93aXRob3V0LWphdmFzY3JpcHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NsYXNzIFdpdGhvdXRKYXZhU2NyaXB0IGV4dGVuZHMgQXVkaXR7c3RhdGljIGdldCBtZXRhKCl7cmV0dXJue2lkOid3aXRob3V0LWphdmFzY3JpcHQnLHRpdGxlOidDb250YWlucyBzb21lIGNvbnRlbnQgd2hlbiBKYXZhU2NyaXB0IGlzIG5vdCBhdmFpbGFibGUnLGZhaWx1cmVUaXRsZTonRG9lcyBub3QgcHJvdmlkZSBmYWxsYmFjayBjb250ZW50IHdoZW4gSmF2YVNjcmlwdCBpcyBub3QgYXZhaWxhYmxlJyxkZXNjcmlwdGlvbjonWW91ciBhcHAgc2hvdWxkIGRpc3BsYXkgc29tZSBjb250ZW50IHdoZW4gSmF2YVNjcmlwdCBpcyBkaXNhYmxlZCwgZXZlbiBpZiAnKydpdFwncyBqdXN0IGEgd2FybmluZyB0byB0aGUgdXNlciB0aGF0IEphdmFTY3JpcHQgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBhcHAuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvbm8tanMpLicscmVxdWlyZWRBcnRpZmFjdHM6WydIVE1MV2l0aG91dEphdmFTY3JpcHQnXX07fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzKXtjb25zdCBhcnRpZmFjdD1hcnRpZmFjdHMuSFRNTFdpdGhvdXRKYXZhU2NyaXB0O2lmKGFydGlmYWN0LmJvZHlUZXh0LnRyaW0oKT09PScnJiYhYXJ0aWZhY3QuaGFzTm9TY3JpcHQpe3JldHVybntyYXdWYWx1ZTpmYWxzZSxleHBsYW5hdGlvbjonVGhlIHBhZ2UgYm9keSBzaG91bGQgcmVuZGVyIHNvbWUgY29udGVudCBpZiBpdHMgc2NyaXB0cyBhcmUgbm90IGF2YWlsYWJsZS4nfTt9CnJldHVybntyYXdWYWx1ZTp0cnVlfTt9fQptb2R1bGUuZXhwb3J0cz1XaXRob3V0SmF2YVNjcmlwdDt9LHsiLi9hdWRpdCI6Mn1dLCIuLi9hdWRpdHMvd29ya3Mtb2ZmbGluZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NsYXNzIFdvcmtzT2ZmbGluZSBleHRlbmRzIEF1ZGl0e3N0YXRpYyBnZXQgbWV0YSgpe3JldHVybntpZDond29ya3Mtb2ZmbGluZScsdGl0bGU6J1Jlc3BvbmRzIHdpdGggYSAyMDAgd2hlbiBvZmZsaW5lJyxmYWlsdXJlVGl0bGU6J0RvZXMgbm90IHJlc3BvbmQgd2l0aCBhIDIwMCB3aGVuIG9mZmxpbmUnLGRlc2NyaXB0aW9uOidJZiB5b3VcJ3JlIGJ1aWxkaW5nIGEgUHJvZ3Jlc3NpdmUgV2ViIEFwcCwgY29uc2lkZXIgdXNpbmcgYSBzZXJ2aWNlIHdvcmtlciAnKydzbyB0aGF0IHlvdXIgYXBwIGNhbiB3b3JrIG9mZmxpbmUuICcrJ1tMZWFybiBtb3JlXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvbGlnaHRob3VzZS9hdWRpdHMvaHR0cC0yMDAtd2hlbi1vZmZsaW5lKS4nLHJlcXVpcmVkQXJ0aWZhY3RzOlsnT2ZmbGluZScsJ1VSTCddfTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMpe2NvbnN0IHdhcm5pbmdzPVtdO2NvbnN0IHBhc3NlZD1hcnRpZmFjdHMuT2ZmbGluZT09PTIwMDtpZighcGFzc2VkJiYhVVJMLmVxdWFsV2l0aEV4Y2x1ZGVkRnJhZ21lbnRzKGFydGlmYWN0cy5VUkwucmVxdWVzdGVkVXJsLGFydGlmYWN0cy5VUkwuZmluYWxVcmwpKXt3YXJuaW5ncy5wdXNoKCdZb3UgbWF5IGJlIG5vdCBsb2FkaW5nIG9mZmxpbmUgYmVjYXVzZSB5b3VyIHRlc3QgVVJMICcrYCgke2FydGlmYWN0cy5VUkwucmVxdWVzdGVkVXJsfSkgd2FzIHJlZGlyZWN0ZWQgdG8gIiR7YXJ0aWZhY3RzLlVSTC5maW5hbFVybH0iLiBgKydUcnkgdGVzdGluZyB0aGUgc2Vjb25kIFVSTCBkaXJlY3RseS4nKTt9CnJldHVybntyYXdWYWx1ZTpwYXNzZWQsd2FybmluZ3N9O319Cm1vZHVsZS5leHBvcnRzPVdvcmtzT2ZmbGluZTt9LHsiLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9hdWRpdCI6Mn1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2FjY2Vzc2liaWxpdHkiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2NvbnN0IGF4ZUxpYlNvdXJjZT0iLyohIGFYZSB2My4wLjAtYmV0YS4yXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggRGVxdWUgU3lzdGVtcywgSW5jLlxuICpcbiAqIFlvdXIgdXNlIG9mIHRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKlxuICogVGhpcyBlbnRpcmUgY29weXJpZ2h0IG5vdGljZSBtdXN0IGFwcGVhciBpbiBldmVyeSBjb3B5IG9mIHRoaXMgZmlsZSB5b3VcbiAqIGRpc3RyaWJ1dGUgb3IgaW4gYW55IGZpbGUgdGhhdCBjb250YWlucyBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGlzIHNvdXJjZVxuICogY29kZS5cbiAqL1xuIWZ1bmN0aW9uIGEod2luZG93KXtmdW5jdGlvbiBiKGEpe3RoaXMubmFtZT1cIlN1cHBvcnRFcnJvclwiLHRoaXMuY2F1c2U9YS5jYXVzZSx0aGlzLm1lc3NhZ2U9XCJgXCIrYS5jYXVzZStcImAgLSBmZWF0dXJlIHVuc3VwcG9ydGVkIGluIHlvdXIgZW52aXJvbm1lbnQuXCIsYS5ydWxlSWQmJih0aGlzLnJ1bGVJZD1hLnJ1bGVJZCx0aGlzLm1lc3NhZ2UrPVwiIFNraXBwaW5nIFwiK3RoaXMucnVsZUlkK1wiIHJ1bGUuXCIpLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9ZnVuY3Rpb24gYyhhKXtcInVzZSBzdHJpY3RcIjt2YXIgYjtyZXR1cm4gYT8oYj1heGUudXRpbHMuY2xvbmUoYSksYi5jb21tb25zPWEuY29tbW9ucyk6Yj17fSxiLnJlcG9ydGVyPWIucmVwb3J0ZXJ8fG51bGwsYi5ydWxlcz1iLnJ1bGVzfHxbXSxiLmNoZWNrcz1iLmNoZWNrc3x8W10sYi5kYXRhPU9iamVjdC5hc3NpZ24oe2NoZWNrczp7fSxydWxlczp7fX0sYi5kYXRhKSxifWZ1bmN0aW9uIGQoYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkLGU7Zm9yKGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspYltjXShhW2RdKX1mdW5jdGlvbiBlKGEpe3RoaXMuYnJhbmQ9XCJheGVcIix0aGlzLmFwcGxpY2F0aW9uPVwiYXhlQVBJXCIsdGhpcy50YWdFeGNsdWRlPVtcImV4cGVyaW1lbnRhbFwiXSx0aGlzLmRlZmF1bHRDb25maWc9YSx0aGlzLl9pbml0KCl9ZnVuY3Rpb24gZihhLGIsYyl7dmFyIGQ9YS5icmFuZCxlPWEuYXBwbGljYXRpb247cmV0dXJuIGF4ZS5jb25zdGFudHMuaGVscFVybEJhc2UrZCtcIi9cIisoY3x8YXhlLnZlcnNpb24uc3Vic3RyaW5nKDAsYXhlLnZlcnNpb24ubGFzdEluZGV4T2YoXCIuXCIpKSkrXCIvXCIrYitcIj9hcHBsaWNhdGlvbj1cIitlfWZ1bmN0aW9uIGcoYSl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5pZD1hLmlkLHRoaXMuZGF0YT1udWxsLHRoaXMucmVsYXRlZE5vZGVzPVtdLHRoaXMucmVzdWx0PW51bGx9ZnVuY3Rpb24gaChhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYT9uZXcgRnVuY3Rpb24oXCJyZXR1cm4gXCIrYStcIjtcIikoKTphfWZ1bmN0aW9uIGkoYSl7YSYmKHRoaXMuaWQ9YS5pZCx0aGlzLmNvbmZpZ3VyZShhKSl9ZnVuY3Rpb24gaihhLGIpe1widXNlIHN0cmljdFwiO2lmKCFheGUudXRpbHMuaXNIaWRkZW4oYikpe2F4ZS51dGlscy5maW5kQnkoYSxcIm5vZGVcIixiKXx8YS5wdXNoKHtub2RlOmIsaW5jbHVkZTpbXSxleGNsdWRlOltdfSl9fWZ1bmN0aW9uIGsoYSxiLGMpe1widXNlIHN0cmljdFwiO2EuZnJhbWVzPWEuZnJhbWVzfHxbXTt2YXIgZCxlLGY9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjLnNoaWZ0KCkpO2E6Zm9yKHZhciBnPTAsaD1mLmxlbmd0aDtnPGg7ZysrKXtlPWZbZ107Zm9yKHZhciBpPTAsaj1hLmZyYW1lcy5sZW5ndGg7aTxqO2krKylpZihhLmZyYW1lc1tpXS5ub2RlPT09ZSl7YS5mcmFtZXNbaV1bYl0ucHVzaChjKTticmVhayBhfWQ9e25vZGU6ZSxpbmNsdWRlOltdLGV4Y2x1ZGU6W119LGMmJmRbYl0ucHVzaChjKSxhLmZyYW1lcy5wdXNoKGQpfX1mdW5jdGlvbiBsKGEpe1widXNlIHN0cmljdFwiO2lmKGEmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09YT9cInVuZGVmaW5lZFwiOnphKGEpKXx8YSBpbnN0YW5jZW9mIE5vZGVMaXN0KXtpZihhIGluc3RhbmNlb2YgTm9kZSlyZXR1cm57aW5jbHVkZTpbYV0sZXhjbHVkZTpbXX07aWYoYS5oYXNPd25Qcm9wZXJ0eShcImluY2x1ZGVcIil8fGEuaGFzT3duUHJvcGVydHkoXCJleGNsdWRlXCIpKXJldHVybntpbmNsdWRlOmEuaW5jbHVkZSYmK2EuaW5jbHVkZS5sZW5ndGg/YS5pbmNsdWRlOltkb2N1bWVudF0sZXhjbHVkZTphLmV4Y2x1ZGV8fFtdfTtpZihhLmxlbmd0aD09PSthLmxlbmd0aClyZXR1cm57aW5jbHVkZTphLGV4Y2x1ZGU6W119fXJldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhP3tpbmNsdWRlOlthXSxleGNsdWRlOltdfTp7aW5jbHVkZTpbZG9jdW1lbnRdLGV4Y2x1ZGU6W119fWZ1bmN0aW9uIG0oYSxiKXtcInVzZSBzdHJpY3RcIjtmb3IodmFyIGMsZCxlPVtdLGY9MCxnPWFbYl0ubGVuZ3RoO2Y8ZztmKyspe2lmKFwic3RyaW5nXCI9PXR5cGVvZihjPWFbYl1bZl0pKXtkPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChjKSksZT1lLmNvbmNhdChkLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYXhlLnV0aWxzLmdldEZsYXR0ZW5lZFRyZWUoYSlbMF19KSk7YnJlYWt9IWN8fCFjLmxlbmd0aHx8YyBpbnN0YW5jZW9mIE5vZGU/YyBpbnN0YW5jZW9mIE5vZGUmJmUucHVzaChheGUudXRpbHMuZ2V0RmxhdHRlbmVkVHJlZShjKVswXSk6Yy5sZW5ndGg+MT9rKGEsYixjKTooZD1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY1swXSkpLGU9ZS5jb25jYXQoZC5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGF4ZS51dGlscy5nZXRGbGF0dGVuZWRUcmVlKGEpWzBdfSkpKX1yZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX1mdW5jdGlvbiBuKGEpe1widXNlIHN0cmljdFwiO2lmKDA9PT1hLmluY2x1ZGUubGVuZ3RoKXtpZigwPT09YS5mcmFtZXMubGVuZ3RoKXt2YXIgYj1heGUudXRpbHMucmVzcG9uZGFibGUuaXNJbkZyYW1lKCk/XCJmcmFtZVwiOlwicGFnZVwiO3JldHVybiBuZXcgRXJyb3IoXCJObyBlbGVtZW50cyBmb3VuZCBmb3IgaW5jbHVkZSBpbiBcIitiK1wiIENvbnRleHRcIil9YS5mcmFtZXMuZm9yRWFjaChmdW5jdGlvbihhLGIpe2lmKDA9PT1hLmluY2x1ZGUubGVuZ3RoKXJldHVybiBuZXcgRXJyb3IoXCJObyBlbGVtZW50cyBmb3VuZCBmb3IgaW5jbHVkZSBpbiBDb250ZXh0IG9mIGZyYW1lIFwiK2IpfSl9fWZ1bmN0aW9uIG8oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9dGhpczt0aGlzLmZyYW1lcz1bXSx0aGlzLmluaXRpYXRvcj0hYXx8XCJib29sZWFuXCIhPXR5cGVvZiBhLmluaXRpYXRvcnx8YS5pbml0aWF0b3IsdGhpcy5wYWdlPSExLGE9bChhKSx0aGlzLmV4Y2x1ZGU9YS5leGNsdWRlLHRoaXMuaW5jbHVkZT1hLmluY2x1ZGUsdGhpcy5pbmNsdWRlPW0odGhpcyxcImluY2x1ZGVcIiksdGhpcy5leGNsdWRlPW0odGhpcyxcImV4Y2x1ZGVcIiksYXhlLnV0aWxzLnNlbGVjdChcImZyYW1lLCBpZnJhbWVcIix0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3dhKGEsYikmJmooYi5mcmFtZXMsYS5hY3R1YWxOb2RlKX0pLDE9PT10aGlzLmluY2x1ZGUubGVuZ3RoJiZ0aGlzLmluY2x1ZGVbMF0uYWN0dWFsTm9kZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmKHRoaXMucGFnZT0hMCk7dmFyIGM9bih0aGlzKTtpZihjIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYztBcnJheS5pc0FycmF5KHRoaXMuaW5jbHVkZSl8fCh0aGlzLmluY2x1ZGU9QXJyYXkuZnJvbSh0aGlzLmluY2x1ZGUpKSx0aGlzLmluY2x1ZGUuc29ydChheGUudXRpbHMubm9kZVNvcnRlcil9ZnVuY3Rpb24gcChhKXtcInVzZSBzdHJpY3RcIjt0aGlzLmlkPWEuaWQsdGhpcy5yZXN1bHQ9YXhlLmNvbnN0YW50cy5OQSx0aGlzLnBhZ2VMZXZlbD1hLnBhZ2VMZXZlbCx0aGlzLmltcGFjdD1udWxsLHRoaXMubm9kZXM9W119ZnVuY3Rpb24gcShhLGIpe1widXNlIHN0cmljdFwiO3RoaXMuX2F1ZGl0PWIsdGhpcy5pZD1hLmlkLHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcnx8XCIqXCIsdGhpcy5leGNsdWRlSGlkZGVuPVwiYm9vbGVhblwiIT10eXBlb2YgYS5leGNsdWRlSGlkZGVufHxhLmV4Y2x1ZGVIaWRkZW4sdGhpcy5lbmFibGVkPVwiYm9vbGVhblwiIT10eXBlb2YgYS5lbmFibGVkfHxhLmVuYWJsZWQsdGhpcy5wYWdlTGV2ZWw9XCJib29sZWFuXCI9PXR5cGVvZiBhLnBhZ2VMZXZlbCYmYS5wYWdlTGV2ZWwsdGhpcy5hbnk9YS5hbnl8fFtdLHRoaXMuYWxsPWEuYWxsfHxbXSx0aGlzLm5vbmU9YS5ub25lfHxbXSx0aGlzLnRhZ3M9YS50YWdzfHxbXSxhLm1hdGNoZXMmJih0aGlzLm1hdGNoZXM9aChhLm1hdGNoZXMpKX1mdW5jdGlvbiByKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBheGUudXRpbHMuZ2V0QWxsQ2hlY2tzKGEpLm1hcChmdW5jdGlvbihiKXt2YXIgYz1hLl9hdWRpdC5jaGVja3NbYi5pZHx8Yl07cmV0dXJuIGMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGMuYWZ0ZXI/YzpudWxsfSkuZmlsdGVyKEJvb2xlYW4pfWZ1bmN0aW9uIHMoYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1bXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2F4ZS51dGlscy5nZXRBbGxDaGVja3MoYSkuZm9yRWFjaChmdW5jdGlvbihhKXthLmlkPT09YiYmYy5wdXNoKGEpfSl9KSxjfWZ1bmN0aW9uIHQoYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiEwIT09YS5maWx0ZXJlZH0pfWZ1bmN0aW9uIHUoYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9W1wiYW55XCIsXCJhbGxcIixcIm5vbmVcIl0sYz1hLm5vZGVzLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYz0wO3JldHVybiBiLmZvckVhY2goZnVuY3Rpb24oYil7YVtiXT10KGFbYl0pLGMrPWFbYl0ubGVuZ3RofSksYz4wfSk7cmV0dXJuIGEucGFnZUxldmVsJiZjLmxlbmd0aCYmKGM9W2MucmVkdWNlKGZ1bmN0aW9uKGEsYyl7aWYoYSlyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2FbYl0ucHVzaC5hcHBseShhW2JdLGNbYl0pfSksYX0pXSksY31mdW5jdGlvbiB2KGEsYil7XCJ1c2Ugc3RyaWN0XCI7aWYoYT1hfHxmdW5jdGlvbigpe30sYj1ifHxheGUubG9nLCFheGUuX2F1ZGl0KXRocm93IG5ldyBFcnJvcihcIk5vIGF1ZGl0IGNvbmZpZ3VyZWRcIik7dmFyIGM9YXhlLnV0aWxzLnF1ZXVlKCksZD1bXTtPYmplY3Qua2V5cyhheGUucGx1Z2lucykuZm9yRWFjaChmdW5jdGlvbihhKXtjLmRlZmVyKGZ1bmN0aW9uKGIpe3ZhciBjPWZ1bmN0aW9uKGEpe2QucHVzaChhKSxiKCl9O3RyeXtheGUucGx1Z2luc1thXS5jbGVhbnVwKGIsYyl9Y2F0Y2goYSl7YyhhKX19KX0pO3ZhciBlPWF4ZS51dGlscy5nZXRGbGF0dGVuZWRUcmVlKGRvY3VtZW50LmJvZHkpO2F4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsKGUsXCJpZnJhbWUsIGZyYW1lXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7Yy5kZWZlcihmdW5jdGlvbihiLGMpe3JldHVybiBheGUudXRpbHMuc2VuZENvbW1hbmRUb0ZyYW1lKGEuYWN0dWFsTm9kZSx7Y29tbWFuZDpcImNsZWFudXAtcGx1Z2luXCJ9LGIsYyl9KX0pLGMudGhlbihmdW5jdGlvbihjKXswPT09ZC5sZW5ndGg/YShjKTpiKGQpfSkuY2F0Y2goYil9ZnVuY3Rpb24gdyhhKXtcInVzZSBzdHJpY3RcIjt2YXIgYjtpZighKGI9YXhlLl9hdWRpdCkpdGhyb3cgbmV3IEVycm9yKFwiTm8gYXVkaXQgY29uZmlndXJlZFwiKTthLnJlcG9ydGVyJiYoXCJmdW5jdGlvblwiPT10eXBlb2YgYS5yZXBvcnRlcnx8Q2FbYS5yZXBvcnRlcl0pJiYoYi5yZXBvcnRlcj1hLnJlcG9ydGVyKSxhLmNoZWNrcyYmYS5jaGVja3MuZm9yRWFjaChmdW5jdGlvbihhKXtiLmFkZENoZWNrKGEpfSk7dmFyIGM9W107YS5ydWxlcyYmYS5ydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MucHVzaChhLmlkKSxiLmFkZFJ1bGUoYSl9KSxhLmRpc2FibGVPdGhlclJ1bGVzJiZiLnJ1bGVzLmZvckVhY2goZnVuY3Rpb24oYSl7ITE9PT1jLmluY2x1ZGVzKGEuaWQpJiYoYS5lbmFibGVkPSExKX0pLHZvaWQgMCE9PWEuYnJhbmRpbmc/Yi5zZXRCcmFuZGluZyhhLmJyYW5kaW5nKTpiLl9jb25zdHJ1Y3RIZWxwVXJscygpLGEudGFnRXhjbHVkZSYmKGIudGFnRXhjbHVkZT1hLnRhZ0V4Y2x1ZGUpfWZ1bmN0aW9uIHgoYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPWMsZT1mdW5jdGlvbihhKXthIGluc3RhbmNlb2YgRXJyb3I9PSExJiYoYT1uZXcgRXJyb3IoYSkpLGMoYSl9LGY9YSYmYS5jb250ZXh0fHx7fTtmLmhhc093blByb3BlcnR5KFwiaW5jbHVkZVwiKSYmIWYuaW5jbHVkZS5sZW5ndGgmJihmLmluY2x1ZGU9W2RvY3VtZW50XSk7dmFyIGc9YSYmYS5vcHRpb25zfHx7fTtzd2l0Y2goYS5jb21tYW5kKXtjYXNlXCJydWxlc1wiOnJldHVybiBBKGYsZyxkLGUpO2Nhc2VcImNsZWFudXAtcGx1Z2luXCI6cmV0dXJuIHYoZCxlKTtkZWZhdWx0OmlmKGF4ZS5fYXVkaXQmJmF4ZS5fYXVkaXQuY29tbWFuZHMmJmF4ZS5fYXVkaXQuY29tbWFuZHNbYS5jb21tYW5kXSlyZXR1cm4gYXhlLl9hdWRpdC5jb21tYW5kc1thLmNvbW1hbmRdKGEsYyl9fWZ1bmN0aW9uIHkoYSl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5fcnVuPWEucnVuLHRoaXMuX2NvbGxlY3Q9YS5jb2xsZWN0LHRoaXMuX3JlZ2lzdHJ5PXt9LGEuY29tbWFuZHMuZm9yRWFjaChmdW5jdGlvbihhKXtheGUuX2F1ZGl0LnJlZ2lzdGVyQ29tbWFuZChhKX0pfWZ1bmN0aW9uIHooKXtcInVzZSBzdHJpY3RcIjt2YXIgYT1heGUuX2F1ZGl0O2lmKCFhKXRocm93IG5ldyBFcnJvcihcIk5vIGF1ZGl0IGNvbmZpZ3VyZWRcIik7YS5yZXNldFJ1bGVzQW5kQ2hlY2tzKCl9ZnVuY3Rpb24gQShhLGIsYyxkKXtcInVzZSBzdHJpY3RcIjt0cnl7YT1uZXcgbyhhKX1jYXRjaChhKXtyZXR1cm4gZChhKX12YXIgZT1heGUudXRpbHMucXVldWUoKSxmPWF4ZS5fYXVkaXQ7Yi5wZXJmb3JtYW5jZVRpbWVyJiZheGUudXRpbHMucGVyZm9ybWFuY2VUaW1lci5hdWRpdFN0YXJ0KCksYS5mcmFtZXMubGVuZ3RoJiYhMSE9PWIuaWZyYW1lcyYmZS5kZWZlcihmdW5jdGlvbihjLGQpe2F4ZS51dGlscy5jb2xsZWN0UmVzdWx0c0Zyb21GcmFtZXMoYSxiLFwicnVsZXNcIixudWxsLGMsZCl9KTt2YXIgZz12b2lkIDA7ZS5kZWZlcihmdW5jdGlvbihjLGQpe2IucmVzdG9yZVNjcm9sbCYmKGc9YXhlLnV0aWxzLmdldFNjcm9sbFN0YXRlKCkpLGYucnVuKGEsYixjLGQpfSksZS50aGVuKGZ1bmN0aW9uKGUpe3RyeXtnJiZheGUudXRpbHMuc2V0U2Nyb2xsU3RhdGUoZyksYi5wZXJmb3JtYW5jZVRpbWVyJiZheGUudXRpbHMucGVyZm9ybWFuY2VUaW1lci5hdWRpdEVuZCgpO3ZhciBoPWF4ZS51dGlscy5tZXJnZVJlc3VsdHMoZS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3VsdHM6YX19KSk7YS5pbml0aWF0b3ImJihoPWYuYWZ0ZXIoaCxiKSxoLmZvckVhY2goYXhlLnV0aWxzLnB1Ymxpc2hNZXRhRGF0YSksaD1oLm1hcChheGUudXRpbHMuZmluYWxpemVSdWxlUmVzdWx0KSk7dHJ5e2MoaCl9Y2F0Y2goYSl7YXhlLmxvZyhhKX19Y2F0Y2goYSl7ZChhKX19KS5jYXRjaChkKX1mdW5jdGlvbiBCKGEpe1widXNlIHN0cmljdFwiO3N3aXRjaCghMCl7Y2FzZVwic3RyaW5nXCI9PXR5cGVvZiBhOmNhc2UgQXJyYXkuaXNBcnJheShhKTpjYXNlIE5vZGUmJmEgaW5zdGFuY2VvZiBOb2RlOmNhc2UgTm9kZUxpc3QmJmEgaW5zdGFuY2VvZiBOb2RlTGlzdDpyZXR1cm4hMDtjYXNlXCJvYmplY3RcIiE9PSh2b2lkIDA9PT1hP1widW5kZWZpbmVkXCI6emEoYSkpOnJldHVybiExO2Nhc2Ugdm9pZCAwIT09YS5pbmNsdWRlOmNhc2Ugdm9pZCAwIT09YS5leGNsdWRlOmNhc2VcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGg6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gQyhhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9bmV3IFR5cGVFcnJvcihcImF4ZS5ydW4gYXJndW1lbnRzIGFyZSBpbnZhbGlkXCIpO2lmKCFCKGEpKXtpZih2b2lkIDAhPT1jKXRocm93IGQ7Yz1iLGI9YSxhPWRvY3VtZW50fWlmKFwib2JqZWN0XCIhPT0odm9pZCAwPT09Yj9cInVuZGVmaW5lZFwiOnphKGIpKSl7aWYodm9pZCAwIT09Yyl0aHJvdyBkO2M9YixiPXt9fWlmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGMmJnZvaWQgMCE9PWMpdGhyb3cgZDtyZXR1cm57Y29udGV4dDphLG9wdGlvbnM6YixjYWxsYmFjazpjfHxEYX19ZnVuY3Rpb24gRChhLGIpe1widXNlIHN0cmljdFwiO1tcImFueVwiLFwiYWxsXCIsXCJub25lXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7QXJyYXkuaXNBcnJheShhW2NdKSYmYVtjXS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYS5yZWxhdGVkTm9kZXMpfSkuZm9yRWFjaChmdW5jdGlvbihhKXthLnJlbGF0ZWROb2Rlcz1hLnJlbGF0ZWROb2Rlcy5tYXAoZnVuY3Rpb24oYSl7dmFyIGM9e2h0bWw6YS5zb3VyY2V9O3JldHVybiBiLmVsZW1lbnRSZWYmJiFhLmZyb21GcmFtZSYmKGMuZWxlbWVudD1hLmVsZW1lbnQpLCghMSE9PWIuc2VsZWN0b3JzfHxhLmZyb21GcmFtZSkmJihjLnRhcmdldD1hLnNlbGVjdG9yKSxiLnhwYXRoJiYoYy54cGF0aD1hLnhwYXRoKSxjfSl9KX0pfWZ1bmN0aW9uIEUoYSxiKXtyZXR1cm4gSmEucmVkdWNlKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGNbZF09KGFbZF18fFtdKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSxkKX0pLGN9LHt9KX1mdW5jdGlvbiBGKGEsYixjKXt2YXIgZD1PYmplY3QuYXNzaWduKHt9LGIpO2Qubm9kZXM9KGRbY118fFtdKS5jb25jYXQoKSxheGUuY29uc3RhbnRzLnJlc3VsdEdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2RlbGV0ZSBkW2FdfSksYVtjXS5wdXNoKGQpfWZ1bmN0aW9uIEcoYSxiLGMpe1widXNlIHN0cmljdFwiO3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCksZT0hMTtyZXR1cm4hIWQmJihiLmZvckVhY2goZnVuY3Rpb24oYSl7ZC5nZXRQcm9wZXJ0eVZhbHVlKGEucHJvcGVydHkpPT09YS52YWx1ZSYmKGU9ITApfSksISFlfHwhKGEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWMudG9VcHBlckNhc2UoKXx8IWEucGFyZW50Tm9kZSkmJkcoYS5wYXJlbnROb2RlLGIsYykpfWZ1bmN0aW9uIEgoYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYztyZXR1cm4gYXhlLl90cmVlJiYoYz1heGUudXRpbHMuZ2V0U2VsZWN0b3IoYikpLG5ldyBFcnJvcihhK1wiOiBcIisoY3x8YikpfWZ1bmN0aW9uIEkoYSxiLGMsZCxlLGYpe1widXNlIHN0cmljdFwiO3ZhciBnPWF4ZS51dGlscy5xdWV1ZSgpO2EuZnJhbWVzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGY9e29wdGlvbnM6Yixjb21tYW5kOmMscGFyYW1ldGVyOmQsY29udGV4dDp7aW5pdGlhdG9yOiExLHBhZ2U6YS5wYWdlLGluY2x1ZGU6ZS5pbmNsdWRlfHxbXSxleGNsdWRlOmUuZXhjbHVkZXx8W119fTtnLmRlZmVyKGZ1bmN0aW9uKGEsYil7dmFyIGM9ZS5ub2RlO2F4ZS51dGlscy5zZW5kQ29tbWFuZFRvRnJhbWUoYyxmLGZ1bmN0aW9uKGIpe2lmKGIpcmV0dXJuIGEoe3Jlc3VsdHM6YixmcmFtZUVsZW1lbnQ6YyxmcmFtZTpheGUudXRpbHMuZ2V0U2VsZWN0b3IoYyl9KTthKG51bGwpfSxiKX0pfSksZy50aGVuKGZ1bmN0aW9uKGEpe2UoYXhlLnV0aWxzLm1lcmdlUmVzdWx0cyhhLGIpKX0pLmNhdGNoKGYpfWZ1bmN0aW9uIEooYSxiKXtpZihiPWJ8fDMwMCxhLmxlbmd0aD5iKXt2YXIgYz1hLmluZGV4T2YoXCI+XCIpO2E9YS5zdWJzdHJpbmcoMCxjKzEpfXJldHVybiBhfWZ1bmN0aW9uIEsoYSl7dmFyIGI9YS5vdXRlckhUTUw7cmV0dXJuIGJ8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIFhNTFNlcmlhbGl6ZXJ8fChiPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcoYSkpLEooYnx8XCJcIil9ZnVuY3Rpb24gTChhLGIsYyl7dGhpcy5fZnJvbUZyYW1lPSEhYyx0aGlzLnNwZWM9Y3x8e30sYiYmYi5hYnNvbHV0ZVBhdGhzJiYodGhpcy5fb3B0aW9ucz17dG9Sb290OiEwfSksdGhpcy5zb3VyY2U9dm9pZCAwIT09dGhpcy5zcGVjLnNvdXJjZT90aGlzLnNwZWMuc291cmNlOksoYSksdGhpcy5fZWxlbWVudD1hfWZ1bmN0aW9uIE0oYSxiKXtyZXR1cm57c2hhZG93SWQ6YixjaGlsZHJlbjpbXSxhY3R1YWxOb2RlOmF9fWZ1bmN0aW9uIE4oYSl7dmFyIGI9W107Zm9yKGE9YS5maXJzdENoaWxkO2E7KWIucHVzaChhKSxhPWEubmV4dFNpYmxpbmc7cmV0dXJuIGJ9ZnVuY3Rpb24gTygpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpcIlwiO3JldHVybiAwIT09YS5sZW5ndGgmJihhLm1hdGNoKC9bMC05XS9nKXx8XCJcIikubGVuZ3RoPj1hLmxlbmd0aC8yfWZ1bmN0aW9uIFAoYSxiKXtyZXR1cm5bYS5zdWJzdHJpbmcoMCxiKSxhLnN1YnN0cmluZyhiKV19ZnVuY3Rpb24gUShhKXt2YXIgYj1hLGM9XCJcIixkPVwiXCIsZT1cIlwiLGY9XCJcIixnPVwiXCIsaD1cIlwiO2lmKGEuaW5jbHVkZXMoXCIjXCIpKXt2YXIgaT1QKGEsYS5pbmRleE9mKFwiI1wiKSksaj1LYShpLDIpO2E9alswXSxoPWpbMV19aWYoYS5pbmNsdWRlcyhcIj9cIikpe3ZhciBrPVAoYSxhLmluZGV4T2YoXCI/XCIpKSxsPUthKGssMik7YT1sWzBdLGc9bFsxXX1pZihhLmluY2x1ZGVzKFwiOi8vXCIpKXt2YXIgbT1hLnNwbGl0KFwiOi8vXCIpLG49S2EobSwyKTtjPW5bMF0sYT1uWzFdO3ZhciBvPVAoYSxhLmluZGV4T2YoXCIvXCIpKSxwPUthKG8sMik7ZD1wWzBdLGE9cFsxXX1lbHNlIGlmKFwiLy9cIj09PWEuc3Vic3RyKDAsMikpe2E9YS5zdWJzdHIoMik7dmFyIHE9UChhLGEuaW5kZXhPZihcIi9cIikpLHI9S2EocSwyKTtkPXJbMF0sYT1yWzFdfWlmKFwid3d3LlwiPT09ZC5zdWJzdHIoMCw0KSYmKGQ9ZC5zdWJzdHIoNCkpLGQmJmQuaW5jbHVkZXMoXCI6XCIpKXt2YXIgcz1QKGQsZC5pbmRleE9mKFwiOlwiKSksdD1LYShzLDIpO2Q9dFswXSxlPXRbMV19cmV0dXJuIGY9YSx7b3JpZ2luYWw6Yixwcm90b2NvbDpjLGRvbWFpbjpkLHBvcnQ6ZSxwYXRoOmYscXVlcnk6ZyxoYXNoOmh9fWZ1bmN0aW9uIFIoYSxiKXt2YXIgYz1iLm5hbWUsZD12b2lkIDA7aWYoLTEhPT1jLmluZGV4T2YoXCJocmVmXCIpfHwtMSE9PWMuaW5kZXhPZihcInNyY1wiKSl7dmFyIGU9ZW5jb2RlVVJJKGF4ZS51dGlscy5nZXRGcmllbmRseVVyaUVuZChhLmdldEF0dHJpYnV0ZShjKSkpO2lmKCFlKXJldHVybjtkPUxhKGIubmFtZSkrJyQ9XCInK2UrJ1wiJ31lbHNlIGQ9TGEoYykrJz1cIicrTGEoYi52YWx1ZSkrJ1wiJztyZXR1cm4gZH1mdW5jdGlvbiBTKGEsYil7cmV0dXJuIGEuY291bnQ8Yi5jb3VudD8tMTphLmNvdW50PT09Yi5jb3VudD8wOjF9ZnVuY3Rpb24gVChhKXtyZXR1cm4hTmEuaW5jbHVkZXMoYS5uYW1lKSYmLTE9PT1hLm5hbWUuaW5kZXhPZihcIjpcIikmJighYS52YWx1ZXx8YS52YWx1ZS5sZW5ndGg8T2EpfWZ1bmN0aW9uIFUoYSxiKXt2YXIgYz1bXSxkPWIuY2xhc3NlcyxlPWIudGFncztyZXR1cm4gYS5jbGFzc0xpc3QmJkFycmF5LmZyb20oYS5jbGFzc0xpc3QpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGY9TGEoYik7ZFtmXTxlW2Eubm9kZU5hbWVdJiZjLnB1c2goe25hbWU6Zixjb3VudDpkW2ZdLHNwZWNpZXM6XCJjbGFzc1wifSl9KSxjLnNvcnQoUyl9ZnVuY3Rpb24gVihhLGIpe3ZhciBjPWEucGFyZW50Tm9kZSYmQXJyYXkuZnJvbShhLnBhcmVudE5vZGUuY2hpbGRyZW58fFwiXCIpfHxbXTtpZihjLmZpbmQoZnVuY3Rpb24oYyl7cmV0dXJuIGMhPT1hJiZheGUudXRpbHMubWF0Y2hlc1NlbGVjdG9yKGMsYil9KSlyZXR1cm5cIjpudGgtY2hpbGQoXCIrKDErYy5pbmRleE9mKGEpKStcIilcIjtyZXR1cm5cIlwifWZ1bmN0aW9uIFcoYSl7aWYoYS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSl7dmFyIGI9YS5nZXRSb290Tm9kZSYmYS5nZXRSb290Tm9kZSgpfHxkb2N1bWVudCxjPVwiI1wiK0xhKGEuZ2V0QXR0cmlidXRlKFwiaWRcIil8fFwiXCIpO3JldHVybiBjLm1hdGNoKC9wbGF5ZXJfdWlkXy8pfHwxIT09Yi5xdWVyeVNlbGVjdG9yQWxsKGMpLmxlbmd0aD92b2lkIDA6Y319ZnVuY3Rpb24gWChhKXtyZXR1cm4gdm9pZCAwPT09TWEmJihNYT1heGUudXRpbHMuaXNYSFRNTChkb2N1bWVudCkpLExhKE1hP2EubG9jYWxOYW1lOmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWShhLGIpe3ZhciBjPVtdLGQ9Yi5hdHRyaWJ1dGVzLGU9Yi50YWdzO3JldHVybiBhLmF0dHJpYnV0ZXMmJkFycmF5LmZyb20oYS5hdHRyaWJ1dGVzKS5maWx0ZXIoVCkuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZj1SKGEsYik7ZiYmZFtmXTxlW2Eubm9kZU5hbWVdJiZjLnB1c2goe25hbWU6Zixjb3VudDpkW2ZdLHNwZWNpZXM6XCJhdHRyaWJ1dGVcIn0pfSksYy5zb3J0KFMpfWZ1bmN0aW9uIFooYSxiKXt2YXIgYz1cIlwiLGQ9dm9pZCAwLGU9VShhLGIpLGY9WShhLGIpO3JldHVybiBlLmxlbmd0aCYmMT09PWVbMF0uY291bnQ/ZD1bZVswXV06Zi5sZW5ndGgmJjE9PT1mWzBdLmNvdW50PyhkPVtmWzBdXSxjPVgoYSkpOihkPWUuY29uY2F0KGYpLGQuc29ydChTKSxkPWQuc2xpY2UoMCwzKSxkLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuXCJjbGFzc1wiPT09YS5zcGVjaWVzfSk/ZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3BlY2llcyE9PWIuc3BlY2llcyYmXCJjbGFzc1wiPT09YS5zcGVjaWVzPy0xOmEuc3BlY2llcz09PWIuc3BlY2llcz8wOjF9KTpjPVgoYSkpLGMrPWQucmVkdWNlKGZ1bmN0aW9uKGEsYil7c3dpdGNoKGIuc3BlY2llcyl7Y2FzZVwiY2xhc3NcIjpyZXR1cm4gYStcIi5cIitiLm5hbWU7Y2FzZVwiYXR0cmlidXRlXCI6cmV0dXJuIGErXCJbXCIrYi5uYW1lK1wiXVwifXJldHVybiBhfSxcIlwiKX1mdW5jdGlvbiAkKGEsYixjKXtheGUuX3NlbGVjdG9yRGF0YXx8KGF4ZS5fc2VsZWN0b3JEYXRhPWF4ZS51dGlscy5nZXRTZWxlY3RvckRhdGEoYXhlLl90cmVlKSk7dmFyIGQ9Yi50b1Jvb3QsZT12b2lkIDAhPT1kJiZkLGY9dm9pZCAwLGc9dm9pZCAwO2Rve3ZhciBoPVcoYSk7aHx8KGg9WihhLGF4ZS5fc2VsZWN0b3JEYXRhKSxoKz1WKGEsaCkpLGY9Zj9oK1wiID4gXCIrZjpoLGc9Zz9nLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3RvcihhLGYpfSk6QXJyYXkuZnJvbShjLnF1ZXJ5U2VsZWN0b3JBbGwoZikpLGE9YS5wYXJlbnRFbGVtZW50fXdoaWxlKChnLmxlbmd0aD4xfHxlKSYmYSYmMTEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gMT09PWcubGVuZ3RoP2Y6LTEhPT1mLmluZGV4T2YoXCIgPiBcIik/XCI6cm9vdFwiK2Yuc3Vic3RyaW5nKGYuaW5kZXhPZihcIiA+IFwiKSk6XCI6cm9vdFwifWZ1bmN0aW9uIF8oYSxiKXt2YXIgYyxkO2lmKCFhKXJldHVybltdO2lmKCFiJiY5PT09YS5ub2RlVHlwZSlyZXR1cm4gYj1be3N0cjpcImh0bWxcIn1dO2lmKGI9Ynx8W10sYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUhPT1hJiYoYj1fKGEucGFyZW50Tm9kZSxiKSksYS5wcmV2aW91c1NpYmxpbmcpe2Q9MSxjPWEucHJldmlvdXNTaWJsaW5nO2RvezE9PT1jLm5vZGVUeXBlJiZjLm5vZGVOYW1lPT09YS5ub2RlTmFtZSYmZCsrLGM9Yy5wcmV2aW91c1NpYmxpbmd9d2hpbGUoYyk7MT09PWQmJihkPW51bGwpfWVsc2UgaWYoYS5uZXh0U2libGluZyl7Yz1hLm5leHRTaWJsaW5nO2RvezE9PT1jLm5vZGVUeXBlJiZjLm5vZGVOYW1lPT09YS5ub2RlTmFtZT8oZD0xLGM9bnVsbCk6KGQ9bnVsbCxjPWMucHJldmlvdXNTaWJsaW5nKX13aGlsZShjKX1pZigxPT09YS5ub2RlVHlwZSl7dmFyIGU9e307ZS5zdHI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBmPWEuZ2V0QXR0cmlidXRlJiZheGUudXRpbHMuZXNjYXBlU2VsZWN0b3IoYS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7ZiYmMT09PWEub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiI1wiK2YpLmxlbmd0aCYmKGUuaWQ9YS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSksZD4xJiYoZS5jb3VudD1kKSxiLnB1c2goZSl9cmV0dXJuIGJ9ZnVuY3Rpb24gYWEoYSl7cmV0dXJuIGEucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuaWQ/XCIvXCIrYi5zdHIrXCJbQGlkPSdcIitiLmlkK1wiJ11cIjphK1wiL1wiK2Iuc3RyKyhiLmNvdW50PjA/XCJbXCIrYi5jb3VudCtcIl1cIjpcIlwiKX0sXCJcIil9ZnVuY3Rpb24gYmEoYSl7XCJ1c2Ugc3RyaWN0XCI7aWYoUGEmJlBhLnBhcmVudE5vZGUpcmV0dXJuIHZvaWQgMD09PVBhLnN0eWxlU2hlZXQ/UGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpOlBhLnN0eWxlU2hlZXQuY3NzVGV4dCs9YSxQYTtpZihhKXt2YXIgYj1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07cmV0dXJuIFBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKSxQYS50eXBlPVwidGV4dC9jc3NcIix2b2lkIDA9PT1QYS5zdHlsZVNoZWV0P1BhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKTpQYS5zdHlsZVNoZWV0LmNzc1RleHQ9YSxiLmFwcGVuZENoaWxkKFBhKSxQYX19ZnVuY3Rpb24gY2EoYSxiLGMsZCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9YXhlLnV0aWxzLmdldFhwYXRoKGMpLGY9e2VsZW1lbnQ6YyxzZWxlY3RvcjpkLHhwYXRoOmV9O2EuZm9yRWFjaChmdW5jdGlvbihhKXthLm5vZGU9YXhlLnV0aWxzLkRxRWxlbWVudC5mcm9tRnJhbWUoYS5ub2RlLGIsZik7dmFyIGM9YXhlLnV0aWxzLmdldEFsbENoZWNrcyhhKTtjLmxlbmd0aCYmYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EucmVsYXRlZE5vZGVzPWEucmVsYXRlZE5vZGVzLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYXhlLnV0aWxzLkRxRWxlbWVudC5mcm9tRnJhbWUoYSxiLGYpfSl9KX0pfWZ1bmN0aW9uIGRhKGEsYil7XCJ1c2Ugc3RyaWN0XCI7Zm9yKHZhciBjLGQsZT1iWzBdLm5vZGUsZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKylpZihkPWFbZl0ubm9kZSwoYz1heGUudXRpbHMubm9kZVNvcnRlcih7YWN0dWFsTm9kZTpkLmVsZW1lbnR9LHthY3R1YWxOb2RlOmUuZWxlbWVudH0pKT4wfHwwPT09YyYmZS5zZWxlY3Rvci5sZW5ndGg8ZC5zZWxlY3Rvci5sZW5ndGgpcmV0dXJuIHZvaWQgYS5zcGxpY2UuYXBwbHkoYSxbZiwwXS5jb25jYXQoYikpO2EucHVzaC5hcHBseShhLGIpfWZ1bmN0aW9uIGVhKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhJiZhLnJlc3VsdHM/QXJyYXkuaXNBcnJheShhLnJlc3VsdHMpP2EucmVzdWx0cy5sZW5ndGg/YS5yZXN1bHRzOm51bGw6W2EucmVzdWx0c106bnVsbH1mdW5jdGlvbiBmYShhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGEuaW5jb21wbGV0ZSYmYS5pbmNvbXBsZXRlLmRlZmF1bHQ/YS5pbmNvbXBsZXRlLmRlZmF1bHQ6QWEuaW5jb21wbGV0ZUZhbGxiYWNrTWVzc2FnZSgpfWlmKCFhfHwhYS5taXNzaW5nRGF0YSlyZXR1cm4gYyhiKTt0cnl7dmFyIGQ9Yi5pbmNvbXBsZXRlW2EubWlzc2luZ0RhdGFbMF0ucmVhc29uXTtpZighZCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGR9Y2F0Y2goZCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGEubWlzc2luZ0RhdGE/Yi5pbmNvbXBsZXRlW2EubWlzc2luZ0RhdGFdOmMoYil9fWZ1bmN0aW9uIGdhKGEsYil7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGMpe3ZhciBkPWFbYy5pZF18fHt9LGU9ZC5tZXNzYWdlc3x8e30sZj1PYmplY3QuYXNzaWduKHt9LGQpO2RlbGV0ZSBmLm1lc3NhZ2VzLHZvaWQgMD09PWMucmVzdWx0P1wib2JqZWN0XCI9PT16YShlLmluY29tcGxldGUpP2YubWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiBmYShjLmRhdGEsZSl9OmYubWVzc2FnZT1lLmluY29tcGxldGU6Zi5tZXNzYWdlPWMucmVzdWx0PT09Yj9lLnBhc3M6ZS5mYWlsLGF4ZS51dGlscy5leHRlbmRNZXRhRGF0YShjLGYpfX1mdW5jdGlvbiBoYShhLGIpe3JldHVybiAxPT09YS5ub2RlVHlwZSYmKFwiKlwiPT09Yi50YWd8fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudGFnKX1mdW5jdGlvbiBpYShhLGIpe3JldHVybiFiLmNsYXNzZXN8fGIuY2xhc3Nlcy5yZWR1Y2UoZnVuY3Rpb24oYixjKXtyZXR1cm4gYiYmYS5jbGFzc05hbWUmJmEuY2xhc3NOYW1lLm1hdGNoKGMucmVnZXhwKX0sITApfWZ1bmN0aW9uIGphKGEsYil7cmV0dXJuIWIuYXR0cmlidXRlc3x8Yi5hdHRyaWJ1dGVzLnJlZHVjZShmdW5jdGlvbihiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMua2V5KTtyZXR1cm4gYiYmbnVsbCE9PWQmJighYy52YWx1ZXx8Yy50ZXN0KGQpKX0sITApfWZ1bmN0aW9uIGthKGEsYil7cmV0dXJuIWIuaWR8fGEuaWQ9PT1iLmlkfWZ1bmN0aW9uIGxhKGEsYil7cmV0dXJuIShiLnBzZXVkb3MmJiFiLnBzZXVkb3MucmVkdWNlKGZ1bmN0aW9uKGIsYyl7aWYoXCJub3RcIj09PWMubmFtZSlyZXR1cm4gYiYmIVNhKFthXSxjLmV4cHJlc3Npb25zLCExKS5sZW5ndGg7dGhyb3cgbmV3IEVycm9yKFwidGhlIHBzZXVkbyBzZWxlY3RvciBcIitjLm5hbWUrXCIgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZFwiKX0sITApKX1mdW5jdGlvbiBtYShhKXsvKiEgQ3JlZGl0IE1vb3Rvb2xzIENvcHlyaWdodCBNb290b29scywgTUlUIExpY2Vuc2UgKi9cbmlmKGEpcmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1hLm5hbWUucmVwbGFjZShVYSxcIlwiKSxlPShhLnZhbHVlfHxcIlwiKS5yZXBsYWNlKFVhLFwiXCIpO3N3aXRjaChhLm9wZXJhdG9yKXtjYXNlXCJePVwiOmM9bmV3IFJlZ0V4cChcIl5cIitUYShlKSk7YnJlYWs7Y2FzZVwiJD1cIjpjPW5ldyBSZWdFeHAoVGEoZSkrXCIkXCIpO2JyZWFrO2Nhc2VcIn49XCI6Yz1uZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIrVGEoZSkrXCIoXFxcXHN8JClcIik7YnJlYWs7Y2FzZVwifD1cIjpjPW5ldyBSZWdFeHAoXCJeXCIrVGEoZSkrXCIoLXwkKVwiKTticmVhaztjYXNlXCI9XCI6Yj1mdW5jdGlvbihhKXtyZXR1cm4gZT09PWF9O2JyZWFrO2Nhc2VcIio9XCI6Yj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5pbmNsdWRlcyhlKX07YnJlYWs7Y2FzZVwiIT1cIjpiPWZ1bmN0aW9uKGEpe3JldHVybiBlIT09YX07YnJlYWs7ZGVmYXVsdDpiPWZ1bmN0aW9uKGEpe3JldHVybiEhYX19cmV0dXJuXCJcIj09PWUmJi9eWyokXl09JC8udGVzdChhLm9wZXJhdG9yKSYmKGI9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pLGJ8fChiPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZjLnRlc3QoYSl9KSx7a2V5OmQsdmFsdWU6ZSx0ZXN0OmJ9fSl9ZnVuY3Rpb24gbmEoYSl7aWYoYSlyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKFVhLFwiXCIpLHt2YWx1ZTphLHJlZ2V4cDpuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIrVGEoYSkrXCIoXFxcXHN8JClcIil9fSl9ZnVuY3Rpb24gb2EoYSl7aWYoYSlyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuXCJub3RcIj09PWEubmFtZSYmKGI9YXhlLnV0aWxzLmNzc1BhcnNlci5wYXJzZShhLnZhbHVlKSxiPWIuc2VsZWN0b3JzP2Iuc2VsZWN0b3JzOltiXSxiPVJhKGIpKSx7bmFtZTphLm5hbWUsZXhwcmVzc2lvbnM6Yix2YWx1ZTphLnZhbHVlfX0pfWZ1bmN0aW9uIHBhKGEsYixjLGQpe3ZhciBlPXtub2RlczphLnNsaWNlKCksYW55TGV2ZWw6Yix0aGlzTGV2ZWw6YyxwYXJlbnRTaGFkb3dJZDpkfTtyZXR1cm4gZS5ub2Rlcy5yZXZlcnNlKCksZX1mdW5jdGlvbiBxYShhLGIpe3JldHVybiBoYShhLmFjdHVhbE5vZGUsYlswXSkmJmlhKGEuYWN0dWFsTm9kZSxiWzBdKSYmamEoYS5hY3R1YWxOb2RlLGJbMF0pJiZrYShhLmFjdHVhbE5vZGUsYlswXSkmJmxhKGEsYlswXSl9ZnVuY3Rpb24gcmEoYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYyxkLGU9YXhlLl9hdWRpdCYmYXhlLl9hdWRpdC50YWdFeGNsdWRlP2F4ZS5fYXVkaXQudGFnRXhjbHVkZTpbXTtyZXR1cm4gYi5oYXNPd25Qcm9wZXJ0eShcImluY2x1ZGVcIil8fGIuaGFzT3duUHJvcGVydHkoXCJleGNsdWRlXCIpPyhjPWIuaW5jbHVkZXx8W10sYz1BcnJheS5pc0FycmF5KGMpP2M6W2NdLGQ9Yi5leGNsdWRlfHxbXSxkPUFycmF5LmlzQXJyYXkoZCk/ZDpbZF0sZD1kLmNvbmNhdChlLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09PWMuaW5kZXhPZihhKX0pKSk6KGM9QXJyYXkuaXNBcnJheShiKT9iOltiXSxkPWUuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT09Yy5pbmRleE9mKGEpfSkpLCEhKGMuc29tZShmdW5jdGlvbihiKXtyZXR1cm4tMSE9PWEudGFncy5pbmRleE9mKGIpfSl8fDA9PT1jLmxlbmd0aCYmITEhPT1hLmVuYWJsZWQpJiZkLmV2ZXJ5KGZ1bmN0aW9uKGIpe3JldHVybi0xPT09YS50YWdzLmluZGV4T2YoYil9KX1mdW5jdGlvbiBzYShhKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxjPVwidmlzaWJsZVwiPT09Yi5nZXRQcm9wZXJ0eVZhbHVlKFwib3ZlcmZsb3cteVwiKSxkPVwidmlzaWJsZVwiPT09Yi5nZXRQcm9wZXJ0eVZhbHVlKFwib3ZlcmZsb3cteFwiKTtpZighYyYmYS5zY3JvbGxIZWlnaHQ+YS5jbGllbnRIZWlnaHR8fCFkJiZhLnNjcm9sbFdpZHRoPmEuY2xpZW50V2lkdGgpcmV0dXJue2VsbTphLHRvcDphLnNjcm9sbFRvcCxsZWZ0OmEuc2Nyb2xsTGVmdH19ZnVuY3Rpb24gdGEoYSxiLGMpe2lmKGE9PT13aW5kb3cpcmV0dXJuIGEuc2Nyb2xsKGIsYyk7YS5zY3JvbGxUb3A9YixhLnNjcm9sbExlZnQ9Y31mdW5jdGlvbiB1YShhKXtyZXR1cm4gQXJyYXkuZnJvbShhLmNoaWxkcmVuKS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXt2YXIgYz1zYShiKTtyZXR1cm4gYyYmYS5wdXNoKGMpLGEuY29uY2F0KHVhKGIpKX0sW10pfWZ1bmN0aW9uIHZhKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYXhlLnV0aWxzLmNvbnRhaW5zKGEsYik/MTotMX0pWzBdfWZ1bmN0aW9uIHdhKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9Yi5pbmNsdWRlJiZ2YShiLmluY2x1ZGUuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBheGUudXRpbHMuY29udGFpbnMoYixhKX0pKSxkPWIuZXhjbHVkZSYmdmEoYi5leGNsdWRlLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYXhlLnV0aWxzLmNvbnRhaW5zKGIsYSl9KSk7cmV0dXJuISEoIWQmJmN8fGQmJmF4ZS51dGlscy5jb250YWlucyhkLGMpKX1mdW5jdGlvbiB4YShhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjthLmxlbmd0aDxiLmxlbmd0aCYmKGM9YSxhPWIsYj1jKTtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspYS5pbmNsdWRlcyhiW2RdKXx8YS5wdXNoKGJbZF0pO3JldHVybiBhfWZ1bmN0aW9uIHlhKGEpe3JldHVybiBhLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhLmxlbmd0aCYmYVthLmxlbmd0aC0xXS5hY3R1YWxOb2RlLmNvbnRhaW5zKGIuYWN0dWFsTm9kZSl8fGEucHVzaChiKSxhfSxbXSl9dmFyIGRvY3VtZW50PXdpbmRvdy5kb2N1bWVudCx6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfSxheGU9YXhlfHx7fTtheGUudmVyc2lvbj1cIjMuMC4wLWJldGEuMlwiLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFtdLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGF4ZX0pLFwib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIG1vZHVsZT9cInVuZGVmaW5lZFwiOnphKG1vZHVsZSkpJiZtb2R1bGUuZXhwb3J0cyYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS50b1N0cmluZyYmKGF4ZS5zb3VyY2U9XCIoXCIrYS50b1N0cmluZygpKycpKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOiB0aGlzKTsnLG1vZHVsZS5leHBvcnRzPWF4ZSksXCJmdW5jdGlvblwiPT10eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUmJih3aW5kb3cuYXhlPWF4ZSk7dmFyIGNvbW1vbnM7Yi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWI7dmFyIHV0aWxzPWF4ZS51dGlscz17fSxBYT17fSx6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfTtlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciBhPWModGhpcy5kZWZhdWx0Q29uZmlnKTtheGUuY29tbW9ucz1jb21tb25zPWEuY29tbW9ucyx0aGlzLnJlcG9ydGVyPWEucmVwb3J0ZXIsdGhpcy5jb21tYW5kcz17fSx0aGlzLnJ1bGVzPVtdLHRoaXMuY2hlY2tzPXt9LGQoYS5ydWxlcyx0aGlzLFwiYWRkUnVsZVwiKSxkKGEuY2hlY2tzLHRoaXMsXCJhZGRDaGVja1wiKSx0aGlzLmRhdGE9e30sdGhpcy5kYXRhLmNoZWNrcz1hLmRhdGEmJmEuZGF0YS5jaGVja3N8fHt9LHRoaXMuZGF0YS5ydWxlcz1hLmRhdGEmJmEuZGF0YS5ydWxlc3x8e30sdGhpcy5kYXRhLmZhaWx1cmVTdW1tYXJpZXM9YS5kYXRhJiZhLmRhdGEuZmFpbHVyZVN1bW1hcmllc3x8e30sdGhpcy5kYXRhLmluY29tcGxldGVGYWxsYmFja01lc3NhZ2U9YS5kYXRhJiZhLmRhdGEuaW5jb21wbGV0ZUZhbGxiYWNrTWVzc2FnZXx8XCJcIix0aGlzLl9jb25zdHJ1Y3RIZWxwVXJscygpfSxlLnByb3RvdHlwZS5yZWdpc3RlckNvbW1hbmQ9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dGhpcy5jb21tYW5kc1thLmlkXT1hLmNhbGxiYWNrfSxlLnByb3RvdHlwZS5hZGRSdWxlPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2EubWV0YWRhdGEmJih0aGlzLmRhdGEucnVsZXNbYS5pZF09YS5tZXRhZGF0YSk7dmFyIGI9dGhpcy5nZXRSdWxlKGEuaWQpO2I/Yi5jb25maWd1cmUoYSk6dGhpcy5ydWxlcy5wdXNoKG5ldyBxKGEsdGhpcykpfSxlLnByb3RvdHlwZS5hZGRDaGVjaz1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj1hLm1ldGFkYXRhO1wib2JqZWN0XCI9PT0odm9pZCAwPT09Yj9cInVuZGVmaW5lZFwiOnphKGIpKSYmKHRoaXMuZGF0YS5jaGVja3NbYS5pZF09YixcIm9iamVjdFwiPT09emEoYi5tZXNzYWdlcykmJk9iamVjdC5rZXlzKGIubWVzc2FnZXMpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYi5tZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eShhKSYmXCJzdHJpbmdcIj09dHlwZW9mIGIubWVzc2FnZXNbYV19KS5mb3JFYWNoKGZ1bmN0aW9uKGEpezA9PT1iLm1lc3NhZ2VzW2FdLmluZGV4T2YoXCJmdW5jdGlvblwiKSYmKGIubWVzc2FnZXNbYV09bmV3IEZ1bmN0aW9uKFwicmV0dXJuIFwiK2IubWVzc2FnZXNbYV0rXCI7XCIpKCkpfSkpLHRoaXMuY2hlY2tzW2EuaWRdP3RoaXMuY2hlY2tzW2EuaWRdLmNvbmZpZ3VyZShhKTp0aGlzLmNoZWNrc1thLmlkXT1uZXcgaShhKX0sZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGEsYixjLGQpe1widXNlIHN0cmljdFwiO3RoaXMudmFsaWRhdGVPcHRpb25zKGIpLGF4ZS5fdHJlZT1heGUudXRpbHMuZ2V0RmxhdHRlbmVkVHJlZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLGF4ZS5fc2VsZWN0Q2FjaGU9W107dmFyIGU9YXhlLnV0aWxzLnF1ZXVlKCk7dGhpcy5ydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKGF4ZS51dGlscy5ydWxlU2hvdWxkUnVuKGMsYSxiKSl7aWYoYi5wZXJmb3JtYW5jZVRpbWVyKXt2YXIgZD1cIm1hcmtfcnVsZV9lbmRfXCIrYy5pZCxmPVwibWFya19ydWxlX3N0YXJ0X1wiK2MuaWQ7YXhlLnV0aWxzLnBlcmZvcm1hbmNlVGltZXIubWFyayhmKX1lLmRlZmVyKGZ1bmN0aW9uKGUsZyl7Yy5ydW4oYSxiLGZ1bmN0aW9uKGEpe2IucGVyZm9ybWFuY2VUaW1lciYmKGF4ZS51dGlscy5wZXJmb3JtYW5jZVRpbWVyLm1hcmsoZCksYXhlLnV0aWxzLnBlcmZvcm1hbmNlVGltZXIubWVhc3VyZShcInJ1bGVfXCIrYy5pZCxmLGQpKSxlKGEpfSxmdW5jdGlvbihhKXtpZihiLmRlYnVnKWcoYSk7ZWxzZXt2YXIgZD1PYmplY3QuYXNzaWduKG5ldyBwKGMpLHtyZXN1bHQ6YXhlLmNvbnN0YW50cy5DQU5UVEVMTCxkZXNjcmlwdGlvbjpcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcnVubmluZyB0aGlzIHJ1bGVcIixtZXNzYWdlOmEubWVzc2FnZSxzdGFjazphLnN0YWNrLGVycm9yOmF9KTtlKGQpfX0pfSl9fSksZS50aGVuKGZ1bmN0aW9uKGEpe2F4ZS5fc2VsZWN0Q2FjaGU9dm9pZCAwLGMoYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkpfSkuY2F0Y2goZCl9LGUucHJvdG90eXBlLmFmdGVyPWZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGM9dGhpcy5ydWxlcztyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGF4ZS51dGlscy5maW5kQnkoYyxcImlkXCIsYS5pZCkuYWZ0ZXIoYSxiKX0pfSxlLnByb3RvdHlwZS5nZXRSdWxlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJ1bGVzLmZpbmQoZnVuY3Rpb24oYil7cmV0dXJuIGIuaWQ9PT1hfSl9LGUucHJvdG90eXBlLnZhbGlkYXRlT3B0aW9ucz1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj10aGlzO2lmKFwib2JqZWN0XCI9PT16YShhLnJ1bk9ubHkpKXt2YXIgYz1hLnJ1bk9ubHk7aWYoXCJydWxlXCI9PT1jLnR5cGUmJkFycmF5LmlzQXJyYXkoYy52YWx1ZSkpYy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFiLmdldFJ1bGUoYSkpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBydWxlIGBcIithK1wiYCBpbiBvcHRpb25zLnJ1bk9ubHlcIil9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoYy52YWx1ZSkmJmMudmFsdWUubGVuZ3RoPjApe3ZhciBkPVtdLmNvbmNhdChjLnZhbHVlKTtpZihiLnJ1bGVzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGIsYyxlO2lmKGQpZm9yKGM9MCxlPWEudGFncy5sZW5ndGg7YzxlO2MrKyktMSE9PShiPWQuaW5kZXhPZihhLnRhZ3NbY10pKSYmZC5zcGxpY2UoYiwxKX0pLDAhPT1kLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZmluZCB0YWdzIGBcIitkLmpvaW4oXCJgLCBgXCIpK1wiYFwiKX19cmV0dXJuXCJvYmplY3RcIj09PXphKGEucnVsZXMpJiZPYmplY3Qua2V5cyhhLnJ1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFiLmdldFJ1bGUoYSkpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBydWxlIGBcIithK1wiYCBpbiBvcHRpb25zLnJ1bGVzXCIpfSksYX0sZS5wcm90b3R5cGUuc2V0QnJhbmRpbmc9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9e2JyYW5kOnRoaXMuYnJhbmQsYXBwbGljYXRpb246dGhpcy5hcHBsaWNhdGlvbn07YSYmYS5oYXNPd25Qcm9wZXJ0eShcImJyYW5kXCIpJiZhLmJyYW5kJiZcInN0cmluZ1wiPT10eXBlb2YgYS5icmFuZCYmKHRoaXMuYnJhbmQ9YS5icmFuZCksYSYmYS5oYXNPd25Qcm9wZXJ0eShcImFwcGxpY2F0aW9uXCIpJiZhLmFwcGxpY2F0aW9uJiZcInN0cmluZ1wiPT10eXBlb2YgYS5hcHBsaWNhdGlvbiYmKHRoaXMuYXBwbGljYXRpb249YS5hcHBsaWNhdGlvbiksdGhpcy5fY29uc3RydWN0SGVscFVybHMoYil9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RIZWxwVXJscz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCxjPShheGUudmVyc2lvbi5tYXRjaCgvXlsxLTldWzAtOV0qXFwuWzAtOV0rLyl8fFtcIngueVwiXSlbMF07dGhpcy5ydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2EuZGF0YS5ydWxlc1tkLmlkXXx8KGEuZGF0YS5ydWxlc1tkLmlkXT17fSk7dmFyIGU9YS5kYXRhLnJ1bGVzW2QuaWRdOyhcInN0cmluZ1wiIT10eXBlb2YgZS5oZWxwVXJsfHxiJiZlLmhlbHBVcmw9PT1mKGIsZC5pZCxjKSkmJihlLmhlbHBVcmw9ZihhLGQuaWQsYykpfSl9LGUucHJvdG90eXBlLnJlc2V0UnVsZXNBbmRDaGVja3M9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt0aGlzLl9pbml0KCl9LGkucHJvdG90eXBlLmVuYWJsZWQ9ITAsaS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGEsYixjLGQpe1widXNlIHN0cmljdFwiO2I9Ynx8e307dmFyIGU9Yi5oYXNPd25Qcm9wZXJ0eShcImVuYWJsZWRcIik/Yi5lbmFibGVkOnRoaXMuZW5hYmxlZCxmPWIub3B0aW9uc3x8dGhpcy5vcHRpb25zO2lmKGUpe3ZhciBoLGk9bmV3IGcodGhpcyksaj1heGUudXRpbHMuY2hlY2tIZWxwZXIoaSxiLGMsZCk7dHJ5e2g9dGhpcy5ldmFsdWF0ZS5jYWxsKGosYS5hY3R1YWxOb2RlLGYsYSl9Y2F0Y2goYSl7cmV0dXJuIHZvaWQgZChhKX1qLmlzQXN5bmN8fChpLnJlc3VsdD1oLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjKGkpfSwwKSl9ZWxzZSBjKG51bGwpfSxpLnByb3RvdHlwZS5jb25maWd1cmU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztbXCJvcHRpb25zXCIsXCJlbmFibGVkXCJdLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5oYXNPd25Qcm9wZXJ0eShiKX0pLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGJbY109YVtjXX0pLFtcImV2YWx1YXRlXCIsXCJhZnRlclwiXS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGEuaGFzT3duUHJvcGVydHkoYil9KS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBiW2NdPWgoYVtjXSl9KX07dmFyIHphPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGF9OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmEuY29uc3RydWN0b3I9PT1TeW1ib2wmJmEhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGF9O3EucHJvdG90eXBlLm1hdGNoZXM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4hMH0scS5wcm90b3R5cGUuZ2F0aGVyPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPWF4ZS51dGlscy5zZWxlY3QodGhpcy5zZWxlY3RvcixhKTtyZXR1cm4gdGhpcy5leGNsdWRlSGlkZGVuP2IuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiFheGUudXRpbHMuaXNIaWRkZW4oYS5hY3R1YWxOb2RlKX0pOmJ9LHEucHJvdG90eXBlLnJ1bkNoZWNrcz1mdW5jdGlvbihhLGIsYyxkLGUpe1widXNlIHN0cmljdFwiO3ZhciBmPXRoaXMsZz1heGUudXRpbHMucXVldWUoKTt0aGlzW2FdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGQ9Zi5fYXVkaXQuY2hlY2tzW2EuaWR8fGFdLGU9YXhlLnV0aWxzLmdldENoZWNrT3B0aW9uKGQsZi5pZCxjKTtnLmRlZmVyKGZ1bmN0aW9uKGEsYyl7ZC5ydW4oYixlLGEsYyl9KX0pLGcudGhlbihmdW5jdGlvbihiKXtiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhfSksZCh7dHlwZTphLHJlc3VsdHM6Yn0pfSkuY2F0Y2goZSl9LHEucHJvdG90eXBlLnJ1bj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj10aGlzLGc9YXhlLnV0aWxzLnF1ZXVlKCksaD1uZXcgcCh0aGlzKSxpPVwibWFya19ydW5jaGVja3Nfc3RhcnRfXCIrdGhpcy5pZCxqPVwibWFya19ydW5jaGVja3NfZW5kX1wiK3RoaXMuaWQsaz12b2lkIDA7dHJ5e2s9dGhpcy5nYXRoZXIoYSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBmLm1hdGNoZXMoYS5hY3R1YWxOb2RlLGEpfSl9Y2F0Y2goYSl7cmV0dXJuIHZvaWQgZShuZXcgYih7Y2F1c2U6YSxydWxlSWQ6dGhpcy5pZH0pKX1jLnBlcmZvcm1hbmNlVGltZXImJihheGUubG9nKFwiZ2F0aGVyIChcIixrLmxlbmd0aCxcIik6XCIsYXhlLnV0aWxzLnBlcmZvcm1hbmNlVGltZXIudGltZUVsYXBzZWQoKStcIm1zXCIpLGF4ZS51dGlscy5wZXJmb3JtYW5jZVRpbWVyLm1hcmsoaSkpLGsuZm9yRWFjaChmdW5jdGlvbihhKXtnLmRlZmVyKGZ1bmN0aW9uKGIsZCl7dmFyIGU9YXhlLnV0aWxzLnF1ZXVlKCk7ZS5kZWZlcihmdW5jdGlvbihiLGQpe2YucnVuQ2hlY2tzKFwiYW55XCIsYSxjLGIsZCl9KSxlLmRlZmVyKGZ1bmN0aW9uKGIsZCl7Zi5ydW5DaGVja3MoXCJhbGxcIixhLGMsYixkKX0pLGUuZGVmZXIoZnVuY3Rpb24oYixkKXtmLnJ1bkNoZWNrcyhcIm5vbmVcIixhLGMsYixkKX0pLGUudGhlbihmdW5jdGlvbihkKXtpZihkLmxlbmd0aCl7dmFyIGU9ITEsZj17fTtkLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXN1bHRzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYX0pO2ZbYS50eXBlXT1iLGIubGVuZ3RoJiYoZT0hMCl9KSxlJiYoZi5ub2RlPW5ldyBheGUudXRpbHMuRHFFbGVtZW50KGEuYWN0dWFsTm9kZSxjKSxoLm5vZGVzLnB1c2goZikpfWIoKX0pLmNhdGNoKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfSl9KX0pLGMucGVyZm9ybWFuY2VUaW1lciYmKGF4ZS51dGlscy5wZXJmb3JtYW5jZVRpbWVyLm1hcmsoaiksYXhlLnV0aWxzLnBlcmZvcm1hbmNlVGltZXIubWVhc3VyZShcInJ1bmNoZWNrc19cIit0aGlzLmlkLGksaikpLGcudGhlbihmdW5jdGlvbigpe3JldHVybiBkKGgpfSkuY2F0Y2goZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSl9KX0scS5wcm90b3R5cGUuYWZ0ZXI9ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjt2YXIgYz1yKHRoaXMpLGQ9dGhpcy5pZDtyZXR1cm4gYy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBlPXMoYS5ub2RlcyxjLmlkKSxmPWF4ZS51dGlscy5nZXRDaGVja09wdGlvbihjLGQsYiksZz1jLmFmdGVyKGUsZik7ZS5mb3JFYWNoKGZ1bmN0aW9uKGEpey0xPT09Zy5pbmRleE9mKGEpJiYoYS5maWx0ZXJlZD0hMCl9KX0pLGEubm9kZXM9dShhKSxhfSxxLnByb3RvdHlwZS5jb25maWd1cmU9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7YS5oYXNPd25Qcm9wZXJ0eShcInNlbGVjdG9yXCIpJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yKSxhLmhhc093blByb3BlcnR5KFwiZXhjbHVkZUhpZGRlblwiKSYmKHRoaXMuZXhjbHVkZUhpZGRlbj1cImJvb2xlYW5cIiE9dHlwZW9mIGEuZXhjbHVkZUhpZGRlbnx8YS5leGNsdWRlSGlkZGVuKSxhLmhhc093blByb3BlcnR5KFwiZW5hYmxlZFwiKSYmKHRoaXMuZW5hYmxlZD1cImJvb2xlYW5cIiE9dHlwZW9mIGEuZW5hYmxlZHx8YS5lbmFibGVkKSxhLmhhc093blByb3BlcnR5KFwicGFnZUxldmVsXCIpJiYodGhpcy5wYWdlTGV2ZWw9XCJib29sZWFuXCI9PXR5cGVvZiBhLnBhZ2VMZXZlbCYmYS5wYWdlTGV2ZWwpLGEuaGFzT3duUHJvcGVydHkoXCJhbnlcIikmJih0aGlzLmFueT1hLmFueSksYS5oYXNPd25Qcm9wZXJ0eShcImFsbFwiKSYmKHRoaXMuYWxsPWEuYWxsKSxhLmhhc093blByb3BlcnR5KFwibm9uZVwiKSYmKHRoaXMubm9uZT1hLm5vbmUpLGEuaGFzT3duUHJvcGVydHkoXCJ0YWdzXCIpJiYodGhpcy50YWdzPWEudGFncyksYS5oYXNPd25Qcm9wZXJ0eShcIm1hdGNoZXNcIikmJihcInN0cmluZ1wiPT10eXBlb2YgYS5tYXRjaGVzP3RoaXMubWF0Y2hlcz1uZXcgRnVuY3Rpb24oXCJyZXR1cm4gXCIrYS5tYXRjaGVzK1wiO1wiKSgpOnRoaXMubWF0Y2hlcz1hLm1hdGNoZXMpfSxmdW5jdGlvbihheGUpe3ZhciBhPVt7bmFtZTpcIk5BXCIsdmFsdWU6XCJpbmFwcGxpY2FibGVcIixwcmlvcml0eTowLGdyb3VwOlwiaW5hcHBsaWNhYmxlXCJ9LHtuYW1lOlwiUEFTU1wiLHZhbHVlOlwicGFzc2VkXCIscHJpb3JpdHk6MSxncm91cDpcInBhc3Nlc1wifSx7bmFtZTpcIkNBTlRURUxMXCIsdmFsdWU6XCJjYW50VGVsbFwiLHByaW9yaXR5OjIsZ3JvdXA6XCJpbmNvbXBsZXRlXCJ9LHtuYW1lOlwiRkFJTFwiLHZhbHVlOlwiZmFpbGVkXCIscHJpb3JpdHk6Myxncm91cDpcInZpb2xhdGlvbnNcIn1dLGI9e2hlbHBVcmxCYXNlOlwiaHR0cHM6Ly9kZXF1ZXVuaXZlcnNpdHkuY29tL3J1bGVzL1wiLHJlc3VsdHM6W10scmVzdWx0R3JvdXBzOltdLHJlc3VsdEdyb3VwTWFwOnt9LGltcGFjdDpPYmplY3QuZnJlZXplKFtcIm1pbm9yXCIsXCJtb2RlcmF0ZVwiLFwic2VyaW91c1wiLFwiY3JpdGljYWxcIl0pfTthLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9YS5uYW1lLGQ9YS52YWx1ZSxlPWEucHJpb3JpdHksZj1hLmdyb3VwO2JbY109ZCxiW2MrXCJfUFJJT1wiXT1lLGJbYytcIl9HUk9VUFwiXT1mLGIucmVzdWx0c1tlXT1kLGIucmVzdWx0R3JvdXBzW2VdPWYsYi5yZXN1bHRHcm91cE1hcFtkXT1mfSksT2JqZWN0LmZyZWV6ZShiLnJlc3VsdHMpLE9iamVjdC5mcmVlemUoYi5yZXN1bHRHcm91cHMpLE9iamVjdC5mcmVlemUoYi5yZXN1bHRHcm91cE1hcCksT2JqZWN0LmZyZWV6ZShiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYXhlLFwiY29uc3RhbnRzXCIse3ZhbHVlOmIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsd3JpdGFibGU6ITF9KX0oYXhlKTt2YXIgemE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX07YXhlLmxvZz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO1wib2JqZWN0XCI9PT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIGNvbnNvbGU/XCJ1bmRlZmluZWRcIjp6YShjb25zb2xlKSkmJmNvbnNvbGUubG9nJiZGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZyxjb25zb2xlLGFyZ3VtZW50cyl9LGF4ZS5jbGVhbnVwPXYsYXhlLmNvbmZpZ3VyZT13LGF4ZS5nZXRSdWxlcz1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjthPWF8fFtdO3ZhciBiPWEubGVuZ3RoP2F4ZS5fYXVkaXQucnVsZXMuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiEhYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPT1iLnRhZ3MuaW5kZXhPZihhKX0pLmxlbmd0aH0pOmF4ZS5fYXVkaXQucnVsZXMsYz1heGUuX2F1ZGl0LmRhdGEucnVsZXN8fHt9O3JldHVybiBiLm1hcChmdW5jdGlvbihhKXt2YXIgYj1jW2EuaWRdfHx7fTtyZXR1cm57cnVsZUlkOmEuaWQsZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbixoZWxwOmIuaGVscCxoZWxwVXJsOmIuaGVscFVybCx0YWdzOmEudGFnc319KX0sYXhlLl9sb2FkPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2F4ZS51dGlscy5yZXNwb25kYWJsZS5zdWJzY3JpYmUoXCJheGUucGluZ1wiLGZ1bmN0aW9uKGEsYixjKXtjKHtheGU6ITB9KX0pLGF4ZS51dGlscy5yZXNwb25kYWJsZS5zdWJzY3JpYmUoXCJheGUuc3RhcnRcIix4KSxheGUuX2F1ZGl0PW5ldyBlKGEpfTt2YXIgYXhlPWF4ZXx8e307YXhlLnBsdWdpbnM9e30seS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHRoaXMuX3J1bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHkucHJvdG90eXBlLmNvbGxlY3Q9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdGhpcy5fY29sbGVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHkucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9YXhlLnV0aWxzLnF1ZXVlKCksYz10aGlzO09iamVjdC5rZXlzKHRoaXMuX3JlZ2lzdHJ5KS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuZGVmZXIoZnVuY3Rpb24oYil7Yy5fcmVnaXN0cnlbYV0uY2xlYW51cChiKX0pfSksYi50aGVuKGZ1bmN0aW9uKCl7YSgpfSl9LHkucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt0aGlzLl9yZWdpc3RyeVthLmlkXT1hfSxheGUucmVnaXN0ZXJQbHVnaW49ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7YXhlLnBsdWdpbnNbYS5pZF09bmV3IHkoYSl9O3ZhciBCYSxDYT17fTtheGUuZ2V0UmVwb3J0ZXI9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGEmJkNhW2FdP0NhW2FdOlwiZnVuY3Rpb25cIj09dHlwZW9mIGE/YTpCYX0sYXhlLmFkZFJlcG9ydGVyPWZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtDYVthXT1iLGMmJihCYT1iKX0sYXhlLnJlc2V0PXosYXhlLl9ydW5SdWxlcz1BO3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfSxEYT1mdW5jdGlvbigpe307YXhlLnJ1bj1mdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7aWYoIWF4ZS5fYXVkaXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gYXVkaXQgY29uZmlndXJlZFwiKTt2YXIgZD1DKGEsYixjKTthPWQuY29udGV4dCxiPWQub3B0aW9ucyxjPWQuY2FsbGJhY2ssYi5yZXBvcnRlcj1iLnJlcG9ydGVyfHxheGUuX2F1ZGl0LnJlcG9ydGVyfHxcInYxXCIsYi5wZXJmb3JtYW5jZVRpbWVyJiZheGUudXRpbHMucGVyZm9ybWFuY2VUaW1lci5zdGFydCgpO3ZhciBlPXZvaWQgMCxmPURhLGc9RGE7cmV0dXJuIHdpbmRvdy5Qcm9taXNlJiZjPT09RGEmJihlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7Zj1iLGc9YX0pKSxheGUuX3J1blJ1bGVzKGEsYixmdW5jdGlvbihhKXt2YXIgZD1mdW5jdGlvbihhKXt0cnl7YyhudWxsLGEpfWNhdGNoKGEpe2F4ZS5sb2coYSl9ZyhhKX07Yi5wZXJmb3JtYW5jZVRpbWVyJiZheGUudXRpbHMucGVyZm9ybWFuY2VUaW1lci5lbmQoKTt0cnl7dmFyIGU9YXhlLmdldFJlcG9ydGVyKGIucmVwb3J0ZXIpLGg9ZShhLGIsZCk7YXhlLl9zZWxlY3RvckRhdGE9dm9pZCAwLGF4ZS5fdHJlZT12b2lkIDAsdm9pZCAwIT09aCYmZChoKX1jYXRjaChhKXtjKGEpLGYoYSl9fSxmdW5jdGlvbihhKXtjKGEpLGYoYSl9KSxlfSxBYS5mYWlsdXJlU3VtbWFyeT1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj17fTtyZXR1cm4gYi5ub25lPWEubm9uZS5jb25jYXQoYS5hbGwpLGIuYW55PWEuYW55LE9iamVjdC5rZXlzKGIpLm1hcChmdW5jdGlvbihhKXtpZihiW2FdLmxlbmd0aCl7dmFyIGM9YXhlLl9hdWRpdC5kYXRhLmZhaWx1cmVTdW1tYXJpZXNbYV07cmV0dXJuIGMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGMuZmFpbHVyZU1lc3NhZ2U/Yy5mYWlsdXJlTWVzc2FnZShiW2FdLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5tZXNzYWdlfHxcIlwifSkpOnZvaWQgMH19KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMCE9PWF9KS5qb2luKFwiXFxuXFxuXCIpfSxBYS5pbmNvbXBsZXRlRmFsbGJhY2tNZXNzYWdlPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGF4ZS5fYXVkaXQuZGF0YS5pbmNvbXBsZXRlRmFsbGJhY2tNZXNzYWdlKCl9O3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfSxFYT1heGUuY29uc3RhbnRzLnJlc3VsdEdyb3VwcztBYS5wcm9jZXNzQWdncmVnYXRlPWZ1bmN0aW9uKGEsYil7dmFyIGM9YXhlLnV0aWxzLmFnZ3JlZ2F0ZVJlc3VsdChhKTtyZXR1cm4gYy50aW1lc3RhbXA9KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLGMudXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmLEVhLmZvckVhY2goZnVuY3Rpb24oYSl7Yi5yZXN1bHRUeXBlcyYmIWIucmVzdWx0VHlwZXMuaW5jbHVkZXMoYSkmJihjW2FdfHxbXSkuZm9yRWFjaChmdW5jdGlvbihhKXtBcnJheS5pc0FycmF5KGEubm9kZXMpJiZhLm5vZGVzLmxlbmd0aD4wJiYoYS5ub2Rlcz1bYS5ub2Rlc1swXV0pfSksY1thXT0oY1thXXx8W10pLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYT1PYmplY3QuYXNzaWduKHt9LGEpLEFycmF5LmlzQXJyYXkoYS5ub2RlcykmJmEubm9kZXMubGVuZ3RoPjAmJihhLm5vZGVzPWEubm9kZXMubWFwKGZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT16YShhLm5vZGUpJiYoYS5odG1sPWEubm9kZS5zb3VyY2UsYi5lbGVtZW50UmVmJiYhYS5ub2RlLmZyb21GcmFtZSYmKGEuZWxlbWVudD1hLm5vZGUuZWxlbWVudCksKCExIT09Yi5zZWxlY3RvcnN8fGEubm9kZS5mcm9tRnJhbWUpJiYoYS50YXJnZXQ9YS5ub2RlLnNlbGVjdG9yKSxiLnhwYXRoJiYoYS54cGF0aD1hLm5vZGUueHBhdGgpKSxkZWxldGUgYS5yZXN1bHQsZGVsZXRlIGEubm9kZSxEKGEsYiksYX0pKSxFYS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3JldHVybiBkZWxldGUgYVtiXX0pLGRlbGV0ZSBhLnBhZ2VMZXZlbCxkZWxldGUgYS5yZXN1bHQsYX0pfSksY30sYXhlLmFkZFJlcG9ydGVyKFwibmFcIixmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgYiYmKGM9YixiPXt9KTt2YXIgZD1BYS5wcm9jZXNzQWdncmVnYXRlKGEsYik7Yyh7dmlvbGF0aW9uczpkLnZpb2xhdGlvbnMscGFzc2VzOmQucGFzc2VzLGluY29tcGxldGU6ZC5pbmNvbXBsZXRlLGluYXBwbGljYWJsZTpkLmluYXBwbGljYWJsZSx0aW1lc3RhbXA6ZC50aW1lc3RhbXAsdXJsOmQudXJsfSl9KSxheGUuYWRkUmVwb3J0ZXIoXCJuby1wYXNzZXNcIixmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgYiYmKGM9YixiPXt9KSxiLnJlc3VsdFR5cGVzPVtcInZpb2xhdGlvbnNcIl07dmFyIGQ9QWEucHJvY2Vzc0FnZ3JlZ2F0ZShhLGIpO2Moe3Zpb2xhdGlvbnM6ZC52aW9sYXRpb25zLHRpbWVzdGFtcDpkLnRpbWVzdGFtcCx1cmw6ZC51cmx9KX0pLGF4ZS5hZGRSZXBvcnRlcihcInJhd1wiLGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtcImZ1bmN0aW9uXCI9PXR5cGVvZiBiJiYoYz1iLGI9e30pLGMoYSl9KSxheGUuYWRkUmVwb3J0ZXIoXCJ2MVwiLGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtcImZ1bmN0aW9uXCI9PXR5cGVvZiBiJiYoYz1iLGI9e30pO3ZhciBkPUFhLnByb2Nlc3NBZ2dyZWdhdGUoYSxiKTtkLnZpb2xhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZmFpbHVyZVN1bW1hcnk9QWEuZmFpbHVyZVN1bW1hcnkoYSl9KX0pLGMoe3Zpb2xhdGlvbnM6ZC52aW9sYXRpb25zLHBhc3NlczpkLnBhc3NlcyxpbmNvbXBsZXRlOmQuaW5jb21wbGV0ZSxpbmFwcGxpY2FibGU6ZC5pbmFwcGxpY2FibGUsdGltZXN0YW1wOmQudGltZXN0YW1wLHVybDpkLnVybH0pfSksYXhlLmFkZFJlcG9ydGVyKFwidjJcIixmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgYiYmKGM9YixiPXt9KTt2YXIgZD1BYS5wcm9jZXNzQWdncmVnYXRlKGEsYik7Yyh7dmlvbGF0aW9uczpkLnZpb2xhdGlvbnMscGFzc2VzOmQucGFzc2VzLGluY29tcGxldGU6ZC5pbmNvbXBsZXRlLGluYXBwbGljYWJsZTpkLmluYXBwbGljYWJsZSx0aW1lc3RhbXA6ZC50aW1lc3RhbXAsdXJsOmQudXJsfSl9LCEwKSxheGUudXRpbHMuYWdncmVnYXRlPWZ1bmN0aW9uKGEsYixjKXtiPWIuc2xpY2UoKSxjJiZiLnB1c2goYyk7dmFyIGQ9Yi5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIGEuaW5kZXhPZihiKX0pLnNvcnQoKTtyZXR1cm4gYVtkLnBvcCgpXX07dmFyIEZhPWF4ZS5jb25zdGFudHMsR2E9RmEuQ0FOVFRFTExfUFJJTyxIYT1GYS5GQUlMX1BSSU8sSWE9W107SWFbYXhlLmNvbnN0YW50cy5QQVNTX1BSSU9dPSEwLElhW2F4ZS5jb25zdGFudHMuQ0FOVFRFTExfUFJJT109bnVsbCxJYVtheGUuY29uc3RhbnRzLkZBSUxfUFJJT109ITE7dmFyIEphPVtcImFueVwiLFwiYWxsXCIsXCJub25lXCJdO2F4ZS51dGlscy5hZ2dyZWdhdGVDaGVja3M9ZnVuY3Rpb24oYSl7dmFyIGI9T2JqZWN0LmFzc2lnbih7fSxhKTtFKGIsZnVuY3Rpb24oYSxiKXt2YXIgYz1JYS5pbmRleE9mKGEucmVzdWx0KTthLnByaW9yaXR5PS0xIT09Yz9jOmF4ZS5jb25zdGFudHMuQ0FOVFRFTExfUFJJTyxcIm5vbmVcIj09PWImJihhLnByaW9yaXR5PTQtYS5wcmlvcml0eSl9KTt2YXIgYz17YWxsOmIuYWxsLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLm1heChhLGIucHJpb3JpdHkpfSwwKSxub25lOmIubm9uZS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5tYXgoYSxiLnByaW9yaXR5KX0sMCksYW55OmIuYW55LnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLm1pbihhLGIucHJpb3JpdHkpfSw0KSU0fTtiLnByaW9yaXR5PU1hdGgubWF4KGMuYWxsLGMubm9uZSxjLmFueSk7dmFyIGQ9W107cmV0dXJuIEphLmZvckVhY2goZnVuY3Rpb24oYSl7YlthXT1iW2FdLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC5wcmlvcml0eT09PWIucHJpb3JpdHkmJmQucHJpb3JpdHk9PT1jW2FdfSksYlthXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBkLnB1c2goYS5pbXBhY3QpfSl9KSxbR2EsSGFdLmluY2x1ZGVzKGIucHJpb3JpdHkpP2IuaW1wYWN0PWF4ZS51dGlscy5hZ2dyZWdhdGUoYXhlLmNvbnN0YW50cy5pbXBhY3QsZCk6Yi5pbXBhY3Q9bnVsbCxFKGIsZnVuY3Rpb24oYSl7ZGVsZXRlIGEucmVzdWx0LGRlbGV0ZSBhLnByaW9yaXR5fSksYi5yZXN1bHQ9YXhlLmNvbnN0YW50cy5yZXN1bHRzW2IucHJpb3JpdHldLGRlbGV0ZSBiLnByaW9yaXR5LGJ9LGZ1bmN0aW9uKCl7YXhlLnV0aWxzLmFnZ3JlZ2F0ZU5vZGVSZXN1bHRzPWZ1bmN0aW9uKGEpe3ZhciBiPXt9O2lmKChhPWEubWFwKGZ1bmN0aW9uKGEpe2lmKGEuYW55JiZhLmFsbCYmYS5ub25lKXJldHVybiBheGUudXRpbHMuYWdncmVnYXRlQ2hlY2tzKGEpO2lmKEFycmF5LmlzQXJyYXkoYS5ub2RlKSlyZXR1cm4gYXhlLnV0aWxzLmZpbmFsaXplUnVsZVJlc3VsdChhKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBSZXN1bHQgdHlwZVwiKX0pKSYmYS5sZW5ndGgpe3ZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnJlc3VsdH0pO2IucmVzdWx0PWF4ZS51dGlscy5hZ2dyZWdhdGUoYXhlLmNvbnN0YW50cy5yZXN1bHRzLGMsYi5yZXN1bHQpfWVsc2UgYi5yZXN1bHQ9XCJpbmFwcGxpY2FibGVcIjtheGUuY29uc3RhbnRzLnJlc3VsdEdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdPVtdfSksYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPWF4ZS5jb25zdGFudHMucmVzdWx0R3JvdXBNYXBbYS5yZXN1bHRdO2JbY10ucHVzaChhKX0pO3ZhciBkPWF4ZS5jb25zdGFudHMuRkFJTF9HUk9VUDtpZigwPT09YltkXS5sZW5ndGgmJihkPWF4ZS5jb25zdGFudHMuQ0FOVFRFTExfR1JPVVApLGJbZF0ubGVuZ3RoPjApe3ZhciBlPWJbZF0ubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLmltcGFjdH0pO2IuaW1wYWN0PWF4ZS51dGlscy5hZ2dyZWdhdGUoYXhlLmNvbnN0YW50cy5pbXBhY3QsZSl8fG51bGx9ZWxzZSBiLmltcGFjdD1udWxsO3JldHVybiBifX0oKSxheGUudXRpbHMuYWdncmVnYXRlUmVzdWx0PWZ1bmN0aW9uKGEpe3ZhciBiPXt9O3JldHVybiBheGUuY29uc3RhbnRzLnJlc3VsdEdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdPVtdfSksYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZXJyb3I/RihiLGEsYXhlLmNvbnN0YW50cy5DQU5UVEVMTF9HUk9VUCk6YS5yZXN1bHQ9PT1heGUuY29uc3RhbnRzLk5BP0YoYixhLGF4ZS5jb25zdGFudHMuTkFfR1JPVVApOmF4ZS5jb25zdGFudHMucmVzdWx0R3JvdXBzLmZvckVhY2goZnVuY3Rpb24oYyl7QXJyYXkuaXNBcnJheShhW2NdKSYmYVtjXS5sZW5ndGg+MCYmRihiLGEsYyl9KX0pLGJ9LGF4ZS51dGlscy5hcmVTdHlsZXNTZXQ9RyxheGUudXRpbHMuY2hlY2tIZWxwZXI9ZnVuY3Rpb24oYSxiLGMsZCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJue2lzQXN5bmM6ITEsYXN5bmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0FzeW5jPSEwLGZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBFcnJvcj09ITE/KGEucmVzdWx0PWIsYyhhKSk6ZChiKX19LGRhdGE6ZnVuY3Rpb24oYil7YS5kYXRhPWJ9LHJlbGF0ZWROb2RlczpmdW5jdGlvbihjKXtjPWMgaW5zdGFuY2VvZiBOb2RlP1tjXTpheGUudXRpbHMudG9BcnJheShjKSxhLnJlbGF0ZWROb2Rlcz1jLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGF4ZS51dGlscy5EcUVsZW1lbnQoYSxiKX0pfX19O3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfTtheGUudXRpbHMuY2xvbmU9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGIsYyxkPWE7aWYobnVsbCE9PWEmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09YT9cInVuZGVmaW5lZFwiOnphKGEpKSlpZihBcnJheS5pc0FycmF5KGEpKWZvcihkPVtdLGI9MCxjPWEubGVuZ3RoO2I8YztiKyspZFtiXT1heGUudXRpbHMuY2xvbmUoYVtiXSk7ZWxzZXtkPXt9O2ZvcihiIGluIGEpZFtiXT1heGUudXRpbHMuY2xvbmUoYVtiXSl9cmV0dXJuIGR9LGF4ZS51dGlscy5zZW5kQ29tbWFuZFRvRnJhbWU9ZnVuY3Rpb24oYSxiLGMsZCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9YS5jb250ZW50V2luZG93O2lmKCFlKXJldHVybiBheGUubG9nKFwiRnJhbWUgZG9lcyBub3QgaGF2ZSBhIGNvbnRlbnQgd2luZG93XCIsYSksdm9pZCBjKG51bGwpO3ZhciBmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT1IKFwiTm8gcmVzcG9uc2UgZnJvbSBmcmFtZVwiLGEpO2IuZGVidWc/ZChlKTooYXhlLmxvZyhlKSxjKG51bGwpKX0sMCl9LDUwMCk7YXhlLnV0aWxzLnJlc3BvbmRhYmxlKGUsXCJheGUucGluZ1wiLG51bGwsdm9pZCAwLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGYpO3ZhciBnPWIub3B0aW9ucyYmYi5vcHRpb25zLmZyYW1lV2FpdFRpbWV8fDZlNDtmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtkKEgoXCJBeGUgaW4gZnJhbWUgdGltZWQgb3V0XCIsYSkpfSxnKSxheGUudXRpbHMucmVzcG9uZGFibGUoZSxcImF4ZS5zdGFydFwiLGIsdm9pZCAwLGZ1bmN0aW9uKGEpe2NsZWFyVGltZW91dChmKSxhIGluc3RhbmNlb2YgRXJyb3I9PSExP2MoYSk6ZChhKX0pfSl9LGF4ZS51dGlscy5jb2xsZWN0UmVzdWx0c0Zyb21GcmFtZXM9SSxheGUudXRpbHMuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjKGEsYil7cmV0dXJuIGEuc2hhZG93SWQ9PT1iLnNoYWRvd0lkfHwhIWEuY2hpbGRyZW4uZmluZChmdW5jdGlvbihhKXtyZXR1cm4gYyhhLGIpfSl9cmV0dXJuIGEuc2hhZG93SWR8fGIuc2hhZG93SWQ/YyhhLGIpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuYWN0dWFsTm9kZS5jb250YWlucz9hLmFjdHVhbE5vZGUuY29udGFpbnMoYi5hY3R1YWxOb2RlKTohISgxNiZhLmFjdHVhbE5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYi5hY3R1YWxOb2RlKSl9LGZ1bmN0aW9uKGF4ZSl7LyohXG4gICogVGhlIGNvcHlyaWdodCBiZWxvdyBjb3ZlcnMgdGhlIGNvZGUgd2l0aGluIHRoaXMgZnVuY3Rpb24gYmxvY2sgb25seVxuICAqXG4gICogQ29weXJpZ2h0IChjKSAyMDEzIER1bGluIE1hcmF0XG4gICogXG4gICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICogXG4gICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgKiBcbiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICAqIFRIRSBTT0ZUV0FSRS5cbiAgKi9cbmZ1bmN0aW9uIGEoKXt0aGlzLnBzZXVkb3M9e30sdGhpcy5hdHRyRXF1YWxpdHlNb2RzPXt9LHRoaXMucnVsZU5lc3RpbmdPcGVyYXRvcnM9e30sdGhpcy5zdWJzdGl0dXRlc0VuYWJsZWQ9ITF9ZnVuY3Rpb24gYihhKXtyZXR1cm4gYT49XCJhXCImJmE8PVwielwifHxhPj1cIkFcIiYmYTw9XCJaXCJ8fFwiLVwiPT09YXx8XCJfXCI9PT1hfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGE+PVwiYVwiJiZhPD1cInpcInx8YT49XCJBXCImJmE8PVwiWlwifHxhPj1cIjBcIiYmYTw9XCI5XCJ8fFwiLVwiPT09YXx8XCJfXCI9PT1hfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE+PVwiYVwiJiZhPD1cImZcInx8YT49XCJBXCImJmE8PVwiRlwifHxhPj1cIjBcIiYmYTw9XCI5XCJ9ZnVuY3Rpb24gZShhLGUsZyxqLGssbCl7dmFyIG0sbixvLHAscTtyZXR1cm4gcD1hLmxlbmd0aCxtPW51bGwsbz1mdW5jdGlvbihiLGMpe3ZhciBmLGcsaDtmb3IoaD1cIlwiLGUrKyxtPWEuY2hhckF0KGUpO2U8cDspe2lmKG09PT1iKXJldHVybiBlKyssaDtpZihcIlxcXFxcIj09PW0paWYoZSsrLChtPWEuY2hhckF0KGUpKT09PWIpaCs9YjtlbHNlIGlmKGY9Y1ttXSloKz1mO2Vsc2V7aWYoZChtKSl7Zm9yKGc9bSxlKyssbT1hLmNoYXJBdChlKTtkKG0pOylnKz1tLGUrKyxtPWEuY2hhckF0KGUpO1wiIFwiPT09bSYmKGUrKyxtPWEuY2hhckF0KGUpKSxoKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGcsMTYpKTtjb250aW51ZX1oKz1tfWVsc2UgaCs9bTtlKyssbT1hLmNoYXJBdChlKX1yZXR1cm4gaH0sbj1mdW5jdGlvbigpe3ZhciBiPVwiXCI7Zm9yKG09YS5jaGFyQXQoZSk7ZTxwOyl7aWYoYyhtKSliKz1tO2Vsc2V7aWYoXCJcXFxcXCIhPT1tKXJldHVybiBiO2lmKCsrZT49cCl0aHJvdyBFcnJvcihcIkV4cGVjdGVkIHN5bWJvbCBidXQgZW5kIG9mIGZpbGUgcmVhY2hlZC5cIik7aWYobT1hLmNoYXJBdChlKSxmW21dKWIrPW07ZWxzZXtpZihkKG0pKXt2YXIgZz1tO2ZvcihlKyssbT1hLmNoYXJBdChlKTtkKG0pOylnKz1tLGUrKyxtPWEuY2hhckF0KGUpO1wiIFwiPT09bSYmKGUrKyxtPWEuY2hhckF0KGUpKSxiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGcsMTYpKTtjb250aW51ZX1iKz1tfX1lKyssbT1hLmNoYXJBdChlKX1yZXR1cm4gYn0scT1mdW5jdGlvbigpe209YS5jaGFyQXQoZSk7Zm9yKHZhciBiPSExO1wiIFwiPT09bXx8XCJcXHRcIj09PW18fFwiXFxuXCI9PT1tfHxcIlxcclwiPT09bXx8XCJcXGZcIj09PW07KWI9ITAsZSsrLG09YS5jaGFyQXQoZSk7cmV0dXJuIGJ9LHRoaXMucGFyc2U9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBhcnNlU2VsZWN0b3IoKTtpZihlPHApdGhyb3cgRXJyb3IoJ1J1bGUgZXhwZWN0ZWQgYnV0IFwiJythLmNoYXJBdChlKSsnXCIgZm91bmQuJyk7cmV0dXJuIGJ9LHRoaXMucGFyc2VTZWxlY3Rvcj1mdW5jdGlvbigpe3ZhciBiLGM9Yj10aGlzLnBhcnNlU2luZ2xlU2VsZWN0b3IoKTtmb3IobT1hLmNoYXJBdChlKTtcIixcIj09PW07KXtpZihlKysscSgpLFwic2VsZWN0b3JzXCIhPT1iLnR5cGUmJihiPXt0eXBlOlwic2VsZWN0b3JzXCIsc2VsZWN0b3JzOltjXX0pLCEoYz10aGlzLnBhcnNlU2luZ2xlU2VsZWN0b3IoKSkpdGhyb3cgRXJyb3IoJ1J1bGUgZXhwZWN0ZWQgYWZ0ZXIgXCIsXCIuJyk7Yi5zZWxlY3RvcnMucHVzaChjKX1yZXR1cm4gYn0sdGhpcy5wYXJzZVNpbmdsZVNlbGVjdG9yPWZ1bmN0aW9uKCl7cSgpO3ZhciBiPXt0eXBlOlwicnVsZVNldFwifSxjPXRoaXMucGFyc2VSdWxlKCk7aWYoIWMpcmV0dXJuIG51bGw7Zm9yKHZhciBkPWI7YyYmKGMudHlwZT1cInJ1bGVcIixkLnJ1bGU9YyxkPWMscSgpLG09YS5jaGFyQXQoZSksIShlPj1wfHxcIixcIj09PW18fFwiKVwiPT09bSkpOylpZihrW21dKXt2YXIgZj1tO2lmKGUrKyxxKCksIShjPXRoaXMucGFyc2VSdWxlKCkpKXRocm93IEVycm9yKCdSdWxlIGV4cGVjdGVkIGFmdGVyIFwiJytmKydcIi4nKTtjLm5lc3RpbmdPcGVyYXRvcj1mfWVsc2UoYz10aGlzLnBhcnNlUnVsZSgpKSYmKGMubmVzdGluZ09wZXJhdG9yPW51bGwpO3JldHVybiBifSx0aGlzLnBhcnNlUnVsZT1mdW5jdGlvbigpe2Zvcih2YXIgYz1udWxsO2U8cDspaWYoXCIqXCI9PT0obT1hLmNoYXJBdChlKSkpZSsrLChjPWN8fHt9KS50YWdOYW1lPVwiKlwiO2Vsc2UgaWYoYihtKXx8XCJcXFxcXCI9PT1tKShjPWN8fHt9KS50YWdOYW1lPW4oKTtlbHNlIGlmKFwiLlwiPT09bSllKyssYz1jfHx7fSwoYy5jbGFzc05hbWVzPWMuY2xhc3NOYW1lc3x8W10pLnB1c2gobigpKTtlbHNlIGlmKFwiI1wiPT09bSllKyssKGM9Y3x8e30pLmlkPW4oKTtlbHNlIGlmKFwiW1wiPT09bSl7ZSsrLHEoKTt2YXIgZD17bmFtZTpuKCl9O2lmKHEoKSxcIl1cIj09PW0pZSsrO2Vsc2V7dmFyIGY9XCJcIjtpZihqW21dJiYoZj1tLGUrKyxtPWEuY2hhckF0KGUpKSxlPj1wKXRocm93IEVycm9yKCdFeHBlY3RlZCBcIj1cIiBidXQgZW5kIG9mIGZpbGUgcmVhY2hlZC4nKTtpZihcIj1cIiE9PW0pdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIFwiPVwiIGJ1dCBcIicrbSsnXCIgZm91bmQuJyk7ZC5vcGVyYXRvcj1mK1wiPVwiLGUrKyxxKCk7dmFyIGs9XCJcIjtpZihkLnZhbHVlVHlwZT1cInN0cmluZ1wiLCdcIic9PT1tKWs9bygnXCInLGkpO2Vsc2UgaWYoXCInXCI9PT1tKWs9byhcIidcIixoKTtlbHNlIGlmKGwmJlwiJFwiPT09bSllKyssaz1uKCksZC52YWx1ZVR5cGU9XCJzdWJzdGl0dXRlXCI7ZWxzZXtmb3IoO2U8cCYmXCJdXCIhPT1tOylrKz1tLGUrKyxtPWEuY2hhckF0KGUpO2s9ay50cmltKCl9aWYocSgpLGU+PXApdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIFwiXVwiIGJ1dCBlbmQgb2YgZmlsZSByZWFjaGVkLicpO2lmKFwiXVwiIT09bSl0aHJvdyBFcnJvcignRXhwZWN0ZWQgXCJdXCIgYnV0IFwiJyttKydcIiBmb3VuZC4nKTtlKyssZC52YWx1ZT1rfWM9Y3x8e30sKGMuYXR0cnM9Yy5hdHRyc3x8W10pLnB1c2goZCl9ZWxzZXtpZihcIjpcIiE9PW0pYnJlYWs7ZSsrO3ZhciByPW4oKSxzPXtuYW1lOnJ9O2lmKFwiKFwiPT09bSl7ZSsrO3ZhciB0PVwiXCI7aWYocSgpLFwic2VsZWN0b3JcIj09PWdbcl0pcy52YWx1ZVR5cGU9XCJzZWxlY3RvclwiLHQ9dGhpcy5wYXJzZVNlbGVjdG9yKCk7ZWxzZXtpZihzLnZhbHVlVHlwZT1nW3JdfHxcInN0cmluZ1wiLCdcIic9PT1tKXQ9bygnXCInLGkpO2Vsc2UgaWYoXCInXCI9PT1tKXQ9byhcIidcIixoKTtlbHNlIGlmKGwmJlwiJFwiPT09bSllKyssdD1uKCkscy52YWx1ZVR5cGU9XCJzdWJzdGl0dXRlXCI7ZWxzZXtmb3IoO2U8cCYmXCIpXCIhPT1tOyl0Kz1tLGUrKyxtPWEuY2hhckF0KGUpO3Q9dC50cmltKCl9cSgpfWlmKGU+PXApdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIFwiKVwiIGJ1dCBlbmQgb2YgZmlsZSByZWFjaGVkLicpO2lmKFwiKVwiIT09bSl0aHJvdyBFcnJvcignRXhwZWN0ZWQgXCIpXCIgYnV0IFwiJyttKydcIiBmb3VuZC4nKTtlKysscy52YWx1ZT10fWM9Y3x8e30sKGMucHNldWRvcz1jLnBzZXVkb3N8fFtdKS5wdXNoKHMpfXJldHVybiBjfSx0aGlzfWEucHJvdG90eXBlLnJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9YXJndW1lbnRzLmxlbmd0aDtiPGM7YisrKWE9YXJndW1lbnRzW2JdLHRoaXMucHNldWRvc1thXT1cInNlbGVjdG9yXCI7cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnVucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3M9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hcmd1bWVudHMubGVuZ3RoO2I8YztiKyspYT1hcmd1bWVudHNbYl0sZGVsZXRlIHRoaXMucHNldWRvc1thXTtyZXR1cm4gdGhpc30sYS5wcm90b3R5cGUucmVnaXN0ZXJOdW1lcmljUHNldWRvcz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPWFyZ3VtZW50cy5sZW5ndGg7YjxjO2IrKylhPWFyZ3VtZW50c1tiXSx0aGlzLnBzZXVkb3NbYV09XCJudW1lcmljXCI7cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnVucmVnaXN0ZXJOdW1lcmljUHNldWRvcz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPWFyZ3VtZW50cy5sZW5ndGg7YjxjO2IrKylhPWFyZ3VtZW50c1tiXSxkZWxldGUgdGhpcy5wc2V1ZG9zW2FdO3JldHVybiB0aGlzfSxhLnByb3RvdHlwZS5yZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hcmd1bWVudHMubGVuZ3RoO2I8YztiKyspYT1hcmd1bWVudHNbYl0sdGhpcy5ydWxlTmVzdGluZ09wZXJhdG9yc1thXT0hMDtyZXR1cm4gdGhpc30sYS5wcm90b3R5cGUudW5yZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hcmd1bWVudHMubGVuZ3RoO2I8YztiKyspYT1hcmd1bWVudHNbYl0sZGVsZXRlIHRoaXMucnVsZU5lc3RpbmdPcGVyYXRvcnNbYV07cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPWFyZ3VtZW50cy5sZW5ndGg7YjxjO2IrKylhPWFyZ3VtZW50c1tiXSx0aGlzLmF0dHJFcXVhbGl0eU1vZHNbYV09ITA7cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnVucmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9YXJndW1lbnRzLmxlbmd0aDtiPGM7YisrKWE9YXJndW1lbnRzW2JdLGRlbGV0ZSB0aGlzLmF0dHJFcXVhbGl0eU1vZHNbYV07cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLmVuYWJsZVN1YnN0aXR1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3Vic3RpdHV0ZXNFbmFibGVkPSEwLHRoaXN9LGEucHJvdG90eXBlLmRpc2FibGVTdWJzdGl0dXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN1YnN0aXR1dGVzRW5hYmxlZD0hMSx0aGlzfTt2YXIgZj17XCIhXCI6ITAsJ1wiJzohMCxcIiNcIjohMCwkOiEwLFwiJVwiOiEwLFwiJlwiOiEwLFwiJ1wiOiEwLFwiKFwiOiEwLFwiKVwiOiEwLFwiKlwiOiEwLFwiK1wiOiEwLFwiLFwiOiEwLFwiLlwiOiEwLFwiL1wiOiEwLFwiO1wiOiEwLFwiPFwiOiEwLFwiPVwiOiEwLFwiPlwiOiEwLFwiP1wiOiEwLFwiQFwiOiEwLFwiW1wiOiEwLFwiXFxcXFwiOiEwLFwiXVwiOiEwLFwiXlwiOiEwLFwiYFwiOiEwLFwie1wiOiEwLFwifFwiOiEwLFwifVwiOiEwLFwiflwiOiEwfSxnPXtcIlxcblwiOlwiXFxcXG5cIixcIlxcclwiOlwiXFxcXHJcIixcIlxcdFwiOlwiXFxcXHRcIixcIlxcZlwiOlwiXFxcXGZcIixcIlxcdlwiOlwiXFxcXHZcIn0saD17bjpcIlxcblwiLHI6XCJcXHJcIix0OlwiXFx0XCIsZjpcIlxcZlwiLFwiXFxcXFwiOlwiXFxcXFwiLFwiJ1wiOlwiJ1wifSxpPXtuOlwiXFxuXCIscjpcIlxcclwiLHQ6XCJcXHRcIixmOlwiXFxmXCIsXCJcXFxcXCI6XCJcXFxcXCIsJ1wiJzonXCInfTthLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGUoYSwwLHRoaXMucHNldWRvcyx0aGlzLmF0dHJFcXVhbGl0eU1vZHMsdGhpcy5ydWxlTmVzdGluZ09wZXJhdG9ycyx0aGlzLnN1YnN0aXR1dGVzRW5hYmxlZCkucGFyc2UoKX0sYS5wcm90b3R5cGUuZXNjYXBlSWRlbnRpZmllcj1mdW5jdGlvbihhKXtmb3IodmFyIGI9XCJcIixjPTAsZD1hLmxlbmd0aDtjPGQ7KXt2YXIgZT1hLmNoYXJBdChjKTtpZihmW2VdKWIrPVwiXFxcXFwiK2U7ZWxzZSBpZihcIl9cIj09PWV8fFwiLVwiPT09ZXx8ZT49XCJBXCImJmU8PVwiWlwifHxlPj1cImFcIiYmZTw9XCJ6XCJ8fDAhPT1jJiZlPj1cIjBcIiYmZTw9XCI5XCIpYis9ZTtlbHNle3ZhciBnPWUuY2hhckNvZGVBdCgwKTtpZig1NTI5Nj09KDYzNDg4JmcpKXt2YXIgaD1hLmNoYXJDb2RlQXQoYysrKTtpZig1NTI5NiE9KDY0NTEyJmcpfHw1NjMyMCE9KDY0NTEyJmgpKXRocm93IEVycm9yKFwiVUNTLTIoZGVjb2RlKTogaWxsZWdhbCBzZXF1ZW5jZVwiKTtnPSgoMTAyMyZnKTw8MTApKygxMDIzJmgpKzY1NTM2fWIrPVwiXFxcXFwiK2cudG9TdHJpbmcoMTYpK1wiIFwifWMrK31yZXR1cm4gYn0sYS5wcm90b3R5cGUuZXNjYXBlU3RyPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9XCJcIixlPTAsZj1hLmxlbmd0aDtlPGY7KWI9YS5jaGFyQXQoZSksJ1wiJz09PWI/Yj0nXFxcXFwiJzpcIlxcXFxcIj09PWI/Yj1cIlxcXFxcXFxcXCI6KGM9Z1tiXSkmJihiPWMpLGQrPWIsZSsrO3JldHVybidcIicrZCsnXCInfSxhLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3JlbmRlckVudGl0eShhKS50cmltKCl9LGEucHJvdG90eXBlLl9yZW5kZXJFbnRpdHk9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO3N3aXRjaChkPVwiXCIsYS50eXBlKXtjYXNlXCJydWxlU2V0XCI6Zm9yKGI9YS5ydWxlLGM9W107YjspYi5uZXN0aW5nT3BlcmF0b3ImJmMucHVzaChiLm5lc3RpbmdPcGVyYXRvciksYy5wdXNoKHRoaXMuX3JlbmRlckVudGl0eShiKSksYj1iLnJ1bGU7ZD1jLmpvaW4oXCIgXCIpO2JyZWFrO2Nhc2VcInNlbGVjdG9yc1wiOmQ9YS5zZWxlY3RvcnMubWFwKHRoaXMuX3JlbmRlckVudGl0eSx0aGlzKS5qb2luKFwiLCBcIik7YnJlYWs7Y2FzZVwicnVsZVwiOmEudGFnTmFtZSYmKGQ9XCIqXCI9PT1hLnRhZ05hbWU/XCIqXCI6dGhpcy5lc2NhcGVJZGVudGlmaWVyKGEudGFnTmFtZSkpLGEuaWQmJihkKz1cIiNcIit0aGlzLmVzY2FwZUlkZW50aWZpZXIoYS5pZCkpLGEuY2xhc3NOYW1lcyYmKGQrPWEuY2xhc3NOYW1lcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuXCIuXCIrdGhpcy5lc2NhcGVJZGVudGlmaWVyKGEpfSx0aGlzKS5qb2luKFwiXCIpKSxhLmF0dHJzJiYoZCs9YS5hdHRycy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmF0b3I/XCJzdWJzdGl0dXRlXCI9PT1hLnZhbHVlVHlwZT9cIltcIit0aGlzLmVzY2FwZUlkZW50aWZpZXIoYS5uYW1lKSthLm9wZXJhdG9yK1wiJFwiK2EudmFsdWUrXCJdXCI6XCJbXCIrdGhpcy5lc2NhcGVJZGVudGlmaWVyKGEubmFtZSkrYS5vcGVyYXRvcit0aGlzLmVzY2FwZVN0cihhLnZhbHVlKStcIl1cIjpcIltcIit0aGlzLmVzY2FwZUlkZW50aWZpZXIoYS5uYW1lKStcIl1cIn0sdGhpcykuam9pbihcIlwiKSksYS5wc2V1ZG9zJiYoZCs9YS5wc2V1ZG9zLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZVR5cGU/XCJzZWxlY3RvclwiPT09YS52YWx1ZVR5cGU/XCI6XCIrdGhpcy5lc2NhcGVJZGVudGlmaWVyKGEubmFtZSkrXCIoXCIrdGhpcy5fcmVuZGVyRW50aXR5KGEudmFsdWUpK1wiKVwiOlwic3Vic3RpdHV0ZVwiPT09YS52YWx1ZVR5cGU/XCI6XCIrdGhpcy5lc2NhcGVJZGVudGlmaWVyKGEubmFtZSkrXCIoJFwiK2EudmFsdWUrXCIpXCI6XCJudW1lcmljXCI9PT1hLnZhbHVlVHlwZT9cIjpcIit0aGlzLmVzY2FwZUlkZW50aWZpZXIoYS5uYW1lKStcIihcIithLnZhbHVlK1wiKVwiOlwiOlwiK3RoaXMuZXNjYXBlSWRlbnRpZmllcihhLm5hbWUpK1wiKFwiK3RoaXMuZXNjYXBlSWRlbnRpZmllcihhLnZhbHVlKStcIilcIjpcIjpcIit0aGlzLmVzY2FwZUlkZW50aWZpZXIoYS5uYW1lKX0sdGhpcykuam9pbihcIlwiKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcignVW5rbm93biBlbnRpdHkgdHlwZTogXCInK2EudHlwZShOYU4pKX1yZXR1cm4gZH07dmFyIGo9bmV3IGE7ai5yZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMoXCI+XCIpLGF4ZS51dGlscy5jc3NQYXJzZXI9an0oYXhlKSxMLnByb3RvdHlwZT17Z2V0IHNlbGVjdG9yKCl7cmV0dXJuIHRoaXMuc3BlYy5zZWxlY3Rvcnx8W2F4ZS51dGlscy5nZXRTZWxlY3Rvcih0aGlzLmVsZW1lbnQsdGhpcy5fb3B0aW9ucyldfSxnZXQgeHBhdGgoKXtyZXR1cm4gdGhpcy5zcGVjLnhwYXRofHxbYXhlLnV0aWxzLmdldFhwYXRoKHRoaXMuZWxlbWVudCldfSxnZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9lbGVtZW50fSxnZXQgZnJvbUZyYW1lKCl7cmV0dXJuIHRoaXMuX2Zyb21GcmFtZX0sdG9KU09OOmZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJue3NlbGVjdG9yOnRoaXMuc2VsZWN0b3Isc291cmNlOnRoaXMuc291cmNlLHhwYXRoOnRoaXMueHBhdGh9fX0sTC5mcm9tRnJhbWU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnNlbGVjdG9yLnVuc2hpZnQoYy5zZWxlY3RvciksYS54cGF0aC51bnNoaWZ0KGMueHBhdGgpLG5ldyBheGUudXRpbHMuRHFFbGVtZW50KGMuZWxlbWVudCxiLGEpfSxheGUudXRpbHMuRHFFbGVtZW50PUwsYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGEoYSl7dmFyIGIsYyxkPWEuRWxlbWVudC5wcm90b3R5cGUsZT1bXCJtYXRjaGVzXCIsXCJtYXRjaGVzU2VsZWN0b3JcIixcIm1vek1hdGNoZXNTZWxlY3RvclwiLFwid2Via2l0TWF0Y2hlc1NlbGVjdG9yXCIsXCJtc01hdGNoZXNTZWxlY3RvclwiXSxmPWUubGVuZ3RoO2ZvcihiPTA7YjxmO2IrKylpZihjPWVbYl0sZFtjXSlyZXR1cm4gY312YXIgYjtyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gYiYmY1tiXXx8KGI9YShjLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpKSxjW2JdKGQpfX0oKSxheGUudXRpbHMuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7Zm9yKHZhciBiLGM9U3RyaW5nKGEpLGQ9Yy5sZW5ndGgsZT0tMSxmPVwiXCIsZz1jLmNoYXJDb2RlQXQoMCk7KytlPGQ7KXtpZigwPT0oYj1jLmNoYXJDb2RlQXQoZSkpKXRocm93IG5ldyBFcnJvcihcIklOVkFMSURfQ0hBUkFDVEVSX0VSUlwiKTtiPj0xJiZiPD0zMXx8Yj49MTI3JiZiPD0xNTl8fDA9PWUmJmI+PTQ4JiZiPD01N3x8MT09ZSYmYj49NDgmJmI8PTU3JiY0NT09Zz9mKz1cIlxcXFxcIitiLnRvU3RyaW5nKDE2KStcIiBcIjpmKz0oMSE9ZXx8NDUhPWJ8fDQ1IT1nKSYmKGI+PTEyOHx8NDU9PWJ8fDk1PT1ifHxiPj00OCYmYjw9NTd8fGI+PTY1JiZiPD05MHx8Yj49OTcmJmI8PTEyMik/Yy5jaGFyQXQoZSk6XCJcXFxcXCIrYy5jaGFyQXQoZSl9cmV0dXJuIGZ9LGF4ZS51dGlscy5leHRlbmRNZXRhRGF0YT1mdW5jdGlvbihhLGIpe09iamVjdC5hc3NpZ24oYSxiKSxPYmplY3Qua2V5cyhiKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgYlthXX0pLmZvckVhY2goZnVuY3Rpb24oYyl7YVtjXT1udWxsO3RyeXthW2NdPWJbY10oYSl9Y2F0Y2goYSl7fX0pfSxheGUudXRpbHMuZmluYWxpemVSdWxlUmVzdWx0PWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QuYXNzaWduKGEsYXhlLnV0aWxzLmFnZ3JlZ2F0ZU5vZGVSZXN1bHRzKGEubm9kZXMpKSxkZWxldGUgYS5ub2RlcyxhfTt2YXIgemE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX07YXhlLnV0aWxzLmZpbmRCeT1mdW5jdGlvbihhLGIsYyl7aWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gYS5maW5kKGZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT0odm9pZCAwPT09YT9cInVuZGVmaW5lZFwiOnphKGEpKSYmYVtiXT09PWN9KX07dmFyIGF4ZT1heGV8fHt1dGlsczp7fX07YXhlLnV0aWxzLmdldEZsYXR0ZW5lZFRyZWU9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYyl7dmFyIGQ9YXhlLnV0aWxzLmdldEZsYXR0ZW5lZFRyZWUoYyxiKTtyZXR1cm4gZCYmKGE9YS5jb25jYXQoZCkpLGF9dmFyIGQsZSxmO2lmKGEuZG9jdW1lbnRFbGVtZW50JiYoYT1hLmRvY3VtZW50RWxlbWVudCksZj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYXhlLnV0aWxzLmlzU2hhZG93Um9vdChhKSlyZXR1cm4gZD1NKGEsYiksYj1cImFcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLGU9QXJyYXkuZnJvbShhLnNoYWRvd1Jvb3QuY2hpbGROb2RlcyksZC5jaGlsZHJlbj1lLnJlZHVjZShjLFtdKSxbZF07aWYoXCJjb250ZW50XCI9PT1mKXJldHVybiBlPUFycmF5LmZyb20oYS5nZXREaXN0cmlidXRlZE5vZGVzKCkpLGUucmVkdWNlKGMsW10pO2lmKFwic2xvdFwiPT09Zil7ZT1BcnJheS5mcm9tKGEuYXNzaWduZWROb2RlcygpKSxlLmxlbmd0aHx8KGU9TihhKSk7d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSk7cmV0dXJuIGUucmVkdWNlKGMsW10pfXJldHVybiAxPT09YS5ub2RlVHlwZT8oZD1NKGEsYiksZT1BcnJheS5mcm9tKGEuY2hpbGROb2RlcyksZC5jaGlsZHJlbj1lLnJlZHVjZShjLFtdKSxbZF0pOjM9PT1hLm5vZGVUeXBlP1tNKGEpXTp2b2lkIDB9LGF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gYS5hY3R1YWxOb2RlPT09Yj9hOihhLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGQ7YS5hY3R1YWxOb2RlPT09Yj9jPWE6KGQ9YXhlLnV0aWxzLmdldE5vZGVGcm9tVHJlZShhLGIpKSYmKGM9ZCl9KSxjKX0sYXhlLnV0aWxzLmdldEFsbENoZWNrcz1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm5bXS5jb25jYXQoYS5hbnl8fFtdKS5jb25jYXQoYS5hbGx8fFtdKS5jb25jYXQoYS5ub25lfHxbXSl9LGF4ZS51dGlscy5nZXRDaGVja09wdGlvbj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9KChjLnJ1bGVzJiZjLnJ1bGVzW2JdfHx7fSkuY2hlY2tzfHx7fSlbYS5pZF0sZT0oYy5jaGVja3N8fHt9KVthLmlkXSxmPWEuZW5hYmxlZCxnPWEub3B0aW9ucztyZXR1cm4gZSYmKGUuaGFzT3duUHJvcGVydHkoXCJlbmFibGVkXCIpJiYoZj1lLmVuYWJsZWQpLGUuaGFzT3duUHJvcGVydHkoXCJvcHRpb25zXCIpJiYoZz1lLm9wdGlvbnMpKSxkJiYoZC5oYXNPd25Qcm9wZXJ0eShcImVuYWJsZWRcIikmJihmPWQuZW5hYmxlZCksZC5oYXNPd25Qcm9wZXJ0eShcIm9wdGlvbnNcIikmJihnPWQub3B0aW9ucykpLHtlbmFibGVkOmYsb3B0aW9uczpnLGFic29sdXRlUGF0aHM6Yy5hYnNvbHV0ZVBhdGhzfX07dmFyIEthPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPVtdLGQ9ITAsZT0hMSxmPXZvaWQgMDt0cnl7Zm9yKHZhciBnLGg9YVtTeW1ib2wuaXRlcmF0b3JdKCk7IShkPShnPWgubmV4dCgpKS5kb25lKSYmKGMucHVzaChnLnZhbHVlKSwhYnx8Yy5sZW5ndGghPT1iKTtkPSEwKTt9Y2F0Y2goYSl7ZT0hMCxmPWF9ZmluYWxseXt0cnl7IWQmJmgucmV0dXJuJiZoLnJldHVybigpfWZpbmFsbHl7aWYoZSl0aHJvdyBmfX1yZXR1cm4gY31yZXR1cm4gZnVuY3Rpb24oYixjKXtpZihBcnJheS5pc0FycmF5KGIpKXJldHVybiBiO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYikpcmV0dXJuIGEoYixjKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKX19KCk7YXhlLnV0aWxzLmdldEZyaWVuZGx5VXJpRW5kPWZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOlwiXCIsYj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIShhLmxlbmd0aDw9MXx8XCJkYXRhOlwiPT09YS5zdWJzdHIoMCw1KXx8XCJqYXZhc2NyaXB0OlwiPT09YS5zdWJzdHIoMCwxMSl8fGEuaW5jbHVkZXMoXCI/XCIpKSl7dmFyIGM9Yi5jdXJyZW50RG9tYWluLGQ9Yi5tYXhMZW5ndGgsZT12b2lkIDA9PT1kPzI1OmQsZj1RKGEpLGc9Zi5wYXRoLGg9Zi5kb21haW4saT1mLmhhc2gsaj1nLnN1YnN0cihnLnN1YnN0cigwLGcubGVuZ3RoLTIpLmxhc3RJbmRleE9mKFwiL1wiKSsxKTtpZihpKXJldHVybiBqJiYoaitpKS5sZW5ndGg8PWU/aitpOmoubGVuZ3RoPDImJmkubGVuZ3RoPjImJmkubGVuZ3RoPD1lP2k6dm9pZCAwO2lmKGgmJmgubGVuZ3RoPGUmJmcubGVuZ3RoPD0xKXJldHVybiBoK2c7aWYoZz09PVwiL1wiK2omJmgmJmMmJmghPT1jJiYoaCtnKS5sZW5ndGg8PWUpcmV0dXJuIGgrZzt2YXIgaz1qLmxhc3RJbmRleE9mKFwiLlwiKTtyZXR1cm4oLTE9PT1rfHxrPjEpJiYoLTEhPT1rfHxqLmxlbmd0aD4yKSYmai5sZW5ndGg8PWUmJiFqLm1hdGNoKC9pbmRleChcXC5bYS16QS1aXXsyLTR9KT8vKSYmIU8oaik/ajp2b2lkIDB9fTt2YXIgTGE9YXhlLnV0aWxzLmVzY2FwZVNlbGVjdG9yLE1hPXZvaWQgMCxOYT1bXCJjbGFzc1wiLFwic3R5bGVcIixcImlkXCIsXCJzZWxlY3RlZFwiLFwiY2hlY2tlZFwiLFwiZGlzYWJsZWRcIixcInRhYmluZGV4XCIsXCJhcmlhLWNoZWNrZWRcIixcImFyaWEtc2VsZWN0ZWRcIixcImFyaWEtaW52YWxpZFwiLFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLWJ1c3lcIixcImFyaWEtZGlzYWJsZWRcIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtZ3JhYmJlZFwiLFwiYXJpYS1wcmVzc2VkXCIsXCJhcmlhLXZhbHVlbm93XCJdLE9hPTMxO2F4ZS51dGlscy5nZXRTZWxlY3RvckRhdGE9ZnVuY3Rpb24oYSl7dmFyIGI9e2NsYXNzZXM6e30sdGFnczp7fSxhdHRyaWJ1dGVzOnt9fTthPUFycmF5LmlzQXJyYXkoYSk/YTpbYV07Zm9yKHZhciBjPWEuc2xpY2UoKSxkPVtdO2MubGVuZ3RoOykhZnVuY3Rpb24oKXt2YXIgYT1jLnBvcCgpLGU9YS5hY3R1YWxOb2RlO2lmKGUucXVlcnlTZWxlY3RvckFsbCl7dmFyIGY9ZS5ub2RlTmFtZTtiLnRhZ3NbZl0/Yi50YWdzW2ZdKys6Yi50YWdzW2ZdPTEsZS5jbGFzc0xpc3QmJkFycmF5LmZyb20oZS5jbGFzc0xpc3QpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9TGEoYSk7Yi5jbGFzc2VzW2NdP2IuY2xhc3Nlc1tjXSsrOmIuY2xhc3Nlc1tjXT0xfSksZS5hdHRyaWJ1dGVzJiZBcnJheS5mcm9tKGUuYXR0cmlidXRlcykuZmlsdGVyKFQpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9UihlLGEpO2MmJihiLmF0dHJpYnV0ZXNbY10/Yi5hdHRyaWJ1dGVzW2NdKys6Yi5hdHRyaWJ1dGVzW2NdPTEpfSl9Zm9yKGEuY2hpbGRyZW4ubGVuZ3RoJiYoZC5wdXNoKGMpLGM9YS5jaGlsZHJlbi5zbGljZSgpKTshYy5sZW5ndGgmJmQubGVuZ3RoOyljPWQucG9wKCl9KCk7cmV0dXJuIGJ9LGF4ZS51dGlscy5nZXRTZWxlY3Rvcj1mdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIWEpcmV0dXJuXCJcIjt2YXIgYz1hLmdldFJvb3ROb2RlJiZhLmdldFJvb3ROb2RlKCl8fGRvY3VtZW50O2lmKDExPT09Yy5ub2RlVHlwZSl7Zm9yKHZhciBkPVtdOzExPT09Yy5ub2RlVHlwZTspZC5wdXNoKHtlbG06YSxkb2M6Y30pLGE9Yy5ob3N0LGM9YS5nZXRSb290Tm9kZSgpO3JldHVybiBkLnB1c2goe2VsbTphLGRvYzpjfSksZC5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiAkKGEuZWxtLGIsYS5kb2MpfSl9cmV0dXJuICQoYSxiLGMpfSxheGUudXRpbHMuZ2V0WHBhdGg9ZnVuY3Rpb24oYSl7cmV0dXJuIGFhKF8oYSkpfTt2YXIgUGE7YXhlLnV0aWxzLmluamVjdFN0eWxlPWJhLGF4ZS51dGlscy5pc0hpZGRlbj1mdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjO2lmKDk9PT1hLm5vZGVUeXBlKXJldHVybiExOzExPT09YS5ub2RlVHlwZSYmKGE9YS5ob3N0KTt2YXIgZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpO3JldHVybiFkfHwhYS5wYXJlbnROb2RlfHxcIm5vbmVcIj09PWQuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIil8fCFiJiZcImhpZGRlblwiPT09ZC5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJpbGl0eVwiKXx8XCJ0cnVlXCI9PT1hLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpfHwoYz1hLmFzc2lnbmVkU2xvdD9hLmFzc2lnbmVkU2xvdDphLnBhcmVudE5vZGUsYXhlLnV0aWxzLmlzSGlkZGVuKGMsITApKX07dmFyIFFhPVtcImFydGljbGVcIixcImFzaWRlXCIsXCJibG9ja3F1b3RlXCIsXCJib2R5XCIsXCJkaXZcIixcImZvb3RlclwiLFwiaDFcIixcImgyXCIsXCJoM1wiLFwiaDRcIixcImg1XCIsXCJoNlwiLFwiaGVhZGVyXCIsXCJtYWluXCIsXCJuYXZcIixcInBcIixcInNlY3Rpb25cIixcInNwYW5cIl07YXhlLnV0aWxzLmlzU2hhZG93Um9vdD1mdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuISghYS5zaGFkb3dSb290fHwhL15bYS16XVthLXowLTlfLi1dKi1bYS16MC05Xy4tXSokLy50ZXN0KGIpJiYhUWEuaW5jbHVkZXMoYikpfSxheGUudXRpbHMuaXNYSFRNTD1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4hIWEuY3JlYXRlRWxlbWVudCYmXCJBXCI9PT1hLmNyZWF0ZUVsZW1lbnQoXCJBXCIpLmxvY2FsTmFtZX0sYXhlLnV0aWxzLm1lcmdlUmVzdWx0cz1mdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjPVtdO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGQ9ZWEoYSk7ZCYmZC5sZW5ndGgmJmQuZm9yRWFjaChmdW5jdGlvbihkKXtkLm5vZGVzJiZhLmZyYW1lJiZjYShkLm5vZGVzLGIsYS5mcmFtZUVsZW1lbnQsYS5mcmFtZSk7dmFyIGU9YXhlLnV0aWxzLmZpbmRCeShjLFwiaWRcIixkLmlkKTtlP2Qubm9kZXMubGVuZ3RoJiZkYShlLm5vZGVzLGQubm9kZXMpOmMucHVzaChkKX0pfSksY30sYXhlLnV0aWxzLm5vZGVTb3J0ZXI9ZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gYS5hY3R1YWxOb2RlPT09Yi5hY3R1YWxOb2RlPzA6NCZhLmFjdHVhbE5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYi5hY3R1YWxOb2RlKT8tMToxfSx1dGlscy5wZXJmb3JtYW5jZVRpbWVyPWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYSgpe2lmKHdpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlKXJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCl9dmFyIGI9bnVsbCxjPWEoKTtyZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLm1hcmsoXCJtYXJrX2F4ZV9zdGFydFwiKX0sZW5kOmZ1bmN0aW9uKCl7dGhpcy5tYXJrKFwibWFya19heGVfZW5kXCIpLHRoaXMubWVhc3VyZShcImF4ZVwiLFwibWFya19heGVfc3RhcnRcIixcIm1hcmtfYXhlX2VuZFwiKSx0aGlzLmxvZ01lYXN1cmVzKFwiYXhlXCIpfSxhdWRpdFN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5tYXJrKFwibWFya19hdWRpdF9zdGFydFwiKX0sYXVkaXRFbmQ6ZnVuY3Rpb24oKXt0aGlzLm1hcmsoXCJtYXJrX2F1ZGl0X2VuZFwiKSx0aGlzLm1lYXN1cmUoXCJhdWRpdF9zdGFydF90b19lbmRcIixcIm1hcmtfYXVkaXRfc3RhcnRcIixcIm1hcmtfYXVkaXRfZW5kXCIpLHRoaXMubG9nTWVhc3VyZXMoKX0sbWFyazpmdW5jdGlvbihhKXt3aW5kb3cucGVyZm9ybWFuY2UmJnZvaWQgMCE9PXdpbmRvdy5wZXJmb3JtYW5jZS5tYXJrJiZ3aW5kb3cucGVyZm9ybWFuY2UubWFyayhhKX0sbWVhc3VyZTpmdW5jdGlvbihhLGIsYyl7d2luZG93LnBlcmZvcm1hbmNlJiZ2b2lkIDAhPT13aW5kb3cucGVyZm9ybWFuY2UubWVhc3VyZSYmd2luZG93LnBlcmZvcm1hbmNlLm1lYXN1cmUoYSxiLGMpfSxsb2dNZWFzdXJlczpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2F4ZS5sb2coXCJNZWFzdXJlIFwiK2EubmFtZStcIiB0b29rIFwiK2EuZHVyYXRpb24rXCJtc1wiKX1pZih3aW5kb3cucGVyZm9ybWFuY2UmJnZvaWQgMCE9PXdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKWZvcih2YXIgYz13aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm1lYXN1cmVcIiksZD0wO2Q8Yy5sZW5ndGg7KytkKXt2YXIgZT1jW2RdO2lmKGUubmFtZT09PWEpcmV0dXJuIHZvaWQgYihlKTtiKGUpfX0sdGltZUVsYXBzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLWN9LHJlc2V0OmZ1bmN0aW9uKCl7Ynx8KGI9YSgpKSxjPWEoKX19fSgpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24mJmZ1bmN0aW9uKCl7T2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtpZih2b2lkIDA9PT1hfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0XCIpO2Zvcih2YXIgYj1PYmplY3QoYSksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBkPWFyZ3VtZW50c1tjXTtpZih2b2lkIDAhPT1kJiZudWxsIT09ZClmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiYoYltlXT1kW2VdKX1yZXR1cm4gYn19KCksQXJyYXkucHJvdG90eXBlLmZpbmR8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsXCJmaW5kXCIse3ZhbHVlOmZ1bmN0aW9uKGEpe2lmKG51bGw9PT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWRcIik7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKFwicHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtmb3IodmFyIGIsYz1PYmplY3QodGhpcyksZD1jLmxlbmd0aD4+PjAsZT1hcmd1bWVudHNbMV0sZj0wO2Y8ZDtmKyspaWYoYj1jW2ZdLGEuY2FsbChlLGIsZixjKSlyZXR1cm4gYn19KSxheGUudXRpbHMucG9sbHlmaWxsRWxlbWVudHNGcm9tUG9pbnQ9ZnVuY3Rpb24oKXtpZihkb2N1bWVudC5lbGVtZW50c0Zyb21Qb2ludClyZXR1cm4gZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQ7aWYoZG9jdW1lbnQubXNFbGVtZW50c0Zyb21Qb2ludClyZXR1cm4gZG9jdW1lbnQubXNFbGVtZW50c0Zyb21Qb2ludDt2YXIgYT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ4XCIpO3JldHVybiBhLnN0eWxlLmNzc1RleHQ9XCJwb2ludGVyLWV2ZW50czphdXRvXCIsXCJhdXRvXCI9PT1hLnN0eWxlLnBvaW50ZXJFdmVudHN9KCksYj1hP1wicG9pbnRlci1ldmVudHNcIjpcInZpc2liaWxpdHlcIixjPWE/XCJub25lXCI6XCJoaWRkZW5cIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtyZXR1cm4gZC5pbm5lckhUTUw9YT9cIiogeyBwb2ludGVyLWV2ZW50czogYWxsIH1cIjpcIiogeyB2aXNpYmlsaXR5OiB2aXNpYmxlIH1cIixmdW5jdGlvbihhLGUpe3ZhciBmLGcsaCxpPVtdLGo9W107Zm9yKGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZCk7KGY9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChhLGUpKSYmLTE9PT1pLmluZGV4T2YoZik7KWkucHVzaChmKSxqLnB1c2goe3ZhbHVlOmYuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShiKSxwcmlvcml0eTpmLnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoYil9KSxmLnN0eWxlLnNldFByb3BlcnR5KGIsYyxcImltcG9ydGFudFwiKTtmb3IoaS5pbmRleE9mKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk8aS5sZW5ndGgtMSYmKGkuc3BsaWNlKGkuaW5kZXhPZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLDEpLGkucHVzaChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKSxnPWoubGVuZ3RoO2g9alstLWddOylpW2ddLnN0eWxlLnNldFByb3BlcnR5KGIsaC52YWx1ZT9oLnZhbHVlOlwiXCIsaC5wcmlvcml0eSk7cmV0dXJuIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZCksaX19LFwiZnVuY3Rpb25cIj09dHlwZW9mIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyJiYoZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQ9YXhlLnV0aWxzLnBvbGx5ZmlsbEVsZW1lbnRzRnJvbVBvaW50KCkpLEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc3x8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxcImluY2x1ZGVzXCIse3ZhbHVlOmZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPU9iamVjdCh0aGlzKSxjPXBhcnNlSW50KGIubGVuZ3RoLDEwKXx8MDtpZigwPT09YylyZXR1cm4hMTt2YXIgZCxlPXBhcnNlSW50KGFyZ3VtZW50c1sxXSwxMCl8fDA7ZT49MD9kPWU6KGQ9YytlKTwwJiYoZD0wKTtmb3IodmFyIGY7ZDxjOyl7aWYoZj1iW2RdLGE9PT1mfHxhIT09YSYmZiE9PWYpcmV0dXJuITA7ZCsrfXJldHVybiExfX0pLEFycmF5LnByb3RvdHlwZS5zb21lfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLFwic29tZVwiLHt2YWx1ZTpmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheS5wcm90b3R5cGUuc29tZSBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWRcIik7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgYj1PYmplY3QodGhpcyksYz1iLmxlbmd0aD4+PjAsZD1hcmd1bWVudHMubGVuZ3RoPj0yP2FyZ3VtZW50c1sxXTp2b2lkIDAsZT0wO2U8YztlKyspaWYoZSBpbiBiJiZhLmNhbGwoZCxiW2VdLGUsYikpcmV0dXJuITA7cmV0dXJuITF9fSksQXJyYXkuZnJvbXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LFwiZnJvbVwiLHt2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYj1mdW5jdGlvbihiKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBifHxcIltvYmplY3QgRnVuY3Rpb25dXCI9PT1hLmNhbGwoYil9LGM9ZnVuY3Rpb24oYSl7dmFyIGI9TnVtYmVyKGEpO3JldHVybiBpc05hTihiKT8wOjAhPT1iJiZpc0Zpbml0ZShiKT8oYj4wPzE6LTEpKk1hdGguZmxvb3IoTWF0aC5hYnMoYikpOmJ9LGQ9TWF0aC5wb3coMiw1MyktMSxlPWZ1bmN0aW9uKGEpe3ZhciBiPWMoYSk7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGIsMCksZCl9O3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9T2JqZWN0KGEpO2lmKG51bGw9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5LmZyb20gcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgLSBub3QgbnVsbCBvciB1bmRlZmluZWRcIik7dmFyIGYsZz1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZih2b2lkIDAhPT1nKXtpZighYihnKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb25cIik7YXJndW1lbnRzLmxlbmd0aD4yJiYoZj1hcmd1bWVudHNbMl0pfWZvcih2YXIgaCxpPWUoZC5sZW5ndGgpLGo9YihjKT9PYmplY3QobmV3IGMoaSkpOm5ldyBBcnJheShpKSxrPTA7azxpOyloPWRba10saltrXT1nP3ZvaWQgMD09PWY/ZyhoLGspOmcuY2FsbChmLGgsayk6aCxrKz0xO3JldHVybiBqLmxlbmd0aD1pLGp9fSgpfSksU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc3x8KFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm5cIm51bWJlclwiIT10eXBlb2YgYiYmKGI9MCksIShiK2EubGVuZ3RoPnRoaXMubGVuZ3RoKSYmLTEhPT10aGlzLmluZGV4T2YoYSxiKX0pO3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfTtheGUudXRpbHMucHVibGlzaE1ldGFEYXRhPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPWF4ZS5fYXVkaXQuZGF0YS5jaGVja3N8fHt9LGM9YXhlLl9hdWRpdC5kYXRhLnJ1bGVzfHx7fSxkPWF4ZS51dGlscy5maW5kQnkoYXhlLl9hdWRpdC5ydWxlcyxcImlkXCIsYS5pZCl8fHt9O2EudGFncz1heGUudXRpbHMuY2xvbmUoZC50YWdzfHxbXSk7dmFyIGU9Z2EoYiwhMCksZj1nYShiLCExKTthLm5vZGVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5hbnkuZm9yRWFjaChlKSxhLmFsbC5mb3JFYWNoKGUpLGEubm9uZS5mb3JFYWNoKGYpfSksYXhlLnV0aWxzLmV4dGVuZE1ldGFEYXRhKGEsYXhlLnV0aWxzLmNsb25lKGNbYS5pZF18fHt9KSl9O3ZhciBSYT1mdW5jdGlvbigpe30sU2E9ZnVuY3Rpb24oKXt9LFRhPWZ1bmN0aW9uKCl7LyohIENyZWRpdDogWFJlZ0V4cCAwLjYuMSAoYykgMjAwNy0yMDA4IFN0ZXZlbiBMZXZpdGhhbiA8aHR0cDovL3N0ZXZlbmxldml0aGFuLmNvbS9yZWdleC94cmVnZXhwLz4gTUlUIExpY2Vuc2UgKi9cbnZhciBhPS8oPz1bXFwtXFxbXFxde30oKSorPy5cXFxcXFxeJHwsI1xcc10pL2c7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLnJlcGxhY2UoYSxcIlxcXFxcIil9fSgpLFVhPS9cXFxcL2c7UmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPWEucnVsZTtjOyliLnB1c2goe3RhZzpjLnRhZ05hbWU/Yy50YWdOYW1lLnRvTG93ZXJDYXNlKCk6XCIqXCIsY29tYmluYXRvcjpjLm5lc3RpbmdPcGVyYXRvcj9jLm5lc3RpbmdPcGVyYXRvcjpcIiBcIixpZDpjLmlkLGF0dHJpYnV0ZXM6bWEoYy5hdHRycyksY2xhc3NlczpuYShjLmNsYXNzTmFtZXMpLHBzZXVkb3M6b2EoYy5wc2V1ZG9zKX0pLGM9Yy5ydWxlO3JldHVybiBifSl9LFNhPWZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZT1bXSxmPUFycmF5LmlzQXJyYXkoYSk/YTpbYV0sZz1wYShmLGIsW10sYVswXS5zaGFkb3dJZCksaD1bXTtnLm5vZGVzLmxlbmd0aDspe2Zvcih2YXIgaT1nLm5vZGVzLnBvcCgpLGo9W10saz1bXSxsPWcuYW55TGV2ZWwuc2xpY2UoKS5jb25jYXQoZy50aGlzTGV2ZWwpLG09ITEsbj0wO248bC5sZW5ndGg7bisrKXt2YXIgbz1sW25dO2lmKHFhKGksbykmJighb1swXS5pZHx8aS5zaGFkb3dJZD09PWcucGFyZW50U2hhZG93SWQpKWlmKDE9PT1vLmxlbmd0aCltfHxkJiYhZChpKXx8KGgucHVzaChpKSxtPSEwKTtlbHNle3ZhciBwPW8uc2xpY2UoMSk7aWYoITE9PT1bXCIgXCIsXCI+XCJdLmluY2x1ZGVzKHBbMF0uY29tYmluYXRvcikpdGhyb3cgbmV3IEVycm9yKFwiYXhlLnV0aWxzLnF1ZXJ5U2VsZWN0b3JBbGwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29tYmluYXRvcjogXCIrb1sxXS5jb21iaW5hdG9yKTtcIj5cIj09PXBbMF0uY29tYmluYXRvcj9qLnB1c2gocCk6ay5wdXNoKHApfSFnLmFueUxldmVsLmluY2x1ZGVzKG8pfHxvWzBdLmlkJiZpLnNoYWRvd0lkIT09Zy5wYXJlbnRTaGFkb3dJZHx8ay5wdXNoKG8pfWZvcihpLmNoaWxkcmVuJiZpLmNoaWxkcmVuLmxlbmd0aCYmYyYmKGUucHVzaChnKSxnPXBhKGkuY2hpbGRyZW4sayxqLGkuc2hhZG93SWQpKTshZy5ub2Rlcy5sZW5ndGgmJmUubGVuZ3RoOylnPWUucG9wKCl9cmV0dXJuIGh9LGF4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsRmlsdGVyKGEsYil9LGF4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsRmlsdGVyPWZ1bmN0aW9uKGEsYixjKXthPUFycmF5LmlzQXJyYXkoYSk/YTpbYV07dmFyIGQ9YXhlLnV0aWxzLmNzc1BhcnNlci5wYXJzZShiKTtyZXR1cm4gZD1kLnNlbGVjdG9ycz9kLnNlbGVjdG9yczpbZF0sZD1SYShkKSxTYShhLGQsITAsYyl9O3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfTshZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBhKCl7fWZ1bmN0aW9uIGIoYSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUXVldWUgbWV0aG9kcyByZXF1aXJlIGZ1bmN0aW9ucyBhcyBhcmd1bWVudHNcIil9ZnVuY3Rpb24gYygpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2dbYl09YywoaS09MSl8fGo9PT1hfHwoaz0hMCxqKGcpKX19ZnVuY3Rpb24gZChiKXtyZXR1cm4gaj1hLG0oYiksZ31mdW5jdGlvbiBlKCl7Zm9yKHZhciBhPWcubGVuZ3RoO2g8YTtoKyspe3ZhciBiPWdbaF07dHJ5e2IuY2FsbChudWxsLGMoaCksZCl9Y2F0Y2goYSl7ZChhKX19fXZhciBmLGc9W10saD0wLGk9MCxqPWEsaz0hMSxsPWZ1bmN0aW9uKGEpe2Y9YSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dm9pZCAwIT09ZiYmbnVsbCE9PWYmJmF4ZS5sb2coXCJVbmNhdWdodCBlcnJvciAob2YgcXVldWUpXCIsZil9LDEpfSxtPWwsbj17ZGVmZXI6ZnVuY3Rpb24oYSl7aWYoXCJvYmplY3RcIj09PSh2b2lkIDA9PT1hP1widW5kZWZpbmVkXCI6emEoYSkpJiZhLnRoZW4mJmEuY2F0Y2gpe3ZhciBjPWE7YT1mdW5jdGlvbihhLGIpe2MudGhlbihhKS5jYXRjaChiKX19aWYoYihhKSx2b2lkIDA9PT1mKXtpZihrKXRocm93IG5ldyBFcnJvcihcIlF1ZXVlIGFscmVhZHkgY29tcGxldGVkXCIpO3JldHVybiBnLnB1c2goYSksKytpLGUoKSxufX0sdGhlbjpmdW5jdGlvbihjKXtpZihiKGMpLGohPT1hKXRocm93IG5ldyBFcnJvcihcInF1ZXVlIGB0aGVuYCBhbHJlYWR5IHNldFwiKTtyZXR1cm4gZnx8KGo9YyxpfHwoaz0hMCxqKGcpKSksbn0sY2F0Y2g6ZnVuY3Rpb24oYSl7aWYoYihhKSxtIT09bCl0aHJvdyBuZXcgRXJyb3IoXCJxdWV1ZSBgY2F0Y2hgIGFscmVhZHkgc2V0XCIpO3JldHVybiBmPyhhKGYpLGY9bnVsbCk6bT1hLG59LGFib3J0OmR9O3JldHVybiBufWF4ZS51dGlscy5xdWV1ZT1jfSgpO3ZhciB6YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfTshZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYigpe3ZhciBhPVwiYXhlXCIsYj1cIlwiO3JldHVybiB2b2lkIDAhPT1heGUmJmF4ZS5fYXVkaXQmJiFheGUuX2F1ZGl0LmFwcGxpY2F0aW9uJiYoYT1heGUuX2F1ZGl0LmFwcGxpY2F0aW9uKSx2b2lkIDAhPT1heGUmJihiPWF4ZS52ZXJzaW9uKSxhK1wiLlwiK2J9ZnVuY3Rpb24gYyhhKXtpZihcIm9iamVjdFwiPT09KHZvaWQgMD09PWE/XCJ1bmRlZmluZWRcIjp6YShhKSkmJlwic3RyaW5nXCI9PXR5cGVvZiBhLnV1aWQmJiEwPT09YS5fcmVzcG9uZGFibGUpe3ZhciBjPWIoKTtyZXR1cm4gYS5fc291cmNlPT09Y3x8XCJheGUueC55LnpcIj09PWEuX3NvdXJjZXx8XCJheGUueC55LnpcIj09PWN9cmV0dXJuITF9ZnVuY3Rpb24gZChhLGMsZCxlLGYsZyl7dmFyIGg7ZCBpbnN0YW5jZW9mIEVycm9yJiYoaD17bmFtZTpkLm5hbWUsbWVzc2FnZTpkLm1lc3NhZ2Usc3RhY2s6ZC5zdGFja30sZD12b2lkIDApO3ZhciBpPXt1dWlkOmUsdG9waWM6YyxtZXNzYWdlOmQsZXJyb3I6aCxfcmVzcG9uZGFibGU6ITAsX3NvdXJjZTpiKCksX2tlZXBhbGl2ZTpmfTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBnJiYoaltlXT1nKSxhLnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpLFwiKlwiKX1mdW5jdGlvbiBlKGEsYixjLGUsZil7ZChhLGIsYyxWYS52MSgpLGUsZil9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUsZixnKXtkKGEsYixlLGMsZixnKX19ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGQ9Yi50b3BpYyxlPWtbZF07aWYoZSl7dmFyIGc9ZihhLG51bGwsYi51dWlkKTtlKGIubWVzc2FnZSxjLGcpfX1mdW5jdGlvbiBoKGEpe3ZhciBiPWEubWVzc2FnZXx8XCJVbmtub3duIGVycm9yIG9jY3VycmVkXCIsYz1sLmluY2x1ZGVzKGEubmFtZSk/YS5uYW1lOlwiRXJyb3JcIixkPXdpbmRvd1tjXXx8RXJyb3I7cmV0dXJuIGEuc3RhY2smJihiKz1cIlxcblwiK2Euc3RhY2sucmVwbGFjZShhLm1lc3NhZ2UsXCJcIikpLG5ldyBkKGIpfWZ1bmN0aW9uIGkoYSl7dmFyIGI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpe3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYSl7fWlmKGMoYikpcmV0dXJuXCJvYmplY3RcIj09PXphKGIuZXJyb3IpP2IuZXJyb3I9aChiLmVycm9yKTpiLmVycm9yPXZvaWQgMCxifX12YXIgaj17fSxrPXt9LGw9T2JqZWN0LmZyZWV6ZShbXCJFdmFsRXJyb3JcIixcIlJhbmdlRXJyb3JcIixcIlJlZmVyZW5jZUVycm9yXCIsXCJTeW50YXhFcnJvclwiLFwiVHlwZUVycm9yXCIsXCJVUklFcnJvclwiXSk7ZS5zdWJzY3JpYmU9ZnVuY3Rpb24oYSxiKXtrW2FdPWJ9LGUuaXNJbkZyYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBhPWF8fHdpbmRvdywhIWEuZnJhbWVFbGVtZW50fSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZnVuY3Rpb24oYSl7dmFyIGI9aShhLmRhdGEpO2lmKGIpe3ZhciBjPWIudXVpZCxlPWIuX2tlZXBhbGl2ZSxoPWpbY107aWYoaCl7aChiLmVycm9yfHxiLm1lc3NhZ2UsZSxmKGEuc291cmNlLGIudG9waWMsYykpLGV8fGRlbGV0ZSBqW2NdfWlmKCFiLmVycm9yKXRyeXtnKGEuc291cmNlLGIsZSl9Y2F0Y2goZSl7ZChhLnNvdXJjZSxiLnRvcGljLGUsYywhMSl9fX0sITEpLGEucmVzcG9uZGFibGU9ZX0odXRpbHMpLGF4ZS51dGlscy5ydWxlU2hvdWxkUnVuPWZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjt2YXIgZD1jLnJ1bk9ubHl8fHt9LGU9KGMucnVsZXN8fHt9KVthLmlkXTtyZXR1cm4hKGEucGFnZUxldmVsJiYhYi5wYWdlKSYmKFwicnVsZVwiPT09ZC50eXBlPy0xIT09ZC52YWx1ZXMuaW5kZXhPZihhLmlkKTplJiZcImJvb2xlYW5cIj09dHlwZW9mIGUuZW5hYmxlZD9lLmVuYWJsZWQ6XCJ0YWdcIj09PWQudHlwZSYmZC52YWx1ZXM/cmEoYSxkLnZhbHVlcyk6cmEoYSxbXSkpfSxheGUudXRpbHMuZ2V0U2Nyb2xsU3RhdGU9ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06d2luZG93LGI9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuW3ZvaWQgMCE9PWEucGFnZVhPZmZzZXQ/e2VsbTphLHRvcDphLnBhZ2VZT2Zmc2V0LGxlZnQ6YS5wYWdlWE9mZnNldH06e2VsbTpiLHRvcDpiLnNjcm9sbFRvcCxsZWZ0OmIuc2Nyb2xsTGVmdH1dLmNvbmNhdCh1YShkb2N1bWVudC5ib2R5KSl9LGF4ZS51dGlscy5zZXRTY3JvbGxTdGF0ZT1mdW5jdGlvbihhKXthLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIHRhKGEuZWxtLGEudG9wLGEubGVmdCl9KX0sYXhlLnV0aWxzLnNlbGVjdD1mdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQ9W107aWYoYXhlLl9zZWxlY3RDYWNoZSlmb3IodmFyIGU9MCxmPWF4ZS5fc2VsZWN0Q2FjaGUubGVuZ3RoO2U8ZjtlKyspe3ZhciBnPWF4ZS5fc2VsZWN0Q2FjaGVbZV07aWYoZy5zZWxlY3Rvcj09PWEpcmV0dXJuIGcucmVzdWx0fWZvcih2YXIgaD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIHdhKGIsYSl9fShiKSxpPXlhKGIuaW5jbHVkZSksaj0wO2o8aS5sZW5ndGg7aisrKWM9aVtqXSxjLmFjdHVhbE5vZGUubm9kZVR5cGU9PT1jLmFjdHVhbE5vZGUuRUxFTUVOVF9OT0RFJiZheGUudXRpbHMubWF0Y2hlc1NlbGVjdG9yKGMuYWN0dWFsTm9kZSxhKSYmaChjKSYmKGQ9eGEoZCxbY10pKSxkPXhhKGQsYXhlLnV0aWxzLnF1ZXJ5U2VsZWN0b3JBbGxGaWx0ZXIoYyxhLGgpKTtyZXR1cm4gYXhlLl9zZWxlY3RDYWNoZSYmYXhlLl9zZWxlY3RDYWNoZS5wdXNoKHtzZWxlY3RvcjphLHJlc3VsdDpkfSksZH0sYXhlLnV0aWxzLnRvQXJyYXk9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfSxheGUudXRpbHMudW5pcXVlQXJyYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb25jYXQoYikuZmlsdGVyKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYy5pbmRleE9mKGEpPT09Yn0pfTt2YXIgVmE7IWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe3ZhciBkPWImJmN8fDAsZT0wO2ZvcihiPWJ8fFtdLGEudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bMC05YS1mXXsyfS9nLGZ1bmN0aW9uKGEpe2U8MTYmJihiW2QrZSsrXT1sW2FdKX0pO2U8MTY7KWJbZCtlKytdPTA7cmV0dXJuIGJ9ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPWJ8fDAsZD1rO3JldHVybiBkW2FbYysrXV0rZFthW2MrK11dK2RbYVtjKytdXStkW2FbYysrXV0rXCItXCIrZFthW2MrK11dK2RbYVtjKytdXStcIi1cIitkW2FbYysrXV0rZFthW2MrK11dK1wiLVwiK2RbYVtjKytdXStkW2FbYysrXV0rXCItXCIrZFthW2MrK11dK2RbYVtjKytdXStkW2FbYysrXV0rZFthW2MrK11dK2RbYVtjKytdXStkW2FbYysrXV19ZnVuY3Rpb24gZChhLGIsZCl7dmFyIGU9YiYmZHx8MCxmPWJ8fFtdO2E9YXx8e307dmFyIGc9bnVsbCE9YS5jbG9ja3NlcT9hLmNsb2Nrc2VxOnAsaD1udWxsIT1hLm1zZWNzP2EubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksaT1udWxsIT1hLm5zZWNzP2EubnNlY3M6cisxLGo9aC1xKyhpLXIpLzFlNDtpZihqPDAmJm51bGw9PWEuY2xvY2tzZXEmJihnPWcrMSYxNjM4MyksKGo8MHx8aD5xKSYmbnVsbD09YS5uc2VjcyYmKGk9MCksaT49MWU0KXRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO3E9aCxyPWkscD1nLGgrPTEyMjE5MjkyOGU1O3ZhciBrPSgxZTQqKDI2ODQzNTQ1NSZoKStpKSU0Mjk0OTY3Mjk2O2ZbZSsrXT1rPj4+MjQmMjU1LGZbZSsrXT1rPj4+MTYmMjU1LGZbZSsrXT1rPj4+OCYyNTUsZltlKytdPTI1NSZrO3ZhciBsPWgvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O2ZbZSsrXT1sPj4+OCYyNTUsZltlKytdPTI1NSZsLGZbZSsrXT1sPj4+MjQmMTV8MTYsZltlKytdPWw+Pj4xNiYyNTUsZltlKytdPWc+Pj44fDEyOCxmW2UrK109MjU1Jmc7Zm9yKHZhciBtPWEubm9kZXx8byxuPTA7bjw2O24rKylmW2Urbl09bVtuXTtyZXR1cm4gYnx8YyhmKX1mdW5jdGlvbiBlKGEsYixkKXt2YXIgZT1iJiZkfHwwO1wic3RyaW5nXCI9PXR5cGVvZiBhJiYoYj1cImJpbmFyeVwiPT1hP25ldyBqKDE2KTpudWxsLGE9bnVsbCksYT1hfHx7fTt2YXIgZz1hLnJhbmRvbXx8KGEucm5nfHxmKSgpO2lmKGdbNl09MTUmZ1s2XXw2NCxnWzhdPTYzJmdbOF18MTI4LGIpZm9yKHZhciBoPTA7aDwxNjtoKyspYltlK2hdPWdbaF07cmV0dXJuIGJ8fGMoZyl9dmFyIGYsZz1hLmNyeXB0b3x8YS5tc0NyeXB0bztpZighZiYmZyYmZy5nZXRSYW5kb21WYWx1ZXMpe3ZhciBoPW5ldyBVaW50OEFycmF5KDE2KTtmPWZ1bmN0aW9uKCl7cmV0dXJuIGcuZ2V0UmFuZG9tVmFsdWVzKGgpLGh9fWlmKCFmKXt2YXIgaT1uZXcgQXJyYXkoMTYpO2Y9ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO2I8MTY7YisrKTA9PSgzJmIpJiYoYT00Mjk0OTY3Mjk2Kk1hdGgucmFuZG9tKCkpLGlbYl09YT4+PigoMyZiKTw8MykmMjU1O3JldHVybiBpfX1mb3IodmFyIGo9XCJmdW5jdGlvblwiPT10eXBlb2YgYS5CdWZmZXI/YS5CdWZmZXI6QXJyYXksaz1bXSxsPXt9LG09MDttPDI1NjttKyspa1ttXT0obSsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSksbFtrW21dXT1tO3ZhciBuPWYoKSxvPVsxfG5bMF0sblsxXSxuWzJdLG5bM10sbls0XSxuWzVdXSxwPTE2MzgzJihuWzZdPDw4fG5bN10pLHE9MCxyPTA7VmE9ZSxWYS52MT1kLFZhLnY0PWUsVmEucGFyc2U9YixWYS51bnBhcnNlPWMsVmEuQnVmZmVyQ2xhc3M9an0od2luZG93KSxheGUuX2xvYWQoe2RhdGE6e3J1bGVzOnthY2Nlc3NrZXlzOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgZXZlcnkgYWNjZXNza2V5IGF0dHJpYnV0ZSB2YWx1ZSBpcyB1bmlxdWVcIixoZWxwOlwiYWNjZXNza2V5IGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIHVuaXF1ZVwifSxcImFyZWEtYWx0XCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8YXJlYT4gZWxlbWVudHMgb2YgaW1hZ2UgbWFwcyBoYXZlIGFsdGVybmF0ZSB0ZXh0XCIsaGVscDpcIkFjdGl2ZSA8YXJlYT4gZWxlbWVudHMgbXVzdCBoYXZlIGFsdGVybmF0ZSB0ZXh0XCJ9LFwiYXJpYS1hbGxvd2VkLWF0dHJcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIEFSSUEgYXR0cmlidXRlcyBhcmUgYWxsb3dlZCBmb3IgYW4gZWxlbWVudCdzIHJvbGVcIixoZWxwOlwiRWxlbWVudHMgbXVzdCBvbmx5IHVzZSBhbGxvd2VkIEFSSUEgYXR0cmlidXRlc1wifSxcImFyaWEtaGlkZGVuLWJvZHlcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIGFyaWEtaGlkZGVuPSd0cnVlJyBpcyBub3QgcHJlc2VudCBvbiB0aGUgZG9jdW1lbnQgYm9keS5cIixoZWxwOlwiYXJpYS1oaWRkZW49J3RydWUnIG11c3Qgbm90IGJlIHByZXNlbnQgb24gdGhlIGRvY3VtZW50IGJvZHlcIn0sXCJhcmlhLXJlcXVpcmVkLWF0dHJcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIGVsZW1lbnRzIHdpdGggQVJJQSByb2xlcyBoYXZlIGFsbCByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZXNcIixoZWxwOlwiUmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgcHJvdmlkZWRcIn0sXCJhcmlhLXJlcXVpcmVkLWNoaWxkcmVuXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBlbGVtZW50cyB3aXRoIGFuIEFSSUEgcm9sZSB0aGF0IHJlcXVpcmUgY2hpbGQgcm9sZXMgY29udGFpbiB0aGVtXCIsaGVscDpcIkNlcnRhaW4gQVJJQSByb2xlcyBtdXN0IGNvbnRhaW4gcGFydGljdWxhciBjaGlsZHJlblwifSxcImFyaWEtcmVxdWlyZWQtcGFyZW50XCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBlbGVtZW50cyB3aXRoIGFuIEFSSUEgcm9sZSB0aGF0IHJlcXVpcmUgcGFyZW50IHJvbGVzIGFyZSBjb250YWluZWQgYnkgdGhlbVwiLGhlbHA6XCJDZXJ0YWluIEFSSUEgcm9sZXMgbXVzdCBiZSBjb250YWluZWQgYnkgcGFydGljdWxhciBwYXJlbnRzXCJ9LFwiYXJpYS1yb2xlc1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgYWxsIGVsZW1lbnRzIHdpdGggYSByb2xlIGF0dHJpYnV0ZSB1c2UgYSB2YWxpZCB2YWx1ZVwiLGhlbHA6XCJBUklBIHJvbGVzIHVzZWQgbXVzdCBjb25mb3JtIHRvIHZhbGlkIHZhbHVlc1wifSxcImFyaWEtdmFsaWQtYXR0ci12YWx1ZVwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgYWxsIEFSSUEgYXR0cmlidXRlcyBoYXZlIHZhbGlkIHZhbHVlc1wiLGhlbHA6XCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBjb25mb3JtIHRvIHZhbGlkIHZhbHVlc1wifSxcImFyaWEtdmFsaWQtYXR0clwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgYXR0cmlidXRlcyB0aGF0IGJlZ2luIHdpdGggYXJpYS0gYXJlIHZhbGlkIEFSSUEgYXR0cmlidXRlc1wiLGhlbHA6XCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBjb25mb3JtIHRvIHZhbGlkIG5hbWVzXCJ9LFwiYXVkaW8tY2FwdGlvblwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgPGF1ZGlvPiBlbGVtZW50cyBoYXZlIGNhcHRpb25zXCIsaGVscDpcIjxhdWRpbz4gZWxlbWVudHMgbXVzdCBoYXZlIGEgY2FwdGlvbnMgdHJhY2tcIn0sYmxpbms6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8Ymxpbms+IGVsZW1lbnRzIGFyZSBub3QgdXNlZFwiLGhlbHA6XCI8Ymxpbms+IGVsZW1lbnRzIGFyZSBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkXCJ9LFwiYnV0dG9uLW5hbWVcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIGJ1dHRvbnMgaGF2ZSBkaXNjZXJuaWJsZSB0ZXh0XCIsaGVscDpcIkJ1dHRvbnMgbXVzdCBoYXZlIGRpc2Nlcm5pYmxlIHRleHRcIn0sYnlwYXNzOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgZWFjaCBwYWdlIGhhcyBhdCBsZWFzdCBvbmUgbWVjaGFuaXNtIGZvciBhIHVzZXIgdG8gYnlwYXNzIG5hdmlnYXRpb24gYW5kIGp1bXAgc3RyYWlnaHQgdG8gdGhlIGNvbnRlbnRcIixoZWxwOlwiUGFnZSBtdXN0IGhhdmUgbWVhbnMgdG8gYnlwYXNzIHJlcGVhdGVkIGJsb2Nrc1wifSxjaGVja2JveGdyb3VwOntkZXNjcmlwdGlvbjonRW5zdXJlcyByZWxhdGVkIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIj4gZWxlbWVudHMgaGF2ZSBhIGdyb3VwIGFuZCB0aGF0IHRoYXQgZ3JvdXAgZGVzaWduYXRpb24gaXMgY29uc2lzdGVudCcsaGVscDpcIkNoZWNrYm94IGlucHV0cyB3aXRoIHRoZSBzYW1lIG5hbWUgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgcGFydCBvZiBhIGdyb3VwXCJ9LFwiY29sb3ItY29udHJhc3RcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIHRoZSBjb250cmFzdCBiZXR3ZWVuIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG1lZXRzIFdDQUcgMiBBQSBjb250cmFzdCByYXRpbyB0aHJlc2hvbGRzXCIsaGVscDpcIkVsZW1lbnRzIG11c3QgaGF2ZSBzdWZmaWNpZW50IGNvbG9yIGNvbnRyYXN0XCJ9LFwiZGVmaW5pdGlvbi1saXN0XCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8ZGw+IGVsZW1lbnRzIGFyZSBzdHJ1Y3R1cmVkIGNvcnJlY3RseVwiLGhlbHA6XCI8ZGw+IGVsZW1lbnRzIG11c3Qgb25seSBkaXJlY3RseSBjb250YWluIHByb3Blcmx5LW9yZGVyZWQgPGR0PiBhbmQgPGRkPiBncm91cHMsIDxzY3JpcHQ+IG9yIDx0ZW1wbGF0ZT4gZWxlbWVudHNcIn0sZGxpdGVtOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgPGR0PiBhbmQgPGRkPiBlbGVtZW50cyBhcmUgY29udGFpbmVkIGJ5IGEgPGRsPlwiLGhlbHA6XCI8ZHQ+IGFuZCA8ZGQ+IGVsZW1lbnRzIG11c3QgYmUgY29udGFpbmVkIGJ5IGEgPGRsPlwifSxcImRvY3VtZW50LXRpdGxlXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBlYWNoIEhUTUwgZG9jdW1lbnQgY29udGFpbnMgYSBub24tZW1wdHkgPHRpdGxlPiBlbGVtZW50XCIsaGVscDpcIkRvY3VtZW50cyBtdXN0IGhhdmUgPHRpdGxlPiBlbGVtZW50IHRvIGFpZCBpbiBuYXZpZ2F0aW9uXCJ9LFwiZHVwbGljYXRlLWlkXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBldmVyeSBpZCBhdHRyaWJ1dGUgdmFsdWUgaXMgdW5pcXVlXCIsaGVscDpcImlkIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIHVuaXF1ZVwifSxcImVtcHR5LWhlYWRpbmdcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIGhlYWRpbmdzIGhhdmUgZGlzY2VybmlibGUgdGV4dFwiLGhlbHA6XCJIZWFkaW5ncyBtdXN0IG5vdCBiZSBlbXB0eVwifSxcImZvY3VzLW9yZGVyLXNlbWFudGljc1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgZWxlbWVudHMgaW4gdGhlIGZvY3VzIG9yZGVyIGhhdmUgYW4gYXBwcm9wcmlhdGUgcm9sZVwiLGhlbHA6XCJFbGVtZW50cyBpbiB0aGUgZm9jdXMgb3JkZXIgbmVlZCBhIHJvbGUgYXBwcm9wcmlhdGUgZm9yIGludGVyYWN0aXZlIGNvbnRlbnRcIn0sXCJmcmFtZS10aXRsZS11bmlxdWVcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIDxpZnJhbWU+IGFuZCA8ZnJhbWU+IGVsZW1lbnRzIGNvbnRhaW4gYSB1bmlxdWUgdGl0bGUgYXR0cmlidXRlXCIsaGVscDpcIkZyYW1lcyBtdXN0IGhhdmUgYSB1bmlxdWUgdGl0bGUgYXR0cmlidXRlXCJ9LFwiZnJhbWUtdGl0bGVcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIDxpZnJhbWU+IGFuZCA8ZnJhbWU+IGVsZW1lbnRzIGNvbnRhaW4gYSBub24tZW1wdHkgdGl0bGUgYXR0cmlidXRlXCIsaGVscDpcIkZyYW1lcyBtdXN0IGhhdmUgdGl0bGUgYXR0cmlidXRlXCJ9LFwiaGVhZGluZy1vcmRlclwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgdGhlIG9yZGVyIG9mIGhlYWRpbmdzIGlzIHNlbWFudGljYWxseSBjb3JyZWN0XCIsaGVscDpcIkhlYWRpbmcgbGV2ZWxzIHNob3VsZCBvbmx5IGluY3JlYXNlIGJ5IG9uZVwifSxcImhpZGRlbi1jb250ZW50XCI6e2Rlc2NyaXB0aW9uOlwiSW5mb3JtcyB1c2VycyBhYm91dCBoaWRkZW4gY29udGVudC5cIixoZWxwOlwiSGlkZGVuIGNvbnRlbnQgb24gdGhlIHBhZ2UgY2Fubm90IGJlIGFuYWx5emVkXCJ9LFwiaHRtbC1oYXMtbGFuZ1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgZXZlcnkgSFRNTCBkb2N1bWVudCBoYXMgYSBsYW5nIGF0dHJpYnV0ZVwiLGhlbHA6XCI8aHRtbD4gZWxlbWVudCBtdXN0IGhhdmUgYSBsYW5nIGF0dHJpYnV0ZVwifSxcImh0bWwtbGFuZy12YWxpZFwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgdGhlIGxhbmcgYXR0cmlidXRlIG9mIHRoZSA8aHRtbD4gZWxlbWVudCBoYXMgYSB2YWxpZCB2YWx1ZVwiLGhlbHA6XCI8aHRtbD4gZWxlbWVudCBtdXN0IGhhdmUgYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGxhbmcgYXR0cmlidXRlXCJ9LFwiaW1hZ2UtYWx0XCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8aW1nPiBlbGVtZW50cyBoYXZlIGFsdGVybmF0ZSB0ZXh0IG9yIGEgcm9sZSBvZiBub25lIG9yIHByZXNlbnRhdGlvblwiLGhlbHA6XCJJbWFnZXMgbXVzdCBoYXZlIGFsdGVybmF0ZSB0ZXh0XCJ9LFwiaW1hZ2UtcmVkdW5kYW50LWFsdFwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSBidXR0b24gYW5kIGxpbmsgdGV4dCBpcyBub3QgcmVwZWF0ZWQgYXMgaW1hZ2UgYWx0ZXJuYXRpdmVcIixoZWxwOlwiVGV4dCBvZiBidXR0b25zIGFuZCBsaW5rcyBzaG91bGQgbm90IGJlIHJlcGVhdGVkIGluIHRoZSBpbWFnZSBhbHRlcm5hdGl2ZVwifSxcImlucHV0LWltYWdlLWFsdFwiOntkZXNjcmlwdGlvbjonRW5zdXJlcyA8aW5wdXQgdHlwZT1cImltYWdlXCI+IGVsZW1lbnRzIGhhdmUgYWx0ZXJuYXRlIHRleHQnLGhlbHA6XCJJbWFnZSBidXR0b25zIG11c3QgaGF2ZSBhbHRlcm5hdGUgdGV4dFwifSxcImxhYmVsLXRpdGxlLW9ubHlcIjp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIHRoYXQgZXZlcnkgZm9ybSBlbGVtZW50IGlzIG5vdCBzb2xlbHkgbGFiZWxlZCB1c2luZyB0aGUgdGl0bGUgb3IgYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGVzXCIsaGVscDpcIkZvcm0gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSB2aXNpYmxlIGxhYmVsXCJ9LGxhYmVsOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgZXZlcnkgZm9ybSBlbGVtZW50IGhhcyBhIGxhYmVsXCIsaGVscDpcIkZvcm0gZWxlbWVudHMgbXVzdCBoYXZlIGxhYmVsc1wifSxcImxhbmRtYXJrLW1haW4taXMtdG9wLWxldmVsXCI6e2Rlc2NyaXB0aW9uOlwiVGhlIG1haW4gbGFuZG1hcmsgc2hvdWxkIG5vdCBiZSBjb250YWluZWQgaW4gYW5vdGhlciBsYW5kbWFya1wiLGhlbHA6XCJNYWluIGxhbmRtYXJrIGlzIG5vdCBhdCB0b3AgbGV2ZWxcIn0sXCJsYW5kbWFyay1vbmUtbWFpblwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgYSBuYXZpZ2F0aW9uIHBvaW50IHRvIHRoZSBwcmltYXJ5IGNvbnRlbnQgb2YgdGhlIHBhZ2UuIElmIHRoZSBwYWdlIGNvbnRhaW5zIGlmcmFtZXMsIGVhY2ggaWZyYW1lIHNob3VsZCBjb250YWluIGVpdGhlciBubyBtYWluIGxhbmRtYXJrcyBvciBqdXN0IG9uZS5cIixoZWxwOlwiUGFnZSBtdXN0IGNvbnRhaW4gb25lIG1haW4gbGFuZG1hcmsuXCJ9LFwibGF5b3V0LXRhYmxlXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBwcmVzZW50YXRpb25hbCA8dGFibGU+IGVsZW1lbnRzIGRvIG5vdCB1c2UgPHRoPiwgPGNhcHRpb24+IGVsZW1lbnRzIG9yIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZVwiLGhlbHA6XCJMYXlvdXQgdGFibGVzIG11c3Qgbm90IHVzZSBkYXRhIHRhYmxlIGVsZW1lbnRzXCJ9LFwibGluay1pbi10ZXh0LWJsb2NrXCI6e2Rlc2NyaXB0aW9uOlwiTGlua3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aG91dCByZWx5aW5nIG9uIGNvbG9yXCIsaGVscDpcIkxpbmtzIG11c3QgYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHN1cnJvdW5kaW5nIHRleHQgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCByZWx5IG9uIGNvbG9yXCJ9LFwibGluay1uYW1lXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBsaW5rcyBoYXZlIGRpc2Nlcm5pYmxlIHRleHRcIixoZWxwOlwiTGlua3MgbXVzdCBoYXZlIGRpc2Nlcm5pYmxlIHRleHRcIn0sbGlzdDp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIHRoYXQgbGlzdHMgYXJlIHN0cnVjdHVyZWQgY29ycmVjdGx5XCIsaGVscDpcIjx1bD4gYW5kIDxvbD4gbXVzdCBvbmx5IGRpcmVjdGx5IGNvbnRhaW4gPGxpPiwgPHNjcmlwdD4gb3IgPHRlbXBsYXRlPiBlbGVtZW50c1wifSxsaXN0aXRlbTp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIDxsaT4gZWxlbWVudHMgYXJlIHVzZWQgc2VtYW50aWNhbGx5XCIsaGVscDpcIjxsaT4gZWxlbWVudHMgbXVzdCBiZSBjb250YWluZWQgaW4gYSA8dWw+IG9yIDxvbD5cIn0sbWFycXVlZTp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIDxtYXJxdWVlPiBlbGVtZW50cyBhcmUgbm90IHVzZWRcIixoZWxwOlwiPG1hcnF1ZWU+IGVsZW1lbnRzIGFyZSBkZXByZWNhdGVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkXCJ9LFwibWV0YS1yZWZyZXNoXCI6e2Rlc2NyaXB0aW9uOidFbnN1cmVzIDxtZXRhIGh0dHAtZXF1aXY9XCJyZWZyZXNoXCI+IGlzIG5vdCB1c2VkJyxoZWxwOlwiVGltZWQgcmVmcmVzaCBtdXN0IG5vdCBleGlzdFwifSxcIm1ldGEtdmlld3BvcnQtbGFyZ2VcIjp7ZGVzY3JpcHRpb246J0Vuc3VyZXMgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCI+IGNhbiBzY2FsZSBhIHNpZ25pZmljYW50IGFtb3VudCcsaGVscDpcIlVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHpvb20gYW5kIHNjYWxlIHRoZSB0ZXh0IHVwIHRvIDUwMCVcIn0sXCJtZXRhLXZpZXdwb3J0XCI6e2Rlc2NyaXB0aW9uOidFbnN1cmVzIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiPiBkb2VzIG5vdCBkaXNhYmxlIHRleHQgc2NhbGluZyBhbmQgem9vbWluZycsaGVscDpcIlpvb21pbmcgYW5kIHNjYWxpbmcgbXVzdCBub3QgYmUgZGlzYWJsZWRcIn0sXCJvYmplY3QtYWx0XCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8b2JqZWN0PiBlbGVtZW50cyBoYXZlIGFsdGVybmF0ZSB0ZXh0XCIsaGVscDpcIjxvYmplY3Q+IGVsZW1lbnRzIG11c3QgaGF2ZSBhbHRlcm5hdGUgdGV4dFwifSxcInAtYXMtaGVhZGluZ1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSBwIGVsZW1lbnRzIGFyZSBub3QgdXNlZCB0byBzdHlsZSBoZWFkaW5nc1wiLGhlbHA6XCJCb2xkLCBpdGFsaWMgdGV4dCBhbmQgZm9udC1zaXplIGFyZSBub3QgdXNlZCB0byBzdHlsZSBwIGVsZW1lbnRzIGFzIGEgaGVhZGluZ1wifSxyYWRpb2dyb3VwOntkZXNjcmlwdGlvbjonRW5zdXJlcyByZWxhdGVkIDxpbnB1dCB0eXBlPVwicmFkaW9cIj4gZWxlbWVudHMgaGF2ZSBhIGdyb3VwIGFuZCB0aGF0IHRoZSBncm91cCBkZXNpZ25hdGlvbiBpcyBjb25zaXN0ZW50JyxoZWxwOlwiUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBwYXJ0IG9mIGEgZ3JvdXBcIn0scmVnaW9uOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgYWxsIGNvbnRlbnQgaXMgY29udGFpbmVkIHdpdGhpbiBhIGxhbmRtYXJrIHJlZ2lvblwiLGhlbHA6XCJDb250ZW50IHNob3VsZCBiZSBjb250YWluZWQgaW4gYSBsYW5kbWFyayByZWdpb25cIn0sXCJzY29wZS1hdHRyLXZhbGlkXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyB0aGUgc2NvcGUgYXR0cmlidXRlIGlzIHVzZWQgY29ycmVjdGx5IG9uIHRhYmxlc1wiLGhlbHA6XCJzY29wZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWQgY29ycmVjdGx5XCJ9LFwic2VydmVyLXNpZGUtaW1hZ2UtbWFwXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyB0aGF0IHNlcnZlci1zaWRlIGltYWdlIG1hcHMgYXJlIG5vdCB1c2VkXCIsaGVscDpcIlNlcnZlci1zaWRlIGltYWdlIG1hcHMgbXVzdCBub3QgYmUgdXNlZFwifSxcInNraXAtbGlua1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSBhbGwgc2tpcCBsaW5rcyBoYXZlIGEgZm9jdXNhYmxlIHRhcmdldFwiLGhlbHA6XCJUaGUgc2tpcC1saW5rIHRhcmdldCBzaG91bGQgZXhpc3QgYW5kIGJlIGZvY3VzYWJsZVwifSx0YWJpbmRleDp7ZGVzY3JpcHRpb246XCJFbnN1cmVzIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG5vdCBncmVhdGVyIHRoYW4gMFwiLGhlbHA6XCJFbGVtZW50cyBzaG91bGQgbm90IGhhdmUgdGFiaW5kZXggZ3JlYXRlciB0aGFuIHplcm9cIn0sXCJ0YWJsZS1kdXBsaWNhdGUtbmFtZVwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSB0aGF0IHRhYmxlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzdW1tYXJ5IGFuZCBjYXB0aW9uXCIsaGVscDpcIlRoZSA8Y2FwdGlvbj4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gdGhlIHNhbWUgdGV4dCBhcyB0aGUgc3VtbWFyeSBhdHRyaWJ1dGVcIn0sXCJ0YWJsZS1mYWtlLWNhcHRpb25cIjp7ZGVzY3JpcHRpb246XCJFbnN1cmUgdGhhdCB0YWJsZXMgd2l0aCBhIGNhcHRpb24gdXNlIHRoZSA8Y2FwdGlvbj4gZWxlbWVudC5cIixoZWxwOlwiRGF0YSBvciBoZWFkZXIgY2VsbHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGdpdmUgY2FwdGlvbiB0byBhIGRhdGEgdGFibGUuXCJ9LFwidGQtaGFzLWhlYWRlclwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSB0aGF0IGVhY2ggbm9uLWVtcHR5IGRhdGEgY2VsbCBpbiBhIGxhcmdlIHRhYmxlIGhhcyBvbmUgb3IgbW9yZSB0YWJsZSBoZWFkZXJzXCIsaGVscDpcIkFsbCBub24tZW1wdHkgdGQgZWxlbWVudCBpbiB0YWJsZSBsYXJnZXIgdGhhbiAzIGJ5IDMgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgdGFibGUgaGVhZGVyXCJ9LFwidGQtaGVhZGVycy1hdHRyXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlIHRoYXQgZWFjaCBjZWxsIGluIGEgdGFibGUgdXNpbmcgdGhlIGhlYWRlcnMgcmVmZXJzIHRvIGFub3RoZXIgY2VsbCBpbiB0aGF0IHRhYmxlXCIsaGVscDpcIkFsbCBjZWxscyBpbiBhIHRhYmxlIGVsZW1lbnQgdGhhdCB1c2UgdGhlIGhlYWRlcnMgYXR0cmlidXRlIG11c3Qgb25seSByZWZlciB0byBvdGhlciBjZWxscyBvZiB0aGF0IHNhbWUgdGFibGVcIn0sXCJ0aC1oYXMtZGF0YS1jZWxsc1wiOntkZXNjcmlwdGlvbjpcIkVuc3VyZSB0aGF0IGVhY2ggdGFibGUgaGVhZGVyIGluIGEgZGF0YSB0YWJsZSByZWZlcnMgdG8gZGF0YSBjZWxsc1wiLGhlbHA6XCJBbGwgdGggZWxlbWVudHMgYW5kIGVsZW1lbnRzIHdpdGggcm9sZT1jb2x1bW5oZWFkZXIvcm93aGVhZGVyIG11c3QgaGF2ZSBkYXRhIGNlbGxzIHRoZXkgZGVzY3JpYmVcIn0sXCJ2YWxpZC1sYW5nXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyBsYW5nIGF0dHJpYnV0ZXMgaGF2ZSB2YWxpZCB2YWx1ZXNcIixoZWxwOlwibGFuZyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGEgdmFsaWQgdmFsdWVcIn0sXCJ2aWRlby1jYXB0aW9uXCI6e2Rlc2NyaXB0aW9uOlwiRW5zdXJlcyA8dmlkZW8+IGVsZW1lbnRzIGhhdmUgY2FwdGlvbnNcIixoZWxwOlwiPHZpZGVvPiBlbGVtZW50cyBtdXN0IGhhdmUgY2FwdGlvbnNcIn0sXCJ2aWRlby1kZXNjcmlwdGlvblwiOntkZXNjcmlwdGlvbjpcIkVuc3VyZXMgPHZpZGVvPiBlbGVtZW50cyBoYXZlIGF1ZGlvIGRlc2NyaXB0aW9uc1wiLGhlbHA6XCI8dmlkZW8+IGVsZW1lbnRzIG11c3QgaGF2ZSBhbiBhdWRpbyBkZXNjcmlwdGlvbiB0cmFja1wifX0sY2hlY2tzOnthY2Nlc3NrZXlzOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJBY2Nlc3NrZXkgYXR0cmlidXRlIHZhbHVlIGlzIHVuaXF1ZVwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiRG9jdW1lbnQgaGFzIG11bHRpcGxlIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgYWNjZXNza2V5XCJ9fX0sXCJub24tZW1wdHktYWx0XCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGhhcyBhIG5vbi1lbXB0eSBhbHQgYXR0cmlidXRlXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGhhcyBubyBhbHQgYXR0cmlidXRlIG9yIHRoZSBhbHQgYXR0cmlidXRlIGlzIGVtcHR5XCJ9fX0sXCJub24tZW1wdHktdGl0bGVcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBoYXMgYSB0aXRsZSBhdHRyaWJ1dGVcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIG5vIHRpdGxlIGF0dHJpYnV0ZSBvciB0aGUgdGl0bGUgYXR0cmlidXRlIGlzIGVtcHR5XCJ9fX0sXCJhcmlhLWxhYmVsXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cImFyaWEtbGFiZWwgYXR0cmlidXRlIGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJhcmlhLWxhYmVsIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdCBvciBpcyBlbXB0eVwifX19LFwiYXJpYS1sYWJlbGxlZGJ5XCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cImFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUgZXhpc3RzIGFuZCByZWZlcmVuY2VzIGVsZW1lbnRzIHRoYXQgYXJlIHZpc2libGUgdG8gc2NyZWVuIHJlYWRlcnNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cImFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QsIHJlZmVyZW5jZXMgZWxlbWVudHMgdGhhdCBkbyBub3QgZXhpc3Qgb3IgcmVmZXJlbmNlcyBlbGVtZW50cyB0aGF0IGFyZSBlbXB0eSBvciBub3QgdmlzaWJsZVwifX19LFwiYXJpYS1hbGxvd2VkLWF0dHJcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkFSSUEgYXR0cmlidXRlcyBhcmUgdXNlZCBjb3JyZWN0bHkgZm9yIHRoZSBkZWZpbmVkIHJvbGVcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cIkFSSUEgYXR0cmlidXRlXCIrKGEuZGF0YSYmYS5kYXRhLmxlbmd0aD4xP1wicyBhcmVcIjpcIiBpc1wiKStcIiBub3QgYWxsb3dlZDpcIixjPWEuZGF0YTtpZihjKWZvcih2YXIgZCxlPS0xLGY9Yy5sZW5ndGgtMTtlPGY7KWQ9Y1tlKz0xXSxiKz1cIiBcIitkO3JldHVybiBifX19LFwiYXJpYS1oaWRkZW4tYm9keVwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiTm8gYXJpYS1oaWRkZW4gYXR0cmlidXRlIGlzIHByZXNlbnQgb24gZG9jdW1lbnQgYm9keVwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiYXJpYS1oaWRkZW49dHJ1ZSBzaG91bGQgbm90IGJlIHByZXNlbnQgb24gdGhlIGRvY3VtZW50IGJvZHlcIn19fSxcImFyaWEtcmVxdWlyZWQtYXR0clwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQWxsIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlcyBhcmUgcHJlc2VudFwifSxmYWlsOmZ1bmN0aW9uKGEpe3ZhciBiPVwiUmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGVcIisoYS5kYXRhJiZhLmRhdGEubGVuZ3RoPjE/XCJzXCI6XCJcIikrXCIgbm90IHByZXNlbnQ6XCIsYz1hLmRhdGE7aWYoYylmb3IodmFyIGQsZT0tMSxmPWMubGVuZ3RoLTE7ZTxmOylkPWNbZSs9MV0sYis9XCIgXCIrZDtyZXR1cm4gYn19fSxcImFyaWEtcmVxdWlyZWQtY2hpbGRyZW5cIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlJlcXVpcmVkIEFSSUEgY2hpbGRyZW4gYXJlIHByZXNlbnRcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cIlJlcXVpcmVkIEFSSUEgXCIrKGEuZGF0YSYmYS5kYXRhLmxlbmd0aD4xP1wiY2hpbGRyZW5cIjpcImNoaWxkXCIpK1wiIHJvbGUgbm90IHByZXNlbnQ6XCIsYz1hLmRhdGE7aWYoYylmb3IodmFyIGQsZT0tMSxmPWMubGVuZ3RoLTE7ZTxmOylkPWNbZSs9MV0sYis9XCIgXCIrZDtyZXR1cm4gYn19fSxcImFyaWEtcmVxdWlyZWQtcGFyZW50XCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJSZXF1aXJlZCBBUklBIHBhcmVudCByb2xlIHByZXNlbnRcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cIlJlcXVpcmVkIEFSSUEgcGFyZW50XCIrKGEuZGF0YSYmYS5kYXRhLmxlbmd0aD4xP1wic1wiOlwiXCIpK1wiIHJvbGUgbm90IHByZXNlbnQ6XCIsYz1hLmRhdGE7aWYoYylmb3IodmFyIGQsZT0tMSxmPWMubGVuZ3RoLTE7ZTxmOylkPWNbZSs9MV0sYis9XCIgXCIrZDtyZXR1cm4gYn19fSxpbnZhbGlkcm9sZTp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkFSSUEgcm9sZSBpcyB2YWxpZFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiUm9sZSBtdXN0IGJlIG9uZSBvZiB0aGUgdmFsaWQgQVJJQSByb2xlc1wifX19LGFic3RyYWN0cm9sZTp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQWJzdHJhY3Qgcm9sZXMgYXJlIG5vdCB1c2VkXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJBYnN0cmFjdCByb2xlcyBjYW5ub3QgYmUgZGlyZWN0bHkgdXNlZFwifX19LFwiYXJpYS12YWxpZC1hdHRyLXZhbHVlXCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJBUklBIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHZhbGlkXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7dmFyIGI9XCJJbnZhbGlkIEFSSUEgYXR0cmlidXRlIHZhbHVlXCIrKGEuZGF0YSYmYS5kYXRhLmxlbmd0aD4xP1wic1wiOlwiXCIpK1wiOlwiLGM9YS5kYXRhO2lmKGMpZm9yKHZhciBkLGU9LTEsZj1jLmxlbmd0aC0xO2U8ZjspZD1jW2UrPTFdLGIrPVwiIFwiK2Q7cmV0dXJuIGJ9fX0sXCJhcmlhLWVycm9ybWVzc2FnZVwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiVXNlcyBhIHN1cHBvcnRlZCBhcmlhLWVycm9ybWVzc2FnZSB0ZWNobmlxdWVcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cImFyaWEtZXJyb3JtZXNzYWdlIHZhbHVlXCIrKGEuZGF0YSYmYS5kYXRhLmxlbmd0aD4xP1wic1wiOlwiXCIpK1wiIFwiLGM9YS5kYXRhO2lmKGMpZm9yKHZhciBkLGU9LTEsZj1jLmxlbmd0aC0xO2U8ZjspZD1jW2UrPTFdLGIrPVwiIGBcIitkO3JldHVybiBiKz1cImAgbXVzdCB1c2UgYSB0ZWNobmlxdWUgdG8gYW5ub3VuY2UgdGhlIG1lc3NhZ2UgKGUuZy4sIGFyaWEtbGl2ZSwgYXJpYS1kZXNjcmliZWRieSwgcm9sZT1hbGVydCwgZXRjLilcIn19fSxcImFyaWEtdmFsaWQtYXR0clwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQVJJQSBhdHRyaWJ1dGUgbmFtZVwiKyhhLmRhdGEmJmEuZGF0YS5sZW5ndGg+MT9cInNcIjpcIlwiKStcIiBhcmUgdmFsaWRcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cIkludmFsaWQgQVJJQSBhdHRyaWJ1dGUgbmFtZVwiKyhhLmRhdGEmJmEuZGF0YS5sZW5ndGg+MT9cInNcIjpcIlwiKStcIjpcIixjPWEuZGF0YTtpZihjKWZvcih2YXIgZCxlPS0xLGY9Yy5sZW5ndGgtMTtlPGY7KWQ9Y1tlKz0xXSxiKz1cIiBcIitkO3JldHVybiBifX19LGNhcHRpb246e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGUgbXVsdGltZWRpYSBlbGVtZW50IGhhcyBhIGNhcHRpb25zIHRyYWNrXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGUgbXVsdGltZWRpYSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjYXB0aW9ucyB0cmFja1wifSxpbmNvbXBsZXRlOmZ1bmN0aW9uKGEpe3JldHVyblwiQSBjYXB0aW9ucyB0cmFjayBmb3IgdGhpcyBlbGVtZW50IGNvdWxkIG5vdCBiZSBmb3VuZFwifX19LFwiaXMtb24tc2NyZWVuXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaXMgbm90IHZpc2libGVcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaXMgdmlzaWJsZVwifX19LFwibm9uLWVtcHR5LWlmLXByZXNlbnRcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXt2YXIgYj1cIkVsZW1lbnQgXCI7cmV0dXJuIGEuZGF0YT9iKz1cImhhcyBhIG5vbi1lbXB0eSB2YWx1ZSBhdHRyaWJ1dGVcIjpiKz1cImRvZXMgbm90IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGVcIixifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBoYXMgYSB2YWx1ZSBhdHRyaWJ1dGUgYW5kIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgZW1wdHlcIn19fSxcIm5vbi1lbXB0eS12YWx1ZVwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBoYXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGhhcyBubyB2YWx1ZSBhdHRyaWJ1dGUgb3IgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBlbXB0eVwifX19LFwiYnV0dG9uLWhhcy12aXNpYmxlLXRleHRcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIGlubmVyIHRleHQgdGhhdCBpcyB2aXNpYmxlIHRvIHNjcmVlbiByZWFkZXJzXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGRvZXMgbm90IGhhdmUgaW5uZXIgdGV4dCB0aGF0IGlzIHZpc2libGUgdG8gc2NyZWVuIHJlYWRlcnNcIn19fSxcInJvbGUtcHJlc2VudGF0aW9uXCI6e2ltcGFjdDpcIm1pbm9yXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuJ0VsZW1lbnRcXCdzIGRlZmF1bHQgc2VtYW50aWNzIHdlcmUgb3ZlcnJpZGVuIHdpdGggcm9sZT1cInByZXNlbnRhdGlvblwiJ30sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm4nRWxlbWVudFxcJ3MgZGVmYXVsdCBzZW1hbnRpY3Mgd2VyZSBub3Qgb3ZlcnJpZGRlbiB3aXRoIHJvbGU9XCJwcmVzZW50YXRpb25cIid9fX0sXCJyb2xlLW5vbmVcIjp7aW1wYWN0OlwibWlub3JcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm4nRWxlbWVudFxcJ3MgZGVmYXVsdCBzZW1hbnRpY3Mgd2VyZSBvdmVycmlkZW4gd2l0aCByb2xlPVwibm9uZVwiJ30sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm4nRWxlbWVudFxcJ3MgZGVmYXVsdCBzZW1hbnRpY3Mgd2VyZSBub3Qgb3ZlcnJpZGRlbiB3aXRoIHJvbGU9XCJub25lXCInfX19LFwiZm9jdXNhYmxlLW5vLW5hbWVcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBpcyBub3QgaW4gdGFiIG9yZGVyIG9yIGhhcyBhY2Nlc3NpYmxlIHRleHRcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaXMgaW4gdGFiIG9yZGVyIGFuZCBkb2VzIG5vdCBoYXZlIGFjY2Vzc2libGUgdGV4dFwifX19LFwiaW50ZXJuYWwtbGluay1wcmVzZW50XCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlZhbGlkIHNraXAgbGluayBmb3VuZFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiTm8gdmFsaWQgc2tpcCBsaW5rIGZvdW5kXCJ9fX0sXCJoZWFkZXItcHJlc2VudFwiOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJQYWdlIGhhcyBhIGhlYWRlclwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiUGFnZSBkb2VzIG5vdCBoYXZlIGEgaGVhZGVyXCJ9fX0sbGFuZG1hcms6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlBhZ2UgaGFzIGEgbGFuZG1hcmsgcmVnaW9uXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJQYWdlIGRvZXMgbm90IGhhdmUgYSBsYW5kbWFyayByZWdpb25cIn19fSxcImdyb3VwLWxhYmVsbGVkYnlcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm4nQWxsIGVsZW1lbnRzIHdpdGggdGhlIG5hbWUgXCInK2EuZGF0YS5uYW1lKydcIiByZWZlcmVuY2UgdGhlIHNhbWUgZWxlbWVudCB3aXRoIGFyaWEtbGFiZWxsZWRieSd9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuJ0FsbCBlbGVtZW50cyB3aXRoIHRoZSBuYW1lIFwiJythLmRhdGEubmFtZSsnXCIgZG8gbm90IHJlZmVyZW5jZSB0aGUgc2FtZSBlbGVtZW50IHdpdGggYXJpYS1sYWJlbGxlZGJ5J319fSxmaWVsZHNldDp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaXMgY29udGFpbmVkIGluIGEgZmllbGRzZXRcIn0sZmFpbDpmdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9YS5kYXRhJiZhLmRhdGEuZmFpbHVyZUNvZGU7cmV0dXJuIGIrPVwibm8tbGVnZW5kXCI9PT1jP1wiRmllbGRzZXQgZG9lcyBub3QgaGF2ZSBhIGxlZ2VuZCBhcyBpdHMgZmlyc3QgY2hpbGRcIjpcImVtcHR5LWxlZ2VuZFwiPT09Yz9cIkxlZ2VuZCBkb2VzIG5vdCBoYXZlIHRleHQgdGhhdCBpcyB2aXNpYmxlIHRvIHNjcmVlbiByZWFkZXJzXCI6XCJtaXhlZC1pbnB1dHNcIj09PWM/XCJGaWVsZHNldCBjb250YWlucyB1bnJlbGF0ZWQgaW5wdXRzXCI6XCJuby1ncm91cC1sYWJlbFwiPT09Yz9cIkFSSUEgZ3JvdXAgZG9lcyBub3QgaGF2ZSBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVwiOlwiZ3JvdXAtbWl4ZWQtaW5wdXRzXCI9PT1jP1wiQVJJQSBncm91cCBjb250YWlucyB1bnJlbGF0ZWQgaW5wdXRzXCI6XCJFbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb250YWluaW5nIGZpZWxkc2V0IG9yIEFSSUEgZ3JvdXBcIn19fSxcImNvbG9yLWNvbnRyYXN0XCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIHN1ZmZpY2llbnQgY29sb3IgY29udHJhc3Qgb2YgXCIrYS5kYXRhLmNvbnRyYXN0UmF0aW99LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGhhcyBpbnN1ZmZpY2llbnQgY29sb3IgY29udHJhc3Qgb2YgXCIrYS5kYXRhLmNvbnRyYXN0UmF0aW8rXCIgKGZvcmVncm91bmQgY29sb3I6IFwiK2EuZGF0YS5mZ0NvbG9yK1wiLCBiYWNrZ3JvdW5kIGNvbG9yOiBcIithLmRhdGEuYmdDb2xvcitcIiwgZm9udCBzaXplOiBcIithLmRhdGEuZm9udFNpemUrXCIsIGZvbnQgd2VpZ2h0OiBcIithLmRhdGEuZm9udFdlaWdodCtcIikuIEV4cGVjdGVkIGNvbnRyYXN0IHJhdGlvIG9mIFwiK2EuZGF0YS5leHBlY3RlZENvbnRyYXN0UmF0aW99LGluY29tcGxldGU6e2JnSW1hZ2U6XCJFbGVtZW50J3MgYmFja2dyb3VuZCBjb2xvciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBkdWUgdG8gYSBiYWNrZ3JvdW5kIGltYWdlXCIsYmdHcmFkaWVudDpcIkVsZW1lbnQncyBiYWNrZ3JvdW5kIGNvbG9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGR1ZSB0byBhIGJhY2tncm91bmQgZ3JhZGllbnRcIixpbWdOb2RlOlwiRWxlbWVudCdzIGJhY2tncm91bmQgY29sb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgYmVjYXVzZSBlbGVtZW50IGNvbnRhaW5zIGFuIGltYWdlIG5vZGVcIixiZ092ZXJsYXA6XCJFbGVtZW50J3MgYmFja2dyb3VuZCBjb2xvciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBiZWNhdXNlIGl0IGlzIG92ZXJsYXBwZWQgYnkgYW5vdGhlciBlbGVtZW50XCIsZmdBbHBoYTpcIkVsZW1lbnQncyBmb3JlZ3JvdW5kIGNvbG9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGJlY2F1c2Ugb2YgYWxwaGEgdHJhbnNwYXJlbmN5XCIsZWxtUGFydGlhbGx5T2JzY3VyZWQ6XCJFbGVtZW50J3MgYmFja2dyb3VuZCBjb2xvciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBiZWNhdXNlIGl0J3MgcGFydGlhbGx5IG9ic2N1cmVkIGJ5IGFub3RoZXIgZWxlbWVudFwiLGVsbVBhcnRpYWxseU9ic2N1cmluZzpcIkVsZW1lbnQncyBiYWNrZ3JvdW5kIGNvbG9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGJlY2F1c2UgaXQgcGFydGlhbGx5IG92ZXJsYXBzIG90aGVyIGVsZW1lbnRzXCIsb3V0c2lkZVZpZXdwb3J0OlwiRWxlbWVudCdzIGJhY2tncm91bmQgY29sb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgYmVjYXVzZSBpdCdzIG91dHNpZGUgdGhlIHZpZXdwb3J0XCIsZXF1YWxSYXRpbzpcIkVsZW1lbnQgaGFzIGEgMToxIGNvbnRyYXN0IHJhdGlvIHdpdGggdGhlIGJhY2tncm91bmRcIixkZWZhdWx0OlwiVW5hYmxlIHRvIGRldGVybWluZSBjb250cmFzdCByYXRpb1wifX19LFwic3RydWN0dXJlZC1kbGl0ZW1zXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIldoZW4gbm90IGVtcHR5LCBlbGVtZW50IGhhcyBib3RoIDxkdD4gYW5kIDxkZD4gZWxlbWVudHNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIldoZW4gbm90IGVtcHR5LCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYXQgbGVhc3Qgb25lIDxkdD4gZWxlbWVudCBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgPGRkPiBlbGVtZW50XCJ9fX0sXCJvbmx5LWRsaXRlbXNcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiTGlzdCBlbGVtZW50IG9ubHkgaGFzIGRpcmVjdCBjaGlsZHJlbiB0aGF0IGFyZSBhbGxvd2VkIGluc2lkZSA8ZHQ+IG9yIDxkZD4gZWxlbWVudHNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkxpc3QgZWxlbWVudCBoYXMgZGlyZWN0IGNoaWxkcmVuIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluc2lkZSA8ZHQ+IG9yIDxkZD4gZWxlbWVudHNcIn19fSxkbGl0ZW06e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkRlc2NyaXB0aW9uIGxpc3QgaXRlbSBoYXMgYSA8ZGw+IHBhcmVudCBlbGVtZW50XCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJEZXNjcmlwdGlvbiBsaXN0IGl0ZW0gZG9lcyBub3QgaGF2ZSBhIDxkbD4gcGFyZW50IGVsZW1lbnRcIn19fSxcImRvYy1oYXMtdGl0bGVcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRG9jdW1lbnQgaGFzIGEgbm9uLWVtcHR5IDx0aXRsZT4gZWxlbWVudFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiRG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhIG5vbi1lbXB0eSA8dGl0bGU+IGVsZW1lbnRcIn19fSxcImR1cGxpY2F0ZS1pZFwiOntpbXBhY3Q6XCJtb2RlcmF0ZVwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRG9jdW1lbnQgaGFzIG5vIGVsZW1lbnRzIHRoYXQgc2hhcmUgdGhlIHNhbWUgaWQgYXR0cmlidXRlXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJEb2N1bWVudCBoYXMgbXVsdGlwbGUgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBpZCBhdHRyaWJ1dGU6IFwiK2EuZGF0YX19fSxcImhhcy12aXNpYmxlLXRleHRcIjp7aW1wYWN0OlwibWlub3JcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIHRleHQgdGhhdCBpcyB2aXNpYmxlIHRvIHNjcmVlbiByZWFkZXJzXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGRvZXMgbm90IGhhdmUgdGV4dCB0aGF0IGlzIHZpc2libGUgdG8gc2NyZWVuIHJlYWRlcnNcIn19fSxcImhhcy13aWRnZXQtcm9sZVwiOntpbXBhY3Q6XCJtaW5vclwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZS5cIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHdpZGdldCByb2xlLlwifX19LFwidmFsaWQtc2Nyb2xsYWJsZS1zZW1hbnRpY3NcIjp7aW1wYWN0OlwibWlub3JcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIHZhbGlkIHNlbWFudGljcyBmb3IgYW4gZWxlbWVudCBpbiB0aGUgZm9jdXMgb3JkZXIuXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGhhcyBpbnZhbGlkIHNlbWFudGljcyBmb3IgYW4gZWxlbWVudCBpbiB0aGUgZm9jdXMgb3JkZXIuXCJ9fX0sXCJ1bmlxdWUtZnJhbWUtdGl0bGVcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCdzIHRpdGxlIGF0dHJpYnV0ZSBpcyB1bmlxdWVcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQncyB0aXRsZSBhdHRyaWJ1dGUgaXMgbm90IHVuaXF1ZVwifX19LFwiaGVhZGluZy1vcmRlclwiOntpbXBhY3Q6XCJtb2RlcmF0ZVwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiSGVhZGluZyBvcmRlciB2YWxpZFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiSGVhZGluZyBvcmRlciBpbnZhbGlkXCJ9fX0sXCJoaWRkZW4tY29udGVudFwiOntpbXBhY3Q6XCJtaW5vclwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQWxsIGNvbnRlbnQgb24gdGhlIHBhZ2UgaGFzIGJlZW4gYW5hbHl6ZWQuXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGVyZSB3ZXJlIHByb2JsZW1zIGFuYWx5emluZyB0aGUgY29udGVudCBvbiB0aGlzIHBhZ2UuXCJ9LGluY29tcGxldGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGVyZSBpcyBoaWRkZW4gY29udGVudCBvbiB0aGUgcGFnZSB0aGF0IHdhcyBub3QgYW5hbHl6ZWQuIFlvdSB3aWxsIG5lZWQgdG8gdHJpZ2dlciB0aGUgZGlzcGxheSBvZiB0aGlzIGNvbnRlbnQgaW4gb3JkZXIgdG8gYW5hbHl6ZSBpdC5cIn19fSxcImhhcy1sYW5nXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSA8aHRtbD4gZWxlbWVudCBoYXMgYSBsYW5nIGF0dHJpYnV0ZVwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiVGhlIDxodG1sPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBsYW5nIGF0dHJpYnV0ZVwifX19LFwidmFsaWQtbGFuZ1wiOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJWYWx1ZSBvZiBsYW5nIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiB2YWxpZCBsYW5ndWFnZXNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIlZhbHVlIG9mIGxhbmcgYXR0cmlidXRlIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiB2YWxpZCBsYW5ndWFnZXNcIn19fSxcImhhcy1hbHRcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIGFuIGFsdCBhdHRyaWJ1dGVcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhbHQgYXR0cmlidXRlXCJ9fX0sXCJkdXBsaWNhdGUtaW1nLWxhYmVsXCI6e2ltcGFjdDpcIm1pbm9yXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGRvZXMgbm90IGR1cGxpY2F0ZSBleGlzdGluZyB0ZXh0IGluIDxpbWc+IGFsdCB0ZXh0XCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJFbGVtZW50IGNvbnRhaW5zIDxpbWc+IGVsZW1lbnQgd2l0aCBhbHQgdGV4dCB0aGF0IGR1cGxpY2F0ZXMgZXhpc3RpbmcgdGV4dFwifX19LFwidGl0bGUtb25seVwiOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJGb3JtIGVsZW1lbnQgZG9lcyBub3Qgc29sZWx5IHVzZSB0aXRsZSBhdHRyaWJ1dGUgZm9yIGl0cyBsYWJlbFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiT25seSB0aXRsZSB1c2VkIHRvIGdlbmVyYXRlIGxhYmVsIGZvciBmb3JtIGVsZW1lbnRcIn19fSxcImltcGxpY2l0LWxhYmVsXCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJGb3JtIGVsZW1lbnQgaGFzIGFuIGltcGxpY2l0ICh3cmFwcGVkKSA8bGFiZWw+XCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJGb3JtIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbXBsaWNpdCAod3JhcHBlZCkgPGxhYmVsPlwifX19LFwiZXhwbGljaXQtbGFiZWxcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkZvcm0gZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgPGxhYmVsPlwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiRm9ybSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgPGxhYmVsPlwifX19LFwiaGVscC1zYW1lLWFzLWxhYmVsXCI6e2ltcGFjdDpcIm1pbm9yXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJIZWxwIHRleHQgKHRpdGxlIG9yIGFyaWEtZGVzY3JpYmVkYnkpIGRvZXMgbm90IGR1cGxpY2F0ZSBsYWJlbCB0ZXh0XCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJIZWxwIHRleHQgKHRpdGxlIG9yIGFyaWEtZGVzY3JpYmVkYnkpIHRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIGxhYmVsIHRleHRcIn19fSxcIm11bHRpcGxlLWxhYmVsXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkZvcm0gZWxlbWVudCBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIDxsYWJlbD4gZWxlbWVudHNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkZvcm0gZWxlbWVudCBoYXMgbXVsdGlwbGUgPGxhYmVsPiBlbGVtZW50c1wifX19LFwibWFpbi1pcy10b3AtbGV2ZWxcIjp7aW1wYWN0OlwibW9kZXJhdGVcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSBtYWluIGxhbmRtYXJrIGlzIGF0IHRoZSB0b3AgbGV2ZWwuXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGUgbWFpbiBsYW5kbWFyayBpcyBjb250YWluZWQgaW4gYW5vdGhlciBsYW5kbWFyay5cIn19fSxcImhhcy1hdC1sZWFzdC1vbmUtbWFpblwiOntpbXBhY3Q6XCJtb2RlcmF0ZVwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRG9jdW1lbnQgaGFzIGF0IGxlYXN0IG9uZSBtYWluIGxhbmRtYXJrXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJEb2N1bWVudCBoYXMgbm8gbWFpbiBsYW5kbWFya3NcIn19fSxcImhhcy1uby1tb3JlLXRoYW4tb25lLW1haW5cIjp7aW1wYWN0OlwibW9kZXJhdGVcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkRvY3VtZW50IGhhcyBubyBtb3JlIHRoYW4gb25lIG1haW4gbGFuZG1hcmtcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkRvY3VtZW50IGhhcyBtb3JlIHRoYW4gb25lIG1haW4gbGFuZG1hcmtcIn19fSxcImhhcy10aFwiOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJMYXlvdXQgdGFibGUgZG9lcyBub3QgdXNlIDx0aD4gZWxlbWVudHNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkxheW91dCB0YWJsZSB1c2VzIDx0aD4gZWxlbWVudHNcIn19fSxcImhhcy1jYXB0aW9uXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkxheW91dCB0YWJsZSBkb2VzIG5vdCB1c2UgPGNhcHRpb24+IGVsZW1lbnRcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkxheW91dCB0YWJsZSB1c2VzIDxjYXB0aW9uPiBlbGVtZW50XCJ9fX0sXCJoYXMtc3VtbWFyeVwiOntpbXBhY3Q6XCJzZXJpb3VzXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJMYXlvdXQgdGFibGUgZG9lcyBub3QgdXNlIHN1bW1hcnkgYXR0cmlidXRlXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJMYXlvdXQgdGFibGUgdXNlcyBzdW1tYXJ5IGF0dHJpYnV0ZVwifX19LFwibGluay1pbi10ZXh0LWJsb2NrXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkxpbmtzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gc3Vycm91bmRpbmcgdGV4dCBpbiBzb21lIHdheSBvdGhlciB0aGFuIGJ5IGNvbG9yXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJMaW5rcyBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBzdXJyb3VuZGluZyB0ZXh0IGluIHNvbWUgd2F5IG90aGVyIHRoYW4gYnkgY29sb3JcIn0saW5jb21wbGV0ZTp7YmdDb250cmFzdDpcIkVsZW1lbnQncyBjb250cmFzdCByYXRpbyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gQ2hlY2sgZm9yIGEgZGlzdGluY3QgaG92ZXIvZm9jdXMgc3R5bGVcIixiZ0ltYWdlOlwiRWxlbWVudCdzIGNvbnRyYXN0IHJhdGlvIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGR1ZSB0byBhIGJhY2tncm91bmQgaW1hZ2VcIixiZ0dyYWRpZW50OlwiRWxlbWVudCdzIGNvbnRyYXN0IHJhdGlvIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGR1ZSB0byBhIGJhY2tncm91bmQgZ3JhZGllbnRcIixpbWdOb2RlOlwiRWxlbWVudCdzIGNvbnRyYXN0IHJhdGlvIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGJlY2F1c2UgZWxlbWVudCBjb250YWlucyBhbiBpbWFnZSBub2RlXCIsYmdPdmVybGFwOlwiRWxlbWVudCdzIGNvbnRyYXN0IHJhdGlvIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGJlY2F1c2Ugb2YgZWxlbWVudCBvdmVybGFwXCIsZGVmYXVsdDpcIlVuYWJsZSB0byBkZXRlcm1pbmUgY29udHJhc3QgcmF0aW9cIn19fSxcIm9ubHktbGlzdGl0ZW1zXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkxpc3QgZWxlbWVudCBvbmx5IGhhcyBkaXJlY3QgY2hpbGRyZW4gdGhhdCBhcmUgYWxsb3dlZCBpbnNpZGUgPGxpPiBlbGVtZW50c1wifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiTGlzdCBlbGVtZW50IGhhcyBkaXJlY3QgY2hpbGRyZW4gdGhhdCBhcmUgbm90IGFsbG93ZWQgaW5zaWRlIDxsaT4gZWxlbWVudHNcIn19fSxsaXN0aXRlbTp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVybidMaXN0IGl0ZW0gaGFzIGEgPHVsPiwgPG9sPiBvciByb2xlPVwibGlzdFwiIHBhcmVudCBlbGVtZW50J30sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm4nTGlzdCBpdGVtIGRvZXMgbm90IGhhdmUgYSA8dWw+LCA8b2w+IG9yIHJvbGU9XCJsaXN0XCIgcGFyZW50IGVsZW1lbnQnfX19LFwibWV0YS1yZWZyZXNoXCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCI8bWV0YT4gdGFnIGRvZXMgbm90IGltbWVkaWF0ZWx5IHJlZnJlc2ggdGhlIHBhZ2VcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIjxtZXRhPiB0YWcgZm9yY2VzIHRpbWVkIHJlZnJlc2ggb2YgcGFnZVwifX19LFwibWV0YS12aWV3cG9ydC1sYXJnZVwiOntpbXBhY3Q6XCJtaW5vclwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe1xucmV0dXJuXCI8bWV0YT4gdGFnIGRvZXMgbm90IHByZXZlbnQgc2lnbmlmaWNhbnQgem9vbWluZyBvbiBtb2JpbGUgZGV2aWNlc1wifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiPG1ldGE+IHRhZyBsaW1pdHMgem9vbWluZyBvbiBtb2JpbGUgZGV2aWNlc1wifX19LFwibWV0YS12aWV3cG9ydFwiOntpbXBhY3Q6XCJjcml0aWNhbFwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiPG1ldGE+IHRhZyBkb2VzIG5vdCBkaXNhYmxlIHpvb21pbmcgb24gbW9iaWxlIGRldmljZXNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIjxtZXRhPiB0YWcgZGlzYWJsZXMgem9vbWluZyBvbiBtb2JpbGUgZGV2aWNlc1wifX19LFwicC1hcy1oZWFkaW5nXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIjxwPiBlbGVtZW50cyBhcmUgbm90IHN0eWxlZCBhcyBoZWFkaW5nc1wifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiSGVhZGluZyBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHN0eWxlZCBwIGVsZW1lbnRzXCJ9fX0scmVnaW9uOntpbXBhY3Q6XCJtb2RlcmF0ZVwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQ29udGVudCBjb250YWluZWQgYnkgQVJJQSBsYW5kbWFya1wifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiQ29udGVudCBub3QgY29udGFpbmVkIGJ5IGFuIEFSSUEgbGFuZG1hcmtcIn19fSxcImh0bWw1LXNjb3BlXCI6e2ltcGFjdDpcIm1vZGVyYXRlXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJTY29wZSBhdHRyaWJ1dGUgaXMgb25seSB1c2VkIG9uIHRhYmxlIGhlYWRlciBlbGVtZW50cyAoPHRoPilcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkluIEhUTUwgNSwgc2NvcGUgYXR0cmlidXRlcyBtYXkgb25seSBiZSB1c2VkIG9uIHRhYmxlIGhlYWRlciBlbGVtZW50cyAoPHRoPilcIn19fSxcInNjb3BlLXZhbHVlXCI6e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJTY29wZSBhdHRyaWJ1dGUgaXMgdXNlZCBjb3JyZWN0bHlcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSB2YWx1ZSBvZiB0aGUgc2NvcGUgYXR0cmlidXRlIG1heSBvbmx5IGJlICdyb3cnIG9yICdjb2wnXCJ9fX0sZXhpc3RzOntpbXBhY3Q6XCJtaW5vclwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBkb2VzIG5vdCBleGlzdFwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBleGlzdHNcIn19fSxcInNraXAtbGlua1wiOntpbXBhY3Q6XCJtb2RlcmF0ZVwiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiU2tpcCBsaW5rIHRhcmdldCBleGlzdHNcIn0saW5jb21wbGV0ZTpmdW5jdGlvbihhKXtyZXR1cm5cIlNraXAgbGluayB0YXJnZXQgc2hvdWxkIGJlY29tZSB2aXNpYmxlIG9uIGFjdGl2YXRpb25cIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIk5vIHNraXAgbGluayB0YXJnZXRcIn19fSx0YWJpbmRleDp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiRWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggZ3JlYXRlciB0aGFuIDBcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIkVsZW1lbnQgaGFzIGEgdGFiaW5kZXggZ3JlYXRlciB0aGFuIDBcIn19fSxcInNhbWUtY2FwdGlvbi1zdW1tYXJ5XCI6e2ltcGFjdDpcIm1pbm9yXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJDb250ZW50IG9mIHN1bW1hcnkgYXR0cmlidXRlIGFuZCA8Y2FwdGlvbj4gYXJlIG5vdCBkdXBsaWNhdGVkXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJDb250ZW50IG9mIHN1bW1hcnkgYXR0cmlidXRlIGFuZCA8Y2FwdGlvbj4gZWxlbWVudCBhcmUgaWRlbnRpY2FsXCJ9fX0sXCJjYXB0aW9uLWZha2VkXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSBmaXJzdCByb3cgb2YgYSB0YWJsZSBpcyBub3QgdXNlZCBhcyBhIGNhcHRpb25cIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSBmaXJzdCByb3cgb2YgdGhlIHRhYmxlIHNob3VsZCBiZSBhIGNhcHRpb24gaW5zdGVhZCBvZiBhIHRhYmxlIGNlbGxcIn19fSxcInRkLWhhcy1oZWFkZXJcIjp7aW1wYWN0OlwiY3JpdGljYWxcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIkFsbCBub24tZW1wdHkgZGF0YSBjZWxscyBoYXZlIHRhYmxlIGhlYWRlcnNcIn0sZmFpbDpmdW5jdGlvbihhKXtyZXR1cm5cIlNvbWUgbm9uLWVtcHR5IGRhdGEgY2VsbHMgZG8gbm90IGhhdmUgdGFibGUgaGVhZGVyc1wifX19LFwidGQtaGVhZGVycy1hdHRyXCI6e2ltcGFjdDpcInNlcmlvdXNcIixtZXNzYWdlczp7cGFzczpmdW5jdGlvbihhKXtyZXR1cm5cIlRoZSBoZWFkZXJzIGF0dHJpYnV0ZSBpcyBleGNsdXNpdmVseSB1c2VkIHRvIHJlZmVyIHRvIG90aGVyIGNlbGxzIGluIHRoZSB0YWJsZVwifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiVGhlIGhlYWRlcnMgYXR0cmlidXRlIGlzIG5vdCBleGNsdXNpdmVseSB1c2VkIHRvIHJlZmVyIHRvIG90aGVyIGNlbGxzIGluIHRoZSB0YWJsZVwifX19LFwidGgtaGFzLWRhdGEtY2VsbHNcIjp7aW1wYWN0Olwic2VyaW91c1wiLG1lc3NhZ2VzOntwYXNzOmZ1bmN0aW9uKGEpe3JldHVyblwiQWxsIHRhYmxlIGhlYWRlciBjZWxscyByZWZlciB0byBkYXRhIGNlbGxzXCJ9LGZhaWw6ZnVuY3Rpb24oYSl7cmV0dXJuXCJOb3QgYWxsIHRhYmxlIGhlYWRlciBjZWxscyByZWZlciB0byBkYXRhIGNlbGxzXCJ9LGluY29tcGxldGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUYWJsZSBkYXRhIGNlbGxzIGFyZSBtaXNzaW5nIG9yIGVtcHR5XCJ9fX0sZGVzY3JpcHRpb246e2ltcGFjdDpcImNyaXRpY2FsXCIsbWVzc2FnZXM6e3Bhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuXCJUaGUgbXVsdGltZWRpYSBlbGVtZW50IGhhcyBhbiBhdWRpbyBkZXNjcmlwdGlvbiB0cmFja1wifSxmYWlsOmZ1bmN0aW9uKGEpe3JldHVyblwiVGhlIG11bHRpbWVkaWEgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGF1ZGlvIGRlc2NyaXB0aW9uIHRyYWNrXCJ9LGluY29tcGxldGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJBbiBhdWRpbyBkZXNjcmlwdGlvbiB0cmFjayBmb3IgdGhpcyBlbGVtZW50IGNvdWxkIG5vdCBiZSBmb3VuZFwifX19fSxmYWlsdXJlU3VtbWFyaWVzOnthbnk6e2ZhaWx1cmVNZXNzYWdlOmZ1bmN0aW9uKGEpe3ZhciBiPVwiRml4IGFueSBvZiB0aGUgZm9sbG93aW5nOlwiLGM9YTtpZihjKWZvcih2YXIgZCxlPS0xLGY9Yy5sZW5ndGgtMTtlPGY7KWQ9Y1tlKz0xXSxiKz1cIlxcbiAgXCIrZC5zcGxpdChcIlxcblwiKS5qb2luKFwiXFxuICBcIik7cmV0dXJuIGJ9fSxub25lOntmYWlsdXJlTWVzc2FnZTpmdW5jdGlvbihhKXt2YXIgYj1cIkZpeCBhbGwgb2YgdGhlIGZvbGxvd2luZzpcIixjPWE7aWYoYylmb3IodmFyIGQsZT0tMSxmPWMubGVuZ3RoLTE7ZTxmOylkPWNbZSs9MV0sYis9XCJcXG4gIFwiK2Quc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgXCIpO3JldHVybiBifX19LGluY29tcGxldGVGYWxsYmFja01lc3NhZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuXCJhWGUgY291bGRuJ3QgdGVsbCB0aGUgcmVhc29uLiBUaW1lIHRvIGJyZWFrIG91dCB0aGUgZWxlbWVudCBpbnNwZWN0b3IhXCJ9fSxydWxlczpbe2lkOlwiYWNjZXNza2V5c1wiLHNlbGVjdG9yOlwiW2FjY2Vzc2tleV1cIixleGNsdWRlSGlkZGVuOiExLHRhZ3M6W1wid2NhZzJhXCIsXCJ3Y2FnMjExXCIsXCJjYXQua2V5Ym9hcmRcIl0sYWxsOltdLGFueTpbXSxub25lOltcImFjY2Vzc2tleXNcIl19LHtpZDpcImFyZWEtYWx0XCIsc2VsZWN0b3I6XCJtYXAgYXJlYVtocmVmXVwiLGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzExMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W1wibm9uLWVtcHR5LWFsdFwiLFwibm9uLWVtcHR5LXRpdGxlXCIsXCJhcmlhLWxhYmVsXCIsXCJhcmlhLWxhYmVsbGVkYnlcIl0sbm9uZTpbXX0se2lkOlwiYXJpYS1hbGxvd2VkLWF0dHJcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO2N8fChjPWF4ZS5jb21tb25zLmFyaWEuaW1wbGljaXRSb2xlKGEpKTt2YXIgZD1heGUuY29tbW9ucy5hcmlhLmFsbG93ZWRBdHRyKGMpO2lmKGMmJmQpe3ZhciBlPS9eYXJpYS0vO2lmKGEuaGFzQXR0cmlidXRlcygpKWZvcih2YXIgZj1hLmF0dHJpYnV0ZXMsZz0wLGg9Zi5sZW5ndGg7ZzxoO2crKylpZihlLnRlc3QoZltnXS5uYW1lKSlyZXR1cm4hMH1yZXR1cm4hMX0sdGFnczpbXCJjYXQuYXJpYVwiLFwid2NhZzJhXCIsXCJ3Y2FnNDExXCIsXCJ3Y2FnNDEyXCJdLGFsbDpbXSxhbnk6W1wiYXJpYS1hbGxvd2VkLWF0dHJcIl0sbm9uZTpbXX0se2lkOlwiYXJpYS1oaWRkZW4tYm9keVwiLHNlbGVjdG9yOlwiYm9keVwiLGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJjYXQuYXJpYVwiLFwid2NhZzJhXCIsXCJ3Y2FnNDEyXCJdLGFsbDpbXSxhbnk6W1wiYXJpYS1oaWRkZW4tYm9keVwiXSxub25lOltdfSx7aWQ6XCJhcmlhLXJlcXVpcmVkLWF0dHJcIixzZWxlY3RvcjpcIltyb2xlXVwiLHRhZ3M6W1wiY2F0LmFyaWFcIixcIndjYWcyYVwiLFwid2NhZzQxMVwiLFwid2NhZzQxMlwiXSxhbGw6W10sYW55OltcImFyaWEtcmVxdWlyZWQtYXR0clwiXSxub25lOltdfSx7aWQ6XCJhcmlhLXJlcXVpcmVkLWNoaWxkcmVuXCIsc2VsZWN0b3I6XCJbcm9sZV1cIix0YWdzOltcImNhdC5hcmlhXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIl0sYWxsOltdLGFueTpbXCJhcmlhLXJlcXVpcmVkLWNoaWxkcmVuXCJdLG5vbmU6W119LHtpZDpcImFyaWEtcmVxdWlyZWQtcGFyZW50XCIsc2VsZWN0b3I6XCJbcm9sZV1cIix0YWdzOltcImNhdC5hcmlhXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIl0sYWxsOltdLGFueTpbXCJhcmlhLXJlcXVpcmVkLXBhcmVudFwiXSxub25lOltdfSx7aWQ6XCJhcmlhLXJvbGVzXCIsc2VsZWN0b3I6XCJbcm9sZV1cIix0YWdzOltcImNhdC5hcmlhXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIixcIndjYWc0MTFcIixcIndjYWc0MTJcIl0sYWxsOltdLGFueTpbXSxub25lOltcImludmFsaWRyb2xlXCIsXCJhYnN0cmFjdHJvbGVcIl19LHtpZDpcImFyaWEtdmFsaWQtYXR0ci12YWx1ZVwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYz0vXmFyaWEtLztpZihhLmhhc0F0dHJpYnV0ZXMoKSlmb3IodmFyIGQ9YS5hdHRyaWJ1dGVzLGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspaWYoYy50ZXN0KGRbZV0ubmFtZSkpcmV0dXJuITA7cmV0dXJuITF9LHRhZ3M6W1wiY2F0LmFyaWFcIixcIndjYWcyYVwiLFwid2NhZzEzMVwiLFwid2NhZzQxMVwiLFwid2NhZzQxMlwiXSxhbGw6W3tvcHRpb25zOltdLGlkOlwiYXJpYS12YWxpZC1hdHRyLXZhbHVlXCJ9LFwiYXJpYS1lcnJvcm1lc3NhZ2VcIl0sYW55OltdLG5vbmU6W119LHtpZDpcImFyaWEtdmFsaWQtYXR0clwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYz0vXmFyaWEtLztpZihhLmhhc0F0dHJpYnV0ZXMoKSlmb3IodmFyIGQ9YS5hdHRyaWJ1dGVzLGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspaWYoYy50ZXN0KGRbZV0ubmFtZSkpcmV0dXJuITA7cmV0dXJuITF9LHRhZ3M6W1wiY2F0LmFyaWFcIixcIndjYWcyYVwiLFwid2NhZzQxMVwiXSxhbGw6W10sYW55Olt7b3B0aW9uczpbXSxpZDpcImFyaWEtdmFsaWQtYXR0clwifV0sbm9uZTpbXX0se2lkOlwiYXVkaW8tY2FwdGlvblwiLHNlbGVjdG9yOlwiYXVkaW9cIixleGNsdWRlSGlkZGVuOiExLHRhZ3M6W1wiY2F0LnRpbWUtYW5kLW1lZGlhXCIsXCJ3Y2FnMmFcIixcIndjYWcxMjFcIixcInNlY3Rpb241MDhcIixcInNlY3Rpb241MDguMjIuYVwiXSxhbGw6W10sYW55OltdLG5vbmU6W1wiY2FwdGlvblwiXX0se2lkOlwiYmxpbmtcIixzZWxlY3RvcjpcImJsaW5rXCIsZXhjbHVkZUhpZGRlbjohMSx0YWdzOltcImNhdC50aW1lLWFuZC1tZWRpYVwiLFwid2NhZzJhXCIsXCJ3Y2FnMjIyXCIsXCJzZWN0aW9uNTA4XCIsXCJzZWN0aW9uNTA4LjIyLmpcIl0sYWxsOltdLGFueTpbXSxub25lOltcImlzLW9uLXNjcmVlblwiXX0se2lkOlwiYnV0dG9uLW5hbWVcIixzZWxlY3RvcjonYnV0dG9uLCBbcm9sZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgaW5wdXRbdHlwZT1cInJlc2V0XCJdJyx0YWdzOltcImNhdC5uYW1lLXJvbGUtdmFsdWVcIixcIndjYWcyYVwiLFwid2NhZzQxMlwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W1wibm9uLWVtcHR5LWlmLXByZXNlbnRcIixcIm5vbi1lbXB0eS12YWx1ZVwiLFwiYnV0dG9uLWhhcy12aXNpYmxlLXRleHRcIixcImFyaWEtbGFiZWxcIixcImFyaWEtbGFiZWxsZWRieVwiLFwicm9sZS1wcmVzZW50YXRpb25cIixcInJvbGUtbm9uZVwiXSxub25lOltcImZvY3VzYWJsZS1uby1uYW1lXCJdfSx7aWQ6XCJieXBhc3NcIixzZWxlY3RvcjpcImh0bWxcIixwYWdlTGV2ZWw6ITAsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3JldHVybiEhYS5xdWVyeVNlbGVjdG9yKFwiYVtocmVmXVwiKX0sdGFnczpbXCJjYXQua2V5Ym9hcmRcIixcIndjYWcyYVwiLFwid2NhZzI0MVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5vXCJdLGFsbDpbXSxhbnk6W1wiaW50ZXJuYWwtbGluay1wcmVzZW50XCIsXCJoZWFkZXItcHJlc2VudFwiLFwibGFuZG1hcmtcIl0sbm9uZTpbXX0se2lkOlwiY2hlY2tib3hncm91cFwiLHNlbGVjdG9yOlwiaW5wdXRbdHlwZT1jaGVja2JveF1bbmFtZV1cIix0YWdzOltcImNhdC5mb3Jtc1wiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltcImdyb3VwLWxhYmVsbGVkYnlcIixcImZpZWxkc2V0XCJdLG5vbmU6W119LHtpZDpcImNvbG9yLWNvbnRyYXN0XCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3ZhciBjPWEubm9kZU5hbWUudG9VcHBlckNhc2UoKSxkPWEudHlwZTtpZihcInRydWVcIj09PWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKXx8YXhlLmNvbW1vbnMuZG9tLmZpbmRVcFZpcnR1YWwoYiwnW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdJykpcmV0dXJuITE7aWYoXCJJTlBVVFwiPT09YylyZXR1cm4tMT09PVtcImhpZGRlblwiLFwicmFuZ2VcIixcImNvbG9yXCIsXCJjaGVja2JveFwiLFwicmFkaW9cIixcImltYWdlXCJdLmluZGV4T2YoZCkmJiFhLmRpc2FibGVkO2lmKFwiU0VMRUNUXCI9PT1jKXJldHVybiEhYS5vcHRpb25zLmxlbmd0aCYmIWEuZGlzYWJsZWQ7aWYoXCJURVhUQVJFQVwiPT09YylyZXR1cm4hYS5kaXNhYmxlZDtpZihcIk9QVElPTlwiPT09YylyZXR1cm4hMTtpZihcIkJVVFRPTlwiPT09YyYmYS5kaXNhYmxlZHx8YXhlLmNvbW1vbnMuZG9tLmZpbmRVcFZpcnR1YWwoYixcImJ1dHRvbltkaXNhYmxlZF1cIikpcmV0dXJuITE7aWYoXCJGSUVMRFNFVFwiPT09YyYmYS5kaXNhYmxlZHx8YXhlLmNvbW1vbnMuZG9tLmZpbmRVcFZpcnR1YWwoYixcImZpZWxkc2V0W2Rpc2FibGVkXVwiKSlyZXR1cm4hMTt2YXIgZT1heGUuY29tbW9ucy5kb20uZmluZFVwVmlydHVhbChiLFwibGFiZWxcIik7aWYoXCJMQUJFTFwiPT09Y3x8ZSl7dmFyIGY9YSxnPWI7ZSYmKGY9ZSxnPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGUpKTt2YXIgaD1heGUuY29tbW9ucy5kb20uZ2V0Um9vdE5vZGUoZiksaT1mLmh0bWxGb3ImJmguZ2V0RWxlbWVudEJ5SWQoZi5odG1sRm9yKTtpZihpJiZpLmRpc2FibGVkKXJldHVybiExO3ZhciBpPWF4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsKGcsJ2lucHV0Om5vdChbdHlwZT1cImhpZGRlblwiXSk6bm90KFt0eXBlPVwiaW1hZ2VcIl0pOm5vdChbdHlwZT1cImJ1dHRvblwiXSk6bm90KFt0eXBlPVwic3VibWl0XCJdKTpub3QoW3R5cGU9XCJyZXNldFwiXSksIHNlbGVjdCwgdGV4dGFyZWEnKTtpZihpLmxlbmd0aCYmaVswXS5hY3R1YWxOb2RlLmRpc2FibGVkKXJldHVybiExfWlmKGEuZ2V0QXR0cmlidXRlKFwiaWRcIikpe3ZhciBqPWF4ZS5jb21tb25zLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGEuZ2V0QXR0cmlidXRlKFwiaWRcIikpLGs9YXhlLmNvbW1vbnMuZG9tLmdldFJvb3ROb2RlKGEpLGk9ay5xdWVyeVNlbGVjdG9yKFwiW2FyaWEtbGFiZWxsZWRieX49XCIraitcIl1cIik7aWYoaSYmaS5kaXNhYmxlZClyZXR1cm4hMX1pZihcIlwiPT09YXhlLmNvbW1vbnMudGV4dC52aXNpYmxlVmlydHVhbChiLCExLCEwKSlyZXR1cm4hMTt2YXIgbCxtLG49ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxvPWIuY2hpbGRyZW4scD1vLmxlbmd0aDtmb3IobT0wO208cDttKyspbD1vW21dLDM9PT1sLmFjdHVhbE5vZGUubm9kZVR5cGUmJlwiXCIhPT1heGUuY29tbW9ucy50ZXh0LnNhbml0aXplKGwuYWN0dWFsTm9kZS5ub2RlVmFsdWUpJiZuLnNlbGVjdE5vZGVDb250ZW50cyhsLmFjdHVhbE5vZGUpO3ZhciBxPW4uZ2V0Q2xpZW50UmVjdHMoKTtmb3IocD1xLmxlbmd0aCxtPTA7bTxwO20rKylpZihheGUuY29tbW9ucy5kb20udmlzdWFsbHlPdmVybGFwcyhxW21dLGEpKXJldHVybiEwO3JldHVybiExfSxleGNsdWRlSGlkZGVuOiExLG9wdGlvbnM6e25vU2Nyb2xsOiExfSx0YWdzOltcImNhdC5jb2xvclwiLFwid2NhZzJhYVwiLFwid2NhZzE0M1wiXSxhbGw6W10sYW55OltcImNvbG9yLWNvbnRyYXN0XCJdLG5vbmU6W119LHtpZDpcImRlZmluaXRpb24tbGlzdFwiLHNlbGVjdG9yOlwiZGxcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKX0sdGFnczpbXCJjYXQuc3RydWN0dXJlXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIl0sYWxsOltdLGFueTpbXSxub25lOltcInN0cnVjdHVyZWQtZGxpdGVtc1wiLFwib25seS1kbGl0ZW1zXCJdfSx7aWQ6XCJkbGl0ZW1cIixzZWxlY3RvcjpcImRkLCBkdFwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hYS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpfSx0YWdzOltcImNhdC5zdHJ1Y3R1cmVcIixcIndjYWcyYVwiLFwid2NhZzEzMVwiXSxhbGw6W10sYW55OltcImRsaXRlbVwiXSxub25lOltdfSx7aWQ6XCJkb2N1bWVudC10aXRsZVwiLHNlbGVjdG9yOlwiaHRtbFwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNlbGY9PT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcudG9wfSx0YWdzOltcImNhdC50ZXh0LWFsdGVybmF0aXZlc1wiLFwid2NhZzJhXCIsXCJ3Y2FnMjQyXCJdLGFsbDpbXSxhbnk6W1wiZG9jLWhhcy10aXRsZVwiXSxub25lOltdfSx7aWQ6XCJkdXBsaWNhdGUtaWRcIixzZWxlY3RvcjpcIltpZF1cIixleGNsdWRlSGlkZGVuOiExLHRhZ3M6W1wiY2F0LnBhcnNpbmdcIixcIndjYWcyYVwiLFwid2NhZzQxMVwiXSxhbGw6W10sYW55OltcImR1cGxpY2F0ZS1pZFwiXSxub25lOltdfSx7aWQ6XCJlbXB0eS1oZWFkaW5nXCIsc2VsZWN0b3I6J2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIFtyb2xlPVwiaGVhZGluZ1wiXScsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3ZhciBjPXZvaWQgMDtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpJiYoYz1hLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoL1xccysvaSkuZmlsdGVyKGF4ZS5jb21tb25zLmFyaWEuaXNWYWxpZFJvbGUpKSxjJiZjLmxlbmd0aD4wP2MuaW5jbHVkZXMoXCJoZWFkaW5nXCIpOlwiaGVhZGluZ1wiPT09YXhlLmNvbW1vbnMuYXJpYS5pbXBsaWNpdFJvbGUoYSl9LHRhZ3M6W1wiY2F0Lm5hbWUtcm9sZS12YWx1ZVwiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltcImhhcy12aXNpYmxlLXRleHRcIl0sbm9uZTpbXX0se2lkOlwiZm9jdXMtb3JkZXItc2VtYW50aWNzXCIsc2VsZWN0b3I6XCJkaXYsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIFtyb2xlPWhlYWRpbmddLCBwLCBzcGFuXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3JldHVybiBheGUuY29tbW9ucy5kb20uaW5zZXJ0ZWRJbnRvRm9jdXNPcmRlcihhKX0sdGFnczpbXCJjYXQua2V5Ym9hcmRcIixcImJlc3QtcHJhY3RpY2VcIixcImV4cGVyaW1lbnRhbFwiXSxhbGw6W10sYW55Olt7b3B0aW9uczpbXSxpZDpcImhhcy13aWRnZXQtcm9sZVwifSx7b3B0aW9uczpbXSxpZDpcInZhbGlkLXNjcm9sbGFibGUtc2VtYW50aWNzXCJ9XSxub25lOltdfSx7aWQ6XCJmcmFtZS10aXRsZS11bmlxdWVcIixzZWxlY3RvcjpcImZyYW1lW3RpdGxlXSwgaWZyYW1lW3RpdGxlXVwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO3JldHVybiEhKGM/YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShjKS50cmltKCk6XCJcIil9LHRhZ3M6W1wiY2F0LnRleHQtYWx0ZXJuYXRpdmVzXCIsXCJiZXN0LXByYWN0aWNlXCJdLGFsbDpbXSxhbnk6W10sbm9uZTpbXCJ1bmlxdWUtZnJhbWUtdGl0bGVcIl19LHtpZDpcImZyYW1lLXRpdGxlXCIsc2VsZWN0b3I6XCJmcmFtZSwgaWZyYW1lXCIsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzI0MVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5pXCJdLGFsbDpbXSxhbnk6W1wiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJub24tZW1wdHktdGl0bGVcIixcInJvbGUtcHJlc2VudGF0aW9uXCIsXCJyb2xlLW5vbmVcIl0sbm9uZTpbXX0se2lkOlwiaGVhZGluZy1vcmRlclwiLHNlbGVjdG9yOlwiaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgW3JvbGU9aGVhZGluZ11cIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dm9pZCAwO3JldHVybiBhLmhhc0F0dHJpYnV0ZShcInJvbGVcIikmJihjPWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdCgvXFxzKy9pKS5maWx0ZXIoYXhlLmNvbW1vbnMuYXJpYS5pc1ZhbGlkUm9sZSkpLGMmJmMubGVuZ3RoPjA/Yy5pbmNsdWRlcyhcImhlYWRpbmdcIik6XCJoZWFkaW5nXCI9PT1heGUuY29tbW9ucy5hcmlhLmltcGxpY2l0Um9sZShhKX0sdGFnczpbXCJjYXQuc2VtYW50aWNzXCIsXCJiZXN0LXByYWN0aWNlXCJdLGFsbDpbXSxhbnk6W1wiaGVhZGluZy1vcmRlclwiXSxub25lOltdfSx7aWQ6XCJoaWRkZW4tY29udGVudFwiLHNlbGVjdG9yOlwiKlwiLGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJleHBlcmltZW50YWxcIixcInJldmlldy1pdGVtXCJdLGFsbDpbXSxhbnk6W1wiaGlkZGVuLWNvbnRlbnRcIl0sbm9uZTpbXX0se2lkOlwiaHRtbC1oYXMtbGFuZ1wiLHNlbGVjdG9yOlwiaHRtbFwiLHRhZ3M6W1wiY2F0Lmxhbmd1YWdlXCIsXCJ3Y2FnMmFcIixcIndjYWczMTFcIl0sYWxsOltdLGFueTpbXCJoYXMtbGFuZ1wiXSxub25lOltdfSx7aWQ6XCJodG1sLWxhbmctdmFsaWRcIixzZWxlY3RvcjpcImh0bWxbbGFuZ11cIix0YWdzOltcImNhdC5sYW5ndWFnZVwiLFwid2NhZzJhXCIsXCJ3Y2FnMzExXCJdLGFsbDpbXSxhbnk6W10sbm9uZTpbXCJ2YWxpZC1sYW5nXCJdfSx7aWQ6XCJpbWFnZS1hbHRcIixzZWxlY3RvcjpcImltZywgW3JvbGU9J2ltZyddOm5vdChzdmcpXCIsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzExMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W1wiaGFzLWFsdFwiLFwiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJub24tZW1wdHktdGl0bGVcIixcInJvbGUtcHJlc2VudGF0aW9uXCIsXCJyb2xlLW5vbmVcIl0sbm9uZTpbXX0se2lkOlwiaW1hZ2UtcmVkdW5kYW50LWFsdFwiLHNlbGVjdG9yOididXR0b24sIFtyb2xlPVwiYnV0dG9uXCJdLCBhW2hyZWZdLCBwLCBsaSwgdGQsIHRoJyx0YWdzOltcImNhdC50ZXh0LWFsdGVybmF0aXZlc1wiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltdLG5vbmU6W1wiZHVwbGljYXRlLWltZy1sYWJlbFwiXX0se2lkOlwiaW5wdXQtaW1hZ2UtYWx0XCIsc2VsZWN0b3I6J2lucHV0W3R5cGU9XCJpbWFnZVwiXScsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzExMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W1wibm9uLWVtcHR5LWFsdFwiLFwiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJub24tZW1wdHktdGl0bGVcIl0sbm9uZTpbXX0se2lkOlwibGFiZWwtdGl0bGUtb25seVwiLHNlbGVjdG9yOlwiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWFcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJpbnB1dFwiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfHwhMT09PWEuaGFzQXR0cmlidXRlKFwidHlwZVwiKXx8ITE9PT1bXCJoaWRkZW5cIixcImltYWdlXCIsXCJidXR0b25cIixcInN1Ym1pdFwiLFwicmVzZXRcIl0uaW5jbHVkZXMoYS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkpfSx0YWdzOltcImNhdC5mb3Jtc1wiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltdLG5vbmU6W1widGl0bGUtb25seVwiXX0se2lkOlwibGFiZWxcIixzZWxlY3RvcjpcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3JldHVyblwiaW5wdXRcIiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKXx8ITE9PT1hLmhhc0F0dHJpYnV0ZShcInR5cGVcIil8fCExPT09W1wiaGlkZGVuXCIsXCJpbWFnZVwiLFwiYnV0dG9uXCIsXCJzdWJtaXRcIixcInJlc2V0XCJdLmluY2x1ZGVzKGEuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpKX0sdGFnczpbXCJjYXQuZm9ybXNcIixcIndjYWcyYVwiLFwid2NhZzMzMlwiLFwid2NhZzEzMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5uXCJdLGFsbDpbXSxhbnk6W1wiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJpbXBsaWNpdC1sYWJlbFwiLFwiZXhwbGljaXQtbGFiZWxcIixcIm5vbi1lbXB0eS10aXRsZVwiXSxub25lOltcImhlbHAtc2FtZS1hcy1sYWJlbFwiLFwibXVsdGlwbGUtbGFiZWxcIl19LHtpZDpcImxhbmRtYXJrLW1haW4taXMtdG9wLWxldmVsXCIsc2VsZWN0b3I6XCJtYWluLCBbcm9sZT1tYWluXVwiLHRhZ3M6W1wiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltcIm1haW4taXMtdG9wLWxldmVsXCJdLG5vbmU6W119LHtpZDpcImxhbmRtYXJrLW9uZS1tYWluXCIsc2VsZWN0b3I6XCJodG1sXCIsdGFnczpbXCJiZXN0LXByYWN0aWNlXCJdLGFsbDpbXCJoYXMtYXQtbGVhc3Qtb25lLW1haW5cIixcImhhcy1uby1tb3JlLXRoYW4tb25lLW1haW5cIl0sYW55OltdLG5vbmU6W119LHtpZDpcImxheW91dC10YWJsZVwiLHNlbGVjdG9yOlwidGFibGVcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWF4ZS5jb21tb25zLnRhYmxlLmlzRGF0YVRhYmxlKGEpfSx0YWdzOltcImNhdC5zZW1hbnRpY3NcIixcIndjYWcyYVwiLFwid2NhZzEzMVwiXSxhbGw6W10sYW55OltdLG5vbmU6W1wiaGFzLXRoXCIsXCJoYXMtY2FwdGlvblwiLFwiaGFzLXN1bW1hcnlcIl19LHtpZDpcImxpbmstaW4tdGV4dC1ibG9ja1wiLHNlbGVjdG9yOlwiYVtocmVmXSwgW3JvbGU9bGlua11cIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShhLnRleHRDb250ZW50KSxkPWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtyZXR1cm4oIWR8fFwibGlua1wiPT09ZCkmJighIWMmJighIWF4ZS5jb21tb25zLmRvbS5pc1Zpc2libGUoYSwhMSkmJmF4ZS5jb21tb25zLmRvbS5pc0luVGV4dEJsb2NrKGEpKSl9LGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJjYXQuY29sb3JcIixcImV4cGVyaW1lbnRhbFwiLFwid2NhZzJhXCIsXCJ3Y2FnMTQxXCJdLGFsbDpbXCJsaW5rLWluLXRleHQtYmxvY2tcIl0sYW55OltdLG5vbmU6W119LHtpZDpcImxpbmstbmFtZVwiLHNlbGVjdG9yOlwiYVtocmVmXSwgW3JvbGU9bGlua11baHJlZl1cIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJidXR0b25cIiE9PWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKX0sdGFnczpbXCJjYXQubmFtZS1yb2xlLXZhbHVlXCIsXCJ3Y2FnMmFcIixcIndjYWcxMTFcIixcIndjYWc0MTJcIixcIndjYWcyNDRcIixcInNlY3Rpb241MDhcIixcInNlY3Rpb241MDguMjIuYVwiXSxhbGw6W10sYW55OltcImhhcy12aXNpYmxlLXRleHRcIixcImFyaWEtbGFiZWxcIixcImFyaWEtbGFiZWxsZWRieVwiLFwicm9sZS1wcmVzZW50YXRpb25cIixcInJvbGUtbm9uZVwiXSxub25lOltcImZvY3VzYWJsZS1uby1uYW1lXCJdfSx7aWQ6XCJsaXN0XCIsc2VsZWN0b3I6XCJ1bCwgb2xcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKX0sdGFnczpbXCJjYXQuc3RydWN0dXJlXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIl0sYWxsOltdLGFueTpbXSxub25lOltcIm9ubHktbGlzdGl0ZW1zXCJdfSx7aWQ6XCJsaXN0aXRlbVwiLHNlbGVjdG9yOlwibGlcIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKX0sdGFnczpbXCJjYXQuc3RydWN0dXJlXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIl0sYWxsOltdLGFueTpbXCJsaXN0aXRlbVwiXSxub25lOltdfSx7aWQ6XCJtYXJxdWVlXCIsc2VsZWN0b3I6XCJtYXJxdWVlXCIsZXhjbHVkZUhpZGRlbjohMSx0YWdzOltcImNhdC5wYXJzaW5nXCIsXCJ3Y2FnMmFcIixcIndjYWcyMjJcIl0sYWxsOltdLGFueTpbXSxub25lOltcImlzLW9uLXNjcmVlblwiXX0se2lkOlwibWV0YS1yZWZyZXNoXCIsc2VsZWN0b3I6J21ldGFbaHR0cC1lcXVpdj1cInJlZnJlc2hcIl0nLGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJjYXQudGltZVwiLFwid2NhZzJhXCIsXCJ3Y2FnMmFhYVwiLFwid2NhZzIyMVwiLFwid2NhZzIyNFwiLFwid2NhZzMyNVwiXSxhbGw6W10sYW55OltcIm1ldGEtcmVmcmVzaFwiXSxub25lOltdfSx7aWQ6XCJtZXRhLXZpZXdwb3J0LWxhcmdlXCIsc2VsZWN0b3I6J21ldGFbbmFtZT1cInZpZXdwb3J0XCJdJyxleGNsdWRlSGlkZGVuOiExLHRhZ3M6W1wiY2F0LnNlbnNvcnktYW5kLXZpc3VhbC1jdWVzXCIsXCJiZXN0LXByYWN0aWNlXCJdLGFsbDpbXSxhbnk6W3tvcHRpb25zOntzY2FsZU1pbmltdW06NSxsb3dlckJvdW5kOjJ9LGlkOlwibWV0YS12aWV3cG9ydC1sYXJnZVwifV0sbm9uZTpbXX0se2lkOlwibWV0YS12aWV3cG9ydFwiLHNlbGVjdG9yOidtZXRhW25hbWU9XCJ2aWV3cG9ydFwiXScsZXhjbHVkZUhpZGRlbjohMSx0YWdzOltcImNhdC5zZW5zb3J5LWFuZC12aXN1YWwtY3Vlc1wiLFwid2NhZzJhYVwiLFwid2NhZzE0NFwiXSxhbGw6W10sYW55Olt7b3B0aW9uczp7c2NhbGVNaW5pbXVtOjJ9LGlkOlwibWV0YS12aWV3cG9ydFwifV0sbm9uZTpbXX0se2lkOlwib2JqZWN0LWFsdFwiLHNlbGVjdG9yOlwib2JqZWN0XCIsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzExMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W1wiaGFzLXZpc2libGUtdGV4dFwiLFwiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJub24tZW1wdHktdGl0bGVcIl0sbm9uZTpbXX0se2lkOlwicC1hcy1oZWFkaW5nXCIsc2VsZWN0b3I6XCJwXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3ZhciBjPUFycmF5LmZyb20oYS5wYXJlbnROb2RlLmNoaWxkTm9kZXMpLGQ9YS50ZXh0Q29udGVudC50cmltKCksZT0vWy4hPzo7XSg/IVsuIT86O10pL2c7cmV0dXJuISgwPT09ZC5sZW5ndGh8fChkLm1hdGNoKGUpfHxbXSkubGVuZ3RoPj0yKSYmMCE9PWMuc2xpY2UoYy5pbmRleE9mKGEpKzEpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm5cIlBcIj09PWEubm9kZU5hbWUudG9VcHBlckNhc2UoKSYmXCJcIiE9PWEudGV4dENvbnRlbnQudHJpbSgpfSkubGVuZ3RofSx0YWdzOltcImNhdC5zZW1hbnRpY3NcIixcIndjYWcyYVwiLFwid2NhZzEzMVwiLFwiZXhwZXJpbWVudGFsXCJdLGFsbDpbe29wdGlvbnM6e21hcmdpbnM6W3t3ZWlnaHQ6MTUwLGl0YWxpYzohMH0se3dlaWdodDoxNTAsc2l6ZToxLjE1fSx7aXRhbGljOiEwLHNpemU6MS4xNX0se3NpemU6MS40fV19LGlkOlwicC1hcy1oZWFkaW5nXCJ9XSxhbnk6W10sbm9uZTpbXX0se2lkOlwicmFkaW9ncm91cFwiLHNlbGVjdG9yOlwiaW5wdXRbdHlwZT1yYWRpb11bbmFtZV1cIix0YWdzOltcImNhdC5mb3Jtc1wiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltcImdyb3VwLWxhYmVsbGVkYnlcIixcImZpZWxkc2V0XCJdLG5vbmU6W119LHtpZDpcInJlZ2lvblwiLHNlbGVjdG9yOlwiaHRtbFwiLHBhZ2VMZXZlbDohMCx0YWdzOltcImNhdC5rZXlib2FyZFwiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W10sYW55OltcInJlZ2lvblwiXSxub25lOltdfSx7aWQ6XCJzY29wZS1hdHRyLXZhbGlkXCIsc2VsZWN0b3I6XCJ0ZFtzY29wZV0sIHRoW3Njb3BlXVwiLHRhZ3M6W1wiY2F0LnRhYmxlc1wiLFwiYmVzdC1wcmFjdGljZVwiXSxhbGw6W1wiaHRtbDUtc2NvcGVcIixcInNjb3BlLXZhbHVlXCJdLGFueTpbXSxub25lOltdfSx7aWQ6XCJzZXJ2ZXItc2lkZS1pbWFnZS1tYXBcIixzZWxlY3RvcjpcImltZ1tpc21hcF1cIix0YWdzOltcImNhdC50ZXh0LWFsdGVybmF0aXZlc1wiLFwid2NhZzJhXCIsXCJ3Y2FnMjExXCIsXCJzZWN0aW9uNTA4XCIsXCJzZWN0aW9uNTA4LjIyLmZcIl0sYWxsOltdLGFueTpbXSxub25lOltcImV4aXN0c1wiXX0se2lkOlwic2tpcC1saW5rXCIsc2VsZWN0b3I6XCJhW2hyZWZdXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtyZXR1cm5cIiNcIj09PWNbMF0mJmMubGVuZ3RoPjF9LHRhZ3M6W1wiY2F0LmtleWJvYXJkXCIsXCJiZXN0LXByYWN0aWNlXCJdLGFsbDpbXSxhbnk6W1wic2tpcC1saW5rXCJdLG5vbmU6W119LHtpZDpcInRhYmluZGV4XCIsc2VsZWN0b3I6XCJbdGFiaW5kZXhdXCIsdGFnczpbXCJjYXQua2V5Ym9hcmRcIixcImJlc3QtcHJhY3RpY2VcIl0sYWxsOltdLGFueTpbXCJ0YWJpbmRleFwiXSxub25lOltdfSx7aWQ6XCJ0YWJsZS1kdXBsaWNhdGUtbmFtZVwiLHNlbGVjdG9yOlwidGFibGVcIix0YWdzOltcImNhdC50YWJsZXNcIixcImJlc3QtcHJhY3RpY2VcIl0sYWxsOltdLGFueTpbXSxub25lOltcInNhbWUtY2FwdGlvbi1zdW1tYXJ5XCJdfSx7aWQ6XCJ0YWJsZS1mYWtlLWNhcHRpb25cIixzZWxlY3RvcjpcInRhYmxlXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3JldHVybiBheGUuY29tbW9ucy50YWJsZS5pc0RhdGFUYWJsZShhKX0sdGFnczpbXCJjYXQudGFibGVzXCIsXCJleHBlcmltZW50YWxcIixcIndjYWcyYVwiLFwid2NhZzEzMVwiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5nXCJdLGFsbDpbXCJjYXB0aW9uLWZha2VkXCJdLGFueTpbXSxub25lOltdfSx7aWQ6XCJ0ZC1oYXMtaGVhZGVyXCIsc2VsZWN0b3I6XCJ0YWJsZVwiLG1hdGNoZXM6ZnVuY3Rpb24oYSxiKXtpZihheGUuY29tbW9ucy50YWJsZS5pc0RhdGFUYWJsZShhKSl7dmFyIGM9YXhlLmNvbW1vbnMudGFibGUudG9BcnJheShhKTtyZXR1cm4gYy5sZW5ndGg+PTMmJmNbMF0ubGVuZ3RoPj0zJiZjWzFdLmxlbmd0aD49MyYmY1syXS5sZW5ndGg+PTN9cmV0dXJuITF9LHRhZ3M6W1wiY2F0LnRhYmxlc1wiLFwiZXhwZXJpbWVudGFsXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIixcInNlY3Rpb241MDhcIixcInNlY3Rpb241MDguMjIuZ1wiXSxhbGw6W1widGQtaGFzLWhlYWRlclwiXSxhbnk6W10sbm9uZTpbXX0se2lkOlwidGQtaGVhZGVycy1hdHRyXCIsc2VsZWN0b3I6XCJ0YWJsZVwiLHRhZ3M6W1wiY2F0LnRhYmxlc1wiLFwid2NhZzJhXCIsXCJ3Y2FnMTMxXCIsXCJzZWN0aW9uNTA4XCIsXCJzZWN0aW9uNTA4LjIyLmdcIl0sYWxsOltcInRkLWhlYWRlcnMtYXR0clwiXSxhbnk6W10sbm9uZTpbXX0se2lkOlwidGgtaGFzLWRhdGEtY2VsbHNcIixzZWxlY3RvcjpcInRhYmxlXCIsbWF0Y2hlczpmdW5jdGlvbihhLGIpe3JldHVybiBheGUuY29tbW9ucy50YWJsZS5pc0RhdGFUYWJsZShhKX0sdGFnczpbXCJjYXQudGFibGVzXCIsXCJ3Y2FnMmFcIixcIndjYWcxMzFcIixcInNlY3Rpb241MDhcIixcInNlY3Rpb241MDguMjIuZ1wiXSxhbGw6W1widGgtaGFzLWRhdGEtY2VsbHNcIl0sYW55OltdLG5vbmU6W119LHtpZDpcInZhbGlkLWxhbmdcIixzZWxlY3RvcjpcIltsYW5nXSwgW3htbFxcXFw6bGFuZ11cIixtYXRjaGVzOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJodG1sXCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHRhZ3M6W1wiY2F0Lmxhbmd1YWdlXCIsXCJ3Y2FnMmFhXCIsXCJ3Y2FnMzEyXCJdLGFsbDpbXSxhbnk6W10sbm9uZTpbXCJ2YWxpZC1sYW5nXCJdfSx7aWQ6XCJ2aWRlby1jYXB0aW9uXCIsc2VsZWN0b3I6XCJ2aWRlb1wiLGV4Y2x1ZGVIaWRkZW46ITEsdGFnczpbXCJjYXQudGV4dC1hbHRlcm5hdGl2ZXNcIixcIndjYWcyYVwiLFwid2NhZzEyMlwiLFwid2NhZzEyM1wiLFwic2VjdGlvbjUwOFwiLFwic2VjdGlvbjUwOC4yMi5hXCJdLGFsbDpbXSxhbnk6W10sbm9uZTpbXCJjYXB0aW9uXCJdfSx7aWQ6XCJ2aWRlby1kZXNjcmlwdGlvblwiLHNlbGVjdG9yOlwidmlkZW9cIixleGNsdWRlSGlkZGVuOiExLHRhZ3M6W1wiY2F0LnRleHQtYWx0ZXJuYXRpdmVzXCIsXCJ3Y2FnMmFhXCIsXCJ3Y2FnMTI1XCIsXCJzZWN0aW9uNTA4XCIsXCJzZWN0aW9uNTA4LjIyLmJcIl0sYWxsOltdLGFueTpbXSxub25lOltcImRlc2NyaXB0aW9uXCJdfV0sY2hlY2tzOlt7aWQ6XCJhYnN0cmFjdHJvbGVcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuXCJhYnN0cmFjdFwiPT09YXhlLmNvbW1vbnMuYXJpYS5nZXRSb2xlVHlwZShhLmdldEF0dHJpYnV0ZShcInJvbGVcIikpfX0se2lkOlwiYXJpYS1hbGxvd2VkLWF0dHJcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTt2YXIgZCxlLGYsZz1bXSxoPWEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSxpPWEuYXR0cmlidXRlcztpZihofHwoaD1heGUuY29tbW9ucy5hcmlhLmltcGxpY2l0Um9sZShhKSksZj1heGUuY29tbW9ucy5hcmlhLmFsbG93ZWRBdHRyKGgpLEFycmF5LmlzQXJyYXkoYltoXSkmJihmPWF4ZS51dGlscy51bmlxdWVBcnJheShiW2hdLmNvbmNhdChmKSkpLGgmJmYpZm9yKHZhciBqPTAsaz1pLmxlbmd0aDtqPGs7aisrKWQ9aVtqXSxlPWQubmFtZSxheGUuY29tbW9ucy5hcmlhLnZhbGlkYXRlQXR0cihlKSYmIWYuaW5jbHVkZXMoZSkmJmcucHVzaChlKyc9XCInK2Qubm9kZVZhbHVlKydcIicpO3JldHVybiFnLmxlbmd0aHx8KHRoaXMuZGF0YShnKSwhMSl9fSx7aWQ6XCJhcmlhLWhpZGRlbi1ib2R5XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVyblwidHJ1ZVwiIT09YS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKX19LHtpZDpcImFyaWEtZXJyb3JtZXNzYWdlXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2I9QXJyYXkuaXNBcnJheShiKT9iOltdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiksZT1hLmhhc0F0dHJpYnV0ZShcImFyaWEtZXJyb3JtZXNzYWdlXCIpLGY9YXhlLmNvbW1vbnMuZG9tLmdldFJvb3ROb2RlKGEpO3JldHVybiEoLTE9PT1iLmluZGV4T2YoZCkmJmUmJiFmdW5jdGlvbigpe3ZhciBiPWQmJmYuZ2V0RWxlbWVudEJ5SWQoZCk7aWYoYilyZXR1cm5cImFsZXJ0XCI9PT1iLmdldEF0dHJpYnV0ZShcInJvbGVcIil8fFwiYXNzZXJ0aXZlXCI9PT1iLmdldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiKXx8YXhlLnV0aWxzLnRva2VuTGlzdChhLmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIil8fFwiXCIpLmluZGV4T2YoZCk+LTF9KCkpfHwodGhpcy5kYXRhKGQpLCExKX19LHtpZDpcImhhcy13aWRnZXQtcm9sZVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShcInJvbGVcIik7aWYobnVsbD09PWQpcmV0dXJuITE7dmFyIGU9YXhlLmNvbW1vbnMuYXJpYS5nZXRSb2xlVHlwZShkKTtyZXR1cm5cIndpZGdldFwiPT09ZXx8XCJjb21wb3NpdGVcIj09PWV9LG9wdGlvbnM6W119LHtpZDpcImludmFsaWRyb2xlXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiFheGUuY29tbW9ucy5hcmlhLmlzVmFsaWRSb2xlKGEuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSl9fSx7aWQ6XCJhcmlhLXJlcXVpcmVkLWF0dHJcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTt2YXIgZD1bXTtpZihhLmhhc0F0dHJpYnV0ZXMoKSl7dmFyIGUsZj1hLmdldEF0dHJpYnV0ZShcInJvbGVcIiksZz1heGUuY29tbW9ucy5hcmlhLnJlcXVpcmVkQXR0cihmKTtpZihBcnJheS5pc0FycmF5KGJbZl0pJiYoZz1heGUudXRpbHMudW5pcXVlQXJyYXkoYltmXSxnKSksZiYmZylmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspZT1nW2hdLGEuZ2V0QXR0cmlidXRlKGUpfHxkLnB1c2goZSl9cmV0dXJuIWQubGVuZ3RofHwodGhpcy5kYXRhKGQpLCExKX19LHtpZDpcImFyaWEtcmVxdWlyZWQtY2hpbGRyZW5cIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIsYyxkKXtpZihudWxsPT09YSlyZXR1cm4hMTt2YXIgZT1nKGMpLGY9Wydbcm9sZT1cIicrYysnXCJdJ107cmV0dXJuIGUmJihmPWYuY29uY2F0KGUpKSxmPWYuam9pbihcIixcIiksZD9oKGEsZil8fCEhYXhlLnV0aWxzLnF1ZXJ5U2VsZWN0b3JBbGwoYixmKVswXTohIWF4ZS51dGlscy5xdWVyeVNlbGVjdG9yQWxsKGIsZilbMF19ZnVuY3Rpb24gZShhLGIpe3ZhciBjLGU7Zm9yKGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspaWYobnVsbCE9PWFbY10pe3ZhciBmPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGFbY10pO2lmKGQoYVtjXSxmLGIsITApKXJldHVybiEwfXJldHVybiExfXZhciBmPWF4ZS5jb21tb25zLmFyaWEucmVxdWlyZWRPd25lZCxnPWF4ZS5jb21tb25zLmFyaWEuaW1wbGljaXROb2RlcyxoPWF4ZS5jb21tb25zLnV0aWxzLm1hdGNoZXNTZWxlY3RvcixpPWF4ZS5jb21tb25zLmRvbS5pZHJlZnMsaj1hLmdldEF0dHJpYnV0ZShcInJvbGVcIiksaz1mKGopO2lmKCFrKXJldHVybiEwO3ZhciBsPSExLG09ay5vbmU7aWYoIW0pe3ZhciBsPSEwO209ay5hbGx9dmFyIG49ZnVuY3Rpb24oYSxiLGYsZyl7dmFyIGgsaj1iLmxlbmd0aCxrPVtdLGw9aShhLFwiYXJpYS1vd25zXCIpO2ZvcihoPTA7aDxqO2grKyl7dmFyIG09YltoXTtpZihkKGEsYyxtKXx8ZShsLG0pKXtpZighZilyZXR1cm4gbnVsbH1lbHNlIGYmJmsucHVzaChtKX1pZihcImNvbWJvYm94XCI9PT1nKXt2YXIgbj1rLmluZGV4T2YoXCJ0ZXh0Ym94XCIpLG89W1widGV4dFwiLFwic2VhcmNoXCIsXCJlbWFpbFwiLFwidXJsXCIsXCJ0ZWxcIl07bj49MCYmXCJJTlBVVFwiPT09YS50YWdOYW1lJiZvLmluY2x1ZGVzKGEudHlwZSkmJmsuc3BsaWNlKG4sMSk7dmFyIHA9ay5pbmRleE9mKFwibGlzdGJveFwiKSxxPWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKTtwPj0wJiYoIXF8fFwiZmFsc2VcIj09PXEpJiZrLnNwbGljZShwLDEpfXJldHVybiBrLmxlbmd0aD9rOiFmJiZiLmxlbmd0aD9iOm51bGx9KGEsbSxsLGopO3JldHVybiFufHwodGhpcy5kYXRhKG4pLCExKX19LHtpZDpcImFyaWEtcmVxdWlyZWQtcGFyZW50XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuKGF4ZS5jb21tb25zLmFyaWEuaW1wbGljaXROb2RlcyhhKXx8W10pLmNvbmNhdCgnW3JvbGU9XCInK2ErJ1wiXScpLmpvaW4oXCIsXCIpfWZ1bmN0aW9uIGUoYSxiLGMpe3ZhciBlLGYsZz1hLmFjdHVhbE5vZGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSxoPVtdO2lmKGJ8fChiPWF4ZS5jb21tb25zLmFyaWEucmVxdWlyZWRDb250ZXh0KGcpKSwhYilyZXR1cm4gbnVsbDtmb3IoZT0wLGY9Yi5sZW5ndGg7ZTxmO2UrKyl7aWYoYyYmYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3RvcihhLmFjdHVhbE5vZGUsZChiW2VdKSkpcmV0dXJuIG51bGw7aWYoYXhlLmNvbW1vbnMuZG9tLmZpbmRVcFZpcnR1YWwoYSxkKGJbZV0pKSlyZXR1cm4gbnVsbDtoLnB1c2goYltlXSl9cmV0dXJuIGh9dmFyIGY9ZShjKTtpZighZilyZXR1cm4hMDt2YXIgZz1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1udWxsO2E7KXtpZihhLmdldEF0dHJpYnV0ZShcImlkXCIpKXt2YXIgZD1heGUuY29tbW9ucy51dGlscy5lc2NhcGVTZWxlY3RvcihhLmdldEF0dHJpYnV0ZShcImlkXCIpKTtjPWF4ZS5jb21tb25zLmRvbS5nZXRSb290Tm9kZShhKS5xdWVyeVNlbGVjdG9yKFwiW2FyaWEtb3duc349XCIrZCtcIl1cIiksYyYmYi5wdXNoKGMpfWE9YS5wYXJlbnRFbGVtZW50fXJldHVybiBiLmxlbmd0aD9iOm51bGx9KGEpO2lmKGcpZm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKCEoZj1lKGF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGdbaF0pLGYsITApKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5kYXRhKGYpLCExfX0se2lkOlwiYXJpYS12YWxpZC1hdHRyLXZhbHVlXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2I9QXJyYXkuaXNBcnJheShiKT9iOltdO2Zvcih2YXIgZCxlLGY9W10sZz0vXmFyaWEtLyxoPWEuYXR0cmlidXRlcyxpPVtcImFyaWEtZXJyb3JtZXNzYWdlXCJdLGo9MCxrPWgubGVuZ3RoO2o8aztqKyspZD1oW2pdLGU9ZC5uYW1lLGkuaW5jbHVkZXMoZSl8fC0xPT09Yi5pbmRleE9mKGUpJiZnLnRlc3QoZSkmJiFheGUuY29tbW9ucy5hcmlhLnZhbGlkYXRlQXR0clZhbHVlKGEsZSkmJmYucHVzaChlKyc9XCInK2Qubm9kZVZhbHVlKydcIicpO3JldHVybiFmLmxlbmd0aHx8KHRoaXMuZGF0YShmKSwhMSl9LG9wdGlvbnM6W119LHtpZDpcImFyaWEtdmFsaWQtYXR0clwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtiPUFycmF5LmlzQXJyYXkoYik/YjpbXTtmb3IodmFyIGQsZT1bXSxmPS9eYXJpYS0vLGc9YS5hdHRyaWJ1dGVzLGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspZD1nW2hdLm5hbWUsLTE9PT1iLmluZGV4T2YoZCkmJmYudGVzdChkKSYmIWF4ZS5jb21tb25zLmFyaWEudmFsaWRhdGVBdHRyKGQpJiZlLnB1c2goZCk7cmV0dXJuIWUubGVuZ3RofHwodGhpcy5kYXRhKGUpLCExKX0sb3B0aW9uczpbXX0se2lkOlwidmFsaWQtc2Nyb2xsYWJsZS1zZW1hbnRpY3NcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj1hLnRhZ05hbWUudG9VcHBlckNhc2UoKTtyZXR1cm4gZltiXXx8ITF9ZnVuY3Rpb24gZShhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZShcInJvbGVcIik7cmV0dXJuISFiJiYoZ1tiLnRvTG93ZXJDYXNlKCldfHwhMSl9dmFyIGY9e0FSVElDTEU6ITAsQVNJREU6ITAsTkFWOiEwLFNFQ1RJT046ITB9LGc9e2Jhbm5lcjohMSxjb21wbGVtZW50YXJ5OiEwLGNvbnRlbnRpbmZvOiEwLGZvcm06ITAsbWFpbjohMCxuYXZpZ2F0aW9uOiEwLHJlZ2lvbjohMCxzZWFyY2g6ITF9O3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZShhKXx8ZChhKX0oYSl9LG9wdGlvbnM6W119LHtpZDpcImNvbG9yLWNvbnRyYXN0XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKCFheGUuY29tbW9ucy5kb20uaXNWaXNpYmxlKGEsITEpKXJldHVybiEwO3ZhciBkLGU9ISEoYnx8e30pLm5vU2Nyb2xsLGY9W10sZz1heGUuY29tbW9ucy5jb2xvci5nZXRCYWNrZ3JvdW5kQ29sb3IoYSxmLGUpLGg9YXhlLmNvbW1vbnMuY29sb3IuZ2V0Rm9yZWdyb3VuZENvbG9yKGEsZSksaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxqPXBhcnNlRmxvYXQoaS5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1zaXplXCIpKSxrPWkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtd2VpZ2h0XCIpLGw9LTEhPT1bXCJib2xkXCIsXCJib2xkZXJcIixcIjYwMFwiLFwiNzAwXCIsXCI4MDBcIixcIjkwMFwiXS5pbmRleE9mKGspLG09YXhlLmNvbW1vbnMuY29sb3IuaGFzVmFsaWRDb250cmFzdFJhdGlvKGcsaCxqLGwpLG49TWF0aC5mbG9vcigxMDAqbS5jb250cmFzdFJhdGlvKS8xMDA7bnVsbD09PWcmJihkPWF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLmdldChcImJnQ29sb3JcIikpO3ZhciBvPSExOzE9PT1uJiYobz0hMCxkPWF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLnNldChcImJnQ29sb3JcIixcImVxdWFsUmF0aW9cIikpO3ZhciBwPXtmZ0NvbG9yOmg/aC50b0hleFN0cmluZygpOnZvaWQgMCxiZ0NvbG9yOmc/Zy50b0hleFN0cmluZygpOnZvaWQgMCxjb250cmFzdFJhdGlvOm0/bjp2b2lkIDAsZm9udFNpemU6KDcyKmovOTYpLnRvRml4ZWQoMSkrXCJwdFwiLGZvbnRXZWlnaHQ6bD9cImJvbGRcIjpcIm5vcm1hbFwiLG1pc3NpbmdEYXRhOmQsZXhwZWN0ZWRDb250cmFzdFJhdGlvOm0uZXhwZWN0ZWRDb250cmFzdFJhdGlvK1wiOjFcIn07cmV0dXJuIHRoaXMuZGF0YShwKSxudWxsPT09aHx8bnVsbD09PWd8fG8/KGQ9bnVsbCxheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5jbGVhcigpLHZvaWQgdGhpcy5yZWxhdGVkTm9kZXMoZikpOihtLmlzVmFsaWR8fHRoaXMucmVsYXRlZE5vZGVzKGYpLG0uaXNWYWxpZCl9fSx7aWQ6XCJsaW5rLWluLXRleHQtYmxvY2tcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIpe3ZhciBjPWEuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKSxkPWIuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtyZXR1cm4oTWF0aC5tYXgoYyxkKSsuMDUpLyhNYXRoLm1pbihjLGQpKy4wNSl9ZnVuY3Rpb24gZShhKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTtyZXR1cm4tMSE9PWkuaW5kZXhPZihiKXx8XCJ0YWJsZS1cIj09PWIuc3Vic3RyKDAsNil9dmFyIGY9YXhlLmNvbW1vbnMsZz1mLmNvbG9yLGg9Zi5kb20saT1bXCJibG9ja1wiLFwibGlzdC1pdGVtXCIsXCJ0YWJsZVwiLFwiZmxleFwiLFwiZ3JpZFwiLFwiaW5saW5lLWJsb2NrXCJdO2lmKGUoYSkpcmV0dXJuITE7Zm9yKHZhciBqPWguZ2V0Q29tcG9zZWRQYXJlbnQoYSk7MT09PWoubm9kZVR5cGUmJiFlKGopOylqPWguZ2V0Q29tcG9zZWRQYXJlbnQoaik7aWYodGhpcy5yZWxhdGVkTm9kZXMoW2pdKSxnLmVsZW1lbnRJc0Rpc3RpbmN0KGEsaikpcmV0dXJuITA7dmFyIGssbDtpZihrPWcuZ2V0Rm9yZWdyb3VuZENvbG9yKGEpLGw9Zy5nZXRGb3JlZ3JvdW5kQ29sb3IoaiksayYmbCl7dmFyIG09ZChrLGwpO2lmKDE9PT1tKXJldHVybiEwO2lmKG0+PTMpcmV0dXJuIGF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLnNldChcImZnQ29sb3JcIixcImJnQ29udHJhc3RcIiksdGhpcy5kYXRhKHttaXNzaW5nRGF0YTpheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5nZXQoXCJmZ0NvbG9yXCIpfSksdm9pZCBheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5jbGVhcigpO2lmKGs9Zy5nZXRCYWNrZ3JvdW5kQ29sb3IoYSksbD1nLmdldEJhY2tncm91bmRDb2xvcihqKSwha3x8IWx8fGQoayxsKT49Myl7dmFyIG49dm9pZCAwO3JldHVybiBuPWsmJmw/XCJiZ0NvbnRyYXN0XCI6YXhlLmNvbW1vbnMuY29sb3IuaW5jb21wbGV0ZURhdGEuZ2V0KFwiYmdDb2xvclwiKSxheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5zZXQoXCJmZ0NvbG9yXCIsbiksdGhpcy5kYXRhKHttaXNzaW5nRGF0YTpheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5nZXQoXCJmZ0NvbG9yXCIpfSksdm9pZCBheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5jbGVhcigpfXJldHVybiExfX19LHtpZDpcImZpZWxkc2V0XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYXhlLmNvbW1vbnMudXRpbHMudG9BcnJheShhLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCx0ZXh0YXJlYSxidXR0b24saW5wdXQ6bm90KFtuYW1lPVwiJytiKydcIl0pOm5vdChbdHlwZT1cImhpZGRlblwiXSknKSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWEuZmlyc3RFbGVtZW50Q2hpbGQ7aWYoIWN8fFwiTEVHRU5EXCIhPT1jLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpcmV0dXJuIGkucmVsYXRlZE5vZGVzKFthXSksaD1cIm5vLWxlZ2VuZFwiLCExO2lmKCFheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0KGMpKXJldHVybiBpLnJlbGF0ZWROb2RlcyhbY10pLGg9XCJlbXB0eS1sZWdlbmRcIiwhMTt2YXIgZT1kKGEsYik7cmV0dXJuIWUubGVuZ3RofHwoaS5yZWxhdGVkTm9kZXMoZSksaD1cIm1peGVkLWlucHV0c1wiLCExKX1mdW5jdGlvbiBmKGEsYil7dmFyIGM9YXhlLmNvbW1vbnMuZG9tLmlkcmVmcyhhLFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmF4ZS5jb21tb25zLnRleHQuYWNjZXNzaWJsZVRleHQoYSl9KSxlPWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKTtpZighKGN8fGUmJmF4ZS5jb21tb25zLnRleHQuc2FuaXRpemUoZSkpKXJldHVybiBpLnJlbGF0ZWROb2RlcyhhKSxoPVwibm8tZ3JvdXAtbGFiZWxcIiwhMTt2YXIgZj1kKGEsYik7cmV0dXJuIWYubGVuZ3RofHwoaS5yZWxhdGVkTm9kZXMoZiksaD1cImdyb3VwLW1peGVkLWlucHV0c1wiLCExKX1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIGF4ZS5jb21tb25zLnV0aWxzLnRvQXJyYXkoYSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhIT09Yn0pfXZhciBoLGk9dGhpcyxqPXtuYW1lOmEuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSx0eXBlOmEuZ2V0QXR0cmlidXRlKFwidHlwZVwiKX0saz1mdW5jdGlvbihhKXt2YXIgYj1heGUuY29tbW9ucy51dGlscy5lc2NhcGVTZWxlY3RvcihhLmFjdHVhbE5vZGUubmFtZSksYz1heGUuY29tbW9ucy5kb20uZ2V0Um9vdE5vZGUoYS5hY3R1YWxOb2RlKSxkPWMucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cIicrYXhlLmNvbW1vbnMudXRpbHMuZXNjYXBlU2VsZWN0b3IoYS5hY3R1YWxOb2RlLnR5cGUpKydcIl1bbmFtZT1cIicrYisnXCJdJyk7aWYoZC5sZW5ndGg8MilyZXR1cm4hMDt2YXIgaj1heGUuY29tbW9ucy5kb20uZmluZFVwVmlydHVhbChhLFwiZmllbGRzZXRcIiksaz1heGUuY29tbW9ucy5kb20uZmluZFVwVmlydHVhbChhLCdbcm9sZT1cImdyb3VwXCJdJysoXCJyYWRpb1wiPT09YS5hY3R1YWxOb2RlLnR5cGU/Jyxbcm9sZT1cInJhZGlvZ3JvdXBcIl0nOlwiXCIpKTtyZXR1cm4ga3x8aj9qP2UoaixiKTpmKGssYik6KGg9XCJuby1ncm91cFwiLGkucmVsYXRlZE5vZGVzKGcoZCxhLmFjdHVhbE5vZGUpKSwhMSl9KGMpO3JldHVybiBrfHwoai5mYWlsdXJlQ29kZT1oKSx0aGlzLmRhdGEoaiksa30sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz17fTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7aWYoYS5yZXN1bHQpcmV0dXJuITA7dmFyIGI9YS5kYXRhO2lmKGIpe2lmKGNbYi50eXBlXT1jW2IudHlwZV18fHt9LCFjW2IudHlwZV1bYi5uYW1lXSlyZXR1cm4gY1tiLnR5cGVdW2IubmFtZV09W2JdLCEwO3ZhciBkPWNbYi50eXBlXVtiLm5hbWVdLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmFpbHVyZUNvZGU9PT1iLmZhaWx1cmVDb2RlfSk7cmV0dXJuIGR8fGNbYi50eXBlXVtiLm5hbWVdLnB1c2goYiksIWR9cmV0dXJuITF9KX19LHtpZDpcImdyb3VwLWxhYmVsbGVkYnlcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5kYXRhKHtuYW1lOmEuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSx0eXBlOmEuZ2V0QXR0cmlidXRlKFwidHlwZVwiKX0pO3ZhciBkPWF4ZS5jb21tb25zLmRvbS5nZXRSb290Tm9kZShhKSxlPWQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cIicrYXhlLmNvbW1vbnMudXRpbHMuZXNjYXBlU2VsZWN0b3IoYS50eXBlKSsnXCJdW25hbWU9XCInK2F4ZS5jb21tb25zLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGEubmFtZSkrJ1wiXScpO3JldHVybiBlLmxlbmd0aDw9MXx8MCE9PVtdLm1hcC5jYWxsKGUsZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIik7cmV0dXJuIGI/Yi5zcGxpdCgvXFxzKy8pOltdfSkucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBiLmluY2x1ZGVzKGEpfSl9KS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYiYmYXhlLmNvbW1vbnMudGV4dC5hY2Nlc3NpYmxlVGV4dChiLCEwKX0pLmxlbmd0aH0sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz17fTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO3JldHVybiEoIWJ8fChjW2IudHlwZV09Y1tiLnR5cGVdfHx7fSxjW2IudHlwZV1bYi5uYW1lXSkpJiYoY1tiLnR5cGVdW2IubmFtZV09ITAsITApfSl9fSx7aWQ6XCJhY2Nlc3NrZXlzXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBheGUuY29tbW9ucy5kb20uaXNWaXNpYmxlKGEsITEpJiYodGhpcy5kYXRhKGEuZ2V0QXR0cmlidXRlKFwiYWNjZXNza2V5XCIpKSx0aGlzLnJlbGF0ZWROb2RlcyhbYV0pKSwhMH0sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz17fTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7aWYoIWEuZGF0YSlyZXR1cm4hMTt2YXIgYj1hLmRhdGEudG9VcHBlckNhc2UoKTtyZXR1cm4gY1tiXT8oY1tiXS5yZWxhdGVkTm9kZXMucHVzaChhLnJlbGF0ZWROb2Rlc1swXSksITEpOihjW2JdPWEsYS5yZWxhdGVkTm9kZXM9W10sITApfSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnJlc3VsdD0hIWEucmVsYXRlZE5vZGVzLmxlbmd0aCxhfSl9fSx7aWQ6XCJmb2N1c2FibGUtbm8tbmFtZVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpO3JldHVybiEhKGF4ZS5jb21tb25zLmRvbS5pc0ZvY3VzYWJsZShhKSYmZD4tMSkmJiFheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0VmlydHVhbChjKX19LHtpZDpcImhhcy1hdC1sZWFzdC1vbmUtbWFpblwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1heGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLFwibWFpbixbcm9sZT1tYWluXVwiKTtyZXR1cm4gdGhpcy5kYXRhKCEhZFswXSksISFkWzBdfSxhZnRlcjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aCYmIWM7ZCsrKWM9YVtkXS5kYXRhO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWFbZF0ucmVzdWx0PWM7cmV0dXJuIGF9fSx7aWQ6XCJoYXMtbm8tbW9yZS10aGFuLW9uZS1tYWluXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBheGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLFwibWFpbixbcm9sZT1tYWluXVwiKS5sZW5ndGg8PTF9fSx7aWQ6XCJtYWluLWlzLXRvcC1sZXZlbFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YXhlLmNvbW1vbnMuYXJpYS5nZXRSb2xlc0J5VHlwZShcImxhbmRtYXJrXCIpLGU9YXhlLmNvbW1vbnMuZG9tLmdldENvbXBvc2VkUGFyZW50KGEpO2U7KXt2YXIgZj1lLmdldEF0dHJpYnV0ZShcInJvbGVcIik7aWYoZnx8XCJmb3JtXCI9PT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKXx8KGY9YXhlLmNvbW1vbnMuYXJpYS5pbXBsaWNpdFJvbGUoZSkpLGYmJmQuaW5jbHVkZXMoZikpcmV0dXJuITE7ZT1heGUuY29tbW9ucy5kb20uZ2V0Q29tcG9zZWRQYXJlbnQoZSl9cmV0dXJuITB9fSx7aWQ6XCJ0YWJpbmRleFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS50YWJJbmRleDw9MH19LHtpZDpcImR1cGxpY2F0ZS1pbWctbGFiZWxcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YXhlLmNvbW1vbnMudGV4dC52aXNpYmxlVmlydHVhbChjLCEwKS50b0xvd2VyQ2FzZSgpO3JldHVyblwiXCIhPT1kJiZheGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLFwiaW1nXCIpLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj1hLmFjdHVhbE5vZGU7cmV0dXJuIGF4ZS5jb21tb25zLmRvbS5pc1Zpc2libGUoYikmJiFbXCJub25lXCIsXCJwcmVzZW50YXRpb25cIl0uaW5jbHVkZXMoYi5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKX0pLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIGQ9PT1heGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0VmlydHVhbChhKS50b0xvd2VyQ2FzZSgpfSl9fSx7aWQ6XCJleHBsaWNpdC1sYWJlbFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtpZihhLmdldEF0dHJpYnV0ZShcImlkXCIpKXt2YXIgZD1heGUuY29tbW9ucy5kb20uZ2V0Um9vdE5vZGUoYSksZT1heGUuY29tbW9ucy51dGlscy5lc2NhcGVTZWxlY3RvcihhLmdldEF0dHJpYnV0ZShcImlkXCIpKSxmPWQucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPVwiJytlKydcIl0nKTtpZihmKXJldHVybiEhYXhlLmNvbW1vbnMudGV4dC5hY2Nlc3NpYmxlVGV4dChmKX1yZXR1cm4hMX19LHtpZDpcImhlbHAtc2FtZS1hcy1sYWJlbFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1heGUuY29tbW9ucy50ZXh0LmxhYmVsVmlydHVhbChjKSxlPWEuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7aWYoIWQpcmV0dXJuITE7aWYoIWUmJihlPVwiXCIsYS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSl7ZT1heGUuY29tbW9ucy5kb20uaWRyZWZzKGEsXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYT9heGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0KGEpOlwiXCJ9KS5qb2luKFwiXCIpfXJldHVybiBheGUuY29tbW9ucy50ZXh0LnNhbml0aXplKGUpPT09YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShkKX0sZW5hYmxlZDohMX0se2lkOlwiaW1wbGljaXQtbGFiZWxcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YXhlLmNvbW1vbnMuZG9tLmZpbmRVcFZpcnR1YWwoYyxcImxhYmVsXCIpO3JldHVybiEhZCYmISFheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0VmlydHVhbChkKX19LHtpZDpcIm11bHRpcGxlLWxhYmVsXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWF4ZS5jb21tb25zLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGEuZ2V0QXR0cmlidXRlKFwiaWRcIikpLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsYWJlbFtmb3I9XCInK2QrJ1wiXScpKSxmPWEucGFyZW50Tm9kZTtmb3IoZS5sZW5ndGgmJihlPWUuZmlsdGVyKGZ1bmN0aW9uKGEsYil7aWYoMD09PWImJiFheGUuY29tbW9ucy5kb20uaXNWaXNpYmxlKGEsITApfHxheGUuY29tbW9ucy5kb20uaXNWaXNpYmxlKGEsITApKXJldHVybiBhfSkpO2Y7KVwiTEFCRUxcIj09PWYudGFnTmFtZSYmLTE9PT1lLmluZGV4T2YoZikmJmUucHVzaChmKSxmPWYucGFyZW50Tm9kZTtyZXR1cm4gdGhpcy5yZWxhdGVkTm9kZXMoZSksZS5sZW5ndGg+MX19LHtpZDpcInRpdGxlLW9ubHlcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIShheGUuY29tbW9ucy50ZXh0LmxhYmVsVmlydHVhbChjKXx8IWEuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikmJiFhLmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpfX0se2lkOlwiaGFzLWxhbmdcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISEoYS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpfHxhLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpfHxcIlwiKS50cmltKCl9fSx7aWQ6XCJ2YWxpZC1sYW5nXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEudHJpbSgpLnNwbGl0KFwiLVwiKVswXS50b0xvd2VyQ2FzZSgpfXZhciBlLGY7cmV0dXJuIGU9KGJ8fGF4ZS5jb21tb25zLnV0aWxzLnZhbGlkTGFuZ3MoKSkubWFwKGQpLGY9W1wibGFuZ1wiLFwieG1sOmxhbmdcIl0ucmVkdWNlKGZ1bmN0aW9uKGIsYyl7dmFyIGY9YS5nZXRBdHRyaWJ1dGUoYyk7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGYpcmV0dXJuIGI7dmFyIGc9ZChmKTtyZXR1cm5cIlwiIT09ZyYmLTE9PT1lLmluZGV4T2YoZykmJmIucHVzaChjKyc9XCInK2EuZ2V0QXR0cmlidXRlKGMpKydcIicpLGJ9LFtdKSwhIWYubGVuZ3RoJiYodGhpcy5kYXRhKGYpLCEwKX19LHtpZDpcImRsaXRlbVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm5cIkRMXCI9PT1heGUuY29tbW9ucy5kb20uZ2V0Q29tcG9zZWRQYXJlbnQoYSkubm9kZU5hbWUudG9VcHBlckNhc2UoKX19LHtpZDpcImhhcy1saXN0aXRlbVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYy5jaGlsZHJlbi5ldmVyeShmdW5jdGlvbihhKXtyZXR1cm5cIkxJXCIhPT1hLmFjdHVhbE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKX0pfX0se2lkOlwibGlzdGl0ZW1cIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YXhlLmNvbW1vbnMuZG9tLmdldENvbXBvc2VkUGFyZW50KGEpO3JldHVybltcIlVMXCIsXCJPTFwiXS5pbmNsdWRlcyhkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpfHxcImxpc3RcIj09PShkLmdldEF0dHJpYnV0ZShcInJvbGVcIil8fFwiXCIpLnRvTG93ZXJDYXNlKCl9fSx7aWQ6XCJvbmx5LWRsaXRlbXNcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT1bXCJTVFlMRVwiLFwiTUVUQVwiLFwiTElOS1wiLFwiTUFQXCIsXCJBUkVBXCIsXCJTQ1JJUFRcIixcIkRBVEFMSVNUXCIsXCJURU1QTEFURVwiXSxmPSExO3JldHVybiBjLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hY3R1YWxOb2RlLGM9Yi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpOzE9PT1iLm5vZGVUeXBlJiZcIkRUXCIhPT1jJiZcIkREXCIhPT1jJiYtMT09PWUuaW5kZXhPZihjKT9kLnB1c2goYik6Mz09PWIubm9kZVR5cGUmJlwiXCIhPT1iLm5vZGVWYWx1ZS50cmltKCkmJihmPSEwKX0pLGQubGVuZ3RoJiZ0aGlzLnJlbGF0ZWROb2RlcyhkKSwhIWQubGVuZ3RofHxmfX0se2lkOlwib25seS1saXN0aXRlbXNcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT1bXCJTVFlMRVwiLFwiTUVUQVwiLFwiTElOS1wiLFwiTUFQXCIsXCJBUkVBXCIsXCJTQ1JJUFRcIixcIkRBVEFMSVNUXCIsXCJURU1QTEFURVwiXSxmPSExO3JldHVybiBjLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hY3R1YWxOb2RlLGM9Yi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpOzE9PT1iLm5vZGVUeXBlJiZcIkxJXCIhPT1jJiYtMT09PWUuaW5kZXhPZihjKT9kLnB1c2goYik6Mz09PWIubm9kZVR5cGUmJlwiXCIhPT1iLm5vZGVWYWx1ZS50cmltKCkmJihmPSEwKX0pLGQubGVuZ3RoJiZ0aGlzLnJlbGF0ZWROb2RlcyhkKSwhIWQubGVuZ3RofHxmfX0se2lkOlwic3RydWN0dXJlZC1kbGl0ZW1zXCIsXG5ldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yy5jaGlsZHJlbjtpZighZHx8IWQubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZSxmPSExLGc9ITEsaD0wO2g8ZC5sZW5ndGg7aCsrKXtpZihlPWRbaF0uYWN0dWFsTm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpLFwiRFRcIj09PWUmJihmPSEwKSxmJiZcIkREXCI9PT1lKXJldHVybiExO1wiRERcIj09PWUmJihnPSEwKX1yZXR1cm4gZnx8Z319LHtpZDpcImNhcHRpb25cIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YXhlLnV0aWxzLnF1ZXJ5U2VsZWN0b3JBbGwoYyxcInRyYWNrXCIpO2lmKGQubGVuZ3RoKXJldHVybiFkLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuXCJjYXB0aW9uc1wiPT09KGEuYWN0dWFsTm9kZS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpfHxcIlwiKS50b0xvd2VyQ2FzZSgpfSl9fSx7aWQ6XCJkZXNjcmlwdGlvblwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1heGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLFwidHJhY2tcIik7aWYoZC5sZW5ndGgpe3JldHVybiFkLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuXCJkZXNjcmlwdGlvbnNcIj09PShhLmFjdHVhbE5vZGUuZ2V0QXR0cmlidXRlKFwia2luZFwiKXx8XCJcIikudG9Mb3dlckNhc2UoKX0pfX19LHtpZDpcIm1ldGEtdmlld3BvcnQtbGFyZ2VcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTtmb3IodmFyIGQsZT1hLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIil8fFwiXCIsZj1lLnNwbGl0KC9bOyxdLyksZz17fSxoPWIuc2NhbGVNaW5pbXVtfHwyLGk9Yi5sb3dlckJvdW5kfHwhMSxqPTAsaz1mLmxlbmd0aDtqPGs7aisrKXtkPWZbal0uc3BsaXQoXCI9XCIpO3ZhciBsPWQuc2hpZnQoKS50b0xvd2VyQ2FzZSgpO2wmJmQubGVuZ3RoJiYoZ1tsLnRyaW0oKV09ZC5zaGlmdCgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKX1yZXR1cm4hIShpJiZnW1wibWF4aW11bS1zY2FsZVwiXSYmcGFyc2VGbG9hdChnW1wibWF4aW11bS1zY2FsZVwiXSk8aSl8fCEoIWkmJlwibm9cIj09PWdbXCJ1c2VyLXNjYWxhYmxlXCJdKSYmIShnW1wibWF4aW11bS1zY2FsZVwiXSYmcGFyc2VGbG9hdChnW1wibWF4aW11bS1zY2FsZVwiXSk8aCl9LG9wdGlvbnM6e3NjYWxlTWluaW11bTo1LGxvd2VyQm91bmQ6Mn19LHtpZDpcIm1ldGEtdmlld3BvcnRcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTtmb3IodmFyIGQsZT1hLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIil8fFwiXCIsZj1lLnNwbGl0KC9bOyxdLyksZz17fSxoPWIuc2NhbGVNaW5pbXVtfHwyLGk9Yi5sb3dlckJvdW5kfHwhMSxqPTAsaz1mLmxlbmd0aDtqPGs7aisrKXtkPWZbal0uc3BsaXQoXCI9XCIpO3ZhciBsPWQuc2hpZnQoKS50b0xvd2VyQ2FzZSgpO2wmJmQubGVuZ3RoJiYoZ1tsLnRyaW0oKV09ZC5zaGlmdCgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKX1yZXR1cm4hIShpJiZnW1wibWF4aW11bS1zY2FsZVwiXSYmcGFyc2VGbG9hdChnW1wibWF4aW11bS1zY2FsZVwiXSk8aSl8fCEoIWkmJlwibm9cIj09PWdbXCJ1c2VyLXNjYWxhYmxlXCJdKSYmIShnW1wibWF4aW11bS1zY2FsZVwiXSYmcGFyc2VGbG9hdChnW1wibWF4aW11bS1zY2FsZVwiXSk8aCl9LG9wdGlvbnM6e3NjYWxlTWluaW11bToyfX0se2lkOlwiaGVhZGVyLXByZXNlbnRcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFheGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBbcm9sZT1cImhlYWRpbmdcIl0nKVswXX19LHtpZDpcImhlYWRpbmctb3JkZXJcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxldmVsXCIpO2lmKG51bGwhPT1kKXJldHVybiB0aGlzLmRhdGEocGFyc2VJbnQoZCwxMCkpLCEwO3ZhciBlPWEudGFnTmFtZS5tYXRjaCgvSChcXGQpLyk7cmV0dXJuIWV8fCh0aGlzLmRhdGEocGFyc2VJbnQoZVsxXSwxMCkpLCEwKX0sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXtpZihhLmxlbmd0aDwyKXJldHVybiBhO2Zvcih2YXIgYz1hWzBdLmRhdGEsZD0xO2Q8YS5sZW5ndGg7ZCsrKWFbZF0ucmVzdWx0JiZhW2RdLmRhdGE+YysxJiYoYVtkXS5yZXN1bHQ9ITEpLGM9YVtkXS5kYXRhO3JldHVybiBhfX0se2lkOlwiaW50ZXJuYWwtbGluay1wcmVzZW50XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBheGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLFwiYVtocmVmXVwiKS5zb21lKGZ1bmN0aW9uKGEpe3JldHVyblwiI1wiPT09YS5hY3R1YWxOb2RlLmdldEF0dHJpYnV0ZShcImhyZWZcIilbMF19KX19LHtpZDpcImxhbmRtYXJrXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBheGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChjLCdtYWluLCBbcm9sZT1cIm1haW5cIl0nKS5sZW5ndGg+MH19LHtpZDpcIm1ldGEtcmVmcmVzaFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIil8fFwiXCIsZT1kLnNwbGl0KC9bOyxdLyk7cmV0dXJuXCJcIj09PWR8fFwiMFwiPT09ZVswXX19LHtpZDpcInAtYXMtaGVhZGluZ1wiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYj1hLGM9YS50ZXh0Q29udGVudC50cmltKCksZD1jO2Q9PT1jJiZ2b2lkIDAhPT1iOyl7dmFyIGU9LTE7aWYoYT1iLDA9PT1hLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4gYTtkb3tlKyssZD1hLmNoaWxkcmVuW2VdLnRleHRDb250ZW50LnRyaW0oKX13aGlsZShcIlwiPT09ZCYmZSsxPGEuY2hpbGRyZW4ubGVuZ3RoKTtiPWEuY2hpbGRyZW5bZV19cmV0dXJuIGF9ZnVuY3Rpb24gZShhKXtzd2l0Y2goYSl7Y2FzZVwibGlnaHRlclwiOnJldHVybiAxMDA7Y2FzZVwibm9ybWFsXCI6cmV0dXJuIDQwMDtjYXNlXCJib2xkXCI6cmV0dXJuIDcwMDtjYXNlXCJib2xkZXJcIjpyZXR1cm4gOTAwfXJldHVybiBhPXBhcnNlSW50KGEpLGlzTmFOKGEpPzQwMDphfWZ1bmN0aW9uIGYoYSl7dmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZChhKSk7cmV0dXJue2ZvbnRXZWlnaHQ6ZShiLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXdlaWdodFwiKSksZm9udFNpemU6cGFyc2VJbnQoYi5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1zaXplXCIpKSxpc0l0YWxpYzpcIml0YWxpY1wiPT09Yi5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1zdHlsZVwiKX19ZnVuY3Rpb24gZyhhLGIsYyl7cmV0dXJuIGMucmVkdWNlKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGN8fCghZC5zaXplfHxhLmZvbnRTaXplL2Quc2l6ZT5iLmZvbnRTaXplKSYmKCFkLndlaWdodHx8YS5mb250V2VpZ2h0LWQud2VpZ2h0PmIuZm9udFdlaWdodCkmJighZC5pdGFsaWN8fGEuaXNJdGFsaWMmJiFiLmlzSXRhbGljKX0sITEpfXZhciBoPUFycmF5LmZyb20oYS5wYXJlbnROb2RlLmNoaWxkcmVuKSxpPWguaW5kZXhPZihhKTtiPWJ8fHt9O3ZhciBqPWIubWFyZ2luc3x8W10saz1oLnNsaWNlKGkrMSkuZmluZChmdW5jdGlvbihhKXtyZXR1cm5cIlBcIj09PWEubm9kZU5hbWUudG9VcHBlckNhc2UoKX0pLGw9aC5zbGljZSgwLGkpLnJldmVyc2UoKS5maW5kKGZ1bmN0aW9uKGEpe3JldHVyblwiUFwiPT09YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpfSksbT1mKGEpLG49az9mKGspOm51bGwsbz1sP2YobCk6bnVsbDtpZighbnx8IWcobSxuLGopKXJldHVybiEwO3ZhciBwPWF4ZS5jb21tb25zLmRvbS5maW5kVXBWaXJ0dWFsKGMsXCJibG9ja3F1b3RlXCIpO3JldHVybiEhKHAmJlwiQkxPQ0tRVU9URVwiPT09cC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpfHxvJiYhZyhtLG8saikpJiZ2b2lkIDB9LG9wdGlvbnM6e21hcmdpbnM6W3t3ZWlnaHQ6MTUwLGl0YWxpYzohMH0se3dlaWdodDoxNTAsc2l6ZToxLjE1fSx7aXRhbGljOiEwLHNpemU6MS4xNX0se3NpemU6MS40fV19fSx7aWQ6XCJyZWdpb25cIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gaiYmaj09PWF9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpP2suaW5jbHVkZXMoYS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRvTG93ZXJDYXNlKCkpOmwuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3RvcihhLGIpfSl9ZnVuY3Rpb24gZihhKXt2YXIgYj1hLmFjdHVhbE5vZGU7cmV0dXJuIGUoYil8fGQoYil8fCFoLmlzVmlzaWJsZShiLCEwKT9bXTpoLmhhc0NvbnRlbnQoYiwhMCk/W2JdOmEuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5hY3R1YWxOb2RlLm5vZGVUeXBlfSkubWFwKGYpLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbmNhdChiKX0sW10pfXZhciBnPWF4ZS5jb21tb25zLGg9Zy5kb20saT1nLmFyaWEsaj1mdW5jdGlvbihhKXt2YXIgYj1heGUudXRpbHMucXVlcnlTZWxlY3RvckFsbChhLFwiYVtocmVmXVwiKVswXTtpZihiJiZheGUuY29tbW9ucy5kb20uZ2V0RWxlbWVudEJ5UmVmZXJlbmNlKGIuYWN0dWFsTm9kZSxcImhyZWZcIikpcmV0dXJuIGIuYWN0dWFsTm9kZX0oYyksaz1pLmdldFJvbGVzQnlUeXBlKFwibGFuZG1hcmtcIiksbD1rLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbmNhdChpLmltcGxpY2l0Tm9kZXMoYikpfSxbXSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YX0pLG09ZihjKTtyZXR1cm4gdGhpcy5yZWxhdGVkTm9kZXMobSksMD09PW0ubGVuZ3RofSxhZnRlcjpmdW5jdGlvbihhLGIpe3JldHVyblthWzBdXX19LHtpZDpcInNraXAtbGlua1wiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1heGUuY29tbW9ucy5kb20uZ2V0RWxlbWVudEJ5UmVmZXJlbmNlKGEsXCJocmVmXCIpO3JldHVybiEhZCYmKGF4ZS5jb21tb25zLmRvbS5pc1Zpc2libGUoZCwhMCl8fHZvaWQgMCl9fSx7aWQ6XCJ1bmlxdWUtZnJhbWUtdGl0bGVcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShhLnRpdGxlKS50cmltKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gdGhpcy5kYXRhKGQpLCEwfSxhZnRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXt9O3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24oYSl7Y1thLmRhdGFdPXZvaWQgMCE9PWNbYS5kYXRhXT8rK2NbYS5kYXRhXTowfSksYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EucmVzdWx0PSEhY1thLmRhdGFdfSksYX19LHtpZDpcImFyaWEtbGFiZWxcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpO3JldHVybiEhKGQ/YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShkKS50cmltKCk6XCJcIil9fSx7aWQ6XCJhcmlhLWxhYmVsbGVkYnlcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuKDAsYXhlLmNvbW1vbnMuZG9tLmlkcmVmcykoYSxcImFyaWEtbGFiZWxsZWRieVwiKS5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiBhJiZheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0KGEsITApfSl9fSx7aWQ6XCJidXR0b24taGFzLXZpc2libGUtdGV4dFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCksZT1hLmdldEF0dHJpYnV0ZShcInJvbGVcIiksZj12b2lkIDA7cmV0dXJuKFwiQlVUVE9OXCI9PT1kfHxcImJ1dHRvblwiPT09ZSYmXCJJTlBVVFwiIT09ZCkmJihmPWF4ZS5jb21tb25zLnRleHQuYWNjZXNzaWJsZVRleHRWaXJ0dWFsKGMpLHRoaXMuZGF0YShmKSwhIWYpfX0se2lkOlwiZG9jLWhhcy10aXRsZVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1kb2N1bWVudC50aXRsZTtyZXR1cm4hIShkP2F4ZS5jb21tb25zLnRleHQuc2FuaXRpemUoZCkudHJpbSgpOlwiXCIpfX0se2lkOlwiZHVwbGljYXRlLWlkXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpO2lmKCFkKXJldHVybiEwO3ZhciBlPWF4ZS5jb21tb25zLmRvbS5nZXRSb290Tm9kZShhKSxmPUFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCdbaWQ9XCInK2F4ZS5jb21tb25zLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGQpKydcIl0nKSkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiIT09YX0pO3JldHVybiBmLmxlbmd0aCYmdGhpcy5yZWxhdGVkTm9kZXMoZiksdGhpcy5kYXRhKGQpLDA9PT1mLmxlbmd0aH0sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PT1jLmluZGV4T2YoYS5kYXRhKSYmKGMucHVzaChhLmRhdGEpLCEwKX0pfX0se2lkOlwiZXhpc3RzXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEwfX0se2lkOlwiaGFzLWFsdFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGEuaGFzQXR0cmlidXRlKFwiYWx0XCIpJiYoXCJpbWdcIj09PWR8fFwiaW5wdXRcIj09PWR8fFwiYXJlYVwiPT09ZCl9fSx7aWQ6XCJoYXMtdmlzaWJsZS10ZXh0XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0VmlydHVhbChjKS5sZW5ndGg+MH19LHtpZDpcImlzLW9uLXNjcmVlblwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXhlLmNvbW1vbnMuZG9tLmlzVmlzaWJsZShhLCExKSYmIWF4ZS5jb21tb25zLmRvbS5pc09mZnNjcmVlbihhKX19LHtpZDpcIm5vbi1lbXB0eS1hbHRcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7cmV0dXJuISEoZD9heGUuY29tbW9ucy50ZXh0LnNhbml0aXplKGQpLnRyaW0oKTpcIlwiKX19LHtpZDpcIm5vbi1lbXB0eS1pZi1wcmVzZW50XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubm9kZU5hbWUudG9VcHBlckNhc2UoKSxlPShhLmdldEF0dHJpYnV0ZShcInR5cGVcIil8fFwiXCIpLnRvTG93ZXJDYXNlKCksZj1hLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO3JldHVybiB0aGlzLmRhdGEoZiksIShcIklOUFVUXCIhPT1kfHwhW1wic3VibWl0XCIsXCJyZXNldFwiXS5pbmNsdWRlcyhlKSkmJm51bGw9PT1mfX0se2lkOlwibm9uLWVtcHR5LXRpdGxlXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7cmV0dXJuISEoZD9heGUuY29tbW9ucy50ZXh0LnNhbml0aXplKGQpLnRyaW0oKTpcIlwiKX19LHtpZDpcIm5vbi1lbXB0eS12YWx1ZVwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO3JldHVybiEhKGQ/YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShkKS50cmltKCk6XCJcIil9fSx7aWQ6XCJyb2xlLW5vbmVcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuXCJub25lXCI9PT1hLmdldEF0dHJpYnV0ZShcInJvbGVcIil9fSx7aWQ6XCJyb2xlLXByZXNlbnRhdGlvblwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm5cInByZXNlbnRhdGlvblwiPT09YS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpfX0se2lkOlwiY2FwdGlvbi1mYWtlZFwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1heGUuY29tbW9ucy50YWJsZS50b0dyaWQoYSksZT1kWzBdO3JldHVybiBkLmxlbmd0aDw9MXx8ZS5sZW5ndGg8PTF8fGEucm93cy5sZW5ndGg8PTF8fGUucmVkdWNlKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXx8YiE9PWVbYysxXSYmdm9pZCAwIT09ZVtjKzFdfSwhMSl9fSx7aWQ6XCJoYXMtY2FwdGlvblwiLGV2YWx1YXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIWEuY2FwdGlvbn19LHtpZDpcImhhcy1zdW1tYXJ5XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEhYS5zdW1tYXJ5fX0se2lkOlwiaGFzLXRoXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlLGY9W10sZz0wLGg9YS5yb3dzLmxlbmd0aDtnPGg7ZysrKXtkPWEucm93c1tnXTtmb3IodmFyIGk9MCxqPWQuY2VsbHMubGVuZ3RoO2k8ajtpKyspZT1kLmNlbGxzW2ldLFwiVEhcIiE9PWUubm9kZU5hbWUudG9VcHBlckNhc2UoKSYmLTE9PT1bXCJyb3doZWFkZXJcIixcImNvbHVtbmhlYWRlclwiXS5pbmRleE9mKGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSl8fGYucHVzaChlKX1yZXR1cm4hIWYubGVuZ3RoJiYodGhpcy5yZWxhdGVkTm9kZXMoZiksITApfX0se2lkOlwiaHRtbDUtc2NvcGVcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIWF4ZS5jb21tb25zLmRvbS5pc0hUTUw1KGRvY3VtZW50KXx8XCJUSFwiPT09YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpfX0se2lkOlwic2FtZS1jYXB0aW9uLXN1bW1hcnlcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISghYS5zdW1tYXJ5fHwhYS5jYXB0aW9uKSYmYS5zdW1tYXJ5PT09YXhlLmNvbW1vbnMudGV4dC5hY2Nlc3NpYmxlVGV4dChhLmNhcHRpb24pfX0se2lkOlwic2NvcGUtdmFsdWVcIixldmFsdWF0ZTpmdW5jdGlvbihhLGIsYyl7Yj1ifHx7fTt2YXIgZD1hLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuLTEhPT0oW1wicm93XCIsXCJjb2xcIixcInJvd2dyb3VwXCIsXCJjb2xncm91cFwiXXx8Yi52YWx1ZXMpLmluZGV4T2YoZCl9fSx7aWQ6XCJ0ZC1oYXMtaGVhZGVyXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWF4ZS5jb21tb25zLnRhYmxlLGU9W107cmV0dXJuIGQuZ2V0QWxsQ2VsbHMoYSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihheGUuY29tbW9ucy5kb20uaGFzQ29udGVudChhKSYmZC5pc0RhdGFDZWxsKGEpJiYhYXhlLmNvbW1vbnMuYXJpYS5sYWJlbChhKSl7dmFyIGI9ZC5nZXRIZWFkZXJzKGEpOyhiPWIucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGF8fG51bGwhPT1iJiYhIWF4ZS5jb21tb25zLmRvbS5oYXNDb250ZW50KGIpfSwhMSkpfHxlLnB1c2goYSl9fSksIWUubGVuZ3RofHwodGhpcy5yZWxhdGVkTm9kZXMoZSksITEpfX0se2lkOlwidGQtaGVhZGVycy1hdHRyXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1bXSxlPTAsZj1hLnJvd3MubGVuZ3RoO2U8ZjtlKyspZm9yKHZhciBnPWEucm93c1tlXSxoPTAsaT1nLmNlbGxzLmxlbmd0aDtoPGk7aCsrKWQucHVzaChnLmNlbGxzW2hdKTt2YXIgaj1kLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBiLmdldEF0dHJpYnV0ZShcImlkXCIpJiZhLnB1c2goYi5nZXRBdHRyaWJ1dGUoXCJpZFwiKSksYX0sW10pLGs9ZC5yZWR1Y2UoZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9KGIuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKXx8XCJcIikuc3BsaXQoL1xccy8pLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBiPWIudHJpbSgpLGImJmEucHVzaChiKSxhfSxbXSk7cmV0dXJuIDAhPT1lLmxlbmd0aCYmKGIuZ2V0QXR0cmlidXRlKFwiaWRcIikmJihjPS0xIT09ZS5pbmRleE9mKGIuZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKSksZD1lLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhfHwtMT09PWouaW5kZXhPZihiKX0sITEpLChjfHxkKSYmYS5wdXNoKGIpKSxhfSxbXSk7cmV0dXJuIShrLmxlbmd0aD4wKXx8KHRoaXMucmVsYXRlZE5vZGVzKGspLCExKX19LHtpZDpcInRoLWhhcy1kYXRhLWNlbGxzXCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWF4ZS5jb21tb25zLnRhYmxlLGU9ZC5nZXRBbGxDZWxscyhhKSxmPXRoaXMsZz1bXTtlLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpO2ImJihnPWcuY29uY2F0KGIuc3BsaXQoL1xccysvKSkpO3ZhciBjPWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO2MmJihnPWcuY29uY2F0KGMuc3BsaXQoL1xccysvKSkpfSk7dmFyIGg9ZS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuXCJcIiE9PWF4ZS5jb21tb25zLnRleHQuc2FuaXRpemUoYS50ZXh0Q29udGVudCkmJihcIlRIXCI9PT1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCl8fC0xIT09W1wicm93aGVhZGVyXCIsXCJjb2x1bW5oZWFkZXJcIl0uaW5kZXhPZihhLmdldEF0dHJpYnV0ZShcInJvbGVcIikpKX0pLGk9ZC50b0dyaWQoYSk7cmV0dXJuISFoLnJlZHVjZShmdW5jdGlvbihhLGIpe2lmKGIuZ2V0QXR0cmlidXRlKFwiaWRcIikmJmcuaW5jbHVkZXMoYi5nZXRBdHRyaWJ1dGUoXCJpZFwiKSkpcmV0dXJuISFhfHxhO3ZhciBjPSExLGU9ZC5nZXRDZWxsUG9zaXRpb24oYixpKTtyZXR1cm4gZC5pc0NvbHVtbkhlYWRlcihiKSYmKGM9ZC50cmF2ZXJzZShcImRvd25cIixlLGkpLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhfHxheGUuY29tbW9ucy5kb20uaGFzQ29udGVudChiKSYmIWQuaXNDb2x1bW5IZWFkZXIoYil9LCExKSksIWMmJmQuaXNSb3dIZWFkZXIoYikmJihjPWQudHJhdmVyc2UoXCJyaWdodFwiLGUsaSkucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGF8fGF4ZS5jb21tb25zLmRvbS5oYXNDb250ZW50KGIpJiYhZC5pc1Jvd0hlYWRlcihiKX0sITEpKSxjfHxmLnJlbGF0ZWROb2RlcyhiKSxhJiZjfSwhMCl8fHZvaWQgMH19LHtpZDpcImhpZGRlbi1jb250ZW50XCIsZXZhbHVhdGU6ZnVuY3Rpb24oYSxiLGMpe2lmKCFbXCJTQ1JJUFRcIixcIkhFQURcIixcIlRJVExFXCIsXCJOT1NDUklQVFwiLFwiU1RZTEVcIixcIlRFTVBMQVRFXCJdLmluY2x1ZGVzKGEudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSYmYXhlLmNvbW1vbnMuZG9tLmhhc0NvbnRlbnRWaXJ0dWFsKGMpKXt2YXIgZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKTtpZihcIm5vbmVcIj09PWQuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIikpcmV0dXJuO2lmKFwiaGlkZGVuXCI9PT1kLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpKXt2YXIgZT1heGUuY29tbW9ucy5kb20uZ2V0Q29tcG9zZWRQYXJlbnQoYSksZj1lJiZ3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZighZnx8XCJoaWRkZW5cIiE9PWYuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2liaWxpdHlcIikpcmV0dXJufX1yZXR1cm4hMH19XSxjb21tb25zOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gYS5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1mYW1pbHlcIikuc3BsaXQoL1ssO10vZykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRyaW0oKS50b0xvd2VyQ2FzZSgpfSl9ZnVuY3Rpb24gYihiLGMpe3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGIpO2lmKFwibm9uZVwiIT09ZC5nZXRQcm9wZXJ0eVZhbHVlKFwiYmFja2dyb3VuZC1pbWFnZVwiKSlyZXR1cm4hMDtpZihbXCJib3JkZXItYm90dG9tXCIsXCJib3JkZXItdG9wXCIsXCJvdXRsaW5lXCJdLnJlZHVjZShmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBDLkNvbG9yO3JldHVybiBjLnBhcnNlUmdiU3RyaW5nKGQuZ2V0UHJvcGVydHlWYWx1ZShiK1wiLWNvbG9yXCIpKSxhfHxcIm5vbmVcIiE9PWQuZ2V0UHJvcGVydHlWYWx1ZShiK1wiLXN0eWxlXCIpJiZwYXJzZUZsb2F0KGQuZ2V0UHJvcGVydHlWYWx1ZShiK1wiLXdpZHRoXCIpKT4wJiYwIT09Yy5hbHBoYX0sITEpKXJldHVybiEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGMpO2lmKGEoZClbMF0hPT1hKGUpWzBdKXJldHVybiEwO3ZhciBmPVtcInRleHQtZGVjb3JhdGlvbi1saW5lXCIsXCJ0ZXh0LWRlY29yYXRpb24tc3R5bGVcIixcImZvbnQtd2VpZ2h0XCIsXCJmb250LXN0eWxlXCIsXCJmb250LXNpemVcIl0ucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGF8fGQuZ2V0UHJvcGVydHlWYWx1ZShiKSE9PWUuZ2V0UHJvcGVydHlWYWx1ZShiKX0sITEpLGc9ZC5nZXRQcm9wZXJ0eVZhbHVlKFwidGV4dC1kZWNvcmF0aW9uXCIpO3JldHVybiBnLnNwbGl0KFwiIFwiKS5sZW5ndGg8MyYmKGY9Znx8ZyE9PWUuZ2V0UHJvcGVydHlWYWx1ZShcInRleHQtZGVjb3JhdGlvblwiKSksZn1mdW5jdGlvbiBjKGEsYil7dmFyIGM9YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKEcuaW5jbHVkZXMoYykpcmV0dXJuIGF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLnNldChcImJnQ29sb3JcIixcImltZ05vZGVcIiksITA7Yj1ifHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKTt2YXIgZD1iLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWltYWdlXCIpLGU9XCJub25lXCIhPT1kO2lmKGUpe3ZhciBmPS9ncmFkaWVudC8udGVzdChkKTtheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5zZXQoXCJiZ0NvbG9yXCIsZj9cImJnR3JhZGllbnRcIjpcImJnSW1hZ2VcIil9cmV0dXJuIGV9ZnVuY3Rpb24gZChhLGIpe2I9Ynx8d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSk7dmFyIGM9bmV3IEMuQ29sb3I7aWYoYy5wYXJzZVJnYlN0cmluZyhiLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpKSwwIT09Yy5hbHBoYSl7dmFyIGQ9Yi5nZXRQcm9wZXJ0eVZhbHVlKFwib3BhY2l0eVwiKTtjLmFscGhhPWMuYWxwaGEqZH1yZXR1cm4gY31mdW5jdGlvbiBlKGEsYil7dmFyIGM9YS5nZXRDbGllbnRSZWN0cygpWzBdLGQ9RC5zaGFkb3dFbGVtZW50c0Zyb21Qb2ludChjLmxlZnQsYy50b3ApO2lmKGQpZm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXSE9PWEmJmRbZV09PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoYSxiLGMpe3ZhciBmPTA7aWYoYT4wKWZvcih2YXIgZz1hLTE7Zz49MDtnLS0pe3ZhciBoPWJbZ10saT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShoKSxqPWQoaCxpKTtqLmFscGhhJiZlKGMsaCk/Zis9ai5hbHBoYTpiLnNwbGljZShnLDEpfXJldHVybiBmfWZ1bmN0aW9uIGcoYSxiLGMpe3ZhciBkPWEhPT1iJiYhRC52aXN1YWxseUNvbnRhaW5zKGEsYikmJjAhPT1jLmFscGhhO3JldHVybiBkJiZheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5zZXQoXCJiZ0NvbG9yXCIsXCJlbG1QYXJ0aWFsbHlPYnNjdXJlZFwiKSxkfWZ1bmN0aW9uIGgoYSxiKXt2YXIgYz17VEQ6W1wiVFJcIixcIlRCT0RZXCJdLFRIOltcIlRSXCIsXCJUSEVBRFwiXSxJTlBVVDpbXCJMQUJFTFwiXX0sZD1hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfSksZT1hO2Zvcih2YXIgZiBpbiBjKWlmKGQuaW5jbHVkZXMoZikpZm9yKHZhciBnIGluIGNbZl0paWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9YXhlLmNvbW1vbnMuZG9tLmZpbmRVcChiLGNbZl1bZ10pO2lmKGgmJi0xPT09YS5pbmRleE9mKGgpKXt2YXIgaT1heGUuY29tbW9ucy5kb20udmlzdWFsbHlPdmVybGFwcyhiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGgpO2kmJmUuc3BsaWNlKGQuaW5kZXhPZihmKSsxLDAsaCl9Yi50YWdOYW1lPT09Y1tmXVtnXSYmLTE9PT1kLmluZGV4T2YoYi50YWdOYW1lKSYmZS5zcGxpY2UoZC5pbmRleE9mKGYpKzEsMCxiKX1yZXR1cm4gZX1mdW5jdGlvbiBpKGEpe3ZhciBiPWEuaW5kZXhPZihkb2N1bWVudC5ib2R5KSxlPWE7cmV0dXJuIGI+MSYmIWMoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSYmMD09PWQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hbHBoYSYmKGUuc3BsaWNlKGIsMSksZS5zcGxpY2UoYS5pbmRleE9mKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksMSksZS5wdXNoKGRvY3VtZW50LmJvZHkpKSxlfWZ1bmN0aW9uIGooYSl7aWYoIUguaW5jbHVkZXMoYS5hY3R1YWxOb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpKXJldHVybiBhLmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24oYSl7dmFyIGI9YS5hY3R1YWxOb2RlO3JldHVybiAzPT09Yi5ub2RlVHlwZSYmYi5ub2RlVmFsdWUudHJpbSgpfSl9ZnVuY3Rpb24gayhhKXtyZXR1cm4gYS5kaXNhYmxlZHx8IUQuaXNWaXNpYmxlKGEsITApJiZcIkFSRUFcIiE9PWEubm9kZU5hbWUudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBsKGEsYil7ITEhPT1iKGEuYWN0dWFsTm9kZSkmJmEuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gbChhLGIpfSl9ZnVuY3Rpb24gbShhKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTtyZXR1cm4gSS5pbmNsdWRlcyhiKXx8XCJ0YWJsZS1cIj09PWIuc3Vic3RyKDAsNil9ZnVuY3Rpb24gbihhKXtmb3IodmFyIGI9RC5nZXRDb21wb3NlZFBhcmVudChhKTtiJiYhbShiKTspYj1ELmdldENvbXBvc2VkUGFyZW50KGIpO3JldHVybiBheGUudXRpbHMuZ2V0Tm9kZUZyb21UcmVlKGF4ZS5fdHJlZVswXSxiKX1mdW5jdGlvbiBvKGEsYil7Zm9yKGE9RC5nZXRDb21wb3NlZFBhcmVudChhKTthJiZcImh0bWxcIiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTspe2lmKGEuc2Nyb2xsVG9wJiYoYis9YS5zY3JvbGxUb3ApPj0wKXJldHVybiExO2E9RC5nZXRDb21wb3NlZFBhcmVudChhKX1yZXR1cm4hMH1mdW5jdGlvbiBwKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPWEubWF0Y2goL3JlY3RcXHMqXFwoKFswLTldKylweCw/XFxzKihbMC05XSspcHgsP1xccyooWzAtOV0rKXB4LD9cXHMqKFswLTldKylweFxccypcXCkvKTtyZXR1cm4hKCFifHw1IT09Yi5sZW5ndGgpJiYoYlszXS1iWzFdPD0wJiZiWzJdLWJbNF08PTApfWZ1bmN0aW9uIHEoYSl7dmFyIGI9dm9pZCAwO3JldHVybiBiPWEuYWN0dWFsTm9kZS5pZD9ELmZpbmRFbG1zSW5Db250ZXh0KHtlbG06XCJsYWJlbFwiLGF0dHI6XCJmb3JcIix2YWx1ZTphLmFjdHVhbE5vZGUuaWQsY29udGV4dDphLmFjdHVhbE5vZGV9KVswXTpELmZpbmRVcFZpcnR1YWwoYSxcImxhYmVsXCIpLGF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGIpfWZ1bmN0aW9uIHIoYSl7cmV0dXJuW1wiYnV0dG9uXCIsXCJyZXNldFwiLFwic3VibWl0XCJdLmluY2x1ZGVzKGEuYWN0dWFsTm9kZS50eXBlLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIHMoYSl7dmFyIGI9YS5hY3R1YWxOb2RlLGM9Yi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO3JldHVyblwiVEVYVEFSRUFcIj09PWN8fFwiU0VMRUNUXCI9PT1jfHxcIklOUFVUXCI9PT1jJiZcImhpZGRlblwiIT09Yi50eXBlLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdChhKXtyZXR1cm5bXCJCVVRUT05cIixcIlNVTU1BUllcIixcIkFcIl0uaW5jbHVkZXMoYS5hY3R1YWxOb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpfWZ1bmN0aW9uIHUoYSl7cmV0dXJuW1wiVEFCTEVcIixcIkZJR1VSRVwiXS5pbmNsdWRlcyhhLmFjdHVhbE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSl9ZnVuY3Rpb24gdihhKXt2YXIgYj1hLmFjdHVhbE5vZGUsYz1iLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoXCJJTlBVVFwiPT09YylyZXR1cm4hYi5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpfHxMLmluY2x1ZGVzKGIudHlwZS50b0xvd2VyQ2FzZSgpKT9iLnZhbHVlOlwiXCI7aWYoXCJTRUxFQ1RcIj09PWMpe3ZhciBkPWIub3B0aW9ucztpZihkJiZkLmxlbmd0aCl7Zm9yKHZhciBlPVwiXCIsZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl0uc2VsZWN0ZWQmJihlKz1cIiBcIitkW2ZdLnRleHQpO3JldHVybiBGLnNhbml0aXplKGUpfXJldHVyblwiXCJ9cmV0dXJuXCJURVhUQVJFQVwiPT09YyYmYi52YWx1ZT9iLnZhbHVlOlwiXCJ9ZnVuY3Rpb24gdyhhLGIpe3ZhciBjPWEuYWN0dWFsTm9kZSxkPWMucXVlcnlTZWxlY3RvcihiLnRvTG93ZXJDYXNlKCkpO3JldHVybiBkP0YuYWNjZXNzaWJsZVRleHQoZCk6XCJcIn1mdW5jdGlvbiB4KGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEuYWN0dWFsTm9kZTtzd2l0Y2goYi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKXtjYXNlXCJTRUxFQ1RcIjpjYXNlXCJURVhUQVJFQVwiOnJldHVybiEwO2Nhc2VcIklOUFVUXCI6cmV0dXJuIWIuaGFzQXR0cmlidXRlKFwidHlwZVwiKXx8TC5pbmNsdWRlcyhiLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSk7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24geShhKXt2YXIgYj1hLmFjdHVhbE5vZGUsYz1iLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7cmV0dXJuW1wiSU1HXCIsXCJBUFBMRVRcIixcIkFSRUFcIl0uaW5jbHVkZXMoYyl8fFwiSU5QVVRcIj09PWMmJlwiaW1hZ2VcIj09PWIudHlwZS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHooYSl7cmV0dXJuISFGLnNhbml0aXplKGEpfXZhciBjb21tb25zPXt9LEE9Y29tbW9ucy5hcmlhPXt9LEI9QS5sb29rdXBUYWJsZT17fTtCLmF0dHJpYnV0ZXM9e1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6e3R5cGU6XCJpZHJlZlwifSxcImFyaWEtYXRvbWljXCI6e3R5cGU6XCJib29sZWFuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCJdfSxcImFyaWEtYXV0b2NvbXBsZXRlXCI6e3R5cGU6XCJubXRva2VuXCIsdmFsdWVzOltcImlubGluZVwiLFwibGlzdFwiLFwiYm90aFwiLFwibm9uZVwiXX0sXCJhcmlhLWJ1c3lcIjp7dHlwZTpcImJvb2xlYW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIl19LFwiYXJpYS1jaGVja2VkXCI6e3R5cGU6XCJubXRva2VuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCIsXCJtaXhlZFwiLFwidW5kZWZpbmVkXCJdfSxcImFyaWEtY29sY291bnRcIjp7dHlwZTpcImludFwifSxcImFyaWEtY29saW5kZXhcIjp7dHlwZTpcImludFwifSxcImFyaWEtY29sc3BhblwiOnt0eXBlOlwiaW50XCJ9LFwiYXJpYS1jb250cm9sc1wiOnt0eXBlOlwiaWRyZWZzXCJ9LFwiYXJpYS1jdXJyZW50XCI6e3R5cGU6XCJubXRva2VuXCIsdmFsdWVzOltcInBhZ2VcIixcInN0ZXBcIixcImxvY2F0aW9uXCIsXCJkYXRlXCIsXCJ0aW1lXCIsXCJ0cnVlXCIsXCJmYWxzZVwiXX0sXCJhcmlhLWRlc2NyaWJlZGJ5XCI6e3R5cGU6XCJpZHJlZnNcIn0sXCJhcmlhLWRpc2FibGVkXCI6e3R5cGU6XCJib29sZWFuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCJdfSxcImFyaWEtZHJvcGVmZmVjdFwiOnt0eXBlOlwibm10b2tlbnNcIix2YWx1ZXM6W1wiY29weVwiLFwibW92ZVwiLFwicmVmZXJlbmNlXCIsXCJleGVjdXRlXCIsXCJwb3B1cFwiLFwibm9uZVwiXX0sXCJhcmlhLWVycm9ybWVzc2FnZVwiOnt0eXBlOlwiaWRyZWZcIn0sXCJhcmlhLWV4cGFuZGVkXCI6e3R5cGU6XCJubXRva2VuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCIsXCJ1bmRlZmluZWRcIl19LFwiYXJpYS1mbG93dG9cIjp7dHlwZTpcImlkcmVmc1wifSxcImFyaWEtZ3JhYmJlZFwiOnt0eXBlOlwibm10b2tlblwiLHZhbHVlczpbXCJ0cnVlXCIsXCJmYWxzZVwiLFwidW5kZWZpbmVkXCJdfSxcImFyaWEtaGFzcG9wdXBcIjp7dHlwZTpcIm5tdG9rZW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIixcIm1lbnVcIixcImxpc3Rib3hcIixcInRyZWVcIixcImdyaWRcIixcImRpYWxvZ1wiXX0sXCJhcmlhLWhpZGRlblwiOnt0eXBlOlwiYm9vbGVhblwiLHZhbHVlczpbXCJ0cnVlXCIsXCJmYWxzZVwiXX0sXCJhcmlhLWludmFsaWRcIjp7dHlwZTpcIm5tdG9rZW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIixcInNwZWxsaW5nXCIsXCJncmFtbWFyXCJdfSxcImFyaWEta2V5c2hvcnRjdXRzXCI6e3R5cGU6XCJzdHJpbmdcIn0sXCJhcmlhLWxhYmVsXCI6e3R5cGU6XCJzdHJpbmdcIn0sXCJhcmlhLWxhYmVsbGVkYnlcIjp7dHlwZTpcImlkcmVmc1wifSxcImFyaWEtbGV2ZWxcIjp7dHlwZTpcImludFwifSxcImFyaWEtbGl2ZVwiOnt0eXBlOlwibm10b2tlblwiLHZhbHVlczpbXCJvZmZcIixcInBvbGl0ZVwiLFwiYXNzZXJ0aXZlXCJdfSxcImFyaWEtbW9kYWxcIjp7dHlwZTpcImJvb2xlYW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIl19LFwiYXJpYS1tdWx0aWxpbmVcIjp7dHlwZTpcImJvb2xlYW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIl19LFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjp7dHlwZTpcImJvb2xlYW5cIix2YWx1ZXM6W1widHJ1ZVwiLFwiZmFsc2VcIl19LFwiYXJpYS1vcmllbnRhdGlvblwiOnt0eXBlOlwibm10b2tlblwiLHZhbHVlczpbXCJob3Jpem9udGFsXCIsXCJ2ZXJ0aWNhbFwiXX0sXCJhcmlhLW93bnNcIjp7dHlwZTpcImlkcmVmc1wifSxcImFyaWEtcGxhY2Vob2xkZXJcIjp7dHlwZTpcInN0cmluZ1wifSxcImFyaWEtcG9zaW5zZXRcIjp7dHlwZTpcImludFwifSxcImFyaWEtcHJlc3NlZFwiOnt0eXBlOlwibm10b2tlblwiLHZhbHVlczpbXCJ0cnVlXCIsXCJmYWxzZVwiLFwibWl4ZWRcIixcInVuZGVmaW5lZFwiXX0sXCJhcmlhLXJlYWRvbmx5XCI6e3R5cGU6XCJib29sZWFuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCJdfSxcImFyaWEtcmVsZXZhbnRcIjp7dHlwZTpcIm5tdG9rZW5zXCIsdmFsdWVzOltcImFkZGl0aW9uc1wiLFwicmVtb3ZhbHNcIixcInRleHRcIixcImFsbFwiXX0sXCJhcmlhLXJlcXVpcmVkXCI6e3R5cGU6XCJib29sZWFuXCIsdmFsdWVzOltcInRydWVcIixcImZhbHNlXCJdfSxcImFyaWEtcm93Y291bnRcIjp7dHlwZTpcImludFwifSxcImFyaWEtcm93aW5kZXhcIjp7dHlwZTpcImludFwifSxcImFyaWEtcm93c3BhblwiOnt0eXBlOlwiaW50XCJ9LFwiYXJpYS1zZWxlY3RlZFwiOnt0eXBlOlwibm10b2tlblwiLHZhbHVlczpbXCJ0cnVlXCIsXCJmYWxzZVwiLFwidW5kZWZpbmVkXCJdfSxcImFyaWEtc2V0c2l6ZVwiOnt0eXBlOlwiaW50XCJ9LFwiYXJpYS1zb3J0XCI6e3R5cGU6XCJubXRva2VuXCIsdmFsdWVzOltcImFzY2VuZGluZ1wiLFwiZGVzY2VuZGluZ1wiLFwib3RoZXJcIixcIm5vbmVcIl19LFwiYXJpYS12YWx1ZW1heFwiOnt0eXBlOlwiZGVjaW1hbFwifSxcImFyaWEtdmFsdWVtaW5cIjp7dHlwZTpcImRlY2ltYWxcIn0sXCJhcmlhLXZhbHVlbm93XCI6e3R5cGU6XCJkZWNpbWFsXCJ9LFwiYXJpYS12YWx1ZXRleHRcIjp7dHlwZTpcInN0cmluZ1wifX0sQi5nbG9iYWxBdHRyaWJ1dGVzPVtcImFyaWEtYXRvbWljXCIsXCJhcmlhLWJ1c3lcIixcImFyaWEtY29udHJvbHNcIixcImFyaWEtY3VycmVudFwiLFwiYXJpYS1kZXNjcmliZWRieVwiLFwiYXJpYS1kaXNhYmxlZFwiLFwiYXJpYS1kcm9wZWZmZWN0XCIsXCJhcmlhLWZsb3d0b1wiLFwiYXJpYS1ncmFiYmVkXCIsXCJhcmlhLWhhc3BvcHVwXCIsXCJhcmlhLWhpZGRlblwiLFwiYXJpYS1pbnZhbGlkXCIsXCJhcmlhLWtleXNob3J0Y3V0c1wiLFwiYXJpYS1sYWJlbFwiLFwiYXJpYS1sYWJlbGxlZGJ5XCIsXCJhcmlhLWxpdmVcIixcImFyaWEtb3duc1wiLFwiYXJpYS1yZWxldmFudFwiXSxCLnJvbGU9e2FsZXJ0Ont0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LGFsZXJ0ZGlhbG9nOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCIsXCJhcmlhLW1vZGFsXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LGFwcGxpY2F0aW9uOnt0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sYXJ0aWNsZTp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1wb3NpbnNldFwiLFwiYXJpYS1zZXRzaXplXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wiYXJ0aWNsZVwiXX0sYmFubmVyOnt0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJoZWFkZXJcIl19LGJ1dHRvbjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1wcmVzc2VkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcImJ1dHRvblwiLCdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdJywnaW5wdXRbdHlwZT1cImltYWdlXCJdJywnaW5wdXRbdHlwZT1cInJlc2V0XCJdJywnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScsXCJzdW1tYXJ5XCJdfSxjZWxsOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWNvbGluZGV4XCIsXCJhcmlhLWNvbHNwYW5cIixcImFyaWEtcm93aW5kZXhcIixcImFyaWEtcm93c3BhblwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6W1wicm93XCJdLGltcGxpY2l0OltcInRkXCIsXCJ0aFwiXX0sY2hlY2tib3g6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtY2hlY2tlZFwiLFwiYXJpYS1yZXF1aXJlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXSddfSxjb2x1bW5oZWFkZXI6e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtY29saW5kZXhcIixcImFyaWEtY29sc3BhblwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1yb3dpbmRleFwiLFwiYXJpYS1yb3dzcGFuXCIsXCJhcmlhLXJlcXVpcmVkXCIsXCJhcmlhLXJlYWRvbmx5XCIsXCJhcmlhLXNlbGVjdGVkXCIsXCJhcmlhLXNvcnRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0OltcInJvd1wiXSxpbXBsaWNpdDpbXCJ0aFwiXX0sY29tYm9ib3g6e3R5cGU6XCJjb21wb3NpdGVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtYXV0b2NvbXBsZXRlXCIsXCJhcmlhLXJlcXVpcmVkXCIsXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcImFyaWEtb3JpZW50YXRpb25cIl19LG93bmVkOnthbGw6W1wibGlzdGJveFwiLFwidGV4dGJveFwiXX0sbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sY29tbWFuZDp7bmFtZUZyb206W1wiYXV0aG9yXCJdLHR5cGU6XCJhYnN0cmFjdFwifSxjb21wbGVtZW50YXJ5Ont0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJhc2lkZVwiXX0sY29tcG9zaXRlOntuYW1lRnJvbTpbXCJhdXRob3JcIl0sdHlwZTpcImFic3RyYWN0XCJ9LGNvbnRlbnRpbmZvOnt0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJmb290ZXJcIl19LGRlZmluaXRpb246e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJkZFwiLFwiZGZuXCJdfSxkaWFsb2c6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtbW9kYWxcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJkaWFsb2dcIl19LGRpcmVjdG9yeTp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6bnVsbH0sZG9jdW1lbnQ6e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJib2R5XCJdfSxmZWVkOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDp7b25lOltcImFydGljbGVcIl19LG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LGZvcm06e3R5cGU6XCJsYW5kbWFya1wiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcImZvcm1cIl19LGdyaWQ6e3R5cGU6XCJjb21wb3NpdGVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1jb2xjb3VudFwiLFwiYXJpYS1sZXZlbFwiLFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIixcImFyaWEtcmVhZG9ubHlcIixcImFyaWEtcm93Y291bnRcIl19LG93bmVkOntvbmU6W1wicm93Z3JvdXBcIixcInJvd1wiXX0sbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJ0YWJsZVwiXX0sZ3JpZGNlbGw6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtY29saW5kZXhcIixcImFyaWEtY29sc3BhblwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1yb3dpbmRleFwiLFwiYXJpYS1yb3dzcGFuXCIsXCJhcmlhLXNlbGVjdGVkXCIsXCJhcmlhLXJlYWRvbmx5XCIsXCJhcmlhLXJlcXVpcmVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpbXCJyb3dcIl0saW1wbGljaXQ6W1widGRcIixcInRoXCJdfSxncm91cDp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wiZGV0YWlsc1wiLFwib3B0Z3JvdXBcIl19LGhlYWRpbmc6e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtbGV2ZWxcIixcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wiaDFcIixcImgyXCIsXCJoM1wiLFwiaDRcIixcImg1XCIsXCJoNlwiXX0saW1nOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wiaW1nXCJdfSxpbnB1dDp7bmFtZUZyb206W1wiYXV0aG9yXCJdLHR5cGU6XCJhYnN0cmFjdFwifSxsYW5kbWFyazp7bmFtZUZyb206W1wiYXV0aG9yXCJdLHR5cGU6XCJhYnN0cmFjdFwifSxsaW5rOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcImFbaHJlZl1cIl19LGxpc3Q6e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOnthbGw6W1wibGlzdGl0ZW1cIl19LG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wib2xcIixcInVsXCIsXCJkbFwiXX0sbGlzdGJveDp7dHlwZTpcImNvbXBvc2l0ZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFwiYXJpYS1yZXF1aXJlZFwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1vcmllbnRhdGlvblwiXX0sb3duZWQ6e2FsbDpbXCJvcHRpb25cIl19LG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wic2VsZWN0XCJdfSxsaXN0aXRlbTp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1sZXZlbFwiLFwiYXJpYS1wb3NpbnNldFwiLFwiYXJpYS1zZXRzaXplXCIsXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpbXCJsaXN0XCJdLGltcGxpY2l0OltcImxpXCIsXCJkdFwiXX0sbG9nOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LG1haW46e3R5cGU6XCJsYW5kbWFya1wiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcIm1haW5cIl19LG1hcnF1ZWU6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sbWF0aDp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcIm1hdGhcIl19LG1lbnU6e3R5cGU6XCJjb21wb3NpdGVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1vcmllbnRhdGlvblwiXX0sb3duZWQ6e29uZTpbXCJtZW51aXRlbVwiLFwibWVudWl0ZW1yYWRpb1wiLFwibWVudWl0ZW1jaGVja2JveFwiXX0sbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbJ21lbnVbdHlwZT1cImNvbnRleHRcIl0nXX0sbWVudWJhcjp7dHlwZTpcImNvbXBvc2l0ZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLWV4cGFuZGVkXCIsXCJhcmlhLW9yaWVudGF0aW9uXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LG1lbnVpdGVtOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLXBvc2luc2V0XCIsXCJhcmlhLXNldHNpemVcIixcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0OltcIm1lbnVcIixcIm1lbnViYXJcIl0saW1wbGljaXQ6WydtZW51aXRlbVt0eXBlPVwiY29tbWFuZFwiXSddfSxtZW51aXRlbWNoZWNrYm94Ont0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWNoZWNrZWRcIixcImFyaWEtcG9zaW5zZXRcIixcImFyaWEtc2V0c2l6ZVwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6W1wibWVudVwiLFwibWVudWJhclwiXSxpbXBsaWNpdDpbJ21lbnVpdGVtW3R5cGU9XCJjaGVja2JveFwiXSddfSxtZW51aXRlbXJhZGlvOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWNoZWNrZWRcIixcImFyaWEtc2VsZWN0ZWRcIixcImFyaWEtcG9zaW5zZXRcIixcImFyaWEtc2V0c2l6ZVwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6W1wibWVudVwiLFwibWVudWJhclwiXSxpbXBsaWNpdDpbJ21lbnVpdGVtW3R5cGU9XCJyYWRpb1wiXSddfSxuYXZpZ2F0aW9uOnt0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJuYXZcIl19LG5vbmU6e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOm51bGwsb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsfSxub3RlOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LG9wdGlvbjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1zZWxlY3RlZFwiLFwiYXJpYS1wb3NpbnNldFwiLFwiYXJpYS1zZXRzaXplXCIsXCJhcmlhLWNoZWNrZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0OltcImxpc3Rib3hcIl0saW1wbGljaXQ6W1wib3B0aW9uXCJdfSxwcmVzZW50YXRpb246e3R5cGU6XCJzdHJ1Y3R1cmVcIixhdHRyaWJ1dGVzOm51bGwsb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsfSxwcm9ncmVzc2Jhcjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS12YWx1ZXRleHRcIixcImFyaWEtdmFsdWVub3dcIixcImFyaWEtdmFsdWVtYXhcIixcImFyaWEtdmFsdWVtaW5cIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJwcm9ncmVzc1wiXX0scmFkaW86e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtY2hlY2tlZFwiLFwiYXJpYS1zZWxlY3RlZFwiLFwiYXJpYS1wb3NpbnNldFwiLFwiYXJpYS1zZXRzaXplXCIsXCJhcmlhLXJlcXVpcmVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OlsnaW5wdXRbdHlwZT1cInJhZGlvXCJdJ119LHJhZGlvZ3JvdXA6e3R5cGU6XCJjb21wb3NpdGVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1yZXF1aXJlZFwiLFwiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6e2FsbDpbXCJyYWRpb1wiXX0sbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0scmFuZ2U6e25hbWVGcm9tOltcImF1dGhvclwiXSx0eXBlOlwiYWJzdHJhY3RcIn0scmVnaW9uOnt0eXBlOlwibGFuZG1hcmtcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJzZWN0aW9uW2FyaWEtbGFiZWxdXCIsXCJzZWN0aW9uW2FyaWEtbGFiZWxsZWRieV1cIixcInNlY3Rpb25bdGl0bGVdXCJdfSxyb2xldHlwZTp7dHlwZTpcImFic3RyYWN0XCJ9LHJvdzp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLWNvbGluZGV4XCIsXCJhcmlhLWV4cGFuZGVkXCIsXCJhcmlhLWxldmVsXCIsXCJhcmlhLXNlbGVjdGVkXCIsXCJhcmlhLXJvd2luZGV4XCJdfSxvd25lZDp7b25lOltcImNlbGxcIixcImNvbHVtbmhlYWRlclwiLFwicm93aGVhZGVyXCIsXCJncmlkY2VsbFwiXX0sbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0OltcInJvd2dyb3VwXCIsXCJncmlkXCIsXCJ0cmVlZ3JpZFwiLFwidGFibGVcIl0saW1wbGljaXQ6W1widHJcIl19LHJvd2dyb3VwOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOnthbGw6W1wicm93XCJdfSxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6W1wiZ3JpZFwiLFwidGFibGVcIl0saW1wbGljaXQ6W1widGJvZHlcIixcInRoZWFkXCIsXCJ0Zm9vdFwiXX0scm93aGVhZGVyOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWNvbGluZGV4XCIsXCJhcmlhLWNvbHNwYW5cIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtcm93aW5kZXhcIixcImFyaWEtcm93c3BhblwiLFwiYXJpYS1yZXF1aXJlZFwiLFwiYXJpYS1yZWFkb25seVwiLFwiYXJpYS1zZWxlY3RlZFwiLFwiYXJpYS1zb3J0XCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpbXCJyb3dcIl0saW1wbGljaXQ6W1widGhcIl19LHNjcm9sbGJhcjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e3JlcXVpcmVkOltcImFyaWEtY29udHJvbHNcIixcImFyaWEtdmFsdWVub3dcIixcImFyaWEtdmFsdWVtYXhcIixcImFyaWEtdmFsdWVtaW5cIl0sYWxsb3dlZDpbXCJhcmlhLXZhbHVldGV4dFwiLFwiYXJpYS1vcmllbnRhdGlvblwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsfSxzZWFyY2g6e3R5cGU6XCJsYW5kbWFya1wiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsfSxzZWFyY2hib3g6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1hdXRvY29tcGxldGVcIixcImFyaWEtbXVsdGlsaW5lXCIsXCJhcmlhLXJlYWRvbmx5XCIsXCJhcmlhLXJlcXVpcmVkXCIsXCJhcmlhLXBsYWNlaG9sZGVyXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6WydpbnB1dFt0eXBlPVwic2VhcmNoXCJdJ119LHNlY3Rpb246e25hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sdHlwZTpcImFic3RyYWN0XCJ9LHNlY3Rpb25oZWFkOntuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLHR5cGU6XCJhYnN0cmFjdFwifSxzZWxlY3Q6e25hbWVGcm9tOltcImF1dGhvclwiXSx0eXBlOlwiYWJzdHJhY3RcIn0sc2VwYXJhdG9yOnt0eXBlOlwic3RydWN0dXJlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCIsXCJhcmlhLW9yaWVudGF0aW9uXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wiaHJcIl19LHNsaWRlcjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS12YWx1ZXRleHRcIixcImFyaWEtb3JpZW50YXRpb25cIl0scmVxdWlyZWQ6W1wiYXJpYS12YWx1ZW5vd1wiLFwiYXJpYS12YWx1ZW1heFwiLFwiYXJpYS12YWx1ZW1pblwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OlsnaW5wdXRbdHlwZT1cInJhbmdlXCJdJ119LHNwaW5idXR0b246e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtdmFsdWV0ZXh0XCIsXCJhcmlhLXJlcXVpcmVkXCJdLHJlcXVpcmVkOltcImFyaWEtdmFsdWVub3dcIixcImFyaWEtdmFsdWVtYXhcIixcImFyaWEtdmFsdWVtaW5cIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbJ2lucHV0W3R5cGU9XCJudW1iZXJcIl0nXX0sc3RhdHVzOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6W1wib3V0cHV0XCJdfSxzdHJ1Y3R1cmU6e3R5cGU6XCJhYnN0cmFjdFwifSxzd2l0Y2g6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOntyZXF1aXJlZDpbXCJhcmlhLWNoZWNrZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0Om51bGx9LHRhYjp7dHlwZTpcIndpZGdldFwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1zZWxlY3RlZFwiLFwiYXJpYS1leHBhbmRlZFwiLFwiYXJpYS1zZXRzaXplXCIsXCJhcmlhLXBvc2luc2V0XCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiLFwiY29udGVudHNcIl0sY29udGV4dDpbXCJ0YWJsaXN0XCJdfSx0YWJsZTp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1jb2xjb3VudFwiLFwiYXJpYS1yb3djb3VudFwiXX0sb3duZWQ6e29uZTpbXCJyb3dncm91cFwiLFwicm93XCJdfSxuYW1lRnJvbTpbXCJhdXRob3JcIl0sY29udGV4dDpudWxsLGltcGxpY2l0OltcInRhYmxlXCJdfSx0YWJsaXN0Ont0eXBlOlwiY29tcG9zaXRlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtbGV2ZWxcIixcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsXCJhcmlhLW9yaWVudGF0aW9uXCJdfSxvd25lZDp7YWxsOltcInRhYlwiXX0sbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sdGFicGFuZWw6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sdGVybTp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1leHBhbmRlZFwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6bnVsbCxpbXBsaWNpdDpbXCJkdFwiXX0sdGV4dDp7dHlwZTpcInN0cnVjdHVyZVwiLG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0Om51bGx9LHRleHRib3g6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1hdXRvY29tcGxldGVcIixcImFyaWEtbXVsdGlsaW5lXCIsXCJhcmlhLXJlYWRvbmx5XCIsXCJhcmlhLXJlcXVpcmVkXCIsXCJhcmlhLXBsYWNlaG9sZGVyXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6WydpbnB1dFt0eXBlPVwidGV4dFwiXScsJ2lucHV0W3R5cGU9XCJlbWFpbFwiXScsJ2lucHV0W3R5cGU9XCJwYXNzd29yZFwiXScsJ2lucHV0W3R5cGU9XCJ0ZWxcIl0nLCdpbnB1dFt0eXBlPVwidXJsXCJdJyxcImlucHV0Om5vdChbdHlwZV0pXCIsXCJ0ZXh0YXJlYVwiXX0sdGltZXI6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCJdLGNvbnRleHQ6bnVsbH0sdG9vbGJhcjp7dHlwZTpcInN0cnVjdHVyZVwiLGF0dHJpYnV0ZXM6e2FsbG93ZWQ6W1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXCJhcmlhLWV4cGFuZGVkXCJdfSxvd25lZDpudWxsLG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGwsaW1wbGljaXQ6WydtZW51W3R5cGU9XCJ0b29sYmFyXCJdJ119LHRvb2x0aXA6e3R5cGU6XCJ3aWRnZXRcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtZXhwYW5kZWRcIl19LG93bmVkOm51bGwsbmFtZUZyb206W1wiYXV0aG9yXCIsXCJjb250ZW50c1wiXSxjb250ZXh0Om51bGx9LHRyZWU6e3R5cGU6XCJjb21wb3NpdGVcIixhdHRyaWJ1dGVzOnthbGxvd2VkOltcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIixcImFyaWEtcmVxdWlyZWRcIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtb3JpZW50YXRpb25cIl19LG93bmVkOnthbGw6W1widHJlZWl0ZW1cIl19LG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LHRyZWVncmlkOnt0eXBlOlwiY29tcG9zaXRlXCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcImFyaWEtY29sY291bnRcIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtbGV2ZWxcIixcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsXCJhcmlhLXJlYWRvbmx5XCIsXCJhcmlhLXJlcXVpcmVkXCIsXCJhcmlhLXJvd2NvdW50XCIsXCJhcmlhLW9yaWVudGF0aW9uXCJdfSxvd25lZDp7b25lOltcInJvd2dyb3VwXCIsXCJyb3dcIl19LG5hbWVGcm9tOltcImF1dGhvclwiXSxjb250ZXh0Om51bGx9LHRyZWVpdGVtOnt0eXBlOlwid2lkZ2V0XCIsYXR0cmlidXRlczp7YWxsb3dlZDpbXCJhcmlhLWNoZWNrZWRcIixcImFyaWEtc2VsZWN0ZWRcIixcImFyaWEtZXhwYW5kZWRcIixcImFyaWEtbGV2ZWxcIixcImFyaWEtcG9zaW5zZXRcIixcImFyaWEtc2V0c2l6ZVwiXX0sb3duZWQ6bnVsbCxuYW1lRnJvbTpbXCJhdXRob3JcIixcImNvbnRlbnRzXCJdLGNvbnRleHQ6W1wiZ3JvdXBcIixcInRyZWVcIl19LHdpZGdldDp7dHlwZTpcImFic3RyYWN0XCJ9LHdpbmRvdzp7bmFtZUZyb206W1wiYXV0aG9yXCJdLHR5cGU6XCJhYnN0cmFjdFwifX07dmFyIEM9e307Y29tbW9ucy5jb2xvcj1DO3ZhciBEPWNvbW1vbnMuZG9tPXt9LEU9Y29tbW9ucy50YWJsZT17fSxGPWNvbW1vbnMudGV4dD17RWRnZUZvcm1EZWZhdWx0czp7fX07Y29tbW9ucy51dGlscz1heGUudXRpbHM7QS5yZXF1aXJlZEF0dHI9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9QS5sb29rdXBUYWJsZS5yb2xlW2FdO3JldHVybiBiJiZiLmF0dHJpYnV0ZXMmJmIuYXR0cmlidXRlcy5yZXF1aXJlZHx8W119LEEuYWxsb3dlZEF0dHI9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9QS5sb29rdXBUYWJsZS5yb2xlW2FdLGM9YiYmYi5hdHRyaWJ1dGVzJiZiLmF0dHJpYnV0ZXMuYWxsb3dlZHx8W10sZD1iJiZiLmF0dHJpYnV0ZXMmJmIuYXR0cmlidXRlcy5yZXF1aXJlZHx8W107cmV0dXJuIGMuY29uY2F0KEEubG9va3VwVGFibGUuZ2xvYmFsQXR0cmlidXRlcykuY29uY2F0KGQpfSxBLnZhbGlkYXRlQXR0cj1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4hIUEubG9va3VwVGFibGUuYXR0cmlidXRlc1thXX0sQS52YWxpZGF0ZUF0dHJWYWx1ZT1mdW5jdGlvbihhLGIpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsZT1hLmdldEF0dHJpYnV0ZShiKSxmPUEubG9va3VwVGFibGUuYXR0cmlidXRlc1tiXSxnPUQuZ2V0Um9vdE5vZGUoYSk7aWYoIWYpcmV0dXJuITA7c3dpdGNoKGYudHlwZSl7Y2FzZVwiYm9vbGVhblwiOmNhc2VcIm5tdG9rZW5cIjpyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmLTEhPT1mLnZhbHVlcy5pbmRleE9mKGUudG9Mb3dlckNhc2UoKSk7Y2FzZVwibm10b2tlbnNcIjpyZXR1cm4gZD1heGUudXRpbHMudG9rZW5MaXN0KGUpLGQucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJi0xIT09Zi52YWx1ZXMuaW5kZXhPZihiKX0sMCE9PWQubGVuZ3RoKTtjYXNlXCJpZHJlZlwiOnJldHVybiEoIWV8fCFnLmdldEVsZW1lbnRCeUlkKGUpKTtjYXNlXCJpZHJlZnNcIjpyZXR1cm4gZD1heGUudXRpbHMudG9rZW5MaXN0KGUpLGQucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuISghYXx8IWcuZ2V0RWxlbWVudEJ5SWQoYikpfSwwIT09ZC5sZW5ndGgpO2Nhc2VcInN0cmluZ1wiOnJldHVybiEwO2Nhc2VcImRlY2ltYWxcIjpyZXR1cm4hKCEoYz1lLm1hdGNoKC9eWy0rXT8oWzAtOV0qKVxcLj8oWzAtOV0qKSQvKSl8fCFjWzFdJiYhY1syXSk7Y2FzZVwiaW50XCI6cmV0dXJuL15bLStdP1swLTldKyQvLnRlc3QoZSl9fSxBLmxhYmVsVmlydHVhbD1mdW5jdGlvbihhKXt2YXIgYj1hLmFjdHVhbE5vZGUsYz12b2lkIDAsZD12b2lkIDA7cmV0dXJuIGIuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpJiYoYz1ELmlkcmVmcyhiLFwiYXJpYS1sYWJlbGxlZGJ5XCIpLGQ9Yy5tYXAoZnVuY3Rpb24oYSl7XG52YXIgYj1heGUudXRpbHMuZ2V0Tm9kZUZyb21UcmVlKGF4ZS5fdHJlZVswXSxhKTtyZXR1cm4gYj9GLnZpc2libGVWaXJ0dWFsKGIsITApOlwiXCJ9KS5qb2luKFwiIFwiKS50cmltKCkpP2Q6KGQ9Yi5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLGQmJihkPUYuc2FuaXRpemUoZCkudHJpbSgpKT9kOm51bGwpfSxBLmxhYmVsPWZ1bmN0aW9uKGEpe3JldHVybiBhPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGEpLEEubGFiZWxWaXJ0dWFsKGEpfSxBLmlzVmFsaWRSb2xlPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiEhQS5sb29rdXBUYWJsZS5yb2xlW2FdfSxBLmdldFJvbGVzV2l0aE5hbWVGcm9tQ29udGVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoQS5sb29rdXBUYWJsZS5yb2xlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIEEubG9va3VwVGFibGUucm9sZVthXS5uYW1lRnJvbSYmLTEhPT1BLmxvb2t1cFRhYmxlLnJvbGVbYV0ubmFtZUZyb20uaW5kZXhPZihcImNvbnRlbnRzXCIpfSl9LEEuZ2V0Um9sZXNCeVR5cGU9ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5rZXlzKEEubG9va3VwVGFibGUucm9sZSkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBBLmxvb2t1cFRhYmxlLnJvbGVbYl0udHlwZT09PWF9KX0sQS5nZXRSb2xlVHlwZT1mdW5jdGlvbihhKXt2YXIgYj1BLmxvb2t1cFRhYmxlLnJvbGVbYV07cmV0dXJuIGImJmIudHlwZXx8bnVsbH0sQS5yZXF1aXJlZE93bmVkPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPW51bGwsYz1BLmxvb2t1cFRhYmxlLnJvbGVbYV07cmV0dXJuIGMmJihiPWF4ZS51dGlscy5jbG9uZShjLm93bmVkKSksYn0sQS5yZXF1aXJlZENvbnRleHQ9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9bnVsbCxjPUEubG9va3VwVGFibGUucm9sZVthXTtyZXR1cm4gYyYmKGI9YXhlLnV0aWxzLmNsb25lKGMuY29udGV4dCkpLGJ9LEEuaW1wbGljaXROb2Rlcz1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj1udWxsLGM9QS5sb29rdXBUYWJsZS5yb2xlW2FdO3JldHVybiBjJiZjLmltcGxpY2l0JiYoYj1heGUudXRpbHMuY2xvbmUoYy5pbXBsaWNpdCkpLGJ9LEEuaW1wbGljaXRSb2xlPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3ZhciBiPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYil7cmV0dXJuIGF4ZS51dGlscy5tYXRjaGVzU2VsZWN0b3IoYSxiKX07cmV0dXJuIGMuaW1wbGljaXQmJmMuaW1wbGljaXQuc29tZShkKSYmYi5wdXNoKGMubmFtZSksYn0sYz1PYmplY3Qua2V5cyhBLmxvb2t1cFRhYmxlLnJvbGUpLm1hcChmdW5jdGlvbihhKXt2YXIgYj1BLmxvb2t1cFRhYmxlLnJvbGVbYV07cmV0dXJue25hbWU6YSxpbXBsaWNpdDpiJiZiLmltcGxpY2l0fX0pLGQ9Yy5yZWR1Y2UoYixbXSk7aWYoIWQubGVuZ3RoKXJldHVybiBudWxsO2Zvcih2YXIgZT1hLmF0dHJpYnV0ZXMsZj1bXSxnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1lW2ddO2kubmFtZS5tYXRjaCgvXmFyaWEtLykmJmYucHVzaChpLm5hbWUpfXJldHVybiBmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBBLmFsbG93ZWRBdHRyKGEpLnJlZHVjZShmdW5jdGlvbihhLGMpe3JldHVybiBhKyhiLmluZGV4T2YoYyk+LTE/MTowKX0sMCl9O3JldHVybiBhLm1hcChmdW5jdGlvbihhKXtyZXR1cm57c2NvcmU6YyhhKSxuYW1lOmF9fSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiLnNjb3JlLWEuc2NvcmV9KS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0pfShkLGYpLnNoaWZ0KCl9LEMuQ29sb3I9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5yZWQ9YSx0aGlzLmdyZWVuPWIsdGhpcy5ibHVlPWMsdGhpcy5hbHBoYT1kLHRoaXMudG9IZXhTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLnJvdW5kKHRoaXMucmVkKS50b1N0cmluZygxNiksYj1NYXRoLnJvdW5kKHRoaXMuZ3JlZW4pLnRvU3RyaW5nKDE2KSxjPU1hdGgucm91bmQodGhpcy5ibHVlKS50b1N0cmluZygxNik7cmV0dXJuXCIjXCIrKHRoaXMucmVkPjE1LjU/YTpcIjBcIithKSsodGhpcy5ncmVlbj4xNS41P2I6XCIwXCIrYikrKHRoaXMuYmx1ZT4xNS41P2M6XCIwXCIrYyl9O3ZhciBlPS9ecmdiXFwoKFxcZCspLCAoXFxkKyksIChcXGQrKVxcKSQvLGY9L15yZ2JhXFwoKFxcZCspLCAoXFxkKyksIChcXGQrKSwgKFxcZCooXFwuXFxkKyk/KVxcKS87dGhpcy5wYXJzZVJnYlN0cmluZz1mdW5jdGlvbihhKXtpZihcInRyYW5zcGFyZW50XCI9PT1hKXJldHVybiB0aGlzLnJlZD0wLHRoaXMuZ3JlZW49MCx0aGlzLmJsdWU9MCx2b2lkKHRoaXMuYWxwaGE9MCk7dmFyIGI9YS5tYXRjaChlKTtyZXR1cm4gYj8odGhpcy5yZWQ9cGFyc2VJbnQoYlsxXSwxMCksdGhpcy5ncmVlbj1wYXJzZUludChiWzJdLDEwKSx0aGlzLmJsdWU9cGFyc2VJbnQoYlszXSwxMCksdm9pZCh0aGlzLmFscGhhPTEpKTooYj1hLm1hdGNoKGYpLGI/KHRoaXMucmVkPXBhcnNlSW50KGJbMV0sMTApLHRoaXMuZ3JlZW49cGFyc2VJbnQoYlsyXSwxMCksdGhpcy5ibHVlPXBhcnNlSW50KGJbM10sMTApLHZvaWQodGhpcy5hbHBoYT1wYXJzZUZsb2F0KGJbNF0pKSk6dm9pZCAwKX0sdGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVkLzI1NSxiPXRoaXMuZ3JlZW4vMjU1LGM9dGhpcy5ibHVlLzI1NTtyZXR1cm4uMjEyNiooYTw9LjAzOTI4P2EvMTIuOTI6TWF0aC5wb3coKGErLjA1NSkvMS4wNTUsMi40KSkrLjcxNTIqKGI8PS4wMzkyOD9iLzEyLjkyOk1hdGgucG93KChiKy4wNTUpLzEuMDU1LDIuNCkpKy4wNzIyKihjPD0uMDM5Mjg/Yy8xMi45MjpNYXRoLnBvdygoYysuMDU1KS8xLjA1NSwyLjQpKX19LEMuZmxhdHRlbkNvbG9ycz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYWxwaGEsZD0oMS1jKSpiLnJlZCtjKmEucmVkLGU9KDEtYykqYi5ncmVlbitjKmEuZ3JlZW4sZj0oMS1jKSpiLmJsdWUrYyphLmJsdWUsZz1hLmFscGhhK2IuYWxwaGEqKDEtYS5hbHBoYSk7cmV0dXJuIG5ldyBDLkNvbG9yKGQsZSxmLGcpfSxDLmdldENvbnRyYXN0PWZ1bmN0aW9uKGEsYil7aWYoIWJ8fCFhKXJldHVybiBudWxsO2IuYWxwaGE8MSYmKGI9Qy5mbGF0dGVuQ29sb3JzKGIsYSkpO3ZhciBjPWEuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKSxkPWIuZ2V0UmVsYXRpdmVMdW1pbmFuY2UoKTtyZXR1cm4oTWF0aC5tYXgoZCxjKSsuMDUpLyhNYXRoLm1pbihkLGMpKy4wNSl9LEMuaGFzVmFsaWRDb250cmFzdFJhdGlvPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPUMuZ2V0Q29udHJhc3QoYSxiKSxmPWQmJk1hdGguY2VpbCg3MipjKS85NjwxNHx8IWQmJk1hdGguY2VpbCg3MipjKS85NjwxOCxnPWY/NC41OjM7cmV0dXJue2lzVmFsaWQ6ZT5nLGNvbnRyYXN0UmF0aW86ZSxleHBlY3RlZENvbnRyYXN0UmF0aW86Z319LEMuZWxlbWVudElzRGlzdGluY3Q9Yjt2YXIgRz1bXCJJTUdcIixcIkNBTlZBU1wiLFwiT0JKRUNUXCIsXCJJRlJBTUVcIixcIlZJREVPXCIsXCJTVkdcIl07Qy5nZXRDb29yZHM9ZnVuY3Rpb24oYSl7dmFyIGI9dm9pZCAwLGM9dm9pZCAwO2lmKCEoYS5sZWZ0PndpbmRvdy5pbm5lcldpZHRofHxhLnRvcD53aW5kb3cuaW5uZXJIZWlnaHQpKXJldHVybiBiPU1hdGgubWluKE1hdGguY2VpbChhLmxlZnQrYS53aWR0aC8yKSx3aW5kb3cuaW5uZXJXaWR0aC0xKSxjPU1hdGgubWluKE1hdGguY2VpbChhLnRvcCthLmhlaWdodC8yKSx3aW5kb3cuaW5uZXJIZWlnaHQtMSkse3g6Yix5OmN9fSxDLmdldFJlY3RTdGFjaz1mdW5jdGlvbihhKXt2YXIgYj1DLmdldENvb3JkcyhhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtpZihiKXt2YXIgYz1ELnNoYWRvd0VsZW1lbnRzRnJvbVBvaW50KGIueCxiLnkpLGQ9QXJyYXkuZnJvbShhLmdldENsaWVudFJlY3RzKCkpO2lmKGQmJmQubGVuZ3RoPjEpe3ZhciBlPWQuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLndpZHRoJiZhLndpZHRoPjB9KS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI9Qy5nZXRDb29yZHMoYSk7aWYoYilyZXR1cm4gRC5zaGFkb3dFbGVtZW50c0Zyb21Qb2ludChiLngsYi55KX0pO3JldHVybiBlLnNwbGljZSgwLDAsYyksZX1yZXR1cm5bY119cmV0dXJuIG51bGx9LEMuZmlsdGVyZWRSZWN0U3RhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9Qy5nZXRSZWN0U3RhY2soYSk7aWYoYiYmMT09PWIubGVuZ3RoKXJldHVybiBiWzBdO2lmKGImJmIubGVuZ3RoPjEpe3ZhciBjPWIuc2hpZnQoKSxkPXZvaWQgMDtyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKGUsZil7aWYoMCE9PWYpe3ZhciBnPWJbZi0xXSxoPWJbZl07ZD1nLmV2ZXJ5KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1oW2JdfSl8fGMuaW5jbHVkZXMoYSl9fSksZD9iWzBdOihheGUuY29tbW9ucy5jb2xvci5pbmNvbXBsZXRlRGF0YS5zZXQoXCJiZ0NvbG9yXCIsXCJlbG1QYXJ0aWFsbHlPYnNjdXJpbmdcIiksbnVsbCl9cmV0dXJuIGF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLnNldChcImJnQ29sb3JcIixcIm91dHNpZGVWaWV3cG9ydFwiKSxudWxsfSxDLmdldEJhY2tncm91bmRTdGFjaz1mdW5jdGlvbihhKXt2YXIgYj1DLmZpbHRlcmVkUmVjdFN0YWNrKGEpO2lmKG51bGw9PT1iKXJldHVybiBudWxsO2I9aChiLGEpLGI9RC5yZWR1Y2VUb0VsZW1lbnRzQmVsb3dGbG9hdGluZyhiLGEpLGI9aShiKTt2YXIgYz1iLmluZGV4T2YoYSk7cmV0dXJuIGYoYyxiLGEpPj0uOTk/KGF4ZS5jb21tb25zLmNvbG9yLmluY29tcGxldGVEYXRhLnNldChcImJnQ29sb3JcIixcImJnT3ZlcmxhcFwiKSxudWxsKTotMSE9PWM/YjpudWxsfSxDLmdldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W107aWYoITAhPT0oYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSkpe3ZhciBlPWEuY2xpZW50SGVpZ2h0LTI+PTIqd2luZG93LmlubmVySGVpZ2h0O2Euc2Nyb2xsSW50b1ZpZXcoZSl9dmFyIGY9W10saD1DLmdldEJhY2tncm91bmRTdGFjayhhKTtpZigoaHx8W10pLnNvbWUoZnVuY3Rpb24oZSl7dmFyIGg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksaT1kKGUsaCk7cmV0dXJuIGcoYSxlLGkpfHxjKGUsaCk/KGY9bnVsbCxiLnB1c2goZSksITApOjAhPT1pLmFscGhhJiYoYi5wdXNoKGUpLGYucHVzaChpKSwxPT09aS5hbHBoYSl9KSxudWxsIT09ZiYmbnVsbCE9PWgpe2YucHVzaChuZXcgQy5Db2xvcigyNTUsMjU1LDI1NSwxKSk7cmV0dXJuIGYucmVkdWNlKEMuZmxhdHRlbkNvbG9ycyl9cmV0dXJuIG51bGx9LEQuaXNPcGFxdWU9ZnVuY3Rpb24oYSl7dmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSk7cmV0dXJuIGMoYSxiKXx8MT09PWQoYSxiKS5hbHBoYX0sQy5nZXRGb3JlZ3JvdW5kQ29sb3I9ZnVuY3Rpb24oYSxiKXt2YXIgYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxkPW5ldyBDLkNvbG9yO2QucGFyc2VSZ2JTdHJpbmcoYy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sb3JcIikpO3ZhciBlPWMuZ2V0UHJvcGVydHlWYWx1ZShcIm9wYWNpdHlcIik7aWYoZC5hbHBoYT1kLmFscGhhKmUsMT09PWQuYWxwaGEpcmV0dXJuIGQ7dmFyIGY9Qy5nZXRCYWNrZ3JvdW5kQ29sb3IoYSxbXSxiKTtpZihudWxsPT09Zil7dmFyIGc9YXhlLmNvbW1vbnMuY29sb3IuaW5jb21wbGV0ZURhdGEuZ2V0KFwiYmdDb2xvclwiKTtyZXR1cm4gYXhlLmNvbW1vbnMuY29sb3IuaW5jb21wbGV0ZURhdGEuc2V0KFwiZmdDb2xvclwiLGcpLG51bGx9cmV0dXJuIEMuZmxhdHRlbkNvbG9ycyhkLGYpfSxDLmluY29tcGxldGVEYXRhPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJue3NldDpmdW5jdGlvbihiLGMpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBiKXRocm93IG5ldyBFcnJvcihcIkluY29tcGxldGUgZGF0YToga2V5IG11c3QgYmUgYSBzdHJpbmdcIik7cmV0dXJuIGMmJihhW2JdPWMpLGFbYl19LGdldDpmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0sY2xlYXI6ZnVuY3Rpb24oKXthPXt9fX19KCksRC5yZWR1Y2VUb0VsZW1lbnRzQmVsb3dGbG9hdGluZz1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPVtcImZpeGVkXCIsXCJzdGlja3lcIl0sZz1bXSxoPSExO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZD1hW2NdLGQ9PT1iJiYoaD0hMCksZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkKSxofHwtMT09PWYuaW5kZXhPZihlLnBvc2l0aW9uKT9nLnB1c2goZCk6Zz1bXTtyZXR1cm4gZ30sRC5maW5kRWxtc0luQ29udGV4dD1mdW5jdGlvbihhKXt2YXIgYj1hLmNvbnRleHQsYz1hLnZhbHVlLGQ9YS5hdHRyLGU9YS5lbG0sZj12b2lkIDA9PT1lP1wiXCI6ZSxnPXZvaWQgMCxoPWF4ZS51dGlscy5lc2NhcGVTZWxlY3RvcihjKTtyZXR1cm4gZz05PT09Yi5ub2RlVHlwZXx8MTE9PT1iLm5vZGVUeXBlP2I6RC5nZXRSb290Tm9kZShiKSxBcnJheS5mcm9tKGcucXVlcnlTZWxlY3RvckFsbChmK1wiW1wiK2QrXCI9XCIraCtcIl1cIikpfSxELmZpbmRVcD1mdW5jdGlvbihhLGIpe3JldHVybiBELmZpbmRVcFZpcnR1YWwoYXhlLnV0aWxzLmdldE5vZGVGcm9tVHJlZShheGUuX3RyZWVbMF0sYSksYil9LEQuZmluZFVwVmlydHVhbD1mdW5jdGlvbihhLGIpe3ZhciBjPXZvaWQgMDtpZihjPWEuYWN0dWFsTm9kZSwhYS5zaGFkb3dJZCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5hY3R1YWxOb2RlLmNsb3Nlc3Qpe3ZhciBkPWEuYWN0dWFsTm9kZS5jbG9zZXN0KGIpO3JldHVybiBkfHxudWxsfWRveyhjPWMuYXNzaWduZWRTbG90P2MuYXNzaWduZWRTbG90OmMucGFyZW50Tm9kZSkmJjExPT09Yy5ub2RlVHlwZSYmKGM9Yy5ob3N0KX13aGlsZShjJiYhYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3RvcihjLGIpJiZjIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtyZXR1cm4gYXhlLnV0aWxzLm1hdGNoZXNTZWxlY3RvcihjLGIpP2M6bnVsbH0sRC5nZXRDb21wb3NlZFBhcmVudD1mdW5jdGlvbiBhKGIpe2lmKGIuYXNzaWduZWRTbG90KXJldHVybiBhKGIuYXNzaWduZWRTbG90KTtpZihiLnBhcmVudE5vZGUpe3ZhciBjPWIucGFyZW50Tm9kZTtpZigxPT09Yy5ub2RlVHlwZSlyZXR1cm4gYztpZihjLmhvc3QpcmV0dXJuIGMuaG9zdH1yZXR1cm4gbnVsbH0sRC5nZXRFbGVtZW50QnlSZWZlcmVuY2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZShiKTtpZihjJiZcIiNcIj09PWMuY2hhckF0KDApKXtjPWMuc3Vic3RyaW5nKDEpO3ZhciBkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpO2lmKGQpcmV0dXJuIGQ7aWYoZD1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShjKSxkLmxlbmd0aClyZXR1cm4gZFswXX1yZXR1cm4gbnVsbH0sRC5nZXRFbGVtZW50Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGI9RC5nZXRTY3JvbGxPZmZzZXQoZG9jdW1lbnQpLGM9Yi5sZWZ0LGQ9Yi50b3AsZT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt0b3A6ZS50b3ArZCxyaWdodDplLnJpZ2h0K2MsYm90dG9tOmUuYm90dG9tK2QsbGVmdDplLmxlZnQrYyx3aWR0aDplLnJpZ2h0LWUubGVmdCxoZWlnaHQ6ZS5ib3R0b20tZS50b3B9fSxELmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0Um9vdE5vZGUmJmEuZ2V0Um9vdE5vZGUoKXx8ZG9jdW1lbnQ7cmV0dXJuIGI9PT1hJiYoYj1kb2N1bWVudCksYn0sRC5nZXRTY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7aWYoIWEubm9kZVR5cGUmJmEuZG9jdW1lbnQmJihhPWEuZG9jdW1lbnQpLDk9PT1hLm5vZGVUeXBlKXt2YXIgYj1hLmRvY3VtZW50RWxlbWVudCxjPWEuYm9keTtyZXR1cm57bGVmdDpiJiZiLnNjcm9sbExlZnR8fGMmJmMuc2Nyb2xsTGVmdHx8MCx0b3A6YiYmYi5zY3JvbGxUb3B8fGMmJmMuc2Nyb2xsVG9wfHwwfX1yZXR1cm57bGVmdDphLnNjcm9sbExlZnQsdG9wOmEuc2Nyb2xsVG9wfX0sRC5nZXRWaWV3cG9ydFNpemU9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGIsYz1hLmRvY3VtZW50LGQ9Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGEuaW5uZXJXaWR0aD97d2lkdGg6YS5pbm5lcldpZHRoLGhlaWdodDphLmlubmVySGVpZ2h0fTpkP3t3aWR0aDpkLmNsaWVudFdpZHRoLGhlaWdodDpkLmNsaWVudEhlaWdodH06KGI9Yy5ib2R5LHt3aWR0aDpiLmNsaWVudFdpZHRoLGhlaWdodDpiLmNsaWVudEhlaWdodH0pfTt2YXIgSD1bXCJIRUFEXCIsXCJUSVRMRVwiLFwiVEVNUExBVEVcIixcIlNDUklQVFwiLFwiU1RZTEVcIixcIklGUkFNRVwiLFwiT0JKRUNUXCIsXCJWSURFT1wiLFwiQVVESU9cIixcIk5PU0NSSVBUXCJdO0QuaGFzQ29udGVudFZpcnR1YWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gaihhKXx8RC5pc1Zpc3VhbENvbnRlbnQoYS5hY3R1YWxOb2RlKXx8ISFBLmxhYmVsVmlydHVhbChhKXx8IWImJmEuY2hpbGRyZW4uc29tZShmdW5jdGlvbihhKXtyZXR1cm4gMT09PWEuYWN0dWFsTm9kZS5ub2RlVHlwZSYmRC5oYXNDb250ZW50VmlydHVhbChhKX0pfSxELmhhc0NvbnRlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1heGUudXRpbHMuZ2V0Tm9kZUZyb21UcmVlKGF4ZS5fdHJlZVswXSxhKSxELmhhc0NvbnRlbnRWaXJ0dWFsKGEsYil9LEQuaWRyZWZzPWZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGMsZCxlPUQuZ2V0Um9vdE5vZGUoYSksZj1bXSxnPWEuZ2V0QXR0cmlidXRlKGIpO2lmKGcpZm9yKGc9YXhlLnV0aWxzLnRva2VuTGlzdChnKSxjPTAsZD1nLmxlbmd0aDtjPGQ7YysrKWYucHVzaChlLmdldEVsZW1lbnRCeUlkKGdbY10pKTtyZXR1cm4gZn0sRC5pc0ZvY3VzYWJsZT1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtpZihrKGEpKXJldHVybiExO2lmKEQuaXNOYXRpdmVseUZvY3VzYWJsZShhKSlyZXR1cm4hMDt2YXIgYj1hLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpO3JldHVybiEoIWJ8fGlzTmFOKHBhcnNlSW50KGIsMTApKSl9LEQuaXNOYXRpdmVseUZvY3VzYWJsZT1mdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjtpZighYXx8ayhhKSlyZXR1cm4hMTtzd2l0Y2goYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKXtjYXNlXCJBXCI6Y2FzZVwiQVJFQVwiOmlmKGEuaHJlZilyZXR1cm4hMDticmVhaztjYXNlXCJJTlBVVFwiOnJldHVyblwiaGlkZGVuXCIhPT1hLnR5cGU7Y2FzZVwiVEVYVEFSRUFcIjpjYXNlXCJTRUxFQ1RcIjpjYXNlXCJERVRBSUxTXCI6Y2FzZVwiQlVUVE9OXCI6cmV0dXJuITB9cmV0dXJuITF9LEQuaW5zZXJ0ZWRJbnRvRm9jdXNPcmRlcj1mdW5jdGlvbihhKXtyZXR1cm4gYS50YWJJbmRleD4tMSYmRC5pc0ZvY3VzYWJsZShhKSYmIUQuaXNOYXRpdmVseUZvY3VzYWJsZShhKX0sRC5pc0hUTUw1PWZ1bmN0aW9uKGEpe3ZhciBiPWEuZG9jdHlwZTtyZXR1cm4gbnVsbCE9PWImJihcImh0bWxcIj09PWIubmFtZSYmIWIucHVibGljSWQmJiFiLnN5c3RlbUlkKX07dmFyIEk9W1wiYmxvY2tcIixcImxpc3QtaXRlbVwiLFwidGFibGVcIixcImZsZXhcIixcImdyaWRcIixcImlubGluZS1ibG9ja1wiXTtELmlzSW5UZXh0QmxvY2s9ZnVuY3Rpb24oYSl7aWYobShhKSlyZXR1cm4hMTt2YXIgYj1uKGEpLGM9XCJcIixkPVwiXCIsZT0wO3JldHVybiBsKGIsZnVuY3Rpb24oYil7aWYoMj09PWUpcmV0dXJuITE7aWYoMz09PWIubm9kZVR5cGUmJihjKz1iLm5vZGVWYWx1ZSksMT09PWIubm9kZVR5cGUpe3ZhciBmPShiLm5vZGVOYW1lfHxcIlwiKS50b1VwcGVyQ2FzZSgpO2lmKFtcIkJSXCIsXCJIUlwiXS5pbmNsdWRlcyhmKSkwPT09ZT8oYz1cIlwiLGQ9XCJcIik6ZT0yO2Vsc2V7aWYoXCJub25lXCI9PT1iLnN0eWxlLmRpc3BsYXl8fFwiaGlkZGVuXCI9PT1iLnN0eWxlLm92ZXJmbG93fHwhW1wiXCIsbnVsbCxcIm5vbmVcIl0uaW5jbHVkZXMoYi5zdHlsZS5mbG9hdCl8fCFbXCJcIixudWxsLFwicmVsYXRpdmVcIl0uaW5jbHVkZXMoYi5zdHlsZS5wb3NpdGlvbikpcmV0dXJuITE7aWYoXCJBXCI9PT1mJiZiLmhyZWZ8fFwibGlua1wiPT09KGIuZ2V0QXR0cmlidXRlKFwicm9sZVwiKXx8XCJcIikudG9Mb3dlckNhc2UoKSlyZXR1cm4gYj09PWEmJihlPTEpLGQrPWIudGV4dENvbnRlbnQsITF9fX0pLGM9YXhlLmNvbW1vbnMudGV4dC5zYW5pdGl6ZShjKSxkPWF4ZS5jb21tb25zLnRleHQuc2FuaXRpemUoZCksYy5sZW5ndGg+ZC5sZW5ndGh9LEQuaXNOb2RlPWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhIGluc3RhbmNlb2YgTm9kZX0sRC5pc09mZnNjcmVlbj1mdW5jdGlvbihhKXt2YXIgYj12b2lkIDAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHl8fGMpLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIiksZj1ELmdldEVsZW1lbnRDb29yZGluYXRlcyhhKTtpZihmLmJvdHRvbTwwJiYobyhhLGYuYm90dG9tKXx8XCJhYnNvbHV0ZVwiPT09ZC5wb3NpdGlvbikpcmV0dXJuITA7aWYoMD09PWYubGVmdCYmMD09PWYucmlnaHQpcmV0dXJuITE7aWYoXCJsdHJcIj09PWUpe2lmKGYucmlnaHQ8PTApcmV0dXJuITB9ZWxzZSBpZihiPU1hdGgubWF4KGMuc2Nyb2xsV2lkdGgsRC5nZXRWaWV3cG9ydFNpemUod2luZG93KS53aWR0aCksZi5sZWZ0Pj1iKXJldHVybiEwO3JldHVybiExfSxELmlzVmlzaWJsZT1mdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQsZSxmO3JldHVybiA5PT09YS5ub2RlVHlwZXx8KDExPT09YS5ub2RlVHlwZSYmKGE9YS5ob3N0KSxudWxsIT09KGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSkmJihlPWEubm9kZU5hbWUudG9VcHBlckNhc2UoKSwhKFwibm9uZVwiPT09ZC5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKXx8XCJTVFlMRVwiPT09ZS50b1VwcGVyQ2FzZSgpfHxcIlNDUklQVFwiPT09ZS50b1VwcGVyQ2FzZSgpfHwhYiYmcChkLmdldFByb3BlcnR5VmFsdWUoXCJjbGlwXCIpKXx8IWMmJihcImhpZGRlblwiPT09ZC5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJpbGl0eVwiKXx8IWImJkQuaXNPZmZzY3JlZW4oYSkpfHxiJiZcInRydWVcIj09PWEuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikpJiYoISEoZj1hLmFzc2lnbmVkU2xvdD9hLmFzc2lnbmVkU2xvdDphLnBhcmVudE5vZGUpJiZELmlzVmlzaWJsZShmLGIsITApKSkpfTt2YXIgSj1bXCJjaGVja2JveFwiLFwiaW1nXCIsXCJyYWRpb1wiLFwicmFuZ2VcIixcInNsaWRlclwiLFwic3BpbmJ1dHRvblwiLFwidGV4dGJveFwiXTtELmlzVmlzdWFsQ29udGVudD1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZShcInJvbGVcIik7aWYoYilyZXR1cm4tMSE9PUouaW5kZXhPZihiKTtzd2l0Y2goYS50YWdOYW1lLnRvVXBwZXJDYXNlKCkpe2Nhc2VcIklNR1wiOmNhc2VcIklGUkFNRVwiOmNhc2VcIk9CSkVDVFwiOmNhc2VcIlZJREVPXCI6Y2FzZVwiQVVESU9cIjpjYXNlXCJDQU5WQVNcIjpjYXNlXCJTVkdcIjpjYXNlXCJNQVRIXCI6Y2FzZVwiQlVUVE9OXCI6Y2FzZVwiU0VMRUNUXCI6Y2FzZVwiVEVYVEFSRUFcIjpjYXNlXCJLRVlHRU5cIjpjYXNlXCJQUk9HUkVTU1wiOmNhc2VcIk1FVEVSXCI6cmV0dXJuITA7Y2FzZVwiSU5QVVRcIjpyZXR1cm5cImhpZGRlblwiIT09YS50eXBlO2RlZmF1bHQ6cmV0dXJuITF9fSxELnNoYWRvd0VsZW1lbnRzRnJvbVBvaW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpkb2N1bWVudCkuZWxlbWVudHNGcm9tUG9pbnQoYSxiKS5yZWR1Y2UoZnVuY3Rpb24oYyxkKXtpZihheGUudXRpbHMuaXNTaGFkb3dSb290KGQpKXt2YXIgZT1ELnNoYWRvd0VsZW1lbnRzRnJvbVBvaW50KGEsYixkLnNoYWRvd1Jvb3QpO2M9Yy5jb25jYXQoZSksYy5sZW5ndGgmJmF4ZS5jb21tb25zLmRvbS52aXN1YWxseUNvbnRhaW5zKGNbMF0sZCkmJmMucHVzaChkKX1lbHNlIGMucHVzaChkKTtyZXR1cm4gY30sW10pfSxELnZpc3VhbGx5Q29udGFpbnM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9e3RvcDpjLnRvcCsuMDEsYm90dG9tOmMuYm90dG9tLS4wMSxsZWZ0OmMubGVmdCsuMDEscmlnaHQ6Yy5yaWdodC0uMDF9LGU9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPWUudG9wLGc9ZS5sZWZ0LGg9e3RvcDpmLWIuc2Nyb2xsVG9wLGJvdHRvbTpmLWIuc2Nyb2xsVG9wK2Iuc2Nyb2xsSGVpZ2h0LGxlZnQ6Zy1iLnNjcm9sbExlZnQscmlnaHQ6Zy1iLnNjcm9sbExlZnQrYi5zY3JvbGxXaWR0aH0saT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKTtyZXR1cm5cImlubGluZVwiPT09aS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKXx8IShkLmxlZnQ8aC5sZWZ0JiZkLmxlZnQ8ZS5sZWZ0fHxkLnRvcDxoLnRvcCYmZC50b3A8ZS50b3B8fGQucmlnaHQ+aC5yaWdodCYmZC5yaWdodD5lLnJpZ2h0fHxkLmJvdHRvbT5oLmJvdHRvbSYmZC5ib3R0b20+ZS5ib3R0b20pJiYoIShkLnJpZ2h0PmUucmlnaHR8fGQuYm90dG9tPmUuYm90dG9tKXx8KFwic2Nyb2xsXCI9PT1pLm92ZXJmbG93fHxcImF1dG9cIj09PWkub3ZlcmZsb3d8fFwiaGlkZGVuXCI9PT1pLm92ZXJmbG93fHxiIGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50fHxiIGluc3RhbmNlb2YgSFRNTEh0bWxFbGVtZW50KSl9LEQudmlzdWFsbHlPdmVybGFwcz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1jLnRvcCxlPWMubGVmdCxmPXt0b3A6ZC1iLnNjcm9sbFRvcCxib3R0b206ZC1iLnNjcm9sbFRvcCtiLnNjcm9sbEhlaWdodCxsZWZ0OmUtYi5zY3JvbGxMZWZ0LHJpZ2h0OmUtYi5zY3JvbGxMZWZ0K2Iuc2Nyb2xsV2lkdGh9O2lmKGEubGVmdD5mLnJpZ2h0JiZhLmxlZnQ+Yy5yaWdodHx8YS50b3A+Zi5ib3R0b20mJmEudG9wPmMuYm90dG9tfHxhLnJpZ2h0PGYubGVmdCYmYS5yaWdodDxjLmxlZnR8fGEuYm90dG9tPGYudG9wJiZhLmJvdHRvbTxjLnRvcClyZXR1cm4hMTt2YXIgZz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKTtyZXR1cm4hKGEubGVmdD5jLnJpZ2h0fHxhLnRvcD5jLmJvdHRvbSl8fChcInNjcm9sbFwiPT09Zy5vdmVyZmxvd3x8XCJhdXRvXCI9PT1nLm92ZXJmbG93fHxiIGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50fHxiIGluc3RhbmNlb2YgSFRNTEh0bWxFbGVtZW50KX0sRS5nZXRBbGxDZWxscz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmPVtdO2ZvcihiPTAsZD1hLnJvd3MubGVuZ3RoO2I8ZDtiKyspZm9yKGM9MCxlPWEucm93c1tiXS5jZWxscy5sZW5ndGg7YzxlO2MrKylmLnB1c2goYS5yb3dzW2JdLmNlbGxzW2NdKTtyZXR1cm4gZn0sRS5nZXRDZWxsUG9zaXRpb249ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihifHwoYj1FLnRvR3JpZChELmZpbmRVcChhLFwidGFibGVcIikpKSxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXSYmLTEhPT0oZD1iW2NdLmluZGV4T2YoYSkpKXJldHVybnt4OmQseTpjfX0sRS5nZXRIZWFkZXJzPWZ1bmN0aW9uKGEpe2lmKGEuaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSlyZXR1cm4gY29tbW9ucy5kb20uaWRyZWZzKGEsXCJoZWFkZXJzXCIpO3ZhciBiPWNvbW1vbnMudGFibGUudG9HcmlkKGNvbW1vbnMuZG9tLmZpbmRVcChhLFwidGFibGVcIikpLGM9Y29tbW9ucy50YWJsZS5nZXRDZWxsUG9zaXRpb24oYSxiKTtyZXR1cm5bXS5jb25jYXQoRS50cmF2ZXJzZShcImxlZnRcIixjLGIpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gRS5pc1Jvd0hlYWRlcihhKX0pLEUudHJhdmVyc2UoXCJ1cFwiLGMsYikuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBFLmlzQ29sdW1uSGVhZGVyKGEpfSkpLnJldmVyc2UoKX0sRS5nZXRTY29wZT1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLGM9YS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO2lmKGEgaW5zdGFuY2VvZiBFbGVtZW50PT0hMXx8LTE9PT1bXCJURFwiLFwiVEhcIl0uaW5kZXhPZihhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBURCBvciBUSCBlbGVtZW50XCIpO2lmKFwiY29sdW1uaGVhZGVyXCI9PT1jKXJldHVyblwiY29sXCI7aWYoXCJyb3doZWFkZXJcIj09PWMpcmV0dXJuXCJyb3dcIjtpZihcImNvbFwiPT09Ynx8XCJyb3dcIj09PWIpcmV0dXJuIGI7aWYoXCJUSFwiIT09YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKXJldHVybiExO3ZhciBkPUUudG9HcmlkKEQuZmluZFVwKGEsXCJ0YWJsZVwiKSksZT1FLmdldENlbGxQb3NpdGlvbihhKTtyZXR1cm4gZFtlLnldLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhJiZcIlRIXCI9PT1iLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCl9LCEwKT9cImNvbFwiOmQubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhW2UueF19KS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmXCJUSFwiPT09Yi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpfSwhMCk/XCJyb3dcIjpcImF1dG9cIn0sRS5pc0NvbHVtbkhlYWRlcj1mdW5jdGlvbihhKXtyZXR1cm4tMSE9PVtcImNvbFwiLFwiYXV0b1wiXS5pbmRleE9mKEUuZ2V0U2NvcGUoYSkpfSxFLmlzRGF0YUNlbGw9ZnVuY3Rpb24oYSl7cmV0dXJuISghYS5jaGlsZHJlbi5sZW5ndGgmJiFhLnRleHRDb250ZW50LnRyaW0oKSkmJlwiVERcIj09PWEubm9kZU5hbWUudG9VcHBlckNhc2UoKX0sRS5pc0RhdGFUYWJsZT1mdW5jdGlvbihhKXt2YXIgYj0oYS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpfHxcIlwiKS50b0xvd2VyQ2FzZSgpO2lmKChcInByZXNlbnRhdGlvblwiPT09Ynx8XCJub25lXCI9PT1iKSYmIUQuaXNGb2N1c2FibGUoYSkpcmV0dXJuITE7aWYoXCJ0cnVlXCI9PT1hLmdldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKXx8RC5maW5kVXAoYSwnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSlyZXR1cm4hMDtpZihcImdyaWRcIj09PWJ8fFwidHJlZWdyaWRcIj09PWJ8fFwidGFibGVcIj09PWIpcmV0dXJuITA7aWYoXCJsYW5kbWFya1wiPT09Y29tbW9ucy5hcmlhLmdldFJvbGVUeXBlKGIpKXJldHVybiEwO2lmKFwiMFwiPT09YS5nZXRBdHRyaWJ1dGUoXCJkYXRhdGFibGVcIikpcmV0dXJuITE7aWYoYS5nZXRBdHRyaWJ1dGUoXCJzdW1tYXJ5XCIpKXJldHVybiEwO2lmKGEudEhlYWR8fGEudEZvb3R8fGEuY2FwdGlvbilyZXR1cm4hMDtmb3IodmFyIGM9MCxkPWEuY2hpbGRyZW4ubGVuZ3RoO2M8ZDtjKyspaWYoXCJDT0xHUk9VUFwiPT09YS5jaGlsZHJlbltjXS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKXJldHVybiEwO2Zvcih2YXIgZSxmLGc9MCxoPWEucm93cy5sZW5ndGgsaT0hMSxqPTA7ajxoO2orKyl7ZT1hLnJvd3Nbal07Zm9yKHZhciBrPTAsbD1lLmNlbGxzLmxlbmd0aDtrPGw7aysrKXtpZihmPWUuY2VsbHNba10sXCJUSFwiPT09Zi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKXJldHVybiEwO2lmKGl8fGYub2Zmc2V0V2lkdGg9PT1mLmNsaWVudFdpZHRoJiZmLm9mZnNldEhlaWdodD09PWYuY2xpZW50SGVpZ2h0fHwoaT0hMCksZi5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKXx8Zi5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpfHxmLmdldEF0dHJpYnV0ZShcImFiYnJcIikpcmV0dXJuITA7aWYoW1wiY29sdW1uaGVhZGVyXCIsXCJyb3doZWFkZXJcIl0uaW5jbHVkZXMoKGYuZ2V0QXR0cmlidXRlKFwicm9sZVwiKXx8XCJcIikudG9Mb3dlckNhc2UoKSkpcmV0dXJuITA7aWYoMT09PWYuY2hpbGRyZW4ubGVuZ3RoJiZcIkFCQlJcIj09PWYuY2hpbGRyZW5bMF0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSlyZXR1cm4hMDtnKyt9fWlmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0YWJsZVwiKS5sZW5ndGgpcmV0dXJuITE7aWYoaDwyKXJldHVybiExO3ZhciBtPWEucm93c1tNYXRoLmNlaWwoaC8yKV07aWYoMT09PW0uY2VsbHMubGVuZ3RoJiYxPT09bS5jZWxsc1swXS5jb2xTcGFuKXJldHVybiExO2lmKG0uY2VsbHMubGVuZ3RoPj01KXJldHVybiEwO2lmKGkpcmV0dXJuITA7dmFyIG4sbztmb3Ioaj0wO2o8aDtqKyspe2lmKGU9YS5yb3dzW2pdLG4mJm4hPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKFwiYmFja2dyb3VuZC1jb2xvclwiKSlyZXR1cm4hMDtpZihuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpLG8mJm8hPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKFwiYmFja2dyb3VuZC1pbWFnZVwiKSlyZXR1cm4hMDtvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWltYWdlXCIpfXJldHVybiBoPj0yMHx8IShELmdldEVsZW1lbnRDb29yZGluYXRlcyhhKS53aWR0aD4uOTUqRC5nZXRWaWV3cG9ydFNpemUod2luZG93KS53aWR0aCkmJighKGc8MTApJiYhYS5xdWVyeVNlbGVjdG9yKFwib2JqZWN0LCBlbWJlZCwgaWZyYW1lLCBhcHBsZXRcIikpfSxFLmlzSGVhZGVyPWZ1bmN0aW9uKGEpe2lmKEUuaXNDb2x1bW5IZWFkZXIoYSl8fEUuaXNSb3dIZWFkZXIoYSkpcmV0dXJuITA7aWYoYS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSl7dmFyIGI9YXhlLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGEuZ2V0QXR0cmlidXRlKFwiaWRcIikpO3JldHVybiEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hlYWRlcnN+PVwiJytiKydcIl0nKX1yZXR1cm4hMX0sRS5pc1Jvd0hlYWRlcj1mdW5jdGlvbihhKXtyZXR1cm5bXCJyb3dcIixcImF1dG9cIl0uaW5jbHVkZXMoRS5nZXRTY29wZShhKSl9LEUudG9HcmlkPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPWEucm93cyxkPTAsZT1jLmxlbmd0aDtkPGU7ZCsrKXt2YXIgZj1jW2RdLmNlbGxzO2JbZF09YltkXXx8W107Zm9yKHZhciBnPTAsaD0wLGk9Zi5sZW5ndGg7aDxpO2grKylmb3IodmFyIGo9MDtqPGZbaF0uY29sU3BhbjtqKyspe2Zvcih2YXIgaz0wO2s8ZltoXS5yb3dTcGFuO2srKyl7Zm9yKGJbZCtrXT1iW2Qra118fFtdO2JbZCtrXVtnXTspZysrO2JbZCtrXVtnXT1mW2hdfWcrK319cmV0dXJuIGJ9LEUudG9BcnJheT1FLnRvR3JpZCxmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbiBhKGIsYyxkLGUpe3ZhciBmLGc9ZFtjLnldP2RbYy55XVtjLnhdOnZvaWQgMDtyZXR1cm4gZz9cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiYhMD09PShmPWUoZyxjLGQpKT9bZ106KGY9YShiLHt4OmMueCtiLngseTpjLnkrYi55fSxkLGUpLGYudW5zaGlmdChnKSxmKTpbXX07YS50cmF2ZXJzZT1mdW5jdGlvbihhLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGMpJiYoZT1kLGQ9YyxjPXt4OjAseTowfSksXCJzdHJpbmdcIj09dHlwZW9mIGEpc3dpdGNoKGEpe2Nhc2VcImxlZnRcIjphPXt4Oi0xLHk6MH07YnJlYWs7Y2FzZVwidXBcIjphPXt4OjAseTotMX07YnJlYWs7Y2FzZVwicmlnaHRcIjphPXt4OjEseTowfTticmVhaztjYXNlXCJkb3duXCI6YT17eDowLHk6MX19cmV0dXJuIGIoYSx7eDpjLngrYS54LHk6Yy55K2EueX0sZCxlKX19KEUpO3ZhciBLPXtzdWJtaXQ6XCJTdWJtaXRcIixyZXNldDpcIlJlc2V0XCJ9LEw9W1widGV4dFwiLFwic2VhcmNoXCIsXCJ0ZWxcIixcInVybFwiLFwiZW1haWxcIixcImRhdGVcIixcInRpbWVcIixcIm51bWJlclwiLFwicmFuZ2VcIixcImNvbG9yXCJdLE09W1wiQVwiLFwiRU1cIixcIlNUUk9OR1wiLFwiU01BTExcIixcIk1BUktcIixcIkFCQlJcIixcIkRGTlwiLFwiSVwiLFwiQlwiLFwiU1wiLFwiVVwiLFwiQ09ERVwiLFwiVkFSXCIsXCJTQU1QXCIsXCJLQkRcIixcIlNVUFwiLFwiU1VCXCIsXCJRXCIsXCJDSVRFXCIsXCJTUEFOXCIsXCJCRE9cIixcIkJESVwiLFwiQlJcIixcIldCUlwiLFwiSU5TXCIsXCJERUxcIixcIklNR1wiLFwiRU1CRURcIixcIk9CSkVDVFwiLFwiSUZSQU1FXCIsXCJNQVBcIixcIkFSRUFcIixcIlNDUklQVFwiLFwiTk9TQ1JJUFRcIixcIlJVQllcIixcIlZJREVPXCIsXCJBVURJT1wiLFwiSU5QVVRcIixcIlRFWFRBUkVBXCIsXCJTRUxFQ1RcIixcIkJVVFRPTlwiLFwiTEFCRUxcIixcIk9VVFBVVFwiLFwiREFUQUxJU1RcIixcIktFWUdFTlwiLFwiUFJPR1JFU1NcIixcIkNPTU1BTkRcIixcIkNBTlZBU1wiLFwiVElNRVwiLFwiTUVURVJcIl07Ri5hY2Nlc3NpYmxlVGV4dD1mdW5jdGlvbihhLGIpe3ZhciBjPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGEpO3JldHVybiBheGUuY29tbW9ucy50ZXh0LmFjY2Vzc2libGVUZXh0VmlydHVhbChjLGIpfSxGLmFjY2Vzc2libGVUZXh0VmlydHVhbD1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGMpe3JldHVybiBhLmNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbihhLGQpe3ZhciBlPWQuYWN0dWFsTm9kZTtyZXR1cm4gMz09PWUubm9kZVR5cGU/YSs9ZS5ub2RlVmFsdWU6MT09PWUubm9kZVR5cGUmJihNLmluY2x1ZGVzKGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSl8fChhKz1cIiBcIiksYSs9ZyhkLGIsYykpLGF9LFwiXCIpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF4ZS5jb21tb25zLnRhYmxlLmlzRGF0YVRhYmxlKGEuYWN0dWFsTm9kZSl8fDEhPT1heGUuY29tbW9ucy50YWJsZS5nZXRBbGxDZWxscyhhLmFjdHVhbE5vZGUpLmxlbmd0aD9cIlwiOmMoYSwhMSwhMSkudHJpbSgpfWZ1bmN0aW9uIGUoYSxiLGUpe3ZhciBmPVwiXCIsaD1hLmFjdHVhbE5vZGUsaT1oLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYodChhKSYmKGY9YyhhLCExLCExKXx8XCJcIix6KGYpKSlyZXR1cm4gZjtpZihcIkZJR1VSRVwiPT09aSYmKGY9dyhhLFwiZmlnY2FwdGlvblwiKSx6KGYpKSlyZXR1cm4gZjtpZihcIlRBQkxFXCI9PT1pKXtpZihmPXcoYSxcImNhcHRpb25cIikseihmKSlyZXR1cm4gZjtpZihmPWguZ2V0QXR0cmlidXRlKFwidGl0bGVcIil8fGguZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKXx8ZChhKXx8XCJcIix6KGYpKXJldHVybiBmfWlmKHkoYSkpcmV0dXJuIGguZ2V0QXR0cmlidXRlKFwiYWx0XCIpfHxcIlwiO2lmKHMoYSkmJiFlKXtpZihyKGEpKXJldHVybiBoLnZhbHVlfHxoLnRpdGxlfHxLW2gudHlwZV18fFwiXCI7dmFyIGo9cShhKTtpZihqKXJldHVybiBnKGosYiwhMCl9cmV0dXJuXCJcIn1mdW5jdGlvbiBmKGEsYixjKXt2YXIgZD1cIlwiLGU9YS5hY3R1YWxOb2RlO3JldHVybiFiJiZlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSYmKGQ9Ri5zYW5pdGl6ZShELmlkcmVmcyhlLFwiYXJpYS1sYWJlbGxlZGJ5XCIpLm1hcChmdW5jdGlvbihhKXtpZihudWxsIT09YSl7ZT09PWEmJmgucG9wKCk7dmFyIGI9YXhlLnV0aWxzLmdldE5vZGVGcm9tVHJlZShheGUuX3RyZWVbMF0sYSk7cmV0dXJuIGcoYiwhMCxlIT09YSl9cmV0dXJuXCJcIn0pLmpvaW4oXCIgXCIpKSksZHx8YyYmeChhKXx8IWUuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKT9kOkYuc2FuaXRpemUoZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKX12YXIgZz12b2lkIDAsaD1bXTtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJihhPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGEpKSxnPWZ1bmN0aW9uKGEsYixkKXt2YXIgZz12b2lkIDA7aWYoIWF8fGguaW5jbHVkZXMoYSkpcmV0dXJuXCJcIjtpZihudWxsIT09YSYmYS5hY3R1YWxOb2RlIGluc3RhbmNlb2YgTm9kZSE9ITApdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudC4gVmlydHVhbCBOb2RlIG11c3QgYmUgcHJvdmlkZWRcIik7aWYoIWImJiFELmlzVmlzaWJsZShhLmFjdHVhbE5vZGUsITApKXJldHVyblwiXCI7aC5wdXNoKGEpO3ZhciBpPWEuYWN0dWFsTm9kZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO3JldHVybiBnPWYoYSxiLGQpLHooZyk/ZzooZz1lKGEsYixkKSx6KGcpP2c6ZCYmKGc9dihhKSx6KGcpKT9nOnUoYSl8fGkmJi0xPT09QS5nZXRSb2xlc1dpdGhOYW1lRnJvbUNvbnRlbnRzKCkuaW5kZXhPZihpKXx8KGc9YyhhLGIsZCksIXooZykpP2EuYWN0dWFsTm9kZS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKT9hLmFjdHVhbE5vZGUuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik6XCJcIjpnKX0sRi5zYW5pdGl6ZShnKGEsYikpfSxGLmxhYmVsVmlydHVhbD1mdW5jdGlvbihhKXt2YXIgYixjLGQ7aWYoYz1BLmxhYmVsVmlydHVhbChhKSlyZXR1cm4gYztpZihhLmFjdHVhbE5vZGUuaWQpe3ZhciBlPWF4ZS5jb21tb25zLnV0aWxzLmVzY2FwZVNlbGVjdG9yKGEuYWN0dWFsTm9kZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7aWYoZD1heGUuY29tbW9ucy5kb20uZ2V0Um9vdE5vZGUoYS5hY3R1YWxOb2RlKSxiPWQucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPVwiJytlKydcIl0nKSxjPWImJkYudmlzaWJsZShiLCEwKSlyZXR1cm4gY31yZXR1cm4gYj1ELmZpbmRVcFZpcnR1YWwoYSxcImxhYmVsXCIpLChjPWImJkYudmlzaWJsZShiLCEwKSl8fG51bGx9LEYubGFiZWw9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YXhlLnV0aWxzLmdldE5vZGVGcm9tVHJlZShheGUuX3RyZWVbMF0sYSksRi5sYWJlbFZpcnR1YWwoYSl9LEYuc2FuaXRpemU9ZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGEucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIikucmVwbGFjZSgvXFx1MDBBMC9nLFwiIFwiKS5yZXBsYWNlKC9bXFxzXXsyLH0vZyxcIiBcIikudHJpbSgpfSxGLnZpc2libGVWaXJ0dWFsPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNoaWxkcmVuLm1hcChmdW5jdGlvbihkKXtpZigzPT09ZC5hY3R1YWxOb2RlLm5vZGVUeXBlKXt2YXIgZT1kLmFjdHVhbE5vZGUubm9kZVZhbHVlO2lmKGUmJkQuaXNWaXNpYmxlKGEuYWN0dWFsTm9kZSxiKSlyZXR1cm4gZX1lbHNlIGlmKCFjKXJldHVybiBGLnZpc2libGVWaXJ0dWFsKGQsYil9KS5qb2luKFwiXCIpO3JldHVybiBGLnNhbml0aXplKGQpfSxGLnZpc2libGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhPWF4ZS51dGlscy5nZXROb2RlRnJvbVRyZWUoYXhlLl90cmVlWzBdLGEpLEYudmlzaWJsZVZpcnR1YWwoYSxiLGMpfSxheGUudXRpbHMudG9rZW5MaXN0PWZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO3JldHVybiBhLnRyaW0oKS5yZXBsYWNlKC9cXHN7Mix9L2csXCIgXCIpLnNwbGl0KFwiIFwiKX1cbjt2YXIgTj1bXCJhYVwiLFwiYWJcIixcImFlXCIsXCJhZlwiLFwiYWtcIixcImFtXCIsXCJhblwiLFwiYXJcIixcImFzXCIsXCJhdlwiLFwiYXlcIixcImF6XCIsXCJiYVwiLFwiYmVcIixcImJnXCIsXCJiaFwiLFwiYmlcIixcImJtXCIsXCJiblwiLFwiYm9cIixcImJyXCIsXCJic1wiLFwiY2FcIixcImNlXCIsXCJjaFwiLFwiY29cIixcImNyXCIsXCJjc1wiLFwiY3VcIixcImN2XCIsXCJjeVwiLFwiZGFcIixcImRlXCIsXCJkdlwiLFwiZHpcIixcImVlXCIsXCJlbFwiLFwiZW5cIixcImVvXCIsXCJlc1wiLFwiZXRcIixcImV1XCIsXCJmYVwiLFwiZmZcIixcImZpXCIsXCJmalwiLFwiZm9cIixcImZyXCIsXCJmeVwiLFwiZ2FcIixcImdkXCIsXCJnbFwiLFwiZ25cIixcImd1XCIsXCJndlwiLFwiaGFcIixcImhlXCIsXCJoaVwiLFwiaG9cIixcImhyXCIsXCJodFwiLFwiaHVcIixcImh5XCIsXCJoelwiLFwiaWFcIixcImlkXCIsXCJpZVwiLFwiaWdcIixcImlpXCIsXCJpa1wiLFwiaW5cIixcImlvXCIsXCJpc1wiLFwiaXRcIixcIml1XCIsXCJpd1wiLFwiamFcIixcImppXCIsXCJqdlwiLFwiandcIixcImthXCIsXCJrZ1wiLFwia2lcIixcImtqXCIsXCJra1wiLFwia2xcIixcImttXCIsXCJrblwiLFwia29cIixcImtyXCIsXCJrc1wiLFwia3VcIixcImt2XCIsXCJrd1wiLFwia3lcIixcImxhXCIsXCJsYlwiLFwibGdcIixcImxpXCIsXCJsblwiLFwibG9cIixcImx0XCIsXCJsdVwiLFwibHZcIixcIm1nXCIsXCJtaFwiLFwibWlcIixcIm1rXCIsXCJtbFwiLFwibW5cIixcIm1vXCIsXCJtclwiLFwibXNcIixcIm10XCIsXCJteVwiLFwibmFcIixcIm5iXCIsXCJuZFwiLFwibmVcIixcIm5nXCIsXCJubFwiLFwibm5cIixcIm5vXCIsXCJuclwiLFwibnZcIixcIm55XCIsXCJvY1wiLFwib2pcIixcIm9tXCIsXCJvclwiLFwib3NcIixcInBhXCIsXCJwaVwiLFwicGxcIixcInBzXCIsXCJwdFwiLFwicXVcIixcInJtXCIsXCJyblwiLFwicm9cIixcInJ1XCIsXCJyd1wiLFwic2FcIixcInNjXCIsXCJzZFwiLFwic2VcIixcInNnXCIsXCJzaFwiLFwic2lcIixcInNrXCIsXCJzbFwiLFwic21cIixcInNuXCIsXCJzb1wiLFwic3FcIixcInNyXCIsXCJzc1wiLFwic3RcIixcInN1XCIsXCJzdlwiLFwic3dcIixcInRhXCIsXCJ0ZVwiLFwidGdcIixcInRoXCIsXCJ0aVwiLFwidGtcIixcInRsXCIsXCJ0blwiLFwidG9cIixcInRyXCIsXCJ0c1wiLFwidHRcIixcInR3XCIsXCJ0eVwiLFwidWdcIixcInVrXCIsXCJ1clwiLFwidXpcIixcInZlXCIsXCJ2aVwiLFwidm9cIixcIndhXCIsXCJ3b1wiLFwieGhcIixcInlpXCIsXCJ5b1wiLFwiemFcIixcInpoXCIsXCJ6dVwiLFwiYWFhXCIsXCJhYWJcIixcImFhY1wiLFwiYWFkXCIsXCJhYWVcIixcImFhZlwiLFwiYWFnXCIsXCJhYWhcIixcImFhaVwiLFwiYWFrXCIsXCJhYWxcIixcImFhbVwiLFwiYWFuXCIsXCJhYW9cIixcImFhcFwiLFwiYWFxXCIsXCJhYXNcIixcImFhdFwiLFwiYWF1XCIsXCJhYXZcIixcImFhd1wiLFwiYWF4XCIsXCJhYXpcIixcImFiYVwiLFwiYWJiXCIsXCJhYmNcIixcImFiZFwiLFwiYWJlXCIsXCJhYmZcIixcImFiZ1wiLFwiYWJoXCIsXCJhYmlcIixcImFialwiLFwiYWJsXCIsXCJhYm1cIixcImFiblwiLFwiYWJvXCIsXCJhYnBcIixcImFicVwiLFwiYWJyXCIsXCJhYnNcIixcImFidFwiLFwiYWJ1XCIsXCJhYnZcIixcImFid1wiLFwiYWJ4XCIsXCJhYnlcIixcImFielwiLFwiYWNhXCIsXCJhY2JcIixcImFjZFwiLFwiYWNlXCIsXCJhY2ZcIixcImFjaFwiLFwiYWNpXCIsXCJhY2tcIixcImFjbFwiLFwiYWNtXCIsXCJhY25cIixcImFjcFwiLFwiYWNxXCIsXCJhY3JcIixcImFjc1wiLFwiYWN0XCIsXCJhY3VcIixcImFjdlwiLFwiYWN3XCIsXCJhY3hcIixcImFjeVwiLFwiYWN6XCIsXCJhZGFcIixcImFkYlwiLFwiYWRkXCIsXCJhZGVcIixcImFkZlwiLFwiYWRnXCIsXCJhZGhcIixcImFkaVwiLFwiYWRqXCIsXCJhZGxcIixcImFkblwiLFwiYWRvXCIsXCJhZHBcIixcImFkcVwiLFwiYWRyXCIsXCJhZHNcIixcImFkdFwiLFwiYWR1XCIsXCJhZHdcIixcImFkeFwiLFwiYWR5XCIsXCJhZHpcIixcImFlYVwiLFwiYWViXCIsXCJhZWNcIixcImFlZFwiLFwiYWVlXCIsXCJhZWtcIixcImFlbFwiLFwiYWVtXCIsXCJhZW5cIixcImFlcVwiLFwiYWVyXCIsXCJhZXNcIixcImFldVwiLFwiYWV3XCIsXCJhZXlcIixcImFlelwiLFwiYWZhXCIsXCJhZmJcIixcImFmZFwiLFwiYWZlXCIsXCJhZmdcIixcImFmaFwiLFwiYWZpXCIsXCJhZmtcIixcImFmblwiLFwiYWZvXCIsXCJhZnBcIixcImFmc1wiLFwiYWZ0XCIsXCJhZnVcIixcImFmelwiLFwiYWdhXCIsXCJhZ2JcIixcImFnY1wiLFwiYWdkXCIsXCJhZ2VcIixcImFnZlwiLFwiYWdnXCIsXCJhZ2hcIixcImFnaVwiLFwiYWdqXCIsXCJhZ2tcIixcImFnbFwiLFwiYWdtXCIsXCJhZ25cIixcImFnb1wiLFwiYWdwXCIsXCJhZ3FcIixcImFnclwiLFwiYWdzXCIsXCJhZ3RcIixcImFndVwiLFwiYWd2XCIsXCJhZ3dcIixcImFneFwiLFwiYWd5XCIsXCJhZ3pcIixcImFoYVwiLFwiYWhiXCIsXCJhaGdcIixcImFoaFwiLFwiYWhpXCIsXCJhaGtcIixcImFobFwiLFwiYWhtXCIsXCJhaG5cIixcImFob1wiLFwiYWhwXCIsXCJhaHJcIixcImFoc1wiLFwiYWh0XCIsXCJhaWFcIixcImFpYlwiLFwiYWljXCIsXCJhaWRcIixcImFpZVwiLFwiYWlmXCIsXCJhaWdcIixcImFpaFwiLFwiYWlpXCIsXCJhaWpcIixcImFpa1wiLFwiYWlsXCIsXCJhaW1cIixcImFpblwiLFwiYWlvXCIsXCJhaXBcIixcImFpcVwiLFwiYWlyXCIsXCJhaXNcIixcImFpdFwiLFwiYWl3XCIsXCJhaXhcIixcImFpeVwiLFwiYWphXCIsXCJhamdcIixcImFqaVwiLFwiYWpuXCIsXCJhanBcIixcImFqdFwiLFwiYWp1XCIsXCJhandcIixcImFqelwiLFwiYWtiXCIsXCJha2NcIixcImFrZFwiLFwiYWtlXCIsXCJha2ZcIixcImFrZ1wiLFwiYWtoXCIsXCJha2lcIixcImFralwiLFwiYWtrXCIsXCJha2xcIixcImFrbVwiLFwiYWtvXCIsXCJha3BcIixcImFrcVwiLFwiYWtyXCIsXCJha3NcIixcImFrdFwiLFwiYWt1XCIsXCJha3ZcIixcImFrd1wiLFwiYWt4XCIsXCJha3lcIixcImFrelwiLFwiYWxhXCIsXCJhbGNcIixcImFsZFwiLFwiYWxlXCIsXCJhbGZcIixcImFsZ1wiLFwiYWxoXCIsXCJhbGlcIixcImFsalwiLFwiYWxrXCIsXCJhbGxcIixcImFsbVwiLFwiYWxuXCIsXCJhbG9cIixcImFscFwiLFwiYWxxXCIsXCJhbHJcIixcImFsc1wiLFwiYWx0XCIsXCJhbHVcIixcImFsdlwiLFwiYWx3XCIsXCJhbHhcIixcImFseVwiLFwiYWx6XCIsXCJhbWFcIixcImFtYlwiLFwiYW1jXCIsXCJhbWVcIixcImFtZlwiLFwiYW1nXCIsXCJhbWlcIixcImFtalwiLFwiYW1rXCIsXCJhbWxcIixcImFtbVwiLFwiYW1uXCIsXCJhbW9cIixcImFtcFwiLFwiYW1xXCIsXCJhbXJcIixcImFtc1wiLFwiYW10XCIsXCJhbXVcIixcImFtdlwiLFwiYW13XCIsXCJhbXhcIixcImFteVwiLFwiYW16XCIsXCJhbmFcIixcImFuYlwiLFwiYW5jXCIsXCJhbmRcIixcImFuZVwiLFwiYW5mXCIsXCJhbmdcIixcImFuaFwiLFwiYW5pXCIsXCJhbmpcIixcImFua1wiLFwiYW5sXCIsXCJhbm1cIixcImFublwiLFwiYW5vXCIsXCJhbnBcIixcImFucVwiLFwiYW5yXCIsXCJhbnNcIixcImFudFwiLFwiYW51XCIsXCJhbnZcIixcImFud1wiLFwiYW54XCIsXCJhbnlcIixcImFuelwiLFwiYW9hXCIsXCJhb2JcIixcImFvY1wiLFwiYW9kXCIsXCJhb2VcIixcImFvZlwiLFwiYW9nXCIsXCJhb2hcIixcImFvaVwiLFwiYW9qXCIsXCJhb2tcIixcImFvbFwiLFwiYW9tXCIsXCJhb25cIixcImFvclwiLFwiYW9zXCIsXCJhb3RcIixcImFvdVwiLFwiYW94XCIsXCJhb3pcIixcImFwYVwiLFwiYXBiXCIsXCJhcGNcIixcImFwZFwiLFwiYXBlXCIsXCJhcGZcIixcImFwZ1wiLFwiYXBoXCIsXCJhcGlcIixcImFwalwiLFwiYXBrXCIsXCJhcGxcIixcImFwbVwiLFwiYXBuXCIsXCJhcG9cIixcImFwcFwiLFwiYXBxXCIsXCJhcHJcIixcImFwc1wiLFwiYXB0XCIsXCJhcHVcIixcImFwdlwiLFwiYXB3XCIsXCJhcHhcIixcImFweVwiLFwiYXB6XCIsXCJhcWFcIixcImFxY1wiLFwiYXFkXCIsXCJhcWdcIixcImFxbFwiLFwiYXFtXCIsXCJhcW5cIixcImFxcFwiLFwiYXFyXCIsXCJhcXRcIixcImFxelwiLFwiYXJiXCIsXCJhcmNcIixcImFyZFwiLFwiYXJlXCIsXCJhcmhcIixcImFyaVwiLFwiYXJqXCIsXCJhcmtcIixcImFybFwiLFwiYXJuXCIsXCJhcm9cIixcImFycFwiLFwiYXJxXCIsXCJhcnJcIixcImFyc1wiLFwiYXJ0XCIsXCJhcnVcIixcImFydlwiLFwiYXJ3XCIsXCJhcnhcIixcImFyeVwiLFwiYXJ6XCIsXCJhc2FcIixcImFzYlwiLFwiYXNjXCIsXCJhc2RcIixcImFzZVwiLFwiYXNmXCIsXCJhc2dcIixcImFzaFwiLFwiYXNpXCIsXCJhc2pcIixcImFza1wiLFwiYXNsXCIsXCJhc25cIixcImFzb1wiLFwiYXNwXCIsXCJhc3FcIixcImFzclwiLFwiYXNzXCIsXCJhc3RcIixcImFzdVwiLFwiYXN2XCIsXCJhc3dcIixcImFzeFwiLFwiYXN5XCIsXCJhc3pcIixcImF0YVwiLFwiYXRiXCIsXCJhdGNcIixcImF0ZFwiLFwiYXRlXCIsXCJhdGdcIixcImF0aFwiLFwiYXRpXCIsXCJhdGpcIixcImF0a1wiLFwiYXRsXCIsXCJhdG1cIixcImF0blwiLFwiYXRvXCIsXCJhdHBcIixcImF0cVwiLFwiYXRyXCIsXCJhdHNcIixcImF0dFwiLFwiYXR1XCIsXCJhdHZcIixcImF0d1wiLFwiYXR4XCIsXCJhdHlcIixcImF0elwiLFwiYXVhXCIsXCJhdWJcIixcImF1Y1wiLFwiYXVkXCIsXCJhdWVcIixcImF1ZlwiLFwiYXVnXCIsXCJhdWhcIixcImF1aVwiLFwiYXVqXCIsXCJhdWtcIixcImF1bFwiLFwiYXVtXCIsXCJhdW5cIixcImF1b1wiLFwiYXVwXCIsXCJhdXFcIixcImF1clwiLFwiYXVzXCIsXCJhdXRcIixcImF1dVwiLFwiYXV3XCIsXCJhdXhcIixcImF1eVwiLFwiYXV6XCIsXCJhdmJcIixcImF2ZFwiLFwiYXZpXCIsXCJhdmtcIixcImF2bFwiLFwiYXZtXCIsXCJhdm5cIixcImF2b1wiLFwiYXZzXCIsXCJhdnRcIixcImF2dVwiLFwiYXZ2XCIsXCJhd2FcIixcImF3YlwiLFwiYXdjXCIsXCJhd2RcIixcImF3ZVwiLFwiYXdnXCIsXCJhd2hcIixcImF3aVwiLFwiYXdrXCIsXCJhd21cIixcImF3blwiLFwiYXdvXCIsXCJhd3JcIixcImF3c1wiLFwiYXd0XCIsXCJhd3VcIixcImF3dlwiLFwiYXd3XCIsXCJhd3hcIixcImF3eVwiLFwiYXhiXCIsXCJheGVcIixcImF4Z1wiLFwiYXhrXCIsXCJheGxcIixcImF4bVwiLFwiYXh4XCIsXCJheWFcIixcImF5YlwiLFwiYXljXCIsXCJheWRcIixcImF5ZVwiLFwiYXlnXCIsXCJheWhcIixcImF5aVwiLFwiYXlrXCIsXCJheWxcIixcImF5blwiLFwiYXlvXCIsXCJheXBcIixcImF5cVwiLFwiYXlyXCIsXCJheXNcIixcImF5dFwiLFwiYXl1XCIsXCJheXhcIixcImF5eVwiLFwiYXl6XCIsXCJhemFcIixcImF6YlwiLFwiYXpjXCIsXCJhemRcIixcImF6Z1wiLFwiYXpqXCIsXCJhem1cIixcImF6blwiLFwiYXpvXCIsXCJhenRcIixcImF6elwiLFwiYmFhXCIsXCJiYWJcIixcImJhY1wiLFwiYmFkXCIsXCJiYWVcIixcImJhZlwiLFwiYmFnXCIsXCJiYWhcIixcImJhaVwiLFwiYmFqXCIsXCJiYWxcIixcImJhblwiLFwiYmFvXCIsXCJiYXBcIixcImJhclwiLFwiYmFzXCIsXCJiYXRcIixcImJhdVwiLFwiYmF2XCIsXCJiYXdcIixcImJheFwiLFwiYmF5XCIsXCJiYXpcIixcImJiYVwiLFwiYmJiXCIsXCJiYmNcIixcImJiZFwiLFwiYmJlXCIsXCJiYmZcIixcImJiZ1wiLFwiYmJoXCIsXCJiYmlcIixcImJialwiLFwiYmJrXCIsXCJiYmxcIixcImJibVwiLFwiYmJuXCIsXCJiYm9cIixcImJicFwiLFwiYmJxXCIsXCJiYnJcIixcImJic1wiLFwiYmJ0XCIsXCJiYnVcIixcImJidlwiLFwiYmJ3XCIsXCJiYnhcIixcImJieVwiLFwiYmJ6XCIsXCJiY2FcIixcImJjYlwiLFwiYmNjXCIsXCJiY2RcIixcImJjZVwiLFwiYmNmXCIsXCJiY2dcIixcImJjaFwiLFwiYmNpXCIsXCJiY2pcIixcImJja1wiLFwiYmNsXCIsXCJiY21cIixcImJjblwiLFwiYmNvXCIsXCJiY3BcIixcImJjcVwiLFwiYmNyXCIsXCJiY3NcIixcImJjdFwiLFwiYmN1XCIsXCJiY3ZcIixcImJjd1wiLFwiYmN5XCIsXCJiY3pcIixcImJkYVwiLFwiYmRiXCIsXCJiZGNcIixcImJkZFwiLFwiYmRlXCIsXCJiZGZcIixcImJkZ1wiLFwiYmRoXCIsXCJiZGlcIixcImJkalwiLFwiYmRrXCIsXCJiZGxcIixcImJkbVwiLFwiYmRuXCIsXCJiZG9cIixcImJkcFwiLFwiYmRxXCIsXCJiZHJcIixcImJkc1wiLFwiYmR0XCIsXCJiZHVcIixcImJkdlwiLFwiYmR3XCIsXCJiZHhcIixcImJkeVwiLFwiYmR6XCIsXCJiZWFcIixcImJlYlwiLFwiYmVjXCIsXCJiZWRcIixcImJlZVwiLFwiYmVmXCIsXCJiZWdcIixcImJlaFwiLFwiYmVpXCIsXCJiZWpcIixcImJla1wiLFwiYmVtXCIsXCJiZW9cIixcImJlcFwiLFwiYmVxXCIsXCJiZXJcIixcImJlc1wiLFwiYmV0XCIsXCJiZXVcIixcImJldlwiLFwiYmV3XCIsXCJiZXhcIixcImJleVwiLFwiYmV6XCIsXCJiZmFcIixcImJmYlwiLFwiYmZjXCIsXCJiZmRcIixcImJmZVwiLFwiYmZmXCIsXCJiZmdcIixcImJmaFwiLFwiYmZpXCIsXCJiZmpcIixcImJma1wiLFwiYmZsXCIsXCJiZm1cIixcImJmblwiLFwiYmZvXCIsXCJiZnBcIixcImJmcVwiLFwiYmZyXCIsXCJiZnNcIixcImJmdFwiLFwiYmZ1XCIsXCJiZndcIixcImJmeFwiLFwiYmZ5XCIsXCJiZnpcIixcImJnYVwiLFwiYmdiXCIsXCJiZ2NcIixcImJnZFwiLFwiYmdlXCIsXCJiZ2ZcIixcImJnZ1wiLFwiYmdpXCIsXCJiZ2pcIixcImJna1wiLFwiYmdsXCIsXCJiZ21cIixcImJnblwiLFwiYmdvXCIsXCJiZ3BcIixcImJncVwiLFwiYmdyXCIsXCJiZ3NcIixcImJndFwiLFwiYmd1XCIsXCJiZ3ZcIixcImJnd1wiLFwiYmd4XCIsXCJiZ3lcIixcImJnelwiLFwiYmhhXCIsXCJiaGJcIixcImJoY1wiLFwiYmhkXCIsXCJiaGVcIixcImJoZlwiLFwiYmhnXCIsXCJiaGhcIixcImJoaVwiLFwiYmhqXCIsXCJiaGtcIixcImJobFwiLFwiYmhtXCIsXCJiaG5cIixcImJob1wiLFwiYmhwXCIsXCJiaHFcIixcImJoclwiLFwiYmhzXCIsXCJiaHRcIixcImJodVwiLFwiYmh2XCIsXCJiaHdcIixcImJoeFwiLFwiYmh5XCIsXCJiaHpcIixcImJpYVwiLFwiYmliXCIsXCJiaWNcIixcImJpZFwiLFwiYmllXCIsXCJiaWZcIixcImJpZ1wiLFwiYmlqXCIsXCJiaWtcIixcImJpbFwiLFwiYmltXCIsXCJiaW5cIixcImJpb1wiLFwiYmlwXCIsXCJiaXFcIixcImJpclwiLFwiYml0XCIsXCJiaXVcIixcImJpdlwiLFwiYml3XCIsXCJiaXhcIixcImJpeVwiLFwiYml6XCIsXCJiamFcIixcImJqYlwiLFwiYmpjXCIsXCJiamRcIixcImJqZVwiLFwiYmpmXCIsXCJiamdcIixcImJqaFwiLFwiYmppXCIsXCJiampcIixcImJqa1wiLFwiYmpsXCIsXCJiam1cIixcImJqblwiLFwiYmpvXCIsXCJianBcIixcImJqcVwiLFwiYmpyXCIsXCJianNcIixcImJqdFwiLFwiYmp1XCIsXCJianZcIixcImJqd1wiLFwiYmp4XCIsXCJianlcIixcImJqelwiLFwiYmthXCIsXCJia2JcIixcImJrY1wiLFwiYmtkXCIsXCJia2ZcIixcImJrZ1wiLFwiYmtoXCIsXCJia2lcIixcImJralwiLFwiYmtrXCIsXCJia2xcIixcImJrbVwiLFwiYmtuXCIsXCJia29cIixcImJrcFwiLFwiYmtxXCIsXCJia3JcIixcImJrc1wiLFwiYmt0XCIsXCJia3VcIixcImJrdlwiLFwiYmt3XCIsXCJia3hcIixcImJreVwiLFwiYmt6XCIsXCJibGFcIixcImJsYlwiLFwiYmxjXCIsXCJibGRcIixcImJsZVwiLFwiYmxmXCIsXCJibGdcIixcImJsaFwiLFwiYmxpXCIsXCJibGpcIixcImJsa1wiLFwiYmxsXCIsXCJibG1cIixcImJsblwiLFwiYmxvXCIsXCJibHBcIixcImJscVwiLFwiYmxyXCIsXCJibHNcIixcImJsdFwiLFwiYmx2XCIsXCJibHdcIixcImJseFwiLFwiYmx5XCIsXCJibHpcIixcImJtYVwiLFwiYm1iXCIsXCJibWNcIixcImJtZFwiLFwiYm1lXCIsXCJibWZcIixcImJtZ1wiLFwiYm1oXCIsXCJibWlcIixcImJtalwiLFwiYm1rXCIsXCJibWxcIixcImJtbVwiLFwiYm1uXCIsXCJibW9cIixcImJtcFwiLFwiYm1xXCIsXCJibXJcIixcImJtc1wiLFwiYm10XCIsXCJibXVcIixcImJtdlwiLFwiYm13XCIsXCJibXhcIixcImJteVwiLFwiYm16XCIsXCJibmFcIixcImJuYlwiLFwiYm5jXCIsXCJibmRcIixcImJuZVwiLFwiYm5mXCIsXCJibmdcIixcImJuaVwiLFwiYm5qXCIsXCJibmtcIixcImJubFwiLFwiYm5tXCIsXCJibm5cIixcImJub1wiLFwiYm5wXCIsXCJibnFcIixcImJuclwiLFwiYm5zXCIsXCJibnRcIixcImJudVwiLFwiYm52XCIsXCJibndcIixcImJueFwiLFwiYm55XCIsXCJibnpcIixcImJvYVwiLFwiYm9iXCIsXCJib2VcIixcImJvZlwiLFwiYm9nXCIsXCJib2hcIixcImJvaVwiLFwiYm9qXCIsXCJib2tcIixcImJvbFwiLFwiYm9tXCIsXCJib25cIixcImJvb1wiLFwiYm9wXCIsXCJib3FcIixcImJvclwiLFwiYm90XCIsXCJib3VcIixcImJvdlwiLFwiYm93XCIsXCJib3hcIixcImJveVwiLFwiYm96XCIsXCJicGFcIixcImJwYlwiLFwiYnBkXCIsXCJicGdcIixcImJwaFwiLFwiYnBpXCIsXCJicGpcIixcImJwa1wiLFwiYnBsXCIsXCJicG1cIixcImJwblwiLFwiYnBvXCIsXCJicHBcIixcImJwcVwiLFwiYnByXCIsXCJicHNcIixcImJwdFwiLFwiYnB1XCIsXCJicHZcIixcImJwd1wiLFwiYnB4XCIsXCJicHlcIixcImJwelwiLFwiYnFhXCIsXCJicWJcIixcImJxY1wiLFwiYnFkXCIsXCJicWZcIixcImJxZ1wiLFwiYnFoXCIsXCJicWlcIixcImJxalwiLFwiYnFrXCIsXCJicWxcIixcImJxbVwiLFwiYnFuXCIsXCJicW9cIixcImJxcFwiLFwiYnFxXCIsXCJicXJcIixcImJxc1wiLFwiYnF0XCIsXCJicXVcIixcImJxdlwiLFwiYnF3XCIsXCJicXhcIixcImJxeVwiLFwiYnF6XCIsXCJicmFcIixcImJyYlwiLFwiYnJjXCIsXCJicmRcIixcImJyZlwiLFwiYnJnXCIsXCJicmhcIixcImJyaVwiLFwiYnJqXCIsXCJicmtcIixcImJybFwiLFwiYnJtXCIsXCJicm5cIixcImJyb1wiLFwiYnJwXCIsXCJicnFcIixcImJyclwiLFwiYnJzXCIsXCJicnRcIixcImJydVwiLFwiYnJ2XCIsXCJicndcIixcImJyeFwiLFwiYnJ5XCIsXCJicnpcIixcImJzYVwiLFwiYnNiXCIsXCJic2NcIixcImJzZVwiLFwiYnNmXCIsXCJic2dcIixcImJzaFwiLFwiYnNpXCIsXCJic2pcIixcImJza1wiLFwiYnNsXCIsXCJic21cIixcImJzblwiLFwiYnNvXCIsXCJic3BcIixcImJzcVwiLFwiYnNyXCIsXCJic3NcIixcImJzdFwiLFwiYnN1XCIsXCJic3ZcIixcImJzd1wiLFwiYnN4XCIsXCJic3lcIixcImJ0YVwiLFwiYnRiXCIsXCJidGNcIixcImJ0ZFwiLFwiYnRlXCIsXCJidGZcIixcImJ0Z1wiLFwiYnRoXCIsXCJidGlcIixcImJ0alwiLFwiYnRrXCIsXCJidGxcIixcImJ0bVwiLFwiYnRuXCIsXCJidG9cIixcImJ0cFwiLFwiYnRxXCIsXCJidHJcIixcImJ0c1wiLFwiYnR0XCIsXCJidHVcIixcImJ0dlwiLFwiYnR3XCIsXCJidHhcIixcImJ0eVwiLFwiYnR6XCIsXCJidWFcIixcImJ1YlwiLFwiYnVjXCIsXCJidWRcIixcImJ1ZVwiLFwiYnVmXCIsXCJidWdcIixcImJ1aFwiLFwiYnVpXCIsXCJidWpcIixcImJ1a1wiLFwiYnVtXCIsXCJidW5cIixcImJ1b1wiLFwiYnVwXCIsXCJidXFcIixcImJ1c1wiLFwiYnV0XCIsXCJidXVcIixcImJ1dlwiLFwiYnV3XCIsXCJidXhcIixcImJ1eVwiLFwiYnV6XCIsXCJidmFcIixcImJ2YlwiLFwiYnZjXCIsXCJidmRcIixcImJ2ZVwiLFwiYnZmXCIsXCJidmdcIixcImJ2aFwiLFwiYnZpXCIsXCJidmpcIixcImJ2a1wiLFwiYnZsXCIsXCJidm1cIixcImJ2blwiLFwiYnZvXCIsXCJidnBcIixcImJ2cVwiLFwiYnZyXCIsXCJidnRcIixcImJ2dVwiLFwiYnZ2XCIsXCJidndcIixcImJ2eFwiLFwiYnZ5XCIsXCJidnpcIixcImJ3YVwiLFwiYndiXCIsXCJid2NcIixcImJ3ZFwiLFwiYndlXCIsXCJid2ZcIixcImJ3Z1wiLFwiYndoXCIsXCJid2lcIixcImJ3alwiLFwiYndrXCIsXCJid2xcIixcImJ3bVwiLFwiYnduXCIsXCJid29cIixcImJ3cFwiLFwiYndxXCIsXCJid3JcIixcImJ3c1wiLFwiYnd0XCIsXCJid3VcIixcImJ3d1wiLFwiYnd4XCIsXCJid3lcIixcImJ3elwiLFwiYnhhXCIsXCJieGJcIixcImJ4Y1wiLFwiYnhkXCIsXCJieGVcIixcImJ4ZlwiLFwiYnhnXCIsXCJieGhcIixcImJ4aVwiLFwiYnhqXCIsXCJieGtcIixcImJ4bFwiLFwiYnhtXCIsXCJieG5cIixcImJ4b1wiLFwiYnhwXCIsXCJieHFcIixcImJ4clwiLFwiYnhzXCIsXCJieHVcIixcImJ4dlwiLFwiYnh3XCIsXCJieHhcIixcImJ4elwiLFwiYnlhXCIsXCJieWJcIixcImJ5Y1wiLFwiYnlkXCIsXCJieWVcIixcImJ5ZlwiLFwiYnlnXCIsXCJieWhcIixcImJ5aVwiLFwiYnlqXCIsXCJieWtcIixcImJ5bFwiLFwiYnltXCIsXCJieW5cIixcImJ5b1wiLFwiYnlwXCIsXCJieXFcIixcImJ5clwiLFwiYnlzXCIsXCJieXRcIixcImJ5dlwiLFwiYnl3XCIsXCJieXhcIixcImJ5eVwiLFwiYnl6XCIsXCJiemFcIixcImJ6YlwiLFwiYnpjXCIsXCJiemRcIixcImJ6ZVwiLFwiYnpmXCIsXCJiemdcIixcImJ6aFwiLFwiYnppXCIsXCJiempcIixcImJ6a1wiLFwiYnpsXCIsXCJiem1cIixcImJ6blwiLFwiYnpvXCIsXCJienBcIixcImJ6cVwiLFwiYnpyXCIsXCJienNcIixcImJ6dFwiLFwiYnp1XCIsXCJienZcIixcImJ6d1wiLFwiYnp4XCIsXCJienlcIixcImJ6elwiLFwiY2FhXCIsXCJjYWJcIixcImNhY1wiLFwiY2FkXCIsXCJjYWVcIixcImNhZlwiLFwiY2FnXCIsXCJjYWhcIixcImNhaVwiLFwiY2FqXCIsXCJjYWtcIixcImNhbFwiLFwiY2FtXCIsXCJjYW5cIixcImNhb1wiLFwiY2FwXCIsXCJjYXFcIixcImNhclwiLFwiY2FzXCIsXCJjYXVcIixcImNhdlwiLFwiY2F3XCIsXCJjYXhcIixcImNheVwiLFwiY2F6XCIsXCJjYmFcIixcImNiYlwiLFwiY2JjXCIsXCJjYmRcIixcImNiZVwiLFwiY2JnXCIsXCJjYmhcIixcImNiaVwiLFwiY2JqXCIsXCJjYmtcIixcImNibFwiLFwiY2JuXCIsXCJjYm9cIixcImNicVwiLFwiY2JyXCIsXCJjYnNcIixcImNidFwiLFwiY2J1XCIsXCJjYnZcIixcImNid1wiLFwiY2J5XCIsXCJjY2FcIixcImNjY1wiLFwiY2NkXCIsXCJjY2VcIixcImNjZ1wiLFwiY2NoXCIsXCJjY2pcIixcImNjbFwiLFwiY2NtXCIsXCJjY25cIixcImNjb1wiLFwiY2NwXCIsXCJjY3FcIixcImNjclwiLFwiY2NzXCIsXCJjZGFcIixcImNkY1wiLFwiY2RkXCIsXCJjZGVcIixcImNkZlwiLFwiY2RnXCIsXCJjZGhcIixcImNkaVwiLFwiY2RqXCIsXCJjZG1cIixcImNkblwiLFwiY2RvXCIsXCJjZHJcIixcImNkc1wiLFwiY2R5XCIsXCJjZHpcIixcImNlYVwiLFwiY2ViXCIsXCJjZWdcIixcImNla1wiLFwiY2VsXCIsXCJjZW5cIixcImNldFwiLFwiY2ZhXCIsXCJjZmRcIixcImNmZ1wiLFwiY2ZtXCIsXCJjZ2FcIixcImNnY1wiLFwiY2dnXCIsXCJjZ2tcIixcImNoYlwiLFwiY2hjXCIsXCJjaGRcIixcImNoZlwiLFwiY2hnXCIsXCJjaGhcIixcImNoalwiLFwiY2hrXCIsXCJjaGxcIixcImNobVwiLFwiY2huXCIsXCJjaG9cIixcImNocFwiLFwiY2hxXCIsXCJjaHJcIixcImNodFwiLFwiY2h3XCIsXCJjaHhcIixcImNoeVwiLFwiY2h6XCIsXCJjaWFcIixcImNpYlwiLFwiY2ljXCIsXCJjaWRcIixcImNpZVwiLFwiY2loXCIsXCJjaWtcIixcImNpbVwiLFwiY2luXCIsXCJjaXBcIixcImNpclwiLFwiY2l3XCIsXCJjaXlcIixcImNqYVwiLFwiY2plXCIsXCJjamhcIixcImNqaVwiLFwiY2prXCIsXCJjam1cIixcImNqblwiLFwiY2pvXCIsXCJjanBcIixcImNqclwiLFwiY2pzXCIsXCJjanZcIixcImNqeVwiLFwiY2thXCIsXCJja2JcIixcImNraFwiLFwiY2tsXCIsXCJja25cIixcImNrb1wiLFwiY2txXCIsXCJja3JcIixcImNrc1wiLFwiY2t0XCIsXCJja3VcIixcImNrdlwiLFwiY2t4XCIsXCJja3lcIixcImNrelwiLFwiY2xhXCIsXCJjbGNcIixcImNsZFwiLFwiY2xlXCIsXCJjbGhcIixcImNsaVwiLFwiY2xqXCIsXCJjbGtcIixcImNsbFwiLFwiY2xtXCIsXCJjbG9cIixcImNsdFwiLFwiY2x1XCIsXCJjbHdcIixcImNseVwiLFwiY21hXCIsXCJjbWNcIixcImNtZVwiLFwiY21nXCIsXCJjbWlcIixcImNta1wiLFwiY21sXCIsXCJjbW1cIixcImNtblwiLFwiY21vXCIsXCJjbXJcIixcImNtc1wiLFwiY210XCIsXCJjbmFcIixcImNuYlwiLFwiY25jXCIsXCJjbmdcIixcImNuaFwiLFwiY25pXCIsXCJjbmtcIixcImNubFwiLFwiY25vXCIsXCJjbnNcIixcImNudFwiLFwiY251XCIsXCJjbndcIixcImNueFwiLFwiY29hXCIsXCJjb2JcIixcImNvY1wiLFwiY29kXCIsXCJjb2VcIixcImNvZlwiLFwiY29nXCIsXCJjb2hcIixcImNvalwiLFwiY29rXCIsXCJjb2xcIixcImNvbVwiLFwiY29uXCIsXCJjb29cIixcImNvcFwiLFwiY29xXCIsXCJjb3RcIixcImNvdVwiLFwiY292XCIsXCJjb3dcIixcImNveFwiLFwiY295XCIsXCJjb3pcIixcImNwYVwiLFwiY3BiXCIsXCJjcGNcIixcImNwZVwiLFwiY3BmXCIsXCJjcGdcIixcImNwaVwiLFwiY3BuXCIsXCJjcG9cIixcImNwcFwiLFwiY3BzXCIsXCJjcHVcIixcImNweFwiLFwiY3B5XCIsXCJjcWRcIixcImNxdVwiLFwiY3JhXCIsXCJjcmJcIixcImNyY1wiLFwiY3JkXCIsXCJjcmZcIixcImNyZ1wiLFwiY3JoXCIsXCJjcmlcIixcImNyalwiLFwiY3JrXCIsXCJjcmxcIixcImNybVwiLFwiY3JuXCIsXCJjcm9cIixcImNycFwiLFwiY3JxXCIsXCJjcnJcIixcImNyc1wiLFwiY3J0XCIsXCJjcnZcIixcImNyd1wiLFwiY3J4XCIsXCJjcnlcIixcImNyelwiLFwiY3NhXCIsXCJjc2JcIixcImNzY1wiLFwiY3NkXCIsXCJjc2VcIixcImNzZlwiLFwiY3NnXCIsXCJjc2hcIixcImNzaVwiLFwiY3NqXCIsXCJjc2tcIixcImNzbFwiLFwiY3NtXCIsXCJjc25cIixcImNzb1wiLFwiY3NxXCIsXCJjc3JcIixcImNzc1wiLFwiY3N0XCIsXCJjc3VcIixcImNzdlwiLFwiY3N3XCIsXCJjc3lcIixcImNzelwiLFwiY3RhXCIsXCJjdGNcIixcImN0ZFwiLFwiY3RlXCIsXCJjdGdcIixcImN0aFwiLFwiY3RsXCIsXCJjdG1cIixcImN0blwiLFwiY3RvXCIsXCJjdHBcIixcImN0c1wiLFwiY3R0XCIsXCJjdHVcIixcImN0elwiLFwiY3VhXCIsXCJjdWJcIixcImN1Y1wiLFwiY3VnXCIsXCJjdWhcIixcImN1aVwiLFwiY3VqXCIsXCJjdWtcIixcImN1bFwiLFwiY3VtXCIsXCJjdW9cIixcImN1cFwiLFwiY3VxXCIsXCJjdXJcIixcImN1c1wiLFwiY3V0XCIsXCJjdXVcIixcImN1dlwiLFwiY3V3XCIsXCJjdXhcIixcImN2Z1wiLFwiY3ZuXCIsXCJjd2FcIixcImN3YlwiLFwiY3dkXCIsXCJjd2VcIixcImN3Z1wiLFwiY3d0XCIsXCJjeWFcIixcImN5YlwiLFwiY3lvXCIsXCJjemhcIixcImN6a1wiLFwiY3puXCIsXCJjem9cIixcImN6dFwiLFwiZGFhXCIsXCJkYWNcIixcImRhZFwiLFwiZGFlXCIsXCJkYWZcIixcImRhZ1wiLFwiZGFoXCIsXCJkYWlcIixcImRhalwiLFwiZGFrXCIsXCJkYWxcIixcImRhbVwiLFwiZGFvXCIsXCJkYXBcIixcImRhcVwiLFwiZGFyXCIsXCJkYXNcIixcImRhdVwiLFwiZGF2XCIsXCJkYXdcIixcImRheFwiLFwiZGF5XCIsXCJkYXpcIixcImRiYVwiLFwiZGJiXCIsXCJkYmRcIixcImRiZVwiLFwiZGJmXCIsXCJkYmdcIixcImRiaVwiLFwiZGJqXCIsXCJkYmxcIixcImRibVwiLFwiZGJuXCIsXCJkYm9cIixcImRicFwiLFwiZGJxXCIsXCJkYnJcIixcImRidFwiLFwiZGJ1XCIsXCJkYnZcIixcImRid1wiLFwiZGJ5XCIsXCJkY2NcIixcImRjclwiLFwiZGRhXCIsXCJkZGRcIixcImRkZVwiLFwiZGRnXCIsXCJkZGlcIixcImRkalwiLFwiZGRuXCIsXCJkZG9cIixcImRkclwiLFwiZGRzXCIsXCJkZHdcIixcImRlY1wiLFwiZGVkXCIsXCJkZWVcIixcImRlZlwiLFwiZGVnXCIsXCJkZWhcIixcImRlaVwiLFwiZGVrXCIsXCJkZWxcIixcImRlbVwiLFwiZGVuXCIsXCJkZXBcIixcImRlcVwiLFwiZGVyXCIsXCJkZXNcIixcImRldlwiLFwiZGV6XCIsXCJkZ2FcIixcImRnYlwiLFwiZGdjXCIsXCJkZ2RcIixcImRnZVwiLFwiZGdnXCIsXCJkZ2hcIixcImRnaVwiLFwiZGdrXCIsXCJkZ2xcIixcImRnblwiLFwiZGdvXCIsXCJkZ3JcIixcImRnc1wiLFwiZGd0XCIsXCJkZ3VcIixcImRnd1wiLFwiZGd4XCIsXCJkZ3pcIixcImRoYVwiLFwiZGhkXCIsXCJkaGdcIixcImRoaVwiLFwiZGhsXCIsXCJkaG1cIixcImRoblwiLFwiZGhvXCIsXCJkaHJcIixcImRoc1wiLFwiZGh1XCIsXCJkaHZcIixcImRod1wiLFwiZGh4XCIsXCJkaWFcIixcImRpYlwiLFwiZGljXCIsXCJkaWRcIixcImRpZlwiLFwiZGlnXCIsXCJkaWhcIixcImRpaVwiLFwiZGlqXCIsXCJkaWtcIixcImRpbFwiLFwiZGltXCIsXCJkaW5cIixcImRpb1wiLFwiZGlwXCIsXCJkaXFcIixcImRpclwiLFwiZGlzXCIsXCJkaXRcIixcImRpdVwiLFwiZGl3XCIsXCJkaXhcIixcImRpeVwiLFwiZGl6XCIsXCJkamFcIixcImRqYlwiLFwiZGpjXCIsXCJkamRcIixcImRqZVwiLFwiZGpmXCIsXCJkamlcIixcImRqalwiLFwiZGprXCIsXCJkamxcIixcImRqbVwiLFwiZGpuXCIsXCJkam9cIixcImRqclwiLFwiZGp1XCIsXCJkandcIixcImRrYVwiLFwiZGtrXCIsXCJka2xcIixcImRrclwiLFwiZGtzXCIsXCJka3hcIixcImRsZ1wiLFwiZGxrXCIsXCJkbG1cIixcImRsblwiLFwiZG1hXCIsXCJkbWJcIixcImRtY1wiLFwiZG1kXCIsXCJkbWVcIixcImRtZ1wiLFwiZG1rXCIsXCJkbWxcIixcImRtbVwiLFwiZG1uXCIsXCJkbW9cIixcImRtclwiLFwiZG1zXCIsXCJkbXVcIixcImRtdlwiLFwiZG13XCIsXCJkbXhcIixcImRteVwiLFwiZG5hXCIsXCJkbmRcIixcImRuZVwiLFwiZG5nXCIsXCJkbmlcIixcImRualwiLFwiZG5rXCIsXCJkbm5cIixcImRuclwiLFwiZG50XCIsXCJkbnVcIixcImRudlwiLFwiZG53XCIsXCJkbnlcIixcImRvYVwiLFwiZG9iXCIsXCJkb2NcIixcImRvZVwiLFwiZG9mXCIsXCJkb2hcIixcImRvaVwiLFwiZG9rXCIsXCJkb2xcIixcImRvblwiLFwiZG9vXCIsXCJkb3BcIixcImRvcVwiLFwiZG9yXCIsXCJkb3NcIixcImRvdFwiLFwiZG92XCIsXCJkb3dcIixcImRveFwiLFwiZG95XCIsXCJkb3pcIixcImRwcFwiLFwiZHJhXCIsXCJkcmJcIixcImRyY1wiLFwiZHJkXCIsXCJkcmVcIixcImRyZ1wiLFwiZHJoXCIsXCJkcmlcIixcImRybFwiLFwiZHJuXCIsXCJkcm9cIixcImRycVwiLFwiZHJyXCIsXCJkcnNcIixcImRydFwiLFwiZHJ1XCIsXCJkcndcIixcImRyeVwiLFwiZHNiXCIsXCJkc2VcIixcImRzaFwiLFwiZHNpXCIsXCJkc2xcIixcImRzblwiLFwiZHNvXCIsXCJkc3FcIixcImR0YVwiLFwiZHRiXCIsXCJkdGRcIixcImR0aFwiLFwiZHRpXCIsXCJkdGtcIixcImR0bVwiLFwiZHRuXCIsXCJkdG9cIixcImR0cFwiLFwiZHRyXCIsXCJkdHNcIixcImR0dFwiLFwiZHR1XCIsXCJkdHlcIixcImR1YVwiLFwiZHViXCIsXCJkdWNcIixcImR1ZFwiLFwiZHVlXCIsXCJkdWZcIixcImR1Z1wiLFwiZHVoXCIsXCJkdWlcIixcImR1alwiLFwiZHVrXCIsXCJkdWxcIixcImR1bVwiLFwiZHVuXCIsXCJkdW9cIixcImR1cFwiLFwiZHVxXCIsXCJkdXJcIixcImR1c1wiLFwiZHV1XCIsXCJkdXZcIixcImR1d1wiLFwiZHV4XCIsXCJkdXlcIixcImR1elwiLFwiZHZhXCIsXCJkd2FcIixcImR3bFwiLFwiZHdyXCIsXCJkd3NcIixcImR3dVwiLFwiZHd3XCIsXCJkd3lcIixcImR5YVwiLFwiZHliXCIsXCJkeWRcIixcImR5Z1wiLFwiZHlpXCIsXCJkeW1cIixcImR5blwiLFwiZHlvXCIsXCJkeXVcIixcImR5eVwiLFwiZHphXCIsXCJkemRcIixcImR6ZVwiLFwiZHpnXCIsXCJkemxcIixcImR6blwiLFwiZWFhXCIsXCJlYmdcIixcImVia1wiLFwiZWJvXCIsXCJlYnJcIixcImVidVwiLFwiZWNyXCIsXCJlY3NcIixcImVjeVwiLFwiZWVlXCIsXCJlZmFcIixcImVmZVwiLFwiZWZpXCIsXCJlZ2FcIixcImVnbFwiLFwiZWdvXCIsXCJlZ3hcIixcImVneVwiLFwiZWh1XCIsXCJlaXBcIixcImVpdFwiLFwiZWl2XCIsXCJlamFcIixcImVrYVwiLFwiZWtjXCIsXCJla2VcIixcImVrZ1wiLFwiZWtpXCIsXCJla2tcIixcImVrbFwiLFwiZWttXCIsXCJla29cIixcImVrcFwiLFwiZWtyXCIsXCJla3lcIixcImVsZVwiLFwiZWxoXCIsXCJlbGlcIixcImVsa1wiLFwiZWxtXCIsXCJlbG9cIixcImVscFwiLFwiZWx1XCIsXCJlbHhcIixcImVtYVwiLFwiZW1iXCIsXCJlbWVcIixcImVtZ1wiLFwiZW1pXCIsXCJlbWtcIixcImVtbVwiLFwiZW1uXCIsXCJlbW9cIixcImVtcFwiLFwiZW1zXCIsXCJlbXVcIixcImVtd1wiLFwiZW14XCIsXCJlbXlcIixcImVuYVwiLFwiZW5iXCIsXCJlbmNcIixcImVuZFwiLFwiZW5mXCIsXCJlbmhcIixcImVubFwiLFwiZW5tXCIsXCJlbm5cIixcImVub1wiLFwiZW5xXCIsXCJlbnJcIixcImVudVwiLFwiZW52XCIsXCJlbndcIixcImVueFwiLFwiZW90XCIsXCJlcGlcIixcImVyYVwiLFwiZXJnXCIsXCJlcmhcIixcImVyaVwiLFwiZXJrXCIsXCJlcm9cIixcImVyclwiLFwiZXJzXCIsXCJlcnRcIixcImVyd1wiLFwiZXNlXCIsXCJlc2dcIixcImVzaFwiLFwiZXNpXCIsXCJlc2tcIixcImVzbFwiLFwiZXNtXCIsXCJlc25cIixcImVzb1wiLFwiZXNxXCIsXCJlc3NcIixcImVzdVwiLFwiZXN4XCIsXCJlc3lcIixcImV0YlwiLFwiZXRjXCIsXCJldGhcIixcImV0blwiLFwiZXRvXCIsXCJldHJcIixcImV0c1wiLFwiZXR0XCIsXCJldHVcIixcImV0eFwiLFwiZXR6XCIsXCJldXFcIixcImV2ZVwiLFwiZXZoXCIsXCJldm5cIixcImV3b1wiLFwiZXh0XCIsXCJleWFcIixcImV5b1wiLFwiZXphXCIsXCJlemVcIixcImZhYVwiLFwiZmFiXCIsXCJmYWRcIixcImZhZlwiLFwiZmFnXCIsXCJmYWhcIixcImZhaVwiLFwiZmFqXCIsXCJmYWtcIixcImZhbFwiLFwiZmFtXCIsXCJmYW5cIixcImZhcFwiLFwiZmFyXCIsXCJmYXRcIixcImZhdVwiLFwiZmF4XCIsXCJmYXlcIixcImZhelwiLFwiZmJsXCIsXCJmY3NcIixcImZlclwiLFwiZmZpXCIsXCJmZm1cIixcImZnclwiLFwiZmlhXCIsXCJmaWVcIixcImZpbFwiLFwiZmlwXCIsXCJmaXJcIixcImZpdFwiLFwiZml1XCIsXCJmaXdcIixcImZra1wiLFwiZmt2XCIsXCJmbGFcIixcImZsaFwiLFwiZmxpXCIsXCJmbGxcIixcImZsblwiLFwiZmxyXCIsXCJmbHlcIixcImZtcFwiLFwiZm11XCIsXCJmbmJcIixcImZuZ1wiLFwiZm5pXCIsXCJmb2RcIixcImZvaVwiLFwiZm9tXCIsXCJmb25cIixcImZvclwiLFwiZm9zXCIsXCJmb3hcIixcImZwZVwiLFwiZnFzXCIsXCJmcmNcIixcImZyZFwiLFwiZnJrXCIsXCJmcm1cIixcImZyb1wiLFwiZnJwXCIsXCJmcnFcIixcImZyclwiLFwiZnJzXCIsXCJmcnRcIixcImZzZVwiLFwiZnNsXCIsXCJmc3NcIixcImZ1YlwiLFwiZnVjXCIsXCJmdWRcIixcImZ1ZVwiLFwiZnVmXCIsXCJmdWhcIixcImZ1aVwiLFwiZnVqXCIsXCJmdW1cIixcImZ1blwiLFwiZnVxXCIsXCJmdXJcIixcImZ1dFwiLFwiZnV1XCIsXCJmdXZcIixcImZ1eVwiLFwiZnZyXCIsXCJmd2FcIixcImZ3ZVwiLFwiZ2FhXCIsXCJnYWJcIixcImdhY1wiLFwiZ2FkXCIsXCJnYWVcIixcImdhZlwiLFwiZ2FnXCIsXCJnYWhcIixcImdhaVwiLFwiZ2FqXCIsXCJnYWtcIixcImdhbFwiLFwiZ2FtXCIsXCJnYW5cIixcImdhb1wiLFwiZ2FwXCIsXCJnYXFcIixcImdhclwiLFwiZ2FzXCIsXCJnYXRcIixcImdhdVwiLFwiZ2F2XCIsXCJnYXdcIixcImdheFwiLFwiZ2F5XCIsXCJnYXpcIixcImdiYVwiLFwiZ2JiXCIsXCJnYmNcIixcImdiZFwiLFwiZ2JlXCIsXCJnYmZcIixcImdiZ1wiLFwiZ2JoXCIsXCJnYmlcIixcImdialwiLFwiZ2JrXCIsXCJnYmxcIixcImdibVwiLFwiZ2JuXCIsXCJnYm9cIixcImdicFwiLFwiZ2JxXCIsXCJnYnJcIixcImdic1wiLFwiZ2J1XCIsXCJnYnZcIixcImdid1wiLFwiZ2J4XCIsXCJnYnlcIixcImdielwiLFwiZ2NjXCIsXCJnY2RcIixcImdjZVwiLFwiZ2NmXCIsXCJnY2xcIixcImdjblwiLFwiZ2NyXCIsXCJnY3RcIixcImdkYVwiLFwiZ2RiXCIsXCJnZGNcIixcImdkZFwiLFwiZ2RlXCIsXCJnZGZcIixcImdkZ1wiLFwiZ2RoXCIsXCJnZGlcIixcImdkalwiLFwiZ2RrXCIsXCJnZGxcIixcImdkbVwiLFwiZ2RuXCIsXCJnZG9cIixcImdkcVwiLFwiZ2RyXCIsXCJnZHNcIixcImdkdFwiLFwiZ2R1XCIsXCJnZHhcIixcImdlYVwiLFwiZ2ViXCIsXCJnZWNcIixcImdlZFwiLFwiZ2VnXCIsXCJnZWhcIixcImdlaVwiLFwiZ2VqXCIsXCJnZWtcIixcImdlbFwiLFwiZ2VtXCIsXCJnZXFcIixcImdlc1wiLFwiZ2V2XCIsXCJnZXdcIixcImdleFwiLFwiZ2V5XCIsXCJnZXpcIixcImdma1wiLFwiZ2Z0XCIsXCJnZnhcIixcImdnYVwiLFwiZ2diXCIsXCJnZ2RcIixcImdnZVwiLFwiZ2dnXCIsXCJnZ2tcIixcImdnbFwiLFwiZ2duXCIsXCJnZ29cIixcImdnclwiLFwiZ2d0XCIsXCJnZ3VcIixcImdnd1wiLFwiZ2hhXCIsXCJnaGNcIixcImdoZVwiLFwiZ2hoXCIsXCJnaGtcIixcImdobFwiLFwiZ2huXCIsXCJnaG9cIixcImdoclwiLFwiZ2hzXCIsXCJnaHRcIixcImdpYVwiLFwiZ2liXCIsXCJnaWNcIixcImdpZFwiLFwiZ2llXCIsXCJnaWdcIixcImdpaFwiLFwiZ2lsXCIsXCJnaW1cIixcImdpblwiLFwiZ2lvXCIsXCJnaXBcIixcImdpcVwiLFwiZ2lyXCIsXCJnaXNcIixcImdpdFwiLFwiZ2l1XCIsXCJnaXdcIixcImdpeFwiLFwiZ2l5XCIsXCJnaXpcIixcImdqaVwiLFwiZ2prXCIsXCJnam1cIixcImdqblwiLFwiZ2pyXCIsXCJnanVcIixcImdrYVwiLFwiZ2tlXCIsXCJna25cIixcImdrb1wiLFwiZ2twXCIsXCJna3VcIixcImdsY1wiLFwiZ2xkXCIsXCJnbGhcIixcImdsaVwiLFwiZ2xqXCIsXCJnbGtcIixcImdsbFwiLFwiZ2xvXCIsXCJnbHJcIixcImdsdVwiLFwiZ2x3XCIsXCJnbHlcIixcImdtYVwiLFwiZ21iXCIsXCJnbWRcIixcImdtZVwiLFwiZ21nXCIsXCJnbWhcIixcImdtbFwiLFwiZ21tXCIsXCJnbW5cIixcImdtcVwiLFwiZ211XCIsXCJnbXZcIixcImdtd1wiLFwiZ214XCIsXCJnbXlcIixcImdtelwiLFwiZ25hXCIsXCJnbmJcIixcImduY1wiLFwiZ25kXCIsXCJnbmVcIixcImduZ1wiLFwiZ25oXCIsXCJnbmlcIixcImdua1wiLFwiZ25sXCIsXCJnbm1cIixcImdublwiLFwiZ25vXCIsXCJnbnFcIixcImduclwiLFwiZ250XCIsXCJnbnVcIixcImdud1wiLFwiZ256XCIsXCJnb2FcIixcImdvYlwiLFwiZ29jXCIsXCJnb2RcIixcImdvZVwiLFwiZ29mXCIsXCJnb2dcIixcImdvaFwiLFwiZ29pXCIsXCJnb2pcIixcImdva1wiLFwiZ29sXCIsXCJnb21cIixcImdvblwiLFwiZ29vXCIsXCJnb3BcIixcImdvcVwiLFwiZ29yXCIsXCJnb3NcIixcImdvdFwiLFwiZ291XCIsXCJnb3dcIixcImdveFwiLFwiZ295XCIsXCJnb3pcIixcImdwYVwiLFwiZ3BlXCIsXCJncG5cIixcImdxYVwiLFwiZ3FpXCIsXCJncW5cIixcImdxclwiLFwiZ3F1XCIsXCJncmFcIixcImdyYlwiLFwiZ3JjXCIsXCJncmRcIixcImdyZ1wiLFwiZ3JoXCIsXCJncmlcIixcImdyalwiLFwiZ3JrXCIsXCJncm1cIixcImdyb1wiLFwiZ3JxXCIsXCJncnJcIixcImdyc1wiLFwiZ3J0XCIsXCJncnVcIixcImdydlwiLFwiZ3J3XCIsXCJncnhcIixcImdyeVwiLFwiZ3J6XCIsXCJnc2VcIixcImdzZ1wiLFwiZ3NsXCIsXCJnc21cIixcImdzblwiLFwiZ3NvXCIsXCJnc3BcIixcImdzc1wiLFwiZ3N3XCIsXCJndGFcIixcImd0aVwiLFwiZ3R1XCIsXCJndWFcIixcImd1YlwiLFwiZ3VjXCIsXCJndWRcIixcImd1ZVwiLFwiZ3VmXCIsXCJndWdcIixcImd1aFwiLFwiZ3VpXCIsXCJndWtcIixcImd1bFwiLFwiZ3VtXCIsXCJndW5cIixcImd1b1wiLFwiZ3VwXCIsXCJndXFcIixcImd1clwiLFwiZ3VzXCIsXCJndXRcIixcImd1dVwiLFwiZ3V2XCIsXCJndXdcIixcImd1eFwiLFwiZ3V6XCIsXCJndmFcIixcImd2Y1wiLFwiZ3ZlXCIsXCJndmZcIixcImd2alwiLFwiZ3ZsXCIsXCJndm1cIixcImd2blwiLFwiZ3ZvXCIsXCJndnBcIixcImd2clwiLFwiZ3ZzXCIsXCJndnlcIixcImd3YVwiLFwiZ3diXCIsXCJnd2NcIixcImd3ZFwiLFwiZ3dlXCIsXCJnd2ZcIixcImd3Z1wiLFwiZ3dpXCIsXCJnd2pcIixcImd3bVwiLFwiZ3duXCIsXCJnd3JcIixcImd3dFwiLFwiZ3d1XCIsXCJnd3dcIixcImd3eFwiLFwiZ3h4XCIsXCJneWFcIixcImd5YlwiLFwiZ3lkXCIsXCJneWVcIixcImd5ZlwiLFwiZ3lnXCIsXCJneWlcIixcImd5bFwiLFwiZ3ltXCIsXCJneW5cIixcImd5clwiLFwiZ3l5XCIsXCJnemFcIixcImd6aVwiLFwiZ3puXCIsXCJoYWFcIixcImhhYlwiLFwiaGFjXCIsXCJoYWRcIixcImhhZVwiLFwiaGFmXCIsXCJoYWdcIixcImhhaFwiLFwiaGFpXCIsXCJoYWpcIixcImhha1wiLFwiaGFsXCIsXCJoYW1cIixcImhhblwiLFwiaGFvXCIsXCJoYXBcIixcImhhcVwiLFwiaGFyXCIsXCJoYXNcIixcImhhdlwiLFwiaGF3XCIsXCJoYXhcIixcImhheVwiLFwiaGF6XCIsXCJoYmFcIixcImhiYlwiLFwiaGJuXCIsXCJoYm9cIixcImhidVwiLFwiaGNhXCIsXCJoY2hcIixcImhkblwiLFwiaGRzXCIsXCJoZHlcIixcImhlYVwiLFwiaGVkXCIsXCJoZWdcIixcImhlaFwiLFwiaGVpXCIsXCJoZW1cIixcImhnbVwiLFwiaGd3XCIsXCJoaGlcIixcImhoclwiLFwiaGh5XCIsXCJoaWFcIixcImhpYlwiLFwiaGlkXCIsXCJoaWZcIixcImhpZ1wiLFwiaGloXCIsXCJoaWlcIixcImhpalwiLFwiaGlrXCIsXCJoaWxcIixcImhpbVwiLFwiaGlvXCIsXCJoaXJcIixcImhpdFwiLFwiaGl3XCIsXCJoaXhcIixcImhqaVwiLFwiaGthXCIsXCJoa2VcIixcImhra1wiLFwiaGtzXCIsXCJobGFcIixcImhsYlwiLFwiaGxkXCIsXCJobGVcIixcImhsdFwiLFwiaGx1XCIsXCJobWFcIixcImhtYlwiLFwiaG1jXCIsXCJobWRcIixcImhtZVwiLFwiaG1mXCIsXCJobWdcIixcImhtaFwiLFwiaG1pXCIsXCJobWpcIixcImhta1wiLFwiaG1sXCIsXCJobW1cIixcImhtblwiLFwiaG1wXCIsXCJobXFcIixcImhtclwiLFwiaG1zXCIsXCJobXRcIixcImhtdVwiLFwiaG12XCIsXCJobXdcIixcImhteFwiLFwiaG15XCIsXCJobXpcIixcImhuYVwiLFwiaG5kXCIsXCJobmVcIixcImhuaFwiLFwiaG5pXCIsXCJobmpcIixcImhublwiLFwiaG5vXCIsXCJobnNcIixcImhudVwiLFwiaG9hXCIsXCJob2JcIixcImhvY1wiLFwiaG9kXCIsXCJob2VcIixcImhvaFwiLFwiaG9pXCIsXCJob2pcIixcImhva1wiLFwiaG9sXCIsXCJob21cIixcImhvb1wiLFwiaG9wXCIsXCJob3JcIixcImhvc1wiLFwiaG90XCIsXCJob3ZcIixcImhvd1wiLFwiaG95XCIsXCJob3pcIixcImhwb1wiLFwiaHBzXCIsXCJocmFcIixcImhyY1wiLFwiaHJlXCIsXCJocmtcIixcImhybVwiLFwiaHJvXCIsXCJocnBcIixcImhyclwiLFwiaHJ0XCIsXCJocnVcIixcImhyd1wiLFwiaHJ4XCIsXCJocnpcIixcImhzYlwiLFwiaHNoXCIsXCJoc2xcIixcImhzblwiLFwiaHNzXCIsXCJodGlcIixcImh0b1wiLFwiaHRzXCIsXCJodHVcIixcImh0eFwiLFwiaHViXCIsXCJodWNcIixcImh1ZFwiLFwiaHVlXCIsXCJodWZcIixcImh1Z1wiLFwiaHVoXCIsXCJodWlcIixcImh1alwiLFwiaHVrXCIsXCJodWxcIixcImh1bVwiLFwiaHVvXCIsXCJodXBcIixcImh1cVwiLFwiaHVyXCIsXCJodXNcIixcImh1dFwiLFwiaHV1XCIsXCJodXZcIixcImh1d1wiLFwiaHV4XCIsXCJodXlcIixcImh1elwiLFwiaHZjXCIsXCJodmVcIixcImh2a1wiLFwiaHZuXCIsXCJodnZcIixcImh3YVwiLFwiaHdjXCIsXCJod29cIixcImh5YVwiLFwiaHl4XCIsXCJpYWlcIixcImlhblwiLFwiaWFwXCIsXCJpYXJcIixcImliYVwiLFwiaWJiXCIsXCJpYmRcIixcImliZVwiLFwiaWJnXCIsXCJpYmhcIixcImliaVwiLFwiaWJsXCIsXCJpYm1cIixcImliblwiLFwiaWJyXCIsXCJpYnVcIixcImlieVwiLFwiaWNhXCIsXCJpY2hcIixcImljbFwiLFwiaWNyXCIsXCJpZGFcIixcImlkYlwiLFwiaWRjXCIsXCJpZGRcIixcImlkZVwiLFwiaWRpXCIsXCJpZHJcIixcImlkc1wiLFwiaWR0XCIsXCJpZHVcIixcImlmYVwiLFwiaWZiXCIsXCJpZmVcIixcImlmZlwiLFwiaWZrXCIsXCJpZm1cIixcImlmdVwiLFwiaWZ5XCIsXCJpZ2JcIixcImlnZVwiLFwiaWdnXCIsXCJpZ2xcIixcImlnbVwiLFwiaWduXCIsXCJpZ29cIixcImlnc1wiLFwiaWd3XCIsXCJpaGJcIixcImloaVwiLFwiaWhwXCIsXCJpaHdcIixcImlpblwiLFwiaWlyXCIsXCJpamNcIixcImlqZVwiLFwiaWpqXCIsXCJpam5cIixcImlqb1wiLFwiaWpzXCIsXCJpa2VcIixcImlraVwiLFwiaWtrXCIsXCJpa2xcIixcImlrb1wiLFwiaWtwXCIsXCJpa3JcIixcImlrc1wiLFwiaWt0XCIsXCJpa3ZcIixcImlrd1wiLFwiaWt4XCIsXCJpa3pcIixcImlsYVwiLFwiaWxiXCIsXCJpbGdcIixcImlsaVwiLFwiaWxrXCIsXCJpbGxcIixcImlsbVwiLFwiaWxvXCIsXCJpbHBcIixcImlsc1wiLFwiaWx1XCIsXCJpbHZcIixcImlsd1wiLFwiaW1hXCIsXCJpbWVcIixcImltaVwiLFwiaW1sXCIsXCJpbW5cIixcImltb1wiLFwiaW1yXCIsXCJpbXNcIixcImlteVwiLFwiaW5iXCIsXCJpbmNcIixcImluZVwiLFwiaW5nXCIsXCJpbmhcIixcImlualwiLFwiaW5sXCIsXCJpbm1cIixcImlublwiLFwiaW5vXCIsXCJpbnBcIixcImluc1wiLFwiaW50XCIsXCJpbnpcIixcImlvclwiLFwiaW91XCIsXCJpb3dcIixcImlwaVwiLFwiaXBvXCIsXCJpcXVcIixcImlxd1wiLFwiaXJhXCIsXCJpcmVcIixcImlyaFwiLFwiaXJpXCIsXCJpcmtcIixcImlyblwiLFwiaXJvXCIsXCJpcnJcIixcImlydVwiLFwiaXJ4XCIsXCJpcnlcIixcImlzYVwiLFwiaXNjXCIsXCJpc2RcIixcImlzZVwiLFwiaXNnXCIsXCJpc2hcIixcImlzaVwiLFwiaXNrXCIsXCJpc21cIixcImlzblwiLFwiaXNvXCIsXCJpc3JcIixcImlzdFwiLFwiaXN1XCIsXCJpdGJcIixcIml0Y1wiLFwiaXRkXCIsXCJpdGVcIixcIml0aVwiLFwiaXRrXCIsXCJpdGxcIixcIml0bVwiLFwiaXRvXCIsXCJpdHJcIixcIml0c1wiLFwiaXR0XCIsXCJpdHZcIixcIml0d1wiLFwiaXR4XCIsXCJpdHlcIixcIml0elwiLFwiaXVtXCIsXCJpdmJcIixcIml2dlwiLFwiaXdrXCIsXCJpd21cIixcIml3b1wiLFwiaXdzXCIsXCJpeGNcIixcIml4bFwiLFwiaXlhXCIsXCJpeW9cIixcIml5eFwiLFwiaXpoXCIsXCJpemlcIixcIml6clwiLFwiaXp6XCIsXCJqYWFcIixcImphYlwiLFwiamFjXCIsXCJqYWRcIixcImphZVwiLFwiamFmXCIsXCJqYWhcIixcImphalwiLFwiamFrXCIsXCJqYWxcIixcImphbVwiLFwiamFuXCIsXCJqYW9cIixcImphcVwiLFwiamFyXCIsXCJqYXNcIixcImphdFwiLFwiamF1XCIsXCJqYXhcIixcImpheVwiLFwiamF6XCIsXCJqYmVcIixcImpiaVwiLFwiamJqXCIsXCJqYmtcIixcImpiblwiLFwiamJvXCIsXCJqYnJcIixcImpidFwiLFwiamJ1XCIsXCJqYndcIixcImpjc1wiLFwiamN0XCIsXCJqZGFcIixcImpkZ1wiLFwiamR0XCIsXCJqZWJcIixcImplZVwiLFwiamVnXCIsXCJqZWhcIixcImplaVwiLFwiamVrXCIsXCJqZWxcIixcImplblwiLFwiamVyXCIsXCJqZXRcIixcImpldVwiLFwiamdiXCIsXCJqZ2VcIixcImpna1wiLFwiamdvXCIsXCJqaGlcIixcImpoc1wiLFwiamlhXCIsXCJqaWJcIixcImppY1wiLFwiamlkXCIsXCJqaWVcIixcImppZ1wiLFwiamloXCIsXCJqaWlcIixcImppbFwiLFwiamltXCIsXCJqaW9cIixcImppcVwiLFwiaml0XCIsXCJqaXVcIixcImppdlwiLFwiaml5XCIsXCJqamVcIixcImpqclwiLFwiamthXCIsXCJqa21cIixcImprb1wiLFwiamtwXCIsXCJqa3JcIixcImprdVwiLFwiamxlXCIsXCJqbHNcIixcImptYVwiLFwiam1iXCIsXCJqbWNcIixcImptZFwiLFwiam1pXCIsXCJqbWxcIixcImptblwiLFwiam1yXCIsXCJqbXNcIixcImptd1wiLFwiam14XCIsXCJqbmFcIixcImpuZFwiLFwiam5nXCIsXCJqbmlcIixcImpualwiLFwiam5sXCIsXCJqbnNcIixcImpvYlwiLFwiam9kXCIsXCJqb2dcIixcImpvclwiLFwiam9zXCIsXCJqb3dcIixcImpwYVwiLFwianByXCIsXCJqcHhcIixcImpxclwiLFwianJhXCIsXCJqcmJcIixcImpyclwiLFwianJ0XCIsXCJqcnVcIixcImpzbFwiLFwianVhXCIsXCJqdWJcIixcImp1Y1wiLFwianVkXCIsXCJqdWhcIixcImp1aVwiLFwianVrXCIsXCJqdWxcIixcImp1bVwiLFwianVuXCIsXCJqdW9cIixcImp1cFwiLFwianVyXCIsXCJqdXNcIixcImp1dFwiLFwianV1XCIsXCJqdXdcIixcImp1eVwiLFwianZkXCIsXCJqdm5cIixcImp3aVwiLFwianlhXCIsXCJqeWVcIixcImp5eVwiLFwia2FhXCIsXCJrYWJcIixcImthY1wiLFwia2FkXCIsXCJrYWVcIixcImthZlwiLFwia2FnXCIsXCJrYWhcIixcImthaVwiLFwia2FqXCIsXCJrYWtcIixcImthbVwiLFwia2FvXCIsXCJrYXBcIixcImthcVwiLFwia2FyXCIsXCJrYXZcIixcImthd1wiLFwia2F4XCIsXCJrYXlcIixcImtiYVwiLFwia2JiXCIsXCJrYmNcIixcImtiZFwiLFwia2JlXCIsXCJrYmZcIixcImtiZ1wiLFwia2JoXCIsXCJrYmlcIixcImtialwiLFwia2JrXCIsXCJrYmxcIixcImtibVwiLFwia2JuXCIsXCJrYm9cIixcImticFwiLFwia2JxXCIsXCJrYnJcIixcImtic1wiLFwia2J0XCIsXCJrYnVcIixcImtidlwiLFwia2J3XCIsXCJrYnhcIixcImtieVwiLFwia2J6XCIsXCJrY2FcIixcImtjYlwiLFwia2NjXCIsXCJrY2RcIixcImtjZVwiLFwia2NmXCIsXCJrY2dcIixcImtjaFwiLFwia2NpXCIsXCJrY2pcIixcImtja1wiLFwia2NsXCIsXCJrY21cIixcImtjblwiLFwia2NvXCIsXCJrY3BcIixcImtjcVwiLFwia2NyXCIsXCJrY3NcIixcImtjdFwiLFwia2N1XCIsXCJrY3ZcIixcImtjd1wiLFwia2N4XCIsXCJrY3lcIixcImtjelwiLFwia2RhXCIsXCJrZGNcIixcImtkZFwiLFwia2RlXCIsXCJrZGZcIixcImtkZ1wiLFwia2RoXCIsXCJrZGlcIixcImtkalwiLFwia2RrXCIsXCJrZGxcIixcImtkbVwiLFwia2RuXCIsXCJrZG9cIixcImtkcFwiLFwia2RxXCIsXCJrZHJcIixcImtkdFwiLFwia2R1XCIsXCJrZHZcIixcImtkd1wiLFwia2R4XCIsXCJrZHlcIixcImtkelwiLFwia2VhXCIsXCJrZWJcIixcImtlY1wiLFwia2VkXCIsXCJrZWVcIixcImtlZlwiLFwia2VnXCIsXCJrZWhcIixcImtlaVwiLFwia2VqXCIsXCJrZWtcIixcImtlbFwiLFwia2VtXCIsXCJrZW5cIixcImtlb1wiLFwia2VwXCIsXCJrZXFcIixcImtlclwiLFwia2VzXCIsXCJrZXRcIixcImtldVwiLFwia2V2XCIsXCJrZXdcIixcImtleFwiLFwia2V5XCIsXCJrZXpcIixcImtmYVwiLFwia2ZiXCIsXCJrZmNcIixcImtmZFwiLFwia2ZlXCIsXCJrZmZcIixcImtmZ1wiLFwia2ZoXCIsXCJrZmlcIixcImtmalwiLFwia2ZrXCIsXCJrZmxcIixcImtmbVwiLFwia2ZuXCIsXCJrZm9cIixcImtmcFwiLFwia2ZxXCIsXCJrZnJcIixcImtmc1wiLFwia2Z0XCIsXCJrZnVcIixcImtmdlwiLFwia2Z3XCIsXCJrZnhcIixcImtmeVwiLFwia2Z6XCIsXCJrZ2FcIixcImtnYlwiLFwia2djXCIsXCJrZ2RcIixcImtnZVwiLFwia2dmXCIsXCJrZ2dcIixcImtnaFwiLFwia2dpXCIsXCJrZ2pcIixcImtna1wiLFwia2dsXCIsXCJrZ21cIixcImtnblwiLFwia2dvXCIsXCJrZ3BcIixcImtncVwiLFwia2dyXCIsXCJrZ3NcIixcImtndFwiLFwia2d1XCIsXCJrZ3ZcIixcImtnd1wiLFwia2d4XCIsXCJrZ3lcIixcImtoYVwiLFwia2hiXCIsXCJraGNcIixcImtoZFwiLFwia2hlXCIsXCJraGZcIixcImtoZ1wiLFwia2hoXCIsXCJraGlcIixcImtoalwiLFwia2hrXCIsXCJraGxcIixcImtoblwiLFwia2hvXCIsXCJraHBcIixcImtocVwiLFwia2hyXCIsXCJraHNcIixcImtodFwiLFwia2h1XCIsXCJraHZcIixcImtod1wiLFwia2h4XCIsXCJraHlcIixcImtoelwiLFwia2lhXCIsXCJraWJcIixcImtpY1wiLFwia2lkXCIsXCJraWVcIixcImtpZlwiLFwia2lnXCIsXCJraWhcIixcImtpaVwiLFwia2lqXCIsXCJraWxcIixcImtpbVwiLFwia2lvXCIsXCJraXBcIixcImtpcVwiLFwia2lzXCIsXCJraXRcIixcImtpdVwiLFwia2l2XCIsXCJraXdcIixcImtpeFwiLFwia2l5XCIsXCJraXpcIixcImtqYVwiLFwia2piXCIsXCJramNcIixcImtqZFwiLFwia2plXCIsXCJramZcIixcImtqZ1wiLFwia2poXCIsXCJramlcIixcImtqalwiLFwia2prXCIsXCJramxcIixcImtqbVwiLFwia2puXCIsXCJram9cIixcImtqcFwiLFwia2pxXCIsXCJranJcIixcImtqc1wiLFwia2p0XCIsXCJranVcIixcImtqdlwiLFwia2p4XCIsXCJranlcIixcImtqelwiLFwia2thXCIsXCJra2JcIixcImtrY1wiLFwia2tkXCIsXCJra2VcIixcImtrZlwiLFwia2tnXCIsXCJra2hcIixcImtraVwiLFwia2tqXCIsXCJra2tcIixcImtrbFwiLFwia2ttXCIsXCJra25cIixcImtrb1wiLFwia2twXCIsXCJra3FcIixcImtrclwiLFwia2tzXCIsXCJra3RcIixcImtrdVwiLFwia2t2XCIsXCJra3dcIixcImtreFwiLFwia2t5XCIsXCJra3pcIixcImtsYVwiLFwia2xiXCIsXCJrbGNcIixcImtsZFwiLFwia2xlXCIsXCJrbGZcIixcImtsZ1wiLFwia2xoXCIsXCJrbGlcIixcImtsalwiLFwia2xrXCIsXCJrbGxcIixcImtsbVwiLFwia2xuXCIsXCJrbG9cIixcImtscFwiLFwia2xxXCIsXCJrbHJcIixcImtsc1wiLFwia2x0XCIsXCJrbHVcIixcImtsdlwiLFwia2x3XCIsXCJrbHhcIixcImtseVwiLFwia2x6XCIsXCJrbWFcIixcImttYlwiLFwia21jXCIsXCJrbWRcIixcImttZVwiLFwia21mXCIsXCJrbWdcIixcImttaFwiLFwia21pXCIsXCJrbWpcIixcImtta1wiLFwia21sXCIsXCJrbW1cIixcImttblwiLFwia21vXCIsXCJrbXBcIixcImttcVwiLFwia21yXCIsXCJrbXNcIixcImttdFwiLFwia211XCIsXCJrbXZcIixcImttd1wiLFwia214XCIsXCJrbXlcIixcImttelwiLFwia25hXCIsXCJrbmJcIixcImtuY1wiLFwia25kXCIsXCJrbmVcIixcImtuZlwiLFwia25nXCIsXCJrbmlcIixcImtualwiLFwia25rXCIsXCJrbmxcIixcImtubVwiLFwia25uXCIsXCJrbm9cIixcImtucFwiLFwia25xXCIsXCJrbnJcIixcImtuc1wiLFwia250XCIsXCJrbnVcIixcImtudlwiLFwia253XCIsXCJrbnhcIixcImtueVwiLFwia256XCIsXCJrb2FcIixcImtvY1wiLFwia29kXCIsXCJrb2VcIixcImtvZlwiLFwia29nXCIsXCJrb2hcIixcImtvaVwiLFwia29qXCIsXCJrb2tcIixcImtvbFwiLFwia29vXCIsXCJrb3BcIixcImtvcVwiLFwia29zXCIsXCJrb3RcIixcImtvdVwiLFwia292XCIsXCJrb3dcIixcImtveFwiLFwia295XCIsXCJrb3pcIixcImtwYVwiLFwia3BiXCIsXCJrcGNcIixcImtwZFwiLFwia3BlXCIsXCJrcGZcIixcImtwZ1wiLFwia3BoXCIsXCJrcGlcIixcImtwalwiLFwia3BrXCIsXCJrcGxcIixcImtwbVwiLFwia3BuXCIsXCJrcG9cIixcImtwcFwiLFwia3BxXCIsXCJrcHJcIixcImtwc1wiLFwia3B0XCIsXCJrcHVcIixcImtwdlwiLFwia3B3XCIsXCJrcHhcIixcImtweVwiLFwia3B6XCIsXCJrcWFcIixcImtxYlwiLFwia3FjXCIsXCJrcWRcIixcImtxZVwiLFwia3FmXCIsXCJrcWdcIixcImtxaFwiLFwia3FpXCIsXCJrcWpcIixcImtxa1wiLFwia3FsXCIsXCJrcW1cIixcImtxblwiLFwia3FvXCIsXCJrcXBcIixcImtxcVwiLFwia3FyXCIsXCJrcXNcIixcImtxdFwiLFwia3F1XCIsXCJrcXZcIixcImtxd1wiLFwia3F4XCIsXCJrcXlcIixcImtxelwiLFwia3JhXCIsXCJrcmJcIixcImtyY1wiLFwia3JkXCIsXCJrcmVcIixcImtyZlwiLFwia3JoXCIsXCJrcmlcIixcImtyalwiLFwia3JrXCIsXCJrcmxcIixcImtybVwiLFwia3JuXCIsXCJrcm9cIixcImtycFwiLFwia3JyXCIsXCJrcnNcIixcImtydFwiLFwia3J1XCIsXCJrcnZcIixcImtyd1wiLFwia3J4XCIsXCJrcnlcIixcImtyelwiLFwia3NhXCIsXCJrc2JcIixcImtzY1wiLFwia3NkXCIsXCJrc2VcIixcImtzZlwiLFwia3NnXCIsXCJrc2hcIixcImtzaVwiLFwia3NqXCIsXCJrc2tcIixcImtzbFwiLFwia3NtXCIsXCJrc25cIixcImtzb1wiLFwia3NwXCIsXCJrc3FcIixcImtzclwiLFwia3NzXCIsXCJrc3RcIixcImtzdVwiLFwia3N2XCIsXCJrc3dcIixcImtzeFwiLFwia3N5XCIsXCJrc3pcIixcImt0YVwiLFwia3RiXCIsXCJrdGNcIixcImt0ZFwiLFwia3RlXCIsXCJrdGZcIixcImt0Z1wiLFwia3RoXCIsXCJrdGlcIixcImt0alwiLFwia3RrXCIsXCJrdGxcIixcImt0bVwiLFwia3RuXCIsXCJrdG9cIixcImt0cFwiLFwia3RxXCIsXCJrdHJcIixcImt0c1wiLFwia3R0XCIsXCJrdHVcIixcImt0dlwiLFwia3R3XCIsXCJrdHhcIixcImt0eVwiLFwia3R6XCIsXCJrdWJcIixcImt1Y1wiLFwia3VkXCIsXCJrdWVcIixcImt1ZlwiLFwia3VnXCIsXCJrdWhcIixcImt1aVwiLFwia3VqXCIsXCJrdWtcIixcImt1bFwiLFwia3VtXCIsXCJrdW5cIixcImt1b1wiLFwia3VwXCIsXCJrdXFcIixcImt1c1wiLFwia3V0XCIsXCJrdXVcIixcImt1dlwiLFwia3V3XCIsXCJrdXhcIixcImt1eVwiLFwia3V6XCIsXCJrdmFcIixcImt2YlwiLFwia3ZjXCIsXCJrdmRcIixcImt2ZVwiLFwia3ZmXCIsXCJrdmdcIixcImt2aFwiLFwia3ZpXCIsXCJrdmpcIixcImt2a1wiLFwia3ZsXCIsXCJrdm1cIixcImt2blwiLFwia3ZvXCIsXCJrdnBcIixcImt2cVwiLFwia3ZyXCIsXCJrdnNcIixcImt2dFwiLFwia3Z1XCIsXCJrdnZcIixcImt2d1wiLFwia3Z4XCIsXCJrdnlcIixcImt2elwiLFwia3dhXCIsXCJrd2JcIixcImt3Y1wiLFwia3dkXCIsXCJrd2VcIixcImt3ZlwiLFwia3dnXCIsXCJrd2hcIixcImt3aVwiLFwia3dqXCIsXCJrd2tcIixcImt3bFwiLFwia3dtXCIsXCJrd25cIixcImt3b1wiLFwia3dwXCIsXCJrd3FcIixcImt3clwiLFwia3dzXCIsXCJrd3RcIixcImt3dVwiLFwia3d2XCIsXCJrd3dcIixcImt3eFwiLFwia3d5XCIsXCJrd3pcIixcImt4YVwiLFwia3hiXCIsXCJreGNcIixcImt4ZFwiLFwia3hlXCIsXCJreGZcIixcImt4aFwiLFwia3hpXCIsXCJreGpcIixcImt4a1wiLFwia3hsXCIsXCJreG1cIixcImt4blwiLFwia3hvXCIsXCJreHBcIixcImt4cVwiLFwia3hyXCIsXCJreHNcIixcImt4dFwiLFwia3h1XCIsXCJreHZcIixcImt4d1wiLFwia3h4XCIsXCJreHlcIixcImt4elwiLFwia3lhXCIsXCJreWJcIixcImt5Y1wiLFwia3lkXCIsXCJreWVcIixcImt5ZlwiLFwia3lnXCIsXCJreWhcIixcImt5aVwiLFwia3lqXCIsXCJreWtcIixcImt5bFwiLFwia3ltXCIsXCJreW5cIixcImt5b1wiLFwia3lwXCIsXCJreXFcIixcImt5clwiLFwia3lzXCIsXCJreXRcIixcImt5dVwiLFwia3l2XCIsXCJreXdcIixcImt5eFwiLFwia3l5XCIsXCJreXpcIixcImt6YVwiLFwia3piXCIsXCJremNcIixcImt6ZFwiLFwia3plXCIsXCJremZcIixcImt6Z1wiLFwia3poXCIsXCJremlcIixcImt6alwiLFwia3prXCIsXCJremxcIixcImt6bVwiLFwia3puXCIsXCJrem9cIixcImt6cFwiLFwia3pxXCIsXCJrenJcIixcImt6c1wiLFwia3p0XCIsXCJrenVcIixcImt6dlwiLFwia3p3XCIsXCJrenhcIixcImt6eVwiLFwia3p6XCIsXCJsYWFcIixcImxhYlwiLFwibGFjXCIsXCJsYWRcIixcImxhZVwiLFwibGFmXCIsXCJsYWdcIixcImxhaFwiLFwibGFpXCIsXCJsYWpcIixcImxha1wiLFwibGFsXCIsXCJsYW1cIixcImxhblwiLFwibGFwXCIsXCJsYXFcIixcImxhclwiLFwibGFzXCIsXCJsYXVcIixcImxhd1wiLFwibGF4XCIsXCJsYXlcIixcImxhelwiLFwibGJhXCIsXCJsYmJcIixcImxiY1wiLFwibGJlXCIsXCJsYmZcIixcImxiZ1wiLFwibGJpXCIsXCJsYmpcIixcImxia1wiLFwibGJsXCIsXCJsYm1cIixcImxiblwiLFwibGJvXCIsXCJsYnFcIixcImxiclwiLFwibGJzXCIsXCJsYnRcIixcImxidVwiLFwibGJ2XCIsXCJsYndcIixcImxieFwiLFwibGJ5XCIsXCJsYnpcIixcImxjY1wiLFwibGNkXCIsXCJsY2VcIixcImxjZlwiLFwibGNoXCIsXCJsY2xcIixcImxjbVwiLFwibGNwXCIsXCJsY3FcIixcImxjc1wiLFwibGRhXCIsXCJsZGJcIixcImxkZFwiLFwibGRnXCIsXCJsZGhcIixcImxkaVwiLFwibGRqXCIsXCJsZGtcIixcImxkbFwiLFwibGRtXCIsXCJsZG5cIixcImxkb1wiLFwibGRwXCIsXCJsZHFcIixcImxlYVwiLFwibGViXCIsXCJsZWNcIixcImxlZFwiLFwibGVlXCIsXCJsZWZcIixcImxlZ1wiLFwibGVoXCIsXCJsZWlcIixcImxlalwiLFwibGVrXCIsXCJsZWxcIixcImxlbVwiLFwibGVuXCIsXCJsZW9cIixcImxlcFwiLFwibGVxXCIsXCJsZXJcIixcImxlc1wiLFwibGV0XCIsXCJsZXVcIixcImxldlwiLFwibGV3XCIsXCJsZXhcIixcImxleVwiLFwibGV6XCIsXCJsZmFcIixcImxmblwiLFwibGdhXCIsXCJsZ2JcIixcImxnZ1wiLFwibGdoXCIsXCJsZ2lcIixcImxna1wiLFwibGdsXCIsXCJsZ21cIixcImxnblwiLFwibGdxXCIsXCJsZ3JcIixcImxndFwiLFwibGd1XCIsXCJsZ3pcIixcImxoYVwiLFwibGhoXCIsXCJsaGlcIixcImxobFwiLFwibGhtXCIsXCJsaG5cIixcImxocFwiLFwibGhzXCIsXCJsaHRcIixcImxodVwiLFwibGlhXCIsXCJsaWJcIixcImxpY1wiLFwibGlkXCIsXCJsaWVcIixcImxpZlwiLFwibGlnXCIsXCJsaWhcIixcImxpaVwiLFwibGlqXCIsXCJsaWtcIixcImxpbFwiLFwibGlvXCIsXCJsaXBcIixcImxpcVwiLFwibGlyXCIsXCJsaXNcIixcImxpdVwiLFwibGl2XCIsXCJsaXdcIixcImxpeFwiLFwibGl5XCIsXCJsaXpcIixcImxqYVwiLFwibGplXCIsXCJsamlcIixcImxqbFwiLFwibGpwXCIsXCJsandcIixcImxqeFwiLFwibGthXCIsXCJsa2JcIixcImxrY1wiLFwibGtkXCIsXCJsa2VcIixcImxraFwiLFwibGtpXCIsXCJsa2pcIixcImxrbFwiLFwibGttXCIsXCJsa25cIixcImxrb1wiLFwibGtyXCIsXCJsa3NcIixcImxrdFwiLFwibGt1XCIsXCJsa3lcIixcImxsYVwiLFwibGxiXCIsXCJsbGNcIixcImxsZFwiLFwibGxlXCIsXCJsbGZcIixcImxsZ1wiLFwibGxoXCIsXCJsbGlcIixcImxsalwiLFwibGxrXCIsXCJsbGxcIixcImxsbVwiLFwibGxuXCIsXCJsbG9cIixcImxscFwiLFwibGxxXCIsXCJsbHNcIixcImxsdVwiLFwibGx4XCIsXCJsbWFcIixcImxtYlwiLFwibG1jXCIsXCJsbWRcIixcImxtZVwiLFwibG1mXCIsXCJsbWdcIixcImxtaFwiLFwibG1pXCIsXCJsbWpcIixcImxta1wiLFwibG1sXCIsXCJsbW1cIixcImxtblwiLFwibG1vXCIsXCJsbXBcIixcImxtcVwiLFwibG1yXCIsXCJsbXVcIixcImxtdlwiLFwibG13XCIsXCJsbXhcIixcImxteVwiLFwibG16XCIsXCJsbmFcIixcImxuYlwiLFwibG5kXCIsXCJsbmdcIixcImxuaFwiLFwibG5pXCIsXCJsbmpcIixcImxubFwiLFwibG5tXCIsXCJsbm5cIixcImxub1wiLFwibG5zXCIsXCJsbnVcIixcImxud1wiLFwibG56XCIsXCJsb2FcIixcImxvYlwiLFwibG9jXCIsXCJsb2VcIixcImxvZlwiLFwibG9nXCIsXCJsb2hcIixcImxvaVwiLFwibG9qXCIsXCJsb2tcIixcImxvbFwiLFwibG9tXCIsXCJsb25cIixcImxvb1wiLFwibG9wXCIsXCJsb3FcIixcImxvclwiLFwibG9zXCIsXCJsb3RcIixcImxvdVwiLFwibG92XCIsXCJsb3dcIixcImxveFwiLFwibG95XCIsXCJsb3pcIixcImxwYVwiLFwibHBlXCIsXCJscG5cIixcImxwb1wiLFwibHB4XCIsXCJscmFcIixcImxyY1wiLFwibHJlXCIsXCJscmdcIixcImxyaVwiLFwibHJrXCIsXCJscmxcIixcImxybVwiLFwibHJuXCIsXCJscm9cIixcImxyclwiLFwibHJ0XCIsXCJscnZcIixcImxyelwiLFwibHNhXCIsXCJsc2RcIixcImxzZVwiLFwibHNnXCIsXCJsc2hcIixcImxzaVwiLFwibHNsXCIsXCJsc21cIixcImxzb1wiLFwibHNwXCIsXCJsc3JcIixcImxzc1wiLFwibHN0XCIsXCJsc3lcIixcImx0Y1wiLFwibHRnXCIsXCJsdGhcIixcImx0aVwiLFwibHRuXCIsXCJsdG9cIixcImx0c1wiLFwibHR1XCIsXCJsdWFcIixcImx1Y1wiLFwibHVkXCIsXCJsdWVcIixcImx1ZlwiLFwibHVpXCIsXCJsdWpcIixcImx1a1wiLFwibHVsXCIsXCJsdW1cIixcImx1blwiLFwibHVvXCIsXCJsdXBcIixcImx1cVwiLFwibHVyXCIsXCJsdXNcIixcImx1dFwiLFwibHV1XCIsXCJsdXZcIixcImx1d1wiLFwibHV5XCIsXCJsdXpcIixcImx2YVwiLFwibHZrXCIsXCJsdnNcIixcImx2dVwiLFwibHdhXCIsXCJsd2VcIixcImx3Z1wiLFwibHdoXCIsXCJsd2xcIixcImx3bVwiLFwibHdvXCIsXCJsd3RcIixcImx3dVwiLFwibHd3XCIsXCJseWFcIixcImx5Z1wiLFwibHluXCIsXCJsemhcIixcImx6bFwiLFwibHpuXCIsXCJsenpcIixcIm1hYVwiLFwibWFiXCIsXCJtYWRcIixcIm1hZVwiLFwibWFmXCIsXCJtYWdcIixcIm1haVwiLFwibWFqXCIsXCJtYWtcIixcIm1hbVwiLFwibWFuXCIsXCJtYXBcIixcIm1hcVwiLFwibWFzXCIsXCJtYXRcIixcIm1hdVwiLFwibWF2XCIsXCJtYXdcIixcIm1heFwiLFwibWF6XCIsXCJtYmFcIixcIm1iYlwiLFwibWJjXCIsXCJtYmRcIixcIm1iZVwiLFwibWJmXCIsXCJtYmhcIixcIm1iaVwiLFwibWJqXCIsXCJtYmtcIixcIm1ibFwiLFwibWJtXCIsXCJtYm5cIixcIm1ib1wiLFwibWJwXCIsXCJtYnFcIixcIm1iclwiLFwibWJzXCIsXCJtYnRcIixcIm1idVwiLFwibWJ2XCIsXCJtYndcIixcIm1ieFwiLFwibWJ5XCIsXCJtYnpcIixcIm1jYVwiLFwibWNiXCIsXCJtY2NcIixcIm1jZFwiLFwibWNlXCIsXCJtY2ZcIixcIm1jZ1wiLFwibWNoXCIsXCJtY2lcIixcIm1jalwiLFwibWNrXCIsXCJtY2xcIixcIm1jbVwiLFwibWNuXCIsXCJtY29cIixcIm1jcFwiLFwibWNxXCIsXCJtY3JcIixcIm1jc1wiLFwibWN0XCIsXCJtY3VcIixcIm1jdlwiLFwibWN3XCIsXCJtY3hcIixcIm1jeVwiLFwibWN6XCIsXCJtZGFcIixcIm1kYlwiLFwibWRjXCIsXCJtZGRcIixcIm1kZVwiLFwibWRmXCIsXCJtZGdcIixcIm1kaFwiLFwibWRpXCIsXCJtZGpcIixcIm1ka1wiLFwibWRsXCIsXCJtZG1cIixcIm1kblwiLFwibWRwXCIsXCJtZHFcIixcIm1kclwiLFwibWRzXCIsXCJtZHRcIixcIm1kdVwiLFwibWR2XCIsXCJtZHdcIixcIm1keFwiLFwibWR5XCIsXCJtZHpcIixcIm1lYVwiLFwibWViXCIsXCJtZWNcIixcIm1lZFwiLFwibWVlXCIsXCJtZWZcIixcIm1lZ1wiLFwibWVoXCIsXCJtZWlcIixcIm1lalwiLFwibWVrXCIsXCJtZWxcIixcIm1lbVwiLFwibWVuXCIsXCJtZW9cIixcIm1lcFwiLFwibWVxXCIsXCJtZXJcIixcIm1lc1wiLFwibWV0XCIsXCJtZXVcIixcIm1ldlwiLFwibWV3XCIsXCJtZXlcIixcIm1lelwiLFwibWZhXCIsXCJtZmJcIixcIm1mY1wiLFwibWZkXCIsXCJtZmVcIixcIm1mZlwiLFwibWZnXCIsXCJtZmhcIixcIm1maVwiLFwibWZqXCIsXCJtZmtcIixcIm1mbFwiLFwibWZtXCIsXCJtZm5cIixcIm1mb1wiLFwibWZwXCIsXCJtZnFcIixcIm1mclwiLFwibWZzXCIsXCJtZnRcIixcIm1mdVwiLFwibWZ2XCIsXCJtZndcIixcIm1meFwiLFwibWZ5XCIsXCJtZnpcIixcIm1nYVwiLFwibWdiXCIsXCJtZ2NcIixcIm1nZFwiLFwibWdlXCIsXCJtZ2ZcIixcIm1nZ1wiLFwibWdoXCIsXCJtZ2lcIixcIm1nalwiLFwibWdrXCIsXCJtZ2xcIixcIm1nbVwiLFwibWduXCIsXCJtZ29cIixcIm1ncFwiLFwibWdxXCIsXCJtZ3JcIixcIm1nc1wiLFwibWd0XCIsXCJtZ3VcIixcIm1ndlwiLFwibWd3XCIsXCJtZ3hcIixcIm1neVwiLFwibWd6XCIsXCJtaGFcIixcIm1oYlwiLFwibWhjXCIsXCJtaGRcIixcIm1oZVwiLFwibWhmXCIsXCJtaGdcIixcIm1oaFwiLFwibWhpXCIsXCJtaGpcIixcIm1oa1wiLFwibWhsXCIsXCJtaG1cIixcIm1oblwiLFwibWhvXCIsXCJtaHBcIixcIm1ocVwiLFwibWhyXCIsXCJtaHNcIixcIm1odFwiLFwibWh1XCIsXCJtaHdcIixcIm1oeFwiLFwibWh5XCIsXCJtaHpcIixcIm1pYVwiLFwibWliXCIsXCJtaWNcIixcIm1pZFwiLFwibWllXCIsXCJtaWZcIixcIm1pZ1wiLFwibWloXCIsXCJtaWlcIixcIm1palwiLFwibWlrXCIsXCJtaWxcIixcIm1pbVwiLFwibWluXCIsXCJtaW9cIixcIm1pcFwiLFwibWlxXCIsXCJtaXJcIixcIm1pc1wiLFwibWl0XCIsXCJtaXVcIixcIm1pd1wiLFwibWl4XCIsXCJtaXlcIixcIm1pelwiLFwibWphXCIsXCJtamJcIixcIm1qY1wiLFwibWpkXCIsXCJtamVcIixcIm1qZ1wiLFwibWpoXCIsXCJtamlcIixcIm1qalwiLFwibWprXCIsXCJtamxcIixcIm1qbVwiLFwibWpuXCIsXCJtam9cIixcIm1qcFwiLFwibWpxXCIsXCJtanJcIixcIm1qc1wiLFwibWp0XCIsXCJtanVcIixcIm1qdlwiLFwibWp3XCIsXCJtanhcIixcIm1qeVwiLFwibWp6XCIsXCJta2FcIixcIm1rYlwiLFwibWtjXCIsXCJta2VcIixcIm1rZlwiLFwibWtnXCIsXCJta2hcIixcIm1raVwiLFwibWtqXCIsXCJta2tcIixcIm1rbFwiLFwibWttXCIsXCJta25cIixcIm1rb1wiLFwibWtwXCIsXCJta3FcIixcIm1rclwiLFwibWtzXCIsXCJta3RcIixcIm1rdVwiLFwibWt2XCIsXCJta3dcIixcIm1reFwiLFwibWt5XCIsXCJta3pcIixcIm1sYVwiLFwibWxiXCIsXCJtbGNcIixcIm1sZFwiLFwibWxlXCIsXCJtbGZcIixcIm1saFwiLFwibWxpXCIsXCJtbGpcIixcIm1sa1wiLFwibWxsXCIsXCJtbG1cIixcIm1sblwiLFwibWxvXCIsXCJtbHBcIixcIm1scVwiLFwibWxyXCIsXCJtbHNcIixcIm1sdVwiLFwibWx2XCIsXCJtbHdcIixcIm1seFwiLFwibWx6XCIsXCJtbWFcIixcIm1tYlwiLFwibW1jXCIsXCJtbWRcIixcIm1tZVwiLFwibW1mXCIsXCJtbWdcIixcIm1taFwiLFwibW1pXCIsXCJtbWpcIixcIm1ta1wiLFwibW1sXCIsXCJtbW1cIixcIm1tblwiLFwibW1vXCIsXCJtbXBcIixcIm1tcVwiLFwibW1yXCIsXCJtbXRcIixcIm1tdVwiLFwibW12XCIsXCJtbXdcIixcIm1teFwiLFwibW15XCIsXCJtbXpcIixcIm1uYVwiLFwibW5iXCIsXCJtbmNcIixcIm1uZFwiLFwibW5lXCIsXCJtbmZcIixcIm1uZ1wiLFwibW5oXCIsXCJtbmlcIixcIm1ualwiLFwibW5rXCIsXCJtbmxcIixcIm1ubVwiLFwibW5uXCIsXCJtbm9cIixcIm1ucFwiLFwibW5xXCIsXCJtbnJcIixcIm1uc1wiLFwibW50XCIsXCJtbnVcIixcIm1udlwiLFwibW53XCIsXCJtbnhcIixcIm1ueVwiLFwibW56XCIsXCJtb2FcIixcIm1vY1wiLFwibW9kXCIsXCJtb2VcIixcIm1vZlwiLFwibW9nXCIsXCJtb2hcIixcIm1vaVwiLFwibW9qXCIsXCJtb2tcIixcIm1vbVwiLFwibW9vXCIsXCJtb3BcIixcIm1vcVwiLFwibW9yXCIsXCJtb3NcIixcIm1vdFwiLFwibW91XCIsXCJtb3ZcIixcIm1vd1wiLFwibW94XCIsXCJtb3lcIixcIm1velwiLFwibXBhXCIsXCJtcGJcIixcIm1wY1wiLFwibXBkXCIsXCJtcGVcIixcIm1wZ1wiLFwibXBoXCIsXCJtcGlcIixcIm1walwiLFwibXBrXCIsXCJtcGxcIixcIm1wbVwiLFwibXBuXCIsXCJtcG9cIixcIm1wcFwiLFwibXBxXCIsXCJtcHJcIixcIm1wc1wiLFwibXB0XCIsXCJtcHVcIixcIm1wdlwiLFwibXB3XCIsXCJtcHhcIixcIm1weVwiLFwibXB6XCIsXCJtcWFcIixcIm1xYlwiLFwibXFjXCIsXCJtcWVcIixcIm1xZlwiLFwibXFnXCIsXCJtcWhcIixcIm1xaVwiLFwibXFqXCIsXCJtcWtcIixcIm1xbFwiLFwibXFtXCIsXCJtcW5cIixcIm1xb1wiLFwibXFwXCIsXCJtcXFcIixcIm1xclwiLFwibXFzXCIsXCJtcXRcIixcIm1xdVwiLFwibXF2XCIsXCJtcXdcIixcIm1xeFwiLFwibXF5XCIsXCJtcXpcIixcIm1yYVwiLFwibXJiXCIsXCJtcmNcIixcIm1yZFwiLFwibXJlXCIsXCJtcmZcIixcIm1yZ1wiLFwibXJoXCIsXCJtcmpcIixcIm1ya1wiLFwibXJsXCIsXCJtcm1cIixcIm1yblwiLFwibXJvXCIsXCJtcnBcIixcIm1ycVwiLFwibXJyXCIsXCJtcnNcIixcIm1ydFwiLFwibXJ1XCIsXCJtcnZcIixcIm1yd1wiLFwibXJ4XCIsXCJtcnlcIixcIm1yelwiLFwibXNiXCIsXCJtc2NcIixcIm1zZFwiLFwibXNlXCIsXCJtc2ZcIixcIm1zZ1wiLFwibXNoXCIsXCJtc2lcIixcIm1zalwiLFwibXNrXCIsXCJtc2xcIixcIm1zbVwiLFwibXNuXCIsXCJtc29cIixcIm1zcFwiLFwibXNxXCIsXCJtc3JcIixcIm1zc1wiLFwibXN0XCIsXCJtc3VcIixcIm1zdlwiLFwibXN3XCIsXCJtc3hcIixcIm1zeVwiLFwibXN6XCIsXCJtdGFcIixcIm10YlwiLFwibXRjXCIsXCJtdGRcIixcIm10ZVwiLFwibXRmXCIsXCJtdGdcIixcIm10aFwiLFwibXRpXCIsXCJtdGpcIixcIm10a1wiLFwibXRsXCIsXCJtdG1cIixcIm10blwiLFwibXRvXCIsXCJtdHBcIixcIm10cVwiLFwibXRyXCIsXCJtdHNcIixcIm10dFwiLFwibXR1XCIsXCJtdHZcIixcIm10d1wiLFwibXR4XCIsXCJtdHlcIixcIm11YVwiLFwibXViXCIsXCJtdWNcIixcIm11ZFwiLFwibXVlXCIsXCJtdWdcIixcIm11aFwiLFwibXVpXCIsXCJtdWpcIixcIm11a1wiLFwibXVsXCIsXCJtdW1cIixcIm11blwiLFwibXVvXCIsXCJtdXBcIixcIm11cVwiLFwibXVyXCIsXCJtdXNcIixcIm11dFwiLFwibXV1XCIsXCJtdXZcIixcIm11eFwiLFwibXV5XCIsXCJtdXpcIixcIm12YVwiLFwibXZiXCIsXCJtdmRcIixcIm12ZVwiLFwibXZmXCIsXCJtdmdcIixcIm12aFwiLFwibXZpXCIsXCJtdmtcIixcIm12bFwiLFwibXZtXCIsXCJtdm5cIixcIm12b1wiLFwibXZwXCIsXCJtdnFcIixcIm12clwiLFwibXZzXCIsXCJtdnRcIixcIm12dVwiLFwibXZ2XCIsXCJtdndcIixcIm12eFwiLFwibXZ5XCIsXCJtdnpcIixcIm13YVwiLFwibXdiXCIsXCJtd2NcIixcIm13ZFwiLFwibXdlXCIsXCJtd2ZcIixcIm13Z1wiLFwibXdoXCIsXCJtd2lcIixcIm13alwiLFwibXdrXCIsXCJtd2xcIixcIm13bVwiLFwibXduXCIsXCJtd29cIixcIm13cFwiLFwibXdxXCIsXCJtd3JcIixcIm13c1wiLFwibXd0XCIsXCJtd3VcIixcIm13dlwiLFwibXd3XCIsXCJtd3hcIixcIm13eVwiLFwibXd6XCIsXCJteGFcIixcIm14YlwiLFwibXhjXCIsXCJteGRcIixcIm14ZVwiLFwibXhmXCIsXCJteGdcIixcIm14aFwiLFwibXhpXCIsXCJteGpcIixcIm14a1wiLFwibXhsXCIsXCJteG1cIixcIm14blwiLFwibXhvXCIsXCJteHBcIixcIm14cVwiLFwibXhyXCIsXCJteHNcIixcIm14dFwiLFwibXh1XCIsXCJteHZcIixcIm14d1wiLFwibXh4XCIsXCJteHlcIixcIm14elwiLFwibXliXCIsXCJteWNcIixcIm15ZFwiLFwibXllXCIsXCJteWZcIixcIm15Z1wiLFwibXloXCIsXCJteWlcIixcIm15alwiLFwibXlrXCIsXCJteWxcIixcIm15bVwiLFwibXluXCIsXCJteW9cIixcIm15cFwiLFwibXlxXCIsXCJteXJcIixcIm15c1wiLFwibXl0XCIsXCJteXVcIixcIm15dlwiLFwibXl3XCIsXCJteXhcIixcIm15eVwiLFwibXl6XCIsXCJtemFcIixcIm16YlwiLFwibXpjXCIsXCJtemRcIixcIm16ZVwiLFwibXpnXCIsXCJtemhcIixcIm16aVwiLFwibXpqXCIsXCJtemtcIixcIm16bFwiLFwibXptXCIsXCJtem5cIixcIm16b1wiLFwibXpwXCIsXCJtenFcIixcIm16clwiLFwibXpzXCIsXCJtenRcIixcIm16dVwiLFwibXp2XCIsXCJtendcIixcIm16eFwiLFwibXp5XCIsXCJtenpcIixcIm5hYVwiLFwibmFiXCIsXCJuYWNcIixcIm5hZFwiLFwibmFlXCIsXCJuYWZcIixcIm5hZ1wiLFwibmFoXCIsXCJuYWlcIixcIm5halwiLFwibmFrXCIsXCJuYWxcIixcIm5hbVwiLFwibmFuXCIsXCJuYW9cIixcIm5hcFwiLFwibmFxXCIsXCJuYXJcIixcIm5hc1wiLFwibmF0XCIsXCJuYXdcIixcIm5heFwiLFwibmF5XCIsXCJuYXpcIixcIm5iYVwiLFwibmJiXCIsXCJuYmNcIixcIm5iZFwiLFwibmJlXCIsXCJuYmZcIixcIm5iZ1wiLFwibmJoXCIsXCJuYmlcIixcIm5ialwiLFwibmJrXCIsXCJuYm1cIixcIm5iblwiLFwibmJvXCIsXCJuYnBcIixcIm5icVwiLFwibmJyXCIsXCJuYnNcIixcIm5idFwiLFwibmJ1XCIsXCJuYnZcIixcIm5id1wiLFwibmJ4XCIsXCJuYnlcIixcIm5jYVwiLFwibmNiXCIsXCJuY2NcIixcIm5jZFwiLFwibmNlXCIsXCJuY2ZcIixcIm5jZ1wiLFwibmNoXCIsXCJuY2lcIixcIm5jalwiLFwibmNrXCIsXCJuY2xcIixcIm5jbVwiLFwibmNuXCIsXCJuY29cIixcIm5jcFwiLFwibmNxXCIsXCJuY3JcIixcIm5jc1wiLFwibmN0XCIsXCJuY3VcIixcIm5jeFwiLFwibmN6XCIsXCJuZGFcIixcIm5kYlwiLFwibmRjXCIsXCJuZGRcIixcIm5kZlwiLFwibmRnXCIsXCJuZGhcIixcIm5kaVwiLFwibmRqXCIsXCJuZGtcIixcIm5kbFwiLFwibmRtXCIsXCJuZG5cIixcIm5kcFwiLFwibmRxXCIsXCJuZHJcIixcIm5kc1wiLFwibmR0XCIsXCJuZHVcIixcIm5kdlwiLFwibmR3XCIsXCJuZHhcIixcIm5keVwiLFwibmR6XCIsXCJuZWFcIixcIm5lYlwiLFwibmVjXCIsXCJuZWRcIixcIm5lZVwiLFwibmVmXCIsXCJuZWdcIixcIm5laFwiLFwibmVpXCIsXCJuZWpcIixcIm5la1wiLFwibmVtXCIsXCJuZW5cIixcIm5lb1wiLFwibmVxXCIsXCJuZXJcIixcIm5lc1wiLFwibmV0XCIsXCJuZXVcIixcIm5ldlwiLFwibmV3XCIsXCJuZXhcIixcIm5leVwiLFwibmV6XCIsXCJuZmFcIixcIm5mZFwiLFwibmZsXCIsXCJuZnJcIixcIm5mdVwiLFwibmdhXCIsXCJuZ2JcIixcIm5nY1wiLFwibmdkXCIsXCJuZ2VcIixcIm5nZlwiLFwibmdnXCIsXCJuZ2hcIixcIm5naVwiLFwibmdqXCIsXCJuZ2tcIixcIm5nbFwiLFwibmdtXCIsXCJuZ25cIixcIm5nb1wiLFwibmdwXCIsXCJuZ3FcIixcIm5nclwiLFwibmdzXCIsXCJuZ3RcIixcIm5ndVwiLFwibmd2XCIsXCJuZ3dcIixcIm5neFwiLFwibmd5XCIsXCJuZ3pcIixcIm5oYVwiLFwibmhiXCIsXCJuaGNcIixcIm5oZFwiLFwibmhlXCIsXCJuaGZcIixcIm5oZ1wiLFwibmhoXCIsXCJuaGlcIixcIm5oa1wiLFwibmhtXCIsXCJuaG5cIixcIm5ob1wiLFwibmhwXCIsXCJuaHFcIixcIm5oclwiLFwibmh0XCIsXCJuaHVcIixcIm5odlwiLFwibmh3XCIsXCJuaHhcIixcIm5oeVwiLFwibmh6XCIsXCJuaWFcIixcIm5pYlwiLFwibmljXCIsXCJuaWRcIixcIm5pZVwiLFwibmlmXCIsXCJuaWdcIixcIm5paFwiLFwibmlpXCIsXCJuaWpcIixcIm5pa1wiLFwibmlsXCIsXCJuaW1cIixcIm5pblwiLFwibmlvXCIsXCJuaXFcIixcIm5pclwiLFwibmlzXCIsXCJuaXRcIixcIm5pdVwiLFwibml2XCIsXCJuaXdcIixcIm5peFwiLFwibml5XCIsXCJuaXpcIixcIm5qYVwiLFwibmpiXCIsXCJuamRcIixcIm5qaFwiLFwibmppXCIsXCJuampcIixcIm5qbFwiLFwibmptXCIsXCJuam5cIixcIm5qb1wiLFwibmpyXCIsXCJuanNcIixcIm5qdFwiLFwibmp1XCIsXCJuanhcIixcIm5qeVwiLFwibmp6XCIsXCJua2FcIixcIm5rYlwiLFwibmtjXCIsXCJua2RcIixcIm5rZVwiLFwibmtmXCIsXCJua2dcIixcIm5raFwiLFwibmtpXCIsXCJua2pcIixcIm5ra1wiLFwibmttXCIsXCJua25cIixcIm5rb1wiLFwibmtwXCIsXCJua3FcIixcIm5rclwiLFwibmtzXCIsXCJua3RcIixcIm5rdVwiLFwibmt2XCIsXCJua3dcIixcIm5reFwiLFwibmt6XCIsXCJubGFcIixcIm5sY1wiLFwibmxlXCIsXCJubGdcIixcIm5saVwiLFwibmxqXCIsXCJubGtcIixcIm5sbFwiLFwibmxuXCIsXCJubG9cIixcIm5scVwiLFwibmxyXCIsXCJubHVcIixcIm5sdlwiLFwibmx3XCIsXCJubHhcIixcIm5seVwiLFwibmx6XCIsXCJubWFcIixcIm5tYlwiLFwibm1jXCIsXCJubWRcIixcIm5tZVwiLFwibm1mXCIsXCJubWdcIixcIm5taFwiLFwibm1pXCIsXCJubWpcIixcIm5ta1wiLFwibm1sXCIsXCJubW1cIixcIm5tblwiLFwibm1vXCIsXCJubXBcIixcIm5tcVwiLFwibm1yXCIsXCJubXNcIixcIm5tdFwiLFwibm11XCIsXCJubXZcIixcIm5td1wiLFwibm14XCIsXCJubXlcIixcIm5telwiLFwibm5hXCIsXCJubmJcIixcIm5uY1wiLFwibm5kXCIsXCJubmVcIixcIm5uZlwiLFwibm5nXCIsXCJubmhcIixcIm5uaVwiLFwibm5qXCIsXCJubmtcIixcIm5ubFwiLFwibm5tXCIsXCJubm5cIixcIm5ucFwiLFwibm5xXCIsXCJubnJcIixcIm5uc1wiLFwibm50XCIsXCJubnVcIixcIm5udlwiLFwibm53XCIsXCJubnhcIixcIm5ueVwiLFwibm56XCIsXCJub2FcIixcIm5vY1wiLFwibm9kXCIsXCJub2VcIixcIm5vZlwiLFwibm9nXCIsXCJub2hcIixcIm5vaVwiLFwibm9qXCIsXCJub2tcIixcIm5vbFwiLFwibm9tXCIsXCJub25cIixcIm5vb1wiLFwibm9wXCIsXCJub3FcIixcIm5vc1wiLFwibm90XCIsXCJub3VcIixcIm5vdlwiLFwibm93XCIsXCJub3lcIixcIm5velwiLFwibnBhXCIsXCJucGJcIixcIm5wZ1wiLFwibnBoXCIsXCJucGlcIixcIm5wbFwiLFwibnBuXCIsXCJucG9cIixcIm5wc1wiLFwibnB1XCIsXCJucHhcIixcIm5weVwiLFwibnFnXCIsXCJucWtcIixcIm5xbFwiLFwibnFtXCIsXCJucW5cIixcIm5xb1wiLFwibnFxXCIsXCJucXlcIixcIm5yYVwiLFwibnJiXCIsXCJucmNcIixcIm5yZVwiLFwibnJmXCIsXCJucmdcIixcIm5yaVwiLFwibnJrXCIsXCJucmxcIixcIm5ybVwiLFwibnJuXCIsXCJucnBcIixcIm5yclwiLFwibnJ0XCIsXCJucnVcIixcIm5yeFwiLFwibnJ6XCIsXCJuc2FcIixcIm5zY1wiLFwibnNkXCIsXCJuc2VcIixcIm5zZlwiLFwibnNnXCIsXCJuc2hcIixcIm5zaVwiLFwibnNrXCIsXCJuc2xcIixcIm5zbVwiLFwibnNuXCIsXCJuc29cIixcIm5zcFwiLFwibnNxXCIsXCJuc3JcIixcIm5zc1wiLFwibnN0XCIsXCJuc3VcIixcIm5zdlwiLFwibnN3XCIsXCJuc3hcIixcIm5zeVwiLFwibnN6XCIsXCJudGRcIixcIm50ZVwiLFwibnRnXCIsXCJudGlcIixcIm50alwiLFwibnRrXCIsXCJudG1cIixcIm50b1wiLFwibnRwXCIsXCJudHJcIixcIm50c1wiLFwibnR1XCIsXCJudHdcIixcIm50eFwiLFwibnR5XCIsXCJudHpcIixcIm51YVwiLFwibnViXCIsXCJudWNcIixcIm51ZFwiLFwibnVlXCIsXCJudWZcIixcIm51Z1wiLFwibnVoXCIsXCJudWlcIixcIm51alwiLFwibnVrXCIsXCJudWxcIixcIm51bVwiLFwibnVuXCIsXCJudW9cIixcIm51cFwiLFwibnVxXCIsXCJudXJcIixcIm51c1wiLFwibnV0XCIsXCJudXVcIixcIm51dlwiLFwibnV3XCIsXCJudXhcIixcIm51eVwiLFwibnV6XCIsXCJudmhcIixcIm52bVwiLFwibnZvXCIsXCJud2FcIixcIm53YlwiLFwibndjXCIsXCJud2VcIixcIm53Z1wiLFwibndpXCIsXCJud21cIixcIm53b1wiLFwibndyXCIsXCJud3hcIixcIm53eVwiLFwibnhhXCIsXCJueGRcIixcIm54ZVwiLFwibnhnXCIsXCJueGlcIixcIm54a1wiLFwibnhsXCIsXCJueG1cIixcIm54blwiLFwibnhvXCIsXCJueHFcIixcIm54clwiLFwibnh1XCIsXCJueHhcIixcIm55YlwiLFwibnljXCIsXCJueWRcIixcIm55ZVwiLFwibnlmXCIsXCJueWdcIixcIm55aFwiLFwibnlpXCIsXCJueWpcIixcIm55a1wiLFwibnlsXCIsXCJueW1cIixcIm55blwiLFwibnlvXCIsXCJueXBcIixcIm55cVwiLFwibnlyXCIsXCJueXNcIixcIm55dFwiLFwibnl1XCIsXCJueXZcIixcIm55d1wiLFwibnl4XCIsXCJueXlcIixcIm56YVwiLFwibnpiXCIsXCJuemlcIixcIm56a1wiLFwibnptXCIsXCJuenNcIixcIm56dVwiLFwibnp5XCIsXCJuenpcIixcIm9hYVwiLFwib2FjXCIsXCJvYXJcIixcIm9hdlwiLFwib2JpXCIsXCJvYmtcIixcIm9ibFwiLFwib2JtXCIsXCJvYm9cIixcIm9iclwiLFwib2J0XCIsXCJvYnVcIixcIm9jYVwiLFwib2NoXCIsXCJvY29cIixcIm9jdVwiLFwib2RhXCIsXCJvZGtcIixcIm9kdFwiLFwib2R1XCIsXCJvZm9cIixcIm9mc1wiLFwib2Z1XCIsXCJvZ2JcIixcIm9nY1wiLFwib2dlXCIsXCJvZ2dcIixcIm9nb1wiLFwib2d1XCIsXCJvaHRcIixcIm9odVwiLFwib2lhXCIsXCJvaW5cIixcIm9qYlwiLFwib2pjXCIsXCJvamdcIixcIm9qcFwiLFwib2pzXCIsXCJvanZcIixcIm9qd1wiLFwib2thXCIsXCJva2JcIixcIm9rZFwiLFwib2tlXCIsXCJva2dcIixcIm9raFwiLFwib2tpXCIsXCJva2pcIixcIm9ra1wiLFwib2tsXCIsXCJva21cIixcIm9rblwiLFwib2tvXCIsXCJva3JcIixcIm9rc1wiLFwib2t1XCIsXCJva3ZcIixcIm9reFwiLFwib2xhXCIsXCJvbGRcIixcIm9sZVwiLFwib2xrXCIsXCJvbG1cIixcIm9sb1wiLFwib2xyXCIsXCJvbHRcIixcIm9sdVwiLFwib21hXCIsXCJvbWJcIixcIm9tY1wiLFwib21lXCIsXCJvbWdcIixcIm9taVwiLFwib21rXCIsXCJvbWxcIixcIm9tblwiLFwib21vXCIsXCJvbXBcIixcIm9tcVwiLFwib21yXCIsXCJvbXRcIixcIm9tdVwiLFwib212XCIsXCJvbXdcIixcIm9teFwiLFwib25hXCIsXCJvbmJcIixcIm9uZVwiLFwib25nXCIsXCJvbmlcIixcIm9ualwiLFwib25rXCIsXCJvbm5cIixcIm9ub1wiLFwib25wXCIsXCJvbnJcIixcIm9uc1wiLFwib250XCIsXCJvbnVcIixcIm9ud1wiLFwib254XCIsXCJvb2RcIixcIm9vZ1wiLFwib29uXCIsXCJvb3JcIixcIm9vc1wiLFwib3BhXCIsXCJvcGtcIixcIm9wbVwiLFwib3BvXCIsXCJvcHRcIixcIm9weVwiLFwib3JhXCIsXCJvcmNcIixcIm9yZVwiLFwib3JnXCIsXCJvcmhcIixcIm9yblwiLFwib3JvXCIsXCJvcnJcIixcIm9yc1wiLFwib3J0XCIsXCJvcnVcIixcIm9ydlwiLFwib3J3XCIsXCJvcnhcIixcIm9yeVwiLFwib3J6XCIsXCJvc2FcIixcIm9zY1wiLFwib3NpXCIsXCJvc29cIixcIm9zcFwiLFwib3N0XCIsXCJvc3VcIixcIm9zeFwiLFwib3RhXCIsXCJvdGJcIixcIm90ZFwiLFwib3RlXCIsXCJvdGlcIixcIm90a1wiLFwib3RsXCIsXCJvdG1cIixcIm90blwiLFwib3RvXCIsXCJvdHFcIixcIm90clwiLFwib3RzXCIsXCJvdHRcIixcIm90dVwiLFwib3R3XCIsXCJvdHhcIixcIm90eVwiLFwib3R6XCIsXCJvdWFcIixcIm91YlwiLFwib3VlXCIsXCJvdWlcIixcIm91bVwiLFwib3VuXCIsXCJvdmRcIixcIm93aVwiLFwib3dsXCIsXCJveWJcIixcIm95ZFwiLFwib3ltXCIsXCJveXlcIixcIm96bVwiLFwicGFhXCIsXCJwYWJcIixcInBhY1wiLFwicGFkXCIsXCJwYWVcIixcInBhZlwiLFwicGFnXCIsXCJwYWhcIixcInBhaVwiLFwicGFrXCIsXCJwYWxcIixcInBhbVwiLFwicGFvXCIsXCJwYXBcIixcInBhcVwiLFwicGFyXCIsXCJwYXNcIixcInBhdFwiLFwicGF1XCIsXCJwYXZcIixcInBhd1wiLFwicGF4XCIsXCJwYXlcIixcInBhelwiLFwicGJiXCIsXCJwYmNcIixcInBiZVwiLFwicGJmXCIsXCJwYmdcIixcInBiaFwiLFwicGJpXCIsXCJwYmxcIixcInBiblwiLFwicGJvXCIsXCJwYnBcIixcInBiclwiLFwicGJzXCIsXCJwYnRcIixcInBidVwiLFwicGJ2XCIsXCJwYnlcIixcInBielwiLFwicGNhXCIsXCJwY2JcIixcInBjY1wiLFwicGNkXCIsXCJwY2VcIixcInBjZlwiLFwicGNnXCIsXCJwY2hcIixcInBjaVwiLFwicGNqXCIsXCJwY2tcIixcInBjbFwiLFwicGNtXCIsXCJwY25cIixcInBjcFwiLFwicGNyXCIsXCJwY3dcIixcInBkYVwiLFwicGRjXCIsXCJwZGlcIixcInBkblwiLFwicGRvXCIsXCJwZHRcIixcInBkdVwiLFwicGVhXCIsXCJwZWJcIixcInBlZFwiLFwicGVlXCIsXCJwZWZcIixcInBlZ1wiLFwicGVoXCIsXCJwZWlcIixcInBlalwiLFwicGVrXCIsXCJwZWxcIixcInBlbVwiLFwicGVvXCIsXCJwZXBcIixcInBlcVwiLFwicGVzXCIsXCJwZXZcIixcInBleFwiLFwicGV5XCIsXCJwZXpcIixcInBmYVwiLFwicGZlXCIsXCJwZmxcIixcInBnYVwiLFwicGdkXCIsXCJwZ2dcIixcInBnaVwiLFwicGdrXCIsXCJwZ2xcIixcInBnblwiLFwicGdzXCIsXCJwZ3VcIixcInBneVwiLFwicGd6XCIsXCJwaGFcIixcInBoZFwiLFwicGhnXCIsXCJwaGhcIixcInBoaVwiLFwicGhrXCIsXCJwaGxcIixcInBobVwiLFwicGhuXCIsXCJwaG9cIixcInBocVwiLFwicGhyXCIsXCJwaHRcIixcInBodVwiLFwicGh2XCIsXCJwaHdcIixcInBpYVwiLFwicGliXCIsXCJwaWNcIixcInBpZFwiLFwicGllXCIsXCJwaWZcIixcInBpZ1wiLFwicGloXCIsXCJwaWlcIixcInBpalwiLFwicGlsXCIsXCJwaW1cIixcInBpblwiLFwicGlvXCIsXCJwaXBcIixcInBpclwiLFwicGlzXCIsXCJwaXRcIixcInBpdVwiLFwicGl2XCIsXCJwaXdcIixcInBpeFwiLFwicGl5XCIsXCJwaXpcIixcInBqdFwiLFwicGthXCIsXCJwa2JcIixcInBrY1wiLFwicGtnXCIsXCJwa2hcIixcInBrblwiLFwicGtvXCIsXCJwa3BcIixcInBrclwiLFwicGtzXCIsXCJwa3RcIixcInBrdVwiLFwicGxhXCIsXCJwbGJcIixcInBsY1wiLFwicGxkXCIsXCJwbGVcIixcInBsZlwiLFwicGxnXCIsXCJwbGhcIixcInBsalwiLFwicGxrXCIsXCJwbGxcIixcInBsblwiLFwicGxvXCIsXCJwbHBcIixcInBscVwiLFwicGxyXCIsXCJwbHNcIixcInBsdFwiLFwicGx1XCIsXCJwbHZcIixcInBsd1wiLFwicGx5XCIsXCJwbHpcIixcInBtYVwiLFwicG1iXCIsXCJwbWNcIixcInBtZFwiLFwicG1lXCIsXCJwbWZcIixcInBtaFwiLFwicG1pXCIsXCJwbWpcIixcInBta1wiLFwicG1sXCIsXCJwbW1cIixcInBtblwiLFwicG1vXCIsXCJwbXFcIixcInBtclwiLFwicG1zXCIsXCJwbXRcIixcInBtdVwiLFwicG13XCIsXCJwbXhcIixcInBteVwiLFwicG16XCIsXCJwbmFcIixcInBuYlwiLFwicG5jXCIsXCJwbmVcIixcInBuZ1wiLFwicG5oXCIsXCJwbmlcIixcInBualwiLFwicG5rXCIsXCJwbmxcIixcInBubVwiLFwicG5uXCIsXCJwbm9cIixcInBucFwiLFwicG5xXCIsXCJwbnJcIixcInBuc1wiLFwicG50XCIsXCJwbnVcIixcInBudlwiLFwicG53XCIsXCJwbnhcIixcInBueVwiLFwicG56XCIsXCJwb2NcIixcInBvZFwiLFwicG9lXCIsXCJwb2ZcIixcInBvZ1wiLFwicG9oXCIsXCJwb2lcIixcInBva1wiLFwicG9tXCIsXCJwb25cIixcInBvb1wiLFwicG9wXCIsXCJwb3FcIixcInBvc1wiLFwicG90XCIsXCJwb3ZcIixcInBvd1wiLFwicG94XCIsXCJwb3lcIixcInBvelwiLFwicHBhXCIsXCJwcGVcIixcInBwaVwiLFwicHBrXCIsXCJwcGxcIixcInBwbVwiLFwicHBuXCIsXCJwcG9cIixcInBwcFwiLFwicHBxXCIsXCJwcHJcIixcInBwc1wiLFwicHB0XCIsXCJwcHVcIixcInBxYVwiLFwicHFlXCIsXCJwcW1cIixcInBxd1wiLFwicHJhXCIsXCJwcmJcIixcInByY1wiLFwicHJkXCIsXCJwcmVcIixcInByZlwiLFwicHJnXCIsXCJwcmhcIixcInByaVwiLFwicHJrXCIsXCJwcmxcIixcInBybVwiLFwicHJuXCIsXCJwcm9cIixcInBycFwiLFwicHJxXCIsXCJwcnJcIixcInByc1wiLFwicHJ0XCIsXCJwcnVcIixcInByd1wiLFwicHJ4XCIsXCJwcnlcIixcInByelwiLFwicHNhXCIsXCJwc2NcIixcInBzZFwiLFwicHNlXCIsXCJwc2dcIixcInBzaFwiLFwicHNpXCIsXCJwc2xcIixcInBzbVwiLFwicHNuXCIsXCJwc29cIixcInBzcFwiLFwicHNxXCIsXCJwc3JcIixcInBzc1wiLFwicHN0XCIsXCJwc3VcIixcInBzd1wiLFwicHN5XCIsXCJwdGFcIixcInB0aFwiLFwicHRpXCIsXCJwdG5cIixcInB0b1wiLFwicHRwXCIsXCJwdHFcIixcInB0clwiLFwicHR0XCIsXCJwdHVcIixcInB0dlwiLFwicHR3XCIsXCJwdHlcIixcInB1YVwiLFwicHViXCIsXCJwdWNcIixcInB1ZFwiLFwicHVlXCIsXCJwdWZcIixcInB1Z1wiLFwicHVpXCIsXCJwdWpcIixcInB1a1wiLFwicHVtXCIsXCJwdW9cIixcInB1cFwiLFwicHVxXCIsXCJwdXJcIixcInB1dFwiLFwicHV1XCIsXCJwdXdcIixcInB1eFwiLFwicHV5XCIsXCJwdXpcIixcInB3YVwiLFwicHdiXCIsXCJwd2dcIixcInB3aVwiLFwicHdtXCIsXCJwd25cIixcInB3b1wiLFwicHdyXCIsXCJwd3dcIixcInB4bVwiLFwicHllXCIsXCJweW1cIixcInB5blwiLFwicHlzXCIsXCJweXVcIixcInB5eFwiLFwicHl5XCIsXCJwem5cIixcInFhYS4ucXR6XCIsXCJxdWFcIixcInF1YlwiLFwicXVjXCIsXCJxdWRcIixcInF1ZlwiLFwicXVnXCIsXCJxdWhcIixcInF1aVwiLFwicXVrXCIsXCJxdWxcIixcInF1bVwiLFwicXVuXCIsXCJxdXBcIixcInF1cVwiLFwicXVyXCIsXCJxdXNcIixcInF1dlwiLFwicXV3XCIsXCJxdXhcIixcInF1eVwiLFwicXV6XCIsXCJxdmFcIixcInF2Y1wiLFwicXZlXCIsXCJxdmhcIixcInF2aVwiLFwicXZqXCIsXCJxdmxcIixcInF2bVwiLFwicXZuXCIsXCJxdm9cIixcInF2cFwiLFwicXZzXCIsXCJxdndcIixcInF2eVwiLFwicXZ6XCIsXCJxd2FcIixcInF3Y1wiLFwicXdlXCIsXCJxd2hcIixcInF3bVwiLFwicXdzXCIsXCJxd3RcIixcInF4YVwiLFwicXhjXCIsXCJxeGhcIixcInF4bFwiLFwicXhuXCIsXCJxeG9cIixcInF4cFwiLFwicXhxXCIsXCJxeHJcIixcInF4c1wiLFwicXh0XCIsXCJxeHVcIixcInF4d1wiLFwicXlhXCIsXCJxeXBcIixcInJhYVwiLFwicmFiXCIsXCJyYWNcIixcInJhZFwiLFwicmFmXCIsXCJyYWdcIixcInJhaFwiLFwicmFpXCIsXCJyYWpcIixcInJha1wiLFwicmFsXCIsXCJyYW1cIixcInJhblwiLFwicmFvXCIsXCJyYXBcIixcInJhcVwiLFwicmFyXCIsXCJyYXNcIixcInJhdFwiLFwicmF1XCIsXCJyYXZcIixcInJhd1wiLFwicmF4XCIsXCJyYXlcIixcInJhelwiLFwicmJiXCIsXCJyYmtcIixcInJibFwiLFwicmJwXCIsXCJyY2ZcIixcInJkYlwiLFwicmVhXCIsXCJyZWJcIixcInJlZVwiLFwicmVnXCIsXCJyZWlcIixcInJlalwiLFwicmVsXCIsXCJyZW1cIixcInJlblwiLFwicmVyXCIsXCJyZXNcIixcInJldFwiLFwicmV5XCIsXCJyZ2FcIixcInJnZVwiLFwicmdrXCIsXCJyZ25cIixcInJnclwiLFwicmdzXCIsXCJyZ3VcIixcInJoZ1wiLFwicmhwXCIsXCJyaWFcIixcInJpZVwiLFwicmlmXCIsXCJyaWxcIixcInJpbVwiLFwicmluXCIsXCJyaXJcIixcInJpdFwiLFwicml1XCIsXCJyamdcIixcInJqaVwiLFwicmpzXCIsXCJya2FcIixcInJrYlwiLFwicmtoXCIsXCJya2lcIixcInJrbVwiLFwicmt0XCIsXCJya3dcIixcInJtYVwiLFwicm1iXCIsXCJybWNcIixcInJtZFwiLFwicm1lXCIsXCJybWZcIixcInJtZ1wiLFwicm1oXCIsXCJybWlcIixcInJta1wiLFwicm1sXCIsXCJybW1cIixcInJtblwiLFwicm1vXCIsXCJybXBcIixcInJtcVwiLFwicm1yXCIsXCJybXNcIixcInJtdFwiLFwicm11XCIsXCJybXZcIixcInJtd1wiLFwicm14XCIsXCJybXlcIixcInJtelwiLFwicm5hXCIsXCJybmRcIixcInJuZ1wiLFwicm5sXCIsXCJybm5cIixcInJucFwiLFwicm5yXCIsXCJybndcIixcInJvYVwiLFwicm9iXCIsXCJyb2NcIixcInJvZFwiLFwicm9lXCIsXCJyb2ZcIixcInJvZ1wiLFwicm9sXCIsXCJyb21cIixcInJvb1wiLFwicm9wXCIsXCJyb3JcIixcInJvdVwiLFwicm93XCIsXCJycG5cIixcInJwdFwiLFwicnJpXCIsXCJycm9cIixcInJydFwiLFwicnNiXCIsXCJyc2lcIixcInJzbFwiLFwicnNtXCIsXCJydGNcIixcInJ0aFwiLFwicnRtXCIsXCJydHNcIixcInJ0d1wiLFwicnViXCIsXCJydWNcIixcInJ1ZVwiLFwicnVmXCIsXCJydWdcIixcInJ1aFwiLFwicnVpXCIsXCJydWtcIixcInJ1b1wiLFwicnVwXCIsXCJydXFcIixcInJ1dFwiLFwicnV1XCIsXCJydXlcIixcInJ1elwiLFwicndhXCIsXCJyd2tcIixcInJ3bVwiLFwicndvXCIsXCJyd3JcIixcInJ4ZFwiLFwicnh3XCIsXCJyeW5cIixcInJ5c1wiLFwicnl1XCIsXCJyemhcIixcInNhYVwiLFwic2FiXCIsXCJzYWNcIixcInNhZFwiLFwic2FlXCIsXCJzYWZcIixcInNhaFwiLFwic2FpXCIsXCJzYWpcIixcInNha1wiLFwic2FsXCIsXCJzYW1cIixcInNhb1wiLFwic2FwXCIsXCJzYXFcIixcInNhclwiLFwic2FzXCIsXCJzYXRcIixcInNhdVwiLFwic2F2XCIsXCJzYXdcIixcInNheFwiLFwic2F5XCIsXCJzYXpcIixcInNiYVwiLFwic2JiXCIsXCJzYmNcIixcInNiZFwiLFwic2JlXCIsXCJzYmZcIixcInNiZ1wiLFwic2JoXCIsXCJzYmlcIixcInNialwiLFwic2JrXCIsXCJzYmxcIixcInNibVwiLFwic2JuXCIsXCJzYm9cIixcInNicFwiLFwic2JxXCIsXCJzYnJcIixcInNic1wiLFwic2J0XCIsXCJzYnVcIixcInNidlwiLFwic2J3XCIsXCJzYnhcIixcInNieVwiLFwic2J6XCIsXCJzY2FcIixcInNjYlwiLFwic2NlXCIsXCJzY2ZcIixcInNjZ1wiLFwic2NoXCIsXCJzY2lcIixcInNja1wiLFwic2NsXCIsXCJzY25cIixcInNjb1wiLFwic2NwXCIsXCJzY3FcIixcInNjc1wiLFwic2N0XCIsXCJzY3VcIixcInNjdlwiLFwic2N3XCIsXCJzY3hcIixcInNkYVwiLFwic2RiXCIsXCJzZGNcIixcInNkZVwiLFwic2RmXCIsXCJzZGdcIixcInNkaFwiLFwic2RqXCIsXCJzZGtcIixcInNkbFwiLFwic2RtXCIsXCJzZG5cIixcInNkb1wiLFwic2RwXCIsXCJzZHJcIixcInNkc1wiLFwic2R0XCIsXCJzZHVcIixcInNkdlwiLFwic2R4XCIsXCJzZHpcIixcInNlYVwiLFwic2ViXCIsXCJzZWNcIixcInNlZFwiLFwic2VlXCIsXCJzZWZcIixcInNlZ1wiLFwic2VoXCIsXCJzZWlcIixcInNlalwiLFwic2VrXCIsXCJzZWxcIixcInNlbVwiLFwic2VuXCIsXCJzZW9cIixcInNlcFwiLFwic2VxXCIsXCJzZXJcIixcInNlc1wiLFwic2V0XCIsXCJzZXVcIixcInNldlwiLFwic2V3XCIsXCJzZXlcIixcInNlelwiLFwic2ZiXCIsXCJzZmVcIixcInNmbVwiLFwic2ZzXCIsXCJzZndcIixcInNnYVwiLFwic2diXCIsXCJzZ2NcIixcInNnZFwiLFwic2dlXCIsXCJzZ2dcIixcInNnaFwiLFwic2dpXCIsXCJzZ2pcIixcInNna1wiLFwic2dsXCIsXCJzZ21cIixcInNnblwiLFwic2dvXCIsXCJzZ3BcIixcInNnclwiLFwic2dzXCIsXCJzZ3RcIixcInNndVwiLFwic2d3XCIsXCJzZ3hcIixcInNneVwiLFwic2d6XCIsXCJzaGFcIixcInNoYlwiLFwic2hjXCIsXCJzaGRcIixcInNoZVwiLFwic2hnXCIsXCJzaGhcIixcInNoaVwiLFwic2hqXCIsXCJzaGtcIixcInNobFwiLFwic2htXCIsXCJzaG5cIixcInNob1wiLFwic2hwXCIsXCJzaHFcIixcInNoclwiLFwic2hzXCIsXCJzaHRcIixcInNodVwiLFwic2h2XCIsXCJzaHdcIixcInNoeFwiLFwic2h5XCIsXCJzaHpcIixcInNpYVwiLFwic2liXCIsXCJzaWRcIixcInNpZVwiLFwic2lmXCIsXCJzaWdcIixcInNpaFwiLFwic2lpXCIsXCJzaWpcIixcInNpa1wiLFwic2lsXCIsXCJzaW1cIixcInNpb1wiLFwic2lwXCIsXCJzaXFcIixcInNpclwiLFwic2lzXCIsXCJzaXRcIixcInNpdVwiLFwic2l2XCIsXCJzaXdcIixcInNpeFwiLFwic2l5XCIsXCJzaXpcIixcInNqYVwiLFwic2piXCIsXCJzamRcIixcInNqZVwiLFwic2pnXCIsXCJzamtcIixcInNqbFwiLFwic2ptXCIsXCJzam5cIixcInNqb1wiLFwic2pwXCIsXCJzanJcIixcInNqc1wiLFwic2p0XCIsXCJzanVcIixcInNqd1wiLFwic2thXCIsXCJza2JcIixcInNrY1wiLFwic2tkXCIsXCJza2VcIixcInNrZlwiLFwic2tnXCIsXCJza2hcIixcInNraVwiLFwic2tqXCIsXCJza2tcIixcInNrbVwiLFwic2tuXCIsXCJza29cIixcInNrcFwiLFwic2txXCIsXCJza3JcIixcInNrc1wiLFwic2t0XCIsXCJza3VcIixcInNrdlwiLFwic2t3XCIsXCJza3hcIixcInNreVwiLFwic2t6XCIsXCJzbGFcIixcInNsY1wiLFwic2xkXCIsXCJzbGVcIixcInNsZlwiLFwic2xnXCIsXCJzbGhcIixcInNsaVwiLFwic2xqXCIsXCJzbGxcIixcInNsbVwiLFwic2xuXCIsXCJzbHBcIixcInNscVwiLFwic2xyXCIsXCJzbHNcIixcInNsdFwiLFwic2x1XCIsXCJzbHdcIixcInNseFwiLFwic2x5XCIsXCJzbHpcIixcInNtYVwiLFwic21iXCIsXCJzbWNcIixcInNtZFwiLFwic21mXCIsXCJzbWdcIixcInNtaFwiLFwic21pXCIsXCJzbWpcIixcInNta1wiLFwic21sXCIsXCJzbW1cIixcInNtblwiLFwic21wXCIsXCJzbXFcIixcInNtclwiLFwic21zXCIsXCJzbXRcIixcInNtdVwiLFwic212XCIsXCJzbXdcIixcInNteFwiLFwic215XCIsXCJzbXpcIixcInNuYlwiLFwic25jXCIsXCJzbmVcIixcInNuZlwiLFwic25nXCIsXCJzbmhcIixcInNuaVwiLFwic25qXCIsXCJzbmtcIixcInNubFwiLFwic25tXCIsXCJzbm5cIixcInNub1wiLFwic25wXCIsXCJzbnFcIixcInNuclwiLFwic25zXCIsXCJzbnVcIixcInNudlwiLFwic253XCIsXCJzbnhcIixcInNueVwiLFwic256XCIsXCJzb2FcIixcInNvYlwiLFwic29jXCIsXCJzb2RcIixcInNvZVwiLFwic29nXCIsXCJzb2hcIixcInNvaVwiLFwic29qXCIsXCJzb2tcIixcInNvbFwiLFwic29uXCIsXCJzb29cIixcInNvcFwiLFwic29xXCIsXCJzb3JcIixcInNvc1wiLFwic291XCIsXCJzb3ZcIixcInNvd1wiLFwic294XCIsXCJzb3lcIixcInNvelwiLFwic3BiXCIsXCJzcGNcIixcInNwZFwiLFwic3BlXCIsXCJzcGdcIixcInNwaVwiLFwic3BrXCIsXCJzcGxcIixcInNwbVwiLFwic3BuXCIsXCJzcG9cIixcInNwcFwiLFwic3BxXCIsXCJzcHJcIixcInNwc1wiLFwic3B0XCIsXCJzcHVcIixcInNwdlwiLFwic3B4XCIsXCJzcHlcIixcInNxYVwiLFwic3FoXCIsXCJzcWpcIixcInNxa1wiLFwic3FtXCIsXCJzcW5cIixcInNxb1wiLFwic3FxXCIsXCJzcXJcIixcInNxc1wiLFwic3F0XCIsXCJzcXVcIixcInNyYVwiLFwic3JiXCIsXCJzcmNcIixcInNyZVwiLFwic3JmXCIsXCJzcmdcIixcInNyaFwiLFwic3JpXCIsXCJzcmtcIixcInNybFwiLFwic3JtXCIsXCJzcm5cIixcInNyb1wiLFwic3JxXCIsXCJzcnJcIixcInNyc1wiLFwic3J0XCIsXCJzcnVcIixcInNydlwiLFwic3J3XCIsXCJzcnhcIixcInNyeVwiLFwic3J6XCIsXCJzc2FcIixcInNzYlwiLFwic3NjXCIsXCJzc2RcIixcInNzZVwiLFwic3NmXCIsXCJzc2dcIixcInNzaFwiLFwic3NpXCIsXCJzc2pcIixcInNza1wiLFwic3NsXCIsXCJzc21cIixcInNzblwiLFwic3NvXCIsXCJzc3BcIixcInNzcVwiLFwic3NyXCIsXCJzc3NcIixcInNzdFwiLFwic3N1XCIsXCJzc3ZcIixcInNzeFwiLFwic3N5XCIsXCJzc3pcIixcInN0YVwiLFwic3RiXCIsXCJzdGRcIixcInN0ZVwiLFwic3RmXCIsXCJzdGdcIixcInN0aFwiLFwic3RpXCIsXCJzdGpcIixcInN0a1wiLFwic3RsXCIsXCJzdG1cIixcInN0blwiLFwic3RvXCIsXCJzdHBcIixcInN0cVwiLFwic3RyXCIsXCJzdHNcIixcInN0dFwiLFwic3R1XCIsXCJzdHZcIixcInN0d1wiLFwic3R5XCIsXCJzdWFcIixcInN1YlwiLFwic3VjXCIsXCJzdWVcIixcInN1Z1wiLFwic3VpXCIsXCJzdWpcIixcInN1a1wiLFwic3VsXCIsXCJzdW1cIixcInN1cVwiLFwic3VyXCIsXCJzdXNcIixcInN1dFwiLFwic3V2XCIsXCJzdXdcIixcInN1eFwiLFwic3V5XCIsXCJzdXpcIixcInN2YVwiLFwic3ZiXCIsXCJzdmNcIixcInN2ZVwiLFwic3ZrXCIsXCJzdm1cIixcInN2clwiLFwic3ZzXCIsXCJzdnhcIixcInN3YlwiLFwic3djXCIsXCJzd2ZcIixcInN3Z1wiLFwic3doXCIsXCJzd2lcIixcInN3alwiLFwic3drXCIsXCJzd2xcIixcInN3bVwiLFwic3duXCIsXCJzd29cIixcInN3cFwiLFwic3dxXCIsXCJzd3JcIixcInN3c1wiLFwic3d0XCIsXCJzd3VcIixcInN3dlwiLFwic3d3XCIsXCJzd3hcIixcInN3eVwiLFwic3hiXCIsXCJzeGNcIixcInN4ZVwiLFwic3hnXCIsXCJzeGtcIixcInN4bFwiLFwic3htXCIsXCJzeG5cIixcInN4b1wiLFwic3hyXCIsXCJzeHNcIixcInN4dVwiLFwic3h3XCIsXCJzeWFcIixcInN5YlwiLFwic3ljXCIsXCJzeWRcIixcInN5aVwiLFwic3lrXCIsXCJzeWxcIixcInN5bVwiLFwic3luXCIsXCJzeW9cIixcInN5clwiLFwic3lzXCIsXCJzeXdcIixcInN5eFwiLFwic3l5XCIsXCJzemFcIixcInN6YlwiLFwic3pjXCIsXCJzemRcIixcInN6ZVwiLFwic3pnXCIsXCJzemxcIixcInN6blwiLFwic3pwXCIsXCJzenNcIixcInN6dlwiLFwic3p3XCIsXCJ0YWFcIixcInRhYlwiLFwidGFjXCIsXCJ0YWRcIixcInRhZVwiLFwidGFmXCIsXCJ0YWdcIixcInRhaVwiLFwidGFqXCIsXCJ0YWtcIixcInRhbFwiLFwidGFuXCIsXCJ0YW9cIixcInRhcFwiLFwidGFxXCIsXCJ0YXJcIixcInRhc1wiLFwidGF1XCIsXCJ0YXZcIixcInRhd1wiLFwidGF4XCIsXCJ0YXlcIixcInRhelwiLFwidGJhXCIsXCJ0YmJcIixcInRiY1wiLFwidGJkXCIsXCJ0YmVcIixcInRiZlwiLFwidGJnXCIsXCJ0YmhcIixcInRiaVwiLFwidGJqXCIsXCJ0YmtcIixcInRibFwiLFwidGJtXCIsXCJ0Ym5cIixcInRib1wiLFwidGJwXCIsXCJ0YnFcIixcInRiclwiLFwidGJzXCIsXCJ0YnRcIixcInRidVwiLFwidGJ2XCIsXCJ0YndcIixcInRieFwiLFwidGJ5XCIsXCJ0YnpcIixcInRjYVwiLFwidGNiXCIsXCJ0Y2NcIixcInRjZFwiLFwidGNlXCIsXCJ0Y2ZcIixcInRjZ1wiLFwidGNoXCIsXCJ0Y2lcIixcInRja1wiLFwidGNsXCIsXCJ0Y21cIixcInRjblwiLFwidGNvXCIsXCJ0Y3BcIixcInRjcVwiLFwidGNzXCIsXCJ0Y3RcIixcInRjdVwiLFwidGN3XCIsXCJ0Y3hcIixcInRjeVwiLFwidGN6XCIsXCJ0ZGFcIixcInRkYlwiLFwidGRjXCIsXCJ0ZGRcIixcInRkZVwiLFwidGRmXCIsXCJ0ZGdcIixcInRkaFwiLFwidGRpXCIsXCJ0ZGpcIixcInRka1wiLFwidGRsXCIsXCJ0ZG1cIixcInRkblwiLFwidGRvXCIsXCJ0ZHFcIixcInRkclwiLFwidGRzXCIsXCJ0ZHRcIixcInRkdVwiLFwidGR2XCIsXCJ0ZHhcIixcInRkeVwiLFwidGVhXCIsXCJ0ZWJcIixcInRlY1wiLFwidGVkXCIsXCJ0ZWVcIixcInRlZlwiLFwidGVnXCIsXCJ0ZWhcIixcInRlaVwiLFwidGVrXCIsXCJ0ZW1cIixcInRlblwiLFwidGVvXCIsXCJ0ZXBcIixcInRlcVwiLFwidGVyXCIsXCJ0ZXNcIixcInRldFwiLFwidGV1XCIsXCJ0ZXZcIixcInRld1wiLFwidGV4XCIsXCJ0ZXlcIixcInRmaVwiLFwidGZuXCIsXCJ0Zm9cIixcInRmclwiLFwidGZ0XCIsXCJ0Z2FcIixcInRnYlwiLFwidGdjXCIsXCJ0Z2RcIixcInRnZVwiLFwidGdmXCIsXCJ0Z2dcIixcInRnaFwiLFwidGdpXCIsXCJ0Z2pcIixcInRnblwiLFwidGdvXCIsXCJ0Z3BcIixcInRncVwiLFwidGdyXCIsXCJ0Z3NcIixcInRndFwiLFwidGd1XCIsXCJ0Z3ZcIixcInRnd1wiLFwidGd4XCIsXCJ0Z3lcIixcInRnelwiLFwidGhjXCIsXCJ0aGRcIixcInRoZVwiLFwidGhmXCIsXCJ0aGhcIixcInRoaVwiLFwidGhrXCIsXCJ0aGxcIixcInRobVwiLFwidGhuXCIsXCJ0aHBcIixcInRocVwiLFwidGhyXCIsXCJ0aHNcIixcInRodFwiLFwidGh1XCIsXCJ0aHZcIixcInRod1wiLFwidGh4XCIsXCJ0aHlcIixcInRoelwiLFwidGlhXCIsXCJ0aWNcIixcInRpZFwiLFwidGllXCIsXCJ0aWZcIixcInRpZ1wiLFwidGloXCIsXCJ0aWlcIixcInRpalwiLFwidGlrXCIsXCJ0aWxcIixcInRpbVwiLFwidGluXCIsXCJ0aW9cIixcInRpcFwiLFwidGlxXCIsXCJ0aXNcIixcInRpdFwiLFwidGl1XCIsXCJ0aXZcIixcInRpd1wiLFwidGl4XCIsXCJ0aXlcIixcInRpelwiLFwidGphXCIsXCJ0amdcIixcInRqaVwiLFwidGpsXCIsXCJ0am1cIixcInRqblwiLFwidGpvXCIsXCJ0anNcIixcInRqdVwiLFwidGp3XCIsXCJ0a2FcIixcInRrYlwiLFwidGtkXCIsXCJ0a2VcIixcInRrZlwiLFwidGtnXCIsXCJ0a2tcIixcInRrbFwiLFwidGttXCIsXCJ0a25cIixcInRrcFwiLFwidGtxXCIsXCJ0a3JcIixcInRrc1wiLFwidGt0XCIsXCJ0a3VcIixcInRrdlwiLFwidGt3XCIsXCJ0a3hcIixcInRrelwiLFwidGxhXCIsXCJ0bGJcIixcInRsY1wiLFwidGxkXCIsXCJ0bGZcIixcInRsZ1wiLFwidGxoXCIsXCJ0bGlcIixcInRsalwiLFwidGxrXCIsXCJ0bGxcIixcInRsbVwiLFwidGxuXCIsXCJ0bG9cIixcInRscFwiLFwidGxxXCIsXCJ0bHJcIixcInRsc1wiLFwidGx0XCIsXCJ0bHVcIixcInRsdlwiLFwidGx3XCIsXCJ0bHhcIixcInRseVwiLFwidG1hXCIsXCJ0bWJcIixcInRtY1wiLFwidG1kXCIsXCJ0bWVcIixcInRtZlwiLFwidG1nXCIsXCJ0bWhcIixcInRtaVwiLFwidG1qXCIsXCJ0bWtcIixcInRtbFwiLFwidG1tXCIsXCJ0bW5cIixcInRtb1wiLFwidG1wXCIsXCJ0bXFcIixcInRtclwiLFwidG1zXCIsXCJ0bXRcIixcInRtdVwiLFwidG12XCIsXCJ0bXdcIixcInRteVwiLFwidG16XCIsXCJ0bmFcIixcInRuYlwiLFwidG5jXCIsXCJ0bmRcIixcInRuZVwiLFwidG5mXCIsXCJ0bmdcIixcInRuaFwiLFwidG5pXCIsXCJ0bmtcIixcInRubFwiLFwidG5tXCIsXCJ0bm5cIixcInRub1wiLFwidG5wXCIsXCJ0bnFcIixcInRuclwiLFwidG5zXCIsXCJ0bnRcIixcInRudVwiLFwidG52XCIsXCJ0bndcIixcInRueFwiLFwidG55XCIsXCJ0bnpcIixcInRvYlwiLFwidG9jXCIsXCJ0b2RcIixcInRvZVwiLFwidG9mXCIsXCJ0b2dcIixcInRvaFwiLFwidG9pXCIsXCJ0b2pcIixcInRvbFwiLFwidG9tXCIsXCJ0b29cIixcInRvcFwiLFwidG9xXCIsXCJ0b3JcIixcInRvc1wiLFwidG91XCIsXCJ0b3ZcIixcInRvd1wiLFwidG94XCIsXCJ0b3lcIixcInRvelwiLFwidHBhXCIsXCJ0cGNcIixcInRwZVwiLFwidHBmXCIsXCJ0cGdcIixcInRwaVwiLFwidHBqXCIsXCJ0cGtcIixcInRwbFwiLFwidHBtXCIsXCJ0cG5cIixcInRwb1wiLFwidHBwXCIsXCJ0cHFcIixcInRwclwiLFwidHB0XCIsXCJ0cHVcIixcInRwdlwiLFwidHB3XCIsXCJ0cHhcIixcInRweVwiLFwidHB6XCIsXCJ0cWJcIixcInRxbFwiLFwidHFtXCIsXCJ0cW5cIixcInRxb1wiLFwidHFwXCIsXCJ0cXFcIixcInRxclwiLFwidHF0XCIsXCJ0cXVcIixcInRxd1wiLFwidHJhXCIsXCJ0cmJcIixcInRyY1wiLFwidHJkXCIsXCJ0cmVcIixcInRyZlwiLFwidHJnXCIsXCJ0cmhcIixcInRyaVwiLFwidHJqXCIsXCJ0cmtcIixcInRybFwiLFwidHJtXCIsXCJ0cm5cIixcInRyb1wiLFwidHJwXCIsXCJ0cnFcIixcInRyclwiLFwidHJzXCIsXCJ0cnRcIixcInRydVwiLFwidHJ2XCIsXCJ0cndcIixcInRyeFwiLFwidHJ5XCIsXCJ0cnpcIixcInRzYVwiLFwidHNiXCIsXCJ0c2NcIixcInRzZFwiLFwidHNlXCIsXCJ0c2ZcIixcInRzZ1wiLFwidHNoXCIsXCJ0c2lcIixcInRzalwiLFwidHNrXCIsXCJ0c2xcIixcInRzbVwiLFwidHNwXCIsXCJ0c3FcIixcInRzclwiLFwidHNzXCIsXCJ0c3RcIixcInRzdVwiLFwidHN2XCIsXCJ0c3dcIixcInRzeFwiLFwidHN5XCIsXCJ0c3pcIixcInR0YVwiLFwidHRiXCIsXCJ0dGNcIixcInR0ZFwiLFwidHRlXCIsXCJ0dGZcIixcInR0Z1wiLFwidHRoXCIsXCJ0dGlcIixcInR0alwiLFwidHRrXCIsXCJ0dGxcIixcInR0bVwiLFwidHRuXCIsXCJ0dG9cIixcInR0cFwiLFwidHRxXCIsXCJ0dHJcIixcInR0c1wiLFwidHR0XCIsXCJ0dHVcIixcInR0dlwiLFwidHR3XCIsXCJ0dHlcIixcInR0elwiLFwidHVhXCIsXCJ0dWJcIixcInR1Y1wiLFwidHVkXCIsXCJ0dWVcIixcInR1ZlwiLFwidHVnXCIsXCJ0dWhcIixcInR1aVwiLFwidHVqXCIsXCJ0dWxcIixcInR1bVwiLFwidHVuXCIsXCJ0dW9cIixcInR1cFwiLFwidHVxXCIsXCJ0dXNcIixcInR1dFwiLFwidHV1XCIsXCJ0dXZcIixcInR1d1wiLFwidHV4XCIsXCJ0dXlcIixcInR1elwiLFwidHZhXCIsXCJ0dmRcIixcInR2ZVwiLFwidHZrXCIsXCJ0dmxcIixcInR2bVwiLFwidHZuXCIsXCJ0dm9cIixcInR2c1wiLFwidHZ0XCIsXCJ0dnVcIixcInR2d1wiLFwidHZ5XCIsXCJ0d2FcIixcInR3YlwiLFwidHdjXCIsXCJ0d2RcIixcInR3ZVwiLFwidHdmXCIsXCJ0d2dcIixcInR3aFwiLFwidHdsXCIsXCJ0d21cIixcInR3blwiLFwidHdvXCIsXCJ0d3BcIixcInR3cVwiLFwidHdyXCIsXCJ0d3RcIixcInR3dVwiLFwidHd3XCIsXCJ0d3hcIixcInR3eVwiLFwidHhhXCIsXCJ0eGJcIixcInR4Y1wiLFwidHhlXCIsXCJ0eGdcIixcInR4aFwiLFwidHhpXCIsXCJ0eGpcIixcInR4bVwiLFwidHhuXCIsXCJ0eG9cIixcInR4cVwiLFwidHhyXCIsXCJ0eHNcIixcInR4dFwiLFwidHh1XCIsXCJ0eHhcIixcInR4eVwiLFwidHlhXCIsXCJ0eWVcIixcInR5aFwiLFwidHlpXCIsXCJ0eWpcIixcInR5bFwiLFwidHluXCIsXCJ0eXBcIixcInR5clwiLFwidHlzXCIsXCJ0eXRcIixcInR5dVwiLFwidHl2XCIsXCJ0eXhcIixcInR5elwiLFwidHphXCIsXCJ0emhcIixcInR6alwiLFwidHpsXCIsXCJ0em1cIixcInR6blwiLFwidHpvXCIsXCJ0enhcIixcInVhbVwiLFwidWFuXCIsXCJ1YXJcIixcInViYVwiLFwidWJpXCIsXCJ1YmxcIixcInViclwiLFwidWJ1XCIsXCJ1YnlcIixcInVkYVwiLFwidWRlXCIsXCJ1ZGdcIixcInVkaVwiLFwidWRqXCIsXCJ1ZGxcIixcInVkbVwiLFwidWR1XCIsXCJ1ZXNcIixcInVmaVwiLFwidWdhXCIsXCJ1Z2JcIixcInVnZVwiLFwidWduXCIsXCJ1Z29cIixcInVneVwiLFwidWhhXCIsXCJ1aG5cIixcInVpc1wiLFwidWl2XCIsXCJ1amlcIixcInVrYVwiLFwidWtnXCIsXCJ1a2hcIixcInVra1wiLFwidWtsXCIsXCJ1a3BcIixcInVrcVwiLFwidWtzXCIsXCJ1a3VcIixcInVrd1wiLFwidWt5XCIsXCJ1bGFcIixcInVsYlwiLFwidWxjXCIsXCJ1bGVcIixcInVsZlwiLFwidWxpXCIsXCJ1bGtcIixcInVsbFwiLFwidWxtXCIsXCJ1bG5cIixcInVsdVwiLFwidWx3XCIsXCJ1bWFcIixcInVtYlwiLFwidW1jXCIsXCJ1bWRcIixcInVtZ1wiLFwidW1pXCIsXCJ1bW1cIixcInVtblwiLFwidW1vXCIsXCJ1bXBcIixcInVtclwiLFwidW1zXCIsXCJ1bXVcIixcInVuYVwiLFwidW5kXCIsXCJ1bmVcIixcInVuZ1wiLFwidW5rXCIsXCJ1bm1cIixcInVublwiLFwidW5wXCIsXCJ1bnJcIixcInVudVwiLFwidW54XCIsXCJ1bnpcIixcInVva1wiLFwidXBpXCIsXCJ1cHZcIixcInVyYVwiLFwidXJiXCIsXCJ1cmNcIixcInVyZVwiLFwidXJmXCIsXCJ1cmdcIixcInVyaFwiLFwidXJpXCIsXCJ1cmpcIixcInVya1wiLFwidXJsXCIsXCJ1cm1cIixcInVyblwiLFwidXJvXCIsXCJ1cnBcIixcInVyclwiLFwidXJ0XCIsXCJ1cnVcIixcInVydlwiLFwidXJ3XCIsXCJ1cnhcIixcInVyeVwiLFwidXJ6XCIsXCJ1c2FcIixcInVzaFwiLFwidXNpXCIsXCJ1c2tcIixcInVzcFwiLFwidXN1XCIsXCJ1dGFcIixcInV0ZVwiLFwidXRwXCIsXCJ1dHJcIixcInV0dVwiLFwidXVtXCIsXCJ1dW5cIixcInV1clwiLFwidXV1XCIsXCJ1dmVcIixcInV2aFwiLFwidXZsXCIsXCJ1d2FcIixcInV5YVwiLFwidXpuXCIsXCJ1enNcIixcInZhYVwiLFwidmFlXCIsXCJ2YWZcIixcInZhZ1wiLFwidmFoXCIsXCJ2YWlcIixcInZhalwiLFwidmFsXCIsXCJ2YW1cIixcInZhblwiLFwidmFvXCIsXCJ2YXBcIixcInZhclwiLFwidmFzXCIsXCJ2YXVcIixcInZhdlwiLFwidmF5XCIsXCJ2YmJcIixcInZia1wiLFwidmVjXCIsXCJ2ZWRcIixcInZlbFwiLFwidmVtXCIsXCJ2ZW9cIixcInZlcFwiLFwidmVyXCIsXCJ2Z3JcIixcInZndFwiLFwidmljXCIsXCJ2aWRcIixcInZpZlwiLFwidmlnXCIsXCJ2aWxcIixcInZpblwiLFwidmlzXCIsXCJ2aXRcIixcInZpdlwiLFwidmthXCIsXCJ2a2lcIixcInZralwiLFwidmtrXCIsXCJ2a2xcIixcInZrbVwiLFwidmtvXCIsXCJ2a3BcIixcInZrdFwiLFwidmt1XCIsXCJ2bHBcIixcInZsc1wiLFwidm1hXCIsXCJ2bWJcIixcInZtY1wiLFwidm1kXCIsXCJ2bWVcIixcInZtZlwiLFwidm1nXCIsXCJ2bWhcIixcInZtaVwiLFwidm1qXCIsXCJ2bWtcIixcInZtbFwiLFwidm1tXCIsXCJ2bXBcIixcInZtcVwiLFwidm1yXCIsXCJ2bXNcIixcInZtdVwiLFwidm12XCIsXCJ2bXdcIixcInZteFwiLFwidm15XCIsXCJ2bXpcIixcInZua1wiLFwidm5tXCIsXCJ2bnBcIixcInZvclwiLFwidm90XCIsXCJ2cmFcIixcInZyb1wiLFwidnJzXCIsXCJ2cnRcIixcInZzaVwiLFwidnNsXCIsXCJ2c3ZcIixcInZ0b1wiLFwidnVtXCIsXCJ2dW5cIixcInZ1dFwiLFwidndhXCIsXCJ3YWFcIixcIndhYlwiLFwid2FjXCIsXCJ3YWRcIixcIndhZVwiLFwid2FmXCIsXCJ3YWdcIixcIndhaFwiLFwid2FpXCIsXCJ3YWpcIixcIndha1wiLFwid2FsXCIsXCJ3YW1cIixcIndhblwiLFwid2FvXCIsXCJ3YXBcIixcIndhcVwiLFwid2FyXCIsXCJ3YXNcIixcIndhdFwiLFwid2F1XCIsXCJ3YXZcIixcIndhd1wiLFwid2F4XCIsXCJ3YXlcIixcIndhelwiLFwid2JhXCIsXCJ3YmJcIixcIndiZVwiLFwid2JmXCIsXCJ3YmhcIixcIndiaVwiLFwid2JqXCIsXCJ3YmtcIixcIndibFwiLFwid2JtXCIsXCJ3YnBcIixcIndicVwiLFwid2JyXCIsXCJ3YnNcIixcIndidFwiLFwid2J2XCIsXCJ3YndcIixcIndjYVwiLFwid2NpXCIsXCJ3ZGRcIixcIndkZ1wiLFwid2RqXCIsXCJ3ZGtcIixcIndkdVwiLFwid2R5XCIsXCJ3ZWFcIixcIndlY1wiLFwid2VkXCIsXCJ3ZWdcIixcIndlaFwiLFwid2VpXCIsXCJ3ZW1cIixcIndlblwiLFwid2VvXCIsXCJ3ZXBcIixcIndlclwiLFwid2VzXCIsXCJ3ZXRcIixcIndldVwiLFwid2V3XCIsXCJ3ZmdcIixcIndnYVwiLFwid2diXCIsXCJ3Z2dcIixcIndnaVwiLFwid2dvXCIsXCJ3Z3VcIixcIndnd1wiLFwid2d5XCIsXCJ3aGFcIixcIndoZ1wiLFwid2hrXCIsXCJ3aHVcIixcIndpYlwiLFwid2ljXCIsXCJ3aWVcIixcIndpZlwiLFwid2lnXCIsXCJ3aWhcIixcIndpaVwiLFwid2lqXCIsXCJ3aWtcIixcIndpbFwiLFwid2ltXCIsXCJ3aW5cIixcIndpclwiLFwid2l0XCIsXCJ3aXVcIixcIndpdlwiLFwid2l3XCIsXCJ3aXlcIixcIndqYVwiLFwid2ppXCIsXCJ3a2FcIixcIndrYlwiLFwid2tkXCIsXCJ3a2xcIixcIndrdVwiLFwid2t3XCIsXCJ3a3lcIixcIndsYVwiLFwid2xjXCIsXCJ3bGVcIixcIndsZ1wiLFwid2xpXCIsXCJ3bGtcIixcIndsbFwiLFwid2xtXCIsXCJ3bG9cIixcIndsclwiLFwid2xzXCIsXCJ3bHVcIixcIndsdlwiLFwid2x3XCIsXCJ3bHhcIixcIndseVwiLFwid21hXCIsXCJ3bWJcIixcIndtY1wiLFwid21kXCIsXCJ3bWVcIixcIndtaFwiLFwid21pXCIsXCJ3bW1cIixcIndtblwiLFwid21vXCIsXCJ3bXNcIixcIndtdFwiLFwid213XCIsXCJ3bXhcIixcInduYlwiLFwid25jXCIsXCJ3bmRcIixcInduZVwiLFwid25nXCIsXCJ3bmlcIixcIndua1wiLFwid25tXCIsXCJ3bm5cIixcIndub1wiLFwid25wXCIsXCJ3bnVcIixcIndud1wiLFwid255XCIsXCJ3b2FcIixcIndvYlwiLFwid29jXCIsXCJ3b2RcIixcIndvZVwiLFwid29mXCIsXCJ3b2dcIixcIndvaVwiLFwid29rXCIsXCJ3b21cIixcIndvblwiLFwid29vXCIsXCJ3b3JcIixcIndvc1wiLFwid293XCIsXCJ3b3lcIixcIndwY1wiLFwid3JhXCIsXCJ3cmJcIixcIndyZFwiLFwid3JnXCIsXCJ3cmhcIixcIndyaVwiLFwid3JrXCIsXCJ3cmxcIixcIndybVwiLFwid3JuXCIsXCJ3cm9cIixcIndycFwiLFwid3JyXCIsXCJ3cnNcIixcIndydVwiLFwid3J2XCIsXCJ3cndcIixcIndyeFwiLFwid3J5XCIsXCJ3cnpcIixcIndzYVwiLFwid3NnXCIsXCJ3c2lcIixcIndza1wiLFwid3NyXCIsXCJ3c3NcIixcIndzdVwiLFwid3N2XCIsXCJ3dGZcIixcInd0aFwiLFwid3RpXCIsXCJ3dGtcIixcInd0bVwiLFwid3R3XCIsXCJ3dWFcIixcInd1YlwiLFwid3VkXCIsXCJ3dWhcIixcInd1bFwiLFwid3VtXCIsXCJ3dW5cIixcInd1clwiLFwid3V0XCIsXCJ3dXVcIixcInd1dlwiLFwid3V4XCIsXCJ3dXlcIixcInd3YVwiLFwid3diXCIsXCJ3d29cIixcInd3clwiLFwid3d3XCIsXCJ3eGFcIixcInd4d1wiLFwid3lhXCIsXCJ3eWJcIixcInd5aVwiLFwid3ltXCIsXCJ3eXJcIixcInd5eVwiLFwieGFhXCIsXCJ4YWJcIixcInhhY1wiLFwieGFkXCIsXCJ4YWVcIixcInhhZ1wiLFwieGFpXCIsXCJ4YWpcIixcInhha1wiLFwieGFsXCIsXCJ4YW1cIixcInhhblwiLFwieGFvXCIsXCJ4YXBcIixcInhhcVwiLFwieGFyXCIsXCJ4YXNcIixcInhhdFwiLFwieGF1XCIsXCJ4YXZcIixcInhhd1wiLFwieGF5XCIsXCJ4YmFcIixcInhiYlwiLFwieGJjXCIsXCJ4YmRcIixcInhiZVwiLFwieGJnXCIsXCJ4YmlcIixcInhialwiLFwieGJtXCIsXCJ4Ym5cIixcInhib1wiLFwieGJwXCIsXCJ4YnJcIixcInhid1wiLFwieGJ4XCIsXCJ4YnlcIixcInhjYlwiLFwieGNjXCIsXCJ4Y2VcIixcInhjZ1wiLFwieGNoXCIsXCJ4Y2xcIixcInhjbVwiLFwieGNuXCIsXCJ4Y29cIixcInhjclwiLFwieGN0XCIsXCJ4Y3VcIixcInhjdlwiLFwieGN3XCIsXCJ4Y3lcIixcInhkYVwiLFwieGRjXCIsXCJ4ZGtcIixcInhkbVwiLFwieGRvXCIsXCJ4ZHlcIixcInhlYlwiLFwieGVkXCIsXCJ4ZWdcIixcInhlbFwiLFwieGVtXCIsXCJ4ZXBcIixcInhlclwiLFwieGVzXCIsXCJ4ZXRcIixcInhldVwiLFwieGZhXCIsXCJ4Z2FcIixcInhnYlwiLFwieGdkXCIsXCJ4Z2ZcIixcInhnZ1wiLFwieGdpXCIsXCJ4Z2xcIixcInhnbVwiLFwieGduXCIsXCJ4Z3JcIixcInhndVwiLFwieGd3XCIsXCJ4aGFcIixcInhoY1wiLFwieGhkXCIsXCJ4aGVcIixcInhoclwiLFwieGh0XCIsXCJ4aHVcIixcInhodlwiLFwieGlhXCIsXCJ4aWJcIixcInhpaVwiLFwieGlsXCIsXCJ4aW5cIixcInhpcFwiLFwieGlyXCIsXCJ4aXNcIixcInhpdlwiLFwieGl5XCIsXCJ4amJcIixcInhqdFwiLFwieGthXCIsXCJ4a2JcIixcInhrY1wiLFwieGtkXCIsXCJ4a2VcIixcInhrZlwiLFwieGtnXCIsXCJ4a2hcIixcInhraVwiLFwieGtqXCIsXCJ4a2tcIixcInhrbFwiLFwieGtuXCIsXCJ4a29cIixcInhrcFwiLFwieGtxXCIsXCJ4a3JcIixcInhrc1wiLFwieGt0XCIsXCJ4a3VcIixcInhrdlwiLFwieGt3XCIsXCJ4a3hcIixcInhreVwiLFwieGt6XCIsXCJ4bGFcIixcInhsYlwiLFwieGxjXCIsXCJ4bGRcIixcInhsZVwiLFwieGxnXCIsXCJ4bGlcIixcInhsblwiLFwieGxvXCIsXCJ4bHBcIixcInhsc1wiLFwieGx1XCIsXCJ4bHlcIixcInhtYVwiLFwieG1iXCIsXCJ4bWNcIixcInhtZFwiLFwieG1lXCIsXCJ4bWZcIixcInhtZ1wiLFwieG1oXCIsXCJ4bWpcIixcInhta1wiLFwieG1sXCIsXCJ4bW1cIixcInhtblwiLFwieG1vXCIsXCJ4bXBcIixcInhtcVwiLFwieG1yXCIsXCJ4bXNcIixcInhtdFwiLFwieG11XCIsXCJ4bXZcIixcInhtd1wiLFwieG14XCIsXCJ4bXlcIixcInhtelwiLFwieG5hXCIsXCJ4bmJcIixcInhuZFwiLFwieG5nXCIsXCJ4bmhcIixcInhuaVwiLFwieG5rXCIsXCJ4bm5cIixcInhub1wiLFwieG5yXCIsXCJ4bnNcIixcInhudFwiLFwieG51XCIsXCJ4bnlcIixcInhuelwiLFwieG9jXCIsXCJ4b2RcIixcInhvZ1wiLFwieG9pXCIsXCJ4b2tcIixcInhvbVwiLFwieG9uXCIsXCJ4b29cIixcInhvcFwiLFwieG9yXCIsXCJ4b3dcIixcInhwYVwiLFwieHBjXCIsXCJ4cGVcIixcInhwZ1wiLFwieHBpXCIsXCJ4cGpcIixcInhwa1wiLFwieHBtXCIsXCJ4cG5cIixcInhwb1wiLFwieHBwXCIsXCJ4cHFcIixcInhwclwiLFwieHBzXCIsXCJ4cHRcIixcInhwdVwiLFwieHB5XCIsXCJ4cWFcIixcInhxdFwiLFwieHJhXCIsXCJ4cmJcIixcInhyZFwiLFwieHJlXCIsXCJ4cmdcIixcInhyaVwiLFwieHJtXCIsXCJ4cm5cIixcInhycVwiLFwieHJyXCIsXCJ4cnRcIixcInhydVwiLFwieHJ3XCIsXCJ4c2FcIixcInhzYlwiLFwieHNjXCIsXCJ4c2RcIixcInhzZVwiLFwieHNoXCIsXCJ4c2lcIixcInhzalwiLFwieHNsXCIsXCJ4c21cIixcInhzblwiLFwieHNvXCIsXCJ4c3BcIixcInhzcVwiLFwieHNyXCIsXCJ4c3NcIixcInhzdVwiLFwieHN2XCIsXCJ4c3lcIixcInh0YVwiLFwieHRiXCIsXCJ4dGNcIixcInh0ZFwiLFwieHRlXCIsXCJ4dGdcIixcInh0aFwiLFwieHRpXCIsXCJ4dGpcIixcInh0bFwiLFwieHRtXCIsXCJ4dG5cIixcInh0b1wiLFwieHRwXCIsXCJ4dHFcIixcInh0clwiLFwieHRzXCIsXCJ4dHRcIixcInh0dVwiLFwieHR2XCIsXCJ4dHdcIixcInh0eVwiLFwieHR6XCIsXCJ4dWFcIixcInh1YlwiLFwieHVkXCIsXCJ4dWdcIixcInh1alwiLFwieHVsXCIsXCJ4dW1cIixcInh1blwiLFwieHVvXCIsXCJ4dXBcIixcInh1clwiLFwieHV0XCIsXCJ4dXVcIixcInh2ZVwiLFwieHZpXCIsXCJ4dm5cIixcInh2b1wiLFwieHZzXCIsXCJ4d2FcIixcInh3Y1wiLFwieHdkXCIsXCJ4d2VcIixcInh3Z1wiLFwieHdqXCIsXCJ4d2tcIixcInh3bFwiLFwieHdvXCIsXCJ4d3JcIixcInh3dFwiLFwieHd3XCIsXCJ4eGJcIixcInh4a1wiLFwieHhtXCIsXCJ4eHJcIixcInh4dFwiLFwieHlhXCIsXCJ4eWJcIixcInh5alwiLFwieHlrXCIsXCJ4eWxcIixcInh5dFwiLFwieHl5XCIsXCJ4emhcIixcInh6bVwiLFwieHpwXCIsXCJ5YWFcIixcInlhYlwiLFwieWFjXCIsXCJ5YWRcIixcInlhZVwiLFwieWFmXCIsXCJ5YWdcIixcInlhaFwiLFwieWFpXCIsXCJ5YWpcIixcInlha1wiLFwieWFsXCIsXCJ5YW1cIixcInlhblwiLFwieWFvXCIsXCJ5YXBcIixcInlhcVwiLFwieWFyXCIsXCJ5YXNcIixcInlhdFwiLFwieWF1XCIsXCJ5YXZcIixcInlhd1wiLFwieWF4XCIsXCJ5YXlcIixcInlhelwiLFwieWJhXCIsXCJ5YmJcIixcInliZFwiLFwieWJlXCIsXCJ5YmhcIixcInliaVwiLFwieWJqXCIsXCJ5YmtcIixcInlibFwiLFwieWJtXCIsXCJ5Ym5cIixcInlib1wiLFwieWJ4XCIsXCJ5YnlcIixcInljaFwiLFwieWNsXCIsXCJ5Y25cIixcInljcFwiLFwieWRhXCIsXCJ5ZGRcIixcInlkZVwiLFwieWRnXCIsXCJ5ZGtcIixcInlkc1wiLFwieWVhXCIsXCJ5ZWNcIixcInllZVwiLFwieWVpXCIsXCJ5ZWpcIixcInllbFwiLFwieWVuXCIsXCJ5ZXJcIixcInllc1wiLFwieWV0XCIsXCJ5ZXVcIixcInlldlwiLFwieWV5XCIsXCJ5Z2FcIixcInlnaVwiLFwieWdsXCIsXCJ5Z21cIixcInlncFwiLFwieWdyXCIsXCJ5Z3NcIixcInlndVwiLFwieWd3XCIsXCJ5aGFcIixcInloZFwiLFwieWhsXCIsXCJ5aHNcIixcInlpYVwiLFwieWlmXCIsXCJ5aWdcIixcInlpaFwiLFwieWlpXCIsXCJ5aWpcIixcInlpa1wiLFwieWlsXCIsXCJ5aW1cIixcInlpblwiLFwieWlwXCIsXCJ5aXFcIixcInlpclwiLFwieWlzXCIsXCJ5aXRcIixcInlpdVwiLFwieWl2XCIsXCJ5aXhcIixcInlpeVwiLFwieWl6XCIsXCJ5a2FcIixcInlrZ1wiLFwieWtpXCIsXCJ5a2tcIixcInlrbFwiLFwieWttXCIsXCJ5a25cIixcInlrb1wiLFwieWtyXCIsXCJ5a3RcIixcInlrdVwiLFwieWt5XCIsXCJ5bGFcIixcInlsYlwiLFwieWxlXCIsXCJ5bGdcIixcInlsaVwiLFwieWxsXCIsXCJ5bG1cIixcInlsblwiLFwieWxvXCIsXCJ5bHJcIixcInlsdVwiLFwieWx5XCIsXCJ5bWFcIixcInltYlwiLFwieW1jXCIsXCJ5bWRcIixcInltZVwiLFwieW1nXCIsXCJ5bWhcIixcInltaVwiLFwieW1rXCIsXCJ5bWxcIixcInltbVwiLFwieW1uXCIsXCJ5bW9cIixcInltcFwiLFwieW1xXCIsXCJ5bXJcIixcInltc1wiLFwieW10XCIsXCJ5bXhcIixcInltelwiLFwieW5hXCIsXCJ5bmRcIixcInluZVwiLFwieW5nXCIsXCJ5bmhcIixcInlua1wiLFwieW5sXCIsXCJ5bm5cIixcInlub1wiLFwieW5xXCIsXCJ5bnNcIixcInludVwiLFwieW9iXCIsXCJ5b2dcIixcInlvaVwiLFwieW9rXCIsXCJ5b2xcIixcInlvbVwiLFwieW9uXCIsXCJ5b3NcIixcInlvdFwiLFwieW94XCIsXCJ5b3lcIixcInlwYVwiLFwieXBiXCIsXCJ5cGdcIixcInlwaFwiLFwieXBrXCIsXCJ5cG1cIixcInlwblwiLFwieXBvXCIsXCJ5cHBcIixcInlwelwiLFwieXJhXCIsXCJ5cmJcIixcInlyZVwiLFwieXJpXCIsXCJ5cmtcIixcInlybFwiLFwieXJtXCIsXCJ5cm5cIixcInlyb1wiLFwieXJzXCIsXCJ5cndcIixcInlyeVwiLFwieXNjXCIsXCJ5c2RcIixcInlzZ1wiLFwieXNsXCIsXCJ5c25cIixcInlzb1wiLFwieXNwXCIsXCJ5c3JcIixcInlzc1wiLFwieXN5XCIsXCJ5dGFcIixcInl0bFwiLFwieXRwXCIsXCJ5dHdcIixcInl0eVwiLFwieXVhXCIsXCJ5dWJcIixcInl1Y1wiLFwieXVkXCIsXCJ5dWVcIixcInl1ZlwiLFwieXVnXCIsXCJ5dWlcIixcInl1alwiLFwieXVrXCIsXCJ5dWxcIixcInl1bVwiLFwieXVuXCIsXCJ5dXBcIixcInl1cVwiLFwieXVyXCIsXCJ5dXRcIixcInl1dVwiLFwieXV3XCIsXCJ5dXhcIixcInl1eVwiLFwieXV6XCIsXCJ5dmFcIixcInl2dFwiLFwieXdhXCIsXCJ5d2dcIixcInl3bFwiLFwieXduXCIsXCJ5d3FcIixcInl3clwiLFwieXd0XCIsXCJ5d3VcIixcInl3d1wiLFwieXhhXCIsXCJ5eGdcIixcInl4bFwiLFwieXhtXCIsXCJ5eHVcIixcInl4eVwiLFwieXlyXCIsXCJ5eXVcIixcInl5elwiLFwieXpnXCIsXCJ5emtcIixcInphYVwiLFwiemFiXCIsXCJ6YWNcIixcInphZFwiLFwiemFlXCIsXCJ6YWZcIixcInphZ1wiLFwiemFoXCIsXCJ6YWlcIixcInphalwiLFwiemFrXCIsXCJ6YWxcIixcInphbVwiLFwiemFvXCIsXCJ6YXBcIixcInphcVwiLFwiemFyXCIsXCJ6YXNcIixcInphdFwiLFwiemF1XCIsXCJ6YXZcIixcInphd1wiLFwiemF4XCIsXCJ6YXlcIixcInphelwiLFwiemJjXCIsXCJ6YmVcIixcInpibFwiLFwiemJ0XCIsXCJ6YndcIixcInpjYVwiLFwiemNoXCIsXCJ6ZGpcIixcInplYVwiLFwiemVnXCIsXCJ6ZWhcIixcInplblwiLFwiemdhXCIsXCJ6Z2JcIixcInpnaFwiLFwiemdtXCIsXCJ6Z25cIixcInpnclwiLFwiemhiXCIsXCJ6aGRcIixcInpoaVwiLFwiemhuXCIsXCJ6aHdcIixcInpoeFwiLFwiemlhXCIsXCJ6aWJcIixcInppa1wiLFwiemlsXCIsXCJ6aW1cIixcInppblwiLFwiemlyXCIsXCJ6aXdcIixcInppelwiLFwiemthXCIsXCJ6a2JcIixcInprZFwiLFwiemtnXCIsXCJ6a2hcIixcInpra1wiLFwiemtuXCIsXCJ6a29cIixcInprcFwiLFwiemtyXCIsXCJ6a3RcIixcInprdVwiLFwiemt2XCIsXCJ6a3pcIixcInpsZVwiLFwiemxqXCIsXCJ6bG1cIixcInpsblwiLFwiemxxXCIsXCJ6bHNcIixcInpsd1wiLFwiem1hXCIsXCJ6bWJcIixcInptY1wiLFwiem1kXCIsXCJ6bWVcIixcInptZlwiLFwiem1nXCIsXCJ6bWhcIixcInptaVwiLFwiem1qXCIsXCJ6bWtcIixcInptbFwiLFwiem1tXCIsXCJ6bW5cIixcInptb1wiLFwiem1wXCIsXCJ6bXFcIixcInptclwiLFwiem1zXCIsXCJ6bXRcIixcInptdVwiLFwiem12XCIsXCJ6bXdcIixcInpteFwiLFwiem15XCIsXCJ6bXpcIixcInpuYVwiLFwiem5kXCIsXCJ6bmVcIixcInpuZ1wiLFwiem5rXCIsXCJ6bnNcIixcInpvY1wiLFwiem9oXCIsXCJ6b21cIixcInpvb1wiLFwiem9xXCIsXCJ6b3JcIixcInpvc1wiLFwienBhXCIsXCJ6cGJcIixcInpwY1wiLFwienBkXCIsXCJ6cGVcIixcInpwZlwiLFwienBnXCIsXCJ6cGhcIixcInpwaVwiLFwienBqXCIsXCJ6cGtcIixcInpwbFwiLFwienBtXCIsXCJ6cG5cIixcInpwb1wiLFwienBwXCIsXCJ6cHFcIixcInpwclwiLFwienBzXCIsXCJ6cHRcIixcInpwdVwiLFwienB2XCIsXCJ6cHdcIixcInpweFwiLFwienB5XCIsXCJ6cHpcIixcInpxZVwiLFwienJhXCIsXCJ6cmdcIixcInpyblwiLFwienJvXCIsXCJ6cnBcIixcInpyc1wiLFwienNhXCIsXCJ6c2tcIixcInpzbFwiLFwienNtXCIsXCJ6c3JcIixcInpzdVwiLFwienRlXCIsXCJ6dGdcIixcInp0bFwiLFwienRtXCIsXCJ6dG5cIixcInp0cFwiLFwienRxXCIsXCJ6dHNcIixcInp0dFwiLFwienR1XCIsXCJ6dHhcIixcInp0eVwiLFwienVhXCIsXCJ6dWhcIixcInp1bVwiLFwienVuXCIsXCJ6dXlcIixcInp3YVwiLFwienh4XCIsXCJ6eWJcIixcInp5Z1wiLFwienlqXCIsXCJ6eW5cIixcInp5cFwiLFwienphXCIsXCJ6empcIl1cbjtyZXR1cm4gYXhlLnV0aWxzLnZhbGlkTGFuZ3M9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gTn0sY29tbW9uc30oKX0pfShcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzKTsiO2Z1bmN0aW9uIHJ1bkExMXlDaGVja3MoKXtyZXR1cm4gd2luZG93LmF4ZS5ydW4oZG9jdW1lbnQse2VsZW1lbnRSZWY6dHJ1ZSxydW5Pbmx5Ont0eXBlOid0YWcnLHZhbHVlczpbJ3djYWcyYScsJ3djYWcyYWEnXX0scmVzdWx0VHlwZXM6Wyd2aW9sYXRpb25zJywnaW5hcHBsaWNhYmxlJ10scnVsZXM6eyd0YWJpbmRleCc6e2VuYWJsZWQ6dHJ1ZX0sJ3RhYmxlLWZha2UtY2FwdGlvbic6e2VuYWJsZWQ6dHJ1ZX0sJ3RkLWhhcy1oZWFkZXInOntlbmFibGVkOnRydWV9LCdhcmVhLWFsdCc6e2VuYWJsZWQ6ZmFsc2V9LCdibGluayc6e2VuYWJsZWQ6ZmFsc2V9LCdzZXJ2ZXItc2lkZS1pbWFnZS1tYXAnOntlbmFibGVkOmZhbHNlfX19KS50aGVuKGF4ZVJlc3VsdD0+e2F4ZVJlc3VsdC52aW9sYXRpb25zLmZvckVhY2godj0+di5ub2Rlcy5mb3JFYWNoKG5vZGU9Pntub2RlLnBhdGg9Z2V0Tm9kZVBhdGgobm9kZS5lbGVtZW50KTtub2RlLnNuaXBwZXQ9Z2V0T3V0ZXJIVE1MU25pcHBldChub2RlLmVsZW1lbnQpO25vZGUuZWxlbWVudD1ub2RlLmFueT1ub2RlLmFsbD1ub2RlLm5vbmU9dW5kZWZpbmVkO30pKTtheGVSZXN1bHQ9e3Zpb2xhdGlvbnM6YXhlUmVzdWx0LnZpb2xhdGlvbnMsbm90QXBwbGljYWJsZTpheGVSZXN1bHQuaW5hcHBsaWNhYmxlfTtyZXR1cm4gYXhlUmVzdWx0O30pO2Z1bmN0aW9uIGdldE5vZGVQYXRoKG5vZGUpe2Z1bmN0aW9uIGdldE5vZGVJbmRleChub2RlKXtsZXQgaW5kZXg9MDtsZXQgcHJldk5vZGU7d2hpbGUocHJldk5vZGU9bm9kZS5wcmV2aW91c1NpYmxpbmcpe25vZGU9cHJldk5vZGU7aWYobm9kZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFJiZub2RlLnRleHRDb250ZW50JiZub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGg9PT0wKWNvbnRpbnVlO2luZGV4Kys7fQpyZXR1cm4gaW5kZXg7fQpjb25zdCBwYXRoPVtdO3doaWxlKG5vZGUmJm5vZGUucGFyZW50Tm9kZSl7Y29uc3QgaW5kZXg9Z2V0Tm9kZUluZGV4KG5vZGUpO3BhdGgucHVzaChbaW5kZXgsbm9kZS5ub2RlTmFtZV0pO25vZGU9bm9kZS5wYXJlbnROb2RlO30KcGF0aC5yZXZlcnNlKCk7cmV0dXJuIHBhdGguam9pbignLCcpO30KZnVuY3Rpb24gZ2V0T3V0ZXJIVE1MU25pcHBldChlbCl7Y29uc3QgcmVPcGVuaW5nVGFnPS9eLio/Pi87Y29uc3QgbWF0Y2g9ZWwub3V0ZXJIVE1MLm1hdGNoKHJlT3BlbmluZ1RhZyk7cmV0dXJuIG1hdGNoJiZtYXRjaFswXXx8Jyc7fX0KY2xhc3MgQWNjZXNzaWJpbGl0eSBleHRlbmRzIEdhdGhlcmVye2FmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjtjb25zdCBleHByZXNzaW9uPWAoZnVuY3Rpb24gKCkgewogICAgICAke2F4ZUxpYlNvdXJjZX07CiAgICAgIHJldHVybiAoJHtydW5BMTF5Q2hlY2tzLnRvU3RyaW5nKCl9KCkpOwogICAgfSkoKWA7cmV0dXJuIGRyaXZlci5ldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb24se3VzZUlzb2xhdGlvbjp0cnVlfSkudGhlbihyZXR1cm5lZFZhbHVlPT57aWYoIXJldHVybmVkVmFsdWUpe3Rocm93IG5ldyBFcnJvcignTm8gYXhlLWNvcmUgcmVzdWx0cyByZXR1cm5lZCcpO30KaWYoIUFycmF5LmlzQXJyYXkocmV0dXJuZWRWYWx1ZS52aW9sYXRpb25zKSl7dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgYXhlIHJlc3VsdHMnK3JldHVybmVkVmFsdWUpO30KcmV0dXJuIHJldHVybmVkVmFsdWU7fSk7fX0KbW9kdWxlLmV4cG9ydHM9QWNjZXNzaWJpbGl0eTt9LHsiLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9jYWNoZS1jb250ZW50cyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7ZnVuY3Rpb24gZ2V0Q2FjaGVDb250ZW50cygpe3JldHVybiBjYWNoZXMua2V5cygpLnRoZW4oY2FjaGVOYW1lcz0+UHJvbWlzZS5hbGwoY2FjaGVOYW1lcy5tYXAoY2FjaGVOYW1lPT5jYWNoZXMub3BlbihjYWNoZU5hbWUpKSkpLnRoZW4oY2FjaGVzPT57Y29uc3QgcmVxdWVzdHM9W107cmV0dXJuIFByb21pc2UuYWxsKGNhY2hlcy5tYXAoY2FjaGU9PntyZXR1cm4gY2FjaGUua2V5cygpLnRoZW4ocmVxcz0+e3JlcXVlc3RzLnB1c2goLi4ucmVxcy5tYXAocj0+ci51cmwpKTt9KTt9KSkudGhlbihfPT57cmV0dXJuIHJlcXVlc3RzO30pO30pO30KY2xhc3MgQ2FjaGVDb250ZW50cyBleHRlbmRzIEdhdGhlcmVye2FzeW5jIGFmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjtjb25zdCBjYWNoZVVybHM9YXdhaXQgZHJpdmVyLmV2YWx1YXRlQXN5bmMoYCgke2dldENhY2hlQ29udGVudHMudG9TdHJpbmcoKX0oKSlgKTtpZighY2FjaGVVcmxzfHwhQXJyYXkuaXNBcnJheShjYWNoZVVybHMpKXt0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSBjYWNoZSBjb250ZW50cycpO30KcmV0dXJuIGNhY2hlVXJsczt9fQptb2R1bGUuZXhwb3J0cz1DYWNoZUNvbnRlbnRzO30seyIuL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2Nocm9tZS1jb25zb2xlLW1lc3NhZ2VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjbGFzcyBDaHJvbWVDb25zb2xlTWVzc2FnZXMgZXh0ZW5kcyBHYXRoZXJlcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fbG9nRW50cmllcz1bXTt0aGlzLl9vbkNvbnNvbGVFbnRyeUFkZGVkPXRoaXMub25Db25zb2xlRW50cnkuYmluZCh0aGlzKTt9Cm9uQ29uc29sZUVudHJ5KGVudHJ5KXt0aGlzLl9sb2dFbnRyaWVzLnB1c2goZW50cnkpO30KYXN5bmMgYmVmb3JlUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjtkcml2ZXIub24oJ0xvZy5lbnRyeUFkZGVkJyx0aGlzLl9vbkNvbnNvbGVFbnRyeUFkZGVkKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0xvZy5lbmFibGUnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0xvZy5zdGFydFZpb2xhdGlvbnNSZXBvcnQnLHtjb25maWc6W3tuYW1lOidkaXNjb3VyYWdlZEFQSVVzZScsdGhyZXNob2xkOi0xfV19KTt9CmFzeW5jIGFmdGVyUGFzcyhwYXNzQ29udGV4dCl7YXdhaXQgcGFzc0NvbnRleHQuZHJpdmVyLnNlbmRDb21tYW5kKCdMb2cuc3RvcFZpb2xhdGlvbnNSZXBvcnQnKTthd2FpdCBwYXNzQ29udGV4dC5kcml2ZXIub2ZmKCdMb2cuZW50cnlBZGRlZCcsdGhpcy5fb25Db25zb2xlRW50cnlBZGRlZCk7YXdhaXQgcGFzc0NvbnRleHQuZHJpdmVyLnNlbmRDb21tYW5kKCdMb2cuZGlzYWJsZScpO3JldHVybiB0aGlzLl9sb2dFbnRyaWVzO319Cm1vZHVsZS5leHBvcnRzPUNocm9tZUNvbnNvbGVNZXNzYWdlczt9LHsiLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9jc3MtdXNhZ2UiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2NsYXNzIENTU1VzYWdlIGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO2NvbnN0IHN0eWxlc2hlZXRzPVtdO2NvbnN0IG9uU3R5bGVzaGVldEFkZGVkPXNoZWV0PT5zdHlsZXNoZWV0cy5wdXNoKHNoZWV0KTtkcml2ZXIub24oJ0NTUy5zdHlsZVNoZWV0QWRkZWQnLG9uU3R5bGVzaGVldEFkZGVkKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0RPTS5lbmFibGUnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0NTUy5lbmFibGUnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0NTUy5zdGFydFJ1bGVVc2FnZVRyYWNraW5nJyk7YXdhaXQgZHJpdmVyLmV2YWx1YXRlQXN5bmMoJ2dldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSknKTtkcml2ZXIub2ZmKCdDU1Muc3R5bGVTaGVldEFkZGVkJyxvblN0eWxlc2hlZXRBZGRlZCk7Y29uc3QgcHJvbWlzZXM9c3R5bGVzaGVldHMubWFwKHNoZWV0PT57Y29uc3Qgc3R5bGVTaGVldElkPXNoZWV0LmhlYWRlci5zdHlsZVNoZWV0SWQ7cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnQ1NTLmdldFN0eWxlU2hlZXRUZXh0Jyx7c3R5bGVTaGVldElkfSkudGhlbihjb250ZW50PT57cmV0dXJue2hlYWRlcjpzaGVldC5oZWFkZXIsY29udGVudDpjb250ZW50LnRleHR9O30pO30pO2NvbnN0IHN0eWxlU2hlZXRJbmZvPWF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtjb25zdCBydWxlVXNhZ2VSZXNwb25zZT1hd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0NTUy5zdG9wUnVsZVVzYWdlVHJhY2tpbmcnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ0NTUy5kaXNhYmxlJyk7YXdhaXQgZHJpdmVyLnNlbmRDb21tYW5kKCdET00uZGlzYWJsZScpO2NvbnN0IGRlZHVwZWRTdHlsZXNoZWV0cz1uZXcgTWFwKHN0eWxlU2hlZXRJbmZvLm1hcChzaGVldD0+e3JldHVybltzaGVldC5jb250ZW50LHNoZWV0XTt9KSk7cmV0dXJue3J1bGVzOnJ1bGVVc2FnZVJlc3BvbnNlLnJ1bGVVc2FnZSxzdHlsZXNoZWV0czpBcnJheS5mcm9tKGRlZHVwZWRTdHlsZXNoZWV0cy52YWx1ZXMoKSl9O319Cm1vZHVsZS5leHBvcnRzPUNTU1VzYWdlO30seyIuL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2RvYmV0dGVyd2ViL2FuY2hvcnMtd2l0aC1uby1yZWwtbm9vcGVuZXIiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtjb25zdCBET01IZWxwZXJzPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9kb20taGVscGVycy5qcycpO2NsYXNzIEFuY2hvcnNXaXRoTm9SZWxOb29wZW5lciBleHRlbmRzIEdhdGhlcmVye2FmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZXhwcmVzc2lvbj1gKGZ1bmN0aW9uKCkgewogICAgICAke0RPTUhlbHBlcnMuZ2V0RWxlbWVudHNJbkRvY3VtZW50Rm5TdHJpbmd9OyAvLyBkZWZpbmUgZnVuY3Rpb24gb24gcGFnZQogICAgICBjb25zdCBzZWxlY3RvciA9ICdhW3RhcmdldD0iX2JsYW5rIl06bm90KFtyZWx+PSJub29wZW5lciJdKTpub3QoW3JlbH49Im5vcmVmZXJyZXIiXSknOwogICAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzSW5Eb2N1bWVudChzZWxlY3Rvcik7CiAgICAgIHJldHVybiBlbGVtZW50cy5tYXAobm9kZSA9PiAoewogICAgICAgIGhyZWY6IG5vZGUuaHJlZiwKICAgICAgICByZWw6IG5vZGUuZ2V0QXR0cmlidXRlKCdyZWwnKSwKICAgICAgICB0YXJnZXQ6IG5vZGUuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKQogICAgICB9KSk7CiAgICB9KSgpYDtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlQXN5bmMoZXhwcmVzc2lvbik7fX0KbW9kdWxlLmV4cG9ydHM9QW5jaG9yc1dpdGhOb1JlbE5vb3BlbmVyO30seyIuLi8uLi8uLi9saWIvZG9tLWhlbHBlcnMuanMiOjMwLCIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9kb2JldHRlcndlYi9hcHBjYWNoZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuLi9nYXRoZXJlcicpO2NsYXNzIEFwcENhY2hlTWFuaWZlc3QgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIGRyaXZlci5xdWVyeVNlbGVjdG9yKCdodG1sJykudGhlbihub2RlPT5ub2RlJiZub2RlLmdldEF0dHJpYnV0ZSgnbWFuaWZlc3QnKSk7fX0KbW9kdWxlLmV4cG9ydHM9QXBwQ2FjaGVNYW5pZmVzdDt9LHsiLi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvZG9iZXR0ZXJ3ZWIvZG9jdHlwZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuLi9nYXRoZXJlcicpO2Z1bmN0aW9uIGdldERvY3R5cGUoKXtpZighZG9jdW1lbnQuZG9jdHlwZSl7cmV0dXJuIG51bGw7fQpjb25zdHtuYW1lLHB1YmxpY0lkLHN5c3RlbUlkfT1kb2N1bWVudC5kb2N0eXBlO3JldHVybntuYW1lLHB1YmxpY0lkLHN5c3RlbUlkfTt9CmNsYXNzIERvY3R5cGUgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIGRyaXZlci5ldmFsdWF0ZUFzeW5jKGAoJHtnZXREb2N0eXBlLnRvU3RyaW5nKCl9KCkpYCk7fX0KbW9kdWxlLmV4cG9ydHM9RG9jdHlwZTt9LHsiLi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvZG9iZXR0ZXJ3ZWIvZG9tc3RhdHMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtmdW5jdGlvbiBnZXRPdXRlckhUTUxTbmlwcGV0KGVsZW1lbnQpe2NvbnN0IHJlT3BlbmluZ1RhZz0vXi4qPz4vO2NvbnN0IG1hdGNoPWVsZW1lbnQub3V0ZXJIVE1MLm1hdGNoKHJlT3BlbmluZ1RhZyk7cmV0dXJuIG1hdGNoJiZtYXRjaFswXTt9CmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yc0xhYmVsKGVsZW1lbnQpe2xldCBuYW1lPWVsZW1lbnQubG9jYWxOYW1lfHwnJztjb25zdCBpZEF0dHI9ZWxlbWVudC5nZXRBdHRyaWJ1dGUmJmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpO2lmKGlkQXR0cil7bmFtZSs9YCMke2lkQXR0cn1gO30KaWYoZWxlbWVudC5jbGFzc0xpc3Qpe2NvbnN0IGNsYXNzTmFtZT1lbGVtZW50LmNsYXNzTGlzdC50b1N0cmluZygpO2lmKGNsYXNzTmFtZSl7bmFtZSs9YC4ke2NsYXNzTmFtZS50cmltKCkucmVwbGFjZSgvXHMrL2csJy4nKX1gO319ZWxzZSBpZihTaGFkb3dSb290LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGVsZW1lbnQpKXtuYW1lKz0nI3NoYWRvdy1yb290Jzt9CnJldHVybiBuYW1lO30KZnVuY3Rpb24gZWxlbWVudFBhdGhJbkRPTShlbGVtZW50KXtjb25zdCB2aXNpdGVkPW5ldyBTZXQoKTtjb25zdCBwYXRoPVtjcmVhdGVTZWxlY3RvcnNMYWJlbChlbGVtZW50KV07bGV0IG5vZGU9ZWxlbWVudDt3aGlsZShub2RlKXt2aXNpdGVkLmFkZChub2RlKTtpZihTaGFkb3dSb290LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG5vZGUpKXtjb25zdCBpc1NoYWRvd0hvc3Q9bm9kZS5ob3N0JiZub2RlLmxvY2FsTmFtZSE9PSdhJztub2RlPWlzU2hhZG93SG9zdD9ub2RlLmhvc3Q6bm9kZS5wYXJlbnRFbGVtZW50O31lbHNle2NvbnN0IGlzU2hhZG93SG9zdD1ub2RlLnBhcmVudE5vZGUmJm5vZGUucGFyZW50Tm9kZS5ob3N0JiZub2RlLnBhcmVudE5vZGUubG9jYWxOYW1lIT09J2EnO25vZGU9aXNTaGFkb3dIb3N0P25vZGUucGFyZW50Tm9kZS5ob3N0Om5vZGUucGFyZW50RWxlbWVudDt9CmlmKHZpc2l0ZWQuaGFzKG5vZGUpKXtub2RlPW51bGw7fQppZihub2RlKXtwYXRoLnVuc2hpZnQoY3JlYXRlU2VsZWN0b3JzTGFiZWwobm9kZSkpO319CnJldHVybiBwYXRoO30KZnVuY3Rpb24gZ2V0RE9NU3RhdHMoZWxlbWVudCxkZWVwPXRydWUpe2xldCBkZWVwZXN0Tm9kZT1udWxsO2xldCBtYXhEZXB0aD0wO2xldCBtYXhXaWR0aD0wO2xldCBwYXJlbnRXaXRoTW9zdENoaWxkcmVuPW51bGw7Y29uc3QgX2NhbGNET01XaWR0aEFuZEhlaWdodD1mdW5jdGlvbihlbGVtZW50LGRlcHRoPTEpe2lmKGRlcHRoPm1heERlcHRoKXtkZWVwZXN0Tm9kZT1lbGVtZW50O21heERlcHRoPWRlcHRoO30KaWYoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg+bWF4V2lkdGgpe3BhcmVudFdpdGhNb3N0Q2hpbGRyZW49ZWxlbWVudDttYXhXaWR0aD1lbGVtZW50LmNoaWxkcmVuLmxlbmd0aDt9CmxldCBjaGlsZD1lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO3doaWxlKGNoaWxkKXtfY2FsY0RPTVdpZHRoQW5kSGVpZ2h0KGNoaWxkLGRlcHRoKzEpO2lmKGRlZXAmJmNoaWxkLnNoYWRvd1Jvb3Qpe19jYWxjRE9NV2lkdGhBbmRIZWlnaHQoY2hpbGQuc2hhZG93Um9vdCxkZXB0aCsxKTt9CmNoaWxkPWNoaWxkLm5leHRFbGVtZW50U2libGluZzt9CnJldHVybnttYXhEZXB0aCxtYXhXaWR0aH07fTtjb25zdCByZXN1bHQ9X2NhbGNET01XaWR0aEFuZEhlaWdodChlbGVtZW50KTtyZXR1cm57ZGVwdGg6e21heDpyZXN1bHQubWF4RGVwdGgscGF0aFRvRWxlbWVudDplbGVtZW50UGF0aEluRE9NKGRlZXBlc3ROb2RlKSxzbmlwcGV0OmdldE91dGVySFRNTFNuaXBwZXQoZGVlcGVzdE5vZGUpfSx3aWR0aDp7bWF4OnJlc3VsdC5tYXhXaWR0aCxwYXRoVG9FbGVtZW50OmVsZW1lbnRQYXRoSW5ET00ocGFyZW50V2l0aE1vc3RDaGlsZHJlbiksc25pcHBldDpnZXRPdXRlckhUTUxTbmlwcGV0KHBhcmVudFdpdGhNb3N0Q2hpbGRyZW4pfX07fQpjbGFzcyBET01TdGF0cyBleHRlbmRzIEdhdGhlcmVye2FmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZXhwcmVzc2lvbj1gKGZ1bmN0aW9uKCkgewogICAgICAke2dldE91dGVySFRNTFNuaXBwZXQudG9TdHJpbmcoKX07CiAgICAgICR7Y3JlYXRlU2VsZWN0b3JzTGFiZWwudG9TdHJpbmcoKX07CiAgICAgICR7ZWxlbWVudFBhdGhJbkRPTS50b1N0cmluZygpfTsKICAgICAgcmV0dXJuICgke2dldERPTVN0YXRzLnRvU3RyaW5nKCl9KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpOwogICAgfSkoKWA7cmV0dXJuIHBhc3NDb250ZXh0LmRyaXZlci5zZW5kQ29tbWFuZCgnRE9NLmVuYWJsZScpLnRoZW4oKCk9PnBhc3NDb250ZXh0LmRyaXZlci5ldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb24se3VzZUlzb2xhdGlvbjp0cnVlfSkpLnRoZW4ocmVzdWx0cz0+cGFzc0NvbnRleHQuZHJpdmVyLmdldEVsZW1lbnRzSW5Eb2N1bWVudCgpLnRoZW4oYWxsTm9kZXM9PntyZXN1bHRzLnRvdGFsRE9NTm9kZXM9YWxsTm9kZXMubGVuZ3RoO3JldHVybiBwYXNzQ29udGV4dC5kcml2ZXIuc2VuZENvbW1hbmQoJ0RPTS5kaXNhYmxlJykudGhlbigoKT0+cmVzdWx0cyk7fSkpO319Cm1vZHVsZS5leHBvcnRzPURPTVN0YXRzO30seyIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9kb2JldHRlcndlYi9qcy1saWJyYXJpZXMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtjb25zdCBsaWJEZXRlY3RvclNvdXJjZT0idmFyIFVOS05PV05fVkVSU0lPTiA9IG51bGw7XG52YXIgZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VfTGlicmFyeURldGVjdG9yVGVzdHMgPSB7XG5cbiAgICAnR1dUJzoge1xuICAgICAgICBpY29uOiAnZ3d0JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5nd3Rwcm9qZWN0Lm9yZy8nLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIC8vIHByZXR0eSBjb21wbGljYXRlZCwgbWFueSBwb3NzaWJsZSB0ZWxsIHRhbGVzXG4gICAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50LFxuICAgICAgICAgICAgICAgIGhhc0hpc3RGcmFtZSA9IGRvYy5nZXRFbGVtZW50QnlJZCgnX19nd3RfaGlzdG9yeUZyYW1lJyksXG4gICAgICAgICAgICAgICAgaGFzR3d0VWlkID0gZG9jLmd3dF91aWQsXG4gICAgICAgICAgICAgICAgaGFzQm9keUxpc3RlbmVyID0gZG9jLmJvZHkuX19saXN0ZW5lcixcbiAgICAgICAgICAgICAgICBoYXNCb2R5RXZlbnRCaXRzID0gZG9jLmJvZHkuX19ldmVudEJpdHMsXG4gICAgICAgICAgICAgICAgaGFzTW9kdWxlcyA9IHdpbi5fX2d3dF9hY3RpdmVNb2R1bGVzLFxuICAgICAgICAgICAgICAgIGhhc0pzb25QID0gd2luLl9fZ3d0X2pzb25wX18sXG4gICAgICAgICAgICAgICAgaGFzUm9vdFdpbkFwcCA9IHdpbi5fX2d3dF9zY3JpcHRzTG9hZGVkIHx8IHdpbi5fX2d3dF9zdHlsZXNMb2FkZWQgfHwgd2luLl9fZ3d0X2FjdGl2ZU1vZHVsZXM7XG5cbiAgICAgICAgICAgIC8vIHVzZSB0aGUgbWFueSBwb3NzaWJsZSBpbmRpY2F0b3JzXG4gICAgICAgICAgICBpZihoYXNIaXN0RnJhbWUgfHwgaGFzR3d0VWlkIHx8IGhhc0JvZHlMaXN0ZW5lciB8fCBoYXNCb2R5RXZlbnRCaXRzIHx8IGhhc01vZHVsZXMgfHwgaGFzSnNvblAgfHwgaGFzUm9vdFdpbkFwcCkge1xuXG4gICAgICAgICAgICAgICAgLy8gY2FyZWZ1bGx5IGxvb2sgYXQgZnJhbWVzLCBidXQgb25seSBpZiBjZXJ0YWluIGlzIEdXVCBmcmFtZVxuICAgICAgICAgICAgICAgIHZhciBmcmFtZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lmcmFtZScpLFxuICAgICAgICAgICAgICAgICAgICBnd3RWZXJzaW9uID0gVU5LTk9XTl9WRVJTSU9OO1xuICAgICAgICAgICAgICAgIGZvcih2YXIgbj0wOyBuPGZyYW1lcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBzZWN1cml0eSBhY2Nlc3MgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTmVnYXRpdmVUYWJJbmRleCA9IGZyYW1lc1tuXS50YWJJbmRleCA8IDA7IC8vIG9uIGZvciBHV1RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhc05lZ2F0aXZlVGFiSW5kZXggJiYgZnJhbWVzW25dLmNvbnRlbnRXaW5kb3cgJiYgZnJhbWVzW25dLmNvbnRlbnRXaW5kb3cuJGd3dF92ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3d0VmVyc2lvbiA9IGZyYW1lc1tuXS5jb250ZW50V2luZG93LiRnd3RfdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7fVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGd3dFZlcnNpb249PScwLjAuOTk5Jykge1xuICAgICAgICAgICAgICAgICAgZ3d0VmVyc2lvbiA9ICdHb29nbGUgSW50ZXJuYWwnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IGd3dFZlcnNpb24gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnSW5rJzoge1xuICAgICAgICBpY29uOiAnaW5rJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2luay5zYXBvLnB0LycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5JbmsgJiYgd2luLkluay5jcmVhdGVNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnVmFhZGluJzoge1xuICAgICAgICBpY29uOiAndmFhZGluJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3ZhYWRpbi5jb20vaG9tZScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi52YWFkaW4gJiYgd2luLnZhYWRpbi5yZWdpc3RlcldpZGdldHNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdCb290c3RyYXAnOiB7XG4gICAgICAgIGljb246ICdib290c3RyYXAnLFxuICAgICAgICB1cmw6ICdodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS8nLFxuICAgICAgICBucG06ICdib290c3RyYXAnLFxuICAgICAgICAvLyBsb29rIGZvciBhIGZ1bmN0aW9uIEJvb3N0cmFwIGhhcyBhZGRlZCB0byBqUXVlcnkgLSByZWdleCBmb3IgQlMgMiAmIDNcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICB2YXIgalF1ZXJ5QXZhaWxhYmxlID0gd2luLiQgJiYgd2luLiQuZm4sXG4gICAgICAgICAgICAgICAgUkVfUFJFRklYX1YyID0gJ1xcXFwkdGhpc1xcXFwuZGF0YVxcXFwoKD86XFwnfFwiKScsXG4gICAgICAgICAgICAgICAgUkVfUFJFRklYX1YzID0gJ1xcXFwkdGhpc1xcXFwuZGF0YVxcXFwoKD86XFwnfFwiKSg/OmJzXFxcXC4pezF9JyxcbiAgICAgICAgICAgICAgICBib290c3RyYXBDb21wb25lbnRzID0gW1xuICAgICAgICAgICAgICAgICAgICAnYWZmaXgnLCAnYWxlcnQnLCAnYnV0dG9uJywgJ2Nhcm91c2VsJywgJ2NvbGxhcHNlJywgJ2Ryb3Bkb3duJyxcbiAgICAgICAgICAgICAgICAgICAgJ21vZGFsJywgJ3BvcG92ZXInLCAnc2Nyb2xsc3B5JywgJ3RhYicsICd0b29sdGlwJ1xuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmKGpRdWVyeUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBib290c3RyYXBWZXJzaW9uO1xuXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwQ29tcG9uZW50cy5zb21lKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZih3aW4uJC5mbltjb21wb25lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgPj0gMy4yLjAgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih3aW4uJC5mbltjb21wb25lbnRdLkNvbnN0cnVjdG9yICYmIHdpbi4kLmZuW2NvbXBvbmVudF0uQ29uc3RydWN0b3IuVkVSU0lPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcFZlcnNpb24gPSB3aW4uJC5mbltjb21wb25lbnRdLkNvbnN0cnVjdG9yLlZFUlNJT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgPj0gMi4wLjAgYW5kIDw9IDMuMS4wIGRldGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG5ldyBSZWdFeHAoUkVfUFJFRklYX1YzICsgY29tcG9uZW50KS50ZXN0KHdpbi4kLmZuW2NvbXBvbmVudF0udG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBWZXJzaW9uID0gJz49IDMuMC4wICYgPD0gMy4xLjEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm9vdHN0cmFwIDwgMy4xLjAgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYobmV3IFJlZ0V4cChSRV9QUkVGSVhfVjIgKyBjb21wb25lbnQpLnRlc3Qod2luLiQuZm5bY29tcG9uZW50XS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcFZlcnNpb24gPSAnPj0gMi4wLjAgJiA8PSAyLjMuMic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1p1cmInOiB7XG4gICAgICAgIGljb246ICd6dXJiJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20vJyxcbiAgICAgICAgbnBtOiAnZm91bmRhdGlvbi1zaXRlcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLkZvdW5kYXRpb24gJiYgd2luLkZvdW5kYXRpb24uVG9nZ2xlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5Gb3VuZGF0aW9uLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1BvbHltZXInOiB7XG4gICAgICAgIGljb246ICdwb2x5bWVyJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5wb2x5bWVyLXByb2plY3Qub3JnLycsXG4gICAgICAgIG5wbTogJ0Bwb2x5bWVyL3BvbHltZXInLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5Qb2x5bWVyICYmIHdpbi5Qb2x5bWVyLmRvbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5Qb2x5bWVyLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0hpZ2hjaGFydHMnOiB7XG4gICAgICAgIGljb246ICdoaWdoY2hhcnRzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5oaWdoY2hhcnRzLmNvbScsXG4gICAgICAgIG5wbTogJ2hpZ2hjaGFydHMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5IaWdoY2hhcnRzICYmIHdpbi5IaWdoY2hhcnRzLlBvaW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkhpZ2hjaGFydHMudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnSW5mb1Zpcyc6IHtcbiAgICAgICAgaWNvbjogJ2ppdCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9waGlsb2diLmdpdGh1Yi5jb20vaml0LycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3Qod2luKSB7XG4gICAgICAgICAgICBpZih3aW4uJGppdCAmJiB3aW4uJGppdC5QaWVDaGFydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi4kaml0LnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0Zsb3RDaGFydHMnOiB7XG4gICAgICAgIGljb246ICdpY29uXzQ4JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5mbG90Y2hhcnRzLm9yZy8nLFxuICAgICAgICBucG06ICdmbG90JyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uJCAmJiB3aW4uJC5wbG90KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLiQucGxvdC52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0JsYWNrYmlyZCc6IHtcbiAgICAgICAgaWNvbjogJ2JsYWNrYmlyZCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly93d3cuZ3Njb3R0b2xzb24uY29tL2JsYWNrYmlyZGpzLycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLmxvZyAmJiB3aW4ubG9nLndhcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059OyAvLyBubyB2ZXJzaW9uIGluZm9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnQ3JlYXRlSlMnOiB7XG4gICAgICAgIGljb246ICdjcmVhdGVqcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9jcmVhdGVqcy5jb20vIyEvQ3JlYXRlSlMnLFxuICAgICAgICBucG06ICdjcmVhdGVqcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLmNyZWF0ZWpzICYmIHdpbi5jcmVhdGVqcy5wcm9tb3RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OfTsgLy8gbm8gdmVyc2lvbiBpbmZvIGF2YWlsYWJsZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdHb29nbGUgTWFwcyc6IHtcbiAgICAgICAgaWNvbjogJ2dtYXBzJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy8nLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uZ29vZ2xlICYmIHdpbi5nb29nbGUubWFwcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5nb29nbGUubWFwcy52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdqUXVlcnknOiB7XG4gICAgICAgIGljb246ICdqcXVlcnknLFxuICAgICAgICB1cmw6ICdodHRwOi8vanF1ZXJ5LmNvbScsXG4gICAgICAgIG5wbTogJ2pxdWVyeScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgdmFyIGpxID0gd2luLmpRdWVyeSB8fCB3aW4uJDtcbiAgICAgICAgICAgIGlmIChqcSAmJiBqcS5mbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IGpxLmZuLmpxdWVyeS5yZXBsYWNlKC9bXlxcZCtcXC4rXS9nLCAnJykgfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnalF1ZXJ5IFVJJzoge1xuICAgICAgICBpY29uOiAnanF1ZXJ5X3VpJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2pxdWVyeXVpLmNvbScsXG4gICAgICAgIG5wbTogJ2pxdWVyeS11aScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgdmFyIGpxID0gd2luLmpRdWVyeSB8fCB3aW4uJCB8fCB3aW4uJGpxIHx8IHdpbi4kajtcbiAgICAgICAgICAgIGlmKGpxICYmIGpxLmZuICYmIGpxLmZuLmpxdWVyeSAmJiBqcS51aSkge1xuICAgICAgICAgICAgICAgIHZhciBwbHVnaW5zID0gJ2FjY29yZGlvbixkYXRlcGlja2VyLGRpYWxvZyxkcmFnZ2FibGUsZHJvcHBhYmxlLHByb2dyZXNzYmFyLHJlc2l6YWJsZSxzZWxlY3RhYmxlLHNsaWRlcixtZW51LGdyaWQsdGFicycuc3BsaXQoJywnKSwgY29uY2F0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgeyBpZihqcS51aVtwbHVnaW5zW2ldXSkgY29uY2F0LnB1c2gocGx1Z2luc1tpXS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpICsgcGx1Z2luc1tpXS5zdWJzdHIoMSkpOyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjoganEudWkudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04sIGRldGFpbHM6IGNvbmNhdC5sZW5ndGggPyAnUGx1Z2lucyB1c2VkOiAnK2NvbmNhdC5qb2luKCcsJykgOiAnJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdEb2pvJzoge1xuICAgICAgICBpY29uOiAnZG9qbycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9kb2pvdG9vbGtpdC5vcmcnLFxuICAgICAgICBucG06ICdkb2pvJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uZG9qbyAmJiB3aW4uZG9qby5kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gd2luLmRvam8udmVyc2lvbiA/IHdpbi5kb2pvLnZlcnNpb24udG9TdHJpbmcoKSA6IFVOS05PV05fVkVSU0lPTjtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB2ZXJzaW9uLCBkZXRhaWxzOiAnRGV0YWlsczogJysod2luLmRpaml0ID8gJ1VzZXMgRGlqaXQnIDogJ25vbmUnKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdQcm90b3R5cGUnOiB7XG4gICAgICAgIGljb246ICdwcm90b3R5cGUnLFxuICAgICAgICB1cmw6ICdodHRwOi8vcHJvdG90eXBlanMub3JnJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uUHJvdG90eXBlICYmIHdpbi5Qcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLlByb3RvdHlwZS5WZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTY3JpcHRhY3Vsb3VzJzoge1xuICAgICAgICBpY29uOiAnc2NyaXB0YWN1bG91cycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9zY3JpcHQuYWN1bG8udXMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5TY3JpcHRhY3Vsb3VzICYmIHdpbi5TY3JpcHRhY3Vsb3VzLmxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uU2NyaXB0YWN1bG91cy5WZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdNb29Ub29scyc6IHtcbiAgICAgICAgaWNvbjogJ21vb3Rvb2xzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL21vb3Rvb2xzLm5ldCcsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLk1vb1Rvb2xzICYmIHdpbi5Nb29Ub29scy5idWlsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5Nb29Ub29scy52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTcHJ5Jzoge1xuICAgICAgICBpY29uOiAnc3ByeScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9sYWJzLmFkb2JlLmNvbS90ZWNobm9sb2dpZXMvc3ByeScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5TcHJ5ICYmIHdpbi5TcHJ5LkRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnWVVJIDInOiB7XG4gICAgICAgIGljb246ICd5dWknLFxuICAgICAgICB1cmw6ICdodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvMi8nLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uWUFIT08gJiYgd2luLllBSE9PLnV0aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uWUFIT08uVkVSU0lPTiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnWVVJIDMnOiB7XG4gICAgICAgIGljb246ICd5dWkzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3l1aWxpYnJhcnkuY29tLycsXG4gICAgICAgIG5wbTogJ3l1aScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5ZVUkgJiYgd2luLllVSS5FbnYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uWVVJLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1Fvb3hkb28nOiB7XG4gICAgICAgIGljb246ICdxb294ZG9vJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3Fvb3hkb28ub3JnJyxcbiAgICAgICAgbnBtOiAncW9veGRvbycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLnF4ICYmIHdpbi5xeC5Cb290c3RyYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnRXh0IEpTJzoge1xuICAgICAgICBpY29uOiAnZXh0anMnLFxuICAgICAgICB1cmw6ICdodHRwOi8vd3d3LnNlbmNoYS5jb20vcHJvZHVjdHMvZXh0anMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uRXh0ICYmIHdpbi5FeHQudmVyc2lvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uRXh0LnZlcnNpb25zLmNvcmUudmVyc2lvbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZih3aW4uRXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkV4dC52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdiYXNlMic6IHtcbiAgICAgICAgaWNvbjogJ2Jhc2UyJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Jhc2UyJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uYmFzZTIgJiYgd2luLmJhc2UyLmRvbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5iYXNlMi52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdDbG9zdXJlIExpYnJhcnknOiB7XG4gICAgICAgIGljb246ICdjbG9zdXJlJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vY2xvc3VyZS9saWJyYXJ5JyxcbiAgICAgICAgbnBtOiAnZ29vZ2xlLWNsb3N1cmUtbGlicmFyeScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLmdvb2cgJiYgd2luLmdvb2cucHJvdmlkZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdSYXBoYSZldW1sO2wnOiB7XG4gICAgICAgIGljb246ICdyYXBoYWVsJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2RtaXRyeWJhcmFub3Zza2l5LmdpdGh1Yi5pby9yYXBoYWVsJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLlJhcGhhZWwgJiYgd2luLlJhcGhhZWwuY2lyY2xlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLlJhcGhhZWwudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnUmVhY3QnOiB7XG4gICAgICAgIGljb246ICdyZWFjdCcsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0LycsXG4gICAgICAgIG5wbTogJ3JlYWN0JyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICB2YXIgcmVhY3RSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LXJvb3QnKTtcbiAgICAgICAgICAgIHZhciBhbHRIYXNSZWFjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJypbZGF0YS1yZWFjdHJvb3RdJyk7XG4gICAgICAgICAgICBpZiAocmVhY3RSb290ICYmIHJlYWN0Um9vdC5pbm5lclRleHQubGVuZ3RoID4gMCB8fCBhbHRIYXNSZWFjdCB8fCB3aW4uUmVhY3QgJiYgd2luLlJlYWN0LkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5SZWFjdCAmJiB3aW4uUmVhY3QudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnTW9kZXJuaXpyJzoge1xuICAgICAgICBpY29uOiAnbW9kZXJuaXpyJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5tb2Rlcm5penIuY29tJyxcbiAgICAgICAgbnBtOiAnbW9kZXJuaXpyJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLk1vZGVybml6ciAmJiB3aW4uTW9kZXJuaXpyLmFkZFRlc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uTW9kZXJuaXpyLl92ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdQcm9jZXNzaW5nLmpzJzoge1xuICAgICAgICBpY29uOiAncHJvY2Vzc2luZ2pzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3Byb2Nlc3Npbmdqcy5vcmcnLFxuICAgICAgICBucG06ICdwcm9jZXNzaW5nLWpzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uUHJvY2Vzc2luZyAmJiB3aW4uUHJvY2Vzc2luZy5ib3gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBQcm9jZXNzaW5nLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0JhY2tib25lJzoge1xuICAgICAgICBpY29uOiAnYmFja2JvbmUnLFxuICAgICAgICB1cmw6ICdodHRwOi8vYmFja2JvbmVqcy5vcmcvJyxcbiAgICAgICAgbnBtOiAnYmFja2JvbmUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uQmFja2JvbmUgJiYgd2luLkJhY2tib25lLk1vZGVsLmV4dGVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogd2luLkJhY2tib25lLlZFUlNJT04gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnTGVhZmxldCc6IHtcbiAgICAgICAgaWNvbjogJ2xlYWZsZXQnLFxuICAgICAgICB1cmw6ICdodHRwOi8vbGVhZmxldGpzLmNvbScsXG4gICAgICAgIG5wbTogJ2xlYWZsZXQnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIC8vIExlYWZsZXQgMy4xIHVzZXMgTC5NYXJrZXIgYW5kIEwuVkVSU0lPTjsgbGF0ZXIgdmVyc2lvbnMgdXNlIEwubWFya2VyIGFuZCBMLnZlcnNpb25cbiAgICAgICAgICAgIGlmICh3aW4uTCAmJiB3aW4uTC5HZW9KU09OICYmICh3aW4uTC5tYXJrZXIgfHwgd2luLkwuTWFya2VyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5MLnZlcnNpb24gfHwgd2luLkwuVkVSU0lPTiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnTWFwYm94Jzoge1xuICAgICAgICBpY29uOiAnbWFwYm94JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL21hcGJveC5jb20nLFxuICAgICAgICBucG06ICdtYXBib3gtZ2wnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uTCAmJiB3aW4uTC5tYXBib3ggJiYgd2luLkwubWFwYm94Lmdlb2NvZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkwubWFwYm94LlZFUlNJT04gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0xvLURhc2gnOiB7XG4gICAgICAgIGljb246ICdsb2Rhc2gnLFxuICAgICAgICB1cmw6ICdodHRwOi8vbG9kYXNoLmNvbS8nLFxuICAgICAgICBucG06ICdsb2Rhc2gnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBfID0gdHlwZW9mIChfID0gd2luLl8pID09ICdmdW5jdGlvbicgJiYgXyxcbiAgICAgICAgICAgICAgICBjaGFpbiA9IHR5cGVvZiAoY2hhaW4gPSBfICYmIF8uY2hhaW4pID09ICdmdW5jdGlvbicgJiYgY2hhaW4sXG4gICAgICAgICAgICAgICAgd3JhcHBlciA9IChjaGFpbiB8fCBfIHx8IGZ1bmN0aW9uKCkgeyByZXR1cm4ge307IH0pKDEpO1xuXG4gICAgICAgICAgICBpZiAoXyAmJiB3cmFwcGVyLl9fd3JhcHBlZF9fKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogXy5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdVbmRlcnNjb3JlJzoge1xuICAgICAgICBpY29uOiAndW5kZXJzY29yZScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly91bmRlcnNjb3JlanMub3JnLycsXG4gICAgICAgIG5wbTogJ3VuZGVyc2NvcmUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uXyAmJiB0eXBlb2Ygd2luLl8udGFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICAgICAgIWQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlX0xpYnJhcnlEZXRlY3RvclRlc3RzWydMby1EYXNoJ10udGVzdCh3aW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiB3aW4uXy5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1NhbW15Jzoge1xuICAgICAgICBpY29uOiAnc2FtbXknLFxuICAgICAgICB1cmw6ICdodHRwOi8vc2FtbXlqcy5vcmcnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uU2FtbXkgJiYgd2luLlNhbW15LkFwcGxpY2F0aW9uLmN1cnJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiB3aW4uU2FtbXkuVkVSU0lPTiB8fCBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdSaWNvJzoge1xuICAgICAgICBpY29uOiAncmljbycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9vcGVucmljby5zb3VyY2Vmb3JnZS5uZXQvZXhhbXBsZXMvaW5kZXguaHRtbCcsXG4gICAgICAgIHRlc3Q6ICBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uUmljbyAmJiB3aW5kb3cuUmljby5jaGVja0lmQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IHdpbi5SaWNvLlZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnTW9jaGlLaXQnOiB7XG4gICAgICAgIGljb246ICdtb2NoaWtpdCcsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vbW9jaGkuZ2l0aHViLmlvL21vY2hpa2l0LycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5Nb2NoaUtpdCAmJiB3aW4uTW9jaGlLaXQuQmFzZS5tb2R1bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IE1vY2hpS2l0LlZFUlNJT04gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnZ1JhcGhhJmV1bWw7bCc6IHtcbiAgICAgICAgaWNvbjogJ2dyYXBoYWVsJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2cucmFwaGFlbGpzLmNvbScsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5SYXBoYWVsICYmIHdpbi5SYXBoYWVsLmZuLmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0dsb3cnOiB7XG4gICAgICAgIGljb246ICdnbG93JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5iYmMuY28udWsvZ2xvdycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5nbG9hZGVyICYmIHdpbi5nbG9hZGVyLmdldFJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2luLmdsb3cgJiYgd2luLmdsb3cuZG9tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiB3aW4uZ2xvdy5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aW4uR2xvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogd2luLkdsb3cudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTb2NrZXQuSU8nOiB7XG4gICAgICAgIGljb246ICdzb2NrZXRpbycsIC8vIGN1cnJlbnRseSBoYXMgbm8gaWNvblxuICAgICAgICB1cmw6ICdodHRwOi8vc29ja2V0LmlvJyxcbiAgICAgICAgbnBtOiAnc29ja2V0LmlvJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICAvLyB2ZXJzaW9uIDAuNi4yIHVzZXMgb25seSBpby5Tb2NrZXQ7IG1vcmUgcmVjZW50IHZlcnNpb25zIGFsc28gaGF2ZSBpby5zb2NrZXRzXG4gICAgICAgICAgICBpZiAod2luLmlvICYmICh3aW4uaW8uc29ja2V0cyB8fCB3aW4uaW8uU29ja2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogd2luLmlvLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnTXVzdGFjaGUnOiB7XG4gICAgICAgIGljb246ICdtdXN0YWNoZScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9tdXN0YWNoZS5naXRodWIuY29tJyxcbiAgICAgICAgbnBtOiAnbXVzdGFjaGUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uTXVzdGFjaGUgJiYgd2luLk11c3RhY2hlLnRvX2h0bWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IHdpbi5NdXN0YWNoZS52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0ZhYnJpYy5qcyc6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICAgdXJsOiAnaHR0cDovL2ZhYnJpY2pzLmNvbS8nLFxuICAgICAgICBucG06ICdmYWJyaWMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uZmFicmljICYmIHdpbi5mYWJyaWMudXRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogd2luLmZhYnJpYy52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0Z1c2VKUyc6IHtcbiAgICAgICAgaWNvbjogJ2Z1c2VqcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9mdXNlanMuaW8vJyxcbiAgICAgICAgbnBtOiAnZnVzZS5qcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5GdXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdUd2Vlbi5qcyc6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICAgdXJsOiAnaHR0cHM6Ly9naXRodWIuY29tL3NvbGUvdHdlZW4uanMnLFxuICAgICAgICBucG06ICd0d2Vlbi5qcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5UV0VFTiAmJiB3aW4uVFdFRU4uRWFzaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTcHJvdXRDb3JlJzoge1xuICAgICAgIGljb246ICdzcHJvdXRjb3JlJyxcbiAgICAgICB1cmw6ICdodHRwOi8vd3d3LnNwcm91dGNvcmUuY29tJyxcbiAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgaWYgKHdpbi5TQyAmJiB3aW4uU0MuQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnWmVwdG8uanMnOiB7XG4gICAgICAgaWNvbjogJ3plcHRvJyxcbiAgICAgICB1cmw6ICdodHRwOi8vemVwdG9qcy5jb20nLFxuICAgICAgIG5wbTogJ3plcHRvJyxcbiAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgaWYgKHdpbi5aZXB0byAmJiB3aW4uWmVwdG8uZm4pIHtcbiAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAndGhyZWUuanMnOiB7XG4gICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICB1cmw6ICdodHRwOi8vdGhyZWVqcy5vcmcvJyxcbiAgICAgICBucG06ICd0aHJlZScsXG4gICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgIGlmICh3aW4uVEhSRUUgJiYgd2luLlRIUkVFLlJFVklTSU9OKSB7XG4gICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246ICdyJyArIHdpbi5USFJFRS5SRVZJU0lPTn07XG4gICAgICAgICAgIH1cbiAgICAgICAgICAgZWxzZSBpZiAod2luLlRIUkVFKSB7XG4gICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgIH1cbiAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1BoaWxvR0wnOiB7XG4gICAgICAgaWNvbjogJ3BoaWxvZ2wnLFxuICAgICAgIHVybDogJ2h0dHA6Ly93d3cuc2VuY2hhbGFicy5vcmcvcGhpbG9nbC8nLFxuICAgICAgIG5wbTogJ3BoaWxvZ2wnLFxuICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICBpZiAod2luLlBoaWxvR0wgJiYgd2luLlBoaWxvR0wuQ2FtZXJhKSB7XG4gICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IHdpbi5QaGlsb0dMLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnQ2FtYW5KUyc6IHtcbiAgICAgICAgaWNvbjogJ2NhbWFuanMnLFxuICAgICAgICB1cmw6ICdodHRwOi8vY2FtYW5qcy5jb20vJyxcbiAgICAgICAgbnBtOiAnY2FtYW4nLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uQ2FtYW4gJiYgd2luLkNhbWFuLnZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IHdpbi5DYW1hbi52ZXJzaW9uLnJlbGVhc2V9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2luLkNhbWFuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICd5ZXBub3BlJzoge1xuICAgICAgICBpY29uOiAneWVwbm9wZScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly95ZXBub3BlanMuY29tLycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi55ZXBub3BlICYmIHdpbi55ZXBub3BlLmluamVjdEpzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdMQUJqcyc6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLFxuICAgICAgICB1cmw6ICdodHRwOi8vbGFianMuY29tLycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi4kTEFCICYmIHdpbi4kTEFCLnNldE9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0hlYWQgSlMnOiB7XG4gICAgICAgIGljb246ICdoZWFkanMnLFxuICAgICAgICB1cmw6ICdodHRwOi8vaGVhZGpzLmNvbS8nLFxuICAgICAgICBucG06ICdoZWFkanMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uaGVhZCAmJiB3aW4uaGVhZC5qcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnQ29udHJvbEpTJzoge1xuICAgICAgICBpY29uOiAnaWNvbl80OCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9zdGV2ZXNvdWRlcnMuY29tL2NvbnRyb2xqcy8nLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uQ0pTICYmIHdpbi5DSlMuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1JlcXVpcmVKUyc6IHtcbiAgICAgICAgaWNvbjogJ3JlcXVpcmVqcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9yZXF1aXJlanMub3JnLycsXG4gICAgICAgIG5wbTogJ3JlcXVpcmVqcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgdmFyIHJlcSA9IHdpbi5yZXF1aXJlIHx8IHdpbi5yZXF1aXJlanM7XG4gICAgICAgICAgICBpZiAocmVxICYmIChyZXEubG9hZCB8fCAocmVxLnMgJiYgcmVxLnMuY29udGV4dHMgJiYgcmVxLnMuY29udGV4dHMuXyAmJiAocmVxLnMuY29udGV4dHMuXy5sb2FkZWQgfHwgcmVxLnMuY29udGV4dHMuXy5sb2FkKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogcmVxLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1JpZ2h0SlMnOiB7XG4gICAgICAgIGljb246ICdyaWdodGpzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3JpZ2h0anMub3JnLycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5SaWdodEpTICYmIHdpbi5SaWdodEpTLmlzTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5SaWdodEpTLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ2pRdWVyeSBUb29scyc6IHtcbiAgICAgICBpY29uOiAnanF1ZXJ5dG9vbHMnLFxuICAgICAgIHVybDogJ2h0dHA6Ly9qcXVlcnl0b29scy5naXRodWIuaW8vJyxcbiAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBqcSA9IHdpbi5qUXVlcnkgfHwgd2luLiQ7XG4gICAgICAgICAgICBpZihqcSAmJiBqcS50b29scykge1xuICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjoganEudG9vbHMudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnUHVzaGVyJzoge1xuICAgICAgIGljb246ICdwdXNoZXInLFxuICAgICAgIHVybDogJ2h0dHA6Ly9wdXNoZXIuY29tL2RvY3MvcHVzaGVyX2pzLycsXG4gICAgICAgbnBtOiAncHVzaGVyLWpzJyxcbiAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5QdXNoZXIgJiYgd2luLlB1c2hlci5DaGFubmVsKSB7XG4gICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uUHVzaGVyLlZFUlNJT04gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgIH1cbiAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1BhcGVyLmpzJzoge1xuICAgICAgIGljb246ICdwYXBlcmpzJyxcbiAgICAgICB1cmw6ICdodHRwOi8vcGFwZXJqcy5vcmcvJyxcbiAgICAgICBucG06ICdwYXBlcicsXG4gICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4ucGFwZXIgJiYgd2luLnBhcGVyLlBvaW50KSB7XG4gICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4ucGFwZXIudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnU3dpZmZ5Jzoge1xuICAgICAgIGljb246ICdpY29uXzQ4JyxcbiAgICAgICB1cmw6ICdodHRwOi8vd3d3Lmdvb2dsZS5jb20vZG91YmxlY2xpY2svc3R1ZGlvL3N3aWZmeS8nLFxuICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLnN3aWZmeSAmJiB3aW4uc3dpZmZ5LlN0YWdlKSB7XG4gICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnTW92ZSc6IHtcbiAgICAgICBpY29uOiAnbW92ZScsXG4gICAgICAgdXJsOiAnaHR0cHM6Ly9naXRodWIuY29tL3JzbXMvbW92ZScsXG4gICAgICAgbnBtOiAnbW92ZScsXG4gICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4ubW92ZSAmJiB3aW4ubW92ZS5jb21waWxlKSB7XG4gICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4ubW92ZS52ZXJzaW9uKCkgfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgIH1cbiAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0FtcGxpZnlKUyc6IHtcbiAgICAgICBpY29uOiAnYW1wbGlmeWpzJyxcbiAgICAgICB1cmw6ICdodHRwOi8vYW1wbGlmeWpzLmNvbS8nLFxuICAgICAgIG5wbTogJ2FtcGxpZnlqcycsXG4gICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uYW1wbGlmeSAmJiB3aW4uYW1wbGlmeS5wdWJsaXNoKSB7XG4gICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnUG9wY29ybi5qcyc6IHtcbiAgICAgICBpY29uOiAncG9wY29ybmpzJyxcbiAgICAgICB1cmw6ICdodHRwOi8vcG9wY29ybmpzLm9yZy8nLFxuICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5Qb3Bjb3JuICYmIHdpbi5Qb3Bjb3JuLkV2ZW50cykge1xuICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLlBvcGNvcm4udmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgfVxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgIH0sXG5cbiAgICAnRDMnOiB7XG4gICAgICAgIGljb246ICdkMycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9kM2pzLm9yZycsXG4gICAgICAgIG5wbTogJ2QzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLmQzICYmIHdpbi5kMy5zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uZDMudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnSGFuZGxlYmFycyc6IHtcbiAgICAgICAgaWNvbjogJ2hhbmRsZWJhcnMnLFxuICAgICAgICB1cmw6ICdodHRwOi8vaGFuZGxlYmFyc2pzLmNvbS8nLFxuICAgICAgICBucG06ICdoYW5kbGViYXJzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uSGFuZGxlYmFycyAmJiB3aW4uSGFuZGxlYmFycy5jb21waWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkhhbmRsZWJhcnMuVkVSU0lPTiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnS25vY2tvdXQnOiB7XG4gICAgICAgIGljb246ICdrbm9ja291dCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9rbm9ja291dGpzLmNvbS8nLFxuICAgICAgICBucG06ICdrbm9ja291dCcsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5rbyAmJiB3aW4ua28uYXBwbHlCaW5kaW5ncykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5rby52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTcGluZSc6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLFxuICAgICAgICB1cmw6ICdodHRwOi8vc3BpbmVqcy5jb20vJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLlNwaW5lICYmIHdpbi5TcGluZS5Db250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiB3aW4uU3BpbmUudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT059O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdqUXVlcnkgTW9iaWxlJzoge1xuICAgICAgICBpY29uOiAnanF1ZXJ5X21vYmlsZScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9qcXVlcnltb2JpbGUuY29tLycsXG4gICAgICAgIG5wbTogJ2pxdWVyeS1tb2JpbGUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBqcSA9IHdpbi5qUXVlcnkgfHwgd2luLiQgfHwgd2luLiRqcSB8fCB3aW4uJGo7XG4gICAgICAgICAgICBpZihqcSAmJiBqcS5mbiAmJiBqcS5mbi5qcXVlcnkgJiYganEubW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjoganEubW9iaWxlLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1dlYkZvbnQgTG9hZGVyJzoge1xuICAgICAgICBpY29uOiAnaWNvbl80OCcsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS90eXBla2l0L3dlYmZvbnRsb2FkZXInLFxuICAgICAgICBucG06ICd3ZWJmb250bG9hZGVyJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uV2ViRm9udCAmJiB3aW4uV2ViRm9udC5sb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0FuZ3VsYXInOiB7XG4gICAgICAgIGljb246ICdhbmd1bGFyJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly9hbmd1bGFyLmlvLycsXG4gICAgICAgIG5wbTogJ0Bhbmd1bGFyL2NvcmUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBuZyA9IHdpbi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmctdmVyc2lvbl0nKTtcbiAgICAgICAgICAgIGlmIChuZykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IG5nLmdldEF0dHJpYnV0ZSgnbmctdmVyc2lvbicpIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdBbmd1bGFySlMnOiB7XG4gICAgICAgIGljb246ICdhbmd1bGFyanMnLFxuICAgICAgICB1cmw6ICdodHRwOi8vYW5ndWxhcmpzLm9yZycsXG4gICAgICAgIG5wbTogJ2FuZ3VsYXInLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBuZyA9IHdpbi5hbmd1bGFyO1xuICAgICAgICAgICAgaWYobmcgJiYgbmcudmVyc2lvbiAmJiBuZy52ZXJzaW9uLmZ1bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBuZy52ZXJzaW9uLmZ1bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0VtYmVyLmpzJzoge1xuICAgICAgICBpY29uOiAnZW1iZXJqcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9lbWJlcmpzLmNvbS8nLFxuICAgICAgICBucG06ICdlbWJlci1zb3VyY2UnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBlbWJlciA9IHdpbi5FbWJlciB8fCB3aW4uRW07XG4gICAgICAgICAgICBpZiAoZW1iZXIgJiYgZW1iZXIucHJvcGVydHlEaWRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBlbWJlci5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdIYW1tZXIuanMnOiB7XG4gICAgICAgIGljb246ICdoYW1tZXJqcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9laWdodG1lZGlhLmdpdGh1Yi5pby9oYW1tZXIuanMvJyxcbiAgICAgICAgbnBtOiAnaGFtbWVyanMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5IYW1tZXIgJiYgd2luLkhhbW1lci5QaW5jaCkge1xuICAgICAgICAgICAgICAgIC8vIEhhbW1lci5WRVJTSU9OIGF2YWlsYWJsZSBpbiAxLjAuMTArXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkhhbW1lci5WRVJTSU9OIHx8IFwiJmx0OyAxLjAuMTBcIiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdWaXNpYmlsaXR5LmpzJzoge1xuICAgICAgICBpY29uOiAnaWNvbl80OCcsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9haS92aXNpYmlsaXR5anMnLFxuICAgICAgICBucG06ICd2aXNpYmlsaXR5anMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5WaXNpYmlsaXR5ICYmIHdpbi5WaXNpYmlsaXR5LmV2ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1ZlbG9jaXR5LmpzJzoge1xuICAgICAgICBpY29uOiAnaWNvbl80OCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly92ZWxvY2l0eWpzLm9yZy8nLFxuICAgICAgICBucG06ICd2ZWxvY2l0eS1hbmltYXRlJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICB2YXIganEgPSB3aW4ualF1ZXJ5IHx8IHdpbi4kLFxuICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0ganEgPyBqcS5WZWxvY2l0eSA6IHdpbi5WZWxvY2l0eTtcblxuICAgICAgICAgICAgaWYodmVsb2NpdHkgJiYgdmVsb2NpdHkuUmVnaXN0ZXJFZmZlY3QgJiYgdmVsb2NpdHkudmVyc2lvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eS52ZXJzaW9uLm1ham9yICsgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkudmVyc2lvbi5taW5vciArIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5LnZlcnNpb24ucGF0Y2hcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmVsb2NpdHkgJiYgdmVsb2NpdHkuUmVnaXN0ZXJFZmZlY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnSWZWaXNpYmxlLmpzJzoge1xuICAgICAgICBpY29uOiAnaWNvbl80OCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9zZXJrYW55ZXJzZW4uZ2l0aHViLmlvL2lmdmlzaWJsZS5qcy8nLFxuICAgICAgICBucG06ICdpZnZpc2libGUuanMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBpdiA9IHdpbi5pZnZpc2libGU7XG4gICAgICAgICAgICBpZihpdiAmJiBpdi5fX2NlR1VJRCA9PT0gXCJpZnZpc2libGUub2JqZWN0LmV2ZW50LmlkZW50aWZpZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnUGl4aS5qcyc6IHtcbiAgICAgICAgaWNvbjogJ3BpeGknLFxuICAgICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vR29vZEJveURpZ2l0YWwvcGl4aS5qcycsXG4gICAgICAgIG5wbTogJ3BpeGkuanMnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIHZhciBweCA9IHdpbi5QSVhJO1xuICAgICAgICAgICAgaWYocHggJiYgcHguV2ViR0xSZW5kZXJlciAmJiBweC5WRVJTSU9OKSB7XG4gICAgICAgICAgICAgICAgLy8gdmVyc2lvbiA0LjQuMyByZXR1cm5zIHNpbXBseSBcIjQuNC4zXCI7IHZlcnNpb24gMS41LjIgcmV0dXJucyBcInYxLjUuMlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogcHguVkVSU0lPTi5yZXBsYWNlKCd2JywgJycpIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnREMuanMnOiB7XG4gICAgICAgIGljb246ICdpY29uXzQ4JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2RjLWpzLmdpdGh1Yi5pby9kYy5qcy8nLFxuICAgICAgICBucG06ICdkYycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgdmFyIGRjID0gd2luLmRjO1xuICAgICAgICAgICAgaWYoZGMgJiYgZGMucmVnaXN0ZXJDaGFydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IGRjLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdHcmVlblNvY2sgSlMnOiB7XG4gICAgICAgIGljb246ICdncmVlbnNvY2snLFxuICAgICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vZ3JlZW5zb2NrL0dyZWVuU29jay1KUycsXG4gICAgICAgIG5wbTogJ2dzYXAnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uVHdlZW5NYXggJiYgd2luLlR3ZWVuTWF4LnBhdXNlQWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLlR3ZWVuTWF4LnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ0Zhc3RDbGljayc6IHtcbiAgICAgICAgaWNvbjogJ2Zhc3RjbGljaycsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9mdGxhYnMvZmFzdGNsaWNrJyxcbiAgICAgICAgbnBtOiAnZmFzdGNsaWNrJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uRmFzdENsaWNrICYmIHdpbi5GYXN0Q2xpY2subm90TmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogVU5LTk9XTl9WRVJTSU9OIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ0lzb3RvcGUnOiB7XG4gICAgICAgIGljb246ICdpc290b3BlJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2lzb3RvcGUubWV0YWZpenp5LmNvLycsXG4gICAgICAgIG5wbTogJ2lzb3RvcGUtbGF5b3V0JyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZih3aW4uSXNvdG9wZSB8fCAod2luLiQgIT0gbnVsbCAmJiB3aW4uJC5Jc290b3BlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdNYXJpb25ldHRlJzoge1xuICAgICAgICBpY29uOiAnbWFyaW9uZXR0ZScsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9tYXJpb25ldHRlanMuY29tLycsXG4gICAgICAgIG5wbTogJ2JhY2tib25lLm1hcmlvbmV0dGUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5NYXJpb25ldHRlICYmIHdpbi5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLk1hcmlvbmV0dGUuVkVSU0lPTiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ0Nhbic6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLFxuICAgICAgICB1cmw6ICdodHRwOi8vY2FuanMuY29tLycsXG4gICAgICAgIG5wbTogJ2NhbicsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uICh3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uY2FuICYmIHdpbi5jYW4uQ29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLmNhbi5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnVnVlJzoge1xuICAgICAgICBpY29uOiAndnVlJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3Z1ZWpzLm9yZy8nLFxuICAgICAgICBucG06ICd2dWUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uVnVlICYmIHdpbi5WdWUubmV4dFRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uVnVlLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdUd28nOiB7XG4gICAgICAgIGljb246ICd0d28nLFxuICAgICAgICB1cmw6ICdodHRwczovL2pvbm9icjEuZ2l0aHViLmlvL3R3by5qcycsXG4gICAgICAgIG5wbTogJ3R3by5qcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5Ud28gJiYgd2luLlR3by5VdGlscykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5Ud28uVmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ0JyZXdzZXInOiB7XG4gICAgICAgIGljb246ICdicmV3c2VyJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL2hhbmRjcmFmdGVkbGRuLmdpdGh1Yi5pby9icmV3c2VyLycsXG4gICAgICAgIG5wbTogJ2JyZXdzZXInLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5CUkVXU0VSICYmIHdpbi5CUkVXU0VSLnVhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogQlJFV1NFUi5WRVJTSU9OIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnTWF0ZXJpYWwgRGVzaWduIExpdGUnOiB7XG4gICAgXHRpY29uOiAnbWRsJyxcbiAgICBcdHVybDogJ2h0dHA6Ly93d3cuZ2V0bWRsLmlvLycsXG4gICAgICAgIG5wbTogJ21hdGVyaWFsLWRlc2lnbi1saXRlJyxcbiAgICBcdHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgIFx0XHRpZih3aW4uY29tcG9uZW50SGFuZGxlciAmJiB3aW4uY29tcG9uZW50SGFuZGxlci51cGdyYWRlRWxlbWVudCkge1xuICAgIFx0XHRcdHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgXHRcdH1cbiAgICBcdFx0cmV0dXJuIGZhbHNlO1xuICAgIFx0fVxuICAgIH0sXG4gICAgJ0tlbmRvIFVJJzoge1xuICAgICAgICBpY29uOiAna2VuZG91aScsXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS90ZWxlcmlrL2tlbmRvLXVpLWNvcmUnLFxuICAgICAgICBucG06ICdrZW5kby11aS1jb3JlJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLmtlbmRvICYmIHdpbi5rZW5kby5WaWV3ICYmIHdpbi5rZW5kby5WaWV3LmV4dGVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7dmVyc2lvbjogd2luLmtlbmRvLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ01hdHRlci5qcyc6IHtcbiAgICAgICAgaWNvbjogJ21hdHRlci1qcycsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9icm0uaW8vbWF0dGVyLWpzLycsXG4gICAgICAgIG5wbTogJ21hdHRlci1qcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYgKHdpbi5NYXR0ZXIgJiYgd2luLk1hdHRlci5FbmdpbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3ZlcnNpb246IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdSaW90Jzoge1xuICAgICAgICBpY29uOiAncmlvdCcsXG4gICAgICAgIHVybDogJ2h0dHA6Ly9yaW90anMuY29tLycsXG4gICAgICAgIG5wbTogJ3Jpb3QnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4ucmlvdCAmJiB3aW4ucmlvdC5taXhpbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5yaW90LnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdTZWEuanMnOiB7XG4gICAgICAgIGljb246ICdpY29uXzQ4JyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3NlYWpzLm9yZy8nLFxuICAgICAgICBucG06ICdzZWFqcycsXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHdpbikge1xuICAgICAgICAgICAgaWYod2luLnNlYWpzICYmIHdpbi5zZWFqcy51c2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uc2VhanMudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ01vbWVudC5qcyc6IHtcbiAgICAgICAgaWNvbjogJ21vbWVudGpzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL21vbWVudGpzLmNvbS8nLFxuICAgICAgICBucG06ICdtb21lbnQnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmKHdpbi5tb21lbnQgJiYgKHdpbi5tb21lbnQuaXNNb21lbnQgfHwgd2luLm1vbWVudC5sYW5nKSkge1xuICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gMS4wLjAgaGFzIG5laXRoZXIgXCJpc01vbWVudFwiIG5vciBcInZlcnNpb25cIlxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5tb21lbnQudmVyc2lvbiB8fCBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ01vbWVudCBUaW1lem9uZSc6IHtcbiAgICAgICAgaWNvbjogJ21vbWVudGpzJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL21vbWVudGpzLmNvbS90aW1lem9uZS8nLFxuICAgICAgICBucG06ICdtb21lbnQtdGltZXpvbmUnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4ubW9tZW50ICYmIHdpbi5tb21lbnQudHopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4ubW9tZW50LnR6LnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdTY3JvbGxNYWdpYyc6IHtcbiAgICAgICAgaWNvbjogJ3Njcm9sbG1hZ2ljJyxcbiAgICAgICAgdXJsOiAnaHR0cDovL3Njcm9sbG1hZ2ljLmlvLycsXG4gICAgICAgIG5wbTogJ3Njcm9sbG1hZ2ljJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLlNjcm9sbE1hZ2ljICYmIHdpbi5TY3JvbGxNYWdpYy5Db250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt2ZXJzaW9uOiBTY3JvbGxNYWdpYy52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTn07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdTV0ZPYmplY3QnOiB7XG4gICAgICAgIGljb246ICdpY29uXzQ4JywgLy8gY3VycmVudGx5IGhhcyBubyBpY29uXG4gICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9zd2ZvYmplY3Qvc3dmb2JqZWN0JyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLnN3Zm9iamVjdCAmJiB3aW4uc3dmb2JqZWN0LmVtYmVkU1dGKSB7XG4gICAgICAgICAgICAgICAgLy8gMi54IC0gZXhhY3QgdmVyc2lvbiBvbmx5IGZvciAyLjNcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiB3aW4uc3dmb2JqZWN0LnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYod2luLmRlY29uY2VwdCAmJiB3aW4uZGVjb25jZXB0LlNXRk9iamVjdCkge1xuICAgICAgICAgICAgICAgIC8vIDEueFxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnRmxleFNsaWRlcic6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICAgdXJsOiAnaHR0cHM6Ly93b29jb21tZXJjZS5jb20vZmxleHNsaWRlci8nLFxuICAgICAgICBucG06ICdmbGV4c2xpZGVyJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICB2YXIganEgPSB3aW4ualF1ZXJ5IHx8IHdpbi4kIHx8IHdpbi4kanEgfHwgd2luLiRqO1xuICAgICAgICAgICAgaWYgKGpxICYmIGpxLmZuICYmIGpxLmZuLmpxdWVyeSAmJiBqcS5mbGV4c2xpZGVyKXtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJzaW9uOiBVTktOT1dOX1ZFUlNJT04gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgJ1NQRic6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICAgdXJsOiAnaHR0cHM6Ly95b3V0dWJlLmdpdGh1Yi5pby9zcGZqcy8nLFxuICAgICAgICBucG06ICdzcGYnLFxuICAgICAgICB0ZXN0OiBmdW5jdGlvbih3aW4pIHtcbiAgICAgICAgICAgIGlmICh3aW4uc3BmICYmIHdpbi5zcGYuaW5pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnTnVtZXJhbC5qcyc6IHtcbiAgICAgICAgaWNvbjogJ2ljb25fNDgnLCAvLyBjdXJyZW50bHkgaGFzIG5vIGljb25cbiAgICAgICAgdXJsOiAnaHR0cDovL251bWVyYWxqcy5jb20vJyxcbiAgICAgICAgbnBtOiAnbnVtZXJhbGpzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLm51bWVyYWwgJiYgd2luLmlzTnVtZXJhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5udW1lcmFsLnZlcnNpb24gfHwgVU5LTk9XTl9WRVJTSU9OIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgICdib29tZXJhbmcuanMnOiB7XG4gICAgICAgIGljb246ICdpY29uXzQ4JywgLy8gY3VycmVudGx5IGhhcyBubyBpY29uXG4gICAgICAgIHVybDogJ2h0dHBzOi8vc29hc3RhLmdpdGh1Yi5pby9ib29tZXJhbmcvZG9jLycsXG4gICAgICAgIG5wbTogJ2Jvb21lcmFuZ2pzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLkJPT01SICYmIHdpbi5CT09NUi51dGlscyAmJiB3aW4uQk9PTVIuaW5pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZlcnNpb246IHdpbi5CT09NUi52ZXJzaW9uIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAnRnJhbWVyJzoge1xuICAgICAgICBpY29uOiAnZnJhbWVyJyxcbiAgICAgICAgdXJsOiAnaHR0cHM6Ly9mcmFtZXIuY29tLycsXG4gICAgICAgIG5wbTogJ2ZyYW1lcmpzJyxcbiAgICAgICAgdGVzdDogZnVuY3Rpb24od2luKSB7XG4gICAgICAgICAgICBpZiAod2luLkZyYW1lciAmJiB3aW4uRnJhbWVyLkxheWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyc2lvbjogd2luLkZyYW1lci5WZXJzaW9uLmJ1aWxkIHx8IFVOS05PV05fVkVSU0lPTiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufTtcbiI7ZnVuY3Rpb24gZGV0ZWN0TGlicmFyaWVzKCl7Y29uc3QgbGlicmFyaWVzPVtdO09iamVjdC5lbnRyaWVzKGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlX0xpYnJhcnlEZXRlY3RvclRlc3RzKS5mb3JFYWNoKChbbmFtZSxsaWJdKT0+e3RyeXtjb25zdCByZXN1bHQ9bGliLnRlc3Qod2luZG93KTtpZihyZXN1bHQpe2xpYnJhcmllcy5wdXNoKHtuYW1lOm5hbWUsdmVyc2lvbjpyZXN1bHQudmVyc2lvbixucG1Qa2dOYW1lOmxpYi5ucG19KTt9fWNhdGNoKGUpe319KTtyZXR1cm4gbGlicmFyaWVzO30KY2xhc3MgSlNMaWJyYXJpZXMgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGV4cHJlc3Npb249YChmdW5jdGlvbiAoKSB7CiAgICAgICR7bGliRGV0ZWN0b3JTb3VyY2V9OwogICAgICByZXR1cm4gKCR7ZGV0ZWN0TGlicmFyaWVzLnRvU3RyaW5nKCl9KCkpOwogICAgfSkoKWA7cmV0dXJuIHBhc3NDb250ZXh0LmRyaXZlci5ldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb24pO319Cm1vZHVsZS5leHBvcnRzPUpTTGlicmFyaWVzO30seyIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9kb2JldHRlcndlYi9vcHRpbWl6ZWQtaW1hZ2VzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4uL2dhdGhlcmVyJyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IE5ldHdvcmtSZXF1ZXN0PXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QnKTtjb25zdCBTZW50cnk9cmVxdWlyZSgnLi4vLi4vLi4vbGliL3NlbnRyeScpO2NvbnN0IERyaXZlcj1yZXF1aXJlKCcuLi8uLi9kcml2ZXIuanMnKTtjb25zdCBKUEVHX1FVQUxJVFk9MC45Mjtjb25zdCBXRUJQX1FVQUxJVFk9MC44NTtjb25zdCBNSU5JTVVNX0lNQUdFX1NJWkU9NDA5NjtmdW5jdGlvbiBnZXRPcHRpbWl6ZWROdW1CeXRlcyh1cmwpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7Y29uc3QgaW1nPW5ldyBJbWFnZSgpO2NvbnN0IGNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjb25zdCBjb250ZXh0PWNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO2lmKCFjb250ZXh0KXtyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcigndW5hYmxlIHRvIGNyZWF0ZSBjYW52YXMgY29udGV4dCcpKTt9CmZ1bmN0aW9uIGdldFR5cGVTdGF0cyh0eXBlLHF1YWxpdHkpe2NvbnN0IGRhdGFVUkk9Y2FudmFzLnRvRGF0YVVSTCh0eXBlLHF1YWxpdHkpO2NvbnN0IGJhc2U2ND1kYXRhVVJJLnNsaWNlKGRhdGFVUkkuaW5kZXhPZignLCcpKzEpO3JldHVybntiYXNlNjQ6YmFzZTY0Lmxlbmd0aCxiaW5hcnk6YXRvYihiYXNlNjQpLmxlbmd0aH07fQppbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLHJlamVjdCk7aW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCgpPT57dHJ5e2NhbnZhcy5oZWlnaHQ9aW1nLmhlaWdodDtjYW52YXMud2lkdGg9aW1nLndpZHRoO2NvbnRleHQuZHJhd0ltYWdlKGltZywwLDApO2NvbnN0IGpwZWc9Z2V0VHlwZVN0YXRzKCdpbWFnZS9qcGVnJywwLjkyKTtjb25zdCB3ZWJwPWdldFR5cGVTdGF0cygnaW1hZ2Uvd2VicCcsMC44NSk7cmVzb2x2ZSh7anBlZyx3ZWJwfSk7fWNhdGNoKGVycil7cmVqZWN0KGVycik7fX0sZmFsc2UpO2ltZy5zcmM9dXJsO30pO30KY2xhc3MgT3B0aW1pemVkSW1hZ2VzIGV4dGVuZHMgR2F0aGVyZXJ7c3RhdGljIGZpbHRlckltYWdlUmVxdWVzdHMocGFnZVVybCxuZXR3b3JrUmVjb3Jkcyl7Y29uc3Qgc2VlblVybHM9bmV3IFNldCgpO3JldHVybiBuZXR3b3JrUmVjb3Jkcy5yZWR1Y2UoKHByZXYscmVjb3JkKT0+e2lmKHNlZW5VcmxzLmhhcyhyZWNvcmQudXJsKXx8IXJlY29yZC5maW5pc2hlZCl7cmV0dXJuIHByZXY7fQpzZWVuVXJscy5hZGQocmVjb3JkLnVybCk7Y29uc3QgaXNPcHRpbWl6YWJsZUltYWdlPXJlY29yZC5yZXNvdXJjZVR5cGU9PT1OZXR3b3JrUmVxdWVzdC5UWVBFUy5JbWFnZSYmL2ltYWdlXC8ocG5nfGJtcHxqcGVnKS8udGVzdChyZWNvcmQubWltZVR5cGUpO2NvbnN0IGlzU2FtZU9yaWdpbj1VUkwub3JpZ2luc01hdGNoKHBhZ2VVcmwscmVjb3JkLnVybCk7Y29uc3QgaXNCYXNlNjREYXRhVXJpPS9eZGF0YTouezIsNDB9YmFzZTY0XHMqLC8udGVzdChyZWNvcmQudXJsKTtjb25zdCBhY3R1YWxSZXNvdXJjZVNpemU9TWF0aC5taW4ocmVjb3JkLnJlc291cmNlU2l6ZXx8MCxyZWNvcmQudHJhbnNmZXJTaXplfHwwKTtpZihpc09wdGltaXphYmxlSW1hZ2UmJmFjdHVhbFJlc291cmNlU2l6ZT5NSU5JTVVNX0lNQUdFX1NJWkUpe3ByZXYucHVzaCh7aXNTYW1lT3JpZ2luLGlzQmFzZTY0RGF0YVVyaSxyZXF1ZXN0SWQ6cmVjb3JkLnJlcXVlc3RJZCx1cmw6cmVjb3JkLnVybCxtaW1lVHlwZTpyZWNvcmQubWltZVR5cGUscmVzb3VyY2VTaXplOmFjdHVhbFJlc291cmNlU2l6ZX0pO30KcmV0dXJuIHByZXY7fSxbXSk7fQpfZ2V0RW5jb2RlZFJlc3BvbnNlKGRyaXZlcixyZXF1ZXN0SWQsZW5jb2Rpbmcpe3JlcXVlc3RJZD1OZXR3b3JrUmVxdWVzdC5nZXRSZXF1ZXN0SWRGb3JCYWNrZW5kKHJlcXVlc3RJZCk7Y29uc3QgcXVhbGl0eT1lbmNvZGluZz09PSdqcGVnJz9KUEVHX1FVQUxJVFk6V0VCUF9RVUFMSVRZO2NvbnN0IHBhcmFtcz17cmVxdWVzdElkLGVuY29kaW5nLHF1YWxpdHksc2l6ZU9ubHk6dHJ1ZX07cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnQXVkaXRzLmdldEVuY29kZWRSZXNwb25zZScscGFyYW1zKTt9CmNhbGN1bGF0ZUltYWdlU3RhdHMoZHJpdmVyLG5ldHdvcmtSZWNvcmQpe3JldHVybiBQcm9taXNlLnJlc29sdmUobmV0d29ya1JlY29yZC5yZXF1ZXN0SWQpLnRoZW4ocmVxdWVzdElkPT57aWYodGhpcy5fZ2V0RW5jb2RlZFJlc3BvbnNlVW5zdXBwb3J0ZWQpcmV0dXJuO3JldHVybiB0aGlzLl9nZXRFbmNvZGVkUmVzcG9uc2UoZHJpdmVyLHJlcXVlc3RJZCwnanBlZycpLnRoZW4oanBlZ0RhdGE9PntyZXR1cm4gdGhpcy5fZ2V0RW5jb2RlZFJlc3BvbnNlKGRyaXZlcixyZXF1ZXN0SWQsJ3dlYnAnKS50aGVuKHdlYnBEYXRhPT57cmV0dXJue2Zyb21Qcm90b2NvbDp0cnVlLG9yaWdpbmFsU2l6ZTpuZXR3b3JrUmVjb3JkLnJlc291cmNlU2l6ZSxqcGVnU2l6ZTpqcGVnRGF0YS5lbmNvZGVkU2l6ZSx3ZWJwU2l6ZTp3ZWJwRGF0YS5lbmNvZGVkU2l6ZX07fSk7fSkuY2F0Y2goZXJyPT57aWYoL3dhc24ndCBmb3VuZC8udGVzdChlcnIubWVzc2FnZSkpe3RoaXMuX2dldEVuY29kZWRSZXNwb25zZVVuc3VwcG9ydGVkPXRydWU7fWVsc2V7dGhyb3cgZXJyO319KTt9KS50aGVuKHJlc3VsdD0+e2lmKHJlc3VsdClyZXR1cm4gcmVzdWx0O2lmKCFuZXR3b3JrUmVjb3JkLmlzU2FtZU9yaWdpbiYmIW5ldHdvcmtSZWNvcmQuaXNCYXNlNjREYXRhVXJpKXJldHVybiBudWxsO2NvbnN0IHNjcmlwdD1gKCR7Z2V0T3B0aW1pemVkTnVtQnl0ZXMudG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkobmV0d29ya1JlY29yZC51cmwpfSlgO3JldHVybiBkcml2ZXIuZXZhbHVhdGVBc3luYyhzY3JpcHQpLnRoZW4oc3RhdHM9PntpZighc3RhdHMpcmV0dXJuIG51bGw7Y29uc3QgaXNCYXNlNjREYXRhVXJpPW5ldHdvcmtSZWNvcmQuaXNCYXNlNjREYXRhVXJpO2NvbnN0IGJhc2U2NExlbmd0aD1uZXR3b3JrUmVjb3JkLnVybC5sZW5ndGgtbmV0d29ya1JlY29yZC51cmwuaW5kZXhPZignLCcpLTE7cmV0dXJue2Zyb21Qcm90b2NvbDpmYWxzZSxvcmlnaW5hbFNpemU6aXNCYXNlNjREYXRhVXJpP2Jhc2U2NExlbmd0aDpuZXR3b3JrUmVjb3JkLnJlc291cmNlU2l6ZSxqcGVnU2l6ZTppc0Jhc2U2NERhdGFVcmk/c3RhdHMuanBlZy5iYXNlNjQ6c3RhdHMuanBlZy5iaW5hcnksd2VicFNpemU6aXNCYXNlNjREYXRhVXJpP3N0YXRzLndlYnAuYmFzZTY0OnN0YXRzLndlYnAuYmluYXJ5fTt9KTt9KTt9CmFzeW5jIGNvbXB1dGVPcHRpbWl6ZWRJbWFnZXMoZHJpdmVyLGltYWdlUmVjb3Jkcyl7Y29uc3QgcmVzdWx0cz1bXTtmb3IoY29uc3QgcmVjb3JkIG9mIGltYWdlUmVjb3Jkcyl7dHJ5e2NvbnN0IHN0YXRzPWF3YWl0IHRoaXMuY2FsY3VsYXRlSW1hZ2VTdGF0cyhkcml2ZXIscmVjb3JkKTtpZihzdGF0cz09PW51bGwpe2NvbnRpbnVlO30KY29uc3QgaW1hZ2U9e2ZhaWxlZDpmYWxzZSwuLi5zdGF0cywuLi5yZWNvcmR9O3Jlc3VsdHMucHVzaChpbWFnZSk7fWNhdGNoKGVycil7U2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZXJyLHt0YWdzOntnYXRoZXJlcjonT3B0aW1pemVkSW1hZ2VzJ30sZXh0cmE6e2ltYWdlVXJsOlVSTC5lbGlkZURhdGFVUkkocmVjb3JkLnVybCl9LGxldmVsOid3YXJuaW5nJ30pO2NvbnN0IGltYWdlRXJyb3I9e2ZhaWxlZDp0cnVlLGVyck1zZzplcnIubWVzc2FnZSwuLi5yZWNvcmR9O3Jlc3VsdHMucHVzaChpbWFnZUVycm9yKTt9fQpyZXR1cm4gcmVzdWx0czt9CmFmdGVyUGFzcyhwYXNzQ29udGV4dCxsb2FkRGF0YSl7Y29uc3QgbmV0d29ya1JlY29yZHM9bG9hZERhdGEubmV0d29ya1JlY29yZHM7Y29uc3QgaW1hZ2VSZWNvcmRzPU9wdGltaXplZEltYWdlcy5maWx0ZXJJbWFnZVJlcXVlc3RzKHBhc3NDb250ZXh0LnVybCxuZXR3b3JrUmVjb3Jkcyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXz0+dGhpcy5jb21wdXRlT3B0aW1pemVkSW1hZ2VzKHBhc3NDb250ZXh0LmRyaXZlcixpbWFnZVJlY29yZHMpKS50aGVuKHJlc3VsdHM9Pntjb25zdCBzdWNjZXNzZnVsUmVzdWx0cz1yZXN1bHRzLmZpbHRlcihyZXN1bHQ9PiFyZXN1bHQuZmFpbGVkKTtpZihyZXN1bHRzLmxlbmd0aCYmIXN1Y2Nlc3NmdWxSZXN1bHRzLmxlbmd0aCl7dGhyb3cgbmV3IEVycm9yKCdBbGwgaW1hZ2Ugb3B0aW1pemF0aW9ucyBmYWlsZWQnKTt9CnJldHVybiByZXN1bHRzO30pO319Cm1vZHVsZS5leHBvcnRzPU9wdGltaXplZEltYWdlczt9LHsiLi4vLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uLy4uLy4uL2xpYi9zZW50cnkiOjQwLCIuLi8uLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuLi8uLi9kcml2ZXIuanMiOjE3LCIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9kb2JldHRlcndlYi9wYXNzd29yZC1pbnB1dHMtd2l0aC1wcmV2ZW50ZWQtcGFzdGUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtmdW5jdGlvbiBmaW5kUGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGUoKXtmdW5jdGlvbiBnZXRPdXRlckhUTUxTbmlwcGV0KGVsZW1lbnQpe2NvbnN0IHJlT3BlbmluZ1RhZz0vXi4qPz4vO2NvbnN0IG1hdGNoPWVsZW1lbnQub3V0ZXJIVE1MLm1hdGNoKHJlT3BlbmluZ1RhZyk7cmV0dXJuIG1hdGNoJiZtYXRjaFswXTt9CnJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9InBhc3N3b3JkIl0nKSkuZmlsdGVyKHBhc3N3b3JkSW5wdXQ9PiFwYXNzd29yZElucHV0LmRpc3BhdGNoRXZlbnQobmV3IENsaXBib2FyZEV2ZW50KCdwYXN0ZScse2NhbmNlbGFibGU6dHJ1ZX0pKSkubWFwKHBhc3N3b3JkSW5wdXQ9Pih7c25pcHBldDpnZXRPdXRlckhUTUxTbmlwcGV0KHBhc3N3b3JkSW5wdXQpfSkpO30KY2xhc3MgUGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGUgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe3JldHVybiBwYXNzQ29udGV4dC5kcml2ZXIuZXZhbHVhdGVBc3luYyhgKCR7ZmluZFBhc3N3b3JkSW5wdXRzV2l0aFByZXZlbnRlZFBhc3RlLnRvU3RyaW5nKCl9KCkpYCk7fX0KbW9kdWxlLmV4cG9ydHM9UGFzc3dvcmRJbnB1dHNXaXRoUHJldmVudGVkUGFzdGU7fSx7Ii4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2RvYmV0dGVyd2ViL3Jlc3BvbnNlLWNvbXByZXNzaW9uIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKEJ1ZmZlcil7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4uL2dhdGhlcmVyJyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi91cmwtc2hpbScpO2NvbnN0IFNlbnRyeT1yZXF1aXJlKCcuLi8uLi8uLi9saWIvc2VudHJ5Jyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NvbnN0IGd6aXA9cmVxdWlyZSgnemxpYicpLmd6aXA7Y29uc3QgQ0hST01FX0VYVEVOU0lPTl9QUk9UT0NPTD0nY2hyb21lLWV4dGVuc2lvbjonO2NvbnN0IGNvbXByZXNzaW9uSGVhZGVycz1bJ2NvbnRlbnQtZW5jb2RpbmcnLCd4LW9yaWdpbmFsLWNvbnRlbnQtZW5jb2RpbmcnXTtjb25zdCBjb21wcmVzc2lvblR5cGVzPVsnZ3ppcCcsJ2JyJywnZGVmbGF0ZSddO2NvbnN0IGJpbmFyeU1pbWVUeXBlcz1bJ2ltYWdlJywnYXVkaW8nLCd2aWRlbyddO2NvbnN0IHRleHRSZXNvdXJjZVR5cGVzPVtOZXR3b3JrUmVxdWVzdC5UWVBFUy5Eb2N1bWVudCxOZXR3b3JrUmVxdWVzdC5UWVBFUy5TY3JpcHQsTmV0d29ya1JlcXVlc3QuVFlQRVMuU3R5bGVzaGVldCxOZXR3b3JrUmVxdWVzdC5UWVBFUy5YSFIsTmV0d29ya1JlcXVlc3QuVFlQRVMuRmV0Y2gsTmV0d29ya1JlcXVlc3QuVFlQRVMuRXZlbnRTb3VyY2VdO2NsYXNzIFJlc3BvbnNlQ29tcHJlc3Npb24gZXh0ZW5kcyBHYXRoZXJlcntzdGF0aWMgZmlsdGVyVW5vcHRpbWl6ZWRSZXNwb25zZXMobmV0d29ya1JlY29yZHMpe2NvbnN0IHVub3B0aW1pemVkUmVzcG9uc2VzPVtdO25ldHdvcmtSZWNvcmRzLmZvckVhY2gocmVjb3JkPT57Y29uc3QgbWltZVR5cGU9cmVjb3JkLm1pbWVUeXBlO2NvbnN0IHJlc291cmNlVHlwZT1yZWNvcmQucmVzb3VyY2VUeXBlfHxOZXR3b3JrUmVxdWVzdC5UWVBFUy5PdGhlcjtjb25zdCByZXNvdXJjZVNpemU9cmVjb3JkLnJlc291cmNlU2l6ZTtjb25zdCBpc0JpbmFyeVJlc291cmNlPW1pbWVUeXBlJiZiaW5hcnlNaW1lVHlwZXMuc29tZSh0eXBlPT5taW1lVHlwZS5zdGFydHNXaXRoKHR5cGUpKTtjb25zdCBpc1RleHRSZXNvdXJjZT0haXNCaW5hcnlSZXNvdXJjZSYmdGV4dFJlc291cmNlVHlwZXMuaW5jbHVkZXMocmVzb3VyY2VUeXBlKTtjb25zdCBpc0Nocm9tZUV4dGVuc2lvblJlc291cmNlPXJlY29yZC51cmwuc3RhcnRzV2l0aChDSFJPTUVfRVhURU5TSU9OX1BST1RPQ09MKTtpZighaXNUZXh0UmVzb3VyY2V8fCFyZXNvdXJjZVNpemV8fCFyZWNvcmQuZmluaXNoZWR8fGlzQ2hyb21lRXh0ZW5zaW9uUmVzb3VyY2V8fCFyZWNvcmQudHJhbnNmZXJTaXplfHxyZWNvcmQuc3RhdHVzQ29kZT09PTMwNCl7cmV0dXJuO30KY29uc3QgaXNDb250ZW50RW5jb2RlZD0ocmVjb3JkLnJlc3BvbnNlSGVhZGVyc3x8W10pLmZpbmQoaGVhZGVyPT5jb21wcmVzc2lvbkhlYWRlcnMuaW5jbHVkZXMoaGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKSkmJmNvbXByZXNzaW9uVHlwZXMuaW5jbHVkZXMoaGVhZGVyLnZhbHVlKSk7aWYoIWlzQ29udGVudEVuY29kZWQpe3Vub3B0aW1pemVkUmVzcG9uc2VzLnB1c2goe3JlcXVlc3RJZDpyZWNvcmQucmVxdWVzdElkLHVybDpyZWNvcmQudXJsLG1pbWVUeXBlOm1pbWVUeXBlLHRyYW5zZmVyU2l6ZTpyZWNvcmQudHJhbnNmZXJTaXplLHJlc291cmNlU2l6ZTpyZXNvdXJjZVNpemUsZ3ppcFNpemU6MH0pO319KTtyZXR1cm4gdW5vcHRpbWl6ZWRSZXNwb25zZXM7fQphZnRlclBhc3MocGFzc0NvbnRleHQsbG9hZERhdGEpe2NvbnN0IG5ldHdvcmtSZWNvcmRzPWxvYWREYXRhLm5ldHdvcmtSZWNvcmRzO2NvbnN0IHRleHRSZWNvcmRzPVJlc3BvbnNlQ29tcHJlc3Npb24uZmlsdGVyVW5vcHRpbWl6ZWRSZXNwb25zZXMobmV0d29ya1JlY29yZHMpO2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIFByb21pc2UuYWxsKHRleHRSZWNvcmRzLm1hcChyZWNvcmQ9PntyZXR1cm4gZHJpdmVyLmdldFJlcXVlc3RDb250ZW50KHJlY29yZC5yZXF1ZXN0SWQpLnRoZW4oY29udGVudD0+e2lmKCFjb250ZW50KXtyZXR1cm4gcmVjb3JkO30KcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntyZXR1cm4gZ3ppcChjb250ZW50LChlcnIscmVzKT0+e2lmKGVycil7cmV0dXJuIHJlamVjdChlcnIpO30KcmVjb3JkLmd6aXBTaXplPUJ1ZmZlci5ieXRlTGVuZ3RoKHJlcywndXRmOCcpO3Jlc29sdmUocmVjb3JkKTt9KTt9KTt9KS5jYXRjaChlcnI9PntTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnIse3RhZ3M6e2dhdGhlcmVyOidSZXNwb25zZUNvbXByZXNzaW9uJ30sZXh0cmE6e3VybDpVUkwuZWxpZGVEYXRhVVJJKHJlY29yZC51cmwpfSxsZXZlbDond2FybmluZyd9KTtyZWNvcmQuZ3ppcFNpemU9dW5kZWZpbmVkO3JldHVybiByZWNvcmQ7fSk7fSkpO319Cm1vZHVsZS5leHBvcnRzPVJlc3BvbnNlQ29tcHJlc3Npb247fSkuY2FsbCh0aGlzLHJlcXVpcmUoImJ1ZmZlciIpLkJ1ZmZlcik7fSx7Ii4uLy4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QiOjM4LCIuLi8uLi8uLi9saWIvc2VudHJ5Ijo0MCwiLi4vLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi4vZ2F0aGVyZXIiOjE5LCJidWZmZXIiOjYwLCJ6bGliIjo1N31dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2RvYmV0dGVyd2ViL3RhZ3MtYmxvY2tpbmctZmlyc3QtcGFpbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtjb25zdCBEcml2ZXI9cmVxdWlyZSgnLi4vLi4vZHJpdmVyLmpzJyk7ZnVuY3Rpb24gaW5zdGFsbE1lZGlhTGlzdGVuZXIoKXt3aW5kb3cuX19fbGlua01lZGlhQ2hhbmdlcz1bXTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTExpbmtFbGVtZW50LnByb3RvdHlwZSwnbWVkaWEnLHtzZXQ6ZnVuY3Rpb24odmFsKXt3aW5kb3cuX19fbGlua01lZGlhQ2hhbmdlcy5wdXNoKHtocmVmOnRoaXMuaHJlZixtZWRpYTp2YWwsbXNTaW5jZUhUTUxFbmQ6RGF0ZS5ub3coKS13aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLnJlc3BvbnNlRW5kLG1hdGNoZXM6d2luZG93Lm1hdGNoTWVkaWEodmFsKS5tYXRjaGVzfSk7cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCdtZWRpYScsdmFsKTt9fSk7fQpmdW5jdGlvbiBjb2xsZWN0VGFnc1RoYXRCbG9ja0ZpcnN0UGFpbnQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e3RyeXtjb25zdCB0YWdMaXN0PVsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rLCBoZWFkIHNjcmlwdFtzcmNdJyldLmZpbHRlcih0YWc9PntpZih0YWcudGFnTmFtZT09PSdTQ1JJUFQnKXtjb25zdCBzY3JpcHRUYWc9dGFnO3JldHVybighc2NyaXB0VGFnLmhhc0F0dHJpYnV0ZSgnYXN5bmMnKSYmIXNjcmlwdFRhZy5oYXNBdHRyaWJ1dGUoJ2RlZmVyJykmJiEvXmRhdGE6Ly50ZXN0KHNjcmlwdFRhZy5zcmMpJiZzY3JpcHRUYWcuZ2V0QXR0cmlidXRlKCd0eXBlJykhPT0nbW9kdWxlJyk7fWVsc2UgaWYodGFnLnRhZ05hbWU9PT0nTElOSycpe2NvbnN0IGxpbmtUYWc9dGFnO2NvbnN0IGJsb2NraW5nU3R5bGVzaGVldD1saW5rVGFnLnJlbD09PSdzdHlsZXNoZWV0JyYmd2luZG93Lm1hdGNoTWVkaWEobGlua1RhZy5tZWRpYSkubWF0Y2hlcyYmIWxpbmtUYWcuZGlzYWJsZWQ7Y29uc3QgYmxvY2tpbmdJbXBvcnQ9bGlua1RhZy5yZWw9PT0naW1wb3J0JyYmIWxpbmtUYWcuaGFzQXR0cmlidXRlKCdhc3luYycpO3JldHVybiBibG9ja2luZ1N0eWxlc2hlZXR8fGJsb2NraW5nSW1wb3J0O30KcmV0dXJuIGZhbHNlO30pLm1hcCh0YWc9PntyZXR1cm57dGFnTmFtZTp0YWcudGFnTmFtZSx1cmw6dGFnLnRhZ05hbWU9PT0nTElOSyc/dGFnLmhyZWY6dGFnLnNyYyxzcmM6dGFnLnNyYyxocmVmOnRhZy5ocmVmLHJlbDp0YWcucmVsLG1lZGlhOnRhZy5tZWRpYSxkaXNhYmxlZDp0YWcuZGlzYWJsZWQsbWVkaWFDaGFuZ2VzOndpbmRvdy5fX19saW5rTWVkaWFDaGFuZ2VzLmZpbHRlcihpdGVtPT5pdGVtLmhyZWY9PT10YWcuaHJlZil9O30pO3Jlc29sdmUodGFnTGlzdCk7fWNhdGNoKGUpe2NvbnN0IGZyaWVuZGx5PSdVbmFibGUgdG8gZ2F0aGVyIFNjcmlwdHMvU3R5bGVzaGVldHMvSFRNTCBJbXBvcnRzIG9uIHRoZSBwYWdlJztyZWplY3QobmV3IEVycm9yKGAke2ZyaWVuZGx5fTogJHtlLm1lc3NhZ2V9YCkpO319KTt9CmNsYXNzIFRhZ3NCbG9ja2luZ0ZpcnN0UGFpbnQgZXh0ZW5kcyBHYXRoZXJlcntzdGF0aWMgX2ZpbHRlcmVkQW5kSW5kZXhlZEJ5VXJsKG5ldHdvcmtSZWNvcmRzKXtjb25zdCByZXN1bHQ9e307cmV0dXJuIG5ldHdvcmtSZWNvcmRzLnJlZHVjZSgocHJldixyZWNvcmQpPT57aWYoIXJlY29yZC5maW5pc2hlZCl7cmV0dXJuIHByZXY7fQpjb25zdCBpc1BhcnNlckdlbmVyYXRlZD1yZWNvcmQuaW5pdGlhdG9yLnR5cGU9PT0ncGFyc2VyJztjb25zdCBpc1BhcnNlclNjcmlwdE9yU3R5bGU9Lyhjc3N8c2NyaXB0KS8udGVzdChyZWNvcmQubWltZVR5cGUpJiZpc1BhcnNlckdlbmVyYXRlZDtjb25zdCBpc0ZhaWxlZFJlcXVlc3Q9cmVjb3JkLl9mYWlsZWQ7Y29uc3QgaXNIdG1sPXJlY29yZC5taW1lVHlwZSYmcmVjb3JkLm1pbWVUeXBlLmluY2x1ZGVzKCdodG1sJyk7aWYoaXNIdG1sfHxpc1BhcnNlclNjcmlwdE9yU3R5bGV8fGlzRmFpbGVkUmVxdWVzdCYmaXNQYXJzZXJHZW5lcmF0ZWQpe3ByZXZbcmVjb3JkLnVybF09e2lzTGlua1ByZWxvYWQ6ISFyZWNvcmQuaXNMaW5rUHJlbG9hZCx0cmFuc2ZlclNpemU6cmVjb3JkLnRyYW5zZmVyU2l6ZSxzdGFydFRpbWU6cmVjb3JkLnN0YXJ0VGltZSxlbmRUaW1lOnJlY29yZC5lbmRUaW1lfTt9CnJldHVybiBwcmV2O30scmVzdWx0KTt9CnN0YXRpYyBmaW5kQmxvY2tpbmdUYWdzKGRyaXZlcixuZXR3b3JrUmVjb3Jkcyl7Y29uc3Qgc2NyaXB0U3JjPWAoJHtjb2xsZWN0VGFnc1RoYXRCbG9ja0ZpcnN0UGFpbnQudG9TdHJpbmcoKX0oKSlgO2NvbnN0IGZpcnN0UmVxdWVzdEVuZFRpbWU9bmV0d29ya1JlY29yZHMucmVkdWNlKChtaW4scmVjb3JkKT0+TWF0aC5taW4obWluLHJlY29yZC5lbmRUaW1lKSxJbmZpbml0eSk7cmV0dXJuIGRyaXZlci5ldmFsdWF0ZUFzeW5jKHNjcmlwdFNyYykudGhlbih0YWdzPT57Y29uc3QgcmVxdWVzdHM9VGFnc0Jsb2NraW5nRmlyc3RQYWludC5fZmlsdGVyZWRBbmRJbmRleGVkQnlVcmwobmV0d29ya1JlY29yZHMpO3JldHVybiB0YWdzLnJlZHVjZSgocHJldix0YWcpPT57Y29uc3QgcmVxdWVzdD1yZXF1ZXN0c1t0YWcudXJsXTtpZihyZXF1ZXN0JiYhcmVxdWVzdC5pc0xpbmtQcmVsb2FkKXtjb25zdCB0aW1lc1Jlc291cmNlQmVjYW1lTm9uQmxvY2tpbmc9KHRhZy5tZWRpYUNoYW5nZXN8fFtdKS5maWx0ZXIoY2hhbmdlPT4hY2hhbmdlLm1hdGNoZXMpLm1hcChjaGFuZ2U9PmNoYW5nZS5tc1NpbmNlSFRNTEVuZCk7Y29uc3QgZWFybGllc3ROb25CbG9ja2luZ1RpbWU9TWF0aC5taW4oLi4udGltZXNSZXNvdXJjZUJlY2FtZU5vbkJsb2NraW5nKTtjb25zdCBsYXN0VGltZVJlc291cmNlV2FzQmxvY2tpbmc9TWF0aC5tYXgocmVxdWVzdC5zdGFydFRpbWUsZmlyc3RSZXF1ZXN0RW5kVGltZStlYXJsaWVzdE5vbkJsb2NraW5nVGltZS8xMDAwKTtwcmV2LnB1c2goe3RhZyx0cmFuc2ZlclNpemU6cmVxdWVzdC50cmFuc2ZlclNpemV8fDAsc3RhcnRUaW1lOnJlcXVlc3Quc3RhcnRUaW1lLGVuZFRpbWU6TWF0aC5taW4ocmVxdWVzdC5lbmRUaW1lLGxhc3RUaW1lUmVzb3VyY2VXYXNCbG9ja2luZyl9KTtyZXF1ZXN0c1t0YWcudXJsXT1udWxsO30KcmV0dXJuIHByZXY7fSxbXSk7fSk7fQpiZWZvcmVQYXNzKHBhc3NDb250ZXh0KXtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlU2NyaXB0T25OZXdEb2N1bWVudChgKCR7aW5zdGFsbE1lZGlhTGlzdGVuZXIudG9TdHJpbmcoKX0pKClgKTt9CmFmdGVyUGFzcyhwYXNzQ29udGV4dCxsb2FkRGF0YSl7cmV0dXJuIFRhZ3NCbG9ja2luZ0ZpcnN0UGFpbnQuZmluZEJsb2NraW5nVGFncyhwYXNzQ29udGV4dC5kcml2ZXIsbG9hZERhdGEubmV0d29ya1JlY29yZHMpO319Cm1vZHVsZS5leHBvcnRzPVRhZ3NCbG9ja2luZ0ZpcnN0UGFpbnQ7fSx7Ii4uLy4uL2RyaXZlci5qcyI6MTcsIi4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2RvYmV0dGVyd2ViL3dlYnNxbCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuLi9nYXRoZXJlcicpO2NvbnN0IERyaXZlcj1yZXF1aXJlKCcuLi8uLi9kcml2ZXIuanMnKTtjb25zdCBNQVhfV0FJVF9USU1FT1VUPTUwMDtjbGFzcyBXZWJTUUwgZXh0ZW5kcyBHYXRoZXJlcntsaXN0ZW5Gb3JEYXRhYmFzZUV2ZW50cyhkcml2ZXIpe2xldCB0aW1lb3V0O3JldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57ZHJpdmVyLm9uY2UoJ0RhdGFiYXNlLmFkZERhdGFiYXNlJyxkYj0+e2NsZWFyVGltZW91dCh0aW1lb3V0KTtkcml2ZXIuc2VuZENvbW1hbmQoJ0RhdGFiYXNlLmRpc2FibGUnKS50aGVuKF89PnJlc29sdmUoZGIpLHJlamVjdCk7fSk7ZHJpdmVyLnNlbmRDb21tYW5kKCdEYXRhYmFzZS5lbmFibGUnKS5jYXRjaChyZWplY3QpO3RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3Jlc29sdmUobnVsbCk7fSxNQVhfV0FJVF9USU1FT1VUKTt9KTt9CmFmdGVyUGFzcyhwYXNzQ29udGV4dCl7cmV0dXJuIHRoaXMubGlzdGVuRm9yRGF0YWJhc2VFdmVudHMocGFzc0NvbnRleHQuZHJpdmVyKS50aGVuKHJlc3VsdD0+e3JldHVybiByZXN1bHQmJnJlc3VsdC5kYXRhYmFzZTt9KTt9fQptb2R1bGUuZXhwb3J0cz1XZWJTUUw7fSx7Ii4uLy4uL2RyaXZlci5qcyI6MTcsIi4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2ZvbnRzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjb25zdCBTZW50cnk9cmVxdWlyZSgnLi4vLi4vbGliL3NlbnRyeScpO2NvbnN0IGZvbnRGYWNlRGVzY3JpcHRvcnM9WydkaXNwbGF5JywnZmFtaWx5JywnZmVhdHVyZVNldHRpbmdzJywnc3RyZXRjaCcsJ3N0eWxlJywndW5pY29kZVJhbmdlJywndmFyaWFudCcsJ3dlaWdodCddO2Z1bmN0aW9uIGdldEFsbExvYWRlZEZvbnRzKGRlc2NyaXB0b3JzKXtjb25zdCBnZXRGb250PWZvbnRGYWNlPT57Y29uc3QgZm9udFJ1bGU9e3NyYzpbXX07ZGVzY3JpcHRvcnMuZm9yRWFjaChkZXNjcmlwdG9yPT57Zm9udFJ1bGVbZGVzY3JpcHRvcl09Zm9udEZhY2VbZGVzY3JpcHRvcl07fSk7cmV0dXJuIGZvbnRSdWxlO307cmV0dXJuIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCk9PntyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5mb250cykuZmlsdGVyKGZvbnRGYWNlPT5mb250RmFjZS5zdGF0dXM9PT0nbG9hZGVkJykubWFwKGdldEZvbnQpO30pO30KZnVuY3Rpb24gZ2V0Rm9udEZhY2VGcm9tU3R5bGVzaGVldHMoKXtmdW5jdGlvbiBnZXRTaGVldHNGb250RmFjZXMoc3R5bGVzaGVldCl7Y29uc3QgZm9udFVybFJlZ2V4PSd1cmxcXCgoPzoiKShbXiJdKykoPzoifFwnKVxcKSc7Y29uc3QgZm9udEZhY2VSdWxlcz1bXTtpZihzdHlsZXNoZWV0LmNzc1J1bGVzKXtmb3IoY29uc3QgcnVsZSBvZiBBcnJheS5mcm9tKHN0eWxlc2hlZXQuY3NzUnVsZXMpKXtpZihydWxlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKXtjb25zdCBmb250c09iamVjdD17ZGlzcGxheTpydWxlLnN0eWxlLmZvbnREaXNwbGF5fHwnYXV0bycsZmFtaWx5OnJ1bGUuc3R5bGUuZm9udEZhbWlseT9ydWxlLnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZSgvInwnL2csJycpOicnLHN0cmV0Y2g6cnVsZS5zdHlsZS5mb250U3RyZXRjaHx8J25vcm1hbCcsc3R5bGU6cnVsZS5zdHlsZS5mb250U3R5bGV8fCdub3JtYWwnLHdlaWdodDpydWxlLnN0eWxlLmZvbnRXZWlnaHR8fCdub3JtYWwnLHZhcmlhbnQ6cnVsZS5zdHlsZS5mb250VmFyaWFudHx8J25vcm1hbCcsdW5pY29kZVJhbmdlOnJ1bGUuc3R5bGUudW5pY29kZVJhbmdlfHwnVSswLTEwRkZGRicsZmVhdHVyZVNldHRpbmdzOnJ1bGUuc3R5bGUuZmVhdHVyZVNldHRpbmdzfHwnbm9ybWFsJyxzcmM6W119O2NvbnN0IHNyYz1ydWxlLnN0eWxlLnNyYztpZihzcmMpe2NvbnN0IG1hdGNoZXM9c3JjLm1hdGNoKG5ldyBSZWdFeHAoZm9udFVybFJlZ2V4LCdnJykpO2lmKG1hdGNoZXMpe21hdGNoZXMuZm9yRWFjaChtYXRjaD0+e2NvbnN0IHJlcz1uZXcgUmVnRXhwKGZvbnRVcmxSZWdleCkuZXhlYyhtYXRjaCk7aWYocmVzKXtmb250c09iamVjdC5zcmMucHVzaChuZXcgVVJMKHJlc1sxXSxsb2NhdGlvbi5ocmVmKS5ocmVmKTt9fSk7fX0KZm9udEZhY2VSdWxlcy5wdXNoKGZvbnRzT2JqZWN0KTt9fX0KcmV0dXJuIGZvbnRGYWNlUnVsZXM7fQpmdW5jdGlvbiBsb2FkU3R5bGVzaGVldFdpdGhDT1JTKG9sZE5vZGUpe2NvbnN0IG5ld05vZGU9b2xkTm9kZS5jbG9uZU5vZGUodHJ1ZSk7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9PntuZXdOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uIG9ubG9hZCgpe25ld05vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsb25sb2FkKTt0cnl7Y29uc3Qgc3R5bGVzaGVldD1BcnJheS5mcm9tKGRvY3VtZW50LnN0eWxlU2hlZXRzKS5maW5kKHM9PnMub3duZXJOb2RlPT09bmV3Tm9kZSk7aWYoc3R5bGVzaGVldCl7Y29uc3QgY3NzU3R5bGVzaGVldD1zdHlsZXNoZWV0O3Jlc29sdmUoZ2V0U2hlZXRzRm9udEZhY2VzKGNzc1N0eWxlc2hlZXQpKTt9ZWxzZXtyZXNvbHZlKFt7ZXJyOnttZXNzYWdlOidDb3VsZCBub3QgbG9hZCBzdHlsZXNoZWV0IHdpdGggQ09SUyd9fV0pO319Y2F0Y2goZXJyKXtyZXNvbHZlKFt7ZXJyOnttZXNzYWdlOmVyci5tZXNzYWdlLHN0YWNrOmVyci5zdGFja319XSk7fX0pO25ld05vZGUuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7b2xkTm9kZS5wYXJlbnROb2RlJiZvbGROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsb2xkTm9kZSk7b2xkTm9kZS5yZW1vdmUoKTtzZXRUaW1lb3V0KCgpPT5yZXNvbHZlKFt7ZXJyOnttZXNzYWdlOidDb3VsZCBub3QgbG9hZCBzdHlsZXNoZWV0ICh0aW1lb3V0KSd9fV0pLDUwMDApO30pO30KY29uc3QgZGF0YT1bXTtjb25zdCBjb3JzRGF0YVByb21pc2VzPVtdO2Zvcihjb25zdCBzdHlsZXNoZWV0IG9mIEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMpKXtjb25zdCBjc3NTdHlsZXNoZWV0PXN0eWxlc2hlZXQ7dHJ5e2lmKCFjc3NTdHlsZXNoZWV0LmNzc1J1bGVzKXt0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWFkIGNzc1J1bGVzJyk7fQpkYXRhLnB1c2goLi4uZ2V0U2hlZXRzRm9udEZhY2VzKGNzc1N0eWxlc2hlZXQpKTt9Y2F0Y2goZXJyKXtjb25zdCBmYWlsZWRUb1JlYWRSdWxlcz0vRmFpbGVkIHRvIHJlYWQuKmNzc1J1bGVzLy50ZXN0KGVyci5tZXNzYWdlKTtjb25zdCBhbHJlYWR5Q09SUz0hY3NzU3R5bGVzaGVldC5vd25lck5vZGV8fCEhY3NzU3R5bGVzaGVldC5vd25lck5vZGUuY3Jvc3NPcmlnaW47aWYoZmFpbGVkVG9SZWFkUnVsZXMmJiFhbHJlYWR5Q09SUyYmY3NzU3R5bGVzaGVldC5ocmVmKXtjb25zdCBvd25lckxpbmtFbD1jc3NTdHlsZXNoZWV0Lm93bmVyTm9kZTtjb3JzRGF0YVByb21pc2VzLnB1c2gobG9hZFN0eWxlc2hlZXRXaXRoQ09SUyhvd25lckxpbmtFbCkpO31lbHNle2RhdGEucHVzaCh7ZXJyOnttZXNzYWdlOmVyci5tZXNzYWdlLHN0YWNrOmVyci5zdGFja319KTt9fX0KcmV0dXJuIFByb21pc2UuYWxsKGNvcnNEYXRhUHJvbWlzZXMpLnRoZW4oY29yc0ZvbnRGYWNlcz0+ZGF0YS5jb25jYXQoLi4uY29yc0ZvbnRGYWNlcykpO30KY2xhc3MgRm9udHMgZXh0ZW5kcyBHYXRoZXJlcntfZmluZFNhbWVGb250RmFtaWx5KGZvbnRGYWNlLGZvbnRGYWNlc0xpc3Qpe3JldHVybiBmb250RmFjZXNMaXN0LmZpbmQoZm9udEl0ZW09PntyZXR1cm4hZm9udEZhY2VEZXNjcmlwdG9ycy5maW5kKGRlc2NyaXB0b3I9PntyZXR1cm4gZm9udEZhY2VbZGVzY3JpcHRvcl0hPT1mb250SXRlbVtkZXNjcmlwdG9yXTt9KTt9KTt9CmFmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjtjb25zdCBhcmdzPUpTT04uc3RyaW5naWZ5KGZvbnRGYWNlRGVzY3JpcHRvcnMpO2NvbnN0IGZvbnREYXRhPVByb21pc2UuYWxsKFtkcml2ZXIuZXZhbHVhdGVBc3luYyhgKCR7Z2V0QWxsTG9hZGVkRm9udHMudG9TdHJpbmcoKX0pKCR7YXJnc30pYCksZHJpdmVyLmV2YWx1YXRlQXN5bmMoYCgke2dldEZvbnRGYWNlRnJvbVN0eWxlc2hlZXRzLnRvU3RyaW5nKCl9KSgpYCldKTtyZXR1cm4gZm9udERhdGEudGhlbigoW2xvYWRlZEZvbnRzLGZvbnRzQW5kRXJyb3JzXSk9Pntjb25zdCBmb250RmFjZXM9Zm9udHNBbmRFcnJvcnMuZmlsdGVyKGZvbnRPckVycm9yPT57Y29uc3QgZGF0YUVycm9yPWZvbnRPckVycm9yO2lmKGRhdGFFcnJvci5lcnIpe2NvbnN0IGVycj1uZXcgRXJyb3IoZGF0YUVycm9yLmVyci5tZXNzYWdlKTtlcnIuc3RhY2s9ZGF0YUVycm9yLmVyci5zdGFja3x8ZXJyLnN0YWNrO1NlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGVycix7dGFnczp7Z2F0aGVyZXI6J0ZvbnRzJ30sbGV2ZWw6J3dhcm5pbmcnfSk7cmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fSk7cmV0dXJuIGxvYWRlZEZvbnRzLm1hcChsb2FkZWRGb250PT57Y29uc3QgZm9udEZhY2VJdGVtPXRoaXMuX2ZpbmRTYW1lRm9udEZhbWlseShsb2FkZWRGb250LGZvbnRGYWNlcyk7bG9hZGVkRm9udC5zcmM9Zm9udEZhY2VJdGVtJiZmb250RmFjZUl0ZW0uc3JjfHxbXTtyZXR1cm4gbG9hZGVkRm9udDt9KTt9KTt9fQptb2R1bGUuZXhwb3J0cz1Gb250czt9LHsiLi4vLi4vbGliL3NlbnRyeSI6NDAsIi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvaHRtbC13aXRob3V0LWphdmFzY3JpcHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2Z1bmN0aW9uIGdldEJvZHlUZXh0KCl7Y29uc3QgYm9keT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7Ym9keVRleHQ6Ym9keT9ib2R5LmlubmVyVGV4dDonJyxoYXNOb1NjcmlwdDohIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25vc2NyaXB0Jyl9KTt9CmNsYXNzIEhUTUxXaXRob3V0SmF2YVNjcmlwdCBleHRlbmRzIEdhdGhlcmVye2JlZm9yZVBhc3MocGFzc0NvbnRleHQpe3Bhc3NDb250ZXh0LmRpc2FibGVKYXZhU2NyaXB0PXRydWU7fQphc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQpe3Bhc3NDb250ZXh0LmRpc2FibGVKYXZhU2NyaXB0PWZhbHNlO2NvbnN0IGV4cHJlc3Npb249YCgke2dldEJvZHlUZXh0LnRvU3RyaW5nKCl9KCkpYDtjb25zdHtib2R5VGV4dCxoYXNOb1NjcmlwdH09YXdhaXQgcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlQXN5bmMoZXhwcmVzc2lvbik7aWYodHlwZW9mIGJvZHlUZXh0IT09J3N0cmluZycpe3Rocm93IG5ldyBFcnJvcignZG9jdW1lbnQgYm9keSBpbm5lclRleHQgcmV0dXJuZWQgYnkgcHJvdG9jb2wgd2FzIG5vdCBhIHN0cmluZycpO30KcmV0dXJue2JvZHlUZXh0LGhhc05vU2NyaXB0fTt9fQptb2R1bGUuZXhwb3J0cz1IVE1MV2l0aG91dEphdmFTY3JpcHQ7fSx7Ii4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvaHR0cC1yZWRpcmVjdCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7Y2xhc3MgSFRUUFJlZGlyZWN0IGV4dGVuZHMgR2F0aGVyZXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX3ByZVJlZGlyZWN0VVJMPScnO30KYmVmb3JlUGFzcyhwYXNzQ29udGV4dCl7dGhpcy5fcHJlUmVkaXJlY3RVUkw9cGFzc0NvbnRleHQudXJsO3Bhc3NDb250ZXh0LnVybD10aGlzLl9wcmVSZWRpcmVjdFVSTC5yZXBsYWNlKC9eaHR0cHMvLCdodHRwJyk7fQphc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQpe3Bhc3NDb250ZXh0LnVybD10aGlzLl9wcmVSZWRpcmVjdFVSTDtjb25zdCBleHByZXNzaW9uPWBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbikucHJvdG9jb2wgPT09ICdodHRwczonYDtjb25zdCBpc0h0dHBzPWF3YWl0IHBhc3NDb250ZXh0LmRyaXZlci5ldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb24se3VzZUlzb2xhdGlvbjp0cnVlfSk7cmV0dXJue3ZhbHVlOmlzSHR0cHN9O319Cm1vZHVsZS5leHBvcnRzPUhUVFBSZWRpcmVjdDt9LHsiLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9pbWFnZS11c2FnZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7Y29uc3QgRE9NSGVscGVycz1yZXF1aXJlKCcuLi8uLi9saWIvZG9tLWhlbHBlcnMuanMnKTtjb25zdCBEcml2ZXI9cmVxdWlyZSgnLi4vZHJpdmVyLmpzJyk7ZnVuY3Rpb24gY29sbGVjdEltYWdlRWxlbWVudEluZm8oKXtmdW5jdGlvbiBnZXRDbGllbnRSZWN0KGVsZW1lbnQpe2NvbnN0IGNsaWVudFJlY3Q9ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57dG9wOmNsaWVudFJlY3QudG9wLGJvdHRvbTpjbGllbnRSZWN0LmJvdHRvbSxsZWZ0OmNsaWVudFJlY3QubGVmdCxyaWdodDpjbGllbnRSZWN0LnJpZ2h0fTt9CmNvbnN0IGFsbEVsZW1lbnRzPWdldEVsZW1lbnRzSW5Eb2N1bWVudCgpO2NvbnN0IGFsbEltYWdlRWxlbWVudHM9YWxsRWxlbWVudHMuZmlsdGVyKGVsZW1lbnQ9PntyZXR1cm4gZWxlbWVudC5sb2NhbE5hbWU9PT0naW1nJzt9KTtjb25zdCBodG1sSW1hZ2VzPWFsbEltYWdlRWxlbWVudHMubWFwKGVsZW1lbnQ9Pntjb25zdCBjb21wdXRlZFN0eWxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO3JldHVybntzcmM6ZWxlbWVudC5jdXJyZW50U3JjLHdpZHRoOmVsZW1lbnQud2lkdGgsaGVpZ2h0OmVsZW1lbnQuaGVpZ2h0LGNsaWVudFdpZHRoOmVsZW1lbnQuY2xpZW50V2lkdGgsY2xpZW50SGVpZ2h0OmVsZW1lbnQuY2xpZW50SGVpZ2h0LGNsaWVudFJlY3Q6Z2V0Q2xpZW50UmVjdChlbGVtZW50KSxuYXR1cmFsV2lkdGg6ZWxlbWVudC5uYXR1cmFsV2lkdGgsbmF0dXJhbEhlaWdodDplbGVtZW50Lm5hdHVyYWxIZWlnaHQsaXNDc3M6ZmFsc2UsaXNQaWN0dXJlOiEhZWxlbWVudC5wYXJlbnRFbGVtZW50JiZlbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZT09PSdQSUNUVVJFJyx1c2VzT2JqZWN0Rml0OmNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnb2JqZWN0LWZpdCcpPT09J2NvdmVyJ3x8Y29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdvYmplY3QtZml0Jyk9PT0nY29udGFpbid9O30pO2NvbnN0IENTU19VUkxfUkVHRVg9L151cmxcKCIoW14iXSspIlwpJC87Y29uc3QgQ1NTX1NJWkVfUkVHRVg9LyhhdXRvfGNvbnRhaW58Y292ZXIpLztjb25zdCBjc3NJbWFnZXM9YWxsRWxlbWVudHMucmVkdWNlKChpbWFnZXMsZWxlbWVudCk9Pntjb25zdCBzdHlsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtpZighc3R5bGUuYmFja2dyb3VuZEltYWdlfHwhQ1NTX1VSTF9SRUdFWC50ZXN0KHN0eWxlLmJhY2tncm91bmRJbWFnZSl8fCFzdHlsZS5iYWNrZ3JvdW5kU2l6ZXx8IUNTU19TSVpFX1JFR0VYLnRlc3Qoc3R5bGUuYmFja2dyb3VuZFNpemUpKXtyZXR1cm4gaW1hZ2VzO30KY29uc3QgaW1hZ2VNYXRjaD1zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubWF0Y2goQ1NTX1VSTF9SRUdFWCk7Y29uc3QgdXJsPWltYWdlTWF0Y2hbMV07Y29uc3QgZGlmZmVyZW50SW1hZ2VzPWltYWdlcy5maWx0ZXIoaW1hZ2U9PmltYWdlLnNyYyE9PXVybCk7aWYoaW1hZ2VzLmxlbmd0aC1kaWZmZXJlbnRJbWFnZXMubGVuZ3RoPjIpe3JldHVybiBkaWZmZXJlbnRJbWFnZXM7fQppbWFnZXMucHVzaCh7c3JjOnVybCxjbGllbnRXaWR0aDplbGVtZW50LmNsaWVudFdpZHRoLGNsaWVudEhlaWdodDplbGVtZW50LmNsaWVudEhlaWdodCxjbGllbnRSZWN0OmdldENsaWVudFJlY3QoZWxlbWVudCksbmF0dXJhbFdpZHRoOk51bWJlci5NQVhfVkFMVUUsbmF0dXJhbEhlaWdodDpOdW1iZXIuTUFYX1ZBTFVFLGlzQ3NzOnRydWUsaXNQaWN0dXJlOmZhbHNlLHVzZXNPYmplY3RGaXQ6ZmFsc2V9KTtyZXR1cm4gaW1hZ2VzO30sW10pO3JldHVybiBodG1sSW1hZ2VzLmNvbmNhdChjc3NJbWFnZXMpO30KZnVuY3Rpb24gZGV0ZXJtaW5lTmF0dXJhbFNpemUodXJsKXtyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e2NvbnN0IGltZz1uZXcgSW1hZ2UoKTtpbWcuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLF89PnJlamVjdChuZXcgRXJyb3IoJ2RldGVybWluZU5hdHVyYWxTaXplIGZhaWxlZCBpbWcgbG9hZCcpKSk7aW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCgpPT57cmVzb2x2ZSh7bmF0dXJhbFdpZHRoOmltZy5uYXR1cmFsV2lkdGgsbmF0dXJhbEhlaWdodDppbWcubmF0dXJhbEhlaWdodH0pO30pO2ltZy5zcmM9dXJsO30pO30KY2xhc3MgSW1hZ2VVc2FnZSBleHRlbmRzIEdhdGhlcmVye2FzeW5jIGZldGNoRWxlbWVudFdpdGhTaXplSW5mb3JtYXRpb24oZHJpdmVyLGVsZW1lbnQpe2NvbnN0IHVybD1KU09OLnN0cmluZ2lmeShlbGVtZW50LnNyYyk7dHJ5e2NvbnN0IHNpemU9YXdhaXQgZHJpdmVyLmV2YWx1YXRlQXN5bmMoYCgke2RldGVybWluZU5hdHVyYWxTaXplLnRvU3RyaW5nKCl9KSgke3VybH0pYCk7cmV0dXJuIE9iamVjdC5hc3NpZ24oZWxlbWVudCxzaXplKTt9Y2F0Y2goXyl7cmV0dXJuIE9iamVjdC5hc3NpZ24oZWxlbWVudCx7bmF0dXJhbFdpZHRoOjAsbmF0dXJhbEhlaWdodDowfSk7fX0KYXN5bmMgYWZ0ZXJQYXNzKHBhc3NDb250ZXh0LGxvYWREYXRhKXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO2NvbnN0IGluZGV4ZWROZXR3b3JrUmVjb3Jkcz1sb2FkRGF0YS5uZXR3b3JrUmVjb3Jkcy5yZWR1Y2UoKG1hcCxyZWNvcmQpPT57aWYoL15pbWFnZS8udGVzdChyZWNvcmQubWltZVR5cGUpJiZyZWNvcmQuZmluaXNoZWQpe21hcFtyZWNvcmQudXJsXT17dXJsOnJlY29yZC51cmwscmVzb3VyY2VTaXplOk1hdGgubWluKHJlY29yZC5yZXNvdXJjZVNpemV8fDAscmVjb3JkLnRyYW5zZmVyU2l6ZSksc3RhcnRUaW1lOnJlY29yZC5zdGFydFRpbWUsZW5kVGltZTpyZWNvcmQuZW5kVGltZSxyZXNwb25zZVJlY2VpdmVkVGltZTpyZWNvcmQucmVzcG9uc2VSZWNlaXZlZFRpbWUsbWltZVR5cGU6cmVjb3JkLm1pbWVUeXBlfTt9CnJldHVybiBtYXA7fSx7fSk7Y29uc3QgZXhwcmVzc2lvbj1gKGZ1bmN0aW9uKCkgewogICAgICAke0RPTUhlbHBlcnMuZ2V0RWxlbWVudHNJbkRvY3VtZW50Rm5TdHJpbmd9OyAvLyBkZWZpbmUgZnVuY3Rpb24gb24gcGFnZQogICAgICByZXR1cm4gKCR7Y29sbGVjdEltYWdlRWxlbWVudEluZm8udG9TdHJpbmcoKX0pKCk7CiAgICB9KSgpYDtjb25zdCBlbGVtZW50cz1hd2FpdCBkcml2ZXIuZXZhbHVhdGVBc3luYyhleHByZXNzaW9uKTtjb25zdCBpbWFnZVVzYWdlPVtdO2ZvcihsZXQgZWxlbWVudCBvZiBlbGVtZW50cyl7ZWxlbWVudC5uZXR3b3JrUmVjb3JkPWluZGV4ZWROZXR3b3JrUmVjb3Jkc1tlbGVtZW50LnNyY107aWYoKGVsZW1lbnQuaXNQaWN0dXJlfHxlbGVtZW50LmlzQ3NzKSYmZWxlbWVudC5uZXR3b3JrUmVjb3JkKXtlbGVtZW50PWF3YWl0IHRoaXMuZmV0Y2hFbGVtZW50V2l0aFNpemVJbmZvcm1hdGlvbihkcml2ZXIsZWxlbWVudCk7fQppbWFnZVVzYWdlLnB1c2goZWxlbWVudCk7fQpyZXR1cm4gaW1hZ2VVc2FnZTt9fQptb2R1bGUuZXhwb3J0cz1JbWFnZVVzYWdlO30seyIuLi8uLi9saWIvZG9tLWhlbHBlcnMuanMiOjMwLCIuLi9kcml2ZXIuanMiOjE3LCIuL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL2pzLXVzYWdlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjbGFzcyBKc1VzYWdlIGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYmVmb3JlUGFzcyhwYXNzQ29udGV4dCl7YXdhaXQgcGFzc0NvbnRleHQuZHJpdmVyLnNlbmRDb21tYW5kKCdQcm9maWxlci5lbmFibGUnKTthd2FpdCBwYXNzQ29udGV4dC5kcml2ZXIuc2VuZENvbW1hbmQoJ1Byb2ZpbGVyLnN0YXJ0UHJlY2lzZUNvdmVyYWdlJyk7fQphc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7Y29uc3QgY292ZXJhZ2VSZXNwb25zZT1hd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ1Byb2ZpbGVyLnRha2VQcmVjaXNlQ292ZXJhZ2UnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ1Byb2ZpbGVyLnN0b3BQcmVjaXNlQ292ZXJhZ2UnKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ1Byb2ZpbGVyLmRpc2FibGUnKTtyZXR1cm4gY292ZXJhZ2VSZXNwb25zZS5yZXN1bHQ7fX0KbW9kdWxlLmV4cG9ydHM9SnNVc2FnZTt9LHsiLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9tYW5pZmVzdCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihCdWZmZXIpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7Y29uc3QgbWFuaWZlc3RQYXJzZXI9cmVxdWlyZSgnLi4vLi4vbGliL21hbmlmZXN0LXBhcnNlcicpO2NvbnN0IEJPTV9MRU5HVEg9Mztjb25zdCBCT01fRklSU1RDSEFSPTY1Mjc5O2NsYXNzIE1hbmlmZXN0IGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBtYW5pZmVzdFByb21pc2U9cGFzc0NvbnRleHQuZHJpdmVyLmdldEFwcE1hbmlmZXN0KCk7Y29uc3QgdGltZW91dFByb21pc2U9bmV3IFByb21pc2UocmVzb2x2ZT0+c2V0VGltZW91dChyZXNvbHZlLDMwMDApKTtjb25zdCByZXNwb25zZT1hd2FpdCBQcm9taXNlLnJhY2UoW21hbmlmZXN0UHJvbWlzZSx0aW1lb3V0UHJvbWlzZV0pO2lmKCFyZXNwb25zZSl7cmV0dXJuIG51bGw7fQpjb25zdCBpc0JvbUVuY29kZWQ9cmVzcG9uc2UuZGF0YS5jaGFyQ29kZUF0KDApPT09Qk9NX0ZJUlNUQ0hBUjtpZihpc0JvbUVuY29kZWQpe3Jlc3BvbnNlLmRhdGE9QnVmZmVyLmZyb20ocmVzcG9uc2UuZGF0YSkuc2xpY2UoQk9NX0xFTkdUSCkudG9TdHJpbmcoKTt9CnJldHVybiBtYW5pZmVzdFBhcnNlcihyZXNwb25zZS5kYXRhLHJlc3BvbnNlLnVybCxwYXNzQ29udGV4dC51cmwpO319Cm1vZHVsZS5leHBvcnRzPU1hbmlmZXN0O30pLmNhbGwodGhpcyxyZXF1aXJlKCJidWZmZXIiKS5CdWZmZXIpO30seyIuLi8uLi9saWIvbWFuaWZlc3QtcGFyc2VyIjozNiwiLi9nYXRoZXJlciI6MTksImJ1ZmZlciI6NjB9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9taXhlZC1jb250ZW50IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKEJ1ZmZlcil7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y29uc3QgRHJpdmVyPXJlcXVpcmUoJy4uL2RyaXZlci5qcycpO2NsYXNzIE1peGVkQ29udGVudCBleHRlbmRzIEdhdGhlcmVye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLmlkcz1uZXcgU2V0KCk7dGhpcy51cmw9dW5kZWZpbmVkO3RoaXMuX29uUmVxdWVzdEludGVyY2VwdGVkPXVuZGVmaW5lZDt9CnVwZ3JhZGVVUkwodXJsKXtjb25zdCBwYXJzZWRVUkw9bmV3IFVSTCh1cmwpO3BhcnNlZFVSTC5wcm90b2NvbD0naHR0cHM6JztyZXR1cm4gcGFyc2VkVVJMLmhyZWY7fQpkb3duZ3JhZGVVUkwodXJsKXtjb25zdCBwYXJzZWRVUkw9bmV3IFVSTCh1cmwpO3BhcnNlZFVSTC5wcm90b2NvbD0naHR0cDonO3JldHVybiBwYXJzZWRVUkwuaHJlZjt9Cl9nZXRSZXF1ZXN0SW50ZXJjZXB0b3IocGFnZVVybCxkcml2ZXIpe2NvbnN0IG9uUmVxdWVzdEludGVyY2VwdGVkPWV2ZW50PT57aWYobmV3IFVSTChldmVudC5yZXF1ZXN0LnVybCkucHJvdG9jb2w9PT0naHR0cDonJiYhVVJMLmVxdWFsV2l0aEV4Y2x1ZGVkRnJhZ21lbnRzKGV2ZW50LnJlcXVlc3QudXJsLHBhZ2VVcmwpJiYhdGhpcy5pZHMuaGFzKGV2ZW50LmludGVyY2VwdGlvbklkKSl7dGhpcy5pZHMuYWRkKGV2ZW50LmludGVyY2VwdGlvbklkKTtldmVudC5yZXF1ZXN0LnVybD10aGlzLnVwZ3JhZGVVUkwoZXZlbnQucmVxdWVzdC51cmwpO2RyaXZlci5zZW5kQ29tbWFuZCgnTmV0d29yay5jb250aW51ZUludGVyY2VwdGVkUmVxdWVzdCcse2ludGVyY2VwdGlvbklkOmV2ZW50LmludGVyY2VwdGlvbklkLHJhd1Jlc3BvbnNlOkJ1ZmZlci5mcm9tKGBIVFRQLzEuMSAzMDIgRm91bmRcclxuTG9jYXRpb246ICR7ZXZlbnQucmVxdWVzdC51cmx9XHJcblxyXG5gLCd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpfSk7fWVsc2V7ZHJpdmVyLnNlbmRDb21tYW5kKCdOZXR3b3JrLmNvbnRpbnVlSW50ZXJjZXB0ZWRSZXF1ZXN0Jyx7aW50ZXJjZXB0aW9uSWQ6ZXZlbnQuaW50ZXJjZXB0aW9uSWR9KTt9fTtyZXR1cm4gb25SZXF1ZXN0SW50ZXJjZXB0ZWQ7fQphc3luYyBiZWZvcmVQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO3Bhc3NDb250ZXh0LnVybD10aGlzLmRvd25ncmFkZVVSTChwYXNzQ29udGV4dC51cmwpO3RoaXMudXJsPXBhc3NDb250ZXh0LnVybDt0aGlzLl9vblJlcXVlc3RJbnRlcmNlcHRlZD10aGlzLl9nZXRSZXF1ZXN0SW50ZXJjZXB0b3IodGhpcy51cmwsZHJpdmVyKTthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ05ldHdvcmsuZW5hYmxlJyk7ZHJpdmVyLm9uKCdOZXR3b3JrLnJlcXVlc3RJbnRlcmNlcHRlZCcsdGhpcy5fb25SZXF1ZXN0SW50ZXJjZXB0ZWQpO2F3YWl0IGRyaXZlci5zZW5kQ29tbWFuZCgnTmV0d29yay5zZXRDYWNoZURpc2FibGVkJyx7Y2FjaGVEaXNhYmxlZDp0cnVlfSk7YXdhaXQgZHJpdmVyLnNlbmRDb21tYW5kKCdOZXR3b3JrLnNldFJlcXVlc3RJbnRlcmNlcHRpb24nLHtwYXR0ZXJuczpbe3VybFBhdHRlcm46JyonfV19KTt9CmFzeW5jIGFmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjthd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ05ldHdvcmsuc2V0UmVxdWVzdEludGVyY2VwdGlvbicse3BhdHRlcm5zOltdfSk7aWYodGhpcy5fb25SZXF1ZXN0SW50ZXJjZXB0ZWQpe2RyaXZlci5vZmYoJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJyx0aGlzLl9vblJlcXVlc3RJbnRlcmNlcHRlZCk7fQphd2FpdCBkcml2ZXIuc2VuZENvbW1hbmQoJ05ldHdvcmsuc2V0Q2FjaGVEaXNhYmxlZCcse2NhY2hlRGlzYWJsZWQ6ZmFsc2V9KTtyZXR1cm57dXJsOnBhc3NDb250ZXh0LnVybH07fX0KbW9kdWxlLmV4cG9ydHM9TWl4ZWRDb250ZW50O30pLmNhbGwodGhpcyxyZXF1aXJlKCJidWZmZXIiKS5CdWZmZXIpO30seyIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuLi9kcml2ZXIuanMiOjE3LCIuL2dhdGhlcmVyIjoxOSwiYnVmZmVyIjo2MH1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL29mZmxpbmUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2NvbnN0IFVSTD1yZXF1aXJlKCcuLi8uLi9saWIvdXJsLXNoaW0nKTtjbGFzcyBPZmZsaW5lIGV4dGVuZHMgR2F0aGVyZXJ7YmVmb3JlUGFzcyhwYXNzQ29udGV4dCl7cmV0dXJuIHBhc3NDb250ZXh0LmRyaXZlci5nb09mZmxpbmUoKTt9CmFmdGVyUGFzcyhwYXNzQ29udGV4dCxsb2FkRGF0YSl7Y29uc3QgbmF2aWdhdGlvblJlY29yZD1sb2FkRGF0YS5uZXR3b3JrUmVjb3Jkcy5maWx0ZXIocmVjb3JkPT57cmV0dXJuIFVSTC5lcXVhbFdpdGhFeGNsdWRlZEZyYWdtZW50cyhyZWNvcmQudXJsLHBhc3NDb250ZXh0LnVybCkmJnJlY29yZC5mZXRjaGVkVmlhU2VydmljZVdvcmtlcjt9KS5wb3AoKTtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmdvT25saW5lKHBhc3NDb250ZXh0KS50aGVuKF89Pm5hdmlnYXRpb25SZWNvcmQ/bmF2aWdhdGlvblJlY29yZC5zdGF0dXNDb2RlOi0xKTt9fQptb2R1bGUuZXhwb3J0cz1PZmZsaW5lO30seyIuLi8uLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3J1bnRpbWUtZXhjZXB0aW9ucyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7Y2xhc3MgUnVudGltZUV4Y2VwdGlvbnMgZXh0ZW5kcyBHYXRoZXJlcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZXhjZXB0aW9ucz1bXTt0aGlzLl9vblJ1bnRpbWVFeGNlcHRpb25UaHJvd249dGhpcy5vblJ1bnRpbWVFeGNlcHRpb25UaHJvd24uYmluZCh0aGlzKTt9Cm9uUnVudGltZUV4Y2VwdGlvblRocm93bihlbnRyeSl7dGhpcy5fZXhjZXB0aW9ucy5wdXNoKGVudHJ5KTt9CmJlZm9yZVBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7ZHJpdmVyLm9uKCdSdW50aW1lLmV4Y2VwdGlvblRocm93bicsdGhpcy5fb25SdW50aW1lRXhjZXB0aW9uVGhyb3duKTt9CmFzeW5jIGFmdGVyUGFzcyhwYXNzQ29udGV4dCl7YXdhaXQgcGFzc0NvbnRleHQuZHJpdmVyLm9mZignUnVudGltZS5leGNlcHRpb25UaHJvd24nLHRoaXMuX29uUnVudGltZUV4Y2VwdGlvblRocm93bik7cmV0dXJuIHRoaXMuX2V4Y2VwdGlvbnM7fX0KbW9kdWxlLmV4cG9ydHM9UnVudGltZUV4Y2VwdGlvbnM7fSx7Ii4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvc2NyaXB0cyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NsYXNzIFNjcmlwdHMgZXh0ZW5kcyBHYXRoZXJlcnthc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQsbG9hZERhdGEpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7Y29uc3Qgc2NyaXB0Q29udGVudE1hcD17fTtjb25zdCBzY3JpcHRSZWNvcmRzPWxvYWREYXRhLm5ldHdvcmtSZWNvcmRzLmZpbHRlcihyZWNvcmQ9PnJlY29yZC5yZXNvdXJjZVR5cGU9PT1OZXR3b3JrUmVxdWVzdC5UWVBFUy5TY3JpcHQpO2Zvcihjb25zdCByZWNvcmQgb2Ygc2NyaXB0UmVjb3Jkcyl7dHJ5e2NvbnN0IGNvbnRlbnQ9YXdhaXQgZHJpdmVyLmdldFJlcXVlc3RDb250ZW50KHJlY29yZC5yZXF1ZXN0SWQpO2lmKGNvbnRlbnQpe3NjcmlwdENvbnRlbnRNYXBbcmVjb3JkLnJlcXVlc3RJZF09Y29udGVudDt9fWNhdGNoKGUpe319CnJldHVybiBzY3JpcHRDb250ZW50TWFwO319Cm1vZHVsZS5leHBvcnRzPVNjcmlwdHM7fSx7Ii4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QiOjM4LCIuL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3Nlby9jYW5vbmljYWwiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtjbGFzcyBDYW5vbmljYWwgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIGRyaXZlci5xdWVyeVNlbGVjdG9yQWxsKCdoZWFkIGxpbmtbcmVsPSJjYW5vbmljYWwiIGldJykudGhlbihub2Rlcz0+UHJvbWlzZS5hbGwobm9kZXMubWFwKG5vZGU9Pm5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJykpKSk7fX0KbW9kdWxlLmV4cG9ydHM9Q2Fub25pY2FsO30seyIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9zZW8vY3Jhd2xhYmxlLWxpbmtzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4uL2dhdGhlcmVyJyk7Y29uc3QgRE9NSGVscGVycz1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZG9tLWhlbHBlcnMuanMnKTtjbGFzcyBDcmF3bGFibGVMaW5rcyBleHRlbmRzIEdhdGhlcmVye2FmdGVyUGFzcyhwYXNzQ29udGV4dCl7Y29uc3QgZXhwcmVzc2lvbj1gKGZ1bmN0aW9uKCkgewogICAgICAke0RPTUhlbHBlcnMuZ2V0RWxlbWVudHNJbkRvY3VtZW50Rm5TdHJpbmd9OyAvLyBkZWZpbmUgZnVuY3Rpb24gb24gcGFnZQogICAgICBjb25zdCBzZWxlY3RvciA9ICdhW2hyZWZdOm5vdChbcmVsfj0ibm9mb2xsb3ciXSknOwogICAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzSW5Eb2N1bWVudChzZWxlY3Rvcik7CiAgICAgIHJldHVybiBlbGVtZW50cwogICAgICAgIC5tYXAobm9kZSA9PiAoewogICAgICAgICAgaHJlZjogbm9kZS5ocmVmLAogICAgICAgICAgdGV4dDogbm9kZS5pbm5lclRleHQKICAgICAgICB9KSk7CiAgICB9KSgpYDtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlQXN5bmMoZXhwcmVzc2lvbik7fX0KbW9kdWxlLmV4cG9ydHM9Q3Jhd2xhYmxlTGlua3M7fSx7Ii4uLy4uLy4uL2xpYi9kb20taGVscGVycy5qcyI6MzAsIi4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3Nlby9lbWJlZGRlZC1jb250ZW50IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4uL2dhdGhlcmVyJyk7Y29uc3QgRE9NSGVscGVycz1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZG9tLWhlbHBlcnMuanMnKTtjbGFzcyBFbWJlZGRlZENvbnRlbnQgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGV4cHJlc3Npb249YChmdW5jdGlvbigpIHsKICAgICAgJHtET01IZWxwZXJzLmdldEVsZW1lbnRzSW5Eb2N1bWVudEZuU3RyaW5nfTsgLy8gZGVmaW5lIGZ1bmN0aW9uIG9uIHBhZ2UKICAgICAgY29uc3Qgc2VsZWN0b3IgPSAnb2JqZWN0LCBlbWJlZCwgYXBwbGV0JzsKICAgICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0luRG9jdW1lbnQoc2VsZWN0b3IpOwogICAgICByZXR1cm4gZWxlbWVudHMKICAgICAgICAubWFwKG5vZGUgPT4gKHsKICAgICAgICAgIHRhZ05hbWU6IG5vZGUudGFnTmFtZSwKICAgICAgICAgIHR5cGU6IG5vZGUuZ2V0QXR0cmlidXRlKCd0eXBlJyksCiAgICAgICAgICBzcmM6IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSwKICAgICAgICAgIGRhdGE6IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhJyksCiAgICAgICAgICBjb2RlOiBub2RlLmdldEF0dHJpYnV0ZSgnY29kZScpLAogICAgICAgICAgcGFyYW1zOiBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pCiAgICAgICAgICAgIC5maWx0ZXIoZWwgPT4gZWwudGFnTmFtZSA9PT0gJ1BBUkFNJykKICAgICAgICAgICAgLm1hcChlbCA9PiAoewogICAgICAgICAgICAgIG5hbWU6IGVsLmdldEF0dHJpYnV0ZSgnbmFtZScpIHx8ICcnLAogICAgICAgICAgICAgIHZhbHVlOiBlbC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgfHwgJycsCiAgICAgICAgICAgIH0pKSwKICAgICAgICB9KSk7CiAgICB9KSgpYDtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlQXN5bmMoZXhwcmVzc2lvbik7fX0KbW9kdWxlLmV4cG9ydHM9RW1iZWRkZWRDb250ZW50O30seyIuLi8uLi8uLi9saWIvZG9tLWhlbHBlcnMuanMiOjMwLCIuLi9nYXRoZXJlciI6MTl9XSwiLi4vZ2F0aGVyL2dhdGhlcmVycy9zZW8vZm9udC1zaXplIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7J3VzZSBzdHJpY3QnO2NvbnN0IENTU01hdGNoZWRTdHlsZXM9cmVxdWlyZSgnLi4vLi4vLi4vbGliL3dlYi1pbnNwZWN0b3InKS5DU1NNYXRjaGVkU3R5bGVzO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4uL2dhdGhlcmVyJyk7Y29uc3QgRk9OVF9TSVpFX1BST1BFUlRZX05BTUU9J2ZvbnQtc2l6ZSc7Y29uc3QgVEVYVF9OT0RFX0JMT0NLX0xJU1Q9bmV3IFNldChbJ1NDUklQVCcsJ1NUWUxFJywnTk9TQ1JJUFQnXSk7Y29uc3QgTUlOSU1BTF9MRUdJQkxFX0ZPTlRfU0laRV9QWD0xMjtjb25zdCBNQVhfTk9ERVNfVklTSVRFRD01MDA7Y29uc3QgTUFYX05PREVTX0FOQUxZWkVEPTUwO2NvbnN0IERyaXZlcj1yZXF1aXJlKCcuLi8uLi9kcml2ZXIuanMnKTtmdW5jdGlvbiBub2RlSW5Cb2R5KG5vZGUpe2lmKCFub2RlKXtyZXR1cm4gZmFsc2U7fQppZihub2RlLm5vZGVOYW1lPT09J0JPRFknKXtyZXR1cm4gdHJ1ZTt9CnJldHVybiBub2RlSW5Cb2R5KG5vZGUucGFyZW50Tm9kZSk7fQpmdW5jdGlvbiBnZXRBbGxOb2Rlc0Zyb21Cb2R5KGRyaXZlcil7cmV0dXJuIGRyaXZlci5nZXROb2Rlc0luRG9jdW1lbnQoKS50aGVuKG5vZGVzPT57Y29uc3Qgbm9kZU1hcD1uZXcgTWFwKCk7bm9kZXMuZm9yRWFjaChub2RlPT5ub2RlTWFwLnNldChub2RlLm5vZGVJZCxub2RlKSk7bm9kZXMuZm9yRWFjaChub2RlPT5ub2RlLnBhcmVudE5vZGU9bm9kZU1hcC5nZXQobm9kZS5wYXJlbnRJZCkpO3JldHVybiBub2Rlcy5maWx0ZXIobm9kZUluQm9keSk7fSk7fQpmdW5jdGlvbiBnZXRFZmZlY3RpdmVSdWxlKHByb3BlcnR5LG5vZGUse2lubGluZVN0eWxlLGF0dHJpYnV0ZXNTdHlsZSxtYXRjaGVkQ1NTUnVsZXMsaW5oZXJpdGVkfSkKe2NvbnN0IGNzc01vZGVsPXtzdHlsZVNoZWV0SGVhZGVyRm9ySWQ6aWQ9Pih7aWR9KX07Y29uc3Qgbm9kZVR5cGU9bm9kZS5ub2RlVHlwZTtub2RlLm5vZGVUeXBlPSgpPT5ub2RlVHlwZTtjb25zdCBtYXRjaGVkU3R5bGVzPW5ldyBDU1NNYXRjaGVkU3R5bGVzKGNzc01vZGVsLG5vZGUsaW5saW5lU3R5bGUsYXR0cmlidXRlc1N0eWxlLG1hdGNoZWRDU1NSdWxlcyxudWxsLGluaGVyaXRlZCxudWxsKTtjb25zdCBub2RlU3R5bGVzPW1hdGNoZWRTdHlsZXMubm9kZVN0eWxlcygpO2NvbnN0IG1hdGNoaW5nUnVsZT1ub2RlU3R5bGVzLmZpbmQoc3R5bGU9PnN0eWxlLmFsbFByb3BlcnRpZXMuc29tZShpdGVtPT5pdGVtLm5hbWU9PT1wcm9wZXJ0eSYmbWF0Y2hlZFN0eWxlcy5wcm9wZXJ0eVN0YXRlKGl0ZW0pIT09Q1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLk92ZXJsb2FkZWQpKTtyZXR1cm4gbWF0Y2hpbmdSdWxlO30KZnVuY3Rpb24gZ2V0Tm9kZVRleHRMZW5ndGgobm9kZSl7cmV0dXJuIW5vZGUubm9kZVZhbHVlPzA6bm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aDt9CmZ1bmN0aW9uIGdldEZvbnRTaXplU291cmNlUnVsZShkcml2ZXIsbm9kZSl7cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnQ1NTLmdldE1hdGNoZWRTdHlsZXNGb3JOb2RlJyx7bm9kZUlkOm5vZGUubm9kZUlkfSkudGhlbihtYXRjaGVkUnVsZXM9PmdldEVmZmVjdGl2ZVJ1bGUoRk9OVF9TSVpFX1BST1BFUlRZX05BTUUsbm9kZSxtYXRjaGVkUnVsZXMpKTt9CmZ1bmN0aW9uIGdldEZvbnRTaXplSW5mb3JtYXRpb24oZHJpdmVyLG5vZGUpe3JldHVybiBkcml2ZXIuc2VuZENvbW1hbmQoJ0NTUy5nZXRDb21wdXRlZFN0eWxlRm9yTm9kZScse25vZGVJZDpub2RlLnBhcmVudElkfSkudGhlbihyZXN1bHQ9Pntjb25zdHtjb21wdXRlZFN0eWxlfT1yZXN1bHQ7Y29uc3QgZm9udFNpemVQcm9wZXJ0eT1jb21wdXRlZFN0eWxlLmZpbmQoKHtuYW1lfSk9Pm5hbWU9PT1GT05UX1NJWkVfUFJPUEVSVFlfTkFNRSk7cmV0dXJue2ZvbnRTaXplOnBhcnNlSW50KGZvbnRTaXplUHJvcGVydHkudmFsdWUsMTApLHRleHRMZW5ndGg6Z2V0Tm9kZVRleHRMZW5ndGgobm9kZSksbm9kZTpub2RlLnBhcmVudE5vZGV9O30pLmNhdGNoKGVycj0+e3JlcXVpcmUoJy4uLy4uLy4uL2xpYi9zZW50cnkuanMnKS5jYXB0dXJlRXhjZXB0aW9uKGVycik7cmV0dXJuIG51bGw7fSk7fQpmdW5jdGlvbiBpc05vbkVtcHR5VGV4dE5vZGUobm9kZSl7cmV0dXJuIG5vZGUubm9kZVR5cGU9PT1nbG9iYWwuTm9kZS5URVhUX05PREUmJiFURVhUX05PREVfQkxPQ0tfTElTVC5oYXMobm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSYmZ2V0Tm9kZVRleHRMZW5ndGgobm9kZSk+MDt9CmNsYXNzIEZvbnRTaXplIGV4dGVuZHMgR2F0aGVyZXJ7YWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBzdHlsZXNoZWV0cz1uZXcgTWFwKCk7Y29uc3Qgb25TdHlsZXNoZWV0QWRkPXNoZWV0PT5zdHlsZXNoZWV0cy5zZXQoc2hlZXQuaGVhZGVyLnN0eWxlU2hlZXRJZCxzaGVldC5oZWFkZXIpO3Bhc3NDb250ZXh0LmRyaXZlci5vbignQ1NTLnN0eWxlU2hlZXRBZGRlZCcsb25TdHlsZXNoZWV0QWRkKTtjb25zdCBlbmFibGVET009cGFzc0NvbnRleHQuZHJpdmVyLnNlbmRDb21tYW5kKCdET00uZW5hYmxlJyk7Y29uc3QgZW5hYmxlQ1NTPXBhc3NDb250ZXh0LmRyaXZlci5zZW5kQ29tbWFuZCgnQ1NTLmVuYWJsZScpO2xldCBmYWlsaW5nVGV4dExlbmd0aD0wO2xldCB2aXNpdGVkVGV4dExlbmd0aD0wO2xldCB0b3RhbFRleHRMZW5ndGg9MDtyZXR1cm4gUHJvbWlzZS5hbGwoW2VuYWJsZURPTSxlbmFibGVDU1NdKS50aGVuKCgpPT5nZXRBbGxOb2Rlc0Zyb21Cb2R5KHBhc3NDb250ZXh0LmRyaXZlcikpLnRoZW4obm9kZXM9Pntjb25zdCB0ZXh0Tm9kZXM9bm9kZXMuZmlsdGVyKGlzTm9uRW1wdHlUZXh0Tm9kZSk7dG90YWxUZXh0TGVuZ3RoPXRleHROb2Rlcy5yZWR1Y2UoKHN1bSxub2RlKT0+c3VtKz1nZXROb2RlVGV4dExlbmd0aChub2RlKSwwKTtjb25zdCBub2Rlc1RvVmlzaXQ9dGV4dE5vZGVzLnNvcnQoKGEsYik9PmdldE5vZGVUZXh0TGVuZ3RoKGIpLWdldE5vZGVUZXh0TGVuZ3RoKGEpKS5zbGljZSgwLE1BWF9OT0RFU19WSVNJVEVEKTtyZXR1cm4gbm9kZXNUb1Zpc2l0O30pLnRoZW4odGV4dE5vZGVzPT5Qcm9taXNlLmFsbCh0ZXh0Tm9kZXMubWFwKG5vZGU9PmdldEZvbnRTaXplSW5mb3JtYXRpb24ocGFzc0NvbnRleHQuZHJpdmVyLG5vZGUpKSkpLnRoZW4oZm9udFNpemVJbmZvPT57Y29uc3QgdmlzaXRlZE5vZGVzPWZvbnRTaXplSW5mby5maWx0ZXIoQm9vbGVhbik7dmlzaXRlZFRleHRMZW5ndGg9dmlzaXRlZE5vZGVzLnJlZHVjZSgoc3VtLHt0ZXh0TGVuZ3RofSk9PnN1bSs9dGV4dExlbmd0aCwwKTtjb25zdCBmYWlsaW5nTm9kZXM9dmlzaXRlZE5vZGVzLmZpbHRlcigoe2ZvbnRTaXplfSk9PmZvbnRTaXplPE1JTklNQUxfTEVHSUJMRV9GT05UX1NJWkVfUFgpO2ZhaWxpbmdUZXh0TGVuZ3RoPWZhaWxpbmdOb2Rlcy5yZWR1Y2UoKHN1bSx7dGV4dExlbmd0aH0pPT5zdW0rPXRleHRMZW5ndGgsMCk7cmV0dXJuIFByb21pc2UuYWxsKGZhaWxpbmdOb2Rlcy5zb3J0KChhLGIpPT5iLnRleHRMZW5ndGgtYS50ZXh0TGVuZ3RoKS5zbGljZSgwLE1BWF9OT0RFU19BTkFMWVpFRCkubWFwKGluZm89PmdldEZvbnRTaXplU291cmNlUnVsZShwYXNzQ29udGV4dC5kcml2ZXIsaW5mby5ub2RlKS50aGVuKHNvdXJjZVJ1bGU9PntpZihzb3VyY2VSdWxlKXtpbmZvLmNzc1J1bGU9e3R5cGU6c291cmNlUnVsZS50eXBlLHJhbmdlOnNvdXJjZVJ1bGUucmFuZ2Usc3R5bGVTaGVldElkOnNvdXJjZVJ1bGUuc3R5bGVTaGVldElkfTtpZihzb3VyY2VSdWxlLnBhcmVudFJ1bGUpe2luZm8uY3NzUnVsZS5wYXJlbnRSdWxlPXtvcmlnaW46c291cmNlUnVsZS5wYXJlbnRSdWxlLm9yaWdpbixzZWxlY3RvcnM6c291cmNlUnVsZS5wYXJlbnRSdWxlLnNlbGVjdG9yc307fX0KcmV0dXJuIGluZm87fSkpKTt9KS50aGVuKGFuYWx5emVkRmFpbGluZ05vZGVzRGF0YT0+e3Bhc3NDb250ZXh0LmRyaXZlci5vZmYoJ0NTUy5zdHlsZVNoZWV0QWRkZWQnLG9uU3R5bGVzaGVldEFkZCk7Y29uc3QgYW5hbHl6ZWRGYWlsaW5nVGV4dExlbmd0aD1hbmFseXplZEZhaWxpbmdOb2Rlc0RhdGEucmVkdWNlKChzdW0se3RleHRMZW5ndGh9KT0+c3VtKz10ZXh0TGVuZ3RoLDApO2FuYWx5emVkRmFpbGluZ05vZGVzRGF0YS5maWx0ZXIoZGF0YT0+ZGF0YS5jc3NSdWxlJiZkYXRhLmNzc1J1bGUuc3R5bGVTaGVldElkKS5mb3JFYWNoKGRhdGE9PmRhdGEuY3NzUnVsZS5zdHlsZXNoZWV0PXN0eWxlc2hlZXRzLmdldChkYXRhLmNzc1J1bGUuc3R5bGVTaGVldElkKSk7cmV0dXJuIFByb21pc2UuYWxsKFtwYXNzQ29udGV4dC5kcml2ZXIuc2VuZENvbW1hbmQoJ0RPTS5kaXNhYmxlJykscGFzc0NvbnRleHQuZHJpdmVyLnNlbmRDb21tYW5kKCdDU1MuZGlzYWJsZScpXSkudGhlbihfPT4oe2FuYWx5emVkRmFpbGluZ05vZGVzRGF0YSxhbmFseXplZEZhaWxpbmdUZXh0TGVuZ3RoLGZhaWxpbmdUZXh0TGVuZ3RoLHZpc2l0ZWRUZXh0TGVuZ3RoLHRvdGFsVGV4dExlbmd0aH0pKTt9KTt9fQptb2R1bGUuZXhwb3J0cz1Gb250U2l6ZTt9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7Ii4uLy4uLy4uL2xpYi9zZW50cnkuanMiOjQwLCIuLi8uLi8uLi9saWIvd2ViLWluc3BlY3RvciI6NDcsIi4uLy4uL2RyaXZlci5qcyI6MTcsIi4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3Nlby9ocmVmbGFuZyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuLi9nYXRoZXJlcicpO2NsYXNzIEhyZWZsYW5nIGV4dGVuZHMgR2F0aGVyZXJ7YWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO3JldHVybiBkcml2ZXIucXVlcnlTZWxlY3RvckFsbCgnaGVhZCBsaW5rW3JlbD0iYWx0ZXJuYXRlIiBpXVtocmVmbGFuZ10nKS50aGVuKG5vZGVzPT5Qcm9taXNlLmFsbChub2Rlcy5tYXAobm9kZT0+UHJvbWlzZS5hbGwoW25vZGUuZ2V0QXR0cmlidXRlKCdocmVmJyksbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWZsYW5nJyldKSkpKS50aGVuKGF0dHJpYnV0ZVZhbHVlcz0+YXR0cmlidXRlVmFsdWVzJiZhdHRyaWJ1dGVWYWx1ZXMubWFwKHZhbHVlcz0+e2NvbnN0W2hyZWYsaHJlZmxhbmddPXZhbHVlcztyZXR1cm57aHJlZjpocmVmfHwnJyxocmVmbGFuZzpocmVmbGFuZ3x8Jyd9O30pKTt9fQptb2R1bGUuZXhwb3J0cz1IcmVmbGFuZzt9LHsiLi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvc2VvL21ldGEtZGVzY3JpcHRpb24iOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTtjbGFzcyBNZXRhRGVzY3JpcHRpb24gZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIGRyaXZlci5xdWVyeVNlbGVjdG9yKCdoZWFkIG1ldGFbbmFtZT0iZGVzY3JpcHRpb24iIGldJykudGhlbihub2RlPT5ub2RlJiZub2RlLmdldEF0dHJpYnV0ZSgnY29udGVudCcpKTt9fQptb2R1bGUuZXhwb3J0cz1NZXRhRGVzY3JpcHRpb247fSx7Ii4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3Nlby9tZXRhLXJvYm90cyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuLi9nYXRoZXJlcicpO2NsYXNzIE1ldGFSb2JvdHMgZXh0ZW5kcyBHYXRoZXJlcnthZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7cmV0dXJuIGRyaXZlci5xdWVyeVNlbGVjdG9yKCdoZWFkIG1ldGFbbmFtZT0icm9ib3RzIiBpXScpLnRoZW4obm9kZT0+bm9kZSYmbm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSk7fX0KbW9kdWxlLmV4cG9ydHM9TWV0YVJvYm90czt9LHsiLi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvc2VvL3JvYm90cy10eHQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi4vZ2F0aGVyZXInKTthc3luYyBmdW5jdGlvbiBnZXRSb2JvdHNUeHRDb250ZW50KCl7dHJ5e2NvbnN0IHJlc3BvbnNlPWF3YWl0IGZldGNoKG5ldyBVUkwoJy9yb2JvdHMudHh0Jyxsb2NhdGlvbi5ocmVmKS5ocmVmKTtpZighcmVzcG9uc2Uub2spe3JldHVybntzdGF0dXM6cmVzcG9uc2Uuc3RhdHVzLGNvbnRlbnQ6bnVsbH07fQpjb25zdCBjb250ZW50PWF3YWl0IHJlc3BvbnNlLnRleHQoKTtyZXR1cm57c3RhdHVzOnJlc3BvbnNlLnN0YXR1cyxjb250ZW50fTt9Y2F0Y2goXyl7cmV0dXJue3N0YXR1czpudWxsLGNvbnRlbnQ6bnVsbH07fX0KY2xhc3MgUm9ib3RzVHh0IGV4dGVuZHMgR2F0aGVyZXJ7YWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtyZXR1cm4gcGFzc0NvbnRleHQuZHJpdmVyLmV2YWx1YXRlQXN5bmMoYCgke2dldFJvYm90c1R4dENvbnRlbnQudG9TdHJpbmcoKX0oKSlgKTt9fQptb2R1bGUuZXhwb3J0cz1Sb2JvdHNUeHQ7fSx7Ii4uL2dhdGhlcmVyIjoxOX1dLCIuLi9nYXRoZXIvZ2F0aGVyZXJzL3NlcnZpY2Utd29ya2VyIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjbGFzcyBTZXJ2aWNlV29ya2VyIGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYmVmb3JlUGFzcyhwYXNzQ29udGV4dCl7Y29uc3R7dmVyc2lvbnN9PWF3YWl0IHBhc3NDb250ZXh0LmRyaXZlci5nZXRTZXJ2aWNlV29ya2VyVmVyc2lvbnMoKTtyZXR1cm57dmVyc2lvbnN9O319Cm1vZHVsZS5leHBvcnRzPVNlcnZpY2VXb3JrZXI7fSx7Ii4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvc3RhcnQtdXJsIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEdhdGhlcmVyPXJlcXVpcmUoJy4vZ2F0aGVyZXInKTtjb25zdCBtYW5pZmVzdFBhcnNlcj1yZXF1aXJlKCcuLi8uLi9saWIvbWFuaWZlc3QtcGFyc2VyJyk7Y29uc3QgRHJpdmVyPXJlcXVpcmUoJy4uL2RyaXZlci5qcycpO2NsYXNzIFN0YXJ0VXJsIGV4dGVuZHMgR2F0aGVyZXJ7YWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO3JldHVybiBkcml2ZXIuZ29PbmxpbmUocGFzc0NvbnRleHQpLnRoZW4oKCk9PmRyaXZlci5nZXRBcHBNYW5pZmVzdCgpKS50aGVuKHJlc3BvbnNlPT5kcml2ZXIuZ29PZmZsaW5lKCkudGhlbigoKT0+cmVzcG9uc2UpKS50aGVuKHJlc3BvbnNlPT5yZXNwb25zZSYmbWFuaWZlc3RQYXJzZXIocmVzcG9uc2UuZGF0YSxyZXNwb25zZS51cmwscGFzc0NvbnRleHQudXJsKSkudGhlbihtYW5pZmVzdD0+e2NvbnN0IHN0YXJ0VXJsSW5mbz10aGlzLl9yZWFkTWFuaWZlc3RTdGFydFVybChtYW5pZmVzdCk7aWYoc3RhcnRVcmxJbmZvLmlzUmVhZEZhaWx1cmUpe3JldHVybntzdGF0dXNDb2RlOi0xLGRlYnVnU3RyaW5nOnN0YXJ0VXJsSW5mby5yZWFzb259O30KcmV0dXJuIHRoaXMuX2F0dGVtcHRNYW5pZmVzdEZldGNoKHBhc3NDb250ZXh0LmRyaXZlcixzdGFydFVybEluZm8uc3RhcnRVcmwpO30pLmNhdGNoKCgpPT57cmV0dXJue3N0YXR1c0NvZGU6LTEsZGVidWdTdHJpbmc6J1VuYWJsZSB0byBmZXRjaCBzdGFydCBVUkwgdmlhIHNlcnZpY2Ugd29ya2VyJ307fSk7fQpfcmVhZE1hbmlmZXN0U3RhcnRVcmwobWFuaWZlc3Qpe2lmKCFtYW5pZmVzdHx8IW1hbmlmZXN0LnZhbHVlKXtjb25zdCBkZXRhaWxlZE1zZz1tYW5pZmVzdCYmbWFuaWZlc3QuZGVidWdTdHJpbmc7aWYoZGV0YWlsZWRNc2cpe3JldHVybntpc1JlYWRGYWlsdXJlOnRydWUscmVhc29uOmBFcnJvciBmZXRjaGluZyB3ZWIgYXBwIG1hbmlmZXN0OiAke2RldGFpbGVkTXNnfWB9O31lbHNle3JldHVybntpc1JlYWRGYWlsdXJlOnRydWUscmVhc29uOmBObyB1c2FibGUgd2ViIGFwcCBtYW5pZmVzdCBmb3VuZCBvbiBwYWdlYH07fX0KaWYobWFuaWZlc3QudmFsdWUuc3RhcnRfdXJsLmRlYnVnU3RyaW5nKXtyZXR1cm57aXNSZWFkRmFpbHVyZTp0cnVlLHJlYXNvbjptYW5pZmVzdC52YWx1ZS5zdGFydF91cmwuZGVidWdTdHJpbmd9O30KcmV0dXJue2lzUmVhZEZhaWx1cmU6ZmFsc2Usc3RhcnRVcmw6bWFuaWZlc3QudmFsdWUuc3RhcnRfdXJsLnZhbHVlfTt9Cl9hdHRlbXB0TWFuaWZlc3RGZXRjaChkcml2ZXIsc3RhcnRVcmwpe2NvbnN0IHRpbWVvdXRQcm9taXNlPW5ldyBQcm9taXNlKHJlc29sdmU9PnNldFRpbWVvdXQoKCk9PnJlc29sdmUoe3N0YXR1c0NvZGU6LTEsZGVidWdTdHJpbmc6J1RpbWVkIG91dCB3YWl0aW5nIGZvciBmZXRjaGVkIHN0YXJ0X3VybCd9KSwzMDAwKSk7Y29uc3QgZmV0Y2hQcm9taXNlPW5ldyBQcm9taXNlKHJlc29sdmU9Pntkcml2ZXIub24oJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCcsb25SZXNwb25zZVJlY2VpdmVkKTtmdW5jdGlvbiBvblJlc3BvbnNlUmVjZWl2ZWQocmVzcG9uc2VFdmVudCl7Y29uc3R7cmVzcG9uc2V9PXJlc3BvbnNlRXZlbnQ7aWYocmVzcG9uc2UudXJsIT09c3RhcnRVcmwpcmV0dXJuO2RyaXZlci5vZmYoJ05ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCcsb25SZXNwb25zZVJlY2VpdmVkKTtpZighcmVzcG9uc2UuZnJvbVNlcnZpY2VXb3JrZXIpe3JldHVybiByZXNvbHZlKHtzdGF0dXNDb2RlOi0xLGRlYnVnU3RyaW5nOidVbmFibGUgdG8gZmV0Y2ggc3RhcnQgVVJMIHZpYSBzZXJ2aWNlIHdvcmtlcid9KTt9CnJldHVybiByZXNvbHZlKHtzdGF0dXNDb2RlOnJlc3BvbnNlLnN0YXR1c30pO319KTtyZXR1cm4gZHJpdmVyLmV2YWx1YXRlQXN5bmMoYHdpbmRvdy5sb2NhdGlvbiA9ICcke3N0YXJ0VXJsfSdgKS50aGVuKCgpPT5Qcm9taXNlLnJhY2UoW2ZldGNoUHJvbWlzZSx0aW1lb3V0UHJvbWlzZV0pKTt9fQptb2R1bGUuZXhwb3J0cz1TdGFydFVybDt9LHsiLi4vLi4vbGliL21hbmlmZXN0LXBhcnNlciI6MzYsIi4uL2RyaXZlci5qcyI6MTcsIi4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvdGhlbWUtY29sb3IiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2NsYXNzIFRoZW1lQ29sb3IgZXh0ZW5kcyBHYXRoZXJlcnthc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQpe2NvbnN0IGRyaXZlcj1wYXNzQ29udGV4dC5kcml2ZXI7Y29uc3QgbWV0YUVsPWF3YWl0IGRyaXZlci5xdWVyeVNlbGVjdG9yKCdoZWFkIG1ldGFbbmFtZT0idGhlbWUtY29sb3IiIGldJyk7cmV0dXJuIG1ldGFFbCYmbWV0YUVsLmdldEF0dHJpYnV0ZSgnY29udGVudCcpO319Cm1vZHVsZS5leHBvcnRzPVRoZW1lQ29sb3I7fSx7Ii4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvdmlld3BvcnQtZGltZW5zaW9ucyI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBHYXRoZXJlcj1yZXF1aXJlKCcuL2dhdGhlcmVyJyk7ZnVuY3Rpb24gZ2V0Vmlld3BvcnREaW1lbnNpb25zKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7aW5uZXJXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxpbm5lckhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDp3aW5kb3cub3V0ZXJXaWR0aCxvdXRlckhlaWdodDp3aW5kb3cub3V0ZXJIZWlnaHQsZGV2aWNlUGl4ZWxSYXRpbzp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb30pO30KY2xhc3MgVmlld3BvcnREaW1lbnNpb25zIGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO2NvbnN0IGRpbWVuc2lvbnM9YXdhaXQgZHJpdmVyLmV2YWx1YXRlQXN5bmMoYCgke2dldFZpZXdwb3J0RGltZW5zaW9ucy50b1N0cmluZygpfSgpKWAse3VzZUlzb2xhdGlvbjp0cnVlfSk7Y29uc3QgYWxsTnVtZXJpYz1PYmplY3QudmFsdWVzKGRpbWVuc2lvbnMpLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSk7aWYoIWFsbE51bWVyaWMpe2NvbnN0IHJlc3VsdHM9SlNPTi5zdHJpbmdpZnkoZGltZW5zaW9ucyk7dGhyb3cgbmV3IEVycm9yKGBWaWV3cG9ydERpbWVuc2lvbnMgcmVzdWx0cyB3ZXJlIG5vdCBudW1lcmljOiAke3Jlc3VsdHN9YCk7fQpyZXR1cm4gZGltZW5zaW9uczt9fQptb2R1bGUuZXhwb3J0cz1WaWV3cG9ydERpbWVuc2lvbnM7fSx7Ii4vZ2F0aGVyZXIiOjE5fV0sIi4uL2dhdGhlci9nYXRoZXJlcnMvdmlld3BvcnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgR2F0aGVyZXI9cmVxdWlyZSgnLi9nYXRoZXJlcicpO2NsYXNzIFZpZXdwb3J0IGV4dGVuZHMgR2F0aGVyZXJ7YXN5bmMgYWZ0ZXJQYXNzKHBhc3NDb250ZXh0KXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO2NvbnN0IG1ldGFFbD1hd2FpdCBkcml2ZXIucXVlcnlTZWxlY3RvcignaGVhZCBtZXRhW25hbWU9InZpZXdwb3J0IiBpXScpO3JldHVybiBtZXRhRWwmJm1ldGFFbC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTt9fQptb2R1bGUuZXhwb3J0cz1WaWV3cG9ydDt9LHsiLi9nYXRoZXJlciI6MTl9XSwiLi9nYXRoZXIvY29tcHV0ZWQvY3JpdGljYWwtcmVxdWVzdC1jaGFpbnMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NvbnN0IGFzc2VydD1yZXF1aXJlKCdhc3NlcnQnKTtjbGFzcyBDcml0aWNhbFJlcXVlc3RDaGFpbnMgZXh0ZW5kcyBDb21wdXRlZEFydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ0NyaXRpY2FsUmVxdWVzdENoYWlucyc7fQpzdGF0aWMgaXNDcml0aWNhbChyZXF1ZXN0LG1haW5SZXNvdXJjZSl7YXNzZXJ0Lm9rKG1haW5SZXNvdXJjZSwnbWFpblJlc291cmNlIG5vdCBwcm92aWRlZCcpO2lmKHJlcXVlc3QuaXNMaW5rUHJlbG9hZCl7cmV0dXJuIGZhbHNlO30KY29uc3QgaXNJZnJhbWU9cmVxdWVzdC5yZXNvdXJjZVR5cGU9PT1OZXR3b3JrUmVxdWVzdC5UWVBFUy5Eb2N1bWVudCYmcmVxdWVzdC5mcmFtZUlkIT09bWFpblJlc291cmNlLmZyYW1lSWQ7Y29uc3Qgbm9uQ3JpdGljYWxSZXNvdXJjZVR5cGVzPVtOZXR3b3JrUmVxdWVzdC5UWVBFUy5JbWFnZSxOZXR3b3JrUmVxdWVzdC5UWVBFUy5YSFIsTmV0d29ya1JlcXVlc3QuVFlQRVMuRmV0Y2gsTmV0d29ya1JlcXVlc3QuVFlQRVMuRXZlbnRTb3VyY2VdO2lmKG5vbkNyaXRpY2FsUmVzb3VyY2VUeXBlcy5pbmNsdWRlcyhyZXF1ZXN0LnJlc291cmNlVHlwZXx8J090aGVyJyl8fGlzSWZyYW1lfHxyZXF1ZXN0Lm1pbWVUeXBlJiZyZXF1ZXN0Lm1pbWVUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKXtyZXR1cm4gZmFsc2U7fQpyZXR1cm5bJ1ZlcnlIaWdoJywnSGlnaCcsJ01lZGl1bSddLmluY2x1ZGVzKHJlcXVlc3QucHJpb3JpdHkpO30Kc3RhdGljIGV4dHJhY3RDaGFpbihuZXR3b3JrUmVjb3JkcyxtYWluUmVzb3VyY2Upe25ldHdvcmtSZWNvcmRzPW5ldHdvcmtSZWNvcmRzLmZpbHRlcihyZXE9PnJlcS5maW5pc2hlZCk7Y29uc3QgcmVxdWVzdElkVG9SZXF1ZXN0cz1uZXcgTWFwKCk7Zm9yKGNvbnN0IHJlcXVlc3Qgb2YgbmV0d29ya1JlY29yZHMpe3JlcXVlc3RJZFRvUmVxdWVzdHMuc2V0KHJlcXVlc3QucmVxdWVzdElkLHJlcXVlc3QpO30KY29uc3QgY3JpdGljYWxSZXF1ZXN0cz1uZXR3b3JrUmVjb3Jkcy5maWx0ZXIocmVxdWVzdD0+Q3JpdGljYWxSZXF1ZXN0Q2hhaW5zLmlzQ3JpdGljYWwocmVxdWVzdCxtYWluUmVzb3VyY2UpKTtjb25zdCBjcml0aWNhbFJlcXVlc3RDaGFpbnM9e307Zm9yKGNvbnN0IHJlcXVlc3Qgb2YgY3JpdGljYWxSZXF1ZXN0cyl7Y29uc3QgYW5jZXN0b3JzPVtdO2xldCBhbmNlc3RvclJlcXVlc3Q9cmVxdWVzdC5pbml0aWF0b3JSZXF1ZXN0O2xldCBub2RlPWNyaXRpY2FsUmVxdWVzdENoYWluczt3aGlsZShhbmNlc3RvclJlcXVlc3Qpe2NvbnN0IGFuY2VzdG9ySXNDcml0aWNhbD1Dcml0aWNhbFJlcXVlc3RDaGFpbnMuaXNDcml0aWNhbChhbmNlc3RvclJlcXVlc3QsbWFpblJlc291cmNlKTtpZighYW5jZXN0b3JJc0NyaXRpY2FsfHxhbmNlc3RvcnMuaW5jbHVkZXMoYW5jZXN0b3JSZXF1ZXN0LnJlcXVlc3RJZCkpe2FuY2VzdG9ycy5sZW5ndGg9MDtub2RlPXVuZGVmaW5lZDticmVhazt9CmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yUmVxdWVzdC5yZXF1ZXN0SWQpO2FuY2VzdG9yUmVxdWVzdD1hbmNlc3RvclJlcXVlc3QuaW5pdGlhdG9yUmVxdWVzdDt9CmxldCBhbmNlc3Rvcj1hbmNlc3RvcnMucG9wKCk7d2hpbGUoYW5jZXN0b3ImJm5vZGUpe2NvbnN0IHBhcmVudFJlcXVlc3Q9cmVxdWVzdElkVG9SZXF1ZXN0cy5nZXQoYW5jZXN0b3IpO2lmKCFwYXJlbnRSZXF1ZXN0KXt0aHJvdyBuZXcgRXJyb3IoYHJlcXVlc3Qgd2l0aCBpZCAke2FuY2VzdG9yfSBub3QgZm91bmQuYCk7fQpjb25zdCBwYXJlbnRSZXF1ZXN0SWQ9cGFyZW50UmVxdWVzdC5yZXF1ZXN0SWQ7aWYoIW5vZGVbcGFyZW50UmVxdWVzdElkXSl7bm9kZVtwYXJlbnRSZXF1ZXN0SWRdPXtyZXF1ZXN0OnBhcmVudFJlcXVlc3QsY2hpbGRyZW46e319O30KYW5jZXN0b3I9YW5jZXN0b3JzLnBvcCgpO25vZGU9bm9kZVtwYXJlbnRSZXF1ZXN0SWRdLmNoaWxkcmVuO30KaWYoIW5vZGUpe2NvbnRpbnVlO30KaWYobm9kZVtyZXF1ZXN0LnJlcXVlc3RJZF0pe2NvbnRpbnVlO30Kbm9kZVtyZXF1ZXN0LnJlcXVlc3RJZF09e3JlcXVlc3QsY2hpbGRyZW46e319O30KcmV0dXJuIGNyaXRpY2FsUmVxdWVzdENoYWluczt9CmFzeW5jIGNvbXB1dGVfKGRhdGEsYXJ0aWZhY3RzKXtjb25zdFtuZXR3b3JrUmVjb3JkcyxtYWluUmVzb3VyY2VdPWF3YWl0IFByb21pc2UuYWxsKFthcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRhdGEuZGV2dG9vbHNMb2cpLGFydGlmYWN0cy5yZXF1ZXN0TWFpblJlc291cmNlKGRhdGEpXSk7cmV0dXJuIENyaXRpY2FsUmVxdWVzdENoYWlucy5leHRyYWN0Q2hhaW4obmV0d29ya1JlY29yZHMsbWFpblJlc291cmNlKTt9fQptb2R1bGUuZXhwb3J0cz1Dcml0aWNhbFJlcXVlc3RDaGFpbnM7fSx7Ii4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QiOjM4LCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMSwiYXNzZXJ0Ijo1M31dLCIuL2dhdGhlci9jb21wdXRlZC9sb2FkLXNpbXVsYXRvciI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBDb21wdXRlZEFydGlmYWN0PXJlcXVpcmUoJy4vY29tcHV0ZWQtYXJ0aWZhY3QnKTtjb25zdCBjb25zdGFudHM9cmVxdWlyZSgnLi4vLi4vY29uZmlnL2NvbnN0YW50cycpO2NvbnN0IFNpbXVsYXRvcj1yZXF1aXJlKCcuLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9zaW11bGF0b3Ivc2ltdWxhdG9yJyk7Y2xhc3MgTG9hZFNpbXVsYXRvckFydGlmYWN0IGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidMb2FkU2ltdWxhdG9yJzt9CmFzeW5jIGNvbXB1dGVfKGRhdGEsYXJ0aWZhY3RzKXtjb25zdHt0aHJvdHRsaW5nTWV0aG9kLHRocm90dGxpbmd9PWRhdGEuc2V0dGluZ3M7Y29uc3QgbmV0d29ya0FuYWx5c2lzPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya0FuYWx5c2lzKGRhdGEuZGV2dG9vbHNMb2cpO2NvbnN0IG9wdGlvbnM9e2FkZGl0aW9uYWxSdHRCeU9yaWdpbjpuZXR3b3JrQW5hbHlzaXMuYWRkaXRpb25hbFJ0dEJ5T3JpZ2luLHNlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luOm5ldHdvcmtBbmFseXNpcy5zZXJ2ZXJSZXNwb25zZVRpbWVCeU9yaWdpbn07c3dpdGNoKHRocm90dGxpbmdNZXRob2Qpe2Nhc2UncHJvdmlkZWQnOm9wdGlvbnMucnR0PW5ldHdvcmtBbmFseXNpcy5ydHQ7b3B0aW9ucy50aHJvdWdocHV0PW5ldHdvcmtBbmFseXNpcy50aHJvdWdocHV0O29wdGlvbnMuY3B1U2xvd2Rvd25NdWx0aXBsaWVyPTE7b3B0aW9ucy5sYXlvdXRUYXNrTXVsdGlwbGllcj0xO2JyZWFrO2Nhc2UnZGV2dG9vbHMnOmlmKHRocm90dGxpbmcpe29wdGlvbnMucnR0PXRocm90dGxpbmcucmVxdWVzdExhdGVuY3lNcy9jb25zdGFudHMudGhyb3R0bGluZy5ERVZUT09MU19SVFRfQURKVVNUTUVOVF9GQUNUT1I7b3B0aW9ucy50aHJvdWdocHV0PXRocm90dGxpbmcuZG93bmxvYWRUaHJvdWdocHV0S2JwcyoxMDI0L2NvbnN0YW50cy50aHJvdHRsaW5nLkRFVlRPT0xTX1RIUk9VR0hQVVRfQURKVVNUTUVOVF9GQUNUT1I7fQpvcHRpb25zLmNwdVNsb3dkb3duTXVsdGlwbGllcj0xO29wdGlvbnMubGF5b3V0VGFza011bHRpcGxpZXI9MTticmVhaztjYXNlJ3NpbXVsYXRlJzppZih0aHJvdHRsaW5nKXtvcHRpb25zLnJ0dD10aHJvdHRsaW5nLnJ0dE1zO29wdGlvbnMudGhyb3VnaHB1dD10aHJvdHRsaW5nLnRocm91Z2hwdXRLYnBzKjEwMjQ7b3B0aW9ucy5jcHVTbG93ZG93bk11bHRpcGxpZXI9dGhyb3R0bGluZy5jcHVTbG93ZG93bk11bHRpcGxpZXI7fQpicmVhaztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIG5ldyBTaW11bGF0b3Iob3B0aW9ucyk7fX0KbW9kdWxlLmV4cG9ydHM9TG9hZFNpbXVsYXRvckFydGlmYWN0O30seyIuLi8uLi9jb25maWcvY29uc3RhbnRzIjo4LCIuLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9zaW11bGF0b3Ivc2ltdWxhdG9yIjoyOCwiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbWFpbi1yZXNvdXJjZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBDb21wdXRlZEFydGlmYWN0PXJlcXVpcmUoJy4vY29tcHV0ZWQtYXJ0aWZhY3QnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vLi4vbGliL3VybC1zaGltJyk7Y2xhc3MgTWFpblJlc291cmNlIGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidNYWluUmVzb3VyY2UnO30KYXN5bmMgY29tcHV0ZV8oZGF0YSxhcnRpZmFjdHMpe2NvbnN0IGZpbmFsVXJsPWRhdGEuVVJMLmZpbmFsVXJsO2NvbnN0IHJlcXVlc3RzPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGF0YS5kZXZ0b29sc0xvZyk7Y29uc3QgbWFpblJlc291cmNlPXJlcXVlc3RzLmZpbmQocmVxdWVzdD0+ZmluYWxVcmwuc3RhcnRzV2l0aChyZXF1ZXN0LnVybCkmJlVSTC5lcXVhbFdpdGhFeGNsdWRlZEZyYWdtZW50cyhyZXF1ZXN0LnVybCxmaW5hbFVybCkpO2lmKCFtYWluUmVzb3VyY2Upe3Rocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGlkZW50aWZ5IHRoZSBtYWluIHJlc291cmNlJyk7fQpyZXR1cm4gbWFpblJlc291cmNlO319Cm1vZHVsZS5leHBvcnRzPU1haW5SZXNvdXJjZTt9LHsiLi4vLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbWFpbi10aHJlYWQtdGFza3MiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3R7dGFza0dyb3Vwcyx0YXNrTmFtZVRvR3JvdXB9PXJlcXVpcmUoJy4uLy4uL2xpYi90YXNrLWdyb3VwcycpO2NsYXNzIE1haW5UaHJlYWRUYXNrcyBleHRlbmRzIENvbXB1dGVkQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nTWFpblRocmVhZFRhc2tzJzt9CnN0YXRpYyBfY3JlYXRlTmV3VGFza05vZGUoZXZlbnQscGFyZW50KXtjb25zdCBuZXdUYXNrPXtldmVudCxzdGFydFRpbWU6ZXZlbnQudHMsZW5kVGltZTpldmVudC5waD09PSdYJz9ldmVudC50cytOdW1iZXIoZXZlbnQuZHVyfHwwKTpOYU4scGFyZW50OnBhcmVudCxjaGlsZHJlbjpbXSxhdHRyaWJ1dGFibGVVUkxzOltdLGdyb3VwOnRhc2tHcm91cHMub3RoZXIsZHVyYXRpb246TmFOLHNlbGZUaW1lOk5hTn07aWYocGFyZW50KXtwYXJlbnQuY2hpbGRyZW4ucHVzaChuZXdUYXNrKTt9CnJldHVybiBuZXdUYXNrO30Kc3RhdGljIF9jcmVhdGVUYXNrc0Zyb21FdmVudHMobWFpblRocmVhZEV2ZW50cyl7Y29uc3QgdGFza3M9W107bGV0IGN1cnJlbnRUYXNrO2Zvcihjb25zdCBldmVudCBvZiBtYWluVGhyZWFkRXZlbnRzKXtpZihldmVudC5waCE9PSdYJyYmZXZlbnQucGghPT0nQicmJmV2ZW50LnBoIT09J0UnKWNvbnRpbnVlO3doaWxlKGN1cnJlbnRUYXNrJiZOdW1iZXIuaXNGaW5pdGUoY3VycmVudFRhc2suZW5kVGltZSkmJmN1cnJlbnRUYXNrLmVuZFRpbWU8PWV2ZW50LnRzKQp7Y3VycmVudFRhc2s9Y3VycmVudFRhc2sucGFyZW50O30KaWYoIWN1cnJlbnRUYXNrKXtpZihldmVudC5waD09PSdFJyl7dGhyb3cgbmV3IEVycm9yKCdGYXRhbCB0cmFjZSBsb2dpYyBlcnJvcicpO30KY3VycmVudFRhc2s9TWFpblRocmVhZFRhc2tzLl9jcmVhdGVOZXdUYXNrTm9kZShldmVudCk7dGFza3MucHVzaChjdXJyZW50VGFzayk7Y29udGludWU7fQppZihldmVudC5waD09PSdYJ3x8ZXZlbnQucGg9PT0nQicpe2NvbnN0IG5ld1Rhc2s9TWFpblRocmVhZFRhc2tzLl9jcmVhdGVOZXdUYXNrTm9kZShldmVudCxjdXJyZW50VGFzayk7dGFza3MucHVzaChuZXdUYXNrKTtjdXJyZW50VGFzaz1uZXdUYXNrO31lbHNle2lmKGN1cnJlbnRUYXNrLmV2ZW50LnBoIT09J0InKXt0aHJvdyBuZXcgRXJyb3IoJ0ZhdGFsIHRyYWNlIGxvZ2ljIGVycm9yJyk7fQpjdXJyZW50VGFzay5lbmRUaW1lPWV2ZW50LnRzO2N1cnJlbnRUYXNrPWN1cnJlbnRUYXNrLnBhcmVudDt9fQpyZXR1cm4gdGFza3M7fQpzdGF0aWMgX2NvbXB1dGVSZWN1cnNpdmVTZWxmVGltZSh0YXNrKXtjb25zdCBjaGlsZFRpbWU9dGFzay5jaGlsZHJlbi5tYXAoTWFpblRocmVhZFRhc2tzLl9jb21wdXRlUmVjdXJzaXZlU2VsZlRpbWUpLnJlZHVjZSgoc3VtLGNoaWxkKT0+c3VtK2NoaWxkLDApO3Rhc2suZHVyYXRpb249dGFzay5lbmRUaW1lLXRhc2suc3RhcnRUaW1lO3Rhc2suc2VsZlRpbWU9dGFzay5kdXJhdGlvbi1jaGlsZFRpbWU7cmV0dXJuIHRhc2suZHVyYXRpb247fQpzdGF0aWMgX2NvbXB1dGVSZWN1cnNpdmVBdHRyaWJ1dGFibGVVUkxzKHRhc2sscGFyZW50VVJMcyl7Y29uc3QgYXJnc0RhdGE9dGFzay5ldmVudC5hcmdzLmRhdGF8fHt9O2NvbnN0IHN0YWNrRnJhbWVVUkxzPShhcmdzRGF0YS5zdGFja1RyYWNlfHxbXSkubWFwKGVudHJ5PT5lbnRyeS51cmwpO2xldCB0YXNrVVJMcz1bXTtzd2l0Y2godGFzay5ldmVudC5uYW1lKXtjYXNlJ3Y4LmNvbXBpbGUnOmNhc2UnRXZhbHVhdGVTY3JpcHQnOmNhc2UnRnVuY3Rpb25DYWxsJzp0YXNrVVJMcz1bYXJnc0RhdGEudXJsXS5jb25jYXQoc3RhY2tGcmFtZVVSTHMpO2JyZWFrO2Nhc2UndjguY29tcGlsZU1vZHVsZSc6dGFza1VSTHM9W3Rhc2suZXZlbnQuYXJncy5maWxlTmFtZV0uY29uY2F0KHN0YWNrRnJhbWVVUkxzKTticmVhaztkZWZhdWx0OnRhc2tVUkxzPXN0YWNrRnJhbWVVUkxzO2JyZWFrO30KY29uc3QgYXR0cmlidXRhYmxlVVJMcz1BcnJheS5mcm9tKHBhcmVudFVSTHMpO2Zvcihjb25zdCB1cmwgb2YgdGFza1VSTHMpe2lmKCF1cmwpY29udGludWU7aWYoYXR0cmlidXRhYmxlVVJMc1thdHRyaWJ1dGFibGVVUkxzLmxlbmd0aC0xXT09PXVybCljb250aW51ZTthdHRyaWJ1dGFibGVVUkxzLnB1c2godXJsKTt9CnRhc2suYXR0cmlidXRhYmxlVVJMcz1hdHRyaWJ1dGFibGVVUkxzO3Rhc2suY2hpbGRyZW4uZm9yRWFjaChjaGlsZD0+TWFpblRocmVhZFRhc2tzLl9jb21wdXRlUmVjdXJzaXZlQXR0cmlidXRhYmxlVVJMcyhjaGlsZCxhdHRyaWJ1dGFibGVVUkxzKSk7fQpzdGF0aWMgX2NvbXB1dGVSZWN1cnNpdmVUYXNrR3JvdXAodGFzayxwYXJlbnRHcm91cCl7Y29uc3QgZ3JvdXA9dGFza05hbWVUb0dyb3VwW3Rhc2suZXZlbnQubmFtZV07dGFzay5ncm91cD1ncm91cHx8cGFyZW50R3JvdXB8fHRhc2tHcm91cHMub3RoZXI7dGFzay5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkPT5NYWluVGhyZWFkVGFza3MuX2NvbXB1dGVSZWN1cnNpdmVUYXNrR3JvdXAoY2hpbGQsdGFzay5ncm91cCkpO30Kc3RhdGljIGdldE1haW5UaHJlYWRUYXNrcyh0cmFjZUV2ZW50cyl7Y29uc3QgdGFza3M9TWFpblRocmVhZFRhc2tzLl9jcmVhdGVUYXNrc0Zyb21FdmVudHModHJhY2VFdmVudHMpO2Zvcihjb25zdCB0YXNrIG9mIHRhc2tzKXtpZih0YXNrLnBhcmVudCljb250aW51ZTtNYWluVGhyZWFkVGFza3MuX2NvbXB1dGVSZWN1cnNpdmVTZWxmVGltZSh0YXNrKTtNYWluVGhyZWFkVGFza3MuX2NvbXB1dGVSZWN1cnNpdmVBdHRyaWJ1dGFibGVVUkxzKHRhc2ssW10pO01haW5UaHJlYWRUYXNrcy5fY29tcHV0ZVJlY3Vyc2l2ZVRhc2tHcm91cCh0YXNrKTt9CmNvbnN0IGZpcnN0VHM9KHRhc2tzWzBdfHx7c3RhcnRUaW1lOjB9KS5zdGFydFRpbWU7Zm9yKGNvbnN0IHRhc2sgb2YgdGFza3Mpe3Rhc2suc3RhcnRUaW1lPSh0YXNrLnN0YXJ0VGltZS1maXJzdFRzKS8xMDAwO3Rhc2suZW5kVGltZT0odGFzay5lbmRUaW1lLWZpcnN0VHMpLzEwMDA7dGFzay5kdXJhdGlvbi89MTAwMDt0YXNrLnNlbGZUaW1lLz0xMDAwO2lmKCFOdW1iZXIuaXNGaW5pdGUodGFzay5zZWxmVGltZSkpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXNrIHRpbWluZyBkYXRhJyk7fX0KcmV0dXJuIHRhc2tzO30KYXN5bmMgY29tcHV0ZV8odHJhY2UsYXJ0aWZhY3RzKXtjb25zdHttYWluVGhyZWFkRXZlbnRzfT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdFRyYWNlT2ZUYWIodHJhY2UpO3JldHVybiBNYWluVGhyZWFkVGFza3MuZ2V0TWFpblRocmVhZFRhc2tzKG1haW5UaHJlYWRFdmVudHMpO319Cm1vZHVsZS5leHBvcnRzPU1haW5UaHJlYWRUYXNrczt9LHsiLi4vLi4vbGliL3Rhc2stZ3JvdXBzIjo0MywiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbWFuaWZlc3QtdmFsdWVzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IENvbXB1dGVkQXJ0aWZhY3Q9cmVxdWlyZSgnLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NvbnN0IGljb25zPXJlcXVpcmUoJy4uLy4uL2xpYi9pY29ucycpO2NvbnN0IFBXQV9ESVNQTEFZX1ZBTFVFUz1bJ21pbmltYWwtdWknLCdmdWxsc2NyZWVuJywnc3RhbmRhbG9uZSddO2NvbnN0IFNVR0dFU1RFRF9TSE9SVE5BTUVfTEVOR1RIPTEyO2NsYXNzIE1hbmlmZXN0VmFsdWVzIGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidNYW5pZmVzdFZhbHVlcyc7fQpzdGF0aWMgZ2V0IHZhbGlkaXR5SWRzKCl7cmV0dXJuWydoYXNNYW5pZmVzdCcsJ2hhc1BhcnNlYWJsZU1hbmlmZXN0J107fQpzdGF0aWMgZ2V0IG1hbmlmZXN0Q2hlY2tzKCl7cmV0dXJuW3tpZDonaGFzU3RhcnRVcmwnLGZhaWx1cmVUZXh0OidNYW5pZmVzdCBkb2VzIG5vdCBjb250YWluIGEgYHN0YXJ0X3VybGAnLHZhbGlkYXRlOm1hbmlmZXN0VmFsdWU9PiEhbWFuaWZlc3RWYWx1ZS5zdGFydF91cmwudmFsdWV9LHtpZDonaGFzSWNvbnNBdExlYXN0MTkycHgnLGZhaWx1cmVUZXh0OidNYW5pZmVzdCBkb2VzIG5vdCBoYXZlIGljb25zIGF0IGxlYXN0IDE5MnB4Jyx2YWxpZGF0ZTptYW5pZmVzdFZhbHVlPT5pY29ucy5kb0V4aXN0KG1hbmlmZXN0VmFsdWUpJiZpY29ucy5zaXplQXRMZWFzdCgxOTIsbWFuaWZlc3RWYWx1ZSkubGVuZ3RoPjB9LHtpZDonaGFzSWNvbnNBdExlYXN0NTEycHgnLGZhaWx1cmVUZXh0OidNYW5pZmVzdCBkb2VzIG5vdCBoYXZlIGljb25zIGF0IGxlYXN0IDUxMnB4Jyx2YWxpZGF0ZTptYW5pZmVzdFZhbHVlPT5pY29ucy5kb0V4aXN0KG1hbmlmZXN0VmFsdWUpJiZpY29ucy5zaXplQXRMZWFzdCg1MTIsbWFuaWZlc3RWYWx1ZSkubGVuZ3RoPjB9LHtpZDonaGFzUFdBRGlzcGxheVZhbHVlJyxmYWlsdXJlVGV4dDonTWFuaWZlc3RcJ3MgYGRpc3BsYXlgIHZhbHVlIGlzIG5vdCBvbmUgb2Y6ICcrUFdBX0RJU1BMQVlfVkFMVUVTLmpvaW4oJyB8ICcpLHZhbGlkYXRlOm1hbmlmZXN0VmFsdWU9PlBXQV9ESVNQTEFZX1ZBTFVFUy5pbmNsdWRlcyhtYW5pZmVzdFZhbHVlLmRpc3BsYXkudmFsdWUpfSx7aWQ6J2hhc0JhY2tncm91bmRDb2xvcicsZmFpbHVyZVRleHQ6J01hbmlmZXN0IGRvZXMgbm90IGhhdmUgYGJhY2tncm91bmRfY29sb3JgJyx2YWxpZGF0ZTptYW5pZmVzdFZhbHVlPT4hIW1hbmlmZXN0VmFsdWUuYmFja2dyb3VuZF9jb2xvci52YWx1ZX0se2lkOidoYXNUaGVtZUNvbG9yJyxmYWlsdXJlVGV4dDonTWFuaWZlc3QgZG9lcyBub3QgaGF2ZSBgdGhlbWVfY29sb3JgJyx2YWxpZGF0ZTptYW5pZmVzdFZhbHVlPT4hIW1hbmlmZXN0VmFsdWUudGhlbWVfY29sb3IudmFsdWV9LHtpZDonaGFzU2hvcnROYW1lJyxmYWlsdXJlVGV4dDonTWFuaWZlc3QgZG9lcyBub3QgaGF2ZSBgc2hvcnRfbmFtZWAnLHZhbGlkYXRlOm1hbmlmZXN0VmFsdWU9PiEhbWFuaWZlc3RWYWx1ZS5zaG9ydF9uYW1lLnZhbHVlfSx7aWQ6J3Nob3J0TmFtZUxlbmd0aCcsZmFpbHVyZVRleHQ6YE1hbmlmZXN0J3MgXGBzaG9ydF9uYW1lXGAgaXMgdG9vIGxvbmcgKD4ke1NVR0dFU1RFRF9TSE9SVE5BTUVfTEVOR1RIfSBgK2BjaGFyYWN0ZXJzKSB0byBiZSBkaXNwbGF5ZWQgb24gYSBob21lc2NyZWVuIHdpdGhvdXQgdHJ1bmNhdGlvbmAsdmFsaWRhdGU6bWFuaWZlc3RWYWx1ZT0+ISFtYW5pZmVzdFZhbHVlLnNob3J0X25hbWUudmFsdWUmJm1hbmlmZXN0VmFsdWUuc2hvcnRfbmFtZS52YWx1ZS5sZW5ndGg8PVNVR0dFU1RFRF9TSE9SVE5BTUVfTEVOR1RIfSx7aWQ6J2hhc05hbWUnLGZhaWx1cmVUZXh0OidNYW5pZmVzdCBkb2VzIG5vdCBoYXZlIGBuYW1lYCcsdmFsaWRhdGU6bWFuaWZlc3RWYWx1ZT0+ISFtYW5pZmVzdFZhbHVlLm5hbWUudmFsdWV9XTt9CmFzeW5jIGNvbXB1dGVfKG1hbmlmZXN0KXtsZXQgcGFyc2VGYWlsdXJlUmVhc29uO2lmKG1hbmlmZXN0PT09bnVsbCl7cmV0dXJue2lzUGFyc2VGYWlsdXJlOnRydWUscGFyc2VGYWlsdXJlUmVhc29uOidObyBtYW5pZmVzdCB3YXMgZmV0Y2hlZCcsYWxsQ2hlY2tzOltdfTt9CmNvbnN0IG1hbmlmZXN0VmFsdWU9bWFuaWZlc3QudmFsdWU7aWYobWFuaWZlc3RWYWx1ZT09PXVuZGVmaW5lZCl7cmV0dXJue2lzUGFyc2VGYWlsdXJlOnRydWUscGFyc2VGYWlsdXJlUmVhc29uOidNYW5pZmVzdCBmYWlsZWQgdG8gcGFyc2UgYXMgdmFsaWQgSlNPTicsYWxsQ2hlY2tzOltdfTt9CmNvbnN0IHJlbWFpbmluZ0NoZWNrcz1NYW5pZmVzdFZhbHVlcy5tYW5pZmVzdENoZWNrcy5tYXAoaXRlbT0+e3JldHVybntpZDppdGVtLmlkLGZhaWx1cmVUZXh0Oml0ZW0uZmFpbHVyZVRleHQscGFzc2luZzppdGVtLnZhbGlkYXRlKG1hbmlmZXN0VmFsdWUpfTt9KTtyZXR1cm57aXNQYXJzZUZhaWx1cmU6ZmFsc2UscGFyc2VGYWlsdXJlUmVhc29uLGFsbENoZWNrczpyZW1haW5pbmdDaGVja3N9O319Cm1vZHVsZS5leHBvcnRzPU1hbmlmZXN0VmFsdWVzO30seyIuLi8uLi9saWIvaWNvbnMiOjM0LCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMX1dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2VzdGltYXRlZC1pbnB1dC1sYXRlbmN5IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1ldHJpY0FydGlmYWN0PXJlcXVpcmUoJy4vbWV0cmljJyk7Y29uc3QgTEhFcnJvcj1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZXJyb3JzJyk7Y29uc3QgVHJhY2luZ1Byb2Nlc3Nvcj1yZXF1aXJlKCcuLi8uLi8uLi9saWIvdHJhY2VzL3RyYWNpbmctcHJvY2Vzc29yJyk7Y29uc3QgUk9MTElOR19XSU5ET1dfU0laRT01MDAwO2NsYXNzIEVzdGltYXRlZElucHV0TGF0ZW5jeSBleHRlbmRzIE1ldHJpY0FydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ0VzdGltYXRlZElucHV0TGF0ZW5jeSc7fQpzdGF0aWMgY2FsY3VsYXRlUm9sbGluZ1dpbmRvd0VJTChldmVudHMpe2NvbnN0IGNhbmRpZGF0ZVN0YXJ0RXZ0cz1ldmVudHMuZmlsdGVyKGV2dD0+ZXZ0LmR1cmF0aW9uPj0xMCk7bGV0IHdvcnN0OTB0aFBlcmNlbnRpbGVMYXRlbmN5PTE2O2Zvcihjb25zdCBzdGFydEV2dCBvZiBjYW5kaWRhdGVTdGFydEV2dHMpe2NvbnN0IGxhdGVuY3lQZXJjZW50aWxlcz1UcmFjaW5nUHJvY2Vzc29yLmdldFJpc2tUb1Jlc3BvbnNpdmVuZXNzKGV2ZW50cyxzdGFydEV2dC5zdGFydCxzdGFydEV2dC5zdGFydCtST0xMSU5HX1dJTkRPV19TSVpFLFswLjldKTt3b3JzdDkwdGhQZXJjZW50aWxlTGF0ZW5jeT1NYXRoLm1heChsYXRlbmN5UGVyY2VudGlsZXNbMF0udGltZSx3b3JzdDkwdGhQZXJjZW50aWxlTGF0ZW5jeSk7fQpyZXR1cm4gd29yc3Q5MHRoUGVyY2VudGlsZUxhdGVuY3k7fQpjb21wdXRlT2JzZXJ2ZWRNZXRyaWMoZGF0YSl7Y29uc3R7Zmlyc3RNZWFuaW5nZnVsUGFpbnR9PWRhdGEudHJhY2VPZlRhYi50aW1pbmdzO2lmKCFmaXJzdE1lYW5pbmdmdWxQYWludCl7dGhyb3cgbmV3IExIRXJyb3IoTEhFcnJvci5lcnJvcnMuTk9fRk1QKTt9CmNvbnN0IGV2ZW50cz1UcmFjaW5nUHJvY2Vzc29yLmdldE1haW5UaHJlYWRUb3BMZXZlbEV2ZW50cyhkYXRhLnRyYWNlT2ZUYWIsZmlyc3RNZWFuaW5nZnVsUGFpbnQpLmZpbHRlcihldnQ9PmV2dC5kdXJhdGlvbj49MSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7dGltaW5nOkVzdGltYXRlZElucHV0TGF0ZW5jeS5jYWxjdWxhdGVSb2xsaW5nV2luZG93RUlMKGV2ZW50cyl9KTt9fQptb2R1bGUuZXhwb3J0cz1Fc3RpbWF0ZWRJbnB1dExhdGVuY3k7fSx7Ii4uLy4uLy4uL2xpYi9lcnJvcnMiOjMzLCIuLi8uLi8uLi9saWIvdHJhY2VzL3RyYWNpbmctcHJvY2Vzc29yIjo0NiwiLi9tZXRyaWMiOjEzfV0sIi4vZ2F0aGVyL2NvbXB1dGVkL21ldHJpY3MvZmlyc3QtY29udGVudGZ1bC1wYWludCI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNZXRyaWNBcnRpZmFjdD1yZXF1aXJlKCcuL21ldHJpYycpO2NvbnN0IExIRXJyb3I9cmVxdWlyZSgnLi4vLi4vLi4vbGliL2Vycm9ycycpO2NsYXNzIEZpcnN0Q29udGVudGZ1bFBhaW50IGV4dGVuZHMgTWV0cmljQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nRmlyc3RDb250ZW50ZnVsUGFpbnQnO30KY29tcHV0ZU9ic2VydmVkTWV0cmljKGRhdGEpe2NvbnN0e3RyYWNlT2ZUYWJ9PWRhdGE7aWYoIXRyYWNlT2ZUYWIudGltZXN0YW1wcy5maXJzdENvbnRlbnRmdWxQYWludCl7dGhyb3cgbmV3IExIRXJyb3IoTEhFcnJvci5lcnJvcnMuTk9fRkNQKTt9CnJldHVybiBQcm9taXNlLnJlc29sdmUoe3RpbWluZzp0cmFjZU9mVGFiLnRpbWluZ3MuZmlyc3RDb250ZW50ZnVsUGFpbnQsdGltZXN0YW1wOnRyYWNlT2ZUYWIudGltZXN0YW1wcy5maXJzdENvbnRlbnRmdWxQYWludH0pO319Cm1vZHVsZS5leHBvcnRzPUZpcnN0Q29udGVudGZ1bFBhaW50O30seyIuLi8uLi8uLi9saWIvZXJyb3JzIjozMywiLi9tZXRyaWMiOjEzfV0sIi4vZ2F0aGVyL2NvbXB1dGVkL21ldHJpY3MvZmlyc3QtY3B1LWlkbGUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWV0cmljQXJ0aWZhY3Q9cmVxdWlyZSgnLi9tZXRyaWMnKTtjb25zdCBUcmFjaW5nUHJvY2Vzc29yPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi90cmFjZXMvdHJhY2luZy1wcm9jZXNzb3InKTtjb25zdCBMSEVycm9yPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9lcnJvcnMnKTtjb25zdCBMT05HX1RBU0tfVEhSRVNIT0xEPTUwO2NvbnN0IE1BWF9UQVNLX0NMVVNURVJfRFVSQVRJT049MjUwO2NvbnN0IE1JTl9UQVNLX0NMVVNURVJfUEFERElORz0xMDAwO2NvbnN0IE1JTl9UQVNLX0NMVVNURVJfRk1QX0RJU1RBTkNFPTUwMDA7Y29uc3QgTUFYX1FVSUVUX1dJTkRPV19TSVpFPTUwMDA7Y29uc3QgRVhQT05FTlRJQVRJT05fQ09FRkZJQ0lFTlQ9LU1hdGgubG9nKDMtMSkvMTU7Y2xhc3MgRmlyc3RDUFVJZGxlIGV4dGVuZHMgTWV0cmljQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nRmlyc3RDUFVJZGxlJzt9CnN0YXRpYyBnZXRSZXF1aXJlZFdpbmRvd1NpemVJbk1zKHQpe2NvbnN0IHRJblNlY29uZHM9dC8xMDAwO2NvbnN0IGV4cG9uZW50aWF0aW9uQ29tcG9uZW50PU1hdGguZXhwKEVYUE9ORU5USUFUSU9OX0NPRUZGSUNJRU5UKnRJblNlY29uZHMpO3JldHVybig0KmV4cG9uZW50aWF0aW9uQ29tcG9uZW50KzEpKjEwMDA7fQpzdGF0aWMgZ2V0VGFza0NsdXN0ZXJzSW5XaW5kb3codGFza3Msc3RhcnRJbmRleCx3aW5kb3dFbmQpe2NvbnN0IGNsdXN0ZXJzPVtdO2xldCBwcmV2aW91c1Rhc2tFbmRUaW1lPS1JbmZpbml0eTtsZXQgY3VycmVudENsdXN0ZXI9W107Y29uc3QgY2x1c3RlcmluZ1dpbmRvd0VuZD13aW5kb3dFbmQrTUlOX1RBU0tfQ0xVU1RFUl9QQURESU5HO2NvbnN0IGlzSW5DbHVzdGVyaW5nV2luZG93PXRhc2s9PnRhc2suc3RhcnQ8Y2x1c3RlcmluZ1dpbmRvd0VuZDtmb3IobGV0IGk9c3RhcnRJbmRleDtpPHRhc2tzLmxlbmd0aDtpKyspe2lmKCFpc0luQ2x1c3RlcmluZ1dpbmRvdyh0YXNrc1tpXSkpe2JyZWFrO30KY29uc3QgdGFzaz10YXNrc1tpXTtpZih0YXNrLnN0YXJ0LXByZXZpb3VzVGFza0VuZFRpbWU+TUlOX1RBU0tfQ0xVU1RFUl9QQURESU5HKXtjdXJyZW50Q2x1c3Rlcj1bXTtjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKTt9CmN1cnJlbnRDbHVzdGVyLnB1c2godGFzayk7cHJldmlvdXNUYXNrRW5kVGltZT10YXNrLmVuZDt9CnJldHVybiBjbHVzdGVycy5tYXAodGFza3M9Pntjb25zdCBzdGFydD10YXNrc1swXS5zdGFydDtjb25zdCBlbmQ9dGFza3NbdGFza3MubGVuZ3RoLTFdLmVuZDtjb25zdCBkdXJhdGlvbj1lbmQtc3RhcnQ7cmV0dXJue3N0YXJ0LGVuZCxkdXJhdGlvbn07fSkuZmlsdGVyKGNsdXN0ZXI9PmNsdXN0ZXIuc3RhcnQ8d2luZG93RW5kKTt9CnN0YXRpYyBmaW5kUXVpZXRXaW5kb3coRk1QLHRyYWNlRW5kLGxvbmdUYXNrcyl7aWYobG9uZ1Rhc2tzLmxlbmd0aD09PTB8fGxvbmdUYXNrc1swXS5zdGFydD5GTVArRmlyc3RDUFVJZGxlLmdldFJlcXVpcmVkV2luZG93U2l6ZUluTXMoMCkpe3JldHVybiBGTVA7fQpjb25zdCBpc1Rvb0Nsb3NlVG9GTVA9Y2x1c3Rlcj0+Y2x1c3Rlci5zdGFydDxGTVArTUlOX1RBU0tfQ0xVU1RFUl9GTVBfRElTVEFOQ0U7Y29uc3QgaXNUb29Mb25nPWNsdXN0ZXI9PmNsdXN0ZXIuZHVyYXRpb24+TUFYX1RBU0tfQ0xVU1RFUl9EVVJBVElPTjtjb25zdCBpc0JhZENsdXN0ZXI9Y2x1c3Rlcj0+aXNUb29DbG9zZVRvRk1QKGNsdXN0ZXIpfHxpc1Rvb0xvbmcoY2x1c3Rlcik7Zm9yKGxldCBpPTA7aTxsb25nVGFza3MubGVuZ3RoO2krKyl7Y29uc3Qgd2luZG93U3RhcnQ9bG9uZ1Rhc2tzW2ldLmVuZDtjb25zdCB3aW5kb3dTaXplPUZpcnN0Q1BVSWRsZS5nZXRSZXF1aXJlZFdpbmRvd1NpemVJbk1zKHdpbmRvd1N0YXJ0LUZNUCk7Y29uc3Qgd2luZG93RW5kPXdpbmRvd1N0YXJ0K3dpbmRvd1NpemU7aWYod2luZG93RW5kPnRyYWNlRW5kKXt0aHJvdyBuZXcgTEhFcnJvcihMSEVycm9yLmVycm9ycy5OT19GQ1BVSV9JRExFX1BFUklPRCk7fQppZihpKzE8bG9uZ1Rhc2tzLmxlbmd0aCYmbG9uZ1Rhc2tzW2krMV0uc3RhcnQtd2luZG93U3RhcnQ8PU1JTl9UQVNLX0NMVVNURVJfUEFERElORyl7Y29udGludWU7fQpjb25zdCB0YXNrQ2x1c3RlcnM9Rmlyc3RDUFVJZGxlLmdldFRhc2tDbHVzdGVyc0luV2luZG93KGxvbmdUYXNrcyxpKzEsd2luZG93RW5kKTtjb25zdCBoYXNCYWRUYXNrQ2x1c3RlcnM9dGFza0NsdXN0ZXJzLnNvbWUoaXNCYWRDbHVzdGVyKTtpZighaGFzQmFkVGFza0NsdXN0ZXJzKXtyZXR1cm4gd2luZG93U3RhcnQ7fX0KdGhyb3cgbmV3IExIRXJyb3IoTEhFcnJvci5lcnJvcnMuTk9fRkNQVUlfSURMRV9QRVJJT0QpO30KY29tcHV0ZU9ic2VydmVkTWV0cmljKGRhdGEpe2NvbnN0e3RyYWNlT2ZUYWJ9PWRhdGE7Y29uc3QgbmF2U3RhcnQ9dHJhY2VPZlRhYi50aW1lc3RhbXBzLm5hdmlnYXRpb25TdGFydDtjb25zdCBGTVA9dHJhY2VPZlRhYi50aW1pbmdzLmZpcnN0TWVhbmluZ2Z1bFBhaW50O2NvbnN0IERDTD10cmFjZU9mVGFiLnRpbWluZ3MuZG9tQ29udGVudExvYWRlZDtjb25zdCB0cmFjZUVuZD10cmFjZU9mVGFiLnRpbWluZ3MudHJhY2VFbmQ7aWYodHJhY2VFbmQtRk1QPE1BWF9RVUlFVF9XSU5ET1dfU0laRSl7dGhyb3cgbmV3IExIRXJyb3IoTEhFcnJvci5lcnJvcnMuRk1QX1RPT19MQVRFX0ZPUl9GQ1BVSSk7fQppZighRk1QfHwhRENMKXt0aHJvdyBuZXcgTEhFcnJvcihGTVA/TEhFcnJvci5lcnJvcnMuTk9fRENMOkxIRXJyb3IuZXJyb3JzLk5PX0ZNUCk7fQpjb25zdCBsb25nVGFza3NBZnRlckZNUD1UcmFjaW5nUHJvY2Vzc29yLmdldE1haW5UaHJlYWRUb3BMZXZlbEV2ZW50cyh0cmFjZU9mVGFiLEZNUCkuZmlsdGVyKGV2dD0+ZXZ0LmR1cmF0aW9uPj1MT05HX1RBU0tfVEhSRVNIT0xEKTtjb25zdCBmaXJzdEludGVyYWN0aXZlPUZpcnN0Q1BVSWRsZS5maW5kUXVpZXRXaW5kb3coRk1QLHRyYWNlRW5kLGxvbmdUYXNrc0FmdGVyRk1QKTtjb25zdCB2YWx1ZUluTXM9TWF0aC5tYXgoZmlyc3RJbnRlcmFjdGl2ZSxEQ0wpO3JldHVybiBQcm9taXNlLnJlc29sdmUoe3RpbWluZzp2YWx1ZUluTXMsdGltZXN0YW1wOnZhbHVlSW5NcyoxMDAwK25hdlN0YXJ0fSk7fX0KbW9kdWxlLmV4cG9ydHM9Rmlyc3RDUFVJZGxlO30seyIuLi8uLi8uLi9saWIvZXJyb3JzIjozMywiLi4vLi4vLi4vbGliL3RyYWNlcy90cmFjaW5nLXByb2Nlc3NvciI6NDYsIi4vbWV0cmljIjoxM31dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2ZpcnN0LW1lYW5pbmdmdWwtcGFpbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWV0cmljQXJ0aWZhY3Q9cmVxdWlyZSgnLi9tZXRyaWMnKTtjb25zdCBMSEVycm9yPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9lcnJvcnMnKTtjbGFzcyBGaXJzdE1lYW5pbmdmdWxQYWludCBleHRlbmRzIE1ldHJpY0FydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ0ZpcnN0TWVhbmluZ2Z1bFBhaW50Jzt9CmNvbXB1dGVPYnNlcnZlZE1ldHJpYyhkYXRhKXtjb25zdHt0cmFjZU9mVGFifT1kYXRhO2lmKCF0cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RNZWFuaW5nZnVsUGFpbnQpe3Rocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLk5PX0ZNUCk7fQpyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt0aW1pbmc6dHJhY2VPZlRhYi50aW1pbmdzLmZpcnN0TWVhbmluZ2Z1bFBhaW50LHRpbWVzdGFtcDp0cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RNZWFuaW5nZnVsUGFpbnR9KTt9fQptb2R1bGUuZXhwb3J0cz1GaXJzdE1lYW5pbmdmdWxQYWludDt9LHsiLi4vLi4vLi4vbGliL2Vycm9ycyI6MzMsIi4vbWV0cmljIjoxM31dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2ludGVyYWN0aXZlIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1ldHJpY0FydGlmYWN0PXJlcXVpcmUoJy4vbWV0cmljJyk7Y29uc3QgTmV0d29ya1JlY29yZGVyPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9uZXR3b3JrLXJlY29yZGVyJyk7Y29uc3QgVHJhY2luZ1Byb2Nlc3Nvcj1yZXF1aXJlKCcuLi8uLi8uLi9saWIvdHJhY2VzL3RyYWNpbmctcHJvY2Vzc29yJyk7Y29uc3QgTEhFcnJvcj1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZXJyb3JzJyk7Y29uc3QgUkVRVUlSRURfUVVJRVRfV0lORE9XPTUwMDA7Y29uc3QgQUxMT1dFRF9DT05DVVJSRU5UX1JFUVVFU1RTPTI7Y2xhc3MgSW50ZXJhY3RpdmUgZXh0ZW5kcyBNZXRyaWNBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidJbnRlcmFjdGl2ZSc7fQpzdGF0aWMgX2ZpbmROZXR3b3JrUXVpZXRQZXJpb2RzKG5ldHdvcmtSZWNvcmRzLHRyYWNlT2ZUYWIpe2NvbnN0IHRyYWNlRW5kVHNJbk1zPXRyYWNlT2ZUYWIudGltZXN0YW1wcy50cmFjZUVuZC8xMDAwO2NvbnN0IGZpbHRlcmVkTmV0d29ya1JlY29yZHM9bmV0d29ya1JlY29yZHMuZmlsdGVyKHJlY29yZD0+e3JldHVybiByZWNvcmQuZmluaXNoZWQmJnJlY29yZC5yZXF1ZXN0TWV0aG9kPT09J0dFVCcmJiFyZWNvcmQuZmFpbGVkJiZyZWNvcmQuc3RhdHVzQ29kZTw0MDA7fSk7cmV0dXJuIE5ldHdvcmtSZWNvcmRlci5maW5kTmV0d29ya1F1aWV0UGVyaW9kcyhmaWx0ZXJlZE5ldHdvcmtSZWNvcmRzLEFMTE9XRURfQ09OQ1VSUkVOVF9SRVFVRVNUUyx0cmFjZUVuZFRzSW5Ncyk7fQpzdGF0aWMgX2ZpbmRDUFVRdWlldFBlcmlvZHMobG9uZ1Rhc2tzLHRyYWNlT2ZUYWIpe2NvbnN0IG5hdlN0YXJ0VHNJbk1zPXRyYWNlT2ZUYWIudGltZXN0YW1wcy5uYXZpZ2F0aW9uU3RhcnQvMTAwMDtjb25zdCB0cmFjZUVuZFRzSW5Ncz10cmFjZU9mVGFiLnRpbWVzdGFtcHMudHJhY2VFbmQvMTAwMDtpZihsb25nVGFza3MubGVuZ3RoPT09MCl7cmV0dXJuW3tzdGFydDowLGVuZDp0cmFjZUVuZFRzSW5Nc31dO30KY29uc3QgcXVpZXRQZXJpb2RzPVtdO2xvbmdUYXNrcy5mb3JFYWNoKCh0YXNrLGluZGV4KT0+e2lmKGluZGV4PT09MCl7cXVpZXRQZXJpb2RzLnB1c2goe3N0YXJ0OjAsZW5kOnRhc2suc3RhcnQrbmF2U3RhcnRUc0luTXN9KTt9CmlmKGluZGV4PT09bG9uZ1Rhc2tzLmxlbmd0aC0xKXtxdWlldFBlcmlvZHMucHVzaCh7c3RhcnQ6dGFzay5lbmQrbmF2U3RhcnRUc0luTXMsZW5kOnRyYWNlRW5kVHNJbk1zfSk7fWVsc2V7cXVpZXRQZXJpb2RzLnB1c2goe3N0YXJ0OnRhc2suZW5kK25hdlN0YXJ0VHNJbk1zLGVuZDpsb25nVGFza3NbaW5kZXgrMV0uc3RhcnQrbmF2U3RhcnRUc0luTXN9KTt9fSk7cmV0dXJuIHF1aWV0UGVyaW9kczt9CnN0YXRpYyBmaW5kT3ZlcmxhcHBpbmdRdWlldFBlcmlvZHMobG9uZ1Rhc2tzLG5ldHdvcmtSZWNvcmRzLHRyYWNlT2ZUYWIpe2NvbnN0IEZjcFRzSW5Ncz10cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RDb250ZW50ZnVsUGFpbnQvMTAwMDtjb25zdCBpc0xvbmdFbm91Z2hRdWlldFBlcmlvZD1wZXJpb2Q9PnBlcmlvZC5lbmQ+RmNwVHNJbk1zK1JFUVVJUkVEX1FVSUVUX1dJTkRPVyYmcGVyaW9kLmVuZC1wZXJpb2Quc3RhcnQ+PVJFUVVJUkVEX1FVSUVUX1dJTkRPVztjb25zdCBuZXR3b3JrUXVpZXRQZXJpb2RzPXRoaXMuX2ZpbmROZXR3b3JrUXVpZXRQZXJpb2RzKG5ldHdvcmtSZWNvcmRzLHRyYWNlT2ZUYWIpLmZpbHRlcihpc0xvbmdFbm91Z2hRdWlldFBlcmlvZCk7Y29uc3QgY3B1UXVpZXRQZXJpb2RzPXRoaXMuX2ZpbmRDUFVRdWlldFBlcmlvZHMobG9uZ1Rhc2tzLHRyYWNlT2ZUYWIpLmZpbHRlcihpc0xvbmdFbm91Z2hRdWlldFBlcmlvZCk7Y29uc3QgY3B1UXVldWU9Y3B1UXVpZXRQZXJpb2RzLnNsaWNlKCk7Y29uc3QgbmV0d29ya1F1ZXVlPW5ldHdvcmtRdWlldFBlcmlvZHMuc2xpY2UoKTtsZXQgY3B1Q2FuZGlkYXRlPWNwdVF1ZXVlLnNoaWZ0KCk7bGV0IG5ldHdvcmtDYW5kaWRhdGU9bmV0d29ya1F1ZXVlLnNoaWZ0KCk7d2hpbGUoY3B1Q2FuZGlkYXRlJiZuZXR3b3JrQ2FuZGlkYXRlKXtpZihjcHVDYW5kaWRhdGUuc3RhcnQ+PW5ldHdvcmtDYW5kaWRhdGUuc3RhcnQpe2lmKG5ldHdvcmtDYW5kaWRhdGUuZW5kPj1jcHVDYW5kaWRhdGUuc3RhcnQrUkVRVUlSRURfUVVJRVRfV0lORE9XKXtyZXR1cm57Y3B1UXVpZXRQZXJpb2Q6Y3B1Q2FuZGlkYXRlLG5ldHdvcmtRdWlldFBlcmlvZDpuZXR3b3JrQ2FuZGlkYXRlLGNwdVF1aWV0UGVyaW9kcyxuZXR3b3JrUXVpZXRQZXJpb2RzfTt9ZWxzZXtuZXR3b3JrQ2FuZGlkYXRlPW5ldHdvcmtRdWV1ZS5zaGlmdCgpO319ZWxzZXtpZihjcHVDYW5kaWRhdGUuZW5kPj1uZXR3b3JrQ2FuZGlkYXRlLnN0YXJ0K1JFUVVJUkVEX1FVSUVUX1dJTkRPVyl7cmV0dXJue2NwdVF1aWV0UGVyaW9kOmNwdUNhbmRpZGF0ZSxuZXR3b3JrUXVpZXRQZXJpb2Q6bmV0d29ya0NhbmRpZGF0ZSxjcHVRdWlldFBlcmlvZHMsbmV0d29ya1F1aWV0UGVyaW9kc307fWVsc2V7Y3B1Q2FuZGlkYXRlPWNwdVF1ZXVlLnNoaWZ0KCk7fX19CnRocm93IG5ldyBMSEVycm9yKGNwdUNhbmRpZGF0ZT9MSEVycm9yLmVycm9ycy5OT19UVElfTkVUV09SS19JRExFX1BFUklPRDpMSEVycm9yLmVycm9ycy5OT19UVElfQ1BVX0lETEVfUEVSSU9EKTt9CmNvbXB1dGVPYnNlcnZlZE1ldHJpYyhkYXRhKXtjb25zdHt0cmFjZU9mVGFiLG5ldHdvcmtSZWNvcmRzfT1kYXRhO2lmKCF0cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RDb250ZW50ZnVsUGFpbnQpe3Rocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLk5PX0ZDUCk7fQppZighdHJhY2VPZlRhYi50aW1lc3RhbXBzLmRvbUNvbnRlbnRMb2FkZWQpe3Rocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLk5PX0RDTCk7fQpjb25zdCBsb25nVGFza3M9VHJhY2luZ1Byb2Nlc3Nvci5nZXRNYWluVGhyZWFkVG9wTGV2ZWxFdmVudHModHJhY2VPZlRhYikuZmlsdGVyKGV2ZW50PT5ldmVudC5kdXJhdGlvbj49NTApO2NvbnN0IHF1aWV0UGVyaW9kSW5mbz1JbnRlcmFjdGl2ZS5maW5kT3ZlcmxhcHBpbmdRdWlldFBlcmlvZHMobG9uZ1Rhc2tzLG5ldHdvcmtSZWNvcmRzLHRyYWNlT2ZUYWIpO2NvbnN0IGNwdVF1aWV0UGVyaW9kPXF1aWV0UGVyaW9kSW5mby5jcHVRdWlldFBlcmlvZDtjb25zdCB0aW1lc3RhbXA9TWF0aC5tYXgoY3B1UXVpZXRQZXJpb2Quc3RhcnQsdHJhY2VPZlRhYi50aW1lc3RhbXBzLmZpcnN0Q29udGVudGZ1bFBhaW50LzEwMDAsdHJhY2VPZlRhYi50aW1lc3RhbXBzLmRvbUNvbnRlbnRMb2FkZWQvMTAwMCkqMTAwMDtjb25zdCB0aW1pbmc9KHRpbWVzdGFtcC10cmFjZU9mVGFiLnRpbWVzdGFtcHMubmF2aWdhdGlvblN0YXJ0KS8xMDAwO3JldHVybiBQcm9taXNlLnJlc29sdmUoe3RpbWluZyx0aW1lc3RhbXB9KTt9fQptb2R1bGUuZXhwb3J0cz1JbnRlcmFjdGl2ZTt9LHsiLi4vLi4vLi4vbGliL2Vycm9ycyI6MzMsIi4uLy4uLy4uL2xpYi9uZXR3b3JrLXJlY29yZGVyIjozNywiLi4vLi4vLi4vbGliL3RyYWNlcy90cmFjaW5nLXByb2Nlc3NvciI6NDYsIi4vbWV0cmljIjoxM31dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2xhbnRlcm4tZXN0aW1hdGVkLWlucHV0LWxhdGVuY3kiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTGFudGVybk1ldHJpY0FydGlmYWN0PXJlcXVpcmUoJy4vbGFudGVybi1tZXRyaWMnKTtjb25zdCBCYXNlTm9kZT1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9iYXNlLW5vZGUnKTtjb25zdCBFc3RpbWF0ZWRJbnB1dExhdGVuY3k9cmVxdWlyZSgnLi9lc3RpbWF0ZWQtaW5wdXQtbGF0ZW5jeScpO2NsYXNzIExhbnRlcm5Fc3RpbWF0ZWRJbnB1dExhdGVuY3kgZXh0ZW5kcyBMYW50ZXJuTWV0cmljQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nTGFudGVybkVzdGltYXRlZElucHV0TGF0ZW5jeSc7fQpnZXQgQ09FRkZJQ0lFTlRTKCl7cmV0dXJue2ludGVyY2VwdDowLG9wdGltaXN0aWM6MC40LHBlc3NpbWlzdGljOjAuNH07fQpnZXRPcHRpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoKXtyZXR1cm4gZGVwZW5kZW5jeUdyYXBoO30KZ2V0UGVzc2ltaXN0aWNHcmFwaChkZXBlbmRlbmN5R3JhcGgpe3JldHVybiBkZXBlbmRlbmN5R3JhcGg7fQpnZXRFc3RpbWF0ZUZyb21TaW11bGF0aW9uKHNpbXVsYXRpb24sZXh0cmFzKXtjb25zdCBmbXBUaW1lSW5Ncz1leHRyYXMub3B0aW1pc3RpYz9leHRyYXMuZm1wUmVzdWx0LnBlc3NpbWlzdGljRXN0aW1hdGUudGltZUluTXM6ZXh0cmFzLmZtcFJlc3VsdC5vcHRpbWlzdGljRXN0aW1hdGUudGltZUluTXM7Y29uc3QgZXZlbnRzPUxhbnRlcm5Fc3RpbWF0ZWRJbnB1dExhdGVuY3kuZ2V0RXZlbnRzQWZ0ZXJGTVAoc2ltdWxhdGlvbi5ub2RlVGltaW5ncyxmbXBUaW1lSW5Ncyk7cmV0dXJue3RpbWVJbk1zOkVzdGltYXRlZElucHV0TGF0ZW5jeS5jYWxjdWxhdGVSb2xsaW5nV2luZG93RUlMKGV2ZW50cyksbm9kZVRpbWluZ3M6c2ltdWxhdGlvbi5ub2RlVGltaW5nc307fQphc3luYyBjb21wdXRlXyhkYXRhLGFydGlmYWN0cyl7Y29uc3QgZm1wUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TGFudGVybkZpcnN0TWVhbmluZ2Z1bFBhaW50KGRhdGEpO3JldHVybiB0aGlzLmNvbXB1dGVNZXRyaWNXaXRoR3JhcGhzKGRhdGEsYXJ0aWZhY3RzLHtmbXBSZXN1bHR9KTt9CnN0YXRpYyBnZXRFdmVudHNBZnRlckZNUChub2RlVGltaW5ncyxmbXBUaW1lSW5Ncyl7Y29uc3QgZXZlbnRzPVtdO2Zvcihjb25zdFtub2RlLHRpbWluZ11vZiBub2RlVGltaW5ncy5lbnRyaWVzKCkpe2lmKG5vZGUudHlwZSE9PUJhc2VOb2RlLlRZUEVTLkNQVSljb250aW51ZTtpZih0aW1pbmcuZW5kVGltZTxmbXBUaW1lSW5Ncyljb250aW51ZTtldmVudHMucHVzaCh7c3RhcnQ6dGltaW5nLnN0YXJ0VGltZSxlbmQ6dGltaW5nLmVuZFRpbWUsZHVyYXRpb246dGltaW5nLmR1cmF0aW9ufSk7fQpyZXR1cm4gZXZlbnRzO319Cm1vZHVsZS5leHBvcnRzPUxhbnRlcm5Fc3RpbWF0ZWRJbnB1dExhdGVuY3k7fSx7Ii4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZSI6MjIsIi4vZXN0aW1hdGVkLWlucHV0LWxhdGVuY3kiOiIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2VzdGltYXRlZC1pbnB1dC1sYXRlbmN5IiwiLi9sYW50ZXJuLW1ldHJpYyI6MTJ9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbWV0cmljcy9sYW50ZXJuLWZpcnN0LWNvbnRlbnRmdWwtcGFpbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWV0cmljQXJ0aWZhY3Q9cmVxdWlyZSgnLi9sYW50ZXJuLW1ldHJpYycpO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZScpO2NsYXNzIEZpcnN0Q29udGVudGZ1bFBhaW50IGV4dGVuZHMgTWV0cmljQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nTGFudGVybkZpcnN0Q29udGVudGZ1bFBhaW50Jzt9CmdldCBDT0VGRklDSUVOVFMoKXtyZXR1cm57aW50ZXJjZXB0OjAsb3B0aW1pc3RpYzowLjUscGVzc2ltaXN0aWM6MC41fTt9CmdldE9wdGltaXN0aWNHcmFwaChkZXBlbmRlbmN5R3JhcGgsdHJhY2VPZlRhYil7Y29uc3QgZmNwPXRyYWNlT2ZUYWIudGltZXN0YW1wcy5maXJzdENvbnRlbnRmdWxQYWludDtjb25zdCBibG9ja2luZ1NjcmlwdFVybHM9TWV0cmljQXJ0aWZhY3QuZ2V0U2NyaXB0VXJscyhkZXBlbmRlbmN5R3JhcGgsbm9kZT0+e3JldHVybihub2RlLmVuZFRpbWU8PWZjcCYmbm9kZS5oYXNSZW5kZXJCbG9ja2luZ1ByaW9yaXR5KCkmJm5vZGUuaW5pdGlhdG9yVHlwZSE9PSdzY3JpcHQnKTt9KTtyZXR1cm4gZGVwZW5kZW5jeUdyYXBoLmNsb25lV2l0aFJlbGF0aW9uc2hpcHMobm9kZT0+e2lmKG5vZGUuZW5kVGltZT5mY3AmJiFub2RlLmlzTWFpbkRvY3VtZW50KCkpcmV0dXJuIGZhbHNlO2lmKG5vZGUudHlwZT09PUJhc2VOb2RlLlRZUEVTLkNQVSl7cmV0dXJuIG5vZGUuaXNFdmFsdWF0ZVNjcmlwdEZvcihibG9ja2luZ1NjcmlwdFVybHMpO30KcmV0dXJuIG5vZGUuaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpJiZub2RlLmluaXRpYXRvclR5cGUhPT0nc2NyaXB0Jzt9KTt9CmdldFBlc3NpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoLHRyYWNlT2ZUYWIpe2NvbnN0IGZjcD10cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RDb250ZW50ZnVsUGFpbnQ7Y29uc3QgYmxvY2tpbmdTY3JpcHRVcmxzPU1ldHJpY0FydGlmYWN0LmdldFNjcmlwdFVybHMoZGVwZW5kZW5jeUdyYXBoLG5vZGU9PntyZXR1cm4gbm9kZS5lbmRUaW1lPD1mY3AmJm5vZGUuaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpO30pO3JldHVybiBkZXBlbmRlbmN5R3JhcGguY2xvbmVXaXRoUmVsYXRpb25zaGlwcyhub2RlPT57aWYobm9kZS5lbmRUaW1lPmZjcCYmIW5vZGUuaXNNYWluRG9jdW1lbnQoKSlyZXR1cm4gZmFsc2U7aWYobm9kZS50eXBlPT09QmFzZU5vZGUuVFlQRVMuQ1BVKXtyZXR1cm4gbm9kZS5pc0V2YWx1YXRlU2NyaXB0Rm9yKGJsb2NraW5nU2NyaXB0VXJscyk7fQpyZXR1cm4gbm9kZS5oYXNSZW5kZXJCbG9ja2luZ1ByaW9yaXR5KCk7fSk7fX0KbW9kdWxlLmV4cG9ydHM9Rmlyc3RDb250ZW50ZnVsUGFpbnQ7fSx7Ii4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZSI6MjIsIi4vbGFudGVybi1tZXRyaWMiOjEyfV0sIi4vZ2F0aGVyL2NvbXB1dGVkL21ldHJpY3MvbGFudGVybi1maXJzdC1jcHUtaWRsZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBCYXNlTm9kZT1yZXF1aXJlKCcuLi8uLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9iYXNlLW5vZGUnKTtjb25zdCBGaXJzdENQVUlkbGU9cmVxdWlyZSgnLi9maXJzdC1jcHUtaWRsZScpO2NvbnN0IExhbnRlcm5JbnRlcmFjdGl2ZT1yZXF1aXJlKCcuL2xhbnRlcm4taW50ZXJhY3RpdmUnKTtjbGFzcyBMYW50ZXJuRmlyc3RDUFVJZGxlIGV4dGVuZHMgTGFudGVybkludGVyYWN0aXZle2dldCBuYW1lKCl7cmV0dXJuJ0xhbnRlcm5GaXJzdENQVUlkbGUnO30KZ2V0IENPRUZGSUNJRU5UUygpe3JldHVybntpbnRlcmNlcHQ6MCxvcHRpbWlzdGljOjEscGVzc2ltaXN0aWM6MH07fQpnZXRFc3RpbWF0ZUZyb21TaW11bGF0aW9uKHNpbXVsYXRpb24sZXh0cmFzKXtjb25zdCBmbXBUaW1lSW5Ncz1leHRyYXMub3B0aW1pc3RpYz9leHRyYXMuZm1wUmVzdWx0Lm9wdGltaXN0aWNFc3RpbWF0ZS50aW1lSW5NczpleHRyYXMuZm1wUmVzdWx0LnBlc3NpbWlzdGljRXN0aW1hdGUudGltZUluTXM7cmV0dXJue3RpbWVJbk1zOkxhbnRlcm5GaXJzdENQVUlkbGUuZ2V0Rmlyc3RDUFVJZGxlV2luZG93U3RhcnQoc2ltdWxhdGlvbi5ub2RlVGltaW5ncyxmbXBUaW1lSW5Ncyksbm9kZVRpbWluZ3M6c2ltdWxhdGlvbi5ub2RlVGltaW5nc307fQpzdGF0aWMgZ2V0Rmlyc3RDUFVJZGxlV2luZG93U3RhcnQobm9kZVRpbWluZ3MsZm1wVGltZUluTXMsbG9uZ1Rhc2tMZW5ndGg9NTApe2NvbnN0IGxvbmdUYXNrcz1bXTtmb3IoY29uc3Rbbm9kZSx0aW1pbmddb2Ygbm9kZVRpbWluZ3MuZW50cmllcygpKXtpZihub2RlLnR5cGUhPT1CYXNlTm9kZS5UWVBFUy5DUFUpY29udGludWU7aWYodGltaW5nLmR1cmF0aW9uPGxvbmdUYXNrTGVuZ3RoKWNvbnRpbnVlO2xvbmdUYXNrcy5wdXNoKHtzdGFydDp0aW1pbmcuc3RhcnRUaW1lLGVuZDp0aW1pbmcuZW5kVGltZX0pO30KcmV0dXJuIEZpcnN0Q1BVSWRsZS5maW5kUXVpZXRXaW5kb3coZm1wVGltZUluTXMsSW5maW5pdHksbG9uZ1Rhc2tzKTt9fQptb2R1bGUuZXhwb3J0cz1MYW50ZXJuRmlyc3RDUFVJZGxlO30seyIuLi8uLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9iYXNlLW5vZGUiOjIyLCIuL2ZpcnN0LWNwdS1pZGxlIjoiLi9nYXRoZXIvY29tcHV0ZWQvbWV0cmljcy9maXJzdC1jcHUtaWRsZSIsIi4vbGFudGVybi1pbnRlcmFjdGl2ZSI6Ii4vZ2F0aGVyL2NvbXB1dGVkL21ldHJpY3MvbGFudGVybi1pbnRlcmFjdGl2ZSJ9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbWV0cmljcy9sYW50ZXJuLWZpcnN0LW1lYW5pbmdmdWwtcGFpbnQiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWV0cmljQXJ0aWZhY3Q9cmVxdWlyZSgnLi9sYW50ZXJuLW1ldHJpYycpO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZScpO2NsYXNzIEZpcnN0TWVhbmluZ2Z1bFBhaW50IGV4dGVuZHMgTWV0cmljQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nTGFudGVybkZpcnN0TWVhbmluZ2Z1bFBhaW50Jzt9CmdldCBDT0VGRklDSUVOVFMoKXtyZXR1cm57aW50ZXJjZXB0OjAsb3B0aW1pc3RpYzowLjUscGVzc2ltaXN0aWM6MC41fTt9CmdldE9wdGltaXN0aWNHcmFwaChkZXBlbmRlbmN5R3JhcGgsdHJhY2VPZlRhYil7Y29uc3QgZm1wPXRyYWNlT2ZUYWIudGltZXN0YW1wcy5maXJzdE1lYW5pbmdmdWxQYWludDtjb25zdCBibG9ja2luZ1NjcmlwdFVybHM9TWV0cmljQXJ0aWZhY3QuZ2V0U2NyaXB0VXJscyhkZXBlbmRlbmN5R3JhcGgsbm9kZT0+e3JldHVybihub2RlLmVuZFRpbWU8PWZtcCYmbm9kZS5oYXNSZW5kZXJCbG9ja2luZ1ByaW9yaXR5KCkmJm5vZGUuaW5pdGlhdG9yVHlwZSE9PSdzY3JpcHQnKTt9KTtyZXR1cm4gZGVwZW5kZW5jeUdyYXBoLmNsb25lV2l0aFJlbGF0aW9uc2hpcHMobm9kZT0+e2lmKG5vZGUuZW5kVGltZT5mbXAmJiFub2RlLmlzTWFpbkRvY3VtZW50KCkpcmV0dXJuIGZhbHNlO2lmKG5vZGUudHlwZT09PUJhc2VOb2RlLlRZUEVTLkNQVSl7cmV0dXJuIG5vZGUuaXNFdmFsdWF0ZVNjcmlwdEZvcihibG9ja2luZ1NjcmlwdFVybHMpO30KcmV0dXJuIG5vZGUuaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpJiZub2RlLmluaXRpYXRvclR5cGUhPT0nc2NyaXB0Jzt9KTt9CmdldFBlc3NpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoLHRyYWNlT2ZUYWIpe2NvbnN0IGZtcD10cmFjZU9mVGFiLnRpbWVzdGFtcHMuZmlyc3RNZWFuaW5nZnVsUGFpbnQ7Y29uc3QgcmVxdWlyZWRTY3JpcHRVcmxzPU1ldHJpY0FydGlmYWN0LmdldFNjcmlwdFVybHMoZGVwZW5kZW5jeUdyYXBoLG5vZGU9PntyZXR1cm4gbm9kZS5lbmRUaW1lPD1mbXAmJm5vZGUuaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpO30pO3JldHVybiBkZXBlbmRlbmN5R3JhcGguY2xvbmVXaXRoUmVsYXRpb25zaGlwcyhub2RlPT57aWYobm9kZS5lbmRUaW1lPmZtcCYmIW5vZGUuaXNNYWluRG9jdW1lbnQoKSlyZXR1cm4gZmFsc2U7aWYobm9kZS50eXBlPT09QmFzZU5vZGUuVFlQRVMuQ1BVKXtyZXR1cm4gbm9kZS5kaWRQZXJmb3JtTGF5b3V0KCl8fG5vZGUuaXNFdmFsdWF0ZVNjcmlwdEZvcihyZXF1aXJlZFNjcmlwdFVybHMpO30KcmV0dXJuIG5vZGUuaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpO30pO30KYXN5bmMgY29tcHV0ZV8oZGF0YSxhcnRpZmFjdHMpe2NvbnN0IGZjcFJlc3VsdD1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdExhbnRlcm5GaXJzdENvbnRlbnRmdWxQYWludChkYXRhKTtjb25zdCBtZXRyaWNSZXN1bHQ9YXdhaXQgdGhpcy5jb21wdXRlTWV0cmljV2l0aEdyYXBocyhkYXRhLGFydGlmYWN0cyk7bWV0cmljUmVzdWx0LnRpbWluZz1NYXRoLm1heChtZXRyaWNSZXN1bHQudGltaW5nLGZjcFJlc3VsdC50aW1pbmcpO3JldHVybiBtZXRyaWNSZXN1bHQ7fX0KbW9kdWxlLmV4cG9ydHM9Rmlyc3RNZWFuaW5nZnVsUGFpbnQ7fSx7Ii4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZSI6MjIsIi4vbGFudGVybi1tZXRyaWMiOjEyfV0sIi4vZ2F0aGVyL2NvbXB1dGVkL21ldHJpY3MvbGFudGVybi1pbnRlcmFjdGl2ZSI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBNZXRyaWNBcnRpZmFjdD1yZXF1aXJlKCcuL2xhbnRlcm4tbWV0cmljJyk7Y29uc3QgQmFzZU5vZGU9cmVxdWlyZSgnLi4vLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvYmFzZS1ub2RlJyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NvbnN0IENSSVRJQ0FMX0xPTkdfVEFTS19USFJFU0hPTEQ9MjA7Y2xhc3MgSW50ZXJhY3RpdmUgZXh0ZW5kcyBNZXRyaWNBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidMYW50ZXJuSW50ZXJhY3RpdmUnO30KZ2V0IENPRUZGSUNJRU5UUygpe3JldHVybntpbnRlcmNlcHQ6MCxvcHRpbWlzdGljOjAuNSxwZXNzaW1pc3RpYzowLjV9O30KZ2V0T3B0aW1pc3RpY0dyYXBoKGRlcGVuZGVuY3lHcmFwaCl7Y29uc3QgbWluaW11bUNwdVRhc2tEdXJhdGlvbj1DUklUSUNBTF9MT05HX1RBU0tfVEhSRVNIT0xEKjEwMDA7cmV0dXJuIGRlcGVuZGVuY3lHcmFwaC5jbG9uZVdpdGhSZWxhdGlvbnNoaXBzKG5vZGU9PntpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5DUFUpe3JldHVybiBub2RlLmV2ZW50LmR1cj5taW5pbXVtQ3B1VGFza0R1cmF0aW9uO30KY29uc3QgaXNJbWFnZT1ub2RlLnJlY29yZC5yZXNvdXJjZVR5cGU9PT1OZXR3b3JrUmVxdWVzdC5UWVBFUy5JbWFnZTtjb25zdCBpc1NjcmlwdD1ub2RlLnJlY29yZC5yZXNvdXJjZVR5cGU9PT1OZXR3b3JrUmVxdWVzdC5UWVBFUy5TY3JpcHQ7cmV0dXJuKCFpc0ltYWdlJiYoaXNTY3JpcHR8fG5vZGUucmVjb3JkLnByaW9yaXR5PT09J0hpZ2gnfHxub2RlLnJlY29yZC5wcmlvcml0eT09PSdWZXJ5SGlnaCcpKTt9KTt9CmdldFBlc3NpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoKXtyZXR1cm4gZGVwZW5kZW5jeUdyYXBoO30KZ2V0RXN0aW1hdGVGcm9tU2ltdWxhdGlvbihzaW11bGF0aW9uUmVzdWx0LGV4dHJhcyl7Y29uc3QgbGFzdFRhc2tBdD1JbnRlcmFjdGl2ZS5nZXRMYXN0TG9uZ1Rhc2tFbmRUaW1lKHNpbXVsYXRpb25SZXN1bHQubm9kZVRpbWluZ3MpO2NvbnN0IG1pbmltdW1UaW1lPWV4dHJhcy5vcHRpbWlzdGljP2V4dHJhcy5mbXBSZXN1bHQub3B0aW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zOmV4dHJhcy5mbXBSZXN1bHQucGVzc2ltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcztyZXR1cm57dGltZUluTXM6TWF0aC5tYXgobWluaW11bVRpbWUsbGFzdFRhc2tBdCksbm9kZVRpbWluZ3M6c2ltdWxhdGlvblJlc3VsdC5ub2RlVGltaW5nc307fQphc3luYyBjb21wdXRlXyhkYXRhLGFydGlmYWN0cyl7Y29uc3QgZm1wUmVzdWx0PWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0TGFudGVybkZpcnN0TWVhbmluZ2Z1bFBhaW50KGRhdGEpO2NvbnN0IG1ldHJpY1Jlc3VsdD1hd2FpdCB0aGlzLmNvbXB1dGVNZXRyaWNXaXRoR3JhcGhzKGRhdGEsYXJ0aWZhY3RzLHtmbXBSZXN1bHR9KTttZXRyaWNSZXN1bHQudGltaW5nPU1hdGgubWF4KG1ldHJpY1Jlc3VsdC50aW1pbmcsZm1wUmVzdWx0LnRpbWluZyk7cmV0dXJuIG1ldHJpY1Jlc3VsdDt9CnN0YXRpYyBnZXRMYXN0TG9uZ1Rhc2tFbmRUaW1lKG5vZGVUaW1pbmdzLGR1cmF0aW9uPTUwKXtyZXR1cm4gQXJyYXkuZnJvbShub2RlVGltaW5ncy5lbnRyaWVzKCkpLmZpbHRlcigoW25vZGUsdGltaW5nXSk9PntpZihub2RlLnR5cGUhPT1CYXNlTm9kZS5UWVBFUy5DUFUpcmV0dXJuIGZhbHNlO3JldHVybiB0aW1pbmcuZHVyYXRpb24+ZHVyYXRpb247fSkubWFwKChbXyx0aW1pbmddKT0+dGltaW5nLmVuZFRpbWUpLnJlZHVjZSgobWF4LHgpPT5NYXRoLm1heChtYXh8fDAseHx8MCksMCk7fX0KbW9kdWxlLmV4cG9ydHM9SW50ZXJhY3RpdmU7fSx7Ii4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZSI6MjIsIi4uLy4uLy4uL2xpYi9uZXR3b3JrLXJlcXVlc3QiOjM4LCIuL2xhbnRlcm4tbWV0cmljIjoxMn1dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2xhbnRlcm4tc3BlZWQtaW5kZXgiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTWV0cmljQXJ0aWZhY3Q9cmVxdWlyZSgnLi9sYW50ZXJuLW1ldHJpYycpO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4uLy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL2Jhc2Utbm9kZScpO2NsYXNzIFNwZWVkSW5kZXggZXh0ZW5kcyBNZXRyaWNBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidMYW50ZXJuU3BlZWRJbmRleCc7fQpnZXQgQ09FRkZJQ0lFTlRTKCl7cmV0dXJue2ludGVyY2VwdDotMjUwLG9wdGltaXN0aWM6MS40LHBlc3NpbWlzdGljOjAuNjV9O30KZ2V0T3B0aW1pc3RpY0dyYXBoKGRlcGVuZGVuY3lHcmFwaCl7cmV0dXJuIGRlcGVuZGVuY3lHcmFwaDt9CmdldFBlc3NpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoKXtyZXR1cm4gZGVwZW5kZW5jeUdyYXBoO30KZ2V0RXN0aW1hdGVGcm9tU2ltdWxhdGlvbihzaW11bGF0aW9uUmVzdWx0LGV4dHJhcyl7Y29uc3QgZmNwVGltZUluTXM9ZXh0cmFzLmZjcFJlc3VsdC5wZXNzaW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zO2NvbnN0IGVzdGltYXRlPWV4dHJhcy5vcHRpbWlzdGljP2V4dHJhcy5zcGVlZGxpbmUuc3BlZWRJbmRleDpTcGVlZEluZGV4LmNvbXB1dGVMYXlvdXRCYXNlZFNwZWVkSW5kZXgoc2ltdWxhdGlvblJlc3VsdC5ub2RlVGltaW5ncyxmY3BUaW1lSW5Ncyk7cmV0dXJue3RpbWVJbk1zOmVzdGltYXRlLG5vZGVUaW1pbmdzOnNpbXVsYXRpb25SZXN1bHQubm9kZVRpbWluZ3N9O30KYXN5bmMgY29tcHV0ZV8oZGF0YSxhcnRpZmFjdHMpe2NvbnN0IHNwZWVkbGluZT1hd2FpdCBhcnRpZmFjdHMucmVxdWVzdFNwZWVkbGluZShkYXRhLnRyYWNlKTtjb25zdCBmY3BSZXN1bHQ9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RMYW50ZXJuRmlyc3RDb250ZW50ZnVsUGFpbnQoZGF0YSk7Y29uc3QgbWV0cmljUmVzdWx0PWF3YWl0IHRoaXMuY29tcHV0ZU1ldHJpY1dpdGhHcmFwaHMoZGF0YSxhcnRpZmFjdHMse3NwZWVkbGluZSxmY3BSZXN1bHR9KTttZXRyaWNSZXN1bHQudGltaW5nPU1hdGgubWF4KG1ldHJpY1Jlc3VsdC50aW1pbmcsZmNwUmVzdWx0LnRpbWluZyk7cmV0dXJuIG1ldHJpY1Jlc3VsdDt9CnN0YXRpYyBjb21wdXRlTGF5b3V0QmFzZWRTcGVlZEluZGV4KG5vZGVUaW1pbmdzLGZjcFRpbWVJbk1zKXtjb25zdCBsYXlvdXRXZWlnaHRzPVtdO2Zvcihjb25zdFtub2RlLHRpbWluZ11vZiBub2RlVGltaW5ncy5lbnRyaWVzKCkpe2lmKG5vZGUudHlwZSE9PUJhc2VOb2RlLlRZUEVTLkNQVSljb250aW51ZTtpZihub2RlLmNoaWxkRXZlbnRzLnNvbWUoeD0+eC5uYW1lPT09J0xheW91dCcpKXtjb25zdCB0aW1pbmdXZWlnaHQ9TWF0aC5tYXgoTWF0aC5sb2cyKHRpbWluZy5lbmRUaW1lLXRpbWluZy5zdGFydFRpbWUpLDApO2xheW91dFdlaWdodHMucHVzaCh7dGltZTp0aW1pbmcuZW5kVGltZSx3ZWlnaHQ6dGltaW5nV2VpZ2h0fSk7fX0KaWYoIWxheW91dFdlaWdodHMubGVuZ3RoKXtyZXR1cm4gZmNwVGltZUluTXM7fQpjb25zdCB0b3RhbFdlaWdodGVkVGltZT1sYXlvdXRXZWlnaHRzLm1hcChldnQ9PmV2dC53ZWlnaHQqTWF0aC5tYXgoZXZ0LnRpbWUsZmNwVGltZUluTXMpKS5yZWR1Y2UoKGEsYik9PmErYiwwKTtjb25zdCB0b3RhbFdlaWdodD1sYXlvdXRXZWlnaHRzLm1hcChldnQ9PmV2dC53ZWlnaHQpLnJlZHVjZSgoYSxiKT0+YStiLDApO3JldHVybiB0b3RhbFdlaWdodGVkVGltZS90b3RhbFdlaWdodDt9fQptb2R1bGUuZXhwb3J0cz1TcGVlZEluZGV4O30seyIuLi8uLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9iYXNlLW5vZGUiOjIyLCIuL2xhbnRlcm4tbWV0cmljIjoxMn1dLCIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL3NwZWVkLWluZGV4IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE1ldHJpY0FydGlmYWN0PXJlcXVpcmUoJy4vbWV0cmljJyk7Y2xhc3MgU3BlZWRJbmRleCBleHRlbmRzIE1ldHJpY0FydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ1NwZWVkSW5kZXgnO30KYXN5bmMgY29tcHV0ZU9ic2VydmVkTWV0cmljKGRhdGEsYXJ0aWZhY3RzKXtjb25zdCBzcGVlZGxpbmU9YXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RTcGVlZGxpbmUoZGF0YS50cmFjZSk7Y29uc3QgdGltaW5nPU1hdGgucm91bmQoc3BlZWRsaW5lLnNwZWVkSW5kZXgpO2NvbnN0IHRpbWVzdGFtcD0odGltaW5nK3NwZWVkbGluZS5iZWdpbm5pbmcpKjEwMDA7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7dGltaW5nLHRpbWVzdGFtcH0pO319Cm1vZHVsZS5leHBvcnRzPVNwZWVkSW5kZXg7fSx7Ii4vbWV0cmljIjoxM31dLCIuL2dhdGhlci9jb21wdXRlZC9uZXR3b3JrLWFuYWx5c2lzIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IENvbXB1dGVkQXJ0aWZhY3Q9cmVxdWlyZSgnLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NvbnN0IE5ldHdvcmtBbmFseXplcj1yZXF1aXJlKCcuLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9zaW11bGF0b3IvbmV0d29yay1hbmFseXplcicpO2NsYXNzIE5ldHdvcmtBbmFseXNpcyBleHRlbmRzIENvbXB1dGVkQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nTmV0d29ya0FuYWx5c2lzJzt9CnN0YXRpYyBjb21wdXRlUlRUQW5kU2VydmVyUmVzcG9uc2VUaW1lKHJlY29yZHMpe2NvbnN0IHJ0dEJ5T3JpZ2luPW5ldyBNYXAoKTtmb3IoY29uc3Rbb3JpZ2luLHN1bW1hcnldb2YgTmV0d29ya0FuYWx5emVyLmVzdGltYXRlUlRUQnlPcmlnaW4ocmVjb3JkcykuZW50cmllcygpKXtydHRCeU9yaWdpbi5zZXQob3JpZ2luLHN1bW1hcnkubWluKTt9CmNvbnN0IG1pbmltdW1SdHQ9TWF0aC5taW4oLi4uQXJyYXkuZnJvbShydHRCeU9yaWdpbi52YWx1ZXMoKSkpO2NvbnN0IHJlc3BvbnNlVGltZVN1bW1hcmllcz1OZXR3b3JrQW5hbHl6ZXIuZXN0aW1hdGVTZXJ2ZXJSZXNwb25zZVRpbWVCeU9yaWdpbihyZWNvcmRzLHtydHRCeU9yaWdpbn0pO2NvbnN0IGFkZGl0aW9uYWxSdHRCeU9yaWdpbj1uZXcgTWFwKCk7Y29uc3Qgc2VydmVyUmVzcG9uc2VUaW1lQnlPcmlnaW49bmV3IE1hcCgpO2Zvcihjb25zdFtvcmlnaW4sc3VtbWFyeV1vZiByZXNwb25zZVRpbWVTdW1tYXJpZXMuZW50cmllcygpKXtjb25zdCBydHRGb3JPcmlnaW49cnR0QnlPcmlnaW4uZ2V0KG9yaWdpbik7YWRkaXRpb25hbFJ0dEJ5T3JpZ2luLnNldChvcmlnaW4scnR0Rm9yT3JpZ2luLW1pbmltdW1SdHQpO3NlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luLnNldChvcmlnaW4sc3VtbWFyeS5tZWRpYW4pO30KcmV0dXJue3J0dDptaW5pbXVtUnR0LGFkZGl0aW9uYWxSdHRCeU9yaWdpbixzZXJ2ZXJSZXNwb25zZVRpbWVCeU9yaWdpbix0aHJvdWdocHV0OjB9O30KYXN5bmMgY29tcHV0ZV8oZGV2dG9vbHNMb2csY29tcHV0ZWRBcnRpZmFjdHMpe2NvbnN0IHJlY29yZHM9YXdhaXQgY29tcHV0ZWRBcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9nKTtjb25zdCB0aHJvdWdocHV0PWF3YWl0IGNvbXB1dGVkQXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrVGhyb3VnaHB1dChkZXZ0b29sc0xvZyk7Y29uc3QgcnR0QW5kU2VydmVyUmVzcG9uc2VUaW1lPU5ldHdvcmtBbmFseXNpcy5jb21wdXRlUlRUQW5kU2VydmVyUmVzcG9uc2VUaW1lKHJlY29yZHMpO3J0dEFuZFNlcnZlclJlc3BvbnNlVGltZS50aHJvdWdocHV0PXRocm91Z2hwdXQqODtyZXR1cm4gcnR0QW5kU2VydmVyUmVzcG9uc2VUaW1lO319Cm1vZHVsZS5leHBvcnRzPU5ldHdvcmtBbmFseXNpczt9LHsiLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvc2ltdWxhdG9yL25ldHdvcmstYW5hbHl6ZXIiOjI3LCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMX1dLCIuL2dhdGhlci9jb21wdXRlZC9uZXR3b3JrLXJlY29yZHMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3QgTmV0d29ya1JlY29yZGVyPXJlcXVpcmUoJy4uLy4uL2xpYi9uZXR3b3JrLXJlY29yZGVyJyk7Y2xhc3MgTmV0d29ya1JlY29yZHMgZXh0ZW5kcyBDb21wdXRlZEFydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ05ldHdvcmtSZWNvcmRzJzt9CmFzeW5jIGNvbXB1dGVfKGRldnRvb2xzTG9nKXtyZXR1cm4gTmV0d29ya1JlY29yZGVyLnJlY29yZHNGcm9tTG9ncyhkZXZ0b29sc0xvZyk7fX0KbW9kdWxlLmV4cG9ydHM9TmV0d29ya1JlY29yZHM7fSx7Ii4uLy4uL2xpYi9uZXR3b3JrLXJlY29yZGVyIjozNywiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvbmV0d29yay10aHJvdWdocHV0IjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IENvbXB1dGVkQXJ0aWZhY3Q9cmVxdWlyZSgnLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NsYXNzIE5ldHdvcmtUaHJvdWdocHV0IGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidOZXR3b3JrVGhyb3VnaHB1dCc7fQpzdGF0aWMgZ2V0VGhyb3VnaHB1dChuZXR3b3JrUmVjb3Jkcyl7bGV0IHRvdGFsQnl0ZXM9MDtjb25zdCB0aW1lQm91bmRhcmllcz1uZXR3b3JrUmVjb3Jkcy5yZWR1Y2UoKGJvdW5kYXJpZXMscmVjb3JkKT0+e2NvbnN0IHNjaGVtZT1yZWNvcmQucGFyc2VkVVJMJiZyZWNvcmQucGFyc2VkVVJMLnNjaGVtZTtpZihzY2hlbWU9PT0nZGF0YSd8fHJlY29yZC5mYWlsZWR8fCFyZWNvcmQuZmluaXNoZWR8fHJlY29yZC5zdGF0dXNDb2RlPjMwMHx8IXJlY29yZC50cmFuc2ZlclNpemUpe3JldHVybiBib3VuZGFyaWVzO30KdG90YWxCeXRlcys9cmVjb3JkLnRyYW5zZmVyU2l6ZTtib3VuZGFyaWVzLnB1c2goe3RpbWU6cmVjb3JkLnJlc3BvbnNlUmVjZWl2ZWRUaW1lLGlzU3RhcnQ6dHJ1ZX0pO2JvdW5kYXJpZXMucHVzaCh7dGltZTpyZWNvcmQuZW5kVGltZSxpc1N0YXJ0OmZhbHNlfSk7cmV0dXJuIGJvdW5kYXJpZXM7fSxbXSkuc29ydCgoYSxiKT0+YS50aW1lLWIudGltZSk7aWYoIXRpbWVCb3VuZGFyaWVzLmxlbmd0aCl7cmV0dXJuIEluZmluaXR5O30KbGV0IGluZmxpZ2h0PTA7bGV0IGN1cnJlbnRTdGFydD0wO2xldCB0b3RhbER1cmF0aW9uPTA7dGltZUJvdW5kYXJpZXMuZm9yRWFjaChib3VuZGFyeT0+e2lmKGJvdW5kYXJ5LmlzU3RhcnQpe2lmKGluZmxpZ2h0PT09MCl7Y3VycmVudFN0YXJ0PWJvdW5kYXJ5LnRpbWU7fQppbmZsaWdodCsrO31lbHNle2luZmxpZ2h0LS07aWYoaW5mbGlnaHQ9PT0wKXt0b3RhbER1cmF0aW9uKz1ib3VuZGFyeS50aW1lLWN1cnJlbnRTdGFydDt9fX0pO3JldHVybiB0b3RhbEJ5dGVzL3RvdGFsRHVyYXRpb247fQpjb21wdXRlXyhkZXZ0b29sc0xvZyxjb21wdXRlZEFydGlmYWN0cyl7cmV0dXJuIGNvbXB1dGVkQXJ0aWZhY3RzLnJlcXVlc3ROZXR3b3JrUmVjb3JkcyhkZXZ0b29sc0xvZykudGhlbihOZXR3b3JrVGhyb3VnaHB1dC5nZXRUaHJvdWdocHV0KTt9fQptb2R1bGUuZXhwb3J0cz1OZXR3b3JrVGhyb3VnaHB1dDt9LHsiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvcGFnZS1kZXBlbmRlbmN5LWdyYXBoIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IENvbXB1dGVkQXJ0aWZhY3Q9cmVxdWlyZSgnLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NvbnN0IE5ldHdvcmtOb2RlPXJlcXVpcmUoJy4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL25ldHdvcmstbm9kZScpO2NvbnN0IENQVU5vZGU9cmVxdWlyZSgnLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvY3B1LW5vZGUnKTtjb25zdCBOZXR3b3JrQW5hbHl6ZXI9cmVxdWlyZSgnLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvc2ltdWxhdG9yL25ldHdvcmstYW5hbHl6ZXInKTtjb25zdCBUcmFjaW5nUHJvY2Vzc29yPXJlcXVpcmUoJy4uLy4uL2xpYi90cmFjZXMvdHJhY2luZy1wcm9jZXNzb3InKTtjb25zdCBOZXR3b3JrUmVxdWVzdD1yZXF1aXJlKCcuLi8uLi9saWIvbmV0d29yay1yZXF1ZXN0Jyk7Y29uc3QgTUlOSU1VTV9UQVNLX0RVUkFUSU9OX09GX0lOVEVSRVNUPTEwO2NvbnN0IElHTk9SRURfTUlNRV9UWVBFU19SRUdFWD0vXnZpZGVvLztjbGFzcyBQYWdlRGVwZW5kZW5jeUdyYXBoQXJ0aWZhY3QgZXh0ZW5kcyBDb21wdXRlZEFydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ1BhZ2VEZXBlbmRlbmN5R3JhcGgnO30Kc3RhdGljIGdldE5ldHdvcmtJbml0aWF0b3JzKHJlY29yZCl7aWYoIXJlY29yZC5pbml0aWF0b3IpcmV0dXJuW107aWYocmVjb3JkLmluaXRpYXRvci51cmwpcmV0dXJuW3JlY29yZC5pbml0aWF0b3IudXJsXTtpZihyZWNvcmQuaW5pdGlhdG9yLnR5cGU9PT0nc2NyaXB0JyYmcmVjb3JkLmluaXRpYXRvci5zdGFjayl7Y29uc3QgZnJhbWVzPXJlY29yZC5pbml0aWF0b3Iuc3RhY2suY2FsbEZyYW1lcztyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGZyYW1lcy5tYXAoZnJhbWU9PmZyYW1lLnVybCkpKS5maWx0ZXIoQm9vbGVhbik7fQpyZXR1cm5bXTt9CnN0YXRpYyBnZXROZXR3b3JrTm9kZU91dHB1dChuZXR3b3JrUmVjb3Jkcyl7Y29uc3Qgbm9kZXM9W107Y29uc3QgaWRUb05vZGVNYXA9bmV3IE1hcCgpO2NvbnN0IHVybFRvTm9kZU1hcD1uZXcgTWFwKCk7bmV0d29ya1JlY29yZHMuZm9yRWFjaChyZWNvcmQ9PntpZihJR05PUkVEX01JTUVfVFlQRVNfUkVHRVgudGVzdChyZWNvcmQubWltZVR5cGUpKXJldHVybjt3aGlsZShpZFRvTm9kZU1hcC5oYXMocmVjb3JkLnJlcXVlc3RJZCkpe3JlY29yZC5yZXF1ZXN0SWQrPSc6ZHVwbGljYXRlJzt9CmNvbnN0IG5vZGU9bmV3IE5ldHdvcmtOb2RlKHJlY29yZCk7bm9kZXMucHVzaChub2RlKTtjb25zdCBsaXN0PXVybFRvTm9kZU1hcC5nZXQocmVjb3JkLnVybCl8fFtdO2xpc3QucHVzaChub2RlKTtpZFRvTm9kZU1hcC5zZXQocmVjb3JkLnJlcXVlc3RJZCxub2RlKTt1cmxUb05vZGVNYXAuc2V0KHJlY29yZC51cmwsbGlzdCk7fSk7cmV0dXJue25vZGVzLGlkVG9Ob2RlTWFwLHVybFRvTm9kZU1hcH07fQpzdGF0aWMgZ2V0Q1BVTm9kZXModHJhY2VPZlRhYil7Y29uc3Qgbm9kZXM9W107bGV0IGk9MDtjb25zdCBtaW5pbXVtRXZ0RHVyPU1JTklNVU1fVEFTS19EVVJBVElPTl9PRl9JTlRFUkVTVCoxMDAwO3doaWxlKGk8dHJhY2VPZlRhYi5tYWluVGhyZWFkRXZlbnRzLmxlbmd0aCl7Y29uc3QgZXZ0PXRyYWNlT2ZUYWIubWFpblRocmVhZEV2ZW50c1tpXTtpZighVHJhY2luZ1Byb2Nlc3Nvci5pc1NjaGVkdWxlYWJsZVRhc2soZXZ0KXx8IWV2dC5kdXJ8fGV2dC5kdXI8bWluaW11bUV2dER1cikKe2krKztjb250aW51ZTt9CmNvbnN0IGNoaWxkcmVuPVtdO2krKztmb3IoY29uc3QgZW5kVGltZT1ldnQudHMrZXZ0LmR1cjtpPHRyYWNlT2ZUYWIubWFpblRocmVhZEV2ZW50cy5sZW5ndGgmJnRyYWNlT2ZUYWIubWFpblRocmVhZEV2ZW50c1tpXS50czxlbmRUaW1lO2krKykKe2NoaWxkcmVuLnB1c2godHJhY2VPZlRhYi5tYWluVGhyZWFkRXZlbnRzW2ldKTt9Cm5vZGVzLnB1c2gobmV3IENQVU5vZGUoZXZ0LGNoaWxkcmVuKSk7fQpyZXR1cm4gbm9kZXM7fQpzdGF0aWMgbGlua05ldHdvcmtOb2Rlcyhyb290Tm9kZSxuZXR3b3JrTm9kZU91dHB1dCl7bmV0d29ya05vZGVPdXRwdXQubm9kZXMuZm9yRWFjaChub2RlPT57Y29uc3QgaW5pdGlhdG9ycz1QYWdlRGVwZW5kZW5jeUdyYXBoQXJ0aWZhY3QuZ2V0TmV0d29ya0luaXRpYXRvcnMobm9kZS5yZWNvcmQpO2lmKGluaXRpYXRvcnMubGVuZ3RoKXtpbml0aWF0b3JzLmZvckVhY2goaW5pdGlhdG9yPT57Y29uc3QgcGFyZW50Q2FuZGlkYXRlcz1uZXR3b3JrTm9kZU91dHB1dC51cmxUb05vZGVNYXAuZ2V0KGluaXRpYXRvcil8fFtyb290Tm9kZV07Y29uc3QgcGFyZW50PXBhcmVudENhbmRpZGF0ZXMubGVuZ3RoPT09MT9wYXJlbnRDYW5kaWRhdGVzWzBdOnJvb3ROb2RlO25vZGUuYWRkRGVwZW5kZW5jeShwYXJlbnQpO30pO31lbHNlIGlmKG5vZGUhPT1yb290Tm9kZSl7cm9vdE5vZGUuYWRkRGVwZW5kZW50KG5vZGUpO30KY29uc3QgcmVkaXJlY3RzPUFycmF5LmZyb20obm9kZS5yZWNvcmQucmVkaXJlY3RzfHxbXSk7cmVkaXJlY3RzLnB1c2gobm9kZS5yZWNvcmQpO2ZvcihsZXQgaT0xO2k8cmVkaXJlY3RzLmxlbmd0aDtpKyspe2NvbnN0IHJlZGlyZWN0Tm9kZT1uZXR3b3JrTm9kZU91dHB1dC5pZFRvTm9kZU1hcC5nZXQocmVkaXJlY3RzW2ktMV0ucmVxdWVzdElkKTtjb25zdCBhY3R1YWxOb2RlPW5ldHdvcmtOb2RlT3V0cHV0LmlkVG9Ob2RlTWFwLmdldChyZWRpcmVjdHNbaV0ucmVxdWVzdElkKTtpZihhY3R1YWxOb2RlJiZyZWRpcmVjdE5vZGUpe2FjdHVhbE5vZGUuYWRkRGVwZW5kZW5jeShyZWRpcmVjdE5vZGUpO319fSk7fQpzdGF0aWMgbGlua0NQVU5vZGVzKHJvb3ROb2RlLG5ldHdvcmtOb2RlT3V0cHV0LGNwdU5vZGVzKXtmdW5jdGlvbiBhZGREZXBlbmRlbnROZXR3b3JrUmVxdWVzdChjcHVOb2RlLHJlcUlkKXtjb25zdCBuZXR3b3JrTm9kZT1uZXR3b3JrTm9kZU91dHB1dC5pZFRvTm9kZU1hcC5nZXQocmVxSWQpO2lmKCFuZXR3b3JrTm9kZXx8bmV0d29ya05vZGUucmVjb3JkLnJlc291cmNlVHlwZSE9PU5ldHdvcmtSZXF1ZXN0LlRZUEVTLlhIUnx8bmV0d29ya05vZGUuc3RhcnRUaW1lPD1jcHVOb2RlLnN0YXJ0VGltZSlyZXR1cm47Y3B1Tm9kZS5hZGREZXBlbmRlbnQobmV0d29ya05vZGUpO30KZnVuY3Rpb24gYWRkRGVwZW5kZW5jeU9uVXJsKGNwdU5vZGUsdXJsKXtpZighdXJsKXJldHVybjtjb25zdCBtaW5pbXVtQWxsb3dhYmxlVGltZVNpbmNlTmV0d29ya05vZGVFbmQ9LTEwMCoxMDAwO2NvbnN0IGNhbmRpZGF0ZXM9bmV0d29ya05vZGVPdXRwdXQudXJsVG9Ob2RlTWFwLmdldCh1cmwpfHxbXTtsZXQgbWluQ2FuZGlkYXRlPW51bGw7bGV0IG1pbkRpc3RhbmNlPUluZmluaXR5O2Zvcihjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcyl7aWYoY3B1Tm9kZS5zdGFydFRpbWU8PWNhbmRpZGF0ZS5zdGFydFRpbWUpcmV0dXJuO2NvbnN0IGRpc3RhbmNlPWNwdU5vZGUuc3RhcnRUaW1lLWNhbmRpZGF0ZS5lbmRUaW1lO2lmKGRpc3RhbmNlPj1taW5pbXVtQWxsb3dhYmxlVGltZVNpbmNlTmV0d29ya05vZGVFbmQmJmRpc3RhbmNlPG1pbkRpc3RhbmNlKXttaW5DYW5kaWRhdGU9Y2FuZGlkYXRlO21pbkRpc3RhbmNlPWRpc3RhbmNlO319CmlmKCFtaW5DYW5kaWRhdGUpcmV0dXJuO2NwdU5vZGUuYWRkRGVwZW5kZW5jeShtaW5DYW5kaWRhdGUpO30KY29uc3QgdGltZXJzPW5ldyBNYXAoKTtmb3IoY29uc3Qgbm9kZSBvZiBjcHVOb2Rlcyl7Zm9yKGNvbnN0IGV2dCBvZiBub2RlLmNoaWxkRXZlbnRzKXtpZighZXZ0LmFyZ3MuZGF0YSljb250aW51ZTtjb25zdCBhcmdzVXJsPWV2dC5hcmdzLmRhdGEudXJsO2NvbnN0IHN0YWNrVHJhY2VVcmxzPShldnQuYXJncy5kYXRhLnN0YWNrVHJhY2V8fFtdKS5tYXAobD0+bC51cmwpLmZpbHRlcihCb29sZWFuKTtzd2l0Y2goZXZ0Lm5hbWUpe2Nhc2UnVGltZXJJbnN0YWxsJzp0aW1lcnMuc2V0KGV2dC5hcmdzLmRhdGEudGltZXJJZCxub2RlKTtzdGFja1RyYWNlVXJscy5mb3JFYWNoKHVybD0+YWRkRGVwZW5kZW5jeU9uVXJsKG5vZGUsdXJsKSk7YnJlYWs7Y2FzZSdUaW1lckZpcmUnOntjb25zdCBpbnN0YWxsZXI9dGltZXJzLmdldChldnQuYXJncy5kYXRhLnRpbWVySWQpO2lmKCFpbnN0YWxsZXIpYnJlYWs7aW5zdGFsbGVyLmFkZERlcGVuZGVudChub2RlKTticmVhazt9CmNhc2UnSW52YWxpZGF0ZUxheW91dCc6Y2FzZSdTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbic6c3RhY2tUcmFjZVVybHMuZm9yRWFjaCh1cmw9PmFkZERlcGVuZGVuY3lPblVybChub2RlLHVybCkpO2JyZWFrO2Nhc2UnRXZhbHVhdGVTY3JpcHQnOmFkZERlcGVuZGVuY3lPblVybChub2RlLGFyZ3NVcmwpO3N0YWNrVHJhY2VVcmxzLmZvckVhY2godXJsPT5hZGREZXBlbmRlbmN5T25Vcmwobm9kZSx1cmwpKTticmVhaztjYXNlJ1hIUlJlYWR5U3RhdGVDaGFuZ2UnOmlmKGV2dC5hcmdzLmRhdGEucmVhZHlTdGF0ZSE9PTQpYnJlYWs7YWRkRGVwZW5kZW5jeU9uVXJsKG5vZGUsYXJnc1VybCk7c3RhY2tUcmFjZVVybHMuZm9yRWFjaCh1cmw9PmFkZERlcGVuZGVuY3lPblVybChub2RlLHVybCkpO2JyZWFrO2Nhc2UnRnVuY3Rpb25DYWxsJzpjYXNlJ3Y4LmNvbXBpbGUnOmFkZERlcGVuZGVuY3lPblVybChub2RlLGFyZ3NVcmwpO2JyZWFrO2Nhc2UnUGFyc2VBdXRob3JTdHlsZVNoZWV0JzphZGREZXBlbmRlbmN5T25Vcmwobm9kZSxldnQuYXJncy5kYXRhLnN0eWxlU2hlZXRVcmwpO2JyZWFrO2Nhc2UnUmVzb3VyY2VTZW5kUmVxdWVzdCc6YWRkRGVwZW5kZW50TmV0d29ya1JlcXVlc3Qobm9kZSxldnQuYXJncy5kYXRhLnJlcXVlc3RJZCk7c3RhY2tUcmFjZVVybHMuZm9yRWFjaCh1cmw9PmFkZERlcGVuZGVuY3lPblVybChub2RlLHVybCkpO2JyZWFrO319CmlmKG5vZGUuZ2V0TnVtYmVyT2ZEZXBlbmRlbmNpZXMoKT09PTApe25vZGUuYWRkRGVwZW5kZW5jeShyb290Tm9kZSk7fX19CnN0YXRpYyBjcmVhdGVHcmFwaCh0cmFjZU9mVGFiLG5ldHdvcmtSZWNvcmRzKXtjb25zdCBuZXR3b3JrTm9kZU91dHB1dD1QYWdlRGVwZW5kZW5jeUdyYXBoQXJ0aWZhY3QuZ2V0TmV0d29ya05vZGVPdXRwdXQobmV0d29ya1JlY29yZHMpO2NvbnN0IGNwdU5vZGVzPVBhZ2VEZXBlbmRlbmN5R3JhcGhBcnRpZmFjdC5nZXRDUFVOb2Rlcyh0cmFjZU9mVGFiKTtjb25zdCByb290UmVxdWVzdD1uZXR3b3JrUmVjb3Jkcy5yZWR1Y2UoKG1pbixyKT0+bWluLnN0YXJ0VGltZTxyLnN0YXJ0VGltZT9taW46cik7Y29uc3Qgcm9vdE5vZGU9bmV0d29ya05vZGVPdXRwdXQuaWRUb05vZGVNYXAuZ2V0KHJvb3RSZXF1ZXN0LnJlcXVlc3RJZCk7Y29uc3QgbWFpbkRvY3VtZW50UmVxdWVzdD1OZXR3b3JrQW5hbHl6ZXIuZmluZE1haW5Eb2N1bWVudChuZXR3b3JrUmVjb3Jkcyk7Y29uc3QgbWFpbkRvY3VtZW50Tm9kZT1uZXR3b3JrTm9kZU91dHB1dC5pZFRvTm9kZU1hcC5nZXQobWFpbkRvY3VtZW50UmVxdWVzdC5yZXF1ZXN0SWQpO2lmKCFyb290Tm9kZXx8IW1haW5Eb2N1bWVudE5vZGUpe3Rocm93IG5ldyBFcnJvcihgJHtyb290Tm9kZT8nbWFpbkRvY3VtZW50Jzoncm9vdCd9Tm9kZSBub3QgZm91bmQuYCk7fQpQYWdlRGVwZW5kZW5jeUdyYXBoQXJ0aWZhY3QubGlua05ldHdvcmtOb2Rlcyhyb290Tm9kZSxuZXR3b3JrTm9kZU91dHB1dCk7UGFnZURlcGVuZGVuY3lHcmFwaEFydGlmYWN0LmxpbmtDUFVOb2Rlcyhyb290Tm9kZSxuZXR3b3JrTm9kZU91dHB1dCxjcHVOb2Rlcyk7bWFpbkRvY3VtZW50Tm9kZS5zZXRJc01haW5Eb2N1bWVudCh0cnVlKTtpZihOZXR3b3JrTm9kZS5oYXNDeWNsZShyb290Tm9kZSkpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXBlbmRlbmN5IGdyYXBoIGNyZWF0ZWQsIGN5Y2xlIGRldGVjdGVkJyk7fQpyZXR1cm4gcm9vdE5vZGU7fQpzdGF0aWMgcHJpbnRHcmFwaChyb290Tm9kZSx3aWR0aEluQ2hhcmFjdGVycz0xMDApe2Z1bmN0aW9uIHBhZFJpZ2h0KHN0cix0YXJnZXQscGFkQ2hhcj0nICcpe3JldHVybiBzdHIrcGFkQ2hhci5yZXBlYXQoTWF0aC5tYXgodGFyZ2V0LXN0ci5sZW5ndGgsMCkpO30KY29uc3Qgbm9kZXM9W107cm9vdE5vZGUudHJhdmVyc2Uobm9kZT0+bm9kZXMucHVzaChub2RlKSk7bm9kZXMuc29ydCgoYSxiKT0+YS5zdGFydFRpbWUtYi5zdGFydFRpbWUpO2NvbnN0IG1pbj1ub2Rlc1swXS5zdGFydFRpbWU7Y29uc3QgbWF4PW5vZGVzLnJlZHVjZSgobWF4LG5vZGUpPT5NYXRoLm1heChtYXgsbm9kZS5lbmRUaW1lKSwwKTtjb25zdCB0b3RhbFRpbWU9bWF4LW1pbjtjb25zdCB0aW1lUGVyQ2hhcmFjdGVyPXRvdGFsVGltZS93aWR0aEluQ2hhcmFjdGVycztub2Rlcy5mb3JFYWNoKG5vZGU9Pntjb25zdCBvZmZzZXQ9TWF0aC5yb3VuZCgobm9kZS5zdGFydFRpbWUtbWluKS90aW1lUGVyQ2hhcmFjdGVyKTtjb25zdCBsZW5ndGg9TWF0aC5jZWlsKChub2RlLmVuZFRpbWUtbm9kZS5zdGFydFRpbWUpL3RpbWVQZXJDaGFyYWN0ZXIpO2NvbnN0IGJhcj1wYWRSaWdodCgnJyxvZmZzZXQpK3BhZFJpZ2h0KCcnLGxlbmd0aCwnPScpO2NvbnN0IGRpc3BsYXlOYW1lPW5vZGUucmVjb3JkP25vZGUucmVjb3JkLnVybDpub2RlLnR5cGU7Y29uc29sZS5sb2cocGFkUmlnaHQoYmFyLHdpZHRoSW5DaGFyYWN0ZXJzKSxgfCAke2Rpc3BsYXlOYW1lLnNsaWNlKDAsMzApfWApO30pO30KYXN5bmMgY29tcHV0ZV8oZGF0YSxhcnRpZmFjdHMpe2NvbnN0IHRyYWNlPWRhdGEudHJhY2U7Y29uc3QgZGV2dG9vbHNMb2c9ZGF0YS5kZXZ0b29sc0xvZztjb25zdFt0cmFjZU9mVGFiLG5ldHdvcmtSZWNvcmRzXT1hd2FpdCBQcm9taXNlLmFsbChbYXJ0aWZhY3RzLnJlcXVlc3RUcmFjZU9mVGFiKHRyYWNlKSxhcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9nKV0pO3JldHVybiBQYWdlRGVwZW5kZW5jeUdyYXBoQXJ0aWZhY3QuY3JlYXRlR3JhcGgodHJhY2VPZlRhYixuZXR3b3JrUmVjb3Jkcyk7fX0KbW9kdWxlLmV4cG9ydHM9UGFnZURlcGVuZGVuY3lHcmFwaEFydGlmYWN0O30seyIuLi8uLi9saWIvZGVwZW5kZW5jeS1ncmFwaC9jcHUtbm9kZSI6MjMsIi4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL25ldHdvcmstbm9kZSI6MjQsIi4uLy4uL2xpYi9kZXBlbmRlbmN5LWdyYXBoL3NpbXVsYXRvci9uZXR3b3JrLWFuYWx5emVyIjoyNywiLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uLy4uL2xpYi90cmFjZXMvdHJhY2luZy1wcm9jZXNzb3IiOjQ2LCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMX1dLCIuL2dhdGhlci9jb21wdXRlZC9wdXNoZWQtcmVxdWVzdHMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y2xhc3MgUHVzaGVkUmVxdWVzdHMgZXh0ZW5kcyBDb21wdXRlZEFydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ1B1c2hlZFJlcXVlc3RzJzt9CmNvbXB1dGVfKGRldnRvb2xzTG9nLGFydGlmYWN0cyl7cmV0dXJuIGFydGlmYWN0cy5yZXF1ZXN0TmV0d29ya1JlY29yZHMoZGV2dG9vbHNMb2cpLnRoZW4ocmVjb3Jkcz0+e2NvbnN0IHB1c2hlZFJlY29yZHM9cmVjb3Jkcy5maWx0ZXIocj0+ci50aW1pbmcmJiEhci50aW1pbmcucHVzaFN0YXJ0KTtyZXR1cm4gcHVzaGVkUmVjb3Jkczt9KTt9fQptb2R1bGUuZXhwb3J0cz1QdXNoZWRSZXF1ZXN0czt9LHsiLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwiLi9nYXRoZXIvY29tcHV0ZWQvc2NyZWVuc2hvdHMiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3QgU0NSRUVOU0hPVF9UUkFDRV9OQU1FPSdTY3JlZW5zaG90JztjbGFzcyBTY3JlZW5zaG90RmlsbXN0cmlwIGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3JldHVybidTY3JlZW5zaG90cyc7fQphc3luYyBjb21wdXRlXyh0cmFjZSl7cmV0dXJuIHRyYWNlLnRyYWNlRXZlbnRzLmZpbHRlcihldnQ9PmV2dC5uYW1lPT09U0NSRUVOU0hPVF9UUkFDRV9OQU1FKS5tYXAoZXZ0PT57cmV0dXJue3RpbWVzdGFtcDpldnQudHMvMTAwMCxkYXRhdXJpOmBkYXRhOmltYWdlL2pwZztiYXNlNjQsJHtldnQuYXJncy5zbmFwc2hvdH1gfTt9KTt9fQptb2R1bGUuZXhwb3J0cz1TY3JlZW5zaG90RmlsbXN0cmlwO30seyIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMX1dLCIuL2dhdGhlci9jb21wdXRlZC9zcGVlZGxpbmUiOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3Qgc3BlZWRsaW5lPXJlcXVpcmUoJ3NwZWVkbGluZScpO2NvbnN0IExIRXJyb3I9cmVxdWlyZSgnLi4vLi4vbGliL2Vycm9ycycpO2NsYXNzIFNwZWVkbGluZSBleHRlbmRzIENvbXB1dGVkQXJ0aWZhY3R7Z2V0IG5hbWUoKXtyZXR1cm4nU3BlZWRsaW5lJzt9CmNvbXB1dGVfKHRyYWNlLGNvbXB1dGVkQXJ0aWZhY3RzKXtyZXR1cm4gY29tcHV0ZWRBcnRpZmFjdHMucmVxdWVzdFRyYWNlT2ZUYWIodHJhY2UpLnRoZW4odHJhY2VPZlRhYj0+e2NvbnN0IHRyYWNlRXZlbnRzPXRyYWNlLnRyYWNlRXZlbnRzLnNsaWNlKCk7Y29uc3QgbmF2U3RhcnQ9dHJhY2VPZlRhYi50aW1lc3RhbXBzLm5hdmlnYXRpb25TdGFydDtyZXR1cm4gc3BlZWRsaW5lKHRyYWNlRXZlbnRzLHt0aW1lT3JpZ2luOm5hdlN0YXJ0LGZhc3RNb2RlOnRydWUsaW5jbHVkZTonc3BlZWRJbmRleCd9KTt9KS5jYXRjaChlcnI9PntpZigvTm8gc2NyZWVuc2hvdHMgZm91bmQgaW4gdHJhY2UvLnRlc3QoZXJyLm1lc3NhZ2UpKXt0aHJvdyBuZXcgTEhFcnJvcihMSEVycm9yLmVycm9ycy5OT19TQ1JFRU5TSE9UUyk7fQp0aHJvdyBlcnI7fSkudGhlbihzcGVlZGxpbmU9PntpZihzcGVlZGxpbmUuZnJhbWVzLmxlbmd0aD09PTApe3Rocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLk5PX1NQRUVETElORV9GUkFNRVMpO30KaWYoc3BlZWRsaW5lLnNwZWVkSW5kZXg9PT0wKXt0aHJvdyBuZXcgTEhFcnJvcihMSEVycm9yLmVycm9ycy5TUEVFRElOREVYX09GX1pFUk8pO30KcmV0dXJuIHNwZWVkbGluZTt9KTt9fQptb2R1bGUuZXhwb3J0cz1TcGVlZGxpbmU7fSx7Ii4uLy4uL2xpYi9lcnJvcnMiOjMzLCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMSwic3BlZWRsaW5lIjoxMzR9XSwiLi9nYXRoZXIvY29tcHV0ZWQvdHJhY2Utb2YtdGFiIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IENvbXB1dGVkQXJ0aWZhY3Q9cmVxdWlyZSgnLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NvbnN0IGxvZz1yZXF1aXJlKCdsaWdodGhvdXNlLWxvZ2dlcicpO2NvbnN0IFRyYWNpbmdQcm9jZXNzb3I9cmVxdWlyZSgnLi4vLi4vbGliL3RyYWNlcy90cmFjaW5nLXByb2Nlc3NvcicpO2NvbnN0IExIRXJyb3I9cmVxdWlyZSgnLi4vLi4vbGliL2Vycm9ycycpO2NvbnN0IFNlbnRyeT1yZXF1aXJlKCcuLi8uLi9saWIvc2VudHJ5Jyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NsYXNzIFRyYWNlT2ZUYWIgZXh0ZW5kcyBDb21wdXRlZEFydGlmYWN0e2dldCBuYW1lKCl7cmV0dXJuJ1RyYWNlT2ZUYWInO30Kc3RhdGljIGZpbHRlcmVkU3RhYmxlU29ydCh0cmFjZUV2ZW50cyxmaWx0ZXIpe2NvbnN0IGluZGljZXM9W107Zm9yKGxldCBzcmNJbmRleD0wO3NyY0luZGV4PHRyYWNlRXZlbnRzLmxlbmd0aDtzcmNJbmRleCsrKXtpZihmaWx0ZXIodHJhY2VFdmVudHNbc3JjSW5kZXhdKSl7aW5kaWNlcy5wdXNoKHNyY0luZGV4KTt9fQppbmRpY2VzLnNvcnQoKGluZGV4QSxpbmRleEIpPT57Y29uc3QgcmVzdWx0PXRyYWNlRXZlbnRzW2luZGV4QV0udHMtdHJhY2VFdmVudHNbaW5kZXhCXS50cztyZXR1cm4gcmVzdWx0P3Jlc3VsdDppbmRleEEtaW5kZXhCO30pO2NvbnN0IHNvcnRlZD1bXTtmb3IobGV0IGk9MDtpPGluZGljZXMubGVuZ3RoO2krKyl7c29ydGVkLnB1c2godHJhY2VFdmVudHNbaW5kaWNlc1tpXV0pO30KcmV0dXJuIHNvcnRlZDt9CmFzeW5jIGNvbXB1dGVfKHRyYWNlKXtjb25zdCBrZXlFdmVudHM9VHJhY2VPZlRhYi5maWx0ZXJlZFN0YWJsZVNvcnQodHJhY2UudHJhY2VFdmVudHMsZT0+e3JldHVybiBlLmNhdC5pbmNsdWRlcygnYmxpbmsudXNlcl90aW1pbmcnKXx8ZS5jYXQuaW5jbHVkZXMoJ2xvYWRpbmcnKXx8ZS5jYXQuaW5jbHVkZXMoJ2RldnRvb2xzLnRpbWVsaW5lJyl8fGUuY2F0PT09J19fbWV0YWRhdGEnO30pO2NvbnN0e3N0YXJ0ZWRJblBhZ2VFdnQsZnJhbWVJZH09VHJhY2luZ1Byb2Nlc3Nvci5maW5kVHJhY2luZ1N0YXJ0ZWRFdnQoa2V5RXZlbnRzKTtjb25zdCBmcmFtZUV2ZW50cz1rZXlFdmVudHMuZmlsdGVyKGU9PmUuYXJncy5mcmFtZT09PWZyYW1lSWQpO2NvbnN0IG5hdmlnYXRpb25TdGFydD1mcmFtZUV2ZW50cy5maWx0ZXIoZT0+ZS5uYW1lPT09J25hdmlnYXRpb25TdGFydCcpLnBvcCgpO2lmKCFuYXZpZ2F0aW9uU3RhcnQpdGhyb3cgbmV3IExIRXJyb3IoTEhFcnJvci5lcnJvcnMuTk9fTkFWU1RBUlQpO2NvbnN0IGZpcnN0UGFpbnQ9ZnJhbWVFdmVudHMuZmluZChlPT5lLm5hbWU9PT0nZmlyc3RQYWludCcmJmUudHM+bmF2aWdhdGlvblN0YXJ0LnRzKTtjb25zdCBmaXJzdENvbnRlbnRmdWxQYWludD1mcmFtZUV2ZW50cy5maW5kKGU9PmUubmFtZT09PSdmaXJzdENvbnRlbnRmdWxQYWludCcmJmUudHM+bmF2aWdhdGlvblN0YXJ0LnRzKTtsZXQgZmlyc3RNZWFuaW5nZnVsUGFpbnQ9ZnJhbWVFdmVudHMuZmluZChlPT5lLm5hbWU9PT0nZmlyc3RNZWFuaW5nZnVsUGFpbnQnJiZlLnRzPm5hdmlnYXRpb25TdGFydC50cyk7bGV0IGZtcEZlbGxCYWNrPWZhbHNlO2lmKCFmaXJzdE1lYW5pbmdmdWxQYWludCl7U2VudHJ5LmNhcHR1cmVNZXNzYWdlKCdObyBmaXJzdE1lYW5pbmdmdWxQYWludCBmb3VuZCwgdXNpbmcgZmFsbGJhY2snLHtsZXZlbDond2FybmluZyd9KTtjb25zdCBmbXBDYW5kPSdmaXJzdE1lYW5pbmdmdWxQYWludENhbmRpZGF0ZSc7Zm1wRmVsbEJhY2s9dHJ1ZTtsb2cudmVyYm9zZSgndHJhY2Utb2YtdGFiJyxgTm8gZmlyc3RNZWFuaW5nZnVsUGFpbnQgZm91bmQsIGZhbGxpbmcgYmFjayB0byBsYXN0ICR7Zm1wQ2FuZH1gKTtjb25zdCBsYXN0Q2FuZGlkYXRlPWZyYW1lRXZlbnRzLmZpbHRlcihlPT5lLm5hbWU9PT1mbXBDYW5kKS5wb3AoKTtpZighbGFzdENhbmRpZGF0ZSl7bG9nLnZlcmJvc2UoJ3RyYWNlLW9mLXRhYicsJ05vIGBmaXJzdE1lYW5pbmdmdWxQYWludENhbmRpZGF0ZWAgZXZlbnRzIGZvdW5kIGluIHRyYWNlJyk7fQpmaXJzdE1lYW5pbmdmdWxQYWludD1sYXN0Q2FuZGlkYXRlO30KY29uc3QgbG9hZD1mcmFtZUV2ZW50cy5maW5kKGU9PmUubmFtZT09PSdsb2FkRXZlbnRFbmQnJiZlLnRzPm5hdmlnYXRpb25TdGFydC50cyk7Y29uc3QgZG9tQ29udGVudExvYWRlZD1mcmFtZUV2ZW50cy5maW5kKGU9PmUubmFtZT09PSdkb21Db250ZW50TG9hZGVkRXZlbnRFbmQnJiZlLnRzPm5hdmlnYXRpb25TdGFydC50cyk7Y29uc3QgcHJvY2Vzc0V2ZW50cz1UcmFjZU9mVGFiLmZpbHRlcmVkU3RhYmxlU29ydCh0cmFjZS50cmFjZUV2ZW50cyxlPT5lLnBpZD09PXN0YXJ0ZWRJblBhZ2VFdnQucGlkKTtjb25zdCBtYWluVGhyZWFkRXZlbnRzPXByb2Nlc3NFdmVudHMuZmlsdGVyKGU9PmUudGlkPT09c3RhcnRlZEluUGFnZUV2dC50aWQpO2NvbnN0IHRyYWNlRW5kPXRyYWNlLnRyYWNlRXZlbnRzLnJlZHVjZSgobWF4LGV2dCk9PntyZXR1cm4gbWF4LnRzPmV2dC50cz9tYXg6ZXZ0O30pO2NvbnN0IG1ldHJpY3M9e25hdmlnYXRpb25TdGFydCxmaXJzdFBhaW50LGZpcnN0Q29udGVudGZ1bFBhaW50LGZpcnN0TWVhbmluZ2Z1bFBhaW50LHRyYWNlRW5kOnt0czp0cmFjZUVuZC50cysodHJhY2VFbmQuZHVyfHwwKX0sbG9hZCxkb21Db250ZW50TG9hZGVkfTtjb25zdCB0aW1pbmdzPXt9O2NvbnN0IHRpbWVzdGFtcHM9e307T2JqZWN0LmtleXMobWV0cmljcykuZm9yRWFjaChtZXRyaWM9Pnt0aW1lc3RhbXBzW21ldHJpY109bWV0cmljc1ttZXRyaWNdJiZtZXRyaWNzW21ldHJpY10udHM7dGltaW5nc1ttZXRyaWNdPSh0aW1lc3RhbXBzW21ldHJpY10tbmF2aWdhdGlvblN0YXJ0LnRzKS8xMDAwO30pO3JldHVybnt0aW1pbmdzOnRpbWluZ3MsdGltZXN0YW1wczp0aW1lc3RhbXBzLHByb2Nlc3NFdmVudHMsbWFpblRocmVhZEV2ZW50cyxzdGFydGVkSW5QYWdlRXZ0LG5hdmlnYXRpb25TdGFydEV2dDpuYXZpZ2F0aW9uU3RhcnQsZmlyc3RQYWludEV2dDpmaXJzdFBhaW50LGZpcnN0Q29udGVudGZ1bFBhaW50RXZ0OmZpcnN0Q29udGVudGZ1bFBhaW50LGZpcnN0TWVhbmluZ2Z1bFBhaW50RXZ0OmZpcnN0TWVhbmluZ2Z1bFBhaW50LGxvYWRFdnQ6bG9hZCxkb21Db250ZW50TG9hZGVkRXZ0OmRvbUNvbnRlbnRMb2FkZWQsZm1wRmVsbEJhY2t9O319Cm1vZHVsZS5leHBvcnRzPVRyYWNlT2ZUYWI7fSx7Ii4uLy4uL2xpYi9lcnJvcnMiOjMzLCIuLi8uLi9saWIvbmV0d29yay1yZXF1ZXN0IjozOCwiLi4vLi4vbGliL3NlbnRyeSI6NDAsIi4uLy4uL2xpYi90cmFjZXMvdHJhY2luZy1wcm9jZXNzb3IiOjQ2LCIuL2NvbXB1dGVkLWFydGlmYWN0IjoxMSwibGlnaHRob3VzZS1sb2dnZXIiOjEyNX1dLDE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuLi9hdWRpdCcpO2NsYXNzIEF4ZUF1ZGl0IGV4dGVuZHMgQXVkaXR7c3RhdGljIGF1ZGl0KGFydGlmYWN0cyl7Y29uc3Qgbm90QXBwbGljYWJsZXM9YXJ0aWZhY3RzLkFjY2Vzc2liaWxpdHkubm90QXBwbGljYWJsZXx8W107Y29uc3QgaXNOb3RBcHBsaWNhYmxlPW5vdEFwcGxpY2FibGVzLmZpbmQocmVzdWx0PT5yZXN1bHQuaWQ9PT10aGlzLm1ldGEuaWQpO2lmKGlzTm90QXBwbGljYWJsZSl7cmV0dXJue3Jhd1ZhbHVlOnRydWUsbm90QXBwbGljYWJsZTp0cnVlfTt9CmNvbnN0IHZpb2xhdGlvbnM9YXJ0aWZhY3RzLkFjY2Vzc2liaWxpdHkudmlvbGF0aW9uc3x8W107Y29uc3QgcnVsZT12aW9sYXRpb25zLmZpbmQocmVzdWx0PT5yZXN1bHQuaWQ9PT10aGlzLm1ldGEuaWQpO2NvbnN0IGltcGFjdD1ydWxlJiZydWxlLmltcGFjdDtjb25zdCB0YWdzPXJ1bGUmJnJ1bGUudGFncztsZXQgaXRlbXM9W107aWYocnVsZSYmcnVsZS5ub2Rlcyl7aXRlbXM9cnVsZS5ub2Rlcy5tYXAobm9kZT0+KHtub2RlOnt0eXBlOidub2RlJyxzZWxlY3RvcjpBcnJheS5pc0FycmF5KG5vZGUudGFyZ2V0KT9ub2RlLnRhcmdldC5qb2luKCcgJyk6JycscGF0aDpub2RlLnBhdGgsc25pcHBldDpub2RlLmh0bWx8fG5vZGUuc25pcHBldCxleHBsYW5hdGlvbjpub2RlLmZhaWx1cmVTdW1tYXJ5fX0pKTt9CmNvbnN0IGhlYWRpbmdzPVt7a2V5Oidub2RlJyxpdGVtVHlwZTonbm9kZScsdGV4dDonRmFpbGluZyBFbGVtZW50cyd9XTtyZXR1cm57cmF3VmFsdWU6dHlwZW9mIHJ1bGU9PT0ndW5kZWZpbmVkJyxleHRlbmRlZEluZm86e3ZhbHVlOnJ1bGV9LGRldGFpbHM6ey4uLkF1ZGl0Lm1ha2VUYWJsZURldGFpbHMoaGVhZGluZ3MsaXRlbXMpLGltcGFjdCx0YWdzfX07fX0KbW9kdWxlLmV4cG9ydHM9QXhlQXVkaXQ7fSx7Ii4uL2F1ZGl0IjoyfV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IHN0YXRpc3RpY3M9cmVxdWlyZSgnLi4vbGliL3N0YXRpc3RpY3MnKTtjb25zdCBVdGlsPXJlcXVpcmUoJy4uL3JlcG9ydC9odG1sL3JlbmRlcmVyL3V0aWwnKTtjb25zdCBERUZBVUxUX1BBU1M9J2RlZmF1bHRQYXNzJztjb25zdCBjbGFtcFRvMkRlY2ltYWxzPXZhbD0+TWF0aC5yb3VuZCh2YWwqMTAwKS8xMDA7Y2xhc3MgQXVkaXR7c3RhdGljIGdldCBERUZBVUxUX1BBU1MoKXtyZXR1cm4gREVGQVVMVF9QQVNTO30Kc3RhdGljIGdldCBTQ09SSU5HX01PREVTKCl7cmV0dXJue05VTUVSSUM6J251bWVyaWMnLEJJTkFSWTonYmluYXJ5JyxNQU5VQUw6J21hbnVhbCcsSU5GT1JNQVRJVkU6J2luZm9ybWF0aXZlJyxOT1RfQVBQTElDQUJMRTonbm90LWFwcGxpY2FibGUnLEVSUk9SOidlcnJvcid9O30Kc3RhdGljIGdldCBtZXRhKCl7dGhyb3cgbmV3IEVycm9yKCdBdWRpdCBtZXRhIGluZm9ybWF0aW9uIG11c3QgYmUgb3ZlcnJpZGRlbi4nKTt9CnN0YXRpYyBnZXQgZGVmYXVsdE9wdGlvbnMoKXtyZXR1cm57fTt9CnN0YXRpYyBhdWRpdChhcnRpZmFjdHMsY29udGV4dCl7dGhyb3cgbmV3IEVycm9yKCdhdWRpdCgpIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRlbicpO30Kc3RhdGljIGNvbXB1dGVMb2dOb3JtYWxTY29yZShtZWFzdXJlZFZhbHVlLGRpbWluaXNoaW5nUmV0dXJuc1ZhbHVlLG1lZGlhblZhbHVlKXtjb25zdCBkaXN0cmlidXRpb249c3RhdGlzdGljcy5nZXRMb2dOb3JtYWxEaXN0cmlidXRpb24obWVkaWFuVmFsdWUsZGltaW5pc2hpbmdSZXR1cm5zVmFsdWUpO2xldCBzY29yZT1kaXN0cmlidXRpb24uY29tcHV0ZUNvbXBsZW1lbnRhcnlQZXJjZW50aWxlKG1lYXN1cmVkVmFsdWUpO3Njb3JlPU1hdGgubWluKDEsc2NvcmUpO3Njb3JlPU1hdGgubWF4KDAsc2NvcmUpO3JldHVybiBjbGFtcFRvMkRlY2ltYWxzKHNjb3JlKTt9CnN0YXRpYyBnZW5lcmF0ZUVycm9yQXVkaXRSZXN1bHQoYXVkaXQsZXJyb3JNZXNzYWdlKXtyZXR1cm4gQXVkaXQuZ2VuZXJhdGVBdWRpdFJlc3VsdChhdWRpdCx7cmF3VmFsdWU6bnVsbCxlcnJvck1lc3NhZ2V9KTt9CnN0YXRpYyBtYWtlVGFibGVEZXRhaWxzKGhlYWRpbmdzLHJlc3VsdHMsc3VtbWFyeSl7aWYocmVzdWx0cy5sZW5ndGg9PT0wKXtyZXR1cm57dHlwZTondGFibGUnLGhlYWRpbmdzOltdLGl0ZW1zOltdLHN1bW1hcnl9O30KcmV0dXJue3R5cGU6J3RhYmxlJyxoZWFkaW5nczpoZWFkaW5ncyxpdGVtczpyZXN1bHRzLHN1bW1hcnl9O30Kc3RhdGljIG1ha2VPcHBvcnR1bml0eURldGFpbHMoaGVhZGluZ3MsaXRlbXMsb3ZlcmFsbFNhdmluZ3NNcyxvdmVyYWxsU2F2aW5nc0J5dGVzKXtyZXR1cm57dHlwZTonb3Bwb3J0dW5pdHknLGhlYWRpbmdzOml0ZW1zLmxlbmd0aD09PTA/W106aGVhZGluZ3MsaXRlbXMsb3ZlcmFsbFNhdmluZ3NNcyxvdmVyYWxsU2F2aW5nc0J5dGVzfTt9CnN0YXRpYyBfbm9ybWFsaXplQXVkaXRTY29yZShhdWRpdCxyZXN1bHQpe2xldCBzY29yZT1yZXN1bHQuc2NvcmU9PT11bmRlZmluZWQ/TnVtYmVyKHJlc3VsdC5yYXdWYWx1ZSk6cmVzdWx0LnNjb3JlO2lmKCFOdW1iZXIuaXNGaW5pdGUoc2NvcmUpKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY29yZTogJHtzY29yZX1gKTtpZihzY29yZT4xKXRocm93IG5ldyBFcnJvcihgQXVkaXQgc2NvcmUgZm9yICR7YXVkaXQubWV0YS5pZH0gaXMgPiAxYCk7aWYoc2NvcmU8MCl0aHJvdyBuZXcgRXJyb3IoYEF1ZGl0IHNjb3JlIGZvciAke2F1ZGl0Lm1ldGEuaWR9IGlzIDwgMGApO3Njb3JlPWNsYW1wVG8yRGVjaW1hbHMoc2NvcmUpO2NvbnN0IHNjb3JlRGlzcGxheU1vZGU9YXVkaXQubWV0YS5zY29yZURpc3BsYXlNb2RlfHxBdWRpdC5TQ09SSU5HX01PREVTLkJJTkFSWTtyZXR1cm57c2NvcmUsc2NvcmVEaXNwbGF5TW9kZX07fQpzdGF0aWMgZ2VuZXJhdGVBdWRpdFJlc3VsdChhdWRpdCxyZXN1bHQpe2lmKHR5cGVvZiByZXN1bHQucmF3VmFsdWU9PT0ndW5kZWZpbmVkJyl7dGhyb3cgbmV3IEVycm9yKCdnZW5lcmF0ZUF1ZGl0UmVzdWx0IHJlcXVpcmVzIGEgcmF3VmFsdWUnKTt9CmxldHtzY29yZSxzY29yZURpc3BsYXlNb2RlfT1BdWRpdC5fbm9ybWFsaXplQXVkaXRTY29yZShhdWRpdCxyZXN1bHQpO2lmKHJlc3VsdC5ub3RBcHBsaWNhYmxlKXtzY29yZURpc3BsYXlNb2RlPUF1ZGl0LlNDT1JJTkdfTU9ERVMuTk9UX0FQUExJQ0FCTEU7cmVzdWx0LnJhd1ZhbHVlPXRydWU7fQppZihyZXN1bHQuZXJyb3JNZXNzYWdlKXtzY29yZURpc3BsYXlNb2RlPUF1ZGl0LlNDT1JJTkdfTU9ERVMuRVJST1I7fQpsZXQgYXVkaXRUaXRsZT1hdWRpdC5tZXRhLnRpdGxlO2lmKGF1ZGl0Lm1ldGEuZmFpbHVyZVRpdGxlKXtpZihOdW1iZXIoc2NvcmUpPFV0aWwuUEFTU19USFJFU0hPTEQpe2F1ZGl0VGl0bGU9YXVkaXQubWV0YS5mYWlsdXJlVGl0bGU7fX0KaWYoc2NvcmVEaXNwbGF5TW9kZSE9PUF1ZGl0LlNDT1JJTkdfTU9ERVMuQklOQVJZJiZzY29yZURpc3BsYXlNb2RlIT09QXVkaXQuU0NPUklOR19NT0RFUy5OVU1FUklDKXtzY29yZT1udWxsO30KcmV0dXJue2lkOmF1ZGl0Lm1ldGEuaWQsdGl0bGU6YXVkaXRUaXRsZSxkZXNjcmlwdGlvbjphdWRpdC5tZXRhLmRlc2NyaXB0aW9uLHNjb3JlLHNjb3JlRGlzcGxheU1vZGUscmF3VmFsdWU6cmVzdWx0LnJhd1ZhbHVlLGRpc3BsYXlWYWx1ZTpyZXN1bHQuZGlzcGxheVZhbHVlLGV4cGxhbmF0aW9uOnJlc3VsdC5leHBsYW5hdGlvbixlcnJvck1lc3NhZ2U6cmVzdWx0LmVycm9yTWVzc2FnZSx3YXJuaW5nczpyZXN1bHQud2FybmluZ3MsZGV0YWlsczpyZXN1bHQuZGV0YWlsc307fX0KbW9kdWxlLmV4cG9ydHM9QXVkaXQ7fSx7Ii4uL2xpYi9zdGF0aXN0aWNzIjo0MSwiLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbCI6NDh9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXQnKTtjb25zdCBsaW5lYXJJbnRlcnBvbGF0aW9uPXJlcXVpcmUoJy4uLy4uL2xpYi9zdGF0aXN0aWNzJykubGluZWFySW50ZXJwb2xhdGlvbjtjb25zdCBJbnRlcmFjdGl2ZT1yZXF1aXJlKCcuLi8uLi9nYXRoZXIvY29tcHV0ZWQvbWV0cmljcy9sYW50ZXJuLWludGVyYWN0aXZlJyk7Y29uc3QgS0JfSU5fQllURVM9MTAyNDtjb25zdCBXQVNURURfTVNfRk9SX0FWRVJBR0U9MzAwO2NvbnN0IFdBU1RFRF9NU19GT1JfUE9PUj03NTA7Y29uc3QgV0FTVEVEX01TX0ZPUl9TQ09SRV9PRl9aRVJPPTUwMDA7Y2xhc3MgVW51c2VkQnl0ZXMgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgc2NvcmVGb3JXYXN0ZWRNcyh3YXN0ZWRNcyl7aWYod2FzdGVkTXM9PT0wKXtyZXR1cm4gMTt9ZWxzZSBpZih3YXN0ZWRNczxXQVNURURfTVNfRk9SX0FWRVJBR0Upe3JldHVybiBsaW5lYXJJbnRlcnBvbGF0aW9uKDAsMSxXQVNURURfTVNfRk9SX0FWRVJBR0UsMC43NSx3YXN0ZWRNcyk7fWVsc2UgaWYod2FzdGVkTXM8V0FTVEVEX01TX0ZPUl9QT09SKXtyZXR1cm4gbGluZWFySW50ZXJwb2xhdGlvbihXQVNURURfTVNfRk9SX0FWRVJBR0UsMC43NSxXQVNURURfTVNfRk9SX1BPT1IsMC41LHdhc3RlZE1zKTt9ZWxzZXtyZXR1cm4gTWF0aC5tYXgoMCxsaW5lYXJJbnRlcnBvbGF0aW9uKFdBU1RFRF9NU19GT1JfUE9PUiwwLjUsV0FTVEVEX01TX0ZPUl9TQ09SRV9PRl9aRVJPLDAsd2FzdGVkTXMpKTt9fQpzdGF0aWMgYnl0ZXNUb01zKGJ5dGVzLG5ldHdvcmtUaHJvdWdocHV0KXtjb25zdCBtaWxsaXNlY29uZHM9Ynl0ZXMvbmV0d29ya1Rocm91Z2hwdXQqMTAwMDtyZXR1cm4gbWlsbGlzZWNvbmRzO30Kc3RhdGljIGVzdGltYXRlVHJhbnNmZXJTaXplKG5ldHdvcmtSZWNvcmQsdG90YWxCeXRlcyxyZXNvdXJjZVR5cGUsY29tcHJlc3Npb25SYXRpbz0wLjUpe2lmKCFuZXR3b3JrUmVjb3JkKXtyZXR1cm4gTWF0aC5yb3VuZCh0b3RhbEJ5dGVzKmNvbXByZXNzaW9uUmF0aW8pO31lbHNlIGlmKG5ldHdvcmtSZWNvcmQucmVzb3VyY2VUeXBlPT09cmVzb3VyY2VUeXBlKXtyZXR1cm4gbmV0d29ya1JlY29yZC50cmFuc2ZlclNpemV8fDA7fWVsc2V7Y29uc3QgdHJhbnNmZXJTaXplPW5ldHdvcmtSZWNvcmQudHJhbnNmZXJTaXplfHwwO2NvbnN0IHJlc291cmNlU2l6ZT1uZXR3b3JrUmVjb3JkLnJlc291cmNlU2l6ZTtjb25zdCBjb21wcmVzc2lvblJhdGlvPXJlc291cmNlU2l6ZSE9PXVuZGVmaW5lZD90cmFuc2ZlclNpemUvcmVzb3VyY2VTaXplOjE7cmV0dXJuIE1hdGgucm91bmQodG90YWxCeXRlcypjb21wcmVzc2lvblJhdGlvKTt9fQpzdGF0aWMgYXVkaXQoYXJ0aWZhY3RzLGNvbnRleHQpe2NvbnN0IHRyYWNlPWFydGlmYWN0cy50cmFjZXNbQXVkaXQuREVGQVVMVF9QQVNTXTtjb25zdCBkZXZ0b29sc0xvZz1hcnRpZmFjdHMuZGV2dG9vbHNMb2dzW0F1ZGl0LkRFRkFVTFRfUEFTU107Y29uc3Qgc2V0dGluZ3M9Y29udGV4dCYmY29udGV4dC5zZXR0aW5nc3x8e307Y29uc3Qgc2ltdWxhdG9yT3B0aW9ucz17ZGV2dG9vbHNMb2csc2V0dGluZ3N9O3JldHVybiBhcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9nKS50aGVuKG5ldHdvcmtSZWNvcmRzPT5Qcm9taXNlLmFsbChbdGhpcy5hdWRpdF8oYXJ0aWZhY3RzLG5ldHdvcmtSZWNvcmRzLGNvbnRleHQpLGFydGlmYWN0cy5yZXF1ZXN0UGFnZURlcGVuZGVuY3lHcmFwaCh7dHJhY2UsZGV2dG9vbHNMb2d9KSxhcnRpZmFjdHMucmVxdWVzdExvYWRTaW11bGF0b3Ioc2ltdWxhdG9yT3B0aW9ucyldKSkudGhlbigoW3Jlc3VsdCxncmFwaCxzaW11bGF0b3JdKT0+dGhpcy5jcmVhdGVBdWRpdFByb2R1Y3QocmVzdWx0LGdyYXBoLHNpbXVsYXRvcikpO30Kc3RhdGljIGNvbXB1dGVXYXN0ZVdpdGhUVElHcmFwaChyZXN1bHRzLGdyYXBoLHNpbXVsYXRvcixvcHRpb25zKXtvcHRpb25zPU9iamVjdC5hc3NpZ24oe2luY2x1ZGVMb2FkOnRydWUsbGFiZWw6dGhpcy5tZXRhLmlkfSxvcHRpb25zKTtjb25zdCBiZWZvcmVMYWJlbD1gJHtvcHRpb25zLmxhYmVsfS1iZWZvcmVgO2NvbnN0IGFmdGVyTGFiZWw9YCR7b3B0aW9ucy5sYWJlbH0tYWZ0ZXJgO2NvbnN0IHNpbXVsYXRpb25CZWZvcmVDaGFuZ2VzPXNpbXVsYXRvci5zaW11bGF0ZShncmFwaCx7bGFiZWw6YmVmb3JlTGFiZWx9KTtjb25zdCByZXN1bHRzQnlVcmw9bmV3IE1hcCgpO2Zvcihjb25zdCByZXN1bHQgb2YgcmVzdWx0cyl7cmVzdWx0c0J5VXJsLnNldChyZXN1bHQudXJsLHJlc3VsdCk7fQpjb25zdCBvcmlnaW5hbFRyYW5zZmVyU2l6ZXM9bmV3IE1hcCgpO2dyYXBoLnRyYXZlcnNlKG5vZGU9PntpZihub2RlLnR5cGUhPT0nbmV0d29yaycpcmV0dXJuO2NvbnN0IHJlc3VsdD1yZXN1bHRzQnlVcmwuZ2V0KG5vZGUucmVjb3JkLnVybCk7aWYoIXJlc3VsdClyZXR1cm47Y29uc3Qgb3JpZ2luYWw9bm9kZS5yZWNvcmQudHJhbnNmZXJTaXplO29yaWdpbmFsVHJhbnNmZXJTaXplcy5zZXQobm9kZS5yZWNvcmQucmVxdWVzdElkLG9yaWdpbmFsKTtjb25zdCB3YXN0ZWRCeXRlcz1yZXN1bHQud2FzdGVkQnl0ZXM7bm9kZS5yZWNvcmQudHJhbnNmZXJTaXplPU1hdGgubWF4KG9yaWdpbmFsLXdhc3RlZEJ5dGVzLDApO30pO2NvbnN0IHNpbXVsYXRpb25BZnRlckNoYW5nZXM9c2ltdWxhdG9yLnNpbXVsYXRlKGdyYXBoLHtsYWJlbDphZnRlckxhYmVsfSk7Z3JhcGgudHJhdmVyc2Uobm9kZT0+e2lmKG5vZGUudHlwZSE9PSduZXR3b3JrJylyZXR1cm47Y29uc3Qgb3JpZ2luYWxUcmFuc2ZlclNpemU9b3JpZ2luYWxUcmFuc2ZlclNpemVzLmdldChub2RlLnJlY29yZC5yZXF1ZXN0SWQpO2lmKG9yaWdpbmFsVHJhbnNmZXJTaXplPT09dW5kZWZpbmVkKXJldHVybjtub2RlLnJlY29yZC50cmFuc2ZlclNpemU9b3JpZ2luYWxUcmFuc2ZlclNpemU7fSk7Y29uc3Qgc2F2aW5nc09uT3ZlcmFsbExvYWQ9c2ltdWxhdGlvbkJlZm9yZUNoYW5nZXMudGltZUluTXMtc2ltdWxhdGlvbkFmdGVyQ2hhbmdlcy50aW1lSW5Ncztjb25zdCBzYXZpbmdzT25UVEk9SW50ZXJhY3RpdmUuZ2V0TGFzdExvbmdUYXNrRW5kVGltZShzaW11bGF0aW9uQmVmb3JlQ2hhbmdlcy5ub2RlVGltaW5ncyktCkludGVyYWN0aXZlLmdldExhc3RMb25nVGFza0VuZFRpbWUoc2ltdWxhdGlvbkFmdGVyQ2hhbmdlcy5ub2RlVGltaW5ncyk7bGV0IHNhdmluZ3M9c2F2aW5nc09uVFRJO2lmKG9wdGlvbnMuaW5jbHVkZUxvYWQpc2F2aW5ncz1NYXRoLm1heChzYXZpbmdzLHNhdmluZ3NPbk92ZXJhbGxMb2FkKTtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1heChzYXZpbmdzLDApLzEwKSoxMDt9CnN0YXRpYyBjcmVhdGVBdWRpdFByb2R1Y3QocmVzdWx0LGdyYXBoLHNpbXVsYXRvcil7Y29uc3QgcmVzdWx0cz1yZXN1bHQuaXRlbXMuc29ydCgoaXRlbUEsaXRlbUIpPT5pdGVtQi53YXN0ZWRCeXRlcy1pdGVtQS53YXN0ZWRCeXRlcyk7Y29uc3Qgd2FzdGVkQnl0ZXM9cmVzdWx0cy5yZWR1Y2UoKHN1bSxpdGVtKT0+c3VtK2l0ZW0ud2FzdGVkQnl0ZXMsMCk7Y29uc3Qgd2FzdGVkS2I9TWF0aC5yb3VuZCh3YXN0ZWRCeXRlcy9LQl9JTl9CWVRFUyk7Y29uc3Qgd2FzdGVkTXM9dGhpcy5jb21wdXRlV2FzdGVXaXRoVFRJR3JhcGgocmVzdWx0cyxncmFwaCxzaW11bGF0b3IpO2xldCBkaXNwbGF5VmFsdWU9cmVzdWx0LmRpc3BsYXlWYWx1ZXx8Jyc7aWYodHlwZW9mIHJlc3VsdC5kaXNwbGF5VmFsdWU9PT0ndW5kZWZpbmVkJyYmd2FzdGVkS2Ipe2Rpc3BsYXlWYWx1ZT1bJ1BvdGVudGlhbCBzYXZpbmdzIG9mICVkXHhhMEtCJyx3YXN0ZWRLYl07fQpjb25zdCBkZXRhaWxzPUF1ZGl0Lm1ha2VPcHBvcnR1bml0eURldGFpbHMocmVzdWx0LmhlYWRpbmdzLHJlc3VsdHMsd2FzdGVkTXMsd2FzdGVkQnl0ZXMpO3JldHVybntleHBsYW5hdGlvbjpyZXN1bHQuZXhwbGFuYXRpb24sd2FybmluZ3M6cmVzdWx0Lndhcm5pbmdzLGRpc3BsYXlWYWx1ZSxyYXdWYWx1ZTp3YXN0ZWRNcyxzY29yZTpVbnVzZWRCeXRlcy5zY29yZUZvcldhc3RlZE1zKHdhc3RlZE1zKSxleHRlbmRlZEluZm86e3ZhbHVlOnt3YXN0ZWRNcyx3YXN0ZWRLYixyZXN1bHRzfX0sZGV0YWlsc307fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyxuZXR3b3JrUmVjb3Jkcyxjb250ZXh0KXt0aHJvdyBuZXcgRXJyb3IoJ2F1ZGl0XyB1bmltcGxlbWVudGVkJyk7fX0KbW9kdWxlLmV4cG9ydHM9VW51c2VkQnl0ZXM7fSx7Ii4uLy4uL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2xhbnRlcm4taW50ZXJhY3RpdmUiOiIuL2dhdGhlci9jb21wdXRlZC9tZXRyaWNzL2xhbnRlcm4taW50ZXJhY3RpdmUiLCIuLi8uLi9saWIvc3RhdGlzdGljcyI6NDEsIi4uL2F1ZGl0IjoyfV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEF1ZGl0PXJlcXVpcmUoJy4uL2F1ZGl0Jyk7Y2xhc3MgTWFudWFsQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0IHBhcnRpYWxNZXRhKCl7cmV0dXJue3Njb3JlRGlzcGxheU1vZGU6QXVkaXQuU0NPUklOR19NT0RFUy5NQU5VQUwscmVxdWlyZWRBcnRpZmFjdHM6W119O30Kc3RhdGljIGF1ZGl0KCl7cmV0dXJue3Jhd1ZhbHVlOmZhbHNlfTt9fQptb2R1bGUuZXhwb3J0cz1NYW51YWxBdWRpdDt9LHsiLi4vYXVkaXQiOjJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdCcpO2NsYXNzIE11bHRpQ2hlY2tBdWRpdCBleHRlbmRzIEF1ZGl0e3N0YXRpYyBhdWRpdChhcnRpZmFjdHMpe3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hdWRpdF8oYXJ0aWZhY3RzKSkudGhlbihyZXN1bHQ9PnRoaXMuY3JlYXRlQXVkaXRQcm9kdWN0KHJlc3VsdCkpO30Kc3RhdGljIGNyZWF0ZUF1ZGl0UHJvZHVjdChyZXN1bHQpe2NvbnN0IGRldGFpbHNJdGVtPXsuLi5yZXN1bHQsLi4ucmVzdWx0Lm1hbmlmZXN0VmFsdWVzLG1hbmlmZXN0VmFsdWVzOnVuZGVmaW5lZCx3YXJuaW5nczp1bmRlZmluZWQsYWxsQ2hlY2tzOnVuZGVmaW5lZH07aWYocmVzdWx0Lm1hbmlmZXN0VmFsdWVzJiZyZXN1bHQubWFuaWZlc3RWYWx1ZXMuYWxsQ2hlY2tzKXtyZXN1bHQubWFuaWZlc3RWYWx1ZXMuYWxsQ2hlY2tzLmZvckVhY2goY2hlY2s9PntkZXRhaWxzSXRlbVtjaGVjay5pZF09Y2hlY2sucGFzc2luZzt9KTt9CmNvbnN0IGRldGFpbHM9e2l0ZW1zOltkZXRhaWxzSXRlbV19O2lmKHJlc3VsdC5mYWlsdXJlcy5sZW5ndGg+MCl7cmV0dXJue3Jhd1ZhbHVlOmZhbHNlLGV4cGxhbmF0aW9uOmBGYWlsdXJlczogJHtyZXN1bHQuZmFpbHVyZXMuam9pbignLFxuJyl9LmAsZGV0YWlsc307fQpyZXR1cm57cmF3VmFsdWU6dHJ1ZSxkZXRhaWxzLHdhcm5pbmdzOnJlc3VsdC53YXJuaW5nc307fQpzdGF0aWMgYXVkaXRfKGFydGlmYWN0cyl7dGhyb3cgbmV3IEVycm9yKCdhdWRpdF8gdW5pbXBsZW1lbnRlZCcpO319Cm1vZHVsZS5leHBvcnRzPU11bHRpQ2hlY2tBdWRpdDt9LHsiLi9hdWRpdCI6Mn1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBdWRpdD1yZXF1aXJlKCcuL2F1ZGl0Jyk7Y2xhc3MgVmlvbGF0aW9uQXVkaXQgZXh0ZW5kcyBBdWRpdHtzdGF0aWMgZ2V0VmlvbGF0aW9uUmVzdWx0cyhhcnRpZmFjdHMscGF0dGVybil7Y29uc3Qgc2Vlbj1uZXcgU2V0KCk7cmV0dXJuIGFydGlmYWN0cy5DaHJvbWVDb25zb2xlTWVzc2FnZXMubWFwKG1lc3NhZ2U9Pm1lc3NhZ2UuZW50cnkpLmZpbHRlcihlbnRyeT0+ZW50cnkudXJsJiZlbnRyeS5zb3VyY2U9PT0ndmlvbGF0aW9uJyYmcGF0dGVybi50ZXN0KGVudHJ5LnRleHQpKS5tYXAoZW50cnk9Pih7bGFiZWw6YGxpbmU6ICR7ZW50cnkubGluZU51bWJlcn1gLHVybDplbnRyeS51cmx9KSkuZmlsdGVyKGVudHJ5PT57Y29uc3Qga2V5PWAke2VudHJ5LnVybH0hJHtlbnRyeS5sYWJlbH1gO2lmKHNlZW4uaGFzKGtleSkpcmV0dXJuIGZhbHNlO3NlZW4uYWRkKGtleSk7cmV0dXJuIHRydWU7fSk7fX0KbW9kdWxlLmV4cG9ydHM9VmlvbGF0aW9uQXVkaXQ7fSx7Ii4vYXVkaXQiOjJ9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oX19kaXJuYW1lKXsndXNlIHN0cmljdCc7Y29uc3QgZGVmYXVsdENvbmZpZ1BhdGg9Jy4vZGVmYXVsdC1jb25maWcuanMnO2NvbnN0IGRlZmF1bHRDb25maWc9cmVxdWlyZSgnLi9kZWZhdWx0LWNvbmZpZy5qcycpO2NvbnN0IGZ1bGxDb25maWc9cmVxdWlyZSgnLi9mdWxsLWNvbmZpZy5qcycpO2NvbnN0IGNvbnN0YW50cz1yZXF1aXJlKCcuL2NvbnN0YW50cycpO2NvbnN0IGlzRGVlcEVxdWFsPXJlcXVpcmUoJ2xvZGFzaC5pc2VxdWFsJyk7Y29uc3QgbG9nPXJlcXVpcmUoJ2xpZ2h0aG91c2UtbG9nZ2VyJyk7Y29uc3QgcGF0aD1yZXF1aXJlKCdwYXRoJyk7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi4vYXVkaXRzL2F1ZGl0LmpzJyk7Y29uc3QgUnVubmVyPXJlcXVpcmUoJy4uL3J1bm5lci5qcycpO2Z1bmN0aW9uIHZhbGlkYXRlUGFzc2VzKHBhc3NlcyxhdWRpdHMpe2lmKCFBcnJheS5pc0FycmF5KHBhc3Nlcykpe3JldHVybjt9CmNvbnN0IHJlcXVpcmVkR2F0aGVyZXJzPUNvbmZpZy5nZXRHYXRoZXJlcnNOZWVkZWRCeUF1ZGl0cyhhdWRpdHMpO3Bhc3Nlcy5mb3JFYWNoKHBhc3M9PntwYXNzLmdhdGhlcmVycy5mb3JFYWNoKGdhdGhlcmVyRGVmbj0+e2NvbnN0IGdhdGhlcmVyPWdhdGhlcmVyRGVmbi5pbnN0YW5jZTtjb25zdCBpc0dhdGhlclJlcXVpcmVkQnlBdWRpdHM9cmVxdWlyZWRHYXRoZXJlcnMuaGFzKGdhdGhlcmVyLm5hbWUpO2lmKCFpc0dhdGhlclJlcXVpcmVkQnlBdWRpdHMpe2NvbnN0IG1zZz1gJHtnYXRoZXJlci5uYW1lfSBnYXRoZXJlciByZXF1ZXN0ZWQsIGhvd2V2ZXIgbm8gYXVkaXQgcmVxdWlyZXMgaXQuYDtsb2cud2FybignY29uZmlnJyxtc2cpO319KTt9KTtjb25zdCB1c2VkTmFtZXM9bmV3IFNldCgpO3Bhc3Nlcy5mb3JFYWNoKHBhc3M9Pntjb25zdCBwYXNzTmFtZT1wYXNzLnBhc3NOYW1lO2lmKHVzZWROYW1lcy5oYXMocGFzc05hbWUpKXt0aHJvdyBuZXcgRXJyb3IoYFBhc3NlcyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzIChyZXBlYXRlZCBwYXNzTmFtZTogJHtwYXNzTmFtZX0uYCk7fQp1c2VkTmFtZXMuYWRkKHBhc3NOYW1lKTt9KTt9CmZ1bmN0aW9uIHZhbGlkYXRlQ2F0ZWdvcmllcyhjYXRlZ29yaWVzLGF1ZGl0cyxncm91cHMpe2lmKCFjYXRlZ29yaWVzKXtyZXR1cm47fQpPYmplY3Qua2V5cyhjYXRlZ29yaWVzKS5mb3JFYWNoKGNhdGVnb3J5SWQ9PntjYXRlZ29yaWVzW2NhdGVnb3J5SWRdLmF1ZGl0UmVmcy5mb3JFYWNoKChhdWRpdFJlZixpbmRleCk9PntpZighYXVkaXRSZWYuaWQpe3Rocm93IG5ldyBFcnJvcihgbWlzc2luZyBhbiBhdWRpdCBpZCBhdCAke2NhdGVnb3J5SWR9WyR7aW5kZXh9XWApO30KY29uc3QgYXVkaXQ9YXVkaXRzJiZhdWRpdHMuZmluZChhPT5hLmltcGxlbWVudGF0aW9uLm1ldGEuaWQ9PT1hdWRpdFJlZi5pZCk7aWYoIWF1ZGl0KXt0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBmaW5kICR7YXVkaXRSZWYuaWR9IGF1ZGl0IGZvciBjYXRlZ29yeSAke2NhdGVnb3J5SWR9YCk7fQpjb25zdCBhdWRpdEltcGw9YXVkaXQuaW1wbGVtZW50YXRpb247Y29uc3QgaXNNYW51YWw9YXVkaXRJbXBsLm1ldGEuc2NvcmVEaXNwbGF5TW9kZT09PSdtYW51YWwnO2lmKGNhdGVnb3J5SWQ9PT0nYWNjZXNzaWJpbGl0eScmJiFhdWRpdFJlZi5ncm91cCYmIWlzTWFudWFsKXt0aHJvdyBuZXcgRXJyb3IoYCR7YXVkaXRSZWYuaWR9IGFjY2Vzc2liaWxpdHkgYXVkaXQgZG9lcyBub3QgaGF2ZSBhIGdyb3VwYCk7fQppZihhdWRpdFJlZi53ZWlnaHQ+MCYmaXNNYW51YWwpe3Rocm93IG5ldyBFcnJvcihgJHthdWRpdFJlZi5pZH0gaXMgbWFudWFsIGJ1dCBoYXMgYSBwb3NpdGl2ZSB3ZWlnaHRgKTt9CmlmKGF1ZGl0UmVmLmdyb3VwJiYoIWdyb3Vwc3x8IWdyb3Vwc1thdWRpdFJlZi5ncm91cF0pKXt0aHJvdyBuZXcgRXJyb3IoYCR7YXVkaXRSZWYuaWR9IHJlZmVyZW5jZXMgdW5rbm93biBncm91cCAke2F1ZGl0UmVmLmdyb3VwfWApO319KTt9KTt9CmZ1bmN0aW9uIGFzc2VydFZhbGlkQXVkaXQoYXVkaXREZWZpbml0aW9uLGF1ZGl0UGF0aCl7Y29uc3QgYXVkaXROYW1lPWF1ZGl0UGF0aHx8YXVkaXREZWZpbml0aW9uJiZhdWRpdERlZmluaXRpb24ubWV0YSYmYXVkaXREZWZpbml0aW9uLm1ldGEuaWQ7aWYodHlwZW9mIGF1ZGl0RGVmaW5pdGlvbi5hdWRpdCE9PSdmdW5jdGlvbid8fGF1ZGl0RGVmaW5pdGlvbi5hdWRpdD09PUF1ZGl0LmF1ZGl0KXt0aHJvdyBuZXcgRXJyb3IoYCR7YXVkaXROYW1lfSBoYXMgbm8gYXVkaXQoKSBtZXRob2QuYCk7fQppZih0eXBlb2YgYXVkaXREZWZpbml0aW9uLm1ldGEuaWQhPT0nc3RyaW5nJyl7dGhyb3cgbmV3IEVycm9yKGAke2F1ZGl0TmFtZX0gaGFzIG5vIG1ldGEuaWQgcHJvcGVydHksIG9yIHRoZSBwcm9wZXJ0eSBpcyBub3QgYSBzdHJpbmcuYCk7fQppZih0eXBlb2YgYXVkaXREZWZpbml0aW9uLm1ldGEudGl0bGUhPT0nc3RyaW5nJyl7dGhyb3cgbmV3IEVycm9yKGAke2F1ZGl0TmFtZX0gaGFzIG5vIG1ldGEudGl0bGUgcHJvcGVydHksIG9yIHRoZSBwcm9wZXJ0eSBpcyBub3QgYSBzdHJpbmcuYCk7fQppZih0eXBlb2YgYXVkaXREZWZpbml0aW9uLm1ldGEuZmFpbHVyZVRpdGxlIT09J3N0cmluZycmJmF1ZGl0RGVmaW5pdGlvbi5tZXRhLnNjb3JlRGlzcGxheU1vZGU9PT1BdWRpdC5TQ09SSU5HX01PREVTLkJJTkFSWSl7dGhyb3cgbmV3IEVycm9yKGAke2F1ZGl0TmFtZX0gaGFzIG5vIGZhaWx1cmVUaXRsZSBhbmQgc2hvdWxkLmApO30KaWYodHlwZW9mIGF1ZGl0RGVmaW5pdGlvbi5tZXRhLmRlc2NyaXB0aW9uIT09J3N0cmluZycpe3Rocm93IG5ldyBFcnJvcihgJHthdWRpdE5hbWV9IGhhcyBubyBtZXRhLmRlc2NyaXB0aW9uIHByb3BlcnR5LCBvciB0aGUgcHJvcGVydHkgaXMgbm90IGEgc3RyaW5nLmApO31lbHNlIGlmKGF1ZGl0RGVmaW5pdGlvbi5tZXRhLmRlc2NyaXB0aW9uPT09Jycpe3Rocm93IG5ldyBFcnJvcihgJHthdWRpdE5hbWV9IGhhcyBhbiBlbXB0eSBtZXRhLmRlc2NyaXB0aW9uIHN0cmluZy4gUGxlYXNlIGFkZCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgVUkuYCk7fQppZighQXJyYXkuaXNBcnJheShhdWRpdERlZmluaXRpb24ubWV0YS5yZXF1aXJlZEFydGlmYWN0cykpe3Rocm93IG5ldyBFcnJvcihgJHthdWRpdE5hbWV9IGhhcyBubyBtZXRhLnJlcXVpcmVkQXJ0aWZhY3RzIHByb3BlcnR5LCBvciB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5LmApO319CmZ1bmN0aW9uIGFzc2VydFZhbGlkR2F0aGVyZXIoZ2F0aGVyZXJJbnN0YW5jZSxnYXRoZXJlck5hbWUpe2dhdGhlcmVyTmFtZT1nYXRoZXJlck5hbWV8fGdhdGhlcmVySW5zdGFuY2UubmFtZXx8J2dhdGhlcmVyJztpZih0eXBlb2YgZ2F0aGVyZXJJbnN0YW5jZS5iZWZvcmVQYXNzIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IEVycm9yKGAke2dhdGhlcmVyTmFtZX0gaGFzIG5vIGJlZm9yZVBhc3MoKSBtZXRob2QuYCk7fQppZih0eXBlb2YgZ2F0aGVyZXJJbnN0YW5jZS5wYXNzIT09J2Z1bmN0aW9uJyl7dGhyb3cgbmV3IEVycm9yKGAke2dhdGhlcmVyTmFtZX0gaGFzIG5vIHBhc3MoKSBtZXRob2QuYCk7fQppZih0eXBlb2YgZ2F0aGVyZXJJbnN0YW5jZS5hZnRlclBhc3MhPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgRXJyb3IoYCR7Z2F0aGVyZXJOYW1lfSBoYXMgbm8gYWZ0ZXJQYXNzKCkgbWV0aG9kLmApO319CmZ1bmN0aW9uIGNsZWFuRmxhZ3NGb3JTZXR0aW5ncyhmbGFncz17fSl7Y29uc3Qgc2V0dGluZ3M9e307Zm9yKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmbGFncykpe2lmKHR5cGVvZiBjb25zdGFudHMuZGVmYXVsdFNldHRpbmdzW2tleV0hPT0ndW5kZWZpbmVkJyl7Y29uc3Qgc2FmZWtleT1rZXk7c2V0dGluZ3Nbc2FmZWtleV09ZmxhZ3Nbc2FmZWtleV07fX0KcmV0dXJuIHNldHRpbmdzO30KZnVuY3Rpb24gX21lcmdlKGJhc2UsZXh0ZW5zaW9uLG92ZXJ3cml0ZUFycmF5cz1mYWxzZSl7aWYodHlwZW9mIGJhc2U9PT0ndW5kZWZpbmVkJ3x8YmFzZT09PW51bGwpe3JldHVybiBleHRlbnNpb247fWVsc2UgaWYodHlwZW9mIGV4dGVuc2lvbj09PSd1bmRlZmluZWQnKXtyZXR1cm4gYmFzZTt9ZWxzZSBpZihBcnJheS5pc0FycmF5KGV4dGVuc2lvbikpe2lmKG92ZXJ3cml0ZUFycmF5cylyZXR1cm4gZXh0ZW5zaW9uO2lmKCFBcnJheS5pc0FycmF5KGJhc2UpKXRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGFycmF5IGJ1dCBnb3QgJHt0eXBlb2YgYmFzZX1gKTtjb25zdCBtZXJnZWQ9YmFzZS5zbGljZSgpO2V4dGVuc2lvbi5mb3JFYWNoKGl0ZW09PntpZighbWVyZ2VkLnNvbWUoY2FuZGlkYXRlPT5pc0RlZXBFcXVhbChjYW5kaWRhdGUsaXRlbSkpKW1lcmdlZC5wdXNoKGl0ZW0pO30pO3JldHVybiBtZXJnZWQ7fWVsc2UgaWYodHlwZW9mIGV4dGVuc2lvbj09PSdvYmplY3QnKXtpZih0eXBlb2YgYmFzZSE9PSdvYmplY3QnKXRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIG9iamVjdCBidXQgZ290ICR7dHlwZW9mIGJhc2V9YCk7aWYoQXJyYXkuaXNBcnJheShiYXNlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCBBcnJheScpO09iamVjdC5rZXlzKGV4dGVuc2lvbikuZm9yRWFjaChrZXk9Pntjb25zdCBsb2NhbE92ZXJ3cml0ZUFycmF5cz1vdmVyd3JpdGVBcnJheXN8fGtleT09PSdzZXR0aW5ncycmJnR5cGVvZiBiYXNlW2tleV09PT0nb2JqZWN0JztiYXNlW2tleV09X21lcmdlKGJhc2Vba2V5XSxleHRlbnNpb25ba2V5XSxsb2NhbE92ZXJ3cml0ZUFycmF5cyk7fSk7cmV0dXJuIGJhc2U7fQpyZXR1cm4gZXh0ZW5zaW9uO30KY29uc3QgbWVyZ2U9X21lcmdlO2Z1bmN0aW9uIGNsb25lQXJyYXlXaXRoUGx1Z2luU2FmZXR5KGFycmF5KXtyZXR1cm4gYXJyYXkubWFwKGl0ZW09PntpZih0eXBlb2YgaXRlbT09PSdvYmplY3QnKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihpdGVtKSksaXRlbSk7fQpyZXR1cm4gaXRlbTt9KTt9CmZ1bmN0aW9uIGRlZXBDbG9uZShqc29uKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSk7fQpmdW5jdGlvbiBkZWVwQ2xvbmVDb25maWdKc29uKGpzb24pe2NvbnN0IGNsb25lZD1kZWVwQ2xvbmUoanNvbik7aWYoQXJyYXkuaXNBcnJheShjbG9uZWQucGFzc2VzKSYmQXJyYXkuaXNBcnJheShqc29uLnBhc3Nlcykpe2ZvcihsZXQgaT0wO2k8Y2xvbmVkLnBhc3Nlcy5sZW5ndGg7aSsrKXtjb25zdCBwYXNzPWNsb25lZC5wYXNzZXNbaV07cGFzcy5nYXRoZXJlcnM9Y2xvbmVBcnJheVdpdGhQbHVnaW5TYWZldHkoanNvbi5wYXNzZXNbaV0uZ2F0aGVyZXJzfHxbXSk7fX0KaWYoQXJyYXkuaXNBcnJheShqc29uLmF1ZGl0cykpe2Nsb25lZC5hdWRpdHM9Y2xvbmVBcnJheVdpdGhQbHVnaW5TYWZldHkoanNvbi5hdWRpdHMpO30KcmV0dXJuIGNsb25lZDt9CmNvbnN0IG1lcmdlT3B0aW9uc09mSXRlbXM9ZnVuY3Rpb24oaXRlbXMpe2NvbnN0IG1lcmdlZEl0ZW1zPVtdO2Zvcihjb25zdCBpdGVtIG9mIGl0ZW1zKXtjb25zdCBleGlzdGluZ0l0ZW09aXRlbS5wYXRoJiZtZXJnZWRJdGVtcy5maW5kKGNhbmRpZGF0ZT0+Y2FuZGlkYXRlLnBhdGg9PT1pdGVtLnBhdGgpO2lmKCFleGlzdGluZ0l0ZW0pe21lcmdlZEl0ZW1zLnB1c2goaXRlbSk7Y29udGludWU7fQpleGlzdGluZ0l0ZW0ub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGV4aXN0aW5nSXRlbS5vcHRpb25zLGl0ZW0ub3B0aW9ucyk7fQpyZXR1cm4gbWVyZ2VkSXRlbXM7fTtjbGFzcyBDb25maWd7Y29uc3RydWN0b3IoY29uZmlnSlNPTixmbGFncyl7bGV0IGNvbmZpZ1BhdGg9ZmxhZ3MmJmZsYWdzLmNvbmZpZ1BhdGg7aWYoIWNvbmZpZ0pTT04pe2NvbmZpZ0pTT049ZGVmYXVsdENvbmZpZztjb25maWdQYXRoPXBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsZGVmYXVsdENvbmZpZ1BhdGgpO30KaWYoY29uZmlnUGF0aCYmIXBhdGguaXNBYnNvbHV0ZShjb25maWdQYXRoKSl7dGhyb3cgbmV3IEVycm9yKCdjb25maWdQYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aC4nKTt9CmNvbmZpZ0pTT049ZGVlcENsb25lQ29uZmlnSnNvbihjb25maWdKU09OKTtpZihjb25maWdKU09OLmV4dGVuZHM9PT0nbGlnaHRob3VzZTpmdWxsJyl7Y29uc3QgZXhwbG9kZWRGdWxsQ29uZmlnPUNvbmZpZy5leHRlbmRDb25maWdKU09OKGRlZXBDbG9uZUNvbmZpZ0pzb24oZGVmYXVsdENvbmZpZyksZGVlcENsb25lQ29uZmlnSnNvbihmdWxsQ29uZmlnKSk7Y29uZmlnSlNPTj1Db25maWcuZXh0ZW5kQ29uZmlnSlNPTihleHBsb2RlZEZ1bGxDb25maWcsY29uZmlnSlNPTik7fWVsc2UgaWYoY29uZmlnSlNPTi5leHRlbmRzKXtjb25maWdKU09OPUNvbmZpZy5leHRlbmRDb25maWdKU09OKGRlZXBDbG9uZUNvbmZpZ0pzb24oZGVmYXVsdENvbmZpZyksY29uZmlnSlNPTik7fQpjb25zdCBjb25maWdEaXI9Y29uZmlnUGF0aD9wYXRoLmRpcm5hbWUoY29uZmlnUGF0aCk6dW5kZWZpbmVkO2NvbnN0IHNldHRpbmdzPUNvbmZpZy5pbml0U2V0dGluZ3MoY29uZmlnSlNPTi5zZXR0aW5ncyxmbGFncyk7Y29uc3QgcGFzc2VzV2l0aERlZmF1bHRzPUNvbmZpZy5hdWdtZW50UGFzc2VzV2l0aERlZmF1bHRzKGNvbmZpZ0pTT04ucGFzc2VzKTtDb25maWcuYWRqdXN0RGVmYXVsdFBhc3NGb3JUaHJvdHRsaW5nKHNldHRpbmdzLHBhc3Nlc1dpdGhEZWZhdWx0cyk7Y29uc3QgcGFzc2VzPUNvbmZpZy5yZXF1aXJlR2F0aGVyZXJzKHBhc3Nlc1dpdGhEZWZhdWx0cyxjb25maWdEaXIpO3RoaXMuc2V0dGluZ3M9c2V0dGluZ3M7dGhpcy5wYXNzZXM9cGFzc2VzO3RoaXMuYXVkaXRzPUNvbmZpZy5yZXF1aXJlQXVkaXRzKGNvbmZpZ0pTT04uYXVkaXRzLGNvbmZpZ0Rpcik7dGhpcy5jYXRlZ29yaWVzPWNvbmZpZ0pTT04uY2F0ZWdvcmllc3x8bnVsbDt0aGlzLmdyb3Vwcz1jb25maWdKU09OLmdyb3Vwc3x8bnVsbDtDb25maWcuZmlsdGVyQ29uZmlnSWZOZWVkZWQodGhpcyk7dmFsaWRhdGVQYXNzZXModGhpcy5wYXNzZXMsdGhpcy5hdWRpdHMpO3ZhbGlkYXRlQ2F0ZWdvcmllcyh0aGlzLmNhdGVnb3JpZXMsdGhpcy5hdWRpdHMsdGhpcy5ncm91cHMpO2NvbnN0IGNvbmZpZ0pzb249dGhpczt9CnN0YXRpYyBleHRlbmRDb25maWdKU09OKGJhc2VKU09OLGV4dGVuZEpTT04pe2lmKGV4dGVuZEpTT04ucGFzc2VzJiZiYXNlSlNPTi5wYXNzZXMpe2Zvcihjb25zdCBwYXNzIG9mIGV4dGVuZEpTT04ucGFzc2VzKXtjb25zdCBwYXNzTmFtZT1wYXNzLnBhc3NOYW1lfHxjb25zdGFudHMuZGVmYXVsdFBhc3NDb25maWcucGFzc05hbWU7Y29uc3QgYmFzZVBhc3M9YmFzZUpTT04ucGFzc2VzLmZpbmQoY2FuZGlkYXRlPT5jYW5kaWRhdGUucGFzc05hbWU9PT1wYXNzTmFtZSk7aWYoIWJhc2VQYXNzKXtiYXNlSlNPTi5wYXNzZXMucHVzaChwYXNzKTt9ZWxzZXttZXJnZShiYXNlUGFzcyxwYXNzKTt9fQpkZWxldGUgZXh0ZW5kSlNPTi5wYXNzZXM7fQpyZXR1cm4gbWVyZ2UoYmFzZUpTT04sZXh0ZW5kSlNPTik7fQpzdGF0aWMgYXVnbWVudFBhc3Nlc1dpdGhEZWZhdWx0cyhwYXNzZXMpe2lmKCFwYXNzZXMpe3JldHVybiBudWxsO30KY29uc3R7ZGVmYXVsdFBhc3NDb25maWd9PWNvbnN0YW50cztyZXR1cm4gcGFzc2VzLm1hcChwYXNzPT5tZXJnZShkZWVwQ2xvbmUoZGVmYXVsdFBhc3NDb25maWcpLHBhc3MpKTt9CnN0YXRpYyBpbml0U2V0dGluZ3Moc2V0dGluZ3M9e30sZmxhZ3Mpe2NvbnN0e2RlZmF1bHRTZXR0aW5nc309Y29uc3RhbnRzO2NvbnN0IHNldHRpbmdXaXRoRGVmYXVsdHM9bWVyZ2UoZGVlcENsb25lKGRlZmF1bHRTZXR0aW5ncyksc2V0dGluZ3MsdHJ1ZSk7Y29uc3Qgc2V0dGluZ3NXaXRoRmxhZ3M9bWVyZ2Uoc2V0dGluZ1dpdGhEZWZhdWx0c3x8e30sY2xlYW5GbGFnc0ZvclNldHRpbmdzKGZsYWdzKSx0cnVlKTtyZXR1cm4gc2V0dGluZ3NXaXRoRmxhZ3M7fQpzdGF0aWMgZXhwYW5kQXVkaXRTaG9ydGhhbmQoYXVkaXRzKXtpZighYXVkaXRzKXtyZXR1cm4gbnVsbDt9CmNvbnN0IG5ld0F1ZGl0cz1hdWRpdHMubWFwKGF1ZGl0PT57aWYodHlwZW9mIGF1ZGl0PT09J3N0cmluZycpe3JldHVybntwYXRoOmF1ZGl0LG9wdGlvbnM6e319O31lbHNlIGlmKCdpbXBsZW1lbnRhdGlvbidpbiBhdWRpdCYmdHlwZW9mIGF1ZGl0LmltcGxlbWVudGF0aW9uLmF1ZGl0PT09J2Z1bmN0aW9uJyl7cmV0dXJuIGF1ZGl0O31lbHNlIGlmKCdwYXRoJ2luIGF1ZGl0JiZ0eXBlb2YgYXVkaXQucGF0aD09PSdzdHJpbmcnKXtyZXR1cm4gYXVkaXQ7fWVsc2UgaWYoJ2F1ZGl0J2luIGF1ZGl0JiZ0eXBlb2YgYXVkaXQuYXVkaXQ9PT0nZnVuY3Rpb24nKXtyZXR1cm57aW1wbGVtZW50YXRpb246YXVkaXQsb3B0aW9uczp7fX07fWVsc2V7dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEF1ZGl0IHR5cGUgJytKU09OLnN0cmluZ2lmeShhdWRpdCkpO319KTtyZXR1cm4gbmV3QXVkaXRzO30Kc3RhdGljIGV4cGFuZEdhdGhlcmVyU2hvcnRoYW5kKGdhdGhlcmVycyl7Y29uc3QgZXhwYW5kZWQ9Z2F0aGVyZXJzLm1hcChnYXRoZXJlcj0+e2lmKHR5cGVvZiBnYXRoZXJlcj09PSdzdHJpbmcnKXtyZXR1cm57cGF0aDpnYXRoZXJlcixvcHRpb25zOnt9fTt9ZWxzZSBpZignaW1wbGVtZW50YXRpb24naW4gZ2F0aGVyZXJ8fCdpbnN0YW5jZSdpbiBnYXRoZXJlcil7cmV0dXJuIGdhdGhlcmVyO31lbHNlIGlmKCdwYXRoJ2luIGdhdGhlcmVyKXtpZih0eXBlb2YgZ2F0aGVyZXIucGF0aCE9PSdzdHJpbmcnKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgR2F0aGVyZXIgdHlwZSAnK0pTT04uc3RyaW5naWZ5KGdhdGhlcmVyKSk7fQpyZXR1cm4gZ2F0aGVyZXI7fWVsc2UgaWYodHlwZW9mIGdhdGhlcmVyPT09J2Z1bmN0aW9uJyl7cmV0dXJue2ltcGxlbWVudGF0aW9uOmdhdGhlcmVyLG9wdGlvbnM6e319O31lbHNlIGlmKGdhdGhlcmVyJiZ0eXBlb2YgZ2F0aGVyZXIuYmVmb3JlUGFzcz09PSdmdW5jdGlvbicpe3JldHVybntpbnN0YW5jZTpnYXRoZXJlcixvcHRpb25zOnt9fTt9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgR2F0aGVyZXIgdHlwZSAnK0pTT04uc3RyaW5naWZ5KGdhdGhlcmVyKSk7fX0pO3JldHVybiBleHBhbmRlZDt9CnN0YXRpYyBhZGp1c3REZWZhdWx0UGFzc0ZvclRocm90dGxpbmcoc2V0dGluZ3MscGFzc2VzKXtpZighcGFzc2VzfHxzZXR0aW5ncy50aHJvdHRsaW5nTWV0aG9kIT09J2RldnRvb2xzJyYmc2V0dGluZ3MudGhyb3R0bGluZ01ldGhvZCE9PSdwcm92aWRlZCcpe3JldHVybjt9CmNvbnN0IGRlZmF1bHRQYXNzPXBhc3Nlcy5maW5kKHBhc3M9PnBhc3MucGFzc05hbWU9PT0nZGVmYXVsdFBhc3MnKTtpZighZGVmYXVsdFBhc3MpcmV0dXJuO2NvbnN0IG92ZXJyaWRlcz1jb25zdGFudHMubm9uU2ltdWxhdGVkUGFzc0NvbmZpZ092ZXJyaWRlcztkZWZhdWx0UGFzcy5wYXVzZUFmdGVyTG9hZE1zPU1hdGgubWF4KG92ZXJyaWRlcy5wYXVzZUFmdGVyTG9hZE1zLGRlZmF1bHRQYXNzLnBhdXNlQWZ0ZXJMb2FkTXMpO2RlZmF1bHRQYXNzLmNwdVF1aWV0VGhyZXNob2xkTXM9TWF0aC5tYXgob3ZlcnJpZGVzLmNwdVF1aWV0VGhyZXNob2xkTXMsZGVmYXVsdFBhc3MuY3B1UXVpZXRUaHJlc2hvbGRNcyk7ZGVmYXVsdFBhc3MubmV0d29ya1F1aWV0VGhyZXNob2xkTXM9TWF0aC5tYXgob3ZlcnJpZGVzLm5ldHdvcmtRdWlldFRocmVzaG9sZE1zLGRlZmF1bHRQYXNzLm5ldHdvcmtRdWlldFRocmVzaG9sZE1zKTt9CnN0YXRpYyBmaWx0ZXJDb25maWdJZk5lZWRlZChjb25maWcpe2NvbnN0IHNldHRpbmdzPWNvbmZpZy5zZXR0aW5ncztpZighc2V0dGluZ3Mub25seUNhdGVnb3JpZXMmJiFzZXR0aW5ncy5vbmx5QXVkaXRzJiYhc2V0dGluZ3Muc2tpcEF1ZGl0cyl7cmV0dXJuO30KY29uc3R7Y2F0ZWdvcmllcyxyZXF1ZXN0ZWRBdWRpdE5hbWVzfT1Db25maWcuZmlsdGVyQ2F0ZWdvcmllc0FuZEF1ZGl0cyhjb25maWcuY2F0ZWdvcmllcyxzZXR0aW5ncyk7Y29uc3QgYXVkaXRzPWNvbmZpZy5hdWRpdHMmJmNvbmZpZy5hdWRpdHMuZmlsdGVyKGF1ZGl0RGVmbj0+cmVxdWVzdGVkQXVkaXROYW1lcy5oYXMoYXVkaXREZWZuLmltcGxlbWVudGF0aW9uLm1ldGEuaWQpKTtjb25zdCByZXF1aXJlZEdhdGhlcmVySWRzPUNvbmZpZy5nZXRHYXRoZXJlcnNOZWVkZWRCeUF1ZGl0cyhhdWRpdHMpO2NvbnN0IHBhc3Nlcz1Db25maWcuZ2VuZXJhdGVQYXNzZXNOZWVkZWRCeUdhdGhlcmVycyhjb25maWcucGFzc2VzLHJlcXVpcmVkR2F0aGVyZXJJZHMpO2NvbmZpZy5jYXRlZ29yaWVzPWNhdGVnb3JpZXM7Y29uZmlnLmF1ZGl0cz1hdWRpdHM7Y29uZmlnLnBhc3Nlcz1wYXNzZXM7fQpzdGF0aWMgZmlsdGVyQ2F0ZWdvcmllc0FuZEF1ZGl0cyhvbGRDYXRlZ29yaWVzLHNldHRpbmdzKXtpZighb2xkQ2F0ZWdvcmllcyl7cmV0dXJue2NhdGVnb3JpZXM6bnVsbCxyZXF1ZXN0ZWRBdWRpdE5hbWVzOm5ldyBTZXQoKX07fQppZihzZXR0aW5ncy5vbmx5QXVkaXRzJiZzZXR0aW5ncy5za2lwQXVkaXRzKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgYm90aCBza2lwQXVkaXRzIGFuZCBvbmx5QXVkaXRzJyk7fQpjb25zdCBjYXRlZ29yaWVzPXt9O2NvbnN0IGZpbHRlckJ5SW5jbHVkZWRDYXRlZ29yeT0hIXNldHRpbmdzLm9ubHlDYXRlZ29yaWVzO2NvbnN0IGZpbHRlckJ5SW5jbHVkZWRBdWRpdD0hIXNldHRpbmdzLm9ubHlBdWRpdHM7Y29uc3QgY2F0ZWdvcnlJZHM9c2V0dGluZ3Mub25seUNhdGVnb3JpZXN8fFtdO2NvbnN0IGF1ZGl0SWRzPXNldHRpbmdzLm9ubHlBdWRpdHN8fFtdO2NvbnN0IHNraXBBdWRpdElkcz1zZXR0aW5ncy5za2lwQXVkaXRzfHxbXTtjYXRlZ29yeUlkcy5mb3JFYWNoKGNhdGVnb3J5SWQ9PntpZighb2xkQ2F0ZWdvcmllc1tjYXRlZ29yeUlkXSl7bG9nLndhcm4oJ2NvbmZpZycsYHVucmVjb2duaXplZCBjYXRlZ29yeSBpbiAnb25seUNhdGVnb3JpZXMnOiAke2NhdGVnb3J5SWR9YCk7fX0pO2NvbnN0IGF1ZGl0c1RvVmFsaWRhdGU9bmV3IFNldChhdWRpdElkcy5jb25jYXQoc2tpcEF1ZGl0SWRzKSk7Zm9yKGNvbnN0IGF1ZGl0SWQgb2YgYXVkaXRzVG9WYWxpZGF0ZSl7Y29uc3QgZm91bmRDYXRlZ29yeT1PYmplY3Qua2V5cyhvbGRDYXRlZ29yaWVzKS5maW5kKGNhdGVnb3J5SWQ9Pntjb25zdCBhdWRpdFJlZnM9b2xkQ2F0ZWdvcmllc1tjYXRlZ29yeUlkXS5hdWRpdFJlZnM7cmV0dXJuISFhdWRpdFJlZnMuZmluZChjYW5kaWRhdGU9PmNhbmRpZGF0ZS5pZD09PWF1ZGl0SWQpO30pO2lmKCFmb3VuZENhdGVnb3J5KXtjb25zdCBwYXJlbnRLZXlOYW1lPXNraXBBdWRpdElkcy5pbmNsdWRlcyhhdWRpdElkKT8nc2tpcEF1ZGl0cyc6J29ubHlBdWRpdHMnO2xvZy53YXJuKCdjb25maWcnLGB1bnJlY29nbml6ZWQgYXVkaXQgaW4gJyR7cGFyZW50S2V5TmFtZX0nOiAke2F1ZGl0SWR9YCk7fWVsc2UgaWYoYXVkaXRJZHMuaW5jbHVkZXMoYXVkaXRJZCkmJmNhdGVnb3J5SWRzLmluY2x1ZGVzKGZvdW5kQ2F0ZWdvcnkpKXtsb2cud2FybignY29uZmlnJyxgJHthdWRpdElkfSBpbiAnb25seUF1ZGl0cycgaXMgYWxyZWFkeSBpbmNsdWRlZCBieSBgK2Ake2ZvdW5kQ2F0ZWdvcnl9IGluICdvbmx5Q2F0ZWdvcmllcydgKTt9fQpjb25zdCBpbmNsdWRlZEF1ZGl0cz1uZXcgU2V0KGF1ZGl0SWRzKTtza2lwQXVkaXRJZHMuZm9yRWFjaChpZD0+aW5jbHVkZWRBdWRpdHMuZGVsZXRlKGlkKSk7T2JqZWN0LmtleXMob2xkQ2F0ZWdvcmllcykuZm9yRWFjaChjYXRlZ29yeUlkPT57Y29uc3QgY2F0ZWdvcnk9ZGVlcENsb25lKG9sZENhdGVnb3JpZXNbY2F0ZWdvcnlJZF0pO2lmKGZpbHRlckJ5SW5jbHVkZWRDYXRlZ29yeSYmZmlsdGVyQnlJbmNsdWRlZEF1ZGl0KXtpZighY2F0ZWdvcnlJZHMuaW5jbHVkZXMoY2F0ZWdvcnlJZCkpe2NhdGVnb3J5LmF1ZGl0UmVmcz1jYXRlZ29yeS5hdWRpdFJlZnMuZmlsdGVyKGF1ZGl0PT5hdWRpdElkcy5pbmNsdWRlcyhhdWRpdC5pZCkpO319ZWxzZSBpZihmaWx0ZXJCeUluY2x1ZGVkQ2F0ZWdvcnkpe2lmKCFjYXRlZ29yeUlkcy5pbmNsdWRlcyhjYXRlZ29yeUlkKSl7cmV0dXJuO319ZWxzZSBpZihmaWx0ZXJCeUluY2x1ZGVkQXVkaXQpe2NhdGVnb3J5LmF1ZGl0UmVmcz1jYXRlZ29yeS5hdWRpdFJlZnMuZmlsdGVyKGF1ZGl0PT5hdWRpdElkcy5pbmNsdWRlcyhhdWRpdC5pZCkpO30KY2F0ZWdvcnkuYXVkaXRSZWZzPWNhdGVnb3J5LmF1ZGl0UmVmcy5maWx0ZXIoYXVkaXQ9PiFza2lwQXVkaXRJZHMuaW5jbHVkZXMoYXVkaXQuaWQpKTtpZihjYXRlZ29yeS5hdWRpdFJlZnMubGVuZ3RoKXtjYXRlZ29yaWVzW2NhdGVnb3J5SWRdPWNhdGVnb3J5O2NhdGVnb3J5LmF1ZGl0UmVmcy5mb3JFYWNoKGF1ZGl0PT5pbmNsdWRlZEF1ZGl0cy5hZGQoYXVkaXQuaWQpKTt9fSk7cmV0dXJue2NhdGVnb3JpZXMscmVxdWVzdGVkQXVkaXROYW1lczppbmNsdWRlZEF1ZGl0c307fQpzdGF0aWMgZ2V0Q2F0ZWdvcmllcyhjb25maWcpe2NvbnN0IGNhdGVnb3JpZXM9Y29uZmlnLmNhdGVnb3JpZXM7aWYoIWNhdGVnb3JpZXMpe3JldHVybltdO30KcmV0dXJuIE9iamVjdC5rZXlzKGNhdGVnb3JpZXMpLm1hcChpZD0+e2NvbnN0IHRpdGxlPWNhdGVnb3JpZXNbaWRdLnRpdGxlO3JldHVybntpZCx0aXRsZX07fSk7fQpzdGF0aWMgZ2V0R2F0aGVyZXJzTmVlZGVkQnlBdWRpdHMoYXVkaXRzKXtpZighYXVkaXRzKXtyZXR1cm4gbmV3IFNldCgpO30KcmV0dXJuIGF1ZGl0cy5yZWR1Y2UoKGxpc3QsYXVkaXREZWZuKT0+e2F1ZGl0RGVmbi5pbXBsZW1lbnRhdGlvbi5tZXRhLnJlcXVpcmVkQXJ0aWZhY3RzLmZvckVhY2goYXJ0aWZhY3Q9Pmxpc3QuYWRkKGFydGlmYWN0KSk7cmV0dXJuIGxpc3Q7fSxuZXcgU2V0KCkpO30Kc3RhdGljIGdlbmVyYXRlUGFzc2VzTmVlZGVkQnlHYXRoZXJlcnMocGFzc2VzLHJlcXVpcmVkR2F0aGVyZXJzKXtpZighcGFzc2VzKXtyZXR1cm4gbnVsbDt9CmNvbnN0IGF1ZGl0c05lZWRUcmFjZT1yZXF1aXJlZEdhdGhlcmVycy5oYXMoJ3RyYWNlcycpO2NvbnN0IGZpbHRlcmVkUGFzc2VzPXBhc3Nlcy5tYXAocGFzcz0+e3Bhc3MuZ2F0aGVyZXJzPXBhc3MuZ2F0aGVyZXJzLmZpbHRlcihnYXRoZXJlckRlZm49Pntjb25zdCBnYXRoZXJlcj1nYXRoZXJlckRlZm4uaW5zdGFuY2U7cmV0dXJuIHJlcXVpcmVkR2F0aGVyZXJzLmhhcyhnYXRoZXJlci5uYW1lKTt9KTtpZihwYXNzLnJlY29yZFRyYWNlJiYhYXVkaXRzTmVlZFRyYWNlKXtjb25zdCBwYXNzTmFtZT1wYXNzLnBhc3NOYW1lfHwndW5rbm93biBwYXNzJztsb2cud2FybignY29uZmlnJyxgVHJhY2Ugbm90IHJlcXVlc3RlZCBieSBhbiBhdWRpdCwgZHJvcHBpbmcgdHJhY2UgaW4gJHtwYXNzTmFtZX1gKTtwYXNzLnJlY29yZFRyYWNlPWZhbHNlO30KcmV0dXJuIHBhc3M7fSkuZmlsdGVyKHBhc3M9PntpZihwYXNzLnJlY29yZFRyYWNlKXJldHVybiB0cnVlO2lmKHBhc3MucGFzc05hbWU9PT0nZGVmYXVsdFBhc3MnKXJldHVybiB0cnVlO3JldHVybiBwYXNzLmdhdGhlcmVycy5sZW5ndGg+MDt9KTtyZXR1cm4gZmlsdGVyZWRQYXNzZXM7fQpzdGF0aWMgcmVxdWlyZUF1ZGl0cyhhdWRpdHMsY29uZmlnUGF0aCl7Y29uc3QgZXhwYW5kZWRBdWRpdHM9Q29uZmlnLmV4cGFuZEF1ZGl0U2hvcnRoYW5kKGF1ZGl0cyk7aWYoIWV4cGFuZGVkQXVkaXRzKXtyZXR1cm4gbnVsbDt9CmNvbnN0IGNvcmVMaXN0PVJ1bm5lci5nZXRBdWRpdExpc3QoKTtjb25zdCBhdWRpdERlZm5zPWV4cGFuZGVkQXVkaXRzLm1hcChhdWRpdD0+e2xldCBpbXBsZW1lbnRhdGlvbjtpZignaW1wbGVtZW50YXRpb24naW4gYXVkaXQpe2ltcGxlbWVudGF0aW9uPWF1ZGl0LmltcGxlbWVudGF0aW9uO31lbHNle2NvbnN0IGF1ZGl0UGF0aEpzPWAke2F1ZGl0LnBhdGh9LmpzYDtjb25zdCBjb3JlQXVkaXQ9Y29yZUxpc3QuZmluZChhPT5hPT09YXVkaXRQYXRoSnMpO2xldCByZXF1aXJlUGF0aD1gLi4vYXVkaXRzLyR7YXVkaXQucGF0aH1gO2lmKCFjb3JlQXVkaXQpe3JlcXVpcmVQYXRoPVJ1bm5lci5yZXNvbHZlUGx1Z2luKGF1ZGl0LnBhdGgsY29uZmlnUGF0aCwnYXVkaXQnKTt9CmltcGxlbWVudGF0aW9uPXJlcXVpcmUocmVxdWlyZVBhdGgpO30KcmV0dXJue2ltcGxlbWVudGF0aW9uLHBhdGg6YXVkaXQucGF0aCxvcHRpb25zOmF1ZGl0Lm9wdGlvbnN8fHt9fTt9KTtjb25zdCBtZXJnZWRBdWRpdERlZm5zPW1lcmdlT3B0aW9uc09mSXRlbXMoYXVkaXREZWZucyk7bWVyZ2VkQXVkaXREZWZucy5mb3JFYWNoKGF1ZGl0PT5hc3NlcnRWYWxpZEF1ZGl0KGF1ZGl0LmltcGxlbWVudGF0aW9uLGF1ZGl0LnBhdGgpKTtyZXR1cm4gbWVyZ2VkQXVkaXREZWZuczt9CnN0YXRpYyByZXF1aXJlR2F0aGVyZXJGcm9tUGF0aChwYXRoLG9wdGlvbnMsY29yZUF1ZGl0TGlzdCxjb25maWdQYXRoKXtjb25zdCBjb3JlR2F0aGVyZXI9Y29yZUF1ZGl0TGlzdC5maW5kKGE9PmE9PT1gJHtwYXRofS5qc2ApO2xldCByZXF1aXJlUGF0aD1gLi4vZ2F0aGVyL2dhdGhlcmVycy8ke3BhdGh9YDtpZighY29yZUdhdGhlcmVyKXtyZXF1aXJlUGF0aD1SdW5uZXIucmVzb2x2ZVBsdWdpbihwYXRoLGNvbmZpZ1BhdGgsJ2dhdGhlcmVyJyk7fQpjb25zdCBHYXRoZXJlckNsYXNzPXJlcXVpcmUocmVxdWlyZVBhdGgpO3JldHVybntpbnN0YW5jZTpuZXcgR2F0aGVyZXJDbGFzcygpLGltcGxlbWVudGF0aW9uOkdhdGhlcmVyQ2xhc3MscGF0aCxvcHRpb25zOm9wdGlvbnN8fHt9fTt9CnN0YXRpYyByZXF1aXJlR2F0aGVyZXJzKHBhc3Nlcyxjb25maWdQYXRoKXtpZighcGFzc2VzKXtyZXR1cm4gbnVsbDt9CmNvbnN0IGNvcmVMaXN0PVJ1bm5lci5nZXRHYXRoZXJlckxpc3QoKTtjb25zdCBmdWxsUGFzc2VzPXBhc3Nlcy5tYXAocGFzcz0+e2NvbnN0IGdhdGhlcmVyRGVmbnM9Q29uZmlnLmV4cGFuZEdhdGhlcmVyU2hvcnRoYW5kKHBhc3MuZ2F0aGVyZXJzKS5tYXAoZ2F0aGVyZXJEZWZuPT57aWYoZ2F0aGVyZXJEZWZuLmluc3RhbmNlKXtyZXR1cm57aW5zdGFuY2U6Z2F0aGVyZXJEZWZuLmluc3RhbmNlLGltcGxlbWVudGF0aW9uOmdhdGhlcmVyRGVmbi5pbXBsZW1lbnRhdGlvbixwYXRoOmdhdGhlcmVyRGVmbi5wYXRoLG9wdGlvbnM6Z2F0aGVyZXJEZWZuLm9wdGlvbnN8fHt9fTt9ZWxzZSBpZihnYXRoZXJlckRlZm4uaW1wbGVtZW50YXRpb24pe2NvbnN0IEdhdGhlcmVyQ2xhc3M9Z2F0aGVyZXJEZWZuLmltcGxlbWVudGF0aW9uO3JldHVybntpbnN0YW5jZTpuZXcgR2F0aGVyZXJDbGFzcygpLGltcGxlbWVudGF0aW9uOmdhdGhlcmVyRGVmbi5pbXBsZW1lbnRhdGlvbixwYXRoOmdhdGhlcmVyRGVmbi5wYXRoLG9wdGlvbnM6Z2F0aGVyZXJEZWZuLm9wdGlvbnN8fHt9fTt9ZWxzZSBpZihnYXRoZXJlckRlZm4ucGF0aCl7Y29uc3QgcGF0aD1nYXRoZXJlckRlZm4ucGF0aDtjb25zdCBvcHRpb25zPWdhdGhlcmVyRGVmbi5vcHRpb25zO3JldHVybiBDb25maWcucmVxdWlyZUdhdGhlcmVyRnJvbVBhdGgocGF0aCxvcHRpb25zLGNvcmVMaXN0LGNvbmZpZ1BhdGgpO31lbHNle3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBhbmRlZCBHYXRoZXJlcjogJytKU09OLnN0cmluZ2lmeShnYXRoZXJlckRlZm4pKTt9fSk7Y29uc3QgbWVyZ2VkRGVmbnM9bWVyZ2VPcHRpb25zT2ZJdGVtcyhnYXRoZXJlckRlZm5zKTttZXJnZWREZWZucy5mb3JFYWNoKGdhdGhlcmVyPT5hc3NlcnRWYWxpZEdhdGhlcmVyKGdhdGhlcmVyLmluc3RhbmNlLGdhdGhlcmVyLnBhdGgpKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihwYXNzLHtnYXRoZXJlcnM6bWVyZ2VkRGVmbnN9KTt9KTtyZXR1cm4gZnVsbFBhc3Nlczt9fQptb2R1bGUuZXhwb3J0cz1Db25maWc7fSkuY2FsbCh0aGlzLCIvLi4vbGlnaHRob3VzZS1jb3JlL2NvbmZpZyIpO30seyIuLi9hdWRpdHMvYXVkaXQuanMiOjIsIi4uL3J1bm5lci5qcyI6NTAsIi4vY29uc3RhbnRzIjo4LCIuL2RlZmF1bHQtY29uZmlnLmpzIjo5LCIuL2Z1bGwtY29uZmlnLmpzIjoxMCwibGlnaHRob3VzZS1sb2dnZXIiOjEyNSwibG9kYXNoLmlzZXF1YWwiOjEyNiwicGF0aCI6NzV9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgREVWVE9PTFNfUlRUX0FESlVTVE1FTlRfRkFDVE9SPTMuNzU7Y29uc3QgREVWVE9PTFNfVEhST1VHSFBVVF9BREpVU1RNRU5UX0ZBQ1RPUj0wLjk7Y29uc3QgdGhyb3R0bGluZz17REVWVE9PTFNfUlRUX0FESlVTVE1FTlRfRkFDVE9SLERFVlRPT0xTX1RIUk9VR0hQVVRfQURKVVNUTUVOVF9GQUNUT1IsbW9iaWxlM0c6e3J0dE1zOjE1MCx0aHJvdWdocHV0S2JwczoxLjYqMTAyNCxyZXF1ZXN0TGF0ZW5jeU1zOjE1MCpERVZUT09MU19SVFRfQURKVVNUTUVOVF9GQUNUT1IsZG93bmxvYWRUaHJvdWdocHV0S2JwczoxLjYqMTAyNCpERVZUT09MU19USFJPVUdIUFVUX0FESlVTVE1FTlRfRkFDVE9SLHVwbG9hZFRocm91Z2hwdXRLYnBzOjc1MCpERVZUT09MU19USFJPVUdIUFVUX0FESlVTVE1FTlRfRkFDVE9SLGNwdVNsb3dkb3duTXVsdGlwbGllcjo0fX07Y29uc3QgZGVmYXVsdFNldHRpbmdzPXtvdXRwdXQ6J2pzb24nLG1heFdhaXRGb3JMb2FkOjQ1KjEwMDAsdGhyb3R0bGluZ01ldGhvZDonc2ltdWxhdGUnLHRocm90dGxpbmc6dGhyb3R0bGluZy5tb2JpbGUzRyxhdWRpdE1vZGU6ZmFsc2UsZ2F0aGVyTW9kZTpmYWxzZSxkaXNhYmxlU3RvcmFnZVJlc2V0OmZhbHNlLGRpc2FibGVEZXZpY2VFbXVsYXRpb246ZmFsc2UsYmxvY2tlZFVybFBhdHRlcm5zOm51bGwsYWRkaXRpb25hbFRyYWNlQ2F0ZWdvcmllczpudWxsLGV4dHJhSGVhZGVyczpudWxsLG9ubHlBdWRpdHM6bnVsbCxvbmx5Q2F0ZWdvcmllczpudWxsLHNraXBBdWRpdHM6bnVsbH07Y29uc3QgZGVmYXVsdFBhc3NDb25maWc9e3Bhc3NOYW1lOidkZWZhdWx0UGFzcycscmVjb3JkVHJhY2U6ZmFsc2UsdXNlVGhyb3R0bGluZzpmYWxzZSxwYXVzZUFmdGVyTG9hZE1zOjAsbmV0d29ya1F1aWV0VGhyZXNob2xkTXM6MCxjcHVRdWlldFRocmVzaG9sZE1zOjAsYmxvY2tlZFVybFBhdHRlcm5zOltdLGJsYW5rUGFnZTonYWJvdXQ6YmxhbmsnLGJsYW5rRHVyYXRpb246MzAwLGdhdGhlcmVyczpbXX07Y29uc3Qgbm9uU2ltdWxhdGVkUGFzc0NvbmZpZ092ZXJyaWRlcz17cGF1c2VBZnRlckxvYWRNczo1MjUwLG5ldHdvcmtRdWlldFRocmVzaG9sZE1zOjUyNTAsY3B1UXVpZXRUaHJlc2hvbGRNczo1MjUwfTttb2R1bGUuZXhwb3J0cz17dGhyb3R0bGluZyxkZWZhdWx0U2V0dGluZ3MsZGVmYXVsdFBhc3NDb25maWcsbm9uU2ltdWxhdGVkUGFzc0NvbmZpZ092ZXJyaWRlc307fSx7fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IGNvbnN0YW50cz1yZXF1aXJlKCcuL2NvbnN0YW50cycpO21vZHVsZS5leHBvcnRzPXtzZXR0aW5nczpjb25zdGFudHMuZGVmYXVsdFNldHRpbmdzLHBhc3Nlczpbe3Bhc3NOYW1lOidkZWZhdWx0UGFzcycscmVjb3JkVHJhY2U6dHJ1ZSx1c2VUaHJvdHRsaW5nOnRydWUscGF1c2VBZnRlckxvYWRNczoxMDAwLG5ldHdvcmtRdWlldFRocmVzaG9sZE1zOjEwMDAsY3B1UXVpZXRUaHJlc2hvbGRNczoxMDAwLGdhdGhlcmVyczpbJ3NjcmlwdHMnLCdjc3MtdXNhZ2UnLCd2aWV3cG9ydCcsJ3ZpZXdwb3J0LWRpbWVuc2lvbnMnLCd0aGVtZS1jb2xvcicsJ21hbmlmZXN0JywncnVudGltZS1leGNlcHRpb25zJywnY2hyb21lLWNvbnNvbGUtbWVzc2FnZXMnLCdpbWFnZS11c2FnZScsJ2FjY2Vzc2liaWxpdHknLCdkb2JldHRlcndlYi9hbmNob3JzLXdpdGgtbm8tcmVsLW5vb3BlbmVyJywnZG9iZXR0ZXJ3ZWIvYXBwY2FjaGUnLCdkb2JldHRlcndlYi9kb2N0eXBlJywnZG9iZXR0ZXJ3ZWIvZG9tc3RhdHMnLCdkb2JldHRlcndlYi9qcy1saWJyYXJpZXMnLCdkb2JldHRlcndlYi9vcHRpbWl6ZWQtaW1hZ2VzJywnZG9iZXR0ZXJ3ZWIvcGFzc3dvcmQtaW5wdXRzLXdpdGgtcHJldmVudGVkLXBhc3RlJywnZG9iZXR0ZXJ3ZWIvcmVzcG9uc2UtY29tcHJlc3Npb24nLCdkb2JldHRlcndlYi90YWdzLWJsb2NraW5nLWZpcnN0LXBhaW50JywnZG9iZXR0ZXJ3ZWIvd2Vic3FsJywnc2VvL21ldGEtZGVzY3JpcHRpb24nLCdzZW8vZm9udC1zaXplJywnc2VvL2NyYXdsYWJsZS1saW5rcycsJ3Nlby9tZXRhLXJvYm90cycsJ3Nlby9ocmVmbGFuZycsJ3Nlby9lbWJlZGRlZC1jb250ZW50Jywnc2VvL2Nhbm9uaWNhbCcsJ3Nlby9yb2JvdHMtdHh0JywnZm9udHMnXX0se3Bhc3NOYW1lOidvZmZsaW5lUGFzcycsZ2F0aGVyZXJzOlsnc2VydmljZS13b3JrZXInLCdvZmZsaW5lJywnc3RhcnQtdXJsJ119LHtwYXNzTmFtZToncmVkaXJlY3RQYXNzJyxibG9ja2VkVXJsUGF0dGVybnM6WycqLmNzcycsJyouanBnJywnKi5qcGVnJywnKi5wbmcnLCcqLmdpZicsJyouc3ZnJywnKi50dGYnLCcqLndvZmYnLCcqLndvZmYyJ10sZ2F0aGVyZXJzOlsnaHR0cC1yZWRpcmVjdCcsJ2h0bWwtd2l0aG91dC1qYXZhc2NyaXB0J119XSxhdWRpdHM6Wydpcy1vbi1odHRwcycsJ3JlZGlyZWN0cy1odHRwJywnc2VydmljZS13b3JrZXInLCd3b3Jrcy1vZmZsaW5lJywndmlld3BvcnQnLCd3aXRob3V0LWphdmFzY3JpcHQnLCdtZXRyaWNzL2ZpcnN0LWNvbnRlbnRmdWwtcGFpbnQnLCdtZXRyaWNzL2ZpcnN0LW1lYW5pbmdmdWwtcGFpbnQnLCdsb2FkLWZhc3QtZW5vdWdoLWZvci1wd2EnLCdtZXRyaWNzL3NwZWVkLWluZGV4Jywnc2NyZWVuc2hvdC10aHVtYm5haWxzJywnbWV0cmljcy9lc3RpbWF0ZWQtaW5wdXQtbGF0ZW5jeScsJ2Vycm9ycy1pbi1jb25zb2xlJywndGltZS10by1maXJzdC1ieXRlJywnbWV0cmljcy9maXJzdC1jcHUtaWRsZScsJ21ldHJpY3MvaW50ZXJhY3RpdmUnLCd1c2VyLXRpbWluZ3MnLCdjcml0aWNhbC1yZXF1ZXN0LWNoYWlucycsJ3JlZGlyZWN0cycsJ3dlYmFwcC1pbnN0YWxsLWJhbm5lcicsJ3NwbGFzaC1zY3JlZW4nLCd0aGVtZWQtb21uaWJveCcsJ21hbmlmZXN0LXNob3J0LW5hbWUtbGVuZ3RoJywnY29udGVudC13aWR0aCcsJ2ltYWdlLWFzcGVjdC1yYXRpbycsJ2RlcHJlY2F0aW9ucycsJ21haW50aHJlYWQtd29yay1icmVha2Rvd24nLCdib290dXAtdGltZScsJ3VzZXMtcmVsLXByZWxvYWQnLCd1c2VzLXJlbC1wcmVjb25uZWN0JywnZm9udC1kaXNwbGF5JywnbmV0d29yay1yZXF1ZXN0cycsJ21ldHJpY3MnLCdtYW51YWwvcHdhLWNyb3NzLWJyb3dzZXInLCdtYW51YWwvcHdhLXBhZ2UtdHJhbnNpdGlvbnMnLCdtYW51YWwvcHdhLWVhY2gtcGFnZS1oYXMtdXJsJywnYWNjZXNzaWJpbGl0eS9hY2Nlc3NrZXlzJywnYWNjZXNzaWJpbGl0eS9hcmlhLWFsbG93ZWQtYXR0cicsJ2FjY2Vzc2liaWxpdHkvYXJpYS1yZXF1aXJlZC1hdHRyJywnYWNjZXNzaWJpbGl0eS9hcmlhLXJlcXVpcmVkLWNoaWxkcmVuJywnYWNjZXNzaWJpbGl0eS9hcmlhLXJlcXVpcmVkLXBhcmVudCcsJ2FjY2Vzc2liaWxpdHkvYXJpYS1yb2xlcycsJ2FjY2Vzc2liaWxpdHkvYXJpYS12YWxpZC1hdHRyLXZhbHVlJywnYWNjZXNzaWJpbGl0eS9hcmlhLXZhbGlkLWF0dHInLCdhY2Nlc3NpYmlsaXR5L2F1ZGlvLWNhcHRpb24nLCdhY2Nlc3NpYmlsaXR5L2J1dHRvbi1uYW1lJywnYWNjZXNzaWJpbGl0eS9ieXBhc3MnLCdhY2Nlc3NpYmlsaXR5L2NvbG9yLWNvbnRyYXN0JywnYWNjZXNzaWJpbGl0eS9kZWZpbml0aW9uLWxpc3QnLCdhY2Nlc3NpYmlsaXR5L2RsaXRlbScsJ2FjY2Vzc2liaWxpdHkvZG9jdW1lbnQtdGl0bGUnLCdhY2Nlc3NpYmlsaXR5L2R1cGxpY2F0ZS1pZCcsJ2FjY2Vzc2liaWxpdHkvZnJhbWUtdGl0bGUnLCdhY2Nlc3NpYmlsaXR5L2h0bWwtaGFzLWxhbmcnLCdhY2Nlc3NpYmlsaXR5L2h0bWwtbGFuZy12YWxpZCcsJ2FjY2Vzc2liaWxpdHkvaW1hZ2UtYWx0JywnYWNjZXNzaWJpbGl0eS9pbnB1dC1pbWFnZS1hbHQnLCdhY2Nlc3NpYmlsaXR5L2xhYmVsJywnYWNjZXNzaWJpbGl0eS9sYXlvdXQtdGFibGUnLCdhY2Nlc3NpYmlsaXR5L2xpbmstbmFtZScsJ2FjY2Vzc2liaWxpdHkvbGlzdCcsJ2FjY2Vzc2liaWxpdHkvbGlzdGl0ZW0nLCdhY2Nlc3NpYmlsaXR5L21ldGEtcmVmcmVzaCcsJ2FjY2Vzc2liaWxpdHkvbWV0YS12aWV3cG9ydCcsJ2FjY2Vzc2liaWxpdHkvb2JqZWN0LWFsdCcsJ2FjY2Vzc2liaWxpdHkvdGFiaW5kZXgnLCdhY2Nlc3NpYmlsaXR5L3RkLWhlYWRlcnMtYXR0cicsJ2FjY2Vzc2liaWxpdHkvdGgtaGFzLWRhdGEtY2VsbHMnLCdhY2Nlc3NpYmlsaXR5L3ZhbGlkLWxhbmcnLCdhY2Nlc3NpYmlsaXR5L3ZpZGVvLWNhcHRpb24nLCdhY2Nlc3NpYmlsaXR5L3ZpZGVvLWRlc2NyaXB0aW9uJywnYWNjZXNzaWJpbGl0eS9tYW51YWwvY3VzdG9tLWNvbnRyb2xzLWxhYmVscycsJ2FjY2Vzc2liaWxpdHkvbWFudWFsL2N1c3RvbS1jb250cm9scy1yb2xlcycsJ2FjY2Vzc2liaWxpdHkvbWFudWFsL2ZvY3VzLXRyYXBzJywnYWNjZXNzaWJpbGl0eS9tYW51YWwvZm9jdXNhYmxlLWNvbnRyb2xzJywnYWNjZXNzaWJpbGl0eS9tYW51YWwvaGVhZGluZy1sZXZlbHMnLCdhY2Nlc3NpYmlsaXR5L21hbnVhbC9sb2dpY2FsLXRhYi1vcmRlcicsJ2FjY2Vzc2liaWxpdHkvbWFudWFsL21hbmFnZWQtZm9jdXMnLCdhY2Nlc3NpYmlsaXR5L21hbnVhbC9vZmZzY3JlZW4tY29udGVudC1oaWRkZW4nLCdhY2Nlc3NpYmlsaXR5L21hbnVhbC91c2UtbGFuZG1hcmtzJywnYWNjZXNzaWJpbGl0eS9tYW51YWwvdmlzdWFsLW9yZGVyLWZvbGxvd3MtZG9tJywnYnl0ZS1lZmZpY2llbmN5L3VzZXMtbG9uZy1jYWNoZS10dGwnLCdieXRlLWVmZmljaWVuY3kvdG90YWwtYnl0ZS13ZWlnaHQnLCdieXRlLWVmZmljaWVuY3kvb2Zmc2NyZWVuLWltYWdlcycsJ2J5dGUtZWZmaWNpZW5jeS9yZW5kZXItYmxvY2tpbmctcmVzb3VyY2VzJywnYnl0ZS1lZmZpY2llbmN5L3VubWluaWZpZWQtY3NzJywnYnl0ZS1lZmZpY2llbmN5L3VubWluaWZpZWQtamF2YXNjcmlwdCcsJ2J5dGUtZWZmaWNpZW5jeS91bnVzZWQtY3NzLXJ1bGVzJywnYnl0ZS1lZmZpY2llbmN5L3VzZXMtd2VicC1pbWFnZXMnLCdieXRlLWVmZmljaWVuY3kvdXNlcy1vcHRpbWl6ZWQtaW1hZ2VzJywnYnl0ZS1lZmZpY2llbmN5L3VzZXMtdGV4dC1jb21wcmVzc2lvbicsJ2J5dGUtZWZmaWNpZW5jeS91c2VzLXJlc3BvbnNpdmUtaW1hZ2VzJywnYnl0ZS1lZmZpY2llbmN5L2VmZmljaWVudC1hbmltYXRlZC1jb250ZW50JywnZG9iZXR0ZXJ3ZWIvYXBwY2FjaGUtbWFuaWZlc3QnLCdkb2JldHRlcndlYi9kb2N0eXBlJywnZG9iZXR0ZXJ3ZWIvZG9tLXNpemUnLCdkb2JldHRlcndlYi9leHRlcm5hbC1hbmNob3JzLXVzZS1yZWwtbm9vcGVuZXInLCdkb2JldHRlcndlYi9nZW9sb2NhdGlvbi1vbi1zdGFydCcsJ2RvYmV0dGVyd2ViL25vLWRvY3VtZW50LXdyaXRlJywnZG9iZXR0ZXJ3ZWIvbm8tdnVsbmVyYWJsZS1saWJyYXJpZXMnLCdkb2JldHRlcndlYi9uby13ZWJzcWwnLCdkb2JldHRlcndlYi9ub3RpZmljYXRpb24tb24tc3RhcnQnLCdkb2JldHRlcndlYi9wYXNzd29yZC1pbnB1dHMtY2FuLWJlLXBhc3RlZC1pbnRvJywnZG9iZXR0ZXJ3ZWIvdXNlcy1odHRwMicsJ2RvYmV0dGVyd2ViL3VzZXMtcGFzc2l2ZS1ldmVudC1saXN0ZW5lcnMnLCdzZW8vbWV0YS1kZXNjcmlwdGlvbicsJ3Nlby9odHRwLXN0YXR1cy1jb2RlJywnc2VvL2ZvbnQtc2l6ZScsJ3Nlby9saW5rLXRleHQnLCdzZW8vaXMtY3Jhd2xhYmxlJywnc2VvL3JvYm90cy10eHQnLCdzZW8vaHJlZmxhbmcnLCdzZW8vcGx1Z2lucycsJ3Nlby9jYW5vbmljYWwnLCdzZW8vbWFudWFsL21vYmlsZS1mcmllbmRseScsJ3Nlby9tYW51YWwvc3RydWN0dXJlZC1kYXRhJ10sZ3JvdXBzOnsnbWV0cmljcyc6e3RpdGxlOidNZXRyaWNzJ30sJ2xvYWQtb3Bwb3J0dW5pdGllcyc6e3RpdGxlOidPcHBvcnR1bml0aWVzJyxkZXNjcmlwdGlvbjonVGhlc2UgYXJlIG9wcG9ydHVuaXRpZXMgdG8gc3BlZWQgdXAgeW91ciBhcHBsaWNhdGlvbiBieSBvcHRpbWl6aW5nIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzLid9LCdkaWFnbm9zdGljcyc6e3RpdGxlOidEaWFnbm9zdGljcycsZGVzY3JpcHRpb246J01vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24uJ30sJ2ExMXktY29sb3ItY29udHJhc3QnOnt0aXRsZTonQ29sb3IgQ29udHJhc3QgSXMgU2F0aXNmYWN0b3J5JyxkZXNjcmlwdGlvbjonVGhlc2UgYXJlIG9wcG9ydHVuaXRpZXMgdG8gaW1wcm92ZSB0aGUgbGVnaWJpbGl0eSBvZiB5b3VyIGNvbnRlbnQuJ30sJ2ExMXktZGVzY3JpYmUtY29udGVudHMnOnt0aXRsZTonRWxlbWVudHMgRGVzY3JpYmUgQ29udGVudHMgV2VsbCcsZGVzY3JpcHRpb246J1RoZXNlIGFyZSBvcHBvcnR1bml0aWVzIHRvIG1ha2UgeW91ciBjb250ZW50IGVhc2llciB0byB1bmRlcnN0YW5kIGZvciBhIHVzZXIgb2YgYXNzaXN0aXZlIHRlY2hub2xvZ3ksIGxpa2UgYSBzY3JlZW4gcmVhZGVyLid9LCdhMTF5LXdlbGwtc3RydWN0dXJlZCc6e3RpdGxlOidFbGVtZW50cyBBcmUgV2VsbCBTdHJ1Y3R1cmVkJyxkZXNjcmlwdGlvbjonVGhlc2UgYXJlIG9wcG9ydHVuaXRpZXMgdG8gbWFrZSBzdXJlIHlvdXIgSFRNTCBpcyBhcHByb3ByaWF0ZWx5IHN0cnVjdHVyZWQuJ30sJ2ExMXktYXJpYSc6e3RpdGxlOidBUklBIEF0dHJpYnV0ZXMgRm9sbG93IEJlc3QgUHJhY3RpY2VzJyxkZXNjcmlwdGlvbjonVGhlc2UgYXJlIG9wcG9ydHVuaXRpZXMgdG8gaW1wcm92ZSB0aGUgdXNhZ2Ugb2YgQVJJQSBpbiB5b3VyIGFwcGxpY2F0aW9uIHdoaWNoIG1heSBlbmhhbmNlIHRoZSBleHBlcmllbmNlIGZvciB1c2VycyBvZiBhc3Npc3RpdmUgdGVjaG5vbG9neSwgbGlrZSBhIHNjcmVlbiByZWFkZXIuJ30sJ2ExMXktY29ycmVjdC1hdHRyaWJ1dGVzJzp7dGl0bGU6J0VsZW1lbnRzIFVzZSBBdHRyaWJ1dGVzIENvcnJlY3RseScsZGVzY3JpcHRpb246J1RoZXNlIGFyZSBvcHBvcnR1bml0aWVzIHRvIGltcHJvdmUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgeW91ciBIVE1MIGVsZW1lbnRzLid9LCdhMTF5LWVsZW1lbnQtbmFtZXMnOnt0aXRsZTonRWxlbWVudHMgSGF2ZSBEaXNjZXJuaWJsZSBOYW1lcycsZGVzY3JpcHRpb246J1RoZXNlIGFyZSBvcHBvcnR1bml0aWVzIHRvIGltcHJvdmUgdGhlIHNlbWFudGljcyBvZiB0aGUgY29udHJvbHMgaW4geW91ciBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgZW5oYW5jZSB0aGUgZXhwZXJpZW5jZSBmb3IgdXNlcnMgb2YgYXNzaXN0aXZlIHRlY2hub2xvZ3ksIGxpa2UgYSBzY3JlZW4gcmVhZGVyLid9LCdhMTF5LWxhbmd1YWdlJzp7dGl0bGU6J1BhZ2UgU3BlY2lmaWVzIFZhbGlkIExhbmd1YWdlJyxkZXNjcmlwdGlvbjonVGhlc2UgYXJlIG9wcG9ydHVuaXRpZXMgdG8gaW1wcm92ZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgeW91ciBjb250ZW50IGJ5IHVzZXJzIGluIGRpZmZlcmVudCBsb2NhbGVzLid9LCdhMTF5LW1ldGEnOnt0aXRsZTonTWV0YSBUYWdzIFVzZWQgUHJvcGVybHknLGRlc2NyaXB0aW9uOidUaGVzZSBhcmUgb3Bwb3J0dW5pdGllcyB0byBpbXByb3ZlIHRoZSB1c2VyIGV4cGVyaWVuY2Ugb2YgeW91ciBzaXRlLid9LCdzZW8tbW9iaWxlJzp7dGl0bGU6J01vYmlsZSBGcmllbmRseScsZGVzY3JpcHRpb246J01ha2Ugc3VyZSB5b3VyIHBhZ2VzIGFyZSBtb2JpbGUgZnJpZW5kbHkgc28gdXNlcnMgZG9u4oCZdCBoYXZlIHRvIHBpbmNoIG9yIHpvb20gJysnaW4gb3JkZXIgdG8gcmVhZCB0aGUgY29udGVudCBwYWdlcy4gW0xlYXJuIG1vcmVdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NlYXJjaC9tb2JpbGUtc2l0ZXMvKS4nfSwnc2VvLWNvbnRlbnQnOnt0aXRsZTonQ29udGVudCBCZXN0IFByYWN0aWNlcycsZGVzY3JpcHRpb246J0Zvcm1hdCB5b3VyIEhUTUwgaW4gYSB3YXkgdGhhdCBlbmFibGVzIGNyYXdsZXJzIHRvIGJldHRlciB1bmRlcnN0YW5kIHlvdXIgYXBw4oCZcyBjb250ZW50Lid9LCdzZW8tY3Jhd2wnOnt0aXRsZTonQ3Jhd2xpbmcgYW5kIEluZGV4aW5nJyxkZXNjcmlwdGlvbjonVG8gYXBwZWFyIGluIHNlYXJjaCByZXN1bHRzLCBjcmF3bGVycyBuZWVkIGFjY2VzcyB0byB5b3VyIGFwcC4nfX0sY2F0ZWdvcmllczp7J3BlcmZvcm1hbmNlJzp7dGl0bGU6J1BlcmZvcm1hbmNlJyxhdWRpdFJlZnM6W3tpZDonZmlyc3QtY29udGVudGZ1bC1wYWludCcsd2VpZ2h0OjMsZ3JvdXA6J21ldHJpY3MnfSx7aWQ6J2ZpcnN0LW1lYW5pbmdmdWwtcGFpbnQnLHdlaWdodDoxLGdyb3VwOidtZXRyaWNzJ30se2lkOidzcGVlZC1pbmRleCcsd2VpZ2h0OjQsZ3JvdXA6J21ldHJpY3MnfSx7aWQ6J2ludGVyYWN0aXZlJyx3ZWlnaHQ6NSxncm91cDonbWV0cmljcyd9LHtpZDonZmlyc3QtY3B1LWlkbGUnLHdlaWdodDoyLGdyb3VwOidtZXRyaWNzJ30se2lkOidlc3RpbWF0ZWQtaW5wdXQtbGF0ZW5jeScsd2VpZ2h0OjAsZ3JvdXA6J21ldHJpY3MnfSx7aWQ6J3JlbmRlci1ibG9ja2luZy1yZXNvdXJjZXMnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3VzZXMtcmVzcG9uc2l2ZS1pbWFnZXMnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J29mZnNjcmVlbi1pbWFnZXMnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3VubWluaWZpZWQtY3NzJyx3ZWlnaHQ6MCxncm91cDonbG9hZC1vcHBvcnR1bml0aWVzJ30se2lkOid1bm1pbmlmaWVkLWphdmFzY3JpcHQnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3VudXNlZC1jc3MtcnVsZXMnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3VzZXMtb3B0aW1pemVkLWltYWdlcycsd2VpZ2h0OjAsZ3JvdXA6J2xvYWQtb3Bwb3J0dW5pdGllcyd9LHtpZDondXNlcy13ZWJwLWltYWdlcycsd2VpZ2h0OjAsZ3JvdXA6J2xvYWQtb3Bwb3J0dW5pdGllcyd9LHtpZDondXNlcy10ZXh0LWNvbXByZXNzaW9uJyx3ZWlnaHQ6MCxncm91cDonbG9hZC1vcHBvcnR1bml0aWVzJ30se2lkOid1c2VzLXJlbC1wcmVjb25uZWN0Jyx3ZWlnaHQ6MCxncm91cDonbG9hZC1vcHBvcnR1bml0aWVzJ30se2lkOid0aW1lLXRvLWZpcnN0LWJ5dGUnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3JlZGlyZWN0cycsd2VpZ2h0OjAsZ3JvdXA6J2xvYWQtb3Bwb3J0dW5pdGllcyd9LHtpZDondXNlcy1yZWwtcHJlbG9hZCcsd2VpZ2h0OjAsZ3JvdXA6J2xvYWQtb3Bwb3J0dW5pdGllcyd9LHtpZDonZWZmaWNpZW50LWFuaW1hdGVkLWNvbnRlbnQnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfSx7aWQ6J3RvdGFsLWJ5dGUtd2VpZ2h0Jyx3ZWlnaHQ6MCxncm91cDonZGlhZ25vc3RpY3MnfSx7aWQ6J3VzZXMtbG9uZy1jYWNoZS10dGwnLHdlaWdodDowLGdyb3VwOidkaWFnbm9zdGljcyd9LHtpZDonZG9tLXNpemUnLHdlaWdodDowLGdyb3VwOidkaWFnbm9zdGljcyd9LHtpZDonY3JpdGljYWwtcmVxdWVzdC1jaGFpbnMnLHdlaWdodDowLGdyb3VwOidkaWFnbm9zdGljcyd9LHtpZDonbmV0d29yay1yZXF1ZXN0cycsd2VpZ2h0OjB9LHtpZDonbWV0cmljcycsd2VpZ2h0OjB9LHtpZDondXNlci10aW1pbmdzJyx3ZWlnaHQ6MCxncm91cDonZGlhZ25vc3RpY3MnfSx7aWQ6J2Jvb3R1cC10aW1lJyx3ZWlnaHQ6MCxncm91cDonZGlhZ25vc3RpY3MnfSx7aWQ6J3NjcmVlbnNob3QtdGh1bWJuYWlscycsd2VpZ2h0OjB9LHtpZDonbWFpbnRocmVhZC13b3JrLWJyZWFrZG93bicsd2VpZ2h0OjAsZ3JvdXA6J2RpYWdub3N0aWNzJ30se2lkOidmb250LWRpc3BsYXknLHdlaWdodDowLGdyb3VwOidkaWFnbm9zdGljcyd9XX0sJ3B3YSc6e3RpdGxlOidQcm9ncmVzc2l2ZSBXZWIgQXBwJyxkZXNjcmlwdGlvbjonVGhlc2UgY2hlY2tzIHZhbGlkYXRlIHRoZSBhc3BlY3RzIG9mIGEgUHJvZ3Jlc3NpdmUgV2ViIEFwcCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBiYXNlbGluZSBbUFdBIENoZWNrbGlzdF0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3Byb2dyZXNzaXZlLXdlYi1hcHBzL2NoZWNrbGlzdCkuJyxtYW51YWxEZXNjcmlwdGlvbjonVGhlc2UgY2hlY2tzIGFyZSByZXF1aXJlZCBieSB0aGUgYmFzZWxpbmUgJysnW1BXQSBDaGVja2xpc3RdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9wcm9ncmVzc2l2ZS13ZWItYXBwcy9jaGVja2xpc3QpIGJ1dCBhcmUgJysnbm90IGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBieSBMaWdodGhvdXNlLiBUaGV5IGRvIG5vdCBhZmZlY3QgeW91ciBzY29yZSBidXQgaXRcJ3MgaW1wb3J0YW50IHRoYXQgeW91IHZlcmlmeSB0aGVtIG1hbnVhbGx5LicsYXVkaXRSZWZzOlt7aWQ6J2xvYWQtZmFzdC1lbm91Z2gtZm9yLXB3YScsd2VpZ2h0Ojd9LHtpZDond29ya3Mtb2ZmbGluZScsd2VpZ2h0OjV9LHtpZDond2ViYXBwLWluc3RhbGwtYmFubmVyJyx3ZWlnaHQ6M30se2lkOidpcy1vbi1odHRwcycsd2VpZ2h0OjJ9LHtpZDoncmVkaXJlY3RzLWh0dHAnLHdlaWdodDoyfSx7aWQ6J3ZpZXdwb3J0Jyx3ZWlnaHQ6Mn0se2lkOidzZXJ2aWNlLXdvcmtlcicsd2VpZ2h0OjF9LHtpZDond2l0aG91dC1qYXZhc2NyaXB0Jyx3ZWlnaHQ6MX0se2lkOidzcGxhc2gtc2NyZWVuJyx3ZWlnaHQ6MX0se2lkOid0aGVtZWQtb21uaWJveCcsd2VpZ2h0OjF9LHtpZDonY29udGVudC13aWR0aCcsd2VpZ2h0OjF9LHtpZDonbWFuaWZlc3Qtc2hvcnQtbmFtZS1sZW5ndGgnLHdlaWdodDowfSx7aWQ6J3B3YS1jcm9zcy1icm93c2VyJyx3ZWlnaHQ6MH0se2lkOidwd2EtcGFnZS10cmFuc2l0aW9ucycsd2VpZ2h0OjB9LHtpZDoncHdhLWVhY2gtcGFnZS1oYXMtdXJsJyx3ZWlnaHQ6MH1dfSwnYWNjZXNzaWJpbGl0eSc6e3RpdGxlOidBY2Nlc3NpYmlsaXR5JyxkZXNjcmlwdGlvbjonVGhlc2UgY2hlY2tzIGhpZ2hsaWdodCBvcHBvcnR1bml0aWVzIHRvIFtpbXByb3ZlIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHlvdXIgd2ViIGFwcF0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9hY2Nlc3NpYmlsaXR5KS4gT25seSBhIHN1YnNldCBvZiBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBjYW4gYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBzbyBtYW51YWwgdGVzdGluZyBpcyBhbHNvIGVuY291cmFnZWQuJyxtYW51YWxEZXNjcmlwdGlvbjonVGhlc2UgaXRlbXMgYWRkcmVzcyBhcmVhcyB3aGljaCBhbiBhdXRvbWF0ZWQgdGVzdGluZyB0b29sIGNhbm5vdCBjb3Zlci4gTGVhcm4gbW9yZSBpbiBvdXIgZ3VpZGUgb24gW2NvbmR1Y3RpbmcgYW4gYWNjZXNzaWJpbGl0eSByZXZpZXddKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi9mdW5kYW1lbnRhbHMvYWNjZXNzaWJpbGl0eS9ob3ctdG8tcmV2aWV3KS4nLGF1ZGl0UmVmczpbe2lkOidhY2Nlc3NrZXlzJyx3ZWlnaHQ6MSxncm91cDonYTExeS1jb3JyZWN0LWF0dHJpYnV0ZXMnfSx7aWQ6J2FyaWEtYWxsb3dlZC1hdHRyJyx3ZWlnaHQ6Myxncm91cDonYTExeS1hcmlhJ30se2lkOidhcmlhLXJlcXVpcmVkLWF0dHInLHdlaWdodDoyLGdyb3VwOidhMTF5LWFyaWEnfSx7aWQ6J2FyaWEtcmVxdWlyZWQtY2hpbGRyZW4nLHdlaWdodDo1LGdyb3VwOidhMTF5LWFyaWEnfSx7aWQ6J2FyaWEtcmVxdWlyZWQtcGFyZW50Jyx3ZWlnaHQ6Mixncm91cDonYTExeS1hcmlhJ30se2lkOidhcmlhLXJvbGVzJyx3ZWlnaHQ6Myxncm91cDonYTExeS1hcmlhJ30se2lkOidhcmlhLXZhbGlkLWF0dHItdmFsdWUnLHdlaWdodDoyLGdyb3VwOidhMTF5LWFyaWEnfSx7aWQ6J2FyaWEtdmFsaWQtYXR0cicsd2VpZ2h0OjUsZ3JvdXA6J2ExMXktYXJpYSd9LHtpZDonYXVkaW8tY2FwdGlvbicsd2VpZ2h0OjQsZ3JvdXA6J2ExMXktY29ycmVjdC1hdHRyaWJ1dGVzJ30se2lkOididXR0b24tbmFtZScsd2VpZ2h0OjEwLGdyb3VwOidhMTF5LWVsZW1lbnQtbmFtZXMnfSx7aWQ6J2J5cGFzcycsd2VpZ2h0OjEwLGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidjb2xvci1jb250cmFzdCcsd2VpZ2h0OjYsZ3JvdXA6J2ExMXktY29sb3ItY29udHJhc3QnfSx7aWQ6J2RlZmluaXRpb24tbGlzdCcsd2VpZ2h0OjEsZ3JvdXA6J2ExMXktd2VsbC1zdHJ1Y3R1cmVkJ30se2lkOidkbGl0ZW0nLHdlaWdodDoxLGdyb3VwOidhMTF5LXdlbGwtc3RydWN0dXJlZCd9LHtpZDonZG9jdW1lbnQtdGl0bGUnLHdlaWdodDoyLGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidkdXBsaWNhdGUtaWQnLHdlaWdodDo1LGdyb3VwOidhMTF5LXdlbGwtc3RydWN0dXJlZCd9LHtpZDonZnJhbWUtdGl0bGUnLHdlaWdodDo1LGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidodG1sLWhhcy1sYW5nJyx3ZWlnaHQ6NCxncm91cDonYTExeS1sYW5ndWFnZSd9LHtpZDonaHRtbC1sYW5nLXZhbGlkJyx3ZWlnaHQ6MSxncm91cDonYTExeS1sYW5ndWFnZSd9LHtpZDonaW1hZ2UtYWx0Jyx3ZWlnaHQ6OCxncm91cDonYTExeS1jb3JyZWN0LWF0dHJpYnV0ZXMnfSx7aWQ6J2lucHV0LWltYWdlLWFsdCcsd2VpZ2h0OjEsZ3JvdXA6J2ExMXktY29ycmVjdC1hdHRyaWJ1dGVzJ30se2lkOidsYWJlbCcsd2VpZ2h0OjEwLGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidsYXlvdXQtdGFibGUnLHdlaWdodDoxLGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidsaW5rLW5hbWUnLHdlaWdodDo5LGdyb3VwOidhMTF5LWVsZW1lbnQtbmFtZXMnfSx7aWQ6J2xpc3QnLHdlaWdodDo1LGdyb3VwOidhMTF5LXdlbGwtc3RydWN0dXJlZCd9LHtpZDonbGlzdGl0ZW0nLHdlaWdodDo0LGdyb3VwOidhMTF5LXdlbGwtc3RydWN0dXJlZCd9LHtpZDonbWV0YS1yZWZyZXNoJyx3ZWlnaHQ6MSxncm91cDonYTExeS1tZXRhJ30se2lkOidtZXRhLXZpZXdwb3J0Jyx3ZWlnaHQ6Myxncm91cDonYTExeS1tZXRhJ30se2lkOidvYmplY3QtYWx0Jyx3ZWlnaHQ6NCxncm91cDonYTExeS1kZXNjcmliZS1jb250ZW50cyd9LHtpZDondGFiaW5kZXgnLHdlaWdodDo0LGdyb3VwOidhMTF5LWNvcnJlY3QtYXR0cmlidXRlcyd9LHtpZDondGQtaGVhZGVycy1hdHRyJyx3ZWlnaHQ6MSxncm91cDonYTExeS1jb3JyZWN0LWF0dHJpYnV0ZXMnfSx7aWQ6J3RoLWhhcy1kYXRhLWNlbGxzJyx3ZWlnaHQ6MSxncm91cDonYTExeS1jb3JyZWN0LWF0dHJpYnV0ZXMnfSx7aWQ6J3ZhbGlkLWxhbmcnLHdlaWdodDoxLGdyb3VwOidhMTF5LWxhbmd1YWdlJ30se2lkOid2aWRlby1jYXB0aW9uJyx3ZWlnaHQ6NCxncm91cDonYTExeS1kZXNjcmliZS1jb250ZW50cyd9LHtpZDondmlkZW8tZGVzY3JpcHRpb24nLHdlaWdodDozLGdyb3VwOidhMTF5LWRlc2NyaWJlLWNvbnRlbnRzJ30se2lkOidsb2dpY2FsLXRhYi1vcmRlcicsd2VpZ2h0OjB9LHtpZDonZm9jdXNhYmxlLWNvbnRyb2xzJyx3ZWlnaHQ6MH0se2lkOidtYW5hZ2VkLWZvY3VzJyx3ZWlnaHQ6MH0se2lkOidmb2N1cy10cmFwcycsd2VpZ2h0OjB9LHtpZDonY3VzdG9tLWNvbnRyb2xzLWxhYmVscycsd2VpZ2h0OjB9LHtpZDonY3VzdG9tLWNvbnRyb2xzLXJvbGVzJyx3ZWlnaHQ6MH0se2lkOid2aXN1YWwtb3JkZXItZm9sbG93cy1kb20nLHdlaWdodDowfSx7aWQ6J29mZnNjcmVlbi1jb250ZW50LWhpZGRlbicsd2VpZ2h0OjB9LHtpZDonaGVhZGluZy1sZXZlbHMnLHdlaWdodDowfSx7aWQ6J3VzZS1sYW5kbWFya3MnLHdlaWdodDowfV19LCdiZXN0LXByYWN0aWNlcyc6e3RpdGxlOidCZXN0IFByYWN0aWNlcycsYXVkaXRSZWZzOlt7aWQ6J2FwcGNhY2hlLW1hbmlmZXN0Jyx3ZWlnaHQ6MX0se2lkOiduby13ZWJzcWwnLHdlaWdodDoxfSx7aWQ6J2lzLW9uLWh0dHBzJyx3ZWlnaHQ6MX0se2lkOid1c2VzLWh0dHAyJyx3ZWlnaHQ6MX0se2lkOid1c2VzLXBhc3NpdmUtZXZlbnQtbGlzdGVuZXJzJyx3ZWlnaHQ6MX0se2lkOiduby1kb2N1bWVudC13cml0ZScsd2VpZ2h0OjF9LHtpZDonZXh0ZXJuYWwtYW5jaG9ycy11c2UtcmVsLW5vb3BlbmVyJyx3ZWlnaHQ6MX0se2lkOidnZW9sb2NhdGlvbi1vbi1zdGFydCcsd2VpZ2h0OjF9LHtpZDonZG9jdHlwZScsd2VpZ2h0OjF9LHtpZDonbm8tdnVsbmVyYWJsZS1saWJyYXJpZXMnLHdlaWdodDoxfSx7aWQ6J25vdGlmaWNhdGlvbi1vbi1zdGFydCcsd2VpZ2h0OjF9LHtpZDonZGVwcmVjYXRpb25zJyx3ZWlnaHQ6MX0se2lkOidwYXNzd29yZC1pbnB1dHMtY2FuLWJlLXBhc3RlZC1pbnRvJyx3ZWlnaHQ6MX0se2lkOidlcnJvcnMtaW4tY29uc29sZScsd2VpZ2h0OjF9LHtpZDonaW1hZ2UtYXNwZWN0LXJhdGlvJyx3ZWlnaHQ6MX1dfSwnc2VvJzp7dGl0bGU6J1NFTycsZGVzY3JpcHRpb246J1RoZXNlIGNoZWNrcyBlbnN1cmUgdGhhdCB5b3VyIHBhZ2UgaXMgb3B0aW1pemVkIGZvciBzZWFyY2ggZW5naW5lIHJlc3VsdHMgcmFua2luZy4gJysnVGhlcmUgYXJlIGFkZGl0aW9uYWwgZmFjdG9ycyBMaWdodGhvdXNlIGRvZXMgbm90IGNoZWNrIHRoYXQgbWF5IGFmZmVjdCB5b3VyIHNlYXJjaCByYW5raW5nLiAnKydbTGVhcm4gbW9yZV0oaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vd2VibWFzdGVycy9hbnN3ZXIvMzU3NjkpLicsbWFudWFsRGVzY3JpcHRpb246J1J1biB0aGVzZSBhZGRpdGlvbmFsIHZhbGlkYXRvcnMgb24geW91ciBzaXRlIHRvIGNoZWNrIGFkZGl0aW9uYWwgU0VPIGJlc3QgcHJhY3RpY2VzLicsYXVkaXRSZWZzOlt7aWQ6J3ZpZXdwb3J0Jyx3ZWlnaHQ6MSxncm91cDonc2VvLW1vYmlsZSd9LHtpZDonZG9jdW1lbnQtdGl0bGUnLHdlaWdodDoxLGdyb3VwOidzZW8tY29udGVudCd9LHtpZDonbWV0YS1kZXNjcmlwdGlvbicsd2VpZ2h0OjEsZ3JvdXA6J3Nlby1jb250ZW50J30se2lkOidodHRwLXN0YXR1cy1jb2RlJyx3ZWlnaHQ6MSxncm91cDonc2VvLWNyYXdsJ30se2lkOidsaW5rLXRleHQnLHdlaWdodDoxLGdyb3VwOidzZW8tY29udGVudCd9LHtpZDonaXMtY3Jhd2xhYmxlJyx3ZWlnaHQ6MSxncm91cDonc2VvLWNyYXdsJ30se2lkOidyb2JvdHMtdHh0Jyx3ZWlnaHQ6MSxncm91cDonc2VvLWNyYXdsJ30se2lkOidocmVmbGFuZycsd2VpZ2h0OjEsZ3JvdXA6J3Nlby1jb250ZW50J30se2lkOidjYW5vbmljYWwnLHdlaWdodDoxLGdyb3VwOidzZW8tY29udGVudCd9LHtpZDonZm9udC1zaXplJyx3ZWlnaHQ6MSxncm91cDonc2VvLW1vYmlsZSd9LHtpZDoncGx1Z2lucycsd2VpZ2h0OjEsZ3JvdXA6J3Nlby1jb250ZW50J30se2lkOidtb2JpbGUtZnJpZW5kbHknLHdlaWdodDowfSx7aWQ6J3N0cnVjdHVyZWQtZGF0YScsd2VpZ2h0OjB9XX19fTt9LHsiLi9jb25zdGFudHMiOjh9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO21vZHVsZS5leHBvcnRzPXtleHRlbmRzOidsaWdodGhvdXNlOmRlZmF1bHQnLHNldHRpbmdzOnt9LHBhc3Nlczpbe3Bhc3NOYW1lOidleHRyYVBhc3MnLGdhdGhlcmVyczpbJ2pzLXVzYWdlJ119XSxhdWRpdHM6WydieXRlLWVmZmljaWVuY3kvdW51c2VkLWphdmFzY3JpcHQnXSxjYXRlZ29yaWVzOnsncGVyZm9ybWFuY2UnOnthdWRpdFJlZnM6W3tpZDondW51c2VkLWphdmFzY3JpcHQnLHdlaWdodDowLGdyb3VwOidsb2FkLW9wcG9ydHVuaXRpZXMnfV19fX07fSx7fV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBBcmJpdHJhcnlFcXVhbGl0eU1hcD1yZXF1aXJlKCcuLi8uLi9saWIvYXJiaXRyYXJ5LWVxdWFsaXR5LW1hcCcpO2NsYXNzIENvbXB1dGVkQXJ0aWZhY3R7Y29uc3RydWN0b3IoYWxsQ29tcHV0ZWRBcnRpZmFjdHMpe2NvbnN0IGNhY2hlPW5ldyBBcmJpdHJhcnlFcXVhbGl0eU1hcCgpO2NhY2hlLnNldEVxdWFsaXR5Rm4oQXJiaXRyYXJ5RXF1YWxpdHlNYXAuZGVlcEVxdWFscyk7dGhpcy5fY2FjaGU9Y2FjaGU7dGhpcy5fYWxsQ29tcHV0ZWRBcnRpZmFjdHM9YWxsQ29tcHV0ZWRBcnRpZmFjdHM7fQpnZXQgbmFtZSgpe3Rocm93IG5ldyBFcnJvcignbmFtZSBnZXR0ZXIgbm90IGltcGxlbWVudGVkIGZvciBjb21wdXRlZCBhcnRpZmFjdCAnK3RoaXMuY29uc3RydWN0b3IubmFtZSk7fQphc3luYyBjb21wdXRlXyhhcnRpZmFjdCxhbGxDb21wdXRlZEFydGlmYWN0cyl7dGhyb3cgbmV3IEVycm9yKCdjb21wdXRlXygpIG5vdCBpbXBsZW1lbnRlZCBmb3IgY29tcHV0ZWQgYXJ0aWZhY3QgJyt0aGlzLm5hbWUpO30KYXN5bmMgcmVxdWVzdChyZXF1aXJlZEFydGlmYWN0cyl7Y29uc3QgY29tcHV0ZWQ9dGhpcy5fY2FjaGUuZ2V0KHJlcXVpcmVkQXJ0aWZhY3RzKTtpZihjb21wdXRlZCl7cmV0dXJuIGNvbXB1dGVkO30KY29uc3QgYXJ0aWZhY3RQcm9taXNlPXRoaXMuY29tcHV0ZV8ocmVxdWlyZWRBcnRpZmFjdHMsdGhpcy5fYWxsQ29tcHV0ZWRBcnRpZmFjdHMpO3RoaXMuX2NhY2hlLnNldChyZXF1aXJlZEFydGlmYWN0cyxhcnRpZmFjdFByb21pc2UpO3JldHVybiBhcnRpZmFjdFByb21pc2U7fX0KbW9kdWxlLmV4cG9ydHM9Q29tcHV0ZWRBcnRpZmFjdDt9LHsiLi4vLi4vbGliL2FyYml0cmFyeS1lcXVhbGl0eS1tYXAiOjIwfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBDb21wdXRlZEFydGlmYWN0PXJlcXVpcmUoJy4uL2NvbXB1dGVkLWFydGlmYWN0Jyk7Y29uc3QgQmFzZU5vZGU9cmVxdWlyZSgnLi4vLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvYmFzZS1ub2RlJyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCcpO2NsYXNzIExhbnRlcm5NZXRyaWNBcnRpZmFjdCBleHRlbmRzIENvbXB1dGVkQXJ0aWZhY3R7c3RhdGljIGdldFNjcmlwdFVybHMoZGVwZW5kZW5jeUdyYXBoLGNvbmRpdGlvbil7Y29uc3Qgc2NyaXB0VXJscz1uZXcgU2V0KCk7ZGVwZW5kZW5jeUdyYXBoLnRyYXZlcnNlKG5vZGU9PntpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5DUFUpcmV0dXJuO2lmKG5vZGUucmVjb3JkLnJlc291cmNlVHlwZSE9PU5ldHdvcmtSZXF1ZXN0LlRZUEVTLlNjcmlwdClyZXR1cm47aWYoY29uZGl0aW9uJiYhY29uZGl0aW9uKG5vZGUpKXJldHVybjtzY3JpcHRVcmxzLmFkZChub2RlLnJlY29yZC51cmwpO30pO3JldHVybiBzY3JpcHRVcmxzO30KZ2V0IENPRUZGSUNJRU5UUygpe3Rocm93IG5ldyBFcnJvcignQ09FRkZJQ0lFTlRTIHVuaW1wbGVtZW50ZWQhJyk7fQpnZXRPcHRpbWlzdGljR3JhcGgoZGVwZW5kZW5jeUdyYXBoLHRyYWNlT2ZUYWIpe3Rocm93IG5ldyBFcnJvcignT3B0aW1pc3RpYyBncmFwaCB1bmltcGxlbWVudGVkIScpO30KZ2V0UGVzc2ltaXN0aWNHcmFwaChkZXBlbmRlbmN5R3JhcGgsdHJhY2VPZlRhYil7dGhyb3cgbmV3IEVycm9yKCdQZXNzbWlzdGljIGdyYXBoIHVuaW1wbGVtZW50ZWQhJyk7fQpnZXRFc3RpbWF0ZUZyb21TaW11bGF0aW9uKHNpbXVsYXRpb25SZXN1bHQsZXh0cmFzKXtyZXR1cm4gc2ltdWxhdGlvblJlc3VsdDt9CmFzeW5jIGNvbXB1dGVNZXRyaWNXaXRoR3JhcGhzKGRhdGEsYXJ0aWZhY3RzLGV4dHJhcyl7Y29uc3R7dHJhY2UsZGV2dG9vbHNMb2csc2V0dGluZ3N9PWRhdGE7Y29uc3QgbWV0cmljTmFtZT10aGlzLm5hbWUucmVwbGFjZSgnTGFudGVybicsJycpO2NvbnN0IGdyYXBoPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0UGFnZURlcGVuZGVuY3lHcmFwaCh7dHJhY2UsZGV2dG9vbHNMb2d9KTtjb25zdCB0cmFjZU9mVGFiPWF3YWl0IGFydGlmYWN0cy5yZXF1ZXN0VHJhY2VPZlRhYih0cmFjZSk7Y29uc3Qgc2ltdWxhdG9yPWRhdGEuc2ltdWxhdG9yfHwoYXdhaXQgYXJ0aWZhY3RzLnJlcXVlc3RMb2FkU2ltdWxhdG9yKHtkZXZ0b29sc0xvZyxzZXR0aW5nc30pKTtjb25zdCBvcHRpbWlzdGljR3JhcGg9dGhpcy5nZXRPcHRpbWlzdGljR3JhcGgoZ3JhcGgsdHJhY2VPZlRhYik7Y29uc3QgcGVzc2ltaXN0aWNHcmFwaD10aGlzLmdldFBlc3NpbWlzdGljR3JhcGgoZ3JhcGgsdHJhY2VPZlRhYik7bGV0IHNpbXVsYXRlT3B0aW9ucz17bGFiZWw6YG9wdGltaXN0aWMke21ldHJpY05hbWV9YH07Y29uc3Qgb3B0aW1pc3RpY1NpbXVsYXRpb249c2ltdWxhdG9yLnNpbXVsYXRlKG9wdGltaXN0aWNHcmFwaCxzaW11bGF0ZU9wdGlvbnMpO3NpbXVsYXRlT3B0aW9ucz17bGFiZWw6YG9wdGltaXN0aWNGbGV4JHttZXRyaWNOYW1lfWAsZmxleGlibGVPcmRlcmluZzp0cnVlfTtjb25zdCBvcHRpbWlzdGljRmxleFNpbXVsYXRpb249c2ltdWxhdG9yLnNpbXVsYXRlKG9wdGltaXN0aWNHcmFwaCxzaW11bGF0ZU9wdGlvbnMpO3NpbXVsYXRlT3B0aW9ucz17bGFiZWw6YHBlc3NpbWlzdGljJHttZXRyaWNOYW1lfWB9O2NvbnN0IHBlc3NpbWlzdGljU2ltdWxhdGlvbj1zaW11bGF0b3Iuc2ltdWxhdGUocGVzc2ltaXN0aWNHcmFwaCxzaW11bGF0ZU9wdGlvbnMpO2NvbnN0IG9wdGltaXN0aWNFc3RpbWF0ZT10aGlzLmdldEVzdGltYXRlRnJvbVNpbXVsYXRpb24ob3B0aW1pc3RpY1NpbXVsYXRpb24udGltZUluTXM8b3B0aW1pc3RpY0ZsZXhTaW11bGF0aW9uLnRpbWVJbk1zP29wdGltaXN0aWNTaW11bGF0aW9uOm9wdGltaXN0aWNGbGV4U2ltdWxhdGlvbixPYmplY3QuYXNzaWduKHt9LGV4dHJhcyx7b3B0aW1pc3RpYzp0cnVlfSkpO2NvbnN0IHBlc3NpbWlzdGljRXN0aW1hdGU9dGhpcy5nZXRFc3RpbWF0ZUZyb21TaW11bGF0aW9uKHBlc3NpbWlzdGljU2ltdWxhdGlvbixPYmplY3QuYXNzaWduKHt9LGV4dHJhcyx7b3B0aW1pc3RpYzpmYWxzZX0pKTtjb25zdCBpbnRlcmNlcHRNdWx0aXBsaWVyPXRoaXMuQ09FRkZJQ0lFTlRTLmludGVyY2VwdD4wP01hdGgubWluKDEsb3B0aW1pc3RpY0VzdGltYXRlLnRpbWVJbk1zLzEwMDApOjE7Y29uc3QgdGltaW5nPXRoaXMuQ09FRkZJQ0lFTlRTLmludGVyY2VwdCppbnRlcmNlcHRNdWx0aXBsaWVyKwp0aGlzLkNPRUZGSUNJRU5UUy5vcHRpbWlzdGljKm9wdGltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcysKdGhpcy5DT0VGRklDSUVOVFMucGVzc2ltaXN0aWMqcGVzc2ltaXN0aWNFc3RpbWF0ZS50aW1lSW5NcztyZXR1cm57dGltaW5nLG9wdGltaXN0aWNFc3RpbWF0ZSxwZXNzaW1pc3RpY0VzdGltYXRlLG9wdGltaXN0aWNHcmFwaCxwZXNzaW1pc3RpY0dyYXBofTt9CmNvbXB1dGVfKGRhdGEsY29tcHV0ZWRBcnRpZmFjdHMpe3JldHVybiB0aGlzLmNvbXB1dGVNZXRyaWNXaXRoR3JhcGhzKGRhdGEsY29tcHV0ZWRBcnRpZmFjdHMpO319Cm1vZHVsZS5leHBvcnRzPUxhbnRlcm5NZXRyaWNBcnRpZmFjdDt9LHsiLi4vLi4vLi4vbGliL2RlcGVuZGVuY3ktZ3JhcGgvYmFzZS1ub2RlIjoyMiwiLi4vLi4vLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uL2NvbXB1dGVkLWFydGlmYWN0IjoxMX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29tcHV0ZWRBcnRpZmFjdD1yZXF1aXJlKCcuLi9jb21wdXRlZC1hcnRpZmFjdCcpO2NsYXNzIENvbXB1dGVkTWV0cmljIGV4dGVuZHMgQ29tcHV0ZWRBcnRpZmFjdHtnZXQgbmFtZSgpe3Rocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCcpO30KY29tcHV0ZVNpbXVsYXRlZE1ldHJpYyhkYXRhLGFydGlmYWN0cyl7cmV0dXJuIGFydGlmYWN0c1tgcmVxdWVzdExhbnRlcm4ke3RoaXMubmFtZX1gXShkYXRhKTt9CmNvbXB1dGVPYnNlcnZlZE1ldHJpYyhkYXRhLGFydGlmYWN0cyl7dGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkJyk7fQphc3luYyBjb21wdXRlXyhkYXRhLGNvbXB1dGVkQXJ0aWZhY3RzKXtjb25zdHt0cmFjZSxkZXZ0b29sc0xvZyxzZXR0aW5nc309ZGF0YTtpZighdHJhY2V8fCFkZXZ0b29sc0xvZ3x8IXNldHRpbmdzKXt0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgcHJvdmlkZSBuZWNlc3NhcnkgbWV0cmljIGNvbXB1dGF0aW9uIGRhdGEnKTt9CmNvbnN0IGF1Z21lbnRlZERhdGE9T2JqZWN0LmFzc2lnbih7bmV0d29ya1JlY29yZHM6YXdhaXQgY29tcHV0ZWRBcnRpZmFjdHMucmVxdWVzdE5ldHdvcmtSZWNvcmRzKGRldnRvb2xzTG9nKSx0cmFjZU9mVGFiOmF3YWl0IGNvbXB1dGVkQXJ0aWZhY3RzLnJlcXVlc3RUcmFjZU9mVGFiKHRyYWNlKX0sZGF0YSk7c3dpdGNoKHNldHRpbmdzLnRocm90dGxpbmdNZXRob2Qpe2Nhc2Unc2ltdWxhdGUnOnJldHVybiB0aGlzLmNvbXB1dGVTaW11bGF0ZWRNZXRyaWMoYXVnbWVudGVkRGF0YSxjb21wdXRlZEFydGlmYWN0cyk7Y2FzZSdwcm92aWRlZCc6Y2FzZSdkZXZ0b29scyc6cmV0dXJuIHRoaXMuY29tcHV0ZU9ic2VydmVkTWV0cmljKGF1Z21lbnRlZERhdGEsY29tcHV0ZWRBcnRpZmFjdHMpO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcihgVW5yZWNvZ25pemVkIHRocm90dGxpbmcgbWV0aG9kOiAke3NldHRpbmdzLnRocm90dGxpbmdNZXRob2R9YCk7fX19Cm1vZHVsZS5leHBvcnRzPUNvbXB1dGVkTWV0cmljO30seyIuLi9jb21wdXRlZC1hcnRpZmFjdCI6MTF9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEV2ZW50RW1pdHRlcj1yZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Y29uc3QgbG9nPXJlcXVpcmUoJ2xpZ2h0aG91c2UtbG9nZ2VyJyk7Y29uc3QgTEhFcnJvcj1yZXF1aXJlKCcuLi8uLi9saWIvZXJyb3JzJyk7Y2xhc3MgQ29ubmVjdGlvbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2xhc3RDb21tYW5kSWQ9MDt0aGlzLl9jYWxsYmFja3M9bmV3IE1hcCgpO3RoaXMuX2V2ZW50RW1pdHRlcj1uZXcgRXZlbnRFbWl0dGVyKCk7fQpjb25uZWN0KCl7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJykpO30KZGlzY29ubmVjdCgpe3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpKTt9CndzRW5kcG9pbnQoKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKSk7fQpzZW5kUmF3TWVzc2FnZShtZXNzYWdlKXt0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO30KaGFuZGxlUmF3TWVzc2FnZShtZXNzYWdlKXtjb25zdCBvYmplY3Q9SlNPTi5wYXJzZShtZXNzYWdlKTtpZighKCdpZCdpbiBvYmplY3QpKXtjb25zdCBldmVudE1lc3NhZ2U9b2JqZWN0O2xvZy5mb3JtYXRQcm90b2NvbCgnPD0gZXZlbnQnLHttZXRob2Q6ZXZlbnRNZXNzYWdlLm1ldGhvZCxwYXJhbXM6ZXZlbnRNZXNzYWdlLnBhcmFtc30sJ3ZlcmJvc2UnKTt0aGlzLmVtaXRQcm90b2NvbEV2ZW50KGV2ZW50TWVzc2FnZSk7cmV0dXJuO30KY29uc3QgY2FsbGJhY2s9dGhpcy5fY2FsbGJhY2tzLmdldChvYmplY3QuaWQpO2lmKGNhbGxiYWNrKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKG9iamVjdC5pZCk7cmV0dXJuIGNhbGxiYWNrLnJlc29sdmUoUHJvbWlzZS5yZXNvbHZlKCkudGhlbihfPT57aWYob2JqZWN0LmVycm9yKXtjb25zdCBsb2dMZXZlbD1jYWxsYmFjay5vcHRpb25zLnNpbGVudD8ndmVyYm9zZSc6J2Vycm9yJztsb2cuZm9ybWF0UHJvdG9jb2woJ21ldGhvZCA8PSBicm93c2VyIEVSUicse21ldGhvZDpjYWxsYmFjay5tZXRob2R9LGxvZ0xldmVsKTt0aHJvdyBMSEVycm9yLmZyb21Qcm90b2NvbE1lc3NhZ2UoY2FsbGJhY2subWV0aG9kLG9iamVjdC5lcnJvcik7fQpsb2cuZm9ybWF0UHJvdG9jb2woJ21ldGhvZCA8PSBicm93c2VyIE9LJyx7bWV0aG9kOmNhbGxiYWNrLm1ldGhvZCxwYXJhbXM6b2JqZWN0LnJlc3VsdH0sJ3ZlcmJvc2UnKTtyZXR1cm4gb2JqZWN0LnJlc3VsdDt9KSk7fWVsc2V7Y29uc3QgZXJyb3I9b2JqZWN0LmVycm9yJiZvYmplY3QuZXJyb3IubWVzc2FnZTtsb2cuZm9ybWF0UHJvdG9jb2woYGRpc293bmVkIG1ldGhvZCA8PSBicm93c2VyICR7ZXJyb3I/J0VSUic6J09LJ31gLHttZXRob2Q6J1VOS05PV04nLHBhcmFtczplcnJvcnx8b2JqZWN0LnJlc3VsdH0sJ3ZlcmJvc2UnKTt9fQplbWl0UHJvdG9jb2xFdmVudChldmVudE1lc3NhZ2Upe2lmKCF0aGlzLl9ldmVudEVtaXR0ZXIpe3Rocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGVtaXQgZXZlbnQgYWZ0ZXIgY29ubmVjdGlvbiBkaXNwb3NlZC4nKTt9CnRoaXMuX2V2ZW50RW1pdHRlci5lbWl0KCdwcm90b2NvbGV2ZW50JyxldmVudE1lc3NhZ2UpO30KZGlzcG9zZSgpe2lmKHRoaXMuX2V2ZW50RW1pdHRlcil7dGhpcy5fZXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO3RoaXMuX2V2ZW50RW1pdHRlcj1udWxsO319fQpDb25uZWN0aW9uLnByb3RvdHlwZS5vbj1mdW5jdGlvbiBvbihldmVudE5hbWUsY2Ipe2lmKGV2ZW50TmFtZSE9PSdwcm90b2NvbGV2ZW50Jyl7dGhyb3cgbmV3IEVycm9yKCdPbmx5IHN1cHBvcnRzICJwcm90b2NvbGV2ZW50IiBldmVudHMnKTt9CmlmKCF0aGlzLl9ldmVudEVtaXR0ZXIpe3Rocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIGFkZCBldmVudCBsaXN0ZW5lciBhZnRlciBjb25uZWN0aW9uIGRpc3Bvc2VkLicpO30KdGhpcy5fZXZlbnRFbWl0dGVyLm9uKGV2ZW50TmFtZSxjYik7fTtmdW5jdGlvbiBfc2VuZENvbW1hbmQobWV0aG9kLHBhcmFtcz17fSxjbWRPcHRzPXt9KXtsb2cuZm9ybWF0UHJvdG9jb2woJ21ldGhvZCA9PiBicm93c2VyJyx7bWV0aG9kLHBhcmFtc30sJ3ZlcmJvc2UnKTtjb25zdCBpZD0rK3RoaXMuX2xhc3RDb21tYW5kSWQ7Y29uc3QgbWVzc2FnZT1KU09OLnN0cmluZ2lmeSh7aWQsbWV0aG9kLHBhcmFtc30pO3RoaXMuc2VuZFJhd01lc3NhZ2UobWVzc2FnZSk7cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pnt0aGlzLl9jYWxsYmFja3Muc2V0KGlkLHtyZXNvbHZlLG1ldGhvZCxvcHRpb25zOmNtZE9wdHN9KTt9KTt9CkNvbm5lY3Rpb24ucHJvdG90eXBlLnNlbmRDb21tYW5kPV9zZW5kQ29tbWFuZDttb2R1bGUuZXhwb3J0cz1Db25uZWN0aW9uO30seyIuLi8uLi9saWIvZXJyb3JzIjozMywiZXZlbnRzIjo2MiwibGlnaHRob3VzZS1sb2dnZXIiOjEyNX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQ29ubmVjdGlvbj1yZXF1aXJlKCcuL2Nvbm5lY3Rpb24uanMnKTtjbGFzcyBSYXdDb25uZWN0aW9uIGV4dGVuZHMgQ29ubmVjdGlvbntjb25zdHJ1Y3Rvcihwb3J0KXtzdXBlcigpO3RoaXMuX3BvcnQ9cG9ydDt0aGlzLl9wb3J0Lm9uKCdtZXNzYWdlJyx0aGlzLmhhbmRsZVJhd01lc3NhZ2UuYmluZCh0aGlzKSk7dGhpcy5fcG9ydC5vbignY2xvc2UnLHRoaXMuZGlzcG9zZS5iaW5kKHRoaXMpKTt9CmNvbm5lY3QoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpkaXNjb25uZWN0KCl7dGhpcy5fcG9ydC5jbG9zZSgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CnNlbmRSYXdNZXNzYWdlKG1lc3NhZ2Upe3RoaXMuX3BvcnQuc2VuZChtZXNzYWdlKTt9fQptb2R1bGUuZXhwb3J0cz1SYXdDb25uZWN0aW9uO30seyIuL2Nvbm5lY3Rpb24uanMiOjE0fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0JztjbGFzcyBEZXZ0b29sc0xvZ3tjb25zdHJ1Y3RvcihyZWdleEZpbHRlcil7dGhpcy5fZmlsdGVyPXJlZ2V4RmlsdGVyO3RoaXMuX21lc3NhZ2VzPVtdO3RoaXMuX2lzUmVjb3JkaW5nPWZhbHNlO30KZ2V0IG1lc3NhZ2VzKCl7cmV0dXJuIHRoaXMuX21lc3NhZ2VzO30KcmVzZXQoKXt0aGlzLl9tZXNzYWdlcz1bXTt9CmJlZ2luUmVjb3JkaW5nKCl7dGhpcy5faXNSZWNvcmRpbmc9dHJ1ZTt9CmVuZFJlY29yZGluZygpe3RoaXMuX2lzUmVjb3JkaW5nPWZhbHNlO30KcmVjb3JkKG1lc3NhZ2Upe2lmKHRoaXMuX2lzUmVjb3JkaW5nJiYoIXRoaXMuX2ZpbHRlcnx8dGhpcy5fZmlsdGVyLnRlc3QobWVzc2FnZS5tZXRob2QpKSl7dGhpcy5fbWVzc2FnZXMucHVzaChtZXNzYWdlKTt9fX0KbW9kdWxlLmV4cG9ydHM9RGV2dG9vbHNMb2c7fSx7fV0sMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBOZXR3b3JrUmVjb3JkZXI9cmVxdWlyZSgnLi4vbGliL25ldHdvcmstcmVjb3JkZXInKTtjb25zdCBlbXVsYXRpb249cmVxdWlyZSgnLi4vbGliL2VtdWxhdGlvbicpO2NvbnN0IEVsZW1lbnQ9cmVxdWlyZSgnLi4vbGliL2VsZW1lbnQnKTtjb25zdCBMSEVycm9yPXJlcXVpcmUoJy4uL2xpYi9lcnJvcnMnKTtjb25zdCBOZXR3b3JrUmVxdWVzdD1yZXF1aXJlKCcuLi9saWIvbmV0d29yay1yZXF1ZXN0Jyk7Y29uc3QgRXZlbnRFbWl0dGVyPXJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y29uc3QgVHJhY2VQYXJzZXI9cmVxdWlyZSgnLi4vbGliL3RyYWNlcy90cmFjZS1wYXJzZXInKTtjb25zdCBjb25zdGFudHM9cmVxdWlyZSgnLi4vY29uZmlnL2NvbnN0YW50cycpO2NvbnN0IGxvZz1yZXF1aXJlKCdsaWdodGhvdXNlLWxvZ2dlcicpO2NvbnN0IERldnRvb2xzTG9nPXJlcXVpcmUoJy4vZGV2dG9vbHMtbG9nJyk7Y29uc3QgcGFnZUZ1bmN0aW9ucz1yZXF1aXJlKCcuLi9saWIvcGFnZS1mdW5jdGlvbnMuanMnKTtjb25zdCBDb25uZWN0aW9uPXJlcXVpcmUoJy4vY29ubmVjdGlvbnMvY29ubmVjdGlvbi5qcycpO2NvbnN0IERFRkFVTFRfUEFVU0VfQUZURVJfTE9BRD0wO2NvbnN0IERFRkFVTFRfTkVUV09SS19RVUlFVF9USFJFU0hPTEQ9NTAwMDtjb25zdCBERUZBVUxUX0NQVV9RVUlFVF9USFJFU0hPTEQ9MDtjbGFzcyBEcml2ZXJ7Y29uc3RydWN0b3IoY29ubmVjdGlvbil7dGhpcy5fdHJhY2VDYXRlZ29yaWVzPURyaXZlci50cmFjZUNhdGVnb3JpZXM7dGhpcy5fZXZlbnRFbWl0dGVyPW5ldyBFdmVudEVtaXR0ZXIoKTt0aGlzLl9jb25uZWN0aW9uPWNvbm5lY3Rpb247dGhpcy5fZGV2dG9vbHNMb2c9bmV3IERldnRvb2xzTG9nKC9eKFBhZ2V8TmV0d29yaylcLi8pO3RoaXMub25saW5lPXRydWU7dGhpcy5fZG9tYWluRW5hYmxlZENvdW50cz1uZXcgTWFwKCk7dGhpcy5faXNvbGF0ZWRFeGVjdXRpb25Db250ZXh0SWQ9dW5kZWZpbmVkO3RoaXMuX25ldHdvcmtTdGF0dXNNb25pdG9yPW51bGw7dGhpcy5fbW9uaXRvcmVkVXJsPW51bGw7Y29ubmVjdGlvbi5vbigncHJvdG9jb2xldmVudCcsZXZlbnQ9Pnt0aGlzLl9kZXZ0b29sc0xvZy5yZWNvcmQoZXZlbnQpO2lmKHRoaXMuX25ldHdvcmtTdGF0dXNNb25pdG9yKXt0aGlzLl9uZXR3b3JrU3RhdHVzTW9uaXRvci5kaXNwYXRjaChldmVudCk7fQp0aGlzLl9ldmVudEVtaXR0ZXIuZW1pdChldmVudC5tZXRob2QsZXZlbnQucGFyYW1zKTt9KTt9CnN0YXRpYyBnZXQgdHJhY2VDYXRlZ29yaWVzKCl7cmV0dXJuWyctKicsJ3RvcGxldmVsJywndjguZXhlY3V0ZScsJ2JsaW5rLmNvbnNvbGUnLCdibGluay51c2VyX3RpbWluZycsJ2JlbmNobWFyaycsJ2xvYWRpbmcnLCdsYXRlbmN5SW5mbycsJ2RldnRvb2xzLnRpbWVsaW5lJywnZGlzYWJsZWQtYnktZGVmYXVsdC1kZXZ0b29scy50aW1lbGluZScsJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuZnJhbWUnLCdkaXNhYmxlZC1ieS1kZWZhdWx0LWRldnRvb2xzLnRpbWVsaW5lLnN0YWNrJywnZGlzYWJsZWQtYnktZGVmYXVsdC1kZXZ0b29scy5zY3JlZW5zaG90J107fQpnZXRVc2VyQWdlbnQoKXtyZXR1cm4gdGhpcy5ldmFsdWF0ZUFzeW5jKCduYXZpZ2F0b3IudXNlckFnZW50Jyk7fQpjb25uZWN0KCl7cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uY29ubmVjdCgpO30KZGlzY29ubmVjdCgpe3JldHVybiB0aGlzLl9jb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTt9CndzRW5kcG9pbnQoKXtyZXR1cm4gdGhpcy5fY29ubmVjdGlvbi53c0VuZHBvaW50KCk7fQpfc2hvdWxkVG9nZ2xlRG9tYWluKGRvbWFpbixlbmFibGUpe2NvbnN0IGVuYWJsZWRDb3VudD10aGlzLl9kb21haW5FbmFibGVkQ291bnRzLmdldChkb21haW4pfHwwO2NvbnN0IG5ld0NvdW50PWVuYWJsZWRDb3VudCsoZW5hYmxlPzE6LTEpO3RoaXMuX2RvbWFpbkVuYWJsZWRDb3VudHMuc2V0KGRvbWFpbixNYXRoLm1heCgwLG5ld0NvdW50KSk7aWYoZW5hYmxlJiZuZXdDb3VudD09PTF8fCFlbmFibGUmJm5ld0NvdW50PT09MCl7bG9nLnZlcmJvc2UoJ0RyaXZlcicsYCR7ZG9tYWlufS4ke2VuYWJsZT8nZW5hYmxlJzonZGlzYWJsZSd9YCk7cmV0dXJuIHRydWU7fWVsc2V7aWYobmV3Q291bnQ8MCl7bG9nLmVycm9yKCdEcml2ZXInLGBBdHRlbXB0ZWQgdG8gZGlzYWJsZSBkb21haW4gJyR7ZG9tYWlufScgd2hlbiBhbHJlYWR5IGRpc2FibGVkLmApO30KcmV0dXJuIGZhbHNlO319CmlzRG9tYWluRW5hYmxlZChkb21haW4pe3JldHVybiEhdGhpcy5fZG9tYWluRW5hYmxlZENvdW50cy5nZXQoZG9tYWluKTt9CmV2YWx1YXRlU2NyaXB0T25OZXdEb2N1bWVudChzY3JpcHRTb3VyY2Upe3JldHVybiB0aGlzLnNlbmRDb21tYW5kKCdQYWdlLmFkZFNjcmlwdFRvRXZhbHVhdGVPbkxvYWQnLHtzY3JpcHRTb3VyY2V9KTt9CmV2YWx1YXRlQXN5bmMoZXhwcmVzc2lvbixvcHRpb25zPXt9KXtjb25zdCBjb250ZXh0SWRQcm9taXNlPW9wdGlvbnMudXNlSXNvbGF0aW9uP3RoaXMuX2dldE9yQ3JlYXRlSXNvbGF0ZWRDb250ZXh0SWQoKTpQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtyZXR1cm4gY29udGV4dElkUHJvbWlzZS50aGVuKGNvbnRleHRJZD0+dGhpcy5fZXZhbHVhdGVJbkNvbnRleHQoZXhwcmVzc2lvbixjb250ZXh0SWQpKTt9Cl9ldmFsdWF0ZUluQ29udGV4dChleHByZXNzaW9uLGNvbnRleHRJZCl7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pntjb25zdCBhc3luY1RpbWVvdXQ9c2V0VGltZW91dChfPT5yZWplY3QobmV3IEVycm9yKCdUaGUgYXN5bmNocm9ub3VzIGV4cHJlc3Npb24gZXhjZWVkZWQgdGhlIGFsbG90dGVkIHRpbWUgb2YgNjBzJykpLDYwMDAwKTtjb25zdCBldmFsdWF0aW9uUGFyYW1zPXtleHByZXNzaW9uOmAoZnVuY3Rpb24gd3JhcEluTmF0aXZlUHJvbWlzZSgpIHsKICAgICAgICAgIGNvbnN0IF9fbmF0aXZlUHJvbWlzZSA9IHdpbmRvdy5fX25hdGl2ZVByb21pc2UgfHwgUHJvbWlzZTsKICAgICAgICAgIHJldHVybiBuZXcgX19uYXRpdmVQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgICAgICAgIHJldHVybiBfX25hdGl2ZVByb21pc2UucmVzb2x2ZSgpCiAgICAgICAgICAgICAgLnRoZW4oXyA9PiAke2V4cHJlc3Npb259KQogICAgICAgICAgICAgIC5jYXRjaCgke3BhZ2VGdW5jdGlvbnMud3JhcFJ1bnRpbWVFdmFsRXJyb3JJbkJyb3dzZXIudG9TdHJpbmcoKX0pCiAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KCkpYCxpbmNsdWRlQ29tbWFuZExpbmVBUEk6dHJ1ZSxhd2FpdFByb21pc2U6dHJ1ZSxyZXR1cm5CeVZhbHVlOnRydWUsY29udGV4dElkfTt0aGlzLnNlbmRDb21tYW5kKCdSdW50aW1lLmV2YWx1YXRlJyxldmFsdWF0aW9uUGFyYW1zKS50aGVuKHJlc3VsdD0+e2NsZWFyVGltZW91dChhc3luY1RpbWVvdXQpO2NvbnN0IHZhbHVlPXJlc3VsdC5yZXN1bHQudmFsdWU7aWYocmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMpe3JlamVjdChuZXcgRXJyb3IoJ2FuIHVuZXhwZWN0ZWQgZHJpdmVyIGVycm9yIG9jY3VycmVkJykpO31pZih2YWx1ZSYmdmFsdWUuX19mYWlsZWRJbkJyb3dzZXIpe3JlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcigpLHZhbHVlKSk7fWVsc2V7cmVzb2x2ZSh2YWx1ZSk7fX0pLmNhdGNoKGVycj0+e2NsZWFyVGltZW91dChhc3luY1RpbWVvdXQpO3JlamVjdChlcnIpO30pO30pO30KZ2V0QXBwTWFuaWZlc3QoKXtyZXR1cm4gdGhpcy5zZW5kQ29tbWFuZCgnUGFnZS5nZXRBcHBNYW5pZmVzdCcpLnRoZW4ocmVzcG9uc2U9PntpZighcmVzcG9uc2UuZGF0YSl7cmV0dXJuIG51bGw7fQpyZXR1cm4gcmVzcG9uc2U7fSk7fQpnZXRTZXJ2aWNlV29ya2VyVmVyc2lvbnMoKXtyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e2NvbnN0IHZlcnNpb25VcGRhdGVkTGlzdGVuZXI9ZGF0YT0+e2NvbnN0IGFjdGl2YXRlQ2FuZGlkYXRlcz1kYXRhLnZlcnNpb25zLmZpbHRlcihzdz0+e3JldHVybiBzdy5zdGF0dXMhPT0ncmVkdW5kYW50Jzt9KTtjb25zdCBoYXNBY3RpdmVTZXJ2aWNlV29ya2VyPWFjdGl2YXRlQ2FuZGlkYXRlcy5maW5kKHN3PT57cmV0dXJuIHN3LnN0YXR1cz09PSdhY3RpdmF0ZWQnO30pO2lmKCFhY3RpdmF0ZUNhbmRpZGF0ZXMubGVuZ3RofHxoYXNBY3RpdmVTZXJ2aWNlV29ya2VyKXt0aGlzLm9mZignU2VydmljZVdvcmtlci53b3JrZXJWZXJzaW9uVXBkYXRlZCcsdmVyc2lvblVwZGF0ZWRMaXN0ZW5lcik7dGhpcy5zZW5kQ29tbWFuZCgnU2VydmljZVdvcmtlci5kaXNhYmxlJykudGhlbihfPT5yZXNvbHZlKGRhdGEpLHJlamVjdCk7fX07dGhpcy5vbignU2VydmljZVdvcmtlci53b3JrZXJWZXJzaW9uVXBkYXRlZCcsdmVyc2lvblVwZGF0ZWRMaXN0ZW5lcik7dGhpcy5zZW5kQ29tbWFuZCgnU2VydmljZVdvcmtlci5lbmFibGUnKS5jYXRjaChyZWplY3QpO30pO30KZ2V0U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbnMoKXtyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e3RoaXMub25jZSgnU2VydmljZVdvcmtlci53b3JrZXJSZWdpc3RyYXRpb25VcGRhdGVkJyxkYXRhPT57dGhpcy5zZW5kQ29tbWFuZCgnU2VydmljZVdvcmtlci5kaXNhYmxlJykudGhlbihfPT5yZXNvbHZlKGRhdGEpLHJlamVjdCk7fSk7dGhpcy5zZW5kQ29tbWFuZCgnU2VydmljZVdvcmtlci5lbmFibGUnKS5jYXRjaChyZWplY3QpO30pO30KYXNzZXJ0Tm9TYW1lT3JpZ2luU2VydmljZVdvcmtlckNsaWVudHMocGFnZVVybCl7bGV0IHJlZ2lzdHJhdGlvbnM7bGV0IHZlcnNpb25zO3JldHVybiB0aGlzLmdldFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25zKCkudGhlbihkYXRhPT57cmVnaXN0cmF0aW9ucz1kYXRhLnJlZ2lzdHJhdGlvbnM7fSkudGhlbihfPT50aGlzLmdldFNlcnZpY2VXb3JrZXJWZXJzaW9ucygpKS50aGVuKGRhdGE9Pnt2ZXJzaW9ucz1kYXRhLnZlcnNpb25zO30pLnRoZW4oXz0+e2NvbnN0IG9yaWdpbj1uZXcgVVJMKHBhZ2VVcmwpLm9yaWdpbjtyZWdpc3RyYXRpb25zLmZpbHRlcihyZWc9Pntjb25zdCBzd09yaWdpbj1uZXcgVVJMKHJlZy5zY29wZVVSTCkub3JpZ2luO3JldHVybiBvcmlnaW49PT1zd09yaWdpbjt9KS5mb3JFYWNoKHJlZz0+e3ZlcnNpb25zLmZvckVhY2godmVyPT57aWYodmVyLnJlZ2lzdHJhdGlvbklkIT09cmVnLnJlZ2lzdHJhdGlvbklkKXtyZXR1cm47fQppZih2ZXIuY29udHJvbGxlZENsaWVudHMmJnZlci5jb250cm9sbGVkQ2xpZW50cy5sZW5ndGg+MCl7dGhyb3cgbmV3IEVycm9yKCdZb3UgcHJvYmFibHkgaGF2ZSBtdWx0aXBsZSB0YWJzIG9wZW4gdG8gdGhlIHNhbWUgb3JpZ2luLicpO319KTt9KTt9KTt9Cl93YWl0Rm9yTmV0d29ya0lkbGUobmV0d29ya1F1aWV0VGhyZXNob2xkTXMpe2xldCBpZGxlVGltZW91dDtsZXQgY2FuY2VsPSgpPT57dGhyb3cgbmV3IEVycm9yKCdfd2FpdEZvck5ldHdvcmtJZGxlLmNhbmNlbCgpIGNhbGxlZCBiZWZvcmUgaXQgd2FzIGRlZmluZWQnKTt9O2lmKCF0aGlzLl9uZXR3b3JrU3RhdHVzTW9uaXRvcil7dGhyb3cgbmV3IEVycm9yKCdEcml2ZXIuX3dhaXRGb3JOZXR3b3JrSWRsZSBjYWxsZWQgd2l0aCBubyBuZXR3b3JrU3RhdHVzTW9uaXRvcicpO30KY29uc3QgbmV0d29ya1N0YXR1c01vbml0b3I9dGhpcy5fbmV0d29ya1N0YXR1c01vbml0b3I7Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57Y29uc3Qgb25JZGxlPSgpPT57bmV0d29ya1N0YXR1c01vbml0b3Iub25jZSgnbmV0d29yay0yLWJ1c3knLG9uQnVzeSk7aWRsZVRpbWVvdXQ9c2V0VGltZW91dChfPT57Y2FuY2VsKCk7cmVzb2x2ZSgpO30sbmV0d29ya1F1aWV0VGhyZXNob2xkTXMpO307Y29uc3Qgb25CdXN5PSgpPT57bmV0d29ya1N0YXR1c01vbml0b3Iub25jZSgnbmV0d29yay0yLWlkbGUnLG9uSWRsZSk7aWRsZVRpbWVvdXQmJmNsZWFyVGltZW91dChpZGxlVGltZW91dCk7fTtjb25zdCBkb21Db250ZW50TG9hZGVkTGlzdGVuZXI9KCk9PntpZihuZXR3b3JrU3RhdHVzTW9uaXRvci5pczJJZGxlKCkpe29uSWRsZSgpO31lbHNle29uQnVzeSgpO319O3RoaXMub25jZSgnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsZG9tQ29udGVudExvYWRlZExpc3RlbmVyKTtjYW5jZWw9KCk9PntpZGxlVGltZW91dCYmY2xlYXJUaW1lb3V0KGlkbGVUaW1lb3V0KTt0aGlzLm9mZignUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsZG9tQ29udGVudExvYWRlZExpc3RlbmVyKTtuZXR3b3JrU3RhdHVzTW9uaXRvci5yZW1vdmVMaXN0ZW5lcignbmV0d29yay0yLWJ1c3knLG9uQnVzeSk7bmV0d29ya1N0YXR1c01vbml0b3IucmVtb3ZlTGlzdGVuZXIoJ25ldHdvcmstMi1pZGxlJyxvbklkbGUpO307fSk7cmV0dXJue3Byb21pc2UsY2FuY2VsfTt9Cl93YWl0Rm9yQ1BVSWRsZSh3YWl0Rm9yQ1BVUXVpZXQpe2lmKCF3YWl0Rm9yQ1BVUXVpZXQpe3JldHVybntwcm9taXNlOlByb21pc2UucmVzb2x2ZSgpLGNhbmNlbDooKT0+dW5kZWZpbmVkfTt9CmxldCBsYXN0VGltZW91dDtsZXQgY2FuY2VsbGVkPWZhbHNlO2NvbnN0IGNoZWNrRm9yUXVpZXRFeHByZXNzaW9uPWAoJHtwYWdlRnVuY3Rpb25zLmNoZWNrVGltZVNpbmNlTGFzdExvbmdUYXNrLnRvU3RyaW5nKCl9KSgpYDtmdW5jdGlvbiBjaGVja0ZvclF1aWV0KGRyaXZlcixyZXNvbHZlKXtpZihjYW5jZWxsZWQpcmV0dXJuO3JldHVybiBkcml2ZXIuZXZhbHVhdGVBc3luYyhjaGVja0ZvclF1aWV0RXhwcmVzc2lvbikudGhlbih0aW1lU2luY2VMb25nVGFzaz0+e2lmKGNhbmNlbGxlZClyZXR1cm47aWYodHlwZW9mIHRpbWVTaW5jZUxvbmdUYXNrPT09J251bWJlcicpe2lmKHRpbWVTaW5jZUxvbmdUYXNrPj13YWl0Rm9yQ1BVUXVpZXQpe2xvZy52ZXJib3NlKCdEcml2ZXInLGBDUFUgaGFzIGJlZW4gaWRsZSBmb3IgJHt0aW1lU2luY2VMb25nVGFza30gbXNgKTtyZXNvbHZlKCk7fWVsc2V7bG9nLnZlcmJvc2UoJ0RyaXZlcicsYENQVSBoYXMgYmVlbiBpZGxlIGZvciAke3RpbWVTaW5jZUxvbmdUYXNrfSBtc2ApO2NvbnN0IHRpbWVUb1dhaXQ9d2FpdEZvckNQVVF1aWV0LXRpbWVTaW5jZUxvbmdUYXNrO2xhc3RUaW1lb3V0PXNldFRpbWVvdXQoKCk9PmNoZWNrRm9yUXVpZXQoZHJpdmVyLHJlc29sdmUpLHRpbWVUb1dhaXQpO319fSk7fQpsZXQgY2FuY2VsPSgpPT57dGhyb3cgbmV3IEVycm9yKCdfd2FpdEZvckNQVUlkbGUuY2FuY2VsKCkgY2FsbGVkIGJlZm9yZSBpdCB3YXMgZGVmaW5lZCcpO307Y29uc3QgcHJvbWlzZT1uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57Y2hlY2tGb3JRdWlldCh0aGlzLHJlc29sdmUpO2NhbmNlbD0oKT0+e2NhbmNlbGxlZD10cnVlO2lmKGxhc3RUaW1lb3V0KWNsZWFyVGltZW91dChsYXN0VGltZW91dCk7cmVqZWN0KG5ldyBFcnJvcignV2FpdCBmb3IgQ1BVIGlkbGUgY2FuY2VsbGVkJykpO307fSk7cmV0dXJue3Byb21pc2UsY2FuY2VsfTt9Cl93YWl0Rm9yTG9hZEV2ZW50KHBhdXNlQWZ0ZXJMb2FkTXMpe2xldCBjYW5jZWw9KCk9Pnt0aHJvdyBuZXcgRXJyb3IoJ193YWl0Rm9yTG9hZEV2ZW50LmNhbmNlbCgpIGNhbGxlZCBiZWZvcmUgaXQgd2FzIGRlZmluZWQnKTt9O2NvbnN0IHByb21pc2U9bmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e2xldCBsb2FkVGltZW91dDtjb25zdCBsb2FkTGlzdGVuZXI9ZnVuY3Rpb24oKXtsb2FkVGltZW91dD1zZXRUaW1lb3V0KHJlc29sdmUscGF1c2VBZnRlckxvYWRNcyk7fTt0aGlzLm9uY2UoJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLGxvYWRMaXN0ZW5lcik7Y2FuY2VsPSgpPT57dGhpcy5vZmYoJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLGxvYWRMaXN0ZW5lcik7bG9hZFRpbWVvdXQmJmNsZWFyVGltZW91dChsb2FkVGltZW91dCk7fTt9KTtyZXR1cm57cHJvbWlzZSxjYW5jZWx9O30KYXN5bmMgX3dhaXRGb3JGdWxseUxvYWRlZChwYXVzZUFmdGVyTG9hZE1zLG5ldHdvcmtRdWlldFRocmVzaG9sZE1zLGNwdVF1aWV0VGhyZXNob2xkTXMsbWF4V2FpdEZvckxvYWRlZE1zKXtsZXQgbWF4VGltZW91dEhhbmRsZTtjb25zdCB3YWl0Rm9yTG9hZEV2ZW50PXRoaXMuX3dhaXRGb3JMb2FkRXZlbnQocGF1c2VBZnRlckxvYWRNcyk7Y29uc3Qgd2FpdEZvck5ldHdvcmtJZGxlPXRoaXMuX3dhaXRGb3JOZXR3b3JrSWRsZShuZXR3b3JrUXVpZXRUaHJlc2hvbGRNcyk7bGV0IHdhaXRGb3JDUFVJZGxlPW51bGw7Y29uc3QgbG9hZFByb21pc2U9UHJvbWlzZS5hbGwoW3dhaXRGb3JMb2FkRXZlbnQucHJvbWlzZSx3YWl0Rm9yTmV0d29ya0lkbGUucHJvbWlzZV0pLnRoZW4oKCk9Pnt3YWl0Rm9yQ1BVSWRsZT10aGlzLl93YWl0Rm9yQ1BVSWRsZShjcHVRdWlldFRocmVzaG9sZE1zKTtyZXR1cm4gd2FpdEZvckNQVUlkbGUucHJvbWlzZTt9KS50aGVuKCgpPT57cmV0dXJuIGZ1bmN0aW9uKCl7bG9nLnZlcmJvc2UoJ0RyaXZlcicsJ2xvYWRFdmVudEZpcmVkIGFuZCBuZXR3b3JrIGNvbnNpZGVyZWQgaWRsZScpO21heFRpbWVvdXRIYW5kbGUmJmNsZWFyVGltZW91dChtYXhUaW1lb3V0SGFuZGxlKTt9O30pO2NvbnN0IG1heFRpbWVvdXRQcm9taXNlPW5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnttYXhUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQocmVzb2x2ZSxtYXhXYWl0Rm9yTG9hZGVkTXMpO30pLnRoZW4oXz0+e3JldHVybiBmdW5jdGlvbigpe2xvZy53YXJuKCdEcml2ZXInLCdUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGFnZSBsb2FkLiBNb3Zpbmcgb24uLi4nKTt3YWl0Rm9yTG9hZEV2ZW50LmNhbmNlbCgpO3dhaXRGb3JOZXR3b3JrSWRsZS5jYW5jZWwoKTt3YWl0Rm9yQ1BVSWRsZSYmd2FpdEZvckNQVUlkbGUuY2FuY2VsKCk7fTt9KTtjb25zdCBjbGVhbnVwRm49YXdhaXQgUHJvbWlzZS5yYWNlKFtsb2FkUHJvbWlzZSxtYXhUaW1lb3V0UHJvbWlzZV0pO2NsZWFudXBGbigpO30KX2JlZ2luTmV0d29ya1N0YXR1c01vbml0b3Jpbmcoc3RhcnRpbmdVcmwpe3RoaXMuX25ldHdvcmtTdGF0dXNNb25pdG9yPW5ldyBOZXR3b3JrUmVjb3JkZXIoKTt0aGlzLl9tb25pdG9yZWRVcmw9c3RhcnRpbmdVcmw7Y29uc3QgcmVxdWVzdExvYWRlZExpc3RlbmVyPXJlZGlyZWN0UmVxdWVzdD0+e2lmKCFyZWRpcmVjdFJlcXVlc3QucmVkaXJlY3RTb3VyY2Upe3JldHVybjt9CmNvbnN0IGVhcmxpZXJSZXF1ZXN0PXJlZGlyZWN0UmVxdWVzdC5yZWRpcmVjdFNvdXJjZTtpZihlYXJsaWVyUmVxdWVzdC51cmw9PT10aGlzLl9tb25pdG9yZWRVcmwpe3RoaXMuX21vbml0b3JlZFVybD1yZWRpcmVjdFJlcXVlc3QudXJsO319O3RoaXMuX25ldHdvcmtTdGF0dXNNb25pdG9yLm9uKCdyZXF1ZXN0bG9hZGVkJyxyZXF1ZXN0TG9hZGVkTGlzdGVuZXIpO3JldHVybiB0aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLmVuYWJsZScpO30KX2VuZE5ldHdvcmtTdGF0dXNNb25pdG9yaW5nKCl7dGhpcy5fbmV0d29ya1N0YXR1c01vbml0b3I9bnVsbDtjb25zdCBmaW5hbFVybD10aGlzLl9tb25pdG9yZWRVcmw7dGhpcy5fbW9uaXRvcmVkVXJsPW51bGw7aWYoIWZpbmFsVXJsKXt0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgU3RhdHVzIE1vbml0b3JpbmcgZW5kZWQgd2l0aCBhbiB1bmRlZmluZWQgZmluYWxVcmwnKTt9CnJldHVybiBmaW5hbFVybDt9CmFzeW5jIF9nZXRPckNyZWF0ZUlzb2xhdGVkQ29udGV4dElkKCl7aWYodHlwZW9mIHRoaXMuX2lzb2xhdGVkRXhlY3V0aW9uQ29udGV4dElkPT09J251bWJlcicpe3JldHVybiB0aGlzLl9pc29sYXRlZEV4ZWN1dGlvbkNvbnRleHRJZDt9CmNvbnN0IHJlc291cmNlVHJlZVJlc3BvbnNlPWF3YWl0IHRoaXMuc2VuZENvbW1hbmQoJ1BhZ2UuZ2V0UmVzb3VyY2VUcmVlJyk7Y29uc3QgbWFpbkZyYW1lSWQ9cmVzb3VyY2VUcmVlUmVzcG9uc2UuZnJhbWVUcmVlLmZyYW1lLmlkO2NvbnN0IGlzb2xhdGVkV29ybGRSZXNwb25zZT1hd2FpdCB0aGlzLnNlbmRDb21tYW5kKCdQYWdlLmNyZWF0ZUlzb2xhdGVkV29ybGQnLHtmcmFtZUlkOm1haW5GcmFtZUlkLHdvcmxkTmFtZTonbGlnaHRob3VzZV9pc29sYXRlZF9jb250ZXh0J30pO3RoaXMuX2lzb2xhdGVkRXhlY3V0aW9uQ29udGV4dElkPWlzb2xhdGVkV29ybGRSZXNwb25zZS5leGVjdXRpb25Db250ZXh0SWQ7cmV0dXJuIGlzb2xhdGVkV29ybGRSZXNwb25zZS5leGVjdXRpb25Db250ZXh0SWQ7fQpfY2xlYXJJc29sYXRlZENvbnRleHRJZCgpe3RoaXMuX2lzb2xhdGVkRXhlY3V0aW9uQ29udGV4dElkPXVuZGVmaW5lZDt9CmFzeW5jIGdvdG9VUkwodXJsLG9wdGlvbnM9e30pe2NvbnN0IHdhaXRGb3JMb2FkPW9wdGlvbnMud2FpdEZvckxvYWR8fGZhbHNlO2NvbnN0IHBhc3NDb250ZXh0PW9wdGlvbnMucGFzc0NvbnRleHR8fHt9O2NvbnN0IGRpc2FibGVKUz1wYXNzQ29udGV4dC5kaXNhYmxlSmF2YVNjcmlwdHx8ZmFsc2U7YXdhaXQgdGhpcy5fYmVnaW5OZXR3b3JrU3RhdHVzTW9uaXRvcmluZyh1cmwpO2F3YWl0IHRoaXMuX2NsZWFySXNvbGF0ZWRDb250ZXh0SWQoKTt0aGlzLnNlbmRDb21tYW5kKCdQYWdlLmVuYWJsZScpO3RoaXMuc2VuZENvbW1hbmQoJ0VtdWxhdGlvbi5zZXRTY3JpcHRFeGVjdXRpb25EaXNhYmxlZCcse3ZhbHVlOmRpc2FibGVKU30pO3RoaXMuc2VuZENvbW1hbmQoJ1BhZ2UubmF2aWdhdGUnLHt1cmx9KTtpZih3YWl0Rm9yTG9hZCl7Y29uc3QgcGFzc0NvbmZpZz1wYXNzQ29udGV4dC5wYXNzQ29uZmlnfHx7fTtsZXR7cGF1c2VBZnRlckxvYWRNcyxuZXR3b3JrUXVpZXRUaHJlc2hvbGRNcyxjcHVRdWlldFRocmVzaG9sZE1zfT1wYXNzQ29uZmlnO2xldCBtYXhXYWl0TXM9cGFzc0NvbnRleHQuc2V0dGluZ3MmJnBhc3NDb250ZXh0LnNldHRpbmdzLm1heFdhaXRGb3JMb2FkO2lmKHR5cGVvZiBwYXVzZUFmdGVyTG9hZE1zIT09J251bWJlcicpcGF1c2VBZnRlckxvYWRNcz1ERUZBVUxUX1BBVVNFX0FGVEVSX0xPQUQ7aWYodHlwZW9mIG5ldHdvcmtRdWlldFRocmVzaG9sZE1zIT09J251bWJlcicpbmV0d29ya1F1aWV0VGhyZXNob2xkTXM9REVGQVVMVF9ORVRXT1JLX1FVSUVUX1RIUkVTSE9MRDtpZih0eXBlb2YgY3B1UXVpZXRUaHJlc2hvbGRNcyE9PSdudW1iZXInKWNwdVF1aWV0VGhyZXNob2xkTXM9REVGQVVMVF9DUFVfUVVJRVRfVEhSRVNIT0xEO2lmKHR5cGVvZiBtYXhXYWl0TXMhPT0nbnVtYmVyJyltYXhXYWl0TXM9Y29uc3RhbnRzLmRlZmF1bHRTZXR0aW5ncy5tYXhXYWl0Rm9yTG9hZDthd2FpdCB0aGlzLl93YWl0Rm9yRnVsbHlMb2FkZWQocGF1c2VBZnRlckxvYWRNcyxuZXR3b3JrUXVpZXRUaHJlc2hvbGRNcyxjcHVRdWlldFRocmVzaG9sZE1zLG1heFdhaXRNcyk7fQpyZXR1cm4gdGhpcy5fZW5kTmV0d29ya1N0YXR1c01vbml0b3JpbmcoKTt9CmFzeW5jIGdldE9iamVjdFByb3BlcnR5KG9iamVjdElkLHByb3BOYW1lKXtjb25zdCBwcm9wZXJ0aWVzUmVzcG9uc2U9YXdhaXQgdGhpcy5zZW5kQ29tbWFuZCgnUnVudGltZS5nZXRQcm9wZXJ0aWVzJyx7b2JqZWN0SWQsYWNjZXNzb3JQcm9wZXJ0aWVzT25seTp0cnVlLGdlbmVyYXRlUHJldmlldzpmYWxzZSxvd25Qcm9wZXJ0aWVzOmZhbHNlfSk7Y29uc3QgcHJvcGVydHlGb3JOYW1lPXByb3BlcnRpZXNSZXNwb25zZS5yZXN1bHQuZmluZChwcm9wZXJ0eT0+cHJvcGVydHkubmFtZT09PXByb3BOYW1lKTtpZihwcm9wZXJ0eUZvck5hbWUmJnByb3BlcnR5Rm9yTmFtZS52YWx1ZSl7cmV0dXJuIHByb3BlcnR5Rm9yTmFtZS52YWx1ZS52YWx1ZTt9ZWxzZXtyZXR1cm4gbnVsbDt9fQpnZXRSZXF1ZXN0Q29udGVudChyZXF1ZXN0SWQsdGltZW91dD0xMDAwKXtyZXF1ZXN0SWQ9TmV0d29ya1JlcXVlc3QuZ2V0UmVxdWVzdElkRm9yQmFja2VuZChyZXF1ZXN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57Y29uc3QgZXJyPW5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLlJFUVVFU1RfQ09OVEVOVF9USU1FT1VUKTtjb25zdCBhc3luY1RpbWVvdXQ9c2V0VGltZW91dChfPT5yZWplY3QoZXJyKSx0aW1lb3V0KTt0aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLmdldFJlc3BvbnNlQm9keScse3JlcXVlc3RJZH0pLnRoZW4ocmVzdWx0PT57Y2xlYXJUaW1lb3V0KGFzeW5jVGltZW91dCk7cmVzb2x2ZShyZXN1bHQuYm9keSk7fSkuY2F0Y2goZT0+e2NsZWFyVGltZW91dChhc3luY1RpbWVvdXQpO3JlamVjdChlKTt9KTt9KTt9CnF1ZXJ5UGVybWlzc2lvblN0YXRlKG5hbWUpe2NvbnN0IGV4cHJlc3Npb25Ub0V2YWw9YAogICAgICBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe25hbWU6ICcke25hbWV9J30pLnRoZW4ocmVzdWx0ID0+IHsKICAgICAgICByZXR1cm4gcmVzdWx0LnN0YXRlOwogICAgICB9KQogICAgYDtyZXR1cm4gdGhpcy5ldmFsdWF0ZUFzeW5jKGV4cHJlc3Npb25Ub0V2YWwpO30KYXN5bmMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcil7Y29uc3QgZG9jdW1lbnRSZXNwb25zZT1hd2FpdCB0aGlzLnNlbmRDb21tYW5kKCdET00uZ2V0RG9jdW1lbnQnKTtjb25zdCByb290Tm9kZUlkPWRvY3VtZW50UmVzcG9uc2Uucm9vdC5ub2RlSWQ7Y29uc3QgdGFyZ2V0Tm9kZT1hd2FpdCB0aGlzLnNlbmRDb21tYW5kKCdET00ucXVlcnlTZWxlY3Rvcicse25vZGVJZDpyb290Tm9kZUlkLHNlbGVjdG9yfSk7aWYodGFyZ2V0Tm9kZS5ub2RlSWQ9PT0wKXtyZXR1cm4gbnVsbDt9CnJldHVybiBuZXcgRWxlbWVudCh0YXJnZXROb2RlLHRoaXMpO30KYXN5bmMgcXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcil7Y29uc3QgZG9jdW1lbnRSZXNwb25zZT1hd2FpdCB0aGlzLnNlbmRDb21tYW5kKCdET00uZ2V0RG9jdW1lbnQnKTtjb25zdCByb290Tm9kZUlkPWRvY3VtZW50UmVzcG9uc2Uucm9vdC5ub2RlSWQ7Y29uc3QgdGFyZ2V0Tm9kZUxpc3Q9YXdhaXQgdGhpcy5zZW5kQ29tbWFuZCgnRE9NLnF1ZXJ5U2VsZWN0b3JBbGwnLHtub2RlSWQ6cm9vdE5vZGVJZCxzZWxlY3Rvcn0pO2NvbnN0IGVsZW1lbnRMaXN0PVtdO3RhcmdldE5vZGVMaXN0Lm5vZGVJZHMuZm9yRWFjaChub2RlSWQ9PntpZihub2RlSWQhPT0wKXtlbGVtZW50TGlzdC5wdXNoKG5ldyBFbGVtZW50KHtub2RlSWR9LHRoaXMpKTt9fSk7cmV0dXJuIGVsZW1lbnRMaXN0O30KZ2V0RWxlbWVudHNJbkRvY3VtZW50KHBpZXJjZT10cnVlKXtyZXR1cm4gdGhpcy5nZXROb2Rlc0luRG9jdW1lbnQocGllcmNlKS50aGVuKG5vZGVzPT5ub2Rlcy5maWx0ZXIobm9kZT0+bm9kZS5ub2RlVHlwZT09PTEpLm1hcChub2RlPT5uZXcgRWxlbWVudCh7bm9kZUlkOm5vZGUubm9kZUlkfSx0aGlzKSkpO30KYXN5bmMgZ2V0Tm9kZXNJbkRvY3VtZW50KHBpZXJjZT10cnVlKXtjb25zdCBmbGF0dGVuZWREb2N1bWVudD1hd2FpdCB0aGlzLnNlbmRDb21tYW5kKCdET00uZ2V0RmxhdHRlbmVkRG9jdW1lbnQnLHtkZXB0aDotMSxwaWVyY2V9KTtyZXR1cm4gZmxhdHRlbmVkRG9jdW1lbnQubm9kZXM/ZmxhdHRlbmVkRG9jdW1lbnQubm9kZXM6W107fQpiZWdpblRyYWNlKHNldHRpbmdzKXtjb25zdCBhZGRpdGlvbmFsQ2F0ZWdvcmllcz1zZXR0aW5ncyYmc2V0dGluZ3MuYWRkaXRpb25hbFRyYWNlQ2F0ZWdvcmllcyYmc2V0dGluZ3MuYWRkaXRpb25hbFRyYWNlQ2F0ZWdvcmllcy5zcGxpdCgnLCcpfHxbXTtjb25zdCB0cmFjZUNhdGVnb3JpZXM9dGhpcy5fdHJhY2VDYXRlZ29yaWVzLmNvbmNhdChhZGRpdGlvbmFsQ2F0ZWdvcmllcyk7Y29uc3QgdW5pcXVlQ2F0ZWdvcmllcz1BcnJheS5mcm9tKG5ldyBTZXQodHJhY2VDYXRlZ29yaWVzKSk7aWYodGhpcy5pc0RvbWFpbkVuYWJsZWQoJ0RlYnVnZ2VyJykpe3Rocm93IG5ldyBFcnJvcignRGVidWdnZXIgZG9tYWluIGVuYWJsZWQgd2hlbiBzdGFydGluZyB0cmFjZScpO30KaWYodGhpcy5pc0RvbWFpbkVuYWJsZWQoJ0NTUycpKXt0aHJvdyBuZXcgRXJyb3IoJ0NTUyBkb21haW4gZW5hYmxlZCB3aGVuIHN0YXJ0aW5nIHRyYWNlJyk7fQppZih0aGlzLmlzRG9tYWluRW5hYmxlZCgnRE9NJykpe3Rocm93IG5ldyBFcnJvcignRE9NIGRvbWFpbiBlbmFibGVkIHdoZW4gc3RhcnRpbmcgdHJhY2UnKTt9CnJldHVybiB0aGlzLnNlbmRDb21tYW5kKCdQYWdlLmVuYWJsZScpLnRoZW4oXz0+dGhpcy5lbmRUcmFjZUlmU3RhcnRlZCgpKS50aGVuKF89PnRoaXMuc2VuZENvbW1hbmQoJ1RyYWNpbmcuc3RhcnQnLHtjYXRlZ29yaWVzOnVuaXF1ZUNhdGVnb3JpZXMuam9pbignLCcpLHRyYW5zZmVyTW9kZTonUmV0dXJuQXNTdHJlYW0nLG9wdGlvbnM6J3NhbXBsaW5nLWZyZXF1ZW5jeT0xMDAwMCd9KSk7fQplbmRUcmFjZUlmU3RhcnRlZCgpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57Y29uc3QgdHJhY2VDYWxsYmFjaz0oKT0+cmVzb2x2ZSgpO3RoaXMub25jZSgnVHJhY2luZy50cmFjaW5nQ29tcGxldGUnLHRyYWNlQ2FsbGJhY2spO3JldHVybiB0aGlzLnNlbmRDb21tYW5kKCdUcmFjaW5nLmVuZCcsdW5kZWZpbmVkLHtzaWxlbnQ6dHJ1ZX0pLmNhdGNoKCgpPT57dGhpcy5vZmYoJ1RyYWNpbmcudHJhY2luZ0NvbXBsZXRlJyx0cmFjZUNhbGxiYWNrKTt0cmFjZUNhbGxiYWNrKCk7fSk7fSk7fQplbmRUcmFjZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57dGhpcy5vbmNlKCdUcmFjaW5nLnRyYWNpbmdDb21wbGV0ZScsY29tcGxldGVFdmVudD0+e3RoaXMuX3JlYWRUcmFjZUZyb21TdHJlYW0oY29tcGxldGVFdmVudCkudGhlbih0cmFjZUNvbnRlbnRzPT5yZXNvbHZlKHRyYWNlQ29udGVudHMpLHJlamVjdCk7fSk7cmV0dXJuIHRoaXMuc2VuZENvbW1hbmQoJ1RyYWNpbmcuZW5kJykuY2F0Y2gocmVqZWN0KTt9KTt9Cl9yZWFkVHJhY2VGcm9tU3RyZWFtKHRyYWNlQ29tcGxldGVFdmVudCl7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntsZXQgaXNFT0Y9ZmFsc2U7Y29uc3QgcGFyc2VyPW5ldyBUcmFjZVBhcnNlcigpO2lmKCF0cmFjZUNvbXBsZXRlRXZlbnQuc3RyZWFtKXtyZXR1cm4gcmVqZWN0KCdObyBzdHJlYW1IYW5kbGUgcmV0dXJuZWQgYnkgdHJhY2VDb21wbGV0ZUV2ZW50Jyk7fQpjb25zdCByZWFkQXJndW1lbnRzPXtoYW5kbGU6dHJhY2VDb21wbGV0ZUV2ZW50LnN0cmVhbX07Y29uc3Qgb25DaHVua1JlYWQ9cmVzcG9uc2U9PntpZihpc0VPRil7cmV0dXJuO30KcGFyc2VyLnBhcnNlQ2h1bmsocmVzcG9uc2UuZGF0YSk7aWYocmVzcG9uc2UuZW9mKXtpc0VPRj10cnVlO3JldHVybiByZXNvbHZlKHBhcnNlci5nZXRUcmFjZSgpKTt9CnJldHVybiB0aGlzLnNlbmRDb21tYW5kKCdJTy5yZWFkJyxyZWFkQXJndW1lbnRzKS50aGVuKG9uQ2h1bmtSZWFkKTt9O3RoaXMuc2VuZENvbW1hbmQoJ0lPLnJlYWQnLHJlYWRBcmd1bWVudHMpLnRoZW4ob25DaHVua1JlYWQpLmNhdGNoKHJlamVjdCk7fSk7fQpiZWdpbkRldnRvb2xzTG9nKCl7dGhpcy5fZGV2dG9vbHNMb2cucmVzZXQoKTt0aGlzLl9kZXZ0b29sc0xvZy5iZWdpblJlY29yZGluZygpO30KZW5kRGV2dG9vbHNMb2coKXt0aGlzLl9kZXZ0b29sc0xvZy5lbmRSZWNvcmRpbmcoKTtyZXR1cm4gdGhpcy5fZGV2dG9vbHNMb2cubWVzc2FnZXM7fQplbmFibGVSdW50aW1lRXZlbnRzKCl7cmV0dXJuIHRoaXMuc2VuZENvbW1hbmQoJ1J1bnRpbWUuZW5hYmxlJyk7fQphc3luYyBiZWdpbkVtdWxhdGlvbihzZXR0aW5ncyl7aWYoIXNldHRpbmdzLmRpc2FibGVEZXZpY2VFbXVsYXRpb24pe2F3YWl0IGVtdWxhdGlvbi5lbmFibGVOZXh1czVYKHRoaXMpO30KYXdhaXQgdGhpcy5zZXRUaHJvdHRsaW5nKHNldHRpbmdzLHt1c2VUaHJvdHRsaW5nOnRydWV9KTt9CmFzeW5jIHNldFRocm90dGxpbmcoc2V0dGluZ3MscGFzc0NvbmZpZyl7aWYoc2V0dGluZ3MudGhyb3R0bGluZ01ldGhvZCE9PSdkZXZ0b29scycpe3JldHVybiBlbXVsYXRpb24uY2xlYXJBbGxOZXR3b3JrRW11bGF0aW9uKHRoaXMpO30KY29uc3QgY3B1UHJvbWlzZT1wYXNzQ29uZmlnLnVzZVRocm90dGxpbmc/ZW11bGF0aW9uLmVuYWJsZUNQVVRocm90dGxpbmcodGhpcyxzZXR0aW5ncy50aHJvdHRsaW5nKTplbXVsYXRpb24uZGlzYWJsZUNQVVRocm90dGxpbmcodGhpcyk7Y29uc3QgbmV0d29ya1Byb21pc2U9cGFzc0NvbmZpZy51c2VUaHJvdHRsaW5nP2VtdWxhdGlvbi5lbmFibGVOZXR3b3JrVGhyb3R0bGluZyh0aGlzLHNldHRpbmdzLnRocm90dGxpbmcpOmVtdWxhdGlvbi5jbGVhckFsbE5ldHdvcmtFbXVsYXRpb24odGhpcyk7YXdhaXQgUHJvbWlzZS5hbGwoW2NwdVByb21pc2UsbmV0d29ya1Byb21pc2VdKTt9CmFzeW5jIGdvT2ZmbGluZSgpe2F3YWl0IHRoaXMuc2VuZENvbW1hbmQoJ05ldHdvcmsuZW5hYmxlJyk7YXdhaXQgZW11bGF0aW9uLmdvT2ZmbGluZSh0aGlzKTt0aGlzLm9ubGluZT1mYWxzZTt9CmFzeW5jIGdvT25saW5lKG9wdGlvbnMpe2F3YWl0IHRoaXMuc2V0VGhyb3R0bGluZyhvcHRpb25zLnNldHRpbmdzLG9wdGlvbnMucGFzc0NvbmZpZyk7dGhpcy5vbmxpbmU9dHJ1ZTt9CmNsZWFuQnJvd3NlckNhY2hlcygpe3JldHVybiB0aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLmNsZWFyQnJvd3NlckNhY2hlJykudGhlbihfPT50aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLnNldENhY2hlRGlzYWJsZWQnLHtjYWNoZURpc2FibGVkOnRydWV9KSkudGhlbihfPT50aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLnNldENhY2hlRGlzYWJsZWQnLHtjYWNoZURpc2FibGVkOmZhbHNlfSkpO30KYXN5bmMgc2V0RXh0cmFIVFRQSGVhZGVycyhoZWFkZXJzKXtpZighaGVhZGVycyl7cmV0dXJuO30KcmV0dXJuIHRoaXMuc2VuZENvbW1hbmQoJ05ldHdvcmsuc2V0RXh0cmFIVFRQSGVhZGVycycse2hlYWRlcnN9KTt9CmNsZWFyRGF0YUZvck9yaWdpbih1cmwpe2NvbnN0IG9yaWdpbj1uZXcgVVJMKHVybCkub3JpZ2luO2NvbnN0IHR5cGVzVG9DbGVhcj1bJ2FwcGNhY2hlJywnZmlsZV9zeXN0ZW1zJywnaW5kZXhlZGRiJywnbG9jYWxfc3RvcmFnZScsJ3NoYWRlcl9jYWNoZScsJ3dlYnNxbCcsJ3NlcnZpY2Vfd29ya2VycycsJ2NhY2hlX3N0b3JhZ2UnXS5qb2luKCcsJyk7cmV0dXJuIHRoaXMuc2VuZENvbW1hbmQoJ1N0b3JhZ2UuY2xlYXJEYXRhRm9yT3JpZ2luJyx7b3JpZ2luOm9yaWdpbixzdG9yYWdlVHlwZXM6dHlwZXNUb0NsZWFyfSk7fQphc3luYyBjYWNoZU5hdGl2ZXMoKXthd2FpdCB0aGlzLmV2YWx1YXRlU2NyaXB0T25OZXdEb2N1bWVudChgd2luZG93Ll9fbmF0aXZlUHJvbWlzZSA9IFByb21pc2U7CiAgICAgICAgd2luZG93Ll9fbmF0aXZlRXJyb3IgPSBFcnJvcjtgKTt9CmFzeW5jIHJlZ2lzdGVyUGVyZm9ybWFuY2VPYnNlcnZlcigpe2NvbnN0IHNjcmlwdFN0cj1gKCR7cGFnZUZ1bmN0aW9ucy5yZWdpc3RlclBlcmZvcm1hbmNlT2JzZXJ2ZXJJblBhZ2UudG9TdHJpbmcoKX0pKClgO2F3YWl0IHRoaXMuZXZhbHVhdGVTY3JpcHRPbk5ld0RvY3VtZW50KHNjcmlwdFN0cik7fQpibG9ja1VybFBhdHRlcm5zKHVybHMpe3JldHVybiB0aGlzLnNlbmRDb21tYW5kKCdOZXR3b3JrLnNldEJsb2NrZWRVUkxzJyx7dXJsc30pLmNhdGNoKGVycj0+e2lmKCEvd2Fzbid0IGZvdW5kLy50ZXN0KGVyci5tZXNzYWdlKSl7dGhyb3cgZXJyO319KTt9CmFzeW5jIGRpc21pc3NKYXZhU2NyaXB0RGlhbG9ncygpe2F3YWl0IHRoaXMuc2VuZENvbW1hbmQoJ1BhZ2UuZW5hYmxlJyk7dGhpcy5vbignUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsZGF0YT0+e2xvZy53YXJuKCdEcml2ZXInLGAke2RhdGEudHlwZX0gZGlhbG9nIG9wZW5lZCBieSB0aGUgcGFnZSBhdXRvbWF0aWNhbGx5IHN1cHByZXNzZWQuYCk7dGhpcy5zZW5kQ29tbWFuZCgnUGFnZS5oYW5kbGVKYXZhU2NyaXB0RGlhbG9nJyx7YWNjZXB0OnRydWUscHJvbXB0VGV4dDonTGlnaHRob3VzZSBwcm9tcHQgcmVzcG9uc2UnfSk7fSk7fX0KRHJpdmVyLnByb3RvdHlwZS5vbj1mdW5jdGlvbiBvbihldmVudE5hbWUsY2Ipe2lmKHRoaXMuX2V2ZW50RW1pdHRlcj09PW51bGwpe3Rocm93IG5ldyBFcnJvcignY29ubmVjdCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGxpc3RlbiB0byBldmVudHMuJyk7fQpsb2cuZm9ybWF0UHJvdG9jb2woJ2xpc3RlbiBmb3IgZXZlbnQgPT4nLHttZXRob2Q6ZXZlbnROYW1lfSwndmVyYm9zZScpO3RoaXMuX2V2ZW50RW1pdHRlci5vbihldmVudE5hbWUsY2IpO307RHJpdmVyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uIG9uY2UoZXZlbnROYW1lLGNiKXtpZih0aGlzLl9ldmVudEVtaXR0ZXI9PT1udWxsKXt0aHJvdyBuZXcgRXJyb3IoJ2Nvbm5lY3QoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBsaXN0ZW4gdG8gZXZlbnRzLicpO30KbG9nLmZvcm1hdFByb3RvY29sKCdsaXN0ZW4gb25jZSBmb3IgZXZlbnQgPT4nLHttZXRob2Q6ZXZlbnROYW1lfSwndmVyYm9zZScpO3RoaXMuX2V2ZW50RW1pdHRlci5vbmNlKGV2ZW50TmFtZSxjYik7fTtEcml2ZXIucHJvdG90eXBlLm9mZj1mdW5jdGlvbiBvZmYoZXZlbnROYW1lLGNiKXtpZih0aGlzLl9ldmVudEVtaXR0ZXI9PT1udWxsKXt0aHJvdyBuZXcgRXJyb3IoJ2Nvbm5lY3QoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuJyk7fQp0aGlzLl9ldmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLGNiKTt9O2Z1bmN0aW9uIF9zZW5kQ29tbWFuZChtZXRob2QscGFyYW1zPXt9LGNtZE9wdHM9e30pe2NvbnN0IGRvbWFpbkNvbW1hbmQ9L14oXHcrKVwuKGVuYWJsZXxkaXNhYmxlKSQvLmV4ZWMobWV0aG9kKTtpZihkb21haW5Db21tYW5kKXtjb25zdCBlbmFibGU9ZG9tYWluQ29tbWFuZFsyXT09PSdlbmFibGUnO2lmKCF0aGlzLl9zaG91bGRUb2dnbGVEb21haW4oZG9tYWluQ29tbWFuZFsxXSxlbmFibGUpKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fX0KcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uc2VuZENvbW1hbmQobWV0aG9kLHBhcmFtcyxjbWRPcHRzKTt9CkRyaXZlci5wcm90b3R5cGUuc2VuZENvbW1hbmQ9X3NlbmRDb21tYW5kO21vZHVsZS5leHBvcnRzPURyaXZlcjt9LHsiLi4vY29uZmlnL2NvbnN0YW50cyI6OCwiLi4vbGliL2VsZW1lbnQiOjMxLCIuLi9saWIvZW11bGF0aW9uIjozMiwiLi4vbGliL2Vycm9ycyI6MzMsIi4uL2xpYi9uZXR3b3JrLXJlY29yZGVyIjozNywiLi4vbGliL25ldHdvcmstcmVxdWVzdCI6MzgsIi4uL2xpYi9wYWdlLWZ1bmN0aW9ucy5qcyI6MzksIi4uL2xpYi90cmFjZXMvdHJhY2UtcGFyc2VyIjo0NSwiLi4vbGliL3VybC1zaGltIjoidXJsIiwiLi9jb25uZWN0aW9ucy9jb25uZWN0aW9uLmpzIjoxNCwiLi9kZXZ0b29scy1sb2ciOjE2LCJldmVudHMiOjYyLCJsaWdodGhvdXNlLWxvZ2dlciI6MTI1fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBsb2c9cmVxdWlyZSgnbGlnaHRob3VzZS1sb2dnZXInKTtjb25zdCBMSEVycm9yPXJlcXVpcmUoJy4uL2xpYi9lcnJvcnMnKTtjb25zdCBVUkw9cmVxdWlyZSgnLi4vbGliL3VybC1zaGltJyk7Y29uc3QgTmV0d29ya1JlY29yZGVyPXJlcXVpcmUoJy4uL2xpYi9uZXR3b3JrLXJlY29yZGVyLmpzJyk7Y29uc3QgY29uc3RhbnRzPXJlcXVpcmUoJy4uL2NvbmZpZy9jb25zdGFudHMnKTtjb25zdCBEcml2ZXI9cmVxdWlyZSgnLi4vZ2F0aGVyL2RyaXZlci5qcycpO2NsYXNzIEdhdGhlclJ1bm5lcntzdGF0aWMgYXN5bmMgbG9hZEJsYW5rKGRyaXZlcix1cmw9Y29uc3RhbnRzLmRlZmF1bHRQYXNzQ29uZmlnLmJsYW5rUGFnZSxkdXJhdGlvbj1jb25zdGFudHMuZGVmYXVsdFBhc3NDb25maWcuYmxhbmtEdXJhdGlvbikKe2F3YWl0IGRyaXZlci5nb3RvVVJMKHVybCk7YXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZT0+c2V0VGltZW91dChyZXNvbHZlLGR1cmF0aW9uKSk7fQpzdGF0aWMgYXN5bmMgbG9hZFBhZ2UoZHJpdmVyLHBhc3NDb250ZXh0KXtjb25zdCBmaW5hbFVybD1hd2FpdCBkcml2ZXIuZ290b1VSTChwYXNzQ29udGV4dC51cmwse3dhaXRGb3JMb2FkOnRydWUscGFzc0NvbnRleHR9KTtwYXNzQ29udGV4dC51cmw9ZmluYWxVcmw7fQpzdGF0aWMgYXN5bmMgc2V0dXBEcml2ZXIoZHJpdmVyLG9wdGlvbnMpe2xvZy5sb2coJ3N0YXR1cycsJ0luaXRpYWxpemluZ+KApicpO2NvbnN0IHJlc2V0U3RvcmFnZT0hb3B0aW9ucy5zZXR0aW5ncy5kaXNhYmxlU3RvcmFnZVJlc2V0O2F3YWl0IGRyaXZlci5hc3NlcnROb1NhbWVPcmlnaW5TZXJ2aWNlV29ya2VyQ2xpZW50cyhvcHRpb25zLnJlcXVlc3RlZFVybCk7YXdhaXQgZHJpdmVyLmJlZ2luRW11bGF0aW9uKG9wdGlvbnMuc2V0dGluZ3MpO2F3YWl0IGRyaXZlci5lbmFibGVSdW50aW1lRXZlbnRzKCk7YXdhaXQgZHJpdmVyLmNhY2hlTmF0aXZlcygpO2F3YWl0IGRyaXZlci5yZWdpc3RlclBlcmZvcm1hbmNlT2JzZXJ2ZXIoKTthd2FpdCBkcml2ZXIuZGlzbWlzc0phdmFTY3JpcHREaWFsb2dzKCk7aWYocmVzZXRTdG9yYWdlKWF3YWl0IGRyaXZlci5jbGVhckRhdGFGb3JPcmlnaW4ob3B0aW9ucy5yZXF1ZXN0ZWRVcmwpO30Kc3RhdGljIGRpc3Bvc2VEcml2ZXIoZHJpdmVyKXtsb2cubG9nKCdzdGF0dXMnLCdEaXNjb25uZWN0aW5nIGZyb20gYnJvd3Nlci4uLicpO3JldHVybiBkcml2ZXIuZGlzY29ubmVjdCgpLmNhdGNoKGVycj0+e2lmKCEvY2xvc2VcLy4qc3RhdHVzOiA1MDAkLy50ZXN0KGVyci5tZXNzYWdlKSl7bG9nLmVycm9yKCdHYXRoZXJSdW5uZXIgZGlzY29ubmVjdCcsZXJyLm1lc3NhZ2UpO319KTt9CnN0YXRpYyByZWNvdmVyT3JUaHJvdyhwcm9taXNlKXtyZXR1cm4gcHJvbWlzZS5jYXRjaChlcnI9PntpZihlcnIuZmF0YWwpe3Rocm93IGVycjt9fSk7fQpzdGF0aWMgZ2V0UGFnZUxvYWRFcnJvcih1cmwsbmV0d29ya1JlY29yZHMpe2NvbnN0IG1haW5SZWNvcmQ9bmV0d29ya1JlY29yZHMuZmluZChyZWNvcmQ9PntyZXR1cm4gVVJMLmVxdWFsV2l0aEV4Y2x1ZGVkRnJhZ21lbnRzKHJlY29yZC51cmwsdXJsKTt9KTtsZXQgZXJyb3JDb2RlO2xldCBlcnJvclJlYXNvbjtpZighbWFpblJlY29yZCl7ZXJyb3JDb2RlPUxIRXJyb3IuZXJyb3JzLk5PX0RPQ1VNRU5UX1JFUVVFU1Q7fWVsc2UgaWYobWFpblJlY29yZC5mYWlsZWQpe2Vycm9yQ29kZT1MSEVycm9yLmVycm9ycy5GQUlMRURfRE9DVU1FTlRfUkVRVUVTVDtlcnJvclJlYXNvbj1tYWluUmVjb3JkLmxvY2FsaXplZEZhaWxEZXNjcmlwdGlvbjt9CmlmKGVycm9yQ29kZSl7Y29uc3QgZXJyb3I9bmV3IExIRXJyb3IoZXJyb3JDb2RlLHtyZWFzb246ZXJyb3JSZWFzb259KTtsb2cuZXJyb3IoJ0dhdGhlclJ1bm5lcicsZXJyb3IubWVzc2FnZSx1cmwpO3JldHVybiBlcnJvcjt9fQpzdGF0aWMgYXN5bmMgYmVmb3JlUGFzcyhwYXNzQ29udGV4dCxnYXRoZXJlclJlc3VsdHMpe2NvbnN0IGJsb2NrZWRVcmxzPShwYXNzQ29udGV4dC5wYXNzQ29uZmlnLmJsb2NrZWRVcmxQYXR0ZXJuc3x8W10pLmNvbmNhdChwYXNzQ29udGV4dC5zZXR0aW5ncy5ibG9ja2VkVXJsUGF0dGVybnN8fFtdKTtjb25zdCBibGFua1BhZ2U9cGFzc0NvbnRleHQucGFzc0NvbmZpZy5ibGFua1BhZ2U7Y29uc3QgYmxhbmtEdXJhdGlvbj1wYXNzQ29udGV4dC5wYXNzQ29uZmlnLmJsYW5rRHVyYXRpb247YXdhaXQgR2F0aGVyUnVubmVyLmxvYWRCbGFuayhwYXNzQ29udGV4dC5kcml2ZXIsYmxhbmtQYWdlLGJsYW5rRHVyYXRpb24pO2F3YWl0IHBhc3NDb250ZXh0LmRyaXZlci5ibG9ja1VybFBhdHRlcm5zKGJsb2NrZWRVcmxzKTthd2FpdCBwYXNzQ29udGV4dC5kcml2ZXIuc2V0RXh0cmFIVFRQSGVhZGVycyhwYXNzQ29udGV4dC5zZXR0aW5ncy5leHRyYUhlYWRlcnMpO2Zvcihjb25zdCBnYXRoZXJlckRlZm4gb2YgcGFzc0NvbnRleHQucGFzc0NvbmZpZy5nYXRoZXJlcnMpe2NvbnN0IGdhdGhlcmVyPWdhdGhlcmVyRGVmbi5pbnN0YW5jZTtwYXNzQ29udGV4dC5vcHRpb25zPWdhdGhlcmVyRGVmbi5vcHRpb25zfHx7fTtjb25zdCBhcnRpZmFjdFByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkudGhlbihfPT5nYXRoZXJlci5iZWZvcmVQYXNzKHBhc3NDb250ZXh0KSk7Z2F0aGVyZXJSZXN1bHRzW2dhdGhlcmVyLm5hbWVdPVthcnRpZmFjdFByb21pc2VdO2F3YWl0IEdhdGhlclJ1bm5lci5yZWNvdmVyT3JUaHJvdyhhcnRpZmFjdFByb21pc2UpO319CnN0YXRpYyBhc3luYyBwYXNzKHBhc3NDb250ZXh0LGdhdGhlcmVyUmVzdWx0cyl7Y29uc3QgZHJpdmVyPXBhc3NDb250ZXh0LmRyaXZlcjtjb25zdCBjb25maWc9cGFzc0NvbnRleHQucGFzc0NvbmZpZztjb25zdCBzZXR0aW5ncz1wYXNzQ29udGV4dC5zZXR0aW5ncztjb25zdCBnYXRoZXJlcnM9Y29uZmlnLmdhdGhlcmVycztjb25zdCByZWNvcmRUcmFjZT1jb25maWcucmVjb3JkVHJhY2U7Y29uc3QgaXNQZXJmUnVuPSFzZXR0aW5ncy5kaXNhYmxlU3RvcmFnZVJlc2V0JiZyZWNvcmRUcmFjZSYmY29uZmlnLnVzZVRocm90dGxpbmc7Y29uc3QgZ2F0aGVyZXJuYW1lcz1nYXRoZXJlcnMubWFwKGc9PmcuaW5zdGFuY2UubmFtZSkuam9pbignLCAnKTtjb25zdCBzdGF0dXM9J0xvYWRpbmcgcGFnZSAmIHdhaXRpbmcgZm9yIG9ubG9hZCc7bG9nLmxvZygnc3RhdHVzJyxzdGF0dXMsZ2F0aGVyZXJuYW1lcyk7aWYoaXNQZXJmUnVuKWF3YWl0IGRyaXZlci5jbGVhbkJyb3dzZXJDYWNoZXMoKTthd2FpdCBkcml2ZXIuYmVnaW5EZXZ0b29sc0xvZygpO2lmKHJlY29yZFRyYWNlKWF3YWl0IGRyaXZlci5iZWdpblRyYWNlKHNldHRpbmdzKTthd2FpdCBHYXRoZXJSdW5uZXIubG9hZFBhZ2UoZHJpdmVyLHBhc3NDb250ZXh0KTtsb2cubG9nKCdzdGF0dXNFbmQnLHN0YXR1cyk7Zm9yKGNvbnN0IGdhdGhlcmVyRGVmbiBvZiBnYXRoZXJlcnMpe2NvbnN0IGdhdGhlcmVyPWdhdGhlcmVyRGVmbi5pbnN0YW5jZTtwYXNzQ29udGV4dC5vcHRpb25zPWdhdGhlcmVyRGVmbi5vcHRpb25zfHx7fTtjb25zdCBhcnRpZmFjdFByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkudGhlbihfPT5nYXRoZXJlci5wYXNzKHBhc3NDb250ZXh0KSk7Y29uc3QgZ2F0aGVyZXJSZXN1bHQ9Z2F0aGVyZXJSZXN1bHRzW2dhdGhlcmVyLm5hbWVdfHxbXTtnYXRoZXJlclJlc3VsdC5wdXNoKGFydGlmYWN0UHJvbWlzZSk7Z2F0aGVyZXJSZXN1bHRzW2dhdGhlcmVyLm5hbWVdPWdhdGhlcmVyUmVzdWx0O2F3YWl0IEdhdGhlclJ1bm5lci5yZWNvdmVyT3JUaHJvdyhhcnRpZmFjdFByb21pc2UpO319CnN0YXRpYyBhc3luYyBhZnRlclBhc3MocGFzc0NvbnRleHQsZ2F0aGVyZXJSZXN1bHRzKXtjb25zdCBkcml2ZXI9cGFzc0NvbnRleHQuZHJpdmVyO2NvbnN0IGNvbmZpZz1wYXNzQ29udGV4dC5wYXNzQ29uZmlnO2NvbnN0IGdhdGhlcmVycz1jb25maWcuZ2F0aGVyZXJzO2xldCB0cmFjZTtpZihjb25maWcucmVjb3JkVHJhY2Upe2xvZy5sb2coJ3N0YXR1cycsJ1JldHJpZXZpbmcgdHJhY2UnKTt0cmFjZT1hd2FpdCBkcml2ZXIuZW5kVHJhY2UoKTtsb2cudmVyYm9zZSgnc3RhdHVzRW5kJywnUmV0cmlldmluZyB0cmFjZScpO30KY29uc3Qgc3RhdHVzPSdSZXRyaWV2aW5nIGRldnRvb2xzTG9nIGFuZCBuZXR3b3JrIHJlY29yZHMnO2xvZy5sb2coJ3N0YXR1cycsc3RhdHVzKTtjb25zdCBkZXZ0b29sc0xvZz1kcml2ZXIuZW5kRGV2dG9vbHNMb2coKTtjb25zdCBuZXR3b3JrUmVjb3Jkcz1OZXR3b3JrUmVjb3JkZXIucmVjb3Jkc0Zyb21Mb2dzKGRldnRvb2xzTG9nKTtsb2cudmVyYm9zZSgnc3RhdHVzRW5kJyxzdGF0dXMpO2xldCBwYWdlTG9hZEVycm9yPUdhdGhlclJ1bm5lci5nZXRQYWdlTG9hZEVycm9yKHBhc3NDb250ZXh0LnVybCxuZXR3b3JrUmVjb3Jkcyk7aWYoIWRyaXZlci5vbmxpbmUpcGFnZUxvYWRFcnJvcj11bmRlZmluZWQ7aWYocGFnZUxvYWRFcnJvcil7cGFzc0NvbnRleHQuTGlnaHRob3VzZVJ1bldhcm5pbmdzLnB1c2goJ0xpZ2h0aG91c2Ugd2FzIHVuYWJsZSB0byByZWxpYWJseSBsb2FkIHRoZSAnKydwYWdlIHlvdSByZXF1ZXN0ZWQuIE1ha2Ugc3VyZSB5b3UgYXJlIHRlc3RpbmcgdGhlIGNvcnJlY3QgVVJMIGFuZCB0aGF0IHRoZSBzZXJ2ZXIgaXMgJysncHJvcGVybHkgcmVzcG9uZGluZyB0byBhbGwgcmVxdWVzdHMuJyk7fQpjb25zdCBwYXNzRGF0YT17bmV0d29ya1JlY29yZHMsZGV2dG9vbHNMb2csdHJhY2V9O2F3YWl0IGRyaXZlci5zZXRUaHJvdHRsaW5nKHBhc3NDb250ZXh0LnNldHRpbmdzLHt1c2VUaHJvdHRsaW5nOmZhbHNlfSk7Zm9yKGNvbnN0IGdhdGhlcmVyRGVmbiBvZiBnYXRoZXJlcnMpe2NvbnN0IGdhdGhlcmVyPWdhdGhlcmVyRGVmbi5pbnN0YW5jZTtjb25zdCBzdGF0dXM9YFJldHJpZXZpbmc6ICR7Z2F0aGVyZXIubmFtZX1gO2xvZy5sb2coJ3N0YXR1cycsc3RhdHVzKTtwYXNzQ29udGV4dC5vcHRpb25zPWdhdGhlcmVyRGVmbi5vcHRpb25zfHx7fTtjb25zdCBhcnRpZmFjdFByb21pc2U9cGFnZUxvYWRFcnJvcj9Qcm9taXNlLnJlamVjdChwYWdlTG9hZEVycm9yKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKF89PmdhdGhlcmVyLmFmdGVyUGFzcyhwYXNzQ29udGV4dCxwYXNzRGF0YSkpO2NvbnN0IGdhdGhlcmVyUmVzdWx0PWdhdGhlcmVyUmVzdWx0c1tnYXRoZXJlci5uYW1lXXx8W107Z2F0aGVyZXJSZXN1bHQucHVzaChhcnRpZmFjdFByb21pc2UpO2dhdGhlcmVyUmVzdWx0c1tnYXRoZXJlci5uYW1lXT1nYXRoZXJlclJlc3VsdDthd2FpdCBHYXRoZXJSdW5uZXIucmVjb3Zlck9yVGhyb3coYXJ0aWZhY3RQcm9taXNlKTtsb2cudmVyYm9zZSgnc3RhdHVzRW5kJyxzdGF0dXMpO30KcmV0dXJuIHBhc3NEYXRhO30Kc3RhdGljIGFzeW5jIGNvbGxlY3RBcnRpZmFjdHMoZ2F0aGVyZXJSZXN1bHRzLGJhc2VBcnRpZmFjdHMpe2NvbnN0IGdhdGhlcmVyQXJ0aWZhY3RzPXt9O2NvbnN0IHBhZ2VMb2FkRmFpbHVyZXM9W107Y29uc3QgcmVzdWx0c0VudHJpZXM9T2JqZWN0LmVudHJpZXMoZ2F0aGVyZXJSZXN1bHRzKTtmb3IoY29uc3RbZ2F0aGVyZXJOYW1lLHBoYXNlUmVzdWx0c1Byb21pc2VzXW9mIHJlc3VsdHNFbnRyaWVzKXtpZihnYXRoZXJlckFydGlmYWN0c1tnYXRoZXJlck5hbWVdIT09dW5kZWZpbmVkKWNvbnRpbnVlO3RyeXtjb25zdCBwaGFzZVJlc3VsdHM9YXdhaXQgUHJvbWlzZS5hbGwocGhhc2VSZXN1bHRzUHJvbWlzZXMpO2NvbnN0IGRlZmluZWRSZXN1bHRzPXBoYXNlUmVzdWx0cy5maWx0ZXIoZWxlbWVudD0+ZWxlbWVudCE9PXVuZGVmaW5lZCk7Y29uc3QgYXJ0aWZhY3Q9ZGVmaW5lZFJlc3VsdHNbZGVmaW5lZFJlc3VsdHMubGVuZ3RoLTFdO2dhdGhlcmVyQXJ0aWZhY3RzW2dhdGhlcmVyTmFtZV09YXJ0aWZhY3Q7fWNhdGNoKGVycil7Z2F0aGVyZXJBcnRpZmFjdHNbZ2F0aGVyZXJOYW1lXT1lcnI7aWYoTEhFcnJvci5pc1BhZ2VMb2FkRXJyb3IoZXJyKSlwYWdlTG9hZEZhaWx1cmVzLnB1c2goZXJyKTt9CmlmKGdhdGhlcmVyQXJ0aWZhY3RzW2dhdGhlcmVyTmFtZV09PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcihgJHtnYXRoZXJlck5hbWV9IGZhaWxlZCB0byBwcm92aWRlIGFuIGFydGlmYWN0LmApO30KaWYocGFnZUxvYWRGYWlsdXJlcy5sZW5ndGg+T2JqZWN0LmtleXMoZ2F0aGVyZXJBcnRpZmFjdHMpLmxlbmd0aCowLjUpe3Rocm93IHBhZ2VMb2FkRmFpbHVyZXNbMF07fX0KYmFzZUFydGlmYWN0cy5MaWdodGhvdXNlUnVuV2FybmluZ3M9QXJyYXkuZnJvbShuZXcgU2V0KGJhc2VBcnRpZmFjdHMuTGlnaHRob3VzZVJ1bldhcm5pbmdzKSk7cmV0dXJuey4uLmJhc2VBcnRpZmFjdHMsLi4uZ2F0aGVyZXJBcnRpZmFjdHN9O30Kc3RhdGljIGFzeW5jIGdldEJhc2VBcnRpZmFjdHMob3B0aW9ucyl7cmV0dXJue2ZldGNoVGltZTpuZXcgRGF0ZSgpLnRvSlNPTigpLExpZ2h0aG91c2VSdW5XYXJuaW5nczpbXSxVc2VyQWdlbnQ6YXdhaXQgb3B0aW9ucy5kcml2ZXIuZ2V0VXNlckFnZW50KCksdHJhY2VzOnt9LGRldnRvb2xzTG9nczp7fSxzZXR0aW5nczpvcHRpb25zLnNldHRpbmdzLFVSTDp7cmVxdWVzdGVkVXJsOm9wdGlvbnMucmVxdWVzdGVkVXJsLGZpbmFsVXJsOicnfX07fQpzdGF0aWMgYXN5bmMgcnVuKHBhc3NlcyxvcHRpb25zKXtjb25zdCBkcml2ZXI9b3B0aW9ucy5kcml2ZXI7Y29uc3QgZ2F0aGVyZXJSZXN1bHRzPXt9O3RyeXthd2FpdCBkcml2ZXIuY29ubmVjdCgpO2NvbnN0IGJhc2VBcnRpZmFjdHM9YXdhaXQgR2F0aGVyUnVubmVyLmdldEJhc2VBcnRpZmFjdHMob3B0aW9ucyk7YXdhaXQgR2F0aGVyUnVubmVyLmxvYWRCbGFuayhkcml2ZXIpO2F3YWl0IEdhdGhlclJ1bm5lci5zZXR1cERyaXZlcihkcml2ZXIsb3B0aW9ucyk7bGV0IGZpcnN0UGFzcz10cnVlO2Zvcihjb25zdCBwYXNzQ29uZmlnIG9mIHBhc3Nlcyl7Y29uc3QgcGFzc0NvbnRleHQ9e2RyaXZlcjpvcHRpb25zLmRyaXZlcix1cmw6b3B0aW9ucy5yZXF1ZXN0ZWRVcmwsc2V0dGluZ3M6b3B0aW9ucy5zZXR0aW5ncyxwYXNzQ29uZmlnLExpZ2h0aG91c2VSdW5XYXJuaW5nczpiYXNlQXJ0aWZhY3RzLkxpZ2h0aG91c2VSdW5XYXJuaW5nc307YXdhaXQgZHJpdmVyLnNldFRocm90dGxpbmcob3B0aW9ucy5zZXR0aW5ncyxwYXNzQ29uZmlnKTthd2FpdCBHYXRoZXJSdW5uZXIuYmVmb3JlUGFzcyhwYXNzQ29udGV4dCxnYXRoZXJlclJlc3VsdHMpO2F3YWl0IEdhdGhlclJ1bm5lci5wYXNzKHBhc3NDb250ZXh0LGdhdGhlcmVyUmVzdWx0cyk7Y29uc3QgcGFzc0RhdGE9YXdhaXQgR2F0aGVyUnVubmVyLmFmdGVyUGFzcyhwYXNzQ29udGV4dCxnYXRoZXJlclJlc3VsdHMpO2Jhc2VBcnRpZmFjdHMuZGV2dG9vbHNMb2dzW3Bhc3NDb25maWcucGFzc05hbWVdPXBhc3NEYXRhLmRldnRvb2xzTG9nO2lmKHBhc3NEYXRhLnRyYWNlKXtiYXNlQXJ0aWZhY3RzLnRyYWNlc1twYXNzQ29uZmlnLnBhc3NOYW1lXT1wYXNzRGF0YS50cmFjZTt9CmlmKGZpcnN0UGFzcyl7YmFzZUFydGlmYWN0cy5VUkwuZmluYWxVcmw9cGFzc0NvbnRleHQudXJsO2ZpcnN0UGFzcz1mYWxzZTt9fQphd2FpdCBHYXRoZXJSdW5uZXIuZGlzcG9zZURyaXZlcihkcml2ZXIpO3JldHVybiBHYXRoZXJSdW5uZXIuY29sbGVjdEFydGlmYWN0cyhnYXRoZXJlclJlc3VsdHMsYmFzZUFydGlmYWN0cyk7fWNhdGNoKGVycil7R2F0aGVyUnVubmVyLmRpc3Bvc2VEcml2ZXIoZHJpdmVyKTt0aHJvdyBlcnI7fX19Cm1vZHVsZS5leHBvcnRzPUdhdGhlclJ1bm5lcjt9LHsiLi4vY29uZmlnL2NvbnN0YW50cyI6OCwiLi4vZ2F0aGVyL2RyaXZlci5qcyI6MTcsIi4uL2xpYi9lcnJvcnMiOjMzLCIuLi9saWIvbmV0d29yay1yZWNvcmRlci5qcyI6MzcsIi4uL2xpYi91cmwtc2hpbSI6InVybCIsImxpZ2h0aG91c2UtbG9nZ2VyIjoxMjV9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NsYXNzIEdhdGhlcmVye2dldCBuYW1lKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTt9CmJlZm9yZVBhc3MocGFzc0NvbnRleHQpe30KcGFzcyhwYXNzQ29udGV4dCl7fQphZnRlclBhc3MocGFzc0NvbnRleHQsbG9hZERhdGEpe319Cm1vZHVsZS5leHBvcnRzPUdhdGhlcmVyO30se31dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgaXNFcXVhbD1yZXF1aXJlKCdsb2Rhc2guaXNlcXVhbCcpO21vZHVsZS5leHBvcnRzPWNsYXNzIEFyYml0cmFyeUVxdWFsaXR5TWFwe2NvbnN0cnVjdG9yKCl7dGhpcy5fZXF1YWxzRm49KGEsYik9PmE9PT1iO3RoaXMuX2VudHJpZXM9W107fQpzZXRFcXVhbGl0eUZuKGVxdWFsc0ZuKXt0aGlzLl9lcXVhbHNGbj1lcXVhbHNGbjt9CmhhcyhrZXkpe3JldHVybiB0aGlzLl9maW5kSW5kZXhPZihrZXkpIT09LTE7fQpnZXQoa2V5KXtjb25zdCBlbnRyeT10aGlzLl9lbnRyaWVzW3RoaXMuX2ZpbmRJbmRleE9mKGtleSldO3JldHVybiBlbnRyeSYmZW50cnkudmFsdWU7fQpzZXQoa2V5LHZhbHVlKXtsZXQgaW5kZXg9dGhpcy5fZmluZEluZGV4T2Yoa2V5KTtpZihpbmRleD09PS0xKWluZGV4PXRoaXMuX2VudHJpZXMubGVuZ3RoO3RoaXMuX2VudHJpZXNbaW5kZXhdPXtrZXksdmFsdWV9O30KX2ZpbmRJbmRleE9mKGtleSl7Zm9yKGxldCBpPTA7aTx0aGlzLl9lbnRyaWVzLmxlbmd0aDtpKyspe2lmKHRoaXMuX2VxdWFsc0ZuKGtleSx0aGlzLl9lbnRyaWVzW2ldLmtleSkpcmV0dXJuIGk7fQpyZXR1cm4tMTt9CnN0YXRpYyBkZWVwRXF1YWxzKG9iakEsb2JqQil7cmV0dXJuIGlzRXF1YWwob2JqQSxvYmpCKTt9fTt9LHsibG9kYXNoLmlzZXF1YWwiOjEyNn1dLDIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7J3VzZSBzdHJpY3QnO2NvbnN0IHBhdGg9cmVxdWlyZSgncGF0aCcpO2NvbnN0IGxvZz1yZXF1aXJlKCdsaWdodGhvdXNlLWxvZ2dlcicpO2NvbnN0IHN0cmVhbT1yZXF1aXJlKCdzdHJlYW0nKTtjb25zdCBTaW11bGF0b3I9cmVxdWlyZSgnLi9kZXBlbmRlbmN5LWdyYXBoL3NpbXVsYXRvci9zaW11bGF0b3InKTtjb25zdCBsYW50ZXJuVHJhY2VTYXZlcj1yZXF1aXJlKCcuL2xhbnRlcm4tdHJhY2Utc2F2ZXInKTtjb25zdCBNZXRyaWNzPXJlcXVpcmUoJy4vdHJhY2VzL3B3bWV0cmljcy1ldmVudHMnKTtjb25zdCBUcmFjZVBhcnNlcj1yZXF1aXJlKCcuL3RyYWNlcy90cmFjZS1wYXJzZXInKTtjb25zdCByaW1yYWY9cmVxdWlyZSgncmltcmFmJyk7Y29uc3QgbWtkaXJwPXJlcXVpcmUoJ21rZGlycCcpO2NvbnN0IGFydGlmYWN0c0ZpbGVuYW1lPSdhcnRpZmFjdHMuanNvbic7Y29uc3QgdHJhY2VTdWZmaXg9Jy50cmFjZS5qc29uJztjb25zdCBkZXZ0b29sc0xvZ1N1ZmZpeD0nLmRldnRvb2xzbG9nLmpzb24nO2Z1bmN0aW9uIHNjcmVlbnNob3REdW1wKHNjcmVlbnNob3RzKXtyZXR1cm5gCiAgPCFkb2N0eXBlIGh0bWw+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5zY3JlZW5zaG90czwvdGl0bGU+CiAgPHN0eWxlPgpodG1sIHsKICAgIG92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIGhlaWdodDogMTAwJTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAjNGNhMWFmICwgI2M0ZTBlNSk7CiAgICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOwogICAgcGFkZGluZzogMTBweDsKfQpib2R5IHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgIzRjYTFhZiAsICNjNGUwZTUpOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXJnaW46IDA7Cn0KaW1nIHsKICAgIG1hcmdpbjogNHB4Owp9Cjwvc3R5bGU+CiAgPGJvZHk+CiAgICA8c2NyaXB0PgogICAgICB2YXIgc2hvdHMgPSAke0pTT04uc3RyaW5naWZ5KHNjcmVlbnNob3RzKX07CgogIHNob3RzLmZvckVhY2gocyA9PiB7CiAgICB2YXIgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgaS5zcmMgPSBzLmRhdGF1cmk7CiAgICBpLnRpdGxlID0gcy50aW1lc3RhbXA7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpOwogIH0pOwogIDwvc2NyaXB0PgogIGA7fQphc3luYyBmdW5jdGlvbiBsb2FkQXJ0aWZhY3RzKGJhc2VQYXRoKXtsb2cubG9nKCdSZWFkaW5nIGFydGlmYWN0cyBmcm9tIGRpc2s6JyxiYXNlUGF0aCk7aWYoIWZzLmV4aXN0c1N5bmMoYmFzZVBhdGgpKXt0aHJvdyBuZXcgRXJyb3IoJ05vIHNhdmVkIGFydGlmYWN0cyBmb3VuZCBhdCAnK2Jhc2VQYXRoKTt9CmNvbnN0IGFydGlmYWN0cz1KU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oYmFzZVBhdGgsYXJ0aWZhY3RzRmlsZW5hbWUpLCd1dGY4JykpO2NvbnN0IGZpbGVuYW1lcz1mcy5yZWFkZGlyU3luYyhiYXNlUGF0aCk7YXJ0aWZhY3RzLmRldnRvb2xzTG9ncz17fTtmaWxlbmFtZXMuZmlsdGVyKGY9PmYuZW5kc1dpdGgoZGV2dG9vbHNMb2dTdWZmaXgpKS5tYXAoZmlsZW5hbWU9Pntjb25zdCBwYXNzTmFtZT1maWxlbmFtZS5yZXBsYWNlKGRldnRvb2xzTG9nU3VmZml4LCcnKTtjb25zdCBkZXZ0b29sc0xvZz1KU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oYmFzZVBhdGgsZmlsZW5hbWUpLCd1dGY4JykpO2FydGlmYWN0cy5kZXZ0b29sc0xvZ3NbcGFzc05hbWVdPWRldnRvb2xzTG9nO30pO2FydGlmYWN0cy50cmFjZXM9e307Y29uc3QgcHJvbWlzZXM9ZmlsZW5hbWVzLmZpbHRlcihmPT5mLmVuZHNXaXRoKHRyYWNlU3VmZml4KSkubWFwKGZpbGVuYW1lPT57cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9Pntjb25zdCBwYXNzTmFtZT1maWxlbmFtZS5yZXBsYWNlKHRyYWNlU3VmZml4LCcnKTtjb25zdCByZWFkU3RyZWFtPWZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGJhc2VQYXRoLGZpbGVuYW1lKSx7ZW5jb2Rpbmc6J3V0Zi04JyxoaWdoV2F0ZXJNYXJrOjQqMTAyNCoxMDI0fSk7Y29uc3QgcGFyc2VyPW5ldyBUcmFjZVBhcnNlcigpO3JlYWRTdHJlYW0ub24oJ2RhdGEnLGNodW5rPT5wYXJzZXIucGFyc2VDaHVuayhjaHVuaykpO3JlYWRTdHJlYW0ub24oJ2VuZCcsXz0+e2FydGlmYWN0cy50cmFjZXNbcGFzc05hbWVdPXBhcnNlci5nZXRUcmFjZSgpO3Jlc29sdmUoKTt9KTt9KTt9KTthd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7cmV0dXJuIGFydGlmYWN0czt9CmFzeW5jIGZ1bmN0aW9uIHNhdmVBcnRpZmFjdHMoYXJ0aWZhY3RzLGJhc2VQYXRoKXtta2RpcnAuc3luYyhiYXNlUGF0aCk7cmltcmFmLnN5bmMoYCR7YmFzZVBhdGh9Lyoke3RyYWNlU3VmZml4fWApO3JpbXJhZi5zeW5jKGAke2Jhc2VQYXRofS8ke2FydGlmYWN0c0ZpbGVuYW1lfWApO2NvbnN0e3RyYWNlcyxkZXZ0b29sc0xvZ3MsLi4ucmVzdEFydGlmYWN0c309YXJ0aWZhY3RzO2Zvcihjb25zdFtwYXNzTmFtZSx0cmFjZV1vZiBPYmplY3QuZW50cmllcyh0cmFjZXMpKXthd2FpdCBzYXZlVHJhY2UodHJhY2UsYCR7YmFzZVBhdGh9LyR7cGFzc05hbWV9JHt0cmFjZVN1ZmZpeH1gKTt9CmZvcihjb25zdFtwYXNzTmFtZSxkZXZ0b29sc0xvZ11vZiBPYmplY3QuZW50cmllcyhkZXZ0b29sc0xvZ3MpKXtjb25zdCBsb2c9SlNPTi5zdHJpbmdpZnkoZGV2dG9vbHNMb2cpO2ZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZVBhdGh9LyR7cGFzc05hbWV9JHtkZXZ0b29sc0xvZ1N1ZmZpeH1gLGxvZywndXRmOCcpO30KY29uc3QgcmVzdEFydGlmYWN0c1N0cmluZz1KU09OLnN0cmluZ2lmeShyZXN0QXJ0aWZhY3RzLG51bGwsMik7ZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlUGF0aH0vJHthcnRpZmFjdHNGaWxlbmFtZX1gLHJlc3RBcnRpZmFjdHNTdHJpbmcsJ3V0ZjgnKTtsb2cubG9nKCdBcnRpZmFjdHMgc2F2ZWQgdG8gZGlzayBpbiBmb2xkZXI6JyxiYXNlUGF0aCk7fQphc3luYyBmdW5jdGlvbiBwcmVwYXJlQXNzZXRzKGFydGlmYWN0cyxhdWRpdHMpe2NvbnN0IHBhc3NOYW1lcz1PYmplY3Qua2V5cyhhcnRpZmFjdHMudHJhY2VzKTtjb25zdCBhc3NldHM9W107Zm9yKGNvbnN0IHBhc3NOYW1lIG9mIHBhc3NOYW1lcyl7Y29uc3QgdHJhY2U9YXJ0aWZhY3RzLnRyYWNlc1twYXNzTmFtZV07Y29uc3QgZGV2dG9vbHNMb2c9YXJ0aWZhY3RzLmRldnRvb2xzTG9nc1twYXNzTmFtZV07Y29uc3QgUnVubmVyPXJlcXVpcmUoJy4uL3J1bm5lci5qcycpO2NvbnN0IGNvbXB1dGVkQXJ0aWZhY3RzPVJ1bm5lci5pbnN0YW50aWF0ZUNvbXB1dGVkQXJ0aWZhY3RzKCk7Y29uc3Qgc2NyZWVuc2hvdHM9YXdhaXQgY29tcHV0ZWRBcnRpZmFjdHMucmVxdWVzdFNjcmVlbnNob3RzKHRyYWNlKTtjb25zdCB0cmFjZURhdGE9T2JqZWN0LmFzc2lnbih7fSx0cmFjZSk7Y29uc3Qgc2NyZWVuc2hvdHNIVE1MPXNjcmVlbnNob3REdW1wKHNjcmVlbnNob3RzKTtpZihhdWRpdHMpe2NvbnN0IGV2dHM9bmV3IE1ldHJpY3ModHJhY2VEYXRhLnRyYWNlRXZlbnRzLGF1ZGl0cykuZ2VuZXJhdGVGYWtlRXZlbnRzKCk7dHJhY2VEYXRhLnRyYWNlRXZlbnRzPXRyYWNlRGF0YS50cmFjZUV2ZW50cy5jb25jYXQoZXZ0cyk7fQphc3NldHMucHVzaCh7cGFzc05hbWUsdHJhY2VEYXRhLGRldnRvb2xzTG9nLHNjcmVlbnNob3RzSFRNTCxzY3JlZW5zaG90c30pO30KcmV0dXJuIGFzc2V0czt9CmZ1bmN0aW9uKnRyYWNlSnNvbkdlbmVyYXRvcih0cmFjZURhdGEpe2NvbnN0IEVWRU5UU19QRVJfSVRFUkFUSU9OPTUwMDtjb25zdCBrZXlzPU9iamVjdC5rZXlzKHRyYWNlRGF0YSk7eWllbGQne1xuJzt5aWVsZCcidHJhY2VFdmVudHMiOiBbXG4nO2lmKHRyYWNlRGF0YS50cmFjZUV2ZW50cy5sZW5ndGg+MCl7Y29uc3QgZXZlbnRzSXRlcmF0b3I9dHJhY2VEYXRhLnRyYWNlRXZlbnRzW1N5bWJvbC5pdGVyYXRvcl0oKTtjb25zdCBmaXJzdEV2ZW50PWV2ZW50c0l0ZXJhdG9yLm5leHQoKS52YWx1ZTt5aWVsZGAgICR7SlNPTi5zdHJpbmdpZnkoZmlyc3RFdmVudCl9YDtsZXQgZXZlbnRzUmVtYWluaW5nPUVWRU5UU19QRVJfSVRFUkFUSU9OO2xldCBldmVudHNKU09OPScnO2Zvcihjb25zdCBldmVudCBvZiBldmVudHNJdGVyYXRvcil7ZXZlbnRzSlNPTis9YCxcbiAgJHtKU09OLnN0cmluZ2lmeShldmVudCl9YDtldmVudHNSZW1haW5pbmctLTtpZihldmVudHNSZW1haW5pbmc9PT0wKXt5aWVsZCBldmVudHNKU09OO2V2ZW50c1JlbWFpbmluZz1FVkVOVFNfUEVSX0lURVJBVElPTjtldmVudHNKU09OPScnO319CnlpZWxkIGV2ZW50c0pTT047fQp5aWVsZCdcbl0nO2lmKGtleXMubGVuZ3RoPjEpe2Zvcihjb25zdCBrZXkgb2Yga2V5cyl7aWYoa2V5PT09J3RyYWNlRXZlbnRzJyljb250aW51ZTt5aWVsZGAsXG4iJHtrZXl9IjogJHtKU09OLnN0cmluZ2lmeSh0cmFjZURhdGFba2V5XSxudWxsLDIpfWA7fX0KeWllbGQnfVxuJzt9CmZ1bmN0aW9uIHNhdmVUcmFjZSh0cmFjZURhdGEsdHJhY2VGaWxlbmFtZSl7cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pntjb25zdCB0cmFjZUl0ZXI9dHJhY2VKc29uR2VuZXJhdG9yKHRyYWNlRGF0YSk7Y29uc3QgdHJhY2VTdHJlYW09bmV3IHN0cmVhbS5SZWFkYWJsZSh7cmVhZCgpe2NvbnN0IG5leHQ9dHJhY2VJdGVyLm5leHQoKTt0aGlzLnB1c2gobmV4dC5kb25lP251bGw6bmV4dC52YWx1ZSk7fX0pO2NvbnN0IHdyaXRlU3RyZWFtPWZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRyYWNlRmlsZW5hbWUpO3dyaXRlU3RyZWFtLm9uKCdmaW5pc2gnLHJlc29sdmUpO3dyaXRlU3RyZWFtLm9uKCdlcnJvcicscmVqZWN0KTt0cmFjZVN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKTt9KTt9CmFzeW5jIGZ1bmN0aW9uIHNhdmVMYW50ZXJuRGVidWdUcmFjZXMocGF0aFdpdGhCYXNlbmFtZSl7aWYoIXByb2Nlc3MuZW52LkxBTlRFUk5fREVCVUcpcmV0dXJuO2Zvcihjb25zdFtsYWJlbCxub2RlVGltaW5nc11vZiBTaW11bGF0b3IuQUxMX05PREVfVElNSU5HUyl7aWYobGFudGVyblRyYWNlU2F2ZXIuc2ltdWxhdGlvbk5hbWVzVG9JZ25vcmUuaW5jbHVkZXMobGFiZWwpKWNvbnRpbnVlO2NvbnN0IHRyYWNlRmlsZW5hbWU9YCR7cGF0aFdpdGhCYXNlbmFtZX0tJHtsYWJlbH0ke3RyYWNlU3VmZml4fWA7YXdhaXQgc2F2ZVRyYWNlKGxhbnRlcm5UcmFjZVNhdmVyLmNvbnZlcnROb2RlVGltaW5nc1RvVHJhY2Uobm9kZVRpbWluZ3MpLHRyYWNlRmlsZW5hbWUpO2xvZy5sb2coJ3NhdmVBc3NldHMnLGAke2xhYmVsfSBsYW50ZXJuIHRyYWNlIGZpbGUgc3RyZWFtZWQgdG8gZGlzazogJHt0cmFjZUZpbGVuYW1lfWApO319CmFzeW5jIGZ1bmN0aW9uIHNhdmVBc3NldHMoYXJ0aWZhY3RzLGF1ZGl0cyxwYXRoV2l0aEJhc2VuYW1lKXtjb25zdCBhbGxBc3NldHM9YXdhaXQgcHJlcGFyZUFzc2V0cyhhcnRpZmFjdHMsYXVkaXRzKTtjb25zdCBzYXZlQWxsPWFsbEFzc2V0cy5tYXAoYXN5bmMocGFzc0Fzc2V0cyxpbmRleCk9Pntjb25zdCBkZXZ0b29sc0xvZ0ZpbGVuYW1lPWAke3BhdGhXaXRoQmFzZW5hbWV9LSR7aW5kZXh9JHtkZXZ0b29sc0xvZ1N1ZmZpeH1gO2ZzLndyaXRlRmlsZVN5bmMoZGV2dG9vbHNMb2dGaWxlbmFtZSxKU09OLnN0cmluZ2lmeShwYXNzQXNzZXRzLmRldnRvb2xzTG9nLG51bGwsMikpO2xvZy5sb2coJ3NhdmVBc3NldHMnLCdkZXZ0b29scyBsb2cgc2F2ZWQgdG8gZGlzazogJytkZXZ0b29sc0xvZ0ZpbGVuYW1lKTtjb25zdCBzY3JlZW5zaG90c0hUTUxGaWxlbmFtZT1gJHtwYXRoV2l0aEJhc2VuYW1lfS0ke2luZGV4fS5zY3JlZW5zaG90cy5odG1sYDtmcy53cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RzSFRNTEZpbGVuYW1lLHBhc3NBc3NldHMuc2NyZWVuc2hvdHNIVE1MKTtsb2cubG9nKCdzYXZlQXNzZXRzJywnc2NyZWVuc2hvdHMgc2F2ZWQgdG8gZGlzazogJytzY3JlZW5zaG90c0hUTUxGaWxlbmFtZSk7Y29uc3Qgc2NyZWVuc2hvdHNKU09ORmlsZW5hbWU9YCR7cGF0aFdpdGhCYXNlbmFtZX0tJHtpbmRleH0uc2NyZWVuc2hvdHMuanNvbmA7ZnMud3JpdGVGaWxlU3luYyhzY3JlZW5zaG90c0pTT05GaWxlbmFtZSxKU09OLnN0cmluZ2lmeShwYXNzQXNzZXRzLnNjcmVlbnNob3RzLG51bGwsMikpO2xvZy5sb2coJ3NhdmVBc3NldHMnLCdzY3JlZW5zaG90cyBzYXZlZCB0byBkaXNrOiAnK3NjcmVlbnNob3RzSlNPTkZpbGVuYW1lKTtjb25zdCBzdHJlYW1UcmFjZUZpbGVuYW1lPWAke3BhdGhXaXRoQmFzZW5hbWV9LSR7aW5kZXh9JHt0cmFjZVN1ZmZpeH1gO2xvZy5sb2coJ3NhdmVBc3NldHMnLCdzdHJlYW1pbmcgdHJhY2UgZmlsZSB0byBkaXNrOiAnK3N0cmVhbVRyYWNlRmlsZW5hbWUpO2F3YWl0IHNhdmVUcmFjZShwYXNzQXNzZXRzLnRyYWNlRGF0YSxzdHJlYW1UcmFjZUZpbGVuYW1lKTtsb2cubG9nKCdzYXZlQXNzZXRzJywndHJhY2UgZmlsZSBzdHJlYW1lZCB0byBkaXNrOiAnK3N0cmVhbVRyYWNlRmlsZW5hbWUpO30pO2F3YWl0IFByb21pc2UuYWxsKHNhdmVBbGwpO2F3YWl0IHNhdmVMYW50ZXJuRGVidWdUcmFjZXMocGF0aFdpdGhCYXNlbmFtZSk7fQphc3luYyBmdW5jdGlvbiBsb2dBc3NldHMoYXJ0aWZhY3RzLGF1ZGl0cyl7Y29uc3QgYWxsQXNzZXRzPWF3YWl0IHByZXBhcmVBc3NldHMoYXJ0aWZhY3RzLGF1ZGl0cyk7YWxsQXNzZXRzLm1hcChwYXNzQXNzZXRzPT57bG9nLmxvZyhgZGV2dG9vbHNsb2ctJHtwYXNzQXNzZXRzLnBhc3NOYW1lfS5qc29uYCxKU09OLnN0cmluZ2lmeShwYXNzQXNzZXRzLmRldnRvb2xzTG9nKSk7Y29uc3QgdHJhY2VJdGVyPXRyYWNlSnNvbkdlbmVyYXRvcihwYXNzQXNzZXRzLnRyYWNlRGF0YSk7bGV0IHRyYWNlSnNvbj0nJztmb3IoY29uc3QgdHJhY2Ugb2YgdHJhY2VJdGVyKXt0cmFjZUpzb24rPXRyYWNlO30KbG9nLmxvZyhgdHJhY2UtJHtwYXNzQXNzZXRzLnBhc3NOYW1lfS5qc29uYCx0cmFjZUpzb24pO30pO30KbW9kdWxlLmV4cG9ydHM9e3NhdmVBcnRpZmFjdHMsbG9hZEFydGlmYWN0cyxzYXZlQXNzZXRzLHByZXBhcmVBc3NldHMsc2F2ZVRyYWNlLGxvZ0Fzc2V0c307fSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpO30seyIuLi9ydW5uZXIuanMiOjUwLCIuL2RlcGVuZGVuY3ktZ3JhcGgvc2ltdWxhdG9yL3NpbXVsYXRvciI6MjgsIi4vbGFudGVybi10cmFjZS1zYXZlciI6MzUsIi4vdHJhY2VzL3B3bWV0cmljcy1ldmVudHMiOjQ0LCIuL3RyYWNlcy90cmFjZS1wYXJzZXIiOjQ1LCJfcHJvY2VzcyI6NzcsImxpZ2h0aG91c2UtbG9nZ2VyIjoxMjUsIm1rZGlycCI6NTgsInBhdGgiOjc1LCJyaW1yYWYiOjU4LCJzdHJlYW0iOjkyfV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0JztjbGFzcyBCYXNlTm9kZXtjb25zdHJ1Y3RvcihpZCl7dGhpcy5faWQ9aWQ7dGhpcy5faXNNYWluRG9jdW1lbnQ9ZmFsc2U7dGhpcy5fZGVwZW5kZW50cz1bXTt0aGlzLl9kZXBlbmRlbmNpZXM9W107fQpnZXQgaWQoKXtyZXR1cm4gdGhpcy5faWQ7fQpnZXQgdHlwZSgpe3Rocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCcpO30KZ2V0IHN0YXJ0VGltZSgpe3Rocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCcpO30KZ2V0IGVuZFRpbWUoKXt0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQnKTt9CnNldElzTWFpbkRvY3VtZW50KHZhbHVlKXt0aGlzLl9pc01haW5Eb2N1bWVudD12YWx1ZTt9CmlzTWFpbkRvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2lzTWFpbkRvY3VtZW50O30KZ2V0RGVwZW5kZW50cygpe3JldHVybiB0aGlzLl9kZXBlbmRlbnRzLnNsaWNlKCk7fQpnZXREZXBlbmRlbmNpZXMoKXtyZXR1cm4gdGhpcy5fZGVwZW5kZW5jaWVzLnNsaWNlKCk7fQpnZXROdW1iZXJPZkRlcGVuZGVuY2llcygpe3JldHVybiB0aGlzLl9kZXBlbmRlbmNpZXMubGVuZ3RoO30KZ2V0Um9vdE5vZGUoKXtsZXQgcm9vdE5vZGU9dGhpczt3aGlsZShyb290Tm9kZS5fZGVwZW5kZW5jaWVzLmxlbmd0aCl7cm9vdE5vZGU9cm9vdE5vZGUuX2RlcGVuZGVuY2llc1swXTt9CnJldHVybiByb290Tm9kZTt9CmFkZERlcGVuZGVudChub2RlKXtub2RlLmFkZERlcGVuZGVuY3kodGhpcyk7fQphZGREZXBlbmRlbmN5KG5vZGUpe2lmKHRoaXMuX2RlcGVuZGVuY2llcy5pbmNsdWRlcyhub2RlKSl7cmV0dXJuO30Kbm9kZS5fZGVwZW5kZW50cy5wdXNoKHRoaXMpO3RoaXMuX2RlcGVuZGVuY2llcy5wdXNoKG5vZGUpO30KcmVtb3ZlRGVwZW5kZW50KG5vZGUpe25vZGUucmVtb3ZlRGVwZW5kZW5jeSh0aGlzKTt9CnJlbW92ZURlcGVuZGVuY3kobm9kZSl7aWYoIXRoaXMuX2RlcGVuZGVuY2llcy5pbmNsdWRlcyhub2RlKSl7cmV0dXJuO30KY29uc3QgdGhpc0luZGV4PW5vZGUuX2RlcGVuZGVudHMuaW5kZXhPZih0aGlzKTtub2RlLl9kZXBlbmRlbnRzLnNwbGljZSh0aGlzSW5kZXgsMSk7dGhpcy5fZGVwZW5kZW5jaWVzLnNwbGljZSh0aGlzLl9kZXBlbmRlbmNpZXMuaW5kZXhPZihub2RlKSwxKTt9CnJlbW92ZUFsbERlcGVuZGVuY2llcygpe2Zvcihjb25zdCBub2RlIG9mIHRoaXMuX2RlcGVuZGVuY2llcy5zbGljZSgpKXt0aGlzLnJlbW92ZURlcGVuZGVuY3kobm9kZSk7fX0KY2xvbmVXaXRob3V0UmVsYXRpb25zaGlwcygpe2NvbnN0IG5vZGU9bmV3IEJhc2VOb2RlKHRoaXMuaWQpO25vZGUuc2V0SXNNYWluRG9jdW1lbnQodGhpcy5faXNNYWluRG9jdW1lbnQpO3JldHVybiBub2RlO30KY2xvbmVXaXRoUmVsYXRpb25zaGlwcyhwcmVkaWNhdGUpe2NvbnN0IHJvb3ROb2RlPXRoaXMuZ2V0Um9vdE5vZGUoKTtsZXQgc2hvdWxkSW5jbHVkZU5vZGU9KCk9PnRydWU7aWYocHJlZGljYXRlKXtjb25zdCBpZHNUb0luY2x1ZGU9bmV3IFNldCgpO3Jvb3ROb2RlLnRyYXZlcnNlKG5vZGU9PntpZihwcmVkaWNhdGUobm9kZSkpe25vZGUudHJhdmVyc2Uobm9kZT0+aWRzVG9JbmNsdWRlLmFkZChub2RlLmlkKSxub2RlPT5ub2RlLl9kZXBlbmRlbmNpZXMuZmlsdGVyKHBhcmVudD0+IWlkc1RvSW5jbHVkZS5oYXMocGFyZW50KSkpO319KTtzaG91bGRJbmNsdWRlTm9kZT1ub2RlPT5pZHNUb0luY2x1ZGUuaGFzKG5vZGUuaWQpO30KY29uc3QgaWRUb05vZGVNYXA9bmV3IE1hcCgpO3Jvb3ROb2RlLnRyYXZlcnNlKG9yaWdpbmFsTm9kZT0+e2lmKCFzaG91bGRJbmNsdWRlTm9kZShvcmlnaW5hbE5vZGUpKXJldHVybjtjb25zdCBjbG9uZWROb2RlPW9yaWdpbmFsTm9kZS5jbG9uZVdpdGhvdXRSZWxhdGlvbnNoaXBzKCk7aWRUb05vZGVNYXAuc2V0KGNsb25lZE5vZGUuaWQsY2xvbmVkTm9kZSk7fSk7cm9vdE5vZGUudHJhdmVyc2Uob3JpZ2luYWxOb2RlPT57aWYoIXNob3VsZEluY2x1ZGVOb2RlKG9yaWdpbmFsTm9kZSkpcmV0dXJuO2NvbnN0IGNsb25lZE5vZGU9aWRUb05vZGVNYXAuZ2V0KG9yaWdpbmFsTm9kZS5pZCk7Zm9yKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3JpZ2luYWxOb2RlLl9kZXBlbmRlbmNpZXMpe2NvbnN0IGNsb25lZERlcGVuZGVuY3k9aWRUb05vZGVNYXAuZ2V0KGRlcGVuZGVuY3kuaWQpO2Nsb25lZE5vZGUuYWRkRGVwZW5kZW5jeShjbG9uZWREZXBlbmRlbmN5KTt9fSk7aWYoIWlkVG9Ob2RlTWFwLmhhcyh0aGlzLmlkKSl0aHJvdyBuZXcgRXJyb3IoYENsb25lZCBncmFwaCBtaXNzaW5nIG5vZGUgJHt0aGlzLmlkfWApO3JldHVybiBpZFRvTm9kZU1hcC5nZXQodGhpcy5pZCk7fQpfdHJhdmVyc2VQYXRocyhpdGVyYXRvcixnZXROZXh0KXtjb25zdCBzdGFjaz1bW3RoaXNdXTt3aGlsZShzdGFjay5sZW5ndGgpe2NvbnN0IHBhdGg9c3RhY2suc2hpZnQoKTtjb25zdCBub2RlPXBhdGhbMF07aXRlcmF0b3Iobm9kZSxwYXRoKTtjb25zdCBub2Rlc1RvQWRkPWdldE5leHQobm9kZSk7Zm9yKGNvbnN0IG5leHROb2RlIG9mIG5vZGVzVG9BZGQpe3N0YWNrLnB1c2goW25leHROb2RlXS5jb25jYXQocGF0aCkpO319fQp0cmF2ZXJzZShpdGVyYXRvcixnZXROZXh0KXtpZighZ2V0TmV4dCl7Z2V0TmV4dD1ub2RlPT5ub2RlLmdldERlcGVuZGVudHMoKTt9CmNvbnN0IHZpc2l0ZWQ9bmV3IFNldCgpO2NvbnN0IG9yaWdpbmFsR2V0TmV4dD1nZXROZXh0O2dldE5leHQ9bm9kZT0+e3Zpc2l0ZWQuYWRkKG5vZGUuaWQpO2NvbnN0IGFsbE5vZGVzVG9WaXNpdD1vcmlnaW5hbEdldE5leHQobm9kZSk7Y29uc3Qgbm9kZXNUb1Zpc2l0PWFsbE5vZGVzVG9WaXNpdC5maWx0ZXIobmV4dE5vZGU9PiF2aXNpdGVkLmhhcyhuZXh0Tm9kZS5pZCkpO25vZGVzVG9WaXNpdC5mb3JFYWNoKG5leHROb2RlPT52aXNpdGVkLmFkZChuZXh0Tm9kZS5pZCkpO3JldHVybiBub2Rlc1RvVmlzaXQ7fTt0aGlzLl90cmF2ZXJzZVBhdGhzKGl0ZXJhdG9yLGdldE5leHQpO30Kc3RhdGljIGhhc0N5Y2xlKG5vZGUsZGlyZWN0aW9uPSdib3RoJyl7aWYoZGlyZWN0aW9uPT09J2JvdGgnKXtyZXR1cm4gQmFzZU5vZGUuaGFzQ3ljbGUobm9kZSwnZGVwZW5kZW50cycpfHxCYXNlTm9kZS5oYXNDeWNsZShub2RlLCdkZXBlbmRlbmNpZXMnKTt9CmNvbnN0IHZpc2l0ZWQ9bmV3IFNldCgpO2NvbnN0IGN1cnJlbnRQYXRoPVtdO2NvbnN0IHRvVmlzaXQ9W25vZGVdO2NvbnN0IGRlcHRoQWRkZWQ9bmV3IE1hcChbW25vZGUsMF1dKTt3aGlsZSh0b1Zpc2l0Lmxlbmd0aCl7Y29uc3QgY3VycmVudE5vZGU9dG9WaXNpdC5wb3AoKTtpZihjdXJyZW50UGF0aC5pbmNsdWRlcyhjdXJyZW50Tm9kZSkpcmV0dXJuIHRydWU7aWYodmlzaXRlZC5oYXMoY3VycmVudE5vZGUpKWNvbnRpbnVlO3doaWxlKGN1cnJlbnRQYXRoLmxlbmd0aD5kZXB0aEFkZGVkLmdldChjdXJyZW50Tm9kZSkpY3VycmVudFBhdGgucG9wKCk7dmlzaXRlZC5hZGQoY3VycmVudE5vZGUpO2N1cnJlbnRQYXRoLnB1c2goY3VycmVudE5vZGUpO2NvbnN0IG5vZGVzVG9FeHBsb3JlPWRpcmVjdGlvbj09PSdkZXBlbmRlbnRzJz9jdXJyZW50Tm9kZS5fZGVwZW5kZW50czpjdXJyZW50Tm9kZS5fZGVwZW5kZW5jaWVzO2Zvcihjb25zdCBuZXh0Tm9kZSBvZiBub2Rlc1RvRXhwbG9yZSl7aWYodG9WaXNpdC5pbmNsdWRlcyhuZXh0Tm9kZSkpY29udGludWU7dG9WaXNpdC5wdXNoKG5leHROb2RlKTtkZXB0aEFkZGVkLnNldChuZXh0Tm9kZSxjdXJyZW50UGF0aC5sZW5ndGgpO319CnJldHVybiBmYWxzZTt9fQpCYXNlTm9kZS5UWVBFUz17TkVUV09SSzonbmV0d29yaycsQ1BVOidjcHUnfTttb2R1bGUuZXhwb3J0cz1CYXNlTm9kZTt9LHt9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4vYmFzZS1ub2RlJyk7Y2xhc3MgQ1BVTm9kZSBleHRlbmRzIEJhc2VOb2Rle2NvbnN0cnVjdG9yKHBhcmVudEV2ZW50LGNoaWxkRXZlbnRzPVtdKXtjb25zdCBub2RlSWQ9YCR7cGFyZW50RXZlbnQudGlkfS4ke3BhcmVudEV2ZW50LnRzfWA7c3VwZXIobm9kZUlkKTt0aGlzLl9ldmVudD1wYXJlbnRFdmVudDt0aGlzLl9jaGlsZEV2ZW50cz1jaGlsZEV2ZW50czt9CmdldCB0eXBlKCl7cmV0dXJuIEJhc2VOb2RlLlRZUEVTLkNQVTt9CmdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fZXZlbnQudHM7fQpnZXQgZW5kVGltZSgpe3JldHVybiB0aGlzLl9ldmVudC50cyt0aGlzLl9ldmVudC5kdXI7fQpnZXQgZXZlbnQoKXtyZXR1cm4gdGhpcy5fZXZlbnQ7fQpnZXQgY2hpbGRFdmVudHMoKXtyZXR1cm4gdGhpcy5fY2hpbGRFdmVudHM7fQpkaWRQZXJmb3JtTGF5b3V0KCl7cmV0dXJuIHRoaXMuX2NoaWxkRXZlbnRzLnNvbWUoZXZ0PT5ldnQubmFtZT09PSdMYXlvdXQnKTt9CmlzRXZhbHVhdGVTY3JpcHRGb3IodXJscyl7cmV0dXJuIHRoaXMuX2NoaWxkRXZlbnRzLnNvbWUoZXZ0PT57cmV0dXJuIGV2dC5uYW1lPT09J0V2YWx1YXRlU2NyaXB0JyYmISFldnQuYXJncy5kYXRhJiYhIWV2dC5hcmdzLmRhdGEudXJsJiZ1cmxzLmhhcyhldnQuYXJncy5kYXRhLnVybCk7fSk7fQpjbG9uZVdpdGhvdXRSZWxhdGlvbnNoaXBzKCl7cmV0dXJuIG5ldyBDUFVOb2RlKHRoaXMuX2V2ZW50LHRoaXMuX2NoaWxkRXZlbnRzKTt9fQptb2R1bGUuZXhwb3J0cz1DUFVOb2RlO30seyIuL2Jhc2Utbm9kZSI6MjJ9XSwyNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4vYmFzZS1ub2RlJyk7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vbmV0d29yay1yZXF1ZXN0Jyk7Y2xhc3MgTmV0d29ya05vZGUgZXh0ZW5kcyBCYXNlTm9kZXtjb25zdHJ1Y3RvcihuZXR3b3JrUmVjb3JkKXtzdXBlcihuZXR3b3JrUmVjb3JkLnJlcXVlc3RJZCk7dGhpcy5fcmVjb3JkPW5ldHdvcmtSZWNvcmQ7fQpnZXQgdHlwZSgpe3JldHVybiBCYXNlTm9kZS5UWVBFUy5ORVRXT1JLO30KZ2V0IHN0YXJ0VGltZSgpe3JldHVybiB0aGlzLl9yZWNvcmQuc3RhcnRUaW1lKjEwMDAqMTAwMDt9CmdldCBlbmRUaW1lKCl7cmV0dXJuIHRoaXMuX3JlY29yZC5lbmRUaW1lKjEwMDAqMTAwMDt9CmdldCByZWNvcmQoKXtyZXR1cm4gdGhpcy5fcmVjb3JkO30KZ2V0IGluaXRpYXRvclR5cGUoKXtyZXR1cm4gdGhpcy5fcmVjb3JkLmluaXRpYXRvciYmdGhpcy5fcmVjb3JkLmluaXRpYXRvci50eXBlO30KZ2V0IGZyb21EaXNrQ2FjaGUoKXtyZXR1cm4hIXRoaXMuX3JlY29yZC5mcm9tRGlza0NhY2hlO30KaGFzUmVuZGVyQmxvY2tpbmdQcmlvcml0eSgpe2NvbnN0IHByaW9yaXR5PXRoaXMuX3JlY29yZC5wcmlvcml0eTtjb25zdCBpc1NjcmlwdD10aGlzLl9yZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuU2NyaXB0O2NvbnN0IGlzRG9jdW1lbnQ9dGhpcy5fcmVjb3JkLnJlc291cmNlVHlwZT09PU5ldHdvcmtSZXF1ZXN0LlRZUEVTLkRvY3VtZW50O2NvbnN0IGlzQmxvY2tpbmdTY3JpcHQ9cHJpb3JpdHk9PT0nSGlnaCcmJmlzU2NyaXB0O2NvbnN0IGlzQmxvY2tpbmdIdG1sSW1wb3J0PXByaW9yaXR5PT09J0hpZ2gnJiZpc0RvY3VtZW50O3JldHVybiBwcmlvcml0eT09PSdWZXJ5SGlnaCd8fGlzQmxvY2tpbmdTY3JpcHR8fGlzQmxvY2tpbmdIdG1sSW1wb3J0O30KY2xvbmVXaXRob3V0UmVsYXRpb25zaGlwcygpe2NvbnN0IG5vZGU9bmV3IE5ldHdvcmtOb2RlKHRoaXMuX3JlY29yZCk7bm9kZS5zZXRJc01haW5Eb2N1bWVudCh0aGlzLl9pc01haW5Eb2N1bWVudCk7cmV0dXJuIG5vZGU7fX0KbW9kdWxlLmV4cG9ydHM9TmV0d29ya05vZGU7fSx7Ii4uL25ldHdvcmstcmVxdWVzdCI6MzgsIi4vYmFzZS1ub2RlIjoyMn1dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgTmV0d29ya0FuYWx5emVyPXJlcXVpcmUoJy4vbmV0d29yay1hbmFseXplcicpO2NvbnN0IFRjcENvbm5lY3Rpb249cmVxdWlyZSgnLi90Y3AtY29ubmVjdGlvbicpO2NvbnN0IERFRkFVTFRfU0VSVkVSX1JFU1BPTlNFX1RJTUU9MzA7Y29uc3QgVExTX1NDSEVNRVM9WydodHRwcycsJ3dzcyddO2NvbnN0IENPTk5FQ1RJT05TX1BFUl9PUklHSU49Njttb2R1bGUuZXhwb3J0cz1jbGFzcyBDb25uZWN0aW9uUG9vbHtjb25zdHJ1Y3RvcihyZWNvcmRzLG9wdGlvbnMpe3RoaXMuX29wdGlvbnM9T2JqZWN0LmFzc2lnbih7cnR0OnVuZGVmaW5lZCx0aHJvdWdocHV0OnVuZGVmaW5lZCxhZGRpdGlvbmFsUnR0QnlPcmlnaW46bmV3IE1hcCgpLHNlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luOm5ldyBNYXAoKX0sb3B0aW9ucyk7aWYoIXRoaXMuX29wdGlvbnMucnR0fHwhdGhpcy5fb3B0aW9ucy50aHJvdWdocHV0KXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgcG9vbCB3aXRoIG5vIHJ0dCBvciB0aHJvdWdocHV0Jyk7fQp0aGlzLl9yZWNvcmRzPXJlY29yZHM7dGhpcy5fY29ubmVjdGlvbnNCeU9yaWdpbj1uZXcgTWFwKCk7dGhpcy5fY29ubmVjdGlvbnNCeVJlY29yZD1uZXcgTWFwKCk7dGhpcy5fY29ubmVjdGlvbnNJblVzZT1uZXcgU2V0KCk7dGhpcy5fY29ubmVjdGlvblJldXNlZEJ5UmVxdWVzdElkPU5ldHdvcmtBbmFseXplci5lc3RpbWF0ZUlmQ29ubmVjdGlvbldhc1JldXNlZChyZWNvcmRzLHtmb3JjZUNvYXJzZUVzdGltYXRlczp0cnVlfSk7dGhpcy5faW5pdGlhbGl6ZUNvbm5lY3Rpb25zKCk7fQpjb25uZWN0aW9uc0luVXNlKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fY29ubmVjdGlvbnNJblVzZSk7fQpfaW5pdGlhbGl6ZUNvbm5lY3Rpb25zKCl7Y29uc3QgY29ubmVjdGlvblJldXNlZD10aGlzLl9jb25uZWN0aW9uUmV1c2VkQnlSZXF1ZXN0SWQ7Y29uc3QgYWRkaXRpb25hbFJ0dEJ5T3JpZ2luPXRoaXMuX29wdGlvbnMuYWRkaXRpb25hbFJ0dEJ5T3JpZ2luO2NvbnN0IHNlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luPXRoaXMuX29wdGlvbnMuc2VydmVyUmVzcG9uc2VUaW1lQnlPcmlnaW47Y29uc3QgcmVjb3Jkc0J5T3JpZ2luPU5ldHdvcmtBbmFseXplci5ncm91cEJ5T3JpZ2luKHRoaXMuX3JlY29yZHMpO2Zvcihjb25zdFtvcmlnaW4scmVjb3Jkc11vZiByZWNvcmRzQnlPcmlnaW4uZW50cmllcygpKXtjb25zdCBjb25uZWN0aW9ucz1bXTtjb25zdCBhZGRpdGlvbmFsUnR0PWFkZGl0aW9uYWxSdHRCeU9yaWdpbi5nZXQob3JpZ2luKXx8MDtjb25zdCByZXNwb25zZVRpbWU9c2VydmVyUmVzcG9uc2VUaW1lQnlPcmlnaW4uZ2V0KG9yaWdpbil8fERFRkFVTFRfU0VSVkVSX1JFU1BPTlNFX1RJTUU7Zm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtpZihjb25uZWN0aW9uUmV1c2VkLmdldChyZWNvcmQucmVxdWVzdElkKSljb250aW51ZTtjb25zdCBpc1RMUz1UTFNfU0NIRU1FUy5pbmNsdWRlcyhyZWNvcmQucGFyc2VkVVJMLnNjaGVtZSk7Y29uc3QgaXNIMj1yZWNvcmQucHJvdG9jb2w9PT0naDInO2NvbnN0IGNvbm5lY3Rpb249bmV3IFRjcENvbm5lY3Rpb24odGhpcy5fb3B0aW9ucy5ydHQrYWRkaXRpb25hbFJ0dCx0aGlzLl9vcHRpb25zLnRocm91Z2hwdXQscmVzcG9uc2VUaW1lLGlzVExTLGlzSDIpO2Nvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7fQppZighY29ubmVjdGlvbnMubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgY29ubmVjdGlvbiBmb3Igb3JpZ2luOiAke29yaWdpbn1gKTt9CndoaWxlKGNvbm5lY3Rpb25zLmxlbmd0aDxDT05ORUNUSU9OU19QRVJfT1JJR0lOKWNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbnNbMF0uY2xvbmUoKSk7dGhpcy5fY29ubmVjdGlvbnNCeU9yaWdpbi5zZXQob3JpZ2luLGNvbm5lY3Rpb25zKTt9fQphY3F1aXJlKHJlY29yZCxvcHRpb25zPXt9KXtpZih0aGlzLl9jb25uZWN0aW9uc0J5UmVjb3JkLmhhcyhyZWNvcmQpKXtyZXR1cm4gdGhpcy5fY29ubmVjdGlvbnNCeVJlY29yZC5nZXQocmVjb3JkKTt9CmNvbnN0IG9yaWdpbj1TdHJpbmcocmVjb3JkLnBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbik7Y29uc3QgY29ubmVjdGlvbnM9dGhpcy5fY29ubmVjdGlvbnNCeU9yaWdpbi5nZXQob3JpZ2luKXx8W107Y29uc3QgYXZhaWxhYmxlQ29ubmVjdGlvbnM9Y29ubmVjdGlvbnMuZmlsdGVyKGNvbm5lY3Rpb249PiF0aGlzLl9jb25uZWN0aW9uc0luVXNlLmhhcyhjb25uZWN0aW9uKSkuc29ydCgoYSxiKT0+Yi5jb25nZXN0aW9uV2luZG93LWEuY29uZ2VzdGlvbldpbmRvdyk7Y29uc3Qgb2JzZXJ2ZWRDb25uZWN0aW9uV2FzUmV1c2VkPSEhdGhpcy5fY29ubmVjdGlvblJldXNlZEJ5UmVxdWVzdElkLmdldChyZWNvcmQucmVxdWVzdElkKTtsZXQgY29ubmVjdGlvblRvVXNlPWF2YWlsYWJsZUNvbm5lY3Rpb25zWzBdO2lmKCFvcHRpb25zLmlnbm9yZUNvbm5lY3Rpb25SZXVzZWQpe2Nvbm5lY3Rpb25Ub1VzZT1hdmFpbGFibGVDb25uZWN0aW9ucy5maW5kKGNvbm5lY3Rpb249PmNvbm5lY3Rpb24uaXNXYXJtKCk9PT1vYnNlcnZlZENvbm5lY3Rpb25XYXNSZXVzZWQpO30KaWYoIWNvbm5lY3Rpb25Ub1VzZSlyZXR1cm4gbnVsbDt0aGlzLl9jb25uZWN0aW9uc0luVXNlLmFkZChjb25uZWN0aW9uVG9Vc2UpO3RoaXMuX2Nvbm5lY3Rpb25zQnlSZWNvcmQuc2V0KHJlY29yZCxjb25uZWN0aW9uVG9Vc2UpO3JldHVybiBjb25uZWN0aW9uVG9Vc2U7fQpyZWxlYXNlKHJlY29yZCl7Y29uc3QgY29ubmVjdGlvbj10aGlzLl9jb25uZWN0aW9uc0J5UmVjb3JkLmdldChyZWNvcmQpO3RoaXMuX2Nvbm5lY3Rpb25zQnlSZWNvcmQuZGVsZXRlKHJlY29yZCk7dGhpcy5fY29ubmVjdGlvbnNJblVzZS5kZWxldGUoY29ubmVjdGlvbik7fX07fSx7Ii4vbmV0d29yay1hbmFseXplciI6MjcsIi4vdGNwLWNvbm5lY3Rpb24iOjI5fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBETlNfUkVTT0xVVElPTl9SVFRfTVVMVElQTElFUj0yO2NsYXNzIEROU0NhY2hle2NvbnN0cnVjdG9yKG9wdGlvbnMpe3RoaXMuX29wdGlvbnM9T2JqZWN0LmFzc2lnbih7cnR0OnVuZGVmaW5lZH0sb3B0aW9ucyk7aWYoIXRoaXMuX29wdGlvbnMucnR0KXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgRE5TIGNhY2hlIHdpdGggbm8gcnR0Jyk7fQp0aGlzLl9ydHQ9dGhpcy5fb3B0aW9ucy5ydHQ7dGhpcy5fcmVzb2x2ZWREb21haW5OYW1lcz1uZXcgTWFwKCk7fQpnZXRUaW1lVW50aWxSZXNvbHV0aW9uKHJlcXVlc3Qsb3B0aW9ucyl7Y29uc3R7cmVxdWVzdGVkQXQ9MCxzaG91bGRVcGRhdGVDYWNoZT1mYWxzZX09b3B0aW9uc3x8e307Y29uc3QgZG9tYWluPXJlcXVlc3QucGFyc2VkVVJMLmhvc3Q7Y29uc3QgY2FjaGVFbnRyeT10aGlzLl9yZXNvbHZlZERvbWFpbk5hbWVzLmdldChkb21haW4pO2xldCB0aW1lVW50aWxSZXNvbHZlZD10aGlzLl9ydHQqRE5TQ2FjaGUuUlRUX01VTFRJUExJRVI7aWYoY2FjaGVFbnRyeSl7Y29uc3QgdGltZVVudGlsQ2FjaGVkSXNSZXNvbHZlZD1NYXRoLm1heChjYWNoZUVudHJ5LnJlc29sdmVkQXQtcmVxdWVzdGVkQXQsMCk7dGltZVVudGlsUmVzb2x2ZWQ9TWF0aC5taW4odGltZVVudGlsQ2FjaGVkSXNSZXNvbHZlZCx0aW1lVW50aWxSZXNvbHZlZCk7fQpjb25zdCByZXNvbHZlZEF0PXJlcXVlc3RlZEF0K3RpbWVVbnRpbFJlc29sdmVkO2lmKHNob3VsZFVwZGF0ZUNhY2hlKXRoaXMuX3VwZGF0ZUNhY2hlUmVzb2x2ZWRBdElmTmVlZGVkKHJlcXVlc3QscmVzb2x2ZWRBdCk7cmV0dXJuIHRpbWVVbnRpbFJlc29sdmVkO30KX3VwZGF0ZUNhY2hlUmVzb2x2ZWRBdElmTmVlZGVkKHJlcXVlc3QscmVzb2x2ZWRBdCl7Y29uc3QgZG9tYWluPXJlcXVlc3QucGFyc2VkVVJMLmhvc3Q7Y29uc3QgY2FjaGVFbnRyeT10aGlzLl9yZXNvbHZlZERvbWFpbk5hbWVzLmdldChkb21haW4pfHx7cmVzb2x2ZWRBdH07Y2FjaGVFbnRyeS5yZXNvbHZlZEF0PU1hdGgubWluKGNhY2hlRW50cnkucmVzb2x2ZWRBdCxyZXNvbHZlZEF0KTt0aGlzLl9yZXNvbHZlZERvbWFpbk5hbWVzLnNldChkb21haW4sY2FjaGVFbnRyeSk7fQpzZXRSZXNvbHZlZEF0KGRvbWFpbixyZXNvbHZlZEF0KXt0aGlzLl9yZXNvbHZlZERvbWFpbk5hbWVzLnNldChkb21haW4se3Jlc29sdmVkQXR9KTt9fQpETlNDYWNoZS5SVFRfTVVMVElQTElFUj1ETlNfUkVTT0xVVElPTl9SVFRfTVVMVElQTElFUjttb2R1bGUuZXhwb3J0cz1ETlNDYWNoZTt9LHt9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IElOSVRJQUxfQ1dEPTE0KjEwMjQ7Y29uc3QgTmV0d29ya1JlcXVlc3Q9cmVxdWlyZSgnLi4vLi4vbmV0d29yay1yZXF1ZXN0Jyk7Y2xhc3MgTmV0d29ya0FuYWx5emVye3N0YXRpYyBnZXQgU1VNTUFSWSgpe3JldHVybidfX1NVTU1BUllfXyc7fQpzdGF0aWMgZ3JvdXBCeU9yaWdpbihyZWNvcmRzKXtjb25zdCBncm91cGVkPW5ldyBNYXAoKTtyZWNvcmRzLmZvckVhY2goaXRlbT0+e2NvbnN0IGtleT1pdGVtLnBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbjtjb25zdCBncm91cD1ncm91cGVkLmdldChrZXkpfHxbXTtncm91cC5wdXNoKGl0ZW0pO2dyb3VwZWQuc2V0KGtleSxncm91cCk7fSk7cmV0dXJuIGdyb3VwZWQ7fQpzdGF0aWMgZ2V0U3VtbWFyeSh2YWx1ZXMpe3ZhbHVlcy5zb3J0KChhLGIpPT5hLWIpO3JldHVybnttaW46dmFsdWVzWzBdLG1heDp2YWx1ZXNbdmFsdWVzLmxlbmd0aC0xXSxhdmc6dmFsdWVzLnJlZHVjZSgoYSxiKT0+YStiLDApL3ZhbHVlcy5sZW5ndGgsbWVkaWFuOnZhbHVlc1tNYXRoLmZsb29yKCh2YWx1ZXMubGVuZ3RoLTEpLzIpXX07fQpzdGF0aWMgc3VtbWFyaXplKHZhbHVlcyl7Y29uc3Qgc3VtbWFyeUJ5S2V5PW5ldyBNYXAoKTtjb25zdCBhbGxFc3RpbWF0ZXM9W107Zm9yKGNvbnN0W2tleSxlc3RpbWF0ZXNdb2YgdmFsdWVzKXtzdW1tYXJ5QnlLZXkuc2V0KGtleSxOZXR3b3JrQW5hbHl6ZXIuZ2V0U3VtbWFyeShlc3RpbWF0ZXMpKTthbGxFc3RpbWF0ZXMucHVzaCguLi5lc3RpbWF0ZXMpO30Kc3VtbWFyeUJ5S2V5LnNldChOZXR3b3JrQW5hbHl6ZXIuU1VNTUFSWSxOZXR3b3JrQW5hbHl6ZXIuZ2V0U3VtbWFyeShhbGxFc3RpbWF0ZXMpKTtyZXR1cm4gc3VtbWFyeUJ5S2V5O30Kc3RhdGljIF9lc3RpbWF0ZVZhbHVlQnlPcmlnaW4ocmVjb3JkcyxpdGVyYXRlZSl7Y29uc3QgY29ubmVjdGlvbldhc1JldXNlZD1OZXR3b3JrQW5hbHl6ZXIuZXN0aW1hdGVJZkNvbm5lY3Rpb25XYXNSZXVzZWQocmVjb3Jkcyk7Y29uc3QgZ3JvdXBlZEJ5T3JpZ2luPU5ldHdvcmtBbmFseXplci5ncm91cEJ5T3JpZ2luKHJlY29yZHMpO2NvbnN0IGVzdGltYXRlcz1uZXcgTWFwKCk7Zm9yKGNvbnN0W29yaWdpbixvcmlnaW5SZWNvcmRzXW9mIGdyb3VwZWRCeU9yaWdpbi5lbnRyaWVzKCkpe2xldCBvcmlnaW5Fc3RpbWF0ZXM9W107Zm9yKGNvbnN0IHJlY29yZCBvZiBvcmlnaW5SZWNvcmRzKXtjb25zdCB0aW1pbmc9cmVjb3JkLnRpbWluZztpZighdGltaW5nKWNvbnRpbnVlO2NvbnN0IHZhbHVlPWl0ZXJhdGVlKHtyZWNvcmQsdGltaW5nLGNvbm5lY3Rpb25SZXVzZWQ6Y29ubmVjdGlvbldhc1JldXNlZC5nZXQocmVjb3JkLnJlcXVlc3RJZCl9KTtpZih0eXBlb2YgdmFsdWUhPT0ndW5kZWZpbmVkJyl7b3JpZ2luRXN0aW1hdGVzPW9yaWdpbkVzdGltYXRlcy5jb25jYXQodmFsdWUpO319CmlmKCFvcmlnaW5Fc3RpbWF0ZXMubGVuZ3RoKWNvbnRpbnVlO2VzdGltYXRlcy5zZXQob3JpZ2luLG9yaWdpbkVzdGltYXRlcyk7fQpyZXR1cm4gZXN0aW1hdGVzO30Kc3RhdGljIF9lc3RpbWF0ZVJUVEJ5T3JpZ2luVmlhVENQVGltaW5nKHJlY29yZHMpe3JldHVybiBOZXR3b3JrQW5hbHl6ZXIuX2VzdGltYXRlVmFsdWVCeU9yaWdpbihyZWNvcmRzLCh7dGltaW5nLGNvbm5lY3Rpb25SZXVzZWR9KT0+e2lmKGNvbm5lY3Rpb25SZXVzZWQpcmV0dXJuO2lmKHRpbWluZy5zc2xTdGFydD4wJiZ0aW1pbmcuc3NsRW5kPjApe3JldHVyblt0aW1pbmcuY29ubmVjdEVuZC10aW1pbmcuc3NsU3RhcnQsdGltaW5nLnNzbFN0YXJ0LXRpbWluZy5jb25uZWN0U3RhcnRdO31lbHNlIGlmKHRpbWluZy5jb25uZWN0U3RhcnQ+MCYmdGltaW5nLmNvbm5lY3RFbmQ+MCl7cmV0dXJuIHRpbWluZy5jb25uZWN0RW5kLXRpbWluZy5jb25uZWN0U3RhcnQ7fX0pO30Kc3RhdGljIF9lc3RpbWF0ZVJUVEJ5T3JpZ2luVmlhRG93bmxvYWRUaW1pbmcocmVjb3Jkcyl7cmV0dXJuIE5ldHdvcmtBbmFseXplci5fZXN0aW1hdGVWYWx1ZUJ5T3JpZ2luKHJlY29yZHMsKHtyZWNvcmQsdGltaW5nLGNvbm5lY3Rpb25SZXVzZWR9KT0+e2lmKGNvbm5lY3Rpb25SZXVzZWQpcmV0dXJuO2lmKHJlY29yZC50cmFuc2ZlclNpemU8PUlOSVRJQUxfQ1dEKXJldHVybjtpZighTnVtYmVyLmlzRmluaXRlKHRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZCl8fHRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZDwwKXJldHVybjtjb25zdCB0b3RhbFRpbWU9KHJlY29yZC5lbmRUaW1lLXJlY29yZC5zdGFydFRpbWUpKjEwMDA7Y29uc3QgZG93bmxvYWRUaW1lQWZ0ZXJGaXJzdEJ5dGU9dG90YWxUaW1lLXRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZDtjb25zdCBudW1iZXJPZlJvdW5kVHJpcHM9TWF0aC5sb2cyKHJlY29yZC50cmFuc2ZlclNpemUvSU5JVElBTF9DV0QpO2lmKG51bWJlck9mUm91bmRUcmlwcz41KXJldHVybjtyZXR1cm4gZG93bmxvYWRUaW1lQWZ0ZXJGaXJzdEJ5dGUvbnVtYmVyT2ZSb3VuZFRyaXBzO30pO30Kc3RhdGljIF9lc3RpbWF0ZVJUVEJ5T3JpZ2luVmlhU2VuZFN0YXJ0VGltaW5nKHJlY29yZHMpe3JldHVybiBOZXR3b3JrQW5hbHl6ZXIuX2VzdGltYXRlVmFsdWVCeU9yaWdpbihyZWNvcmRzLCh7cmVjb3JkLHRpbWluZyxjb25uZWN0aW9uUmV1c2VkfSk9PntpZihjb25uZWN0aW9uUmV1c2VkKXJldHVybjtpZighTnVtYmVyLmlzRmluaXRlKHRpbWluZy5zZW5kU3RhcnQpfHx0aW1pbmcuc2VuZFN0YXJ0PDApcmV0dXJuO2xldCByb3VuZFRyaXBzPTE7aWYocmVjb3JkLnBhcnNlZFVSTC5zY2hlbWU9PT0naHR0cHMnKXJvdW5kVHJpcHMrPTE7cmV0dXJuIHRpbWluZy5zZW5kU3RhcnQvcm91bmRUcmlwczt9KTt9CnN0YXRpYyBfZXN0aW1hdGVSZXNwb25zZVRpbWVCeU9yaWdpbihyZWNvcmRzLHJ0dEJ5T3JpZ2luKXtyZXR1cm4gTmV0d29ya0FuYWx5emVyLl9lc3RpbWF0ZVZhbHVlQnlPcmlnaW4ocmVjb3Jkcywoe3JlY29yZCx0aW1pbmd9KT0+e2lmKCFOdW1iZXIuaXNGaW5pdGUodGltaW5nLnJlY2VpdmVIZWFkZXJzRW5kKXx8dGltaW5nLnJlY2VpdmVIZWFkZXJzRW5kPDApcmV0dXJuO2lmKCFOdW1iZXIuaXNGaW5pdGUodGltaW5nLnNlbmRFbmQpfHx0aW1pbmcuc2VuZEVuZDwwKXJldHVybjtjb25zdCB0dGZiPXRpbWluZy5yZWNlaXZlSGVhZGVyc0VuZC10aW1pbmcuc2VuZEVuZDtjb25zdCBvcmlnaW49cmVjb3JkLnBhcnNlZFVSTC5zZWN1cml0eU9yaWdpbjtjb25zdCBydHQ9cnR0QnlPcmlnaW4uZ2V0KG9yaWdpbil8fHJ0dEJ5T3JpZ2luLmdldChOZXR3b3JrQW5hbHl6ZXIuU1VNTUFSWSl8fDA7cmV0dXJuIE1hdGgubWF4KHR0ZmItcnR0LDApO30pO30Kc3RhdGljIGNhblRydXN0Q29ubmVjdGlvbkluZm9ybWF0aW9uKHJlY29yZHMpe2NvbnN0IGNvbm5lY3Rpb25JZFdhc1N0YXJ0ZWQ9bmV3IE1hcCgpO2Zvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7Y29uc3Qgc3RhcnRlZD1jb25uZWN0aW9uSWRXYXNTdGFydGVkLmdldChyZWNvcmQuY29ubmVjdGlvbklkKXx8IXJlY29yZC5jb25uZWN0aW9uUmV1c2VkO2Nvbm5lY3Rpb25JZFdhc1N0YXJ0ZWQuc2V0KHJlY29yZC5jb25uZWN0aW9uSWQsc3RhcnRlZCk7fQppZihjb25uZWN0aW9uSWRXYXNTdGFydGVkLnNpemU8PTEpcmV0dXJuIGZhbHNlO3JldHVybiBBcnJheS5mcm9tKGNvbm5lY3Rpb25JZFdhc1N0YXJ0ZWQudmFsdWVzKCkpLmV2ZXJ5KHN0YXJ0ZWQ9PnN0YXJ0ZWQpO30Kc3RhdGljIGVzdGltYXRlSWZDb25uZWN0aW9uV2FzUmV1c2VkKHJlY29yZHMsb3B0aW9ucyl7b3B0aW9ucz1PYmplY3QuYXNzaWduKHtmb3JjZUNvYXJzZUVzdGltYXRlczpmYWxzZX0sb3B0aW9ucyk7aWYoIW9wdGlvbnMuZm9yY2VDb2Fyc2VFc3RpbWF0ZXMmJk5ldHdvcmtBbmFseXplci5jYW5UcnVzdENvbm5lY3Rpb25JbmZvcm1hdGlvbihyZWNvcmRzKSl7cmV0dXJuIG5ldyBNYXAocmVjb3Jkcy5tYXAocmVjb3JkPT5bcmVjb3JkLnJlcXVlc3RJZCwhIXJlY29yZC5jb25uZWN0aW9uUmV1c2VkXSkpO30KY29uc3QgY29ubmVjdGlvbldhc1JldXNlZD1uZXcgTWFwKCk7Y29uc3QgZ3JvdXBlZEJ5T3JpZ2luPU5ldHdvcmtBbmFseXplci5ncm91cEJ5T3JpZ2luKHJlY29yZHMpO2Zvcihjb25zdFtfLG9yaWdpblJlY29yZHNdb2YgZ3JvdXBlZEJ5T3JpZ2luLmVudHJpZXMoKSl7Y29uc3QgZWFybGllc3RSZXVzZVBvc3NpYmxlPW9yaWdpblJlY29yZHMubWFwKHJlY29yZD0+cmVjb3JkLmVuZFRpbWUpLnJlZHVjZSgoYSxiKT0+TWF0aC5taW4oYSxiKSxJbmZpbml0eSk7Zm9yKGNvbnN0IHJlY29yZCBvZiBvcmlnaW5SZWNvcmRzKXtjb25uZWN0aW9uV2FzUmV1c2VkLnNldChyZWNvcmQucmVxdWVzdElkLHJlY29yZC5zdGFydFRpbWU+PWVhcmxpZXN0UmV1c2VQb3NzaWJsZXx8cmVjb3JkLnByb3RvY29sPT09J2gyJyk7fQpjb25zdCBmaXJzdFJlY29yZD1vcmlnaW5SZWNvcmRzLnJlZHVjZSgoYSxiKT0+YS5zdGFydFRpbWU+Yi5zdGFydFRpbWU/YjphKTtjb25uZWN0aW9uV2FzUmV1c2VkLnNldChmaXJzdFJlY29yZC5yZXF1ZXN0SWQsZmFsc2UpO30KcmV0dXJuIGNvbm5lY3Rpb25XYXNSZXVzZWQ7fQpzdGF0aWMgZXN0aW1hdGVSVFRCeU9yaWdpbihyZWNvcmRzLG9wdGlvbnMpe29wdGlvbnM9T2JqZWN0LmFzc2lnbih7Zm9yY2VDb2Fyc2VFc3RpbWF0ZXM6ZmFsc2UsY29hcnNlRXN0aW1hdGVNdWx0aXBsaWVyOjAuNX0sb3B0aW9ucyk7bGV0IGVzdGltYXRlc0J5T3JpZ2luPU5ldHdvcmtBbmFseXplci5fZXN0aW1hdGVSVFRCeU9yaWdpblZpYVRDUFRpbWluZyhyZWNvcmRzKTtpZighZXN0aW1hdGVzQnlPcmlnaW4uc2l6ZXx8b3B0aW9ucy5mb3JjZUNvYXJzZUVzdGltYXRlcyl7ZXN0aW1hdGVzQnlPcmlnaW49bmV3IE1hcCgpO2NvbnN0IGVzdGltYXRlc1ZpYURvd25sb2FkPU5ldHdvcmtBbmFseXplci5fZXN0aW1hdGVSVFRCeU9yaWdpblZpYURvd25sb2FkVGltaW5nKHJlY29yZHMpO2NvbnN0IGVzdGltYXRlc1ZpYVNlbmRTdGFydD1OZXR3b3JrQW5hbHl6ZXIuX2VzdGltYXRlUlRUQnlPcmlnaW5WaWFTZW5kU3RhcnRUaW1pbmcocmVjb3Jkcyk7Zm9yKGNvbnN0W29yaWdpbixlc3RpbWF0ZXNdb2YgZXN0aW1hdGVzVmlhRG93bmxvYWQuZW50cmllcygpKXtlc3RpbWF0ZXNCeU9yaWdpbi5zZXQob3JpZ2luLGVzdGltYXRlcyk7fQpmb3IoY29uc3Rbb3JpZ2luLGVzdGltYXRlc11vZiBlc3RpbWF0ZXNWaWFTZW5kU3RhcnQuZW50cmllcygpKXtjb25zdCBleGlzdGluZz1lc3RpbWF0ZXNCeU9yaWdpbi5nZXQob3JpZ2luKXx8W107ZXN0aW1hdGVzQnlPcmlnaW4uc2V0KG9yaWdpbixleGlzdGluZy5jb25jYXQoZXN0aW1hdGVzKSk7fQpmb3IoY29uc3QgZXN0aW1hdGVzIG9mIGVzdGltYXRlc0J5T3JpZ2luLnZhbHVlcygpKXtlc3RpbWF0ZXMuZm9yRWFjaCgoeCxpKT0+ZXN0aW1hdGVzW2ldPXgqb3B0aW9ucy5jb2Fyc2VFc3RpbWF0ZU11bHRpcGxpZXIpO319CmlmKCFlc3RpbWF0ZXNCeU9yaWdpbi5zaXplKXRocm93IG5ldyBFcnJvcignTm8gdGltaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZScpO3JldHVybiBOZXR3b3JrQW5hbHl6ZXIuc3VtbWFyaXplKGVzdGltYXRlc0J5T3JpZ2luKTt9CnN0YXRpYyBlc3RpbWF0ZVNlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luKHJlY29yZHMsb3B0aW9ucyl7b3B0aW9ucz1PYmplY3QuYXNzaWduKHtydHRCeU9yaWdpbjpudWxsfSxvcHRpb25zKTtsZXQgcnR0QnlPcmlnaW49b3B0aW9ucy5ydHRCeU9yaWdpbjtpZighcnR0QnlPcmlnaW4pe3J0dEJ5T3JpZ2luPU5ldHdvcmtBbmFseXplci5lc3RpbWF0ZVJUVEJ5T3JpZ2luKHJlY29yZHMsb3B0aW9ucyk7Zm9yKGNvbnN0W29yaWdpbixzdW1tYXJ5XW9mIHJ0dEJ5T3JpZ2luLmVudHJpZXMoKSl7cnR0QnlPcmlnaW4uc2V0KG9yaWdpbixzdW1tYXJ5Lm1pbik7fX0KY29uc3QgZXN0aW1hdGVzQnlPcmlnaW49TmV0d29ya0FuYWx5emVyLl9lc3RpbWF0ZVJlc3BvbnNlVGltZUJ5T3JpZ2luKHJlY29yZHMscnR0QnlPcmlnaW4pO3JldHVybiBOZXR3b3JrQW5hbHl6ZXIuc3VtbWFyaXplKGVzdGltYXRlc0J5T3JpZ2luKTt9CnN0YXRpYyBmaW5kTWFpbkRvY3VtZW50KHJlY29yZHMpe2NvbnN0IGRvY3VtZW50UmVxdWVzdHM9cmVjb3Jkcy5maWx0ZXIocmVjb3JkPT5yZWNvcmQucmVzb3VyY2VUeXBlPT09TmV0d29ya1JlcXVlc3QuVFlQRVMuRG9jdW1lbnQpO3JldHVybiBkb2N1bWVudFJlcXVlc3RzLnNvcnQoKGEsYik9PmEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lKVswXTt9fQptb2R1bGUuZXhwb3J0cz1OZXR3b3JrQW5hbHl6ZXI7fSx7Ii4uLy4uL25ldHdvcmstcmVxdWVzdCI6Mzh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJhc2VOb2RlPXJlcXVpcmUoJy4uL2Jhc2Utbm9kZScpO2NvbnN0IFRjcENvbm5lY3Rpb249cmVxdWlyZSgnLi90Y3AtY29ubmVjdGlvbicpO2NvbnN0IENvbm5lY3Rpb25Qb29sPXJlcXVpcmUoJy4vY29ubmVjdGlvbi1wb29sJyk7Y29uc3QgRE5TQ2FjaGU9cmVxdWlyZSgnLi9kbnMtY2FjaGUnKTtjb25zdCBtb2JpbGUzRz1yZXF1aXJlKCcuLi8uLi8uLi9jb25maWcvY29uc3RhbnRzJykudGhyb3R0bGluZy5tb2JpbGUzRztjb25zdCBERUZBVUxUX01BWElNVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUz0xMDtjb25zdCBERUZBVUxUX0xBWU9VVF9UQVNLX01VTFRJUExJRVI9MC41O2NvbnN0IERFRkFVTFRfTUFYSU1VTV9DUFVfVEFTS19EVVJBVElPTj0xMDAwMDtjb25zdCBOb2RlU3RhdGU9e05vdFJlYWR5VG9TdGFydDowLFJlYWR5VG9TdGFydDoxLEluUHJvZ3Jlc3M6MixDb21wbGV0ZTozfTtjb25zdCBBTExfU0lNVUxBVElPTl9OT0RFX1RJTUlOR1M9bmV3IE1hcCgpO2NsYXNzIFNpbXVsYXRvcntjb25zdHJ1Y3RvcihvcHRpb25zKXt0aGlzLl9vcHRpb25zPU9iamVjdC5hc3NpZ24oe3J0dDptb2JpbGUzRy5ydHRNcyx0aHJvdWdocHV0Om1vYmlsZTNHLnRocm91Z2hwdXRLYnBzKjEwMjQsbWF4aW11bUNvbmN1cnJlbnRSZXF1ZXN0czpERUZBVUxUX01BWElNVU1fQ09OQ1VSUkVOVF9SRVFVRVNUUyxjcHVTbG93ZG93bk11bHRpcGxpZXI6bW9iaWxlM0cuY3B1U2xvd2Rvd25NdWx0aXBsaWVyLGxheW91dFRhc2tNdWx0aXBsaWVyOkRFRkFVTFRfTEFZT1VUX1RBU0tfTVVMVElQTElFUixhZGRpdGlvbmFsUnR0QnlPcmlnaW46bmV3IE1hcCgpLHNlcnZlclJlc3BvbnNlVGltZUJ5T3JpZ2luOm5ldyBNYXAoKX0sb3B0aW9ucyk7dGhpcy5fcnR0PXRoaXMuX29wdGlvbnMucnR0O3RoaXMuX3Rocm91Z2hwdXQ9dGhpcy5fb3B0aW9ucy50aHJvdWdocHV0O3RoaXMuX21heGltdW1Db25jdXJyZW50UmVxdWVzdHM9TWF0aC5tYXgoTWF0aC5taW4oVGNwQ29ubmVjdGlvbi5tYXhpbXVtU2F0dXJhdGVkQ29ubmVjdGlvbnModGhpcy5fcnR0LHRoaXMuX3Rocm91Z2hwdXQpLHRoaXMuX29wdGlvbnMubWF4aW11bUNvbmN1cnJlbnRSZXF1ZXN0cyksMSk7dGhpcy5fY3B1U2xvd2Rvd25NdWx0aXBsaWVyPXRoaXMuX29wdGlvbnMuY3B1U2xvd2Rvd25NdWx0aXBsaWVyO3RoaXMuX2xheW91dFRhc2tNdWx0aXBsaWVyPXRoaXMuX2NwdVNsb3dkb3duTXVsdGlwbGllcip0aGlzLl9vcHRpb25zLmxheW91dFRhc2tNdWx0aXBsaWVyO3RoaXMuX2ZsZXhpYmxlT3JkZXJpbmc9ZmFsc2U7dGhpcy5fbm9kZVRpbWluZ3M9bmV3IE1hcCgpO3RoaXMuX251bWJlckluUHJvZ3Jlc3NCeVR5cGU9bmV3IE1hcCgpO3RoaXMuX25vZGVzPXt9O3RoaXMuX2Rucz1uZXcgRE5TQ2FjaGUoe3J0dDp0aGlzLl9ydHR9KTt0aGlzLl9jb25uZWN0aW9uUG9vbD1udWxsO30KX2luaXRpYWxpemVDb25uZWN0aW9uUG9vbChncmFwaCl7Y29uc3QgcmVjb3Jkcz1bXTtncmFwaC5nZXRSb290Tm9kZSgpLnRyYXZlcnNlKG5vZGU9PntpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5ORVRXT1JLKXtyZWNvcmRzLnB1c2gobm9kZS5yZWNvcmQpO319KTt0aGlzLl9jb25uZWN0aW9uUG9vbD1uZXcgQ29ubmVjdGlvblBvb2wocmVjb3Jkcyx0aGlzLl9vcHRpb25zKTt9Cl9pbml0aWFsaXplQXV4aWxpYXJ5RGF0YSgpe3RoaXMuX25vZGVUaW1pbmdzPW5ldyBNYXAoKTt0aGlzLl9udW1iZXJJblByb2dyZXNzQnlUeXBlPW5ldyBNYXAoKTt0aGlzLl9ub2Rlcz17fTtmb3IoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKE5vZGVTdGF0ZSkpe3RoaXMuX25vZGVzW05vZGVTdGF0ZVtrZXldXT1uZXcgU2V0KCk7fX0KX251bWJlckluUHJvZ3Jlc3ModHlwZSl7cmV0dXJuIHRoaXMuX251bWJlckluUHJvZ3Jlc3NCeVR5cGUuZ2V0KHR5cGUpfHwwO30KX3NldFRpbWluZ0RhdGEobm9kZSx2YWx1ZXMpe2NvbnN0IHRpbWluZ0RhdGE9dGhpcy5fbm9kZVRpbWluZ3MuZ2V0KG5vZGUpfHx7fTtPYmplY3QuYXNzaWduKHRpbWluZ0RhdGEsdmFsdWVzKTt0aGlzLl9ub2RlVGltaW5ncy5zZXQobm9kZSx0aW1pbmdEYXRhKTt9Cl9nZXRUaW1pbmdEYXRhKG5vZGUpe2NvbnN0IHRpbWluZ0RhdGE9dGhpcy5fbm9kZVRpbWluZ3MuZ2V0KG5vZGUpO2lmKCF0aW1pbmdEYXRhKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGdldCB0aW1pbmcgZGF0YSBmb3Igbm9kZSAke25vZGUuaWR9YCk7cmV0dXJuIHRpbWluZ0RhdGE7fQpfbWFya05vZGVBc1JlYWR5VG9TdGFydChub2RlLHF1ZXVlZFRpbWUpe3RoaXMuX25vZGVzW05vZGVTdGF0ZS5SZWFkeVRvU3RhcnRdLmFkZChub2RlKTt0aGlzLl9ub2Rlc1tOb2RlU3RhdGUuTm90UmVhZHlUb1N0YXJ0XS5kZWxldGUobm9kZSk7dGhpcy5fc2V0VGltaW5nRGF0YShub2RlLHtxdWV1ZWRUaW1lfSk7fQpfbWFya05vZGVBc0luUHJvZ3Jlc3Mobm9kZSxzdGFydFRpbWUpe3RoaXMuX25vZGVzW05vZGVTdGF0ZS5JblByb2dyZXNzXS5hZGQobm9kZSk7dGhpcy5fbm9kZXNbTm9kZVN0YXRlLlJlYWR5VG9TdGFydF0uZGVsZXRlKG5vZGUpO3RoaXMuX251bWJlckluUHJvZ3Jlc3NCeVR5cGUuc2V0KG5vZGUudHlwZSx0aGlzLl9udW1iZXJJblByb2dyZXNzKG5vZGUudHlwZSkrMSk7dGhpcy5fc2V0VGltaW5nRGF0YShub2RlLHtzdGFydFRpbWV9KTt9Cl9tYXJrTm9kZUFzQ29tcGxldGUobm9kZSxlbmRUaW1lKXt0aGlzLl9ub2Rlc1tOb2RlU3RhdGUuQ29tcGxldGVdLmFkZChub2RlKTt0aGlzLl9ub2Rlc1tOb2RlU3RhdGUuSW5Qcm9ncmVzc10uZGVsZXRlKG5vZGUpO3RoaXMuX251bWJlckluUHJvZ3Jlc3NCeVR5cGUuc2V0KG5vZGUudHlwZSx0aGlzLl9udW1iZXJJblByb2dyZXNzKG5vZGUudHlwZSktMSk7dGhpcy5fc2V0VGltaW5nRGF0YShub2RlLHtlbmRUaW1lfSk7Zm9yKGNvbnN0IGRlcGVuZGVudCBvZiBub2RlLmdldERlcGVuZGVudHMoKSl7Y29uc3QgZGVwZW5kZW5jaWVzPWRlcGVuZGVudC5nZXREZXBlbmRlbmNpZXMoKTtpZihkZXBlbmRlbmNpZXMuc29tZShkZXA9PiF0aGlzLl9ub2Rlc1tOb2RlU3RhdGUuQ29tcGxldGVdLmhhcyhkZXApKSljb250aW51ZTt0aGlzLl9tYXJrTm9kZUFzUmVhZHlUb1N0YXJ0KGRlcGVuZGVudCxlbmRUaW1lKTt9fQpfYWNxdWlyZUNvbm5lY3Rpb24ocmVjb3JkKXtyZXR1cm4gdGhpcy5fY29ubmVjdGlvblBvb2wuYWNxdWlyZShyZWNvcmQse2lnbm9yZUNvbm5lY3Rpb25SZXVzZWQ6dGhpcy5fZmxleGlibGVPcmRlcmluZ30pO30KX3N0YXJ0Tm9kZUlmUG9zc2libGUobm9kZSx0b3RhbEVsYXBzZWRUaW1lKXtpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5DUFUpe2lmKHRoaXMuX251bWJlckluUHJvZ3Jlc3Mobm9kZS50eXBlKT09PTApe3RoaXMuX21hcmtOb2RlQXNJblByb2dyZXNzKG5vZGUsdG90YWxFbGFwc2VkVGltZSk7dGhpcy5fc2V0VGltaW5nRGF0YShub2RlLHt0aW1lRWxhcHNlZDowfSk7fQpyZXR1cm47fQppZihub2RlLnR5cGUhPT1CYXNlTm9kZS5UWVBFUy5ORVRXT1JLKXRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQnKTtpZighbm9kZS5mcm9tRGlza0NhY2hlKXtjb25zdCBudW1iZXJPZkFjdGl2ZVJlcXVlc3RzPXRoaXMuX251bWJlckluUHJvZ3Jlc3Mobm9kZS50eXBlKTtpZihudW1iZXJPZkFjdGl2ZVJlcXVlc3RzPj10aGlzLl9tYXhpbXVtQ29uY3VycmVudFJlcXVlc3RzKXJldHVybjtjb25zdCBjb25uZWN0aW9uPXRoaXMuX2FjcXVpcmVDb25uZWN0aW9uKG5vZGUucmVjb3JkKTtpZighY29ubmVjdGlvbilyZXR1cm47fQp0aGlzLl9tYXJrTm9kZUFzSW5Qcm9ncmVzcyhub2RlLHRvdGFsRWxhcHNlZFRpbWUpO3RoaXMuX3NldFRpbWluZ0RhdGEobm9kZSx7dGltZUVsYXBzZWQ6MCx0aW1lRWxhcHNlZE92ZXJzaG9vdDowLGJ5dGVzRG93bmxvYWRlZDowfSk7fQpfdXBkYXRlTmV0d29ya0NhcGFjaXR5KCl7Zm9yKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvblBvb2wuY29ubmVjdGlvbnNJblVzZSgpKXtjb25uZWN0aW9uLnNldFRocm91Z2hwdXQodGhpcy5fdGhyb3VnaHB1dC90aGlzLl9ub2Rlc1tOb2RlU3RhdGUuSW5Qcm9ncmVzc10uc2l6ZSk7fX0KX2VzdGltYXRlVGltZVJlbWFpbmluZyhub2RlKXtpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5DUFUpe3JldHVybiB0aGlzLl9lc3RpbWF0ZUNQVVRpbWVSZW1haW5pbmcobm9kZSk7fWVsc2UgaWYobm9kZS50eXBlPT09QmFzZU5vZGUuVFlQRVMuTkVUV09SSyl7cmV0dXJuIHRoaXMuX2VzdGltYXRlTmV0d29ya1RpbWVSZW1haW5pbmcobm9kZSk7fWVsc2V7dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCcpO319Cl9lc3RpbWF0ZUNQVVRpbWVSZW1haW5pbmcoY3B1Tm9kZSl7Y29uc3QgdGltaW5nRGF0YT10aGlzLl9nZXRUaW1pbmdEYXRhKGNwdU5vZGUpO2NvbnN0IG11bHRpcGxpZXI9Y3B1Tm9kZS5kaWRQZXJmb3JtTGF5b3V0KCk/dGhpcy5fbGF5b3V0VGFza011bHRpcGxpZXI6dGhpcy5fY3B1U2xvd2Rvd25NdWx0aXBsaWVyO2NvbnN0IHRvdGFsRHVyYXRpb249TWF0aC5taW4oTWF0aC5yb3VuZChjcHVOb2RlLmV2ZW50LmR1ci8xMDAwKm11bHRpcGxpZXIpLERFRkFVTFRfTUFYSU1VTV9DUFVfVEFTS19EVVJBVElPTik7Y29uc3QgZXN0aW1hdGVkVGltZUVsYXBzZWQ9dG90YWxEdXJhdGlvbi10aW1pbmdEYXRhLnRpbWVFbGFwc2VkO3RoaXMuX3NldFRpbWluZ0RhdGEoY3B1Tm9kZSx7ZXN0aW1hdGVkVGltZUVsYXBzZWR9KTtyZXR1cm4gZXN0aW1hdGVkVGltZUVsYXBzZWQ7fQpfZXN0aW1hdGVOZXR3b3JrVGltZVJlbWFpbmluZyhuZXR3b3JrTm9kZSl7Y29uc3QgcmVjb3JkPW5ldHdvcmtOb2RlLnJlY29yZDtjb25zdCB0aW1pbmdEYXRhPXRoaXMuX2dldFRpbWluZ0RhdGEobmV0d29ya05vZGUpO2xldCB0aW1lRWxhcHNlZD0wO2lmKG5ldHdvcmtOb2RlLmZyb21EaXNrQ2FjaGUpe2NvbnN0IHNpemVJbk1iPShyZWNvcmQucmVzb3VyY2VTaXplfHwwKS8xMDI0LzEwMjQ7dGltZUVsYXBzZWQ9OCsyMCpzaXplSW5NYi10aW1pbmdEYXRhLnRpbWVFbGFwc2VkO31lbHNle2NvbnN0IGNvbm5lY3Rpb249dGhpcy5fYWNxdWlyZUNvbm5lY3Rpb24ocmVjb3JkKTtjb25zdCBkbnNSZXNvbHV0aW9uVGltZT10aGlzLl9kbnMuZ2V0VGltZVVudGlsUmVzb2x1dGlvbihyZWNvcmQse3JlcXVlc3RlZEF0OnRpbWluZ0RhdGEuc3RhcnRUaW1lLHNob3VsZFVwZGF0ZUNhY2hlOnRydWV9KTtjb25zdCB0aW1lQWxyZWFkeUVsYXBzZWQ9dGltaW5nRGF0YS50aW1lRWxhcHNlZDtjb25zdCBjYWxjdWxhdGlvbj1jb25uZWN0aW9uLnNpbXVsYXRlRG93bmxvYWRVbnRpbChyZWNvcmQudHJhbnNmZXJTaXplLXRpbWluZ0RhdGEuYnl0ZXNEb3dubG9hZGVkLHt0aW1lQWxyZWFkeUVsYXBzZWQsZG5zUmVzb2x1dGlvblRpbWUsbWF4aW11bVRpbWVUb0VsYXBzZTpJbmZpbml0eX0pO3RpbWVFbGFwc2VkPWNhbGN1bGF0aW9uLnRpbWVFbGFwc2VkO30KY29uc3QgZXN0aW1hdGVkVGltZUVsYXBzZWQ9dGltZUVsYXBzZWQrdGltaW5nRGF0YS50aW1lRWxhcHNlZE92ZXJzaG9vdDt0aGlzLl9zZXRUaW1pbmdEYXRhKG5ldHdvcmtOb2RlLHtlc3RpbWF0ZWRUaW1lRWxhcHNlZH0pO3JldHVybiBlc3RpbWF0ZWRUaW1lRWxhcHNlZDt9Cl9maW5kTmV4dE5vZGVDb21wbGV0aW9uVGltZSgpe2xldCBtaW5pbXVtVGltZT1JbmZpbml0eTtmb3IoY29uc3Qgbm9kZSBvZiB0aGlzLl9ub2Rlc1tOb2RlU3RhdGUuSW5Qcm9ncmVzc10pe21pbmltdW1UaW1lPU1hdGgubWluKG1pbmltdW1UaW1lLHRoaXMuX2VzdGltYXRlVGltZVJlbWFpbmluZyhub2RlKSk7fQpyZXR1cm4gbWluaW11bVRpbWU7fQpfdXBkYXRlUHJvZ3Jlc3NNYWRlSW5UaW1lUGVyaW9kKG5vZGUsdGltZVBlcmlvZExlbmd0aCx0b3RhbEVsYXBzZWRUaW1lKXtjb25zdCB0aW1pbmdEYXRhPXRoaXMuX2dldFRpbWluZ0RhdGEobm9kZSk7Y29uc3QgaXNGaW5pc2hlZD10aW1pbmdEYXRhLmVzdGltYXRlZFRpbWVFbGFwc2VkPT09dGltZVBlcmlvZExlbmd0aDtpZihub2RlLnR5cGU9PT1CYXNlTm9kZS5UWVBFUy5DUFV8fG5vZGUuZnJvbURpc2tDYWNoZSl7cmV0dXJuIGlzRmluaXNoZWQ/dGhpcy5fbWFya05vZGVBc0NvbXBsZXRlKG5vZGUsdG90YWxFbGFwc2VkVGltZSk6dGltaW5nRGF0YS50aW1lRWxhcHNlZCs9dGltZVBlcmlvZExlbmd0aDt9CmlmKG5vZGUudHlwZSE9PUJhc2VOb2RlLlRZUEVTLk5FVFdPUkspdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCcpO2NvbnN0IHJlY29yZD1ub2RlLnJlY29yZDtjb25zdCBjb25uZWN0aW9uPXRoaXMuX2FjcXVpcmVDb25uZWN0aW9uKHJlY29yZCk7Y29uc3QgZG5zUmVzb2x1dGlvblRpbWU9dGhpcy5fZG5zLmdldFRpbWVVbnRpbFJlc29sdXRpb24ocmVjb3JkLHtyZXF1ZXN0ZWRBdDp0aW1pbmdEYXRhLnN0YXJ0VGltZSxzaG91bGRVcGRhdGVDYWNoZTp0cnVlfSk7Y29uc3QgY2FsY3VsYXRpb249Y29ubmVjdGlvbi5zaW11bGF0ZURvd25sb2FkVW50aWwocmVjb3JkLnRyYW5zZmVyU2l6ZS10aW1pbmdEYXRhLmJ5dGVzRG93bmxvYWRlZCx7ZG5zUmVzb2x1dGlvblRpbWUsdGltZUFscmVhZHlFbGFwc2VkOnRpbWluZ0RhdGEudGltZUVsYXBzZWQsbWF4aW11bVRpbWVUb0VsYXBzZTp0aW1lUGVyaW9kTGVuZ3RoLXRpbWluZ0RhdGEudGltZUVsYXBzZWRPdmVyc2hvb3R9KTtjb25uZWN0aW9uLnNldENvbmdlc3Rpb25XaW5kb3coY2FsY3VsYXRpb24uY29uZ2VzdGlvbldpbmRvdyk7Y29ubmVjdGlvbi5zZXRIMk92ZXJmbG93Qnl0ZXNEb3dubG9hZGVkKGNhbGN1bGF0aW9uLmV4dHJhQnl0ZXNEb3dubG9hZGVkKTtpZihpc0ZpbmlzaGVkKXtjb25uZWN0aW9uLnNldFdhcm1lZCh0cnVlKTt0aGlzLl9jb25uZWN0aW9uUG9vbC5yZWxlYXNlKHJlY29yZCk7dGhpcy5fbWFya05vZGVBc0NvbXBsZXRlKG5vZGUsdG90YWxFbGFwc2VkVGltZSk7fWVsc2V7dGltaW5nRGF0YS50aW1lRWxhcHNlZCs9Y2FsY3VsYXRpb24udGltZUVsYXBzZWQ7dGltaW5nRGF0YS50aW1lRWxhcHNlZE92ZXJzaG9vdCs9Y2FsY3VsYXRpb24udGltZUVsYXBzZWQtdGltZVBlcmlvZExlbmd0aDt0aW1pbmdEYXRhLmJ5dGVzRG93bmxvYWRlZCs9Y2FsY3VsYXRpb24uYnl0ZXNEb3dubG9hZGVkO319Cl9jb21wdXRlRmluYWxOb2RlVGltaW5ncygpe2NvbnN0IG5vZGVUaW1pbmdzPW5ldyBNYXAoKTtmb3IoY29uc3Rbbm9kZSx0aW1pbmddb2YgdGhpcy5fbm9kZVRpbWluZ3Mpe25vZGVUaW1pbmdzLnNldChub2RlLHtzdGFydFRpbWU6dGltaW5nLnN0YXJ0VGltZSxlbmRUaW1lOnRpbWluZy5lbmRUaW1lLGR1cmF0aW9uOnRpbWluZy5lbmRUaW1lLXRpbWluZy5zdGFydFRpbWV9KTt9CnJldHVybiBub2RlVGltaW5nczt9CmdldE9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fb3B0aW9uczt9CnNpbXVsYXRlKGdyYXBoLG9wdGlvbnMpe2lmKEJhc2VOb2RlLmhhc0N5Y2xlKGdyYXBoKSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2ltdWxhdGUgZ3JhcGggd2l0aCBjeWNsZScpO30Kb3B0aW9ucz1PYmplY3QuYXNzaWduKHtsYWJlbDp1bmRlZmluZWQsZmxleGlibGVPcmRlcmluZzpmYWxzZX0sb3B0aW9ucyk7dGhpcy5fZmxleGlibGVPcmRlcmluZz0hIW9wdGlvbnMuZmxleGlibGVPcmRlcmluZzt0aGlzLl9kbnM9bmV3IEROU0NhY2hlKHtydHQ6dGhpcy5fcnR0fSk7dGhpcy5faW5pdGlhbGl6ZUNvbm5lY3Rpb25Qb29sKGdyYXBoKTt0aGlzLl9pbml0aWFsaXplQXV4aWxpYXJ5RGF0YSgpO2NvbnN0IG5vZGVzTm90UmVhZHlUb1N0YXJ0PXRoaXMuX25vZGVzW05vZGVTdGF0ZS5Ob3RSZWFkeVRvU3RhcnRdO2NvbnN0IG5vZGVzUmVhZHlUb1N0YXJ0PXRoaXMuX25vZGVzW05vZGVTdGF0ZS5SZWFkeVRvU3RhcnRdO2NvbnN0IG5vZGVzSW5Qcm9ncmVzcz10aGlzLl9ub2Rlc1tOb2RlU3RhdGUuSW5Qcm9ncmVzc107Y29uc3Qgcm9vdE5vZGU9Z3JhcGguZ2V0Um9vdE5vZGUoKTtyb290Tm9kZS50cmF2ZXJzZShub2RlPT5ub2Rlc05vdFJlYWR5VG9TdGFydC5hZGQobm9kZSkpO2xldCB0b3RhbEVsYXBzZWRUaW1lPTA7bGV0IGl0ZXJhdGlvbj0wO3RoaXMuX21hcmtOb2RlQXNSZWFkeVRvU3RhcnQocm9vdE5vZGUsdG90YWxFbGFwc2VkVGltZSk7d2hpbGUobm9kZXNSZWFkeVRvU3RhcnQuc2l6ZXx8bm9kZXNJblByb2dyZXNzLnNpemUpe2Zvcihjb25zdCBub2RlIG9mIG5vZGVzUmVhZHlUb1N0YXJ0KXt0aGlzLl9zdGFydE5vZGVJZlBvc3NpYmxlKG5vZGUsdG90YWxFbGFwc2VkVGltZSk7fQppZighbm9kZXNJblByb2dyZXNzLnNpemUpe2lmKHRoaXMuX2ZsZXhpYmxlT3JkZXJpbmcpdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc3RhcnQgYSBub2RlJyk7dGhpcy5fZmxleGlibGVPcmRlcmluZz10cnVlO2NvbnRpbnVlO30KdGhpcy5fdXBkYXRlTmV0d29ya0NhcGFjaXR5KCk7Y29uc3QgbWluaW11bVRpbWU9dGhpcy5fZmluZE5leHROb2RlQ29tcGxldGlvblRpbWUoKTt0b3RhbEVsYXBzZWRUaW1lKz1taW5pbXVtVGltZTtpZighTnVtYmVyLmlzRmluaXRlKG1pbmltdW1UaW1lKXx8aXRlcmF0aW9uPjEwMDAwMCl7dGhyb3cgbmV3IEVycm9yKCdHcmFwaCBjcmVhdGlvbiBmYWlsZWQsIGRlcHRoIGV4Y2VlZGVkJyk7fQppdGVyYXRpb24rKztmb3IoY29uc3Qgbm9kZSBvZiBub2Rlc0luUHJvZ3Jlc3Mpe3RoaXMuX3VwZGF0ZVByb2dyZXNzTWFkZUluVGltZVBlcmlvZChub2RlLG1pbmltdW1UaW1lLHRvdGFsRWxhcHNlZFRpbWUpO319CmNvbnN0IG5vZGVUaW1pbmdzPXRoaXMuX2NvbXB1dGVGaW5hbE5vZGVUaW1pbmdzKCk7QUxMX1NJTVVMQVRJT05fTk9ERV9USU1JTkdTLnNldChvcHRpb25zLmxhYmVsfHwndW5sYWJlbGVkJyxub2RlVGltaW5ncyk7cmV0dXJue3RpbWVJbk1zOnRvdGFsRWxhcHNlZFRpbWUsbm9kZVRpbWluZ3N9O30Kc3RhdGljIGdldCBBTExfTk9ERV9USU1JTkdTKCl7cmV0dXJuIEFMTF9TSU1VTEFUSU9OX05PREVfVElNSU5HUzt9fQptb2R1bGUuZXhwb3J0cz1TaW11bGF0b3I7fSx7Ii4uLy4uLy4uL2NvbmZpZy9jb25zdGFudHMiOjgsIi4uL2Jhc2Utbm9kZSI6MjIsIi4vY29ubmVjdGlvbi1wb29sIjoyNSwiLi9kbnMtY2FjaGUiOjI2LCIuL3RjcC1jb25uZWN0aW9uIjoyOX1dLDI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgSU5JVElBTF9DT05HRVNUSU9OX1dJTkRPVz0xMDtjb25zdCBUQ1BfU0VHTUVOVF9TSVpFPTE0NjA7Y2xhc3MgVGNwQ29ubmVjdGlvbntjb25zdHJ1Y3RvcihydHQsdGhyb3VnaHB1dCxzZXJ2ZXJMYXRlbmN5PTAsc3NsPXRydWUsaDI9ZmFsc2Upe3RoaXMuX3dhcm1lZD1mYWxzZTt0aGlzLl9zc2w9c3NsO3RoaXMuX2gyPWgyO3RoaXMuX3J0dD1ydHQ7dGhpcy5fdGhyb3VnaHB1dD10aHJvdWdocHV0O3RoaXMuX3NlcnZlckxhdGVuY3k9c2VydmVyTGF0ZW5jeTt0aGlzLl9jb25nZXN0aW9uV2luZG93PUlOSVRJQUxfQ09OR0VTVElPTl9XSU5ET1c7dGhpcy5faDJPdmVyZmxvd0J5dGVzRG93bmxvYWRlZD0wO30Kc3RhdGljIG1heGltdW1TYXR1cmF0ZWRDb25uZWN0aW9ucyhydHQsYXZhaWxhYmxlVGhyb3VnaHB1dCl7Y29uc3Qgcm91bmRUcmlwc1BlclNlY29uZD0xMDAwL3J0dDtjb25zdCBieXRlc1BlclJvdW5kVHJpcD1UQ1BfU0VHTUVOVF9TSVpFO2NvbnN0IGJ5dGVzUGVyU2Vjb25kPXJvdW5kVHJpcHNQZXJTZWNvbmQqYnl0ZXNQZXJSb3VuZFRyaXA7Y29uc3QgbWluaW11bVRocm91Z2hwdXRSZXF1aXJlZFBlclJlcXVlc3Q9Ynl0ZXNQZXJTZWNvbmQqODtyZXR1cm4gTWF0aC5mbG9vcihhdmFpbGFibGVUaHJvdWdocHV0L21pbmltdW1UaHJvdWdocHV0UmVxdWlyZWRQZXJSZXF1ZXN0KTt9Cl9jb21wdXRlTWF4aW11bUNvbmdlc3Rpb25XaW5kb3dJblNlZ21lbnRzKCl7Y29uc3QgYnl0ZXNQZXJTZWNvbmQ9dGhpcy5fdGhyb3VnaHB1dC84O2NvbnN0IHNlY29uZHNQZXJSb3VuZFRyaXA9dGhpcy5fcnR0LzEwMDA7Y29uc3QgYnl0ZXNQZXJSb3VuZFRyaXA9Ynl0ZXNQZXJTZWNvbmQqc2Vjb25kc1BlclJvdW5kVHJpcDtyZXR1cm4gTWF0aC5mbG9vcihieXRlc1BlclJvdW5kVHJpcC9UQ1BfU0VHTUVOVF9TSVpFKTt9CnNldFRocm91Z2hwdXQodGhyb3VnaHB1dCl7dGhpcy5fdGhyb3VnaHB1dD10aHJvdWdocHV0O30Kc2V0Q29uZ2VzdGlvbldpbmRvdyhjb25nZXN0aW9uKXt0aGlzLl9jb25nZXN0aW9uV2luZG93PWNvbmdlc3Rpb247fQpzZXRXYXJtZWQod2FybWVkKXt0aGlzLl93YXJtZWQ9d2FybWVkO30KaXNXYXJtKCl7cmV0dXJuIHRoaXMuX3dhcm1lZDt9CmlzSDIoKXtyZXR1cm4gdGhpcy5faDI7fQpnZXQgY29uZ2VzdGlvbldpbmRvdygpe3JldHVybiB0aGlzLl9jb25nZXN0aW9uV2luZG93O30Kc2V0SDJPdmVyZmxvd0J5dGVzRG93bmxvYWRlZChieXRlcyl7aWYoIXRoaXMuX2gyKXJldHVybjt0aGlzLl9oMk92ZXJmbG93Qnl0ZXNEb3dubG9hZGVkPWJ5dGVzO30KY2xvbmUoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgVGNwQ29ubmVjdGlvbih0aGlzLl9ydHQsdGhpcy5fdGhyb3VnaHB1dCksdGhpcyk7fQpzaW11bGF0ZURvd25sb2FkVW50aWwoYnl0ZXNUb0Rvd25sb2FkLG9wdGlvbnMpe2NvbnN0e3RpbWVBbHJlYWR5RWxhcHNlZD0wLG1heGltdW1UaW1lVG9FbGFwc2U9SW5maW5pdHksZG5zUmVzb2x1dGlvblRpbWU9MH09b3B0aW9uc3x8e307aWYodGhpcy5fd2FybWVkJiZ0aGlzLl9oMil7Ynl0ZXNUb0Rvd25sb2FkLT10aGlzLl9oMk92ZXJmbG93Qnl0ZXNEb3dubG9hZGVkO30KY29uc3QgdHdvV2F5TGF0ZW5jeT10aGlzLl9ydHQ7Y29uc3Qgb25lV2F5TGF0ZW5jeT10d29XYXlMYXRlbmN5LzI7Y29uc3QgbWF4aW11bUNvbmdlc3Rpb25XaW5kb3c9dGhpcy5fY29tcHV0ZU1heGltdW1Db25nZXN0aW9uV2luZG93SW5TZWdtZW50cygpO2xldCBoYW5kc2hha2VBbmRSZXF1ZXN0PW9uZVdheUxhdGVuY3k7aWYoIXRoaXMuX3dhcm1lZCl7aGFuZHNoYWtlQW5kUmVxdWVzdD1kbnNSZXNvbHV0aW9uVGltZSsKb25lV2F5TGF0ZW5jeSsKb25lV2F5TGF0ZW5jeSsKb25lV2F5TGF0ZW5jeSsodGhpcy5fc3NsP3R3b1dheUxhdGVuY3k6MCk7fQpsZXQgcm91bmRUcmlwcz1NYXRoLmNlaWwoaGFuZHNoYWtlQW5kUmVxdWVzdC90d29XYXlMYXRlbmN5KTtsZXQgdGltZVRvRmlyc3RCeXRlPWhhbmRzaGFrZUFuZFJlcXVlc3QrdGhpcy5fc2VydmVyTGF0ZW5jeStvbmVXYXlMYXRlbmN5O2lmKHRoaXMuX3dhcm1lZCYmdGhpcy5faDIpdGltZVRvRmlyc3RCeXRlPTA7Y29uc3QgdGltZUVsYXBzZWRGb3JUVEZCPU1hdGgubWF4KHRpbWVUb0ZpcnN0Qnl0ZS10aW1lQWxyZWFkeUVsYXBzZWQsMCk7Y29uc3QgbWF4aW11bURvd25sb2FkVGltZVRvRWxhcHNlPW1heGltdW1UaW1lVG9FbGFwc2UtdGltZUVsYXBzZWRGb3JUVEZCO2xldCBjb25nZXN0aW9uV2luZG93PU1hdGgubWluKHRoaXMuX2Nvbmdlc3Rpb25XaW5kb3csbWF4aW11bUNvbmdlc3Rpb25XaW5kb3cpO2xldCB0b3RhbEJ5dGVzRG93bmxvYWRlZD0wO2lmKHRpbWVFbGFwc2VkRm9yVFRGQj4wKXt0b3RhbEJ5dGVzRG93bmxvYWRlZD1jb25nZXN0aW9uV2luZG93KlRDUF9TRUdNRU5UX1NJWkU7fWVsc2V7cm91bmRUcmlwcz0wO30KbGV0IGRvd25sb2FkVGltZUVsYXBzZWQ9MDtsZXQgYnl0ZXNSZW1haW5pbmc9Ynl0ZXNUb0Rvd25sb2FkLXRvdGFsQnl0ZXNEb3dubG9hZGVkO3doaWxlKGJ5dGVzUmVtYWluaW5nPjAmJmRvd25sb2FkVGltZUVsYXBzZWQ8PW1heGltdW1Eb3dubG9hZFRpbWVUb0VsYXBzZSl7cm91bmRUcmlwcysrO2Rvd25sb2FkVGltZUVsYXBzZWQrPXR3b1dheUxhdGVuY3k7Y29uZ2VzdGlvbldpbmRvdz1NYXRoLm1heChNYXRoLm1pbihtYXhpbXVtQ29uZ2VzdGlvbldpbmRvdyxjb25nZXN0aW9uV2luZG93KjIpLDEpO2NvbnN0IGJ5dGVzRG93bmxvYWRlZEluV2luZG93PWNvbmdlc3Rpb25XaW5kb3cqVENQX1NFR01FTlRfU0laRTt0b3RhbEJ5dGVzRG93bmxvYWRlZCs9Ynl0ZXNEb3dubG9hZGVkSW5XaW5kb3c7Ynl0ZXNSZW1haW5pbmctPWJ5dGVzRG93bmxvYWRlZEluV2luZG93O30KY29uc3QgdGltZUVsYXBzZWQ9dGltZUVsYXBzZWRGb3JUVEZCK2Rvd25sb2FkVGltZUVsYXBzZWQ7Y29uc3QgZXh0cmFCeXRlc0Rvd25sb2FkZWQ9dGhpcy5faDI/TWF0aC5tYXgodG90YWxCeXRlc0Rvd25sb2FkZWQtYnl0ZXNUb0Rvd25sb2FkLDApOjA7Y29uc3QgYnl0ZXNEb3dubG9hZGVkPU1hdGgubWF4KE1hdGgubWluKHRvdGFsQnl0ZXNEb3dubG9hZGVkLGJ5dGVzVG9Eb3dubG9hZCksMCk7cmV0dXJue3JvdW5kVHJpcHMsdGltZUVsYXBzZWQsYnl0ZXNEb3dubG9hZGVkLGV4dHJhQnl0ZXNEb3dubG9hZGVkLGNvbmdlc3Rpb25XaW5kb3d9O319Cm1vZHVsZS5leHBvcnRzPVRjcENvbm5lY3Rpb247fSx7fV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBnZXRFbGVtZW50c0luRG9jdW1lbnQoc2VsZWN0b3Ipe2NvbnN0IHJlc3VsdHM9W107Y29uc3QgX2ZpbmRBbGxFbGVtZW50cz1ub2Rlcz0+e2ZvcihsZXQgaT0wLGVsO2VsPW5vZGVzW2ldOysraSl7aWYoIXNlbGVjdG9yfHxlbC5tYXRjaGVzKHNlbGVjdG9yKSl7cmVzdWx0cy5wdXNoKGVsKTt9CmlmKGVsLnNoYWRvd1Jvb3Qpe19maW5kQWxsRWxlbWVudHMoZWwuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO319fTtfZmluZEFsbEVsZW1lbnRzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSk7cmV0dXJuIHJlc3VsdHM7fQptb2R1bGUuZXhwb3J0cz17Z2V0RWxlbWVudHNJbkRvY3VtZW50Rm5TdHJpbmc6Z2V0RWxlbWVudHNJbkRvY3VtZW50LnRvU3RyaW5nKCl9O30se31dLDMxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgRHJpdmVyPXJlcXVpcmUoJy4uL2dhdGhlci9kcml2ZXIuanMnKTtjbGFzcyBFbGVtZW50e2NvbnN0cnVjdG9yKGVsZW1lbnQsZHJpdmVyKXtpZighZWxlbWVudHx8IWRyaXZlcil7dGhyb3cgRXJyb3IoJ0RyaXZlciBhbmQgZWxlbWVudCByZXF1aXJlZCB0byBjcmVhdGUgRWxlbWVudCcpO30KdGhpcy5kcml2ZXI9ZHJpdmVyO3RoaXMuZWxlbWVudD1lbGVtZW50O30KZ2V0QXR0cmlidXRlKG5hbWUpe3JldHVybiB0aGlzLmRyaXZlci5zZW5kQ29tbWFuZCgnRE9NLmdldEF0dHJpYnV0ZXMnLHtub2RlSWQ6dGhpcy5lbGVtZW50Lm5vZGVJZH0pLnRoZW4ocmVzcD0+e2NvbnN0IGF0dHJJbmRleD1yZXNwLmF0dHJpYnV0ZXMuaW5kZXhPZihuYW1lKTtpZihhdHRySW5kZXg9PT0tMSl7cmV0dXJuIG51bGw7fQpyZXR1cm4gcmVzcC5hdHRyaWJ1dGVzW2F0dHJJbmRleCsxXTt9KTt9CmdldE5vZGVJZCgpe3JldHVybiB0aGlzLmVsZW1lbnQubm9kZUlkO30KZ2V0UHJvcGVydHkocHJvcE5hbWUpe3JldHVybiB0aGlzLmRyaXZlci5zZW5kQ29tbWFuZCgnRE9NLnJlc29sdmVOb2RlJyx7bm9kZUlkOnRoaXMuZWxlbWVudC5ub2RlSWR9KS50aGVuKHJlc3A9PntpZighcmVzcC5vYmplY3Qub2JqZWN0SWQpe3JldHVybiBudWxsO30KcmV0dXJuIHRoaXMuZHJpdmVyLmdldE9iamVjdFByb3BlcnR5KHJlc3Aub2JqZWN0Lm9iamVjdElkLHByb3BOYW1lKTt9KS5jYXRjaCgoKT0+bnVsbCk7fX0KbW9kdWxlLmV4cG9ydHM9RWxlbWVudDt9LHsiLi4vZ2F0aGVyL2RyaXZlci5qcyI6MTd9XSwzMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IERyaXZlcj1yZXF1aXJlKCcuLi9nYXRoZXIvZHJpdmVyJyk7Y29uc3QgbW9iaWxlM0c9cmVxdWlyZSgnLi4vY29uZmlnL2NvbnN0YW50cycpLnRocm90dGxpbmcubW9iaWxlM0c7Y29uc3QgTkVYVVM1WF9FTVVMQVRJT05fTUVUUklDUz17bW9iaWxlOnRydWUsc2NyZWVuV2lkdGg6NDEyLHNjcmVlbkhlaWdodDo3MzIsd2lkdGg6NDEyLGhlaWdodDo3MzIscG9zaXRpb25YOjAscG9zaXRpb25ZOjAsc2NhbGU6MSxkZXZpY2VTY2FsZUZhY3RvcjoyLjYyNSxzY3JlZW5PcmllbnRhdGlvbjp7YW5nbGU6MCx0eXBlOidwb3J0cmFpdFByaW1hcnknfX07Y29uc3QgTkVYVVM1WF9VU0VSQUdFTlQ9e3VzZXJBZ2VudDonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2JysnKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjYuMC4zMzU5LjMwIE1vYmlsZSBTYWZhcmkvNTM3LjM2J307Y29uc3QgT0ZGTElORV9NRVRSSUNTPXtvZmZsaW5lOnRydWUsbGF0ZW5jeTowLGRvd25sb2FkVGhyb3VnaHB1dDowLHVwbG9hZFRocm91Z2hwdXQ6MH07Y29uc3QgTk9fVEhST1RUTElOR19NRVRSSUNTPXtsYXRlbmN5OjAsZG93bmxvYWRUaHJvdWdocHV0OjAsdXBsb2FkVGhyb3VnaHB1dDowLG9mZmxpbmU6ZmFsc2V9O2NvbnN0IE5PX0NQVV9USFJPVFRMRV9NRVRSSUNTPXtyYXRlOjF9O2NvbnN0IENQVV9USFJPVFRMRV9NRVRSSUNTPXtyYXRlOjR9O2Z1bmN0aW9uIGVuYWJsZU5leHVzNVgoZHJpdmVyKXtyZXR1cm4gUHJvbWlzZS5hbGwoW2RyaXZlci5zZW5kQ29tbWFuZCgnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsTkVYVVM1WF9FTVVMQVRJT05fTUVUUklDUyksZHJpdmVyLnNlbmRDb21tYW5kKCdOZXR3b3JrLmVuYWJsZScpLGRyaXZlci5zZW5kQ29tbWFuZCgnTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZScsTkVYVVM1WF9VU0VSQUdFTlQpLGRyaXZlci5zZW5kQ29tbWFuZCgnRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCcse2VuYWJsZWQ6dHJ1ZX0pXSk7fQpmdW5jdGlvbiBlbmFibGVOZXR3b3JrVGhyb3R0bGluZyhkcml2ZXIsdGhyb3R0bGluZ1NldHRpbmdzPW1vYmlsZTNHKXtjb25zdCBjb25kaXRpb25zPXtvZmZsaW5lOmZhbHNlLGxhdGVuY3k6dGhyb3R0bGluZ1NldHRpbmdzLnJlcXVlc3RMYXRlbmN5TXN8fDAsZG93bmxvYWRUaHJvdWdocHV0OnRocm90dGxpbmdTZXR0aW5ncy5kb3dubG9hZFRocm91Z2hwdXRLYnBzfHwwLHVwbG9hZFRocm91Z2hwdXQ6dGhyb3R0bGluZ1NldHRpbmdzLnVwbG9hZFRocm91Z2hwdXRLYnBzfHwwfTtjb25kaXRpb25zLmRvd25sb2FkVGhyb3VnaHB1dD1NYXRoLmZsb29yKGNvbmRpdGlvbnMuZG93bmxvYWRUaHJvdWdocHV0KjEwMjQvOCk7Y29uZGl0aW9ucy51cGxvYWRUaHJvdWdocHV0PU1hdGguZmxvb3IoY29uZGl0aW9ucy51cGxvYWRUaHJvdWdocHV0KjEwMjQvOCk7cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnTmV0d29yay5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMnLGNvbmRpdGlvbnMpO30KZnVuY3Rpb24gY2xlYXJBbGxOZXR3b3JrRW11bGF0aW9uKGRyaXZlcil7cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnTmV0d29yay5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMnLE5PX1RIUk9UVExJTkdfTUVUUklDUyk7fQpmdW5jdGlvbiBnb09mZmxpbmUoZHJpdmVyKXtyZXR1cm4gZHJpdmVyLnNlbmRDb21tYW5kKCdOZXR3b3JrLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucycsT0ZGTElORV9NRVRSSUNTKTt9CmZ1bmN0aW9uIGVuYWJsZUNQVVRocm90dGxpbmcoZHJpdmVyLHRocm90dGxpbmdTZXR0aW5ncyl7Y29uc3QgcmF0ZT10aHJvdHRsaW5nU2V0dGluZ3MmJnRocm90dGxpbmdTZXR0aW5ncy5jcHVTbG93ZG93bk11bHRpcGxpZXIhPT11bmRlZmluZWQ/dGhyb3R0bGluZ1NldHRpbmdzLmNwdVNsb3dkb3duTXVsdGlwbGllcjpDUFVfVEhST1RUTEVfTUVUUklDUy5yYXRlO3JldHVybiBkcml2ZXIuc2VuZENvbW1hbmQoJ0VtdWxhdGlvbi5zZXRDUFVUaHJvdHRsaW5nUmF0ZScse3JhdGV9KTt9CmZ1bmN0aW9uIGRpc2FibGVDUFVUaHJvdHRsaW5nKGRyaXZlcil7cmV0dXJuIGRyaXZlci5zZW5kQ29tbWFuZCgnRW11bGF0aW9uLnNldENQVVRocm90dGxpbmdSYXRlJyxOT19DUFVfVEhST1RUTEVfTUVUUklDUyk7fQptb2R1bGUuZXhwb3J0cz17ZW5hYmxlTmV4dXM1WCxlbmFibGVOZXR3b3JrVGhyb3R0bGluZyxjbGVhckFsbE5ldHdvcmtFbXVsYXRpb24sZW5hYmxlQ1BVVGhyb3R0bGluZyxkaXNhYmxlQ1BVVGhyb3R0bGluZyxnb09mZmxpbmV9O30seyIuLi9jb25maWcvY29uc3RhbnRzIjo4LCIuLi9nYXRoZXIvZHJpdmVyIjoxN31dLDMzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3Qgc3RyaW5ncz1yZXF1aXJlKCcuL3N0cmluZ3MnKTtjbGFzcyBMaWdodGhvdXNlRXJyb3IgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlcnJvckRlZmluaXRpb24scHJvcGVydGllcyl7c3VwZXIoZXJyb3JEZWZpbml0aW9uLmNvZGUpO3RoaXMubmFtZT0nTEhFcnJvcic7dGhpcy5jb2RlPWVycm9yRGVmaW5pdGlvbi5jb2RlO3RoaXMuZnJpZW5kbHlNZXNzYWdlPWVycm9yRGVmaW5pdGlvbi5tZXNzYWdlO2lmKHByb3BlcnRpZXMpT2JqZWN0LmFzc2lnbih0aGlzLHByb3BlcnRpZXMpO0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsTGlnaHRob3VzZUVycm9yKTt9CnN0YXRpYyBpc1BhZ2VMb2FkRXJyb3IoZXJyKXtyZXR1cm4gZXJyLmNvZGU9PT1FUlJPUlMuTk9fRE9DVU1FTlRfUkVRVUVTVC5jb2RlfHxlcnIuY29kZT09PUVSUk9SUy5GQUlMRURfRE9DVU1FTlRfUkVRVUVTVC5jb2RlO30Kc3RhdGljIGZyb21Qcm90b2NvbE1lc3NhZ2UobWV0aG9kLHByb3RvY29sRXJyb3Ipe2NvbnN0IHByb3RvY29sRXJyb3JzPU9iamVjdC5rZXlzKEVSUk9SUykuZmlsdGVyKGs9PkVSUk9SU1trXS5wYXR0ZXJuKS5tYXAoaz0+RVJST1JTW2tdKTtjb25zdCBtYXRjaGVkRXJyb3JEZWZpbml0aW9uPXByb3RvY29sRXJyb3JzLmZpbmQoZT0+ZS5wYXR0ZXJuLnRlc3QocHJvdG9jb2xFcnJvci5tZXNzYWdlKSk7aWYobWF0Y2hlZEVycm9yRGVmaW5pdGlvbil7cmV0dXJuIG5ldyBMaWdodGhvdXNlRXJyb3IobWF0Y2hlZEVycm9yRGVmaW5pdGlvbix7cHJvdG9jb2xNZXRob2Q6bWV0aG9kLHByb3RvY29sRXJyb3I6cHJvdG9jb2xFcnJvci5tZXNzYWdlfSk7fQpsZXQgZXJyTXNnPWAoJHttZXRob2R9KTogJHtwcm90b2NvbEVycm9yLm1lc3NhZ2V9YDtpZihwcm90b2NvbEVycm9yLmRhdGEpZXJyTXNnKz1gICgke3Byb3RvY29sRXJyb3IuZGF0YX0pYDtjb25zdCBlcnJvcj1uZXcgRXJyb3IoYFByb3RvY29sIGVycm9yICR7ZXJyTXNnfWApO3JldHVybiBPYmplY3QuYXNzaWduKGVycm9yLHtwcm90b2NvbE1ldGhvZDptZXRob2QscHJvdG9jb2xFcnJvcjpwcm90b2NvbEVycm9yLm1lc3NhZ2V9KTt9fQpjb25zdCBFUlJPUlM9e05PX1NQRUVETElORV9GUkFNRVM6e21lc3NhZ2U6c3RyaW5ncy5kaWRudENvbGxlY3RTY3JlZW5zaG90c30sU1BFRURJTkRFWF9PRl9aRVJPOnttZXNzYWdlOnN0cmluZ3MuZGlkbnRDb2xsZWN0U2NyZWVuc2hvdHN9LE5PX1NDUkVFTlNIT1RTOnttZXNzYWdlOnN0cmluZ3MuZGlkbnRDb2xsZWN0U2NyZWVuc2hvdHN9LElOVkFMSURfU1BFRURMSU5FOnttZXNzYWdlOnN0cmluZ3MuZGlkbnRDb2xsZWN0U2NyZWVuc2hvdHN9LE5PX1RSQUNJTkdfU1RBUlRFRDp7bWVzc2FnZTpzdHJpbmdzLmJhZFRyYWNlUmVjb3JkaW5nfSxOT19OQVZTVEFSVDp7bWVzc2FnZTpzdHJpbmdzLmJhZFRyYWNlUmVjb3JkaW5nfSxOT19GQ1A6e21lc3NhZ2U6c3RyaW5ncy5iYWRUcmFjZVJlY29yZGluZ30sTk9fRk1QOnttZXNzYWdlOnN0cmluZ3MuYmFkVHJhY2VSZWNvcmRpbmd9LE5PX0RDTDp7bWVzc2FnZTpzdHJpbmdzLmJhZFRyYWNlUmVjb3JkaW5nfSxGTVBfVE9PX0xBVEVfRk9SX0ZDUFVJOnttZXNzYWdlOnN0cmluZ3MucGFnZUxvYWRUb29rVG9vTG9uZ30sTk9fRkNQVUlfSURMRV9QRVJJT0Q6e21lc3NhZ2U6c3RyaW5ncy5wYWdlTG9hZFRvb2tUb29Mb25nfSxOT19UVElfQ1BVX0lETEVfUEVSSU9EOnttZXNzYWdlOnN0cmluZ3MucGFnZUxvYWRUb29rVG9vTG9uZ30sTk9fVFRJX05FVFdPUktfSURMRV9QRVJJT0Q6e21lc3NhZ2U6c3RyaW5ncy5wYWdlTG9hZFRvb2tUb29Mb25nfSxOT19ET0NVTUVOVF9SRVFVRVNUOnttZXNzYWdlOnN0cmluZ3MucGFnZUxvYWRGYWlsZWR9LEZBSUxFRF9ET0NVTUVOVF9SRVFVRVNUOnttZXNzYWdlOnN0cmluZ3MucGFnZUxvYWRGYWlsZWR9LFRSQUNJTkdfQUxSRUFEWV9TVEFSVEVEOnttZXNzYWdlOnN0cmluZ3MuaW50ZXJuYWxDaHJvbWVFcnJvcixwYXR0ZXJuOi9UcmFjaW5nLipzdGFydGVkL30sUEFSU0lOR19QUk9CTEVNOnttZXNzYWdlOnN0cmluZ3MuaW50ZXJuYWxDaHJvbWVFcnJvcixwYXR0ZXJuOi9QYXJzaW5nIHByb2JsZW0vfSxSRUFEX0ZBSUxFRDp7bWVzc2FnZTpzdHJpbmdzLmludGVybmFsQ2hyb21lRXJyb3IscGF0dGVybjovUmVhZCBmYWlsZWQvfSxSRVFVRVNUX0NPTlRFTlRfVElNRU9VVDp7bWVzc2FnZTpzdHJpbmdzLnJlcXVlc3RDb250ZW50VGltZW91dH19O09iamVjdC5rZXlzKEVSUk9SUykuZm9yRWFjaChjb2RlPT5FUlJPUlNbY29kZV0uY29kZT1jb2RlKTtMaWdodGhvdXNlRXJyb3IuZXJyb3JzPUVSUk9SUzttb2R1bGUuZXhwb3J0cz1MaWdodGhvdXNlRXJyb3I7fSx7Ii4vc3RyaW5ncyI6NDJ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIGRvRXhpc3QobWFuaWZlc3Qpe2lmKCFtYW5pZmVzdHx8IW1hbmlmZXN0Lmljb25zKXtyZXR1cm4gZmFsc2U7fQppZihtYW5pZmVzdC5pY29ucy52YWx1ZS5sZW5ndGg9PT0wKXtyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9CmZ1bmN0aW9uIHNpemVBdExlYXN0KHNpemVSZXF1aXJlbWVudCxtYW5pZmVzdCl7Y29uc3QgaWNvblZhbHVlcz1tYW5pZmVzdC5pY29ucy52YWx1ZTtjb25zdCBmbGF0dGVuZWRTaXplcz1bXTtpY29uVmFsdWVzLmZvckVhY2goaWNvbj0+e2lmKGljb24udmFsdWUuc2l6ZXMudmFsdWUpe2ZsYXR0ZW5lZFNpemVzLnB1c2goLi4uaWNvbi52YWx1ZS5zaXplcy52YWx1ZSk7fX0pO3JldHVybiBmbGF0dGVuZWRTaXplcy5maWx0ZXIoc2l6ZT0+L1xkK3hcZCsvLnRlc3Qoc2l6ZSkpLmZpbHRlcihzaXplPT57Y29uc3Qgc2l6ZVN0cnM9c2l6ZS5zcGxpdCgveC9pKTtjb25zdCBzaXplTnVtcz1bcGFyc2VGbG9hdChzaXplU3Ryc1swXSkscGFyc2VGbG9hdChzaXplU3Ryc1sxXSldO2NvbnN0IGFyZUljb25zQmlnRW5vdWdoPXNpemVOdW1zWzBdPj1zaXplUmVxdWlyZW1lbnQmJnNpemVOdW1zWzFdPj1zaXplUmVxdWlyZW1lbnQ7Y29uc3QgYXJlSWNvbnNTcXVhcmU9c2l6ZU51bXNbMF09PT1zaXplTnVtc1sxXTtyZXR1cm4gYXJlSWNvbnNCaWdFbm91Z2gmJmFyZUljb25zU3F1YXJlO30pO30KbW9kdWxlLmV4cG9ydHM9e2RvRXhpc3Qsc2l6ZUF0TGVhc3R9O30se31dLDM1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gY29udmVydE5vZGVUaW1pbmdzVG9UcmFjZShub2RlVGltaW5ncyl7Y29uc3QgdHJhY2VFdmVudHM9W107Y29uc3QgYmFzZVRzPTFlOTtjb25zdCBiYXNlRXZlbnQ9e3BpZDoxLHRpZDoxLGNhdDonZGV2dG9vbHMudGltZWxpbmUnfTtjb25zdCBmcmFtZT0nQTAwMDAxJztjb25zdCB0b01pY3Jvc2Vjb25kcz1tcz0+YmFzZVRzK21zKjEwMDA7dHJhY2VFdmVudHMucHVzaChjcmVhdGVGYWtlVHJhY2luZ1N0YXJ0ZWRFdmVudCgpKTt0cmFjZUV2ZW50cy5wdXNoKHsuLi5jcmVhdGVGYWtlVHJhY2luZ1N0YXJ0ZWRFdmVudCgpLG5hbWU6J1RyYWNpbmdTdGFydGVkSW5Ccm93c2VyJ30pO2xldCByZXF1ZXN0SWQ9MTtsZXQgbGFzdEV2ZW50RW5kVGltZT0wO2Zvcihjb25zdFtub2RlLHRpbWluZ11vZiBub2RlVGltaW5ncy5lbnRyaWVzKCkpe2xhc3RFdmVudEVuZFRpbWU9TWF0aC5tYXgobGFzdEV2ZW50RW5kVGltZSx0aW1pbmcuZW5kVGltZSk7aWYobm9kZS50eXBlPT09J2NwdScpe2NvbnN0IGNwdU5vZGU9bm9kZTt0cmFjZUV2ZW50cy5wdXNoKC4uLmNyZWF0ZUZha2VUYXNrRXZlbnRzKGNwdU5vZGUsdGltaW5nKSk7fWVsc2V7Y29uc3QgbmV0d29ya05vZGU9bm9kZTtpZigvXmRhdGEvLnRlc3QobmV0d29ya05vZGUucmVjb3JkLnVybCkpY29udGludWU7dHJhY2VFdmVudHMucHVzaCguLi5jcmVhdGVGYWtlTmV0d29ya0V2ZW50cyhuZXR3b3JrTm9kZS5yZWNvcmQsdGltaW5nKSk7fX0KdHJhY2VFdmVudHMucHVzaCguLi5jcmVhdGVGYWtlVGFza0V2ZW50cyh7Y2hpbGRFdmVudHM6W10sZXZlbnQ6e319LHtzdGFydFRpbWU6bGFzdEV2ZW50RW5kVGltZSsxMDAwLGVuZFRpbWU6bGFzdEV2ZW50RW5kVGltZSsxMDAxfSkpO3JldHVybnt0cmFjZUV2ZW50c307ZnVuY3Rpb24gY3JlYXRlRmFrZVRyYWNpbmdTdGFydGVkRXZlbnQoKXtjb25zdCBhcmdzRGF0YT17ZnJhbWVUcmVlTm9kZUlkOjEsc2Vzc2lvbklkOicxLjEnLHBhZ2U6ZnJhbWUscGVyc2lzdGVudElkczp0cnVlLGZyYW1lczpbe2ZyYW1lLHVybDonYWJvdXQ6YmxhbmsnLG5hbWU6JycscHJvY2Vzc0lkOjF9XX07cmV0dXJuey4uLmJhc2VFdmVudCx0czpiYXNlVHMtMWU1LHBoOidJJyxzOid0JyxjYXQ6J2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLG5hbWU6J1RyYWNpbmdTdGFydGVkSW5QYWdlJyxhcmdzOntkYXRhOmFyZ3NEYXRhfSxkdXI6MH07fQpmdW5jdGlvbiBjcmVhdGVGYWtlVGFza0V2ZW50cyhjcHVOb2RlLHRpbWluZyl7Y29uc3QgYXJnc0RhdGE9e3VybDonJyxmcmFtZSxsaW5lTnVtYmVyOjAsY29sdW1uTnVtYmVyOjB9O2NvbnN0IGV2ZW50VHM9dG9NaWNyb3NlY29uZHModGltaW5nLnN0YXJ0VGltZSk7Y29uc3QgZXZlbnRzPVt7Li4uYmFzZUV2ZW50LHBoOidYJyxuYW1lOidUYXNrJyx0czpldmVudFRzLGR1cjoodGltaW5nLmVuZFRpbWUtdGltaW5nLnN0YXJ0VGltZSkqMTAwMCxhcmdzOntkYXRhOmFyZ3NEYXRhfX1dO2NvbnN0IG5lc3RlZEJhc2VUcz1jcHVOb2RlLmV2ZW50LnRzfHwwO2NvbnN0IG11bHRpcGxpZXI9KHRpbWluZy5lbmRUaW1lLXRpbWluZy5zdGFydFRpbWUpKjEwMDAvY3B1Tm9kZS5ldmVudC5kdXI7Y29uc3QgbmV0UmVxRXZlbnRzPW5ldyBTZXQoWydSZXNvdXJjZVNlbmRSZXF1ZXN0JywnUmVzb3VyY2VGaW5pc2gnLCdSZXNvdXJjZVJlY2VpdmVSZXNwb25zZScsJ1Jlc291cmNlUmVjZWl2ZWREYXRhJ10pO2Zvcihjb25zdCBldmVudCBvZiBjcHVOb2RlLmNoaWxkRXZlbnRzKXtpZihuZXRSZXFFdmVudHMuaGFzKGV2ZW50Lm5hbWUpKWNvbnRpbnVlO2NvbnN0IHRzPWV2ZW50VHMrKGV2ZW50LnRzLW5lc3RlZEJhc2VUcykqbXVsdGlwbGllcjtjb25zdCBuZXdFdmVudD17Li4uZXZlbnQsLi4ue3BpZDpiYXNlRXZlbnQucGlkLHRpZDpiYXNlRXZlbnQudGlkfSx0c307aWYoZXZlbnQuZHVyKW5ld0V2ZW50LmR1cj1ldmVudC5kdXIqbXVsdGlwbGllcjtldmVudHMucHVzaChuZXdFdmVudCk7fQpyZXR1cm4gZXZlbnRzO30KZnVuY3Rpb24gY3JlYXRlRmFrZU5ldHdvcmtFdmVudHMocmVjb3JkLHRpbWluZyl7cmVxdWVzdElkKys7bGV0e3N0YXJ0VGltZSxlbmRUaW1lfT10aW1pbmc7aWYoc3RhcnRUaW1lPT09ZW5kVGltZSllbmRUaW1lKz0wLjM7Y29uc3QgcmVxdWVzdERhdGE9e3JlcXVlc3RJZDpyZXF1ZXN0SWQudG9TdHJpbmcoKSxmcmFtZX07Y29uc3QgYmFzZVJlcXVlc3RFdmVudD17Li4uYmFzZUV2ZW50LHBoOidJJyxzOid0JyxkdXI6MH07Y29uc3Qgc2VuZFJlcXVlc3REYXRhPXsuLi5yZXF1ZXN0RGF0YSxyZXF1ZXN0TWV0aG9kOnJlY29yZC5yZXF1ZXN0TWV0aG9kLHVybDpyZWNvcmQudXJsLHByaW9yaXR5OnJlY29yZC5wcmlvcml0eX07Y29uc3QgcmVjZWl2ZVJlc3BvbnNlRGF0YT17Li4ucmVxdWVzdERhdGEsc3RhdHVzQ29kZTpyZWNvcmQuc3RhdHVzQ29kZSxtaW1lVHlwZTpyZWNvcmQubWltZVR5cGUsZW5jb2RlZERhdGFMZW5ndGg6cmVjb3JkLnRyYW5zZmVyU2l6ZSxmcm9tQ2FjaGU6cmVjb3JkLmZyb21EaXNrQ2FjaGUsZnJvbVNlcnZpY2VXb3JrZXI6cmVjb3JkLmZldGNoZWRWaWFTZXJ2aWNlV29ya2VyfTtjb25zdCByZXNvdXJjZUZpbmlzaERhdGE9ey4uLnJlcXVlc3REYXRhLGRlY29kZWRCb2R5TGVuZ3RoOnJlY29yZC5yZXNvdXJjZVNpemUsZGlkRmFpbDohIXJlY29yZC5mYWlsZWQsZmluaXNoVGltZTplbmRUaW1lfTtjb25zdCBldmVudHM9W3suLi5iYXNlUmVxdWVzdEV2ZW50LG5hbWU6J1Jlc291cmNlU2VuZFJlcXVlc3QnLHRzOnRvTWljcm9zZWNvbmRzKHN0YXJ0VGltZSksYXJnczp7ZGF0YTpzZW5kUmVxdWVzdERhdGF9fSx7Li4uYmFzZVJlcXVlc3RFdmVudCxuYW1lOidSZXNvdXJjZUZpbmlzaCcsdHM6dG9NaWNyb3NlY29uZHMoZW5kVGltZSksYXJnczp7ZGF0YTpyZXNvdXJjZUZpbmlzaERhdGF9fV07aWYoIXJlY29yZC5mYWlsZWQpe2V2ZW50cy5wdXNoKHsuLi5iYXNlUmVxdWVzdEV2ZW50LG5hbWU6J1Jlc291cmNlUmVjZWl2ZVJlc3BvbnNlJyx0czp0b01pY3Jvc2Vjb25kcygoc3RhcnRUaW1lK2VuZFRpbWUpLzIpLGFyZ3M6e2RhdGE6cmVjZWl2ZVJlc3BvbnNlRGF0YX19KTt9CnJldHVybiBldmVudHM7fX0KbW9kdWxlLmV4cG9ydHM9e3NpbXVsYXRpb25OYW1lc1RvSWdub3JlOlsndW5sYWJlbGVkJywnb3B0aW1pc3RpY0ZpcnN0Q1BVSWRsZScsJ29wdGltaXN0aWNGbGV4Rmlyc3RDUFVJZGxlJywncGVzc2ltaXN0aWNGaXJzdENQVUlkbGUnLCdvcHRpbWlzdGljU3BlZWRJbmRleCcsJ29wdGltaXN0aWNGbGV4U3BlZWRJbmRleCcsJ3Blc3NpbWlzdGljU3BlZWRJbmRleCcsJ29wdGltaXN0aWNFc3RpbWF0ZWRJbnB1dExhdGVuY3knLCdvcHRpbWlzdGljRmxleEVzdGltYXRlZElucHV0TGF0ZW5jeScsJ3Blc3NpbWlzdGljRXN0aW1hdGVkSW5wdXRMYXRlbmN5J10sY29udmVydE5vZGVUaW1pbmdzVG9UcmFjZX07fSx7fV0sMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBVUkw9cmVxdWlyZSgnLi91cmwtc2hpbScpO2NvbnN0IHZhbGlkYXRlQ29sb3I9cmVxdWlyZSgnLi93ZWItaW5zcGVjdG9yJykuQ29sb3IucGFyc2U7Y29uc3QgQUxMT1dFRF9ESVNQTEFZX1ZBTFVFUz1bJ2Z1bGxzY3JlZW4nLCdzdGFuZGFsb25lJywnbWluaW1hbC11aScsJ2Jyb3dzZXInXTtjb25zdCBERUZBVUxUX0RJU1BMQVlfTU9ERT0nYnJvd3Nlcic7Y29uc3QgQUxMT1dFRF9PUklFTlRBVElPTl9WQUxVRVM9WydhbnknLCduYXR1cmFsJywnbGFuZHNjYXBlJywncG9ydHJhaXQnLCdwb3J0cmFpdC1wcmltYXJ5JywncG9ydHJhaXQtc2Vjb25kYXJ5JywnbGFuZHNjYXBlLXByaW1hcnknLCdsYW5kc2NhcGUtc2Vjb25kYXJ5J107ZnVuY3Rpb24gcGFyc2VTdHJpbmcocmF3LHRyaW0pe2xldCB2YWx1ZTtsZXQgZGVidWdTdHJpbmc7aWYodHlwZW9mIHJhdz09PSdzdHJpbmcnKXt2YWx1ZT10cmltP3Jhdy50cmltKCk6cmF3O31lbHNle2lmKHJhdyE9PXVuZGVmaW5lZCl7ZGVidWdTdHJpbmc9J0VSUk9SOiBleHBlY3RlZCBhIHN0cmluZy4nO30KdmFsdWU9dW5kZWZpbmVkO30KcmV0dXJue3Jhdyx2YWx1ZSxkZWJ1Z1N0cmluZ307fQpmdW5jdGlvbiBwYXJzZUNvbG9yKHJhdyl7Y29uc3QgY29sb3I9cGFyc2VTdHJpbmcocmF3KTtpZihjb2xvci52YWx1ZT09PXVuZGVmaW5lZCl7cmV0dXJuIGNvbG9yO30KY29uc3QgdmFsaWRhdGVkQ29sb3I9dmFsaWRhdGVDb2xvcihjb2xvci5yYXcpO2lmKCF2YWxpZGF0ZWRDb2xvcil7Y29sb3IudmFsdWU9dW5kZWZpbmVkO2NvbG9yLmRlYnVnU3RyaW5nPSdFUlJPUjogY29sb3IgcGFyc2luZyBmYWlsZWQuJzt9CnJldHVybiBjb2xvcjt9CmZ1bmN0aW9uIHBhcnNlTmFtZShqc29uSW5wdXQpe3JldHVybiBwYXJzZVN0cmluZyhqc29uSW5wdXQubmFtZSx0cnVlKTt9CmZ1bmN0aW9uIHBhcnNlU2hvcnROYW1lKGpzb25JbnB1dCl7cmV0dXJuIHBhcnNlU3RyaW5nKGpzb25JbnB1dC5zaG9ydF9uYW1lLHRydWUpO30KZnVuY3Rpb24gY2hlY2tTYW1lT3JpZ2luKHVybDEsdXJsMil7Y29uc3QgcGFyc2VkMT1uZXcgVVJMKHVybDEpO2NvbnN0IHBhcnNlZDI9bmV3IFVSTCh1cmwyKTtyZXR1cm4gcGFyc2VkMS5vcmlnaW49PT1wYXJzZWQyLm9yaWdpbjt9CmZ1bmN0aW9uIHBhcnNlU3RhcnRVcmwoanNvbklucHV0LG1hbmlmZXN0VXJsLGRvY3VtZW50VXJsKXtjb25zdCByYXc9anNvbklucHV0LnN0YXJ0X3VybDtpZihyYXc9PT0nJyl7cmV0dXJue3Jhdyx2YWx1ZTpkb2N1bWVudFVybCxkZWJ1Z1N0cmluZzonRVJST1I6IHN0YXJ0X3VybCBzdHJpbmcgZW1wdHknfTt9CmNvbnN0IHBhcnNlZEFzU3RyaW5nPXBhcnNlU3RyaW5nKHJhdyk7aWYoIXBhcnNlZEFzU3RyaW5nLnZhbHVlKXtwYXJzZWRBc1N0cmluZy52YWx1ZT1kb2N1bWVudFVybDtyZXR1cm4gcGFyc2VkQXNTdHJpbmc7fQpsZXQgc3RhcnRVcmw7dHJ5e3N0YXJ0VXJsPW5ldyBVUkwocmF3LG1hbmlmZXN0VXJsKS5ocmVmO31jYXRjaChlKXtyZXR1cm57cmF3LHZhbHVlOmRvY3VtZW50VXJsLGRlYnVnU3RyaW5nOidFUlJPUjogaW52YWxpZCBzdGFydF91cmwgcmVsYXRpdmUgdG8gJHttYW5pZmVzdFVybH0nfTt9CmlmKCFjaGVja1NhbWVPcmlnaW4oc3RhcnRVcmwsZG9jdW1lbnRVcmwpKXtyZXR1cm57cmF3LHZhbHVlOmRvY3VtZW50VXJsLGRlYnVnU3RyaW5nOidFUlJPUjogc3RhcnRfdXJsIG11c3QgYmUgc2FtZS1vcmlnaW4gYXMgZG9jdW1lbnQnfTt9CnJldHVybntyYXcsdmFsdWU6c3RhcnRVcmx9O30KZnVuY3Rpb24gcGFyc2VEaXNwbGF5KGpzb25JbnB1dCl7Y29uc3QgcGFyc2VkU3RyaW5nPXBhcnNlU3RyaW5nKGpzb25JbnB1dC5kaXNwbGF5LHRydWUpO2NvbnN0IHN0cmluZ1ZhbHVlPXBhcnNlZFN0cmluZy52YWx1ZTtpZighc3RyaW5nVmFsdWUpe3JldHVybntyYXc6anNvbklucHV0LHZhbHVlOkRFRkFVTFRfRElTUExBWV9NT0RFLGRlYnVnU3RyaW5nOnBhcnNlZFN0cmluZy5kZWJ1Z1N0cmluZ307fQpjb25zdCBkaXNwbGF5VmFsdWU9c3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKTtpZighQUxMT1dFRF9ESVNQTEFZX1ZBTFVFUy5pbmNsdWRlcyhkaXNwbGF5VmFsdWUpKXtyZXR1cm57cmF3Ompzb25JbnB1dCx2YWx1ZTpERUZBVUxUX0RJU1BMQVlfTU9ERSxkZWJ1Z1N0cmluZzonRVJST1I6IFwnZGlzcGxheVwnIGhhcyBpbnZhbGlkIHZhbHVlICcrZGlzcGxheVZhbHVlK2AuIHdpbGwgZmFsbCBiYWNrIHRvICR7REVGQVVMVF9ESVNQTEFZX01PREV9LmB9O30KcmV0dXJue3Jhdzpqc29uSW5wdXQsdmFsdWU6ZGlzcGxheVZhbHVlLGRlYnVnU3RyaW5nOnVuZGVmaW5lZH07fQpmdW5jdGlvbiBwYXJzZU9yaWVudGF0aW9uKGpzb25JbnB1dCl7Y29uc3Qgb3JpZW50YXRpb249cGFyc2VTdHJpbmcoanNvbklucHV0Lm9yaWVudGF0aW9uLHRydWUpO2lmKG9yaWVudGF0aW9uLnZhbHVlJiYhQUxMT1dFRF9PUklFTlRBVElPTl9WQUxVRVMuaW5jbHVkZXMob3JpZW50YXRpb24udmFsdWUudG9Mb3dlckNhc2UoKSkpe29yaWVudGF0aW9uLnZhbHVlPXVuZGVmaW5lZDtvcmllbnRhdGlvbi5kZWJ1Z1N0cmluZz0nRVJST1I6IFwnb3JpZW50YXRpb25cJyBoYXMgYW4gaW52YWxpZCB2YWx1ZSwgd2lsbCBiZSBpZ25vcmVkLic7fQpyZXR1cm4gb3JpZW50YXRpb247fQpmdW5jdGlvbiBwYXJzZUljb24ocmF3LG1hbmlmZXN0VXJsKXtjb25zdCBzcmM9cGFyc2VTdHJpbmcocmF3LnNyYyx0cnVlKTtpZihzcmMudmFsdWU9PT0nJyl7c3JjLnZhbHVlPXVuZGVmaW5lZDt9CmlmKHNyYy52YWx1ZSl7c3JjLnZhbHVlPW5ldyBVUkwoc3JjLnZhbHVlLG1hbmlmZXN0VXJsKS5ocmVmO30KY29uc3QgdHlwZT1wYXJzZVN0cmluZyhyYXcudHlwZSx0cnVlKTtjb25zdCBkZW5zaXR5PXtyYXc6cmF3LmRlbnNpdHksdmFsdWU6MSxkZWJ1Z1N0cmluZzp1bmRlZmluZWR9O2lmKGRlbnNpdHkucmF3IT09dW5kZWZpbmVkKXtkZW5zaXR5LnZhbHVlPXBhcnNlRmxvYXQoZGVuc2l0eS5yYXcpO2lmKGlzTmFOKGRlbnNpdHkudmFsdWUpfHwhaXNGaW5pdGUoZGVuc2l0eS52YWx1ZSl8fGRlbnNpdHkudmFsdWU8PTApe2RlbnNpdHkudmFsdWU9MTtkZW5zaXR5LmRlYnVnU3RyaW5nPSdFUlJPUjogaWNvbiBkZW5zaXR5IGNhbm5vdCBiZSBOYU4sICviiJ4sIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byArMC4nO319CmxldCBzaXplcztjb25zdCBwYXJzZWRTaXplcz1wYXJzZVN0cmluZyhyYXcuc2l6ZXMpO2lmKHBhcnNlZFNpemVzLnZhbHVlIT09dW5kZWZpbmVkKXtjb25zdCBzZXQ9bmV3IFNldCgpO3BhcnNlZFNpemVzLnZhbHVlLnRyaW0oKS5zcGxpdCgvXHMrLykuZm9yRWFjaChzaXplPT5zZXQuYWRkKHNpemUudG9Mb3dlckNhc2UoKSkpO3NpemVzPXtyYXc6cmF3LnNpemVzLHZhbHVlOnNldC5zaXplPjA/QXJyYXkuZnJvbShzZXQpOnVuZGVmaW5lZCxkZWJ1Z1N0cmluZzp1bmRlZmluZWR9O31lbHNle3NpemVzPXsuLi5wYXJzZWRTaXplcyx2YWx1ZTp1bmRlZmluZWR9O30KcmV0dXJue3Jhdyx2YWx1ZTp7c3JjLHR5cGUsZGVuc2l0eSxzaXplc30sZGVidWdTdHJpbmc6dW5kZWZpbmVkfTt9CmZ1bmN0aW9uIHBhcnNlSWNvbnMoanNvbklucHV0LG1hbmlmZXN0VXJsKXtjb25zdCByYXc9anNvbklucHV0Lmljb25zO2lmKHJhdz09PXVuZGVmaW5lZCl7cmV0dXJue3Jhdyx2YWx1ZTpbXSxkZWJ1Z1N0cmluZzp1bmRlZmluZWR9O30KaWYoIUFycmF5LmlzQXJyYXkocmF3KSl7cmV0dXJue3Jhdyx2YWx1ZTpbXSxkZWJ1Z1N0cmluZzonRVJST1I6IFwnaWNvbnNcJyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSBidXQgaXMgbm90Lid9O30KY29uc3QgdmFsdWU9cmF3LmZpbHRlcihpY29uPT5pY29uLnNyYyE9PXVuZGVmaW5lZCkubWFwKGljb249PnBhcnNlSWNvbihpY29uLG1hbmlmZXN0VXJsKSkuZmlsdGVyKHBhcnNlZEljb249PnBhcnNlZEljb24udmFsdWUuc3JjLnZhbHVlIT09dW5kZWZpbmVkKTtyZXR1cm57cmF3LHZhbHVlLGRlYnVnU3RyaW5nOnVuZGVmaW5lZH07fQpmdW5jdGlvbiBwYXJzZUFwcGxpY2F0aW9uKHJhdyl7Y29uc3QgcGxhdGZvcm09cGFyc2VTdHJpbmcocmF3LnBsYXRmb3JtLHRydWUpO2NvbnN0IGlkPXBhcnNlU3RyaW5nKHJhdy5pZCx0cnVlKTtjb25zdCBhcHBVcmw9cGFyc2VTdHJpbmcocmF3LnVybCx0cnVlKTtpZihhcHBVcmwudmFsdWUpe3RyeXthcHBVcmwudmFsdWU9bmV3IFVSTChhcHBVcmwudmFsdWUpLmhyZWY7fWNhdGNoKGUpe2FwcFVybC52YWx1ZT11bmRlZmluZWQ7YXBwVXJsLmRlYnVnU3RyaW5nPSdFUlJPUjogaW52YWxpZCBhcHBsaWNhdGlvbiBVUkwgJHtyYXcudXJsfSc7fX0KcmV0dXJue3Jhdyx2YWx1ZTp7cGxhdGZvcm0saWQsdXJsOmFwcFVybH0sZGVidWdTdHJpbmc6dW5kZWZpbmVkfTt9CmZ1bmN0aW9uIHBhcnNlUmVsYXRlZEFwcGxpY2F0aW9ucyhqc29uSW5wdXQpe2NvbnN0IHJhdz1qc29uSW5wdXQucmVsYXRlZF9hcHBsaWNhdGlvbnM7aWYocmF3PT09dW5kZWZpbmVkKXtyZXR1cm57cmF3LHZhbHVlOnVuZGVmaW5lZCxkZWJ1Z1N0cmluZzp1bmRlZmluZWR9O30KaWYoIUFycmF5LmlzQXJyYXkocmF3KSl7cmV0dXJue3Jhdyx2YWx1ZTp1bmRlZmluZWQsZGVidWdTdHJpbmc6J0VSUk9SOiBcJ3JlbGF0ZWRfYXBwbGljYXRpb25zXCcgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgYnV0IGlzIG5vdC4nfTt9CmNvbnN0IHZhbHVlPXJhdy5maWx0ZXIoYXBwbGljYXRpb249PiEhYXBwbGljYXRpb24ucGxhdGZvcm0pLm1hcChwYXJzZUFwcGxpY2F0aW9uKS5maWx0ZXIocGFyc2VkQXBwPT4hIXBhcnNlZEFwcC52YWx1ZS5pZC52YWx1ZXx8ISFwYXJzZWRBcHAudmFsdWUudXJsLnZhbHVlKTtyZXR1cm57cmF3LHZhbHVlLGRlYnVnU3RyaW5nOnVuZGVmaW5lZH07fQpmdW5jdGlvbiBwYXJzZVByZWZlclJlbGF0ZWRBcHBsaWNhdGlvbnMoanNvbklucHV0KXtjb25zdCByYXc9anNvbklucHV0LnByZWZlcl9yZWxhdGVkX2FwcGxpY2F0aW9ucztsZXQgdmFsdWU7bGV0IGRlYnVnU3RyaW5nO2lmKHR5cGVvZiByYXc9PT0nYm9vbGVhbicpe3ZhbHVlPXJhdzt9ZWxzZXtpZihyYXchPT11bmRlZmluZWQpe2RlYnVnU3RyaW5nPSdFUlJPUjogXCdwcmVmZXJfcmVsYXRlZF9hcHBsaWNhdGlvbnNcJyBleHBlY3RlZCB0byBiZSBhIGJvb2xlYW4uJzt9CnZhbHVlPXVuZGVmaW5lZDt9CnJldHVybntyYXcsdmFsdWUsZGVidWdTdHJpbmd9O30KZnVuY3Rpb24gcGFyc2VUaGVtZUNvbG9yKGpzb25JbnB1dCl7cmV0dXJuIHBhcnNlQ29sb3IoanNvbklucHV0LnRoZW1lX2NvbG9yKTt9CmZ1bmN0aW9uIHBhcnNlQmFja2dyb3VuZENvbG9yKGpzb25JbnB1dCl7cmV0dXJuIHBhcnNlQ29sb3IoanNvbklucHV0LmJhY2tncm91bmRfY29sb3IpO30KZnVuY3Rpb24gcGFyc2Uoc3RyaW5nLG1hbmlmZXN0VXJsLGRvY3VtZW50VXJsKXtpZihtYW5pZmVzdFVybD09PXVuZGVmaW5lZHx8ZG9jdW1lbnRVcmw9PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcignTWFuaWZlc3QgYW5kIGRvY3VtZW50IFVSTHMgcmVxdWlyZWQgZm9yIG1hbmlmZXN0IHBhcnNpbmcuJyk7fQpsZXQganNvbklucHV0O3RyeXtqc29uSW5wdXQ9SlNPTi5wYXJzZShzdHJpbmcpO31jYXRjaChlKXtyZXR1cm57cmF3OnN0cmluZyx2YWx1ZTp1bmRlZmluZWQsZGVidWdTdHJpbmc6J0VSUk9SOiBmaWxlIGlzblwndCB2YWxpZCBKU09OOiAnK2V9O30KY29uc3QgbWFuaWZlc3Q9e25hbWU6cGFyc2VOYW1lKGpzb25JbnB1dCksc2hvcnRfbmFtZTpwYXJzZVNob3J0TmFtZShqc29uSW5wdXQpLHN0YXJ0X3VybDpwYXJzZVN0YXJ0VXJsKGpzb25JbnB1dCxtYW5pZmVzdFVybCxkb2N1bWVudFVybCksZGlzcGxheTpwYXJzZURpc3BsYXkoanNvbklucHV0KSxvcmllbnRhdGlvbjpwYXJzZU9yaWVudGF0aW9uKGpzb25JbnB1dCksaWNvbnM6cGFyc2VJY29ucyhqc29uSW5wdXQsbWFuaWZlc3RVcmwpLHJlbGF0ZWRfYXBwbGljYXRpb25zOnBhcnNlUmVsYXRlZEFwcGxpY2F0aW9ucyhqc29uSW5wdXQpLHByZWZlcl9yZWxhdGVkX2FwcGxpY2F0aW9uczpwYXJzZVByZWZlclJlbGF0ZWRBcHBsaWNhdGlvbnMoanNvbklucHV0KSx0aGVtZV9jb2xvcjpwYXJzZVRoZW1lQ29sb3IoanNvbklucHV0KSxiYWNrZ3JvdW5kX2NvbG9yOnBhcnNlQmFja2dyb3VuZENvbG9yKGpzb25JbnB1dCl9O3JldHVybntyYXc6c3RyaW5nLHZhbHVlOm1hbmlmZXN0LGRlYnVnU3RyaW5nOnVuZGVmaW5lZH07fQptb2R1bGUuZXhwb3J0cz1wYXJzZTt9LHsiLi91cmwtc2hpbSI6InVybCIsIi4vd2ViLWluc3BlY3RvciI6NDd9XSwzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IE5ldHdvcmtNYW5hZ2VyPXJlcXVpcmUoJy4vd2ViLWluc3BlY3RvcicpLk5ldHdvcmtNYW5hZ2VyO2NvbnN0IE5ldHdvcmtSZXF1ZXN0PXJlcXVpcmUoJy4vbmV0d29yay1yZXF1ZXN0Jyk7Y29uc3QgRXZlbnRFbWl0dGVyPXJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtjb25zdCBsb2c9cmVxdWlyZSgnbGlnaHRob3VzZS1sb2dnZXInKTtjb25zdCBJR05PUkVEX05FVFdPUktfU0NIRU1FUz1bJ2RhdGEnLCd3cyddO2NsYXNzIE5ldHdvcmtSZWNvcmRlciBleHRlbmRzIEV2ZW50RW1pdHRlcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fcmVjb3Jkcz1bXTt0aGlzLl9yZWNvcmRzQnlJZD1uZXcgTWFwKCk7fQpnZXRSZWNvcmRzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fcmVjb3Jkcyk7fQpvbihldmVudCxsaXN0ZW5lcil7cmV0dXJuIHN1cGVyLm9uKGV2ZW50LGxpc3RlbmVyKTt9Cm9uY2UoZXZlbnQsbGlzdGVuZXIpe3JldHVybiBzdXBlci5vbmNlKGV2ZW50LGxpc3RlbmVyKTt9CmdldCBFdmVudFR5cGVzKCl7cmV0dXJuIE5ldHdvcmtNYW5hZ2VyLkV2ZW50czt9CmlzSWRsZSgpe3JldHVybiEhdGhpcy5fZ2V0QWN0aXZlSWRsZVBlcmlvZCgwKTt9CmlzMklkbGUoKXtyZXR1cm4hIXRoaXMuX2dldEFjdGl2ZUlkbGVQZXJpb2QoMik7fQpfZ2V0QWN0aXZlSWRsZVBlcmlvZChhbGxvd2VkUmVxdWVzdHMpe2NvbnN0IHF1aWV0UGVyaW9kcz1OZXR3b3JrUmVjb3JkZXIuZmluZE5ldHdvcmtRdWlldFBlcmlvZHModGhpcy5fcmVjb3JkcyxhbGxvd2VkUmVxdWVzdHMpO3JldHVybiBxdWlldFBlcmlvZHMuZmluZChwZXJpb2Q9PiFOdW1iZXIuaXNGaW5pdGUocGVyaW9kLmVuZCkpO30KX2VtaXROZXR3b3JrU3RhdHVzKCl7Y29uc3QgemVyb1F1aWV0PXRoaXMuX2dldEFjdGl2ZUlkbGVQZXJpb2QoMCk7Y29uc3QgdHdvUXVpZXQ9dGhpcy5fZ2V0QWN0aXZlSWRsZVBlcmlvZCgyKTtpZih0d29RdWlldCYmemVyb1F1aWV0KXtsb2cudmVyYm9zZSgnTmV0d29ya1JlY29yZGVyJywnbmV0d29yayBmdWxseS1xdWlldCcpO3RoaXMuZW1pdCgnbmV0d29yay0yLWlkbGUnKTt0aGlzLmVtaXQoJ25ldHdvcmtpZGxlJyk7fWVsc2UgaWYodHdvUXVpZXQmJiF6ZXJvUXVpZXQpe2xvZy52ZXJib3NlKCdOZXR3b3JrUmVjb3JkZXInLCduZXR3b3JrIHNlbWktcXVpZXQnKTt0aGlzLmVtaXQoJ25ldHdvcmstMi1pZGxlJyk7dGhpcy5lbWl0KCduZXR3b3JrYnVzeScpO31lbHNle2xvZy52ZXJib3NlKCdOZXR3b3JrUmVjb3JkZXInLCduZXR3b3JrIGJ1c3knKTt0aGlzLmVtaXQoJ25ldHdvcmstMi1idXN5Jyk7dGhpcy5lbWl0KCduZXR3b3JrYnVzeScpO319CnN0YXRpYyBfaXNRVUlDQW5kRmluaXNoZWQocmVjb3JkKXtjb25zdCBpc1FVSUM9cmVjb3JkLnJlc3BvbnNlSGVhZGVycyYmcmVjb3JkLnJlc3BvbnNlSGVhZGVycy5zb21lKGhlYWRlcj0+aGVhZGVyLm5hbWUudG9Mb3dlckNhc2UoKT09PSdhbHQtc3ZjJyYmL3F1aWMvLnRlc3QoaGVhZGVyLnZhbHVlKSk7Y29uc3QgcmVjZWl2ZWRIZWFkZXJzPXJlY29yZC50aW1pbmcmJnJlY29yZC50aW1pbmcucmVjZWl2ZUhlYWRlcnNFbmQ+MDtyZXR1cm4hIShpc1FVSUMmJnJlY2VpdmVkSGVhZGVycyYmcmVjb3JkLmVuZFRpbWUpO30Kc3RhdGljIGZpbmROZXR3b3JrUXVpZXRQZXJpb2RzKG5ldHdvcmtSZWNvcmRzLGFsbG93ZWRDb25jdXJyZW50UmVxdWVzdHMsZW5kVGltZT1JbmZpbml0eSl7bGV0IHRpbWVCb3VuZGFyaWVzPVtdO25ldHdvcmtSZWNvcmRzLmZvckVhY2gocmVjb3JkPT57Y29uc3Qgc2NoZW1lPXJlY29yZC5wYXJzZWRVUkwmJnJlY29yZC5wYXJzZWRVUkwuc2NoZW1lO2lmKElHTk9SRURfTkVUV09SS19TQ0hFTUVTLmluY2x1ZGVzKHNjaGVtZSkpe3JldHVybjt9CnRpbWVCb3VuZGFyaWVzLnB1c2goe3RpbWU6cmVjb3JkLnN0YXJ0VGltZSoxMDAwLGlzU3RhcnQ6dHJ1ZX0pO2lmKHJlY29yZC5maW5pc2hlZHx8TmV0d29ya1JlY29yZGVyLl9pc1FVSUNBbmRGaW5pc2hlZChyZWNvcmQpKXt0aW1lQm91bmRhcmllcy5wdXNoKHt0aW1lOnJlY29yZC5lbmRUaW1lKjEwMDAsaXNTdGFydDpmYWxzZX0pO319KTt0aW1lQm91bmRhcmllcz10aW1lQm91bmRhcmllcy5maWx0ZXIoYm91bmRhcnk9PmJvdW5kYXJ5LnRpbWU8PWVuZFRpbWUpLnNvcnQoKGEsYik9PmEudGltZS1iLnRpbWUpO2xldCBudW1JbmZsaWdodFJlcXVlc3RzPTA7bGV0IHF1aWV0UGVyaW9kU3RhcnQ9MDtjb25zdCBxdWlldFBlcmlvZHM9W107dGltZUJvdW5kYXJpZXMuZm9yRWFjaChib3VuZGFyeT0+e2lmKGJvdW5kYXJ5LmlzU3RhcnQpe2lmKG51bUluZmxpZ2h0UmVxdWVzdHM9PT1hbGxvd2VkQ29uY3VycmVudFJlcXVlc3RzKXtxdWlldFBlcmlvZHMucHVzaCh7c3RhcnQ6cXVpZXRQZXJpb2RTdGFydCxlbmQ6Ym91bmRhcnkudGltZX0pO30KbnVtSW5mbGlnaHRSZXF1ZXN0cysrO31lbHNle251bUluZmxpZ2h0UmVxdWVzdHMtLTtpZihudW1JbmZsaWdodFJlcXVlc3RzPT09YWxsb3dlZENvbmN1cnJlbnRSZXF1ZXN0cyl7cXVpZXRQZXJpb2RTdGFydD1ib3VuZGFyeS50aW1lO319fSk7aWYobnVtSW5mbGlnaHRSZXF1ZXN0czw9YWxsb3dlZENvbmN1cnJlbnRSZXF1ZXN0cyl7cXVpZXRQZXJpb2RzLnB1c2goe3N0YXJ0OnF1aWV0UGVyaW9kU3RhcnQsZW5kOmVuZFRpbWV9KTt9CnJldHVybiBxdWlldFBlcmlvZHMuZmlsdGVyKHBlcmlvZD0+cGVyaW9kLnN0YXJ0IT09cGVyaW9kLmVuZCk7fQpvblJlcXVlc3RTdGFydGVkKHJlcXVlc3Qpe3RoaXMuX3JlY29yZHMucHVzaChyZXF1ZXN0KTt0aGlzLl9yZWNvcmRzQnlJZC5zZXQocmVxdWVzdC5yZXF1ZXN0SWQscmVxdWVzdCk7dGhpcy5fZW1pdE5ldHdvcmtTdGF0dXMoKTt9Cm9uUmVxdWVzdEZpbmlzaGVkKHJlcXVlc3Qpe3RoaXMuZW1pdCgncmVxdWVzdGxvYWRlZCcscmVxdWVzdCk7dGhpcy5fZW1pdE5ldHdvcmtTdGF0dXMoKTt9Cm9uUmVxdWVzdFdpbGxCZVNlbnQoZGF0YSl7Y29uc3Qgb3JpZ2luYWxSZXF1ZXN0PXRoaXMuX2ZpbmRSZWFsUmVxdWVzdChkYXRhLnJlcXVlc3RJZCk7aWYoIW9yaWdpbmFsUmVxdWVzdCl7Y29uc3QgcmVxdWVzdD1uZXcgTmV0d29ya1JlcXVlc3QoKTtyZXF1ZXN0Lm9uUmVxdWVzdFdpbGxCZVNlbnQoZGF0YSk7dGhpcy5vblJlcXVlc3RTdGFydGVkKHJlcXVlc3QpO3JldHVybjt9CmlmKCFkYXRhLnJlZGlyZWN0UmVzcG9uc2Upe3JldHVybjt9CmNvbnN0IG1vZGlmaWVkRGF0YT17Li4uZGF0YSxpbml0aWF0b3I6b3JpZ2luYWxSZXF1ZXN0LmluaXRpYXRvcixyZXF1ZXN0SWQ6YCR7b3JpZ2luYWxSZXF1ZXN0LnJlcXVlc3RJZH06cmVkaXJlY3RgfTtjb25zdCByZWRpcmVjdGVkUmVxdWVzdD1uZXcgTmV0d29ya1JlcXVlc3QoKTtyZWRpcmVjdGVkUmVxdWVzdC5vblJlcXVlc3RXaWxsQmVTZW50KG1vZGlmaWVkRGF0YSk7b3JpZ2luYWxSZXF1ZXN0Lm9uUmVkaXJlY3RSZXNwb25zZShkYXRhKTtvcmlnaW5hbFJlcXVlc3QucmVkaXJlY3REZXN0aW5hdGlvbj1yZWRpcmVjdGVkUmVxdWVzdDtyZWRpcmVjdGVkUmVxdWVzdC5yZWRpcmVjdFNvdXJjZT1vcmlnaW5hbFJlcXVlc3Q7dGhpcy5vblJlcXVlc3RTdGFydGVkKHJlZGlyZWN0ZWRSZXF1ZXN0KTt0aGlzLm9uUmVxdWVzdEZpbmlzaGVkKG9yaWdpbmFsUmVxdWVzdCk7fQpvblJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoZGF0YSl7Y29uc3QgcmVxdWVzdD10aGlzLl9maW5kUmVhbFJlcXVlc3QoZGF0YS5yZXF1ZXN0SWQpO2lmKCFyZXF1ZXN0KXJldHVybjtyZXF1ZXN0Lm9uUmVxdWVzdFNlcnZlZEZyb21DYWNoZSgpO30Kb25SZXNwb25zZVJlY2VpdmVkKGRhdGEpe2NvbnN0IHJlcXVlc3Q9dGhpcy5fZmluZFJlYWxSZXF1ZXN0KGRhdGEucmVxdWVzdElkKTtpZighcmVxdWVzdClyZXR1cm47cmVxdWVzdC5vblJlc3BvbnNlUmVjZWl2ZWQoZGF0YSk7fQpvbkRhdGFSZWNlaXZlZChkYXRhKXtjb25zdCByZXF1ZXN0PXRoaXMuX2ZpbmRSZWFsUmVxdWVzdChkYXRhLnJlcXVlc3RJZCk7aWYoIXJlcXVlc3QpcmV0dXJuO3JlcXVlc3Qub25EYXRhUmVjZWl2ZWQoZGF0YSk7fQpvbkxvYWRpbmdGaW5pc2hlZChkYXRhKXtjb25zdCByZXF1ZXN0PXRoaXMuX2ZpbmRSZWFsUmVxdWVzdChkYXRhLnJlcXVlc3RJZCk7aWYoIXJlcXVlc3QpcmV0dXJuO3JlcXVlc3Qub25Mb2FkaW5nRmluaXNoZWQoZGF0YSk7dGhpcy5vblJlcXVlc3RGaW5pc2hlZChyZXF1ZXN0KTt9Cm9uTG9hZGluZ0ZhaWxlZChkYXRhKXtjb25zdCByZXF1ZXN0PXRoaXMuX2ZpbmRSZWFsUmVxdWVzdChkYXRhLnJlcXVlc3RJZCk7aWYoIXJlcXVlc3QpcmV0dXJuO3JlcXVlc3Qub25Mb2FkaW5nRmFpbGVkKGRhdGEpO3RoaXMub25SZXF1ZXN0RmluaXNoZWQocmVxdWVzdCk7fQpvblJlc291cmNlQ2hhbmdlZFByaW9yaXR5KGRhdGEpe2NvbnN0IHJlcXVlc3Q9dGhpcy5fZmluZFJlYWxSZXF1ZXN0KGRhdGEucmVxdWVzdElkKTtpZighcmVxdWVzdClyZXR1cm47cmVxdWVzdC5vblJlc291cmNlQ2hhbmdlZFByaW9yaXR5KGRhdGEpO30KZGlzcGF0Y2goZXZlbnQpe2lmKCFldmVudC5tZXRob2Quc3RhcnRzV2l0aCgnTmV0d29yay4nKSl7cmV0dXJuO30Kc3dpdGNoKGV2ZW50Lm1ldGhvZCl7Y2FzZSdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JzpyZXR1cm4gdGhpcy5vblJlcXVlc3RXaWxsQmVTZW50KGV2ZW50LnBhcmFtcyk7Y2FzZSdOZXR3b3JrLnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnOnJldHVybiB0aGlzLm9uUmVxdWVzdFNlcnZlZEZyb21DYWNoZShldmVudC5wYXJhbXMpO2Nhc2UnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkJzpyZXR1cm4gdGhpcy5vblJlc3BvbnNlUmVjZWl2ZWQoZXZlbnQucGFyYW1zKTtjYXNlJ05ldHdvcmsuZGF0YVJlY2VpdmVkJzpyZXR1cm4gdGhpcy5vbkRhdGFSZWNlaXZlZChldmVudC5wYXJhbXMpO2Nhc2UnTmV0d29yay5sb2FkaW5nRmluaXNoZWQnOnJldHVybiB0aGlzLm9uTG9hZGluZ0ZpbmlzaGVkKGV2ZW50LnBhcmFtcyk7Y2FzZSdOZXR3b3JrLmxvYWRpbmdGYWlsZWQnOnJldHVybiB0aGlzLm9uTG9hZGluZ0ZhaWxlZChldmVudC5wYXJhbXMpO2Nhc2UnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eSc6cmV0dXJuIHRoaXMub25SZXNvdXJjZUNoYW5nZWRQcmlvcml0eShldmVudC5wYXJhbXMpO2RlZmF1bHQ6cmV0dXJuO319Cl9maW5kUmVhbFJlcXVlc3QocmVxdWVzdElkKXtsZXQgcmVxdWVzdD10aGlzLl9yZWNvcmRzQnlJZC5nZXQocmVxdWVzdElkKTtpZighcmVxdWVzdClyZXR1cm4gdW5kZWZpbmVkO3doaWxlKHJlcXVlc3QucmVkaXJlY3REZXN0aW5hdGlvbil7cmVxdWVzdD1yZXF1ZXN0LnJlZGlyZWN0RGVzdGluYXRpb247fQpyZXR1cm4gcmVxdWVzdDt9CnN0YXRpYyByZWNvcmRzRnJvbUxvZ3MoZGV2dG9vbHNMb2cpe2NvbnN0IG5ldHdvcmtSZWNvcmRlcj1uZXcgTmV0d29ya1JlY29yZGVyKCk7ZGV2dG9vbHNMb2cuZm9yRWFjaChtZXNzYWdlPT5uZXR3b3JrUmVjb3JkZXIuZGlzcGF0Y2gobWVzc2FnZSkpO2NvbnN0IHJlY29yZHM9bmV0d29ya1JlY29yZGVyLmdldFJlY29yZHMoKTtjb25zdCByZWNvcmRzQnlVUkw9bmV3IE1hcCgpO2Zvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7aWYocmVjb3Jkc0J5VVJMLmhhcyhyZWNvcmQudXJsKSljb250aW51ZTtyZWNvcmRzQnlVUkwuc2V0KHJlY29yZC51cmwscmVjb3JkKTt9CmZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7Y29uc3Qgc3RhY2tGcmFtZXM9cmVjb3JkLmluaXRpYXRvci5zdGFjayYmcmVjb3JkLmluaXRpYXRvci5zdGFjay5jYWxsRnJhbWVzfHxbXTtjb25zdCBpbml0aWF0b3JVUkw9cmVjb3JkLmluaXRpYXRvci51cmx8fHN0YWNrRnJhbWVzWzBdJiZzdGFja0ZyYW1lc1swXS51cmw7Y29uc3QgaW5pdGlhdG9yPXJlY29yZHNCeVVSTC5nZXQoaW5pdGlhdG9yVVJMKXx8cmVjb3JkLnJlZGlyZWN0U291cmNlO2lmKGluaXRpYXRvcil7cmVjb3JkLnNldEluaXRpYXRvclJlcXVlc3QoaW5pdGlhdG9yKTt9CmxldCBmaW5hbFJlY29yZD1yZWNvcmQ7d2hpbGUoZmluYWxSZWNvcmQucmVkaXJlY3REZXN0aW5hdGlvbilmaW5hbFJlY29yZD1maW5hbFJlY29yZC5yZWRpcmVjdERlc3RpbmF0aW9uO2lmKGZpbmFsUmVjb3JkPT09cmVjb3JkfHxmaW5hbFJlY29yZC5yZWRpcmVjdHMpY29udGludWU7Y29uc3QgcmVkaXJlY3RzPVtdO2ZvcihsZXQgcmVkaXJlY3Q9ZmluYWxSZWNvcmQucmVkaXJlY3RTb3VyY2U7cmVkaXJlY3Q7cmVkaXJlY3Q9cmVkaXJlY3QucmVkaXJlY3RTb3VyY2UpCntyZWRpcmVjdHMudW5zaGlmdChyZWRpcmVjdCk7fQpmaW5hbFJlY29yZC5yZWRpcmVjdHM9cmVkaXJlY3RzO30KcmV0dXJuIHJlY29yZHM7fX0KbW9kdWxlLmV4cG9ydHM9TmV0d29ya1JlY29yZGVyO30seyIuL25ldHdvcmstcmVxdWVzdCI6MzgsIi4vd2ViLWluc3BlY3RvciI6NDcsImV2ZW50cyI6NjIsImxpZ2h0aG91c2UtbG9nZ2VyIjoxMjV9XSwzODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFVSTD1yZXF1aXJlKCcuL3VybC1zaGltJyk7Y29uc3QgU0VDVVJFX1NDSEVNRVM9WydkYXRhJywnaHR0cHMnLCd3c3MnLCdibG9iJywnY2hyb21lJywnY2hyb21lLWV4dGVuc2lvbicsJ2Fib3V0J107Y29uc3QgUkVTT1VSQ0VfVFlQRVM9e1hIUjonWEhSJyxGZXRjaDonRmV0Y2gnLEV2ZW50U291cmNlOidFdmVudFNvdXJjZScsU2NyaXB0OidTY3JpcHQnLFN0eWxlc2hlZXQ6J1N0eWxlc2hlZXQnLEltYWdlOidJbWFnZScsTWVkaWE6J01lZGlhJyxGb250OidGb250JyxEb2N1bWVudDonRG9jdW1lbnQnLFRleHRUcmFjazonVGV4dFRyYWNrJyxXZWJTb2NrZXQ6J1dlYlNvY2tldCcsT3RoZXI6J090aGVyJyxNYW5pZmVzdDonTWFuaWZlc3QnfTttb2R1bGUuZXhwb3J0cz1jbGFzcyBOZXR3b3JrUmVxdWVzdHtjb25zdHJ1Y3Rvcigpe3RoaXMucmVxdWVzdElkPScnO3RoaXMuY29ubmVjdGlvbklkPScwJzt0aGlzLmNvbm5lY3Rpb25SZXVzZWQ9ZmFsc2U7dGhpcy51cmw9Jyc7dGhpcy5wcm90b2NvbD0nJzt0aGlzLmlzU2VjdXJlPWZhbHNlO3RoaXMucGFyc2VkVVJMPXtzY2hlbWU6Jyd9O3RoaXMuZG9jdW1lbnRVUkw9Jyc7dGhpcy5zdGFydFRpbWU9LTE7dGhpcy5lbmRUaW1lPS0xO3RoaXMucmVzcG9uc2VSZWNlaXZlZFRpbWU9LTE7dGhpcy50cmFuc2ZlclNpemU9MDt0aGlzLnJlc291cmNlU2l6ZT0wO3RoaXMuZnJvbURpc2tDYWNoZT1mYWxzZTt0aGlzLmZyb21NZW1vcnlDYWNoZT1mYWxzZTt0aGlzLmZpbmlzaGVkPWZhbHNlO3RoaXMucmVxdWVzdE1ldGhvZD0nJzt0aGlzLnN0YXR1c0NvZGU9LTE7dGhpcy5yZWRpcmVjdFNvdXJjZT11bmRlZmluZWQ7dGhpcy5yZWRpcmVjdERlc3RpbmF0aW9uPXVuZGVmaW5lZDt0aGlzLnJlZGlyZWN0cz11bmRlZmluZWQ7dGhpcy5mYWlsZWQ9ZmFsc2U7dGhpcy5sb2NhbGl6ZWRGYWlsRGVzY3JpcHRpb249Jyc7dGhpcy5pbml0aWF0b3I9e3R5cGU6J290aGVyJ307dGhpcy50aW1pbmc9dW5kZWZpbmVkO3RoaXMucmVzb3VyY2VUeXBlPXVuZGVmaW5lZDt0aGlzLm1pbWVUeXBlPScnO3RoaXMucHJpb3JpdHk9J0xvdyc7dGhpcy5pbml0aWF0b3JSZXF1ZXN0PXVuZGVmaW5lZDt0aGlzLnJlc3BvbnNlSGVhZGVycz1bXTt0aGlzLmZldGNoZWRWaWFTZXJ2aWNlV29ya2VyPWZhbHNlO3RoaXMuZnJhbWVJZD0nJzt0aGlzLmlzTGlua1ByZWxvYWQ9ZmFsc2U7fQpzZXRJbml0aWF0b3JSZXF1ZXN0KGluaXRpYXRvcil7dGhpcy5pbml0aWF0b3JSZXF1ZXN0PWluaXRpYXRvcjt9Cm9uUmVxdWVzdFdpbGxCZVNlbnQoZGF0YSl7dGhpcy5yZXF1ZXN0SWQ9ZGF0YS5yZXF1ZXN0SWQ7Y29uc3QgdXJsPW5ldyBVUkwoZGF0YS5yZXF1ZXN0LnVybCk7dGhpcy51cmw9ZGF0YS5yZXF1ZXN0LnVybDt0aGlzLmRvY3VtZW50VVJMPWRhdGEuZG9jdW1lbnRVUkw7dGhpcy5wYXJzZWRVUkw9e3NjaGVtZTp1cmwucHJvdG9jb2wuc3BsaXQoJzonKVswXSxob3N0OnVybC5ob3N0bmFtZSxzZWN1cml0eU9yaWdpbjp1cmwub3JpZ2lufTt0aGlzLmlzU2VjdXJlPVNFQ1VSRV9TQ0hFTUVTLmluY2x1ZGVzKHRoaXMucGFyc2VkVVJMLnNjaGVtZSk7dGhpcy5zdGFydFRpbWU9ZGF0YS50aW1lc3RhbXA7dGhpcy5yZXF1ZXN0TWV0aG9kPWRhdGEucmVxdWVzdC5tZXRob2Q7dGhpcy5pbml0aWF0b3I9ZGF0YS5pbml0aWF0b3I7dGhpcy5yZXNvdXJjZVR5cGU9ZGF0YS50eXBlJiZSRVNPVVJDRV9UWVBFU1tkYXRhLnR5cGVdO3RoaXMucHJpb3JpdHk9ZGF0YS5yZXF1ZXN0LmluaXRpYWxQcmlvcml0eTt0aGlzLmZyYW1lSWQ9ZGF0YS5mcmFtZUlkO3RoaXMuaXNMaW5rUHJlbG9hZD1kYXRhLmluaXRpYXRvci50eXBlPT09J3ByZWxvYWQnfHwhIWRhdGEucmVxdWVzdC5pc0xpbmtQcmVsb2FkO30Kb25SZXF1ZXN0U2VydmVkRnJvbUNhY2hlKCl7dGhpcy5mcm9tTWVtb3J5Q2FjaGU9dHJ1ZTt9Cm9uUmVzcG9uc2VSZWNlaXZlZChkYXRhKXt0aGlzLl9vblJlc3BvbnNlKGRhdGEucmVzcG9uc2UsZGF0YS50aW1lc3RhbXAsZGF0YS50eXBlKTt0aGlzLmZyYW1lSWQ9ZGF0YS5mcmFtZUlkO30Kb25EYXRhUmVjZWl2ZWQoZGF0YSl7dGhpcy5yZXNvdXJjZVNpemUrPWRhdGEuZGF0YUxlbmd0aDtpZihkYXRhLmVuY29kZWREYXRhTGVuZ3RoIT09LTEpe3RoaXMudHJhbnNmZXJTaXplKz1kYXRhLmVuY29kZWREYXRhTGVuZ3RoO319Cm9uTG9hZGluZ0ZpbmlzaGVkKGRhdGEpe2lmKHRoaXMuZmluaXNoZWQpcmV0dXJuO3RoaXMuZmluaXNoZWQ9dHJ1ZTt0aGlzLmVuZFRpbWU9ZGF0YS50aW1lc3RhbXA7aWYoZGF0YS5lbmNvZGVkRGF0YUxlbmd0aD49MCl7dGhpcy50cmFuc2ZlclNpemU9ZGF0YS5lbmNvZGVkRGF0YUxlbmd0aDt9CnRoaXMuX3VwZGF0ZVJlc3BvbnNlUmVjZWl2ZWRUaW1lSWZOZWNlc3NhcnkoKTt9Cm9uTG9hZGluZ0ZhaWxlZChkYXRhKXtpZih0aGlzLmZpbmlzaGVkKXJldHVybjt0aGlzLmZpbmlzaGVkPXRydWU7dGhpcy5lbmRUaW1lPWRhdGEudGltZXN0YW1wO3RoaXMuZmFpbGVkPXRydWU7dGhpcy5yZXNvdXJjZVR5cGU9ZGF0YS50eXBlJiZSRVNPVVJDRV9UWVBFU1tkYXRhLnR5cGVdO3RoaXMubG9jYWxpemVkRmFpbERlc2NyaXB0aW9uPWRhdGEuZXJyb3JUZXh0O3RoaXMuX3VwZGF0ZVJlc3BvbnNlUmVjZWl2ZWRUaW1lSWZOZWNlc3NhcnkoKTt9Cm9uUmVzb3VyY2VDaGFuZ2VkUHJpb3JpdHkoZGF0YSl7dGhpcy5wcmlvcml0eT1kYXRhLm5ld1ByaW9yaXR5O30Kb25SZWRpcmVjdFJlc3BvbnNlKGRhdGEpe2lmKCFkYXRhLnJlZGlyZWN0UmVzcG9uc2UpdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlZGlyZWN0UmVzcG9uc2UgZGF0YScpO3RoaXMuX29uUmVzcG9uc2UoZGF0YS5yZWRpcmVjdFJlc3BvbnNlLGRhdGEudGltZXN0YW1wLGRhdGEudHlwZSk7dGhpcy5yZXNvdXJjZVR5cGU9dW5kZWZpbmVkO3RoaXMuZmluaXNoZWQ9dHJ1ZTt0aGlzLmVuZFRpbWU9ZGF0YS50aW1lc3RhbXA7dGhpcy5fdXBkYXRlUmVzcG9uc2VSZWNlaXZlZFRpbWVJZk5lY2Vzc2FyeSgpO30KX29uUmVzcG9uc2UocmVzcG9uc2UsdGltZXN0YW1wLHJlc291cmNlVHlwZSl7dGhpcy51cmw9cmVzcG9uc2UudXJsO3RoaXMuY29ubmVjdGlvbklkPVN0cmluZyhyZXNwb25zZS5jb25uZWN0aW9uSWQpO3RoaXMuY29ubmVjdGlvblJldXNlZD1yZXNwb25zZS5jb25uZWN0aW9uUmV1c2VkO2lmKHJlc3BvbnNlLnByb3RvY29sKXRoaXMucHJvdG9jb2w9cmVzcG9uc2UucHJvdG9jb2w7dGhpcy5yZXNwb25zZVJlY2VpdmVkVGltZT10aW1lc3RhbXA7dGhpcy50cmFuc2ZlclNpemU9cmVzcG9uc2UuZW5jb2RlZERhdGFMZW5ndGg7aWYodHlwZW9mIHJlc3BvbnNlLmZyb21EaXNrQ2FjaGU9PT0nYm9vbGVhbicpdGhpcy5mcm9tRGlza0NhY2hlPXJlc3BvbnNlLmZyb21EaXNrQ2FjaGU7dGhpcy5zdGF0dXNDb2RlPXJlc3BvbnNlLnN0YXR1czt0aGlzLnRpbWluZz1yZXNwb25zZS50aW1pbmc7aWYocmVzb3VyY2VUeXBlKXRoaXMucmVzb3VyY2VUeXBlPVJFU09VUkNFX1RZUEVTW3Jlc291cmNlVHlwZV07dGhpcy5taW1lVHlwZT1yZXNwb25zZS5taW1lVHlwZTt0aGlzLnJlc3BvbnNlSGVhZGVycz1OZXR3b3JrUmVxdWVzdC5faGVhZGVyc0RpY3RUb0hlYWRlcnNBcnJheShyZXNwb25zZS5oZWFkZXJzKTt0aGlzLmZldGNoZWRWaWFTZXJ2aWNlV29ya2VyPSEhcmVzcG9uc2UuZnJvbVNlcnZpY2VXb3JrZXI7aWYodGhpcy5mcm9tTWVtb3J5Q2FjaGUpdGhpcy50aW1pbmc9dW5kZWZpbmVkO2lmKHRoaXMudGltaW5nKXRoaXMuX3JlY29tcHV0ZVRpbWVzV2l0aFJlc291cmNlVGltaW5nKHRoaXMudGltaW5nKTt9Cl9yZWNvbXB1dGVUaW1lc1dpdGhSZXNvdXJjZVRpbWluZyh0aW1pbmcpe3RoaXMuc3RhcnRUaW1lPXRpbWluZy5yZXF1ZXN0VGltZTtjb25zdCBoZWFkZXJzUmVjZWl2ZWRUaW1lPXRpbWluZy5yZXF1ZXN0VGltZSt0aW1pbmcucmVjZWl2ZUhlYWRlcnNFbmQvMTAwMDtpZighdGhpcy5yZXNwb25zZVJlY2VpdmVkVGltZXx8dGhpcy5yZXNwb25zZVJlY2VpdmVkVGltZTwwKXt0aGlzLnJlc3BvbnNlUmVjZWl2ZWRUaW1lPWhlYWRlcnNSZWNlaXZlZFRpbWU7fQp0aGlzLnJlc3BvbnNlUmVjZWl2ZWRUaW1lPU1hdGgubWluKHRoaXMucmVzcG9uc2VSZWNlaXZlZFRpbWUsaGVhZGVyc1JlY2VpdmVkVGltZSk7dGhpcy5yZXNwb25zZVJlY2VpdmVkVGltZT1NYXRoLm1heCh0aGlzLnJlc3BvbnNlUmVjZWl2ZWRUaW1lLHRoaXMuc3RhcnRUaW1lKTt0aGlzLmVuZFRpbWU9TWF0aC5tYXgodGhpcy5lbmRUaW1lLHRoaXMucmVzcG9uc2VSZWNlaXZlZFRpbWUpO30KX3VwZGF0ZVJlc3BvbnNlUmVjZWl2ZWRUaW1lSWZOZWNlc3NhcnkoKXt0aGlzLnJlc3BvbnNlUmVjZWl2ZWRUaW1lPU1hdGgubWluKHRoaXMuZW5kVGltZSx0aGlzLnJlc3BvbnNlUmVjZWl2ZWRUaW1lKTt9CnN0YXRpYyBnZXRSZXF1ZXN0SWRGb3JCYWNrZW5kKHJlcXVlc3RJZCl7cmV0dXJuIHJlcXVlc3RJZC5yZXBsYWNlKC8oOnJlZGlyZWN0KSskLywnJyk7fQpzdGF0aWMgX2hlYWRlcnNEaWN0VG9IZWFkZXJzQXJyYXkoaGVhZGVyc0RpY3Qpe2NvbnN0IHJlc3VsdD1bXTtmb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzRGljdCkpe2NvbnN0IHZhbHVlcz1oZWFkZXJzRGljdFtuYW1lXS5zcGxpdCgnXG4nKTtmb3IobGV0IGk9MDtpPHZhbHVlcy5sZW5ndGg7KytpKXtyZXN1bHQucHVzaCh7bmFtZTpuYW1lLHZhbHVlOnZhbHVlc1tpXX0pO319CnJldHVybiByZXN1bHQ7fQpzdGF0aWMgZ2V0IFRZUEVTKCl7cmV0dXJuIFJFU09VUkNFX1RZUEVTO319O30seyIuL3VybC1zaGltIjoidXJsIn1dLDM5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gd3JhcFJ1bnRpbWVFdmFsRXJyb3JJbkJyb3dzZXIoZXJyKXtlcnI9ZXJyfHxuZXcgRXJyb3IoKTtjb25zdCBmYWxsYmFja01lc3NhZ2U9dHlwZW9mIGVycj09PSdzdHJpbmcnP2VycjondW5rbm93biBlcnJvcic7cmV0dXJue19fZmFpbGVkSW5Ccm93c2VyOnRydWUsbmFtZTplcnIubmFtZXx8J0Vycm9yJyxtZXNzYWdlOmVyci5tZXNzYWdlfHxmYWxsYmFja01lc3NhZ2Usc3RhY2s6ZXJyLnN0YWNrfHxuZXcgRXJyb3IoKS5zdGFja307fQpmdW5jdGlvbiByZWdpc3RlclBlcmZvcm1hbmNlT2JzZXJ2ZXJJblBhZ2UoKXt3aW5kb3cuX19fX2xhc3RMb25nVGFzaz13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7Y29uc3Qgb2JzZXJ2ZXI9bmV3IHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyKGVudHJ5TGlzdD0+e2NvbnN0IGVudHJpZXM9ZW50cnlMaXN0LmdldEVudHJpZXMoKTtmb3IoY29uc3QgZW50cnkgb2YgZW50cmllcyl7aWYoZW50cnkuZW50cnlUeXBlPT09J2xvbmd0YXNrJyl7Y29uc3QgdGFza0VuZD1lbnRyeS5zdGFydFRpbWUrZW50cnkuZHVyYXRpb247d2luZG93Ll9fX19sYXN0TG9uZ1Rhc2s9TWF0aC5tYXgod2luZG93Ll9fX19sYXN0TG9uZ1Rhc2ssdGFza0VuZCk7fX19KTtvYnNlcnZlci5vYnNlcnZlKHtlbnRyeVR5cGVzOlsnbG9uZ3Rhc2snXX0pO3dpbmRvdy5fX19fbGhQZXJmb3JtYW5jZU9ic2VydmVyPW9ic2VydmVyO30KZnVuY3Rpb24gY2hlY2tUaW1lU2luY2VMYXN0TG9uZ1Rhc2soKXtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IHRpbWVvdXRSZXF1ZXN0ZWQ9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpKzUwO3NldFRpbWVvdXQoKCk9Pntjb25zdCB0aW1lb3V0RmlyZWQ9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpO2NvbnN0IHRpbWVTaW5jZUxvbmdUYXNrPXRpbWVvdXRGaXJlZC10aW1lb3V0UmVxdWVzdGVkPDUwP3RpbWVvdXRGaXJlZC13aW5kb3cuX19fX2xhc3RMb25nVGFzazowO3Jlc29sdmUodGltZVNpbmNlTG9uZ1Rhc2spO30sNTApO30pO30KbW9kdWxlLmV4cG9ydHM9e3dyYXBSdW50aW1lRXZhbEVycm9ySW5Ccm93c2VyLHJlZ2lzdGVyUGVyZm9ybWFuY2VPYnNlcnZlckluUGFnZSxjaGVja1RpbWVTaW5jZUxhc3RMb25nVGFza307fSx7fV0sNDA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBsb2c9cmVxdWlyZSgnbGlnaHRob3VzZS1sb2dnZXInKTtjb25zdCBTRU5UUllfVVJMPSdodHRwczovL2E2YmIwZGE4N2VlMDQ4Y2M5YWUyYTM0NWZjMDlhYjJlOjYzYTcwMjlmNDZmNzQyNjU5ODFiN2UwMDVlMGY2OWY4QHNlbnRyeS5pby8xNzQ2OTcnO2NvbnN0IG5vb3A9KCk9PlByb21pc2UucmVzb2x2ZSgpO2NvbnN0IHNlbnRyeUFwaT17Y2FwdHVyZU1lc3NhZ2U6bm9vcCxjYXB0dXJlRXhjZXB0aW9uOm5vb3AsY2FwdHVyZUJyZWFkY3J1bWI6bm9vcCxtZXJnZUNvbnRleHQ6bm9vcCxnZXRDb250ZXh0Om5vb3B9O2NvbnN0IFNBTVBMRURfRVJST1JTPVt7cGF0dGVybjovRE9DVU1FTlRfUkVRVUVTVCQvLHJhdGU6MC4xfSx7cGF0dGVybjovKElETEVfUEVSSU9EfEZNUF9UT09fTEFURSkvLHJhdGU6MC4xfSx7cGF0dGVybjovXk5PXy4qLyxyYXRlOjAuMX0se3BhdHRlcm46L0NvdWxkIG5vdCBsb2FkIHN0eWxlc2hlZXQvLHJhdGU6MC4wMX0se3BhdHRlcm46L0ZhaWxlZCB0byBkZWNvZGUvLHJhdGU6MC4xfSx7cGF0dGVybjovQWxsIGltYWdlIG9wdGltaXphdGlvbnMgZmFpbGVkLyxyYXRlOjAuMX0se3BhdHRlcm46L05vLipyZXNvdXJjZSB3aXRoIGdpdmVuLyxyYXRlOjAuMDF9LHtwYXR0ZXJuOi9Oby4qbm9kZSB3aXRoIGdpdmVuIGlkLyxyYXRlOjAuMDF9XTtjb25zdCBzZW50cnlEZWxlZ2F0ZT1PYmplY3QuYXNzaWduKHt9LHNlbnRyeUFwaSk7c2VudHJ5RGVsZWdhdGUuaW5pdD1mdW5jdGlvbiBpbml0KG9wdHMpe2lmKCFvcHRzLmZsYWdzLmVuYWJsZUVycm9yUmVwb3J0aW5nKXtyZXR1cm47fQpjb25zdCBlbnZpcm9ubWVudERhdGE9b3B0cy5lbnZpcm9ubWVudERhdGF8fHt9O2NvbnN0IHNlbnRyeUNvbmZpZz1PYmplY3QuYXNzaWduKHt9LGVudmlyb25tZW50RGF0YSx7Y2FwdHVyZVVuaGFuZGxlZFJlamVjdGlvbnM6dHJ1ZX0pO3RyeXtjb25zdCBTZW50cnk9cmVxdWlyZSgncmF2ZW4nKTtTZW50cnkuY29uZmlnKFNFTlRSWV9VUkwsc2VudHJ5Q29uZmlnKS5pbnN0YWxsKCk7T2JqZWN0LmtleXMoc2VudHJ5QXBpKS5mb3JFYWNoKGZ1bmN0aW9uTmFtZT0+e3NlbnRyeURlbGVnYXRlW2Z1bmN0aW9uTmFtZV09KC4uLmFyZ3MpPT5TZW50cnlbZnVuY3Rpb25OYW1lXSguLi5hcmdzKTt9KTtzZW50cnlEZWxlZ2F0ZS5jYXB0dXJlRXhjZXB0aW9uPShlcnIsb3B0cyk9PntvcHRzPW9wdHN8fHt9O2NvbnN0IGVtcHR5PVByb21pc2UucmVzb2x2ZSgpO2lmKCFlcnIpcmV0dXJuIGVtcHR5O2lmKGVyci5leHBlY3RlZClyZXR1cm4gZW1wdHk7Y29uc3Qgc2FtcGxlZEVycm9yTWF0Y2g9U0FNUExFRF9FUlJPUlMuZmluZChzYW1wbGU9PnNhbXBsZS5wYXR0ZXJuLnRlc3QoZXJyLm1lc3NhZ2UpKTtpZihzYW1wbGVkRXJyb3JNYXRjaCYmc2FtcGxlZEVycm9yTWF0Y2gucmF0ZTw9TWF0aC5yYW5kb20oKSlyZXR1cm4gZW1wdHk7aWYoZXJyLnByb3RvY29sTWV0aG9kKXtvcHRzLmZpbmdlcnByaW50PVsne3sgZGVmYXVsdCB9fScsZXJyLnByb3RvY29sTWV0aG9kLGVyci5wcm90b2NvbEVycm9yXTt9CnJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57U2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZXJyLG9wdHMsKCk9PnJlc29sdmUoKSk7fSk7fTt9Y2F0Y2goZSl7bG9nLndhcm4oJ3NlbnRyeScsJ0NvdWxkIG5vdCBsb2FkIHJhdmVuIGxpYnJhcnksIGVycm9ycyB3aWxsIG5vdCBiZSByZXBvcnRlZC4nKTt9CmNvbnN0IGNvbnRleHQ9T2JqZWN0LmFzc2lnbih7dXJsOm9wdHMudXJsLGRldmljZUVtdWxhdGlvbjohb3B0cy5mbGFncy5kaXNhYmxlRGV2aWNlRW11bGF0aW9uLHRocm90dGxpbmdNZXRob2Q6b3B0cy5mbGFncy50aHJvdHRsaW5nTWV0aG9kfSxvcHRzLmZsYWdzLnRocm90dGxpbmcpO3NlbnRyeURlbGVnYXRlLm1lcmdlQ29udGV4dCh7ZXh0cmE6T2JqZWN0LmFzc2lnbih7fSxlbnZpcm9ubWVudERhdGEuZXh0cmEsY29udGV4dCl9KTtyZXR1cm4gY29udGV4dDt9O21vZHVsZS5leHBvcnRzPXNlbnRyeURlbGVnYXRlO30seyJsaWdodGhvdXNlLWxvZ2dlciI6MTI1LCJyYXZlbiI6NTh9XSw0MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIGVyZih4KXtjb25zdCBzaWduPU1hdGguc2lnbih4KTt4PU1hdGguYWJzKHgpO2NvbnN0IGExPTAuMjU0ODI5NTkyO2NvbnN0IGEyPS0wLjI4NDQ5NjczNjtjb25zdCBhMz0xLjQyMTQxMzc0MTtjb25zdCBhND0tMS40NTMxNTIwMjc7Y29uc3QgYTU9MS4wNjE0MDU0Mjk7Y29uc3QgcD0wLjMyNzU5MTE7Y29uc3QgdD0xLygxK3AqeCk7Y29uc3QgeT10KihhMSt0KihhMit0KihhMyt0KihhNCt0KmE1KSkpKTtyZXR1cm4gc2lnbiooMS15Kk1hdGguZXhwKC14KngpKTt9CmZ1bmN0aW9uIGdldExvZ05vcm1hbERpc3RyaWJ1dGlvbihtZWRpYW4sZmFsbG9mZil7Y29uc3QgbG9jYXRpb249TWF0aC5sb2cobWVkaWFuKTtjb25zdCBsb2dSYXRpbz1NYXRoLmxvZyhmYWxsb2ZmL21lZGlhbik7Y29uc3Qgc2hhcGU9TWF0aC5zcXJ0KDEtMypsb2dSYXRpby1NYXRoLnNxcnQoKGxvZ1JhdGlvLTMpKihsb2dSYXRpby0zKS04KSkvMjtyZXR1cm57Y29tcHV0ZUNvbXBsZW1lbnRhcnlQZXJjZW50aWxlKHgpe2NvbnN0IHN0YW5kYXJkaXplZFg9KE1hdGgubG9nKHgpLWxvY2F0aW9uKS8oTWF0aC5TUVJUMipzaGFwZSk7cmV0dXJuKDEtZXJmKHN0YW5kYXJkaXplZFgpKS8yO319O30KZnVuY3Rpb24gbGluZWFySW50ZXJwb2xhdGlvbih4MCx5MCx4MSx5MSx4KXtjb25zdCBzbG9wZT0oeTEteTApLyh4MS14MCk7cmV0dXJuIHkwKyh4LXgwKSpzbG9wZTt9Cm1vZHVsZS5leHBvcnRzPXtsaW5lYXJJbnRlcnBvbGF0aW9uLGdldExvZ05vcm1hbERpc3RyaWJ1dGlvbn07fSx7fV0sNDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jzttb2R1bGUuZXhwb3J0cz17ZGlkbnRDb2xsZWN0U2NyZWVuc2hvdHM6YENocm9tZSBkaWRuJ3QgY29sbGVjdCBhbnkgc2NyZWVuc2hvdHMgZHVyaW5nIHRoZSBwYWdlIGxvYWQuIFBsZWFzZSBtYWtlIHN1cmUgdGhlcmUgaXMgY29udGVudCB2aXNpYmxlIG9uIHRoZSBwYWdlLCBhbmQgdGhlbiB0cnkgcmUtcnVubmluZyBMaWdodGhvdXNlLmAsYmFkVHJhY2VSZWNvcmRpbmc6YFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggcmVjb3JkaW5nIHRoZSB0cmFjZSBvdmVyIHlvdXIgcGFnZSBsb2FkLiBQbGVhc2UgcnVuIExpZ2h0aG91c2UgYWdhaW4uYCxwYWdlTG9hZFRvb2tUb29Mb25nOmBZb3VyIHBhZ2UgdG9vayB0b28gbG9uZyB0byBsb2FkLiBQbGVhc2UgZm9sbG93IHRoZSBvcHBvcnR1bml0aWVzIGluIHRoZSByZXBvcnQgdG8gcmVkdWNlIHlvdXIgcGFnZSBsb2FkIHRpbWUsIGFuZCB0aGVuIHRyeSByZS1ydW5uaW5nIExpZ2h0aG91c2UuYCxwYWdlTG9hZEZhaWxlZDpgWW91ciBwYWdlIGZhaWxlZCB0byBsb2FkLiBWZXJpZnkgdGhhdCB0aGUgVVJMIGlzIHZhbGlkIGFuZCByZS1ydW4gTGlnaHRob3VzZS5gLGludGVybmFsQ2hyb21lRXJyb3I6YEFuIGludGVybmFsIENocm9tZSBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIHJlc3RhcnQgQ2hyb21lIGFuZCB0cnkgcmUtcnVubmluZyBMaWdodGhvdXNlLmAscmVxdWVzdENvbnRlbnRUaW1lb3V0OidGZXRjaGluZyByZXNvdXJjZSBjb250ZW50IGhhcyBleGNlZWRlZCB0aGUgYWxsb3R0ZWQgdGltZSd9O30se31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgdGFza0dyb3Vwcz17cGFyc2VIVE1MOntpZDonJyxsYWJlbDonUGFyc2UgSFRNTCAmIENTUycsdHJhY2VFdmVudE5hbWVzOlsnUGFyc2VIVE1MJywnUGFyc2VBdXRob3JTdHlsZVNoZWV0J119LHN0eWxlTGF5b3V0OntpZDonJyxsYWJlbDonU3R5bGUgJiBMYXlvdXQnLHRyYWNlRXZlbnROYW1lczpbJ1NjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uJywnUmVjYWxjdWxhdGVTdHlsZXMnLCdVcGRhdGVMYXlvdXRUcmVlJywnSW52YWxpZGF0ZUxheW91dCcsJ0xheW91dCddfSxwYWludENvbXBvc2l0ZVJlbmRlcjp7aWQ6JycsbGFiZWw6J1JlbmRlcmluZycsdHJhY2VFdmVudE5hbWVzOlsnQW5pbWF0aW9uJywnUmVxdWVzdE1haW5UaHJlYWRGcmFtZScsJ0FjdGl2YXRlTGF5ZXJUcmVlJywnRHJhd0ZyYW1lJywnSGl0VGVzdCcsJ1BhaW50U2V0dXAnLCdQYWludCcsJ1BhaW50SW1hZ2UnLCdSYXN0ZXJpemUnLCdSYXN0ZXJUYXNrJywnU2Nyb2xsTGF5ZXInLCdVcGRhdGVMYXllcicsJ1VwZGF0ZUxheWVyVHJlZScsJ0NvbXBvc2l0ZUxheWVycyddfSxzY3JpcHRQYXJzZUNvbXBpbGU6e2lkOicnLGxhYmVsOidTY3JpcHQgUGFyc2luZyAmIENvbXBpbGF0aW9uJyx0cmFjZUV2ZW50TmFtZXM6Wyd2OC5jb21waWxlJywndjguY29tcGlsZU1vZHVsZScsJ3Y4LnBhcnNlT25CYWNrZ3JvdW5kJ119LHNjcmlwdEV2YWx1YXRpb246e2lkOicnLGxhYmVsOidTY3JpcHQgRXZhbHVhdGlvbicsdHJhY2VFdmVudE5hbWVzOlsnRXZlbnREaXNwYXRjaCcsJ0V2YWx1YXRlU2NyaXB0JywndjguZXZhbHVhdGVNb2R1bGUnLCdGdW5jdGlvbkNhbGwnLCdUaW1lckZpcmUnLCdGaXJlSWRsZUNhbGxiYWNrJywnRmlyZUFuaW1hdGlvbkZyYW1lJywnUnVuTWljcm90YXNrcycsJ1Y4LkV4ZWN1dGUnXX0sZ2FyYmFnZUNvbGxlY3Rpb246e2lkOicnLGxhYmVsOidHYXJiYWdlIENvbGxlY3Rpb24nLHRyYWNlRXZlbnROYW1lczpbJ0dDRXZlbnQnLCdNaW5vckdDJywnTWFqb3JHQycsJ1RocmVhZFN0YXRlOjpwZXJmb3JtSWRsZUxhenlTd2VlcCcsJ1RocmVhZFN0YXRlOjpjb21wbGV0ZVN3ZWVwJywnQmxpbmtHQ01hcmtpbmcnXX0sb3RoZXI6e2lkOicnLGxhYmVsOidPdGhlcicsdHJhY2VFdmVudE5hbWVzOlsnTWVzc2FnZUxvb3A6OlJ1blRhc2snLCdUYXNrUXVldWVNYW5hZ2VyOjpQcm9jZXNzVGFza0Zyb21Xb3JrUXVldWUnLCdUaHJlYWRDb250cm9sbGVySW1wbDo6RG9Xb3JrJ119fTtjb25zdCB0YXNrTmFtZVRvR3JvdXA9e307Zm9yKGNvbnN0W2dyb3VwSWQsZ3JvdXBdb2YgT2JqZWN0LmVudHJpZXModGFza0dyb3Vwcykpe2dyb3VwLmlkPWdyb3VwSWQ7Zm9yKGNvbnN0IHRyYWNlRXZlbnROYW1lIG9mIGdyb3VwLnRyYWNlRXZlbnROYW1lcyl7dGFza05hbWVUb0dyb3VwW3RyYWNlRXZlbnROYW1lXT1ncm91cDt9fQptb2R1bGUuZXhwb3J0cz17dGFza0dyb3Vwcyx0YXNrTmFtZVRvR3JvdXB9O30se31dLDQ0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgbG9nPXJlcXVpcmUoJ2xpZ2h0aG91c2UtbG9nZ2VyJyk7ZnVuY3Rpb24gZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbihtZXRyaWNOYW1lKXtyZXR1cm4gYXVkaXRSZXN1bHRzPT57Y29uc3QgbWV0cmljc0F1ZGl0PWF1ZGl0UmVzdWx0cy5tZXRyaWNzO2lmKCFtZXRyaWNzQXVkaXR8fCFtZXRyaWNzQXVkaXQuZGV0YWlsc3x8IW1ldHJpY3NBdWRpdC5kZXRhaWxzLml0ZW1zKXJldHVybjtjb25zdCB2YWx1ZXM9bWV0cmljc0F1ZGl0LmRldGFpbHMuaXRlbXNbMF07cmV0dXJuIHZhbHVlcyYmdmFsdWVzW21ldHJpY05hbWVdO307fQpjbGFzcyBNZXRyaWNze2NvbnN0cnVjdG9yKHRyYWNlRXZlbnRzLGF1ZGl0UmVzdWx0cyl7dGhpcy5fdHJhY2VFdmVudHM9dHJhY2VFdmVudHM7dGhpcy5fYXVkaXRSZXN1bHRzPWF1ZGl0UmVzdWx0czt9CnN0YXRpYyBnZXQgbWV0cmljc0RlZmluaXRpb25zKCl7cmV0dXJuW3tuYW1lOidOYXZpZ2F0aW9uIFN0YXJ0JyxpZDonbmF2c3RhcnQnLGdldFRzOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkTmF2aWdhdGlvblN0YXJ0VHMnKSxnZXRUaW1pbmc6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWROYXZpZ2F0aW9uU3RhcnQnKX0se25hbWU6J0ZpcnN0IENvbnRlbnRmdWwgUGFpbnQnLGlkOid0dGZjcCcsZ2V0VHM6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRGaXJzdENvbnRlbnRmdWxQYWludFRzJyksZ2V0VGltaW5nOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkRmlyc3RDb250ZW50ZnVsUGFpbnQnKX0se25hbWU6J0ZpcnN0IE1lYW5pbmdmdWwgUGFpbnQnLGlkOid0dGZtcCcsZ2V0VHM6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRGaXJzdE1lYW5pbmdmdWxQYWludFRzJyksZ2V0VGltaW5nOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkRmlyc3RNZWFuaW5nZnVsUGFpbnQnKX0se25hbWU6J1NwZWVkIEluZGV4JyxpZDonc2knLGdldFRzOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkU3BlZWRJbmRleFRzJyksZ2V0VGltaW5nOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkU3BlZWRJbmRleCcpfSx7bmFtZTonRmlyc3QgVmlzdWFsIENoYW5nZScsaWQ6J2Z2JyxnZXRUczpmaW5kVmFsdWVJbk1ldHJpY3NBdWRpdEZuKCdvYnNlcnZlZEZpcnN0VmlzdWFsQ2hhbmdlVHMnKSxnZXRUaW1pbmc6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRGaXJzdFZpc3VhbENoYW5nZScpfSx7bmFtZTonVmlzdWFsbHkgQ29tcGxldGUgMTAwJScsaWQ6J3ZjMTAwJyxnZXRUczpmaW5kVmFsdWVJbk1ldHJpY3NBdWRpdEZuKCdvYnNlcnZlZExhc3RWaXN1YWxDaGFuZ2VUcycpLGdldFRpbWluZzpmaW5kVmFsdWVJbk1ldHJpY3NBdWRpdEZuKCdvYnNlcnZlZExhc3RWaXN1YWxDaGFuZ2UnKX0se25hbWU6J0ZpcnN0IENQVSBJZGxlJyxpZDondHRmaScsZ2V0VHM6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignZmlyc3RDUFVJZGxlVHMnKSxnZXRUaW1pbmc6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignZmlyc3RDUFVJZGxlJyl9LHtuYW1lOidJbnRlcmFjdGl2ZScsaWQ6J3R0aScsZ2V0VHM6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignaW50ZXJhY3RpdmVUcycpLGdldFRpbWluZzpmaW5kVmFsdWVJbk1ldHJpY3NBdWRpdEZuKCdpbnRlcmFjdGl2ZScpfSx7bmFtZTonRW5kIG9mIFRyYWNlJyxpZDonZW90JyxnZXRUczpmaW5kVmFsdWVJbk1ldHJpY3NBdWRpdEZuKCdvYnNlcnZlZFRyYWNlRW5kVHMnKSxnZXRUaW1pbmc6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRUcmFjZUVuZCcpfSx7bmFtZTonT24gTG9hZCcsaWQ6J29ubG9hZCcsZ2V0VHM6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRMb2FkVHMnKSxnZXRUaW1pbmc6ZmluZFZhbHVlSW5NZXRyaWNzQXVkaXRGbignb2JzZXJ2ZWRMb2FkJyl9LHtuYW1lOidET00gQ29udGVudCBMb2FkZWQnLGlkOidkY2wnLGdldFRzOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkRG9tQ29udGVudExvYWRlZFRzJyksZ2V0VGltaW5nOmZpbmRWYWx1ZUluTWV0cmljc0F1ZGl0Rm4oJ29ic2VydmVkRG9tQ29udGVudExvYWRlZCcpfV07fQpnYXRoZXJNZXRyaWNzKCl7Y29uc3QgbWV0cmljRGZucz1NZXRyaWNzLm1ldHJpY3NEZWZpbml0aW9ucztjb25zdCByZXNvbHZlZE1ldHJpY3M9W107bWV0cmljRGZucy5mb3JFYWNoKG1ldHJpYz0+e3RyeXtyZXNvbHZlZE1ldHJpY3MucHVzaCh7aWQ6bWV0cmljLmlkLG5hbWU6bWV0cmljLm5hbWUsdHM6bWV0cmljLmdldFRzKHRoaXMuX2F1ZGl0UmVzdWx0cyl9KTt9Y2F0Y2goZSl7bG9nLmVycm9yKCdwd21ldHJpY3MtZXZlbnRzJyxgJHttZXRyaWMubmFtZX0gdGltZXN0YW1wIG5vdCBmb3VuZDogJHtlLm1lc3NhZ2V9YCk7fX0pO3JldHVybiByZXNvbHZlZE1ldHJpY3M7fQppZGVudGlmeU5hdmlnYXRpb25TdGFydEV2dChtZXRyaWNzKXtjb25zdCBuYXZTdGFydE1ldHJpYz1tZXRyaWNzLmZpbmQoZT0+ZS5pZD09PSduYXZzdGFydCcpO2lmKCFuYXZTdGFydE1ldHJpYylyZXR1cm47dGhpcy5fbmF2aWdhdGlvblN0YXJ0RXZ0PXRoaXMuX3RyYWNlRXZlbnRzLmZpbmQoZT0+ZS5uYW1lPT09J25hdmlnYXRpb25TdGFydCcmJmUudHM9PT1uYXZTdGFydE1ldHJpYy50cyk7fQpzeW50aGVzaXplRXZlbnRQYWlyKG1ldHJpYyl7Y29uc3QgZXZlbnRCYXNlPXtwaWQ6dGhpcy5fbmF2aWdhdGlvblN0YXJ0RXZ0LnBpZCx0aWQ6dGhpcy5fbmF2aWdhdGlvblN0YXJ0RXZ0LnRpZCxjYXQ6J2JsaW5rLnVzZXJfdGltaW5nJyxuYW1lOm1ldHJpYy5uYW1lLGFyZ3M6e30saWQ6YDB4JHsoTWF0aC5yYW5kb20oKSoxMDAwMDAwfDApLnRvU3RyaW5nKDE2KX1gfTtjb25zdCBmYWtlTWVhc3VyZVN0YXJ0RXZlbnQ9T2JqZWN0LmFzc2lnbih7fSxldmVudEJhc2Use3RzOnRoaXMuX25hdmlnYXRpb25TdGFydEV2dC50cyxwaDonYid9KTtjb25zdCBmYWtlTWVhc3VyZUVuZEV2ZW50PU9iamVjdC5hc3NpZ24oe30sZXZlbnRCYXNlLHt0czptZXRyaWMudHMscGg6J2UnfSk7cmV0dXJuW2Zha2VNZWFzdXJlU3RhcnRFdmVudCxmYWtlTWVhc3VyZUVuZEV2ZW50XTt9CmdlbmVyYXRlRmFrZUV2ZW50cygpe2NvbnN0IGZha2VFdmVudHM9W107Y29uc3QgbWV0cmljcz10aGlzLmdhdGhlck1ldHJpY3MoKTtpZihtZXRyaWNzLmxlbmd0aD09PTApe2xvZy5lcnJvcignbWV0cmljcy1ldmVudHMnLCdNZXRyaWNzIGNvbGxlY3Rpb24gaGFkIGVycm9ycywgbm90IHN5bnRoZXRpemluZyB0cmFjZSBldmVudHMnKTtyZXR1cm5bXTt9CnRoaXMuaWRlbnRpZnlOYXZpZ2F0aW9uU3RhcnRFdnQobWV0cmljcyk7aWYoIXRoaXMuX25hdmlnYXRpb25TdGFydEV2dCl7bG9nLmVycm9yKCdwd21ldHJpY3MtZXZlbnRzJywnUmVmZXJlbmNlIG5hdmlnYXRpb25TdGFydCBub3QgZm91bmQnKTtyZXR1cm5bXTt9Cm1ldHJpY3MuZm9yRWFjaChtZXRyaWM9PntpZihtZXRyaWMuaWQ9PT0nbmF2c3RhcnQnKXtyZXR1cm47fQppZighbWV0cmljLnRzKXtsb2cuZXJyb3IoJ3B3bWV0cmljcy1ldmVudHMnLGAoJHttZXRyaWMubmFtZX0pIG1pc3NpbmcgdGltZXN0YW1wLiBTa2lwcGluZ+KApmApO3JldHVybjt9CmxvZy52ZXJib3NlKCdwd21ldHJpY3MtZXZlbnRzJyxgU3l0aGVzaXppbmcgdHJhY2UgZXZlbnRzIGZvciAke21ldHJpYy5uYW1lfWApO2Zha2VFdmVudHMucHVzaCguLi50aGlzLnN5bnRoZXNpemVFdmVudFBhaXIobWV0cmljKSk7fSk7cmV0dXJuIGZha2VFdmVudHM7fX0KbW9kdWxlLmV4cG9ydHM9TWV0cmljczt9LHsibGlnaHRob3VzZS1sb2dnZXIiOjEyNX1dLDQ1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgV2ViSW5zcGVjdG9yPXJlcXVpcmUoJy4uL3dlYi1pbnNwZWN0b3InKTtjbGFzcyBUcmFjZVBhcnNlcntjb25zdHJ1Y3Rvcigpe3RoaXMudHJhY2VFdmVudHM9W107dGhpcy50cmFjaW5nTW9kZWw9e3Jlc2V0OigpPT50aGlzLl9yZXNldCgpLGFkZEV2ZW50czpldnRzPT50aGlzLl9hZGRFdmVudHMoZXZ0cyl9O2NvbnN0IGRlbGVnYXRlTW9jaz17bG9hZGluZ1Byb2dyZXNzOigpPT57fSxsb2FkaW5nU3RhcnRlZDooKT0+e30sbG9hZGluZ0NvbXBsZXRlOnN1Y2Nlc3M9PntpZighc3VjY2Vzcyl0aHJvdyBuZXcgRXJyb3IoJ1BhcnNpbmcgcHJvYmxlbScpO319O3RoaXMubG9hZGVyPW5ldyBXZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIodGhpcy50cmFjaW5nTW9kZWwsZGVsZWdhdGVNb2NrKTt9Cl9yZXNldCgpe3RoaXMudHJhY2VFdmVudHM9W107fQpfYWRkRXZlbnRzKGV2dHMpe3RoaXMudHJhY2VFdmVudHMucHVzaCguLi5ldnRzKTt9CnBhcnNlQ2h1bmsoZGF0YSl7dGhpcy5sb2FkZXIud3JpdGUoZGF0YSk7fQpnZXRUcmFjZSgpe3JldHVybnt0cmFjZUV2ZW50czp0aGlzLnRyYWNlRXZlbnRzfTt9fQptb2R1bGUuZXhwb3J0cz1UcmFjZVBhcnNlcjt9LHsiLi4vd2ViLWluc3BlY3RvciI6NDd9XSw0NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IEJBU0VfUkVTUE9OU0VfTEFURU5DWT0xNjtjb25zdCBTQ0hFRFVMQUJMRV9UQVNLX1RJVExFPSdUYXNrUXVldWVNYW5hZ2VyOjpQcm9jZXNzVGFza0Zyb21Xb3JrUXVldWUnO2NvbnN0IFNDSEVEVUxBQkxFX1RBU0tfVElUTEVfQUxUMT0nVGhyZWFkQ29udHJvbGxlckltcGw6OkRvV29yayc7Y29uc3QgU0NIRURVTEFCTEVfVEFTS19USVRMRV9BTFQyPSdUaHJlYWRDb250cm9sbGVySW1wbDo6UnVuVGFzayc7Y29uc3QgTEhFcnJvcj1yZXF1aXJlKCcuLi9lcnJvcnMnKTtjbGFzcyBUcmFjZVByb2Nlc3NvcntzdGF0aWMgX3Jpc2tQZXJjZW50aWxlcyhkdXJhdGlvbnMsdG90YWxUaW1lLHBlcmNlbnRpbGVzLGNsaXBwZWRMZW5ndGg9MCl7bGV0IGJ1c3lUaW1lPTA7Zm9yKGxldCBpPTA7aTxkdXJhdGlvbnMubGVuZ3RoO2krKyl7YnVzeVRpbWUrPWR1cmF0aW9uc1tpXTt9CmJ1c3lUaW1lLT1jbGlwcGVkTGVuZ3RoO2xldCBjb21wbGV0ZWRUaW1lPXRvdGFsVGltZS1idXN5VGltZTtsZXQgZHVyYXRpb249MDtsZXQgY2RmVGltZT1jb21wbGV0ZWRUaW1lO2NvbnN0IHJlc3VsdHM9W107bGV0IGR1cmF0aW9uSW5kZXg9LTE7bGV0IHJlbWFpbmluZ0NvdW50PWR1cmF0aW9ucy5sZW5ndGgrMTtpZihjbGlwcGVkTGVuZ3RoPjApe3JlbWFpbmluZ0NvdW50LS07fQpmb3IoY29uc3QgcGVyY2VudGlsZSBvZiBwZXJjZW50aWxlcyl7Y29uc3QgcGVyY2VudGlsZVRpbWU9cGVyY2VudGlsZSp0b3RhbFRpbWU7d2hpbGUoY2RmVGltZTxwZXJjZW50aWxlVGltZSYmZHVyYXRpb25JbmRleDxkdXJhdGlvbnMubGVuZ3RoLTEpe2NvbXBsZXRlZFRpbWUrPWR1cmF0aW9uO3JlbWFpbmluZ0NvdW50LT1kdXJhdGlvbjwwPy0xOjE7aWYoY2xpcHBlZExlbmd0aD4wJiZjbGlwcGVkTGVuZ3RoPGR1cmF0aW9uc1tkdXJhdGlvbkluZGV4KzFdKXtkdXJhdGlvbj0tY2xpcHBlZExlbmd0aDtjbGlwcGVkTGVuZ3RoPTA7fWVsc2V7ZHVyYXRpb25JbmRleCsrO2R1cmF0aW9uPWR1cmF0aW9uc1tkdXJhdGlvbkluZGV4XTt9CmNkZlRpbWU9Y29tcGxldGVkVGltZStNYXRoLmFicyhkdXJhdGlvbikqcmVtYWluaW5nQ291bnQ7fQpyZXN1bHRzLnB1c2goe3BlcmNlbnRpbGUsdGltZTpNYXRoLm1heCgwLChwZXJjZW50aWxlVGltZS1jb21wbGV0ZWRUaW1lKS9yZW1haW5pbmdDb3VudCkrCkJBU0VfUkVTUE9OU0VfTEFURU5DWX0pO30KcmV0dXJuIHJlc3VsdHM7fQpzdGF0aWMgZ2V0Umlza1RvUmVzcG9uc2l2ZW5lc3MoZXZlbnRzLHN0YXJ0VGltZSxlbmRUaW1lLHBlcmNlbnRpbGVzPVswLjUsMC43NSwwLjksMC45OSwxXSkKe2NvbnN0IHRvdGFsVGltZT1lbmRUaW1lLXN0YXJ0VGltZTtwZXJjZW50aWxlcy5zb3J0KChhLGIpPT5hLWIpO2NvbnN0IHJldD1UcmFjZVByb2Nlc3Nvci5nZXRNYWluVGhyZWFkVG9wTGV2ZWxFdmVudER1cmF0aW9ucyhldmVudHMsc3RhcnRUaW1lLGVuZFRpbWUpO3JldHVybiBUcmFjZVByb2Nlc3Nvci5fcmlza1BlcmNlbnRpbGVzKHJldC5kdXJhdGlvbnMsdG90YWxUaW1lLHBlcmNlbnRpbGVzLHJldC5jbGlwcGVkTGVuZ3RoKTt9CnN0YXRpYyBnZXRNYWluVGhyZWFkVG9wTGV2ZWxFdmVudER1cmF0aW9ucyh0b3BMZXZlbEV2ZW50cyxzdGFydFRpbWU9MCxlbmRUaW1lPUluZmluaXR5KXtjb25zdCBkdXJhdGlvbnM9W107bGV0IGNsaXBwZWRMZW5ndGg9MDtmb3IoY29uc3QgZXZlbnQgb2YgdG9wTGV2ZWxFdmVudHMpe2lmKGV2ZW50LmVuZDxzdGFydFRpbWV8fGV2ZW50LnN0YXJ0PmVuZFRpbWUpe2NvbnRpbnVlO30KbGV0IGR1cmF0aW9uPWV2ZW50LmR1cmF0aW9uO2xldCBldmVudFN0YXJ0PWV2ZW50LnN0YXJ0O2lmKGV2ZW50U3RhcnQ8c3RhcnRUaW1lKXtldmVudFN0YXJ0PXN0YXJ0VGltZTtkdXJhdGlvbj1ldmVudC5lbmQtc3RhcnRUaW1lO30KaWYoZXZlbnQuZW5kPmVuZFRpbWUpe2NsaXBwZWRMZW5ndGg9ZHVyYXRpb24tKGVuZFRpbWUtZXZlbnRTdGFydCk7fQpkdXJhdGlvbnMucHVzaChkdXJhdGlvbik7fQpkdXJhdGlvbnMuc29ydCgoYSxiKT0+YS1iKTtyZXR1cm57ZHVyYXRpb25zLGNsaXBwZWRMZW5ndGh9O30Kc3RhdGljIGdldE1haW5UaHJlYWRUb3BMZXZlbEV2ZW50cyh0YWJUcmFjZSxzdGFydFRpbWU9MCxlbmRUaW1lPUluZmluaXR5KXtjb25zdCB0b3BMZXZlbEV2ZW50cz1bXTtmb3IoY29uc3QgZXZlbnQgb2YgdGFiVHJhY2UubWFpblRocmVhZEV2ZW50cyl7aWYoIVRyYWNlUHJvY2Vzc29yLmlzU2NoZWR1bGVhYmxlVGFzayhldmVudCl8fCFldmVudC5kdXIpY29udGludWU7Y29uc3Qgc3RhcnQ9KGV2ZW50LnRzLXRhYlRyYWNlLm5hdmlnYXRpb25TdGFydEV2dC50cykvMTAwMDtjb25zdCBlbmQ9KGV2ZW50LnRzK2V2ZW50LmR1ci10YWJUcmFjZS5uYXZpZ2F0aW9uU3RhcnRFdnQudHMpLzEwMDA7aWYoc3RhcnQ+ZW5kVGltZXx8ZW5kPHN0YXJ0VGltZSljb250aW51ZTt0b3BMZXZlbEV2ZW50cy5wdXNoKHtzdGFydCxlbmQsZHVyYXRpb246ZXZlbnQuZHVyLzEwMDB9KTt9CmlmKCF0b3BMZXZlbEV2ZW50cy5sZW5ndGgpe3Rocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgYW55IHRvcCBsZXZlbCBldmVudHMnKTt9CnJldHVybiB0b3BMZXZlbEV2ZW50czt9CnN0YXRpYyBmaW5kVHJhY2luZ1N0YXJ0ZWRFdnQoZXZlbnRzKXtsZXQgc3RhcnRlZEluUGFnZUV2dDtjb25zdCBzdGFydGVkSW5Ccm93c2VyRXZ0PWV2ZW50cy5maW5kKGU9PmUubmFtZT09PSdUcmFjaW5nU3RhcnRlZEluQnJvd3NlcicpO2lmKHN0YXJ0ZWRJbkJyb3dzZXJFdnQmJnN0YXJ0ZWRJbkJyb3dzZXJFdnQuYXJncy5kYXRhJiZzdGFydGVkSW5Ccm93c2VyRXZ0LmFyZ3MuZGF0YS5mcmFtZXMpe2NvbnN0IG1haW5GcmFtZT1zdGFydGVkSW5Ccm93c2VyRXZ0LmFyZ3MuZGF0YS5mcmFtZXMuZmluZChmcmFtZT0+IWZyYW1lLnBhcmVudCk7Y29uc3QgcGlkPW1haW5GcmFtZSYmbWFpbkZyYW1lLnByb2Nlc3NJZDtjb25zdCB0aHJlYWROYW1lRXZ0PWV2ZW50cy5maW5kKGU9PmUucGlkPT09cGlkJiZlLnBoPT09J00nJiZlLmNhdD09PSdfX21ldGFkYXRhJyYmZS5uYW1lPT09J3RocmVhZF9uYW1lJyYmZS5hcmdzLm5hbWU9PT0nQ3JSZW5kZXJlck1haW4nKTtzdGFydGVkSW5QYWdlRXZ0PW1haW5GcmFtZSYmdGhyZWFkTmFtZUV2dD9PYmplY3QuYXNzaWduKHt9LHN0YXJ0ZWRJbkJyb3dzZXJFdnQse3BpZCx0aWQ6dGhyZWFkTmFtZUV2dC50aWQsbmFtZTonVHJhY2luZ1N0YXJ0ZWRJblBhZ2UnLGFyZ3M6e2RhdGE6e3BhZ2U6bWFpbkZyYW1lLmZyYW1lfX19KTp1bmRlZmluZWQ7fQppZighc3RhcnRlZEluUGFnZUV2dCl7c3RhcnRlZEluUGFnZUV2dD1ldmVudHMuZmluZChlPT5lLm5hbWU9PT0nVHJhY2luZ1N0YXJ0ZWRJblBhZ2UnKTt9CmlmKCFzdGFydGVkSW5QYWdlRXZ0KXRocm93IG5ldyBMSEVycm9yKExIRXJyb3IuZXJyb3JzLk5PX1RSQUNJTkdfU1RBUlRFRCk7Y29uc3QgZnJhbWVJZD1zdGFydGVkSW5QYWdlRXZ0LmFyZ3MuZGF0YS5wYWdlO3JldHVybntzdGFydGVkSW5QYWdlRXZ0LGZyYW1lSWR9O30Kc3RhdGljIGlzU2NoZWR1bGVhYmxlVGFzayhldnQpe3JldHVybiBldnQubmFtZT09PVNDSEVEVUxBQkxFX1RBU0tfVElUTEV8fGV2dC5uYW1lPT09U0NIRURVTEFCTEVfVEFTS19USVRMRV9BTFQxfHxldnQubmFtZT09PVNDSEVEVUxBQkxFX1RBU0tfVElUTEVfQUxUMjt9fQptb2R1bGUuZXhwb3J0cz1UcmFjZVByb2Nlc3Nvcjt9LHsiLi4vZXJyb3JzIjozM31dLDQ3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXsndXNlIHN0cmljdCc7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtpZihnbG9iYWwuV2ViSW5zcGVjdG9yKXtyZXR1cm4gZ2xvYmFsLldlYkluc3BlY3Rvcjt9CmlmKGdsb2JhbC5zZWxmIT09Z2xvYmFsKXtnbG9iYWwuc2VsZj1nbG9iYWw7fQppZih0eXBlb2YgZ2xvYmFsLndpbmRvdz09PSd1bmRlZmluZWQnKXtnbG9iYWwud2luZG93PWdsb2JhbDt9Cmdsb2JhbC5Ob2RlPXtFTEVNRU5UX05PREU6MSxURVhUX05PREU6M307Z2xvYmFsLkNTU0FnZW50PXt9O2dsb2JhbC5DU1NBZ2VudC5TdHlsZVNoZWV0T3JpZ2luPXtJTkpFQ1RFRDonaW5qZWN0ZWQnLFVTRVJfQUdFTlQ6J3VzZXItYWdlbnQnLElOU1BFQ1RPUjonaW5zcGVjdG9yJyxSRUdVTEFSOidyZWd1bGFyJ307Z2xvYmFsLkNTUz17fTtnbG9iYWwuQ1NTLnN1cHBvcnRzPSgpPT50cnVlO2NvbnN0IF9zZXRJbW1lZGlhdGU9Z2xvYmFsLnNldEltbWVkaWF0ZTtnbG9iYWwuUnVudGltZT1nbG9iYWwuUnVudGltZXx8e307Z2xvYmFsLlJ1bnRpbWUuZXhwZXJpbWVudHM9Z2xvYmFsLlJ1bnRpbWUuZXhwZXJpbWVudHN8fHt9O2dsb2JhbC5SdW50aW1lLmV4cGVyaW1lbnRzLmlzRW5hYmxlZD1fPT5mYWxzZTtjb25zdCBfcXVlcnlQYXJhbT1nbG9iYWwuUnVudGltZS5xdWVyeVBhcmFtO2dsb2JhbC5SdW50aW1lLnF1ZXJ5UGFyYW09ZnVuY3Rpb24oYXJnKXtzd2l0Y2goYXJnKXtjYXNlJ3JlbW90ZUZyb250ZW5kJzpyZXR1cm4gZmFsc2U7Y2FzZSd3cyc6cmV0dXJuIGZhbHNlO2RlZmF1bHQ6e2lmKF9xdWVyeVBhcmFtKXtyZXR1cm4gX3F1ZXJ5UGFyYW0uY2FsbChnbG9iYWwuUnVudGltZSxhcmcpO30KdGhyb3cgbmV3IEVycm9yKCdNb2NrIHF1ZXJ5UGFyYW0gY2FzZSBub3QgaW1wbGVtZW50ZWQuJyk7fX19O2dsb2JhbC5UcmVlRWxlbWVudD17fTtnbG9iYWwuV29ya2VyUnVudGltZT17fTtnbG9iYWwuUHJvdG9jb2w9e0FnZW50cygpe319O2dsb2JhbC5XZWJJbnNwZWN0b3I9e307Y29uc3QgV2ViSW5zcGVjdG9yPWdsb2JhbC5XZWJJbnNwZWN0b3I7V2ViSW5zcGVjdG9yLl9tb2R1bGVTZXR0aW5ncz17Y2FjaGVEaXNhYmxlZDp7YWRkQ2hhbmdlTGlzdGVuZXIoKXt9LGdldCgpe3JldHVybiBmYWxzZTt9fSxtb25pdG9yaW5nWEhSRW5hYmxlZDp7YWRkQ2hhbmdlTGlzdGVuZXIoKXt9LGdldCgpe3JldHVybiBmYWxzZTt9fSxzaG93TmF0aXZlRnVuY3Rpb25zSW5KU1Byb2ZpbGU6e2FkZENoYW5nZUxpc3RlbmVyKCl7fSxnZXQoKXtyZXR1cm4gdHJ1ZTt9fX07V2ViSW5zcGVjdG9yLm1vZHVsZVNldHRpbmc9ZnVuY3Rpb24oc2V0dGluZ05hbWUpe3JldHVybiB0aGlzLl9tb2R1bGVTZXR0aW5nc1tzZXR0aW5nTmFtZV07fTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9PYmplY3QuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9QYXJzZWRVUkwuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9VSVN0cmluZy5qcycpO3JlcXVpcmUoJ2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvY29tbW9uL1NlZ21lbnRlZFJhbmdlLmpzJyk7cmVxdWlyZSgnY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9wbGF0Zm9ybS91dGlsaXRpZXMuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9UYXJnZXQuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9UYXJnZXRNYW5hZ2VyLmpzJyk7V2ViSW5zcGVjdG9yLnRhcmdldE1hbmFnZXI9e29ic2VydmVUYXJnZXRzKCl7fSxhZGRFdmVudExpc3RlbmVyKCl7fX07V2ViSW5zcGVjdG9yLnNldHRpbmdzPXtjcmVhdGVTZXR0aW5nKCl7cmV0dXJue2dldCgpe3JldHVybiBmYWxzZTt9LGFkZENoYW5nZUxpc3RlbmVyKCl7fX07fX07V2ViSW5zcGVjdG9yLmNvbnNvbGU9e2Vycm9yKCl7fX07V2ViSW5zcGVjdG9yLlZCb3g9ZnVuY3Rpb24oKXt9O1dlYkluc3BlY3Rvci5IQm94PWZ1bmN0aW9uKCl7fTtXZWJJbnNwZWN0b3IuVmlld3BvcnREYXRhR3JpZD1mdW5jdGlvbigpe307V2ViSW5zcGVjdG9yLlZpZXdwb3J0RGF0YUdyaWROb2RlPWZ1bmN0aW9uKCl7fTtnbG9iYWwuV29ya2VyUnVudGltZS5Xb3JrZXI9ZnVuY3Rpb24oKXt9O3JlcXVpcmUoJ2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvY29tbW9uL1RleHRVdGlscy5qcycpO3JlcXVpcmUoJ2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvdGltZWxpbmUvVGltZWxpbmVMb2FkZXIuanMnKTtXZWJJbnNwZWN0b3IuQ29uc29sZU1lc3NhZ2U9ZnVuY3Rpb24oKXt9O1dlYkluc3BlY3Rvci5Db25zb2xlTWVzc2FnZS5NZXNzYWdlU291cmNlPXtOZXR3b3JrOiduZXR3b3JrJ307V2ViSW5zcGVjdG9yLkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbD17TG9nOidsb2cnfTtXZWJJbnNwZWN0b3IuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZVR5cGU9e0xvZzonbG9nJ307cmVxdWlyZSgnY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9jb21tb24vQ29sb3IuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9UZXh0UmFuZ2UuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NNYXRjaGVkU3R5bGVzLmpzJyk7cmVxdWlyZSgnY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9zZGsvQ1NTTWVkaWEuanMnKTtyZXF1aXJlKCdjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NNZXRhZGF0YS5qcycpO3JlcXVpcmUoJ2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvc2RrL0NTU1Byb3BlcnR5LmpzJyk7cmVxdWlyZSgnY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9zZGsvQ1NTUnVsZS5qcycpO3JlcXVpcmUoJ2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvc2RrL0NTU1N0eWxlRGVjbGFyYXRpb24uanMnKTtXZWJJbnNwZWN0b3IuQ1NTTWV0YWRhdGEuX2dlbmVyYXRlZFByb3BlcnRpZXM9W3tuYW1lOidmb250LXNpemUnLGluaGVyaXRlZDp0cnVlfV07Z2xvYmFsLnNldEltbWVkaWF0ZT1fc2V0SW1tZWRpYXRlO3JldHVybiBXZWJJbnNwZWN0b3I7fSgpO30pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCI/c2VsZjp0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCI/d2luZG93Ont9KTt9LHsiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9jb21tb24vQ29sb3IuanMiOjk5LCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9PYmplY3QuanMiOjEwMCwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9jb21tb24vUGFyc2VkVVJMLmpzIjoxMDEsImNocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvY29tbW9uL1NlZ21lbnRlZFJhbmdlLmpzIjoxMDIsImNocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvY29tbW9uL1RleHRSYW5nZS5qcyI6MTAzLCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL2NvbW1vbi9UZXh0VXRpbHMuanMiOjEwNCwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9jb21tb24vVUlTdHJpbmcuanMiOjEwNSwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9wbGF0Zm9ybS91dGlsaXRpZXMuanMiOjEwNiwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9zZGsvQ1NTTWF0Y2hlZFN0eWxlcy5qcyI6MTA3LCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NNZWRpYS5qcyI6MTA4LCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NNZXRhZGF0YS5qcyI6MTA5LCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NQcm9wZXJ0eS5qcyI6MTEwLCJjaHJvbWUtZGV2dG9vbHMtZnJvbnRlbmQvZnJvbnRfZW5kL3Nkay9DU1NSdWxlLmpzIjoxMTEsImNocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvc2RrL0NTU1N0eWxlRGVjbGFyYXRpb24uanMiOjExMiwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC9zZGsvVGFyZ2V0LmpzIjoxMTMsImNocm9tZS1kZXZ0b29scy1mcm9udGVuZC9mcm9udF9lbmQvc2RrL1RhcmdldE1hbmFnZXIuanMiOjExNCwiY2hyb21lLWRldnRvb2xzLWZyb250ZW5kL2Zyb250X2VuZC90aW1lbGluZS9UaW1lbGluZUxvYWRlci5qcyI6MTE1fV0sNDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBFTExJUFNJUz0nXHUyMDI2Jztjb25zdCBOQlNQPSdceGEwJztjb25zdCBQQVNTX1RIUkVTSE9MRD0wLjc1O2NvbnN0IFJBVElOR1M9e1BBU1M6e2xhYmVsOidwYXNzJyxtaW5TY29yZTpQQVNTX1RIUkVTSE9MRH0sQVZFUkFHRTp7bGFiZWw6J2F2ZXJhZ2UnLG1pblNjb3JlOjAuNDV9LEZBSUw6e2xhYmVsOidmYWlsJ30sRVJST1I6e2xhYmVsOidlcnJvcid9fTtjbGFzcyBVdGlse3N0YXRpYyBnZXQgUEFTU19USFJFU0hPTEQoKXtyZXR1cm4gUEFTU19USFJFU0hPTEQ7fQpzdGF0aWMgZ2V0IE1TX0RJU1BMQVlfVkFMVUUoKXtyZXR1cm5gJTEwZCR7TkJTUH1tc2A7fQpzdGF0aWMgZm9ybWF0RGlzcGxheVZhbHVlKGRpc3BsYXlWYWx1ZSl7aWYodHlwZW9mIGRpc3BsYXlWYWx1ZT09PSdzdHJpbmcnKXJldHVybiBkaXNwbGF5VmFsdWU7aWYoIWRpc3BsYXlWYWx1ZSlyZXR1cm4nJztjb25zdCByZXBsYWNlbWVudFJlZ2V4PS8lKFswLTldKihcLlswLTldKyk/ZHxzKS87Y29uc3QgdGVtcGxhdGU9ZGlzcGxheVZhbHVlWzBdO2lmKHR5cGVvZiB0ZW1wbGF0ZSE9PSdzdHJpbmcnKXtyZXR1cm4nVU5LTk9XTic7fQpsZXQgb3V0cHV0PXRlbXBsYXRlO2Zvcihjb25zdCByZXBsYWNlbWVudCBvZiBkaXNwbGF5VmFsdWUuc2xpY2UoMSkpe2lmKCFyZXBsYWNlbWVudFJlZ2V4LnRlc3Qob3V0cHV0KSl7Y29uc29sZS53YXJuKCdUb28gbWFueSByZXBsYWNlbWVudHMgZ2l2ZW4nKTticmVhazt9Cm91dHB1dD1vdXRwdXQucmVwbGFjZShyZXBsYWNlbWVudFJlZ2V4LG1hdGNoPT57Y29uc3QgZ3JhbnVsYXJpdHk9TnVtYmVyKG1hdGNoLm1hdGNoKC9bMC05Ll0rLykpfHwxO3JldHVybiBtYXRjaD09PSclcyc/cmVwbGFjZW1lbnQudG9Mb2NhbGVTdHJpbmcoKTooTWF0aC5yb3VuZChOdW1iZXIocmVwbGFjZW1lbnQpL2dyYW51bGFyaXR5KSpncmFudWxhcml0eSkudG9Mb2NhbGVTdHJpbmcoKTt9KTt9CmlmKHJlcGxhY2VtZW50UmVnZXgudGVzdChvdXRwdXQpKXtjb25zb2xlLndhcm4oJ05vdCBlbm91Z2ggcmVwbGFjZW1lbnRzIGdpdmVuJyk7fQpyZXR1cm4gb3V0cHV0O30Kc3RhdGljIHNob3dBc1Bhc3NlZChhdWRpdCl7c3dpdGNoKGF1ZGl0LnNjb3JlRGlzcGxheU1vZGUpe2Nhc2UnbWFudWFsJzpjYXNlJ25vdC1hcHBsaWNhYmxlJzpyZXR1cm4gdHJ1ZTtjYXNlJ2Vycm9yJzpjYXNlJ2luZm9ybWF0aXZlJzpyZXR1cm4gZmFsc2U7Y2FzZSdudW1lcmljJzpjYXNlJ2JpbmFyeSc6ZGVmYXVsdDpyZXR1cm4gTnVtYmVyKGF1ZGl0LnNjb3JlKT09PTE7fX0Kc3RhdGljIGNhbGN1bGF0ZVJhdGluZyhzY29yZSxzY29yZURpc3BsYXlNb2RlKXtpZihzY29yZURpc3BsYXlNb2RlPT09J21hbnVhbCd8fHNjb3JlRGlzcGxheU1vZGU9PT0nbm90LWFwcGxpY2FibGUnKXtyZXR1cm4gUkFUSU5HUy5QQVNTLmxhYmVsO31lbHNlIGlmKHNjb3JlRGlzcGxheU1vZGU9PT0nZXJyb3InKXtyZXR1cm4gUkFUSU5HUy5FUlJPUi5sYWJlbDt9ZWxzZSBpZihzY29yZT09PW51bGwpe3JldHVybiBSQVRJTkdTLkZBSUwubGFiZWw7fQpsZXQgcmF0aW5nPVJBVElOR1MuRkFJTC5sYWJlbDtpZihzY29yZT49UkFUSU5HUy5QQVNTLm1pblNjb3JlKXtyYXRpbmc9UkFUSU5HUy5QQVNTLmxhYmVsO31lbHNlIGlmKHNjb3JlPj1SQVRJTkdTLkFWRVJBR0UubWluU2NvcmUpe3JhdGluZz1SQVRJTkdTLkFWRVJBR0UubGFiZWw7fQpyZXR1cm4gcmF0aW5nO30Kc3RhdGljIGZvcm1hdE51bWJlcihudW1iZXIsZ3JhbnVsYXJpdHk9MC4xKXtjb25zdCBjb2Fyc2VWYWx1ZT1NYXRoLnJvdW5kKG51bWJlci9ncmFudWxhcml0eSkqZ3JhbnVsYXJpdHk7cmV0dXJuIGNvYXJzZVZhbHVlLnRvTG9jYWxlU3RyaW5nKCk7fQpzdGF0aWMgZm9ybWF0Qnl0ZXNUb0tCKHNpemUsZ3JhbnVsYXJpdHk9MC4xKXtjb25zdCBrYnM9KE1hdGgucm91bmQoc2l6ZS8xMDI0L2dyYW51bGFyaXR5KSpncmFudWxhcml0eSkudG9Mb2NhbGVTdHJpbmcoKTtyZXR1cm5gJHtrYnN9JHtOQlNQfUtCYDt9CnN0YXRpYyBmb3JtYXRNaWxsaXNlY29uZHMobXMsZ3JhbnVsYXJpdHk9MTApe2NvbnN0IGNvYXJzZVRpbWU9TWF0aC5yb3VuZChtcy9ncmFudWxhcml0eSkqZ3JhbnVsYXJpdHk7cmV0dXJuYCR7Y29hcnNlVGltZS50b0xvY2FsZVN0cmluZygpfSR7TkJTUH1tc2A7fQpzdGF0aWMgZm9ybWF0U2Vjb25kcyhtcyxncmFudWxhcml0eT0wLjEpe2NvbnN0IGNvYXJzZVRpbWU9TWF0aC5yb3VuZChtcy8xMDAwL2dyYW51bGFyaXR5KSpncmFudWxhcml0eTtyZXR1cm5gJHtjb2Fyc2VUaW1lLnRvTG9jYWxlU3RyaW5nKCl9JHtOQlNQfXNgO30Kc3RhdGljIGZvcm1hdERhdGVUaW1lKGRhdGUpe2NvbnN0IG9wdGlvbnM9e21vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJyx5ZWFyOidudW1lcmljJyxob3VyOidudW1lcmljJyxtaW51dGU6J251bWVyaWMnLHRpbWVab25lTmFtZTonc2hvcnQnfTtsZXQgZm9ybWF0dGVyPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsb3B0aW9ucyk7Y29uc3QgdHo9Zm9ybWF0dGVyLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO2lmKCF0enx8dHoudG9Mb3dlckNhc2UoKT09PSdldGMvdW5rbm93bicpe29wdGlvbnMudGltZVpvbmU9J1VUQyc7Zm9ybWF0dGVyPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsb3B0aW9ucyk7fQpyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZShkYXRlKSk7fQpzdGF0aWMgZm9ybWF0RHVyYXRpb24odGltZUluTWlsbGlzZWNvbmRzKXtsZXQgdGltZUluU2Vjb25kcz10aW1lSW5NaWxsaXNlY29uZHMvMTAwMDtpZihNYXRoLnJvdW5kKHRpbWVJblNlY29uZHMpPT09MCl7cmV0dXJuJ05vbmUnO30KY29uc3QgcGFydHM9W107Y29uc3QgdW5pdExhYmVscz17ZDo2MCo2MCoyNCxoOjYwKjYwLG06NjAsczoxfTtPYmplY3Qua2V5cyh1bml0TGFiZWxzKS5mb3JFYWNoKGxhYmVsPT57Y29uc3QgdW5pdD11bml0TGFiZWxzW2xhYmVsXTtjb25zdCBudW1iZXJPZlVuaXRzPU1hdGguZmxvb3IodGltZUluU2Vjb25kcy91bml0KTtpZihudW1iZXJPZlVuaXRzPjApe3RpbWVJblNlY29uZHMtPW51bWJlck9mVW5pdHMqdW5pdDtwYXJ0cy5wdXNoKGAke251bWJlck9mVW5pdHN9XHhhMCR7bGFiZWx9YCk7fX0pO3JldHVybiBwYXJ0cy5qb2luKCcgJyk7fQpzdGF0aWMgZ2V0VVJMRGlzcGxheU5hbWUocGFyc2VkVXJsLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e251bVBhdGhQYXJ0czp1bmRlZmluZWQscHJlc2VydmVRdWVyeTp1bmRlZmluZWQscHJlc2VydmVIb3N0OnVuZGVmaW5lZH07Y29uc3QgbnVtUGF0aFBhcnRzPW9wdGlvbnMubnVtUGF0aFBhcnRzIT09dW5kZWZpbmVkP29wdGlvbnMubnVtUGF0aFBhcnRzOjI7Y29uc3QgcHJlc2VydmVRdWVyeT1vcHRpb25zLnByZXNlcnZlUXVlcnkhPT11bmRlZmluZWQ/b3B0aW9ucy5wcmVzZXJ2ZVF1ZXJ5OnRydWU7Y29uc3QgcHJlc2VydmVIb3N0PW9wdGlvbnMucHJlc2VydmVIb3N0fHxmYWxzZTtsZXQgbmFtZTtpZihwYXJzZWRVcmwucHJvdG9jb2w9PT0nYWJvdXQ6J3x8cGFyc2VkVXJsLnByb3RvY29sPT09J2RhdGE6Jyl7bmFtZT1wYXJzZWRVcmwuaHJlZjt9ZWxzZXtuYW1lPXBhcnNlZFVybC5wYXRobmFtZTtjb25zdCBwYXJ0cz1uYW1lLnNwbGl0KCcvJykuZmlsdGVyKHBhcnQ9PnBhcnQubGVuZ3RoKTtpZihudW1QYXRoUGFydHMmJnBhcnRzLmxlbmd0aD5udW1QYXRoUGFydHMpe25hbWU9RUxMSVBTSVMrcGFydHMuc2xpY2UoLTEqbnVtUGF0aFBhcnRzKS5qb2luKCcvJyk7fQppZihwcmVzZXJ2ZUhvc3Qpe25hbWU9YCR7cGFyc2VkVXJsLmhvc3R9LyR7bmFtZS5yZXBsYWNlKC9eXC8vLCcnKX1gO30KaWYocHJlc2VydmVRdWVyeSl7bmFtZT1gJHtuYW1lfSR7cGFyc2VkVXJsLnNlYXJjaH1gO319CmNvbnN0IE1BWF9MRU5HVEg9NjQ7bmFtZT1uYW1lLnJlcGxhY2UoLyhbYS1mMC05XXs3fSlbYS1mMC05XXsxM31bYS1mMC05XSovZyxgJDEke0VMTElQU0lTfWApO25hbWU9bmFtZS5yZXBsYWNlKC8oW2EtekEtWjAtOS1fXXs5fSkoPz0uKlthLXpdKSg/PS4qW0EtWl0pKD89LipbMC05XSlbYS16QS1aMC05LV9dezEwLH0vZyxgJDEke0VMTElQU0lTfWApO25hbWU9bmFtZS5yZXBsYWNlKC8oXGR7M30pXGR7Nix9L2csYCQxJHtFTExJUFNJU31gKTtuYW1lPW5hbWUucmVwbGFjZSgvXHUyMDI2Ky9nLEVMTElQU0lTKTtpZihuYW1lLmxlbmd0aD5NQVhfTEVOR1RIJiZuYW1lLmluY2x1ZGVzKCc/Jykpe25hbWU9bmFtZS5yZXBsYWNlKC9cPyhbXj1dKikoPSk/LiovLGA/JDEkMiR7RUxMSVBTSVN9YCk7aWYobmFtZS5sZW5ndGg+TUFYX0xFTkdUSCl7bmFtZT1uYW1lLnJlcGxhY2UoL1w/LiovLGA/JHtFTExJUFNJU31gKTt9fQppZihuYW1lLmxlbmd0aD5NQVhfTEVOR1RIKXtjb25zdCBkb3RJbmRleD1uYW1lLmxhc3RJbmRleE9mKCcuJyk7aWYoZG90SW5kZXg+PTApe25hbWU9bmFtZS5zbGljZSgwLE1BWF9MRU5HVEgtMS0obmFtZS5sZW5ndGgtZG90SW5kZXgpKStgJHtFTExJUFNJU30ke25hbWUuc2xpY2UoZG90SW5kZXgpfWA7fWVsc2V7bmFtZT1uYW1lLnNsaWNlKDAsTUFYX0xFTkdUSC0xKStFTExJUFNJUzt9fQpyZXR1cm4gbmFtZTt9CnN0YXRpYyBwYXJzZVVSTCh1cmwpe2NvbnN0IHBhcnNlZFVybD1uZXcgVVJMKHVybCk7cmV0dXJue2ZpbGU6VXRpbC5nZXRVUkxEaXNwbGF5TmFtZShwYXJzZWRVcmwpLGhvc3RuYW1lOnBhcnNlZFVybC5ob3N0bmFtZSxvcmlnaW46cGFyc2VkVXJsLm9yaWdpbn07fQpzdGF0aWMgY2hhaW5EdXJhdGlvbihzdGFydFRpbWUsZW5kVGltZSl7cmV0dXJuIFV0aWwuZm9ybWF0TnVtYmVyKChlbmRUaW1lLXN0YXJ0VGltZSkqMTAwMCk7fQpzdGF0aWMgZ2V0RW52aXJvbm1lbnREaXNwbGF5VmFsdWVzKHNldHRpbmdzKXtjb25zdCBlbXVsYXRpb25EZXNjPVV0aWwuZ2V0RW11bGF0aW9uRGVzY3JpcHRpb25zKHNldHRpbmdzKTtyZXR1cm5be25hbWU6J0RldmljZScsZGVzY3JpcHRpb246ZW11bGF0aW9uRGVzYy5kZXZpY2VFbXVsYXRpb259LHtuYW1lOidOZXR3b3JrIHRocm90dGxpbmcnLGRlc2NyaXB0aW9uOmVtdWxhdGlvbkRlc2MubmV0d29ya1Rocm90dGxpbmd9LHtuYW1lOidDUFUgdGhyb3R0bGluZycsZGVzY3JpcHRpb246ZW11bGF0aW9uRGVzYy5jcHVUaHJvdHRsaW5nfV07fQpzdGF0aWMgZ2V0RW11bGF0aW9uRGVzY3JpcHRpb25zKHNldHRpbmdzKXtsZXQgY3B1VGhyb3R0bGluZztsZXQgbmV0d29ya1Rocm90dGxpbmc7bGV0IHN1bW1hcnk7Y29uc3QgdGhyb3R0bGluZz1zZXR0aW5ncy50aHJvdHRsaW5nO3N3aXRjaChzZXR0aW5ncy50aHJvdHRsaW5nTWV0aG9kKXtjYXNlJ3Byb3ZpZGVkJzpjcHVUaHJvdHRsaW5nPSdQcm92aWRlZCBieSBlbnZpcm9ubWVudCc7bmV0d29ya1Rocm90dGxpbmc9J1Byb3ZpZGVkIGJ5IGVudmlyb25tZW50JztzdW1tYXJ5PSdObyB0aHJvdHRsaW5nIGFwcGxpZWQnO2JyZWFrO2Nhc2UnZGV2dG9vbHMnOntjb25zdHtjcHVTbG93ZG93bk11bHRpcGxpZXIscmVxdWVzdExhdGVuY3lNc309dGhyb3R0bGluZztjcHVUaHJvdHRsaW5nPWAke1V0aWwuZm9ybWF0TnVtYmVyKGNwdVNsb3dkb3duTXVsdGlwbGllcil9eCBzbG93ZG93biAoRGV2VG9vbHMpYDtuZXR3b3JrVGhyb3R0bGluZz1gJHtVdGlsLmZvcm1hdE51bWJlcihyZXF1ZXN0TGF0ZW5jeU1zKX0ke05CU1B9bXMgSFRUUCBSVFQsIGArYCR7VXRpbC5mb3JtYXROdW1iZXIodGhyb3R0bGluZy5kb3dubG9hZFRocm91Z2hwdXRLYnBzKX0ke05CU1B9S2JwcyBkb3duLCBgK2Ake1V0aWwuZm9ybWF0TnVtYmVyKHRocm90dGxpbmcudXBsb2FkVGhyb3VnaHB1dEticHMpfSR7TkJTUH1LYnBzIHVwIChEZXZUb29scylgO3N1bW1hcnk9J1Rocm90dGxlZCBGYXN0IDNHIG5ldHdvcmsnO2JyZWFrO30KY2FzZSdzaW11bGF0ZSc6e2NvbnN0e2NwdVNsb3dkb3duTXVsdGlwbGllcixydHRNcyx0aHJvdWdocHV0S2Jwc309dGhyb3R0bGluZztjcHVUaHJvdHRsaW5nPWAke1V0aWwuZm9ybWF0TnVtYmVyKGNwdVNsb3dkb3duTXVsdGlwbGllcil9eCBzbG93ZG93biAoU2ltdWxhdGVkKWA7bmV0d29ya1Rocm90dGxpbmc9YCR7VXRpbC5mb3JtYXROdW1iZXIocnR0TXMpfSR7TkJTUH1tcyBUQ1AgUlRULCBgK2Ake1V0aWwuZm9ybWF0TnVtYmVyKHRocm91Z2hwdXRLYnBzKX0ke05CU1B9S2JwcyB0aHJvdWdocHV0IChTaW11bGF0ZWQpYDtzdW1tYXJ5PSdTaW11bGF0ZWQgRmFzdCAzRyBuZXR3b3JrJzticmVhazt9CmRlZmF1bHQ6Y3B1VGhyb3R0bGluZz0nVW5rbm93bic7bmV0d29ya1Rocm90dGxpbmc9J1Vua25vd24nO3N1bW1hcnk9J1Vua25vd24nO30KY29uc3QgZGV2aWNlRW11bGF0aW9uPXNldHRpbmdzLmRpc2FibGVEZXZpY2VFbXVsYXRpb24/J05vIGVtdWxhdGlvbic6J0VtdWxhdGVkIE5leHVzIDVYJztyZXR1cm57ZGV2aWNlRW11bGF0aW9uLGNwdVRocm90dGxpbmcsbmV0d29ya1Rocm90dGxpbmcsc3VtbWFyeTpgJHtkZXZpY2VFbXVsYXRpb259LCAke3N1bW1hcnl9YH07fX0KaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnJiZtb2R1bGUuZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9VXRpbDt9ZWxzZXtzZWxmLlV0aWw9VXRpbDt9fSx7fV0sNDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBodG1sUmVwb3J0QXNzZXRzPXJlcXVpcmUoJy4vaHRtbC9odG1sLXJlcG9ydC1hc3NldHMnKTtjbGFzcyBSZXBvcnRHZW5lcmF0b3J7c3RhdGljIHJlcGxhY2VTdHJpbmdzKHNvdXJjZSxyZXBsYWNlbWVudHMpe2lmKHJlcGxhY2VtZW50cy5sZW5ndGg9PT0wKXtyZXR1cm4gc291cmNlO30KY29uc3QgZmlyc3RSZXBsYWNlbWVudD1yZXBsYWNlbWVudHNbMF07Y29uc3QgbmV4dFJlcGxhY2VtZW50cz1yZXBsYWNlbWVudHMuc2xpY2UoMSk7cmV0dXJuIHNvdXJjZS5zcGxpdChmaXJzdFJlcGxhY2VtZW50LnNlYXJjaCkubWFwKHBhcnQ9PlJlcG9ydEdlbmVyYXRvci5yZXBsYWNlU3RyaW5ncyhwYXJ0LG5leHRSZXBsYWNlbWVudHMpKS5qb2luKGZpcnN0UmVwbGFjZW1lbnQucmVwbGFjZW1lbnQpO30Kc3RhdGljIGdlbmVyYXRlUmVwb3J0SHRtbChsaHIpe2NvbnN0IHNhbml0aXplZEpzb249SlNPTi5zdHJpbmdpZnkobGhyKS5yZXBsYWNlKC88L2csJ1xcdTAwM2MnKS5yZXBsYWNlKC9cdTIwMjgvZywnXFx1MjAyOCcpLnJlcGxhY2UoL1x1MjAyOS9nLCdcXHUyMDI5Jyk7Y29uc3Qgc2FuaXRpemVkSmF2YXNjcmlwdD1odG1sUmVwb3J0QXNzZXRzLlJFUE9SVF9KQVZBU0NSSVBULnJlcGxhY2UoLzxcLy9nLCdcXHUwMDNjLycpO3JldHVybiBSZXBvcnRHZW5lcmF0b3IucmVwbGFjZVN0cmluZ3MoaHRtbFJlcG9ydEFzc2V0cy5SRVBPUlRfVEVNUExBVEUsW3tzZWFyY2g6JyUlTElHSFRIT1VTRV9KU09OJSUnLHJlcGxhY2VtZW50OnNhbml0aXplZEpzb259LHtzZWFyY2g6JyUlTElHSFRIT1VTRV9KQVZBU0NSSVBUJSUnLHJlcGxhY2VtZW50OnNhbml0aXplZEphdmFzY3JpcHR9LHtzZWFyY2g6Jy8qJSVMSUdIVEhPVVNFX0NTUyUlKi8nLHJlcGxhY2VtZW50Omh0bWxSZXBvcnRBc3NldHMuUkVQT1JUX0NTU30se3NlYXJjaDonJSVMSUdIVEhPVVNFX1RFTVBMQVRFUyUlJyxyZXBsYWNlbWVudDpodG1sUmVwb3J0QXNzZXRzLlJFUE9SVF9URU1QTEFURVN9XSk7fQpzdGF0aWMgZ2VuZXJhdGVSZXBvcnRDU1YobGhyKXtjb25zdCBDUkxGPSdcclxuJztjb25zdCBzZXBhcmF0b3I9JywnO2NvbnN0IGVzY2FwZT12YWx1ZT0+YCIke3ZhbHVlLnJlcGxhY2UoLyIvZywnIiInKX0iYDtjb25zdCBoZWFkZXI9WydjYXRlZ29yeScsJ25hbWUnLCd0aXRsZScsJ3R5cGUnLCdzY29yZSddO2NvbnN0IHRhYmxlPU9iamVjdC52YWx1ZXMobGhyLmNhdGVnb3JpZXMpLm1hcChjYXRlZ29yeT0+e3JldHVybiBjYXRlZ29yeS5hdWRpdFJlZnMubWFwKGF1ZGl0UmVmPT57Y29uc3QgYXVkaXQ9bGhyLmF1ZGl0c1thdWRpdFJlZi5pZF07Y29uc3QgbnVtZXJpY1Njb3JlPWF1ZGl0LnNjb3JlPT09bnVsbD8tMTphdWRpdC5zY29yZTtyZXR1cm5bY2F0ZWdvcnkudGl0bGUsYXVkaXQuaWQsYXVkaXQudGl0bGUsYXVkaXQuc2NvcmVEaXNwbGF5TW9kZSxudW1lcmljU2NvcmVdLm1hcCh2YWx1ZT0+dmFsdWUudG9TdHJpbmcoKSkubWFwKGVzY2FwZSk7fSk7fSk7Y29uc3QgZmxhdHRlZFRhYmxlPVtdLmNvbmNhdCguLi50YWJsZSk7cmV0dXJuW2hlYWRlciwuLi5mbGF0dGVkVGFibGVdLm1hcChyb3c9PnJvdy5qb2luKHNlcGFyYXRvcikpLmpvaW4oQ1JMRik7fQpzdGF0aWMgZ2VuZXJhdGVSZXBvcnQobGhyLG91dHB1dE1vZGVzKXtjb25zdCBvdXRwdXRBc0FycmF5PUFycmF5LmlzQXJyYXkob3V0cHV0TW9kZXMpO2lmKHR5cGVvZiBvdXRwdXRNb2Rlcz09PSdzdHJpbmcnKW91dHB1dE1vZGVzPVtvdXRwdXRNb2Rlc107Y29uc3Qgb3V0cHV0PW91dHB1dE1vZGVzLm1hcChvdXRwdXRNb2RlPT57aWYob3V0cHV0TW9kZT09PSdodG1sJyl7cmV0dXJuIFJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZVJlcG9ydEh0bWwobGhyKTt9CmlmKG91dHB1dE1vZGU9PT0nY3N2Jyl7cmV0dXJuIFJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZVJlcG9ydENTVihsaHIpO30KaWYob3V0cHV0TW9kZT09PSdqc29uJyl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGxocixudWxsLDIpO30KdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG91dHB1dCBtb2RlOiAnK291dHB1dE1vZGUpO30pO3JldHVybiBvdXRwdXRBc0FycmF5P291dHB1dDpvdXRwdXRbMF07fX0KbW9kdWxlLmV4cG9ydHM9UmVwb3J0R2VuZXJhdG9yO30seyIuL2h0bWwvaHRtbC1yZXBvcnQtYXNzZXRzIjo1OH1dLDUwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2VzcyxfX2Rpcm5hbWUpeyd1c2Ugc3RyaWN0Jztjb25zdCBpc0RlZXBFcXVhbD1yZXF1aXJlKCdsb2Rhc2guaXNlcXVhbCcpO2NvbnN0IERyaXZlcj1yZXF1aXJlKCcuL2dhdGhlci9kcml2ZXIuanMnKTtjb25zdCBHYXRoZXJSdW5uZXI9cmVxdWlyZSgnLi9nYXRoZXIvZ2F0aGVyLXJ1bm5lcicpO2NvbnN0IFJlcG9ydFNjb3Jpbmc9cmVxdWlyZSgnLi9zY29yaW5nJyk7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdHMvYXVkaXQnKTtjb25zdCBsb2c9cmVxdWlyZSgnbGlnaHRob3VzZS1sb2dnZXInKTtjb25zdCBhc3NldFNhdmVyPXJlcXVpcmUoJy4vbGliL2Fzc2V0LXNhdmVyJyk7Y29uc3QgcGF0aD1yZXF1aXJlKCdwYXRoJyk7Y29uc3QgVVJMPXJlcXVpcmUoJy4vbGliL3VybC1zaGltJyk7Y29uc3QgU2VudHJ5PXJlcXVpcmUoJy4vbGliL3NlbnRyeScpO2NvbnN0IGdlbmVyYXRlUmVwb3J0PXJlcXVpcmUoJy4vcmVwb3J0L3JlcG9ydC1nZW5lcmF0b3InKS5nZW5lcmF0ZVJlcG9ydDtjbGFzcyBSdW5uZXJ7c3RhdGljIGFzeW5jIHJ1bihjb25uZWN0aW9uLG9wdHMpe3RyeXtjb25zdCBzdGFydFRpbWU9RGF0ZS5ub3coKTtjb25zdCBzZXR0aW5ncz1vcHRzLmNvbmZpZy5zZXR0aW5ncztjb25zdCBsaWdodGhvdXNlUnVuV2FybmluZ3M9W107Y29uc3Qgc2VudHJ5Q29udGV4dD1TZW50cnkuZ2V0Q29udGV4dCgpO1NlbnRyeS5jYXB0dXJlQnJlYWRjcnVtYih7bWVzc2FnZTonUnVuIHN0YXJ0ZWQnLGNhdGVnb3J5OidsaWZlY3ljbGUnLGRhdGE6c2VudHJ5Q29udGV4dCYmc2VudHJ5Q29udGV4dC5leHRyYX0pO2xldCBhcnRpZmFjdHM7bGV0IHJlcXVlc3RlZFVybDtpZihzZXR0aW5ncy5hdWRpdE1vZGUmJiFzZXR0aW5ncy5nYXRoZXJNb2RlKXtjb25zdCBwYXRoPVJ1bm5lci5fZ2V0QXJ0aWZhY3RzUGF0aChzZXR0aW5ncyk7YXJ0aWZhY3RzPWF3YWl0IGFzc2V0U2F2ZXIubG9hZEFydGlmYWN0cyhwYXRoKTtyZXF1ZXN0ZWRVcmw9YXJ0aWZhY3RzLlVSTC5yZXF1ZXN0ZWRVcmw7aWYoIXJlcXVlc3RlZFVybCl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcnVuIGF1ZGl0IG1vZGUgb24gZW1wdHkgVVJMJyk7fQppZihvcHRzLnVybCYmb3B0cy51cmwhPT1yZXF1ZXN0ZWRVcmwpe3Rocm93IG5ldyBFcnJvcignQ2Fubm90IHJ1biBhdWRpdCBtb2RlIG9uIGRpZmZlcmVudCBVUkwnKTt9fWVsc2V7aWYodHlwZW9mIG9wdHMudXJsIT09J3N0cmluZyd8fG9wdHMudXJsLmxlbmd0aD09PTApe3Rocm93IG5ldyBFcnJvcihgWW91IG11c3QgcHJvdmlkZSBhIHVybCB0byB0aGUgcnVubmVyLiAnJHtvcHRzLnVybH0nIHByb3ZpZGVkLmApO30KdHJ5e3JlcXVlc3RlZFVybD1uZXcgVVJMKG9wdHMudXJsKS5ocmVmO31jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ1RoZSB1cmwgcHJvdmlkZWQgc2hvdWxkIGhhdmUgYSBwcm9wZXIgcHJvdG9jb2wgYW5kIGhvc3RuYW1lLicpO30KYXJ0aWZhY3RzPWF3YWl0IFJ1bm5lci5fZ2F0aGVyQXJ0aWZhY3RzRnJvbUJyb3dzZXIocmVxdWVzdGVkVXJsLG9wdHMsY29ubmVjdGlvbik7aWYoc2V0dGluZ3MuZ2F0aGVyTW9kZSl7Y29uc3QgcGF0aD1SdW5uZXIuX2dldEFydGlmYWN0c1BhdGgoc2V0dGluZ3MpO2F3YWl0IGFzc2V0U2F2ZXIuc2F2ZUFydGlmYWN0cyhhcnRpZmFjdHMscGF0aCk7fX0KaWYoc2V0dGluZ3MuZ2F0aGVyTW9kZSYmIXNldHRpbmdzLmF1ZGl0TW9kZSlyZXR1cm47aWYoIW9wdHMuY29uZmlnLmF1ZGl0cyl7dGhyb3cgbmV3IEVycm9yKCdObyBhdWRpdHMgdG8gZXZhbHVhdGUuJyk7fQpjb25zdCBhdWRpdFJlc3VsdHM9YXdhaXQgUnVubmVyLl9ydW5BdWRpdHMoc2V0dGluZ3Msb3B0cy5jb25maWcuYXVkaXRzLGFydGlmYWN0cyk7bG9nLmxvZygnc3RhdHVzJywnR2VuZXJhdGluZyByZXN1bHRzLi4uJyk7aWYoYXJ0aWZhY3RzLkxpZ2h0aG91c2VSdW5XYXJuaW5ncyl7bGlnaHRob3VzZVJ1bldhcm5pbmdzLnB1c2goLi4uYXJ0aWZhY3RzLkxpZ2h0aG91c2VSdW5XYXJuaW5ncyk7fQpjb25zdCBsaWdodGhvdXNlVmVyc2lvbj1yZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO2NvbnN0IHJlc3VsdHNCeUlkPXt9O2Zvcihjb25zdCBhdWRpdCBvZiBhdWRpdFJlc3VsdHMpe3Jlc3VsdHNCeUlkW2F1ZGl0LmlkXT1hdWRpdDt9CmxldCBjYXRlZ29yaWVzPXt9O2lmKG9wdHMuY29uZmlnLmNhdGVnb3JpZXMpe2NhdGVnb3JpZXM9UmVwb3J0U2NvcmluZy5zY29yZUFsbENhdGVnb3JpZXMob3B0cy5jb25maWcuY2F0ZWdvcmllcyxyZXN1bHRzQnlJZCk7fQpjb25zdCBsaHI9e3VzZXJBZ2VudDphcnRpZmFjdHMuVXNlckFnZW50LGxpZ2h0aG91c2VWZXJzaW9uLGZldGNoVGltZTphcnRpZmFjdHMuZmV0Y2hUaW1lLHJlcXVlc3RlZFVybDpyZXF1ZXN0ZWRVcmwsZmluYWxVcmw6YXJ0aWZhY3RzLlVSTC5maW5hbFVybCxydW5XYXJuaW5nczpsaWdodGhvdXNlUnVuV2FybmluZ3MsYXVkaXRzOnJlc3VsdHNCeUlkLGNvbmZpZ1NldHRpbmdzOnNldHRpbmdzLGNhdGVnb3JpZXMsY2F0ZWdvcnlHcm91cHM6b3B0cy5jb25maWcuZ3JvdXBzfHx1bmRlZmluZWQsdGltaW5nOnt0b3RhbDpEYXRlLm5vdygpLXN0YXJ0VGltZX19O2NvbnN0IHJlcG9ydD1nZW5lcmF0ZVJlcG9ydChsaHIsc2V0dGluZ3Mub3V0cHV0KTtyZXR1cm57bGhyLGFydGlmYWN0cyxyZXBvcnR9O31jYXRjaChlcnIpe2F3YWl0IFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGVycix7bGV2ZWw6J2ZhdGFsJ30pO3Rocm93IGVycjt9fQpzdGF0aWMgYXN5bmMgX2dhdGhlckFydGlmYWN0c0Zyb21Ccm93c2VyKHJlcXVlc3RlZFVybCxydW5uZXJPcHRzLGNvbm5lY3Rpb24pe2lmKCFydW5uZXJPcHRzLmNvbmZpZy5wYXNzZXMpe3Rocm93IG5ldyBFcnJvcignTm8gYnJvd3NlciBhcnRpZmFjdHMgYXJlIGVpdGhlciBwcm92aWRlZCBvciByZXF1ZXN0ZWQuJyk7fQpjb25zdCBkcml2ZXI9cnVubmVyT3B0cy5kcml2ZXJNb2NrfHxuZXcgRHJpdmVyKGNvbm5lY3Rpb24pO2NvbnN0IGdhdGhlck9wdHM9e2RyaXZlcixyZXF1ZXN0ZWRVcmwsc2V0dGluZ3M6cnVubmVyT3B0cy5jb25maWcuc2V0dGluZ3N9O2NvbnN0IGFydGlmYWN0cz1hd2FpdCBHYXRoZXJSdW5uZXIucnVuKHJ1bm5lck9wdHMuY29uZmlnLnBhc3NlcyxnYXRoZXJPcHRzKTtyZXR1cm4gYXJ0aWZhY3RzO30Kc3RhdGljIGFzeW5jIF9ydW5BdWRpdHMoc2V0dGluZ3MsYXVkaXRzLGFydGlmYWN0cyl7bG9nLmxvZygnc3RhdHVzJywnQW5hbHl6aW5nIGFuZCBydW5uaW5nIGF1ZGl0cy4uLicpO2FydGlmYWN0cz1PYmplY3QuYXNzaWduKHt9LFJ1bm5lci5pbnN0YW50aWF0ZUNvbXB1dGVkQXJ0aWZhY3RzKCksYXJ0aWZhY3RzKTtpZihhcnRpZmFjdHMuc2V0dGluZ3Mpe2NvbnN0IG92ZXJyaWRlcz17Z2F0aGVyTW9kZTp1bmRlZmluZWQsYXVkaXRNb2RlOnVuZGVmaW5lZCxvdXRwdXQ6dW5kZWZpbmVkfTtjb25zdCBub3JtYWxpemVkR2F0aGVyU2V0dGluZ3M9T2JqZWN0LmFzc2lnbih7fSxhcnRpZmFjdHMuc2V0dGluZ3Msb3ZlcnJpZGVzKTtjb25zdCBub3JtYWxpemVkQXVkaXRTZXR0aW5ncz1PYmplY3QuYXNzaWduKHt9LHNldHRpbmdzLG92ZXJyaWRlcyk7aWYoIWlzRGVlcEVxdWFsKG5vcm1hbGl6ZWRHYXRoZXJTZXR0aW5ncyxub3JtYWxpemVkQXVkaXRTZXR0aW5ncykpe3Rocm93IG5ldyBFcnJvcignQ2Fubm90IGNoYW5nZSBzZXR0aW5ncyBiZXR3ZWVuIGdhdGhlcmluZyBhbmQgYXVkaXRpbmcnKTt9fQpjb25zdCBhdWRpdFJlc3VsdHM9W107Zm9yKGNvbnN0IGF1ZGl0RGVmbiBvZiBhdWRpdHMpe2NvbnN0IGF1ZGl0UmVzdWx0PWF3YWl0IFJ1bm5lci5fcnVuQXVkaXQoYXVkaXREZWZuLGFydGlmYWN0cyxzZXR0aW5ncyk7YXVkaXRSZXN1bHRzLnB1c2goYXVkaXRSZXN1bHQpO30KcmV0dXJuIGF1ZGl0UmVzdWx0czt9CnN0YXRpYyBhc3luYyBfcnVuQXVkaXQoYXVkaXREZWZuLGFydGlmYWN0cyxzZXR0aW5ncyl7Y29uc3QgYXVkaXQ9YXVkaXREZWZuLmltcGxlbWVudGF0aW9uO2NvbnN0IHN0YXR1cz1gRXZhbHVhdGluZzogJHthdWRpdC5tZXRhLnRpdGxlfWA7bG9nLmxvZygnc3RhdHVzJyxzdGF0dXMpO2xldCBhdWRpdFJlc3VsdDt0cnl7Zm9yKGNvbnN0IGFydGlmYWN0TmFtZSBvZiBhdWRpdC5tZXRhLnJlcXVpcmVkQXJ0aWZhY3RzKXtjb25zdCBub0FydGlmYWN0PWFydGlmYWN0c1thcnRpZmFjdE5hbWVdPT09dW5kZWZpbmVkO2NvbnN0IG5vVHJhY2U9YXJ0aWZhY3ROYW1lPT09J3RyYWNlcycmJiFhcnRpZmFjdHMudHJhY2VzW0F1ZGl0LkRFRkFVTFRfUEFTU107aWYobm9BcnRpZmFjdHx8bm9UcmFjZSl7bG9nLndhcm4oJ1J1bm5lcicsYCR7YXJ0aWZhY3ROYW1lfSBnYXRoZXJlciwgcmVxdWlyZWQgYnkgYXVkaXQgJHthdWRpdC5tZXRhLmlkfSwgZGlkIG5vdCBydW4uYCk7dGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCAke2FydGlmYWN0TmFtZX0gZ2F0aGVyZXIgZGlkIG5vdCBydW4uYCk7fQppZihhcnRpZmFjdHNbYXJ0aWZhY3ROYW1lXWluc3RhbmNlb2YgRXJyb3Ipe2NvbnN0IGFydGlmYWN0RXJyb3I9YXJ0aWZhY3RzW2FydGlmYWN0TmFtZV07U2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oYXJ0aWZhY3RFcnJvcix7dGFnczp7Z2F0aGVyZXI6YXJ0aWZhY3ROYW1lfSxsZXZlbDonZXJyb3InfSk7bG9nLndhcm4oJ1J1bm5lcicsYCR7YXJ0aWZhY3ROYW1lfSBnYXRoZXJlciwgcmVxdWlyZWQgYnkgYXVkaXQgJHthdWRpdC5tZXRhLmlkfSxgK2AgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICR7YXJ0aWZhY3RFcnJvci5tZXNzYWdlfWApO2NvbnN0IGVycm9yPW5ldyBFcnJvcihgUmVxdWlyZWQgJHthcnRpZmFjdE5hbWV9IGdhdGhlcmVyIGVuY291bnRlcmVkIGFuIGVycm9yOiAke2FydGlmYWN0RXJyb3IubWVzc2FnZX1gKTtlcnJvci5leHBlY3RlZD10cnVlO3Rocm93IGVycm9yO319CmNvbnN0IGF1ZGl0T3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGF1ZGl0LmRlZmF1bHRPcHRpb25zLGF1ZGl0RGVmbi5vcHRpb25zKTtjb25zdCBwcm9kdWN0PWF3YWl0IGF1ZGl0LmF1ZGl0KGFydGlmYWN0cyx7b3B0aW9uczphdWRpdE9wdGlvbnMsc2V0dGluZ3M6c2V0dGluZ3N9KTthdWRpdFJlc3VsdD1BdWRpdC5nZW5lcmF0ZUF1ZGl0UmVzdWx0KGF1ZGl0LHByb2R1Y3QpO31jYXRjaChlcnIpe2xvZy53YXJuKGF1ZGl0Lm1ldGEuaWQsYENhdWdodCBleGNlcHRpb246ICR7ZXJyLm1lc3NhZ2V9YCk7aWYoZXJyLmZhdGFsKXt0aHJvdyBlcnI7fQpTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihlcnIse3RhZ3M6e2F1ZGl0OmF1ZGl0Lm1ldGEuaWR9LGxldmVsOidlcnJvcid9KTtjb25zdCBlcnJvck1lc3NhZ2U9ZXJyLmZyaWVuZGx5TWVzc2FnZT9gJHtlcnIuZnJpZW5kbHlNZXNzYWdlfSAoJHtlcnIubWVzc2FnZX0pYDpgQXVkaXQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDthdWRpdFJlc3VsdD1BdWRpdC5nZW5lcmF0ZUVycm9yQXVkaXRSZXN1bHQoYXVkaXQsZXJyb3JNZXNzYWdlKTt9CmxvZy52ZXJib3NlKCdzdGF0dXNFbmQnLHN0YXR1cyk7cmV0dXJuIGF1ZGl0UmVzdWx0O30Kc3RhdGljIGdldEF1ZGl0TGlzdCgpe2NvbnN0IGlnbm9yZWRGaWxlcz1bJ2F1ZGl0LmpzJywndmlvbGF0aW9uLWF1ZGl0LmpzJywnYWNjZXNzaWJpbGl0eS9heGUtYXVkaXQuanMnLCdtdWx0aS1jaGVjay1hdWRpdC5qcycsJ2J5dGUtZWZmaWNpZW5jeS9ieXRlLWVmZmljaWVuY3ktYXVkaXQuanMnLCdtYW51YWwvbWFudWFsLWF1ZGl0LmpzJ107Y29uc3QgZmlsZUxpc3Q9Wy4uLlsiYWNjZXNzaWJpbGl0eSIsImF1ZGl0LmpzIiwiYm9vdHVwLXRpbWUuanMiLCJieXRlLWVmZmljaWVuY3kiLCJjb250ZW50LXdpZHRoLmpzIiwiY3JpdGljYWwtcmVxdWVzdC1jaGFpbnMuanMiLCJkZXByZWNhdGlvbnMuanMiLCJkb2JldHRlcndlYiIsImVycm9ycy1pbi1jb25zb2xlLmpzIiwiZm9udC1kaXNwbGF5LmpzIiwiaW1hZ2UtYXNwZWN0LXJhdGlvLmpzIiwiaXMtb24taHR0cHMuanMiLCJsb2FkLWZhc3QtZW5vdWdoLWZvci1wd2EuanMiLCJtYWludGhyZWFkLXdvcmstYnJlYWtkb3duLmpzIiwibWFuaWZlc3Qtc2hvcnQtbmFtZS1sZW5ndGguanMiLCJtYW51YWwiLCJtZXRyaWNzIiwibWV0cmljcy5qcyIsIm1peGVkLWNvbnRlbnQuanMiLCJtdWx0aS1jaGVjay1hdWRpdC5qcyIsIm5ldHdvcmstcmVxdWVzdHMuanMiLCJwcmVkaWN0aXZlLXBlcmYuanMiLCJyZWRpcmVjdHMtaHR0cC5qcyIsInJlZGlyZWN0cy5qcyIsInNjcmVlbnNob3QtdGh1bWJuYWlscy5qcyIsInNlbyIsInNlcnZpY2Utd29ya2VyLmpzIiwic3BsYXNoLXNjcmVlbi5qcyIsInRoZW1lZC1vbW5pYm94LmpzIiwidGltZS10by1maXJzdC1ieXRlLmpzIiwidXNlci10aW1pbmdzLmpzIiwidXNlcy1yZWwtcHJlY29ubmVjdC5qcyIsInVzZXMtcmVsLXByZWxvYWQuanMiLCJ2aWV3cG9ydC5qcyIsInZpb2xhdGlvbi1hdWRpdC5qcyIsIndlYmFwcC1pbnN0YWxsLWJhbm5lci5qcyIsIndpdGhvdXQtamF2YXNjcmlwdC5qcyIsIndvcmtzLW9mZmxpbmUuanMiXSwuLi5bImFwcGNhY2hlLW1hbmlmZXN0LmpzIiwiZG9jdHlwZS5qcyIsImRvbS1zaXplLmpzIiwiZXh0ZXJuYWwtYW5jaG9ycy11c2UtcmVsLW5vb3BlbmVyLmpzIiwiZ2VvbG9jYXRpb24tb24tc3RhcnQuanMiLCJuby1kb2N1bWVudC13cml0ZS5qcyIsIm5vLXZ1bG5lcmFibGUtbGlicmFyaWVzLmpzIiwibm8td2Vic3FsLmpzIiwibm90aWZpY2F0aW9uLW9uLXN0YXJ0LmpzIiwicGFzc3dvcmQtaW5wdXRzLWNhbi1iZS1wYXN0ZWQtaW50by5qcyIsInVzZXMtaHR0cDIuanMiLCJ1c2VzLXBhc3NpdmUtZXZlbnQtbGlzdGVuZXJzLmpzIl0ubWFwKGY9PmBkb2JldHRlcndlYi8ke2Z9YCksLi4uWyJlc3RpbWF0ZWQtaW5wdXQtbGF0ZW5jeS5qcyIsImZpcnN0LWNvbnRlbnRmdWwtcGFpbnQuanMiLCJmaXJzdC1jcHUtaWRsZS5qcyIsImZpcnN0LW1lYW5pbmdmdWwtcGFpbnQuanMiLCJpbnRlcmFjdGl2ZS5qcyIsInNwZWVkLWluZGV4LmpzIl0ubWFwKGY9PmBtZXRyaWNzLyR7Zn1gKSwuLi5bImNhbm9uaWNhbC5qcyIsImZvbnQtc2l6ZS5qcyIsImhyZWZsYW5nLmpzIiwiaHR0cC1zdGF0dXMtY29kZS5qcyIsImlzLWNyYXdsYWJsZS5qcyIsImxpbmstdGV4dC5qcyIsIm1hbnVhbCIsIm1ldGEtZGVzY3JpcHRpb24uanMiLCJwbHVnaW5zLmpzIiwicm9ib3RzLXR4dC5qcyJdLm1hcChmPT5gc2VvLyR7Zn1gKSwuLi5bIm1vYmlsZS1mcmllbmRseS5qcyIsInN0cnVjdHVyZWQtZGF0YS5qcyJdLm1hcChmPT5gc2VvL21hbnVhbC8ke2Z9YCksLi4uWyJhY2Nlc3NrZXlzLmpzIiwiYXJpYS1hbGxvd2VkLWF0dHIuanMiLCJhcmlhLXJlcXVpcmVkLWF0dHIuanMiLCJhcmlhLXJlcXVpcmVkLWNoaWxkcmVuLmpzIiwiYXJpYS1yZXF1aXJlZC1wYXJlbnQuanMiLCJhcmlhLXJvbGVzLmpzIiwiYXJpYS12YWxpZC1hdHRyLXZhbHVlLmpzIiwiYXJpYS12YWxpZC1hdHRyLmpzIiwiYXVkaW8tY2FwdGlvbi5qcyIsImF4ZS1hdWRpdC5qcyIsImJ1dHRvbi1uYW1lLmpzIiwiYnlwYXNzLmpzIiwiY29sb3ItY29udHJhc3QuanMiLCJkZWZpbml0aW9uLWxpc3QuanMiLCJkbGl0ZW0uanMiLCJkb2N1bWVudC10aXRsZS5qcyIsImR1cGxpY2F0ZS1pZC5qcyIsImZyYW1lLXRpdGxlLmpzIiwiaHRtbC1oYXMtbGFuZy5qcyIsImh0bWwtbGFuZy12YWxpZC5qcyIsImltYWdlLWFsdC5qcyIsImlucHV0LWltYWdlLWFsdC5qcyIsImxhYmVsLmpzIiwibGF5b3V0LXRhYmxlLmpzIiwibGluay1uYW1lLmpzIiwibGlzdC5qcyIsImxpc3RpdGVtLmpzIiwibWFudWFsIiwibWV0YS1yZWZyZXNoLmpzIiwibWV0YS12aWV3cG9ydC5qcyIsIm9iamVjdC1hbHQuanMiLCJ0YWJpbmRleC5qcyIsInRkLWhlYWRlcnMtYXR0ci5qcyIsInRoLWhhcy1kYXRhLWNlbGxzLmpzIiwidmFsaWQtbGFuZy5qcyIsInZpZGVvLWNhcHRpb24uanMiLCJ2aWRlby1kZXNjcmlwdGlvbi5qcyJdLm1hcChmPT5gYWNjZXNzaWJpbGl0eS8ke2Z9YCksLi4uWyJjdXN0b20tY29udHJvbHMtbGFiZWxzLmpzIiwiY3VzdG9tLWNvbnRyb2xzLXJvbGVzLmpzIiwiZm9jdXMtdHJhcHMuanMiLCJmb2N1c2FibGUtY29udHJvbHMuanMiLCJoZWFkaW5nLWxldmVscy5qcyIsImxvZ2ljYWwtdGFiLW9yZGVyLmpzIiwibWFuYWdlZC1mb2N1cy5qcyIsIm9mZnNjcmVlbi1jb250ZW50LWhpZGRlbi5qcyIsInVzZS1sYW5kbWFya3MuanMiLCJ2aXN1YWwtb3JkZXItZm9sbG93cy1kb20uanMiXS5tYXAoZj0+YGFjY2Vzc2liaWxpdHkvbWFudWFsLyR7Zn1gKSwuLi5bImJ5dGUtZWZmaWNpZW5jeS1hdWRpdC5qcyIsImVmZmljaWVudC1hbmltYXRlZC1jb250ZW50LmpzIiwib2Zmc2NyZWVuLWltYWdlcy5qcyIsInJlbmRlci1ibG9ja2luZy1yZXNvdXJjZXMuanMiLCJ0b3RhbC1ieXRlLXdlaWdodC5qcyIsInVubWluaWZpZWQtY3NzLmpzIiwidW5taW5pZmllZC1qYXZhc2NyaXB0LmpzIiwidW51c2VkLWNzcy1ydWxlcy5qcyIsInVudXNlZC1qYXZhc2NyaXB0LmpzIiwidXNlcy1sb25nLWNhY2hlLXR0bC5qcyIsInVzZXMtb3B0aW1pemVkLWltYWdlcy5qcyIsInVzZXMtcmVzcG9uc2l2ZS1pbWFnZXMuanMiLCJ1c2VzLXRleHQtY29tcHJlc3Npb24uanMiLCJ1c2VzLXdlYnAtaW1hZ2VzLmpzIl0ubWFwKGY9PmBieXRlLWVmZmljaWVuY3kvJHtmfWApLC4uLlsibWFudWFsLWF1ZGl0LmpzIiwicHdhLWNyb3NzLWJyb3dzZXIuanMiLCJwd2EtZWFjaC1wYWdlLWhhcy11cmwuanMiLCJwd2EtcGFnZS10cmFuc2l0aW9ucy5qcyJdLm1hcChmPT5gbWFudWFsLyR7Zn1gKV07cmV0dXJuIGZpbGVMaXN0LmZpbHRlcihmPT57cmV0dXJuL1wuanMkLy50ZXN0KGYpJiYhaWdub3JlZEZpbGVzLmluY2x1ZGVzKGYpO30pLnNvcnQoKTt9CnN0YXRpYyBnZXRHYXRoZXJlckxpc3QoKXtjb25zdCBmaWxlTGlzdD1bLi4uWyJhY2Nlc3NpYmlsaXR5LmpzIiwiY2FjaGUtY29udGVudHMuanMiLCJjaHJvbWUtY29uc29sZS1tZXNzYWdlcy5qcyIsImNzcy11c2FnZS5qcyIsImRvYmV0dGVyd2ViIiwiZm9udHMuanMiLCJnYXRoZXJlci5qcyIsImh0bWwtd2l0aG91dC1qYXZhc2NyaXB0LmpzIiwiaHR0cC1yZWRpcmVjdC5qcyIsImltYWdlLXVzYWdlLmpzIiwianMtdXNhZ2UuanMiLCJtYW5pZmVzdC5qcyIsIm1peGVkLWNvbnRlbnQuanMiLCJvZmZsaW5lLmpzIiwicnVudGltZS1leGNlcHRpb25zLmpzIiwic2NyaXB0cy5qcyIsInNlbyIsInNlcnZpY2Utd29ya2VyLmpzIiwic3RhcnQtdXJsLmpzIiwidGhlbWUtY29sb3IuanMiLCJ2aWV3cG9ydC1kaW1lbnNpb25zLmpzIiwidmlld3BvcnQuanMiXSwuLi5bImNhbm9uaWNhbC5qcyIsImNyYXdsYWJsZS1saW5rcy5qcyIsImVtYmVkZGVkLWNvbnRlbnQuanMiLCJmb250LXNpemUuanMiLCJocmVmbGFuZy5qcyIsIm1ldGEtZGVzY3JpcHRpb24uanMiLCJtZXRhLXJvYm90cy5qcyIsInJvYm90cy10eHQuanMiXS5tYXAoZj0+YHNlby8ke2Z9YCksLi4uWyJhbmNob3JzLXdpdGgtbm8tcmVsLW5vb3BlbmVyLmpzIiwiYXBwY2FjaGUuanMiLCJkb2N0eXBlLmpzIiwiZG9tc3RhdHMuanMiLCJqcy1saWJyYXJpZXMuanMiLCJvcHRpbWl6ZWQtaW1hZ2VzLmpzIiwicGFzc3dvcmQtaW5wdXRzLXdpdGgtcHJldmVudGVkLXBhc3RlLmpzIiwicmVzcG9uc2UtY29tcHJlc3Npb24uanMiLCJ0YWdzLWJsb2NraW5nLWZpcnN0LXBhaW50LmpzIiwid2Vic3FsLmpzIl0ubWFwKGY9PmBkb2JldHRlcndlYi8ke2Z9YCldO3JldHVybiBmaWxlTGlzdC5maWx0ZXIoZj0+L1wuanMkLy50ZXN0KGYpJiZmIT09J2dhdGhlcmVyLmpzJykuc29ydCgpO30Kc3RhdGljIGdldENvbXB1dGVkR2F0aGVyZXJMaXN0KCl7Y29uc3QgZmlsZW5hbWVzVG9Ta2lwPVsnY29tcHV0ZWQtYXJ0aWZhY3QuanMnLCdtZXRyaWNzJywnbWV0cmljcy9sYW50ZXJuLW1ldHJpYy5qcycsJ21ldHJpY3MvbWV0cmljLmpzJ107Y29uc3QgZmlsZUxpc3Q9Wy4uLlsiY29tcHV0ZWQtYXJ0aWZhY3QuanMiLCJjcml0aWNhbC1yZXF1ZXN0LWNoYWlucy5qcyIsImxvYWQtc2ltdWxhdG9yLmpzIiwibWFpbi1yZXNvdXJjZS5qcyIsIm1haW4tdGhyZWFkLXRhc2tzLmpzIiwibWFuaWZlc3QtdmFsdWVzLmpzIiwibWV0cmljcyIsIm5ldHdvcmstYW5hbHlzaXMuanMiLCJuZXR3b3JrLXJlY29yZHMuanMiLCJuZXR3b3JrLXRocm91Z2hwdXQuanMiLCJwYWdlLWRlcGVuZGVuY3ktZ3JhcGguanMiLCJwdXNoZWQtcmVxdWVzdHMuanMiLCJzY3JlZW5zaG90cy5qcyIsInNwZWVkbGluZS5qcyIsInRyYWNlLW9mLXRhYi5qcyJdLC4uLlsiZXN0aW1hdGVkLWlucHV0LWxhdGVuY3kuanMiLCJmaXJzdC1jb250ZW50ZnVsLXBhaW50LmpzIiwiZmlyc3QtY3B1LWlkbGUuanMiLCJmaXJzdC1tZWFuaW5nZnVsLXBhaW50LmpzIiwiaW50ZXJhY3RpdmUuanMiLCJsYW50ZXJuLWVzdGltYXRlZC1pbnB1dC1sYXRlbmN5LmpzIiwibGFudGVybi1maXJzdC1jb250ZW50ZnVsLXBhaW50LmpzIiwibGFudGVybi1maXJzdC1jcHUtaWRsZS5qcyIsImxhbnRlcm4tZmlyc3QtbWVhbmluZ2Z1bC1wYWludC5qcyIsImxhbnRlcm4taW50ZXJhY3RpdmUuanMiLCJsYW50ZXJuLW1ldHJpYy5qcyIsImxhbnRlcm4tc3BlZWQtaW5kZXguanMiLCJtZXRyaWMuanMiLCJzcGVlZC1pbmRleC5qcyJdLm1hcChmPT5gbWV0cmljcy8ke2Z9YCldO3JldHVybiBmaWxlTGlzdC5maWx0ZXIoZj0+L1wuanMkLy50ZXN0KGYpJiYhZmlsZW5hbWVzVG9Ta2lwLmluY2x1ZGVzKGYpKS5zb3J0KCk7fQpzdGF0aWMgaW5zdGFudGlhdGVDb21wdXRlZEFydGlmYWN0cygpe2NvbnN0IGNvbXB1dGVkQXJ0aWZhY3RzPXt9O1J1bm5lci5nZXRDb21wdXRlZEdhdGhlcmVyTGlzdCgpLmZvckVhY2goZnVuY3Rpb24oZmlsZW5hbWUpe2ZpbGVuYW1lPWZpbGVuYW1lLnJlcGxhY2UoL1wuanMkLywnJyk7Y29uc3QgQXJ0aWZhY3RDbGFzcz1yZXF1aXJlKCcuL2dhdGhlci9jb21wdXRlZC8nK2ZpbGVuYW1lKTtjb25zdCBhcnRpZmFjdD1uZXcgQXJ0aWZhY3RDbGFzcyhjb21wdXRlZEFydGlmYWN0cyk7Y29tcHV0ZWRBcnRpZmFjdHNbJ3JlcXVlc3QnK2FydGlmYWN0Lm5hbWVdPWFydGlmYWN0LnJlcXVlc3QuYmluZChhcnRpZmFjdCk7fSk7cmV0dXJuIGNvbXB1dGVkQXJ0aWZhY3RzO30Kc3RhdGljIHJlc29sdmVQbHVnaW4ocGx1Z2luLGNvbmZpZ0RpcixjYXRlZ29yeSl7dHJ5e3JldHVybiByZXF1aXJlLnJlc29sdmUocGx1Z2luKTt9Y2F0Y2goZSl7fQpjb25zdCBjd2RQYXRoPXBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLHBsdWdpbik7dHJ5e3JldHVybiByZXF1aXJlLnJlc29sdmUoY3dkUGF0aCk7fWNhdGNoKGUpe30KY29uc3QgZXJyb3JTdHJpbmc9J1VuYWJsZSB0byBsb2NhdGUgJysoY2F0ZWdvcnk/YCR7Y2F0ZWdvcnl9OiBgOicnKStgJHtwbHVnaW59ICh0cmllZCB0byByZXF1aXJlKCkgZnJvbSAnJHtfX2Rpcm5hbWV9JyBhbmQgbG9hZCBmcm9tICcke2N3ZFBhdGh9J2A7aWYoIWNvbmZpZ0Rpcil7dGhyb3cgbmV3IEVycm9yKGVycm9yU3RyaW5nKycpJyk7fQpjb25zdCByZWxhdGl2ZVBhdGg9cGF0aC5yZXNvbHZlKGNvbmZpZ0RpcixwbHVnaW4pO3RyeXtyZXR1cm4gcmVxdWlyZS5yZXNvbHZlKHJlbGF0aXZlUGF0aCk7fWNhdGNoKHJlcXVpcmVFcnJvcil7fQp0aHJvdyBuZXcgRXJyb3IoZXJyb3JTdHJpbmcrYCBhbmQgJyR7cmVsYXRpdmVQYXRofScpYCk7fQpzdGF0aWMgX2dldEFydGlmYWN0c1BhdGgoc2V0dGluZ3Mpe2NvbnN0e2F1ZGl0TW9kZSxnYXRoZXJNb2RlfT1zZXR0aW5ncztpZih0eXBlb2YgYXVkaXRNb2RlPT09J3N0cmluZycpcmV0dXJuIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLGF1ZGl0TW9kZSk7aWYodHlwZW9mIGdhdGhlck1vZGU9PT0nc3RyaW5nJylyZXR1cm4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksZ2F0aGVyTW9kZSk7cmV0dXJuIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCdsYXRlc3QtcnVuJyk7fX0KbW9kdWxlLmV4cG9ydHM9UnVubmVyO30pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpLCIvLi4vbGlnaHRob3VzZS1jb3JlIik7fSx7Ii4uL3BhY2thZ2UuanNvbiI6MTM2LCIuL2F1ZGl0cy9hdWRpdCI6MiwiLi9nYXRoZXIvZHJpdmVyLmpzIjoxNywiLi9nYXRoZXIvZ2F0aGVyLXJ1bm5lciI6MTgsIi4vbGliL2Fzc2V0LXNhdmVyIjoyMSwiLi9saWIvc2VudHJ5Ijo0MCwiLi9saWIvdXJsLXNoaW0iOiJ1cmwiLCIuL3JlcG9ydC9yZXBvcnQtZ2VuZXJhdG9yIjo0OSwiLi9zY29yaW5nIjo1MSwiX3Byb2Nlc3MiOjc3LCJsaWdodGhvdXNlLWxvZ2dlciI6MTI1LCJsb2Rhc2guaXNlcXVhbCI6MTI2LCJwYXRoIjo3NX1dLDUxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7Y29uc3QgQXVkaXQ9cmVxdWlyZSgnLi9hdWRpdHMvYXVkaXQnKTtjb25zdCBjbGFtcFRvMkRlY2ltYWxzPXZhbD0+TWF0aC5yb3VuZCh2YWwqMTAwKS8xMDA7Y2xhc3MgUmVwb3J0U2NvcmluZ3tzdGF0aWMgYXJpdGhtZXRpY01lYW4oaXRlbXMpe2l0ZW1zPWl0ZW1zLmZpbHRlcihpdGVtPT5pdGVtLndlaWdodD4wKTtpZihpdGVtcy5zb21lKGl0ZW09Pml0ZW0uc2NvcmU9PT1udWxsKSlyZXR1cm4gbnVsbDtjb25zdCByZXN1bHRzPWl0ZW1zLnJlZHVjZSgocmVzdWx0LGl0ZW0pPT57Y29uc3Qgc2NvcmU9aXRlbS5zY29yZTtjb25zdCB3ZWlnaHQ9aXRlbS53ZWlnaHQ7cmV0dXJue3dlaWdodDpyZXN1bHQud2VpZ2h0K3dlaWdodCxzdW06cmVzdWx0LnN1bStzY29yZSp3ZWlnaHR9O30se3dlaWdodDowLHN1bTowfSk7cmV0dXJuIGNsYW1wVG8yRGVjaW1hbHMocmVzdWx0cy5zdW0vcmVzdWx0cy53ZWlnaHR8fDApO30Kc3RhdGljIHNjb3JlQWxsQ2F0ZWdvcmllcyhjb25maWdDYXRlZ29yaWVzLHJlc3VsdHNCeUF1ZGl0SWQpe2NvbnN0IHNjb3JlZENhdGVnb3JpZXM9e307Zm9yKGNvbnN0W2NhdGVnb3J5SWQsY29uZmlnQ2F0ZWdvcnldb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnQ2F0ZWdvcmllcykpe2NvbnN0IGF1ZGl0UmVmcz1jb25maWdDYXRlZ29yeS5hdWRpdFJlZnMubWFwKGNvbmZpZ01lbWJlcj0+e2NvbnN0IG1lbWJlcj17Li4uY29uZmlnTWVtYmVyfTtjb25zdCByZXN1bHQ9cmVzdWx0c0J5QXVkaXRJZFttZW1iZXIuaWRdO2lmKHJlc3VsdC5zY29yZURpc3BsYXlNb2RlPT09QXVkaXQuU0NPUklOR19NT0RFUy5OT1RfQVBQTElDQUJMRXx8cmVzdWx0LnNjb3JlRGlzcGxheU1vZGU9PT1BdWRpdC5TQ09SSU5HX01PREVTLklORk9STUFUSVZFfHxyZXN1bHQuc2NvcmVEaXNwbGF5TW9kZT09PUF1ZGl0LlNDT1JJTkdfTU9ERVMuTUFOVUFMKXttZW1iZXIud2VpZ2h0PTA7fQpyZXR1cm4gbWVtYmVyO30pO2NvbnN0IHNjb3Jlcz1hdWRpdFJlZnMubWFwKGF1ZGl0UmVmPT4oe3Njb3JlOnJlc3VsdHNCeUF1ZGl0SWRbYXVkaXRSZWYuaWRdLnNjb3JlLHdlaWdodDphdWRpdFJlZi53ZWlnaHR9KSk7Y29uc3Qgc2NvcmU9UmVwb3J0U2NvcmluZy5hcml0aG1ldGljTWVhbihzY29yZXMpO3Njb3JlZENhdGVnb3JpZXNbY2F0ZWdvcnlJZF09ey4uLmNvbmZpZ0NhdGVnb3J5LGF1ZGl0UmVmcyxpZDpjYXRlZ29yeUlkLHNjb3JlfTt9CnJldHVybiBzY29yZWRDYXRlZ29yaWVzO319Cm1vZHVsZS5leHBvcnRzPVJlcG9ydFNjb3Jpbmc7fSx7Ii4vYXVkaXRzL2F1ZGl0IjoyfV0sNTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jztjb25zdCBSYXdQcm90b2NvbD1yZXF1aXJlKCcuLi8uLi8uLi9saWdodGhvdXNlLWNvcmUvZ2F0aGVyL2Nvbm5lY3Rpb25zL3JhdycpO2NvbnN0IFJ1bm5lcj1yZXF1aXJlKCcuLi8uLi8uLi9saWdodGhvdXNlLWNvcmUvcnVubmVyJyk7Y29uc3QgQ29uZmlnPXJlcXVpcmUoJy4uLy4uLy4uL2xpZ2h0aG91c2UtY29yZS9jb25maWcvY29uZmlnJyk7Y29uc3QgZGVmYXVsdENvbmZpZz1yZXF1aXJlKCcuLi8uLi8uLi9saWdodGhvdXNlLWNvcmUvY29uZmlnL2RlZmF1bHQtY29uZmlnLmpzJyk7Y29uc3QgbG9nPXJlcXVpcmUoJ2xpZ2h0aG91c2UtbG9nZ2VyJyk7ZnVuY3Rpb24gcnVuTGlnaHRob3VzZUZvckNvbm5lY3Rpb24oY29ubmVjdGlvbix1cmwsb3B0aW9ucyxjYXRlZ29yeUlEcyx1cGRhdGVCYWRnZUZuPWZ1bmN0aW9uKCl7fSl7Y29uc3QgY29uZmlnPW5ldyBDb25maWcoe2V4dGVuZHM6J2xpZ2h0aG91c2U6ZGVmYXVsdCcsc2V0dGluZ3M6e29ubHlDYXRlZ29yaWVzOmNhdGVnb3J5SURzfX0sb3B0aW9ucy5mbGFncyk7Y29uc3QgcnVuT3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LG9wdGlvbnMse3VybCxjb25maWd9KTt1cGRhdGVCYWRnZUZuKHVybCk7cmV0dXJuIFJ1bm5lci5ydW4oY29ubmVjdGlvbixydW5PcHRpb25zKS50aGVuKHJlc3VsdD0+e3VwZGF0ZUJhZGdlRm4oKTtyZXR1cm4gcmVzdWx0O30pLmNhdGNoKGVycj0+e3VwZGF0ZUJhZGdlRm4oKTt0aHJvdyBlcnI7fSk7fQpmdW5jdGlvbiBydW5MaWdodGhvdXNlSW5Xb3JrZXIocG9ydCx1cmwsb3B0aW9ucyxjYXRlZ29yeUlEcyl7bG9nLnNldExldmVsKCdpbmZvJyk7Y29uc3QgY29ubmVjdGlvbj1uZXcgUmF3UHJvdG9jb2wocG9ydCk7cmV0dXJuIHJ1bkxpZ2h0aG91c2VGb3JDb25uZWN0aW9uKGNvbm5lY3Rpb24sdXJsLG9wdGlvbnMsY2F0ZWdvcnlJRHMpO30KZnVuY3Rpb24gZ2V0RGVmYXVsdENhdGVnb3JpZXMoKXtyZXR1cm4gQ29uZmlnLmdldENhdGVnb3JpZXMoZGVmYXVsdENvbmZpZyk7fQpmdW5jdGlvbiBsaXN0ZW5Gb3JTdGF0dXMobGlzdGVuQ2FsbGJhY2spe2xvZy5ldmVudHMuYWRkTGlzdGVuZXIoJ3N0YXR1cycsbGlzdGVuQ2FsbGJhY2spO30KaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnJiZtb2R1bGUuZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e3J1bkxpZ2h0aG91c2VGb3JDb25uZWN0aW9uLHJ1bkxpZ2h0aG91c2VJbldvcmtlcixnZXREZWZhdWx0Q2F0ZWdvcmllcyxsaXN0ZW5Gb3JTdGF0dXN9O30KaWYodHlwZW9mIHdpbmRvdyE9PSd1bmRlZmluZWQnKXt3aW5kb3cucnVuTGlnaHRob3VzZUluV29ya2VyPXJ1bkxpZ2h0aG91c2VJbldvcmtlcjt3aW5kb3cubGlzdGVuRm9yU3RhdHVzPWxpc3RlbkZvclN0YXR1czt9fSx7Ii4uLy4uLy4uL2xpZ2h0aG91c2UtY29yZS9jb25maWcvY29uZmlnIjo3LCIuLi8uLi8uLi9saWdodGhvdXNlLWNvcmUvY29uZmlnL2RlZmF1bHQtY29uZmlnLmpzIjo5LCIuLi8uLi8uLi9saWdodGhvdXNlLWNvcmUvZ2F0aGVyL2Nvbm5lY3Rpb25zL3JhdyI6MTUsIi4uLy4uLy4uL2xpZ2h0aG91c2UtY29yZS9ydW5uZXIiOjUwLCJsaWdodGhvdXNlLWxvZ2dlciI6MTI1fV0sNTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBjb21wYXJlKGEsYil7aWYoYT09PWIpe3JldHVybiAwO30KdmFyIHg9YS5sZW5ndGg7dmFyIHk9Yi5sZW5ndGg7Zm9yKHZhciBpPTAsbGVuPU1hdGgubWluKHgseSk7aTxsZW47KytpKXtpZihhW2ldIT09YltpXSl7eD1hW2ldO3k9YltpXTticmVhazt9fQppZih4PHkpe3JldHVybi0xO30KaWYoeTx4KXtyZXR1cm4gMTt9CnJldHVybiAwO30KZnVuY3Rpb24gaXNCdWZmZXIoYil7aWYoZ2xvYmFsLkJ1ZmZlciYmdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXI9PT0nZnVuY3Rpb24nKXtyZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTt9CnJldHVybiEhKGIhPW51bGwmJmIuX2lzQnVmZmVyKTt9CnZhciB1dGlsPXJlcXVpcmUoJ3V0aWwvJyk7dmFyIGhhc093bj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwU2xpY2U9QXJyYXkucHJvdG90eXBlLnNsaWNlO3ZhciBmdW5jdGlvbnNIYXZlTmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gZm9vKCl7fS5uYW1lPT09J2Zvbyc7fSgpO2Z1bmN0aW9uIHBUb1N0cmluZyhvYmope3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTt9CmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpe2lmKGlzQnVmZmVyKGFycmJ1Zikpe3JldHVybiBmYWxzZTt9CmlmKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIhPT0nZnVuY3Rpb24nKXtyZXR1cm4gZmFsc2U7fQppZih0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3PT09J2Z1bmN0aW9uJyl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO30KaWYoIWFycmJ1Zil7cmV0dXJuIGZhbHNlO30KaWYoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpe3JldHVybiB0cnVlO30KaWYoYXJyYnVmLmJ1ZmZlciYmYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9CnZhciBhc3NlcnQ9bW9kdWxlLmV4cG9ydHM9b2s7dmFyIHJlZ2V4PS9ccypmdW5jdGlvblxzKyhbXlwoXHNdKilccyovO2Z1bmN0aW9uIGdldE5hbWUoZnVuYyl7aWYoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSl7cmV0dXJuO30KaWYoZnVuY3Rpb25zSGF2ZU5hbWVzKXtyZXR1cm4gZnVuYy5uYW1lO30KdmFyIHN0cj1mdW5jLnRvU3RyaW5nKCk7dmFyIG1hdGNoPXN0ci5tYXRjaChyZWdleCk7cmV0dXJuIG1hdGNoJiZtYXRjaFsxXTt9CmFzc2VydC5Bc3NlcnRpb25FcnJvcj1mdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKXt0aGlzLm5hbWU9J0Fzc2VydGlvbkVycm9yJzt0aGlzLmFjdHVhbD1vcHRpb25zLmFjdHVhbDt0aGlzLmV4cGVjdGVkPW9wdGlvbnMuZXhwZWN0ZWQ7dGhpcy5vcGVyYXRvcj1vcHRpb25zLm9wZXJhdG9yO2lmKG9wdGlvbnMubWVzc2FnZSl7dGhpcy5tZXNzYWdlPW9wdGlvbnMubWVzc2FnZTt0aGlzLmdlbmVyYXRlZE1lc3NhZ2U9ZmFsc2U7fWVsc2V7dGhpcy5tZXNzYWdlPWdldE1lc3NhZ2UodGhpcyk7dGhpcy5nZW5lcmF0ZWRNZXNzYWdlPXRydWU7fQp2YXIgc3RhY2tTdGFydEZ1bmN0aW9uPW9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9ufHxmYWlsO2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHN0YWNrU3RhcnRGdW5jdGlvbik7fWVsc2V7dmFyIGVycj1uZXcgRXJyb3IoKTtpZihlcnIuc3RhY2spe3ZhciBvdXQ9ZXJyLnN0YWNrO3ZhciBmbl9uYW1lPWdldE5hbWUoc3RhY2tTdGFydEZ1bmN0aW9uKTt2YXIgaWR4PW91dC5pbmRleE9mKCdcbicrZm5fbmFtZSk7aWYoaWR4Pj0wKXt2YXIgbmV4dF9saW5lPW91dC5pbmRleE9mKCdcbicsaWR4KzEpO291dD1vdXQuc3Vic3RyaW5nKG5leHRfbGluZSsxKTt9CnRoaXMuc3RhY2s9b3V0O319fTt1dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvcixFcnJvcik7ZnVuY3Rpb24gdHJ1bmNhdGUocyxuKXtpZih0eXBlb2Ygcz09PSdzdHJpbmcnKXtyZXR1cm4gcy5sZW5ndGg8bj9zOnMuc2xpY2UoMCxuKTt9ZWxzZXtyZXR1cm4gczt9fQpmdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZyl7aWYoZnVuY3Rpb25zSGF2ZU5hbWVzfHwhdXRpbC5pc0Z1bmN0aW9uKHNvbWV0aGluZykpe3JldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTt9CnZhciByYXduYW1lPWdldE5hbWUoc29tZXRoaW5nKTt2YXIgbmFtZT1yYXduYW1lPyc6ICcrcmF3bmFtZTonJztyZXR1cm4nW0Z1bmN0aW9uJytuYW1lKyddJzt9CmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZil7cmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLDEyOCkrJyAnKwpzZWxmLm9wZXJhdG9yKycgJysKdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwxMjgpO30KZnVuY3Rpb24gZmFpbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSxvcGVyYXRvcixzdGFja1N0YXJ0RnVuY3Rpb24pe3Rocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6bWVzc2FnZSxhY3R1YWw6YWN0dWFsLGV4cGVjdGVkOmV4cGVjdGVkLG9wZXJhdG9yOm9wZXJhdG9yLHN0YWNrU3RhcnRGdW5jdGlvbjpzdGFja1N0YXJ0RnVuY3Rpb259KTt9CmFzc2VydC5mYWlsPWZhaWw7ZnVuY3Rpb24gb2sodmFsdWUsbWVzc2FnZSl7aWYoIXZhbHVlKWZhaWwodmFsdWUsdHJ1ZSxtZXNzYWdlLCc9PScsYXNzZXJ0Lm9rKTt9CmFzc2VydC5vaz1vazthc3NlcnQuZXF1YWw9ZnVuY3Rpb24gZXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKGFjdHVhbCE9ZXhwZWN0ZWQpZmFpbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSwnPT0nLGFzc2VydC5lcXVhbCk7fTthc3NlcnQubm90RXF1YWw9ZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKGFjdHVhbD09ZXhwZWN0ZWQpe2ZhaWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2UsJyE9Jyxhc3NlcnQubm90RXF1YWwpO319O2Fzc2VydC5kZWVwRXF1YWw9ZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZighX2RlZXBFcXVhbChhY3R1YWwsZXhwZWN0ZWQsZmFsc2UpKXtmYWlsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlLCdkZWVwRXF1YWwnLGFzc2VydC5kZWVwRXF1YWwpO319O2Fzc2VydC5kZWVwU3RyaWN0RXF1YWw9ZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZighX2RlZXBFcXVhbChhY3R1YWwsZXhwZWN0ZWQsdHJ1ZSkpe2ZhaWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2UsJ2RlZXBTdHJpY3RFcXVhbCcsYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCk7fX07ZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsZXhwZWN0ZWQsc3RyaWN0LG1lbW9zKXtpZihhY3R1YWw9PT1leHBlY3RlZCl7cmV0dXJuIHRydWU7fWVsc2UgaWYoaXNCdWZmZXIoYWN0dWFsKSYmaXNCdWZmZXIoZXhwZWN0ZWQpKXtyZXR1cm4gY29tcGFyZShhY3R1YWwsZXhwZWN0ZWQpPT09MDt9ZWxzZSBpZih1dGlsLmlzRGF0ZShhY3R1YWwpJiZ1dGlsLmlzRGF0ZShleHBlY3RlZCkpe3JldHVybiBhY3R1YWwuZ2V0VGltZSgpPT09ZXhwZWN0ZWQuZ2V0VGltZSgpO31lbHNlIGlmKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSYmdXRpbC5pc1JlZ0V4cChleHBlY3RlZCkpe3JldHVybiBhY3R1YWwuc291cmNlPT09ZXhwZWN0ZWQuc291cmNlJiZhY3R1YWwuZ2xvYmFsPT09ZXhwZWN0ZWQuZ2xvYmFsJiZhY3R1YWwubXVsdGlsaW5lPT09ZXhwZWN0ZWQubXVsdGlsaW5lJiZhY3R1YWwubGFzdEluZGV4PT09ZXhwZWN0ZWQubGFzdEluZGV4JiZhY3R1YWwuaWdub3JlQ2FzZT09PWV4cGVjdGVkLmlnbm9yZUNhc2U7fWVsc2UgaWYoKGFjdHVhbD09PW51bGx8fHR5cGVvZiBhY3R1YWwhPT0nb2JqZWN0JykmJihleHBlY3RlZD09PW51bGx8fHR5cGVvZiBleHBlY3RlZCE9PSdvYmplY3QnKSl7cmV0dXJuIHN0cmljdD9hY3R1YWw9PT1leHBlY3RlZDphY3R1YWw9PWV4cGVjdGVkO31lbHNlIGlmKGlzVmlldyhhY3R1YWwpJiZpc1ZpZXcoZXhwZWN0ZWQpJiZwVG9TdHJpbmcoYWN0dWFsKT09PXBUb1N0cmluZyhleHBlY3RlZCkmJiEoYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5fHxhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKXtyZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKT09PTA7fWVsc2UgaWYoaXNCdWZmZXIoYWN0dWFsKSE9PWlzQnVmZmVyKGV4cGVjdGVkKSl7cmV0dXJuIGZhbHNlO31lbHNle21lbW9zPW1lbW9zfHx7YWN0dWFsOltdLGV4cGVjdGVkOltdfTt2YXIgYWN0dWFsSW5kZXg9bWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtpZihhY3R1YWxJbmRleCE9PS0xKXtpZihhY3R1YWxJbmRleD09PW1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKXtyZXR1cm4gdHJ1ZTt9fQptZW1vcy5hY3R1YWwucHVzaChhY3R1YWwpO21lbW9zLmV4cGVjdGVkLnB1c2goZXhwZWN0ZWQpO3JldHVybiBvYmpFcXVpdihhY3R1YWwsZXhwZWN0ZWQsc3RyaWN0LG1lbW9zKTt9fQpmdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3Qpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KT09J1tvYmplY3QgQXJndW1lbnRzXSc7fQpmdW5jdGlvbiBvYmpFcXVpdihhLGIsc3RyaWN0LGFjdHVhbFZpc2l0ZWRPYmplY3RzKXtpZihhPT09bnVsbHx8YT09PXVuZGVmaW5lZHx8Yj09PW51bGx8fGI9PT11bmRlZmluZWQpCnJldHVybiBmYWxzZTtpZih1dGlsLmlzUHJpbWl0aXZlKGEpfHx1dGlsLmlzUHJpbWl0aXZlKGIpKQpyZXR1cm4gYT09PWI7aWYoc3RyaWN0JiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYikpCnJldHVybiBmYWxzZTt2YXIgYUlzQXJncz1pc0FyZ3VtZW50cyhhKTt2YXIgYklzQXJncz1pc0FyZ3VtZW50cyhiKTtpZihhSXNBcmdzJiYhYklzQXJnc3x8IWFJc0FyZ3MmJmJJc0FyZ3MpCnJldHVybiBmYWxzZTtpZihhSXNBcmdzKXthPXBTbGljZS5jYWxsKGEpO2I9cFNsaWNlLmNhbGwoYik7cmV0dXJuIF9kZWVwRXF1YWwoYSxiLHN0cmljdCk7fQp2YXIga2E9b2JqZWN0S2V5cyhhKTt2YXIga2I9b2JqZWN0S2V5cyhiKTt2YXIga2V5LGk7aWYoa2EubGVuZ3RoIT09a2IubGVuZ3RoKQpyZXR1cm4gZmFsc2U7a2Euc29ydCgpO2tiLnNvcnQoKTtmb3IoaT1rYS5sZW5ndGgtMTtpPj0wO2ktLSl7aWYoa2FbaV0hPT1rYltpXSkKcmV0dXJuIGZhbHNlO30KZm9yKGk9a2EubGVuZ3RoLTE7aT49MDtpLS0pe2tleT1rYVtpXTtpZighX2RlZXBFcXVhbChhW2tleV0sYltrZXldLHN0cmljdCxhY3R1YWxWaXNpdGVkT2JqZWN0cykpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30KYXNzZXJ0Lm5vdERlZXBFcXVhbD1mdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKF9kZWVwRXF1YWwoYWN0dWFsLGV4cGVjdGVkLGZhbHNlKSl7ZmFpbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSwnbm90RGVlcEVxdWFsJyxhc3NlcnQubm90RGVlcEVxdWFsKTt9fTthc3NlcnQubm90RGVlcFN0cmljdEVxdWFsPW5vdERlZXBTdHJpY3RFcXVhbDtmdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKF9kZWVwRXF1YWwoYWN0dWFsLGV4cGVjdGVkLHRydWUpKXtmYWlsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlLCdub3REZWVwU3RyaWN0RXF1YWwnLG5vdERlZXBTdHJpY3RFcXVhbCk7fX0KYXNzZXJ0LnN0cmljdEVxdWFsPWZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZihhY3R1YWwhPT1leHBlY3RlZCl7ZmFpbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSwnPT09Jyxhc3NlcnQuc3RyaWN0RXF1YWwpO319O2Fzc2VydC5ub3RTdHJpY3RFcXVhbD1mdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSl7aWYoYWN0dWFsPT09ZXhwZWN0ZWQpe2ZhaWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2UsJyE9PScsYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTt9fTtmdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsZXhwZWN0ZWQpe2lmKCFhY3R1YWx8fCFleHBlY3RlZCl7cmV0dXJuIGZhbHNlO30KaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKT09J1tvYmplY3QgUmVnRXhwXScpe3JldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7fQp0cnl7aWYoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpe3JldHVybiB0cnVlO319Y2F0Y2goZSl7fQppZihFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSl7cmV0dXJuIGZhbHNlO30KcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sYWN0dWFsKT09PXRydWU7fQpmdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spe3ZhciBlcnJvcjt0cnl7YmxvY2soKTt9Y2F0Y2goZSl7ZXJyb3I9ZTt9CnJldHVybiBlcnJvcjt9CmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csYmxvY2ssZXhwZWN0ZWQsbWVzc2FnZSl7dmFyIGFjdHVhbDtpZih0eXBlb2YgYmxvY2shPT0nZnVuY3Rpb24nKXt0aHJvdyBuZXcgVHlwZUVycm9yKCciYmxvY2siIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO30KaWYodHlwZW9mIGV4cGVjdGVkPT09J3N0cmluZycpe21lc3NhZ2U9ZXhwZWN0ZWQ7ZXhwZWN0ZWQ9bnVsbDt9CmFjdHVhbD1fdHJ5QmxvY2soYmxvY2spO21lc3NhZ2U9KGV4cGVjdGVkJiZleHBlY3RlZC5uYW1lPycgKCcrZXhwZWN0ZWQubmFtZSsnKS4nOicuJykrKG1lc3NhZ2U/JyAnK21lc3NhZ2U6Jy4nKTtpZihzaG91bGRUaHJvdyYmIWFjdHVhbCl7ZmFpbChhY3R1YWwsZXhwZWN0ZWQsJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyttZXNzYWdlKTt9CnZhciB1c2VyUHJvdmlkZWRNZXNzYWdlPXR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyc7dmFyIGlzVW53YW50ZWRFeGNlcHRpb249IXNob3VsZFRocm93JiZ1dGlsLmlzRXJyb3IoYWN0dWFsKTt2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uPSFzaG91bGRUaHJvdyYmYWN0dWFsJiYhZXhwZWN0ZWQ7aWYoaXNVbndhbnRlZEV4Y2VwdGlvbiYmdXNlclByb3ZpZGVkTWVzc2FnZSYmZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLGV4cGVjdGVkKXx8aXNVbmV4cGVjdGVkRXhjZXB0aW9uKXtmYWlsKGFjdHVhbCxleHBlY3RlZCwnR290IHVud2FudGVkIGV4Y2VwdGlvbicrbWVzc2FnZSk7fQppZihzaG91bGRUaHJvdyYmYWN0dWFsJiZleHBlY3RlZCYmIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCxleHBlY3RlZCl8fCFzaG91bGRUaHJvdyYmYWN0dWFsKXt0aHJvdyBhY3R1YWw7fX0KYXNzZXJ0LnRocm93cz1mdW5jdGlvbihibG9jayxlcnJvcixtZXNzYWdlKXtfdGhyb3dzKHRydWUsYmxvY2ssZXJyb3IsbWVzc2FnZSk7fTthc3NlcnQuZG9lc05vdFRocm93PWZ1bmN0aW9uKGJsb2NrLGVycm9yLG1lc3NhZ2Upe190aHJvd3MoZmFsc2UsYmxvY2ssZXJyb3IsbWVzc2FnZSk7fTthc3NlcnQuaWZFcnJvcj1mdW5jdGlvbihlcnIpe2lmKGVycil0aHJvdyBlcnI7fTt2YXIgb2JqZWN0S2V5cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ob2JqKXt2YXIga2V5cz1bXTtmb3IodmFyIGtleSBpbiBvYmope2lmKGhhc093bi5jYWxsKG9iaixrZXkpKWtleXMucHVzaChrZXkpO30KcmV0dXJuIGtleXM7fTt9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7InV0aWwvIjo5N31dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7ZXhwb3J0cy5ieXRlTGVuZ3RoPWJ5dGVMZW5ndGg7ZXhwb3J0cy50b0J5dGVBcnJheT10b0J5dGVBcnJheTtleHBvcnRzLmZyb21CeXRlQXJyYXk9ZnJvbUJ5dGVBcnJheTt2YXIgbG9va3VwPVtdO3ZhciByZXZMb29rdXA9W107dmFyIEFycj10eXBlb2YgVWludDhBcnJheSE9PSd1bmRlZmluZWQnP1VpbnQ4QXJyYXk6QXJyYXk7dmFyIGNvZGU9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO2Zvcih2YXIgaT0wLGxlbj1jb2RlLmxlbmd0aDtpPGxlbjsrK2kpe2xvb2t1cFtpXT1jb2RlW2ldO3Jldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldPWk7fQpyZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldPTYyO3Jldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV09NjM7ZnVuY3Rpb24gZ2V0TGVucyhiNjQpe3ZhciBsZW49YjY0Lmxlbmd0aDtpZihsZW4lND4wKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKTt9CnZhciB2YWxpZExlbj1iNjQuaW5kZXhPZignPScpO2lmKHZhbGlkTGVuPT09LTEpdmFsaWRMZW49bGVuO3ZhciBwbGFjZUhvbGRlcnNMZW49dmFsaWRMZW49PT1sZW4/MDo0LXZhbGlkTGVuJTQ7cmV0dXJuW3ZhbGlkTGVuLHBsYWNlSG9sZGVyc0xlbl07fQpmdW5jdGlvbiBieXRlTGVuZ3RoKGI2NCl7dmFyIGxlbnM9Z2V0TGVucyhiNjQpO3ZhciB2YWxpZExlbj1sZW5zWzBdO3ZhciBwbGFjZUhvbGRlcnNMZW49bGVuc1sxXTtyZXR1cm4odmFsaWRMZW4rcGxhY2VIb2xkZXJzTGVuKSozLzQtcGxhY2VIb2xkZXJzTGVuO30KZnVuY3Rpb24gX2J5dGVMZW5ndGgoYjY0LHZhbGlkTGVuLHBsYWNlSG9sZGVyc0xlbil7cmV0dXJuKHZhbGlkTGVuK3BsYWNlSG9sZGVyc0xlbikqMy80LXBsYWNlSG9sZGVyc0xlbjt9CmZ1bmN0aW9uIHRvQnl0ZUFycmF5KGI2NCl7dmFyIHRtcDt2YXIgbGVucz1nZXRMZW5zKGI2NCk7dmFyIHZhbGlkTGVuPWxlbnNbMF07dmFyIHBsYWNlSG9sZGVyc0xlbj1sZW5zWzFdO3ZhciBhcnI9bmV3IEFycihfYnl0ZUxlbmd0aChiNjQsdmFsaWRMZW4scGxhY2VIb2xkZXJzTGVuKSk7dmFyIGN1ckJ5dGU9MDt2YXIgbGVuPXBsYWNlSG9sZGVyc0xlbj4wP3ZhbGlkTGVuLTQ6dmFsaWRMZW47Zm9yKHZhciBpPTA7aTxsZW47aSs9NCl7dG1wPXJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV08PDE4fHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzEpXTw8MTJ8cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkrMildPDw2fHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzMpXTthcnJbY3VyQnl0ZSsrXT10bXA+PjE2JjB4RkY7YXJyW2N1ckJ5dGUrK109dG1wPj44JjB4RkY7YXJyW2N1ckJ5dGUrK109dG1wJjB4RkY7fQppZihwbGFjZUhvbGRlcnNMZW49PT0yKXt0bXA9cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXTw8MnxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsxKV0+PjQ7YXJyW2N1ckJ5dGUrK109dG1wJjB4RkY7fQppZihwbGFjZUhvbGRlcnNMZW49PT0xKXt0bXA9cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXTw8MTB8cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkrMSldPDw0fHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzIpXT4+MjthcnJbY3VyQnl0ZSsrXT10bXA+PjgmMHhGRjthcnJbY3VyQnl0ZSsrXT10bXAmMHhGRjt9CnJldHVybiBhcnI7fQpmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQobnVtKXtyZXR1cm4gbG9va3VwW251bT4+MTgmMHgzRl0rCmxvb2t1cFtudW0+PjEyJjB4M0ZdKwpsb29rdXBbbnVtPj42JjB4M0ZdKwpsb29rdXBbbnVtJjB4M0ZdO30KZnVuY3Rpb24gZW5jb2RlQ2h1bmsodWludDgsc3RhcnQsZW5kKXt2YXIgdG1wO3ZhciBvdXRwdXQ9W107Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kO2krPTMpe3RtcD0odWludDhbaV08PDE2JjB4RkYwMDAwKSsodWludDhbaSsxXTw8OCYweEZGMDApKyh1aW50OFtpKzJdJjB4RkYpO291dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKTt9CnJldHVybiBvdXRwdXQuam9pbignJyk7fQpmdW5jdGlvbiBmcm9tQnl0ZUFycmF5KHVpbnQ4KXt2YXIgdG1wO3ZhciBsZW49dWludDgubGVuZ3RoO3ZhciBleHRyYUJ5dGVzPWxlbiUzO3ZhciBwYXJ0cz1bXTt2YXIgbWF4Q2h1bmtMZW5ndGg9MTYzODM7Zm9yKHZhciBpPTAsbGVuMj1sZW4tZXh0cmFCeXRlcztpPGxlbjI7aSs9bWF4Q2h1bmtMZW5ndGgpe3BhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsaSxpK21heENodW5rTGVuZ3RoPmxlbjI/bGVuMjppK21heENodW5rTGVuZ3RoKSk7fQppZihleHRyYUJ5dGVzPT09MSl7dG1wPXVpbnQ4W2xlbi0xXTtwYXJ0cy5wdXNoKGxvb2t1cFt0bXA+PjJdKwpsb29rdXBbdG1wPDw0JjB4M0ZdKyc9PScpO31lbHNlIGlmKGV4dHJhQnl0ZXM9PT0yKXt0bXA9KHVpbnQ4W2xlbi0yXTw8OCkrdWludDhbbGVuLTFdO3BhcnRzLnB1c2gobG9va3VwW3RtcD4+MTBdKwpsb29rdXBbdG1wPj40JjB4M0ZdKwpsb29rdXBbdG1wPDwyJjB4M0ZdKyc9Jyk7fQpyZXR1cm4gcGFydHMuam9pbignJyk7fX0se31dLDU1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt9LHt9XSw1NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3MsQnVmZmVyKXsndXNlIHN0cmljdCc7dmFyIGFzc2VydD1yZXF1aXJlKCdhc3NlcnQnKTt2YXIgWnN0cmVhbT1yZXF1aXJlKCdwYWtvL2xpYi96bGliL3pzdHJlYW0nKTt2YXIgemxpYl9kZWZsYXRlPXJlcXVpcmUoJ3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcycpO3ZhciB6bGliX2luZmxhdGU9cmVxdWlyZSgncGFrby9saWIvemxpYi9pbmZsYXRlLmpzJyk7dmFyIGNvbnN0YW50cz1yZXF1aXJlKCdwYWtvL2xpYi96bGliL2NvbnN0YW50cycpO2Zvcih2YXIga2V5IGluIGNvbnN0YW50cyl7ZXhwb3J0c1trZXldPWNvbnN0YW50c1trZXldO30KZXhwb3J0cy5OT05FPTA7ZXhwb3J0cy5ERUZMQVRFPTE7ZXhwb3J0cy5JTkZMQVRFPTI7ZXhwb3J0cy5HWklQPTM7ZXhwb3J0cy5HVU5aSVA9NDtleHBvcnRzLkRFRkxBVEVSQVc9NTtleHBvcnRzLklORkxBVEVSQVc9NjtleHBvcnRzLlVOWklQPTc7dmFyIEdaSVBfSEVBREVSX0lEMT0weDFmO3ZhciBHWklQX0hFQURFUl9JRDI9MHg4YjtmdW5jdGlvbiBabGliKG1vZGUpe2lmKHR5cGVvZiBtb2RlIT09J251bWJlcid8fG1vZGU8ZXhwb3J0cy5ERUZMQVRFfHxtb2RlPmV4cG9ydHMuVU5aSVApe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0JhZCBhcmd1bWVudCcpO30KdGhpcy5kaWN0aW9uYXJ5PW51bGw7dGhpcy5lcnI9MDt0aGlzLmZsdXNoPTA7dGhpcy5pbml0X2RvbmU9ZmFsc2U7dGhpcy5sZXZlbD0wO3RoaXMubWVtTGV2ZWw9MDt0aGlzLm1vZGU9bW9kZTt0aGlzLnN0cmF0ZWd5PTA7dGhpcy53aW5kb3dCaXRzPTA7dGhpcy53cml0ZV9pbl9wcm9ncmVzcz1mYWxzZTt0aGlzLnBlbmRpbmdfY2xvc2U9ZmFsc2U7dGhpcy5nemlwX2lkX2J5dGVzX3JlYWQ9MDt9ClpsaWIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYodGhpcy53cml0ZV9pbl9wcm9ncmVzcyl7dGhpcy5wZW5kaW5nX2Nsb3NlPXRydWU7cmV0dXJuO30KdGhpcy5wZW5kaW5nX2Nsb3NlPWZhbHNlO2Fzc2VydCh0aGlzLmluaXRfZG9uZSwnY2xvc2UgYmVmb3JlIGluaXQnKTthc3NlcnQodGhpcy5tb2RlPD1leHBvcnRzLlVOWklQKTtpZih0aGlzLm1vZGU9PT1leHBvcnRzLkRFRkxBVEV8fHRoaXMubW9kZT09PWV4cG9ydHMuR1pJUHx8dGhpcy5tb2RlPT09ZXhwb3J0cy5ERUZMQVRFUkFXKXt6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO31lbHNlIGlmKHRoaXMubW9kZT09PWV4cG9ydHMuSU5GTEFURXx8dGhpcy5tb2RlPT09ZXhwb3J0cy5HVU5aSVB8fHRoaXMubW9kZT09PWV4cG9ydHMuSU5GTEFURVJBV3x8dGhpcy5tb2RlPT09ZXhwb3J0cy5VTlpJUCl7emxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTt9CnRoaXMubW9kZT1leHBvcnRzLk5PTkU7dGhpcy5kaWN0aW9uYXJ5PW51bGw7fTtabGliLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihmbHVzaCxpbnB1dCxpbl9vZmYsaW5fbGVuLG91dCxvdXRfb2ZmLG91dF9sZW4pe3JldHVybiB0aGlzLl93cml0ZSh0cnVlLGZsdXNoLGlucHV0LGluX29mZixpbl9sZW4sb3V0LG91dF9vZmYsb3V0X2xlbik7fTtabGliLnByb3RvdHlwZS53cml0ZVN5bmM9ZnVuY3Rpb24oZmx1c2gsaW5wdXQsaW5fb2ZmLGluX2xlbixvdXQsb3V0X29mZixvdXRfbGVuKXtyZXR1cm4gdGhpcy5fd3JpdGUoZmFsc2UsZmx1c2gsaW5wdXQsaW5fb2ZmLGluX2xlbixvdXQsb3V0X29mZixvdXRfbGVuKTt9O1psaWIucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihhc3luYyxmbHVzaCxpbnB1dCxpbl9vZmYsaW5fbGVuLG91dCxvdXRfb2ZmLG91dF9sZW4pe2Fzc2VydC5lcXVhbChhcmd1bWVudHMubGVuZ3RoLDgpO2Fzc2VydCh0aGlzLmluaXRfZG9uZSwnd3JpdGUgYmVmb3JlIGluaXQnKTthc3NlcnQodGhpcy5tb2RlIT09ZXhwb3J0cy5OT05FLCdhbHJlYWR5IGZpbmFsaXplZCcpO2Fzc2VydC5lcXVhbChmYWxzZSx0aGlzLndyaXRlX2luX3Byb2dyZXNzLCd3cml0ZSBhbHJlYWR5IGluIHByb2dyZXNzJyk7YXNzZXJ0LmVxdWFsKGZhbHNlLHRoaXMucGVuZGluZ19jbG9zZSwnY2xvc2UgaXMgcGVuZGluZycpO3RoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9dHJ1ZTthc3NlcnQuZXF1YWwoZmFsc2UsZmx1c2g9PT11bmRlZmluZWQsJ211c3QgcHJvdmlkZSBmbHVzaCB2YWx1ZScpO3RoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9dHJ1ZTtpZihmbHVzaCE9PWV4cG9ydHMuWl9OT19GTFVTSCYmZmx1c2ghPT1leHBvcnRzLlpfUEFSVElBTF9GTFVTSCYmZmx1c2ghPT1leHBvcnRzLlpfU1lOQ19GTFVTSCYmZmx1c2ghPT1leHBvcnRzLlpfRlVMTF9GTFVTSCYmZmx1c2ghPT1leHBvcnRzLlpfRklOSVNIJiZmbHVzaCE9PWV4cG9ydHMuWl9CTE9DSyl7dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZsdXNoIHZhbHVlJyk7fQppZihpbnB1dD09bnVsbCl7aW5wdXQ9QnVmZmVyLmFsbG9jKDApO2luX2xlbj0wO2luX29mZj0wO30KdGhpcy5zdHJtLmF2YWlsX2luPWluX2xlbjt0aGlzLnN0cm0uaW5wdXQ9aW5wdXQ7dGhpcy5zdHJtLm5leHRfaW49aW5fb2ZmO3RoaXMuc3RybS5hdmFpbF9vdXQ9b3V0X2xlbjt0aGlzLnN0cm0ub3V0cHV0PW91dDt0aGlzLnN0cm0ubmV4dF9vdXQ9b3V0X29mZjt0aGlzLmZsdXNoPWZsdXNoO2lmKCFhc3luYyl7dGhpcy5fcHJvY2VzcygpO2lmKHRoaXMuX2NoZWNrRXJyb3IoKSl7cmV0dXJuIHRoaXMuX2FmdGVyU3luYygpO30KcmV0dXJuO30KdmFyIHNlbGY9dGhpcztwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7c2VsZi5fcHJvY2VzcygpO3NlbGYuX2FmdGVyKCk7fSk7cmV0dXJuIHRoaXM7fTtabGliLnByb3RvdHlwZS5fYWZ0ZXJTeW5jPWZ1bmN0aW9uKCl7dmFyIGF2YWlsX291dD10aGlzLnN0cm0uYXZhaWxfb3V0O3ZhciBhdmFpbF9pbj10aGlzLnN0cm0uYXZhaWxfaW47dGhpcy53cml0ZV9pbl9wcm9ncmVzcz1mYWxzZTtyZXR1cm5bYXZhaWxfaW4sYXZhaWxfb3V0XTt9O1psaWIucHJvdG90eXBlLl9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGU9bnVsbDtzd2l0Y2godGhpcy5tb2RlKXtjYXNlIGV4cG9ydHMuREVGTEFURTpjYXNlIGV4cG9ydHMuR1pJUDpjYXNlIGV4cG9ydHMuREVGTEFURVJBVzp0aGlzLmVycj16bGliX2RlZmxhdGUuZGVmbGF0ZSh0aGlzLnN0cm0sdGhpcy5mbHVzaCk7YnJlYWs7Y2FzZSBleHBvcnRzLlVOWklQOmlmKHRoaXMuc3RybS5hdmFpbF9pbj4wKXtuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlPXRoaXMuc3RybS5uZXh0X2luO30Kc3dpdGNoKHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkKXtjYXNlIDA6aWYobmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZT09PW51bGwpe2JyZWFrO30KaWYodGhpcy5zdHJtLmlucHV0W25leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGVdPT09R1pJUF9IRUFERVJfSUQxKXt0aGlzLmd6aXBfaWRfYnl0ZXNfcmVhZD0xO25leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUrKztpZih0aGlzLnN0cm0uYXZhaWxfaW49PT0xKXticmVhazt9fWVsc2V7dGhpcy5tb2RlPWV4cG9ydHMuSU5GTEFURTticmVhazt9CmNhc2UgMTppZihuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlPT09bnVsbCl7YnJlYWs7fQppZih0aGlzLnN0cm0uaW5wdXRbbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZV09PT1HWklQX0hFQURFUl9JRDIpe3RoaXMuZ3ppcF9pZF9ieXRlc19yZWFkPTI7dGhpcy5tb2RlPWV4cG9ydHMuR1VOWklQO31lbHNle3RoaXMubW9kZT1leHBvcnRzLklORkxBVEU7fQpicmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcignaW52YWxpZCBudW1iZXIgb2YgZ3ppcCBtYWdpYyBudW1iZXIgYnl0ZXMgcmVhZCcpO30KY2FzZSBleHBvcnRzLklORkxBVEU6Y2FzZSBleHBvcnRzLkdVTlpJUDpjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzp0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sdGhpcy5mbHVzaCk7aWYodGhpcy5lcnI9PT1leHBvcnRzLlpfTkVFRF9ESUNUJiZ0aGlzLmRpY3Rpb25hcnkpe3RoaXMuZXJyPXpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdGhpcy5kaWN0aW9uYXJ5KTtpZih0aGlzLmVycj09PWV4cG9ydHMuWl9PSyl7dGhpcy5lcnI9emxpYl9pbmZsYXRlLmluZmxhdGUodGhpcy5zdHJtLHRoaXMuZmx1c2gpO31lbHNlIGlmKHRoaXMuZXJyPT09ZXhwb3J0cy5aX0RBVEFfRVJST1Ipe3RoaXMuZXJyPWV4cG9ydHMuWl9ORUVEX0RJQ1Q7fX0Kd2hpbGUodGhpcy5zdHJtLmF2YWlsX2luPjAmJnRoaXMubW9kZT09PWV4cG9ydHMuR1VOWklQJiZ0aGlzLmVycj09PWV4cG9ydHMuWl9TVFJFQU1fRU5EJiZ0aGlzLnN0cm0ubmV4dF9pblswXSE9PTB4MDApe3RoaXMucmVzZXQoKTt0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sdGhpcy5mbHVzaCk7fQpicmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcrdGhpcy5tb2RlKTt9fTtabGliLnByb3RvdHlwZS5fY2hlY2tFcnJvcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLmVycil7Y2FzZSBleHBvcnRzLlpfT0s6Y2FzZSBleHBvcnRzLlpfQlVGX0VSUk9SOmlmKHRoaXMuc3RybS5hdmFpbF9vdXQhPT0wJiZ0aGlzLmZsdXNoPT09ZXhwb3J0cy5aX0ZJTklTSCl7dGhpcy5fZXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGZpbGUnKTtyZXR1cm4gZmFsc2U7fQpicmVhaztjYXNlIGV4cG9ydHMuWl9TVFJFQU1fRU5EOmJyZWFrO2Nhc2UgZXhwb3J0cy5aX05FRURfRElDVDppZih0aGlzLmRpY3Rpb25hcnk9PW51bGwpe3RoaXMuX2Vycm9yKCdNaXNzaW5nIGRpY3Rpb25hcnknKTt9ZWxzZXt0aGlzLl9lcnJvcignQmFkIGRpY3Rpb25hcnknKTt9CnJldHVybiBmYWxzZTtkZWZhdWx0OnRoaXMuX2Vycm9yKCdabGliIGVycm9yJyk7cmV0dXJuIGZhbHNlO30KcmV0dXJuIHRydWU7fTtabGliLnByb3RvdHlwZS5fYWZ0ZXI9ZnVuY3Rpb24oKXtpZighdGhpcy5fY2hlY2tFcnJvcigpKXtyZXR1cm47fQp2YXIgYXZhaWxfb3V0PXRoaXMuc3RybS5hdmFpbF9vdXQ7dmFyIGF2YWlsX2luPXRoaXMuc3RybS5hdmFpbF9pbjt0aGlzLndyaXRlX2luX3Byb2dyZXNzPWZhbHNlO3RoaXMuY2FsbGJhY2soYXZhaWxfaW4sYXZhaWxfb3V0KTtpZih0aGlzLnBlbmRpbmdfY2xvc2Upe3RoaXMuY2xvc2UoKTt9fTtabGliLnByb3RvdHlwZS5fZXJyb3I9ZnVuY3Rpb24obWVzc2FnZSl7aWYodGhpcy5zdHJtLm1zZyl7bWVzc2FnZT10aGlzLnN0cm0ubXNnO30KdGhpcy5vbmVycm9yKG1lc3NhZ2UsdGhpcy5lcnIpO3RoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9ZmFsc2U7aWYodGhpcy5wZW5kaW5nX2Nsb3NlKXt0aGlzLmNsb3NlKCk7fX07WmxpYi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih3aW5kb3dCaXRzLGxldmVsLG1lbUxldmVsLHN0cmF0ZWd5LGRpY3Rpb25hcnkpe2Fzc2VydChhcmd1bWVudHMubGVuZ3RoPT09NHx8YXJndW1lbnRzLmxlbmd0aD09PTUsJ2luaXQod2luZG93Qml0cywgbGV2ZWwsIG1lbUxldmVsLCBzdHJhdGVneSwgW2RpY3Rpb25hcnldKScpO2Fzc2VydCh3aW5kb3dCaXRzPj04JiZ3aW5kb3dCaXRzPD0xNSwnaW52YWxpZCB3aW5kb3dCaXRzJyk7YXNzZXJ0KGxldmVsPj0tMSYmbGV2ZWw8PTksJ2ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWwnKTthc3NlcnQobWVtTGV2ZWw+PTEmJm1lbUxldmVsPD05LCdpbnZhbGlkIG1lbWxldmVsJyk7YXNzZXJ0KHN0cmF0ZWd5PT09ZXhwb3J0cy5aX0ZJTFRFUkVEfHxzdHJhdGVneT09PWV4cG9ydHMuWl9IVUZGTUFOX09OTFl8fHN0cmF0ZWd5PT09ZXhwb3J0cy5aX1JMRXx8c3RyYXRlZ3k9PT1leHBvcnRzLlpfRklYRUR8fHN0cmF0ZWd5PT09ZXhwb3J0cy5aX0RFRkFVTFRfU1RSQVRFR1ksJ2ludmFsaWQgc3RyYXRlZ3knKTt0aGlzLl9pbml0KGxldmVsLHdpbmRvd0JpdHMsbWVtTGV2ZWwsc3RyYXRlZ3ksZGljdGlvbmFyeSk7dGhpcy5fc2V0RGljdGlvbmFyeSgpO307WmxpYi5wcm90b3R5cGUucGFyYW1zPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCdkZWZsYXRlUGFyYW1zIE5vdCBzdXBwb3J0ZWQnKTt9O1psaWIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXQoKTt0aGlzLl9zZXREaWN0aW9uYXJ5KCk7fTtabGliLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihsZXZlbCx3aW5kb3dCaXRzLG1lbUxldmVsLHN0cmF0ZWd5LGRpY3Rpb25hcnkpe3RoaXMubGV2ZWw9bGV2ZWw7dGhpcy53aW5kb3dCaXRzPXdpbmRvd0JpdHM7dGhpcy5tZW1MZXZlbD1tZW1MZXZlbDt0aGlzLnN0cmF0ZWd5PXN0cmF0ZWd5O3RoaXMuZmx1c2g9ZXhwb3J0cy5aX05PX0ZMVVNIO3RoaXMuZXJyPWV4cG9ydHMuWl9PSztpZih0aGlzLm1vZGU9PT1leHBvcnRzLkdaSVB8fHRoaXMubW9kZT09PWV4cG9ydHMuR1VOWklQKXt0aGlzLndpbmRvd0JpdHMrPTE2O30KaWYodGhpcy5tb2RlPT09ZXhwb3J0cy5VTlpJUCl7dGhpcy53aW5kb3dCaXRzKz0zMjt9CmlmKHRoaXMubW9kZT09PWV4cG9ydHMuREVGTEFURVJBV3x8dGhpcy5tb2RlPT09ZXhwb3J0cy5JTkZMQVRFUkFXKXt0aGlzLndpbmRvd0JpdHM9LTEqdGhpcy53aW5kb3dCaXRzO30KdGhpcy5zdHJtPW5ldyBac3RyZWFtKCk7c3dpdGNoKHRoaXMubW9kZSl7Y2FzZSBleHBvcnRzLkRFRkxBVEU6Y2FzZSBleHBvcnRzLkdaSVA6Y2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6dGhpcy5lcnI9emxpYl9kZWZsYXRlLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdGhpcy5sZXZlbCxleHBvcnRzLlpfREVGTEFURUQsdGhpcy53aW5kb3dCaXRzLHRoaXMubWVtTGV2ZWwsdGhpcy5zdHJhdGVneSk7YnJlYWs7Y2FzZSBleHBvcnRzLklORkxBVEU6Y2FzZSBleHBvcnRzLkdVTlpJUDpjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpjYXNlIGV4cG9ydHMuVU5aSVA6dGhpcy5lcnI9emxpYl9pbmZsYXRlLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdGhpcy53aW5kb3dCaXRzKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcrdGhpcy5tb2RlKTt9CmlmKHRoaXMuZXJyIT09ZXhwb3J0cy5aX09LKXt0aGlzLl9lcnJvcignSW5pdCBlcnJvcicpO30KdGhpcy5kaWN0aW9uYXJ5PWRpY3Rpb25hcnk7dGhpcy53cml0ZV9pbl9wcm9ncmVzcz1mYWxzZTt0aGlzLmluaXRfZG9uZT10cnVlO307WmxpYi5wcm90b3R5cGUuX3NldERpY3Rpb25hcnk9ZnVuY3Rpb24oKXtpZih0aGlzLmRpY3Rpb25hcnk9PW51bGwpe3JldHVybjt9CnRoaXMuZXJyPWV4cG9ydHMuWl9PSztzd2l0Y2godGhpcy5tb2RlKXtjYXNlIGV4cG9ydHMuREVGTEFURTpjYXNlIGV4cG9ydHMuREVGTEFURVJBVzp0aGlzLmVycj16bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHRoaXMuZGljdGlvbmFyeSk7YnJlYWs7ZGVmYXVsdDpicmVhazt9CmlmKHRoaXMuZXJyIT09ZXhwb3J0cy5aX09LKXt0aGlzLl9lcnJvcignRmFpbGVkIHRvIHNldCBkaWN0aW9uYXJ5Jyk7fX07WmxpYi5wcm90b3R5cGUuX3Jlc2V0PWZ1bmN0aW9uKCl7dGhpcy5lcnI9ZXhwb3J0cy5aX09LO3N3aXRjaCh0aGlzLm1vZGUpe2Nhc2UgZXhwb3J0cy5ERUZMQVRFOmNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOmNhc2UgZXhwb3J0cy5HWklQOnRoaXMuZXJyPXpsaWJfZGVmbGF0ZS5kZWZsYXRlUmVzZXQodGhpcy5zdHJtKTticmVhaztjYXNlIGV4cG9ydHMuSU5GTEFURTpjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpjYXNlIGV4cG9ydHMuR1VOWklQOnRoaXMuZXJyPXpsaWJfaW5mbGF0ZS5pbmZsYXRlUmVzZXQodGhpcy5zdHJtKTticmVhaztkZWZhdWx0OmJyZWFrO30KaWYodGhpcy5lcnIhPT1leHBvcnRzLlpfT0spe3RoaXMuX2Vycm9yKCdGYWlsZWQgdG8gcmVzZXQgc3RyZWFtJyk7fX07ZXhwb3J0cy5abGliPVpsaWI7fSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykscmVxdWlyZSgiYnVmZmVyIikuQnVmZmVyKTt9LHsiX3Byb2Nlc3MiOjc3LCJhc3NlcnQiOjUzLCJidWZmZXIiOjYwLCJwYWtvL2xpYi96bGliL2NvbnN0YW50cyI6NjksInBha28vbGliL3psaWIvZGVmbGF0ZS5qcyI6NzEsInBha28vbGliL3psaWIvaW5mbGF0ZS5qcyI6NTgsInBha28vbGliL3psaWIvenN0cmVhbSI6NzR9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpeyd1c2Ugc3RyaWN0Jzt2YXIgQnVmZmVyPXJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjt2YXIgVHJhbnNmb3JtPXJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTt2YXIgYmluZGluZz1yZXF1aXJlKCcuL2JpbmRpbmcnKTt2YXIgdXRpbD1yZXF1aXJlKCd1dGlsJyk7dmFyIGFzc2VydD1yZXF1aXJlKCdhc3NlcnQnKS5vazt2YXIga01heExlbmd0aD1yZXF1aXJlKCdidWZmZXInKS5rTWF4TGVuZ3RoO3ZhciBrUmFuZ2VFcnJvck1lc3NhZ2U9J0Nhbm5vdCBjcmVhdGUgZmluYWwgQnVmZmVyLiBJdCB3b3VsZCBiZSBsYXJnZXIgJysndGhhbiAweCcra01heExlbmd0aC50b1N0cmluZygxNikrJyBieXRlcyc7YmluZGluZy5aX01JTl9XSU5ET1dCSVRTPTg7YmluZGluZy5aX01BWF9XSU5ET1dCSVRTPTE1O2JpbmRpbmcuWl9ERUZBVUxUX1dJTkRPV0JJVFM9MTU7YmluZGluZy5aX01JTl9DSFVOSz02NDtiaW5kaW5nLlpfTUFYX0NIVU5LPUluZmluaXR5O2JpbmRpbmcuWl9ERUZBVUxUX0NIVU5LPTE2KjEwMjQ7YmluZGluZy5aX01JTl9NRU1MRVZFTD0xO2JpbmRpbmcuWl9NQVhfTUVNTEVWRUw9OTtiaW5kaW5nLlpfREVGQVVMVF9NRU1MRVZFTD04O2JpbmRpbmcuWl9NSU5fTEVWRUw9LTE7YmluZGluZy5aX01BWF9MRVZFTD05O2JpbmRpbmcuWl9ERUZBVUxUX0xFVkVMPWJpbmRpbmcuWl9ERUZBVUxUX0NPTVBSRVNTSU9OO3ZhciBia2V5cz1PYmplY3Qua2V5cyhiaW5kaW5nKTtmb3IodmFyIGJrPTA7Yms8YmtleXMubGVuZ3RoO2JrKyspe3ZhciBia2V5PWJrZXlzW2JrXTtpZihia2V5Lm1hdGNoKC9eWi8pKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxia2V5LHtlbnVtZXJhYmxlOnRydWUsdmFsdWU6YmluZGluZ1tia2V5XSx3cml0YWJsZTpmYWxzZX0pO319CnZhciBjb2Rlcz17Wl9PSzpiaW5kaW5nLlpfT0ssWl9TVFJFQU1fRU5EOmJpbmRpbmcuWl9TVFJFQU1fRU5ELFpfTkVFRF9ESUNUOmJpbmRpbmcuWl9ORUVEX0RJQ1QsWl9FUlJOTzpiaW5kaW5nLlpfRVJSTk8sWl9TVFJFQU1fRVJST1I6YmluZGluZy5aX1NUUkVBTV9FUlJPUixaX0RBVEFfRVJST1I6YmluZGluZy5aX0RBVEFfRVJST1IsWl9NRU1fRVJST1I6YmluZGluZy5aX01FTV9FUlJPUixaX0JVRl9FUlJPUjpiaW5kaW5nLlpfQlVGX0VSUk9SLFpfVkVSU0lPTl9FUlJPUjpiaW5kaW5nLlpfVkVSU0lPTl9FUlJPUn07dmFyIGNrZXlzPU9iamVjdC5rZXlzKGNvZGVzKTtmb3IodmFyIGNrPTA7Y2s8Y2tleXMubGVuZ3RoO2NrKyspe3ZhciBja2V5PWNrZXlzW2NrXTtjb2Rlc1tjb2Rlc1tja2V5XV09Y2tleTt9Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCdjb2Rlcycse2VudW1lcmFibGU6dHJ1ZSx2YWx1ZTpPYmplY3QuZnJlZXplKGNvZGVzKSx3cml0YWJsZTpmYWxzZX0pO2V4cG9ydHMuRGVmbGF0ZT1EZWZsYXRlO2V4cG9ydHMuSW5mbGF0ZT1JbmZsYXRlO2V4cG9ydHMuR3ppcD1HemlwO2V4cG9ydHMuR3VuemlwPUd1bnppcDtleHBvcnRzLkRlZmxhdGVSYXc9RGVmbGF0ZVJhdztleHBvcnRzLkluZmxhdGVSYXc9SW5mbGF0ZVJhdztleHBvcnRzLlVuemlwPVVuemlwO2V4cG9ydHMuY3JlYXRlRGVmbGF0ZT1mdW5jdGlvbihvKXtyZXR1cm4gbmV3IERlZmxhdGUobyk7fTtleHBvcnRzLmNyZWF0ZUluZmxhdGU9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBJbmZsYXRlKG8pO307ZXhwb3J0cy5jcmVhdGVEZWZsYXRlUmF3PWZ1bmN0aW9uKG8pe3JldHVybiBuZXcgRGVmbGF0ZVJhdyhvKTt9O2V4cG9ydHMuY3JlYXRlSW5mbGF0ZVJhdz1mdW5jdGlvbihvKXtyZXR1cm4gbmV3IEluZmxhdGVSYXcobyk7fTtleHBvcnRzLmNyZWF0ZUd6aXA9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBHemlwKG8pO307ZXhwb3J0cy5jcmVhdGVHdW56aXA9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBHdW56aXAobyk7fTtleHBvcnRzLmNyZWF0ZVVuemlwPWZ1bmN0aW9uKG8pe3JldHVybiBuZXcgVW56aXAobyk7fTtleHBvcnRzLmRlZmxhdGU9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe2lmKHR5cGVvZiBvcHRzPT09J2Z1bmN0aW9uJyl7Y2FsbGJhY2s9b3B0cztvcHRzPXt9O30KcmV0dXJuIHpsaWJCdWZmZXIobmV3IERlZmxhdGUob3B0cyksYnVmZmVyLGNhbGxiYWNrKTt9O2V4cG9ydHMuZGVmbGF0ZVN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgRGVmbGF0ZShvcHRzKSxidWZmZXIpO307ZXhwb3J0cy5nemlwPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzLGNhbGxiYWNrKXtpZih0eXBlb2Ygb3B0cz09PSdmdW5jdGlvbicpe2NhbGxiYWNrPW9wdHM7b3B0cz17fTt9CnJldHVybiB6bGliQnVmZmVyKG5ldyBHemlwKG9wdHMpLGJ1ZmZlcixjYWxsYmFjayk7fTtleHBvcnRzLmd6aXBTeW5jPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzKXtyZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEd6aXAob3B0cyksYnVmZmVyKTt9O2V4cG9ydHMuZGVmbGF0ZVJhdz1mdW5jdGlvbihidWZmZXIsb3B0cyxjYWxsYmFjayl7aWYodHlwZW9mIG9wdHM9PT0nZnVuY3Rpb24nKXtjYWxsYmFjaz1vcHRzO29wdHM9e307fQpyZXR1cm4gemxpYkJ1ZmZlcihuZXcgRGVmbGF0ZVJhdyhvcHRzKSxidWZmZXIsY2FsbGJhY2spO307ZXhwb3J0cy5kZWZsYXRlUmF3U3luYz1mdW5jdGlvbihidWZmZXIsb3B0cyl7cmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBEZWZsYXRlUmF3KG9wdHMpLGJ1ZmZlcik7fTtleHBvcnRzLnVuemlwPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzLGNhbGxiYWNrKXtpZih0eXBlb2Ygb3B0cz09PSdmdW5jdGlvbicpe2NhbGxiYWNrPW9wdHM7b3B0cz17fTt9CnJldHVybiB6bGliQnVmZmVyKG5ldyBVbnppcChvcHRzKSxidWZmZXIsY2FsbGJhY2spO307ZXhwb3J0cy51bnppcFN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgVW56aXAob3B0cyksYnVmZmVyKTt9O2V4cG9ydHMuaW5mbGF0ZT1mdW5jdGlvbihidWZmZXIsb3B0cyxjYWxsYmFjayl7aWYodHlwZW9mIG9wdHM9PT0nZnVuY3Rpb24nKXtjYWxsYmFjaz1vcHRzO29wdHM9e307fQpyZXR1cm4gemxpYkJ1ZmZlcihuZXcgSW5mbGF0ZShvcHRzKSxidWZmZXIsY2FsbGJhY2spO307ZXhwb3J0cy5pbmZsYXRlU3luYz1mdW5jdGlvbihidWZmZXIsb3B0cyl7cmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBJbmZsYXRlKG9wdHMpLGJ1ZmZlcik7fTtleHBvcnRzLmd1bnppcD1mdW5jdGlvbihidWZmZXIsb3B0cyxjYWxsYmFjayl7aWYodHlwZW9mIG9wdHM9PT0nZnVuY3Rpb24nKXtjYWxsYmFjaz1vcHRzO29wdHM9e307fQpyZXR1cm4gemxpYkJ1ZmZlcihuZXcgR3VuemlwKG9wdHMpLGJ1ZmZlcixjYWxsYmFjayk7fTtleHBvcnRzLmd1bnppcFN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgR3VuemlwKG9wdHMpLGJ1ZmZlcik7fTtleHBvcnRzLmluZmxhdGVSYXc9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe2lmKHR5cGVvZiBvcHRzPT09J2Z1bmN0aW9uJyl7Y2FsbGJhY2s9b3B0cztvcHRzPXt9O30KcmV0dXJuIHpsaWJCdWZmZXIobmV3IEluZmxhdGVSYXcob3B0cyksYnVmZmVyLGNhbGxiYWNrKTt9O2V4cG9ydHMuaW5mbGF0ZVJhd1N5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgSW5mbGF0ZVJhdyhvcHRzKSxidWZmZXIpO307ZnVuY3Rpb24gemxpYkJ1ZmZlcihlbmdpbmUsYnVmZmVyLGNhbGxiYWNrKXt2YXIgYnVmZmVycz1bXTt2YXIgbnJlYWQ9MDtlbmdpbmUub24oJ2Vycm9yJyxvbkVycm9yKTtlbmdpbmUub24oJ2VuZCcsb25FbmQpO2VuZ2luZS5lbmQoYnVmZmVyKTtmbG93KCk7ZnVuY3Rpb24gZmxvdygpe3ZhciBjaHVuazt3aGlsZShudWxsIT09KGNodW5rPWVuZ2luZS5yZWFkKCkpKXtidWZmZXJzLnB1c2goY2h1bmspO25yZWFkKz1jaHVuay5sZW5ndGg7fQplbmdpbmUub25jZSgncmVhZGFibGUnLGZsb3cpO30KZnVuY3Rpb24gb25FcnJvcihlcnIpe2VuZ2luZS5yZW1vdmVMaXN0ZW5lcignZW5kJyxvbkVuZCk7ZW5naW5lLnJlbW92ZUxpc3RlbmVyKCdyZWFkYWJsZScsZmxvdyk7Y2FsbGJhY2soZXJyKTt9CmZ1bmN0aW9uIG9uRW5kKCl7dmFyIGJ1Zjt2YXIgZXJyPW51bGw7aWYobnJlYWQ+PWtNYXhMZW5ndGgpe2Vycj1uZXcgUmFuZ2VFcnJvcihrUmFuZ2VFcnJvck1lc3NhZ2UpO31lbHNle2J1Zj1CdWZmZXIuY29uY2F0KGJ1ZmZlcnMsbnJlYWQpO30KYnVmZmVycz1bXTtlbmdpbmUuY2xvc2UoKTtjYWxsYmFjayhlcnIsYnVmKTt9fQpmdW5jdGlvbiB6bGliQnVmZmVyU3luYyhlbmdpbmUsYnVmZmVyKXtpZih0eXBlb2YgYnVmZmVyPT09J3N0cmluZycpYnVmZmVyPUJ1ZmZlci5mcm9tKGJ1ZmZlcik7aWYoIUJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vdCBhIHN0cmluZyBvciBidWZmZXInKTt2YXIgZmx1c2hGbGFnPWVuZ2luZS5fZmluaXNoRmx1c2hGbGFnO3JldHVybiBlbmdpbmUuX3Byb2Nlc3NDaHVuayhidWZmZXIsZmx1c2hGbGFnKTt9CmZ1bmN0aW9uIERlZmxhdGUob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpcmV0dXJuIG5ldyBEZWZsYXRlKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5ERUZMQVRFKTt9CmZ1bmN0aW9uIEluZmxhdGUob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpcmV0dXJuIG5ldyBJbmZsYXRlKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5JTkZMQVRFKTt9CmZ1bmN0aW9uIEd6aXAob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgR3ppcCkpcmV0dXJuIG5ldyBHemlwKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5HWklQKTt9CmZ1bmN0aW9uIEd1bnppcChvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBHdW56aXApKXJldHVybiBuZXcgR3VuemlwKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5HVU5aSVApO30KZnVuY3Rpb24gRGVmbGF0ZVJhdyhvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlUmF3KSlyZXR1cm4gbmV3IERlZmxhdGVSYXcob3B0cyk7WmxpYi5jYWxsKHRoaXMsb3B0cyxiaW5kaW5nLkRFRkxBVEVSQVcpO30KZnVuY3Rpb24gSW5mbGF0ZVJhdyhvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlUmF3KSlyZXR1cm4gbmV3IEluZmxhdGVSYXcob3B0cyk7WmxpYi5jYWxsKHRoaXMsb3B0cyxiaW5kaW5nLklORkxBVEVSQVcpO30KZnVuY3Rpb24gVW56aXAob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgVW56aXApKXJldHVybiBuZXcgVW56aXAob3B0cyk7WmxpYi5jYWxsKHRoaXMsb3B0cyxiaW5kaW5nLlVOWklQKTt9CmZ1bmN0aW9uIGlzVmFsaWRGbHVzaEZsYWcoZmxhZyl7cmV0dXJuIGZsYWc9PT1iaW5kaW5nLlpfTk9fRkxVU0h8fGZsYWc9PT1iaW5kaW5nLlpfUEFSVElBTF9GTFVTSHx8ZmxhZz09PWJpbmRpbmcuWl9TWU5DX0ZMVVNIfHxmbGFnPT09YmluZGluZy5aX0ZVTExfRkxVU0h8fGZsYWc9PT1iaW5kaW5nLlpfRklOSVNIfHxmbGFnPT09YmluZGluZy5aX0JMT0NLO30KZnVuY3Rpb24gWmxpYihvcHRzLG1vZGUpe3ZhciBfdGhpcz10aGlzO3RoaXMuX29wdHM9b3B0cz1vcHRzfHx7fTt0aGlzLl9jaHVua1NpemU9b3B0cy5jaHVua1NpemV8fGV4cG9ydHMuWl9ERUZBVUxUX0NIVU5LO1RyYW5zZm9ybS5jYWxsKHRoaXMsb3B0cyk7aWYob3B0cy5mbHVzaCYmIWlzVmFsaWRGbHVzaEZsYWcob3B0cy5mbHVzaCkpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCBmbGFnOiAnK29wdHMuZmx1c2gpO30KaWYob3B0cy5maW5pc2hGbHVzaCYmIWlzVmFsaWRGbHVzaEZsYWcob3B0cy5maW5pc2hGbHVzaCkpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCBmbGFnOiAnK29wdHMuZmluaXNoRmx1c2gpO30KdGhpcy5fZmx1c2hGbGFnPW9wdHMuZmx1c2h8fGJpbmRpbmcuWl9OT19GTFVTSDt0aGlzLl9maW5pc2hGbHVzaEZsYWc9dHlwZW9mIG9wdHMuZmluaXNoRmx1c2ghPT0ndW5kZWZpbmVkJz9vcHRzLmZpbmlzaEZsdXNoOmJpbmRpbmcuWl9GSU5JU0g7aWYob3B0cy5jaHVua1NpemUpe2lmKG9wdHMuY2h1bmtTaXplPGV4cG9ydHMuWl9NSU5fQ0hVTkt8fG9wdHMuY2h1bmtTaXplPmV4cG9ydHMuWl9NQVhfQ0hVTkspe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBjaHVuayBzaXplOiAnK29wdHMuY2h1bmtTaXplKTt9fQppZihvcHRzLndpbmRvd0JpdHMpe2lmKG9wdHMud2luZG93Qml0czxleHBvcnRzLlpfTUlOX1dJTkRPV0JJVFN8fG9wdHMud2luZG93Qml0cz5leHBvcnRzLlpfTUFYX1dJTkRPV0JJVFMpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCB3aW5kb3dCaXRzOiAnK29wdHMud2luZG93Qml0cyk7fX0KaWYob3B0cy5sZXZlbCl7aWYob3B0cy5sZXZlbDxleHBvcnRzLlpfTUlOX0xFVkVMfHxvcHRzLmxldmVsPmV4cG9ydHMuWl9NQVhfTEVWRUwpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbDogJytvcHRzLmxldmVsKTt9fQppZihvcHRzLm1lbUxldmVsKXtpZihvcHRzLm1lbUxldmVsPGV4cG9ydHMuWl9NSU5fTUVNTEVWRUx8fG9wdHMubWVtTGV2ZWw+ZXhwb3J0cy5aX01BWF9NRU1MRVZFTCl7dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbUxldmVsOiAnK29wdHMubWVtTGV2ZWwpO319CmlmKG9wdHMuc3RyYXRlZ3kpe2lmKG9wdHMuc3RyYXRlZ3khPWV4cG9ydHMuWl9GSUxURVJFRCYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX0hVRkZNQU5fT05MWSYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX1JMRSYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX0ZJWEVEJiZvcHRzLnN0cmF0ZWd5IT1leHBvcnRzLlpfREVGQVVMVF9TVFJBVEVHWSl7dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmF0ZWd5OiAnK29wdHMuc3RyYXRlZ3kpO319CmlmKG9wdHMuZGljdGlvbmFyeSl7aWYoIUJ1ZmZlci5pc0J1ZmZlcihvcHRzLmRpY3Rpb25hcnkpKXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGljdGlvbmFyeTogaXQgc2hvdWxkIGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7fX0KdGhpcy5faGFuZGxlPW5ldyBiaW5kaW5nLlpsaWIobW9kZSk7dmFyIHNlbGY9dGhpczt0aGlzLl9oYWRFcnJvcj1mYWxzZTt0aGlzLl9oYW5kbGUub25lcnJvcj1mdW5jdGlvbihtZXNzYWdlLGVycm5vKXtfY2xvc2Uoc2VsZik7c2VsZi5faGFkRXJyb3I9dHJ1ZTt2YXIgZXJyb3I9bmV3IEVycm9yKG1lc3NhZ2UpO2Vycm9yLmVycm5vPWVycm5vO2Vycm9yLmNvZGU9ZXhwb3J0cy5jb2Rlc1tlcnJub107c2VsZi5lbWl0KCdlcnJvcicsZXJyb3IpO307dmFyIGxldmVsPWV4cG9ydHMuWl9ERUZBVUxUX0NPTVBSRVNTSU9OO2lmKHR5cGVvZiBvcHRzLmxldmVsPT09J251bWJlcicpbGV2ZWw9b3B0cy5sZXZlbDt2YXIgc3RyYXRlZ3k9ZXhwb3J0cy5aX0RFRkFVTFRfU1RSQVRFR1k7aWYodHlwZW9mIG9wdHMuc3RyYXRlZ3k9PT0nbnVtYmVyJylzdHJhdGVneT1vcHRzLnN0cmF0ZWd5O3RoaXMuX2hhbmRsZS5pbml0KG9wdHMud2luZG93Qml0c3x8ZXhwb3J0cy5aX0RFRkFVTFRfV0lORE9XQklUUyxsZXZlbCxvcHRzLm1lbUxldmVsfHxleHBvcnRzLlpfREVGQVVMVF9NRU1MRVZFTCxzdHJhdGVneSxvcHRzLmRpY3Rpb25hcnkpO3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5fY2h1bmtTaXplKTt0aGlzLl9vZmZzZXQ9MDt0aGlzLl9sZXZlbD1sZXZlbDt0aGlzLl9zdHJhdGVneT1zdHJhdGVneTt0aGlzLm9uY2UoJ2VuZCcsdGhpcy5jbG9zZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsJ19jbG9zZWQnLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hX3RoaXMuX2hhbmRsZTt9LGNvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6dHJ1ZX0pO30KdXRpbC5pbmhlcml0cyhabGliLFRyYW5zZm9ybSk7WmxpYi5wcm90b3R5cGUucGFyYW1zPWZ1bmN0aW9uKGxldmVsLHN0cmF0ZWd5LGNhbGxiYWNrKXtpZihsZXZlbDxleHBvcnRzLlpfTUlOX0xFVkVMfHxsZXZlbD5leHBvcnRzLlpfTUFYX0xFVkVMKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbDogJytsZXZlbCk7fQppZihzdHJhdGVneSE9ZXhwb3J0cy5aX0ZJTFRFUkVEJiZzdHJhdGVneSE9ZXhwb3J0cy5aX0hVRkZNQU5fT05MWSYmc3RyYXRlZ3khPWV4cG9ydHMuWl9STEUmJnN0cmF0ZWd5IT1leHBvcnRzLlpfRklYRUQmJnN0cmF0ZWd5IT1leHBvcnRzLlpfREVGQVVMVF9TVFJBVEVHWSl7dGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJhdGVneTogJytzdHJhdGVneSk7fQppZih0aGlzLl9sZXZlbCE9PWxldmVsfHx0aGlzLl9zdHJhdGVneSE9PXN0cmF0ZWd5KXt2YXIgc2VsZj10aGlzO3RoaXMuZmx1c2goYmluZGluZy5aX1NZTkNfRkxVU0gsZnVuY3Rpb24oKXthc3NlcnQoc2VsZi5faGFuZGxlLCd6bGliIGJpbmRpbmcgY2xvc2VkJyk7c2VsZi5faGFuZGxlLnBhcmFtcyhsZXZlbCxzdHJhdGVneSk7aWYoIXNlbGYuX2hhZEVycm9yKXtzZWxmLl9sZXZlbD1sZXZlbDtzZWxmLl9zdHJhdGVneT1zdHJhdGVneTtpZihjYWxsYmFjayljYWxsYmFjaygpO319KTt9ZWxzZXtwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTt9fTtabGliLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe2Fzc2VydCh0aGlzLl9oYW5kbGUsJ3psaWIgYmluZGluZyBjbG9zZWQnKTtyZXR1cm4gdGhpcy5faGFuZGxlLnJlc2V0KCk7fTtabGliLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24oY2FsbGJhY2spe3RoaXMuX3RyYW5zZm9ybShCdWZmZXIuYWxsb2MoMCksJycsY2FsbGJhY2spO307WmxpYi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oa2luZCxjYWxsYmFjayl7dmFyIF90aGlzMj10aGlzO3ZhciB3cz10aGlzLl93cml0YWJsZVN0YXRlO2lmKHR5cGVvZiBraW5kPT09J2Z1bmN0aW9uJ3x8a2luZD09PXVuZGVmaW5lZCYmIWNhbGxiYWNrKXtjYWxsYmFjaz1raW5kO2tpbmQ9YmluZGluZy5aX0ZVTExfRkxVU0g7fQppZih3cy5lbmRlZCl7aWYoY2FsbGJhY2spcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7fWVsc2UgaWYod3MuZW5kaW5nKXtpZihjYWxsYmFjayl0aGlzLm9uY2UoJ2VuZCcsY2FsbGJhY2spO31lbHNlIGlmKHdzLm5lZWREcmFpbil7aWYoY2FsbGJhY2spe3RoaXMub25jZSgnZHJhaW4nLGZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzMi5mbHVzaChraW5kLGNhbGxiYWNrKTt9KTt9fWVsc2V7dGhpcy5fZmx1c2hGbGFnPWtpbmQ7dGhpcy53cml0ZShCdWZmZXIuYWxsb2MoMCksJycsY2FsbGJhY2spO319O1psaWIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKGNhbGxiYWNrKXtfY2xvc2UodGhpcyxjYWxsYmFjayk7cHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCx0aGlzKTt9O2Z1bmN0aW9uIF9jbG9zZShlbmdpbmUsY2FsbGJhY2spe2lmKGNhbGxiYWNrKXByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO2lmKCFlbmdpbmUuX2hhbmRsZSlyZXR1cm47ZW5naW5lLl9oYW5kbGUuY2xvc2UoKTtlbmdpbmUuX2hhbmRsZT1udWxsO30KZnVuY3Rpb24gZW1pdENsb3NlTlQoc2VsZil7c2VsZi5lbWl0KCdjbG9zZScpO30KWmxpYi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIGZsdXNoRmxhZzt2YXIgd3M9dGhpcy5fd3JpdGFibGVTdGF0ZTt2YXIgZW5kaW5nPXdzLmVuZGluZ3x8d3MuZW5kZWQ7dmFyIGxhc3Q9ZW5kaW5nJiYoIWNodW5rfHx3cy5sZW5ndGg9PT1jaHVuay5sZW5ndGgpO2lmKGNodW5rIT09bnVsbCYmIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpcmV0dXJuIGNiKG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpKTtpZighdGhpcy5faGFuZGxlKXJldHVybiBjYihuZXcgRXJyb3IoJ3psaWIgYmluZGluZyBjbG9zZWQnKSk7aWYobGFzdClmbHVzaEZsYWc9dGhpcy5fZmluaXNoRmx1c2hGbGFnO2Vsc2V7Zmx1c2hGbGFnPXRoaXMuX2ZsdXNoRmxhZztpZihjaHVuay5sZW5ndGg+PXdzLmxlbmd0aCl7dGhpcy5fZmx1c2hGbGFnPXRoaXMuX29wdHMuZmx1c2h8fGJpbmRpbmcuWl9OT19GTFVTSDt9fQp0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssZmx1c2hGbGFnLGNiKTt9O1psaWIucHJvdG90eXBlLl9wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oY2h1bmssZmx1c2hGbGFnLGNiKXt2YXIgYXZhaWxJbkJlZm9yZT1jaHVuayYmY2h1bmsubGVuZ3RoO3ZhciBhdmFpbE91dEJlZm9yZT10aGlzLl9jaHVua1NpemUtdGhpcy5fb2Zmc2V0O3ZhciBpbk9mZj0wO3ZhciBzZWxmPXRoaXM7dmFyIGFzeW5jPXR5cGVvZiBjYj09PSdmdW5jdGlvbic7aWYoIWFzeW5jKXt2YXIgYnVmZmVycz1bXTt2YXIgbnJlYWQ9MDt2YXIgZXJyb3I7dGhpcy5vbignZXJyb3InLGZ1bmN0aW9uKGVyKXtlcnJvcj1lcjt9KTthc3NlcnQodGhpcy5faGFuZGxlLCd6bGliIGJpbmRpbmcgY2xvc2VkJyk7ZG97dmFyIHJlcz10aGlzLl9oYW5kbGUud3JpdGVTeW5jKGZsdXNoRmxhZyxjaHVuayxpbk9mZixhdmFpbEluQmVmb3JlLHRoaXMuX2J1ZmZlcix0aGlzLl9vZmZzZXQsYXZhaWxPdXRCZWZvcmUpO313aGlsZSghdGhpcy5faGFkRXJyb3ImJmNhbGxiYWNrKHJlc1swXSxyZXNbMV0pKTtpZih0aGlzLl9oYWRFcnJvcil7dGhyb3cgZXJyb3I7fQppZihucmVhZD49a01heExlbmd0aCl7X2Nsb3NlKHRoaXMpO3Rocm93IG5ldyBSYW5nZUVycm9yKGtSYW5nZUVycm9yTWVzc2FnZSk7fQp2YXIgYnVmPUJ1ZmZlci5jb25jYXQoYnVmZmVycyxucmVhZCk7X2Nsb3NlKHRoaXMpO3JldHVybiBidWY7fQphc3NlcnQodGhpcy5faGFuZGxlLCd6bGliIGJpbmRpbmcgY2xvc2VkJyk7dmFyIHJlcT10aGlzLl9oYW5kbGUud3JpdGUoZmx1c2hGbGFnLGNodW5rLGluT2ZmLGF2YWlsSW5CZWZvcmUsdGhpcy5fYnVmZmVyLHRoaXMuX29mZnNldCxhdmFpbE91dEJlZm9yZSk7cmVxLmJ1ZmZlcj1jaHVuaztyZXEuY2FsbGJhY2s9Y2FsbGJhY2s7ZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLGF2YWlsT3V0QWZ0ZXIpe2lmKHRoaXMpe3RoaXMuYnVmZmVyPW51bGw7dGhpcy5jYWxsYmFjaz1udWxsO30KaWYoc2VsZi5faGFkRXJyb3IpcmV0dXJuO3ZhciBoYXZlPWF2YWlsT3V0QmVmb3JlLWF2YWlsT3V0QWZ0ZXI7YXNzZXJ0KGhhdmU+PTAsJ2hhdmUgc2hvdWxkIG5vdCBnbyBkb3duJyk7aWYoaGF2ZT4wKXt2YXIgb3V0PXNlbGYuX2J1ZmZlci5zbGljZShzZWxmLl9vZmZzZXQsc2VsZi5fb2Zmc2V0K2hhdmUpO3NlbGYuX29mZnNldCs9aGF2ZTtpZihhc3luYyl7c2VsZi5wdXNoKG91dCk7fWVsc2V7YnVmZmVycy5wdXNoKG91dCk7bnJlYWQrPW91dC5sZW5ndGg7fX0KaWYoYXZhaWxPdXRBZnRlcj09PTB8fHNlbGYuX29mZnNldD49c2VsZi5fY2h1bmtTaXplKXthdmFpbE91dEJlZm9yZT1zZWxmLl9jaHVua1NpemU7c2VsZi5fb2Zmc2V0PTA7c2VsZi5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZShzZWxmLl9jaHVua1NpemUpO30KaWYoYXZhaWxPdXRBZnRlcj09PTApe2luT2ZmKz1hdmFpbEluQmVmb3JlLWF2YWlsSW5BZnRlcjthdmFpbEluQmVmb3JlPWF2YWlsSW5BZnRlcjtpZighYXN5bmMpcmV0dXJuIHRydWU7dmFyIG5ld1JlcT1zZWxmLl9oYW5kbGUud3JpdGUoZmx1c2hGbGFnLGNodW5rLGluT2ZmLGF2YWlsSW5CZWZvcmUsc2VsZi5fYnVmZmVyLHNlbGYuX29mZnNldCxzZWxmLl9jaHVua1NpemUpO25ld1JlcS5jYWxsYmFjaz1jYWxsYmFjaztuZXdSZXEuYnVmZmVyPWNodW5rO3JldHVybjt9CmlmKCFhc3luYylyZXR1cm4gZmFsc2U7Y2IoKTt9fTt1dGlsLmluaGVyaXRzKERlZmxhdGUsWmxpYik7dXRpbC5pbmhlcml0cyhJbmZsYXRlLFpsaWIpO3V0aWwuaW5oZXJpdHMoR3ppcCxabGliKTt1dGlsLmluaGVyaXRzKEd1bnppcCxabGliKTt1dGlsLmluaGVyaXRzKERlZmxhdGVSYXcsWmxpYik7dXRpbC5pbmhlcml0cyhJbmZsYXRlUmF3LFpsaWIpO3V0aWwuaW5oZXJpdHMoVW56aXAsWmxpYik7fSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpO30seyIuL2JpbmRpbmciOjU2LCJfcHJvY2VzcyI6NzcsImFzc2VydCI6NTMsImJ1ZmZlciI6NjAsInN0cmVhbSI6OTIsInV0aWwiOjk3fV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe2FyZ3VtZW50c1s0XVs1NV1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO30seyJkdXAiOjU1fV0sNTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpeyd1c2Ugc3RyaWN0Jzt2YXIgYnVmZmVyPXJlcXVpcmUoJ2J1ZmZlcicpO3ZhciBCdWZmZXI9YnVmZmVyLkJ1ZmZlcjt2YXIgU2xvd0J1ZmZlcj1idWZmZXIuU2xvd0J1ZmZlcjt2YXIgTUFYX0xFTj1idWZmZXIua01heExlbmd0aHx8MjE0NzQ4MzY0NztleHBvcnRzLmFsbG9jPWZ1bmN0aW9uIGFsbG9jKHNpemUsZmlsbCxlbmNvZGluZyl7aWYodHlwZW9mIEJ1ZmZlci5hbGxvYz09PSdmdW5jdGlvbicpe3JldHVybiBCdWZmZXIuYWxsb2Moc2l6ZSxmaWxsLGVuY29kaW5nKTt9CmlmKHR5cGVvZiBlbmNvZGluZz09PSdudW1iZXInKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IG5vdCBiZSBudW1iZXInKTt9CmlmKHR5cGVvZiBzaXplIT09J251bWJlcicpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbXVzdCBiZSBhIG51bWJlcicpO30KaWYoc2l6ZT5NQVhfTEVOKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignc2l6ZSBpcyB0b28gbGFyZ2UnKTt9CnZhciBlbmM9ZW5jb2Rpbmc7dmFyIF9maWxsPWZpbGw7aWYoX2ZpbGw9PT11bmRlZmluZWQpe2VuYz11bmRlZmluZWQ7X2ZpbGw9MDt9CnZhciBidWY9bmV3IEJ1ZmZlcihzaXplKTtpZih0eXBlb2YgX2ZpbGw9PT0nc3RyaW5nJyl7dmFyIGZpbGxCdWY9bmV3IEJ1ZmZlcihfZmlsbCxlbmMpO3ZhciBmbGVuPWZpbGxCdWYubGVuZ3RoO3ZhciBpPS0xO3doaWxlKCsraTxzaXplKXtidWZbaV09ZmlsbEJ1ZltpJWZsZW5dO319ZWxzZXtidWYuZmlsbChfZmlsbCk7fQpyZXR1cm4gYnVmO307ZXhwb3J0cy5hbGxvY1Vuc2FmZT1mdW5jdGlvbiBhbGxvY1Vuc2FmZShzaXplKXtpZih0eXBlb2YgQnVmZmVyLmFsbG9jVW5zYWZlPT09J2Z1bmN0aW9uJyl7cmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKTt9CmlmKHR5cGVvZiBzaXplIT09J251bWJlcicpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbXVzdCBiZSBhIG51bWJlcicpO30KaWYoc2l6ZT5NQVhfTEVOKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignc2l6ZSBpcyB0b28gbGFyZ2UnKTt9CnJldHVybiBuZXcgQnVmZmVyKHNpemUpO307ZXhwb3J0cy5mcm9tPWZ1bmN0aW9uIGZyb20odmFsdWUsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpe2lmKHR5cGVvZiBCdWZmZXIuZnJvbT09PSdmdW5jdGlvbicmJighZ2xvYmFsLlVpbnQ4QXJyYXl8fFVpbnQ4QXJyYXkuZnJvbSE9PUJ1ZmZlci5mcm9tKSl7cmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKTt9CmlmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInKXt0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7fQppZih0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJyl7cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUsZW5jb2RpbmdPck9mZnNldCk7fQppZih0eXBlb2YgQXJyYXlCdWZmZXIhPT0ndW5kZWZpbmVkJyYmdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dmFyIG9mZnNldD1lbmNvZGluZ09yT2Zmc2V0O2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0xKXtyZXR1cm4gbmV3IEJ1ZmZlcih2YWx1ZSk7fQppZih0eXBlb2Ygb2Zmc2V0PT09J3VuZGVmaW5lZCcpe29mZnNldD0wO30KdmFyIGxlbj1sZW5ndGg7aWYodHlwZW9mIGxlbj09PSd1bmRlZmluZWQnKXtsZW49dmFsdWUuYnl0ZUxlbmd0aC1vZmZzZXQ7fQppZihvZmZzZXQ+PXZhbHVlLmJ5dGVMZW5ndGgpe3Rocm93IG5ldyBSYW5nZUVycm9yKCdcJ29mZnNldFwnIGlzIG91dCBvZiBib3VuZHMnKTt9CmlmKGxlbj52YWx1ZS5ieXRlTGVuZ3RoLW9mZnNldCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wnbGVuZ3RoXCcgaXMgb3V0IG9mIGJvdW5kcycpO30KcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUuc2xpY2Uob2Zmc2V0LG9mZnNldCtsZW4pKTt9CmlmKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpe3ZhciBvdXQ9bmV3IEJ1ZmZlcih2YWx1ZS5sZW5ndGgpO3ZhbHVlLmNvcHkob3V0LDAsMCx2YWx1ZS5sZW5ndGgpO3JldHVybiBvdXQ7fQppZih2YWx1ZSl7aWYoQXJyYXkuaXNBcnJheSh2YWx1ZSl8fHR5cGVvZiBBcnJheUJ1ZmZlciE9PSd1bmRlZmluZWQnJiZ2YWx1ZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8J2xlbmd0aCdpbiB2YWx1ZSl7cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpO30KaWYodmFsdWUudHlwZT09PSdCdWZmZXInJiZBcnJheS5pc0FycmF5KHZhbHVlLmRhdGEpKXtyZXR1cm4gbmV3IEJ1ZmZlcih2YWx1ZS5kYXRhKTt9fQp0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsICcrJ0FycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJyk7fTtleHBvcnRzLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbiBhbGxvY1Vuc2FmZVNsb3coc2l6ZSl7aWYodHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3c9PT0nZnVuY3Rpb24nKXtyZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyhzaXplKTt9CmlmKHR5cGVvZiBzaXplIT09J251bWJlcicpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbXVzdCBiZSBhIG51bWJlcicpO30KaWYoc2l6ZT49TUFYX0xFTil7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NpemUgaXMgdG9vIGxhcmdlJyk7fQpyZXR1cm4gbmV3IFNsb3dCdWZmZXIoc2l6ZSk7fTt9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7ImJ1ZmZlciI6NjB9XSw2MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO3ZhciBiYXNlNjQ9cmVxdWlyZSgnYmFzZTY0LWpzJyk7dmFyIGllZWU3NTQ9cmVxdWlyZSgnaWVlZTc1NCcpO2V4cG9ydHMuQnVmZmVyPUJ1ZmZlcjtleHBvcnRzLlNsb3dCdWZmZXI9U2xvd0J1ZmZlcjtleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTPTUwO3ZhciBLX01BWF9MRU5HVEg9MHg3ZmZmZmZmZjtleHBvcnRzLmtNYXhMZW5ndGg9S19NQVhfTEVOR1RIO0J1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUPXR5cGVkQXJyYXlTdXBwb3J0KCk7aWYoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUJiZ0eXBlb2YgY29uc29sZSE9PSd1bmRlZmluZWQnJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09PSdmdW5jdGlvbicpe2NvbnNvbGUuZXJyb3IoJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnKydgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LicpO30KZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQoKXt0cnl7dmFyIGFycj1uZXcgVWludDhBcnJheSgxKTthcnIuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyO319O3JldHVybiBhcnIuZm9vKCk9PT00Mjt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCdwYXJlbnQnLHtnZXQ6ZnVuY3Rpb24oKXtpZighKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKXtyZXR1cm4gdW5kZWZpbmVkO30KcmV0dXJuIHRoaXMuYnVmZmVyO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwnb2Zmc2V0Jyx7Z2V0OmZ1bmN0aW9uKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSl7cmV0dXJuIHVuZGVmaW5lZDt9CnJldHVybiB0aGlzLmJ5dGVPZmZzZXQ7fX0pO2Z1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihsZW5ndGgpe2lmKGxlbmd0aD5LX01BWF9MRU5HVEgpe3Rocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpO30KdmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO2J1Zi5fX3Byb3RvX189QnVmZmVyLnByb3RvdHlwZTtyZXR1cm4gYnVmO30KZnVuY3Rpb24gQnVmZmVyKGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7aWYodHlwZW9mIGFyZz09PSdudW1iZXInKXtpZih0eXBlb2YgZW5jb2RpbmdPck9mZnNldD09PSdzdHJpbmcnKXt0aHJvdyBuZXcgRXJyb3IoJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7fQpyZXR1cm4gYWxsb2NVbnNhZmUoYXJnKTt9CnJldHVybiBmcm9tKGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCk7fQppZih0eXBlb2YgU3ltYm9sIT09J3VuZGVmaW5lZCcmJlN5bWJvbC5zcGVjaWVzJiZCdWZmZXJbU3ltYm9sLnNwZWNpZXNdPT09QnVmZmVyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTp0cnVlLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6ZmFsc2V9KTt9CkJ1ZmZlci5wb29sU2l6ZT04MTkyO2Z1bmN0aW9uIGZyb20odmFsdWUsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpe2lmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInKXt0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7fQppZihpc0FycmF5QnVmZmVyKHZhbHVlKXx8dmFsdWUmJmlzQXJyYXlCdWZmZXIodmFsdWUuYnVmZmVyKSl7cmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCk7fQppZih0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJyl7cmV0dXJuIGZyb21TdHJpbmcodmFsdWUsZW5jb2RpbmdPck9mZnNldCk7fQpyZXR1cm4gZnJvbU9iamVjdCh2YWx1ZSk7fQpCdWZmZXIuZnJvbT1mdW5jdGlvbih2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGZyb20odmFsdWUsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpO307QnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGU7QnVmZmVyLl9fcHJvdG9fXz1VaW50OEFycmF5O2Z1bmN0aW9uIGFzc2VydFNpemUoc2l6ZSl7aWYodHlwZW9mIHNpemUhPT0nbnVtYmVyJyl7dGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTt9ZWxzZSBpZihzaXplPDApe3Rocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKTt9fQpmdW5jdGlvbiBhbGxvYyhzaXplLGZpbGwsZW5jb2Rpbmcpe2Fzc2VydFNpemUoc2l6ZSk7aWYoc2l6ZTw9MCl7cmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKTt9CmlmKGZpbGwhPT11bmRlZmluZWQpe3JldHVybiB0eXBlb2YgZW5jb2Rpbmc9PT0nc3RyaW5nJz9jcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLGVuY29kaW5nKTpjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKTt9CnJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSk7fQpCdWZmZXIuYWxsb2M9ZnVuY3Rpb24oc2l6ZSxmaWxsLGVuY29kaW5nKXtyZXR1cm4gYWxsb2Moc2l6ZSxmaWxsLGVuY29kaW5nKTt9O2Z1bmN0aW9uIGFsbG9jVW5zYWZlKHNpemUpe2Fzc2VydFNpemUoc2l6ZSk7cmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplPDA/MDpjaGVja2VkKHNpemUpfDApO30KQnVmZmVyLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHNpemUpe3JldHVybiBhbGxvY1Vuc2FmZShzaXplKTt9O0J1ZmZlci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oc2l6ZSl7cmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpO307ZnVuY3Rpb24gZnJvbVN0cmluZyhzdHJpbmcsZW5jb2Rpbmcpe2lmKHR5cGVvZiBlbmNvZGluZyE9PSdzdHJpbmcnfHxlbmNvZGluZz09PScnKXtlbmNvZGluZz0ndXRmOCc7fQppZighQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnK2VuY29kaW5nKTt9CnZhciBsZW5ndGg9Ynl0ZUxlbmd0aChzdHJpbmcsZW5jb2RpbmcpfDA7dmFyIGJ1Zj1jcmVhdGVCdWZmZXIobGVuZ3RoKTt2YXIgYWN0dWFsPWJ1Zi53cml0ZShzdHJpbmcsZW5jb2RpbmcpO2lmKGFjdHVhbCE9PWxlbmd0aCl7YnVmPWJ1Zi5zbGljZSgwLGFjdHVhbCk7fQpyZXR1cm4gYnVmO30KZnVuY3Rpb24gZnJvbUFycmF5TGlrZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg8MD8wOmNoZWNrZWQoYXJyYXkubGVuZ3RoKXwwO3ZhciBidWY9Y3JlYXRlQnVmZmVyKGxlbmd0aCk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSs9MSl7YnVmW2ldPWFycmF5W2ldJjI1NTt9CnJldHVybiBidWY7fQpmdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIoYXJyYXksYnl0ZU9mZnNldCxsZW5ndGgpe2lmKGJ5dGVPZmZzZXQ8MHx8YXJyYXkuYnl0ZUxlbmd0aDxieXRlT2Zmc2V0KXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignIm9mZnNldCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7fQppZihhcnJheS5ieXRlTGVuZ3RoPGJ5dGVPZmZzZXQrKGxlbmd0aHx8MCkpe3Rocm93IG5ldyBSYW5nZUVycm9yKCcibGVuZ3RoIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTt9CnZhciBidWY7aWYoYnl0ZU9mZnNldD09PXVuZGVmaW5lZCYmbGVuZ3RoPT09dW5kZWZpbmVkKXtidWY9bmV3IFVpbnQ4QXJyYXkoYXJyYXkpO31lbHNlIGlmKGxlbmd0aD09PXVuZGVmaW5lZCl7YnVmPW5ldyBVaW50OEFycmF5KGFycmF5LGJ5dGVPZmZzZXQpO31lbHNle2J1Zj1uZXcgVWludDhBcnJheShhcnJheSxieXRlT2Zmc2V0LGxlbmd0aCk7fQpidWYuX19wcm90b19fPUJ1ZmZlci5wcm90b3R5cGU7cmV0dXJuIGJ1Zjt9CmZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKXtpZihCdWZmZXIuaXNCdWZmZXIob2JqKSl7dmFyIGxlbj1jaGVja2VkKG9iai5sZW5ndGgpfDA7dmFyIGJ1Zj1jcmVhdGVCdWZmZXIobGVuKTtpZihidWYubGVuZ3RoPT09MCl7cmV0dXJuIGJ1Zjt9Cm9iai5jb3B5KGJ1ZiwwLDAsbGVuKTtyZXR1cm4gYnVmO30KaWYob2JqKXtpZihBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKXx8J2xlbmd0aCdpbiBvYmope2lmKHR5cGVvZiBvYmoubGVuZ3RoIT09J251bWJlcid8fG51bWJlcklzTmFOKG9iai5sZW5ndGgpKXtyZXR1cm4gY3JlYXRlQnVmZmVyKDApO30KcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKTt9CmlmKG9iai50eXBlPT09J0J1ZmZlcicmJkFycmF5LmlzQXJyYXkob2JqLmRhdGEpKXtyZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSk7fX0KdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuJyk7fQpmdW5jdGlvbiBjaGVja2VkKGxlbmd0aCl7aWYobGVuZ3RoPj1LX01BWF9MRU5HVEgpe3Rocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcrJ3NpemU6IDB4JytLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpKycgYnl0ZXMnKTt9CnJldHVybiBsZW5ndGh8MDt9CmZ1bmN0aW9uIFNsb3dCdWZmZXIobGVuZ3RoKXtpZigrbGVuZ3RoIT1sZW5ndGgpe2xlbmd0aD0wO30KcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKTt9CkJ1ZmZlci5pc0J1ZmZlcj1mdW5jdGlvbiBpc0J1ZmZlcihiKXtyZXR1cm4gYiE9bnVsbCYmYi5faXNCdWZmZXI9PT10cnVlO307QnVmZmVyLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShhLGIpe2lmKCFCdWZmZXIuaXNCdWZmZXIoYSl8fCFCdWZmZXIuaXNCdWZmZXIoYikpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKTt9CmlmKGE9PT1iKXJldHVybiAwO3ZhciB4PWEubGVuZ3RoO3ZhciB5PWIubGVuZ3RoO2Zvcih2YXIgaT0wLGxlbj1NYXRoLm1pbih4LHkpO2k8bGVuOysraSl7aWYoYVtpXSE9PWJbaV0pe3g9YVtpXTt5PWJbaV07YnJlYWs7fX0KaWYoeDx5KXJldHVybi0xO2lmKHk8eClyZXR1cm4gMTtyZXR1cm4gMDt9O0J1ZmZlci5pc0VuY29kaW5nPWZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2Rpbmcpe3N3aXRjaChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpe2Nhc2UnaGV4JzpjYXNlJ3V0ZjgnOmNhc2UndXRmLTgnOmNhc2UnYXNjaWknOmNhc2UnbGF0aW4xJzpjYXNlJ2JpbmFyeSc6Y2FzZSdiYXNlNjQnOmNhc2UndWNzMic6Y2FzZSd1Y3MtMic6Y2FzZSd1dGYxNmxlJzpjYXNlJ3V0Zi0xNmxlJzpyZXR1cm4gdHJ1ZTtkZWZhdWx0OnJldHVybiBmYWxzZTt9fTtCdWZmZXIuY29uY2F0PWZ1bmN0aW9uIGNvbmNhdChsaXN0LGxlbmd0aCl7aWYoIUFycmF5LmlzQXJyYXkobGlzdCkpe3Rocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTt9CmlmKGxpc3QubGVuZ3RoPT09MCl7cmV0dXJuIEJ1ZmZlci5hbGxvYygwKTt9CnZhciBpO2lmKGxlbmd0aD09PXVuZGVmaW5lZCl7bGVuZ3RoPTA7Zm9yKGk9MDtpPGxpc3QubGVuZ3RoOysraSl7bGVuZ3RoKz1saXN0W2ldLmxlbmd0aDt9fQp2YXIgYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpO3ZhciBwb3M9MDtmb3IoaT0wO2k8bGlzdC5sZW5ndGg7KytpKXt2YXIgYnVmPWxpc3RbaV07aWYoQXJyYXlCdWZmZXIuaXNWaWV3KGJ1Zikpe2J1Zj1CdWZmZXIuZnJvbShidWYpO30KaWYoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7fQpidWYuY29weShidWZmZXIscG9zKTtwb3MrPWJ1Zi5sZW5ndGg7fQpyZXR1cm4gYnVmZmVyO307ZnVuY3Rpb24gYnl0ZUxlbmd0aChzdHJpbmcsZW5jb2Rpbmcpe2lmKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKXtyZXR1cm4gc3RyaW5nLmxlbmd0aDt9CmlmKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpfHxpc0FycmF5QnVmZmVyKHN0cmluZykpe3JldHVybiBzdHJpbmcuYnl0ZUxlbmd0aDt9CmlmKHR5cGVvZiBzdHJpbmchPT0nc3RyaW5nJyl7c3RyaW5nPScnK3N0cmluZzt9CnZhciBsZW49c3RyaW5nLmxlbmd0aDtpZihsZW49PT0wKXJldHVybiAwO3ZhciBsb3dlcmVkQ2FzZT1mYWxzZTtmb3IoOzspe3N3aXRjaChlbmNvZGluZyl7Y2FzZSdhc2NpaSc6Y2FzZSdsYXRpbjEnOmNhc2UnYmluYXJ5JzpyZXR1cm4gbGVuO2Nhc2UndXRmOCc6Y2FzZSd1dGYtOCc6Y2FzZSB1bmRlZmluZWQ6cmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoO2Nhc2UndWNzMic6Y2FzZSd1Y3MtMic6Y2FzZSd1dGYxNmxlJzpjYXNlJ3V0Zi0xNmxlJzpyZXR1cm4gbGVuKjI7Y2FzZSdoZXgnOnJldHVybiBsZW4+Pj4xO2Nhc2UnYmFzZTY0JzpyZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDtkZWZhdWx0OmlmKGxvd2VyZWRDYXNlKXJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDtlbmNvZGluZz0oJycrZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7bG93ZXJlZENhc2U9dHJ1ZTt9fX0KQnVmZmVyLmJ5dGVMZW5ndGg9Ynl0ZUxlbmd0aDtmdW5jdGlvbiBzbG93VG9TdHJpbmcoZW5jb2Rpbmcsc3RhcnQsZW5kKXt2YXIgbG93ZXJlZENhc2U9ZmFsc2U7aWYoc3RhcnQ9PT11bmRlZmluZWR8fHN0YXJ0PDApe3N0YXJ0PTA7fQppZihzdGFydD50aGlzLmxlbmd0aCl7cmV0dXJuJyc7fQppZihlbmQ9PT11bmRlZmluZWR8fGVuZD50aGlzLmxlbmd0aCl7ZW5kPXRoaXMubGVuZ3RoO30KaWYoZW5kPD0wKXtyZXR1cm4nJzt9CmVuZD4+Pj0wO3N0YXJ0Pj4+PTA7aWYoZW5kPD1zdGFydCl7cmV0dXJuJyc7fQppZighZW5jb2RpbmcpZW5jb2Rpbmc9J3V0ZjgnO3doaWxlKHRydWUpe3N3aXRjaChlbmNvZGluZyl7Y2FzZSdoZXgnOnJldHVybiBoZXhTbGljZSh0aGlzLHN0YXJ0LGVuZCk7Y2FzZSd1dGY4JzpjYXNlJ3V0Zi04JzpyZXR1cm4gdXRmOFNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlJ2FzY2lpJzpyZXR1cm4gYXNjaWlTbGljZSh0aGlzLHN0YXJ0LGVuZCk7Y2FzZSdsYXRpbjEnOmNhc2UnYmluYXJ5JzpyZXR1cm4gbGF0aW4xU2xpY2UodGhpcyxzdGFydCxlbmQpO2Nhc2UnYmFzZTY0JzpyZXR1cm4gYmFzZTY0U2xpY2UodGhpcyxzdGFydCxlbmQpO2Nhc2UndWNzMic6Y2FzZSd1Y3MtMic6Y2FzZSd1dGYxNmxlJzpjYXNlJ3V0Zi0xNmxlJzpyZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsc3RhcnQsZW5kKTtkZWZhdWx0OmlmKGxvd2VyZWRDYXNlKXRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcrZW5jb2RpbmcpO2VuY29kaW5nPShlbmNvZGluZysnJykudG9Mb3dlckNhc2UoKTtsb3dlcmVkQ2FzZT10cnVlO319fQpCdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlcj10cnVlO2Z1bmN0aW9uIHN3YXAoYixuLG0pe3ZhciBpPWJbbl07YltuXT1iW21dO2JbbV09aTt9CkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uIHN3YXAxNigpe3ZhciBsZW49dGhpcy5sZW5ndGg7aWYobGVuJTIhPT0wKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKTt9CmZvcih2YXIgaT0wO2k8bGVuO2krPTIpe3N3YXAodGhpcyxpLGkrMSk7fQpyZXR1cm4gdGhpczt9O0J1ZmZlci5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uIHN3YXAzMigpe3ZhciBsZW49dGhpcy5sZW5ndGg7aWYobGVuJTQhPT0wKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKTt9CmZvcih2YXIgaT0wO2k8bGVuO2krPTQpe3N3YXAodGhpcyxpLGkrMyk7c3dhcCh0aGlzLGkrMSxpKzIpO30KcmV0dXJuIHRoaXM7fTtCdWZmZXIucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbiBzd2FwNjQoKXt2YXIgbGVuPXRoaXMubGVuZ3RoO2lmKGxlbiU4IT09MCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJyk7fQpmb3IodmFyIGk9MDtpPGxlbjtpKz04KXtzd2FwKHRoaXMsaSxpKzcpO3N3YXAodGhpcyxpKzEsaSs2KTtzd2FwKHRoaXMsaSsyLGkrNSk7c3dhcCh0aGlzLGkrMyxpKzQpO30KcmV0dXJuIHRoaXM7fTtCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIHRvU3RyaW5nKCl7dmFyIGxlbmd0aD10aGlzLmxlbmd0aDtpZihsZW5ndGg9PT0wKXJldHVybicnO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiB1dGY4U2xpY2UodGhpcywwLGxlbmd0aCk7cmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fTtCdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nPUJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmc7QnVmZmVyLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24gZXF1YWxzKGIpe2lmKCFCdWZmZXIuaXNCdWZmZXIoYikpdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpO2lmKHRoaXM9PT1iKXJldHVybiB0cnVlO3JldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLGIpPT09MDt9O0J1ZmZlci5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbiBpbnNwZWN0KCl7dmFyIHN0cj0nJzt2YXIgbWF4PWV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM7aWYodGhpcy5sZW5ndGg+MCl7c3RyPXRoaXMudG9TdHJpbmcoJ2hleCcsMCxtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKTtpZih0aGlzLmxlbmd0aD5tYXgpc3RyKz0nIC4uLiAnO30KcmV0dXJuJzxCdWZmZXIgJytzdHIrJz4nO307QnVmZmVyLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uIGNvbXBhcmUodGFyZ2V0LHN0YXJ0LGVuZCx0aGlzU3RhcnQsdGhpc0VuZCl7aWYoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJyk7fQppZihzdGFydD09PXVuZGVmaW5lZCl7c3RhcnQ9MDt9CmlmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXRhcmdldD90YXJnZXQubGVuZ3RoOjA7fQppZih0aGlzU3RhcnQ9PT11bmRlZmluZWQpe3RoaXNTdGFydD0wO30KaWYodGhpc0VuZD09PXVuZGVmaW5lZCl7dGhpc0VuZD10aGlzLmxlbmd0aDt9CmlmKHN0YXJ0PDB8fGVuZD50YXJnZXQubGVuZ3RofHx0aGlzU3RhcnQ8MHx8dGhpc0VuZD50aGlzLmxlbmd0aCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpO30KaWYodGhpc1N0YXJ0Pj10aGlzRW5kJiZzdGFydD49ZW5kKXtyZXR1cm4gMDt9CmlmKHRoaXNTdGFydD49dGhpc0VuZCl7cmV0dXJuLTE7fQppZihzdGFydD49ZW5kKXtyZXR1cm4gMTt9CnN0YXJ0Pj4+PTA7ZW5kPj4+PTA7dGhpc1N0YXJ0Pj4+PTA7dGhpc0VuZD4+Pj0wO2lmKHRoaXM9PT10YXJnZXQpcmV0dXJuIDA7dmFyIHg9dGhpc0VuZC10aGlzU3RhcnQ7dmFyIHk9ZW5kLXN0YXJ0O3ZhciBsZW49TWF0aC5taW4oeCx5KTt2YXIgdGhpc0NvcHk9dGhpcy5zbGljZSh0aGlzU3RhcnQsdGhpc0VuZCk7dmFyIHRhcmdldENvcHk9dGFyZ2V0LnNsaWNlKHN0YXJ0LGVuZCk7Zm9yKHZhciBpPTA7aTxsZW47KytpKXtpZih0aGlzQ29weVtpXSE9PXRhcmdldENvcHlbaV0pe3g9dGhpc0NvcHlbaV07eT10YXJnZXRDb3B5W2ldO2JyZWFrO319CmlmKHg8eSlyZXR1cm4tMTtpZih5PHgpcmV0dXJuIDE7cmV0dXJuIDA7fTtmdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZihidWZmZXIsdmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZGlyKXtpZihidWZmZXIubGVuZ3RoPT09MClyZXR1cm4tMTtpZih0eXBlb2YgYnl0ZU9mZnNldD09PSdzdHJpbmcnKXtlbmNvZGluZz1ieXRlT2Zmc2V0O2J5dGVPZmZzZXQ9MDt9ZWxzZSBpZihieXRlT2Zmc2V0PjB4N2ZmZmZmZmYpe2J5dGVPZmZzZXQ9MHg3ZmZmZmZmZjt9ZWxzZSBpZihieXRlT2Zmc2V0PC0weDgwMDAwMDAwKXtieXRlT2Zmc2V0PS0weDgwMDAwMDAwO30KYnl0ZU9mZnNldD0rYnl0ZU9mZnNldDtpZihudW1iZXJJc05hTihieXRlT2Zmc2V0KSl7Ynl0ZU9mZnNldD1kaXI/MDpidWZmZXIubGVuZ3RoLTE7fQppZihieXRlT2Zmc2V0PDApYnl0ZU9mZnNldD1idWZmZXIubGVuZ3RoK2J5dGVPZmZzZXQ7aWYoYnl0ZU9mZnNldD49YnVmZmVyLmxlbmd0aCl7aWYoZGlyKXJldHVybi0xO2Vsc2UKYnl0ZU9mZnNldD1idWZmZXIubGVuZ3RoLTE7fWVsc2UgaWYoYnl0ZU9mZnNldDwwKXtpZihkaXIpYnl0ZU9mZnNldD0wO2Vsc2UKcmV0dXJuLTE7fQppZih0eXBlb2YgdmFsPT09J3N0cmluZycpe3ZhbD1CdWZmZXIuZnJvbSh2YWwsZW5jb2RpbmcpO30KaWYoQnVmZmVyLmlzQnVmZmVyKHZhbCkpe2lmKHZhbC5sZW5ndGg9PT0wKXtyZXR1cm4tMTt9CnJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nLGRpcik7fWVsc2UgaWYodHlwZW9mIHZhbD09PSdudW1iZXInKXt2YWw9dmFsJjB4RkY7aWYodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y9PT0nZnVuY3Rpb24nKXtpZihkaXIpe3JldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLHZhbCxieXRlT2Zmc2V0KTt9ZWxzZXtyZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsdmFsLGJ5dGVPZmZzZXQpO319CnJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLFt2YWxdLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZGlyKTt9CnRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpO30KZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFycix2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyxkaXIpe3ZhciBpbmRleFNpemU9MTt2YXIgYXJyTGVuZ3RoPWFyci5sZW5ndGg7dmFyIHZhbExlbmd0aD12YWwubGVuZ3RoO2lmKGVuY29kaW5nIT09dW5kZWZpbmVkKXtlbmNvZGluZz1TdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7aWYoZW5jb2Rpbmc9PT0ndWNzMid8fGVuY29kaW5nPT09J3Vjcy0yJ3x8ZW5jb2Rpbmc9PT0ndXRmMTZsZSd8fGVuY29kaW5nPT09J3V0Zi0xNmxlJyl7aWYoYXJyLmxlbmd0aDwyfHx2YWwubGVuZ3RoPDIpe3JldHVybi0xO30KaW5kZXhTaXplPTI7YXJyTGVuZ3RoLz0yO3ZhbExlbmd0aC89MjtieXRlT2Zmc2V0Lz0yO319CmZ1bmN0aW9uIHJlYWQoYnVmLGkpe2lmKGluZGV4U2l6ZT09PTEpe3JldHVybiBidWZbaV07fWVsc2V7cmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSppbmRleFNpemUpO319CnZhciBpO2lmKGRpcil7dmFyIGZvdW5kSW5kZXg9LTE7Zm9yKGk9Ynl0ZU9mZnNldDtpPGFyckxlbmd0aDtpKyspe2lmKHJlYWQoYXJyLGkpPT09cmVhZCh2YWwsZm91bmRJbmRleD09PS0xPzA6aS1mb3VuZEluZGV4KSl7aWYoZm91bmRJbmRleD09PS0xKWZvdW5kSW5kZXg9aTtpZihpLWZvdW5kSW5kZXgrMT09PXZhbExlbmd0aClyZXR1cm4gZm91bmRJbmRleCppbmRleFNpemU7fWVsc2V7aWYoZm91bmRJbmRleCE9PS0xKWktPWktZm91bmRJbmRleDtmb3VuZEluZGV4PS0xO319fWVsc2V7aWYoYnl0ZU9mZnNldCt2YWxMZW5ndGg+YXJyTGVuZ3RoKWJ5dGVPZmZzZXQ9YXJyTGVuZ3RoLXZhbExlbmd0aDtmb3IoaT1ieXRlT2Zmc2V0O2k+PTA7aS0tKXt2YXIgZm91bmQ9dHJ1ZTtmb3IodmFyIGo9MDtqPHZhbExlbmd0aDtqKyspe2lmKHJlYWQoYXJyLGkraikhPT1yZWFkKHZhbCxqKSl7Zm91bmQ9ZmFsc2U7YnJlYWs7fX0KaWYoZm91bmQpcmV0dXJuIGk7fX0KcmV0dXJuLTE7fQpCdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uIGluY2x1ZGVzKHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nKXtyZXR1cm4gdGhpcy5pbmRleE9mKHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nKSE9PS0xO307QnVmZmVyLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uIGluZGV4T2YodmFsLGJ5dGVPZmZzZXQsZW5jb2Rpbmcpe3JldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nLHRydWUpO307QnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbiBsYXN0SW5kZXhPZih2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyl7cmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsdmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZmFsc2UpO307ZnVuY3Rpb24gaGV4V3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtvZmZzZXQ9TnVtYmVyKG9mZnNldCl8fDA7dmFyIHJlbWFpbmluZz1idWYubGVuZ3RoLW9mZnNldDtpZighbGVuZ3RoKXtsZW5ndGg9cmVtYWluaW5nO31lbHNle2xlbmd0aD1OdW1iZXIobGVuZ3RoKTtpZihsZW5ndGg+cmVtYWluaW5nKXtsZW5ndGg9cmVtYWluaW5nO319CnZhciBzdHJMZW49c3RyaW5nLmxlbmd0aDtpZihsZW5ndGg+c3RyTGVuLzIpe2xlbmd0aD1zdHJMZW4vMjt9CmZvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7dmFyIHBhcnNlZD1wYXJzZUludChzdHJpbmcuc3Vic3RyKGkqMiwyKSwxNik7aWYobnVtYmVySXNOYU4ocGFyc2VkKSlyZXR1cm4gaTtidWZbb2Zmc2V0K2ldPXBhcnNlZDt9CnJldHVybiBpO30KZnVuY3Rpb24gdXRmOFdyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLGJ1Zi5sZW5ndGgtb2Zmc2V0KSxidWYsb2Zmc2V0LGxlbmd0aCk7fQpmdW5jdGlvbiBhc2NpaVdyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksYnVmLG9mZnNldCxsZW5ndGgpO30KZnVuY3Rpb24gbGF0aW4xV3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtyZXR1cm4gYXNjaWlXcml0ZShidWYsc3RyaW5nLG9mZnNldCxsZW5ndGgpO30KZnVuY3Rpb24gYmFzZTY0V3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtyZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksYnVmLG9mZnNldCxsZW5ndGgpO30KZnVuY3Rpb24gdWNzMldyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLGJ1Zi5sZW5ndGgtb2Zmc2V0KSxidWYsb2Zmc2V0LGxlbmd0aCk7fQpCdWZmZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uIHdyaXRlKHN0cmluZyxvZmZzZXQsbGVuZ3RoLGVuY29kaW5nKXtpZihvZmZzZXQ9PT11bmRlZmluZWQpe2VuY29kaW5nPSd1dGY4JztsZW5ndGg9dGhpcy5sZW5ndGg7b2Zmc2V0PTA7fWVsc2UgaWYobGVuZ3RoPT09dW5kZWZpbmVkJiZ0eXBlb2Ygb2Zmc2V0PT09J3N0cmluZycpe2VuY29kaW5nPW9mZnNldDtsZW5ndGg9dGhpcy5sZW5ndGg7b2Zmc2V0PTA7fWVsc2UgaWYoaXNGaW5pdGUob2Zmc2V0KSl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoaXNGaW5pdGUobGVuZ3RoKSl7bGVuZ3RoPWxlbmd0aD4+PjA7aWYoZW5jb2Rpbmc9PT11bmRlZmluZWQpZW5jb2Rpbmc9J3V0ZjgnO31lbHNle2VuY29kaW5nPWxlbmd0aDtsZW5ndGg9dW5kZWZpbmVkO319ZWxzZXt0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJyk7fQp2YXIgcmVtYWluaW5nPXRoaXMubGVuZ3RoLW9mZnNldDtpZihsZW5ndGg9PT11bmRlZmluZWR8fGxlbmd0aD5yZW1haW5pbmcpbGVuZ3RoPXJlbWFpbmluZztpZihzdHJpbmcubGVuZ3RoPjAmJihsZW5ndGg8MHx8b2Zmc2V0PDApfHxvZmZzZXQ+dGhpcy5sZW5ndGgpe3Rocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpO30KaWYoIWVuY29kaW5nKWVuY29kaW5nPSd1dGY4Jzt2YXIgbG93ZXJlZENhc2U9ZmFsc2U7Zm9yKDs7KXtzd2l0Y2goZW5jb2Rpbmcpe2Nhc2UnaGV4JzpyZXR1cm4gaGV4V3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7Y2FzZSd1dGY4JzpjYXNlJ3V0Zi04JzpyZXR1cm4gdXRmOFdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2UnYXNjaWknOnJldHVybiBhc2NpaVdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2UnbGF0aW4xJzpjYXNlJ2JpbmFyeSc6cmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2UnYmFzZTY0JzpyZXR1cm4gYmFzZTY0V3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7Y2FzZSd1Y3MyJzpjYXNlJ3Vjcy0yJzpjYXNlJ3V0ZjE2bGUnOmNhc2UndXRmLTE2bGUnOnJldHVybiB1Y3MyV3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7ZGVmYXVsdDppZihsb3dlcmVkQ2FzZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnK2VuY29kaW5nKTtlbmNvZGluZz0oJycrZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7bG93ZXJlZENhc2U9dHJ1ZTt9fX07QnVmZmVyLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJue3R5cGU6J0J1ZmZlcicsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9O307ZnVuY3Rpb24gYmFzZTY0U2xpY2UoYnVmLHN0YXJ0LGVuZCl7aWYoc3RhcnQ9PT0wJiZlbmQ9PT1idWYubGVuZ3RoKXtyZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKTt9ZWxzZXtyZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LGVuZCkpO319CmZ1bmN0aW9uIHV0ZjhTbGljZShidWYsc3RhcnQsZW5kKXtlbmQ9TWF0aC5taW4oYnVmLmxlbmd0aCxlbmQpO3ZhciByZXM9W107dmFyIGk9c3RhcnQ7d2hpbGUoaTxlbmQpe3ZhciBmaXJzdEJ5dGU9YnVmW2ldO3ZhciBjb2RlUG9pbnQ9bnVsbDt2YXIgYnl0ZXNQZXJTZXF1ZW5jZT1maXJzdEJ5dGU+MHhFRj80OmZpcnN0Qnl0ZT4weERGPzM6Zmlyc3RCeXRlPjB4QkY/MjoxO2lmKGkrYnl0ZXNQZXJTZXF1ZW5jZTw9ZW5kKXt2YXIgc2Vjb25kQnl0ZSx0aGlyZEJ5dGUsZm91cnRoQnl0ZSx0ZW1wQ29kZVBvaW50O3N3aXRjaChieXRlc1BlclNlcXVlbmNlKXtjYXNlIDE6aWYoZmlyc3RCeXRlPDB4ODApe2NvZGVQb2ludD1maXJzdEJ5dGU7fQpicmVhaztjYXNlIDI6c2Vjb25kQnl0ZT1idWZbaSsxXTtpZigoc2Vjb25kQnl0ZSYweEMwKT09PTB4ODApe3RlbXBDb2RlUG9pbnQ9KGZpcnN0Qnl0ZSYweDFGKTw8MHg2fHNlY29uZEJ5dGUmMHgzRjtpZih0ZW1wQ29kZVBvaW50PjB4N0Ype2NvZGVQb2ludD10ZW1wQ29kZVBvaW50O319CmJyZWFrO2Nhc2UgMzpzZWNvbmRCeXRlPWJ1ZltpKzFdO3RoaXJkQnl0ZT1idWZbaSsyXTtpZigoc2Vjb25kQnl0ZSYweEMwKT09PTB4ODAmJih0aGlyZEJ5dGUmMHhDMCk9PT0weDgwKXt0ZW1wQ29kZVBvaW50PShmaXJzdEJ5dGUmMHhGKTw8MHhDfChzZWNvbmRCeXRlJjB4M0YpPDwweDZ8dGhpcmRCeXRlJjB4M0Y7aWYodGVtcENvZGVQb2ludD4weDdGRiYmKHRlbXBDb2RlUG9pbnQ8MHhEODAwfHx0ZW1wQ29kZVBvaW50PjB4REZGRikpe2NvZGVQb2ludD10ZW1wQ29kZVBvaW50O319CmJyZWFrO2Nhc2UgNDpzZWNvbmRCeXRlPWJ1ZltpKzFdO3RoaXJkQnl0ZT1idWZbaSsyXTtmb3VydGhCeXRlPWJ1ZltpKzNdO2lmKChzZWNvbmRCeXRlJjB4QzApPT09MHg4MCYmKHRoaXJkQnl0ZSYweEMwKT09PTB4ODAmJihmb3VydGhCeXRlJjB4QzApPT09MHg4MCl7dGVtcENvZGVQb2ludD0oZmlyc3RCeXRlJjB4Rik8PDB4MTJ8KHNlY29uZEJ5dGUmMHgzRik8PDB4Q3wodGhpcmRCeXRlJjB4M0YpPDwweDZ8Zm91cnRoQnl0ZSYweDNGO2lmKHRlbXBDb2RlUG9pbnQ+MHhGRkZGJiZ0ZW1wQ29kZVBvaW50PDB4MTEwMDAwKXtjb2RlUG9pbnQ9dGVtcENvZGVQb2ludDt9fX19CmlmKGNvZGVQb2ludD09PW51bGwpe2NvZGVQb2ludD0weEZGRkQ7Ynl0ZXNQZXJTZXF1ZW5jZT0xO31lbHNlIGlmKGNvZGVQb2ludD4weEZGRkYpe2NvZGVQb2ludC09MHgxMDAwMDtyZXMucHVzaChjb2RlUG9pbnQ+Pj4xMCYweDNGRnwweEQ4MDApO2NvZGVQb2ludD0weERDMDB8Y29kZVBvaW50JjB4M0ZGO30KcmVzLnB1c2goY29kZVBvaW50KTtpKz1ieXRlc1BlclNlcXVlbmNlO30KcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpO30KdmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIPTB4MTAwMDtmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkoY29kZVBvaW50cyl7dmFyIGxlbj1jb2RlUG9pbnRzLmxlbmd0aDtpZihsZW48PU1BWF9BUkdVTUVOVFNfTEVOR1RIKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsY29kZVBvaW50cyk7fQp2YXIgcmVzPScnO3ZhciBpPTA7d2hpbGUoaTxsZW4pe3Jlcys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsY29kZVBvaW50cy5zbGljZShpLGkrPU1BWF9BUkdVTUVOVFNfTEVOR1RIKSk7fQpyZXR1cm4gcmVzO30KZnVuY3Rpb24gYXNjaWlTbGljZShidWYsc3RhcnQsZW5kKXt2YXIgcmV0PScnO2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZCk7Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kOysraSl7cmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSYweDdGKTt9CnJldHVybiByZXQ7fQpmdW5jdGlvbiBsYXRpbjFTbGljZShidWYsc3RhcnQsZW5kKXt2YXIgcmV0PScnO2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZCk7Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kOysraSl7cmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7fQpyZXR1cm4gcmV0O30KZnVuY3Rpb24gaGV4U2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIGxlbj1idWYubGVuZ3RoO2lmKCFzdGFydHx8c3RhcnQ8MClzdGFydD0wO2lmKCFlbmR8fGVuZDwwfHxlbmQ+bGVuKWVuZD1sZW47dmFyIG91dD0nJztmb3IodmFyIGk9c3RhcnQ7aTxlbmQ7KytpKXtvdXQrPXRvSGV4KGJ1ZltpXSk7fQpyZXR1cm4gb3V0O30KZnVuY3Rpb24gdXRmMTZsZVNsaWNlKGJ1ZixzdGFydCxlbmQpe3ZhciBieXRlcz1idWYuc2xpY2Uoc3RhcnQsZW5kKTt2YXIgcmVzPScnO2Zvcih2YXIgaT0wO2k8Ynl0ZXMubGVuZ3RoO2krPTIpe3Jlcys9U3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXStieXRlc1tpKzFdKjI1Nik7fQpyZXR1cm4gcmVzO30KQnVmZmVyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbiBzbGljZShzdGFydCxlbmQpe3ZhciBsZW49dGhpcy5sZW5ndGg7c3RhcnQ9fn5zdGFydDtlbmQ9ZW5kPT09dW5kZWZpbmVkP2xlbjp+fmVuZDtpZihzdGFydDwwKXtzdGFydCs9bGVuO2lmKHN0YXJ0PDApc3RhcnQ9MDt9ZWxzZSBpZihzdGFydD5sZW4pe3N0YXJ0PWxlbjt9CmlmKGVuZDwwKXtlbmQrPWxlbjtpZihlbmQ8MCllbmQ9MDt9ZWxzZSBpZihlbmQ+bGVuKXtlbmQ9bGVuO30KaWYoZW5kPHN0YXJ0KWVuZD1zdGFydDt2YXIgbmV3QnVmPXRoaXMuc3ViYXJyYXkoc3RhcnQsZW5kKTtuZXdCdWYuX19wcm90b19fPUJ1ZmZlci5wcm90b3R5cGU7cmV0dXJuIG5ld0J1Zjt9O2Z1bmN0aW9uIGNoZWNrT2Zmc2V0KG9mZnNldCxleHQsbGVuZ3RoKXtpZihvZmZzZXQlMSE9PTB8fG9mZnNldDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKTtpZihvZmZzZXQrZXh0Pmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpO30KQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uIHJlYWRVSW50TEUob2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpe29mZnNldD1vZmZzZXQ+Pj4wO2J5dGVMZW5ndGg9Ynl0ZUxlbmd0aD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTt2YXIgdmFsPXRoaXNbb2Zmc2V0XTt2YXIgbXVsPTE7dmFyIGk9MDt3aGlsZSgrK2k8Ynl0ZUxlbmd0aCYmKG11bCo9MHgxMDApKXt2YWwrPXRoaXNbb2Zmc2V0K2ldKm11bDt9CnJldHVybiB2YWw7fTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24gcmVhZFVJbnRCRShvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7Ynl0ZUxlbmd0aD1ieXRlTGVuZ3RoPj4+MDtpZighbm9Bc3NlcnQpe2NoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTt9CnZhciB2YWw9dGhpc1tvZmZzZXQrLS1ieXRlTGVuZ3RoXTt2YXIgbXVsPTE7d2hpbGUoYnl0ZUxlbmd0aD4wJiYobXVsKj0weDEwMCkpe3ZhbCs9dGhpc1tvZmZzZXQrLS1ieXRlTGVuZ3RoXSptdWw7fQpyZXR1cm4gdmFsO307QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24gcmVhZFVJbnQ4KG9mZnNldCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCwxLHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tvZmZzZXRdO307QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24gcmVhZFVJbnQxNkxFKG9mZnNldCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCwyLHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4O307QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24gcmVhZFVJbnQxNkJFKG9mZnNldCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCwyLHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tvZmZzZXRdPDw4fHRoaXNbb2Zmc2V0KzFdO307QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCw0LHRoaXMubGVuZ3RoKTtyZXR1cm4odGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4fHRoaXNbb2Zmc2V0KzJdPDwxNikrCnRoaXNbb2Zmc2V0KzNdKjB4MTAwMDAwMDt9O0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uIHJlYWRVSW50MzJCRShvZmZzZXQsbm9Bc3NlcnQpe29mZnNldD1vZmZzZXQ+Pj4wO2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsNCx0aGlzLmxlbmd0aCk7cmV0dXJuIHRoaXNbb2Zmc2V0XSoweDEwMDAwMDArKHRoaXNbb2Zmc2V0KzFdPDwxNnx0aGlzW29mZnNldCsyXTw8OHx0aGlzW29mZnNldCszXSk7fTtCdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbiByZWFkSW50TEUob2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpe29mZnNldD1vZmZzZXQ+Pj4wO2J5dGVMZW5ndGg9Ynl0ZUxlbmd0aD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTt2YXIgdmFsPXRoaXNbb2Zmc2V0XTt2YXIgbXVsPTE7dmFyIGk9MDt3aGlsZSgrK2k8Ynl0ZUxlbmd0aCYmKG11bCo9MHgxMDApKXt2YWwrPXRoaXNbb2Zmc2V0K2ldKm11bDt9Cm11bCo9MHg4MDtpZih2YWw+PW11bCl2YWwtPU1hdGgucG93KDIsOCpieXRlTGVuZ3RoKTtyZXR1cm4gdmFsO307QnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24gcmVhZEludEJFKG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtieXRlTGVuZ3RoPWJ5dGVMZW5ndGg+Pj4wO2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsYnl0ZUxlbmd0aCx0aGlzLmxlbmd0aCk7dmFyIGk9Ynl0ZUxlbmd0aDt2YXIgbXVsPTE7dmFyIHZhbD10aGlzW29mZnNldCstLWldO3doaWxlKGk+MCYmKG11bCo9MHgxMDApKXt2YWwrPXRoaXNbb2Zmc2V0Ky0taV0qbXVsO30KbXVsKj0weDgwO2lmKHZhbD49bXVsKXZhbC09TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgpO3JldHVybiB2YWw7fTtCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uIHJlYWRJbnQ4KG9mZnNldCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCwxLHRoaXMubGVuZ3RoKTtpZighKHRoaXNbb2Zmc2V0XSYweDgwKSlyZXR1cm4gdGhpc1tvZmZzZXRdO3JldHVybigweGZmLXRoaXNbb2Zmc2V0XSsxKSotMTt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpO3ZhciB2YWw9dGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4O3JldHVybiB2YWwmMHg4MDAwP3ZhbHwweEZGRkYwMDAwOnZhbDt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpO3ZhciB2YWw9dGhpc1tvZmZzZXQrMV18dGhpc1tvZmZzZXRdPDw4O3JldHVybiB2YWwmMHg4MDAwP3ZhbHwweEZGRkYwMDAwOnZhbDt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24gcmVhZEludDMyTEUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW29mZnNldF18dGhpc1tvZmZzZXQrMV08PDh8dGhpc1tvZmZzZXQrMl08PDE2fHRoaXNbb2Zmc2V0KzNdPDwyNDt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW29mZnNldF08PDI0fHRoaXNbb2Zmc2V0KzFdPDwxNnx0aGlzW29mZnNldCsyXTw8OHx0aGlzW29mZnNldCszXTt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24gcmVhZEZsb2F0TEUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiBpZWVlNzU0LnJlYWQodGhpcyxvZmZzZXQsdHJ1ZSwyMyw0KTt9O0J1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24gcmVhZEZsb2F0QkUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiBpZWVlNzU0LnJlYWQodGhpcyxvZmZzZXQsZmFsc2UsMjMsNCk7fTtCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbiByZWFkRG91YmxlTEUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDgsdGhpcy5sZW5ndGgpO3JldHVybiBpZWVlNzU0LnJlYWQodGhpcyxvZmZzZXQsdHJ1ZSw1Miw4KTt9O0J1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uIHJlYWREb3VibGVCRShvZmZzZXQsbm9Bc3NlcnQpe29mZnNldD1vZmZzZXQ+Pj4wO2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsOCx0aGlzLmxlbmd0aCk7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLG9mZnNldCxmYWxzZSw1Miw4KTt9O2Z1bmN0aW9uIGNoZWNrSW50KGJ1Zix2YWx1ZSxvZmZzZXQsZXh0LG1heCxtaW4pe2lmKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodmFsdWU+bWF4fHx2YWx1ZTxtaW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG9mZnNldCtleHQ+YnVmLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7fQpCdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uIHdyaXRlVUludExFKHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7Ynl0ZUxlbmd0aD1ieXRlTGVuZ3RoPj4+MDtpZighbm9Bc3NlcnQpe3ZhciBtYXhCeXRlcz1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aCktMTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG1heEJ5dGVzLDApO30KdmFyIG11bD0xO3ZhciBpPTA7dGhpc1tvZmZzZXRdPXZhbHVlJjB4RkY7d2hpbGUoKytpPGJ5dGVMZW5ndGgmJihtdWwqPTB4MTAwKSl7dGhpc1tvZmZzZXQraV09dmFsdWUvbXVsJjB4RkY7fQpyZXR1cm4gb2Zmc2V0K2J5dGVMZW5ndGg7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uIHdyaXRlVUludEJFKHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7Ynl0ZUxlbmd0aD1ieXRlTGVuZ3RoPj4+MDtpZighbm9Bc3NlcnQpe3ZhciBtYXhCeXRlcz1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aCktMTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG1heEJ5dGVzLDApO30KdmFyIGk9Ynl0ZUxlbmd0aC0xO3ZhciBtdWw9MTt0aGlzW29mZnNldCtpXT12YWx1ZSYweEZGO3doaWxlKC0taT49MCYmKG11bCo9MHgxMDApKXt0aGlzW29mZnNldCtpXT12YWx1ZS9tdWwmMHhGRjt9CnJldHVybiBvZmZzZXQrYnl0ZUxlbmd0aDt9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXQ+Pj4wO2lmKCFub0Fzc2VydCljaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwxLDB4ZmYsMCk7dGhpc1tvZmZzZXRdPXZhbHVlJjB4ZmY7cmV0dXJuIG9mZnNldCsxO307QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlVUludDE2TEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDIsMHhmZmZmLDApO3RoaXNbb2Zmc2V0XT12YWx1ZSYweGZmO3RoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+ODtyZXR1cm4gb2Zmc2V0KzI7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24gd3JpdGVVSW50MTZCRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMiwweGZmZmYsMCk7dGhpc1tvZmZzZXRdPXZhbHVlPj4+ODt0aGlzW29mZnNldCsxXT12YWx1ZSYweGZmO3JldHVybiBvZmZzZXQrMjt9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbiB3cml0ZVVJbnQzMkxFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXQ+Pj4wO2lmKCFub0Fzc2VydCljaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCw0LDB4ZmZmZmZmZmYsMCk7dGhpc1tvZmZzZXQrM109dmFsdWU+Pj4yNDt0aGlzW29mZnNldCsyXT12YWx1ZT4+PjE2O3RoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+ODt0aGlzW29mZnNldF09dmFsdWUmMHhmZjtyZXR1cm4gb2Zmc2V0KzQ7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24gd3JpdGVVSW50MzJCRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsNCwweGZmZmZmZmZmLDApO3RoaXNbb2Zmc2V0XT12YWx1ZT4+PjI0O3RoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+MTY7dGhpc1tvZmZzZXQrMl09dmFsdWU+Pj44O3RoaXNbb2Zmc2V0KzNdPXZhbHVlJjB4ZmY7cmV0dXJuIG9mZnNldCs0O307QnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uIHdyaXRlSW50TEUodmFsdWUsb2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpe3ZhciBsaW1pdD1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aC0xKTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLGxpbWl0LTEsLWxpbWl0KTt9CnZhciBpPTA7dmFyIG11bD0xO3ZhciBzdWI9MDt0aGlzW29mZnNldF09dmFsdWUmMHhGRjt3aGlsZSgrK2k8Ynl0ZUxlbmd0aCYmKG11bCo9MHgxMDApKXtpZih2YWx1ZTwwJiZzdWI9PT0wJiZ0aGlzW29mZnNldCtpLTFdIT09MCl7c3ViPTE7fQp0aGlzW29mZnNldCtpXT0odmFsdWUvbXVsPj4wKS1zdWImMHhGRjt9CnJldHVybiBvZmZzZXQrYnl0ZUxlbmd0aDt9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbiB3cml0ZUludEJFKHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KXt2YXIgbGltaXQ9TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgtMSk7Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxsaW1pdC0xLC1saW1pdCk7fQp2YXIgaT1ieXRlTGVuZ3RoLTE7dmFyIG11bD0xO3ZhciBzdWI9MDt0aGlzW29mZnNldCtpXT12YWx1ZSYweEZGO3doaWxlKC0taT49MCYmKG11bCo9MHgxMDApKXtpZih2YWx1ZTwwJiZzdWI9PT0wJiZ0aGlzW29mZnNldCtpKzFdIT09MCl7c3ViPTE7fQp0aGlzW29mZnNldCtpXT0odmFsdWUvbXVsPj4wKS1zdWImMHhGRjt9CnJldHVybiBvZmZzZXQrYnl0ZUxlbmd0aDt9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uIHdyaXRlSW50OCh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0Pj4+MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMSwweDdmLC0weDgwKTtpZih2YWx1ZTwwKXZhbHVlPTB4ZmYrdmFsdWUrMTt0aGlzW29mZnNldF09dmFsdWUmMHhmZjtyZXR1cm4gb2Zmc2V0KzE7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbiB3cml0ZUludDE2TEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDIsMHg3ZmZmLC0weDgwMDApO3RoaXNbb2Zmc2V0XT12YWx1ZSYweGZmO3RoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+ODtyZXR1cm4gb2Zmc2V0KzI7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDIsMHg3ZmZmLC0weDgwMDApO3RoaXNbb2Zmc2V0XT12YWx1ZT4+Pjg7dGhpc1tvZmZzZXQrMV09dmFsdWUmMHhmZjtyZXR1cm4gb2Zmc2V0KzI7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbiB3cml0ZUludDMyTEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDQsMHg3ZmZmZmZmZiwtMHg4MDAwMDAwMCk7dGhpc1tvZmZzZXRdPXZhbHVlJjB4ZmY7dGhpc1tvZmZzZXQrMV09dmFsdWU+Pj44O3RoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+MTY7dGhpc1tvZmZzZXQrM109dmFsdWU+Pj4yNDtyZXR1cm4gb2Zmc2V0KzQ7fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbiB3cml0ZUludDMyQkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDQsMHg3ZmZmZmZmZiwtMHg4MDAwMDAwMCk7aWYodmFsdWU8MCl2YWx1ZT0weGZmZmZmZmZmK3ZhbHVlKzE7dGhpc1tvZmZzZXRdPXZhbHVlPj4+MjQ7dGhpc1tvZmZzZXQrMV09dmFsdWU+Pj4xNjt0aGlzW29mZnNldCsyXT12YWx1ZT4+Pjg7dGhpc1tvZmZzZXQrM109dmFsdWUmMHhmZjtyZXR1cm4gb2Zmc2V0KzQ7fTtmdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLHZhbHVlLG9mZnNldCxleHQsbWF4LG1pbil7aWYob2Zmc2V0K2V4dD5idWYubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtpZihvZmZzZXQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7fQpmdW5jdGlvbiB3cml0ZUZsb2F0KGJ1Zix2YWx1ZSxvZmZzZXQsbGl0dGxlRW5kaWFuLG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KXtjaGVja0lFRUU3NTQoYnVmLHZhbHVlLG9mZnNldCw0LDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpO30KaWVlZTc1NC53cml0ZShidWYsdmFsdWUsb2Zmc2V0LGxpdHRsZUVuZGlhbiwyMyw0KTtyZXR1cm4gb2Zmc2V0KzQ7fQpCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbiB3cml0ZUZsb2F0TEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gd3JpdGVGbG9hdCh0aGlzLHZhbHVlLG9mZnNldCx0cnVlLG5vQXNzZXJ0KTt9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsdmFsdWUsb2Zmc2V0LGZhbHNlLG5vQXNzZXJ0KTt9O2Z1bmN0aW9uIHdyaXRlRG91YmxlKGJ1Zix2YWx1ZSxvZmZzZXQsbGl0dGxlRW5kaWFuLG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldD4+PjA7aWYoIW5vQXNzZXJ0KXtjaGVja0lFRUU3NTQoYnVmLHZhbHVlLG9mZnNldCw4LDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCk7fQppZWVlNzU0LndyaXRlKGJ1Zix2YWx1ZSxvZmZzZXQsbGl0dGxlRW5kaWFuLDUyLDgpO3JldHVybiBvZmZzZXQrODt9CkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbiB3cml0ZURvdWJsZUxFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsdmFsdWUsb2Zmc2V0LHRydWUsbm9Bc3NlcnQpO307QnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uIHdyaXRlRG91YmxlQkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gd3JpdGVEb3VibGUodGhpcyx2YWx1ZSxvZmZzZXQsZmFsc2Usbm9Bc3NlcnQpO307QnVmZmVyLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uIGNvcHkodGFyZ2V0LHRhcmdldFN0YXJ0LHN0YXJ0LGVuZCl7aWYoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpO2lmKCFzdGFydClzdGFydD0wO2lmKCFlbmQmJmVuZCE9PTApZW5kPXRoaXMubGVuZ3RoO2lmKHRhcmdldFN0YXJ0Pj10YXJnZXQubGVuZ3RoKXRhcmdldFN0YXJ0PXRhcmdldC5sZW5ndGg7aWYoIXRhcmdldFN0YXJ0KXRhcmdldFN0YXJ0PTA7aWYoZW5kPjAmJmVuZDxzdGFydCllbmQ9c3RhcnQ7aWYoZW5kPT09c3RhcnQpcmV0dXJuIDA7aWYodGFyZ2V0Lmxlbmd0aD09PTB8fHRoaXMubGVuZ3RoPT09MClyZXR1cm4gMDtpZih0YXJnZXRTdGFydDwwKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpO30KaWYoc3RhcnQ8MHx8c3RhcnQ+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtpZihlbmQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKTtpZihlbmQ+dGhpcy5sZW5ndGgpZW5kPXRoaXMubGVuZ3RoO2lmKHRhcmdldC5sZW5ndGgtdGFyZ2V0U3RhcnQ8ZW5kLXN0YXJ0KXtlbmQ9dGFyZ2V0Lmxlbmd0aC10YXJnZXRTdGFydCtzdGFydDt9CnZhciBsZW49ZW5kLXN0YXJ0O2lmKHRoaXM9PT10YXJnZXQmJnR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluPT09J2Z1bmN0aW9uJyl7dGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LHN0YXJ0LGVuZCk7fWVsc2UgaWYodGhpcz09PXRhcmdldCYmc3RhcnQ8dGFyZ2V0U3RhcnQmJnRhcmdldFN0YXJ0PGVuZCl7Zm9yKHZhciBpPWxlbi0xO2k+PTA7LS1pKXt0YXJnZXRbaSt0YXJnZXRTdGFydF09dGhpc1tpK3N0YXJ0XTt9fWVsc2V7VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodGFyZ2V0LHRoaXMuc3ViYXJyYXkoc3RhcnQsZW5kKSx0YXJnZXRTdGFydCk7fQpyZXR1cm4gbGVuO307QnVmZmVyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uIGZpbGwodmFsLHN0YXJ0LGVuZCxlbmNvZGluZyl7aWYodHlwZW9mIHZhbD09PSdzdHJpbmcnKXtpZih0eXBlb2Ygc3RhcnQ9PT0nc3RyaW5nJyl7ZW5jb2Rpbmc9c3RhcnQ7c3RhcnQ9MDtlbmQ9dGhpcy5sZW5ndGg7fWVsc2UgaWYodHlwZW9mIGVuZD09PSdzdHJpbmcnKXtlbmNvZGluZz1lbmQ7ZW5kPXRoaXMubGVuZ3RoO30KaWYoZW5jb2RpbmchPT11bmRlZmluZWQmJnR5cGVvZiBlbmNvZGluZyE9PSdzdHJpbmcnKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJyk7fQppZih0eXBlb2YgZW5jb2Rpbmc9PT0nc3RyaW5nJyYmIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSl7dGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJytlbmNvZGluZyk7fQppZih2YWwubGVuZ3RoPT09MSl7dmFyIGNvZGU9dmFsLmNoYXJDb2RlQXQoMCk7aWYoZW5jb2Rpbmc9PT0ndXRmOCcmJmNvZGU8MTI4fHxlbmNvZGluZz09PSdsYXRpbjEnKXt2YWw9Y29kZTt9fX1lbHNlIGlmKHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7dmFsPXZhbCYyNTU7fQppZihzdGFydDwwfHx0aGlzLmxlbmd0aDxzdGFydHx8dGhpcy5sZW5ndGg8ZW5kKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4Jyk7fQppZihlbmQ8PXN0YXJ0KXtyZXR1cm4gdGhpczt9CnN0YXJ0PXN0YXJ0Pj4+MDtlbmQ9ZW5kPT09dW5kZWZpbmVkP3RoaXMubGVuZ3RoOmVuZD4+PjA7aWYoIXZhbCl2YWw9MDt2YXIgaTtpZih0eXBlb2YgdmFsPT09J251bWJlcicpe2ZvcihpPXN0YXJ0O2k8ZW5kOysraSl7dGhpc1tpXT12YWw7fX1lbHNle3ZhciBieXRlcz1CdWZmZXIuaXNCdWZmZXIodmFsKT92YWw6bmV3IEJ1ZmZlcih2YWwsZW5jb2RpbmcpO3ZhciBsZW49Ynl0ZXMubGVuZ3RoO2lmKGxlbj09PTApe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSAiJyt2YWwrJyIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgInZhbHVlIicpO30KZm9yKGk9MDtpPGVuZC1zdGFydDsrK2kpe3RoaXNbaStzdGFydF09Ynl0ZXNbaSVsZW5dO319CnJldHVybiB0aGlzO307dmFyIElOVkFMSURfQkFTRTY0X1JFPS9bXisvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gYmFzZTY0Y2xlYW4oc3RyKXtzdHI9c3RyLnNwbGl0KCc9JylbMF07c3RyPXN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwnJyk7aWYoc3RyLmxlbmd0aDwyKXJldHVybicnO3doaWxlKHN0ci5sZW5ndGglNCE9PTApe3N0cj1zdHIrJz0nO30KcmV0dXJuIHN0cjt9CmZ1bmN0aW9uIHRvSGV4KG4pe2lmKG48MTYpcmV0dXJuJzAnK24udG9TdHJpbmcoMTYpO3JldHVybiBuLnRvU3RyaW5nKDE2KTt9CmZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZyx1bml0cyl7dW5pdHM9dW5pdHN8fEluZmluaXR5O3ZhciBjb2RlUG9pbnQ7dmFyIGxlbmd0aD1zdHJpbmcubGVuZ3RoO3ZhciBsZWFkU3Vycm9nYXRlPW51bGw7dmFyIGJ5dGVzPVtdO2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7Y29kZVBvaW50PXN0cmluZy5jaGFyQ29kZUF0KGkpO2lmKGNvZGVQb2ludD4weEQ3RkYmJmNvZGVQb2ludDwweEUwMDApe2lmKCFsZWFkU3Vycm9nYXRlKXtpZihjb2RlUG9pbnQ+MHhEQkZGKXtpZigodW5pdHMtPTMpPi0xKWJ5dGVzLnB1c2goMHhFRiwweEJGLDB4QkQpO2NvbnRpbnVlO31lbHNlIGlmKGkrMT09PWxlbmd0aCl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDB4RUYsMHhCRiwweEJEKTtjb250aW51ZTt9CmxlYWRTdXJyb2dhdGU9Y29kZVBvaW50O2NvbnRpbnVlO30KaWYoY29kZVBvaW50PDB4REMwMCl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDB4RUYsMHhCRiwweEJEKTtsZWFkU3Vycm9nYXRlPWNvZGVQb2ludDtjb250aW51ZTt9CmNvZGVQb2ludD0obGVhZFN1cnJvZ2F0ZS0weEQ4MDA8PDEwfGNvZGVQb2ludC0weERDMDApKzB4MTAwMDA7fWVsc2UgaWYobGVhZFN1cnJvZ2F0ZSl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDB4RUYsMHhCRiwweEJEKTt9CmxlYWRTdXJyb2dhdGU9bnVsbDtpZihjb2RlUG9pbnQ8MHg4MCl7aWYoKHVuaXRzLT0xKTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50KTt9ZWxzZSBpZihjb2RlUG9pbnQ8MHg4MDApe2lmKCh1bml0cy09Mik8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+MHg2fDB4QzAsY29kZVBvaW50JjB4M0Z8MHg4MCk7fWVsc2UgaWYoY29kZVBvaW50PDB4MTAwMDApe2lmKCh1bml0cy09Myk8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+MHhDfDB4RTAsY29kZVBvaW50Pj4weDYmMHgzRnwweDgwLGNvZGVQb2ludCYweDNGfDB4ODApO31lbHNlIGlmKGNvZGVQb2ludDwweDExMDAwMCl7aWYoKHVuaXRzLT00KTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50Pj4weDEyfDB4RjAsY29kZVBvaW50Pj4weEMmMHgzRnwweDgwLGNvZGVQb2ludD4+MHg2JjB4M0Z8MHg4MCxjb2RlUG9pbnQmMHgzRnwweDgwKTt9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpO319CnJldHVybiBieXRlczt9CmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyhzdHIpe3ZhciBieXRlQXJyYXk9W107Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7Ynl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkmMHhGRik7fQpyZXR1cm4gYnl0ZUFycmF5O30KZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMoc3RyLHVuaXRzKXt2YXIgYyxoaSxsbzt2YXIgYnl0ZUFycmF5PVtdO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDsrK2kpe2lmKCh1bml0cy09Mik8MClicmVhaztjPXN0ci5jaGFyQ29kZUF0KGkpO2hpPWM+Pjg7bG89YyUyNTY7Ynl0ZUFycmF5LnB1c2gobG8pO2J5dGVBcnJheS5wdXNoKGhpKTt9CnJldHVybiBieXRlQXJyYXk7fQpmdW5jdGlvbiBiYXNlNjRUb0J5dGVzKHN0cil7cmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKTt9CmZ1bmN0aW9uIGJsaXRCdWZmZXIoc3JjLGRzdCxvZmZzZXQsbGVuZ3RoKXtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe2lmKGkrb2Zmc2V0Pj1kc3QubGVuZ3RofHxpPj1zcmMubGVuZ3RoKWJyZWFrO2RzdFtpK29mZnNldF09c3JjW2ldO30KcmV0dXJuIGk7fQpmdW5jdGlvbiBpc0FycmF5QnVmZmVyKG9iail7cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxvYmohPW51bGwmJm9iai5jb25zdHJ1Y3RvciE9bnVsbCYmb2JqLmNvbnN0cnVjdG9yLm5hbWU9PT0nQXJyYXlCdWZmZXInJiZ0eXBlb2Ygb2JqLmJ5dGVMZW5ndGg9PT0nbnVtYmVyJzt9CmZ1bmN0aW9uIG51bWJlcklzTmFOKG9iail7cmV0dXJuIG9iaiE9PW9iajt9fSx7ImJhc2U2NC1qcyI6NTQsImllZWU3NTQiOjYzfV0sNjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihCdWZmZXIpe2Z1bmN0aW9uIGlzQXJyYXkoYXJnKXtpZihBcnJheS5pc0FycmF5KXtyZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO30KcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZyk9PT0nW29iamVjdCBBcnJheV0nO30KZXhwb3J0cy5pc0FycmF5PWlzQXJyYXk7ZnVuY3Rpb24gaXNCb29sZWFuKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nYm9vbGVhbic7fQpleHBvcnRzLmlzQm9vbGVhbj1pc0Jvb2xlYW47ZnVuY3Rpb24gaXNOdWxsKGFyZyl7cmV0dXJuIGFyZz09PW51bGw7fQpleHBvcnRzLmlzTnVsbD1pc051bGw7ZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKXtyZXR1cm4gYXJnPT1udWxsO30KZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZD1pc051bGxPclVuZGVmaW5lZDtmdW5jdGlvbiBpc051bWJlcihhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09J251bWJlcic7fQpleHBvcnRzLmlzTnVtYmVyPWlzTnVtYmVyO2Z1bmN0aW9uIGlzU3RyaW5nKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nc3RyaW5nJzt9CmV4cG9ydHMuaXNTdHJpbmc9aXNTdHJpbmc7ZnVuY3Rpb24gaXNTeW1ib2woYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PSdzeW1ib2wnO30KZXhwb3J0cy5pc1N5bWJvbD1pc1N5bWJvbDtmdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpe3JldHVybiBhcmc9PT12b2lkIDA7fQpleHBvcnRzLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2Z1bmN0aW9uIGlzUmVnRXhwKHJlKXtyZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpPT09J1tvYmplY3QgUmVnRXhwXSc7fQpleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwO2Z1bmN0aW9uIGlzT2JqZWN0KGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nb2JqZWN0JyYmYXJnIT09bnVsbDt9CmV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3Q7ZnVuY3Rpb24gaXNEYXRlKGQpe3JldHVybiBvYmplY3RUb1N0cmluZyhkKT09PSdbb2JqZWN0IERhdGVdJzt9CmV4cG9ydHMuaXNEYXRlPWlzRGF0ZTtmdW5jdGlvbiBpc0Vycm9yKGUpe3JldHVybiBvYmplY3RUb1N0cmluZyhlKT09PSdbb2JqZWN0IEVycm9yXSd8fGUgaW5zdGFuY2VvZiBFcnJvcjt9CmV4cG9ydHMuaXNFcnJvcj1pc0Vycm9yO2Z1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PSdmdW5jdGlvbic7fQpleHBvcnRzLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtmdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpe3JldHVybiBhcmc9PT1udWxsfHx0eXBlb2YgYXJnPT09J2Jvb2xlYW4nfHx0eXBlb2YgYXJnPT09J251bWJlcid8fHR5cGVvZiBhcmc9PT0nc3RyaW5nJ3x8dHlwZW9mIGFyZz09PSdzeW1ib2wnfHx0eXBlb2YgYXJnPT09J3VuZGVmaW5lZCc7fQpleHBvcnRzLmlzUHJpbWl0aXZlPWlzUHJpbWl0aXZlO2V4cG9ydHMuaXNCdWZmZXI9QnVmZmVyLmlzQnVmZmVyO2Z1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7fX0pLmNhbGwodGhpcyx7ImlzQnVmZmVyIjpyZXF1aXJlKCIuLi8uLi9pcy1idWZmZXIvaW5kZXguanMiKX0pO30seyIuLi8uLi9pcy1idWZmZXIvaW5kZXguanMiOjY1fV0sNjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBvYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8b2JqZWN0Q3JlYXRlUG9seWZpbGw7dmFyIG9iamVjdEtleXM9T2JqZWN0LmtleXN8fG9iamVjdEtleXNQb2x5ZmlsbDt2YXIgYmluZD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8ZnVuY3Rpb25CaW5kUG9seWZpbGw7ZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCl7aWYoIXRoaXMuX2V2ZW50c3x8IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCdfZXZlbnRzJykpe3RoaXMuX2V2ZW50cz1vYmplY3RDcmVhdGUobnVsbCk7dGhpcy5fZXZlbnRzQ291bnQ9MDt9CnRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHVuZGVmaW5lZDt9Cm1vZHVsZS5leHBvcnRzPUV2ZW50RW1pdHRlcjtFdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyPUV2ZW50RW1pdHRlcjtFdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHM9dW5kZWZpbmVkO0V2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycz11bmRlZmluZWQ7dmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnM9MTA7dmFyIGhhc0RlZmluZVByb3BlcnR5O3RyeXt2YXIgbz17fTtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkpT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sJ3gnLHt2YWx1ZTowfSk7aGFzRGVmaW5lUHJvcGVydHk9by54PT09MDt9Y2F0Y2goZXJyKXtoYXNEZWZpbmVQcm9wZXJ0eT1mYWxzZTt9CmlmKGhhc0RlZmluZVByb3BlcnR5KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCdkZWZhdWx0TWF4TGlzdGVuZXJzJyx7ZW51bWVyYWJsZTp0cnVlLGdldDpmdW5jdGlvbigpe3JldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO30sc2V0OmZ1bmN0aW9uKGFyZyl7aWYodHlwZW9mIGFyZyE9PSdudW1iZXInfHxhcmc8MHx8YXJnIT09YXJnKQp0aHJvdyBuZXcgVHlwZUVycm9yKCciZGVmYXVsdE1heExpc3RlbmVycyIgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO2RlZmF1bHRNYXhMaXN0ZW5lcnM9YXJnO319KTt9ZWxzZXtFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycz1kZWZhdWx0TWF4TGlzdGVuZXJzO30KRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pe2lmKHR5cGVvZiBuIT09J251bWJlcid8fG48MHx8aXNOYU4obikpCnRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7dGhpcy5fbWF4TGlzdGVuZXJzPW47cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiAkZ2V0TWF4TGlzdGVuZXJzKHRoYXQpe2lmKHRoYXQuX21heExpc3RlbmVycz09PXVuZGVmaW5lZCkKcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO3JldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7fQpFdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKXtyZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTt9O2Z1bmN0aW9uIGVtaXROb25lKGhhbmRsZXIsaXNGbixzZWxmKXtpZihpc0ZuKQpoYW5kbGVyLmNhbGwoc2VsZik7ZWxzZQp7dmFyIGxlbj1oYW5kbGVyLmxlbmd0aDt2YXIgbGlzdGVuZXJzPWFycmF5Q2xvbmUoaGFuZGxlcixsZW4pO2Zvcih2YXIgaT0wO2k8bGVuOysraSkKbGlzdGVuZXJzW2ldLmNhbGwoc2VsZik7fX0KZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLGlzRm4sc2VsZixhcmcxKXtpZihpc0ZuKQpoYW5kbGVyLmNhbGwoc2VsZixhcmcxKTtlbHNlCnt2YXIgbGVuPWhhbmRsZXIubGVuZ3RoO3ZhciBsaXN0ZW5lcnM9YXJyYXlDbG9uZShoYW5kbGVyLGxlbik7Zm9yKHZhciBpPTA7aTxsZW47KytpKQpsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLGFyZzEpO319CmZ1bmN0aW9uIGVtaXRUd28oaGFuZGxlcixpc0ZuLHNlbGYsYXJnMSxhcmcyKXtpZihpc0ZuKQpoYW5kbGVyLmNhbGwoc2VsZixhcmcxLGFyZzIpO2Vsc2UKe3ZhciBsZW49aGFuZGxlci5sZW5ndGg7dmFyIGxpc3RlbmVycz1hcnJheUNsb25lKGhhbmRsZXIsbGVuKTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpCmxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsYXJnMSxhcmcyKTt9fQpmdW5jdGlvbiBlbWl0VGhyZWUoaGFuZGxlcixpc0ZuLHNlbGYsYXJnMSxhcmcyLGFyZzMpe2lmKGlzRm4pCmhhbmRsZXIuY2FsbChzZWxmLGFyZzEsYXJnMixhcmczKTtlbHNlCnt2YXIgbGVuPWhhbmRsZXIubGVuZ3RoO3ZhciBsaXN0ZW5lcnM9YXJyYXlDbG9uZShoYW5kbGVyLGxlbik7Zm9yKHZhciBpPTA7aTxsZW47KytpKQpsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLGFyZzEsYXJnMixhcmczKTt9fQpmdW5jdGlvbiBlbWl0TWFueShoYW5kbGVyLGlzRm4sc2VsZixhcmdzKXtpZihpc0ZuKQpoYW5kbGVyLmFwcGx5KHNlbGYsYXJncyk7ZWxzZQp7dmFyIGxlbj1oYW5kbGVyLmxlbmd0aDt2YXIgbGlzdGVuZXJzPWFycmF5Q2xvbmUoaGFuZGxlcixsZW4pO2Zvcih2YXIgaT0wO2k8bGVuOysraSkKbGlzdGVuZXJzW2ldLmFwcGx5KHNlbGYsYXJncyk7fX0KRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uIGVtaXQodHlwZSl7dmFyIGVyLGhhbmRsZXIsbGVuLGFyZ3MsaSxldmVudHM7dmFyIGRvRXJyb3I9dHlwZT09PSdlcnJvcic7ZXZlbnRzPXRoaXMuX2V2ZW50cztpZihldmVudHMpCmRvRXJyb3I9ZG9FcnJvciYmZXZlbnRzLmVycm9yPT1udWxsO2Vsc2UKaWYoIWRvRXJyb3IpCnJldHVybiBmYWxzZTtpZihkb0Vycm9yKXtpZihhcmd1bWVudHMubGVuZ3RoPjEpCmVyPWFyZ3VtZW50c1sxXTtpZihlciBpbnN0YW5jZW9mIEVycm9yKXt0aHJvdyBlcjt9ZWxzZXt2YXIgZXJyPW5ldyBFcnJvcignVW5oYW5kbGVkICJlcnJvciIgZXZlbnQuICgnK2VyKycpJyk7ZXJyLmNvbnRleHQ9ZXI7dGhyb3cgZXJyO30KcmV0dXJuIGZhbHNlO30KaGFuZGxlcj1ldmVudHNbdHlwZV07aWYoIWhhbmRsZXIpCnJldHVybiBmYWxzZTt2YXIgaXNGbj10eXBlb2YgaGFuZGxlcj09PSdmdW5jdGlvbic7bGVuPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGxlbil7Y2FzZSAxOmVtaXROb25lKGhhbmRsZXIsaXNGbix0aGlzKTticmVhaztjYXNlIDI6ZW1pdE9uZShoYW5kbGVyLGlzRm4sdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzplbWl0VHdvKGhhbmRsZXIsaXNGbix0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDplbWl0VGhyZWUoaGFuZGxlcixpc0ZuLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2JyZWFrO2RlZmF1bHQ6YXJncz1uZXcgQXJyYXkobGVuLTEpO2ZvcihpPTE7aTxsZW47aSsrKQphcmdzW2ktMV09YXJndW1lbnRzW2ldO2VtaXRNYW55KGhhbmRsZXIsaXNGbix0aGlzLGFyZ3MpO30KcmV0dXJuIHRydWU7fTtmdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LHR5cGUsbGlzdGVuZXIscHJlcGVuZCl7dmFyIG07dmFyIGV2ZW50czt2YXIgZXhpc3Rpbmc7aWYodHlwZW9mIGxpc3RlbmVyIT09J2Z1bmN0aW9uJykKdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtldmVudHM9dGFyZ2V0Ll9ldmVudHM7aWYoIWV2ZW50cyl7ZXZlbnRzPXRhcmdldC5fZXZlbnRzPW9iamVjdENyZWF0ZShudWxsKTt0YXJnZXQuX2V2ZW50c0NvdW50PTA7fWVsc2V7aWYoZXZlbnRzLm5ld0xpc3RlbmVyKXt0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLHR5cGUsbGlzdGVuZXIubGlzdGVuZXI/bGlzdGVuZXIubGlzdGVuZXI6bGlzdGVuZXIpO2V2ZW50cz10YXJnZXQuX2V2ZW50czt9CmV4aXN0aW5nPWV2ZW50c1t0eXBlXTt9CmlmKCFleGlzdGluZyl7ZXhpc3Rpbmc9ZXZlbnRzW3R5cGVdPWxpc3RlbmVyOysrdGFyZ2V0Ll9ldmVudHNDb3VudDt9ZWxzZXtpZih0eXBlb2YgZXhpc3Rpbmc9PT0nZnVuY3Rpb24nKXtleGlzdGluZz1ldmVudHNbdHlwZV09cHJlcGVuZD9bbGlzdGVuZXIsZXhpc3RpbmddOltleGlzdGluZyxsaXN0ZW5lcl07fWVsc2V7aWYocHJlcGVuZCl7ZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7fWVsc2V7ZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7fX0KaWYoIWV4aXN0aW5nLndhcm5lZCl7bT0kZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7aWYobSYmbT4wJiZleGlzdGluZy5sZW5ndGg+bSl7ZXhpc3Rpbmcud2FybmVkPXRydWU7dmFyIHc9bmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcrCmV4aXN0aW5nLmxlbmd0aCsnICInK1N0cmluZyh0eXBlKSsnIiBsaXN0ZW5lcnMgJysnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcrJ2luY3JlYXNlIGxpbWl0LicpO3cubmFtZT0nTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJzt3LmVtaXR0ZXI9dGFyZ2V0O3cudHlwZT10eXBlO3cuY291bnQ9ZXhpc3RpbmcubGVuZ3RoO2lmKHR5cGVvZiBjb25zb2xlPT09J29iamVjdCcmJmNvbnNvbGUud2Fybil7Y29uc29sZS53YXJuKCclczogJXMnLHcubmFtZSx3Lm1lc3NhZ2UpO319fX0KcmV0dXJuIHRhcmdldDt9CkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSxsaXN0ZW5lcil7cmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLHR5cGUsbGlzdGVuZXIsZmFsc2UpO307RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbj1FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO0V2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLGxpc3RlbmVyKXtyZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsdHlwZSxsaXN0ZW5lcix0cnVlKTt9O2Z1bmN0aW9uIG9uY2VXcmFwcGVyKCl7aWYoIXRoaXMuZmlyZWQpe3RoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbik7dGhpcy5maXJlZD10cnVlO3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7Y2FzZSAxOnJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQsYXJndW1lbnRzWzBdKTtjYXNlIDI6cmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCxhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTtjYXNlIDM6cmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCxhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7ZGVmYXVsdDp2YXIgYXJncz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDsrK2kpCmFyZ3NbaV09YXJndW1lbnRzW2ldO3RoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJncyk7fX19CmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsdHlwZSxsaXN0ZW5lcil7dmFyIHN0YXRlPXtmaXJlZDpmYWxzZSx3cmFwRm46dW5kZWZpbmVkLHRhcmdldDp0YXJnZXQsdHlwZTp0eXBlLGxpc3RlbmVyOmxpc3RlbmVyfTt2YXIgd3JhcHBlZD1iaW5kLmNhbGwob25jZVdyYXBwZXIsc3RhdGUpO3dyYXBwZWQubGlzdGVuZXI9bGlzdGVuZXI7c3RhdGUud3JhcEZuPXdyYXBwZWQ7cmV0dXJuIHdyYXBwZWQ7fQpFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24gb25jZSh0eXBlLGxpc3RlbmVyKXtpZih0eXBlb2YgbGlzdGVuZXIhPT0nZnVuY3Rpb24nKQp0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3RoaXMub24odHlwZSxfb25jZVdyYXAodGhpcyx0eXBlLGxpc3RlbmVyKSk7cmV0dXJuIHRoaXM7fTtFdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLGxpc3RlbmVyKXtpZih0eXBlb2YgbGlzdGVuZXIhPT0nZnVuY3Rpb24nKQp0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3RoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsX29uY2VXcmFwKHRoaXMsdHlwZSxsaXN0ZW5lcikpO3JldHVybiB0aGlzO307RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLGxpc3RlbmVyKXt2YXIgbGlzdCxldmVudHMscG9zaXRpb24saSxvcmlnaW5hbExpc3RlbmVyO2lmKHR5cGVvZiBsaXN0ZW5lciE9PSdmdW5jdGlvbicpCnRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7ZXZlbnRzPXRoaXMuX2V2ZW50cztpZighZXZlbnRzKQpyZXR1cm4gdGhpcztsaXN0PWV2ZW50c1t0eXBlXTtpZighbGlzdCkKcmV0dXJuIHRoaXM7aWYobGlzdD09PWxpc3RlbmVyfHxsaXN0Lmxpc3RlbmVyPT09bGlzdGVuZXIpe2lmKC0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wKQp0aGlzLl9ldmVudHM9b2JqZWN0Q3JlYXRlKG51bGwpO2Vsc2UKe2RlbGV0ZSBldmVudHNbdHlwZV07aWYoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKQp0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJyx0eXBlLGxpc3QubGlzdGVuZXJ8fGxpc3RlbmVyKTt9fWVsc2UgaWYodHlwZW9mIGxpc3QhPT0nZnVuY3Rpb24nKXtwb3NpdGlvbj0tMTtmb3IoaT1saXN0Lmxlbmd0aC0xO2k+PTA7aS0tKXtpZihsaXN0W2ldPT09bGlzdGVuZXJ8fGxpc3RbaV0ubGlzdGVuZXI9PT1saXN0ZW5lcil7b3JpZ2luYWxMaXN0ZW5lcj1saXN0W2ldLmxpc3RlbmVyO3Bvc2l0aW9uPWk7YnJlYWs7fX0KaWYocG9zaXRpb248MCkKcmV0dXJuIHRoaXM7aWYocG9zaXRpb249PT0wKQpsaXN0LnNoaWZ0KCk7ZWxzZQpzcGxpY2VPbmUobGlzdCxwb3NpdGlvbik7aWYobGlzdC5sZW5ndGg9PT0xKQpldmVudHNbdHlwZV09bGlzdFswXTtpZihldmVudHMucmVtb3ZlTGlzdGVuZXIpCnRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLHR5cGUsb3JpZ2luYWxMaXN0ZW5lcnx8bGlzdGVuZXIpO30KcmV0dXJuIHRoaXM7fTtFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSl7dmFyIGxpc3RlbmVycyxldmVudHMsaTtldmVudHM9dGhpcy5fZXZlbnRzO2lmKCFldmVudHMpCnJldHVybiB0aGlzO2lmKCFldmVudHMucmVtb3ZlTGlzdGVuZXIpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXt0aGlzLl9ldmVudHM9b2JqZWN0Q3JlYXRlKG51bGwpO3RoaXMuX2V2ZW50c0NvdW50PTA7fWVsc2UgaWYoZXZlbnRzW3R5cGVdKXtpZigtLXRoaXMuX2V2ZW50c0NvdW50PT09MCkKdGhpcy5fZXZlbnRzPW9iamVjdENyZWF0ZShudWxsKTtlbHNlCmRlbGV0ZSBldmVudHNbdHlwZV07fQpyZXR1cm4gdGhpczt9CmlmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXt2YXIga2V5cz1vYmplY3RLZXlzKGV2ZW50cyk7dmFyIGtleTtmb3IoaT0wO2k8a2V5cy5sZW5ndGg7KytpKXtrZXk9a2V5c1tpXTtpZihrZXk9PT0ncmVtb3ZlTGlzdGVuZXInKWNvbnRpbnVlO3RoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7fQp0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTt0aGlzLl9ldmVudHM9b2JqZWN0Q3JlYXRlKG51bGwpO3RoaXMuX2V2ZW50c0NvdW50PTA7cmV0dXJuIHRoaXM7fQpsaXN0ZW5lcnM9ZXZlbnRzW3R5cGVdO2lmKHR5cGVvZiBsaXN0ZW5lcnM9PT0nZnVuY3Rpb24nKXt0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsbGlzdGVuZXJzKTt9ZWxzZSBpZihsaXN0ZW5lcnMpe2ZvcihpPWxpc3RlbmVycy5sZW5ndGgtMTtpPj0wO2ktLSl7dGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLGxpc3RlbmVyc1tpXSk7fX0KcmV0dXJuIHRoaXM7fTtFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbiBsaXN0ZW5lcnModHlwZSl7dmFyIGV2bGlzdGVuZXI7dmFyIHJldDt2YXIgZXZlbnRzPXRoaXMuX2V2ZW50cztpZighZXZlbnRzKQpyZXQ9W107ZWxzZQp7ZXZsaXN0ZW5lcj1ldmVudHNbdHlwZV07aWYoIWV2bGlzdGVuZXIpCnJldD1bXTtlbHNlCmlmKHR5cGVvZiBldmxpc3RlbmVyPT09J2Z1bmN0aW9uJykKcmV0PVtldmxpc3RlbmVyLmxpc3RlbmVyfHxldmxpc3RlbmVyXTtlbHNlCnJldD11bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcik7fQpyZXR1cm4gcmV0O307RXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZW1pdHRlcix0eXBlKXtpZih0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50PT09J2Z1bmN0aW9uJyl7cmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTt9ZWxzZXtyZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsdHlwZSk7fX07RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWxpc3RlbmVyQ291bnQ7ZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKXt2YXIgZXZlbnRzPXRoaXMuX2V2ZW50cztpZihldmVudHMpe3ZhciBldmxpc3RlbmVyPWV2ZW50c1t0eXBlXTtpZih0eXBlb2YgZXZsaXN0ZW5lcj09PSdmdW5jdGlvbicpe3JldHVybiAxO31lbHNlIGlmKGV2bGlzdGVuZXIpe3JldHVybiBldmxpc3RlbmVyLmxlbmd0aDt9fQpyZXR1cm4gMDt9CkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbiBldmVudE5hbWVzKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W107fTtmdW5jdGlvbiBzcGxpY2VPbmUobGlzdCxpbmRleCl7Zm9yKHZhciBpPWluZGV4LGs9aSsxLG49bGlzdC5sZW5ndGg7azxuO2krPTEsays9MSkKbGlzdFtpXT1saXN0W2tdO2xpc3QucG9wKCk7fQpmdW5jdGlvbiBhcnJheUNsb25lKGFycixuKXt2YXIgY29weT1uZXcgQXJyYXkobik7Zm9yKHZhciBpPTA7aTxuOysraSkKY29weVtpXT1hcnJbaV07cmV0dXJuIGNvcHk7fQpmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKXt2YXIgcmV0PW5ldyBBcnJheShhcnIubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHJldC5sZW5ndGg7KytpKXtyZXRbaV09YXJyW2ldLmxpc3RlbmVyfHxhcnJbaV07fQpyZXR1cm4gcmV0O30KZnVuY3Rpb24gb2JqZWN0Q3JlYXRlUG9seWZpbGwocHJvdG8pe3ZhciBGPWZ1bmN0aW9uKCl7fTtGLnByb3RvdHlwZT1wcm90bztyZXR1cm4gbmV3IEYoKTt9CmZ1bmN0aW9uIG9iamVjdEtleXNQb2x5ZmlsbChvYmope3ZhciBrZXlzPVtdO2Zvcih2YXIgayBpbiBvYmopaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrKSl7a2V5cy5wdXNoKGspO30KcmV0dXJuIGs7fQpmdW5jdGlvbiBmdW5jdGlvbkJpbmRQb2x5ZmlsbChjb250ZXh0KXt2YXIgZm49dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZm4uYXBwbHkoY29udGV4dCxhcmd1bWVudHMpO307fX0se31dLDYzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLnJlYWQ9ZnVuY3Rpb24oYnVmZmVyLG9mZnNldCxpc0xFLG1MZW4sbkJ5dGVzKXt2YXIgZSxtO3ZhciBlTGVuPW5CeXRlcyo4LW1MZW4tMTt2YXIgZU1heD0oMTw8ZUxlbiktMTt2YXIgZUJpYXM9ZU1heD4+MTt2YXIgbkJpdHM9LTc7dmFyIGk9aXNMRT9uQnl0ZXMtMTowO3ZhciBkPWlzTEU/LTE6MTt2YXIgcz1idWZmZXJbb2Zmc2V0K2ldO2krPWQ7ZT1zJigxPDwtbkJpdHMpLTE7cz4+PS1uQml0cztuQml0cys9ZUxlbjtmb3IoO25CaXRzPjA7ZT1lKjI1NitidWZmZXJbb2Zmc2V0K2ldLGkrPWQsbkJpdHMtPTgpe30KbT1lJigxPDwtbkJpdHMpLTE7ZT4+PS1uQml0cztuQml0cys9bUxlbjtmb3IoO25CaXRzPjA7bT1tKjI1NitidWZmZXJbb2Zmc2V0K2ldLGkrPWQsbkJpdHMtPTgpe30KaWYoZT09PTApe2U9MS1lQmlhczt9ZWxzZSBpZihlPT09ZU1heCl7cmV0dXJuIG0/TmFOOihzPy0xOjEpKkluZmluaXR5O31lbHNle209bStNYXRoLnBvdygyLG1MZW4pO2U9ZS1lQmlhczt9CnJldHVybihzPy0xOjEpKm0qTWF0aC5wb3coMixlLW1MZW4pO307ZXhwb3J0cy53cml0ZT1mdW5jdGlvbihidWZmZXIsdmFsdWUsb2Zmc2V0LGlzTEUsbUxlbixuQnl0ZXMpe3ZhciBlLG0sYzt2YXIgZUxlbj1uQnl0ZXMqOC1tTGVuLTE7dmFyIGVNYXg9KDE8PGVMZW4pLTE7dmFyIGVCaWFzPWVNYXg+PjE7dmFyIHJ0PW1MZW49PT0yMz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjA7dmFyIGk9aXNMRT8wOm5CeXRlcy0xO3ZhciBkPWlzTEU/MTotMTt2YXIgcz12YWx1ZTwwfHx2YWx1ZT09PTAmJjEvdmFsdWU8MD8xOjA7dmFsdWU9TWF0aC5hYnModmFsdWUpO2lmKGlzTmFOKHZhbHVlKXx8dmFsdWU9PT1JbmZpbml0eSl7bT1pc05hTih2YWx1ZSk/MTowO2U9ZU1heDt9ZWxzZXtlPU1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpL01hdGguTE4yKTtpZih2YWx1ZSooYz1NYXRoLnBvdygyLC1lKSk8MSl7ZS0tO2MqPTI7fQppZihlK2VCaWFzPj0xKXt2YWx1ZSs9cnQvYzt9ZWxzZXt2YWx1ZSs9cnQqTWF0aC5wb3coMiwxLWVCaWFzKTt9CmlmKHZhbHVlKmM+PTIpe2UrKztjLz0yO30KaWYoZStlQmlhcz49ZU1heCl7bT0wO2U9ZU1heDt9ZWxzZSBpZihlK2VCaWFzPj0xKXttPSh2YWx1ZSpjLTEpKk1hdGgucG93KDIsbUxlbik7ZT1lK2VCaWFzO31lbHNle209dmFsdWUqTWF0aC5wb3coMixlQmlhcy0xKSpNYXRoLnBvdygyLG1MZW4pO2U9MDt9fQpmb3IoO21MZW4+PTg7YnVmZmVyW29mZnNldCtpXT1tJjB4ZmYsaSs9ZCxtLz0yNTYsbUxlbi09OCl7fQplPWU8PG1MZW58bTtlTGVuKz1tTGVuO2Zvcig7ZUxlbj4wO2J1ZmZlcltvZmZzZXQraV09ZSYweGZmLGkrPWQsZS89MjU2LGVMZW4tPTgpe30KYnVmZmVyW29mZnNldCtpLWRdfD1zKjEyODt9O30se31dLDY0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtpZih0eXBlb2YgT2JqZWN0LmNyZWF0ZT09PSdmdW5jdGlvbicpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGluaGVyaXRzKGN0b3Isc3VwZXJDdG9yKXtjdG9yLnN1cGVyXz1zdXBlckN0b3I7Y3Rvci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6Y3RvcixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7fTt9ZWxzZXttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpbmhlcml0cyhjdG9yLHN1cGVyQ3Rvcil7Y3Rvci5zdXBlcl89c3VwZXJDdG9yO3ZhciBUZW1wQ3Rvcj1mdW5jdGlvbigpe307VGVtcEN0b3IucHJvdG90eXBlPXN1cGVyQ3Rvci5wcm90b3R5cGU7Y3Rvci5wcm90b3R5cGU9bmV3IFRlbXBDdG9yKCk7Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I9Y3Rvcjt9O319LHt9XSw2NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqIT1udWxsJiYoaXNCdWZmZXIob2JqKXx8aXNTbG93QnVmZmVyKG9iail8fCEhb2JqLl9pc0J1ZmZlcik7fTtmdW5jdGlvbiBpc0J1ZmZlcihvYmope3JldHVybiEhb2JqLmNvbnN0cnVjdG9yJiZ0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyPT09J2Z1bmN0aW9uJyYmb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaik7fQpmdW5jdGlvbiBpc1Nsb3dCdWZmZXIob2JqKXtyZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRT09PSdmdW5jdGlvbicmJnR5cGVvZiBvYmouc2xpY2U9PT0nZnVuY3Rpb24nJiZpc0J1ZmZlcihvYmouc2xpY2UoMCwwKSk7fX0se31dLDY2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgdG9TdHJpbmc9e30udG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYXJyKXtyZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpPT0nW29iamVjdCBBcnJheV0nO307fSx7fV0sNjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jzt2YXIgVFlQRURfT0s9dHlwZW9mIFVpbnQ4QXJyYXkhPT0ndW5kZWZpbmVkJyYmdHlwZW9mIFVpbnQxNkFycmF5IT09J3VuZGVmaW5lZCcmJnR5cGVvZiBJbnQzMkFycmF5IT09J3VuZGVmaW5lZCc7ZnVuY3Rpb24gX2hhcyhvYmosa2V5KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpO30KZXhwb3J0cy5hc3NpZ249ZnVuY3Rpb24ob2JqKXt2YXIgc291cmNlcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7d2hpbGUoc291cmNlcy5sZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlcy5zaGlmdCgpO2lmKCFzb3VyY2Upe2NvbnRpbnVlO30KaWYodHlwZW9mIHNvdXJjZSE9PSdvYmplY3QnKXt0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSsnbXVzdCBiZSBub24tb2JqZWN0Jyk7fQpmb3IodmFyIHAgaW4gc291cmNlKXtpZihfaGFzKHNvdXJjZSxwKSl7b2JqW3BdPXNvdXJjZVtwXTt9fX0KcmV0dXJuIG9iajt9O2V4cG9ydHMuc2hyaW5rQnVmPWZ1bmN0aW9uKGJ1ZixzaXplKXtpZihidWYubGVuZ3RoPT09c2l6ZSl7cmV0dXJuIGJ1Zjt9CmlmKGJ1Zi5zdWJhcnJheSl7cmV0dXJuIGJ1Zi5zdWJhcnJheSgwLHNpemUpO30KYnVmLmxlbmd0aD1zaXplO3JldHVybiBidWY7fTt2YXIgZm5UeXBlZD17YXJyYXlTZXQ6ZnVuY3Rpb24oZGVzdCxzcmMsc3JjX29mZnMsbGVuLGRlc3Rfb2Zmcyl7aWYoc3JjLnN1YmFycmF5JiZkZXN0LnN1YmFycmF5KXtkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsc3JjX29mZnMrbGVuKSxkZXN0X29mZnMpO3JldHVybjt9CmZvcih2YXIgaT0wO2k8bGVuO2krKyl7ZGVzdFtkZXN0X29mZnMraV09c3JjW3NyY19vZmZzK2ldO319LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oY2h1bmtzKXt2YXIgaSxsLGxlbixwb3MsY2h1bmsscmVzdWx0O2xlbj0wO2ZvcihpPTAsbD1jaHVua3MubGVuZ3RoO2k8bDtpKyspe2xlbis9Y2h1bmtzW2ldLmxlbmd0aDt9CnJlc3VsdD1uZXcgVWludDhBcnJheShsZW4pO3Bvcz0wO2ZvcihpPTAsbD1jaHVua3MubGVuZ3RoO2k8bDtpKyspe2NodW5rPWNodW5rc1tpXTtyZXN1bHQuc2V0KGNodW5rLHBvcyk7cG9zKz1jaHVuay5sZW5ndGg7fQpyZXR1cm4gcmVzdWx0O319O3ZhciBmblVudHlwZWQ9e2FycmF5U2V0OmZ1bmN0aW9uKGRlc3Qsc3JjLHNyY19vZmZzLGxlbixkZXN0X29mZnMpe2Zvcih2YXIgaT0wO2k8bGVuO2krKyl7ZGVzdFtkZXN0X29mZnMraV09c3JjW3NyY19vZmZzK2ldO319LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oY2h1bmtzKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sY2h1bmtzKTt9fTtleHBvcnRzLnNldFR5cGVkPWZ1bmN0aW9uKG9uKXtpZihvbil7ZXhwb3J0cy5CdWY4PVVpbnQ4QXJyYXk7ZXhwb3J0cy5CdWYxNj1VaW50MTZBcnJheTtleHBvcnRzLkJ1ZjMyPUludDMyQXJyYXk7ZXhwb3J0cy5hc3NpZ24oZXhwb3J0cyxmblR5cGVkKTt9ZWxzZXtleHBvcnRzLkJ1Zjg9QXJyYXk7ZXhwb3J0cy5CdWYxNj1BcnJheTtleHBvcnRzLkJ1ZjMyPUFycmF5O2V4cG9ydHMuYXNzaWduKGV4cG9ydHMsZm5VbnR5cGVkKTt9fTtleHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTt9LHt9XSw2ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIGFkbGVyMzIoYWRsZXIsYnVmLGxlbixwb3Mpe3ZhciBzMT1hZGxlciYweGZmZmZ8MCxzMj1hZGxlcj4+PjE2JjB4ZmZmZnwwLG49MDt3aGlsZShsZW4hPT0wKXtuPWxlbj4yMDAwPzIwMDA6bGVuO2xlbi09bjtkb3tzMT1zMStidWZbcG9zKytdfDA7czI9czIrczF8MDt9d2hpbGUoLS1uKTtzMSU9NjU1MjE7czIlPTY1NTIxO30KcmV0dXJuIHMxfHMyPDwxNnwwO30KbW9kdWxlLmV4cG9ydHM9YWRsZXIzMjt9LHt9XSw2OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO21vZHVsZS5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O30se31dLDcwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gbWFrZVRhYmxlKCl7dmFyIGMsdGFibGU9W107Zm9yKHZhciBuPTA7bjwyNTY7bisrKXtjPW47Zm9yKHZhciBrPTA7azw4O2srKyl7Yz1jJjE/MHhFREI4ODMyMF5jPj4+MTpjPj4+MTt9CnRhYmxlW25dPWM7fQpyZXR1cm4gdGFibGU7fQp2YXIgY3JjVGFibGU9bWFrZVRhYmxlKCk7ZnVuY3Rpb24gY3JjMzIoY3JjLGJ1ZixsZW4scG9zKXt2YXIgdD1jcmNUYWJsZSxlbmQ9cG9zK2xlbjtjcmNePS0xO2Zvcih2YXIgaT1wb3M7aTxlbmQ7aSsrKXtjcmM9Y3JjPj4+OF50WyhjcmNeYnVmW2ldKSYweEZGXTt9CnJldHVybiBjcmNeLTE7fQptb2R1bGUuZXhwb3J0cz1jcmMzMjt9LHt9XSw3MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO3ZhciB1dGlscz1yZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTt2YXIgdHJlZXM9cmVxdWlyZSgnLi90cmVlcycpO3ZhciBhZGxlcjMyPXJlcXVpcmUoJy4vYWRsZXIzMicpO3ZhciBjcmMzMj1yZXF1aXJlKCcuL2NyYzMyJyk7dmFyIG1zZz1yZXF1aXJlKCcuL21lc3NhZ2VzJyk7dmFyIFpfTk9fRkxVU0g9MDt2YXIgWl9QQVJUSUFMX0ZMVVNIPTE7dmFyIFpfRlVMTF9GTFVTSD0zO3ZhciBaX0ZJTklTSD00O3ZhciBaX0JMT0NLPTU7dmFyIFpfT0s9MDt2YXIgWl9TVFJFQU1fRU5EPTE7dmFyIFpfU1RSRUFNX0VSUk9SPS0yO3ZhciBaX0RBVEFfRVJST1I9LTM7dmFyIFpfQlVGX0VSUk9SPS01O3ZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT049LTE7dmFyIFpfRklMVEVSRUQ9MTt2YXIgWl9IVUZGTUFOX09OTFk9Mjt2YXIgWl9STEU9Mzt2YXIgWl9GSVhFRD00O3ZhciBaX0RFRkFVTFRfU1RSQVRFR1k9MDt2YXIgWl9VTktOT1dOPTI7dmFyIFpfREVGTEFURUQ9ODt2YXIgTUFYX01FTV9MRVZFTD05O3ZhciBNQVhfV0JJVFM9MTU7dmFyIERFRl9NRU1fTEVWRUw9ODt2YXIgTEVOR1RIX0NPREVTPTI5O3ZhciBMSVRFUkFMUz0yNTY7dmFyIExfQ09ERVM9TElURVJBTFMrMStMRU5HVEhfQ09ERVM7dmFyIERfQ09ERVM9MzA7dmFyIEJMX0NPREVTPTE5O3ZhciBIRUFQX1NJWkU9MipMX0NPREVTKzE7dmFyIE1BWF9CSVRTPTE1O3ZhciBNSU5fTUFUQ0g9Mzt2YXIgTUFYX01BVENIPTI1ODt2YXIgTUlOX0xPT0tBSEVBRD1NQVhfTUFUQ0grTUlOX01BVENIKzE7dmFyIFBSRVNFVF9ESUNUPTB4MjA7dmFyIElOSVRfU1RBVEU9NDI7dmFyIEVYVFJBX1NUQVRFPTY5O3ZhciBOQU1FX1NUQVRFPTczO3ZhciBDT01NRU5UX1NUQVRFPTkxO3ZhciBIQ1JDX1NUQVRFPTEwMzt2YXIgQlVTWV9TVEFURT0xMTM7dmFyIEZJTklTSF9TVEFURT02NjY7dmFyIEJTX05FRURfTU9SRT0xO3ZhciBCU19CTE9DS19ET05FPTI7dmFyIEJTX0ZJTklTSF9TVEFSVEVEPTM7dmFyIEJTX0ZJTklTSF9ET05FPTQ7dmFyIE9TX0NPREU9MHgwMztmdW5jdGlvbiBlcnIoc3RybSxlcnJvckNvZGUpe3N0cm0ubXNnPW1zZ1tlcnJvckNvZGVdO3JldHVybiBlcnJvckNvZGU7fQpmdW5jdGlvbiByYW5rKGYpe3JldHVybihmPDwxKS0oZj40Pzk6MCk7fQpmdW5jdGlvbiB6ZXJvKGJ1Zil7dmFyIGxlbj1idWYubGVuZ3RoO3doaWxlKC0tbGVuPj0wKXtidWZbbGVuXT0wO319CmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSl7dmFyIHM9c3RybS5zdGF0ZTt2YXIgbGVuPXMucGVuZGluZztpZihsZW4+c3RybS5hdmFpbF9vdXQpe2xlbj1zdHJtLmF2YWlsX291dDt9CmlmKGxlbj09PTApe3JldHVybjt9CnV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LHMucGVuZGluZ19idWYscy5wZW5kaW5nX291dCxsZW4sc3RybS5uZXh0X291dCk7c3RybS5uZXh0X291dCs9bGVuO3MucGVuZGluZ19vdXQrPWxlbjtzdHJtLnRvdGFsX291dCs9bGVuO3N0cm0uYXZhaWxfb3V0LT1sZW47cy5wZW5kaW5nLT1sZW47aWYocy5wZW5kaW5nPT09MCl7cy5wZW5kaW5nX291dD0wO319CmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocyxsYXN0KXt0cmVlcy5fdHJfZmx1c2hfYmxvY2socyxzLmJsb2NrX3N0YXJ0Pj0wP3MuYmxvY2tfc3RhcnQ6LTEscy5zdHJzdGFydC1zLmJsb2NrX3N0YXJ0LGxhc3QpO3MuYmxvY2tfc3RhcnQ9cy5zdHJzdGFydDtmbHVzaF9wZW5kaW5nKHMuc3RybSk7fQpmdW5jdGlvbiBwdXRfYnl0ZShzLGIpe3MucGVuZGluZ19idWZbcy5wZW5kaW5nKytdPWI7fQpmdW5jdGlvbiBwdXRTaG9ydE1TQihzLGIpe3MucGVuZGluZ19idWZbcy5wZW5kaW5nKytdPWI+Pj44JjB4ZmY7cy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109YiYweGZmO30KZnVuY3Rpb24gcmVhZF9idWYoc3RybSxidWYsc3RhcnQsc2l6ZSl7dmFyIGxlbj1zdHJtLmF2YWlsX2luO2lmKGxlbj5zaXplKXtsZW49c2l6ZTt9CmlmKGxlbj09PTApe3JldHVybiAwO30Kc3RybS5hdmFpbF9pbi09bGVuO3V0aWxzLmFycmF5U2V0KGJ1ZixzdHJtLmlucHV0LHN0cm0ubmV4dF9pbixsZW4sc3RhcnQpO2lmKHN0cm0uc3RhdGUud3JhcD09PTEpe3N0cm0uYWRsZXI9YWRsZXIzMihzdHJtLmFkbGVyLGJ1ZixsZW4sc3RhcnQpO31lbHNlCmlmKHN0cm0uc3RhdGUud3JhcD09PTIpe3N0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixidWYsbGVuLHN0YXJ0KTt9CnN0cm0ubmV4dF9pbis9bGVuO3N0cm0udG90YWxfaW4rPWxlbjtyZXR1cm4gbGVuO30KZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLGN1cl9tYXRjaCl7dmFyIGNoYWluX2xlbmd0aD1zLm1heF9jaGFpbl9sZW5ndGg7dmFyIHNjYW49cy5zdHJzdGFydDt2YXIgbWF0Y2g7dmFyIGxlbjt2YXIgYmVzdF9sZW49cy5wcmV2X2xlbmd0aDt2YXIgbmljZV9tYXRjaD1zLm5pY2VfbWF0Y2g7dmFyIGxpbWl0PXMuc3Ryc3RhcnQ+cy53X3NpemUtTUlOX0xPT0tBSEVBRD9zLnN0cnN0YXJ0LShzLndfc2l6ZS1NSU5fTE9PS0FIRUFEKTowO3ZhciBfd2luPXMud2luZG93O3ZhciB3bWFzaz1zLndfbWFzazt2YXIgcHJldj1zLnByZXY7dmFyIHN0cmVuZD1zLnN0cnN0YXJ0K01BWF9NQVRDSDt2YXIgc2Nhbl9lbmQxPV93aW5bc2NhbitiZXN0X2xlbi0xXTt2YXIgc2Nhbl9lbmQ9X3dpbltzY2FuK2Jlc3RfbGVuXTtpZihzLnByZXZfbGVuZ3RoPj1zLmdvb2RfbWF0Y2gpe2NoYWluX2xlbmd0aD4+PTI7fQppZihuaWNlX21hdGNoPnMubG9va2FoZWFkKXtuaWNlX21hdGNoPXMubG9va2FoZWFkO30KZG97bWF0Y2g9Y3VyX21hdGNoO2lmKF93aW5bbWF0Y2grYmVzdF9sZW5dIT09c2Nhbl9lbmR8fF93aW5bbWF0Y2grYmVzdF9sZW4tMV0hPT1zY2FuX2VuZDF8fF93aW5bbWF0Y2hdIT09X3dpbltzY2FuXXx8X3dpblsrK21hdGNoXSE9PV93aW5bc2NhbisxXSl7Y29udGludWU7fQpzY2FuKz0yO21hdGNoKys7ZG97fXdoaWxlKF93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJnNjYW48c3RyZW5kKTtsZW49TUFYX01BVENILShzdHJlbmQtc2Nhbik7c2Nhbj1zdHJlbmQtTUFYX01BVENIO2lmKGxlbj5iZXN0X2xlbil7cy5tYXRjaF9zdGFydD1jdXJfbWF0Y2g7YmVzdF9sZW49bGVuO2lmKGxlbj49bmljZV9tYXRjaCl7YnJlYWs7fQpzY2FuX2VuZDE9X3dpbltzY2FuK2Jlc3RfbGVuLTFdO3NjYW5fZW5kPV93aW5bc2NhbitiZXN0X2xlbl07fX13aGlsZSgoY3VyX21hdGNoPXByZXZbY3VyX21hdGNoJndtYXNrXSk+bGltaXQmJi0tY2hhaW5fbGVuZ3RoIT09MCk7aWYoYmVzdF9sZW48PXMubG9va2FoZWFkKXtyZXR1cm4gYmVzdF9sZW47fQpyZXR1cm4gcy5sb29rYWhlYWQ7fQpmdW5jdGlvbiBmaWxsX3dpbmRvdyhzKXt2YXIgX3dfc2l6ZT1zLndfc2l6ZTt2YXIgcCxuLG0sbW9yZSxzdHI7ZG97bW9yZT1zLndpbmRvd19zaXplLXMubG9va2FoZWFkLXMuc3Ryc3RhcnQ7aWYocy5zdHJzdGFydD49X3dfc2l6ZSsoX3dfc2l6ZS1NSU5fTE9PS0FIRUFEKSl7dXRpbHMuYXJyYXlTZXQocy53aW5kb3cscy53aW5kb3csX3dfc2l6ZSxfd19zaXplLDApO3MubWF0Y2hfc3RhcnQtPV93X3NpemU7cy5zdHJzdGFydC09X3dfc2l6ZTtzLmJsb2NrX3N0YXJ0LT1fd19zaXplO249cy5oYXNoX3NpemU7cD1uO2Rve209cy5oZWFkWy0tcF07cy5oZWFkW3BdPW0+PV93X3NpemU/bS1fd19zaXplOjA7fXdoaWxlKC0tbik7bj1fd19zaXplO3A9bjtkb3ttPXMucHJldlstLXBdO3MucHJldltwXT1tPj1fd19zaXplP20tX3dfc2l6ZTowO313aGlsZSgtLW4pO21vcmUrPV93X3NpemU7fQppZihzLnN0cm0uYXZhaWxfaW49PT0wKXticmVhazt9Cm49cmVhZF9idWYocy5zdHJtLHMud2luZG93LHMuc3Ryc3RhcnQrcy5sb29rYWhlYWQsbW9yZSk7cy5sb29rYWhlYWQrPW47aWYocy5sb29rYWhlYWQrcy5pbnNlcnQ+PU1JTl9NQVRDSCl7c3RyPXMuc3Ryc3RhcnQtcy5pbnNlcnQ7cy5pbnNfaD1zLndpbmRvd1tzdHJdO3MuaW5zX2g9KHMuaW5zX2g8PHMuaGFzaF9zaGlmdF5zLndpbmRvd1tzdHIrMV0pJnMuaGFzaF9tYXNrO3doaWxlKHMuaW5zZXJ0KXtzLmluc19oPShzLmluc19oPDxzLmhhc2hfc2hpZnRecy53aW5kb3dbc3RyK01JTl9NQVRDSC0xXSkmcy5oYXNoX21hc2s7cy5wcmV2W3N0ciZzLndfbWFza109cy5oZWFkW3MuaW5zX2hdO3MuaGVhZFtzLmluc19oXT1zdHI7c3RyKys7cy5pbnNlcnQtLTtpZihzLmxvb2thaGVhZCtzLmluc2VydDxNSU5fTUFUQ0gpe2JyZWFrO319fX13aGlsZShzLmxvb2thaGVhZDxNSU5fTE9PS0FIRUFEJiZzLnN0cm0uYXZhaWxfaW4hPT0wKTt9CmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsZmx1c2gpe3ZhciBtYXhfYmxvY2tfc2l6ZT0weGZmZmY7aWYobWF4X2Jsb2NrX3NpemU+cy5wZW5kaW5nX2J1Zl9zaXplLTUpe21heF9ibG9ja19zaXplPXMucGVuZGluZ19idWZfc2l6ZS01O30KZm9yKDs7KXtpZihzLmxvb2thaGVhZDw9MSl7ZmlsbF93aW5kb3cocyk7aWYocy5sb29rYWhlYWQ9PT0wJiZmbHVzaD09PVpfTk9fRkxVU0gpe3JldHVybiBCU19ORUVEX01PUkU7fQppZihzLmxvb2thaGVhZD09PTApe2JyZWFrO319CnMuc3Ryc3RhcnQrPXMubG9va2FoZWFkO3MubG9va2FoZWFkPTA7dmFyIG1heF9zdGFydD1zLmJsb2NrX3N0YXJ0K21heF9ibG9ja19zaXplO2lmKHMuc3Ryc3RhcnQ9PT0wfHxzLnN0cnN0YXJ0Pj1tYXhfc3RhcnQpe3MubG9va2FoZWFkPXMuc3Ryc3RhcnQtbWF4X3N0YXJ0O3Muc3Ryc3RhcnQ9bWF4X3N0YXJ0O2ZsdXNoX2Jsb2NrX29ubHkocyxmYWxzZSk7aWYocy5zdHJtLmF2YWlsX291dD09PTApe3JldHVybiBCU19ORUVEX01PUkU7fX0KaWYocy5zdHJzdGFydC1zLmJsb2NrX3N0YXJ0Pj1zLndfc2l6ZS1NSU5fTE9PS0FIRUFEKXtmbHVzaF9ibG9ja19vbmx5KHMsZmFsc2UpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfTkVFRF9NT1JFO319fQpzLmluc2VydD0wO2lmKGZsdXNoPT09Wl9GSU5JU0gpe2ZsdXNoX2Jsb2NrX29ubHkocyx0cnVlKTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO30KcmV0dXJuIEJTX0ZJTklTSF9ET05FO30KaWYocy5zdHJzdGFydD5zLmJsb2NrX3N0YXJ0KXtmbHVzaF9ibG9ja19vbmx5KHMsZmFsc2UpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfTkVFRF9NT1JFO319CnJldHVybiBCU19ORUVEX01PUkU7fQpmdW5jdGlvbiBkZWZsYXRlX2Zhc3QocyxmbHVzaCl7dmFyIGhhc2hfaGVhZDt2YXIgYmZsdXNoO2Zvcig7Oyl7aWYocy5sb29rYWhlYWQ8TUlOX0xPT0tBSEVBRCl7ZmlsbF93aW5kb3cocyk7aWYocy5sb29rYWhlYWQ8TUlOX0xPT0tBSEVBRCYmZmx1c2g9PT1aX05PX0ZMVVNIKXtyZXR1cm4gQlNfTkVFRF9NT1JFO30KaWYocy5sb29rYWhlYWQ9PT0wKXticmVhazt9fQpoYXNoX2hlYWQ9MDtpZihzLmxvb2thaGVhZD49TUlOX01BVENIKXtzLmluc19oPShzLmluc19oPDxzLmhhc2hfc2hpZnRecy53aW5kb3dbcy5zdHJzdGFydCtNSU5fTUFUQ0gtMV0pJnMuaGFzaF9tYXNrO2hhc2hfaGVhZD1zLnByZXZbcy5zdHJzdGFydCZzLndfbWFza109cy5oZWFkW3MuaW5zX2hdO3MuaGVhZFtzLmluc19oXT1zLnN0cnN0YXJ0O30KaWYoaGFzaF9oZWFkIT09MCYmcy5zdHJzdGFydC1oYXNoX2hlYWQ8PXMud19zaXplLU1JTl9MT09LQUhFQUQpe3MubWF0Y2hfbGVuZ3RoPWxvbmdlc3RfbWF0Y2gocyxoYXNoX2hlYWQpO30KaWYocy5tYXRjaF9sZW5ndGg+PU1JTl9NQVRDSCl7YmZsdXNoPXRyZWVzLl90cl90YWxseShzLHMuc3Ryc3RhcnQtcy5tYXRjaF9zdGFydCxzLm1hdGNoX2xlbmd0aC1NSU5fTUFUQ0gpO3MubG9va2FoZWFkLT1zLm1hdGNoX2xlbmd0aDtpZihzLm1hdGNoX2xlbmd0aDw9cy5tYXhfbGF6eV9tYXRjaCYmcy5sb29rYWhlYWQ+PU1JTl9NQVRDSCl7cy5tYXRjaF9sZW5ndGgtLTtkb3tzLnN0cnN0YXJ0Kys7cy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3Muc3Ryc3RhcnQrTUlOX01BVENILTFdKSZzLmhhc2hfbWFzaztoYXNoX2hlYWQ9cy5wcmV2W3Muc3Ryc3RhcnQmcy53X21hc2tdPXMuaGVhZFtzLmluc19oXTtzLmhlYWRbcy5pbnNfaF09cy5zdHJzdGFydDt9d2hpbGUoLS1zLm1hdGNoX2xlbmd0aCE9PTApO3Muc3Ryc3RhcnQrKzt9ZWxzZQp7cy5zdHJzdGFydCs9cy5tYXRjaF9sZW5ndGg7cy5tYXRjaF9sZW5ndGg9MDtzLmluc19oPXMud2luZG93W3Muc3Ryc3RhcnRdO3MuaW5zX2g9KHMuaW5zX2g8PHMuaGFzaF9zaGlmdF5zLndpbmRvd1tzLnN0cnN0YXJ0KzFdKSZzLmhhc2hfbWFzazt9fWVsc2V7YmZsdXNoPXRyZWVzLl90cl90YWxseShzLDAscy53aW5kb3dbcy5zdHJzdGFydF0pO3MubG9va2FoZWFkLS07cy5zdHJzdGFydCsrO30KaWYoYmZsdXNoKXtmbHVzaF9ibG9ja19vbmx5KHMsZmFsc2UpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfTkVFRF9NT1JFO319fQpzLmluc2VydD1zLnN0cnN0YXJ0PE1JTl9NQVRDSC0xP3Muc3Ryc3RhcnQ6TUlOX01BVENILTE7aWYoZmx1c2g9PT1aX0ZJTklTSCl7Zmx1c2hfYmxvY2tfb25seShzLHRydWUpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7fQpyZXR1cm4gQlNfRklOSVNIX0RPTkU7fQppZihzLmxhc3RfbGl0KXtmbHVzaF9ibG9ja19vbmx5KHMsZmFsc2UpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfTkVFRF9NT1JFO319CnJldHVybiBCU19CTE9DS19ET05FO30KZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsZmx1c2gpe3ZhciBoYXNoX2hlYWQ7dmFyIGJmbHVzaDt2YXIgbWF4X2luc2VydDtmb3IoOzspe2lmKHMubG9va2FoZWFkPE1JTl9MT09LQUhFQUQpe2ZpbGxfd2luZG93KHMpO2lmKHMubG9va2FoZWFkPE1JTl9MT09LQUhFQUQmJmZsdXNoPT09Wl9OT19GTFVTSCl7cmV0dXJuIEJTX05FRURfTU9SRTt9CmlmKHMubG9va2FoZWFkPT09MCl7YnJlYWs7fX0KaGFzaF9oZWFkPTA7aWYocy5sb29rYWhlYWQ+PU1JTl9NQVRDSCl7cy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3Muc3Ryc3RhcnQrTUlOX01BVENILTFdKSZzLmhhc2hfbWFzaztoYXNoX2hlYWQ9cy5wcmV2W3Muc3Ryc3RhcnQmcy53X21hc2tdPXMuaGVhZFtzLmluc19oXTtzLmhlYWRbcy5pbnNfaF09cy5zdHJzdGFydDt9CnMucHJldl9sZW5ndGg9cy5tYXRjaF9sZW5ndGg7cy5wcmV2X21hdGNoPXMubWF0Y2hfc3RhcnQ7cy5tYXRjaF9sZW5ndGg9TUlOX01BVENILTE7aWYoaGFzaF9oZWFkIT09MCYmcy5wcmV2X2xlbmd0aDxzLm1heF9sYXp5X21hdGNoJiZzLnN0cnN0YXJ0LWhhc2hfaGVhZDw9cy53X3NpemUtTUlOX0xPT0tBSEVBRCl7cy5tYXRjaF9sZW5ndGg9bG9uZ2VzdF9tYXRjaChzLGhhc2hfaGVhZCk7aWYocy5tYXRjaF9sZW5ndGg8PTUmJihzLnN0cmF0ZWd5PT09Wl9GSUxURVJFRHx8cy5tYXRjaF9sZW5ndGg9PT1NSU5fTUFUQ0gmJnMuc3Ryc3RhcnQtcy5tYXRjaF9zdGFydD40MDk2KSl7cy5tYXRjaF9sZW5ndGg9TUlOX01BVENILTE7fX0KaWYocy5wcmV2X2xlbmd0aD49TUlOX01BVENIJiZzLm1hdGNoX2xlbmd0aDw9cy5wcmV2X2xlbmd0aCl7bWF4X2luc2VydD1zLnN0cnN0YXJ0K3MubG9va2FoZWFkLU1JTl9NQVRDSDtiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMscy5zdHJzdGFydC0xLXMucHJldl9tYXRjaCxzLnByZXZfbGVuZ3RoLU1JTl9NQVRDSCk7cy5sb29rYWhlYWQtPXMucHJldl9sZW5ndGgtMTtzLnByZXZfbGVuZ3RoLT0yO2Rve2lmKCsrcy5zdHJzdGFydDw9bWF4X2luc2VydCl7cy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3Muc3Ryc3RhcnQrTUlOX01BVENILTFdKSZzLmhhc2hfbWFzaztoYXNoX2hlYWQ9cy5wcmV2W3Muc3Ryc3RhcnQmcy53X21hc2tdPXMuaGVhZFtzLmluc19oXTtzLmhlYWRbcy5pbnNfaF09cy5zdHJzdGFydDt9fXdoaWxlKC0tcy5wcmV2X2xlbmd0aCE9PTApO3MubWF0Y2hfYXZhaWxhYmxlPTA7cy5tYXRjaF9sZW5ndGg9TUlOX01BVENILTE7cy5zdHJzdGFydCsrO2lmKGJmbHVzaCl7Zmx1c2hfYmxvY2tfb25seShzLGZhbHNlKTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX05FRURfTU9SRTt9fX1lbHNlIGlmKHMubWF0Y2hfYXZhaWxhYmxlKXtiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMsMCxzLndpbmRvd1tzLnN0cnN0YXJ0LTFdKTtpZihiZmx1c2gpe2ZsdXNoX2Jsb2NrX29ubHkocyxmYWxzZSk7fQpzLnN0cnN0YXJ0Kys7cy5sb29rYWhlYWQtLTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX05FRURfTU9SRTt9fWVsc2V7cy5tYXRjaF9hdmFpbGFibGU9MTtzLnN0cnN0YXJ0Kys7cy5sb29rYWhlYWQtLTt9fQppZihzLm1hdGNoX2F2YWlsYWJsZSl7YmZsdXNoPXRyZWVzLl90cl90YWxseShzLDAscy53aW5kb3dbcy5zdHJzdGFydC0xXSk7cy5tYXRjaF9hdmFpbGFibGU9MDt9CnMuaW5zZXJ0PXMuc3Ryc3RhcnQ8TUlOX01BVENILTE/cy5zdHJzdGFydDpNSU5fTUFUQ0gtMTtpZihmbHVzaD09PVpfRklOSVNIKXtmbHVzaF9ibG9ja19vbmx5KHMsdHJ1ZSk7aWYocy5zdHJtLmF2YWlsX291dD09PTApe3JldHVybiBCU19GSU5JU0hfU1RBUlRFRDt9CnJldHVybiBCU19GSU5JU0hfRE9ORTt9CmlmKHMubGFzdF9saXQpe2ZsdXNoX2Jsb2NrX29ubHkocyxmYWxzZSk7aWYocy5zdHJtLmF2YWlsX291dD09PTApe3JldHVybiBCU19ORUVEX01PUkU7fX0KcmV0dXJuIEJTX0JMT0NLX0RPTkU7fQpmdW5jdGlvbiBkZWZsYXRlX3JsZShzLGZsdXNoKXt2YXIgYmZsdXNoO3ZhciBwcmV2O3ZhciBzY2FuLHN0cmVuZDt2YXIgX3dpbj1zLndpbmRvdztmb3IoOzspe2lmKHMubG9va2FoZWFkPD1NQVhfTUFUQ0gpe2ZpbGxfd2luZG93KHMpO2lmKHMubG9va2FoZWFkPD1NQVhfTUFUQ0gmJmZsdXNoPT09Wl9OT19GTFVTSCl7cmV0dXJuIEJTX05FRURfTU9SRTt9CmlmKHMubG9va2FoZWFkPT09MCl7YnJlYWs7fX0Kcy5tYXRjaF9sZW5ndGg9MDtpZihzLmxvb2thaGVhZD49TUlOX01BVENIJiZzLnN0cnN0YXJ0PjApe3NjYW49cy5zdHJzdGFydC0xO3ByZXY9X3dpbltzY2FuXTtpZihwcmV2PT09X3dpblsrK3NjYW5dJiZwcmV2PT09X3dpblsrK3NjYW5dJiZwcmV2PT09X3dpblsrK3NjYW5dKXtzdHJlbmQ9cy5zdHJzdGFydCtNQVhfTUFUQ0g7ZG97fXdoaWxlKHByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnNjYW48c3RyZW5kKTtzLm1hdGNoX2xlbmd0aD1NQVhfTUFUQ0gtKHN0cmVuZC1zY2FuKTtpZihzLm1hdGNoX2xlbmd0aD5zLmxvb2thaGVhZCl7cy5tYXRjaF9sZW5ndGg9cy5sb29rYWhlYWQ7fX19CmlmKHMubWF0Y2hfbGVuZ3RoPj1NSU5fTUFUQ0gpe2JmbHVzaD10cmVlcy5fdHJfdGFsbHkocywxLHMubWF0Y2hfbGVuZ3RoLU1JTl9NQVRDSCk7cy5sb29rYWhlYWQtPXMubWF0Y2hfbGVuZ3RoO3Muc3Ryc3RhcnQrPXMubWF0Y2hfbGVuZ3RoO3MubWF0Y2hfbGVuZ3RoPTA7fWVsc2V7YmZsdXNoPXRyZWVzLl90cl90YWxseShzLDAscy53aW5kb3dbcy5zdHJzdGFydF0pO3MubG9va2FoZWFkLS07cy5zdHJzdGFydCsrO30KaWYoYmZsdXNoKXtmbHVzaF9ibG9ja19vbmx5KHMsZmFsc2UpO2lmKHMuc3RybS5hdmFpbF9vdXQ9PT0wKXtyZXR1cm4gQlNfTkVFRF9NT1JFO319fQpzLmluc2VydD0wO2lmKGZsdXNoPT09Wl9GSU5JU0gpe2ZsdXNoX2Jsb2NrX29ubHkocyx0cnVlKTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO30KcmV0dXJuIEJTX0ZJTklTSF9ET05FO30KaWYocy5sYXN0X2xpdCl7Zmx1c2hfYmxvY2tfb25seShzLGZhbHNlKTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX05FRURfTU9SRTt9fQpyZXR1cm4gQlNfQkxPQ0tfRE9ORTt9CmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLGZsdXNoKXt2YXIgYmZsdXNoO2Zvcig7Oyl7aWYocy5sb29rYWhlYWQ9PT0wKXtmaWxsX3dpbmRvdyhzKTtpZihzLmxvb2thaGVhZD09PTApe2lmKGZsdXNoPT09Wl9OT19GTFVTSCl7cmV0dXJuIEJTX05FRURfTU9SRTt9CmJyZWFrO319CnMubWF0Y2hfbGVuZ3RoPTA7YmZsdXNoPXRyZWVzLl90cl90YWxseShzLDAscy53aW5kb3dbcy5zdHJzdGFydF0pO3MubG9va2FoZWFkLS07cy5zdHJzdGFydCsrO2lmKGJmbHVzaCl7Zmx1c2hfYmxvY2tfb25seShzLGZhbHNlKTtpZihzLnN0cm0uYXZhaWxfb3V0PT09MCl7cmV0dXJuIEJTX05FRURfTU9SRTt9fX0Kcy5pbnNlcnQ9MDtpZihmbHVzaD09PVpfRklOSVNIKXtmbHVzaF9ibG9ja19vbmx5KHMsdHJ1ZSk7aWYocy5zdHJtLmF2YWlsX291dD09PTApe3JldHVybiBCU19GSU5JU0hfU1RBUlRFRDt9CnJldHVybiBCU19GSU5JU0hfRE9ORTt9CmlmKHMubGFzdF9saXQpe2ZsdXNoX2Jsb2NrX29ubHkocyxmYWxzZSk7aWYocy5zdHJtLmF2YWlsX291dD09PTApe3JldHVybiBCU19ORUVEX01PUkU7fX0KcmV0dXJuIEJTX0JMT0NLX0RPTkU7fQpmdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsbWF4X2xhenksbmljZV9sZW5ndGgsbWF4X2NoYWluLGZ1bmMpe3RoaXMuZ29vZF9sZW5ndGg9Z29vZF9sZW5ndGg7dGhpcy5tYXhfbGF6eT1tYXhfbGF6eTt0aGlzLm5pY2VfbGVuZ3RoPW5pY2VfbGVuZ3RoO3RoaXMubWF4X2NoYWluPW1heF9jaGFpbjt0aGlzLmZ1bmM9ZnVuYzt9CnZhciBjb25maWd1cmF0aW9uX3RhYmxlO2NvbmZpZ3VyYXRpb25fdGFibGU9W25ldyBDb25maWcoMCwwLDAsMCxkZWZsYXRlX3N0b3JlZCksbmV3IENvbmZpZyg0LDQsOCw0LGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDUsMTYsOCxkZWZsYXRlX2Zhc3QpLG5ldyBDb25maWcoNCw2LDMyLDMyLGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDQsMTYsMTYsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMzIsMzIsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMTI4LDEyOCxkZWZsYXRlX3Nsb3cpLG5ldyBDb25maWcoOCwzMiwxMjgsMjU2LGRlZmxhdGVfc2xvdyksbmV3IENvbmZpZygzMiwxMjgsMjU4LDEwMjQsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDMyLDI1OCwyNTgsNDA5NixkZWZsYXRlX3Nsb3cpXTtmdW5jdGlvbiBsbV9pbml0KHMpe3Mud2luZG93X3NpemU9MipzLndfc2l6ZTt6ZXJvKHMuaGVhZCk7cy5tYXhfbGF6eV9tYXRjaD1jb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5O3MuZ29vZF9tYXRjaD1jb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmdvb2RfbGVuZ3RoO3MubmljZV9tYXRjaD1jb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoO3MubWF4X2NoYWluX2xlbmd0aD1jb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjtzLnN0cnN0YXJ0PTA7cy5ibG9ja19zdGFydD0wO3MubG9va2FoZWFkPTA7cy5pbnNlcnQ9MDtzLm1hdGNoX2xlbmd0aD1zLnByZXZfbGVuZ3RoPU1JTl9NQVRDSC0xO3MubWF0Y2hfYXZhaWxhYmxlPTA7cy5pbnNfaD0wO30KZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCl7dGhpcy5zdHJtPW51bGw7dGhpcy5zdGF0dXM9MDt0aGlzLnBlbmRpbmdfYnVmPW51bGw7dGhpcy5wZW5kaW5nX2J1Zl9zaXplPTA7dGhpcy5wZW5kaW5nX291dD0wO3RoaXMucGVuZGluZz0wO3RoaXMud3JhcD0wO3RoaXMuZ3poZWFkPW51bGw7dGhpcy5nemluZGV4PTA7dGhpcy5tZXRob2Q9Wl9ERUZMQVRFRDt0aGlzLmxhc3RfZmx1c2g9LTE7dGhpcy53X3NpemU9MDt0aGlzLndfYml0cz0wO3RoaXMud19tYXNrPTA7dGhpcy53aW5kb3c9bnVsbDt0aGlzLndpbmRvd19zaXplPTA7dGhpcy5wcmV2PW51bGw7dGhpcy5oZWFkPW51bGw7dGhpcy5pbnNfaD0wO3RoaXMuaGFzaF9zaXplPTA7dGhpcy5oYXNoX2JpdHM9MDt0aGlzLmhhc2hfbWFzaz0wO3RoaXMuaGFzaF9zaGlmdD0wO3RoaXMuYmxvY2tfc3RhcnQ9MDt0aGlzLm1hdGNoX2xlbmd0aD0wO3RoaXMucHJldl9tYXRjaD0wO3RoaXMubWF0Y2hfYXZhaWxhYmxlPTA7dGhpcy5zdHJzdGFydD0wO3RoaXMubWF0Y2hfc3RhcnQ9MDt0aGlzLmxvb2thaGVhZD0wO3RoaXMucHJldl9sZW5ndGg9MDt0aGlzLm1heF9jaGFpbl9sZW5ndGg9MDt0aGlzLm1heF9sYXp5X21hdGNoPTA7dGhpcy5sZXZlbD0wO3RoaXMuc3RyYXRlZ3k9MDt0aGlzLmdvb2RfbWF0Y2g9MDt0aGlzLm5pY2VfbWF0Y2g9MDt0aGlzLmR5bl9sdHJlZT1uZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFKjIpO3RoaXMuZHluX2R0cmVlPW5ldyB1dGlscy5CdWYxNigoMipEX0NPREVTKzEpKjIpO3RoaXMuYmxfdHJlZT1uZXcgdXRpbHMuQnVmMTYoKDIqQkxfQ09ERVMrMSkqMik7emVybyh0aGlzLmR5bl9sdHJlZSk7emVybyh0aGlzLmR5bl9kdHJlZSk7emVybyh0aGlzLmJsX3RyZWUpO3RoaXMubF9kZXNjPW51bGw7dGhpcy5kX2Rlc2M9bnVsbDt0aGlzLmJsX2Rlc2M9bnVsbDt0aGlzLmJsX2NvdW50PW5ldyB1dGlscy5CdWYxNihNQVhfQklUUysxKTt0aGlzLmhlYXA9bmV3IHV0aWxzLkJ1ZjE2KDIqTF9DT0RFUysxKTt6ZXJvKHRoaXMuaGVhcCk7dGhpcy5oZWFwX2xlbj0wO3RoaXMuaGVhcF9tYXg9MDt0aGlzLmRlcHRoPW5ldyB1dGlscy5CdWYxNigyKkxfQ09ERVMrMSk7emVybyh0aGlzLmRlcHRoKTt0aGlzLmxfYnVmPTA7dGhpcy5saXRfYnVmc2l6ZT0wO3RoaXMubGFzdF9saXQ9MDt0aGlzLmRfYnVmPTA7dGhpcy5vcHRfbGVuPTA7dGhpcy5zdGF0aWNfbGVuPTA7dGhpcy5tYXRjaGVzPTA7dGhpcy5pbnNlcnQ9MDt0aGlzLmJpX2J1Zj0wO3RoaXMuYmlfdmFsaWQ9MDt9CmZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSl7dmFyIHM7aWYoIXN0cm18fCFzdHJtLnN0YXRlKXtyZXR1cm4gZXJyKHN0cm0sWl9TVFJFQU1fRVJST1IpO30Kc3RybS50b3RhbF9pbj1zdHJtLnRvdGFsX291dD0wO3N0cm0uZGF0YV90eXBlPVpfVU5LTk9XTjtzPXN0cm0uc3RhdGU7cy5wZW5kaW5nPTA7cy5wZW5kaW5nX291dD0wO2lmKHMud3JhcDwwKXtzLndyYXA9LXMud3JhcDt9CnMuc3RhdHVzPXMud3JhcD9JTklUX1NUQVRFOkJVU1lfU1RBVEU7c3RybS5hZGxlcj1zLndyYXA9PT0yPzA6MTtzLmxhc3RfZmx1c2g9Wl9OT19GTFVTSDt0cmVlcy5fdHJfaW5pdChzKTtyZXR1cm4gWl9PSzt9CmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKXt2YXIgcmV0PWRlZmxhdGVSZXNldEtlZXAoc3RybSk7aWYocmV0PT09Wl9PSyl7bG1faW5pdChzdHJtLnN0YXRlKTt9CnJldHVybiByZXQ7fQpmdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHN0cm0saGVhZCl7aWYoIXN0cm18fCFzdHJtLnN0YXRlKXtyZXR1cm4gWl9TVFJFQU1fRVJST1I7fQppZihzdHJtLnN0YXRlLndyYXAhPT0yKXtyZXR1cm4gWl9TVFJFQU1fRVJST1I7fQpzdHJtLnN0YXRlLmd6aGVhZD1oZWFkO3JldHVybiBaX09LO30KZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sbGV2ZWwsbWV0aG9kLHdpbmRvd0JpdHMsbWVtTGV2ZWwsc3RyYXRlZ3kpe2lmKCFzdHJtKXtyZXR1cm4gWl9TVFJFQU1fRVJST1I7fQp2YXIgd3JhcD0xO2lmKGxldmVsPT09Wl9ERUZBVUxUX0NPTVBSRVNTSU9OKXtsZXZlbD02O30KaWYod2luZG93Qml0czwwKXt3cmFwPTA7d2luZG93Qml0cz0td2luZG93Qml0czt9ZWxzZQppZih3aW5kb3dCaXRzPjE1KXt3cmFwPTI7d2luZG93Qml0cy09MTY7fQppZihtZW1MZXZlbDwxfHxtZW1MZXZlbD5NQVhfTUVNX0xFVkVMfHxtZXRob2QhPT1aX0RFRkxBVEVEfHx3aW5kb3dCaXRzPDh8fHdpbmRvd0JpdHM+MTV8fGxldmVsPDB8fGxldmVsPjl8fHN0cmF0ZWd5PDB8fHN0cmF0ZWd5PlpfRklYRUQpe3JldHVybiBlcnIoc3RybSxaX1NUUkVBTV9FUlJPUik7fQppZih3aW5kb3dCaXRzPT09OCl7d2luZG93Qml0cz05O30KdmFyIHM9bmV3IERlZmxhdGVTdGF0ZSgpO3N0cm0uc3RhdGU9cztzLnN0cm09c3RybTtzLndyYXA9d3JhcDtzLmd6aGVhZD1udWxsO3Mud19iaXRzPXdpbmRvd0JpdHM7cy53X3NpemU9MTw8cy53X2JpdHM7cy53X21hc2s9cy53X3NpemUtMTtzLmhhc2hfYml0cz1tZW1MZXZlbCs3O3MuaGFzaF9zaXplPTE8PHMuaGFzaF9iaXRzO3MuaGFzaF9tYXNrPXMuaGFzaF9zaXplLTE7cy5oYXNoX3NoaWZ0PX5+KChzLmhhc2hfYml0cytNSU5fTUFUQ0gtMSkvTUlOX01BVENIKTtzLndpbmRvdz1uZXcgdXRpbHMuQnVmOChzLndfc2l6ZSoyKTtzLmhlYWQ9bmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtzLnByZXY9bmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtzLmxpdF9idWZzaXplPTE8PG1lbUxldmVsKzY7cy5wZW5kaW5nX2J1Zl9zaXplPXMubGl0X2J1ZnNpemUqNDtzLnBlbmRpbmdfYnVmPW5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7cy5kX2J1Zj0xKnMubGl0X2J1ZnNpemU7cy5sX2J1Zj0oMSsyKSpzLmxpdF9idWZzaXplO3MubGV2ZWw9bGV2ZWw7cy5zdHJhdGVneT1zdHJhdGVneTtzLm1ldGhvZD1tZXRob2Q7cmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTt9CmZ1bmN0aW9uIGRlZmxhdGVJbml0KHN0cm0sbGV2ZWwpe3JldHVybiBkZWZsYXRlSW5pdDIoc3RybSxsZXZlbCxaX0RFRkxBVEVELE1BWF9XQklUUyxERUZfTUVNX0xFVkVMLFpfREVGQVVMVF9TVFJBVEVHWSk7fQpmdW5jdGlvbiBkZWZsYXRlKHN0cm0sZmx1c2gpe3ZhciBvbGRfZmx1c2gsczt2YXIgYmVnLHZhbDtpZighc3RybXx8IXN0cm0uc3RhdGV8fGZsdXNoPlpfQkxPQ0t8fGZsdXNoPDApe3JldHVybiBzdHJtP2VycihzdHJtLFpfU1RSRUFNX0VSUk9SKTpaX1NUUkVBTV9FUlJPUjt9CnM9c3RybS5zdGF0ZTtpZighc3RybS5vdXRwdXR8fCFzdHJtLmlucHV0JiZzdHJtLmF2YWlsX2luIT09MHx8cy5zdGF0dXM9PT1GSU5JU0hfU1RBVEUmJmZsdXNoIT09Wl9GSU5JU0gpe3JldHVybiBlcnIoc3RybSxzdHJtLmF2YWlsX291dD09PTA/Wl9CVUZfRVJST1I6Wl9TVFJFQU1fRVJST1IpO30Kcy5zdHJtPXN0cm07b2xkX2ZsdXNoPXMubGFzdF9mbHVzaDtzLmxhc3RfZmx1c2g9Zmx1c2g7aWYocy5zdGF0dXM9PT1JTklUX1NUQVRFKXtpZihzLndyYXA9PT0yKXtzdHJtLmFkbGVyPTA7cHV0X2J5dGUocywzMSk7cHV0X2J5dGUocywxMzkpO3B1dF9ieXRlKHMsOCk7aWYoIXMuZ3poZWFkKXtwdXRfYnl0ZShzLDApO3B1dF9ieXRlKHMsMCk7cHV0X2J5dGUocywwKTtwdXRfYnl0ZShzLDApO3B1dF9ieXRlKHMsMCk7cHV0X2J5dGUocyxzLmxldmVsPT09OT8yOnMuc3RyYXRlZ3k+PVpfSFVGRk1BTl9PTkxZfHxzLmxldmVsPDI/NDowKTtwdXRfYnl0ZShzLE9TX0NPREUpO3Muc3RhdHVzPUJVU1lfU1RBVEU7fWVsc2UKe3B1dF9ieXRlKHMsKHMuZ3poZWFkLnRleHQ/MTowKSsocy5nemhlYWQuaGNyYz8yOjApKyghcy5nemhlYWQuZXh0cmE/MDo0KSsoIXMuZ3poZWFkLm5hbWU/MDo4KSsoIXMuZ3poZWFkLmNvbW1lbnQ/MDoxNikpO3B1dF9ieXRlKHMscy5nemhlYWQudGltZSYweGZmKTtwdXRfYnl0ZShzLHMuZ3poZWFkLnRpbWU+PjgmMHhmZik7cHV0X2J5dGUocyxzLmd6aGVhZC50aW1lPj4xNiYweGZmKTtwdXRfYnl0ZShzLHMuZ3poZWFkLnRpbWU+PjI0JjB4ZmYpO3B1dF9ieXRlKHMscy5sZXZlbD09PTk/MjpzLnN0cmF0ZWd5Pj1aX0hVRkZNQU5fT05MWXx8cy5sZXZlbDwyPzQ6MCk7cHV0X2J5dGUocyxzLmd6aGVhZC5vcyYweGZmKTtpZihzLmd6aGVhZC5leHRyYSYmcy5nemhlYWQuZXh0cmEubGVuZ3RoKXtwdXRfYnl0ZShzLHMuZ3poZWFkLmV4dHJhLmxlbmd0aCYweGZmKTtwdXRfYnl0ZShzLHMuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYweGZmKTt9CmlmKHMuZ3poZWFkLmhjcmMpe3N0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZywwKTt9CnMuZ3ppbmRleD0wO3Muc3RhdHVzPUVYVFJBX1NUQVRFO319ZWxzZQp7dmFyIGhlYWRlcj1aX0RFRkxBVEVEKyhzLndfYml0cy04PDw0KTw8ODt2YXIgbGV2ZWxfZmxhZ3M9LTE7aWYocy5zdHJhdGVneT49Wl9IVUZGTUFOX09OTFl8fHMubGV2ZWw8Mil7bGV2ZWxfZmxhZ3M9MDt9ZWxzZSBpZihzLmxldmVsPDYpe2xldmVsX2ZsYWdzPTE7fWVsc2UgaWYocy5sZXZlbD09PTYpe2xldmVsX2ZsYWdzPTI7fWVsc2V7bGV2ZWxfZmxhZ3M9Mzt9CmhlYWRlcnw9bGV2ZWxfZmxhZ3M8PDY7aWYocy5zdHJzdGFydCE9PTApe2hlYWRlcnw9UFJFU0VUX0RJQ1Q7fQpoZWFkZXIrPTMxLWhlYWRlciUzMTtzLnN0YXR1cz1CVVNZX1NUQVRFO3B1dFNob3J0TVNCKHMsaGVhZGVyKTtpZihzLnN0cnN0YXJ0IT09MCl7cHV0U2hvcnRNU0IocyxzdHJtLmFkbGVyPj4+MTYpO3B1dFNob3J0TVNCKHMsc3RybS5hZGxlciYweGZmZmYpO30Kc3RybS5hZGxlcj0xO319CmlmKHMuc3RhdHVzPT09RVhUUkFfU1RBVEUpe2lmKHMuZ3poZWFkLmV4dHJhKXtiZWc9cy5wZW5kaW5nO3doaWxlKHMuZ3ppbmRleDwocy5nemhlYWQuZXh0cmEubGVuZ3RoJjB4ZmZmZikpe2lmKHMucGVuZGluZz09PXMucGVuZGluZ19idWZfc2l6ZSl7aWYocy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyl7c3RybS5hZGxlcj1jcmMzMihzdHJtLmFkbGVyLHMucGVuZGluZ19idWYscy5wZW5kaW5nLWJlZyxiZWcpO30KZmx1c2hfcGVuZGluZyhzdHJtKTtiZWc9cy5wZW5kaW5nO2lmKHMucGVuZGluZz09PXMucGVuZGluZ19idWZfc2l6ZSl7YnJlYWs7fX0KcHV0X2J5dGUocyxzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdJjB4ZmYpO3MuZ3ppbmRleCsrO30KaWYocy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyl7c3RybS5hZGxlcj1jcmMzMihzdHJtLmFkbGVyLHMucGVuZGluZ19idWYscy5wZW5kaW5nLWJlZyxiZWcpO30KaWYocy5nemluZGV4PT09cy5nemhlYWQuZXh0cmEubGVuZ3RoKXtzLmd6aW5kZXg9MDtzLnN0YXR1cz1OQU1FX1NUQVRFO319ZWxzZQp7cy5zdGF0dXM9TkFNRV9TVEFURTt9fQppZihzLnN0YXR1cz09PU5BTUVfU1RBVEUpe2lmKHMuZ3poZWFkLm5hbWUpe2JlZz1zLnBlbmRpbmc7ZG97aWYocy5wZW5kaW5nPT09cy5wZW5kaW5nX2J1Zl9zaXplKXtpZihzLmd6aGVhZC5oY3JjJiZzLnBlbmRpbmc+YmVnKXtzdHJtLmFkbGVyPWNyYzMyKHN0cm0uYWRsZXIscy5wZW5kaW5nX2J1ZixzLnBlbmRpbmctYmVnLGJlZyk7fQpmbHVzaF9wZW5kaW5nKHN0cm0pO2JlZz1zLnBlbmRpbmc7aWYocy5wZW5kaW5nPT09cy5wZW5kaW5nX2J1Zl9zaXplKXt2YWw9MTticmVhazt9fQppZihzLmd6aW5kZXg8cy5nemhlYWQubmFtZS5sZW5ndGgpe3ZhbD1zLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspJjB4ZmY7fWVsc2V7dmFsPTA7fQpwdXRfYnl0ZShzLHZhbCk7fXdoaWxlKHZhbCE9PTApO2lmKHMuZ3poZWFkLmhjcmMmJnMucGVuZGluZz5iZWcpe3N0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZy1iZWcsYmVnKTt9CmlmKHZhbD09PTApe3MuZ3ppbmRleD0wO3Muc3RhdHVzPUNPTU1FTlRfU1RBVEU7fX1lbHNlCntzLnN0YXR1cz1DT01NRU5UX1NUQVRFO319CmlmKHMuc3RhdHVzPT09Q09NTUVOVF9TVEFURSl7aWYocy5nemhlYWQuY29tbWVudCl7YmVnPXMucGVuZGluZztkb3tpZihzLnBlbmRpbmc9PT1zLnBlbmRpbmdfYnVmX3NpemUpe2lmKHMuZ3poZWFkLmhjcmMmJnMucGVuZGluZz5iZWcpe3N0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZy1iZWcsYmVnKTt9CmZsdXNoX3BlbmRpbmcoc3RybSk7YmVnPXMucGVuZGluZztpZihzLnBlbmRpbmc9PT1zLnBlbmRpbmdfYnVmX3NpemUpe3ZhbD0xO2JyZWFrO319CmlmKHMuZ3ppbmRleDxzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCl7dmFsPXMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykmMHhmZjt9ZWxzZXt2YWw9MDt9CnB1dF9ieXRlKHMsdmFsKTt9d2hpbGUodmFsIT09MCk7aWYocy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyl7c3RybS5hZGxlcj1jcmMzMihzdHJtLmFkbGVyLHMucGVuZGluZ19idWYscy5wZW5kaW5nLWJlZyxiZWcpO30KaWYodmFsPT09MCl7cy5zdGF0dXM9SENSQ19TVEFURTt9fWVsc2UKe3Muc3RhdHVzPUhDUkNfU1RBVEU7fX0KaWYocy5zdGF0dXM9PT1IQ1JDX1NUQVRFKXtpZihzLmd6aGVhZC5oY3JjKXtpZihzLnBlbmRpbmcrMj5zLnBlbmRpbmdfYnVmX3NpemUpe2ZsdXNoX3BlbmRpbmcoc3RybSk7fQppZihzLnBlbmRpbmcrMjw9cy5wZW5kaW5nX2J1Zl9zaXplKXtwdXRfYnl0ZShzLHN0cm0uYWRsZXImMHhmZik7cHV0X2J5dGUocyxzdHJtLmFkbGVyPj44JjB4ZmYpO3N0cm0uYWRsZXI9MDtzLnN0YXR1cz1CVVNZX1NUQVRFO319ZWxzZQp7cy5zdGF0dXM9QlVTWV9TVEFURTt9fQppZihzLnBlbmRpbmchPT0wKXtmbHVzaF9wZW5kaW5nKHN0cm0pO2lmKHN0cm0uYXZhaWxfb3V0PT09MCl7cy5sYXN0X2ZsdXNoPS0xO3JldHVybiBaX09LO319ZWxzZSBpZihzdHJtLmF2YWlsX2luPT09MCYmcmFuayhmbHVzaCk8PXJhbmsob2xkX2ZsdXNoKSYmZmx1c2ghPT1aX0ZJTklTSCl7cmV0dXJuIGVycihzdHJtLFpfQlVGX0VSUk9SKTt9CmlmKHMuc3RhdHVzPT09RklOSVNIX1NUQVRFJiZzdHJtLmF2YWlsX2luIT09MCl7cmV0dXJuIGVycihzdHJtLFpfQlVGX0VSUk9SKTt9CmlmKHN0cm0uYXZhaWxfaW4hPT0wfHxzLmxvb2thaGVhZCE9PTB8fGZsdXNoIT09Wl9OT19GTFVTSCYmcy5zdGF0dXMhPT1GSU5JU0hfU1RBVEUpe3ZhciBic3RhdGU9cy5zdHJhdGVneT09PVpfSFVGRk1BTl9PTkxZP2RlZmxhdGVfaHVmZihzLGZsdXNoKTpzLnN0cmF0ZWd5PT09Wl9STEU/ZGVmbGF0ZV9ybGUocyxmbHVzaCk6Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsZmx1c2gpO2lmKGJzdGF0ZT09PUJTX0ZJTklTSF9TVEFSVEVEfHxic3RhdGU9PT1CU19GSU5JU0hfRE9ORSl7cy5zdGF0dXM9RklOSVNIX1NUQVRFO30KaWYoYnN0YXRlPT09QlNfTkVFRF9NT1JFfHxic3RhdGU9PT1CU19GSU5JU0hfU1RBUlRFRCl7aWYoc3RybS5hdmFpbF9vdXQ9PT0wKXtzLmxhc3RfZmx1c2g9LTE7fQpyZXR1cm4gWl9PSzt9CmlmKGJzdGF0ZT09PUJTX0JMT0NLX0RPTkUpe2lmKGZsdXNoPT09Wl9QQVJUSUFMX0ZMVVNIKXt0cmVlcy5fdHJfYWxpZ24ocyk7fWVsc2UKaWYoZmx1c2ghPT1aX0JMT0NLKXt0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsMCwwLGZhbHNlKTtpZihmbHVzaD09PVpfRlVMTF9GTFVTSCl7emVybyhzLmhlYWQpO2lmKHMubG9va2FoZWFkPT09MCl7cy5zdHJzdGFydD0wO3MuYmxvY2tfc3RhcnQ9MDtzLmluc2VydD0wO319fQpmbHVzaF9wZW5kaW5nKHN0cm0pO2lmKHN0cm0uYXZhaWxfb3V0PT09MCl7cy5sYXN0X2ZsdXNoPS0xO3JldHVybiBaX09LO319fQppZihmbHVzaCE9PVpfRklOSVNIKXtyZXR1cm4gWl9PSzt9CmlmKHMud3JhcDw9MCl7cmV0dXJuIFpfU1RSRUFNX0VORDt9CmlmKHMud3JhcD09PTIpe3B1dF9ieXRlKHMsc3RybS5hZGxlciYweGZmKTtwdXRfYnl0ZShzLHN0cm0uYWRsZXI+PjgmMHhmZik7cHV0X2J5dGUocyxzdHJtLmFkbGVyPj4xNiYweGZmKTtwdXRfYnl0ZShzLHN0cm0uYWRsZXI+PjI0JjB4ZmYpO3B1dF9ieXRlKHMsc3RybS50b3RhbF9pbiYweGZmKTtwdXRfYnl0ZShzLHN0cm0udG90YWxfaW4+PjgmMHhmZik7cHV0X2J5dGUocyxzdHJtLnRvdGFsX2luPj4xNiYweGZmKTtwdXRfYnl0ZShzLHN0cm0udG90YWxfaW4+PjI0JjB4ZmYpO31lbHNlCntwdXRTaG9ydE1TQihzLHN0cm0uYWRsZXI+Pj4xNik7cHV0U2hvcnRNU0IocyxzdHJtLmFkbGVyJjB4ZmZmZik7fQpmbHVzaF9wZW5kaW5nKHN0cm0pO2lmKHMud3JhcD4wKXtzLndyYXA9LXMud3JhcDt9CnJldHVybiBzLnBlbmRpbmchPT0wP1pfT0s6Wl9TVFJFQU1fRU5EO30KZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKXt2YXIgc3RhdHVzO2lmKCFzdHJtfHwhc3RybS5zdGF0ZSl7cmV0dXJuIFpfU1RSRUFNX0VSUk9SO30Kc3RhdHVzPXN0cm0uc3RhdGUuc3RhdHVzO2lmKHN0YXR1cyE9PUlOSVRfU1RBVEUmJnN0YXR1cyE9PUVYVFJBX1NUQVRFJiZzdGF0dXMhPT1OQU1FX1NUQVRFJiZzdGF0dXMhPT1DT01NRU5UX1NUQVRFJiZzdGF0dXMhPT1IQ1JDX1NUQVRFJiZzdGF0dXMhPT1CVVNZX1NUQVRFJiZzdGF0dXMhPT1GSU5JU0hfU1RBVEUpCntyZXR1cm4gZXJyKHN0cm0sWl9TVFJFQU1fRVJST1IpO30Kc3RybS5zdGF0ZT1udWxsO3JldHVybiBzdGF0dXM9PT1CVVNZX1NUQVRFP2VycihzdHJtLFpfREFUQV9FUlJPUik6Wl9PSzt9CmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sZGljdGlvbmFyeSl7dmFyIGRpY3RMZW5ndGg9ZGljdGlvbmFyeS5sZW5ndGg7dmFyIHM7dmFyIHN0cixuO3ZhciB3cmFwO3ZhciBhdmFpbDt2YXIgbmV4dDt2YXIgaW5wdXQ7dmFyIHRtcERpY3Q7aWYoIXN0cm18fCFzdHJtLnN0YXRlKXtyZXR1cm4gWl9TVFJFQU1fRVJST1I7fQpzPXN0cm0uc3RhdGU7d3JhcD1zLndyYXA7aWYod3JhcD09PTJ8fHdyYXA9PT0xJiZzLnN0YXR1cyE9PUlOSVRfU1RBVEV8fHMubG9va2FoZWFkKXtyZXR1cm4gWl9TVFJFQU1fRVJST1I7fQppZih3cmFwPT09MSl7c3RybS5hZGxlcj1hZGxlcjMyKHN0cm0uYWRsZXIsZGljdGlvbmFyeSxkaWN0TGVuZ3RoLDApO30Kcy53cmFwPTA7aWYoZGljdExlbmd0aD49cy53X3NpemUpe2lmKHdyYXA9PT0wKXt6ZXJvKHMuaGVhZCk7cy5zdHJzdGFydD0wO3MuYmxvY2tfc3RhcnQ9MDtzLmluc2VydD0wO30KdG1wRGljdD1uZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7dXRpbHMuYXJyYXlTZXQodG1wRGljdCxkaWN0aW9uYXJ5LGRpY3RMZW5ndGgtcy53X3NpemUscy53X3NpemUsMCk7ZGljdGlvbmFyeT10bXBEaWN0O2RpY3RMZW5ndGg9cy53X3NpemU7fQphdmFpbD1zdHJtLmF2YWlsX2luO25leHQ9c3RybS5uZXh0X2luO2lucHV0PXN0cm0uaW5wdXQ7c3RybS5hdmFpbF9pbj1kaWN0TGVuZ3RoO3N0cm0ubmV4dF9pbj0wO3N0cm0uaW5wdXQ9ZGljdGlvbmFyeTtmaWxsX3dpbmRvdyhzKTt3aGlsZShzLmxvb2thaGVhZD49TUlOX01BVENIKXtzdHI9cy5zdHJzdGFydDtuPXMubG9va2FoZWFkLShNSU5fTUFUQ0gtMSk7ZG97cy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3N0citNSU5fTUFUQ0gtMV0pJnMuaGFzaF9tYXNrO3MucHJldltzdHImcy53X21hc2tdPXMuaGVhZFtzLmluc19oXTtzLmhlYWRbcy5pbnNfaF09c3RyO3N0cisrO313aGlsZSgtLW4pO3Muc3Ryc3RhcnQ9c3RyO3MubG9va2FoZWFkPU1JTl9NQVRDSC0xO2ZpbGxfd2luZG93KHMpO30Kcy5zdHJzdGFydCs9cy5sb29rYWhlYWQ7cy5ibG9ja19zdGFydD1zLnN0cnN0YXJ0O3MuaW5zZXJ0PXMubG9va2FoZWFkO3MubG9va2FoZWFkPTA7cy5tYXRjaF9sZW5ndGg9cy5wcmV2X2xlbmd0aD1NSU5fTUFUQ0gtMTtzLm1hdGNoX2F2YWlsYWJsZT0wO3N0cm0ubmV4dF9pbj1uZXh0O3N0cm0uaW5wdXQ9aW5wdXQ7c3RybS5hdmFpbF9pbj1hdmFpbDtzLndyYXA9d3JhcDtyZXR1cm4gWl9PSzt9CmV4cG9ydHMuZGVmbGF0ZUluaXQ9ZGVmbGF0ZUluaXQ7ZXhwb3J0cy5kZWZsYXRlSW5pdDI9ZGVmbGF0ZUluaXQyO2V4cG9ydHMuZGVmbGF0ZVJlc2V0PWRlZmxhdGVSZXNldDtleHBvcnRzLmRlZmxhdGVSZXNldEtlZXA9ZGVmbGF0ZVJlc2V0S2VlcDtleHBvcnRzLmRlZmxhdGVTZXRIZWFkZXI9ZGVmbGF0ZVNldEhlYWRlcjtleHBvcnRzLmRlZmxhdGU9ZGVmbGF0ZTtleHBvcnRzLmRlZmxhdGVFbmQ9ZGVmbGF0ZUVuZDtleHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWRlZmxhdGVTZXREaWN0aW9uYXJ5O2V4cG9ydHMuZGVmbGF0ZUluZm89J3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO30seyIuLi91dGlscy9jb21tb24iOjY3LCIuL2FkbGVyMzIiOjY4LCIuL2NyYzMyIjo3MCwiLi9tZXNzYWdlcyI6NzIsIi4vdHJlZXMiOjczfV0sNzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jzttb2R1bGUuZXhwb3J0cz17MjonbmVlZCBkaWN0aW9uYXJ5JywxOidzdHJlYW0gZW5kJywwOicnLCctMSc6J2ZpbGUgZXJyb3InLCctMic6J3N0cmVhbSBlcnJvcicsJy0zJzonZGF0YSBlcnJvcicsJy00JzonaW5zdWZmaWNpZW50IG1lbW9yeScsJy01JzonYnVmZmVyIGVycm9yJywnLTYnOidpbmNvbXBhdGlibGUgdmVyc2lvbid9O30se31dLDczOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsndXNlIHN0cmljdCc7dmFyIHV0aWxzPXJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO3ZhciBaX0ZJWEVEPTQ7dmFyIFpfQklOQVJZPTA7dmFyIFpfVEVYVD0xO3ZhciBaX1VOS05PV049MjtmdW5jdGlvbiB6ZXJvKGJ1Zil7dmFyIGxlbj1idWYubGVuZ3RoO3doaWxlKC0tbGVuPj0wKXtidWZbbGVuXT0wO319CnZhciBTVE9SRURfQkxPQ0s9MDt2YXIgU1RBVElDX1RSRUVTPTE7dmFyIERZTl9UUkVFUz0yO3ZhciBNSU5fTUFUQ0g9Mzt2YXIgTUFYX01BVENIPTI1ODt2YXIgTEVOR1RIX0NPREVTPTI5O3ZhciBMSVRFUkFMUz0yNTY7dmFyIExfQ09ERVM9TElURVJBTFMrMStMRU5HVEhfQ09ERVM7dmFyIERfQ09ERVM9MzA7dmFyIEJMX0NPREVTPTE5O3ZhciBIRUFQX1NJWkU9MipMX0NPREVTKzE7dmFyIE1BWF9CSVRTPTE1O3ZhciBCdWZfc2l6ZT0xNjt2YXIgTUFYX0JMX0JJVFM9Nzt2YXIgRU5EX0JMT0NLPTI1Njt2YXIgUkVQXzNfNj0xNjt2YXIgUkVQWl8zXzEwPTE3O3ZhciBSRVBaXzExXzEzOD0xODt2YXIgZXh0cmFfbGJpdHM9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF07dmFyIGV4dHJhX2RiaXRzPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXTt2YXIgZXh0cmFfYmxiaXRzPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTt2YXIgYmxfb3JkZXI9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO3ZhciBESVNUX0NPREVfTEVOPTUxMjt2YXIgc3RhdGljX2x0cmVlPW5ldyBBcnJheSgoTF9DT0RFUysyKSoyKTt6ZXJvKHN0YXRpY19sdHJlZSk7dmFyIHN0YXRpY19kdHJlZT1uZXcgQXJyYXkoRF9DT0RFUyoyKTt6ZXJvKHN0YXRpY19kdHJlZSk7dmFyIF9kaXN0X2NvZGU9bmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO3plcm8oX2Rpc3RfY29kZSk7dmFyIF9sZW5ndGhfY29kZT1uZXcgQXJyYXkoTUFYX01BVENILU1JTl9NQVRDSCsxKTt6ZXJvKF9sZW5ndGhfY29kZSk7dmFyIGJhc2VfbGVuZ3RoPW5ldyBBcnJheShMRU5HVEhfQ09ERVMpO3plcm8oYmFzZV9sZW5ndGgpO3ZhciBiYXNlX2Rpc3Q9bmV3IEFycmF5KERfQ09ERVMpO3plcm8oYmFzZV9kaXN0KTtmdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSxleHRyYV9iaXRzLGV4dHJhX2Jhc2UsZWxlbXMsbWF4X2xlbmd0aCl7dGhpcy5zdGF0aWNfdHJlZT1zdGF0aWNfdHJlZTt0aGlzLmV4dHJhX2JpdHM9ZXh0cmFfYml0czt0aGlzLmV4dHJhX2Jhc2U9ZXh0cmFfYmFzZTt0aGlzLmVsZW1zPWVsZW1zO3RoaXMubWF4X2xlbmd0aD1tYXhfbGVuZ3RoO3RoaXMuaGFzX3N0cmVlPXN0YXRpY190cmVlJiZzdGF0aWNfdHJlZS5sZW5ndGg7fQp2YXIgc3RhdGljX2xfZGVzYzt2YXIgc3RhdGljX2RfZGVzYzt2YXIgc3RhdGljX2JsX2Rlc2M7ZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsc3RhdF9kZXNjKXt0aGlzLmR5bl90cmVlPWR5bl90cmVlO3RoaXMubWF4X2NvZGU9MDt0aGlzLnN0YXRfZGVzYz1zdGF0X2Rlc2M7fQpmdW5jdGlvbiBkX2NvZGUoZGlzdCl7cmV0dXJuIGRpc3Q8MjU2P19kaXN0X2NvZGVbZGlzdF06X2Rpc3RfY29kZVsyNTYrKGRpc3Q+Pj43KV07fQpmdW5jdGlvbiBwdXRfc2hvcnQocyx3KXtzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXT13JjB4ZmY7cy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109dz4+PjgmMHhmZjt9CmZ1bmN0aW9uIHNlbmRfYml0cyhzLHZhbHVlLGxlbmd0aCl7aWYocy5iaV92YWxpZD5CdWZfc2l6ZS1sZW5ndGgpe3MuYmlfYnVmfD12YWx1ZTw8cy5iaV92YWxpZCYweGZmZmY7cHV0X3Nob3J0KHMscy5iaV9idWYpO3MuYmlfYnVmPXZhbHVlPj5CdWZfc2l6ZS1zLmJpX3ZhbGlkO3MuYmlfdmFsaWQrPWxlbmd0aC1CdWZfc2l6ZTt9ZWxzZXtzLmJpX2J1Znw9dmFsdWU8PHMuYmlfdmFsaWQmMHhmZmZmO3MuYmlfdmFsaWQrPWxlbmd0aDt9fQpmdW5jdGlvbiBzZW5kX2NvZGUocyxjLHRyZWUpe3NlbmRfYml0cyhzLHRyZWVbYyoyXSx0cmVlW2MqMisxXSk7fQpmdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsbGVuKXt2YXIgcmVzPTA7ZG97cmVzfD1jb2RlJjE7Y29kZT4+Pj0xO3Jlczw8PTE7fXdoaWxlKC0tbGVuPjApO3JldHVybiByZXM+Pj4xO30KZnVuY3Rpb24gYmlfZmx1c2gocyl7aWYocy5iaV92YWxpZD09PTE2KXtwdXRfc2hvcnQocyxzLmJpX2J1Zik7cy5iaV9idWY9MDtzLmJpX3ZhbGlkPTA7fWVsc2UgaWYocy5iaV92YWxpZD49OCl7cy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109cy5iaV9idWYmMHhmZjtzLmJpX2J1Zj4+PTg7cy5iaV92YWxpZC09ODt9fQpmdW5jdGlvbiBnZW5fYml0bGVuKHMsZGVzYykKe3ZhciB0cmVlPWRlc2MuZHluX3RyZWU7dmFyIG1heF9jb2RlPWRlc2MubWF4X2NvZGU7dmFyIHN0cmVlPWRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO3ZhciBoYXNfc3RyZWU9ZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO3ZhciBleHRyYT1kZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO3ZhciBiYXNlPWRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7dmFyIG1heF9sZW5ndGg9ZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDt2YXIgaDt2YXIgbixtO3ZhciBiaXRzO3ZhciB4Yml0czt2YXIgZjt2YXIgb3ZlcmZsb3c9MDtmb3IoYml0cz0wO2JpdHM8PU1BWF9CSVRTO2JpdHMrKyl7cy5ibF9jb3VudFtiaXRzXT0wO30KdHJlZVtzLmhlYXBbcy5oZWFwX21heF0qMisxXT0wO2ZvcihoPXMuaGVhcF9tYXgrMTtoPEhFQVBfU0laRTtoKyspe249cy5oZWFwW2hdO2JpdHM9dHJlZVt0cmVlW24qMisxXSoyKzFdKzE7aWYoYml0cz5tYXhfbGVuZ3RoKXtiaXRzPW1heF9sZW5ndGg7b3ZlcmZsb3crKzt9CnRyZWVbbioyKzFdPWJpdHM7aWYobj5tYXhfY29kZSl7Y29udGludWU7fQpzLmJsX2NvdW50W2JpdHNdKys7eGJpdHM9MDtpZihuPj1iYXNlKXt4Yml0cz1leHRyYVtuLWJhc2VdO30KZj10cmVlW24qMl07cy5vcHRfbGVuKz1mKihiaXRzK3hiaXRzKTtpZihoYXNfc3RyZWUpe3Muc3RhdGljX2xlbis9Ziooc3RyZWVbbioyKzFdK3hiaXRzKTt9fQppZihvdmVyZmxvdz09PTApe3JldHVybjt9CmRve2JpdHM9bWF4X2xlbmd0aC0xO3doaWxlKHMuYmxfY291bnRbYml0c109PT0wKXtiaXRzLS07fQpzLmJsX2NvdW50W2JpdHNdLS07cy5ibF9jb3VudFtiaXRzKzFdKz0yO3MuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtvdmVyZmxvdy09Mjt9d2hpbGUob3ZlcmZsb3c+MCk7Zm9yKGJpdHM9bWF4X2xlbmd0aDtiaXRzIT09MDtiaXRzLS0pe249cy5ibF9jb3VudFtiaXRzXTt3aGlsZShuIT09MCl7bT1zLmhlYXBbLS1oXTtpZihtPm1heF9jb2RlKXtjb250aW51ZTt9CmlmKHRyZWVbbSoyKzFdIT09Yml0cyl7cy5vcHRfbGVuKz0oYml0cy10cmVlW20qMisxXSkqdHJlZVttKjJdO3RyZWVbbSoyKzFdPWJpdHM7fQpuLS07fX19CmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLG1heF9jb2RlLGJsX2NvdW50KQp7dmFyIG5leHRfY29kZT1uZXcgQXJyYXkoTUFYX0JJVFMrMSk7dmFyIGNvZGU9MDt2YXIgYml0czt2YXIgbjtmb3IoYml0cz0xO2JpdHM8PU1BWF9CSVRTO2JpdHMrKyl7bmV4dF9jb2RlW2JpdHNdPWNvZGU9Y29kZStibF9jb3VudFtiaXRzLTFdPDwxO30KZm9yKG49MDtuPD1tYXhfY29kZTtuKyspe3ZhciBsZW49dHJlZVtuKjIrMV07aWYobGVuPT09MCl7Y29udGludWU7fQp0cmVlW24qMl09YmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLGxlbik7fX0KZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKXt2YXIgbjt2YXIgYml0czt2YXIgbGVuZ3RoO3ZhciBjb2RlO3ZhciBkaXN0O3ZhciBibF9jb3VudD1uZXcgQXJyYXkoTUFYX0JJVFMrMSk7bGVuZ3RoPTA7Zm9yKGNvZGU9MDtjb2RlPExFTkdUSF9DT0RFUy0xO2NvZGUrKyl7YmFzZV9sZW5ndGhbY29kZV09bGVuZ3RoO2ZvcihuPTA7bjwxPDxleHRyYV9sYml0c1tjb2RlXTtuKyspe19sZW5ndGhfY29kZVtsZW5ndGgrK109Y29kZTt9fQpfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdPWNvZGU7ZGlzdD0wO2Zvcihjb2RlPTA7Y29kZTwxNjtjb2RlKyspe2Jhc2VfZGlzdFtjb2RlXT1kaXN0O2ZvcihuPTA7bjwxPDxleHRyYV9kYml0c1tjb2RlXTtuKyspe19kaXN0X2NvZGVbZGlzdCsrXT1jb2RlO319CmRpc3Q+Pj03O2Zvcig7Y29kZTxEX0NPREVTO2NvZGUrKyl7YmFzZV9kaXN0W2NvZGVdPWRpc3Q8PDc7Zm9yKG49MDtuPDE8PGV4dHJhX2RiaXRzW2NvZGVdLTc7bisrKXtfZGlzdF9jb2RlWzI1NitkaXN0KytdPWNvZGU7fX0KZm9yKGJpdHM9MDtiaXRzPD1NQVhfQklUUztiaXRzKyspe2JsX2NvdW50W2JpdHNdPTA7fQpuPTA7d2hpbGUobjw9MTQzKXtzdGF0aWNfbHRyZWVbbioyKzFdPTg7bisrO2JsX2NvdW50WzhdKys7fQp3aGlsZShuPD0yNTUpe3N0YXRpY19sdHJlZVtuKjIrMV09OTtuKys7YmxfY291bnRbOV0rKzt9CndoaWxlKG48PTI3OSl7c3RhdGljX2x0cmVlW24qMisxXT03O24rKztibF9jb3VudFs3XSsrO30Kd2hpbGUobjw9Mjg3KXtzdGF0aWNfbHRyZWVbbioyKzFdPTg7bisrO2JsX2NvdW50WzhdKys7fQpnZW5fY29kZXMoc3RhdGljX2x0cmVlLExfQ09ERVMrMSxibF9jb3VudCk7Zm9yKG49MDtuPERfQ09ERVM7bisrKXtzdGF0aWNfZHRyZWVbbioyKzFdPTU7c3RhdGljX2R0cmVlW24qMl09YmlfcmV2ZXJzZShuLDUpO30Kc3RhdGljX2xfZGVzYz1uZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLGV4dHJhX2xiaXRzLExJVEVSQUxTKzEsTF9DT0RFUyxNQVhfQklUUyk7c3RhdGljX2RfZGVzYz1uZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLGV4dHJhX2RiaXRzLDAsRF9DT0RFUyxNQVhfQklUUyk7c3RhdGljX2JsX2Rlc2M9bmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSxleHRyYV9ibGJpdHMsMCxCTF9DT0RFUyxNQVhfQkxfQklUUyk7fQpmdW5jdGlvbiBpbml0X2Jsb2NrKHMpe3ZhciBuO2ZvcihuPTA7bjxMX0NPREVTO24rKyl7cy5keW5fbHRyZWVbbioyXT0wO30KZm9yKG49MDtuPERfQ09ERVM7bisrKXtzLmR5bl9kdHJlZVtuKjJdPTA7fQpmb3Iobj0wO248QkxfQ09ERVM7bisrKXtzLmJsX3RyZWVbbioyXT0wO30Kcy5keW5fbHRyZWVbRU5EX0JMT0NLKjJdPTE7cy5vcHRfbGVuPXMuc3RhdGljX2xlbj0wO3MubGFzdF9saXQ9cy5tYXRjaGVzPTA7fQpmdW5jdGlvbiBiaV93aW5kdXAocykKe2lmKHMuYmlfdmFsaWQ+OCl7cHV0X3Nob3J0KHMscy5iaV9idWYpO31lbHNlIGlmKHMuYmlfdmFsaWQ+MCl7cy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109cy5iaV9idWY7fQpzLmJpX2J1Zj0wO3MuYmlfdmFsaWQ9MDt9CmZ1bmN0aW9uIGNvcHlfYmxvY2socyxidWYsbGVuLGhlYWRlcikKe2JpX3dpbmR1cChzKTtpZihoZWFkZXIpe3B1dF9zaG9ydChzLGxlbik7cHV0X3Nob3J0KHMsfmxlbik7fQp1dGlscy5hcnJheVNldChzLnBlbmRpbmdfYnVmLHMud2luZG93LGJ1ZixsZW4scy5wZW5kaW5nKTtzLnBlbmRpbmcrPWxlbjt9CmZ1bmN0aW9uIHNtYWxsZXIodHJlZSxuLG0sZGVwdGgpe3ZhciBfbjI9bioyO3ZhciBfbTI9bSoyO3JldHVybiB0cmVlW19uMl08dHJlZVtfbTJdfHx0cmVlW19uMl09PT10cmVlW19tMl0mJmRlcHRoW25dPD1kZXB0aFttXTt9CmZ1bmN0aW9uIHBxZG93bmhlYXAocyx0cmVlLGspCnt2YXIgdj1zLmhlYXBba107dmFyIGo9azw8MTt3aGlsZShqPD1zLmhlYXBfbGVuKXtpZihqPHMuaGVhcF9sZW4mJnNtYWxsZXIodHJlZSxzLmhlYXBbaisxXSxzLmhlYXBbal0scy5kZXB0aCkpe2orKzt9CmlmKHNtYWxsZXIodHJlZSx2LHMuaGVhcFtqXSxzLmRlcHRoKSl7YnJlYWs7fQpzLmhlYXBba109cy5oZWFwW2pdO2s9ajtqPDw9MTt9CnMuaGVhcFtrXT12O30KZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socyxsdHJlZSxkdHJlZSkKe3ZhciBkaXN0O3ZhciBsYzt2YXIgbHg9MDt2YXIgY29kZTt2YXIgZXh0cmE7aWYocy5sYXN0X2xpdCE9PTApe2Rve2Rpc3Q9cy5wZW5kaW5nX2J1ZltzLmRfYnVmK2x4KjJdPDw4fHMucGVuZGluZ19idWZbcy5kX2J1ZitseCoyKzFdO2xjPXMucGVuZGluZ19idWZbcy5sX2J1ZitseF07bHgrKztpZihkaXN0PT09MCl7c2VuZF9jb2RlKHMsbGMsbHRyZWUpO31lbHNle2NvZGU9X2xlbmd0aF9jb2RlW2xjXTtzZW5kX2NvZGUocyxjb2RlK0xJVEVSQUxTKzEsbHRyZWUpO2V4dHJhPWV4dHJhX2xiaXRzW2NvZGVdO2lmKGV4dHJhIT09MCl7bGMtPWJhc2VfbGVuZ3RoW2NvZGVdO3NlbmRfYml0cyhzLGxjLGV4dHJhKTt9CmRpc3QtLTtjb2RlPWRfY29kZShkaXN0KTtzZW5kX2NvZGUocyxjb2RlLGR0cmVlKTtleHRyYT1leHRyYV9kYml0c1tjb2RlXTtpZihleHRyYSE9PTApe2Rpc3QtPWJhc2VfZGlzdFtjb2RlXTtzZW5kX2JpdHMocyxkaXN0LGV4dHJhKTt9fX13aGlsZShseDxzLmxhc3RfbGl0KTt9CnNlbmRfY29kZShzLEVORF9CTE9DSyxsdHJlZSk7fQpmdW5jdGlvbiBidWlsZF90cmVlKHMsZGVzYykKe3ZhciB0cmVlPWRlc2MuZHluX3RyZWU7dmFyIHN0cmVlPWRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO3ZhciBoYXNfc3RyZWU9ZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO3ZhciBlbGVtcz1kZXNjLnN0YXRfZGVzYy5lbGVtczt2YXIgbixtO3ZhciBtYXhfY29kZT0tMTt2YXIgbm9kZTtzLmhlYXBfbGVuPTA7cy5oZWFwX21heD1IRUFQX1NJWkU7Zm9yKG49MDtuPGVsZW1zO24rKyl7aWYodHJlZVtuKjJdIT09MCl7cy5oZWFwWysrcy5oZWFwX2xlbl09bWF4X2NvZGU9bjtzLmRlcHRoW25dPTA7fWVsc2V7dHJlZVtuKjIrMV09MDt9fQp3aGlsZShzLmhlYXBfbGVuPDIpe25vZGU9cy5oZWFwWysrcy5oZWFwX2xlbl09bWF4X2NvZGU8Mj8rK21heF9jb2RlOjA7dHJlZVtub2RlKjJdPTE7cy5kZXB0aFtub2RlXT0wO3Mub3B0X2xlbi0tO2lmKGhhc19zdHJlZSl7cy5zdGF0aWNfbGVuLT1zdHJlZVtub2RlKjIrMV07fX0KZGVzYy5tYXhfY29kZT1tYXhfY29kZTtmb3Iobj1zLmhlYXBfbGVuPj4xO24+PTE7bi0tKXtwcWRvd25oZWFwKHMsdHJlZSxuKTt9Cm5vZGU9ZWxlbXM7ZG97bj1zLmhlYXBbMV07cy5oZWFwWzFdPXMuaGVhcFtzLmhlYXBfbGVuLS1dO3BxZG93bmhlYXAocyx0cmVlLDEpO209cy5oZWFwWzFdO3MuaGVhcFstLXMuaGVhcF9tYXhdPW47cy5oZWFwWy0tcy5oZWFwX21heF09bTt0cmVlW25vZGUqMl09dHJlZVtuKjJdK3RyZWVbbSoyXTtzLmRlcHRoW25vZGVdPShzLmRlcHRoW25dPj1zLmRlcHRoW21dP3MuZGVwdGhbbl06cy5kZXB0aFttXSkrMTt0cmVlW24qMisxXT10cmVlW20qMisxXT1ub2RlO3MuaGVhcFsxXT1ub2RlKys7cHFkb3duaGVhcChzLHRyZWUsMSk7fXdoaWxlKHMuaGVhcF9sZW4+PTIpO3MuaGVhcFstLXMuaGVhcF9tYXhdPXMuaGVhcFsxXTtnZW5fYml0bGVuKHMsZGVzYyk7Z2VuX2NvZGVzKHRyZWUsbWF4X2NvZGUscy5ibF9jb3VudCk7fQpmdW5jdGlvbiBzY2FuX3RyZWUocyx0cmVlLG1heF9jb2RlKQp7dmFyIG47dmFyIHByZXZsZW49LTE7dmFyIGN1cmxlbjt2YXIgbmV4dGxlbj10cmVlWzAqMisxXTt2YXIgY291bnQ9MDt2YXIgbWF4X2NvdW50PTc7dmFyIG1pbl9jb3VudD00O2lmKG5leHRsZW49PT0wKXttYXhfY291bnQ9MTM4O21pbl9jb3VudD0zO30KdHJlZVsobWF4X2NvZGUrMSkqMisxXT0weGZmZmY7Zm9yKG49MDtuPD1tYXhfY29kZTtuKyspe2N1cmxlbj1uZXh0bGVuO25leHRsZW49dHJlZVsobisxKSoyKzFdO2lmKCsrY291bnQ8bWF4X2NvdW50JiZjdXJsZW49PT1uZXh0bGVuKXtjb250aW51ZTt9ZWxzZSBpZihjb3VudDxtaW5fY291bnQpe3MuYmxfdHJlZVtjdXJsZW4qMl0rPWNvdW50O31lbHNlIGlmKGN1cmxlbiE9PTApe2lmKGN1cmxlbiE9PXByZXZsZW4pe3MuYmxfdHJlZVtjdXJsZW4qMl0rKzt9CnMuYmxfdHJlZVtSRVBfM182KjJdKys7fWVsc2UgaWYoY291bnQ8PTEwKXtzLmJsX3RyZWVbUkVQWl8zXzEwKjJdKys7fWVsc2V7cy5ibF90cmVlW1JFUFpfMTFfMTM4KjJdKys7fQpjb3VudD0wO3ByZXZsZW49Y3VybGVuO2lmKG5leHRsZW49PT0wKXttYXhfY291bnQ9MTM4O21pbl9jb3VudD0zO31lbHNlIGlmKGN1cmxlbj09PW5leHRsZW4pe21heF9jb3VudD02O21pbl9jb3VudD0zO31lbHNle21heF9jb3VudD03O21pbl9jb3VudD00O319fQpmdW5jdGlvbiBzZW5kX3RyZWUocyx0cmVlLG1heF9jb2RlKQp7dmFyIG47dmFyIHByZXZsZW49LTE7dmFyIGN1cmxlbjt2YXIgbmV4dGxlbj10cmVlWzAqMisxXTt2YXIgY291bnQ9MDt2YXIgbWF4X2NvdW50PTc7dmFyIG1pbl9jb3VudD00O2lmKG5leHRsZW49PT0wKXttYXhfY291bnQ9MTM4O21pbl9jb3VudD0zO30KZm9yKG49MDtuPD1tYXhfY29kZTtuKyspe2N1cmxlbj1uZXh0bGVuO25leHRsZW49dHJlZVsobisxKSoyKzFdO2lmKCsrY291bnQ8bWF4X2NvdW50JiZjdXJsZW49PT1uZXh0bGVuKXtjb250aW51ZTt9ZWxzZSBpZihjb3VudDxtaW5fY291bnQpe2Rve3NlbmRfY29kZShzLGN1cmxlbixzLmJsX3RyZWUpO313aGlsZSgtLWNvdW50IT09MCk7fWVsc2UgaWYoY3VybGVuIT09MCl7aWYoY3VybGVuIT09cHJldmxlbil7c2VuZF9jb2RlKHMsY3VybGVuLHMuYmxfdHJlZSk7Y291bnQtLTt9CnNlbmRfY29kZShzLFJFUF8zXzYscy5ibF90cmVlKTtzZW5kX2JpdHMocyxjb3VudC0zLDIpO31lbHNlIGlmKGNvdW50PD0xMCl7c2VuZF9jb2RlKHMsUkVQWl8zXzEwLHMuYmxfdHJlZSk7c2VuZF9iaXRzKHMsY291bnQtMywzKTt9ZWxzZXtzZW5kX2NvZGUocyxSRVBaXzExXzEzOCxzLmJsX3RyZWUpO3NlbmRfYml0cyhzLGNvdW50LTExLDcpO30KY291bnQ9MDtwcmV2bGVuPWN1cmxlbjtpZihuZXh0bGVuPT09MCl7bWF4X2NvdW50PTEzODttaW5fY291bnQ9Mzt9ZWxzZSBpZihjdXJsZW49PT1uZXh0bGVuKXttYXhfY291bnQ9NjttaW5fY291bnQ9Mzt9ZWxzZXttYXhfY291bnQ9NzttaW5fY291bnQ9NDt9fX0KZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKXt2YXIgbWF4X2JsaW5kZXg7c2Nhbl90cmVlKHMscy5keW5fbHRyZWUscy5sX2Rlc2MubWF4X2NvZGUpO3NjYW5fdHJlZShzLHMuZHluX2R0cmVlLHMuZF9kZXNjLm1heF9jb2RlKTtidWlsZF90cmVlKHMscy5ibF9kZXNjKTtmb3IobWF4X2JsaW5kZXg9QkxfQ09ERVMtMTttYXhfYmxpbmRleD49MzttYXhfYmxpbmRleC0tKXtpZihzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdKjIrMV0hPT0wKXticmVhazt9fQpzLm9wdF9sZW4rPTMqKG1heF9ibGluZGV4KzEpKzUrNSs0O3JldHVybiBtYXhfYmxpbmRleDt9CmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsbGNvZGVzLGRjb2RlcyxibGNvZGVzKQp7dmFyIHJhbms7c2VuZF9iaXRzKHMsbGNvZGVzLTI1Nyw1KTtzZW5kX2JpdHMocyxkY29kZXMtMSw1KTtzZW5kX2JpdHMocyxibGNvZGVzLTQsNCk7Zm9yKHJhbms9MDtyYW5rPGJsY29kZXM7cmFuaysrKXtzZW5kX2JpdHMocyxzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10qMisxXSwzKTt9CnNlbmRfdHJlZShzLHMuZHluX2x0cmVlLGxjb2Rlcy0xKTtzZW5kX3RyZWUocyxzLmR5bl9kdHJlZSxkY29kZXMtMSk7fQpmdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpe3ZhciBibGFja19tYXNrPTB4ZjNmZmMwN2Y7dmFyIG47Zm9yKG49MDtuPD0zMTtuKyssYmxhY2tfbWFzaz4+Pj0xKXtpZihibGFja19tYXNrJjEmJnMuZHluX2x0cmVlW24qMl0hPT0wKXtyZXR1cm4gWl9CSU5BUlk7fX0KaWYocy5keW5fbHRyZWVbOSoyXSE9PTB8fHMuZHluX2x0cmVlWzEwKjJdIT09MHx8cy5keW5fbHRyZWVbMTMqMl0hPT0wKXtyZXR1cm4gWl9URVhUO30KZm9yKG49MzI7bjxMSVRFUkFMUztuKyspe2lmKHMuZHluX2x0cmVlW24qMl0hPT0wKXtyZXR1cm4gWl9URVhUO319CnJldHVybiBaX0JJTkFSWTt9CnZhciBzdGF0aWNfaW5pdF9kb25lPWZhbHNlO2Z1bmN0aW9uIF90cl9pbml0KHMpCntpZighc3RhdGljX2luaXRfZG9uZSl7dHJfc3RhdGljX2luaXQoKTtzdGF0aWNfaW5pdF9kb25lPXRydWU7fQpzLmxfZGVzYz1uZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsc3RhdGljX2xfZGVzYyk7cy5kX2Rlc2M9bmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLHN0YXRpY19kX2Rlc2MpO3MuYmxfZGVzYz1uZXcgVHJlZURlc2Mocy5ibF90cmVlLHN0YXRpY19ibF9kZXNjKTtzLmJpX2J1Zj0wO3MuYmlfdmFsaWQ9MDtpbml0X2Jsb2NrKHMpO30KZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLGJ1ZixzdG9yZWRfbGVuLGxhc3QpCntzZW5kX2JpdHMocywoU1RPUkVEX0JMT0NLPDwxKSsobGFzdD8xOjApLDMpO2NvcHlfYmxvY2socyxidWYsc3RvcmVkX2xlbix0cnVlKTt9CmZ1bmN0aW9uIF90cl9hbGlnbihzKXtzZW5kX2JpdHMocyxTVEFUSUNfVFJFRVM8PDEsMyk7c2VuZF9jb2RlKHMsRU5EX0JMT0NLLHN0YXRpY19sdHJlZSk7YmlfZmx1c2gocyk7fQpmdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socyxidWYsc3RvcmVkX2xlbixsYXN0KQp7dmFyIG9wdF9sZW5iLHN0YXRpY19sZW5iO3ZhciBtYXhfYmxpbmRleD0wO2lmKHMubGV2ZWw+MCl7aWYocy5zdHJtLmRhdGFfdHlwZT09PVpfVU5LTk9XTil7cy5zdHJtLmRhdGFfdHlwZT1kZXRlY3RfZGF0YV90eXBlKHMpO30KYnVpbGRfdHJlZShzLHMubF9kZXNjKTtidWlsZF90cmVlKHMscy5kX2Rlc2MpO21heF9ibGluZGV4PWJ1aWxkX2JsX3RyZWUocyk7b3B0X2xlbmI9cy5vcHRfbGVuKzMrNz4+PjM7c3RhdGljX2xlbmI9cy5zdGF0aWNfbGVuKzMrNz4+PjM7aWYoc3RhdGljX2xlbmI8PW9wdF9sZW5iKXtvcHRfbGVuYj1zdGF0aWNfbGVuYjt9fWVsc2V7b3B0X2xlbmI9c3RhdGljX2xlbmI9c3RvcmVkX2xlbis1O30KaWYoc3RvcmVkX2xlbis0PD1vcHRfbGVuYiYmYnVmIT09LTEpe190cl9zdG9yZWRfYmxvY2socyxidWYsc3RvcmVkX2xlbixsYXN0KTt9ZWxzZSBpZihzLnN0cmF0ZWd5PT09Wl9GSVhFRHx8c3RhdGljX2xlbmI9PT1vcHRfbGVuYil7c2VuZF9iaXRzKHMsKFNUQVRJQ19UUkVFUzw8MSkrKGxhc3Q/MTowKSwzKTtjb21wcmVzc19ibG9jayhzLHN0YXRpY19sdHJlZSxzdGF0aWNfZHRyZWUpO31lbHNle3NlbmRfYml0cyhzLChEWU5fVFJFRVM8PDEpKyhsYXN0PzE6MCksMyk7c2VuZF9hbGxfdHJlZXMocyxzLmxfZGVzYy5tYXhfY29kZSsxLHMuZF9kZXNjLm1heF9jb2RlKzEsbWF4X2JsaW5kZXgrMSk7Y29tcHJlc3NfYmxvY2socyxzLmR5bl9sdHJlZSxzLmR5bl9kdHJlZSk7fQppbml0X2Jsb2NrKHMpO2lmKGxhc3Qpe2JpX3dpbmR1cChzKTt9fQpmdW5jdGlvbiBfdHJfdGFsbHkocyxkaXN0LGxjKQp7cy5wZW5kaW5nX2J1ZltzLmRfYnVmK3MubGFzdF9saXQqMl09ZGlzdD4+PjgmMHhmZjtzLnBlbmRpbmdfYnVmW3MuZF9idWYrcy5sYXN0X2xpdCoyKzFdPWRpc3QmMHhmZjtzLnBlbmRpbmdfYnVmW3MubF9idWYrcy5sYXN0X2xpdF09bGMmMHhmZjtzLmxhc3RfbGl0Kys7aWYoZGlzdD09PTApe3MuZHluX2x0cmVlW2xjKjJdKys7fWVsc2V7cy5tYXRjaGVzKys7ZGlzdC0tO3MuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzEpKjJdKys7cy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpKjJdKys7fQpyZXR1cm4gcy5sYXN0X2xpdD09PXMubGl0X2J1ZnNpemUtMTt9CmV4cG9ydHMuX3RyX2luaXQ9X3RyX2luaXQ7ZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrPV90cl9zdG9yZWRfYmxvY2s7ZXhwb3J0cy5fdHJfZmx1c2hfYmxvY2s9X3RyX2ZsdXNoX2Jsb2NrO2V4cG9ydHMuX3RyX3RhbGx5PV90cl90YWxseTtleHBvcnRzLl90cl9hbGlnbj1fdHJfYWxpZ247fSx7Ii4uL3V0aWxzL2NvbW1vbiI6Njd9XSw3NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIFpTdHJlYW0oKXt0aGlzLmlucHV0PW51bGw7dGhpcy5uZXh0X2luPTA7dGhpcy5hdmFpbF9pbj0wO3RoaXMudG90YWxfaW49MDt0aGlzLm91dHB1dD1udWxsO3RoaXMubmV4dF9vdXQ9MDt0aGlzLmF2YWlsX291dD0wO3RoaXMudG90YWxfb3V0PTA7dGhpcy5tc2c9Jyc7dGhpcy5zdGF0ZT1udWxsO3RoaXMuZGF0YV90eXBlPTI7dGhpcy5hZGxlcj0wO30KbW9kdWxlLmV4cG9ydHM9WlN0cmVhbTt9LHt9XSw3NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpe2Z1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLGFsbG93QWJvdmVSb290KXt2YXIgdXA9MDtmb3IodmFyIGk9cGFydHMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBsYXN0PXBhcnRzW2ldO2lmKGxhc3Q9PT0nLicpe3BhcnRzLnNwbGljZShpLDEpO31lbHNlIGlmKGxhc3Q9PT0nLi4nKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cCsrO31lbHNlIGlmKHVwKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cC0tO319CmlmKGFsbG93QWJvdmVSb290KXtmb3IoO3VwLS07dXApe3BhcnRzLnVuc2hpZnQoJy4uJyk7fX0KcmV0dXJuIHBhcnRzO30KdmFyIHNwbGl0UGF0aFJlPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLzt2YXIgc3BsaXRQYXRoPWZ1bmN0aW9uKGZpbGVuYW1lKXtyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7fTtleHBvcnRzLnJlc29sdmU9ZnVuY3Rpb24oKXt2YXIgcmVzb2x2ZWRQYXRoPScnLHJlc29sdmVkQWJzb2x1dGU9ZmFsc2U7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgtMTtpPj0tMSYmIXJlc29sdmVkQWJzb2x1dGU7aS0tKXt2YXIgcGF0aD1pPj0wP2FyZ3VtZW50c1tpXTpwcm9jZXNzLmN3ZCgpO2lmKHR5cGVvZiBwYXRoIT09J3N0cmluZycpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7fWVsc2UgaWYoIXBhdGgpe2NvbnRpbnVlO30KcmVzb2x2ZWRQYXRoPXBhdGgrJy8nK3Jlc29sdmVkUGF0aDtyZXNvbHZlZEFic29sdXRlPXBhdGguY2hhckF0KDApPT09Jy8nO30KcmVzb2x2ZWRQYXRoPW5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSxmdW5jdGlvbihwKXtyZXR1cm4hIXA7fSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtyZXR1cm4ocmVzb2x2ZWRBYnNvbHV0ZT8nLyc6JycpK3Jlc29sdmVkUGF0aHx8Jy4nO307ZXhwb3J0cy5ub3JtYWxpemU9ZnVuY3Rpb24ocGF0aCl7dmFyIGlzQWJzb2x1dGU9ZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLHRyYWlsaW5nU2xhc2g9c3Vic3RyKHBhdGgsLTEpPT09Jy8nO3BhdGg9bm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSxmdW5jdGlvbihwKXtyZXR1cm4hIXA7fSksIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtpZighcGF0aCYmIWlzQWJzb2x1dGUpe3BhdGg9Jy4nO30KaWYocGF0aCYmdHJhaWxpbmdTbGFzaCl7cGF0aCs9Jy8nO30KcmV0dXJuKGlzQWJzb2x1dGU/Jy8nOicnKStwYXRoO307ZXhwb3J0cy5pc0Fic29sdXRlPWZ1bmN0aW9uKHBhdGgpe3JldHVybiBwYXRoLmNoYXJBdCgwKT09PScvJzt9O2V4cG9ydHMuam9pbj1mdW5jdGlvbigpe3ZhciBwYXRocz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocyxmdW5jdGlvbihwLGluZGV4KXtpZih0eXBlb2YgcCE9PSdzdHJpbmcnKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO30KcmV0dXJuIHA7fSkuam9pbignLycpKTt9O2V4cG9ydHMucmVsYXRpdmU9ZnVuY3Rpb24oZnJvbSx0byl7ZnJvbT1leHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO3RvPWV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO2Z1bmN0aW9uIHRyaW0oYXJyKXt2YXIgc3RhcnQ9MDtmb3IoO3N0YXJ0PGFyci5sZW5ndGg7c3RhcnQrKyl7aWYoYXJyW3N0YXJ0XSE9PScnKWJyZWFrO30KdmFyIGVuZD1hcnIubGVuZ3RoLTE7Zm9yKDtlbmQ+PTA7ZW5kLS0pe2lmKGFycltlbmRdIT09JycpYnJlYWs7fQppZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSk7fQp2YXIgZnJvbVBhcnRzPXRyaW0oZnJvbS5zcGxpdCgnLycpKTt2YXIgdG9QYXJ0cz10cmltKHRvLnNwbGl0KCcvJykpO3ZhciBsZW5ndGg9TWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCx0b1BhcnRzLmxlbmd0aCk7dmFyIHNhbWVQYXJ0c0xlbmd0aD1sZW5ndGg7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXtpZihmcm9tUGFydHNbaV0hPT10b1BhcnRzW2ldKXtzYW1lUGFydHNMZW5ndGg9aTticmVhazt9fQp2YXIgb3V0cHV0UGFydHM9W107Zm9yKHZhciBpPXNhbWVQYXJ0c0xlbmd0aDtpPGZyb21QYXJ0cy5sZW5ndGg7aSsrKXtvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO30Kb3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTt9O2V4cG9ydHMuc2VwPScvJztleHBvcnRzLmRlbGltaXRlcj0nOic7ZXhwb3J0cy5kaXJuYW1lPWZ1bmN0aW9uKHBhdGgpe3ZhciByZXN1bHQ9c3BsaXRQYXRoKHBhdGgpLHJvb3Q9cmVzdWx0WzBdLGRpcj1yZXN1bHRbMV07aWYoIXJvb3QmJiFkaXIpe3JldHVybicuJzt9CmlmKGRpcil7ZGlyPWRpci5zdWJzdHIoMCxkaXIubGVuZ3RoLTEpO30KcmV0dXJuIHJvb3QrZGlyO307ZXhwb3J0cy5iYXNlbmFtZT1mdW5jdGlvbihwYXRoLGV4dCl7dmFyIGY9c3BsaXRQYXRoKHBhdGgpWzJdO2lmKGV4dCYmZi5zdWJzdHIoLTEqZXh0Lmxlbmd0aCk9PT1leHQpe2Y9Zi5zdWJzdHIoMCxmLmxlbmd0aC1leHQubGVuZ3RoKTt9CnJldHVybiBmO307ZXhwb3J0cy5leHRuYW1lPWZ1bmN0aW9uKHBhdGgpe3JldHVybiBzcGxpdFBhdGgocGF0aClbM107fTtmdW5jdGlvbiBmaWx0ZXIoeHMsZil7aWYoeHMuZmlsdGVyKXJldHVybiB4cy5maWx0ZXIoZik7dmFyIHJlcz1bXTtmb3IodmFyIGk9MDtpPHhzLmxlbmd0aDtpKyspe2lmKGYoeHNbaV0saSx4cykpcmVzLnB1c2goeHNbaV0pO30KcmV0dXJuIHJlczt9CnZhciBzdWJzdHI9J2FiJy5zdWJzdHIoLTEpPT09J2InP2Z1bmN0aW9uKHN0cixzdGFydCxsZW4pe3JldHVybiBzdHIuc3Vic3RyKHN0YXJ0LGxlbik7fTpmdW5jdGlvbihzdHIsc3RhcnQsbGVuKXtpZihzdGFydDwwKXN0YXJ0PXN0ci5sZW5ndGgrc3RhcnQ7cmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsbGVuKTt9O30pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKTt9LHsiX3Byb2Nlc3MiOjc3fV0sNzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXsndXNlIHN0cmljdCc7aWYoIXByb2Nlc3MudmVyc2lvbnx8cHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpPT09MHx8cHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpPT09MCYmcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykhPT0wKXttb2R1bGUuZXhwb3J0cz1uZXh0VGljazt9ZWxzZXttb2R1bGUuZXhwb3J0cz1wcm9jZXNzLm5leHRUaWNrO30KZnVuY3Rpb24gbmV4dFRpY2soZm4sYXJnMSxhcmcyLGFyZzMpe2lmKHR5cGVvZiBmbiE9PSdmdW5jdGlvbicpe3Rocm93IG5ldyBUeXBlRXJyb3IoJyJjYWxsYmFjayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7fQp2YXIgbGVuPWFyZ3VtZW50cy5sZW5ndGg7dmFyIGFyZ3MsaTtzd2l0Y2gobGVuKXtjYXNlIDA6Y2FzZSAxOnJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtjYXNlIDI6cmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCl7Zm4uY2FsbChudWxsLGFyZzEpO30pO2Nhc2UgMzpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKXtmbi5jYWxsKG51bGwsYXJnMSxhcmcyKTt9KTtjYXNlIDQ6cmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKXtmbi5jYWxsKG51bGwsYXJnMSxhcmcyLGFyZzMpO30pO2RlZmF1bHQ6YXJncz1uZXcgQXJyYXkobGVuLTEpO2k9MDt3aGlsZShpPGFyZ3MubGVuZ3RoKXthcmdzW2krK109YXJndW1lbnRzW2ldO30KcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCl7Zm4uYXBwbHkobnVsbCxhcmdzKTt9KTt9fX0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKTt9LHsiX3Byb2Nlc3MiOjc3fV0sNzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBwcm9jZXNzPW1vZHVsZS5leHBvcnRzPXt9O3ZhciBjYWNoZWRTZXRUaW1lb3V0O3ZhciBjYWNoZWRDbGVhclRpbWVvdXQ7ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO30KZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7fQooZnVuY3Rpb24oKXt0cnl7aWYodHlwZW9mIHNldFRpbWVvdXQ9PT0nZnVuY3Rpb24nKXtjYWNoZWRTZXRUaW1lb3V0PXNldFRpbWVvdXQ7fWVsc2V7Y2FjaGVkU2V0VGltZW91dD1kZWZhdWx0U2V0VGltb3V0O319Y2F0Y2goZSl7Y2FjaGVkU2V0VGltZW91dD1kZWZhdWx0U2V0VGltb3V0O30KdHJ5e2lmKHR5cGVvZiBjbGVhclRpbWVvdXQ9PT0nZnVuY3Rpb24nKXtjYWNoZWRDbGVhclRpbWVvdXQ9Y2xlYXJUaW1lb3V0O31lbHNle2NhY2hlZENsZWFyVGltZW91dD1kZWZhdWx0Q2xlYXJUaW1lb3V0O319Y2F0Y2goZSl7Y2FjaGVkQ2xlYXJUaW1lb3V0PWRlZmF1bHRDbGVhclRpbWVvdXQ7fX0pKCk7ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pe2lmKGNhY2hlZFNldFRpbWVvdXQ9PT1zZXRUaW1lb3V0KXtyZXR1cm4gc2V0VGltZW91dChmdW4sMCk7fQppZigoY2FjaGVkU2V0VGltZW91dD09PWRlZmF1bHRTZXRUaW1vdXR8fCFjYWNoZWRTZXRUaW1lb3V0KSYmc2V0VGltZW91dCl7Y2FjaGVkU2V0VGltZW91dD1zZXRUaW1lb3V0O3JldHVybiBzZXRUaW1lb3V0KGZ1biwwKTt9CnRyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sMCk7fWNhdGNoKGUpe3RyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsZnVuLDApO31jYXRjaChlKXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsZnVuLDApO319fQpmdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKXtpZihjYWNoZWRDbGVhclRpbWVvdXQ9PT1jbGVhclRpbWVvdXQpe3JldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTt9CmlmKChjYWNoZWRDbGVhclRpbWVvdXQ9PT1kZWZhdWx0Q2xlYXJUaW1lb3V0fHwhY2FjaGVkQ2xlYXJUaW1lb3V0KSYmY2xlYXJUaW1lb3V0KXtjYWNoZWRDbGVhclRpbWVvdXQ9Y2xlYXJUaW1lb3V0O3JldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTt9CnRyeXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7fWNhdGNoKGUpe3RyeXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCxtYXJrZXIpO31jYXRjaChlKXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcyxtYXJrZXIpO319fQp2YXIgcXVldWU9W107dmFyIGRyYWluaW5nPWZhbHNlO3ZhciBjdXJyZW50UXVldWU7dmFyIHF1ZXVlSW5kZXg9LTE7ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aWYoIWRyYWluaW5nfHwhY3VycmVudFF1ZXVlKXtyZXR1cm47fQpkcmFpbmluZz1mYWxzZTtpZihjdXJyZW50UXVldWUubGVuZ3RoKXtxdWV1ZT1jdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTt9ZWxzZXtxdWV1ZUluZGV4PS0xO30KaWYocXVldWUubGVuZ3RoKXtkcmFpblF1ZXVlKCk7fX0KZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKGRyYWluaW5nKXtyZXR1cm47fQp2YXIgdGltZW91dD1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7ZHJhaW5pbmc9dHJ1ZTt2YXIgbGVuPXF1ZXVlLmxlbmd0aDt3aGlsZShsZW4pe2N1cnJlbnRRdWV1ZT1xdWV1ZTtxdWV1ZT1bXTt3aGlsZSgrK3F1ZXVlSW5kZXg8bGVuKXtpZihjdXJyZW50UXVldWUpe2N1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTt9fQpxdWV1ZUluZGV4PS0xO2xlbj1xdWV1ZS5sZW5ndGg7fQpjdXJyZW50UXVldWU9bnVsbDtkcmFpbmluZz1mYWxzZTtydW5DbGVhclRpbWVvdXQodGltZW91dCk7fQpwcm9jZXNzLm5leHRUaWNrPWZ1bmN0aW9uKGZ1bil7dmFyIGFyZ3M9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXthcmdzW2ktMV09YXJndW1lbnRzW2ldO319CnF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLGFyZ3MpKTtpZihxdWV1ZS5sZW5ndGg9PT0xJiYhZHJhaW5pbmcpe3J1blRpbWVvdXQoZHJhaW5RdWV1ZSk7fX07ZnVuY3Rpb24gSXRlbShmdW4sYXJyYXkpe3RoaXMuZnVuPWZ1bjt0aGlzLmFycmF5PWFycmF5O30KSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KTt9O3Byb2Nlc3MudGl0bGU9J2Jyb3dzZXInO3Byb2Nlc3MuYnJvd3Nlcj10cnVlO3Byb2Nlc3MuZW52PXt9O3Byb2Nlc3MuYXJndj1bXTtwcm9jZXNzLnZlcnNpb249Jyc7cHJvY2Vzcy52ZXJzaW9ucz17fTtmdW5jdGlvbiBub29wKCl7fQpwcm9jZXNzLm9uPW5vb3A7cHJvY2Vzcy5hZGRMaXN0ZW5lcj1ub29wO3Byb2Nlc3Mub25jZT1ub29wO3Byb2Nlc3Mub2ZmPW5vb3A7cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcj1ub29wO3Byb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3A7cHJvY2Vzcy5lbWl0PW5vb3A7cHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXI9bm9vcDtwcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcDtwcm9jZXNzLmxpc3RlbmVycz1mdW5jdGlvbihuYW1lKXtyZXR1cm5bXTt9O3Byb2Nlc3MuYmluZGluZz1mdW5jdGlvbihuYW1lKXt0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7fTtwcm9jZXNzLmN3ZD1mdW5jdGlvbigpe3JldHVybicvJzt9O3Byb2Nlc3MuY2hkaXI9ZnVuY3Rpb24oZGlyKXt0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO307cHJvY2Vzcy51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwO307fSx7fV0sNzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmoscHJvcCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmoscHJvcCk7fQptb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihxcyxzZXAsZXEsb3B0aW9ucyl7c2VwPXNlcHx8JyYnO2VxPWVxfHwnPSc7dmFyIG9iaj17fTtpZih0eXBlb2YgcXMhPT0nc3RyaW5nJ3x8cXMubGVuZ3RoPT09MCl7cmV0dXJuIG9iajt9CnZhciByZWdleHA9L1wrL2c7cXM9cXMuc3BsaXQoc2VwKTt2YXIgbWF4S2V5cz0xMDAwO2lmKG9wdGlvbnMmJnR5cGVvZiBvcHRpb25zLm1heEtleXM9PT0nbnVtYmVyJyl7bWF4S2V5cz1vcHRpb25zLm1heEtleXM7fQp2YXIgbGVuPXFzLmxlbmd0aDtpZihtYXhLZXlzPjAmJmxlbj5tYXhLZXlzKXtsZW49bWF4S2V5czt9CmZvcih2YXIgaT0wO2k8bGVuOysraSl7dmFyIHg9cXNbaV0ucmVwbGFjZShyZWdleHAsJyUyMCcpLGlkeD14LmluZGV4T2YoZXEpLGtzdHIsdnN0cixrLHY7aWYoaWR4Pj0wKXtrc3RyPXguc3Vic3RyKDAsaWR4KTt2c3RyPXguc3Vic3RyKGlkeCsxKTt9ZWxzZXtrc3RyPXg7dnN0cj0nJzt9Cms9ZGVjb2RlVVJJQ29tcG9uZW50KGtzdHIpO3Y9ZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO2lmKCFoYXNPd25Qcm9wZXJ0eShvYmosaykpe29ialtrXT12O31lbHNlIGlmKGlzQXJyYXkob2JqW2tdKSl7b2JqW2tdLnB1c2godik7fWVsc2V7b2JqW2tdPVtvYmpba10sdl07fX0KcmV0dXJuIG9iajt9O3ZhciBpc0FycmF5PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHhzKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKT09PSdbb2JqZWN0IEFycmF5XSc7fTt9LHt9XSw3OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO3ZhciBzdHJpbmdpZnlQcmltaXRpdmU9ZnVuY3Rpb24odil7c3dpdGNoKHR5cGVvZiB2KXtjYXNlJ3N0cmluZyc6cmV0dXJuIHY7Y2FzZSdib29sZWFuJzpyZXR1cm4gdj8ndHJ1ZSc6J2ZhbHNlJztjYXNlJ251bWJlcic6cmV0dXJuIGlzRmluaXRlKHYpP3Y6Jyc7ZGVmYXVsdDpyZXR1cm4nJzt9fTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihvYmosc2VwLGVxLG5hbWUpe3NlcD1zZXB8fCcmJztlcT1lcXx8Jz0nO2lmKG9iaj09PW51bGwpe29iaj11bmRlZmluZWQ7fQppZih0eXBlb2Ygb2JqPT09J29iamVjdCcpe3JldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLGZ1bmN0aW9uKGspe3ZhciBrcz1lbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKStlcTtpZihpc0FycmF5KG9ialtrXSkpe3JldHVybiBtYXAob2JqW2tdLGZ1bmN0aW9uKHYpe3JldHVybiBrcytlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTt9KS5qb2luKHNlcCk7fWVsc2V7cmV0dXJuIGtzK2VuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7fX0pLmpvaW4oc2VwKTt9CmlmKCFuYW1lKXJldHVybicnO3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKStlcSsKZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTt9O3ZhciBpc0FycmF5PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHhzKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHhzKT09PSdbb2JqZWN0IEFycmF5XSc7fTtmdW5jdGlvbiBtYXAoeHMsZil7aWYoeHMubWFwKXJldHVybiB4cy5tYXAoZik7dmFyIHJlcz1bXTtmb3IodmFyIGk9MDtpPHhzLmxlbmd0aDtpKyspe3Jlcy5wdXNoKGYoeHNbaV0saSkpO30KcmV0dXJuIHJlczt9CnZhciBvYmplY3RLZXlzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihvYmope3ZhciByZXM9W107Zm9yKHZhciBrZXkgaW4gb2JqKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLGtleSkpcmVzLnB1c2goa2V5KTt9CnJldHVybiByZXM7fTt9LHt9XSw4MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2V4cG9ydHMuZGVjb2RlPWV4cG9ydHMucGFyc2U9cmVxdWlyZSgnLi9kZWNvZGUnKTtleHBvcnRzLmVuY29kZT1leHBvcnRzLnN0cmluZ2lmeT1yZXF1aXJlKCcuL2VuY29kZScpO30seyIuL2RlY29kZSI6NzgsIi4vZW5jb2RlIjo3OX1dLDgxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCIuL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIpO30seyIuL2xpYi9fc3RyZWFtX2R1cGxleC5qcyI6ODJ9XSw4MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO3ZhciBvYmplY3RLZXlzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihvYmope3ZhciBrZXlzPVtdO2Zvcih2YXIga2V5IGluIG9iail7a2V5cy5wdXNoKGtleSk7fXJldHVybiBrZXlzO307bW9kdWxlLmV4cG9ydHM9RHVwbGV4O3ZhciBwcm9jZXNzTmV4dFRpY2s9cmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTt2YXIgdXRpbD1yZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTt1dGlsLmluaGVyaXRzPXJlcXVpcmUoJ2luaGVyaXRzJyk7dmFyIFJlYWRhYmxlPXJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO3ZhciBXcml0YWJsZT1yZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTt1dGlsLmluaGVyaXRzKER1cGxleCxSZWFkYWJsZSk7dmFyIGtleXM9b2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO2Zvcih2YXIgdj0wO3Y8a2V5cy5sZW5ndGg7disrKXt2YXIgbWV0aG9kPWtleXNbdl07aWYoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSlEdXBsZXgucHJvdG90eXBlW21ldGhvZF09V3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07fQpmdW5jdGlvbiBEdXBsZXgob3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlyZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtSZWFkYWJsZS5jYWxsKHRoaXMsb3B0aW9ucyk7V3JpdGFibGUuY2FsbCh0aGlzLG9wdGlvbnMpO2lmKG9wdGlvbnMmJm9wdGlvbnMucmVhZGFibGU9PT1mYWxzZSl0aGlzLnJlYWRhYmxlPWZhbHNlO2lmKG9wdGlvbnMmJm9wdGlvbnMud3JpdGFibGU9PT1mYWxzZSl0aGlzLndyaXRhYmxlPWZhbHNlO3RoaXMuYWxsb3dIYWxmT3Blbj10cnVlO2lmKG9wdGlvbnMmJm9wdGlvbnMuYWxsb3dIYWxmT3Blbj09PWZhbHNlKXRoaXMuYWxsb3dIYWxmT3Blbj1mYWxzZTt0aGlzLm9uY2UoJ2VuZCcsb25lbmQpO30KZnVuY3Rpb24gb25lbmQoKXtpZih0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpcmV0dXJuO3Byb2Nlc3NOZXh0VGljayhvbkVuZE5ULHRoaXMpO30KZnVuY3Rpb24gb25FbmROVChzZWxmKXtzZWxmLmVuZCgpO30KZnVuY3Rpb24gZm9yRWFjaCh4cyxmKXtmb3IodmFyIGk9MCxsPXhzLmxlbmd0aDtpPGw7aSsrKXtmKHhzW2ldLGkpO319fSx7Ii4vX3N0cmVhbV9yZWFkYWJsZSI6ODQsIi4vX3N0cmVhbV93cml0YWJsZSI6ODYsImNvcmUtdXRpbC1pcyI6NjEsImluaGVyaXRzIjo2NCwicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOjc2fV0sODM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyd1c2Ugc3RyaWN0Jzttb2R1bGUuZXhwb3J0cz1QYXNzVGhyb3VnaDt2YXIgVHJhbnNmb3JtPXJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTt2YXIgdXRpbD1yZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTt1dGlsLmluaGVyaXRzPXJlcXVpcmUoJ2luaGVyaXRzJyk7dXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCxUcmFuc2Zvcm0pO2Z1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlyZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1RyYW5zZm9ybS5jYWxsKHRoaXMsb3B0aW9ucyk7fQpQYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7Y2IobnVsbCxjaHVuayk7fTt9LHsiLi9fc3RyZWFtX3RyYW5zZm9ybSI6ODUsImNvcmUtdXRpbC1pcyI6NjEsImluaGVyaXRzIjo2NH1dLDg0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7J3VzZSBzdHJpY3QnO21vZHVsZS5leHBvcnRzPVJlYWRhYmxlO3ZhciBwcm9jZXNzTmV4dFRpY2s9cmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTt2YXIgaXNBcnJheT1yZXF1aXJlKCdpc2FycmF5Jyk7dmFyIER1cGxleDtSZWFkYWJsZS5SZWFkYWJsZVN0YXRlPVJlYWRhYmxlU3RhdGU7dmFyIEVFPXJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjt2YXIgRUVsaXN0ZW5lckNvdW50PWZ1bmN0aW9uKGVtaXR0ZXIsdHlwZSl7cmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDt9O3ZhciBTdHJlYW07KGZ1bmN0aW9uKCl7dHJ5e1N0cmVhbT1yZXF1aXJlKCdzdCcrJ3JlYW0nKTt9Y2F0Y2goXyl7fWZpbmFsbHl7aWYoIVN0cmVhbSlTdHJlYW09cmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO319KSgpO3ZhciBCdWZmZXI9cmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO3ZhciBidWZmZXJTaGltPXJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO3ZhciB1dGlsPXJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO3V0aWwuaW5oZXJpdHM9cmVxdWlyZSgnaW5oZXJpdHMnKTt2YXIgZGVidWdVdGlsPXJlcXVpcmUoJ3V0aWwnKTt2YXIgZGVidWc9dm9pZCAwO2lmKGRlYnVnVXRpbCYmZGVidWdVdGlsLmRlYnVnbG9nKXtkZWJ1Zz1kZWJ1Z1V0aWwuZGVidWdsb2coJ3N0cmVhbScpO31lbHNle2RlYnVnPWZ1bmN0aW9uKCl7fTt9CnZhciBCdWZmZXJMaXN0PXJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0Jyk7dmFyIFN0cmluZ0RlY29kZXI7dXRpbC5pbmhlcml0cyhSZWFkYWJsZSxTdHJlYW0pO2Z1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLGV2ZW50LGZuKXtpZih0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXI9PT0nZnVuY3Rpb24nKXtyZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsZm4pO31lbHNle2lmKCFlbWl0dGVyLl9ldmVudHN8fCFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKWVtaXR0ZXIub24oZXZlbnQsZm4pO2Vsc2UgaWYoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSllbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XT1bZm4sZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07fX0KZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLHN0cmVhbSl7RHVwbGV4PUR1cGxleHx8cmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO29wdGlvbnM9b3B0aW9uc3x8e307dGhpcy5vYmplY3RNb2RlPSEhb3B0aW9ucy5vYmplY3RNb2RlO2lmKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCl0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO3ZhciBod209b3B0aW9ucy5oaWdoV2F0ZXJNYXJrO3ZhciBkZWZhdWx0SHdtPXRoaXMub2JqZWN0TW9kZT8xNjoxNioxMDI0O3RoaXMuaGlnaFdhdGVyTWFyaz1od218fGh3bT09PTA/aHdtOmRlZmF1bHRId207dGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrO3RoaXMuYnVmZmVyPW5ldyBCdWZmZXJMaXN0KCk7dGhpcy5sZW5ndGg9MDt0aGlzLnBpcGVzPW51bGw7dGhpcy5waXBlc0NvdW50PTA7dGhpcy5mbG93aW5nPW51bGw7dGhpcy5lbmRlZD1mYWxzZTt0aGlzLmVuZEVtaXR0ZWQ9ZmFsc2U7dGhpcy5yZWFkaW5nPWZhbHNlO3RoaXMuc3luYz10cnVlO3RoaXMubmVlZFJlYWRhYmxlPWZhbHNlO3RoaXMuZW1pdHRlZFJlYWRhYmxlPWZhbHNlO3RoaXMucmVhZGFibGVMaXN0ZW5pbmc9ZmFsc2U7dGhpcy5yZXN1bWVTY2hlZHVsZWQ9ZmFsc2U7dGhpcy5kZWZhdWx0RW5jb2Rpbmc9b3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmd8fCd1dGY4Jzt0aGlzLnJhbk91dD1mYWxzZTt0aGlzLmF3YWl0RHJhaW49MDt0aGlzLnJlYWRpbmdNb3JlPWZhbHNlO3RoaXMuZGVjb2Rlcj1udWxsO3RoaXMuZW5jb2Rpbmc9bnVsbDtpZihvcHRpb25zLmVuY29kaW5nKXtpZighU3RyaW5nRGVjb2RlcilTdHJpbmdEZWNvZGVyPXJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7dGhpcy5kZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO3RoaXMuZW5jb2Rpbmc9b3B0aW9ucy5lbmNvZGluZzt9fQpmdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKXtEdXBsZXg9RHVwbGV4fHxyZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7aWYoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKXJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLHRoaXMpO3RoaXMucmVhZGFibGU9dHJ1ZTtpZihvcHRpb25zJiZ0eXBlb2Ygb3B0aW9ucy5yZWFkPT09J2Z1bmN0aW9uJyl0aGlzLl9yZWFkPW9wdGlvbnMucmVhZDtTdHJlYW0uY2FsbCh0aGlzKTt9ClJlYWRhYmxlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZighc3RhdGUub2JqZWN0TW9kZSYmdHlwZW9mIGNodW5rPT09J3N0cmluZycpe2VuY29kaW5nPWVuY29kaW5nfHxzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7aWYoZW5jb2RpbmchPT1zdGF0ZS5lbmNvZGluZyl7Y2h1bms9YnVmZmVyU2hpbS5mcm9tKGNodW5rLGVuY29kaW5nKTtlbmNvZGluZz0nJzt9fQpyZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLHN0YXRlLGNodW5rLGVuY29kaW5nLGZhbHNlKTt9O1JlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKGNodW5rKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLHN0YXRlLGNodW5rLCcnLHRydWUpO307UmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz09PWZhbHNlO307ZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssZW5jb2RpbmcsYWRkVG9Gcm9udCl7dmFyIGVyPWNodW5rSW52YWxpZChzdGF0ZSxjaHVuayk7aWYoZXIpe3N0cmVhbS5lbWl0KCdlcnJvcicsZXIpO31lbHNlIGlmKGNodW5rPT09bnVsbCl7c3RhdGUucmVhZGluZz1mYWxzZTtvbkVvZkNodW5rKHN0cmVhbSxzdGF0ZSk7fWVsc2UgaWYoc3RhdGUub2JqZWN0TW9kZXx8Y2h1bmsmJmNodW5rLmxlbmd0aD4wKXtpZihzdGF0ZS5lbmRlZCYmIWFkZFRvRnJvbnQpe3ZhciBlPW5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtzdHJlYW0uZW1pdCgnZXJyb3InLGUpO31lbHNlIGlmKHN0YXRlLmVuZEVtaXR0ZWQmJmFkZFRvRnJvbnQpe3ZhciBfZT1uZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7c3RyZWFtLmVtaXQoJ2Vycm9yJyxfZSk7fWVsc2V7dmFyIHNraXBBZGQ7aWYoc3RhdGUuZGVjb2RlciYmIWFkZFRvRnJvbnQmJiFlbmNvZGluZyl7Y2h1bms9c3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7c2tpcEFkZD0hc3RhdGUub2JqZWN0TW9kZSYmY2h1bmsubGVuZ3RoPT09MDt9CmlmKCFhZGRUb0Zyb250KXN0YXRlLnJlYWRpbmc9ZmFsc2U7aWYoIXNraXBBZGQpe2lmKHN0YXRlLmZsb3dpbmcmJnN0YXRlLmxlbmd0aD09PTAmJiFzdGF0ZS5zeW5jKXtzdHJlYW0uZW1pdCgnZGF0YScsY2h1bmspO3N0cmVhbS5yZWFkKDApO31lbHNle3N0YXRlLmxlbmd0aCs9c3RhdGUub2JqZWN0TW9kZT8xOmNodW5rLmxlbmd0aDtpZihhZGRUb0Zyb250KXN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtpZihzdGF0ZS5uZWVkUmVhZGFibGUpZW1pdFJlYWRhYmxlKHN0cmVhbSk7fX0KbWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpO319ZWxzZSBpZighYWRkVG9Gcm9udCl7c3RhdGUucmVhZGluZz1mYWxzZTt9CnJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO30KZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKXtyZXR1cm4hc3RhdGUuZW5kZWQmJihzdGF0ZS5uZWVkUmVhZGFibGV8fHN0YXRlLmxlbmd0aDxzdGF0ZS5oaWdoV2F0ZXJNYXJrfHxzdGF0ZS5sZW5ndGg9PT0wKTt9ClJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbihlbmMpe2lmKCFTdHJpbmdEZWNvZGVyKVN0cmluZ0RlY29kZXI9cmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2Rlcjt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IFN0cmluZ0RlY29kZXIoZW5jKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPWVuYztyZXR1cm4gdGhpczt9O3ZhciBNQVhfSFdNPTB4ODAwMDAwO2Z1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pe2lmKG4+PU1BWF9IV00pe249TUFYX0hXTTt9ZWxzZXtuLS07bnw9bj4+PjE7bnw9bj4+PjI7bnw9bj4+PjQ7bnw9bj4+Pjg7bnw9bj4+PjE2O24rKzt9CnJldHVybiBuO30KZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLHN0YXRlKXtpZihuPD0wfHxzdGF0ZS5sZW5ndGg9PT0wJiZzdGF0ZS5lbmRlZClyZXR1cm4gMDtpZihzdGF0ZS5vYmplY3RNb2RlKXJldHVybiAxO2lmKG4hPT1uKXtpZihzdGF0ZS5mbG93aW5nJiZzdGF0ZS5sZW5ndGgpcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDt9CmlmKG4+c3RhdGUuaGlnaFdhdGVyTWFyaylzdGF0ZS5oaWdoV2F0ZXJNYXJrPWNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO2lmKG48PXN0YXRlLmxlbmd0aClyZXR1cm4gbjtpZighc3RhdGUuZW5kZWQpe3N0YXRlLm5lZWRSZWFkYWJsZT10cnVlO3JldHVybiAwO30KcmV0dXJuIHN0YXRlLmxlbmd0aDt9ClJlYWRhYmxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKG4pe2RlYnVnKCdyZWFkJyxuKTtuPXBhcnNlSW50KG4sMTApO3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3ZhciBuT3JpZz1uO2lmKG4hPT0wKXN0YXRlLmVtaXR0ZWRSZWFkYWJsZT1mYWxzZTtpZihuPT09MCYmc3RhdGUubmVlZFJlYWRhYmxlJiYoc3RhdGUubGVuZ3RoPj1zdGF0ZS5oaWdoV2F0ZXJNYXJrfHxzdGF0ZS5lbmRlZCkpe2RlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLHN0YXRlLmxlbmd0aCxzdGF0ZS5lbmRlZCk7aWYoc3RhdGUubGVuZ3RoPT09MCYmc3RhdGUuZW5kZWQpZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7cmV0dXJuIG51bGw7fQpuPWhvd011Y2hUb1JlYWQobixzdGF0ZSk7aWYobj09PTAmJnN0YXRlLmVuZGVkKXtpZihzdGF0ZS5sZW5ndGg9PT0wKWVuZFJlYWRhYmxlKHRoaXMpO3JldHVybiBudWxsO30KdmFyIGRvUmVhZD1zdGF0ZS5uZWVkUmVhZGFibGU7ZGVidWcoJ25lZWQgcmVhZGFibGUnLGRvUmVhZCk7aWYoc3RhdGUubGVuZ3RoPT09MHx8c3RhdGUubGVuZ3RoLW48c3RhdGUuaGlnaFdhdGVyTWFyayl7ZG9SZWFkPXRydWU7ZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJyxkb1JlYWQpO30KaWYoc3RhdGUuZW5kZWR8fHN0YXRlLnJlYWRpbmcpe2RvUmVhZD1mYWxzZTtkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsZG9SZWFkKTt9ZWxzZSBpZihkb1JlYWQpe2RlYnVnKCdkbyByZWFkJyk7c3RhdGUucmVhZGluZz10cnVlO3N0YXRlLnN5bmM9dHJ1ZTtpZihzdGF0ZS5sZW5ndGg9PT0wKXN0YXRlLm5lZWRSZWFkYWJsZT10cnVlO3RoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7c3RhdGUuc3luYz1mYWxzZTtpZighc3RhdGUucmVhZGluZyluPWhvd011Y2hUb1JlYWQobk9yaWcsc3RhdGUpO30KdmFyIHJldDtpZihuPjApcmV0PWZyb21MaXN0KG4sc3RhdGUpO2Vsc2UgcmV0PW51bGw7aWYocmV0PT09bnVsbCl7c3RhdGUubmVlZFJlYWRhYmxlPXRydWU7bj0wO31lbHNle3N0YXRlLmxlbmd0aC09bjt9CmlmKHN0YXRlLmxlbmd0aD09PTApe2lmKCFzdGF0ZS5lbmRlZClzdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTtpZihuT3JpZyE9PW4mJnN0YXRlLmVuZGVkKWVuZFJlYWRhYmxlKHRoaXMpO30KaWYocmV0IT09bnVsbCl0aGlzLmVtaXQoJ2RhdGEnLHJldCk7cmV0dXJuIHJldDt9O2Z1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSxjaHVuayl7dmFyIGVyPW51bGw7aWYoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykmJnR5cGVvZiBjaHVuayE9PSdzdHJpbmcnJiZjaHVuayE9PW51bGwmJmNodW5rIT09dW5kZWZpbmVkJiYhc3RhdGUub2JqZWN0TW9kZSl7ZXI9bmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO30KcmV0dXJuIGVyO30KZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sc3RhdGUpe2lmKHN0YXRlLmVuZGVkKXJldHVybjtpZihzdGF0ZS5kZWNvZGVyKXt2YXIgY2h1bms9c3RhdGUuZGVjb2Rlci5lbmQoKTtpZihjaHVuayYmY2h1bmsubGVuZ3RoKXtzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7c3RhdGUubGVuZ3RoKz1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoO319CnN0YXRlLmVuZGVkPXRydWU7ZW1pdFJlYWRhYmxlKHN0cmVhbSk7fQpmdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO3N0YXRlLm5lZWRSZWFkYWJsZT1mYWxzZTtpZighc3RhdGUuZW1pdHRlZFJlYWRhYmxlKXtkZWJ1ZygnZW1pdFJlYWRhYmxlJyxzdGF0ZS5mbG93aW5nKTtzdGF0ZS5lbWl0dGVkUmVhZGFibGU9dHJ1ZTtpZihzdGF0ZS5zeW5jKXByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7fX0KZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pe2RlYnVnKCdlbWl0IHJlYWRhYmxlJyk7c3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7ZmxvdyhzdHJlYW0pO30KZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpe2lmKCFzdGF0ZS5yZWFkaW5nTW9yZSl7c3RhdGUucmVhZGluZ01vcmU9dHJ1ZTtwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sc3RyZWFtLHN0YXRlKTt9fQpmdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sc3RhdGUpe3ZhciBsZW49c3RhdGUubGVuZ3RoO3doaWxlKCFzdGF0ZS5yZWFkaW5nJiYhc3RhdGUuZmxvd2luZyYmIXN0YXRlLmVuZGVkJiZzdGF0ZS5sZW5ndGg8c3RhdGUuaGlnaFdhdGVyTWFyayl7ZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7c3RyZWFtLnJlYWQoMCk7aWYobGVuPT09c3RhdGUubGVuZ3RoKQpicmVhaztlbHNlIGxlbj1zdGF0ZS5sZW5ndGg7fQpzdGF0ZS5yZWFkaW5nTW9yZT1mYWxzZTt9ClJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihuKXt0aGlzLmVtaXQoJ2Vycm9yJyxuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO307UmVhZGFibGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oZGVzdCxwaXBlT3B0cyl7dmFyIHNyYz10aGlzO3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChzdGF0ZS5waXBlc0NvdW50KXtjYXNlIDA6c3RhdGUucGlwZXM9ZGVzdDticmVhaztjYXNlIDE6c3RhdGUucGlwZXM9W3N0YXRlLnBpcGVzLGRlc3RdO2JyZWFrO2RlZmF1bHQ6c3RhdGUucGlwZXMucHVzaChkZXN0KTticmVhazt9CnN0YXRlLnBpcGVzQ291bnQrPTE7ZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsc3RhdGUucGlwZXNDb3VudCxwaXBlT3B0cyk7dmFyIGRvRW5kPSghcGlwZU9wdHN8fHBpcGVPcHRzLmVuZCE9PWZhbHNlKSYmZGVzdCE9PXByb2Nlc3Muc3Rkb3V0JiZkZXN0IT09cHJvY2Vzcy5zdGRlcnI7dmFyIGVuZEZuPWRvRW5kP29uZW5kOmNsZWFudXA7aWYoc3RhdGUuZW5kRW1pdHRlZClwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsZW5kRm4pO2Rlc3Qub24oJ3VucGlwZScsb251bnBpcGUpO2Z1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKXtkZWJ1Zygnb251bnBpcGUnKTtpZihyZWFkYWJsZT09PXNyYyl7Y2xlYW51cCgpO319CmZ1bmN0aW9uIG9uZW5kKCl7ZGVidWcoJ29uZW5kJyk7ZGVzdC5lbmQoKTt9CnZhciBvbmRyYWluPXBpcGVPbkRyYWluKHNyYyk7ZGVzdC5vbignZHJhaW4nLG9uZHJhaW4pO3ZhciBjbGVhbmVkVXA9ZmFsc2U7ZnVuY3Rpb24gY2xlYW51cCgpe2RlYnVnKCdjbGVhbnVwJyk7ZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLG9uY2xvc2UpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsb25maW5pc2gpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJyxvbmRyYWluKTtkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsb25lcnJvcik7ZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJyxvbnVucGlwZSk7c3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLG9uZW5kKTtzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsY2xlYW51cCk7c3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJyxvbmRhdGEpO2NsZWFuZWRVcD10cnVlO2lmKHN0YXRlLmF3YWl0RHJhaW4mJighZGVzdC5fd3JpdGFibGVTdGF0ZXx8ZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKW9uZHJhaW4oKTt9CnZhciBpbmNyZWFzZWRBd2FpdERyYWluPWZhbHNlO3NyYy5vbignZGF0YScsb25kYXRhKTtmdW5jdGlvbiBvbmRhdGEoY2h1bmspe2RlYnVnKCdvbmRhdGEnKTtpbmNyZWFzZWRBd2FpdERyYWluPWZhbHNlO3ZhciByZXQ9ZGVzdC53cml0ZShjaHVuayk7aWYoZmFsc2U9PT1yZXQmJiFpbmNyZWFzZWRBd2FpdERyYWluKXtpZigoc3RhdGUucGlwZXNDb3VudD09PTEmJnN0YXRlLnBpcGVzPT09ZGVzdHx8c3RhdGUucGlwZXNDb3VudD4xJiZpbmRleE9mKHN0YXRlLnBpcGVzLGRlc3QpIT09LTEpJiYhY2xlYW5lZFVwKXtkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJyxzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7c3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztpbmNyZWFzZWRBd2FpdERyYWluPXRydWU7fQpzcmMucGF1c2UoKTt9fQpmdW5jdGlvbiBvbmVycm9yKGVyKXtkZWJ1Zygnb25lcnJvcicsZXIpO3VucGlwZSgpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJyxvbmVycm9yKTtpZihFRWxpc3RlbmVyQ291bnQoZGVzdCwnZXJyb3InKT09PTApZGVzdC5lbWl0KCdlcnJvcicsZXIpO30KcHJlcGVuZExpc3RlbmVyKGRlc3QsJ2Vycm9yJyxvbmVycm9yKTtmdW5jdGlvbiBvbmNsb3NlKCl7ZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJyxvbmZpbmlzaCk7dW5waXBlKCk7fQpkZXN0Lm9uY2UoJ2Nsb3NlJyxvbmNsb3NlKTtmdW5jdGlvbiBvbmZpbmlzaCgpe2RlYnVnKCdvbmZpbmlzaCcpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJyxvbmNsb3NlKTt1bnBpcGUoKTt9CmRlc3Qub25jZSgnZmluaXNoJyxvbmZpbmlzaCk7ZnVuY3Rpb24gdW5waXBlKCl7ZGVidWcoJ3VucGlwZScpO3NyYy51bnBpcGUoZGVzdCk7fQpkZXN0LmVtaXQoJ3BpcGUnLHNyYyk7aWYoIXN0YXRlLmZsb3dpbmcpe2RlYnVnKCdwaXBlIHJlc3VtZScpO3NyYy5yZXN1bWUoKTt9CnJldHVybiBkZXN0O307ZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgc3RhdGU9c3JjLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCdwaXBlT25EcmFpbicsc3RhdGUuYXdhaXREcmFpbik7aWYoc3RhdGUuYXdhaXREcmFpbilzdGF0ZS5hd2FpdERyYWluLS07aWYoc3RhdGUuYXdhaXREcmFpbj09PTAmJkVFbGlzdGVuZXJDb3VudChzcmMsJ2RhdGEnKSl7c3RhdGUuZmxvd2luZz10cnVlO2Zsb3coc3JjKTt9fTt9ClJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24oZGVzdCl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoc3RhdGUucGlwZXNDb3VudD09PTApcmV0dXJuIHRoaXM7aWYoc3RhdGUucGlwZXNDb3VudD09PTEpe2lmKGRlc3QmJmRlc3QhPT1zdGF0ZS5waXBlcylyZXR1cm4gdGhpcztpZighZGVzdClkZXN0PXN0YXRlLnBpcGVzO3N0YXRlLnBpcGVzPW51bGw7c3RhdGUucGlwZXNDb3VudD0wO3N0YXRlLmZsb3dpbmc9ZmFsc2U7aWYoZGVzdClkZXN0LmVtaXQoJ3VucGlwZScsdGhpcyk7cmV0dXJuIHRoaXM7fQppZighZGVzdCl7dmFyIGRlc3RzPXN0YXRlLnBpcGVzO3ZhciBsZW49c3RhdGUucGlwZXNDb3VudDtzdGF0ZS5waXBlcz1udWxsO3N0YXRlLnBpcGVzQ291bnQ9MDtzdGF0ZS5mbG93aW5nPWZhbHNlO2Zvcih2YXIgaT0wO2k8bGVuO2krKyl7ZGVzdHNbaV0uZW1pdCgndW5waXBlJyx0aGlzKTt9cmV0dXJuIHRoaXM7fQp2YXIgaW5kZXg9aW5kZXhPZihzdGF0ZS5waXBlcyxkZXN0KTtpZihpbmRleD09PS0xKXJldHVybiB0aGlzO3N0YXRlLnBpcGVzLnNwbGljZShpbmRleCwxKTtzdGF0ZS5waXBlc0NvdW50LT0xO2lmKHN0YXRlLnBpcGVzQ291bnQ9PT0xKXN0YXRlLnBpcGVzPXN0YXRlLnBpcGVzWzBdO2Rlc3QuZW1pdCgndW5waXBlJyx0aGlzKTtyZXR1cm4gdGhpczt9O1JlYWRhYmxlLnByb3RvdHlwZS5vbj1mdW5jdGlvbihldixmbil7dmFyIHJlcz1TdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcyxldixmbik7aWYoZXY9PT0nZGF0YScpe2lmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyE9PWZhbHNlKXRoaXMucmVzdW1lKCk7fWVsc2UgaWYoZXY9PT0ncmVhZGFibGUnKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZighc3RhdGUuZW5kRW1pdHRlZCYmIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKXtzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZz1zdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTtzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ZmFsc2U7aWYoIXN0YXRlLnJlYWRpbmcpe3Byb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLHRoaXMpO31lbHNlIGlmKHN0YXRlLmxlbmd0aCl7ZW1pdFJlYWRhYmxlKHRoaXMsc3RhdGUpO319fQpyZXR1cm4gcmVzO307UmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyPVJlYWRhYmxlLnByb3RvdHlwZS5vbjtmdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpe2RlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtzZWxmLnJlYWQoMCk7fQpSZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoIXN0YXRlLmZsb3dpbmcpe2RlYnVnKCdyZXN1bWUnKTtzdGF0ZS5mbG93aW5nPXRydWU7cmVzdW1lKHRoaXMsc3RhdGUpO30KcmV0dXJuIHRoaXM7fTtmdW5jdGlvbiByZXN1bWUoc3RyZWFtLHN0YXRlKXtpZighc3RhdGUucmVzdW1lU2NoZWR1bGVkKXtzdGF0ZS5yZXN1bWVTY2hlZHVsZWQ9dHJ1ZTtwcm9jZXNzTmV4dFRpY2socmVzdW1lXyxzdHJlYW0sc3RhdGUpO319CmZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLHN0YXRlKXtpZighc3RhdGUucmVhZGluZyl7ZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtzdHJlYW0ucmVhZCgwKTt9CnN0YXRlLnJlc3VtZVNjaGVkdWxlZD1mYWxzZTtzdGF0ZS5hd2FpdERyYWluPTA7c3RyZWFtLmVtaXQoJ3Jlc3VtZScpO2Zsb3coc3RyZWFtKTtpZihzdGF0ZS5mbG93aW5nJiYhc3RhdGUucmVhZGluZylzdHJlYW0ucmVhZCgwKTt9ClJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe2RlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7aWYoZmFsc2UhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpe2RlYnVnKCdwYXVzZScpO3RoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz1mYWxzZTt0aGlzLmVtaXQoJ3BhdXNlJyk7fQpyZXR1cm4gdGhpczt9O2Z1bmN0aW9uIGZsb3coc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCdmbG93JyxzdGF0ZS5mbG93aW5nKTt3aGlsZShzdGF0ZS5mbG93aW5nJiZzdHJlYW0ucmVhZCgpIT09bnVsbCl7fX0KUmVhZGFibGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oc3RyZWFtKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTt2YXIgcGF1c2VkPWZhbHNlO3ZhciBzZWxmPXRoaXM7c3RyZWFtLm9uKCdlbmQnLGZ1bmN0aW9uKCl7ZGVidWcoJ3dyYXBwZWQgZW5kJyk7aWYoc3RhdGUuZGVjb2RlciYmIXN0YXRlLmVuZGVkKXt2YXIgY2h1bms9c3RhdGUuZGVjb2Rlci5lbmQoKTtpZihjaHVuayYmY2h1bmsubGVuZ3RoKXNlbGYucHVzaChjaHVuayk7fQpzZWxmLnB1c2gobnVsbCk7fSk7c3RyZWFtLm9uKCdkYXRhJyxmdW5jdGlvbihjaHVuayl7ZGVidWcoJ3dyYXBwZWQgZGF0YScpO2lmKHN0YXRlLmRlY29kZXIpY2h1bms9c3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7aWYoc3RhdGUub2JqZWN0TW9kZSYmKGNodW5rPT09bnVsbHx8Y2h1bms9PT11bmRlZmluZWQpKXJldHVybjtlbHNlIGlmKCFzdGF0ZS5vYmplY3RNb2RlJiYoIWNodW5rfHwhY2h1bmsubGVuZ3RoKSlyZXR1cm47dmFyIHJldD1zZWxmLnB1c2goY2h1bmspO2lmKCFyZXQpe3BhdXNlZD10cnVlO3N0cmVhbS5wYXVzZSgpO319KTtmb3IodmFyIGkgaW4gc3RyZWFtKXtpZih0aGlzW2ldPT09dW5kZWZpbmVkJiZ0eXBlb2Ygc3RyZWFtW2ldPT09J2Z1bmN0aW9uJyl7dGhpc1tpXT1mdW5jdGlvbihtZXRob2Qpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sYXJndW1lbnRzKTt9O30oaSk7fX0KdmFyIGV2ZW50cz1bJ2Vycm9yJywnY2xvc2UnLCdkZXN0cm95JywncGF1c2UnLCdyZXN1bWUnXTtmb3JFYWNoKGV2ZW50cyxmdW5jdGlvbihldil7c3RyZWFtLm9uKGV2LHNlbGYuZW1pdC5iaW5kKHNlbGYsZXYpKTt9KTtzZWxmLl9yZWFkPWZ1bmN0aW9uKG4pe2RlYnVnKCd3cmFwcGVkIF9yZWFkJyxuKTtpZihwYXVzZWQpe3BhdXNlZD1mYWxzZTtzdHJlYW0ucmVzdW1lKCk7fX07cmV0dXJuIHNlbGY7fTtSZWFkYWJsZS5fZnJvbUxpc3Q9ZnJvbUxpc3Q7ZnVuY3Rpb24gZnJvbUxpc3QobixzdGF0ZSl7aWYoc3RhdGUubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgcmV0O2lmKHN0YXRlLm9iamVjdE1vZGUpcmV0PXN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYoIW58fG4+PXN0YXRlLmxlbmd0aCl7aWYoc3RhdGUuZGVjb2RlcilyZXQ9c3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYoc3RhdGUuYnVmZmVyLmxlbmd0aD09PTEpcmV0PXN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQ9c3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO3N0YXRlLmJ1ZmZlci5jbGVhcigpO31lbHNle3JldD1mcm9tTGlzdFBhcnRpYWwobixzdGF0ZS5idWZmZXIsc3RhdGUuZGVjb2Rlcik7fQpyZXR1cm4gcmV0O30KZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sbGlzdCxoYXNTdHJpbmdzKXt2YXIgcmV0O2lmKG48bGlzdC5oZWFkLmRhdGEubGVuZ3RoKXtyZXQ9bGlzdC5oZWFkLmRhdGEuc2xpY2UoMCxuKTtsaXN0LmhlYWQuZGF0YT1saXN0LmhlYWQuZGF0YS5zbGljZShuKTt9ZWxzZSBpZihuPT09bGlzdC5oZWFkLmRhdGEubGVuZ3RoKXtyZXQ9bGlzdC5zaGlmdCgpO31lbHNle3JldD1oYXNTdHJpbmdzP2NvcHlGcm9tQnVmZmVyU3RyaW5nKG4sbGlzdCk6Y29weUZyb21CdWZmZXIobixsaXN0KTt9CnJldHVybiByZXQ7fQpmdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLGxpc3Qpe3ZhciBwPWxpc3QuaGVhZDt2YXIgYz0xO3ZhciByZXQ9cC5kYXRhO24tPXJldC5sZW5ndGg7d2hpbGUocD1wLm5leHQpe3ZhciBzdHI9cC5kYXRhO3ZhciBuYj1uPnN0ci5sZW5ndGg/c3RyLmxlbmd0aDpuO2lmKG5iPT09c3RyLmxlbmd0aClyZXQrPXN0cjtlbHNlIHJldCs9c3RyLnNsaWNlKDAsbik7bi09bmI7aWYobj09PTApe2lmKG5iPT09c3RyLmxlbmd0aCl7KytjO2lmKHAubmV4dClsaXN0LmhlYWQ9cC5uZXh0O2Vsc2UgbGlzdC5oZWFkPWxpc3QudGFpbD1udWxsO31lbHNle2xpc3QuaGVhZD1wO3AuZGF0YT1zdHIuc2xpY2UobmIpO30KYnJlYWs7fQorK2M7fQpsaXN0Lmxlbmd0aC09YztyZXR1cm4gcmV0O30KZnVuY3Rpb24gY29weUZyb21CdWZmZXIobixsaXN0KXt2YXIgcmV0PWJ1ZmZlclNoaW0uYWxsb2NVbnNhZmUobik7dmFyIHA9bGlzdC5oZWFkO3ZhciBjPTE7cC5kYXRhLmNvcHkocmV0KTtuLT1wLmRhdGEubGVuZ3RoO3doaWxlKHA9cC5uZXh0KXt2YXIgYnVmPXAuZGF0YTt2YXIgbmI9bj5idWYubGVuZ3RoP2J1Zi5sZW5ndGg6bjtidWYuY29weShyZXQscmV0Lmxlbmd0aC1uLDAsbmIpO24tPW5iO2lmKG49PT0wKXtpZihuYj09PWJ1Zi5sZW5ndGgpeysrYztpZihwLm5leHQpbGlzdC5oZWFkPXAubmV4dDtlbHNlIGxpc3QuaGVhZD1saXN0LnRhaWw9bnVsbDt9ZWxzZXtsaXN0LmhlYWQ9cDtwLmRhdGE9YnVmLnNsaWNlKG5iKTt9CmJyZWFrO30KKytjO30KbGlzdC5sZW5ndGgtPWM7cmV0dXJuIHJldDt9CmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSl7dmFyIHN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtpZihzdGF0ZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO2lmKCFzdGF0ZS5lbmRFbWl0dGVkKXtzdGF0ZS5lbmRlZD10cnVlO3Byb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULHN0YXRlLHN0cmVhbSk7fX0KZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSxzdHJlYW0pe2lmKCFzdGF0ZS5lbmRFbWl0dGVkJiZzdGF0ZS5sZW5ndGg9PT0wKXtzdGF0ZS5lbmRFbWl0dGVkPXRydWU7c3RyZWFtLnJlYWRhYmxlPWZhbHNlO3N0cmVhbS5lbWl0KCdlbmQnKTt9fQpmdW5jdGlvbiBmb3JFYWNoKHhzLGYpe2Zvcih2YXIgaT0wLGw9eHMubGVuZ3RoO2k8bDtpKyspe2YoeHNbaV0saSk7fX0KZnVuY3Rpb24gaW5kZXhPZih4cyx4KXtmb3IodmFyIGk9MCxsPXhzLmxlbmd0aDtpPGw7aSsrKXtpZih4c1tpXT09PXgpcmV0dXJuIGk7fQpyZXR1cm4tMTt9fSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpO30seyIuL19zdHJlYW1fZHVwbGV4Ijo4MiwiLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QiOjg3LCJfcHJvY2VzcyI6NzcsImJ1ZmZlciI6NjAsImJ1ZmZlci1zaGltcyI6NTksImNvcmUtdXRpbC1pcyI6NjEsImV2ZW50cyI6NjIsImluaGVyaXRzIjo2NCwiaXNhcnJheSI6NjYsInByb2Nlc3MtbmV4dGljay1hcmdzIjo3Niwic3RyaW5nX2RlY29kZXIvIjo5MywidXRpbCI6NTV9XSw4NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO21vZHVsZS5leHBvcnRzPVRyYW5zZm9ybTt2YXIgRHVwbGV4PXJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTt2YXIgdXRpbD1yZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTt1dGlsLmluaGVyaXRzPXJlcXVpcmUoJ2luaGVyaXRzJyk7dXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sRHVwbGV4KTtmdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShzdHJlYW0pe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZXIsZGF0YSl7cmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSxlcixkYXRhKTt9O3RoaXMubmVlZFRyYW5zZm9ybT1mYWxzZTt0aGlzLnRyYW5zZm9ybWluZz1mYWxzZTt0aGlzLndyaXRlY2I9bnVsbDt0aGlzLndyaXRlY2h1bms9bnVsbDt0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbDt9CmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSxlcixkYXRhKXt2YXIgdHM9c3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTt0cy50cmFuc2Zvcm1pbmc9ZmFsc2U7dmFyIGNiPXRzLndyaXRlY2I7aWYoIWNiKXJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7dHMud3JpdGVjaHVuaz1udWxsO3RzLndyaXRlY2I9bnVsbDtpZihkYXRhIT09bnVsbCYmZGF0YSE9PXVuZGVmaW5lZClzdHJlYW0ucHVzaChkYXRhKTtjYihlcik7dmFyIHJzPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtycy5yZWFkaW5nPWZhbHNlO2lmKHJzLm5lZWRSZWFkYWJsZXx8cnMubGVuZ3RoPHJzLmhpZ2hXYXRlck1hcmspe3N0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTt9fQpmdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSlyZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtEdXBsZXguY2FsbCh0aGlzLG9wdGlvbnMpO3RoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKTt2YXIgc3RyZWFtPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTt0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ZmFsc2U7aWYob3B0aW9ucyl7aWYodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtPT09J2Z1bmN0aW9uJyl0aGlzLl90cmFuc2Zvcm09b3B0aW9ucy50cmFuc2Zvcm07aWYodHlwZW9mIG9wdGlvbnMuZmx1c2g9PT0nZnVuY3Rpb24nKXRoaXMuX2ZsdXNoPW9wdGlvbnMuZmx1c2g7fQp0aGlzLm9uY2UoJ3ByZWZpbmlzaCcsZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5fZmx1c2g9PT0nZnVuY3Rpb24nKXRoaXMuX2ZsdXNoKGZ1bmN0aW9uKGVyLGRhdGEpe2RvbmUoc3RyZWFtLGVyLGRhdGEpO30pO2Vsc2UgZG9uZShzdHJlYW0pO30pO30KVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nKXt0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPWZhbHNlO3JldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLGNodW5rLGVuY29kaW5nKTt9O1RyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7fTtUcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHRzPXRoaXMuX3RyYW5zZm9ybVN0YXRlO3RzLndyaXRlY2I9Y2I7dHMud3JpdGVjaHVuaz1jaHVuazt0cy53cml0ZWVuY29kaW5nPWVuY29kaW5nO2lmKCF0cy50cmFuc2Zvcm1pbmcpe3ZhciBycz10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKHRzLm5lZWRUcmFuc2Zvcm18fHJzLm5lZWRSZWFkYWJsZXx8cnMubGVuZ3RoPHJzLmhpZ2hXYXRlck1hcmspdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTt9fTtUcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKG4pe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZih0cy53cml0ZWNodW5rIT09bnVsbCYmdHMud3JpdGVjYiYmIXRzLnRyYW5zZm9ybWluZyl7dHMudHJhbnNmb3JtaW5nPXRydWU7dGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssdHMud3JpdGVlbmNvZGluZyx0cy5hZnRlclRyYW5zZm9ybSk7fWVsc2V7dHMubmVlZFRyYW5zZm9ybT10cnVlO319O2Z1bmN0aW9uIGRvbmUoc3RyZWFtLGVyLGRhdGEpe2lmKGVyKXJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLGVyKTtpZihkYXRhIT09bnVsbCYmZGF0YSE9PXVuZGVmaW5lZClzdHJlYW0ucHVzaChkYXRhKTt2YXIgd3M9c3RyZWFtLl93cml0YWJsZVN0YXRlO3ZhciB0cz1zdHJlYW0uX3RyYW5zZm9ybVN0YXRlO2lmKHdzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO2lmKHRzLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtyZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7fX0seyIuL19zdHJlYW1fZHVwbGV4Ijo4MiwiY29yZS11dGlsLWlzIjo2MSwiaW5oZXJpdHMiOjY0fV0sODY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXsndXNlIHN0cmljdCc7bW9kdWxlLmV4cG9ydHM9V3JpdGFibGU7dmFyIHByb2Nlc3NOZXh0VGljaz1yZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO3ZhciBhc3luY1dyaXRlPSFwcm9jZXNzLmJyb3dzZXImJlsndjAuMTAnLCd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsNSkpPi0xP3NldEltbWVkaWF0ZTpwcm9jZXNzTmV4dFRpY2s7dmFyIER1cGxleDtXcml0YWJsZS5Xcml0YWJsZVN0YXRlPVdyaXRhYmxlU3RhdGU7dmFyIHV0aWw9cmVxdWlyZSgnY29yZS11dGlsLWlzJyk7dXRpbC5pbmhlcml0cz1yZXF1aXJlKCdpbmhlcml0cycpO3ZhciBpbnRlcm5hbFV0aWw9e2RlcHJlY2F0ZTpyZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpfTt2YXIgU3RyZWFtOyhmdW5jdGlvbigpe3RyeXtTdHJlYW09cmVxdWlyZSgnc3QnKydyZWFtJyk7fWNhdGNoKF8pe31maW5hbGx5e2lmKCFTdHJlYW0pU3RyZWFtPXJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjt9fSkoKTt2YXIgQnVmZmVyPXJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjt2YXIgYnVmZmVyU2hpbT1yZXF1aXJlKCdidWZmZXItc2hpbXMnKTt1dGlsLmluaGVyaXRzKFdyaXRhYmxlLFN0cmVhbSk7ZnVuY3Rpb24gbm9wKCl7fQpmdW5jdGlvbiBXcml0ZVJlcShjaHVuayxlbmNvZGluZyxjYil7dGhpcy5jaHVuaz1jaHVuazt0aGlzLmVuY29kaW5nPWVuY29kaW5nO3RoaXMuY2FsbGJhY2s9Y2I7dGhpcy5uZXh0PW51bGw7fQpmdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsc3RyZWFtKXtEdXBsZXg9RHVwbGV4fHxyZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7b3B0aW9ucz1vcHRpb25zfHx7fTt0aGlzLm9iamVjdE1vZGU9ISFvcHRpb25zLm9iamVjdE1vZGU7aWYoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KXRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7dmFyIGh3bT1vcHRpb25zLmhpZ2hXYXRlck1hcms7dmFyIGRlZmF1bHRId209dGhpcy5vYmplY3RNb2RlPzE2OjE2KjEwMjQ7dGhpcy5oaWdoV2F0ZXJNYXJrPWh3bXx8aHdtPT09MD9od206ZGVmYXVsdEh3bTt0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcms7dGhpcy5uZWVkRHJhaW49ZmFsc2U7dGhpcy5lbmRpbmc9ZmFsc2U7dGhpcy5lbmRlZD1mYWxzZTt0aGlzLmZpbmlzaGVkPWZhbHNlO3ZhciBub0RlY29kZT1vcHRpb25zLmRlY29kZVN0cmluZ3M9PT1mYWxzZTt0aGlzLmRlY29kZVN0cmluZ3M9IW5vRGVjb2RlO3RoaXMuZGVmYXVsdEVuY29kaW5nPW9wdGlvbnMuZGVmYXVsdEVuY29kaW5nfHwndXRmOCc7dGhpcy5sZW5ndGg9MDt0aGlzLndyaXRpbmc9ZmFsc2U7dGhpcy5jb3JrZWQ9MDt0aGlzLnN5bmM9dHJ1ZTt0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ZmFsc2U7dGhpcy5vbndyaXRlPWZ1bmN0aW9uKGVyKXtvbndyaXRlKHN0cmVhbSxlcik7fTt0aGlzLndyaXRlY2I9bnVsbDt0aGlzLndyaXRlbGVuPTA7dGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbDt0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbDt0aGlzLnBlbmRpbmdjYj0wO3RoaXMucHJlZmluaXNoZWQ9ZmFsc2U7dGhpcy5lcnJvckVtaXR0ZWQ9ZmFsc2U7dGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wO3RoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO30KV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uIGdldEJ1ZmZlcigpe3ZhciBjdXJyZW50PXRoaXMuYnVmZmVyZWRSZXF1ZXN0O3ZhciBvdXQ9W107d2hpbGUoY3VycmVudCl7b3V0LnB1c2goY3VycmVudCk7Y3VycmVudD1jdXJyZW50Lm5leHQ7fQpyZXR1cm4gb3V0O307KGZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwnYnVmZmVyJyx7Z2V0OmludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTt9LCdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnKydpbnN0ZWFkLicpfSk7fWNhdGNoKF8pe319KSgpO3ZhciByZWFsSGFzSW5zdGFuY2U7aWYodHlwZW9mIFN5bWJvbD09PSdmdW5jdGlvbicmJlN5bWJvbC5oYXNJbnN0YW5jZSYmdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPT09J2Z1bmN0aW9uJyl7cmVhbEhhc0luc3RhbmNlPUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCl7aWYocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcyxvYmplY3QpKXJldHVybiB0cnVlO3JldHVybiBvYmplY3QmJm9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7fX0pO31lbHNle3JlYWxIYXNJbnN0YW5jZT1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO307fQpmdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKXtEdXBsZXg9RHVwbGV4fHxyZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7aWYoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLHRoaXMpJiYhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKXtyZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO30KdGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLHRoaXMpO3RoaXMud3JpdGFibGU9dHJ1ZTtpZihvcHRpb25zKXtpZih0eXBlb2Ygb3B0aW9ucy53cml0ZT09PSdmdW5jdGlvbicpdGhpcy5fd3JpdGU9b3B0aW9ucy53cml0ZTtpZih0eXBlb2Ygb3B0aW9ucy53cml0ZXY9PT0nZnVuY3Rpb24nKXRoaXMuX3dyaXRldj1vcHRpb25zLndyaXRldjt9ClN0cmVhbS5jYWxsKHRoaXMpO30KV3JpdGFibGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoJ2Vycm9yJyxuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7fTtmdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSxjYil7dmFyIGVyPW5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7c3RyZWFtLmVtaXQoJ2Vycm9yJyxlcik7cHJvY2Vzc05leHRUaWNrKGNiLGVyKTt9CmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLGNiKXt2YXIgdmFsaWQ9dHJ1ZTt2YXIgZXI9ZmFsc2U7aWYoY2h1bms9PT1udWxsKXtlcj1uZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO31lbHNlIGlmKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspJiZ0eXBlb2YgY2h1bmshPT0nc3RyaW5nJyYmY2h1bmshPT11bmRlZmluZWQmJiFzdGF0ZS5vYmplY3RNb2RlKXtlcj1uZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7fQppZihlcil7c3RyZWFtLmVtaXQoJ2Vycm9yJyxlcik7cHJvY2Vzc05leHRUaWNrKGNiLGVyKTt2YWxpZD1mYWxzZTt9CnJldHVybiB2YWxpZDt9CldyaXRhYmxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7dmFyIHJldD1mYWxzZTtpZih0eXBlb2YgZW5jb2Rpbmc9PT0nZnVuY3Rpb24nKXtjYj1lbmNvZGluZztlbmNvZGluZz1udWxsO30KaWYoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSllbmNvZGluZz0nYnVmZmVyJztlbHNlIGlmKCFlbmNvZGluZyllbmNvZGluZz1zdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7aWYodHlwZW9mIGNiIT09J2Z1bmN0aW9uJyljYj1ub3A7aWYoc3RhdGUuZW5kZWQpd3JpdGVBZnRlckVuZCh0aGlzLGNiKTtlbHNlIGlmKHZhbGlkQ2h1bmsodGhpcyxzdGF0ZSxjaHVuayxjYikpe3N0YXRlLnBlbmRpbmdjYisrO3JldD13cml0ZU9yQnVmZmVyKHRoaXMsc3RhdGUsY2h1bmssZW5jb2RpbmcsY2IpO30KcmV0dXJuIHJldDt9O1dyaXRhYmxlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7c3RhdGUuY29ya2VkKys7fTtXcml0YWJsZS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7aWYoc3RhdGUuY29ya2VkKXtzdGF0ZS5jb3JrZWQtLTtpZighc3RhdGUud3JpdGluZyYmIXN0YXRlLmNvcmtlZCYmIXN0YXRlLmZpbmlzaGVkJiYhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyYmc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KWNsZWFyQnVmZmVyKHRoaXMsc3RhdGUpO319O1dyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKXtpZih0eXBlb2YgZW5jb2Rpbmc9PT0nc3RyaW5nJyllbmNvZGluZz1lbmNvZGluZy50b0xvd2VyQ2FzZSgpO2lmKCEoWydoZXgnLCd1dGY4JywndXRmLTgnLCdhc2NpaScsJ2JpbmFyeScsJ2Jhc2U2NCcsJ3VjczInLCd1Y3MtMicsJ3V0ZjE2bGUnLCd1dGYtMTZsZScsJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nKycnKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJytlbmNvZGluZyk7dGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9ZW5jb2Rpbmc7cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSxjaHVuayxlbmNvZGluZyl7aWYoIXN0YXRlLm9iamVjdE1vZGUmJnN0YXRlLmRlY29kZVN0cmluZ3MhPT1mYWxzZSYmdHlwZW9mIGNodW5rPT09J3N0cmluZycpe2NodW5rPWJ1ZmZlclNoaW0uZnJvbShjaHVuayxlbmNvZGluZyk7fQpyZXR1cm4gY2h1bms7fQpmdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSxzdGF0ZSxjaHVuayxlbmNvZGluZyxjYil7Y2h1bms9ZGVjb2RlQ2h1bmsoc3RhdGUsY2h1bmssZW5jb2RpbmcpO2lmKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpZW5jb2Rpbmc9J2J1ZmZlcic7dmFyIGxlbj1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoO3N0YXRlLmxlbmd0aCs9bGVuO3ZhciByZXQ9c3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcms7aWYoIXJldClzdGF0ZS5uZWVkRHJhaW49dHJ1ZTtpZihzdGF0ZS53cml0aW5nfHxzdGF0ZS5jb3JrZWQpe3ZhciBsYXN0PXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7c3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgV3JpdGVSZXEoY2h1bmssZW5jb2RpbmcsY2IpO2lmKGxhc3Qpe2xhc3QubmV4dD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O31lbHNle3N0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O30Kc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTE7fWVsc2V7ZG9Xcml0ZShzdHJlYW0sc3RhdGUsZmFsc2UsbGVuLGNodW5rLGVuY29kaW5nLGNiKTt9CnJldHVybiByZXQ7fQpmdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSxzdGF0ZSx3cml0ZXYsbGVuLGNodW5rLGVuY29kaW5nLGNiKXtzdGF0ZS53cml0ZWxlbj1sZW47c3RhdGUud3JpdGVjYj1jYjtzdGF0ZS53cml0aW5nPXRydWU7c3RhdGUuc3luYz10cnVlO2lmKHdyaXRldilzdHJlYW0uX3dyaXRldihjaHVuayxzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssZW5jb2Rpbmcsc3RhdGUub253cml0ZSk7c3RhdGUuc3luYz1mYWxzZTt9CmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sc3RhdGUsc3luYyxlcixjYil7LS1zdGF0ZS5wZW5kaW5nY2I7aWYoc3luYylwcm9jZXNzTmV4dFRpY2soY2IsZXIpO2Vsc2UgY2IoZXIpO3N0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9dHJ1ZTtzdHJlYW0uZW1pdCgnZXJyb3InLGVyKTt9CmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSl7c3RhdGUud3JpdGluZz1mYWxzZTtzdGF0ZS53cml0ZWNiPW51bGw7c3RhdGUubGVuZ3RoLT1zdGF0ZS53cml0ZWxlbjtzdGF0ZS53cml0ZWxlbj0wO30KZnVuY3Rpb24gb253cml0ZShzdHJlYW0sZXIpe3ZhciBzdGF0ZT1zdHJlYW0uX3dyaXRhYmxlU3RhdGU7dmFyIHN5bmM9c3RhdGUuc3luYzt2YXIgY2I9c3RhdGUud3JpdGVjYjtvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO2lmKGVyKW9ud3JpdGVFcnJvcihzdHJlYW0sc3RhdGUsc3luYyxlcixjYik7ZWxzZXt2YXIgZmluaXNoZWQ9bmVlZEZpbmlzaChzdGF0ZSk7aWYoIWZpbmlzaGVkJiYhc3RhdGUuY29ya2VkJiYhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyYmc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KXtjbGVhckJ1ZmZlcihzdHJlYW0sc3RhdGUpO30KaWYoc3luYyl7YXN5bmNXcml0ZShhZnRlcldyaXRlLHN0cmVhbSxzdGF0ZSxmaW5pc2hlZCxjYik7fWVsc2V7YWZ0ZXJXcml0ZShzdHJlYW0sc3RhdGUsZmluaXNoZWQsY2IpO319fQpmdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSxzdGF0ZSxmaW5pc2hlZCxjYil7aWYoIWZpbmlzaGVkKW9ud3JpdGVEcmFpbihzdHJlYW0sc3RhdGUpO3N0YXRlLnBlbmRpbmdjYi0tO2NiKCk7ZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKTt9CmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sc3RhdGUpe2lmKHN0YXRlLmxlbmd0aD09PTAmJnN0YXRlLm5lZWREcmFpbil7c3RhdGUubmVlZERyYWluPWZhbHNlO3N0cmVhbS5lbWl0KCdkcmFpbicpO319CmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSxzdGF0ZSl7c3RhdGUuYnVmZmVyUHJvY2Vzc2luZz10cnVlO3ZhciBlbnRyeT1zdGF0ZS5idWZmZXJlZFJlcXVlc3Q7aWYoc3RyZWFtLl93cml0ZXYmJmVudHJ5JiZlbnRyeS5uZXh0KXt2YXIgbD1zdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDt2YXIgYnVmZmVyPW5ldyBBcnJheShsKTt2YXIgaG9sZGVyPXN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtob2xkZXIuZW50cnk9ZW50cnk7dmFyIGNvdW50PTA7d2hpbGUoZW50cnkpe2J1ZmZlcltjb3VudF09ZW50cnk7ZW50cnk9ZW50cnkubmV4dDtjb3VudCs9MTt9CmRvV3JpdGUoc3RyZWFtLHN0YXRlLHRydWUsc3RhdGUubGVuZ3RoLGJ1ZmZlciwnJyxob2xkZXIuZmluaXNoKTtzdGF0ZS5wZW5kaW5nY2IrKztzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGw7aWYoaG9sZGVyLm5leHQpe3N0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZT1ob2xkZXIubmV4dDtob2xkZXIubmV4dD1udWxsO31lbHNle3N0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7fX1lbHNle3doaWxlKGVudHJ5KXt2YXIgY2h1bms9ZW50cnkuY2h1bms7dmFyIGVuY29kaW5nPWVudHJ5LmVuY29kaW5nO3ZhciBjYj1lbnRyeS5jYWxsYmFjazt2YXIgbGVuPXN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGg7ZG9Xcml0ZShzdHJlYW0sc3RhdGUsZmFsc2UsbGVuLGNodW5rLGVuY29kaW5nLGNiKTtlbnRyeT1lbnRyeS5uZXh0O2lmKHN0YXRlLndyaXRpbmcpe2JyZWFrO319CmlmKGVudHJ5PT09bnVsbClzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGw7fQpzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wO3N0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1lbnRyeTtzdGF0ZS5idWZmZXJQcm9jZXNzaW5nPWZhbHNlO30KV3JpdGFibGUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7Y2IobmV3IEVycm9yKCdfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7fTtXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldj1udWxsO1dyaXRhYmxlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciBzdGF0ZT10aGlzLl93cml0YWJsZVN0YXRlO2lmKHR5cGVvZiBjaHVuaz09PSdmdW5jdGlvbicpe2NiPWNodW5rO2NodW5rPW51bGw7ZW5jb2Rpbmc9bnVsbDt9ZWxzZSBpZih0eXBlb2YgZW5jb2Rpbmc9PT0nZnVuY3Rpb24nKXtjYj1lbmNvZGluZztlbmNvZGluZz1udWxsO30KaWYoY2h1bmshPT1udWxsJiZjaHVuayE9PXVuZGVmaW5lZCl0aGlzLndyaXRlKGNodW5rLGVuY29kaW5nKTtpZihzdGF0ZS5jb3JrZWQpe3N0YXRlLmNvcmtlZD0xO3RoaXMudW5jb3JrKCk7fQppZighc3RhdGUuZW5kaW5nJiYhc3RhdGUuZmluaXNoZWQpZW5kV3JpdGFibGUodGhpcyxzdGF0ZSxjYik7fTtmdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKXtyZXR1cm4gc3RhdGUuZW5kaW5nJiZzdGF0ZS5sZW5ndGg9PT0wJiZzdGF0ZS5idWZmZXJlZFJlcXVlc3Q9PT1udWxsJiYhc3RhdGUuZmluaXNoZWQmJiFzdGF0ZS53cml0aW5nO30KZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnByZWZpbmlzaGVkKXtzdGF0ZS5wcmVmaW5pc2hlZD10cnVlO3N0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTt9fQpmdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpe3ZhciBuZWVkPW5lZWRGaW5pc2goc3RhdGUpO2lmKG5lZWQpe2lmKHN0YXRlLnBlbmRpbmdjYj09PTApe3ByZWZpbmlzaChzdHJlYW0sc3RhdGUpO3N0YXRlLmZpbmlzaGVkPXRydWU7c3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO31lbHNle3ByZWZpbmlzaChzdHJlYW0sc3RhdGUpO319CnJldHVybiBuZWVkO30KZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLHN0YXRlLGNiKXtzdGF0ZS5lbmRpbmc9dHJ1ZTtmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpO2lmKGNiKXtpZihzdGF0ZS5maW5pc2hlZClwcm9jZXNzTmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsY2IpO30Kc3RhdGUuZW5kZWQ9dHJ1ZTtzdHJlYW0ud3JpdGFibGU9ZmFsc2U7fQpmdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKXt2YXIgX3RoaXM9dGhpczt0aGlzLm5leHQ9bnVsbDt0aGlzLmVudHJ5PW51bGw7dGhpcy5maW5pc2g9ZnVuY3Rpb24oZXJyKXt2YXIgZW50cnk9X3RoaXMuZW50cnk7X3RoaXMuZW50cnk9bnVsbDt3aGlsZShlbnRyeSl7dmFyIGNiPWVudHJ5LmNhbGxiYWNrO3N0YXRlLnBlbmRpbmdjYi0tO2NiKGVycik7ZW50cnk9ZW50cnkubmV4dDt9CmlmKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSl7c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9X3RoaXM7fWVsc2V7c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlPV90aGlzO319O319KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSk7fSx7Ii4vX3N0cmVhbV9kdXBsZXgiOjgyLCJfcHJvY2VzcyI6NzcsImJ1ZmZlciI6NjAsImJ1ZmZlci1zaGltcyI6NTksImNvcmUtdXRpbC1pcyI6NjEsImV2ZW50cyI6NjIsImluaGVyaXRzIjo2NCwicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOjc2LCJ1dGlsLWRlcHJlY2F0ZSI6OTR9XSw4NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO3ZhciBCdWZmZXI9cmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO3ZhciBidWZmZXJTaGltPXJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO21vZHVsZS5leHBvcnRzPUJ1ZmZlckxpc3Q7ZnVuY3Rpb24gQnVmZmVyTGlzdCgpe3RoaXMuaGVhZD1udWxsO3RoaXMudGFpbD1udWxsO3RoaXMubGVuZ3RoPTA7fQpCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHYpe3ZhciBlbnRyeT17ZGF0YTp2LG5leHQ6bnVsbH07aWYodGhpcy5sZW5ndGg+MCl0aGlzLnRhaWwubmV4dD1lbnRyeTtlbHNlIHRoaXMuaGVhZD1lbnRyeTt0aGlzLnRhaWw9ZW50cnk7Kyt0aGlzLmxlbmd0aDt9O0J1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odil7dmFyIGVudHJ5PXtkYXRhOnYsbmV4dDp0aGlzLmhlYWR9O2lmKHRoaXMubGVuZ3RoPT09MCl0aGlzLnRhaWw9ZW50cnk7dGhpcy5oZWFkPWVudHJ5OysrdGhpcy5sZW5ndGg7fTtCdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm47dmFyIHJldD10aGlzLmhlYWQuZGF0YTtpZih0aGlzLmxlbmd0aD09PTEpdGhpcy5oZWFkPXRoaXMudGFpbD1udWxsO2Vsc2UgdGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0Oy0tdGhpcy5sZW5ndGg7cmV0dXJuIHJldDt9O0J1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsO3RoaXMubGVuZ3RoPTA7fTtCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHMpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm4nJzt2YXIgcD10aGlzLmhlYWQ7dmFyIHJldD0nJytwLmRhdGE7d2hpbGUocD1wLm5leHQpe3JldCs9cytwLmRhdGE7fXJldHVybiByZXQ7fTtCdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24obil7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVybiBidWZmZXJTaGltLmFsbG9jKDApO2lmKHRoaXMubGVuZ3RoPT09MSlyZXR1cm4gdGhpcy5oZWFkLmRhdGE7dmFyIHJldD1idWZmZXJTaGltLmFsbG9jVW5zYWZlKG4+Pj4wKTt2YXIgcD10aGlzLmhlYWQ7dmFyIGk9MDt3aGlsZShwKXtwLmRhdGEuY29weShyZXQsaSk7aSs9cC5kYXRhLmxlbmd0aDtwPXAubmV4dDt9CnJldHVybiByZXQ7fTt9LHsiYnVmZmVyIjo2MCwiYnVmZmVyLXNoaW1zIjo1OX1dLDg4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKCIuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIik7fSx7Ii4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiOjgzfV0sODk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXt2YXIgU3RyZWFtPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiByZXF1aXJlKCdzdCcrJ3JlYW0nKTt9Y2F0Y2goXyl7fX0oKTtleHBvcnRzPW1vZHVsZS5leHBvcnRzPXJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtleHBvcnRzLlN0cmVhbT1TdHJlYW18fGV4cG9ydHM7ZXhwb3J0cy5SZWFkYWJsZT1leHBvcnRzO2V4cG9ydHMuV3JpdGFibGU9cmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO2V4cG9ydHMuRHVwbGV4PXJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7ZXhwb3J0cy5UcmFuc2Zvcm09cmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtleHBvcnRzLlBhc3NUaHJvdWdoPXJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtpZighcHJvY2Vzcy5icm93c2VyJiZwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU09PT0nZGlzYWJsZScmJlN0cmVhbSl7bW9kdWxlLmV4cG9ydHM9U3RyZWFtO319KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSk7fSx7Ii4vbGliL19zdHJlYW1fZHVwbGV4LmpzIjo4MiwiLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyI6ODMsIi4vbGliL19zdHJlYW1fcmVhZGFibGUuanMiOjg0LCIuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyI6ODUsIi4vbGliL19zdHJlYW1fd3JpdGFibGUuanMiOjg2LCJfcHJvY2VzcyI6Nzd9XSw5MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgiLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKTt9LHsiLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiOjg1fV0sOTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoIi4vbGliL19zdHJlYW1fd3JpdGFibGUuanMiKTt9LHsiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcyI6ODZ9XSw5MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9U3RyZWFtO3ZhciBFRT1yZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7dmFyIGluaGVyaXRzPXJlcXVpcmUoJ2luaGVyaXRzJyk7aW5oZXJpdHMoU3RyZWFtLEVFKTtTdHJlYW0uUmVhZGFibGU9cmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJyk7U3RyZWFtLldyaXRhYmxlPXJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcycpO1N0cmVhbS5EdXBsZXg9cmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1N0cmVhbS5UcmFuc2Zvcm09cmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcycpO1N0cmVhbS5QYXNzVGhyb3VnaD1yZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMnKTtTdHJlYW0uU3RyZWFtPVN0cmVhbTtmdW5jdGlvbiBTdHJlYW0oKXtFRS5jYWxsKHRoaXMpO30KU3RyZWFtLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKGRlc3Qsb3B0aW9ucyl7dmFyIHNvdXJjZT10aGlzO2Z1bmN0aW9uIG9uZGF0YShjaHVuayl7aWYoZGVzdC53cml0YWJsZSl7aWYoZmFsc2U9PT1kZXN0LndyaXRlKGNodW5rKSYmc291cmNlLnBhdXNlKXtzb3VyY2UucGF1c2UoKTt9fX0Kc291cmNlLm9uKCdkYXRhJyxvbmRhdGEpO2Z1bmN0aW9uIG9uZHJhaW4oKXtpZihzb3VyY2UucmVhZGFibGUmJnNvdXJjZS5yZXN1bWUpe3NvdXJjZS5yZXN1bWUoKTt9fQpkZXN0Lm9uKCdkcmFpbicsb25kcmFpbik7aWYoIWRlc3QuX2lzU3RkaW8mJighb3B0aW9uc3x8b3B0aW9ucy5lbmQhPT1mYWxzZSkpe3NvdXJjZS5vbignZW5kJyxvbmVuZCk7c291cmNlLm9uKCdjbG9zZScsb25jbG9zZSk7fQp2YXIgZGlkT25FbmQ9ZmFsc2U7ZnVuY3Rpb24gb25lbmQoKXtpZihkaWRPbkVuZClyZXR1cm47ZGlkT25FbmQ9dHJ1ZTtkZXN0LmVuZCgpO30KZnVuY3Rpb24gb25jbG9zZSgpe2lmKGRpZE9uRW5kKXJldHVybjtkaWRPbkVuZD10cnVlO2lmKHR5cGVvZiBkZXN0LmRlc3Ryb3k9PT0nZnVuY3Rpb24nKWRlc3QuZGVzdHJveSgpO30KZnVuY3Rpb24gb25lcnJvcihlcil7Y2xlYW51cCgpO2lmKEVFLmxpc3RlbmVyQ291bnQodGhpcywnZXJyb3InKT09PTApe3Rocm93IGVyO319CnNvdXJjZS5vbignZXJyb3InLG9uZXJyb3IpO2Rlc3Qub24oJ2Vycm9yJyxvbmVycm9yKTtmdW5jdGlvbiBjbGVhbnVwKCl7c291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJyxvbmRhdGEpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJyxvbmRyYWluKTtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsb25lbmQpO3NvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLG9uY2xvc2UpO3NvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLG9uZXJyb3IpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJyxvbmVycm9yKTtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsY2xlYW51cCk7c291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsY2xlYW51cCk7ZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLGNsZWFudXApO30Kc291cmNlLm9uKCdlbmQnLGNsZWFudXApO3NvdXJjZS5vbignY2xvc2UnLGNsZWFudXApO2Rlc3Qub24oJ2Nsb3NlJyxjbGVhbnVwKTtkZXN0LmVtaXQoJ3BpcGUnLHNvdXJjZSk7cmV0dXJuIGRlc3Q7fTt9LHsiZXZlbnRzIjo2MiwiaW5oZXJpdHMiOjY0LCJyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzIjo4MSwicmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzIjo4OCwicmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIjo4OSwicmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyI6OTAsInJlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcyI6OTF9XSw5MzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIEJ1ZmZlcj1yZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7dmFyIGlzQnVmZmVyRW5jb2Rpbmc9QnVmZmVyLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKGVuY29kaW5nKXtzd2l0Y2goZW5jb2RpbmcmJmVuY29kaW5nLnRvTG93ZXJDYXNlKCkpe2Nhc2UnaGV4JzpjYXNlJ3V0ZjgnOmNhc2UndXRmLTgnOmNhc2UnYXNjaWknOmNhc2UnYmluYXJ5JzpjYXNlJ2Jhc2U2NCc6Y2FzZSd1Y3MyJzpjYXNlJ3Vjcy0yJzpjYXNlJ3V0ZjE2bGUnOmNhc2UndXRmLTE2bGUnOmNhc2UncmF3JzpyZXR1cm4gdHJ1ZTtkZWZhdWx0OnJldHVybiBmYWxzZTt9fTtmdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyl7aWYoZW5jb2RpbmcmJiFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSl7dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnK2VuY29kaW5nKTt9fQp2YXIgU3RyaW5nRGVjb2Rlcj1leHBvcnRzLlN0cmluZ0RlY29kZXI9ZnVuY3Rpb24oZW5jb2Rpbmcpe3RoaXMuZW5jb2Rpbmc9KGVuY29kaW5nfHwndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sJycpO2Fzc2VydEVuY29kaW5nKGVuY29kaW5nKTtzd2l0Y2godGhpcy5lbmNvZGluZyl7Y2FzZSd1dGY4Jzp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlJ3VjczInOmNhc2UndXRmMTZsZSc6dGhpcy5zdXJyb2dhdGVTaXplPTI7dGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj11dGYxNkRldGVjdEluY29tcGxldGVDaGFyO2JyZWFrO2Nhc2UnYmFzZTY0Jzp0aGlzLnN1cnJvZ2F0ZVNpemU9Mzt0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO2JyZWFrO2RlZmF1bHQ6dGhpcy53cml0ZT1wYXNzVGhyb3VnaFdyaXRlO3JldHVybjt9CnRoaXMuY2hhckJ1ZmZlcj1uZXcgQnVmZmVyKDYpO3RoaXMuY2hhclJlY2VpdmVkPTA7dGhpcy5jaGFyTGVuZ3RoPTA7fTtTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihidWZmZXIpe3ZhciBjaGFyU3RyPScnO3doaWxlKHRoaXMuY2hhckxlbmd0aCl7dmFyIGF2YWlsYWJsZT1idWZmZXIubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOmJ1ZmZlci5sZW5ndGg7YnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsYXZhaWxhYmxlKTt0aGlzLmNoYXJSZWNlaXZlZCs9YXZhaWxhYmxlO2lmKHRoaXMuY2hhclJlY2VpdmVkPHRoaXMuY2hhckxlbmd0aCl7cmV0dXJuJyc7fQpidWZmZXI9YnVmZmVyLnNsaWNlKGF2YWlsYWJsZSxidWZmZXIubGVuZ3RoKTtjaGFyU3RyPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7dmFyIGNoYXJDb2RlPWNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aC0xKTtpZihjaGFyQ29kZT49MHhEODAwJiZjaGFyQ29kZTw9MHhEQkZGKXt0aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZTtjaGFyU3RyPScnO2NvbnRpbnVlO30KdGhpcy5jaGFyUmVjZWl2ZWQ9dGhpcy5jaGFyTGVuZ3RoPTA7aWYoYnVmZmVyLmxlbmd0aD09PTApe3JldHVybiBjaGFyU3RyO30KYnJlYWs7fQp0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7dmFyIGVuZD1idWZmZXIubGVuZ3RoO2lmKHRoaXMuY2hhckxlbmd0aCl7YnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsYnVmZmVyLmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxlbmQpO2VuZC09dGhpcy5jaGFyUmVjZWl2ZWQ7fQpjaGFyU3RyKz1idWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLGVuZCk7dmFyIGVuZD1jaGFyU3RyLmxlbmd0aC0xO3ZhciBjaGFyQ29kZT1jaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTtpZihjaGFyQ29kZT49MHhEODAwJiZjaGFyQ29kZTw9MHhEQkZGKXt2YXIgc2l6ZT10aGlzLnN1cnJvZ2F0ZVNpemU7dGhpcy5jaGFyTGVuZ3RoKz1zaXplO3RoaXMuY2hhclJlY2VpdmVkKz1zaXplO3RoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlcixzaXplLDAsc2l6ZSk7YnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxzaXplKTtyZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCxlbmQpO30KcmV0dXJuIGNoYXJTdHI7fTtTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbihidWZmZXIpe3ZhciBpPWJ1ZmZlci5sZW5ndGg+PTM/MzpidWZmZXIubGVuZ3RoO2Zvcig7aT4wO2ktLSl7dmFyIGM9YnVmZmVyW2J1ZmZlci5sZW5ndGgtaV07aWYoaT09MSYmYz4+NT09MHgwNil7dGhpcy5jaGFyTGVuZ3RoPTI7YnJlYWs7fQppZihpPD0yJiZjPj40PT0weDBFKXt0aGlzLmNoYXJMZW5ndGg9MzticmVhazt9CmlmKGk8PTMmJmM+PjM9PTB4MUUpe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrO319CnRoaXMuY2hhclJlY2VpdmVkPWk7fTtTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oYnVmZmVyKXt2YXIgcmVzPScnO2lmKGJ1ZmZlciYmYnVmZmVyLmxlbmd0aCkKcmVzPXRoaXMud3JpdGUoYnVmZmVyKTtpZih0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIGNyPXRoaXMuY2hhclJlY2VpdmVkO3ZhciBidWY9dGhpcy5jaGFyQnVmZmVyO3ZhciBlbmM9dGhpcy5lbmNvZGluZztyZXMrPWJ1Zi5zbGljZSgwLGNyKS50b1N0cmluZyhlbmMpO30KcmV0dXJuIHJlczt9O2Z1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKXtyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO30KZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpe3RoaXMuY2hhclJlY2VpdmVkPWJ1ZmZlci5sZW5ndGglMjt0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowO30KZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKXt0aGlzLmNoYXJSZWNlaXZlZD1idWZmZXIubGVuZ3RoJTM7dGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MDt9fSx7ImJ1ZmZlciI6NjB9XSw5NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7bW9kdWxlLmV4cG9ydHM9ZGVwcmVjYXRlO2Z1bmN0aW9uIGRlcHJlY2F0ZShmbixtc2cpe2lmKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKXtyZXR1cm4gZm47fQp2YXIgd2FybmVkPWZhbHNlO2Z1bmN0aW9uIGRlcHJlY2F0ZWQoKXtpZighd2FybmVkKXtpZihjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSl7dGhyb3cgbmV3IEVycm9yKG1zZyk7fWVsc2UgaWYoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpe2NvbnNvbGUudHJhY2UobXNnKTt9ZWxzZXtjb25zb2xlLndhcm4obXNnKTt9Cndhcm5lZD10cnVlO30KcmV0dXJuIGZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9CnJldHVybiBkZXByZWNhdGVkO30KZnVuY3Rpb24gY29uZmlnKG5hbWUpe3RyeXtpZighZ2xvYmFsLmxvY2FsU3RvcmFnZSlyZXR1cm4gZmFsc2U7fWNhdGNoKF8pe3JldHVybiBmYWxzZTt9CnZhciB2YWw9Z2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtpZihudWxsPT12YWwpcmV0dXJuIGZhbHNlO3JldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpPT09J3RydWUnO319KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7fV0sOTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe2FyZ3VtZW50c1s0XVs2NF1bMF0uYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO30seyJkdXAiOjY0fV0sOTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGlzQnVmZmVyKGFyZyl7cmV0dXJuIGFyZyYmdHlwZW9mIGFyZz09PSdvYmplY3QnJiZ0eXBlb2YgYXJnLmNvcHk9PT0nZnVuY3Rpb24nJiZ0eXBlb2YgYXJnLmZpbGw9PT0nZnVuY3Rpb24nJiZ0eXBlb2YgYXJnLnJlYWRVSW50OD09PSdmdW5jdGlvbic7fTt9LHt9XSw5NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3MsZ2xvYmFsKXt2YXIgZm9ybWF0UmVnRXhwPS8lW3NkaiVdL2c7ZXhwb3J0cy5mb3JtYXQ9ZnVuY3Rpb24oZil7aWYoIWlzU3RyaW5nKGYpKXt2YXIgb2JqZWN0cz1bXTtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXtvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTt9CnJldHVybiBvYmplY3RzLmpvaW4oJyAnKTt9CnZhciBpPTE7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBsZW49YXJncy5sZW5ndGg7dmFyIHN0cj1TdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsZnVuY3Rpb24oeCl7aWYoeD09PSclJScpcmV0dXJuJyUnO2lmKGk+PWxlbilyZXR1cm4geDtzd2l0Y2goeCl7Y2FzZSclcyc6cmV0dXJuIFN0cmluZyhhcmdzW2krK10pO2Nhc2UnJWQnOnJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtjYXNlJyVqJzp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7fWNhdGNoKF8pe3JldHVybidbQ2lyY3VsYXJdJzt9CmRlZmF1bHQ6cmV0dXJuIHg7fX0pO2Zvcih2YXIgeD1hcmdzW2ldO2k8bGVuO3g9YXJnc1srK2ldKXtpZihpc051bGwoeCl8fCFpc09iamVjdCh4KSl7c3RyKz0nICcreDt9ZWxzZXtzdHIrPScgJytpbnNwZWN0KHgpO319CnJldHVybiBzdHI7fTtleHBvcnRzLmRlcHJlY2F0ZT1mdW5jdGlvbihmbixtc2cpe2lmKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLG1zZykuYXBwbHkodGhpcyxhcmd1bWVudHMpO307fQppZihwcm9jZXNzLm5vRGVwcmVjYXRpb249PT10cnVlKXtyZXR1cm4gZm47fQp2YXIgd2FybmVkPWZhbHNlO2Z1bmN0aW9uIGRlcHJlY2F0ZWQoKXtpZighd2FybmVkKXtpZihwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pe3Rocm93IG5ldyBFcnJvcihtc2cpO31lbHNlIGlmKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbil7Y29uc29sZS50cmFjZShtc2cpO31lbHNle2NvbnNvbGUuZXJyb3IobXNnKTt9Cndhcm5lZD10cnVlO30KcmV0dXJuIGZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9CnJldHVybiBkZXByZWNhdGVkO307dmFyIGRlYnVncz17fTt2YXIgZGVidWdFbnZpcm9uO2V4cG9ydHMuZGVidWdsb2c9ZnVuY3Rpb24oc2V0KXtpZihpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKQpkZWJ1Z0Vudmlyb249cHJvY2Vzcy5lbnYuTk9ERV9ERUJVR3x8Jyc7c2V0PXNldC50b1VwcGVyQ2FzZSgpO2lmKCFkZWJ1Z3Nbc2V0XSl7aWYobmV3IFJlZ0V4cCgnXFxiJytzZXQrJ1xcYicsJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpe3ZhciBwaWQ9cHJvY2Vzcy5waWQ7ZGVidWdzW3NldF09ZnVuY3Rpb24oKXt2YXIgbXNnPWV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLHNldCxwaWQsbXNnKTt9O31lbHNle2RlYnVnc1tzZXRdPWZ1bmN0aW9uKCl7fTt9fQpyZXR1cm4gZGVidWdzW3NldF07fTtmdW5jdGlvbiBpbnNwZWN0KG9iaixvcHRzKXt2YXIgY3R4PXtzZWVuOltdLHN0eWxpemU6c3R5bGl6ZU5vQ29sb3J9O2lmKGFyZ3VtZW50cy5sZW5ndGg+PTMpY3R4LmRlcHRoPWFyZ3VtZW50c1syXTtpZihhcmd1bWVudHMubGVuZ3RoPj00KWN0eC5jb2xvcnM9YXJndW1lbnRzWzNdO2lmKGlzQm9vbGVhbihvcHRzKSl7Y3R4LnNob3dIaWRkZW49b3B0czt9ZWxzZSBpZihvcHRzKXtleHBvcnRzLl9leHRlbmQoY3R4LG9wdHMpO30KaWYoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKWN0eC5zaG93SGlkZGVuPWZhbHNlO2lmKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpY3R4LmRlcHRoPTI7aWYoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpY3R4LmNvbG9ycz1mYWxzZTtpZihpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpY3R4LmN1c3RvbUluc3BlY3Q9dHJ1ZTtpZihjdHguY29sb3JzKWN0eC5zdHlsaXplPXN0eWxpemVXaXRoQ29sb3I7cmV0dXJuIGZvcm1hdFZhbHVlKGN0eCxvYmosY3R4LmRlcHRoKTt9CmV4cG9ydHMuaW5zcGVjdD1pbnNwZWN0O2luc3BlY3QuY29sb3JzPXsnYm9sZCc6WzEsMjJdLCdpdGFsaWMnOlszLDIzXSwndW5kZXJsaW5lJzpbNCwyNF0sJ2ludmVyc2UnOls3LDI3XSwnd2hpdGUnOlszNywzOV0sJ2dyZXknOls5MCwzOV0sJ2JsYWNrJzpbMzAsMzldLCdibHVlJzpbMzQsMzldLCdjeWFuJzpbMzYsMzldLCdncmVlbic6WzMyLDM5XSwnbWFnZW50YSc6WzM1LDM5XSwncmVkJzpbMzEsMzldLCd5ZWxsb3cnOlszMywzOV19O2luc3BlY3Quc3R5bGVzPXsnc3BlY2lhbCc6J2N5YW4nLCdudW1iZXInOid5ZWxsb3cnLCdib29sZWFuJzoneWVsbG93JywndW5kZWZpbmVkJzonZ3JleScsJ251bGwnOidib2xkJywnc3RyaW5nJzonZ3JlZW4nLCdkYXRlJzonbWFnZW50YScsJ3JlZ2V4cCc6J3JlZCd9O2Z1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLHN0eWxlVHlwZSl7dmFyIHN0eWxlPWluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07aWYoc3R5bGUpe3JldHVybidcdTAwMWJbJytpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0rJ20nK3N0cisnXHUwMDFiWycraW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdKydtJzt9ZWxzZXtyZXR1cm4gc3RyO319CmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0cixzdHlsZVR5cGUpe3JldHVybiBzdHI7fQpmdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSl7dmFyIGhhc2g9e307YXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsaWR4KXtoYXNoW3ZhbF09dHJ1ZTt9KTtyZXR1cm4gaGFzaDt9CmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMpe2lmKGN0eC5jdXN0b21JbnNwZWN0JiZ2YWx1ZSYmaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSYmdmFsdWUuaW5zcGVjdCE9PWV4cG9ydHMuaW5zcGVjdCYmISh2YWx1ZS5jb25zdHJ1Y3RvciYmdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlPT09dmFsdWUpKXt2YXIgcmV0PXZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLGN0eCk7aWYoIWlzU3RyaW5nKHJldCkpe3JldD1mb3JtYXRWYWx1ZShjdHgscmV0LHJlY3Vyc2VUaW1lcyk7fQpyZXR1cm4gcmV0O30KdmFyIHByaW1pdGl2ZT1mb3JtYXRQcmltaXRpdmUoY3R4LHZhbHVlKTtpZihwcmltaXRpdmUpe3JldHVybiBwcmltaXRpdmU7fQp2YXIga2V5cz1PYmplY3Qua2V5cyh2YWx1ZSk7dmFyIHZpc2libGVLZXlzPWFycmF5VG9IYXNoKGtleXMpO2lmKGN0eC5zaG93SGlkZGVuKXtrZXlzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTt9CmlmKGlzRXJyb3IodmFsdWUpJiYoa2V5cy5pbmRleE9mKCdtZXNzYWdlJyk+PTB8fGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKT49MCkpe3JldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7fQppZihrZXlzLmxlbmd0aD09PTApe2lmKGlzRnVuY3Rpb24odmFsdWUpKXt2YXIgbmFtZT12YWx1ZS5uYW1lPyc6ICcrdmFsdWUubmFtZTonJztyZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicrbmFtZSsnXScsJ3NwZWNpYWwnKTt9CmlmKGlzUmVnRXhwKHZhbHVlKSl7cmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksJ3JlZ2V4cCcpO30KaWYoaXNEYXRlKHZhbHVlKSl7cmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCdkYXRlJyk7fQppZihpc0Vycm9yKHZhbHVlKSl7cmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTt9fQp2YXIgYmFzZT0nJyxhcnJheT1mYWxzZSxicmFjZXM9Wyd7JywnfSddO2lmKGlzQXJyYXkodmFsdWUpKXthcnJheT10cnVlO2JyYWNlcz1bJ1snLCddJ107fQppZihpc0Z1bmN0aW9uKHZhbHVlKSl7dmFyIG49dmFsdWUubmFtZT8nOiAnK3ZhbHVlLm5hbWU6Jyc7YmFzZT0nIFtGdW5jdGlvbicrbisnXSc7fQppZihpc1JlZ0V4cCh2YWx1ZSkpe2Jhc2U9JyAnK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7fQppZihpc0RhdGUodmFsdWUpKXtiYXNlPScgJytEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTt9CmlmKGlzRXJyb3IodmFsdWUpKXtiYXNlPScgJytmb3JtYXRFcnJvcih2YWx1ZSk7fQppZihrZXlzLmxlbmd0aD09PTAmJighYXJyYXl8fHZhbHVlLmxlbmd0aD09MCkpe3JldHVybiBicmFjZXNbMF0rYmFzZSticmFjZXNbMV07fQppZihyZWN1cnNlVGltZXM8MCl7aWYoaXNSZWdFeHAodmFsdWUpKXtyZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwncmVnZXhwJyk7fWVsc2V7cmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsJ3NwZWNpYWwnKTt9fQpjdHguc2Vlbi5wdXNoKHZhbHVlKTt2YXIgb3V0cHV0O2lmKGFycmF5KXtvdXRwdXQ9Zm9ybWF0QXJyYXkoY3R4LHZhbHVlLHJlY3Vyc2VUaW1lcyx2aXNpYmxlS2V5cyxrZXlzKTt9ZWxzZXtvdXRwdXQ9a2V5cy5tYXAoZnVuY3Rpb24oa2V5KXtyZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LHZhbHVlLHJlY3Vyc2VUaW1lcyx2aXNpYmxlS2V5cyxrZXksYXJyYXkpO30pO30KY3R4LnNlZW4ucG9wKCk7cmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCxiYXNlLGJyYWNlcyk7fQpmdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LHZhbHVlKXtpZihpc1VuZGVmaW5lZCh2YWx1ZSkpCnJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywndW5kZWZpbmVkJyk7aWYoaXNTdHJpbmcodmFsdWUpKXt2YXIgc2ltcGxlPSdcJycrSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL14ifCIkL2csJycpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsnXCcnO3JldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsJ3N0cmluZycpO30KaWYoaXNOdW1iZXIodmFsdWUpKQpyZXR1cm4gY3R4LnN0eWxpemUoJycrdmFsdWUsJ251bWJlcicpO2lmKGlzQm9vbGVhbih2YWx1ZSkpCnJldHVybiBjdHguc3R5bGl6ZSgnJyt2YWx1ZSwnYm9vbGVhbicpO2lmKGlzTnVsbCh2YWx1ZSkpCnJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsJ251bGwnKTt9CmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKXtyZXR1cm4nWycrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKyddJzt9CmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5cyl7dmFyIG91dHB1dD1bXTtmb3IodmFyIGk9MCxsPXZhbHVlLmxlbmd0aDtpPGw7KytpKXtpZihoYXNPd25Qcm9wZXJ0eSh2YWx1ZSxTdHJpbmcoaSkpKXtvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsdmFsdWUscmVjdXJzZVRpbWVzLHZpc2libGVLZXlzLFN0cmluZyhpKSx0cnVlKSk7fWVsc2V7b3V0cHV0LnB1c2goJycpO319CmtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe2lmKCFrZXkubWF0Y2goL15cZCskLykpe291dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5LHRydWUpKTt9fSk7cmV0dXJuIG91dHB1dDt9CmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5LGFycmF5KXt2YXIgbmFtZSxzdHIsZGVzYztkZXNjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsa2V5KXx8e3ZhbHVlOnZhbHVlW2tleV19O2lmKGRlc2MuZ2V0KXtpZihkZXNjLnNldCl7c3RyPWN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCdzcGVjaWFsJyk7fWVsc2V7c3RyPWN0eC5zdHlsaXplKCdbR2V0dGVyXScsJ3NwZWNpYWwnKTt9fWVsc2V7aWYoZGVzYy5zZXQpe3N0cj1jdHguc3R5bGl6ZSgnW1NldHRlcl0nLCdzcGVjaWFsJyk7fX0KaWYoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLGtleSkpe25hbWU9J1snK2tleSsnXSc7fQppZighc3RyKXtpZihjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpPDApe2lmKGlzTnVsbChyZWN1cnNlVGltZXMpKXtzdHI9Zm9ybWF0VmFsdWUoY3R4LGRlc2MudmFsdWUsbnVsbCk7fWVsc2V7c3RyPWZvcm1hdFZhbHVlKGN0eCxkZXNjLnZhbHVlLHJlY3Vyc2VUaW1lcy0xKTt9CmlmKHN0ci5pbmRleE9mKCdcbicpPi0xKXtpZihhcnJheSl7c3RyPXN0ci5zcGxpdCgnXG4nKS5tYXAoZnVuY3Rpb24obGluZSl7cmV0dXJuJyAgJytsaW5lO30pLmpvaW4oJ1xuJykuc3Vic3RyKDIpO31lbHNle3N0cj0nXG4nK3N0ci5zcGxpdCgnXG4nKS5tYXAoZnVuY3Rpb24obGluZSl7cmV0dXJuJyAgICcrbGluZTt9KS5qb2luKCdcbicpO319fWVsc2V7c3RyPWN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywnc3BlY2lhbCcpO319CmlmKGlzVW5kZWZpbmVkKG5hbWUpKXtpZihhcnJheSYma2V5Lm1hdGNoKC9eXGQrJC8pKXtyZXR1cm4gc3RyO30KbmFtZT1KU09OLnN0cmluZ2lmeSgnJytrZXkpO2lmKG5hbWUubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKSl7bmFtZT1uYW1lLnN1YnN0cigxLG5hbWUubGVuZ3RoLTIpO25hbWU9Y3R4LnN0eWxpemUobmFtZSwnbmFtZScpO31lbHNle25hbWU9bmFtZS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIik7bmFtZT1jdHguc3R5bGl6ZShuYW1lLCdzdHJpbmcnKTt9fQpyZXR1cm4gbmFtZSsnOiAnK3N0cjt9CmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCxiYXNlLGJyYWNlcyl7dmFyIG51bUxpbmVzRXN0PTA7dmFyIGxlbmd0aD1vdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsY3VyKXtudW1MaW5lc0VzdCsrO2lmKGN1ci5pbmRleE9mKCdcbicpPj0wKW51bUxpbmVzRXN0Kys7cmV0dXJuIHByZXYrY3VyLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csJycpLmxlbmd0aCsxO30sMCk7aWYobGVuZ3RoPjYwKXtyZXR1cm4gYnJhY2VzWzBdKyhiYXNlPT09Jyc/Jyc6YmFzZSsnXG4gJykrJyAnKwpvdXRwdXQuam9pbignLFxuICAnKSsnICcrCmJyYWNlc1sxXTt9CnJldHVybiBicmFjZXNbMF0rYmFzZSsnICcrb3V0cHV0LmpvaW4oJywgJykrJyAnK2JyYWNlc1sxXTt9CmZ1bmN0aW9uIGlzQXJyYXkoYXIpe3JldHVybiBBcnJheS5pc0FycmF5KGFyKTt9CmV4cG9ydHMuaXNBcnJheT1pc0FycmF5O2Z1bmN0aW9uIGlzQm9vbGVhbihhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09J2Jvb2xlYW4nO30KZXhwb3J0cy5pc0Jvb2xlYW49aXNCb29sZWFuO2Z1bmN0aW9uIGlzTnVsbChhcmcpe3JldHVybiBhcmc9PT1udWxsO30KZXhwb3J0cy5pc051bGw9aXNOdWxsO2Z1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZyl7cmV0dXJuIGFyZz09bnVsbDt9CmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9aXNOdWxsT3JVbmRlZmluZWQ7ZnVuY3Rpb24gaXNOdW1iZXIoYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PSdudW1iZXInO30KZXhwb3J0cy5pc051bWJlcj1pc051bWJlcjtmdW5jdGlvbiBpc1N0cmluZyhhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09J3N0cmluZyc7fQpleHBvcnRzLmlzU3RyaW5nPWlzU3RyaW5nO2Z1bmN0aW9uIGlzU3ltYm9sKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nc3ltYm9sJzt9CmV4cG9ydHMuaXNTeW1ib2w9aXNTeW1ib2w7ZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKXtyZXR1cm4gYXJnPT09dm9pZCAwO30KZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZDtmdW5jdGlvbiBpc1JlZ0V4cChyZSl7cmV0dXJuIGlzT2JqZWN0KHJlKSYmb2JqZWN0VG9TdHJpbmcocmUpPT09J1tvYmplY3QgUmVnRXhwXSc7fQpleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwO2Z1bmN0aW9uIGlzT2JqZWN0KGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nb2JqZWN0JyYmYXJnIT09bnVsbDt9CmV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3Q7ZnVuY3Rpb24gaXNEYXRlKGQpe3JldHVybiBpc09iamVjdChkKSYmb2JqZWN0VG9TdHJpbmcoZCk9PT0nW29iamVjdCBEYXRlXSc7fQpleHBvcnRzLmlzRGF0ZT1pc0RhdGU7ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4gaXNPYmplY3QoZSkmJihvYmplY3RUb1N0cmluZyhlKT09PSdbb2JqZWN0IEVycm9yXSd8fGUgaW5zdGFuY2VvZiBFcnJvcik7fQpleHBvcnRzLmlzRXJyb3I9aXNFcnJvcjtmdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nZnVuY3Rpb24nO30KZXhwb3J0cy5pc0Z1bmN0aW9uPWlzRnVuY3Rpb247ZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKXtyZXR1cm4gYXJnPT09bnVsbHx8dHlwZW9mIGFyZz09PSdib29sZWFuJ3x8dHlwZW9mIGFyZz09PSdudW1iZXInfHx0eXBlb2YgYXJnPT09J3N0cmluZyd8fHR5cGVvZiBhcmc9PT0nc3ltYm9sJ3x8dHlwZW9mIGFyZz09PSd1bmRlZmluZWQnO30KZXhwb3J0cy5pc1ByaW1pdGl2ZT1pc1ByaW1pdGl2ZTtleHBvcnRzLmlzQnVmZmVyPXJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO2Z1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7fQpmdW5jdGlvbiBwYWQobil7cmV0dXJuIG48MTA/JzAnK24udG9TdHJpbmcoMTApOm4udG9TdHJpbmcoMTApO30KdmFyIG1vbnRocz1bJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddO2Z1bmN0aW9uIHRpbWVzdGFtcCgpe3ZhciBkPW5ldyBEYXRlKCk7dmFyIHRpbWU9W3BhZChkLmdldEhvdXJzKCkpLHBhZChkLmdldE1pbnV0ZXMoKSkscGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO3JldHVybltkLmdldERhdGUoKSxtb250aHNbZC5nZXRNb250aCgpXSx0aW1lXS5qb2luKCcgJyk7fQpleHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKCclcyAtICVzJyx0aW1lc3RhbXAoKSxleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLGFyZ3VtZW50cykpO307ZXhwb3J0cy5pbmhlcml0cz1yZXF1aXJlKCdpbmhlcml0cycpO2V4cG9ydHMuX2V4dGVuZD1mdW5jdGlvbihvcmlnaW4sYWRkKXtpZighYWRkfHwhaXNPYmplY3QoYWRkKSlyZXR1cm4gb3JpZ2luO3ZhciBrZXlzPU9iamVjdC5rZXlzKGFkZCk7dmFyIGk9a2V5cy5sZW5ndGg7d2hpbGUoaS0tKXtvcmlnaW5ba2V5c1tpXV09YWRkW2tleXNbaV1dO30KcmV0dXJuIG9yaWdpbjt9O2Z1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaixwcm9wKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKTt9fSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7Ii4vc3VwcG9ydC9pc0J1ZmZlciI6OTYsIl9wcm9jZXNzIjo3NywiaW5oZXJpdHMiOjk1fV0sOTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsYW5ncz1bImFhIiwiYWIiLCJhZSIsImFmIiwiYWsiLCJhbSIsImFuIiwiYXIiLCJhcyIsImF2IiwiYXkiLCJheiIsImJhIiwiYmUiLCJiZyIsImJoIiwiYmkiLCJibSIsImJuIiwiYm8iLCJiciIsImJzIiwiY2EiLCJjZSIsImNoIiwiY28iLCJjciIsImNzIiwiY3UiLCJjdiIsImN5IiwiZGEiLCJkZSIsImR2IiwiZHoiLCJlZSIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZhIiwiZmYiLCJmaSIsImZqIiwiZm8iLCJmciIsImZ5IiwiZ2EiLCJnZCIsImdsIiwiZ24iLCJndSIsImd2IiwiaGEiLCJoZSIsImhpIiwiaG8iLCJociIsImh0IiwiaHUiLCJoeSIsImh6IiwiaWEiLCJpZCIsImllIiwiaWciLCJpaSIsImlrIiwiaW4iLCJpbyIsImlzIiwiaXQiLCJpdSIsIml3IiwiamEiLCJqaSIsImp2IiwianciLCJrYSIsImtnIiwia2kiLCJraiIsImtrIiwia2wiLCJrbSIsImtuIiwia28iLCJrciIsImtzIiwia3UiLCJrdiIsImt3Iiwia3kiLCJsYSIsImxiIiwibGciLCJsaSIsImxuIiwibG8iLCJsdCIsImx1IiwibHYiLCJtZyIsIm1oIiwibWkiLCJtayIsIm1sIiwibW4iLCJtbyIsIm1yIiwibXMiLCJtdCIsIm15IiwibmEiLCJuYiIsIm5kIiwibmUiLCJuZyIsIm5sIiwibm4iLCJubyIsIm5yIiwibnYiLCJueSIsIm9jIiwib2oiLCJvbSIsIm9yIiwib3MiLCJwYSIsInBpIiwicGwiLCJwcyIsInB0IiwicXUiLCJybSIsInJuIiwicm8iLCJydSIsInJ3Iiwic2EiLCJzYyIsInNkIiwic2UiLCJzZyIsInNoIiwic2kiLCJzayIsInNsIiwic20iLCJzbiIsInNvIiwic3EiLCJzciIsInNzIiwic3QiLCJzdSIsInN2Iiwic3ciLCJ0YSIsInRlIiwidGciLCJ0aCIsInRpIiwidGsiLCJ0bCIsInRuIiwidG8iLCJ0ciIsInRzIiwidHQiLCJ0dyIsInR5IiwidWciLCJ1ayIsInVyIiwidXoiLCJ2ZSIsInZpIiwidm8iLCJ3YSIsIndvIiwieGgiLCJ5aSIsInlvIiwiemEiLCJ6aCIsInp1IiwiYWFhIiwiYWFiIiwiYWFjIiwiYWFkIiwiYWFlIiwiYWFmIiwiYWFnIiwiYWFoIiwiYWFpIiwiYWFrIiwiYWFsIiwiYWFtIiwiYWFuIiwiYWFvIiwiYWFwIiwiYWFxIiwiYWFzIiwiYWF0IiwiYWF1IiwiYWF2IiwiYWF3IiwiYWF4IiwiYWF6IiwiYWJhIiwiYWJiIiwiYWJjIiwiYWJkIiwiYWJlIiwiYWJmIiwiYWJnIiwiYWJoIiwiYWJpIiwiYWJqIiwiYWJsIiwiYWJtIiwiYWJuIiwiYWJvIiwiYWJwIiwiYWJxIiwiYWJyIiwiYWJzIiwiYWJ0IiwiYWJ1IiwiYWJ2IiwiYWJ3IiwiYWJ4IiwiYWJ5IiwiYWJ6IiwiYWNhIiwiYWNiIiwiYWNkIiwiYWNlIiwiYWNmIiwiYWNoIiwiYWNpIiwiYWNrIiwiYWNsIiwiYWNtIiwiYWNuIiwiYWNwIiwiYWNxIiwiYWNyIiwiYWNzIiwiYWN0IiwiYWN1IiwiYWN2IiwiYWN3IiwiYWN4IiwiYWN5IiwiYWN6IiwiYWRhIiwiYWRiIiwiYWRkIiwiYWRlIiwiYWRmIiwiYWRnIiwiYWRoIiwiYWRpIiwiYWRqIiwiYWRsIiwiYWRuIiwiYWRvIiwiYWRwIiwiYWRxIiwiYWRyIiwiYWRzIiwiYWR0IiwiYWR1IiwiYWR3IiwiYWR4IiwiYWR5IiwiYWR6IiwiYWVhIiwiYWViIiwiYWVjIiwiYWVkIiwiYWVlIiwiYWVrIiwiYWVsIiwiYWVtIiwiYWVuIiwiYWVxIiwiYWVyIiwiYWVzIiwiYWV1IiwiYWV3IiwiYWV5IiwiYWV6IiwiYWZhIiwiYWZiIiwiYWZkIiwiYWZlIiwiYWZnIiwiYWZoIiwiYWZpIiwiYWZrIiwiYWZuIiwiYWZvIiwiYWZwIiwiYWZzIiwiYWZ0IiwiYWZ1IiwiYWZ6IiwiYWdhIiwiYWdiIiwiYWdjIiwiYWdkIiwiYWdlIiwiYWdmIiwiYWdnIiwiYWdoIiwiYWdpIiwiYWdqIiwiYWdrIiwiYWdsIiwiYWdtIiwiYWduIiwiYWdvIiwiYWdwIiwiYWdxIiwiYWdyIiwiYWdzIiwiYWd0IiwiYWd1IiwiYWd2IiwiYWd3IiwiYWd4IiwiYWd5IiwiYWd6IiwiYWhhIiwiYWhiIiwiYWhnIiwiYWhoIiwiYWhpIiwiYWhrIiwiYWhsIiwiYWhtIiwiYWhuIiwiYWhvIiwiYWhwIiwiYWhyIiwiYWhzIiwiYWh0IiwiYWlhIiwiYWliIiwiYWljIiwiYWlkIiwiYWllIiwiYWlmIiwiYWlnIiwiYWloIiwiYWlpIiwiYWlqIiwiYWlrIiwiYWlsIiwiYWltIiwiYWluIiwiYWlvIiwiYWlwIiwiYWlxIiwiYWlyIiwiYWlzIiwiYWl0IiwiYWl3IiwiYWl4IiwiYWl5IiwiYWphIiwiYWpnIiwiYWppIiwiYWpuIiwiYWpwIiwiYWp0IiwiYWp1IiwiYWp3IiwiYWp6IiwiYWtiIiwiYWtjIiwiYWtkIiwiYWtlIiwiYWtmIiwiYWtnIiwiYWtoIiwiYWtpIiwiYWtqIiwiYWtrIiwiYWtsIiwiYWttIiwiYWtvIiwiYWtwIiwiYWtxIiwiYWtyIiwiYWtzIiwiYWt0IiwiYWt1IiwiYWt2IiwiYWt3IiwiYWt4IiwiYWt5IiwiYWt6IiwiYWxhIiwiYWxjIiwiYWxkIiwiYWxlIiwiYWxmIiwiYWxnIiwiYWxoIiwiYWxpIiwiYWxqIiwiYWxrIiwiYWxsIiwiYWxtIiwiYWxuIiwiYWxvIiwiYWxwIiwiYWxxIiwiYWxyIiwiYWxzIiwiYWx0IiwiYWx1IiwiYWx2IiwiYWx3IiwiYWx4IiwiYWx5IiwiYWx6IiwiYW1hIiwiYW1iIiwiYW1jIiwiYW1lIiwiYW1mIiwiYW1nIiwiYW1pIiwiYW1qIiwiYW1rIiwiYW1sIiwiYW1tIiwiYW1uIiwiYW1vIiwiYW1wIiwiYW1xIiwiYW1yIiwiYW1zIiwiYW10IiwiYW11IiwiYW12IiwiYW13IiwiYW14IiwiYW15IiwiYW16IiwiYW5hIiwiYW5iIiwiYW5jIiwiYW5kIiwiYW5lIiwiYW5mIiwiYW5nIiwiYW5oIiwiYW5pIiwiYW5qIiwiYW5rIiwiYW5sIiwiYW5tIiwiYW5uIiwiYW5vIiwiYW5wIiwiYW5xIiwiYW5yIiwiYW5zIiwiYW50IiwiYW51IiwiYW52IiwiYW53IiwiYW54IiwiYW55IiwiYW56IiwiYW9hIiwiYW9iIiwiYW9jIiwiYW9kIiwiYW9lIiwiYW9mIiwiYW9nIiwiYW9oIiwiYW9pIiwiYW9qIiwiYW9rIiwiYW9sIiwiYW9tIiwiYW9uIiwiYW9yIiwiYW9zIiwiYW90IiwiYW91IiwiYW94IiwiYW96IiwiYXBhIiwiYXBiIiwiYXBjIiwiYXBkIiwiYXBlIiwiYXBmIiwiYXBnIiwiYXBoIiwiYXBpIiwiYXBqIiwiYXBrIiwiYXBsIiwiYXBtIiwiYXBuIiwiYXBvIiwiYXBwIiwiYXBxIiwiYXByIiwiYXBzIiwiYXB0IiwiYXB1IiwiYXB2IiwiYXB3IiwiYXB4IiwiYXB5IiwiYXB6IiwiYXFhIiwiYXFjIiwiYXFkIiwiYXFnIiwiYXFsIiwiYXFtIiwiYXFuIiwiYXFwIiwiYXFyIiwiYXF0IiwiYXF6IiwiYXJiIiwiYXJjIiwiYXJkIiwiYXJlIiwiYXJoIiwiYXJpIiwiYXJqIiwiYXJrIiwiYXJsIiwiYXJuIiwiYXJvIiwiYXJwIiwiYXJxIiwiYXJyIiwiYXJzIiwiYXJ0IiwiYXJ1IiwiYXJ2IiwiYXJ3IiwiYXJ4IiwiYXJ5IiwiYXJ6IiwiYXNhIiwiYXNiIiwiYXNjIiwiYXNkIiwiYXNlIiwiYXNmIiwiYXNnIiwiYXNoIiwiYXNpIiwiYXNqIiwiYXNrIiwiYXNsIiwiYXNuIiwiYXNvIiwiYXNwIiwiYXNxIiwiYXNyIiwiYXNzIiwiYXN0IiwiYXN1IiwiYXN2IiwiYXN3IiwiYXN4IiwiYXN5IiwiYXN6IiwiYXRhIiwiYXRiIiwiYXRjIiwiYXRkIiwiYXRlIiwiYXRnIiwiYXRoIiwiYXRpIiwiYXRqIiwiYXRrIiwiYXRsIiwiYXRtIiwiYXRuIiwiYXRvIiwiYXRwIiwiYXRxIiwiYXRyIiwiYXRzIiwiYXR0IiwiYXR1IiwiYXR2IiwiYXR3IiwiYXR4IiwiYXR5IiwiYXR6IiwiYXVhIiwiYXViIiwiYXVjIiwiYXVkIiwiYXVlIiwiYXVmIiwiYXVnIiwiYXVoIiwiYXVpIiwiYXVqIiwiYXVrIiwiYXVsIiwiYXVtIiwiYXVuIiwiYXVvIiwiYXVwIiwiYXVxIiwiYXVyIiwiYXVzIiwiYXV0IiwiYXV1IiwiYXV3IiwiYXV4IiwiYXV5IiwiYXV6IiwiYXZiIiwiYXZkIiwiYXZpIiwiYXZrIiwiYXZsIiwiYXZtIiwiYXZuIiwiYXZvIiwiYXZzIiwiYXZ0IiwiYXZ1IiwiYXZ2IiwiYXdhIiwiYXdiIiwiYXdjIiwiYXdkIiwiYXdlIiwiYXdnIiwiYXdoIiwiYXdpIiwiYXdrIiwiYXdtIiwiYXduIiwiYXdvIiwiYXdyIiwiYXdzIiwiYXd0IiwiYXd1IiwiYXd2IiwiYXd3IiwiYXd4IiwiYXd5IiwiYXhiIiwiYXhlIiwiYXhnIiwiYXhrIiwiYXhsIiwiYXhtIiwiYXh4IiwiYXlhIiwiYXliIiwiYXljIiwiYXlkIiwiYXllIiwiYXlnIiwiYXloIiwiYXlpIiwiYXlrIiwiYXlsIiwiYXluIiwiYXlvIiwiYXlwIiwiYXlxIiwiYXlyIiwiYXlzIiwiYXl0IiwiYXl1IiwiYXl4IiwiYXl5IiwiYXl6IiwiYXphIiwiYXpiIiwiYXpjIiwiYXpkIiwiYXpnIiwiYXpqIiwiYXptIiwiYXpuIiwiYXpvIiwiYXp0IiwiYXp6IiwiYmFhIiwiYmFiIiwiYmFjIiwiYmFkIiwiYmFlIiwiYmFmIiwiYmFnIiwiYmFoIiwiYmFpIiwiYmFqIiwiYmFsIiwiYmFuIiwiYmFvIiwiYmFwIiwiYmFyIiwiYmFzIiwiYmF0IiwiYmF1IiwiYmF2IiwiYmF3IiwiYmF4IiwiYmF5IiwiYmF6IiwiYmJhIiwiYmJiIiwiYmJjIiwiYmJkIiwiYmJlIiwiYmJmIiwiYmJnIiwiYmJoIiwiYmJpIiwiYmJqIiwiYmJrIiwiYmJsIiwiYmJtIiwiYmJuIiwiYmJvIiwiYmJwIiwiYmJxIiwiYmJyIiwiYmJzIiwiYmJ0IiwiYmJ1IiwiYmJ2IiwiYmJ3IiwiYmJ4IiwiYmJ5IiwiYmJ6IiwiYmNhIiwiYmNiIiwiYmNjIiwiYmNkIiwiYmNlIiwiYmNmIiwiYmNnIiwiYmNoIiwiYmNpIiwiYmNqIiwiYmNrIiwiYmNsIiwiYmNtIiwiYmNuIiwiYmNvIiwiYmNwIiwiYmNxIiwiYmNyIiwiYmNzIiwiYmN0IiwiYmN1IiwiYmN2IiwiYmN3IiwiYmN5IiwiYmN6IiwiYmRhIiwiYmRiIiwiYmRjIiwiYmRkIiwiYmRlIiwiYmRmIiwiYmRnIiwiYmRoIiwiYmRpIiwiYmRqIiwiYmRrIiwiYmRsIiwiYmRtIiwiYmRuIiwiYmRvIiwiYmRwIiwiYmRxIiwiYmRyIiwiYmRzIiwiYmR0IiwiYmR1IiwiYmR2IiwiYmR3IiwiYmR4IiwiYmR5IiwiYmR6IiwiYmVhIiwiYmViIiwiYmVjIiwiYmVkIiwiYmVlIiwiYmVmIiwiYmVnIiwiYmVoIiwiYmVpIiwiYmVqIiwiYmVrIiwiYmVtIiwiYmVvIiwiYmVwIiwiYmVxIiwiYmVyIiwiYmVzIiwiYmV0IiwiYmV1IiwiYmV2IiwiYmV3IiwiYmV4IiwiYmV5IiwiYmV6IiwiYmZhIiwiYmZiIiwiYmZjIiwiYmZkIiwiYmZlIiwiYmZmIiwiYmZnIiwiYmZoIiwiYmZpIiwiYmZqIiwiYmZrIiwiYmZsIiwiYmZtIiwiYmZuIiwiYmZvIiwiYmZwIiwiYmZxIiwiYmZyIiwiYmZzIiwiYmZ0IiwiYmZ1IiwiYmZ3IiwiYmZ4IiwiYmZ5IiwiYmZ6IiwiYmdhIiwiYmdiIiwiYmdjIiwiYmdkIiwiYmdlIiwiYmdmIiwiYmdnIiwiYmdpIiwiYmdqIiwiYmdrIiwiYmdsIiwiYmdtIiwiYmduIiwiYmdvIiwiYmdwIiwiYmdxIiwiYmdyIiwiYmdzIiwiYmd0IiwiYmd1IiwiYmd2IiwiYmd3IiwiYmd4IiwiYmd5IiwiYmd6IiwiYmhhIiwiYmhiIiwiYmhjIiwiYmhkIiwiYmhlIiwiYmhmIiwiYmhnIiwiYmhoIiwiYmhpIiwiYmhqIiwiYmhrIiwiYmhsIiwiYmhtIiwiYmhuIiwiYmhvIiwiYmhwIiwiYmhxIiwiYmhyIiwiYmhzIiwiYmh0IiwiYmh1IiwiYmh2IiwiYmh3IiwiYmh4IiwiYmh5IiwiYmh6IiwiYmlhIiwiYmliIiwiYmljIiwiYmlkIiwiYmllIiwiYmlmIiwiYmlnIiwiYmlqIiwiYmlrIiwiYmlsIiwiYmltIiwiYmluIiwiYmlvIiwiYmlwIiwiYmlxIiwiYmlyIiwiYml0IiwiYml1IiwiYml2IiwiYml3IiwiYml4IiwiYml5IiwiYml6IiwiYmphIiwiYmpiIiwiYmpjIiwiYmpkIiwiYmplIiwiYmpmIiwiYmpnIiwiYmpoIiwiYmppIiwiYmpqIiwiYmprIiwiYmpsIiwiYmptIiwiYmpuIiwiYmpvIiwiYmpwIiwiYmpxIiwiYmpyIiwiYmpzIiwiYmp0IiwiYmp1IiwiYmp2IiwiYmp3IiwiYmp4IiwiYmp5IiwiYmp6IiwiYmthIiwiYmtiIiwiYmtjIiwiYmtkIiwiYmtmIiwiYmtnIiwiYmtoIiwiYmtpIiwiYmtqIiwiYmtrIiwiYmtsIiwiYmttIiwiYmtuIiwiYmtvIiwiYmtwIiwiYmtxIiwiYmtyIiwiYmtzIiwiYmt0IiwiYmt1IiwiYmt2IiwiYmt3IiwiYmt4IiwiYmt5IiwiYmt6IiwiYmxhIiwiYmxiIiwiYmxjIiwiYmxkIiwiYmxlIiwiYmxmIiwiYmxnIiwiYmxoIiwiYmxpIiwiYmxqIiwiYmxrIiwiYmxsIiwiYmxtIiwiYmxuIiwiYmxvIiwiYmxwIiwiYmxxIiwiYmxyIiwiYmxzIiwiYmx0IiwiYmx2IiwiYmx3IiwiYmx4IiwiYmx5IiwiYmx6IiwiYm1hIiwiYm1iIiwiYm1jIiwiYm1kIiwiYm1lIiwiYm1mIiwiYm1nIiwiYm1oIiwiYm1pIiwiYm1qIiwiYm1rIiwiYm1sIiwiYm1tIiwiYm1uIiwiYm1vIiwiYm1wIiwiYm1xIiwiYm1yIiwiYm1zIiwiYm10IiwiYm11IiwiYm12IiwiYm13IiwiYm14IiwiYm15IiwiYm16IiwiYm5hIiwiYm5iIiwiYm5jIiwiYm5kIiwiYm5lIiwiYm5mIiwiYm5nIiwiYm5pIiwiYm5qIiwiYm5rIiwiYm5sIiwiYm5tIiwiYm5uIiwiYm5vIiwiYm5wIiwiYm5xIiwiYm5yIiwiYm5zIiwiYm50IiwiYm51IiwiYm52IiwiYm53IiwiYm54IiwiYm55IiwiYm56IiwiYm9hIiwiYm9iIiwiYm9lIiwiYm9mIiwiYm9nIiwiYm9oIiwiYm9pIiwiYm9qIiwiYm9rIiwiYm9sIiwiYm9tIiwiYm9uIiwiYm9vIiwiYm9wIiwiYm9xIiwiYm9yIiwiYm90IiwiYm91IiwiYm92IiwiYm93IiwiYm94IiwiYm95IiwiYm96IiwiYnBhIiwiYnBiIiwiYnBkIiwiYnBnIiwiYnBoIiwiYnBpIiwiYnBqIiwiYnBrIiwiYnBsIiwiYnBtIiwiYnBuIiwiYnBvIiwiYnBwIiwiYnBxIiwiYnByIiwiYnBzIiwiYnB0IiwiYnB1IiwiYnB2IiwiYnB3IiwiYnB4IiwiYnB5IiwiYnB6IiwiYnFhIiwiYnFiIiwiYnFjIiwiYnFkIiwiYnFmIiwiYnFnIiwiYnFoIiwiYnFpIiwiYnFqIiwiYnFrIiwiYnFsIiwiYnFtIiwiYnFuIiwiYnFvIiwiYnFwIiwiYnFxIiwiYnFyIiwiYnFzIiwiYnF0IiwiYnF1IiwiYnF2IiwiYnF3IiwiYnF4IiwiYnF5IiwiYnF6IiwiYnJhIiwiYnJiIiwiYnJjIiwiYnJkIiwiYnJmIiwiYnJnIiwiYnJoIiwiYnJpIiwiYnJqIiwiYnJrIiwiYnJsIiwiYnJtIiwiYnJuIiwiYnJvIiwiYnJwIiwiYnJxIiwiYnJyIiwiYnJzIiwiYnJ0IiwiYnJ1IiwiYnJ2IiwiYnJ3IiwiYnJ4IiwiYnJ5IiwiYnJ6IiwiYnNhIiwiYnNiIiwiYnNjIiwiYnNlIiwiYnNmIiwiYnNnIiwiYnNoIiwiYnNpIiwiYnNqIiwiYnNrIiwiYnNsIiwiYnNtIiwiYnNuIiwiYnNvIiwiYnNwIiwiYnNxIiwiYnNyIiwiYnNzIiwiYnN0IiwiYnN1IiwiYnN2IiwiYnN3IiwiYnN4IiwiYnN5IiwiYnRhIiwiYnRiIiwiYnRjIiwiYnRkIiwiYnRlIiwiYnRmIiwiYnRnIiwiYnRoIiwiYnRpIiwiYnRqIiwiYnRrIiwiYnRsIiwiYnRtIiwiYnRuIiwiYnRvIiwiYnRwIiwiYnRxIiwiYnRyIiwiYnRzIiwiYnR0IiwiYnR1IiwiYnR2IiwiYnR3IiwiYnR4IiwiYnR5IiwiYnR6IiwiYnVhIiwiYnViIiwiYnVjIiwiYnVkIiwiYnVlIiwiYnVmIiwiYnVnIiwiYnVoIiwiYnVpIiwiYnVqIiwiYnVrIiwiYnVtIiwiYnVuIiwiYnVvIiwiYnVwIiwiYnVxIiwiYnVzIiwiYnV0IiwiYnV1IiwiYnV2IiwiYnV3IiwiYnV4IiwiYnV5IiwiYnV6IiwiYnZhIiwiYnZiIiwiYnZjIiwiYnZkIiwiYnZlIiwiYnZmIiwiYnZnIiwiYnZoIiwiYnZpIiwiYnZqIiwiYnZrIiwiYnZsIiwiYnZtIiwiYnZuIiwiYnZvIiwiYnZwIiwiYnZxIiwiYnZyIiwiYnZ0IiwiYnZ1IiwiYnZ2IiwiYnZ3IiwiYnZ4IiwiYnZ5IiwiYnZ6IiwiYndhIiwiYndiIiwiYndjIiwiYndkIiwiYndlIiwiYndmIiwiYndnIiwiYndoIiwiYndpIiwiYndqIiwiYndrIiwiYndsIiwiYndtIiwiYnduIiwiYndvIiwiYndwIiwiYndxIiwiYndyIiwiYndzIiwiYnd0IiwiYnd1IiwiYnd3IiwiYnd4IiwiYnd5IiwiYnd6IiwiYnhhIiwiYnhiIiwiYnhjIiwiYnhkIiwiYnhlIiwiYnhmIiwiYnhnIiwiYnhoIiwiYnhpIiwiYnhqIiwiYnhrIiwiYnhsIiwiYnhtIiwiYnhuIiwiYnhvIiwiYnhwIiwiYnhxIiwiYnhyIiwiYnhzIiwiYnh1IiwiYnh2IiwiYnh3IiwiYnh4IiwiYnh6IiwiYnlhIiwiYnliIiwiYnljIiwiYnlkIiwiYnllIiwiYnlmIiwiYnlnIiwiYnloIiwiYnlpIiwiYnlqIiwiYnlrIiwiYnlsIiwiYnltIiwiYnluIiwiYnlvIiwiYnlwIiwiYnlxIiwiYnlyIiwiYnlzIiwiYnl0IiwiYnl2IiwiYnl3IiwiYnl4IiwiYnl5IiwiYnl6IiwiYnphIiwiYnpiIiwiYnpjIiwiYnpkIiwiYnplIiwiYnpmIiwiYnpnIiwiYnpoIiwiYnppIiwiYnpqIiwiYnprIiwiYnpsIiwiYnptIiwiYnpuIiwiYnpvIiwiYnpwIiwiYnpxIiwiYnpyIiwiYnpzIiwiYnp0IiwiYnp1IiwiYnp2IiwiYnp3IiwiYnp4IiwiYnp5IiwiYnp6IiwiY2FhIiwiY2FiIiwiY2FjIiwiY2FkIiwiY2FlIiwiY2FmIiwiY2FnIiwiY2FoIiwiY2FpIiwiY2FqIiwiY2FrIiwiY2FsIiwiY2FtIiwiY2FuIiwiY2FvIiwiY2FwIiwiY2FxIiwiY2FyIiwiY2FzIiwiY2F1IiwiY2F2IiwiY2F3IiwiY2F4IiwiY2F5IiwiY2F6IiwiY2JhIiwiY2JiIiwiY2JjIiwiY2JkIiwiY2JlIiwiY2JnIiwiY2JoIiwiY2JpIiwiY2JqIiwiY2JrIiwiY2JsIiwiY2JuIiwiY2JvIiwiY2JxIiwiY2JyIiwiY2JzIiwiY2J0IiwiY2J1IiwiY2J2IiwiY2J3IiwiY2J5IiwiY2NhIiwiY2NjIiwiY2NkIiwiY2NlIiwiY2NnIiwiY2NoIiwiY2NqIiwiY2NsIiwiY2NtIiwiY2NuIiwiY2NvIiwiY2NwIiwiY2NxIiwiY2NyIiwiY2NzIiwiY2RhIiwiY2RjIiwiY2RkIiwiY2RlIiwiY2RmIiwiY2RnIiwiY2RoIiwiY2RpIiwiY2RqIiwiY2RtIiwiY2RuIiwiY2RvIiwiY2RyIiwiY2RzIiwiY2R5IiwiY2R6IiwiY2VhIiwiY2ViIiwiY2VnIiwiY2VrIiwiY2VsIiwiY2VuIiwiY2V0IiwiY2ZhIiwiY2ZkIiwiY2ZnIiwiY2ZtIiwiY2dhIiwiY2djIiwiY2dnIiwiY2drIiwiY2hiIiwiY2hjIiwiY2hkIiwiY2hmIiwiY2hnIiwiY2hoIiwiY2hqIiwiY2hrIiwiY2hsIiwiY2htIiwiY2huIiwiY2hvIiwiY2hwIiwiY2hxIiwiY2hyIiwiY2h0IiwiY2h3IiwiY2h4IiwiY2h5IiwiY2h6IiwiY2lhIiwiY2liIiwiY2ljIiwiY2lkIiwiY2llIiwiY2loIiwiY2lrIiwiY2ltIiwiY2luIiwiY2lwIiwiY2lyIiwiY2l3IiwiY2l5IiwiY2phIiwiY2plIiwiY2poIiwiY2ppIiwiY2prIiwiY2ptIiwiY2puIiwiY2pvIiwiY2pwIiwiY2pyIiwiY2pzIiwiY2p2IiwiY2p5IiwiY2thIiwiY2tiIiwiY2toIiwiY2tsIiwiY2tuIiwiY2tvIiwiY2txIiwiY2tyIiwiY2tzIiwiY2t0IiwiY2t1IiwiY2t2IiwiY2t4IiwiY2t5IiwiY2t6IiwiY2xhIiwiY2xjIiwiY2xkIiwiY2xlIiwiY2xoIiwiY2xpIiwiY2xqIiwiY2xrIiwiY2xsIiwiY2xtIiwiY2xvIiwiY2x0IiwiY2x1IiwiY2x3IiwiY2x5IiwiY21hIiwiY21jIiwiY21lIiwiY21nIiwiY21pIiwiY21rIiwiY21sIiwiY21tIiwiY21uIiwiY21vIiwiY21yIiwiY21zIiwiY210IiwiY25hIiwiY25iIiwiY25jIiwiY25nIiwiY25oIiwiY25pIiwiY25rIiwiY25sIiwiY25vIiwiY25zIiwiY250IiwiY251IiwiY253IiwiY254IiwiY29hIiwiY29iIiwiY29jIiwiY29kIiwiY29lIiwiY29mIiwiY29nIiwiY29oIiwiY29qIiwiY29rIiwiY29sIiwiY29tIiwiY29uIiwiY29vIiwiY29wIiwiY29xIiwiY290IiwiY291IiwiY292IiwiY293IiwiY294IiwiY295IiwiY296IiwiY3BhIiwiY3BiIiwiY3BjIiwiY3BlIiwiY3BmIiwiY3BnIiwiY3BpIiwiY3BuIiwiY3BvIiwiY3BwIiwiY3BzIiwiY3B1IiwiY3B4IiwiY3B5IiwiY3FkIiwiY3F1IiwiY3JhIiwiY3JiIiwiY3JjIiwiY3JkIiwiY3JmIiwiY3JnIiwiY3JoIiwiY3JpIiwiY3JqIiwiY3JrIiwiY3JsIiwiY3JtIiwiY3JuIiwiY3JvIiwiY3JwIiwiY3JxIiwiY3JyIiwiY3JzIiwiY3J0IiwiY3J2IiwiY3J3IiwiY3J4IiwiY3J5IiwiY3J6IiwiY3NhIiwiY3NiIiwiY3NjIiwiY3NkIiwiY3NlIiwiY3NmIiwiY3NnIiwiY3NoIiwiY3NpIiwiY3NqIiwiY3NrIiwiY3NsIiwiY3NtIiwiY3NuIiwiY3NvIiwiY3NxIiwiY3NyIiwiY3NzIiwiY3N0IiwiY3N1IiwiY3N2IiwiY3N3IiwiY3N5IiwiY3N6IiwiY3RhIiwiY3RjIiwiY3RkIiwiY3RlIiwiY3RnIiwiY3RoIiwiY3RsIiwiY3RtIiwiY3RuIiwiY3RvIiwiY3RwIiwiY3RzIiwiY3R0IiwiY3R1IiwiY3R6IiwiY3VhIiwiY3ViIiwiY3VjIiwiY3VnIiwiY3VoIiwiY3VpIiwiY3VqIiwiY3VrIiwiY3VsIiwiY3VtIiwiY3VvIiwiY3VwIiwiY3VxIiwiY3VyIiwiY3VzIiwiY3V0IiwiY3V1IiwiY3V2IiwiY3V3IiwiY3V4IiwiY3ZnIiwiY3ZuIiwiY3dhIiwiY3diIiwiY3dkIiwiY3dlIiwiY3dnIiwiY3d0IiwiY3lhIiwiY3liIiwiY3lvIiwiY3poIiwiY3prIiwiY3puIiwiY3pvIiwiY3p0IiwiZGFhIiwiZGFjIiwiZGFkIiwiZGFlIiwiZGFmIiwiZGFnIiwiZGFoIiwiZGFpIiwiZGFqIiwiZGFrIiwiZGFsIiwiZGFtIiwiZGFvIiwiZGFwIiwiZGFxIiwiZGFyIiwiZGFzIiwiZGF1IiwiZGF2IiwiZGF3IiwiZGF4IiwiZGF5IiwiZGF6IiwiZGJhIiwiZGJiIiwiZGJkIiwiZGJlIiwiZGJmIiwiZGJnIiwiZGJpIiwiZGJqIiwiZGJsIiwiZGJtIiwiZGJuIiwiZGJvIiwiZGJwIiwiZGJxIiwiZGJyIiwiZGJ0IiwiZGJ1IiwiZGJ2IiwiZGJ3IiwiZGJ5IiwiZGNjIiwiZGNyIiwiZGRhIiwiZGRkIiwiZGRlIiwiZGRnIiwiZGRpIiwiZGRqIiwiZGRuIiwiZGRvIiwiZGRyIiwiZGRzIiwiZGR3IiwiZGVjIiwiZGVkIiwiZGVlIiwiZGVmIiwiZGVnIiwiZGVoIiwiZGVpIiwiZGVrIiwiZGVsIiwiZGVtIiwiZGVuIiwiZGVwIiwiZGVxIiwiZGVyIiwiZGVzIiwiZGV2IiwiZGV6IiwiZGdhIiwiZGdiIiwiZGdjIiwiZGdkIiwiZGdlIiwiZGdnIiwiZGdoIiwiZGdpIiwiZGdrIiwiZGdsIiwiZGduIiwiZGdvIiwiZGdyIiwiZGdzIiwiZGd0IiwiZGd1IiwiZGd3IiwiZGd4IiwiZGd6IiwiZGhhIiwiZGhkIiwiZGhnIiwiZGhpIiwiZGhsIiwiZGhtIiwiZGhuIiwiZGhvIiwiZGhyIiwiZGhzIiwiZGh1IiwiZGh2IiwiZGh3IiwiZGh4IiwiZGlhIiwiZGliIiwiZGljIiwiZGlkIiwiZGlmIiwiZGlnIiwiZGloIiwiZGlpIiwiZGlqIiwiZGlrIiwiZGlsIiwiZGltIiwiZGluIiwiZGlvIiwiZGlwIiwiZGlxIiwiZGlyIiwiZGlzIiwiZGl0IiwiZGl1IiwiZGl3IiwiZGl4IiwiZGl5IiwiZGl6IiwiZGphIiwiZGpiIiwiZGpjIiwiZGpkIiwiZGplIiwiZGpmIiwiZGppIiwiZGpqIiwiZGprIiwiZGpsIiwiZGptIiwiZGpuIiwiZGpvIiwiZGpyIiwiZGp1IiwiZGp3IiwiZGthIiwiZGtrIiwiZGtsIiwiZGtyIiwiZGtzIiwiZGt4IiwiZGxnIiwiZGxrIiwiZGxtIiwiZGxuIiwiZG1hIiwiZG1iIiwiZG1jIiwiZG1kIiwiZG1lIiwiZG1nIiwiZG1rIiwiZG1sIiwiZG1tIiwiZG1uIiwiZG1vIiwiZG1yIiwiZG1zIiwiZG11IiwiZG12IiwiZG13IiwiZG14IiwiZG15IiwiZG5hIiwiZG5kIiwiZG5lIiwiZG5nIiwiZG5pIiwiZG5qIiwiZG5rIiwiZG5uIiwiZG5yIiwiZG50IiwiZG51IiwiZG52IiwiZG53IiwiZG55IiwiZG9hIiwiZG9iIiwiZG9jIiwiZG9lIiwiZG9mIiwiZG9oIiwiZG9pIiwiZG9rIiwiZG9sIiwiZG9uIiwiZG9vIiwiZG9wIiwiZG9xIiwiZG9yIiwiZG9zIiwiZG90IiwiZG92IiwiZG93IiwiZG94IiwiZG95IiwiZG96IiwiZHBwIiwiZHJhIiwiZHJiIiwiZHJjIiwiZHJkIiwiZHJlIiwiZHJnIiwiZHJoIiwiZHJpIiwiZHJsIiwiZHJuIiwiZHJvIiwiZHJxIiwiZHJyIiwiZHJzIiwiZHJ0IiwiZHJ1IiwiZHJ3IiwiZHJ5IiwiZHNiIiwiZHNlIiwiZHNoIiwiZHNpIiwiZHNsIiwiZHNuIiwiZHNvIiwiZHNxIiwiZHRhIiwiZHRiIiwiZHRkIiwiZHRoIiwiZHRpIiwiZHRrIiwiZHRtIiwiZHRuIiwiZHRvIiwiZHRwIiwiZHRyIiwiZHRzIiwiZHR0IiwiZHR1IiwiZHR5IiwiZHVhIiwiZHViIiwiZHVjIiwiZHVkIiwiZHVlIiwiZHVmIiwiZHVnIiwiZHVoIiwiZHVpIiwiZHVqIiwiZHVrIiwiZHVsIiwiZHVtIiwiZHVuIiwiZHVvIiwiZHVwIiwiZHVxIiwiZHVyIiwiZHVzIiwiZHV1IiwiZHV2IiwiZHV3IiwiZHV4IiwiZHV5IiwiZHV6IiwiZHZhIiwiZHdhIiwiZHdsIiwiZHdyIiwiZHdzIiwiZHd1IiwiZHd3IiwiZHd5IiwiZHlhIiwiZHliIiwiZHlkIiwiZHlnIiwiZHlpIiwiZHltIiwiZHluIiwiZHlvIiwiZHl1IiwiZHl5IiwiZHphIiwiZHpkIiwiZHplIiwiZHpnIiwiZHpsIiwiZHpuIiwiZWFhIiwiZWJnIiwiZWJrIiwiZWJvIiwiZWJyIiwiZWJ1IiwiZWNyIiwiZWNzIiwiZWN5IiwiZWVlIiwiZWZhIiwiZWZlIiwiZWZpIiwiZWdhIiwiZWdsIiwiZWdvIiwiZWd4IiwiZWd5IiwiZWh1IiwiZWlwIiwiZWl0IiwiZWl2IiwiZWphIiwiZWthIiwiZWtjIiwiZWtlIiwiZWtnIiwiZWtpIiwiZWtrIiwiZWtsIiwiZWttIiwiZWtvIiwiZWtwIiwiZWtyIiwiZWt5IiwiZWxlIiwiZWxoIiwiZWxpIiwiZWxrIiwiZWxtIiwiZWxvIiwiZWxwIiwiZWx1IiwiZWx4IiwiZW1hIiwiZW1iIiwiZW1lIiwiZW1nIiwiZW1pIiwiZW1rIiwiZW1tIiwiZW1uIiwiZW1vIiwiZW1wIiwiZW1zIiwiZW11IiwiZW13IiwiZW14IiwiZW15IiwiZW5hIiwiZW5iIiwiZW5jIiwiZW5kIiwiZW5mIiwiZW5oIiwiZW5sIiwiZW5tIiwiZW5uIiwiZW5vIiwiZW5xIiwiZW5yIiwiZW51IiwiZW52IiwiZW53IiwiZW54IiwiZW90IiwiZXBpIiwiZXJhIiwiZXJnIiwiZXJoIiwiZXJpIiwiZXJrIiwiZXJvIiwiZXJyIiwiZXJzIiwiZXJ0IiwiZXJ3IiwiZXNlIiwiZXNnIiwiZXNoIiwiZXNpIiwiZXNrIiwiZXNsIiwiZXNtIiwiZXNuIiwiZXNvIiwiZXNxIiwiZXNzIiwiZXN1IiwiZXN4IiwiZXN5IiwiZXRiIiwiZXRjIiwiZXRoIiwiZXRuIiwiZXRvIiwiZXRyIiwiZXRzIiwiZXR0IiwiZXR1IiwiZXR4IiwiZXR6IiwiZXVxIiwiZXZlIiwiZXZoIiwiZXZuIiwiZXdvIiwiZXh0IiwiZXlhIiwiZXlvIiwiZXphIiwiZXplIiwiZmFhIiwiZmFiIiwiZmFkIiwiZmFmIiwiZmFnIiwiZmFoIiwiZmFpIiwiZmFqIiwiZmFrIiwiZmFsIiwiZmFtIiwiZmFuIiwiZmFwIiwiZmFyIiwiZmF0IiwiZmF1IiwiZmF4IiwiZmF5IiwiZmF6IiwiZmJsIiwiZmNzIiwiZmVyIiwiZmZpIiwiZmZtIiwiZmdyIiwiZmlhIiwiZmllIiwiZmlsIiwiZmlwIiwiZmlyIiwiZml0IiwiZml1IiwiZml3IiwiZmtrIiwiZmt2IiwiZmxhIiwiZmxoIiwiZmxpIiwiZmxsIiwiZmxuIiwiZmxyIiwiZmx5IiwiZm1wIiwiZm11IiwiZm5iIiwiZm5nIiwiZm5pIiwiZm9kIiwiZm9pIiwiZm9tIiwiZm9uIiwiZm9yIiwiZm9zIiwiZm94IiwiZnBlIiwiZnFzIiwiZnJjIiwiZnJkIiwiZnJrIiwiZnJtIiwiZnJvIiwiZnJwIiwiZnJxIiwiZnJyIiwiZnJzIiwiZnJ0IiwiZnNlIiwiZnNsIiwiZnNzIiwiZnViIiwiZnVjIiwiZnVkIiwiZnVlIiwiZnVmIiwiZnVoIiwiZnVpIiwiZnVqIiwiZnVtIiwiZnVuIiwiZnVxIiwiZnVyIiwiZnV0IiwiZnV1IiwiZnV2IiwiZnV5IiwiZnZyIiwiZndhIiwiZndlIiwiZ2FhIiwiZ2FiIiwiZ2FjIiwiZ2FkIiwiZ2FlIiwiZ2FmIiwiZ2FnIiwiZ2FoIiwiZ2FpIiwiZ2FqIiwiZ2FrIiwiZ2FsIiwiZ2FtIiwiZ2FuIiwiZ2FvIiwiZ2FwIiwiZ2FxIiwiZ2FyIiwiZ2FzIiwiZ2F0IiwiZ2F1IiwiZ2F2IiwiZ2F3IiwiZ2F4IiwiZ2F5IiwiZ2F6IiwiZ2JhIiwiZ2JiIiwiZ2JjIiwiZ2JkIiwiZ2JlIiwiZ2JmIiwiZ2JnIiwiZ2JoIiwiZ2JpIiwiZ2JqIiwiZ2JrIiwiZ2JsIiwiZ2JtIiwiZ2JuIiwiZ2JvIiwiZ2JwIiwiZ2JxIiwiZ2JyIiwiZ2JzIiwiZ2J1IiwiZ2J2IiwiZ2J3IiwiZ2J4IiwiZ2J5IiwiZ2J6IiwiZ2NjIiwiZ2NkIiwiZ2NlIiwiZ2NmIiwiZ2NsIiwiZ2NuIiwiZ2NyIiwiZ2N0IiwiZ2RhIiwiZ2RiIiwiZ2RjIiwiZ2RkIiwiZ2RlIiwiZ2RmIiwiZ2RnIiwiZ2RoIiwiZ2RpIiwiZ2RqIiwiZ2RrIiwiZ2RsIiwiZ2RtIiwiZ2RuIiwiZ2RvIiwiZ2RxIiwiZ2RyIiwiZ2RzIiwiZ2R0IiwiZ2R1IiwiZ2R4IiwiZ2VhIiwiZ2ViIiwiZ2VjIiwiZ2VkIiwiZ2VnIiwiZ2VoIiwiZ2VpIiwiZ2VqIiwiZ2VrIiwiZ2VsIiwiZ2VtIiwiZ2VxIiwiZ2VzIiwiZ2V2IiwiZ2V3IiwiZ2V4IiwiZ2V5IiwiZ2V6IiwiZ2ZrIiwiZ2Z0IiwiZ2Z4IiwiZ2dhIiwiZ2diIiwiZ2dkIiwiZ2dlIiwiZ2dnIiwiZ2drIiwiZ2dsIiwiZ2duIiwiZ2dvIiwiZ2dyIiwiZ2d0IiwiZ2d1IiwiZ2d3IiwiZ2hhIiwiZ2hjIiwiZ2hlIiwiZ2hoIiwiZ2hrIiwiZ2hsIiwiZ2huIiwiZ2hvIiwiZ2hyIiwiZ2hzIiwiZ2h0IiwiZ2lhIiwiZ2liIiwiZ2ljIiwiZ2lkIiwiZ2llIiwiZ2lnIiwiZ2loIiwiZ2lsIiwiZ2ltIiwiZ2luIiwiZ2lvIiwiZ2lwIiwiZ2lxIiwiZ2lyIiwiZ2lzIiwiZ2l0IiwiZ2l1IiwiZ2l3IiwiZ2l4IiwiZ2l5IiwiZ2l6IiwiZ2ppIiwiZ2prIiwiZ2ptIiwiZ2puIiwiZ2pyIiwiZ2p1IiwiZ2thIiwiZ2tlIiwiZ2tuIiwiZ2tvIiwiZ2twIiwiZ2t1IiwiZ2xjIiwiZ2xkIiwiZ2xoIiwiZ2xpIiwiZ2xqIiwiZ2xrIiwiZ2xsIiwiZ2xvIiwiZ2xyIiwiZ2x1IiwiZ2x3IiwiZ2x5IiwiZ21hIiwiZ21iIiwiZ21kIiwiZ21lIiwiZ21nIiwiZ21oIiwiZ21sIiwiZ21tIiwiZ21uIiwiZ21xIiwiZ211IiwiZ212IiwiZ213IiwiZ214IiwiZ215IiwiZ216IiwiZ25hIiwiZ25iIiwiZ25jIiwiZ25kIiwiZ25lIiwiZ25nIiwiZ25oIiwiZ25pIiwiZ25rIiwiZ25sIiwiZ25tIiwiZ25uIiwiZ25vIiwiZ25xIiwiZ25yIiwiZ250IiwiZ251IiwiZ253IiwiZ256IiwiZ29hIiwiZ29iIiwiZ29jIiwiZ29kIiwiZ29lIiwiZ29mIiwiZ29nIiwiZ29oIiwiZ29pIiwiZ29qIiwiZ29rIiwiZ29sIiwiZ29tIiwiZ29uIiwiZ29vIiwiZ29wIiwiZ29xIiwiZ29yIiwiZ29zIiwiZ290IiwiZ291IiwiZ293IiwiZ294IiwiZ295IiwiZ296IiwiZ3BhIiwiZ3BlIiwiZ3BuIiwiZ3FhIiwiZ3FpIiwiZ3FuIiwiZ3FyIiwiZ3F1IiwiZ3JhIiwiZ3JiIiwiZ3JjIiwiZ3JkIiwiZ3JnIiwiZ3JoIiwiZ3JpIiwiZ3JqIiwiZ3JrIiwiZ3JtIiwiZ3JvIiwiZ3JxIiwiZ3JyIiwiZ3JzIiwiZ3J0IiwiZ3J1IiwiZ3J2IiwiZ3J3IiwiZ3J4IiwiZ3J5IiwiZ3J6IiwiZ3NlIiwiZ3NnIiwiZ3NsIiwiZ3NtIiwiZ3NuIiwiZ3NvIiwiZ3NwIiwiZ3NzIiwiZ3N3IiwiZ3RhIiwiZ3RpIiwiZ3R1IiwiZ3VhIiwiZ3ViIiwiZ3VjIiwiZ3VkIiwiZ3VlIiwiZ3VmIiwiZ3VnIiwiZ3VoIiwiZ3VpIiwiZ3VrIiwiZ3VsIiwiZ3VtIiwiZ3VuIiwiZ3VvIiwiZ3VwIiwiZ3VxIiwiZ3VyIiwiZ3VzIiwiZ3V0IiwiZ3V1IiwiZ3V2IiwiZ3V3IiwiZ3V4IiwiZ3V6IiwiZ3ZhIiwiZ3ZjIiwiZ3ZlIiwiZ3ZmIiwiZ3ZqIiwiZ3ZsIiwiZ3ZtIiwiZ3ZuIiwiZ3ZvIiwiZ3ZwIiwiZ3ZyIiwiZ3ZzIiwiZ3Z5IiwiZ3dhIiwiZ3diIiwiZ3djIiwiZ3dkIiwiZ3dlIiwiZ3dmIiwiZ3dnIiwiZ3dpIiwiZ3dqIiwiZ3dtIiwiZ3duIiwiZ3dyIiwiZ3d0IiwiZ3d1IiwiZ3d3IiwiZ3d4IiwiZ3h4IiwiZ3lhIiwiZ3liIiwiZ3lkIiwiZ3llIiwiZ3lmIiwiZ3lnIiwiZ3lpIiwiZ3lsIiwiZ3ltIiwiZ3luIiwiZ3lyIiwiZ3l5IiwiZ3phIiwiZ3ppIiwiZ3puIiwiaGFhIiwiaGFiIiwiaGFjIiwiaGFkIiwiaGFlIiwiaGFmIiwiaGFnIiwiaGFoIiwiaGFpIiwiaGFqIiwiaGFrIiwiaGFsIiwiaGFtIiwiaGFuIiwiaGFvIiwiaGFwIiwiaGFxIiwiaGFyIiwiaGFzIiwiaGF2IiwiaGF3IiwiaGF4IiwiaGF5IiwiaGF6IiwiaGJhIiwiaGJiIiwiaGJuIiwiaGJvIiwiaGJ1IiwiaGNhIiwiaGNoIiwiaGRuIiwiaGRzIiwiaGR5IiwiaGVhIiwiaGVkIiwiaGVnIiwiaGVoIiwiaGVpIiwiaGVtIiwiaGdtIiwiaGd3IiwiaGhpIiwiaGhyIiwiaGh5IiwiaGlhIiwiaGliIiwiaGlkIiwiaGlmIiwiaGlnIiwiaGloIiwiaGlpIiwiaGlqIiwiaGlrIiwiaGlsIiwiaGltIiwiaGlvIiwiaGlyIiwiaGl0IiwiaGl3IiwiaGl4IiwiaGppIiwiaGthIiwiaGtlIiwiaGtrIiwiaGtzIiwiaGxhIiwiaGxiIiwiaGxkIiwiaGxlIiwiaGx0IiwiaGx1IiwiaG1hIiwiaG1iIiwiaG1jIiwiaG1kIiwiaG1lIiwiaG1mIiwiaG1nIiwiaG1oIiwiaG1pIiwiaG1qIiwiaG1rIiwiaG1sIiwiaG1tIiwiaG1uIiwiaG1wIiwiaG1xIiwiaG1yIiwiaG1zIiwiaG10IiwiaG11IiwiaG12IiwiaG13IiwiaG14IiwiaG15IiwiaG16IiwiaG5hIiwiaG5kIiwiaG5lIiwiaG5oIiwiaG5pIiwiaG5qIiwiaG5uIiwiaG5vIiwiaG5zIiwiaG51IiwiaG9hIiwiaG9iIiwiaG9jIiwiaG9kIiwiaG9lIiwiaG9oIiwiaG9pIiwiaG9qIiwiaG9rIiwiaG9sIiwiaG9tIiwiaG9vIiwiaG9wIiwiaG9yIiwiaG9zIiwiaG90IiwiaG92IiwiaG93IiwiaG95IiwiaG96IiwiaHBvIiwiaHBzIiwiaHJhIiwiaHJjIiwiaHJlIiwiaHJrIiwiaHJtIiwiaHJvIiwiaHJwIiwiaHJyIiwiaHJ0IiwiaHJ1IiwiaHJ3IiwiaHJ4IiwiaHJ6IiwiaHNiIiwiaHNoIiwiaHNsIiwiaHNuIiwiaHNzIiwiaHRpIiwiaHRvIiwiaHRzIiwiaHR1IiwiaHR4IiwiaHViIiwiaHVjIiwiaHVkIiwiaHVlIiwiaHVmIiwiaHVnIiwiaHVoIiwiaHVpIiwiaHVqIiwiaHVrIiwiaHVsIiwiaHVtIiwiaHVvIiwiaHVwIiwiaHVxIiwiaHVyIiwiaHVzIiwiaHV0IiwiaHV1IiwiaHV2IiwiaHV3IiwiaHV4IiwiaHV5IiwiaHV6IiwiaHZjIiwiaHZlIiwiaHZrIiwiaHZuIiwiaHZ2IiwiaHdhIiwiaHdjIiwiaHdvIiwiaHlhIiwiaHl4IiwiaWFpIiwiaWFuIiwiaWFwIiwiaWFyIiwiaWJhIiwiaWJiIiwiaWJkIiwiaWJlIiwiaWJnIiwiaWJoIiwiaWJpIiwiaWJsIiwiaWJtIiwiaWJuIiwiaWJyIiwiaWJ1IiwiaWJ5IiwiaWNhIiwiaWNoIiwiaWNsIiwiaWNyIiwiaWRhIiwiaWRiIiwiaWRjIiwiaWRkIiwiaWRlIiwiaWRpIiwiaWRyIiwiaWRzIiwiaWR0IiwiaWR1IiwiaWZhIiwiaWZiIiwiaWZlIiwiaWZmIiwiaWZrIiwiaWZtIiwiaWZ1IiwiaWZ5IiwiaWdiIiwiaWdlIiwiaWdnIiwiaWdsIiwiaWdtIiwiaWduIiwiaWdvIiwiaWdzIiwiaWd3IiwiaWhiIiwiaWhpIiwiaWhwIiwiaWh3IiwiaWluIiwiaWlyIiwiaWpjIiwiaWplIiwiaWpqIiwiaWpuIiwiaWpvIiwiaWpzIiwiaWtlIiwiaWtpIiwiaWtrIiwiaWtsIiwiaWtvIiwiaWtwIiwiaWtyIiwiaWtzIiwiaWt0IiwiaWt2IiwiaWt3IiwiaWt4IiwiaWt6IiwiaWxhIiwiaWxiIiwiaWxnIiwiaWxpIiwiaWxrIiwiaWxsIiwiaWxtIiwiaWxvIiwiaWxwIiwiaWxzIiwiaWx1IiwiaWx2IiwiaWx3IiwiaW1hIiwiaW1lIiwiaW1pIiwiaW1sIiwiaW1uIiwiaW1vIiwiaW1yIiwiaW1zIiwiaW15IiwiaW5iIiwiaW5jIiwiaW5lIiwiaW5nIiwiaW5oIiwiaW5qIiwiaW5sIiwiaW5tIiwiaW5uIiwiaW5vIiwiaW5wIiwiaW5zIiwiaW50IiwiaW56IiwiaW9yIiwiaW91IiwiaW93IiwiaXBpIiwiaXBvIiwiaXF1IiwiaXF3IiwiaXJhIiwiaXJlIiwiaXJoIiwiaXJpIiwiaXJrIiwiaXJuIiwiaXJvIiwiaXJyIiwiaXJ1IiwiaXJ4IiwiaXJ5IiwiaXNhIiwiaXNjIiwiaXNkIiwiaXNlIiwiaXNnIiwiaXNoIiwiaXNpIiwiaXNrIiwiaXNtIiwiaXNuIiwiaXNvIiwiaXNyIiwiaXN0IiwiaXN1IiwiaXRiIiwiaXRjIiwiaXRkIiwiaXRlIiwiaXRpIiwiaXRrIiwiaXRsIiwiaXRtIiwiaXRvIiwiaXRyIiwiaXRzIiwiaXR0IiwiaXR2IiwiaXR3IiwiaXR4IiwiaXR5IiwiaXR6IiwiaXVtIiwiaXZiIiwiaXZ2IiwiaXdrIiwiaXdtIiwiaXdvIiwiaXdzIiwiaXhjIiwiaXhsIiwiaXlhIiwiaXlvIiwiaXl4IiwiaXpoIiwiaXppIiwiaXpyIiwiaXp6IiwiamFhIiwiamFiIiwiamFjIiwiamFkIiwiamFlIiwiamFmIiwiamFoIiwiamFqIiwiamFrIiwiamFsIiwiamFtIiwiamFuIiwiamFvIiwiamFxIiwiamFyIiwiamFzIiwiamF0IiwiamF1IiwiamF4IiwiamF5IiwiamF6IiwiamJlIiwiamJpIiwiamJqIiwiamJrIiwiamJuIiwiamJvIiwiamJyIiwiamJ0IiwiamJ1IiwiamJ3IiwiamNzIiwiamN0IiwiamRhIiwiamRnIiwiamR0IiwiamViIiwiamVlIiwiamVnIiwiamVoIiwiamVpIiwiamVrIiwiamVsIiwiamVuIiwiamVyIiwiamV0IiwiamV1IiwiamdiIiwiamdlIiwiamdrIiwiamdvIiwiamhpIiwiamhzIiwiamlhIiwiamliIiwiamljIiwiamlkIiwiamllIiwiamlnIiwiamloIiwiamlpIiwiamlsIiwiamltIiwiamlvIiwiamlxIiwiaml0Iiwiaml1Iiwiaml2Iiwiaml5IiwiamplIiwiampyIiwiamthIiwiamttIiwiamtvIiwiamtwIiwiamtyIiwiamt1IiwiamxlIiwiamxzIiwiam1hIiwiam1iIiwiam1jIiwiam1kIiwiam1pIiwiam1sIiwiam1uIiwiam1yIiwiam1zIiwiam13Iiwiam14Iiwiam5hIiwiam5kIiwiam5nIiwiam5pIiwiam5qIiwiam5sIiwiam5zIiwiam9iIiwiam9kIiwiam9nIiwiam9yIiwiam9zIiwiam93IiwianBhIiwianByIiwianB4IiwianFyIiwianJhIiwianJiIiwianJyIiwianJ0IiwianJ1IiwianNsIiwianVhIiwianViIiwianVjIiwianVkIiwianVoIiwianVpIiwianVrIiwianVsIiwianVtIiwianVuIiwianVvIiwianVwIiwianVyIiwianVzIiwianV0IiwianV1IiwianV3IiwianV5IiwianZkIiwianZuIiwiandpIiwianlhIiwianllIiwianl5Iiwia2FhIiwia2FiIiwia2FjIiwia2FkIiwia2FlIiwia2FmIiwia2FnIiwia2FoIiwia2FpIiwia2FqIiwia2FrIiwia2FtIiwia2FvIiwia2FwIiwia2FxIiwia2FyIiwia2F2Iiwia2F3Iiwia2F4Iiwia2F5Iiwia2JhIiwia2JiIiwia2JjIiwia2JkIiwia2JlIiwia2JmIiwia2JnIiwia2JoIiwia2JpIiwia2JqIiwia2JrIiwia2JsIiwia2JtIiwia2JuIiwia2JvIiwia2JwIiwia2JxIiwia2JyIiwia2JzIiwia2J0Iiwia2J1Iiwia2J2Iiwia2J3Iiwia2J4Iiwia2J5Iiwia2J6Iiwia2NhIiwia2NiIiwia2NjIiwia2NkIiwia2NlIiwia2NmIiwia2NnIiwia2NoIiwia2NpIiwia2NqIiwia2NrIiwia2NsIiwia2NtIiwia2NuIiwia2NvIiwia2NwIiwia2NxIiwia2NyIiwia2NzIiwia2N0Iiwia2N1Iiwia2N2Iiwia2N3Iiwia2N4Iiwia2N5Iiwia2N6Iiwia2RhIiwia2RjIiwia2RkIiwia2RlIiwia2RmIiwia2RnIiwia2RoIiwia2RpIiwia2RqIiwia2RrIiwia2RsIiwia2RtIiwia2RuIiwia2RvIiwia2RwIiwia2RxIiwia2RyIiwia2R0Iiwia2R1Iiwia2R2Iiwia2R3Iiwia2R4Iiwia2R5Iiwia2R6Iiwia2VhIiwia2ViIiwia2VjIiwia2VkIiwia2VlIiwia2VmIiwia2VnIiwia2VoIiwia2VpIiwia2VqIiwia2VrIiwia2VsIiwia2VtIiwia2VuIiwia2VvIiwia2VwIiwia2VxIiwia2VyIiwia2VzIiwia2V0Iiwia2V1Iiwia2V2Iiwia2V3Iiwia2V4Iiwia2V5Iiwia2V6Iiwia2ZhIiwia2ZiIiwia2ZjIiwia2ZkIiwia2ZlIiwia2ZmIiwia2ZnIiwia2ZoIiwia2ZpIiwia2ZqIiwia2ZrIiwia2ZsIiwia2ZtIiwia2ZuIiwia2ZvIiwia2ZwIiwia2ZxIiwia2ZyIiwia2ZzIiwia2Z0Iiwia2Z1Iiwia2Z2Iiwia2Z3Iiwia2Z4Iiwia2Z5Iiwia2Z6Iiwia2dhIiwia2diIiwia2djIiwia2dkIiwia2dlIiwia2dmIiwia2dnIiwia2doIiwia2dpIiwia2dqIiwia2drIiwia2dsIiwia2dtIiwia2duIiwia2dvIiwia2dwIiwia2dxIiwia2dyIiwia2dzIiwia2d0Iiwia2d1Iiwia2d2Iiwia2d3Iiwia2d4Iiwia2d5Iiwia2hhIiwia2hiIiwia2hjIiwia2hkIiwia2hlIiwia2hmIiwia2hnIiwia2hoIiwia2hpIiwia2hqIiwia2hrIiwia2hsIiwia2huIiwia2hvIiwia2hwIiwia2hxIiwia2hyIiwia2hzIiwia2h0Iiwia2h1Iiwia2h2Iiwia2h3Iiwia2h4Iiwia2h5Iiwia2h6Iiwia2lhIiwia2liIiwia2ljIiwia2lkIiwia2llIiwia2lmIiwia2lnIiwia2loIiwia2lpIiwia2lqIiwia2lsIiwia2ltIiwia2lvIiwia2lwIiwia2lxIiwia2lzIiwia2l0Iiwia2l1Iiwia2l2Iiwia2l3Iiwia2l4Iiwia2l5Iiwia2l6Iiwia2phIiwia2piIiwia2pjIiwia2pkIiwia2plIiwia2pmIiwia2pnIiwia2poIiwia2ppIiwia2pqIiwia2prIiwia2psIiwia2ptIiwia2puIiwia2pvIiwia2pwIiwia2pxIiwia2pyIiwia2pzIiwia2p0Iiwia2p1Iiwia2p2Iiwia2p4Iiwia2p5Iiwia2p6Iiwia2thIiwia2tiIiwia2tjIiwia2tkIiwia2tlIiwia2tmIiwia2tnIiwia2toIiwia2tpIiwia2tqIiwia2trIiwia2tsIiwia2ttIiwia2tuIiwia2tvIiwia2twIiwia2txIiwia2tyIiwia2tzIiwia2t0Iiwia2t1Iiwia2t2Iiwia2t3Iiwia2t4Iiwia2t5Iiwia2t6Iiwia2xhIiwia2xiIiwia2xjIiwia2xkIiwia2xlIiwia2xmIiwia2xnIiwia2xoIiwia2xpIiwia2xqIiwia2xrIiwia2xsIiwia2xtIiwia2xuIiwia2xvIiwia2xwIiwia2xxIiwia2xyIiwia2xzIiwia2x0Iiwia2x1Iiwia2x2Iiwia2x3Iiwia2x4Iiwia2x5Iiwia2x6Iiwia21hIiwia21iIiwia21jIiwia21kIiwia21lIiwia21mIiwia21nIiwia21oIiwia21pIiwia21qIiwia21rIiwia21sIiwia21tIiwia21uIiwia21vIiwia21wIiwia21xIiwia21yIiwia21zIiwia210Iiwia211Iiwia212Iiwia213Iiwia214Iiwia215Iiwia216Iiwia25hIiwia25iIiwia25jIiwia25kIiwia25lIiwia25mIiwia25nIiwia25pIiwia25qIiwia25rIiwia25sIiwia25tIiwia25uIiwia25vIiwia25wIiwia25xIiwia25yIiwia25zIiwia250Iiwia251Iiwia252Iiwia253Iiwia254Iiwia255Iiwia256Iiwia29hIiwia29jIiwia29kIiwia29lIiwia29mIiwia29nIiwia29oIiwia29pIiwia29qIiwia29rIiwia29sIiwia29vIiwia29wIiwia29xIiwia29zIiwia290Iiwia291Iiwia292Iiwia293Iiwia294Iiwia295Iiwia296Iiwia3BhIiwia3BiIiwia3BjIiwia3BkIiwia3BlIiwia3BmIiwia3BnIiwia3BoIiwia3BpIiwia3BqIiwia3BrIiwia3BsIiwia3BtIiwia3BuIiwia3BvIiwia3BwIiwia3BxIiwia3ByIiwia3BzIiwia3B0Iiwia3B1Iiwia3B2Iiwia3B3Iiwia3B4Iiwia3B5Iiwia3B6Iiwia3FhIiwia3FiIiwia3FjIiwia3FkIiwia3FlIiwia3FmIiwia3FnIiwia3FoIiwia3FpIiwia3FqIiwia3FrIiwia3FsIiwia3FtIiwia3FuIiwia3FvIiwia3FwIiwia3FxIiwia3FyIiwia3FzIiwia3F0Iiwia3F1Iiwia3F2Iiwia3F3Iiwia3F4Iiwia3F5Iiwia3F6Iiwia3JhIiwia3JiIiwia3JjIiwia3JkIiwia3JlIiwia3JmIiwia3JoIiwia3JpIiwia3JqIiwia3JrIiwia3JsIiwia3JtIiwia3JuIiwia3JvIiwia3JwIiwia3JyIiwia3JzIiwia3J0Iiwia3J1Iiwia3J2Iiwia3J3Iiwia3J4Iiwia3J5Iiwia3J6Iiwia3NhIiwia3NiIiwia3NjIiwia3NkIiwia3NlIiwia3NmIiwia3NnIiwia3NoIiwia3NpIiwia3NqIiwia3NrIiwia3NsIiwia3NtIiwia3NuIiwia3NvIiwia3NwIiwia3NxIiwia3NyIiwia3NzIiwia3N0Iiwia3N1Iiwia3N2Iiwia3N3Iiwia3N4Iiwia3N5Iiwia3N6Iiwia3RhIiwia3RiIiwia3RjIiwia3RkIiwia3RlIiwia3RmIiwia3RnIiwia3RoIiwia3RpIiwia3RqIiwia3RrIiwia3RsIiwia3RtIiwia3RuIiwia3RvIiwia3RwIiwia3RxIiwia3RyIiwia3RzIiwia3R0Iiwia3R1Iiwia3R2Iiwia3R3Iiwia3R4Iiwia3R5Iiwia3R6Iiwia3ViIiwia3VjIiwia3VkIiwia3VlIiwia3VmIiwia3VnIiwia3VoIiwia3VpIiwia3VqIiwia3VrIiwia3VsIiwia3VtIiwia3VuIiwia3VvIiwia3VwIiwia3VxIiwia3VzIiwia3V0Iiwia3V1Iiwia3V2Iiwia3V3Iiwia3V4Iiwia3V5Iiwia3V6Iiwia3ZhIiwia3ZiIiwia3ZjIiwia3ZkIiwia3ZlIiwia3ZmIiwia3ZnIiwia3ZoIiwia3ZpIiwia3ZqIiwia3ZrIiwia3ZsIiwia3ZtIiwia3ZuIiwia3ZvIiwia3ZwIiwia3ZxIiwia3ZyIiwia3ZzIiwia3Z0Iiwia3Z1Iiwia3Z2Iiwia3Z3Iiwia3Z4Iiwia3Z5Iiwia3Z6Iiwia3dhIiwia3diIiwia3djIiwia3dkIiwia3dlIiwia3dmIiwia3dnIiwia3doIiwia3dpIiwia3dqIiwia3drIiwia3dsIiwia3dtIiwia3duIiwia3dvIiwia3dwIiwia3dxIiwia3dyIiwia3dzIiwia3d0Iiwia3d1Iiwia3d2Iiwia3d3Iiwia3d4Iiwia3d5Iiwia3d6Iiwia3hhIiwia3hiIiwia3hjIiwia3hkIiwia3hlIiwia3hmIiwia3hoIiwia3hpIiwia3hqIiwia3hrIiwia3hsIiwia3htIiwia3huIiwia3hvIiwia3hwIiwia3hxIiwia3hyIiwia3hzIiwia3h0Iiwia3h1Iiwia3h2Iiwia3h3Iiwia3h4Iiwia3h5Iiwia3h6Iiwia3lhIiwia3liIiwia3ljIiwia3lkIiwia3llIiwia3lmIiwia3lnIiwia3loIiwia3lpIiwia3lqIiwia3lrIiwia3lsIiwia3ltIiwia3luIiwia3lvIiwia3lwIiwia3lxIiwia3lyIiwia3lzIiwia3l0Iiwia3l1Iiwia3l2Iiwia3l3Iiwia3l4Iiwia3l5Iiwia3l6Iiwia3phIiwia3piIiwia3pjIiwia3pkIiwia3plIiwia3pmIiwia3pnIiwia3poIiwia3ppIiwia3pqIiwia3prIiwia3psIiwia3ptIiwia3puIiwia3pvIiwia3pwIiwia3pxIiwia3pyIiwia3pzIiwia3p0Iiwia3p1Iiwia3p2Iiwia3p3Iiwia3p4Iiwia3p5Iiwia3p6IiwibGFhIiwibGFiIiwibGFjIiwibGFkIiwibGFlIiwibGFmIiwibGFnIiwibGFoIiwibGFpIiwibGFqIiwibGFrIiwibGFsIiwibGFtIiwibGFuIiwibGFwIiwibGFxIiwibGFyIiwibGFzIiwibGF1IiwibGF3IiwibGF4IiwibGF5IiwibGF6IiwibGJhIiwibGJiIiwibGJjIiwibGJlIiwibGJmIiwibGJnIiwibGJpIiwibGJqIiwibGJrIiwibGJsIiwibGJtIiwibGJuIiwibGJvIiwibGJxIiwibGJyIiwibGJzIiwibGJ0IiwibGJ1IiwibGJ2IiwibGJ3IiwibGJ4IiwibGJ5IiwibGJ6IiwibGNjIiwibGNkIiwibGNlIiwibGNmIiwibGNoIiwibGNsIiwibGNtIiwibGNwIiwibGNxIiwibGNzIiwibGRhIiwibGRiIiwibGRkIiwibGRnIiwibGRoIiwibGRpIiwibGRqIiwibGRrIiwibGRsIiwibGRtIiwibGRuIiwibGRvIiwibGRwIiwibGRxIiwibGVhIiwibGViIiwibGVjIiwibGVkIiwibGVlIiwibGVmIiwibGVnIiwibGVoIiwibGVpIiwibGVqIiwibGVrIiwibGVsIiwibGVtIiwibGVuIiwibGVvIiwibGVwIiwibGVxIiwibGVyIiwibGVzIiwibGV0IiwibGV1IiwibGV2IiwibGV3IiwibGV4IiwibGV5IiwibGV6IiwibGZhIiwibGZuIiwibGdhIiwibGdiIiwibGdnIiwibGdoIiwibGdpIiwibGdrIiwibGdsIiwibGdtIiwibGduIiwibGdxIiwibGdyIiwibGd0IiwibGd1IiwibGd6IiwibGhhIiwibGhoIiwibGhpIiwibGhsIiwibGhtIiwibGhuIiwibGhwIiwibGhzIiwibGh0IiwibGh1IiwibGlhIiwibGliIiwibGljIiwibGlkIiwibGllIiwibGlmIiwibGlnIiwibGloIiwibGlpIiwibGlqIiwibGlrIiwibGlsIiwibGlvIiwibGlwIiwibGlxIiwibGlyIiwibGlzIiwibGl1IiwibGl2IiwibGl3IiwibGl4IiwibGl5IiwibGl6IiwibGphIiwibGplIiwibGppIiwibGpsIiwibGpwIiwibGp3IiwibGp4IiwibGthIiwibGtiIiwibGtjIiwibGtkIiwibGtlIiwibGtoIiwibGtpIiwibGtqIiwibGtsIiwibGttIiwibGtuIiwibGtvIiwibGtyIiwibGtzIiwibGt0IiwibGt1IiwibGt5IiwibGxhIiwibGxiIiwibGxjIiwibGxkIiwibGxlIiwibGxmIiwibGxnIiwibGxoIiwibGxpIiwibGxqIiwibGxrIiwibGxsIiwibGxtIiwibGxuIiwibGxvIiwibGxwIiwibGxxIiwibGxzIiwibGx1IiwibGx4IiwibG1hIiwibG1iIiwibG1jIiwibG1kIiwibG1lIiwibG1mIiwibG1nIiwibG1oIiwibG1pIiwibG1qIiwibG1rIiwibG1sIiwibG1tIiwibG1uIiwibG1vIiwibG1wIiwibG1xIiwibG1yIiwibG11IiwibG12IiwibG13IiwibG14IiwibG15IiwibG16IiwibG5hIiwibG5iIiwibG5kIiwibG5nIiwibG5oIiwibG5pIiwibG5qIiwibG5sIiwibG5tIiwibG5uIiwibG5vIiwibG5zIiwibG51IiwibG53IiwibG56IiwibG9hIiwibG9iIiwibG9jIiwibG9lIiwibG9mIiwibG9nIiwibG9oIiwibG9pIiwibG9qIiwibG9rIiwibG9sIiwibG9tIiwibG9uIiwibG9vIiwibG9wIiwibG9xIiwibG9yIiwibG9zIiwibG90IiwibG91IiwibG92IiwibG93IiwibG94IiwibG95IiwibG96IiwibHBhIiwibHBlIiwibHBuIiwibHBvIiwibHB4IiwibHJhIiwibHJjIiwibHJlIiwibHJnIiwibHJpIiwibHJrIiwibHJsIiwibHJtIiwibHJuIiwibHJvIiwibHJyIiwibHJ0IiwibHJ2IiwibHJ6IiwibHNhIiwibHNkIiwibHNlIiwibHNnIiwibHNoIiwibHNpIiwibHNsIiwibHNtIiwibHNvIiwibHNwIiwibHNyIiwibHNzIiwibHN0IiwibHN5IiwibHRjIiwibHRnIiwibHRoIiwibHRpIiwibHRuIiwibHRvIiwibHRzIiwibHR1IiwibHVhIiwibHVjIiwibHVkIiwibHVlIiwibHVmIiwibHVpIiwibHVqIiwibHVrIiwibHVsIiwibHVtIiwibHVuIiwibHVvIiwibHVwIiwibHVxIiwibHVyIiwibHVzIiwibHV0IiwibHV1IiwibHV2IiwibHV3IiwibHV5IiwibHV6IiwibHZhIiwibHZrIiwibHZzIiwibHZ1IiwibHdhIiwibHdlIiwibHdnIiwibHdoIiwibHdsIiwibHdtIiwibHdvIiwibHd0IiwibHd1IiwibHd3IiwibHlhIiwibHlnIiwibHluIiwibHpoIiwibHpsIiwibHpuIiwibHp6IiwibWFhIiwibWFiIiwibWFkIiwibWFlIiwibWFmIiwibWFnIiwibWFpIiwibWFqIiwibWFrIiwibWFtIiwibWFuIiwibWFwIiwibWFxIiwibWFzIiwibWF0IiwibWF1IiwibWF2IiwibWF3IiwibWF4IiwibWF6IiwibWJhIiwibWJiIiwibWJjIiwibWJkIiwibWJlIiwibWJmIiwibWJoIiwibWJpIiwibWJqIiwibWJrIiwibWJsIiwibWJtIiwibWJuIiwibWJvIiwibWJwIiwibWJxIiwibWJyIiwibWJzIiwibWJ0IiwibWJ1IiwibWJ2IiwibWJ3IiwibWJ4IiwibWJ5IiwibWJ6IiwibWNhIiwibWNiIiwibWNjIiwibWNkIiwibWNlIiwibWNmIiwibWNnIiwibWNoIiwibWNpIiwibWNqIiwibWNrIiwibWNsIiwibWNtIiwibWNuIiwibWNvIiwibWNwIiwibWNxIiwibWNyIiwibWNzIiwibWN0IiwibWN1IiwibWN2IiwibWN3IiwibWN4IiwibWN5IiwibWN6IiwibWRhIiwibWRiIiwibWRjIiwibWRkIiwibWRlIiwibWRmIiwibWRnIiwibWRoIiwibWRpIiwibWRqIiwibWRrIiwibWRsIiwibWRtIiwibWRuIiwibWRwIiwibWRxIiwibWRyIiwibWRzIiwibWR0IiwibWR1IiwibWR2IiwibWR3IiwibWR4IiwibWR5IiwibWR6IiwibWVhIiwibWViIiwibWVjIiwibWVkIiwibWVlIiwibWVmIiwibWVnIiwibWVoIiwibWVpIiwibWVqIiwibWVrIiwibWVsIiwibWVtIiwibWVuIiwibWVvIiwibWVwIiwibWVxIiwibWVyIiwibWVzIiwibWV0IiwibWV1IiwibWV2IiwibWV3IiwibWV5IiwibWV6IiwibWZhIiwibWZiIiwibWZjIiwibWZkIiwibWZlIiwibWZmIiwibWZnIiwibWZoIiwibWZpIiwibWZqIiwibWZrIiwibWZsIiwibWZtIiwibWZuIiwibWZvIiwibWZwIiwibWZxIiwibWZyIiwibWZzIiwibWZ0IiwibWZ1IiwibWZ2IiwibWZ3IiwibWZ4IiwibWZ5IiwibWZ6IiwibWdhIiwibWdiIiwibWdjIiwibWdkIiwibWdlIiwibWdmIiwibWdnIiwibWdoIiwibWdpIiwibWdqIiwibWdrIiwibWdsIiwibWdtIiwibWduIiwibWdvIiwibWdwIiwibWdxIiwibWdyIiwibWdzIiwibWd0IiwibWd1IiwibWd2IiwibWd3IiwibWd4IiwibWd5IiwibWd6IiwibWhhIiwibWhiIiwibWhjIiwibWhkIiwibWhlIiwibWhmIiwibWhnIiwibWhoIiwibWhpIiwibWhqIiwibWhrIiwibWhsIiwibWhtIiwibWhuIiwibWhvIiwibWhwIiwibWhxIiwibWhyIiwibWhzIiwibWh0IiwibWh1IiwibWh3IiwibWh4IiwibWh5IiwibWh6IiwibWlhIiwibWliIiwibWljIiwibWlkIiwibWllIiwibWlmIiwibWlnIiwibWloIiwibWlpIiwibWlqIiwibWlrIiwibWlsIiwibWltIiwibWluIiwibWlvIiwibWlwIiwibWlxIiwibWlyIiwibWlzIiwibWl0IiwibWl1IiwibWl3IiwibWl4IiwibWl5IiwibWl6IiwibWphIiwibWpiIiwibWpjIiwibWpkIiwibWplIiwibWpnIiwibWpoIiwibWppIiwibWpqIiwibWprIiwibWpsIiwibWptIiwibWpuIiwibWpvIiwibWpwIiwibWpxIiwibWpyIiwibWpzIiwibWp0IiwibWp1IiwibWp2IiwibWp3IiwibWp4IiwibWp5IiwibWp6IiwibWthIiwibWtiIiwibWtjIiwibWtlIiwibWtmIiwibWtnIiwibWtoIiwibWtpIiwibWtqIiwibWtrIiwibWtsIiwibWttIiwibWtuIiwibWtvIiwibWtwIiwibWtxIiwibWtyIiwibWtzIiwibWt0IiwibWt1IiwibWt2IiwibWt3IiwibWt4IiwibWt5IiwibWt6IiwibWxhIiwibWxiIiwibWxjIiwibWxkIiwibWxlIiwibWxmIiwibWxoIiwibWxpIiwibWxqIiwibWxrIiwibWxsIiwibWxtIiwibWxuIiwibWxvIiwibWxwIiwibWxxIiwibWxyIiwibWxzIiwibWx1IiwibWx2IiwibWx3IiwibWx4IiwibWx6IiwibW1hIiwibW1iIiwibW1jIiwibW1kIiwibW1lIiwibW1mIiwibW1nIiwibW1oIiwibW1pIiwibW1qIiwibW1rIiwibW1sIiwibW1tIiwibW1uIiwibW1vIiwibW1wIiwibW1xIiwibW1yIiwibW10IiwibW11IiwibW12IiwibW13IiwibW14IiwibW15IiwibW16IiwibW5hIiwibW5iIiwibW5jIiwibW5kIiwibW5lIiwibW5mIiwibW5nIiwibW5oIiwibW5pIiwibW5qIiwibW5rIiwibW5sIiwibW5tIiwibW5uIiwibW5vIiwibW5wIiwibW5xIiwibW5yIiwibW5zIiwibW50IiwibW51IiwibW52IiwibW53IiwibW54IiwibW55IiwibW56IiwibW9hIiwibW9jIiwibW9kIiwibW9lIiwibW9mIiwibW9nIiwibW9oIiwibW9pIiwibW9qIiwibW9rIiwibW9tIiwibW9vIiwibW9wIiwibW9xIiwibW9yIiwibW9zIiwibW90IiwibW91IiwibW92IiwibW93IiwibW94IiwibW95IiwibW96IiwibXBhIiwibXBiIiwibXBjIiwibXBkIiwibXBlIiwibXBnIiwibXBoIiwibXBpIiwibXBqIiwibXBrIiwibXBsIiwibXBtIiwibXBuIiwibXBvIiwibXBwIiwibXBxIiwibXByIiwibXBzIiwibXB0IiwibXB1IiwibXB2IiwibXB3IiwibXB4IiwibXB5IiwibXB6IiwibXFhIiwibXFiIiwibXFjIiwibXFlIiwibXFmIiwibXFnIiwibXFoIiwibXFpIiwibXFqIiwibXFrIiwibXFsIiwibXFtIiwibXFuIiwibXFvIiwibXFwIiwibXFxIiwibXFyIiwibXFzIiwibXF0IiwibXF1IiwibXF2IiwibXF3IiwibXF4IiwibXF5IiwibXF6IiwibXJhIiwibXJiIiwibXJjIiwibXJkIiwibXJlIiwibXJmIiwibXJnIiwibXJoIiwibXJqIiwibXJrIiwibXJsIiwibXJtIiwibXJuIiwibXJvIiwibXJwIiwibXJxIiwibXJyIiwibXJzIiwibXJ0IiwibXJ1IiwibXJ2IiwibXJ3IiwibXJ4IiwibXJ5IiwibXJ6IiwibXNiIiwibXNjIiwibXNkIiwibXNlIiwibXNmIiwibXNnIiwibXNoIiwibXNpIiwibXNqIiwibXNrIiwibXNsIiwibXNtIiwibXNuIiwibXNvIiwibXNwIiwibXNxIiwibXNyIiwibXNzIiwibXN0IiwibXN1IiwibXN2IiwibXN3IiwibXN4IiwibXN5IiwibXN6IiwibXRhIiwibXRiIiwibXRjIiwibXRkIiwibXRlIiwibXRmIiwibXRnIiwibXRoIiwibXRpIiwibXRqIiwibXRrIiwibXRsIiwibXRtIiwibXRuIiwibXRvIiwibXRwIiwibXRxIiwibXRyIiwibXRzIiwibXR0IiwibXR1IiwibXR2IiwibXR3IiwibXR4IiwibXR5IiwibXVhIiwibXViIiwibXVjIiwibXVkIiwibXVlIiwibXVnIiwibXVoIiwibXVpIiwibXVqIiwibXVrIiwibXVsIiwibXVtIiwibXVuIiwibXVvIiwibXVwIiwibXVxIiwibXVyIiwibXVzIiwibXV0IiwibXV1IiwibXV2IiwibXV4IiwibXV5IiwibXV6IiwibXZhIiwibXZiIiwibXZkIiwibXZlIiwibXZmIiwibXZnIiwibXZoIiwibXZpIiwibXZrIiwibXZsIiwibXZtIiwibXZuIiwibXZvIiwibXZwIiwibXZxIiwibXZyIiwibXZzIiwibXZ0IiwibXZ1IiwibXZ2IiwibXZ3IiwibXZ4IiwibXZ5IiwibXZ6IiwibXdhIiwibXdiIiwibXdjIiwibXdkIiwibXdlIiwibXdmIiwibXdnIiwibXdoIiwibXdpIiwibXdqIiwibXdrIiwibXdsIiwibXdtIiwibXduIiwibXdvIiwibXdwIiwibXdxIiwibXdyIiwibXdzIiwibXd0IiwibXd1IiwibXd2IiwibXd3IiwibXd4IiwibXd5IiwibXd6IiwibXhhIiwibXhiIiwibXhjIiwibXhkIiwibXhlIiwibXhmIiwibXhnIiwibXhoIiwibXhpIiwibXhqIiwibXhrIiwibXhsIiwibXhtIiwibXhuIiwibXhvIiwibXhwIiwibXhxIiwibXhyIiwibXhzIiwibXh0IiwibXh1IiwibXh2IiwibXh3IiwibXh4IiwibXh5IiwibXh6IiwibXliIiwibXljIiwibXlkIiwibXllIiwibXlmIiwibXlnIiwibXloIiwibXlpIiwibXlqIiwibXlrIiwibXlsIiwibXltIiwibXluIiwibXlvIiwibXlwIiwibXlxIiwibXlyIiwibXlzIiwibXl0IiwibXl1IiwibXl2IiwibXl3IiwibXl4IiwibXl5IiwibXl6IiwibXphIiwibXpiIiwibXpjIiwibXpkIiwibXplIiwibXpnIiwibXpoIiwibXppIiwibXpqIiwibXprIiwibXpsIiwibXptIiwibXpuIiwibXpvIiwibXpwIiwibXpxIiwibXpyIiwibXpzIiwibXp0IiwibXp1IiwibXp2IiwibXp3IiwibXp4IiwibXp5IiwibXp6IiwibmFhIiwibmFiIiwibmFjIiwibmFkIiwibmFlIiwibmFmIiwibmFnIiwibmFoIiwibmFpIiwibmFqIiwibmFrIiwibmFsIiwibmFtIiwibmFuIiwibmFvIiwibmFwIiwibmFxIiwibmFyIiwibmFzIiwibmF0IiwibmF3IiwibmF4IiwibmF5IiwibmF6IiwibmJhIiwibmJiIiwibmJjIiwibmJkIiwibmJlIiwibmJmIiwibmJnIiwibmJoIiwibmJpIiwibmJqIiwibmJrIiwibmJtIiwibmJuIiwibmJvIiwibmJwIiwibmJxIiwibmJyIiwibmJzIiwibmJ0IiwibmJ1IiwibmJ2IiwibmJ3IiwibmJ4IiwibmJ5IiwibmNhIiwibmNiIiwibmNjIiwibmNkIiwibmNlIiwibmNmIiwibmNnIiwibmNoIiwibmNpIiwibmNqIiwibmNrIiwibmNsIiwibmNtIiwibmNuIiwibmNvIiwibmNwIiwibmNxIiwibmNyIiwibmNzIiwibmN0IiwibmN1IiwibmN4IiwibmN6IiwibmRhIiwibmRiIiwibmRjIiwibmRkIiwibmRmIiwibmRnIiwibmRoIiwibmRpIiwibmRqIiwibmRrIiwibmRsIiwibmRtIiwibmRuIiwibmRwIiwibmRxIiwibmRyIiwibmRzIiwibmR0IiwibmR1IiwibmR2IiwibmR3IiwibmR4IiwibmR5IiwibmR6IiwibmVhIiwibmViIiwibmVjIiwibmVkIiwibmVlIiwibmVmIiwibmVnIiwibmVoIiwibmVpIiwibmVqIiwibmVrIiwibmVtIiwibmVuIiwibmVvIiwibmVxIiwibmVyIiwibmVzIiwibmV0IiwibmV1IiwibmV2IiwibmV3IiwibmV4IiwibmV5IiwibmV6IiwibmZhIiwibmZkIiwibmZsIiwibmZyIiwibmZ1IiwibmdhIiwibmdiIiwibmdjIiwibmdkIiwibmdlIiwibmdmIiwibmdnIiwibmdoIiwibmdpIiwibmdqIiwibmdrIiwibmdsIiwibmdtIiwibmduIiwibmdvIiwibmdwIiwibmdxIiwibmdyIiwibmdzIiwibmd0Iiwibmd1Iiwibmd2Iiwibmd3Iiwibmd4Iiwibmd5Iiwibmd6IiwibmhhIiwibmhiIiwibmhjIiwibmhkIiwibmhlIiwibmhmIiwibmhnIiwibmhoIiwibmhpIiwibmhrIiwibmhtIiwibmhuIiwibmhvIiwibmhwIiwibmhxIiwibmhyIiwibmh0Iiwibmh1Iiwibmh2Iiwibmh3Iiwibmh4Iiwibmh5Iiwibmh6IiwibmlhIiwibmliIiwibmljIiwibmlkIiwibmllIiwibmlmIiwibmlnIiwibmloIiwibmlpIiwibmlqIiwibmlrIiwibmlsIiwibmltIiwibmluIiwibmlvIiwibmlxIiwibmlyIiwibmlzIiwibml0Iiwibml1Iiwibml2Iiwibml3Iiwibml4Iiwibml5Iiwibml6IiwibmphIiwibmpiIiwibmpkIiwibmpoIiwibmppIiwibmpqIiwibmpsIiwibmptIiwibmpuIiwibmpvIiwibmpyIiwibmpzIiwibmp0Iiwibmp1Iiwibmp4Iiwibmp5Iiwibmp6IiwibmthIiwibmtiIiwibmtjIiwibmtkIiwibmtlIiwibmtmIiwibmtnIiwibmtoIiwibmtpIiwibmtqIiwibmtrIiwibmttIiwibmtuIiwibmtvIiwibmtwIiwibmtxIiwibmtyIiwibmtzIiwibmt0Iiwibmt1Iiwibmt2Iiwibmt3Iiwibmt4Iiwibmt6IiwibmxhIiwibmxjIiwibmxlIiwibmxnIiwibmxpIiwibmxqIiwibmxrIiwibmxsIiwibmxuIiwibmxvIiwibmxxIiwibmxyIiwibmx1Iiwibmx2Iiwibmx3Iiwibmx4Iiwibmx5Iiwibmx6Iiwibm1hIiwibm1iIiwibm1jIiwibm1kIiwibm1lIiwibm1mIiwibm1nIiwibm1oIiwibm1pIiwibm1qIiwibm1rIiwibm1sIiwibm1tIiwibm1uIiwibm1vIiwibm1wIiwibm1xIiwibm1yIiwibm1zIiwibm10Iiwibm11Iiwibm12Iiwibm13Iiwibm14Iiwibm15Iiwibm16Iiwibm5hIiwibm5iIiwibm5jIiwibm5kIiwibm5lIiwibm5mIiwibm5nIiwibm5oIiwibm5pIiwibm5qIiwibm5rIiwibm5sIiwibm5tIiwibm5uIiwibm5wIiwibm5xIiwibm5yIiwibm5zIiwibm50Iiwibm51Iiwibm52Iiwibm53Iiwibm54Iiwibm55Iiwibm56Iiwibm9hIiwibm9jIiwibm9kIiwibm9lIiwibm9mIiwibm9nIiwibm9oIiwibm9pIiwibm9qIiwibm9rIiwibm9sIiwibm9tIiwibm9uIiwibm9vIiwibm9wIiwibm9xIiwibm9zIiwibm90Iiwibm91Iiwibm92Iiwibm93Iiwibm95Iiwibm96IiwibnBhIiwibnBiIiwibnBnIiwibnBoIiwibnBpIiwibnBsIiwibnBuIiwibnBvIiwibnBzIiwibnB1IiwibnB4IiwibnB5IiwibnFnIiwibnFrIiwibnFsIiwibnFtIiwibnFuIiwibnFvIiwibnFxIiwibnF5IiwibnJhIiwibnJiIiwibnJjIiwibnJlIiwibnJmIiwibnJnIiwibnJpIiwibnJrIiwibnJsIiwibnJtIiwibnJuIiwibnJwIiwibnJyIiwibnJ0IiwibnJ1IiwibnJ4IiwibnJ6IiwibnNhIiwibnNjIiwibnNkIiwibnNlIiwibnNmIiwibnNnIiwibnNoIiwibnNpIiwibnNrIiwibnNsIiwibnNtIiwibnNuIiwibnNvIiwibnNwIiwibnNxIiwibnNyIiwibnNzIiwibnN0IiwibnN1IiwibnN2IiwibnN3IiwibnN4IiwibnN5IiwibnN6IiwibnRkIiwibnRlIiwibnRnIiwibnRpIiwibnRqIiwibnRrIiwibnRtIiwibnRvIiwibnRwIiwibnRyIiwibnRzIiwibnR1IiwibnR3IiwibnR4IiwibnR5IiwibnR6IiwibnVhIiwibnViIiwibnVjIiwibnVkIiwibnVlIiwibnVmIiwibnVnIiwibnVoIiwibnVpIiwibnVqIiwibnVrIiwibnVsIiwibnVtIiwibnVuIiwibnVvIiwibnVwIiwibnVxIiwibnVyIiwibnVzIiwibnV0IiwibnV1IiwibnV2IiwibnV3IiwibnV4IiwibnV5IiwibnV6IiwibnZoIiwibnZtIiwibnZvIiwibndhIiwibndiIiwibndjIiwibndlIiwibndnIiwibndpIiwibndtIiwibndvIiwibndyIiwibnd4Iiwibnd5IiwibnhhIiwibnhkIiwibnhlIiwibnhnIiwibnhpIiwibnhrIiwibnhsIiwibnhtIiwibnhuIiwibnhvIiwibnhxIiwibnhyIiwibnh1Iiwibnh4IiwibnliIiwibnljIiwibnlkIiwibnllIiwibnlmIiwibnlnIiwibnloIiwibnlpIiwibnlqIiwibnlrIiwibnlsIiwibnltIiwibnluIiwibnlvIiwibnlwIiwibnlxIiwibnlyIiwibnlzIiwibnl0Iiwibnl1Iiwibnl2Iiwibnl3Iiwibnl4Iiwibnl5IiwibnphIiwibnpiIiwibnppIiwibnprIiwibnptIiwibnpzIiwibnp1Iiwibnp5Iiwibnp6Iiwib2FhIiwib2FjIiwib2FyIiwib2F2Iiwib2JpIiwib2JrIiwib2JsIiwib2JtIiwib2JvIiwib2JyIiwib2J0Iiwib2J1Iiwib2NhIiwib2NoIiwib2NvIiwib2N1Iiwib2RhIiwib2RrIiwib2R0Iiwib2R1Iiwib2ZvIiwib2ZzIiwib2Z1Iiwib2diIiwib2djIiwib2dlIiwib2dnIiwib2dvIiwib2d1Iiwib2h0Iiwib2h1Iiwib2lhIiwib2luIiwib2piIiwib2pjIiwib2pnIiwib2pwIiwib2pzIiwib2p2Iiwib2p3Iiwib2thIiwib2tiIiwib2tkIiwib2tlIiwib2tnIiwib2toIiwib2tpIiwib2tqIiwib2trIiwib2tsIiwib2ttIiwib2tuIiwib2tvIiwib2tyIiwib2tzIiwib2t1Iiwib2t2Iiwib2t4Iiwib2xhIiwib2xkIiwib2xlIiwib2xrIiwib2xtIiwib2xvIiwib2xyIiwib2x0Iiwib2x1Iiwib21hIiwib21iIiwib21jIiwib21lIiwib21nIiwib21pIiwib21rIiwib21sIiwib21uIiwib21vIiwib21wIiwib21xIiwib21yIiwib210Iiwib211Iiwib212Iiwib213Iiwib214Iiwib25hIiwib25iIiwib25lIiwib25nIiwib25pIiwib25qIiwib25rIiwib25uIiwib25vIiwib25wIiwib25yIiwib25zIiwib250Iiwib251Iiwib253Iiwib254Iiwib29kIiwib29nIiwib29uIiwib29yIiwib29zIiwib3BhIiwib3BrIiwib3BtIiwib3BvIiwib3B0Iiwib3B5Iiwib3JhIiwib3JjIiwib3JlIiwib3JnIiwib3JoIiwib3JuIiwib3JvIiwib3JyIiwib3JzIiwib3J0Iiwib3J1Iiwib3J2Iiwib3J3Iiwib3J4Iiwib3J5Iiwib3J6Iiwib3NhIiwib3NjIiwib3NpIiwib3NvIiwib3NwIiwib3N0Iiwib3N1Iiwib3N4Iiwib3RhIiwib3RiIiwib3RkIiwib3RlIiwib3RpIiwib3RrIiwib3RsIiwib3RtIiwib3RuIiwib3RvIiwib3RxIiwib3RyIiwib3RzIiwib3R0Iiwib3R1Iiwib3R3Iiwib3R4Iiwib3R5Iiwib3R6Iiwib3VhIiwib3ViIiwib3VlIiwib3VpIiwib3VtIiwib3VuIiwib3ZkIiwib3dpIiwib3dsIiwib3liIiwib3lkIiwib3ltIiwib3l5Iiwib3ptIiwicGFhIiwicGFiIiwicGFjIiwicGFkIiwicGFlIiwicGFmIiwicGFnIiwicGFoIiwicGFpIiwicGFrIiwicGFsIiwicGFtIiwicGFvIiwicGFwIiwicGFxIiwicGFyIiwicGFzIiwicGF0IiwicGF1IiwicGF2IiwicGF3IiwicGF4IiwicGF5IiwicGF6IiwicGJiIiwicGJjIiwicGJlIiwicGJmIiwicGJnIiwicGJoIiwicGJpIiwicGJsIiwicGJuIiwicGJvIiwicGJwIiwicGJyIiwicGJzIiwicGJ0IiwicGJ1IiwicGJ2IiwicGJ5IiwicGJ6IiwicGNhIiwicGNiIiwicGNjIiwicGNkIiwicGNlIiwicGNmIiwicGNnIiwicGNoIiwicGNpIiwicGNqIiwicGNrIiwicGNsIiwicGNtIiwicGNuIiwicGNwIiwicGNyIiwicGN3IiwicGRhIiwicGRjIiwicGRpIiwicGRuIiwicGRvIiwicGR0IiwicGR1IiwicGVhIiwicGViIiwicGVkIiwicGVlIiwicGVmIiwicGVnIiwicGVoIiwicGVpIiwicGVqIiwicGVrIiwicGVsIiwicGVtIiwicGVvIiwicGVwIiwicGVxIiwicGVzIiwicGV2IiwicGV4IiwicGV5IiwicGV6IiwicGZhIiwicGZlIiwicGZsIiwicGdhIiwicGdkIiwicGdnIiwicGdpIiwicGdrIiwicGdsIiwicGduIiwicGdzIiwicGd1IiwicGd5IiwicGd6IiwicGhhIiwicGhkIiwicGhnIiwicGhoIiwicGhpIiwicGhrIiwicGhsIiwicGhtIiwicGhuIiwicGhvIiwicGhxIiwicGhyIiwicGh0IiwicGh1IiwicGh2IiwicGh3IiwicGlhIiwicGliIiwicGljIiwicGlkIiwicGllIiwicGlmIiwicGlnIiwicGloIiwicGlpIiwicGlqIiwicGlsIiwicGltIiwicGluIiwicGlvIiwicGlwIiwicGlyIiwicGlzIiwicGl0IiwicGl1IiwicGl2IiwicGl3IiwicGl4IiwicGl5IiwicGl6IiwicGp0IiwicGthIiwicGtiIiwicGtjIiwicGtnIiwicGtoIiwicGtuIiwicGtvIiwicGtwIiwicGtyIiwicGtzIiwicGt0IiwicGt1IiwicGxhIiwicGxiIiwicGxjIiwicGxkIiwicGxlIiwicGxmIiwicGxnIiwicGxoIiwicGxqIiwicGxrIiwicGxsIiwicGxuIiwicGxvIiwicGxwIiwicGxxIiwicGxyIiwicGxzIiwicGx0IiwicGx1IiwicGx2IiwicGx3IiwicGx5IiwicGx6IiwicG1hIiwicG1iIiwicG1jIiwicG1kIiwicG1lIiwicG1mIiwicG1oIiwicG1pIiwicG1qIiwicG1rIiwicG1sIiwicG1tIiwicG1uIiwicG1vIiwicG1xIiwicG1yIiwicG1zIiwicG10IiwicG11IiwicG13IiwicG14IiwicG15IiwicG16IiwicG5hIiwicG5iIiwicG5jIiwicG5lIiwicG5nIiwicG5oIiwicG5pIiwicG5qIiwicG5rIiwicG5sIiwicG5tIiwicG5uIiwicG5vIiwicG5wIiwicG5xIiwicG5yIiwicG5zIiwicG50IiwicG51IiwicG52IiwicG53IiwicG54IiwicG55IiwicG56IiwicG9jIiwicG9kIiwicG9lIiwicG9mIiwicG9nIiwicG9oIiwicG9pIiwicG9rIiwicG9tIiwicG9uIiwicG9vIiwicG9wIiwicG9xIiwicG9zIiwicG90IiwicG92IiwicG93IiwicG94IiwicG95IiwicG96IiwicHBhIiwicHBlIiwicHBpIiwicHBrIiwicHBsIiwicHBtIiwicHBuIiwicHBvIiwicHBwIiwicHBxIiwicHByIiwicHBzIiwicHB0IiwicHB1IiwicHFhIiwicHFlIiwicHFtIiwicHF3IiwicHJhIiwicHJiIiwicHJjIiwicHJkIiwicHJlIiwicHJmIiwicHJnIiwicHJoIiwicHJpIiwicHJrIiwicHJsIiwicHJtIiwicHJuIiwicHJvIiwicHJwIiwicHJxIiwicHJyIiwicHJzIiwicHJ0IiwicHJ1IiwicHJ3IiwicHJ4IiwicHJ5IiwicHJ6IiwicHNhIiwicHNjIiwicHNkIiwicHNlIiwicHNnIiwicHNoIiwicHNpIiwicHNsIiwicHNtIiwicHNuIiwicHNvIiwicHNwIiwicHNxIiwicHNyIiwicHNzIiwicHN0IiwicHN1IiwicHN3IiwicHN5IiwicHRhIiwicHRoIiwicHRpIiwicHRuIiwicHRvIiwicHRwIiwicHRxIiwicHRyIiwicHR0IiwicHR1IiwicHR2IiwicHR3IiwicHR5IiwicHVhIiwicHViIiwicHVjIiwicHVkIiwicHVlIiwicHVmIiwicHVnIiwicHVpIiwicHVqIiwicHVrIiwicHVtIiwicHVvIiwicHVwIiwicHVxIiwicHVyIiwicHV0IiwicHV1IiwicHV3IiwicHV4IiwicHV5IiwicHV6IiwicHdhIiwicHdiIiwicHdnIiwicHdpIiwicHdtIiwicHduIiwicHdvIiwicHdyIiwicHd3IiwicHhtIiwicHllIiwicHltIiwicHluIiwicHlzIiwicHl1IiwicHl4IiwicHl5IiwicHpuIiwicWFhLi5xdHoiLCJxdWEiLCJxdWIiLCJxdWMiLCJxdWQiLCJxdWYiLCJxdWciLCJxdWgiLCJxdWkiLCJxdWsiLCJxdWwiLCJxdW0iLCJxdW4iLCJxdXAiLCJxdXEiLCJxdXIiLCJxdXMiLCJxdXYiLCJxdXciLCJxdXgiLCJxdXkiLCJxdXoiLCJxdmEiLCJxdmMiLCJxdmUiLCJxdmgiLCJxdmkiLCJxdmoiLCJxdmwiLCJxdm0iLCJxdm4iLCJxdm8iLCJxdnAiLCJxdnMiLCJxdnciLCJxdnkiLCJxdnoiLCJxd2EiLCJxd2MiLCJxd2UiLCJxd2giLCJxd20iLCJxd3MiLCJxd3QiLCJxeGEiLCJxeGMiLCJxeGgiLCJxeGwiLCJxeG4iLCJxeG8iLCJxeHAiLCJxeHEiLCJxeHIiLCJxeHMiLCJxeHQiLCJxeHUiLCJxeHciLCJxeWEiLCJxeXAiLCJyYWEiLCJyYWIiLCJyYWMiLCJyYWQiLCJyYWYiLCJyYWciLCJyYWgiLCJyYWkiLCJyYWoiLCJyYWsiLCJyYWwiLCJyYW0iLCJyYW4iLCJyYW8iLCJyYXAiLCJyYXEiLCJyYXIiLCJyYXMiLCJyYXQiLCJyYXUiLCJyYXYiLCJyYXciLCJyYXgiLCJyYXkiLCJyYXoiLCJyYmIiLCJyYmsiLCJyYmwiLCJyYnAiLCJyY2YiLCJyZGIiLCJyZWEiLCJyZWIiLCJyZWUiLCJyZWciLCJyZWkiLCJyZWoiLCJyZWwiLCJyZW0iLCJyZW4iLCJyZXIiLCJyZXMiLCJyZXQiLCJyZXkiLCJyZ2EiLCJyZ2UiLCJyZ2siLCJyZ24iLCJyZ3IiLCJyZ3MiLCJyZ3UiLCJyaGciLCJyaHAiLCJyaWEiLCJyaWUiLCJyaWYiLCJyaWwiLCJyaW0iLCJyaW4iLCJyaXIiLCJyaXQiLCJyaXUiLCJyamciLCJyamkiLCJyanMiLCJya2EiLCJya2IiLCJya2giLCJya2kiLCJya20iLCJya3QiLCJya3ciLCJybWEiLCJybWIiLCJybWMiLCJybWQiLCJybWUiLCJybWYiLCJybWciLCJybWgiLCJybWkiLCJybWsiLCJybWwiLCJybW0iLCJybW4iLCJybW8iLCJybXAiLCJybXEiLCJybXIiLCJybXMiLCJybXQiLCJybXUiLCJybXYiLCJybXciLCJybXgiLCJybXkiLCJybXoiLCJybmEiLCJybmQiLCJybmciLCJybmwiLCJybm4iLCJybnAiLCJybnIiLCJybnciLCJyb2EiLCJyb2IiLCJyb2MiLCJyb2QiLCJyb2UiLCJyb2YiLCJyb2ciLCJyb2wiLCJyb20iLCJyb28iLCJyb3AiLCJyb3IiLCJyb3UiLCJyb3ciLCJycG4iLCJycHQiLCJycmkiLCJycm8iLCJycnQiLCJyc2IiLCJyc2kiLCJyc2wiLCJyc20iLCJydGMiLCJydGgiLCJydG0iLCJydHMiLCJydHciLCJydWIiLCJydWMiLCJydWUiLCJydWYiLCJydWciLCJydWgiLCJydWkiLCJydWsiLCJydW8iLCJydXAiLCJydXEiLCJydXQiLCJydXUiLCJydXkiLCJydXoiLCJyd2EiLCJyd2siLCJyd20iLCJyd28iLCJyd3IiLCJyeGQiLCJyeHciLCJyeW4iLCJyeXMiLCJyeXUiLCJyemgiLCJzYWEiLCJzYWIiLCJzYWMiLCJzYWQiLCJzYWUiLCJzYWYiLCJzYWgiLCJzYWkiLCJzYWoiLCJzYWsiLCJzYWwiLCJzYW0iLCJzYW8iLCJzYXAiLCJzYXEiLCJzYXIiLCJzYXMiLCJzYXQiLCJzYXUiLCJzYXYiLCJzYXciLCJzYXgiLCJzYXkiLCJzYXoiLCJzYmEiLCJzYmIiLCJzYmMiLCJzYmQiLCJzYmUiLCJzYmYiLCJzYmciLCJzYmgiLCJzYmkiLCJzYmoiLCJzYmsiLCJzYmwiLCJzYm0iLCJzYm4iLCJzYm8iLCJzYnAiLCJzYnEiLCJzYnIiLCJzYnMiLCJzYnQiLCJzYnUiLCJzYnYiLCJzYnciLCJzYngiLCJzYnkiLCJzYnoiLCJzY2EiLCJzY2IiLCJzY2UiLCJzY2YiLCJzY2ciLCJzY2giLCJzY2kiLCJzY2siLCJzY2wiLCJzY24iLCJzY28iLCJzY3AiLCJzY3EiLCJzY3MiLCJzY3QiLCJzY3UiLCJzY3YiLCJzY3ciLCJzY3giLCJzZGEiLCJzZGIiLCJzZGMiLCJzZGUiLCJzZGYiLCJzZGciLCJzZGgiLCJzZGoiLCJzZGsiLCJzZGwiLCJzZG0iLCJzZG4iLCJzZG8iLCJzZHAiLCJzZHIiLCJzZHMiLCJzZHQiLCJzZHUiLCJzZHYiLCJzZHgiLCJzZHoiLCJzZWEiLCJzZWIiLCJzZWMiLCJzZWQiLCJzZWUiLCJzZWYiLCJzZWciLCJzZWgiLCJzZWkiLCJzZWoiLCJzZWsiLCJzZWwiLCJzZW0iLCJzZW4iLCJzZW8iLCJzZXAiLCJzZXEiLCJzZXIiLCJzZXMiLCJzZXQiLCJzZXUiLCJzZXYiLCJzZXciLCJzZXkiLCJzZXoiLCJzZmIiLCJzZmUiLCJzZm0iLCJzZnMiLCJzZnciLCJzZ2EiLCJzZ2IiLCJzZ2MiLCJzZ2QiLCJzZ2UiLCJzZ2ciLCJzZ2giLCJzZ2kiLCJzZ2oiLCJzZ2siLCJzZ2wiLCJzZ20iLCJzZ24iLCJzZ28iLCJzZ3AiLCJzZ3IiLCJzZ3MiLCJzZ3QiLCJzZ3UiLCJzZ3ciLCJzZ3giLCJzZ3kiLCJzZ3oiLCJzaGEiLCJzaGIiLCJzaGMiLCJzaGQiLCJzaGUiLCJzaGciLCJzaGgiLCJzaGkiLCJzaGoiLCJzaGsiLCJzaGwiLCJzaG0iLCJzaG4iLCJzaG8iLCJzaHAiLCJzaHEiLCJzaHIiLCJzaHMiLCJzaHQiLCJzaHUiLCJzaHYiLCJzaHciLCJzaHgiLCJzaHkiLCJzaHoiLCJzaWEiLCJzaWIiLCJzaWQiLCJzaWUiLCJzaWYiLCJzaWciLCJzaWgiLCJzaWkiLCJzaWoiLCJzaWsiLCJzaWwiLCJzaW0iLCJzaW8iLCJzaXAiLCJzaXEiLCJzaXIiLCJzaXMiLCJzaXQiLCJzaXUiLCJzaXYiLCJzaXciLCJzaXgiLCJzaXkiLCJzaXoiLCJzamEiLCJzamIiLCJzamQiLCJzamUiLCJzamciLCJzamsiLCJzamwiLCJzam0iLCJzam4iLCJzam8iLCJzanAiLCJzanIiLCJzanMiLCJzanQiLCJzanUiLCJzanciLCJza2EiLCJza2IiLCJza2MiLCJza2QiLCJza2UiLCJza2YiLCJza2ciLCJza2giLCJza2kiLCJza2oiLCJza2siLCJza20iLCJza24iLCJza28iLCJza3AiLCJza3EiLCJza3IiLCJza3MiLCJza3QiLCJza3UiLCJza3YiLCJza3ciLCJza3giLCJza3kiLCJza3oiLCJzbGEiLCJzbGMiLCJzbGQiLCJzbGUiLCJzbGYiLCJzbGciLCJzbGgiLCJzbGkiLCJzbGoiLCJzbGwiLCJzbG0iLCJzbG4iLCJzbHAiLCJzbHEiLCJzbHIiLCJzbHMiLCJzbHQiLCJzbHUiLCJzbHciLCJzbHgiLCJzbHkiLCJzbHoiLCJzbWEiLCJzbWIiLCJzbWMiLCJzbWQiLCJzbWYiLCJzbWciLCJzbWgiLCJzbWkiLCJzbWoiLCJzbWsiLCJzbWwiLCJzbW0iLCJzbW4iLCJzbXAiLCJzbXEiLCJzbXIiLCJzbXMiLCJzbXQiLCJzbXUiLCJzbXYiLCJzbXciLCJzbXgiLCJzbXkiLCJzbXoiLCJzbmIiLCJzbmMiLCJzbmUiLCJzbmYiLCJzbmciLCJzbmgiLCJzbmkiLCJzbmoiLCJzbmsiLCJzbmwiLCJzbm0iLCJzbm4iLCJzbm8iLCJzbnAiLCJzbnEiLCJzbnIiLCJzbnMiLCJzbnUiLCJzbnYiLCJzbnciLCJzbngiLCJzbnkiLCJzbnoiLCJzb2EiLCJzb2IiLCJzb2MiLCJzb2QiLCJzb2UiLCJzb2ciLCJzb2giLCJzb2kiLCJzb2oiLCJzb2siLCJzb2wiLCJzb24iLCJzb28iLCJzb3AiLCJzb3EiLCJzb3IiLCJzb3MiLCJzb3UiLCJzb3YiLCJzb3ciLCJzb3giLCJzb3kiLCJzb3oiLCJzcGIiLCJzcGMiLCJzcGQiLCJzcGUiLCJzcGciLCJzcGkiLCJzcGsiLCJzcGwiLCJzcG0iLCJzcG4iLCJzcG8iLCJzcHAiLCJzcHEiLCJzcHIiLCJzcHMiLCJzcHQiLCJzcHUiLCJzcHYiLCJzcHgiLCJzcHkiLCJzcWEiLCJzcWgiLCJzcWoiLCJzcWsiLCJzcW0iLCJzcW4iLCJzcW8iLCJzcXEiLCJzcXIiLCJzcXMiLCJzcXQiLCJzcXUiLCJzcmEiLCJzcmIiLCJzcmMiLCJzcmUiLCJzcmYiLCJzcmciLCJzcmgiLCJzcmkiLCJzcmsiLCJzcmwiLCJzcm0iLCJzcm4iLCJzcm8iLCJzcnEiLCJzcnIiLCJzcnMiLCJzcnQiLCJzcnUiLCJzcnYiLCJzcnciLCJzcngiLCJzcnkiLCJzcnoiLCJzc2EiLCJzc2IiLCJzc2MiLCJzc2QiLCJzc2UiLCJzc2YiLCJzc2ciLCJzc2giLCJzc2kiLCJzc2oiLCJzc2siLCJzc2wiLCJzc20iLCJzc24iLCJzc28iLCJzc3AiLCJzc3EiLCJzc3IiLCJzc3MiLCJzc3QiLCJzc3UiLCJzc3YiLCJzc3giLCJzc3kiLCJzc3oiLCJzdGEiLCJzdGIiLCJzdGQiLCJzdGUiLCJzdGYiLCJzdGciLCJzdGgiLCJzdGkiLCJzdGoiLCJzdGsiLCJzdGwiLCJzdG0iLCJzdG4iLCJzdG8iLCJzdHAiLCJzdHEiLCJzdHIiLCJzdHMiLCJzdHQiLCJzdHUiLCJzdHYiLCJzdHciLCJzdHkiLCJzdWEiLCJzdWIiLCJzdWMiLCJzdWUiLCJzdWciLCJzdWkiLCJzdWoiLCJzdWsiLCJzdWwiLCJzdW0iLCJzdXEiLCJzdXIiLCJzdXMiLCJzdXQiLCJzdXYiLCJzdXciLCJzdXgiLCJzdXkiLCJzdXoiLCJzdmEiLCJzdmIiLCJzdmMiLCJzdmUiLCJzdmsiLCJzdm0iLCJzdnIiLCJzdnMiLCJzdngiLCJzd2IiLCJzd2MiLCJzd2YiLCJzd2ciLCJzd2giLCJzd2kiLCJzd2oiLCJzd2siLCJzd2wiLCJzd20iLCJzd24iLCJzd28iLCJzd3AiLCJzd3EiLCJzd3IiLCJzd3MiLCJzd3QiLCJzd3UiLCJzd3YiLCJzd3ciLCJzd3giLCJzd3kiLCJzeGIiLCJzeGMiLCJzeGUiLCJzeGciLCJzeGsiLCJzeGwiLCJzeG0iLCJzeG4iLCJzeG8iLCJzeHIiLCJzeHMiLCJzeHUiLCJzeHciLCJzeWEiLCJzeWIiLCJzeWMiLCJzeWQiLCJzeWkiLCJzeWsiLCJzeWwiLCJzeW0iLCJzeW4iLCJzeW8iLCJzeXIiLCJzeXMiLCJzeXciLCJzeXgiLCJzeXkiLCJzemEiLCJzemIiLCJzemMiLCJzemQiLCJzemUiLCJzemciLCJzemwiLCJzem4iLCJzenAiLCJzenMiLCJzenYiLCJzenciLCJ0YWEiLCJ0YWIiLCJ0YWMiLCJ0YWQiLCJ0YWUiLCJ0YWYiLCJ0YWciLCJ0YWkiLCJ0YWoiLCJ0YWsiLCJ0YWwiLCJ0YW4iLCJ0YW8iLCJ0YXAiLCJ0YXEiLCJ0YXIiLCJ0YXMiLCJ0YXUiLCJ0YXYiLCJ0YXciLCJ0YXgiLCJ0YXkiLCJ0YXoiLCJ0YmEiLCJ0YmIiLCJ0YmMiLCJ0YmQiLCJ0YmUiLCJ0YmYiLCJ0YmciLCJ0YmgiLCJ0YmkiLCJ0YmoiLCJ0YmsiLCJ0YmwiLCJ0Ym0iLCJ0Ym4iLCJ0Ym8iLCJ0YnAiLCJ0YnEiLCJ0YnIiLCJ0YnMiLCJ0YnQiLCJ0YnUiLCJ0YnYiLCJ0YnciLCJ0YngiLCJ0YnkiLCJ0YnoiLCJ0Y2EiLCJ0Y2IiLCJ0Y2MiLCJ0Y2QiLCJ0Y2UiLCJ0Y2YiLCJ0Y2ciLCJ0Y2giLCJ0Y2kiLCJ0Y2siLCJ0Y2wiLCJ0Y20iLCJ0Y24iLCJ0Y28iLCJ0Y3AiLCJ0Y3EiLCJ0Y3MiLCJ0Y3QiLCJ0Y3UiLCJ0Y3ciLCJ0Y3giLCJ0Y3kiLCJ0Y3oiLCJ0ZGEiLCJ0ZGIiLCJ0ZGMiLCJ0ZGQiLCJ0ZGUiLCJ0ZGYiLCJ0ZGciLCJ0ZGgiLCJ0ZGkiLCJ0ZGoiLCJ0ZGsiLCJ0ZGwiLCJ0ZG0iLCJ0ZG4iLCJ0ZG8iLCJ0ZHEiLCJ0ZHIiLCJ0ZHMiLCJ0ZHQiLCJ0ZHUiLCJ0ZHYiLCJ0ZHgiLCJ0ZHkiLCJ0ZWEiLCJ0ZWIiLCJ0ZWMiLCJ0ZWQiLCJ0ZWUiLCJ0ZWYiLCJ0ZWciLCJ0ZWgiLCJ0ZWkiLCJ0ZWsiLCJ0ZW0iLCJ0ZW4iLCJ0ZW8iLCJ0ZXAiLCJ0ZXEiLCJ0ZXIiLCJ0ZXMiLCJ0ZXQiLCJ0ZXUiLCJ0ZXYiLCJ0ZXciLCJ0ZXgiLCJ0ZXkiLCJ0ZmkiLCJ0Zm4iLCJ0Zm8iLCJ0ZnIiLCJ0ZnQiLCJ0Z2EiLCJ0Z2IiLCJ0Z2MiLCJ0Z2QiLCJ0Z2UiLCJ0Z2YiLCJ0Z2ciLCJ0Z2giLCJ0Z2kiLCJ0Z2oiLCJ0Z24iLCJ0Z28iLCJ0Z3AiLCJ0Z3EiLCJ0Z3IiLCJ0Z3MiLCJ0Z3QiLCJ0Z3UiLCJ0Z3YiLCJ0Z3ciLCJ0Z3giLCJ0Z3kiLCJ0Z3oiLCJ0aGMiLCJ0aGQiLCJ0aGUiLCJ0aGYiLCJ0aGgiLCJ0aGkiLCJ0aGsiLCJ0aGwiLCJ0aG0iLCJ0aG4iLCJ0aHAiLCJ0aHEiLCJ0aHIiLCJ0aHMiLCJ0aHQiLCJ0aHUiLCJ0aHYiLCJ0aHciLCJ0aHgiLCJ0aHkiLCJ0aHoiLCJ0aWEiLCJ0aWMiLCJ0aWQiLCJ0aWUiLCJ0aWYiLCJ0aWciLCJ0aWgiLCJ0aWkiLCJ0aWoiLCJ0aWsiLCJ0aWwiLCJ0aW0iLCJ0aW4iLCJ0aW8iLCJ0aXAiLCJ0aXEiLCJ0aXMiLCJ0aXQiLCJ0aXUiLCJ0aXYiLCJ0aXciLCJ0aXgiLCJ0aXkiLCJ0aXoiLCJ0amEiLCJ0amciLCJ0amkiLCJ0amwiLCJ0am0iLCJ0am4iLCJ0am8iLCJ0anMiLCJ0anUiLCJ0anciLCJ0a2EiLCJ0a2IiLCJ0a2QiLCJ0a2UiLCJ0a2YiLCJ0a2ciLCJ0a2siLCJ0a2wiLCJ0a20iLCJ0a24iLCJ0a3AiLCJ0a3EiLCJ0a3IiLCJ0a3MiLCJ0a3QiLCJ0a3UiLCJ0a3YiLCJ0a3ciLCJ0a3giLCJ0a3oiLCJ0bGEiLCJ0bGIiLCJ0bGMiLCJ0bGQiLCJ0bGYiLCJ0bGciLCJ0bGgiLCJ0bGkiLCJ0bGoiLCJ0bGsiLCJ0bGwiLCJ0bG0iLCJ0bG4iLCJ0bG8iLCJ0bHAiLCJ0bHEiLCJ0bHIiLCJ0bHMiLCJ0bHQiLCJ0bHUiLCJ0bHYiLCJ0bHciLCJ0bHgiLCJ0bHkiLCJ0bWEiLCJ0bWIiLCJ0bWMiLCJ0bWQiLCJ0bWUiLCJ0bWYiLCJ0bWciLCJ0bWgiLCJ0bWkiLCJ0bWoiLCJ0bWsiLCJ0bWwiLCJ0bW0iLCJ0bW4iLCJ0bW8iLCJ0bXAiLCJ0bXEiLCJ0bXIiLCJ0bXMiLCJ0bXQiLCJ0bXUiLCJ0bXYiLCJ0bXciLCJ0bXkiLCJ0bXoiLCJ0bmEiLCJ0bmIiLCJ0bmMiLCJ0bmQiLCJ0bmUiLCJ0bmYiLCJ0bmciLCJ0bmgiLCJ0bmkiLCJ0bmsiLCJ0bmwiLCJ0bm0iLCJ0bm4iLCJ0bm8iLCJ0bnAiLCJ0bnEiLCJ0bnIiLCJ0bnMiLCJ0bnQiLCJ0bnUiLCJ0bnYiLCJ0bnciLCJ0bngiLCJ0bnkiLCJ0bnoiLCJ0b2IiLCJ0b2MiLCJ0b2QiLCJ0b2UiLCJ0b2YiLCJ0b2ciLCJ0b2giLCJ0b2kiLCJ0b2oiLCJ0b2wiLCJ0b20iLCJ0b28iLCJ0b3AiLCJ0b3EiLCJ0b3IiLCJ0b3MiLCJ0b3UiLCJ0b3YiLCJ0b3ciLCJ0b3giLCJ0b3kiLCJ0b3oiLCJ0cGEiLCJ0cGMiLCJ0cGUiLCJ0cGYiLCJ0cGciLCJ0cGkiLCJ0cGoiLCJ0cGsiLCJ0cGwiLCJ0cG0iLCJ0cG4iLCJ0cG8iLCJ0cHAiLCJ0cHEiLCJ0cHIiLCJ0cHQiLCJ0cHUiLCJ0cHYiLCJ0cHciLCJ0cHgiLCJ0cHkiLCJ0cHoiLCJ0cWIiLCJ0cWwiLCJ0cW0iLCJ0cW4iLCJ0cW8iLCJ0cXAiLCJ0cXEiLCJ0cXIiLCJ0cXQiLCJ0cXUiLCJ0cXciLCJ0cmEiLCJ0cmIiLCJ0cmMiLCJ0cmQiLCJ0cmUiLCJ0cmYiLCJ0cmciLCJ0cmgiLCJ0cmkiLCJ0cmoiLCJ0cmsiLCJ0cmwiLCJ0cm0iLCJ0cm4iLCJ0cm8iLCJ0cnAiLCJ0cnEiLCJ0cnIiLCJ0cnMiLCJ0cnQiLCJ0cnUiLCJ0cnYiLCJ0cnciLCJ0cngiLCJ0cnkiLCJ0cnoiLCJ0c2EiLCJ0c2IiLCJ0c2MiLCJ0c2QiLCJ0c2UiLCJ0c2YiLCJ0c2ciLCJ0c2giLCJ0c2kiLCJ0c2oiLCJ0c2siLCJ0c2wiLCJ0c20iLCJ0c3AiLCJ0c3EiLCJ0c3IiLCJ0c3MiLCJ0c3QiLCJ0c3UiLCJ0c3YiLCJ0c3ciLCJ0c3giLCJ0c3kiLCJ0c3oiLCJ0dGEiLCJ0dGIiLCJ0dGMiLCJ0dGQiLCJ0dGUiLCJ0dGYiLCJ0dGciLCJ0dGgiLCJ0dGkiLCJ0dGoiLCJ0dGsiLCJ0dGwiLCJ0dG0iLCJ0dG4iLCJ0dG8iLCJ0dHAiLCJ0dHEiLCJ0dHIiLCJ0dHMiLCJ0dHQiLCJ0dHUiLCJ0dHYiLCJ0dHciLCJ0dHkiLCJ0dHoiLCJ0dWEiLCJ0dWIiLCJ0dWMiLCJ0dWQiLCJ0dWUiLCJ0dWYiLCJ0dWciLCJ0dWgiLCJ0dWkiLCJ0dWoiLCJ0dWwiLCJ0dW0iLCJ0dW4iLCJ0dW8iLCJ0dXAiLCJ0dXEiLCJ0dXMiLCJ0dXQiLCJ0dXUiLCJ0dXYiLCJ0dXciLCJ0dXgiLCJ0dXkiLCJ0dXoiLCJ0dmEiLCJ0dmQiLCJ0dmUiLCJ0dmsiLCJ0dmwiLCJ0dm0iLCJ0dm4iLCJ0dm8iLCJ0dnMiLCJ0dnQiLCJ0dnUiLCJ0dnciLCJ0dnkiLCJ0d2EiLCJ0d2IiLCJ0d2MiLCJ0d2QiLCJ0d2UiLCJ0d2YiLCJ0d2ciLCJ0d2giLCJ0d2wiLCJ0d20iLCJ0d24iLCJ0d28iLCJ0d3AiLCJ0d3EiLCJ0d3IiLCJ0d3QiLCJ0d3UiLCJ0d3ciLCJ0d3giLCJ0d3kiLCJ0eGEiLCJ0eGIiLCJ0eGMiLCJ0eGUiLCJ0eGciLCJ0eGgiLCJ0eGkiLCJ0eGoiLCJ0eG0iLCJ0eG4iLCJ0eG8iLCJ0eHEiLCJ0eHIiLCJ0eHMiLCJ0eHQiLCJ0eHUiLCJ0eHgiLCJ0eHkiLCJ0eWEiLCJ0eWUiLCJ0eWgiLCJ0eWkiLCJ0eWoiLCJ0eWwiLCJ0eW4iLCJ0eXAiLCJ0eXIiLCJ0eXMiLCJ0eXQiLCJ0eXUiLCJ0eXYiLCJ0eXgiLCJ0eXoiLCJ0emEiLCJ0emgiLCJ0emoiLCJ0emwiLCJ0em0iLCJ0em4iLCJ0em8iLCJ0engiLCJ1YW0iLCJ1YW4iLCJ1YXIiLCJ1YmEiLCJ1YmkiLCJ1YmwiLCJ1YnIiLCJ1YnUiLCJ1YnkiLCJ1ZGEiLCJ1ZGUiLCJ1ZGciLCJ1ZGkiLCJ1ZGoiLCJ1ZGwiLCJ1ZG0iLCJ1ZHUiLCJ1ZXMiLCJ1ZmkiLCJ1Z2EiLCJ1Z2IiLCJ1Z2UiLCJ1Z24iLCJ1Z28iLCJ1Z3kiLCJ1aGEiLCJ1aG4iLCJ1aXMiLCJ1aXYiLCJ1amkiLCJ1a2EiLCJ1a2ciLCJ1a2giLCJ1a2siLCJ1a2wiLCJ1a3AiLCJ1a3EiLCJ1a3MiLCJ1a3UiLCJ1a3ciLCJ1a3kiLCJ1bGEiLCJ1bGIiLCJ1bGMiLCJ1bGUiLCJ1bGYiLCJ1bGkiLCJ1bGsiLCJ1bGwiLCJ1bG0iLCJ1bG4iLCJ1bHUiLCJ1bHciLCJ1bWEiLCJ1bWIiLCJ1bWMiLCJ1bWQiLCJ1bWciLCJ1bWkiLCJ1bW0iLCJ1bW4iLCJ1bW8iLCJ1bXAiLCJ1bXIiLCJ1bXMiLCJ1bXUiLCJ1bmEiLCJ1bmQiLCJ1bmUiLCJ1bmciLCJ1bmsiLCJ1bm0iLCJ1bm4iLCJ1bnAiLCJ1bnIiLCJ1bnUiLCJ1bngiLCJ1bnoiLCJ1b2siLCJ1cGkiLCJ1cHYiLCJ1cmEiLCJ1cmIiLCJ1cmMiLCJ1cmUiLCJ1cmYiLCJ1cmciLCJ1cmgiLCJ1cmkiLCJ1cmoiLCJ1cmsiLCJ1cmwiLCJ1cm0iLCJ1cm4iLCJ1cm8iLCJ1cnAiLCJ1cnIiLCJ1cnQiLCJ1cnUiLCJ1cnYiLCJ1cnciLCJ1cngiLCJ1cnkiLCJ1cnoiLCJ1c2EiLCJ1c2giLCJ1c2kiLCJ1c2siLCJ1c3AiLCJ1c3UiLCJ1dGEiLCJ1dGUiLCJ1dHAiLCJ1dHIiLCJ1dHUiLCJ1dW0iLCJ1dW4iLCJ1dXIiLCJ1dXUiLCJ1dmUiLCJ1dmgiLCJ1dmwiLCJ1d2EiLCJ1eWEiLCJ1em4iLCJ1enMiLCJ2YWEiLCJ2YWUiLCJ2YWYiLCJ2YWciLCJ2YWgiLCJ2YWkiLCJ2YWoiLCJ2YWwiLCJ2YW0iLCJ2YW4iLCJ2YW8iLCJ2YXAiLCJ2YXIiLCJ2YXMiLCJ2YXUiLCJ2YXYiLCJ2YXkiLCJ2YmIiLCJ2YmsiLCJ2ZWMiLCJ2ZWQiLCJ2ZWwiLCJ2ZW0iLCJ2ZW8iLCJ2ZXAiLCJ2ZXIiLCJ2Z3IiLCJ2Z3QiLCJ2aWMiLCJ2aWQiLCJ2aWYiLCJ2aWciLCJ2aWwiLCJ2aW4iLCJ2aXMiLCJ2aXQiLCJ2aXYiLCJ2a2EiLCJ2a2kiLCJ2a2oiLCJ2a2siLCJ2a2wiLCJ2a20iLCJ2a28iLCJ2a3AiLCJ2a3QiLCJ2a3UiLCJ2bHAiLCJ2bHMiLCJ2bWEiLCJ2bWIiLCJ2bWMiLCJ2bWQiLCJ2bWUiLCJ2bWYiLCJ2bWciLCJ2bWgiLCJ2bWkiLCJ2bWoiLCJ2bWsiLCJ2bWwiLCJ2bW0iLCJ2bXAiLCJ2bXEiLCJ2bXIiLCJ2bXMiLCJ2bXUiLCJ2bXYiLCJ2bXciLCJ2bXgiLCJ2bXkiLCJ2bXoiLCJ2bmsiLCJ2bm0iLCJ2bnAiLCJ2b3IiLCJ2b3QiLCJ2cmEiLCJ2cm8iLCJ2cnMiLCJ2cnQiLCJ2c2kiLCJ2c2wiLCJ2c3YiLCJ2dG8iLCJ2dW0iLCJ2dW4iLCJ2dXQiLCJ2d2EiLCJ3YWEiLCJ3YWIiLCJ3YWMiLCJ3YWQiLCJ3YWUiLCJ3YWYiLCJ3YWciLCJ3YWgiLCJ3YWkiLCJ3YWoiLCJ3YWsiLCJ3YWwiLCJ3YW0iLCJ3YW4iLCJ3YW8iLCJ3YXAiLCJ3YXEiLCJ3YXIiLCJ3YXMiLCJ3YXQiLCJ3YXUiLCJ3YXYiLCJ3YXciLCJ3YXgiLCJ3YXkiLCJ3YXoiLCJ3YmEiLCJ3YmIiLCJ3YmUiLCJ3YmYiLCJ3YmgiLCJ3YmkiLCJ3YmoiLCJ3YmsiLCJ3YmwiLCJ3Ym0iLCJ3YnAiLCJ3YnEiLCJ3YnIiLCJ3YnMiLCJ3YnQiLCJ3YnYiLCJ3YnciLCJ3Y2EiLCJ3Y2kiLCJ3ZGQiLCJ3ZGciLCJ3ZGoiLCJ3ZGsiLCJ3ZHUiLCJ3ZHkiLCJ3ZWEiLCJ3ZWMiLCJ3ZWQiLCJ3ZWciLCJ3ZWgiLCJ3ZWkiLCJ3ZW0iLCJ3ZW4iLCJ3ZW8iLCJ3ZXAiLCJ3ZXIiLCJ3ZXMiLCJ3ZXQiLCJ3ZXUiLCJ3ZXciLCJ3ZmciLCJ3Z2EiLCJ3Z2IiLCJ3Z2ciLCJ3Z2kiLCJ3Z28iLCJ3Z3UiLCJ3Z3ciLCJ3Z3kiLCJ3aGEiLCJ3aGciLCJ3aGsiLCJ3aHUiLCJ3aWIiLCJ3aWMiLCJ3aWUiLCJ3aWYiLCJ3aWciLCJ3aWgiLCJ3aWkiLCJ3aWoiLCJ3aWsiLCJ3aWwiLCJ3aW0iLCJ3aW4iLCJ3aXIiLCJ3aXQiLCJ3aXUiLCJ3aXYiLCJ3aXciLCJ3aXkiLCJ3amEiLCJ3amkiLCJ3a2EiLCJ3a2IiLCJ3a2QiLCJ3a2wiLCJ3a3UiLCJ3a3ciLCJ3a3kiLCJ3bGEiLCJ3bGMiLCJ3bGUiLCJ3bGciLCJ3bGkiLCJ3bGsiLCJ3bGwiLCJ3bG0iLCJ3bG8iLCJ3bHIiLCJ3bHMiLCJ3bHUiLCJ3bHYiLCJ3bHciLCJ3bHgiLCJ3bHkiLCJ3bWEiLCJ3bWIiLCJ3bWMiLCJ3bWQiLCJ3bWUiLCJ3bWgiLCJ3bWkiLCJ3bW0iLCJ3bW4iLCJ3bW8iLCJ3bXMiLCJ3bXQiLCJ3bXciLCJ3bXgiLCJ3bmIiLCJ3bmMiLCJ3bmQiLCJ3bmUiLCJ3bmciLCJ3bmkiLCJ3bmsiLCJ3bm0iLCJ3bm4iLCJ3bm8iLCJ3bnAiLCJ3bnUiLCJ3bnciLCJ3bnkiLCJ3b2EiLCJ3b2IiLCJ3b2MiLCJ3b2QiLCJ3b2UiLCJ3b2YiLCJ3b2ciLCJ3b2kiLCJ3b2siLCJ3b20iLCJ3b24iLCJ3b28iLCJ3b3IiLCJ3b3MiLCJ3b3ciLCJ3b3kiLCJ3cGMiLCJ3cmEiLCJ3cmIiLCJ3cmQiLCJ3cmciLCJ3cmgiLCJ3cmkiLCJ3cmsiLCJ3cmwiLCJ3cm0iLCJ3cm4iLCJ3cm8iLCJ3cnAiLCJ3cnIiLCJ3cnMiLCJ3cnUiLCJ3cnYiLCJ3cnciLCJ3cngiLCJ3cnkiLCJ3cnoiLCJ3c2EiLCJ3c2ciLCJ3c2kiLCJ3c2siLCJ3c3IiLCJ3c3MiLCJ3c3UiLCJ3c3YiLCJ3dGYiLCJ3dGgiLCJ3dGkiLCJ3dGsiLCJ3dG0iLCJ3dHciLCJ3dWEiLCJ3dWIiLCJ3dWQiLCJ3dWgiLCJ3dWwiLCJ3dW0iLCJ3dW4iLCJ3dXIiLCJ3dXQiLCJ3dXUiLCJ3dXYiLCJ3dXgiLCJ3dXkiLCJ3d2EiLCJ3d2IiLCJ3d28iLCJ3d3IiLCJ3d3ciLCJ3eGEiLCJ3eHciLCJ3eWEiLCJ3eWIiLCJ3eWkiLCJ3eW0iLCJ3eXIiLCJ3eXkiLCJ4YWEiLCJ4YWIiLCJ4YWMiLCJ4YWQiLCJ4YWUiLCJ4YWciLCJ4YWkiLCJ4YWoiLCJ4YWsiLCJ4YWwiLCJ4YW0iLCJ4YW4iLCJ4YW8iLCJ4YXAiLCJ4YXEiLCJ4YXIiLCJ4YXMiLCJ4YXQiLCJ4YXUiLCJ4YXYiLCJ4YXciLCJ4YXkiLCJ4YmEiLCJ4YmIiLCJ4YmMiLCJ4YmQiLCJ4YmUiLCJ4YmciLCJ4YmkiLCJ4YmoiLCJ4Ym0iLCJ4Ym4iLCJ4Ym8iLCJ4YnAiLCJ4YnIiLCJ4YnciLCJ4YngiLCJ4YnkiLCJ4Y2IiLCJ4Y2MiLCJ4Y2UiLCJ4Y2ciLCJ4Y2giLCJ4Y2wiLCJ4Y20iLCJ4Y24iLCJ4Y28iLCJ4Y3IiLCJ4Y3QiLCJ4Y3UiLCJ4Y3YiLCJ4Y3ciLCJ4Y3kiLCJ4ZGEiLCJ4ZGMiLCJ4ZGsiLCJ4ZG0iLCJ4ZG8iLCJ4ZHkiLCJ4ZWIiLCJ4ZWQiLCJ4ZWciLCJ4ZWwiLCJ4ZW0iLCJ4ZXAiLCJ4ZXIiLCJ4ZXMiLCJ4ZXQiLCJ4ZXUiLCJ4ZmEiLCJ4Z2EiLCJ4Z2IiLCJ4Z2QiLCJ4Z2YiLCJ4Z2ciLCJ4Z2kiLCJ4Z2wiLCJ4Z20iLCJ4Z24iLCJ4Z3IiLCJ4Z3UiLCJ4Z3ciLCJ4aGEiLCJ4aGMiLCJ4aGQiLCJ4aGUiLCJ4aHIiLCJ4aHQiLCJ4aHUiLCJ4aHYiLCJ4aWEiLCJ4aWIiLCJ4aWkiLCJ4aWwiLCJ4aW4iLCJ4aXAiLCJ4aXIiLCJ4aXMiLCJ4aXYiLCJ4aXkiLCJ4amIiLCJ4anQiLCJ4a2EiLCJ4a2IiLCJ4a2MiLCJ4a2QiLCJ4a2UiLCJ4a2YiLCJ4a2ciLCJ4a2giLCJ4a2kiLCJ4a2oiLCJ4a2siLCJ4a2wiLCJ4a24iLCJ4a28iLCJ4a3AiLCJ4a3EiLCJ4a3IiLCJ4a3MiLCJ4a3QiLCJ4a3UiLCJ4a3YiLCJ4a3ciLCJ4a3giLCJ4a3kiLCJ4a3oiLCJ4bGEiLCJ4bGIiLCJ4bGMiLCJ4bGQiLCJ4bGUiLCJ4bGciLCJ4bGkiLCJ4bG4iLCJ4bG8iLCJ4bHAiLCJ4bHMiLCJ4bHUiLCJ4bHkiLCJ4bWEiLCJ4bWIiLCJ4bWMiLCJ4bWQiLCJ4bWUiLCJ4bWYiLCJ4bWciLCJ4bWgiLCJ4bWoiLCJ4bWsiLCJ4bWwiLCJ4bW0iLCJ4bW4iLCJ4bW8iLCJ4bXAiLCJ4bXEiLCJ4bXIiLCJ4bXMiLCJ4bXQiLCJ4bXUiLCJ4bXYiLCJ4bXciLCJ4bXgiLCJ4bXkiLCJ4bXoiLCJ4bmEiLCJ4bmIiLCJ4bmQiLCJ4bmciLCJ4bmgiLCJ4bmkiLCJ4bmsiLCJ4bm4iLCJ4bm8iLCJ4bnIiLCJ4bnMiLCJ4bnQiLCJ4bnUiLCJ4bnkiLCJ4bnoiLCJ4b2MiLCJ4b2QiLCJ4b2ciLCJ4b2kiLCJ4b2siLCJ4b20iLCJ4b24iLCJ4b28iLCJ4b3AiLCJ4b3IiLCJ4b3ciLCJ4cGEiLCJ4cGMiLCJ4cGUiLCJ4cGciLCJ4cGkiLCJ4cGoiLCJ4cGsiLCJ4cG0iLCJ4cG4iLCJ4cG8iLCJ4cHAiLCJ4cHEiLCJ4cHIiLCJ4cHMiLCJ4cHQiLCJ4cHUiLCJ4cHkiLCJ4cWEiLCJ4cXQiLCJ4cmEiLCJ4cmIiLCJ4cmQiLCJ4cmUiLCJ4cmciLCJ4cmkiLCJ4cm0iLCJ4cm4iLCJ4cnEiLCJ4cnIiLCJ4cnQiLCJ4cnUiLCJ4cnciLCJ4c2EiLCJ4c2IiLCJ4c2MiLCJ4c2QiLCJ4c2UiLCJ4c2giLCJ4c2kiLCJ4c2oiLCJ4c2wiLCJ4c20iLCJ4c24iLCJ4c28iLCJ4c3AiLCJ4c3EiLCJ4c3IiLCJ4c3MiLCJ4c3UiLCJ4c3YiLCJ4c3kiLCJ4dGEiLCJ4dGIiLCJ4dGMiLCJ4dGQiLCJ4dGUiLCJ4dGciLCJ4dGgiLCJ4dGkiLCJ4dGoiLCJ4dGwiLCJ4dG0iLCJ4dG4iLCJ4dG8iLCJ4dHAiLCJ4dHEiLCJ4dHIiLCJ4dHMiLCJ4dHQiLCJ4dHUiLCJ4dHYiLCJ4dHciLCJ4dHkiLCJ4dHoiLCJ4dWEiLCJ4dWIiLCJ4dWQiLCJ4dWciLCJ4dWoiLCJ4dWwiLCJ4dW0iLCJ4dW4iLCJ4dW8iLCJ4dXAiLCJ4dXIiLCJ4dXQiLCJ4dXUiLCJ4dmUiLCJ4dmkiLCJ4dm4iLCJ4dm8iLCJ4dnMiLCJ4d2EiLCJ4d2MiLCJ4d2QiLCJ4d2UiLCJ4d2ciLCJ4d2oiLCJ4d2siLCJ4d2wiLCJ4d28iLCJ4d3IiLCJ4d3QiLCJ4d3ciLCJ4eGIiLCJ4eGsiLCJ4eG0iLCJ4eHIiLCJ4eHQiLCJ4eWEiLCJ4eWIiLCJ4eWoiLCJ4eWsiLCJ4eWwiLCJ4eXQiLCJ4eXkiLCJ4emgiLCJ4em0iLCJ4enAiLCJ5YWEiLCJ5YWIiLCJ5YWMiLCJ5YWQiLCJ5YWUiLCJ5YWYiLCJ5YWciLCJ5YWgiLCJ5YWkiLCJ5YWoiLCJ5YWsiLCJ5YWwiLCJ5YW0iLCJ5YW4iLCJ5YW8iLCJ5YXAiLCJ5YXEiLCJ5YXIiLCJ5YXMiLCJ5YXQiLCJ5YXUiLCJ5YXYiLCJ5YXciLCJ5YXgiLCJ5YXkiLCJ5YXoiLCJ5YmEiLCJ5YmIiLCJ5YmQiLCJ5YmUiLCJ5YmgiLCJ5YmkiLCJ5YmoiLCJ5YmsiLCJ5YmwiLCJ5Ym0iLCJ5Ym4iLCJ5Ym8iLCJ5YngiLCJ5YnkiLCJ5Y2giLCJ5Y2wiLCJ5Y24iLCJ5Y3AiLCJ5ZGEiLCJ5ZGQiLCJ5ZGUiLCJ5ZGciLCJ5ZGsiLCJ5ZHMiLCJ5ZWEiLCJ5ZWMiLCJ5ZWUiLCJ5ZWkiLCJ5ZWoiLCJ5ZWwiLCJ5ZW4iLCJ5ZXIiLCJ5ZXMiLCJ5ZXQiLCJ5ZXUiLCJ5ZXYiLCJ5ZXkiLCJ5Z2EiLCJ5Z2kiLCJ5Z2wiLCJ5Z20iLCJ5Z3AiLCJ5Z3IiLCJ5Z3MiLCJ5Z3UiLCJ5Z3ciLCJ5aGEiLCJ5aGQiLCJ5aGwiLCJ5aHMiLCJ5aWEiLCJ5aWYiLCJ5aWciLCJ5aWgiLCJ5aWkiLCJ5aWoiLCJ5aWsiLCJ5aWwiLCJ5aW0iLCJ5aW4iLCJ5aXAiLCJ5aXEiLCJ5aXIiLCJ5aXMiLCJ5aXQiLCJ5aXUiLCJ5aXYiLCJ5aXgiLCJ5aXkiLCJ5aXoiLCJ5a2EiLCJ5a2ciLCJ5a2kiLCJ5a2siLCJ5a2wiLCJ5a20iLCJ5a24iLCJ5a28iLCJ5a3IiLCJ5a3QiLCJ5a3UiLCJ5a3kiLCJ5bGEiLCJ5bGIiLCJ5bGUiLCJ5bGciLCJ5bGkiLCJ5bGwiLCJ5bG0iLCJ5bG4iLCJ5bG8iLCJ5bHIiLCJ5bHUiLCJ5bHkiLCJ5bWEiLCJ5bWIiLCJ5bWMiLCJ5bWQiLCJ5bWUiLCJ5bWciLCJ5bWgiLCJ5bWkiLCJ5bWsiLCJ5bWwiLCJ5bW0iLCJ5bW4iLCJ5bW8iLCJ5bXAiLCJ5bXEiLCJ5bXIiLCJ5bXMiLCJ5bXQiLCJ5bXgiLCJ5bXoiLCJ5bmEiLCJ5bmQiLCJ5bmUiLCJ5bmciLCJ5bmgiLCJ5bmsiLCJ5bmwiLCJ5bm4iLCJ5bm8iLCJ5bnEiLCJ5bnMiLCJ5bnUiLCJ5b2IiLCJ5b2ciLCJ5b2kiLCJ5b2siLCJ5b2wiLCJ5b20iLCJ5b24iLCJ5b3MiLCJ5b3QiLCJ5b3giLCJ5b3kiLCJ5cGEiLCJ5cGIiLCJ5cGciLCJ5cGgiLCJ5cGsiLCJ5cG0iLCJ5cG4iLCJ5cG8iLCJ5cHAiLCJ5cHoiLCJ5cmEiLCJ5cmIiLCJ5cmUiLCJ5cmkiLCJ5cmsiLCJ5cmwiLCJ5cm0iLCJ5cm4iLCJ5cm8iLCJ5cnMiLCJ5cnciLCJ5cnkiLCJ5c2MiLCJ5c2QiLCJ5c2ciLCJ5c2wiLCJ5c24iLCJ5c28iLCJ5c3AiLCJ5c3IiLCJ5c3MiLCJ5c3kiLCJ5dGEiLCJ5dGwiLCJ5dHAiLCJ5dHciLCJ5dHkiLCJ5dWEiLCJ5dWIiLCJ5dWMiLCJ5dWQiLCJ5dWUiLCJ5dWYiLCJ5dWciLCJ5dWkiLCJ5dWoiLCJ5dWsiLCJ5dWwiLCJ5dW0iLCJ5dW4iLCJ5dXAiLCJ5dXEiLCJ5dXIiLCJ5dXQiLCJ5dXUiLCJ5dXciLCJ5dXgiLCJ5dXkiLCJ5dXoiLCJ5dmEiLCJ5dnQiLCJ5d2EiLCJ5d2ciLCJ5d2wiLCJ5d24iLCJ5d3EiLCJ5d3IiLCJ5d3QiLCJ5d3UiLCJ5d3ciLCJ5eGEiLCJ5eGciLCJ5eGwiLCJ5eG0iLCJ5eHUiLCJ5eHkiLCJ5eXIiLCJ5eXUiLCJ5eXoiLCJ5emciLCJ5emsiLCJ6YWEiLCJ6YWIiLCJ6YWMiLCJ6YWQiLCJ6YWUiLCJ6YWYiLCJ6YWciLCJ6YWgiLCJ6YWkiLCJ6YWoiLCJ6YWsiLCJ6YWwiLCJ6YW0iLCJ6YW8iLCJ6YXAiLCJ6YXEiLCJ6YXIiLCJ6YXMiLCJ6YXQiLCJ6YXUiLCJ6YXYiLCJ6YXciLCJ6YXgiLCJ6YXkiLCJ6YXoiLCJ6YmMiLCJ6YmUiLCJ6YmwiLCJ6YnQiLCJ6YnciLCJ6Y2EiLCJ6Y2giLCJ6ZGoiLCJ6ZWEiLCJ6ZWciLCJ6ZWgiLCJ6ZW4iLCJ6Z2EiLCJ6Z2IiLCJ6Z2giLCJ6Z20iLCJ6Z24iLCJ6Z3IiLCJ6aGIiLCJ6aGQiLCJ6aGkiLCJ6aG4iLCJ6aHciLCJ6aHgiLCJ6aWEiLCJ6aWIiLCJ6aWsiLCJ6aWwiLCJ6aW0iLCJ6aW4iLCJ6aXIiLCJ6aXciLCJ6aXoiLCJ6a2EiLCJ6a2IiLCJ6a2QiLCJ6a2ciLCJ6a2giLCJ6a2siLCJ6a24iLCJ6a28iLCJ6a3AiLCJ6a3IiLCJ6a3QiLCJ6a3UiLCJ6a3YiLCJ6a3oiLCJ6bGUiLCJ6bGoiLCJ6bG0iLCJ6bG4iLCJ6bHEiLCJ6bHMiLCJ6bHciLCJ6bWEiLCJ6bWIiLCJ6bWMiLCJ6bWQiLCJ6bWUiLCJ6bWYiLCJ6bWciLCJ6bWgiLCJ6bWkiLCJ6bWoiLCJ6bWsiLCJ6bWwiLCJ6bW0iLCJ6bW4iLCJ6bW8iLCJ6bXAiLCJ6bXEiLCJ6bXIiLCJ6bXMiLCJ6bXQiLCJ6bXUiLCJ6bXYiLCJ6bXciLCJ6bXgiLCJ6bXkiLCJ6bXoiLCJ6bmEiLCJ6bmQiLCJ6bmUiLCJ6bmciLCJ6bmsiLCJ6bnMiLCJ6b2MiLCJ6b2giLCJ6b20iLCJ6b28iLCJ6b3EiLCJ6b3IiLCJ6b3MiLCJ6cGEiLCJ6cGIiLCJ6cGMiLCJ6cGQiLCJ6cGUiLCJ6cGYiLCJ6cGciLCJ6cGgiLCJ6cGkiLCJ6cGoiLCJ6cGsiLCJ6cGwiLCJ6cG0iLCJ6cG4iLCJ6cG8iLCJ6cHAiLCJ6cHEiLCJ6cHIiLCJ6cHMiLCJ6cHQiLCJ6cHUiLCJ6cHYiLCJ6cHciLCJ6cHgiLCJ6cHkiLCJ6cHoiLCJ6cWUiLCJ6cmEiLCJ6cmciLCJ6cm4iLCJ6cm8iLCJ6cnAiLCJ6cnMiLCJ6c2EiLCJ6c2siLCJ6c2wiLCJ6c20iLCJ6c3IiLCJ6c3UiLCJ6dGUiLCJ6dGciLCJ6dGwiLCJ6dG0iLCJ6dG4iLCJ6dHAiLCJ6dHEiLCJ6dHMiLCJ6dHQiLCJ6dHUiLCJ6dHgiLCJ6dHkiLCJ6dWEiLCJ6dWgiLCJ6dW0iLCJ6dW4iLCJ6dXkiLCJ6d2EiLCJ6eHgiLCJ6eWIiLCJ6eWciLCJ6eWoiLCJ6eW4iLCJ6eXAiLCJ6emEiLCJ6emoiXTtheGUudXRpbHMudmFsaWRMYW5ncz1mdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztyZXR1cm4gbGFuZ3M7fTt9LHt9XSw5OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7V2ViSW5zcGVjdG9yLkNvbG9yPWZ1bmN0aW9uKHJnYmEsZm9ybWF0LG9yaWdpbmFsVGV4dCkKe3RoaXMuX3JnYmE9cmdiYTt0aGlzLl9vcmlnaW5hbFRleHQ9b3JpZ2luYWxUZXh0fHxudWxsO3RoaXMuX29yaWdpbmFsVGV4dElzVmFsaWQ9ISF0aGlzLl9vcmlnaW5hbFRleHQ7dGhpcy5fZm9ybWF0PWZvcm1hdDtpZih0eXBlb2YgdGhpcy5fcmdiYVszXT09PSJ1bmRlZmluZWQiKQp0aGlzLl9yZ2JhWzNdPTE7Zm9yKHZhciBpPTA7aTw0OysraSl7aWYodGhpcy5fcmdiYVtpXTwwKXt0aGlzLl9yZ2JhW2ldPTA7dGhpcy5fb3JpZ2luYWxUZXh0SXNWYWxpZD1mYWxzZTt9CmlmKHRoaXMuX3JnYmFbaV0+MSl7dGhpcy5fcmdiYVtpXT0xO3RoaXMuX29yaWdpbmFsVGV4dElzVmFsaWQ9ZmFsc2U7fX19O1dlYkluc3BlY3Rvci5Db2xvci5SZWdleD0vKCg/OnJnYnxoc2wpYT9cKFteKV0rXCl8I1swLTlhLWZBLUZdezZ9fCNbMC05YS1mQS1GXXszfXxcYlthLXpBLVpdK1xiKD8hLSkpL2c7V2ViSW5zcGVjdG9yLkNvbG9yLkZvcm1hdD17T3JpZ2luYWw6Im9yaWdpbmFsIixOaWNrbmFtZToibmlja25hbWUiLEhFWDoiaGV4IixTaG9ydEhFWDoic2hvcnRoZXgiLFJHQjoicmdiIixSR0JBOiJyZ2JhIixIU0w6ImhzbCIsSFNMQToiaHNsYSJ9O1dlYkluc3BlY3Rvci5Db2xvci5wYXJzZT1mdW5jdGlvbih0ZXh0KQp7dmFyIHZhbHVlPXRleHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiIik7dmFyIHNpbXBsZT0vXig/OiMoWzAtOWEtZl17M318WzAtOWEtZl17Nn0pfHJnYlwoKCg/Oi0/XGQrJT8sKXsyfS0/XGQrJT8pXCl8KFx3Kyl8aHNsXCgoLT9cZCtcLj9cZCooPzosLT9cZCtcLj9cZColKXsyfSlcKSkkL2k7dmFyIG1hdGNoPXZhbHVlLm1hdGNoKHNpbXBsZSk7aWYobWF0Y2gpe2lmKG1hdGNoWzFdKXt2YXIgaGV4PW1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7dmFyIGZvcm1hdDtpZihoZXgubGVuZ3RoPT09Myl7Zm9ybWF0PVdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuU2hvcnRIRVg7aGV4PWhleC5jaGFyQXQoMCkraGV4LmNoYXJBdCgwKStoZXguY2hhckF0KDEpK2hleC5jaGFyQXQoMSkraGV4LmNoYXJBdCgyKStoZXguY2hhckF0KDIpO31lbHNlCmZvcm1hdD1XZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LkhFWDt2YXIgcj1wYXJzZUludChoZXguc3Vic3RyaW5nKDAsMiksMTYpO3ZhciBnPXBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiw0KSwxNik7dmFyIGI9cGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LDYpLDE2KTtyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5Db2xvcihbci8yNTUsZy8yNTUsYi8yNTUsMV0sZm9ybWF0LHRleHQpO30KaWYobWF0Y2hbMl0pe3ZhciByZ2JTdHJpbmc9bWF0Y2hbMl0uc3BsaXQoL1xzKixccyovKTt2YXIgcmdiYT1bV2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZVJnYk51bWVyaWMocmdiU3RyaW5nWzBdKSxXZWJJbnNwZWN0b3IuQ29sb3IuX3BhcnNlUmdiTnVtZXJpYyhyZ2JTdHJpbmdbMV0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHJnYlN0cmluZ1syXSksMV07cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ29sb3IocmdiYSxXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LlJHQix0ZXh0KTt9CmlmKG1hdGNoWzNdKXt2YXIgbmlja25hbWU9bWF0Y2hbM10udG9Mb3dlckNhc2UoKTtpZihuaWNrbmFtZSBpbiBXZWJJbnNwZWN0b3IuQ29sb3IuTmlja25hbWVzKXt2YXIgcmdiYT1XZWJJbnNwZWN0b3IuQ29sb3IuTmlja25hbWVzW25pY2tuYW1lXTt2YXIgY29sb3I9V2ViSW5zcGVjdG9yLkNvbG9yLmZyb21SR0JBKHJnYmEpO2NvbG9yLl9mb3JtYXQ9V2ViSW5zcGVjdG9yLkNvbG9yLkZvcm1hdC5OaWNrbmFtZTtjb2xvci5fb3JpZ2luYWxUZXh0PXRleHQ7cmV0dXJuIGNvbG9yO30KcmV0dXJuIG51bGw7fQppZihtYXRjaFs0XSl7dmFyIGhzbFN0cmluZz1tYXRjaFs0XS5yZXBsYWNlKC8lL2csIiIpLnNwbGl0KC9ccyosXHMqLyk7dmFyIGhzbGE9W1dlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VIdWVOdW1lcmljKGhzbFN0cmluZ1swXSksV2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZVNhdExpZ2h0TnVtZXJpYyhoc2xTdHJpbmdbMV0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VTYXRMaWdodE51bWVyaWMoaHNsU3RyaW5nWzJdKSwxXTt2YXIgcmdiYT1bXTtXZWJJbnNwZWN0b3IuQ29sb3IuaHNsMnJnYihoc2xhLHJnYmEpO3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLkNvbG9yKHJnYmEsV2ViSW5zcGVjdG9yLkNvbG9yLkZvcm1hdC5IU0wsdGV4dCk7fQpyZXR1cm4gbnVsbDt9CnZhciBhZHZhbmNlZD0vXig/OnJnYmFcKCgoPzotP1xkKyU/LCl7M30tPyg/OlxkK3xcZCpcLlxkKykpXCl8aHNsYVwoKC0/KD86XGQrfFxkKlwuXGQrKSg/OiwtPyg/OlxkK3xcZCpcLlxkKykqJSl7Mn0sLT8oPzpcZCt8XGQqXC5cZCspKVwpKSQvO21hdGNoPXZhbHVlLm1hdGNoKGFkdmFuY2VkKTtpZihtYXRjaCl7aWYobWF0Y2hbMV0pe3ZhciByZ2JhU3RyaW5nPW1hdGNoWzFdLnNwbGl0KC9ccyosXHMqLyk7dmFyIHJnYmE9W1dlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHJnYmFTdHJpbmdbMF0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHJnYmFTdHJpbmdbMV0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VSZ2JOdW1lcmljKHJnYmFTdHJpbmdbMl0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VBbHBoYU51bWVyaWMocmdiYVN0cmluZ1szXSldO3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLkNvbG9yKHJnYmEsV2ViSW5zcGVjdG9yLkNvbG9yLkZvcm1hdC5SR0JBLHRleHQpO30KaWYobWF0Y2hbMl0pe3ZhciBoc2xhU3RyaW5nPW1hdGNoWzJdLnJlcGxhY2UoLyUvZywiIikuc3BsaXQoL1xzKixccyovKTt2YXIgaHNsYT1bV2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZUh1ZU51bWVyaWMoaHNsYVN0cmluZ1swXSksV2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZVNhdExpZ2h0TnVtZXJpYyhoc2xhU3RyaW5nWzFdKSxXZWJJbnNwZWN0b3IuQ29sb3IuX3BhcnNlU2F0TGlnaHROdW1lcmljKGhzbGFTdHJpbmdbMl0pLFdlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VBbHBoYU51bWVyaWMoaHNsYVN0cmluZ1szXSldO3ZhciByZ2JhPVtdO1dlYkluc3BlY3Rvci5Db2xvci5oc2wycmdiKGhzbGEscmdiYSk7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ29sb3IocmdiYSxXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LkhTTEEsdGV4dCk7fX0KcmV0dXJuIG51bGw7fTtXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkE9ZnVuY3Rpb24ocmdiYSkKe3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLkNvbG9yKFtyZ2JhWzBdLzI1NSxyZ2JhWzFdLzI1NSxyZ2JhWzJdLzI1NSxyZ2JhWzNdXSxXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LlJHQkEpO307V2ViSW5zcGVjdG9yLkNvbG9yLmZyb21IU1ZBPWZ1bmN0aW9uKGhzdmEpCnt2YXIgcmdiYT1bXTtXZWJJbnNwZWN0b3IuQ29sb3IuaHN2YTJyZ2JhKGhzdmEscmdiYSk7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ29sb3IocmdiYSxXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LkhTTEEpO307V2ViSW5zcGVjdG9yLkNvbG9yLnByb3RvdHlwZT17Zm9ybWF0OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9mb3JtYXQ7fSxoc2xhOmZ1bmN0aW9uKCkKe2lmKHRoaXMuX2hzbGEpCnJldHVybiB0aGlzLl9oc2xhO3ZhciByPXRoaXMuX3JnYmFbMF07dmFyIGc9dGhpcy5fcmdiYVsxXTt2YXIgYj10aGlzLl9yZ2JhWzJdO3ZhciBtYXg9TWF0aC5tYXgocixnLGIpO3ZhciBtaW49TWF0aC5taW4ocixnLGIpO3ZhciBkaWZmPW1heC1taW47dmFyIGFkZD1tYXgrbWluO2lmKG1pbj09PW1heCkKdmFyIGg9MDtlbHNlCmlmKHI9PT1tYXgpCnZhciBoPSgxLzYqKGctYikvZGlmZisxKSUxO2Vsc2UKaWYoZz09PW1heCkKdmFyIGg9MS82KihiLXIpL2RpZmYrMS8zO2Vsc2UKdmFyIGg9MS82KihyLWcpL2RpZmYrMi8zO3ZhciBsPTAuNSphZGQ7aWYobD09PTApCnZhciBzPTA7ZWxzZQppZihsPT09MSkKdmFyIHM9MDtlbHNlCmlmKGw8PTAuNSkKdmFyIHM9ZGlmZi9hZGQ7ZWxzZQp2YXIgcz1kaWZmLygyLWFkZCk7dGhpcy5faHNsYT1baCxzLGwsdGhpcy5fcmdiYVszXV07cmV0dXJuIHRoaXMuX2hzbGE7fSxjYW5vbmljYWxIU0xBOmZ1bmN0aW9uKCkKe3ZhciBoc2xhPXRoaXMuaHNsYSgpO3JldHVybltNYXRoLnJvdW5kKGhzbGFbMF0qMzYwKSxNYXRoLnJvdW5kKGhzbGFbMV0qMTAwKSxNYXRoLnJvdW5kKGhzbGFbMl0qMTAwKSxoc2xhWzNdXTt9LGhzdmE6ZnVuY3Rpb24oKQp7dmFyIGhzbGE9dGhpcy5oc2xhKCk7dmFyIGg9aHNsYVswXTt2YXIgcz1oc2xhWzFdO3ZhciBsPWhzbGFbMl07cyo9bDwwLjU/bDoxLWw7cmV0dXJuW2gscyE9PTA/MipzLyhsK3MpOjAsbCtzLGhzbGFbM11dO30saGFzQWxwaGE6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3JnYmFbM10hPT0xO30sY2FuQmVTaG9ydEhleDpmdW5jdGlvbigpCntpZih0aGlzLmhhc0FscGhhKCkpCnJldHVybiBmYWxzZTtmb3IodmFyIGk9MDtpPDM7KytpKXt2YXIgYz1NYXRoLnJvdW5kKHRoaXMuX3JnYmFbaV0qMjU1KTtpZihjJTE3KQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9LGFzU3RyaW5nOmZ1bmN0aW9uKGZvcm1hdCkKe2lmKGZvcm1hdD09PXRoaXMuX2Zvcm1hdCYmdGhpcy5fb3JpZ2luYWxUZXh0SXNWYWxpZCkKcmV0dXJuIHRoaXMuX29yaWdpbmFsVGV4dDtpZighZm9ybWF0KQpmb3JtYXQ9dGhpcy5fZm9ybWF0O2Z1bmN0aW9uIHRvUmdiVmFsdWUodmFsdWUpCntyZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSoyNTUpO30KZnVuY3Rpb24gdG9IZXhWYWx1ZSh2YWx1ZSkKe3ZhciBoZXg9TWF0aC5yb3VuZCh2YWx1ZSoyNTUpLnRvU3RyaW5nKDE2KTtyZXR1cm4gaGV4Lmxlbmd0aD09PTE/IjAiK2hleDpoZXg7fQpmdW5jdGlvbiB0b1Nob3J0SGV4VmFsdWUodmFsdWUpCntyZXR1cm4oTWF0aC5yb3VuZCh2YWx1ZSoyNTUpLzE3KS50b1N0cmluZygxNik7fQpzd2l0Y2goZm9ybWF0KXtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuT3JpZ2luYWw6cmV0dXJuIHRoaXMuX29yaWdpbmFsVGV4dDtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuUkdCOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCJyZ2IoJWQsICVkLCAlZCkiLHRvUmdiVmFsdWUodGhpcy5fcmdiYVswXSksdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzFdKSx0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMl0pKTtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuUkdCQTpyZXR1cm4gU3RyaW5nLnNwcmludGYoInJnYmEoJWQsICVkLCAlZCwgJWYpIix0b1JnYlZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvUmdiVmFsdWUodGhpcy5fcmdiYVsxXSksdG9SZ2JWYWx1ZSh0aGlzLl9yZ2JhWzJdKSx0aGlzLl9yZ2JhWzNdKTtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuSFNMOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7dmFyIGhzbD10aGlzLmhzbGEoKTtyZXR1cm4gU3RyaW5nLnNwcmludGYoImhzbCglZCwgJWQlLCAlZCUpIixNYXRoLnJvdW5kKGhzbFswXSozNjApLE1hdGgucm91bmQoaHNsWzFdKjEwMCksTWF0aC5yb3VuZChoc2xbMl0qMTAwKSk7Y2FzZSBXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LkhTTEE6dmFyIGhzbGE9dGhpcy5oc2xhKCk7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCJoc2xhKCVkLCAlZCUsICVkJSwgJWYpIixNYXRoLnJvdW5kKGhzbGFbMF0qMzYwKSxNYXRoLnJvdW5kKGhzbGFbMV0qMTAwKSxNYXRoLnJvdW5kKGhzbGFbMl0qMTAwKSxoc2xhWzNdKTtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuSEVYOmlmKHRoaXMuaGFzQWxwaGEoKSkKcmV0dXJuIG51bGw7cmV0dXJuIFN0cmluZy5zcHJpbnRmKCIjJXMlcyVzIix0b0hleFZhbHVlKHRoaXMuX3JnYmFbMF0pLHRvSGV4VmFsdWUodGhpcy5fcmdiYVsxXSksdG9IZXhWYWx1ZSh0aGlzLl9yZ2JhWzJdKSkudG9Mb3dlckNhc2UoKTtjYXNlIFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuU2hvcnRIRVg6aWYoIXRoaXMuY2FuQmVTaG9ydEhleCgpKQpyZXR1cm4gbnVsbDtyZXR1cm4gU3RyaW5nLnNwcmludGYoIiMlcyVzJXMiLHRvU2hvcnRIZXhWYWx1ZSh0aGlzLl9yZ2JhWzBdKSx0b1Nob3J0SGV4VmFsdWUodGhpcy5fcmdiYVsxXSksdG9TaG9ydEhleFZhbHVlKHRoaXMuX3JnYmFbMl0pKS50b0xvd2VyQ2FzZSgpO2Nhc2UgV2ViSW5zcGVjdG9yLkNvbG9yLkZvcm1hdC5OaWNrbmFtZTpyZXR1cm4gdGhpcy5uaWNrbmFtZSgpO30KcmV0dXJuIHRoaXMuX29yaWdpbmFsVGV4dDt9LHJnYmE6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3JnYmEuc2xpY2UoKTt9LGNhbm9uaWNhbFJHQkE6ZnVuY3Rpb24oKQp7dmFyIHJnYmE9bmV3IEFycmF5KDQpO2Zvcih2YXIgaT0wO2k8MzsrK2kpCnJnYmFbaV09TWF0aC5yb3VuZCh0aGlzLl9yZ2JhW2ldKjI1NSk7cmdiYVszXT10aGlzLl9yZ2JhWzNdO3JldHVybiByZ2JhO30sbmlja25hbWU6ZnVuY3Rpb24oKQp7aWYoIVdlYkluc3BlY3Rvci5Db2xvci5fcmdiYVRvTmlja25hbWUpe1dlYkluc3BlY3Rvci5Db2xvci5fcmdiYVRvTmlja25hbWU9e307Zm9yKHZhciBuaWNrbmFtZSBpbiBXZWJJbnNwZWN0b3IuQ29sb3IuTmlja25hbWVzKXt2YXIgcmdiYT1XZWJJbnNwZWN0b3IuQ29sb3IuTmlja25hbWVzW25pY2tuYW1lXTtpZihyZ2JhLmxlbmd0aCE9PTQpCnJnYmE9cmdiYS5jb25jYXQoMSk7V2ViSW5zcGVjdG9yLkNvbG9yLl9yZ2JhVG9OaWNrbmFtZVtyZ2JhXT1uaWNrbmFtZTt9fQpyZXR1cm4gV2ViSW5zcGVjdG9yLkNvbG9yLl9yZ2JhVG9OaWNrbmFtZVt0aGlzLmNhbm9uaWNhbFJHQkEoKV18fG51bGw7fSx0b1Byb3RvY29sUkdCQTpmdW5jdGlvbigpCnt2YXIgcmdiYT10aGlzLmNhbm9uaWNhbFJHQkEoKTt2YXIgcmVzdWx0PXtyOnJnYmFbMF0sZzpyZ2JhWzFdLGI6cmdiYVsyXX07aWYocmdiYVszXSE9PTEpCnJlc3VsdC5hPXJnYmFbM107cmV0dXJuIHJlc3VsdDt9LGludmVydDpmdW5jdGlvbigpCnt2YXIgcmdiYT1bXTtyZ2JhWzBdPTEtdGhpcy5fcmdiYVswXTtyZ2JhWzFdPTEtdGhpcy5fcmdiYVsxXTtyZ2JhWzJdPTEtdGhpcy5fcmdiYVsyXTtyZ2JhWzNdPXRoaXMuX3JnYmFbM107cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ29sb3IocmdiYSxXZWJJbnNwZWN0b3IuQ29sb3IuRm9ybWF0LlJHQkEpO30sc2V0QWxwaGE6ZnVuY3Rpb24oYWxwaGEpCnt2YXIgcmdiYT10aGlzLl9yZ2JhLnNsaWNlKCk7cmdiYVszXT1hbHBoYTtyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5Db2xvcihyZ2JhLFdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQuUkdCQSk7fX07V2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZVJnYk51bWVyaWM9ZnVuY3Rpb24odmFsdWUpCnt2YXIgcGFyc2VkPXBhcnNlSW50KHZhbHVlLDEwKTtpZih2YWx1ZS5pbmRleE9mKCIlIikhPT0tMSkKcGFyc2VkLz0xMDA7ZWxzZQpwYXJzZWQvPTI1NTtyZXR1cm4gcGFyc2VkO307V2ViSW5zcGVjdG9yLkNvbG9yLl9wYXJzZUh1ZU51bWVyaWM9ZnVuY3Rpb24odmFsdWUpCntyZXR1cm4gaXNOYU4odmFsdWUpPzA6cGFyc2VGbG9hdCh2YWx1ZSkvMzYwJTE7fTtXZWJJbnNwZWN0b3IuQ29sb3IuX3BhcnNlU2F0TGlnaHROdW1lcmljPWZ1bmN0aW9uKHZhbHVlKQp7cmV0dXJuIE1hdGgubWluKDEscGFyc2VGbG9hdCh2YWx1ZSkvMTAwKTt9O1dlYkluc3BlY3Rvci5Db2xvci5fcGFyc2VBbHBoYU51bWVyaWM9ZnVuY3Rpb24odmFsdWUpCntyZXR1cm4gaXNOYU4odmFsdWUpPzA6cGFyc2VGbG9hdCh2YWx1ZSk7fTtXZWJJbnNwZWN0b3IuQ29sb3IuX2hzdmEyaHNsYT1mdW5jdGlvbihoc3ZhLG91dF9oc2xhKQp7dmFyIGg9aHN2YVswXTt2YXIgcz1oc3ZhWzFdO3ZhciB2PWhzdmFbMl07dmFyIHQ9KDItcykqdjtpZih2PT09MHx8cz09PTApCnM9MDtlbHNlCnMqPXYvKHQ8MT90OjItdCk7b3V0X2hzbGFbMF09aDtvdXRfaHNsYVsxXT1zO291dF9oc2xhWzJdPXQvMjtvdXRfaHNsYVszXT1oc3ZhWzNdO307V2ViSW5zcGVjdG9yLkNvbG9yLmhzbDJyZ2I9ZnVuY3Rpb24oaHNsLG91dF9yZ2IpCnt2YXIgaD1oc2xbMF07dmFyIHM9aHNsWzFdO3ZhciBsPWhzbFsyXTtmdW5jdGlvbiBodWUycmdiKHAscSxoKQp7aWYoaDwwKQpoKz0xO2Vsc2UKaWYoaD4xKQpoLT0xO2lmKGgqNjwxKQpyZXR1cm4gcCsocS1wKSpoKjY7ZWxzZQppZihoKjI8MSkKcmV0dXJuIHE7ZWxzZQppZihoKjM8MikKcmV0dXJuIHArKHEtcCkqKDIvMy1oKSo2O2Vsc2UKcmV0dXJuIHA7fQppZihzPDApCnM9MDtpZihsPD0wLjUpCnZhciBxPWwqKDErcyk7ZWxzZQp2YXIgcT1sK3MtbCpzO3ZhciBwPTIqbC1xO3ZhciB0cj1oKzEvMzt2YXIgdGc9aDt2YXIgdGI9aC0xLzM7b3V0X3JnYlswXT1odWUycmdiKHAscSx0cik7b3V0X3JnYlsxXT1odWUycmdiKHAscSx0Zyk7b3V0X3JnYlsyXT1odWUycmdiKHAscSx0Yik7b3V0X3JnYlszXT1oc2xbM107fTtXZWJJbnNwZWN0b3IuQ29sb3IuaHN2YTJyZ2JhPWZ1bmN0aW9uKGhzdmEsb3V0X3JnYmEpCntXZWJJbnNwZWN0b3IuQ29sb3IuX2hzdmEyaHNsYShoc3ZhLFdlYkluc3BlY3Rvci5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEEpO1dlYkluc3BlY3Rvci5Db2xvci5oc2wycmdiKFdlYkluc3BlY3Rvci5Db2xvci5oc3ZhMnJnYmEuX3RtcEhTTEEsb3V0X3JnYmEpO2Zvcih2YXIgaT0wO2k8V2ViSW5zcGVjdG9yLkNvbG9yLmhzdmEycmdiYS5fdG1wSFNMQS5sZW5ndGg7aSsrKQpXZWJJbnNwZWN0b3IuQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBW2ldPTA7fTtXZWJJbnNwZWN0b3IuQ29sb3IuaHN2YTJyZ2JhLl90bXBIU0xBPVswLDAsMCwwXTtXZWJJbnNwZWN0b3IuQ29sb3IubHVtaW5hbmNlPWZ1bmN0aW9uKHJnYmEpCnt2YXIgclNSR0I9cmdiYVswXTt2YXIgZ1NSR0I9cmdiYVsxXTt2YXIgYlNSR0I9cmdiYVsyXTt2YXIgcj1yU1JHQjw9MC4wMzkyOD9yU1JHQi8xMi45MjpNYXRoLnBvdygoclNSR0IrMC4wNTUpLzEuMDU1LDIuNCk7dmFyIGc9Z1NSR0I8PTAuMDM5Mjg/Z1NSR0IvMTIuOTI6TWF0aC5wb3coKGdTUkdCKzAuMDU1KS8xLjA1NSwyLjQpO3ZhciBiPWJTUkdCPD0wLjAzOTI4P2JTUkdCLzEyLjkyOk1hdGgucG93KChiU1JHQiswLjA1NSkvMS4wNTUsMi40KTtyZXR1cm4gMC4yMTI2KnIrMC43MTUyKmcrMC4wNzIyKmI7fTtXZWJJbnNwZWN0b3IuQ29sb3IuYmxlbmRDb2xvcnM9ZnVuY3Rpb24oZmdSR0JBLGJnUkdCQSxvdXRfYmxlbmRlZCkKe3ZhciBhbHBoYT1mZ1JHQkFbM107b3V0X2JsZW5kZWRbMF09KDEtYWxwaGEpKmJnUkdCQVswXSthbHBoYSpmZ1JHQkFbMF07b3V0X2JsZW5kZWRbMV09KDEtYWxwaGEpKmJnUkdCQVsxXSthbHBoYSpmZ1JHQkFbMV07b3V0X2JsZW5kZWRbMl09KDEtYWxwaGEpKmJnUkdCQVsyXSthbHBoYSpmZ1JHQkFbMl07b3V0X2JsZW5kZWRbM109YWxwaGErYmdSR0JBWzNdKigxLWFscGhhKTt9O1dlYkluc3BlY3Rvci5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvPWZ1bmN0aW9uKGZnUkdCQSxiZ1JHQkEpCntXZWJJbnNwZWN0b3IuQ29sb3IuYmxlbmRDb2xvcnMoZmdSR0JBLGJnUkdCQSxXZWJJbnNwZWN0b3IuQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnKTt2YXIgZmdMdW1pbmFuY2U9V2ViSW5zcGVjdG9yLkNvbG9yLmx1bWluYW5jZShXZWJJbnNwZWN0b3IuQ29sb3IuY2FsY3VsYXRlQ29udHJhc3RSYXRpby5fYmxlbmRlZEZnKTt2YXIgYmdMdW1pbmFuY2U9V2ViSW5zcGVjdG9yLkNvbG9yLmx1bWluYW5jZShiZ1JHQkEpO3ZhciBjb250cmFzdFJhdGlvPShNYXRoLm1heChmZ0x1bWluYW5jZSxiZ0x1bWluYW5jZSkrMC4wNSkvKE1hdGgubWluKGZnTHVtaW5hbmNlLGJnTHVtaW5hbmNlKSswLjA1KTtmb3IodmFyIGk9MDtpPFdlYkluc3BlY3Rvci5Db2xvci5jYWxjdWxhdGVDb250cmFzdFJhdGlvLl9ibGVuZGVkRmcubGVuZ3RoO2krKykKV2ViSW5zcGVjdG9yLkNvbG9yLmNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8uX2JsZW5kZWRGZ1tpXT0wO3JldHVybiBjb250cmFzdFJhdGlvO307V2ViSW5zcGVjdG9yLkNvbG9yLmNhbGN1bGF0ZUNvbnRyYXN0UmF0aW8uX2JsZW5kZWRGZz1bMCwwLDAsMF07V2ViSW5zcGVjdG9yLkNvbG9yLmRlc2lyZWRMdW1pbmFuY2U9ZnVuY3Rpb24obHVtaW5hbmNlLGNvbnRyYXN0LGxpZ2h0ZXIpCntmdW5jdGlvbiBjb21wdXRlTHVtaW5hbmNlKCkKe2lmKGxpZ2h0ZXIpCnJldHVybihsdW1pbmFuY2UrMC4wNSkqY29udHJhc3QtMC4wNTtlbHNlCnJldHVybihsdW1pbmFuY2UrMC4wNSkvY29udHJhc3QtMC4wNTt9CnZhciBkZXNpcmVkTHVtaW5hbmNlPWNvbXB1dGVMdW1pbmFuY2UoKTtpZihkZXNpcmVkTHVtaW5hbmNlPDB8fGRlc2lyZWRMdW1pbmFuY2U+MSl7bGlnaHRlcj0hbGlnaHRlcjtkZXNpcmVkTHVtaW5hbmNlPWNvbXB1dGVMdW1pbmFuY2UoKTt9CnJldHVybiBkZXNpcmVkTHVtaW5hbmNlO307V2ViSW5zcGVjdG9yLkNvbG9yLk5pY2tuYW1lcz17ImFsaWNlYmx1ZSI6WzI0MCwyNDgsMjU1XSwiYW50aXF1ZXdoaXRlIjpbMjUwLDIzNSwyMTVdLCJhcXVhIjpbMCwyNTUsMjU1XSwiYXF1YW1hcmluZSI6WzEyNywyNTUsMjEyXSwiYXp1cmUiOlsyNDAsMjU1LDI1NV0sImJlaWdlIjpbMjQ1LDI0NSwyMjBdLCJiaXNxdWUiOlsyNTUsMjI4LDE5Nl0sImJsYWNrIjpbMCwwLDBdLCJibGFuY2hlZGFsbW9uZCI6WzI1NSwyMzUsMjA1XSwiYmx1ZSI6WzAsMCwyNTVdLCJibHVldmlvbGV0IjpbMTM4LDQzLDIyNl0sImJyb3duIjpbMTY1LDQyLDQyXSwiYnVybHl3b29kIjpbMjIyLDE4NCwxMzVdLCJjYWRldGJsdWUiOls5NSwxNTgsMTYwXSwiY2hhcnRyZXVzZSI6WzEyNywyNTUsMF0sImNob2NvbGF0ZSI6WzIxMCwxMDUsMzBdLCJjb3JhbCI6WzI1NSwxMjcsODBdLCJjb3JuZmxvd2VyYmx1ZSI6WzEwMCwxNDksMjM3XSwiY29ybnNpbGsiOlsyNTUsMjQ4LDIyMF0sImNyaW1zb24iOlsyMzcsMjAsNjFdLCJjeWFuIjpbMCwyNTUsMjU1XSwiZGFya2JsdWUiOlswLDAsMTM5XSwiZGFya2N5YW4iOlswLDEzOSwxMzldLCJkYXJrZ29sZGVucm9kIjpbMTg0LDEzNCwxMV0sImRhcmtncmF5IjpbMTY5LDE2OSwxNjldLCJkYXJrZ3JleSI6WzE2OSwxNjksMTY5XSwiZGFya2dyZWVuIjpbMCwxMDAsMF0sImRhcmtraGFraSI6WzE4OSwxODMsMTA3XSwiZGFya21hZ2VudGEiOlsxMzksMCwxMzldLCJkYXJrb2xpdmVncmVlbiI6Wzg1LDEwNyw0N10sImRhcmtvcmFuZ2UiOlsyNTUsMTQwLDBdLCJkYXJrb3JjaGlkIjpbMTUzLDUwLDIwNF0sImRhcmtyZWQiOlsxMzksMCwwXSwiZGFya3NhbG1vbiI6WzIzMywxNTAsMTIyXSwiZGFya3NlYWdyZWVuIjpbMTQzLDE4OCwxNDNdLCJkYXJrc2xhdGVibHVlIjpbNzIsNjEsMTM5XSwiZGFya3NsYXRlZ3JheSI6WzQ3LDc5LDc5XSwiZGFya3NsYXRlZ3JleSI6WzQ3LDc5LDc5XSwiZGFya3R1cnF1b2lzZSI6WzAsMjA2LDIwOV0sImRhcmt2aW9sZXQiOlsxNDgsMCwyMTFdLCJkZWVwcGluayI6WzI1NSwyMCwxNDddLCJkZWVwc2t5Ymx1ZSI6WzAsMTkxLDI1NV0sImRpbWdyYXkiOlsxMDUsMTA1LDEwNV0sImRpbWdyZXkiOlsxMDUsMTA1LDEwNV0sImRvZGdlcmJsdWUiOlszMCwxNDQsMjU1XSwiZmlyZWJyaWNrIjpbMTc4LDM0LDM0XSwiZmxvcmFsd2hpdGUiOlsyNTUsMjUwLDI0MF0sImZvcmVzdGdyZWVuIjpbMzQsMTM5LDM0XSwiZnVjaHNpYSI6WzI1NSwwLDI1NV0sImdhaW5zYm9ybyI6WzIyMCwyMjAsMjIwXSwiZ2hvc3R3aGl0ZSI6WzI0OCwyNDgsMjU1XSwiZ29sZCI6WzI1NSwyMTUsMF0sImdvbGRlbnJvZCI6WzIxOCwxNjUsMzJdLCJncmF5IjpbMTI4LDEyOCwxMjhdLCJncmV5IjpbMTI4LDEyOCwxMjhdLCJncmVlbiI6WzAsMTI4LDBdLCJncmVlbnllbGxvdyI6WzE3MywyNTUsNDddLCJob25leWRldyI6WzI0MCwyNTUsMjQwXSwiaG90cGluayI6WzI1NSwxMDUsMTgwXSwiaW5kaWFucmVkIjpbMjA1LDkyLDkyXSwiaW5kaWdvIjpbNzUsMCwxMzBdLCJpdm9yeSI6WzI1NSwyNTUsMjQwXSwia2hha2kiOlsyNDAsMjMwLDE0MF0sImxhdmVuZGVyIjpbMjMwLDIzMCwyNTBdLCJsYXZlbmRlcmJsdXNoIjpbMjU1LDI0MCwyNDVdLCJsYXduZ3JlZW4iOlsxMjQsMjUyLDBdLCJsZW1vbmNoaWZmb24iOlsyNTUsMjUwLDIwNV0sImxpZ2h0Ymx1ZSI6WzE3MywyMTYsMjMwXSwibGlnaHRjb3JhbCI6WzI0MCwxMjgsMTI4XSwibGlnaHRjeWFuIjpbMjI0LDI1NSwyNTVdLCJsaWdodGdvbGRlbnJvZHllbGxvdyI6WzI1MCwyNTAsMjEwXSwibGlnaHRncmVlbiI6WzE0NCwyMzgsMTQ0XSwibGlnaHRncmF5IjpbMjExLDIxMSwyMTFdLCJsaWdodGdyZXkiOlsyMTEsMjExLDIxMV0sImxpZ2h0cGluayI6WzI1NSwxODIsMTkzXSwibGlnaHRzYWxtb24iOlsyNTUsMTYwLDEyMl0sImxpZ2h0c2VhZ3JlZW4iOlszMiwxNzgsMTcwXSwibGlnaHRza3libHVlIjpbMTM1LDIwNiwyNTBdLCJsaWdodHNsYXRlZ3JheSI6WzExOSwxMzYsMTUzXSwibGlnaHRzbGF0ZWdyZXkiOlsxMTksMTM2LDE1M10sImxpZ2h0c3RlZWxibHVlIjpbMTc2LDE5NiwyMjJdLCJsaWdodHllbGxvdyI6WzI1NSwyNTUsMjI0XSwibGltZSI6WzAsMjU1LDBdLCJsaW1lZ3JlZW4iOls1MCwyMDUsNTBdLCJsaW5lbiI6WzI1MCwyNDAsMjMwXSwibWFnZW50YSI6WzI1NSwwLDI1NV0sIm1hcm9vbiI6WzEyOCwwLDBdLCJtZWRpdW1hcXVhbWFyaW5lIjpbMTAyLDIwNSwxNzBdLCJtZWRpdW1ibHVlIjpbMCwwLDIwNV0sIm1lZGl1bW9yY2hpZCI6WzE4Niw4NSwyMTFdLCJtZWRpdW1wdXJwbGUiOlsxNDcsMTEyLDIxOV0sIm1lZGl1bXNlYWdyZWVuIjpbNjAsMTc5LDExM10sIm1lZGl1bXNsYXRlYmx1ZSI6WzEyMywxMDQsMjM4XSwibWVkaXVtc3ByaW5nZ3JlZW4iOlswLDI1MCwxNTRdLCJtZWRpdW10dXJxdW9pc2UiOls3MiwyMDksMjA0XSwibWVkaXVtdmlvbGV0cmVkIjpbMTk5LDIxLDEzM10sIm1pZG5pZ2h0Ymx1ZSI6WzI1LDI1LDExMl0sIm1pbnRjcmVhbSI6WzI0NSwyNTUsMjUwXSwibWlzdHlyb3NlIjpbMjU1LDIyOCwyMjVdLCJtb2NjYXNpbiI6WzI1NSwyMjgsMTgxXSwibmF2YWpvd2hpdGUiOlsyNTUsMjIyLDE3M10sIm5hdnkiOlswLDAsMTI4XSwib2xkbGFjZSI6WzI1MywyNDUsMjMwXSwib2xpdmUiOlsxMjgsMTI4LDBdLCJvbGl2ZWRyYWIiOlsxMDcsMTQyLDM1XSwib3JhbmdlIjpbMjU1LDE2NSwwXSwib3JhbmdlcmVkIjpbMjU1LDY5LDBdLCJvcmNoaWQiOlsyMTgsMTEyLDIxNF0sInBhbGVnb2xkZW5yb2QiOlsyMzgsMjMyLDE3MF0sInBhbGVncmVlbiI6WzE1MiwyNTEsMTUyXSwicGFsZXR1cnF1b2lzZSI6WzE3NSwyMzgsMjM4XSwicGFsZXZpb2xldHJlZCI6WzIxOSwxMTIsMTQ3XSwicGFwYXlhd2hpcCI6WzI1NSwyMzksMjEzXSwicGVhY2hwdWZmIjpbMjU1LDIxOCwxODVdLCJwZXJ1IjpbMjA1LDEzMyw2M10sInBpbmsiOlsyNTUsMTkyLDIwM10sInBsdW0iOlsyMjEsMTYwLDIyMV0sInBvd2RlcmJsdWUiOlsxNzYsMjI0LDIzMF0sInB1cnBsZSI6WzEyOCwwLDEyOF0sInJlYmVjY2FwdXJwbGUiOlsxMDIsNTEsMTUzXSwicmVkIjpbMjU1LDAsMF0sInJvc3licm93biI6WzE4OCwxNDMsMTQzXSwicm95YWxibHVlIjpbNjUsMTA1LDIyNV0sInNhZGRsZWJyb3duIjpbMTM5LDY5LDE5XSwic2FsbW9uIjpbMjUwLDEyOCwxMTRdLCJzYW5keWJyb3duIjpbMjQ0LDE2NCw5Nl0sInNlYWdyZWVuIjpbNDYsMTM5LDg3XSwic2Vhc2hlbGwiOlsyNTUsMjQ1LDIzOF0sInNpZW5uYSI6WzE2MCw4Miw0NV0sInNpbHZlciI6WzE5MiwxOTIsMTkyXSwic2t5Ymx1ZSI6WzEzNSwyMDYsMjM1XSwic2xhdGVibHVlIjpbMTA2LDkwLDIwNV0sInNsYXRlZ3JheSI6WzExMiwxMjgsMTQ0XSwic2xhdGVncmV5IjpbMTEyLDEyOCwxNDRdLCJzbm93IjpbMjU1LDI1MCwyNTBdLCJzcHJpbmdncmVlbiI6WzAsMjU1LDEyN10sInN0ZWVsYmx1ZSI6WzcwLDEzMCwxODBdLCJ0YW4iOlsyMTAsMTgwLDE0MF0sInRlYWwiOlswLDEyOCwxMjhdLCJ0aGlzdGxlIjpbMjE2LDE5MSwyMTZdLCJ0b21hdG8iOlsyNTUsOTksNzFdLCJ0dXJxdW9pc2UiOls2NCwyMjQsMjA4XSwidmlvbGV0IjpbMjM4LDEzMCwyMzhdLCJ3aGVhdCI6WzI0NSwyMjIsMTc5XSwid2hpdGUiOlsyNTUsMjU1LDI1NV0sIndoaXRlc21va2UiOlsyNDUsMjQ1LDI0NV0sInllbGxvdyI6WzI1NSwyNTUsMF0sInllbGxvd2dyZWVuIjpbMTU0LDIwNSw1MF0sInRyYW5zcGFyZW50IjpbMCwwLDAsMF19O1dlYkluc3BlY3Rvci5Db2xvci5QYWdlSGlnaGxpZ2h0PXtDb250ZW50OldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbMTExLDE2OCwyMjAsLjY2XSksQ29udGVudExpZ2h0OldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbMTExLDE2OCwyMjAsLjVdKSxDb250ZW50T3V0bGluZTpXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkEoWzksODMsMTQ4XSksUGFkZGluZzpXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkEoWzE0NywxOTYsMTI1LC41NV0pLFBhZGRpbmdMaWdodDpXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkEoWzE0NywxOTYsMTI1LC40XSksQm9yZGVyOldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbMjU1LDIyOSwxNTMsLjY2XSksQm9yZGVyTGlnaHQ6V2ViSW5zcGVjdG9yLkNvbG9yLmZyb21SR0JBKFsyNTUsMjI5LDE1MywuNV0pLE1hcmdpbjpXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkEoWzI0NiwxNzgsMTA3LC42Nl0pLE1hcmdpbkxpZ2h0OldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbMjQ2LDE3OCwxMDcsLjVdKSxFdmVudFRhcmdldDpXZWJJbnNwZWN0b3IuQ29sb3IuZnJvbVJHQkEoWzI1NSwxOTYsMTk2LC42Nl0pLFNoYXBlOldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbOTYsODIsMTc3LDAuOF0pLFNoYXBlTWFyZ2luOldlYkluc3BlY3Rvci5Db2xvci5mcm9tUkdCQShbOTYsODIsMTI3LC42XSl9O1dlYkluc3BlY3Rvci5Db2xvci5kZXRlY3RDb2xvckZvcm1hdD1mdW5jdGlvbihjb2xvcikKe2NvbnN0IGNmPVdlYkluc3BlY3Rvci5Db2xvci5Gb3JtYXQ7dmFyIGZvcm1hdDt2YXIgZm9ybWF0U2V0dGluZz1XZWJJbnNwZWN0b3IubW9kdWxlU2V0dGluZygiY29sb3JGb3JtYXQiKS5nZXQoKTtpZihmb3JtYXRTZXR0aW5nPT09Y2YuT3JpZ2luYWwpCmZvcm1hdD1jZi5PcmlnaW5hbDtlbHNlCmlmKGZvcm1hdFNldHRpbmc9PT1jZi5SR0IpCmZvcm1hdD1jb2xvci5oYXNBbHBoYSgpP2NmLlJHQkE6Y2YuUkdCO2Vsc2UKaWYoZm9ybWF0U2V0dGluZz09PWNmLkhTTCkKZm9ybWF0PWNvbG9yLmhhc0FscGhhKCk/Y2YuSFNMQTpjZi5IU0w7ZWxzZQppZighY29sb3IuaGFzQWxwaGEoKSkKZm9ybWF0PWNvbG9yLmNhbkJlU2hvcnRIZXgoKT9jZi5TaG9ydEhFWDpjZi5IRVg7ZWxzZQpmb3JtYXQ9Y2YuUkdCQTtyZXR1cm4gZm9ybWF0O307fSx7fV0sMTAwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuT2JqZWN0PWZ1bmN0aW9uKCl7fTtXZWJJbnNwZWN0b3IuT2JqZWN0LnByb3RvdHlwZT17YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCkKe2lmKCFsaXN0ZW5lcikKY29uc29sZS5hc3NlcnQoZmFsc2UpO2lmKCF0aGlzLl9saXN0ZW5lcnMpCnRoaXMuX2xpc3RlbmVycz1uZXcgTWFwKCk7aWYoIXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKdGhpcy5fbGlzdGVuZXJzLnNldChldmVudFR5cGUsW10pO3RoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnRUeXBlKS5wdXNoKHt0aGlzT2JqZWN0OnRoaXNPYmplY3QsbGlzdGVuZXI6bGlzdGVuZXJ9KTtyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5FdmVudFRhcmdldC5FdmVudERlc2NyaXB0b3IodGhpcyxldmVudFR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcik7fSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KQp7Y29uc29sZS5hc3NlcnQobGlzdGVuZXIpO2lmKCF0aGlzLl9saXN0ZW5lcnN8fCF0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50VHlwZSkpCnJldHVybjt2YXIgbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnRUeXBlKTtmb3IodmFyIGk9MDtpPGxpc3RlbmVycy5sZW5ndGg7KytpKXtpZihsaXN0ZW5lcnNbaV0ubGlzdGVuZXI9PT1saXN0ZW5lciYmbGlzdGVuZXJzW2ldLnRoaXNPYmplY3Q9PT10aGlzT2JqZWN0KQpsaXN0ZW5lcnMuc3BsaWNlKGktLSwxKTt9CmlmKCFsaXN0ZW5lcnMubGVuZ3RoKQp0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50VHlwZSk7fSxyZW1vdmVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKQp7ZGVsZXRlIHRoaXMuX2xpc3RlbmVyczt9LGhhc0V2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKGV2ZW50VHlwZSkKe3JldHVybiB0aGlzLl9saXN0ZW5lcnMmJnRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKTt9LGRpc3BhdGNoRXZlbnRUb0xpc3RlbmVyczpmdW5jdGlvbihldmVudFR5cGUsZXZlbnREYXRhKQp7aWYoIXRoaXMuX2xpc3RlbmVyc3x8IXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKcmV0dXJuIGZhbHNlO3ZhciBldmVudD1uZXcgV2ViSW5zcGVjdG9yLkV2ZW50KHRoaXMsZXZlbnRUeXBlLGV2ZW50RGF0YSk7dmFyIGxpc3RlbmVycz10aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSkuc2xpY2UoMCk7Zm9yKHZhciBpPTA7aTxsaXN0ZW5lcnMubGVuZ3RoOysraSl7bGlzdGVuZXJzW2ldLmxpc3RlbmVyLmNhbGwobGlzdGVuZXJzW2ldLnRoaXNPYmplY3QsZXZlbnQpO2lmKGV2ZW50Ll9zdG9wcGVkUHJvcGFnYXRpb24pCmJyZWFrO30KcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7fX07V2ViSW5zcGVjdG9yLkV2ZW50PWZ1bmN0aW9uKHRhcmdldCx0eXBlLGRhdGEpCnt0aGlzLnRhcmdldD10YXJnZXQ7dGhpcy50eXBlPXR5cGU7dGhpcy5kYXRhPWRhdGE7dGhpcy5kZWZhdWx0UHJldmVudGVkPWZhbHNlO3RoaXMuX3N0b3BwZWRQcm9wYWdhdGlvbj1mYWxzZTt9O1dlYkluc3BlY3Rvci5FdmVudC5wcm90b3R5cGU9e3N0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpCnt0aGlzLl9zdG9wcGVkUHJvcGFnYXRpb249dHJ1ZTt9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCkKe3RoaXMuZGVmYXVsdFByZXZlbnRlZD10cnVlO30sY29uc3VtZTpmdW5jdGlvbihwcmV2ZW50RGVmYXVsdCkKe3RoaXMuc3RvcFByb3BhZ2F0aW9uKCk7aWYocHJldmVudERlZmF1bHQpCnRoaXMucHJldmVudERlZmF1bHQoKTt9fTtXZWJJbnNwZWN0b3IuRXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKQp7fTtXZWJJbnNwZWN0b3IuRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oZXZlbnRMaXN0KQp7Zm9yKHZhciBpPTA7aTxldmVudExpc3QubGVuZ3RoOysraSl7dmFyIGV2ZW50SW5mbz1ldmVudExpc3RbaV07ZXZlbnRJbmZvLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRJbmZvLmV2ZW50VHlwZSxldmVudEluZm8ubWV0aG9kLGV2ZW50SW5mby5yZWNlaXZlcik7fQpldmVudExpc3Quc3BsaWNlKDAsZXZlbnRMaXN0Lmxlbmd0aCk7fTtXZWJJbnNwZWN0b3IuRXZlbnRUYXJnZXQucHJvdG90eXBlPXthZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGV2ZW50VHlwZSxsaXN0ZW5lcix0aGlzT2JqZWN0KXt9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZXZlbnRUeXBlLGxpc3RlbmVyLHRoaXNPYmplY3Qpe30scmVtb3ZlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7fSxoYXNFdmVudExpc3RlbmVyczpmdW5jdGlvbihldmVudFR5cGUpe30sZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzOmZ1bmN0aW9uKGV2ZW50VHlwZSxldmVudERhdGEpe319O1dlYkluc3BlY3Rvci5FdmVudFRhcmdldC5FdmVudERlc2NyaXB0b3I9ZnVuY3Rpb24oZXZlbnRUYXJnZXQsZXZlbnRUeXBlLHJlY2VpdmVyLG1ldGhvZCkKe3RoaXMuZXZlbnRUYXJnZXQ9ZXZlbnRUYXJnZXQ7dGhpcy5ldmVudFR5cGU9ZXZlbnRUeXBlO3RoaXMucmVjZWl2ZXI9cmVjZWl2ZXI7dGhpcy5tZXRob2Q9bWV0aG9kO307fSx7fV0sMTAxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMPWZ1bmN0aW9uKHVybCkKe3RoaXMuaXNWYWxpZD1mYWxzZTt0aGlzLnVybD11cmw7dGhpcy5zY2hlbWU9IiI7dGhpcy5ob3N0PSIiO3RoaXMucG9ydD0iIjt0aGlzLnBhdGg9IiI7dGhpcy5xdWVyeVBhcmFtcz0iIjt0aGlzLmZyYWdtZW50PSIiO3RoaXMuZm9sZGVyUGF0aENvbXBvbmVudHM9IiI7dGhpcy5sYXN0UGF0aENvbXBvbmVudD0iIjt2YXIgbWF0Y2g9dXJsLm1hdGNoKC9eKFtBLVphLXpdW0EtWmEtejAtOSsuLV0qKTpcL1wvKFteXHNcLzpdKikoPzo6KFtcZF0rKSk/KD86KFwvW14jXSopKD86IyguKikpPyk/JC9pKTtpZihtYXRjaCl7dGhpcy5pc1ZhbGlkPXRydWU7dGhpcy5zY2hlbWU9bWF0Y2hbMV0udG9Mb3dlckNhc2UoKTt0aGlzLmhvc3Q9bWF0Y2hbMl07dGhpcy5wb3J0PW1hdGNoWzNdO3RoaXMucGF0aD1tYXRjaFs0XXx8Ii8iO3RoaXMuZnJhZ21lbnQ9bWF0Y2hbNV07fWVsc2V7aWYodGhpcy51cmwuc3RhcnRzV2l0aCgiZGF0YToiKSl7dGhpcy5zY2hlbWU9ImRhdGEiO3JldHVybjt9CmlmKHRoaXMudXJsPT09ImFib3V0OmJsYW5rIil7dGhpcy5zY2hlbWU9ImFib3V0IjtyZXR1cm47fQp0aGlzLnBhdGg9dGhpcy51cmw7fQp2YXIgcGF0aD10aGlzLnBhdGg7dmFyIGluZGV4T2ZRdWVyeT1wYXRoLmluZGV4T2YoIj8iKTtpZihpbmRleE9mUXVlcnkhPT0tMSl7dGhpcy5xdWVyeVBhcmFtcz1wYXRoLnN1YnN0cmluZyhpbmRleE9mUXVlcnkrMSk7cGF0aD1wYXRoLnN1YnN0cmluZygwLGluZGV4T2ZRdWVyeSk7fQp2YXIgbGFzdFNsYXNoSW5kZXg9cGF0aC5sYXN0SW5kZXhPZigiLyIpO2lmKGxhc3RTbGFzaEluZGV4IT09LTEpe3RoaXMuZm9sZGVyUGF0aENvbXBvbmVudHM9cGF0aC5zdWJzdHJpbmcoMCxsYXN0U2xhc2hJbmRleCk7dGhpcy5sYXN0UGF0aENvbXBvbmVudD1wYXRoLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCsxKTt9ZWxzZQp0aGlzLmxhc3RQYXRoQ29tcG9uZW50PXBhdGg7fTtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMLnNwbGl0VVJMSW50b1BhdGhDb21wb25lbnRzPWZ1bmN0aW9uKHVybCkKe2lmKHVybC5zdGFydHNXaXRoKCIvIikpCnVybD0iZmlsZTovLyIrdXJsO3ZhciBwYXJzZWRVUkw9bmV3IFdlYkluc3BlY3Rvci5QYXJzZWRVUkwodXJsKTt2YXIgb3JpZ2luO3ZhciBmb2xkZXJQYXRoO3ZhciBuYW1lO2lmKHBhcnNlZFVSTC5pc1ZhbGlkKXtvcmlnaW49cGFyc2VkVVJMLnNjaGVtZSsiOi8vIitwYXJzZWRVUkwuaG9zdDtpZihwYXJzZWRVUkwucG9ydCkKb3JpZ2luKz0iOiIrcGFyc2VkVVJMLnBvcnQ7Zm9sZGVyUGF0aD1wYXJzZWRVUkwuZm9sZGVyUGF0aENvbXBvbmVudHM7bmFtZT1wYXJzZWRVUkwubGFzdFBhdGhDb21wb25lbnQ7aWYocGFyc2VkVVJMLnF1ZXJ5UGFyYW1zKQpuYW1lKz0iPyIrcGFyc2VkVVJMLnF1ZXJ5UGFyYW1zO31lbHNle29yaWdpbj0iIjtmb2xkZXJQYXRoPSIiO25hbWU9dXJsO30KdmFyIHJlc3VsdD1bb3JpZ2luXTt2YXIgc3BsaXR0ZWRQYXRoPWZvbGRlclBhdGguc3BsaXQoIi8iKTtmb3IodmFyIGk9MTtpPHNwbGl0dGVkUGF0aC5sZW5ndGg7KytpKXtpZighc3BsaXR0ZWRQYXRoW2ldKQpjb250aW51ZTtyZXN1bHQucHVzaChzcGxpdHRlZFBhdGhbaV0pO30KcmVzdWx0LnB1c2gobmFtZSk7cmV0dXJuIHJlc3VsdDt9O1dlYkluc3BlY3Rvci5QYXJzZWRVUkwuZXh0cmFjdE9yaWdpbj1mdW5jdGlvbih1cmwpCnt2YXIgcGFyc2VkVVJMPW5ldyBXZWJJbnNwZWN0b3IuUGFyc2VkVVJMKHVybCk7aWYoIXBhcnNlZFVSTC5pc1ZhbGlkKQpyZXR1cm4iIjt2YXIgb3JpZ2luPXBhcnNlZFVSTC5zY2hlbWUrIjovLyIrcGFyc2VkVVJMLmhvc3Q7aWYocGFyc2VkVVJMLnBvcnQpCm9yaWdpbis9IjoiK3BhcnNlZFVSTC5wb3J0O3JldHVybiBvcmlnaW47fTtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMLmV4dHJhY3RFeHRlbnNpb249ZnVuY3Rpb24odXJsKQp7dmFyIGxhc3RJbmRleE9mRG90PXVybC5sYXN0SW5kZXhPZigiLiIpO3ZhciBleHRlbnNpb249bGFzdEluZGV4T2ZEb3QhPT0tMT91cmwuc3Vic3RyKGxhc3RJbmRleE9mRG90KzEpOiIiO3ZhciBpbmRleE9mUXVlc3Rpb25NYXJrPWV4dGVuc2lvbi5pbmRleE9mKCI/Iik7aWYoaW5kZXhPZlF1ZXN0aW9uTWFyayE9PS0xKQpleHRlbnNpb249ZXh0ZW5zaW9uLnN1YnN0cigwLGluZGV4T2ZRdWVzdGlvbk1hcmspO3JldHVybiBleHRlbnNpb247fTtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMLmV4dHJhY3ROYW1lPWZ1bmN0aW9uKHVybCkKe3ZhciBpbmRleD11cmwubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gaW5kZXghPT0tMT91cmwuc3Vic3RyKGluZGV4KzEpOnVybDt9O1dlYkluc3BlY3Rvci5QYXJzZWRVUkwuY29tcGxldGVVUkw9ZnVuY3Rpb24oYmFzZVVSTCxocmVmKQp7aWYoaHJlZil7dmFyIHRyaW1tZWRIcmVmPWhyZWYudHJpbSgpO2lmKHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoImRhdGE6Iil8fHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoImJsb2I6Iil8fHRyaW1tZWRIcmVmLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IikpCnJldHVybiBocmVmO3ZhciBwYXJzZWRIcmVmPXRyaW1tZWRIcmVmLmFzUGFyc2VkVVJMKCk7aWYocGFyc2VkSHJlZiYmcGFyc2VkSHJlZi5zY2hlbWUpCnJldHVybiB0cmltbWVkSHJlZjt9ZWxzZXtyZXR1cm4gYmFzZVVSTDt9CnZhciBwYXJzZWRVUkw9YmFzZVVSTC5hc1BhcnNlZFVSTCgpO2lmKHBhcnNlZFVSTCl7aWYocGFyc2VkVVJMLmlzRGF0YVVSTCgpKQpyZXR1cm4gaHJlZjt2YXIgcGF0aD1ocmVmO3ZhciBxdWVyeT1wYXRoLmluZGV4T2YoIj8iKTt2YXIgcG9zdGZpeD0iIjtpZihxdWVyeSE9PS0xKXtwb3N0Zml4PXBhdGguc3Vic3RyaW5nKHF1ZXJ5KTtwYXRoPXBhdGguc3Vic3RyaW5nKDAscXVlcnkpO31lbHNle3ZhciBmcmFnbWVudD1wYXRoLmluZGV4T2YoIiMiKTtpZihmcmFnbWVudCE9PS0xKXtwb3N0Zml4PXBhdGguc3Vic3RyaW5nKGZyYWdtZW50KTtwYXRoPXBhdGguc3Vic3RyaW5nKDAsZnJhZ21lbnQpO319CmlmKCFwYXRoKXt2YXIgYmFzZVBhdGg9cGFyc2VkVVJMLnBhdGg7aWYocG9zdGZpeC5jaGFyQXQoMCk9PT0iPyIpe3ZhciBiYXNlUXVlcnk9cGFyc2VkVVJMLnBhdGguaW5kZXhPZigiPyIpO2lmKGJhc2VRdWVyeSE9PS0xKQpiYXNlUGF0aD1iYXNlUGF0aC5zdWJzdHJpbmcoMCxiYXNlUXVlcnkpO30KcmV0dXJuIHBhcnNlZFVSTC5zY2hlbWUrIjovLyIrcGFyc2VkVVJMLmhvc3QrKHBhcnNlZFVSTC5wb3J0PyI6IitwYXJzZWRVUkwucG9ydDoiIikrYmFzZVBhdGgrcG9zdGZpeDt9ZWxzZSBpZihwYXRoLmNoYXJBdCgwKSE9PSIvIil7dmFyIHByZWZpeD1wYXJzZWRVUkwucGF0aDt2YXIgcHJlZml4UXVlcnk9cHJlZml4LmluZGV4T2YoIj8iKTtpZihwcmVmaXhRdWVyeSE9PS0xKQpwcmVmaXg9cHJlZml4LnN1YnN0cmluZygwLHByZWZpeFF1ZXJ5KTtwcmVmaXg9cHJlZml4LnN1YnN0cmluZygwLHByZWZpeC5sYXN0SW5kZXhPZigiLyIpKSsiLyI7cGF0aD1wcmVmaXgrcGF0aDt9ZWxzZSBpZihwYXRoLmxlbmd0aD4xJiZwYXRoLmNoYXJBdCgxKT09PSIvIil7cmV0dXJuIHBhcnNlZFVSTC5zY2hlbWUrIjoiK3BhdGgrcG9zdGZpeDt9CnJldHVybiBwYXJzZWRVUkwuc2NoZW1lKyI6Ly8iK3BhcnNlZFVSTC5ob3N0KyhwYXJzZWRVUkwucG9ydD8iOiIrcGFyc2VkVVJMLnBvcnQ6IiIpK1J1bnRpbWUubm9ybWFsaXplUGF0aChwYXRoKStwb3N0Zml4O30KcmV0dXJuIG51bGw7fTtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMLnByb3RvdHlwZT17Z2V0IGRpc3BsYXlOYW1lKCkKe2lmKHRoaXMuX2Rpc3BsYXlOYW1lKQpyZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7aWYodGhpcy5pc0RhdGFVUkwoKSkKcmV0dXJuIHRoaXMuZGF0YVVSTERpc3BsYXlOYW1lKCk7aWYodGhpcy5pc0Fib3V0QmxhbmsoKSkKcmV0dXJuIHRoaXMudXJsO3RoaXMuX2Rpc3BsYXlOYW1lPXRoaXMubGFzdFBhdGhDb21wb25lbnQ7aWYoIXRoaXMuX2Rpc3BsYXlOYW1lKQp0aGlzLl9kaXNwbGF5TmFtZT0odGhpcy5ob3N0fHwiIikrIi8iO2lmKHRoaXMuX2Rpc3BsYXlOYW1lPT09Ii8iKQp0aGlzLl9kaXNwbGF5TmFtZT10aGlzLnVybDtyZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7fSxkYXRhVVJMRGlzcGxheU5hbWU6ZnVuY3Rpb24oKQp7aWYodGhpcy5fZGF0YVVSTERpc3BsYXlOYW1lKQpyZXR1cm4gdGhpcy5fZGF0YVVSTERpc3BsYXlOYW1lO2lmKCF0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4iIjt0aGlzLl9kYXRhVVJMRGlzcGxheU5hbWU9dGhpcy51cmwudHJpbUVuZCgyMCk7cmV0dXJuIHRoaXMuX2RhdGFVUkxEaXNwbGF5TmFtZTt9LGlzQWJvdXRCbGFuazpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy51cmw9PT0iYWJvdXQ6YmxhbmsiO30saXNEYXRhVVJMOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLnNjaGVtZT09PSJkYXRhIjt9LGxhc3RQYXRoQ29tcG9uZW50V2l0aEZyYWdtZW50OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLmxhc3RQYXRoQ29tcG9uZW50Kyh0aGlzLmZyYWdtZW50PyIjIit0aGlzLmZyYWdtZW50OiIiKTt9LGRvbWFpbjpmdW5jdGlvbigpCntpZih0aGlzLmlzRGF0YVVSTCgpKQpyZXR1cm4iZGF0YToiO3JldHVybiB0aGlzLmhvc3QrKHRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiKTt9LHNlY3VyaXR5T3JpZ2luOmZ1bmN0aW9uKCkKe2lmKHRoaXMuaXNEYXRhVVJMKCkpCnJldHVybiJkYXRhOiI7cmV0dXJuIHRoaXMuc2NoZW1lKyI6Ly8iK3RoaXMuZG9tYWluKCk7fSx1cmxXaXRob3V0U2NoZW1lOmZ1bmN0aW9uKCkKe2lmKHRoaXMuc2NoZW1lJiZ0aGlzLnVybC5zdGFydHNXaXRoKHRoaXMuc2NoZW1lKyI6Ly8iKSkKcmV0dXJuIHRoaXMudXJsLnN1YnN0cmluZyh0aGlzLnNjaGVtZS5sZW5ndGgrMyk7cmV0dXJuIHRoaXMudXJsO319O1dlYkluc3BlY3Rvci5QYXJzZWRVUkwuc3BsaXRMaW5lQW5kQ29sdW1uPWZ1bmN0aW9uKHN0cmluZykKe3ZhciBsaW5lQ29sdW1uUmVnRXg9Lyg/OjooXGQrKSk/KD86OihcZCspKT8kLzt2YXIgbGluZUNvbHVtbk1hdGNoPWxpbmVDb2x1bW5SZWdFeC5leGVjKHN0cmluZyk7dmFyIGxpbmVOdW1iZXI7dmFyIGNvbHVtbk51bWJlcjtjb25zb2xlLmFzc2VydChsaW5lQ29sdW1uTWF0Y2gpO2lmKHR5cGVvZiBsaW5lQ29sdW1uTWF0Y2hbMV09PT0ic3RyaW5nIil7bGluZU51bWJlcj1wYXJzZUludChsaW5lQ29sdW1uTWF0Y2hbMV0sMTApO2xpbmVOdW1iZXI9aXNOYU4obGluZU51bWJlcik/dW5kZWZpbmVkOmxpbmVOdW1iZXItMTt9CmlmKHR5cGVvZiBsaW5lQ29sdW1uTWF0Y2hbMl09PT0ic3RyaW5nIil7Y29sdW1uTnVtYmVyPXBhcnNlSW50KGxpbmVDb2x1bW5NYXRjaFsyXSwxMCk7Y29sdW1uTnVtYmVyPWlzTmFOKGNvbHVtbk51bWJlcik/dW5kZWZpbmVkOmNvbHVtbk51bWJlci0xO30KcmV0dXJue3VybDpzdHJpbmcuc3Vic3RyaW5nKDAsc3RyaW5nLmxlbmd0aC1saW5lQ29sdW1uTWF0Y2hbMF0ubGVuZ3RoKSxsaW5lTnVtYmVyOmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOmNvbHVtbk51bWJlcn07fTtXZWJJbnNwZWN0b3IuUGFyc2VkVVJMLmlzUmVsYXRpdmVVUkw9ZnVuY3Rpb24odXJsKQp7cmV0dXJuIS9eW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6Ly50ZXN0KHVybCk7fTtTdHJpbmcucHJvdG90eXBlLmFzUGFyc2VkVVJMPWZ1bmN0aW9uKCkKe3ZhciBwYXJzZWRVUkw9bmV3IFdlYkluc3BlY3Rvci5QYXJzZWRVUkwodGhpcy50b1N0cmluZygpKTtpZihwYXJzZWRVUkwuaXNWYWxpZCkKcmV0dXJuIHBhcnNlZFVSTDtyZXR1cm4gbnVsbDt9O30se31dLDEwMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7V2ViSW5zcGVjdG9yLlNlZ21lbnQ9ZnVuY3Rpb24oYmVnaW4sZW5kLGRhdGEpCntpZihiZWdpbj5lbmQpCmNvbnNvbGUuYXNzZXJ0KGZhbHNlLCJJbnZhbGlkIHNlZ21lbnQiKTt0aGlzLmJlZ2luPWJlZ2luO3RoaXMuZW5kPWVuZDt0aGlzLmRhdGE9ZGF0YTt9O1dlYkluc3BlY3Rvci5TZWdtZW50LnByb3RvdHlwZT17aW50ZXJzZWN0czpmdW5jdGlvbih0aGF0KQp7cmV0dXJuIHRoaXMuYmVnaW48dGhhdC5lbmQmJnRoYXQuYmVnaW48dGhpcy5lbmQ7fX07V2ViSW5zcGVjdG9yLlNlZ21lbnRlZFJhbmdlPWZ1bmN0aW9uKG1lcmdlQ2FsbGJhY2spCnt0aGlzLl9zZWdtZW50cz1bXTt0aGlzLl9tZXJnZUNhbGxiYWNrPW1lcmdlQ2FsbGJhY2s7fTtXZWJJbnNwZWN0b3IuU2VnbWVudGVkUmFuZ2UucHJvdG90eXBlPXthcHBlbmQ6ZnVuY3Rpb24obmV3U2VnbWVudCkKe3ZhciBzdGFydEluZGV4PXRoaXMuX3NlZ21lbnRzLmxvd2VyQm91bmQobmV3U2VnbWVudCwoYSxiKT0+YS5iZWdpbi1iLmJlZ2luKTt2YXIgZW5kSW5kZXg9c3RhcnRJbmRleDt2YXIgbWVyZ2VkPW51bGw7aWYoc3RhcnRJbmRleD4wKXt2YXIgcHJlY2VkaW5nU2VnbWVudD10aGlzLl9zZWdtZW50c1tzdGFydEluZGV4LTFdO21lcmdlZD10aGlzLl90cnlNZXJnZShwcmVjZWRpbmdTZWdtZW50LG5ld1NlZ21lbnQpO2lmKG1lcmdlZCl7LS1zdGFydEluZGV4O25ld1NlZ21lbnQ9bWVyZ2VkO31lbHNlIGlmKHRoaXMuX3NlZ21lbnRzW3N0YXJ0SW5kZXgtMV0uZW5kPj1uZXdTZWdtZW50LmJlZ2luKXtpZihuZXdTZWdtZW50LmVuZDxwcmVjZWRpbmdTZWdtZW50LmVuZCkKdGhpcy5fc2VnbWVudHMuc3BsaWNlKHN0YXJ0SW5kZXgsMCxuZXcgV2ViSW5zcGVjdG9yLlNlZ21lbnQobmV3U2VnbWVudC5lbmQscHJlY2VkaW5nU2VnbWVudC5lbmQscHJlY2VkaW5nU2VnbWVudC5kYXRhKSk7cHJlY2VkaW5nU2VnbWVudC5lbmQ9bmV3U2VnbWVudC5iZWdpbjt9fQp3aGlsZShlbmRJbmRleDx0aGlzLl9zZWdtZW50cy5sZW5ndGgmJnRoaXMuX3NlZ21lbnRzW2VuZEluZGV4XS5lbmQ8PW5ld1NlZ21lbnQuZW5kKQorK2VuZEluZGV4O2lmKGVuZEluZGV4PHRoaXMuX3NlZ21lbnRzLmxlbmd0aCl7bWVyZ2VkPXRoaXMuX3RyeU1lcmdlKG5ld1NlZ21lbnQsdGhpcy5fc2VnbWVudHNbZW5kSW5kZXhdKTtpZihtZXJnZWQpe2VuZEluZGV4Kys7bmV3U2VnbWVudD1tZXJnZWQ7fWVsc2UgaWYobmV3U2VnbWVudC5pbnRlcnNlY3RzKHRoaXMuX3NlZ21lbnRzW2VuZEluZGV4XSkpCnRoaXMuX3NlZ21lbnRzW2VuZEluZGV4XS5iZWdpbj1uZXdTZWdtZW50LmVuZDt9CnRoaXMuX3NlZ21lbnRzLnNwbGljZShzdGFydEluZGV4LGVuZEluZGV4LXN0YXJ0SW5kZXgsbmV3U2VnbWVudCk7fSxhcHBlbmRSYW5nZTpmdW5jdGlvbih0aGF0KQp7dGhhdC5zZWdtZW50cygpLmZvckVhY2goc2VnbWVudD0+dGhpcy5hcHBlbmQoc2VnbWVudCkpO30sc2VnbWVudHM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3NlZ21lbnRzO30sX3RyeU1lcmdlOmZ1bmN0aW9uKGZpcnN0LHNlY29uZCkKe3ZhciBtZXJnZWQ9dGhpcy5fbWVyZ2VDYWxsYmFjayYmdGhpcy5fbWVyZ2VDYWxsYmFjayhmaXJzdCxzZWNvbmQpO2lmKCFtZXJnZWQpCnJldHVybiBudWxsO21lcmdlZC5iZWdpbj1maXJzdC5iZWdpbjttZXJnZWQuZW5kPU1hdGgubWF4KGZpcnN0LmVuZCxzZWNvbmQuZW5kKTtyZXR1cm4gbWVyZ2VkO319O30se31dLDEwMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7V2ViSW5zcGVjdG9yLlRleHRSYW5nZT1mdW5jdGlvbihzdGFydExpbmUsc3RhcnRDb2x1bW4sZW5kTGluZSxlbmRDb2x1bW4pCnt0aGlzLnN0YXJ0TGluZT1zdGFydExpbmU7dGhpcy5zdGFydENvbHVtbj1zdGFydENvbHVtbjt0aGlzLmVuZExpbmU9ZW5kTGluZTt0aGlzLmVuZENvbHVtbj1lbmRDb2x1bW47fTtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmNyZWF0ZUZyb21Mb2NhdGlvbj1mdW5jdGlvbihsaW5lLGNvbHVtbikKe3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShsaW5lLGNvbHVtbixsaW5lLGNvbHVtbik7fTtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmZyb21PYmplY3Q9ZnVuY3Rpb24oc2VyaWFsaXplZFRleHRSYW5nZSkKe3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZShzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0TGluZSxzZXJpYWxpemVkVGV4dFJhbmdlLnN0YXJ0Q29sdW1uLHNlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kTGluZSxzZXJpYWxpemVkVGV4dFJhbmdlLmVuZENvbHVtbik7fTtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmNvbXBhcmF0b3I9ZnVuY3Rpb24ocmFuZ2UxLHJhbmdlMikKe3JldHVybiByYW5nZTEuY29tcGFyZVRvKHJhbmdlMik7fTtXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLnByb3RvdHlwZT17aXNFbXB0eTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5zdGFydExpbmU9PT10aGlzLmVuZExpbmUmJnRoaXMuc3RhcnRDb2x1bW49PT10aGlzLmVuZENvbHVtbjt9LGltbWVkaWF0ZWx5UHJlY2VkZXM6ZnVuY3Rpb24ocmFuZ2UpCntpZighcmFuZ2UpCnJldHVybiBmYWxzZTtyZXR1cm4gdGhpcy5lbmRMaW5lPT09cmFuZ2Uuc3RhcnRMaW5lJiZ0aGlzLmVuZENvbHVtbj09PXJhbmdlLnN0YXJ0Q29sdW1uO30saW1tZWRpYXRlbHlGb2xsb3dzOmZ1bmN0aW9uKHJhbmdlKQp7aWYoIXJhbmdlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHJhbmdlLmltbWVkaWF0ZWx5UHJlY2VkZXModGhpcyk7fSxmb2xsb3dzOmZ1bmN0aW9uKHJhbmdlKQp7cmV0dXJuIHJhbmdlLmVuZExpbmU9PT10aGlzLnN0YXJ0TGluZSYmcmFuZ2UuZW5kQ29sdW1uPD10aGlzLnN0YXJ0Q29sdW1ufHxyYW5nZS5lbmRMaW5lPHRoaXMuc3RhcnRMaW5lO30sZ2V0IGxpbmVzQ291bnQoKQp7cmV0dXJuIHRoaXMuZW5kTGluZS10aGlzLnN0YXJ0TGluZTt9LGNvbGxhcHNlVG9FbmQ6ZnVuY3Rpb24oKQp7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuZW5kTGluZSx0aGlzLmVuZENvbHVtbix0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4pO30sY29sbGFwc2VUb1N0YXJ0OmZ1bmN0aW9uKCkKe3JldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZSh0aGlzLnN0YXJ0TGluZSx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4pO30sbm9ybWFsaXplOmZ1bmN0aW9uKCkKe2lmKHRoaXMuc3RhcnRMaW5lPnRoaXMuZW5kTGluZXx8dGhpcy5zdGFydExpbmU9PT10aGlzLmVuZExpbmUmJnRoaXMuc3RhcnRDb2x1bW4+dGhpcy5lbmRDb2x1bW4pCnJldHVybiBuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZSh0aGlzLmVuZExpbmUsdGhpcy5lbmRDb2x1bW4sdGhpcy5zdGFydExpbmUsdGhpcy5zdGFydENvbHVtbik7ZWxzZQpyZXR1cm4gdGhpcy5jbG9uZSgpO30sY2xvbmU6ZnVuY3Rpb24oKQp7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKHRoaXMuc3RhcnRMaW5lLHRoaXMuc3RhcnRDb2x1bW4sdGhpcy5lbmRMaW5lLHRoaXMuZW5kQ29sdW1uKTt9LHNlcmlhbGl6ZVRvT2JqZWN0OmZ1bmN0aW9uKCkKe3ZhciBzZXJpYWxpemVkVGV4dFJhbmdlPXt9O3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRMaW5lPXRoaXMuc3RhcnRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2Uuc3RhcnRDb2x1bW49dGhpcy5zdGFydENvbHVtbjtzZXJpYWxpemVkVGV4dFJhbmdlLmVuZExpbmU9dGhpcy5lbmRMaW5lO3NlcmlhbGl6ZWRUZXh0UmFuZ2UuZW5kQ29sdW1uPXRoaXMuZW5kQ29sdW1uO3JldHVybiBzZXJpYWxpemVkVGV4dFJhbmdlO30sY29tcGFyZVRvOmZ1bmN0aW9uKG90aGVyKQp7aWYodGhpcy5zdGFydExpbmU+b3RoZXIuc3RhcnRMaW5lKQpyZXR1cm4gMTtpZih0aGlzLnN0YXJ0TGluZTxvdGhlci5zdGFydExpbmUpCnJldHVybi0xO2lmKHRoaXMuc3RhcnRDb2x1bW4+b3RoZXIuc3RhcnRDb2x1bW4pCnJldHVybiAxO2lmKHRoaXMuc3RhcnRDb2x1bW48b3RoZXIuc3RhcnRDb2x1bW4pCnJldHVybi0xO3JldHVybiAwO30sY29tcGFyZVRvUG9zaXRpb246ZnVuY3Rpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpCntpZihsaW5lTnVtYmVyPHRoaXMuc3RhcnRMaW5lfHxsaW5lTnVtYmVyPT09dGhpcy5zdGFydExpbmUmJmNvbHVtbk51bWJlcjx0aGlzLnN0YXJ0Q29sdW1uKQpyZXR1cm4tMTtpZihsaW5lTnVtYmVyPnRoaXMuZW5kTGluZXx8bGluZU51bWJlcj09PXRoaXMuZW5kTGluZSYmY29sdW1uTnVtYmVyPnRoaXMuZW5kQ29sdW1uKQpyZXR1cm4gMTtyZXR1cm4gMDt9LGVxdWFsOmZ1bmN0aW9uKG90aGVyKQp7cmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09b3RoZXIuc3RhcnRMaW5lJiZ0aGlzLmVuZExpbmU9PT1vdGhlci5lbmRMaW5lJiZ0aGlzLnN0YXJ0Q29sdW1uPT09b3RoZXIuc3RhcnRDb2x1bW4mJnRoaXMuZW5kQ29sdW1uPT09b3RoZXIuZW5kQ29sdW1uO30scmVsYXRpdmVUbzpmdW5jdGlvbihsaW5lLGNvbHVtbikKe3ZhciByZWxhdGl2ZT10aGlzLmNsb25lKCk7aWYodGhpcy5zdGFydExpbmU9PT1saW5lKQpyZWxhdGl2ZS5zdGFydENvbHVtbi09Y29sdW1uO2lmKHRoaXMuZW5kTGluZT09PWxpbmUpCnJlbGF0aXZlLmVuZENvbHVtbi09Y29sdW1uO3JlbGF0aXZlLnN0YXJ0TGluZS09bGluZTtyZWxhdGl2ZS5lbmRMaW5lLT1saW5lO3JldHVybiByZWxhdGl2ZTt9LHJlYmFzZUFmdGVyVGV4dEVkaXQ6ZnVuY3Rpb24ob3JpZ2luYWxSYW5nZSxlZGl0ZWRSYW5nZSkKe2NvbnNvbGUuYXNzZXJ0KG9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lPT09ZWRpdGVkUmFuZ2Uuc3RhcnRMaW5lKTtjb25zb2xlLmFzc2VydChvcmlnaW5hbFJhbmdlLnN0YXJ0Q29sdW1uPT09ZWRpdGVkUmFuZ2Uuc3RhcnRDb2x1bW4pO3ZhciByZWJhc2U9dGhpcy5jbG9uZSgpO2lmKCF0aGlzLmZvbGxvd3Mob3JpZ2luYWxSYW5nZSkpCnJldHVybiByZWJhc2U7dmFyIGxpbmVEZWx0YT1lZGl0ZWRSYW5nZS5lbmRMaW5lLW9yaWdpbmFsUmFuZ2UuZW5kTGluZTt2YXIgY29sdW1uRGVsdGE9ZWRpdGVkUmFuZ2UuZW5kQ29sdW1uLW9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uO3JlYmFzZS5zdGFydExpbmUrPWxpbmVEZWx0YTtyZWJhc2UuZW5kTGluZSs9bGluZURlbHRhO2lmKHJlYmFzZS5zdGFydExpbmU9PT1lZGl0ZWRSYW5nZS5lbmRMaW5lKQpyZWJhc2Uuc3RhcnRDb2x1bW4rPWNvbHVtbkRlbHRhO2lmKHJlYmFzZS5lbmRMaW5lPT09ZWRpdGVkUmFuZ2UuZW5kTGluZSkKcmViYXNlLmVuZENvbHVtbis9Y29sdW1uRGVsdGE7cmV0dXJuIHJlYmFzZTt9LHRvU3RyaW5nOmZ1bmN0aW9uKCkKe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTt9LGNvbnRhaW5zTG9jYXRpb246ZnVuY3Rpb24obGluZU51bWJlcixjb2x1bW5OdW1iZXIpCntpZih0aGlzLnN0YXJ0TGluZT09PXRoaXMuZW5kTGluZSkKcmV0dXJuIHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlciYmdGhpcy5zdGFydENvbHVtbjw9Y29sdW1uTnVtYmVyJiZjb2x1bW5OdW1iZXI8PXRoaXMuZW5kQ29sdW1uO2lmKHRoaXMuc3RhcnRMaW5lPT09bGluZU51bWJlcikKcmV0dXJuIHRoaXMuc3RhcnRDb2x1bW48PWNvbHVtbk51bWJlcjtpZih0aGlzLmVuZExpbmU9PT1saW5lTnVtYmVyKQpyZXR1cm4gY29sdW1uTnVtYmVyPD10aGlzLmVuZENvbHVtbjtyZXR1cm4gdGhpcy5zdGFydExpbmU8bGluZU51bWJlciYmbGluZU51bWJlcjx0aGlzLmVuZExpbmU7fX07V2ViSW5zcGVjdG9yLlRleHRSYW5nZS5mcm9tRWRpdD1mdW5jdGlvbihvbGRSYW5nZSxuZXdUZXh0KQp7dmFyIGVuZExpbmU9b2xkUmFuZ2Uuc3RhcnRMaW5lO3ZhciBlbmRDb2x1bW49b2xkUmFuZ2Uuc3RhcnRDb2x1bW4rbmV3VGV4dC5sZW5ndGg7dmFyIGxpbmVFbmRpbmdzPW5ld1RleHQuY29tcHV0ZUxpbmVFbmRpbmdzKCk7aWYobGluZUVuZGluZ3MubGVuZ3RoPjEpe2VuZExpbmU9b2xkUmFuZ2Uuc3RhcnRMaW5lK2xpbmVFbmRpbmdzLmxlbmd0aC0xO3ZhciBsZW49bGluZUVuZGluZ3MubGVuZ3RoO2VuZENvbHVtbj1saW5lRW5kaW5nc1tsZW4tMV0tbGluZUVuZGluZ3NbbGVuLTJdLTE7fQpyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5UZXh0UmFuZ2Uob2xkUmFuZ2Uuc3RhcnRMaW5lLG9sZFJhbmdlLnN0YXJ0Q29sdW1uLGVuZExpbmUsZW5kQ29sdW1uKTt9O1dlYkluc3BlY3Rvci5Tb3VyY2VSYW5nZT1mdW5jdGlvbihvZmZzZXQsbGVuZ3RoKQp7dGhpcy5vZmZzZXQ9b2Zmc2V0O3RoaXMubGVuZ3RoPWxlbmd0aDt9O1dlYkluc3BlY3Rvci5Tb3VyY2VFZGl0PWZ1bmN0aW9uKHNvdXJjZVVSTCxvbGRSYW5nZSxuZXdUZXh0KQp7dGhpcy5zb3VyY2VVUkw9c291cmNlVVJMO3RoaXMub2xkUmFuZ2U9b2xkUmFuZ2U7dGhpcy5uZXdUZXh0PW5ld1RleHQ7fTtXZWJJbnNwZWN0b3IuU291cmNlRWRpdC5wcm90b3R5cGU9e25ld1JhbmdlOmZ1bmN0aW9uKCkKe3JldHVybiBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmZyb21FZGl0KHRoaXMub2xkUmFuZ2UsdGhpcy5uZXdUZXh0KTt9fTtXZWJJbnNwZWN0b3IuU291cmNlRWRpdC5jb21wYXJhdG9yPWZ1bmN0aW9uKGVkaXQxLGVkaXQyKQp7cmV0dXJuIFdlYkluc3BlY3Rvci5UZXh0UmFuZ2UuY29tcGFyYXRvcihlZGl0MS5vbGRSYW5nZSxlZGl0Mi5vbGRSYW5nZSk7fTt9LHt9XSwxMDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5UZXh0VXRpbHM9e2lzU3RvcENoYXI6ZnVuY3Rpb24oY2hhcikKe3JldHVybiBjaGFyPiIgIiYmY2hhcjwiMCJ8fGNoYXI+IjkiJiZjaGFyPCJBInx8Y2hhcj4iWiImJmNoYXI8Il8ifHxjaGFyPiJfIiYmY2hhcjwiYSJ8fGNoYXI+InoiJiZjaGFyPD0ifiI7fSxpc1dvcmRDaGFyOmZ1bmN0aW9uKGNoYXIpCntyZXR1cm4hV2ViSW5zcGVjdG9yLlRleHRVdGlscy5pc1N0b3BDaGFyKGNoYXIpJiYhV2ViSW5zcGVjdG9yLlRleHRVdGlscy5pc1NwYWNlQ2hhcihjaGFyKTt9LGlzU3BhY2VDaGFyOmZ1bmN0aW9uKGNoYXIpCntyZXR1cm4gV2ViSW5zcGVjdG9yLlRleHRVdGlscy5fU3BhY2VDaGFyUmVnZXgudGVzdChjaGFyKTt9LGlzV29yZDpmdW5jdGlvbih3b3JkKQp7Zm9yKHZhciBpPTA7aTx3b3JkLmxlbmd0aDsrK2kpe2lmKCFXZWJJbnNwZWN0b3IuVGV4dFV0aWxzLmlzV29yZENoYXIod29yZC5jaGFyQXQoaSkpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9LGlzT3BlbmluZ0JyYWNlQ2hhcjpmdW5jdGlvbihjaGFyKQp7cmV0dXJuIGNoYXI9PT0iKCJ8fGNoYXI9PT0ieyI7fSxpc0Nsb3NpbmdCcmFjZUNoYXI6ZnVuY3Rpb24oY2hhcikKe3JldHVybiBjaGFyPT09IikifHxjaGFyPT09In0iO30saXNCcmFjZUNoYXI6ZnVuY3Rpb24oY2hhcikKe3JldHVybiBXZWJJbnNwZWN0b3IuVGV4dFV0aWxzLmlzT3BlbmluZ0JyYWNlQ2hhcihjaGFyKXx8V2ViSW5zcGVjdG9yLlRleHRVdGlscy5pc0Nsb3NpbmdCcmFjZUNoYXIoY2hhcik7fSx0ZXh0VG9Xb3JkczpmdW5jdGlvbih0ZXh0LGlzV29yZENoYXIsd29yZENhbGxiYWNrKQp7dmFyIHN0YXJ0V29yZD0tMTtmb3IodmFyIGk9MDtpPHRleHQubGVuZ3RoOysraSl7aWYoIWlzV29yZENoYXIodGV4dC5jaGFyQXQoaSkpKXtpZihzdGFydFdvcmQhPT0tMSkKd29yZENhbGxiYWNrKHRleHQuc3Vic3RyaW5nKHN0YXJ0V29yZCxpKSk7c3RhcnRXb3JkPS0xO31lbHNlIGlmKHN0YXJ0V29yZD09PS0xKQpzdGFydFdvcmQ9aTt9CmlmKHN0YXJ0V29yZCE9PS0xKQp3b3JkQ2FsbGJhY2sodGV4dC5zdWJzdHJpbmcoc3RhcnRXb3JkKSk7fSxsaW5lSW5kZW50OmZ1bmN0aW9uKGxpbmUpCnt2YXIgaW5kZW50YXRpb249MDt3aGlsZShpbmRlbnRhdGlvbjxsaW5lLmxlbmd0aCYmV2ViSW5zcGVjdG9yLlRleHRVdGlscy5pc1NwYWNlQ2hhcihsaW5lLmNoYXJBdChpbmRlbnRhdGlvbikpKQorK2luZGVudGF0aW9uO3JldHVybiBsaW5lLnN1YnN0cigwLGluZGVudGF0aW9uKTt9LGlzVXBwZXJDYXNlOmZ1bmN0aW9uKHRleHQpCntyZXR1cm4gdGV4dD09PXRleHQudG9VcHBlckNhc2UoKTt9LGlzTG93ZXJDYXNlOmZ1bmN0aW9uKHRleHQpCntyZXR1cm4gdGV4dD09PXRleHQudG9Mb3dlckNhc2UoKTt9LHNwbGl0U3RyaW5nQnlSZWdleGVzKHRleHQscmVnZXhlcykKe3ZhciBtYXRjaGVzPVtdO3ZhciBnbG9iYWxSZWdleGVzPVtdO2Zvcih2YXIgaT0wO2k8cmVnZXhlcy5sZW5ndGg7aSsrKXt2YXIgcmVnZXg9cmVnZXhlc1tpXTtpZighcmVnZXguZ2xvYmFsKQpnbG9iYWxSZWdleGVzLnB1c2gobmV3IFJlZ0V4cChyZWdleC5zb3VyY2UscmVnZXguZmxhZ3M/cmVnZXguZmxhZ3MrImciOiJnIikpO2Vsc2UKZ2xvYmFsUmVnZXhlcy5wdXNoKHJlZ2V4KTt9CmRvU3BsaXQodGV4dCwwLDApO3JldHVybiBtYXRjaGVzO2Z1bmN0aW9uIGRvU3BsaXQodGV4dCxyZWdleEluZGV4LHN0YXJ0SW5kZXgpCntpZihyZWdleEluZGV4Pj1nbG9iYWxSZWdleGVzLmxlbmd0aCl7bWF0Y2hlcy5wdXNoKHt2YWx1ZTp0ZXh0LHBvc2l0aW9uOnN0YXJ0SW5kZXgscmVnZXhJbmRleDotMX0pO3JldHVybjt9CnZhciByZWdleD1nbG9iYWxSZWdleGVzW3JlZ2V4SW5kZXhdO3ZhciBjdXJyZW50SW5kZXg9MDt2YXIgcmVzdWx0O3JlZ2V4Lmxhc3RJbmRleD0wO3doaWxlKChyZXN1bHQ9cmVnZXguZXhlYyh0ZXh0KSkhPT1udWxsKXt2YXIgc3RyaW5nQmVmb3JlTWF0Y2g9dGV4dC5zdWJzdHJpbmcoY3VycmVudEluZGV4LHJlc3VsdC5pbmRleCk7aWYoc3RyaW5nQmVmb3JlTWF0Y2gpCmRvU3BsaXQoc3RyaW5nQmVmb3JlTWF0Y2gscmVnZXhJbmRleCsxLHN0YXJ0SW5kZXgrY3VycmVudEluZGV4KTt2YXIgbWF0Y2g9cmVzdWx0WzBdO21hdGNoZXMucHVzaCh7dmFsdWU6bWF0Y2gscG9zaXRpb246c3RhcnRJbmRleCtyZXN1bHQuaW5kZXgscmVnZXhJbmRleDpyZWdleEluZGV4fSk7Y3VycmVudEluZGV4PXJlc3VsdC5pbmRleCttYXRjaC5sZW5ndGg7fQp2YXIgc3RyaW5nQWZ0ZXJNYXRjaGVzPXRleHQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCk7aWYoc3RyaW5nQWZ0ZXJNYXRjaGVzKQpkb1NwbGl0KHN0cmluZ0FmdGVyTWF0Y2hlcyxyZWdleEluZGV4KzEsc3RhcnRJbmRleCtjdXJyZW50SW5kZXgpO319fTtXZWJJbnNwZWN0b3IuVGV4dFV0aWxzLl9TcGFjZUNoYXJSZWdleD0vXHMvO1dlYkluc3BlY3Rvci5UZXh0VXRpbHMuSW5kZW50PXtUd29TcGFjZXM6IiAgIixGb3VyU3BhY2VzOiIgICAgIixFaWdodFNwYWNlczoiICAgICAgICAiLFRhYkNoYXJhY3RlcjoiXHQifTtXZWJJbnNwZWN0b3IuVGV4dFV0aWxzLkJhbGFuY2VkSlNPTlRva2VuaXplcj1mdW5jdGlvbihjYWxsYmFjayxmaW5kTXVsdGlwbGUpCnt0aGlzLl9jYWxsYmFjaz1jYWxsYmFjazt0aGlzLl9pbmRleD0wO3RoaXMuX2JhbGFuY2U9MDt0aGlzLl9idWZmZXI9IiI7dGhpcy5fZmluZE11bHRpcGxlPWZpbmRNdWx0aXBsZXx8ZmFsc2U7dGhpcy5fY2xvc2luZ0RvdWJsZVF1b3RlUmVnZXg9L1teXFxdKD86XFxcXCkqIi9nO307V2ViSW5zcGVjdG9yLlRleHRVdGlscy5CYWxhbmNlZEpTT05Ub2tlbml6ZXIucHJvdG90eXBlPXt3cml0ZTpmdW5jdGlvbihjaHVuaykKe3RoaXMuX2J1ZmZlcis9Y2h1bms7dmFyIGxhc3RJbmRleD10aGlzLl9idWZmZXIubGVuZ3RoO3ZhciBidWZmZXI9dGhpcy5fYnVmZmVyO2Zvcih2YXIgaW5kZXg9dGhpcy5faW5kZXg7aW5kZXg8bGFzdEluZGV4OysraW5kZXgpe3ZhciBjaGFyYWN0ZXI9YnVmZmVyW2luZGV4XTtpZihjaGFyYWN0ZXI9PT0iXCIiKXt0aGlzLl9jbG9zaW5nRG91YmxlUXVvdGVSZWdleC5sYXN0SW5kZXg9aW5kZXg7aWYoIXRoaXMuX2Nsb3NpbmdEb3VibGVRdW90ZVJlZ2V4LnRlc3QoYnVmZmVyKSkKYnJlYWs7aW5kZXg9dGhpcy5fY2xvc2luZ0RvdWJsZVF1b3RlUmVnZXgubGFzdEluZGV4LTE7fWVsc2UgaWYoY2hhcmFjdGVyPT09InsiKXsrK3RoaXMuX2JhbGFuY2U7fWVsc2UgaWYoY2hhcmFjdGVyPT09In0iKXstLXRoaXMuX2JhbGFuY2U7aWYodGhpcy5fYmFsYW5jZTwwKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9CmlmKCF0aGlzLl9iYWxhbmNlKXt0aGlzLl9sYXN0QmFsYW5jZWRJbmRleD1pbmRleCsxO2lmKCF0aGlzLl9maW5kTXVsdGlwbGUpCmJyZWFrO319ZWxzZSBpZihjaGFyYWN0ZXI9PT0iXSImJiF0aGlzLl9iYWxhbmNlKXt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiBmYWxzZTt9fQp0aGlzLl9pbmRleD1pbmRleDt0aGlzLl9yZXBvcnRCYWxhbmNlZCgpO3JldHVybiB0cnVlO30sX3JlcG9ydEJhbGFuY2VkOmZ1bmN0aW9uKCkKe2lmKCF0aGlzLl9sYXN0QmFsYW5jZWRJbmRleCkKcmV0dXJuO3RoaXMuX2NhbGxiYWNrKHRoaXMuX2J1ZmZlci5zbGljZSgwLHRoaXMuX2xhc3RCYWxhbmNlZEluZGV4KSk7dGhpcy5fYnVmZmVyPXRoaXMuX2J1ZmZlci5zbGljZSh0aGlzLl9sYXN0QmFsYW5jZWRJbmRleCk7dGhpcy5faW5kZXgtPXRoaXMuX2xhc3RCYWxhbmNlZEluZGV4O3RoaXMuX2xhc3RCYWxhbmNlZEluZGV4PTA7fSxyZW1haW5kZXI6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX2J1ZmZlcjt9fTtXZWJJbnNwZWN0b3IuVG9rZW5pemVyRmFjdG9yeT1mdW5jdGlvbigpe307V2ViSW5zcGVjdG9yLlRva2VuaXplckZhY3RvcnkucHJvdG90eXBlPXtjcmVhdGVUb2tlbml6ZXI6ZnVuY3Rpb24obWltZVR5cGUpe319O30se31dLDEwNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7V2ViSW5zcGVjdG9yLlVJU3RyaW5nPWZ1bmN0aW9uKHN0cmluZyx2YXJhcmcpCntyZXR1cm4gU3RyaW5nLnZzcHJpbnRmKFdlYkluc3BlY3Rvci5sb2NhbGl6ZShzdHJpbmcpLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7fTtXZWJJbnNwZWN0b3IuVUlTdHJpbmcuY2FwaXRhbGl6ZT1mdW5jdGlvbihzdHJpbmcsdmFyYXJnKQp7aWYoV2ViSW5zcGVjdG9yLl91c2VMb3dlckNhc2VNZW51VGl0bGVzPT09dW5kZWZpbmVkKQp0aHJvdyJXZWJJbnNwZWN0b3Iuc2V0TG9jYWxpemF0aW9uUGxhdGZvcm0oKSBoYXMgbm90IGJlZW4gY2FsbGVkIjt2YXIgbG9jYWxpemVkPVdlYkluc3BlY3Rvci5sb2NhbGl6ZShzdHJpbmcpO3ZhciBjYXBpdGFsaXplZDtpZihXZWJJbnNwZWN0b3IuX3VzZUxvd2VyQ2FzZU1lbnVUaXRsZXMpCmNhcGl0YWxpemVkPWxvY2FsaXplZC5yZXBsYWNlKC9cXiguKS9nLCIkMSIpO2Vsc2UKY2FwaXRhbGl6ZWQ9bG9jYWxpemVkLnJlcGxhY2UoL1xeKC4pL2csZnVuY3Rpb24oc3RyLGNoYXIpe3JldHVybiBjaGFyLnRvVXBwZXJDYXNlKCk7fSk7cmV0dXJuIFN0cmluZy52c3ByaW50ZihjYXBpdGFsaXplZCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpO307V2ViSW5zcGVjdG9yLnNldExvY2FsaXphdGlvblBsYXRmb3JtPWZ1bmN0aW9uKHBsYXRmb3JtKQp7V2ViSW5zcGVjdG9yLl91c2VMb3dlckNhc2VNZW51VGl0bGVzPXBsYXRmb3JtPT09IndpbmRvd3MiO307V2ViSW5zcGVjdG9yLmxvY2FsaXplPWZ1bmN0aW9uKHN0cmluZykKe3JldHVybiBzdHJpbmc7fTtXZWJJbnNwZWN0b3IuVUlTdHJpbmdGb3JtYXQ9ZnVuY3Rpb24oZm9ybWF0KQp7dGhpcy5fbG9jYWxpemVkRm9ybWF0PVdlYkluc3BlY3Rvci5sb2NhbGl6ZShmb3JtYXQpO3RoaXMuX3Rva2VuaXplZEZvcm1hdD1TdHJpbmcudG9rZW5pemVGb3JtYXRTdHJpbmcodGhpcy5fbG9jYWxpemVkRm9ybWF0LFN0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnMpO307V2ViSW5zcGVjdG9yLlVJU3RyaW5nRm9ybWF0Ll9hcHBlbmQ9ZnVuY3Rpb24oYSxiKQp7cmV0dXJuIGErYjt9O1dlYkluc3BlY3Rvci5VSVN0cmluZ0Zvcm1hdC5wcm90b3R5cGU9e2Zvcm1hdDpmdW5jdGlvbih2YXJhcmcpCntyZXR1cm4gU3RyaW5nLmZvcm1hdCh0aGlzLl9sb2NhbGl6ZWRGb3JtYXQsYXJndW1lbnRzLFN0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnMsIiIsV2ViSW5zcGVjdG9yLlVJU3RyaW5nRm9ybWF0Ll9hcHBlbmQsdGhpcy5fdG9rZW5pemVkRm9ybWF0KS5mb3JtYXR0ZWRSZXN1bHQ7fX07fSx7fV0sMTA2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtjb25zb2xlPWNvbnNvbGU7Y29uc29sZS5fX29yaWdpbmFsQXNzZXJ0PWNvbnNvbGUuYXNzZXJ0O2NvbnNvbGUuYXNzZXJ0PWZ1bmN0aW9uKHZhbHVlLG1lc3NhZ2UpCntpZih2YWx1ZSkKcmV0dXJuO2NvbnNvbGUuX19vcmlnaW5hbEFzc2VydCh2YWx1ZSxtZXNzYWdlKTt9O3ZhciBBcnJheUxpa2U7ZnVuY3Rpb24gbW9kKG0sbikKe3JldHVybihtJW4rbiklbjt9ClN0cmluZy5wcm90b3R5cGUuZmluZEFsbD1mdW5jdGlvbihzdHJpbmcpCnt2YXIgbWF0Y2hlcz1bXTt2YXIgaT10aGlzLmluZGV4T2Yoc3RyaW5nKTt3aGlsZShpIT09LTEpe21hdGNoZXMucHVzaChpKTtpPXRoaXMuaW5kZXhPZihzdHJpbmcsaStzdHJpbmcubGVuZ3RoKTt9CnJldHVybiBtYXRjaGVzO307U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQ29udHJvbENoYXJhY3RlcnM9ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMucmVwbGFjZSgvW1x1MDAwMC1cdTAwMDhcdTAwMGJcdTAwMGNcdTAwMGUtXHUwMDFmXHUwMDgwLVx1MDA5Zl0vZywi77+9Iik7fTtTdHJpbmcucHJvdG90eXBlLmlzV2hpdGVzcGFjZT1mdW5jdGlvbigpCntyZXR1cm4vXlxzKiQvLnRlc3QodGhpcyk7fTtTdHJpbmcucHJvdG90eXBlLmNvbXB1dGVMaW5lRW5kaW5ncz1mdW5jdGlvbigpCnt2YXIgZW5kaW5ncz10aGlzLmZpbmRBbGwoIlxuIik7ZW5kaW5ncy5wdXNoKHRoaXMubGVuZ3RoKTtyZXR1cm4gZW5kaW5nczt9O1N0cmluZy5wcm90b3R5cGUuZXNjYXBlQ2hhcmFjdGVycz1mdW5jdGlvbihjaGFycykKe3ZhciBmb3VuZENoYXI9ZmFsc2U7Zm9yKHZhciBpPTA7aTxjaGFycy5sZW5ndGg7KytpKXtpZih0aGlzLmluZGV4T2YoY2hhcnMuY2hhckF0KGkpKSE9PS0xKXtmb3VuZENoYXI9dHJ1ZTticmVhazt9fQppZighZm91bmRDaGFyKQpyZXR1cm4gU3RyaW5nKHRoaXMpO3ZhciByZXN1bHQ9IiI7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpe2lmKGNoYXJzLmluZGV4T2YodGhpcy5jaGFyQXQoaSkpIT09LTEpCnJlc3VsdCs9IlxcIjtyZXN1bHQrPXRoaXMuY2hhckF0KGkpO30KcmV0dXJuIHJlc3VsdDt9O1N0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzPWZ1bmN0aW9uKCkKe3JldHVybiJeW117fSgpXFwuXiQqKz98LSwiO307U3RyaW5nLnByb3RvdHlwZS5lc2NhcGVGb3JSZWdFeHA9ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuZXNjYXBlQ2hhcmFjdGVycyhTdHJpbmcucmVnZXhTcGVjaWFsQ2hhcmFjdGVycygpKTt9O1N0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTD1mdW5jdGlvbigpCntyZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKTt9O1N0cmluZy5wcm90b3R5cGUudW5lc2NhcGVIVE1MPWZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyYjNTg7L2csIjoiKS5yZXBsYWNlKC8mcXVvdDsvZywiXCIiKS5yZXBsYWNlKC8mIzYwOy9nLCI8IikucmVwbGFjZSgvJiM2MjsvZywiPiIpLnJlcGxhY2UoLyZhbXA7L2csIiYiKTt9O1N0cmluZy5wcm90b3R5cGUuY29sbGFwc2VXaGl0ZXNwYWNlPWZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLnJlcGxhY2UoL1tcc1x4QTBdKy9nLCIgIik7fTtTdHJpbmcucHJvdG90eXBlLnRyaW1NaWRkbGU9ZnVuY3Rpb24obWF4TGVuZ3RoKQp7aWYodGhpcy5sZW5ndGg8PW1heExlbmd0aCkKcmV0dXJuIFN0cmluZyh0aGlzKTt2YXIgbGVmdEhhbGY9bWF4TGVuZ3RoPj4xO3ZhciByaWdodEhhbGY9bWF4TGVuZ3RoLWxlZnRIYWxmLTE7cmV0dXJuIHRoaXMuc3Vic3RyKDAsbGVmdEhhbGYpKyJcdTIwMjYiK3RoaXMuc3Vic3RyKHRoaXMubGVuZ3RoLXJpZ2h0SGFsZixyaWdodEhhbGYpO307U3RyaW5nLnByb3RvdHlwZS50cmltRW5kPWZ1bmN0aW9uKG1heExlbmd0aCkKe2lmKHRoaXMubGVuZ3RoPD1tYXhMZW5ndGgpCnJldHVybiBTdHJpbmcodGhpcyk7cmV0dXJuIHRoaXMuc3Vic3RyKDAsbWF4TGVuZ3RoLTEpKyJcdTIwMjYiO307U3RyaW5nLnByb3RvdHlwZS50cmltVVJMPWZ1bmN0aW9uKGJhc2VVUkxEb21haW4pCnt2YXIgcmVzdWx0PXRoaXMucmVwbGFjZSgvXihodHRwc3xodHRwfGZpbGUpOlwvXC8vaSwiIik7aWYoYmFzZVVSTERvbWFpbil7aWYocmVzdWx0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChiYXNlVVJMRG9tYWluLnRvTG93ZXJDYXNlKCkpKQpyZXN1bHQ9cmVzdWx0LnN1YnN0cihiYXNlVVJMRG9tYWluLmxlbmd0aCk7fQpyZXR1cm4gcmVzdWx0O307U3RyaW5nLnByb3RvdHlwZS50b1RpdGxlQ2FzZT1mdW5jdGlvbigpCntyZXR1cm4gdGhpcy5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK3RoaXMuc3Vic3RyaW5nKDEpO307U3RyaW5nLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24ob3RoZXIpCntpZih0aGlzPm90aGVyKQpyZXR1cm4gMTtpZih0aGlzPG90aGVyKQpyZXR1cm4tMTtyZXR1cm4gMDt9O1N0cmluZy5wcm90b3R5cGUucmVtb3ZlVVJMRnJhZ21lbnQ9ZnVuY3Rpb24oKQp7dmFyIGZyYWdtZW50SW5kZXg9dGhpcy5pbmRleE9mKCIjIik7aWYoZnJhZ21lbnRJbmRleD09PS0xKQpmcmFnbWVudEluZGV4PXRoaXMubGVuZ3RoO3JldHVybiB0aGlzLnN1YnN0cmluZygwLGZyYWdtZW50SW5kZXgpO307U3RyaW5nLmhhc2hDb2RlPWZ1bmN0aW9uKHN0cmluZykKe2lmKCFzdHJpbmcpCnJldHVybiAwO3ZhciBwPSgxPDwzMCkqNC01O3ZhciB6PTB4NTAzM2Q5Njc7dmFyIHoyPTB4NTlkMmYxNWQ7dmFyIHM9MDt2YXIgemk9MTtmb3IodmFyIGk9MDtpPHN0cmluZy5sZW5ndGg7aSsrKXt2YXIgeGk9c3RyaW5nLmNoYXJDb2RlQXQoaSkqejI7cz0ocyt6aSp4aSklcDt6aT16aSp6JXA7fQpzPShzK3ppKihwLTEpKSVwO3JldHVybiBNYXRoLmFicyhzfDApO307U3RyaW5nLmlzRGlnaXRBdD1mdW5jdGlvbihzdHJpbmcsaW5kZXgpCnt2YXIgYz1zdHJpbmcuY2hhckNvZGVBdChpbmRleCk7cmV0dXJuIDQ4PD1jJiZjPD01Nzt9O1N0cmluZy5wcm90b3R5cGUudG9CYXNlNjQ9ZnVuY3Rpb24oKQp7ZnVuY3Rpb24gZW5jb2RlQml0cyhiKQp7cmV0dXJuIGI8MjY/Yis2NTpiPDUyP2IrNzE6Yjw2Mj9iLTQ6Yj09PTYyPzQzOmI9PT02Mz80Nzo2NTt9CnZhciBlbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO3ZhciBkYXRhPWVuY29kZXIuZW5jb2RlKHRoaXMudG9TdHJpbmcoKSk7dmFyIG49ZGF0YS5sZW5ndGg7dmFyIGVuY29kZWQ9IiI7aWYobj09PTApCnJldHVybiBlbmNvZGVkO3ZhciBzaGlmdDt2YXIgdj0wO2Zvcih2YXIgaT0wO2k8bjtpKyspe3NoaWZ0PWklMzt2fD1kYXRhW2ldPDwoMTY+Pj5zaGlmdCYyNCk7aWYoc2hpZnQ9PT0yKXtlbmNvZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY29kZUJpdHModj4+PjE4JjYzKSxlbmNvZGVCaXRzKHY+Pj4xMiY2MyksZW5jb2RlQml0cyh2Pj4+NiY2MyksZW5jb2RlQml0cyh2JjYzKSk7dj0wO319CmlmKHNoaWZ0PT09MCkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLDYxLDYxKTtlbHNlCmlmKHNoaWZ0PT09MSkKZW5jb2RlZCs9U3RyaW5nLmZyb21DaGFyQ29kZShlbmNvZGVCaXRzKHY+Pj4xOCY2MyksZW5jb2RlQml0cyh2Pj4+MTImNjMpLGVuY29kZUJpdHModj4+PjYmNjMpLDYxKTtyZXR1cm4gZW5jb2RlZDt9O1N0cmluZy5uYXR1cmFsT3JkZXJDb21wYXJhdG9yPWZ1bmN0aW9uKGEsYikKe3ZhciBjaHVuaz0vXlxkK3xeXEQrLzt2YXIgY2h1bmthLGNodW5rYixhbnVtLGJudW07d2hpbGUoMSl7aWYoYSl7aWYoIWIpCnJldHVybiAxO31lbHNle2lmKGIpCnJldHVybi0xO2Vsc2UKcmV0dXJuIDA7fQpjaHVua2E9YS5tYXRjaChjaHVuaylbMF07Y2h1bmtiPWIubWF0Y2goY2h1bmspWzBdO2FudW09IWlzTmFOKGNodW5rYSk7Ym51bT0haXNOYU4oY2h1bmtiKTtpZihhbnVtJiYhYm51bSkKcmV0dXJuLTE7aWYoYm51bSYmIWFudW0pCnJldHVybiAxO2lmKGFudW0mJmJudW0pe3ZhciBkaWZmPWNodW5rYS1jaHVua2I7aWYoZGlmZikKcmV0dXJuIGRpZmY7aWYoY2h1bmthLmxlbmd0aCE9PWNodW5rYi5sZW5ndGgpe2lmKCErY2h1bmthJiYhK2NodW5rYikKcmV0dXJuIGNodW5rYS5sZW5ndGgtY2h1bmtiLmxlbmd0aDtlbHNlCnJldHVybiBjaHVua2IubGVuZ3RoLWNodW5rYS5sZW5ndGg7fX1lbHNlIGlmKGNodW5rYSE9PWNodW5rYikKcmV0dXJuIGNodW5rYTxjaHVua2I/LTE6MTthPWEuc3Vic3RyaW5nKGNodW5rYS5sZW5ndGgpO2I9Yi5zdWJzdHJpbmcoY2h1bmtiLmxlbmd0aCk7fX07U3RyaW5nLmNhc2VJbnNlbnNldGl2ZUNvbXBhcmF0b3I9ZnVuY3Rpb24oYSxiKQp7YT1hLnRvVXBwZXJDYXNlKCk7Yj1iLnRvVXBwZXJDYXNlKCk7aWYoYT09PWIpCnJldHVybiAwO3JldHVybiBhPmI/MTotMTt9O051bWJlci5jb25zdHJhaW49ZnVuY3Rpb24obnVtLG1pbixtYXgpCntpZihudW08bWluKQpudW09bWluO2Vsc2UKaWYobnVtPm1heCkKbnVtPW1heDtyZXR1cm4gbnVtO307TnVtYmVyLmdjZD1mdW5jdGlvbihhLGIpCntpZihiPT09MCkKcmV0dXJuIGE7ZWxzZQpyZXR1cm4gTnVtYmVyLmdjZChiLGElYik7fTtOdW1iZXIudG9GaXhlZElmRmxvYXRpbmc9ZnVuY3Rpb24odmFsdWUpCntpZighdmFsdWV8fGlzTmFOKHZhbHVlKSkKcmV0dXJuIHZhbHVlO3ZhciBudW1iZXI9TnVtYmVyKHZhbHVlKTtyZXR1cm4gbnVtYmVyJTE/bnVtYmVyLnRvRml4ZWQoMyk6U3RyaW5nKG51bWJlcik7fTtEYXRlLnByb3RvdHlwZS50b0lTTzg2MDFDb21wYWN0PWZ1bmN0aW9uKCkKe2Z1bmN0aW9uIGxlYWRaZXJvKHgpCntyZXR1cm4oeD45PyIiOiIwIikreDt9CnJldHVybiB0aGlzLmdldEZ1bGxZZWFyKCkrCmxlYWRaZXJvKHRoaXMuZ2V0TW9udGgoKSsxKSsKbGVhZFplcm8odGhpcy5nZXREYXRlKCkpKyJUIisKbGVhZFplcm8odGhpcy5nZXRIb3VycygpKSsKbGVhZFplcm8odGhpcy5nZXRNaW51dGVzKCkpKwpsZWFkWmVybyh0aGlzLmdldFNlY29uZHMoKSk7fTtEYXRlLnByb3RvdHlwZS50b0NvbnNvbGVUaW1lPWZ1bmN0aW9uKCkKe2Z1bmN0aW9uIGxlYWRaZXJvMih4KQp7cmV0dXJuKHg+OT8iIjoiMCIpK3g7fQpmdW5jdGlvbiBsZWFkWmVybzMoeCkKe3JldHVybiIwIi5yZXBlYXQoMy14LnRvU3RyaW5nKCkubGVuZ3RoKSt4O30KcmV0dXJuIHRoaXMuZ2V0RnVsbFllYXIoKSsiLSIrCmxlYWRaZXJvMih0aGlzLmdldE1vbnRoKCkrMSkrIi0iKwpsZWFkWmVybzIodGhpcy5nZXREYXRlKCkpKyIgIisKbGVhZFplcm8yKHRoaXMuZ2V0SG91cnMoKSkrIjoiKwpsZWFkWmVybzIodGhpcy5nZXRNaW51dGVzKCkpKyI6IisKbGVhZFplcm8yKHRoaXMuZ2V0U2Vjb25kcygpKSsiLiIrCmxlYWRaZXJvMyh0aGlzLmdldE1pbGxpc2Vjb25kcygpKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsInJlbW92ZSIse3ZhbHVlOmZ1bmN0aW9uKHZhbHVlLGZpcnN0T25seSkKe3ZhciBpbmRleD10aGlzLmluZGV4T2YodmFsdWUpO2lmKGluZGV4PT09LTEpCnJldHVybiBmYWxzZTtpZihmaXJzdE9ubHkpe3RoaXMuc3BsaWNlKGluZGV4LDEpO3JldHVybiB0cnVlO30KZm9yKHZhciBpPWluZGV4KzEsbj10aGlzLmxlbmd0aDtpPG47KytpKXtpZih0aGlzW2ldIT09dmFsdWUpCnRoaXNbaW5kZXgrK109dGhpc1tpXTt9CnRoaXMubGVuZ3RoPWluZGV4O3JldHVybiB0cnVlO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJwdXNoQWxsIix7dmFsdWU6ZnVuY3Rpb24oYXJyYXkpCntBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLGFycmF5KTt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwicm90YXRlIix7dmFsdWU6ZnVuY3Rpb24oaW5kZXgpCnt2YXIgcmVzdWx0PVtdO2Zvcih2YXIgaT1pbmRleDtpPGluZGV4K3RoaXMubGVuZ3RoOysraSkKcmVzdWx0LnB1c2godGhpc1tpJXRoaXMubGVuZ3RoXSk7cmV0dXJuIHJlc3VsdDt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwic29ydE51bWJlcnMiLHt2YWx1ZTpmdW5jdGlvbigpCntmdW5jdGlvbiBudW1lcmljQ29tcGFyYXRvcihhLGIpCntyZXR1cm4gYS1iO30KdGhpcy5zb3J0KG51bWVyaWNDb21wYXJhdG9yKTt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwic29ydCIse3ZhbHVlOkFycmF5LnByb3RvdHlwZS5zb3J0fSk7KGZ1bmN0aW9uKCl7dmFyIHBhcnRpdGlvbj17dmFsdWU6ZnVuY3Rpb24oY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHBpdm90SW5kZXgpCntmdW5jdGlvbiBzd2FwKGFycmF5LGkxLGkyKQp7dmFyIHRlbXA9YXJyYXlbaTFdO2FycmF5W2kxXT1hcnJheVtpMl07YXJyYXlbaTJdPXRlbXA7fQp2YXIgcGl2b3RWYWx1ZT10aGlzW3Bpdm90SW5kZXhdO3N3YXAodGhpcyxyaWdodCxwaXZvdEluZGV4KTt2YXIgc3RvcmVJbmRleD1sZWZ0O2Zvcih2YXIgaT1sZWZ0O2k8cmlnaHQ7KytpKXtpZihjb21wYXJhdG9yKHRoaXNbaV0scGl2b3RWYWx1ZSk8MCl7c3dhcCh0aGlzLHN0b3JlSW5kZXgsaSk7KytzdG9yZUluZGV4O319CnN3YXAodGhpcyxyaWdodCxzdG9yZUluZGV4KTtyZXR1cm4gc3RvcmVJbmRleDt9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJwYXJ0aXRpb24iLHBhcnRpdGlvbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMkFycmF5LnByb3RvdHlwZSwicGFydGl0aW9uIixwYXJ0aXRpb24pO3ZhciBzb3J0UmFuZ2U9e3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmF0b3IsbGVmdEJvdW5kLHJpZ2h0Qm91bmQsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KQp7ZnVuY3Rpb24gcXVpY2tTb3J0UmFuZ2UoYXJyYXksY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCkKe2lmKHJpZ2h0PD1sZWZ0KQpyZXR1cm47dmFyIHBpdm90SW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihyaWdodC1sZWZ0KSkrbGVmdDt2YXIgcGl2b3ROZXdJbmRleD1hcnJheS5wYXJ0aXRpb24oY29tcGFyYXRvcixsZWZ0LHJpZ2h0LHBpdm90SW5kZXgpO2lmKHNvcnRXaW5kb3dMZWZ0PHBpdm90TmV3SW5kZXgpCnF1aWNrU29ydFJhbmdlKGFycmF5LGNvbXBhcmF0b3IsbGVmdCxwaXZvdE5ld0luZGV4LTEsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KTtpZihwaXZvdE5ld0luZGV4PHNvcnRXaW5kb3dSaWdodCkKcXVpY2tTb3J0UmFuZ2UoYXJyYXksY29tcGFyYXRvcixwaXZvdE5ld0luZGV4KzEscmlnaHQsc29ydFdpbmRvd0xlZnQsc29ydFdpbmRvd1JpZ2h0KTt9CmlmKGxlZnRCb3VuZD09PTAmJnJpZ2h0Qm91bmQ9PT10aGlzLmxlbmd0aC0xJiZzb3J0V2luZG93TGVmdD09PTAmJnNvcnRXaW5kb3dSaWdodD49cmlnaHRCb3VuZCkKdGhpcy5zb3J0KGNvbXBhcmF0b3IpO2Vsc2UKcXVpY2tTb3J0UmFuZ2UodGhpcyxjb21wYXJhdG9yLGxlZnRCb3VuZCxyaWdodEJvdW5kLHNvcnRXaW5kb3dMZWZ0LHNvcnRXaW5kb3dSaWdodCk7cmV0dXJuIHRoaXM7fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwic29ydFJhbmdlIixzb3J0UmFuZ2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsInNvcnRSYW5nZSIsc29ydFJhbmdlKTt9KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsInN0YWJsZVNvcnQiLHt2YWx1ZTpmdW5jdGlvbihjb21wYXJhdG9yKQp7ZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IoYSxiKQp7cmV0dXJuIGE8Yj8tMTphPmI/MTowO30KY29tcGFyYXRvcj1jb21wYXJhdG9yfHxkZWZhdWx0Q29tcGFyYXRvcjt2YXIgaW5kaWNlcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7KytpKQppbmRpY2VzW2ldPWk7dmFyIHNlbGY9dGhpcztmdW5jdGlvbiBpbmRleENvbXBhcmF0b3IoYSxiKQp7dmFyIHJlc3VsdD1jb21wYXJhdG9yKHNlbGZbYV0sc2VsZltiXSk7cmV0dXJuIHJlc3VsdD9yZXN1bHQ6YS1iO30KaW5kaWNlcy5zb3J0KGluZGV4Q29tcGFyYXRvcik7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDsrK2kpe2lmKGluZGljZXNbaV08MHx8aT09PWluZGljZXNbaV0pCmNvbnRpbnVlO3ZhciBjeWNsaWNhbD1pO3ZhciBzYXZlZD10aGlzW2ldO3doaWxlKHRydWUpe3ZhciBuZXh0PWluZGljZXNbY3ljbGljYWxdO2luZGljZXNbY3ljbGljYWxdPS0xO2lmKG5leHQ9PT1pKXt0aGlzW2N5Y2xpY2FsXT1zYXZlZDticmVhazt9ZWxzZXt0aGlzW2N5Y2xpY2FsXT10aGlzW25leHRdO2N5Y2xpY2FsPW5leHQ7fX19CnJldHVybiB0aGlzO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJxc2VsZWN0Iix7dmFsdWU6ZnVuY3Rpb24oayxjb21wYXJhdG9yKQp7aWYoazwwfHxrPj10aGlzLmxlbmd0aCkKcmV0dXJuO2lmKCFjb21wYXJhdG9yKQpjb21wYXJhdG9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYjt9O3ZhciBsb3c9MDt2YXIgaGlnaD10aGlzLmxlbmd0aC0xO2Zvcig7Oyl7dmFyIHBpdm90UG9zaXRpb249dGhpcy5wYXJ0aXRpb24oY29tcGFyYXRvcixsb3csaGlnaCxNYXRoLmZsb29yKChoaWdoK2xvdykvMikpO2lmKHBpdm90UG9zaXRpb249PT1rKQpyZXR1cm4gdGhpc1trXTtlbHNlCmlmKHBpdm90UG9zaXRpb24+aykKaGlnaD1waXZvdFBvc2l0aW9uLTE7ZWxzZQpsb3c9cGl2b3RQb3NpdGlvbisxO319fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwibG93ZXJCb3VuZCIse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpCntmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpCntyZXR1cm4gYTxiPy0xOmE+Yj8xOjA7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO3ZhciBsPWxlZnR8fDA7dmFyIHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXt2YXIgbT1sK3I+PjE7aWYoY29tcGFyYXRvcihvYmplY3QsdGhpc1ttXSk+MCkKbD1tKzE7ZWxzZQpyPW07fQpyZXR1cm4gcjt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwidXBwZXJCb3VuZCIse3ZhbHVlOmZ1bmN0aW9uKG9iamVjdCxjb21wYXJhdG9yLGxlZnQscmlnaHQpCntmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLGIpCntyZXR1cm4gYTxiPy0xOmE+Yj8xOjA7fQpjb21wYXJhdG9yPWNvbXBhcmF0b3J8fGRlZmF1bHRDb21wYXJhdG9yO3ZhciBsPWxlZnR8fDA7dmFyIHI9cmlnaHQhPT11bmRlZmluZWQ/cmlnaHQ6dGhpcy5sZW5ndGg7d2hpbGUobDxyKXt2YXIgbT1sK3I+PjE7aWYoY29tcGFyYXRvcihvYmplY3QsdGhpc1ttXSk+PTApCmw9bSsxO2Vsc2UKcj1tO30KcmV0dXJuIHI7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsImxvd2VyQm91bmQiLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUubG93ZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzJBcnJheS5wcm90b3R5cGUsInVwcGVyQm91bmQiLHt2YWx1ZTpBcnJheS5wcm90b3R5cGUudXBwZXJCb3VuZH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDY0QXJyYXkucHJvdG90eXBlLCJsb3dlckJvdW5kIix7dmFsdWU6QXJyYXkucHJvdG90eXBlLmxvd2VyQm91bmR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJiaW5hcnlJbmRleE9mIix7dmFsdWU6ZnVuY3Rpb24odmFsdWUsY29tcGFyYXRvcikKe3ZhciBpbmRleD10aGlzLmxvd2VyQm91bmQodmFsdWUsY29tcGFyYXRvcik7cmV0dXJuIGluZGV4PHRoaXMubGVuZ3RoJiZjb21wYXJhdG9yKHZhbHVlLHRoaXNbaW5kZXhdKT09PTA/aW5kZXg6LTE7fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsInNlbGVjdCIse3ZhbHVlOmZ1bmN0aW9uKGZpZWxkKQp7dmFyIHJlc3VsdD1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7KytpKQpyZXN1bHRbaV09dGhpc1tpXVtmaWVsZF07cmV0dXJuIHJlc3VsdDt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwicGVla0xhc3QiLHt2YWx1ZTpmdW5jdGlvbigpCntyZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXTt9fSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbWVyZ2VPckludGVyc2VjdChhcnJheTEsYXJyYXkyLGNvbXBhcmF0b3IsbWVyZ2VOb3RJbnRlcnNlY3QpCnt2YXIgcmVzdWx0PVtdO3ZhciBpPTA7dmFyIGo9MDt3aGlsZShpPGFycmF5MS5sZW5ndGgmJmo8YXJyYXkyLmxlbmd0aCl7dmFyIGNvbXBhcmVWYWx1ZT1jb21wYXJhdG9yKGFycmF5MVtpXSxhcnJheTJbal0pO2lmKG1lcmdlTm90SW50ZXJzZWN0fHwhY29tcGFyZVZhbHVlKQpyZXN1bHQucHVzaChjb21wYXJlVmFsdWU8PTA/YXJyYXkxW2ldOmFycmF5MltqXSk7aWYoY29tcGFyZVZhbHVlPD0wKQppKys7aWYoY29tcGFyZVZhbHVlPj0wKQpqKys7fQppZihtZXJnZU5vdEludGVyc2VjdCl7d2hpbGUoaTxhcnJheTEubGVuZ3RoKQpyZXN1bHQucHVzaChhcnJheTFbaSsrXSk7d2hpbGUoajxhcnJheTIubGVuZ3RoKQpyZXN1bHQucHVzaChhcnJheTJbaisrXSk7fQpyZXR1cm4gcmVzdWx0O30KT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwiaW50ZXJzZWN0T3JkZXJlZCIse3ZhbHVlOmZ1bmN0aW9uKGFycmF5LGNvbXBhcmF0b3IpCntyZXR1cm4gbWVyZ2VPckludGVyc2VjdCh0aGlzLGFycmF5LGNvbXBhcmF0b3IsZmFsc2UpO319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJtZXJnZU9yZGVyZWQiLHt2YWx1ZTpmdW5jdGlvbihhcnJheSxjb21wYXJhdG9yKQp7cmV0dXJuIG1lcmdlT3JJbnRlcnNlY3QodGhpcyxhcnJheSxjb21wYXJhdG9yLHRydWUpO319KTt9KSgpO1N0cmluZy5zcHJpbnRmPWZ1bmN0aW9uKGZvcm1hdCx2YXJfYXJnKQp7cmV0dXJuIFN0cmluZy52c3ByaW50Zihmb3JtYXQsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTt9O1N0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZz1mdW5jdGlvbihmb3JtYXQsZm9ybWF0dGVycykKe3ZhciB0b2tlbnM9W107dmFyIHN1YnN0aXR1dGlvbkluZGV4PTA7ZnVuY3Rpb24gYWRkU3RyaW5nVG9rZW4oc3RyKQp7aWYodG9rZW5zLmxlbmd0aCYmdG9rZW5zW3Rva2Vucy5sZW5ndGgtMV0udHlwZT09PSJzdHJpbmciKQp0b2tlbnNbdG9rZW5zLmxlbmd0aC0xXS52YWx1ZSs9c3RyO2Vsc2UKdG9rZW5zLnB1c2goe3R5cGU6InN0cmluZyIsdmFsdWU6c3RyfSk7fQpmdW5jdGlvbiBhZGRTcGVjaWZpZXJUb2tlbihzcGVjaWZpZXIscHJlY2lzaW9uLHN1YnN0aXR1dGlvbkluZGV4KQp7dG9rZW5zLnB1c2goe3R5cGU6InNwZWNpZmllciIsc3BlY2lmaWVyOnNwZWNpZmllcixwcmVjaXNpb246cHJlY2lzaW9uLHN1YnN0aXR1dGlvbkluZGV4OnN1YnN0aXR1dGlvbkluZGV4fSk7fQp2YXIgaW5kZXg9MDtmb3IodmFyIHByZWNlbnRJbmRleD1mb3JtYXQuaW5kZXhPZigiJSIsaW5kZXgpO3ByZWNlbnRJbmRleCE9PS0xO3ByZWNlbnRJbmRleD1mb3JtYXQuaW5kZXhPZigiJSIsaW5kZXgpKXtpZihmb3JtYXQubGVuZ3RoPT09aW5kZXgpCmJyZWFrO2FkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcoaW5kZXgscHJlY2VudEluZGV4KSk7aW5kZXg9cHJlY2VudEluZGV4KzE7aWYoZm9ybWF0W2luZGV4XT09PSIlIil7YWRkU3RyaW5nVG9rZW4oIiUiKTsrK2luZGV4O2NvbnRpbnVlO30KaWYoU3RyaW5nLmlzRGlnaXRBdChmb3JtYXQsaW5kZXgpKXt2YXIgbnVtYmVyPXBhcnNlSW50KGZvcm1hdC5zdWJzdHJpbmcoaW5kZXgpLDEwKTt3aGlsZShTdHJpbmcuaXNEaWdpdEF0KGZvcm1hdCxpbmRleCkpCisraW5kZXg7aWYobnVtYmVyPjAmJmZvcm1hdFtpbmRleF09PT0iJCIpe3N1YnN0aXR1dGlvbkluZGV4PW51bWJlci0xOysraW5kZXg7fX0KdmFyIHByZWNpc2lvbj0tMTtpZihmb3JtYXRbaW5kZXhdPT09Ii4iKXsrK2luZGV4O3ByZWNpc2lvbj1wYXJzZUludChmb3JtYXQuc3Vic3RyaW5nKGluZGV4KSwxMCk7aWYoaXNOYU4ocHJlY2lzaW9uKSkKcHJlY2lzaW9uPTA7d2hpbGUoU3RyaW5nLmlzRGlnaXRBdChmb3JtYXQsaW5kZXgpKQorK2luZGV4O30KaWYoIShmb3JtYXRbaW5kZXhdaW4gZm9ybWF0dGVycykpe2FkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcocHJlY2VudEluZGV4LGluZGV4KzEpKTsrK2luZGV4O2NvbnRpbnVlO30KYWRkU3BlY2lmaWVyVG9rZW4oZm9ybWF0W2luZGV4XSxwcmVjaXNpb24sc3Vic3RpdHV0aW9uSW5kZXgpOysrc3Vic3RpdHV0aW9uSW5kZXg7KytpbmRleDt9CmFkZFN0cmluZ1Rva2VuKGZvcm1hdC5zdWJzdHJpbmcoaW5kZXgpKTtyZXR1cm4gdG9rZW5zO307U3RyaW5nLnN0YW5kYXJkRm9ybWF0dGVycz17ZDpmdW5jdGlvbihzdWJzdGl0dXRpb24pCntyZXR1cm4haXNOYU4oc3Vic3RpdHV0aW9uKT9zdWJzdGl0dXRpb246MDt9LGY6ZnVuY3Rpb24oc3Vic3RpdHV0aW9uLHRva2VuKQp7aWYoc3Vic3RpdHV0aW9uJiZ0b2tlbi5wcmVjaXNpb24+LTEpCnN1YnN0aXR1dGlvbj1zdWJzdGl0dXRpb24udG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pO3JldHVybiFpc05hTihzdWJzdGl0dXRpb24pP3N1YnN0aXR1dGlvbjp0b2tlbi5wcmVjaXNpb24+LTE/TnVtYmVyKDApLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTowO30sczpmdW5jdGlvbihzdWJzdGl0dXRpb24pCntyZXR1cm4gc3Vic3RpdHV0aW9uO319O1N0cmluZy52c3ByaW50Zj1mdW5jdGlvbihmb3JtYXQsc3Vic3RpdHV0aW9ucykKe3JldHVybiBTdHJpbmcuZm9ybWF0KGZvcm1hdCxzdWJzdGl0dXRpb25zLFN0cmluZy5zdGFuZGFyZEZvcm1hdHRlcnMsIiIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStiO30pLmZvcm1hdHRlZFJlc3VsdDt9O1N0cmluZy5mb3JtYXQ9ZnVuY3Rpb24oZm9ybWF0LHN1YnN0aXR1dGlvbnMsZm9ybWF0dGVycyxpbml0aWFsVmFsdWUsYXBwZW5kLHRva2VuaXplZEZvcm1hdCkKe2lmKCFmb3JtYXR8fCFzdWJzdGl0dXRpb25zfHwhc3Vic3RpdHV0aW9ucy5sZW5ndGgpCnJldHVybntmb3JtYXR0ZWRSZXN1bHQ6YXBwZW5kKGluaXRpYWxWYWx1ZSxmb3JtYXQpLHVudXNlZFN1YnN0aXR1dGlvbnM6c3Vic3RpdHV0aW9uc307ZnVuY3Rpb24gcHJldHR5RnVuY3Rpb25OYW1lKCkKe3JldHVybiJTdHJpbmcuZm9ybWF0KFwiIitmb3JtYXQrIlwiLCBcIiIrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChzdWJzdGl0dXRpb25zLCJcIiwgXCIiKSsiXCIpIjt9CmZ1bmN0aW9uIHdhcm4obXNnKQp7Y29uc29sZS53YXJuKHByZXR0eUZ1bmN0aW9uTmFtZSgpKyI6ICIrbXNnKTt9CmZ1bmN0aW9uIGVycm9yKG1zZykKe2NvbnNvbGUuZXJyb3IocHJldHR5RnVuY3Rpb25OYW1lKCkrIjogIittc2cpO30KdmFyIHJlc3VsdD1pbml0aWFsVmFsdWU7dmFyIHRva2Vucz10b2tlbml6ZWRGb3JtYXR8fFN0cmluZy50b2tlbml6ZUZvcm1hdFN0cmluZyhmb3JtYXQsZm9ybWF0dGVycyk7dmFyIHVzZWRTdWJzdGl0dXRpb25JbmRleGVzPXt9O2Zvcih2YXIgaT0wO2k8dG9rZW5zLmxlbmd0aDsrK2kpe3ZhciB0b2tlbj10b2tlbnNbaV07aWYodG9rZW4udHlwZT09PSJzdHJpbmciKXtyZXN1bHQ9YXBwZW5kKHJlc3VsdCx0b2tlbi52YWx1ZSk7Y29udGludWU7fQppZih0b2tlbi50eXBlIT09InNwZWNpZmllciIpe2Vycm9yKCJVbmtub3duIHRva2VuIHR5cGUgXCIiK3Rva2VuLnR5cGUrIlwiIGZvdW5kLiIpO2NvbnRpbnVlO30KaWYodG9rZW4uc3Vic3RpdHV0aW9uSW5kZXg+PXN1YnN0aXR1dGlvbnMubGVuZ3RoKXtlcnJvcigibm90IGVub3VnaCBzdWJzdGl0dXRpb24gYXJndW1lbnRzLiBIYWQgIitzdWJzdGl0dXRpb25zLmxlbmd0aCsiIGJ1dCBuZWVkZWQgIisodG9rZW4uc3Vic3RpdHV0aW9uSW5kZXgrMSkrIiwgc28gc3Vic3RpdHV0aW9uIHdhcyBza2lwcGVkLiIpO3Jlc3VsdD1hcHBlbmQocmVzdWx0LCIlIisodG9rZW4ucHJlY2lzaW9uPi0xP3Rva2VuLnByZWNpc2lvbjoiIikrdG9rZW4uc3BlY2lmaWVyKTtjb250aW51ZTt9CnVzZWRTdWJzdGl0dXRpb25JbmRleGVzW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XT10cnVlO2lmKCEodG9rZW4uc3BlY2lmaWVyIGluIGZvcm1hdHRlcnMpKXt3YXJuKCJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyIFx1MjAxQyIrdG9rZW4uc3BlY2lmaWVyKyJcdTIwMUQuIFRyZWF0aW5nIGFzIGEgc3RyaW5nLiIpO3Jlc3VsdD1hcHBlbmQocmVzdWx0LHN1YnN0aXR1dGlvbnNbdG9rZW4uc3Vic3RpdHV0aW9uSW5kZXhdKTtjb250aW51ZTt9CnJlc3VsdD1hcHBlbmQocmVzdWx0LGZvcm1hdHRlcnNbdG9rZW4uc3BlY2lmaWVyXShzdWJzdGl0dXRpb25zW3Rva2VuLnN1YnN0aXR1dGlvbkluZGV4XSx0b2tlbikpO30KdmFyIHVudXNlZFN1YnN0aXR1dGlvbnM9W107Zm9yKHZhciBpPTA7aTxzdWJzdGl0dXRpb25zLmxlbmd0aDsrK2kpe2lmKGkgaW4gdXNlZFN1YnN0aXR1dGlvbkluZGV4ZXMpCmNvbnRpbnVlO3VudXNlZFN1YnN0aXR1dGlvbnMucHVzaChzdWJzdGl0dXRpb25zW2ldKTt9CnJldHVybntmb3JtYXR0ZWRSZXN1bHQ6cmVzdWx0LHVudXNlZFN1YnN0aXR1dGlvbnM6dW51c2VkU3Vic3RpdHV0aW9uc307fTtmdW5jdGlvbiBjcmVhdGVTZWFyY2hSZWdleChxdWVyeSxjYXNlU2Vuc2l0aXZlLGlzUmVnZXgpCnt2YXIgcmVnZXhGbGFncz1jYXNlU2Vuc2l0aXZlPyJnIjoiZ2kiO3ZhciByZWdleE9iamVjdDtpZihpc1JlZ2V4KXt0cnl7cmVnZXhPYmplY3Q9bmV3IFJlZ0V4cChxdWVyeSxyZWdleEZsYWdzKTt9Y2F0Y2goZSl7fX0KaWYoIXJlZ2V4T2JqZWN0KQpyZWdleE9iamVjdD1jcmVhdGVQbGFpblRleHRTZWFyY2hSZWdleChxdWVyeSxyZWdleEZsYWdzKTtyZXR1cm4gcmVnZXhPYmplY3Q7fQpmdW5jdGlvbiBjcmVhdGVQbGFpblRleHRTZWFyY2hSZWdleChxdWVyeSxmbGFncykKe3ZhciByZWdleFNwZWNpYWxDaGFyYWN0ZXJzPVN0cmluZy5yZWdleFNwZWNpYWxDaGFyYWN0ZXJzKCk7dmFyIHJlZ2V4PSIiO2Zvcih2YXIgaT0wO2k8cXVlcnkubGVuZ3RoOysraSl7dmFyIGM9cXVlcnkuY2hhckF0KGkpO2lmKHJlZ2V4U3BlY2lhbENoYXJhY3RlcnMuaW5kZXhPZihjKSE9PS0xKQpyZWdleCs9IlxcIjtyZWdleCs9Yzt9CnJldHVybiBuZXcgUmVnRXhwKHJlZ2V4LGZsYWdzfHwiIik7fQpmdW5jdGlvbiBjb3VudFJlZ2V4TWF0Y2hlcyhyZWdleCxjb250ZW50KQp7dmFyIHRleHQ9Y29udGVudDt2YXIgcmVzdWx0PTA7dmFyIG1hdGNoO3doaWxlKHRleHQmJihtYXRjaD1yZWdleC5leGVjKHRleHQpKSl7aWYobWF0Y2hbMF0ubGVuZ3RoPjApCisrcmVzdWx0O3RleHQ9dGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXgrMSk7fQpyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gc3BhY2VzUGFkZGluZyhzcGFjZXNDb3VudCkKe3JldHVybiJcdTAwYTAiLnJlcGVhdChzcGFjZXNDb3VudCk7fQpmdW5jdGlvbiBudW1iZXJUb1N0cmluZ1dpdGhTcGFjZXNQYWRkaW5nKHZhbHVlLHN5bWJvbHNDb3VudCkKe3ZhciBudW1iZXJTdHJpbmc9dmFsdWUudG9TdHJpbmcoKTt2YXIgcGFkZGluZ0xlbmd0aD1NYXRoLm1heCgwLHN5bWJvbHNDb3VudC1udW1iZXJTdHJpbmcubGVuZ3RoKTtyZXR1cm4gc3BhY2VzUGFkZGluZyhwYWRkaW5nTGVuZ3RoKStudW1iZXJTdHJpbmc7fQpTZXQucHJvdG90eXBlLnZhbHVlc0FycmF5PWZ1bmN0aW9uKCkKe3JldHVybiBBcnJheS5mcm9tKHRoaXMudmFsdWVzKCkpO307U2V0LnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oaXRlcmFibGUpCntmb3IodmFyIGUgb2YgaXRlcmFibGUpCnRoaXMuYWRkKGUpO307U2V0LnByb3RvdHlwZS5jb250YWluc0FsbD1mdW5jdGlvbihpdGVyYWJsZSkKe2Zvcih2YXIgZSBvZiBpdGVyYWJsZSl7aWYoIXRoaXMuaGFzKGUpKQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9O01hcC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGtleSkKe3ZhciB2YWx1ZT10aGlzLmdldChrZXkpO3RoaXMuZGVsZXRlKGtleSk7cmV0dXJuIHZhbHVlO307TWFwLnByb3RvdHlwZS52YWx1ZXNBcnJheT1mdW5jdGlvbigpCntyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnZhbHVlcygpKTt9O01hcC5wcm90b3R5cGUua2V5c0FycmF5PWZ1bmN0aW9uKCkKe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cygpKTt9O01hcC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpCnt2YXIgcmVzdWx0PW5ldyBNdWx0aW1hcCgpO2Zvcih2YXIga2V5IG9mIHRoaXMua2V5cygpKXt2YXIgdmFsdWU9dGhpcy5nZXQoa2V5KTtyZXN1bHQuc2V0KHZhbHVlLGtleSk7fQpyZXR1cm4gcmVzdWx0O307dmFyIE11bHRpbWFwPWZ1bmN0aW9uKCkKe3RoaXMuX21hcD1uZXcgTWFwKCk7fTtNdWx0aW1hcC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihrZXksdmFsdWUpCnt2YXIgc2V0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighc2V0KXtzZXQ9bmV3IFNldCgpO3RoaXMuX21hcC5zZXQoa2V5LHNldCk7fQpzZXQuYWRkKHZhbHVlKTt9LGdldDpmdW5jdGlvbihrZXkpCnt2YXIgcmVzdWx0PXRoaXMuX21hcC5nZXQoa2V5KTtpZighcmVzdWx0KQpyZXN1bHQ9bmV3IFNldCgpO3JldHVybiByZXN1bHQ7fSxoYXM6ZnVuY3Rpb24oa2V5KQp7cmV0dXJuIHRoaXMuX21hcC5oYXMoa2V5KTt9LGhhc1ZhbHVlOmZ1bmN0aW9uKGtleSx2YWx1ZSkKe3ZhciBzZXQ9dGhpcy5fbWFwLmdldChrZXkpO2lmKCFzZXQpCnJldHVybiBmYWxzZTtyZXR1cm4gc2V0Lmhhcyh2YWx1ZSk7fSxnZXQgc2l6ZSgpCntyZXR1cm4gdGhpcy5fbWFwLnNpemU7fSxyZW1vdmU6ZnVuY3Rpb24oa2V5LHZhbHVlKQp7dmFyIHZhbHVlcz10aGlzLmdldChrZXkpO3ZhbHVlcy5kZWxldGUodmFsdWUpO2lmKCF2YWx1ZXMuc2l6ZSkKdGhpcy5fbWFwLmRlbGV0ZShrZXkpO30scmVtb3ZlQWxsOmZ1bmN0aW9uKGtleSkKe3RoaXMuX21hcC5kZWxldGUoa2V5KTt9LGtleXNBcnJheTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fbWFwLmtleXNBcnJheSgpO30sdmFsdWVzQXJyYXk6ZnVuY3Rpb24oKQp7dmFyIHJlc3VsdD1bXTt2YXIga2V5cz10aGlzLmtleXNBcnJheSgpO2Zvcih2YXIgaT0wO2k8a2V5cy5sZW5ndGg7KytpKQpyZXN1bHQucHVzaEFsbCh0aGlzLmdldChrZXlzW2ldKS52YWx1ZXNBcnJheSgpKTtyZXR1cm4gcmVzdWx0O30sY2xlYXI6ZnVuY3Rpb24oKQp7dGhpcy5fbWFwLmNsZWFyKCk7fX07ZnVuY3Rpb24gbG9hZFhIUih1cmwpCntyZXR1cm4gbmV3IFByb21pc2UobG9hZCk7ZnVuY3Rpb24gbG9hZChzdWNjZXNzQ2FsbGJhY2ssZmFpbHVyZUNhbGxiYWNrKQp7ZnVuY3Rpb24gb25SZWFkeVN0YXRlQ2hhbmdlZCgpCntpZih4aHIucmVhZHlTdGF0ZSE9PVhNTEh0dHBSZXF1ZXN0LkRPTkUpCnJldHVybjtpZih4aHIuc3RhdHVzIT09MjAwKXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7ZmFpbHVyZUNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzKSk7cmV0dXJuO30KeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3N1Y2Nlc3NDYWxsYmFjayh4aHIucmVzcG9uc2VUZXh0KTt9CnZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7eGhyLndpdGhDcmVkZW50aWFscz1mYWxzZTt4aHIub3BlbigiR0VUIix1cmwsdHJ1ZSk7eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1vblJlYWR5U3RhdGVDaGFuZ2VkO3hoci5zZW5kKG51bGwpO319CmZ1bmN0aW9uIENhbGxiYWNrQmFycmllcigpCnt0aGlzLl9wZW5kaW5nSW5jb21pbmdDYWxsYmFja3NDb3VudD0wO30KQ2FsbGJhY2tCYXJyaWVyLnByb3RvdHlwZT17Y3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24odXNlckNhbGxiYWNrKQp7Y29uc29sZS5hc3NlcnQoIXRoaXMuX291dGdvaW5nQ2FsbGJhY2ssIkNhbGxiYWNrQmFycmllci5jcmVhdGVDYWxsYmFjaygpIGlzIGNhbGxlZCBhZnRlciBDYWxsYmFja0JhcnJpZXIuY2FsbFdoZW5Eb25lKCkiKTsrK3RoaXMuX3BlbmRpbmdJbmNvbWluZ0NhbGxiYWNrc0NvdW50O3JldHVybiB0aGlzLl9pbmNvbWluZ0NhbGxiYWNrLmJpbmQodGhpcyx1c2VyQ2FsbGJhY2spO30sY2FsbFdoZW5Eb25lOmZ1bmN0aW9uKGNhbGxiYWNrKQp7Y29uc29sZS5hc3NlcnQoIXRoaXMuX291dGdvaW5nQ2FsbGJhY2ssIkNhbGxiYWNrQmFycmllci5jYWxsV2hlbkRvbmUoKSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiKTt0aGlzLl9vdXRnb2luZ0NhbGxiYWNrPWNhbGxiYWNrO2lmKCF0aGlzLl9wZW5kaW5nSW5jb21pbmdDYWxsYmFja3NDb3VudCkKdGhpcy5fb3V0Z29pbmdDYWxsYmFjaygpO30sZG9uZVByb21pc2U6ZnVuY3Rpb24oKQp7cmV0dXJuIG5ldyBQcm9taXNlKHByb21pc2VDb25zdHJ1Y3Rvci5iaW5kKHRoaXMpKTtmdW5jdGlvbiBwcm9taXNlQ29uc3RydWN0b3Ioc3VjY2VzcykKe3RoaXMuY2FsbFdoZW5Eb25lKHN1Y2Nlc3MpO319LF9pbmNvbWluZ0NhbGxiYWNrOmZ1bmN0aW9uKHVzZXJDYWxsYmFjaykKe2NvbnNvbGUuYXNzZXJ0KHRoaXMuX3BlbmRpbmdJbmNvbWluZ0NhbGxiYWNrc0NvdW50PjApO2lmKHVzZXJDYWxsYmFjayl7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3VzZXJDYWxsYmFjay5hcHBseShudWxsLGFyZ3MpO30KaWYoIS0tdGhpcy5fcGVuZGluZ0luY29taW5nQ2FsbGJhY2tzQ291bnQmJnRoaXMuX291dGdvaW5nQ2FsbGJhY2spCnRoaXMuX291dGdvaW5nQ2FsbGJhY2soKTt9fTtmdW5jdGlvbiBzdXBwcmVzc1VudXNlZCh2YWx1ZSkKe30Kc2VsZi5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oY2FsbGJhY2spCntQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxiYWNrKTtyZXR1cm4gMDt9O1Byb21pc2UucHJvdG90eXBlLnNwcmVhZD1mdW5jdGlvbihjYWxsYmFjaykKe3JldHVybiB0aGlzLnRoZW4oc3ByZWFkUHJvbWlzZSk7ZnVuY3Rpb24gc3ByZWFkUHJvbWlzZShhcmcpCntyZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCxhcmcpO319O1Byb21pc2UucHJvdG90eXBlLmNhdGNoRXhjZXB0aW9uPWZ1bmN0aW9uKGRlZmF1bHRWYWx1ZSl7cmV0dXJuIHRoaXMuY2F0Y2goZnVuY3Rpb24oZXJyb3Ipe2NvbnNvbGUuZXJyb3IoZXJyb3IpO3JldHVybiBkZWZhdWx0VmFsdWU7fSk7fTtNYXAucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24ob3RoZXIsaXNFcXVhbCkKe3ZhciBsZWZ0S2V5cz10aGlzLmtleXNBcnJheSgpO3ZhciByaWdodEtleXM9b3RoZXIua2V5c0FycmF5KCk7bGVmdEtleXMuc29ydCgoYSxiKT0+YS1iKTtyaWdodEtleXMuc29ydCgoYSxiKT0+YS1iKTt2YXIgcmVtb3ZlZD1bXTt2YXIgYWRkZWQ9W107dmFyIGVxdWFsPVtdO3ZhciBsZWZ0SW5kZXg9MDt2YXIgcmlnaHRJbmRleD0wO3doaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgmJnJpZ2h0SW5kZXg8cmlnaHRLZXlzLmxlbmd0aCl7dmFyIGxlZnRLZXk9bGVmdEtleXNbbGVmdEluZGV4XTt2YXIgcmlnaHRLZXk9cmlnaHRLZXlzW3JpZ2h0SW5kZXhdO2lmKGxlZnRLZXk9PT1yaWdodEtleSYmaXNFcXVhbCh0aGlzLmdldChsZWZ0S2V5KSxvdGhlci5nZXQocmlnaHRLZXkpKSl7ZXF1YWwucHVzaCh0aGlzLmdldChsZWZ0S2V5KSk7KytsZWZ0SW5kZXg7KytyaWdodEluZGV4O2NvbnRpbnVlO30KaWYobGVmdEtleTw9cmlnaHRLZXkpe3JlbW92ZWQucHVzaCh0aGlzLmdldChsZWZ0S2V5KSk7KytsZWZ0SW5kZXg7Y29udGludWU7fQphZGRlZC5wdXNoKG90aGVyLmdldChyaWdodEtleSkpOysrcmlnaHRJbmRleDt9CndoaWxlKGxlZnRJbmRleDxsZWZ0S2V5cy5sZW5ndGgpe3ZhciBsZWZ0S2V5PWxlZnRLZXlzW2xlZnRJbmRleCsrXTtyZW1vdmVkLnB1c2godGhpcy5nZXQobGVmdEtleSkpO30Kd2hpbGUocmlnaHRJbmRleDxyaWdodEtleXMubGVuZ3RoKXt2YXIgcmlnaHRLZXk9cmlnaHRLZXlzW3JpZ2h0SW5kZXgrK107YWRkZWQucHVzaChvdGhlci5nZXQocmlnaHRLZXkpKTt9CnJldHVybnthZGRlZDphZGRlZCxyZW1vdmVkOnJlbW92ZWQsZXF1YWw6ZXF1YWx9O307fSx7fV0sMTA3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuQ1NTTWF0Y2hlZFN0eWxlcz1mdW5jdGlvbihjc3NNb2RlbCxub2RlLGlubGluZVBheWxvYWQsYXR0cmlidXRlc1BheWxvYWQsbWF0Y2hlZFBheWxvYWQscHNldWRvUGF5bG9hZCxpbmhlcml0ZWRQYXlsb2FkLGFuaW1hdGlvbnNQYXlsb2FkKQp7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5fbm9kZT1ub2RlO3RoaXMuX25vZGVTdHlsZXM9W107dGhpcy5fbm9kZUZvclN0eWxlPW5ldyBNYXAoKTt0aGlzLl9pbmhlcml0ZWRTdHlsZXM9bmV3IFNldCgpO3RoaXMuX2tleWZyYW1lcz1bXTt0aGlzLl9tYXRjaGluZ1NlbGVjdG9ycz1uZXcgTWFwKCk7ZnVuY3Rpb24gYWRkQXR0cmlidXRlc1N0eWxlKCkKe2lmKCFhdHRyaWJ1dGVzUGF5bG9hZCkKcmV0dXJuO3ZhciBzdHlsZT1uZXcgV2ViSW5zcGVjdG9yLkNTU1N0eWxlRGVjbGFyYXRpb24oY3NzTW9kZWwsbnVsbCxhdHRyaWJ1dGVzUGF5bG9hZCxXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLkF0dHJpYnV0ZXMpO3RoaXMuX25vZGVGb3JTdHlsZS5zZXQoc3R5bGUsdGhpcy5fbm9kZSk7dGhpcy5fbm9kZVN0eWxlcy5wdXNoKHN0eWxlKTt9CmlmKGlubGluZVBheWxvYWQmJnRoaXMuX25vZGUubm9kZVR5cGUoKT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgc3R5bGU9bmV3IFdlYkluc3BlY3Rvci5DU1NTdHlsZURlY2xhcmF0aW9uKGNzc01vZGVsLG51bGwsaW5saW5lUGF5bG9hZCxXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLklubGluZSk7dGhpcy5fbm9kZUZvclN0eWxlLnNldChzdHlsZSx0aGlzLl9ub2RlKTt0aGlzLl9ub2RlU3R5bGVzLnB1c2goc3R5bGUpO30KdmFyIGFkZGVkQXR0cmlidXRlc1N0eWxlO2Zvcih2YXIgaT1tYXRjaGVkUGF5bG9hZC5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIHJ1bGU9bmV3IFdlYkluc3BlY3Rvci5DU1NTdHlsZVJ1bGUoY3NzTW9kZWwsbWF0Y2hlZFBheWxvYWRbaV0ucnVsZSk7aWYoKHJ1bGUuaXNJbmplY3RlZCgpfHxydWxlLmlzVXNlckFnZW50KCkpJiYhYWRkZWRBdHRyaWJ1dGVzU3R5bGUpe2FkZGVkQXR0cmlidXRlc1N0eWxlPXRydWU7YWRkQXR0cmlidXRlc1N0eWxlLmNhbGwodGhpcyk7fQp0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KHJ1bGUuc3R5bGUsdGhpcy5fbm9kZSk7dGhpcy5fbm9kZVN0eWxlcy5wdXNoKHJ1bGUuc3R5bGUpO2FkZE1hdGNoaW5nU2VsZWN0b3JzLmNhbGwodGhpcyx0aGlzLl9ub2RlLHJ1bGUsbWF0Y2hlZFBheWxvYWRbaV0ubWF0Y2hpbmdTZWxlY3RvcnMpO30KaWYoIWFkZGVkQXR0cmlidXRlc1N0eWxlKQphZGRBdHRyaWJ1dGVzU3R5bGUuY2FsbCh0aGlzKTt2YXIgcGFyZW50Tm9kZT10aGlzLl9ub2RlLnBhcmVudE5vZGU7Zm9yKHZhciBpPTA7cGFyZW50Tm9kZSYmaW5oZXJpdGVkUGF5bG9hZCYmaTxpbmhlcml0ZWRQYXlsb2FkLmxlbmd0aDsrK2kpe3ZhciBlbnRyeVBheWxvYWQ9aW5oZXJpdGVkUGF5bG9hZFtpXTt2YXIgaW5oZXJpdGVkSW5saW5lU3R5bGU9ZW50cnlQYXlsb2FkLmlubGluZVN0eWxlP25ldyBXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbihjc3NNb2RlbCxudWxsLGVudHJ5UGF5bG9hZC5pbmxpbmVTdHlsZSxXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLklubGluZSk6bnVsbDtpZihpbmhlcml0ZWRJbmxpbmVTdHlsZSYmdGhpcy5fY29udGFpbnNJbmhlcml0ZWQoaW5oZXJpdGVkSW5saW5lU3R5bGUpKXt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KGluaGVyaXRlZElubGluZVN0eWxlLHBhcmVudE5vZGUpO3RoaXMuX25vZGVTdHlsZXMucHVzaChpbmhlcml0ZWRJbmxpbmVTdHlsZSk7dGhpcy5faW5oZXJpdGVkU3R5bGVzLmFkZChpbmhlcml0ZWRJbmxpbmVTdHlsZSk7fQp2YXIgaW5oZXJpdGVkTWF0Y2hlZENTU1J1bGVzPWVudHJ5UGF5bG9hZC5tYXRjaGVkQ1NTUnVsZXN8fFtdO2Zvcih2YXIgaj1pbmhlcml0ZWRNYXRjaGVkQ1NTUnVsZXMubGVuZ3RoLTE7aj49MDstLWope3ZhciBpbmhlcml0ZWRSdWxlPW5ldyBXZWJJbnNwZWN0b3IuQ1NTU3R5bGVSdWxlKGNzc01vZGVsLGluaGVyaXRlZE1hdGNoZWRDU1NSdWxlc1tqXS5ydWxlKTthZGRNYXRjaGluZ1NlbGVjdG9ycy5jYWxsKHRoaXMscGFyZW50Tm9kZSxpbmhlcml0ZWRSdWxlLGluaGVyaXRlZE1hdGNoZWRDU1NSdWxlc1tqXS5tYXRjaGluZ1NlbGVjdG9ycyk7aWYoIXRoaXMuX2NvbnRhaW5zSW5oZXJpdGVkKGluaGVyaXRlZFJ1bGUuc3R5bGUpKQpjb250aW51ZTt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KGluaGVyaXRlZFJ1bGUuc3R5bGUscGFyZW50Tm9kZSk7dGhpcy5fbm9kZVN0eWxlcy5wdXNoKGluaGVyaXRlZFJ1bGUuc3R5bGUpO3RoaXMuX2luaGVyaXRlZFN0eWxlcy5hZGQoaW5oZXJpdGVkUnVsZS5zdHlsZSk7fQpwYXJlbnROb2RlPXBhcmVudE5vZGUucGFyZW50Tm9kZTt9CnRoaXMuX3BzZXVkb1N0eWxlcz1uZXcgTWFwKCk7aWYocHNldWRvUGF5bG9hZCl7Zm9yKHZhciBpPTA7aTxwc2V1ZG9QYXlsb2FkLmxlbmd0aDsrK2kpe3ZhciBlbnRyeVBheWxvYWQ9cHNldWRvUGF5bG9hZFtpXTt2YXIgcHNldWRvRWxlbWVudD10aGlzLl9ub2RlLnBzZXVkb0VsZW1lbnRzKCkuZ2V0KGVudHJ5UGF5bG9hZC5wc2V1ZG9UeXBlKXx8bnVsbDt2YXIgcHNldWRvU3R5bGVzPVtdO3ZhciBydWxlcz1lbnRyeVBheWxvYWQubWF0Y2hlc3x8W107Zm9yKHZhciBqPXJ1bGVzLmxlbmd0aC0xO2o+PTA7LS1qKXt2YXIgcHNldWRvUnVsZT1uZXcgV2ViSW5zcGVjdG9yLkNTU1N0eWxlUnVsZShjc3NNb2RlbCxydWxlc1tqXS5ydWxlKTtwc2V1ZG9TdHlsZXMucHVzaChwc2V1ZG9SdWxlLnN0eWxlKTt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KHBzZXVkb1J1bGUuc3R5bGUscHNldWRvRWxlbWVudCk7aWYocHNldWRvRWxlbWVudCkKYWRkTWF0Y2hpbmdTZWxlY3RvcnMuY2FsbCh0aGlzLHBzZXVkb0VsZW1lbnQscHNldWRvUnVsZSxydWxlc1tqXS5tYXRjaGluZ1NlbGVjdG9ycyk7fQp0aGlzLl9wc2V1ZG9TdHlsZXMuc2V0KGVudHJ5UGF5bG9hZC5wc2V1ZG9UeXBlLHBzZXVkb1N0eWxlcyk7fX0KaWYoYW5pbWF0aW9uc1BheWxvYWQpCnRoaXMuX2tleWZyYW1lcz1hbmltYXRpb25zUGF5bG9hZC5tYXAocnVsZT0+bmV3IFdlYkluc3BlY3Rvci5DU1NLZXlmcmFtZXNSdWxlKGNzc01vZGVsLHJ1bGUpKTt0aGlzLnJlc2V0QWN0aXZlUHJvcGVydGllcygpO2Z1bmN0aW9uIGFkZE1hdGNoaW5nU2VsZWN0b3JzKG5vZGUscnVsZSxtYXRjaGluZ1NlbGVjdG9ySW5kaWNlcykKe2Zvcih2YXIgbWF0Y2hpbmdTZWxlY3RvckluZGV4IG9mIG1hdGNoaW5nU2VsZWN0b3JJbmRpY2VzKXt2YXIgc2VsZWN0b3I9cnVsZS5zZWxlY3RvcnNbbWF0Y2hpbmdTZWxlY3RvckluZGV4XTt0aGlzLl9zZXRTZWxlY3Rvck1hdGNoZXMobm9kZSxzZWxlY3Rvci50ZXh0LHRydWUpO319fTtXZWJJbnNwZWN0b3IuQ1NTTWF0Y2hlZFN0eWxlcy5wcm90b3R5cGU9e25vZGU6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX25vZGU7fSxjc3NNb2RlbDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fSxoYXNNYXRjaGluZ1NlbGVjdG9yczpmdW5jdGlvbihydWxlKQp7dmFyIG1hdGNoaW5nU2VsZWN0b3JzPXRoaXMubWF0Y2hpbmdTZWxlY3RvcnMocnVsZSk7cmV0dXJuIG1hdGNoaW5nU2VsZWN0b3JzLmxlbmd0aD4wJiZ0aGlzLm1lZGlhTWF0Y2hlcyhydWxlLnN0eWxlKTt9LG1hdGNoaW5nU2VsZWN0b3JzOmZ1bmN0aW9uKHJ1bGUpCnt2YXIgbm9kZT10aGlzLm5vZGVGb3JTdHlsZShydWxlLnN0eWxlKTtpZighbm9kZSkKcmV0dXJuW107dmFyIG1hcD10aGlzLl9tYXRjaGluZ1NlbGVjdG9ycy5nZXQobm9kZS5pZCk7aWYoIW1hcCkKcmV0dXJuW107dmFyIHJlc3VsdD1bXTtmb3IodmFyIGk9MDtpPHJ1bGUuc2VsZWN0b3JzLmxlbmd0aDsrK2kpe2lmKG1hcC5nZXQocnVsZS5zZWxlY3RvcnNbaV0udGV4dCkpCnJlc3VsdC5wdXNoKGkpO30KcmV0dXJuIHJlc3VsdDt9LHJlY29tcHV0ZU1hdGNoaW5nU2VsZWN0b3JzOmZ1bmN0aW9uKHJ1bGUpCnt2YXIgbm9kZT10aGlzLm5vZGVGb3JTdHlsZShydWxlLnN0eWxlKTtpZighbm9kZSkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciBwcm9taXNlcz1bXTtmb3IodmFyIHNlbGVjdG9yIG9mIHJ1bGUuc2VsZWN0b3JzKQpwcm9taXNlcy5wdXNoKHF1ZXJ5U2VsZWN0b3IuY2FsbCh0aGlzLG5vZGUsc2VsZWN0b3IudGV4dCkpO3JldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7ZnVuY3Rpb24gcXVlcnlTZWxlY3Rvcihub2RlLHNlbGVjdG9yVGV4dCkKe3ZhciBvd25lckRvY3VtZW50PW5vZGUub3duZXJEb2N1bWVudHx8bnVsbDt2YXIgbWFwPXRoaXMuX21hdGNoaW5nU2VsZWN0b3JzLmdldChub2RlLmlkKTtpZihtYXAmJm1hcC5oYXMoc2VsZWN0b3JUZXh0KXx8IW93bmVyRG9jdW1lbnQpCnJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgcmVzb2x2ZTt2YXIgcHJvbWlzZT1uZXcgUHJvbWlzZShmdWxmaWxsPT5yZXNvbHZlPWZ1bGZpbGwpO3RoaXMuX25vZGUuZG9tTW9kZWwoKS5xdWVyeVNlbGVjdG9yQWxsKG93bmVyRG9jdW1lbnQuaWQsc2VsZWN0b3JUZXh0LG9uUXVlcnlDb21wbGV0ZS5iaW5kKHRoaXMsbm9kZSxzZWxlY3RvclRleHQscmVzb2x2ZSkpO3JldHVybiBwcm9taXNlO30KZnVuY3Rpb24gb25RdWVyeUNvbXBsZXRlKG5vZGUsc2VsZWN0b3JUZXh0LGNhbGxiYWNrLG1hdGNoaW5nTm9kZUlkcykKe2lmKG1hdGNoaW5nTm9kZUlkcykKdGhpcy5fc2V0U2VsZWN0b3JNYXRjaGVzKG5vZGUsc2VsZWN0b3JUZXh0LG1hdGNoaW5nTm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpIT09LTEpO2NhbGxiYWNrKCk7fX0sYWRkTmV3UnVsZTpmdW5jdGlvbihydWxlLG5vZGUpCnt0aGlzLl9ub2RlRm9yU3R5bGUuc2V0KHJ1bGUuc3R5bGUsbm9kZSk7cmV0dXJuIHRoaXMucmVjb21wdXRlTWF0Y2hpbmdTZWxlY3RvcnMocnVsZSk7fSxfc2V0U2VsZWN0b3JNYXRjaGVzOmZ1bmN0aW9uKG5vZGUsc2VsZWN0b3JUZXh0LHZhbHVlKQp7dmFyIG1hcD10aGlzLl9tYXRjaGluZ1NlbGVjdG9ycy5nZXQobm9kZS5pZCk7aWYoIW1hcCl7bWFwPW5ldyBNYXAoKTt0aGlzLl9tYXRjaGluZ1NlbGVjdG9ycy5zZXQobm9kZS5pZCxtYXApO30KbWFwLnNldChzZWxlY3RvclRleHQsdmFsdWUpO30sbWVkaWFNYXRjaGVzOmZ1bmN0aW9uKHN0eWxlKQp7dmFyIG1lZGlhPXN0eWxlLnBhcmVudFJ1bGU/c3R5bGUucGFyZW50UnVsZS5tZWRpYTpbXTtmb3IodmFyIGk9MDttZWRpYSYmaTxtZWRpYS5sZW5ndGg7KytpKXtpZighbWVkaWFbaV0uYWN0aXZlKCkpCnJldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO30sbm9kZVN0eWxlczpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fbm9kZVN0eWxlczt9LGtleWZyYW1lczpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzO30scHNldWRvU3R5bGVzOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9wc2V1ZG9TdHlsZXM7fSxfY29udGFpbnNJbmhlcml0ZWQ6ZnVuY3Rpb24oc3R5bGUpCnt2YXIgcHJvcGVydGllcz1zdHlsZS5hbGxQcm9wZXJ0aWVzO2Zvcih2YXIgaT0wO2k8cHJvcGVydGllcy5sZW5ndGg7KytpKXt2YXIgcHJvcGVydHk9cHJvcGVydGllc1tpXTtpZihwcm9wZXJ0eS5hY3RpdmVJblN0eWxlKCkmJldlYkluc3BlY3Rvci5jc3NNZXRhZGF0YSgpLmlzUHJvcGVydHlJbmhlcml0ZWQocHJvcGVydHkubmFtZSkpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30sbm9kZUZvclN0eWxlOmZ1bmN0aW9uKHN0eWxlKQp7cmV0dXJuIHRoaXMuX25vZGVGb3JTdHlsZS5nZXQoc3R5bGUpfHxudWxsO30saXNJbmhlcml0ZWQ6ZnVuY3Rpb24oc3R5bGUpCntyZXR1cm4gdGhpcy5faW5oZXJpdGVkU3R5bGVzLmhhcyhzdHlsZSk7fSxwcm9wZXJ0eVN0YXRlOmZ1bmN0aW9uKHByb3BlcnR5KQp7aWYodGhpcy5fcHJvcGVydGllc1N0YXRlLnNpemU9PT0wKXt0aGlzLl9jb21wdXRlQWN0aXZlUHJvcGVydGllcyh0aGlzLl9ub2RlU3R5bGVzLHRoaXMuX3Byb3BlcnRpZXNTdGF0ZSk7Zm9yKHZhciBwc2V1ZG9FbGVtZW50U3R5bGVzIG9mIHRoaXMuX3BzZXVkb1N0eWxlcy52YWx1ZXNBcnJheSgpKQp0aGlzLl9jb21wdXRlQWN0aXZlUHJvcGVydGllcyhwc2V1ZG9FbGVtZW50U3R5bGVzLHRoaXMuX3Byb3BlcnRpZXNTdGF0ZSk7fQpyZXR1cm4gdGhpcy5fcHJvcGVydGllc1N0YXRlLmdldChwcm9wZXJ0eSl8fG51bGw7fSxyZXNldEFjdGl2ZVByb3BlcnRpZXM6ZnVuY3Rpb24oKQp7dGhpcy5fcHJvcGVydGllc1N0YXRlPW5ldyBNYXAoKTt9LF9jb21wdXRlQWN0aXZlUHJvcGVydGllczpmdW5jdGlvbihzdHlsZXMscmVzdWx0KQp7dmFyIGZvdW5kSW1wb3J0YW50UHJvcGVydGllcz1uZXcgU2V0KCk7dmFyIHByb3BlcnR5VG9FZmZlY3RpdmVSdWxlPW5ldyBNYXAoKTt2YXIgaW5oZXJpdGVkUHJvcGVydHlUb05vZGU9bmV3IE1hcCgpO3ZhciBhbGxVc2VkUHJvcGVydGllcz1uZXcgU2V0KCk7Zm9yKHZhciBpPTA7aTxzdHlsZXMubGVuZ3RoOysraSl7dmFyIHN0eWxlPXN0eWxlc1tpXTt2YXIgcnVsZT1zdHlsZS5wYXJlbnRSdWxlO2lmKHJ1bGUmJiEocnVsZSBpbnN0YW5jZW9mIFdlYkluc3BlY3Rvci5DU1NTdHlsZVJ1bGUpKQpjb250aW51ZTtpZihydWxlJiYhdGhpcy5oYXNNYXRjaGluZ1NlbGVjdG9ycyhydWxlKSkKY29udGludWU7dmFyIHN0eWxlQWN0aXZlUHJvcGVydGllcz1uZXcgTWFwKCk7dmFyIGFsbFByb3BlcnRpZXM9c3R5bGUuYWxsUHJvcGVydGllcztmb3IodmFyIGo9MDtqPGFsbFByb3BlcnRpZXMubGVuZ3RoOysrail7dmFyIHByb3BlcnR5PWFsbFByb3BlcnRpZXNbal07dmFyIGluaGVyaXRlZD10aGlzLmlzSW5oZXJpdGVkKHN0eWxlKTtpZihpbmhlcml0ZWQmJiFXZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5pc1Byb3BlcnR5SW5oZXJpdGVkKHByb3BlcnR5Lm5hbWUpKQpjb250aW51ZTtpZighcHJvcGVydHkuYWN0aXZlSW5TdHlsZSgpKXtyZXN1bHQuc2V0KHByb3BlcnR5LFdlYkluc3BlY3Rvci5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCk7Y29udGludWU7fQp2YXIgY2Fub25pY2FsTmFtZT1XZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk7aWYoZm91bmRJbXBvcnRhbnRQcm9wZXJ0aWVzLmhhcyhjYW5vbmljYWxOYW1lKSl7cmVzdWx0LnNldChwcm9wZXJ0eSxXZWJJbnNwZWN0b3IuQ1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLk92ZXJsb2FkZWQpO2NvbnRpbnVlO30KaWYoIXByb3BlcnR5LmltcG9ydGFudCYmYWxsVXNlZFByb3BlcnRpZXMuaGFzKGNhbm9uaWNhbE5hbWUpKXtyZXN1bHQuc2V0KHByb3BlcnR5LFdlYkluc3BlY3Rvci5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuT3ZlcmxvYWRlZCk7Y29udGludWU7fQp2YXIgaXNLbm93blByb3BlcnR5PXByb3BlcnR5VG9FZmZlY3RpdmVSdWxlLmhhcyhjYW5vbmljYWxOYW1lKTt2YXIgaW5oZXJpdGVkRnJvbU5vZGU9aW5oZXJpdGVkP3RoaXMubm9kZUZvclN0eWxlKHN0eWxlKTpudWxsO2lmKCFpc0tub3duUHJvcGVydHkmJmluaGVyaXRlZEZyb21Ob2RlJiYhaW5oZXJpdGVkUHJvcGVydHlUb05vZGUuaGFzKGNhbm9uaWNhbE5hbWUpKQppbmhlcml0ZWRQcm9wZXJ0eVRvTm9kZS5zZXQoY2Fub25pY2FsTmFtZSxpbmhlcml0ZWRGcm9tTm9kZSk7aWYocHJvcGVydHkuaW1wb3J0YW50KXtpZihpbmhlcml0ZWQmJmlzS25vd25Qcm9wZXJ0eSYmaW5oZXJpdGVkRnJvbU5vZGUhPT1pbmhlcml0ZWRQcm9wZXJ0eVRvTm9kZS5nZXQoY2Fub25pY2FsTmFtZSkpe3Jlc3VsdC5zZXQocHJvcGVydHksV2ViSW5zcGVjdG9yLkNTU01hdGNoZWRTdHlsZXMuUHJvcGVydHlTdGF0ZS5PdmVybG9hZGVkKTtjb250aW51ZTt9CmZvdW5kSW1wb3J0YW50UHJvcGVydGllcy5hZGQoY2Fub25pY2FsTmFtZSk7aWYoaXNLbm93blByb3BlcnR5KXt2YXIgb3ZlcmxvYWRlZD1wcm9wZXJ0eVRvRWZmZWN0aXZlUnVsZS5nZXQoY2Fub25pY2FsTmFtZSkuZ2V0KGNhbm9uaWNhbE5hbWUpO3Jlc3VsdC5zZXQob3ZlcmxvYWRlZCxXZWJJbnNwZWN0b3IuQ1NTTWF0Y2hlZFN0eWxlcy5Qcm9wZXJ0eVN0YXRlLk92ZXJsb2FkZWQpO3Byb3BlcnR5VG9FZmZlY3RpdmVSdWxlLmdldChjYW5vbmljYWxOYW1lKS5kZWxldGUoY2Fub25pY2FsTmFtZSk7fX0Kc3R5bGVBY3RpdmVQcm9wZXJ0aWVzLnNldChjYW5vbmljYWxOYW1lLHByb3BlcnR5KTthbGxVc2VkUHJvcGVydGllcy5hZGQoY2Fub25pY2FsTmFtZSk7cHJvcGVydHlUb0VmZmVjdGl2ZVJ1bGUuc2V0KGNhbm9uaWNhbE5hbWUsc3R5bGVBY3RpdmVQcm9wZXJ0aWVzKTtyZXN1bHQuc2V0KHByb3BlcnR5LFdlYkluc3BlY3Rvci5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGUuQWN0aXZlKTt9CmZvcih2YXIgcHJvcGVydHkgb2Ygc3R5bGUubGVhZGluZ1Byb3BlcnRpZXMoKSl7dmFyIGNhbm9uaWNhbE5hbWU9V2ViSW5zcGVjdG9yLmNzc01ldGFkYXRhKCkuY2Fub25pY2FsUHJvcGVydHlOYW1lKHByb3BlcnR5Lm5hbWUpO2lmKCFzdHlsZUFjdGl2ZVByb3BlcnRpZXMuaGFzKGNhbm9uaWNhbE5hbWUpKQpjb250aW51ZTt2YXIgbG9uZ2hhbmRzPXN0eWxlLmxvbmdoYW5kUHJvcGVydGllcyhwcm9wZXJ0eS5uYW1lKTtpZighbG9uZ2hhbmRzLmxlbmd0aCkKY29udGludWU7dmFyIG5vdFVzZWQ9dHJ1ZTtmb3IodmFyIGxvbmdoYW5kIG9mIGxvbmdoYW5kcyl7dmFyIGxvbmdoYW5kQ2Fub25pY2FsTmFtZT1XZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUobG9uZ2hhbmQubmFtZSk7bm90VXNlZD1ub3RVc2VkJiYhc3R5bGVBY3RpdmVQcm9wZXJ0aWVzLmhhcyhsb25naGFuZENhbm9uaWNhbE5hbWUpO30KaWYoIW5vdFVzZWQpCmNvbnRpbnVlO3N0eWxlQWN0aXZlUHJvcGVydGllcy5kZWxldGUoY2Fub25pY2FsTmFtZSk7YWxsVXNlZFByb3BlcnRpZXMuZGVsZXRlKGNhbm9uaWNhbE5hbWUpO3Jlc3VsdC5zZXQocHJvcGVydHksV2ViSW5zcGVjdG9yLkNTU01hdGNoZWRTdHlsZXMuUHJvcGVydHlTdGF0ZS5PdmVybG9hZGVkKTt9fX19O1dlYkluc3BlY3Rvci5DU1NNYXRjaGVkU3R5bGVzLlByb3BlcnR5U3RhdGU9e0FjdGl2ZToiQWN0aXZlIixPdmVybG9hZGVkOiJPdmVybG9hZGVkIn07fSx7fV0sMTA4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuQ1NTTWVkaWFRdWVyeT1mdW5jdGlvbihwYXlsb2FkKQp7dGhpcy5fYWN0aXZlPXBheWxvYWQuYWN0aXZlO3RoaXMuX2V4cHJlc3Npb25zPVtdO2Zvcih2YXIgaj0wO2o8cGF5bG9hZC5leHByZXNzaW9ucy5sZW5ndGg7KytqKQp0aGlzLl9leHByZXNzaW9ucy5wdXNoKFdlYkluc3BlY3Rvci5DU1NNZWRpYVF1ZXJ5RXhwcmVzc2lvbi5wYXJzZVBheWxvYWQocGF5bG9hZC5leHByZXNzaW9uc1tqXSkpO307V2ViSW5zcGVjdG9yLkNTU01lZGlhUXVlcnkucGFyc2VQYXlsb2FkPWZ1bmN0aW9uKHBheWxvYWQpCntyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5DU1NNZWRpYVF1ZXJ5KHBheWxvYWQpO307V2ViSW5zcGVjdG9yLkNTU01lZGlhUXVlcnkucHJvdG90eXBlPXthY3RpdmU6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX2FjdGl2ZTt9LGV4cHJlc3Npb25zOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9leHByZXNzaW9uczt9fTtXZWJJbnNwZWN0b3IuQ1NTTWVkaWFRdWVyeUV4cHJlc3Npb249ZnVuY3Rpb24ocGF5bG9hZCkKe3RoaXMuX3ZhbHVlPXBheWxvYWQudmFsdWU7dGhpcy5fdW5pdD1wYXlsb2FkLnVuaXQ7dGhpcy5fZmVhdHVyZT1wYXlsb2FkLmZlYXR1cmU7dGhpcy5fdmFsdWVSYW5nZT1wYXlsb2FkLnZhbHVlUmFuZ2U/V2ViSW5zcGVjdG9yLlRleHRSYW5nZS5mcm9tT2JqZWN0KHBheWxvYWQudmFsdWVSYW5nZSk6bnVsbDt0aGlzLl9jb21wdXRlZExlbmd0aD1wYXlsb2FkLmNvbXB1dGVkTGVuZ3RofHxudWxsO307V2ViSW5zcGVjdG9yLkNTU01lZGlhUXVlcnlFeHByZXNzaW9uLnBhcnNlUGF5bG9hZD1mdW5jdGlvbihwYXlsb2FkKQp7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ1NTTWVkaWFRdWVyeUV4cHJlc3Npb24ocGF5bG9hZCk7fTtXZWJJbnNwZWN0b3IuQ1NTTWVkaWFRdWVyeUV4cHJlc3Npb24ucHJvdG90eXBlPXt2YWx1ZTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fdmFsdWU7fSx1bml0OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl91bml0O30sZmVhdHVyZTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fZmVhdHVyZTt9LHZhbHVlUmFuZ2U6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3ZhbHVlUmFuZ2U7fSxjb21wdXRlZExlbmd0aDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fY29tcHV0ZWRMZW5ndGg7fX07V2ViSW5zcGVjdG9yLkNTU01lZGlhPWZ1bmN0aW9uKGNzc01vZGVsLHBheWxvYWQpCnt0aGlzLl9jc3NNb2RlbD1jc3NNb2RlbDt0aGlzLl9yZWluaXRpYWxpemUocGF5bG9hZCk7fTtXZWJJbnNwZWN0b3IuQ1NTTWVkaWEuU291cmNlPXtMSU5LRURfU0hFRVQ6ImxpbmtlZFNoZWV0IixJTkxJTkVfU0hFRVQ6ImlubGluZVNoZWV0IixNRURJQV9SVUxFOiJtZWRpYVJ1bGUiLElNUE9SVF9SVUxFOiJpbXBvcnRSdWxlIn07V2ViSW5zcGVjdG9yLkNTU01lZGlhLnBhcnNlUGF5bG9hZD1mdW5jdGlvbihjc3NNb2RlbCxwYXlsb2FkKQp7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ1NTTWVkaWEoY3NzTW9kZWwscGF5bG9hZCk7fTtXZWJJbnNwZWN0b3IuQ1NTTWVkaWEucGFyc2VNZWRpYUFycmF5UGF5bG9hZD1mdW5jdGlvbihjc3NNb2RlbCxwYXlsb2FkKQp7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGk9MDtpPHBheWxvYWQubGVuZ3RoOysraSkKcmVzdWx0LnB1c2goV2ViSW5zcGVjdG9yLkNTU01lZGlhLnBhcnNlUGF5bG9hZChjc3NNb2RlbCxwYXlsb2FkW2ldKSk7cmV0dXJuIHJlc3VsdDt9O1dlYkluc3BlY3Rvci5DU1NNZWRpYS5wcm90b3R5cGU9e19yZWluaXRpYWxpemU6ZnVuY3Rpb24ocGF5bG9hZCkKe3RoaXMudGV4dD1wYXlsb2FkLnRleHQ7dGhpcy5zb3VyY2U9cGF5bG9hZC5zb3VyY2U7dGhpcy5zb3VyY2VVUkw9cGF5bG9hZC5zb3VyY2VVUkx8fCIiO3RoaXMucmFuZ2U9cGF5bG9hZC5yYW5nZT9XZWJJbnNwZWN0b3IuVGV4dFJhbmdlLmZyb21PYmplY3QocGF5bG9hZC5yYW5nZSk6bnVsbDt0aGlzLnN0eWxlU2hlZXRJZD1wYXlsb2FkLnN0eWxlU2hlZXRJZDt0aGlzLm1lZGlhTGlzdD1udWxsO2lmKHBheWxvYWQubWVkaWFMaXN0KXt0aGlzLm1lZGlhTGlzdD1bXTtmb3IodmFyIGk9MDtpPHBheWxvYWQubWVkaWFMaXN0Lmxlbmd0aDsrK2kpCnRoaXMubWVkaWFMaXN0LnB1c2goV2ViSW5zcGVjdG9yLkNTU01lZGlhUXVlcnkucGFyc2VQYXlsb2FkKHBheWxvYWQubWVkaWFMaXN0W2ldKSk7fX0scmViYXNlOmZ1bmN0aW9uKGVkaXQpCntpZih0aGlzLnN0eWxlU2hlZXRJZCE9PWVkaXQuc3R5bGVTaGVldElkfHwhdGhpcy5yYW5nZSkKcmV0dXJuO2lmKGVkaXQub2xkUmFuZ2UuZXF1YWwodGhpcy5yYW5nZSkpCnRoaXMuX3JlaW5pdGlhbGl6ZShlZGl0LnBheWxvYWQpO2Vsc2UKdGhpcy5yYW5nZT10aGlzLnJhbmdlLnJlYmFzZUFmdGVyVGV4dEVkaXQoZWRpdC5vbGRSYW5nZSxlZGl0Lm5ld1JhbmdlKTt9LGVxdWFsOmZ1bmN0aW9uKG90aGVyKQp7aWYoIXRoaXMuc3R5bGVTaGVldElkfHwhdGhpcy5yYW5nZXx8IW90aGVyLnJhbmdlKQpyZXR1cm4gZmFsc2U7cmV0dXJuIHRoaXMuc3R5bGVTaGVldElkPT09b3RoZXIuc3R5bGVTaGVldElkJiZ0aGlzLnJhbmdlLmVxdWFsKG90aGVyLnJhbmdlKTt9LGFjdGl2ZTpmdW5jdGlvbigpCntpZighdGhpcy5tZWRpYUxpc3QpCnJldHVybiB0cnVlO2Zvcih2YXIgaT0wO2k8dGhpcy5tZWRpYUxpc3QubGVuZ3RoOysraSl7aWYodGhpcy5tZWRpYUxpc3RbaV0uYWN0aXZlKCkpCnJldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30sbGluZU51bWJlckluU291cmNlOmZ1bmN0aW9uKCkKe2lmKCF0aGlzLnJhbmdlKQpyZXR1cm4gdW5kZWZpbmVkO3ZhciBoZWFkZXI9dGhpcy5oZWFkZXIoKTtpZighaGVhZGVyKQpyZXR1cm4gdW5kZWZpbmVkO3JldHVybiBoZWFkZXIubGluZU51bWJlckluU291cmNlKHRoaXMucmFuZ2Uuc3RhcnRMaW5lKTt9LGNvbHVtbk51bWJlckluU291cmNlOmZ1bmN0aW9uKCkKe2lmKCF0aGlzLnJhbmdlKQpyZXR1cm4gdW5kZWZpbmVkO3ZhciBoZWFkZXI9dGhpcy5oZWFkZXIoKTtpZighaGVhZGVyKQpyZXR1cm4gdW5kZWZpbmVkO3JldHVybiBoZWFkZXIuY29sdW1uTnVtYmVySW5Tb3VyY2UodGhpcy5yYW5nZS5zdGFydExpbmUsdGhpcy5yYW5nZS5zdGFydENvbHVtbik7fSxoZWFkZXI6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuc3R5bGVTaGVldElkP3RoaXMuX2Nzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZCh0aGlzLnN0eWxlU2hlZXRJZCk6bnVsbDt9LHJhd0xvY2F0aW9uOmZ1bmN0aW9uKCkKe3ZhciBoZWFkZXI9dGhpcy5oZWFkZXIoKTtpZighaGVhZGVyfHx0aGlzLmxpbmVOdW1iZXJJblNvdXJjZSgpPT09dW5kZWZpbmVkKQpyZXR1cm4gbnVsbDt2YXIgbGluZU51bWJlcj1OdW1iZXIodGhpcy5saW5lTnVtYmVySW5Tb3VyY2UoKSk7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuQ1NTTG9jYXRpb24oaGVhZGVyLGxpbmVOdW1iZXIsdGhpcy5jb2x1bW5OdW1iZXJJblNvdXJjZSgpKTt9fTt9LHt9XSwxMDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5DU1NNZXRhZGF0YT1mdW5jdGlvbihwcm9wZXJ0aWVzKQp7dGhpcy5fdmFsdWVzPVtdO3RoaXMuX2xvbmdoYW5kcz1uZXcgTWFwKCk7dGhpcy5fc2hvcnRoYW5kcz1uZXcgTWFwKCk7dGhpcy5faW5oZXJpdGVkPW5ldyBTZXQoKTtmb3IodmFyIGk9MDtpPHByb3BlcnRpZXMubGVuZ3RoOysraSl7dmFyIHByb3BlcnR5PXByb3BlcnRpZXNbaV07dmFyIHByb3BlcnR5TmFtZT1wcm9wZXJ0eS5uYW1lO2lmKCFDU1Muc3VwcG9ydHMocHJvcGVydHlOYW1lLCJpbml0aWFsIikpCmNvbnRpbnVlO3RoaXMuX3ZhbHVlcy5wdXNoKHByb3BlcnR5TmFtZSk7aWYocHJvcGVydHkuaW5oZXJpdGVkKQp0aGlzLl9pbmhlcml0ZWQuYWRkKHByb3BlcnR5TmFtZSk7dmFyIGxvbmdoYW5kcz1wcm9wZXJ0aWVzW2ldLmxvbmdoYW5kcztpZihsb25naGFuZHMpe3RoaXMuX2xvbmdoYW5kcy5zZXQocHJvcGVydHlOYW1lLGxvbmdoYW5kcyk7Zm9yKHZhciBqPTA7ajxsb25naGFuZHMubGVuZ3RoOysrail7dmFyIGxvbmdoYW5kTmFtZT1sb25naGFuZHNbal07dmFyIHNob3J0aGFuZHM9dGhpcy5fc2hvcnRoYW5kcy5nZXQobG9uZ2hhbmROYW1lKTtpZighc2hvcnRoYW5kcyl7c2hvcnRoYW5kcz1bXTt0aGlzLl9zaG9ydGhhbmRzLnNldChsb25naGFuZE5hbWUsc2hvcnRoYW5kcyk7fQpzaG9ydGhhbmRzLnB1c2gocHJvcGVydHlOYW1lKTt9fX0KdGhpcy5fdmFsdWVzLnNvcnQoKTt0aGlzLl92YWx1ZXNTZXQ9bmV3IFNldCh0aGlzLl92YWx1ZXMpO307V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLlZhcmlhYmxlUmVnZXg9Lyh2YXJcKC0tLio/XCkpL2c7V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLlVSTFJlZ2V4PS91cmxcKFxzKignLis/J3wiLis/InxbXildKylccypcKS9nO1dlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5wcm90b3R5cGU9e2FsbFByb3BlcnRpZXM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3ZhbHVlczt9LGxvbmdoYW5kczpmdW5jdGlvbihzaG9ydGhhbmQpCntyZXR1cm4gdGhpcy5fbG9uZ2hhbmRzLmdldChzaG9ydGhhbmQpfHxudWxsO30sc2hvcnRoYW5kczpmdW5jdGlvbihsb25naGFuZCkKe3JldHVybiB0aGlzLl9zaG9ydGhhbmRzLmdldChsb25naGFuZCl8fG51bGw7fSxpc0NvbG9yQXdhcmVQcm9wZXJ0eTpmdW5jdGlvbihwcm9wZXJ0eU5hbWUpCntyZXR1cm4hIVdlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5fY29sb3JBd2FyZVByb3BlcnRpZXMuaGFzKHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpKXx8dGhpcy5pc0N1c3RvbVByb3BlcnR5KHByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpKTt9LGlzTGVuZ3RoUHJvcGVydHk6ZnVuY3Rpb24ocHJvcGVydHlOYW1lKQp7cHJvcGVydHlOYW1lPXByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO2lmKHByb3BlcnR5TmFtZT09PSJsaW5lLWhlaWdodCIpCnJldHVybiBmYWxzZTtyZXR1cm4gV2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLl9kaXN0YW5jZVByb3BlcnRpZXMuaGFzKHByb3BlcnR5TmFtZSl8fHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJtYXJnaW4iKXx8cHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoInBhZGRpbmciKXx8cHJvcGVydHlOYW1lLmluZGV4T2YoIndpZHRoIikhPT0tMXx8cHJvcGVydHlOYW1lLmluZGV4T2YoImhlaWdodCIpIT09LTE7fSxpc0JlemllckF3YXJlUHJvcGVydHk6ZnVuY3Rpb24ocHJvcGVydHlOYW1lKQp7cHJvcGVydHlOYW1lPXByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiEhV2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLl9iZXppZXJBd2FyZVByb3BlcnRpZXMuaGFzKHByb3BlcnR5TmFtZSl8fHRoaXMuaXNDdXN0b21Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO30saXNDdXN0b21Qcm9wZXJ0eTpmdW5jdGlvbihwcm9wZXJ0eU5hbWUpCntyZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIi0tIik7fSxjYW5vbmljYWxQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24obmFtZSkKe25hbWU9bmFtZS50b0xvd2VyQ2FzZSgpO2lmKCFuYW1lfHxuYW1lLmxlbmd0aDw5fHxuYW1lLmNoYXJBdCgwKSE9PSItIikKcmV0dXJuIG5hbWU7dmFyIG1hdGNoPW5hbWUubWF0Y2goLyg/Oi13ZWJraXQtKSguKykvKTtpZighbWF0Y2h8fCF0aGlzLl92YWx1ZXNTZXQuaGFzKG1hdGNoWzFdKSkKcmV0dXJuIG5hbWU7cmV0dXJuIG1hdGNoWzFdO30saXNDU1NQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24ocHJvcGVydHlOYW1lKQp7cHJvcGVydHlOYW1lPXByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO2lmKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCItbW96LSIpfHxwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiLW8tIil8fHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCItd2Via2l0LSIpfHxwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiLW1zLSIpKQpyZXR1cm4gdHJ1ZTtyZXR1cm4gdGhpcy5fdmFsdWVzU2V0Lmhhcyhwcm9wZXJ0eU5hbWUpO30saXNQcm9wZXJ0eUluaGVyaXRlZDpmdW5jdGlvbihwcm9wZXJ0eU5hbWUpCntwcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHRoaXMuX2luaGVyaXRlZC5oYXModGhpcy5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSl8fHRoaXMuX2luaGVyaXRlZC5oYXMocHJvcGVydHlOYW1lKTt9LHByb3BlcnR5VmFsdWVzOmZ1bmN0aW9uKHByb3BlcnR5TmFtZSkKe3ZhciBhY2NlcHRlZEtleXdvcmRzPVsiaW5oZXJpdCIsImluaXRpYWwiXTtwcm9wZXJ0eU5hbWU9cHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7dmFyIHVucHJlZml4ZWROYW1lPXByb3BlcnR5TmFtZS5yZXBsYWNlKC9eLXdlYmtpdC0vLCIiKTt2YXIgZW50cnk9V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLl9wcm9wZXJ0eURhdGFNYXBbcHJvcGVydHlOYW1lXXx8V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLl9wcm9wZXJ0eURhdGFNYXBbdW5wcmVmaXhlZE5hbWVdO2lmKGVudHJ5JiZlbnRyeS52YWx1ZXMpCmFjY2VwdGVkS2V5d29yZHMucHVzaEFsbChlbnRyeS52YWx1ZXMpO2lmKHRoaXMuaXNDb2xvckF3YXJlUHJvcGVydHkocHJvcGVydHlOYW1lKSl7YWNjZXB0ZWRLZXl3b3Jkcy5wdXNoKCJjdXJyZW50Q29sb3IiKTtmb3IodmFyIGNvbG9yIGluIFdlYkluc3BlY3Rvci5Db2xvci5OaWNrbmFtZXMpCmFjY2VwdGVkS2V5d29yZHMucHVzaChjb2xvcik7fQpyZXR1cm4gYWNjZXB0ZWRLZXl3b3Jkcy5zb3J0KCk7fSxtb3N0VXNlZFByb3BlcnR5OmZ1bmN0aW9uKHByb3BlcnRpZXMpCnt2YXIgbWF4V2VpZ2h0PTA7dmFyIGluZGV4PTA7Zm9yKHZhciBpPTA7aTxwcm9wZXJ0aWVzLmxlbmd0aDtpKyspe3ZhciB3ZWlnaHQ9V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLldlaWdodFtwcm9wZXJ0aWVzW2ldXTtpZighd2VpZ2h0KQp3ZWlnaHQ9V2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLldlaWdodFt0aGlzLmNhbm9uaWNhbFByb3BlcnR5TmFtZShwcm9wZXJ0aWVzW2ldKV07aWYod2VpZ2h0Pm1heFdlaWdodCl7bWF4V2VpZ2h0PXdlaWdodDtpbmRleD1pO319CnJldHVybiBpbmRleDt9fTtXZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGE9ZnVuY3Rpb24oKQp7aWYoIVdlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5faW5zdGFuY2UpCldlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5faW5zdGFuY2U9bmV3IFdlYkluc3BlY3Rvci5DU1NNZXRhZGF0YShXZWJJbnNwZWN0b3IuQ1NTTWV0YWRhdGEuX2dlbmVyYXRlZFByb3BlcnRpZXN8fFtdKTtyZXR1cm4gV2ViSW5zcGVjdG9yLkNTU01ldGFkYXRhLl9pbnN0YW5jZTt9O1dlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5fZGlzdGFuY2VQcm9wZXJ0aWVzPW5ldyBTZXQoWyJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwiYm9yZGVyLXNwYWNpbmciLCJib3R0b20iLCJmb250LXNpemUiLCJoZWlnaHQiLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsInJpZ2h0IiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ3aWR0aCIsIndvcmQtc3BhY2luZyJdKTtXZWJJbnNwZWN0b3IuQ1NTTWV0YWRhdGEuX2JlemllckF3YXJlUHJvcGVydGllcz1uZXcgU2V0KFsiYW5pbWF0aW9uIiwiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiIsInRyYW5zaXRpb24iLCJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiIsIi13ZWJraXQtYW5pbWF0aW9uIiwiLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIiwiLXdlYmtpdC10cmFuc2l0aW9uIiwiLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiJdKTtXZWJJbnNwZWN0b3IuQ1NTTWV0YWRhdGEuX2NvbG9yQXdhcmVQcm9wZXJ0aWVzPW5ldyBTZXQoWyJiYWNrZHJvcC1maWx0ZXIiLCJiYWNrZ3JvdW5kIiwiYmFja2dyb3VuZC1jb2xvciIsImJhY2tncm91bmQtaW1hZ2UiLCJib3JkZXIiLCJib3JkZXItY29sb3IiLCJib3JkZXItaW1hZ2UiLCJib3JkZXItaW1hZ2Utc291cmNlIiwiYm9yZGVyLWJvdHRvbSIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdCIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLXJpZ2h0IiwiYm9yZGVyLXJpZ2h0LWNvbG9yIiwiYm9yZGVyLXRvcCIsImJvcmRlci10b3AtY29sb3IiLCJib3gtc2hhZG93IiwiY29sb3IiLCJjb2x1bW4tcnVsZSIsImNvbHVtbi1ydWxlLWNvbG9yIiwiZmlsbCIsImxpc3Qtc3R5bGUiLCJsaXN0LXN0eWxlLWltYWdlIiwib3V0bGluZSIsIm91dGxpbmUtY29sb3IiLCJzdHJva2UiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiLCJ0ZXh0LXNoYWRvdyIsIi13ZWJraXQtYm9yZGVyLWFmdGVyIiwiLXdlYmtpdC1ib3JkZXItYWZ0ZXItY29sb3IiLCItd2Via2l0LWJvcmRlci1iZWZvcmUiLCItd2Via2l0LWJvcmRlci1iZWZvcmUtY29sb3IiLCItd2Via2l0LWJvcmRlci1lbmQiLCItd2Via2l0LWJvcmRlci1lbmQtY29sb3IiLCItd2Via2l0LWJvcmRlci1zdGFydCIsIi13ZWJraXQtYm9yZGVyLXN0YXJ0LWNvbG9yIiwiLXdlYmtpdC1ib3gtcmVmbGVjdCIsIi13ZWJraXQtYm94LXNoYWRvdyIsIi13ZWJraXQtY29sdW1uLXJ1bGUtY29sb3IiLCItd2Via2l0LWZpbHRlciIsIi13ZWJraXQtbWFzayIsIi13ZWJraXQtbWFzay1ib3gtaW1hZ2UiLCItd2Via2l0LW1hc2stYm94LWltYWdlLXNvdXJjZSIsIi13ZWJraXQtbWFzay1pbWFnZSIsIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsIi13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLWNvbG9yIiwiLXdlYmtpdC10ZXh0LWVtcGhhc2lzIiwiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLWNvbG9yIiwiLXdlYmtpdC10ZXh0LWZpbGwtY29sb3IiLCItd2Via2l0LXRleHQtc3Ryb2tlIiwiLXdlYmtpdC10ZXh0LXN0cm9rZS1jb2xvciJdKTtXZWJJbnNwZWN0b3IuQ1NTTWV0YWRhdGEuX3Byb3BlcnR5RGF0YU1hcD17InRhYmxlLWxheW91dCI6e3ZhbHVlczpbImF1dG8iLCJmaXhlZCJdfSwidmlzaWJpbGl0eSI6e3ZhbHVlczpbImhpZGRlbiIsInZpc2libGUiLCJjb2xsYXBzZSJdfSwiYmFja2dyb3VuZC1yZXBlYXQiOnt2YWx1ZXM6WyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Iiwic3BhY2UiLCJyb3VuZCJdfSwiY29udGVudCI6e3ZhbHVlczpbImxpc3QtaXRlbSIsImNsb3NlLXF1b3RlIiwibm8tY2xvc2UtcXVvdGUiLCJuby1vcGVuLXF1b3RlIiwib3Blbi1xdW90ZSJdfSwibGlzdC1zdHlsZS1pbWFnZSI6e3ZhbHVlczpbIm5vbmUiXX0sImNsZWFyIjp7dmFsdWVzOlsibm9uZSIsImxlZnQiLCJyaWdodCIsImJvdGgiXX0sIm92ZXJmbG93LXgiOnt2YWx1ZXM6WyJoaWRkZW4iLCJhdXRvIiwidmlzaWJsZSIsIm92ZXJsYXkiLCJzY3JvbGwiXX0sInN0cm9rZS1saW5lam9pbiI6e3ZhbHVlczpbInJvdW5kIiwibWl0ZXIiLCJiZXZlbCJdfSwiYmFzZWxpbmUtc2hpZnQiOnt2YWx1ZXM6WyJiYXNlbGluZSIsInN1YiIsInN1cGVyIl19LCJib3JkZXItYm90dG9tLXdpZHRoIjp7dmFsdWVzOlsibWVkaXVtIiwidGhpY2siLCJ0aGluIl19LCJtYXJnaW4tdG9wLWNvbGxhcHNlIjp7dmFsdWVzOlsiY29sbGFwc2UiLCJzZXBhcmF0ZSIsImRpc2NhcmQiXX0sIm1heC1oZWlnaHQiOnt2YWx1ZXM6WyJub25lIl19LCJib3gtb3JpZW50Ijp7dmFsdWVzOlsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIiwiaW5saW5lLWF4aXMiLCJibG9jay1heGlzIl19LCJmb250LXN0cmV0Y2giOnt2YWx1ZXM6WyJub3JtYWwiLCJ3aWRlciIsIm5hcnJvd2VyIiwidWx0cmEtY29uZGVuc2VkIiwiZXh0cmEtY29uZGVuc2VkIiwiY29uZGVuc2VkIiwic2VtaS1jb25kZW5zZWQiLCJzZW1pLWV4cGFuZGVkIiwiZXhwYW5kZWQiLCJleHRyYS1leHBhbmRlZCIsInVsdHJhLWV4cGFuZGVkIl19LCJib3JkZXItbGVmdC13aWR0aCI6e3ZhbHVlczpbIm1lZGl1bSIsInRoaWNrIiwidGhpbiJdfSwiYm94LXNoYWRvdyI6e3ZhbHVlczpbImluc2V0Iiwibm9uZSJdfSwid3JpdGluZy1tb2RlIjp7dmFsdWVzOlsiaG9yaXpvbnRhbC10YiIsInZlcnRpY2FsLXJsIiwidmVydGljYWwtbHIiXX0sIi13ZWJraXQtd3JpdGluZy1tb2RlIjp7dmFsdWVzOlsibHIiLCJybCIsInRiIiwibHItdGIiLCJybC10YiIsInRiLXJsIiwiaG9yaXpvbnRhbC10YiIsInZlcnRpY2FsLXJsIiwidmVydGljYWwtbHIiXX0sImJvcmRlci1jb2xsYXBzZSI6e3ZhbHVlczpbImNvbGxhcHNlIiwic2VwYXJhdGUiXX0sInBhZ2UtYnJlYWstaW5zaWRlIjp7dmFsdWVzOlsiYXV0byIsImF2b2lkIl19LCJib3JkZXItdG9wLXdpZHRoIjp7dmFsdWVzOlsibWVkaXVtIiwidGhpY2siLCJ0aGluIl19LCJvdXRsaW5lLWNvbG9yIjp7dmFsdWVzOlsiaW52ZXJ0Il19LCJvdXRsaW5lLXN0eWxlIjp7dmFsdWVzOlsibm9uZSIsImhpZGRlbiIsImluc2V0IiwiZ3Jvb3ZlIiwicmlkZ2UiLCJvdXRzZXQiLCJkb3R0ZWQiLCJkYXNoZWQiLCJzb2xpZCIsImRvdWJsZSJdfSwiY3Vyc29yIjp7dmFsdWVzOlsibm9uZSIsImNvcHkiLCJhdXRvIiwiY3Jvc3NoYWlyIiwiZGVmYXVsdCIsInBvaW50ZXIiLCJtb3ZlIiwidmVydGljYWwtdGV4dCIsImNlbGwiLCJjb250ZXh0LW1lbnUiLCJhbGlhcyIsInByb2dyZXNzIiwibm8tZHJvcCIsIm5vdC1hbGxvd2VkIiwiLXdlYmtpdC16b29tLWluIiwiLXdlYmtpdC16b29tLW91dCIsImUtcmVzaXplIiwibmUtcmVzaXplIiwibnctcmVzaXplIiwibi1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJzLXJlc2l6ZSIsInctcmVzaXplIiwiZXctcmVzaXplIiwibnMtcmVzaXplIiwibmVzdy1yZXNpemUiLCJud3NlLXJlc2l6ZSIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwidGV4dCIsIndhaXQiLCJoZWxwIiwiYWxsLXNjcm9sbCIsIi13ZWJraXQtZ3JhYiIsIi13ZWJraXQtZ3JhYmJpbmciXX0sImJvcmRlci13aWR0aCI6e3ZhbHVlczpbIm1lZGl1bSIsInRoaWNrIiwidGhpbiJdfSwiYm9yZGVyLXN0eWxlIjp7dmFsdWVzOlsibm9uZSIsImhpZGRlbiIsImluc2V0IiwiZ3Jvb3ZlIiwicmlkZ2UiLCJvdXRzZXQiLCJkb3R0ZWQiLCJkYXNoZWQiLCJzb2xpZCIsImRvdWJsZSJdfSwic2l6ZSI6e3ZhbHVlczpbImEzIiwiYTQiLCJhNSIsImI0IiwiYjUiLCJsYW5kc2NhcGUiLCJsZWRnZXIiLCJsZWdhbCIsImxldHRlciIsInBvcnRyYWl0Il19LCJiYWNrZ3JvdW5kLXNpemUiOnt2YWx1ZXM6WyJjb250YWluIiwiY292ZXIiXX0sImRpcmVjdGlvbiI6e3ZhbHVlczpbImx0ciIsInJ0bCJdfSwiZW5hYmxlLWJhY2tncm91bmQiOnt2YWx1ZXM6WyJhY2N1bXVsYXRlIiwibmV3Il19LCJmbG9hdCI6e3ZhbHVlczpbIm5vbmUiLCJsZWZ0IiwicmlnaHQiXX0sIm92ZXJmbG93LXkiOnt2YWx1ZXM6WyJoaWRkZW4iLCJhdXRvIiwidmlzaWJsZSIsIm92ZXJsYXkiLCJzY3JvbGwiXX0sIm1hcmdpbi1ib3R0b20tY29sbGFwc2UiOnt2YWx1ZXM6WyJjb2xsYXBzZSIsInNlcGFyYXRlIiwiZGlzY2FyZCJdfSwiYm94LXJlZmxlY3QiOnt2YWx1ZXM6WyJsZWZ0IiwicmlnaHQiLCJhYm92ZSIsImJlbG93Il19LCJvdmVyZmxvdyI6e3ZhbHVlczpbImhpZGRlbiIsImF1dG8iLCJ2aXNpYmxlIiwib3ZlcmxheSIsInNjcm9sbCJdfSwiY29udGFpbiI6e3ZhbHVlczpbIm5vbmUiLCJzdHJpY3QiLCJjb250ZW50Iiwic2l6ZSIsImxheW91dCIsInN0eWxlIiwicGFpbnQiXX0sInRleHQtcmVuZGVyaW5nIjp7dmFsdWVzOlsiYXV0byIsIm9wdGltaXplU3BlZWQiLCJvcHRpbWl6ZUxlZ2liaWxpdHkiLCJnZW9tZXRyaWNQcmVjaXNpb24iXX0sInRleHQtYWxpZ24iOnt2YWx1ZXM6WyItd2Via2l0LWF1dG8iLCJzdGFydCIsImVuZCIsImxlZnQiLCJyaWdodCIsImNlbnRlciIsImp1c3RpZnkiLCItd2Via2l0LWxlZnQiLCItd2Via2l0LXJpZ2h0IiwiLXdlYmtpdC1jZW50ZXIiXX0sImxpc3Qtc3R5bGUtcG9zaXRpb24iOnt2YWx1ZXM6WyJvdXRzaWRlIiwiaW5zaWRlIiwiaGFuZ2luZyJdfSwibWFyZ2luLWJvdHRvbSI6e3ZhbHVlczpbImF1dG8iXX0sImNvbG9yLWludGVycG9sYXRpb24iOnt2YWx1ZXM6WyJsaW5lYXJyZ2IiXX0sImJhY2tncm91bmQtb3JpZ2luIjp7dmFsdWVzOlsiYm9yZGVyLWJveCIsImNvbnRlbnQtYm94IiwicGFkZGluZy1ib3giXX0sIndvcmQtd3JhcCI6e3ZhbHVlczpbIm5vcm1hbCIsImJyZWFrLXdvcmQiXX0sImZvbnQtd2VpZ2h0Ijp7dmFsdWVzOlsibm9ybWFsIiwiYm9sZCIsImJvbGRlciIsImxpZ2h0ZXIiLCIxMDAiLCIyMDAiLCIzMDAiLCI0MDAiLCI1MDAiLCI2MDAiLCI3MDAiLCI4MDAiLCI5MDAiXX0sIm1hcmdpbi1iZWZvcmUtY29sbGFwc2UiOnt2YWx1ZXM6WyJjb2xsYXBzZSIsInNlcGFyYXRlIiwiZGlzY2FyZCJdfSwidGV4dC10cmFuc2Zvcm0iOnt2YWx1ZXM6WyJub25lIiwiY2FwaXRhbGl6ZSIsInVwcGVyY2FzZSIsImxvd2VyY2FzZSJdfSwiYm9yZGVyLXJpZ2h0LXN0eWxlIjp7dmFsdWVzOlsibm9uZSIsImhpZGRlbiIsImluc2V0IiwiZ3Jvb3ZlIiwicmlkZ2UiLCJvdXRzZXQiLCJkb3R0ZWQiLCJkYXNoZWQiLCJzb2xpZCIsImRvdWJsZSJdfSwiYm9yZGVyLWxlZnQtc3R5bGUiOnt2YWx1ZXM6WyJub25lIiwiaGlkZGVuIiwiaW5zZXQiLCJncm9vdmUiLCJyaWRnZSIsIm91dHNldCIsImRvdHRlZCIsImRhc2hlZCIsInNvbGlkIiwiZG91YmxlIl19LCItd2Via2l0LXRleHQtZW1waGFzaXMiOnt2YWx1ZXM6WyJjaXJjbGUiLCJmaWxsZWQiLCJvcGVuIiwiZG90IiwiZG91YmxlLWNpcmNsZSIsInRyaWFuZ2xlIiwic2VzYW1lIl19LCJmb250LXN0eWxlIjp7dmFsdWVzOlsiaXRhbGljIiwib2JsaXF1ZSIsIm5vcm1hbCJdfSwic3BlYWsiOnt2YWx1ZXM6WyJub25lIiwibm9ybWFsIiwic3BlbGwtb3V0IiwiZGlnaXRzIiwibGl0ZXJhbC1wdW5jdHVhdGlvbiIsIm5vLXB1bmN0dWF0aW9uIl19LCJjb2xvci1yZW5kZXJpbmciOnt2YWx1ZXM6WyJhdXRvIiwib3B0aW1pemVTcGVlZCIsIm9wdGltaXplUXVhbGl0eSJdfSwibGlzdC1zdHlsZS10eXBlIjp7dmFsdWVzOlsibm9uZSIsImlubGluZSIsImRpc2MiLCJjaXJjbGUiLCJzcXVhcmUiLCJkZWNpbWFsIiwiZGVjaW1hbC1sZWFkaW5nLXplcm8iLCJhcmFiaWMtaW5kaWMiLCJiaW5hcnkiLCJiZW5nYWxpIiwiY2FtYm9kaWFuIiwia2htZXIiLCJkZXZhbmFnYXJpIiwiZ3VqYXJhdGkiLCJndXJtdWtoaSIsImthbm5hZGEiLCJsb3dlci1oZXhhZGVjaW1hbCIsImxhbyIsIm1hbGF5YWxhbSIsIm1vbmdvbGlhbiIsIm15YW5tYXIiLCJvY3RhbCIsIm9yaXlhIiwicGVyc2lhbiIsInVyZHUiLCJ0ZWx1Z3UiLCJ0aWJldGFuIiwidGhhaSIsInVwcGVyLWhleGFkZWNpbWFsIiwibG93ZXItcm9tYW4iLCJ1cHBlci1yb21hbiIsImxvd2VyLWdyZWVrIiwibG93ZXItYWxwaGEiLCJsb3dlci1sYXRpbiIsInVwcGVyLWFscGhhIiwidXBwZXItbGF0aW4iLCJhZmFyIiwiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXQiLCJldGhpb3BpYy1oYWxlaGFtZS1hYS1lciIsImFtaGFyaWMiLCJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldCIsImFtaGFyaWMtYWJlZ2VkZSIsImV0aGlvcGljLWFiZWdlZGUtYW0tZXQiLCJjamstZWFydGhseS1icmFuY2giLCJjamstaGVhdmVubHktc3RlbSIsImV0aGlvcGljIiwiZXRoaW9waWMtaGFsZWhhbWUtZ2V6IiwiZXRoaW9waWMtYWJlZ2VkZSIsImV0aGlvcGljLWFiZWdlZGUtZ2V6IiwiaGFuZ3VsLWNvbnNvbmFudCIsImhhbmd1bCIsImxvd2VyLW5vcndlZ2lhbiIsIm9yb21vIiwiZXRoaW9waWMtaGFsZWhhbWUtb20tZXQiLCJzaWRhbWEiLCJldGhpb3BpYy1oYWxlaGFtZS1zaWQtZXQiLCJzb21hbGkiLCJldGhpb3BpYy1oYWxlaGFtZS1zby1ldCIsInRpZ3JlIiwiZXRoaW9waWMtaGFsZWhhbWUtdGlnIiwidGlncmlueWEtZXIiLCJldGhpb3BpYy1oYWxlaGFtZS10aS1lciIsInRpZ3JpbnlhLWVyLWFiZWdlZGUiLCJldGhpb3BpYy1hYmVnZWRlLXRpLWVyIiwidGlncmlueWEtZXQiLCJldGhpb3BpYy1oYWxlaGFtZS10aS1ldCIsInRpZ3JpbnlhLWV0LWFiZWdlZGUiLCJldGhpb3BpYy1hYmVnZWRlLXRpLWV0IiwidXBwZXItZ3JlZWsiLCJ1cHBlci1ub3J3ZWdpYW4iLCJhc3Rlcmlza3MiLCJmb290bm90ZXMiLCJoZWJyZXciLCJhcm1lbmlhbiIsImxvd2VyLWFybWVuaWFuIiwidXBwZXItYXJtZW5pYW4iLCJnZW9yZ2lhbiIsImNqay1pZGVvZ3JhcGhpYyIsImhpcmFnYW5hIiwia2F0YWthbmEiLCJoaXJhZ2FuYS1pcm9oYSIsImthdGFrYW5hLWlyb2hhIl19LCJ0ZXh0LWNvbWJpbmUtdXByaWdodCI6e3ZhbHVlczpbIm5vbmUiLCJhbGwiXX0sIi13ZWJraXQtdGV4dC1jb21iaW5lIjp7dmFsdWVzOlsibm9uZSIsImhvcml6b250YWwiXX0sInRleHQtb3JpZW50YXRpb24iOnt2YWx1ZXM6WyJtaXhlZCIsInVwcmlnaHQiLCJzaWRld2F5cyJdfSwib3V0bGluZSI6e3ZhbHVlczpbIm5vbmUiLCJoaWRkZW4iLCJpbnNldCIsImdyb292ZSIsInJpZGdlIiwib3V0c2V0IiwiZG90dGVkIiwiZGFzaGVkIiwic29saWQiLCJkb3VibGUiXX0sImZvbnQiOnt2YWx1ZXM6WyJjYXB0aW9uIiwiaWNvbiIsIm1lbnUiLCJtZXNzYWdlLWJveCIsInNtYWxsLWNhcHRpb24iLCItd2Via2l0LW1pbmktY29udHJvbCIsIi13ZWJraXQtc21hbGwtY29udHJvbCIsIi13ZWJraXQtY29udHJvbCIsInN0YXR1cy1iYXIiLCJpdGFsaWMiLCJvYmxpcXVlIiwic21hbGwtY2FwcyIsIm5vcm1hbCIsImJvbGQiLCJib2xkZXIiLCJsaWdodGVyIiwiMTAwIiwiMjAwIiwiMzAwIiwiNDAwIiwiNTAwIiwiNjAwIiwiNzAwIiwiODAwIiwiOTAwIiwieHgtc21hbGwiLCJ4LXNtYWxsIiwic21hbGwiLCJtZWRpdW0iLCJsYXJnZSIsIngtbGFyZ2UiLCJ4eC1sYXJnZSIsIi13ZWJraXQteHh4LWxhcmdlIiwic21hbGxlciIsImxhcmdlciIsInNlcmlmIiwic2Fucy1zZXJpZiIsImN1cnNpdmUiLCJmYW50YXN5IiwibW9ub3NwYWNlIiwiLXdlYmtpdC1ib2R5IiwiLXdlYmtpdC1waWN0b2dyYXBoIl19LCJkb21pbmFudC1iYXNlbGluZSI6e3ZhbHVlczpbIm1pZGRsZSIsImF1dG8iLCJjZW50cmFsIiwidGV4dC1iZWZvcmUtZWRnZSIsInRleHQtYWZ0ZXItZWRnZSIsImlkZW9ncmFwaGljIiwiYWxwaGFiZXRpYyIsImhhbmdpbmciLCJtYXRoZW1hdGljYWwiLCJ1c2Utc2NyaXB0Iiwibm8tY2hhbmdlIiwicmVzZXQtc2l6ZSJdfSwiZGlzcGxheSI6e3ZhbHVlczpbIm5vbmUiLCJpbmxpbmUiLCJibG9jayIsImxpc3QtaXRlbSIsInJ1bi1pbiIsImlubGluZS1ibG9jayIsInRhYmxlIiwiaW5saW5lLXRhYmxlIiwidGFibGUtcm93LWdyb3VwIiwidGFibGUtaGVhZGVyLWdyb3VwIiwidGFibGUtZm9vdGVyLWdyb3VwIiwidGFibGUtcm93IiwidGFibGUtY29sdW1uLWdyb3VwIiwidGFibGUtY29sdW1uIiwidGFibGUtY2VsbCIsInRhYmxlLWNhcHRpb24iLCItd2Via2l0LWJveCIsIi13ZWJraXQtaW5saW5lLWJveCIsImZsZXgiLCJpbmxpbmUtZmxleCIsImdyaWQiLCJpbmxpbmUtZ3JpZCJdfSwiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLXBvc2l0aW9uIjp7dmFsdWVzOlsib3ZlciIsInVuZGVyIl19LCJpbWFnZS1yZW5kZXJpbmciOnt2YWx1ZXM6WyJhdXRvIiwib3B0aW1pemVTcGVlZCIsIm9wdGltaXplUXVhbGl0eSIsInBpeGVsYXRlZCJdfSwiYWxpZ25tZW50LWJhc2VsaW5lIjp7dmFsdWVzOlsiYmFzZWxpbmUiLCJtaWRkbGUiLCJhdXRvIiwiYmVmb3JlLWVkZ2UiLCJhZnRlci1lZGdlIiwiY2VudHJhbCIsInRleHQtYmVmb3JlLWVkZ2UiLCJ0ZXh0LWFmdGVyLWVkZ2UiLCJpZGVvZ3JhcGhpYyIsImFscGhhYmV0aWMiLCJoYW5naW5nIiwibWF0aGVtYXRpY2FsIl19LCJvdXRsaW5lLXdpZHRoIjp7dmFsdWVzOlsibWVkaXVtIiwidGhpY2siLCJ0aGluIl19LCJib3gtYWxpZ24iOnt2YWx1ZXM6WyJiYXNlbGluZSIsImNlbnRlciIsInN0cmV0Y2giLCJzdGFydCIsImVuZCJdfSwiYm9yZGVyLXJpZ2h0LXdpZHRoIjp7dmFsdWVzOlsibWVkaXVtIiwidGhpY2siLCJ0aGluIl19LCJib3JkZXItdG9wLXN0eWxlIjp7dmFsdWVzOlsibm9uZSIsImhpZGRlbiIsImluc2V0IiwiZ3Jvb3ZlIiwicmlkZ2UiLCJvdXRzZXQiLCJkb3R0ZWQiLCJkYXNoZWQiLCJzb2xpZCIsImRvdWJsZSJdfSwibGluZS1oZWlnaHQiOnt2YWx1ZXM6WyJub3JtYWwiXX0sInRleHQtb3ZlcmZsb3ciOnt2YWx1ZXM6WyJjbGlwIiwiZWxsaXBzaXMiXX0sIm92ZXJmbG93LXdyYXAiOnt2YWx1ZXM6WyJub3JtYWwiLCJicmVhay13b3JkIl19LCJib3gtZGlyZWN0aW9uIjp7dmFsdWVzOlsibm9ybWFsIiwicmV2ZXJzZSJdfSwibWFyZ2luLWFmdGVyLWNvbGxhcHNlIjp7dmFsdWVzOlsiY29sbGFwc2UiLCJzZXBhcmF0ZSIsImRpc2NhcmQiXX0sInBhZ2UtYnJlYWstYmVmb3JlIjp7dmFsdWVzOlsibGVmdCIsInJpZ2h0IiwiYXV0byIsImFsd2F5cyIsImF2b2lkIl19LCJib3JkZXItaW1hZ2UiOnt2YWx1ZXM6WyJyZXBlYXQiLCJzdHJldGNoIl19LCJ0ZXh0LWRlY29yYXRpb24iOnt2YWx1ZXM6WyJub25lIiwiYmxpbmsiLCJsaW5lLXRocm91Z2giLCJvdmVybGluZSIsInVuZGVybGluZSJdfSwicG9zaXRpb24iOnt2YWx1ZXM6WyJhYnNvbHV0ZSIsImZpeGVkIiwicmVsYXRpdmUiLCJzdGF0aWMiXX0sImZvbnQtZmFtaWx5Ijp7dmFsdWVzOlsic2VyaWYiLCJzYW5zLXNlcmlmIiwiY3Vyc2l2ZSIsImZhbnRhc3kiLCJtb25vc3BhY2UiLCItd2Via2l0LWJvZHkiLCItd2Via2l0LXBpY3RvZ3JhcGgiXX0sInRleHQtb3ZlcmZsb3ctbW9kZSI6e3ZhbHVlczpbImNsaXAiLCJlbGxpcHNpcyJdfSwiYm9yZGVyLWJvdHRvbS1zdHlsZSI6e3ZhbHVlczpbIm5vbmUiLCJoaWRkZW4iLCJpbnNldCIsImdyb292ZSIsInJpZGdlIiwib3V0c2V0IiwiZG90dGVkIiwiZGFzaGVkIiwic29saWQiLCJkb3VibGUiXX0sInVuaWNvZGUtYmlkaSI6e3ZhbHVlczpbIm5vcm1hbCIsImJpZGktb3ZlcnJpZGUiLCJlbWJlZCIsImlzb2xhdGUiLCJpc29sYXRlLW92ZXJyaWRlIiwicGxhaW50ZXh0Il19LCJjbGlwLXJ1bGUiOnt2YWx1ZXM6WyJub256ZXJvIiwiZXZlbm9kZCJdfSwibWFyZ2luLWxlZnQiOnt2YWx1ZXM6WyJhdXRvIl19LCJtYXJnaW4tdG9wIjp7dmFsdWVzOlsiYXV0byJdfSwiem9vbSI6e3ZhbHVlczpbIm5vcm1hbCIsImRvY3VtZW50IiwicmVzZXQiXX0sIm1heC13aWR0aCI6e3ZhbHVlczpbIm5vbmUiXX0sImNhcHRpb24tc2lkZSI6e3ZhbHVlczpbInRvcCIsImJvdHRvbSJdfSwiZW1wdHktY2VsbHMiOnt2YWx1ZXM6WyJoaWRlIiwic2hvdyJdfSwicG9pbnRlci1ldmVudHMiOnt2YWx1ZXM6WyJub25lIiwiYWxsIiwiYXV0byIsInZpc2libGUiLCJ2aXNpYmxlcGFpbnRlZCIsInZpc2libGVmaWxsIiwidmlzaWJsZXN0cm9rZSIsInBhaW50ZWQiLCJmaWxsIiwic3Ryb2tlIiwiYm91bmRpbmctYm94Il19LCJsZXR0ZXItc3BhY2luZyI6e3ZhbHVlczpbIm5vcm1hbCJdfSwiYmFja2dyb3VuZC1jbGlwIjp7dmFsdWVzOlsiYm9yZGVyLWJveCIsImNvbnRlbnQtYm94IiwicGFkZGluZy1ib3giXX0sIi13ZWJraXQtZm9udC1zbW9vdGhpbmciOnt2YWx1ZXM6WyJub25lIiwiYXV0byIsImFudGlhbGlhc2VkIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiXX0sImJvcmRlciI6e3ZhbHVlczpbIm5vbmUiLCJoaWRkZW4iLCJpbnNldCIsImdyb292ZSIsInJpZGdlIiwib3V0c2V0IiwiZG90dGVkIiwiZGFzaGVkIiwic29saWQiLCJkb3VibGUiXX0sImZvbnQtc2l6ZSI6e3ZhbHVlczpbInh4LXNtYWxsIiwieC1zbWFsbCIsInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4LWxhcmdlIiwieHgtbGFyZ2UiLCItd2Via2l0LXh4eC1sYXJnZSIsInNtYWxsZXIiLCJsYXJnZXIiXX0sImZvbnQtdmFyaWFudCI6e3ZhbHVlczpbInNtYWxsLWNhcHMiLCJub3JtYWwiXX0sInZlcnRpY2FsLWFsaWduIjp7dmFsdWVzOlsiYmFzZWxpbmUiLCJtaWRkbGUiLCJzdWIiLCJzdXBlciIsInRleHQtdG9wIiwidGV4dC1ib3R0b20iLCJ0b3AiLCJib3R0b20iLCItd2Via2l0LWJhc2VsaW5lLW1pZGRsZSJdfSwid2hpdGUtc3BhY2UiOnt2YWx1ZXM6WyJub3JtYWwiLCJub3dyYXAiLCJwcmUiLCJwcmUtbGluZSIsInByZS13cmFwIl19LCJib3gtbGluZXMiOnt2YWx1ZXM6WyJzaW5nbGUiLCJtdWx0aXBsZSJdfSwicGFnZS1icmVhay1hZnRlciI6e3ZhbHVlczpbImxlZnQiLCJyaWdodCIsImF1dG8iLCJhbHdheXMiLCJhdm9pZCJdfSwiY2xpcC1wYXRoIjp7dmFsdWVzOlsibm9uZSJdfSwibWFyZ2luIjp7dmFsdWVzOlsiYXV0byJdfSwibWFyZ2luLXJpZ2h0Ijp7dmFsdWVzOlsiYXV0byJdfSwid29yZC1icmVhayI6e3ZhbHVlczpbIm5vcm1hbCIsImJyZWFrLWFsbCIsImJyZWFrLXdvcmQiXX0sIndvcmQtc3BhY2luZyI6e3ZhbHVlczpbIm5vcm1hbCJdfSwiLXdlYmtpdC10ZXh0LWVtcGhhc2lzLXN0eWxlIjp7dmFsdWVzOlsiY2lyY2xlIiwiZmlsbGVkIiwib3BlbiIsImRvdCIsImRvdWJsZS1jaXJjbGUiLCJ0cmlhbmdsZSIsInNlc2FtZSJdfSwidHJhbnNmb3JtIjp7dmFsdWVzOlsic2NhbGUiLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZTNkIiwicm90YXRlIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwicm90YXRlM2QiLCJza2V3Iiwic2tld1giLCJza2V3WSIsInRyYW5zbGF0ZSIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiIsInRyYW5zbGF0ZTNkIiwibWF0cml4IiwibWF0cml4M2QiLCJwZXJzcGVjdGl2ZSJdfSwiaW1hZ2UtcmVzb2x1dGlvbiI6e3ZhbHVlczpbImZyb20taW1hZ2UiLCJzbmFwIl19LCJib3gtc2l6aW5nIjp7dmFsdWVzOlsiY29udGVudC1ib3giLCJib3JkZXItYm94Il19LCJjbGlwIjp7dmFsdWVzOlsiYXV0byJdfSwicmVzaXplIjp7dmFsdWVzOlsibm9uZSIsImJvdGgiLCJob3Jpem9udGFsIiwidmVydGljYWwiXX0sImFsaWduLWNvbnRlbnQiOnt2YWx1ZXM6WyJmbGV4LXN0YXJ0IiwiZmxleC1lbmQiLCJjZW50ZXIiLCJzcGFjZS1iZXR3ZWVuIiwic3BhY2UtYXJvdW5kIiwic3RyZXRjaCJdfSwiYWxpZ24taXRlbXMiOnt2YWx1ZXM6WyJmbGV4LXN0YXJ0IiwiZmxleC1lbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX0sImFsaWduLXNlbGYiOnt2YWx1ZXM6WyJhdXRvIiwiZmxleC1zdGFydCIsImZsZXgtZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19LCJmbGV4LWRpcmVjdGlvbiI6e3ZhbHVlczpbInJvdyIsInJvdy1yZXZlcnNlIiwiY29sdW1uIiwiY29sdW1uLXJldmVyc2UiXX0sImp1c3RpZnktY29udGVudCI6e3ZhbHVlczpbImZsZXgtc3RhcnQiLCJmbGV4LWVuZCIsImNlbnRlciIsInNwYWNlLWJldHdlZW4iLCJzcGFjZS1hcm91bmQiXX0sImZsZXgtd3JhcCI6e3ZhbHVlczpbIm5vd3JhcCIsIndyYXAiLCJ3cmFwLXJldmVyc2UiXX0sInBlcnNwZWN0aXZlIjp7dmFsdWVzOlsibm9uZSJdfSwicGVyc3BlY3RpdmUtb3JpZ2luIjp7dmFsdWVzOlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl19LCJ0cmFuc2Zvcm0tb3JpZ2luIjp7dmFsdWVzOlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl19LCJ0cmFuc2Zvcm0tc3R5bGUiOnt2YWx1ZXM6WyJmbGF0IiwicHJlc2VydmUtM2QiXX0sInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIjp7dmFsdWVzOlsiZWFzZSIsImxpbmVhciIsImVhc2UtaW4iLCJlYXNlLW91dCIsImVhc2UtaW4tb3V0Iiwic3RlcC1zdGFydCIsInN0ZXAtZW5kIiwic3RlcHMiLCJjdWJpYy1iZXppZXIiXX0sImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24iOnt2YWx1ZXM6WyJlYXNlIiwibGluZWFyIiwiZWFzZS1pbiIsImVhc2Utb3V0IiwiZWFzZS1pbi1vdXQiLCJzdGVwLXN0YXJ0Iiwic3RlcC1lbmQiLCJzdGVwcyIsImN1YmljLWJlemllciJdfSwiYW5pbWF0aW9uLWRpcmVjdGlvbiI6e3ZhbHVlczpbIm5vcm1hbCIsInJldmVyc2UiLCJhbHRlcm5hdGUiLCJhbHRlcm5hdGUtcmV2ZXJzZSJdfSwiYW5pbWF0aW9uLXBsYXktc3RhdGUiOnt2YWx1ZXM6WyJydW5uaW5nIiwicGF1c2VkIl19LCJhbmltYXRpb24tZmlsbC1tb2RlIjp7dmFsdWVzOlsibm9uZSIsImZvcndhcmRzIiwiYmFja3dhcmRzIiwiYm90aCJdfSwiLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5Ijp7dmFsdWVzOlsidmlzaWJsZSIsImhpZGRlbiJdfSwiLXdlYmtpdC1ib3gtZGVjb3JhdGlvbi1icmVhayI6e3ZhbHVlczpbInNsaWNlIiwiY2xvbmUiXX0sIi13ZWJraXQtY29sdW1uLWJyZWFrLWFmdGVyIjp7dmFsdWVzOlsiYXV0byIsImFsd2F5cyIsImF2b2lkIiwibGVmdCIsInJpZ2h0IiwicGFnZSIsImNvbHVtbiIsImF2b2lkLXBhZ2UiLCJhdm9pZC1jb2x1bW4iXX0sIi13ZWJraXQtY29sdW1uLWJyZWFrLWJlZm9yZSI6e3ZhbHVlczpbImF1dG8iLCJhbHdheXMiLCJhdm9pZCIsImxlZnQiLCJyaWdodCIsInBhZ2UiLCJjb2x1bW4iLCJhdm9pZC1wYWdlIiwiYXZvaWQtY29sdW1uIl19LCItd2Via2l0LWNvbHVtbi1icmVhay1pbnNpZGUiOnt2YWx1ZXM6WyJhdXRvIiwiYXZvaWQiLCJhdm9pZC1wYWdlIiwiYXZvaWQtY29sdW1uIl19LCItd2Via2l0LWNvbHVtbi1zcGFuIjp7dmFsdWVzOlsibm9uZSIsImFsbCJdfSwiLXdlYmtpdC1jb2x1bW4tY291bnQiOnt2YWx1ZXM6WyJhdXRvIl19LCItd2Via2l0LWNvbHVtbi1nYXAiOnt2YWx1ZXM6WyJub3JtYWwiXX0sIi13ZWJraXQtZmlsdGVyIjp7dmFsdWVzOlsidXJsIiwiYmx1ciIsImJyaWdodG5lc3MiLCJjb250cmFzdCIsImRyb3Atc2hhZG93IiwiZ3JheXNjYWxlIiwiaHVlLXJvdGF0ZSIsImludmVydCIsIm9wYWNpdHkiLCJzYXR1cmF0ZSIsInNlcGlhIl19LCItd2Via2l0LWxpbmUtYnJlYWsiOnt2YWx1ZXM6WyJhdXRvIiwibG9vc2UiLCJub3JtYWwiLCJzdHJpY3QiXX0sIi13ZWJraXQtdXNlci1zZWxlY3QiOnt2YWx1ZXM6WyJub25lIiwidGV4dCIsImFsbCJdfSwiLXdlYmtpdC11c2VyLW1vZGlmeSI6e3ZhbHVlczpbInJlYWQtb25seSIsInJlYWQtd3JpdGUiLCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5Il19LCJ0ZXh0LWFsaWduLWxhc3QiOnt2YWx1ZXM6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJsZWZ0IiwicmlnaHQiLCJjZW50ZXIiLCJqdXN0aWZ5Il19LCItd2Via2l0LXRleHQtZGVjb3JhdGlvbi1saW5lIjp7dmFsdWVzOlsibm9uZSIsInVuZGVybGluZSIsIm92ZXJsaW5lIiwibGluZS10aHJvdWdoIiwiYmxpbmsiXX0sIi13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXN0eWxlIjp7dmFsdWVzOlsic29saWQiLCJkb3VibGUiLCJkb3R0ZWQiLCJkYXNoZWQiLCJ3YXZ5Il19LCItd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwIjp7dmFsdWVzOlsibm9uZSIsIm9iamVjdHMiLCJzcGFjZXMiLCJpbmsiLCJlZGdlcyIsImJveC1kZWNvcmF0aW9uIl19LCJtaXgtYmxlbmQtbW9kZSI6e3ZhbHVlczpbIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwidW5zZXQiXX0sImJhY2tncm91bmQtYmxlbmQtbW9kZSI6e3ZhbHVlczpbIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwidW5zZXQiXX19O1dlYkluc3BlY3Rvci5DU1NNZXRhZGF0YS5XZWlnaHQ9eyJhbGlnbi1jb250ZW50Ijo1NywiYWxpZ24taXRlbXMiOjEyOSwiYWxpZ24tc2VsZiI6NTUsImFuaW1hdGlvbiI6MTc1LCJhbmltYXRpb24tZGVsYXkiOjExNCwiYW5pbWF0aW9uLWRpcmVjdGlvbiI6MTEzLCJhbmltYXRpb24tZHVyYXRpb24iOjEzNywiYW5pbWF0aW9uLWZpbGwtbW9kZSI6MTMyLCJhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IjoxMjQsImFuaW1hdGlvbi1uYW1lIjoxMzksImFuaW1hdGlvbi1wbGF5LXN0YXRlIjoxMDQsImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24iOjE0MSwiYmFja2ZhY2UtdmlzaWJpbGl0eSI6MTIzLCJiYWNrZ3JvdW5kIjoyNjAsImJhY2tncm91bmQtYXR0YWNobWVudCI6MTE5LCJiYWNrZ3JvdW5kLWNsaXAiOjE2NSwiYmFja2dyb3VuZC1jb2xvciI6MjU5LCJiYWNrZ3JvdW5kLWltYWdlIjoyNDYsImJhY2tncm91bmQtb3JpZ2luIjoxMDcsImJhY2tncm91bmQtcG9zaXRpb24iOjIzNywiYmFja2dyb3VuZC1wb3NpdGlvbi14IjoxMDgsImJhY2tncm91bmQtcG9zaXRpb24teSI6OTMsImJhY2tncm91bmQtcmVwZWF0IjoyMzQsImJhY2tncm91bmQtc2l6ZSI6MjAzLCJib3JkZXIiOjI2MywiYm9yZGVyLWJvdHRvbSI6MjMzLCJib3JkZXItYm90dG9tLWNvbG9yIjoxOTAsImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiOjE4NiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiOjE4NSwiYm9yZGVyLWJvdHRvbS1zdHlsZSI6MTUwLCJib3JkZXItYm90dG9tLXdpZHRoIjoxNzksImJvcmRlci1jb2xsYXBzZSI6MjA5LCJib3JkZXItY29sb3IiOjIyNiwiYm9yZGVyLWltYWdlIjo4OSwiYm9yZGVyLWltYWdlLW91dHNldCI6NTAsImJvcmRlci1pbWFnZS1yZXBlYXQiOjQ5LCJib3JkZXItaW1hZ2Utc2xpY2UiOjU4LCJib3JkZXItaW1hZ2Utc291cmNlIjozMiwiYm9yZGVyLWltYWdlLXdpZHRoIjo1MiwiYm9yZGVyLWxlZnQiOjIyMSwiYm9yZGVyLWxlZnQtY29sb3IiOjE3NCwiYm9yZGVyLWxlZnQtc3R5bGUiOjE0MiwiYm9yZGVyLWxlZnQtd2lkdGgiOjE3MiwiYm9yZGVyLXJhZGl1cyI6MjI0LCJib3JkZXItcmlnaHQiOjIyMywiYm9yZGVyLXJpZ2h0LWNvbG9yIjoxODIsImJvcmRlci1yaWdodC1zdHlsZSI6MTMwLCJib3JkZXItcmlnaHQtd2lkdGgiOjE3OCwiYm9yZGVyLXNwYWNpbmciOjE5OCwiYm9yZGVyLXN0eWxlIjoyMDYsImJvcmRlci10b3AiOjIzMSwiYm9yZGVyLXRvcC1jb2xvciI6MTkyLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIjoxODcsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIjoxODksImJvcmRlci10b3Atc3R5bGUiOjE1MiwiYm9yZGVyLXRvcC13aWR0aCI6MTgwLCJib3JkZXItd2lkdGgiOjIxNCwiYm90dG9tIjoyMjcsImJveC1zaGFkb3ciOjIxMywiYm94LXNpemluZyI6MjE2LCJjYXB0aW9uLXNpZGUiOjk2LCJjbGVhciI6MjI5LCJjbGlwIjoxNzMsImNsaXAtcnVsZSI6NSwiY29sb3IiOjI1NiwiY29udGVudCI6MjE5LCJjb3VudGVyLWluY3JlbWVudCI6MTExLCJjb3VudGVyLXJlc2V0IjoxMTAsImN1cnNvciI6MjUwLCJkaXJlY3Rpb24iOjE3NiwiZGlzcGxheSI6MjYyLCJlbXB0eS1jZWxscyI6OTksImZpbGwiOjE0MCwiZmlsbC1vcGFjaXR5Ijo4MiwiZmlsbC1ydWxlIjoyMiwiZmlsdGVyIjoxNjAsImZsZXgiOjEzMywiZmxleC1iYXNpcyI6NjYsImZsZXgtZGlyZWN0aW9uIjo4NSwiZmxleC1mbG93Ijo5NCwiZmxleC1ncm93IjoxMTIsImZsZXgtc2hyaW5rIjo2MSwiZmxleC13cmFwIjo2OCwiZmxvYXQiOjI1MiwiZm9udCI6MjExLCJmb250LWZhbWlseSI6MjU0LCJmb250LWtlcm5pbmciOjE4LCJmb250LXNpemUiOjI2NCwiZm9udC1zdHJldGNoIjo3NywiZm9udC1zdHlsZSI6MjIwLCJmb250LXZhcmlhbnQiOjE2MSwiZm9udC13ZWlnaHQiOjI1NywiaGVpZ2h0IjoyNjYsImltYWdlLXJlbmRlcmluZyI6OTAsImp1c3RpZnktY29udGVudCI6MTI3LCJsZWZ0IjoyNDgsImxldHRlci1zcGFjaW5nIjoxODgsImxpbmUtaGVpZ2h0IjoyNDQsImxpc3Qtc3R5bGUiOjIxNSwibGlzdC1zdHlsZS1pbWFnZSI6MTQ1LCJsaXN0LXN0eWxlLXBvc2l0aW9uIjoxNDksImxpc3Qtc3R5bGUtdHlwZSI6MTk5LCJtYXJnaW4iOjI2NywibWFyZ2luLWJvdHRvbSI6MjQxLCJtYXJnaW4tbGVmdCI6MjQzLCJtYXJnaW4tcmlnaHQiOjIzOCwibWFyZ2luLXRvcCI6MjUzLCJtYXNrIjoyMCwibWF4LWhlaWdodCI6MjA1LCJtYXgtd2lkdGgiOjIyNSwibWluLWhlaWdodCI6MjE3LCJtaW4td2lkdGgiOjIxOCwib2JqZWN0LWZpdCI6MzMsIm9wYWNpdHkiOjI1MSwib3JkZXIiOjExNywib3JwaGFucyI6MTQ2LCJvdXRsaW5lIjoyMjIsIm91dGxpbmUtY29sb3IiOjE1Mywib3V0bGluZS1vZmZzZXQiOjE0Nywib3V0bGluZS1zdHlsZSI6MTUxLCJvdXRsaW5lLXdpZHRoIjoxNDgsIm92ZXJmbG93IjoyNTUsIm92ZXJmbG93LXdyYXAiOjEwNSwib3ZlcmZsb3cteCI6MTg0LCJvdmVyZmxvdy15IjoxOTYsInBhZGRpbmciOjI2NSwicGFkZGluZy1ib3R0b20iOjIzMCwicGFkZGluZy1sZWZ0IjoyMzUsInBhZGRpbmctcmlnaHQiOjIzMiwicGFkZGluZy10b3AiOjI0MCwicGFnZSI6OCwicGFnZS1icmVhay1hZnRlciI6MTIwLCJwYWdlLWJyZWFrLWJlZm9yZSI6NjksInBhZ2UtYnJlYWstaW5zaWRlIjoxMjEsInBlcnNwZWN0aXZlIjo5MiwicGVyc3BlY3RpdmUtb3JpZ2luIjoxMDMsInBvaW50ZXItZXZlbnRzIjoxODMsInBvc2l0aW9uIjoyNjEsInF1b3RlcyI6MTU4LCJyZXNpemUiOjE2OCwicmlnaHQiOjI0NSwic2hhcGUtcmVuZGVyaW5nIjozOCwic2l6ZSI6NjQsInNwZWFrIjoxMTgsInNyYyI6MTcwLCJzdG9wLWNvbG9yIjo0Miwic3RvcC1vcGFjaXR5IjozMSwic3Ryb2tlIjo5OCwic3Ryb2tlLWRhc2hhcnJheSI6MzYsInN0cm9rZS1kYXNob2Zmc2V0IjozLCJzdHJva2UtbGluZWNhcCI6MzAsInN0cm9rZS1saW5lam9pbiI6MjEsInN0cm9rZS1taXRlcmxpbWl0IjoxMiwic3Ryb2tlLW9wYWNpdHkiOjM0LCJzdHJva2Utd2lkdGgiOjg3LCJ0YWJsZS1sYXlvdXQiOjE3MSwidGFiLXNpemUiOjQ2LCJ0ZXh0LWFsaWduIjoyNjAsInRleHQtYW5jaG9yIjozNSwidGV4dC1kZWNvcmF0aW9uIjoyNDcsInRleHQtaW5kZW50IjoyMDcsInRleHQtb3ZlcmZsb3ciOjIwNCwidGV4dC1yZW5kZXJpbmciOjE1NSwidGV4dC1zaGFkb3ciOjIwOCwidGV4dC10cmFuc2Zvcm0iOjIwMiwidG9wIjoyNTgsInRvdWNoLWFjdGlvbiI6ODAsInRyYW5zZm9ybSI6MTgxLCJ0cmFuc2Zvcm0tb3JpZ2luIjoxNjIsInRyYW5zZm9ybS1zdHlsZSI6ODYsInRyYW5zaXRpb24iOjE5MywidHJhbnNpdGlvbi1kZWxheSI6MTM0LCJ0cmFuc2l0aW9uLWR1cmF0aW9uIjoxMzUsInRyYW5zaXRpb24tcHJvcGVydHkiOjEzMSwidHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24iOjEyMiwidW5pY29kZS1iaWRpIjoxNTYsInVuaWNvZGUtcmFuZ2UiOjEzNiwidmVydGljYWwtYWxpZ24iOjIzNiwidmlzaWJpbGl0eSI6MjQyLCItd2Via2l0LWFwcGVhcmFuY2UiOjE5MSwiLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5IjoxNTQsIi13ZWJraXQtYmFja2dyb3VuZC1jbGlwIjoxNjQsIi13ZWJraXQtYmFja2dyb3VuZC1vcmlnaW4iOjQwLCItd2Via2l0LWJhY2tncm91bmQtc2l6ZSI6MTYzLCItd2Via2l0LWJvcmRlci1lbmQiOjksIi13ZWJraXQtYm9yZGVyLWhvcml6b250YWwtc3BhY2luZyI6ODEsIi13ZWJraXQtYm9yZGVyLWltYWdlIjo3NSwiLXdlYmtpdC1ib3JkZXItcmFkaXVzIjoyMTIsIi13ZWJraXQtYm9yZGVyLXN0YXJ0IjoxMCwiLXdlYmtpdC1ib3JkZXItc3RhcnQtY29sb3IiOjE2LCItd2Via2l0LWJvcmRlci1zdGFydC13aWR0aCI6MTMsIi13ZWJraXQtYm9yZGVyLXZlcnRpY2FsLXNwYWNpbmciOjQzLCItd2Via2l0LWJveC1hbGlnbiI6MTAxLCItd2Via2l0LWJveC1kaXJlY3Rpb24iOjUxLCItd2Via2l0LWJveC1mbGV4IjoxMjgsIi13ZWJraXQtYm94LWxpbmVzIjoyLCItd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwIjo5MSwiLXdlYmtpdC1ib3gtb3JpZW50IjoxNDQsIi13ZWJraXQtYm94LXBhY2siOjEwNiwiLXdlYmtpdC1ib3gtcmVmbGVjdCI6MzksIi13ZWJraXQtYm94LXNoYWRvdyI6MjEwLCItd2Via2l0LWNvbHVtbi1icmVhay1pbnNpZGUiOjYwLCItd2Via2l0LWNvbHVtbi1jb3VudCI6ODQsIi13ZWJraXQtY29sdW1uLWdhcCI6NzYsIi13ZWJraXQtY29sdW1uLXJ1bGUiOjI1LCItd2Via2l0LWNvbHVtbi1ydWxlLWNvbG9yIjoyMywiLXdlYmtpdC1jb2x1bW5zIjo0NCwiLXdlYmtpdC1jb2x1bW4tc3BhbiI6MjksIi13ZWJraXQtY29sdW1uLXdpZHRoIjo0NywiLXdlYmtpdC1maWx0ZXIiOjE1OSwiLXdlYmtpdC1mb250LWZlYXR1cmUtc2V0dGluZ3MiOjU5LCItd2Via2l0LWZvbnQtc21vb3RoaW5nIjoxNzcsIi13ZWJraXQtaGlnaGxpZ2h0IjoxLCItd2Via2l0LWxpbmUtYnJlYWsiOjQ1LCItd2Via2l0LWxpbmUtY2xhbXAiOjEyNiwiLXdlYmtpdC1tYXJnaW4tYWZ0ZXIiOjY3LCItd2Via2l0LW1hcmdpbi1iZWZvcmUiOjcwLCItd2Via2l0LW1hcmdpbi1jb2xsYXBzZSI6MTQsIi13ZWJraXQtbWFyZ2luLWVuZCI6NjUsIi13ZWJraXQtbWFyZ2luLXN0YXJ0IjoxMDAsIi13ZWJraXQtbWFyZ2luLXRvcC1jb2xsYXBzZSI6NzgsIi13ZWJraXQtbWFzayI6MTksIi13ZWJraXQtbWFzay1ib3gtaW1hZ2UiOjcyLCItd2Via2l0LW1hc2staW1hZ2UiOjg4LCItd2Via2l0LW1hc2stcG9zaXRpb24iOjU0LCItd2Via2l0LW1hc2stcmVwZWF0Ijo2MywiLXdlYmtpdC1tYXNrLXNpemUiOjc5LCItd2Via2l0LXBhZGRpbmctYWZ0ZXIiOjE1LCItd2Via2l0LXBhZGRpbmctYmVmb3JlIjoyOCwiLXdlYmtpdC1wYWRkaW5nLWVuZCI6NDgsIi13ZWJraXQtcGFkZGluZy1zdGFydCI6NzMsIi13ZWJraXQtcHJpbnQtY29sb3ItYWRqdXN0Ijo4MywiLXdlYmtpdC1ydGwtb3JkZXJpbmciOjcsIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciI6MTY5LCItd2Via2l0LXRleHQtZW1waGFzaXMtY29sb3IiOjExLCItd2Via2l0LXRleHQtZmlsbC1jb2xvciI6NzEsIi13ZWJraXQtdGV4dC1zZWN1cml0eSI6MTcsIi13ZWJraXQtdGV4dC1zdHJva2UiOjU2LCItd2Via2l0LXRleHQtc3Ryb2tlLWNvbG9yIjozNywiLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aCI6NTMsIi13ZWJraXQtdXNlci1kcmFnIjo5NSwiLXdlYmtpdC11c2VyLW1vZGlmeSI6NjIsIi13ZWJraXQtdXNlci1zZWxlY3QiOjE5NCwiLXdlYmtpdC13cml0aW5nLW1vZGUiOjQsIndoaXRlLXNwYWNlIjoyMjgsIndpZG93cyI6MTE1LCJ3aWR0aCI6MjY4LCJ3aWxsLWNoYW5nZSI6NzQsIndvcmQtYnJlYWsiOjE2Niwid29yZC1zcGFjaW5nIjoxNTcsIndvcmQtd3JhcCI6MTk3LCJ3cml0aW5nLW1vZGUiOjQxLCJ6LWluZGV4IjoyMzksInpvb20iOjIwMH07fSx7fV0sMTEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuQ1NTUHJvcGVydHk9ZnVuY3Rpb24ob3duZXJTdHlsZSxpbmRleCxuYW1lLHZhbHVlLGltcG9ydGFudCxkaXNhYmxlZCxwYXJzZWRPayxpbXBsaWNpdCx0ZXh0LHJhbmdlKQp7dGhpcy5vd25lclN0eWxlPW93bmVyU3R5bGU7dGhpcy5pbmRleD1pbmRleDt0aGlzLm5hbWU9bmFtZTt0aGlzLnZhbHVlPXZhbHVlO3RoaXMuaW1wb3J0YW50PWltcG9ydGFudDt0aGlzLmRpc2FibGVkPWRpc2FibGVkO3RoaXMucGFyc2VkT2s9cGFyc2VkT2s7dGhpcy5pbXBsaWNpdD1pbXBsaWNpdDt0aGlzLnRleHQ9dGV4dDt0aGlzLnJhbmdlPXJhbmdlP1dlYkluc3BlY3Rvci5UZXh0UmFuZ2UuZnJvbU9iamVjdChyYW5nZSk6bnVsbDt0aGlzLl9hY3RpdmU9dHJ1ZTt0aGlzLl9uYW1lUmFuZ2U9bnVsbDt0aGlzLl92YWx1ZVJhbmdlPW51bGw7fTtXZWJJbnNwZWN0b3IuQ1NTUHJvcGVydHkucGFyc2VQYXlsb2FkPWZ1bmN0aW9uKG93bmVyU3R5bGUsaW5kZXgscGF5bG9hZCkKe3ZhciByZXN1bHQ9bmV3IFdlYkluc3BlY3Rvci5DU1NQcm9wZXJ0eShvd25lclN0eWxlLGluZGV4LHBheWxvYWQubmFtZSxwYXlsb2FkLnZhbHVlLHBheWxvYWQuaW1wb3J0YW50fHxmYWxzZSxwYXlsb2FkLmRpc2FibGVkfHxmYWxzZSwicGFyc2VkT2siaW4gcGF5bG9hZD8hIXBheWxvYWQucGFyc2VkT2s6dHJ1ZSwhIXBheWxvYWQuaW1wbGljaXQscGF5bG9hZC50ZXh0LHBheWxvYWQucmFuZ2UpO3JldHVybiByZXN1bHQ7fTtXZWJJbnNwZWN0b3IuQ1NTUHJvcGVydHkucHJvdG90eXBlPXtfZW5zdXJlUmFuZ2VzOmZ1bmN0aW9uKCkKe2lmKHRoaXMuX25hbWVSYW5nZSYmdGhpcy5fdmFsdWVSYW5nZSkKcmV0dXJuO3ZhciByYW5nZT10aGlzLnJhbmdlO3ZhciB0ZXh0PXRoaXMudGV4dD9uZXcgV2ViSW5zcGVjdG9yLlRleHQodGhpcy50ZXh0KTpudWxsO2lmKCFyYW5nZXx8IXRleHQpCnJldHVybjt2YXIgbmFtZUluZGV4PXRleHQudmFsdWUoKS5pbmRleE9mKHRoaXMubmFtZSk7dmFyIHZhbHVlSW5kZXg9dGV4dC52YWx1ZSgpLmxhc3RJbmRleE9mKHRoaXMudmFsdWUpO2lmKG5hbWVJbmRleD09PS0xfHx2YWx1ZUluZGV4PT09LTF8fG5hbWVJbmRleD52YWx1ZUluZGV4KQpyZXR1cm47dmFyIG5hbWVTb3VyY2VSYW5nZT1uZXcgV2ViSW5zcGVjdG9yLlNvdXJjZVJhbmdlKG5hbWVJbmRleCx0aGlzLm5hbWUubGVuZ3RoKTt2YXIgdmFsdWVTb3VyY2VSYW5nZT1uZXcgV2ViSW5zcGVjdG9yLlNvdXJjZVJhbmdlKHZhbHVlSW5kZXgsdGhpcy52YWx1ZS5sZW5ndGgpO3RoaXMuX25hbWVSYW5nZT1yZWJhc2UodGV4dC50b1RleHRSYW5nZShuYW1lU291cmNlUmFuZ2UpLHJhbmdlLnN0YXJ0TGluZSxyYW5nZS5zdGFydENvbHVtbik7dGhpcy5fdmFsdWVSYW5nZT1yZWJhc2UodGV4dC50b1RleHRSYW5nZSh2YWx1ZVNvdXJjZVJhbmdlKSxyYW5nZS5zdGFydExpbmUscmFuZ2Uuc3RhcnRDb2x1bW4pO2Z1bmN0aW9uIHJlYmFzZShvbmVMaW5lUmFuZ2UsbGluZU9mZnNldCxjb2x1bW5PZmZzZXQpCntpZihvbmVMaW5lUmFuZ2Uuc3RhcnRMaW5lPT09MCl7b25lTGluZVJhbmdlLnN0YXJ0Q29sdW1uKz1jb2x1bW5PZmZzZXQ7b25lTGluZVJhbmdlLmVuZENvbHVtbis9Y29sdW1uT2Zmc2V0O30Kb25lTGluZVJhbmdlLnN0YXJ0TGluZSs9bGluZU9mZnNldDtvbmVMaW5lUmFuZ2UuZW5kTGluZSs9bGluZU9mZnNldDtyZXR1cm4gb25lTGluZVJhbmdlO319LG5hbWVSYW5nZTpmdW5jdGlvbigpCnt0aGlzLl9lbnN1cmVSYW5nZXMoKTtyZXR1cm4gdGhpcy5fbmFtZVJhbmdlO30sdmFsdWVSYW5nZTpmdW5jdGlvbigpCnt0aGlzLl9lbnN1cmVSYW5nZXMoKTtyZXR1cm4gdGhpcy5fdmFsdWVSYW5nZTt9LHJlYmFzZTpmdW5jdGlvbihlZGl0KQp7aWYodGhpcy5vd25lclN0eWxlLnN0eWxlU2hlZXRJZCE9PWVkaXQuc3R5bGVTaGVldElkKQpyZXR1cm47aWYodGhpcy5yYW5nZSkKdGhpcy5yYW5nZT10aGlzLnJhbmdlLnJlYmFzZUFmdGVyVGV4dEVkaXQoZWRpdC5vbGRSYW5nZSxlZGl0Lm5ld1JhbmdlKTt9LF9zZXRBY3RpdmU6ZnVuY3Rpb24oYWN0aXZlKQp7dGhpcy5fYWN0aXZlPWFjdGl2ZTt9LGdldCBwcm9wZXJ0eVRleHQoKQp7aWYodGhpcy50ZXh0IT09dW5kZWZpbmVkKQpyZXR1cm4gdGhpcy50ZXh0O2lmKHRoaXMubmFtZT09PSIiKQpyZXR1cm4iIjtyZXR1cm4gdGhpcy5uYW1lKyI6ICIrdGhpcy52YWx1ZSsodGhpcy5pbXBvcnRhbnQ/IiAhaW1wb3J0YW50IjoiIikrIjsiO30sYWN0aXZlSW5TdHlsZTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fYWN0aXZlO30sc2V0VGV4dDpmdW5jdGlvbihwcm9wZXJ0eVRleHQsbWFqb3JDaGFuZ2Usb3ZlcndyaXRlKQp7aWYoIXRoaXMub3duZXJTdHlsZSkKcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiTm8gb3duZXJTdHlsZSBmb3IgcHJvcGVydHkiKSk7aWYoIXRoaXMub3duZXJTdHlsZS5zdHlsZVNoZWV0SWQpCnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk5vIG93bmVyIHN0eWxlIGlkIikpO2lmKCF0aGlzLnJhbmdlfHwhdGhpcy5vd25lclN0eWxlLnJhbmdlKQpyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJTdHlsZSBub3QgZWRpdGFibGUiKSk7aWYobWFqb3JDaGFuZ2UpCldlYkluc3BlY3Rvci51c2VyTWV0cmljcy5hY3Rpb25UYWtlbihXZWJJbnNwZWN0b3IuVXNlck1ldHJpY3MuQWN0aW9uLlN0eWxlUnVsZUVkaXRlZCk7aWYob3ZlcndyaXRlJiZwcm9wZXJ0eVRleHQ9PT10aGlzLnByb3BlcnR5VGV4dCl7aWYobWFqb3JDaGFuZ2UpCnRoaXMub3duZXJTdHlsZS5jc3NNb2RlbCgpLmRvbU1vZGVsKCkubWFya1VuZG9hYmxlU3RhdGUoKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO30KdmFyIHJhbmdlPXRoaXMucmFuZ2UucmVsYXRpdmVUbyh0aGlzLm93bmVyU3R5bGUucmFuZ2Uuc3RhcnRMaW5lLHRoaXMub3duZXJTdHlsZS5yYW5nZS5zdGFydENvbHVtbik7dmFyIGluZGVudGF0aW9uPXRoaXMub3duZXJTdHlsZS5jc3NUZXh0P3RoaXMuX2RldGVjdEluZGVudGF0aW9uKHRoaXMub3duZXJTdHlsZS5jc3NUZXh0KTpXZWJJbnNwZWN0b3IubW9kdWxlU2V0dGluZygidGV4dEVkaXRvckluZGVudCIpLmdldCgpO3ZhciBlbmRJbmRlbnRhdGlvbj10aGlzLm93bmVyU3R5bGUuY3NzVGV4dD9pbmRlbnRhdGlvbi5zdWJzdHJpbmcoMCx0aGlzLm93bmVyU3R5bGUucmFuZ2UuZW5kQ29sdW1uKToiIjt2YXIgdGV4dD1uZXcgV2ViSW5zcGVjdG9yLlRleHQodGhpcy5vd25lclN0eWxlLmNzc1RleHR8fCIiKTt2YXIgbmV3U3R5bGVUZXh0PXRleHQucmVwbGFjZVJhbmdlKHJhbmdlLFN0cmluZy5zcHJpbnRmKCI7JXM7Iixwcm9wZXJ0eVRleHQpKTtyZXR1cm4gc2VsZi5ydW50aW1lLmV4dGVuc2lvbihXZWJJbnNwZWN0b3IuVG9rZW5pemVyRmFjdG9yeSkuaW5zdGFuY2UoKS50aGVuKHRoaXMuX2Zvcm1hdFN0eWxlLmJpbmQodGhpcyxuZXdTdHlsZVRleHQsaW5kZW50YXRpb24sZW5kSW5kZW50YXRpb24pKS50aGVuKHNldFN0eWxlVGV4dC5iaW5kKHRoaXMpKTtmdW5jdGlvbiBzZXRTdHlsZVRleHQoc3R5bGVUZXh0KQp7cmV0dXJuIHRoaXMub3duZXJTdHlsZS5zZXRUZXh0KHN0eWxlVGV4dCxtYWpvckNoYW5nZSk7fX0sX2Zvcm1hdFN0eWxlOmZ1bmN0aW9uKHN0eWxlVGV4dCxpbmRlbnRhdGlvbixlbmRJbmRlbnRhdGlvbix0b2tlbml6ZXJGYWN0b3J5KQp7aWYoaW5kZW50YXRpb24pCmluZGVudGF0aW9uPSJcbiIraW5kZW50YXRpb247dmFyIHJlc3VsdD0iIjt2YXIgcHJvcGVydHlUZXh0O3ZhciBpbnNpZGVQcm9wZXJ0eT1mYWxzZTt2YXIgdG9rZW5pemU9dG9rZW5pemVyRmFjdG9yeS5jcmVhdGVUb2tlbml6ZXIoInRleHQvY3NzIik7dG9rZW5pemUoIip7IitzdHlsZVRleHQrIn0iLHByb2Nlc3NUb2tlbik7aWYoaW5zaWRlUHJvcGVydHkpCnJlc3VsdCs9cHJvcGVydHlUZXh0O3Jlc3VsdD1yZXN1bHQuc3Vic3RyaW5nKDIscmVzdWx0Lmxlbmd0aC0xKS50cmltUmlnaHQoKTtyZXR1cm4gcmVzdWx0KyhpbmRlbnRhdGlvbj8iXG4iK2VuZEluZGVudGF0aW9uOiIiKTtmdW5jdGlvbiBwcm9jZXNzVG9rZW4odG9rZW4sdG9rZW5UeXBlLGNvbHVtbixuZXdDb2x1bW4pCntpZighaW5zaWRlUHJvcGVydHkpe3ZhciBkaXNhYmxlZFByb3BlcnR5PXRva2VuVHlwZSYmdG9rZW5UeXBlLmluY2x1ZGVzKCJjc3MtY29tbWVudCIpJiZpc0Rpc2FibGVkUHJvcGVydHkodG9rZW4pO3ZhciBpc1Byb3BlcnR5U3RhcnQ9dG9rZW5UeXBlJiYodG9rZW5UeXBlLmluY2x1ZGVzKCJjc3Mtc3RyaW5nIil8fHRva2VuVHlwZS5pbmNsdWRlcygiY3NzLW1ldGEiKXx8dG9rZW5UeXBlLmluY2x1ZGVzKCJjc3MtcHJvcGVydHkiKXx8dG9rZW5UeXBlLmluY2x1ZGVzKCJjc3MtdmFyaWFibGUtMiIpKTtpZihkaXNhYmxlZFByb3BlcnR5KXtyZXN1bHQ9cmVzdWx0LnRyaW1SaWdodCgpK2luZGVudGF0aW9uK3Rva2VuO31lbHNlIGlmKGlzUHJvcGVydHlTdGFydCl7aW5zaWRlUHJvcGVydHk9dHJ1ZTtwcm9wZXJ0eVRleHQ9dG9rZW47fWVsc2UgaWYodG9rZW4hPT0iOyIpe3Jlc3VsdCs9dG9rZW47fQpyZXR1cm47fQppZih0b2tlbj09PSJ9Inx8dG9rZW49PT0iOyIpe3Jlc3VsdD1yZXN1bHQudHJpbVJpZ2h0KCkraW5kZW50YXRpb24rcHJvcGVydHlUZXh0LnRyaW0oKSsiOyI7aW5zaWRlUHJvcGVydHk9ZmFsc2U7aWYodG9rZW49PT0ifSIpCnJlc3VsdCs9In0iO31lbHNle3Byb3BlcnR5VGV4dCs9dG9rZW47fX0KZnVuY3Rpb24gaXNEaXNhYmxlZFByb3BlcnR5KHRleHQpCnt2YXIgY29sb249dGV4dC5pbmRleE9mKCI6Iik7aWYoY29sb249PT0tMSkKcmV0dXJuIGZhbHNlO3ZhciBwcm9wZXJ0eU5hbWU9dGV4dC5zdWJzdHJpbmcoMixjb2xvbikudHJpbSgpO3JldHVybiBXZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5pc0NTU1Byb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO319LF9kZXRlY3RJbmRlbnRhdGlvbjpmdW5jdGlvbih0ZXh0KQp7dmFyIGxpbmVzPXRleHQuc3BsaXQoIlxuIik7aWYobGluZXMubGVuZ3RoPDIpCnJldHVybiIiO3JldHVybiBXZWJJbnNwZWN0b3IuVGV4dFV0aWxzLmxpbmVJbmRlbnQobGluZXNbMV0pO30sc2V0VmFsdWU6ZnVuY3Rpb24obmV3VmFsdWUsbWFqb3JDaGFuZ2Usb3ZlcndyaXRlLHVzZXJDYWxsYmFjaykKe3ZhciB0ZXh0PXRoaXMubmFtZSsiOiAiK25ld1ZhbHVlKyh0aGlzLmltcG9ydGFudD8iICFpbXBvcnRhbnQiOiIiKSsiOyI7dGhpcy5zZXRUZXh0KHRleHQsbWFqb3JDaGFuZ2Usb3ZlcndyaXRlKS50aGVuKHVzZXJDYWxsYmFjayk7fSxzZXREaXNhYmxlZDpmdW5jdGlvbihkaXNhYmxlZCkKe2lmKCF0aGlzLm93bmVyU3R5bGUpCnJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO2lmKGRpc2FibGVkPT09dGhpcy5kaXNhYmxlZCkKcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTt2YXIgcHJvcGVydHlUZXh0PXRoaXMudGV4dC50cmltKCk7dmFyIHRleHQ9ZGlzYWJsZWQ/Ii8qICIrcHJvcGVydHlUZXh0KyIgKi8iOnRoaXMudGV4dC5zdWJzdHJpbmcoMixwcm9wZXJ0eVRleHQubGVuZ3RoLTIpLnRyaW0oKTtyZXR1cm4gdGhpcy5zZXRUZXh0KHRleHQsdHJ1ZSx0cnVlKTt9fTt9LHt9XSwxMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5DU1NWYWx1ZT1mdW5jdGlvbihwYXlsb2FkKQp7dGhpcy50ZXh0PXBheWxvYWQudGV4dDtpZihwYXlsb2FkLnJhbmdlKQp0aGlzLnJhbmdlPVdlYkluc3BlY3Rvci5UZXh0UmFuZ2UuZnJvbU9iamVjdChwYXlsb2FkLnJhbmdlKTt9O1dlYkluc3BlY3Rvci5DU1NWYWx1ZS5wcm90b3R5cGU9e3JlYmFzZTpmdW5jdGlvbihlZGl0KQp7aWYoIXRoaXMucmFuZ2UpCnJldHVybjt0aGlzLnJhbmdlPXRoaXMucmFuZ2UucmViYXNlQWZ0ZXJUZXh0RWRpdChlZGl0Lm9sZFJhbmdlLGVkaXQubmV3UmFuZ2UpO319O1dlYkluc3BlY3Rvci5DU1NSdWxlPWZ1bmN0aW9uKGNzc01vZGVsLHBheWxvYWQpCnt0aGlzLl9jc3NNb2RlbD1jc3NNb2RlbDt0aGlzLnN0eWxlU2hlZXRJZD1wYXlsb2FkLnN0eWxlU2hlZXRJZDtpZih0aGlzLnN0eWxlU2hlZXRJZCl7dmFyIHN0eWxlU2hlZXRIZWFkZXI9Y3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuc3R5bGVTaGVldElkKTt0aGlzLnNvdXJjZVVSTD1zdHlsZVNoZWV0SGVhZGVyLnNvdXJjZVVSTDt9CnRoaXMub3JpZ2luPXBheWxvYWQub3JpZ2luO3RoaXMuc3R5bGU9bmV3IFdlYkluc3BlY3Rvci5DU1NTdHlsZURlY2xhcmF0aW9uKHRoaXMuX2Nzc01vZGVsLHRoaXMscGF5bG9hZC5zdHlsZSxXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbi5UeXBlLlJlZ3VsYXIpO307V2ViSW5zcGVjdG9yLkNTU1J1bGUucHJvdG90eXBlPXtyZWJhc2U6ZnVuY3Rpb24oZWRpdCkKe2lmKHRoaXMuc3R5bGVTaGVldElkIT09ZWRpdC5zdHlsZVNoZWV0SWQpCnJldHVybjt0aGlzLnN0eWxlLnJlYmFzZShlZGl0KTt9LHJlc291cmNlVVJMOmZ1bmN0aW9uKCkKe2lmKCF0aGlzLnN0eWxlU2hlZXRJZCkKcmV0dXJuIiI7dmFyIHN0eWxlU2hlZXRIZWFkZXI9dGhpcy5fY3NzTW9kZWwuc3R5bGVTaGVldEhlYWRlckZvcklkKHRoaXMuc3R5bGVTaGVldElkKTtyZXR1cm4gc3R5bGVTaGVldEhlYWRlci5yZXNvdXJjZVVSTCgpO30saXNVc2VyQWdlbnQ6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMub3JpZ2luPT09Q1NTQWdlbnQuU3R5bGVTaGVldE9yaWdpbi5Vc2VyQWdlbnQ7fSxpc0luamVjdGVkOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLm9yaWdpbj09PUNTU0FnZW50LlN0eWxlU2hlZXRPcmlnaW4uSW5qZWN0ZWQ7fSxpc1ZpYUluc3BlY3RvcjpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5vcmlnaW49PT1DU1NBZ2VudC5TdHlsZVNoZWV0T3JpZ2luLkluc3BlY3Rvcjt9LGlzUmVndWxhcjpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5vcmlnaW49PT1DU1NBZ2VudC5TdHlsZVNoZWV0T3JpZ2luLlJlZ3VsYXI7fX07V2ViSW5zcGVjdG9yLkNTU1N0eWxlUnVsZT1mdW5jdGlvbihjc3NNb2RlbCxwYXlsb2FkKQp7V2ViSW5zcGVjdG9yLkNTU1J1bGUuY2FsbCh0aGlzLGNzc01vZGVsLHBheWxvYWQpO3RoaXMuX3JlaW5pdGlhbGl6ZVNlbGVjdG9ycyhwYXlsb2FkLnNlbGVjdG9yTGlzdCk7dGhpcy5tZWRpYT1wYXlsb2FkLm1lZGlhP1dlYkluc3BlY3Rvci5DU1NNZWRpYS5wYXJzZU1lZGlhQXJyYXlQYXlsb2FkKGNzc01vZGVsLHBheWxvYWQubWVkaWEpOltdO307V2ViSW5zcGVjdG9yLkNTU1N0eWxlUnVsZS5jcmVhdGVEdW1teVJ1bGU9ZnVuY3Rpb24oY3NzTW9kZWwsc2VsZWN0b3JUZXh0KQp7dmFyIGR1bW15UGF5bG9hZD17c2VsZWN0b3JMaXN0OntzZWxlY3RvcnM6W3t0ZXh0OnNlbGVjdG9yVGV4dH1dfSxzdHlsZTp7c3R5bGVTaGVldElkOiIwIixyYW5nZTpuZXcgV2ViSW5zcGVjdG9yLlRleHRSYW5nZSgwLDAsMCwwKSxzaG9ydGhhbmRFbnRyaWVzOltdLGNzc1Byb3BlcnRpZXM6W119fTtyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5DU1NTdHlsZVJ1bGUoY3NzTW9kZWwsZHVtbXlQYXlsb2FkKTt9O1dlYkluc3BlY3Rvci5DU1NTdHlsZVJ1bGUucHJvdG90eXBlPXtfcmVpbml0aWFsaXplU2VsZWN0b3JzOmZ1bmN0aW9uKHNlbGVjdG9yTGlzdCkKe3RoaXMuc2VsZWN0b3JzPVtdO2Zvcih2YXIgaT0wO2k8c2VsZWN0b3JMaXN0LnNlbGVjdG9ycy5sZW5ndGg7KytpKQp0aGlzLnNlbGVjdG9ycy5wdXNoKG5ldyBXZWJJbnNwZWN0b3IuQ1NTVmFsdWUoc2VsZWN0b3JMaXN0LnNlbGVjdG9yc1tpXSkpO30sc2V0U2VsZWN0b3JUZXh0OmZ1bmN0aW9uKG5ld1NlbGVjdG9yKQp7dmFyIHN0eWxlU2hlZXRJZD10aGlzLnN0eWxlU2hlZXRJZDtpZighc3R5bGVTaGVldElkKQp0aHJvdyJObyBydWxlIHN0eWxlc2hlZXQgaWQiO3ZhciByYW5nZT10aGlzLnNlbGVjdG9yUmFuZ2UoKTtpZighcmFuZ2UpCnRocm93IlJ1bGUgc2VsZWN0b3IgaXMgbm90IGVkaXRhYmxlIjtyZXR1cm4gdGhpcy5fY3NzTW9kZWwuc2V0U2VsZWN0b3JUZXh0KHN0eWxlU2hlZXRJZCxyYW5nZSxuZXdTZWxlY3Rvcik7fSxzZWxlY3RvclRleHQ6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuc2VsZWN0b3JzLnNlbGVjdCgidGV4dCIpLmpvaW4oIiwgIik7fSxzZWxlY3RvclJhbmdlOmZ1bmN0aW9uKCkKe3ZhciBmaXJzdFJhbmdlPXRoaXMuc2VsZWN0b3JzWzBdLnJhbmdlO2lmKCFmaXJzdFJhbmdlKQpyZXR1cm4gbnVsbDt2YXIgbGFzdFJhbmdlPXRoaXMuc2VsZWN0b3JzLnBlZWtMYXN0KCkucmFuZ2U7cmV0dXJuIG5ldyBXZWJJbnNwZWN0b3IuVGV4dFJhbmdlKGZpcnN0UmFuZ2Uuc3RhcnRMaW5lLGZpcnN0UmFuZ2Uuc3RhcnRDb2x1bW4sbGFzdFJhbmdlLmVuZExpbmUsbGFzdFJhbmdlLmVuZENvbHVtbik7fSxsaW5lTnVtYmVySW5Tb3VyY2U6ZnVuY3Rpb24oc2VsZWN0b3JJbmRleCkKe3ZhciBzZWxlY3Rvcj10aGlzLnNlbGVjdG9yc1tzZWxlY3RvckluZGV4XTtpZighc2VsZWN0b3J8fCFzZWxlY3Rvci5yYW5nZXx8IXRoaXMuc3R5bGVTaGVldElkKQpyZXR1cm4gMDt2YXIgc3R5bGVTaGVldEhlYWRlcj10aGlzLl9jc3NNb2RlbC5zdHlsZVNoZWV0SGVhZGVyRm9ySWQodGhpcy5zdHlsZVNoZWV0SWQpO3JldHVybiBzdHlsZVNoZWV0SGVhZGVyLmxpbmVOdW1iZXJJblNvdXJjZShzZWxlY3Rvci5yYW5nZS5zdGFydExpbmUpO30sY29sdW1uTnVtYmVySW5Tb3VyY2U6ZnVuY3Rpb24oc2VsZWN0b3JJbmRleCkKe3ZhciBzZWxlY3Rvcj10aGlzLnNlbGVjdG9yc1tzZWxlY3RvckluZGV4XTtpZighc2VsZWN0b3J8fCFzZWxlY3Rvci5yYW5nZXx8IXRoaXMuc3R5bGVTaGVldElkKQpyZXR1cm4gdW5kZWZpbmVkO3ZhciBzdHlsZVNoZWV0SGVhZGVyPXRoaXMuX2Nzc01vZGVsLnN0eWxlU2hlZXRIZWFkZXJGb3JJZCh0aGlzLnN0eWxlU2hlZXRJZCk7Y29uc29sZS5hc3NlcnQoc3R5bGVTaGVldEhlYWRlcik7cmV0dXJuIHN0eWxlU2hlZXRIZWFkZXIuY29sdW1uTnVtYmVySW5Tb3VyY2Uoc2VsZWN0b3IucmFuZ2Uuc3RhcnRMaW5lLHNlbGVjdG9yLnJhbmdlLnN0YXJ0Q29sdW1uKTt9LHJlYmFzZTpmdW5jdGlvbihlZGl0KQp7aWYodGhpcy5zdHlsZVNoZWV0SWQhPT1lZGl0LnN0eWxlU2hlZXRJZCkKcmV0dXJuO2lmKHRoaXMuc2VsZWN0b3JSYW5nZSgpLmVxdWFsKGVkaXQub2xkUmFuZ2UpKXt0aGlzLl9yZWluaXRpYWxpemVTZWxlY3RvcnMoZWRpdC5wYXlsb2FkKTt9ZWxzZXtmb3IodmFyIGk9MDtpPHRoaXMuc2VsZWN0b3JzLmxlbmd0aDsrK2kpCnRoaXMuc2VsZWN0b3JzW2ldLnJlYmFzZShlZGl0KTt9CmZvcih2YXIgbWVkaWEgb2YgdGhpcy5tZWRpYSkKbWVkaWEucmViYXNlKGVkaXQpO1dlYkluc3BlY3Rvci5DU1NSdWxlLnByb3RvdHlwZS5yZWJhc2UuY2FsbCh0aGlzLGVkaXQpO30sX19wcm90b19fOldlYkluc3BlY3Rvci5DU1NSdWxlLnByb3RvdHlwZX07V2ViSW5zcGVjdG9yLkNTU0tleWZyYW1lc1J1bGU9ZnVuY3Rpb24oY3NzTW9kZWwscGF5bG9hZCkKe3RoaXMuX2Nzc01vZGVsPWNzc01vZGVsO3RoaXMuX2FuaW1hdGlvbk5hbWU9bmV3IFdlYkluc3BlY3Rvci5DU1NWYWx1ZShwYXlsb2FkLmFuaW1hdGlvbk5hbWUpO3RoaXMuX2tleWZyYW1lcz1wYXlsb2FkLmtleWZyYW1lcy5tYXAoa2V5ZnJhbWVSdWxlPT5uZXcgV2ViSW5zcGVjdG9yLkNTU0tleWZyYW1lUnVsZShjc3NNb2RlbCxrZXlmcmFtZVJ1bGUpKTt9O1dlYkluc3BlY3Rvci5DU1NLZXlmcmFtZXNSdWxlLnByb3RvdHlwZT17bmFtZTpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fYW5pbWF0aW9uTmFtZTt9LGtleWZyYW1lczpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzO319O1dlYkluc3BlY3Rvci5DU1NLZXlmcmFtZVJ1bGU9ZnVuY3Rpb24oY3NzTW9kZWwscGF5bG9hZCkKe1dlYkluc3BlY3Rvci5DU1NSdWxlLmNhbGwodGhpcyxjc3NNb2RlbCxwYXlsb2FkKTt0aGlzLl9yZWluaXRpYWxpemVLZXkocGF5bG9hZC5rZXlUZXh0KTt9O1dlYkluc3BlY3Rvci5DU1NLZXlmcmFtZVJ1bGUucHJvdG90eXBlPXtrZXk6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX2tleVRleHQ7fSxfcmVpbml0aWFsaXplS2V5OmZ1bmN0aW9uKHBheWxvYWQpCnt0aGlzLl9rZXlUZXh0PW5ldyBXZWJJbnNwZWN0b3IuQ1NTVmFsdWUocGF5bG9hZCk7fSxyZWJhc2U6ZnVuY3Rpb24oZWRpdCkKe2lmKHRoaXMuc3R5bGVTaGVldElkIT09ZWRpdC5zdHlsZVNoZWV0SWR8fCF0aGlzLl9rZXlUZXh0LnJhbmdlKQpyZXR1cm47aWYoZWRpdC5vbGRSYW5nZS5lcXVhbCh0aGlzLl9rZXlUZXh0LnJhbmdlKSkKdGhpcy5fcmVpbml0aWFsaXplS2V5KGVkaXQucGF5bG9hZCk7ZWxzZQp0aGlzLl9rZXlUZXh0LnJlYmFzZShlZGl0KTtXZWJJbnNwZWN0b3IuQ1NTUnVsZS5wcm90b3R5cGUucmViYXNlLmNhbGwodGhpcyxlZGl0KTt9LHNldEtleVRleHQ6ZnVuY3Rpb24obmV3S2V5VGV4dCkKe3ZhciBzdHlsZVNoZWV0SWQ9dGhpcy5zdHlsZVNoZWV0SWQ7aWYoIXN0eWxlU2hlZXRJZCkKdGhyb3ciTm8gcnVsZSBzdHlsZXNoZWV0IGlkIjt2YXIgcmFuZ2U9dGhpcy5fa2V5VGV4dC5yYW5nZTtpZighcmFuZ2UpCnRocm93IktleWZyYW1lIGtleSBpcyBub3QgZWRpdGFibGUiO3JldHVybiB0aGlzLl9jc3NNb2RlbC5zZXRLZXlmcmFtZUtleShzdHlsZVNoZWV0SWQscmFuZ2UsbmV3S2V5VGV4dCk7fSxfX3Byb3RvX186V2ViSW5zcGVjdG9yLkNTU1J1bGUucHJvdG90eXBlfTt9LHt9XSwxMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5DU1NTdHlsZURlY2xhcmF0aW9uPWZ1bmN0aW9uKGNzc01vZGVsLHBhcmVudFJ1bGUscGF5bG9hZCx0eXBlKQp7dGhpcy5fY3NzTW9kZWw9Y3NzTW9kZWw7dGhpcy5wYXJlbnRSdWxlPXBhcmVudFJ1bGU7dGhpcy5fcmVpbml0aWFsaXplKHBheWxvYWQpO3RoaXMudHlwZT10eXBlO307V2ViSW5zcGVjdG9yLkNTU1N0eWxlRGVjbGFyYXRpb24uVHlwZT17UmVndWxhcjoiUmVndWxhciIsSW5saW5lOiJJbmxpbmUiLEF0dHJpYnV0ZXM6IkF0dHJpYnV0ZXMifTtXZWJJbnNwZWN0b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGU9e3JlYmFzZTpmdW5jdGlvbihlZGl0KQp7aWYodGhpcy5zdHlsZVNoZWV0SWQhPT1lZGl0LnN0eWxlU2hlZXRJZHx8IXRoaXMucmFuZ2UpCnJldHVybjtpZihlZGl0Lm9sZFJhbmdlLmVxdWFsKHRoaXMucmFuZ2UpKXt0aGlzLl9yZWluaXRpYWxpemUoZWRpdC5wYXlsb2FkKTt9ZWxzZXt0aGlzLnJhbmdlPXRoaXMucmFuZ2UucmViYXNlQWZ0ZXJUZXh0RWRpdChlZGl0Lm9sZFJhbmdlLGVkaXQubmV3UmFuZ2UpO2Zvcih2YXIgaT0wO2k8dGhpcy5fYWxsUHJvcGVydGllcy5sZW5ndGg7KytpKQp0aGlzLl9hbGxQcm9wZXJ0aWVzW2ldLnJlYmFzZShlZGl0KTt9fSxfcmVpbml0aWFsaXplOmZ1bmN0aW9uKHBheWxvYWQpCnt0aGlzLnN0eWxlU2hlZXRJZD1wYXlsb2FkLnN0eWxlU2hlZXRJZDt0aGlzLnJhbmdlPXBheWxvYWQucmFuZ2U/V2ViSW5zcGVjdG9yLlRleHRSYW5nZS5mcm9tT2JqZWN0KHBheWxvYWQucmFuZ2UpOm51bGw7dmFyIHNob3J0aGFuZEVudHJpZXM9cGF5bG9hZC5zaG9ydGhhbmRFbnRyaWVzO3RoaXMuX3Nob3J0aGFuZFZhbHVlcz1uZXcgTWFwKCk7dGhpcy5fc2hvcnRoYW5kSXNJbXBvcnRhbnQ9bmV3IFNldCgpO2Zvcih2YXIgaT0wO2k8c2hvcnRoYW5kRW50cmllcy5sZW5ndGg7KytpKXt0aGlzLl9zaG9ydGhhbmRWYWx1ZXMuc2V0KHNob3J0aGFuZEVudHJpZXNbaV0ubmFtZSxzaG9ydGhhbmRFbnRyaWVzW2ldLnZhbHVlKTtpZihzaG9ydGhhbmRFbnRyaWVzW2ldLmltcG9ydGFudCkKdGhpcy5fc2hvcnRoYW5kSXNJbXBvcnRhbnQuYWRkKHNob3J0aGFuZEVudHJpZXNbaV0ubmFtZSk7fQp0aGlzLl9hbGxQcm9wZXJ0aWVzPVtdO2Zvcih2YXIgaT0wO2k8cGF5bG9hZC5jc3NQcm9wZXJ0aWVzLmxlbmd0aDsrK2kpe3ZhciBwcm9wZXJ0eT1XZWJJbnNwZWN0b3IuQ1NTUHJvcGVydHkucGFyc2VQYXlsb2FkKHRoaXMsaSxwYXlsb2FkLmNzc1Byb3BlcnRpZXNbaV0pO3RoaXMuX2FsbFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7fQp0aGlzLl9nZW5lcmF0ZVN5bnRoZXRpY1Byb3BlcnRpZXNJZk5lZWRlZCgpO3RoaXMuX2NvbXB1dGVJbmFjdGl2ZVByb3BlcnRpZXMoKTt0aGlzLl9hY3RpdmVQcm9wZXJ0eU1hcD1uZXcgTWFwKCk7Zm9yKHZhciBwcm9wZXJ0eSBvZiB0aGlzLl9hbGxQcm9wZXJ0aWVzKXtpZighcHJvcGVydHkuYWN0aXZlSW5TdHlsZSgpKQpjb250aW51ZTt0aGlzLl9hY3RpdmVQcm9wZXJ0eU1hcC5zZXQocHJvcGVydHkubmFtZSxwcm9wZXJ0eSk7fQp0aGlzLmNzc1RleHQ9cGF5bG9hZC5jc3NUZXh0O3RoaXMuX2xlYWRpbmdQcm9wZXJ0aWVzPW51bGw7fSxfZ2VuZXJhdGVTeW50aGV0aWNQcm9wZXJ0aWVzSWZOZWVkZWQ6ZnVuY3Rpb24oKQp7aWYodGhpcy5yYW5nZSkKcmV0dXJuO2lmKCF0aGlzLl9zaG9ydGhhbmRWYWx1ZXMuc2l6ZSkKcmV0dXJuO3ZhciBwcm9wZXJ0aWVzU2V0PW5ldyBTZXQoKTtmb3IodmFyIHByb3BlcnR5IG9mIHRoaXMuX2FsbFByb3BlcnRpZXMpCnByb3BlcnRpZXNTZXQuYWRkKHByb3BlcnR5Lm5hbWUpO3ZhciBnZW5lcmF0ZWRQcm9wZXJ0aWVzPVtdO2Zvcih2YXIgcHJvcGVydHkgb2YgdGhpcy5fYWxsUHJvcGVydGllcyl7dmFyIHNob3J0aGFuZHM9V2ViSW5zcGVjdG9yLmNzc01ldGFkYXRhKCkuc2hvcnRoYW5kcyhwcm9wZXJ0eS5uYW1lKXx8W107Zm9yKHZhciBzaG9ydGhhbmQgb2Ygc2hvcnRoYW5kcyl7aWYocHJvcGVydGllc1NldC5oYXMoc2hvcnRoYW5kKSkKY29udGludWU7dmFyIHNob3J0aGFuZFZhbHVlPXRoaXMuX3Nob3J0aGFuZFZhbHVlcy5nZXQoc2hvcnRoYW5kKTtpZighc2hvcnRoYW5kVmFsdWUpCmNvbnRpbnVlO3ZhciBzaG9ydGhhbmRJbXBvcnRhbmNlPSEhdGhpcy5fc2hvcnRoYW5kSXNJbXBvcnRhbnQuaGFzKHNob3J0aGFuZCk7dmFyIHNob3J0aGFuZFByb3BlcnR5PW5ldyBXZWJJbnNwZWN0b3IuQ1NTUHJvcGVydHkodGhpcyx0aGlzLmFsbFByb3BlcnRpZXMubGVuZ3RoLHNob3J0aGFuZCxzaG9ydGhhbmRWYWx1ZSxzaG9ydGhhbmRJbXBvcnRhbmNlLGZhbHNlLHRydWUsZmFsc2UpO2dlbmVyYXRlZFByb3BlcnRpZXMucHVzaChzaG9ydGhhbmRQcm9wZXJ0eSk7cHJvcGVydGllc1NldC5hZGQoc2hvcnRoYW5kKTt9fQp0aGlzLl9hbGxQcm9wZXJ0aWVzPXRoaXMuX2FsbFByb3BlcnRpZXMuY29uY2F0KGdlbmVyYXRlZFByb3BlcnRpZXMpO30sX2NvbXB1dGVMZWFkaW5nUHJvcGVydGllczpmdW5jdGlvbigpCntmdW5jdGlvbiBwcm9wZXJ0eUhhc1JhbmdlKHByb3BlcnR5KQp7cmV0dXJuISFwcm9wZXJ0eS5yYW5nZTt9CmlmKHRoaXMucmFuZ2UpCnJldHVybiB0aGlzLl9hbGxQcm9wZXJ0aWVzLmZpbHRlcihwcm9wZXJ0eUhhc1JhbmdlKTt2YXIgbGVhZGluZ1Byb3BlcnRpZXM9W107Zm9yKHZhciBwcm9wZXJ0eSBvZiB0aGlzLl9hbGxQcm9wZXJ0aWVzKXt2YXIgc2hvcnRoYW5kcz1XZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5zaG9ydGhhbmRzKHByb3BlcnR5Lm5hbWUpfHxbXTt2YXIgYmVsb25nVG9BbnlTaG9ydGhhbmQ9ZmFsc2U7Zm9yKHZhciBzaG9ydGhhbmQgb2Ygc2hvcnRoYW5kcyl7aWYodGhpcy5fc2hvcnRoYW5kVmFsdWVzLmdldChzaG9ydGhhbmQpKXtiZWxvbmdUb0FueVNob3J0aGFuZD10cnVlO2JyZWFrO319CmlmKCFiZWxvbmdUb0FueVNob3J0aGFuZCkKbGVhZGluZ1Byb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7fQpyZXR1cm4gbGVhZGluZ1Byb3BlcnRpZXM7fSxsZWFkaW5nUHJvcGVydGllczpmdW5jdGlvbigpCntpZighdGhpcy5fbGVhZGluZ1Byb3BlcnRpZXMpCnRoaXMuX2xlYWRpbmdQcm9wZXJ0aWVzPXRoaXMuX2NvbXB1dGVMZWFkaW5nUHJvcGVydGllcygpO3JldHVybiB0aGlzLl9sZWFkaW5nUHJvcGVydGllczt9LHRhcmdldDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fY3NzTW9kZWwudGFyZ2V0KCk7fSxjc3NNb2RlbDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fY3NzTW9kZWw7fSxfY29tcHV0ZUluYWN0aXZlUHJvcGVydGllczpmdW5jdGlvbigpCnt2YXIgYWN0aXZlUHJvcGVydGllcz17fTtmb3IodmFyIGk9MDtpPHRoaXMuX2FsbFByb3BlcnRpZXMubGVuZ3RoOysraSl7dmFyIHByb3BlcnR5PXRoaXMuX2FsbFByb3BlcnRpZXNbaV07aWYocHJvcGVydHkuZGlzYWJsZWR8fCFwcm9wZXJ0eS5wYXJzZWRPayl7cHJvcGVydHkuX3NldEFjdGl2ZShmYWxzZSk7Y29udGludWU7fQp2YXIgY2Fub25pY2FsTmFtZT1XZWJJbnNwZWN0b3IuY3NzTWV0YWRhdGEoKS5jYW5vbmljYWxQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk7dmFyIGFjdGl2ZVByb3BlcnR5PWFjdGl2ZVByb3BlcnRpZXNbY2Fub25pY2FsTmFtZV07aWYoIWFjdGl2ZVByb3BlcnR5KXthY3RpdmVQcm9wZXJ0aWVzW2Nhbm9uaWNhbE5hbWVdPXByb3BlcnR5O31lbHNlIGlmKCFhY3RpdmVQcm9wZXJ0eS5pbXBvcnRhbnR8fHByb3BlcnR5LmltcG9ydGFudCl7YWN0aXZlUHJvcGVydHkuX3NldEFjdGl2ZShmYWxzZSk7YWN0aXZlUHJvcGVydGllc1tjYW5vbmljYWxOYW1lXT1wcm9wZXJ0eTt9ZWxzZXtwcm9wZXJ0eS5fc2V0QWN0aXZlKGZhbHNlKTt9fX0sZ2V0IGFsbFByb3BlcnRpZXMoKQp7cmV0dXJuIHRoaXMuX2FsbFByb3BlcnRpZXM7fSxnZXRQcm9wZXJ0eVZhbHVlOmZ1bmN0aW9uKG5hbWUpCnt2YXIgcHJvcGVydHk9dGhpcy5fYWN0aXZlUHJvcGVydHlNYXAuZ2V0KG5hbWUpO3JldHVybiBwcm9wZXJ0eT9wcm9wZXJ0eS52YWx1ZToiIjt9LGlzUHJvcGVydHlJbXBsaWNpdDpmdW5jdGlvbihuYW1lKQp7dmFyIHByb3BlcnR5PXRoaXMuX2FjdGl2ZVByb3BlcnR5TWFwLmdldChuYW1lKTtyZXR1cm4gcHJvcGVydHk/cHJvcGVydHkuaW1wbGljaXQ6IiI7fSxsb25naGFuZFByb3BlcnRpZXM6ZnVuY3Rpb24obmFtZSkKe3ZhciBsb25naGFuZHM9V2ViSW5zcGVjdG9yLmNzc01ldGFkYXRhKCkubG9uZ2hhbmRzKG5hbWUpO3ZhciByZXN1bHQ9W107Zm9yKHZhciBpPTA7bG9uZ2hhbmRzJiZpPGxvbmdoYW5kcy5sZW5ndGg7KytpKXt2YXIgcHJvcGVydHk9dGhpcy5fYWN0aXZlUHJvcGVydHlNYXAuZ2V0KGxvbmdoYW5kc1tpXSk7aWYocHJvcGVydHkpCnJlc3VsdC5wdXNoKHByb3BlcnR5KTt9CnJldHVybiByZXN1bHQ7fSxwcm9wZXJ0eUF0OmZ1bmN0aW9uKGluZGV4KQp7cmV0dXJuIGluZGV4PHRoaXMuYWxsUHJvcGVydGllcy5sZW5ndGg/dGhpcy5hbGxQcm9wZXJ0aWVzW2luZGV4XTpudWxsO30scGFzdExhc3RTb3VyY2VQcm9wZXJ0eUluZGV4OmZ1bmN0aW9uKCkKe2Zvcih2YXIgaT10aGlzLmFsbFByb3BlcnRpZXMubGVuZ3RoLTE7aT49MDstLWkpe2lmKHRoaXMuYWxsUHJvcGVydGllc1tpXS5yYW5nZSkKcmV0dXJuIGkrMTt9CnJldHVybiAwO30sX2luc2VydGlvblJhbmdlOmZ1bmN0aW9uKGluZGV4KQp7dmFyIHByb3BlcnR5PXRoaXMucHJvcGVydHlBdChpbmRleCk7cmV0dXJuIHByb3BlcnR5JiZwcm9wZXJ0eS5yYW5nZT9wcm9wZXJ0eS5yYW5nZS5jb2xsYXBzZVRvU3RhcnQoKTp0aGlzLnJhbmdlLmNvbGxhcHNlVG9FbmQoKTt9LG5ld0JsYW5rUHJvcGVydHk6ZnVuY3Rpb24oaW5kZXgpCntpbmRleD10eXBlb2YgaW5kZXg9PT0idW5kZWZpbmVkIj90aGlzLnBhc3RMYXN0U291cmNlUHJvcGVydHlJbmRleCgpOmluZGV4O3ZhciBwcm9wZXJ0eT1uZXcgV2ViSW5zcGVjdG9yLkNTU1Byb3BlcnR5KHRoaXMsaW5kZXgsIiIsIiIsZmFsc2UsZmFsc2UsdHJ1ZSxmYWxzZSwiIix0aGlzLl9pbnNlcnRpb25SYW5nZShpbmRleCkpO3JldHVybiBwcm9wZXJ0eTt9LHNldFRleHQ6ZnVuY3Rpb24odGV4dCxtYWpvckNoYW5nZSkKe3JldHVybiB0aGlzLl9jc3NNb2RlbC5zZXRTdHlsZVRleHQodGhpcy5zdHlsZVNoZWV0SWQsdGhpcy5yYW5nZSx0ZXh0LG1ham9yQ2hhbmdlKTt9LGluc2VydFByb3BlcnR5QXQ6ZnVuY3Rpb24oaW5kZXgsbmFtZSx2YWx1ZSx1c2VyQ2FsbGJhY2spCnt0aGlzLm5ld0JsYW5rUHJvcGVydHkoaW5kZXgpLnNldFRleHQobmFtZSsiOiAiK3ZhbHVlKyI7IixmYWxzZSx0cnVlKS50aGVuKHVzZXJDYWxsYmFjayk7fSxhcHBlbmRQcm9wZXJ0eTpmdW5jdGlvbihuYW1lLHZhbHVlLHVzZXJDYWxsYmFjaykKe3RoaXMuaW5zZXJ0UHJvcGVydHlBdCh0aGlzLmFsbFByb3BlcnRpZXMubGVuZ3RoLG5hbWUsdmFsdWUsdXNlckNhbGxiYWNrKTt9fTt9LHt9XSwxMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5UYXJnZXQ9ZnVuY3Rpb24odGFyZ2V0TWFuYWdlcixuYW1lLGNhcGFiaWxpdGllc01hc2ssY29ubmVjdGlvbixwYXJlbnRUYXJnZXQpCntQcm90b2NvbC5BZ2VudHMuY2FsbCh0aGlzLGNvbm5lY3Rpb24uYWdlbnRzTWFwKCkpO3RoaXMuX3RhcmdldE1hbmFnZXI9dGFyZ2V0TWFuYWdlcjt0aGlzLl9uYW1lPW5hbWU7dGhpcy5faW5zcGVjdGVkVVJMPSIiO3RoaXMuX2NhcGFiaWxpdGllc01hc2s9Y2FwYWJpbGl0aWVzTWFzazt0aGlzLl9jb25uZWN0aW9uPWNvbm5lY3Rpb247dGhpcy5fcGFyZW50VGFyZ2V0PXBhcmVudFRhcmdldDtjb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoSW5zcGVjdG9yQmFja2VuZENsYXNzLkNvbm5lY3Rpb24uRXZlbnRzLkRpc2Nvbm5lY3RlZCx0aGlzLl9vbkRpc2Nvbm5lY3QsdGhpcyk7dGhpcy5faWQ9V2ViSW5zcGVjdG9yLlRhcmdldC5fbmV4dElkKys7dGhpcy5fbW9kZWxCeUNvbnN0cnVjdG9yPW5ldyBNYXAoKTt9O1dlYkluc3BlY3Rvci5UYXJnZXQuQ2FwYWJpbGl0eT17QnJvd3NlcjoxLERPTToyLEpTOjQsTG9nOjgsTmV0d29yazoxNixXb3JrZXI6MzJ9O1dlYkluc3BlY3Rvci5UYXJnZXQuX25leHRJZD0xO1dlYkluc3BlY3Rvci5UYXJnZXQucHJvdG90eXBlPXtpZDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5faWQ7fSxuYW1lOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9uYW1lO30sdGFyZ2V0TWFuYWdlcjpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fdGFyZ2V0TWFuYWdlcjt9LGhhc0FsbENhcGFiaWxpdGllczpmdW5jdGlvbihjYXBhYmlsaXRpZXNNYXNrKQp7cmV0dXJuKHRoaXMuX2NhcGFiaWxpdGllc01hc2smY2FwYWJpbGl0aWVzTWFzayk9PT1jYXBhYmlsaXRpZXNNYXNrO30sY29ubmVjdGlvbjpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fY29ubmVjdGlvbjt9LGRlY29yYXRlTGFiZWw6ZnVuY3Rpb24obGFiZWwpCntyZXR1cm4hdGhpcy5oYXNCcm93c2VyQ2FwYWJpbGl0eSgpPyJcdTI2OTkgIitsYWJlbDpsYWJlbDt9LHJlZ2lzdGVyRGlzcGF0Y2hlcjpmdW5jdGlvbihkb21haW4sZGlzcGF0Y2hlcikKe3RoaXMuX2Nvbm5lY3Rpb24ucmVnaXN0ZXJEaXNwYXRjaGVyKGRvbWFpbixkaXNwYXRjaGVyKTt9LGhhc0Jyb3dzZXJDYXBhYmlsaXR5OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhXZWJJbnNwZWN0b3IuVGFyZ2V0LkNhcGFiaWxpdHkuQnJvd3Nlcik7fSxoYXNKU0NhcGFiaWxpdHk6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuaGFzQWxsQ2FwYWJpbGl0aWVzKFdlYkluc3BlY3Rvci5UYXJnZXQuQ2FwYWJpbGl0eS5KUyk7fSxoYXNMb2dDYXBhYmlsaXR5OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhXZWJJbnNwZWN0b3IuVGFyZ2V0LkNhcGFiaWxpdHkuTG9nKTt9LGhhc05ldHdvcmtDYXBhYmlsaXR5OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhXZWJJbnNwZWN0b3IuVGFyZ2V0LkNhcGFiaWxpdHkuTmV0d29yayk7fSxoYXNXb3JrZXJDYXBhYmlsaXR5OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLmhhc0FsbENhcGFiaWxpdGllcyhXZWJJbnNwZWN0b3IuVGFyZ2V0LkNhcGFiaWxpdHkuV29ya2VyKTt9LGhhc0RPTUNhcGFiaWxpdHk6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuaGFzQWxsQ2FwYWJpbGl0aWVzKFdlYkluc3BlY3Rvci5UYXJnZXQuQ2FwYWJpbGl0eS5ET00pO30scGFyZW50VGFyZ2V0OmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9wYXJlbnRUYXJnZXQ7fSxfb25EaXNjb25uZWN0OmZ1bmN0aW9uKCkKe3RoaXMuX3RhcmdldE1hbmFnZXIucmVtb3ZlVGFyZ2V0KHRoaXMpO3RoaXMuX2Rpc3Bvc2UoKTt9LF9kaXNwb3NlOmZ1bmN0aW9uKCkKe3RoaXMuX3RhcmdldE1hbmFnZXIuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdlYkluc3BlY3Rvci5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5UYXJnZXREaXNwb3NlZCx0aGlzKTtpZih0aGlzLndvcmtlck1hbmFnZXIpCnRoaXMud29ya2VyTWFuYWdlci5kaXNwb3NlKCk7fSxpc0RldGFjaGVkOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9jb25uZWN0aW9uLmlzQ2xvc2VkKCk7fSxtb2RlbDpmdW5jdGlvbihtb2RlbENsYXNzKQp7cmV0dXJuIHRoaXMuX21vZGVsQnlDb25zdHJ1Y3Rvci5nZXQobW9kZWxDbGFzcyl8fG51bGw7fSxtb2RlbHM6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX21vZGVsQnlDb25zdHJ1Y3Rvci52YWx1ZXNBcnJheSgpO30saW5zcGVjdGVkVVJMOmZ1bmN0aW9uKCkKe3JldHVybiB0aGlzLl9pbnNwZWN0ZWRVUkw7fSxzZXRJbnNwZWN0ZWRVUkw6ZnVuY3Rpb24oaW5zcGVjdGVkVVJMKQp7dGhpcy5faW5zcGVjdGVkVVJMPWluc3BlY3RlZFVSTDtJbnNwZWN0b3JGcm9udGVuZEhvc3QuaW5zcGVjdGVkVVJMQ2hhbmdlZChpbnNwZWN0ZWRVUkx8fCIiKTt0aGlzLl90YXJnZXRNYW5hZ2VyLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXZWJJbnNwZWN0b3IuVGFyZ2V0TWFuYWdlci5FdmVudHMuSW5zcGVjdGVkVVJMQ2hhbmdlZCx0aGlzKTt9LF9fcHJvdG9fXzpQcm90b2NvbC5BZ2VudHMucHJvdG90eXBlfTtXZWJJbnNwZWN0b3IuU0RLT2JqZWN0PWZ1bmN0aW9uKHRhcmdldCkKe1dlYkluc3BlY3Rvci5PYmplY3QuY2FsbCh0aGlzKTt0aGlzLl90YXJnZXQ9dGFyZ2V0O307V2ViSW5zcGVjdG9yLlNES09iamVjdC5wcm90b3R5cGU9e3RhcmdldDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5fdGFyZ2V0O30sX19wcm90b19fOldlYkluc3BlY3Rvci5PYmplY3QucHJvdG90eXBlfTtXZWJJbnNwZWN0b3IuU0RLTW9kZWw9ZnVuY3Rpb24obW9kZWxDbGFzcyx0YXJnZXQpCntXZWJJbnNwZWN0b3IuU0RLT2JqZWN0LmNhbGwodGhpcyx0YXJnZXQpO3RhcmdldC5fbW9kZWxCeUNvbnN0cnVjdG9yLnNldChtb2RlbENsYXNzLHRoaXMpO1dlYkluc3BlY3Rvci50YXJnZXRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuRXZlbnRzLlRhcmdldERpc3Bvc2VkLHRoaXMuX3RhcmdldERpc3Bvc2VkLHRoaXMpO307V2ViSW5zcGVjdG9yLlNES01vZGVsLnByb3RvdHlwZT17c3VzcGVuZE1vZGVsOmZ1bmN0aW9uKCkKe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9LHJlc3VtZU1vZGVsOmZ1bmN0aW9uKCkKe3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9LF90YXJnZXREaXNwb3NlZDpmdW5jdGlvbihldmVudCkKe3ZhciB0YXJnZXQ9ZXZlbnQuZGF0YTtpZih0YXJnZXQhPT10aGlzLl90YXJnZXQpCnJldHVybjt0aGlzLmRpc3Bvc2UoKTtXZWJJbnNwZWN0b3IudGFyZ2V0TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKFdlYkluc3BlY3Rvci5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5UYXJnZXREaXNwb3NlZCx0aGlzLl90YXJnZXREaXNwb3NlZCx0aGlzKTt9LF9fcHJvdG9fXzpXZWJJbnNwZWN0b3IuU0RLT2JqZWN0LnByb3RvdHlwZX07fSx7fV0sMTE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtXZWJJbnNwZWN0b3IuVGFyZ2V0TWFuYWdlcj1mdW5jdGlvbigpCntXZWJJbnNwZWN0b3IuT2JqZWN0LmNhbGwodGhpcyk7dGhpcy5fdGFyZ2V0cz1bXTt0aGlzLl9vYnNlcnZlcnM9W107dGhpcy5fb2JzZXJ2ZXJDYXBhYmlsaWVzTWFza1N5bWJvbD1TeW1ib2woIm9ic2VydmVyQ2FwYWJpbGl0aWVzTWFzayIpO3RoaXMuX21vZGVsTGlzdGVuZXJzPW5ldyBNYXAoKTt0aGlzLl9pc1N1c3BlbmRlZD1mYWxzZTt9O1dlYkluc3BlY3Rvci5UYXJnZXRNYW5hZ2VyLkV2ZW50cz17SW5zcGVjdGVkVVJMQ2hhbmdlZDpTeW1ib2woIkluc3BlY3RlZFVSTENoYW5nZWQiKSxNYWluRnJhbWVOYXZpZ2F0ZWQ6U3ltYm9sKCJNYWluRnJhbWVOYXZpZ2F0ZWQiKSxMb2FkOlN5bWJvbCgiTG9hZCIpLFBhZ2VSZWxvYWRSZXF1ZXN0ZWQ6U3ltYm9sKCJQYWdlUmVsb2FkUmVxdWVzdGVkIiksV2lsbFJlbG9hZFBhZ2U6U3ltYm9sKCJXaWxsUmVsb2FkUGFnZSIpLFRhcmdldERpc3Bvc2VkOlN5bWJvbCgiVGFyZ2V0RGlzcG9zZWQiKSxTdXNwZW5kU3RhdGVDaGFuZ2VkOlN5bWJvbCgiU3VzcGVuZFN0YXRlQ2hhbmdlZCIpfTtXZWJJbnNwZWN0b3IuVGFyZ2V0TWFuYWdlci5fbGlzdGVuZXJzU3ltYm9sPVN5bWJvbCgiV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuTGlzdGVuZXJzIik7V2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIucHJvdG90eXBlPXtzdXNwZW5kQWxsVGFyZ2V0czpmdW5jdGlvbigpCntpZih0aGlzLl9pc1N1c3BlbmRlZCkKcmV0dXJuO3RoaXMuX2lzU3VzcGVuZGVkPXRydWU7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuRXZlbnRzLlN1c3BlbmRTdGF0ZUNoYW5nZWQpO2Zvcih2YXIgaT0wO2k8dGhpcy5fdGFyZ2V0cy5sZW5ndGg7KytpKXtmb3IodmFyIG1vZGVsIG9mIHRoaXMuX3RhcmdldHNbaV0ubW9kZWxzKCkpCm1vZGVsLnN1c3BlbmRNb2RlbCgpO319LHJlc3VtZUFsbFRhcmdldHM6ZnVuY3Rpb24oKQp7aWYoIXRoaXMuX2lzU3VzcGVuZGVkKQp0aHJvdyBuZXcgRXJyb3IoIk5vdCBzdXNwZW5kZWQiKTt0aGlzLl9pc1N1c3BlbmRlZD1mYWxzZTt0aGlzLmRpc3BhdGNoRXZlbnRUb0xpc3RlbmVycyhXZWJJbnNwZWN0b3IuVGFyZ2V0TWFuYWdlci5FdmVudHMuU3VzcGVuZFN0YXRlQ2hhbmdlZCk7dmFyIHByb21pc2VzPVtdO2Zvcih2YXIgaT0wO2k8dGhpcy5fdGFyZ2V0cy5sZW5ndGg7KytpKXtmb3IodmFyIG1vZGVsIG9mIHRoaXMuX3RhcmdldHNbaV0ubW9kZWxzKCkpCnByb21pc2VzLnB1c2gobW9kZWwucmVzdW1lTW9kZWwoKSk7fQpyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO30sc3VzcGVuZEFuZFJlc3VtZUFsbFRhcmdldHM6ZnVuY3Rpb24oKQp7dGhpcy5zdXNwZW5kQWxsVGFyZ2V0cygpO3RoaXMucmVzdW1lQWxsVGFyZ2V0cygpO30sYWxsVGFyZ2V0c1N1c3BlbmRlZDpmdW5jdGlvbigpCntyZXR1cm4gdGhpcy5faXNTdXNwZW5kZWQ7fSxpbnNwZWN0ZWRVUkw6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3RhcmdldHNbMF0/dGhpcy5fdGFyZ2V0c1swXS5pbnNwZWN0ZWRVUkwoKToiIjt9LF9yZWRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oZXZlbnROYW1lLGV2ZW50KQp7dGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoZXZlbnROYW1lLGV2ZW50LmRhdGEpO30scmVsb2FkUGFnZTpmdW5jdGlvbihieXBhc3NDYWNoZSxpbmplY3RlZFNjcmlwdCkKe2lmKCF0aGlzLl90YXJnZXRzLmxlbmd0aCkKcmV0dXJuO3ZhciByZXNvdXJjZVRyZWVNb2RlbD1XZWJJbnNwZWN0b3IuUmVzb3VyY2VUcmVlTW9kZWwuZnJvbVRhcmdldCh0aGlzLl90YXJnZXRzWzBdKTtpZighcmVzb3VyY2VUcmVlTW9kZWwpCnJldHVybjtyZXNvdXJjZVRyZWVNb2RlbC5yZWxvYWRQYWdlKGJ5cGFzc0NhY2hlLGluamVjdGVkU2NyaXB0KTt9LGFkZE1vZGVsTGlzdGVuZXI6ZnVuY3Rpb24obW9kZWxDbGFzcyxldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCkKe2Zvcih2YXIgaT0wO2k8dGhpcy5fdGFyZ2V0cy5sZW5ndGg7KytpKXt2YXIgbW9kZWw9dGhpcy5fdGFyZ2V0c1tpXS5tb2RlbChtb2RlbENsYXNzKTtpZihtb2RlbCkKbW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCk7fQppZighdGhpcy5fbW9kZWxMaXN0ZW5lcnMuaGFzKGV2ZW50VHlwZSkpCnRoaXMuX21vZGVsTGlzdGVuZXJzLnNldChldmVudFR5cGUsW10pO3RoaXMuX21vZGVsTGlzdGVuZXJzLmdldChldmVudFR5cGUpLnB1c2goe21vZGVsQ2xhc3M6bW9kZWxDbGFzcyx0aGlzT2JqZWN0OnRoaXNPYmplY3QsbGlzdGVuZXI6bGlzdGVuZXJ9KTt9LHJlbW92ZU1vZGVsTGlzdGVuZXI6ZnVuY3Rpb24obW9kZWxDbGFzcyxldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCkKe2lmKCF0aGlzLl9tb2RlbExpc3RlbmVycy5oYXMoZXZlbnRUeXBlKSkKcmV0dXJuO2Zvcih2YXIgaT0wO2k8dGhpcy5fdGFyZ2V0cy5sZW5ndGg7KytpKXt2YXIgbW9kZWw9dGhpcy5fdGFyZ2V0c1tpXS5tb2RlbChtb2RlbENsYXNzKTtpZihtb2RlbCkKbW9kZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsbGlzdGVuZXIsdGhpc09iamVjdCk7fQp2YXIgbGlzdGVuZXJzPXRoaXMuX21vZGVsTGlzdGVuZXJzLmdldChldmVudFR5cGUpO2Zvcih2YXIgaT0wO2k8bGlzdGVuZXJzLmxlbmd0aDsrK2kpe2lmKGxpc3RlbmVyc1tpXS5tb2RlbENsYXNzPT09bW9kZWxDbGFzcyYmbGlzdGVuZXJzW2ldLmxpc3RlbmVyPT09bGlzdGVuZXImJmxpc3RlbmVyc1tpXS50aGlzT2JqZWN0PT09dGhpc09iamVjdCkKbGlzdGVuZXJzLnNwbGljZShpLS0sMSk7fQppZighbGlzdGVuZXJzLmxlbmd0aCkKdGhpcy5fbW9kZWxMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50VHlwZSk7fSxvYnNlcnZlVGFyZ2V0czpmdW5jdGlvbih0YXJnZXRPYnNlcnZlcixjYXBhYmlsaXRpZXNNYXNrKQp7aWYodGhpcy5fb2JzZXJ2ZXJDYXBhYmlsaWVzTWFza1N5bWJvbCBpbiB0YXJnZXRPYnNlcnZlcikKdGhyb3cgbmV3IEVycm9yKCJPYnNlcnZlciBjYW4gb25seSBiZSByZWdpc3RlcmVkIG9uY2UiKTt0YXJnZXRPYnNlcnZlclt0aGlzLl9vYnNlcnZlckNhcGFiaWxpZXNNYXNrU3ltYm9sXT1jYXBhYmlsaXRpZXNNYXNrfHwwO3RoaXMudGFyZ2V0cyhjYXBhYmlsaXRpZXNNYXNrKS5mb3JFYWNoKHRhcmdldE9ic2VydmVyLnRhcmdldEFkZGVkLmJpbmQodGFyZ2V0T2JzZXJ2ZXIpKTt0aGlzLl9vYnNlcnZlcnMucHVzaCh0YXJnZXRPYnNlcnZlcik7fSx1bm9ic2VydmVUYXJnZXRzOmZ1bmN0aW9uKHRhcmdldE9ic2VydmVyKQp7ZGVsZXRlIHRhcmdldE9ic2VydmVyW3RoaXMuX29ic2VydmVyQ2FwYWJpbGllc01hc2tTeW1ib2xdO3RoaXMuX29ic2VydmVycy5yZW1vdmUodGFyZ2V0T2JzZXJ2ZXIpO30sY3JlYXRlVGFyZ2V0OmZ1bmN0aW9uKG5hbWUsY2FwYWJpbGl0aWVzTWFzayxjb25uZWN0aW9uLHBhcmVudFRhcmdldCkKe3ZhciB0YXJnZXQ9bmV3IFdlYkluc3BlY3Rvci5UYXJnZXQodGhpcyxuYW1lLGNhcGFiaWxpdGllc01hc2ssY29ubmVjdGlvbixwYXJlbnRUYXJnZXQpO3ZhciBsb2dBZ2VudD10YXJnZXQuaGFzTG9nQ2FwYWJpbGl0eSgpP3RhcmdldC5sb2dBZ2VudCgpOm51bGw7dGFyZ2V0LmNvbnNvbGVNb2RlbD1uZXcgV2ViSW5zcGVjdG9yLkNvbnNvbGVNb2RlbCh0YXJnZXQsbG9nQWdlbnQpO3RhcmdldC5ydW50aW1lTW9kZWw9bmV3IFdlYkluc3BlY3Rvci5SdW50aW1lTW9kZWwodGFyZ2V0KTt2YXIgbmV0d29ya01hbmFnZXI9bnVsbDt2YXIgcmVzb3VyY2VUcmVlTW9kZWw9bnVsbDtpZih0YXJnZXQuaGFzTmV0d29ya0NhcGFiaWxpdHkoKSkKbmV0d29ya01hbmFnZXI9bmV3IFdlYkluc3BlY3Rvci5OZXR3b3JrTWFuYWdlcih0YXJnZXQpO2lmKG5ldHdvcmtNYW5hZ2VyJiZ0YXJnZXQuaGFzRE9NQ2FwYWJpbGl0eSgpKXtyZXNvdXJjZVRyZWVNb2RlbD1uZXcgV2ViSW5zcGVjdG9yLlJlc291cmNlVHJlZU1vZGVsKHRhcmdldCxuZXR3b3JrTWFuYWdlcixXZWJJbnNwZWN0b3IuU2VjdXJpdHlPcmlnaW5NYW5hZ2VyLmZyb21UYXJnZXQodGFyZ2V0KSk7bmV3IFdlYkluc3BlY3Rvci5OZXR3b3JrTG9nKHRhcmdldCxyZXNvdXJjZVRyZWVNb2RlbCxuZXR3b3JrTWFuYWdlcik7fQppZih0YXJnZXQuaGFzSlNDYXBhYmlsaXR5KCkpCm5ldyBXZWJJbnNwZWN0b3IuRGVidWdnZXJNb2RlbCh0YXJnZXQpO2lmKHJlc291cmNlVHJlZU1vZGVsKXt2YXIgZG9tTW9kZWw9bmV3IFdlYkluc3BlY3Rvci5ET01Nb2RlbCh0YXJnZXQpO25ldyBXZWJJbnNwZWN0b3IuQ1NTTW9kZWwodGFyZ2V0LGRvbU1vZGVsKTt9CnRhcmdldC53b3JrZXJNYW5hZ2VyPXRhcmdldC5oYXNXb3JrZXJDYXBhYmlsaXR5KCk/bmV3IFdlYkluc3BlY3Rvci5Xb3JrZXJNYW5hZ2VyKHRhcmdldCk6bnVsbDt0YXJnZXQuY3B1UHJvZmlsZXJNb2RlbD1uZXcgV2ViSW5zcGVjdG9yLkNQVVByb2ZpbGVyTW9kZWwodGFyZ2V0KTt0YXJnZXQuaGVhcFByb2ZpbGVyTW9kZWw9bmV3IFdlYkluc3BlY3Rvci5IZWFwUHJvZmlsZXJNb2RlbCh0YXJnZXQpO3RhcmdldC50cmFjaW5nTWFuYWdlcj1uZXcgV2ViSW5zcGVjdG9yLlRyYWNpbmdNYW5hZ2VyKHRhcmdldCk7aWYodGFyZ2V0Lmhhc0Jyb3dzZXJDYXBhYmlsaXR5KCkpe3RhcmdldC5zdWJUYXJnZXRzTWFuYWdlcj1uZXcgV2ViSW5zcGVjdG9yLlN1YlRhcmdldHNNYW5hZ2VyKHRhcmdldCk7dGFyZ2V0LnNlcnZpY2VXb3JrZXJNYW5hZ2VyPW5ldyBXZWJJbnNwZWN0b3IuU2VydmljZVdvcmtlck1hbmFnZXIodGFyZ2V0LHRhcmdldC5zdWJUYXJnZXRzTWFuYWdlcik7fQp0aGlzLmFkZFRhcmdldCh0YXJnZXQpO3JldHVybiB0YXJnZXQ7fSxfb2JzZXJ2ZXJzRm9yVGFyZ2V0OmZ1bmN0aW9uKHRhcmdldCkKe3JldHVybiB0aGlzLl9vYnNlcnZlcnMuZmlsdGVyKG9ic2VydmVyPT50YXJnZXQuaGFzQWxsQ2FwYWJpbGl0aWVzKG9ic2VydmVyW3RoaXMuX29ic2VydmVyQ2FwYWJpbGllc01hc2tTeW1ib2xdfHwwKSk7fSxhZGRUYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0KQp7dGhpcy5fdGFyZ2V0cy5wdXNoKHRhcmdldCk7dmFyIHJlc291cmNlVHJlZU1vZGVsPVdlYkluc3BlY3Rvci5SZXNvdXJjZVRyZWVNb2RlbC5mcm9tVGFyZ2V0KHRhcmdldCk7aWYodGhpcy5fdGFyZ2V0cy5sZW5ndGg9PT0xJiZyZXNvdXJjZVRyZWVNb2RlbCl7cmVzb3VyY2VUcmVlTW9kZWxbV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuX2xpc3RlbmVyc1N5bWJvbF09W3NldHVwUmVkaXNwYXRjaC5jYWxsKHRoaXMsV2ViSW5zcGVjdG9yLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5NYWluRnJhbWVOYXZpZ2F0ZWQsV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuRXZlbnRzLk1haW5GcmFtZU5hdmlnYXRlZCksc2V0dXBSZWRpc3BhdGNoLmNhbGwodGhpcyxXZWJJbnNwZWN0b3IuUmVzb3VyY2VUcmVlTW9kZWwuRXZlbnRzLkxvYWQsV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuRXZlbnRzLkxvYWQpLHNldHVwUmVkaXNwYXRjaC5jYWxsKHRoaXMsV2ViSW5zcGVjdG9yLlJlc291cmNlVHJlZU1vZGVsLkV2ZW50cy5QYWdlUmVsb2FkUmVxdWVzdGVkLFdlYkluc3BlY3Rvci5UYXJnZXRNYW5hZ2VyLkV2ZW50cy5QYWdlUmVsb2FkUmVxdWVzdGVkKSxzZXR1cFJlZGlzcGF0Y2guY2FsbCh0aGlzLFdlYkluc3BlY3Rvci5SZXNvdXJjZVRyZWVNb2RlbC5FdmVudHMuV2lsbFJlbG9hZFBhZ2UsV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuRXZlbnRzLldpbGxSZWxvYWRQYWdlKV07fQp2YXIgY29weT10aGlzLl9vYnNlcnZlcnNGb3JUYXJnZXQodGFyZ2V0KTtmb3IodmFyIGk9MDtpPGNvcHkubGVuZ3RoOysraSkKY29weVtpXS50YXJnZXRBZGRlZCh0YXJnZXQpO2Zvcih2YXIgcGFpciBvZiB0aGlzLl9tb2RlbExpc3RlbmVycyl7dmFyIGxpc3RlbmVycz1wYWlyWzFdO2Zvcih2YXIgaT0wO2k8bGlzdGVuZXJzLmxlbmd0aDsrK2kpe3ZhciBtb2RlbD10YXJnZXQubW9kZWwobGlzdGVuZXJzW2ldLm1vZGVsQ2xhc3MpO2lmKG1vZGVsKQptb2RlbC5hZGRFdmVudExpc3RlbmVyKHBhaXJbMF0sbGlzdGVuZXJzW2ldLmxpc3RlbmVyLGxpc3RlbmVyc1tpXS50aGlzT2JqZWN0KTt9fQpmdW5jdGlvbiBzZXR1cFJlZGlzcGF0Y2goc291cmNlRXZlbnQsdGFyZ2V0RXZlbnQpCntyZXR1cm4gcmVzb3VyY2VUcmVlTW9kZWwuYWRkRXZlbnRMaXN0ZW5lcihzb3VyY2VFdmVudCx0aGlzLl9yZWRpc3BhdGNoRXZlbnQuYmluZCh0aGlzLHRhcmdldEV2ZW50KSk7fX0scmVtb3ZlVGFyZ2V0OmZ1bmN0aW9uKHRhcmdldCkKe3RoaXMuX3RhcmdldHMucmVtb3ZlKHRhcmdldCk7dmFyIHJlc291cmNlVHJlZU1vZGVsPVdlYkluc3BlY3Rvci5SZXNvdXJjZVRyZWVNb2RlbC5mcm9tVGFyZ2V0KHRhcmdldCk7dmFyIHRyZWVNb2RlbExpc3RlbmVycz1yZXNvdXJjZVRyZWVNb2RlbCYmcmVzb3VyY2VUcmVlTW9kZWxbV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIuX2xpc3RlbmVyc1N5bWJvbF07aWYodHJlZU1vZGVsTGlzdGVuZXJzKQpXZWJJbnNwZWN0b3IuRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcnModHJlZU1vZGVsTGlzdGVuZXJzKTt2YXIgY29weT10aGlzLl9vYnNlcnZlcnNGb3JUYXJnZXQodGFyZ2V0KTtmb3IodmFyIGk9MDtpPGNvcHkubGVuZ3RoOysraSkKY29weVtpXS50YXJnZXRSZW1vdmVkKHRhcmdldCk7Zm9yKHZhciBwYWlyIG9mIHRoaXMuX21vZGVsTGlzdGVuZXJzKXt2YXIgbGlzdGVuZXJzPXBhaXJbMV07Zm9yKHZhciBpPTA7aTxsaXN0ZW5lcnMubGVuZ3RoOysraSl7dmFyIG1vZGVsPXRhcmdldC5tb2RlbChsaXN0ZW5lcnNbaV0ubW9kZWxDbGFzcyk7aWYobW9kZWwpCm1vZGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIocGFpclswXSxsaXN0ZW5lcnNbaV0ubGlzdGVuZXIsbGlzdGVuZXJzW2ldLnRoaXNPYmplY3QpO319fSx0YXJnZXRzOmZ1bmN0aW9uKGNhcGFiaWxpdGllc01hc2spCntpZighY2FwYWJpbGl0aWVzTWFzaykKcmV0dXJuIHRoaXMuX3RhcmdldHMuc2xpY2UoKTtlbHNlCnJldHVybiB0aGlzLl90YXJnZXRzLmZpbHRlcih0YXJnZXQ9PnRhcmdldC5oYXNBbGxDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzTWFza3x8MCkpO30sdGFyZ2V0QnlJZDpmdW5jdGlvbihpZCkKe2Zvcih2YXIgaT0wO2k8dGhpcy5fdGFyZ2V0cy5sZW5ndGg7KytpKXtpZih0aGlzLl90YXJnZXRzW2ldLmlkKCk9PT1pZCkKcmV0dXJuIHRoaXMuX3RhcmdldHNbaV07fQpyZXR1cm4gbnVsbDt9LG1haW5UYXJnZXQ6ZnVuY3Rpb24oKQp7cmV0dXJuIHRoaXMuX3RhcmdldHNbMF18fG51bGw7fSxzdXNwZW5kUmVsb2FkOmZ1bmN0aW9uKHRhcmdldCkKe3ZhciByZXNvdXJjZVRyZWVNb2RlbD1XZWJJbnNwZWN0b3IuUmVzb3VyY2VUcmVlTW9kZWwuZnJvbVRhcmdldCh0YXJnZXQpO2lmKHJlc291cmNlVHJlZU1vZGVsKQpyZXNvdXJjZVRyZWVNb2RlbC5zdXNwZW5kUmVsb2FkKCk7fSxyZXN1bWVSZWxvYWQ6ZnVuY3Rpb24odGFyZ2V0KQp7dmFyIHJlc291cmNlVHJlZU1vZGVsPVdlYkluc3BlY3Rvci5SZXNvdXJjZVRyZWVNb2RlbC5mcm9tVGFyZ2V0KHRhcmdldCk7aWYocmVzb3VyY2VUcmVlTW9kZWwpCnNldEltbWVkaWF0ZShyZXNvdXJjZVRyZWVNb2RlbC5yZXN1bWVSZWxvYWQuYmluZChyZXNvdXJjZVRyZWVNb2RlbCkpO30sX19wcm90b19fOldlYkluc3BlY3Rvci5PYmplY3QucHJvdG90eXBlfTtXZWJJbnNwZWN0b3IuVGFyZ2V0TWFuYWdlci5PYnNlcnZlcj1mdW5jdGlvbigpCnt9O1dlYkluc3BlY3Rvci5UYXJnZXRNYW5hZ2VyLk9ic2VydmVyLnByb3RvdHlwZT17dGFyZ2V0QWRkZWQ6ZnVuY3Rpb24odGFyZ2V0KXt9LHRhcmdldFJlbW92ZWQ6ZnVuY3Rpb24odGFyZ2V0KXt9fTtXZWJJbnNwZWN0b3IudGFyZ2V0TWFuYWdlcj1uZXcgV2ViSW5zcGVjdG9yLlRhcmdldE1hbmFnZXIoKTt9LHt9XSwxMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1dlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlcj1mdW5jdGlvbihtb2RlbCxkZWxlZ2F0ZSkKe3RoaXMuX21vZGVsPW1vZGVsO3RoaXMuX2RlbGVnYXRlPWRlbGVnYXRlO3RoaXMuX2NhbmNlbGVkQ2FsbGJhY2s9bnVsbDt0aGlzLl9zdGF0ZT1XZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIuU3RhdGUuSW5pdGlhbDt0aGlzLl9idWZmZXI9IiI7dGhpcy5fZmlyc3RDaHVuaz10cnVlO3RoaXMuX2xvYWRlZEJ5dGVzPTA7dGhpcy5fdG90YWxTaXplO3RoaXMuX2pzb25Ub2tlbml6ZXI9bmV3IFdlYkluc3BlY3Rvci5UZXh0VXRpbHMuQmFsYW5jZWRKU09OVG9rZW5pemVyKHRoaXMuX3dyaXRlQmFsYW5jZWRKU09OLmJpbmQodGhpcyksdHJ1ZSk7fTtXZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIubG9hZEZyb21GaWxlPWZ1bmN0aW9uKG1vZGVsLGZpbGUsZGVsZWdhdGUpCnt2YXIgbG9hZGVyPW5ldyBXZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIobW9kZWwsZGVsZWdhdGUpO3ZhciBmaWxlUmVhZGVyPVdlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlci5fY3JlYXRlRmlsZVJlYWRlcihmaWxlLGxvYWRlcik7bG9hZGVyLl9jYW5jZWxlZENhbGxiYWNrPWZpbGVSZWFkZXIuY2FuY2VsLmJpbmQoZmlsZVJlYWRlcik7bG9hZGVyLl90b3RhbFNpemU9ZmlsZS5zaXplO2ZpbGVSZWFkZXIuc3RhcnQobG9hZGVyKTtyZXR1cm4gbG9hZGVyO307V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLmxvYWRGcm9tVVJMPWZ1bmN0aW9uKG1vZGVsLHVybCxkZWxlZ2F0ZSkKe3ZhciBzdHJlYW09bmV3IFdlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlcihtb2RlbCxkZWxlZ2F0ZSk7V2ViSW5zcGVjdG9yLlJlc291cmNlTG9hZGVyLmxvYWRBc1N0cmVhbSh1cmwsbnVsbCxzdHJlYW0pO3JldHVybiBzdHJlYW07fTtXZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIuVHJhbnNmZXJDaHVua0xlbmd0aEJ5dGVzPTUwMDAwMDA7V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLl9jcmVhdGVGaWxlUmVhZGVyPWZ1bmN0aW9uKGZpbGUsZGVsZWdhdGUpCntyZXR1cm4gbmV3IFdlYkluc3BlY3Rvci5DaHVua2VkRmlsZVJlYWRlcihmaWxlLFdlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlci5UcmFuc2ZlckNodW5rTGVuZ3RoQnl0ZXMsZGVsZWdhdGUpO307V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLlN0YXRlPXtJbml0aWFsOlN5bWJvbCgiSW5pdGlhbCIpLExvb2tpbmdGb3JFdmVudHM6U3ltYm9sKCJMb29raW5nRm9yRXZlbnRzIiksUmVhZGluZ0V2ZW50czpTeW1ib2woIlJlYWRpbmdFdmVudHMiKSxTa2lwcGluZ1RhaWw6U3ltYm9sKCJTa2lwcGluZ1RhaWwiKX07V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLnByb3RvdHlwZT17Y2FuY2VsOmZ1bmN0aW9uKCkKe3RoaXMuX21vZGVsLnJlc2V0KCk7dGhpcy5fZGVsZWdhdGUubG9hZGluZ0NvbXBsZXRlKGZhbHNlKTt0aGlzLl9kZWxlZ2F0ZT1udWxsO2lmKHRoaXMuX2NhbmNlbGVkQ2FsbGJhY2spCnRoaXMuX2NhbmNlbGVkQ2FsbGJhY2soKTt9LHdyaXRlOmZ1bmN0aW9uKGNodW5rKQp7aWYoIXRoaXMuX2RlbGVnYXRlKQpyZXR1cm47dGhpcy5fbG9hZGVkQnl0ZXMrPWNodW5rLmxlbmd0aDtpZighdGhpcy5fZmlyc3RDaHVuaykKdGhpcy5fZGVsZWdhdGUubG9hZGluZ1Byb2dyZXNzKHRoaXMuX3RvdGFsU2l6ZT90aGlzLl9sb2FkZWRCeXRlcy90aGlzLl90b3RhbFNpemU6dW5kZWZpbmVkKTtpZih0aGlzLl9zdGF0ZT09PVdlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlci5TdGF0ZS5Jbml0aWFsKXtpZihjaHVua1swXT09PSJ7IikKdGhpcy5fc3RhdGU9V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLlN0YXRlLkxvb2tpbmdGb3JFdmVudHM7ZWxzZQppZihjaHVua1swXT09PSJbIikKdGhpcy5fc3RhdGU9V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlJlYWRpbmdFdmVudHM7ZWxzZQp7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKFdlYkluc3BlY3Rvci5VSVN0cmluZygiTWFsZm9ybWVkIHRpbWVsaW5lIGRhdGE6IFVua25vd24gSlNPTiBmb3JtYXQiKSk7cmV0dXJuO319CmlmKHRoaXMuX3N0YXRlPT09V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLlN0YXRlLkxvb2tpbmdGb3JFdmVudHMpe3ZhciBvYmplY3ROYW1lPSJcInRyYWNlRXZlbnRzXCI6Ijt2YXIgc3RhcnRQb3M9dGhpcy5fYnVmZmVyLmxlbmd0aC1vYmplY3ROYW1lLmxlbmd0aDt0aGlzLl9idWZmZXIrPWNodW5rO3ZhciBwb3M9dGhpcy5fYnVmZmVyLmluZGV4T2Yob2JqZWN0TmFtZSxzdGFydFBvcyk7aWYocG9zPT09LTEpCnJldHVybjtjaHVuaz10aGlzLl9idWZmZXIuc2xpY2UocG9zK29iamVjdE5hbWUubGVuZ3RoKTt0aGlzLl9zdGF0ZT1XZWJJbnNwZWN0b3IuVGltZWxpbmVMb2FkZXIuU3RhdGUuUmVhZGluZ0V2ZW50czt9CmlmKHRoaXMuX3N0YXRlIT09V2ViSW5zcGVjdG9yLlRpbWVsaW5lTG9hZGVyLlN0YXRlLlJlYWRpbmdFdmVudHMpCnJldHVybjtpZih0aGlzLl9qc29uVG9rZW5pemVyLndyaXRlKGNodW5rKSkKcmV0dXJuO3RoaXMuX3N0YXRlPVdlYkluc3BlY3Rvci5UaW1lbGluZUxvYWRlci5TdGF0ZS5Ta2lwcGluZ1RhaWw7aWYodGhpcy5fZmlyc3RDaHVuayl7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKFdlYkluc3BlY3Rvci5VSVN0cmluZygiTWFsZm9ybWVkIHRpbWVsaW5lIGlucHV0LCB3cm9uZyBKU09OIGJyYWNrZXRzIGJhbGFuY2UiKSk7cmV0dXJuO319LF93cml0ZUJhbGFuY2VkSlNPTjpmdW5jdGlvbihkYXRhKQp7dmFyIGpzb249ZGF0YSsiXSI7aWYodGhpcy5fZmlyc3RDaHVuayl7dGhpcy5fZGVsZWdhdGUubG9hZGluZ1N0YXJ0ZWQoKTt9ZWxzZXt2YXIgY29tbWFJbmRleD1qc29uLmluZGV4T2YoIiwiKTtpZihjb21tYUluZGV4IT09LTEpCmpzb249anNvbi5zbGljZShjb21tYUluZGV4KzEpO2pzb249IlsiK2pzb247fQp2YXIgaXRlbXM7dHJ5e2l0ZW1zPUpTT04ucGFyc2UoanNvbik7fWNhdGNoKGUpe3RoaXMuX3JlcG9ydEVycm9yQW5kQ2FuY2VsTG9hZGluZyhXZWJJbnNwZWN0b3IuVUlTdHJpbmcoIk1hbGZvcm1lZCB0aW1lbGluZSBkYXRhOiAlcyIsZS50b1N0cmluZygpKSk7cmV0dXJuO30KaWYodGhpcy5fZmlyc3RDaHVuayl7dGhpcy5fZmlyc3RDaHVuaz1mYWxzZTt0aGlzLl9tb2RlbC5yZXNldCgpO2lmKHRoaXMuX2xvb2tzTGlrZUFwcFZlcnNpb24oaXRlbXNbMF0pKXt0aGlzLl9yZXBvcnRFcnJvckFuZENhbmNlbExvYWRpbmcoV2ViSW5zcGVjdG9yLlVJU3RyaW5nKCJMZWdhY3kgVGltZWxpbmUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIikpO3JldHVybjt9fQp0cnl7dGhpcy5fbW9kZWwuYWRkRXZlbnRzKGl0ZW1zKTt9Y2F0Y2goZSl7dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKFdlYkluc3BlY3Rvci5VSVN0cmluZygiTWFsZm9ybWVkIHRpbWVsaW5lIGRhdGE6ICVzIixlLnRvU3RyaW5nKCkpKTtyZXR1cm47fX0sX3JlcG9ydEVycm9yQW5kQ2FuY2VsTG9hZGluZzpmdW5jdGlvbihtZXNzYWdlKQp7aWYobWVzc2FnZSkKV2ViSW5zcGVjdG9yLmNvbnNvbGUuZXJyb3IobWVzc2FnZSk7dGhpcy5jYW5jZWwoKTt9LF9sb29rc0xpa2VBcHBWZXJzaW9uOmZ1bmN0aW9uKGl0ZW0pCntyZXR1cm4gdHlwZW9mIGl0ZW09PT0ic3RyaW5nIiYmaXRlbS5pbmRleE9mKCJDaHJvbWUiKSE9PS0xO30sY2xvc2U6ZnVuY3Rpb24oKQp7dGhpcy5fbW9kZWwudHJhY2luZ0NvbXBsZXRlKCk7aWYodGhpcy5fZGVsZWdhdGUpCnRoaXMuX2RlbGVnYXRlLmxvYWRpbmdDb21wbGV0ZSh0cnVlKTt9LG9uVHJhbnNmZXJTdGFydGVkOmZ1bmN0aW9uKCl7fSxvbkNodW5rVHJhbnNmZXJyZWQ6ZnVuY3Rpb24ocmVhZGVyKXt9LG9uVHJhbnNmZXJGaW5pc2hlZDpmdW5jdGlvbigpe30sb25FcnJvcjpmdW5jdGlvbihyZWFkZXIsZXZlbnQpCntzd2l0Y2goZXZlbnQudGFyZ2V0LmVycm9yLm5hbWUpe2Nhc2UiTm90Rm91bmRFcnJvciI6dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKFdlYkluc3BlY3Rvci5VSVN0cmluZygiRmlsZSBcIiVzXCIgbm90IGZvdW5kLiIscmVhZGVyLmZpbGVOYW1lKCkpKTticmVhaztjYXNlIk5vdFJlYWRhYmxlRXJyb3IiOnRoaXMuX3JlcG9ydEVycm9yQW5kQ2FuY2VsTG9hZGluZyhXZWJJbnNwZWN0b3IuVUlTdHJpbmcoIkZpbGUgXCIlc1wiIGlzIG5vdCByZWFkYWJsZSIscmVhZGVyLmZpbGVOYW1lKCkpKTticmVhaztjYXNlIkFib3J0RXJyb3IiOmJyZWFrO2RlZmF1bHQ6dGhpcy5fcmVwb3J0RXJyb3JBbmRDYW5jZWxMb2FkaW5nKFdlYkluc3BlY3Rvci5VSVN0cmluZygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgZmlsZSBcIiVzXCIiLHJlYWRlci5maWxlTmFtZSgpKSk7fX19O1dlYkluc3BlY3Rvci5UcmFjaW5nVGltZWxpbmVTYXZlcj1mdW5jdGlvbigpCnt9O1dlYkluc3BlY3Rvci5UcmFjaW5nVGltZWxpbmVTYXZlci5wcm90b3R5cGU9e29uVHJhbnNmZXJTdGFydGVkOmZ1bmN0aW9uKCl7fSxvblRyYW5zZmVyRmluaXNoZWQ6ZnVuY3Rpb24oKXt9LG9uQ2h1bmtUcmFuc2ZlcnJlZDpmdW5jdGlvbihyZWFkZXIpe30sb25FcnJvcjpmdW5jdGlvbihyZWFkZXIsZXZlbnQpCnt2YXIgZXJyb3I9ZXZlbnQudGFyZ2V0LmVycm9yO1dlYkluc3BlY3Rvci5jb25zb2xlLmVycm9yKFdlYkluc3BlY3Rvci5VSVN0cmluZygiRmFpbGVkIHRvIHNhdmUgdGltZWxpbmU6ICVzICglcywgJXMpIixlcnJvci5tZXNzYWdlLGVycm9yLm5hbWUsZXJyb3IuY29kZSkpO319O30se31dLDExNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpe2V4cG9ydHM9bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgnLi9kZWJ1ZycpO2V4cG9ydHMubG9nPWxvZztleHBvcnRzLmZvcm1hdEFyZ3M9Zm9ybWF0QXJncztleHBvcnRzLnNhdmU9c2F2ZTtleHBvcnRzLmxvYWQ9bG9hZDtleHBvcnRzLnVzZUNvbG9ycz11c2VDb2xvcnM7ZXhwb3J0cy5zdG9yYWdlPSd1bmRlZmluZWQnIT10eXBlb2YgY2hyb21lJiYndW5kZWZpbmVkJyE9dHlwZW9mIGNocm9tZS5zdG9yYWdlP2Nocm9tZS5zdG9yYWdlLmxvY2FsOmxvY2Fsc3RvcmFnZSgpO2V4cG9ydHMuY29sb3JzPVsnbGlnaHRzZWFncmVlbicsJ2ZvcmVzdGdyZWVuJywnZ29sZGVucm9kJywnZG9kZ2VyYmx1ZScsJ2RhcmtvcmNoaWQnLCdjcmltc29uJ107ZnVuY3Rpb24gdXNlQ29sb3JzKCl7aWYodHlwZW9mIHdpbmRvdyE9PSd1bmRlZmluZWQnJiZ3aW5kb3cucHJvY2VzcyYmd2luZG93LnByb2Nlc3MudHlwZT09PSdyZW5kZXJlcicpe3JldHVybiB0cnVlO30KcmV0dXJuIHR5cGVvZiBkb2N1bWVudCE9PSd1bmRlZmluZWQnJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3chPT0ndW5kZWZpbmVkJyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5maXJlYnVnfHx3aW5kb3cuY29uc29sZS5leGNlcHRpb24mJndpbmRvdy5jb25zb2xlLnRhYmxlKXx8dHlwZW9mIG5hdmlnYXRvciE9PSd1bmRlZmluZWQnJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykmJnBhcnNlSW50KFJlZ0V4cC4kMSwxMCk+PTMxfHx0eXBlb2YgbmF2aWdhdG9yIT09J3VuZGVmaW5lZCcmJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcLyhcZCspLyk7fQpleHBvcnRzLmZvcm1hdHRlcnMuaj1mdW5jdGlvbih2KXt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO31jYXRjaChlcnIpe3JldHVybidbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJytlcnIubWVzc2FnZTt9fTtmdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3Mpe3ZhciB1c2VDb2xvcnM9dGhpcy51c2VDb2xvcnM7YXJnc1swXT0odXNlQ29sb3JzPyclYyc6JycpKwp0aGlzLm5hbWVzcGFjZSsodXNlQ29sb3JzPycgJWMnOicgJykrCmFyZ3NbMF0rKHVzZUNvbG9ycz8nJWMgJzonICcpKycrJytleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7aWYoIXVzZUNvbG9ycylyZXR1cm47dmFyIGM9J2NvbG9yOiAnK3RoaXMuY29sb3I7YXJncy5zcGxpY2UoMSwwLGMsJ2NvbG9yOiBpbmhlcml0Jyk7dmFyIGluZGV4PTA7dmFyIGxhc3RDPTA7YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csZnVuY3Rpb24obWF0Y2gpe2lmKCclJSc9PT1tYXRjaClyZXR1cm47aW5kZXgrKztpZignJWMnPT09bWF0Y2gpe2xhc3RDPWluZGV4O319KTthcmdzLnNwbGljZShsYXN0QywwLGMpO30KZnVuY3Rpb24gbG9nKCl7cmV0dXJuJ29iamVjdCc9PT10eXBlb2YgY29uc29sZSYmY29uc29sZS5sb2cmJkZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLGNvbnNvbGUsYXJndW1lbnRzKTt9CmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcyl7dHJ5e2lmKG51bGw9PW5hbWVzcGFjZXMpe2V4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO31lbHNle2V4cG9ydHMuc3RvcmFnZS5kZWJ1Zz1uYW1lc3BhY2VzO319Y2F0Y2goZSl7fX0KZnVuY3Rpb24gbG9hZCgpe3ZhciByO3RyeXtyPWV4cG9ydHMuc3RvcmFnZS5kZWJ1Zzt9Y2F0Y2goZSl7fQppZighciYmdHlwZW9mIHByb2Nlc3MhPT0ndW5kZWZpbmVkJyYmJ2VudidpbiBwcm9jZXNzKXtyPXByb2Nlc3MuZW52LkRFQlVHO30KcmV0dXJuIHI7fQpleHBvcnRzLmVuYWJsZShsb2FkKCkpO2Z1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpe3RyeXtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTt9Y2F0Y2goZSl7fX19KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSk7fSx7Ii4vZGVidWciOjExNywiX3Byb2Nlc3MiOjc3fV0sMTE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzPW1vZHVsZS5leHBvcnRzPWNyZWF0ZURlYnVnLmRlYnVnPWNyZWF0ZURlYnVnWydkZWZhdWx0J109Y3JlYXRlRGVidWc7ZXhwb3J0cy5jb2VyY2U9Y29lcmNlO2V4cG9ydHMuZGlzYWJsZT1kaXNhYmxlO2V4cG9ydHMuZW5hYmxlPWVuYWJsZTtleHBvcnRzLmVuYWJsZWQ9ZW5hYmxlZDtleHBvcnRzLmh1bWFuaXplPXJlcXVpcmUoJ21zJyk7ZXhwb3J0cy5uYW1lcz1bXTtleHBvcnRzLnNraXBzPVtdO2V4cG9ydHMuZm9ybWF0dGVycz17fTt2YXIgcHJldlRpbWU7ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKXt2YXIgaGFzaD0wLGk7Zm9yKGkgaW4gbmFtZXNwYWNlKXtoYXNoPShoYXNoPDw1KS1oYXNoK25hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO2hhc2h8PTA7fQpyZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCklZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTt9CmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSl7ZnVuY3Rpb24gZGVidWcoKXtpZighZGVidWcuZW5hYmxlZClyZXR1cm47dmFyIHNlbGY9ZGVidWc7dmFyIGN1cnI9K25ldyBEYXRlKCk7dmFyIG1zPWN1cnItKHByZXZUaW1lfHxjdXJyKTtzZWxmLmRpZmY9bXM7c2VsZi5wcmV2PXByZXZUaW1lO3NlbGYuY3Vycj1jdXJyO3ByZXZUaW1lPWN1cnI7dmFyIGFyZ3M9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7aSsrKXthcmdzW2ldPWFyZ3VtZW50c1tpXTt9CmFyZ3NbMF09ZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7aWYoJ3N0cmluZychPT10eXBlb2YgYXJnc1swXSl7YXJncy51bnNoaWZ0KCclTycpO30KdmFyIGluZGV4PTA7YXJnc1swXT1hcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLGZ1bmN0aW9uKG1hdGNoLGZvcm1hdCl7aWYobWF0Y2g9PT0nJSUnKXJldHVybiBtYXRjaDtpbmRleCsrO3ZhciBmb3JtYXR0ZXI9ZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07aWYoJ2Z1bmN0aW9uJz09PXR5cGVvZiBmb3JtYXR0ZXIpe3ZhciB2YWw9YXJnc1tpbmRleF07bWF0Y2g9Zm9ybWF0dGVyLmNhbGwoc2VsZix2YWwpO2FyZ3Muc3BsaWNlKGluZGV4LDEpO2luZGV4LS07fQpyZXR1cm4gbWF0Y2g7fSk7ZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZixhcmdzKTt2YXIgbG9nRm49ZGVidWcubG9nfHxleHBvcnRzLmxvZ3x8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKTtsb2dGbi5hcHBseShzZWxmLGFyZ3MpO30KZGVidWcubmFtZXNwYWNlPW5hbWVzcGFjZTtkZWJ1Zy5lbmFibGVkPWV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO2RlYnVnLnVzZUNvbG9ycz1leHBvcnRzLnVzZUNvbG9ycygpO2RlYnVnLmNvbG9yPXNlbGVjdENvbG9yKG5hbWVzcGFjZSk7aWYoJ2Z1bmN0aW9uJz09PXR5cGVvZiBleHBvcnRzLmluaXQpe2V4cG9ydHMuaW5pdChkZWJ1Zyk7fQpyZXR1cm4gZGVidWc7fQpmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcyl7ZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO2V4cG9ydHMubmFtZXM9W107ZXhwb3J0cy5za2lwcz1bXTt2YXIgc3BsaXQ9KHR5cGVvZiBuYW1lc3BhY2VzPT09J3N0cmluZyc/bmFtZXNwYWNlczonJykuc3BsaXQoL1tccyxdKy8pO3ZhciBsZW49c3BsaXQubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bGVuO2krKyl7aWYoIXNwbGl0W2ldKWNvbnRpbnVlO25hbWVzcGFjZXM9c3BsaXRbaV0ucmVwbGFjZSgvXCovZywnLio/Jyk7aWYobmFtZXNwYWNlc1swXT09PSctJyl7ZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nK25hbWVzcGFjZXMuc3Vic3RyKDEpKyckJykpO31lbHNle2V4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJytuYW1lc3BhY2VzKyckJykpO319fQpmdW5jdGlvbiBkaXNhYmxlKCl7ZXhwb3J0cy5lbmFibGUoJycpO30KZnVuY3Rpb24gZW5hYmxlZChuYW1lKXt2YXIgaSxsZW47Zm9yKGk9MCxsZW49ZXhwb3J0cy5za2lwcy5sZW5ndGg7aTxsZW47aSsrKXtpZihleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpe3JldHVybiBmYWxzZTt9fQpmb3IoaT0wLGxlbj1leHBvcnRzLm5hbWVzLmxlbmd0aDtpPGxlbjtpKyspe2lmKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSl7cmV0dXJuIHRydWU7fX0KcmV0dXJuIGZhbHNlO30KZnVuY3Rpb24gY29lcmNlKHZhbCl7aWYodmFsIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIHZhbC5zdGFja3x8dmFsLm1lc3NhZ2U7cmV0dXJuIHZhbDt9fSx7Im1zIjoxMjh9XSwxMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKHR5cGVvZiBleHBvcnRzPT09J29iamVjdCcmJnR5cGVvZiBtb2R1bGU9PT0nb2JqZWN0JykKbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UKaWYodHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicmJmRlZmluZS5hbWQpCmRlZmluZShbXSxmYWN0b3J5KTtlbHNlCmlmKHR5cGVvZiBleHBvcnRzPT09J29iamVjdCcpCmV4cG9ydHNbImVzcHJpbWEiXT1mYWN0b3J5KCk7ZWxzZQpyb290WyJlc3ByaW1hIl09ZmFjdG9yeSgpO30pKHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obW9kdWxlcyl7dmFyIGluc3RhbGxlZE1vZHVsZXM9e307ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCl7aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCnJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO3ZhciBtb2R1bGU9aW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF09e2V4cG9ydHM6e30saWQ6bW9kdWxlSWQsbG9hZGVkOmZhbHNlfTttb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLG1vZHVsZSxtb2R1bGUuZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKTttb2R1bGUubG9hZGVkPXRydWU7cmV0dXJuIG1vZHVsZS5leHBvcnRzO30KX193ZWJwYWNrX3JlcXVpcmVfXy5tPW1vZHVsZXM7X193ZWJwYWNrX3JlcXVpcmVfXy5jPWluc3RhbGxlZE1vZHVsZXM7X193ZWJwYWNrX3JlcXVpcmVfXy5wPSIiO3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO30oW2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgY29tbWVudF9oYW5kbGVyXzE9X193ZWJwYWNrX3JlcXVpcmVfXygxKTt2YXIganN4X3BhcnNlcl8xPV9fd2VicGFja19yZXF1aXJlX18oMyk7dmFyIHBhcnNlcl8xPV9fd2VicGFja19yZXF1aXJlX18oOCk7dmFyIHRva2VuaXplcl8xPV9fd2VicGFja19yZXF1aXJlX18oMTUpO2Z1bmN0aW9uIHBhcnNlKGNvZGUsb3B0aW9ucyxkZWxlZ2F0ZSl7dmFyIGNvbW1lbnRIYW5kbGVyPW51bGw7dmFyIHByb3h5RGVsZWdhdGU9ZnVuY3Rpb24obm9kZSxtZXRhZGF0YSl7aWYoZGVsZWdhdGUpe2RlbGVnYXRlKG5vZGUsbWV0YWRhdGEpO30KaWYoY29tbWVudEhhbmRsZXIpe2NvbW1lbnRIYW5kbGVyLnZpc2l0KG5vZGUsbWV0YWRhdGEpO319O3ZhciBwYXJzZXJEZWxlZ2F0ZT10eXBlb2YgZGVsZWdhdGU9PT0nZnVuY3Rpb24nP3Byb3h5RGVsZWdhdGU6bnVsbDt2YXIgY29sbGVjdENvbW1lbnQ9ZmFsc2U7aWYob3B0aW9ucyl7Y29sbGVjdENvbW1lbnQ9dHlwZW9mIG9wdGlvbnMuY29tbWVudD09PSdib29sZWFuJyYmb3B0aW9ucy5jb21tZW50O3ZhciBhdHRhY2hDb21tZW50PXR5cGVvZiBvcHRpb25zLmF0dGFjaENvbW1lbnQ9PT0nYm9vbGVhbicmJm9wdGlvbnMuYXR0YWNoQ29tbWVudDtpZihjb2xsZWN0Q29tbWVudHx8YXR0YWNoQ29tbWVudCl7Y29tbWVudEhhbmRsZXI9bmV3IGNvbW1lbnRfaGFuZGxlcl8xLkNvbW1lbnRIYW5kbGVyKCk7Y29tbWVudEhhbmRsZXIuYXR0YWNoPWF0dGFjaENvbW1lbnQ7b3B0aW9ucy5jb21tZW50PXRydWU7cGFyc2VyRGVsZWdhdGU9cHJveHlEZWxlZ2F0ZTt9fQp2YXIgaXNNb2R1bGU9ZmFsc2U7aWYob3B0aW9ucyYmdHlwZW9mIG9wdGlvbnMuc291cmNlVHlwZT09PSdzdHJpbmcnKXtpc01vZHVsZT1vcHRpb25zLnNvdXJjZVR5cGU9PT0nbW9kdWxlJzt9CnZhciBwYXJzZXI7aWYob3B0aW9ucyYmdHlwZW9mIG9wdGlvbnMuanN4PT09J2Jvb2xlYW4nJiZvcHRpb25zLmpzeCl7cGFyc2VyPW5ldyBqc3hfcGFyc2VyXzEuSlNYUGFyc2VyKGNvZGUsb3B0aW9ucyxwYXJzZXJEZWxlZ2F0ZSk7fWVsc2UKe3BhcnNlcj1uZXcgcGFyc2VyXzEuUGFyc2VyKGNvZGUsb3B0aW9ucyxwYXJzZXJEZWxlZ2F0ZSk7fQp2YXIgcHJvZ3JhbT1pc01vZHVsZT9wYXJzZXIucGFyc2VNb2R1bGUoKTpwYXJzZXIucGFyc2VTY3JpcHQoKTt2YXIgYXN0PXByb2dyYW07aWYoY29sbGVjdENvbW1lbnQmJmNvbW1lbnRIYW5kbGVyKXthc3QuY29tbWVudHM9Y29tbWVudEhhbmRsZXIuY29tbWVudHM7fQppZihwYXJzZXIuY29uZmlnLnRva2Vucyl7YXN0LnRva2Vucz1wYXJzZXIudG9rZW5zO30KaWYocGFyc2VyLmNvbmZpZy50b2xlcmFudCl7YXN0LmVycm9ycz1wYXJzZXIuZXJyb3JIYW5kbGVyLmVycm9yczt9CnJldHVybiBhc3Q7fQpleHBvcnRzLnBhcnNlPXBhcnNlO2Z1bmN0aW9uIHBhcnNlTW9kdWxlKGNvZGUsb3B0aW9ucyxkZWxlZ2F0ZSl7dmFyIHBhcnNpbmdPcHRpb25zPW9wdGlvbnN8fHt9O3BhcnNpbmdPcHRpb25zLnNvdXJjZVR5cGU9J21vZHVsZSc7cmV0dXJuIHBhcnNlKGNvZGUscGFyc2luZ09wdGlvbnMsZGVsZWdhdGUpO30KZXhwb3J0cy5wYXJzZU1vZHVsZT1wYXJzZU1vZHVsZTtmdW5jdGlvbiBwYXJzZVNjcmlwdChjb2RlLG9wdGlvbnMsZGVsZWdhdGUpe3ZhciBwYXJzaW5nT3B0aW9ucz1vcHRpb25zfHx7fTtwYXJzaW5nT3B0aW9ucy5zb3VyY2VUeXBlPSdzY3JpcHQnO3JldHVybiBwYXJzZShjb2RlLHBhcnNpbmdPcHRpb25zLGRlbGVnYXRlKTt9CmV4cG9ydHMucGFyc2VTY3JpcHQ9cGFyc2VTY3JpcHQ7ZnVuY3Rpb24gdG9rZW5pemUoY29kZSxvcHRpb25zLGRlbGVnYXRlKXt2YXIgdG9rZW5pemVyPW5ldyB0b2tlbml6ZXJfMS5Ub2tlbml6ZXIoY29kZSxvcHRpb25zKTt2YXIgdG9rZW5zO3Rva2Vucz1bXTt0cnl7d2hpbGUodHJ1ZSl7dmFyIHRva2VuPXRva2VuaXplci5nZXROZXh0VG9rZW4oKTtpZighdG9rZW4pe2JyZWFrO30KaWYoZGVsZWdhdGUpe3Rva2VuPWRlbGVnYXRlKHRva2VuKTt9CnRva2Vucy5wdXNoKHRva2VuKTt9fQpjYXRjaChlKXt0b2tlbml6ZXIuZXJyb3JIYW5kbGVyLnRvbGVyYXRlKGUpO30KaWYodG9rZW5pemVyLmVycm9ySGFuZGxlci50b2xlcmFudCl7dG9rZW5zLmVycm9ycz10b2tlbml6ZXIuZXJyb3JzKCk7fQpyZXR1cm4gdG9rZW5zO30KZXhwb3J0cy50b2tlbml6ZT10b2tlbml6ZTt2YXIgc3ludGF4XzE9X193ZWJwYWNrX3JlcXVpcmVfXygyKTtleHBvcnRzLlN5bnRheD1zeW50YXhfMS5TeW50YXg7ZXhwb3J0cy52ZXJzaW9uPSc0LjAuMCc7fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIHN5bnRheF8xPV9fd2VicGFja19yZXF1aXJlX18oMik7dmFyIENvbW1lbnRIYW5kbGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ29tbWVudEhhbmRsZXIoKXt0aGlzLmF0dGFjaD1mYWxzZTt0aGlzLmNvbW1lbnRzPVtdO3RoaXMuc3RhY2s9W107dGhpcy5sZWFkaW5nPVtdO3RoaXMudHJhaWxpbmc9W107fQpDb21tZW50SGFuZGxlci5wcm90b3R5cGUuaW5zZXJ0SW5uZXJDb21tZW50cz1mdW5jdGlvbihub2RlLG1ldGFkYXRhKXtpZihub2RlLnR5cGU9PT1zeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQmJm5vZGUuYm9keS5sZW5ndGg9PT0wKXt2YXIgaW5uZXJDb21tZW50cz1bXTtmb3IodmFyIGk9dGhpcy5sZWFkaW5nLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgZW50cnk9dGhpcy5sZWFkaW5nW2ldO2lmKG1ldGFkYXRhLmVuZC5vZmZzZXQ+PWVudHJ5LnN0YXJ0KXtpbm5lckNvbW1lbnRzLnVuc2hpZnQoZW50cnkuY29tbWVudCk7dGhpcy5sZWFkaW5nLnNwbGljZShpLDEpO3RoaXMudHJhaWxpbmcuc3BsaWNlKGksMSk7fX0KaWYoaW5uZXJDb21tZW50cy5sZW5ndGgpe25vZGUuaW5uZXJDb21tZW50cz1pbm5lckNvbW1lbnRzO319fTtDb21tZW50SGFuZGxlci5wcm90b3R5cGUuZmluZFRyYWlsaW5nQ29tbWVudHM9ZnVuY3Rpb24obWV0YWRhdGEpe3ZhciB0cmFpbGluZ0NvbW1lbnRzPVtdO2lmKHRoaXMudHJhaWxpbmcubGVuZ3RoPjApe2Zvcih2YXIgaT10aGlzLnRyYWlsaW5nLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgZW50cnlfMT10aGlzLnRyYWlsaW5nW2ldO2lmKGVudHJ5XzEuc3RhcnQ+PW1ldGFkYXRhLmVuZC5vZmZzZXQpe3RyYWlsaW5nQ29tbWVudHMudW5zaGlmdChlbnRyeV8xLmNvbW1lbnQpO319CnRoaXMudHJhaWxpbmcubGVuZ3RoPTA7cmV0dXJuIHRyYWlsaW5nQ29tbWVudHM7fQp2YXIgZW50cnk9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTtpZihlbnRyeSYmZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzKXt2YXIgZmlyc3RDb21tZW50PWVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50c1swXTtpZihmaXJzdENvbW1lbnQmJmZpcnN0Q29tbWVudC5yYW5nZVswXT49bWV0YWRhdGEuZW5kLm9mZnNldCl7dHJhaWxpbmdDb21tZW50cz1lbnRyeS5ub2RlLnRyYWlsaW5nQ29tbWVudHM7ZGVsZXRlIGVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50czt9fQpyZXR1cm4gdHJhaWxpbmdDb21tZW50czt9O0NvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS5maW5kTGVhZGluZ0NvbW1lbnRzPWZ1bmN0aW9uKG1ldGFkYXRhKXt2YXIgbGVhZGluZ0NvbW1lbnRzPVtdO3ZhciB0YXJnZXQ7d2hpbGUodGhpcy5zdGFjay5sZW5ndGg+MCl7dmFyIGVudHJ5PXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07aWYoZW50cnkmJmVudHJ5LnN0YXJ0Pj1tZXRhZGF0YS5zdGFydC5vZmZzZXQpe3RhcmdldD1lbnRyeS5ub2RlO3RoaXMuc3RhY2sucG9wKCk7fWVsc2UKe2JyZWFrO319CmlmKHRhcmdldCl7dmFyIGNvdW50PXRhcmdldC5sZWFkaW5nQ29tbWVudHM/dGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGg6MDtmb3IodmFyIGk9Y291bnQtMTtpPj0wOy0taSl7dmFyIGNvbW1lbnQ9dGFyZ2V0LmxlYWRpbmdDb21tZW50c1tpXTtpZihjb21tZW50LnJhbmdlWzFdPD1tZXRhZGF0YS5zdGFydC5vZmZzZXQpe2xlYWRpbmdDb21tZW50cy51bnNoaWZ0KGNvbW1lbnQpO3RhcmdldC5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKGksMSk7fX0KaWYodGFyZ2V0LmxlYWRpbmdDb21tZW50cyYmdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGg9PT0wKXtkZWxldGUgdGFyZ2V0LmxlYWRpbmdDb21tZW50czt9CnJldHVybiBsZWFkaW5nQ29tbWVudHM7fQpmb3IodmFyIGk9dGhpcy5sZWFkaW5nLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgZW50cnk9dGhpcy5sZWFkaW5nW2ldO2lmKGVudHJ5LnN0YXJ0PD1tZXRhZGF0YS5zdGFydC5vZmZzZXQpe2xlYWRpbmdDb21tZW50cy51bnNoaWZ0KGVudHJ5LmNvbW1lbnQpO3RoaXMubGVhZGluZy5zcGxpY2UoaSwxKTt9fQpyZXR1cm4gbGVhZGluZ0NvbW1lbnRzO307Q29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0Tm9kZT1mdW5jdGlvbihub2RlLG1ldGFkYXRhKXtpZihub2RlLnR5cGU9PT1zeW50YXhfMS5TeW50YXguUHJvZ3JhbSYmbm9kZS5ib2R5Lmxlbmd0aD4wKXtyZXR1cm47fQp0aGlzLmluc2VydElubmVyQ29tbWVudHMobm9kZSxtZXRhZGF0YSk7dmFyIHRyYWlsaW5nQ29tbWVudHM9dGhpcy5maW5kVHJhaWxpbmdDb21tZW50cyhtZXRhZGF0YSk7dmFyIGxlYWRpbmdDb21tZW50cz10aGlzLmZpbmRMZWFkaW5nQ29tbWVudHMobWV0YWRhdGEpO2lmKGxlYWRpbmdDb21tZW50cy5sZW5ndGg+MCl7bm9kZS5sZWFkaW5nQ29tbWVudHM9bGVhZGluZ0NvbW1lbnRzO30KaWYodHJhaWxpbmdDb21tZW50cy5sZW5ndGg+MCl7bm9kZS50cmFpbGluZ0NvbW1lbnRzPXRyYWlsaW5nQ29tbWVudHM7fQp0aGlzLnN0YWNrLnB1c2goe25vZGU6bm9kZSxzdGFydDptZXRhZGF0YS5zdGFydC5vZmZzZXR9KTt9O0NvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS52aXNpdENvbW1lbnQ9ZnVuY3Rpb24obm9kZSxtZXRhZGF0YSl7dmFyIHR5cGU9bm9kZS50eXBlWzBdPT09J0wnPydMaW5lJzonQmxvY2snO3ZhciBjb21tZW50PXt0eXBlOnR5cGUsdmFsdWU6bm9kZS52YWx1ZX07aWYobm9kZS5yYW5nZSl7Y29tbWVudC5yYW5nZT1ub2RlLnJhbmdlO30KaWYobm9kZS5sb2Mpe2NvbW1lbnQubG9jPW5vZGUubG9jO30KdGhpcy5jb21tZW50cy5wdXNoKGNvbW1lbnQpO2lmKHRoaXMuYXR0YWNoKXt2YXIgZW50cnk9e2NvbW1lbnQ6e3R5cGU6dHlwZSx2YWx1ZTpub2RlLnZhbHVlLHJhbmdlOlttZXRhZGF0YS5zdGFydC5vZmZzZXQsbWV0YWRhdGEuZW5kLm9mZnNldF19LHN0YXJ0Om1ldGFkYXRhLnN0YXJ0Lm9mZnNldH07aWYobm9kZS5sb2Mpe2VudHJ5LmNvbW1lbnQubG9jPW5vZGUubG9jO30Kbm9kZS50eXBlPXR5cGU7dGhpcy5sZWFkaW5nLnB1c2goZW50cnkpO3RoaXMudHJhaWxpbmcucHVzaChlbnRyeSk7fX07Q29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKG5vZGUsbWV0YWRhdGEpe2lmKG5vZGUudHlwZT09PSdMaW5lQ29tbWVudCcpe3RoaXMudmlzaXRDb21tZW50KG5vZGUsbWV0YWRhdGEpO31lbHNlCmlmKG5vZGUudHlwZT09PSdCbG9ja0NvbW1lbnQnKXt0aGlzLnZpc2l0Q29tbWVudChub2RlLG1ldGFkYXRhKTt9ZWxzZQppZih0aGlzLmF0dGFjaCl7dGhpcy52aXNpdE5vZGUobm9kZSxtZXRhZGF0YSk7fX07cmV0dXJuIENvbW1lbnRIYW5kbGVyO30oKTtleHBvcnRzLkNvbW1lbnRIYW5kbGVyPUNvbW1lbnRIYW5kbGVyO30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLlN5bnRheD17QXNzaWdubWVudEV4cHJlc3Npb246J0Fzc2lnbm1lbnRFeHByZXNzaW9uJyxBc3NpZ25tZW50UGF0dGVybjonQXNzaWdubWVudFBhdHRlcm4nLEFycmF5RXhwcmVzc2lvbjonQXJyYXlFeHByZXNzaW9uJyxBcnJheVBhdHRlcm46J0FycmF5UGF0dGVybicsQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246J0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxBd2FpdEV4cHJlc3Npb246J0F3YWl0RXhwcmVzc2lvbicsQmxvY2tTdGF0ZW1lbnQ6J0Jsb2NrU3RhdGVtZW50JyxCaW5hcnlFeHByZXNzaW9uOidCaW5hcnlFeHByZXNzaW9uJyxCcmVha1N0YXRlbWVudDonQnJlYWtTdGF0ZW1lbnQnLENhbGxFeHByZXNzaW9uOidDYWxsRXhwcmVzc2lvbicsQ2F0Y2hDbGF1c2U6J0NhdGNoQ2xhdXNlJyxDbGFzc0JvZHk6J0NsYXNzQm9keScsQ2xhc3NEZWNsYXJhdGlvbjonQ2xhc3NEZWNsYXJhdGlvbicsQ2xhc3NFeHByZXNzaW9uOidDbGFzc0V4cHJlc3Npb24nLENvbmRpdGlvbmFsRXhwcmVzc2lvbjonQ29uZGl0aW9uYWxFeHByZXNzaW9uJyxDb250aW51ZVN0YXRlbWVudDonQ29udGludWVTdGF0ZW1lbnQnLERvV2hpbGVTdGF0ZW1lbnQ6J0RvV2hpbGVTdGF0ZW1lbnQnLERlYnVnZ2VyU3RhdGVtZW50OidEZWJ1Z2dlclN0YXRlbWVudCcsRW1wdHlTdGF0ZW1lbnQ6J0VtcHR5U3RhdGVtZW50JyxFeHBvcnRBbGxEZWNsYXJhdGlvbjonRXhwb3J0QWxsRGVjbGFyYXRpb24nLEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjonRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyxFeHBvcnROYW1lZERlY2xhcmF0aW9uOidFeHBvcnROYW1lZERlY2xhcmF0aW9uJyxFeHBvcnRTcGVjaWZpZXI6J0V4cG9ydFNwZWNpZmllcicsRXhwcmVzc2lvblN0YXRlbWVudDonRXhwcmVzc2lvblN0YXRlbWVudCcsRm9yU3RhdGVtZW50OidGb3JTdGF0ZW1lbnQnLEZvck9mU3RhdGVtZW50OidGb3JPZlN0YXRlbWVudCcsRm9ySW5TdGF0ZW1lbnQ6J0ZvckluU3RhdGVtZW50JyxGdW5jdGlvbkRlY2xhcmF0aW9uOidGdW5jdGlvbkRlY2xhcmF0aW9uJyxGdW5jdGlvbkV4cHJlc3Npb246J0Z1bmN0aW9uRXhwcmVzc2lvbicsSWRlbnRpZmllcjonSWRlbnRpZmllcicsSWZTdGF0ZW1lbnQ6J0lmU3RhdGVtZW50JyxJbXBvcnREZWNsYXJhdGlvbjonSW1wb3J0RGVjbGFyYXRpb24nLEltcG9ydERlZmF1bHRTcGVjaWZpZXI6J0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjonSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJyxJbXBvcnRTcGVjaWZpZXI6J0ltcG9ydFNwZWNpZmllcicsTGl0ZXJhbDonTGl0ZXJhbCcsTGFiZWxlZFN0YXRlbWVudDonTGFiZWxlZFN0YXRlbWVudCcsTG9naWNhbEV4cHJlc3Npb246J0xvZ2ljYWxFeHByZXNzaW9uJyxNZW1iZXJFeHByZXNzaW9uOidNZW1iZXJFeHByZXNzaW9uJyxNZXRhUHJvcGVydHk6J01ldGFQcm9wZXJ0eScsTWV0aG9kRGVmaW5pdGlvbjonTWV0aG9kRGVmaW5pdGlvbicsTmV3RXhwcmVzc2lvbjonTmV3RXhwcmVzc2lvbicsT2JqZWN0RXhwcmVzc2lvbjonT2JqZWN0RXhwcmVzc2lvbicsT2JqZWN0UGF0dGVybjonT2JqZWN0UGF0dGVybicsUHJvZ3JhbTonUHJvZ3JhbScsUHJvcGVydHk6J1Byb3BlcnR5JyxSZXN0RWxlbWVudDonUmVzdEVsZW1lbnQnLFJldHVyblN0YXRlbWVudDonUmV0dXJuU3RhdGVtZW50JyxTZXF1ZW5jZUV4cHJlc3Npb246J1NlcXVlbmNlRXhwcmVzc2lvbicsU3ByZWFkRWxlbWVudDonU3ByZWFkRWxlbWVudCcsU3VwZXI6J1N1cGVyJyxTd2l0Y2hDYXNlOidTd2l0Y2hDYXNlJyxTd2l0Y2hTdGF0ZW1lbnQ6J1N3aXRjaFN0YXRlbWVudCcsVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOidUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFRlbXBsYXRlRWxlbWVudDonVGVtcGxhdGVFbGVtZW50JyxUZW1wbGF0ZUxpdGVyYWw6J1RlbXBsYXRlTGl0ZXJhbCcsVGhpc0V4cHJlc3Npb246J1RoaXNFeHByZXNzaW9uJyxUaHJvd1N0YXRlbWVudDonVGhyb3dTdGF0ZW1lbnQnLFRyeVN0YXRlbWVudDonVHJ5U3RhdGVtZW50JyxVbmFyeUV4cHJlc3Npb246J1VuYXJ5RXhwcmVzc2lvbicsVXBkYXRlRXhwcmVzc2lvbjonVXBkYXRlRXhwcmVzc2lvbicsVmFyaWFibGVEZWNsYXJhdGlvbjonVmFyaWFibGVEZWNsYXJhdGlvbicsVmFyaWFibGVEZWNsYXJhdG9yOidWYXJpYWJsZURlY2xhcmF0b3InLFdoaWxlU3RhdGVtZW50OidXaGlsZVN0YXRlbWVudCcsV2l0aFN0YXRlbWVudDonV2l0aFN0YXRlbWVudCcsWWllbGRFeHByZXNzaW9uOidZaWVsZEV4cHJlc3Npb24nfTt9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgX19leHRlbmRzPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBleHRlbmRTdGF0aWNzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihkLGIpe2QuX19wcm90b19fPWI7fXx8ZnVuY3Rpb24oZCxiKXtmb3IodmFyIHAgaW4gYilpZihiLmhhc093blByb3BlcnR5KHApKWRbcF09YltwXTt9O3JldHVybiBmdW5jdGlvbihkLGIpe2V4dGVuZFN0YXRpY3MoZCxiKTtmdW5jdGlvbiBfXygpe3RoaXMuY29uc3RydWN0b3I9ZDt9CmQucHJvdG90eXBlPWI9PT1udWxsP09iamVjdC5jcmVhdGUoYik6KF9fLnByb3RvdHlwZT1iLnByb3RvdHlwZSxuZXcgX18oKSk7fTt9KCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIGNoYXJhY3Rlcl8xPV9fd2VicGFja19yZXF1aXJlX18oNCk7dmFyIEpTWE5vZGU9X193ZWJwYWNrX3JlcXVpcmVfXyg1KTt2YXIganN4X3N5bnRheF8xPV9fd2VicGFja19yZXF1aXJlX18oNik7dmFyIE5vZGU9X193ZWJwYWNrX3JlcXVpcmVfXyg3KTt2YXIgcGFyc2VyXzE9X193ZWJwYWNrX3JlcXVpcmVfXyg4KTt2YXIgdG9rZW5fMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTt2YXIgeGh0bWxfZW50aXRpZXNfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTt0b2tlbl8xLlRva2VuTmFtZVsxMDBdPSdKU1hJZGVudGlmaWVyJzt0b2tlbl8xLlRva2VuTmFtZVsxMDFdPSdKU1hUZXh0JztmdW5jdGlvbiBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShlbGVtZW50TmFtZSl7dmFyIHF1YWxpZmllZE5hbWU7c3dpdGNoKGVsZW1lbnROYW1lLnR5cGUpe2Nhc2UganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyOnZhciBpZD1lbGVtZW50TmFtZTtxdWFsaWZpZWROYW1lPWlkLm5hbWU7YnJlYWs7Y2FzZSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE5hbWVzcGFjZWROYW1lOnZhciBucz1lbGVtZW50TmFtZTtxdWFsaWZpZWROYW1lPWdldFF1YWxpZmllZEVsZW1lbnROYW1lKG5zLm5hbWVzcGFjZSkrJzonKwpnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShucy5uYW1lKTticmVhaztjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTWVtYmVyRXhwcmVzc2lvbjp2YXIgZXhwcj1lbGVtZW50TmFtZTtxdWFsaWZpZWROYW1lPWdldFF1YWxpZmllZEVsZW1lbnROYW1lKGV4cHIub2JqZWN0KSsnLicrCmdldFF1YWxpZmllZEVsZW1lbnROYW1lKGV4cHIucHJvcGVydHkpO2JyZWFrO2RlZmF1bHQ6YnJlYWs7fQpyZXR1cm4gcXVhbGlmaWVkTmFtZTt9CnZhciBKU1hQYXJzZXI9ZnVuY3Rpb24oX3N1cGVyKXtfX2V4dGVuZHMoSlNYUGFyc2VyLF9zdXBlcik7ZnVuY3Rpb24gSlNYUGFyc2VyKGNvZGUsb3B0aW9ucyxkZWxlZ2F0ZSl7cmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsY29kZSxvcHRpb25zLGRlbGVnYXRlKXx8dGhpczt9CkpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoKCc8Jyk/dGhpcy5wYXJzZUpTWFJvb3QoKTpfc3VwZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24uY2FsbCh0aGlzKTt9O0pTWFBhcnNlci5wcm90b3R5cGUuc3RhcnRKU1g9ZnVuY3Rpb24oKXt0aGlzLnNjYW5uZXIuaW5kZXg9dGhpcy5zdGFydE1hcmtlci5pbmRleDt0aGlzLnNjYW5uZXIubGluZU51bWJlcj10aGlzLnN0YXJ0TWFya2VyLmxpbmU7dGhpcy5zY2FubmVyLmxpbmVTdGFydD10aGlzLnN0YXJ0TWFya2VyLmluZGV4LXRoaXMuc3RhcnRNYXJrZXIuY29sdW1uO307SlNYUGFyc2VyLnByb3RvdHlwZS5maW5pc2hKU1g9ZnVuY3Rpb24oKXt0aGlzLm5leHRUb2tlbigpO307SlNYUGFyc2VyLnByb3RvdHlwZS5yZWVudGVySlNYPWZ1bmN0aW9uKCl7dGhpcy5zdGFydEpTWCgpO3RoaXMuZXhwZWN0SlNYKCd9Jyk7aWYodGhpcy5jb25maWcudG9rZW5zKXt0aGlzLnRva2Vucy5wb3AoKTt9fTtKU1hQYXJzZXIucHJvdG90eXBlLmNyZWF0ZUpTWE5vZGU9ZnVuY3Rpb24oKXt0aGlzLmNvbGxlY3RDb21tZW50cygpO3JldHVybntpbmRleDp0aGlzLnNjYW5uZXIuaW5kZXgsbGluZTp0aGlzLnNjYW5uZXIubGluZU51bWJlcixjb2x1bW46dGhpcy5zY2FubmVyLmluZGV4LXRoaXMuc2Nhbm5lci5saW5lU3RhcnR9O307SlNYUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVKU1hDaGlsZE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm57aW5kZXg6dGhpcy5zY2FubmVyLmluZGV4LGxpbmU6dGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuc2Nhbm5lci5pbmRleC10aGlzLnNjYW5uZXIubGluZVN0YXJ0fTt9O0pTWFBhcnNlci5wcm90b3R5cGUuc2NhblhIVE1MRW50aXR5PWZ1bmN0aW9uKHF1b3RlKXt2YXIgcmVzdWx0PScmJzt2YXIgdmFsaWQ9dHJ1ZTt2YXIgdGVybWluYXRlZD1mYWxzZTt2YXIgbnVtZXJpYz1mYWxzZTt2YXIgaGV4PWZhbHNlO3doaWxlKCF0aGlzLnNjYW5uZXIuZW9mKCkmJnZhbGlkJiYhdGVybWluYXRlZCl7dmFyIGNoPXRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XTtpZihjaD09PXF1b3RlKXticmVhazt9CnRlcm1pbmF0ZWQ9Y2g9PT0nOyc7cmVzdWx0Kz1jaDsrK3RoaXMuc2Nhbm5lci5pbmRleDtpZighdGVybWluYXRlZCl7c3dpdGNoKHJlc3VsdC5sZW5ndGgpe2Nhc2UgMjpudW1lcmljPWNoPT09JyMnO2JyZWFrO2Nhc2UgMzppZihudW1lcmljKXtoZXg9Y2g9PT0neCc7dmFsaWQ9aGV4fHxjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSk7bnVtZXJpYz1udW1lcmljJiYhaGV4O30KYnJlYWs7ZGVmYXVsdDp2YWxpZD12YWxpZCYmIShudW1lcmljJiYhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKTt2YWxpZD12YWxpZCYmIShoZXgmJiFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdChjaC5jaGFyQ29kZUF0KDApKSk7YnJlYWs7fX19CmlmKHZhbGlkJiZ0ZXJtaW5hdGVkJiZyZXN1bHQubGVuZ3RoPjIpe3ZhciBzdHI9cmVzdWx0LnN1YnN0cigxLHJlc3VsdC5sZW5ndGgtMik7aWYobnVtZXJpYyYmc3RyLmxlbmd0aD4xKXtyZXN1bHQ9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChzdHIuc3Vic3RyKDEpLDEwKSk7fWVsc2UKaWYoaGV4JiZzdHIubGVuZ3RoPjIpe3Jlc3VsdD1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCcwJytzdHIuc3Vic3RyKDEpLDE2KSk7fWVsc2UKaWYoIW51bWVyaWMmJiFoZXgmJnhodG1sX2VudGl0aWVzXzEuWEhUTUxFbnRpdGllc1tzdHJdKXtyZXN1bHQ9eGh0bWxfZW50aXRpZXNfMS5YSFRNTEVudGl0aWVzW3N0cl07fX0KcmV0dXJuIHJlc3VsdDt9O0pTWFBhcnNlci5wcm90b3R5cGUubGV4SlNYPWZ1bmN0aW9uKCl7dmFyIGNwPXRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIuaW5kZXgpO2lmKGNwPT09NjB8fGNwPT09NjJ8fGNwPT09NDd8fGNwPT09NTh8fGNwPT09NjF8fGNwPT09MTIzfHxjcD09PTEyNSl7dmFyIHZhbHVlPXRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO3JldHVybnt0eXBlOjcsdmFsdWU6dmFsdWUsbGluZU51bWJlcjp0aGlzLnNjYW5uZXIubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5zY2FubmVyLmxpbmVTdGFydCxzdGFydDp0aGlzLnNjYW5uZXIuaW5kZXgtMSxlbmQ6dGhpcy5zY2FubmVyLmluZGV4fTt9CmlmKGNwPT09MzR8fGNwPT09Mzkpe3ZhciBzdGFydD10aGlzLnNjYW5uZXIuaW5kZXg7dmFyIHF1b3RlPXRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO3ZhciBzdHI9Jyc7d2hpbGUoIXRoaXMuc2Nhbm5lci5lb2YoKSl7dmFyIGNoPXRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO2lmKGNoPT09cXVvdGUpe2JyZWFrO31lbHNlCmlmKGNoPT09JyYnKXtzdHIrPXRoaXMuc2NhblhIVE1MRW50aXR5KHF1b3RlKTt9ZWxzZQp7c3RyKz1jaDt9fQpyZXR1cm57dHlwZTo4LHZhbHVlOnN0cixsaW5lTnVtYmVyOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLnNjYW5uZXIubGluZVN0YXJ0LHN0YXJ0OnN0YXJ0LGVuZDp0aGlzLnNjYW5uZXIuaW5kZXh9O30KaWYoY3A9PT00Nil7dmFyIG4xPXRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIuaW5kZXgrMSk7dmFyIG4yPXRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIuaW5kZXgrMik7dmFyIHZhbHVlPW4xPT09NDYmJm4yPT09NDY/Jy4uLic6Jy4nO3ZhciBzdGFydD10aGlzLnNjYW5uZXIuaW5kZXg7dGhpcy5zY2FubmVyLmluZGV4Kz12YWx1ZS5sZW5ndGg7cmV0dXJue3R5cGU6Nyx2YWx1ZTp2YWx1ZSxsaW5lTnVtYmVyOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLnNjYW5uZXIubGluZVN0YXJ0LHN0YXJ0OnN0YXJ0LGVuZDp0aGlzLnNjYW5uZXIuaW5kZXh9O30KaWYoY3A9PT05Nil7cmV0dXJue3R5cGU6MTAsdmFsdWU6JycsbGluZU51bWJlcjp0aGlzLnNjYW5uZXIubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5zY2FubmVyLmxpbmVTdGFydCxzdGFydDp0aGlzLnNjYW5uZXIuaW5kZXgsZW5kOnRoaXMuc2Nhbm5lci5pbmRleH07fQppZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY3ApJiZjcCE9PTkyKXt2YXIgc3RhcnQ9dGhpcy5zY2FubmVyLmluZGV4OysrdGhpcy5zY2FubmVyLmluZGV4O3doaWxlKCF0aGlzLnNjYW5uZXIuZW9mKCkpe3ZhciBjaD10aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4KTtpZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkmJmNoIT09OTIpeysrdGhpcy5zY2FubmVyLmluZGV4O31lbHNlCmlmKGNoPT09NDUpeysrdGhpcy5zY2FubmVyLmluZGV4O31lbHNlCnticmVhazt9fQp2YXIgaWQ9dGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZShzdGFydCx0aGlzLnNjYW5uZXIuaW5kZXgpO3JldHVybnt0eXBlOjEwMCx2YWx1ZTppZCxsaW5lTnVtYmVyOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLnNjYW5uZXIubGluZVN0YXJ0LHN0YXJ0OnN0YXJ0LGVuZDp0aGlzLnNjYW5uZXIuaW5kZXh9O30KcmV0dXJuIHRoaXMuc2Nhbm5lci5sZXgoKTt9O0pTWFBhcnNlci5wcm90b3R5cGUubmV4dEpTWFRva2VuPWZ1bmN0aW9uKCl7dGhpcy5jb2xsZWN0Q29tbWVudHMoKTt0aGlzLnN0YXJ0TWFya2VyLmluZGV4PXRoaXMuc2Nhbm5lci5pbmRleDt0aGlzLnN0YXJ0TWFya2VyLmxpbmU9dGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7dGhpcy5zdGFydE1hcmtlci5jb2x1bW49dGhpcy5zY2FubmVyLmluZGV4LXRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7dmFyIHRva2VuPXRoaXMubGV4SlNYKCk7dGhpcy5sYXN0TWFya2VyLmluZGV4PXRoaXMuc2Nhbm5lci5pbmRleDt0aGlzLmxhc3RNYXJrZXIubGluZT10aGlzLnNjYW5uZXIubGluZU51bWJlcjt0aGlzLmxhc3RNYXJrZXIuY29sdW1uPXRoaXMuc2Nhbm5lci5pbmRleC10aGlzLnNjYW5uZXIubGluZVN0YXJ0O2lmKHRoaXMuY29uZmlnLnRva2Vucyl7dGhpcy50b2tlbnMucHVzaCh0aGlzLmNvbnZlcnRUb2tlbih0b2tlbikpO30KcmV0dXJuIHRva2VuO307SlNYUGFyc2VyLnByb3RvdHlwZS5uZXh0SlNYVGV4dD1mdW5jdGlvbigpe3RoaXMuc3RhcnRNYXJrZXIuaW5kZXg9dGhpcy5zY2FubmVyLmluZGV4O3RoaXMuc3RhcnRNYXJrZXIubGluZT10aGlzLnNjYW5uZXIubGluZU51bWJlcjt0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbj10aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydDt2YXIgc3RhcnQ9dGhpcy5zY2FubmVyLmluZGV4O3ZhciB0ZXh0PScnO3doaWxlKCF0aGlzLnNjYW5uZXIuZW9mKCkpe3ZhciBjaD10aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF07aWYoY2g9PT0neyd8fGNoPT09JzwnKXticmVhazt9CisrdGhpcy5zY2FubmVyLmluZGV4O3RleHQrPWNoO2lmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKXsrK3RoaXMuc2Nhbm5lci5saW5lTnVtYmVyO2lmKGNoPT09J1xyJyYmdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdPT09J1xuJyl7Kyt0aGlzLnNjYW5uZXIuaW5kZXg7fQp0aGlzLnNjYW5uZXIubGluZVN0YXJ0PXRoaXMuc2Nhbm5lci5pbmRleDt9fQp0aGlzLmxhc3RNYXJrZXIuaW5kZXg9dGhpcy5zY2FubmVyLmluZGV4O3RoaXMubGFzdE1hcmtlci5saW5lPXRoaXMuc2Nhbm5lci5saW5lTnVtYmVyO3RoaXMubGFzdE1hcmtlci5jb2x1bW49dGhpcy5zY2FubmVyLmluZGV4LXRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7dmFyIHRva2VuPXt0eXBlOjEwMSx2YWx1ZTp0ZXh0LGxpbmVOdW1iZXI6dGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsbGluZVN0YXJ0OnRoaXMuc2Nhbm5lci5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuc2Nhbm5lci5pbmRleH07aWYodGV4dC5sZW5ndGg+MCYmdGhpcy5jb25maWcudG9rZW5zKXt0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7fQpyZXR1cm4gdG9rZW47fTtKU1hQYXJzZXIucHJvdG90eXBlLnBlZWtKU1hUb2tlbj1mdW5jdGlvbigpe3ZhciBzdGF0ZT10aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7dGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO3ZhciBuZXh0PXRoaXMubGV4SlNYKCk7dGhpcy5zY2FubmVyLnJlc3RvcmVTdGF0ZShzdGF0ZSk7cmV0dXJuIG5leHQ7fTtKU1hQYXJzZXIucHJvdG90eXBlLmV4cGVjdEpTWD1mdW5jdGlvbih2YWx1ZSl7dmFyIHRva2VuPXRoaXMubmV4dEpTWFRva2VuKCk7aWYodG9rZW4udHlwZSE9PTd8fHRva2VuLnZhbHVlIT09dmFsdWUpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO319O0pTWFBhcnNlci5wcm90b3R5cGUubWF0Y2hKU1g9ZnVuY3Rpb24odmFsdWUpe3ZhciBuZXh0PXRoaXMucGVla0pTWFRva2VuKCk7cmV0dXJuIG5leHQudHlwZT09PTcmJm5leHQudmFsdWU9PT12YWx1ZTt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hJZGVudGlmaWVyPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dmFyIHRva2VuPXRoaXMubmV4dEpTWFRva2VuKCk7aWYodG9rZW4udHlwZSE9PTEwMCl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWElkZW50aWZpZXIodG9rZW4udmFsdWUpKTt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFbGVtZW50TmFtZT1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlSlNYTm9kZSgpO3ZhciBlbGVtZW50TmFtZT10aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO2lmKHRoaXMubWF0Y2hKU1goJzonKSl7dmFyIG5hbWVzcGFjZT1lbGVtZW50TmFtZTt0aGlzLmV4cGVjdEpTWCgnOicpO3ZhciBuYW1lXzE9dGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtlbGVtZW50TmFtZT10aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYTmFtZXNwYWNlZE5hbWUobmFtZXNwYWNlLG5hbWVfMSkpO31lbHNlCmlmKHRoaXMubWF0Y2hKU1goJy4nKSl7d2hpbGUodGhpcy5tYXRjaEpTWCgnLicpKXt2YXIgb2JqZWN0PWVsZW1lbnROYW1lO3RoaXMuZXhwZWN0SlNYKCcuJyk7dmFyIHByb3BlcnR5PXRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7ZWxlbWVudE5hbWU9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWE1lbWJlckV4cHJlc3Npb24ob2JqZWN0LHByb3BlcnR5KSk7fX0KcmV0dXJuIGVsZW1lbnROYW1lO307SlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZU5hbWU9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUpTWE5vZGUoKTt2YXIgYXR0cmlidXRlTmFtZTt2YXIgaWRlbnRpZmllcj10aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO2lmKHRoaXMubWF0Y2hKU1goJzonKSl7dmFyIG5hbWVzcGFjZT1pZGVudGlmaWVyO3RoaXMuZXhwZWN0SlNYKCc6Jyk7dmFyIG5hbWVfMj10aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO2F0dHJpYnV0ZU5hbWU9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSxuYW1lXzIpKTt9ZWxzZQp7YXR0cmlidXRlTmFtZT1pZGVudGlmaWVyO30KcmV0dXJuIGF0dHJpYnV0ZU5hbWU7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYU3RyaW5nTGl0ZXJhbEF0dHJpYnV0ZT1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlSlNYTm9kZSgpO3ZhciB0b2tlbj10aGlzLm5leHRKU1hUb2tlbigpO2lmKHRva2VuLnR5cGUhPT04KXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTt9CnZhciByYXc9dGhpcy5nZXRUb2tlblJhdyh0b2tlbik7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLHJhdykpO307SlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEV4cHJlc3Npb25BdHRyaWJ1dGU9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUpTWE5vZGUoKTt0aGlzLmV4cGVjdEpTWCgneycpO3RoaXMuZmluaXNoSlNYKCk7aWYodGhpcy5tYXRjaCgnfScpKXt0aGlzLnRvbGVyYXRlRXJyb3IoJ0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uJyk7fQp2YXIgZXhwcmVzc2lvbj10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTt0aGlzLnJlZW50ZXJKU1goKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWEV4cHJlc3Npb25Db250YWluZXIoZXhwcmVzc2lvbikpO307SlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hKU1goJ3snKT90aGlzLnBhcnNlSlNYRXhwcmVzc2lvbkF0dHJpYnV0ZSgpOnRoaXMubWF0Y2hKU1goJzwnKT90aGlzLnBhcnNlSlNYRWxlbWVudCgpOnRoaXMucGFyc2VKU1hTdHJpbmdMaXRlcmFsQXR0cmlidXRlKCk7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYTmFtZVZhbHVlQXR0cmlidXRlPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dmFyIG5hbWU9dGhpcy5wYXJzZUpTWEF0dHJpYnV0ZU5hbWUoKTt2YXIgdmFsdWU9bnVsbDtpZih0aGlzLm1hdGNoSlNYKCc9Jykpe3RoaXMuZXhwZWN0SlNYKCc9Jyk7dmFsdWU9dGhpcy5wYXJzZUpTWEF0dHJpYnV0ZVZhbHVlKCk7fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWEF0dHJpYnV0ZShuYW1lLHZhbHVlKSk7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYU3ByZWFkQXR0cmlidXRlPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dGhpcy5leHBlY3RKU1goJ3snKTt0aGlzLmV4cGVjdEpTWCgnLi4uJyk7dGhpcy5maW5pc2hKU1goKTt2YXIgYXJndW1lbnQ9dGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7dGhpcy5yZWVudGVySlNYKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgSlNYTm9kZS5KU1hTcHJlYWRBdHRyaWJ1dGUoYXJndW1lbnQpKTt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dmFyIGF0dHJpYnV0ZXM9W107d2hpbGUoIXRoaXMubWF0Y2hKU1goJy8nKSYmIXRoaXMubWF0Y2hKU1goJz4nKSl7dmFyIGF0dHJpYnV0ZT10aGlzLm1hdGNoSlNYKCd7Jyk/dGhpcy5wYXJzZUpTWFNwcmVhZEF0dHJpYnV0ZSgpOnRoaXMucGFyc2VKU1hOYW1lVmFsdWVBdHRyaWJ1dGUoKTthdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTt9CnJldHVybiBhdHRyaWJ1dGVzO307SlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWE9wZW5pbmdFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dGhpcy5leHBlY3RKU1goJzwnKTt2YXIgbmFtZT10aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTt2YXIgYXR0cmlidXRlcz10aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO3ZhciBzZWxmQ2xvc2luZz10aGlzLm1hdGNoSlNYKCcvJyk7aWYoc2VsZkNsb3Npbmcpe3RoaXMuZXhwZWN0SlNYKCcvJyk7fQp0aGlzLmV4cGVjdEpTWCgnPicpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYT3BlbmluZ0VsZW1lbnQobmFtZSxzZWxmQ2xvc2luZyxhdHRyaWJ1dGVzKSk7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dGhpcy5leHBlY3RKU1goJzwnKTtpZih0aGlzLm1hdGNoSlNYKCcvJykpe3RoaXMuZXhwZWN0SlNYKCcvJyk7dmFyIG5hbWVfMz10aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTt0aGlzLmV4cGVjdEpTWCgnPicpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYQ2xvc2luZ0VsZW1lbnQobmFtZV8zKSk7fQp2YXIgbmFtZT10aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTt2YXIgYXR0cmlidXRlcz10aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO3ZhciBzZWxmQ2xvc2luZz10aGlzLm1hdGNoSlNYKCcvJyk7aWYoc2VsZkNsb3Npbmcpe3RoaXMuZXhwZWN0SlNYKCcvJyk7fQp0aGlzLmV4cGVjdEpTWCgnPicpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYT3BlbmluZ0VsZW1lbnQobmFtZSxzZWxmQ2xvc2luZyxhdHRyaWJ1dGVzKSk7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRW1wdHlFeHByZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hDaGlsZE5vZGUoKTt0aGlzLmNvbGxlY3RDb21tZW50cygpO3RoaXMubGFzdE1hcmtlci5pbmRleD10aGlzLnNjYW5uZXIuaW5kZXg7dGhpcy5sYXN0TWFya2VyLmxpbmU9dGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7dGhpcy5sYXN0TWFya2VyLmNvbHVtbj10aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWEVtcHR5RXhwcmVzc2lvbigpKTt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFeHByZXNzaW9uQ29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hOb2RlKCk7dGhpcy5leHBlY3RKU1goJ3snKTt2YXIgZXhwcmVzc2lvbjtpZih0aGlzLm1hdGNoSlNYKCd9Jykpe2V4cHJlc3Npb249dGhpcy5wYXJzZUpTWEVtcHR5RXhwcmVzc2lvbigpO3RoaXMuZXhwZWN0SlNYKCd9Jyk7fWVsc2UKe3RoaXMuZmluaXNoSlNYKCk7ZXhwcmVzc2lvbj10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTt0aGlzLnJlZW50ZXJKU1goKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKSk7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQ2hpbGRyZW49ZnVuY3Rpb24oKXt2YXIgY2hpbGRyZW49W107d2hpbGUoIXRoaXMuc2Nhbm5lci5lb2YoKSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hDaGlsZE5vZGUoKTt2YXIgdG9rZW49dGhpcy5uZXh0SlNYVGV4dCgpO2lmKHRva2VuLnN0YXJ0PHRva2VuLmVuZCl7dmFyIHJhdz10aGlzLmdldFRva2VuUmF3KHRva2VuKTt2YXIgY2hpbGQ9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWFRleHQodG9rZW4udmFsdWUscmF3KSk7Y2hpbGRyZW4ucHVzaChjaGlsZCk7fQppZih0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF09PT0neycpe3ZhciBjb250YWluZXI9dGhpcy5wYXJzZUpTWEV4cHJlc3Npb25Db250YWluZXIoKTtjaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7fWVsc2UKe2JyZWFrO319CnJldHVybiBjaGlsZHJlbjt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VDb21wbGV4SlNYRWxlbWVudD1mdW5jdGlvbihlbCl7dmFyIHN0YWNrPVtdO3doaWxlKCF0aGlzLnNjYW5uZXIuZW9mKCkpe2VsLmNoaWxkcmVuPWVsLmNoaWxkcmVuLmNvbmNhdCh0aGlzLnBhcnNlSlNYQ2hpbGRyZW4oKSk7dmFyIG5vZGU9dGhpcy5jcmVhdGVKU1hDaGlsZE5vZGUoKTt2YXIgZWxlbWVudD10aGlzLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50KCk7aWYoZWxlbWVudC50eXBlPT09anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hPcGVuaW5nRWxlbWVudCl7dmFyIG9wZW5pbmc9ZWxlbWVudDtpZihvcGVuaW5nLnNlbGZDbG9zaW5nKXt2YXIgY2hpbGQ9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBKU1hOb2RlLkpTWEVsZW1lbnQob3BlbmluZyxbXSxudWxsKSk7ZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7fWVsc2UKe3N0YWNrLnB1c2goZWwpO2VsPXtub2RlOm5vZGUsb3BlbmluZzpvcGVuaW5nLGNsb3Npbmc6bnVsbCxjaGlsZHJlbjpbXX07fX0KaWYoZWxlbWVudC50eXBlPT09anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hDbG9zaW5nRWxlbWVudCl7ZWwuY2xvc2luZz1lbGVtZW50O3ZhciBvcGVuXzE9Z2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZWwub3BlbmluZy5uYW1lKTt2YXIgY2xvc2VfMT1nZXRRdWFsaWZpZWRFbGVtZW50TmFtZShlbC5jbG9zaW5nLm5hbWUpO2lmKG9wZW5fMSE9PWNsb3NlXzEpe3RoaXMudG9sZXJhdGVFcnJvcignRXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yICUwJyxvcGVuXzEpO30KaWYoc3RhY2subGVuZ3RoPjApe3ZhciBjaGlsZD10aGlzLmZpbmFsaXplKGVsLm5vZGUsbmV3IEpTWE5vZGUuSlNYRWxlbWVudChlbC5vcGVuaW5nLGVsLmNoaWxkcmVuLGVsLmNsb3NpbmcpKTtlbD1zdGFja1tzdGFjay5sZW5ndGgtMV07ZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7c3RhY2sucG9wKCk7fWVsc2UKe2JyZWFrO319fQpyZXR1cm4gZWw7fTtKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRWxlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlSlNYTm9kZSgpO3ZhciBvcGVuaW5nPXRoaXMucGFyc2VKU1hPcGVuaW5nRWxlbWVudCgpO3ZhciBjaGlsZHJlbj1bXTt2YXIgY2xvc2luZz1udWxsO2lmKCFvcGVuaW5nLnNlbGZDbG9zaW5nKXt2YXIgZWw9dGhpcy5wYXJzZUNvbXBsZXhKU1hFbGVtZW50KHtub2RlOm5vZGUsb3BlbmluZzpvcGVuaW5nLGNsb3Npbmc6Y2xvc2luZyxjaGlsZHJlbjpjaGlsZHJlbn0pO2NoaWxkcmVuPWVsLmNoaWxkcmVuO2Nsb3Npbmc9ZWwuY2xvc2luZzt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IEpTWE5vZGUuSlNYRWxlbWVudChvcGVuaW5nLGNoaWxkcmVuLGNsb3NpbmcpKTt9O0pTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hSb290PWZ1bmN0aW9uKCl7aWYodGhpcy5jb25maWcudG9rZW5zKXt0aGlzLnRva2Vucy5wb3AoKTt9CnRoaXMuc3RhcnRKU1goKTt2YXIgZWxlbWVudD10aGlzLnBhcnNlSlNYRWxlbWVudCgpO3RoaXMuZmluaXNoSlNYKCk7cmV0dXJuIGVsZW1lbnQ7fTtKU1hQYXJzZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uLmNhbGwodGhpcyl8fHRoaXMubWF0Y2goJzwnKTt9O3JldHVybiBKU1hQYXJzZXI7fShwYXJzZXJfMS5QYXJzZXIpO2V4cG9ydHMuSlNYUGFyc2VyPUpTWFBhcnNlcjt9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIFJlZ2V4PXtOb25Bc2NpaUlkZW50aWZpZXJTdGFydDovW1x4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwOEEwLVx1MDhCNFx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM2MFx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkVFLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MThBOFx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTUwLVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MUEwMC1cdTFBMTZcdTFBMjAtXHUxQTU0XHUxQUE3XHUxQjA1LVx1MUIzM1x1MUI0NS1cdTFCNEJcdTFCODMtXHUxQkEwXHUxQkFFXHUxQkFGXHUxQkJBLVx1MUJFNVx1MUMwMC1cdTFDMjNcdTFDNEQtXHUxQzRGXHUxQzVBLVx1MUM3RFx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YxXHUxQ0Y1XHUxQ0Y2XHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE4LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE2MC1cdTIxODhcdTJDMDAtXHUyQzJFXHUyQzMwLVx1MkM1RVx1MkM2MC1cdTJDRTRcdTJDRUItXHUyQ0VFXHUyQ0YyXHUyQ0YzXHUyRDAwLVx1MkQyNVx1MkQyN1x1MkQyRFx1MkQzMC1cdTJENjdcdTJENkZcdTJEODAtXHUyRDk2XHUyREEwLVx1MkRBNlx1MkRBOC1cdTJEQUVcdTJEQjAtXHUyREI2XHUyREI4LVx1MkRCRVx1MkRDMC1cdTJEQzZcdTJEQzgtXHUyRENFXHUyREQwLVx1MkRENlx1MkREOC1cdTJEREVcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyOVx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5Qi1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkRcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZENVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MUZcdUE2MkFcdUE2MkJcdUE2NDAtXHVBNjZFXHVBNjdGLVx1QTY5RFx1QTZBMC1cdUE2RUZcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QURcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgwMVx1QTgwMy1cdUE4MDVcdUE4MDctXHVBODBBXHVBODBDLVx1QTgyMlx1QTg0MC1cdUE4NzNcdUE4ODItXHVBOEIzXHVBOEYyLVx1QThGN1x1QThGQlx1QThGRFx1QTkwQS1cdUE5MjVcdUE5MzAtXHVBOTQ2XHVBOTYwLVx1QTk3Q1x1QTk4NC1cdUE5QjJcdUE5Q0ZcdUE5RTAtXHVBOUU0XHVBOUU2LVx1QTlFRlx1QTlGQS1cdUE5RkVcdUFBMDAtXHVBQTI4XHVBQTQwLVx1QUE0Mlx1QUE0NC1cdUFBNEJcdUFBNjAtXHVBQTc2XHVBQTdBXHVBQTdFLVx1QUFBRlx1QUFCMVx1QUFCNVx1QUFCNlx1QUFCOS1cdUFBQkRcdUFBQzBcdUFBQzJcdUFBREItXHVBQUREXHVBQUUwLVx1QUFFQVx1QUFGMi1cdUFBRjRcdUFCMDEtXHVBQjA2XHVBQjA5LVx1QUIwRVx1QUIxMS1cdUFCMTZcdUFCMjAtXHVBQjI2XHVBQjI4LVx1QUIyRVx1QUIzMC1cdUFCNUFcdUFCNUMtXHVBQjY1XHVBQjcwLVx1QUJFMlx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMURcdUZCMUYtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjIxLVx1RkYzQVx1RkY0MS1cdUZGNUFcdUZGNjYtXHVGRkJFXHVGRkMyLVx1RkZDN1x1RkZDQS1cdUZGQ0ZcdUZGRDItXHVGRkQ3XHVGRkRBLVx1RkZEQ118XHVEODAwW1x1REMwMC1cdURDMEJcdURDMEQtXHVEQzI2XHVEQzI4LVx1REMzQVx1REMzQ1x1REMzRFx1REMzRi1cdURDNERcdURDNTAtXHVEQzVEXHVEQzgwLVx1RENGQVx1REQ0MC1cdURENzRcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMzAtXHVERjRBXHVERjUwLVx1REY3NVx1REY4MC1cdURGOURcdURGQTAtXHVERkMzXHVERkM4LVx1REZDRlx1REZEMS1cdURGRDVdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REYwMC1cdURGMTldfFx1RDgwNltcdURDQTAtXHVEQ0RGXHVEQ0ZGXHVERUMwLVx1REVGOF18XHVEODA4W1x1REMwMC1cdURGOTldfFx1RDgwOVtcdURDMDAtXHVEQzZFXHVEQzgwLVx1REQ0M118W1x1RDgwQ1x1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Ml1bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkVdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REYwMC1cdURGNDRcdURGNTBcdURGOTMtXHVERjlGXXxcdUQ4MkNbXHVEQzAwXHVEQzAxXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF0vLE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6L1tceEFBXHhCNVx4QjdceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDMwMC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4My1cdTA0ODdcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1OTEtXHUwNUJEXHUwNUJGXHUwNUMxXHUwNUMyXHUwNUM0XHUwNUM1XHUwNUM3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MTAtXHUwNjFBXHUwNjIwLVx1MDY2OVx1MDY2RS1cdTA2RDNcdTA2RDUtXHUwNkRDXHUwNkRGLVx1MDZFOFx1MDZFQS1cdTA2RkNcdTA2RkZcdTA3MTAtXHUwNzRBXHUwNzRELVx1MDdCMVx1MDdDMC1cdTA3RjVcdTA3RkFcdTA4MDAtXHUwODJEXHUwODQwLVx1MDg1Qlx1MDhBMC1cdTA4QjRcdTA4RTMtXHUwOTYzXHUwOTY2LVx1MDk2Rlx1MDk3MS1cdTA5ODNcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJDLVx1MDlDNFx1MDlDN1x1MDlDOFx1MDlDQi1cdTA5Q0VcdTA5RDdcdTA5RENcdTA5RERcdTA5REYtXHUwOUUzXHUwOUU2LVx1MDlGMVx1MEEwMS1cdTBBMDNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBM0NcdTBBM0UtXHUwQTQyXHUwQTQ3XHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE1MVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNjYtXHUwQTc1XHUwQTgxLVx1MEE4M1x1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJDLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQUQwXHUwQUUwLVx1MEFFM1x1MEFFNi1cdTBBRUZcdTBBRjlcdTBCMDEtXHUwQjAzXHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzQy1cdTBCNDRcdTBCNDdcdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2XHUwQjU3XHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2M1x1MEI2Ni1cdTBCNkZcdTBCNzFcdTBCODJcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEMFx1MEJEN1x1MEJFNi1cdTBCRUZcdTBDMDAtXHUwQzAzXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRC1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NVx1MEM1Nlx1MEM1OC1cdTBDNUFcdTBDNjAtXHUwQzYzXHUwQzY2LVx1MEM2Rlx1MEM4MS1cdTBDODNcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCQy1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENVx1MENENlx1MENERVx1MENFMC1cdTBDRTNcdTBDRTYtXHUwQ0VGXHUwQ0YxXHUwQ0YyXHUwRDAxLVx1MEQwM1x1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRC1cdTBENDRcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RVx1MEQ1N1x1MEQ1Ri1cdTBENjNcdTBENjYtXHUwRDZGXHUwRDdBLVx1MEQ3Rlx1MEQ4Mlx1MEQ4M1x1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBEQ0FcdTBEQ0YtXHUwREQ0XHUwREQ2XHUwREQ4LVx1MERERlx1MERFNi1cdTBERUZcdTBERjJcdTBERjNcdTBFMDEtXHUwRTNBXHUwRTQwLVx1MEU0RVx1MEU1MC1cdTBFNTlcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUI5XHUwRUJCLVx1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFQzgtXHUwRUNEXHUwRUQwLVx1MEVEOVx1MEVEQy1cdTBFREZcdTBGMDBcdTBGMThcdTBGMTlcdTBGMjAtXHUwRjI5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY5N1x1MEY5OS1cdTBGQkNcdTBGQzZcdTEwMDAtXHUxMDQ5XHUxMDUwLVx1MTA5RFx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzNUQtXHUxMzVGXHUxMzY5LVx1MTM3MVx1MTM4MC1cdTEzOEZcdTEzQTAtXHUxM0Y1XHUxM0Y4LVx1MTNGRFx1MTQwMS1cdTE2NkNcdTE2NkYtXHUxNjdGXHUxNjgxLVx1MTY5QVx1MTZBMC1cdTE2RUFcdTE2RUUtXHUxNkY4XHUxNzAwLVx1MTcwQ1x1MTcwRS1cdTE3MTRcdTE3MjAtXHUxNzM0XHUxNzQwLVx1MTc1M1x1MTc2MC1cdTE3NkNcdTE3NkUtXHUxNzcwXHUxNzcyXHUxNzczXHUxNzgwLVx1MTdEM1x1MTdEN1x1MTdEQ1x1MTdERFx1MTdFMC1cdTE3RTlcdTE4MEItXHUxODBEXHUxODEwLVx1MTgxOVx1MTgyMC1cdTE4NzdcdTE4ODAtXHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5MjAtXHUxOTJCXHUxOTMwLVx1MTkzQlx1MTk0Ni1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTE5RDAtXHUxOURBXHUxQTAwLVx1MUExQlx1MUEyMC1cdTFBNUVcdTFBNjAtXHUxQTdDXHUxQTdGLVx1MUE4OVx1MUE5MC1cdTFBOTlcdTFBQTdcdTFBQjAtXHUxQUJEXHUxQjAwLVx1MUI0Qlx1MUI1MC1cdTFCNTlcdTFCNkItXHUxQjczXHUxQjgwLVx1MUJGM1x1MUMwMC1cdTFDMzdcdTFDNDAtXHUxQzQ5XHUxQzRELVx1MUM3RFx1MUNEMC1cdTFDRDJcdTFDRDQtXHUxQ0Y2XHUxQ0Y4XHUxQ0Y5XHUxRDAwLVx1MURGNVx1MURGQy1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjAwQ1x1MjAwRFx1MjAzRlx1MjA0MFx1MjA1NFx1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIwRDAtXHUyMERDXHUyMEUxXHUyMEU1LVx1MjBGMFx1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTgtXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTYwLVx1MjE4OFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ3Ri1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkRFMC1cdTJERkZcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyRlx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5OS1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkRcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZENVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MkJcdUE2NDAtXHVBNjZGXHVBNjc0LVx1QTY3RFx1QTY3Ri1cdUE2RjFcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QURcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgyN1x1QTg0MC1cdUE4NzNcdUE4ODAtXHVBOEM0XHVBOEQwLVx1QThEOVx1QThFMC1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MDAtXHVBOTJEXHVBOTMwLVx1QTk1M1x1QTk2MC1cdUE5N0NcdUE5ODAtXHVBOUMwXHVBOUNGLVx1QTlEOVx1QTlFMC1cdUE5RkVcdUFBMDAtXHVBQTM2XHVBQTQwLVx1QUE0RFx1QUE1MC1cdUFBNTlcdUFBNjAtXHVBQTc2XHVBQTdBLVx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVGXHVBQUYyLVx1QUFGNlx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkVBXHVBQkVDXHVBQkVEXHVBQkYwLVx1QUJGOVx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMUQtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkUwMC1cdUZFMEZcdUZFMjAtXHVGRTJGXHVGRTMzXHVGRTM0XHVGRTRELVx1RkU0Rlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjEwLVx1RkYxOVx1RkYyMS1cdUZGM0FcdUZGM0ZcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVEREZEXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURFRTBcdURGMDAtXHVERjFGXHVERjMwLVx1REY0QVx1REY1MC1cdURGN0FcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENBMC1cdURDQTlcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N118XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMC1cdURFMDNcdURFMDVcdURFMDZcdURFMEMtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFMzgtXHVERTNBXHVERTNGXHVERTYwLVx1REU3Q1x1REU4MC1cdURFOUNcdURFQzAtXHVERUM3XHVERUM5LVx1REVFNlx1REYwMC1cdURGMzVcdURGNDAtXHVERjU1XHVERjYwLVx1REY3Mlx1REY4MC1cdURGOTFdfFx1RDgwM1tcdURDMDAtXHVEQzQ4XHVEQzgwLVx1RENCMlx1RENDMC1cdURDRjJdfFx1RDgwNFtcdURDMDAtXHVEQzQ2XHVEQzY2LVx1REM2Rlx1REM3Ri1cdURDQkFcdURDRDAtXHVEQ0U4XHVEQ0YwLVx1RENGOVx1REQwMC1cdUREMzRcdUREMzYtXHVERDNGXHVERDUwLVx1REQ3M1x1REQ3Nlx1REQ4MC1cdUREQzRcdUREQ0EtXHVERENDXHVEREQwLVx1REREQVx1REREQ1x1REUwMC1cdURFMTFcdURFMTMtXHVERTM3XHVERTgwLVx1REU4Nlx1REU4OFx1REU4QS1cdURFOERcdURFOEYtXHVERTlEXHVERTlGLVx1REVBOFx1REVCMC1cdURFRUFcdURFRjAtXHVERUY5XHVERjAwLVx1REYwM1x1REYwNS1cdURGMENcdURGMEZcdURGMTBcdURGMTMtXHVERjI4XHVERjJBLVx1REYzMFx1REYzMlx1REYzM1x1REYzNS1cdURGMzlcdURGM0MtXHVERjQ0XHVERjQ3XHVERjQ4XHVERjRCLVx1REY0RFx1REY1MFx1REY1N1x1REY1RC1cdURGNjNcdURGNjYtXHVERjZDXHVERjcwLVx1REY3NF18XHVEODA1W1x1REM4MC1cdURDQzVcdURDQzdcdURDRDAtXHVEQ0Q5XHVERDgwLVx1RERCNVx1RERCOC1cdUREQzBcdURERDgtXHVEREREXHVERTAwLVx1REU0MFx1REU0NFx1REU1MC1cdURFNTlcdURFODAtXHVERUI3XHVERUMwLVx1REVDOVx1REYwMC1cdURGMTlcdURGMUQtXHVERjJCXHVERjMwLVx1REYzOV18XHVEODA2W1x1RENBMC1cdURDRTlcdURDRkZcdURFQzAtXHVERUY4XXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REMwMC1cdURDNkVcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRV18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REU2MC1cdURFNjlcdURFRDAtXHVERUVEXHVERUYwLVx1REVGNFx1REYwMC1cdURGMzZcdURGNDAtXHVERjQzXHVERjUwLVx1REY1OVx1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERjAwLVx1REY0NFx1REY1MC1cdURGN0VcdURGOEYtXHVERjlGXXxcdUQ4MkNbXHVEQzAwXHVEQzAxXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OVx1REM5RFx1REM5RV18XHVEODM0W1x1REQ2NS1cdURENjlcdURENkQtXHVERDcyXHVERDdCLVx1REQ4Mlx1REQ4NS1cdUREOEJcdUREQUEtXHVEREFEXHVERTQyLVx1REU0NF18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JcdURGQ0UtXHVERkZGXXxcdUQ4MzZbXHVERTAwLVx1REUzNlx1REUzQi1cdURFNkNcdURFNzVcdURFODRcdURFOUItXHVERTlGXHVERUExLVx1REVBRl18XHVEODNBW1x1REMwMC1cdURDQzRcdURDRDAtXHVEQ0Q2XXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF18XHVEQjQwW1x1REQwMC1cdURERUZdL307ZXhwb3J0cy5DaGFyYWN0ZXI9e2Zyb21Db2RlUG9pbnQ6ZnVuY3Rpb24oY3Ape3JldHVybiBjcDwweDEwMDAwP1N0cmluZy5mcm9tQ2hhckNvZGUoY3ApOlN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwKyhjcC0weDEwMDAwPj4xMCkpKwpTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCsoY3AtMHgxMDAwMCYxMDIzKSk7fSxpc1doaXRlU3BhY2U6ZnVuY3Rpb24oY3Ape3JldHVybiBjcD09PTB4MjB8fGNwPT09MHgwOXx8Y3A9PT0weDBCfHxjcD09PTB4MEN8fGNwPT09MHhBMHx8Y3A+PTB4MTY4MCYmWzB4MTY4MCwweDIwMDAsMHgyMDAxLDB4MjAwMiwweDIwMDMsMHgyMDA0LDB4MjAwNSwweDIwMDYsMHgyMDA3LDB4MjAwOCwweDIwMDksMHgyMDBBLDB4MjAyRiwweDIwNUYsMHgzMDAwLDB4RkVGRl0uaW5kZXhPZihjcCk+PTA7fSxpc0xpbmVUZXJtaW5hdG9yOmZ1bmN0aW9uKGNwKXtyZXR1cm4gY3A9PT0weDBBfHxjcD09PTB4MER8fGNwPT09MHgyMDI4fHxjcD09PTB4MjAyOTt9LGlzSWRlbnRpZmllclN0YXJ0OmZ1bmN0aW9uKGNwKXtyZXR1cm4gY3A9PT0weDI0fHxjcD09PTB4NUZ8fGNwPj0weDQxJiZjcDw9MHg1QXx8Y3A+PTB4NjEmJmNwPD0weDdBfHxjcD09PTB4NUN8fGNwPj0weDgwJiZSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJTdGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKTt9LGlzSWRlbnRpZmllclBhcnQ6ZnVuY3Rpb24oY3Ape3JldHVybiBjcD09PTB4MjR8fGNwPT09MHg1Rnx8Y3A+PTB4NDEmJmNwPD0weDVBfHxjcD49MHg2MSYmY3A8PTB4N0F8fGNwPj0weDMwJiZjcDw9MHgzOXx8Y3A9PT0weDVDfHxjcD49MHg4MCYmUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyUGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKTt9LGlzRGVjaW1hbERpZ2l0OmZ1bmN0aW9uKGNwKXtyZXR1cm4gY3A+PTB4MzAmJmNwPD0weDM5O30saXNIZXhEaWdpdDpmdW5jdGlvbihjcCl7cmV0dXJuIGNwPj0weDMwJiZjcDw9MHgzOXx8Y3A+PTB4NDEmJmNwPD0weDQ2fHxjcD49MHg2MSYmY3A8PTB4NjY7fSxpc09jdGFsRGlnaXQ6ZnVuY3Rpb24oY3Ape3JldHVybiBjcD49MHgzMCYmY3A8PTB4Mzc7fX07fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIGpzeF9zeW50YXhfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDYpO3ZhciBKU1hDbG9zaW5nRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIEpTWENsb3NpbmdFbGVtZW50KG5hbWUpe3RoaXMudHlwZT1qc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWENsb3NpbmdFbGVtZW50O3RoaXMubmFtZT1uYW1lO30KcmV0dXJuIEpTWENsb3NpbmdFbGVtZW50O30oKTtleHBvcnRzLkpTWENsb3NpbmdFbGVtZW50PUpTWENsb3NpbmdFbGVtZW50O3ZhciBKU1hFbGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYRWxlbWVudChvcGVuaW5nRWxlbWVudCxjaGlsZHJlbixjbG9zaW5nRWxlbWVudCl7dGhpcy50eXBlPWpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYRWxlbWVudDt0aGlzLm9wZW5pbmdFbGVtZW50PW9wZW5pbmdFbGVtZW50O3RoaXMuY2hpbGRyZW49Y2hpbGRyZW47dGhpcy5jbG9zaW5nRWxlbWVudD1jbG9zaW5nRWxlbWVudDt9CnJldHVybiBKU1hFbGVtZW50O30oKTtleHBvcnRzLkpTWEVsZW1lbnQ9SlNYRWxlbWVudDt2YXIgSlNYRW1wdHlFeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYRW1wdHlFeHByZXNzaW9uKCl7dGhpcy50eXBlPWpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYRW1wdHlFeHByZXNzaW9uO30KcmV0dXJuIEpTWEVtcHR5RXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5KU1hFbXB0eUV4cHJlc3Npb249SlNYRW1wdHlFeHByZXNzaW9uO3ZhciBKU1hFeHByZXNzaW9uQ29udGFpbmVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKXt0aGlzLnR5cGU9anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hFeHByZXNzaW9uQ29udGFpbmVyO3RoaXMuZXhwcmVzc2lvbj1leHByZXNzaW9uO30KcmV0dXJuIEpTWEV4cHJlc3Npb25Db250YWluZXI7fSgpO2V4cG9ydHMuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcj1KU1hFeHByZXNzaW9uQ29udGFpbmVyO3ZhciBKU1hJZGVudGlmaWVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYSWRlbnRpZmllcihuYW1lKXt0aGlzLnR5cGU9anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyO3RoaXMubmFtZT1uYW1lO30KcmV0dXJuIEpTWElkZW50aWZpZXI7fSgpO2V4cG9ydHMuSlNYSWRlbnRpZmllcj1KU1hJZGVudGlmaWVyO3ZhciBKU1hNZW1iZXJFeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYTWVtYmVyRXhwcmVzc2lvbihvYmplY3QscHJvcGVydHkpe3RoaXMudHlwZT1qc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE1lbWJlckV4cHJlc3Npb247dGhpcy5vYmplY3Q9b2JqZWN0O3RoaXMucHJvcGVydHk9cHJvcGVydHk7fQpyZXR1cm4gSlNYTWVtYmVyRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5KU1hNZW1iZXJFeHByZXNzaW9uPUpTWE1lbWJlckV4cHJlc3Npb247dmFyIEpTWEF0dHJpYnV0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIEpTWEF0dHJpYnV0ZShuYW1lLHZhbHVlKXt0aGlzLnR5cGU9anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hBdHRyaWJ1dGU7dGhpcy5uYW1lPW5hbWU7dGhpcy52YWx1ZT12YWx1ZTt9CnJldHVybiBKU1hBdHRyaWJ1dGU7fSgpO2V4cG9ydHMuSlNYQXR0cmlidXRlPUpTWEF0dHJpYnV0ZTt2YXIgSlNYTmFtZXNwYWNlZE5hbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsbmFtZSl7dGhpcy50eXBlPWpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTmFtZXNwYWNlZE5hbWU7dGhpcy5uYW1lc3BhY2U9bmFtZXNwYWNlO3RoaXMubmFtZT1uYW1lO30KcmV0dXJuIEpTWE5hbWVzcGFjZWROYW1lO30oKTtleHBvcnRzLkpTWE5hbWVzcGFjZWROYW1lPUpTWE5hbWVzcGFjZWROYW1lO3ZhciBKU1hPcGVuaW5nRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIEpTWE9wZW5pbmdFbGVtZW50KG5hbWUsc2VsZkNsb3NpbmcsYXR0cmlidXRlcyl7dGhpcy50eXBlPWpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYT3BlbmluZ0VsZW1lbnQ7dGhpcy5uYW1lPW5hbWU7dGhpcy5zZWxmQ2xvc2luZz1zZWxmQ2xvc2luZzt0aGlzLmF0dHJpYnV0ZXM9YXR0cmlidXRlczt9CnJldHVybiBKU1hPcGVuaW5nRWxlbWVudDt9KCk7ZXhwb3J0cy5KU1hPcGVuaW5nRWxlbWVudD1KU1hPcGVuaW5nRWxlbWVudDt2YXIgSlNYU3ByZWFkQXR0cmlidXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSlNYU3ByZWFkQXR0cmlidXRlKGFyZ3VtZW50KXt0aGlzLnR5cGU9anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hTcHJlYWRBdHRyaWJ1dGU7dGhpcy5hcmd1bWVudD1hcmd1bWVudDt9CnJldHVybiBKU1hTcHJlYWRBdHRyaWJ1dGU7fSgpO2V4cG9ydHMuSlNYU3ByZWFkQXR0cmlidXRlPUpTWFNwcmVhZEF0dHJpYnV0ZTt2YXIgSlNYVGV4dD1mdW5jdGlvbigpe2Z1bmN0aW9uIEpTWFRleHQodmFsdWUscmF3KXt0aGlzLnR5cGU9anN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hUZXh0O3RoaXMudmFsdWU9dmFsdWU7dGhpcy5yYXc9cmF3O30KcmV0dXJuIEpTWFRleHQ7fSgpO2V4cG9ydHMuSlNYVGV4dD1KU1hUZXh0O30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLkpTWFN5bnRheD17SlNYQXR0cmlidXRlOidKU1hBdHRyaWJ1dGUnLEpTWENsb3NpbmdFbGVtZW50OidKU1hDbG9zaW5nRWxlbWVudCcsSlNYRWxlbWVudDonSlNYRWxlbWVudCcsSlNYRW1wdHlFeHByZXNzaW9uOidKU1hFbXB0eUV4cHJlc3Npb24nLEpTWEV4cHJlc3Npb25Db250YWluZXI6J0pTWEV4cHJlc3Npb25Db250YWluZXInLEpTWElkZW50aWZpZXI6J0pTWElkZW50aWZpZXInLEpTWE1lbWJlckV4cHJlc3Npb246J0pTWE1lbWJlckV4cHJlc3Npb24nLEpTWE5hbWVzcGFjZWROYW1lOidKU1hOYW1lc3BhY2VkTmFtZScsSlNYT3BlbmluZ0VsZW1lbnQ6J0pTWE9wZW5pbmdFbGVtZW50JyxKU1hTcHJlYWRBdHRyaWJ1dGU6J0pTWFNwcmVhZEF0dHJpYnV0ZScsSlNYVGV4dDonSlNYVGV4dCd9O30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBzeW50YXhfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDIpO3ZhciBBcnJheUV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBBcnJheUV4cHJlc3Npb24oZWxlbWVudHMpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uO3RoaXMuZWxlbWVudHM9ZWxlbWVudHM7fQpyZXR1cm4gQXJyYXlFeHByZXNzaW9uO30oKTtleHBvcnRzLkFycmF5RXhwcmVzc2lvbj1BcnJheUV4cHJlc3Npb247dmFyIEFycmF5UGF0dGVybj1mdW5jdGlvbigpe2Z1bmN0aW9uIEFycmF5UGF0dGVybihlbGVtZW50cyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm47dGhpcy5lbGVtZW50cz1lbGVtZW50czt9CnJldHVybiBBcnJheVBhdHRlcm47fSgpO2V4cG9ydHMuQXJyYXlQYXR0ZXJuPUFycmF5UGF0dGVybjt2YXIgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihwYXJhbXMsYm9keSxleHByZXNzaW9uKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uO3RoaXMuaWQ9bnVsbDt0aGlzLnBhcmFtcz1wYXJhbXM7dGhpcy5ib2R5PWJvZHk7dGhpcy5nZW5lcmF0b3I9ZmFsc2U7dGhpcy5leHByZXNzaW9uPWV4cHJlc3Npb247dGhpcy5hc3luYz1mYWxzZTt9CnJldHVybiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj1BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjt2YXIgQXNzaWdubWVudEV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvcixsZWZ0LHJpZ2h0KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uO3RoaXMub3BlcmF0b3I9b3BlcmF0b3I7dGhpcy5sZWZ0PWxlZnQ7dGhpcy5yaWdodD1yaWdodDt9CnJldHVybiBBc3NpZ25tZW50RXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5Bc3NpZ25tZW50RXhwcmVzc2lvbj1Bc3NpZ25tZW50RXhwcmVzc2lvbjt2YXIgQXNzaWdubWVudFBhdHRlcm49ZnVuY3Rpb24oKXtmdW5jdGlvbiBBc3NpZ25tZW50UGF0dGVybihsZWZ0LHJpZ2h0KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuO3RoaXMubGVmdD1sZWZ0O3RoaXMucmlnaHQ9cmlnaHQ7fQpyZXR1cm4gQXNzaWdubWVudFBhdHRlcm47fSgpO2V4cG9ydHMuQXNzaWdubWVudFBhdHRlcm49QXNzaWdubWVudFBhdHRlcm47dmFyIEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcyxib2R5LGV4cHJlc3Npb24pe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247dGhpcy5pZD1udWxsO3RoaXMucGFyYW1zPXBhcmFtczt0aGlzLmJvZHk9Ym9keTt0aGlzLmdlbmVyYXRvcj1mYWxzZTt0aGlzLmV4cHJlc3Npb249ZXhwcmVzc2lvbjt0aGlzLmFzeW5jPXRydWU7fQpyZXR1cm4gQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5Bc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uPUFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247dmFyIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbihpZCxwYXJhbXMsYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5GdW5jdGlvbkRlY2xhcmF0aW9uO3RoaXMuaWQ9aWQ7dGhpcy5wYXJhbXM9cGFyYW1zO3RoaXMuYm9keT1ib2R5O3RoaXMuZ2VuZXJhdG9yPWZhbHNlO3RoaXMuZXhwcmVzc2lvbj1mYWxzZTt0aGlzLmFzeW5jPXRydWU7fQpyZXR1cm4gQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uO30oKTtleHBvcnRzLkFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbj1Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb247dmFyIEFzeW5jRnVuY3Rpb25FeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24oaWQscGFyYW1zLGJvZHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRnVuY3Rpb25FeHByZXNzaW9uO3RoaXMuaWQ9aWQ7dGhpcy5wYXJhbXM9cGFyYW1zO3RoaXMuYm9keT1ib2R5O3RoaXMuZ2VuZXJhdG9yPWZhbHNlO3RoaXMuZXhwcmVzc2lvbj1mYWxzZTt0aGlzLmFzeW5jPXRydWU7fQpyZXR1cm4gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb247fSgpO2V4cG9ydHMuQXN5bmNGdW5jdGlvbkV4cHJlc3Npb249QXN5bmNGdW5jdGlvbkV4cHJlc3Npb247dmFyIEF3YWl0RXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEF3YWl0RXhwcmVzc2lvbihhcmd1bWVudCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5Bd2FpdEV4cHJlc3Npb247dGhpcy5hcmd1bWVudD1hcmd1bWVudDt9CnJldHVybiBBd2FpdEV4cHJlc3Npb247fSgpO2V4cG9ydHMuQXdhaXRFeHByZXNzaW9uPUF3YWl0RXhwcmVzc2lvbjt2YXIgQmluYXJ5RXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsbGVmdCxyaWdodCl7dmFyIGxvZ2ljYWw9b3BlcmF0b3I9PT0nfHwnfHxvcGVyYXRvcj09PScmJic7dGhpcy50eXBlPWxvZ2ljYWw/c3ludGF4XzEuU3ludGF4LkxvZ2ljYWxFeHByZXNzaW9uOnN5bnRheF8xLlN5bnRheC5CaW5hcnlFeHByZXNzaW9uO3RoaXMub3BlcmF0b3I9b3BlcmF0b3I7dGhpcy5sZWZ0PWxlZnQ7dGhpcy5yaWdodD1yaWdodDt9CnJldHVybiBCaW5hcnlFeHByZXNzaW9uO30oKTtleHBvcnRzLkJpbmFyeUV4cHJlc3Npb249QmluYXJ5RXhwcmVzc2lvbjt2YXIgQmxvY2tTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCbG9ja1N0YXRlbWVudChib2R5KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkJsb2NrU3RhdGVtZW50O3RoaXMuYm9keT1ib2R5O30KcmV0dXJuIEJsb2NrU3RhdGVtZW50O30oKTtleHBvcnRzLkJsb2NrU3RhdGVtZW50PUJsb2NrU3RhdGVtZW50O3ZhciBCcmVha1N0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIEJyZWFrU3RhdGVtZW50KGxhYmVsKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkJyZWFrU3RhdGVtZW50O3RoaXMubGFiZWw9bGFiZWw7fQpyZXR1cm4gQnJlYWtTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuQnJlYWtTdGF0ZW1lbnQ9QnJlYWtTdGF0ZW1lbnQ7dmFyIENhbGxFeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ2FsbEV4cHJlc3Npb24oY2FsbGVlLGFyZ3Mpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguQ2FsbEV4cHJlc3Npb247dGhpcy5jYWxsZWU9Y2FsbGVlO3RoaXMuYXJndW1lbnRzPWFyZ3M7fQpyZXR1cm4gQ2FsbEV4cHJlc3Npb247fSgpO2V4cG9ydHMuQ2FsbEV4cHJlc3Npb249Q2FsbEV4cHJlc3Npb247dmFyIENhdGNoQ2xhdXNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ2F0Y2hDbGF1c2UocGFyYW0sYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5DYXRjaENsYXVzZTt0aGlzLnBhcmFtPXBhcmFtO3RoaXMuYm9keT1ib2R5O30KcmV0dXJuIENhdGNoQ2xhdXNlO30oKTtleHBvcnRzLkNhdGNoQ2xhdXNlPUNhdGNoQ2xhdXNlO3ZhciBDbGFzc0JvZHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBDbGFzc0JvZHkoYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5DbGFzc0JvZHk7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gQ2xhc3NCb2R5O30oKTtleHBvcnRzLkNsYXNzQm9keT1DbGFzc0JvZHk7dmFyIENsYXNzRGVjbGFyYXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBDbGFzc0RlY2xhcmF0aW9uKGlkLHN1cGVyQ2xhc3MsYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5DbGFzc0RlY2xhcmF0aW9uO3RoaXMuaWQ9aWQ7dGhpcy5zdXBlckNsYXNzPXN1cGVyQ2xhc3M7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gQ2xhc3NEZWNsYXJhdGlvbjt9KCk7ZXhwb3J0cy5DbGFzc0RlY2xhcmF0aW9uPUNsYXNzRGVjbGFyYXRpb247dmFyIENsYXNzRXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIENsYXNzRXhwcmVzc2lvbihpZCxzdXBlckNsYXNzLGJvZHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguQ2xhc3NFeHByZXNzaW9uO3RoaXMuaWQ9aWQ7dGhpcy5zdXBlckNsYXNzPXN1cGVyQ2xhc3M7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gQ2xhc3NFeHByZXNzaW9uO30oKTtleHBvcnRzLkNsYXNzRXhwcmVzc2lvbj1DbGFzc0V4cHJlc3Npb247dmFyIENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbihvYmplY3QscHJvcGVydHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguTWVtYmVyRXhwcmVzc2lvbjt0aGlzLmNvbXB1dGVkPXRydWU7dGhpcy5vYmplY3Q9b2JqZWN0O3RoaXMucHJvcGVydHk9cHJvcGVydHk7fQpyZXR1cm4gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uO30oKTtleHBvcnRzLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbj1Db21wdXRlZE1lbWJlckV4cHJlc3Npb247dmFyIENvbmRpdGlvbmFsRXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIENvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXN0LGNvbnNlcXVlbnQsYWx0ZXJuYXRlKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkNvbmRpdGlvbmFsRXhwcmVzc2lvbjt0aGlzLnRlc3Q9dGVzdDt0aGlzLmNvbnNlcXVlbnQ9Y29uc2VxdWVudDt0aGlzLmFsdGVybmF0ZT1hbHRlcm5hdGU7fQpyZXR1cm4gQ29uZGl0aW9uYWxFeHByZXNzaW9uO30oKTtleHBvcnRzLkNvbmRpdGlvbmFsRXhwcmVzc2lvbj1Db25kaXRpb25hbEV4cHJlc3Npb247dmFyIENvbnRpbnVlU3RhdGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ29udGludWVTdGF0ZW1lbnQobGFiZWwpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguQ29udGludWVTdGF0ZW1lbnQ7dGhpcy5sYWJlbD1sYWJlbDt9CnJldHVybiBDb250aW51ZVN0YXRlbWVudDt9KCk7ZXhwb3J0cy5Db250aW51ZVN0YXRlbWVudD1Db250aW51ZVN0YXRlbWVudDt2YXIgRGVidWdnZXJTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEZWJ1Z2dlclN0YXRlbWVudCgpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRGVidWdnZXJTdGF0ZW1lbnQ7fQpyZXR1cm4gRGVidWdnZXJTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuRGVidWdnZXJTdGF0ZW1lbnQ9RGVidWdnZXJTdGF0ZW1lbnQ7dmFyIERpcmVjdGl2ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIERpcmVjdGl2ZShleHByZXNzaW9uLGRpcmVjdGl2ZSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5FeHByZXNzaW9uU3RhdGVtZW50O3RoaXMuZXhwcmVzc2lvbj1leHByZXNzaW9uO3RoaXMuZGlyZWN0aXZlPWRpcmVjdGl2ZTt9CnJldHVybiBEaXJlY3RpdmU7fSgpO2V4cG9ydHMuRGlyZWN0aXZlPURpcmVjdGl2ZTt2YXIgRG9XaGlsZVN0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIERvV2hpbGVTdGF0ZW1lbnQoYm9keSx0ZXN0KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkRvV2hpbGVTdGF0ZW1lbnQ7dGhpcy5ib2R5PWJvZHk7dGhpcy50ZXN0PXRlc3Q7fQpyZXR1cm4gRG9XaGlsZVN0YXRlbWVudDt9KCk7ZXhwb3J0cy5Eb1doaWxlU3RhdGVtZW50PURvV2hpbGVTdGF0ZW1lbnQ7dmFyIEVtcHR5U3RhdGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRW1wdHlTdGF0ZW1lbnQoKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkVtcHR5U3RhdGVtZW50O30KcmV0dXJuIEVtcHR5U3RhdGVtZW50O30oKTtleHBvcnRzLkVtcHR5U3RhdGVtZW50PUVtcHR5U3RhdGVtZW50O3ZhciBFeHBvcnRBbGxEZWNsYXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEV4cG9ydEFsbERlY2xhcmF0aW9uKHNvdXJjZSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5FeHBvcnRBbGxEZWNsYXJhdGlvbjt0aGlzLnNvdXJjZT1zb3VyY2U7fQpyZXR1cm4gRXhwb3J0QWxsRGVjbGFyYXRpb247fSgpO2V4cG9ydHMuRXhwb3J0QWxsRGVjbGFyYXRpb249RXhwb3J0QWxsRGVjbGFyYXRpb247dmFyIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbil7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb247dGhpcy5kZWNsYXJhdGlvbj1kZWNsYXJhdGlvbjt9CnJldHVybiBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb247fSgpO2V4cG9ydHMuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPUV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjt2YXIgRXhwb3J0TmFtZWREZWNsYXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sc3BlY2lmaWVycyxzb3VyY2Upe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRXhwb3J0TmFtZWREZWNsYXJhdGlvbjt0aGlzLmRlY2xhcmF0aW9uPWRlY2xhcmF0aW9uO3RoaXMuc3BlY2lmaWVycz1zcGVjaWZpZXJzO3RoaXMuc291cmNlPXNvdXJjZTt9CnJldHVybiBFeHBvcnROYW1lZERlY2xhcmF0aW9uO30oKTtleHBvcnRzLkV4cG9ydE5hbWVkRGVjbGFyYXRpb249RXhwb3J0TmFtZWREZWNsYXJhdGlvbjt2YXIgRXhwb3J0U3BlY2lmaWVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRXhwb3J0U3BlY2lmaWVyKGxvY2FsLGV4cG9ydGVkKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkV4cG9ydFNwZWNpZmllcjt0aGlzLmV4cG9ydGVkPWV4cG9ydGVkO3RoaXMubG9jYWw9bG9jYWw7fQpyZXR1cm4gRXhwb3J0U3BlY2lmaWVyO30oKTtleHBvcnRzLkV4cG9ydFNwZWNpZmllcj1FeHBvcnRTcGVjaWZpZXI7dmFyIEV4cHJlc3Npb25TdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRXhwcmVzc2lvblN0YXRlbWVudDt0aGlzLmV4cHJlc3Npb249ZXhwcmVzc2lvbjt9CnJldHVybiBFeHByZXNzaW9uU3RhdGVtZW50O30oKTtleHBvcnRzLkV4cHJlc3Npb25TdGF0ZW1lbnQ9RXhwcmVzc2lvblN0YXRlbWVudDt2YXIgRm9ySW5TdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBGb3JJblN0YXRlbWVudChsZWZ0LHJpZ2h0LGJvZHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRm9ySW5TdGF0ZW1lbnQ7dGhpcy5sZWZ0PWxlZnQ7dGhpcy5yaWdodD1yaWdodDt0aGlzLmJvZHk9Ym9keTt0aGlzLmVhY2g9ZmFsc2U7fQpyZXR1cm4gRm9ySW5TdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuRm9ySW5TdGF0ZW1lbnQ9Rm9ySW5TdGF0ZW1lbnQ7dmFyIEZvck9mU3RhdGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRm9yT2ZTdGF0ZW1lbnQobGVmdCxyaWdodCxib2R5KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkZvck9mU3RhdGVtZW50O3RoaXMubGVmdD1sZWZ0O3RoaXMucmlnaHQ9cmlnaHQ7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gRm9yT2ZTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuRm9yT2ZTdGF0ZW1lbnQ9Rm9yT2ZTdGF0ZW1lbnQ7dmFyIEZvclN0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIEZvclN0YXRlbWVudChpbml0LHRlc3QsdXBkYXRlLGJvZHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguRm9yU3RhdGVtZW50O3RoaXMuaW5pdD1pbml0O3RoaXMudGVzdD10ZXN0O3RoaXMudXBkYXRlPXVwZGF0ZTt0aGlzLmJvZHk9Ym9keTt9CnJldHVybiBGb3JTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuRm9yU3RhdGVtZW50PUZvclN0YXRlbWVudDt2YXIgRnVuY3Rpb25EZWNsYXJhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEZ1bmN0aW9uRGVjbGFyYXRpb24oaWQscGFyYW1zLGJvZHksZ2VuZXJhdG9yKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRGVjbGFyYXRpb247dGhpcy5pZD1pZDt0aGlzLnBhcmFtcz1wYXJhbXM7dGhpcy5ib2R5PWJvZHk7dGhpcy5nZW5lcmF0b3I9Z2VuZXJhdG9yO3RoaXMuZXhwcmVzc2lvbj1mYWxzZTt0aGlzLmFzeW5jPWZhbHNlO30KcmV0dXJuIEZ1bmN0aW9uRGVjbGFyYXRpb247fSgpO2V4cG9ydHMuRnVuY3Rpb25EZWNsYXJhdGlvbj1GdW5jdGlvbkRlY2xhcmF0aW9uO3ZhciBGdW5jdGlvbkV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBGdW5jdGlvbkV4cHJlc3Npb24oaWQscGFyYW1zLGJvZHksZ2VuZXJhdG9yKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRXhwcmVzc2lvbjt0aGlzLmlkPWlkO3RoaXMucGFyYW1zPXBhcmFtczt0aGlzLmJvZHk9Ym9keTt0aGlzLmdlbmVyYXRvcj1nZW5lcmF0b3I7dGhpcy5leHByZXNzaW9uPWZhbHNlO3RoaXMuYXN5bmM9ZmFsc2U7fQpyZXR1cm4gRnVuY3Rpb25FeHByZXNzaW9uO30oKTtleHBvcnRzLkZ1bmN0aW9uRXhwcmVzc2lvbj1GdW5jdGlvbkV4cHJlc3Npb247dmFyIElkZW50aWZpZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBJZGVudGlmaWVyKG5hbWUpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguSWRlbnRpZmllcjt0aGlzLm5hbWU9bmFtZTt9CnJldHVybiBJZGVudGlmaWVyO30oKTtleHBvcnRzLklkZW50aWZpZXI9SWRlbnRpZmllcjt2YXIgSWZTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBJZlN0YXRlbWVudCh0ZXN0LGNvbnNlcXVlbnQsYWx0ZXJuYXRlKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LklmU3RhdGVtZW50O3RoaXMudGVzdD10ZXN0O3RoaXMuY29uc2VxdWVudD1jb25zZXF1ZW50O3RoaXMuYWx0ZXJuYXRlPWFsdGVybmF0ZTt9CnJldHVybiBJZlN0YXRlbWVudDt9KCk7ZXhwb3J0cy5JZlN0YXRlbWVudD1JZlN0YXRlbWVudDt2YXIgSW1wb3J0RGVjbGFyYXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBJbXBvcnREZWNsYXJhdGlvbihzcGVjaWZpZXJzLHNvdXJjZSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5JbXBvcnREZWNsYXJhdGlvbjt0aGlzLnNwZWNpZmllcnM9c3BlY2lmaWVyczt0aGlzLnNvdXJjZT1zb3VyY2U7fQpyZXR1cm4gSW1wb3J0RGVjbGFyYXRpb247fSgpO2V4cG9ydHMuSW1wb3J0RGVjbGFyYXRpb249SW1wb3J0RGVjbGFyYXRpb247dmFyIEltcG9ydERlZmF1bHRTcGVjaWZpZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkltcG9ydERlZmF1bHRTcGVjaWZpZXI7dGhpcy5sb2NhbD1sb2NhbDt9CnJldHVybiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyO30oKTtleHBvcnRzLkltcG9ydERlZmF1bHRTcGVjaWZpZXI9SW1wb3J0RGVmYXVsdFNwZWNpZmllcjt2YXIgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjt0aGlzLmxvY2FsPWxvY2FsO30KcmV0dXJuIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjt9KCk7ZXhwb3J0cy5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI9SW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyO3ZhciBJbXBvcnRTcGVjaWZpZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBJbXBvcnRTcGVjaWZpZXIobG9jYWwsaW1wb3J0ZWQpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguSW1wb3J0U3BlY2lmaWVyO3RoaXMubG9jYWw9bG9jYWw7dGhpcy5pbXBvcnRlZD1pbXBvcnRlZDt9CnJldHVybiBJbXBvcnRTcGVjaWZpZXI7fSgpO2V4cG9ydHMuSW1wb3J0U3BlY2lmaWVyPUltcG9ydFNwZWNpZmllcjt2YXIgTGFiZWxlZFN0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIExhYmVsZWRTdGF0ZW1lbnQobGFiZWwsYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5MYWJlbGVkU3RhdGVtZW50O3RoaXMubGFiZWw9bGFiZWw7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gTGFiZWxlZFN0YXRlbWVudDt9KCk7ZXhwb3J0cy5MYWJlbGVkU3RhdGVtZW50PUxhYmVsZWRTdGF0ZW1lbnQ7dmFyIExpdGVyYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBMaXRlcmFsKHZhbHVlLHJhdyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5MaXRlcmFsO3RoaXMudmFsdWU9dmFsdWU7dGhpcy5yYXc9cmF3O30KcmV0dXJuIExpdGVyYWw7fSgpO2V4cG9ydHMuTGl0ZXJhbD1MaXRlcmFsO3ZhciBNZXRhUHJvcGVydHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBNZXRhUHJvcGVydHkobWV0YSxwcm9wZXJ0eSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5NZXRhUHJvcGVydHk7dGhpcy5tZXRhPW1ldGE7dGhpcy5wcm9wZXJ0eT1wcm9wZXJ0eTt9CnJldHVybiBNZXRhUHJvcGVydHk7fSgpO2V4cG9ydHMuTWV0YVByb3BlcnR5PU1ldGFQcm9wZXJ0eTt2YXIgTWV0aG9kRGVmaW5pdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIE1ldGhvZERlZmluaXRpb24oa2V5LGNvbXB1dGVkLHZhbHVlLGtpbmQsaXNTdGF0aWMpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguTWV0aG9kRGVmaW5pdGlvbjt0aGlzLmtleT1rZXk7dGhpcy5jb21wdXRlZD1jb21wdXRlZDt0aGlzLnZhbHVlPXZhbHVlO3RoaXMua2luZD1raW5kO3RoaXMuc3RhdGljPWlzU3RhdGljO30KcmV0dXJuIE1ldGhvZERlZmluaXRpb247fSgpO2V4cG9ydHMuTWV0aG9kRGVmaW5pdGlvbj1NZXRob2REZWZpbml0aW9uO3ZhciBNb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBNb2R1bGUoYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO3RoaXMuYm9keT1ib2R5O3RoaXMuc291cmNlVHlwZT0nbW9kdWxlJzt9CnJldHVybiBNb2R1bGU7fSgpO2V4cG9ydHMuTW9kdWxlPU1vZHVsZTt2YXIgTmV3RXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIE5ld0V4cHJlc3Npb24oY2FsbGVlLGFyZ3Mpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguTmV3RXhwcmVzc2lvbjt0aGlzLmNhbGxlZT1jYWxsZWU7dGhpcy5hcmd1bWVudHM9YXJnczt9CnJldHVybiBOZXdFeHByZXNzaW9uO30oKTtleHBvcnRzLk5ld0V4cHJlc3Npb249TmV3RXhwcmVzc2lvbjt2YXIgT2JqZWN0RXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIE9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5PYmplY3RFeHByZXNzaW9uO3RoaXMucHJvcGVydGllcz1wcm9wZXJ0aWVzO30KcmV0dXJuIE9iamVjdEV4cHJlc3Npb247fSgpO2V4cG9ydHMuT2JqZWN0RXhwcmVzc2lvbj1PYmplY3RFeHByZXNzaW9uO3ZhciBPYmplY3RQYXR0ZXJuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gT2JqZWN0UGF0dGVybihwcm9wZXJ0aWVzKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47dGhpcy5wcm9wZXJ0aWVzPXByb3BlcnRpZXM7fQpyZXR1cm4gT2JqZWN0UGF0dGVybjt9KCk7ZXhwb3J0cy5PYmplY3RQYXR0ZXJuPU9iamVjdFBhdHRlcm47dmFyIFByb3BlcnR5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUHJvcGVydHkoa2luZCxrZXksY29tcHV0ZWQsdmFsdWUsbWV0aG9kLHNob3J0aGFuZCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5Qcm9wZXJ0eTt0aGlzLmtleT1rZXk7dGhpcy5jb21wdXRlZD1jb21wdXRlZDt0aGlzLnZhbHVlPXZhbHVlO3RoaXMua2luZD1raW5kO3RoaXMubWV0aG9kPW1ldGhvZDt0aGlzLnNob3J0aGFuZD1zaG9ydGhhbmQ7fQpyZXR1cm4gUHJvcGVydHk7fSgpO2V4cG9ydHMuUHJvcGVydHk9UHJvcGVydHk7dmFyIFJlZ2V4TGl0ZXJhbD1mdW5jdGlvbigpe2Z1bmN0aW9uIFJlZ2V4TGl0ZXJhbCh2YWx1ZSxyYXcscGF0dGVybixmbGFncyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5MaXRlcmFsO3RoaXMudmFsdWU9dmFsdWU7dGhpcy5yYXc9cmF3O3RoaXMucmVnZXg9e3BhdHRlcm46cGF0dGVybixmbGFnczpmbGFnc307fQpyZXR1cm4gUmVnZXhMaXRlcmFsO30oKTtleHBvcnRzLlJlZ2V4TGl0ZXJhbD1SZWdleExpdGVyYWw7dmFyIFJlc3RFbGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmVzdEVsZW1lbnQoYXJndW1lbnQpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ7dGhpcy5hcmd1bWVudD1hcmd1bWVudDt9CnJldHVybiBSZXN0RWxlbWVudDt9KCk7ZXhwb3J0cy5SZXN0RWxlbWVudD1SZXN0RWxlbWVudDt2YXIgUmV0dXJuU3RhdGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUmV0dXJuU3RhdGVtZW50KGFyZ3VtZW50KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlJldHVyblN0YXRlbWVudDt0aGlzLmFyZ3VtZW50PWFyZ3VtZW50O30KcmV0dXJuIFJldHVyblN0YXRlbWVudDt9KCk7ZXhwb3J0cy5SZXR1cm5TdGF0ZW1lbnQ9UmV0dXJuU3RhdGVtZW50O3ZhciBTY3JpcHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBTY3JpcHQoYm9keSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO3RoaXMuYm9keT1ib2R5O3RoaXMuc291cmNlVHlwZT0nc2NyaXB0Jzt9CnJldHVybiBTY3JpcHQ7fSgpO2V4cG9ydHMuU2NyaXB0PVNjcmlwdDt2YXIgU2VxdWVuY2VFeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb25zKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlNlcXVlbmNlRXhwcmVzc2lvbjt0aGlzLmV4cHJlc3Npb25zPWV4cHJlc3Npb25zO30KcmV0dXJuIFNlcXVlbmNlRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5TZXF1ZW5jZUV4cHJlc3Npb249U2VxdWVuY2VFeHByZXNzaW9uO3ZhciBTcHJlYWRFbGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU3ByZWFkRWxlbWVudChhcmd1bWVudCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5TcHJlYWRFbGVtZW50O3RoaXMuYXJndW1lbnQ9YXJndW1lbnQ7fQpyZXR1cm4gU3ByZWFkRWxlbWVudDt9KCk7ZXhwb3J0cy5TcHJlYWRFbGVtZW50PVNwcmVhZEVsZW1lbnQ7dmFyIFN0YXRpY01lbWJlckV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBTdGF0aWNNZW1iZXJFeHByZXNzaW9uKG9iamVjdCxwcm9wZXJ0eSl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uO3RoaXMuY29tcHV0ZWQ9ZmFsc2U7dGhpcy5vYmplY3Q9b2JqZWN0O3RoaXMucHJvcGVydHk9cHJvcGVydHk7fQpyZXR1cm4gU3RhdGljTWVtYmVyRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5TdGF0aWNNZW1iZXJFeHByZXNzaW9uPVN0YXRpY01lbWJlckV4cHJlc3Npb247dmFyIFN1cGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU3VwZXIoKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlN1cGVyO30KcmV0dXJuIFN1cGVyO30oKTtleHBvcnRzLlN1cGVyPVN1cGVyO3ZhciBTd2l0Y2hDYXNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU3dpdGNoQ2FzZSh0ZXN0LGNvbnNlcXVlbnQpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguU3dpdGNoQ2FzZTt0aGlzLnRlc3Q9dGVzdDt0aGlzLmNvbnNlcXVlbnQ9Y29uc2VxdWVudDt9CnJldHVybiBTd2l0Y2hDYXNlO30oKTtleHBvcnRzLlN3aXRjaENhc2U9U3dpdGNoQ2FzZTt2YXIgU3dpdGNoU3RhdGVtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gU3dpdGNoU3RhdGVtZW50KGRpc2NyaW1pbmFudCxjYXNlcyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5Td2l0Y2hTdGF0ZW1lbnQ7dGhpcy5kaXNjcmltaW5hbnQ9ZGlzY3JpbWluYW50O3RoaXMuY2FzZXM9Y2FzZXM7fQpyZXR1cm4gU3dpdGNoU3RhdGVtZW50O30oKTtleHBvcnRzLlN3aXRjaFN0YXRlbWVudD1Td2l0Y2hTdGF0ZW1lbnQ7dmFyIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbih0YWcscXVhc2kpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO3RoaXMudGFnPXRhZzt0aGlzLnF1YXNpPXF1YXNpO30KcmV0dXJuIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb249VGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO3ZhciBUZW1wbGF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBUZW1wbGF0ZUVsZW1lbnQodmFsdWUsdGFpbCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUVsZW1lbnQ7dGhpcy52YWx1ZT12YWx1ZTt0aGlzLnRhaWw9dGFpbDt9CnJldHVybiBUZW1wbGF0ZUVsZW1lbnQ7fSgpO2V4cG9ydHMuVGVtcGxhdGVFbGVtZW50PVRlbXBsYXRlRWxlbWVudDt2YXIgVGVtcGxhdGVMaXRlcmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gVGVtcGxhdGVMaXRlcmFsKHF1YXNpcyxleHByZXNzaW9ucyl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUxpdGVyYWw7dGhpcy5xdWFzaXM9cXVhc2lzO3RoaXMuZXhwcmVzc2lvbnM9ZXhwcmVzc2lvbnM7fQpyZXR1cm4gVGVtcGxhdGVMaXRlcmFsO30oKTtleHBvcnRzLlRlbXBsYXRlTGl0ZXJhbD1UZW1wbGF0ZUxpdGVyYWw7dmFyIFRoaXNFeHByZXNzaW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gVGhpc0V4cHJlc3Npb24oKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlRoaXNFeHByZXNzaW9uO30KcmV0dXJuIFRoaXNFeHByZXNzaW9uO30oKTtleHBvcnRzLlRoaXNFeHByZXNzaW9uPVRoaXNFeHByZXNzaW9uO3ZhciBUaHJvd1N0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIFRocm93U3RhdGVtZW50KGFyZ3VtZW50KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlRocm93U3RhdGVtZW50O3RoaXMuYXJndW1lbnQ9YXJndW1lbnQ7fQpyZXR1cm4gVGhyb3dTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuVGhyb3dTdGF0ZW1lbnQ9VGhyb3dTdGF0ZW1lbnQ7dmFyIFRyeVN0YXRlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIFRyeVN0YXRlbWVudChibG9jayxoYW5kbGVyLGZpbmFsaXplcil7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5UcnlTdGF0ZW1lbnQ7dGhpcy5ibG9jaz1ibG9jazt0aGlzLmhhbmRsZXI9aGFuZGxlcjt0aGlzLmZpbmFsaXplcj1maW5hbGl6ZXI7fQpyZXR1cm4gVHJ5U3RhdGVtZW50O30oKTtleHBvcnRzLlRyeVN0YXRlbWVudD1UcnlTdGF0ZW1lbnQ7dmFyIFVuYXJ5RXhwcmVzc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIFVuYXJ5RXhwcmVzc2lvbihvcGVyYXRvcixhcmd1bWVudCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5VbmFyeUV4cHJlc3Npb247dGhpcy5vcGVyYXRvcj1vcGVyYXRvcjt0aGlzLmFyZ3VtZW50PWFyZ3VtZW50O3RoaXMucHJlZml4PXRydWU7fQpyZXR1cm4gVW5hcnlFeHByZXNzaW9uO30oKTtleHBvcnRzLlVuYXJ5RXhwcmVzc2lvbj1VbmFyeUV4cHJlc3Npb247dmFyIFVwZGF0ZUV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBVcGRhdGVFeHByZXNzaW9uKG9wZXJhdG9yLGFyZ3VtZW50LHByZWZpeCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5VcGRhdGVFeHByZXNzaW9uO3RoaXMub3BlcmF0b3I9b3BlcmF0b3I7dGhpcy5hcmd1bWVudD1hcmd1bWVudDt0aGlzLnByZWZpeD1wcmVmaXg7fQpyZXR1cm4gVXBkYXRlRXhwcmVzc2lvbjt9KCk7ZXhwb3J0cy5VcGRhdGVFeHByZXNzaW9uPVVwZGF0ZUV4cHJlc3Npb247dmFyIFZhcmlhYmxlRGVjbGFyYXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBWYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucyxraW5kKXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb247dGhpcy5kZWNsYXJhdGlvbnM9ZGVjbGFyYXRpb25zO3RoaXMua2luZD1raW5kO30KcmV0dXJuIFZhcmlhYmxlRGVjbGFyYXRpb247fSgpO2V4cG9ydHMuVmFyaWFibGVEZWNsYXJhdGlvbj1WYXJpYWJsZURlY2xhcmF0aW9uO3ZhciBWYXJpYWJsZURlY2xhcmF0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBWYXJpYWJsZURlY2xhcmF0b3IoaWQsaW5pdCl7dGhpcy50eXBlPXN5bnRheF8xLlN5bnRheC5WYXJpYWJsZURlY2xhcmF0b3I7dGhpcy5pZD1pZDt0aGlzLmluaXQ9aW5pdDt9CnJldHVybiBWYXJpYWJsZURlY2xhcmF0b3I7fSgpO2V4cG9ydHMuVmFyaWFibGVEZWNsYXJhdG9yPVZhcmlhYmxlRGVjbGFyYXRvcjt2YXIgV2hpbGVTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXaGlsZVN0YXRlbWVudCh0ZXN0LGJvZHkpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguV2hpbGVTdGF0ZW1lbnQ7dGhpcy50ZXN0PXRlc3Q7dGhpcy5ib2R5PWJvZHk7fQpyZXR1cm4gV2hpbGVTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuV2hpbGVTdGF0ZW1lbnQ9V2hpbGVTdGF0ZW1lbnQ7dmFyIFdpdGhTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBXaXRoU3RhdGVtZW50KG9iamVjdCxib2R5KXt0aGlzLnR5cGU9c3ludGF4XzEuU3ludGF4LldpdGhTdGF0ZW1lbnQ7dGhpcy5vYmplY3Q9b2JqZWN0O3RoaXMuYm9keT1ib2R5O30KcmV0dXJuIFdpdGhTdGF0ZW1lbnQ7fSgpO2V4cG9ydHMuV2l0aFN0YXRlbWVudD1XaXRoU3RhdGVtZW50O3ZhciBZaWVsZEV4cHJlc3Npb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBZaWVsZEV4cHJlc3Npb24oYXJndW1lbnQsZGVsZWdhdGUpe3RoaXMudHlwZT1zeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uO3RoaXMuYXJndW1lbnQ9YXJndW1lbnQ7dGhpcy5kZWxlZ2F0ZT1kZWxlZ2F0ZTt9CnJldHVybiBZaWVsZEV4cHJlc3Npb247fSgpO2V4cG9ydHMuWWllbGRFeHByZXNzaW9uPVlpZWxkRXhwcmVzc2lvbjt9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgYXNzZXJ0XzE9X193ZWJwYWNrX3JlcXVpcmVfXyg5KTt2YXIgZXJyb3JfaGFuZGxlcl8xPV9fd2VicGFja19yZXF1aXJlX18oMTApO3ZhciBtZXNzYWdlc18xPV9fd2VicGFja19yZXF1aXJlX18oMTEpO3ZhciBOb2RlPV9fd2VicGFja19yZXF1aXJlX18oNyk7dmFyIHNjYW5uZXJfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTt2YXIgc3ludGF4XzE9X193ZWJwYWNrX3JlcXVpcmVfXygyKTt2YXIgdG9rZW5fMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTt2YXIgQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcj0nQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcic7dmFyIFBhcnNlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIFBhcnNlcihjb2RlLG9wdGlvbnMsZGVsZWdhdGUpe2lmKG9wdGlvbnM9PT12b2lkIDApe29wdGlvbnM9e307fQp0aGlzLmNvbmZpZz17cmFuZ2U6dHlwZW9mIG9wdGlvbnMucmFuZ2U9PT0nYm9vbGVhbicmJm9wdGlvbnMucmFuZ2UsbG9jOnR5cGVvZiBvcHRpb25zLmxvYz09PSdib29sZWFuJyYmb3B0aW9ucy5sb2Msc291cmNlOm51bGwsdG9rZW5zOnR5cGVvZiBvcHRpb25zLnRva2Vucz09PSdib29sZWFuJyYmb3B0aW9ucy50b2tlbnMsY29tbWVudDp0eXBlb2Ygb3B0aW9ucy5jb21tZW50PT09J2Jvb2xlYW4nJiZvcHRpb25zLmNvbW1lbnQsdG9sZXJhbnQ6dHlwZW9mIG9wdGlvbnMudG9sZXJhbnQ9PT0nYm9vbGVhbicmJm9wdGlvbnMudG9sZXJhbnR9O2lmKHRoaXMuY29uZmlnLmxvYyYmb3B0aW9ucy5zb3VyY2UmJm9wdGlvbnMuc291cmNlIT09bnVsbCl7dGhpcy5jb25maWcuc291cmNlPVN0cmluZyhvcHRpb25zLnNvdXJjZSk7fQp0aGlzLmRlbGVnYXRlPWRlbGVnYXRlO3RoaXMuZXJyb3JIYW5kbGVyPW5ldyBlcnJvcl9oYW5kbGVyXzEuRXJyb3JIYW5kbGVyKCk7dGhpcy5lcnJvckhhbmRsZXIudG9sZXJhbnQ9dGhpcy5jb25maWcudG9sZXJhbnQ7dGhpcy5zY2FubmVyPW5ldyBzY2FubmVyXzEuU2Nhbm5lcihjb2RlLHRoaXMuZXJyb3JIYW5kbGVyKTt0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50PXRoaXMuY29uZmlnLmNvbW1lbnQ7dGhpcy5vcGVyYXRvclByZWNlZGVuY2U9eycpJzowLCc7JzowLCcsJzowLCc9JzowLCddJzowLCd8fCc6MSwnJiYnOjIsJ3wnOjMsJ14nOjQsJyYnOjUsJz09Jzo2LCchPSc6NiwnPT09Jzo2LCchPT0nOjYsJzwnOjcsJz4nOjcsJzw9Jzo3LCc+PSc6NywnPDwnOjgsJz4+Jzo4LCc+Pj4nOjgsJysnOjksJy0nOjksJyonOjExLCcvJzoxMSwnJSc6MTF9O3RoaXMubG9va2FoZWFkPXt0eXBlOjIsdmFsdWU6JycsbGluZU51bWJlcjp0aGlzLnNjYW5uZXIubGluZU51bWJlcixsaW5lU3RhcnQ6MCxzdGFydDowLGVuZDowfTt0aGlzLmhhc0xpbmVUZXJtaW5hdG9yPWZhbHNlO3RoaXMuY29udGV4dD17aXNNb2R1bGU6ZmFsc2UsYXdhaXQ6ZmFsc2UsYWxsb3dJbjp0cnVlLGFsbG93U3RyaWN0RGlyZWN0aXZlOnRydWUsYWxsb3dZaWVsZDp0cnVlLGZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcjpudWxsLGlzQXNzaWdubWVudFRhcmdldDpmYWxzZSxpc0JpbmRpbmdFbGVtZW50OmZhbHNlLGluRnVuY3Rpb25Cb2R5OmZhbHNlLGluSXRlcmF0aW9uOmZhbHNlLGluU3dpdGNoOmZhbHNlLGxhYmVsU2V0Ont9LHN0cmljdDpmYWxzZX07dGhpcy50b2tlbnM9W107dGhpcy5zdGFydE1hcmtlcj17aW5kZXg6MCxsaW5lOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGNvbHVtbjowfTt0aGlzLmxhc3RNYXJrZXI9e2luZGV4OjAsbGluZTp0aGlzLnNjYW5uZXIubGluZU51bWJlcixjb2x1bW46MH07dGhpcy5uZXh0VG9rZW4oKTt0aGlzLmxhc3RNYXJrZXI9e2luZGV4OnRoaXMuc2Nhbm5lci5pbmRleCxsaW5lOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGNvbHVtbjp0aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydH07fQpQYXJzZXIucHJvdG90eXBlLnRocm93RXJyb3I9ZnVuY3Rpb24obWVzc2FnZUZvcm1hdCl7dmFyIHZhbHVlcz1bXTtmb3IodmFyIF9pPTE7X2k8YXJndW1lbnRzLmxlbmd0aDtfaSsrKXt2YWx1ZXNbX2ktMV09YXJndW1lbnRzW19pXTt9CnZhciBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt2YXIgbXNnPW1lc3NhZ2VGb3JtYXQucmVwbGFjZSgvJShcZCkvZyxmdW5jdGlvbih3aG9sZSxpZHgpe2Fzc2VydF8xLmFzc2VydChpZHg8YXJncy5sZW5ndGgsJ01lc3NhZ2UgcmVmZXJlbmNlIG11c3QgYmUgaW4gcmFuZ2UnKTtyZXR1cm4gYXJnc1tpZHhdO30pO3ZhciBpbmRleD10aGlzLmxhc3RNYXJrZXIuaW5kZXg7dmFyIGxpbmU9dGhpcy5sYXN0TWFya2VyLmxpbmU7dmFyIGNvbHVtbj10aGlzLmxhc3RNYXJrZXIuY29sdW1uKzE7dGhyb3cgdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoaW5kZXgsbGluZSxjb2x1bW4sbXNnKTt9O1BhcnNlci5wcm90b3R5cGUudG9sZXJhdGVFcnJvcj1mdW5jdGlvbihtZXNzYWdlRm9ybWF0KXt2YXIgdmFsdWVzPVtdO2Zvcih2YXIgX2k9MTtfaTxhcmd1bWVudHMubGVuZ3RoO19pKyspe3ZhbHVlc1tfaS0xXT1hcmd1bWVudHNbX2ldO30KdmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3ZhciBtc2c9bWVzc2FnZUZvcm1hdC5yZXBsYWNlKC8lKFxkKS9nLGZ1bmN0aW9uKHdob2xlLGlkeCl7YXNzZXJ0XzEuYXNzZXJ0KGlkeDxhcmdzLmxlbmd0aCwnTWVzc2FnZSByZWZlcmVuY2UgbXVzdCBiZSBpbiByYW5nZScpO3JldHVybiBhcmdzW2lkeF07fSk7dmFyIGluZGV4PXRoaXMubGFzdE1hcmtlci5pbmRleDt2YXIgbGluZT10aGlzLnNjYW5uZXIubGluZU51bWJlcjt2YXIgY29sdW1uPXRoaXMubGFzdE1hcmtlci5jb2x1bW4rMTt0aGlzLmVycm9ySGFuZGxlci50b2xlcmF0ZUVycm9yKGluZGV4LGxpbmUsY29sdW1uLG1zZyk7fTtQYXJzZXIucHJvdG90eXBlLnVuZXhwZWN0ZWRUb2tlbkVycm9yPWZ1bmN0aW9uKHRva2VuLG1lc3NhZ2Upe3ZhciBtc2c9bWVzc2FnZXx8bWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW47dmFyIHZhbHVlO2lmKHRva2VuKXtpZighbWVzc2FnZSl7bXNnPXRva2VuLnR5cGU9PT0yP21lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZEVPUzp0b2tlbi50eXBlPT09Mz9tZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRJZGVudGlmaWVyOnRva2VuLnR5cGU9PT02P21lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZE51bWJlcjp0b2tlbi50eXBlPT09OD9tZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRTdHJpbmc6dG9rZW4udHlwZT09PTEwP21lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRlbXBsYXRlOm1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuO2lmKHRva2VuLnR5cGU9PT00KXtpZih0aGlzLnNjYW5uZXIuaXNGdXR1cmVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKXttc2c9bWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkUmVzZXJ2ZWQ7fWVsc2UKaWYodGhpcy5jb250ZXh0LnN0cmljdCYmdGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpe21zZz1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDt9fX0KdmFsdWU9dG9rZW4udmFsdWU7fWVsc2UKe3ZhbHVlPSdJTExFR0FMJzt9Cm1zZz1tc2cucmVwbGFjZSgnJTAnLHZhbHVlKTtpZih0b2tlbiYmdHlwZW9mIHRva2VuLmxpbmVOdW1iZXI9PT0nbnVtYmVyJyl7dmFyIGluZGV4PXRva2VuLnN0YXJ0O3ZhciBsaW5lPXRva2VuLmxpbmVOdW1iZXI7dmFyIGxhc3RNYXJrZXJMaW5lU3RhcnQ9dGhpcy5sYXN0TWFya2VyLmluZGV4LXRoaXMubGFzdE1hcmtlci5jb2x1bW47dmFyIGNvbHVtbj10b2tlbi5zdGFydC1sYXN0TWFya2VyTGluZVN0YXJ0KzE7cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LGxpbmUsY29sdW1uLG1zZyk7fWVsc2UKe3ZhciBpbmRleD10aGlzLmxhc3RNYXJrZXIuaW5kZXg7dmFyIGxpbmU9dGhpcy5sYXN0TWFya2VyLmxpbmU7dmFyIGNvbHVtbj10aGlzLmxhc3RNYXJrZXIuY29sdW1uKzE7cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LGxpbmUsY29sdW1uLG1zZyk7fX07UGFyc2VyLnByb3RvdHlwZS50aHJvd1VuZXhwZWN0ZWRUb2tlbj1mdW5jdGlvbih0b2tlbixtZXNzYWdlKXt0aHJvdyB0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLG1lc3NhZ2UpO307UGFyc2VyLnByb3RvdHlwZS50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbj1mdW5jdGlvbih0b2tlbixtZXNzYWdlKXt0aGlzLmVycm9ySGFuZGxlci50b2xlcmF0ZSh0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLG1lc3NhZ2UpKTt9O1BhcnNlci5wcm90b3R5cGUuY29sbGVjdENvbW1lbnRzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY29uZmlnLmNvbW1lbnQpe3RoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTt9ZWxzZQp7dmFyIGNvbW1lbnRzPXRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtpZihjb21tZW50cy5sZW5ndGg+MCYmdGhpcy5kZWxlZ2F0ZSl7Zm9yKHZhciBpPTA7aTxjb21tZW50cy5sZW5ndGg7KytpKXt2YXIgZT1jb21tZW50c1tpXTt2YXIgbm9kZT12b2lkIDA7bm9kZT17dHlwZTplLm11bHRpTGluZT8nQmxvY2tDb21tZW50JzonTGluZUNvbW1lbnQnLHZhbHVlOnRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UoZS5zbGljZVswXSxlLnNsaWNlWzFdKX07aWYodGhpcy5jb25maWcucmFuZ2Upe25vZGUucmFuZ2U9ZS5yYW5nZTt9CmlmKHRoaXMuY29uZmlnLmxvYyl7bm9kZS5sb2M9ZS5sb2M7fQp2YXIgbWV0YWRhdGE9e3N0YXJ0OntsaW5lOmUubG9jLnN0YXJ0LmxpbmUsY29sdW1uOmUubG9jLnN0YXJ0LmNvbHVtbixvZmZzZXQ6ZS5yYW5nZVswXX0sZW5kOntsaW5lOmUubG9jLmVuZC5saW5lLGNvbHVtbjplLmxvYy5lbmQuY29sdW1uLG9mZnNldDplLnJhbmdlWzFdfX07dGhpcy5kZWxlZ2F0ZShub2RlLG1ldGFkYXRhKTt9fX19O1BhcnNlci5wcm90b3R5cGUuZ2V0VG9rZW5SYXc9ZnVuY3Rpb24odG9rZW4pe3JldHVybiB0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKHRva2VuLnN0YXJ0LHRva2VuLmVuZCk7fTtQYXJzZXIucHJvdG90eXBlLmNvbnZlcnRUb2tlbj1mdW5jdGlvbih0b2tlbil7dmFyIHQ9e3R5cGU6dG9rZW5fMS5Ub2tlbk5hbWVbdG9rZW4udHlwZV0sdmFsdWU6dGhpcy5nZXRUb2tlblJhdyh0b2tlbil9O2lmKHRoaXMuY29uZmlnLnJhbmdlKXt0LnJhbmdlPVt0b2tlbi5zdGFydCx0b2tlbi5lbmRdO30KaWYodGhpcy5jb25maWcubG9jKXt0LmxvYz17c3RhcnQ6e2xpbmU6dGhpcy5zdGFydE1hcmtlci5saW5lLGNvbHVtbjp0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbn0sZW5kOntsaW5lOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGNvbHVtbjp0aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydH19O30KaWYodG9rZW4udHlwZT09PTkpe3ZhciBwYXR0ZXJuPXRva2VuLnBhdHRlcm47dmFyIGZsYWdzPXRva2VuLmZsYWdzO3QucmVnZXg9e3BhdHRlcm46cGF0dGVybixmbGFnczpmbGFnc307fQpyZXR1cm4gdDt9O1BhcnNlci5wcm90b3R5cGUubmV4dFRva2VuPWZ1bmN0aW9uKCl7dmFyIHRva2VuPXRoaXMubG9va2FoZWFkO3RoaXMubGFzdE1hcmtlci5pbmRleD10aGlzLnNjYW5uZXIuaW5kZXg7dGhpcy5sYXN0TWFya2VyLmxpbmU9dGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7dGhpcy5sYXN0TWFya2VyLmNvbHVtbj10aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydDt0aGlzLmNvbGxlY3RDb21tZW50cygpO2lmKHRoaXMuc2Nhbm5lci5pbmRleCE9PXRoaXMuc3RhcnRNYXJrZXIuaW5kZXgpe3RoaXMuc3RhcnRNYXJrZXIuaW5kZXg9dGhpcy5zY2FubmVyLmluZGV4O3RoaXMuc3RhcnRNYXJrZXIubGluZT10aGlzLnNjYW5uZXIubGluZU51bWJlcjt0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbj10aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydDt9CnZhciBuZXh0PXRoaXMuc2Nhbm5lci5sZXgoKTt0aGlzLmhhc0xpbmVUZXJtaW5hdG9yPXRva2VuLmxpbmVOdW1iZXIhPT1uZXh0LmxpbmVOdW1iZXI7aWYobmV4dCYmdGhpcy5jb250ZXh0LnN0cmljdCYmbmV4dC50eXBlPT09Myl7aWYodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZChuZXh0LnZhbHVlKSl7bmV4dC50eXBlPTQ7fX0KdGhpcy5sb29rYWhlYWQ9bmV4dDtpZih0aGlzLmNvbmZpZy50b2tlbnMmJm5leHQudHlwZSE9PTIpe3RoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4obmV4dCkpO30KcmV0dXJuIHRva2VuO307UGFyc2VyLnByb3RvdHlwZS5uZXh0UmVnZXhUb2tlbj1mdW5jdGlvbigpe3RoaXMuY29sbGVjdENvbW1lbnRzKCk7dmFyIHRva2VuPXRoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCk7aWYodGhpcy5jb25maWcudG9rZW5zKXt0aGlzLnRva2Vucy5wb3AoKTt0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7fQp0aGlzLmxvb2thaGVhZD10b2tlbjt0aGlzLm5leHRUb2tlbigpO3JldHVybiB0b2tlbjt9O1BhcnNlci5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbigpe3JldHVybntpbmRleDp0aGlzLnN0YXJ0TWFya2VyLmluZGV4LGxpbmU6dGhpcy5zdGFydE1hcmtlci5saW5lLGNvbHVtbjp0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbn07fTtQYXJzZXIucHJvdG90eXBlLnN0YXJ0Tm9kZT1mdW5jdGlvbih0b2tlbil7cmV0dXJue2luZGV4OnRva2VuLnN0YXJ0LGxpbmU6dG9rZW4ubGluZU51bWJlcixjb2x1bW46dG9rZW4uc3RhcnQtdG9rZW4ubGluZVN0YXJ0fTt9O1BhcnNlci5wcm90b3R5cGUuZmluYWxpemU9ZnVuY3Rpb24obWFya2VyLG5vZGUpe2lmKHRoaXMuY29uZmlnLnJhbmdlKXtub2RlLnJhbmdlPVttYXJrZXIuaW5kZXgsdGhpcy5sYXN0TWFya2VyLmluZGV4XTt9CmlmKHRoaXMuY29uZmlnLmxvYyl7bm9kZS5sb2M9e3N0YXJ0OntsaW5lOm1hcmtlci5saW5lLGNvbHVtbjptYXJrZXIuY29sdW1ufSxlbmQ6e2xpbmU6dGhpcy5sYXN0TWFya2VyLmxpbmUsY29sdW1uOnRoaXMubGFzdE1hcmtlci5jb2x1bW59fTtpZih0aGlzLmNvbmZpZy5zb3VyY2Upe25vZGUubG9jLnNvdXJjZT10aGlzLmNvbmZpZy5zb3VyY2U7fX0KaWYodGhpcy5kZWxlZ2F0ZSl7dmFyIG1ldGFkYXRhPXtzdGFydDp7bGluZTptYXJrZXIubGluZSxjb2x1bW46bWFya2VyLmNvbHVtbixvZmZzZXQ6bWFya2VyLmluZGV4fSxlbmQ6e2xpbmU6dGhpcy5sYXN0TWFya2VyLmxpbmUsY29sdW1uOnRoaXMubGFzdE1hcmtlci5jb2x1bW4sb2Zmc2V0OnRoaXMubGFzdE1hcmtlci5pbmRleH19O3RoaXMuZGVsZWdhdGUobm9kZSxtZXRhZGF0YSk7fQpyZXR1cm4gbm9kZTt9O1BhcnNlci5wcm90b3R5cGUuZXhwZWN0PWZ1bmN0aW9uKHZhbHVlKXt2YXIgdG9rZW49dGhpcy5uZXh0VG9rZW4oKTtpZih0b2tlbi50eXBlIT09N3x8dG9rZW4udmFsdWUhPT12YWx1ZSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7fX07UGFyc2VyLnByb3RvdHlwZS5leHBlY3RDb21tYVNlcGFyYXRvcj1mdW5jdGlvbigpe2lmKHRoaXMuY29uZmlnLnRvbGVyYW50KXt2YXIgdG9rZW49dGhpcy5sb29rYWhlYWQ7aWYodG9rZW4udHlwZT09PTcmJnRva2VuLnZhbHVlPT09JywnKXt0aGlzLm5leHRUb2tlbigpO31lbHNlCmlmKHRva2VuLnR5cGU9PT03JiZ0b2tlbi52YWx1ZT09PSc7Jyl7dGhpcy5uZXh0VG9rZW4oKTt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuKTt9ZWxzZQp7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbixtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbik7fX1lbHNlCnt0aGlzLmV4cGVjdCgnLCcpO319O1BhcnNlci5wcm90b3R5cGUuZXhwZWN0S2V5d29yZD1mdW5jdGlvbihrZXl3b3JkKXt2YXIgdG9rZW49dGhpcy5uZXh0VG9rZW4oKTtpZih0b2tlbi50eXBlIT09NHx8dG9rZW4udmFsdWUhPT1rZXl3b3JkKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTt9fTtQYXJzZXIucHJvdG90eXBlLm1hdGNoPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZT09PTcmJnRoaXMubG9va2FoZWFkLnZhbHVlPT09dmFsdWU7fTtQYXJzZXIucHJvdG90eXBlLm1hdGNoS2V5d29yZD1mdW5jdGlvbihrZXl3b3JkKXtyZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZT09PTQmJnRoaXMubG9va2FoZWFkLnZhbHVlPT09a2V5d29yZDt9O1BhcnNlci5wcm90b3R5cGUubWF0Y2hDb250ZXh0dWFsS2V5d29yZD1mdW5jdGlvbihrZXl3b3JkKXtyZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZT09PTMmJnRoaXMubG9va2FoZWFkLnZhbHVlPT09a2V5d29yZDt9O1BhcnNlci5wcm90b3R5cGUubWF0Y2hBc3NpZ249ZnVuY3Rpb24oKXtpZih0aGlzLmxvb2thaGVhZC50eXBlIT09Nyl7cmV0dXJuIGZhbHNlO30KdmFyIG9wPXRoaXMubG9va2FoZWFkLnZhbHVlO3JldHVybiBvcD09PSc9J3x8b3A9PT0nKj0nfHxvcD09PScqKj0nfHxvcD09PScvPSd8fG9wPT09JyU9J3x8b3A9PT0nKz0nfHxvcD09PSctPSd8fG9wPT09Jzw8PSd8fG9wPT09Jz4+PSd8fG9wPT09Jz4+Pj0nfHxvcD09PScmPSd8fG9wPT09J149J3x8b3A9PT0nfD0nO307UGFyc2VyLnByb3RvdHlwZS5pc29sYXRlQ292ZXJHcmFtbWFyPWZ1bmN0aW9uKHBhcnNlRnVuY3Rpb24pe3ZhciBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQ9dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7dmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0PXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ7dmFyIHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yPXRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9dHJ1ZTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PXRydWU7dGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcj1udWxsO3ZhciByZXN1bHQ9cGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO2lmKHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IhPT1udWxsKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IpO30KdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9cHJldmlvdXNJc0JpbmRpbmdFbGVtZW50O3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9cHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQ7dGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcj1wcmV2aW91c0ZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcjtyZXR1cm4gcmVzdWx0O307UGFyc2VyLnByb3RvdHlwZS5pbmhlcml0Q292ZXJHcmFtbWFyPWZ1bmN0aW9uKHBhcnNlRnVuY3Rpb24pe3ZhciBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQ9dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7dmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0PXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ7dmFyIHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yPXRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9dHJ1ZTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PXRydWU7dGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcj1udWxsO3ZhciByZXN1bHQ9cGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PXRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50JiZwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQ7dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD10aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0JiZwcmV2aW91c0lzQXNzaWdubWVudFRhcmdldDt0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yPXByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yfHx0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO3JldHVybiByZXN1bHQ7fTtQYXJzZXIucHJvdG90eXBlLmNvbnN1bWVTZW1pY29sb249ZnVuY3Rpb24oKXtpZih0aGlzLm1hdGNoKCc7Jykpe3RoaXMubmV4dFRva2VuKCk7fWVsc2UKaWYoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3Ipe2lmKHRoaXMubG9va2FoZWFkLnR5cGUhPT0yJiYhdGhpcy5tYXRjaCgnfScpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9CnRoaXMubGFzdE1hcmtlci5pbmRleD10aGlzLnN0YXJ0TWFya2VyLmluZGV4O3RoaXMubGFzdE1hcmtlci5saW5lPXRoaXMuc3RhcnRNYXJrZXIubGluZTt0aGlzLmxhc3RNYXJrZXIuY29sdW1uPXRoaXMuc3RhcnRNYXJrZXIuY29sdW1uO319O1BhcnNlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBleHByO3ZhciB0b2tlbixyYXc7c3dpdGNoKHRoaXMubG9va2FoZWFkLnR5cGUpe2Nhc2UgMzppZigodGhpcy5jb250ZXh0LmlzTW9kdWxlfHx0aGlzLmNvbnRleHQuYXdhaXQpJiZ0aGlzLmxvb2thaGVhZC52YWx1ZT09PSdhd2FpdCcpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO30KZXhwcj10aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpP3RoaXMucGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKTp0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuSWRlbnRpZmllcih0aGlzLm5leHRUb2tlbigpLnZhbHVlKSk7YnJlYWs7Y2FzZSA2OmNhc2UgODppZih0aGlzLmNvbnRleHQuc3RyaWN0JiZ0aGlzLmxvb2thaGVhZC5vY3RhbCl7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCxtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7fQp0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO3Rva2VuPXRoaXMubmV4dFRva2VuKCk7cmF3PXRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO2V4cHI9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUscmF3KSk7YnJlYWs7Y2FzZSAxOnRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dG9rZW49dGhpcy5uZXh0VG9rZW4oKTtyYXc9dGhpcy5nZXRUb2tlblJhdyh0b2tlbik7ZXhwcj10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZT09PSd0cnVlJyxyYXcpKTticmVhaztjYXNlIDU6dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD1mYWxzZTt0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt0b2tlbj10aGlzLm5leHRUb2tlbigpO3Jhdz10aGlzLmdldFRva2VuUmF3KHRva2VuKTtleHByPXRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5MaXRlcmFsKG51bGwscmF3KSk7YnJlYWs7Y2FzZSAxMDpleHByPXRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTticmVhaztjYXNlIDc6c3dpdGNoKHRoaXMubG9va2FoZWFkLnZhbHVlKXtjYXNlJygnOnRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO2V4cHI9dGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VHcm91cEV4cHJlc3Npb24pO2JyZWFrO2Nhc2UnWyc6ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFycmF5SW5pdGlhbGl6ZXIpO2JyZWFrO2Nhc2Uneyc6ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZU9iamVjdEluaXRpYWxpemVyKTticmVhaztjYXNlJy8nOmNhc2UnLz0nOnRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dGhpcy5zY2FubmVyLmluZGV4PXRoaXMuc3RhcnRNYXJrZXIuaW5kZXg7dG9rZW49dGhpcy5uZXh0UmVnZXhUb2tlbigpO3Jhdz10aGlzLmdldFRva2VuUmF3KHRva2VuKTtleHByPXRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5SZWdleExpdGVyYWwodG9rZW4ucmVnZXgscmF3LHRva2VuLnBhdHRlcm4sdG9rZW4uZmxhZ3MpKTticmVhaztkZWZhdWx0OmV4cHI9dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTt9CmJyZWFrO2Nhc2UgNDppZighdGhpcy5jb250ZXh0LnN0cmljdCYmdGhpcy5jb250ZXh0LmFsbG93WWllbGQmJnRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpKXtleHByPXRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO31lbHNlCmlmKCF0aGlzLmNvbnRleHQuc3RyaWN0JiZ0aGlzLm1hdGNoS2V5d29yZCgnbGV0Jykpe2V4cHI9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLklkZW50aWZpZXIodGhpcy5uZXh0VG9rZW4oKS52YWx1ZSkpO31lbHNlCnt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO2lmKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKXtleHByPXRoaXMucGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKTt9ZWxzZQppZih0aGlzLm1hdGNoS2V5d29yZCgndGhpcycpKXt0aGlzLm5leHRUb2tlbigpO2V4cHI9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlRoaXNFeHByZXNzaW9uKCkpO31lbHNlCmlmKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKXtleHByPXRoaXMucGFyc2VDbGFzc0V4cHJlc3Npb24oKTt9ZWxzZQp7ZXhwcj10aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO319CmJyZWFrO2RlZmF1bHQ6ZXhwcj10aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO30KcmV0dXJuIGV4cHI7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlU3ByZWFkRWxlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0KCcuLi4nKTt2YXIgYXJnPXRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuU3ByZWFkRWxlbWVudChhcmcpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheUluaXRpYWxpemVyPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGVsZW1lbnRzPVtdO3RoaXMuZXhwZWN0KCdbJyk7d2hpbGUoIXRoaXMubWF0Y2goJ10nKSl7aWYodGhpcy5tYXRjaCgnLCcpKXt0aGlzLm5leHRUb2tlbigpO2VsZW1lbnRzLnB1c2gobnVsbCk7fWVsc2UKaWYodGhpcy5tYXRjaCgnLi4uJykpe3ZhciBlbGVtZW50PXRoaXMucGFyc2VTcHJlYWRFbGVtZW50KCk7aWYoIXRoaXMubWF0Y2goJ10nKSl7dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD1mYWxzZTt0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt0aGlzLmV4cGVjdCgnLCcpO30KZWxlbWVudHMucHVzaChlbGVtZW50KTt9ZWxzZQp7ZWxlbWVudHMucHVzaCh0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7aWYoIXRoaXMubWF0Y2goJ10nKSl7dGhpcy5leHBlY3QoJywnKTt9fX0KdGhpcy5leHBlY3QoJ10nKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkFycmF5RXhwcmVzc2lvbihlbGVtZW50cykpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kPWZ1bmN0aW9uKHBhcmFtcyl7dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD1mYWxzZTt0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt2YXIgcHJldmlvdXNTdHJpY3Q9dGhpcy5jb250ZXh0LnN0cmljdDt2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZT10aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7dGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlPXBhcmFtcy5zaW1wbGU7dmFyIGJvZHk9dGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0JiZwYXJhbXMuZmlyc3RSZXN0cmljdGVkKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHBhcmFtcy5maXJzdFJlc3RyaWN0ZWQscGFyYW1zLm1lc3NhZ2UpO30KaWYodGhpcy5jb250ZXh0LnN0cmljdCYmcGFyYW1zLnN0cmljdGVkKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHBhcmFtcy5zdHJpY3RlZCxwYXJhbXMubWVzc2FnZSk7fQp0aGlzLmNvbnRleHQuc3RyaWN0PXByZXZpb3VzU3RyaWN0O3RoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZT1wcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO3JldHVybiBib2R5O307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgaXNHZW5lcmF0b3I9ZmFsc2U7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIHByZXZpb3VzQWxsb3dZaWVsZD10aGlzLmNvbnRleHQuYWxsb3dZaWVsZDt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD1mYWxzZTt2YXIgcGFyYW1zPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7dmFyIG1ldGhvZD10aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD1wcmV2aW91c0FsbG93WWllbGQ7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCxwYXJhbXMucGFyYW1zLG1ldGhvZCxpc0dlbmVyYXRvcikpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kQXN5bmNGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBwcmV2aW91c0FsbG93WWllbGQ9dGhpcy5jb250ZXh0LmFsbG93WWllbGQ7dmFyIHByZXZpb3VzQXdhaXQ9dGhpcy5jb250ZXh0LmF3YWl0O3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPWZhbHNlO3RoaXMuY29udGV4dC5hd2FpdD10cnVlO3ZhciBwYXJhbXM9dGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoKTt2YXIgbWV0aG9kPXRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPXByZXZpb3VzQWxsb3dZaWVsZDt0aGlzLmNvbnRleHQuYXdhaXQ9cHJldmlvdXNBd2FpdDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uKG51bGwscGFyYW1zLnBhcmFtcyxtZXRob2QpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RQcm9wZXJ0eUtleT1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciB0b2tlbj10aGlzLm5leHRUb2tlbigpO3ZhciBrZXk7c3dpdGNoKHRva2VuLnR5cGUpe2Nhc2UgODpjYXNlIDY6aWYodGhpcy5jb250ZXh0LnN0cmljdCYmdG9rZW4ub2N0YWwpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO30KdmFyIHJhdz10aGlzLmdldFRva2VuUmF3KHRva2VuKTtrZXk9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUscmF3KSk7YnJlYWs7Y2FzZSAzOmNhc2UgMTpjYXNlIDU6Y2FzZSA0OmtleT10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO2JyZWFrO2Nhc2UgNzppZih0b2tlbi52YWx1ZT09PSdbJyl7a2V5PXRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO3RoaXMuZXhwZWN0KCddJyk7fWVsc2UKe2tleT10aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTt9CmJyZWFrO2RlZmF1bHQ6a2V5PXRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO30KcmV0dXJuIGtleTt9O1BhcnNlci5wcm90b3R5cGUuaXNQcm9wZXJ0eUtleT1mdW5jdGlvbihrZXksdmFsdWUpe3JldHVybiBrZXkudHlwZT09PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyJiZrZXkubmFtZT09PXZhbHVlfHxrZXkudHlwZT09PXN5bnRheF8xLlN5bnRheC5MaXRlcmFsJiZrZXkudmFsdWU9PT12YWx1ZTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbihoYXNQcm90byl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIHRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBraW5kO3ZhciBrZXk9bnVsbDt2YXIgdmFsdWU9bnVsbDt2YXIgY29tcHV0ZWQ9ZmFsc2U7dmFyIG1ldGhvZD1mYWxzZTt2YXIgc2hvcnRoYW5kPWZhbHNlO3ZhciBpc0FzeW5jPWZhbHNlO2lmKHRva2VuLnR5cGU9PT0zKXt2YXIgaWQ9dG9rZW4udmFsdWU7dGhpcy5uZXh0VG9rZW4oKTtjb21wdXRlZD10aGlzLm1hdGNoKCdbJyk7aXNBc3luYz0hdGhpcy5oYXNMaW5lVGVybWluYXRvciYmaWQ9PT0nYXN5bmMnJiYhdGhpcy5tYXRjaCgnOicpJiYhdGhpcy5tYXRjaCgnKCcpJiYhdGhpcy5tYXRjaCgnKicpO2tleT1pc0FzeW5jP3RoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpOnRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5JZGVudGlmaWVyKGlkKSk7fWVsc2UKaWYodGhpcy5tYXRjaCgnKicpKXt0aGlzLm5leHRUb2tlbigpO31lbHNlCntjb21wdXRlZD10aGlzLm1hdGNoKCdbJyk7a2V5PXRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO30KdmFyIGxvb2thaGVhZFByb3BlcnR5S2V5PXRoaXMucXVhbGlmaWVkUHJvcGVydHlOYW1lKHRoaXMubG9va2FoZWFkKTtpZih0b2tlbi50eXBlPT09MyYmIWlzQXN5bmMmJnRva2VuLnZhbHVlPT09J2dldCcmJmxvb2thaGVhZFByb3BlcnR5S2V5KXtraW5kPSdnZXQnO2NvbXB1dGVkPXRoaXMubWF0Y2goJ1snKTtrZXk9dGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9ZmFsc2U7dmFsdWU9dGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO31lbHNlCmlmKHRva2VuLnR5cGU9PT0zJiYhaXNBc3luYyYmdG9rZW4udmFsdWU9PT0nc2V0JyYmbG9va2FoZWFkUHJvcGVydHlLZXkpe2tpbmQ9J3NldCc7Y29tcHV0ZWQ9dGhpcy5tYXRjaCgnWycpO2tleT10aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTt2YWx1ZT10aGlzLnBhcnNlU2V0dGVyTWV0aG9kKCk7fWVsc2UKaWYodG9rZW4udHlwZT09PTcmJnRva2VuLnZhbHVlPT09JyonJiZsb29rYWhlYWRQcm9wZXJ0eUtleSl7a2luZD0naW5pdCc7Y29tcHV0ZWQ9dGhpcy5tYXRjaCgnWycpO2tleT10aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTt2YWx1ZT10aGlzLnBhcnNlR2VuZXJhdG9yTWV0aG9kKCk7bWV0aG9kPXRydWU7fWVsc2UKe2lmKCFrZXkpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO30Ka2luZD0naW5pdCc7aWYodGhpcy5tYXRjaCgnOicpJiYhaXNBc3luYyl7aWYoIWNvbXB1dGVkJiZ0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCdfX3Byb3RvX18nKSl7aWYoaGFzUHJvdG8udmFsdWUpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkR1cGxpY2F0ZVByb3RvUHJvcGVydHkpO30KaGFzUHJvdG8udmFsdWU9dHJ1ZTt9CnRoaXMubmV4dFRva2VuKCk7dmFsdWU9dGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7fWVsc2UKaWYodGhpcy5tYXRjaCgnKCcpKXt2YWx1ZT1pc0FzeW5jP3RoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZEFzeW5jRnVuY3Rpb24oKTp0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbigpO21ldGhvZD10cnVlO31lbHNlCmlmKHRva2VuLnR5cGU9PT0zKXt2YXIgaWQ9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtpZih0aGlzLm1hdGNoKCc9Jykpe3RoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I9dGhpcy5sb29rYWhlYWQ7dGhpcy5uZXh0VG9rZW4oKTtzaG9ydGhhbmQ9dHJ1ZTt2YXIgaW5pdD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTt2YWx1ZT10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaWQsaW5pdCkpO31lbHNlCntzaG9ydGhhbmQ9dHJ1ZTt2YWx1ZT1pZDt9fWVsc2UKe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7fX0KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Qcm9wZXJ0eShraW5kLGtleSxjb21wdXRlZCx2YWx1ZSxtZXRob2Qsc2hvcnRoYW5kKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0SW5pdGlhbGl6ZXI9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdCgneycpO3ZhciBwcm9wZXJ0aWVzPVtdO3ZhciBoYXNQcm90bz17dmFsdWU6ZmFsc2V9O3doaWxlKCF0aGlzLm1hdGNoKCd9Jykpe3Byb3BlcnRpZXMucHVzaCh0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkoaGFzUHJvdG8pKTtpZighdGhpcy5tYXRjaCgnfScpKXt0aGlzLmV4cGVjdENvbW1hU2VwYXJhdG9yKCk7fX0KdGhpcy5leHBlY3QoJ30nKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLk9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcykpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVRlbXBsYXRlSGVhZD1mdW5jdGlvbigpe2Fzc2VydF8xLmFzc2VydCh0aGlzLmxvb2thaGVhZC5oZWFkLCdUZW1wbGF0ZSBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHRlbXBsYXRlIGhlYWQnKTt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgdG9rZW49dGhpcy5uZXh0VG9rZW4oKTt2YXIgcmF3PXRva2VuLnZhbHVlO3ZhciBjb29rZWQ9dG9rZW4uY29va2VkO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVGVtcGxhdGVFbGVtZW50KHtyYXc6cmF3LGNvb2tlZDpjb29rZWR9LHRva2VuLnRhaWwpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmxvb2thaGVhZC50eXBlIT09MTApe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTt9CnZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciB0b2tlbj10aGlzLm5leHRUb2tlbigpO3ZhciByYXc9dG9rZW4udmFsdWU7dmFyIGNvb2tlZD10b2tlbi5jb29rZWQ7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5UZW1wbGF0ZUVsZW1lbnQoe3JhdzpyYXcsY29va2VkOmNvb2tlZH0sdG9rZW4udGFpbCkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVRlbXBsYXRlTGl0ZXJhbD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBleHByZXNzaW9ucz1bXTt2YXIgcXVhc2lzPVtdO3ZhciBxdWFzaT10aGlzLnBhcnNlVGVtcGxhdGVIZWFkKCk7cXVhc2lzLnB1c2gocXVhc2kpO3doaWxlKCFxdWFzaS50YWlsKXtleHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO3F1YXNpPXRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoKTtxdWFzaXMucHVzaChxdWFzaSk7fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlRlbXBsYXRlTGl0ZXJhbChxdWFzaXMsZXhwcmVzc2lvbnMpKTt9O1BhcnNlci5wcm90b3R5cGUucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuPWZ1bmN0aW9uKGV4cHIpe3N3aXRjaChleHByLnR5cGUpe2Nhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6Y2FzZSBzeW50YXhfMS5TeW50YXguTWVtYmVyRXhwcmVzc2lvbjpjYXNlIHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDpjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjpicmVhaztjYXNlIHN5bnRheF8xLlN5bnRheC5TcHJlYWRFbGVtZW50OmV4cHIudHlwZT1zeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5hcmd1bWVudCk7YnJlYWs7Y2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uOmV4cHIudHlwZT1zeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuO2Zvcih2YXIgaT0wO2k8ZXhwci5lbGVtZW50cy5sZW5ndGg7aSsrKXtpZihleHByLmVsZW1lbnRzW2ldIT09bnVsbCl7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5lbGVtZW50c1tpXSk7fX0KYnJlYWs7Y2FzZSBzeW50YXhfMS5TeW50YXguT2JqZWN0RXhwcmVzc2lvbjpleHByLnR5cGU9c3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47Zm9yKHZhciBpPTA7aTxleHByLnByb3BlcnRpZXMubGVuZ3RoO2krKyl7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5wcm9wZXJ0aWVzW2ldLnZhbHVlKTt9CmJyZWFrO2Nhc2Ugc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uOmV4cHIudHlwZT1zeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm47ZGVsZXRlIGV4cHIub3BlcmF0b3I7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5sZWZ0KTticmVhaztkZWZhdWx0OmJyZWFrO319O1BhcnNlci5wcm90b3R5cGUucGFyc2VHcm91cEV4cHJlc3Npb249ZnVuY3Rpb24oKXt2YXIgZXhwcjt0aGlzLmV4cGVjdCgnKCcpO2lmKHRoaXMubWF0Y2goJyknKSl7dGhpcy5uZXh0VG9rZW4oKTtpZighdGhpcy5tYXRjaCgnPT4nKSl7dGhpcy5leHBlY3QoJz0+Jyk7fQpleHByPXt0eXBlOkFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIscGFyYW1zOltdLGFzeW5jOmZhbHNlfTt9ZWxzZQp7dmFyIHN0YXJ0VG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIHBhcmFtcz1bXTtpZih0aGlzLm1hdGNoKCcuLi4nKSl7ZXhwcj10aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKTt0aGlzLmV4cGVjdCgnKScpO2lmKCF0aGlzLm1hdGNoKCc9PicpKXt0aGlzLmV4cGVjdCgnPT4nKTt9CmV4cHI9e3R5cGU6QXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixwYXJhbXM6W2V4cHJdLGFzeW5jOmZhbHNlfTt9ZWxzZQp7dmFyIGFycm93PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PXRydWU7ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtpZih0aGlzLm1hdGNoKCcsJykpe3ZhciBleHByZXNzaW9ucz1bXTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO2V4cHJlc3Npb25zLnB1c2goZXhwcik7d2hpbGUodGhpcy5sb29rYWhlYWQudHlwZSE9PTIpe2lmKCF0aGlzLm1hdGNoKCcsJykpe2JyZWFrO30KdGhpcy5uZXh0VG9rZW4oKTtpZih0aGlzLm1hdGNoKCcpJykpe3RoaXMubmV4dFRva2VuKCk7Zm9yKHZhciBpPTA7aTxleHByZXNzaW9ucy5sZW5ndGg7aSsrKXt0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByZXNzaW9uc1tpXSk7fQphcnJvdz10cnVlO2V4cHI9e3R5cGU6QXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixwYXJhbXM6ZXhwcmVzc2lvbnMsYXN5bmM6ZmFsc2V9O31lbHNlCmlmKHRoaXMubWF0Y2goJy4uLicpKXtpZighdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO30KZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKSk7dGhpcy5leHBlY3QoJyknKTtpZighdGhpcy5tYXRjaCgnPT4nKSl7dGhpcy5leHBlY3QoJz0+Jyk7fQp0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTtmb3IodmFyIGk9MDtpPGV4cHJlc3Npb25zLmxlbmd0aDtpKyspe3RoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHJlc3Npb25zW2ldKTt9CmFycm93PXRydWU7ZXhwcj17dHlwZTpBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLHBhcmFtczpleHByZXNzaW9ucyxhc3luYzpmYWxzZX07fWVsc2UKe2V4cHJlc3Npb25zLnB1c2godGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO30KaWYoYXJyb3cpe2JyZWFrO319CmlmKCFhcnJvdyl7ZXhwcj10aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLG5ldyBOb2RlLlNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9ucykpO319CmlmKCFhcnJvdyl7dGhpcy5leHBlY3QoJyknKTtpZih0aGlzLm1hdGNoKCc9PicpKXtpZihleHByLnR5cGU9PT1zeW50YXhfMS5TeW50YXguSWRlbnRpZmllciYmZXhwci5uYW1lPT09J3lpZWxkJyl7YXJyb3c9dHJ1ZTtleHByPXt0eXBlOkFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIscGFyYW1zOltleHByXSxhc3luYzpmYWxzZX07fQppZighYXJyb3cpe2lmKCF0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7fQppZihleHByLnR5cGU9PT1zeW50YXhfMS5TeW50YXguU2VxdWVuY2VFeHByZXNzaW9uKXtmb3IodmFyIGk9MDtpPGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoO2krKyl7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5leHByZXNzaW9uc1tpXSk7fX1lbHNlCnt0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTt9CnZhciBwYXJhbWV0ZXJzPWV4cHIudHlwZT09PXN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb24/ZXhwci5leHByZXNzaW9uczpbZXhwcl07ZXhwcj17dHlwZTpBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLHBhcmFtczpwYXJhbWV0ZXJzLGFzeW5jOmZhbHNlfTt9fQp0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt9fX0KcmV0dXJuIGV4cHI7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlQXJndW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5leHBlY3QoJygnKTt2YXIgYXJncz1bXTtpZighdGhpcy5tYXRjaCgnKScpKXt3aGlsZSh0cnVlKXt2YXIgZXhwcj10aGlzLm1hdGNoKCcuLi4nKT90aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpOnRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO2FyZ3MucHVzaChleHByKTtpZih0aGlzLm1hdGNoKCcpJykpe2JyZWFrO30KdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO2lmKHRoaXMubWF0Y2goJyknKSl7YnJlYWs7fX19CnRoaXMuZXhwZWN0KCcpJyk7cmV0dXJuIGFyZ3M7fTtQYXJzZXIucHJvdG90eXBlLmlzSWRlbnRpZmllck5hbWU9ZnVuY3Rpb24odG9rZW4pe3JldHVybiB0b2tlbi50eXBlPT09M3x8dG9rZW4udHlwZT09PTR8fHRva2VuLnR5cGU9PT0xfHx0b2tlbi50eXBlPT09NTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VJZGVudGlmaWVyTmFtZT1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciB0b2tlbj10aGlzLm5leHRUb2tlbigpO2lmKCF0aGlzLmlzSWRlbnRpZmllck5hbWUodG9rZW4pKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZU5ld0V4cHJlc3Npb249ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgaWQ9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7YXNzZXJ0XzEuYXNzZXJ0KGlkLm5hbWU9PT0nbmV3JywnTmV3IGV4cHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGBuZXdgJyk7dmFyIGV4cHI7aWYodGhpcy5tYXRjaCgnLicpKXt0aGlzLm5leHRUb2tlbigpO2lmKHRoaXMubG9va2FoZWFkLnR5cGU9PT0zJiZ0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkmJnRoaXMubG9va2FoZWFkLnZhbHVlPT09J3RhcmdldCcpe3ZhciBwcm9wZXJ0eT10aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtleHByPW5ldyBOb2RlLk1ldGFQcm9wZXJ0eShpZCxwcm9wZXJ0eSk7fWVsc2UKe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO319ZWxzZQp7dmFyIGNhbGxlZT10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb24pO3ZhciBhcmdzPXRoaXMubWF0Y2goJygnKT90aGlzLnBhcnNlQXJndW1lbnRzKCk6W107ZXhwcj1uZXcgTm9kZS5OZXdFeHByZXNzaW9uKGNhbGxlZSxhcmdzKTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxleHByKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50PWZ1bmN0aW9uKCl7dmFyIGFyZz10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTt0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yPW51bGw7cmV0dXJuIGFyZzt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50cz1mdW5jdGlvbigpe3RoaXMuZXhwZWN0KCcoJyk7dmFyIGFyZ3M9W107aWYoIXRoaXMubWF0Y2goJyknKSl7d2hpbGUodHJ1ZSl7dmFyIGV4cHI9dGhpcy5tYXRjaCgnLi4uJyk/dGhpcy5wYXJzZVNwcmVhZEVsZW1lbnQoKTp0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzeW5jQXJndW1lbnQpO2FyZ3MucHVzaChleHByKTtpZih0aGlzLm1hdGNoKCcpJykpe2JyZWFrO30KdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO2lmKHRoaXMubWF0Y2goJyknKSl7YnJlYWs7fX19CnRoaXMuZXhwZWN0KCcpJyk7cmV0dXJuIGFyZ3M7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbD1mdW5jdGlvbigpe3ZhciBzdGFydFRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBtYXliZUFzeW5jPXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKTt2YXIgcHJldmlvdXNBbGxvd0luPXRoaXMuY29udGV4dC5hbGxvd0luO3RoaXMuY29udGV4dC5hbGxvd0luPXRydWU7dmFyIGV4cHI7aWYodGhpcy5tYXRjaEtleXdvcmQoJ3N1cGVyJykmJnRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSl7ZXhwcj10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLm5leHRUb2tlbigpO2V4cHI9dGhpcy5maW5hbGl6ZShleHByLG5ldyBOb2RlLlN1cGVyKCkpO2lmKCF0aGlzLm1hdGNoKCcoJykmJiF0aGlzLm1hdGNoKCcuJykmJiF0aGlzLm1hdGNoKCdbJykpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO319ZWxzZQp7ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5tYXRjaEtleXdvcmQoJ25ldycpP3RoaXMucGFyc2VOZXdFeHByZXNzaW9uOnRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbik7fQp3aGlsZSh0cnVlKXtpZih0aGlzLm1hdGNoKCcuJykpe3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9dHJ1ZTt0aGlzLmV4cGVjdCgnLicpO3ZhciBwcm9wZXJ0eT10aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtleHByPXRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksbmV3IE5vZGUuU3RhdGljTWVtYmVyRXhwcmVzc2lvbihleHByLHByb3BlcnR5KSk7fWVsc2UKaWYodGhpcy5tYXRjaCgnKCcpKXt2YXIgYXN5bmNBcnJvdz1tYXliZUFzeW5jJiZzdGFydFRva2VuLmxpbmVOdW1iZXI9PT10aGlzLmxvb2thaGVhZC5saW5lTnVtYmVyO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dmFyIGFyZ3M9YXN5bmNBcnJvdz90aGlzLnBhcnNlQXN5bmNBcmd1bWVudHMoKTp0aGlzLnBhcnNlQXJndW1lbnRzKCk7ZXhwcj10aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLG5ldyBOb2RlLkNhbGxFeHByZXNzaW9uKGV4cHIsYXJncykpO2lmKGFzeW5jQXJyb3cmJnRoaXMubWF0Y2goJz0+Jykpe2Zvcih2YXIgaT0wO2k8YXJncy5sZW5ndGg7KytpKXt0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihhcmdzW2ldKTt9CmV4cHI9e3R5cGU6QXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixwYXJhbXM6YXJncyxhc3luYzp0cnVlfTt9fWVsc2UKaWYodGhpcy5tYXRjaCgnWycpKXt0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PXRydWU7dGhpcy5leHBlY3QoJ1snKTt2YXIgcHJvcGVydHk9dGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHByZXNzaW9uKTt0aGlzLmV4cGVjdCgnXScpO2V4cHI9dGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSxuZXcgTm9kZS5Db21wdXRlZE1lbWJlckV4cHJlc3Npb24oZXhwcixwcm9wZXJ0eSkpO31lbHNlCmlmKHRoaXMubG9va2FoZWFkLnR5cGU9PT0xMCYmdGhpcy5sb29rYWhlYWQuaGVhZCl7dmFyIHF1YXNpPXRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtleHByPXRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksbmV3IE5vZGUuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKGV4cHIscXVhc2kpKTt9ZWxzZQp7YnJlYWs7fX0KdGhpcy5jb250ZXh0LmFsbG93SW49cHJldmlvdXNBbGxvd0luO3JldHVybiBleHByO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN1cGVyPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3RLZXl3b3JkKCdzdXBlcicpO2lmKCF0aGlzLm1hdGNoKCdbJykmJiF0aGlzLm1hdGNoKCcuJykpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5TdXBlcigpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uPWZ1bmN0aW9uKCl7YXNzZXJ0XzEuYXNzZXJ0KHRoaXMuY29udGV4dC5hbGxvd0luLCdjYWxsZWUgb2YgbmV3IGV4cHJlc3Npb24gYWx3YXlzIGFsbG93IGluIGtleXdvcmQuJyk7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUodGhpcy5sb29rYWhlYWQpO3ZhciBleHByPXRoaXMubWF0Y2hLZXl3b3JkKCdzdXBlcicpJiZ0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHk/dGhpcy5wYXJzZVN1cGVyKCk6dGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMubWF0Y2hLZXl3b3JkKCduZXcnKT90aGlzLnBhcnNlTmV3RXhwcmVzc2lvbjp0aGlzLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24pO3doaWxlKHRydWUpe2lmKHRoaXMubWF0Y2goJ1snKSl7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD10cnVlO3RoaXMuZXhwZWN0KCdbJyk7dmFyIHByb3BlcnR5PXRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwcmVzc2lvbik7dGhpcy5leHBlY3QoJ10nKTtleHByPXRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Db21wdXRlZE1lbWJlckV4cHJlc3Npb24oZXhwcixwcm9wZXJ0eSkpO31lbHNlCmlmKHRoaXMubWF0Y2goJy4nKSl7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD10cnVlO3RoaXMuZXhwZWN0KCcuJyk7dmFyIHByb3BlcnR5PXRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO2V4cHI9dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlN0YXRpY01lbWJlckV4cHJlc3Npb24oZXhwcixwcm9wZXJ0eSkpO31lbHNlCmlmKHRoaXMubG9va2FoZWFkLnR5cGU9PT0xMCYmdGhpcy5sb29rYWhlYWQuaGVhZCl7dmFyIHF1YXNpPXRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtleHByPXRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwcixxdWFzaSkpO31lbHNlCnticmVhazt9fQpyZXR1cm4gZXhwcjt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VVcGRhdGVFeHByZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGV4cHI7dmFyIHN0YXJ0VG9rZW49dGhpcy5sb29rYWhlYWQ7aWYodGhpcy5tYXRjaCgnKysnKXx8dGhpcy5tYXRjaCgnLS0nKSl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7dmFyIHRva2VuPXRoaXMubmV4dFRva2VuKCk7ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7aWYodGhpcy5jb250ZXh0LnN0cmljdCYmZXhwci50eXBlPT09c3ludGF4XzEuU3ludGF4LklkZW50aWZpZXImJnRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGV4cHIubmFtZSkpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdExIU1ByZWZpeCk7fQppZighdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCl7dGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luQXNzaWdubWVudCk7fQp2YXIgcHJlZml4PXRydWU7ZXhwcj10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVXBkYXRlRXhwcmVzc2lvbih0b2tlbi52YWx1ZSxleHByLHByZWZpeCkpO3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7fWVsc2UKe2V4cHI9dGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsKTtpZighdGhpcy5oYXNMaW5lVGVybWluYXRvciYmdGhpcy5sb29rYWhlYWQudHlwZT09PTcpe2lmKHRoaXMubWF0Y2goJysrJyl8fHRoaXMubWF0Y2goJy0tJykpe2lmKHRoaXMuY29udGV4dC5zdHJpY3QmJmV4cHIudHlwZT09PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyJiZ0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChleHByLm5hbWUpKXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNQb3N0Zml4KTt9CmlmKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0KXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTt9CnRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dmFyIG9wZXJhdG9yPXRoaXMubmV4dFRva2VuKCkudmFsdWU7dmFyIHByZWZpeD1mYWxzZTtleHByPXRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksbmV3IE5vZGUuVXBkYXRlRXhwcmVzc2lvbihvcGVyYXRvcixleHByLHByZWZpeCkpO319fQpyZXR1cm4gZXhwcjt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VBd2FpdEV4cHJlc3Npb249ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLm5leHRUb2tlbigpO3ZhciBhcmd1bWVudD10aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Bd2FpdEV4cHJlc3Npb24oYXJndW1lbnQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VVbmFyeUV4cHJlc3Npb249ZnVuY3Rpb24oKXt2YXIgZXhwcjtpZih0aGlzLm1hdGNoKCcrJyl8fHRoaXMubWF0Y2goJy0nKXx8dGhpcy5tYXRjaCgnficpfHx0aGlzLm1hdGNoKCchJyl8fHRoaXMubWF0Y2hLZXl3b3JkKCdkZWxldGUnKXx8dGhpcy5tYXRjaEtleXdvcmQoJ3ZvaWQnKXx8dGhpcy5tYXRjaEtleXdvcmQoJ3R5cGVvZicpKXt2YXIgbm9kZT10aGlzLnN0YXJ0Tm9kZSh0aGlzLmxvb2thaGVhZCk7dmFyIHRva2VuPXRoaXMubmV4dFRva2VuKCk7ZXhwcj10aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7ZXhwcj10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVW5hcnlFeHByZXNzaW9uKHRva2VuLnZhbHVlLGV4cHIpKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0JiZleHByLm9wZXJhdG9yPT09J2RlbGV0ZScmJmV4cHIuYXJndW1lbnQudHlwZT09PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3REZWxldGUpO30KdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldD1mYWxzZTt0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudD1mYWxzZTt9ZWxzZQppZih0aGlzLmNvbnRleHQuYXdhaXQmJnRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXdhaXQnKSl7ZXhwcj10aGlzLnBhcnNlQXdhaXRFeHByZXNzaW9uKCk7fWVsc2UKe2V4cHI9dGhpcy5wYXJzZVVwZGF0ZUV4cHJlc3Npb24oKTt9CnJldHVybiBleHByO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBzdGFydFRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBleHByPXRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtpZihleHByLnR5cGUhPT1zeW50YXhfMS5TeW50YXguVW5hcnlFeHByZXNzaW9uJiZ0aGlzLm1hdGNoKCcqKicpKXt0aGlzLm5leHRUb2tlbigpO3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7dmFyIGxlZnQ9ZXhwcjt2YXIgcmlnaHQ9dGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pO2V4cHI9dGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSxuZXcgTm9kZS5CaW5hcnlFeHByZXNzaW9uKCcqKicsbGVmdCxyaWdodCkpO30KcmV0dXJuIGV4cHI7fTtQYXJzZXIucHJvdG90eXBlLmJpbmFyeVByZWNlZGVuY2U9ZnVuY3Rpb24odG9rZW4pe3ZhciBvcD10b2tlbi52YWx1ZTt2YXIgcHJlY2VkZW5jZTtpZih0b2tlbi50eXBlPT09Nyl7cHJlY2VkZW5jZT10aGlzLm9wZXJhdG9yUHJlY2VkZW5jZVtvcF18fDA7fWVsc2UKaWYodG9rZW4udHlwZT09PTQpe3ByZWNlZGVuY2U9b3A9PT0naW5zdGFuY2VvZid8fHRoaXMuY29udGV4dC5hbGxvd0luJiZvcD09PSdpbic/NzowO31lbHNlCntwcmVjZWRlbmNlPTA7fQpyZXR1cm4gcHJlY2VkZW5jZTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VCaW5hcnlFeHByZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIHN0YXJ0VG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIGV4cHI9dGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pO3ZhciB0b2tlbj10aGlzLmxvb2thaGVhZDt2YXIgcHJlYz10aGlzLmJpbmFyeVByZWNlZGVuY2UodG9rZW4pO2lmKHByZWM+MCl7dGhpcy5uZXh0VG9rZW4oKTt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO3ZhciBtYXJrZXJzPVtzdGFydFRva2VuLHRoaXMubG9va2FoZWFkXTt2YXIgbGVmdD1leHByO3ZhciByaWdodD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbik7dmFyIHN0YWNrPVtsZWZ0LHRva2VuLnZhbHVlLHJpZ2h0XTt2YXIgcHJlY2VkZW5jZXM9W3ByZWNdO3doaWxlKHRydWUpe3ByZWM9dGhpcy5iaW5hcnlQcmVjZWRlbmNlKHRoaXMubG9va2FoZWFkKTtpZihwcmVjPD0wKXticmVhazt9CndoaWxlKHN0YWNrLmxlbmd0aD4yJiZwcmVjPD1wcmVjZWRlbmNlc1twcmVjZWRlbmNlcy5sZW5ndGgtMV0pe3JpZ2h0PXN0YWNrLnBvcCgpO3ZhciBvcGVyYXRvcj1zdGFjay5wb3AoKTtwcmVjZWRlbmNlcy5wb3AoKTtsZWZ0PXN0YWNrLnBvcCgpO21hcmtlcnMucG9wKCk7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUobWFya2Vyc1ttYXJrZXJzLmxlbmd0aC0xXSk7c3RhY2sucHVzaCh0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvcixsZWZ0LHJpZ2h0KSkpO30Kc3RhY2sucHVzaCh0aGlzLm5leHRUb2tlbigpLnZhbHVlKTtwcmVjZWRlbmNlcy5wdXNoKHByZWMpO21hcmtlcnMucHVzaCh0aGlzLmxvb2thaGVhZCk7c3RhY2sucHVzaCh0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbikpO30KdmFyIGk9c3RhY2subGVuZ3RoLTE7ZXhwcj1zdGFja1tpXTttYXJrZXJzLnBvcCgpO3doaWxlKGk+MSl7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUobWFya2Vycy5wb3AoKSk7dmFyIG9wZXJhdG9yPXN0YWNrW2ktMV07ZXhwcj10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvcixzdGFja1tpLTJdLGV4cHIpKTtpLT0yO319CnJldHVybiBleHByO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBzdGFydFRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBleHByPXRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQmluYXJ5RXhwcmVzc2lvbik7aWYodGhpcy5tYXRjaCgnPycpKXt0aGlzLm5leHRUb2tlbigpO3ZhciBwcmV2aW91c0FsbG93SW49dGhpcy5jb250ZXh0LmFsbG93SW47dGhpcy5jb250ZXh0LmFsbG93SW49dHJ1ZTt2YXIgY29uc2VxdWVudD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTt0aGlzLmNvbnRleHQuYWxsb3dJbj1wcmV2aW91c0FsbG93SW47dGhpcy5leHBlY3QoJzonKTt2YXIgYWx0ZXJuYXRlPXRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO2V4cHI9dGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSxuZXcgTm9kZS5Db25kaXRpb25hbEV4cHJlc3Npb24oZXhwcixjb25zZXF1ZW50LGFsdGVybmF0ZSkpO3RoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ9ZmFsc2U7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9ZmFsc2U7fQpyZXR1cm4gZXhwcjt9O1BhcnNlci5wcm90b3R5cGUuY2hlY2tQYXR0ZXJuUGFyYW09ZnVuY3Rpb24ob3B0aW9ucyxwYXJhbSl7c3dpdGNoKHBhcmFtLnR5cGUpe2Nhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6dGhpcy52YWxpZGF0ZVBhcmFtKG9wdGlvbnMscGFyYW0scGFyYW0ubmFtZSk7YnJlYWs7Y2FzZSBzeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ6dGhpcy5jaGVja1BhdHRlcm5QYXJhbShvcHRpb25zLHBhcmFtLmFyZ3VtZW50KTticmVhaztjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjp0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMscGFyYW0ubGVmdCk7YnJlYWs7Y2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuOmZvcih2YXIgaT0wO2k8cGFyYW0uZWxlbWVudHMubGVuZ3RoO2krKyl7aWYocGFyYW0uZWxlbWVudHNbaV0hPT1udWxsKXt0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMscGFyYW0uZWxlbWVudHNbaV0pO319CmJyZWFrO2Nhc2Ugc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm46Zm9yKHZhciBpPTA7aTxwYXJhbS5wcm9wZXJ0aWVzLmxlbmd0aDtpKyspe3RoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucyxwYXJhbS5wcm9wZXJ0aWVzW2ldLnZhbHVlKTt9CmJyZWFrO2RlZmF1bHQ6YnJlYWs7fQpvcHRpb25zLnNpbXBsZT1vcHRpb25zLnNpbXBsZSYmcGFyYW0gaW5zdGFuY2VvZiBOb2RlLklkZW50aWZpZXI7fTtQYXJzZXIucHJvdG90eXBlLnJlaW50ZXJwcmV0QXNDb3ZlckZvcm1hbHNMaXN0PWZ1bmN0aW9uKGV4cHIpe3ZhciBwYXJhbXM9W2V4cHJdO3ZhciBvcHRpb25zO3ZhciBhc3luY0Fycm93PWZhbHNlO3N3aXRjaChleHByLnR5cGUpe2Nhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6YnJlYWs7Y2FzZSBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyOnBhcmFtcz1leHByLnBhcmFtczthc3luY0Fycm93PWV4cHIuYXN5bmM7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbDt9Cm9wdGlvbnM9e3NpbXBsZTp0cnVlLHBhcmFtU2V0Ont9fTtmb3IodmFyIGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXt2YXIgcGFyYW09cGFyYW1zW2ldO2lmKHBhcmFtLnR5cGU9PT1zeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm4pe2lmKHBhcmFtLnJpZ2h0LnR5cGU9PT1zeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uKXtpZihwYXJhbS5yaWdodC5hcmd1bWVudCl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7fQpwYXJhbS5yaWdodC50eXBlPXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyO3BhcmFtLnJpZ2h0Lm5hbWU9J3lpZWxkJztkZWxldGUgcGFyYW0ucmlnaHQuYXJndW1lbnQ7ZGVsZXRlIHBhcmFtLnJpZ2h0LmRlbGVnYXRlO319ZWxzZQppZihhc3luY0Fycm93JiZwYXJhbS50eXBlPT09c3ludGF4XzEuU3ludGF4LklkZW50aWZpZXImJnBhcmFtLm5hbWU9PT0nYXdhaXQnKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9CnRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucyxwYXJhbSk7cGFyYW1zW2ldPXBhcmFtO30KaWYodGhpcy5jb250ZXh0LnN0cmljdHx8IXRoaXMuY29udGV4dC5hbGxvd1lpZWxkKXtmb3IodmFyIGk9MDtpPHBhcmFtcy5sZW5ndGg7KytpKXt2YXIgcGFyYW09cGFyYW1zW2ldO2lmKHBhcmFtLnR5cGU9PT1zeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9fX0KaWYob3B0aW9ucy5tZXNzYWdlPT09bWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGUpe3ZhciB0b2tlbj10aGlzLmNvbnRleHQuc3RyaWN0P29wdGlvbnMuc3RyaWN0ZWQ6b3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQ7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbixvcHRpb25zLm1lc3NhZ2UpO30KcmV0dXJue3NpbXBsZTpvcHRpb25zLnNpbXBsZSxwYXJhbXM6cGFyYW1zLHN0cmljdGVkOm9wdGlvbnMuc3RyaWN0ZWQsZmlyc3RSZXN0cmljdGVkOm9wdGlvbnMuZmlyc3RSZXN0cmljdGVkLG1lc3NhZ2U6b3B0aW9ucy5tZXNzYWdlfTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBleHByO2lmKCF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCYmdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpe2V4cHI9dGhpcy5wYXJzZVlpZWxkRXhwcmVzc2lvbigpO31lbHNlCnt2YXIgc3RhcnRUb2tlbj10aGlzLmxvb2thaGVhZDt2YXIgdG9rZW49c3RhcnRUb2tlbjtleHByPXRoaXMucGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb24oKTtpZih0b2tlbi50eXBlPT09MyYmdG9rZW4ubGluZU51bWJlcj09PXRoaXMubG9va2FoZWFkLmxpbmVOdW1iZXImJnRva2VuLnZhbHVlPT09J2FzeW5jJyl7aWYodGhpcy5sb29rYWhlYWQudHlwZT09PTN8fHRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpKXt2YXIgYXJnPXRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpO3RoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGFyZyk7ZXhwcj17dHlwZTpBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLHBhcmFtczpbYXJnXSxhc3luYzp0cnVlfTt9fQppZihleHByLnR5cGU9PT1BcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyfHx0aGlzLm1hdGNoKCc9PicpKXt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO3ZhciBpc0FzeW5jPWV4cHIuYXN5bmM7dmFyIGxpc3Q9dGhpcy5yZWludGVycHJldEFzQ292ZXJGb3JtYWxzTGlzdChleHByKTtpZihsaXN0KXtpZih0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9CnRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I9bnVsbDt2YXIgcHJldmlvdXNTdHJpY3Q9dGhpcy5jb250ZXh0LnN0cmljdDt2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZT10aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7dGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlPWxpc3Quc2ltcGxlO3ZhciBwcmV2aW91c0FsbG93WWllbGQ9dGhpcy5jb250ZXh0LmFsbG93WWllbGQ7dmFyIHByZXZpb3VzQXdhaXQ9dGhpcy5jb250ZXh0LmF3YWl0O3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPXRydWU7dGhpcy5jb250ZXh0LmF3YWl0PWlzQXN5bmM7dmFyIG5vZGU9dGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7dGhpcy5leHBlY3QoJz0+Jyk7dmFyIGJvZHk9dm9pZCAwO2lmKHRoaXMubWF0Y2goJ3snKSl7dmFyIHByZXZpb3VzQWxsb3dJbj10aGlzLmNvbnRleHQuYWxsb3dJbjt0aGlzLmNvbnRleHQuYWxsb3dJbj10cnVlO2JvZHk9dGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTt0aGlzLmNvbnRleHQuYWxsb3dJbj1wcmV2aW91c0FsbG93SW47fWVsc2UKe2JvZHk9dGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7fQp2YXIgZXhwcmVzc2lvbj1ib2R5LnR5cGUhPT1zeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQ7aWYodGhpcy5jb250ZXh0LnN0cmljdCYmbGlzdC5maXJzdFJlc3RyaWN0ZWQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obGlzdC5maXJzdFJlc3RyaWN0ZWQsbGlzdC5tZXNzYWdlKTt9CmlmKHRoaXMuY29udGV4dC5zdHJpY3QmJmxpc3Quc3RyaWN0ZWQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4obGlzdC5zdHJpY3RlZCxsaXN0Lm1lc3NhZ2UpO30KZXhwcj1pc0FzeW5jP3RoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Bc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKGxpc3QucGFyYW1zLGJvZHksZXhwcmVzc2lvbikpOnRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihsaXN0LnBhcmFtcyxib2R5LGV4cHJlc3Npb24pKTt0aGlzLmNvbnRleHQuc3RyaWN0PXByZXZpb3VzU3RyaWN0O3RoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZT1wcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPXByZXZpb3VzQWxsb3dZaWVsZDt0aGlzLmNvbnRleHQuYXdhaXQ9cHJldmlvdXNBd2FpdDt9fWVsc2UKe2lmKHRoaXMubWF0Y2hBc3NpZ24oKSl7aWYoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO30KaWYodGhpcy5jb250ZXh0LnN0cmljdCYmZXhwci50eXBlPT09c3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpe3ZhciBpZD1leHByO2lmKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTQXNzaWdubWVudCk7fQppZih0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKGlkLm5hbWUpKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTt9fQppZighdGhpcy5tYXRjaCgnPScpKXt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PWZhbHNlO3RoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50PWZhbHNlO31lbHNlCnt0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTt9CnRva2VuPXRoaXMubmV4dFRva2VuKCk7dmFyIG9wZXJhdG9yPXRva2VuLnZhbHVlO3ZhciByaWdodD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtleHByPXRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksbmV3IE5vZGUuQXNzaWdubWVudEV4cHJlc3Npb24ob3BlcmF0b3IsZXhwcixyaWdodCkpO3RoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I9bnVsbDt9fX0KcmV0dXJuIGV4cHI7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBzdGFydFRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBleHByPXRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO2lmKHRoaXMubWF0Y2goJywnKSl7dmFyIGV4cHJlc3Npb25zPVtdO2V4cHJlc3Npb25zLnB1c2goZXhwcik7d2hpbGUodGhpcy5sb29rYWhlYWQudHlwZSE9PTIpe2lmKCF0aGlzLm1hdGNoKCcsJykpe2JyZWFrO30KdGhpcy5uZXh0VG9rZW4oKTtleHByZXNzaW9ucy5wdXNoKHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pKTt9CmV4cHI9dGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSxuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpKTt9CnJldHVybiBleHByO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0YXRlbWVudExpc3RJdGVtPWZ1bmN0aW9uKCl7dmFyIHN0YXRlbWVudDt0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0PXRydWU7dGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ9dHJ1ZTtpZih0aGlzLmxvb2thaGVhZC50eXBlPT09NCl7c3dpdGNoKHRoaXMubG9va2FoZWFkLnZhbHVlKXtjYXNlJ2V4cG9ydCc6aWYoIXRoaXMuY29udGV4dC5pc01vZHVsZSl7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCxtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxFeHBvcnREZWNsYXJhdGlvbik7fQpzdGF0ZW1lbnQ9dGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKCk7YnJlYWs7Y2FzZSdpbXBvcnQnOmlmKCF0aGlzLmNvbnRleHQuaXNNb2R1bGUpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsbWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsSW1wb3J0RGVjbGFyYXRpb24pO30Kc3RhdGVtZW50PXRoaXMucGFyc2VJbXBvcnREZWNsYXJhdGlvbigpO2JyZWFrO2Nhc2UnY29uc3QnOnN0YXRlbWVudD10aGlzLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uKHtpbkZvcjpmYWxzZX0pO2JyZWFrO2Nhc2UnZnVuY3Rpb24nOnN0YXRlbWVudD10aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO2JyZWFrO2Nhc2UnY2xhc3MnOnN0YXRlbWVudD10aGlzLnBhcnNlQ2xhc3NEZWNsYXJhdGlvbigpO2JyZWFrO2Nhc2UnbGV0JzpzdGF0ZW1lbnQ9dGhpcy5pc0xleGljYWxEZWNsYXJhdGlvbigpP3RoaXMucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24oe2luRm9yOmZhbHNlfSk6dGhpcy5wYXJzZVN0YXRlbWVudCgpO2JyZWFrO2RlZmF1bHQ6c3RhdGVtZW50PXRoaXMucGFyc2VTdGF0ZW1lbnQoKTticmVhazt9fWVsc2UKe3N0YXRlbWVudD10aGlzLnBhcnNlU3RhdGVtZW50KCk7fQpyZXR1cm4gc3RhdGVtZW50O307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUJsb2NrPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3QoJ3snKTt2YXIgYmxvY2s9W107d2hpbGUodHJ1ZSl7aWYodGhpcy5tYXRjaCgnfScpKXticmVhazt9CmJsb2NrLnB1c2godGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCkpO30KdGhpcy5leHBlY3QoJ30nKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkJsb2NrU3RhdGVtZW50KGJsb2NrKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbEJpbmRpbmc9ZnVuY3Rpb24oa2luZCxvcHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgcGFyYW1zPVtdO3ZhciBpZD10aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsa2luZCk7aWYodGhpcy5jb250ZXh0LnN0cmljdCYmaWQudHlwZT09PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKXtpZih0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChpZC5uYW1lKSl7dGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0VmFyTmFtZSk7fX0KdmFyIGluaXQ9bnVsbDtpZihraW5kPT09J2NvbnN0Jyl7aWYoIXRoaXMubWF0Y2hLZXl3b3JkKCdpbicpJiYhdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKXtpZih0aGlzLm1hdGNoKCc9Jykpe3RoaXMubmV4dFRva2VuKCk7aW5pdD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTt9ZWxzZQp7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXIsJ2NvbnN0Jyk7fX19ZWxzZQppZighb3B0aW9ucy5pbkZvciYmaWQudHlwZSE9PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyfHx0aGlzLm1hdGNoKCc9Jykpe3RoaXMuZXhwZWN0KCc9Jyk7aW5pdD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLGluaXQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VCaW5kaW5nTGlzdD1mdW5jdGlvbihraW5kLG9wdGlvbnMpe3ZhciBsaXN0PVt0aGlzLnBhcnNlTGV4aWNhbEJpbmRpbmcoa2luZCxvcHRpb25zKV07d2hpbGUodGhpcy5tYXRjaCgnLCcpKXt0aGlzLm5leHRUb2tlbigpO2xpc3QucHVzaCh0aGlzLnBhcnNlTGV4aWNhbEJpbmRpbmcoa2luZCxvcHRpb25zKSk7fQpyZXR1cm4gbGlzdDt9O1BhcnNlci5wcm90b3R5cGUuaXNMZXhpY2FsRGVjbGFyYXRpb249ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5zY2FubmVyLnNhdmVTdGF0ZSgpO3RoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTt2YXIgbmV4dD10aGlzLnNjYW5uZXIubGV4KCk7dGhpcy5zY2FubmVyLnJlc3RvcmVTdGF0ZShzdGF0ZSk7cmV0dXJuIG5leHQudHlwZT09PTN8fG5leHQudHlwZT09PTcmJm5leHQudmFsdWU9PT0nWyd8fG5leHQudHlwZT09PTcmJm5leHQudmFsdWU9PT0neyd8fG5leHQudHlwZT09PTQmJm5leHQudmFsdWU9PT0nbGV0J3x8bmV4dC50eXBlPT09NCYmbmV4dC52YWx1ZT09PSd5aWVsZCc7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uPWZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBraW5kPXRoaXMubmV4dFRva2VuKCkudmFsdWU7YXNzZXJ0XzEuYXNzZXJ0KGtpbmQ9PT0nbGV0J3x8a2luZD09PSdjb25zdCcsJ0xleGljYWwgZGVjbGFyYXRpb24gbXVzdCBiZSBlaXRoZXIgbGV0IG9yIGNvbnN0Jyk7dmFyIGRlY2xhcmF0aW9ucz10aGlzLnBhcnNlQmluZGluZ0xpc3Qoa2luZCxvcHRpb25zKTt0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLGtpbmQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VCaW5kaW5nUmVzdEVsZW1lbnQ9ZnVuY3Rpb24ocGFyYW1zLGtpbmQpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0KCcuLi4nKTt2YXIgYXJnPXRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcyxraW5kKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlJlc3RFbGVtZW50KGFyZykpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUFycmF5UGF0dGVybj1mdW5jdGlvbihwYXJhbXMsa2luZCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3QoJ1snKTt2YXIgZWxlbWVudHM9W107d2hpbGUoIXRoaXMubWF0Y2goJ10nKSl7aWYodGhpcy5tYXRjaCgnLCcpKXt0aGlzLm5leHRUb2tlbigpO2VsZW1lbnRzLnB1c2gobnVsbCk7fWVsc2UKe2lmKHRoaXMubWF0Y2goJy4uLicpKXtlbGVtZW50cy5wdXNoKHRoaXMucGFyc2VCaW5kaW5nUmVzdEVsZW1lbnQocGFyYW1zLGtpbmQpKTticmVhazt9ZWxzZQp7ZWxlbWVudHMucHVzaCh0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcyxraW5kKSk7fQppZighdGhpcy5tYXRjaCgnXScpKXt0aGlzLmV4cGVjdCgnLCcpO319fQp0aGlzLmV4cGVjdCgnXScpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQXJyYXlQYXR0ZXJuKGVsZW1lbnRzKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJvcGVydHlQYXR0ZXJuPWZ1bmN0aW9uKHBhcmFtcyxraW5kKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgY29tcHV0ZWQ9ZmFsc2U7dmFyIHNob3J0aGFuZD1mYWxzZTt2YXIgbWV0aG9kPWZhbHNlO3ZhciBrZXk7dmFyIHZhbHVlO2lmKHRoaXMubG9va2FoZWFkLnR5cGU9PT0zKXt2YXIga2V5VG9rZW49dGhpcy5sb29rYWhlYWQ7a2V5PXRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTt2YXIgaW5pdD10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuSWRlbnRpZmllcihrZXlUb2tlbi52YWx1ZSkpO2lmKHRoaXMubWF0Y2goJz0nKSl7cGFyYW1zLnB1c2goa2V5VG9rZW4pO3Nob3J0aGFuZD10cnVlO3RoaXMubmV4dFRva2VuKCk7dmFyIGV4cHI9dGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7dmFsdWU9dGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShrZXlUb2tlbiksbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaW5pdCxleHByKSk7fWVsc2UKaWYoIXRoaXMubWF0Y2goJzonKSl7cGFyYW1zLnB1c2goa2V5VG9rZW4pO3Nob3J0aGFuZD10cnVlO3ZhbHVlPWluaXQ7fWVsc2UKe3RoaXMuZXhwZWN0KCc6Jyk7dmFsdWU9dGhpcy5wYXJzZVBhdHRlcm5XaXRoRGVmYXVsdChwYXJhbXMsa2luZCk7fX1lbHNlCntjb21wdXRlZD10aGlzLm1hdGNoKCdbJyk7a2V5PXRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO3RoaXMuZXhwZWN0KCc6Jyk7dmFsdWU9dGhpcy5wYXJzZVBhdHRlcm5XaXRoRGVmYXVsdChwYXJhbXMsa2luZCk7fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlByb3BlcnR5KCdpbml0JyxrZXksY29tcHV0ZWQsdmFsdWUsbWV0aG9kLHNob3J0aGFuZCkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFBhdHRlcm49ZnVuY3Rpb24ocGFyYW1zLGtpbmQpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBwcm9wZXJ0aWVzPVtdO3RoaXMuZXhwZWN0KCd7Jyk7d2hpbGUoIXRoaXMubWF0Y2goJ30nKSl7cHJvcGVydGllcy5wdXNoKHRoaXMucGFyc2VQcm9wZXJ0eVBhdHRlcm4ocGFyYW1zLGtpbmQpKTtpZighdGhpcy5tYXRjaCgnfScpKXt0aGlzLmV4cGVjdCgnLCcpO319CnRoaXMuZXhwZWN0KCd9Jyk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5PYmplY3RQYXR0ZXJuKHByb3BlcnRpZXMpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VQYXR0ZXJuPWZ1bmN0aW9uKHBhcmFtcyxraW5kKXt2YXIgcGF0dGVybjtpZih0aGlzLm1hdGNoKCdbJykpe3BhdHRlcm49dGhpcy5wYXJzZUFycmF5UGF0dGVybihwYXJhbXMsa2luZCk7fWVsc2UKaWYodGhpcy5tYXRjaCgneycpKXtwYXR0ZXJuPXRoaXMucGFyc2VPYmplY3RQYXR0ZXJuKHBhcmFtcyxraW5kKTt9ZWxzZQp7aWYodGhpcy5tYXRjaEtleXdvcmQoJ2xldCcpJiYoa2luZD09PSdjb25zdCd8fGtpbmQ9PT0nbGV0Jykpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsbWVzc2FnZXNfMS5NZXNzYWdlcy5MZXRJbkxleGljYWxCaW5kaW5nKTt9CnBhcmFtcy5wdXNoKHRoaXMubG9va2FoZWFkKTtwYXR0ZXJuPXRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoa2luZCk7fQpyZXR1cm4gcGF0dGVybjt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQ9ZnVuY3Rpb24ocGFyYW1zLGtpbmQpe3ZhciBzdGFydFRva2VuPXRoaXMubG9va2FoZWFkO3ZhciBwYXR0ZXJuPXRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcyxraW5kKTtpZih0aGlzLm1hdGNoKCc9Jykpe3RoaXMubmV4dFRva2VuKCk7dmFyIHByZXZpb3VzQWxsb3dZaWVsZD10aGlzLmNvbnRleHQuYWxsb3dZaWVsZDt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD10cnVlO3ZhciByaWdodD10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD1wcmV2aW91c0FsbG93WWllbGQ7cGF0dGVybj10aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLG5ldyBOb2RlLkFzc2lnbm1lbnRQYXR0ZXJuKHBhdHRlcm4scmlnaHQpKTt9CnJldHVybiBwYXR0ZXJuO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcj1mdW5jdGlvbihraW5kKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgdG9rZW49dGhpcy5uZXh0VG9rZW4oKTtpZih0b2tlbi50eXBlPT09NCYmdG9rZW4udmFsdWU9PT0neWllbGQnKXtpZih0aGlzLmNvbnRleHQuc3RyaWN0KXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTt9ZWxzZQppZighdGhpcy5jb250ZXh0LmFsbG93WWllbGQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO319ZWxzZQppZih0b2tlbi50eXBlIT09Myl7aWYodGhpcy5jb250ZXh0LnN0cmljdCYmdG9rZW4udHlwZT09PTQmJnRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTt9ZWxzZQp7aWYodGhpcy5jb250ZXh0LnN0cmljdHx8dG9rZW4udmFsdWUhPT0nbGV0J3x8a2luZCE9PSd2YXInKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTt9fX1lbHNlCmlmKCh0aGlzLmNvbnRleHQuaXNNb2R1bGV8fHRoaXMuY29udGV4dC5hd2FpdCkmJnRva2VuLnR5cGU9PT0zJiZ0b2tlbi52YWx1ZT09PSdhd2FpdCcpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4pO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5JZGVudGlmaWVyKHRva2VuLnZhbHVlKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbj1mdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgcGFyYW1zPVtdO3ZhciBpZD10aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsJ3ZhcicpO2lmKHRoaXMuY29udGV4dC5zdHJpY3QmJmlkLnR5cGU9PT1zeW50YXhfMS5TeW50YXguSWRlbnRpZmllcil7aWYodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoaWQubmFtZSkpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFZhck5hbWUpO319CnZhciBpbml0PW51bGw7aWYodGhpcy5tYXRjaCgnPScpKXt0aGlzLm5leHRUb2tlbigpO2luaXQ9dGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7fWVsc2UKaWYoaWQudHlwZSE9PXN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyJiYhb3B0aW9ucy5pbkZvcil7dGhpcy5leHBlY3QoJz0nKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLGluaXQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdD1mdW5jdGlvbihvcHRpb25zKXt2YXIgb3B0PXtpbkZvcjpvcHRpb25zLmluRm9yfTt2YXIgbGlzdD1bXTtsaXN0LnB1c2godGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb24ob3B0KSk7d2hpbGUodGhpcy5tYXRjaCgnLCcpKXt0aGlzLm5leHRUb2tlbigpO2xpc3QucHVzaCh0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbihvcHQpKTt9CnJldHVybiBsaXN0O307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlU3RhdGVtZW50PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3RLZXl3b3JkKCd2YXInKTt2YXIgZGVjbGFyYXRpb25zPXRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh7aW5Gb3I6ZmFsc2V9KTt0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCd2YXInKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRW1wdHlTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdCgnOycpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBleHByPXRoaXMucGFyc2VFeHByZXNzaW9uKCk7dGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VJZkNsYXVzZT1mdW5jdGlvbigpe2lmKHRoaXMuY29udGV4dC5zdHJpY3QmJnRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbik7fQpyZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudCgpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUlmU3RhdGVtZW50PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGNvbnNlcXVlbnQ7dmFyIGFsdGVybmF0ZT1udWxsO3RoaXMuZXhwZWN0S2V5d29yZCgnaWYnKTt0aGlzLmV4cGVjdCgnKCcpO3ZhciB0ZXN0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7aWYoIXRoaXMubWF0Y2goJyknKSYmdGhpcy5jb25maWcudG9sZXJhbnQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7Y29uc2VxdWVudD10aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO31lbHNlCnt0aGlzLmV4cGVjdCgnKScpO2NvbnNlcXVlbnQ9dGhpcy5wYXJzZUlmQ2xhdXNlKCk7aWYodGhpcy5tYXRjaEtleXdvcmQoJ2Vsc2UnKSl7dGhpcy5uZXh0VG9rZW4oKTthbHRlcm5hdGU9dGhpcy5wYXJzZUlmQ2xhdXNlKCk7fX0KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5JZlN0YXRlbWVudCh0ZXN0LGNvbnNlcXVlbnQsYWx0ZXJuYXRlKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRG9XaGlsZVN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgnZG8nKTt2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbj10aGlzLmNvbnRleHQuaW5JdGVyYXRpb247dGhpcy5jb250ZXh0LmluSXRlcmF0aW9uPXRydWU7dmFyIGJvZHk9dGhpcy5wYXJzZVN0YXRlbWVudCgpO3RoaXMuY29udGV4dC5pbkl0ZXJhdGlvbj1wcmV2aW91c0luSXRlcmF0aW9uO3RoaXMuZXhwZWN0S2V5d29yZCgnd2hpbGUnKTt0aGlzLmV4cGVjdCgnKCcpO3ZhciB0ZXN0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7aWYoIXRoaXMubWF0Y2goJyknKSYmdGhpcy5jb25maWcudG9sZXJhbnQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7fWVsc2UKe3RoaXMuZXhwZWN0KCcpJyk7aWYodGhpcy5tYXRjaCgnOycpKXt0aGlzLm5leHRUb2tlbigpO319CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRG9XaGlsZVN0YXRlbWVudChib2R5LHRlc3QpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VXaGlsZVN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBib2R5O3RoaXMuZXhwZWN0S2V5d29yZCgnd2hpbGUnKTt0aGlzLmV4cGVjdCgnKCcpO3ZhciB0ZXN0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7aWYoIXRoaXMubWF0Y2goJyknKSYmdGhpcy5jb25maWcudG9sZXJhbnQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7Ym9keT10aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO31lbHNlCnt0aGlzLmV4cGVjdCgnKScpO3ZhciBwcmV2aW91c0luSXRlcmF0aW9uPXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbjt0aGlzLmNvbnRleHQuaW5JdGVyYXRpb249dHJ1ZTtib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoKTt0aGlzLmNvbnRleHQuaW5JdGVyYXRpb249cHJldmlvdXNJbkl0ZXJhdGlvbjt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuV2hpbGVTdGF0ZW1lbnQodGVzdCxib2R5KSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRm9yU3RhdGVtZW50PWZ1bmN0aW9uKCl7dmFyIGluaXQ9bnVsbDt2YXIgdGVzdD1udWxsO3ZhciB1cGRhdGU9bnVsbDt2YXIgZm9ySW49dHJ1ZTt2YXIgbGVmdCxyaWdodDt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdEtleXdvcmQoJ2ZvcicpO3RoaXMuZXhwZWN0KCcoJyk7aWYodGhpcy5tYXRjaCgnOycpKXt0aGlzLm5leHRUb2tlbigpO31lbHNlCntpZih0aGlzLm1hdGNoS2V5d29yZCgndmFyJykpe2luaXQ9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5uZXh0VG9rZW4oKTt2YXIgcHJldmlvdXNBbGxvd0luPXRoaXMuY29udGV4dC5hbGxvd0luO3RoaXMuY29udGV4dC5hbGxvd0luPWZhbHNlO3ZhciBkZWNsYXJhdGlvbnM9dGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHtpbkZvcjp0cnVlfSk7dGhpcy5jb250ZXh0LmFsbG93SW49cHJldmlvdXNBbGxvd0luO2lmKGRlY2xhcmF0aW9ucy5sZW5ndGg9PT0xJiZ0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSl7dmFyIGRlY2w9ZGVjbGFyYXRpb25zWzBdO2lmKGRlY2wuaW5pdCYmKGRlY2wuaWQudHlwZT09PXN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm58fGRlY2wuaWQudHlwZT09PXN5bnRheF8xLlN5bnRheC5PYmplY3RQYXR0ZXJufHx0aGlzLmNvbnRleHQuc3RyaWN0KSl7dGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRm9ySW5PZkxvb3BJbml0aWFsaXplciwnZm9yLWluJyk7fQppbml0PXRoaXMuZmluYWxpemUoaW5pdCxuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywndmFyJykpO3RoaXMubmV4dFRva2VuKCk7bGVmdD1pbml0O3JpZ2h0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7aW5pdD1udWxsO31lbHNlCmlmKGRlY2xhcmF0aW9ucy5sZW5ndGg9PT0xJiZkZWNsYXJhdGlvbnNbMF0uaW5pdD09PW51bGwmJnRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSl7aW5pdD10aGlzLmZpbmFsaXplKGluaXQsbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsJ3ZhcicpKTt0aGlzLm5leHRUb2tlbigpO2xlZnQ9aW5pdDtyaWdodD10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtpbml0PW51bGw7Zm9ySW49ZmFsc2U7fWVsc2UKe2luaXQ9dGhpcy5maW5hbGl6ZShpbml0LG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCd2YXInKSk7dGhpcy5leHBlY3QoJzsnKTt9fWVsc2UKaWYodGhpcy5tYXRjaEtleXdvcmQoJ2NvbnN0Jyl8fHRoaXMubWF0Y2hLZXl3b3JkKCdsZXQnKSl7aW5pdD10aGlzLmNyZWF0ZU5vZGUoKTt2YXIga2luZD10aGlzLm5leHRUb2tlbigpLnZhbHVlO2lmKCF0aGlzLmNvbnRleHQuc3RyaWN0JiZ0aGlzLmxvb2thaGVhZC52YWx1ZT09PSdpbicpe2luaXQ9dGhpcy5maW5hbGl6ZShpbml0LG5ldyBOb2RlLklkZW50aWZpZXIoa2luZCkpO3RoaXMubmV4dFRva2VuKCk7bGVmdD1pbml0O3JpZ2h0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7aW5pdD1udWxsO31lbHNlCnt2YXIgcHJldmlvdXNBbGxvd0luPXRoaXMuY29udGV4dC5hbGxvd0luO3RoaXMuY29udGV4dC5hbGxvd0luPWZhbHNlO3ZhciBkZWNsYXJhdGlvbnM9dGhpcy5wYXJzZUJpbmRpbmdMaXN0KGtpbmQse2luRm9yOnRydWV9KTt0aGlzLmNvbnRleHQuYWxsb3dJbj1wcmV2aW91c0FsbG93SW47aWYoZGVjbGFyYXRpb25zLmxlbmd0aD09PTEmJmRlY2xhcmF0aW9uc1swXS5pbml0PT09bnVsbCYmdGhpcy5tYXRjaEtleXdvcmQoJ2luJykpe2luaXQ9dGhpcy5maW5hbGl6ZShpbml0LG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLGtpbmQpKTt0aGlzLm5leHRUb2tlbigpO2xlZnQ9aW5pdDtyaWdodD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO2luaXQ9bnVsbDt9ZWxzZQppZihkZWNsYXJhdGlvbnMubGVuZ3RoPT09MSYmZGVjbGFyYXRpb25zWzBdLmluaXQ9PT1udWxsJiZ0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ29mJykpe2luaXQ9dGhpcy5maW5hbGl6ZShpbml0LG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLGtpbmQpKTt0aGlzLm5leHRUb2tlbigpO2xlZnQ9aW5pdDtyaWdodD10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtpbml0PW51bGw7Zm9ySW49ZmFsc2U7fWVsc2UKe3RoaXMuY29uc3VtZVNlbWljb2xvbigpO2luaXQ9dGhpcy5maW5hbGl6ZShpbml0LG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLGtpbmQpKTt9fX1lbHNlCnt2YXIgaW5pdFN0YXJ0VG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIHByZXZpb3VzQWxsb3dJbj10aGlzLmNvbnRleHQuYWxsb3dJbjt0aGlzLmNvbnRleHQuYWxsb3dJbj1mYWxzZTtpbml0PXRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO3RoaXMuY29udGV4dC5hbGxvd0luPXByZXZpb3VzQWxsb3dJbjtpZih0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSl7aWYoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXR8fGluaXQudHlwZT09PXN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50RXhwcmVzc2lvbil7dGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luRm9ySW4pO30KdGhpcy5uZXh0VG9rZW4oKTt0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihpbml0KTtsZWZ0PWluaXQ7cmlnaHQ9dGhpcy5wYXJzZUV4cHJlc3Npb24oKTtpbml0PW51bGw7fWVsc2UKaWYodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKXtpZighdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldHx8aW5pdC50eXBlPT09c3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uKXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Gb3JMb29wKTt9CnRoaXMubmV4dFRva2VuKCk7dGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oaW5pdCk7bGVmdD1pbml0O3JpZ2h0PXRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO2luaXQ9bnVsbDtmb3JJbj1mYWxzZTt9ZWxzZQp7aWYodGhpcy5tYXRjaCgnLCcpKXt2YXIgaW5pdFNlcT1baW5pdF07d2hpbGUodGhpcy5tYXRjaCgnLCcpKXt0aGlzLm5leHRUb2tlbigpO2luaXRTZXEucHVzaCh0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7fQppbml0PXRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoaW5pdFN0YXJ0VG9rZW4pLG5ldyBOb2RlLlNlcXVlbmNlRXhwcmVzc2lvbihpbml0U2VxKSk7fQp0aGlzLmV4cGVjdCgnOycpO319fQppZih0eXBlb2YgbGVmdD09PSd1bmRlZmluZWQnKXtpZighdGhpcy5tYXRjaCgnOycpKXt0ZXN0PXRoaXMucGFyc2VFeHByZXNzaW9uKCk7fQp0aGlzLmV4cGVjdCgnOycpO2lmKCF0aGlzLm1hdGNoKCcpJykpe3VwZGF0ZT10aGlzLnBhcnNlRXhwcmVzc2lvbigpO319CnZhciBib2R5O2lmKCF0aGlzLm1hdGNoKCcpJykmJnRoaXMuY29uZmlnLnRvbGVyYW50KXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO2JvZHk9dGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSxuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTt9ZWxzZQp7dGhpcy5leHBlY3QoJyknKTt2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbj10aGlzLmNvbnRleHQuaW5JdGVyYXRpb247dGhpcy5jb250ZXh0LmluSXRlcmF0aW9uPXRydWU7Ym9keT10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVN0YXRlbWVudCk7dGhpcy5jb250ZXh0LmluSXRlcmF0aW9uPXByZXZpb3VzSW5JdGVyYXRpb247fQpyZXR1cm4gdHlwZW9mIGxlZnQ9PT0ndW5kZWZpbmVkJz90aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRm9yU3RhdGVtZW50KGluaXQsdGVzdCx1cGRhdGUsYm9keSkpOmZvckluP3RoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Gb3JJblN0YXRlbWVudChsZWZ0LHJpZ2h0LGJvZHkpKTp0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRm9yT2ZTdGF0ZW1lbnQobGVmdCxyaWdodCxib2R5KSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29udGludWVTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdEtleXdvcmQoJ2NvbnRpbnVlJyk7dmFyIGxhYmVsPW51bGw7aWYodGhpcy5sb29rYWhlYWQudHlwZT09PTMmJiF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKXt2YXIgaWQ9dGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO2xhYmVsPWlkO3ZhciBrZXk9JyQnK2lkLm5hbWU7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbnRleHQubGFiZWxTZXQsa2V5KSl7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5rbm93bkxhYmVsLGlkLm5hbWUpO319CnRoaXMuY29uc3VtZVNlbWljb2xvbigpO2lmKGxhYmVsPT09bnVsbCYmIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbil7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbENvbnRpbnVlKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQ29udGludWVTdGF0ZW1lbnQobGFiZWwpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VCcmVha1N0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgnYnJlYWsnKTt2YXIgbGFiZWw9bnVsbDtpZih0aGlzLmxvb2thaGVhZC50eXBlPT09MyYmIXRoaXMuaGFzTGluZVRlcm1pbmF0b3Ipe3ZhciBpZD10aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7dmFyIGtleT0nJCcraWQubmFtZTtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCxrZXkpKXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5Vbmtub3duTGFiZWwsaWQubmFtZSk7fQpsYWJlbD1pZDt9CnRoaXMuY29uc3VtZVNlbWljb2xvbigpO2lmKGxhYmVsPT09bnVsbCYmIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiYmIXRoaXMuY29udGV4dC5pblN3aXRjaCl7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEJyZWFrKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQnJlYWtTdGF0ZW1lbnQobGFiZWwpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VSZXR1cm5TdGF0ZW1lbnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsUmV0dXJuKTt9CnZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgncmV0dXJuJyk7dmFyIGhhc0FyZ3VtZW50PSF0aGlzLm1hdGNoKCc7JykmJiF0aGlzLm1hdGNoKCd9JykmJiF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yJiZ0aGlzLmxvb2thaGVhZC50eXBlIT09Mjt2YXIgYXJndW1lbnQ9aGFzQXJndW1lbnQ/dGhpcy5wYXJzZUV4cHJlc3Npb24oKTpudWxsO3RoaXMuY29uc3VtZVNlbWljb2xvbigpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuUmV0dXJuU3RhdGVtZW50KGFyZ3VtZW50KSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlV2l0aFN0YXRlbWVudD1mdW5jdGlvbigpe2lmKHRoaXMuY29udGV4dC5zdHJpY3Qpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE1vZGVXaXRoKTt9CnZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBib2R5O3RoaXMuZXhwZWN0S2V5d29yZCgnd2l0aCcpO3RoaXMuZXhwZWN0KCcoJyk7dmFyIG9iamVjdD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO2lmKCF0aGlzLm1hdGNoKCcpJykmJnRoaXMuY29uZmlnLnRvbGVyYW50KXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO2JvZHk9dGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSxuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTt9ZWxzZQp7dGhpcy5leHBlY3QoJyknKTtib2R5PXRoaXMucGFyc2VTdGF0ZW1lbnQoKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuV2l0aFN0YXRlbWVudChvYmplY3QsYm9keSkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN3aXRjaENhc2U9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgdGVzdDtpZih0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKXt0aGlzLm5leHRUb2tlbigpO3Rlc3Q9bnVsbDt9ZWxzZQp7dGhpcy5leHBlY3RLZXl3b3JkKCdjYXNlJyk7dGVzdD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO30KdGhpcy5leHBlY3QoJzonKTt2YXIgY29uc2VxdWVudD1bXTt3aGlsZSh0cnVlKXtpZih0aGlzLm1hdGNoKCd9Jyl8fHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0Jyl8fHRoaXMubWF0Y2hLZXl3b3JkKCdjYXNlJykpe2JyZWFrO30KY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuU3dpdGNoQ2FzZSh0ZXN0LGNvbnNlcXVlbnQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VTd2l0Y2hTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdEtleXdvcmQoJ3N3aXRjaCcpO3RoaXMuZXhwZWN0KCcoJyk7dmFyIGRpc2NyaW1pbmFudD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO3RoaXMuZXhwZWN0KCcpJyk7dmFyIHByZXZpb3VzSW5Td2l0Y2g9dGhpcy5jb250ZXh0LmluU3dpdGNoO3RoaXMuY29udGV4dC5pblN3aXRjaD10cnVlO3ZhciBjYXNlcz1bXTt2YXIgZGVmYXVsdEZvdW5kPWZhbHNlO3RoaXMuZXhwZWN0KCd7Jyk7d2hpbGUodHJ1ZSl7aWYodGhpcy5tYXRjaCgnfScpKXticmVhazt9CnZhciBjbGF1c2U9dGhpcy5wYXJzZVN3aXRjaENhc2UoKTtpZihjbGF1c2UudGVzdD09PW51bGwpe2lmKGRlZmF1bHRGb3VuZCl7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTXVsdGlwbGVEZWZhdWx0c0luU3dpdGNoKTt9CmRlZmF1bHRGb3VuZD10cnVlO30KY2FzZXMucHVzaChjbGF1c2UpO30KdGhpcy5leHBlY3QoJ30nKTt0aGlzLmNvbnRleHQuaW5Td2l0Y2g9cHJldmlvdXNJblN3aXRjaDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLlN3aXRjaFN0YXRlbWVudChkaXNjcmltaW5hbnQsY2FzZXMpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VMYWJlbGxlZFN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBleHByPXRoaXMucGFyc2VFeHByZXNzaW9uKCk7dmFyIHN0YXRlbWVudDtpZihleHByLnR5cGU9PT1zeW50YXhfMS5TeW50YXguSWRlbnRpZmllciYmdGhpcy5tYXRjaCgnOicpKXt0aGlzLm5leHRUb2tlbigpO3ZhciBpZD1leHByO3ZhciBrZXk9JyQnK2lkLm5hbWU7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCxrZXkpKXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5SZWRlY2xhcmF0aW9uLCdMYWJlbCcsaWQubmFtZSk7fQp0aGlzLmNvbnRleHQubGFiZWxTZXRba2V5XT10cnVlO3ZhciBib2R5PXZvaWQgMDtpZih0aGlzLm1hdGNoS2V5d29yZCgnY2xhc3MnKSl7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7Ym9keT10aGlzLnBhcnNlQ2xhc3NEZWNsYXJhdGlvbigpO31lbHNlCmlmKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKXt2YXIgdG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIGRlY2xhcmF0aW9uPXRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7aWYodGhpcy5jb250ZXh0LnN0cmljdCl7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbixtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uKTt9ZWxzZQppZihkZWNsYXJhdGlvbi5nZW5lcmF0b3Ipe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sbWVzc2FnZXNfMS5NZXNzYWdlcy5HZW5lcmF0b3JJbkxlZ2FjeUNvbnRleHQpO30KYm9keT1kZWNsYXJhdGlvbjt9ZWxzZQp7Ym9keT10aGlzLnBhcnNlU3RhdGVtZW50KCk7fQpkZWxldGUgdGhpcy5jb250ZXh0LmxhYmVsU2V0W2tleV07c3RhdGVtZW50PW5ldyBOb2RlLkxhYmVsZWRTdGF0ZW1lbnQoaWQsYm9keSk7fWVsc2UKe3RoaXMuY29uc3VtZVNlbWljb2xvbigpO3N0YXRlbWVudD1uZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxzdGF0ZW1lbnQpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVRocm93U3RhdGVtZW50PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3RLZXl3b3JkKCd0aHJvdycpO2lmKHRoaXMuaGFzTGluZVRlcm1pbmF0b3Ipe3RoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5ld2xpbmVBZnRlclRocm93KTt9CnZhciBhcmd1bWVudD10aGlzLnBhcnNlRXhwcmVzc2lvbigpO3RoaXMuY29uc3VtZVNlbWljb2xvbigpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuVGhyb3dTdGF0ZW1lbnQoYXJndW1lbnQpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VDYXRjaENsYXVzZT1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgnY2F0Y2gnKTt0aGlzLmV4cGVjdCgnKCcpO2lmKHRoaXMubWF0Y2goJyknKSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7fQp2YXIgcGFyYW1zPVtdO3ZhciBwYXJhbT10aGlzLnBhcnNlUGF0dGVybihwYXJhbXMpO3ZhciBwYXJhbU1hcD17fTtmb3IodmFyIGk9MDtpPHBhcmFtcy5sZW5ndGg7aSsrKXt2YXIga2V5PSckJytwYXJhbXNbaV0udmFsdWU7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtTWFwLGtleSkpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkR1cGxpY2F0ZUJpbmRpbmcscGFyYW1zW2ldLnZhbHVlKTt9CnBhcmFtTWFwW2tleV09dHJ1ZTt9CmlmKHRoaXMuY29udGV4dC5zdHJpY3QmJnBhcmFtLnR5cGU9PT1zeW50YXhfMS5TeW50YXguSWRlbnRpZmllcil7aWYodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQocGFyYW0ubmFtZSkpe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdENhdGNoVmFyaWFibGUpO319CnRoaXMuZXhwZWN0KCcpJyk7dmFyIGJvZHk9dGhpcy5wYXJzZUJsb2NrKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5DYXRjaENsYXVzZShwYXJhbSxib2R5KSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRmluYWxseUNsYXVzZT1mdW5jdGlvbigpe3RoaXMuZXhwZWN0S2V5d29yZCgnZmluYWxseScpO3JldHVybiB0aGlzLnBhcnNlQmxvY2soKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VUcnlTdGF0ZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdEtleXdvcmQoJ3RyeScpO3ZhciBibG9jaz10aGlzLnBhcnNlQmxvY2soKTt2YXIgaGFuZGxlcj10aGlzLm1hdGNoS2V5d29yZCgnY2F0Y2gnKT90aGlzLnBhcnNlQ2F0Y2hDbGF1c2UoKTpudWxsO3ZhciBmaW5hbGl6ZXI9dGhpcy5tYXRjaEtleXdvcmQoJ2ZpbmFsbHknKT90aGlzLnBhcnNlRmluYWxseUNsYXVzZSgpOm51bGw7aWYoIWhhbmRsZXImJiFmaW5hbGl6ZXIpe3RoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5vQ2F0Y2hPckZpbmFsbHkpO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5UcnlTdGF0ZW1lbnQoYmxvY2ssaGFuZGxlcixmaW5hbGl6ZXIpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VEZWJ1Z2dlclN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgnZGVidWdnZXInKTt0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkRlYnVnZ2VyU3RhdGVtZW50KCkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0YXRlbWVudD1mdW5jdGlvbigpe3ZhciBzdGF0ZW1lbnQ7c3dpdGNoKHRoaXMubG9va2FoZWFkLnR5cGUpe2Nhc2UgMTpjYXNlIDU6Y2FzZSA2OmNhc2UgODpjYXNlIDEwOmNhc2UgOTpzdGF0ZW1lbnQ9dGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTticmVhaztjYXNlIDc6dmFyIHZhbHVlPXRoaXMubG9va2FoZWFkLnZhbHVlO2lmKHZhbHVlPT09J3snKXtzdGF0ZW1lbnQ9dGhpcy5wYXJzZUJsb2NrKCk7fWVsc2UKaWYodmFsdWU9PT0nKCcpe3N0YXRlbWVudD10aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO31lbHNlCmlmKHZhbHVlPT09JzsnKXtzdGF0ZW1lbnQ9dGhpcy5wYXJzZUVtcHR5U3RhdGVtZW50KCk7fWVsc2UKe3N0YXRlbWVudD10aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO30KYnJlYWs7Y2FzZSAzOnN0YXRlbWVudD10aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpP3RoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk6dGhpcy5wYXJzZUxhYmVsbGVkU3RhdGVtZW50KCk7YnJlYWs7Y2FzZSA0OnN3aXRjaCh0aGlzLmxvb2thaGVhZC52YWx1ZSl7Y2FzZSdicmVhayc6c3RhdGVtZW50PXRoaXMucGFyc2VCcmVha1N0YXRlbWVudCgpO2JyZWFrO2Nhc2UnY29udGludWUnOnN0YXRlbWVudD10aGlzLnBhcnNlQ29udGludWVTdGF0ZW1lbnQoKTticmVhaztjYXNlJ2RlYnVnZ2VyJzpzdGF0ZW1lbnQ9dGhpcy5wYXJzZURlYnVnZ2VyU3RhdGVtZW50KCk7YnJlYWs7Y2FzZSdkbyc6c3RhdGVtZW50PXRoaXMucGFyc2VEb1doaWxlU3RhdGVtZW50KCk7YnJlYWs7Y2FzZSdmb3InOnN0YXRlbWVudD10aGlzLnBhcnNlRm9yU3RhdGVtZW50KCk7YnJlYWs7Y2FzZSdmdW5jdGlvbic6c3RhdGVtZW50PXRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7YnJlYWs7Y2FzZSdpZic6c3RhdGVtZW50PXRoaXMucGFyc2VJZlN0YXRlbWVudCgpO2JyZWFrO2Nhc2UncmV0dXJuJzpzdGF0ZW1lbnQ9dGhpcy5wYXJzZVJldHVyblN0YXRlbWVudCgpO2JyZWFrO2Nhc2Unc3dpdGNoJzpzdGF0ZW1lbnQ9dGhpcy5wYXJzZVN3aXRjaFN0YXRlbWVudCgpO2JyZWFrO2Nhc2UndGhyb3cnOnN0YXRlbWVudD10aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQoKTticmVhaztjYXNlJ3RyeSc6c3RhdGVtZW50PXRoaXMucGFyc2VUcnlTdGF0ZW1lbnQoKTticmVhaztjYXNlJ3Zhcic6c3RhdGVtZW50PXRoaXMucGFyc2VWYXJpYWJsZVN0YXRlbWVudCgpO2JyZWFrO2Nhc2Und2hpbGUnOnN0YXRlbWVudD10aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQoKTticmVhaztjYXNlJ3dpdGgnOnN0YXRlbWVudD10aGlzLnBhcnNlV2l0aFN0YXRlbWVudCgpO2JyZWFrO2RlZmF1bHQ6c3RhdGVtZW50PXRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7YnJlYWs7fQpicmVhaztkZWZhdWx0OnN0YXRlbWVudD10aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9CnJldHVybiBzdGF0ZW1lbnQ7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cz1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0KCd7Jyk7dmFyIGJvZHk9dGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO3ZhciBwcmV2aW91c0xhYmVsU2V0PXRoaXMuY29udGV4dC5sYWJlbFNldDt2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbj10aGlzLmNvbnRleHQuaW5JdGVyYXRpb247dmFyIHByZXZpb3VzSW5Td2l0Y2g9dGhpcy5jb250ZXh0LmluU3dpdGNoO3ZhciBwcmV2aW91c0luRnVuY3Rpb25Cb2R5PXRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keTt0aGlzLmNvbnRleHQubGFiZWxTZXQ9e307dGhpcy5jb250ZXh0LmluSXRlcmF0aW9uPWZhbHNlO3RoaXMuY29udGV4dC5pblN3aXRjaD1mYWxzZTt0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHk9dHJ1ZTt3aGlsZSh0aGlzLmxvb2thaGVhZC50eXBlIT09Mil7aWYodGhpcy5tYXRjaCgnfScpKXticmVhazt9CmJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7fQp0aGlzLmV4cGVjdCgnfScpO3RoaXMuY29udGV4dC5sYWJlbFNldD1wcmV2aW91c0xhYmVsU2V0O3RoaXMuY29udGV4dC5pbkl0ZXJhdGlvbj1wcmV2aW91c0luSXRlcmF0aW9uO3RoaXMuY29udGV4dC5pblN3aXRjaD1wcmV2aW91c0luU3dpdGNoO3RoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keT1wcmV2aW91c0luRnVuY3Rpb25Cb2R5O3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuQmxvY2tTdGF0ZW1lbnQoYm9keSkpO307UGFyc2VyLnByb3RvdHlwZS52YWxpZGF0ZVBhcmFtPWZ1bmN0aW9uKG9wdGlvbnMscGFyYW0sbmFtZSl7dmFyIGtleT0nJCcrbmFtZTtpZih0aGlzLmNvbnRleHQuc3RyaWN0KXtpZih0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChuYW1lKSl7b3B0aW9ucy5zdHJpY3RlZD1wYXJhbTtvcHRpb25zLm1lc3NhZ2U9bWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbU5hbWU7fQppZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCxrZXkpKXtvcHRpb25zLnN0cmljdGVkPXBhcmFtO29wdGlvbnMubWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtRHVwZTt9fWVsc2UKaWYoIW9wdGlvbnMuZmlyc3RSZXN0cmljdGVkKXtpZih0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChuYW1lKSl7b3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQ9cGFyYW07b3B0aW9ucy5tZXNzYWdlPW1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1OYW1lO31lbHNlCmlmKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQobmFtZSkpe29wdGlvbnMuZmlyc3RSZXN0cmljdGVkPXBhcmFtO29wdGlvbnMubWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDt9ZWxzZQppZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCxrZXkpKXtvcHRpb25zLnN0cmljdGVkPXBhcmFtO29wdGlvbnMubWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtRHVwZTt9fQppZih0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5PT09J2Z1bmN0aW9uJyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMucGFyYW1TZXQsa2V5LHt2YWx1ZTp0cnVlLGVudW1lcmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSk7fWVsc2UKe29wdGlvbnMucGFyYW1TZXRba2V5XT10cnVlO319O1BhcnNlci5wcm90b3R5cGUucGFyc2VSZXN0RWxlbWVudD1mdW5jdGlvbihwYXJhbXMpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0KCcuLi4nKTt2YXIgYXJnPXRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcyk7aWYodGhpcy5tYXRjaCgnPScpKXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EZWZhdWx0UmVzdFBhcmFtZXRlcik7fQppZighdGhpcy5tYXRjaCgnKScpKXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5QYXJhbWV0ZXJBZnRlclJlc3RQYXJhbWV0ZXIpO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5SZXN0RWxlbWVudChhcmcpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VGb3JtYWxQYXJhbWV0ZXI9ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIHBhcmFtcz1bXTt2YXIgcGFyYW09dGhpcy5tYXRjaCgnLi4uJyk/dGhpcy5wYXJzZVJlc3RFbGVtZW50KHBhcmFtcyk6dGhpcy5wYXJzZVBhdHRlcm5XaXRoRGVmYXVsdChwYXJhbXMpO2Zvcih2YXIgaT0wO2k8cGFyYW1zLmxlbmd0aDtpKyspe3RoaXMudmFsaWRhdGVQYXJhbShvcHRpb25zLHBhcmFtc1tpXSxwYXJhbXNbaV0udmFsdWUpO30Kb3B0aW9ucy5zaW1wbGU9b3B0aW9ucy5zaW1wbGUmJnBhcmFtIGluc3RhbmNlb2YgTm9kZS5JZGVudGlmaWVyO29wdGlvbnMucGFyYW1zLnB1c2gocGFyYW0pO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvcm1hbFBhcmFtZXRlcnM9ZnVuY3Rpb24oZmlyc3RSZXN0cmljdGVkKXt2YXIgb3B0aW9ucztvcHRpb25zPXtzaW1wbGU6dHJ1ZSxwYXJhbXM6W10sZmlyc3RSZXN0cmljdGVkOmZpcnN0UmVzdHJpY3RlZH07dGhpcy5leHBlY3QoJygnKTtpZighdGhpcy5tYXRjaCgnKScpKXtvcHRpb25zLnBhcmFtU2V0PXt9O3doaWxlKHRoaXMubG9va2FoZWFkLnR5cGUhPT0yKXt0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVyKG9wdGlvbnMpO2lmKHRoaXMubWF0Y2goJyknKSl7YnJlYWs7fQp0aGlzLmV4cGVjdCgnLCcpO2lmKHRoaXMubWF0Y2goJyknKSl7YnJlYWs7fX19CnRoaXMuZXhwZWN0KCcpJyk7cmV0dXJue3NpbXBsZTpvcHRpb25zLnNpbXBsZSxwYXJhbXM6b3B0aW9ucy5wYXJhbXMsc3RyaWN0ZWQ6b3B0aW9ucy5zdHJpY3RlZCxmaXJzdFJlc3RyaWN0ZWQ6b3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQsbWVzc2FnZTpvcHRpb25zLm1lc3NhZ2V9O307UGFyc2VyLnByb3RvdHlwZS5tYXRjaEFzeW5jRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgbWF0Y2g9dGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO2lmKG1hdGNoKXt2YXIgc3RhdGU9dGhpcy5zY2FubmVyLnNhdmVTdGF0ZSgpO3RoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTt2YXIgbmV4dD10aGlzLnNjYW5uZXIubGV4KCk7dGhpcy5zY2FubmVyLnJlc3RvcmVTdGF0ZShzdGF0ZSk7bWF0Y2g9c3RhdGUubGluZU51bWJlcj09PW5leHQubGluZU51bWJlciYmbmV4dC50eXBlPT09NCYmbmV4dC52YWx1ZT09PSdmdW5jdGlvbic7fQpyZXR1cm4gbWF0Y2g7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbj1mdW5jdGlvbihpZGVudGlmaWVySXNPcHRpb25hbCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGlzQXN5bmM9dGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO2lmKGlzQXN5bmMpe3RoaXMubmV4dFRva2VuKCk7fQp0aGlzLmV4cGVjdEtleXdvcmQoJ2Z1bmN0aW9uJyk7dmFyIGlzR2VuZXJhdG9yPWlzQXN5bmM/ZmFsc2U6dGhpcy5tYXRjaCgnKicpO2lmKGlzR2VuZXJhdG9yKXt0aGlzLm5leHRUb2tlbigpO30KdmFyIG1lc3NhZ2U7dmFyIGlkPW51bGw7dmFyIGZpcnN0UmVzdHJpY3RlZD1udWxsO2lmKCFpZGVudGlmaWVySXNPcHRpb25hbHx8IXRoaXMubWF0Y2goJygnKSl7dmFyIHRva2VuPXRoaXMubG9va2FoZWFkO2lkPXRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0KXtpZih0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWUpO319ZWxzZQp7aWYodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKXtmaXJzdFJlc3RyaWN0ZWQ9dG9rZW47bWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZTt9ZWxzZQppZih0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSl7Zmlyc3RSZXN0cmljdGVkPXRva2VuO21lc3NhZ2U9bWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7fX19CnZhciBwcmV2aW91c0FsbG93QXdhaXQ9dGhpcy5jb250ZXh0LmF3YWl0O3ZhciBwcmV2aW91c0FsbG93WWllbGQ9dGhpcy5jb250ZXh0LmFsbG93WWllbGQ7dGhpcy5jb250ZXh0LmF3YWl0PWlzQXN5bmM7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9IWlzR2VuZXJhdG9yO3ZhciBmb3JtYWxQYXJhbWV0ZXJzPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKGZpcnN0UmVzdHJpY3RlZCk7dmFyIHBhcmFtcz1mb3JtYWxQYXJhbWV0ZXJzLnBhcmFtczt2YXIgc3RyaWN0ZWQ9Zm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtmaXJzdFJlc3RyaWN0ZWQ9Zm9ybWFsUGFyYW1ldGVycy5maXJzdFJlc3RyaWN0ZWQ7aWYoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKXttZXNzYWdlPWZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZTt9CnZhciBwcmV2aW91c1N0cmljdD10aGlzLmNvbnRleHQuc3RyaWN0O3ZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlPXRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTt0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU9Zm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7dmFyIGJvZHk9dGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0JiZmaXJzdFJlc3RyaWN0ZWQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLG1lc3NhZ2UpO30KaWYodGhpcy5jb250ZXh0LnN0cmljdCYmc3RyaWN0ZWQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsbWVzc2FnZSk7fQp0aGlzLmNvbnRleHQuc3RyaWN0PXByZXZpb3VzU3RyaWN0O3RoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZT1wcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO3RoaXMuY29udGV4dC5hd2FpdD1wcmV2aW91c0FsbG93QXdhaXQ7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9cHJldmlvdXNBbGxvd1lpZWxkO3JldHVybiBpc0FzeW5jP3RoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24oaWQscGFyYW1zLGJvZHkpKTp0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRnVuY3Rpb25EZWNsYXJhdGlvbihpZCxwYXJhbXMsYm9keSxpc0dlbmVyYXRvcikpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBpc0FzeW5jPXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKTtpZihpc0FzeW5jKXt0aGlzLm5leHRUb2tlbigpO30KdGhpcy5leHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO3ZhciBpc0dlbmVyYXRvcj1pc0FzeW5jP2ZhbHNlOnRoaXMubWF0Y2goJyonKTtpZihpc0dlbmVyYXRvcil7dGhpcy5uZXh0VG9rZW4oKTt9CnZhciBtZXNzYWdlO3ZhciBpZD1udWxsO3ZhciBmaXJzdFJlc3RyaWN0ZWQ7dmFyIHByZXZpb3VzQWxsb3dBd2FpdD10aGlzLmNvbnRleHQuYXdhaXQ7dmFyIHByZXZpb3VzQWxsb3dZaWVsZD10aGlzLmNvbnRleHQuYWxsb3dZaWVsZDt0aGlzLmNvbnRleHQuYXdhaXQ9aXNBc3luYzt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD0haXNHZW5lcmF0b3I7aWYoIXRoaXMubWF0Y2goJygnKSl7dmFyIHRva2VuPXRoaXMubG9va2FoZWFkO2lkPSF0aGlzLmNvbnRleHQuc3RyaWN0JiYhaXNHZW5lcmF0b3ImJnRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpP3RoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpOnRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0KXtpZih0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWUpO319ZWxzZQp7aWYodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKXtmaXJzdFJlc3RyaWN0ZWQ9dG9rZW47bWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZTt9ZWxzZQppZih0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSl7Zmlyc3RSZXN0cmljdGVkPXRva2VuO21lc3NhZ2U9bWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7fX19CnZhciBmb3JtYWxQYXJhbWV0ZXJzPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKGZpcnN0UmVzdHJpY3RlZCk7dmFyIHBhcmFtcz1mb3JtYWxQYXJhbWV0ZXJzLnBhcmFtczt2YXIgc3RyaWN0ZWQ9Zm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtmaXJzdFJlc3RyaWN0ZWQ9Zm9ybWFsUGFyYW1ldGVycy5maXJzdFJlc3RyaWN0ZWQ7aWYoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKXttZXNzYWdlPWZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZTt9CnZhciBwcmV2aW91c1N0cmljdD10aGlzLmNvbnRleHQuc3RyaWN0O3ZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlPXRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTt0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU9Zm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7dmFyIGJvZHk9dGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtpZih0aGlzLmNvbnRleHQuc3RyaWN0JiZmaXJzdFJlc3RyaWN0ZWQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLG1lc3NhZ2UpO30KaWYodGhpcy5jb250ZXh0LnN0cmljdCYmc3RyaWN0ZWQpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsbWVzc2FnZSk7fQp0aGlzLmNvbnRleHQuc3RyaWN0PXByZXZpb3VzU3RyaWN0O3RoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZT1wcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO3RoaXMuY29udGV4dC5hd2FpdD1wcmV2aW91c0FsbG93QXdhaXQ7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9cHJldmlvdXNBbGxvd1lpZWxkO3JldHVybiBpc0FzeW5jP3RoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5Bc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihpZCxwYXJhbXMsYm9keSkpOnRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24oaWQscGFyYW1zLGJvZHksaXNHZW5lcmF0b3IpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VEaXJlY3RpdmU9ZnVuY3Rpb24oKXt2YXIgdG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGV4cHI9dGhpcy5wYXJzZUV4cHJlc3Npb24oKTt2YXIgZGlyZWN0aXZlPWV4cHIudHlwZT09PXN5bnRheF8xLlN5bnRheC5MaXRlcmFsP3RoaXMuZ2V0VG9rZW5SYXcodG9rZW4pLnNsaWNlKDEsLTEpOm51bGw7dGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxkaXJlY3RpdmU/bmV3IE5vZGUuRGlyZWN0aXZlKGV4cHIsZGlyZWN0aXZlKTpuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VEaXJlY3RpdmVQcm9sb2d1ZXM9ZnVuY3Rpb24oKXt2YXIgZmlyc3RSZXN0cmljdGVkPW51bGw7dmFyIGJvZHk9W107d2hpbGUodHJ1ZSl7dmFyIHRva2VuPXRoaXMubG9va2FoZWFkO2lmKHRva2VuLnR5cGUhPT04KXticmVhazt9CnZhciBzdGF0ZW1lbnQ9dGhpcy5wYXJzZURpcmVjdGl2ZSgpO2JvZHkucHVzaChzdGF0ZW1lbnQpO3ZhciBkaXJlY3RpdmU9c3RhdGVtZW50LmRpcmVjdGl2ZTtpZih0eXBlb2YgZGlyZWN0aXZlIT09J3N0cmluZycpe2JyZWFrO30KaWYoZGlyZWN0aXZlPT09J3VzZSBzdHJpY3QnKXt0aGlzLmNvbnRleHQuc3RyaWN0PXRydWU7aWYoZmlyc3RSZXN0cmljdGVkKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCxtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7fQppZighdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZSk7fX1lbHNlCntpZighZmlyc3RSZXN0cmljdGVkJiZ0b2tlbi5vY3RhbCl7Zmlyc3RSZXN0cmljdGVkPXRva2VuO319fQpyZXR1cm4gYm9keTt9O1BhcnNlci5wcm90b3R5cGUucXVhbGlmaWVkUHJvcGVydHlOYW1lPWZ1bmN0aW9uKHRva2VuKXtzd2l0Y2godG9rZW4udHlwZSl7Y2FzZSAzOmNhc2UgODpjYXNlIDE6Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6cmV0dXJuIHRydWU7Y2FzZSA3OnJldHVybiB0b2tlbi52YWx1ZT09PSdbJztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIGZhbHNlO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUdldHRlck1ldGhvZD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBpc0dlbmVyYXRvcj1mYWxzZTt2YXIgcHJldmlvdXNBbGxvd1lpZWxkPXRoaXMuY29udGV4dC5hbGxvd1lpZWxkO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPWZhbHNlO3ZhciBmb3JtYWxQYXJhbWV0ZXJzPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7aWYoZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMubGVuZ3RoPjApe3RoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkJhZEdldHRlckFyaXR5KTt9CnZhciBtZXRob2Q9dGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kKGZvcm1hbFBhcmFtZXRlcnMpO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPXByZXZpb3VzQWxsb3dZaWVsZDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLG1ldGhvZCxpc0dlbmVyYXRvcikpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVNldHRlck1ldGhvZD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBpc0dlbmVyYXRvcj1mYWxzZTt2YXIgcHJldmlvdXNBbGxvd1lpZWxkPXRoaXMuY29udGV4dC5hbGxvd1lpZWxkO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPWZhbHNlO3ZhciBmb3JtYWxQYXJhbWV0ZXJzPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7aWYoZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMubGVuZ3RoIT09MSl7dGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkU2V0dGVyQXJpdHkpO31lbHNlCmlmKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zWzBdaW5zdGFuY2VvZiBOb2RlLlJlc3RFbGVtZW50KXt0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRTZXR0ZXJSZXN0UGFyYW1ldGVyKTt9CnZhciBtZXRob2Q9dGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kKGZvcm1hbFBhcmFtZXRlcnMpO3RoaXMuY29udGV4dC5hbGxvd1lpZWxkPXByZXZpb3VzQWxsb3dZaWVsZDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLG1ldGhvZCxpc0dlbmVyYXRvcikpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUdlbmVyYXRvck1ldGhvZD1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBpc0dlbmVyYXRvcj10cnVlO3ZhciBwcmV2aW91c0FsbG93WWllbGQ9dGhpcy5jb250ZXh0LmFsbG93WWllbGQ7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9dHJ1ZTt2YXIgcGFyYW1zPXRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9ZmFsc2U7dmFyIG1ldGhvZD10aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTt0aGlzLmNvbnRleHQuYWxsb3dZaWVsZD1wcmV2aW91c0FsbG93WWllbGQ7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCxwYXJhbXMucGFyYW1zLG1ldGhvZCxpc0dlbmVyYXRvcikpO307UGFyc2VyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIHN0YXJ0PXRydWU7dmFyIHZhbHVlPXRoaXMubG9va2FoZWFkLnZhbHVlO3N3aXRjaCh0aGlzLmxvb2thaGVhZC50eXBlKXtjYXNlIDc6c3RhcnQ9dmFsdWU9PT0nWyd8fHZhbHVlPT09JygnfHx2YWx1ZT09PSd7J3x8dmFsdWU9PT0nKyd8fHZhbHVlPT09Jy0nfHx2YWx1ZT09PSchJ3x8dmFsdWU9PT0nfid8fHZhbHVlPT09JysrJ3x8dmFsdWU9PT0nLS0nfHx2YWx1ZT09PScvJ3x8dmFsdWU9PT0nLz0nO2JyZWFrO2Nhc2UgNDpzdGFydD12YWx1ZT09PSdjbGFzcyd8fHZhbHVlPT09J2RlbGV0ZSd8fHZhbHVlPT09J2Z1bmN0aW9uJ3x8dmFsdWU9PT0nbGV0J3x8dmFsdWU9PT0nbmV3J3x8dmFsdWU9PT0nc3VwZXInfHx2YWx1ZT09PSd0aGlzJ3x8dmFsdWU9PT0ndHlwZW9mJ3x8dmFsdWU9PT0ndm9pZCd8fHZhbHVlPT09J3lpZWxkJzticmVhaztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIHN0YXJ0O307UGFyc2VyLnByb3RvdHlwZS5wYXJzZVlpZWxkRXhwcmVzc2lvbj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgneWllbGQnKTt2YXIgYXJndW1lbnQ9bnVsbDt2YXIgZGVsZWdhdGU9ZmFsc2U7aWYoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3Ipe3ZhciBwcmV2aW91c0FsbG93WWllbGQ9dGhpcy5jb250ZXh0LmFsbG93WWllbGQ7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9ZmFsc2U7ZGVsZWdhdGU9dGhpcy5tYXRjaCgnKicpO2lmKGRlbGVnYXRlKXt0aGlzLm5leHRUb2tlbigpO2FyZ3VtZW50PXRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO31lbHNlCmlmKHRoaXMuaXNTdGFydE9mRXhwcmVzc2lvbigpKXthcmd1bWVudD10aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTt9CnRoaXMuY29udGV4dC5hbGxvd1lpZWxkPXByZXZpb3VzQWxsb3dZaWVsZDt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuWWllbGRFeHByZXNzaW9uKGFyZ3VtZW50LGRlbGVnYXRlKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NFbGVtZW50PWZ1bmN0aW9uKGhhc0NvbnN0cnVjdG9yKXt2YXIgdG9rZW49dGhpcy5sb29rYWhlYWQ7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGtpbmQ9Jyc7dmFyIGtleT1udWxsO3ZhciB2YWx1ZT1udWxsO3ZhciBjb21wdXRlZD1mYWxzZTt2YXIgbWV0aG9kPWZhbHNlO3ZhciBpc1N0YXRpYz1mYWxzZTt2YXIgaXNBc3luYz1mYWxzZTtpZih0aGlzLm1hdGNoKCcqJykpe3RoaXMubmV4dFRva2VuKCk7fWVsc2UKe2NvbXB1dGVkPXRoaXMubWF0Y2goJ1snKTtrZXk9dGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7dmFyIGlkPWtleTtpZihpZC5uYW1lPT09J3N0YXRpYycmJih0aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCl8fHRoaXMubWF0Y2goJyonKSkpe3Rva2VuPXRoaXMubG9va2FoZWFkO2lzU3RhdGljPXRydWU7Y29tcHV0ZWQ9dGhpcy5tYXRjaCgnWycpO2lmKHRoaXMubWF0Y2goJyonKSl7dGhpcy5uZXh0VG9rZW4oKTt9ZWxzZQp7a2V5PXRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO319CmlmKHRva2VuLnR5cGU9PT0zJiYhdGhpcy5oYXNMaW5lVGVybWluYXRvciYmdG9rZW4udmFsdWU9PT0nYXN5bmMnKXt2YXIgcHVuY3R1YXRvcj10aGlzLmxvb2thaGVhZC52YWx1ZTtpZihwdW5jdHVhdG9yIT09JzonJiZwdW5jdHVhdG9yIT09JygnJiZwdW5jdHVhdG9yIT09JyonKXtpc0FzeW5jPXRydWU7dG9rZW49dGhpcy5sb29rYWhlYWQ7a2V5PXRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO2lmKHRva2VuLnR5cGU9PT0zKXtpZih0b2tlbi52YWx1ZT09PSdnZXQnfHx0b2tlbi52YWx1ZT09PSdzZXQnKXt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuKTt9ZWxzZQppZih0b2tlbi52YWx1ZT09PSdjb25zdHJ1Y3Rvcicpe3RoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sbWVzc2FnZXNfMS5NZXNzYWdlcy5Db25zdHJ1Y3RvcklzQXN5bmMpO319fX19CnZhciBsb29rYWhlYWRQcm9wZXJ0eUtleT10aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCk7aWYodG9rZW4udHlwZT09PTMpe2lmKHRva2VuLnZhbHVlPT09J2dldCcmJmxvb2thaGVhZFByb3BlcnR5S2V5KXtraW5kPSdnZXQnO2NvbXB1dGVkPXRoaXMubWF0Y2goJ1snKTtrZXk9dGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7dGhpcy5jb250ZXh0LmFsbG93WWllbGQ9ZmFsc2U7dmFsdWU9dGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO31lbHNlCmlmKHRva2VuLnZhbHVlPT09J3NldCcmJmxvb2thaGVhZFByb3BlcnR5S2V5KXtraW5kPSdzZXQnO2NvbXB1dGVkPXRoaXMubWF0Y2goJ1snKTtrZXk9dGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7dmFsdWU9dGhpcy5wYXJzZVNldHRlck1ldGhvZCgpO319ZWxzZQppZih0b2tlbi50eXBlPT09NyYmdG9rZW4udmFsdWU9PT0nKicmJmxvb2thaGVhZFByb3BlcnR5S2V5KXtraW5kPSdpbml0Jztjb21wdXRlZD10aGlzLm1hdGNoKCdbJyk7a2V5PXRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO3ZhbHVlPXRoaXMucGFyc2VHZW5lcmF0b3JNZXRob2QoKTttZXRob2Q9dHJ1ZTt9CmlmKCFraW5kJiZrZXkmJnRoaXMubWF0Y2goJygnKSl7a2luZD0naW5pdCc7dmFsdWU9aXNBc3luYz90aGlzLnBhcnNlUHJvcGVydHlNZXRob2RBc3luY0Z1bmN0aW9uKCk6dGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb24oKTttZXRob2Q9dHJ1ZTt9CmlmKCFraW5kKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9CmlmKGtpbmQ9PT0naW5pdCcpe2tpbmQ9J21ldGhvZCc7fQppZighY29tcHV0ZWQpe2lmKGlzU3RhdGljJiZ0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCdwcm90b3R5cGUnKSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbixtZXNzYWdlc18xLk1lc3NhZ2VzLlN0YXRpY1Byb3RvdHlwZSk7fQppZighaXNTdGF0aWMmJnRoaXMuaXNQcm9wZXJ0eUtleShrZXksJ2NvbnN0cnVjdG9yJykpe2lmKGtpbmQhPT0nbWV0aG9kJ3x8IW1ldGhvZHx8dmFsdWUmJnZhbHVlLmdlbmVyYXRvcil7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbixtZXNzYWdlc18xLk1lc3NhZ2VzLkNvbnN0cnVjdG9yU3BlY2lhbE1ldGhvZCk7fQppZihoYXNDb25zdHJ1Y3Rvci52YWx1ZSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbixtZXNzYWdlc18xLk1lc3NhZ2VzLkR1cGxpY2F0ZUNvbnN0cnVjdG9yKTt9ZWxzZQp7aGFzQ29uc3RydWN0b3IudmFsdWU9dHJ1ZTt9CmtpbmQ9J2NvbnN0cnVjdG9yJzt9fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLk1ldGhvZERlZmluaXRpb24oa2V5LGNvbXB1dGVkLHZhbHVlLGtpbmQsaXNTdGF0aWMpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0VsZW1lbnRMaXN0PWZ1bmN0aW9uKCl7dmFyIGJvZHk9W107dmFyIGhhc0NvbnN0cnVjdG9yPXt2YWx1ZTpmYWxzZX07dGhpcy5leHBlY3QoJ3snKTt3aGlsZSghdGhpcy5tYXRjaCgnfScpKXtpZih0aGlzLm1hdGNoKCc7Jykpe3RoaXMubmV4dFRva2VuKCk7fWVsc2UKe2JvZHkucHVzaCh0aGlzLnBhcnNlQ2xhc3NFbGVtZW50KGhhc0NvbnN0cnVjdG9yKSk7fX0KdGhpcy5leHBlY3QoJ30nKTtyZXR1cm4gYm9keTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0JvZHk9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgZWxlbWVudExpc3Q9dGhpcy5wYXJzZUNsYXNzRWxlbWVudExpc3QoKTtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkNsYXNzQm9keShlbGVtZW50TGlzdCkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRGVjbGFyYXRpb249ZnVuY3Rpb24oaWRlbnRpZmllcklzT3B0aW9uYWwpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBwcmV2aW91c1N0cmljdD10aGlzLmNvbnRleHQuc3RyaWN0O3RoaXMuY29udGV4dC5zdHJpY3Q9dHJ1ZTt0aGlzLmV4cGVjdEtleXdvcmQoJ2NsYXNzJyk7dmFyIGlkPWlkZW50aWZpZXJJc09wdGlvbmFsJiZ0aGlzLmxvb2thaGVhZC50eXBlIT09Mz9udWxsOnRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTt2YXIgc3VwZXJDbGFzcz1udWxsO2lmKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpe3RoaXMubmV4dFRva2VuKCk7c3VwZXJDbGFzcz10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwpO30KdmFyIGNsYXNzQm9keT10aGlzLnBhcnNlQ2xhc3NCb2R5KCk7dGhpcy5jb250ZXh0LnN0cmljdD1wcmV2aW91c1N0cmljdDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkNsYXNzRGVjbGFyYXRpb24oaWQsc3VwZXJDbGFzcyxjbGFzc0JvZHkpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0V4cHJlc3Npb249ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgcHJldmlvdXNTdHJpY3Q9dGhpcy5jb250ZXh0LnN0cmljdDt0aGlzLmNvbnRleHQuc3RyaWN0PXRydWU7dGhpcy5leHBlY3RLZXl3b3JkKCdjbGFzcycpO3ZhciBpZD10aGlzLmxvb2thaGVhZC50eXBlPT09Mz90aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk6bnVsbDt2YXIgc3VwZXJDbGFzcz1udWxsO2lmKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpe3RoaXMubmV4dFRva2VuKCk7c3VwZXJDbGFzcz10aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwpO30KdmFyIGNsYXNzQm9keT10aGlzLnBhcnNlQ2xhc3NCb2R5KCk7dGhpcy5jb250ZXh0LnN0cmljdD1wcmV2aW91c1N0cmljdDtyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkNsYXNzRXhwcmVzc2lvbihpZCxzdXBlckNsYXNzLGNsYXNzQm9keSkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZT1mdW5jdGlvbigpe3RoaXMuY29udGV4dC5zdHJpY3Q9dHJ1ZTt0aGlzLmNvbnRleHQuaXNNb2R1bGU9dHJ1ZTt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgYm9keT10aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7d2hpbGUodGhpcy5sb29rYWhlYWQudHlwZSE9PTIpe2JvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLk1vZHVsZShib2R5KSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlU2NyaXB0PWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dmFyIGJvZHk9dGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO3doaWxlKHRoaXMubG9va2FoZWFkLnR5cGUhPT0yKXtib2R5LnB1c2godGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCkpO30KcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5TY3JpcHQoYm9keSkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZVNwZWNpZmllcj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO2lmKHRoaXMubG9va2FoZWFkLnR5cGUhPT04KXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTW9kdWxlU3BlY2lmaWVyKTt9CnZhciB0b2tlbj10aGlzLm5leHRUb2tlbigpO3ZhciByYXc9dGhpcy5nZXRUb2tlblJhdyh0b2tlbik7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLHJhdykpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydFNwZWNpZmllcj1mdW5jdGlvbigpe3ZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3ZhciBpbXBvcnRlZDt2YXIgbG9jYWw7aWYodGhpcy5sb29rYWhlYWQudHlwZT09PTMpe2ltcG9ydGVkPXRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtsb2NhbD1pbXBvcnRlZDtpZih0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpe3RoaXMubmV4dFRva2VuKCk7bG9jYWw9dGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO319ZWxzZQp7aW1wb3J0ZWQ9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7bG9jYWw9aW1wb3J0ZWQ7aWYodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKXt0aGlzLm5leHRUb2tlbigpO2xvY2FsPXRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTt9ZWxzZQp7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTt9fQpyZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkltcG9ydFNwZWNpZmllcihsb2NhbCxpbXBvcnRlZCkpO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZU5hbWVkSW1wb3J0cz1mdW5jdGlvbigpe3RoaXMuZXhwZWN0KCd7Jyk7dmFyIHNwZWNpZmllcnM9W107d2hpbGUoIXRoaXMubWF0Y2goJ30nKSl7c3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXIoKSk7aWYoIXRoaXMubWF0Y2goJ30nKSl7dGhpcy5leHBlY3QoJywnKTt9fQp0aGlzLmV4cGVjdCgnfScpO3JldHVybiBzcGVjaWZpZXJzO307UGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydERlZmF1bHRTcGVjaWZpZXI9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgbG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5JbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPWZ1bmN0aW9uKCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVOb2RlKCk7dGhpcy5leHBlY3QoJyonKTtpZighdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKXt0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5Ob0FzQWZ0ZXJJbXBvcnROYW1lc3BhY2UpO30KdGhpcy5uZXh0VG9rZW4oKTt2YXIgbG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7cmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSxuZXcgTm9kZS5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIobG9jYWwpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VJbXBvcnREZWNsYXJhdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSl7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uKTt9CnZhciBub2RlPXRoaXMuY3JlYXRlTm9kZSgpO3RoaXMuZXhwZWN0S2V5d29yZCgnaW1wb3J0Jyk7dmFyIHNyYzt2YXIgc3BlY2lmaWVycz1bXTtpZih0aGlzLmxvb2thaGVhZC50eXBlPT09OCl7c3JjPXRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTt9ZWxzZQp7aWYodGhpcy5tYXRjaCgneycpKXtzcGVjaWZpZXJzPXNwZWNpZmllcnMuY29uY2F0KHRoaXMucGFyc2VOYW1lZEltcG9ydHMoKSk7fWVsc2UKaWYodGhpcy5tYXRjaCgnKicpKXtzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpKTt9ZWxzZQppZih0aGlzLmlzSWRlbnRpZmllck5hbWUodGhpcy5sb29rYWhlYWQpJiYhdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKSl7c3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnREZWZhdWx0U3BlY2lmaWVyKCkpO2lmKHRoaXMubWF0Y2goJywnKSl7dGhpcy5uZXh0VG9rZW4oKTtpZih0aGlzLm1hdGNoKCcqJykpe3NwZWNpZmllcnMucHVzaCh0aGlzLnBhcnNlSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKCkpO31lbHNlCmlmKHRoaXMubWF0Y2goJ3snKSl7c3BlY2lmaWVycz1zcGVjaWZpZXJzLmNvbmNhdCh0aGlzLnBhcnNlTmFtZWRJbXBvcnRzKCkpO31lbHNlCnt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTt9fX1lbHNlCnt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO30KaWYoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKXt2YXIgbWVzc2FnZT10aGlzLmxvb2thaGVhZC52YWx1ZT9tZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjptZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO3RoaXMudGhyb3dFcnJvcihtZXNzYWdlLHRoaXMubG9va2FoZWFkLnZhbHVlKTt9CnRoaXMubmV4dFRva2VuKCk7c3JjPXRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTt9CnRoaXMuY29uc3VtZVNlbWljb2xvbigpO3JldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuSW1wb3J0RGVjbGFyYXRpb24oc3BlY2lmaWVycyxzcmMpKTt9O1BhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvcnRTcGVjaWZpZXI9ZnVuY3Rpb24oKXt2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt2YXIgbG9jYWw9dGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7dmFyIGV4cG9ydGVkPWxvY2FsO2lmKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXMnKSl7dGhpcy5uZXh0VG9rZW4oKTtleHBvcnRlZD10aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTt9CnJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRXhwb3J0U3BlY2lmaWVyKGxvY2FsLGV4cG9ydGVkKSk7fTtQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwb3J0RGVjbGFyYXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpe3RoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxFeHBvcnREZWNsYXJhdGlvbik7fQp2YXIgbm9kZT10aGlzLmNyZWF0ZU5vZGUoKTt0aGlzLmV4cGVjdEtleXdvcmQoJ2V4cG9ydCcpO3ZhciBleHBvcnREZWNsYXJhdGlvbjtpZih0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKXt0aGlzLm5leHRUb2tlbigpO2lmKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKXt2YXIgZGVjbGFyYXRpb249dGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO31lbHNlCmlmKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKXt2YXIgZGVjbGFyYXRpb249dGhpcy5wYXJzZUNsYXNzRGVjbGFyYXRpb24odHJ1ZSk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO31lbHNlCmlmKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKSl7dmFyIGRlY2xhcmF0aW9uPXRoaXMubWF0Y2hBc3luY0Z1bmN0aW9uKCk/dGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSk6dGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO31lbHNlCntpZih0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2Zyb20nKSl7dGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuLHRoaXMubG9va2FoZWFkLnZhbHVlKTt9CnZhciBkZWNsYXJhdGlvbj10aGlzLm1hdGNoKCd7Jyk/dGhpcy5wYXJzZU9iamVjdEluaXRpYWxpemVyKCk6dGhpcy5tYXRjaCgnWycpP3RoaXMucGFyc2VBcnJheUluaXRpYWxpemVyKCk6dGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7dGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO319ZWxzZQppZih0aGlzLm1hdGNoKCcqJykpe3RoaXMubmV4dFRva2VuKCk7aWYoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKXt2YXIgbWVzc2FnZT10aGlzLmxvb2thaGVhZC52YWx1ZT9tZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjptZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO3RoaXMudGhyb3dFcnJvcihtZXNzYWdlLHRoaXMubG9va2FoZWFkLnZhbHVlKTt9CnRoaXMubmV4dFRva2VuKCk7dmFyIHNyYz10aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7dGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydEFsbERlY2xhcmF0aW9uKHNyYykpO31lbHNlCmlmKHRoaXMubG9va2FoZWFkLnR5cGU9PT00KXt2YXIgZGVjbGFyYXRpb249dm9pZCAwO3N3aXRjaCh0aGlzLmxvb2thaGVhZC52YWx1ZSl7Y2FzZSdsZXQnOmNhc2UnY29uc3QnOmRlY2xhcmF0aW9uPXRoaXMucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24oe2luRm9yOmZhbHNlfSk7YnJlYWs7Y2FzZSd2YXInOmNhc2UnY2xhc3MnOmNhc2UnZnVuY3Rpb24nOmRlY2xhcmF0aW9uPXRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpO2JyZWFrO2RlZmF1bHQ6dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7fQpleHBvcnREZWNsYXJhdGlvbj10aGlzLmZpbmFsaXplKG5vZGUsbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbixbXSxudWxsKSk7fWVsc2UKaWYodGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSl7dmFyIGRlY2xhcmF0aW9uPXRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7ZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sW10sbnVsbCkpO31lbHNlCnt2YXIgc3BlY2lmaWVycz1bXTt2YXIgc291cmNlPW51bGw7dmFyIGlzRXhwb3J0RnJvbUlkZW50aWZpZXI9ZmFsc2U7dGhpcy5leHBlY3QoJ3snKTt3aGlsZSghdGhpcy5tYXRjaCgnfScpKXtpc0V4cG9ydEZyb21JZGVudGlmaWVyPWlzRXhwb3J0RnJvbUlkZW50aWZpZXJ8fHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0Jyk7c3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VFeHBvcnRTcGVjaWZpZXIoKSk7aWYoIXRoaXMubWF0Y2goJ30nKSl7dGhpcy5leHBlY3QoJywnKTt9fQp0aGlzLmV4cGVjdCgnfScpO2lmKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKXt0aGlzLm5leHRUb2tlbigpO3NvdXJjZT10aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7dGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7fWVsc2UKaWYoaXNFeHBvcnRGcm9tSWRlbnRpZmllcil7dmFyIG1lc3NhZ2U9dGhpcy5sb29rYWhlYWQudmFsdWU/bWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW46bWVzc2FnZXNfMS5NZXNzYWdlcy5NaXNzaW5nRnJvbUNsYXVzZTt0aGlzLnRocm93RXJyb3IobWVzc2FnZSx0aGlzLmxvb2thaGVhZC52YWx1ZSk7fWVsc2UKe3RoaXMuY29uc3VtZVNlbWljb2xvbigpO30KZXhwb3J0RGVjbGFyYXRpb249dGhpcy5maW5hbGl6ZShub2RlLG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24obnVsbCxzcGVjaWZpZXJzLHNvdXJjZSkpO30KcmV0dXJuIGV4cG9ydERlY2xhcmF0aW9uO307cmV0dXJuIFBhcnNlcjt9KCk7ZXhwb3J0cy5QYXJzZXI9UGFyc2VyO30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLG1lc3NhZ2Upe2lmKCFjb25kaXRpb24pe3Rocm93IG5ldyBFcnJvcignQVNTRVJUOiAnK21lc3NhZ2UpO319CmV4cG9ydHMuYXNzZXJ0PWFzc2VydDt9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIEVycm9ySGFuZGxlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEVycm9ySGFuZGxlcigpe3RoaXMuZXJyb3JzPVtdO3RoaXMudG9sZXJhbnQ9ZmFsc2U7fQpFcnJvckhhbmRsZXIucHJvdG90eXBlLnJlY29yZEVycm9yPWZ1bmN0aW9uKGVycm9yKXt0aGlzLmVycm9ycy5wdXNoKGVycm9yKTt9O0Vycm9ySGFuZGxlci5wcm90b3R5cGUudG9sZXJhdGU9ZnVuY3Rpb24oZXJyb3Ipe2lmKHRoaXMudG9sZXJhbnQpe3RoaXMucmVjb3JkRXJyb3IoZXJyb3IpO31lbHNlCnt0aHJvdyBlcnJvcjt9fTtFcnJvckhhbmRsZXIucHJvdG90eXBlLmNvbnN0cnVjdEVycm9yPWZ1bmN0aW9uKG1zZyxjb2x1bW4pe3ZhciBlcnJvcj1uZXcgRXJyb3IobXNnKTt0cnl7dGhyb3cgZXJyb3I7fQpjYXRjaChiYXNlKXtpZihPYmplY3QuY3JlYXRlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkpe2Vycm9yPU9iamVjdC5jcmVhdGUoYmFzZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCdjb2x1bW4nLHt2YWx1ZTpjb2x1bW59KTt9fQpyZXR1cm4gZXJyb3I7fTtFcnJvckhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUVycm9yPWZ1bmN0aW9uKGluZGV4LGxpbmUsY29sLGRlc2NyaXB0aW9uKXt2YXIgbXNnPSdMaW5lICcrbGluZSsnOiAnK2Rlc2NyaXB0aW9uO3ZhciBlcnJvcj10aGlzLmNvbnN0cnVjdEVycm9yKG1zZyxjb2wpO2Vycm9yLmluZGV4PWluZGV4O2Vycm9yLmxpbmVOdW1iZXI9bGluZTtlcnJvci5kZXNjcmlwdGlvbj1kZXNjcmlwdGlvbjtyZXR1cm4gZXJyb3I7fTtFcnJvckhhbmRsZXIucHJvdG90eXBlLnRocm93RXJyb3I9ZnVuY3Rpb24oaW5kZXgsbGluZSxjb2wsZGVzY3JpcHRpb24pe3Rocm93IHRoaXMuY3JlYXRlRXJyb3IoaW5kZXgsbGluZSxjb2wsZGVzY3JpcHRpb24pO307RXJyb3JIYW5kbGVyLnByb3RvdHlwZS50b2xlcmF0ZUVycm9yPWZ1bmN0aW9uKGluZGV4LGxpbmUsY29sLGRlc2NyaXB0aW9uKXt2YXIgZXJyb3I9dGhpcy5jcmVhdGVFcnJvcihpbmRleCxsaW5lLGNvbCxkZXNjcmlwdGlvbik7aWYodGhpcy50b2xlcmFudCl7dGhpcy5yZWNvcmRFcnJvcihlcnJvcik7fWVsc2UKe3Rocm93IGVycm9yO319O3JldHVybiBFcnJvckhhbmRsZXI7fSgpO2V4cG9ydHMuRXJyb3JIYW5kbGVyPUVycm9ySGFuZGxlcjt9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5NZXNzYWdlcz17QmFkR2V0dGVyQXJpdHk6J0dldHRlciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVycycsQmFkU2V0dGVyQXJpdHk6J1NldHRlciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZm9ybWFsIHBhcmFtZXRlcicsQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjonU2V0dGVyIGZ1bmN0aW9uIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgcmVzdCBwYXJhbWV0ZXInLENvbnN0cnVjdG9ySXNBc3luYzonQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhc3luYyBtZXRob2QnLENvbnN0cnVjdG9yU3BlY2lhbE1ldGhvZDonQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhY2Nlc3NvcicsRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXI6J01pc3NpbmcgaW5pdGlhbGl6ZXIgaW4gJTAgZGVjbGFyYXRpb24nLERlZmF1bHRSZXN0UGFyYW1ldGVyOidVbmV4cGVjdGVkIHRva2VuID0nLER1cGxpY2F0ZUJpbmRpbmc6J0R1cGxpY2F0ZSBiaW5kaW5nICUwJyxEdXBsaWNhdGVDb25zdHJ1Y3RvcjonQSBjbGFzcyBtYXkgb25seSBoYXZlIG9uZSBjb25zdHJ1Y3RvcicsRHVwbGljYXRlUHJvdG9Qcm9wZXJ0eTonRHVwbGljYXRlIF9fcHJvdG9fXyBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluIG9iamVjdCBsaXRlcmFscycsRm9ySW5PZkxvb3BJbml0aWFsaXplcjonJTAgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXInLEdlbmVyYXRvckluTGVnYWN5Q29udGV4dDonR2VuZXJhdG9yIGRlY2xhcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gbGVnYWN5IGNvbnRleHRzJyxJbGxlZ2FsQnJlYWs6J0lsbGVnYWwgYnJlYWsgc3RhdGVtZW50JyxJbGxlZ2FsQ29udGludWU6J0lsbGVnYWwgY29udGludWUgc3RhdGVtZW50JyxJbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb246J1VuZXhwZWN0ZWQgdG9rZW4nLElsbGVnYWxJbXBvcnREZWNsYXJhdGlvbjonVW5leHBlY3RlZCB0b2tlbicsSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZTonSWxsZWdhbCBcJ3VzZSBzdHJpY3RcJyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0JyxJbGxlZ2FsUmV0dXJuOidJbGxlZ2FsIHJldHVybiBzdGF0ZW1lbnQnLEludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkOidLZXl3b3JkIG11c3Qgbm90IGNvbnRhaW4gZXNjYXBlZCBjaGFyYWN0ZXJzJyxJbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2U6J0ludmFsaWQgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlJyxJbnZhbGlkTEhTSW5Bc3NpZ25tZW50OidJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGFzc2lnbm1lbnQnLEludmFsaWRMSFNJbkZvckluOidJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGZvci1pbicsSW52YWxpZExIU0luRm9yTG9vcDonSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItbG9vcCcsSW52YWxpZE1vZHVsZVNwZWNpZmllcjonVW5leHBlY3RlZCB0b2tlbicsSW52YWxpZFJlZ0V4cDonSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nLExldEluTGV4aWNhbEJpbmRpbmc6J2xldCBpcyBkaXNhbGxvd2VkIGFzIGEgbGV4aWNhbGx5IGJvdW5kIG5hbWUnLE1pc3NpbmdGcm9tQ2xhdXNlOidVbmV4cGVjdGVkIHRva2VuJyxNdWx0aXBsZURlZmF1bHRzSW5Td2l0Y2g6J01vcmUgdGhhbiBvbmUgZGVmYXVsdCBjbGF1c2UgaW4gc3dpdGNoIHN0YXRlbWVudCcsTmV3bGluZUFmdGVyVGhyb3c6J0lsbGVnYWwgbmV3bGluZSBhZnRlciB0aHJvdycsTm9Bc0FmdGVySW1wb3J0TmFtZXNwYWNlOidVbmV4cGVjdGVkIHRva2VuJyxOb0NhdGNoT3JGaW5hbGx5OidNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgYWZ0ZXIgdHJ5JyxQYXJhbWV0ZXJBZnRlclJlc3RQYXJhbWV0ZXI6J1Jlc3QgcGFyYW1ldGVyIG11c3QgYmUgbGFzdCBmb3JtYWwgcGFyYW1ldGVyJyxSZWRlY2xhcmF0aW9uOiclMCBcJyUxXCcgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCcsU3RhdGljUHJvdG90eXBlOidDbGFzc2VzIG1heSBub3QgaGF2ZSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlJyxTdHJpY3RDYXRjaFZhcmlhYmxlOidDYXRjaCB2YXJpYWJsZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxTdHJpY3REZWxldGU6J0RlbGV0ZSBvZiBhbiB1bnF1YWxpZmllZCBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlLicsU3RyaWN0RnVuY3Rpb246J0luIHN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwgb3IgaW5zaWRlIGEgYmxvY2snLFN0cmljdEZ1bmN0aW9uTmFtZTonRnVuY3Rpb24gbmFtZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxTdHJpY3RMSFNBc3NpZ25tZW50OidBc3NpZ25tZW50IHRvIGV2YWwgb3IgYXJndW1lbnRzIGlzIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlJyxTdHJpY3RMSFNQb3N0Zml4OidQb3N0Zml4IGluY3JlbWVudC9kZWNyZW1lbnQgbWF5IG5vdCBoYXZlIGV2YWwgb3IgYXJndW1lbnRzIG9wZXJhbmQgaW4gc3RyaWN0IG1vZGUnLFN0cmljdExIU1ByZWZpeDonUHJlZml4IGluY3JlbWVudC9kZWNyZW1lbnQgbWF5IG5vdCBoYXZlIGV2YWwgb3IgYXJndW1lbnRzIG9wZXJhbmQgaW4gc3RyaWN0IG1vZGUnLFN0cmljdE1vZGVXaXRoOidTdHJpY3QgbW9kZSBjb2RlIG1heSBub3QgaW5jbHVkZSBhIHdpdGggc3RhdGVtZW50JyxTdHJpY3RPY3RhbExpdGVyYWw6J09jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZS4nLFN0cmljdFBhcmFtRHVwZTonU3RyaWN0IG1vZGUgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMnLFN0cmljdFBhcmFtTmFtZTonUGFyYW1ldGVyIG5hbWUgZXZhbCBvciBhcmd1bWVudHMgaXMgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUnLFN0cmljdFJlc2VydmVkV29yZDonVXNlIG9mIGZ1dHVyZSByZXNlcnZlZCB3b3JkIGluIHN0cmljdCBtb2RlJyxTdHJpY3RWYXJOYW1lOidWYXJpYWJsZSBuYW1lIG1heSBub3QgYmUgZXZhbCBvciBhcmd1bWVudHMgaW4gc3RyaWN0IG1vZGUnLFRlbXBsYXRlT2N0YWxMaXRlcmFsOidPY3RhbCBsaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gdGVtcGxhdGUgc3RyaW5ncy4nLFVuZXhwZWN0ZWRFT1M6J1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0JyxVbmV4cGVjdGVkSWRlbnRpZmllcjonVW5leHBlY3RlZCBpZGVudGlmaWVyJyxVbmV4cGVjdGVkTnVtYmVyOidVbmV4cGVjdGVkIG51bWJlcicsVW5leHBlY3RlZFJlc2VydmVkOidVbmV4cGVjdGVkIHJlc2VydmVkIHdvcmQnLFVuZXhwZWN0ZWRTdHJpbmc6J1VuZXhwZWN0ZWQgc3RyaW5nJyxVbmV4cGVjdGVkVGVtcGxhdGU6J1VuZXhwZWN0ZWQgcXVhc2kgJTAnLFVuZXhwZWN0ZWRUb2tlbjonVW5leHBlY3RlZCB0b2tlbiAlMCcsVW5leHBlY3RlZFRva2VuSWxsZWdhbDonVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMJyxVbmtub3duTGFiZWw6J1VuZGVmaW5lZCBsYWJlbCBcJyUwXCcnLFVudGVybWluYXRlZFJlZ0V4cDonSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IG1pc3NpbmcgLyd9O30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBhc3NlcnRfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDkpO3ZhciBjaGFyYWN0ZXJfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDQpO3ZhciBtZXNzYWdlc18xPV9fd2VicGFja19yZXF1aXJlX18oMTEpO2Z1bmN0aW9uIGhleFZhbHVlKGNoKXtyZXR1cm4nMDEyMzQ1Njc4OWFiY2RlZicuaW5kZXhPZihjaC50b0xvd2VyQ2FzZSgpKTt9CmZ1bmN0aW9uIG9jdGFsVmFsdWUoY2gpe3JldHVybicwMTIzNDU2NycuaW5kZXhPZihjaCk7fQp2YXIgU2Nhbm5lcj1mdW5jdGlvbigpe2Z1bmN0aW9uIFNjYW5uZXIoY29kZSxoYW5kbGVyKXt0aGlzLnNvdXJjZT1jb2RlO3RoaXMuZXJyb3JIYW5kbGVyPWhhbmRsZXI7dGhpcy50cmFja0NvbW1lbnQ9ZmFsc2U7dGhpcy5sZW5ndGg9Y29kZS5sZW5ndGg7dGhpcy5pbmRleD0wO3RoaXMubGluZU51bWJlcj1jb2RlLmxlbmd0aD4wPzE6MDt0aGlzLmxpbmVTdGFydD0wO3RoaXMuY3VybHlTdGFjaz1bXTt9ClNjYW5uZXIucHJvdG90eXBlLnNhdmVTdGF0ZT1mdW5jdGlvbigpe3JldHVybntpbmRleDp0aGlzLmluZGV4LGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLmxpbmVTdGFydH07fTtTY2FubmVyLnByb3RvdHlwZS5yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oc3RhdGUpe3RoaXMuaW5kZXg9c3RhdGUuaW5kZXg7dGhpcy5saW5lTnVtYmVyPXN0YXRlLmxpbmVOdW1iZXI7dGhpcy5saW5lU3RhcnQ9c3RhdGUubGluZVN0YXJ0O307U2Nhbm5lci5wcm90b3R5cGUuZW9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXg+PXRoaXMubGVuZ3RoO307U2Nhbm5lci5wcm90b3R5cGUudGhyb3dVbmV4cGVjdGVkVG9rZW49ZnVuY3Rpb24obWVzc2FnZSl7aWYobWVzc2FnZT09PXZvaWQgMCl7bWVzc2FnZT1tZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbklsbGVnYWw7fQpyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIudGhyb3dFcnJvcih0aGlzLmluZGV4LHRoaXMubGluZU51bWJlcix0aGlzLmluZGV4LXRoaXMubGluZVN0YXJ0KzEsbWVzc2FnZSk7fTtTY2FubmVyLnByb3RvdHlwZS50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbj1mdW5jdGlvbihtZXNzYWdlKXtpZihtZXNzYWdlPT09dm9pZCAwKXttZXNzYWdlPW1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuSWxsZWdhbDt9CnRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYXRlRXJyb3IodGhpcy5pbmRleCx0aGlzLmxpbmVOdW1iZXIsdGhpcy5pbmRleC10aGlzLmxpbmVTdGFydCsxLG1lc3NhZ2UpO307U2Nhbm5lci5wcm90b3R5cGUuc2tpcFNpbmdsZUxpbmVDb21tZW50PWZ1bmN0aW9uKG9mZnNldCl7dmFyIGNvbW1lbnRzPVtdO3ZhciBzdGFydCxsb2M7aWYodGhpcy50cmFja0NvbW1lbnQpe2NvbW1lbnRzPVtdO3N0YXJ0PXRoaXMuaW5kZXgtb2Zmc2V0O2xvYz17c3RhcnQ6e2xpbmU6dGhpcy5saW5lTnVtYmVyLGNvbHVtbjp0aGlzLmluZGV4LXRoaXMubGluZVN0YXJ0LW9mZnNldH0sZW5kOnt9fTt9CndoaWxlKCF0aGlzLmVvZigpKXt2YXIgY2g9dGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTsrK3RoaXMuaW5kZXg7aWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKXtpZih0aGlzLnRyYWNrQ29tbWVudCl7bG9jLmVuZD17bGluZTp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuaW5kZXgtdGhpcy5saW5lU3RhcnQtMX07dmFyIGVudHJ5PXttdWx0aUxpbmU6ZmFsc2Usc2xpY2U6W3N0YXJ0K29mZnNldCx0aGlzLmluZGV4LTFdLHJhbmdlOltzdGFydCx0aGlzLmluZGV4LTFdLGxvYzpsb2N9O2NvbW1lbnRzLnB1c2goZW50cnkpO30KaWYoY2g9PT0xMyYmdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KT09PTEwKXsrK3RoaXMuaW5kZXg7fQorK3RoaXMubGluZU51bWJlcjt0aGlzLmxpbmVTdGFydD10aGlzLmluZGV4O3JldHVybiBjb21tZW50czt9fQppZih0aGlzLnRyYWNrQ29tbWVudCl7bG9jLmVuZD17bGluZTp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuaW5kZXgtdGhpcy5saW5lU3RhcnR9O3ZhciBlbnRyeT17bXVsdGlMaW5lOmZhbHNlLHNsaWNlOltzdGFydCtvZmZzZXQsdGhpcy5pbmRleF0scmFuZ2U6W3N0YXJ0LHRoaXMuaW5kZXhdLGxvYzpsb2N9O2NvbW1lbnRzLnB1c2goZW50cnkpO30KcmV0dXJuIGNvbW1lbnRzO307U2Nhbm5lci5wcm90b3R5cGUuc2tpcE11bHRpTGluZUNvbW1lbnQ9ZnVuY3Rpb24oKXt2YXIgY29tbWVudHM9W107dmFyIHN0YXJ0LGxvYztpZih0aGlzLnRyYWNrQ29tbWVudCl7Y29tbWVudHM9W107c3RhcnQ9dGhpcy5pbmRleC0yO2xvYz17c3RhcnQ6e2xpbmU6dGhpcy5saW5lTnVtYmVyLGNvbHVtbjp0aGlzLmluZGV4LXRoaXMubGluZVN0YXJ0LTJ9LGVuZDp7fX07fQp3aGlsZSghdGhpcy5lb2YoKSl7dmFyIGNoPXRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7aWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKXtpZihjaD09PTB4MEQmJnRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKT09PTB4MEEpeysrdGhpcy5pbmRleDt9CisrdGhpcy5saW5lTnVtYmVyOysrdGhpcy5pbmRleDt0aGlzLmxpbmVTdGFydD10aGlzLmluZGV4O31lbHNlCmlmKGNoPT09MHgyQSl7aWYodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KzEpPT09MHgyRil7dGhpcy5pbmRleCs9MjtpZih0aGlzLnRyYWNrQ29tbWVudCl7bG9jLmVuZD17bGluZTp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuaW5kZXgtdGhpcy5saW5lU3RhcnR9O3ZhciBlbnRyeT17bXVsdGlMaW5lOnRydWUsc2xpY2U6W3N0YXJ0KzIsdGhpcy5pbmRleC0yXSxyYW5nZTpbc3RhcnQsdGhpcy5pbmRleF0sbG9jOmxvY307Y29tbWVudHMucHVzaChlbnRyeSk7fQpyZXR1cm4gY29tbWVudHM7fQorK3RoaXMuaW5kZXg7fWVsc2UKeysrdGhpcy5pbmRleDt9fQppZih0aGlzLnRyYWNrQ29tbWVudCl7bG9jLmVuZD17bGluZTp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuaW5kZXgtdGhpcy5saW5lU3RhcnR9O3ZhciBlbnRyeT17bXVsdGlMaW5lOnRydWUsc2xpY2U6W3N0YXJ0KzIsdGhpcy5pbmRleF0scmFuZ2U6W3N0YXJ0LHRoaXMuaW5kZXhdLGxvYzpsb2N9O2NvbW1lbnRzLnB1c2goZW50cnkpO30KdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO3JldHVybiBjb21tZW50czt9O1NjYW5uZXIucHJvdG90eXBlLnNjYW5Db21tZW50cz1mdW5jdGlvbigpe3ZhciBjb21tZW50cztpZih0aGlzLnRyYWNrQ29tbWVudCl7Y29tbWVudHM9W107fQp2YXIgc3RhcnQ9dGhpcy5pbmRleD09PTA7d2hpbGUoIXRoaXMuZW9mKCkpe3ZhciBjaD10aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO2lmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc1doaXRlU3BhY2UoY2gpKXsrK3RoaXMuaW5kZXg7fWVsc2UKaWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKXsrK3RoaXMuaW5kZXg7aWYoY2g9PT0weDBEJiZ0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpPT09MHgwQSl7Kyt0aGlzLmluZGV4O30KKyt0aGlzLmxpbmVOdW1iZXI7dGhpcy5saW5lU3RhcnQ9dGhpcy5pbmRleDtzdGFydD10cnVlO31lbHNlCmlmKGNoPT09MHgyRil7Y2g9dGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KzEpO2lmKGNoPT09MHgyRil7dGhpcy5pbmRleCs9Mjt2YXIgY29tbWVudD10aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCgyKTtpZih0aGlzLnRyYWNrQ29tbWVudCl7Y29tbWVudHM9Y29tbWVudHMuY29uY2F0KGNvbW1lbnQpO30Kc3RhcnQ9dHJ1ZTt9ZWxzZQppZihjaD09PTB4MkEpe3RoaXMuaW5kZXgrPTI7dmFyIGNvbW1lbnQ9dGhpcy5za2lwTXVsdGlMaW5lQ29tbWVudCgpO2lmKHRoaXMudHJhY2tDb21tZW50KXtjb21tZW50cz1jb21tZW50cy5jb25jYXQoY29tbWVudCk7fX1lbHNlCnticmVhazt9fWVsc2UKaWYoc3RhcnQmJmNoPT09MHgyRCl7aWYodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KzEpPT09MHgyRCYmdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KzIpPT09MHgzRSl7dGhpcy5pbmRleCs9Mzt2YXIgY29tbWVudD10aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCgzKTtpZih0aGlzLnRyYWNrQ29tbWVudCl7Y29tbWVudHM9Y29tbWVudHMuY29uY2F0KGNvbW1lbnQpO319ZWxzZQp7YnJlYWs7fX1lbHNlCmlmKGNoPT09MHgzQyl7aWYodGhpcy5zb3VyY2Uuc2xpY2UodGhpcy5pbmRleCsxLHRoaXMuaW5kZXgrNCk9PT0nIS0tJyl7dGhpcy5pbmRleCs9NDt2YXIgY29tbWVudD10aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCg0KTtpZih0aGlzLnRyYWNrQ29tbWVudCl7Y29tbWVudHM9Y29tbWVudHMuY29uY2F0KGNvbW1lbnQpO319ZWxzZQp7YnJlYWs7fX1lbHNlCnticmVhazt9fQpyZXR1cm4gY29tbWVudHM7fTtTY2FubmVyLnByb3RvdHlwZS5pc0Z1dHVyZVJlc2VydmVkV29yZD1mdW5jdGlvbihpZCl7c3dpdGNoKGlkKXtjYXNlJ2VudW0nOmNhc2UnZXhwb3J0JzpjYXNlJ2ltcG9ydCc6Y2FzZSdzdXBlcic6cmV0dXJuIHRydWU7ZGVmYXVsdDpyZXR1cm4gZmFsc2U7fX07U2Nhbm5lci5wcm90b3R5cGUuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkPWZ1bmN0aW9uKGlkKXtzd2l0Y2goaWQpe2Nhc2UnaW1wbGVtZW50cyc6Y2FzZSdpbnRlcmZhY2UnOmNhc2UncGFja2FnZSc6Y2FzZSdwcml2YXRlJzpjYXNlJ3Byb3RlY3RlZCc6Y2FzZSdwdWJsaWMnOmNhc2Unc3RhdGljJzpjYXNlJ3lpZWxkJzpjYXNlJ2xldCc6cmV0dXJuIHRydWU7ZGVmYXVsdDpyZXR1cm4gZmFsc2U7fX07U2Nhbm5lci5wcm90b3R5cGUuaXNSZXN0cmljdGVkV29yZD1mdW5jdGlvbihpZCl7cmV0dXJuIGlkPT09J2V2YWwnfHxpZD09PSdhcmd1bWVudHMnO307U2Nhbm5lci5wcm90b3R5cGUuaXNLZXl3b3JkPWZ1bmN0aW9uKGlkKXtzd2l0Y2goaWQubGVuZ3RoKXtjYXNlIDI6cmV0dXJuIGlkPT09J2lmJ3x8aWQ9PT0naW4nfHxpZD09PSdkbyc7Y2FzZSAzOnJldHVybiBpZD09PSd2YXInfHxpZD09PSdmb3InfHxpZD09PSduZXcnfHxpZD09PSd0cnknfHxpZD09PSdsZXQnO2Nhc2UgNDpyZXR1cm4gaWQ9PT0ndGhpcyd8fGlkPT09J2Vsc2UnfHxpZD09PSdjYXNlJ3x8aWQ9PT0ndm9pZCd8fGlkPT09J3dpdGgnfHxpZD09PSdlbnVtJztjYXNlIDU6cmV0dXJuIGlkPT09J3doaWxlJ3x8aWQ9PT0nYnJlYWsnfHxpZD09PSdjYXRjaCd8fGlkPT09J3Rocm93J3x8aWQ9PT0nY29uc3QnfHxpZD09PSd5aWVsZCd8fGlkPT09J2NsYXNzJ3x8aWQ9PT0nc3VwZXInO2Nhc2UgNjpyZXR1cm4gaWQ9PT0ncmV0dXJuJ3x8aWQ9PT0ndHlwZW9mJ3x8aWQ9PT0nZGVsZXRlJ3x8aWQ9PT0nc3dpdGNoJ3x8aWQ9PT0nZXhwb3J0J3x8aWQ9PT0naW1wb3J0JztjYXNlIDc6cmV0dXJuIGlkPT09J2RlZmF1bHQnfHxpZD09PSdmaW5hbGx5J3x8aWQ9PT0nZXh0ZW5kcyc7Y2FzZSA4OnJldHVybiBpZD09PSdmdW5jdGlvbid8fGlkPT09J2NvbnRpbnVlJ3x8aWQ9PT0nZGVidWdnZXInO2Nhc2UgMTA6cmV0dXJuIGlkPT09J2luc3RhbmNlb2YnO2RlZmF1bHQ6cmV0dXJuIGZhbHNlO319O1NjYW5uZXIucHJvdG90eXBlLmNvZGVQb2ludEF0PWZ1bmN0aW9uKGkpe3ZhciBjcD10aGlzLnNvdXJjZS5jaGFyQ29kZUF0KGkpO2lmKGNwPj0weEQ4MDAmJmNwPD0weERCRkYpe3ZhciBzZWNvbmQ9dGhpcy5zb3VyY2UuY2hhckNvZGVBdChpKzEpO2lmKHNlY29uZD49MHhEQzAwJiZzZWNvbmQ8PTB4REZGRil7dmFyIGZpcnN0PWNwO2NwPShmaXJzdC0weEQ4MDApKjB4NDAwK3NlY29uZC0weERDMDArMHgxMDAwMDt9fQpyZXR1cm4gY3A7fTtTY2FubmVyLnByb3RvdHlwZS5zY2FuSGV4RXNjYXBlPWZ1bmN0aW9uKHByZWZpeCl7dmFyIGxlbj1wcmVmaXg9PT0ndSc/NDoyO3ZhciBjb2RlPTA7Zm9yKHZhciBpPTA7aTxsZW47KytpKXtpZighdGhpcy5lb2YoKSYmY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpe2NvZGU9Y29kZSoxNitoZXhWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTt9ZWxzZQp7cmV0dXJuIG51bGw7fX0KcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7fTtTY2FubmVyLnByb3RvdHlwZS5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZT1mdW5jdGlvbigpe3ZhciBjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4XTt2YXIgY29kZT0wO2lmKGNoPT09J30nKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQp3aGlsZSghdGhpcy5lb2YoKSl7Y2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtpZighY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQoY2guY2hhckNvZGVBdCgwKSkpe2JyZWFrO30KY29kZT1jb2RlKjE2K2hleFZhbHVlKGNoKTt9CmlmKGNvZGU+MHgxMEZGRkZ8fGNoIT09J30nKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm4gY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY29kZSk7fTtTY2FubmVyLnByb3RvdHlwZS5nZXRJZGVudGlmaWVyPWZ1bmN0aW9uKCl7dmFyIHN0YXJ0PXRoaXMuaW5kZXgrKzt3aGlsZSghdGhpcy5lb2YoKSl7dmFyIGNoPXRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7aWYoY2g9PT0weDVDKXt0aGlzLmluZGV4PXN0YXJ0O3JldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7fWVsc2UKaWYoY2g+PTB4RDgwMCYmY2g8MHhERkZGKXt0aGlzLmluZGV4PXN0YXJ0O3JldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7fQppZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkpeysrdGhpcy5pbmRleDt9ZWxzZQp7YnJlYWs7fX0KcmV0dXJuIHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LHRoaXMuaW5kZXgpO307U2Nhbm5lci5wcm90b3R5cGUuZ2V0Q29tcGxleElkZW50aWZpZXI9ZnVuY3Rpb24oKXt2YXIgY3A9dGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KTt2YXIgaWQ9Y2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApO3RoaXMuaW5kZXgrPWlkLmxlbmd0aDt2YXIgY2g7aWYoY3A9PT0weDVDKXtpZih0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpIT09MHg3NSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO30KKyt0aGlzLmluZGV4O2lmKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdPT09J3snKXsrK3RoaXMuaW5kZXg7Y2g9dGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO31lbHNlCntjaD10aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtpZihjaD09PW51bGx8fGNoPT09J1xcJ3x8IWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydChjaC5jaGFyQ29kZUF0KDApKSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO319CmlkPWNoO30Kd2hpbGUoIXRoaXMuZW9mKCkpe2NwPXRoaXMuY29kZVBvaW50QXQodGhpcy5pbmRleCk7aWYoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNwKSl7YnJlYWs7fQpjaD1jaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCk7aWQrPWNoO3RoaXMuaW5kZXgrPWNoLmxlbmd0aDtpZihjcD09PTB4NUMpe2lkPWlkLnN1YnN0cigwLGlkLmxlbmd0aC0xKTtpZih0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpIT09MHg3NSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO30KKyt0aGlzLmluZGV4O2lmKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdPT09J3snKXsrK3RoaXMuaW5kZXg7Y2g9dGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO31lbHNlCntjaD10aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtpZihjaD09PW51bGx8fGNoPT09J1xcJ3x8IWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNoLmNoYXJDb2RlQXQoMCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fX0KaWQrPWNoO319CnJldHVybiBpZDt9O1NjYW5uZXIucHJvdG90eXBlLm9jdGFsVG9EZWNpbWFsPWZ1bmN0aW9uKGNoKXt2YXIgb2N0YWw9Y2ghPT0nMCc7dmFyIGNvZGU9b2N0YWxWYWx1ZShjaCk7aWYoIXRoaXMuZW9mKCkmJmNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpe29jdGFsPXRydWU7Y29kZT1jb2RlKjgrb2N0YWxWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTtpZignMDEyMycuaW5kZXhPZihjaCk+PTAmJiF0aGlzLmVvZigpJiZjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXtjb2RlPWNvZGUqOCtvY3RhbFZhbHVlKHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK10pO319CnJldHVybntjb2RlOmNvZGUsb2N0YWw6b2N0YWx9O307U2Nhbm5lci5wcm90b3R5cGUuc2NhbklkZW50aWZpZXI9ZnVuY3Rpb24oKXt2YXIgdHlwZTt2YXIgc3RhcnQ9dGhpcy5pbmRleDt2YXIgaWQ9dGhpcy5zb3VyY2UuY2hhckNvZGVBdChzdGFydCk9PT0weDVDP3RoaXMuZ2V0Q29tcGxleElkZW50aWZpZXIoKTp0aGlzLmdldElkZW50aWZpZXIoKTtpZihpZC5sZW5ndGg9PT0xKXt0eXBlPTM7fWVsc2UKaWYodGhpcy5pc0tleXdvcmQoaWQpKXt0eXBlPTQ7fWVsc2UKaWYoaWQ9PT0nbnVsbCcpe3R5cGU9NTt9ZWxzZQppZihpZD09PSd0cnVlJ3x8aWQ9PT0nZmFsc2UnKXt0eXBlPTE7fWVsc2UKe3R5cGU9Mzt9CmlmKHR5cGUhPT0zJiZzdGFydCtpZC5sZW5ndGghPT10aGlzLmluZGV4KXt2YXIgcmVzdG9yZT10aGlzLmluZGV4O3RoaXMuaW5kZXg9c3RhcnQ7dGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkKTt0aGlzLmluZGV4PXJlc3RvcmU7fQpyZXR1cm57dHlwZTp0eXBlLHZhbHVlOmlkLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLmxpbmVTdGFydCxzdGFydDpzdGFydCxlbmQ6dGhpcy5pbmRleH07fTtTY2FubmVyLnByb3RvdHlwZS5zY2FuUHVuY3R1YXRvcj1mdW5jdGlvbigpe3ZhciBzdGFydD10aGlzLmluZGV4O3ZhciBzdHI9dGhpcy5zb3VyY2VbdGhpcy5pbmRleF07c3dpdGNoKHN0cil7Y2FzZScoJzpjYXNlJ3snOmlmKHN0cj09PSd7Jyl7dGhpcy5jdXJseVN0YWNrLnB1c2goJ3snKTt9CisrdGhpcy5pbmRleDticmVhaztjYXNlJy4nOisrdGhpcy5pbmRleDtpZih0aGlzLnNvdXJjZVt0aGlzLmluZGV4XT09PScuJyYmdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsxXT09PScuJyl7dGhpcy5pbmRleCs9MjtzdHI9Jy4uLic7fQpicmVhaztjYXNlJ30nOisrdGhpcy5pbmRleDt0aGlzLmN1cmx5U3RhY2sucG9wKCk7YnJlYWs7Y2FzZScpJzpjYXNlJzsnOmNhc2UnLCc6Y2FzZSdbJzpjYXNlJ10nOmNhc2UnOic6Y2FzZSc/JzpjYXNlJ34nOisrdGhpcy5pbmRleDticmVhaztkZWZhdWx0OnN0cj10aGlzLnNvdXJjZS5zdWJzdHIodGhpcy5pbmRleCw0KTtpZihzdHI9PT0nPj4+PScpe3RoaXMuaW5kZXgrPTQ7fWVsc2UKe3N0cj1zdHIuc3Vic3RyKDAsMyk7aWYoc3RyPT09Jz09PSd8fHN0cj09PSchPT0nfHxzdHI9PT0nPj4+J3x8c3RyPT09Jzw8PSd8fHN0cj09PSc+Pj0nfHxzdHI9PT0nKio9Jyl7dGhpcy5pbmRleCs9Mzt9ZWxzZQp7c3RyPXN0ci5zdWJzdHIoMCwyKTtpZihzdHI9PT0nJiYnfHxzdHI9PT0nfHwnfHxzdHI9PT0nPT0nfHxzdHI9PT0nIT0nfHxzdHI9PT0nKz0nfHxzdHI9PT0nLT0nfHxzdHI9PT0nKj0nfHxzdHI9PT0nLz0nfHxzdHI9PT0nKysnfHxzdHI9PT0nLS0nfHxzdHI9PT0nPDwnfHxzdHI9PT0nPj4nfHxzdHI9PT0nJj0nfHxzdHI9PT0nfD0nfHxzdHI9PT0nXj0nfHxzdHI9PT0nJT0nfHxzdHI9PT0nPD0nfHxzdHI9PT0nPj0nfHxzdHI9PT0nPT4nfHxzdHI9PT0nKionKXt0aGlzLmluZGV4Kz0yO31lbHNlCntzdHI9dGhpcy5zb3VyY2VbdGhpcy5pbmRleF07aWYoJzw+PSErLSolJnxeLycuaW5kZXhPZihzdHIpPj0wKXsrK3RoaXMuaW5kZXg7fX19fX0KaWYodGhpcy5pbmRleD09PXN0YXJ0KXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm57dHlwZTo3LHZhbHVlOnN0cixsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuc2NhbkhleExpdGVyYWw9ZnVuY3Rpb24oc3RhcnQpe3ZhciBudW09Jyc7d2hpbGUoIXRoaXMuZW9mKCkpe2lmKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSl7YnJlYWs7fQpudW0rPXRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107fQppZihudW0ubGVuZ3RoPT09MCl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO30KaWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm57dHlwZTo2LHZhbHVlOnBhcnNlSW50KCcweCcrbnVtLDE2KSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuc2NhbkJpbmFyeUxpdGVyYWw9ZnVuY3Rpb24oc3RhcnQpe3ZhciBudW09Jyc7dmFyIGNoO3doaWxlKCF0aGlzLmVvZigpKXtjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtpZihjaCE9PScwJyYmY2ghPT0nMScpe2JyZWFrO30KbnVtKz10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO30KaWYobnVtLmxlbmd0aD09PTApe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTt9CmlmKCF0aGlzLmVvZigpKXtjaD10aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO2lmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydChjaCl8fGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaCkpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTt9fQpyZXR1cm57dHlwZTo2LHZhbHVlOnBhcnNlSW50KG51bSwyKSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuc2Nhbk9jdGFsTGl0ZXJhbD1mdW5jdGlvbihwcmVmaXgsc3RhcnQpe3ZhciBudW09Jyc7dmFyIG9jdGFsPWZhbHNlO2lmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQocHJlZml4LmNoYXJDb2RlQXQoMCkpKXtvY3RhbD10cnVlO251bT0nMCcrdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTt9ZWxzZQp7Kyt0aGlzLmluZGV4O30Kd2hpbGUoIXRoaXMuZW9mKCkpe2lmKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXticmVhazt9Cm51bSs9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTt9CmlmKCFvY3RhbCYmbnVtLmxlbmd0aD09PTApe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTt9CmlmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKXx8Y2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm57dHlwZTo2LHZhbHVlOnBhcnNlSW50KG51bSw4KSxvY3RhbDpvY3RhbCxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuaXNJbXBsaWNpdE9jdGFsTGl0ZXJhbD1mdW5jdGlvbigpe2Zvcih2YXIgaT10aGlzLmluZGV4KzE7aTx0aGlzLmxlbmd0aDsrK2kpe3ZhciBjaD10aGlzLnNvdXJjZVtpXTtpZihjaD09PSc4J3x8Y2g9PT0nOScpe3JldHVybiBmYWxzZTt9CmlmKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKXtyZXR1cm4gdHJ1ZTt9fQpyZXR1cm4gdHJ1ZTt9O1NjYW5uZXIucHJvdG90eXBlLnNjYW5OdW1lcmljTGl0ZXJhbD1mdW5jdGlvbigpe3ZhciBzdGFydD10aGlzLmluZGV4O3ZhciBjaD10aGlzLnNvdXJjZVtzdGFydF07YXNzZXJ0XzEuYXNzZXJ0KGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKXx8Y2g9PT0nLicsJ051bWVyaWMgbGl0ZXJhbCBtdXN0IHN0YXJ0IHdpdGggYSBkZWNpbWFsIGRpZ2l0IG9yIGEgZGVjaW1hbCBwb2ludCcpO3ZhciBudW09Jyc7aWYoY2ghPT0nLicpe251bT10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO2NoPXRoaXMuc291cmNlW3RoaXMuaW5kZXhdO2lmKG51bT09PScwJyl7aWYoY2g9PT0neCd8fGNoPT09J1gnKXsrK3RoaXMuaW5kZXg7cmV0dXJuIHRoaXMuc2NhbkhleExpdGVyYWwoc3RhcnQpO30KaWYoY2g9PT0nYid8fGNoPT09J0InKXsrK3RoaXMuaW5kZXg7cmV0dXJuIHRoaXMuc2NhbkJpbmFyeUxpdGVyYWwoc3RhcnQpO30KaWYoY2g9PT0nbyd8fGNoPT09J08nKXtyZXR1cm4gdGhpcy5zY2FuT2N0YWxMaXRlcmFsKGNoLHN0YXJ0KTt9CmlmKGNoJiZjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKXtpZih0aGlzLmlzSW1wbGljaXRPY3RhbExpdGVyYWwoKSl7cmV0dXJuIHRoaXMuc2Nhbk9jdGFsTGl0ZXJhbChjaCxzdGFydCk7fX19CndoaWxlKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSl7bnVtKz10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO30KY2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleF07fQppZihjaD09PScuJyl7bnVtKz10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO3doaWxlKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSl7bnVtKz10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO30KY2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleF07fQppZihjaD09PSdlJ3x8Y2g9PT0nRScpe251bSs9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtpZihjaD09PScrJ3x8Y2g9PT0nLScpe251bSs9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTt9CmlmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSl7d2hpbGUoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXtudW0rPXRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107fX1lbHNlCnt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fX0KaWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm57dHlwZTo2LHZhbHVlOnBhcnNlRmxvYXQobnVtKSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuc2NhblN0cmluZ0xpdGVyYWw9ZnVuY3Rpb24oKXt2YXIgc3RhcnQ9dGhpcy5pbmRleDt2YXIgcXVvdGU9dGhpcy5zb3VyY2Vbc3RhcnRdO2Fzc2VydF8xLmFzc2VydChxdW90ZT09PSdcJyd8fHF1b3RlPT09JyInLCdTdHJpbmcgbGl0ZXJhbCBtdXN0IHN0YXJ0cyB3aXRoIGEgcXVvdGUnKTsrK3RoaXMuaW5kZXg7dmFyIG9jdGFsPWZhbHNlO3ZhciBzdHI9Jyc7d2hpbGUoIXRoaXMuZW9mKCkpe3ZhciBjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO2lmKGNoPT09cXVvdGUpe3F1b3RlPScnO2JyZWFrO31lbHNlCmlmKGNoPT09J1xcJyl7Y2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtpZighY2h8fCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSl7c3dpdGNoKGNoKXtjYXNlJ3UnOmlmKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdPT09J3snKXsrK3RoaXMuaW5kZXg7c3RyKz10aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7fWVsc2UKe3ZhciB1bmVzY2FwZWRfMT10aGlzLnNjYW5IZXhFc2NhcGUoY2gpO2lmKHVuZXNjYXBlZF8xPT09bnVsbCl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO30Kc3RyKz11bmVzY2FwZWRfMTt9CmJyZWFrO2Nhc2UneCc6dmFyIHVuZXNjYXBlZD10aGlzLnNjYW5IZXhFc2NhcGUoY2gpO2lmKHVuZXNjYXBlZD09PW51bGwpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO30Kc3RyKz11bmVzY2FwZWQ7YnJlYWs7Y2FzZSduJzpzdHIrPSdcbic7YnJlYWs7Y2FzZSdyJzpzdHIrPSdccic7YnJlYWs7Y2FzZSd0JzpzdHIrPSdcdCc7YnJlYWs7Y2FzZSdiJzpzdHIrPSdcYic7YnJlYWs7Y2FzZSdmJzpzdHIrPSdcZic7YnJlYWs7Y2FzZSd2JzpzdHIrPSdceDBCJzticmVhaztjYXNlJzgnOmNhc2UnOSc6c3RyKz1jaDt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7YnJlYWs7ZGVmYXVsdDppZihjaCYmY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSl7dmFyIG9jdFRvRGVjPXRoaXMub2N0YWxUb0RlY2ltYWwoY2gpO29jdGFsPW9jdFRvRGVjLm9jdGFsfHxvY3RhbDtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUob2N0VG9EZWMuY29kZSk7fWVsc2UKe3N0cis9Y2g7fQpicmVhazt9fWVsc2UKeysrdGhpcy5saW5lTnVtYmVyO2lmKGNoPT09J1xyJyYmdGhpcy5zb3VyY2VbdGhpcy5pbmRleF09PT0nXG4nKXsrK3RoaXMuaW5kZXg7fQp0aGlzLmxpbmVTdGFydD10aGlzLmluZGV4O319ZWxzZQppZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSl7YnJlYWs7fWVsc2UKe3N0cis9Y2g7fX0KaWYocXVvdGUhPT0nJyl7dGhpcy5pbmRleD1zdGFydDt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQpyZXR1cm57dHlwZTo4LHZhbHVlOnN0cixvY3RhbDpvY3RhbCxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixsaW5lU3RhcnQ6dGhpcy5saW5lU3RhcnQsc3RhcnQ6c3RhcnQsZW5kOnRoaXMuaW5kZXh9O307U2Nhbm5lci5wcm90b3R5cGUuc2NhblRlbXBsYXRlPWZ1bmN0aW9uKCl7dmFyIGNvb2tlZD0nJzt2YXIgdGVybWluYXRlZD1mYWxzZTt2YXIgc3RhcnQ9dGhpcy5pbmRleDt2YXIgaGVhZD10aGlzLnNvdXJjZVtzdGFydF09PT0nYCc7dmFyIHRhaWw9ZmFsc2U7dmFyIHJhd09mZnNldD0yOysrdGhpcy5pbmRleDt3aGlsZSghdGhpcy5lb2YoKSl7dmFyIGNoPXRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107aWYoY2g9PT0nYCcpe3Jhd09mZnNldD0xO3RhaWw9dHJ1ZTt0ZXJtaW5hdGVkPXRydWU7YnJlYWs7fWVsc2UKaWYoY2g9PT0nJCcpe2lmKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdPT09J3snKXt0aGlzLmN1cmx5U3RhY2sucHVzaCgnJHsnKTsrK3RoaXMuaW5kZXg7dGVybWluYXRlZD10cnVlO2JyZWFrO30KY29va2VkKz1jaDt9ZWxzZQppZihjaD09PSdcXCcpe2NoPXRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107aWYoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKXtzd2l0Y2goY2gpe2Nhc2Unbic6Y29va2VkKz0nXG4nO2JyZWFrO2Nhc2Uncic6Y29va2VkKz0nXHInO2JyZWFrO2Nhc2UndCc6Y29va2VkKz0nXHQnO2JyZWFrO2Nhc2UndSc6aWYodGhpcy5zb3VyY2VbdGhpcy5pbmRleF09PT0neycpeysrdGhpcy5pbmRleDtjb29rZWQrPXRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTt9ZWxzZQp7dmFyIHJlc3RvcmU9dGhpcy5pbmRleDt2YXIgdW5lc2NhcGVkXzI9dGhpcy5zY2FuSGV4RXNjYXBlKGNoKTtpZih1bmVzY2FwZWRfMiE9PW51bGwpe2Nvb2tlZCs9dW5lc2NhcGVkXzI7fWVsc2UKe3RoaXMuaW5kZXg9cmVzdG9yZTtjb29rZWQrPWNoO319CmJyZWFrO2Nhc2UneCc6dmFyIHVuZXNjYXBlZD10aGlzLnNjYW5IZXhFc2NhcGUoY2gpO2lmKHVuZXNjYXBlZD09PW51bGwpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO30KY29va2VkKz11bmVzY2FwZWQ7YnJlYWs7Y2FzZSdiJzpjb29rZWQrPSdcYic7YnJlYWs7Y2FzZSdmJzpjb29rZWQrPSdcZic7YnJlYWs7Y2FzZSd2Jzpjb29rZWQrPSdcdic7YnJlYWs7ZGVmYXVsdDppZihjaD09PScwJyl7aWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVGVtcGxhdGVPY3RhbExpdGVyYWwpO30KY29va2VkKz0nXDAnO31lbHNlCmlmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5UZW1wbGF0ZU9jdGFsTGl0ZXJhbCk7fWVsc2UKe2Nvb2tlZCs9Y2g7fQpicmVhazt9fWVsc2UKeysrdGhpcy5saW5lTnVtYmVyO2lmKGNoPT09J1xyJyYmdGhpcy5zb3VyY2VbdGhpcy5pbmRleF09PT0nXG4nKXsrK3RoaXMuaW5kZXg7fQp0aGlzLmxpbmVTdGFydD10aGlzLmluZGV4O319ZWxzZQppZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSl7Kyt0aGlzLmxpbmVOdW1iZXI7aWYoY2g9PT0nXHInJiZ0aGlzLnNvdXJjZVt0aGlzLmluZGV4XT09PSdcbicpeysrdGhpcy5pbmRleDt9CnRoaXMubGluZVN0YXJ0PXRoaXMuaW5kZXg7Y29va2VkKz0nXG4nO31lbHNlCntjb29rZWQrPWNoO319CmlmKCF0ZXJtaW5hdGVkKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7fQppZighaGVhZCl7dGhpcy5jdXJseVN0YWNrLnBvcCgpO30KcmV0dXJue3R5cGU6MTAsdmFsdWU6dGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQrMSx0aGlzLmluZGV4LXJhd09mZnNldCksY29va2VkOmNvb2tlZCxoZWFkOmhlYWQsdGFpbDp0YWlsLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGxpbmVTdGFydDp0aGlzLmxpbmVTdGFydCxzdGFydDpzdGFydCxlbmQ6dGhpcy5pbmRleH07fTtTY2FubmVyLnByb3RvdHlwZS50ZXN0UmVnRXhwPWZ1bmN0aW9uKHBhdHRlcm4sZmxhZ3Mpe3ZhciBhc3RyYWxTdWJzdGl0dXRlPSdcdUZGRkYnO3ZhciB0bXA9cGF0dGVybjt2YXIgc2VsZj10aGlzO2lmKGZsYWdzLmluZGV4T2YoJ3UnKT49MCl7dG1wPXRtcC5yZXBsYWNlKC9cXHVceyhbMC05YS1mQS1GXSspXH18XFx1KFthLWZBLUYwLTldezR9KS9nLGZ1bmN0aW9uKCQwLCQxLCQyKXt2YXIgY29kZVBvaW50PXBhcnNlSW50KCQxfHwkMiwxNik7aWYoY29kZVBvaW50PjB4MTBGRkZGKXtzZWxmLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZFJlZ0V4cCk7fQppZihjb2RlUG9pbnQ8PTB4RkZGRil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTt9CnJldHVybiBhc3RyYWxTdWJzdGl0dXRlO30pLnJlcGxhY2UoL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nLGFzdHJhbFN1YnN0aXR1dGUpO30KdHJ5e1JlZ0V4cCh0bXApO30KY2F0Y2goZSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRSZWdFeHApO30KdHJ5e3JldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sZmxhZ3MpO30KY2F0Y2goZXhjZXB0aW9uKXtyZXR1cm4gbnVsbDt9fTtTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwQm9keT1mdW5jdGlvbigpe3ZhciBjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4XTthc3NlcnRfMS5hc3NlcnQoY2g9PT0nLycsJ1JlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoJyk7dmFyIHN0cj10aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO3ZhciBjbGFzc01hcmtlcj1mYWxzZTt2YXIgdGVybWluYXRlZD1mYWxzZTt3aGlsZSghdGhpcy5lb2YoKSl7Y2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtzdHIrPWNoO2lmKGNoPT09J1xcJyl7Y2g9dGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtpZihjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSl7dGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlVudGVybWluYXRlZFJlZ0V4cCk7fQpzdHIrPWNoO31lbHNlCmlmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKXt0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW50ZXJtaW5hdGVkUmVnRXhwKTt9ZWxzZQppZihjbGFzc01hcmtlcil7aWYoY2g9PT0nXScpe2NsYXNzTWFya2VyPWZhbHNlO319ZWxzZQp7aWYoY2g9PT0nLycpe3Rlcm1pbmF0ZWQ9dHJ1ZTticmVhazt9ZWxzZQppZihjaD09PSdbJyl7Y2xhc3NNYXJrZXI9dHJ1ZTt9fX0KaWYoIXRlcm1pbmF0ZWQpe3RoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO30KcmV0dXJuIHN0ci5zdWJzdHIoMSxzdHIubGVuZ3RoLTIpO307U2Nhbm5lci5wcm90b3R5cGUuc2NhblJlZ0V4cEZsYWdzPWZ1bmN0aW9uKCl7dmFyIHN0cj0nJzt2YXIgZmxhZ3M9Jyc7d2hpbGUoIXRoaXMuZW9mKCkpe3ZhciBjaD10aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtpZighY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY2guY2hhckNvZGVBdCgwKSkpe2JyZWFrO30KKyt0aGlzLmluZGV4O2lmKGNoPT09J1xcJyYmIXRoaXMuZW9mKCkpe2NoPXRoaXMuc291cmNlW3RoaXMuaW5kZXhdO2lmKGNoPT09J3UnKXsrK3RoaXMuaW5kZXg7dmFyIHJlc3RvcmU9dGhpcy5pbmRleDt2YXIgY2hhcj10aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtpZihjaGFyIT09bnVsbCl7ZmxhZ3MrPWNoYXI7Zm9yKHN0cis9J1xcdSc7cmVzdG9yZTx0aGlzLmluZGV4OysrcmVzdG9yZSl7c3RyKz10aGlzLnNvdXJjZVtyZXN0b3JlXTt9fWVsc2UKe3RoaXMuaW5kZXg9cmVzdG9yZTtmbGFncys9J3UnO3N0cis9J1xcdSc7fQp0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7fWVsc2UKe3N0cis9J1xcJzt0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7fX1lbHNlCntmbGFncys9Y2g7c3RyKz1jaDt9fQpyZXR1cm4gZmxhZ3M7fTtTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwPWZ1bmN0aW9uKCl7dmFyIHN0YXJ0PXRoaXMuaW5kZXg7dmFyIHBhdHRlcm49dGhpcy5zY2FuUmVnRXhwQm9keSgpO3ZhciBmbGFncz10aGlzLnNjYW5SZWdFeHBGbGFncygpO3ZhciB2YWx1ZT10aGlzLnRlc3RSZWdFeHAocGF0dGVybixmbGFncyk7cmV0dXJue3R5cGU6OSx2YWx1ZTonJyxwYXR0ZXJuOnBhdHRlcm4sZmxhZ3M6ZmxhZ3MscmVnZXg6dmFsdWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsbGluZVN0YXJ0OnRoaXMubGluZVN0YXJ0LHN0YXJ0OnN0YXJ0LGVuZDp0aGlzLmluZGV4fTt9O1NjYW5uZXIucHJvdG90eXBlLmxleD1mdW5jdGlvbigpe2lmKHRoaXMuZW9mKCkpe3JldHVybnt0eXBlOjIsdmFsdWU6JycsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsbGluZVN0YXJ0OnRoaXMubGluZVN0YXJ0LHN0YXJ0OnRoaXMuaW5kZXgsZW5kOnRoaXMuaW5kZXh9O30KdmFyIGNwPXRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7aWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNwKSl7cmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTt9CmlmKGNwPT09MHgyOHx8Y3A9PT0weDI5fHxjcD09PTB4M0Ipe3JldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7fQppZihjcD09PTB4Mjd8fGNwPT09MHgyMil7cmV0dXJuIHRoaXMuc2NhblN0cmluZ0xpdGVyYWwoKTt9CmlmKGNwPT09MHgyRSl7aWYoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKSkpe3JldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO30KcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTt9CmlmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjcCkpe3JldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO30KaWYoY3A9PT0weDYwfHxjcD09PTB4N0QmJnRoaXMuY3VybHlTdGFja1t0aGlzLmN1cmx5U3RhY2subGVuZ3RoLTFdPT09JyR7Jyl7cmV0dXJuIHRoaXMuc2NhblRlbXBsYXRlKCk7fQppZihjcD49MHhEODAwJiZjcDwweERGRkYpe2lmKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGVQb2ludEF0KHRoaXMuaW5kZXgpKSl7cmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTt9fQpyZXR1cm4gdGhpcy5zY2FuUHVuY3R1YXRvcigpO307cmV0dXJuIFNjYW5uZXI7fSgpO2V4cG9ydHMuU2Nhbm5lcj1TY2FubmVyO30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLlRva2VuTmFtZT17fTtleHBvcnRzLlRva2VuTmFtZVsxXT0nQm9vbGVhbic7ZXhwb3J0cy5Ub2tlbk5hbWVbMl09JzxlbmQ+JztleHBvcnRzLlRva2VuTmFtZVszXT0nSWRlbnRpZmllcic7ZXhwb3J0cy5Ub2tlbk5hbWVbNF09J0tleXdvcmQnO2V4cG9ydHMuVG9rZW5OYW1lWzVdPSdOdWxsJztleHBvcnRzLlRva2VuTmFtZVs2XT0nTnVtZXJpYyc7ZXhwb3J0cy5Ub2tlbk5hbWVbN109J1B1bmN0dWF0b3InO2V4cG9ydHMuVG9rZW5OYW1lWzhdPSdTdHJpbmcnO2V4cG9ydHMuVG9rZW5OYW1lWzldPSdSZWd1bGFyRXhwcmVzc2lvbic7ZXhwb3J0cy5Ub2tlbk5hbWVbMTBdPSdUZW1wbGF0ZSc7fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuWEhUTUxFbnRpdGllcz17cXVvdDonXHUwMDIyJyxhbXA6J1x1MDAyNicsYXBvczonXHUwMDI3JyxndDonXHUwMDNFJyxuYnNwOidcdTAwQTAnLGlleGNsOidcdTAwQTEnLGNlbnQ6J1x1MDBBMicscG91bmQ6J1x1MDBBMycsY3VycmVuOidcdTAwQTQnLHllbjonXHUwMEE1JyxicnZiYXI6J1x1MDBBNicsc2VjdDonXHUwMEE3Jyx1bWw6J1x1MDBBOCcsY29weTonXHUwMEE5JyxvcmRmOidcdTAwQUEnLGxhcXVvOidcdTAwQUInLG5vdDonXHUwMEFDJyxzaHk6J1x1MDBBRCcscmVnOidcdTAwQUUnLG1hY3I6J1x1MDBBRicsZGVnOidcdTAwQjAnLHBsdXNtbjonXHUwMEIxJyxzdXAyOidcdTAwQjInLHN1cDM6J1x1MDBCMycsYWN1dGU6J1x1MDBCNCcsbWljcm86J1x1MDBCNScscGFyYTonXHUwMEI2JyxtaWRkb3Q6J1x1MDBCNycsY2VkaWw6J1x1MDBCOCcsc3VwMTonXHUwMEI5JyxvcmRtOidcdTAwQkEnLHJhcXVvOidcdTAwQkInLGZyYWMxNDonXHUwMEJDJyxmcmFjMTI6J1x1MDBCRCcsZnJhYzM0OidcdTAwQkUnLGlxdWVzdDonXHUwMEJGJyxBZ3JhdmU6J1x1MDBDMCcsQWFjdXRlOidcdTAwQzEnLEFjaXJjOidcdTAwQzInLEF0aWxkZTonXHUwMEMzJyxBdW1sOidcdTAwQzQnLEFyaW5nOidcdTAwQzUnLEFFbGlnOidcdTAwQzYnLENjZWRpbDonXHUwMEM3JyxFZ3JhdmU6J1x1MDBDOCcsRWFjdXRlOidcdTAwQzknLEVjaXJjOidcdTAwQ0EnLEV1bWw6J1x1MDBDQicsSWdyYXZlOidcdTAwQ0MnLElhY3V0ZTonXHUwMENEJyxJY2lyYzonXHUwMENFJyxJdW1sOidcdTAwQ0YnLEVUSDonXHUwMEQwJyxOdGlsZGU6J1x1MDBEMScsT2dyYXZlOidcdTAwRDInLE9hY3V0ZTonXHUwMEQzJyxPY2lyYzonXHUwMEQ0JyxPdGlsZGU6J1x1MDBENScsT3VtbDonXHUwMEQ2Jyx0aW1lczonXHUwMEQ3JyxPc2xhc2g6J1x1MDBEOCcsVWdyYXZlOidcdTAwRDknLFVhY3V0ZTonXHUwMERBJyxVY2lyYzonXHUwMERCJyxVdW1sOidcdTAwREMnLFlhY3V0ZTonXHUwMEREJyxUSE9STjonXHUwMERFJyxzemxpZzonXHUwMERGJyxhZ3JhdmU6J1x1MDBFMCcsYWFjdXRlOidcdTAwRTEnLGFjaXJjOidcdTAwRTInLGF0aWxkZTonXHUwMEUzJyxhdW1sOidcdTAwRTQnLGFyaW5nOidcdTAwRTUnLGFlbGlnOidcdTAwRTYnLGNjZWRpbDonXHUwMEU3JyxlZ3JhdmU6J1x1MDBFOCcsZWFjdXRlOidcdTAwRTknLGVjaXJjOidcdTAwRUEnLGV1bWw6J1x1MDBFQicsaWdyYXZlOidcdTAwRUMnLGlhY3V0ZTonXHUwMEVEJyxpY2lyYzonXHUwMEVFJyxpdW1sOidcdTAwRUYnLGV0aDonXHUwMEYwJyxudGlsZGU6J1x1MDBGMScsb2dyYXZlOidcdTAwRjInLG9hY3V0ZTonXHUwMEYzJyxvY2lyYzonXHUwMEY0JyxvdGlsZGU6J1x1MDBGNScsb3VtbDonXHUwMEY2JyxkaXZpZGU6J1x1MDBGNycsb3NsYXNoOidcdTAwRjgnLHVncmF2ZTonXHUwMEY5Jyx1YWN1dGU6J1x1MDBGQScsdWNpcmM6J1x1MDBGQicsdXVtbDonXHUwMEZDJyx5YWN1dGU6J1x1MDBGRCcsdGhvcm46J1x1MDBGRScseXVtbDonXHUwMEZGJyxPRWxpZzonXHUwMTUyJyxvZWxpZzonXHUwMTUzJyxTY2Fyb246J1x1MDE2MCcsc2Nhcm9uOidcdTAxNjEnLFl1bWw6J1x1MDE3OCcsZm5vZjonXHUwMTkyJyxjaXJjOidcdTAyQzYnLHRpbGRlOidcdTAyREMnLEFscGhhOidcdTAzOTEnLEJldGE6J1x1MDM5MicsR2FtbWE6J1x1MDM5MycsRGVsdGE6J1x1MDM5NCcsRXBzaWxvbjonXHUwMzk1JyxaZXRhOidcdTAzOTYnLEV0YTonXHUwMzk3JyxUaGV0YTonXHUwMzk4JyxJb3RhOidcdTAzOTknLEthcHBhOidcdTAzOUEnLExhbWJkYTonXHUwMzlCJyxNdTonXHUwMzlDJyxOdTonXHUwMzlEJyxYaTonXHUwMzlFJyxPbWljcm9uOidcdTAzOUYnLFBpOidcdTAzQTAnLFJobzonXHUwM0ExJyxTaWdtYTonXHUwM0EzJyxUYXU6J1x1MDNBNCcsVXBzaWxvbjonXHUwM0E1JyxQaGk6J1x1MDNBNicsQ2hpOidcdTAzQTcnLFBzaTonXHUwM0E4JyxPbWVnYTonXHUwM0E5JyxhbHBoYTonXHUwM0IxJyxiZXRhOidcdTAzQjInLGdhbW1hOidcdTAzQjMnLGRlbHRhOidcdTAzQjQnLGVwc2lsb246J1x1MDNCNScsemV0YTonXHUwM0I2JyxldGE6J1x1MDNCNycsdGhldGE6J1x1MDNCOCcsaW90YTonXHUwM0I5JyxrYXBwYTonXHUwM0JBJyxsYW1iZGE6J1x1MDNCQicsbXU6J1x1MDNCQycsbnU6J1x1MDNCRCcseGk6J1x1MDNCRScsb21pY3JvbjonXHUwM0JGJyxwaTonXHUwM0MwJyxyaG86J1x1MDNDMScsc2lnbWFmOidcdTAzQzInLHNpZ21hOidcdTAzQzMnLHRhdTonXHUwM0M0Jyx1cHNpbG9uOidcdTAzQzUnLHBoaTonXHUwM0M2JyxjaGk6J1x1MDNDNycscHNpOidcdTAzQzgnLG9tZWdhOidcdTAzQzknLHRoZXRhc3ltOidcdTAzRDEnLHVwc2loOidcdTAzRDInLHBpdjonXHUwM0Q2JyxlbnNwOidcdTIwMDInLGVtc3A6J1x1MjAwMycsdGhpbnNwOidcdTIwMDknLHp3bmo6J1x1MjAwQycsendqOidcdTIwMEQnLGxybTonXHUyMDBFJyxybG06J1x1MjAwRicsbmRhc2g6J1x1MjAxMycsbWRhc2g6J1x1MjAxNCcsbHNxdW86J1x1MjAxOCcscnNxdW86J1x1MjAxOScsc2JxdW86J1x1MjAxQScsbGRxdW86J1x1MjAxQycscmRxdW86J1x1MjAxRCcsYmRxdW86J1x1MjAxRScsZGFnZ2VyOidcdTIwMjAnLERhZ2dlcjonXHUyMDIxJyxidWxsOidcdTIwMjInLGhlbGxpcDonXHUyMDI2JyxwZXJtaWw6J1x1MjAzMCcscHJpbWU6J1x1MjAzMicsUHJpbWU6J1x1MjAzMycsbHNhcXVvOidcdTIwMzknLHJzYXF1bzonXHUyMDNBJyxvbGluZTonXHUyMDNFJyxmcmFzbDonXHUyMDQ0JyxldXJvOidcdTIwQUMnLGltYWdlOidcdTIxMTEnLHdlaWVycDonXHUyMTE4JyxyZWFsOidcdTIxMUMnLHRyYWRlOidcdTIxMjInLGFsZWZzeW06J1x1MjEzNScsbGFycjonXHUyMTkwJyx1YXJyOidcdTIxOTEnLHJhcnI6J1x1MjE5MicsZGFycjonXHUyMTkzJyxoYXJyOidcdTIxOTQnLGNyYXJyOidcdTIxQjUnLGxBcnI6J1x1MjFEMCcsdUFycjonXHUyMUQxJyxyQXJyOidcdTIxRDInLGRBcnI6J1x1MjFEMycsaEFycjonXHUyMUQ0Jyxmb3JhbGw6J1x1MjIwMCcscGFydDonXHUyMjAyJyxleGlzdDonXHUyMjAzJyxlbXB0eTonXHUyMjA1JyxuYWJsYTonXHUyMjA3Jyxpc2luOidcdTIyMDgnLG5vdGluOidcdTIyMDknLG5pOidcdTIyMEInLHByb2Q6J1x1MjIwRicsc3VtOidcdTIyMTEnLG1pbnVzOidcdTIyMTInLGxvd2FzdDonXHUyMjE3JyxyYWRpYzonXHUyMjFBJyxwcm9wOidcdTIyMUQnLGluZmluOidcdTIyMUUnLGFuZzonXHUyMjIwJyxhbmQ6J1x1MjIyNycsb3I6J1x1MjIyOCcsY2FwOidcdTIyMjknLGN1cDonXHUyMjJBJyxpbnQ6J1x1MjIyQicsdGhlcmU0OidcdTIyMzQnLHNpbTonXHUyMjNDJyxjb25nOidcdTIyNDUnLGFzeW1wOidcdTIyNDgnLG5lOidcdTIyNjAnLGVxdWl2OidcdTIyNjEnLGxlOidcdTIyNjQnLGdlOidcdTIyNjUnLHN1YjonXHUyMjgyJyxzdXA6J1x1MjI4MycsbnN1YjonXHUyMjg0JyxzdWJlOidcdTIyODYnLHN1cGU6J1x1MjI4Nycsb3BsdXM6J1x1MjI5NScsb3RpbWVzOidcdTIyOTcnLHBlcnA6J1x1MjJBNScsc2RvdDonXHUyMkM1JyxsY2VpbDonXHUyMzA4JyxyY2VpbDonXHUyMzA5JyxsZmxvb3I6J1x1MjMwQScscmZsb29yOidcdTIzMEInLGxvejonXHUyNUNBJyxzcGFkZXM6J1x1MjY2MCcsY2x1YnM6J1x1MjY2MycsaGVhcnRzOidcdTI2NjUnLGRpYW1zOidcdTI2NjYnLGxhbmc6J1x1MjdFOCcscmFuZzonXHUyN0U5J307fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIGVycm9yX2hhbmRsZXJfMT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTt2YXIgc2Nhbm5lcl8xPV9fd2VicGFja19yZXF1aXJlX18oMTIpO3ZhciB0b2tlbl8xPV9fd2VicGFja19yZXF1aXJlX18oMTMpO3ZhciBSZWFkZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBSZWFkZXIoKXt0aGlzLnZhbHVlcz1bXTt0aGlzLmN1cmx5PXRoaXMucGFyZW49LTE7fQpSZWFkZXIucHJvdG90eXBlLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbj1mdW5jdGlvbih0KXtyZXR1cm5bJygnLCd7JywnWycsJ2luJywndHlwZW9mJywnaW5zdGFuY2VvZicsJ25ldycsJ3JldHVybicsJ2Nhc2UnLCdkZWxldGUnLCd0aHJvdycsJ3ZvaWQnLCc9JywnKz0nLCctPScsJyo9JywnKio9JywnLz0nLCclPScsJzw8PScsJz4+PScsJz4+Pj0nLCcmPScsJ3w9JywnXj0nLCcsJywnKycsJy0nLCcqJywnKionLCcvJywnJScsJysrJywnLS0nLCc8PCcsJz4+JywnPj4+JywnJicsJ3wnLCdeJywnIScsJ34nLCcmJicsJ3x8JywnPycsJzonLCc9PT0nLCc9PScsJz49JywnPD0nLCc8JywnPicsJyE9JywnIT09J10uaW5kZXhPZih0KT49MDt9O1JlYWRlci5wcm90b3R5cGUuaXNSZWdleFN0YXJ0PWZ1bmN0aW9uKCl7dmFyIHByZXZpb3VzPXRoaXMudmFsdWVzW3RoaXMudmFsdWVzLmxlbmd0aC0xXTt2YXIgcmVnZXg9cHJldmlvdXMhPT1udWxsO3N3aXRjaChwcmV2aW91cyl7Y2FzZSd0aGlzJzpjYXNlJ10nOnJlZ2V4PWZhbHNlO2JyZWFrO2Nhc2UnKSc6dmFyIGtleXdvcmQ9dGhpcy52YWx1ZXNbdGhpcy5wYXJlbi0xXTtyZWdleD1rZXl3b3JkPT09J2lmJ3x8a2V5d29yZD09PSd3aGlsZSd8fGtleXdvcmQ9PT0nZm9yJ3x8a2V5d29yZD09PSd3aXRoJzticmVhaztjYXNlJ30nOnJlZ2V4PWZhbHNlO2lmKHRoaXMudmFsdWVzW3RoaXMuY3VybHktM109PT0nZnVuY3Rpb24nKXt2YXIgY2hlY2s9dGhpcy52YWx1ZXNbdGhpcy5jdXJseS00XTtyZWdleD1jaGVjaz8hdGhpcy5iZWZvcmVGdW5jdGlvbkV4cHJlc3Npb24oY2hlY2spOmZhbHNlO31lbHNlCmlmKHRoaXMudmFsdWVzW3RoaXMuY3VybHktNF09PT0nZnVuY3Rpb24nKXt2YXIgY2hlY2s9dGhpcy52YWx1ZXNbdGhpcy5jdXJseS01XTtyZWdleD1jaGVjaz8hdGhpcy5iZWZvcmVGdW5jdGlvbkV4cHJlc3Npb24oY2hlY2spOnRydWU7fQpicmVhaztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIHJlZ2V4O307UmVhZGVyLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHRva2VuKXtpZih0b2tlbi50eXBlPT09N3x8dG9rZW4udHlwZT09PTQpe2lmKHRva2VuLnZhbHVlPT09J3snKXt0aGlzLmN1cmx5PXRoaXMudmFsdWVzLmxlbmd0aDt9ZWxzZQppZih0b2tlbi52YWx1ZT09PScoJyl7dGhpcy5wYXJlbj10aGlzLnZhbHVlcy5sZW5ndGg7fQp0aGlzLnZhbHVlcy5wdXNoKHRva2VuLnZhbHVlKTt9ZWxzZQp7dGhpcy52YWx1ZXMucHVzaChudWxsKTt9fTtyZXR1cm4gUmVhZGVyO30oKTt2YXIgVG9rZW5pemVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gVG9rZW5pemVyKGNvZGUsY29uZmlnKXt0aGlzLmVycm9ySGFuZGxlcj1uZXcgZXJyb3JfaGFuZGxlcl8xLkVycm9ySGFuZGxlcigpO3RoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYW50PWNvbmZpZz90eXBlb2YgY29uZmlnLnRvbGVyYW50PT09J2Jvb2xlYW4nJiZjb25maWcudG9sZXJhbnQ6ZmFsc2U7dGhpcy5zY2FubmVyPW5ldyBzY2FubmVyXzEuU2Nhbm5lcihjb2RlLHRoaXMuZXJyb3JIYW5kbGVyKTt0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50PWNvbmZpZz90eXBlb2YgY29uZmlnLmNvbW1lbnQ9PT0nYm9vbGVhbicmJmNvbmZpZy5jb21tZW50OmZhbHNlO3RoaXMudHJhY2tSYW5nZT1jb25maWc/dHlwZW9mIGNvbmZpZy5yYW5nZT09PSdib29sZWFuJyYmY29uZmlnLnJhbmdlOmZhbHNlO3RoaXMudHJhY2tMb2M9Y29uZmlnP3R5cGVvZiBjb25maWcubG9jPT09J2Jvb2xlYW4nJiZjb25maWcubG9jOmZhbHNlO3RoaXMuYnVmZmVyPVtdO3RoaXMucmVhZGVyPW5ldyBSZWFkZXIoKTt9ClRva2VuaXplci5wcm90b3R5cGUuZXJyb3JzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yczt9O1Rva2VuaXplci5wcm90b3R5cGUuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKCl7aWYodGhpcy5idWZmZXIubGVuZ3RoPT09MCl7dmFyIGNvbW1lbnRzPXRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtpZih0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50KXtmb3IodmFyIGk9MDtpPGNvbW1lbnRzLmxlbmd0aDsrK2kpe3ZhciBlPWNvbW1lbnRzW2ldO3ZhciB2YWx1ZT10aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKGUuc2xpY2VbMF0sZS5zbGljZVsxXSk7dmFyIGNvbW1lbnQ9e3R5cGU6ZS5tdWx0aUxpbmU/J0Jsb2NrQ29tbWVudCc6J0xpbmVDb21tZW50Jyx2YWx1ZTp2YWx1ZX07aWYodGhpcy50cmFja1JhbmdlKXtjb21tZW50LnJhbmdlPWUucmFuZ2U7fQppZih0aGlzLnRyYWNrTG9jKXtjb21tZW50LmxvYz1lLmxvYzt9CnRoaXMuYnVmZmVyLnB1c2goY29tbWVudCk7fX0KaWYoIXRoaXMuc2Nhbm5lci5lb2YoKSl7dmFyIGxvYz12b2lkIDA7aWYodGhpcy50cmFja0xvYyl7bG9jPXtzdGFydDp7bGluZTp0aGlzLnNjYW5uZXIubGluZU51bWJlcixjb2x1bW46dGhpcy5zY2FubmVyLmluZGV4LXRoaXMuc2Nhbm5lci5saW5lU3RhcnR9LGVuZDp7fX07fQp2YXIgc3RhcnRSZWdleD10aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF09PT0nLycmJnRoaXMucmVhZGVyLmlzUmVnZXhTdGFydCgpO3ZhciB0b2tlbj1zdGFydFJlZ2V4P3RoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCk6dGhpcy5zY2FubmVyLmxleCgpO3RoaXMucmVhZGVyLnB1c2godG9rZW4pO3ZhciBlbnRyeT17dHlwZTp0b2tlbl8xLlRva2VuTmFtZVt0b2tlbi50eXBlXSx2YWx1ZTp0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKHRva2VuLnN0YXJ0LHRva2VuLmVuZCl9O2lmKHRoaXMudHJhY2tSYW5nZSl7ZW50cnkucmFuZ2U9W3Rva2VuLnN0YXJ0LHRva2VuLmVuZF07fQppZih0aGlzLnRyYWNrTG9jKXtsb2MuZW5kPXtsaW5lOnRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLGNvbHVtbjp0aGlzLnNjYW5uZXIuaW5kZXgtdGhpcy5zY2FubmVyLmxpbmVTdGFydH07ZW50cnkubG9jPWxvYzt9CmlmKHRva2VuLnR5cGU9PT05KXt2YXIgcGF0dGVybj10b2tlbi5wYXR0ZXJuO3ZhciBmbGFncz10b2tlbi5mbGFncztlbnRyeS5yZWdleD17cGF0dGVybjpwYXR0ZXJuLGZsYWdzOmZsYWdzfTt9CnRoaXMuYnVmZmVyLnB1c2goZW50cnkpO319CnJldHVybiB0aGlzLmJ1ZmZlci5zaGlmdCgpO307cmV0dXJuIFRva2VuaXplcjt9KCk7ZXhwb3J0cy5Ub2tlbml6ZXI9VG9rZW5pemVyO31dKTt9KTs7fSx7fV0sMTE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oQnVmZmVyKXt2YXIgcXVlcnlzdHJpbmc9cmVxdWlyZSgncXVlcnlzdHJpbmcnKTt2YXIgdHJpbT1yZXF1aXJlKCcuL3RyaW0nKTtmdW5jdGlvbiBMaW5rKHZhbHVlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBMaW5rKSl7cmV0dXJuIG5ldyBMaW5rKHZhbHVlKTt9CnRoaXMucmVmcz1bXTt9CkxpbmsucGF0dGVybj0vKD86XDwoW15cPl0rKVw+KSgoXHMqO1xzKihbYS16XCpdKyk9KCgiW14iXSsiKXwoJ1teJ10rJyl8KFteXCxcO10rKSkpKikoXHMqLFxzKnwkKS9naTtMaW5rLmF0dHJQYXR0ZXJuPS8oW2EtelwqXSspPSg/Oig/OiIoW14iXSspIil8KD86JyhbXiddKyknKXwoW15cLFw7XSspKS9naTtMaW5rLmlzQ29tcGF0aWJsZUVuY29kaW5nPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4vXnV0Zi0/OHxhc2NpaXx1dGYtPzE2LT9sZXx1Y3MtPzJ8YmFzZS0/NjR8bGF0aW4tPzEkL2kudGVzdCh2YWx1ZSk7fTtMaW5rLmZvcm1hdEV4dGVuZGVkQXR0cmlidXRlPWZ1bmN0aW9uKGF0dHIsZGF0YSl7dmFyIGVuY29kaW5nPShkYXRhLmVuY29kaW5nfHwndXRmLTgnKS50b1VwcGVyQ2FzZSgpO3ZhciBsYW5ndWFnZT1kYXRhLmxhbmd1YWdlfHwnZW4nO3ZhciBlbmNvZGVkVmFsdWU9Jyc7aWYoQnVmZmVyLmlzQnVmZmVyKGRhdGEudmFsdWUpJiZMaW5rLmlzQ29tcGF0aWJsZUVuY29kaW5nKGVuY29kaW5nKSl7ZW5jb2RlZFZhbHVlPWRhdGEudmFsdWUudG9TdHJpbmcoZW5jb2RpbmcpO31lbHNlIGlmKEJ1ZmZlci5pc0J1ZmZlcihkYXRhLnZhbHVlKSl7ZW5jb2RlZFZhbHVlPWRhdGEudmFsdWUudG9TdHJpbmcoJ2hleCcpLnJlcGxhY2UoL1swLTlhLWZdezJ9L2dpLCclJDEnKTt9ZWxzZXtlbmNvZGVkVmFsdWU9cXVlcnlzdHJpbmcuZXNjYXBlKGRhdGEudmFsdWUpO30KcmV0dXJuIGF0dHIrJz0nK2VuY29kaW5nKydcJycrCmxhbmd1YWdlKydcJycrZW5jb2RlZFZhbHVlO307TGluay5mb3JtYXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYXR0cix2YWx1ZSl7aWYoL1wqJC8udGVzdChhdHRyKXx8dHlwZW9mIHZhbHVlIT09J3N0cmluZycpCnJldHVybiBMaW5rLmZvcm1hdEV4dGVuZGVkQXR0cmlidXRlKGF0dHIsdmFsdWUpO3ZhciBuZWVkc1F1b3Rlcz0vW15hLXpdL2kudGVzdCh2YWx1ZSk7aWYobmVlZHNRdW90ZXMpe3ZhbHVlPXF1ZXJ5c3RyaW5nLmVzY2FwZSh2YWx1ZSkucmVwbGFjZSgvJTIwL2csJyAnKS5yZXBsYWNlKC8lMkMvZywnLCcpLnJlcGxhY2UoLyUzQi9nLCc7Jyk7dmFsdWU9JyInK3ZhbHVlKyciJzt9CnJldHVybiBhdHRyKyc9Jyt2YWx1ZTt9O0xpbmsucGFyc2VFeHRlbmRlZFZhbHVlPWZ1bmN0aW9uKHZhbHVlKXt2YXIgcGFydHM9LyhbXiddKyk/KD86JyhbXiddKyknKT8oLispLy5leGVjKHZhbHVlKTtyZXR1cm57bGFuZ3VhZ2U6cGFydHNbMl0udG9Mb3dlckNhc2UoKSxlbmNvZGluZzpMaW5rLmlzQ29tcGF0aWJsZUVuY29kaW5nKHBhcnRzWzFdKT9udWxsOnBhcnRzWzFdLnRvTG93ZXJDYXNlKCksdmFsdWU6TGluay5pc0NvbXBhdGlibGVFbmNvZGluZyhwYXJ0c1sxXSk/cXVlcnlzdHJpbmcudW5lc2NhcGUocGFydHNbM10pOnBhcnRzWzNdfTt9O0xpbmsuc2V0QXR0cj1mdW5jdGlvbihsaW5rLGF0dHIsdmFsdWUpe2lmKGF0dHI9PT0ncmVsJyYmbGlua1thdHRyXSE9bnVsbCkKcmV0dXJuIGxpbms7aWYoQXJyYXkuaXNBcnJheShsaW5rW2F0dHJdKSl7bGlua1thdHRyXS5wdXNoKHZhbHVlKTt9ZWxzZSBpZihsaW5rW2F0dHJdIT1udWxsKXtsaW5rW2F0dHJdPVtsaW5rW2F0dHJdLHZhbHVlXTt9ZWxzZXtsaW5rW2F0dHJdPXZhbHVlO30KcmV0dXJuIGxpbms7fTtMaW5rLnBhcnNlUGFyYW1zPWZ1bmN0aW9uKGxpbmssdXJpKXt2YXIga3ZzPXt9O3ZhciBwYXJhbXM9LyguKylcPyguKykvZ2kuZXhlYyh1cmkpO2lmKCFwYXJhbXMpe3JldHVybiBsaW5rO30KcGFyYW1zPXBhcmFtc1syXS5zcGxpdCgnJicpO2Zvcih2YXIgaT0wO2k8cGFyYW1zLmxlbmd0aDtpKyspe3ZhciBwYXJhbT1wYXJhbXNbaV0uc3BsaXQoJz0nKTtrdnNbcGFyYW1bMF1dPXBhcmFtWzFdO30KTGluay5zZXRBdHRyKGxpbmssJ3BhcmFtcycsa3ZzKTtyZXR1cm4gbGluazt9O0xpbmsucGFyc2VBdHRycz1mdW5jdGlvbihsaW5rLHBhcnRzKXt2YXIgbWF0Y2g9bnVsbDt2YXIgYXR0cj0nJzt2YXIgdmFsdWU9Jyc7dmFyIGF0dHJzPScnO3ZhciB1cmlBdHRycz0vPCguKik+O1xzKiguKikvZ2kuZXhlYyhwYXJ0cyk7aWYodXJpQXR0cnMpe2F0dHJzPXVyaUF0dHJzWzJdO2xpbms9TGluay5wYXJzZVBhcmFtcyhsaW5rLHVyaUF0dHJzWzFdKTt9CndoaWxlKG1hdGNoPUxpbmsuYXR0clBhdHRlcm4uZXhlYyhhdHRycykpe2F0dHI9bWF0Y2hbMV0udG9Mb3dlckNhc2UoKTt2YWx1ZT1tYXRjaFs0XXx8bWF0Y2hbM118fG1hdGNoWzJdO2lmKC9cKiQvLnRlc3QoYXR0cikpe0xpbmsuc2V0QXR0cihsaW5rLGF0dHIsTGluay5wYXJzZUV4dGVuZGVkVmFsdWUodmFsdWUpKTt9ZWxzZSBpZigvJS8udGVzdCh2YWx1ZSkpe0xpbmsuc2V0QXR0cihsaW5rLGF0dHIscXVlcnlzdHJpbmcudW5lc2NhcGUodmFsdWUpKTt9ZWxzZXtMaW5rLnNldEF0dHIobGluayxhdHRyLHZhbHVlKTt9fQpyZXR1cm4gbGluazt9O0xpbmsucGFyc2U9ZnVuY3Rpb24odmFsdWUpe3JldHVybiBuZXcgTGluaygpLnBhcnNlKHZhbHVlKTt9O0xpbmsucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMaW5rLHJlbDpmdW5jdGlvbih2YWx1ZSl7dmFyIGxpbmtzPVtdO2Zvcih2YXIgaT0wO2k8dGhpcy5yZWZzLmxlbmd0aDtpKyspe2lmKHRoaXMucmVmc1tpXS5yZWw9PT12YWx1ZSl7bGlua3MucHVzaCh0aGlzLnJlZnNbaV0pO319CnJldHVybiBsaW5rczt9LGdldDpmdW5jdGlvbihhdHRyLHZhbHVlKXthdHRyPWF0dHIudG9Mb3dlckNhc2UoKTt2YXIgbGlua3M9W107Zm9yKHZhciBpPTA7aTx0aGlzLnJlZnMubGVuZ3RoO2krKyl7aWYodGhpcy5yZWZzW2ldW2F0dHJdPT09dmFsdWUpe2xpbmtzLnB1c2godGhpcy5yZWZzW2ldKTt9fQpyZXR1cm4gbGlua3M7fSxzZXQ6ZnVuY3Rpb24obGluayl7dGhpcy5yZWZzLnB1c2gobGluayk7cmV0dXJuIHRoaXM7fSxoYXM6ZnVuY3Rpb24oYXR0cix2YWx1ZSl7cmV0dXJuIHRoaXMuZ2V0KGF0dHIsdmFsdWUpIT1udWxsO30scGFyc2U6ZnVuY3Rpb24odmFsdWUpe3ZhbHVlPXRyaW0odmFsdWUpLnJlcGxhY2UoL1xyP1xuW1x4MjBceDA5XSsvZywnJyk7dmFyIG1hdGNoPW51bGw7d2hpbGUobWF0Y2g9TGluay5wYXR0ZXJuLmV4ZWModmFsdWUpKXt2YXIgbGluaz1MaW5rLnBhcnNlQXR0cnMoe3VyaTptYXRjaFsxXX0sbWF0Y2hbMF0pO3RoaXMucmVmcy5wdXNoKGxpbmspO30KcmV0dXJuIHRoaXM7fSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciByZWZzPVtdO3ZhciBsaW5rPScnO3ZhciByZWY9bnVsbDtmb3IodmFyIGk9MDtpPHRoaXMucmVmcy5sZW5ndGg7aSsrKXtyZWY9dGhpcy5yZWZzW2ldO2xpbms9T2JqZWN0LmtleXModGhpcy5yZWZzW2ldKS5yZWR1Y2UoZnVuY3Rpb24obGluayxhdHRyKXtpZihhdHRyPT09J3VyaScpcmV0dXJuIGxpbms7cmV0dXJuIGxpbmsrJzsgJytMaW5rLmZvcm1hdEF0dHJpYnV0ZShhdHRyLHJlZlthdHRyXSk7fSwnPCcrcmVmLnVyaSsnPicpO3JlZnMucHVzaChsaW5rKTt9CnJldHVybiByZWZzLmpvaW4oJywgJyk7fX07bW9kdWxlLmV4cG9ydHM9TGluazt9KS5jYWxsKHRoaXMseyJpc0J1ZmZlciI6cmVxdWlyZSgiLi4vLi4vLi4vbGlnaHRob3VzZS1leHRlbnNpb24vbm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIpfSk7fSx7Ii4uLy4uLy4uL2xpZ2h0aG91c2UtZXh0ZW5zaW9uL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiOjY1LCIuL3RyaW0iOjEyMCwicXVlcnlzdHJpbmciOjgwfV0sMTIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiB0cmltKHZhbHVlKXtyZXR1cm4gdmFsdWUucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csJycpO307fSx7fV0sMTIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgSW1hZ2VTU0lNOyhmdW5jdGlvbihJbWFnZVNTSU0peyd1c2Ugc3RyaWN0JzsoZnVuY3Rpb24oQ2hhbm5lbHMpe0NoYW5uZWxzW0NoYW5uZWxzWyJHcmV5Il09MV09IkdyZXkiO0NoYW5uZWxzW0NoYW5uZWxzWyJHcmV5QWxwaGEiXT0yXT0iR3JleUFscGhhIjtDaGFubmVsc1tDaGFubmVsc1siUkdCIl09M109IlJHQiI7Q2hhbm5lbHNbQ2hhbm5lbHNbIlJHQkFscGhhIl09NF09IlJHQkFscGhhIjt9KShJbWFnZVNTSU0uQ2hhbm5lbHN8fChJbWFnZVNTSU0uQ2hhbm5lbHM9e30pKTt2YXIgQ2hhbm5lbHM9SW1hZ2VTU0lNLkNoYW5uZWxzO2Z1bmN0aW9uIGNvbXBhcmUoaW1hZ2UxLGltYWdlMix3aW5kb3dTaXplLEsxLEsyLGx1bWluYW5jZSxiaXRzUGVyQ29tcG9uZW50KXtpZih3aW5kb3dTaXplPT09dm9pZCAwKXt3aW5kb3dTaXplPTg7fQppZihLMT09PXZvaWQgMCl7SzE9MC4wMTt9CmlmKEsyPT09dm9pZCAwKXtLMj0wLjAzO30KaWYobHVtaW5hbmNlPT09dm9pZCAwKXtsdW1pbmFuY2U9dHJ1ZTt9CmlmKGJpdHNQZXJDb21wb25lbnQ9PT12b2lkIDApe2JpdHNQZXJDb21wb25lbnQ9ODt9CmlmKGltYWdlMS53aWR0aCE9PWltYWdlMi53aWR0aHx8aW1hZ2UxLmhlaWdodCE9PWltYWdlMi5oZWlnaHQpe3Rocm93IG5ldyBFcnJvcignSW1hZ2VzIGhhdmUgZGlmZmVyZW50IHNpemVzIScpO30KdmFyIEw9KDE8PGJpdHNQZXJDb21wb25lbnQpLTE7dmFyIGMxPU1hdGgucG93KEsxKkwsMiksYzI9TWF0aC5wb3coSzIqTCwyKSxudW1XaW5kb3dzPTAsbXNzaW09MC4wO3ZhciBtY3M9MC4wO2Z1bmN0aW9uIGl0ZXJhdGlvbihsdW1hVmFsdWVzMSxsdW1hVmFsdWVzMixhdmVyYWdlTHVtYVZhbHVlMSxhdmVyYWdlTHVtYVZhbHVlMil7dmFyIHNpZ3h5LHNpZ3NxeCxzaWdzcXk7c2lneHk9c2lnc3F4PXNpZ3NxeT0wLjA7Zm9yKHZhciBpPTA7aTxsdW1hVmFsdWVzMS5sZW5ndGg7aSsrKXtzaWdzcXgrPU1hdGgucG93KGx1bWFWYWx1ZXMxW2ldLWF2ZXJhZ2VMdW1hVmFsdWUxLDIpO3NpZ3NxeSs9TWF0aC5wb3cobHVtYVZhbHVlczJbaV0tYXZlcmFnZUx1bWFWYWx1ZTIsMik7c2lneHkrPShsdW1hVmFsdWVzMVtpXS1hdmVyYWdlTHVtYVZhbHVlMSkqKGx1bWFWYWx1ZXMyW2ldLWF2ZXJhZ2VMdW1hVmFsdWUyKTt9CnZhciBudW1QaXhlbHNJbldpbj1sdW1hVmFsdWVzMS5sZW5ndGgtMTtzaWdzcXgvPW51bVBpeGVsc0luV2luO3NpZ3NxeS89bnVtUGl4ZWxzSW5XaW47c2lneHkvPW51bVBpeGVsc0luV2luO3ZhciBudW1lcmF0b3I9KDIqYXZlcmFnZUx1bWFWYWx1ZTEqYXZlcmFnZUx1bWFWYWx1ZTIrYzEpKigyKnNpZ3h5K2MyKTt2YXIgZGVub21pbmF0b3I9KE1hdGgucG93KGF2ZXJhZ2VMdW1hVmFsdWUxLDIpK01hdGgucG93KGF2ZXJhZ2VMdW1hVmFsdWUyLDIpK2MxKSooc2lnc3F4K3NpZ3NxeStjMik7bXNzaW0rPW51bWVyYXRvci9kZW5vbWluYXRvcjttY3MrPSgyKnNpZ3h5K2MyKS8oc2lnc3F4K3NpZ3NxeStjMik7bnVtV2luZG93cysrO30KSW50ZXJuYWxzLl9pdGVyYXRlKGltYWdlMSxpbWFnZTIsd2luZG93U2l6ZSxsdW1pbmFuY2UsaXRlcmF0aW9uKTtyZXR1cm57c3NpbTptc3NpbS9udW1XaW5kb3dzLG1jczptY3MvbnVtV2luZG93c307fQpJbWFnZVNTSU0uY29tcGFyZT1jb21wYXJlO3ZhciBJbnRlcm5hbHM7KGZ1bmN0aW9uKEludGVybmFscyl7ZnVuY3Rpb24gX2l0ZXJhdGUoaW1hZ2UxLGltYWdlMix3aW5kb3dTaXplLGx1bWluYW5jZSxjYWxsYmFjayl7dmFyIHdpZHRoPWltYWdlMS53aWR0aCxoZWlnaHQ9aW1hZ2UxLmhlaWdodDtmb3IodmFyIHk9MDt5PGhlaWdodDt5Kz13aW5kb3dTaXplKXtmb3IodmFyIHg9MDt4PHdpZHRoO3grPXdpbmRvd1NpemUpe3ZhciB3aW5kb3dXaWR0aD1NYXRoLm1pbih3aW5kb3dTaXplLHdpZHRoLXgpLHdpbmRvd0hlaWdodD1NYXRoLm1pbih3aW5kb3dTaXplLGhlaWdodC15KTt2YXIgbHVtYVZhbHVlczE9X2x1bWFWYWx1ZXNGb3JXaW5kb3coaW1hZ2UxLHgseSx3aW5kb3dXaWR0aCx3aW5kb3dIZWlnaHQsbHVtaW5hbmNlKSxsdW1hVmFsdWVzMj1fbHVtYVZhbHVlc0ZvcldpbmRvdyhpbWFnZTIseCx5LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCxsdW1pbmFuY2UpLGF2ZXJhZ2VMdW1hMT1fYXZlcmFnZUx1bWEobHVtYVZhbHVlczEpLGF2ZXJhZ2VMdW1hMj1fYXZlcmFnZUx1bWEobHVtYVZhbHVlczIpO2NhbGxiYWNrKGx1bWFWYWx1ZXMxLGx1bWFWYWx1ZXMyLGF2ZXJhZ2VMdW1hMSxhdmVyYWdlTHVtYTIpO319fQpJbnRlcm5hbHMuX2l0ZXJhdGU9X2l0ZXJhdGU7ZnVuY3Rpb24gX2x1bWFWYWx1ZXNGb3JXaW5kb3coaW1hZ2UseCx5LHdpZHRoLGhlaWdodCxsdW1pbmFuY2Upe3ZhciBhcnJheT1pbWFnZS5kYXRhLGx1bWFWYWx1ZXM9bmV3IEZsb2F0MzJBcnJheShuZXcgQXJyYXlCdWZmZXIod2lkdGgqaGVpZ2h0KjQpKSxjb3VudGVyPTA7dmFyIG1heGo9eStoZWlnaHQ7Zm9yKHZhciBqPXk7ajxtYXhqO2orKyl7dmFyIG9mZnNldD1qKmltYWdlLndpZHRoO3ZhciBpPShvZmZzZXQreCkqaW1hZ2UuY2hhbm5lbHM7dmFyIG1heGk9KG9mZnNldCt4K3dpZHRoKSppbWFnZS5jaGFubmVscztzd2l0Y2goaW1hZ2UuY2hhbm5lbHMpe2Nhc2UgMTp3aGlsZShpPG1heGkpe2x1bWFWYWx1ZXNbY291bnRlcisrXT1hcnJheVtpKytdO30KYnJlYWs7Y2FzZSAyOndoaWxlKGk8bWF4aSl7bHVtYVZhbHVlc1tjb3VudGVyKytdPWFycmF5W2krK10qKGFycmF5W2krK10vMjU1KTt9CmJyZWFrO2Nhc2UgMzppZihsdW1pbmFuY2Upe3doaWxlKGk8bWF4aSl7bHVtYVZhbHVlc1tjb3VudGVyKytdPWFycmF5W2krK10qMC4yMTI2NTUrYXJyYXlbaSsrXSowLjcxNTE1OCthcnJheVtpKytdKjAuMDcyMTg3O319ZWxzZQp7d2hpbGUoaTxtYXhpKXtsdW1hVmFsdWVzW2NvdW50ZXIrK109YXJyYXlbaSsrXSthcnJheVtpKytdK2FycmF5W2krK107fX0KYnJlYWs7Y2FzZSA0OmlmKGx1bWluYW5jZSl7d2hpbGUoaTxtYXhpKXtsdW1hVmFsdWVzW2NvdW50ZXIrK109KGFycmF5W2krK10qMC4yMTI2NTUrYXJyYXlbaSsrXSowLjcxNTE1OCthcnJheVtpKytdKjAuMDcyMTg3KSooYXJyYXlbaSsrXS8yNTUpO319ZWxzZQp7d2hpbGUoaTxtYXhpKXtsdW1hVmFsdWVzW2NvdW50ZXIrK109KGFycmF5W2krK10rYXJyYXlbaSsrXSthcnJheVtpKytdKSooYXJyYXlbaSsrXS8yNTUpO319CmJyZWFrO319CnJldHVybiBsdW1hVmFsdWVzO30KZnVuY3Rpb24gX2F2ZXJhZ2VMdW1hKGx1bWFWYWx1ZXMpe3ZhciBzdW1MdW1hPTAuMDtmb3IodmFyIGk9MDtpPGx1bWFWYWx1ZXMubGVuZ3RoO2krKyl7c3VtTHVtYSs9bHVtYVZhbHVlc1tpXTt9CnJldHVybiBzdW1MdW1hL2x1bWFWYWx1ZXMubGVuZ3RoO319KShJbnRlcm5hbHN8fChJbnRlcm5hbHM9e30pKTt9KShJbWFnZVNTSU18fChJbWFnZVNTSU09e30pKTttb2R1bGUuZXhwb3J0cz1JbWFnZVNTSU07fSx7fV0sMTIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZW5jb2RlPXJlcXVpcmUoJy4vbGliL2VuY29kZXInKSxkZWNvZGU9cmVxdWlyZSgnLi9saWIvZGVjb2RlcicpO21vZHVsZS5leHBvcnRzPXtlbmNvZGU6ZW5jb2RlLGRlY29kZTpkZWNvZGV9O30seyIuL2xpYi9kZWNvZGVyIjoxMjMsIi4vbGliL2VuY29kZXIiOjEyNH1dLDEyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKEJ1ZmZlcil7dmFyIEpwZWdJbWFnZT1mdW5jdGlvbiBqcGVnSW1hZ2UoKXsidXNlIHN0cmljdCI7dmFyIGRjdFppZ1phZz1uZXcgSW50MzJBcnJheShbMCwxLDgsMTYsOSwyLDMsMTAsMTcsMjQsMzIsMjUsMTgsMTEsNCw1LDEyLDE5LDI2LDMzLDQwLDQ4LDQxLDM0LDI3LDIwLDEzLDYsNywxNCwyMSwyOCwzNSw0Miw0OSw1Niw1Nyw1MCw0MywzNiwyOSwyMiwxNSwyMywzMCwzNyw0NCw1MSw1OCw1OSw1Miw0NSwzOCwzMSwzOSw0Niw1Myw2MCw2MSw1NCw0Nyw1NSw2Miw2M10pO3ZhciBkY3RDb3MxPTQwMTc7dmFyIGRjdFNpbjE9Nzk5O3ZhciBkY3RDb3MzPTM0MDY7dmFyIGRjdFNpbjM9MjI3Njt2YXIgZGN0Q29zNj0xNTY3O3ZhciBkY3RTaW42PTM3ODQ7dmFyIGRjdFNxcnQyPTU3OTM7dmFyIGRjdFNxcnQxZDI9Mjg5NjtmdW5jdGlvbiBjb25zdHJ1Y3Rvcigpe30KZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsdmFsdWVzKXt2YXIgaz0wLGNvZGU9W10saSxqLGxlbmd0aD0xNjt3aGlsZShsZW5ndGg+MCYmIWNvZGVMZW5ndGhzW2xlbmd0aC0xXSkKbGVuZ3RoLS07Y29kZS5wdXNoKHtjaGlsZHJlbjpbXSxpbmRleDowfSk7dmFyIHA9Y29kZVswXSxxO2ZvcihpPTA7aTxsZW5ndGg7aSsrKXtmb3Ioaj0wO2o8Y29kZUxlbmd0aHNbaV07aisrKXtwPWNvZGUucG9wKCk7cC5jaGlsZHJlbltwLmluZGV4XT12YWx1ZXNba107d2hpbGUocC5pbmRleD4wKXtwPWNvZGUucG9wKCk7fQpwLmluZGV4Kys7Y29kZS5wdXNoKHApO3doaWxlKGNvZGUubGVuZ3RoPD1pKXtjb2RlLnB1c2gocT17Y2hpbGRyZW46W10saW5kZXg6MH0pO3AuY2hpbGRyZW5bcC5pbmRleF09cS5jaGlsZHJlbjtwPXE7fQprKys7fQppZihpKzE8bGVuZ3RoKXtjb2RlLnB1c2gocT17Y2hpbGRyZW46W10saW5kZXg6MH0pO3AuY2hpbGRyZW5bcC5pbmRleF09cS5jaGlsZHJlbjtwPXE7fX0KcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47fQpmdW5jdGlvbiBkZWNvZGVTY2FuKGRhdGEsb2Zmc2V0LGZyYW1lLGNvbXBvbmVudHMscmVzZXRJbnRlcnZhbCxzcGVjdHJhbFN0YXJ0LHNwZWN0cmFsRW5kLHN1Y2Nlc3NpdmVQcmV2LHN1Y2Nlc3NpdmUpe3ZhciBwcmVjaXNpb249ZnJhbWUucHJlY2lzaW9uO3ZhciBzYW1wbGVzUGVyTGluZT1mcmFtZS5zYW1wbGVzUGVyTGluZTt2YXIgc2NhbkxpbmVzPWZyYW1lLnNjYW5MaW5lczt2YXIgbWN1c1BlckxpbmU9ZnJhbWUubWN1c1BlckxpbmU7dmFyIHByb2dyZXNzaXZlPWZyYW1lLnByb2dyZXNzaXZlO3ZhciBtYXhIPWZyYW1lLm1heEgsbWF4Vj1mcmFtZS5tYXhWO3ZhciBzdGFydE9mZnNldD1vZmZzZXQsYml0c0RhdGE9MCxiaXRzQ291bnQ9MDtmdW5jdGlvbiByZWFkQml0KCl7aWYoYml0c0NvdW50PjApe2JpdHNDb3VudC0tO3JldHVybiBiaXRzRGF0YT4+Yml0c0NvdW50JjE7fQpiaXRzRGF0YT1kYXRhW29mZnNldCsrXTtpZihiaXRzRGF0YT09MHhGRil7dmFyIG5leHRCeXRlPWRhdGFbb2Zmc2V0KytdO2lmKG5leHRCeXRlKXt0aHJvdyJ1bmV4cGVjdGVkIG1hcmtlcjogIisoYml0c0RhdGE8PDh8bmV4dEJ5dGUpLnRvU3RyaW5nKDE2KTt9fQpiaXRzQ291bnQ9NztyZXR1cm4gYml0c0RhdGE+Pj43O30KZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKXt2YXIgbm9kZT10cmVlLGJpdDt3aGlsZSgoYml0PXJlYWRCaXQoKSkhPT1udWxsKXtub2RlPW5vZGVbYml0XTtpZih0eXBlb2Ygbm9kZT09PSdudW1iZXInKQpyZXR1cm4gbm9kZTtpZih0eXBlb2Ygbm9kZSE9PSdvYmplY3QnKQp0aHJvdyJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiO30KcmV0dXJuIG51bGw7fQpmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCl7dmFyIG49MDt3aGlsZShsZW5ndGg+MCl7dmFyIGJpdD1yZWFkQml0KCk7aWYoYml0PT09bnVsbClyZXR1cm47bj1uPDwxfGJpdDtsZW5ndGgtLTt9CnJldHVybiBuO30KZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpe3ZhciBuPXJlY2VpdmUobGVuZ3RoKTtpZihuPj0xPDxsZW5ndGgtMSkKcmV0dXJuIG47cmV0dXJuIG4rKC0xPDxsZW5ndGgpKzE7fQpmdW5jdGlvbiBkZWNvZGVCYXNlbGluZShjb21wb25lbnQsenope3ZhciB0PWRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTt2YXIgZGlmZj10PT09MD8wOnJlY2VpdmVBbmRFeHRlbmQodCk7enpbMF09Y29tcG9uZW50LnByZWQrPWRpZmY7dmFyIGs9MTt3aGlsZShrPDY0KXt2YXIgcnM9ZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpO3ZhciBzPXJzJjE1LHI9cnM+PjQ7aWYocz09PTApe2lmKHI8MTUpCmJyZWFrO2srPTE2O2NvbnRpbnVlO30Kays9cjt2YXIgej1kY3RaaWdaYWdba107enpbel09cmVjZWl2ZUFuZEV4dGVuZChzKTtrKys7fX0KZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsenope3ZhciB0PWRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTt2YXIgZGlmZj10PT09MD8wOnJlY2VpdmVBbmRFeHRlbmQodCk8PHN1Y2Nlc3NpdmU7enpbMF09Y29tcG9uZW50LnByZWQrPWRpZmY7fQpmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LHp6KXt6elswXXw9cmVhZEJpdCgpPDxzdWNjZXNzaXZlO30KdmFyIGVvYnJ1bj0wO2Z1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LHp6KXtpZihlb2JydW4+MCl7ZW9icnVuLS07cmV0dXJuO30KdmFyIGs9c3BlY3RyYWxTdGFydCxlPXNwZWN0cmFsRW5kO3doaWxlKGs8PWUpe3ZhciBycz1kZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7dmFyIHM9cnMmMTUscj1ycz4+NDtpZihzPT09MCl7aWYocjwxNSl7ZW9icnVuPXJlY2VpdmUocikrKDE8PHIpLTE7YnJlYWs7fQprKz0xNjtjb250aW51ZTt9CmsrPXI7dmFyIHo9ZGN0WmlnWmFnW2tdO3p6W3pdPXJlY2VpdmVBbmRFeHRlbmQocykqKDE8PHN1Y2Nlc3NpdmUpO2srKzt9fQp2YXIgc3VjY2Vzc2l2ZUFDU3RhdGU9MCxzdWNjZXNzaXZlQUNOZXh0VmFsdWU7ZnVuY3Rpb24gZGVjb2RlQUNTdWNjZXNzaXZlKGNvbXBvbmVudCx6eil7dmFyIGs9c3BlY3RyYWxTdGFydCxlPXNwZWN0cmFsRW5kLHI9MDt3aGlsZShrPD1lKXt2YXIgej1kY3RaaWdaYWdba107c3dpdGNoKHN1Y2Nlc3NpdmVBQ1N0YXRlKXtjYXNlIDA6dmFyIHJzPWRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTt2YXIgcz1ycyYxNSxyPXJzPj40O2lmKHM9PT0wKXtpZihyPDE1KXtlb2JydW49cmVjZWl2ZShyKSsoMTw8cik7c3VjY2Vzc2l2ZUFDU3RhdGU9NDt9ZWxzZXtyPTE2O3N1Y2Nlc3NpdmVBQ1N0YXRlPTE7fX1lbHNle2lmKHMhPT0xKQp0aHJvdyJpbnZhbGlkIEFDbiBlbmNvZGluZyI7c3VjY2Vzc2l2ZUFDTmV4dFZhbHVlPXJlY2VpdmVBbmRFeHRlbmQocyk7c3VjY2Vzc2l2ZUFDU3RhdGU9cj8yOjM7fQpjb250aW51ZTtjYXNlIDE6Y2FzZSAyOmlmKHp6W3pdKQp6elt6XSs9cmVhZEJpdCgpPDxzdWNjZXNzaXZlO2Vsc2UKe3ItLTtpZihyPT09MCkKc3VjY2Vzc2l2ZUFDU3RhdGU9c3VjY2Vzc2l2ZUFDU3RhdGU9PTI/MzowO30KYnJlYWs7Y2FzZSAzOmlmKHp6W3pdKQp6elt6XSs9cmVhZEJpdCgpPDxzdWNjZXNzaXZlO2Vsc2UKe3p6W3pdPXN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTw8c3VjY2Vzc2l2ZTtzdWNjZXNzaXZlQUNTdGF0ZT0wO30KYnJlYWs7Y2FzZSA0OmlmKHp6W3pdKQp6elt6XSs9cmVhZEJpdCgpPDxzdWNjZXNzaXZlO2JyZWFrO30KaysrO30KaWYoc3VjY2Vzc2l2ZUFDU3RhdGU9PT00KXtlb2JydW4tLTtpZihlb2JydW49PT0wKQpzdWNjZXNzaXZlQUNTdGF0ZT0wO319CmZ1bmN0aW9uIGRlY29kZU1jdShjb21wb25lbnQsZGVjb2RlLG1jdSxyb3csY29sKXt2YXIgbWN1Um93PW1jdS9tY3VzUGVyTGluZXwwO3ZhciBtY3VDb2w9bWN1JW1jdXNQZXJMaW5lO3ZhciBibG9ja1Jvdz1tY3VSb3cqY29tcG9uZW50LnYrcm93O3ZhciBibG9ja0NvbD1tY3VDb2wqY29tcG9uZW50LmgrY29sO2RlY29kZShjb21wb25lbnQsY29tcG9uZW50LmJsb2Nrc1tibG9ja1Jvd11bYmxvY2tDb2xdKTt9CmZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCxkZWNvZGUsbWN1KXt2YXIgYmxvY2tSb3c9bWN1L2NvbXBvbmVudC5ibG9ja3NQZXJMaW5lfDA7dmFyIGJsb2NrQ29sPW1jdSVjb21wb25lbnQuYmxvY2tzUGVyTGluZTtkZWNvZGUoY29tcG9uZW50LGNvbXBvbmVudC5ibG9ja3NbYmxvY2tSb3ddW2Jsb2NrQ29sXSk7fQp2YXIgY29tcG9uZW50c0xlbmd0aD1jb21wb25lbnRzLmxlbmd0aDt2YXIgY29tcG9uZW50LGksaixrLG47dmFyIGRlY29kZUZuO2lmKHByb2dyZXNzaXZlKXtpZihzcGVjdHJhbFN0YXJ0PT09MCkKZGVjb2RlRm49c3VjY2Vzc2l2ZVByZXY9PT0wP2RlY29kZURDRmlyc3Q6ZGVjb2RlRENTdWNjZXNzaXZlO2Vsc2UKZGVjb2RlRm49c3VjY2Vzc2l2ZVByZXY9PT0wP2RlY29kZUFDRmlyc3Q6ZGVjb2RlQUNTdWNjZXNzaXZlO31lbHNle2RlY29kZUZuPWRlY29kZUJhc2VsaW5lO30KdmFyIG1jdT0wLG1hcmtlcjt2YXIgbWN1RXhwZWN0ZWQ7aWYoY29tcG9uZW50c0xlbmd0aD09MSl7bWN1RXhwZWN0ZWQ9Y29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lKmNvbXBvbmVudHNbMF0uYmxvY2tzUGVyQ29sdW1uO31lbHNle21jdUV4cGVjdGVkPW1jdXNQZXJMaW5lKmZyYW1lLm1jdXNQZXJDb2x1bW47fQppZighcmVzZXRJbnRlcnZhbClyZXNldEludGVydmFsPW1jdUV4cGVjdGVkO3ZhciBoLHY7d2hpbGUobWN1PG1jdUV4cGVjdGVkKXtmb3IoaT0wO2k8Y29tcG9uZW50c0xlbmd0aDtpKyspCmNvbXBvbmVudHNbaV0ucHJlZD0wO2VvYnJ1bj0wO2lmKGNvbXBvbmVudHNMZW5ndGg9PTEpe2NvbXBvbmVudD1jb21wb25lbnRzWzBdO2ZvcihuPTA7bjxyZXNldEludGVydmFsO24rKyl7ZGVjb2RlQmxvY2soY29tcG9uZW50LGRlY29kZUZuLG1jdSk7bWN1Kys7fX1lbHNle2ZvcihuPTA7bjxyZXNldEludGVydmFsO24rKyl7Zm9yKGk9MDtpPGNvbXBvbmVudHNMZW5ndGg7aSsrKXtjb21wb25lbnQ9Y29tcG9uZW50c1tpXTtoPWNvbXBvbmVudC5oO3Y9Y29tcG9uZW50LnY7Zm9yKGo9MDtqPHY7aisrKXtmb3Ioaz0wO2s8aDtrKyspe2RlY29kZU1jdShjb21wb25lbnQsZGVjb2RlRm4sbWN1LGosayk7fX19Cm1jdSsrO2lmKG1jdT09PW1jdUV4cGVjdGVkKWJyZWFrO319CmJpdHNDb3VudD0wO21hcmtlcj1kYXRhW29mZnNldF08PDh8ZGF0YVtvZmZzZXQrMV07aWYobWFya2VyPDB4RkYwMCl7dGhyb3cibWFya2VyIHdhcyBub3QgZm91bmQiO30KaWYobWFya2VyPj0weEZGRDAmJm1hcmtlcjw9MHhGRkQ3KXtvZmZzZXQrPTI7fWVsc2UKYnJlYWs7fQpyZXR1cm4gb2Zmc2V0LXN0YXJ0T2Zmc2V0O30KZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLGNvbXBvbmVudCl7dmFyIGxpbmVzPVtdO3ZhciBibG9ja3NQZXJMaW5lPWNvbXBvbmVudC5ibG9ja3NQZXJMaW5lO3ZhciBibG9ja3NQZXJDb2x1bW49Y29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbjt2YXIgc2FtcGxlc1BlckxpbmU9YmxvY2tzUGVyTGluZTw8Mzt2YXIgUj1uZXcgSW50MzJBcnJheSg2NCkscj1uZXcgVWludDhBcnJheSg2NCk7ZnVuY3Rpb24gcXVhbnRpemVBbmRJbnZlcnNlKHp6LGRhdGFPdXQsZGF0YUluKXt2YXIgcXQ9Y29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlO3ZhciB2MCx2MSx2Mix2Myx2NCx2NSx2Nix2Nyx0O3ZhciBwPWRhdGFJbjt2YXIgaTtmb3IoaT0wO2k8NjQ7aSsrKQpwW2ldPXp6W2ldKnF0W2ldO2ZvcihpPTA7aTw4OysraSl7dmFyIHJvdz04Kmk7aWYocFsxK3Jvd109PTAmJnBbMityb3ddPT0wJiZwWzMrcm93XT09MCYmcFs0K3Jvd109PTAmJnBbNStyb3ddPT0wJiZwWzYrcm93XT09MCYmcFs3K3Jvd109PTApe3Q9ZGN0U3FydDIqcFswK3Jvd10rNTEyPj4xMDtwWzArcm93XT10O3BbMStyb3ddPXQ7cFsyK3Jvd109dDtwWzMrcm93XT10O3BbNCtyb3ddPXQ7cFs1K3Jvd109dDtwWzYrcm93XT10O3BbNytyb3ddPXQ7Y29udGludWU7fQp2MD1kY3RTcXJ0MipwWzArcm93XSsxMjg+Pjg7djE9ZGN0U3FydDIqcFs0K3Jvd10rMTI4Pj44O3YyPXBbMityb3ddO3YzPXBbNityb3ddO3Y0PWRjdFNxcnQxZDIqKHBbMStyb3ddLXBbNytyb3ddKSsxMjg+Pjg7djc9ZGN0U3FydDFkMioocFsxK3Jvd10rcFs3K3Jvd10pKzEyOD4+ODt2NT1wWzMrcm93XTw8NDt2Nj1wWzUrcm93XTw8NDt0PXYwLXYxKzE+PjE7djA9djArdjErMT4+MTt2MT10O3Q9djIqZGN0U2luNit2MypkY3RDb3M2KzEyOD4+ODt2Mj12MipkY3RDb3M2LXYzKmRjdFNpbjYrMTI4Pj44O3YzPXQ7dD12NC12NisxPj4xO3Y0PXY0K3Y2KzE+PjE7djY9dDt0PXY3K3Y1KzE+PjE7djU9djctdjUrMT4+MTt2Nz10O3Q9djAtdjMrMT4+MTt2MD12MCt2MysxPj4xO3YzPXQ7dD12MS12MisxPj4xO3YxPXYxK3YyKzE+PjE7djI9dDt0PXY0KmRjdFNpbjMrdjcqZGN0Q29zMysyMDQ4Pj4xMjt2ND12NCpkY3RDb3MzLXY3KmRjdFNpbjMrMjA0OD4+MTI7djc9dDt0PXY1KmRjdFNpbjErdjYqZGN0Q29zMSsyMDQ4Pj4xMjt2NT12NSpkY3RDb3MxLXY2KmRjdFNpbjErMjA0OD4+MTI7djY9dDtwWzArcm93XT12MCt2NztwWzcrcm93XT12MC12NztwWzErcm93XT12MSt2NjtwWzYrcm93XT12MS12NjtwWzIrcm93XT12Mit2NTtwWzUrcm93XT12Mi12NTtwWzMrcm93XT12Myt2NDtwWzQrcm93XT12My12NDt9CmZvcihpPTA7aTw4OysraSl7dmFyIGNvbD1pO2lmKHBbMSo4K2NvbF09PTAmJnBbMio4K2NvbF09PTAmJnBbMyo4K2NvbF09PTAmJnBbNCo4K2NvbF09PTAmJnBbNSo4K2NvbF09PTAmJnBbNio4K2NvbF09PTAmJnBbNyo4K2NvbF09PTApe3Q9ZGN0U3FydDIqZGF0YUluW2krMF0rODE5Mj4+MTQ7cFswKjgrY29sXT10O3BbMSo4K2NvbF09dDtwWzIqOCtjb2xdPXQ7cFszKjgrY29sXT10O3BbNCo4K2NvbF09dDtwWzUqOCtjb2xdPXQ7cFs2KjgrY29sXT10O3BbNyo4K2NvbF09dDtjb250aW51ZTt9CnYwPWRjdFNxcnQyKnBbMCo4K2NvbF0rMjA0OD4+MTI7djE9ZGN0U3FydDIqcFs0KjgrY29sXSsyMDQ4Pj4xMjt2Mj1wWzIqOCtjb2xdO3YzPXBbNio4K2NvbF07djQ9ZGN0U3FydDFkMioocFsxKjgrY29sXS1wWzcqOCtjb2xdKSsyMDQ4Pj4xMjt2Nz1kY3RTcXJ0MWQyKihwWzEqOCtjb2xdK3BbNyo4K2NvbF0pKzIwNDg+PjEyO3Y1PXBbMyo4K2NvbF07djY9cFs1KjgrY29sXTt0PXYwLXYxKzE+PjE7djA9djArdjErMT4+MTt2MT10O3Q9djIqZGN0U2luNit2MypkY3RDb3M2KzIwNDg+PjEyO3YyPXYyKmRjdENvczYtdjMqZGN0U2luNisyMDQ4Pj4xMjt2Mz10O3Q9djQtdjYrMT4+MTt2ND12NCt2NisxPj4xO3Y2PXQ7dD12Nyt2NSsxPj4xO3Y1PXY3LXY1KzE+PjE7djc9dDt0PXYwLXYzKzE+PjE7djA9djArdjMrMT4+MTt2Mz10O3Q9djEtdjIrMT4+MTt2MT12MSt2MisxPj4xO3YyPXQ7dD12NCpkY3RTaW4zK3Y3KmRjdENvczMrMjA0OD4+MTI7djQ9djQqZGN0Q29zMy12NypkY3RTaW4zKzIwNDg+PjEyO3Y3PXQ7dD12NSpkY3RTaW4xK3Y2KmRjdENvczErMjA0OD4+MTI7djU9djUqZGN0Q29zMS12NipkY3RTaW4xKzIwNDg+PjEyO3Y2PXQ7cFswKjgrY29sXT12MCt2NztwWzcqOCtjb2xdPXYwLXY3O3BbMSo4K2NvbF09djErdjY7cFs2KjgrY29sXT12MS12NjtwWzIqOCtjb2xdPXYyK3Y1O3BbNSo4K2NvbF09djItdjU7cFszKjgrY29sXT12Myt2NDtwWzQqOCtjb2xdPXYzLXY0O30KZm9yKGk9MDtpPDY0OysraSl7dmFyIHNhbXBsZT0xMjgrKHBbaV0rOD4+NCk7ZGF0YU91dFtpXT1zYW1wbGU8MD8wOnNhbXBsZT4weEZGPzB4RkY6c2FtcGxlO319CnZhciBpLGo7Zm9yKHZhciBibG9ja1Jvdz0wO2Jsb2NrUm93PGJsb2Nrc1BlckNvbHVtbjtibG9ja1JvdysrKXt2YXIgc2NhbkxpbmU9YmxvY2tSb3c8PDM7Zm9yKGk9MDtpPDg7aSsrKQpsaW5lcy5wdXNoKG5ldyBVaW50OEFycmF5KHNhbXBsZXNQZXJMaW5lKSk7Zm9yKHZhciBibG9ja0NvbD0wO2Jsb2NrQ29sPGJsb2Nrc1BlckxpbmU7YmxvY2tDb2wrKyl7cXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudC5ibG9ja3NbYmxvY2tSb3ddW2Jsb2NrQ29sXSxyLFIpO3ZhciBvZmZzZXQ9MCxzYW1wbGU9YmxvY2tDb2w8PDM7Zm9yKGo9MDtqPDg7aisrKXt2YXIgbGluZT1saW5lc1tzY2FuTGluZStqXTtmb3IoaT0wO2k8ODtpKyspCmxpbmVbc2FtcGxlK2ldPXJbb2Zmc2V0KytdO319fQpyZXR1cm4gbGluZXM7fQpmdW5jdGlvbiBjbGFtcFRvOGJpdChhKXtyZXR1cm4gYTwwPzA6YT4yNTU/MjU1OmE7fQpjb25zdHJ1Y3Rvci5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24gbG9hZChwYXRoKXt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdCgpO3hoci5vcGVuKCJHRVQiLHBhdGgsdHJ1ZSk7eGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO3hoci5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZGF0YT1uZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fHhoci5tb3pSZXNwb25zZUFycmF5QnVmZmVyKTt0aGlzLnBhcnNlKGRhdGEpO2lmKHRoaXMub25sb2FkKQp0aGlzLm9ubG9hZCgpO30uYmluZCh0aGlzKTt4aHIuc2VuZChudWxsKTt9LHBhcnNlOmZ1bmN0aW9uIHBhcnNlKGRhdGEpe3ZhciBvZmZzZXQ9MCxsZW5ndGg9ZGF0YS5sZW5ndGg7ZnVuY3Rpb24gcmVhZFVpbnQxNigpe3ZhciB2YWx1ZT1kYXRhW29mZnNldF08PDh8ZGF0YVtvZmZzZXQrMV07b2Zmc2V0Kz0yO3JldHVybiB2YWx1ZTt9CmZ1bmN0aW9uIHJlYWREYXRhQmxvY2soKXt2YXIgbGVuZ3RoPXJlYWRVaW50MTYoKTt2YXIgYXJyYXk9ZGF0YS5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aC0yKTtvZmZzZXQrPWFycmF5Lmxlbmd0aDtyZXR1cm4gYXJyYXk7fQpmdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSl7dmFyIG1heEg9MCxtYXhWPTA7dmFyIGNvbXBvbmVudCxjb21wb25lbnRJZDtmb3IoY29tcG9uZW50SWQgaW4gZnJhbWUuY29tcG9uZW50cyl7aWYoZnJhbWUuY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnRJZCkpe2NvbXBvbmVudD1mcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudElkXTtpZihtYXhIPGNvbXBvbmVudC5oKW1heEg9Y29tcG9uZW50Lmg7aWYobWF4Vjxjb21wb25lbnQudiltYXhWPWNvbXBvbmVudC52O319CnZhciBtY3VzUGVyTGluZT1NYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUvOC9tYXhIKTt2YXIgbWN1c1BlckNvbHVtbj1NYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzLzgvbWF4Vik7Zm9yKGNvbXBvbmVudElkIGluIGZyYW1lLmNvbXBvbmVudHMpe2lmKGZyYW1lLmNvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoY29tcG9uZW50SWQpKXtjb21wb25lbnQ9ZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJZF07dmFyIGJsb2Nrc1BlckxpbmU9TWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zYW1wbGVzUGVyTGluZS84KSpjb21wb25lbnQuaC9tYXhIKTt2YXIgYmxvY2tzUGVyQ29sdW1uPU1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzLzgpKmNvbXBvbmVudC52L21heFYpO3ZhciBibG9ja3NQZXJMaW5lRm9yTWN1PW1jdXNQZXJMaW5lKmNvbXBvbmVudC5oO3ZhciBibG9ja3NQZXJDb2x1bW5Gb3JNY3U9bWN1c1BlckNvbHVtbipjb21wb25lbnQudjt2YXIgYmxvY2tzPVtdO2Zvcih2YXIgaT0wO2k8YmxvY2tzUGVyQ29sdW1uRm9yTWN1O2krKyl7dmFyIHJvdz1bXTtmb3IodmFyIGo9MDtqPGJsb2Nrc1BlckxpbmVGb3JNY3U7aisrKQpyb3cucHVzaChuZXcgSW50MzJBcnJheSg2NCkpO2Jsb2Nrcy5wdXNoKHJvdyk7fQpjb21wb25lbnQuYmxvY2tzUGVyTGluZT1ibG9ja3NQZXJMaW5lO2NvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW49YmxvY2tzUGVyQ29sdW1uO2NvbXBvbmVudC5ibG9ja3M9YmxvY2tzO319CmZyYW1lLm1heEg9bWF4SDtmcmFtZS5tYXhWPW1heFY7ZnJhbWUubWN1c1BlckxpbmU9bWN1c1BlckxpbmU7ZnJhbWUubWN1c1BlckNvbHVtbj1tY3VzUGVyQ29sdW1uO30KdmFyIGpmaWY9bnVsbDt2YXIgYWRvYmU9bnVsbDt2YXIgcGl4ZWxzPW51bGw7dmFyIGZyYW1lLHJlc2V0SW50ZXJ2YWw7dmFyIHF1YW50aXphdGlvblRhYmxlcz1bXSxmcmFtZXM9W107dmFyIGh1ZmZtYW5UYWJsZXNBQz1bXSxodWZmbWFuVGFibGVzREM9W107dmFyIGZpbGVNYXJrZXI9cmVhZFVpbnQxNigpO2lmKGZpbGVNYXJrZXIhPTB4RkZEOCl7dGhyb3ciU09JIG5vdCBmb3VuZCI7fQpmaWxlTWFya2VyPXJlYWRVaW50MTYoKTt3aGlsZShmaWxlTWFya2VyIT0weEZGRDkpe3ZhciBpLGosbDtzd2l0Y2goZmlsZU1hcmtlcil7Y2FzZSAweEZGMDA6YnJlYWs7Y2FzZSAweEZGRTA6Y2FzZSAweEZGRTE6Y2FzZSAweEZGRTI6Y2FzZSAweEZGRTM6Y2FzZSAweEZGRTQ6Y2FzZSAweEZGRTU6Y2FzZSAweEZGRTY6Y2FzZSAweEZGRTc6Y2FzZSAweEZGRTg6Y2FzZSAweEZGRTk6Y2FzZSAweEZGRUE6Y2FzZSAweEZGRUI6Y2FzZSAweEZGRUM6Y2FzZSAweEZGRUQ6Y2FzZSAweEZGRUU6Y2FzZSAweEZGRUY6Y2FzZSAweEZGRkU6dmFyIGFwcERhdGE9cmVhZERhdGFCbG9jaygpO2lmKGZpbGVNYXJrZXI9PT0weEZGRTApe2lmKGFwcERhdGFbMF09PT0weDRBJiZhcHBEYXRhWzFdPT09MHg0NiYmYXBwRGF0YVsyXT09PTB4NDkmJmFwcERhdGFbM109PT0weDQ2JiZhcHBEYXRhWzRdPT09MCl7amZpZj17dmVyc2lvbjp7bWFqb3I6YXBwRGF0YVs1XSxtaW5vcjphcHBEYXRhWzZdfSxkZW5zaXR5VW5pdHM6YXBwRGF0YVs3XSx4RGVuc2l0eTphcHBEYXRhWzhdPDw4fGFwcERhdGFbOV0seURlbnNpdHk6YXBwRGF0YVsxMF08PDh8YXBwRGF0YVsxMV0sdGh1bWJXaWR0aDphcHBEYXRhWzEyXSx0aHVtYkhlaWdodDphcHBEYXRhWzEzXSx0aHVtYkRhdGE6YXBwRGF0YS5zdWJhcnJheSgxNCwxNCszKmFwcERhdGFbMTJdKmFwcERhdGFbMTNdKX07fX0KaWYoZmlsZU1hcmtlcj09PTB4RkZFRSl7aWYoYXBwRGF0YVswXT09PTB4NDEmJmFwcERhdGFbMV09PT0weDY0JiZhcHBEYXRhWzJdPT09MHg2RiYmYXBwRGF0YVszXT09PTB4NjImJmFwcERhdGFbNF09PT0weDY1JiZhcHBEYXRhWzVdPT09MCl7YWRvYmU9e3ZlcnNpb246YXBwRGF0YVs2XSxmbGFnczA6YXBwRGF0YVs3XTw8OHxhcHBEYXRhWzhdLGZsYWdzMTphcHBEYXRhWzldPDw4fGFwcERhdGFbMTBdLHRyYW5zZm9ybUNvZGU6YXBwRGF0YVsxMV19O319CmJyZWFrO2Nhc2UgMHhGRkRCOnZhciBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGg9cmVhZFVpbnQxNigpO3ZhciBxdWFudGl6YXRpb25UYWJsZXNFbmQ9cXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoK29mZnNldC0yO3doaWxlKG9mZnNldDxxdWFudGl6YXRpb25UYWJsZXNFbmQpe3ZhciBxdWFudGl6YXRpb25UYWJsZVNwZWM9ZGF0YVtvZmZzZXQrK107dmFyIHRhYmxlRGF0YT1uZXcgSW50MzJBcnJheSg2NCk7aWYocXVhbnRpemF0aW9uVGFibGVTcGVjPj40PT09MCl7Zm9yKGo9MDtqPDY0O2orKyl7dmFyIHo9ZGN0WmlnWmFnW2pdO3RhYmxlRGF0YVt6XT1kYXRhW29mZnNldCsrXTt9fWVsc2UgaWYocXVhbnRpemF0aW9uVGFibGVTcGVjPj40PT09MSl7Zm9yKGo9MDtqPDY0O2orKyl7dmFyIHo9ZGN0WmlnWmFnW2pdO3RhYmxlRGF0YVt6XT1yZWFkVWludDE2KCk7fX1lbHNlCnRocm93IkRRVDogaW52YWxpZCB0YWJsZSBzcGVjIjtxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjJjE1XT10YWJsZURhdGE7fQpicmVhaztjYXNlIDB4RkZDMDpjYXNlIDB4RkZDMTpjYXNlIDB4RkZDMjpyZWFkVWludDE2KCk7ZnJhbWU9e307ZnJhbWUuZXh0ZW5kZWQ9ZmlsZU1hcmtlcj09PTB4RkZDMTtmcmFtZS5wcm9ncmVzc2l2ZT1maWxlTWFya2VyPT09MHhGRkMyO2ZyYW1lLnByZWNpc2lvbj1kYXRhW29mZnNldCsrXTtmcmFtZS5zY2FuTGluZXM9cmVhZFVpbnQxNigpO2ZyYW1lLnNhbXBsZXNQZXJMaW5lPXJlYWRVaW50MTYoKTtmcmFtZS5jb21wb25lbnRzPXt9O2ZyYW1lLmNvbXBvbmVudHNPcmRlcj1bXTt2YXIgY29tcG9uZW50c0NvdW50PWRhdGFbb2Zmc2V0KytdLGNvbXBvbmVudElkO3ZhciBtYXhIPTAsbWF4Vj0wO2ZvcihpPTA7aTxjb21wb25lbnRzQ291bnQ7aSsrKXtjb21wb25lbnRJZD1kYXRhW29mZnNldF07dmFyIGg9ZGF0YVtvZmZzZXQrMV0+PjQ7dmFyIHY9ZGF0YVtvZmZzZXQrMV0mMTU7dmFyIHFJZD1kYXRhW29mZnNldCsyXTtmcmFtZS5jb21wb25lbnRzT3JkZXIucHVzaChjb21wb25lbnRJZCk7ZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJZF09e2g6aCx2OnYscXVhbnRpemF0aW9uSWR4OnFJZH07b2Zmc2V0Kz0zO30KcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpO2ZyYW1lcy5wdXNoKGZyYW1lKTticmVhaztjYXNlIDB4RkZDNDp2YXIgaHVmZm1hbkxlbmd0aD1yZWFkVWludDE2KCk7Zm9yKGk9MjtpPGh1ZmZtYW5MZW5ndGg7KXt2YXIgaHVmZm1hblRhYmxlU3BlYz1kYXRhW29mZnNldCsrXTt2YXIgY29kZUxlbmd0aHM9bmV3IFVpbnQ4QXJyYXkoMTYpO3ZhciBjb2RlTGVuZ3RoU3VtPTA7Zm9yKGo9MDtqPDE2O2orKyxvZmZzZXQrKykKY29kZUxlbmd0aFN1bSs9Y29kZUxlbmd0aHNbal09ZGF0YVtvZmZzZXRdO3ZhciBodWZmbWFuVmFsdWVzPW5ldyBVaW50OEFycmF5KGNvZGVMZW5ndGhTdW0pO2ZvcihqPTA7ajxjb2RlTGVuZ3RoU3VtO2orKyxvZmZzZXQrKykKaHVmZm1hblZhbHVlc1tqXT1kYXRhW29mZnNldF07aSs9MTcrY29kZUxlbmd0aFN1bTsoaHVmZm1hblRhYmxlU3BlYz4+ND09PTA/aHVmZm1hblRhYmxlc0RDOmh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyYxNV09YnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsaHVmZm1hblZhbHVlcyk7fQpicmVhaztjYXNlIDB4RkZERDpyZWFkVWludDE2KCk7cmVzZXRJbnRlcnZhbD1yZWFkVWludDE2KCk7YnJlYWs7Y2FzZSAweEZGREE6dmFyIHNjYW5MZW5ndGg9cmVhZFVpbnQxNigpO3ZhciBzZWxlY3RvcnNDb3VudD1kYXRhW29mZnNldCsrXTt2YXIgY29tcG9uZW50cz1bXSxjb21wb25lbnQ7Zm9yKGk9MDtpPHNlbGVjdG9yc0NvdW50O2krKyl7Y29tcG9uZW50PWZyYW1lLmNvbXBvbmVudHNbZGF0YVtvZmZzZXQrK11dO3ZhciB0YWJsZVNwZWM9ZGF0YVtvZmZzZXQrK107Y29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDPWh1ZmZtYW5UYWJsZXNEQ1t0YWJsZVNwZWM+PjRdO2NvbXBvbmVudC5odWZmbWFuVGFibGVBQz1odWZmbWFuVGFibGVzQUNbdGFibGVTcGVjJjE1XTtjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTt9CnZhciBzcGVjdHJhbFN0YXJ0PWRhdGFbb2Zmc2V0KytdO3ZhciBzcGVjdHJhbEVuZD1kYXRhW29mZnNldCsrXTt2YXIgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb249ZGF0YVtvZmZzZXQrK107dmFyIHByb2Nlc3NlZD1kZWNvZGVTY2FuKGRhdGEsb2Zmc2V0LGZyYW1lLGNvbXBvbmVudHMscmVzZXRJbnRlcnZhbCxzcGVjdHJhbFN0YXJ0LHNwZWN0cmFsRW5kLHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uPj40LHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uJjE1KTtvZmZzZXQrPXByb2Nlc3NlZDticmVhaztkZWZhdWx0OmlmKGRhdGFbb2Zmc2V0LTNdPT0weEZGJiZkYXRhW29mZnNldC0yXT49MHhDMCYmZGF0YVtvZmZzZXQtMl08PTB4RkUpe29mZnNldC09MzticmVhazt9CnRocm93InVua25vd24gSlBFRyBtYXJrZXIgIitmaWxlTWFya2VyLnRvU3RyaW5nKDE2KTt9CmZpbGVNYXJrZXI9cmVhZFVpbnQxNigpO30KaWYoZnJhbWVzLmxlbmd0aCE9MSkKdGhyb3cib25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIjtmb3IodmFyIGk9MDtpPGZyYW1lcy5sZW5ndGg7aSsrKXt2YXIgY3A9ZnJhbWVzW2ldLmNvbXBvbmVudHM7Zm9yKHZhciBqIGluIGNwKXtjcFtqXS5xdWFudGl6YXRpb25UYWJsZT1xdWFudGl6YXRpb25UYWJsZXNbY3Bbal0ucXVhbnRpemF0aW9uSWR4XTtkZWxldGUgY3Bbal0ucXVhbnRpemF0aW9uSWR4O319CnRoaXMud2lkdGg9ZnJhbWUuc2FtcGxlc1BlckxpbmU7dGhpcy5oZWlnaHQ9ZnJhbWUuc2NhbkxpbmVzO3RoaXMuamZpZj1qZmlmO3RoaXMuYWRvYmU9YWRvYmU7dGhpcy5jb21wb25lbnRzPVtdO2Zvcih2YXIgaT0wO2k8ZnJhbWUuY29tcG9uZW50c09yZGVyLmxlbmd0aDtpKyspe3ZhciBjb21wb25lbnQ9ZnJhbWUuY29tcG9uZW50c1tmcmFtZS5jb21wb25lbnRzT3JkZXJbaV1dO3RoaXMuY29tcG9uZW50cy5wdXNoKHtsaW5lczpidWlsZENvbXBvbmVudERhdGEoZnJhbWUsY29tcG9uZW50KSxzY2FsZVg6Y29tcG9uZW50LmgvZnJhbWUubWF4SCxzY2FsZVk6Y29tcG9uZW50LnYvZnJhbWUubWF4Vn0pO319LGdldERhdGE6ZnVuY3Rpb24gZ2V0RGF0YSh3aWR0aCxoZWlnaHQpe3ZhciBzY2FsZVg9dGhpcy53aWR0aC93aWR0aCxzY2FsZVk9dGhpcy5oZWlnaHQvaGVpZ2h0O3ZhciBjb21wb25lbnQxLGNvbXBvbmVudDIsY29tcG9uZW50Myxjb21wb25lbnQ0O3ZhciBjb21wb25lbnQxTGluZSxjb21wb25lbnQyTGluZSxjb21wb25lbnQzTGluZSxjb21wb25lbnQ0TGluZTt2YXIgeCx5O3ZhciBvZmZzZXQ9MDt2YXIgWSxDYixDcixLLEMsTSxZZSxSLEcsQjt2YXIgY29sb3JUcmFuc2Zvcm07dmFyIGRhdGFMZW5ndGg9d2lkdGgqaGVpZ2h0KnRoaXMuY29tcG9uZW50cy5sZW5ndGg7dmFyIGRhdGE9bmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7c3dpdGNoKHRoaXMuY29tcG9uZW50cy5sZW5ndGgpe2Nhc2UgMTpjb21wb25lbnQxPXRoaXMuY29tcG9uZW50c1swXTtmb3IoeT0wO3k8aGVpZ2h0O3krKyl7Y29tcG9uZW50MUxpbmU9Y29tcG9uZW50MS5saW5lc1swfHkqY29tcG9uZW50MS5zY2FsZVkqc2NhbGVZXTtmb3IoeD0wO3g8d2lkdGg7eCsrKXtZPWNvbXBvbmVudDFMaW5lWzB8eCpjb21wb25lbnQxLnNjYWxlWCpzY2FsZVhdO2RhdGFbb2Zmc2V0KytdPVk7fX0KYnJlYWs7Y2FzZSAyOmNvbXBvbmVudDE9dGhpcy5jb21wb25lbnRzWzBdO2NvbXBvbmVudDI9dGhpcy5jb21wb25lbnRzWzFdO2Zvcih5PTA7eTxoZWlnaHQ7eSsrKXtjb21wb25lbnQxTGluZT1jb21wb25lbnQxLmxpbmVzWzB8eSpjb21wb25lbnQxLnNjYWxlWSpzY2FsZVldO2NvbXBvbmVudDJMaW5lPWNvbXBvbmVudDIubGluZXNbMHx5KmNvbXBvbmVudDIuc2NhbGVZKnNjYWxlWV07Zm9yKHg9MDt4PHdpZHRoO3grKyl7WT1jb21wb25lbnQxTGluZVswfHgqY29tcG9uZW50MS5zY2FsZVgqc2NhbGVYXTtkYXRhW29mZnNldCsrXT1ZO1k9Y29tcG9uZW50MkxpbmVbMHx4KmNvbXBvbmVudDIuc2NhbGVYKnNjYWxlWF07ZGF0YVtvZmZzZXQrK109WTt9fQpicmVhaztjYXNlIDM6Y29sb3JUcmFuc2Zvcm09dHJ1ZTtpZih0aGlzLmFkb2JlJiZ0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGUpCmNvbG9yVHJhbnNmb3JtPXRydWU7ZWxzZQppZih0eXBlb2YgdGhpcy5jb2xvclRyYW5zZm9ybSE9PSd1bmRlZmluZWQnKQpjb2xvclRyYW5zZm9ybT0hIXRoaXMuY29sb3JUcmFuc2Zvcm07Y29tcG9uZW50MT10aGlzLmNvbXBvbmVudHNbMF07Y29tcG9uZW50Mj10aGlzLmNvbXBvbmVudHNbMV07Y29tcG9uZW50Mz10aGlzLmNvbXBvbmVudHNbMl07Zm9yKHk9MDt5PGhlaWdodDt5Kyspe2NvbXBvbmVudDFMaW5lPWNvbXBvbmVudDEubGluZXNbMHx5KmNvbXBvbmVudDEuc2NhbGVZKnNjYWxlWV07Y29tcG9uZW50MkxpbmU9Y29tcG9uZW50Mi5saW5lc1swfHkqY29tcG9uZW50Mi5zY2FsZVkqc2NhbGVZXTtjb21wb25lbnQzTGluZT1jb21wb25lbnQzLmxpbmVzWzB8eSpjb21wb25lbnQzLnNjYWxlWSpzY2FsZVldO2Zvcih4PTA7eDx3aWR0aDt4Kyspe2lmKCFjb2xvclRyYW5zZm9ybSl7Uj1jb21wb25lbnQxTGluZVswfHgqY29tcG9uZW50MS5zY2FsZVgqc2NhbGVYXTtHPWNvbXBvbmVudDJMaW5lWzB8eCpjb21wb25lbnQyLnNjYWxlWCpzY2FsZVhdO0I9Y29tcG9uZW50M0xpbmVbMHx4KmNvbXBvbmVudDMuc2NhbGVYKnNjYWxlWF07fWVsc2V7WT1jb21wb25lbnQxTGluZVswfHgqY29tcG9uZW50MS5zY2FsZVgqc2NhbGVYXTtDYj1jb21wb25lbnQyTGluZVswfHgqY29tcG9uZW50Mi5zY2FsZVgqc2NhbGVYXTtDcj1jb21wb25lbnQzTGluZVswfHgqY29tcG9uZW50My5zY2FsZVgqc2NhbGVYXTtSPWNsYW1wVG84Yml0KFkrMS40MDIqKENyLTEyOCkpO0c9Y2xhbXBUbzhiaXQoWS0wLjM0NDEzNjMqKENiLTEyOCktMC43MTQxMzYzNiooQ3ItMTI4KSk7Qj1jbGFtcFRvOGJpdChZKzEuNzcyKihDYi0xMjgpKTt9CmRhdGFbb2Zmc2V0KytdPVI7ZGF0YVtvZmZzZXQrK109RztkYXRhW29mZnNldCsrXT1CO319CmJyZWFrO2Nhc2UgNDppZighdGhpcy5hZG9iZSkKdGhyb3cnVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSAoNCBjb21wb25lbnRzKSc7Y29sb3JUcmFuc2Zvcm09ZmFsc2U7aWYodGhpcy5hZG9iZSYmdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlKQpjb2xvclRyYW5zZm9ybT10cnVlO2Vsc2UKaWYodHlwZW9mIHRoaXMuY29sb3JUcmFuc2Zvcm0hPT0ndW5kZWZpbmVkJykKY29sb3JUcmFuc2Zvcm09ISF0aGlzLmNvbG9yVHJhbnNmb3JtO2NvbXBvbmVudDE9dGhpcy5jb21wb25lbnRzWzBdO2NvbXBvbmVudDI9dGhpcy5jb21wb25lbnRzWzFdO2NvbXBvbmVudDM9dGhpcy5jb21wb25lbnRzWzJdO2NvbXBvbmVudDQ9dGhpcy5jb21wb25lbnRzWzNdO2Zvcih5PTA7eTxoZWlnaHQ7eSsrKXtjb21wb25lbnQxTGluZT1jb21wb25lbnQxLmxpbmVzWzB8eSpjb21wb25lbnQxLnNjYWxlWSpzY2FsZVldO2NvbXBvbmVudDJMaW5lPWNvbXBvbmVudDIubGluZXNbMHx5KmNvbXBvbmVudDIuc2NhbGVZKnNjYWxlWV07Y29tcG9uZW50M0xpbmU9Y29tcG9uZW50My5saW5lc1swfHkqY29tcG9uZW50My5zY2FsZVkqc2NhbGVZXTtjb21wb25lbnQ0TGluZT1jb21wb25lbnQ0LmxpbmVzWzB8eSpjb21wb25lbnQ0LnNjYWxlWSpzY2FsZVldO2Zvcih4PTA7eDx3aWR0aDt4Kyspe2lmKCFjb2xvclRyYW5zZm9ybSl7Qz1jb21wb25lbnQxTGluZVswfHgqY29tcG9uZW50MS5zY2FsZVgqc2NhbGVYXTtNPWNvbXBvbmVudDJMaW5lWzB8eCpjb21wb25lbnQyLnNjYWxlWCpzY2FsZVhdO1llPWNvbXBvbmVudDNMaW5lWzB8eCpjb21wb25lbnQzLnNjYWxlWCpzY2FsZVhdO0s9Y29tcG9uZW50NExpbmVbMHx4KmNvbXBvbmVudDQuc2NhbGVYKnNjYWxlWF07fWVsc2V7WT1jb21wb25lbnQxTGluZVswfHgqY29tcG9uZW50MS5zY2FsZVgqc2NhbGVYXTtDYj1jb21wb25lbnQyTGluZVswfHgqY29tcG9uZW50Mi5zY2FsZVgqc2NhbGVYXTtDcj1jb21wb25lbnQzTGluZVswfHgqY29tcG9uZW50My5zY2FsZVgqc2NhbGVYXTtLPWNvbXBvbmVudDRMaW5lWzB8eCpjb21wb25lbnQ0LnNjYWxlWCpzY2FsZVhdO0M9MjU1LWNsYW1wVG84Yml0KFkrMS40MDIqKENyLTEyOCkpO009MjU1LWNsYW1wVG84Yml0KFktMC4zNDQxMzYzKihDYi0xMjgpLTAuNzE0MTM2MzYqKENyLTEyOCkpO1llPTI1NS1jbGFtcFRvOGJpdChZKzEuNzcyKihDYi0xMjgpKTt9CmRhdGFbb2Zmc2V0KytdPTI1NS1DO2RhdGFbb2Zmc2V0KytdPTI1NS1NO2RhdGFbb2Zmc2V0KytdPTI1NS1ZZTtkYXRhW29mZnNldCsrXT0yNTUtSzt9fQpicmVhaztkZWZhdWx0OnRocm93J1Vuc3VwcG9ydGVkIGNvbG9yIG1vZGUnO30KcmV0dXJuIGRhdGE7fSxjb3B5VG9JbWFnZURhdGE6ZnVuY3Rpb24gY29weVRvSW1hZ2VEYXRhKGltYWdlRGF0YSl7dmFyIHdpZHRoPWltYWdlRGF0YS53aWR0aCxoZWlnaHQ9aW1hZ2VEYXRhLmhlaWdodDt2YXIgaW1hZ2VEYXRhQXJyYXk9aW1hZ2VEYXRhLmRhdGE7dmFyIGRhdGE9dGhpcy5nZXREYXRhKHdpZHRoLGhlaWdodCk7dmFyIGk9MCxqPTAseCx5O3ZhciBZLEssQyxNLFIsRyxCO3N3aXRjaCh0aGlzLmNvbXBvbmVudHMubGVuZ3RoKXtjYXNlIDE6Zm9yKHk9MDt5PGhlaWdodDt5Kyspe2Zvcih4PTA7eDx3aWR0aDt4Kyspe1k9ZGF0YVtpKytdO2ltYWdlRGF0YUFycmF5W2orK109WTtpbWFnZURhdGFBcnJheVtqKytdPVk7aW1hZ2VEYXRhQXJyYXlbaisrXT1ZO2ltYWdlRGF0YUFycmF5W2orK109MjU1O319CmJyZWFrO2Nhc2UgMzpmb3IoeT0wO3k8aGVpZ2h0O3krKyl7Zm9yKHg9MDt4PHdpZHRoO3grKyl7Uj1kYXRhW2krK107Rz1kYXRhW2krK107Qj1kYXRhW2krK107aW1hZ2VEYXRhQXJyYXlbaisrXT1SO2ltYWdlRGF0YUFycmF5W2orK109RztpbWFnZURhdGFBcnJheVtqKytdPUI7aW1hZ2VEYXRhQXJyYXlbaisrXT0yNTU7fX0KYnJlYWs7Y2FzZSA0OmZvcih5PTA7eTxoZWlnaHQ7eSsrKXtmb3IoeD0wO3g8d2lkdGg7eCsrKXtDPWRhdGFbaSsrXTtNPWRhdGFbaSsrXTtZPWRhdGFbaSsrXTtLPWRhdGFbaSsrXTtSPTI1NS1jbGFtcFRvOGJpdChDKigxLUsvMjU1KStLKTtHPTI1NS1jbGFtcFRvOGJpdChNKigxLUsvMjU1KStLKTtCPTI1NS1jbGFtcFRvOGJpdChZKigxLUsvMjU1KStLKTtpbWFnZURhdGFBcnJheVtqKytdPVI7aW1hZ2VEYXRhQXJyYXlbaisrXT1HO2ltYWdlRGF0YUFycmF5W2orK109QjtpbWFnZURhdGFBcnJheVtqKytdPTI1NTt9fQpicmVhaztkZWZhdWx0OnRocm93J1Vuc3VwcG9ydGVkIGNvbG9yIG1vZGUnO319fTtyZXR1cm4gY29uc3RydWN0b3I7fSgpO21vZHVsZS5leHBvcnRzPWRlY29kZTtmdW5jdGlvbiBkZWNvZGUoanBlZ0RhdGEpe3ZhciBhcnI9bmV3IFVpbnQ4QXJyYXkoanBlZ0RhdGEpO3ZhciBkZWNvZGVyPW5ldyBKcGVnSW1hZ2UoKTtkZWNvZGVyLnBhcnNlKGFycik7dmFyIGltYWdlPXt3aWR0aDpkZWNvZGVyLndpZHRoLGhlaWdodDpkZWNvZGVyLmhlaWdodCxkYXRhOm5ldyBCdWZmZXIoZGVjb2Rlci53aWR0aCpkZWNvZGVyLmhlaWdodCo0KX07ZGVjb2Rlci5jb3B5VG9JbWFnZURhdGEoaW1hZ2UpO3JldHVybiBpbWFnZTt9fSkuY2FsbCh0aGlzLHJlcXVpcmUoImJ1ZmZlciIpLkJ1ZmZlcik7fSx7ImJ1ZmZlciI6NjB9XSwxMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihCdWZmZXIpe3ZhciBidG9hPWJ0b2F8fGZ1bmN0aW9uKGJ1Zil7cmV0dXJuIG5ldyBCdWZmZXIoYnVmKS50b1N0cmluZygnYmFzZTY0Jyk7fTtmdW5jdGlvbiBKUEVHRW5jb2RlcihxdWFsaXR5KXt2YXIgc2VsZj10aGlzO3ZhciBmcm91bmQ9TWF0aC5yb3VuZDt2YXIgZmZsb29yPU1hdGguZmxvb3I7dmFyIFlUYWJsZT1uZXcgQXJyYXkoNjQpO3ZhciBVVlRhYmxlPW5ldyBBcnJheSg2NCk7dmFyIGZkdGJsX1k9bmV3IEFycmF5KDY0KTt2YXIgZmR0YmxfVVY9bmV3IEFycmF5KDY0KTt2YXIgWURDX0hUO3ZhciBVVkRDX0hUO3ZhciBZQUNfSFQ7dmFyIFVWQUNfSFQ7dmFyIGJpdGNvZGU9bmV3IEFycmF5KDY1NTM1KTt2YXIgY2F0ZWdvcnk9bmV3IEFycmF5KDY1NTM1KTt2YXIgb3V0cHV0ZkRDVFF1YW50PW5ldyBBcnJheSg2NCk7dmFyIERVPW5ldyBBcnJheSg2NCk7dmFyIGJ5dGVvdXQ9W107dmFyIGJ5dGVuZXc9MDt2YXIgYnl0ZXBvcz03O3ZhciBZRFU9bmV3IEFycmF5KDY0KTt2YXIgVURVPW5ldyBBcnJheSg2NCk7dmFyIFZEVT1uZXcgQXJyYXkoNjQpO3ZhciBjbHQ9bmV3IEFycmF5KDI1Nik7dmFyIFJHQl9ZVVZfVEFCTEU9bmV3IEFycmF5KDIwNDgpO3ZhciBjdXJyZW50UXVhbGl0eTt2YXIgWmlnWmFnPVswLDEsNSw2LDE0LDE1LDI3LDI4LDIsNCw3LDEzLDE2LDI2LDI5LDQyLDMsOCwxMiwxNywyNSwzMCw0MSw0Myw5LDExLDE4LDI0LDMxLDQwLDQ0LDUzLDEwLDE5LDIzLDMyLDM5LDQ1LDUyLDU0LDIwLDIyLDMzLDM4LDQ2LDUxLDU1LDYwLDIxLDM0LDM3LDQ3LDUwLDU2LDU5LDYxLDM1LDM2LDQ4LDQ5LDU3LDU4LDYyLDYzXTt2YXIgc3RkX2RjX2x1bWluYW5jZV9ucmNvZGVzPVswLDAsMSw1LDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDBdO3ZhciBzdGRfZGNfbHVtaW5hbmNlX3ZhbHVlcz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV07dmFyIHN0ZF9hY19sdW1pbmFuY2VfbnJjb2Rlcz1bMCwwLDIsMSwzLDMsMiw0LDMsNSw1LDQsNCwwLDAsMSwweDdkXTt2YXIgc3RkX2FjX2x1bWluYW5jZV92YWx1ZXM9WzB4MDEsMHgwMiwweDAzLDB4MDAsMHgwNCwweDExLDB4MDUsMHgxMiwweDIxLDB4MzEsMHg0MSwweDA2LDB4MTMsMHg1MSwweDYxLDB4MDcsMHgyMiwweDcxLDB4MTQsMHgzMiwweDgxLDB4OTEsMHhhMSwweDA4LDB4MjMsMHg0MiwweGIxLDB4YzEsMHgxNSwweDUyLDB4ZDEsMHhmMCwweDI0LDB4MzMsMHg2MiwweDcyLDB4ODIsMHgwOSwweDBhLDB4MTYsMHgxNywweDE4LDB4MTksMHgxYSwweDI1LDB4MjYsMHgyNywweDI4LDB4MjksMHgyYSwweDM0LDB4MzUsMHgzNiwweDM3LDB4MzgsMHgzOSwweDNhLDB4NDMsMHg0NCwweDQ1LDB4NDYsMHg0NywweDQ4LDB4NDksMHg0YSwweDUzLDB4NTQsMHg1NSwweDU2LDB4NTcsMHg1OCwweDU5LDB4NWEsMHg2MywweDY0LDB4NjUsMHg2NiwweDY3LDB4NjgsMHg2OSwweDZhLDB4NzMsMHg3NCwweDc1LDB4NzYsMHg3NywweDc4LDB4NzksMHg3YSwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OGEsMHg5MiwweDkzLDB4OTQsMHg5NSwweDk2LDB4OTcsMHg5OCwweDk5LDB4OWEsMHhhMiwweGEzLDB4YTQsMHhhNSwweGE2LDB4YTcsMHhhOCwweGE5LDB4YWEsMHhiMiwweGIzLDB4YjQsMHhiNSwweGI2LDB4YjcsMHhiOCwweGI5LDB4YmEsMHhjMiwweGMzLDB4YzQsMHhjNSwweGM2LDB4YzcsMHhjOCwweGM5LDB4Y2EsMHhkMiwweGQzLDB4ZDQsMHhkNSwweGQ2LDB4ZDcsMHhkOCwweGQ5LDB4ZGEsMHhlMSwweGUyLDB4ZTMsMHhlNCwweGU1LDB4ZTYsMHhlNywweGU4LDB4ZTksMHhlYSwweGYxLDB4ZjIsMHhmMywweGY0LDB4ZjUsMHhmNiwweGY3LDB4ZjgsMHhmOSwweGZhXTt2YXIgc3RkX2RjX2Nocm9taW5hbmNlX25yY29kZXM9WzAsMCwzLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMF07dmFyIHN0ZF9kY19jaHJvbWluYW5jZV92YWx1ZXM9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdO3ZhciBzdGRfYWNfY2hyb21pbmFuY2VfbnJjb2Rlcz1bMCwwLDIsMSwyLDQsNCwzLDQsNyw1LDQsNCwwLDEsMiwweDc3XTt2YXIgc3RkX2FjX2Nocm9taW5hbmNlX3ZhbHVlcz1bMHgwMCwweDAxLDB4MDIsMHgwMywweDExLDB4MDQsMHgwNSwweDIxLDB4MzEsMHgwNiwweDEyLDB4NDEsMHg1MSwweDA3LDB4NjEsMHg3MSwweDEzLDB4MjIsMHgzMiwweDgxLDB4MDgsMHgxNCwweDQyLDB4OTEsMHhhMSwweGIxLDB4YzEsMHgwOSwweDIzLDB4MzMsMHg1MiwweGYwLDB4MTUsMHg2MiwweDcyLDB4ZDEsMHgwYSwweDE2LDB4MjQsMHgzNCwweGUxLDB4MjUsMHhmMSwweDE3LDB4MTgsMHgxOSwweDFhLDB4MjYsMHgyNywweDI4LDB4MjksMHgyYSwweDM1LDB4MzYsMHgzNywweDM4LDB4MzksMHgzYSwweDQzLDB4NDQsMHg0NSwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NGEsMHg1MywweDU0LDB4NTUsMHg1NiwweDU3LDB4NTgsMHg1OSwweDVhLDB4NjMsMHg2NCwweDY1LDB4NjYsMHg2NywweDY4LDB4NjksMHg2YSwweDczLDB4NzQsMHg3NSwweDc2LDB4NzcsMHg3OCwweDc5LDB4N2EsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OGEsMHg5MiwweDkzLDB4OTQsMHg5NSwweDk2LDB4OTcsMHg5OCwweDk5LDB4OWEsMHhhMiwweGEzLDB4YTQsMHhhNSwweGE2LDB4YTcsMHhhOCwweGE5LDB4YWEsMHhiMiwweGIzLDB4YjQsMHhiNSwweGI2LDB4YjcsMHhiOCwweGI5LDB4YmEsMHhjMiwweGMzLDB4YzQsMHhjNSwweGM2LDB4YzcsMHhjOCwweGM5LDB4Y2EsMHhkMiwweGQzLDB4ZDQsMHhkNSwweGQ2LDB4ZDcsMHhkOCwweGQ5LDB4ZGEsMHhlMiwweGUzLDB4ZTQsMHhlNSwweGU2LDB4ZTcsMHhlOCwweGU5LDB4ZWEsMHhmMiwweGYzLDB4ZjQsMHhmNSwweGY2LDB4ZjcsMHhmOCwweGY5LDB4ZmFdO2Z1bmN0aW9uIGluaXRRdWFudFRhYmxlcyhzZil7dmFyIFlRVD1bMTYsMTEsMTAsMTYsMjQsNDAsNTEsNjEsMTIsMTIsMTQsMTksMjYsNTgsNjAsNTUsMTQsMTMsMTYsMjQsNDAsNTcsNjksNTYsMTQsMTcsMjIsMjksNTEsODcsODAsNjIsMTgsMjIsMzcsNTYsNjgsMTA5LDEwMyw3NywyNCwzNSw1NSw2NCw4MSwxMDQsMTEzLDkyLDQ5LDY0LDc4LDg3LDEwMywxMjEsMTIwLDEwMSw3Miw5Miw5NSw5OCwxMTIsMTAwLDEwMyw5OV07Zm9yKHZhciBpPTA7aTw2NDtpKyspe3ZhciB0PWZmbG9vcigoWVFUW2ldKnNmKzUwKS8xMDApO2lmKHQ8MSl7dD0xO31lbHNlIGlmKHQ+MjU1KXt0PTI1NTt9CllUYWJsZVtaaWdaYWdbaV1dPXQ7fQp2YXIgVVZRVD1bMTcsMTgsMjQsNDcsOTksOTksOTksOTksMTgsMjEsMjYsNjYsOTksOTksOTksOTksMjQsMjYsNTYsOTksOTksOTksOTksOTksNDcsNjYsOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTldO2Zvcih2YXIgaj0wO2o8NjQ7aisrKXt2YXIgdT1mZmxvb3IoKFVWUVRbal0qc2YrNTApLzEwMCk7aWYodTwxKXt1PTE7fWVsc2UgaWYodT4yNTUpe3U9MjU1O30KVVZUYWJsZVtaaWdaYWdbal1dPXU7fQp2YXIgYWFzZj1bMS4wLDEuMzg3MDM5ODQ1LDEuMzA2NTYyOTY1LDEuMTc1ODc1NjAyLDEuMCwwLjc4NTY5NDk1OCwwLjU0MTE5NjEwMCwwLjI3NTg5OTM3OV07dmFyIGs9MDtmb3IodmFyIHJvdz0wO3Jvdzw4O3JvdysrKQp7Zm9yKHZhciBjb2w9MDtjb2w8ODtjb2wrKykKe2ZkdGJsX1lba109MS4wLyhZVGFibGVbWmlnWmFnW2tdXSphYXNmW3Jvd10qYWFzZltjb2xdKjguMCk7ZmR0YmxfVVZba109MS4wLyhVVlRhYmxlW1ppZ1phZ1trXV0qYWFzZltyb3ddKmFhc2ZbY29sXSo4LjApO2srKzt9fX0KZnVuY3Rpb24gY29tcHV0ZUh1ZmZtYW5UYmwobnJjb2RlcyxzdGRfdGFibGUpe3ZhciBjb2RldmFsdWU9MDt2YXIgcG9zX2luX3RhYmxlPTA7dmFyIEhUPW5ldyBBcnJheSgpO2Zvcih2YXIgaz0xO2s8PTE2O2srKyl7Zm9yKHZhciBqPTE7ajw9bnJjb2Rlc1trXTtqKyspe0hUW3N0ZF90YWJsZVtwb3NfaW5fdGFibGVdXT1bXTtIVFtzdGRfdGFibGVbcG9zX2luX3RhYmxlXV1bMF09Y29kZXZhbHVlO0hUW3N0ZF90YWJsZVtwb3NfaW5fdGFibGVdXVsxXT1rO3Bvc19pbl90YWJsZSsrO2NvZGV2YWx1ZSsrO30KY29kZXZhbHVlKj0yO30KcmV0dXJuIEhUO30KZnVuY3Rpb24gaW5pdEh1ZmZtYW5UYmwoKQp7WURDX0hUPWNvbXB1dGVIdWZmbWFuVGJsKHN0ZF9kY19sdW1pbmFuY2VfbnJjb2RlcyxzdGRfZGNfbHVtaW5hbmNlX3ZhbHVlcyk7VVZEQ19IVD1jb21wdXRlSHVmZm1hblRibChzdGRfZGNfY2hyb21pbmFuY2VfbnJjb2RlcyxzdGRfZGNfY2hyb21pbmFuY2VfdmFsdWVzKTtZQUNfSFQ9Y29tcHV0ZUh1ZmZtYW5UYmwoc3RkX2FjX2x1bWluYW5jZV9ucmNvZGVzLHN0ZF9hY19sdW1pbmFuY2VfdmFsdWVzKTtVVkFDX0hUPWNvbXB1dGVIdWZmbWFuVGJsKHN0ZF9hY19jaHJvbWluYW5jZV9ucmNvZGVzLHN0ZF9hY19jaHJvbWluYW5jZV92YWx1ZXMpO30KZnVuY3Rpb24gaW5pdENhdGVnb3J5TnVtYmVyKCkKe3ZhciBucmxvd2VyPTE7dmFyIG5ydXBwZXI9Mjtmb3IodmFyIGNhdD0xO2NhdDw9MTU7Y2F0Kyspe2Zvcih2YXIgbnI9bnJsb3dlcjtucjxucnVwcGVyO25yKyspe2NhdGVnb3J5WzMyNzY3K25yXT1jYXQ7Yml0Y29kZVszMjc2Nytucl09W107Yml0Y29kZVszMjc2Nytucl1bMV09Y2F0O2JpdGNvZGVbMzI3NjcrbnJdWzBdPW5yO30KZm9yKHZhciBucm5lZz0tKG5ydXBwZXItMSk7bnJuZWc8PS1ucmxvd2VyO25ybmVnKyspe2NhdGVnb3J5WzMyNzY3K25ybmVnXT1jYXQ7Yml0Y29kZVszMjc2Nytucm5lZ109W107Yml0Y29kZVszMjc2Nytucm5lZ11bMV09Y2F0O2JpdGNvZGVbMzI3NjcrbnJuZWddWzBdPW5ydXBwZXItMStucm5lZzt9Cm5ybG93ZXI8PD0xO25ydXBwZXI8PD0xO319CmZ1bmN0aW9uIGluaXRSR0JZVVZUYWJsZSgpe2Zvcih2YXIgaT0wO2k8MjU2O2krKyl7UkdCX1lVVl9UQUJMRVtpXT0xOTU5NSppO1JHQl9ZVVZfVEFCTEVbaSsyNTY+PjBdPTM4NDcwKmk7UkdCX1lVVl9UQUJMRVtpKzUxMj4+MF09NzQ3MSppKzB4ODAwMDtSR0JfWVVWX1RBQkxFW2krNzY4Pj4wXT0tMTEwNTkqaTtSR0JfWVVWX1RBQkxFW2krMTAyND4+MF09LTIxNzA5Kmk7UkdCX1lVVl9UQUJMRVtpKzEyODA+PjBdPTMyNzY4KmkrMHg4MDdGRkY7UkdCX1lVVl9UQUJMRVtpKzE1MzY+PjBdPS0yNzQzOSppO1JHQl9ZVVZfVEFCTEVbaSsxNzkyPj4wXT0tNTMyOSppO319CmZ1bmN0aW9uIHdyaXRlQml0cyhicykKe3ZhciB2YWx1ZT1ic1swXTt2YXIgcG9zdmFsPWJzWzFdLTE7d2hpbGUocG9zdmFsPj0wKXtpZih2YWx1ZSYxPDxwb3N2YWwpe2J5dGVuZXd8PTE8PGJ5dGVwb3M7fQpwb3N2YWwtLTtieXRlcG9zLS07aWYoYnl0ZXBvczwwKXtpZihieXRlbmV3PT0weEZGKXt3cml0ZUJ5dGUoMHhGRik7d3JpdGVCeXRlKDApO31lbHNlCnt3cml0ZUJ5dGUoYnl0ZW5ldyk7fQpieXRlcG9zPTc7Ynl0ZW5ldz0wO319fQpmdW5jdGlvbiB3cml0ZUJ5dGUodmFsdWUpCntieXRlb3V0LnB1c2godmFsdWUpO30KZnVuY3Rpb24gd3JpdGVXb3JkKHZhbHVlKQp7d3JpdGVCeXRlKHZhbHVlPj44JjB4RkYpO3dyaXRlQnl0ZSh2YWx1ZSYweEZGKTt9CmZ1bmN0aW9uIGZEQ1RRdWFudChkYXRhLGZkdGJsKQp7dmFyIGQwLGQxLGQyLGQzLGQ0LGQ1LGQ2LGQ3O3ZhciBkYXRhT2ZmPTA7dmFyIGk7Y29uc3QgSTg9ODtjb25zdCBJNjQ9NjQ7Zm9yKGk9MDtpPEk4OysraSkKe2QwPWRhdGFbZGF0YU9mZl07ZDE9ZGF0YVtkYXRhT2ZmKzFdO2QyPWRhdGFbZGF0YU9mZisyXTtkMz1kYXRhW2RhdGFPZmYrM107ZDQ9ZGF0YVtkYXRhT2ZmKzRdO2Q1PWRhdGFbZGF0YU9mZis1XTtkNj1kYXRhW2RhdGFPZmYrNl07ZDc9ZGF0YVtkYXRhT2ZmKzddO3ZhciB0bXAwPWQwK2Q3O3ZhciB0bXA3PWQwLWQ3O3ZhciB0bXAxPWQxK2Q2O3ZhciB0bXA2PWQxLWQ2O3ZhciB0bXAyPWQyK2Q1O3ZhciB0bXA1PWQyLWQ1O3ZhciB0bXAzPWQzK2Q0O3ZhciB0bXA0PWQzLWQ0O3ZhciB0bXAxMD10bXAwK3RtcDM7dmFyIHRtcDEzPXRtcDAtdG1wMzt2YXIgdG1wMTE9dG1wMSt0bXAyO3ZhciB0bXAxMj10bXAxLXRtcDI7ZGF0YVtkYXRhT2ZmXT10bXAxMCt0bXAxMTtkYXRhW2RhdGFPZmYrNF09dG1wMTAtdG1wMTE7dmFyIHoxPSh0bXAxMit0bXAxMykqMC43MDcxMDY3ODE7ZGF0YVtkYXRhT2ZmKzJdPXRtcDEzK3oxO2RhdGFbZGF0YU9mZis2XT10bXAxMy16MTt0bXAxMD10bXA0K3RtcDU7dG1wMTE9dG1wNSt0bXA2O3RtcDEyPXRtcDYrdG1wNzt2YXIgejU9KHRtcDEwLXRtcDEyKSowLjM4MjY4MzQzMzt2YXIgejI9MC41NDExOTYxMDAqdG1wMTArejU7dmFyIHo0PTEuMzA2NTYyOTY1KnRtcDEyK3o1O3ZhciB6Mz10bXAxMSowLjcwNzEwNjc4MTt2YXIgejExPXRtcDcrejM7dmFyIHoxMz10bXA3LXozO2RhdGFbZGF0YU9mZis1XT16MTMrejI7ZGF0YVtkYXRhT2ZmKzNdPXoxMy16MjtkYXRhW2RhdGFPZmYrMV09ejExK3o0O2RhdGFbZGF0YU9mZis3XT16MTEtejQ7ZGF0YU9mZis9ODt9CmRhdGFPZmY9MDtmb3IoaT0wO2k8STg7KytpKQp7ZDA9ZGF0YVtkYXRhT2ZmXTtkMT1kYXRhW2RhdGFPZmYrOF07ZDI9ZGF0YVtkYXRhT2ZmKzE2XTtkMz1kYXRhW2RhdGFPZmYrMjRdO2Q0PWRhdGFbZGF0YU9mZiszMl07ZDU9ZGF0YVtkYXRhT2ZmKzQwXTtkNj1kYXRhW2RhdGFPZmYrNDhdO2Q3PWRhdGFbZGF0YU9mZis1Nl07dmFyIHRtcDBwMj1kMCtkNzt2YXIgdG1wN3AyPWQwLWQ3O3ZhciB0bXAxcDI9ZDErZDY7dmFyIHRtcDZwMj1kMS1kNjt2YXIgdG1wMnAyPWQyK2Q1O3ZhciB0bXA1cDI9ZDItZDU7dmFyIHRtcDNwMj1kMytkNDt2YXIgdG1wNHAyPWQzLWQ0O3ZhciB0bXAxMHAyPXRtcDBwMit0bXAzcDI7dmFyIHRtcDEzcDI9dG1wMHAyLXRtcDNwMjt2YXIgdG1wMTFwMj10bXAxcDIrdG1wMnAyO3ZhciB0bXAxMnAyPXRtcDFwMi10bXAycDI7ZGF0YVtkYXRhT2ZmXT10bXAxMHAyK3RtcDExcDI7ZGF0YVtkYXRhT2ZmKzMyXT10bXAxMHAyLXRtcDExcDI7dmFyIHoxcDI9KHRtcDEycDIrdG1wMTNwMikqMC43MDcxMDY3ODE7ZGF0YVtkYXRhT2ZmKzE2XT10bXAxM3AyK3oxcDI7ZGF0YVtkYXRhT2ZmKzQ4XT10bXAxM3AyLXoxcDI7dG1wMTBwMj10bXA0cDIrdG1wNXAyO3RtcDExcDI9dG1wNXAyK3RtcDZwMjt0bXAxMnAyPXRtcDZwMit0bXA3cDI7dmFyIHo1cDI9KHRtcDEwcDItdG1wMTJwMikqMC4zODI2ODM0MzM7dmFyIHoycDI9MC41NDExOTYxMDAqdG1wMTBwMit6NXAyO3ZhciB6NHAyPTEuMzA2NTYyOTY1KnRtcDEycDIrejVwMjt2YXIgejNwMj10bXAxMXAyKjAuNzA3MTA2NzgxO3ZhciB6MTFwMj10bXA3cDIrejNwMjt2YXIgejEzcDI9dG1wN3AyLXozcDI7ZGF0YVtkYXRhT2ZmKzQwXT16MTNwMit6MnAyO2RhdGFbZGF0YU9mZisyNF09ejEzcDItejJwMjtkYXRhW2RhdGFPZmYrOF09ejExcDIrejRwMjtkYXRhW2RhdGFPZmYrNTZdPXoxMXAyLXo0cDI7ZGF0YU9mZisrO30KdmFyIGZEQ1RRdWFudDtmb3IoaT0wO2k8STY0OysraSkKe2ZEQ1RRdWFudD1kYXRhW2ldKmZkdGJsW2ldO291dHB1dGZEQ1RRdWFudFtpXT1mRENUUXVhbnQ+MC4wP2ZEQ1RRdWFudCswLjV8MDpmRENUUXVhbnQtMC41fDA7fQpyZXR1cm4gb3V0cHV0ZkRDVFF1YW50O30KZnVuY3Rpb24gd3JpdGVBUFAwKCkKe3dyaXRlV29yZCgweEZGRTApO3dyaXRlV29yZCgxNik7d3JpdGVCeXRlKDB4NEEpO3dyaXRlQnl0ZSgweDQ2KTt3cml0ZUJ5dGUoMHg0OSk7d3JpdGVCeXRlKDB4NDYpO3dyaXRlQnl0ZSgwKTt3cml0ZUJ5dGUoMSk7d3JpdGVCeXRlKDEpO3dyaXRlQnl0ZSgwKTt3cml0ZVdvcmQoMSk7d3JpdGVXb3JkKDEpO3dyaXRlQnl0ZSgwKTt3cml0ZUJ5dGUoMCk7fQpmdW5jdGlvbiB3cml0ZVNPRjAod2lkdGgsaGVpZ2h0KQp7d3JpdGVXb3JkKDB4RkZDMCk7d3JpdGVXb3JkKDE3KTt3cml0ZUJ5dGUoOCk7d3JpdGVXb3JkKGhlaWdodCk7d3JpdGVXb3JkKHdpZHRoKTt3cml0ZUJ5dGUoMyk7d3JpdGVCeXRlKDEpO3dyaXRlQnl0ZSgweDExKTt3cml0ZUJ5dGUoMCk7d3JpdGVCeXRlKDIpO3dyaXRlQnl0ZSgweDExKTt3cml0ZUJ5dGUoMSk7d3JpdGVCeXRlKDMpO3dyaXRlQnl0ZSgweDExKTt3cml0ZUJ5dGUoMSk7fQpmdW5jdGlvbiB3cml0ZURRVCgpCnt3cml0ZVdvcmQoMHhGRkRCKTt3cml0ZVdvcmQoMTMyKTt3cml0ZUJ5dGUoMCk7Zm9yKHZhciBpPTA7aTw2NDtpKyspe3dyaXRlQnl0ZShZVGFibGVbaV0pO30Kd3JpdGVCeXRlKDEpO2Zvcih2YXIgaj0wO2o8NjQ7aisrKXt3cml0ZUJ5dGUoVVZUYWJsZVtqXSk7fX0KZnVuY3Rpb24gd3JpdGVESFQoKQp7d3JpdGVXb3JkKDB4RkZDNCk7d3JpdGVXb3JkKDB4MDFBMik7d3JpdGVCeXRlKDApO2Zvcih2YXIgaT0wO2k8MTY7aSsrKXt3cml0ZUJ5dGUoc3RkX2RjX2x1bWluYW5jZV9ucmNvZGVzW2krMV0pO30KZm9yKHZhciBqPTA7ajw9MTE7aisrKXt3cml0ZUJ5dGUoc3RkX2RjX2x1bWluYW5jZV92YWx1ZXNbal0pO30Kd3JpdGVCeXRlKDB4MTApO2Zvcih2YXIgaz0wO2s8MTY7aysrKXt3cml0ZUJ5dGUoc3RkX2FjX2x1bWluYW5jZV9ucmNvZGVzW2srMV0pO30KZm9yKHZhciBsPTA7bDw9MTYxO2wrKyl7d3JpdGVCeXRlKHN0ZF9hY19sdW1pbmFuY2VfdmFsdWVzW2xdKTt9CndyaXRlQnl0ZSgxKTtmb3IodmFyIG09MDttPDE2O20rKyl7d3JpdGVCeXRlKHN0ZF9kY19jaHJvbWluYW5jZV9ucmNvZGVzW20rMV0pO30KZm9yKHZhciBuPTA7bjw9MTE7bisrKXt3cml0ZUJ5dGUoc3RkX2RjX2Nocm9taW5hbmNlX3ZhbHVlc1tuXSk7fQp3cml0ZUJ5dGUoMHgxMSk7Zm9yKHZhciBvPTA7bzwxNjtvKyspe3dyaXRlQnl0ZShzdGRfYWNfY2hyb21pbmFuY2VfbnJjb2Rlc1tvKzFdKTt9CmZvcih2YXIgcD0wO3A8PTE2MTtwKyspe3dyaXRlQnl0ZShzdGRfYWNfY2hyb21pbmFuY2VfdmFsdWVzW3BdKTt9fQpmdW5jdGlvbiB3cml0ZVNPUygpCnt3cml0ZVdvcmQoMHhGRkRBKTt3cml0ZVdvcmQoMTIpO3dyaXRlQnl0ZSgzKTt3cml0ZUJ5dGUoMSk7d3JpdGVCeXRlKDApO3dyaXRlQnl0ZSgyKTt3cml0ZUJ5dGUoMHgxMSk7d3JpdGVCeXRlKDMpO3dyaXRlQnl0ZSgweDExKTt3cml0ZUJ5dGUoMCk7d3JpdGVCeXRlKDB4M2YpO3dyaXRlQnl0ZSgwKTt9CmZ1bmN0aW9uIHByb2Nlc3NEVShDRFUsZmR0YmwsREMsSFREQyxIVEFDKXt2YXIgRU9CPUhUQUNbMHgwMF07dmFyIE0xNnplcm9lcz1IVEFDWzB4RjBdO3ZhciBwb3M7Y29uc3QgSTE2PTE2O2NvbnN0IEk2Mz02Mztjb25zdCBJNjQ9NjQ7dmFyIERVX0RDVD1mRENUUXVhbnQoQ0RVLGZkdGJsKTtmb3IodmFyIGo9MDtqPEk2NDsrK2ope0RVW1ppZ1phZ1tqXV09RFVfRENUW2pdO30KdmFyIERpZmY9RFVbMF0tREM7REM9RFVbMF07aWYoRGlmZj09MCl7d3JpdGVCaXRzKEhURENbMF0pO31lbHNle3Bvcz0zMjc2NytEaWZmO3dyaXRlQml0cyhIVERDW2NhdGVnb3J5W3Bvc11dKTt3cml0ZUJpdHMoYml0Y29kZVtwb3NdKTt9CnZhciBlbmQwcG9zPTYzO2Zvcig7ZW5kMHBvcz4wJiZEVVtlbmQwcG9zXT09MDtlbmQwcG9zLS0pe307aWYoZW5kMHBvcz09MCl7d3JpdGVCaXRzKEVPQik7cmV0dXJuIERDO30KdmFyIGk9MTt2YXIgbG5nO3doaWxlKGk8PWVuZDBwb3Mpe3ZhciBzdGFydHBvcz1pO2Zvcig7RFVbaV09PTAmJmk8PWVuZDBwb3M7KytpKXt9CnZhciBucnplcm9lcz1pLXN0YXJ0cG9zO2lmKG5yemVyb2VzPj1JMTYpe2xuZz1ucnplcm9lcz4+NDtmb3IodmFyIG5ybWFya2VyPTE7bnJtYXJrZXI8PWxuZzsrK25ybWFya2VyKQp3cml0ZUJpdHMoTTE2emVyb2VzKTtucnplcm9lcz1ucnplcm9lcyYweEY7fQpwb3M9MzI3NjcrRFVbaV07d3JpdGVCaXRzKEhUQUNbKG5yemVyb2VzPDw0KStjYXRlZ29yeVtwb3NdXSk7d3JpdGVCaXRzKGJpdGNvZGVbcG9zXSk7aSsrO30KaWYoZW5kMHBvcyE9STYzKXt3cml0ZUJpdHMoRU9CKTt9CnJldHVybiBEQzt9CmZ1bmN0aW9uIGluaXRDaGFyTG9va3VwVGFibGUoKXt2YXIgc2ZjYz1TdHJpbmcuZnJvbUNoYXJDb2RlO2Zvcih2YXIgaT0wO2k8MjU2O2krKyl7Y2x0W2ldPXNmY2MoaSk7fX0KdGhpcy5lbmNvZGU9ZnVuY3Rpb24oaW1hZ2UscXVhbGl0eSkKe3ZhciB0aW1lX3N0YXJ0PW5ldyBEYXRlKCkuZ2V0VGltZSgpO2lmKHF1YWxpdHkpc2V0UXVhbGl0eShxdWFsaXR5KTtieXRlb3V0PW5ldyBBcnJheSgpO2J5dGVuZXc9MDtieXRlcG9zPTc7d3JpdGVXb3JkKDB4RkZEOCk7d3JpdGVBUFAwKCk7d3JpdGVEUVQoKTt3cml0ZVNPRjAoaW1hZ2Uud2lkdGgsaW1hZ2UuaGVpZ2h0KTt3cml0ZURIVCgpO3dyaXRlU09TKCk7dmFyIERDWT0wO3ZhciBEQ1U9MDt2YXIgRENWPTA7Ynl0ZW5ldz0wO2J5dGVwb3M9Nzt0aGlzLmVuY29kZS5kaXNwbGF5TmFtZT0iX2VuY29kZV8iO3ZhciBpbWFnZURhdGE9aW1hZ2UuZGF0YTt2YXIgd2lkdGg9aW1hZ2Uud2lkdGg7dmFyIGhlaWdodD1pbWFnZS5oZWlnaHQ7dmFyIHF1YWRXaWR0aD13aWR0aCo0O3ZhciB0cmlwbGVXaWR0aD13aWR0aCozO3ZhciB4LHk9MDt2YXIgcixnLGI7dmFyIHN0YXJ0LHAsY29sLHJvdyxwb3M7d2hpbGUoeTxoZWlnaHQpe3g9MDt3aGlsZSh4PHF1YWRXaWR0aCl7c3RhcnQ9cXVhZFdpZHRoKnkreDtwPXN0YXJ0O2NvbD0tMTtyb3c9MDtmb3IocG9zPTA7cG9zPDY0O3BvcysrKXtyb3c9cG9zPj4zO2NvbD0ocG9zJjcpKjQ7cD1zdGFydCtyb3cqcXVhZFdpZHRoK2NvbDtpZih5K3Jvdz49aGVpZ2h0KXtwLT1xdWFkV2lkdGgqKHkrMStyb3ctaGVpZ2h0KTt9CmlmKHgrY29sPj1xdWFkV2lkdGgpe3AtPXgrY29sLXF1YWRXaWR0aCs0O30Kcj1pbWFnZURhdGFbcCsrXTtnPWltYWdlRGF0YVtwKytdO2I9aW1hZ2VEYXRhW3ArK107WURVW3Bvc109KFJHQl9ZVVZfVEFCTEVbcl0rUkdCX1lVVl9UQUJMRVtnKzI1Nj4+MF0rUkdCX1lVVl9UQUJMRVtiKzUxMj4+MF0+PjE2KS0xMjg7VURVW3Bvc109KFJHQl9ZVVZfVEFCTEVbcis3Njg+PjBdK1JHQl9ZVVZfVEFCTEVbZysxMDI0Pj4wXStSR0JfWVVWX1RBQkxFW2IrMTI4MD4+MF0+PjE2KS0xMjg7VkRVW3Bvc109KFJHQl9ZVVZfVEFCTEVbcisxMjgwPj4wXStSR0JfWVVWX1RBQkxFW2crMTUzNj4+MF0rUkdCX1lVVl9UQUJMRVtiKzE3OTI+PjBdPj4xNiktMTI4O30KRENZPXByb2Nlc3NEVShZRFUsZmR0YmxfWSxEQ1ksWURDX0hULFlBQ19IVCk7RENVPXByb2Nlc3NEVShVRFUsZmR0YmxfVVYsRENVLFVWRENfSFQsVVZBQ19IVCk7RENWPXByb2Nlc3NEVShWRFUsZmR0YmxfVVYsRENWLFVWRENfSFQsVVZBQ19IVCk7eCs9MzI7fQp5Kz04O30KaWYoYnl0ZXBvcz49MCl7dmFyIGZpbGxiaXRzPVtdO2ZpbGxiaXRzWzFdPWJ5dGVwb3MrMTtmaWxsYml0c1swXT0oMTw8Ynl0ZXBvcysxKS0xO3dyaXRlQml0cyhmaWxsYml0cyk7fQp3cml0ZVdvcmQoMHhGRkQ5KTtyZXR1cm4gbmV3IEJ1ZmZlcihieXRlb3V0KTt2YXIganBlZ0RhdGFVcmk9J2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJytidG9hKGJ5dGVvdXQuam9pbignJykpO2J5dGVvdXQ9W107dmFyIGR1cmF0aW9uPW5ldyBEYXRlKCkuZ2V0VGltZSgpLXRpbWVfc3RhcnQ7cmV0dXJuIGpwZWdEYXRhVXJpO307ZnVuY3Rpb24gc2V0UXVhbGl0eShxdWFsaXR5KXtpZihxdWFsaXR5PD0wKXtxdWFsaXR5PTE7fQppZihxdWFsaXR5PjEwMCl7cXVhbGl0eT0xMDA7fQppZihjdXJyZW50UXVhbGl0eT09cXVhbGl0eSlyZXR1cm47dmFyIHNmPTA7aWYocXVhbGl0eTw1MCl7c2Y9TWF0aC5mbG9vcig1MDAwL3F1YWxpdHkpO31lbHNle3NmPU1hdGguZmxvb3IoMjAwLXF1YWxpdHkqMik7fQppbml0UXVhbnRUYWJsZXMoc2YpO2N1cnJlbnRRdWFsaXR5PXF1YWxpdHk7fQpmdW5jdGlvbiBpbml0KCl7dmFyIHRpbWVfc3RhcnQ9bmV3IERhdGUoKS5nZXRUaW1lKCk7aWYoIXF1YWxpdHkpcXVhbGl0eT01MDtpbml0Q2hhckxvb2t1cFRhYmxlKCk7aW5pdEh1ZmZtYW5UYmwoKTtpbml0Q2F0ZWdvcnlOdW1iZXIoKTtpbml0UkdCWVVWVGFibGUoKTtzZXRRdWFsaXR5KHF1YWxpdHkpO3ZhciBkdXJhdGlvbj1uZXcgRGF0ZSgpLmdldFRpbWUoKS10aW1lX3N0YXJ0O30KaW5pdCgpO307bW9kdWxlLmV4cG9ydHM9ZW5jb2RlO2Z1bmN0aW9uIGVuY29kZShpbWdEYXRhLHF1KXtpZih0eXBlb2YgcXU9PT0ndW5kZWZpbmVkJylxdT01MDt2YXIgZW5jb2Rlcj1uZXcgSlBFR0VuY29kZXIocXUpO3ZhciBkYXRhPWVuY29kZXIuZW5jb2RlKGltZ0RhdGEscXUpO3JldHVybntkYXRhOmRhdGEsd2lkdGg6aW1nRGF0YS53aWR0aCxoZWlnaHQ6aW1nRGF0YS5oZWlnaHR9O30KZnVuY3Rpb24gZ2V0SW1hZ2VEYXRhRnJvbUltYWdlKGlkT3JFbGVtZW50KXt2YXIgdGhlSW1nPXR5cGVvZiBpZE9yRWxlbWVudD09J3N0cmluZyc/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRPckVsZW1lbnQpOmlkT3JFbGVtZW50O3ZhciBjdnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y3ZzLndpZHRoPXRoZUltZy53aWR0aDtjdnMuaGVpZ2h0PXRoZUltZy5oZWlnaHQ7dmFyIGN0eD1jdnMuZ2V0Q29udGV4dCgiMmQiKTtjdHguZHJhd0ltYWdlKHRoZUltZywwLDApO3JldHVybiBjdHguZ2V0SW1hZ2VEYXRhKDAsMCxjdnMud2lkdGgsY3ZzLmhlaWdodCk7fX0pLmNhbGwodGhpcyxyZXF1aXJlKCJidWZmZXIiKS5CdWZmZXIpO30seyJidWZmZXIiOjYwfV0sMTI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7J3VzZSBzdHJpY3QnO2NvbnN0IGRlYnVnPXJlcXVpcmUoJ2RlYnVnJyk7Y29uc3QgRXZlbnRFbWl0dGVyPXJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtjb25zdCBpc1dpbmRvd3M9cHJvY2Vzcy5wbGF0Zm9ybT09PSd3aW4zMic7Y29uc3QgaXNCcm93c2VyPXByb2Nlc3MuYnJvd3Nlcjtjb25zdCBjb2xvcnM9e3JlZDppc0Jyb3dzZXI/J2NyaW1zb24nOjEseWVsbG93OmlzQnJvd3Nlcj8nZ29sZCc6MyxjeWFuOmlzQnJvd3Nlcj8nZGFya3R1cnF1b2lzZSc6NixncmVlbjppc0Jyb3dzZXI/J2ZvcmVzdGdyZWVuJzoyLGJsdWU6aXNCcm93c2VyPydzdGVlbGJsdWUnOjQsbWFnZW50YTppc0Jyb3dzZXI/J3BhbGV2aW9sZXRyZWQnOjV9O2RlYnVnLmNvbG9ycz1bY29sb3JzLmN5YW4sY29sb3JzLmdyZWVuLGNvbG9ycy5ibHVlLGNvbG9ycy5tYWdlbnRhXTtjbGFzcyBFbWl0dGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVye2lzc3VlU3RhdHVzKHRpdGxlLGFyZ3NBcnJheSl7aWYodGl0bGU9PT0nc3RhdHVzJ3x8dGl0bGU9PT0nc3RhdHVzRW5kJyl7dGhpcy5lbWl0KHRpdGxlLFt0aXRsZSwuLi5hcmdzQXJyYXldKTt9fQppc3N1ZVdhcm5pbmcodGl0bGUsYXJnc0FycmF5KXt0aGlzLmVtaXQoJ3dhcm5pbmcnLFt0aXRsZSwuLi5hcmdzQXJyYXldKTt9fQpjb25zdCBsb2dnZXJzQnlUaXRsZT17fTtjb25zdCBsb2dnaW5nQnVmZmVyQ29sdW1ucz0yNTtjbGFzcyBMb2d7c3RhdGljIF9sb2dUb1N0ZEVycih0aXRsZSxhcmdzQXJyYXkpe2NvbnN0IGxvZz1Mb2cubG9nZ2VyZm4odGl0bGUpO2xvZyguLi5hcmdzQXJyYXkpO30Kc3RhdGljIGxvZ2dlcmZuKHRpdGxlKXtsZXQgbG9nPWxvZ2dlcnNCeVRpdGxlW3RpdGxlXTtpZighbG9nKXtsb2c9ZGVidWcodGl0bGUpO2xvZ2dlcnNCeVRpdGxlW3RpdGxlXT1sb2c7aWYodGl0bGUuZW5kc1dpdGgoJ2Vycm9yJykpe2xvZy5jb2xvcj1jb2xvcnMucmVkO31lbHNlIGlmKHRpdGxlLmVuZHNXaXRoKCd3YXJuJykpe2xvZy5jb2xvcj1jb2xvcnMueWVsbG93O319CnJldHVybiBsb2c7fQpzdGF0aWMgc2V0TGV2ZWwobGV2ZWwpe3N3aXRjaChsZXZlbCl7Y2FzZSdzaWxlbnQnOmRlYnVnLmVuYWJsZSgnLSonKTticmVhaztjYXNlJ3ZlcmJvc2UnOmRlYnVnLmVuYWJsZSgnKicpO2JyZWFrO2Nhc2UnZXJyb3InOmRlYnVnLmVuYWJsZSgnLSosICo6ZXJyb3InKTticmVhaztkZWZhdWx0OmRlYnVnLmVuYWJsZSgnKiwgLSo6dmVyYm9zZScpO319CnN0YXRpYyBmb3JtYXRQcm90b2NvbChwcmVmaXgsZGF0YSxsZXZlbCl7Y29uc3QgY29sdW1ucz0hcHJvY2Vzc3x8cHJvY2Vzcy5icm93c2VyP0luZmluaXR5OnByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM7Y29uc3QgbWV0aG9kPWRhdGEubWV0aG9kfHwnPz8/Pz8nO2NvbnN0IG1heExlbmd0aD1jb2x1bW5zLW1ldGhvZC5sZW5ndGgtcHJlZml4Lmxlbmd0aC1sb2dnaW5nQnVmZmVyQ29sdW1ucztjb25zdCBzbmlwcGV0PWRhdGEucGFyYW1zJiZtZXRob2QhPT0nSU8ucmVhZCc/SlNPTi5zdHJpbmdpZnkoZGF0YS5wYXJhbXMpLnN1YnN0cigwLG1heExlbmd0aCk6Jyc7TG9nLl9sb2dUb1N0ZEVycihgJHtwcmVmaXh9OiR7bGV2ZWx8fCcnfWAsW21ldGhvZCxzbmlwcGV0XSk7fQpzdGF0aWMgbG9nKHRpdGxlLC4uLmFyZ3Mpe0xvZy5ldmVudHMuaXNzdWVTdGF0dXModGl0bGUsYXJncyk7cmV0dXJuIExvZy5fbG9nVG9TdGRFcnIodGl0bGUsYXJncyk7fQpzdGF0aWMgd2Fybih0aXRsZSwuLi5hcmdzKXtMb2cuZXZlbnRzLmlzc3VlV2FybmluZyh0aXRsZSxhcmdzKTtyZXR1cm4gTG9nLl9sb2dUb1N0ZEVycihgJHt0aXRsZX06d2FybmAsYXJncyk7fQpzdGF0aWMgZXJyb3IodGl0bGUsLi4uYXJncyl7cmV0dXJuIExvZy5fbG9nVG9TdGRFcnIoYCR7dGl0bGV9OmVycm9yYCxhcmdzKTt9CnN0YXRpYyB2ZXJib3NlKHRpdGxlLC4uLmFyZ3Mpe0xvZy5ldmVudHMuaXNzdWVTdGF0dXModGl0bGUsYXJncyk7cmV0dXJuIExvZy5fbG9nVG9TdGRFcnIoYCR7dGl0bGV9OnZlcmJvc2VgLGFyZ3MpO30Kc3RhdGljIGdyZWVuaWZ5KHN0cil7cmV0dXJuYCR7TG9nLmdyZWVufSR7c3RyfSR7TG9nLnJlc2V0fWA7fQpzdGF0aWMgcmVkaWZ5KHN0cil7cmV0dXJuYCR7TG9nLnJlZH0ke3N0cn0ke0xvZy5yZXNldH1gO30Kc3RhdGljIGdldCBncmVlbigpe3JldHVybidceDFCWzMybSc7fQpzdGF0aWMgZ2V0IHJlZCgpe3JldHVybidceDFCWzMxbSc7fQpzdGF0aWMgZ2V0IHllbGxvdygpe3JldHVybidceDFiWzMzbSc7fQpzdGF0aWMgZ2V0IHB1cnBsZSgpe3JldHVybidceDFiWzk1bSc7fQpzdGF0aWMgZ2V0IHJlc2V0KCl7cmV0dXJuJ1x4MUJbMG0nO30Kc3RhdGljIGdldCBib2xkKCl7cmV0dXJuJ1x4MWJbMW0nO30Kc3RhdGljIGdldCBkaW0oKXtyZXR1cm4nXHgxYlsybSc7fQpzdGF0aWMgZ2V0IHRpY2soKXtyZXR1cm4gaXNXaW5kb3dzPydcdTIyMUEnOifinJMnO30Kc3RhdGljIGdldCBjcm9zcygpe3JldHVybiBpc1dpbmRvd3M/J1x1MDBENyc6J+KcmCc7fQpzdGF0aWMgZ2V0IHdoaXRlU21hbGxTcXVhcmUoKXtyZXR1cm4gaXNXaW5kb3dzPydcdTAzODcnOifilqsnO30Kc3RhdGljIGdldCBoZWF2eUhvcml6b250YWwoKXtyZXR1cm4gaXNXaW5kb3dzPydcdTI1MDAnOifilIEnO30Kc3RhdGljIGdldCBoZWF2eVZlcnRpY2FsKCl7cmV0dXJuIGlzV2luZG93cz8nXHUyNTAyICc6J+KUgyAnO30Kc3RhdGljIGdldCBoZWF2eVVwQW5kUmlnaHQoKXtyZXR1cm4gaXNXaW5kb3dzPydcdTI1MTQnOifilJcnO30Kc3RhdGljIGdldCBoZWF2eVZlcnRpY2FsQW5kUmlnaHQoKXtyZXR1cm4gaXNXaW5kb3dzPydcdTI1MUMnOifilKMnO30Kc3RhdGljIGdldCBoZWF2eURvd25BbmRIb3Jpem9udGFsKCl7cmV0dXJuIGlzV2luZG93cz8nXHUyNTJDJzon4pSzJzt9CnN0YXRpYyBnZXQgZG91YmxlTGlnaHRIb3Jpem9udGFsKCl7cmV0dXJuJ+KUgOKUgCc7fX0KTG9nLmV2ZW50cz1uZXcgRW1pdHRlcigpO21vZHVsZS5leHBvcnRzPUxvZzt9KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSk7fSx7Il9wcm9jZXNzIjo3NywiZGVidWciOjExNiwiZXZlbnRzIjo2Mn1dLDEyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBIQVNIX1VOREVGSU5FRD0nX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7dmFyIENPTVBBUkVfUEFSVElBTF9GTEFHPTEsQ09NUEFSRV9VTk9SREVSRURfRkxBRz0yO3ZhciBNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTE7dmFyIGFyZ3NUYWc9J1tvYmplY3QgQXJndW1lbnRzXScsYXJyYXlUYWc9J1tvYmplY3QgQXJyYXldJyxhc3luY1RhZz0nW29iamVjdCBBc3luY0Z1bmN0aW9uXScsYm9vbFRhZz0nW29iamVjdCBCb29sZWFuXScsZGF0ZVRhZz0nW29iamVjdCBEYXRlXScsZXJyb3JUYWc9J1tvYmplY3QgRXJyb3JdJyxmdW5jVGFnPSdbb2JqZWN0IEZ1bmN0aW9uXScsZ2VuVGFnPSdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsbWFwVGFnPSdbb2JqZWN0IE1hcF0nLG51bWJlclRhZz0nW29iamVjdCBOdW1iZXJdJyxudWxsVGFnPSdbb2JqZWN0IE51bGxdJyxvYmplY3RUYWc9J1tvYmplY3QgT2JqZWN0XScscHJvbWlzZVRhZz0nW29iamVjdCBQcm9taXNlXScscHJveHlUYWc9J1tvYmplY3QgUHJveHldJyxyZWdleHBUYWc9J1tvYmplY3QgUmVnRXhwXScsc2V0VGFnPSdbb2JqZWN0IFNldF0nLHN0cmluZ1RhZz0nW29iamVjdCBTdHJpbmddJyxzeW1ib2xUYWc9J1tvYmplY3QgU3ltYm9sXScsdW5kZWZpbmVkVGFnPSdbb2JqZWN0IFVuZGVmaW5lZF0nLHdlYWtNYXBUYWc9J1tvYmplY3QgV2Vha01hcF0nO3ZhciBhcnJheUJ1ZmZlclRhZz0nW29iamVjdCBBcnJheUJ1ZmZlcl0nLGRhdGFWaWV3VGFnPSdbb2JqZWN0IERhdGFWaWV3XScsZmxvYXQzMlRhZz0nW29iamVjdCBGbG9hdDMyQXJyYXldJyxmbG9hdDY0VGFnPSdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLGludDhUYWc9J1tvYmplY3QgSW50OEFycmF5XScsaW50MTZUYWc9J1tvYmplY3QgSW50MTZBcnJheV0nLGludDMyVGFnPSdbb2JqZWN0IEludDMyQXJyYXldJyx1aW50OFRhZz0nW29iamVjdCBVaW50OEFycmF5XScsdWludDhDbGFtcGVkVGFnPSdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsdWludDE2VGFnPSdbb2JqZWN0IFVpbnQxNkFycmF5XScsdWludDMyVGFnPSdbb2JqZWN0IFVpbnQzMkFycmF5XSc7dmFyIHJlUmVnRXhwQ2hhcj0vW1xcXiQuKis/KClbXF17fXxdL2c7dmFyIHJlSXNIb3N0Q3Rvcj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciB0eXBlZEFycmF5VGFncz17fTt0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXT10eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXT10eXBlZEFycmF5VGFnc1tpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1tpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbaW50MzJUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0nb2JqZWN0JyYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0nb2JqZWN0JyYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGY7dmFyIHJvb3Q9ZnJlZUdsb2JhbHx8ZnJlZVNlbGZ8fEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7dmFyIGZyZWVFeHBvcnRzPXR5cGVvZiBleHBvcnRzPT0nb2JqZWN0JyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIGZyZWVNb2R1bGU9ZnJlZUV4cG9ydHMmJnR5cGVvZiBtb2R1bGU9PSdvYmplY3QnJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZTt2YXIgbW9kdWxlRXhwb3J0cz1mcmVlTW9kdWxlJiZmcmVlTW9kdWxlLmV4cG9ydHM9PT1mcmVlRXhwb3J0czt2YXIgZnJlZVByb2Nlc3M9bW9kdWxlRXhwb3J0cyYmZnJlZUdsb2JhbC5wcm9jZXNzO3ZhciBub2RlVXRpbD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnJlZVByb2Nlc3MmJmZyZWVQcm9jZXNzLmJpbmRpbmcmJmZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTt9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzVHlwZWRBcnJheT1ub2RlVXRpbCYmbm9kZVV0aWwuaXNUeXBlZEFycmF5O2Z1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXtyZXN1bHRbcmVzSW5kZXgrK109dmFsdWU7fX0KcmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSx2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxvZmZzZXQ9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXthcnJheVtvZmZzZXQraW5kZXhdPXZhbHVlc1tpbmRleF07fQpyZXR1cm4gYXJyYXk7fQpmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSl7cmV0dXJuIHRydWU7fX0KcmV0dXJuIGZhbHNlO30KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXtyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGluZGV4KTt9CnJldHVybiByZXN1bHQ7fQpmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYyl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gZnVuYyh2YWx1ZSk7fTt9CmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpO30KZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV07fQpmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShtYXAuc2l6ZSk7bWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsa2V5KXtyZXN1bHRbKytpbmRleF09W2tleSx2YWx1ZV07fSk7cmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIG92ZXJBcmcoZnVuYyx0cmFuc2Zvcm0pe3JldHVybiBmdW5jdGlvbihhcmcpe3JldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTt9O30KZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkoc2V0LnNpemUpO3NldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09dmFsdWU7fSk7cmV0dXJuIHJlc3VsdDt9CnZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9cm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBtYXNrU3JjS2V5PWZ1bmN0aW9uKCl7dmFyIHVpZD0vW14uXSskLy5leGVjKGNvcmVKc0RhdGEmJmNvcmVKc0RhdGEua2V5cyYmY29yZUpzRGF0YS5rZXlzLklFX1BST1RPfHwnJyk7cmV0dXJuIHVpZD8nU3ltYm9sKHNyYylfMS4nK3VpZDonJzt9KCk7dmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nO3ZhciByZUlzTmF0aXZlPVJlZ0V4cCgnXicrCmZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwnXFwkJicpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csJyQxLio/JykrJyQnKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/cm9vdC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1yb290LlN5bWJvbCxVaW50OEFycmF5PXJvb3QuVWludDhBcnJheSxwcm9wZXJ0eUlzRW51bWVyYWJsZT1vYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxzcGxpY2U9YXJyYXlQcm90by5zcGxpY2Usc3ltVG9TdHJpbmdUYWc9U3ltYm9sP1N5bWJvbC50b1N0cmluZ1RhZzp1bmRlZmluZWQ7dmFyIG5hdGl2ZUdldFN5bWJvbHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxuYXRpdmVJc0J1ZmZlcj1CdWZmZXI/QnVmZmVyLmlzQnVmZmVyOnVuZGVmaW5lZCxuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KTt2YXIgRGF0YVZpZXc9Z2V0TmF0aXZlKHJvb3QsJ0RhdGFWaWV3JyksTWFwPWdldE5hdGl2ZShyb290LCdNYXAnKSxQcm9taXNlPWdldE5hdGl2ZShyb290LCdQcm9taXNlJyksU2V0PWdldE5hdGl2ZShyb290LCdTZXQnKSxXZWFrTWFwPWdldE5hdGl2ZShyb290LCdXZWFrTWFwJyksbmF0aXZlQ3JlYXRlPWdldE5hdGl2ZShPYmplY3QsJ2NyZWF0ZScpO3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD9TeW1ib2wucHJvdG90eXBlOnVuZGVmaW5lZCxzeW1ib2xWYWx1ZU9mPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnZhbHVlT2Y6dW5kZWZpbmVkO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pO319CmZ1bmN0aW9uIGhhc2hDbGVhcigpe3RoaXMuX19kYXRhX189bmF0aXZlQ3JlYXRlP25hdGl2ZUNyZWF0ZShudWxsKTp7fTt0aGlzLnNpemU9MDt9CmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KXt2YXIgcmVzdWx0PXRoaXMuaGFzKGtleSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07dGhpcy5zaXplLT1yZXN1bHQ/MTowO3JldHVybiByZXN1bHQ7fQpmdW5jdGlvbiBoYXNoR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihuYXRpdmVDcmVhdGUpe3ZhciByZXN1bHQ9ZGF0YVtrZXldO3JldHVybiByZXN1bHQ9PT1IQVNIX1VOREVGSU5FRD91bmRlZmluZWQ6cmVzdWx0O30KcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSxrZXkpP2RhdGFba2V5XTp1bmRlZmluZWQ7fQpmdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KTt9CmZ1bmN0aW9uIGhhc2hTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3RoaXMuc2l6ZSs9dGhpcy5oYXMoa2V5KT8wOjE7ZGF0YVtrZXldPW5hdGl2ZUNyZWF0ZSYmdmFsdWU9PT11bmRlZmluZWQ/SEFTSF9VTkRFRklORUQ6dmFsdWU7cmV0dXJuIHRoaXM7fQpIYXNoLnByb3RvdHlwZS5jbGVhcj1oYXNoQ2xlYXI7SGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKTt9fQpmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpe3RoaXMuX19kYXRhX189W107dGhpcy5zaXplPTA7fQpmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7cmV0dXJuIGZhbHNlO30KdmFyIGxhc3RJbmRleD1kYXRhLmxlbmd0aC0xO2lmKGluZGV4PT1sYXN0SW5kZXgpe2RhdGEucG9wKCk7fWVsc2V7c3BsaWNlLmNhbGwoZGF0YSxpbmRleCwxKTt9Ci0tdGhpcy5zaXplO3JldHVybiB0cnVlO30KZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXTt9CmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpe3JldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXyxrZXkpPi0xO30KZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO2lmKGluZGV4PDApeysrdGhpcy5zaXplO2RhdGEucHVzaChba2V5LHZhbHVlXSk7fWVsc2V7ZGF0YVtpbmRleF1bMV09dmFsdWU7fQpyZXR1cm4gdGhpczt9Ckxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ109bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PWxpc3RDYWNoZUdldDtMaXN0Q2FjaGUucHJvdG90eXBlLmhhcz1saXN0Q2FjaGVIYXM7TGlzdENhY2hlLnByb3RvdHlwZS5zZXQ9bGlzdENhY2hlU2V0O2Z1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKTt9fQpmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCl7dGhpcy5zaXplPTA7dGhpcy5fX2RhdGFfXz17J2hhc2gnOm5ldyBIYXNoKCksJ21hcCc6bmV3KE1hcHx8TGlzdENhY2hlKSgpLCdzdHJpbmcnOm5ldyBIYXNoKCl9O30KZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KXt2YXIgcmVzdWx0PWdldE1hcERhdGEodGhpcyxrZXkpWydkZWxldGUnXShrZXkpO3RoaXMuc2l6ZS09cmVzdWx0PzE6MDtyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuZ2V0KGtleSk7fQpmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsa2V5KS5oYXMoa2V5KTt9CmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9Z2V0TWFwRGF0YSh0aGlzLGtleSksc2l6ZT1kYXRhLnNpemU7ZGF0YS5zZXQoa2V5LHZhbHVlKTt0aGlzLnNpemUrPWRhdGEuc2l6ZT09c2l6ZT8wOjE7cmV0dXJuIHRoaXM7fQpNYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3RoaXMuYWRkKHZhbHVlc1tpbmRleF0pO319CmZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKXt0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSxIQVNIX1VOREVGSU5FRCk7cmV0dXJuIHRoaXM7fQpmdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTt9ClNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZTt9CmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoKTt0aGlzLnNpemU9MDt9CmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsnZGVsZXRlJ10oa2V5KTt0aGlzLnNpemU9ZGF0YS5zaXplO3JldHVybiByZXN1bHQ7fQpmdW5jdGlvbiBzdGFja0dldChrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO30KZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTt9CmZ1bmN0aW9uIHN0YWNrU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKXt2YXIgcGFpcnM9ZGF0YS5fX2RhdGFfXztpZighTWFwfHxwYWlycy5sZW5ndGg8TEFSR0VfQVJSQVlfU0laRS0xKXtwYWlycy5wdXNoKFtrZXksdmFsdWVdKTt0aGlzLnNpemU9KytkYXRhLnNpemU7cmV0dXJuIHRoaXM7fQpkYXRhPXRoaXMuX19kYXRhX189bmV3IE1hcENhY2hlKHBhaXJzKTt9CmRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpczt9ClN0YWNrLnByb3RvdHlwZS5jbGVhcj1zdGFja0NsZWFyO1N0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ109c3RhY2tEZWxldGU7U3RhY2sucHJvdG90eXBlLmdldD1zdGFja0dldDtTdGFjay5wcm90b3R5cGUuaGFzPXN0YWNrSGFzO1N0YWNrLnByb3RvdHlwZS5zZXQ9c3RhY2tTZXQ7ZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSxpbmhlcml0ZWQpe3ZhciBpc0Fycj1pc0FycmF5KHZhbHVlKSxpc0FyZz0haXNBcnImJmlzQXJndW1lbnRzKHZhbHVlKSxpc0J1ZmY9IWlzQXJyJiYhaXNBcmcmJmlzQnVmZmVyKHZhbHVlKSxpc1R5cGU9IWlzQXJyJiYhaXNBcmcmJiFpc0J1ZmYmJmlzVHlwZWRBcnJheSh2YWx1ZSksc2tpcEluZGV4ZXM9aXNBcnJ8fGlzQXJnfHxpc0J1ZmZ8fGlzVHlwZSxyZXN1bHQ9c2tpcEluZGV4ZXM/YmFzZVRpbWVzKHZhbHVlLmxlbmd0aCxTdHJpbmcpOltdLGxlbmd0aD1yZXN1bHQubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKXtpZigoaW5oZXJpdGVkfHxoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLGtleSkpJiYhKHNraXBJbmRleGVzJiYoa2V5PT0nbGVuZ3RoJ3x8aXNCdWZmJiYoa2V5PT0nb2Zmc2V0J3x8a2V5PT0ncGFyZW50Jyl8fGlzVHlwZSYmKGtleT09J2J1ZmZlcid8fGtleT09J2J5dGVMZW5ndGgnfHxrZXk9PSdieXRlT2Zmc2V0Jyl8fGlzSW5kZXgoa2V5LGxlbmd0aCkpKSkKe3Jlc3VsdC5wdXNoKGtleSk7fX0KcmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSxrZXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXtpZihlcShhcnJheVtsZW5ndGhdWzBdLGtleSkpe3JldHVybiBsZW5ndGg7fX0KcmV0dXJuLTE7fQpmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0Z1bmMsc3ltYm9sc0Z1bmMpe3ZhciByZXN1bHQ9a2V5c0Z1bmMob2JqZWN0KTtyZXR1cm4gaXNBcnJheShvYmplY3QpP3Jlc3VsdDphcnJheVB1c2gocmVzdWx0LHN5bWJvbHNGdW5jKG9iamVjdCkpO30KZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpe3JldHVybiB2YWx1ZT09PXVuZGVmaW5lZD91bmRlZmluZWRUYWc6bnVsbFRhZzt9CnJldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKTt9CmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1hcmdzVGFnO30KZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKXtpZih2YWx1ZT09PW90aGVyKXtyZXR1cm4gdHJ1ZTt9CmlmKHZhbHVlPT1udWxsfHxvdGhlcj09bnVsbHx8IWlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc09iamVjdExpa2Uob3RoZXIpKXtyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjt9CnJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGJhc2VJc0VxdWFsLHN0YWNrKTt9CmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSl7cmV0dXJuIGZhbHNlO30Kb2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj1mYWxzZTt9CmlmKGlzU2FtZVRhZyYmIW9iaklzT2JqKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjaygpKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk7fQppZighKGJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKXt2YXIgb2JqSXNXcmFwcGVkPW9iaklzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwnX193cmFwcGVkX18nKSxvdGhJc1dyYXBwZWQ9b3RoSXNPYmomJmhhc093blByb3BlcnR5LmNhbGwob3RoZXIsJ19fd3JhcHBlZF9fJyk7aWYob2JqSXNXcmFwcGVkfHxvdGhJc1dyYXBwZWQpe3ZhciBvYmpVbndyYXBwZWQ9b2JqSXNXcmFwcGVkP29iamVjdC52YWx1ZSgpOm9iamVjdCxvdGhVbndyYXBwZWQ9b3RoSXNXcmFwcGVkP290aGVyLnZhbHVlKCk6b3RoZXI7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2soKSk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayk7fX0KaWYoIWlzU2FtZVRhZyl7cmV0dXJuIGZhbHNlO30Kc3RhY2t8fChzdGFjaz1uZXcgU3RhY2soKSk7cmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk7fQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSl7cmV0dXJuIGZhbHNlO30KdmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO30KZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkmJiEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO30KZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KXtpZighaXNQcm90b3R5cGUob2JqZWN0KSl7cmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTt9CnZhciByZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpe2lmKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkmJmtleSE9J2NvbnN0cnVjdG9yJyl7cmVzdWx0LnB1c2goa2V5KTt9fQpyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHLGFyckxlbmd0aD1hcnJheS5sZW5ndGgsb3RoTGVuZ3RoPW90aGVyLmxlbmd0aDtpZihhcnJMZW5ndGghPW90aExlbmd0aCYmIShpc1BhcnRpYWwmJm90aExlbmd0aD5hcnJMZW5ndGgpKXtyZXR1cm4gZmFsc2U7fQp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpe3JldHVybiBzdGFja2VkPT1vdGhlcjt9CnZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGUoKTp1bmRlZmluZWQ7c3RhY2suc2V0KGFycmF5LG90aGVyKTtzdGFjay5zZXQob3RoZXIsYXJyYXkpO3doaWxlKCsraW5kZXg8YXJyTGVuZ3RoKXt2YXIgYXJyVmFsdWU9YXJyYXlbaW5kZXhdLG90aFZhbHVlPW90aGVyW2luZGV4XTtpZihjdXN0b21pemVyKXt2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO30KaWYoY29tcGFyZWQhPT11bmRlZmluZWQpe2lmKGNvbXBhcmVkKXtjb250aW51ZTt9CnJlc3VsdD1mYWxzZTticmVhazt9CmlmKHNlZW4pe2lmKCFhcnJheVNvbWUob3RoZXIsZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSl7cmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7fX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWs7fX1lbHNlIGlmKCEoYXJyVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKGFyclZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjaykpKQp7cmVzdWx0PWZhbHNlO2JyZWFrO319CnN0YWNrWydkZWxldGUnXShhcnJheSk7c3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtyZXR1cm4gcmVzdWx0O30KZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT1vdGhlci5ieXRlT2Zmc2V0KXtyZXR1cm4gZmFsc2U7fQpvYmplY3Q9b2JqZWN0LmJ1ZmZlcjtvdGhlcj1vdGhlci5idWZmZXI7Y2FzZSBhcnJheUJ1ZmZlclRhZzppZihvYmplY3QuYnl0ZUxlbmd0aCE9b3RoZXIuYnl0ZUxlbmd0aHx8IWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLG5ldyBVaW50OEFycmF5KG90aGVyKSkpe3JldHVybiBmYWxzZTt9CnJldHVybiB0cnVlO2Nhc2UgYm9vbFRhZzpjYXNlIGRhdGVUYWc6Y2FzZSBudW1iZXJUYWc6cmV0dXJuIGVxKCtvYmplY3QsK290aGVyKTtjYXNlIGVycm9yVGFnOnJldHVybiBvYmplY3QubmFtZT09b3RoZXIubmFtZSYmb2JqZWN0Lm1lc3NhZ2U9PW90aGVyLm1lc3NhZ2U7Y2FzZSByZWdleHBUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG9iamVjdD09b3RoZXIrJyc7Y2FzZSBtYXBUYWc6dmFyIGNvbnZlcnQ9bWFwVG9BcnJheTtjYXNlIHNldFRhZzp2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUc7Y29udmVydHx8KGNvbnZlcnQ9c2V0VG9BcnJheSk7aWYob2JqZWN0LnNpemUhPW90aGVyLnNpemUmJiFpc1BhcnRpYWwpe3JldHVybiBmYWxzZTt9CnZhciBzdGFja2VkPXN0YWNrLmdldChvYmplY3QpO2lmKHN0YWNrZWQpe3JldHVybiBzdGFja2VkPT1vdGhlcjt9CmJpdG1hc2t8PUNPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7c3RhY2suc2V0KG9iamVjdCxvdGhlcik7dmFyIHJlc3VsdD1lcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksY29udmVydChvdGhlciksYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayk7c3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7cmV0dXJuIHJlc3VsdDtjYXNlIHN5bWJvbFRhZzppZihzeW1ib2xWYWx1ZU9mKXtyZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCk9PXN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7fX0KcmV0dXJuIGZhbHNlO30KZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbCl7cmV0dXJuIGZhbHNlO30KdmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSl7cmV0dXJuIGZhbHNlO319CnZhciBzdGFja2VkPXN0YWNrLmdldChvYmplY3QpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpe3JldHVybiBzdGFja2VkPT1vdGhlcjt9CnZhciByZXN1bHQ9dHJ1ZTtzdGFjay5zZXQob2JqZWN0LG90aGVyKTtzdGFjay5zZXQob3RoZXIsb2JqZWN0KTt2YXIgc2tpcEN0b3I9aXNQYXJ0aWFsO3doaWxlKCsraW5kZXg8b2JqTGVuZ3RoKXtrZXk9b2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpe3ZhciBjb21wYXJlZD1pc1BhcnRpYWw/Y3VzdG9taXplcihvdGhWYWx1ZSxvYmpWYWx1ZSxrZXksb3RoZXIsb2JqZWN0LHN0YWNrKTpjdXN0b21pemVyKG9ialZhbHVlLG90aFZhbHVlLGtleSxvYmplY3Qsb3RoZXIsc3RhY2spO30KaWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpCntyZXN1bHQ9ZmFsc2U7YnJlYWs7fQpza2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09J2NvbnN0cnVjdG9yJyk7fQppZihyZXN1bHQmJiFza2lwQ3Rvcil7dmFyIG9iakN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yLG90aEN0b3I9b3RoZXIuY29uc3RydWN0b3I7aWYob2JqQ3RvciE9b3RoQ3RvciYmJ2NvbnN0cnVjdG9yJ2luIG9iamVjdCYmJ2NvbnN0cnVjdG9yJ2luIG90aGVyJiYhKHR5cGVvZiBvYmpDdG9yPT0nZnVuY3Rpb24nJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSdmdW5jdGlvbicmJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSl7cmVzdWx0PWZhbHNlO319CnN0YWNrWydkZWxldGUnXShvYmplY3QpO3N0YWNrWydkZWxldGUnXShvdGhlcik7cmV0dXJuIHJlc3VsdDt9CmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KXtyZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXMsZ2V0U3ltYm9scyk7fQpmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCxrZXkpe3ZhciBkYXRhPW1hcC5fX2RhdGFfXztyZXR1cm4gaXNLZXlhYmxlKGtleSk/ZGF0YVt0eXBlb2Yga2V5PT0nc3RyaW5nJz8nc3RyaW5nJzonaGFzaCddOmRhdGEubWFwO30KZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCxrZXkpe3ZhciB2YWx1ZT1nZXRWYWx1ZShvYmplY3Qsa2V5KTtyZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKT92YWx1ZTp1bmRlZmluZWQ7fQpmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpe3ZhciBpc093bj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlO31jYXRjaChlKXt9CnZhciByZXN1bHQ9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYodW5tYXNrZWQpe2lmKGlzT3duKXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dGFnO31lbHNle2RlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107fX0KcmV0dXJuIHJlc3VsdDt9CnZhciBnZXRTeW1ib2xzPSFuYXRpdmVHZXRTeW1ib2xzP3N0dWJBcnJheTpmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdD09bnVsbCl7cmV0dXJuW107fQpvYmplY3Q9T2JqZWN0KG9iamVjdCk7cmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSxmdW5jdGlvbihzeW1ib2wpe3JldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCxzeW1ib2wpO30pO307dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCgpKSE9bWFwVGFnfHxQcm9taXNlJiZnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpIT1wcm9taXNlVGFnfHxTZXQmJmdldFRhZyhuZXcgU2V0KCkpIT1zZXRUYWd8fFdlYWtNYXAmJmdldFRhZyhuZXcgV2Vha01hcCgpKSE9d2Vha01hcFRhZyl7Z2V0VGFnPWZ1bmN0aW9uKHZhbHVlKXt2YXIgcmVzdWx0PWJhc2VHZXRUYWcodmFsdWUpLEN0b3I9cmVzdWx0PT1vYmplY3RUYWc/dmFsdWUuY29uc3RydWN0b3I6dW5kZWZpbmVkLGN0b3JTdHJpbmc9Q3Rvcj90b1NvdXJjZShDdG9yKTonJztpZihjdG9yU3RyaW5nKXtzd2l0Y2goY3RvclN0cmluZyl7Y2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6cmV0dXJuIGRhdGFWaWV3VGFnO2Nhc2UgbWFwQ3RvclN0cmluZzpyZXR1cm4gbWFwVGFnO2Nhc2UgcHJvbWlzZUN0b3JTdHJpbmc6cmV0dXJuIHByb21pc2VUYWc7Y2FzZSBzZXRDdG9yU3RyaW5nOnJldHVybiBzZXRUYWc7Y2FzZSB3ZWFrTWFwQ3RvclN0cmluZzpyZXR1cm4gd2Vha01hcFRhZzt9fQpyZXR1cm4gcmVzdWx0O307fQpmdW5jdGlvbiBpc0luZGV4KHZhbHVlLGxlbmd0aCl7bGVuZ3RoPWxlbmd0aD09bnVsbD9NQVhfU0FGRV9JTlRFR0VSOmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmKHR5cGVvZiB2YWx1ZT09J251bWJlcid8fHJlSXNVaW50LnRlc3QodmFsdWUpKSYmdmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPGxlbmd0aDt9CmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0nc3RyaW5nJ3x8dHlwZT09J251bWJlcid8fHR5cGU9PSdzeW1ib2wnfHx0eXBlPT0nYm9vbGVhbic/dmFsdWUhPT0nX19wcm90b19fJzp2YWx1ZT09PW51bGw7fQpmdW5jdGlvbiBpc01hc2tlZChmdW5jKXtyZXR1cm4hIW1hc2tTcmNLZXkmJm1hc2tTcmNLZXkgaW4gZnVuYzt9CmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKXt2YXIgQ3Rvcj12YWx1ZSYmdmFsdWUuY29uc3RydWN0b3IscHJvdG89dHlwZW9mIEN0b3I9PSdmdW5jdGlvbicmJkN0b3IucHJvdG90eXBlfHxvYmplY3RQcm90bztyZXR1cm4gdmFsdWU9PT1wcm90bzt9CmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO31jYXRjaChlKXt9CnRyeXtyZXR1cm4gZnVuYysnJzt9Y2F0Y2goZSl7fX0KcmV0dXJuJyc7fQpmdW5jdGlvbiBlcSh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPT09b3RoZXJ8fHZhbHVlIT09dmFsdWUmJm90aGVyIT09b3RoZXI7fQp2YXIgaXNBcmd1bWVudHM9YmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50czt9KCkpP2Jhc2VJc0FyZ3VtZW50czpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsJ2NhbGxlZScpJiYhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwnY2FsbGVlJyk7fTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKXtyZXR1cm4gdmFsdWUhPW51bGwmJmlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkmJiFpc0Z1bmN0aW9uKHZhbHVlKTt9CnZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO2Z1bmN0aW9uIGlzRXF1YWwodmFsdWUsb3RoZXIpe3JldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSxvdGhlcik7fQpmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXtyZXR1cm4gZmFsc2U7fQp2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnfHx0YWc9PWFzeW5jVGFnfHx0YWc9PXByb3h5VGFnO30KZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSdudW1iZXInJiZ2YWx1ZT4tMSYmdmFsdWUlMT09MCYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVI7fQpmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSdvYmplY3QnfHx0eXBlPT0nZnVuY3Rpb24nKTt9CmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWU9PSdvYmplY3QnO30KdmFyIGlzVHlwZWRBcnJheT1ub2RlSXNUeXBlZEFycmF5P2Jhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KTpiYXNlSXNUeXBlZEFycmF5O2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KTt9CmZ1bmN0aW9uIHN0dWJBcnJheSgpe3JldHVybltdO30KZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlO30KbW9kdWxlLmV4cG9ydHM9aXNFcXVhbDt9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp7fSk7fSx7fV0sMTI3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLmdldFJlbmRlcmluZ0RhdGFGcm9tVmlld3BvcnQ9ZnVuY3Rpb24odmlld3BvcnRQcm9wZXJ0aWVzLHVhRGV2aWNlV2lkdGgsdWFEZXZpY2VIZWlnaHQsdWFNYXhab29tLHVhTWluWm9vbSl7dmFyIHZ3PXVhRGV2aWNlV2lkdGgvMTAwO3ZhciB2aD11YURldmljZUhlaWdodC8xMDA7dmFyIG1heFpvb209bnVsbDt2YXIgbWluWm9vbT1udWxsO3ZhciB6b29tPW51bGw7dmFyIG1pbldpZHRoPW51bGw7dmFyIG1pbkhlaWdodD1udWxsO3ZhciBtYXhXaWR0aD1udWxsO3ZhciBtYXhIZWlnaHQ9bnVsbDt2YXIgd2lkdGg9bnVsbCxoZWlnaHQ9bnVsbDt2YXIgaW5pdGlhbFdpZHRoPXVhRGV2aWNlV2lkdGg7dmFyIGluaXRpYWxIZWlnaHQ9dWFEZXZpY2VIZWlnaHQ7dmFyIHVzZXJab29tPSJ6b29tIjtpZih2aWV3cG9ydFByb3BlcnRpZXNbIm1heGltdW0tc2NhbGUiXSE9PXVuZGVmaW5lZCl7bWF4Wm9vbT10cmFuc2xhdGVab29tUHJvcGVydHkodmlld3BvcnRQcm9wZXJ0aWVzWyJtYXhpbXVtLXNjYWxlIl0pO30KaWYodmlld3BvcnRQcm9wZXJ0aWVzWyJtaW5pbXVtLXNjYWxlIl0hPT11bmRlZmluZWQpe21pblpvb209dHJhbnNsYXRlWm9vbVByb3BlcnR5KHZpZXdwb3J0UHJvcGVydGllc1sibWluaW11bS1zY2FsZSJdKTt9CmlmKHZpZXdwb3J0UHJvcGVydGllc1siaW5pdGlhbC1zY2FsZSJdIT09dW5kZWZpbmVkKXt6b29tPXRyYW5zbGF0ZVpvb21Qcm9wZXJ0eSh2aWV3cG9ydFByb3BlcnRpZXNbImluaXRpYWwtc2NhbGUiXSk7fQppZihtaW5ab29tIT09bnVsbCYmbWF4Wm9vbT09PW51bGwpe21pblpvb209bWluKHVhTWF4Wm9vbSx0cmFuc2xhdGVab29tUHJvcGVydHkodmlld3BvcnRQcm9wZXJ0aWVzWyJtaW5pbXVtLXNjYWxlIl0pKTt9CmlmKHZpZXdwb3J0UHJvcGVydGllc1sid2lkdGgiXSE9PXVuZGVmaW5lZCl7bWluV2lkdGg9ImV4dGVuZC10by16b29tIjttYXhXaWR0aD10cmFuc2xhdGVMZW5ndGhQcm9wZXJ0eSh2aWV3cG9ydFByb3BlcnRpZXNbIndpZHRoIl0sdncsdmgpO30KaWYodmlld3BvcnRQcm9wZXJ0aWVzWyJoZWlnaHQiXSE9PXVuZGVmaW5lZCl7bWluSGVpZ2h0PSJleHRlbmQtdG8tem9vbSI7bWF4SGVpZ2h0PXRyYW5zbGF0ZUxlbmd0aFByb3BlcnR5KHZpZXdwb3J0UHJvcGVydGllc1siaGVpZ2h0Il0sdncsdmgpO30KaWYodmlld3BvcnRQcm9wZXJ0aWVzWyJ1c2VyLXNjYWxhYmxlIl0hPT11bmRlZmluZWQpe3VzZXJab29tPXZpZXdwb3J0UHJvcGVydGllc1sidXNlci1zY2FsYWJsZSJdO2lmKHR5cGVvZiB1c2VyWm9vbT09PSJudW1iZXIiKXtpZih1c2VyWm9vbT49MXx8dXNlclpvb208PS0xKXt1c2VyWm9vbT0iem9vbSI7fWVsc2V7dXNlclpvb209ImZpeGVkIjt9fWVsc2V7c3dpdGNoKHVzZXJab29tKXtjYXNlInllcyI6Y2FzZSJkZXZpY2Utd2lkdGgiOmNhc2UiZGV2aWNlLWhlaWdodCI6dXNlclpvb209Inpvb20iO2JyZWFrO2Nhc2Uibm8iOmRlZmF1bHQ6dXNlclpvb209ImZpeGVkIjticmVhazt9fX0KaWYoem9vbSE9PW51bGwmJih2aWV3cG9ydFByb3BlcnRpZXNbIndpZHRoIl09PT11bmRlZmluZWR8fHdpZHRoPT09dW5kZWZpbmVkKSl7aWYodmlld3BvcnRQcm9wZXJ0aWVzWyJoZWlnaHQiXSE9PXVuZGVmaW5lZCl7bWluV2lkdGg9bnVsbDttYXhXaWR0aD1udWxsO31lbHNle21pbldpZHRoPSJleHRlbmQtdG8tem9vbSI7bWF4V2lkdGg9ImV4dGVuZC10by16b29tIjt9fQppZihtaW5ab29tIT09bnVsbCYmbWF4Wm9vbSE9PW51bGwpe21heFpvb209bWF4KG1pblpvb20sbWF4Wm9vbSk7fQppZih6b29tIT09bnVsbCl7em9vbT1jbGFtcCh6b29tLG1pblpvb20sbWF4Wm9vbSk7fQp2YXIgZXh0ZW5kWm9vbT16b29tPT09bnVsbCYmbWF4Wm9vbT09PW51bGw/bnVsbDptaW4oem9vbSxtYXhab29tKTt2YXIgZXh0ZW5kV2lkdGgsZXh0ZW5kSGVpZ2h0O2lmKGV4dGVuZFpvb209PT1udWxsKXtpZihtYXhXaWR0aD09PSJleHRlbmQtdG8tem9vbSIpe21heFdpZHRoPW51bGw7fQppZihtYXhIZWlnaHQ9PT0iZXh0ZW5kLXRvLXpvb20iKXttYXhIZWlnaHQ9bnVsbDt9CmlmKG1pbldpZHRoPT09ImV4dGVuZC10by16b29tIil7bWluV2lkdGg9bWF4V2lkdGg7fQppZihtaW5IZWlnaHQ9PT0iZXh0ZW5kLXRvLXpvb20iKXttaW5IZWlnaHQ9bWF4SGVpZ2h0O319ZWxzZXtleHRlbmRXaWR0aD1pbml0aWFsV2lkdGgvZXh0ZW5kWm9vbTtleHRlbmRIZWlnaHQ9aW5pdGlhbEhlaWdodC9leHRlbmRab29tO2lmKG1heFdpZHRoPT09ImV4dGVuZC10by16b29tIil7bWF4V2lkdGg9ZXh0ZW5kV2lkdGg7fQppZihtYXhIZWlnaHQ9PT0iZXh0ZW5kLXRvLXpvb20iKXttYXhIZWlnaHQ9ZXh0ZW5kSGVpZ2h0O30KaWYobWluV2lkdGg9PT0iZXh0ZW5kLXRvLXpvb20iKXttaW5XaWR0aD1tYXgoZXh0ZW5kV2lkdGgsbWF4V2lkdGgpO30KaWYobWluSGVpZ2h0PT09ImV4dGVuZC10by16b29tIil7bWluSGVpZ2h0PW1heChleHRlbmRIZWlnaHQsbWF4SGVpZ2h0KTt9fQppZihtaW5XaWR0aCE9PW51bGx8fG1heFdpZHRoIT09bnVsbCl7d2lkdGg9bWF4KG1pbldpZHRoLG1pbihtYXhXaWR0aCxpbml0aWFsV2lkdGgpKTt9CmlmKG1pbkhlaWdodCE9PW51bGx8fG1heEhlaWdodCE9PW51bGwpe2hlaWdodD1tYXgobWluSGVpZ2h0LG1pbihtYXhIZWlnaHQsaW5pdGlhbEhlaWdodCkpO30KaWYod2lkdGg9PT1udWxsKXtpZihoZWlnaHQ9PT1udWxsKXt3aWR0aD1pbml0aWFsV2lkdGg7fWVsc2V7aWYoaW5pdGlhbEhlaWdodCE9PTApe3dpZHRoPU1hdGgucm91bmQoaGVpZ2h0Kihpbml0aWFsV2lkdGgvaW5pdGlhbEhlaWdodCkpO31lbHNle3dpZHRoPWluaXRpYWxXaWR0aDt9fX0KaWYoaGVpZ2h0PT09bnVsbCl7aWYoaW5pdGlhbFdpZHRoIT09MCl7aGVpZ2h0PU1hdGgucm91bmQod2lkdGgqKGluaXRpYWxIZWlnaHQvaW5pdGlhbFdpZHRoKSk7fWVsc2V7aGVpZ2h0PWluaXRpYWxIZWlnaHQ7fX0KcmV0dXJue3pvb206em9vbSx3aWR0aDp3aWR0aCxoZWlnaHQ6aGVpZ2h0LHVzZXJab29tOnVzZXJab29tfTt9O2Z1bmN0aW9uIG1pbihhLGIpe2lmKGE9PT1udWxsKXJldHVybiBiO2lmKGI9PT1udWxsKXJldHVybiBhO3JldHVybiBNYXRoLm1pbihhLGIpO30KZnVuY3Rpb24gbWF4KGEsYil7aWYoYT09PW51bGwpcmV0dXJuIGI7aWYoYj09PW51bGwpcmV0dXJuIGE7cmV0dXJuIE1hdGgubWF4KGEsYik7fQpmdW5jdGlvbiB0cmFuc2xhdGVMZW5ndGhQcm9wZXJ0eShwcm9wLHZ3LHZoKXtpZih0eXBlb2YgcHJvcD09PSJudW1iZXIiKXtpZihwcm9wPj0wKXtyZXR1cm4gY2xhbXAocHJvcCwxLDEwMDAwKTt9ZWxzZXtyZXR1cm4gdW5kZWZpbmVkO319CmlmKHByb3A9PT0iZGV2aWNlLXdpZHRoIil7cmV0dXJuIDEwMCp2dzt9CmlmKHByb3A9PT0iZGV2aWNlLWhlaWdodCIpe3JldHVybiAxMDAqdmg7fQpyZXR1cm4gMTt9CmZ1bmN0aW9uIHRyYW5zbGF0ZVpvb21Qcm9wZXJ0eShwcm9wKXtpZih0eXBlb2YgcHJvcD09PSJudW1iZXIiKXtpZihwcm9wPj0wKXtyZXR1cm4gY2xhbXAocHJvcCwwLjEsMTApO31lbHNle3JldHVybiB1bmRlZmluZWQ7fX0KaWYocHJvcD09PSJ5ZXMiKXtyZXR1cm4gMTt9CmlmKHByb3A9PT0iZGV2aWNlLXdpZHRoInx8cHJvcD09PSJkZXZpY2UtaGVpZ2h0Iil7cmV0dXJuIDEwO30KaWYocHJvcD09PSJubyJ8fHByb3A9PT1udWxsKXtyZXR1cm4gMC4xO319CmZ1bmN0aW9uIGNsYW1wKHZhbHVlLG1pbnYsbWF4dil7cmV0dXJuIG1heChtaW4odmFsdWUsbWF4diksbWludik7fQpleHBvcnRzLnBhcnNlTWV0YVZpZXdQb3J0Q29udGVudD1mdW5jdGlvbihTKXt2YXIgcGFyc2VkQ29udGVudD17dmFsaWRQcm9wZXJ0aWVzOnt9LHVua25vd25Qcm9wZXJ0aWVzOnt9LGludmFsaWRWYWx1ZXM6e319O3ZhciBpPTE7d2hpbGUoaTw9Uy5sZW5ndGgpe3doaWxlKGk8PVMubGVuZ3RoJiZSZWdFeHAoJyB8XHgwQXxceDA5fFwwZHwsfDt8PScpLnRlc3QoU1tpLTFdKSl7aSsrO30KaWYoaTw9Uy5sZW5ndGgpe2k9cGFyc2VQcm9wZXJ0eShwYXJzZWRDb250ZW50LFMsaSk7fX0KcmV0dXJuIHBhcnNlZENvbnRlbnQ7fTt2YXIgcHJvcGVydHlOYW1lcz1bIndpZHRoIiwiaGVpZ2h0IiwiaW5pdGlhbC1zY2FsZSIsIm1pbmltdW0tc2NhbGUiLCJtYXhpbXVtLXNjYWxlIiwidXNlci1zY2FsYWJsZSIsInNocmluay10by1maXQiLCJ2aWV3cG9ydC1maXQiXTtmdW5jdGlvbiBwYXJzZVByb3BlcnR5KHBhcnNlZENvbnRlbnQsUyxpKXt2YXIgc3RhcnQ9aTt3aGlsZShpPD1TLmxlbmd0aCYmIVJlZ0V4cCgnIHxceDBBfFx4MDl8XDBkfCx8O3w9JykudGVzdChTW2ktMV0pKXtpKys7fQppZihpPlMubGVuZ3RofHxSZWdFeHAoJyx8OycpLnRlc3QoU1tpLTFdKSl7cmV0dXJuIGk7fQp2YXIgcHJvcGVydHlOYW1lPVMuc2xpY2Uoc3RhcnQtMSxpLTEpO3doaWxlKGk8PVMubGVuZ3RoJiYhUmVnRXhwKCcsfDt8PScpLnRlc3QoU1tpLTFdKSl7aSsrO30KaWYoaT5TLmxlbmd0aHx8UmVnRXhwKCcsfDsnKS50ZXN0KFNbaS0xXSkpe3JldHVybiBpO30Kd2hpbGUoaTw9Uy5sZW5ndGgmJlJlZ0V4cCgnIHxceDBBfFx4MDl8XDBkfD0nKS50ZXN0KFNbaS0xXSkpe2krKzt9CmlmKGk+Uy5sZW5ndGh8fFJlZ0V4cCgnLHw7JykudGVzdChTW2ktMV0pKXtyZXR1cm4gaTt9CnN0YXJ0PWk7d2hpbGUoaTw9Uy5sZW5ndGgmJiFSZWdFeHAoJyB8XHgwQXxceDA5fFwwZHwsfDt8PScpLnRlc3QoU1tpLTFdKSl7aSsrO30KdmFyIHByb3BlcnR5VmFsdWU9Uy5zbGljZShzdGFydC0xLGktMSk7c2V0UHJvcGVydHkocGFyc2VkQ29udGVudCxwcm9wZXJ0eU5hbWUscHJvcGVydHlWYWx1ZSk7cmV0dXJuIGk7fQpmdW5jdGlvbiBzZXRQcm9wZXJ0eShwYXJzZWRDb250ZW50LG5hbWUsdmFsdWUpe2lmKHByb3BlcnR5TmFtZXMuaW5kZXhPZihuYW1lKT49MCl7dmFyIG51bWJlcj1wYXJzZUZsb2F0KHZhbHVlKTtpZighaXNOYU4obnVtYmVyKSl7cGFyc2VkQ29udGVudC52YWxpZFByb3BlcnRpZXNbbmFtZV09bnVtYmVyO3JldHVybjt9CnZhciBzdHJpbmc9dmFsdWUudG9Mb3dlckNhc2UoKTtpZihzdHJpbmc9PT0ieWVzInx8c3RyaW5nPT09Im5vInx8c3RyaW5nPT09ImRldmljZS13aWR0aCJ8fHN0cmluZz09PSJkZXZpY2UtaGVpZ2h0Inx8bmFtZS50b0xvd2VyQ2FzZSgpPT09J3ZpZXdwb3J0LWZpdCcmJihzdHJpbmc9PT0nYXV0byd8fHN0cmluZz09PSdjb3ZlcicpKXtwYXJzZWRDb250ZW50LnZhbGlkUHJvcGVydGllc1tuYW1lXT1zdHJpbmc7cmV0dXJuO30KcGFyc2VkQ29udGVudC52YWxpZFByb3BlcnRpZXNbbmFtZV09bnVsbDtwYXJzZWRDb250ZW50LmludmFsaWRWYWx1ZXNbbmFtZV09dmFsdWU7fWVsc2V7cGFyc2VkQ29udGVudC51bmtub3duUHJvcGVydGllc1tuYW1lXT12YWx1ZTt9fQpleHBvcnRzLmV4cGVjdGVkVmFsdWVzPXsid2lkdGgiOlsiZGV2aWNlLXdpZHRoIiwiZGV2aWNlLWhlaWdodCIsImEgcG9zaXRpdmUgbnVtYmVyIl0sImhlaWdodCI6WyJkZXZpY2Utd2lkdGgiLCJkZXZpY2UtaGVpZ2h0IiwiYSBwb3NpdGl2ZSBudW1iZXIiXSwiaW5pdGlhbC1zY2FsZSI6WyJhIHBvc2l0aXZlIG51bWJlciJdLCJtaW5pbXVtLXNjYWxlIjpbImEgcG9zaXRpdmUgbnVtYmVyIl0sIm1heGltdW0tc2NhbGUiOlsiYSBwb3NpdGl2ZSBudW1iZXIiXSwidXNlci1zY2FsYWJsZSI6WyJ5ZXMiLCJubyIsIjAiLCIxIl0sInNocmluay10by1maXQiOlsieWVzIiwibm8iXSwidmlld3BvcnQtZml0IjpbImF1dG8iLCJjb3ZlciJdfTt9LHt9XSwxMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBzPTEwMDA7dmFyIG09cyo2MDt2YXIgaD1tKjYwO3ZhciBkPWgqMjQ7dmFyIHk9ZCozNjUuMjU7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odmFsLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307dmFyIHR5cGU9dHlwZW9mIHZhbDtpZih0eXBlPT09J3N0cmluZycmJnZhbC5sZW5ndGg+MCl7cmV0dXJuIHBhcnNlKHZhbCk7fWVsc2UgaWYodHlwZT09PSdudW1iZXInJiZpc05hTih2YWwpPT09ZmFsc2Upe3JldHVybiBvcHRpb25zLmxvbmc/Zm10TG9uZyh2YWwpOmZtdFNob3J0KHZhbCk7fQp0aHJvdyBuZXcgRXJyb3IoJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JysKSlNPTi5zdHJpbmdpZnkodmFsKSk7fTtmdW5jdGlvbiBwYXJzZShzdHIpe3N0cj1TdHJpbmcoc3RyKTtpZihzdHIubGVuZ3RoPjEwMCl7cmV0dXJuO30KdmFyIG1hdGNoPS9eKCg/OlxkKyk/XC4/XGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtpZighbWF0Y2gpe3JldHVybjt9CnZhciBuPXBhcnNlRmxvYXQobWF0Y2hbMV0pO3ZhciB0eXBlPShtYXRjaFsyXXx8J21zJykudG9Mb3dlckNhc2UoKTtzd2l0Y2godHlwZSl7Y2FzZSd5ZWFycyc6Y2FzZSd5ZWFyJzpjYXNlJ3lycyc6Y2FzZSd5cic6Y2FzZSd5JzpyZXR1cm4gbip5O2Nhc2UnZGF5cyc6Y2FzZSdkYXknOmNhc2UnZCc6cmV0dXJuIG4qZDtjYXNlJ2hvdXJzJzpjYXNlJ2hvdXInOmNhc2UnaHJzJzpjYXNlJ2hyJzpjYXNlJ2gnOnJldHVybiBuKmg7Y2FzZSdtaW51dGVzJzpjYXNlJ21pbnV0ZSc6Y2FzZSdtaW5zJzpjYXNlJ21pbic6Y2FzZSdtJzpyZXR1cm4gbiptO2Nhc2Unc2Vjb25kcyc6Y2FzZSdzZWNvbmQnOmNhc2Unc2Vjcyc6Y2FzZSdzZWMnOmNhc2Uncyc6cmV0dXJuIG4qcztjYXNlJ21pbGxpc2Vjb25kcyc6Y2FzZSdtaWxsaXNlY29uZCc6Y2FzZSdtc2Vjcyc6Y2FzZSdtc2VjJzpjYXNlJ21zJzpyZXR1cm4gbjtkZWZhdWx0OnJldHVybiB1bmRlZmluZWQ7fX0KZnVuY3Rpb24gZm10U2hvcnQobXMpe2lmKG1zPj1kKXtyZXR1cm4gTWF0aC5yb3VuZChtcy9kKSsnZCc7fQppZihtcz49aCl7cmV0dXJuIE1hdGgucm91bmQobXMvaCkrJ2gnO30KaWYobXM+PW0pe3JldHVybiBNYXRoLnJvdW5kKG1zL20pKydtJzt9CmlmKG1zPj1zKXtyZXR1cm4gTWF0aC5yb3VuZChtcy9zKSsncyc7fQpyZXR1cm4gbXMrJ21zJzt9CmZ1bmN0aW9uIGZtdExvbmcobXMpe3JldHVybiBwbHVyYWwobXMsZCwnZGF5Jyl8fHBsdXJhbChtcyxoLCdob3VyJyl8fHBsdXJhbChtcyxtLCdtaW51dGUnKXx8cGx1cmFsKG1zLHMsJ3NlY29uZCcpfHxtcysnIG1zJzt9CmZ1bmN0aW9uIHBsdXJhbChtcyxuLG5hbWUpe2lmKG1zPG4pe3JldHVybjt9CmlmKG1zPG4qMS41KXtyZXR1cm4gTWF0aC5mbG9vcihtcy9uKSsnICcrbmFtZTt9CnJldHVybiBNYXRoLmNlaWwobXMvbikrJyAnK25hbWUrJ3MnO319LHt9XSwxMjk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHBhcnNlQ2FjaGVDb250cm9sKGZpZWxkKXtpZih0eXBlb2YgZmllbGQhPT0nc3RyaW5nJyl7cmV0dXJuIG51bGw7fQp2YXIgcmVnZXg9Lyg/Ol58KD86XHMqXCxccyopKShbXlx4MDAtXHgyMFwoXCk8PkBcLDtcOlxcIlwvXFtcXVw/XD1ce1x9XHg3Rl0rKSg/Olw9KD86KFteXHgwMC1ceDIwXChcKTw+QFwsO1w6XFwiXC9cW1xdXD9cPVx7XH1ceDdGXSspfCg/OlwiKCg/OlteIlxcXXxcXC4pKilcIikpKT8vZzt2YXIgaGVhZGVyPXt9O3ZhciBlcnI9ZmllbGQucmVwbGFjZShyZWdleCxmdW5jdGlvbigkMCwkMSwkMiwkMyl7dmFyIHZhbHVlPSQyfHwkMztoZWFkZXJbJDFdPXZhbHVlP3ZhbHVlLnRvTG93ZXJDYXNlKCk6dHJ1ZTtyZXR1cm4nJzt9KTtpZihoZWFkZXJbJ21heC1hZ2UnXSl7dHJ5e3ZhciBtYXhBZ2U9cGFyc2VJbnQoaGVhZGVyWydtYXgtYWdlJ10sMTApO2lmKGlzTmFOKG1heEFnZSkpe3JldHVybiBudWxsO30KaGVhZGVyWydtYXgtYWdlJ109bWF4QWdlO30KY2F0Y2goZXJyKXt9fQpyZXR1cm4gZXJyP251bGw6aGVhZGVyO307fSx7fV0sMTMwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgVVJMPXJlcXVpcmUoJ3VybCcpLlVSTDtmdW5jdGlvbiB0cmltTGluZShsaW5lKXtpZighbGluZSl7cmV0dXJuIG51bGw7fQppZihBcnJheS5pc0FycmF5KGxpbmUpKXtyZXR1cm4gbGluZS5tYXAodHJpbUxpbmUpO30KcmV0dXJuIFN0cmluZyhsaW5lKS50cmltKCk7fQpmdW5jdGlvbiByZW1vdmVDb21tZW50cyhsaW5lKXt2YXIgY29tbWVudFN0YXJ0SW5kZXg9bGluZS5pbmRleE9mKCcjJyk7aWYoY29tbWVudFN0YXJ0SW5kZXg+LTEpe3JldHVybiBsaW5lLnN1YnN0cigwLGNvbW1lbnRTdGFydEluZGV4KTt9CnJldHVybiBsaW5lO30KZnVuY3Rpb24gc3BsaXRMaW5lKGxpbmUpe3ZhciBpZHg9U3RyaW5nKGxpbmUpLmluZGV4T2YoJzonKTtpZighbGluZXx8aWR4PDApe3JldHVybiBudWxsO30KcmV0dXJuW2xpbmUuc2xpY2UoMCxpZHgpLGxpbmUuc2xpY2UoaWR4KzEpXTt9CmZ1bmN0aW9uIGZvcm1hdFVzZXJBZ2VudCh1c2VyQWdlbnQpe3ZhciBmb3JtYXR0ZWRVc2VyQWdlbnQ9dXNlckFnZW50LnRvTG93ZXJDYXNlKCk7dmFyIGlkeD1mb3JtYXR0ZWRVc2VyQWdlbnQuaW5kZXhPZignLycpO2lmKGlkeD4tMSl7Zm9ybWF0dGVkVXNlckFnZW50PWZvcm1hdHRlZFVzZXJBZ2VudC5zdWJzdHIoMCxpZHgpO30KcmV0dXJuIGZvcm1hdHRlZFVzZXJBZ2VudC50cmltKCk7fQpmdW5jdGlvbiBub3JtYWxpc2VFbmNvZGluZyhwYXRoKXt0cnl7cmV0dXJuIHVybEVuY29kZVRvVXBwZXIoZW5jb2RlVVJJKHBhdGgpLnJlcGxhY2UoLyUyNS9nLCclJykpO31jYXRjaChlKXtyZXR1cm4gcGF0aDt9fQpmdW5jdGlvbiB1cmxFbmNvZGVUb1VwcGVyKHBhdGgpe3JldHVybiBwYXRoLnJlcGxhY2UoLyVbMC05YS1mQS1GXXsyfS9nLGZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gbWF0Y2gudG9VcHBlckNhc2UoKTt9KTt9CmZ1bmN0aW9uIHBhcnNlUGF0dGVybihwYXR0ZXJuKXt2YXIgcmVnZXhTcGVjaWFsQ2hhcnM9L1tcLVxbXF1cL1x7XH1cKFwpXCtcP1wuXFxcXlwkXHxdL2c7dmFyIHdpbGRDYXJkUGF0dGVybj0vXCovZzt2YXIgZW5kT2ZMaW5lUGF0dGVybj0vXFxcJCQvO3BhdHRlcm49bm9ybWFsaXNlRW5jb2RpbmcocGF0dGVybik7aWYocGF0dGVybi5pbmRleE9mKCcqJyk8MCYmcGF0dGVybi5pbmRleE9mKCckJyk8MCl7cmV0dXJuIHBhdHRlcm47fQpwYXR0ZXJuPXBhdHRlcm4ucmVwbGFjZShyZWdleFNwZWNpYWxDaGFycywnXFwkJicpLnJlcGxhY2Uod2lsZENhcmRQYXR0ZXJuLCcoPzouKiknKS5yZXBsYWNlKGVuZE9mTGluZVBhdHRlcm4sJyQnKTtyZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTt9CmZ1bmN0aW9uIHBhcnNlUm9ib3RzKGNvbnRlbnRzLHJvYm90cyl7dmFyIG5ld2xpbmVSZWdleD0vXHJcbnxccnxcbi87dmFyIGxpbmVzPWNvbnRlbnRzLnNwbGl0KG5ld2xpbmVSZWdleCkubWFwKHJlbW92ZUNvbW1lbnRzKS5tYXAoc3BsaXRMaW5lKS5tYXAodHJpbUxpbmUpO3ZhciBjdXJyZW50VXNlckFnZW50cz1bXTt2YXIgaXNOb25lVXNlckFnZW50U3RhdGU9dHJ1ZTtmb3IodmFyIGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspe3ZhciBsaW5lPWxpbmVzW2ldO2lmKCFsaW5lfHwhbGluZVswXSl7Y29udGludWU7fQpzd2l0Y2gobGluZVswXS50b0xvd2VyQ2FzZSgpKXtjYXNlJ3VzZXItYWdlbnQnOmlmKGlzTm9uZVVzZXJBZ2VudFN0YXRlKXtjdXJyZW50VXNlckFnZW50cy5sZW5ndGg9MDt9CmlmKGxpbmVbMV0pe2N1cnJlbnRVc2VyQWdlbnRzLnB1c2goZm9ybWF0VXNlckFnZW50KGxpbmVbMV0pKTt9CmJyZWFrO2Nhc2UnZGlzYWxsb3cnOnJvYm90cy5hZGRSdWxlKGN1cnJlbnRVc2VyQWdlbnRzLGxpbmVbMV0sZmFsc2UsaSsxKTticmVhaztjYXNlJ2FsbG93Jzpyb2JvdHMuYWRkUnVsZShjdXJyZW50VXNlckFnZW50cyxsaW5lWzFdLHRydWUsaSsxKTticmVhaztjYXNlJ2NyYXdsLWRlbGF5Jzpyb2JvdHMuc2V0Q3Jhd2xEZWxheShjdXJyZW50VXNlckFnZW50cyxsaW5lWzFdKTticmVhaztjYXNlJ3NpdGVtYXAnOmlmKGxpbmVbMV0pe3JvYm90cy5hZGRTaXRlbWFwKGxpbmVbMV0pO30KYnJlYWs7Y2FzZSdob3N0JzppZihsaW5lWzFdKXtyb2JvdHMuc2V0UHJlZmVycmVkSG9zdChsaW5lWzFdLnRvTG93ZXJDYXNlKCkpO30KYnJlYWs7fQppc05vbmVVc2VyQWdlbnRTdGF0ZT1saW5lWzBdLnRvTG93ZXJDYXNlKCkhPT0ndXNlci1hZ2VudCc7fX0KZnVuY3Rpb24gZmluZFJ1bGUocGF0aCxydWxlcyl7dmFyIG1hdGNoaW5nUnVsZT1udWxsO2Zvcih2YXIgaT0wO2k8cnVsZXMubGVuZ3RoO2krKyl7dmFyIHJ1bGU9cnVsZXNbaV07aWYodHlwZW9mIHJ1bGUucGF0dGVybj09PSdzdHJpbmcnKXtpZihwYXRoLmluZGV4T2YocnVsZS5wYXR0ZXJuKSE9PTApe2NvbnRpbnVlO30KaWYoIW1hdGNoaW5nUnVsZXx8cnVsZS5wYXR0ZXJuLmxlbmd0aD5tYXRjaGluZ1J1bGUucGF0dGVybi5sZW5ndGgpe21hdGNoaW5nUnVsZT1ydWxlO319ZWxzZSBpZihydWxlLnBhdHRlcm4udGVzdChwYXRoKSl7cmV0dXJuIHJ1bGU7fX0KcmV0dXJuIG1hdGNoaW5nUnVsZTt9CmZ1bmN0aW9uIHBhcnNlVXJsKHVybCl7dHJ5e3JldHVybiBuZXcgVVJMKHVybCk7fWNhdGNoKGUpe3JldHVybiBudWxsO319CmZ1bmN0aW9uIFJvYm90cyh1cmwsY29udGVudHMpe3RoaXMuX3VybD1wYXJzZVVybCh1cmwpfHx7fTt0aGlzLl91cmwucG9ydD10aGlzLl91cmwucG9ydHx8ODA7dGhpcy5fcnVsZXM9e307dGhpcy5fc2l0ZW1hcHM9W107dGhpcy5fcHJlZmVyZWRIb3N0PW51bGw7cGFyc2VSb2JvdHMoY29udGVudHN8fCcnLHRoaXMpO30KUm9ib3RzLnByb3RvdHlwZS5hZGRSdWxlPWZ1bmN0aW9uKHVzZXJBZ2VudHMscGF0dGVybixhbGxvdyxsaW5lTnVtYmVyKXt2YXIgcnVsZXM9dGhpcy5fcnVsZXM7dXNlckFnZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHVzZXJBZ2VudCl7cnVsZXNbdXNlckFnZW50XT1ydWxlc1t1c2VyQWdlbnRdfHxbXTtpZighcGF0dGVybil7cmV0dXJuO30KcnVsZXNbdXNlckFnZW50XS5wdXNoKHtwYXR0ZXJuOnBhcnNlUGF0dGVybihwYXR0ZXJuKSxhbGxvdzphbGxvdyxsaW5lTnVtYmVyOmxpbmVOdW1iZXJ9KTt9KTt9O1JvYm90cy5wcm90b3R5cGUuc2V0Q3Jhd2xEZWxheT1mdW5jdGlvbih1c2VyQWdlbnRzLGRlbGF5U3RyKXt2YXIgcnVsZXM9dGhpcy5fcnVsZXM7dmFyIGRlbGF5PU51bWJlcihkZWxheVN0cik7dXNlckFnZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHVzZXJBZ2VudCl7cnVsZXNbdXNlckFnZW50XT1ydWxlc1t1c2VyQWdlbnRdfHxbXTtpZihpc05hTihkZWxheSkpe3JldHVybjt9CnJ1bGVzW3VzZXJBZ2VudF0uY3Jhd2xEZWxheT1kZWxheTt9KTt9O1JvYm90cy5wcm90b3R5cGUuYWRkU2l0ZW1hcD1mdW5jdGlvbih1cmwpe3RoaXMuX3NpdGVtYXBzLnB1c2godXJsKTt9O1JvYm90cy5wcm90b3R5cGUuc2V0UHJlZmVycmVkSG9zdD1mdW5jdGlvbih1cmwpe3RoaXMuX3ByZWZlcmVkSG9zdD11cmw7fTtSb2JvdHMucHJvdG90eXBlLl9nZXRSdWxlPWZ1bmN0aW9uKHVybCx1YSl7dmFyIHBhcnNlZFVybD1wYXJzZVVybCh1cmwpfHx7fTt2YXIgdXNlckFnZW50PWZvcm1hdFVzZXJBZ2VudCh1YXx8JyonKTtwYXJzZWRVcmwucG9ydD1wYXJzZWRVcmwucG9ydHx8JzgwJztpZihwYXJzZWRVcmwucHJvdG9jb2whPT10aGlzLl91cmwucHJvdG9jb2x8fHBhcnNlZFVybC5ob3N0bmFtZSE9PXRoaXMuX3VybC5ob3N0bmFtZXx8cGFyc2VkVXJsLnBvcnQhPT10aGlzLl91cmwucG9ydCl7cmV0dXJuO30KdmFyIHJ1bGVzPXRoaXMuX3J1bGVzW3VzZXJBZ2VudF18fHRoaXMuX3J1bGVzWycqJ118fFtdO3ZhciBwYXRoPXVybEVuY29kZVRvVXBwZXIocGFyc2VkVXJsLnBhdGhuYW1lK3BhcnNlZFVybC5zZWFyY2gpO3ZhciBydWxlPWZpbmRSdWxlKHBhdGgscnVsZXMpO3JldHVybiBydWxlO307Um9ib3RzLnByb3RvdHlwZS5pc0FsbG93ZWQ9ZnVuY3Rpb24odXJsLHVhKXt2YXIgcnVsZT10aGlzLl9nZXRSdWxlKHVybCx1YSk7aWYodHlwZW9mIHJ1bGU9PT0ndW5kZWZpbmVkJyl7cmV0dXJuO30KcmV0dXJuIXJ1bGV8fHJ1bGUuYWxsb3c7fTtSb2JvdHMucHJvdG90eXBlLmdldE1hdGNoaW5nTGluZU51bWJlcj1mdW5jdGlvbih1cmwsdWEpe3ZhciBydWxlPXRoaXMuX2dldFJ1bGUodXJsLHVhKTtyZXR1cm4gcnVsZT9ydWxlLmxpbmVOdW1iZXI6LTE7fTtSb2JvdHMucHJvdG90eXBlLmlzRGlzYWxsb3dlZD1mdW5jdGlvbih1cmwsdWEpe3JldHVybiF0aGlzLmlzQWxsb3dlZCh1cmwsdWEpO307Um9ib3RzLnByb3RvdHlwZS5nZXRDcmF3bERlbGF5PWZ1bmN0aW9uKHVhKXt2YXIgdXNlckFnZW50PWZvcm1hdFVzZXJBZ2VudCh1YXx8JyonKTtyZXR1cm4odGhpcy5fcnVsZXNbdXNlckFnZW50XXx8dGhpcy5fcnVsZXNbJyonXXx8e30pLmNyYXdsRGVsYXk7fTtSb2JvdHMucHJvdG90eXBlLmdldFByZWZlcnJlZEhvc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlZmVyZWRIb3N0O307Um9ib3RzLnByb3RvdHlwZS5nZXRTaXRlbWFwcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXRlbWFwcy5zbGljZSgwKTt9O21vZHVsZS5leHBvcnRzPVJvYm90czt9LHsidXJsIjoidXJsIn1dLDEzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIFJvYm90cz1yZXF1aXJlKCcuL1JvYm90cycpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHVybCxjb250ZW50cyl7cmV0dXJuIG5ldyBSb2JvdHModXJsLGNvbnRlbnRzKTt9O30seyIuL1JvYm90cyI6MTMwfV0sMTMyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24ocHJvY2Vzcyl7ZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1TZW1WZXI7dmFyIGRlYnVnO2lmKHR5cGVvZiBwcm9jZXNzPT09J29iamVjdCcmJnByb2Nlc3MuZW52JiZwcm9jZXNzLmVudi5OT0RFX0RFQlVHJiYvXGJzZW12ZXJcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpCmRlYnVnPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2FyZ3MudW5zaGlmdCgnU0VNVkVSJyk7Y29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxhcmdzKTt9O2Vsc2UKZGVidWc9ZnVuY3Rpb24oKXt9O2V4cG9ydHMuU0VNVkVSX1NQRUNfVkVSU0lPTj0nMi4wLjAnO3ZhciBNQVhfTEVOR1RIPTI1Njt2YXIgTUFYX1NBRkVfSU5URUdFUj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUnx8OTAwNzE5OTI1NDc0MDk5MTt2YXIgcmU9ZXhwb3J0cy5yZT1bXTt2YXIgc3JjPWV4cG9ydHMuc3JjPVtdO3ZhciBSPTA7dmFyIE5VTUVSSUNJREVOVElGSUVSPVIrKztzcmNbTlVNRVJJQ0lERU5USUZJRVJdPScwfFsxLTldXFxkKic7dmFyIE5VTUVSSUNJREVOVElGSUVSTE9PU0U9UisrO3NyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXT0nWzAtOV0rJzt2YXIgTk9OTlVNRVJJQ0lERU5USUZJRVI9UisrO3NyY1tOT05OVU1FUklDSURFTlRJRklFUl09J1xcZCpbYS16QS1aLV1bYS16QS1aMC05LV0qJzt2YXIgTUFJTlZFUlNJT049UisrO3NyY1tNQUlOVkVSU0lPTl09JygnK3NyY1tOVU1FUklDSURFTlRJRklFUl0rJylcXC4nKycoJytzcmNbTlVNRVJJQ0lERU5USUZJRVJdKycpXFwuJysnKCcrc3JjW05VTUVSSUNJREVOVElGSUVSXSsnKSc7dmFyIE1BSU5WRVJTSU9OTE9PU0U9UisrO3NyY1tNQUlOVkVSU0lPTkxPT1NFXT0nKCcrc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdKycpXFwuJysnKCcrc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdKycpXFwuJysnKCcrc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdKycpJzt2YXIgUFJFUkVMRUFTRUlERU5USUZJRVI9UisrO3NyY1tQUkVSRUxFQVNFSURFTlRJRklFUl09Jyg/Oicrc3JjW05VTUVSSUNJREVOVElGSUVSXSsnfCcrc3JjW05PTk5VTUVSSUNJREVOVElGSUVSXSsnKSc7dmFyIFBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0U9UisrO3NyY1tQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXT0nKD86JytzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0rJ3wnK3NyY1tOT05OVU1FUklDSURFTlRJRklFUl0rJyknO3ZhciBQUkVSRUxFQVNFPVIrKztzcmNbUFJFUkVMRUFTRV09Jyg/Oi0oJytzcmNbUFJFUkVMRUFTRUlERU5USUZJRVJdKycoPzpcXC4nK3NyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0rJykqKSknO3ZhciBQUkVSRUxFQVNFTE9PU0U9UisrO3NyY1tQUkVSRUxFQVNFTE9PU0VdPScoPzotPygnK3NyY1tQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXSsnKD86XFwuJytzcmNbUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0rJykqKSknO3ZhciBCVUlMRElERU5USUZJRVI9UisrO3NyY1tCVUlMRElERU5USUZJRVJdPSdbMC05QS1aYS16LV0rJzt2YXIgQlVJTEQ9UisrO3NyY1tCVUlMRF09Jyg/OlxcKygnK3NyY1tCVUlMRElERU5USUZJRVJdKycoPzpcXC4nK3NyY1tCVUlMRElERU5USUZJRVJdKycpKikpJzt2YXIgRlVMTD1SKys7dmFyIEZVTExQTEFJTj0ndj8nK3NyY1tNQUlOVkVSU0lPTl0rCnNyY1tQUkVSRUxFQVNFXSsnPycrCnNyY1tCVUlMRF0rJz8nO3NyY1tGVUxMXT0nXicrRlVMTFBMQUlOKyckJzt2YXIgTE9PU0VQTEFJTj0nW3Y9XFxzXSonK3NyY1tNQUlOVkVSU0lPTkxPT1NFXSsKc3JjW1BSRVJFTEVBU0VMT09TRV0rJz8nKwpzcmNbQlVJTERdKyc/Jzt2YXIgTE9PU0U9UisrO3NyY1tMT09TRV09J14nK0xPT1NFUExBSU4rJyQnO3ZhciBHVExUPVIrKztzcmNbR1RMVF09JygoPzo8fD4pPz0/KSc7dmFyIFhSQU5HRUlERU5USUZJRVJMT09TRT1SKys7c3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV09c3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdKyd8eHxYfFxcKic7dmFyIFhSQU5HRUlERU5USUZJRVI9UisrO3NyY1tYUkFOR0VJREVOVElGSUVSXT1zcmNbTlVNRVJJQ0lERU5USUZJRVJdKyd8eHxYfFxcKic7dmFyIFhSQU5HRVBMQUlOPVIrKztzcmNbWFJBTkdFUExBSU5dPSdbdj1cXHNdKignK3NyY1tYUkFOR0VJREVOVElGSUVSXSsnKScrJyg/OlxcLignK3NyY1tYUkFOR0VJREVOVElGSUVSXSsnKScrJyg/OlxcLignK3NyY1tYUkFOR0VJREVOVElGSUVSXSsnKScrJyg/Oicrc3JjW1BSRVJFTEVBU0VdKycpPycrCnNyY1tCVUlMRF0rJz8nKycpPyk/Jzt2YXIgWFJBTkdFUExBSU5MT09TRT1SKys7c3JjW1hSQU5HRVBMQUlOTE9PU0VdPSdbdj1cXHNdKignK3NyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdKycpJysnKD86XFwuKCcrc3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV0rJyknKycoPzpcXC4oJytzcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSsnKScrJyg/Oicrc3JjW1BSRVJFTEVBU0VMT09TRV0rJyk/JysKc3JjW0JVSUxEXSsnPycrJyk/KT8nO3ZhciBYUkFOR0U9UisrO3NyY1tYUkFOR0VdPSdeJytzcmNbR1RMVF0rJ1xccyonK3NyY1tYUkFOR0VQTEFJTl0rJyQnO3ZhciBYUkFOR0VMT09TRT1SKys7c3JjW1hSQU5HRUxPT1NFXT0nXicrc3JjW0dUTFRdKydcXHMqJytzcmNbWFJBTkdFUExBSU5MT09TRV0rJyQnO3ZhciBMT05FVElMREU9UisrO3NyY1tMT05FVElMREVdPScoPzp+Pj8pJzt2YXIgVElMREVUUklNPVIrKztzcmNbVElMREVUUklNXT0nKFxccyopJytzcmNbTE9ORVRJTERFXSsnXFxzKyc7cmVbVElMREVUUklNXT1uZXcgUmVnRXhwKHNyY1tUSUxERVRSSU1dLCdnJyk7dmFyIHRpbGRlVHJpbVJlcGxhY2U9JyQxfic7dmFyIFRJTERFPVIrKztzcmNbVElMREVdPSdeJytzcmNbTE9ORVRJTERFXStzcmNbWFJBTkdFUExBSU5dKyckJzt2YXIgVElMREVMT09TRT1SKys7c3JjW1RJTERFTE9PU0VdPSdeJytzcmNbTE9ORVRJTERFXStzcmNbWFJBTkdFUExBSU5MT09TRV0rJyQnO3ZhciBMT05FQ0FSRVQ9UisrO3NyY1tMT05FQ0FSRVRdPScoPzpcXF4pJzt2YXIgQ0FSRVRUUklNPVIrKztzcmNbQ0FSRVRUUklNXT0nKFxccyopJytzcmNbTE9ORUNBUkVUXSsnXFxzKyc7cmVbQ0FSRVRUUklNXT1uZXcgUmVnRXhwKHNyY1tDQVJFVFRSSU1dLCdnJyk7dmFyIGNhcmV0VHJpbVJlcGxhY2U9JyQxXic7dmFyIENBUkVUPVIrKztzcmNbQ0FSRVRdPSdeJytzcmNbTE9ORUNBUkVUXStzcmNbWFJBTkdFUExBSU5dKyckJzt2YXIgQ0FSRVRMT09TRT1SKys7c3JjW0NBUkVUTE9PU0VdPSdeJytzcmNbTE9ORUNBUkVUXStzcmNbWFJBTkdFUExBSU5MT09TRV0rJyQnO3ZhciBDT01QQVJBVE9STE9PU0U9UisrO3NyY1tDT01QQVJBVE9STE9PU0VdPSdeJytzcmNbR1RMVF0rJ1xccyooJytMT09TRVBMQUlOKycpJHxeJCc7dmFyIENPTVBBUkFUT1I9UisrO3NyY1tDT01QQVJBVE9SXT0nXicrc3JjW0dUTFRdKydcXHMqKCcrRlVMTFBMQUlOKycpJHxeJCc7dmFyIENPTVBBUkFUT1JUUklNPVIrKztzcmNbQ09NUEFSQVRPUlRSSU1dPScoXFxzKiknK3NyY1tHVExUXSsnXFxzKignK0xPT1NFUExBSU4rJ3wnK3NyY1tYUkFOR0VQTEFJTl0rJyknO3JlW0NPTVBBUkFUT1JUUklNXT1uZXcgUmVnRXhwKHNyY1tDT01QQVJBVE9SVFJJTV0sJ2cnKTt2YXIgY29tcGFyYXRvclRyaW1SZXBsYWNlPSckMSQyJDMnO3ZhciBIWVBIRU5SQU5HRT1SKys7c3JjW0hZUEhFTlJBTkdFXT0nXlxccyooJytzcmNbWFJBTkdFUExBSU5dKycpJysnXFxzKy1cXHMrJysnKCcrc3JjW1hSQU5HRVBMQUlOXSsnKScrJ1xccyokJzt2YXIgSFlQSEVOUkFOR0VMT09TRT1SKys7c3JjW0hZUEhFTlJBTkdFTE9PU0VdPSdeXFxzKignK3NyY1tYUkFOR0VQTEFJTkxPT1NFXSsnKScrJ1xccystXFxzKycrJygnK3NyY1tYUkFOR0VQTEFJTkxPT1NFXSsnKScrJ1xccyokJzt2YXIgU1RBUj1SKys7c3JjW1NUQVJdPScoPHw+KT89P1xccypcXConO2Zvcih2YXIgaT0wO2k8UjtpKyspe2RlYnVnKGksc3JjW2ldKTtpZighcmVbaV0pCnJlW2ldPW5ldyBSZWdFeHAoc3JjW2ldKTt9CmV4cG9ydHMucGFyc2U9cGFyc2U7ZnVuY3Rpb24gcGFyc2UodmVyc2lvbixsb29zZSl7aWYodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikKcmV0dXJuIHZlcnNpb247aWYodHlwZW9mIHZlcnNpb24hPT0nc3RyaW5nJykKcmV0dXJuIG51bGw7aWYodmVyc2lvbi5sZW5ndGg+TUFYX0xFTkdUSCkKcmV0dXJuIG51bGw7dmFyIHI9bG9vc2U/cmVbTE9PU0VdOnJlW0ZVTExdO2lmKCFyLnRlc3QodmVyc2lvbikpCnJldHVybiBudWxsO3RyeXtyZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLGxvb3NlKTt9Y2F0Y2goZXIpe3JldHVybiBudWxsO319CmV4cG9ydHMudmFsaWQ9dmFsaWQ7ZnVuY3Rpb24gdmFsaWQodmVyc2lvbixsb29zZSl7dmFyIHY9cGFyc2UodmVyc2lvbixsb29zZSk7cmV0dXJuIHY/di52ZXJzaW9uOm51bGw7fQpleHBvcnRzLmNsZWFuPWNsZWFuO2Z1bmN0aW9uIGNsZWFuKHZlcnNpb24sbG9vc2Upe3ZhciBzPXBhcnNlKHZlcnNpb24udHJpbSgpLnJlcGxhY2UoL15bPXZdKy8sJycpLGxvb3NlKTtyZXR1cm4gcz9zLnZlcnNpb246bnVsbDt9CmV4cG9ydHMuU2VtVmVyPVNlbVZlcjtmdW5jdGlvbiBTZW1WZXIodmVyc2lvbixsb29zZSl7aWYodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcil7aWYodmVyc2lvbi5sb29zZT09PWxvb3NlKQpyZXR1cm4gdmVyc2lvbjtlbHNlCnZlcnNpb249dmVyc2lvbi52ZXJzaW9uO31lbHNlIGlmKHR5cGVvZiB2ZXJzaW9uIT09J3N0cmluZycpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgVmVyc2lvbjogJyt2ZXJzaW9uKTt9CmlmKHZlcnNpb24ubGVuZ3RoPk1BWF9MRU5HVEgpCnRocm93IG5ldyBUeXBlRXJyb3IoJ3ZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJytNQVhfTEVOR1RIKycgY2hhcmFjdGVycycpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNlbVZlcikpCnJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sbG9vc2UpO2RlYnVnKCdTZW1WZXInLHZlcnNpb24sbG9vc2UpO3RoaXMubG9vc2U9bG9vc2U7dmFyIG09dmVyc2lvbi50cmltKCkubWF0Y2gobG9vc2U/cmVbTE9PU0VdOnJlW0ZVTExdKTtpZighbSkKdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnK3ZlcnNpb24pO3RoaXMucmF3PXZlcnNpb247dGhpcy5tYWpvcj0rbVsxXTt0aGlzLm1pbm9yPSttWzJdO3RoaXMucGF0Y2g9K21bM107aWYodGhpcy5tYWpvcj5NQVhfU0FGRV9JTlRFR0VSfHx0aGlzLm1ham9yPDApCnRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpO2lmKHRoaXMubWlub3I+TUFYX1NBRkVfSU5URUdFUnx8dGhpcy5taW5vcjwwKQp0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKTtpZih0aGlzLnBhdGNoPk1BWF9TQUZFX0lOVEVHRVJ8fHRoaXMucGF0Y2g8MCkKdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJyk7aWYoIW1bNF0pCnRoaXMucHJlcmVsZWFzZT1bXTtlbHNlCnRoaXMucHJlcmVsZWFzZT1tWzRdLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uKGlkKXtpZigvXlswLTldKyQvLnRlc3QoaWQpKXt2YXIgbnVtPStpZDtpZihudW0+PTAmJm51bTxNQVhfU0FGRV9JTlRFR0VSKQpyZXR1cm4gbnVtO30KcmV0dXJuIGlkO30pO3RoaXMuYnVpbGQ9bVs1XT9tWzVdLnNwbGl0KCcuJyk6W107dGhpcy5mb3JtYXQoKTt9ClNlbVZlci5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKCl7dGhpcy52ZXJzaW9uPXRoaXMubWFqb3IrJy4nK3RoaXMubWlub3IrJy4nK3RoaXMucGF0Y2g7aWYodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkKdGhpcy52ZXJzaW9uKz0nLScrdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKTtyZXR1cm4gdGhpcy52ZXJzaW9uO307U2VtVmVyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZlcnNpb247fTtTZW1WZXIucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24ob3RoZXIpe2RlYnVnKCdTZW1WZXIuY29tcGFyZScsdGhpcy52ZXJzaW9uLHRoaXMubG9vc2Usb3RoZXIpO2lmKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKQpvdGhlcj1uZXcgU2VtVmVyKG90aGVyLHRoaXMubG9vc2UpO3JldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKXx8dGhpcy5jb21wYXJlUHJlKG90aGVyKTt9O1NlbVZlci5wcm90b3R5cGUuY29tcGFyZU1haW49ZnVuY3Rpb24ob3RoZXIpe2lmKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKQpvdGhlcj1uZXcgU2VtVmVyKG90aGVyLHRoaXMubG9vc2UpO3JldHVybiBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvcixvdGhlci5tYWpvcil8fGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLG90aGVyLm1pbm9yKXx8Y29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsb3RoZXIucGF0Y2gpO307U2VtVmVyLnByb3RvdHlwZS5jb21wYXJlUHJlPWZ1bmN0aW9uKG90aGVyKXtpZighKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkKb3RoZXI9bmV3IFNlbVZlcihvdGhlcix0aGlzLmxvb3NlKTtpZih0aGlzLnByZXJlbGVhc2UubGVuZ3RoJiYhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpCnJldHVybi0xO2Vsc2UKaWYoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGgmJm90aGVyLnByZXJlbGVhc2UubGVuZ3RoKQpyZXR1cm4gMTtlbHNlCmlmKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoJiYhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpCnJldHVybiAwO3ZhciBpPTA7ZG97dmFyIGE9dGhpcy5wcmVyZWxlYXNlW2ldO3ZhciBiPW90aGVyLnByZXJlbGVhc2VbaV07ZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsaSxhLGIpO2lmKGE9PT11bmRlZmluZWQmJmI9PT11bmRlZmluZWQpCnJldHVybiAwO2Vsc2UKaWYoYj09PXVuZGVmaW5lZCkKcmV0dXJuIDE7ZWxzZQppZihhPT09dW5kZWZpbmVkKQpyZXR1cm4tMTtlbHNlCmlmKGE9PT1iKQpjb250aW51ZTtlbHNlCnJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSxiKTt9d2hpbGUoKytpKTt9O1NlbVZlci5wcm90b3R5cGUuaW5jPWZ1bmN0aW9uKHJlbGVhc2UsaWRlbnRpZmllcil7c3dpdGNoKHJlbGVhc2Upe2Nhc2UncHJlbWFqb3InOnRoaXMucHJlcmVsZWFzZS5sZW5ndGg9MDt0aGlzLnBhdGNoPTA7dGhpcy5taW5vcj0wO3RoaXMubWFqb3IrKzt0aGlzLmluYygncHJlJyxpZGVudGlmaWVyKTticmVhaztjYXNlJ3ByZW1pbm9yJzp0aGlzLnByZXJlbGVhc2UubGVuZ3RoPTA7dGhpcy5wYXRjaD0wO3RoaXMubWlub3IrKzt0aGlzLmluYygncHJlJyxpZGVudGlmaWVyKTticmVhaztjYXNlJ3ByZXBhdGNoJzp0aGlzLnByZXJlbGVhc2UubGVuZ3RoPTA7dGhpcy5pbmMoJ3BhdGNoJyxpZGVudGlmaWVyKTt0aGlzLmluYygncHJlJyxpZGVudGlmaWVyKTticmVhaztjYXNlJ3ByZXJlbGVhc2UnOmlmKHRoaXMucHJlcmVsZWFzZS5sZW5ndGg9PT0wKQp0aGlzLmluYygncGF0Y2gnLGlkZW50aWZpZXIpO3RoaXMuaW5jKCdwcmUnLGlkZW50aWZpZXIpO2JyZWFrO2Nhc2UnbWFqb3InOmlmKHRoaXMubWlub3IhPT0wfHx0aGlzLnBhdGNoIT09MHx8dGhpcy5wcmVyZWxlYXNlLmxlbmd0aD09PTApCnRoaXMubWFqb3IrKzt0aGlzLm1pbm9yPTA7dGhpcy5wYXRjaD0wO3RoaXMucHJlcmVsZWFzZT1bXTticmVhaztjYXNlJ21pbm9yJzppZih0aGlzLnBhdGNoIT09MHx8dGhpcy5wcmVyZWxlYXNlLmxlbmd0aD09PTApCnRoaXMubWlub3IrKzt0aGlzLnBhdGNoPTA7dGhpcy5wcmVyZWxlYXNlPVtdO2JyZWFrO2Nhc2UncGF0Y2gnOmlmKHRoaXMucHJlcmVsZWFzZS5sZW5ndGg9PT0wKQp0aGlzLnBhdGNoKys7dGhpcy5wcmVyZWxlYXNlPVtdO2JyZWFrO2Nhc2UncHJlJzppZih0aGlzLnByZXJlbGVhc2UubGVuZ3RoPT09MCkKdGhpcy5wcmVyZWxlYXNlPVswXTtlbHNlCnt2YXIgaT10aGlzLnByZXJlbGVhc2UubGVuZ3RoO3doaWxlKC0taT49MCl7aWYodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXT09PSdudW1iZXInKXt0aGlzLnByZXJlbGVhc2VbaV0rKztpPS0yO319CmlmKGk9PT0tMSkKdGhpcy5wcmVyZWxlYXNlLnB1c2goMCk7fQppZihpZGVudGlmaWVyKXtpZih0aGlzLnByZXJlbGVhc2VbMF09PT1pZGVudGlmaWVyKXtpZihpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKQp0aGlzLnByZXJlbGVhc2U9W2lkZW50aWZpZXIsMF07fWVsc2UKdGhpcy5wcmVyZWxlYXNlPVtpZGVudGlmaWVyLDBdO30KYnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAnK3JlbGVhc2UpO30KdGhpcy5mb3JtYXQoKTt0aGlzLnJhdz10aGlzLnZlcnNpb247cmV0dXJuIHRoaXM7fTtleHBvcnRzLmluYz1pbmM7ZnVuY3Rpb24gaW5jKHZlcnNpb24scmVsZWFzZSxsb29zZSxpZGVudGlmaWVyKXtpZih0eXBlb2YgbG9vc2U9PT0nc3RyaW5nJyl7aWRlbnRpZmllcj1sb29zZTtsb29zZT11bmRlZmluZWQ7fQp0cnl7cmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbixsb29zZSkuaW5jKHJlbGVhc2UsaWRlbnRpZmllcikudmVyc2lvbjt9Y2F0Y2goZXIpe3JldHVybiBudWxsO319CmV4cG9ydHMuZGlmZj1kaWZmO2Z1bmN0aW9uIGRpZmYodmVyc2lvbjEsdmVyc2lvbjIpe2lmKGVxKHZlcnNpb24xLHZlcnNpb24yKSl7cmV0dXJuIG51bGw7fWVsc2V7dmFyIHYxPXBhcnNlKHZlcnNpb24xKTt2YXIgdjI9cGFyc2UodmVyc2lvbjIpO2lmKHYxLnByZXJlbGVhc2UubGVuZ3RofHx2Mi5wcmVyZWxlYXNlLmxlbmd0aCl7Zm9yKHZhciBrZXkgaW4gdjEpe2lmKGtleT09PSdtYWpvcid8fGtleT09PSdtaW5vcid8fGtleT09PSdwYXRjaCcpe2lmKHYxW2tleV0hPT12MltrZXldKXtyZXR1cm4ncHJlJytrZXk7fX19CnJldHVybidwcmVyZWxlYXNlJzt9CmZvcih2YXIga2V5IGluIHYxKXtpZihrZXk9PT0nbWFqb3InfHxrZXk9PT0nbWlub3InfHxrZXk9PT0ncGF0Y2gnKXtpZih2MVtrZXldIT09djJba2V5XSl7cmV0dXJuIGtleTt9fX19fQpleHBvcnRzLmNvbXBhcmVJZGVudGlmaWVycz1jb21wYXJlSWRlbnRpZmllcnM7dmFyIG51bWVyaWM9L15bMC05XSskLztmdW5jdGlvbiBjb21wYXJlSWRlbnRpZmllcnMoYSxiKXt2YXIgYW51bT1udW1lcmljLnRlc3QoYSk7dmFyIGJudW09bnVtZXJpYy50ZXN0KGIpO2lmKGFudW0mJmJudW0pe2E9K2E7Yj0rYjt9CnJldHVybiBhbnVtJiYhYm51bT8tMTpibnVtJiYhYW51bT8xOmE8Yj8tMTphPmI/MTowO30KZXhwb3J0cy5yY29tcGFyZUlkZW50aWZpZXJzPXJjb21wYXJlSWRlbnRpZmllcnM7ZnVuY3Rpb24gcmNvbXBhcmVJZGVudGlmaWVycyhhLGIpe3JldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYixhKTt9CmV4cG9ydHMubWFqb3I9bWFqb3I7ZnVuY3Rpb24gbWFqb3IoYSxsb29zZSl7cmV0dXJuIG5ldyBTZW1WZXIoYSxsb29zZSkubWFqb3I7fQpleHBvcnRzLm1pbm9yPW1pbm9yO2Z1bmN0aW9uIG1pbm9yKGEsbG9vc2Upe3JldHVybiBuZXcgU2VtVmVyKGEsbG9vc2UpLm1pbm9yO30KZXhwb3J0cy5wYXRjaD1wYXRjaDtmdW5jdGlvbiBwYXRjaChhLGxvb3NlKXtyZXR1cm4gbmV3IFNlbVZlcihhLGxvb3NlKS5wYXRjaDt9CmV4cG9ydHMuY29tcGFyZT1jb21wYXJlO2Z1bmN0aW9uIGNvbXBhcmUoYSxiLGxvb3NlKXtyZXR1cm4gbmV3IFNlbVZlcihhLGxvb3NlKS5jb21wYXJlKGIpO30KZXhwb3J0cy5jb21wYXJlTG9vc2U9Y29tcGFyZUxvb3NlO2Z1bmN0aW9uIGNvbXBhcmVMb29zZShhLGIpe3JldHVybiBjb21wYXJlKGEsYix0cnVlKTt9CmV4cG9ydHMucmNvbXBhcmU9cmNvbXBhcmU7ZnVuY3Rpb24gcmNvbXBhcmUoYSxiLGxvb3NlKXtyZXR1cm4gY29tcGFyZShiLGEsbG9vc2UpO30KZXhwb3J0cy5zb3J0PXNvcnQ7ZnVuY3Rpb24gc29ydChsaXN0LGxvb3NlKXtyZXR1cm4gbGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGV4cG9ydHMuY29tcGFyZShhLGIsbG9vc2UpO30pO30KZXhwb3J0cy5yc29ydD1yc29ydDtmdW5jdGlvbiByc29ydChsaXN0LGxvb3NlKXtyZXR1cm4gbGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGV4cG9ydHMucmNvbXBhcmUoYSxiLGxvb3NlKTt9KTt9CmV4cG9ydHMuZ3Q9Z3Q7ZnVuY3Rpb24gZ3QoYSxiLGxvb3NlKXtyZXR1cm4gY29tcGFyZShhLGIsbG9vc2UpPjA7fQpleHBvcnRzLmx0PWx0O2Z1bmN0aW9uIGx0KGEsYixsb29zZSl7cmV0dXJuIGNvbXBhcmUoYSxiLGxvb3NlKTwwO30KZXhwb3J0cy5lcT1lcTtmdW5jdGlvbiBlcShhLGIsbG9vc2Upe3JldHVybiBjb21wYXJlKGEsYixsb29zZSk9PT0wO30KZXhwb3J0cy5uZXE9bmVxO2Z1bmN0aW9uIG5lcShhLGIsbG9vc2Upe3JldHVybiBjb21wYXJlKGEsYixsb29zZSkhPT0wO30KZXhwb3J0cy5ndGU9Z3RlO2Z1bmN0aW9uIGd0ZShhLGIsbG9vc2Upe3JldHVybiBjb21wYXJlKGEsYixsb29zZSk+PTA7fQpleHBvcnRzLmx0ZT1sdGU7ZnVuY3Rpb24gbHRlKGEsYixsb29zZSl7cmV0dXJuIGNvbXBhcmUoYSxiLGxvb3NlKTw9MDt9CmV4cG9ydHMuY21wPWNtcDtmdW5jdGlvbiBjbXAoYSxvcCxiLGxvb3NlKXt2YXIgcmV0O3N3aXRjaChvcCl7Y2FzZSc9PT0nOmlmKHR5cGVvZiBhPT09J29iamVjdCcpYT1hLnZlcnNpb247aWYodHlwZW9mIGI9PT0nb2JqZWN0JyliPWIudmVyc2lvbjtyZXQ9YT09PWI7YnJlYWs7Y2FzZSchPT0nOmlmKHR5cGVvZiBhPT09J29iamVjdCcpYT1hLnZlcnNpb247aWYodHlwZW9mIGI9PT0nb2JqZWN0JyliPWIudmVyc2lvbjtyZXQ9YSE9PWI7YnJlYWs7Y2FzZScnOmNhc2UnPSc6Y2FzZSc9PSc6cmV0PWVxKGEsYixsb29zZSk7YnJlYWs7Y2FzZSchPSc6cmV0PW5lcShhLGIsbG9vc2UpO2JyZWFrO2Nhc2UnPic6cmV0PWd0KGEsYixsb29zZSk7YnJlYWs7Y2FzZSc+PSc6cmV0PWd0ZShhLGIsbG9vc2UpO2JyZWFrO2Nhc2UnPCc6cmV0PWx0KGEsYixsb29zZSk7YnJlYWs7Y2FzZSc8PSc6cmV0PWx0ZShhLGIsbG9vc2UpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBvcGVyYXRvcjogJytvcCk7fQpyZXR1cm4gcmV0O30KZXhwb3J0cy5Db21wYXJhdG9yPUNvbXBhcmF0b3I7ZnVuY3Rpb24gQ29tcGFyYXRvcihjb21wLGxvb3NlKXtpZihjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcil7aWYoY29tcC5sb29zZT09PWxvb3NlKQpyZXR1cm4gY29tcDtlbHNlCmNvbXA9Y29tcC52YWx1ZTt9CmlmKCEodGhpcyBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKQpyZXR1cm4gbmV3IENvbXBhcmF0b3IoY29tcCxsb29zZSk7ZGVidWcoJ2NvbXBhcmF0b3InLGNvbXAsbG9vc2UpO3RoaXMubG9vc2U9bG9vc2U7dGhpcy5wYXJzZShjb21wKTtpZih0aGlzLnNlbXZlcj09PUFOWSkKdGhpcy52YWx1ZT0nJztlbHNlCnRoaXMudmFsdWU9dGhpcy5vcGVyYXRvcit0aGlzLnNlbXZlci52ZXJzaW9uO2RlYnVnKCdjb21wJyx0aGlzKTt9CnZhciBBTlk9e307Q29tcGFyYXRvci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oY29tcCl7dmFyIHI9dGhpcy5sb29zZT9yZVtDT01QQVJBVE9STE9PU0VdOnJlW0NPTVBBUkFUT1JdO3ZhciBtPWNvbXAubWF0Y2gocik7aWYoIW0pCnRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29tcGFyYXRvcjogJytjb21wKTt0aGlzLm9wZXJhdG9yPW1bMV07aWYodGhpcy5vcGVyYXRvcj09PSc9JykKdGhpcy5vcGVyYXRvcj0nJztpZighbVsyXSkKdGhpcy5zZW12ZXI9QU5ZO2Vsc2UKdGhpcy5zZW12ZXI9bmV3IFNlbVZlcihtWzJdLHRoaXMubG9vc2UpO307Q29tcGFyYXRvci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZTt9O0NvbXBhcmF0b3IucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24odmVyc2lvbil7ZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsdmVyc2lvbix0aGlzLmxvb3NlKTtpZih0aGlzLnNlbXZlcj09PUFOWSkKcmV0dXJuIHRydWU7aWYodHlwZW9mIHZlcnNpb249PT0nc3RyaW5nJykKdmVyc2lvbj1uZXcgU2VtVmVyKHZlcnNpb24sdGhpcy5sb29zZSk7cmV0dXJuIGNtcCh2ZXJzaW9uLHRoaXMub3BlcmF0b3IsdGhpcy5zZW12ZXIsdGhpcy5sb29zZSk7fTtleHBvcnRzLlJhbmdlPVJhbmdlO2Z1bmN0aW9uIFJhbmdlKHJhbmdlLGxvb3NlKXtpZihyYW5nZSBpbnN0YW5jZW9mIFJhbmdlJiZyYW5nZS5sb29zZT09PWxvb3NlKQpyZXR1cm4gcmFuZ2U7aWYoISh0aGlzIGluc3RhbmNlb2YgUmFuZ2UpKQpyZXR1cm4gbmV3IFJhbmdlKHJhbmdlLGxvb3NlKTt0aGlzLmxvb3NlPWxvb3NlO3RoaXMucmF3PXJhbmdlO3RoaXMuc2V0PXJhbmdlLnNwbGl0KC9ccypcfFx8XHMqLykubWFwKGZ1bmN0aW9uKHJhbmdlKXtyZXR1cm4gdGhpcy5wYXJzZVJhbmdlKHJhbmdlLnRyaW0oKSk7fSx0aGlzKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMubGVuZ3RoO30pO2lmKCF0aGlzLnNldC5sZW5ndGgpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgU2VtVmVyIFJhbmdlOiAnK3JhbmdlKTt9CnRoaXMuZm9ybWF0KCk7fQpSYW5nZS5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKCl7dGhpcy5yYW5nZT10aGlzLnNldC5tYXAoZnVuY3Rpb24oY29tcHMpe3JldHVybiBjb21wcy5qb2luKCcgJykudHJpbSgpO30pLmpvaW4oJ3x8JykudHJpbSgpO3JldHVybiB0aGlzLnJhbmdlO307UmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2U7fTtSYW5nZS5wcm90b3R5cGUucGFyc2VSYW5nZT1mdW5jdGlvbihyYW5nZSl7dmFyIGxvb3NlPXRoaXMubG9vc2U7cmFuZ2U9cmFuZ2UudHJpbSgpO2RlYnVnKCdyYW5nZScscmFuZ2UsbG9vc2UpO3ZhciBocj1sb29zZT9yZVtIWVBIRU5SQU5HRUxPT1NFXTpyZVtIWVBIRU5SQU5HRV07cmFuZ2U9cmFuZ2UucmVwbGFjZShocixoeXBoZW5SZXBsYWNlKTtkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLHJhbmdlKTtyYW5nZT1yYW5nZS5yZXBsYWNlKHJlW0NPTVBBUkFUT1JUUklNXSxjb21wYXJhdG9yVHJpbVJlcGxhY2UpO2RlYnVnKCdjb21wYXJhdG9yIHRyaW0nLHJhbmdlLHJlW0NPTVBBUkFUT1JUUklNXSk7cmFuZ2U9cmFuZ2UucmVwbGFjZShyZVtUSUxERVRSSU1dLHRpbGRlVHJpbVJlcGxhY2UpO3JhbmdlPXJhbmdlLnJlcGxhY2UocmVbQ0FSRVRUUklNXSxjYXJldFRyaW1SZXBsYWNlKTtyYW5nZT1yYW5nZS5zcGxpdCgvXHMrLykuam9pbignICcpO3ZhciBjb21wUmU9bG9vc2U/cmVbQ09NUEFSQVRPUkxPT1NFXTpyZVtDT01QQVJBVE9SXTt2YXIgc2V0PXJhbmdlLnNwbGl0KCcgJykubWFwKGZ1bmN0aW9uKGNvbXApe3JldHVybiBwYXJzZUNvbXBhcmF0b3IoY29tcCxsb29zZSk7fSkuam9pbignICcpLnNwbGl0KC9ccysvKTtpZih0aGlzLmxvb3NlKXtzZXQ9c2V0LmZpbHRlcihmdW5jdGlvbihjb21wKXtyZXR1cm4hIWNvbXAubWF0Y2goY29tcFJlKTt9KTt9CnNldD1zZXQubWFwKGZ1bmN0aW9uKGNvbXApe3JldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLGxvb3NlKTt9KTtyZXR1cm4gc2V0O307ZXhwb3J0cy50b0NvbXBhcmF0b3JzPXRvQ29tcGFyYXRvcnM7ZnVuY3Rpb24gdG9Db21wYXJhdG9ycyhyYW5nZSxsb29zZSl7cmV0dXJuIG5ldyBSYW5nZShyYW5nZSxsb29zZSkuc2V0Lm1hcChmdW5jdGlvbihjb21wKXtyZXR1cm4gY29tcC5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGMudmFsdWU7fSkuam9pbignICcpLnRyaW0oKS5zcGxpdCgnICcpO30pO30KZnVuY3Rpb24gcGFyc2VDb21wYXJhdG9yKGNvbXAsbG9vc2Upe2RlYnVnKCdjb21wJyxjb21wKTtjb21wPXJlcGxhY2VDYXJldHMoY29tcCxsb29zZSk7ZGVidWcoJ2NhcmV0Jyxjb21wKTtjb21wPXJlcGxhY2VUaWxkZXMoY29tcCxsb29zZSk7ZGVidWcoJ3RpbGRlcycsY29tcCk7Y29tcD1yZXBsYWNlWFJhbmdlcyhjb21wLGxvb3NlKTtkZWJ1ZygneHJhbmdlJyxjb21wKTtjb21wPXJlcGxhY2VTdGFycyhjb21wLGxvb3NlKTtkZWJ1Zygnc3RhcnMnLGNvbXApO3JldHVybiBjb21wO30KZnVuY3Rpb24gaXNYKGlkKXtyZXR1cm4haWR8fGlkLnRvTG93ZXJDYXNlKCk9PT0neCd8fGlkPT09JyonO30KZnVuY3Rpb24gcmVwbGFjZVRpbGRlcyhjb21wLGxvb3NlKXtyZXR1cm4gY29tcC50cmltKCkuc3BsaXQoL1xzKy8pLm1hcChmdW5jdGlvbihjb21wKXtyZXR1cm4gcmVwbGFjZVRpbGRlKGNvbXAsbG9vc2UpO30pLmpvaW4oJyAnKTt9CmZ1bmN0aW9uIHJlcGxhY2VUaWxkZShjb21wLGxvb3NlKXt2YXIgcj1sb29zZT9yZVtUSUxERUxPT1NFXTpyZVtUSUxERV07cmV0dXJuIGNvbXAucmVwbGFjZShyLGZ1bmN0aW9uKF8sTSxtLHAscHIpe2RlYnVnKCd0aWxkZScsY29tcCxfLE0sbSxwLHByKTt2YXIgcmV0O2lmKGlzWChNKSkKcmV0PScnO2Vsc2UKaWYoaXNYKG0pKQpyZXQ9Jz49JytNKycuMC4wIDwnKygrTSsxKSsnLjAuMCc7ZWxzZQppZihpc1gocCkpCnJldD0nPj0nK00rJy4nK20rJy4wIDwnK00rJy4nKygrbSsxKSsnLjAnO2Vsc2UKaWYocHIpe2RlYnVnKCdyZXBsYWNlVGlsZGUgcHInLHByKTtpZihwci5jaGFyQXQoMCkhPT0nLScpCnByPSctJytwcjtyZXQ9Jz49JytNKycuJyttKycuJytwK3ByKycgPCcrTSsnLicrKCttKzEpKycuMCc7fWVsc2UKcmV0PSc+PScrTSsnLicrbSsnLicrcCsnIDwnK00rJy4nKygrbSsxKSsnLjAnO2RlYnVnKCd0aWxkZSByZXR1cm4nLHJldCk7cmV0dXJuIHJldDt9KTt9CmZ1bmN0aW9uIHJlcGxhY2VDYXJldHMoY29tcCxsb29zZSl7cmV0dXJuIGNvbXAudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoZnVuY3Rpb24oY29tcCl7cmV0dXJuIHJlcGxhY2VDYXJldChjb21wLGxvb3NlKTt9KS5qb2luKCcgJyk7fQpmdW5jdGlvbiByZXBsYWNlQ2FyZXQoY29tcCxsb29zZSl7ZGVidWcoJ2NhcmV0Jyxjb21wLGxvb3NlKTt2YXIgcj1sb29zZT9yZVtDQVJFVExPT1NFXTpyZVtDQVJFVF07cmV0dXJuIGNvbXAucmVwbGFjZShyLGZ1bmN0aW9uKF8sTSxtLHAscHIpe2RlYnVnKCdjYXJldCcsY29tcCxfLE0sbSxwLHByKTt2YXIgcmV0O2lmKGlzWChNKSkKcmV0PScnO2Vsc2UKaWYoaXNYKG0pKQpyZXQ9Jz49JytNKycuMC4wIDwnKygrTSsxKSsnLjAuMCc7ZWxzZQppZihpc1gocCkpe2lmKE09PT0nMCcpCnJldD0nPj0nK00rJy4nK20rJy4wIDwnK00rJy4nKygrbSsxKSsnLjAnO2Vsc2UKcmV0PSc+PScrTSsnLicrbSsnLjAgPCcrKCtNKzEpKycuMC4wJzt9ZWxzZSBpZihwcil7ZGVidWcoJ3JlcGxhY2VDYXJldCBwcicscHIpO2lmKHByLmNoYXJBdCgwKSE9PSctJykKcHI9Jy0nK3ByO2lmKE09PT0nMCcpe2lmKG09PT0nMCcpCnJldD0nPj0nK00rJy4nK20rJy4nK3ArcHIrJyA8JytNKycuJyttKycuJysoK3ArMSk7ZWxzZQpyZXQ9Jz49JytNKycuJyttKycuJytwK3ByKycgPCcrTSsnLicrKCttKzEpKycuMCc7fWVsc2UKcmV0PSc+PScrTSsnLicrbSsnLicrcCtwcisnIDwnKygrTSsxKSsnLjAuMCc7fWVsc2V7ZGVidWcoJ25vIHByJyk7aWYoTT09PScwJyl7aWYobT09PScwJykKcmV0PSc+PScrTSsnLicrbSsnLicrcCsnIDwnK00rJy4nK20rJy4nKygrcCsxKTtlbHNlCnJldD0nPj0nK00rJy4nK20rJy4nK3ArJyA8JytNKycuJysoK20rMSkrJy4wJzt9ZWxzZQpyZXQ9Jz49JytNKycuJyttKycuJytwKycgPCcrKCtNKzEpKycuMC4wJzt9CmRlYnVnKCdjYXJldCByZXR1cm4nLHJldCk7cmV0dXJuIHJldDt9KTt9CmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2VzKGNvbXAsbG9vc2Upe2RlYnVnKCdyZXBsYWNlWFJhbmdlcycsY29tcCxsb29zZSk7cmV0dXJuIGNvbXAuc3BsaXQoL1xzKy8pLm1hcChmdW5jdGlvbihjb21wKXtyZXR1cm4gcmVwbGFjZVhSYW5nZShjb21wLGxvb3NlKTt9KS5qb2luKCcgJyk7fQpmdW5jdGlvbiByZXBsYWNlWFJhbmdlKGNvbXAsbG9vc2Upe2NvbXA9Y29tcC50cmltKCk7dmFyIHI9bG9vc2U/cmVbWFJBTkdFTE9PU0VdOnJlW1hSQU5HRV07cmV0dXJuIGNvbXAucmVwbGFjZShyLGZ1bmN0aW9uKHJldCxndGx0LE0sbSxwLHByKXtkZWJ1ZygneFJhbmdlJyxjb21wLHJldCxndGx0LE0sbSxwLHByKTt2YXIgeE09aXNYKE0pO3ZhciB4bT14TXx8aXNYKG0pO3ZhciB4cD14bXx8aXNYKHApO3ZhciBhbnlYPXhwO2lmKGd0bHQ9PT0nPScmJmFueVgpCmd0bHQ9Jyc7aWYoeE0pe2lmKGd0bHQ9PT0nPid8fGd0bHQ9PT0nPCcpe3JldD0nPDAuMC4wJzt9ZWxzZXtyZXQ9JyonO319ZWxzZSBpZihndGx0JiZhbnlYKXtpZih4bSkKbT0wO2lmKHhwKQpwPTA7aWYoZ3RsdD09PSc+Jyl7Z3RsdD0nPj0nO2lmKHhtKXtNPStNKzE7bT0wO3A9MDt9ZWxzZSBpZih4cCl7bT0rbSsxO3A9MDt9fWVsc2UgaWYoZ3RsdD09PSc8PScpe2d0bHQ9JzwnO2lmKHhtKQpNPStNKzE7ZWxzZQptPSttKzE7fQpyZXQ9Z3RsdCtNKycuJyttKycuJytwO31lbHNlIGlmKHhtKXtyZXQ9Jz49JytNKycuMC4wIDwnKygrTSsxKSsnLjAuMCc7fWVsc2UgaWYoeHApe3JldD0nPj0nK00rJy4nK20rJy4wIDwnK00rJy4nKygrbSsxKSsnLjAnO30KZGVidWcoJ3hSYW5nZSByZXR1cm4nLHJldCk7cmV0dXJuIHJldDt9KTt9CmZ1bmN0aW9uIHJlcGxhY2VTdGFycyhjb21wLGxvb3NlKXtkZWJ1ZygncmVwbGFjZVN0YXJzJyxjb21wLGxvb3NlKTtyZXR1cm4gY29tcC50cmltKCkucmVwbGFjZShyZVtTVEFSXSwnJyk7fQpmdW5jdGlvbiBoeXBoZW5SZXBsYWNlKCQwLGZyb20sZk0sZm0sZnAsZnByLGZiLHRvLHRNLHRtLHRwLHRwcix0Yil7aWYoaXNYKGZNKSkKZnJvbT0nJztlbHNlCmlmKGlzWChmbSkpCmZyb209Jz49JytmTSsnLjAuMCc7ZWxzZQppZihpc1goZnApKQpmcm9tPSc+PScrZk0rJy4nK2ZtKycuMCc7ZWxzZQpmcm9tPSc+PScrZnJvbTtpZihpc1godE0pKQp0bz0nJztlbHNlCmlmKGlzWCh0bSkpCnRvPSc8JysoK3RNKzEpKycuMC4wJztlbHNlCmlmKGlzWCh0cCkpCnRvPSc8Jyt0TSsnLicrKCt0bSsxKSsnLjAnO2Vsc2UKaWYodHByKQp0bz0nPD0nK3RNKycuJyt0bSsnLicrdHArJy0nK3RwcjtlbHNlCnRvPSc8PScrdG87cmV0dXJuKGZyb20rJyAnK3RvKS50cmltKCk7fQpSYW5nZS5wcm90b3R5cGUudGVzdD1mdW5jdGlvbih2ZXJzaW9uKXtpZighdmVyc2lvbikKcmV0dXJuIGZhbHNlO2lmKHR5cGVvZiB2ZXJzaW9uPT09J3N0cmluZycpCnZlcnNpb249bmV3IFNlbVZlcih2ZXJzaW9uLHRoaXMubG9vc2UpO2Zvcih2YXIgaT0wO2k8dGhpcy5zZXQubGVuZ3RoO2krKyl7aWYodGVzdFNldCh0aGlzLnNldFtpXSx2ZXJzaW9uKSkKcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fTtmdW5jdGlvbiB0ZXN0U2V0KHNldCx2ZXJzaW9uKXtmb3IodmFyIGk9MDtpPHNldC5sZW5ndGg7aSsrKXtpZighc2V0W2ldLnRlc3QodmVyc2lvbikpCnJldHVybiBmYWxzZTt9CmlmKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGgpe2Zvcih2YXIgaT0wO2k8c2V0Lmxlbmd0aDtpKyspe2RlYnVnKHNldFtpXS5zZW12ZXIpO2lmKHNldFtpXS5zZW12ZXI9PT1BTlkpCmNvbnRpbnVlO2lmKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGg+MCl7dmFyIGFsbG93ZWQ9c2V0W2ldLnNlbXZlcjtpZihhbGxvd2VkLm1ham9yPT09dmVyc2lvbi5tYWpvciYmYWxsb3dlZC5taW5vcj09PXZlcnNpb24ubWlub3ImJmFsbG93ZWQucGF0Y2g9PT12ZXJzaW9uLnBhdGNoKQpyZXR1cm4gdHJ1ZTt9fQpyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9CmV4cG9ydHMuc2F0aXNmaWVzPXNhdGlzZmllcztmdW5jdGlvbiBzYXRpc2ZpZXModmVyc2lvbixyYW5nZSxsb29zZSl7dHJ5e3JhbmdlPW5ldyBSYW5nZShyYW5nZSxsb29zZSk7fWNhdGNoKGVyKXtyZXR1cm4gZmFsc2U7fQpyZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKTt9CmV4cG9ydHMubWF4U2F0aXNmeWluZz1tYXhTYXRpc2Z5aW5nO2Z1bmN0aW9uIG1heFNhdGlzZnlpbmcodmVyc2lvbnMscmFuZ2UsbG9vc2Upe3JldHVybiB2ZXJzaW9ucy5maWx0ZXIoZnVuY3Rpb24odmVyc2lvbil7cmV0dXJuIHNhdGlzZmllcyh2ZXJzaW9uLHJhbmdlLGxvb3NlKTt9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIHJjb21wYXJlKGEsYixsb29zZSk7fSlbMF18fG51bGw7fQpleHBvcnRzLm1pblNhdGlzZnlpbmc9bWluU2F0aXNmeWluZztmdW5jdGlvbiBtaW5TYXRpc2Z5aW5nKHZlcnNpb25zLHJhbmdlLGxvb3NlKXtyZXR1cm4gdmVyc2lvbnMuZmlsdGVyKGZ1bmN0aW9uKHZlcnNpb24pe3JldHVybiBzYXRpc2ZpZXModmVyc2lvbixyYW5nZSxsb29zZSk7fSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBjb21wYXJlKGEsYixsb29zZSk7fSlbMF18fG51bGw7fQpleHBvcnRzLnZhbGlkUmFuZ2U9dmFsaWRSYW5nZTtmdW5jdGlvbiB2YWxpZFJhbmdlKHJhbmdlLGxvb3NlKXt0cnl7cmV0dXJuIG5ldyBSYW5nZShyYW5nZSxsb29zZSkucmFuZ2V8fCcqJzt9Y2F0Y2goZXIpe3JldHVybiBudWxsO319CmV4cG9ydHMubHRyPWx0cjtmdW5jdGlvbiBsdHIodmVyc2lvbixyYW5nZSxsb29zZSl7cmV0dXJuIG91dHNpZGUodmVyc2lvbixyYW5nZSwnPCcsbG9vc2UpO30KZXhwb3J0cy5ndHI9Z3RyO2Z1bmN0aW9uIGd0cih2ZXJzaW9uLHJhbmdlLGxvb3NlKXtyZXR1cm4gb3V0c2lkZSh2ZXJzaW9uLHJhbmdlLCc+Jyxsb29zZSk7fQpleHBvcnRzLm91dHNpZGU9b3V0c2lkZTtmdW5jdGlvbiBvdXRzaWRlKHZlcnNpb24scmFuZ2UsaGlsbyxsb29zZSl7dmVyc2lvbj1uZXcgU2VtVmVyKHZlcnNpb24sbG9vc2UpO3JhbmdlPW5ldyBSYW5nZShyYW5nZSxsb29zZSk7dmFyIGd0Zm4sbHRlZm4sbHRmbixjb21wLGVjb21wO3N3aXRjaChoaWxvKXtjYXNlJz4nOmd0Zm49Z3Q7bHRlZm49bHRlO2x0Zm49bHQ7Y29tcD0nPic7ZWNvbXA9Jz49JzticmVhaztjYXNlJzwnOmd0Zm49bHQ7bHRlZm49Z3RlO2x0Zm49Z3Q7Y29tcD0nPCc7ZWNvbXA9Jzw9JzticmVhaztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mICI8IiBvciAiPiInKTt9CmlmKHNhdGlzZmllcyh2ZXJzaW9uLHJhbmdlLGxvb3NlKSl7cmV0dXJuIGZhbHNlO30KZm9yKHZhciBpPTA7aTxyYW5nZS5zZXQubGVuZ3RoOysraSl7dmFyIGNvbXBhcmF0b3JzPXJhbmdlLnNldFtpXTt2YXIgaGlnaD1udWxsO3ZhciBsb3c9bnVsbDtjb21wYXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXBhcmF0b3Ipe2lmKGNvbXBhcmF0b3Iuc2VtdmVyPT09QU5ZKXtjb21wYXJhdG9yPW5ldyBDb21wYXJhdG9yKCc+PTAuMC4wJyk7fQpoaWdoPWhpZ2h8fGNvbXBhcmF0b3I7bG93PWxvd3x8Y29tcGFyYXRvcjtpZihndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLGhpZ2guc2VtdmVyLGxvb3NlKSl7aGlnaD1jb21wYXJhdG9yO31lbHNlIGlmKGx0Zm4oY29tcGFyYXRvci5zZW12ZXIsbG93LnNlbXZlcixsb29zZSkpe2xvdz1jb21wYXJhdG9yO319KTtpZihoaWdoLm9wZXJhdG9yPT09Y29tcHx8aGlnaC5vcGVyYXRvcj09PWVjb21wKXtyZXR1cm4gZmFsc2U7fQppZigoIWxvdy5vcGVyYXRvcnx8bG93Lm9wZXJhdG9yPT09Y29tcCkmJmx0ZWZuKHZlcnNpb24sbG93LnNlbXZlcikpe3JldHVybiBmYWxzZTt9ZWxzZSBpZihsb3cub3BlcmF0b3I9PT1lY29tcCYmbHRmbih2ZXJzaW9uLGxvdy5zZW12ZXIpKXtyZXR1cm4gZmFsc2U7fX0KcmV0dXJuIHRydWU7fQpleHBvcnRzLnByZXJlbGVhc2U9cHJlcmVsZWFzZTtmdW5jdGlvbiBwcmVyZWxlYXNlKHZlcnNpb24sbG9vc2Upe3ZhciBwYXJzZWQ9cGFyc2UodmVyc2lvbixsb29zZSk7cmV0dXJuIHBhcnNlZCYmcGFyc2VkLnByZXJlbGVhc2UubGVuZ3RoP3BhcnNlZC5wcmVyZWxlYXNlOm51bGw7fX0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKTt9LHsiX3Byb2Nlc3MiOjc3fV0sMTMzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oQnVmZmVyKXsndXNlIHN0cmljdCc7Y29uc3QganBlZz1yZXF1aXJlKCdqcGVnLWpzJyk7ZnVuY3Rpb24gZ2V0UGl4ZWwoeCx5LGNoYW5uZWwsd2lkdGgsYnVmZil7cmV0dXJuIGJ1ZmZbKHgreSp3aWR0aCkqNCtjaGFubmVsXTt9CmZ1bmN0aW9uIGlzV2hpdGVQaXhlbChpLGosaW1nKXtyZXR1cm4gZ2V0UGl4ZWwoaSxqLDAsaW1nLndpZHRoLGltZy5kYXRhKT49MjQ5JiZnZXRQaXhlbChpLGosMSxpbWcud2lkdGgsaW1nLmRhdGEpPj0yNDkmJmdldFBpeGVsKGksaiwyLGltZy53aWR0aCxpbWcuZGF0YSk+PTI0OTt9CmZ1bmN0aW9uIGNvbnZlcnRQaXhlbHNUb0hpc3RvZ3JhbShpbWcpe2NvbnN0IGNyZWF0ZUhpc3RvZ3JhbUFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgcmV0PW5ldyBBcnJheSgyNTYpO2ZvcihsZXQgaT0wO2k8cmV0Lmxlbmd0aDtpKyspe3JldFtpXT0wO30KcmV0dXJuIHJldDt9O2NvbnN0IHdpZHRoPWltZy53aWR0aDtjb25zdCBoZWlnaHQ9aW1nLmhlaWdodDtjb25zdCBoaXN0b2dyYW1zPVtjcmVhdGVIaXN0b2dyYW1BcnJheSgpLGNyZWF0ZUhpc3RvZ3JhbUFycmF5KCksY3JlYXRlSGlzdG9ncmFtQXJyYXkoKV07Zm9yKGxldCBqPTA7ajxoZWlnaHQ7aisrKXtmb3IobGV0IGk9MDtpPHdpZHRoO2krKyl7aWYoaXNXaGl0ZVBpeGVsKGksaixpbWcpKXtjb250aW51ZTt9CmZvcihsZXQgY2hhbm5lbD0wO2NoYW5uZWw8aGlzdG9ncmFtcy5sZW5ndGg7Y2hhbm5lbCsrKXtjb25zdCBwaXhlbFZhbHVlPWdldFBpeGVsKGksaixjaGFubmVsLHdpZHRoLGltZy5kYXRhKTtoaXN0b2dyYW1zW2NoYW5uZWxdW3BpeGVsVmFsdWVdKys7fX19CnJldHVybiBoaXN0b2dyYW1zO30KZnVuY3Rpb24gc3ludGhlc2l6ZVdoaXRlRnJhbWUoZnJhbWVzKXtjb25zdCBmaXJzdEltYWdlRGF0YT1qcGVnLmRlY29kZShmcmFtZXNbMF0uZ2V0SW1hZ2UoKSk7Y29uc3Qgd2lkdGg9Zmlyc3RJbWFnZURhdGEud2lkdGg7Y29uc3QgaGVpZ2h0PWZpcnN0SW1hZ2VEYXRhLmhlaWdodDtjb25zdCBmcmFtZURhdGE9bmV3IEJ1ZmZlcih3aWR0aCpoZWlnaHQqNCk7bGV0IGk9MDt3aGlsZShpPGZyYW1lRGF0YS5sZW5ndGgpe2ZyYW1lRGF0YVtpKytdPTB4RkY7ZnJhbWVEYXRhW2krK109MHhGRjtmcmFtZURhdGFbaSsrXT0weEZGO2ZyYW1lRGF0YVtpKytdPTB4RkY7fQp2YXIganBlZ0ltYWdlRGF0YT1qcGVnLmVuY29kZSh7ZGF0YTpmcmFtZURhdGEsd2lkdGg6d2lkdGgsaGVpZ2h0OmhlaWdodH0pO3JldHVybiBqcGVnSW1hZ2VEYXRhLmRhdGE7fQpjb25zdCBzY3JlZW5zaG90VHJhY2VDYXRlZ29yeT0nZGlzYWJsZWQtYnktZGVmYXVsdC1kZXZ0b29scy5zY3JlZW5zaG90JztmdW5jdGlvbiBleHRyYWN0RnJhbWVzRnJvbVRpbWVsaW5lKHRpbWVsaW5lLG9wdHMpe29wdHM9b3B0c3x8e307bGV0IHRyYWNlO3RyYWNlPXR5cGVvZiB0aW1lbGluZT09PSdzdHJpbmcnP2ZzLnJlYWRGaWxlU3luYyh0aW1lbGluZSwndXRmLTgnKTp0aW1lbGluZTt0cnl7dHJhY2U9dHlwZW9mIHRyYWNlPT09J3N0cmluZyc/SlNPTi5wYXJzZSh0cmFjZSk6dHJhY2U7fWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignU3BlZWRsaW5lOiBJbnZhbGlkIEpTT04nK2UubWVzc2FnZSk7fQpsZXQgZXZlbnRzPXRyYWNlLnRyYWNlRXZlbnRzfHx0cmFjZTtldmVudHM9ZXZlbnRzLnNvcnQoKGEsYik9PmEudHMtYi50cykuZmlsdGVyKGU9PmUudHMhPT0wKTtjb25zdCBzdGFydFRzPShvcHRzLnRpbWVPcmlnaW58fGV2ZW50c1swXS50cykvMTAwMDtjb25zdCBlbmRUcz1ldmVudHNbZXZlbnRzLmxlbmd0aC0xXS50cy8xMDAwO2xldCBsYXN0RnJhbWU9bnVsbDtjb25zdCByYXdTY3JlZW5zaG90cz1ldmVudHMuZmlsdGVyKGU9PmUuY2F0LmluY2x1ZGVzKHNjcmVlbnNob3RUcmFjZUNhdGVnb3J5KSYmZS50cz49c3RhcnRUcyoxMDAwKTtjb25zdCB1bmlxdWVGcmFtZXM9cmF3U2NyZWVuc2hvdHMubWFwKGZ1bmN0aW9uKGV2dCl7Y29uc3QgYmFzZTY0aW1nPWV2dC5hcmdzJiZldnQuYXJncy5zbmFwc2hvdDtjb25zdCB0aW1lc3RhbXA9ZXZ0LnRzLzEwMDA7aWYoYmFzZTY0aW1nPT09bGFzdEZyYW1lKXtyZXR1cm4gbnVsbDt9Cmxhc3RGcmFtZT1iYXNlNjRpbWc7Y29uc3QgaW1nQnVmZj1uZXcgQnVmZmVyKGJhc2U2NGltZywnYmFzZTY0Jyk7cmV0dXJuIGZyYW1lKGltZ0J1ZmYsdGltZXN0YW1wKTt9KS5maWx0ZXIoQm9vbGVhbik7aWYodW5pcXVlRnJhbWVzLmxlbmd0aD09PTApe3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHNjcmVlbnNob3RzIGZvdW5kIGluIHRyYWNlJykpO30KY29uc3QgZmFrZVdoaXRlRnJhbWU9ZnJhbWUoc3ludGhlc2l6ZVdoaXRlRnJhbWUodW5pcXVlRnJhbWVzKSxzdGFydFRzKTt1bmlxdWVGcmFtZXMudW5zaGlmdChmYWtlV2hpdGVGcmFtZSk7Y29uc3QgZGF0YT17c3RhcnRUcyxlbmRUcyxmcmFtZXM6dW5pcXVlRnJhbWVzfTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO30KZnVuY3Rpb24gZnJhbWUoaW1nQnVmZix0cyl7bGV0IF9oaXN0b2dyYW09bnVsbDtsZXQgX3Byb2dyZXNzPW51bGw7bGV0IF9pc1Byb2dyZXNzSW50ZXJwb2xhdGVkPW51bGw7bGV0IF9wZXJjZXB0dWFsUHJvZ3Jlc3M9bnVsbDtsZXQgX2lzUGVyY2VwdHVhbFByb2dyZXNzSW50ZXJwb2xhdGVkPW51bGw7bGV0IF9wYXJzZWRJbWFnZT1udWxsO3JldHVybntnZXRIaXN0b2dyYW06ZnVuY3Rpb24oKXtpZihfaGlzdG9ncmFtKXtyZXR1cm4gX2hpc3RvZ3JhbTt9CmNvbnN0IHBpeGVscz10aGlzLmdldFBhcnNlZEltYWdlKCk7X2hpc3RvZ3JhbT1jb252ZXJ0UGl4ZWxzVG9IaXN0b2dyYW0ocGl4ZWxzKTtyZXR1cm4gX2hpc3RvZ3JhbTt9LGdldFRpbWVTdGFtcDpmdW5jdGlvbigpe3JldHVybiB0czt9LHNldFByb2dyZXNzOmZ1bmN0aW9uKHByb2dyZXNzLGlzSW50ZXJwb2xhdGVkKXtfcHJvZ3Jlc3M9cHJvZ3Jlc3M7X2lzUHJvZ3Jlc3NJbnRlcnBvbGF0ZWQ9Qm9vbGVhbihpc0ludGVycG9sYXRlZCk7fSxzZXRQZXJjZXB0dWFsUHJvZ3Jlc3M6ZnVuY3Rpb24ocHJvZ3Jlc3MsaXNJbnRlcnBvbGF0ZWQpe19wZXJjZXB0dWFsUHJvZ3Jlc3M9cHJvZ3Jlc3M7X2lzUGVyY2VwdHVhbFByb2dyZXNzSW50ZXJwb2xhdGVkPUJvb2xlYW4oaXNJbnRlcnBvbGF0ZWQpO30sZ2V0SW1hZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gaW1nQnVmZjt9LGdldFBhcnNlZEltYWdlOmZ1bmN0aW9uKCl7aWYoIV9wYXJzZWRJbWFnZSl7X3BhcnNlZEltYWdlPWpwZWcuZGVjb2RlKGltZ0J1ZmYpO30KcmV0dXJuIF9wYXJzZWRJbWFnZTt9LGdldFByb2dyZXNzOmZ1bmN0aW9uKCl7cmV0dXJuIF9wcm9ncmVzczt9LGlzUHJvZ3Jlc3NJbnRlcnBvbGF0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX2lzUHJvZ3Jlc3NJbnRlcnBvbGF0ZWQ7fSxnZXRQZXJjZXB0dWFsUHJvZ3Jlc3M6ZnVuY3Rpb24oKXtyZXR1cm4gX3BlcmNlcHR1YWxQcm9ncmVzczt9LGlzUGVyY2VwdHVhbFByb2dyZXNzSW50ZXJwb2xhdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIF9pc1BlcmNlcHR1YWxQcm9ncmVzc0ludGVycG9sYXRlZDt9fTt9Cm1vZHVsZS5leHBvcnRzPXtleHRyYWN0RnJhbWVzRnJvbVRpbWVsaW5lLGNyZWF0ZTpmcmFtZX07fSkuY2FsbCh0aGlzLHJlcXVpcmUoImJ1ZmZlciIpLkJ1ZmZlcik7fSx7ImJ1ZmZlciI6NjAsImpwZWctanMiOjEyMn1dLDEzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IGZyYW1lPXJlcXVpcmUoJy4vZnJhbWUnKTtjb25zdCBzcGVlZEluZGV4PXJlcXVpcmUoJy4vc3BlZWQtaW5kZXgnKTtmdW5jdGlvbiBjYWxjdWxhdGVWYWx1ZXMoZnJhbWVzLGRhdGEpe2NvbnN0IGluZGV4ZXM9c3BlZWRJbmRleC5jYWxjdWxhdGVTcGVlZEluZGV4ZXMoZnJhbWVzLGRhdGEpO2NvbnN0IGR1cmF0aW9uPU1hdGguZmxvb3IoZGF0YS5lbmRUcy1kYXRhLnN0YXJ0VHMpO2NvbnN0IGZpcnN0PU1hdGguZmxvb3IoaW5kZXhlcy5maXJzdFBhaW50VHMtZGF0YS5zdGFydFRzKTtjb25zdCBjb21wbGV0ZT1NYXRoLmZsb29yKGluZGV4ZXMudmlzdWFsbHlDb21wbGV0ZVRzLWRhdGEuc3RhcnRUcyk7cmV0dXJue2JlZ2lubmluZzpkYXRhLnN0YXJ0VHMsZW5kOmRhdGEuZW5kVHMsZnJhbWVzLGZpcnN0LGNvbXBsZXRlLGR1cmF0aW9uLHNwZWVkSW5kZXg6aW5kZXhlcy5zcGVlZEluZGV4LHBlcmNlcHR1YWxTcGVlZEluZGV4OmluZGV4ZXMucGVyY2VwdHVhbFNwZWVkSW5kZXh9O30KY29uc3QgSW5jbHVkZT17QWxsOidhbGwnLHBTSToncGVyY2VwdHVhbFNwZWVkSW5kZXgnLFNJOidzcGVlZEluZGV4J307bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odGltZWxpbmUsb3B0cyl7Y29uc3QgaW5jbHVkZT1vcHRzJiZvcHRzLmluY2x1ZGV8fEluY2x1ZGUuQWxsO2lmKCFPYmplY3Qua2V5cyhJbmNsdWRlKS5zb21lKGtleT0+SW5jbHVkZVtrZXldPT09aW5jbHVkZSkpe3Rocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGluY2x1ZGUgb3B0aW9uOiAke2luY2x1ZGV9YCk7fQpyZXR1cm4gZnJhbWUuZXh0cmFjdEZyYW1lc0Zyb21UaW1lbGluZSh0aW1lbGluZSxvcHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpe2NvbnN0IGZyYW1lcz1kYXRhLmZyYW1lcztpZihpbmNsdWRlPT09SW5jbHVkZS5BbGx8fGluY2x1ZGU9PT1JbmNsdWRlLlNJKXtzcGVlZEluZGV4LmNhbGN1bGF0ZVZpc3VhbFByb2dyZXNzKGZyYW1lcyxvcHRzKTt9CmlmKGluY2x1ZGU9PT1JbmNsdWRlLkFsbHx8aW5jbHVkZT09PUluY2x1ZGUucFNJKXtzcGVlZEluZGV4LmNhbGN1bGF0ZVBlcmNlcHR1YWxQcm9ncmVzcyhmcmFtZXMsb3B0cyk7fQpyZXR1cm4gY2FsY3VsYXRlVmFsdWVzKGZyYW1lcyxkYXRhKTt9KTt9O30seyIuL2ZyYW1lIjoxMzMsIi4vc3BlZWQtaW5kZXgiOjEzNX1dLDEzNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IGltYWdlU1NJTT1yZXF1aXJlKCdpbWFnZS1zc2ltJyk7Y29uc3QgZmFzdE1vZGVBbGxvd2FibGVDaGFuZ2VNYXg9NTtjb25zdCBmYXN0TW9kZUFsbG93YWJsZUNoYW5nZU1lZGlhbj0zO2NvbnN0IGZhc3RNb2RlQWxsb3dhYmxlQ2hhbmdlTWluPS0xO2NvbnN0IGZhc3RNb2RlQ29uc3RhbnQ9ZmFzdE1vZGVBbGxvd2FibGVDaGFuZ2VNaW47Y29uc3QgZmFzdE1vZGVNdWx0aXBsaWVyPWZhc3RNb2RlQWxsb3dhYmxlQ2hhbmdlTWF4LWZhc3RNb2RlQ29uc3RhbnQ7Y29uc3QgZmFzdE1vZGVFeHBvbmVudGlhdGlvbkNvZWZmaWNpZW50PU1hdGgubG9nKChmYXN0TW9kZUFsbG93YWJsZUNoYW5nZU1lZGlhbi1mYXN0TW9kZUNvbnN0YW50KS9mYXN0TW9kZU11bHRpcGxpZXIpO2Z1bmN0aW9uIGNhbGN1bGF0ZUZhc3RNb2RlQWxsb3dhYmxlQ2hhbmdlKGVsYXBzZWRUaW1lKXtjb25zdCBlbGFwc2VkVGltZUluU2Vjb25kcz1lbGFwc2VkVGltZS8xMDAwO2NvbnN0IGFsbG93YWJsZUNoYW5nZT1mYXN0TW9kZU11bHRpcGxpZXIqTWF0aC5leHAoZmFzdE1vZGVFeHBvbmVudGlhdGlvbkNvZWZmaWNpZW50KmVsYXBzZWRUaW1lSW5TZWNvbmRzKStmYXN0TW9kZUNvbnN0YW50O3JldHVybiBhbGxvd2FibGVDaGFuZ2U7fQpmdW5jdGlvbiBjYWxjdWxhdGVGcmFtZVByb2dyZXNzKGN1cnJlbnQsaW5pdGlhbCx0YXJnZXQpe2xldCB0b3RhbD0wO2xldCBtYXRjaD0wO2NvbnN0IGN1cnJlbnRIaXN0PWN1cnJlbnQuZ2V0SGlzdG9ncmFtKCk7Y29uc3QgaW5pdGlhbEhpc3Q9aW5pdGlhbC5nZXRIaXN0b2dyYW0oKTtjb25zdCB0YXJnZXRIaXN0PXRhcmdldC5nZXRIaXN0b2dyYW0oKTtmb3IobGV0IGNoYW5uZWw9MDtjaGFubmVsPDM7Y2hhbm5lbCsrKXtmb3IobGV0IHBpeGVsVmFsPTA7cGl4ZWxWYWw8MjU2O3BpeGVsVmFsKyspe2NvbnN0IGN1cnJlbnRDb3VudD1jdXJyZW50SGlzdFtjaGFubmVsXVtwaXhlbFZhbF07Y29uc3QgaW5pdGlhbENvdW50PWluaXRpYWxIaXN0W2NoYW5uZWxdW3BpeGVsVmFsXTtjb25zdCB0YXJnZXRDb3VudD10YXJnZXRIaXN0W2NoYW5uZWxdW3BpeGVsVmFsXTtjb25zdCBjdXJyZW50RGlmZj1NYXRoLmFicyhjdXJyZW50Q291bnQtaW5pdGlhbENvdW50KTtjb25zdCB0YXJnZXREaWZmPU1hdGguYWJzKHRhcmdldENvdW50LWluaXRpYWxDb3VudCk7bWF0Y2grPU1hdGgubWluKGN1cnJlbnREaWZmLHRhcmdldERpZmYpO3RvdGFsKz10YXJnZXREaWZmO319CmxldCBwcm9ncmVzcztpZihtYXRjaD09PTAmJnRvdGFsPT09MCl7cHJvZ3Jlc3M9MTAwO31lbHNle3Byb2dyZXNzPU1hdGguZmxvb3IobWF0Y2gvdG90YWwqMTAwKTt9CnJldHVybiBwcm9ncmVzczt9CmZ1bmN0aW9uIGNhbGN1bGF0ZVByb2dyZXNzQmV0d2VlbkZyYW1lcyhmcmFtZXMsbG93ZXJCb3VuZCx1cHBlckJvdW5kLGlzRmFzdE1vZGUsZ2V0UHJvZ3Jlc3Msc2V0UHJvZ3Jlc3Mpe2lmKCFpc0Zhc3RNb2RlKXtmcmFtZXMuZm9yRWFjaChmcmFtZT0+c2V0UHJvZ3Jlc3MoZnJhbWUsZ2V0UHJvZ3Jlc3MoZnJhbWUpLGZhbHNlKSk7cmV0dXJuO30KY29uc3QgbG93ZXJGcmFtZT1mcmFtZXNbbG93ZXJCb3VuZF07Y29uc3QgdXBwZXJGcmFtZT1mcmFtZXNbdXBwZXJCb3VuZF07Y29uc3QgZWxhcHNlZFRpbWU9dXBwZXJGcmFtZS5nZXRUaW1lU3RhbXAoKS1sb3dlckZyYW1lLmdldFRpbWVTdGFtcCgpO2NvbnN0IGxvd2VyUHJvZ3Jlc3M9Z2V0UHJvZ3Jlc3MobG93ZXJGcmFtZSk7Y29uc3QgdXBwZXJQcm9ncmVzcz1nZXRQcm9ncmVzcyh1cHBlckZyYW1lKTtzZXRQcm9ncmVzcyhsb3dlckZyYW1lLGxvd2VyUHJvZ3Jlc3MsZmFsc2UpO3NldFByb2dyZXNzKHVwcGVyRnJhbWUsdXBwZXJQcm9ncmVzcyxmYWxzZSk7aWYoTWF0aC5hYnMobG93ZXJQcm9ncmVzcy11cHBlclByb2dyZXNzKTxjYWxjdWxhdGVGYXN0TW9kZUFsbG93YWJsZUNoYW5nZShlbGFwc2VkVGltZSkpe2ZvcihsZXQgaT1sb3dlckJvdW5kKzE7aTx1cHBlckJvdW5kO2krKyl7c2V0UHJvZ3Jlc3MoZnJhbWVzW2ldLGxvd2VyUHJvZ3Jlc3MsdHJ1ZSk7fX1lbHNlIGlmKHVwcGVyQm91bmQtbG93ZXJCb3VuZD4xKXtjb25zdCBtaWRwb2ludD1NYXRoLmZsb29yKChsb3dlckJvdW5kK3VwcGVyQm91bmQpLzIpO2NhbGN1bGF0ZVByb2dyZXNzQmV0d2VlbkZyYW1lcyhmcmFtZXMsbG93ZXJCb3VuZCxtaWRwb2ludCxpc0Zhc3RNb2RlLGdldFByb2dyZXNzLHNldFByb2dyZXNzKTtjYWxjdWxhdGVQcm9ncmVzc0JldHdlZW5GcmFtZXMoZnJhbWVzLG1pZHBvaW50LHVwcGVyQm91bmQsaXNGYXN0TW9kZSxnZXRQcm9ncmVzcyxzZXRQcm9ncmVzcyk7fX0KZnVuY3Rpb24gY2FsY3VsYXRlVmlzdWFsUHJvZ3Jlc3MoZnJhbWVzLG9wdHMpe2NvbnN0IGluaXRpYWw9ZnJhbWVzWzBdO2NvbnN0IHRhcmdldD1mcmFtZXNbZnJhbWVzLmxlbmd0aC0xXTtmdW5jdGlvbiBnZXRQcm9ncmVzcyhmcmFtZSl7aWYodHlwZW9mIGZyYW1lLmdldFByb2dyZXNzKCk9PT0nbnVtYmVyJyl7cmV0dXJuIGZyYW1lLmdldFByb2dyZXNzKCk7fQpyZXR1cm4gY2FsY3VsYXRlRnJhbWVQcm9ncmVzcyhmcmFtZSxpbml0aWFsLHRhcmdldCk7fQpmdW5jdGlvbiBzZXRQcm9ncmVzcyhmcmFtZSxwcm9ncmVzcyxpc0ludGVycG9sYXRlZCl7cmV0dXJuIGZyYW1lLnNldFByb2dyZXNzKHByb2dyZXNzLGlzSW50ZXJwb2xhdGVkKTt9CmNhbGN1bGF0ZVByb2dyZXNzQmV0d2VlbkZyYW1lcyhmcmFtZXMsMCxmcmFtZXMubGVuZ3RoLTEsb3B0cyYmb3B0cy5mYXN0TW9kZSxnZXRQcm9ncmVzcyxzZXRQcm9ncmVzcyk7cmV0dXJuIGZyYW1lczt9CmZ1bmN0aW9uIGNhbGN1bGF0ZUZyYW1lU2ltaWxhcml0eShmcmFtZSx0YXJnZXQpe2NvbnN0IGRlZmF1bHRJbWFnZUNvbmZpZz17Y2hhbm5lbHM6NH07Y29uc3QgZnJhbWVEYXRhPU9iamVjdC5hc3NpZ24oZnJhbWUuZ2V0UGFyc2VkSW1hZ2UoKSxkZWZhdWx0SW1hZ2VDb25maWcpO2NvbnN0IHRhcmdldERhdGE9T2JqZWN0LmFzc2lnbih0YXJnZXQuZ2V0UGFyc2VkSW1hZ2UoKSxkZWZhdWx0SW1hZ2VDb25maWcpO2NvbnN0IGRpZmY9aW1hZ2VTU0lNLmNvbXBhcmUoZnJhbWVEYXRhLHRhcmdldERhdGEpO3JldHVybiBkaWZmLnNzaW07fQpmdW5jdGlvbiBjYWxjdWxhdGVQZXJjZXB0dWFsUHJvZ3Jlc3MoZnJhbWVzLG9wdHMpe2NvbnN0IGluaXRpYWw9ZnJhbWVzWzBdO2NvbnN0IHRhcmdldD1mcmFtZXNbZnJhbWVzLmxlbmd0aC0xXTtjb25zdCBpbml0aWFsU2ltaWxhcml0eT1jYWxjdWxhdGVGcmFtZVNpbWlsYXJpdHkoaW5pdGlhbCx0YXJnZXQpO2Z1bmN0aW9uIGdldFByb2dyZXNzKGZyYW1lKXtpZih0eXBlb2YgZnJhbWUuZ2V0UGVyY2VwdHVhbFByb2dyZXNzKCk9PT0nbnVtYmVyJyl7cmV0dXJuIGZyYW1lLmdldFBlcmNlcHR1YWxQcm9ncmVzcygpO30KY29uc3Qgc3NpbT1jYWxjdWxhdGVGcmFtZVNpbWlsYXJpdHkoZnJhbWUsdGFyZ2V0KTtyZXR1cm4gTWF0aC5tYXgoMTAwKihzc2ltLWluaXRpYWxTaW1pbGFyaXR5KS8oMS1pbml0aWFsU2ltaWxhcml0eSksMCk7fQpmdW5jdGlvbiBzZXRQcm9ncmVzcyhmcmFtZSxwcm9ncmVzcyxpc0ludGVycG9sYXRlZCl7cmV0dXJuIGZyYW1lLnNldFBlcmNlcHR1YWxQcm9ncmVzcyhwcm9ncmVzcyxpc0ludGVycG9sYXRlZCk7fQpjYWxjdWxhdGVQcm9ncmVzc0JldHdlZW5GcmFtZXMoZnJhbWVzLDAsZnJhbWVzLmxlbmd0aC0xLG9wdHMmJm9wdHMuZmFzdE1vZGUsZ2V0UHJvZ3Jlc3Msc2V0UHJvZ3Jlc3MpO3JldHVybiBmcmFtZXM7fQpmdW5jdGlvbiBjYWxjdWxhdGVTcGVlZEluZGV4ZXMoZnJhbWVzLGRhdGEpe2NvbnN0IGhhc1Zpc3VhbFByb2dyZXNzPXR5cGVvZiBmcmFtZXNbMF0uZ2V0UHJvZ3Jlc3MoKT09PSdudW1iZXInO2NvbnN0IGhhc1BlcmNlcHR1YWxQcm9ncmVzcz10eXBlb2YgZnJhbWVzWzBdLmdldFBlcmNlcHR1YWxQcm9ncmVzcygpPT09J251bWJlcic7Y29uc3QgcHJvZ3Jlc3NUb1VzZT1oYXNWaXN1YWxQcm9ncmVzcz8nZ2V0UHJvZ3Jlc3MnOidnZXRQZXJjZXB0dWFsUHJvZ3Jlc3MnO2NvbnN0IHN0YXJ0VHM9ZGF0YS5zdGFydFRzO2xldCB2aXN1YWxseUNvbXBsZXRlVHM7bGV0IGZpcnN0UGFpbnRUcztmb3IobGV0IGk9MDtpPGZyYW1lcy5sZW5ndGgmJiFmaXJzdFBhaW50VHM7aSsrKXtpZihmcmFtZXNbaV1bcHJvZ3Jlc3NUb1VzZV0oKT4wKXtmaXJzdFBhaW50VHM9ZnJhbWVzW2ldLmdldFRpbWVTdGFtcCgpO319CmZvcihsZXQgaT0wO2k8ZnJhbWVzLmxlbmd0aCYmIXZpc3VhbGx5Q29tcGxldGVUcztpKyspe2lmKGZyYW1lc1tpXVtwcm9ncmVzc1RvVXNlXSgpPj0xMDApe3Zpc3VhbGx5Q29tcGxldGVUcz1mcmFtZXNbaV0uZ2V0VGltZVN0YW1wKCk7fX0KbGV0IHByZXZGcmFtZVRzPWZyYW1lc1swXS5nZXRUaW1lU3RhbXAoKTtsZXQgcHJldlByb2dyZXNzPWZyYW1lc1swXS5nZXRQcm9ncmVzcygpO2xldCBwcmV2UGVyY2VwdHVhbFByb2dyZXNzPWZyYW1lc1swXS5nZXRQZXJjZXB0dWFsUHJvZ3Jlc3MoKTtsZXQgc3BlZWRJbmRleD1maXJzdFBhaW50VHMtc3RhcnRUcztsZXQgcGVyY2VwdHVhbFNwZWVkSW5kZXg9Zmlyc3RQYWludFRzLXN0YXJ0VHM7ZnJhbWVzLmZvckVhY2goZnVuY3Rpb24oZnJhbWUpe2lmKGZyYW1lLmdldFRpbWVTdGFtcCgpPmZpcnN0UGFpbnRUcyl7Y29uc3QgZWxhcHNlZD1mcmFtZS5nZXRUaW1lU3RhbXAoKS1wcmV2RnJhbWVUcztzcGVlZEluZGV4Kz1lbGFwc2VkKigxLXByZXZQcm9ncmVzcyk7cGVyY2VwdHVhbFNwZWVkSW5kZXgrPWVsYXBzZWQqKDEtcHJldlBlcmNlcHR1YWxQcm9ncmVzcyk7fQpwcmV2RnJhbWVUcz1mcmFtZS5nZXRUaW1lU3RhbXAoKTtwcmV2UHJvZ3Jlc3M9ZnJhbWUuZ2V0UHJvZ3Jlc3MoKS8xMDA7cHJldlBlcmNlcHR1YWxQcm9ncmVzcz1mcmFtZS5nZXRQZXJjZXB0dWFsUHJvZ3Jlc3MoKS8xMDA7fSk7c3BlZWRJbmRleD1oYXNWaXN1YWxQcm9ncmVzcz9zcGVlZEluZGV4OnVuZGVmaW5lZDtwZXJjZXB0dWFsU3BlZWRJbmRleD1oYXNQZXJjZXB0dWFsUHJvZ3Jlc3M/cGVyY2VwdHVhbFNwZWVkSW5kZXg6dW5kZWZpbmVkO3JldHVybntmaXJzdFBhaW50VHMsdmlzdWFsbHlDb21wbGV0ZVRzLHNwZWVkSW5kZXgscGVyY2VwdHVhbFNwZWVkSW5kZXh9O30KbW9kdWxlLmV4cG9ydHM9e2NhbGN1bGF0ZUZhc3RNb2RlQWxsb3dhYmxlQ2hhbmdlLGNhbGN1bGF0ZUZyYW1lU2ltaWxhcml0eSxjYWxjdWxhdGVWaXN1YWxQcm9ncmVzcyxjYWxjdWxhdGVQZXJjZXB0dWFsUHJvZ3Jlc3MsY2FsY3VsYXRlU3BlZWRJbmRleGVzfTt9LHsiaW1hZ2Utc3NpbSI6MTIxfV0sMTM2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17InZlcnNpb24iOiIzLjAuMyJ9O30se31dLDEzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9eyJucG0iOnsiYW5ndWxhciI6W3siaWQiOiJucG06YW5ndWxhcjoyMDEzMDYyMSIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPD0xLjEuNSJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTMwNjIyIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS4yLjAgPj0xLjAuMCJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTMwNjI1Iiwic2V2ZXJpdHkiOiJoaWdoIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuMS41Il19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxMzExMTMiLCJzZXZlcml0eSI6ImhpZ2giLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS4yLjIiXX19LHsiaWQiOiJucG06YW5ndWxhcjoyMDE0MDYwOCIsInNldmVyaXR5IjoibG93Iiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuMy4wIl19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNDA5MDgiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjMuMC1yYy40Il19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNDA5MDkiLCJzZXZlcml0eSI6ImhpZ2giLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS4yLjI0ID49MS4yLjE5Il19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNDExMDQiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjMuMiJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTUwMzEwIiwic2V2ZXJpdHkiOiJoaWdoIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuNS4wLWJldGEuMiJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTUwMzE1Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS42LjEiXX19LHsiaWQiOiJucG06YW5ndWxhcjoyMDE1MDgwNyIsInNldmVyaXR5IjoiaGlnaCIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjUuMC1iZXRhLjAgPj0xLjAuMCJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTUwODA3LTEiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjUuMC1iZXRhLjAgPj0xLjMuMSJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTUwOTA5Iiwic2V2ZXJpdHkiOiJoaWdoIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuNS4wLWJldGEuMiJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTUxMTMwIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS40LjEwIl19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNTEyMDUiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjUuMC1yYy4wIl19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNjAxMjIiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjUuMC1yYy4yID49MS4zLjAiXX19LHsiaWQiOiJucG06YW5ndWxhcjoyMDE2MDUyNyIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuMi4zMCA+PTEuMC4wIl19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNjExMDEiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjUuOSA+PTEuNS4wIl19fSx7ImlkIjoibnBtOmFuZ3VsYXI6MjAxNzEwMTgiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjYuNyJdfX0seyJpZCI6Im5wbTphbmd1bGFyOjIwMTgwMjAyIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS42LjkiXX19XSwiYmFja2JvbmUiOlt7ImlkIjoibnBtOmJhY2tib25lOjIwMTEwNzAxIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MC41LjAiXX19LHsiaWQiOiJucG06YmFja2JvbmU6MjAxNjA1MjMiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw9IDAuMy4zIl19fV0sImJvb3RzdHJhcCI6W3siaWQiOiJucG06Ym9vdHN0cmFwOjIwMTIwNTEwIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8Mi4xLjAiXX19LHsiaWQiOiJucG06Ym9vdHN0cmFwOjIwMTYwNjI3Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8My40LjAgfHwgPj00LjAuMC1hbHBoYSA8NC4wLjAtYmV0YS4yIl19fV0sImRvam8iOlt7ImlkIjoibnBtOmRvam86MjAwOTA0MDkiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjEiXX19LHsiaWQiOiJucG06ZG9qbzoyMDEwMDYxNCIsInNldmVyaXR5IjoiaGlnaCIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIj49MC40IDwwLjQuNCB8fCA+PTEuMCA8MS4wLjMgfHwgPj0xLjEgPDEuMS4yIHx8ID49MS4yIDwxLjIuNCB8fCA+PTEuMyA8MS4zLjMgfHwgPj0xLjQgPDEuNC4yIl19fSx7ImlkIjoibnBtOmRvam86MjAxMDA2MTQtNiIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuNC4yIl19fSx7ImlkIjoibnBtOmRvam86MjAxNjA1MjMiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw9IDEuMC4wIl19fV0sImZvdW5kYXRpb24tc2l0ZXMiOlt7ImlkIjoibnBtOmZvdW5kYXRpb24tc2l0ZXM6MjAxMjA3MTciLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwzLjAuNiA+PTMuMC4wIl19fSx7ImlkIjoibnBtOmZvdW5kYXRpb24tc2l0ZXM6MjAxNTA2MTkiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw1LjUuMyJdfX0seyJpZCI6Im5wbTpmb3VuZGF0aW9uLXNpdGVzOjIwMTcwODAyIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8Ni4wLjAiXX19XSwiaGFuZGxlYmFycyI6W3siaWQiOiJucG06aGFuZGxlYmFyczoyMDExMDQyNSIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPD0xLjAuMC1iZXRhLjMiXX19LHsiaWQiOiJucG06aGFuZGxlYmFyczoyMDE1MTIwNyIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDQuMC4wIl19fV0sImhpZ2hjaGFydHMiOlt7ImlkIjoibnBtOmhpZ2hjaGFydHM6MjAxODAyMjUiLCJzZXZlcml0eSI6ImxvdyIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw9Ni4wLjciXX19XSwianF1ZXJ5IjpbeyJpZCI6Im5wbTpqcXVlcnk6MjAxMTA2MDYiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjYuMyJdfX0seyJpZCI6Im5wbTpqcXVlcnk6MjAxMjAyMDYiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwxLjkuMCA+PTEuNy4xIl19fSx7ImlkIjoibnBtOmpxdWVyeToyMDE0MDkwMiIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPD0xLjUuMSA+PTEuNC4yIl19fSx7ImlkIjoibnBtOmpxdWVyeToyMDE1MDYyNyIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDMuMC4wLWJldGExID4xLjEyLjMgfHwgPDEuMTIuMCA+PTEuNC4wIl19fSx7ImlkIjoibnBtOmpxdWVyeToyMDE2MDUyOSIsInNldmVyaXR5IjoibG93Iiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPTMuMC4wLXJjLjEiXX19XSwianF1ZXJ5LW1vYmlsZSI6W3siaWQiOiJucG06anF1ZXJ5LW1vYmlsZToyMDEyMDgwMiIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuMi4wIl19fV0sImpxdWVyeS11aSI6W3siaWQiOiJucG06anF1ZXJ5LXVpOjIwMTAwOTAzIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MS4xMC4wIl19fSx7ImlkIjoibnBtOmpxdWVyeS11aToyMDEyMTEyNyIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDEuMTAuMCJdfX0seyJpZCI6Im5wbTpqcXVlcnktdWk6MjAxNjA3MjEiLCJzZXZlcml0eSI6ImhpZ2giLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8PTEuMTEuNCJdfX1dLCJrbm9ja291dCI6W3siaWQiOiJucG06a25vY2tvdXQ6MjAxMzA3MDEiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwzLjAuMCA+PTIuMS4wLXByZSJdfX0seyJpZCI6Im5wbTprbm9ja291dDoyMDE4MDIxMyIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDMuNS4wLWJldGEiXX19XSwibG9kYXNoIjpbeyJpZCI6Im5wbTpsb2Rhc2g6MjAxODAxMzAiLCJzZXZlcml0eSI6ImxvdyIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw0LjE3LjUiXX19XSwibW9tZW50IjpbeyJpZCI6Im5wbTptb21lbnQ6MjAxNjAxMjYiLCJzZXZlcml0eSI6ImxvdyIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjw9Mi4xMS4xIl19fSx7ImlkIjoibnBtOm1vbWVudDoyMDE2MTAxOSIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDIuMTUuMiJdfX0seyJpZCI6Im5wbTptb21lbnQ6MjAxNzA5MDUiLCJzZXZlcml0eSI6ImxvdyIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwyLjE5LjMiXX19XSwibXVzdGFjaGUiOlt7ImlkIjoibnBtOm11c3RhY2hlOjIwMTEwODE0Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8IDAuMy4xIl19fSx7ImlkIjoibnBtOm11c3RhY2hlOjIwMTUxMjA3Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8Mi4yLjEiXX19XSwicmVhY3QiOlt7ImlkIjoibnBtOnJlYWN0OjIwMTMxMjE3Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI+PTAuNS4wIDwwLjUuMiB8fCA+PTAuNC4wIDwwLjQuMiJdfX0seyJpZCI6Im5wbTpyZWFjdDoyMDE1MDMxOCIsInNldmVyaXR5IjoiaGlnaCIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwwLjE0LjAiXX19XSwicmlvdCI6W3siaWQiOiJucG06cmlvdDoyMDEzMTExNCIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDAuOS42Il19fV0sInNvY2tldC5pbyI6W3siaWQiOiJucG06c29ja2V0LmlvOjIwMTIwMzIzIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MC45LjciXX19LHsiaWQiOiJucG06c29ja2V0LmlvOjIwMTIwNDE3Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8MC45LjYiXX19XSwidnVlIjpbeyJpZCI6Im5wbTp2dWU6MjAxNzA0MDEiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwyLjMuMC1iZXRhLjEiXX19LHsiaWQiOiJucG06dnVlOjIwMTcwODI5Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8Mi40LjMiXX19LHsiaWQiOiJucG06dnVlOjIwMTgwMjIyIiwic2V2ZXJpdHkiOiJsb3ciLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8PTIuNS4xNCJdfX1dLCJ5dWkiOlt7ImlkIjoibnBtOnl1aToyMDEwMTAyNSIsInNldmVyaXR5IjoibWVkaXVtIiwic2VtdmVyIjp7InZ1bG5lcmFibGUiOlsiPDIuOC4yID49Mi40LjAiXX19LHsiaWQiOiJucG06eXVpOjIwMTIwNDI4Iiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8My41LjEgPj0zLjUuMC1QUjEiXX19LHsiaWQiOiJucG06eXVpOjIwMTIxMDMwIiwic2V2ZXJpdHkiOiJtZWRpdW0iLCJzZW12ZXIiOnsidnVsbmVyYWJsZSI6WyI8My4wLjAgPj0yLjQuMCJdfX0seyJpZCI6Im5wbTp5dWk6MjAxMzA1MTUiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIjwzLjEwLjAgPj0zLjAuMCJdfX0seyJpZCI6Im5wbTp5dWk6MjAxMzA2MDQiLCJzZXZlcml0eSI6Im1lZGl1bSIsInNlbXZlciI6eyJ2dWxuZXJhYmxlIjpbIj49My4wLjAgPDMuMTAuMSB8fCA9My4xMC4yIl19fV19fTt9LHt9XSwidXJsIjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7J3VzZSBzdHJpY3QnO2NvbnN0IFV0aWw9cmVxdWlyZSgnLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbC5qcycpO2NvbnN0IFVSTD10eXBlb2Ygc2VsZiE9PSd1bmRlZmluZWQnJiZzZWxmLlVSTHx8cmVxdWlyZSgndXJsJykuVVJMO2NvbnN0IGxpc3RPZlRsZHM9Wydjb20nLCdjbycsJ2dvdicsJ2VkdScsJ2FjJywnb3JnJywnZ28nLCdnb2InLCdvcicsJ25ldCcsJ2luJywnbmUnLCduaWMnLCdnb3V2Jywnd2ViJywnc3BiJywnYmxvZycsJ2p1cycsJ2tpZXYnLCdtaWwnLCd3aScsJ3FjJywnY2EnLCdiZWwnLCdvbiddO2Z1bmN0aW9uIHJld3JpdGVDaHJvbWVJbnRlcm5hbFVybCh1cmwpe2lmKCF1cmx8fCF1cmwuc3RhcnRzV2l0aCgnY2hyb21lOi8vJykpcmV0dXJuIHVybDtpZih1cmwuZW5kc1dpdGgoJy8nKSl1cmw9dXJsLnJlcGxhY2UoL1wvJC8sJycpO3JldHVybiB1cmwucmVwbGFjZSgvXmNocm9tZTpcL1wvY2hyb21lXC8vLCdjaHJvbWU6Ly8nKTt9CmNsYXNzIFVSTFNoaW0gZXh0ZW5kcyBVUkx7c3RhdGljIGlzVmFsaWQodXJsKXt0cnl7bmV3IFVSTCh1cmwpO3JldHVybiB0cnVlO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fX0Kc3RhdGljIGhvc3RzTWF0Y2godXJsQSx1cmxCKXt0cnl7cmV0dXJuIG5ldyBVUkwodXJsQSkuaG9zdD09PW5ldyBVUkwodXJsQikuaG9zdDt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319CnN0YXRpYyBvcmlnaW5zTWF0Y2godXJsQSx1cmxCKXt0cnl7cmV0dXJuIG5ldyBVUkwodXJsQSkub3JpZ2luPT09bmV3IFVSTCh1cmxCKS5vcmlnaW47fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9fQpzdGF0aWMgZ2V0T3JpZ2luKHVybCl7dHJ5e2NvbnN0IHVybEluZm89bmV3IFVSTCh1cmwpO3JldHVybiB1cmxJbmZvLmhvc3QmJnVybEluZm8ub3JpZ2lufHxudWxsO31jYXRjaChlKXtyZXR1cm4gbnVsbDt9fQpzdGF0aWMgZ2V0VGxkKGhvc3RuYW1lKXtjb25zdCB0bGRzPWhvc3RuYW1lLnNwbGl0KCcuJykuc2xpY2UoLTIpO2lmKCFsaXN0T2ZUbGRzLmluY2x1ZGVzKHRsZHNbMF0pKXtyZXR1cm5gLiR7dGxkc1t0bGRzLmxlbmd0aC0xXX1gO30KcmV0dXJuYC4ke3RsZHMuam9pbignLicpfWA7fQpzdGF0aWMgcm9vdERvbWFpbnNNYXRjaCh1cmxBLHVybEIpe2xldCB1cmxBSW5mbztsZXQgdXJsQkluZm87dHJ5e3VybEFJbmZvPW5ldyBVUkwodXJsQSk7dXJsQkluZm89bmV3IFVSTCh1cmxCKTt9Y2F0Y2goZXJyKXtyZXR1cm4gZmFsc2U7fQppZighdXJsQUluZm8uaG9zdG5hbWV8fCF1cmxCSW5mby5ob3N0bmFtZSl7cmV0dXJuIGZhbHNlO30KY29uc3QgdGxkQT1VUkxTaGltLmdldFRsZCh1cmxBSW5mby5ob3N0bmFtZSk7Y29uc3QgdGxkQj1VUkxTaGltLmdldFRsZCh1cmxCSW5mby5ob3N0bmFtZSk7Y29uc3QgdXJsQVJvb3REb21haW49dXJsQUluZm8uaG9zdG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKGAke3RsZEF9JGApLCcnKS5zcGxpdCgnLicpLnNwbGljZSgtMSlbMF07Y29uc3QgdXJsQlJvb3REb21haW49dXJsQkluZm8uaG9zdG5hbWUucmVwbGFjZShuZXcgUmVnRXhwKGAke3RsZEJ9JGApLCcnKS5zcGxpdCgnLicpLnNwbGljZSgtMSlbMF07cmV0dXJuIHVybEFSb290RG9tYWluPT09dXJsQlJvb3REb21haW47fQpzdGF0aWMgZ2V0VVJMRGlzcGxheU5hbWUodXJsLG9wdGlvbnMpe3JldHVybiBVdGlsLmdldFVSTERpc3BsYXlOYW1lKG5ldyBVUkwodXJsKSxvcHRpb25zKTt9CnN0YXRpYyBlbGlkZURhdGFVUkkodXJsKXt0cnl7Y29uc3QgcGFyc2VkPW5ldyBVUkwodXJsKTtyZXR1cm4gcGFyc2VkLnByb3RvY29sPT09J2RhdGE6Jz91cmwuc2xpY2UoMCwxMDApOnVybDt9Y2F0Y2goZSl7cmV0dXJuIHVybDt9fQpzdGF0aWMgZXF1YWxXaXRoRXhjbHVkZWRGcmFnbWVudHModXJsMSx1cmwyKXtbdXJsMSx1cmwyXT1bdXJsMSx1cmwyXS5tYXAocmV3cml0ZUNocm9tZUludGVybmFsVXJsKTt0cnl7Y29uc3QgdXJsYT1uZXcgVVJMKHVybDEpO3VybGEuaGFzaD0nJztjb25zdCB1cmxiPW5ldyBVUkwodXJsMik7dXJsYi5oYXNoPScnO3JldHVybiB1cmxhLmhyZWY9PT11cmxiLmhyZWY7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9fX0KVVJMU2hpbS5VUkw9VVJMO1VSTFNoaW0uVVJMU2VhcmNoUGFyYW1zPXR5cGVvZiBzZWxmIT09J3VuZGVmaW5lZCcmJnNlbGYuVVJMU2VhcmNoUGFyYW1zfHxyZXF1aXJlKCd1cmwnKS5VUkxTZWFyY2hQYXJhbXM7VVJMU2hpbS5OT05fTkVUV09SS19QUk9UT0NPTFM9WydibG9iJywnZGF0YSddO1VSTFNoaW0uSU5WQUxJRF9VUkxfREVCVUdfU1RSSU5HPSdMaWdodGhvdXNlIHdhcyB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBVUkwgb2Ygc29tZSBzY3JpcHQgZXhlY3V0aW9ucy4gJysnSXRcJ3MgcG9zc2libGUgYSBDaHJvbWUgZXh0ZW5zaW9uIG9yIG90aGVyIGV2YWxcJ2QgY29kZSBpcyB0aGUgc291cmNlLic7bW9kdWxlLmV4cG9ydHM9VVJMU2hpbTt9LHsiLi4vcmVwb3J0L2h0bWwvcmVuZGVyZXIvdXRpbC5qcyI6NDgsInVybCI6InVybCJ9XX0se30sWzUyXSk7O2NsYXNzIExpZ2h0aG91c2VQb3J0e29uKGV2ZW50TmFtZSxjYil7fQpzZW5kKG1lc3NhZ2Upe30KY2xvc2UoKXt9fQp2YXIgQXVkaXRzMlNlcnZpY2U9Y2xhc3N7c2V0Tm90aWZ5KG5vdGlmeSl7dGhpcy5fbm90aWZ5PW5vdGlmeTt9CnN0YXJ0KHBhcmFtcyl7aWYoUnVudGltZS5xdWVyeVBhcmFtKCdpc1VuZGVyVGVzdCcpKQp0aGlzLl9kaXNhYmxlTG9nZ2luZ0ZvclRlc3QoKTtzZWxmLmxpc3RlbkZvclN0YXR1cyhtZXNzYWdlPT57dGhpcy5zdGF0dXNVcGRhdGUobWVzc2FnZVsxXSk7fSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXz0+c2VsZi5ydW5MaWdodGhvdXNlSW5Xb3JrZXIodGhpcyxwYXJhbXMudXJsLHtmbGFnczpwYXJhbXMuZmxhZ3N9LHBhcmFtcy5jYXRlZ29yeUlEcykpLnRoZW4ocmVzdWx0PT57cmV0dXJuIHJlc3VsdDt9KS5jYXRjaChlcnI9Pih7ZmF0YWw6dHJ1ZSxtZXNzYWdlOmVyci5tZXNzYWdlLHN0YWNrOmVyci5zdGFjayx9KSk7fQpzdG9wKCl7dGhpcy5jbG9zZSgpO3JldHVybiBQcm9taXNlLnJlc29sdmUoKTt9CmRpc3BhdGNoUHJvdG9jb2xNZXNzYWdlKHBhcmFtcyl7dGhpcy5fb25NZXNzYWdlKHBhcmFtc1snbWVzc2FnZSddKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7fQpkaXNwb3NlKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO30Kc3RhdHVzVXBkYXRlKG1lc3NhZ2Upe3RoaXMuX25vdGlmeSgnc3RhdHVzVXBkYXRlJyx7bWVzc2FnZTptZXNzYWdlfSk7fQpzZW5kKG1lc3NhZ2Upe3RoaXMuX25vdGlmeSgnc2VuZFByb3RvY29sTWVzc2FnZScse21lc3NhZ2U6bWVzc2FnZX0pO30KY2xvc2UoKXt9Cm9uKGV2ZW50TmFtZSxjYil7aWYoZXZlbnROYW1lPT09J21lc3NhZ2UnKQp0aGlzLl9vbk1lc3NhZ2U9Y2I7aWYoZXZlbnROYW1lPT09J2Nsb3NlJykKdGhpcy5fb25DbG9zZT1jYjt9Cl9kaXNhYmxlTG9nZ2luZ0ZvclRlc3QoKXtjb25zb2xlLmxvZz0oKT0+dW5kZWZpbmVkO319O2dsb2JhbD1zZWxmO2dsb2JhbC5pc1Zpbm49dHJ1ZTtnbG9iYWwuZG9jdW1lbnQ9e307Z2xvYmFsLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudD17fTtnbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlPXtXZWJraXRBcHBlYXJhbmNlOidXZWJraXRBcHBlYXJhbmNlJ307O0NtTW9kZXMuRGVmYXVsdENvZGVNaXJyb3JNaW1lTW9kZT1mdW5jdGlvbigpCnt9CkNtTW9kZXMuRGVmYXVsdENvZGVNaXJyb3JNaW1lTW9kZS5wcm90b3R5cGU9e2luc3RhbGw6ZnVuY3Rpb24oZXh0ZW5zaW9uKQp7dmFyIG1vZGVGaWxlTmFtZT1leHRlbnNpb24uZGVzY3JpcHRvcigpWyJmaWxlTmFtZSJdO3ZhciBtb2RlQ29udGVudD1leHRlbnNpb24ubW9kdWxlKCkucmVzb3VyY2UobW9kZUZpbGVOYW1lKTtzZWxmLmV2YWwobW9kZUNvbnRlbnQrIlxuLy8jIHNvdXJjZVVSTD0iK21vZGVGaWxlTmFtZSk7fX07UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNtX21vZGVzL2NsaWtlLmpzIl09Ii8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGluZm8sIGFsaWduLCBwcmV2KSB7XG4gIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDtcbiAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuaW5mbyA9IGluZm87XG4gIHRoaXMuYWxpZ24gPSBhbGlnbjtcbiAgdGhpcy5wcmV2ID0gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUsIGluZm8pIHtcbiAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudGVkO1xuICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiB0eXBlICE9IFwic3RhdGVtZW50XCIpXG4gICAgaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDtcbiAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgaW5mbywgbnVsbCwgc3RhdGUuY29udGV4dCk7XG59XG5mdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7XG4gIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlO1xuICBpZiAodCA9PSBcIilcIiB8fCB0ID09IFwiXVwiIHx8IHQgPT0gXCJ9XCIpXG4gICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkO1xuICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbn1cblxuZnVuY3Rpb24gdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBwb3MpIHtcbiAgaWYgKHN0YXRlLnByZXZUb2tlbiA9PSBcInZhcmlhYmxlXCIgfHwgc3RhdGUucHJldlRva2VuID09IFwidHlwZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXFMoPzpbXi0gXT58WypcXF1dKVxccyokfFxcKiQvLnRlc3Qoc3RyZWFtLnN0cmluZy5zbGljZSgwLCBwb3MpKSkgcmV0dXJuIHRydWU7XG4gIGlmIChzdGF0ZS50eXBlQXRFbmRPZkxpbmUgJiYgc3RyZWFtLmNvbHVtbigpID09IHN0cmVhbS5pbmRlbnRhdGlvbigpKSByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNUb3BTY29wZShjb250ZXh0KSB7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC50eXBlID09IFwidG9wXCIpIHJldHVybiB0cnVlO1xuICAgIGlmIChjb250ZXh0LnR5cGUgPT0gXCJ9XCIgJiYgY29udGV4dC5wcmV2LmluZm8gIT0gXCJuYW1lc3BhY2VcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7XG4gIH1cbn1cblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY2xpa2VcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCxcbiAgICAgIHN0YXRlbWVudEluZGVudFVuaXQgPSBwYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50VW5pdCB8fCBpbmRlbnRVbml0LFxuICAgICAgZG9udEFsaWduQ2FsbHMgPSBwYXJzZXJDb25maWcuZG9udEFsaWduQ2FsbHMsXG4gICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSxcbiAgICAgIHR5cGVzID0gcGFyc2VyQ29uZmlnLnR5cGVzIHx8IHt9LFxuICAgICAgYnVpbHRpbiA9IHBhcnNlckNvbmZpZy5idWlsdGluIHx8IHt9LFxuICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LFxuICAgICAgZGVmS2V5d29yZHMgPSBwYXJzZXJDb25maWcuZGVmS2V5d29yZHMgfHwge30sXG4gICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSxcbiAgICAgIGhvb2tzID0gcGFyc2VyQ29uZmlnLmhvb2tzIHx8IHt9LFxuICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzLFxuICAgICAgaW5kZW50U3RhdGVtZW50cyA9IHBhcnNlckNvbmZpZy5pbmRlbnRTdGF0ZW1lbnRzICE9PSBmYWxzZSxcbiAgICAgIGluZGVudFN3aXRjaCA9IHBhcnNlckNvbmZpZy5pbmRlbnRTd2l0Y2ggIT09IGZhbHNlLFxuICAgICAgbmFtZXNwYWNlU2VwYXJhdG9yID0gcGFyc2VyQ29uZmlnLm5hbWVzcGFjZVNlcGFyYXRvcixcbiAgICAgIGlzUHVuY3R1YXRpb25DaGFyID0gcGFyc2VyQ29uZmlnLmlzUHVuY3R1YXRpb25DaGFyIHx8IC9bXFxbXFxde31cXChcXCksO1xcOlxcLl0vLFxuICAgICAgbnVtYmVyU3RhcnQgPSBwYXJzZXJDb25maWcubnVtYmVyU3RhcnQgfHwgL1tcXGRcXC5dLyxcbiAgICAgIG51bWJlciA9IHBhcnNlckNvbmZpZy5udW1iZXIgfHwgL14oPzoweFthLWZcXGRdK3wwYlswMV0rfCg/OlxcZCtcXC4/XFxkKnxcXC5cXGQrKSg/OmVbLStdP1xcZCspPykodXxsbD98bHxmKT8vaSxcbiAgICAgIGlzT3BlcmF0b3JDaGFyID0gcGFyc2VyQ29uZmlnLmlzT3BlcmF0b3JDaGFyIHx8IC9bK1xcLSomJT08PiE/fFxcL10vLFxuICAgICAgaXNJZGVudGlmaWVyQ2hhciA9IHBhcnNlckNvbmZpZy5pc0lkZW50aWZpZXJDaGFyIHx8IC9bXFx3XFwkX1xceGExLVxcdWZmZmZdLztcblxuICB2YXIgY3VyUHVuYywgaXNEZWZLZXl3b3JkO1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoaG9va3NbY2hdKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChjaCA9PSAnXCInIHx8IGNoID09IFwiJ1wiKSB7XG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTtcbiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGlzUHVuY3R1YXRpb25DaGFyLnRlc3QoY2gpKSB7XG4gICAgICBjdXJQdW5jID0gY2g7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKG51bWJlclN0YXJ0LnRlc3QoY2gpKSB7XG4gICAgICBzdHJlYW0uYmFja1VwKDEpXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKG51bWJlcikpIHJldHVybiBcIm51bWJlclwiXG4gICAgICBzdHJlYW0ubmV4dCgpXG4gICAgfVxuICAgIGlmIChjaCA9PSBcIi9cIikge1xuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50O1xuICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5lYXQoXCIvXCIpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHtcbiAgICAgIHdoaWxlICghc3RyZWFtLm1hdGNoKC9eXFwvW1xcLypdLywgZmFsc2UpICYmIHN0cmVhbS5lYXQoaXNPcGVyYXRvckNoYXIpKSB7fVxuICAgICAgcmV0dXJuIFwib3BlcmF0b3JcIjtcbiAgICB9XG4gICAgc3RyZWFtLmVhdFdoaWxlKGlzSWRlbnRpZmllckNoYXIpO1xuICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpIHdoaWxlIChzdHJlYW0ubWF0Y2gobmFtZXNwYWNlU2VwYXJhdG9yKSlcbiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc0lkZW50aWZpZXJDaGFyKTtcblxuICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpO1xuICAgIGlmIChjb250YWlucyhrZXl3b3JkcywgY3VyKSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGJsb2NrS2V5d29yZHMsIGN1cikpIGN1clB1bmMgPSBcIm5ld3N0YXRlbWVudFwiO1xuICAgICAgaWYgKGNvbnRhaW5zKGRlZktleXdvcmRzLCBjdXIpKSBpc0RlZktleXdvcmQgPSB0cnVlO1xuICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgIH1cbiAgICBpZiAoY29udGFpbnModHlwZXMsIGN1cikpIHJldHVybiBcInR5cGVcIjtcbiAgICBpZiAoY29udGFpbnMoYnVpbHRpbiwgY3VyKSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGJsb2NrS2V5d29yZHMsIGN1cikpIGN1clB1bmMgPSBcIm5ld3N0YXRlbWVudFwiO1xuICAgICAgcmV0dXJuIFwiYnVpbHRpblwiO1xuICAgIH1cbiAgICBpZiAoY29udGFpbnMoYXRvbXMsIGN1cikpIHJldHVybiBcImF0b21cIjtcbiAgICByZXR1cm4gXCJ2YXJpYWJsZVwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7XG4gICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fVxuICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKVxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7XG4gICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkge1xuICAgICAgaWYgKGNoID09IFwiL1wiICYmIG1heWJlRW5kKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgfVxuICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1heWJlRU9MKHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAocGFyc2VyQ29uZmlnLnR5cGVGaXJzdERlZmluaXRpb25zICYmIHN0cmVhbS5lb2woKSAmJiBpc1RvcFNjb3BlKHN0YXRlLmNvbnRleHQpKVxuICAgICAgc3RhdGUudHlwZUF0RW5kT2ZMaW5lID0gdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBzdHJlYW0ucG9zKVxuICB9XG5cbiAgLy8gSW50ZXJmYWNlXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbml6ZTogbnVsbCxcbiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCBcInRvcFwiLCBudWxsLCBmYWxzZSksXG4gICAgICAgIGluZGVudGVkOiAwLFxuICAgICAgICBzdGFydE9mTGluZTogdHJ1ZSxcbiAgICAgICAgcHJldlRva2VuOiBudWxsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7XG4gICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7XG4gICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7XG4gICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgeyBtYXliZUVPTChzdHJlYW0sIHN0YXRlKTsgcmV0dXJuIG51bGw7IH1cbiAgICAgIGN1clB1bmMgPSBpc0RlZktleXdvcmQgPSBudWxsO1xuICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBpZiAoc3R5bGUgPT0gXCJjb21tZW50XCIgfHwgc3R5bGUgPT0gXCJtZXRhXCIpIHJldHVybiBzdHlsZTtcbiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTtcblxuICAgICAgaWYgKGN1clB1bmMgPT0gXCI7XCIgfHwgY3VyUHVuYyA9PSBcIjpcIiB8fCAoY3VyUHVuYyA9PSBcIixcIiAmJiBzdHJlYW0ubWF0Y2goL15cXHMqKD86XFwvXFwvLiopPyQvLCBmYWxzZSkpKVxuICAgICAgICB3aGlsZSAoc3RhdGUuY29udGV4dC50eXBlID09IFwic3RhdGVtZW50XCIpIHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBcIntcIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgXCJ9XCIpO1xuICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBcIltcIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgXCJdXCIpO1xuICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBcIihcIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgXCIpXCIpO1xuICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBcIn1cIikge1xuICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgICAgIGlmIChjdHgudHlwZSA9PSBcIn1cIikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSBcInN0YXRlbWVudFwiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpO1xuICAgICAgZWxzZSBpZiAoaW5kZW50U3RhdGVtZW50cyAmJlxuICAgICAgICAgICAgICAgKCgoY3R4LnR5cGUgPT0gXCJ9XCIgfHwgY3R4LnR5cGUgPT0gXCJ0b3BcIikgJiYgY3VyUHVuYyAhPSBcIjtcIikgfHxcbiAgICAgICAgICAgICAgICAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiBjdXJQdW5jID09IFwibmV3c3RhdGVtZW50XCIpKSkge1xuICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCBcInN0YXRlbWVudFwiLCBzdHJlYW0uY3VycmVudCgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlID09IFwidmFyaWFibGVcIiAmJlxuICAgICAgICAgICgoc3RhdGUucHJldlRva2VuID09IFwiZGVmXCIgfHxcbiAgICAgICAgICAgIChwYXJzZXJDb25maWcudHlwZUZpcnN0RGVmaW5pdGlvbnMgJiYgdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBzdHJlYW0uc3RhcnQpICYmXG4gICAgICAgICAgICAgaXNUb3BTY29wZShzdGF0ZS5jb250ZXh0KSAmJiBzdHJlYW0ubWF0Y2goL15cXHMqXFwoLywgZmFsc2UpKSkpKVxuICAgICAgICBzdHlsZSA9IFwiZGVmXCI7XG5cbiAgICAgIGlmIChob29rcy50b2tlbikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaG9va3MudG9rZW4oc3RyZWFtLCBzdGF0ZSwgc3R5bGUpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHN0eWxlID0gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3R5bGUgPT0gXCJkZWZcIiAmJiBwYXJzZXJDb25maWcuc3R5bGVEZWZzID09PSBmYWxzZSkgc3R5bGUgPSBcInZhcmlhYmxlXCI7XG5cbiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7XG4gICAgICBzdGF0ZS5wcmV2VG9rZW4gPSBpc0RlZktleXdvcmQgPyBcImRlZlwiIDogc3R5bGUgfHwgY3VyUHVuYztcbiAgICAgIG1heWJlRU9MKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHtcbiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCB8fCBzdGF0ZS50eXBlQXRFbmRPZkxpbmUpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7XG4gICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCJzdGF0ZW1lbnRcIiAmJiBmaXJzdENoYXIgPT0gXCJ9XCIpIGN0eCA9IGN0eC5wcmV2O1xuICAgICAgaWYgKHBhcnNlckNvbmZpZy5kb250SW5kZW50U3RhdGVtZW50cylcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09IFwic3RhdGVtZW50XCIgJiYgcGFyc2VyQ29uZmlnLmRvbnRJbmRlbnRTdGF0ZW1lbnRzLnRlc3QoY3R4LmluZm8pKVxuICAgICAgICAgIGN0eCA9IGN0eC5wcmV2XG4gICAgICBpZiAoaG9va3MuaW5kZW50KSB7XG4gICAgICAgIHZhciBob29rID0gaG9va3MuaW5kZW50KHN0YXRlLCBjdHgsIHRleHRBZnRlcik7XG4gICAgICAgIGlmICh0eXBlb2YgaG9vayA9PSBcIm51bWJlclwiKSByZXR1cm4gaG9va1xuICAgICAgfVxuICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7XG4gICAgICB2YXIgc3dpdGNoQmxvY2sgPSBjdHgucHJldiAmJiBjdHgucHJldi5pbmZvID09IFwic3dpdGNoXCI7XG4gICAgICBpZiAocGFyc2VyQ29uZmlnLmFsbG1hbkluZGVudGF0aW9uICYmIC9beyhdLy50ZXN0KGZpcnN0Q2hhcikpIHtcbiAgICAgICAgd2hpbGUgKGN0eC50eXBlICE9IFwidG9wXCIgJiYgY3R4LnR5cGUgIT0gXCJ9XCIpIGN0eCA9IGN0eC5wcmV2XG4gICAgICAgIHJldHVybiBjdHguaW5kZW50ZWRcbiAgICAgIH1cbiAgICAgIGlmIChjdHgudHlwZSA9PSBcInN0YXRlbWVudFwiKVxuICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSBcIntcIiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTtcbiAgICAgIGlmIChjdHguYWxpZ24gJiYgKCFkb250QWxpZ25DYWxscyB8fCBjdHgudHlwZSAhPSBcIilcIikpXG4gICAgICAgIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7XG4gICAgICBpZiAoY3R4LnR5cGUgPT0gXCIpXCIgJiYgIWNsb3NpbmcpXG4gICAgICAgIHJldHVybiBjdHguaW5kZW50ZWQgKyBzdGF0ZW1lbnRJbmRlbnRVbml0O1xuXG4gICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCkgK1xuICAgICAgICAoIWNsb3NpbmcgJiYgc3dpdGNoQmxvY2sgJiYgIS9eKD86Y2FzZXxkZWZhdWx0KVxcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDApO1xuICAgIH0sXG5cbiAgICBlbGVjdHJpY0lucHV0OiBpbmRlbnRTd2l0Y2ggPyAvXlxccyooPzpjYXNlIC4qPzp8ZGVmYXVsdDp8XFx7XFx9P3xcXH0pJC8gOiAvXlxccypbe31dJC8sXG4gICAgYmxvY2tDb21tZW50U3RhcnQ6IFwiLypcIixcbiAgICBibG9ja0NvbW1lbnRFbmQ6IFwiKi9cIixcbiAgICBibG9ja0NvbW1lbnRDb250aW51ZTogXCIgKiBcIixcbiAgICBsaW5lQ29tbWVudDogXCIvL1wiLFxuICAgIGZvbGQ6IFwiYnJhY2VcIlxuICB9O1xufSk7XG5cbiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7XG4gICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdChcIiBcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBmdW5jdGlvbiBjb250YWlucyh3b3Jkcywgd29yZCkge1xuICAgIGlmICh0eXBlb2Ygd29yZHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHdvcmRzKHdvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCk7XG4gICAgfVxuICB9XG4gIHZhciBjS2V5d29yZHMgPSBcImF1dG8gaWYgYnJlYWsgY2FzZSByZWdpc3RlciBjb250aW51ZSByZXR1cm4gZGVmYXVsdCBkbyBzaXplb2YgXCIgK1xuICAgIFwic3RhdGljIGVsc2Ugc3RydWN0IHN3aXRjaCBleHRlcm4gdHlwZWRlZiB1bmlvbiBmb3IgZ290byB3aGlsZSBlbnVtIGNvbnN0IHZvbGF0aWxlXCI7XG4gIHZhciBjVHlwZXMgPSBcImludCBsb25nIGNoYXIgc2hvcnQgZG91YmxlIGZsb2F0IHVuc2lnbmVkIHNpZ25lZCB2b2lkIHNpemVfdCBwdHJkaWZmX3RcIjtcblxuICBmdW5jdGlvbiBjcHBIb29rKHN0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLnN0YXJ0T2ZMaW5lKSByZXR1cm4gZmFsc2VcbiAgICBmb3IgKHZhciBjaCwgbmV4dCA9IG51bGw7IGNoID0gc3RyZWFtLnBlZWsoKTspIHtcbiAgICAgIGlmIChjaCA9PSBcIlxcXFxcIiAmJiBzdHJlYW0ubWF0Y2goL14uJC8pKSB7XG4gICAgICAgIG5leHQgPSBjcHBIb29rXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKGNoID09IFwiL1wiICYmIHN0cmVhbS5tYXRjaCgvXlxcL1tcXC9cXCpdLywgZmFsc2UpKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzdHJlYW0ubmV4dCgpXG4gICAgfVxuICAgIHN0YXRlLnRva2VuaXplID0gbmV4dFxuICAgIHJldHVybiBcIm1ldGFcIlxuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnRlckhvb2soX3N0cmVhbSwgc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUucHJldlRva2VuID09IFwidHlwZVwiKSByZXR1cm4gXCJ0eXBlXCI7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3BwMTRMaXRlcmFsKHN0cmVhbSkge1xuICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcLiddLyk7XG4gICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gIH1cblxuICBmdW5jdGlvbiBjcHAxMVN0cmluZ0hvb2soc3RyZWFtLCBzdGF0ZSkge1xuICAgIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgLy8gUmF3IHN0cmluZ3MuXG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvKFJ8dThSfHVSfFVSfExSKS8pKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBzdHJlYW0ubWF0Y2goL1wiKFteXFxzXFxcXCgpXXswLDE2fSlcXCgvKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhdGUuY3BwMTFSYXdTdHJpbmdEZWxpbSA9IG1hdGNoWzFdO1xuICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblJhd1N0cmluZztcbiAgICAgIHJldHVybiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gVW5pY29kZSBzdHJpbmdzL2NoYXJzLlxuICAgIGlmIChzdHJlYW0ubWF0Y2goLyh1OHx1fFV8TCkvKSkge1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvW1wiJ10vLCAvKiBlYXQgKi8gZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBJZ25vcmUgdGhpcyBob29rLlxuICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3BwTG9va3NMaWtlQ29uc3RydWN0b3Iod29yZCkge1xuICAgIHZhciBsYXN0VHdvID0gLyhcXHcrKTo6fj8oXFx3KykkLy5leGVjKHdvcmQpO1xuICAgIHJldHVybiBsYXN0VHdvICYmIGxhc3RUd29bMV0gPT0gbGFzdFR3b1syXTtcbiAgfVxuXG4gIC8vIEMjLXN0eWxlIHN0cmluZ3Mgd2hlcmUgXCJcIiBlc2NhcGVzIGEgcXVvdGUuXG4gIGZ1bmN0aW9uIHRva2VuQXRTdHJpbmcoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBuZXh0O1xuICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHtcbiAgICAgIGlmIChuZXh0ID09ICdcIicgJiYgIXN0cmVhbS5lYXQoJ1wiJykpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cblxuICAvLyBDKysxMSByYXcgc3RyaW5nIGxpdGVyYWwgaXMgPHByZWZpeD5cIjxkZWxpbT4oIGFueXRoaW5nICk8ZGVsaW0+XCIsIHdoZXJlXG4gIC8vIDxkZWxpbT4gY2FuIGJlIGEgc3RyaW5nIHVwIHRvIDE2IGNoYXJhY3RlcnMgbG9uZy5cbiAgZnVuY3Rpb24gdG9rZW5SYXdTdHJpbmcoc3RyZWFtLCBzdGF0ZSkge1xuICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBzcGVjaWFsIHJlZ2V4IG1lYW5pbmdzLlxuICAgIHZhciBkZWxpbSA9IHN0YXRlLmNwcDExUmF3U3RyaW5nRGVsaW0ucmVwbGFjZSgvW15cXHdcXHNdL2csICdcXFxcJCYnKTtcbiAgICB2YXIgbWF0Y2ggPSBzdHJlYW0ubWF0Y2gobmV3IFJlZ0V4cChcIi4qP1xcXFwpXCIgKyBkZWxpbSArICdcIicpKTtcbiAgICBpZiAobWF0Y2gpXG4gICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgZWxzZVxuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmKG1pbWVzLCBtb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBtaW1lcyA9PSBcInN0cmluZ1wiKSBtaW1lcyA9IFttaW1lc107XG4gICAgdmFyIHdvcmRzID0gW107XG4gICAgZnVuY3Rpb24gYWRkKG9iaikge1xuICAgICAgaWYgKG9iaikgZm9yICh2YXIgcHJvcCBpbiBvYmopIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpXG4gICAgICAgIHdvcmRzLnB1c2gocHJvcCk7XG4gICAgfVxuICAgIGFkZChtb2RlLmtleXdvcmRzKTtcbiAgICBhZGQobW9kZS50eXBlcyk7XG4gICAgYWRkKG1vZGUuYnVpbHRpbik7XG4gICAgYWRkKG1vZGUuYXRvbXMpO1xuICAgIGlmICh3b3Jkcy5sZW5ndGgpIHtcbiAgICAgIG1vZGUuaGVscGVyVHlwZSA9IG1pbWVzWzBdO1xuICAgICAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcImhpbnRXb3Jkc1wiLCBtaW1lc1swXSwgd29yZHMpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWltZXMubGVuZ3RoOyArK2kpXG4gICAgICBDb2RlTWlycm9yLmRlZmluZU1JTUUobWltZXNbaV0sIG1vZGUpO1xuICB9XG5cbiAgZGVmKFtcInRleHQveC1jc3JjXCIsIFwidGV4dC94LWNcIiwgXCJ0ZXh0L3gtY2hkclwiXSwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzKSxcbiAgICB0eXBlczogd29yZHMoY1R5cGVzICsgXCIgYm9vbCBfQ29tcGxleCBfQm9vbCBmbG9hdF90IGRvdWJsZV90IGludHB0cl90IGludG1heF90IFwiICtcbiAgICAgICAgICAgICAgICAgXCJpbnQ4X3QgaW50MTZfdCBpbnQzMl90IGludDY0X3QgdWludHB0cl90IHVpbnRtYXhfdCB1aW50OF90IHVpbnQxNl90IFwiICtcbiAgICAgICAgICAgICAgICAgXCJ1aW50MzJfdCB1aW50NjRfdFwiKSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhc2UgZG8gZWxzZSBmb3IgaWYgc3dpdGNoIHdoaWxlIHN0cnVjdFwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJzdHJ1Y3RcIiksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwibnVsbCB0cnVlIGZhbHNlXCIpLFxuICAgIGhvb2tzOiB7XCIjXCI6IGNwcEhvb2ssIFwiKlwiOiBwb2ludGVySG9va30sXG4gICAgbW9kZVByb3BzOiB7Zm9sZDogW1wiYnJhY2VcIiwgXCJpbmNsdWRlXCJdfVxuICB9KTtcblxuICBkZWYoW1widGV4dC94LWMrK3NyY1wiLCBcInRleHQveC1jKytoZHJcIl0sIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiIGFzbSBkeW5hbWljX2Nhc3QgbmFtZXNwYWNlIHJlaW50ZXJwcmV0X2Nhc3QgdHJ5IGV4cGxpY2l0IG5ldyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljX2Nhc3QgdHlwZWlkIGNhdGNoIG9wZXJhdG9yIHRlbXBsYXRlIHR5cGVuYW1lIGNsYXNzIGZyaWVuZCBwcml2YXRlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0aGlzIHVzaW5nIGNvbnN0X2Nhc3QgaW5saW5lIHB1YmxpYyB0aHJvdyB2aXJ0dWFsIGRlbGV0ZSBtdXRhYmxlIHByb3RlY3RlZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiYWxpZ25hcyBhbGlnbm9mIGNvbnN0ZXhwciBkZWNsdHlwZSBudWxscHRyIG5vZXhjZXB0IHRocmVhZF9sb2NhbCBmaW5hbCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdGljX2Fzc2VydCBvdmVycmlkZVwiKSxcbiAgICB0eXBlczogd29yZHMoY1R5cGVzICsgXCIgYm9vbCB3Y2hhcl90XCIpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiBzdHJ1Y3Qgc3dpdGNoIHRyeSB3aGlsZVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJjbGFzcyBuYW1lc3BhY2Ugc3RydWN0IGVudW0gdW5pb25cIiksXG4gICAgdHlwZUZpcnN0RGVmaW5pdGlvbnM6IHRydWUsXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBudWxsXCIpLFxuICAgIGRvbnRJbmRlbnRTdGF0ZW1lbnRzOiAvXnRlbXBsYXRlJC8sXG4gICAgaXNJZGVudGlmaWVyQ2hhcjogL1tcXHdcXCRfflxceGExLVxcdWZmZmZdLyxcbiAgICBob29rczoge1xuICAgICAgXCIjXCI6IGNwcEhvb2ssXG4gICAgICBcIipcIjogcG9pbnRlckhvb2ssXG4gICAgICBcInVcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCJVXCI6IGNwcDExU3RyaW5nSG9vayxcbiAgICAgIFwiTFwiOiBjcHAxMVN0cmluZ0hvb2ssXG4gICAgICBcIlJcIjogY3BwMTFTdHJpbmdIb29rLFxuICAgICAgXCIwXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiMVwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjJcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCIzXCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiNFwiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjVcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI2XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIFwiN1wiOiBjcHAxNExpdGVyYWwsXG4gICAgICBcIjhcIjogY3BwMTRMaXRlcmFsLFxuICAgICAgXCI5XCI6IGNwcDE0TGl0ZXJhbCxcbiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlLCBzdHlsZSkge1xuICAgICAgICBpZiAoc3R5bGUgPT0gXCJ2YXJpYWJsZVwiICYmIHN0cmVhbS5wZWVrKCkgPT0gXCIoXCIgJiZcbiAgICAgICAgICAgIChzdGF0ZS5wcmV2VG9rZW4gPT0gXCI7XCIgfHwgc3RhdGUucHJldlRva2VuID09IG51bGwgfHxcbiAgICAgICAgICAgICBzdGF0ZS5wcmV2VG9rZW4gPT0gXCJ9XCIpICYmXG4gICAgICAgICAgICBjcHBMb29rc0xpa2VDb25zdHJ1Y3RvcihzdHJlYW0uY3VycmVudCgpKSlcbiAgICAgICAgICByZXR1cm4gXCJkZWZcIjtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWVzcGFjZVNlcGFyYXRvcjogXCI6OlwiLFxuICAgIG1vZGVQcm9wczoge2ZvbGQ6IFtcImJyYWNlXCIsIFwiaW5jbHVkZVwiXX1cbiAgfSk7XG5cbiAgZGVmKFwidGV4dC94LWphdmFcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXCJhYnN0cmFjdCBhc3NlcnQgYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjb25zdCBjb250aW51ZSBkZWZhdWx0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJkbyBlbHNlIGVudW0gZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZsb2F0IGZvciBnb3RvIGlmIGltcGxlbWVudHMgaW1wb3J0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJpbnN0YW5jZW9mIGludGVyZmFjZSBuYXRpdmUgbmV3IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm4gc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhpcyB0aHJvdyB0aHJvd3MgdHJhbnNpZW50IFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0cnkgdm9sYXRpbGUgd2hpbGUgQGludGVyZmFjZVwiKSxcbiAgICB0eXBlczogd29yZHMoXCJieXRlIHNob3J0IGludCBsb25nIGZsb2F0IGRvdWJsZSBib29sZWFuIGNoYXIgdm9pZCBCb29sZWFuIEJ5dGUgQ2hhcmFjdGVyIERvdWJsZSBGbG9hdCBcIiArXG4gICAgICAgICAgICAgICAgIFwiSW50ZWdlciBMb25nIE51bWJlciBPYmplY3QgU2hvcnQgU3RyaW5nIFN0cmluZ0J1ZmZlciBTdHJpbmdCdWlsZGVyIFZvaWRcIiksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHN3aXRjaCB0cnkgd2hpbGVcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgaW50ZXJmYWNlIGVudW0gQGludGVyZmFjZVwiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgbnVtYmVyOiAvXig/OjB4W2EtZlxcZF9dK3wwYlswMV9dK3woPzpbXFxkX10rXFwuP1xcZCp8XFwuXFxkKykoPzplWy0rXT9bXFxkX10rKT8pKHV8bGw/fGx8Zik/L2ksXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgLy8gRG9uJ3QgbWF0Y2ggdGhlIEBpbnRlcmZhY2Uga2V5d29yZC5cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnaW50ZXJmYWNlJywgZmFsc2UpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX10vKTtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Zm9sZDogW1wiYnJhY2VcIiwgXCJpbXBvcnRcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1jc2hhcnBcIiwge1xuICAgIG5hbWU6IFwiY2xpa2VcIixcbiAgICBrZXl3b3Jkczogd29yZHMoXCJhYnN0cmFjdCBhcyBhc3luYyBhd2FpdCBiYXNlIGJyZWFrIGNhc2UgY2F0Y2ggY2hlY2tlZCBjbGFzcyBjb25zdCBjb250aW51ZVwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgZGVmYXVsdCBkZWxlZ2F0ZSBkbyBlbHNlIGVudW0gZXZlbnQgZXhwbGljaXQgZXh0ZXJuIGZpbmFsbHkgZml4ZWQgZm9yXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBmb3JlYWNoIGdvdG8gaWYgaW1wbGljaXQgaW4gaW50ZXJmYWNlIGludGVybmFsIGlzIGxvY2sgbmFtZXNwYWNlIG5ld1wiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgb3BlcmF0b3Igb3V0IG92ZXJyaWRlIHBhcmFtcyBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgcmVhZG9ubHkgcmVmIHJldHVybiBzZWFsZWRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHNpemVvZiBzdGFja2FsbG9jIHN0YXRpYyBzdHJ1Y3Qgc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHR5cGVvZiB1bmNoZWNrZWRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIHVuc2FmZSB1c2luZyB2aXJ0dWFsIHZvaWQgdm9sYXRpbGUgd2hpbGUgYWRkIGFsaWFzIGFzY2VuZGluZyBkZXNjZW5kaW5nIGR5bmFtaWMgZnJvbSBnZXRcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIGdsb2JhbCBncm91cCBpbnRvIGpvaW4gbGV0IG9yZGVyYnkgcGFydGlhbCByZW1vdmUgc2VsZWN0IHNldCB2YWx1ZSB2YXIgeWllbGRcIiksXG4gICAgdHlwZXM6IHdvcmRzKFwiQWN0aW9uIEJvb2xlYW4gQnl0ZSBDaGFyIERhdGVUaW1lIERhdGVUaW1lT2Zmc2V0IERlY2ltYWwgRG91YmxlIEZ1bmNcIiArXG4gICAgICAgICAgICAgICAgIFwiIEd1aWQgSW50MTYgSW50MzIgSW50NjQgT2JqZWN0IFNCeXRlIFNpbmdsZSBTdHJpbmcgVGFzayBUaW1lU3BhbiBVSW50MTYgVUludDMyXCIgK1xuICAgICAgICAgICAgICAgICBcIiBVSW50NjQgYm9vbCBieXRlIGNoYXIgZGVjaW1hbCBkb3VibGUgc2hvcnQgaW50IGxvbmcgb2JqZWN0XCIgICtcbiAgICAgICAgICAgICAgICAgXCIgc2J5dGUgZmxvYXQgc3RyaW5nIHVzaG9ydCB1aW50IHVsb25nXCIpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JlYWNoIGlmIHN0cnVjdCBzd2l0Y2ggdHJ5IHdoaWxlXCIpLFxuICAgIGRlZktleXdvcmRzOiB3b3JkcyhcImNsYXNzIGludGVyZmFjZSBuYW1lc3BhY2Ugc3RydWN0IHZhclwiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgaG9va3M6IHtcbiAgICAgIFwiQFwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KCdcIicpKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkF0U3RyaW5nO1xuICAgICAgICAgIHJldHVybiB0b2tlbkF0U3RyaW5nKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHRva2VuVHJpcGxlU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdcIlwiXCInKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZXNjYXBlZCA9IHN0cmVhbS5uZXh0KCkgPT0gXCJcXFxcXCIgJiYgIWVzY2FwZWQ7XG4gICAgfVxuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG5cbiAgZGVmKFwidGV4dC94LXNjYWxhXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFxuXG4gICAgICAvKiBzY2FsYSAqL1xuICAgICAgXCJhYnN0cmFjdCBjYXNlIGNhdGNoIGNsYXNzIGRlZiBkbyBlbHNlIGV4dGVuZHMgZmluYWwgZmluYWxseSBmb3IgZm9yU29tZSBpZiBcIiArXG4gICAgICBcImltcGxpY2l0IGltcG9ydCBsYXp5IG1hdGNoIG5ldyBudWxsIG9iamVjdCBvdmVycmlkZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHJldHVybiBcIiArXG4gICAgICBcInNlYWxlZCBzdXBlciB0aGlzIHRocm93IHRyYWl0IHRyeSB0eXBlIHZhbCB2YXIgd2hpbGUgd2l0aCB5aWVsZCBfIFwiICtcblxuICAgICAgLyogcGFja2FnZSBzY2FsYSAqL1xuICAgICAgXCJhc3NlcnQgYXNzdW1lIHJlcXVpcmUgcHJpbnQgcHJpbnRsbiBwcmludGYgcmVhZExpbmUgcmVhZEJvb2xlYW4gcmVhZEJ5dGUgcmVhZFNob3J0IFwiICtcbiAgICAgIFwicmVhZENoYXIgcmVhZEludCByZWFkTG9uZyByZWFkRmxvYXQgcmVhZERvdWJsZVwiXG4gICAgKSxcbiAgICB0eXBlczogd29yZHMoXG4gICAgICBcIkFueVZhbCBBcHAgQXBwbGljYXRpb24gQXJyYXkgQnVmZmVyZWRJdGVyYXRvciBCaWdEZWNpbWFsIEJpZ0ludCBDaGFyIENvbnNvbGUgRWl0aGVyIFwiICtcbiAgICAgIFwiRW51bWVyYXRpb24gRXF1aXYgRXJyb3IgRXhjZXB0aW9uIEZyYWN0aW9uYWwgRnVuY3Rpb24gSW5kZXhlZFNlcSBJbnQgSW50ZWdyYWwgSXRlcmFibGUgXCIgK1xuICAgICAgXCJJdGVyYXRvciBMaXN0IE1hcCBOdW1lcmljIE5pbCBOb3ROdWxsIE9wdGlvbiBPcmRlcmVkIE9yZGVyaW5nIFBhcnRpYWxGdW5jdGlvbiBQYXJ0aWFsT3JkZXJpbmcgXCIgK1xuICAgICAgXCJQcm9kdWN0IFByb3h5IFJhbmdlIFJlc3BvbmRlciBTZXEgU2VyaWFsaXphYmxlIFNldCBTcGVjaWFsaXphYmxlIFN0cmVhbSBTdHJpbmdCdWlsZGVyIFwiICtcbiAgICAgIFwiU3RyaW5nQ29udGV4dCBTeW1ib2wgVGhyb3dhYmxlIFRyYXZlcnNhYmxlIFRyYXZlcnNhYmxlT25jZSBUdXBsZSBVbml0IFZlY3RvciBcIiArXG5cbiAgICAgIC8qIHBhY2thZ2UgamF2YS5sYW5nICovXG4gICAgICBcIkJvb2xlYW4gQnl0ZSBDaGFyYWN0ZXIgQ2hhclNlcXVlbmNlIENsYXNzIENsYXNzTG9hZGVyIENsb25lYWJsZSBDb21wYXJhYmxlIFwiICtcbiAgICAgIFwiQ29tcGlsZXIgRG91YmxlIEV4Y2VwdGlvbiBGbG9hdCBJbnRlZ2VyIExvbmcgTWF0aCBOdW1iZXIgT2JqZWN0IFBhY2thZ2UgUGFpciBQcm9jZXNzIFwiICtcbiAgICAgIFwiUnVudGltZSBSdW5uYWJsZSBTZWN1cml0eU1hbmFnZXIgU2hvcnQgU3RhY2tUcmFjZUVsZW1lbnQgU3RyaWN0TWF0aCBTdHJpbmcgXCIgK1xuICAgICAgXCJTdHJpbmdCdWZmZXIgU3lzdGVtIFRocmVhZCBUaHJlYWRHcm91cCBUaHJlYWRMb2NhbCBUaHJvd2FibGUgVHJpcGxlIFZvaWRcIlxuICAgICksXG4gICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhcImNhdGNoIGNsYXNzIGVudW0gZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JTb21lIGlmIG1hdGNoIHN3aXRjaCB0cnkgd2hpbGVcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgZW51bSBkZWYgb2JqZWN0IHBhY2thZ2UgdHJhaXQgdHlwZSB2YWwgdmFyXCIpLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbFwiKSxcbiAgICBpbmRlbnRTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBpbmRlbnRTd2l0Y2g6IGZhbHNlLFxuICAgIGlzT3BlcmF0b3JDaGFyOiAvWytcXC0qJiU9PD4hP3xcXC8jOkBdLyxcbiAgICBob29rczoge1xuICAgICAgXCJAXCI6IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHdcXCRfXS8pO1xuICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICB9LFxuICAgICAgJ1wiJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgnXCJcIicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5UcmlwbGVTdHJpbmc7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH0sXG4gICAgICBcIidcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9cXHhhMS1cXHVmZmZmXS8pO1xuICAgICAgICByZXR1cm4gXCJhdG9tXCI7XG4gICAgICB9LFxuICAgICAgXCI9XCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgdmFyIGN4ID0gc3RhdGUuY29udGV4dFxuICAgICAgICBpZiAoY3gudHlwZSA9PSBcIn1cIiAmJiBjeC5hbGlnbiAmJiBzdHJlYW0uZWF0KFwiPlwiKSkge1xuICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChjeC5pbmRlbnRlZCwgY3guY29sdW1uLCBjeC50eXBlLCBjeC5pbmZvLCBudWxsLCBjeC5wcmV2KVxuICAgICAgICAgIHJldHVybiBcIm9wZXJhdG9yXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7Y2xvc2VCcmFja2V0czoge3RyaXBsZXM6ICdcIid9fVxuICB9KTtcblxuICBmdW5jdGlvbiB0b2tlbktvdGxpblN0cmluZyh0cmlwbGVTdHJpbmcpe1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7XG4gICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICBpZiAoIXRyaXBsZVN0cmluZyAmJiAhZXNjYXBlZCAmJiBzdHJlYW0ubWF0Y2goJ1wiJykgKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fVxuICAgICAgICBpZiAodHJpcGxlU3RyaW5nICYmIHN0cmVhbS5tYXRjaCgnXCJcIlwiJykpIHtlbmQgPSB0cnVlOyBicmVhazt9XG4gICAgICAgIG5leHQgPSBzdHJlYW0ubmV4dCgpO1xuICAgICAgICBpZighZXNjYXBlZCAmJiBuZXh0ID09IFwiJFwiICYmIHN0cmVhbS5tYXRjaCgneycpKVxuICAgICAgICAgIHN0cmVhbS5za2lwVG8oXCJ9XCIpO1xuICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIiAmJiAhdHJpcGxlU3RyaW5nO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCB8fCAhdHJpcGxlU3RyaW5nKVxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gIH1cblxuICBkZWYoXCJ0ZXh0L3gta290bGluXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFxuICAgICAgLyprZXl3b3JkcyovXG4gICAgICBcInBhY2thZ2UgYXMgdHlwZWFsaWFzIGNsYXNzIGludGVyZmFjZSB0aGlzIHN1cGVyIHZhbCBcIiArXG4gICAgICBcInZhciBmdW4gZm9yIGlzIGluIFRoaXMgdGhyb3cgcmV0dXJuIFwiICtcbiAgICAgIFwiYnJlYWsgY29udGludWUgb2JqZWN0IGlmIGVsc2Ugd2hpbGUgZG8gdHJ5IHdoZW4gIWluICFpcyBhcz8gXCIgK1xuXG4gICAgICAvKnNvZnQga2V5d29yZHMqL1xuICAgICAgXCJmaWxlIGltcG9ydCB3aGVyZSBieSBnZXQgc2V0IGFic3RyYWN0IGVudW0gb3BlbiBpbm5lciBvdmVycmlkZSBwcml2YXRlIHB1YmxpYyBpbnRlcm5hbCBcIiArXG4gICAgICBcInByb3RlY3RlZCBjYXRjaCBmaW5hbGx5IG91dCBmaW5hbCB2YXJhcmcgcmVpZmllZCBkeW5hbWljIGNvbXBhbmlvbiBjb25zdHJ1Y3RvciBpbml0IFwiICtcbiAgICAgIFwic2VhbGVkIGZpZWxkIHByb3BlcnR5IHJlY2VpdmVyIHBhcmFtIHNwYXJhbSBsYXRlaW5pdCBkYXRhIGlubGluZSBub2lubGluZSB0YWlscmVjIFwiICtcbiAgICAgIFwiZXh0ZXJuYWwgYW5ub3RhdGlvbiBjcm9zc2lubGluZSBjb25zdCBvcGVyYXRvciBpbmZpeCBzdXNwZW5kXCJcbiAgICApLFxuICAgIHR5cGVzOiB3b3JkcyhcbiAgICAgIC8qIHBhY2thZ2UgamF2YS5sYW5nICovXG4gICAgICBcIkJvb2xlYW4gQnl0ZSBDaGFyYWN0ZXIgQ2hhclNlcXVlbmNlIENsYXNzIENsYXNzTG9hZGVyIENsb25lYWJsZSBDb21wYXJhYmxlIFwiICtcbiAgICAgIFwiQ29tcGlsZXIgRG91YmxlIEV4Y2VwdGlvbiBGbG9hdCBJbnRlZ2VyIExvbmcgTWF0aCBOdW1iZXIgT2JqZWN0IFBhY2thZ2UgUGFpciBQcm9jZXNzIFwiICtcbiAgICAgIFwiUnVudGltZSBSdW5uYWJsZSBTZWN1cml0eU1hbmFnZXIgU2hvcnQgU3RhY2tUcmFjZUVsZW1lbnQgU3RyaWN0TWF0aCBTdHJpbmcgXCIgK1xuICAgICAgXCJTdHJpbmdCdWZmZXIgU3lzdGVtIFRocmVhZCBUaHJlYWRHcm91cCBUaHJlYWRMb2NhbCBUaHJvd2FibGUgVHJpcGxlIFZvaWRcIlxuICAgICksXG4gICAgaW50ZW5kU3dpdGNoOiBmYWxzZSxcbiAgICBpbmRlbnRTdGF0ZW1lbnRzOiBmYWxzZSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIG51bWJlcjogL14oPzoweFthLWZcXGRfXSt8MGJbMDFfXSt8KD86W1xcZF9dK1xcLj9cXGQqfFxcLlxcZCspKD86ZVstK10/W1xcZF9dKyk/KSh1fGxsP3xsfGYpPy9pLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiB3aGVyZSB0cnkgd2hpbGUgZW51bVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJjbGFzcyB2YWwgdmFyIG9iamVjdCBpbnRlcmZhY2UgZnVuXCIpLFxuICAgIGF0b21zOiB3b3JkcyhcInRydWUgZmFsc2UgbnVsbCB0aGlzXCIpLFxuICAgIGhvb2tzOiB7XG4gICAgICAnXCInOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Lb3RsaW5TdHJpbmcoc3RyZWFtLm1hdGNoKCdcIlwiJykpO1xuICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtjbG9zZUJyYWNrZXRzOiB7dHJpcGxlczogJ1wiJ319XG4gIH0pO1xuXG4gIGRlZihbXCJ4LXNoYWRlci94LXZlcnRleFwiLCBcIngtc2hhZGVyL3gtZnJhZ21lbnRcIl0sIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKFwic2FtcGxlcjFEIHNhbXBsZXIyRCBzYW1wbGVyM0Qgc2FtcGxlckN1YmUgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInNhbXBsZXIxRFNoYWRvdyBzYW1wbGVyMkRTaGFkb3cgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImNvbnN0IGF0dHJpYnV0ZSB1bmlmb3JtIHZhcnlpbmcgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImJyZWFrIGNvbnRpbnVlIGRpc2NhcmQgcmV0dXJuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJmb3Igd2hpbGUgZG8gaWYgZWxzZSBzdHJ1Y3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImluIG91dCBpbm91dFwiKSxcbiAgICB0eXBlczogd29yZHMoXCJmbG9hdCBpbnQgYm9vbCB2b2lkIFwiICtcbiAgICAgICAgICAgICAgICAgXCJ2ZWMyIHZlYzMgdmVjNCBpdmVjMiBpdmVjMyBpdmVjNCBidmVjMiBidmVjMyBidmVjNCBcIiArXG4gICAgICAgICAgICAgICAgIFwibWF0MiBtYXQzIG1hdDRcIiksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJmb3Igd2hpbGUgZG8gaWYgZWxzZSBzdHJ1Y3RcIiksXG4gICAgYnVpbHRpbjogd29yZHMoXCJyYWRpYW5zIGRlZ3JlZXMgc2luIGNvcyB0YW4gYXNpbiBhY29zIGF0YW4gXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInBvdyBleHAgbG9nIGV4cDIgc3FydCBpbnZlcnNlc3FydCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiYWJzIHNpZ24gZmxvb3IgY2VpbCBmcmFjdCBtb2QgbWluIG1heCBjbGFtcCBtaXggc3RlcCBzbW9vdGhzdGVwIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJsZW5ndGggZGlzdGFuY2UgZG90IGNyb3NzIG5vcm1hbGl6ZSBmdHJhbnNmb3JtIGZhY2Vmb3J3YXJkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJyZWZsZWN0IHJlZnJhY3QgbWF0cml4Q29tcE11bHQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImxlc3NUaGFuIGxlc3NUaGFuRXF1YWwgZ3JlYXRlclRoYW4gZ3JlYXRlclRoYW5FcXVhbCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZXF1YWwgbm90RXF1YWwgYW55IGFsbCBub3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInRleHR1cmUxRCB0ZXh0dXJlMURQcm9qIHRleHR1cmUxRExvZCB0ZXh0dXJlMURQcm9qTG9kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJ0ZXh0dXJlMkQgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlMkRMb2QgdGV4dHVyZTJEUHJvakxvZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwidGV4dHVyZTNEIHRleHR1cmUzRFByb2ogdGV4dHVyZTNETG9kIHRleHR1cmUzRFByb2pMb2QgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcInRleHR1cmVDdWJlIHRleHR1cmVDdWJlTG9kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJzaGFkb3cxRCBzaGFkb3cyRCBzaGFkb3cxRFByb2ogc2hhZG93MkRQcm9qIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJzaGFkb3cxRExvZCBzaGFkb3cyRExvZCBzaGFkb3cxRFByb2pMb2Qgc2hhZG93MkRQcm9qTG9kIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJkRmR4IGRGZHkgZndpZHRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJub2lzZTEgbm9pc2UyIG5vaXNlMyBub2lzZTRcIiksXG4gICAgYXRvbXM6IHdvcmRzKFwidHJ1ZSBmYWxzZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9GcmFnQ29sb3IgZ2xfU2Vjb25kYXJ5Q29sb3IgZ2xfTm9ybWFsIGdsX1ZlcnRleCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NdWx0aVRleENvb3JkMCBnbF9NdWx0aVRleENvb3JkMSBnbF9NdWx0aVRleENvb3JkMiBnbF9NdWx0aVRleENvb3JkMyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NdWx0aVRleENvb3JkNCBnbF9NdWx0aVRleENvb3JkNSBnbF9NdWx0aVRleENvb3JkNiBnbF9NdWx0aVRleENvb3JkNyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Gb2dDb29yZCBnbF9Qb2ludENvb3JkIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1Bvc2l0aW9uIGdsX1BvaW50U2l6ZSBnbF9DbGlwVmVydGV4IFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0Zyb250Q29sb3IgZ2xfQmFja0NvbG9yIGdsX0Zyb250U2Vjb25kYXJ5Q29sb3IgZ2xfQmFja1NlY29uZGFyeUNvbG9yIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleENvb3JkIGdsX0ZvZ0ZyYWdDb29yZCBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9GcmFnQ29vcmQgZ2xfRnJvbnRGYWNpbmcgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRnJhZ0RhdGEgZ2xfRnJhZ0RlcHRoIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX01vZGVsVmlld01hdHJpeCBnbF9Qcm9qZWN0aW9uTWF0cml4IGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfVGV4dHVyZU1hdHJpeCBnbF9Ob3JtYWxNYXRyaXggZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZSBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4SW52ZXJzZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9UZXh1cmVNYXRyaXhUcmFuc3Bvc2UgZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZVRyYW5zcG9zZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9UZXh0dXJlTWF0cml4SW52ZXJzZVRyYW5zcG9zZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Ob3JtYWxTY2FsZSBnbF9EZXB0aFJhbmdlIGdsX0NsaXBQbGFuZSBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9Qb2ludCBnbF9Gcm9udE1hdGVyaWFsIGdsX0JhY2tNYXRlcmlhbCBnbF9MaWdodFNvdXJjZSBnbF9MaWdodE1vZGVsIFwiICtcbiAgICAgICAgICAgICAgICBcImdsX0Zyb250TGlnaHRNb2RlbFByb2R1Y3QgZ2xfQmFja0xpZ2h0TW9kZWxQcm9kdWN0IFwiICtcbiAgICAgICAgICAgICAgICBcImdsX1RleHR1cmVDb2xvciBnbF9FeWVQbGFuZVMgZ2xfRXllUGxhbmVUIGdsX0V5ZVBsYW5lUiBnbF9FeWVQbGFuZVEgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfRm9nUGFyYW1ldGVycyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhMaWdodHMgZ2xfTWF4Q2xpcFBsYW5lcyBnbF9NYXhUZXh0dXJlVW5pdHMgZ2xfTWF4VGV4dHVyZUNvb3JkcyBcIiArXG4gICAgICAgICAgICAgICAgXCJnbF9NYXhWZXJ0ZXhBdHRyaWJzIGdsX01heFZlcnRleFVuaWZvcm1Db21wb25lbnRzIGdsX01heFZhcnlpbmdGbG9hdHMgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgZ2xfTWF4VGV4dHVyZUltYWdlVW5pdHMgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyBnbF9NYXhDb21iaW5lVGV4dHVyZUltYWdlVW5pdHMgXCIgK1xuICAgICAgICAgICAgICAgIFwiZ2xfTWF4RHJhd0J1ZmZlcnNcIiksXG4gICAgaW5kZW50U3dpdGNoOiBmYWxzZSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1uZXNjXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiYXMgYXRvbWljIGFzeW5jIGNhbGwgY29tbWFuZCBjb21wb25lbnQgY29tcG9uZW50cyBjb25maWd1cmF0aW9uIGV2ZW50IGdlbmVyaWMgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcImltcGxlbWVudGF0aW9uIGluY2x1ZGVzIGludGVyZmFjZSBtb2R1bGUgbmV3IG5vcmFjZSBueF9zdHJ1Y3QgbnhfdW5pb24gcG9zdCBwcm92aWRlcyBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwic2lnbmFsIHRhc2sgdXNlcyBhYnN0cmFjdCBleHRlbmRzXCIpLFxuICAgIHR5cGVzOiB3b3JkcyhjVHlwZXMpLFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2FzZSBkbyBlbHNlIGZvciBpZiBzd2l0Y2ggd2hpbGUgc3RydWN0XCIpLFxuICAgIGF0b21zOiB3b3JkcyhcIm51bGwgdHJ1ZSBmYWxzZVwiKSxcbiAgICBob29rczoge1wiI1wiOiBjcHBIb29rfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbXCJicmFjZVwiLCBcImluY2x1ZGVcIl19XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1vYmplY3RpdmVjXCIsIHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArIFwiaW5saW5lIHJlc3RyaWN0IF9Cb29sIF9Db21wbGV4IF9JbWFnaW5hcnkgQk9PTCBDbGFzcyBieWNvcHkgYnlyZWYgaWQgSU1QIGluIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJpbm91dCBuaWwgb25ld2F5IG91dCBQcm90b2NvbCBTRUwgc2VsZiBzdXBlciBhdG9taWMgbm9uYXRvbWljIHJldGFpbiBjb3B5IHJlYWR3cml0ZSByZWFkb25seVwiKSxcbiAgICB0eXBlczogd29yZHMoY1R5cGVzKSxcbiAgICBhdG9tczogd29yZHMoXCJZRVMgTk8gTlVMTCBOSUxMIE9OIE9GRiB0cnVlIGZhbHNlXCIpLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIkBcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF0vKTtcbiAgICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgICAgfSxcbiAgICAgIFwiI1wiOiBjcHBIb29rLFxuICAgICAgaW5kZW50OiBmdW5jdGlvbihfc3RhdGUsIGN0eCwgdGV4dEFmdGVyKSB7XG4gICAgICAgIGlmIChjdHgudHlwZSA9PSBcInN0YXRlbWVudFwiICYmIC9eQFxcdy8udGVzdCh0ZXh0QWZ0ZXIpKSByZXR1cm4gY3R4LmluZGVudGVkXG4gICAgICB9XG4gICAgfSxcbiAgICBtb2RlUHJvcHM6IHtmb2xkOiBcImJyYWNlXCJ9XG4gIH0pO1xuXG4gIGRlZihcInRleHQveC1zcXVpcnJlbFwiLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcImJhc2UgYnJlYWsgY2xvbmUgY29udGludWUgY29uc3QgZGVmYXVsdCBkZWxldGUgZW51bSBleHRlbmRzIGZ1bmN0aW9uIGluIGNsYXNzXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBmb3JlYWNoIGxvY2FsIHJlc3VtZSByZXR1cm4gdGhpcyB0aHJvdyB0eXBlb2YgeWllbGQgY29uc3RydWN0b3IgaW5zdGFuY2VvZiBzdGF0aWNcIiksXG4gICAgdHlwZXM6IHdvcmRzKGNUeXBlcyksXG4gICAgYmxvY2tLZXl3b3Jkczogd29yZHMoXCJjYXNlIGNhdGNoIGNsYXNzIGVsc2UgZm9yIGZvcmVhY2ggaWYgc3dpdGNoIHRyeSB3aGlsZVwiKSxcbiAgICBkZWZLZXl3b3Jkczogd29yZHMoXCJmdW5jdGlvbiBsb2NhbCBjbGFzc1wiKSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGxcIiksXG4gICAgaG9va3M6IHtcIiNcIjogY3BwSG9va30sXG4gICAgbW9kZVByb3BzOiB7Zm9sZDogW1wiYnJhY2VcIiwgXCJpbmNsdWRlXCJdfVxuICB9KTtcblxuICAvLyBDZXlsb24gU3RyaW5ncyBuZWVkIHRvIGRlYWwgd2l0aCBpbnRlcnBvbGF0aW9uXG4gIHZhciBzdHJpbmdUb2tlbml6ZXIgPSBudWxsO1xuICBmdW5jdGlvbiB0b2tlbkNleWxvblN0cmluZyh0eXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlO1xuICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaCgnXCInKSAmJlxuICAgICAgICAgICAgICAodHlwZSA9PSBcInNpbmdsZVwiIHx8IHN0cmVhbS5tYXRjaCgnXCJcIicpKSkge1xuICAgICAgICAgIGVuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaCgnYGAnKSkge1xuICAgICAgICAgIHN0cmluZ1Rva2VuaXplciA9IHRva2VuQ2V5bG9uU3RyaW5nKHR5cGUpO1xuICAgICAgICAgIGVuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCA9IHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIGVzY2FwZWQgPSB0eXBlID09IFwic2luZ2xlXCIgJiYgIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQpXG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICB9XG5cbiAgZGVmKFwidGV4dC94LWNleWxvblwiLCB7XG4gICAgbmFtZTogXCJjbGlrZVwiLFxuICAgIGtleXdvcmRzOiB3b3JkcyhcImFic3RyYWN0cyBhbGlhcyBhc3NlbWJseSBhc3NlcnQgYXNzaWduIGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29udGludWUgZHluYW1pYyBlbHNlXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBleGlzdHMgZXh0ZW5kcyBmaW5hbGx5IGZvciBmdW5jdGlvbiBnaXZlbiBpZiBpbXBvcnQgaW4gaW50ZXJmYWNlIGlzIGxldCBtb2R1bGUgbmV3XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiBub25lbXB0eSBvYmplY3Qgb2Ygb3V0IG91dGVyIHBhY2thZ2UgcmV0dXJuIHNhdGlzZmllcyBzdXBlciBzd2l0Y2ggdGhlbiB0aGlzIHRocm93XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiB0cnkgdmFsdWUgdm9pZCB3aGlsZVwiKSxcbiAgICB0eXBlczogZnVuY3Rpb24od29yZCkge1xuICAgICAgICAvLyBJbiBDZXlsb24gYWxsIGlkZW50aWZpZXJzIHRoYXQgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgYXJlIHR5cGVzXG4gICAgICAgIHZhciBmaXJzdCA9IHdvcmQuY2hhckF0KDApO1xuICAgICAgICByZXR1cm4gKGZpcnN0ID09PSBmaXJzdC50b1VwcGVyQ2FzZSgpICYmIGZpcnN0ICE9PSBmaXJzdC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9LFxuICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKFwiY2FzZSBjYXRjaCBjbGFzcyBkeW5hbWljIGVsc2UgZmluYWxseSBmb3IgZnVuY3Rpb24gaWYgaW50ZXJmYWNlIG1vZHVsZSBuZXcgb2JqZWN0IHN3aXRjaCB0cnkgd2hpbGVcIiksXG4gICAgZGVmS2V5d29yZHM6IHdvcmRzKFwiY2xhc3MgZHluYW1pYyBmdW5jdGlvbiBpbnRlcmZhY2UgbW9kdWxlIG9iamVjdCBwYWNrYWdlIHZhbHVlXCIpLFxuICAgIGJ1aWx0aW46IHdvcmRzKFwiYWJzdHJhY3QgYWN0dWFsIGFsaWFzZWQgYW5ub3RhdGlvbiBieSBkZWZhdWx0IGRlcHJlY2F0ZWQgZG9jIGZpbmFsIGZvcm1hbCBsYXRlIGxpY2Vuc2VcIiArXG4gICAgICAgICAgICAgICAgICAgXCIgbmF0aXZlIG9wdGlvbmFsIHNlYWxlZCBzZWUgc2VyaWFsaXphYmxlIHNoYXJlZCBzdXBwcmVzc1dhcm5pbmdzIHRhZ2dlZCB0aHJvd3MgdmFyaWFibGVcIiksXG4gICAgaXNQdW5jdHVhdGlvbkNoYXI6IC9bXFxbXFxde31cXChcXCksO1xcOlxcLmBdLyxcbiAgICBpc09wZXJhdG9yQ2hhcjogL1srXFwtKiYlPTw+IT98Xn46XFwvXS8sXG4gICAgbnVtYmVyU3RhcnQ6IC9bXFxkIyRdLyxcbiAgICBudW1iZXI6IC9eKD86I1tcXGRhLWZBLUZfXSt8XFwkWzAxX10rfFtcXGRfXStba01HVFBtdW5wZl0/fFtcXGRfXStcXC5bXFxkX10rKD86W2VFXVstK10/XFxkK3xba01HVFBtdW5wZl18KXwpL2ksXG4gICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSxcbiAgICBhdG9tczogd29yZHMoXCJ0cnVlIGZhbHNlIG51bGwgbGFyZ2VyIHNtYWxsZXIgZXF1YWwgZW1wdHkgZmluaXNoZWRcIiksXG4gICAgaW5kZW50U3dpdGNoOiBmYWxzZSxcbiAgICBzdHlsZURlZnM6IGZhbHNlLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIkBcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcIm1ldGFcIjtcbiAgICAgIH0sXG4gICAgICAnXCInOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNleWxvblN0cmluZyhzdHJlYW0ubWF0Y2goJ1wiXCInKSA/IFwidHJpcGxlXCIgOiBcInNpbmdsZVwiKTtcbiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0sXG4gICAgICAnYCc6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgICBpZiAoIXN0cmluZ1Rva2VuaXplciB8fCAhc3RyZWFtLm1hdGNoKCdgJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHN0cmluZ1Rva2VuaXplcjtcbiAgICAgICAgICBzdHJpbmdUb2tlbml6ZXIgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgIFwiJ1wiOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXFx3XFwkX1xceGExLVxcdWZmZmZdLyk7XG4gICAgICAgIHJldHVybiBcImF0b21cIjtcbiAgICAgIH0sXG4gICAgICB0b2tlbjogZnVuY3Rpb24oX3N0cmVhbSwgc3RhdGUsIHN0eWxlKSB7XG4gICAgICAgICAgaWYgKChzdHlsZSA9PSBcInZhcmlhYmxlXCIgfHwgc3R5bGUgPT0gXCJ0eXBlXCIpICYmXG4gICAgICAgICAgICAgIHN0YXRlLnByZXZUb2tlbiA9PSBcIi5cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwidmFyaWFibGUtMlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW9kZVByb3BzOiB7XG4gICAgICAgIGZvbGQ6IFtcImJyYWNlXCIsIFwiaW1wb3J0XCJdLFxuICAgICAgICBjbG9zZUJyYWNrZXRzOiB7dHJpcGxlczogJ1wiJ31cbiAgICB9XG4gIH0pO1xuXG59KTtcblxuLyojIHNvdXJjZVVSTD1jbV9tb2Rlcy9jbGlrZS5qcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNtX21vZGVzL2NvZmZlZXNjcmlwdC5qcyJdPSIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbi8qKlxuICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3BpY2toYXJkdC9jb2ZmZWVzY3JpcHQtY29kZW1pcnJvci1tb2RlXG4gKi9cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG5cInVzZSBzdHJpY3RcIjtcblxuQ29kZU1pcnJvci5kZWZpbmVNb2RlKFwiY29mZmVlc2NyaXB0XCIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHtcbiAgdmFyIEVSUk9SQ0xBU1MgPSBcImVycm9yXCI7XG5cbiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3Jkcykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXigoXCIgKyB3b3Jkcy5qb2luKFwiKXwoXCIpICsgXCIpKVxcXFxiXCIpO1xuICB9XG5cbiAgdmFyIG9wZXJhdG9ycyA9IC9eKD86LT58PT58XFwrWys9XT98LVtcXC09XT98XFwqW1xcKj1dP3xcXC9bXFwvPV0/fFs9IV09fDxbPjxdPz0/fD4+Pz0/fCU9P3wmPT98XFx8PT98XFxePT98XFx+fCF8XFw/fChvcnxhbmR8XFx8XFx8fCYmfFxcPyk9KS87XG4gIHZhciBkZWxpbWl0ZXJzID0gL14oPzpbKClcXFtcXF17fSw6YD07XXxcXC5cXC4/XFwuPykvO1xuICB2YXIgaWRlbnRpZmllcnMgPSAvXltfQS1aYS16JF1bX0EtWmEteiQwLTldKi87XG4gIHZhciBhdFByb3AgPSAvXkBbX0EtWmEteiRdW19BLVphLXokMC05XSovO1xuXG4gIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbXCJhbmRcIiwgXCJvclwiLCBcIm5vdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNcIiwgXCJpc250XCIsIFwiaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImluc3RhbmNlb2ZcIiwgXCJ0eXBlb2ZcIl0pO1xuICB2YXIgaW5kZW50S2V5d29yZHMgPSBbXCJmb3JcIiwgXCJ3aGlsZVwiLCBcImxvb3BcIiwgXCJpZlwiLCBcInVubGVzc1wiLCBcImVsc2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3dpdGNoXCIsIFwidHJ5XCIsIFwiY2F0Y2hcIiwgXCJmaW5hbGx5XCIsIFwiY2xhc3NcIl07XG4gIHZhciBjb21tb25LZXl3b3JkcyA9IFtcImJyZWFrXCIsIFwiYnlcIiwgXCJjb250aW51ZVwiLCBcImRlYnVnZ2VyXCIsIFwiZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRvXCIsIFwiaW5cIiwgXCJvZlwiLCBcIm5ld1wiLCBcInJldHVyblwiLCBcInRoZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGhpc1wiLCBcIkBcIiwgXCJ0aHJvd1wiLCBcIndoZW5cIiwgXCJ1bnRpbFwiLCBcImV4dGVuZHNcIl07XG5cbiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChpbmRlbnRLZXl3b3Jkcy5jb25jYXQoY29tbW9uS2V5d29yZHMpKTtcblxuICBpbmRlbnRLZXl3b3JkcyA9IHdvcmRSZWdleHAoaW5kZW50S2V5d29yZHMpO1xuXG5cbiAgdmFyIHN0cmluZ1ByZWZpeGVzID0gL14oJ3szfXxcXFwiezN9fFsnXFxcIl0pLztcbiAgdmFyIHJlZ2V4UHJlZml4ZXMgPSAvXihcXC97M318XFwvKS87XG4gIHZhciBjb21tb25Db25zdGFudHMgPSBbXCJJbmZpbml0eVwiLCBcIk5hTlwiLCBcInVuZGVmaW5lZFwiLCBcIm51bGxcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJvblwiLCBcIm9mZlwiLCBcInllc1wiLCBcIm5vXCJdO1xuICB2YXIgY29uc3RhbnRzID0gd29yZFJlZ2V4cChjb21tb25Db25zdGFudHMpO1xuXG4gIC8vIFRva2VuaXplcnNcbiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlc1xuICAgIGlmIChzdHJlYW0uc29sKCkpIHtcbiAgICAgIGlmIChzdGF0ZS5zY29wZS5hbGlnbiA9PT0gbnVsbCkgc3RhdGUuc2NvcGUuYWxpZ24gPSBmYWxzZTtcbiAgICAgIHZhciBzY29wZU9mZnNldCA9IHN0YXRlLnNjb3BlLm9mZnNldDtcbiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkge1xuICAgICAgICB2YXIgbGluZU9mZnNldCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpO1xuICAgICAgICBpZiAobGluZU9mZnNldCA+IHNjb3BlT2Zmc2V0ICYmIHN0YXRlLnNjb3BlLnR5cGUgPT0gXCJjb2ZmZWVcIikge1xuICAgICAgICAgIHJldHVybiBcImluZGVudFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCkge1xuICAgICAgICAgIHJldHVybiBcImRlZGVudFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNjb3BlT2Zmc2V0ID4gMCkge1xuICAgICAgICAgIGRlZGVudChzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7XG5cbiAgICAvLyBIYW5kbGUgZG9jY28gdGl0bGUgY29tbWVudCAoc2luZ2xlIGxpbmUpXG4gICAgaWYgKHN0cmVhbS5tYXRjaChcIiMjIyNcIikpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGkgbGluZSBjb21tZW50c1xuICAgIGlmIChzdHJlYW0ubWF0Y2goXCIjIyNcIikpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplID0gbG9uZ0NvbW1lbnQ7XG4gICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIGxpbmUgY29tbWVudFxuICAgIGlmIChjaCA9PT0gXCIjXCIpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbnVtYmVyIGxpdGVyYWxzXG4gICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOVxcLl0vLCBmYWxzZSkpIHtcbiAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTtcbiAgICAgIC8vIEZsb2F0c1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XFxkKlxcLlxcZCsoZVtcXCtcXC1dP1xcZCspPy9pKSkge1xuICAgICAgICBmbG9hdExpdGVyYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XFxkK1xcLlxcZCovKSkge1xuICAgICAgICBmbG9hdExpdGVyYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XFwuXFxkKy8pKSB7XG4gICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmbG9hdExpdGVyYWwpIHtcbiAgICAgICAgLy8gcHJldmVudCBmcm9tIGdldHRpbmcgZXh0cmEgLiBvbiAxLi5cbiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gXCIuXCIpe1xuICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgICB9XG4gICAgICAvLyBJbnRlZ2Vyc1xuICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTtcbiAgICAgIC8vIEhleFxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/MHhbMC05YS1mXSsvaSkpIHtcbiAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBEZWNpbWFsXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMS05XVxcZCooZVtcXCtcXC1dP1xcZCspPy8pKSB7XG4gICAgICAgIGludExpdGVyYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gWmVybyBieSBpdHNlbGYgd2l0aCBubyBvdGhlciBwaWVjZSBvZiBudW1iZXIuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT8wKD8hW1xcZHhdKS9pKSkge1xuICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnRMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzdHJpbmdzXG4gICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHtcbiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksIGZhbHNlLCBcInN0cmluZ1wiKTtcbiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHJlZ2V4IGxpdGVyYWxzXG4gICAgaWYgKHN0cmVhbS5tYXRjaChyZWdleFByZWZpeGVzKSkge1xuICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgIT0gXCIvXCIgfHwgc3RyZWFtLm1hdGNoKC9eLipcXC8vLCBmYWxzZSkpIHsgLy8gcHJldmVudCBoaWdobGlnaHQgb2YgZGl2aXNpb25cbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSwgdHJ1ZSwgXCJzdHJpbmctMlwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTtcbiAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgZGVsaW1pdGVyc1xuICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSB8fCBzdHJlYW0ubWF0Y2god29yZE9wZXJhdG9ycykpIHtcbiAgICAgIHJldHVybiBcIm9wZXJhdG9yXCI7XG4gICAgfVxuICAgIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVycykpIHtcbiAgICAgIHJldHVybiBcInB1bmN0dWF0aW9uXCI7XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbS5tYXRjaChjb25zdGFudHMpKSB7XG4gICAgICByZXR1cm4gXCJhdG9tXCI7XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbS5tYXRjaChhdFByb3ApIHx8IHN0YXRlLnByb3AgJiYgc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkge1xuICAgICAgcmV0dXJuIFwicHJvcGVydHlcIjtcbiAgICB9XG5cbiAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkge1xuICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuICAgIH1cblxuICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7XG4gICAgICByZXR1cm4gXCJ2YXJpYWJsZVwiO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXNcbiAgICBzdHJlYW0ubmV4dCgpO1xuICAgIHJldHVybiBFUlJPUkNMQVNTO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5GYWN0b3J5KGRlbGltaXRlciwgc2luZ2xlbGluZSwgb3V0Y2xhc3MpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXidcIlxcL1xcXFxdLyk7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiXFxcXFwiKSkge1xuICAgICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgaWYgKHNpbmdsZWxpbmUgJiYgc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0Y2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICAgICAgcmV0dXJuIG91dGNsYXNzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmVhbS5lYXQoL1snXCJcXC9dLyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzaW5nbGVsaW5lKSB7XG4gICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHtcbiAgICAgICAgICBvdXRjbGFzcyA9IEVSUk9SQ0xBU1M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRjbGFzcztcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbG9uZ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICBzdHJlYW0uZWF0V2hpbGUoL1teI10vKTtcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goXCIjIyNcIikpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RyZWFtLmVhdFdoaWxlKFwiI1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZW50KHN0cmVhbSwgc3RhdGUsIHR5cGUpIHtcbiAgICB0eXBlID0gdHlwZSB8fCBcImNvZmZlZVwiO1xuICAgIHZhciBvZmZzZXQgPSAwLCBhbGlnbiA9IGZhbHNlLCBhbGlnbk9mZnNldCA9IG51bGw7XG4gICAgZm9yICh2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTsgc2NvcGU7IHNjb3BlID0gc2NvcGUucHJldikge1xuICAgICAgaWYgKHNjb3BlLnR5cGUgPT09IFwiY29mZmVlXCIgfHwgc2NvcGUudHlwZSA9PSBcIn1cIikge1xuICAgICAgICBvZmZzZXQgPSBzY29wZS5vZmZzZXQgKyBjb25mLmluZGVudFVuaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZSAhPT0gXCJjb2ZmZWVcIikge1xuICAgICAgYWxpZ24gPSBudWxsO1xuICAgICAgYWxpZ25PZmZzZXQgPSBzdHJlYW0uY29sdW1uKCkgKyBzdHJlYW0uY3VycmVudCgpLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnNjb3BlLmFsaWduKSB7XG4gICAgICBzdGF0ZS5zY29wZS5hbGlnbiA9IGZhbHNlO1xuICAgIH1cbiAgICBzdGF0ZS5zY29wZSA9IHtcbiAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHByZXY6IHN0YXRlLnNjb3BlLFxuICAgICAgYWxpZ246IGFsaWduLFxuICAgICAgYWxpZ25PZmZzZXQ6IGFsaWduT2Zmc2V0XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZGVudChzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5zY29wZS5wcmV2KSByZXR1cm47XG4gICAgaWYgKHN0YXRlLnNjb3BlLnR5cGUgPT09IFwiY29mZmVlXCIpIHtcbiAgICAgIHZhciBfaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7XG4gICAgICB2YXIgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTsgc2NvcGU7IHNjb3BlID0gc2NvcGUucHJldikge1xuICAgICAgICBpZiAoX2luZGVudCA9PT0gc2NvcGUub2Zmc2V0KSB7XG4gICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5zY29wZS5wcmV2ICYmIHN0YXRlLnNjb3BlLm9mZnNldCAhPT0gX2luZGVudCkge1xuICAgICAgICBzdGF0ZS5zY29wZSA9IHN0YXRlLnNjb3BlLnByZXY7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnNjb3BlID0gc3RhdGUuc2NvcGUucHJldjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7XG5cbiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy5cbiAgICBpZiAoY3VycmVudCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgc3RhdGUuZGVkZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCgoY3VycmVudCA9PT0gXCItPlwiIHx8IGN1cnJlbnQgPT09IFwiPT5cIikgJiYgc3RyZWFtLmVvbCgpKVxuICAgICAgICB8fCBzdHlsZSA9PT0gXCJpbmRlbnRcIikge1xuICAgICAgaW5kZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgICB2YXIgZGVsaW1pdGVyX2luZGV4ID0gXCJbKHtcIi5pbmRleE9mKGN1cnJlbnQpO1xuICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7XG4gICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSwgXCJdKX1cIi5zbGljZShkZWxpbWl0ZXJfaW5kZXgsIGRlbGltaXRlcl9pbmRleCsxKSk7XG4gICAgfVxuICAgIGlmIChpbmRlbnRLZXl3b3Jkcy5leGVjKGN1cnJlbnQpKXtcbiAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT0gXCJ0aGVuXCIpe1xuICAgICAgZGVkZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuXG4gICAgaWYgKHN0eWxlID09PSBcImRlZGVudFwiKSB7XG4gICAgICBpZiAoZGVkZW50KHN0cmVhbSwgc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiBFUlJPUkNMQVNTO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWxpbWl0ZXJfaW5kZXggPSBcIl0pfVwiLmluZGV4T2YoY3VycmVudCk7XG4gICAgaWYgKGRlbGltaXRlcl9pbmRleCAhPT0gLTEpIHtcbiAgICAgIHdoaWxlIChzdGF0ZS5zY29wZS50eXBlID09IFwiY29mZmVlXCIgJiYgc3RhdGUuc2NvcGUucHJldilcbiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2O1xuICAgICAgaWYgKHN0YXRlLnNjb3BlLnR5cGUgPT0gY3VycmVudClcbiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2O1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZGVkZW50ICYmIHN0cmVhbS5lb2woKSkge1xuICAgICAgaWYgKHN0YXRlLnNjb3BlLnR5cGUgPT0gXCJjb2ZmZWVcIiAmJiBzdGF0ZS5zY29wZS5wcmV2KVxuICAgICAgICBzdGF0ZS5zY29wZSA9IHN0YXRlLnNjb3BlLnByZXY7XG4gICAgICBzdGF0ZS5kZWRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cblxuICB2YXIgZXh0ZXJuYWwgPSB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSxcbiAgICAgICAgc2NvcGU6IHtvZmZzZXQ6YmFzZWNvbHVtbiB8fCAwLCB0eXBlOlwiY29mZmVlXCIsIHByZXY6IG51bGwsIGFsaWduOiBmYWxzZX0sXG4gICAgICAgIHByb3A6IGZhbHNlLFxuICAgICAgICBkZWRlbnQ6IDBcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICB2YXIgZmlsbEFsaWduID0gc3RhdGUuc2NvcGUuYWxpZ24gPT09IG51bGwgJiYgc3RhdGUuc2NvcGU7XG4gICAgICBpZiAoZmlsbEFsaWduICYmIHN0cmVhbS5zb2woKSkgZmlsbEFsaWduLmFsaWduID0gZmFsc2U7XG5cbiAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBpZiAoc3R5bGUgJiYgc3R5bGUgIT0gXCJjb21tZW50XCIpIHtcbiAgICAgICAgaWYgKGZpbGxBbGlnbikgZmlsbEFsaWduLmFsaWduID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucHJvcCA9IHN0eWxlID09IFwicHVuY3R1YXRpb25cIiAmJiBzdHJlYW0uY3VycmVudCgpID09IFwiLlwiXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dCkge1xuICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7XG4gICAgICB2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTtcbiAgICAgIHZhciBjbG9zZXIgPSB0ZXh0ICYmIFwiXSl9XCIuaW5kZXhPZih0ZXh0LmNoYXJBdCgwKSkgPiAtMTtcbiAgICAgIGlmIChjbG9zZXIpIHdoaWxlIChzY29wZS50eXBlID09IFwiY29mZmVlXCIgJiYgc2NvcGUucHJldikgc2NvcGUgPSBzY29wZS5wcmV2O1xuICAgICAgdmFyIGNsb3NlcyA9IGNsb3NlciAmJiBzY29wZS50eXBlID09PSB0ZXh0LmNoYXJBdCgwKTtcbiAgICAgIGlmIChzY29wZS5hbGlnbilcbiAgICAgICAgcmV0dXJuIHNjb3BlLmFsaWduT2Zmc2V0IC0gKGNsb3NlcyA/IDEgOiAwKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIChjbG9zZXMgPyBzY29wZS5wcmV2IDogc2NvcGUpLm9mZnNldDtcbiAgICB9LFxuXG4gICAgbGluZUNvbW1lbnQ6IFwiI1wiLFxuICAgIGZvbGQ6IFwiaW5kZW50XCJcbiAgfTtcbiAgcmV0dXJuIGV4dGVybmFsO1xufSk7XG5cbi8vIElBTkEgcmVnaXN0ZXJlZCBtZWRpYSB0eXBlXG4vLyBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcImFwcGxpY2F0aW9uL3ZuZC5jb2ZmZWVzY3JpcHRcIiwgXCJjb2ZmZWVzY3JpcHRcIik7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1jb2ZmZWVzY3JpcHRcIiwgXCJjb2ZmZWVzY3JpcHRcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiLCBcImNvZmZlZXNjcmlwdFwiKTtcblxufSk7XG5cbi8qIyBzb3VyY2VVUkw9Y21fbW9kZXMvY29mZmVlc2NyaXB0LmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvcGhwLmpzIl09Ii8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSwgcmVxdWlyZShcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiksIHJlcXVpcmUoXCIuLi9jbGlrZS9jbGlrZVwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWRcIiwgXCIuLi9jbGlrZS9jbGlrZVwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgZnVuY3Rpb24ga2V5d29yZHMoc3RyKSB7XG4gICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdChcIiBcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIEhlbHBlciBmb3IgcGhwU3RyaW5nXG4gIGZ1bmN0aW9uIG1hdGNoU2VxdWVuY2UobGlzdCwgZW5kLCBlc2NhcGVzKSB7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDApIHJldHVybiBwaHBTdHJpbmcoZW5kKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBwYXR0ZXJucyA9IGxpc3RbMF07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSBpZiAoc3RyZWFtLm1hdGNoKHBhdHRlcm5zW2ldWzBdKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UobGlzdC5zbGljZSgxKSwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm5zW2ldWzFdO1xuICAgICAgfVxuICAgICAgc3RhdGUudG9rZW5pemUgPSBwaHBTdHJpbmcoZW5kLCBlc2NhcGVzKTtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gcGhwU3RyaW5nKGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgeyByZXR1cm4gcGhwU3RyaW5nXyhzdHJlYW0sIHN0YXRlLCBjbG9zaW5nLCBlc2NhcGVzKTsgfTtcbiAgfVxuICBmdW5jdGlvbiBwaHBTdHJpbmdfKHN0cmVhbSwgc3RhdGUsIGNsb3NpbmcsIGVzY2FwZXMpIHtcbiAgICAvLyBcIkNvbXBsZXhcIiBzeW50YXhcbiAgICBpZiAoZXNjYXBlcyAhPT0gZmFsc2UgJiYgc3RyZWFtLm1hdGNoKFwiJHtcIiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaChcInskXCIsIGZhbHNlKSkge1xuICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsO1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIHN5bnRheFxuICAgIGlmIChlc2NhcGVzICE9PSBmYWxzZSAmJiBzdHJlYW0ubWF0Y2goL15cXCRbYS16QS1aX11bYS16QS1aMC05X10qLykpIHtcbiAgICAgIC8vIEFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lIHRoZXJlIG1heSBhcHBlYXIgYXJyYXkgb3Igb2JqZWN0IG9wZXJhdG9yLlxuICAgICAgaWYgKHN0cmVhbS5tYXRjaChcIltcIiwgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIGFycmF5IG9wZXJhdG9yXG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gbWF0Y2hTZXF1ZW5jZShbXG4gICAgICAgICAgW1tcIltcIiwgbnVsbF1dLFxuICAgICAgICAgIFtbL1xcZFtcXHdcXC5dKi8sIFwibnVtYmVyXCJdLFxuICAgICAgICAgICBbL1xcJFthLXpBLVpfXVthLXpBLVowLTlfXSovLCBcInZhcmlhYmxlLTJcIl0sXG4gICAgICAgICAgIFsvW1xcd1xcJF0rLywgXCJ2YXJpYWJsZVwiXV0sXG4gICAgICAgICAgW1tcIl1cIiwgbnVsbF1dXG4gICAgICAgIF0sIGNsb3NpbmcsIGVzY2FwZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXFwtXFw+XFx3LywgZmFsc2UpKSB7XG4gICAgICAgIC8vIE1hdGNoIG9iamVjdCBvcGVyYXRvclxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UoW1xuICAgICAgICAgIFtbXCItPlwiLCBudWxsXV0sXG4gICAgICAgICAgW1svW1xcd10rLywgXCJ2YXJpYWJsZVwiXV1cbiAgICAgICAgXSwgY2xvc2luZywgZXNjYXBlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG4gICAgfVxuXG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAvLyBOb3JtYWwgc3RyaW5nXG4gICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiZcbiAgICAgICAgICAgKGVzY2FwZWQgfHwgZXNjYXBlcyA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICghc3RyZWFtLm1hdGNoKFwieyRcIiwgZmFsc2UpICYmXG4gICAgICAgICAgICAgIXN0cmVhbS5tYXRjaCgvXihcXCRbYS16QS1aX11bYS16QS1aMC05X10qfFxcJFxceykvLCBmYWxzZSkpKSkge1xuICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaChjbG9zaW5nKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIHN0YXRlLnRva1N0YWNrLnBvcCgpOyBzdGF0ZS50b2tTdGFjay5wb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlc2NhcGVkID0gc3RyZWFtLm5leHQoKSA9PSBcIlxcXFxcIiAmJiAhZXNjYXBlZDtcbiAgICB9XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cblxuICB2YXIgcGhwS2V5d29yZHMgPSBcImFic3RyYWN0IGFuZCBhcnJheSBhcyBicmVhayBjYXNlIGNhdGNoIGNsYXNzIGNsb25lIGNvbnN0IGNvbnRpbnVlIGRlY2xhcmUgZGVmYXVsdCBcIiArXG4gICAgXCJkbyBlbHNlIGVsc2VpZiBlbmRkZWNsYXJlIGVuZGZvciBlbmRmb3JlYWNoIGVuZGlmIGVuZHN3aXRjaCBlbmR3aGlsZSBleHRlbmRzIGZpbmFsIFwiICtcbiAgICBcImZvciBmb3JlYWNoIGZ1bmN0aW9uIGdsb2JhbCBnb3RvIGlmIGltcGxlbWVudHMgaW50ZXJmYWNlIGluc3RhbmNlb2YgbmFtZXNwYWNlIFwiICtcbiAgICBcIm5ldyBvciBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHN3aXRjaCB0aHJvdyB0cmFpdCB0cnkgdXNlIHZhciB3aGlsZSB4b3IgXCIgK1xuICAgIFwiZGllIGVjaG8gZW1wdHkgZXhpdCBldmFsIGluY2x1ZGUgaW5jbHVkZV9vbmNlIGlzc2V0IGxpc3QgcmVxdWlyZSByZXF1aXJlX29uY2UgcmV0dXJuIFwiICtcbiAgICBcInByaW50IHVuc2V0IF9faGFsdF9jb21waWxlciBzZWxmIHN0YXRpYyBwYXJlbnQgeWllbGQgaW5zdGVhZG9mIGZpbmFsbHlcIjtcbiAgdmFyIHBocEF0b21zID0gXCJ0cnVlIGZhbHNlIG51bGwgVFJVRSBGQUxTRSBOVUxMIF9fQ0xBU1NfXyBfX0RJUl9fIF9fRklMRV9fIF9fTElORV9fIF9fTUVUSE9EX18gX19GVU5DVElPTl9fIF9fTkFNRVNQQUNFX18gX19UUkFJVF9fXCI7XG4gIHZhciBwaHBCdWlsdGluID0gXCJmdW5jX251bV9hcmdzIGZ1bmNfZ2V0X2FyZyBmdW5jX2dldF9hcmdzIHN0cmxlbiBzdHJjbXAgc3RybmNtcCBzdHJjYXNlY21wIHN0cm5jYXNlY21wIGVhY2ggZXJyb3JfcmVwb3J0aW5nIGRlZmluZSBkZWZpbmVkIHRyaWdnZXJfZXJyb3IgdXNlcl9lcnJvciBzZXRfZXJyb3JfaGFuZGxlciByZXN0b3JlX2Vycm9yX2hhbmRsZXIgZ2V0X2RlY2xhcmVkX2NsYXNzZXMgZ2V0X2xvYWRlZF9leHRlbnNpb25zIGV4dGVuc2lvbl9sb2FkZWQgZ2V0X2V4dGVuc2lvbl9mdW5jcyBkZWJ1Z19iYWNrdHJhY2UgY29uc3RhbnQgYmluMmhleCBoZXgyYmluIHNsZWVwIHVzbGVlcCB0aW1lIG1rdGltZSBnbW1rdGltZSBzdHJmdGltZSBnbXN0cmZ0aW1lIHN0cnRvdGltZSBkYXRlIGdtZGF0ZSBnZXRkYXRlIGxvY2FsdGltZSBjaGVja2RhdGUgZmx1c2ggd29yZHdyYXAgaHRtbHNwZWNpYWxjaGFycyBodG1sZW50aXRpZXMgaHRtbF9lbnRpdHlfZGVjb2RlIG1kNSBtZDVfZmlsZSBjcmMzMiBnZXRpbWFnZXNpemUgaW1hZ2VfdHlwZV90b19taW1lX3R5cGUgcGhwaW5mbyBwaHB2ZXJzaW9uIHBocGNyZWRpdHMgc3RybmF0Y21wIHN0cm5hdGNhc2VjbXAgc3Vic3RyX2NvdW50IHN0cnNwbiBzdHJjc3BuIHN0cnRvayBzdHJ0b3VwcGVyIHN0cnRvbG93ZXIgc3RycG9zIHN0cnJwb3Mgc3RycmV2IGhlYnJldiBoZWJyZXZjIG5sMmJyIGJhc2VuYW1lIGRpcm5hbWUgcGF0aGluZm8gc3RyaXBzbGFzaGVzIHN0cmlwY3NsYXNoZXMgc3Ryc3RyIHN0cmlzdHIgc3RycmNociBzdHJfc2h1ZmZsZSBzdHJfd29yZF9jb3VudCBzdHJjb2xsIHN1YnN0ciBzdWJzdHJfcmVwbGFjZSBxdW90ZW1ldGEgdWNmaXJzdCB1Y3dvcmRzIHN0cnRyIGFkZHNsYXNoZXMgYWRkY3NsYXNoZXMgcnRyaW0gc3RyX3JlcGxhY2Ugc3RyX3JlcGVhdCBjb3VudF9jaGFycyBjaHVua19zcGxpdCB0cmltIGx0cmltIHN0cmlwX3RhZ3Mgc2ltaWxhcl90ZXh0IGV4cGxvZGUgaW1wbG9kZSBzZXRsb2NhbGUgbG9jYWxlY29udiBwYXJzZV9zdHIgc3RyX3BhZCBjaG9wIHN0cmNociBzcHJpbnRmIHByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHNzY2FuZiBmc2NhbmYgcGFyc2VfdXJsIHVybGVuY29kZSB1cmxkZWNvZGUgcmF3dXJsZW5jb2RlIHJhd3VybGRlY29kZSByZWFkbGluayBsaW5raW5mbyBsaW5rIHVubGluayBleGVjIHN5c3RlbSBlc2NhcGVzaGVsbGNtZCBlc2NhcGVzaGVsbGFyZyBwYXNzdGhydSBzaGVsbF9leGVjIHByb2Nfb3BlbiBwcm9jX2Nsb3NlIHJhbmQgc3JhbmQgZ2V0cmFuZG1heCBtdF9yYW5kIG10X3NyYW5kIG10X2dldHJhbmRtYXggYmFzZTY0X2RlY29kZSBiYXNlNjRfZW5jb2RlIGFicyBjZWlsIGZsb29yIHJvdW5kIGlzX2Zpbml0ZSBpc19uYW4gaXNfaW5maW5pdGUgYmluZGVjIGhleGRlYyBvY3RkZWMgZGVjYmluIGRlY29jdCBkZWNoZXggYmFzZV9jb252ZXJ0IG51bWJlcl9mb3JtYXQgZm1vZCBpcDJsb25nIGxvbmcyaXAgZ2V0ZW52IHB1dGVudiBnZXRvcHQgbWljcm90aW1lIGdldHRpbWVvZmRheSBnZXRydXNhZ2UgdW5pcWlkIHF1b3RlZF9wcmludGFibGVfZGVjb2RlIHNldF90aW1lX2xpbWl0IGdldF9jZmdfdmFyIG1hZ2ljX3F1b3Rlc19ydW50aW1lIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSBnZXRfbWFnaWNfcXVvdGVzX2dwYyBnZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUgaW1wb3J0X3JlcXVlc3RfdmFyaWFibGVzIGVycm9yX2xvZyBzZXJpYWxpemUgdW5zZXJpYWxpemUgbWVtb3J5X2dldF91c2FnZSB2YXJfZHVtcCB2YXJfZXhwb3J0IGRlYnVnX3p2YWxfZHVtcCBwcmludF9yIGhpZ2hsaWdodF9maWxlIHNob3dfc291cmNlIGhpZ2hsaWdodF9zdHJpbmcgaW5pX2dldCBpbmlfZ2V0X2FsbCBpbmlfc2V0IGluaV9hbHRlciBpbmlfcmVzdG9yZSBnZXRfaW5jbHVkZV9wYXRoIHNldF9pbmNsdWRlX3BhdGggcmVzdG9yZV9pbmNsdWRlX3BhdGggc2V0Y29va2llIGhlYWRlciBoZWFkZXJzX3NlbnQgY29ubmVjdGlvbl9hYm9ydGVkIGNvbm5lY3Rpb25fc3RhdHVzIGlnbm9yZV91c2VyX2Fib3J0IHBhcnNlX2luaV9maWxlIGlzX3VwbG9hZGVkX2ZpbGUgbW92ZV91cGxvYWRlZF9maWxlIGludHZhbCBmbG9hdHZhbCBkb3VibGV2YWwgc3RydmFsIGdldHR5cGUgc2V0dHlwZSBpc19udWxsIGlzX3Jlc291cmNlIGlzX2Jvb2wgaXNfbG9uZyBpc19mbG9hdCBpc19pbnQgaXNfaW50ZWdlciBpc19kb3VibGUgaXNfcmVhbCBpc19udW1lcmljIGlzX3N0cmluZyBpc19hcnJheSBpc19vYmplY3QgaXNfc2NhbGFyIGVyZWcgZXJlZ19yZXBsYWNlIGVyZWdpIGVyZWdpX3JlcGxhY2Ugc3BsaXQgc3BsaXRpIGpvaW4gc3FsX3JlZ2Nhc2UgZGwgcGNsb3NlIHBvcGVuIHJlYWRmaWxlIHJld2luZCBybWRpciB1bWFzayBmY2xvc2UgZmVvZiBmZ2V0YyBmZ2V0cyBmZ2V0c3MgZnJlYWQgZm9wZW4gZnBhc3N0aHJ1IGZ0cnVuY2F0ZSBmc3RhdCBmc2VlayBmdGVsbCBmZmx1c2ggZndyaXRlIGZwdXRzIG1rZGlyIHJlbmFtZSBjb3B5IHRlbXBuYW0gdG1wZmlsZSBmaWxlIGZpbGVfZ2V0X2NvbnRlbnRzIGZpbGVfcHV0X2NvbnRlbnRzIHN0cmVhbV9zZWxlY3Qgc3RyZWFtX2NvbnRleHRfY3JlYXRlIHN0cmVhbV9jb250ZXh0X3NldF9wYXJhbXMgc3RyZWFtX2NvbnRleHRfc2V0X29wdGlvbiBzdHJlYW1fY29udGV4dF9nZXRfb3B0aW9ucyBzdHJlYW1fZmlsdGVyX3ByZXBlbmQgc3RyZWFtX2ZpbHRlcl9hcHBlbmQgZmdldGNzdiBmbG9jayBnZXRfbWV0YV90YWdzIHN0cmVhbV9zZXRfd3JpdGVfYnVmZmVyIHNldF9maWxlX2J1ZmZlciBzZXRfc29ja2V0X2Jsb2NraW5nIHN0cmVhbV9zZXRfYmxvY2tpbmcgc29ja2V0X3NldF9ibG9ja2luZyBzdHJlYW1fZ2V0X21ldGFfZGF0YSBzdHJlYW1fcmVnaXN0ZXJfd3JhcHBlciBzdHJlYW1fd3JhcHBlcl9yZWdpc3RlciBzdHJlYW1fc2V0X3RpbWVvdXQgc29ja2V0X3NldF90aW1lb3V0IHNvY2tldF9nZXRfc3RhdHVzIHJlYWxwYXRoIGZubWF0Y2ggZnNvY2tvcGVuIHBmc29ja29wZW4gcGFjayB1bnBhY2sgZ2V0X2Jyb3dzZXIgY3J5cHQgb3BlbmRpciBjbG9zZWRpciBjaGRpciBnZXRjd2QgcmV3aW5kZGlyIHJlYWRkaXIgZGlyIGdsb2IgZmlsZWF0aW1lIGZpbGVjdGltZSBmaWxlZ3JvdXAgZmlsZWlub2RlIGZpbGVtdGltZSBmaWxlb3duZXIgZmlsZXBlcm1zIGZpbGVzaXplIGZpbGV0eXBlIGZpbGVfZXhpc3RzIGlzX3dyaXRhYmxlIGlzX3dyaXRlYWJsZSBpc19yZWFkYWJsZSBpc19leGVjdXRhYmxlIGlzX2ZpbGUgaXNfZGlyIGlzX2xpbmsgc3RhdCBsc3RhdCBjaG93biB0b3VjaCBjbGVhcnN0YXRjYWNoZSBtYWlsIG9iX3N0YXJ0IG9iX2ZsdXNoIG9iX2NsZWFuIG9iX2VuZF9mbHVzaCBvYl9lbmRfY2xlYW4gb2JfZ2V0X2ZsdXNoIG9iX2dldF9jbGVhbiBvYl9nZXRfbGVuZ3RoIG9iX2dldF9sZXZlbCBvYl9nZXRfc3RhdHVzIG9iX2dldF9jb250ZW50cyBvYl9pbXBsaWNpdF9mbHVzaCBvYl9saXN0X2hhbmRsZXJzIGtzb3J0IGtyc29ydCBuYXRzb3J0IG5hdGNhc2Vzb3J0IGFzb3J0IGFyc29ydCBzb3J0IHJzb3J0IHVzb3J0IHVhc29ydCB1a3NvcnQgc2h1ZmZsZSBhcnJheV93YWxrIGNvdW50IGVuZCBwcmV2IG5leHQgcmVzZXQgY3VycmVudCBrZXkgbWluIG1heCBpbl9hcnJheSBhcnJheV9zZWFyY2ggZXh0cmFjdCBjb21wYWN0IGFycmF5X2ZpbGwgcmFuZ2UgYXJyYXlfbXVsdGlzb3J0IGFycmF5X3B1c2ggYXJyYXlfcG9wIGFycmF5X3NoaWZ0IGFycmF5X3Vuc2hpZnQgYXJyYXlfc3BsaWNlIGFycmF5X3NsaWNlIGFycmF5X21lcmdlIGFycmF5X21lcmdlX3JlY3Vyc2l2ZSBhcnJheV9rZXlzIGFycmF5X3ZhbHVlcyBhcnJheV9jb3VudF92YWx1ZXMgYXJyYXlfcmV2ZXJzZSBhcnJheV9yZWR1Y2UgYXJyYXlfcGFkIGFycmF5X2ZsaXAgYXJyYXlfY2hhbmdlX2tleV9jYXNlIGFycmF5X3JhbmQgYXJyYXlfdW5pcXVlIGFycmF5X2ludGVyc2VjdCBhcnJheV9pbnRlcnNlY3RfYXNzb2MgYXJyYXlfZGlmZiBhcnJheV9kaWZmX2Fzc29jIGFycmF5X3N1bSBhcnJheV9maWx0ZXIgYXJyYXlfbWFwIGFycmF5X2NodW5rIGFycmF5X2tleV9leGlzdHMgYXJyYXlfaW50ZXJzZWN0X2tleSBhcnJheV9jb21iaW5lIGFycmF5X2NvbHVtbiBwb3Mgc2l6ZW9mIGtleV9leGlzdHMgYXNzZXJ0IGFzc2VydF9vcHRpb25zIHZlcnNpb25fY29tcGFyZSBmdG9rIHN0cl9yb3QxMyBhZ2dyZWdhdGUgc2Vzc2lvbl9uYW1lIHNlc3Npb25fbW9kdWxlX25hbWUgc2Vzc2lvbl9zYXZlX3BhdGggc2Vzc2lvbl9pZCBzZXNzaW9uX3JlZ2VuZXJhdGVfaWQgc2Vzc2lvbl9kZWNvZGUgc2Vzc2lvbl9yZWdpc3RlciBzZXNzaW9uX3VucmVnaXN0ZXIgc2Vzc2lvbl9pc19yZWdpc3RlcmVkIHNlc3Npb25fZW5jb2RlIHNlc3Npb25fc3RhcnQgc2Vzc2lvbl9kZXN0cm95IHNlc3Npb25fdW5zZXQgc2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyIHNlc3Npb25fY2FjaGVfbGltaXRlciBzZXNzaW9uX2NhY2hlX2V4cGlyZSBzZXNzaW9uX3NldF9jb29raWVfcGFyYW1zIHNlc3Npb25fZ2V0X2Nvb2tpZV9wYXJhbXMgc2Vzc2lvbl93cml0ZV9jbG9zZSBwcmVnX21hdGNoIHByZWdfbWF0Y2hfYWxsIHByZWdfcmVwbGFjZSBwcmVnX3JlcGxhY2VfY2FsbGJhY2sgcHJlZ19zcGxpdCBwcmVnX3F1b3RlIHByZWdfZ3JlcCBvdmVybG9hZCBjdHlwZV9hbG51bSBjdHlwZV9hbHBoYSBjdHlwZV9jbnRybCBjdHlwZV9kaWdpdCBjdHlwZV9sb3dlciBjdHlwZV9ncmFwaCBjdHlwZV9wcmludCBjdHlwZV9wdW5jdCBjdHlwZV9zcGFjZSBjdHlwZV91cHBlciBjdHlwZV94ZGlnaXQgdmlydHVhbCBhcGFjaGVfcmVxdWVzdF9oZWFkZXJzIGFwYWNoZV9ub3RlIGFwYWNoZV9sb29rdXBfdXJpIGFwYWNoZV9jaGlsZF90ZXJtaW5hdGUgYXBhY2hlX3NldGVudiBhcGFjaGVfcmVzcG9uc2VfaGVhZGVycyBhcGFjaGVfZ2V0X3ZlcnNpb24gZ2V0YWxsaGVhZGVycyBteXNxbF9jb25uZWN0IG15c3FsX3Bjb25uZWN0IG15c3FsX2Nsb3NlIG15c3FsX3NlbGVjdF9kYiBteXNxbF9jcmVhdGVfZGIgbXlzcWxfZHJvcF9kYiBteXNxbF9xdWVyeSBteXNxbF91bmJ1ZmZlcmVkX3F1ZXJ5IG15c3FsX2RiX3F1ZXJ5IG15c3FsX2xpc3RfZGJzIG15c3FsX2xpc3RfdGFibGVzIG15c3FsX2xpc3RfZmllbGRzIG15c3FsX2xpc3RfcHJvY2Vzc2VzIG15c3FsX2Vycm9yIG15c3FsX2Vycm5vIG15c3FsX2FmZmVjdGVkX3Jvd3MgbXlzcWxfaW5zZXJ0X2lkIG15c3FsX3Jlc3VsdCBteXNxbF9udW1fcm93cyBteXNxbF9udW1fZmllbGRzIG15c3FsX2ZldGNoX3JvdyBteXNxbF9mZXRjaF9hcnJheSBteXNxbF9mZXRjaF9hc3NvYyBteXNxbF9mZXRjaF9vYmplY3QgbXlzcWxfZGF0YV9zZWVrIG15c3FsX2ZldGNoX2xlbmd0aHMgbXlzcWxfZmV0Y2hfZmllbGQgbXlzcWxfZmllbGRfc2VlayBteXNxbF9mcmVlX3Jlc3VsdCBteXNxbF9maWVsZF9uYW1lIG15c3FsX2ZpZWxkX3RhYmxlIG15c3FsX2ZpZWxkX2xlbiBteXNxbF9maWVsZF90eXBlIG15c3FsX2ZpZWxkX2ZsYWdzIG15c3FsX2VzY2FwZV9zdHJpbmcgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nIG15c3FsX3N0YXQgbXlzcWxfdGhyZWFkX2lkIG15c3FsX2NsaWVudF9lbmNvZGluZyBteXNxbF9nZXRfY2xpZW50X2luZm8gbXlzcWxfZ2V0X2hvc3RfaW5mbyBteXNxbF9nZXRfcHJvdG9faW5mbyBteXNxbF9nZXRfc2VydmVyX2luZm8gbXlzcWxfaW5mbyBteXNxbCBteXNxbF9maWVsZG5hbWUgbXlzcWxfZmllbGR0YWJsZSBteXNxbF9maWVsZGxlbiBteXNxbF9maWVsZHR5cGUgbXlzcWxfZmllbGRmbGFncyBteXNxbF9zZWxlY3RkYiBteXNxbF9jcmVhdGVkYiBteXNxbF9kcm9wZGIgbXlzcWxfZnJlZXJlc3VsdCBteXNxbF9udW1maWVsZHMgbXlzcWxfbnVtcm93cyBteXNxbF9saXN0ZGJzIG15c3FsX2xpc3R0YWJsZXMgbXlzcWxfbGlzdGZpZWxkcyBteXNxbF9kYl9uYW1lIG15c3FsX2RibmFtZSBteXNxbF90YWJsZW5hbWUgbXlzcWxfdGFibGVfbmFtZSBwZ19jb25uZWN0IHBnX3Bjb25uZWN0IHBnX2Nsb3NlIHBnX2Nvbm5lY3Rpb25fc3RhdHVzIHBnX2Nvbm5lY3Rpb25fYnVzeSBwZ19jb25uZWN0aW9uX3Jlc2V0IHBnX2hvc3QgcGdfZGJuYW1lIHBnX3BvcnQgcGdfdHR5IHBnX29wdGlvbnMgcGdfcGluZyBwZ19xdWVyeSBwZ19zZW5kX3F1ZXJ5IHBnX2NhbmNlbF9xdWVyeSBwZ19mZXRjaF9yZXN1bHQgcGdfZmV0Y2hfcm93IHBnX2ZldGNoX2Fzc29jIHBnX2ZldGNoX2FycmF5IHBnX2ZldGNoX29iamVjdCBwZ19mZXRjaF9hbGwgcGdfYWZmZWN0ZWRfcm93cyBwZ19nZXRfcmVzdWx0IHBnX3Jlc3VsdF9zZWVrIHBnX3Jlc3VsdF9zdGF0dXMgcGdfZnJlZV9yZXN1bHQgcGdfbGFzdF9vaWQgcGdfbnVtX3Jvd3MgcGdfbnVtX2ZpZWxkcyBwZ19maWVsZF9uYW1lIHBnX2ZpZWxkX251bSBwZ19maWVsZF9zaXplIHBnX2ZpZWxkX3R5cGUgcGdfZmllbGRfcHJ0bGVuIHBnX2ZpZWxkX2lzX251bGwgcGdfZ2V0X25vdGlmeSBwZ19nZXRfcGlkIHBnX3Jlc3VsdF9lcnJvciBwZ19sYXN0X2Vycm9yIHBnX2xhc3Rfbm90aWNlIHBnX3B1dF9saW5lIHBnX2VuZF9jb3B5IHBnX2NvcHlfdG8gcGdfY29weV9mcm9tIHBnX3RyYWNlIHBnX3VudHJhY2UgcGdfbG9fY3JlYXRlIHBnX2xvX3VubGluayBwZ19sb19vcGVuIHBnX2xvX2Nsb3NlIHBnX2xvX3JlYWQgcGdfbG9fd3JpdGUgcGdfbG9fcmVhZF9hbGwgcGdfbG9faW1wb3J0IHBnX2xvX2V4cG9ydCBwZ19sb19zZWVrIHBnX2xvX3RlbGwgcGdfZXNjYXBlX3N0cmluZyBwZ19lc2NhcGVfYnl0ZWEgcGdfdW5lc2NhcGVfYnl0ZWEgcGdfY2xpZW50X2VuY29kaW5nIHBnX3NldF9jbGllbnRfZW5jb2RpbmcgcGdfbWV0YV9kYXRhIHBnX2NvbnZlcnQgcGdfaW5zZXJ0IHBnX3VwZGF0ZSBwZ19kZWxldGUgcGdfc2VsZWN0IHBnX2V4ZWMgcGdfZ2V0bGFzdG9pZCBwZ19jbWR0dXBsZXMgcGdfZXJyb3JtZXNzYWdlIHBnX251bXJvd3MgcGdfbnVtZmllbGRzIHBnX2ZpZWxkbmFtZSBwZ19maWVsZHNpemUgcGdfZmllbGR0eXBlIHBnX2ZpZWxkbnVtIHBnX2ZpZWxkcHJ0bGVuIHBnX2ZpZWxkaXNudWxsIHBnX2ZyZWVyZXN1bHQgcGdfcmVzdWx0IHBnX2xvcmVhZGFsbCBwZ19sb2NyZWF0ZSBwZ19sb3VubGluayBwZ19sb29wZW4gcGdfbG9jbG9zZSBwZ19sb3JlYWQgcGdfbG93cml0ZSBwZ19sb2ltcG9ydCBwZ19sb2V4cG9ydCBodHRwX3Jlc3BvbnNlX2NvZGUgZ2V0X2RlY2xhcmVkX3RyYWl0cyBnZXRpbWFnZXNpemVmcm9tc3RyaW5nIHNvY2tldF9pbXBvcnRfc3RyZWFtIHN0cmVhbV9zZXRfY2h1bmtfc2l6ZSB0cmFpdF9leGlzdHMgaGVhZGVyX3JlZ2lzdGVyX2NhbGxiYWNrIGNsYXNzX3VzZXMgc2Vzc2lvbl9zdGF0dXMgc2Vzc2lvbl9yZWdpc3Rlcl9zaHV0ZG93biBlY2hvIHByaW50IGdsb2JhbCBzdGF0aWMgZXhpdCBhcnJheSBlbXB0eSBldmFsIGlzc2V0IHVuc2V0IGRpZSBpbmNsdWRlIHJlcXVpcmUgaW5jbHVkZV9vbmNlIHJlcXVpcmVfb25jZSBqc29uX2RlY29kZSBqc29uX2VuY29kZSBqc29uX2xhc3RfZXJyb3IganNvbl9sYXN0X2Vycm9yX21zZyBjdXJsX2Nsb3NlIGN1cmxfY29weV9oYW5kbGUgY3VybF9lcnJubyBjdXJsX2Vycm9yIGN1cmxfZXNjYXBlIGN1cmxfZXhlYyBjdXJsX2ZpbGVfY3JlYXRlIGN1cmxfZ2V0aW5mbyBjdXJsX2luaXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlIGN1cmxfbXVsdGlfY2xvc2UgY3VybF9tdWx0aV9leGVjIGN1cmxfbXVsdGlfZ2V0Y29udGVudCBjdXJsX211bHRpX2luZm9fcmVhZCBjdXJsX211bHRpX2luaXQgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlIGN1cmxfbXVsdGlfc2VsZWN0IGN1cmxfbXVsdGlfc2V0b3B0IGN1cmxfbXVsdGlfc3RyZXJyb3IgY3VybF9wYXVzZSBjdXJsX3Jlc2V0IGN1cmxfc2V0b3B0X2FycmF5IGN1cmxfc2V0b3B0IGN1cmxfc2hhcmVfY2xvc2UgY3VybF9zaGFyZV9pbml0IGN1cmxfc2hhcmVfc2V0b3B0IGN1cmxfc3RyZXJyb3IgY3VybF91bmVzY2FwZSBjdXJsX3ZlcnNpb24gbXlzcWxpX2FmZmVjdGVkX3Jvd3MgbXlzcWxpX2F1dG9jb21taXQgbXlzcWxpX2NoYW5nZV91c2VyIG15c3FsaV9jaGFyYWN0ZXJfc2V0X25hbWUgbXlzcWxpX2Nsb3NlIG15c3FsaV9jb21taXQgbXlzcWxpX2Nvbm5lY3RfZXJybm8gbXlzcWxpX2Nvbm5lY3RfZXJyb3IgbXlzcWxpX2Nvbm5lY3QgbXlzcWxpX2RhdGFfc2VlayBteXNxbGlfZGVidWcgbXlzcWxpX2R1bXBfZGVidWdfaW5mbyBteXNxbGlfZXJybm8gbXlzcWxpX2Vycm9yX2xpc3QgbXlzcWxpX2Vycm9yIG15c3FsaV9mZXRjaF9hbGwgbXlzcWxpX2ZldGNoX2FycmF5IG15c3FsaV9mZXRjaF9hc3NvYyBteXNxbGlfZmV0Y2hfZmllbGRfZGlyZWN0IG15c3FsaV9mZXRjaF9maWVsZCBteXNxbGlfZmV0Y2hfZmllbGRzIG15c3FsaV9mZXRjaF9sZW5ndGhzIG15c3FsaV9mZXRjaF9vYmplY3QgbXlzcWxpX2ZldGNoX3JvdyBteXNxbGlfZmllbGRfY291bnQgbXlzcWxpX2ZpZWxkX3NlZWsgbXlzcWxpX2ZpZWxkX3RlbGwgbXlzcWxpX2ZyZWVfcmVzdWx0IG15c3FsaV9nZXRfY2hhcnNldCBteXNxbGlfZ2V0X2NsaWVudF9pbmZvIG15c3FsaV9nZXRfY2xpZW50X3N0YXRzIG15c3FsaV9nZXRfY2xpZW50X3ZlcnNpb24gbXlzcWxpX2dldF9jb25uZWN0aW9uX3N0YXRzIG15c3FsaV9nZXRfaG9zdF9pbmZvIG15c3FsaV9nZXRfcHJvdG9faW5mbyBteXNxbGlfZ2V0X3NlcnZlcl9pbmZvIG15c3FsaV9nZXRfc2VydmVyX3ZlcnNpb24gbXlzcWxpX2luZm8gbXlzcWxpX2luaXQgbXlzcWxpX2luc2VydF9pZCBteXNxbGlfa2lsbCBteXNxbGlfbW9yZV9yZXN1bHRzIG15c3FsaV9tdWx0aV9xdWVyeSBteXNxbGlfbmV4dF9yZXN1bHQgbXlzcWxpX251bV9maWVsZHMgbXlzcWxpX251bV9yb3dzIG15c3FsaV9vcHRpb25zIG15c3FsaV9waW5nIG15c3FsaV9wcmVwYXJlIG15c3FsaV9xdWVyeSBteXNxbGlfcmVhbF9jb25uZWN0IG15c3FsaV9yZWFsX2VzY2FwZV9zdHJpbmcgbXlzcWxpX3JlYWxfcXVlcnkgbXlzcWxpX3JlYXBfYXN5bmNfcXVlcnkgbXlzcWxpX3JlZnJlc2ggbXlzcWxpX3JvbGxiYWNrIG15c3FsaV9zZWxlY3RfZGIgbXlzcWxpX3NldF9jaGFyc2V0IG15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2RlZmF1bHQgbXlzcWxpX3NldF9sb2NhbF9pbmZpbGVfaGFuZGxlciBteXNxbGlfc3Fsc3RhdGUgbXlzcWxpX3NzbF9zZXQgbXlzcWxpX3N0YXQgbXlzcWxpX3N0bXRfaW5pdCBteXNxbGlfc3RvcmVfcmVzdWx0IG15c3FsaV90aHJlYWRfaWQgbXlzcWxpX3RocmVhZF9zYWZlIG15c3FsaV91c2VfcmVzdWx0IG15c3FsaV93YXJuaW5nX2NvdW50XCI7XG4gIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoXCJoaW50V29yZHNcIiwgXCJwaHBcIiwgW3BocEtleXdvcmRzLCBwaHBBdG9tcywgcGhwQnVpbHRpbl0uam9pbihcIiBcIikuc3BsaXQoXCIgXCIpKTtcbiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcIndvcmRDaGFyc1wiLCBcInBocFwiLCAvW1xcdyRdLyk7XG5cbiAgdmFyIHBocENvbmZpZyA9IHtcbiAgICBuYW1lOiBcImNsaWtlXCIsXG4gICAgaGVscGVyVHlwZTogXCJwaHBcIixcbiAgICBrZXl3b3Jkczoga2V5d29yZHMocGhwS2V5d29yZHMpLFxuICAgIGJsb2NrS2V5d29yZHM6IGtleXdvcmRzKFwiY2F0Y2ggZG8gZWxzZSBlbHNlaWYgZm9yIGZvcmVhY2ggaWYgc3dpdGNoIHRyeSB3aGlsZSBmaW5hbGx5XCIpLFxuICAgIGRlZktleXdvcmRzOiBrZXl3b3JkcyhcImNsYXNzIGZ1bmN0aW9uIGludGVyZmFjZSBuYW1lc3BhY2UgdHJhaXRcIiksXG4gICAgYXRvbXM6IGtleXdvcmRzKHBocEF0b21zKSxcbiAgICBidWlsdGluOiBrZXl3b3JkcyhwaHBCdWlsdGluKSxcbiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxuICAgIGhvb2tzOiB7XG4gICAgICBcIiRcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcJF9dLyk7XG4gICAgICAgIHJldHVybiBcInZhcmlhYmxlLTJcIjtcbiAgICAgIH0sXG4gICAgICBcIjxcIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICB2YXIgYmVmb3JlO1xuICAgICAgICBpZiAoYmVmb3JlID0gc3RyZWFtLm1hdGNoKC88PFxccyovKSkge1xuICAgICAgICAgIHZhciBxdW90ZWQgPSBzdHJlYW0uZWF0KC9bJ1wiXS8pO1xuICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcLl0vKTtcbiAgICAgICAgICB2YXIgZGVsaW0gPSBzdHJlYW0uY3VycmVudCgpLnNsaWNlKGJlZm9yZVswXS5sZW5ndGggKyAocXVvdGVkID8gMiA6IDEpKTtcbiAgICAgICAgICBpZiAocXVvdGVkKSBzdHJlYW0uZWF0KHF1b3RlZCk7XG4gICAgICAgICAgaWYgKGRlbGltKSB7XG4gICAgICAgICAgICAoc3RhdGUudG9rU3RhY2sgfHwgKHN0YXRlLnRva1N0YWNrID0gW10pKS5wdXNoKGRlbGltLCAwKTtcbiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcGhwU3RyaW5nKGRlbGltLCBxdW90ZWQgIT0gXCInXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBcIiNcIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goXCI/PlwiLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgICAgIH0sXG4gICAgICBcIi9cIjogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiL1wiKSkge1xuICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goXCI/PlwiLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICAnXCInOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICAoc3RhdGUudG9rU3RhY2sgfHwgKHN0YXRlLnRva1N0YWNrID0gW10pKS5wdXNoKCdcIicsIDApO1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZygnXCInKTtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9LFxuICAgICAgXCJ7XCI6IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS50b2tTdGFjayAmJiBzdGF0ZS50b2tTdGFjay5sZW5ndGgpXG4gICAgICAgICAgc3RhdGUudG9rU3RhY2tbc3RhdGUudG9rU3RhY2subGVuZ3RoIC0gMV0rKztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIFwifVwiOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUudG9rU3RhY2sgJiYgc3RhdGUudG9rU3RhY2subGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIS0tc3RhdGUudG9rU3RhY2tbc3RhdGUudG9rU3RhY2subGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZyhzdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAyXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1vZGUoXCJwaHBcIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAocGFyc2VyQ29uZmlnICYmIHBhcnNlckNvbmZpZy5odG1sTW9kZSkgfHwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgdmFyIHBocE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBwaHBDb25maWcpO1xuXG4gICAgZnVuY3Rpb24gZGlzcGF0Y2goc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGlzUEhQID0gc3RhdGUuY3VyTW9kZSA9PSBwaHBNb2RlO1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdGF0ZS5wZW5kaW5nICYmIHN0YXRlLnBlbmRpbmcgIT0gJ1wiJyAmJiBzdGF0ZS5wZW5kaW5nICE9IFwiJ1wiKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIGlmICghaXNQSFApIHtcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjxcXD9cXHcqLykpIHtcbiAgICAgICAgICBzdGF0ZS5jdXJNb2RlID0gcGhwTW9kZTtcbiAgICAgICAgICBpZiAoIXN0YXRlLnBocCkgc3RhdGUucGhwID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKHBocE1vZGUsIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sLCBcIlwiKSlcbiAgICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLnBocDtcbiAgICAgICAgICByZXR1cm4gXCJtZXRhXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnBlbmRpbmcgPT0gJ1wiJyB8fCBzdGF0ZS5wZW5kaW5nID09IFwiJ1wiKSB7XG4gICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLm5leHQoKSAhPSBzdGF0ZS5wZW5kaW5nKSB7fVxuICAgICAgICAgIHZhciBzdHlsZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUucGVuZGluZyAmJiBzdHJlYW0ucG9zIDwgc3RhdGUucGVuZGluZy5lbmQpIHtcbiAgICAgICAgICBzdHJlYW0ucG9zID0gc3RhdGUucGVuZGluZy5lbmQ7XG4gICAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUucGVuZGluZy5zdHlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBodG1sTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmN1clN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUucGVuZGluZykgc3RhdGUucGVuZGluZyA9IG51bGw7XG4gICAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLCBvcGVuUEhQID0gY3VyLnNlYXJjaCgvPFxcPy8pLCBtO1xuICAgICAgICBpZiAob3BlblBIUCAhPSAtMSkge1xuICAgICAgICAgIGlmIChzdHlsZSA9PSBcInN0cmluZ1wiICYmIChtID0gY3VyLm1hdGNoKC9bXFwnXFxcIl0kLykpICYmICEvXFw/Pi8udGVzdChjdXIpKSBzdGF0ZS5wZW5kaW5nID0gbVswXTtcbiAgICAgICAgICBlbHNlIHN0YXRlLnBlbmRpbmcgPSB7ZW5kOiBzdHJlYW0ucG9zLCBzdHlsZTogc3R5bGV9O1xuICAgICAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCAtIG9wZW5QSFApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQSFAgJiYgc3RhdGUucGhwLnRva2VuaXplID09IG51bGwgJiYgc3RyZWFtLm1hdGNoKFwiPz5cIikpIHtcbiAgICAgICAgc3RhdGUuY3VyTW9kZSA9IGh0bWxNb2RlO1xuICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLmh0bWw7XG4gICAgICAgIGlmICghc3RhdGUucGhwLmNvbnRleHQucHJldikgc3RhdGUucGhwID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIFwibWV0YVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBocE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSlcbiAgICAgICAgdmFyIHBocCA9IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocGhwTW9kZSkgOiBudWxsXG4gICAgICAgIHJldHVybiB7aHRtbDogaHRtbCxcbiAgICAgICAgICAgICAgICBwaHA6IHBocCxcbiAgICAgICAgICAgICAgICBjdXJNb2RlOiBwYXJzZXJDb25maWcuc3RhcnRPcGVuID8gcGhwTW9kZSA6IGh0bWxNb2RlLFxuICAgICAgICAgICAgICAgIGN1clN0YXRlOiBwYXJzZXJDb25maWcuc3RhcnRPcGVuID8gcGhwIDogaHRtbCxcbiAgICAgICAgICAgICAgICBwZW5kaW5nOiBudWxsfTtcbiAgICAgIH0sXG5cbiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBzdGF0ZS5odG1sLCBodG1sTmV3ID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoaHRtbE1vZGUsIGh0bWwpLFxuICAgICAgICAgICAgcGhwID0gc3RhdGUucGhwLCBwaHBOZXcgPSBwaHAgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUocGhwTW9kZSwgcGhwKSwgY3VyO1xuICAgICAgICBpZiAoc3RhdGUuY3VyTW9kZSA9PSBodG1sTW9kZSkgY3VyID0gaHRtbE5ldztcbiAgICAgICAgZWxzZSBjdXIgPSBwaHBOZXc7XG4gICAgICAgIHJldHVybiB7aHRtbDogaHRtbE5ldywgcGhwOiBwaHBOZXcsIGN1ck1vZGU6IHN0YXRlLmN1ck1vZGUsIGN1clN0YXRlOiBjdXIsXG4gICAgICAgICAgICAgICAgcGVuZGluZzogc3RhdGUucGVuZGluZ307XG4gICAgICB9LFxuXG4gICAgICB0b2tlbjogZGlzcGF0Y2gsXG5cbiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikge1xuICAgICAgICBpZiAoKHN0YXRlLmN1ck1vZGUgIT0gcGhwTW9kZSAmJiAvXlxccyo8XFwvLy50ZXN0KHRleHRBZnRlcikpIHx8XG4gICAgICAgICAgICAoc3RhdGUuY3VyTW9kZSA9PSBwaHBNb2RlICYmIC9eXFw/Pi8udGVzdCh0ZXh0QWZ0ZXIpKSlcbiAgICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWwsIHRleHRBZnRlcik7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJNb2RlLmluZGVudChzdGF0ZS5jdXJTdGF0ZSwgdGV4dEFmdGVyKTtcbiAgICAgIH0sXG5cbiAgICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBcIi8qXCIsXG4gICAgICBibG9ja0NvbW1lbnRFbmQ6IFwiKi9cIixcbiAgICAgIGxpbmVDb21tZW50OiBcIi8vXCIsXG5cbiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuY3VyU3RhdGUsIG1vZGU6IHN0YXRlLmN1ck1vZGV9OyB9XG4gICAgfTtcbiAgfSwgXCJodG1sbWl4ZWRcIiwgXCJjbGlrZVwiKTtcblxuICBDb2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocFwiLCBcInBocFwiKTtcbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwiYXBwbGljYXRpb24veC1odHRwZC1waHAtb3BlblwiLCB7bmFtZTogXCJwaHBcIiwgc3RhcnRPcGVuOiB0cnVlfSk7XG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1waHBcIiwgcGhwQ29uZmlnKTtcbn0pO1xuXG4vKiMgc291cmNlVVJMPWNtX21vZGVzL3BocC5qcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNtX21vZGVzL3B5dGhvbi5qcyJdPSIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oKFwiICsgd29yZHMuam9pbihcIil8KFwiKSArIFwiKSlcXFxcYlwiKTtcbiAgfVxuXG4gIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbXCJhbmRcIiwgXCJvclwiLCBcIm5vdFwiLCBcImlzXCJdKTtcbiAgdmFyIGNvbW1vbktleXdvcmRzID0gW1wiYXNcIiwgXCJhc3NlcnRcIiwgXCJicmVha1wiLCBcImNsYXNzXCIsIFwiY29udGludWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVmXCIsIFwiZGVsXCIsIFwiZWxpZlwiLCBcImVsc2VcIiwgXCJleGNlcHRcIiwgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZvclwiLCBcImZyb21cIiwgXCJnbG9iYWxcIiwgXCJpZlwiLCBcImltcG9ydFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYW1iZGFcIiwgXCJwYXNzXCIsIFwicmFpc2VcIiwgXCJyZXR1cm5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHJ5XCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIiwgXCJpblwiXTtcbiAgdmFyIGNvbW1vbkJ1aWx0aW5zID0gW1wiYWJzXCIsIFwiYWxsXCIsIFwiYW55XCIsIFwiYmluXCIsIFwiYm9vbFwiLCBcImJ5dGVhcnJheVwiLCBcImNhbGxhYmxlXCIsIFwiY2hyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzbWV0aG9kXCIsIFwiY29tcGlsZVwiLCBcImNvbXBsZXhcIiwgXCJkZWxhdHRyXCIsIFwiZGljdFwiLCBcImRpclwiLCBcImRpdm1vZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnVtZXJhdGVcIiwgXCJldmFsXCIsIFwiZmlsdGVyXCIsIFwiZmxvYXRcIiwgXCJmb3JtYXRcIiwgXCJmcm96ZW5zZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2V0YXR0clwiLCBcImdsb2JhbHNcIiwgXCJoYXNhdHRyXCIsIFwiaGFzaFwiLCBcImhlbHBcIiwgXCJoZXhcIiwgXCJpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dFwiLCBcImludFwiLCBcImlzaW5zdGFuY2VcIiwgXCJpc3N1YmNsYXNzXCIsIFwiaXRlclwiLCBcImxlblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0XCIsIFwibG9jYWxzXCIsIFwibWFwXCIsIFwibWF4XCIsIFwibWVtb3J5dmlld1wiLCBcIm1pblwiLCBcIm5leHRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib2JqZWN0XCIsIFwib2N0XCIsIFwib3BlblwiLCBcIm9yZFwiLCBcInBvd1wiLCBcInByb3BlcnR5XCIsIFwicmFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVwclwiLCBcInJldmVyc2VkXCIsIFwicm91bmRcIiwgXCJzZXRcIiwgXCJzZXRhdHRyXCIsIFwic2xpY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic29ydGVkXCIsIFwic3RhdGljbWV0aG9kXCIsIFwic3RyXCIsIFwic3VtXCIsIFwic3VwZXJcIiwgXCJ0dXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCIsIFwidmFyc1wiLCBcInppcFwiLCBcIl9faW1wb3J0X19cIiwgXCJOb3RJbXBsZW1lbnRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFbGxpcHNpc1wiLCBcIl9fZGVidWdfX1wiXTtcbiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcihcImhpbnRXb3Jkc1wiLCBcInB5dGhvblwiLCBjb21tb25LZXl3b3Jkcy5jb25jYXQoY29tbW9uQnVpbHRpbnMpKTtcblxuICBmdW5jdGlvbiB0b3Aoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2NvcGVzW3N0YXRlLnNjb3Blcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIENvZGVNaXJyb3IuZGVmaW5lTW9kZShcInB5dGhvblwiLCBmdW5jdGlvbihjb25mLCBwYXJzZXJDb25mKSB7XG4gICAgdmFyIEVSUk9SQ0xBU1MgPSBcImVycm9yXCI7XG5cbiAgICB2YXIgZGVsaW1pdGVycyA9IHBhcnNlckNvbmYuZGVsaW1pdGVycyB8fCBwYXJzZXJDb25mLnNpbmdsZURlbGltaXRlcnMgfHwgL15bXFwoXFwpXFxbXFxdXFx7XFx9QCw6YD07XFwuXS87XG4gICAgLy8gICAgICAgICAgICAgICAoQmFja3dhcmRzLWNvbXBhdGlibGl0eSB3aXRoIG9sZCwgY3VtYmVyc29tZSBjb25maWcgc3lzdGVtKVxuICAgIHZhciBvcGVyYXRvcnMgPSBbcGFyc2VyQ29uZi5zaW5nbGVPcGVyYXRvcnMsIHBhcnNlckNvbmYuZG91YmxlT3BlcmF0b3JzLCBwYXJzZXJDb25mLmRvdWJsZURlbGltaXRlcnMsIHBhcnNlckNvbmYudHJpcGxlRGVsaW1pdGVycyxcbiAgICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbmYub3BlcmF0b3JzIHx8IC9eKFstKyovJVxcLyZ8Xl09P3xbPD49XSt8XFwvXFwvPT98XFwqXFwqPT98IT18W34hQF0pL11cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wZXJhdG9ycy5sZW5ndGg7IGkrKykgaWYgKCFvcGVyYXRvcnNbaV0pIG9wZXJhdG9ycy5zcGxpY2UoaS0tLCAxKVxuXG4gICAgdmFyIGhhbmdpbmdJbmRlbnQgPSBwYXJzZXJDb25mLmhhbmdpbmdJbmRlbnQgfHwgY29uZi5pbmRlbnRVbml0O1xuXG4gICAgdmFyIG15S2V5d29yZHMgPSBjb21tb25LZXl3b3JkcywgbXlCdWlsdGlucyA9IGNvbW1vbkJ1aWx0aW5zO1xuICAgIGlmIChwYXJzZXJDb25mLmV4dHJhX2tleXdvcmRzICE9IHVuZGVmaW5lZClcbiAgICAgIG15S2V5d29yZHMgPSBteUtleXdvcmRzLmNvbmNhdChwYXJzZXJDb25mLmV4dHJhX2tleXdvcmRzKTtcblxuICAgIGlmIChwYXJzZXJDb25mLmV4dHJhX2J1aWx0aW5zICE9IHVuZGVmaW5lZClcbiAgICAgIG15QnVpbHRpbnMgPSBteUJ1aWx0aW5zLmNvbmNhdChwYXJzZXJDb25mLmV4dHJhX2J1aWx0aW5zKTtcblxuICAgIHZhciBweTMgPSAhKHBhcnNlckNvbmYudmVyc2lvbiAmJiBOdW1iZXIocGFyc2VyQ29uZi52ZXJzaW9uKSA8IDMpXG4gICAgaWYgKHB5Mykge1xuICAgICAgLy8gc2luY2UgaHR0cDovL2xlZ2FjeS5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDY1LyBAIGlzIGFsc28gYW4gb3BlcmF0b3JcbiAgICAgIHZhciBpZGVudGlmaWVycyA9IHBhcnNlckNvbmYuaWRlbnRpZmllcnN8fCAvXltfQS1aYS16XFx1MDBBMS1cXHVGRkZGXVtfQS1aYS16MC05XFx1MDBBMS1cXHVGRkZGXSovO1xuICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KFtcIm5vbmxvY2FsXCIsIFwiRmFsc2VcIiwgXCJUcnVlXCIsIFwiTm9uZVwiLCBcImFzeW5jXCIsIFwiYXdhaXRcIl0pO1xuICAgICAgbXlCdWlsdGlucyA9IG15QnVpbHRpbnMuY29uY2F0KFtcImFzY2lpXCIsIFwiYnl0ZXNcIiwgXCJleGVjXCIsIFwicHJpbnRcIl0pO1xuICAgICAgdmFyIHN0cmluZ1ByZWZpeGVzID0gbmV3IFJlZ0V4cChcIl4oKFtyYnVmXXwoYnIpKT8oJ3szfXxcXFwiezN9fFsnXFxcIl0pKVwiLCBcImlcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpZGVudGlmaWVycyA9IHBhcnNlckNvbmYuaWRlbnRpZmllcnN8fCAvXltfQS1aYS16XVtfQS1aYS16MC05XSovO1xuICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KFtcImV4ZWNcIiwgXCJwcmludFwiXSk7XG4gICAgICBteUJ1aWx0aW5zID0gbXlCdWlsdGlucy5jb25jYXQoW1wiYXBwbHlcIiwgXCJiYXNlc3RyaW5nXCIsIFwiYnVmZmVyXCIsIFwiY21wXCIsIFwiY29lcmNlXCIsIFwiZXhlY2ZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlXCIsIFwiaW50ZXJuXCIsIFwibG9uZ1wiLCBcInJhd19pbnB1dFwiLCBcInJlZHVjZVwiLCBcInJlbG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInVuaWNoclwiLCBcInVuaWNvZGVcIiwgXCJ4cmFuZ2VcIiwgXCJGYWxzZVwiLCBcIlRydWVcIiwgXCJOb25lXCJdKTtcbiAgICAgIHZhciBzdHJpbmdQcmVmaXhlcyA9IG5ldyBSZWdFeHAoXCJeKChbcnViZl18KHVyKXwoYnIpKT8oJ3szfXxcXFwiezN9fFsnXFxcIl0pKVwiLCBcImlcIik7XG4gICAgfVxuICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAobXlLZXl3b3Jkcyk7XG4gICAgdmFyIGJ1aWx0aW5zID0gd29yZFJlZ2V4cChteUJ1aWx0aW5zKTtcblxuICAgIC8vIHRva2VuaXplcnNcbiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0cmVhbS5zb2woKSkgc3RhdGUuaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKClcbiAgICAgIC8vIEhhbmRsZSBzY29wZSBjaGFuZ2VzXG4gICAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHRvcChzdGF0ZSkudHlwZSA9PSBcInB5XCIpIHtcbiAgICAgICAgdmFyIHNjb3BlT2Zmc2V0ID0gdG9wKHN0YXRlKS5vZmZzZXQ7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkge1xuICAgICAgICAgIHZhciBsaW5lT2Zmc2V0ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7XG4gICAgICAgICAgaWYgKGxpbmVPZmZzZXQgPiBzY29wZU9mZnNldClcbiAgICAgICAgICAgIHB1c2hQeVNjb3BlKHN0YXRlKTtcbiAgICAgICAgICBlbHNlIGlmIChsaW5lT2Zmc2V0IDwgc2NvcGVPZmZzZXQgJiYgZGVkZW50KHN0cmVhbSwgc3RhdGUpICYmIHN0cmVhbS5wZWVrKCkgIT0gXCIjXCIpXG4gICAgICAgICAgICBzdGF0ZS5lcnJvclRva2VuID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgICBpZiAoc2NvcGVPZmZzZXQgPiAwICYmIGRlZGVudChzdHJlYW0sIHN0YXRlKSlcbiAgICAgICAgICAgIHN0eWxlICs9IFwiIFwiICsgRVJST1JDTEFTUztcbiAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpO1xuXG4gICAgICAvLyBIYW5kbGUgQ29tbWVudHNcbiAgICAgIGlmIChjaCA9PSBcIiNcIikge1xuICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIE51bWJlciBMaXRlcmFsc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlswLTlcXC5dLywgZmFsc2UpKSB7XG4gICAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTtcbiAgICAgICAgLy8gRmxvYXRzXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bXFxkX10qXFwuXFxkKyhlW1xcK1xcLV0/XFxkKyk/L2kpKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH1cbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXltcXGRfXStcXC5cXGQqLykpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFwuXFxkKy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH1cbiAgICAgICAgaWYgKGZsb2F0TGl0ZXJhbCkge1xuICAgICAgICAgIC8vIEZsb2F0IGxpdGVyYWxzIG1heSBiZSBcImltYWdpbmFyeVwiXG4gICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTtcbiAgICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnRlZ2Vyc1xuICAgICAgICB2YXIgaW50TGl0ZXJhbCA9IGZhbHNlO1xuICAgICAgICAvLyBIZXhcbiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjB4WzAtOWEtZl9dKy9pKSkgaW50TGl0ZXJhbCA9IHRydWU7XG4gICAgICAgIC8vIEJpbmFyeVxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMGJbMDFfXSsvaSkpIGludExpdGVyYWwgPSB0cnVlO1xuICAgICAgICAvLyBPY3RhbFxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMG9bMC03X10rL2kpKSBpbnRMaXRlcmFsID0gdHJ1ZTtcbiAgICAgICAgLy8gRGVjaW1hbFxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzEtOV1bXFxkX10qKGVbXFwrXFwtXT9bXFxkX10rKT8vKSkge1xuICAgICAgICAgIC8vIERlY2ltYWwgbGl0ZXJhbHMgbWF5IGJlIFwiaW1hZ2luYXJ5XCJcbiAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpO1xuICAgICAgICAgIC8vIFRPRE8gLSBDYW4geW91IGhhdmUgaW1hZ2luYXJ5IGxvbmdzP1xuICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFplcm8gYnkgaXRzZWxmIHdpdGggbm8gb3RoZXIgcGllY2Ugb2YgbnVtYmVyLlxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMCg/IVtcXGR4XSkvaSkpIGludExpdGVyYWwgPSB0cnVlO1xuICAgICAgICBpZiAoaW50TGl0ZXJhbCkge1xuICAgICAgICAgIC8vIEludGVnZXIgbGl0ZXJhbHMgbWF5IGJlIFwibG9uZ1wiXG4gICAgICAgICAgc3RyZWFtLmVhdCgvTC9pKTtcbiAgICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgU3RyaW5nc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZ0ZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcGVyYXRvcnMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzW2ldKSkgcmV0dXJuIFwib3BlcmF0b3JcIlxuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcnMpKSByZXR1cm4gXCJwdW5jdHVhdGlvblwiO1xuXG4gICAgICBpZiAoc3RhdGUubGFzdFRva2VuID09IFwiLlwiICYmIHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpXG4gICAgICAgIHJldHVybiBcInByb3BlcnR5XCI7XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSlcbiAgICAgICAgcmV0dXJuIFwia2V5d29yZFwiO1xuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5zKSlcbiAgICAgICAgcmV0dXJuIFwiYnVpbHRpblwiO1xuXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKHNlbGZ8Y2xzKVxcYi8pKVxuICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZS0yXCI7XG5cbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7XG4gICAgICAgIGlmIChzdGF0ZS5sYXN0VG9rZW4gPT0gXCJkZWZcIiB8fCBzdGF0ZS5sYXN0VG9rZW4gPT0gXCJjbGFzc1wiKVxuICAgICAgICAgIHJldHVybiBcImRlZlwiO1xuICAgICAgICByZXR1cm4gXCJ2YXJpYWJsZVwiO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zXG4gICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9rZW5TdHJpbmdGYWN0b3J5KGRlbGltaXRlcikge1xuICAgICAgd2hpbGUgKFwicnViZlwiLmluZGV4T2YoZGVsaW1pdGVyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSA+PSAwKVxuICAgICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXIuc3Vic3RyKDEpO1xuXG4gICAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTtcbiAgICAgIHZhciBPVVRDTEFTUyA9IFwic3RyaW5nXCI7XG5cbiAgICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJ1wiXFxcXF0vKTtcbiAgICAgICAgICBpZiAoc3RyZWFtLmVhdChcIlxcXFxcIikpIHtcbiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlbGluZSAmJiBzdHJlYW0uZW9sKCkpXG4gICAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUztcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTtcbiAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyZWFtLmVhdCgvWydcIl0vKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbmdsZWxpbmUpIHtcbiAgICAgICAgICBpZiAocGFyc2VyQ29uZi5zaW5nbGVMaW5lU3RyaW5nRXJyb3JzKVxuICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9VVENMQVNTO1xuICAgICAgfVxuICAgICAgdG9rZW5TdHJpbmcuaXNTdHJpbmcgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRva2VuU3RyaW5nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1c2hQeVNjb3BlKHN0YXRlKSB7XG4gICAgICB3aGlsZSAodG9wKHN0YXRlKS50eXBlICE9IFwicHlcIikgc3RhdGUuc2NvcGVzLnBvcCgpXG4gICAgICBzdGF0ZS5zY29wZXMucHVzaCh7b2Zmc2V0OiB0b3Aoc3RhdGUpLm9mZnNldCArIGNvbmYuaW5kZW50VW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInB5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IG51bGx9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1c2hCcmFja2V0U2NvcGUoc3RyZWFtLCBzdGF0ZSwgdHlwZSkge1xuICAgICAgdmFyIGFsaWduID0gc3RyZWFtLm1hdGNoKC9eKFtcXHNcXFtcXHtcXChdfCMuKikqJC8sIGZhbHNlKSA/IG51bGwgOiBzdHJlYW0uY29sdW1uKCkgKyAxXG4gICAgICBzdGF0ZS5zY29wZXMucHVzaCh7b2Zmc2V0OiBzdGF0ZS5pbmRlbnQgKyBoYW5naW5nSW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWdufSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWRlbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgdmFyIGluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7XG4gICAgICB3aGlsZSAoc3RhdGUuc2NvcGVzLmxlbmd0aCA+IDEgJiYgdG9wKHN0YXRlKS5vZmZzZXQgPiBpbmRlbnRlZCkge1xuICAgICAgICBpZiAodG9wKHN0YXRlKS50eXBlICE9IFwicHlcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIHN0YXRlLnNjb3Blcy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3Aoc3RhdGUpLm9mZnNldCAhPSBpbmRlbnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmJlZ2lubmluZ09mTGluZSA9IHRydWU7XG5cbiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpO1xuXG4gICAgICAvLyBIYW5kbGUgZGVjb3JhdG9yc1xuICAgICAgaWYgKHN0YXRlLmJlZ2lubmluZ09mTGluZSAmJiBjdXJyZW50ID09IFwiQFwiKVxuICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzLCBmYWxzZSkgPyBcIm1ldGFcIiA6IHB5MyA/IFwib3BlcmF0b3JcIiA6IEVSUk9SQ0xBU1M7XG5cbiAgICAgIGlmICgvXFxTLy50ZXN0KGN1cnJlbnQpKSBzdGF0ZS5iZWdpbm5pbmdPZkxpbmUgPSBmYWxzZTtcblxuICAgICAgaWYgKChzdHlsZSA9PSBcInZhcmlhYmxlXCIgfHwgc3R5bGUgPT0gXCJidWlsdGluXCIpXG4gICAgICAgICAgJiYgc3RhdGUubGFzdFRva2VuID09IFwibWV0YVwiKVxuICAgICAgICBzdHlsZSA9IFwibWV0YVwiO1xuXG4gICAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy5cbiAgICAgIGlmIChjdXJyZW50ID09IFwicGFzc1wiIHx8IGN1cnJlbnQgPT0gXCJyZXR1cm5cIilcbiAgICAgICAgc3RhdGUuZGVkZW50ICs9IDE7XG5cbiAgICAgIGlmIChjdXJyZW50ID09IFwibGFtYmRhXCIpIHN0YXRlLmxhbWJkYSA9IHRydWU7XG4gICAgICBpZiAoY3VycmVudCA9PSBcIjpcIiAmJiAhc3RhdGUubGFtYmRhICYmIHRvcChzdGF0ZSkudHlwZSA9PSBcInB5XCIpXG4gICAgICAgIHB1c2hQeVNjb3BlKHN0YXRlKTtcblxuICAgICAgdmFyIGRlbGltaXRlcl9pbmRleCA9IGN1cnJlbnQubGVuZ3RoID09IDEgPyBcIlsoe1wiLmluZGV4T2YoY3VycmVudCkgOiAtMTtcbiAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT0gLTEpXG4gICAgICAgIHB1c2hCcmFja2V0U2NvcGUoc3RyZWFtLCBzdGF0ZSwgXCJdKX1cIi5zbGljZShkZWxpbWl0ZXJfaW5kZXgsIGRlbGltaXRlcl9pbmRleCsxKSk7XG5cbiAgICAgIGRlbGltaXRlcl9pbmRleCA9IFwiXSl9XCIuaW5kZXhPZihjdXJyZW50KTtcbiAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT0gLTEpIHtcbiAgICAgICAgaWYgKHRvcChzdGF0ZSkudHlwZSA9PSBjdXJyZW50KSBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5zY29wZXMucG9wKCkub2Zmc2V0IC0gaGFuZ2luZ0luZGVudFxuICAgICAgICBlbHNlIHJldHVybiBFUlJPUkNMQVNTO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmRlZGVudCA+IDAgJiYgc3RyZWFtLmVvbCgpICYmIHRvcChzdGF0ZSkudHlwZSA9PSBcInB5XCIpIHtcbiAgICAgICAgaWYgKHN0YXRlLnNjb3Blcy5sZW5ndGggPiAxKSBzdGF0ZS5zY29wZXMucG9wKCk7XG4gICAgICAgIHN0YXRlLmRlZGVudCAtPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgdmFyIGV4dGVybmFsID0ge1xuICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsXG4gICAgICAgICAgc2NvcGVzOiBbe29mZnNldDogYmFzZWNvbHVtbiB8fCAwLCB0eXBlOiBcInB5XCIsIGFsaWduOiBudWxsfV0sXG4gICAgICAgICAgaW5kZW50OiBiYXNlY29sdW1uIHx8IDAsXG4gICAgICAgICAgbGFzdFRva2VuOiBudWxsLFxuICAgICAgICAgIGxhbWJkYTogZmFsc2UsXG4gICAgICAgICAgZGVkZW50OiAwXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgICB2YXIgYWRkRXJyID0gc3RhdGUuZXJyb3JUb2tlbjtcbiAgICAgICAgaWYgKGFkZEVycikgc3RhdGUuZXJyb3JUb2tlbiA9IGZhbHNlO1xuICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpO1xuXG4gICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZSAhPSBcImNvbW1lbnRcIilcbiAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSAoc3R5bGUgPT0gXCJrZXl3b3JkXCIgfHwgc3R5bGUgPT0gXCJwdW5jdHVhdGlvblwiKSA/IHN0cmVhbS5jdXJyZW50KCkgOiBzdHlsZTtcbiAgICAgICAgaWYgKHN0eWxlID09IFwicHVuY3R1YXRpb25cIikgc3R5bGUgPSBudWxsO1xuXG4gICAgICAgIGlmIChzdHJlYW0uZW9sKCkgJiYgc3RhdGUubGFtYmRhKVxuICAgICAgICAgIHN0YXRlLmxhbWJkYSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYWRkRXJyID8gc3R5bGUgKyBcIiBcIiArIEVSUk9SQ0xBU1MgOiBzdHlsZTtcbiAgICAgIH0sXG5cbiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikge1xuICAgICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKVxuICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZS5pc1N0cmluZyA/IENvZGVNaXJyb3IuUGFzcyA6IDA7XG5cbiAgICAgICAgdmFyIHNjb3BlID0gdG9wKHN0YXRlKSwgY2xvc2luZyA9IHNjb3BlLnR5cGUgPT0gdGV4dEFmdGVyLmNoYXJBdCgwKVxuICAgICAgICBpZiAoc2NvcGUuYWxpZ24gIT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gc2NvcGUuYWxpZ24gLSAoY2xvc2luZyA/IDEgOiAwKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIHNjb3BlLm9mZnNldCAtIChjbG9zaW5nID8gaGFuZ2luZ0luZGVudCA6IDApXG4gICAgICB9LFxuXG4gICAgICBlbGVjdHJpY0lucHV0OiAvXlxccypbXFx9XFxdXFwpXSQvLFxuICAgICAgY2xvc2VCcmFja2V0czoge3RyaXBsZXM6IFwiJ1xcXCJcIn0sXG4gICAgICBsaW5lQ29tbWVudDogXCIjXCIsXG4gICAgICBmb2xkOiBcImluZGVudFwiXG4gICAgfTtcbiAgICByZXR1cm4gZXh0ZXJuYWw7XG4gIH0pO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1weXRob25cIiwgXCJweXRob25cIik7XG5cbiAgdmFyIHdvcmRzID0gZnVuY3Rpb24oc3RyKSB7IHJldHVybiBzdHIuc3BsaXQoXCIgXCIpOyB9O1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1jeXRob25cIiwge1xuICAgIG5hbWU6IFwicHl0aG9uXCIsXG4gICAgZXh0cmFfa2V5d29yZHM6IHdvcmRzKFwiYnkgY2RlZiBjaW1wb3J0IGNwZGVmIGN0eXBlZGVmIGVudW0gZXhjZXB0IFwiK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcImV4dGVybiBnaWwgaW5jbHVkZSBub2dpbCBwcm9wZXJ0eSBwdWJsaWMgXCIrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVhZG9ubHkgc3RydWN0IHVuaW9uIERFRiBJRiBFTElGIEVMU0VcIilcbiAgfSk7XG5cbn0pO1xuXG4vKiMgc291cmNlVVJMPWNtX21vZGVzL3B5dGhvbi5qcyAqLyI7UnVudGltZS5jYWNoZWRSZXNvdXJjZXNbImNtX21vZGVzL3NoZWxsLmpzIl09Ii8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5Db2RlTWlycm9yLmRlZmluZU1vZGUoJ3NoZWxsJywgZnVuY3Rpb24oKSB7XG5cbiAgdmFyIHdvcmRzID0ge307XG4gIGZ1bmN0aW9uIGRlZmluZShzdHlsZSwgc3RyaW5nKSB7XG4gICAgdmFyIHNwbGl0ID0gc3RyaW5nLnNwbGl0KCcgJyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB3b3Jkc1tzcGxpdFtpXV0gPSBzdHlsZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQXRvbXNcbiAgZGVmaW5lKCdhdG9tJywgJ3RydWUgZmFsc2UnKTtcblxuICAvLyBLZXl3b3Jkc1xuICBkZWZpbmUoJ2tleXdvcmQnLCAnaWYgdGhlbiBkbyBlbHNlIGVsaWYgd2hpbGUgdW50aWwgZm9yIGluIGVzYWMgZmkgZmluICcgK1xuICAgICdmaWwgZG9uZSBleGl0IHNldCB1bnNldCBleHBvcnQgZnVuY3Rpb24nKTtcblxuICAvLyBDb21tYW5kc1xuICBkZWZpbmUoJ2J1aWx0aW4nLCAnYWIgYXdrIGJhc2ggYmVlcCBjYXQgY2MgY2QgY2hvd24gY2htb2QgY2hyb290IGNsZWFyIGNwICcgK1xuICAgICdjdXJsIGN1dCBkaWZmIGVjaG8gZmluZCBnYXdrIGdjYyBnZXQgZ2l0IGdyZXAgaGcga2lsbCBraWxsYWxsIGxuIGxzIG1ha2UgJyArXG4gICAgJ21rZGlyIG9wZW5zc2wgbXYgbmMgbm9kZSBucG0gcGluZyBwcyByZXN0YXJ0IHJtIHJtZGlyIHNlZCBzZXJ2aWNlIHNoICcgK1xuICAgICdzaG9wdCBzaHJlZCBzb3VyY2Ugc29ydCBzbGVlcCBzc2ggc3RhcnQgc3RvcCBzdSBzdWRvIHN2biB0ZWUgdGVsbmV0IHRvcCAnICtcbiAgICAndG91Y2ggdmkgdmltIHdhbGwgd2Mgd2dldCB3aG8gd3JpdGUgeWVzIHpzaCcpO1xuXG4gIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcblxuICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjaCA9PT0gJ1xcJycgfHwgY2ggPT09ICdcIicgfHwgY2ggPT09ICdgJykge1xuICAgICAgc3RhdGUudG9rZW5zLnVuc2hpZnQodG9rZW5TdHJpbmcoY2gsIGNoID09PSBcImBcIiA/IFwicXVvdGVcIiA6IFwic3RyaW5nXCIpKTtcbiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGNoID09PSAnIycpIHtcbiAgICAgIGlmIChzb2wgJiYgc3RyZWFtLmVhdCgnIScpKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuICdtZXRhJzsgLy8gJ2NvbW1lbnQnP1xuICAgICAgfVxuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICB9XG4gICAgaWYgKGNoID09PSAnJCcpIHtcbiAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuRG9sbGFyKTtcbiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGNoID09PSAnKycgfHwgY2ggPT09ICc9Jykge1xuICAgICAgcmV0dXJuICdvcGVyYXRvcic7XG4gICAgfVxuICAgIGlmIChjaCA9PT0gJy0nKSB7XG4gICAgICBzdHJlYW0uZWF0KCctJyk7XG4gICAgICBzdHJlYW0uZWF0V2hpbGUoL1xcdy8pO1xuICAgICAgcmV0dXJuICdhdHRyaWJ1dGUnO1xuICAgIH1cbiAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXFxkLyk7XG4gICAgICBpZihzdHJlYW0uZW9sKCkgfHwgIS9cXHcvLnRlc3Qoc3RyZWFtLnBlZWsoKSkpIHtcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcXHctXS8pO1xuICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpO1xuICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnPScgJiYgL1xcdysvLnRlc3QoY3VyKSkgcmV0dXJuICdkZWYnO1xuICAgIHJldHVybiB3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjdXIpID8gd29yZHNbY3VyXSA6IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSwgc3R5bGUpIHtcbiAgICB2YXIgY2xvc2UgPSBxdW90ZSA9PSBcIihcIiA/IFwiKVwiIDogcXVvdGUgPT0gXCJ7XCIgPyBcIn1cIiA6IHF1b3RlXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dCA9PT0gY2xvc2UgJiYgIWVzY2FwZWQpIHtcbiAgICAgICAgICBlbmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0ID09PSAnJCcgJiYgIWVzY2FwZWQgJiYgcXVvdGUgIT09IFwiJ1wiKSB7XG4gICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTtcbiAgICAgICAgICBzdGF0ZS50b2tlbnMudW5zaGlmdCh0b2tlbkRvbGxhcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlc2NhcGVkICYmIG5leHQgPT09IHF1b3RlICYmIHF1b3RlICE9PSBjbG9zZSkge1xuICAgICAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuU3RyaW5nKHF1b3RlLCBzdHlsZSkpXG4gICAgICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpXG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT09ICdcXFxcJztcbiAgICAgIH1cbiAgICAgIGlmIChlbmQpIHN0YXRlLnRva2Vucy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH07XG4gIH07XG5cbiAgdmFyIHRva2VuRG9sbGFyID0gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS50b2tlbnMubGVuZ3RoID4gMSkgc3RyZWFtLmVhdCgnJCcpO1xuICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KClcbiAgICBpZiAoL1snXCIoe10vLnRlc3QoY2gpKSB7XG4gICAgICBzdGF0ZS50b2tlbnNbMF0gPSB0b2tlblN0cmluZyhjaCwgY2ggPT0gXCIoXCIgPyBcInF1b3RlXCIgOiBjaCA9PSBcIntcIiA/IFwiZGVmXCIgOiBcInN0cmluZ1wiKTtcbiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKCEvXFxkLy50ZXN0KGNoKSkgc3RyZWFtLmVhdFdoaWxlKC9cXHcvKTtcbiAgICBzdGF0ZS50b2tlbnMuc2hpZnQoKTtcbiAgICByZXR1cm4gJ2RlZic7XG4gIH07XG5cbiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHJldHVybiAoc3RhdGUudG9rZW5zWzBdIHx8IHRva2VuQmFzZSkgKHN0cmVhbSwgc3RhdGUpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7cmV0dXJuIHt0b2tlbnM6W119O30sXG4gICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9LFxuICAgIGNsb3NlQnJhY2tldHM6IFwiKClbXXt9JydcXFwiXFxcImBgXCIsXG4gICAgbGluZUNvbW1lbnQ6ICcjJyxcbiAgICBmb2xkOiBcImJyYWNlXCJcbiAgfTtcbn0pO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1zaCcsICdzaGVsbCcpO1xuLy8gQXBhY2hlIHVzZXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgTWVkaWEgVHlwZSBmb3IgU2hlbGwgc2NyaXB0c1xuLy8gaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9odHRwZC9odHRwZC90cnVuay9kb2NzL2NvbmYvbWltZS50eXBlc1xuQ29kZU1pcnJvci5kZWZpbmVNSU1FKCdhcHBsaWNhdGlvbi94LXNoJywgJ3NoZWxsJyk7XG5cbn0pO1xuXG4vKiMgc291cmNlVVJMPWNtX21vZGVzL3NoZWxsLmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvbGl2ZXNjcmlwdC5qcyJdPSIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbi8qKlxuICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2R1cmFsb2cvQ29kZU1pcnJvclxuICovXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgnbGl2ZXNjcmlwdCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBuZXh0X3J1bGUgPSBzdGF0ZS5uZXh0IHx8IFwic3RhcnRcIjtcbiAgICAgIGlmIChuZXh0X3J1bGUpIHtcbiAgICAgICAgc3RhdGUubmV4dCA9IHN0YXRlLm5leHQ7XG4gICAgICAgIHZhciBuciA9IFJ1bGVzW25leHRfcnVsZV07XG4gICAgICAgIGlmIChuci5zcGxpY2UpIHtcbiAgICAgICAgICBmb3IgKHZhciBpJCA9IDA7IGkkIDwgbnIubGVuZ3RoOyArK2kkKSB7XG4gICAgICAgICAgICB2YXIgciA9IG5yW2kkXTtcbiAgICAgICAgICAgIGlmIChyLnJlZ2V4ICYmIHN0cmVhbS5tYXRjaChyLnJlZ2V4KSkge1xuICAgICAgICAgICAgICBzdGF0ZS5uZXh0ID0gci5uZXh0IHx8IHN0YXRlLm5leHQ7XG4gICAgICAgICAgICAgIHJldHVybiByLnRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgICAgIHJldHVybiAnZXJyb3InO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2gociA9IFJ1bGVzW25leHRfcnVsZV0pKSB7XG4gICAgICAgICAgaWYgKHIucmVnZXggJiYgc3RyZWFtLm1hdGNoKHIucmVnZXgpKSB7XG4gICAgICAgICAgICBzdGF0ZS5uZXh0ID0gci5uZXh0O1xuICAgICAgICAgICAgcmV0dXJuIHIudG9rZW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICB9O1xuICAgIHZhciBleHRlcm5hbCA9IHtcbiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dDogJ3N0YXJ0JyxcbiAgICAgICAgICBsYXN0VG9rZW46IHtzdHlsZTogbnVsbCwgaW5kZW50OiAwLCBjb250ZW50OiBcIlwifVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKXtcbiAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPT0gc3RyZWFtLnN0YXJ0KVxuICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgc3RhdGUubGFzdFRva2VuID0ge1xuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICBpbmRlbnQ6IHN0cmVhbS5pbmRlbnRhdGlvbigpLFxuICAgICAgICAgIGNvbnRlbnQ6IHN0cmVhbS5jdXJyZW50KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN0eWxlLnJlcGxhY2UoL1xcLi9nLCAnICcpO1xuICAgICAgfSxcbiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUpe1xuICAgICAgICB2YXIgaW5kZW50YXRpb24gPSBzdGF0ZS5sYXN0VG9rZW4uaW5kZW50O1xuICAgICAgICBpZiAoc3RhdGUubGFzdFRva2VuLmNvbnRlbnQubWF0Y2goaW5kZW50ZXIpKSB7XG4gICAgICAgICAgaW5kZW50YXRpb24gKz0gMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZW50YXRpb247XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gZXh0ZXJuYWw7XG4gIH0pO1xuXG4gIHZhciBpZGVudGlmaWVyID0gJyg/IVtcXFxcZFxcXFxzXSlbJFxcXFx3XFxcXHhBQS1cXFxcdUZGRENdKD86KD8hXFxcXHMpWyRcXFxcd1xcXFx4QUEtXFxcXHVGRkRDXXwtW0EtWmEtel0pKic7XG4gIHZhciBpbmRlbnRlciA9IFJlZ0V4cCgnKD86Wyh7Wz06XXxbLX5dPnxcXFxcYig/OmUoPzpsc2V8eHBvcnQpfGQoPzpvfGVmYXVsdCl8dCg/OnJ5fGhlbil8ZmluYWxseXxpbXBvcnQoPzpcXFxccyphbGwpP3xjb25zdHx2YXJ8bGV0fG5ld3xjYXRjaCg/OlxcXFxzKicgKyBpZGVudGlmaWVyICsgJyk/KSlcXFxccyokJyk7XG4gIHZhciBrZXl3b3JkZW5kID0gJyg/IVskXFxcXHddfC1bQS1aYS16XXxcXFxccyo6KD8hWzo9XSkpJztcbiAgdmFyIHN0cmluZ2ZpbGwgPSB7XG4gICAgdG9rZW46ICdzdHJpbmcnLFxuICAgIHJlZ2V4OiAnLisnXG4gIH07XG4gIHZhciBSdWxlcyA9IHtcbiAgICBzdGFydDogW1xuICAgICAge1xuICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJyxcbiAgICAgICAgcmVnZXg6ICcvXFxcXConLFxuICAgICAgICBuZXh0OiAnY29tbWVudCdcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdjb21tZW50JyxcbiAgICAgICAgcmVnZXg6ICcjLionXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAna2V5d29yZCcsXG4gICAgICAgIHJlZ2V4OiAnKD86dCg/OmgoPzppc3xyb3d8ZW4pfHJ5fHlwZW9mIT8pfGMoPzpvbig/OnRpbnVlfHN0KXxhKD86c2V8dGNoKXxsYXNzKXxpKD86big/OnN0YW5jZW9mKT98bXAoPzpvcnQoPzpcXFxccythbGwpP3xsZW1lbnRzKXxbZnNdKXxkKD86ZSg/OmZhdWx0fGxldGV8YnVnZ2VyKXxvKXxmKD86b3IoPzpcXFxccytvd24pP3xpbmFsbHl8dW5jdGlvbil8cyg/OnVwZXJ8d2l0Y2gpfGUoPzpsc2V8eCg/OnRlbmRzfHBvcnQpfHZhbCl8YSg/Om5kfHJndW1lbnRzKXxuKD86ZXd8b3QpfHVuKD86bGVzc3x0aWwpfHcoPzpoaWxlfGl0aCl8b1tmcl18cmV0dXJufGJyZWFrfGxldHx2YXJ8bG9vcCknICsga2V5d29yZGVuZFxuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2NvbnN0YW50Lmxhbmd1YWdlJyxcbiAgICAgICAgcmVnZXg6ICcoPzp0cnVlfGZhbHNlfHllc3xub3xvbnxvZmZ8bnVsbHx2b2lkfHVuZGVmaW5lZCknICsga2V5d29yZGVuZFxuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2ludmFsaWQuaWxsZWdhbCcsXG4gICAgICAgIHJlZ2V4OiAnKD86cCg/OmFja2FnZXxyKD86aXZhdGV8b3RlY3RlZCl8dWJsaWMpfGkoPzptcGxlbWVudHN8bnRlcmZhY2UpfGVudW18c3RhdGljfHlpZWxkKScgKyBrZXl3b3JkZW5kXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnbGFuZ3VhZ2Uuc3VwcG9ydC5jbGFzcycsXG4gICAgICAgIHJlZ2V4OiAnKD86Uig/OmUoPzpnRXhwfGZlcmVuY2VFcnJvcil8YW5nZUVycm9yKXxTKD86dHJpbmd8eW50YXhFcnJvcil8RSg/OnJyb3J8dmFsRXJyb3IpfEFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxOdW1iZXJ8T2JqZWN0fFR5cGVFcnJvcnxVUklFcnJvciknICsga2V5d29yZGVuZFxuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2xhbmd1YWdlLnN1cHBvcnQuZnVuY3Rpb24nLFxuICAgICAgICByZWdleDogJyg/OmlzKD86TmFOfEZpbml0ZSl8cGFyc2UoPzpJbnR8RmxvYXQpfE1hdGh8SlNPTnwoPzplbnxkZSljb2RlVVJJKD86Q29tcG9uZW50KT8pJyArIGtleXdvcmRlbmRcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICd2YXJpYWJsZS5sYW5ndWFnZScsXG4gICAgICAgIHJlZ2V4OiAnKD86dCg/OmhhdHxpbHxvKXxmKD86cm9tfGFsbHRocm91Z2gpfGl0fGJ5fGUpJyArIGtleXdvcmRlbmRcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdpZGVudGlmaWVyJyxcbiAgICAgICAgcmVnZXg6IGlkZW50aWZpZXIgKyAnXFxcXHMqOig/IVs6PV0pJ1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ3ZhcmlhYmxlJyxcbiAgICAgICAgcmVnZXg6IGlkZW50aWZpZXJcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdrZXl3b3JkLm9wZXJhdG9yJyxcbiAgICAgICAgcmVnZXg6ICcoPzpcXFxcLnszfXxcXFxccytcXFxcPyknXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAna2V5d29yZC52YXJpYWJsZScsXG4gICAgICAgIHJlZ2V4OiAnKD86QCt8Ojp8XFxcXC5cXFxcLiknLFxuICAgICAgICBuZXh0OiAna2V5J1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2tleXdvcmQub3BlcmF0b3InLFxuICAgICAgICByZWdleDogJ1xcXFwuXFxcXHMqJyxcbiAgICAgICAgbmV4dDogJ2tleSdcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdzdHJpbmcnLFxuICAgICAgICByZWdleDogJ1xcXFxcXFxcXFxcXFNbXlxcXFxzLDspfVxcXFxdXSonXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nLmRvYycsXG4gICAgICAgIHJlZ2V4OiAnXFwnXFwnXFwnJyxcbiAgICAgICAgbmV4dDogJ3Fkb2MnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nLmRvYycsXG4gICAgICAgIHJlZ2V4OiAnXCJcIlwiJyxcbiAgICAgICAgbmV4dDogJ3FxZG9jJ1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ3N0cmluZycsXG4gICAgICAgIHJlZ2V4OiAnXFwnJyxcbiAgICAgICAgbmV4dDogJ3FzdHJpbmcnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nJyxcbiAgICAgICAgcmVnZXg6ICdcIicsXG4gICAgICAgIG5leHQ6ICdxcXN0cmluZydcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdzdHJpbmcnLFxuICAgICAgICByZWdleDogJ2AnLFxuICAgICAgICBuZXh0OiAnanMnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nJyxcbiAgICAgICAgcmVnZXg6ICc8XFxcXFsnLFxuICAgICAgICBuZXh0OiAnd29yZHMnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JyxcbiAgICAgICAgcmVnZXg6ICcvLycsXG4gICAgICAgIG5leHQ6ICdoZXJlZ2V4J1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ3N0cmluZy5yZWdleCcsXG4gICAgICAgIHJlZ2V4OiAnXFxcXC8oPzpbXltcXFxcL1xcXFxuXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcXFxcW1teXFxcXF1cXFxcblxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxdXFxcXG5cXFxcXFxcXF0qKSpcXFxcXSlbXltcXFxcL1xcXFxuXFxcXFxcXFxdKikqKVxcXFwvW2dpbXkkXXswLDR9JyxcbiAgICAgICAgbmV4dDogJ2tleSdcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdjb25zdGFudC5udW1lcmljJyxcbiAgICAgICAgcmVnZXg6ICcoPzoweFtcXFxcZGEtZkEtRl1bXFxcXGRhLWZBLUZfXSp8KD86WzItOV18WzEyXVxcXFxkfDNbMC02XSlyW1xcXFxkYS16QS1aXVtcXFxcZGEtekEtWl9dKnwoPzpcXFxcZFtcXFxcZF9dKig/OlxcXFwuXFxcXGRbXFxcXGRfXSopP3xcXFxcLlxcXFxkW1xcXFxkX10qKSg/OmVbKy1dP1xcXFxkW1xcXFxkX10qKT9bXFxcXHckXSopJ1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2xwYXJlbicsXG4gICAgICAgIHJlZ2V4OiAnWyh7W10nXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAncnBhcmVuJyxcbiAgICAgICAgcmVnZXg6ICdbKX1cXFxcXV0nLFxuICAgICAgICBuZXh0OiAna2V5J1xuICAgICAgfSwge1xuICAgICAgICB0b2tlbjogJ2tleXdvcmQub3BlcmF0b3InLFxuICAgICAgICByZWdleDogJ1xcXFxTKydcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICd0ZXh0JyxcbiAgICAgICAgcmVnZXg6ICdcXFxccysnXG4gICAgICB9XG4gICAgXSxcbiAgICBoZXJlZ2V4OiBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JyxcbiAgICAgICAgcmVnZXg6ICcuKj8vL1tnaW15JD9dezAsNH0nLFxuICAgICAgICBuZXh0OiAnc3RhcnQnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JyxcbiAgICAgICAgcmVnZXg6ICdcXFxccyojeydcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdjb21tZW50LnJlZ2V4JyxcbiAgICAgICAgcmVnZXg6ICdcXFxccysoPzojLiopPydcbiAgICAgIH0sIHtcbiAgICAgICAgdG9rZW46ICdzdHJpbmcucmVnZXgnLFxuICAgICAgICByZWdleDogJ1xcXFxTKydcbiAgICAgIH1cbiAgICBdLFxuICAgIGtleTogW1xuICAgICAge1xuICAgICAgICB0b2tlbjogJ2tleXdvcmQub3BlcmF0b3InLFxuICAgICAgICByZWdleDogJ1suP0AhXSsnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnaWRlbnRpZmllcicsXG4gICAgICAgIHJlZ2V4OiBpZGVudGlmaWVyLFxuICAgICAgICBuZXh0OiAnc3RhcnQnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAndGV4dCcsXG4gICAgICAgIHJlZ2V4OiAnJyxcbiAgICAgICAgbmV4dDogJ3N0YXJ0J1xuICAgICAgfVxuICAgIF0sXG4gICAgY29tbWVudDogW1xuICAgICAge1xuICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJyxcbiAgICAgICAgcmVnZXg6ICcuKj9cXFxcKi8nLFxuICAgICAgICBuZXh0OiAnc3RhcnQnXG4gICAgICB9LCB7XG4gICAgICAgIHRva2VuOiAnY29tbWVudC5kb2MnLFxuICAgICAgICByZWdleDogJy4rJ1xuICAgICAgfVxuICAgIF0sXG4gICAgcWRvYzogW1xuICAgICAge1xuICAgICAgICB0b2tlbjogJ3N0cmluZycsXG4gICAgICAgIHJlZ2V4OiBcIi4qPycnJ1wiLFxuICAgICAgICBuZXh0OiAna2V5J1xuICAgICAgfSwgc3RyaW5nZmlsbFxuICAgIF0sXG4gICAgcXFkb2M6IFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdzdHJpbmcnLFxuICAgICAgICByZWdleDogJy4qP1wiXCJcIicsXG4gICAgICAgIG5leHQ6ICdrZXknXG4gICAgICB9LCBzdHJpbmdmaWxsXG4gICAgXSxcbiAgICBxc3RyaW5nOiBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nJyxcbiAgICAgICAgcmVnZXg6ICdbXlxcXFxcXFxcXFwnXSooPzpcXFxcXFxcXC5bXlxcXFxcXFxcXFwnXSopKlxcJycsXG4gICAgICAgIG5leHQ6ICdrZXknXG4gICAgICB9LCBzdHJpbmdmaWxsXG4gICAgXSxcbiAgICBxcXN0cmluZzogW1xuICAgICAge1xuICAgICAgICB0b2tlbjogJ3N0cmluZycsXG4gICAgICAgIHJlZ2V4OiAnW15cXFxcXFxcXFwiXSooPzpcXFxcXFxcXC5bXlxcXFxcXFxcXCJdKikqXCInLFxuICAgICAgICBuZXh0OiAna2V5J1xuICAgICAgfSwgc3RyaW5nZmlsbFxuICAgIF0sXG4gICAganM6IFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdzdHJpbmcnLFxuICAgICAgICByZWdleDogJ1teXFxcXFxcXFxgXSooPzpcXFxcXFxcXC5bXlxcXFxcXFxcYF0qKSpgJyxcbiAgICAgICAgbmV4dDogJ2tleSdcbiAgICAgIH0sIHN0cmluZ2ZpbGxcbiAgICBdLFxuICAgIHdvcmRzOiBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc3RyaW5nJyxcbiAgICAgICAgcmVnZXg6ICcuKj9cXFxcXT4nLFxuICAgICAgICBuZXh0OiAna2V5J1xuICAgICAgfSwgc3RyaW5nZmlsbFxuICAgIF1cbiAgfTtcbiAgZm9yICh2YXIgaWR4IGluIFJ1bGVzKSB7XG4gICAgdmFyIHIgPSBSdWxlc1tpZHhdO1xuICAgIGlmIChyLnNwbGljZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgdmFyIHJyID0gcltpXTtcbiAgICAgICAgaWYgKHR5cGVvZiByci5yZWdleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBSdWxlc1tpZHhdW2ldLnJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyByci5yZWdleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByci5yZWdleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIFJ1bGVzW2lkeF0ucmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIHIucmVnZXgpO1xuICAgIH1cbiAgfVxuXG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LWxpdmVzY3JpcHQnLCAnbGl2ZXNjcmlwdCcpO1xuXG59KTtcblxuLyojIHNvdXJjZVVSTD1jbV9tb2Rlcy9saXZlc2NyaXB0LmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvbWFya2Rvd24uanMiXT0iLy8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcbi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpLCByZXF1aXJlKFwiLi4veG1sL3htbFwiKSwgcmVxdWlyZShcIi4uL21ldGFcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIiwgXCIuLi94bWwveG1sXCIsIFwiLi4vbWV0YVwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5Db2RlTWlycm9yLmRlZmluZU1vZGUoXCJtYXJrZG93blwiLCBmdW5jdGlvbihjbUNmZywgbW9kZUNmZykge1xuXG4gIHZhciBodG1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjbUNmZywgXCJ0ZXh0L2h0bWxcIik7XG4gIHZhciBodG1sTW9kZU1pc3NpbmcgPSBodG1sTW9kZS5uYW1lID09IFwibnVsbFwiXG5cbiAgZnVuY3Rpb24gZ2V0TW9kZShuYW1lKSB7XG4gICAgaWYgKENvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWUpIHtcbiAgICAgIHZhciBmb3VuZCA9IENvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWUobmFtZSk7XG4gICAgICBpZiAoZm91bmQpIG5hbWUgPSBmb3VuZC5taW1lIHx8IGZvdW5kLm1pbWVzWzBdO1xuICAgIH1cbiAgICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjbUNmZywgbmFtZSk7XG4gICAgcmV0dXJuIG1vZGUubmFtZSA9PSBcIm51bGxcIiA/IG51bGwgOiBtb2RlO1xuICB9XG5cbiAgLy8gU2hvdWxkIGNoYXJhY3RlcnMgdGhhdCBhZmZlY3QgaGlnaGxpZ2h0aW5nIGJlIGhpZ2hsaWdodGVkIHNlcGFyYXRlP1xuICAvLyBEb2VzIG5vdCBpbmNsdWRlIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIG91dHB1dCAoc3VjaCBhcyBgMS5gIGFuZCBgLWAgZm9yIGxpc3RzKVxuICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nID0gZmFsc2U7XG5cbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIGJsb2NrcXVvdGVzLiBTZXQgdG8gMCBmb3IgaW5maW5pdGUgbmVzdGluZy5cbiAgLy8gRXhjZXNzIGA+YCB3aWxsIGVtaXQgYGVycm9yYCB0b2tlbi5cbiAgaWYgKG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPSAwO1xuXG4gIC8vIFR1cm4gb24gdGFzayBsaXN0cz8gKFwiLSBbIF0gXCIgYW5kIFwiLSBbeF0gXCIpXG4gIGlmIChtb2RlQ2ZnLnRhc2tMaXN0cyA9PT0gdW5kZWZpbmVkKSBtb2RlQ2ZnLnRhc2tMaXN0cyA9IGZhbHNlO1xuXG4gIC8vIFR1cm4gb24gc3RyaWtldGhyb3VnaCBzeW50YXhcbiAgaWYgKG1vZGVDZmcuc3RyaWtldGhyb3VnaCA9PT0gdW5kZWZpbmVkKVxuICAgIG1vZGVDZmcuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuXG4gIGlmIChtb2RlQ2ZnLmVtb2ppID09PSB1bmRlZmluZWQpXG4gICAgbW9kZUNmZy5lbW9qaSA9IGZhbHNlO1xuXG4gIGlmIChtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja0hpZ2hsaWdodGluZyA9PT0gdW5kZWZpbmVkKVxuICAgIG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrSGlnaGxpZ2h0aW5nID0gdHJ1ZTtcblxuICBpZiAobW9kZUNmZy54bWwgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnhtbCA9IHRydWU7XG5cbiAgLy8gQWxsb3cgdG9rZW4gdHlwZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyLXByb3ZpZGVkIHRva2VuIHR5cGVzLlxuICBpZiAobW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXMgPT09IHVuZGVmaW5lZClcbiAgICBtb2RlQ2ZnLnRva2VuVHlwZU92ZXJyaWRlcyA9IHt9O1xuXG4gIHZhciB0b2tlblR5cGVzID0ge1xuICAgIGhlYWRlcjogXCJoZWFkZXJcIixcbiAgICBjb2RlOiBcImNvbW1lbnRcIixcbiAgICBxdW90ZTogXCJxdW90ZVwiLFxuICAgIGxpc3QxOiBcInZhcmlhYmxlLTJcIixcbiAgICBsaXN0MjogXCJ2YXJpYWJsZS0zXCIsXG4gICAgbGlzdDM6IFwia2V5d29yZFwiLFxuICAgIGhyOiBcImhyXCIsXG4gICAgaW1hZ2U6IFwiaW1hZ2VcIixcbiAgICBpbWFnZUFsdFRleHQ6IFwiaW1hZ2UtYWx0LXRleHRcIixcbiAgICBpbWFnZU1hcmtlcjogXCJpbWFnZS1tYXJrZXJcIixcbiAgICBmb3JtYXR0aW5nOiBcImZvcm1hdHRpbmdcIixcbiAgICBsaW5rSW5saW5lOiBcImxpbmtcIixcbiAgICBsaW5rRW1haWw6IFwibGlua1wiLFxuICAgIGxpbmtUZXh0OiBcImxpbmtcIixcbiAgICBsaW5rSHJlZjogXCJzdHJpbmdcIixcbiAgICBlbTogXCJlbVwiLFxuICAgIHN0cm9uZzogXCJzdHJvbmdcIixcbiAgICBzdHJpa2V0aHJvdWdoOiBcInN0cmlrZXRocm91Z2hcIixcbiAgICBlbW9qaTogXCJidWlsdGluXCJcbiAgfTtcblxuICBmb3IgKHZhciB0b2tlblR5cGUgaW4gdG9rZW5UeXBlcykge1xuICAgIGlmICh0b2tlblR5cGVzLmhhc093blByb3BlcnR5KHRva2VuVHlwZSkgJiYgbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXSkge1xuICAgICAgdG9rZW5UeXBlc1t0b2tlblR5cGVdID0gbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXTtcbiAgICB9XG4gIH1cblxuICB2YXIgaHJSRSA9IC9eKFsqXFwtX10pKD86XFxzKlxcMSl7Mix9XFxzKiQvXG4gICwgICBsaXN0UkUgPSAvXig/OlsqXFwtK118XlswLTldKyhbLildKSlcXHMrL1xuICAsICAgdGFza0xpc3RSRSA9IC9eXFxbKHh8IClcXF0oPz1cXHMpL2kgLy8gTXVzdCBmb2xsb3cgbGlzdFJFXG4gICwgICBhdHhIZWFkZXJSRSA9IG1vZGVDZmcuYWxsb3dBdHhIZWFkZXJXaXRob3V0U3BhY2UgPyAvXigjKykvIDogL14oIyspKD86IHwkKS9cbiAgLCAgIHNldGV4dEhlYWRlclJFID0gL14gKig/OlxcPXsxLH18LXsxLH0pXFxzKiQvXG4gICwgICB0ZXh0UkUgPSAvXlteIyFcXFtcXF0qX1xcXFw8PmAgXCInKH46XSsvXG4gICwgICBmZW5jZWRDb2RlUkUgPSAvXih+fn4rfGBgYCspWyBcXHRdKihbXFx3KyMtXSopW15cXG5gXSokL1xuICAsICAgbGlua0RlZlJFID0gL15cXHMqXFxbW15cXF1dKz9cXF06XFxzKlxcUysoXFxzKlxcUypcXHMqKT8kLyAvLyBuYWl2ZSBsaW5rLWRlZmluaXRpb25cbiAgLCAgIHB1bmN0dWF0aW9uID0gL1shXFxcIiMkJSZcXCcoKSorLFxcLVxcLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9flxcdTIwMTRdL1xuICAsICAgZXhwYW5kZWRUYWIgPSBcIiAgICBcIiAvLyBDb21tb25NYXJrIHNwZWNpZmllcyB0YWIgYXMgNCBzcGFjZXNcblxuICBmdW5jdGlvbiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBmO1xuICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgZikge1xuICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGY7XG4gICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lSXNFbXB0eShsaW5lKSB7XG4gICAgcmV0dXJuICFsaW5lIHx8ICEvXFxTLy50ZXN0KGxpbmUuc3RyaW5nKVxuICB9XG5cbiAgLy8gQmxvY2tzXG5cbiAgZnVuY3Rpb24gYmxhbmtMaW5lKHN0YXRlKSB7XG4gICAgLy8gUmVzZXQgbGlua1RpdGxlIHN0YXRlXG4gICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7XG4gICAgc3RhdGUubGlua0hyZWYgPSBmYWxzZTtcbiAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IEVNIHN0YXRlXG4gICAgc3RhdGUuZW0gPSBmYWxzZTtcbiAgICAvLyBSZXNldCBTVFJPTkcgc3RhdGVcbiAgICBzdGF0ZS5zdHJvbmcgPSBmYWxzZTtcbiAgICAvLyBSZXNldCBzdHJpa2V0aHJvdWdoIHN0YXRlXG4gICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHN0YXRlLnF1b3RlXG4gICAgc3RhdGUucXVvdGUgPSAwO1xuICAgIC8vIFJlc2V0IHN0YXRlLmluZGVudGVkQ29kZVxuICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS5mID09IGh0bWxCbG9jaykge1xuICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDtcbiAgICAgIHN0YXRlLmJsb2NrID0gYmxvY2tOb3JtYWw7XG4gICAgfVxuICAgIC8vIFJlc2V0IHN0YXRlLnRyYWlsaW5nU3BhY2VcbiAgICBzdGF0ZS50cmFpbGluZ1NwYWNlID0gMDtcbiAgICBzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSA9IGZhbHNlO1xuICAgIC8vIE1hcmsgdGhpcyBsaW5lIGFzIGJsYW5rXG4gICAgc3RhdGUucHJldkxpbmUgPSBzdGF0ZS50aGlzTGluZVxuICAgIHN0YXRlLnRoaXNMaW5lID0ge3N0cmVhbTogbnVsbH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsb2NrTm9ybWFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgICB2YXIgZmlyc3RUb2tlbk9uTGluZSA9IHN0cmVhbS5jb2x1bW4oKSA9PT0gc3RhdGUuaW5kZW50YXRpb247XG4gICAgdmFyIHByZXZMaW5lTGluZUlzRW1wdHkgPSBsaW5lSXNFbXB0eShzdGF0ZS5wcmV2TGluZS5zdHJlYW0pO1xuICAgIHZhciBwcmV2TGluZUlzSW5kZW50ZWRDb2RlID0gc3RhdGUuaW5kZW50ZWRDb2RlO1xuICAgIHZhciBwcmV2TGluZUlzSHIgPSBzdGF0ZS5wcmV2TGluZS5ocjtcbiAgICB2YXIgcHJldkxpbmVJc0xpc3QgPSBzdGF0ZS5saXN0ICE9PSBmYWxzZTtcbiAgICB2YXIgbWF4Tm9uQ29kZUluZGVudGF0aW9uID0gKHN0YXRlLmxpc3RTdGFja1tzdGF0ZS5saXN0U3RhY2subGVuZ3RoIC0gMV0gfHwgMCkgKyAzO1xuXG4gICAgc3RhdGUuaW5kZW50ZWRDb2RlID0gZmFsc2U7XG5cbiAgICB2YXIgbGluZUluZGVudGF0aW9uID0gc3RhdGUuaW5kZW50YXRpb247XG4gICAgLy8gY29tcHV0ZSBvbmNlIHBlciBsaW5lIChvbiBmaXJzdCB0b2tlbilcbiAgICBpZiAoc3RhdGUuaW5kZW50YXRpb25EaWZmID09PSBudWxsKSB7XG4gICAgICBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPSBzdGF0ZS5pbmRlbnRhdGlvbjtcbiAgICAgIGlmIChwcmV2TGluZUlzTGlzdCkge1xuICAgICAgICAvLyBSZXNldCBpbmxpbmUgc3R5bGVzIHdoaWNoIHNob3VsZG4ndCBwcm9wYWdhdGUgYXJvc3MgbGlzdCBpdGVtc1xuICAgICAgICBzdGF0ZS5lbSA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5zdHJvbmcgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5zdHJpa2V0aHJvdWdoID0gZmFsc2U7XG5cbiAgICAgICAgc3RhdGUubGlzdCA9IG51bGw7XG4gICAgICAgIC8vIFdoaWxlIHRoaXMgbGlzdCBpdGVtJ3MgbWFya2VyJ3MgaW5kZW50YXRpb24gaXMgbGVzcyB0aGFuIHRoZSBkZWVwZXN0XG4gICAgICAgIC8vICBsaXN0IGl0ZW0ncyBjb250ZW50J3MgaW5kZW50YXRpb24scG9wIHRoZSBkZWVwZXN0IGxpc3QgaXRlbVxuICAgICAgICAvLyAgaW5kZW50YXRpb24gb2ZmIHRoZSBzdGFjaywgYW5kIHVwZGF0ZSBibG9jayBpbmRlbnRhdGlvbiBzdGF0ZVxuICAgICAgICB3aGlsZSAobGluZUluZGVudGF0aW9uIDwgc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXSkge1xuICAgICAgICAgIHN0YXRlLmxpc3RTdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoc3RhdGUubGlzdFN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBzdGF0ZS5saXN0U3RhY2tbc3RhdGUubGlzdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgZmlyc3QgbGlzdCdzIGluZGVudCAtPiB0aGUgbGluZSBpcyBubyBsb25nZXIgYSBsaXN0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gbGluZUluZGVudGF0aW9uIC0gc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm90IGNvbXByZWhlbnNpdmUgKGN1cnJlbnRseSBvbmx5IGZvciBzZXRleHQgZGV0ZWN0aW9uIHB1cnBvc2VzKVxuICAgIHZhciBhbGxvd3NJbmxpbmVDb250aW51YXRpb24gPSAoXG4gICAgICAgICFwcmV2TGluZUxpbmVJc0VtcHR5ICYmICFwcmV2TGluZUlzSHIgJiYgIXN0YXRlLnByZXZMaW5lLmhlYWRlciAmJlxuICAgICAgICAoIXByZXZMaW5lSXNMaXN0IHx8ICFwcmV2TGluZUlzSW5kZW50ZWRDb2RlKSAmJlxuICAgICAgICAhc3RhdGUucHJldkxpbmUuZmVuY2VkQ29kZUVuZFxuICAgICk7XG5cbiAgICB2YXIgaXNIciA9IChzdGF0ZS5saXN0ID09PSBmYWxzZSB8fCBwcmV2TGluZUlzSHIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkgJiZcbiAgICAgIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiBzdHJlYW0ubWF0Y2goaHJSRSk7XG5cbiAgICB2YXIgbWF0Y2ggPSBudWxsO1xuICAgIGlmIChzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gNCAmJiAocHJldkxpbmVJc0luZGVudGVkQ29kZSB8fCBzdGF0ZS5wcmV2TGluZS5mZW5jZWRDb2RlRW5kIHx8XG4gICAgICAgICBzdGF0ZS5wcmV2TGluZS5oZWFkZXIgfHwgcHJldkxpbmVMaW5lSXNFbXB0eSkpIHtcbiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IHRydWU7XG4gICAgICByZXR1cm4gdG9rZW5UeXBlcy5jb2RlO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RUb2tlbk9uTGluZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKGF0eEhlYWRlclJFKSkgJiYgbWF0Y2hbMV0ubGVuZ3RoIDw9IDYpIHtcbiAgICAgIHN0YXRlLnF1b3RlID0gMDtcbiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzFdLmxlbmd0aDtcbiAgICAgIHN0YXRlLnRoaXNMaW5lLmhlYWRlciA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJoZWFkZXJcIjtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5pbmRlbnRhdGlvbiA8PSBtYXhOb25Db2RlSW5kZW50YXRpb24gJiYgc3RyZWFtLmVhdCgnPicpKSB7XG4gICAgICBzdGF0ZS5xdW90ZSA9IGZpcnN0VG9rZW5PbkxpbmUgPyAxIDogc3RhdGUucXVvdGUgKyAxO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwicXVvdGVcIjtcbiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoIWlzSHIgJiYgIXN0YXRlLnNldGV4dCAmJiBmaXJzdFRva2VuT25MaW5lICYmIHN0YXRlLmluZGVudGF0aW9uIDw9IG1heE5vbkNvZGVJbmRlbnRhdGlvbiAmJiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2gobGlzdFJFKSkpIHtcbiAgICAgIHZhciBsaXN0VHlwZSA9IG1hdGNoWzFdID8gXCJvbFwiIDogXCJ1bFwiO1xuXG4gICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IGxpbmVJbmRlbnRhdGlvbiArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoO1xuICAgICAgc3RhdGUubGlzdCA9IHRydWU7XG4gICAgICBzdGF0ZS5xdW90ZSA9IDA7XG5cbiAgICAgIC8vIEFkZCB0aGlzIGxpc3QgaXRlbSdzIGNvbnRlbnQncyBpbmRlbnRhdGlvbiB0byB0aGUgc3RhY2tcbiAgICAgIHN0YXRlLmxpc3RTdGFjay5wdXNoKHN0YXRlLmluZGVudGF0aW9uKTtcblxuICAgICAgaWYgKG1vZGVDZmcudGFza0xpc3RzICYmIHN0cmVhbS5tYXRjaCh0YXNrTGlzdFJFLCBmYWxzZSkpIHtcbiAgICAgICAgc3RhdGUudGFza0xpc3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBbXCJsaXN0XCIsIFwibGlzdC1cIiArIGxpc3RUeXBlXTtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGZpcnN0VG9rZW5PbkxpbmUgJiYgc3RhdGUuaW5kZW50YXRpb24gPD0gbWF4Tm9uQ29kZUluZGVudGF0aW9uICYmIChtYXRjaCA9IHN0cmVhbS5tYXRjaChmZW5jZWRDb2RlUkUsIHRydWUpKSkge1xuICAgICAgc3RhdGUucXVvdGUgPSAwO1xuICAgICAgc3RhdGUuZmVuY2VkRW5kUkUgPSBuZXcgUmVnRXhwKG1hdGNoWzFdICsgXCIrICokXCIpO1xuICAgICAgLy8gdHJ5IHN3aXRjaGluZyBtb2RlXG4gICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja0hpZ2hsaWdodGluZyAmJiBnZXRNb2RlKG1hdGNoWzJdKTtcbiAgICAgIGlmIChzdGF0ZS5sb2NhbE1vZGUpIHN0YXRlLmxvY2FsU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoc3RhdGUubG9jYWxNb2RlKTtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGxvY2FsO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiY29kZS1ibG9ja1wiO1xuICAgICAgc3RhdGUuY29kZSA9IC0xXG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgLy8gU0VURVhUIGhhcyBsb3dlc3QgYmxvY2stc2NvcGUgcHJlY2VkZW5jZSBhZnRlciBIUiwgc28gY2hlY2sgaXQgYWZ0ZXJcbiAgICAvLyAgdGhlIG90aGVycyAoY29kZSwgYmxvY2txdW90ZSwgbGlzdC4uLilcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gaWYgc2V0ZXh0IHNldCwgaW5kaWNhdGVzIGxpbmUgYWZ0ZXIgLS0tLz09PVxuICAgICAgc3RhdGUuc2V0ZXh0IHx8IChcbiAgICAgICAgLy8gbGluZSBiZWZvcmUgLS0tLz09PVxuICAgICAgICAoIWFsbG93c0lubGluZUNvbnRpbnVhdGlvbiB8fCAhcHJldkxpbmVJc0xpc3QpICYmICFzdGF0ZS5xdW90ZSAmJiBzdGF0ZS5saXN0ID09PSBmYWxzZSAmJlxuICAgICAgICAhc3RhdGUuY29kZSAmJiAhaXNIciAmJiAhbGlua0RlZlJFLnRlc3Qoc3RyZWFtLnN0cmluZykgJiZcbiAgICAgICAgKG1hdGNoID0gc3RyZWFtLmxvb2tBaGVhZCgxKSkgJiYgKG1hdGNoID0gbWF0Y2gubWF0Y2goc2V0ZXh0SGVhZGVyUkUpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgaWYgKCAhc3RhdGUuc2V0ZXh0ICkge1xuICAgICAgICBzdGF0ZS5oZWFkZXIgPSBtYXRjaFswXS5jaGFyQXQoMCkgPT0gJz0nID8gMSA6IDI7XG4gICAgICAgIHN0YXRlLnNldGV4dCA9IHN0YXRlLmhlYWRlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmhlYWRlciA9IHN0YXRlLnNldGV4dDtcbiAgICAgICAgLy8gaGFzIG5vIGVmZmVjdCBvbiB0eXBlIHNvIHdlIGNhbiByZXNldCBpdCBub3dcbiAgICAgICAgc3RhdGUuc2V0ZXh0ID0gMDtcbiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJoZWFkZXJcIjtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnRoaXNMaW5lLmhlYWRlciA9IHRydWU7XG4gICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoaXNIcikge1xuICAgICAgc3RyZWFtLnNraXBUb0VuZCgpO1xuICAgICAgc3RhdGUuaHIgPSB0cnVlO1xuICAgICAgc3RhdGUudGhpc0xpbmUuaHIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRva2VuVHlwZXMuaHI7XG4gICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnWycpIHtcbiAgICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgZm9vdG5vdGVMaW5rKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIHN0YXRlLmlubGluZSk7XG4gIH1cblxuICBmdW5jdGlvbiBodG1sQmxvY2soc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBzdHlsZSA9IGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaHRtbFN0YXRlKTtcbiAgICBpZiAoIWh0bWxNb2RlTWlzc2luZykge1xuICAgICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5pbm5lck1vZGUoaHRtbE1vZGUsIHN0YXRlLmh0bWxTdGF0ZSlcbiAgICAgIGlmICgoaW5uZXIubW9kZS5uYW1lID09IFwieG1sXCIgJiYgaW5uZXIuc3RhdGUudGFnU3RhcnQgPT09IG51bGwgJiZcbiAgICAgICAgICAgKCFpbm5lci5zdGF0ZS5jb250ZXh0ICYmIGlubmVyLnN0YXRlLnRva2VuaXplLmlzSW5UZXh0KSkgfHxcbiAgICAgICAgICAoc3RhdGUubWRfaW5zaWRlICYmIHN0cmVhbS5jdXJyZW50KCkuaW5kZXhPZihcIj5cIikgPiAtMSkpIHtcbiAgICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDtcbiAgICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDtcbiAgICAgICAgc3RhdGUuaHRtbFN0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYWwoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBjdXJyTGlzdEluZCA9IHN0YXRlLmxpc3RTdGFja1tzdGF0ZS5saXN0U3RhY2subGVuZ3RoIC0gMV0gfHwgMDtcbiAgICB2YXIgaGFzRXhpdGVkTGlzdCA9IHN0YXRlLmluZGVudGF0aW9uIDwgY3Vyckxpc3RJbmQ7XG4gICAgdmFyIG1heEZlbmNlZEVuZEluZCA9IGN1cnJMaXN0SW5kICsgMztcbiAgICBpZiAoc3RhdGUuZmVuY2VkRW5kUkUgJiYgc3RhdGUuaW5kZW50YXRpb24gPD0gbWF4RmVuY2VkRW5kSW5kICYmIChoYXNFeGl0ZWRMaXN0IHx8IHN0cmVhbS5tYXRjaChzdGF0ZS5mZW5jZWRFbmRSRSkpKSB7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJjb2RlLWJsb2NrXCI7XG4gICAgICB2YXIgcmV0dXJuVHlwZTtcbiAgICAgIGlmICghaGFzRXhpdGVkTGlzdCkgcmV0dXJuVHlwZSA9IGdldFR5cGUoc3RhdGUpXG4gICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDtcbiAgICAgIHN0YXRlLmJsb2NrID0gYmxvY2tOb3JtYWw7XG4gICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsO1xuICAgICAgc3RhdGUuZmVuY2VkRW5kUkUgPSBudWxsO1xuICAgICAgc3RhdGUuY29kZSA9IDBcbiAgICAgIHN0YXRlLnRoaXNMaW5lLmZlbmNlZENvZGVFbmQgPSB0cnVlO1xuICAgICAgaWYgKGhhc0V4aXRlZExpc3QpIHJldHVybiBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBzdGF0ZS5ibG9jayk7XG4gICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxvY2FsTW9kZSkge1xuICAgICAgcmV0dXJuIHN0YXRlLmxvY2FsTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmxvY2FsU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICByZXR1cm4gdG9rZW5UeXBlcy5jb2RlO1xuICAgIH1cbiAgfVxuXG4gIC8vIElubGluZVxuICBmdW5jdGlvbiBnZXRUeXBlKHN0YXRlKSB7XG4gICAgdmFyIHN0eWxlcyA9IFtdO1xuXG4gICAgaWYgKHN0YXRlLmZvcm1hdHRpbmcpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZm9ybWF0dGluZyk7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhdGUuZm9ybWF0dGluZyA9PT0gXCJzdHJpbmdcIikgc3RhdGUuZm9ybWF0dGluZyA9IFtzdGF0ZS5mb3JtYXR0aW5nXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5mb3JtYXR0aW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZm9ybWF0dGluZyArIFwiLVwiICsgc3RhdGUuZm9ybWF0dGluZ1tpXSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZvcm1hdHRpbmdbaV0gPT09IFwiaGVhZGVyXCIpIHtcbiAgICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyBcIi1cIiArIHN0YXRlLmZvcm1hdHRpbmdbaV0gKyBcIi1cIiArIHN0YXRlLmhlYWRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgYGZvcm1hdHRpbmctcXVvdGVgIGFuZCBgZm9ybWF0dGluZy1xdW90ZS0jYCBmb3IgYmxvY2txdW90ZXNcbiAgICAgICAgLy8gQWRkIGBlcnJvcmAgaW5zdGVhZCBpZiB0aGUgbWF4aW11bSBibG9ja3F1b3RlIG5lc3RpbmcgZGVwdGggaXMgcGFzc2VkXG4gICAgICAgIGlmIChzdGF0ZS5mb3JtYXR0aW5nW2ldID09PSBcInF1b3RlXCIpIHtcbiAgICAgICAgICBpZiAoIW1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoIHx8IG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID49IHN0YXRlLnF1b3RlKSB7XG4gICAgICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyBcIi1cIiArIHN0YXRlLmZvcm1hdHRpbmdbaV0gKyBcIi1cIiArIHN0YXRlLnF1b3RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGVzLnB1c2goXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUudGFza09wZW4pIHtcbiAgICAgIHN0eWxlcy5wdXNoKFwibWV0YVwiKTtcbiAgICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7XG4gICAgfVxuICAgIGlmIChzdGF0ZS50YXNrQ2xvc2VkKSB7XG4gICAgICBzdHlsZXMucHVzaChcInByb3BlcnR5XCIpO1xuICAgICAgcmV0dXJuIHN0eWxlcy5sZW5ndGggPyBzdHlsZXMuam9pbignICcpIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGlua0hyZWYpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlua0hyZWYsIFwidXJsXCIpO1xuICAgIH0gZWxzZSB7IC8vIE9ubHkgYXBwbHkgaW5saW5lIHN0eWxlcyB0byBub24tdXJsIHRleHRcbiAgICAgIGlmIChzdGF0ZS5zdHJvbmcpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5zdHJvbmcpOyB9XG4gICAgICBpZiAoc3RhdGUuZW0pIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5lbSk7IH1cbiAgICAgIGlmIChzdGF0ZS5zdHJpa2V0aHJvdWdoKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuc3RyaWtldGhyb3VnaCk7IH1cbiAgICAgIGlmIChzdGF0ZS5lbW9qaSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmVtb2ppKTsgfVxuICAgICAgaWYgKHN0YXRlLmxpbmtUZXh0KSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlua1RleHQpOyB9XG4gICAgICBpZiAoc3RhdGUuY29kZSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmNvZGUpOyB9XG4gICAgICBpZiAoc3RhdGUuaW1hZ2UpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5pbWFnZSk7IH1cbiAgICAgIGlmIChzdGF0ZS5pbWFnZUFsdFRleHQpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5pbWFnZUFsdFRleHQsIFwibGlua1wiKTsgfVxuICAgICAgaWYgKHN0YXRlLmltYWdlTWFya2VyKSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuaW1hZ2VNYXJrZXIpOyB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmhlYWRlcikgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmhlYWRlciwgdG9rZW5UeXBlcy5oZWFkZXIgKyBcIi1cIiArIHN0YXRlLmhlYWRlcik7IH1cblxuICAgIGlmIChzdGF0ZS5xdW90ZSkge1xuICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5xdW90ZSk7XG5cbiAgICAgIC8vIEFkZCBgcXVvdGUtI2Agd2hlcmUgdGhlIG1heGltdW0gZm9yIGAjYCBpcyBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aFxuICAgICAgaWYgKCFtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCB8fCBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA+PSBzdGF0ZS5xdW90ZSkge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnF1b3RlICsgXCItXCIgKyBzdGF0ZS5xdW90ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnF1b3RlICsgXCItXCIgKyBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgbGlzdE1vZCA9IChzdGF0ZS5saXN0U3RhY2subGVuZ3RoIC0gMSkgJSAzO1xuICAgICAgaWYgKCFsaXN0TW9kKSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlzdDEpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0TW9kID09PSAxKSB7XG4gICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlzdDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5saXN0Myk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnRyYWlsaW5nU3BhY2VOZXdMaW5lKSB7XG4gICAgICBzdHlsZXMucHVzaChcInRyYWlsaW5nLXNwYWNlLW5ldy1saW5lXCIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZSkge1xuICAgICAgc3R5bGVzLnB1c2goXCJ0cmFpbGluZy1zcGFjZS1cIiArIChzdGF0ZS50cmFpbGluZ1NwYWNlICUgMiA/IFwiYVwiIDogXCJiXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCcgJykgOiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGV4dChzdHJlYW0sIHN0YXRlKSB7XG4gICAgaWYgKHN0cmVhbS5tYXRjaCh0ZXh0UkUsIHRydWUpKSB7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBpbmxpbmVOb3JtYWwoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnRleHQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzdHlsZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICByZXR1cm4gc3R5bGU7XG5cbiAgICBpZiAoc3RhdGUubGlzdCkgeyAvLyBMaXN0IG1hcmtlciAoKiwgKywgLSwgMS4sIGV0YylcbiAgICAgIHN0YXRlLmxpc3QgPSBudWxsO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YXNrTGlzdCkge1xuICAgICAgdmFyIHRhc2tPcGVuID0gc3RyZWFtLm1hdGNoKHRhc2tMaXN0UkUsIHRydWUpWzFdID09PSBcIiBcIjtcbiAgICAgIGlmICh0YXNrT3Blbikgc3RhdGUudGFza09wZW4gPSB0cnVlO1xuICAgICAgZWxzZSBzdGF0ZS50YXNrQ2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcInRhc2tcIjtcbiAgICAgIHN0YXRlLnRhc2tMaXN0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFza09wZW4gPSBmYWxzZTtcbiAgICBzdGF0ZS50YXNrQ2xvc2VkID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhdGUuaGVhZGVyICYmIHN0cmVhbS5tYXRjaCgvXiMrJC8sIHRydWUpKSB7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJoZWFkZXJcIjtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgLy8gTWF0Y2hlcyBsaW5rIHRpdGxlcyBwcmVzZW50IG9uIG5leHQgbGluZVxuICAgIGlmIChzdGF0ZS5saW5rVGl0bGUpIHtcbiAgICAgIHN0YXRlLmxpbmtUaXRsZSA9IGZhbHNlO1xuICAgICAgdmFyIG1hdGNoQ2ggPSBjaDtcbiAgICAgIGlmIChjaCA9PT0gJygnKSB7XG4gICAgICAgIG1hdGNoQ2ggPSAnKSc7XG4gICAgICB9XG4gICAgICBtYXRjaENoID0gKG1hdGNoQ2grJycpLnJlcGxhY2UoLyhbLj8qK15cXFtcXF1cXFxcKCl7fXwtXSkvZywgXCJcXFxcJDFcIik7XG4gICAgICB2YXIgcmVnZXggPSAnXlxcXFxzKig/OlteJyArIG1hdGNoQ2ggKyAnXFxcXFxcXFxdK3xcXFxcXFxcXFxcXFxcXFxcfFxcXFxcXFxcLiknICsgbWF0Y2hDaDtcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2gobmV3IFJlZ0V4cChyZWdleCksIHRydWUpKSB7XG4gICAgICAgIHJldHVybiB0b2tlblR5cGVzLmxpbmtIcmVmO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgYmxvY2sgaXMgY2hhbmdlZCwgaXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBpbiBHRk0gbW9kZVxuICAgIGlmIChjaCA9PT0gJ2AnKSB7XG4gICAgICB2YXIgcHJldmlvdXNGb3JtYXR0aW5nID0gc3RhdGUuZm9ybWF0dGluZztcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImNvZGVcIjtcbiAgICAgIHN0cmVhbS5lYXRXaGlsZSgnYCcpO1xuICAgICAgdmFyIGNvdW50ID0gc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGhcbiAgICAgIGlmIChzdGF0ZS5jb2RlID09IDAgJiYgKCFzdGF0ZS5xdW90ZSB8fCBjb3VudCA9PSAxKSkge1xuICAgICAgICBzdGF0ZS5jb2RlID0gY291bnRcbiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpXG4gICAgICB9IGVsc2UgaWYgKGNvdW50ID09IHN0YXRlLmNvZGUpIHsgLy8gTXVzdCBiZSBleGFjdFxuICAgICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpXG4gICAgICAgIHN0YXRlLmNvZGUgPSAwXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5mb3JtYXR0aW5nID0gcHJldmlvdXNGb3JtYXR0aW5nXG4gICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuY29kZSkge1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICBzdHJlYW0ubmV4dCgpO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgICB2YXIgZm9ybWF0dGluZ0VzY2FwZSA9IHRva2VuVHlwZXMuZm9ybWF0dGluZyArIFwiLWVzY2FwZVwiO1xuICAgICAgICByZXR1cm4gdHlwZSA/IHR5cGUgKyBcIiBcIiArIGZvcm1hdHRpbmdFc2NhcGUgOiBmb3JtYXR0aW5nRXNjYXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJyEnICYmIHN0cmVhbS5tYXRjaCgvXFxbW15cXF1dKlxcXSA/KD86XFwofFxcWykvLCBmYWxzZSkpIHtcbiAgICAgIHN0YXRlLmltYWdlTWFya2VyID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmltYWdlID0gdHJ1ZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImltYWdlXCI7XG4gICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnWycgJiYgc3RhdGUuaW1hZ2VNYXJrZXIgJiYgc3RyZWFtLm1hdGNoKC9bXlxcXV0qXFxdKFxcKC4qP1xcKXwgP1xcWy4qP1xcXSkvLCBmYWxzZSkpIHtcbiAgICAgIHN0YXRlLmltYWdlTWFya2VyID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pbWFnZUFsdFRleHQgPSB0cnVlXG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJpbWFnZVwiO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gJ10nICYmIHN0YXRlLmltYWdlQWx0VGV4dCkge1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwiaW1hZ2VcIjtcbiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBzdGF0ZS5pbWFnZUFsdFRleHQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmltYWdlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gbGlua0hyZWY7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICdbJyAmJiAhc3RhdGUuaW1hZ2UpIHtcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gdHJ1ZTtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICddJyAmJiBzdGF0ZS5saW5rVGV4dCkge1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmxpbmtUZXh0ID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gc3RyZWFtLm1hdGNoKC9cXCguKj9cXCl8ID9cXFsuKj9cXF0vLCBmYWxzZSkgPyBsaW5rSHJlZiA6IGlubGluZU5vcm1hbFxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eKGh0dHBzP3xmdHBzPyk6XFwvXFwvKD86W15cXFxcPl18XFxcXC4pKz4vLCBmYWxzZSkpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBsaW5rSW5saW5lO1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIGlmICh0eXBlKXtcbiAgICAgICAgdHlwZSArPSBcIiBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGUgKyB0b2tlblR5cGVzLmxpbmtJbmxpbmU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eW14+IFxcXFxdK0AoPzpbXlxcXFw+XXxcXFxcLikrPi8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGxpbmtJbmxpbmU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgaWYgKHR5cGUpe1xuICAgICAgICB0eXBlICs9IFwiIFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZSArIHRva2VuVHlwZXMubGlua0VtYWlsO1xuICAgIH1cblxuICAgIGlmIChtb2RlQ2ZnLnhtbCAmJiBjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXighLS18W2Etel0rKD86XFxzK1thLXpfOi5cXC1dKyg/Olxccyo9XFxzKlteID5dKyk/KSpcXHMqPikvaSwgZmFsc2UpKSB7XG4gICAgICB2YXIgZW5kID0gc3RyZWFtLnN0cmluZy5pbmRleE9mKFwiPlwiLCBzdHJlYW0ucG9zKTtcbiAgICAgIGlmIChlbmQgIT0gLTEpIHtcbiAgICAgICAgdmFyIGF0dHMgPSBzdHJlYW0uc3RyaW5nLnN1YnN0cmluZyhzdHJlYW0uc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmICgvbWFya2Rvd25cXHMqPVxccyooJ3xcIil7MCwxfTEoJ3xcIil7MCwxfS8udGVzdChhdHRzKSkgc3RhdGUubWRfaW5zaWRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICBzdGF0ZS5odG1sU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpO1xuICAgICAgcmV0dXJuIHN3aXRjaEJsb2NrKHN0cmVhbSwgc3RhdGUsIGh0bWxCbG9jayk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVDZmcueG1sICYmIGNoID09PSAnPCcgJiYgc3RyZWFtLm1hdGNoKC9eXFwvXFx3Kj8+LykpIHtcbiAgICAgIHN0YXRlLm1kX2luc2lkZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIFwidGFnXCI7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gXCIqXCIgfHwgY2ggPT09IFwiX1wiKSB7XG4gICAgICB2YXIgbGVuID0gMSwgYmVmb3JlID0gc3RyZWFtLnBvcyA9PSAxID8gXCIgXCIgOiBzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0ucG9zIC0gMilcbiAgICAgIHdoaWxlIChsZW4gPCAzICYmIHN0cmVhbS5lYXQoY2gpKSBsZW4rK1xuICAgICAgdmFyIGFmdGVyID0gc3RyZWFtLnBlZWsoKSB8fCBcIiBcIlxuICAgICAgLy8gU2VlIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMjcvI2VtcGhhc2lzLWFuZC1zdHJvbmctZW1waGFzaXNcbiAgICAgIHZhciBsZWZ0RmxhbmtpbmcgPSAhL1xccy8udGVzdChhZnRlcikgJiYgKCFwdW5jdHVhdGlvbi50ZXN0KGFmdGVyKSB8fCAvXFxzLy50ZXN0KGJlZm9yZSkgfHwgcHVuY3R1YXRpb24udGVzdChiZWZvcmUpKVxuICAgICAgdmFyIHJpZ2h0RmxhbmtpbmcgPSAhL1xccy8udGVzdChiZWZvcmUpICYmICghcHVuY3R1YXRpb24udGVzdChiZWZvcmUpIHx8IC9cXHMvLnRlc3QoYWZ0ZXIpIHx8IHB1bmN0dWF0aW9uLnRlc3QoYWZ0ZXIpKVxuICAgICAgdmFyIHNldEVtID0gbnVsbCwgc2V0U3Ryb25nID0gbnVsbFxuICAgICAgaWYgKGxlbiAlIDIpIHsgLy8gRW1cbiAgICAgICAgaWYgKCFzdGF0ZS5lbSAmJiBsZWZ0RmxhbmtpbmcgJiYgKGNoID09PSBcIipcIiB8fCAhcmlnaHRGbGFua2luZyB8fCBwdW5jdHVhdGlvbi50ZXN0KGJlZm9yZSkpKVxuICAgICAgICAgIHNldEVtID0gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5lbSA9PSBjaCAmJiByaWdodEZsYW5raW5nICYmIChjaCA9PT0gXCIqXCIgfHwgIWxlZnRGbGFua2luZyB8fCBwdW5jdHVhdGlvbi50ZXN0KGFmdGVyKSkpXG4gICAgICAgICAgc2V0RW0gPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKGxlbiA+IDEpIHsgLy8gU3Ryb25nXG4gICAgICAgIGlmICghc3RhdGUuc3Ryb25nICYmIGxlZnRGbGFua2luZyAmJiAoY2ggPT09IFwiKlwiIHx8ICFyaWdodEZsYW5raW5nIHx8IHB1bmN0dWF0aW9uLnRlc3QoYmVmb3JlKSkpXG4gICAgICAgICAgc2V0U3Ryb25nID0gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdHJvbmcgPT0gY2ggJiYgcmlnaHRGbGFua2luZyAmJiAoY2ggPT09IFwiKlwiIHx8ICFsZWZ0RmxhbmtpbmcgfHwgcHVuY3R1YXRpb24udGVzdChhZnRlcikpKVxuICAgICAgICAgIHNldFN0cm9uZyA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoc2V0U3Ryb25nICE9IG51bGwgfHwgc2V0RW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gc2V0RW0gPT0gbnVsbCA/IFwic3Ryb25nXCIgOiBzZXRTdHJvbmcgPT0gbnVsbCA/IFwiZW1cIiA6IFwic3Ryb25nIGVtXCJcbiAgICAgICAgaWYgKHNldEVtID09PSB0cnVlKSBzdGF0ZS5lbSA9IGNoXG4gICAgICAgIGlmIChzZXRTdHJvbmcgPT09IHRydWUpIHN0YXRlLnN0cm9uZyA9IGNoXG4gICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSlcbiAgICAgICAgaWYgKHNldEVtID09PSBmYWxzZSkgc3RhdGUuZW0gPSBmYWxzZVxuICAgICAgICBpZiAoc2V0U3Ryb25nID09PSBmYWxzZSkgc3RhdGUuc3Ryb25nID0gZmFsc2VcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnICcpIHtcbiAgICAgIGlmIChzdHJlYW0uZWF0KCcqJykgfHwgc3RyZWFtLmVhdCgnXycpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VzXG4gICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnICcpIHsgLy8gU3Vycm91bmRlZCBieSBzcGFjZXMsIGlnbm9yZVxuICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gTm90IHN1cnJvdW5kZWQgYnkgc3BhY2VzLCBiYWNrIHVwIHBvaW50ZXJcbiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVDZmcuc3RyaWtldGhyb3VnaCkge1xuICAgICAgaWYgKGNoID09PSAnficgJiYgc3RyZWFtLmVhdFdoaWxlKGNoKSkge1xuICAgICAgICBpZiAoc3RhdGUuc3RyaWtldGhyb3VnaCkgey8vIFJlbW92ZSBzdHJpa2V0aHJvdWdoXG4gICAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwic3RyaWtldGhyb3VnaFwiO1xuICAgICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlteXFxzXS8sIGZhbHNlKSkgey8vIEFkZCBzdHJpa2V0aHJvdWdoXG4gICAgICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IHRydWU7XG4gICAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwic3RyaWtldGhyb3VnaFwiO1xuICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyAnKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15+fi8sIHRydWUpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VcbiAgICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBOb3Qgc3Vycm91bmRlZCBieSBzcGFjZXMsIGJhY2sgdXAgcG9pbnRlclxuICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZUNmZy5lbW9qaSAmJiBjaCA9PT0gXCI6XCIgJiYgc3RyZWFtLm1hdGNoKC9eW2Etel9cXGQrLV0rOi8pKSB7XG4gICAgICBzdGF0ZS5lbW9qaSA9IHRydWU7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJlbW9qaVwiO1xuICAgICAgdmFyIHJldFR5cGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgIHN0YXRlLmVtb2ppID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0VHlwZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICcgJykge1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvICskLywgZmFsc2UpKSB7XG4gICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2UrKztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZSkge1xuICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGlua0lubGluZShzdHJlYW0sIHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcblxuICAgIGlmIChjaCA9PT0gXCI+XCIpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rXCI7XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpO1xuICAgICAgaWYgKHR5cGUpe1xuICAgICAgICB0eXBlICs9IFwiIFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZSArIHRva2VuVHlwZXMubGlua0lubGluZTtcbiAgICB9XG5cbiAgICBzdHJlYW0ubWF0Y2goL15bXj5dKy8sIHRydWUpO1xuXG4gICAgcmV0dXJuIHRva2VuVHlwZXMubGlua0lubGluZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmtIcmVmKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAvLyBDaGVjayBpZiBzcGFjZSwgYW5kIHJldHVybiBOVUxMIGlmIHNvICh0byBhdm9pZCBtYXJraW5nIHRoZSBzcGFjZSlcbiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoY2ggPT09ICcoJyB8fCBjaCA9PT0gJ1snKSB7XG4gICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gZ2V0TGlua0hyZWZJbnNpZGUoY2ggPT09IFwiKFwiID8gXCIpXCIgOiBcIl1cIik7XG4gICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rLXN0cmluZ1wiO1xuICAgICAgc3RhdGUubGlua0hyZWYgPSB0cnVlO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gJ2Vycm9yJztcbiAgfVxuXG4gIHZhciBsaW5rUkUgPSB7XG4gICAgXCIpXCI6IC9eKD86W15cXFxcXFwoXFwpXXxcXFxcLnxcXCgoPzpbXlxcXFxcXChcXCldfFxcXFwuKSpcXCkpKj8oPz1cXCkpLyxcbiAgICBcIl1cIjogL14oPzpbXlxcXFxcXFtcXF1dfFxcXFwufFxcWyg/OlteXFxcXFxcW1xcXV18XFxcXC4pKlxcXSkqPyg/PVxcXSkvXG4gIH1cblxuICBmdW5jdGlvbiBnZXRMaW5rSHJlZkluc2lkZShlbmRDaGFyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7XG5cbiAgICAgIGlmIChjaCA9PT0gZW5kQ2hhcikge1xuICAgICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gaW5saW5lTm9ybWFsO1xuICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gXCJsaW5rLXN0cmluZ1wiO1xuICAgICAgICB2YXIgcmV0dXJuU3RhdGUgPSBnZXRUeXBlKHN0YXRlKTtcbiAgICAgICAgc3RhdGUubGlua0hyZWYgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlO1xuICAgICAgfVxuXG4gICAgICBzdHJlYW0ubWF0Y2gobGlua1JFW2VuZENoYXJdKVxuICAgICAgc3RhdGUubGlua0hyZWYgPSB0cnVlO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmb290bm90ZUxpbmsoc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdHJlYW0ubWF0Y2goL14oW15cXF1cXFxcXXxcXFxcLikqXFxdOi8sIGZhbHNlKSkge1xuICAgICAgc3RhdGUuZiA9IGZvb3Rub3RlTGlua0luc2lkZTtcbiAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIENvbnN1bWUgW1xuICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFwibGlua1wiO1xuICAgICAgc3RhdGUubGlua1RleHQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGlubGluZU5vcm1hbCk7XG4gIH1cblxuICBmdW5jdGlvbiBmb290bm90ZUxpbmtJbnNpZGUoc3RyZWFtLCBzdGF0ZSkge1xuICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXF06LywgdHJ1ZSkpIHtcbiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBmb290bm90ZVVybDtcbiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSBcImxpbmtcIjtcbiAgICAgIHZhciByZXR1cm5UeXBlID0gZ2V0VHlwZShzdGF0ZSk7XG4gICAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVyblR5cGU7XG4gICAgfVxuXG4gICAgc3RyZWFtLm1hdGNoKC9eKFteXFxdXFxcXF18XFxcXC4pKy8sIHRydWUpO1xuXG4gICAgcmV0dXJuIHRva2VuVHlwZXMubGlua1RleHQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb290bm90ZVVybChzdHJlYW0sIHN0YXRlKSB7XG4gICAgLy8gQ2hlY2sgaWYgc3BhY2UsIGFuZCByZXR1cm4gTlVMTCBpZiBzbyAodG8gYXZvaWQgbWFya2luZyB0aGUgc3BhY2UpXG4gICAgaWYoc3RyZWFtLmVhdFNwYWNlKCkpe1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIE1hdGNoIFVSTFxuICAgIHN0cmVhbS5tYXRjaCgvXlteXFxzXSsvLCB0cnVlKTtcbiAgICAvLyBDaGVjayBmb3IgbGluayB0aXRsZVxuICAgIGlmIChzdHJlYW0ucGVlaygpID09PSB1bmRlZmluZWQpIHsgLy8gRW5kIG9mIGxpbmUsIHNldCBmbGFnIHRvIGNoZWNrIG5leHQgbGluZVxuICAgICAgc3RhdGUubGlua1RpdGxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgeyAvLyBNb3JlIGNvbnRlbnQgb24gbGluZSwgY2hlY2sgaWYgbGluayB0aXRsZVxuICAgICAgc3RyZWFtLm1hdGNoKC9eKD86XFxzKyg/OlwiKD86W15cIlxcXFxdfFxcXFxcXFxcfFxcXFwuKStcInwnKD86W14nXFxcXF18XFxcXFxcXFx8XFxcXC4pKyd8XFwoKD86W14pXFxcXF18XFxcXFxcXFx8XFxcXC4pK1xcKSkpPy8sIHRydWUpO1xuICAgIH1cbiAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gaW5saW5lTm9ybWFsO1xuICAgIHJldHVybiB0b2tlblR5cGVzLmxpbmtIcmVmICsgXCIgdXJsXCI7XG4gIH1cblxuICB2YXIgbW9kZSA9IHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGY6IGJsb2NrTm9ybWFsLFxuXG4gICAgICAgIHByZXZMaW5lOiB7c3RyZWFtOiBudWxsfSxcbiAgICAgICAgdGhpc0xpbmU6IHtzdHJlYW06IG51bGx9LFxuXG4gICAgICAgIGJsb2NrOiBibG9ja05vcm1hbCxcbiAgICAgICAgaHRtbFN0YXRlOiBudWxsLFxuICAgICAgICBpbmRlbnRhdGlvbjogMCxcblxuICAgICAgICBpbmxpbmU6IGlubGluZU5vcm1hbCxcbiAgICAgICAgdGV4dDogaGFuZGxlVGV4dCxcblxuICAgICAgICBmb3JtYXR0aW5nOiBmYWxzZSxcbiAgICAgICAgbGlua1RleHQ6IGZhbHNlLFxuICAgICAgICBsaW5rSHJlZjogZmFsc2UsXG4gICAgICAgIGxpbmtUaXRsZTogZmFsc2UsXG4gICAgICAgIGNvZGU6IDAsXG4gICAgICAgIGVtOiBmYWxzZSxcbiAgICAgICAgc3Ryb25nOiBmYWxzZSxcbiAgICAgICAgaGVhZGVyOiAwLFxuICAgICAgICBzZXRleHQ6IDAsXG4gICAgICAgIGhyOiBmYWxzZSxcbiAgICAgICAgdGFza0xpc3Q6IGZhbHNlLFxuICAgICAgICBsaXN0OiBmYWxzZSxcbiAgICAgICAgbGlzdFN0YWNrOiBbXSxcbiAgICAgICAgcXVvdGU6IDAsXG4gICAgICAgIHRyYWlsaW5nU3BhY2U6IDAsXG4gICAgICAgIHRyYWlsaW5nU3BhY2VOZXdMaW5lOiBmYWxzZSxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogZmFsc2UsXG4gICAgICAgIGVtb2ppOiBmYWxzZSxcbiAgICAgICAgZmVuY2VkRW5kUkU6IG51bGxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24ocykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZjogcy5mLFxuXG4gICAgICAgIHByZXZMaW5lOiBzLnByZXZMaW5lLFxuICAgICAgICB0aGlzTGluZTogcy50aGlzTGluZSxcblxuICAgICAgICBibG9jazogcy5ibG9jayxcbiAgICAgICAgaHRtbFN0YXRlOiBzLmh0bWxTdGF0ZSAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSwgcy5odG1sU3RhdGUpLFxuICAgICAgICBpbmRlbnRhdGlvbjogcy5pbmRlbnRhdGlvbixcblxuICAgICAgICBsb2NhbE1vZGU6IHMubG9jYWxNb2RlLFxuICAgICAgICBsb2NhbFN0YXRlOiBzLmxvY2FsTW9kZSA/IENvZGVNaXJyb3IuY29weVN0YXRlKHMubG9jYWxNb2RlLCBzLmxvY2FsU3RhdGUpIDogbnVsbCxcblxuICAgICAgICBpbmxpbmU6IHMuaW5saW5lLFxuICAgICAgICB0ZXh0OiBzLnRleHQsXG4gICAgICAgIGZvcm1hdHRpbmc6IGZhbHNlLFxuICAgICAgICBsaW5rVGV4dDogcy5saW5rVGV4dCxcbiAgICAgICAgbGlua1RpdGxlOiBzLmxpbmtUaXRsZSxcbiAgICAgICAgbGlua0hyZWY6IHMubGlua0hyZWYsXG4gICAgICAgIGNvZGU6IHMuY29kZSxcbiAgICAgICAgZW06IHMuZW0sXG4gICAgICAgIHN0cm9uZzogcy5zdHJvbmcsXG4gICAgICAgIHN0cmlrZXRocm91Z2g6IHMuc3RyaWtldGhyb3VnaCxcbiAgICAgICAgZW1vamk6IHMuZW1vamksXG4gICAgICAgIGhlYWRlcjogcy5oZWFkZXIsXG4gICAgICAgIHNldGV4dDogcy5zZXRleHQsXG4gICAgICAgIGhyOiBzLmhyLFxuICAgICAgICB0YXNrTGlzdDogcy50YXNrTGlzdCxcbiAgICAgICAgbGlzdDogcy5saXN0LFxuICAgICAgICBsaXN0U3RhY2s6IHMubGlzdFN0YWNrLnNsaWNlKDApLFxuICAgICAgICBxdW90ZTogcy5xdW90ZSxcbiAgICAgICAgaW5kZW50ZWRDb2RlOiBzLmluZGVudGVkQ29kZSxcbiAgICAgICAgdHJhaWxpbmdTcGFjZTogcy50cmFpbGluZ1NwYWNlLFxuICAgICAgICB0cmFpbGluZ1NwYWNlTmV3TGluZTogcy50cmFpbGluZ1NwYWNlTmV3TGluZSxcbiAgICAgICAgbWRfaW5zaWRlOiBzLm1kX2luc2lkZSxcbiAgICAgICAgZmVuY2VkRW5kUkU6IHMuZmVuY2VkRW5kUkVcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlLmZvcm1hdHRpbmdcbiAgICAgIHN0YXRlLmZvcm1hdHRpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKHN0cmVhbSAhPSBzdGF0ZS50aGlzTGluZS5zdHJlYW0pIHtcbiAgICAgICAgc3RhdGUuaGVhZGVyID0gMDtcbiAgICAgICAgc3RhdGUuaHIgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFxzKiQvLCB0cnVlKSkge1xuICAgICAgICAgIGJsYW5rTGluZShzdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5wcmV2TGluZSA9IHN0YXRlLnRoaXNMaW5lXG4gICAgICAgIHN0YXRlLnRoaXNMaW5lID0ge3N0cmVhbTogc3RyZWFtfVxuXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlLnRhc2tMaXN0XG4gICAgICAgIHN0YXRlLnRhc2tMaXN0ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdGUudHJhaWxpbmdTcGFjZVxuICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlID0gMDtcbiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXN0YXRlLmxvY2FsU3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5mID0gc3RhdGUuYmxvY2s7XG4gICAgICAgICAgaWYgKHN0YXRlLmYgIT0gaHRtbEJsb2NrKSB7XG4gICAgICAgICAgICB2YXIgaW5kZW50YXRpb24gPSBzdHJlYW0ubWF0Y2goL15cXHMqLywgdHJ1ZSlbMF0ucmVwbGFjZSgvXFx0L2csIGV4cGFuZGVkVGFiKS5sZW5ndGg7XG4gICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xuICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb25EaWZmID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpbmRlbnRhdGlvbiA+IDApIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlLmYoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSxcblxuICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgIGlmIChzdGF0ZS5ibG9jayA9PSBodG1sQmxvY2spIHJldHVybiB7c3RhdGU6IHN0YXRlLmh0bWxTdGF0ZSwgbW9kZTogaHRtbE1vZGV9O1xuICAgICAgaWYgKHN0YXRlLmxvY2FsU3RhdGUpIHJldHVybiB7c3RhdGU6IHN0YXRlLmxvY2FsU3RhdGUsIG1vZGU6IHN0YXRlLmxvY2FsTW9kZX07XG4gICAgICByZXR1cm4ge3N0YXRlOiBzdGF0ZSwgbW9kZTogbW9kZX07XG4gICAgfSxcblxuICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgbGluZSkge1xuICAgICAgaWYgKHN0YXRlLmJsb2NrID09IGh0bWxCbG9jayAmJiBodG1sTW9kZS5pbmRlbnQpIHJldHVybiBodG1sTW9kZS5pbmRlbnQoc3RhdGUuaHRtbFN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpXG4gICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSAmJiBzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KSByZXR1cm4gc3RhdGUubG9jYWxNb2RlLmluZGVudChzdGF0ZS5sb2NhbFN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpXG4gICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzXG4gICAgfSxcblxuICAgIGJsYW5rTGluZTogYmxhbmtMaW5lLFxuXG4gICAgZ2V0VHlwZTogZ2V0VHlwZSxcblxuICAgIGNsb3NlQnJhY2tldHM6IFwiKClbXXt9JydcXFwiXFxcImBgXCIsXG4gICAgZm9sZDogXCJtYXJrZG93blwiXG4gIH07XG4gIHJldHVybiBtb2RlO1xufSwgXCJ4bWxcIik7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQvbWFya2Rvd25cIiwgXCJtYXJrZG93blwiKTtcblxuQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC94LW1hcmtkb3duXCIsIFwibWFya2Rvd25cIik7XG5cbn0pO1xuXG4vKiMgc291cmNlVVJMPWNtX21vZGVzL21hcmtkb3duLmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvY2xvanVyZS5qcyJdPSIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFXG5cbi8qKlxuICogQXV0aG9yOiBIYW5zIEVuZ2VsXG4gKiBCcmFuY2hlZCBmcm9tIENvZGVNaXJyb3IncyBTY2hlbWUgbW9kZSAoYnkgS29oIFppIEhhbiwgYmFzZWQgb24gaW1wbGVtZW50YXRpb24gYnkgS29oIFppIENodW4pXG4gKi9cblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSk7XG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiXSwgbW9kKTtcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKTtcbn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHtcblwidXNlIHN0cmljdFwiO1xuXG5Db2RlTWlycm9yLmRlZmluZU1vZGUoXCJjbG9qdXJlXCIsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIEJVSUxUSU4gPSBcImJ1aWx0aW5cIiwgQ09NTUVOVCA9IFwiY29tbWVudFwiLCBTVFJJTkcgPSBcInN0cmluZ1wiLCBDSEFSQUNURVIgPSBcInN0cmluZy0yXCIsXG4gICAgICAgIEFUT00gPSBcImF0b21cIiwgTlVNQkVSID0gXCJudW1iZXJcIiwgQlJBQ0tFVCA9IFwiYnJhY2tldFwiLCBLRVlXT1JEID0gXCJrZXl3b3JkXCIsIFZBUiA9IFwidmFyaWFibGVcIjtcbiAgICB2YXIgSU5ERU5UX1dPUkRfU0tJUCA9IG9wdGlvbnMuaW5kZW50VW5pdCB8fCAyO1xuICAgIHZhciBOT1JNQUxfSU5ERU5UX1VOSVQgPSBvcHRpb25zLmluZGVudFVuaXQgfHwgMjtcblxuICAgIGZ1bmN0aW9uIG1ha2VLZXl3b3JkcyhzdHIpIHtcbiAgICAgICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdChcIiBcIik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHZhciBhdG9tcyA9IG1ha2VLZXl3b3JkcyhcInRydWUgZmFsc2UgbmlsXCIpO1xuXG4gICAgdmFyIGtleXdvcmRzID0gbWFrZUtleXdvcmRzKFxuICAgICAgXCJkZWZuIGRlZm4tIGRlZiBkZWYtIGRlZm9uY2UgZGVmbXVsdGkgZGVmbWV0aG9kIGRlZm1hY3JvIGRlZnN0cnVjdCBkZWZ0eXBlIGRlZnByb3RvY29sIGRlZnJlY29yZCBkZWZwcm9qZWN0IGRlZnRlc3QgXCIgK1xuICAgICAgXCJzbGljZSBkZWZhbGlhcyBkZWZoaW50ZWQgZGVmbWFjcm8tIGRlZm4tbWVtbyBkZWZuayBkZWZuayBkZWZvbmNlLSBkZWZ1bmJvdW5kIGRlZnVuYm91bmQtIGRlZnZhciBkZWZ2YXItIGxldCBsZXRmbiBcIiArXG4gICAgICBcImRvIGNhc2UgY29uZCBjb25kcCBmb3IgbG9vcCByZWN1ciB3aGVuIHdoZW4tbm90IHdoZW4tbGV0IHdoZW4tZmlyc3QgaWYgaWYtbGV0IGlmLW5vdCAuIC4uIC0+IC0+PiBkb3RvIGFuZCBvciBkb3N5bmMgXCIgK1xuICAgICAgXCJkb3NlcSBkb3RpbWVzIGRvcnVuIGRvYWxsIGxvYWQgaW1wb3J0IHVuaW1wb3J0IG5zIGluLW5zIHJlZmVyIHRyeSBjYXRjaCBmaW5hbGx5IHRocm93IHdpdGgtb3BlbiB3aXRoLWxvY2FsLXZhcnMgXCIgK1xuICAgICAgXCJiaW5kaW5nIGdlbi1jbGFzcyBnZW4tYW5kLWxvYWQtY2xhc3MgZ2VuLWFuZC1zYXZlLWNsYXNzIGhhbmRsZXItY2FzZSBoYW5kbGVcIik7XG5cbiAgICB2YXIgYnVpbHRpbnMgPSBtYWtlS2V5d29yZHMoXG4gICAgICAgIFwiKiAqJyAqMSAqMiAqMyAqYWdlbnQqICphbGxvdy11bnJlc29sdmVkLXZhcnMqICphc3NlcnQqICpjbG9qdXJlLXZlcnNpb24qICpjb21tYW5kLWxpbmUtYXJncyogKmNvbXBpbGUtZmlsZXMqIFwiICtcbiAgICAgICAgXCIqY29tcGlsZS1wYXRoKiAqY29tcGlsZXItb3B0aW9ucyogKmRhdGEtcmVhZGVycyogKmUgKmVyciogKmZpbGUqICpmbHVzaC1vbi1uZXdsaW5lKiAqZm4tbG9hZGVyKiAqaW4qIFwiICtcbiAgICAgICAgXCIqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICpwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogKnJlYWQtZXZhbCogXCIgK1xuICAgICAgICBcIipzb3VyY2UtcGF0aCogKnVuY2hlY2tlZC1tYXRoKiAqdXNlLWNvbnRleHQtY2xhc3Nsb2FkZXIqICp2ZXJib3NlLWRlZnJlY29yZHMqICp3YXJuLW9uLXJlZmxlY3Rpb24qICsgKycgLSAtJyAtPiBcIiArXG4gICAgICAgIFwiLT4+IC0+QXJyYXlDaHVuayAtPlZlYyAtPlZlY05vZGUgLT5WZWNTZXEgLWNhY2hlLXByb3RvY29sLWZuIC1yZXNldC1tZXRob2RzIC4uIC8gPCA8PSA9ID09ID4gPj0gRU1QVFktTk9ERSBhY2Nlc3NvciBcIiArXG4gICAgICAgIFwiYWNsb25lIGFkZC1jbGFzc3BhdGggYWRkLXdhdGNoIGFnZW50IGFnZW50LWVycm9yIGFnZW50LWVycm9ycyBhZ2V0IGFsZW5ndGggYWxpYXMgYWxsLW5zIGFsdGVyIGFsdGVyLW1ldGEhIFwiICtcbiAgICAgICAgXCJhbHRlci12YXItcm9vdCBhbWFwIGFuY2VzdG9ycyBhbmQgYXBwbHkgYXJlZHVjZSBhcnJheS1tYXAgYXNldCBhc2V0LWJvb2xlYW4gYXNldC1ieXRlIGFzZXQtY2hhciBhc2V0LWRvdWJsZSBcIiArXG4gICAgICAgIFwiYXNldC1mbG9hdCBhc2V0LWludCBhc2V0LWxvbmcgYXNldC1zaG9ydCBhc3NlcnQgYXNzb2MgYXNzb2MhIGFzc29jLWluIGFzc29jaWF0aXZlPyBhdG9tIGF3YWl0IGF3YWl0LWZvciBhd2FpdDEgXCIgK1xuICAgICAgICBcImJhc2VzIGJlYW4gYmlnZGVjIGJpZ2ludCBiaWdpbnRlZ2VyIGJpbmRpbmcgYml0LWFuZCBiaXQtYW5kLW5vdCBiaXQtY2xlYXIgYml0LWZsaXAgYml0LW5vdCBiaXQtb3IgYml0LXNldCBcIiArXG4gICAgICAgIFwiYml0LXNoaWZ0LWxlZnQgYml0LXNoaWZ0LXJpZ2h0IGJpdC10ZXN0IGJpdC14b3IgYm9vbGVhbiBib29sZWFuLWFycmF5IGJvb2xlYW5zIGJvdW5kLWZuIGJvdW5kLWZuKiBib3VuZD8gYnV0bGFzdCBcIiArXG4gICAgICAgIFwiYnl0ZSBieXRlLWFycmF5IGJ5dGVzIGNhc2UgY2F0IGNhc3QgY2hhciBjaGFyLWFycmF5IGNoYXItZXNjYXBlLXN0cmluZyBjaGFyLW5hbWUtc3RyaW5nIGNoYXI/IGNoYXJzIGNodW5rIGNodW5rLWFwcGVuZCBcIiArXG4gICAgICAgIFwiY2h1bmstYnVmZmVyIGNodW5rLWNvbnMgY2h1bmstZmlyc3QgY2h1bmstbmV4dCBjaHVuay1yZXN0IGNodW5rZWQtc2VxPyBjbGFzcyBjbGFzcz8gY2xlYXItYWdlbnQtZXJyb3JzIFwiICtcbiAgICAgICAgXCJjbG9qdXJlLXZlcnNpb24gY29sbD8gY29tbWVudCBjb21tdXRlIGNvbXAgY29tcGFyYXRvciBjb21wYXJlIGNvbXBhcmUtYW5kLXNldCEgY29tcGlsZSBjb21wbGVtZW50IGNvbXBsZXRpbmcgY29uY2F0IGNvbmQgY29uZHAgXCIgK1xuICAgICAgICBcImNvbmogY29uaiEgY29ucyBjb25zdGFudGx5IGNvbnN0cnVjdC1wcm94eSBjb250YWlucz8gY291bnQgY291bnRlZD8gY3JlYXRlLW5zIGNyZWF0ZS1zdHJ1Y3QgY3ljbGUgZGVjIGRlYycgZGVjaW1hbD8gXCIgK1xuICAgICAgICBcImRlY2xhcmUgZGVkdXBlIGRlZmF1bHQtZGF0YS1yZWFkZXJzIGRlZmlubGluZSBkZWZpbnRlcmZhY2UgZGVmbWFjcm8gZGVmbWV0aG9kIGRlZm11bHRpIGRlZm4gZGVmbi0gZGVmb25jZSBkZWZwcm90b2NvbCBcIiArXG4gICAgICAgIFwiZGVmcmVjb3JkIGRlZnN0cnVjdCBkZWZ0eXBlIGRlbGF5IGRlbGF5PyBkZWxpdmVyIGRlbm9taW5hdG9yIGRlcmVmIGRlcml2ZSBkZXNjZW5kYW50cyBkZXN0cnVjdHVyZSBkaXNqIGRpc2ohIGRpc3NvYyBcIiArXG4gICAgICAgIFwiZGlzc29jISBkaXN0aW5jdCBkaXN0aW5jdD8gZG9hbGwgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgXCIgK1xuICAgICAgICBcImRyb3Atd2hpbGUgZWR1Y3Rpb24gZW1wdHkgZW1wdHk/IGVuc3VyZSBlbnVtZXJhdGlvbi1zZXEgZXJyb3ItaGFuZGxlciBlcnJvci1tb2RlIGV2YWwgZXZlbj8gZXZlcnktcHJlZCBldmVyeT8gZXgtZGF0YSBleC1pbmZvIFwiICtcbiAgICAgICAgXCJleHRlbmQgZXh0ZW5kLXByb3RvY29sIGV4dGVuZC10eXBlIGV4dGVuZGVycyBleHRlbmRzPyBmYWxzZT8gZmZpcnN0IGZpbGUtc2VxIGZpbHRlciBmaWx0ZXJ2IGZpbmQgZmluZC1rZXl3b3JkIFwiICtcbiAgICAgICAgXCJmaW5kLW5zIGZpbmQtcHJvdG9jb2wtaW1wbCBmaW5kLXByb3RvY29sLW1ldGhvZCBmaW5kLXZhciBmaXJzdCBmbGF0dGVuIGZsb2F0IGZsb2F0LWFycmF5IGZsb2F0PyBmbG9hdHMgZmx1c2ggZm4gZm4/IFwiICtcbiAgICAgICAgXCJmbmV4dCBmbmlsIGZvciBmb3JjZSBmb3JtYXQgZnJlcXVlbmNpZXMgZnV0dXJlIGZ1dHVyZS1jYWxsIGZ1dHVyZS1jYW5jZWwgZnV0dXJlLWNhbmNlbGxlZD8gZnV0dXJlLWRvbmU/IGZ1dHVyZT8gXCIgK1xuICAgICAgICBcImdlbi1jbGFzcyBnZW4taW50ZXJmYWNlIGdlbnN5bSBnZXQgZ2V0LWluIGdldC1tZXRob2QgZ2V0LXByb3h5LWNsYXNzIGdldC10aHJlYWQtYmluZGluZ3MgZ2V0LXZhbGlkYXRvciBncm91cC1ieSBoYXNoIFwiICtcbiAgICAgICAgXCJoYXNoLWNvbWJpbmUgaGFzaC1tYXAgaGFzaC1zZXQgaWRlbnRpY2FsPyBpZGVudGl0eSBpZi1sZXQgaWYtbm90IGlmbj8gaW1wb3J0IGluLW5zIGluYyBpbmMnIGluaXQtcHJveHkgaW5zdGFuY2U/IFwiICtcbiAgICAgICAgXCJpbnQgaW50LWFycmF5IGludGVnZXI/IGludGVybGVhdmUgaW50ZXJuIGludGVycG9zZSBpbnRvIGludG8tYXJyYXkgaW50cyBpbyEgaXNhPyBpdGVyYXRlIGl0ZXJhdG9yLXNlcSBqdXh0IGtlZXAgXCIgK1xuICAgICAgICBcImtlZXAtaW5kZXhlZCBrZXkga2V5cyBrZXl3b3JkIGtleXdvcmQ/IGxhc3QgbGF6eS1jYXQgbGF6eS1zZXEgbGV0IGxldGZuIGxpbmUtc2VxIGxpc3QgbGlzdCogbGlzdD8gbG9hZCBsb2FkLWZpbGUgXCIgK1xuICAgICAgICBcImxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5IFwiICtcbiAgICAgICAgXCJtYWtlLWhpZXJhcmNoeSBtYXAgbWFwLWluZGV4ZWQgbWFwPyBtYXBjYXQgbWFwdiBtYXggbWF4LWtleSBtZW1mbiBtZW1vaXplIG1lcmdlIG1lcmdlLXdpdGggbWV0YSBtZXRob2Qtc2lnIG1ldGhvZHMgXCIgK1xuICAgICAgICBcIm1pbiBtaW4ta2V5IG1vZCBtdW5nZSBuYW1lIG5hbWVzcGFjZSBuYW1lc3BhY2UtbXVuZ2UgbmVnPyBuZXdsaW5lIG5leHQgbmZpcnN0IG5pbD8gbm5leHQgbm90IG5vdC1hbnk/IG5vdC1lbXB0eSBcIiArXG4gICAgICAgIFwibm90LWV2ZXJ5PyBub3Q9IG5zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBcIiArXG4gICAgICAgIFwibnMtdW5tYXAgbnRoIG50aG5leHQgbnRocmVzdCBudW0gbnVtYmVyPyBudW1lcmF0b3Igb2JqZWN0LWFycmF5IG9kZD8gb3IgcGFyZW50cyBwYXJ0aWFsIHBhcnRpdGlvbiBwYXJ0aXRpb24tYWxsIFwiICtcbiAgICAgICAgXCJwYXJ0aXRpb24tYnkgcGNhbGxzIHBlZWsgcGVyc2lzdGVudCEgcG1hcCBwb3AgcG9wISBwb3AtdGhyZWFkLWJpbmRpbmdzIHBvcz8gcHIgcHItc3RyIHByZWZlci1tZXRob2QgcHJlZmVycyBcIiArXG4gICAgICAgIFwicHJpbWl0aXZlcy1jbGFzc25hbWVzIHByaW50IHByaW50LWN0b3IgcHJpbnQtZHVwIHByaW50LW1ldGhvZCBwcmludC1zaW1wbGUgcHJpbnQtc3RyIHByaW50ZiBwcmludGxuIHByaW50bG4tc3RyIFwiICtcbiAgICAgICAgXCJwcm4gcHJuLXN0ciBwcm9taXNlIHByb3h5IHByb3h5LWNhbGwtd2l0aC1zdXBlciBwcm94eS1tYXBwaW5ncyBwcm94eS1uYW1lIHByb3h5LXN1cGVyIHB1c2gtdGhyZWFkLWJpbmRpbmdzIHB2YWx1ZXMgXCIgK1xuICAgICAgICBcInF1b3QgcmFuZCByYW5kLWludCByYW5kLW50aCByYW5kb20tc2FtcGxlIHJhbmdlIHJhdGlvPyByYXRpb25hbD8gcmF0aW9uYWxpemUgcmUtZmluZCByZS1ncm91cHMgcmUtbWF0Y2hlciByZS1tYXRjaGVzIHJlLXBhdHRlcm4gXCIgK1xuICAgICAgICBcInJlLXNlcSByZWFkIHJlYWQtbGluZSByZWFkLXN0cmluZyByZWFsaXplZD8gcmVkdWNlIHJlZHVjZS1rdiByZWR1Y3Rpb25zIHJlZiByZWYtaGlzdG9yeS1jb3VudCByZWYtbWF4LWhpc3RvcnkgXCIgK1xuICAgICAgICBcInJlZi1taW4taGlzdG9yeSByZWYtc2V0IHJlZmVyIHJlZmVyLWNsb2p1cmUgcmVpZnkgcmVsZWFzZS1wZW5kaW5nLXNlbmRzIHJlbSByZW1vdmUgcmVtb3ZlLWFsbC1tZXRob2RzIFwiICtcbiAgICAgICAgXCJyZW1vdmUtbWV0aG9kIHJlbW92ZS1ucyByZW1vdmUtd2F0Y2ggcmVwZWF0IHJlcGVhdGVkbHkgcmVwbGFjZSByZXBsaWNhdGUgcmVxdWlyZSByZXNldCEgcmVzZXQtbWV0YSEgcmVzb2x2ZSByZXN0IFwiICtcbiAgICAgICAgXCJyZXN0YXJ0LWFnZW50IHJlc3VsdHNldC1zZXEgcmV2ZXJzZSByZXZlcnNpYmxlPyByc2VxIHJzdWJzZXEgc2F0aXNmaWVzPyBzZWNvbmQgc2VsZWN0LWtleXMgc2VuZCBzZW5kLW9mZiBzZXEgc2VxPyBcIiArXG4gICAgICAgIFwic2VxdWUgc2VxdWVuY2Ugc2VxdWVudGlhbD8gc2V0IHNldC1lcnJvci1oYW5kbGVyISBzZXQtZXJyb3ItbW9kZSEgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgXCIgK1xuICAgICAgICBcInNodWZmbGUgc2h1dGRvd24tYWdlbnRzIHNsdXJwIHNvbWUgc29tZS1mbiBzb3J0IHNvcnQtYnkgc29ydGVkLW1hcCBzb3J0ZWQtbWFwLWJ5IHNvcnRlZC1zZXQgc29ydGVkLXNldC1ieSBzb3J0ZWQ/IFwiICtcbiAgICAgICAgXCJzcGVjaWFsLXN5bWJvbD8gc3BpdCBzcGxpdC1hdCBzcGxpdC13aXRoIHN0ciBzdHJpbmc/IHN0cnVjdCBzdHJ1Y3QtbWFwIHN1YnMgc3Vic2VxIHN1YnZlYyBzdXBlcnMgc3dhcCEgc3ltYm9sIFwiICtcbiAgICAgICAgXCJzeW1ib2w/IHN5bmMgdGFrZSB0YWtlLWxhc3QgdGFrZS1udGggdGFrZS13aGlsZSB0ZXN0IHRoZS1ucyB0aHJlYWQtYm91bmQ/IHRpbWUgdG8tYXJyYXkgdG8tYXJyYXktMmQgdHJhbXBvbGluZSB0cmFuc2R1Y2UgXCIgK1xuICAgICAgICBcInRyYW5zaWVudCB0cmVlLXNlcSB0cnVlPyB0eXBlIHVuY2hlY2tlZC1hZGQgdW5jaGVja2VkLWFkZC1pbnQgdW5jaGVja2VkLWJ5dGUgdW5jaGVja2VkLWNoYXIgdW5jaGVja2VkLWRlYyBcIiArXG4gICAgICAgIFwidW5jaGVja2VkLWRlYy1pbnQgdW5jaGVja2VkLWRpdmlkZS1pbnQgdW5jaGVja2VkLWRvdWJsZSB1bmNoZWNrZWQtZmxvYXQgdW5jaGVja2VkLWluYyB1bmNoZWNrZWQtaW5jLWludCBcIiArXG4gICAgICAgIFwidW5jaGVja2VkLWludCB1bmNoZWNrZWQtbG9uZyB1bmNoZWNrZWQtbXVsdGlwbHkgdW5jaGVja2VkLW11bHRpcGx5LWludCB1bmNoZWNrZWQtbmVnYXRlIHVuY2hlY2tlZC1uZWdhdGUtaW50IFwiK1xuICAgICAgICBcInVuY2hlY2tlZC1yZW1haW5kZXItaW50IHVuY2hlY2tlZC1zaG9ydCB1bmNoZWNrZWQtc3VidHJhY3QgdW5jaGVja2VkLXN1YnRyYWN0LWludCB1bmRlcml2ZSB1bnF1b3RlIFwiICtcbiAgICAgICAgXCJ1bnF1b3RlLXNwbGljaW5nIHVwZGF0ZSB1cGRhdGUtaW4gdXBkYXRlLXByb3h5IHVzZSB2YWwgdmFscyB2YXItZ2V0IHZhci1zZXQgdmFyPyB2YXJ5LW1ldGEgdmVjIHZlY3RvciB2ZWN0b3Itb2YgXCIgK1xuICAgICAgICBcInZlY3Rvcj8gdm9sYXRpbGUhIHZvbGF0aWxlPyB2cmVzZXQhIHZzd2FwISB3aGVuIHdoZW4tZmlyc3Qgd2hlbi1sZXQgd2hlbi1ub3Qgd2hpbGUgd2l0aC1iaW5kaW5ncyB3aXRoLWJpbmRpbmdzKiB3aXRoLWluLXN0ciB3aXRoLWxvYWRpbmctY29udGV4dCBcIiArXG4gICAgICAgIFwid2l0aC1sb2NhbC12YXJzIHdpdGgtbWV0YSB3aXRoLW9wZW4gd2l0aC1vdXQtc3RyIHdpdGgtcHJlY2lzaW9uIHdpdGgtcmVkZWZzIHdpdGgtcmVkZWZzLWZuIHhtbC1zZXEgemVybz8gemlwbWFwIFwiICtcbiAgICAgICAgXCIqZGVmYXVsdC1kYXRhLXJlYWRlci1mbiogYXMtPiBjb25kLT4gY29uZC0+PiByZWR1Y2VkIHJlZHVjZWQ/IHNlbmQtdmlhIHNldC1hZ2VudC1zZW5kLWV4ZWN1dG9yISBcIiArXG4gICAgICAgIFwic2V0LWFnZW50LXNlbmQtb2ZmLWV4ZWN1dG9yISBzb21lLT4gc29tZS0+PlwiKTtcblxuICAgIHZhciBpbmRlbnRLZXlzID0gbWFrZUtleXdvcmRzKFxuICAgICAgICAvLyBCdWlsdC1pbnNcbiAgICAgICAgXCJucyBmbiBkZWYgZGVmbiBkZWZtZXRob2QgYm91bmQtZm4gaWYgaWYtbm90IGNhc2UgY29uZHAgd2hlbiB3aGlsZSB3aGVuLW5vdCB3aGVuLWZpcnN0IGRvIGZ1dHVyZSBjb21tZW50IGRvdG8gXCIgK1xuICAgICAgICBcImxvY2tpbmcgcHJveHkgd2l0aC1vcGVuIHdpdGgtcHJlY2lzaW9uIHJlaWZ5IGRlZnR5cGUgZGVmcmVjb3JkIGRlZnByb3RvY29sIGV4dGVuZCBleHRlbmQtcHJvdG9jb2wgZXh0ZW5kLXR5cGUgXCIgK1xuICAgICAgICBcInRyeSBjYXRjaCBcIiArXG5cbiAgICAgICAgLy8gQmluZGluZyBmb3Jtc1xuICAgICAgICBcImxldCBsZXRmbiBiaW5kaW5nIGxvb3AgZm9yIGRvc2VxIGRvdGltZXMgd2hlbi1sZXQgaWYtbGV0IFwiICtcblxuICAgICAgICAvLyBEYXRhIHN0cnVjdHVyZXNcbiAgICAgICAgXCJkZWZzdHJ1Y3Qgc3RydWN0LW1hcCBhc3NvYyBcIiArXG5cbiAgICAgICAgLy8gY2xvanVyZS50ZXN0XG4gICAgICAgIFwidGVzdGluZyBkZWZ0ZXN0IFwiICtcblxuICAgICAgICAvLyBjb250cmliXG4gICAgICAgIFwiaGFuZGxlci1jYXNlIGhhbmRsZSBkb3RyYWNlIGRlZnRyYWNlXCIpO1xuXG4gICAgdmFyIHRlc3RzID0ge1xuICAgICAgICBkaWdpdDogL1xcZC8sXG4gICAgICAgIGRpZ2l0X29yX2NvbG9uOiAvW1xcZDpdLyxcbiAgICAgICAgaGV4OiAvWzAtOWEtZl0vaSxcbiAgICAgICAgc2lnbjogL1srLV0vLFxuICAgICAgICBleHBvbmVudDogL2UvaSxcbiAgICAgICAga2V5d29yZF9jaGFyOiAvW15cXHNcXChcXFtcXDtcXClcXF1dLyxcbiAgICAgICAgc3ltYm9sOiAvW1xcdyorIVxcLVxcLl8/Ojw+XFwvXFx4YTEtXFx1ZmZmZl0vLFxuICAgICAgICBibG9ja19pbmRlbnQ6IC9eKD86ZGVmfHdpdGgpW15cXC9dKyR8XFwvKD86ZGVmfHdpdGgpL1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzdGF0ZVN0YWNrKGluZGVudCwgdHlwZSwgcHJldikgeyAvLyByZXByZXNlbnRzIGEgc3RhdGUgc3RhY2sgb2JqZWN0XG4gICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50LCB0eXBlKSB7XG4gICAgICAgIHN0YXRlLmluZGVudFN0YWNrID0gbmV3IHN0YXRlU3RhY2soaW5kZW50LCB0eXBlLCBzdGF0ZS5pbmRlbnRTdGFjayk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9wU3RhY2soc3RhdGUpIHtcbiAgICAgICAgc3RhdGUuaW5kZW50U3RhY2sgPSBzdGF0ZS5pbmRlbnRTdGFjay5wcmV2O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGNoLCBzdHJlYW0pe1xuICAgICAgICAvLyBoZXhcbiAgICAgICAgaWYgKCBjaCA9PT0gJzAnICYmIHN0cmVhbS5lYXQoL3gvaSkgKSB7XG4gICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuaGV4KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVhZGluZyBzaWduXG4gICAgICAgIGlmICggKCBjaCA9PSAnKycgfHwgY2ggPT0gJy0nICkgJiYgKCB0ZXN0cy5kaWdpdC50ZXN0KHN0cmVhbS5wZWVrKCkpICkgKSB7XG4gICAgICAgICAgc3RyZWFtLmVhdCh0ZXN0cy5zaWduKTtcbiAgICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRlc3RzLmRpZ2l0LnRlc3QoY2gpICkge1xuICAgICAgICAgICAgc3RyZWFtLmVhdChjaCk7XG4gICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpO1xuXG4gICAgICAgICAgICBpZiAoICcuJyA9PSBzdHJlYW0ucGVlaygpICkge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoJy4nKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgnLycgPT0gc3RyZWFtLnBlZWsoKSApIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KCcvJyk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLmRpZ2l0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCBzdHJlYW0uZWF0KHRlc3RzLmV4cG9uZW50KSApIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KHRlc3RzLnNpZ24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEVhdCBjaGFyYWN0ZXIgdGhhdCBzdGFydHMgYWZ0ZXIgYmFja3NsYXNoIFxcXG4gICAgZnVuY3Rpb24gZWF0Q2hhcmFjdGVyKHN0cmVhbSkge1xuICAgICAgICB2YXIgZmlyc3QgPSBzdHJlYW0ubmV4dCgpO1xuICAgICAgICAvLyBSZWFkIHNwZWNpYWwgbGl0ZXJhbHM6IGJhY2tzcGFjZSwgbmV3bGluZSwgc3BhY2UsIHJldHVybi5cbiAgICAgICAgLy8gSnVzdCByZWFkIGFsbCBsb3dlcmNhc2UgbGV0dGVycy5cbiAgICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0Lm1hdGNoKC9bYS16XS8pICYmIHN0cmVhbS5tYXRjaCgvW2Etel0rLywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFkIHVuaWNvZGUgY2hhcmFjdGVyOiBcXHUxMDAwIFxcdUEwYTFcbiAgICAgICAgaWYgKGZpcnN0ID09PSBcInVcIikge1xuICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9bMC05YS16XXs0fS9pLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZW50U3RhY2s6IG51bGwsXG4gICAgICAgICAgICAgICAgaW5kZW50YXRpb246IDAsXG4gICAgICAgICAgICAgICAgbW9kZTogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgPT0gbnVsbCAmJiBzdHJlYW0uc29sKCkpIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaW5kZW50YXRpb24sIGJ1dCBvbmx5IGlmIGluZGVudFN0YWNrIGlzIGVtcHR5XG4gICAgICAgICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBzdHJlYW0uaW5kZW50YXRpb24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2tpcCBzcGFjZXNcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlICE9IFwic3RyaW5nXCIgJiYgc3RyZWFtLmVhdFNwYWNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXR1cm5UeXBlID0gbnVsbDtcblxuICAgICAgICAgICAgc3dpdGNoKHN0YXRlLm1vZGUpe1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogLy8gbXVsdGktbGluZSBzdHJpbmcgcGFyc2luZyBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0LCBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IFwiXFxcIlwiICYmICFlc2NhcGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSBcIlxcXFxcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gU1RSSU5HOyAvLyBjb250aW51ZSBvbiBpbiBzdHJpbmcgbW9kZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBkZWZhdWx0IHBhcnNpbmcgbW9kZVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBcIlxcXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gU1RSSU5HO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiXFxcXFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlYXRDaGFyYWN0ZXIoc3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDSEFSQUNURVI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gXCInXCIgJiYgISggdGVzdHMuZGlnaXRfb3JfY29sb24udGVzdChzdHJlYW0ucGVlaygpKSApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQVRPTTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIjtcIikgeyAvLyBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7IC8vIHJlc3Qgb2YgdGhlIGxpbmUgaXMgYSBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihjaCxzdHJlYW0pKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBOVU1CRVI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gXCIoXCIgfHwgY2ggPT0gXCJbXCIgfHwgY2ggPT0gXCJ7XCIgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5V29yZCA9ICcnLCBpbmRlbnRUZW1wID0gc3RyZWFtLmNvbHVtbigpLCBsZXR0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgIEVpdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgKGluZGVudC13b3JkIC4uXG4gICAgICAgICAgICAgICAgICAgICAgICAobm9uLWluZGVudC13b3JkIC4uXG4gICAgICAgICAgICAgICAgICAgICAgICAoO3NvbWV0aGluZyBlbHNlLCBicmFja2V0LCBldGMuXG4gICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gXCIoXCIpIHdoaWxlICgobGV0dGVyID0gc3RyZWFtLmVhdCh0ZXN0cy5rZXl3b3JkX2NoYXIpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5V29yZCArPSBsZXR0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlXb3JkLmxlbmd0aCA+IDAgJiYgKGluZGVudEtleXMucHJvcGVydHlJc0VudW1lcmFibGUoa2V5V29yZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzLmJsb2NrX2luZGVudC50ZXN0KGtleVdvcmQpKSkgeyAvLyBpbmRlbnQtd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIElOREVOVF9XT1JEX1NLSVAsIGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vbi1pbmRlbnQgd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNvbnRpbnVlIGVhdGluZyB0aGUgc3BhY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lb2woKSB8fCBzdHJlYW0ucGVlaygpID09IFwiO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc2lnbmlmaWNhbnQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVzdGFydCBpbmRlbnRhdGlvbiB0aGUgdXNlciBkZWZpbmVkIHNwYWNlcyBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBOT1JNQUxfSU5ERU5UX1VOSVQsIGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBzdHJlYW0uY3VycmVudCgpLmxlbmd0aCwgY2gpOyAvLyBlbHNlIHdlIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCAtIDEpOyAvLyB1bmRvIGFsbCB0aGUgZWF0aW5nXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiKVwiIHx8IGNoID09IFwiXVwiIHx8IGNoID09IFwifVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlJBQ0tFVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayAhPSBudWxsICYmIHN0YXRlLmluZGVudFN0YWNrLnR5cGUgPT0gKGNoID09IFwiKVwiID8gXCIoXCIgOiAoY2ggPT0gXCJdXCIgPyBcIltcIiA6XCJ7XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFN0YWNrKHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY2ggPT0gXCI6XCIgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVE9NO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLnN5bWJvbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBLRVlXT1JEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWlsdGlucyAmJiBidWlsdGlucy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCVUlMVElOO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tcyAmJiBhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBBVE9NO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFZBUjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwpIHJldHVybiBzdGF0ZS5pbmRlbnRhdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xvc2VCcmFja2V0czoge3BhaXJzOiBcIigpW117fVxcXCJcXFwiXCJ9LFxuICAgICAgICBsaW5lQ29tbWVudDogXCI7O1wiXG4gICAgfTtcbn0pO1xuXG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3gtY2xvanVyZVwiLCBcImNsb2p1cmVcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJ0ZXh0L3gtY2xvanVyZXNjcmlwdFwiLCBcImNsb2p1cmVcIik7XG5Db2RlTWlycm9yLmRlZmluZU1JTUUoXCJhcHBsaWNhdGlvbi9lZG5cIiwgXCJjbG9qdXJlXCIpO1xuXG59KTtcblxuLyojIHNvdXJjZVVSTD1jbV9tb2Rlcy9jbG9qdXJlLmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvc3R5bHVzLmpzIl09Ii8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuLy8gU3R5bHVzIG1vZGUgY3JlYXRlZCBieSBEbWl0cnkgS2lzZWx5b3YgaHR0cDovL2dpdC5pby9BYVJCXG5cbihmdW5jdGlvbihtb2QpIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZSA9PSBcIm9iamVjdFwiKSAvLyBDb21tb25KU1xuICAgIG1vZChyZXF1aXJlKFwiLi4vLi4vbGliL2NvZGVtaXJyb3JcIikpO1xuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSAvLyBBTURcbiAgICBkZWZpbmUoW1wiLi4vLi4vbGliL2NvZGVtaXJyb3JcIl0sIG1vZCk7XG4gIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnZcbiAgICBtb2QoQ29kZU1pcnJvcik7XG59KShmdW5jdGlvbihDb2RlTWlycm9yKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIENvZGVNaXJyb3IuZGVmaW5lTW9kZShcInN0eWx1c1wiLCBmdW5jdGlvbihjb25maWcpIHtcbiAgICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LFxuICAgICAgICBpbmRlbnRVbml0U3RyaW5nID0gJycsXG4gICAgICAgIHRhZ0tleXdvcmRzID0ga2V5U2V0KHRhZ0tleXdvcmRzXyksXG4gICAgICAgIHRhZ1ZhcmlhYmxlc1JlZ2V4cCA9IC9eKGF8YnxpfHN8Y29sfGVtKSQvaSxcbiAgICAgICAgcHJvcGVydHlLZXl3b3JkcyA9IGtleVNldChwcm9wZXJ0eUtleXdvcmRzXyksXG4gICAgICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA9IGtleVNldChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfKSxcbiAgICAgICAgdmFsdWVLZXl3b3JkcyA9IGtleVNldCh2YWx1ZUtleXdvcmRzXyksXG4gICAgICAgIGNvbG9yS2V5d29yZHMgPSBrZXlTZXQoY29sb3JLZXl3b3Jkc18pLFxuICAgICAgICBkb2N1bWVudFR5cGVzID0ga2V5U2V0KGRvY3VtZW50VHlwZXNfKSxcbiAgICAgICAgZG9jdW1lbnRUeXBlc1JlZ2V4cCA9IHdvcmRSZWdleHAoZG9jdW1lbnRUeXBlc18pLFxuICAgICAgICBtZWRpYUZlYXR1cmVzID0ga2V5U2V0KG1lZGlhRmVhdHVyZXNfKSxcbiAgICAgICAgbWVkaWFUeXBlcyA9IGtleVNldChtZWRpYVR5cGVzXyksXG4gICAgICAgIGZvbnRQcm9wZXJ0aWVzID0ga2V5U2V0KGZvbnRQcm9wZXJ0aWVzXyksXG4gICAgICAgIG9wZXJhdG9yc1JlZ2V4cCA9IC9eXFxzKihbLl17MiwzfXwmJnxcXHxcXHx8XFwqXFwqfFs/IT06XT89fFstKypcXC8lPD5dPT98XFw/OnxcXH4pLyxcbiAgICAgICAgd29yZE9wZXJhdG9yS2V5d29yZHNSZWdleHAgPSB3b3JkUmVnZXhwKHdvcmRPcGVyYXRvcktleXdvcmRzXyksXG4gICAgICAgIGJsb2NrS2V5d29yZHMgPSBrZXlTZXQoYmxvY2tLZXl3b3Jkc18pLFxuICAgICAgICB2ZW5kb3JQcmVmaXhlc1JlZ2V4cCA9IG5ldyBSZWdFeHAoL15cXC0obW96fG1zfG98d2Via2l0KS0vaSksXG4gICAgICAgIGNvbW1vbkF0b21zID0ga2V5U2V0KGNvbW1vbkF0b21zXyksXG4gICAgICAgIGZpcnN0V29yZE1hdGNoID0gXCJcIixcbiAgICAgICAgc3RhdGVzID0ge30sXG4gICAgICAgIGNoLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgb3ZlcnJpZGU7XG5cbiAgICB3aGlsZSAoaW5kZW50VW5pdFN0cmluZy5sZW5ndGggPCBpbmRlbnRVbml0KSBpbmRlbnRVbml0U3RyaW5nICs9ICcgJztcblxuICAgIC8qKlxuICAgICAqIFRva2VuaXplcnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgZmlyc3RXb3JkTWF0Y2ggPSBzdHJlYW0uc3RyaW5nLm1hdGNoKC8oXltcXHctXStcXHMqPVxccyokKXwoXlxccypbXFx3LV0rXFxzKj1cXHMqW1xcdy1dKXwoXlxccyooXFwufCN8QHxcXCR8XFwmfFxcW3xcXGR8XFwrfDo6P3xcXHt8XFw+fH58XFwvKT9cXHMqW1xcdy1dKihbYS16MC05LV18XFwqfFxcL1xcKikoXFwofCwpPykvKTtcbiAgICAgIHN0YXRlLmNvbnRleHQubGluZS5maXJzdFdvcmQgPSBmaXJzdFdvcmRNYXRjaCA/IGZpcnN0V29yZE1hdGNoWzBdLnJlcGxhY2UoL15cXHMqLywgXCJcIikgOiBcIlwiO1xuICAgICAgc3RhdGUuY29udGV4dC5saW5lLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpO1xuICAgICAgY2ggPSBzdHJlYW0ucGVlaygpO1xuXG4gICAgICAvLyBMaW5lIGNvbW1lbnRcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goXCIvL1wiKSkge1xuICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICAgIHJldHVybiBbXCJjb21tZW50XCIsIFwiY29tbWVudFwiXTtcbiAgICAgIH1cbiAgICAgIC8vIEJsb2NrIGNvbW1lbnRcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goXCIvKlwiKSkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7XG4gICAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpO1xuICAgICAgfVxuICAgICAgLy8gU3RyaW5nXG4gICAgICBpZiAoY2ggPT0gXCJcXFwiXCIgfHwgY2ggPT0gXCInXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIC8vIERlZlxuICAgICAgaWYgKGNoID09IFwiQFwiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xcd1xcXFwtXS8pO1xuICAgICAgICByZXR1cm4gW1wiZGVmXCIsIHN0cmVhbS5jdXJyZW50KCldO1xuICAgICAgfVxuICAgICAgLy8gSUQgc2VsZWN0b3Igb3IgSGV4IGNvbG9yXG4gICAgICBpZiAoY2ggPT0gXCIjXCIpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgLy8gSGV4IGNvbG9yXG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMC05YS1mXXs2fXxbMC05YS1mXXszfS9pKSkge1xuICAgICAgICAgIHJldHVybiBbXCJhdG9tXCIsIFwiYXRvbVwiXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJRCBzZWxlY3RvclxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW2Etel1bXFx3LV0qL2kpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcImJ1aWx0aW5cIiwgXCJoYXNoXCJdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBWZW5kb3IgcHJlZml4ZXNcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2godmVuZG9yUHJlZml4ZXNSZWdleHApKSB7XG4gICAgICAgIHJldHVybiBbXCJtZXRhXCIsIFwidmVuZG9yLXByZWZpeGVzXCJdO1xuICAgICAgfVxuICAgICAgLy8gTnVtYmVyc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOV0/XFwuP1swLTldLykpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bYS16JV0vaSk7XG4gICAgICAgIHJldHVybiBbXCJudW1iZXJcIiwgXCJ1bml0XCJdO1xuICAgICAgfVxuICAgICAgLy8gIWltcG9ydGFudHxvcHRpb25hbFxuICAgICAgaWYgKGNoID09IFwiIVwiKSB7XG4gICAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBbc3RyZWFtLm1hdGNoKC9eKGltcG9ydGFudHxvcHRpb25hbCkvaSkgPyBcImtleXdvcmRcIjogXCJvcGVyYXRvclwiLCBcImltcG9ydGFudFwiXTtcbiAgICAgIH1cbiAgICAgIC8vIENsYXNzXG4gICAgICBpZiAoY2ggPT0gXCIuXCIgJiYgc3RyZWFtLm1hdGNoKC9eXFwuW2Etel1bXFx3LV0qL2kpKSB7XG4gICAgICAgIHJldHVybiBbXCJxdWFsaWZpZXJcIiwgXCJxdWFsaWZpZXJcIl07XG4gICAgICB9XG4gICAgICAvLyB1cmwgdXJsLXByZWZpeCBkb21haW4gcmVnZXhwXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvY3VtZW50VHlwZXNSZWdleHApKSB7XG4gICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09IFwiKFwiKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUGFyZW50aGVzaXplZDtcbiAgICAgICAgcmV0dXJuIFtcInByb3BlcnR5XCIsIFwid29yZFwiXTtcbiAgICAgIH1cbiAgICAgIC8vIE1peGlucyAvIEZ1bmN0aW9uc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlthLXpdW1xcdy1dKlxcKC9pKSkge1xuICAgICAgICBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgICByZXR1cm4gW1wia2V5d29yZFwiLCBcIm1peGluXCJdO1xuICAgICAgfVxuICAgICAgLy8gQmxvY2sgbWl4aW5zXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFxcK3wtKVthLXpdW1xcdy1dKlxcKC9pKSkge1xuICAgICAgICBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgICByZXR1cm4gW1wia2V5d29yZFwiLCBcImJsb2NrLW1peGluXCJdO1xuICAgICAgfVxuICAgICAgLy8gUGFyZW50IFJlZmVyZW5jZSBCRU0gbmFtaW5nXG4gICAgICBpZiAoc3RyZWFtLnN0cmluZy5tYXRjaCgvXlxccyomLykgJiYgc3RyZWFtLm1hdGNoKC9eWy1fXStbYS16XVtcXHctXSovKSkge1xuICAgICAgICByZXR1cm4gW1wicXVhbGlmaWVyXCIsIFwicXVhbGlmaWVyXCJdO1xuICAgICAgfVxuICAgICAgLy8gLyBSb290IFJlZmVyZW5jZSAmIFBhcmVudCBSZWZlcmVuY2VcbiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXFwvfCYpKC18X3w6fFxcLnwjfFthLXpdKS8pKSB7XG4gICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7XG4gICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0zXCIsIFwicmVmZXJlbmNlXCJdO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiZ7MX1cXHMqJC8pKSB7XG4gICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0zXCIsIFwicmVmZXJlbmNlXCJdO1xuICAgICAgfVxuICAgICAgLy8gV29yZCBvcGVyYXRvclxuICAgICAgaWYgKHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JLZXl3b3Jkc1JlZ2V4cCkpIHtcbiAgICAgICAgcmV0dXJuIFtcIm9wZXJhdG9yXCIsIFwib3BlcmF0b3JcIl07XG4gICAgICB9XG4gICAgICAvLyBXb3JkXG4gICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFwkP1stX10qW2EtejAtOV0rW1xcdy1dKi9pKSkge1xuICAgICAgICAvLyBWYXJpYWJsZVxuICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFxcLnxcXFspW1xcdy1cXCdcXFwiXFxdXSsvaSwgZmFsc2UpKSB7XG4gICAgICAgICAgaWYgKCF3b3JkSXNUYWcoc3RyZWFtLmN1cnJlbnQoKSkpIHtcbiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXFwuLyk7XG4gICAgICAgICAgICByZXR1cm4gW1widmFyaWFibGUtMlwiLCBcInZhcmlhYmxlLW5hbWVcIl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJ2YXJpYWJsZS0yXCIsIFwid29yZFwiXTtcbiAgICAgIH1cbiAgICAgIC8vIE9wZXJhdG9yc1xuICAgICAgaWYgKHN0cmVhbS5tYXRjaChvcGVyYXRvcnNSZWdleHApKSB7XG4gICAgICAgIHJldHVybiBbXCJvcGVyYXRvclwiLCBzdHJlYW0uY3VycmVudCgpXTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGltaXRlcnNcbiAgICAgIGlmICgvWzo7LHt9XFxbXFxdXFwoXFwpXS8udGVzdChjaCkpIHtcbiAgICAgICAgc3RyZWFtLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIFtudWxsLCBjaF07XG4gICAgICB9XG4gICAgICAvLyBOb24tZGV0ZWN0ZWQgaXRlbXNcbiAgICAgIHN0cmVhbS5uZXh0KCk7XG4gICAgICByZXR1cm4gW251bGwsIG51bGxdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRva2VuIGNvbW1lbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDtcbiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSBcIi9cIikge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtYXliZUVuZCA9IChjaCA9PSBcIipcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1wiY29tbWVudFwiLCBcImNvbW1lbnRcIl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9rZW4gc3RyaW5nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoO1xuICAgICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge1xuICAgICAgICAgICAgaWYgKHF1b3RlID09IFwiKVwiKSBzdHJlYW0uYmFja1VwKDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSBcIlxcXFxcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT0gcXVvdGUgfHwgIWVzY2FwZWQgJiYgcXVvdGUgIT0gXCIpXCIpIHN0YXRlLnRva2VuaXplID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtcInN0cmluZ1wiLCBcInN0cmluZ1wiXTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9rZW4gcGFyZW50aGVzaXplZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRva2VuUGFyZW50aGVzaXplZChzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBzdHJlYW0ubmV4dCgpOyAvLyBNdXN0IGJlIFwiKFwiXG4gICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvXFxzKltcXFwiXFwnKV0vLCBmYWxzZSkpXG4gICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoXCIpXCIpO1xuICAgICAgZWxzZVxuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICByZXR1cm4gW251bGwsIFwiKFwiXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250ZXh0IG1hbmFnZW1lbnRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBDb250ZXh0KHR5cGUsIGluZGVudCwgcHJldiwgbGluZSkge1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50O1xuICAgICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICAgIHRoaXMubGluZSA9IGxpbmUgfHwge2ZpcnN0V29yZDogXCJcIiwgaW5kZW50OiAwfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCB0eXBlLCBpbmRlbnQpIHtcbiAgICAgIGluZGVudCA9IGluZGVudCA+PSAwID8gaW5kZW50IDogaW5kZW50VW5pdDtcbiAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dCh0eXBlLCBzdHJlYW0uaW5kZW50YXRpb24oKSArIGluZGVudCwgc3RhdGUuY29udGV4dCk7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlLCBjdXJyZW50SW5kZW50KSB7XG4gICAgICB2YXIgY29udGV4dEluZGVudCA9IHN0YXRlLmNvbnRleHQuaW5kZW50IC0gaW5kZW50VW5pdDtcbiAgICAgIGN1cnJlbnRJbmRlbnQgPSBjdXJyZW50SW5kZW50IHx8IGZhbHNlO1xuICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbiAgICAgIGlmIChjdXJyZW50SW5kZW50KSBzdGF0ZS5jb250ZXh0LmluZGVudCA9IGNvbnRleHRJbmRlbnQ7XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlc1tzdGF0ZS5jb250ZXh0LnR5cGVdKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSwgbikge1xuICAgICAgZm9yICh2YXIgaSA9IG4gfHwgMTsgaSA+IDA7IGktLSlcbiAgICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjtcbiAgICAgIHJldHVybiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUGFyc2VyXG4gICAgICovXG4gICAgZnVuY3Rpb24gd29yZElzVGFnKHdvcmQpIHtcbiAgICAgIHJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCkgaW4gdGFnS2V5d29yZHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd29yZElzUHJvcGVydHkod29yZCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB3b3JkIGluIHByb3BlcnR5S2V5d29yZHMgfHwgd29yZCBpbiBmb250UHJvcGVydGllcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3b3JkSXNCbG9jayh3b3JkKSB7XG4gICAgICByZXR1cm4gd29yZC50b0xvd2VyQ2FzZSgpIGluIGJsb2NrS2V5d29yZHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd29yZElzVmVuZG9yUHJlZml4KHdvcmQpIHtcbiAgICAgIHJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCkubWF0Y2godmVuZG9yUHJlZml4ZXNSZWdleHApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHdvcmQpIHtcbiAgICAgIHZhciB3b3JkTEMgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgb3ZlcnJpZGUgPSBcInZhcmlhYmxlLTJcIjtcbiAgICAgIGlmICh3b3JkSXNUYWcod29yZCkpIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICAgIGVsc2UgaWYgKHdvcmRJc0Jsb2NrKHdvcmQpKSBvdmVycmlkZSA9IFwiYmxvY2sta2V5d29yZFwiO1xuICAgICAgZWxzZSBpZiAod29yZElzUHJvcGVydHkod29yZCkpIG92ZXJyaWRlID0gXCJwcm9wZXJ0eVwiO1xuICAgICAgZWxzZSBpZiAod29yZExDIGluIHZhbHVlS2V5d29yZHMgfHwgd29yZExDIGluIGNvbW1vbkF0b21zKSBvdmVycmlkZSA9IFwiYXRvbVwiO1xuICAgICAgZWxzZSBpZiAod29yZExDID09IFwicmV0dXJuXCIgfHwgd29yZExDIGluIGNvbG9yS2V5d29yZHMpIG92ZXJyaWRlID0gXCJrZXl3b3JkXCI7XG5cbiAgICAgIC8vIEZvbnQgZmFtaWx5XG4gICAgICBlbHNlIGlmICh3b3JkLm1hdGNoKC9eW0EtWl0vKSkgb3ZlcnJpZGUgPSBcInN0cmluZ1wiO1xuICAgICAgcmV0dXJuIG92ZXJyaWRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHR5cGVJc0Jsb2NrKHR5cGUsIHN0cmVhbSkge1xuICAgICAgcmV0dXJuICgoZW5kT2ZMaW5lKHN0cmVhbSkgJiYgKHR5cGUgPT0gXCJ7XCIgfHwgdHlwZSA9PSBcIl1cIiB8fCB0eXBlID09IFwiaGFzaFwiIHx8IHR5cGUgPT0gXCJxdWFsaWZpZXJcIikpIHx8IHR5cGUgPT0gXCJibG9jay1taXhpblwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0eXBlSXNJbnRlcnBvbGF0aW9uKHR5cGUsIHN0cmVhbSkge1xuICAgICAgcmV0dXJuIHR5cGUgPT0gXCJ7XCIgJiYgc3RyZWFtLm1hdGNoKC9eXFxzKlxcJD9bXFx3LV0rL2ksIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0eXBlSXNQc2V1ZG8odHlwZSwgc3RyZWFtKSB7XG4gICAgICByZXR1cm4gdHlwZSA9PSBcIjpcIiAmJiBzdHJlYW0ubWF0Y2goL15bYS16LV0rLywgZmFsc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lKHN0cmVhbSkge1xuICAgICAgcmV0dXJuIHN0cmVhbS5zb2woKSB8fCBzdHJlYW0uc3RyaW5nLm1hdGNoKG5ldyBSZWdFeHAoXCJeXFxcXHMqXCIgKyBlc2NhcGVSZWdFeHAoc3RyZWFtLmN1cnJlbnQoKSkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZkxpbmUoc3RyZWFtKSB7XG4gICAgICByZXR1cm4gc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5tYXRjaCgvXlxccyokLywgZmFsc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcnN0V29yZE9mTGluZShsaW5lKSB7XG4gICAgICB2YXIgcmUgPSAvXlxccypbLV9dKlthLXowLTldK1tcXHctXSovaTtcbiAgICAgIHZhciByZXN1bHQgPSB0eXBlb2YgbGluZSA9PSBcInN0cmluZ1wiID8gbGluZS5tYXRjaChyZSkgOiBsaW5lLnN0cmluZy5tYXRjaChyZSk7XG4gICAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0WzBdLnJlcGxhY2UoL15cXHMqLywgXCJcIikgOiBcIlwiO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQmxvY2tcbiAgICAgKi9cbiAgICBzdGF0ZXMuYmxvY2sgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoKHR5cGUgPT0gXCJjb21tZW50XCIgJiYgc3RhcnRPZkxpbmUoc3RyZWFtKSkgfHxcbiAgICAgICAgICAodHlwZSA9PSBcIixcIiAmJiBlbmRPZkxpbmUoc3RyZWFtKSkgfHxcbiAgICAgICAgICB0eXBlID09IFwibWl4aW5cIikge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiLCAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlSXNJbnRlcnBvbGF0aW9uKHR5cGUsIHN0cmVhbSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiaW50ZXJwb2xhdGlvblwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmRPZkxpbmUoc3RyZWFtKSAmJiB0eXBlID09IFwiXVwiKSB7XG4gICAgICAgIGlmICghL15cXHMqKFxcLnwjfDp8XFxbfFxcKnwmKS8udGVzdChzdHJlYW0uc3RyaW5nKSAmJiAhd29yZElzVGFnKGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZUlzQmxvY2sodHlwZSwgc3RyZWFtKSkge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09IFwifVwiICYmIGVuZE9mTGluZShzdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZS1uYW1lXCIpIHtcbiAgICAgICAgaWYgKHN0cmVhbS5zdHJpbmcubWF0Y2goL15cXHM/XFwkW1xcdy1cXC5cXFtcXF1cXCdcXFwiXSskLykgfHwgd29yZElzQmxvY2soZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSB7XG4gICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwidmFyaWFibGVOYW1lXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInZhcmlhYmxlTmFtZVwiLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCI9XCIpIHtcbiAgICAgICAgaWYgKCFlbmRPZkxpbmUoc3RyZWFtKSAmJiAhd29yZElzQmxvY2soZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSB7XG4gICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIiwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBcIipcIikge1xuICAgICAgICBpZiAoZW5kT2ZMaW5lKHN0cmVhbSkgfHwgc3RyZWFtLm1hdGNoKC9cXHMqKCx8XFwufCN8XFxbfDp8eykvLGZhbHNlKSkge1xuICAgICAgICAgIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVJc1BzZXVkbyh0eXBlLCBzdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInBzZXVkb1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICgvQChmb250LWZhY2V8bWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudCkvLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIGVuZE9mTGluZShzdHJlYW0pID8gXCJibG9ja1wiIDogXCJhdEJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKC9AKC0obW96fG1zfG98d2Via2l0KS0pP2tleWZyYW1lcyQvLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwia2V5ZnJhbWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKC9AZXh0ZW5kcz8vLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiZXh0ZW5kXCIsIDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgJiYgdHlwZS5jaGFyQXQoMCkgPT0gXCJAXCIpIHtcblxuICAgICAgICAvLyBQcm9wZXJ0eSBMb29rdXBcbiAgICAgICAgaWYgKHN0cmVhbS5pbmRlbnRhdGlvbigpID4gMCAmJiB3b3JkSXNQcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnNsaWNlKDEpKSkge1xuICAgICAgICAgIG92ZXJyaWRlID0gXCJ2YXJpYWJsZS0yXCI7XG4gICAgICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoLyhAaW1wb3J0fEByZXF1aXJlfEBjaGFyc2V0KS8udGVzdCh0eXBlKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJyZWZlcmVuY2VcIiAmJiBlbmRPZkxpbmUoc3RyZWFtKSkge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09IFwiKFwiKSB7XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcInBhcmVuc1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT0gXCJ2ZW5kb3ItcHJlZml4ZXNcIikge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJ2ZW5kb3JQcmVmaXhlc1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTtcbiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZSh3b3JkKTtcblxuICAgICAgICBpZiAob3ZlcnJpZGUgPT0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0T2ZMaW5lKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdmVycmlkZSA9IFwiYXRvbVwiO1xuICAgICAgICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3ZlcnJpZGUgPT0gXCJ0YWdcIikge1xuXG4gICAgICAgICAgLy8gdGFnIGlzIGEgY3NzIHZhbHVlXG4gICAgICAgICAgaWYgKC9lbWJlZHxtZW51fHByZXxwcm9ncmVzc3xzdWJ8dGFibGUvLnRlc3Qod29yZCkpIHtcbiAgICAgICAgICAgIGlmICh3b3JkSXNQcm9wZXJ0eShmaXJzdFdvcmRPZkxpbmUoc3RyZWFtKSkpIHtcbiAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBcImF0b21cIjtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB0YWcgaXMgYW4gYXR0cmlidXRlXG4gICAgICAgICAgaWYgKHN0cmVhbS5zdHJpbmcubWF0Y2gobmV3IFJlZ0V4cChcIlxcXFxbXFxcXHMqXCIgKyB3b3JkICsgXCJ8XCIgKyB3b3JkICtcIlxcXFxzKlxcXFxdXCIpKSkge1xuICAgICAgICAgICAgb3ZlcnJpZGUgPSBcImF0b21cIjtcbiAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdGFnIGlzIGEgdmFyaWFibGVcbiAgICAgICAgICBpZiAodGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkpIHtcbiAgICAgICAgICAgIGlmICgoc3RhcnRPZkxpbmUoc3RyZWFtKSAmJiBzdHJlYW0uc3RyaW5nLm1hdGNoKC89LykpIHx8XG4gICAgICAgICAgICAgICAgKCFzdGFydE9mTGluZShzdHJlYW0pICYmXG4gICAgICAgICAgICAgICAgICFzdHJlYW0uc3RyaW5nLm1hdGNoKC9eKFxccypcXC58I3xcXCZ8XFxbfFxcL3w+fFxcKikvKSAmJlxuICAgICAgICAgICAgICAgICAhd29yZElzVGFnKGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSkpIHtcbiAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBcInZhcmlhYmxlLTJcIjtcbiAgICAgICAgICAgICAgaWYgKHdvcmRJc0Jsb2NrKGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSkgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbmRPZkxpbmUoc3RyZWFtKSkgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG92ZXJyaWRlID09IFwiYmxvY2sta2V5d29yZFwiKSB7XG4gICAgICAgICAgb3ZlcnJpZGUgPSBcImtleXdvcmRcIjtcblxuICAgICAgICAgIC8vIFBvc3RmaXggY29uZGl0aW9uYWxzXG4gICAgICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KC8oaWZ8dW5sZXNzKS8pICYmICFzdGFydE9mTGluZShzdHJlYW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod29yZCA9PSBcInJldHVyblwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiLCAwKTtcblxuICAgICAgICAvLyBQbGFjZWhvbGRlciBzZWxlY3RvclxuICAgICAgICBpZiAob3ZlcnJpZGUgPT0gXCJ2YXJpYWJsZS0yXCIgJiYgc3RyZWFtLnN0cmluZy5tYXRjaCgvXlxccz9cXCRbXFx3LVxcLlxcW1xcXVxcJ1xcXCJdKyQvKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIFBhcmVuc1xuICAgICAqL1xuICAgIHN0YXRlcy5wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIihcIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicGFyZW5zXCIpO1xuICAgICAgaWYgKHR5cGUgPT0gXCIpXCIpIHtcbiAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQucHJldi50eXBlID09IFwicGFyZW5zXCIpIHtcbiAgICAgICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzdHJlYW0uc3RyaW5nLm1hdGNoKC9eW2Etel1bXFx3LV0qXFwoL2kpICYmIGVuZE9mTGluZShzdHJlYW0pKSB8fFxuICAgICAgICAgICAgd29yZElzQmxvY2soZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpIHx8XG4gICAgICAgICAgICAvKFxcLnwjfDp8XFxbfFxcKnwmfD58fnxcXCt8XFwvKS8udGVzdChmaXJzdFdvcmRPZkxpbmUoc3RyZWFtKSkgfHxcbiAgICAgICAgICAgICghc3RyZWFtLnN0cmluZy5tYXRjaCgvXi0/W2Etel1bXFx3LVxcLlxcW1xcXVxcJ1xcXCJdKlxccyo9LykgJiZcbiAgICAgICAgICAgICB3b3JkSXNUYWcoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJlYW0uc3RyaW5nLm1hdGNoKC9eW1xcJC1dP1thLXpdW1xcdy1cXC5cXFtcXF1cXCdcXFwiXSpcXHMqPS8pIHx8XG4gICAgICAgICAgICBzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXFxzKihcXCh8XFwpfFswLTldKS8pIHx8XG4gICAgICAgICAgICBzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXFxzK1thLXpdW1xcdy1dKlxcKC9pKSB8fFxuICAgICAgICAgICAgc3RyZWFtLnN0cmluZy5tYXRjaCgvXlxccytbXFwkLV0/W2Etel0vaSkpIHtcbiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kT2ZMaW5lKHN0cmVhbSkpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgICBlbHNlIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgJiYgdHlwZS5jaGFyQXQoMCkgPT0gXCJAXCIgJiYgd29yZElzUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS5zbGljZSgxKSkpIHtcbiAgICAgICAgb3ZlcnJpZGUgPSBcInZhcmlhYmxlLTJcIjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTtcbiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZSh3b3JkKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlID09IFwidGFnXCIgJiYgdGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkpIHtcbiAgICAgICAgICBvdmVycmlkZSA9IFwidmFyaWFibGUtMlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdmVycmlkZSA9PSBcInByb3BlcnR5XCIgfHwgd29yZCA9PSBcInRvXCIpIG92ZXJyaWRlID0gXCJhdG9tXCI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBcInZhcmlhYmxlLW5hbWVcIikge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJ2YXJpYWJsZU5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZUlzUHNldWRvKHR5cGUsIHN0cmVhbSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwicHNldWRvXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTtcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBWZW5kb3IgcHJlZml4ZXNcbiAgICAgKi9cbiAgICBzdGF0ZXMudmVuZG9yUHJlZml4ZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIndvcmRcIikge1xuICAgICAgICBvdmVycmlkZSA9IFwicHJvcGVydHlcIjtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIiwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogUHNldWRvXG4gICAgICovXG4gICAgc3RhdGVzLnBzZXVkbyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmICghd29yZElzUHJvcGVydHkoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbS5zdHJpbmcpKSkge1xuICAgICAgICBzdHJlYW0ubWF0Y2goL15bYS16LV0rLyk7XG4gICAgICAgIG92ZXJyaWRlID0gXCJ2YXJpYWJsZS0zXCI7XG4gICAgICAgIGlmIChlbmRPZkxpbmUoc3RyZWFtKSkgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIik7XG4gICAgICAgIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIGF0QmxvY2tcbiAgICAgKi9cbiAgICBzdGF0ZXMuYXRCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmICh0eXBlID09IFwiKFwiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJhdEJsb2NrX3BhcmVuc1wiKTtcbiAgICAgIGlmICh0eXBlSXNCbG9jayh0eXBlLCBzdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVJc0ludGVycG9sYXRpb24odHlwZSwgc3RyZWFtKSkge1xuICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJpbnRlcnBvbGF0aW9uXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICgvXihvbmx5fG5vdHxhbmR8b3IpJC8udGVzdCh3b3JkKSlcbiAgICAgICAgICBvdmVycmlkZSA9IFwia2V5d29yZFwiO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudFR5cGVzLmhhc093blByb3BlcnR5KHdvcmQpKVxuICAgICAgICAgIG92ZXJyaWRlID0gXCJ0YWdcIjtcbiAgICAgICAgZWxzZSBpZiAobWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgICAgICBvdmVycmlkZSA9IFwiYXR0cmlidXRlXCI7XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhRmVhdHVyZXMuaGFzT3duUHJvcGVydHkod29yZCkpXG4gICAgICAgICAgb3ZlcnJpZGUgPSBcInByb3BlcnR5XCI7XG4gICAgICAgIGVsc2UgaWYgKG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSlcbiAgICAgICAgICBvdmVycmlkZSA9IFwic3RyaW5nLTJcIjtcbiAgICAgICAgZWxzZSBvdmVycmlkZSA9IHdvcmRBc1ZhbHVlKHN0cmVhbS5jdXJyZW50KCkpO1xuICAgICAgICBpZiAob3ZlcnJpZGUgPT0gXCJ0YWdcIiAmJiBlbmRPZkxpbmUoc3RyZWFtKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBcIm9wZXJhdG9yXCIgJiYgL14obm90fGFuZHxvcikkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7XG4gICAgICAgIG92ZXJyaWRlID0gXCJrZXl3b3JkXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH07XG5cbiAgICBzdGF0ZXMuYXRCbG9ja19wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIntcIiB8fCB0eXBlID09IFwifVwiKSByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgICAgaWYgKHR5cGUgPT0gXCIpXCIpIHtcbiAgICAgICAgaWYgKGVuZE9mTGluZShzdHJlYW0pKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgICAgZWxzZSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJhdEJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIG92ZXJyaWRlID0gd29yZEFzVmFsdWUod29yZCk7XG4gICAgICAgIGlmICgvXihtYXh8bWluKS8udGVzdCh3b3JkKSkgb3ZlcnJpZGUgPSBcInByb3BlcnR5XCI7XG4gICAgICAgIGlmIChvdmVycmlkZSA9PSBcInRhZ1wiKSB7XG4gICAgICAgICAgdGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkgPyBvdmVycmlkZSA9IFwidmFyaWFibGUtMlwiIDogb3ZlcnJpZGUgPSBcImF0b21cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlcy5hdEJsb2NrKHR5cGUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIEtleWZyYW1lc1xuICAgICAqL1xuICAgIHN0YXRlcy5rZXlmcmFtZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RyZWFtLmluZGVudGF0aW9uKCkgPT0gXCIwXCIgJiYgKCh0eXBlID09IFwifVwiICYmIHN0YXJ0T2ZMaW5lKHN0cmVhbSkpIHx8IHR5cGUgPT0gXCJdXCIgfHwgdHlwZSA9PSBcImhhc2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBcInF1YWxpZmllclwiIHx8IHdvcmRJc1RhZyhzdHJlYW0uY3VycmVudCgpKSkpIHtcbiAgICAgICAgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBcIntcIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwia2V5ZnJhbWVzXCIpO1xuICAgICAgaWYgKHR5cGUgPT0gXCJ9XCIpIHtcbiAgICAgICAgaWYgKHN0YXJ0T2ZMaW5lKHN0cmVhbSkpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlLCB0cnVlKTtcbiAgICAgICAgZWxzZSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJrZXlmcmFtZXNcIik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PSBcInVuaXRcIiAmJiAvXlswLTldK1xcJSQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwia2V5ZnJhbWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZShzdHJlYW0uY3VycmVudCgpKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlID09IFwiYmxvY2sta2V5d29yZFwiKSB7XG4gICAgICAgICAgb3ZlcnJpZGUgPSBcImtleXdvcmRcIjtcbiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJrZXlmcmFtZXNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgvQChmb250LWZhY2V8bWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudCkvLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIGVuZE9mTGluZShzdHJlYW0pID8gXCJibG9ja1wiIDogXCJhdEJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJtaXhpblwiKSB7XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTtcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcnBvbGF0aW9uXG4gICAgICovXG4gICAgc3RhdGVzLmludGVycG9sYXRpb24gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAodHlwZSA9PSBcIntcIikgcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgXCJibG9ja1wiKTtcbiAgICAgIGlmICh0eXBlID09IFwifVwiKSB7XG4gICAgICAgIGlmIChzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXFxzKihcXC58I3w6fFxcW3xcXCp8Jnw+fH58XFwrfFxcLykvaSkgfHxcbiAgICAgICAgICAgIChzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXFxzKlthLXpdL2kpICYmIHdvcmRJc1RhZyhmaXJzdFdvcmRPZkxpbmUoc3RyZWFtKSkpKSB7XG4gICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwiYmxvY2tcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHJlYW0uc3RyaW5nLm1hdGNoKC9eKFxce3xcXHMqXFwmKS8pIHx8XG4gICAgICAgICAgICBzdHJlYW0ubWF0Y2goL1xccypbXFx3LV0vLGZhbHNlKSkge1xuICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIsIDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBcImJsb2NrXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ2YXJpYWJsZS1uYW1lXCIpIHtcbiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIFwidmFyaWFibGVOYW1lXCIsIDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT0gXCJ3b3JkXCIpIHtcbiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZShzdHJlYW0uY3VycmVudCgpKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlID09IFwidGFnXCIpIG92ZXJyaWRlID0gXCJhdG9tXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIEV4dGVuZC9zXG4gICAgICovXG4gICAgc3RhdGVzLmV4dGVuZCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgIGlmICh0eXBlID09IFwiW1wiIHx8IHR5cGUgPT0gXCI9XCIpIHJldHVybiBcImV4dGVuZFwiO1xuICAgICAgaWYgKHR5cGUgPT0gXCJdXCIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTtcbiAgICAgIGlmICh0eXBlID09IFwid29yZFwiKSB7XG4gICAgICAgIG92ZXJyaWRlID0gd29yZEFzVmFsdWUoc3RyZWFtLmN1cnJlbnQoKSk7XG4gICAgICAgIHJldHVybiBcImV4dGVuZFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIFZhcmlhYmxlIG5hbWVcbiAgICAgKi9cbiAgICBzdGF0ZXMudmFyaWFibGVOYW1lID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIiB8fCB0eXBlID09IFwiW1wiIHx8IHR5cGUgPT0gXCJdXCIgfHwgc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvXihcXC58XFwkKS8pKSB7XG4gICAgICAgIGlmIChzdHJlYW0uY3VycmVudCgpLm1hdGNoKC9eXFwuW1xcdy1dKy9pKSkgb3ZlcnJpZGUgPSBcInZhcmlhYmxlLTJcIjtcbiAgICAgICAgcmV0dXJuIFwidmFyaWFibGVOYW1lXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9O1xuXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuaXplOiBudWxsLFxuICAgICAgICAgIHN0YXRlOiBcImJsb2NrXCIsXG4gICAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoXCJibG9ja1wiLCBiYXNlIHx8IDAsIG51bGwpXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS50b2tlbml6ZSAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHR5cGUgPSBzdHlsZVsxXTtcbiAgICAgICAgICBzdHlsZSA9IHN0eWxlWzBdO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJyaWRlID0gc3R5bGU7XG4gICAgICAgIHN0YXRlLnN0YXRlID0gc3RhdGVzW3N0YXRlLnN0YXRlXSh0eXBlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlO1xuICAgICAgfSxcbiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgbGluZSkge1xuXG4gICAgICAgIHZhciBjeCA9IHN0YXRlLmNvbnRleHQsXG4gICAgICAgICAgICBjaCA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLFxuICAgICAgICAgICAgaW5kZW50ID0gY3guaW5kZW50LFxuICAgICAgICAgICAgbGluZUZpcnN0V29yZCA9IGZpcnN0V29yZE9mTGluZSh0ZXh0QWZ0ZXIpLFxuICAgICAgICAgICAgbGluZUluZGVudCA9IGxpbmUubWF0Y2goL15cXHMqLylbMF0ucmVwbGFjZSgvXFx0L2csIGluZGVudFVuaXRTdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICAgIHByZXZMaW5lRmlyc3RXb3JkID0gc3RhdGUuY29udGV4dC5wcmV2ID8gc3RhdGUuY29udGV4dC5wcmV2LmxpbmUuZmlyc3RXb3JkIDogXCJcIixcbiAgICAgICAgICAgIHByZXZMaW5lSW5kZW50ID0gc3RhdGUuY29udGV4dC5wcmV2ID8gc3RhdGUuY29udGV4dC5wcmV2LmxpbmUuaW5kZW50IDogbGluZUluZGVudDtcblxuICAgICAgICBpZiAoY3gucHJldiAmJlxuICAgICAgICAgICAgKGNoID09IFwifVwiICYmIChjeC50eXBlID09IFwiYmxvY2tcIiB8fCBjeC50eXBlID09IFwiYXRCbG9ja1wiIHx8IGN4LnR5cGUgPT0gXCJrZXlmcmFtZXNcIikgfHxcbiAgICAgICAgICAgICBjaCA9PSBcIilcIiAmJiAoY3gudHlwZSA9PSBcInBhcmVuc1wiIHx8IGN4LnR5cGUgPT0gXCJhdEJsb2NrX3BhcmVuc1wiKSB8fFxuICAgICAgICAgICAgIGNoID09IFwie1wiICYmIChjeC50eXBlID09IFwiYXRcIikpKSB7XG4gICAgICAgICAgaW5kZW50ID0gY3guaW5kZW50IC0gaW5kZW50VW5pdDtcbiAgICAgICAgfSBlbHNlIGlmICghKC8oXFx9KS8udGVzdChjaCkpKSB7XG4gICAgICAgICAgaWYgKC9AfFxcJHxcXGQvLnRlc3QoY2gpIHx8XG4gICAgICAgICAgICAgIC9eXFx7Ly50ZXN0KHRleHRBZnRlcikgfHxcbi9eXFxzKlxcLyhcXC98XFwqKS8udGVzdCh0ZXh0QWZ0ZXIpIHx8XG4gICAgICAgICAgICAgIC9eXFxzKlxcL1xcKi8udGVzdChwcmV2TGluZUZpcnN0V29yZCkgfHxcbiAgICAgICAgICAgICAgL15cXHMqW1xcdy1cXC5cXFtcXF1cXCdcXFwiXStcXHMqKFxcP3w6fFxcKyk/PS9pLnRlc3QodGV4dEFmdGVyKSB8fFxuL14oXFwrfC0pP1thLXpdW1xcdy1dKlxcKC9pLnRlc3QodGV4dEFmdGVyKSB8fFxuL15yZXR1cm4vLnRlc3QodGV4dEFmdGVyKSB8fFxuICAgICAgICAgICAgICB3b3JkSXNCbG9jayhsaW5lRmlyc3RXb3JkKSkge1xuICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudDtcbiAgICAgICAgICB9IGVsc2UgaWYgKC8oXFwufCN8OnxcXFt8XFwqfCZ8Pnx+fFxcK3xcXC8pLy50ZXN0KGNoKSB8fCB3b3JkSXNUYWcobGluZUZpcnN0V29yZCkpIHtcbiAgICAgICAgICAgIGlmICgvXFwsXFxzKiQvLnRlc3QocHJldkxpbmVGaXJzdFdvcmQpKSB7XG4gICAgICAgICAgICAgIGluZGVudCA9IHByZXZMaW5lSW5kZW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvXlxccysvLnRlc3QobGluZSkgJiYgKC8oXFwufCN8OnxcXFt8XFwqfCZ8Pnx+fFxcK3xcXC8pLy50ZXN0KHByZXZMaW5lRmlyc3RXb3JkKSB8fCB3b3JkSXNUYWcocHJldkxpbmVGaXJzdFdvcmQpKSkge1xuICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lSW5kZW50IDw9IHByZXZMaW5lSW5kZW50ID8gcHJldkxpbmVJbmRlbnQgOiBwcmV2TGluZUluZGVudCArIGluZGVudFVuaXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lSW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIS8sXFxzKiQvLnRlc3QobGluZSkgJiYgKHdvcmRJc1ZlbmRvclByZWZpeChsaW5lRmlyc3RXb3JkKSB8fCB3b3JkSXNQcm9wZXJ0eShsaW5lRmlyc3RXb3JkKSkpIHtcbiAgICAgICAgICAgIGlmICh3b3JkSXNCbG9jayhwcmV2TGluZUZpcnN0V29yZCkpIHtcbiAgICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudCA8PSBwcmV2TGluZUluZGVudCA/IHByZXZMaW5lSW5kZW50IDogcHJldkxpbmVJbmRlbnQgKyBpbmRlbnRVbml0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvXlxcey8udGVzdChwcmV2TGluZUZpcnN0V29yZCkpIHtcbiAgICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudCA8PSBwcmV2TGluZUluZGVudCA/IGxpbmVJbmRlbnQgOiBwcmV2TGluZUluZGVudCArIGluZGVudFVuaXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmRJc1ZlbmRvclByZWZpeChwcmV2TGluZUZpcnN0V29yZCkgfHwgd29yZElzUHJvcGVydHkocHJldkxpbmVGaXJzdFdvcmQpKSB7XG4gICAgICAgICAgICAgIGluZGVudCA9IGxpbmVJbmRlbnQgPj0gcHJldkxpbmVJbmRlbnQgPyBwcmV2TGluZUluZGVudCA6IGxpbmVJbmRlbnQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9eKFxcLnwjfDp8XFxbfFxcKnwmfEB8XFwrfFxcLXw+fH58XFwvKS8udGVzdChwcmV2TGluZUZpcnN0V29yZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAvPVxccyokLy50ZXN0KHByZXZMaW5lRmlyc3RXb3JkKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmRJc1RhZyhwcmV2TGluZUZpcnN0V29yZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAvXlxcJFtcXHctXFwuXFxbXFxdXFwnXFxcIl0vLnRlc3QocHJldkxpbmVGaXJzdFdvcmQpKSB7XG4gICAgICAgICAgICAgIGluZGVudCA9IHByZXZMaW5lSW5kZW50ICsgaW5kZW50VW5pdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGluZGVudCA9IGxpbmVJbmRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRlbnQ7XG4gICAgICB9LFxuICAgICAgZWxlY3RyaWNDaGFyczogXCJ9XCIsXG4gICAgICBsaW5lQ29tbWVudDogXCIvL1wiLFxuICAgICAgZm9sZDogXCJpbmRlbnRcIlxuICAgIH07XG4gIH0pO1xuXG4gIC8vIGRldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnRcbiAgdmFyIHRhZ0tleXdvcmRzXyA9IFtcImFcIixcImFiYnJcIixcImFkZHJlc3NcIixcImFyZWFcIixcImFydGljbGVcIixcImFzaWRlXCIsXCJhdWRpb1wiLCBcImJcIiwgXCJiYXNlXCIsXCJiZGlcIiwgXCJiZG9cIixcImJnc291bmRcIixcImJsb2NrcXVvdGVcIixcImJvZHlcIixcImJyXCIsXCJidXR0b25cIixcImNhbnZhc1wiLFwiY2FwdGlvblwiLFwiY2l0ZVwiLCBcImNvZGVcIixcImNvbFwiLFwiY29sZ3JvdXBcIixcImRhdGFcIixcImRhdGFsaXN0XCIsXCJkZFwiLFwiZGVsXCIsXCJkZXRhaWxzXCIsXCJkZm5cIixcImRpdlwiLCBcImRsXCIsXCJkdFwiLFwiZW1cIixcImVtYmVkXCIsXCJmaWVsZHNldFwiLFwiZmlnY2FwdGlvblwiLFwiZmlndXJlXCIsXCJmb290ZXJcIixcImZvcm1cIixcImgxXCIsIFwiaDJcIixcImgzXCIsXCJoNFwiLFwiaDVcIixcImg2XCIsXCJoZWFkXCIsXCJoZWFkZXJcIixcImhncm91cFwiLFwiaHJcIixcImh0bWxcIixcImlcIixcImlmcmFtZVwiLCBcImltZ1wiLFwiaW5wdXRcIixcImluc1wiLFwia2JkXCIsXCJrZXlnZW5cIixcImxhYmVsXCIsXCJsZWdlbmRcIixcImxpXCIsXCJsaW5rXCIsXCJtYWluXCIsXCJtYXBcIiwgXCJtYXJrXCIsXCJtYXJxdWVlXCIsXCJtZW51XCIsXCJtZW51aXRlbVwiLFwibWV0YVwiLFwibWV0ZXJcIixcIm5hdlwiLFwibm9iclwiLFwibm9mcmFtZXNcIiwgXCJub3NjcmlwdFwiLFwib2JqZWN0XCIsXCJvbFwiLFwib3B0Z3JvdXBcIixcIm9wdGlvblwiLFwib3V0cHV0XCIsXCJwXCIsXCJwYXJhbVwiLFwicHJlXCIsIFwicHJvZ3Jlc3NcIixcInFcIixcInJwXCIsXCJydFwiLFwicnVieVwiLFwic1wiLFwic2FtcFwiLFwic2NyaXB0XCIsXCJzZWN0aW9uXCIsXCJzZWxlY3RcIiwgXCJzbWFsbFwiLFwic291cmNlXCIsXCJzcGFuXCIsXCJzdHJvbmdcIixcInN0eWxlXCIsXCJzdWJcIixcInN1bW1hcnlcIixcInN1cFwiLFwidGFibGVcIixcInRib2R5XCIsXCJ0ZFwiLFwidGV4dGFyZWFcIixcInRmb290XCIsXCJ0aFwiLFwidGhlYWRcIixcInRpbWVcIixcInRyXCIsXCJ0cmFja1wiLCBcInVcIixcInVsXCIsXCJ2YXJcIixcInZpZGVvXCJdO1xuXG4gIC8vIGdpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2Jsb2IvbWFzdGVyL21vZGUvY3NzL2Nzcy5qc1xuICB2YXIgZG9jdW1lbnRUeXBlc18gPSBbXCJkb21haW5cIiwgXCJyZWdleHBcIiwgXCJ1cmxcIiwgXCJ1cmwtcHJlZml4XCJdO1xuICB2YXIgbWVkaWFUeXBlc18gPSBbXCJhbGxcIixcImF1cmFsXCIsXCJicmFpbGxlXCIsXCJoYW5kaGVsZFwiLFwicHJpbnRcIixcInByb2plY3Rpb25cIixcInNjcmVlblwiLFwidHR5XCIsXCJ0dlwiLFwiZW1ib3NzZWRcIl07XG4gIHZhciBtZWRpYUZlYXR1cmVzXyA9IFtcIndpZHRoXCIsXCJtaW4td2lkdGhcIixcIm1heC13aWR0aFwiLFwiaGVpZ2h0XCIsXCJtaW4taGVpZ2h0XCIsXCJtYXgtaGVpZ2h0XCIsXCJkZXZpY2Utd2lkdGhcIixcIm1pbi1kZXZpY2Utd2lkdGhcIixcIm1heC1kZXZpY2Utd2lkdGhcIixcImRldmljZS1oZWlnaHRcIixcIm1pbi1kZXZpY2UtaGVpZ2h0XCIsXCJtYXgtZGV2aWNlLWhlaWdodFwiLFwiYXNwZWN0LXJhdGlvXCIsXCJtaW4tYXNwZWN0LXJhdGlvXCIsXCJtYXgtYXNwZWN0LXJhdGlvXCIsXCJkZXZpY2UtYXNwZWN0LXJhdGlvXCIsXCJtaW4tZGV2aWNlLWFzcGVjdC1yYXRpb1wiLFwibWF4LWRldmljZS1hc3BlY3QtcmF0aW9cIixcImNvbG9yXCIsXCJtaW4tY29sb3JcIixcIm1heC1jb2xvclwiLFwiY29sb3ItaW5kZXhcIixcIm1pbi1jb2xvci1pbmRleFwiLFwibWF4LWNvbG9yLWluZGV4XCIsXCJtb25vY2hyb21lXCIsXCJtaW4tbW9ub2Nocm9tZVwiLFwibWF4LW1vbm9jaHJvbWVcIixcInJlc29sdXRpb25cIixcIm1pbi1yZXNvbHV0aW9uXCIsXCJtYXgtcmVzb2x1dGlvblwiLFwic2NhblwiLFwiZ3JpZFwiXTtcbiAgdmFyIHByb3BlcnR5S2V5d29yZHNfID0gW1wiYWxpZ24tY29udGVudFwiLFwiYWxpZ24taXRlbXNcIixcImFsaWduLXNlbGZcIixcImFsaWdubWVudC1hZGp1c3RcIixcImFsaWdubWVudC1iYXNlbGluZVwiLFwiYW5jaG9yLXBvaW50XCIsXCJhbmltYXRpb25cIixcImFuaW1hdGlvbi1kZWxheVwiLFwiYW5pbWF0aW9uLWRpcmVjdGlvblwiLFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsXCJhbmltYXRpb24tZmlsbC1tb2RlXCIsXCJhbmltYXRpb24taXRlcmF0aW9uLWNvdW50XCIsXCJhbmltYXRpb24tbmFtZVwiLFwiYW5pbWF0aW9uLXBsYXktc3RhdGVcIixcImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb25cIixcImFwcGVhcmFuY2VcIixcImF6aW11dGhcIixcImJhY2tmYWNlLXZpc2liaWxpdHlcIixcImJhY2tncm91bmRcIixcImJhY2tncm91bmQtYXR0YWNobWVudFwiLFwiYmFja2dyb3VuZC1jbGlwXCIsXCJiYWNrZ3JvdW5kLWNvbG9yXCIsXCJiYWNrZ3JvdW5kLWltYWdlXCIsXCJiYWNrZ3JvdW5kLW9yaWdpblwiLFwiYmFja2dyb3VuZC1wb3NpdGlvblwiLFwiYmFja2dyb3VuZC1yZXBlYXRcIixcImJhY2tncm91bmQtc2l6ZVwiLFwiYmFzZWxpbmUtc2hpZnRcIixcImJpbmRpbmdcIixcImJsZWVkXCIsXCJib29rbWFyay1sYWJlbFwiLFwiYm9va21hcmstbGV2ZWxcIixcImJvb2ttYXJrLXN0YXRlXCIsXCJib29rbWFyay10YXJnZXRcIixcImJvcmRlclwiLFwiYm9yZGVyLWJvdHRvbVwiLFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLFwiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1c1wiLFwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXNcIixcImJvcmRlci1ib3R0b20tc3R5bGVcIixcImJvcmRlci1ib3R0b20td2lkdGhcIixcImJvcmRlci1jb2xsYXBzZVwiLFwiYm9yZGVyLWNvbG9yXCIsXCJib3JkZXItaW1hZ2VcIixcImJvcmRlci1pbWFnZS1vdXRzZXRcIixcImJvcmRlci1pbWFnZS1yZXBlYXRcIixcImJvcmRlci1pbWFnZS1zbGljZVwiLFwiYm9yZGVyLWltYWdlLXNvdXJjZVwiLFwiYm9yZGVyLWltYWdlLXdpZHRoXCIsXCJib3JkZXItbGVmdFwiLFwiYm9yZGVyLWxlZnQtY29sb3JcIixcImJvcmRlci1sZWZ0LXN0eWxlXCIsXCJib3JkZXItbGVmdC13aWR0aFwiLFwiYm9yZGVyLXJhZGl1c1wiLFwiYm9yZGVyLXJpZ2h0XCIsXCJib3JkZXItcmlnaHQtY29sb3JcIixcImJvcmRlci1yaWdodC1zdHlsZVwiLFwiYm9yZGVyLXJpZ2h0LXdpZHRoXCIsXCJib3JkZXItc3BhY2luZ1wiLFwiYm9yZGVyLXN0eWxlXCIsXCJib3JkZXItdG9wXCIsXCJib3JkZXItdG9wLWNvbG9yXCIsXCJib3JkZXItdG9wLWxlZnQtcmFkaXVzXCIsXCJib3JkZXItdG9wLXJpZ2h0LXJhZGl1c1wiLFwiYm9yZGVyLXRvcC1zdHlsZVwiLFwiYm9yZGVyLXRvcC13aWR0aFwiLFwiYm9yZGVyLXdpZHRoXCIsXCJib3R0b21cIixcImJveC1kZWNvcmF0aW9uLWJyZWFrXCIsXCJib3gtc2hhZG93XCIsXCJib3gtc2l6aW5nXCIsXCJicmVhay1hZnRlclwiLFwiYnJlYWstYmVmb3JlXCIsXCJicmVhay1pbnNpZGVcIixcImNhcHRpb24tc2lkZVwiLFwiY2xlYXJcIixcImNsaXBcIixcImNvbG9yXCIsXCJjb2xvci1wcm9maWxlXCIsXCJjb2x1bW4tY291bnRcIixcImNvbHVtbi1maWxsXCIsXCJjb2x1bW4tZ2FwXCIsXCJjb2x1bW4tcnVsZVwiLFwiY29sdW1uLXJ1bGUtY29sb3JcIixcImNvbHVtbi1ydWxlLXN0eWxlXCIsXCJjb2x1bW4tcnVsZS13aWR0aFwiLFwiY29sdW1uLXNwYW5cIixcImNvbHVtbi13aWR0aFwiLFwiY29sdW1uc1wiLFwiY29udGVudFwiLFwiY291bnRlci1pbmNyZW1lbnRcIixcImNvdW50ZXItcmVzZXRcIixcImNyb3BcIixcImN1ZVwiLFwiY3VlLWFmdGVyXCIsXCJjdWUtYmVmb3JlXCIsXCJjdXJzb3JcIixcImRpcmVjdGlvblwiLFwiZGlzcGxheVwiLFwiZG9taW5hbnQtYmFzZWxpbmVcIixcImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3RcIixcImRyb3AtaW5pdGlhbC1hZnRlci1hbGlnblwiLFwiZHJvcC1pbml0aWFsLWJlZm9yZS1hZGp1c3RcIixcImRyb3AtaW5pdGlhbC1iZWZvcmUtYWxpZ25cIixcImRyb3AtaW5pdGlhbC1zaXplXCIsXCJkcm9wLWluaXRpYWwtdmFsdWVcIixcImVsZXZhdGlvblwiLFwiZW1wdHktY2VsbHNcIixcImZpdFwiLFwiZml0LXBvc2l0aW9uXCIsXCJmbGV4XCIsXCJmbGV4LWJhc2lzXCIsXCJmbGV4LWRpcmVjdGlvblwiLFwiZmxleC1mbG93XCIsXCJmbGV4LWdyb3dcIixcImZsZXgtc2hyaW5rXCIsXCJmbGV4LXdyYXBcIixcImZsb2F0XCIsXCJmbG9hdC1vZmZzZXRcIixcImZsb3ctZnJvbVwiLFwiZmxvdy1pbnRvXCIsXCJmb250XCIsXCJmb250LWZlYXR1cmUtc2V0dGluZ3NcIixcImZvbnQtZmFtaWx5XCIsXCJmb250LWtlcm5pbmdcIixcImZvbnQtbGFuZ3VhZ2Utb3ZlcnJpZGVcIixcImZvbnQtc2l6ZVwiLFwiZm9udC1zaXplLWFkanVzdFwiLFwiZm9udC1zdHJldGNoXCIsXCJmb250LXN0eWxlXCIsXCJmb250LXN5bnRoZXNpc1wiLFwiZm9udC12YXJpYW50XCIsXCJmb250LXZhcmlhbnQtYWx0ZXJuYXRlc1wiLFwiZm9udC12YXJpYW50LWNhcHNcIixcImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuXCIsXCJmb250LXZhcmlhbnQtbGlnYXR1cmVzXCIsXCJmb250LXZhcmlhbnQtbnVtZXJpY1wiLFwiZm9udC12YXJpYW50LXBvc2l0aW9uXCIsXCJmb250LXdlaWdodFwiLFwiZ3JpZFwiLFwiZ3JpZC1hcmVhXCIsXCJncmlkLWF1dG8tY29sdW1uc1wiLFwiZ3JpZC1hdXRvLWZsb3dcIixcImdyaWQtYXV0by1wb3NpdGlvblwiLFwiZ3JpZC1hdXRvLXJvd3NcIixcImdyaWQtY29sdW1uXCIsXCJncmlkLWNvbHVtbi1lbmRcIixcImdyaWQtY29sdW1uLXN0YXJ0XCIsXCJncmlkLXJvd1wiLFwiZ3JpZC1yb3ctZW5kXCIsXCJncmlkLXJvdy1zdGFydFwiLFwiZ3JpZC10ZW1wbGF0ZVwiLFwiZ3JpZC10ZW1wbGF0ZS1hcmVhc1wiLFwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXCIsXCJncmlkLXRlbXBsYXRlLXJvd3NcIixcImhhbmdpbmctcHVuY3R1YXRpb25cIixcImhlaWdodFwiLFwiaHlwaGVuc1wiLFwiaWNvblwiLFwiaW1hZ2Utb3JpZW50YXRpb25cIixcImltYWdlLXJlbmRlcmluZ1wiLFwiaW1hZ2UtcmVzb2x1dGlvblwiLFwiaW5saW5lLWJveC1hbGlnblwiLFwianVzdGlmeS1jb250ZW50XCIsXCJsZWZ0XCIsXCJsZXR0ZXItc3BhY2luZ1wiLFwibGluZS1icmVha1wiLFwibGluZS1oZWlnaHRcIixcImxpbmUtc3RhY2tpbmdcIixcImxpbmUtc3RhY2tpbmctcnVieVwiLFwibGluZS1zdGFja2luZy1zaGlmdFwiLFwibGluZS1zdGFja2luZy1zdHJhdGVneVwiLFwibGlzdC1zdHlsZVwiLFwibGlzdC1zdHlsZS1pbWFnZVwiLFwibGlzdC1zdHlsZS1wb3NpdGlvblwiLFwibGlzdC1zdHlsZS10eXBlXCIsXCJtYXJnaW5cIixcIm1hcmdpbi1ib3R0b21cIixcIm1hcmdpbi1sZWZ0XCIsXCJtYXJnaW4tcmlnaHRcIixcIm1hcmdpbi10b3BcIixcIm1hcmtlci1vZmZzZXRcIixcIm1hcmtzXCIsXCJtYXJxdWVlLWRpcmVjdGlvblwiLFwibWFycXVlZS1sb29wXCIsXCJtYXJxdWVlLXBsYXktY291bnRcIixcIm1hcnF1ZWUtc3BlZWRcIixcIm1hcnF1ZWUtc3R5bGVcIixcIm1heC1oZWlnaHRcIixcIm1heC13aWR0aFwiLFwibWluLWhlaWdodFwiLFwibWluLXdpZHRoXCIsXCJtb3ZlLXRvXCIsXCJuYXYtZG93blwiLFwibmF2LWluZGV4XCIsXCJuYXYtbGVmdFwiLFwibmF2LXJpZ2h0XCIsXCJuYXYtdXBcIixcIm9iamVjdC1maXRcIixcIm9iamVjdC1wb3NpdGlvblwiLFwib3BhY2l0eVwiLFwib3JkZXJcIixcIm9ycGhhbnNcIixcIm91dGxpbmVcIixcIm91dGxpbmUtY29sb3JcIixcIm91dGxpbmUtb2Zmc2V0XCIsXCJvdXRsaW5lLXN0eWxlXCIsXCJvdXRsaW5lLXdpZHRoXCIsXCJvdmVyZmxvd1wiLFwib3ZlcmZsb3ctc3R5bGVcIixcIm92ZXJmbG93LXdyYXBcIixcIm92ZXJmbG93LXhcIixcIm92ZXJmbG93LXlcIixcInBhZGRpbmdcIixcInBhZGRpbmctYm90dG9tXCIsXCJwYWRkaW5nLWxlZnRcIixcInBhZGRpbmctcmlnaHRcIixcInBhZGRpbmctdG9wXCIsXCJwYWdlXCIsXCJwYWdlLWJyZWFrLWFmdGVyXCIsXCJwYWdlLWJyZWFrLWJlZm9yZVwiLFwicGFnZS1icmVhay1pbnNpZGVcIixcInBhZ2UtcG9saWN5XCIsXCJwYXVzZVwiLFwicGF1c2UtYWZ0ZXJcIixcInBhdXNlLWJlZm9yZVwiLFwicGVyc3BlY3RpdmVcIixcInBlcnNwZWN0aXZlLW9yaWdpblwiLFwicGl0Y2hcIixcInBpdGNoLXJhbmdlXCIsXCJwbGF5LWR1cmluZ1wiLFwicG9zaXRpb25cIixcInByZXNlbnRhdGlvbi1sZXZlbFwiLFwicHVuY3R1YXRpb24tdHJpbVwiLFwicXVvdGVzXCIsXCJyZWdpb24tYnJlYWstYWZ0ZXJcIixcInJlZ2lvbi1icmVhay1iZWZvcmVcIixcInJlZ2lvbi1icmVhay1pbnNpZGVcIixcInJlZ2lvbi1mcmFnbWVudFwiLFwicmVuZGVyaW5nLWludGVudFwiLFwicmVzaXplXCIsXCJyZXN0XCIsXCJyZXN0LWFmdGVyXCIsXCJyZXN0LWJlZm9yZVwiLFwicmljaG5lc3NcIixcInJpZ2h0XCIsXCJyb3RhdGlvblwiLFwicm90YXRpb24tcG9pbnRcIixcInJ1YnktYWxpZ25cIixcInJ1Ynktb3ZlcmhhbmdcIixcInJ1YnktcG9zaXRpb25cIixcInJ1Ynktc3BhblwiLFwic2hhcGUtaW1hZ2UtdGhyZXNob2xkXCIsXCJzaGFwZS1pbnNpZGVcIixcInNoYXBlLW1hcmdpblwiLFwic2hhcGUtb3V0c2lkZVwiLFwic2l6ZVwiLFwic3BlYWtcIixcInNwZWFrLWFzXCIsXCJzcGVhay1oZWFkZXJcIixcInNwZWFrLW51bWVyYWxcIixcInNwZWFrLXB1bmN0dWF0aW9uXCIsXCJzcGVlY2gtcmF0ZVwiLFwic3RyZXNzXCIsXCJzdHJpbmctc2V0XCIsXCJ0YWItc2l6ZVwiLFwidGFibGUtbGF5b3V0XCIsXCJ0YXJnZXRcIixcInRhcmdldC1uYW1lXCIsXCJ0YXJnZXQtbmV3XCIsXCJ0YXJnZXQtcG9zaXRpb25cIixcInRleHQtYWxpZ25cIixcInRleHQtYWxpZ24tbGFzdFwiLFwidGV4dC1kZWNvcmF0aW9uXCIsXCJ0ZXh0LWRlY29yYXRpb24tY29sb3JcIixcInRleHQtZGVjb3JhdGlvbi1saW5lXCIsXCJ0ZXh0LWRlY29yYXRpb24tc2tpcFwiLFwidGV4dC1kZWNvcmF0aW9uLXN0eWxlXCIsXCJ0ZXh0LWVtcGhhc2lzXCIsXCJ0ZXh0LWVtcGhhc2lzLWNvbG9yXCIsXCJ0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uXCIsXCJ0ZXh0LWVtcGhhc2lzLXN0eWxlXCIsXCJ0ZXh0LWhlaWdodFwiLFwidGV4dC1pbmRlbnRcIixcInRleHQtanVzdGlmeVwiLFwidGV4dC1vdXRsaW5lXCIsXCJ0ZXh0LW92ZXJmbG93XCIsXCJ0ZXh0LXNoYWRvd1wiLFwidGV4dC1zaXplLWFkanVzdFwiLFwidGV4dC1zcGFjZS1jb2xsYXBzZVwiLFwidGV4dC10cmFuc2Zvcm1cIixcInRleHQtdW5kZXJsaW5lLXBvc2l0aW9uXCIsXCJ0ZXh0LXdyYXBcIixcInRvcFwiLFwidHJhbnNmb3JtXCIsXCJ0cmFuc2Zvcm0tb3JpZ2luXCIsXCJ0cmFuc2Zvcm0tc3R5bGVcIixcInRyYW5zaXRpb25cIixcInRyYW5zaXRpb24tZGVsYXlcIixcInRyYW5zaXRpb24tZHVyYXRpb25cIixcInRyYW5zaXRpb24tcHJvcGVydHlcIixcInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uXCIsXCJ1bmljb2RlLWJpZGlcIixcInZlcnRpY2FsLWFsaWduXCIsXCJ2aXNpYmlsaXR5XCIsXCJ2b2ljZS1iYWxhbmNlXCIsXCJ2b2ljZS1kdXJhdGlvblwiLFwidm9pY2UtZmFtaWx5XCIsXCJ2b2ljZS1waXRjaFwiLFwidm9pY2UtcmFuZ2VcIixcInZvaWNlLXJhdGVcIixcInZvaWNlLXN0cmVzc1wiLFwidm9pY2Utdm9sdW1lXCIsXCJ2b2x1bWVcIixcIndoaXRlLXNwYWNlXCIsXCJ3aWRvd3NcIixcIndpZHRoXCIsXCJ3aWxsLWNoYW5nZVwiLFwid29yZC1icmVha1wiLFwid29yZC1zcGFjaW5nXCIsXCJ3b3JkLXdyYXBcIixcInotaW5kZXhcIixcImNsaXAtcGF0aFwiLFwiY2xpcC1ydWxlXCIsXCJtYXNrXCIsXCJlbmFibGUtYmFja2dyb3VuZFwiLFwiZmlsdGVyXCIsXCJmbG9vZC1jb2xvclwiLFwiZmxvb2Qtb3BhY2l0eVwiLFwibGlnaHRpbmctY29sb3JcIixcInN0b3AtY29sb3JcIixcInN0b3Atb3BhY2l0eVwiLFwicG9pbnRlci1ldmVudHNcIixcImNvbG9yLWludGVycG9sYXRpb25cIixcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLFwiY29sb3ItcmVuZGVyaW5nXCIsXCJmaWxsXCIsXCJmaWxsLW9wYWNpdHlcIixcImZpbGwtcnVsZVwiLFwiaW1hZ2UtcmVuZGVyaW5nXCIsXCJtYXJrZXJcIixcIm1hcmtlci1lbmRcIixcIm1hcmtlci1taWRcIixcIm1hcmtlci1zdGFydFwiLFwic2hhcGUtcmVuZGVyaW5nXCIsXCJzdHJva2VcIixcInN0cm9rZS1kYXNoYXJyYXlcIixcInN0cm9rZS1kYXNob2Zmc2V0XCIsXCJzdHJva2UtbGluZWNhcFwiLFwic3Ryb2tlLWxpbmVqb2luXCIsXCJzdHJva2UtbWl0ZXJsaW1pdFwiLFwic3Ryb2tlLW9wYWNpdHlcIixcInN0cm9rZS13aWR0aFwiLFwidGV4dC1yZW5kZXJpbmdcIixcImJhc2VsaW5lLXNoaWZ0XCIsXCJkb21pbmFudC1iYXNlbGluZVwiLFwiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbFwiLFwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWxcIixcInRleHQtYW5jaG9yXCIsXCJ3cml0aW5nLW1vZGVcIixcImZvbnQtc21vb3RoaW5nXCIsXCJvc3gtZm9udC1zbW9vdGhpbmdcIl07XG4gIHZhciBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfID0gW1wic2Nyb2xsYmFyLWFycm93LWNvbG9yXCIsXCJzY3JvbGxiYXItYmFzZS1jb2xvclwiLFwic2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yXCIsXCJzY3JvbGxiYXItZmFjZS1jb2xvclwiLFwic2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvclwiLFwic2Nyb2xsYmFyLXNoYWRvdy1jb2xvclwiLFwic2Nyb2xsYmFyLTNkLWxpZ2h0LWNvbG9yXCIsXCJzY3JvbGxiYXItdHJhY2stY29sb3JcIixcInNoYXBlLWluc2lkZVwiLFwic2VhcmNoZmllbGQtY2FuY2VsLWJ1dHRvblwiLFwic2VhcmNoZmllbGQtZGVjb3JhdGlvblwiLFwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b25cIixcInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvblwiLFwiem9vbVwiXTtcbiAgdmFyIGZvbnRQcm9wZXJ0aWVzXyA9IFtcImZvbnQtZmFtaWx5XCIsXCJzcmNcIixcInVuaWNvZGUtcmFuZ2VcIixcImZvbnQtdmFyaWFudFwiLFwiZm9udC1mZWF0dXJlLXNldHRpbmdzXCIsXCJmb250LXN0cmV0Y2hcIixcImZvbnQtd2VpZ2h0XCIsXCJmb250LXN0eWxlXCJdO1xuICB2YXIgY29sb3JLZXl3b3Jkc18gPSBbXCJhbGljZWJsdWVcIixcImFudGlxdWV3aGl0ZVwiLFwiYXF1YVwiLFwiYXF1YW1hcmluZVwiLFwiYXp1cmVcIixcImJlaWdlXCIsXCJiaXNxdWVcIixcImJsYWNrXCIsXCJibGFuY2hlZGFsbW9uZFwiLFwiYmx1ZVwiLFwiYmx1ZXZpb2xldFwiLFwiYnJvd25cIixcImJ1cmx5d29vZFwiLFwiY2FkZXRibHVlXCIsXCJjaGFydHJldXNlXCIsXCJjaG9jb2xhdGVcIixcImNvcmFsXCIsXCJjb3JuZmxvd2VyYmx1ZVwiLFwiY29ybnNpbGtcIixcImNyaW1zb25cIixcImN5YW5cIixcImRhcmtibHVlXCIsXCJkYXJrY3lhblwiLFwiZGFya2dvbGRlbnJvZFwiLFwiZGFya2dyYXlcIixcImRhcmtncmVlblwiLFwiZGFya2toYWtpXCIsXCJkYXJrbWFnZW50YVwiLFwiZGFya29saXZlZ3JlZW5cIixcImRhcmtvcmFuZ2VcIixcImRhcmtvcmNoaWRcIixcImRhcmtyZWRcIixcImRhcmtzYWxtb25cIixcImRhcmtzZWFncmVlblwiLFwiZGFya3NsYXRlYmx1ZVwiLFwiZGFya3NsYXRlZ3JheVwiLFwiZGFya3R1cnF1b2lzZVwiLFwiZGFya3Zpb2xldFwiLFwiZGVlcHBpbmtcIixcImRlZXBza3libHVlXCIsXCJkaW1ncmF5XCIsXCJkb2RnZXJibHVlXCIsXCJmaXJlYnJpY2tcIixcImZsb3JhbHdoaXRlXCIsXCJmb3Jlc3RncmVlblwiLFwiZnVjaHNpYVwiLFwiZ2FpbnNib3JvXCIsXCJnaG9zdHdoaXRlXCIsXCJnb2xkXCIsXCJnb2xkZW5yb2RcIixcImdyYXlcIixcImdyZXlcIixcImdyZWVuXCIsXCJncmVlbnllbGxvd1wiLFwiaG9uZXlkZXdcIixcImhvdHBpbmtcIixcImluZGlhbnJlZFwiLFwiaW5kaWdvXCIsXCJpdm9yeVwiLFwia2hha2lcIixcImxhdmVuZGVyXCIsXCJsYXZlbmRlcmJsdXNoXCIsXCJsYXduZ3JlZW5cIixcImxlbW9uY2hpZmZvblwiLFwibGlnaHRibHVlXCIsXCJsaWdodGNvcmFsXCIsXCJsaWdodGN5YW5cIixcImxpZ2h0Z29sZGVucm9keWVsbG93XCIsXCJsaWdodGdyYXlcIixcImxpZ2h0Z3JlZW5cIixcImxpZ2h0cGlua1wiLFwibGlnaHRzYWxtb25cIixcImxpZ2h0c2VhZ3JlZW5cIixcImxpZ2h0c2t5Ymx1ZVwiLFwibGlnaHRzbGF0ZWdyYXlcIixcImxpZ2h0c3RlZWxibHVlXCIsXCJsaWdodHllbGxvd1wiLFwibGltZVwiLFwibGltZWdyZWVuXCIsXCJsaW5lblwiLFwibWFnZW50YVwiLFwibWFyb29uXCIsXCJtZWRpdW1hcXVhbWFyaW5lXCIsXCJtZWRpdW1ibHVlXCIsXCJtZWRpdW1vcmNoaWRcIixcIm1lZGl1bXB1cnBsZVwiLFwibWVkaXVtc2VhZ3JlZW5cIixcIm1lZGl1bXNsYXRlYmx1ZVwiLFwibWVkaXVtc3ByaW5nZ3JlZW5cIixcIm1lZGl1bXR1cnF1b2lzZVwiLFwibWVkaXVtdmlvbGV0cmVkXCIsXCJtaWRuaWdodGJsdWVcIixcIm1pbnRjcmVhbVwiLFwibWlzdHlyb3NlXCIsXCJtb2NjYXNpblwiLFwibmF2YWpvd2hpdGVcIixcIm5hdnlcIixcIm9sZGxhY2VcIixcIm9saXZlXCIsXCJvbGl2ZWRyYWJcIixcIm9yYW5nZVwiLFwib3JhbmdlcmVkXCIsXCJvcmNoaWRcIixcInBhbGVnb2xkZW5yb2RcIixcInBhbGVncmVlblwiLFwicGFsZXR1cnF1b2lzZVwiLFwicGFsZXZpb2xldHJlZFwiLFwicGFwYXlhd2hpcFwiLFwicGVhY2hwdWZmXCIsXCJwZXJ1XCIsXCJwaW5rXCIsXCJwbHVtXCIsXCJwb3dkZXJibHVlXCIsXCJwdXJwbGVcIixcInJlYmVjY2FwdXJwbGVcIixcInJlZFwiLFwicm9zeWJyb3duXCIsXCJyb3lhbGJsdWVcIixcInNhZGRsZWJyb3duXCIsXCJzYWxtb25cIixcInNhbmR5YnJvd25cIixcInNlYWdyZWVuXCIsXCJzZWFzaGVsbFwiLFwic2llbm5hXCIsXCJzaWx2ZXJcIixcInNreWJsdWVcIixcInNsYXRlYmx1ZVwiLFwic2xhdGVncmF5XCIsXCJzbm93XCIsXCJzcHJpbmdncmVlblwiLFwic3RlZWxibHVlXCIsXCJ0YW5cIixcInRlYWxcIixcInRoaXN0bGVcIixcInRvbWF0b1wiLFwidHVycXVvaXNlXCIsXCJ2aW9sZXRcIixcIndoZWF0XCIsXCJ3aGl0ZVwiLFwid2hpdGVzbW9rZVwiLFwieWVsbG93XCIsXCJ5ZWxsb3dncmVlblwiXTtcbiAgdmFyIHZhbHVlS2V5d29yZHNfID0gW1wiYWJvdmVcIixcImFic29sdXRlXCIsXCJhY3RpdmVib3JkZXJcIixcImFkZGl0aXZlXCIsXCJhY3RpdmVjYXB0aW9uXCIsXCJhZmFyXCIsXCJhZnRlci13aGl0ZS1zcGFjZVwiLFwiYWhlYWRcIixcImFsaWFzXCIsXCJhbGxcIixcImFsbC1zY3JvbGxcIixcImFscGhhYmV0aWNcIixcImFsdGVybmF0ZVwiLFwiYWx3YXlzXCIsXCJhbWhhcmljXCIsXCJhbWhhcmljLWFiZWdlZGVcIixcImFudGlhbGlhc2VkXCIsXCJhcHB3b3Jrc3BhY2VcIixcImFyYWJpYy1pbmRpY1wiLFwiYXJtZW5pYW5cIixcImFzdGVyaXNrc1wiLFwiYXR0clwiLFwiYXV0b1wiLFwiYXZvaWRcIixcImF2b2lkLWNvbHVtblwiLFwiYXZvaWQtcGFnZVwiLFwiYXZvaWQtcmVnaW9uXCIsXCJiYWNrZ3JvdW5kXCIsXCJiYWNrd2FyZHNcIixcImJhc2VsaW5lXCIsXCJiZWxvd1wiLFwiYmlkaS1vdmVycmlkZVwiLFwiYmluYXJ5XCIsXCJiZW5nYWxpXCIsXCJibGlua1wiLFwiYmxvY2tcIixcImJsb2NrLWF4aXNcIixcImJvbGRcIixcImJvbGRlclwiLFwiYm9yZGVyXCIsXCJib3JkZXItYm94XCIsXCJib3RoXCIsXCJib3R0b21cIixcImJyZWFrXCIsXCJicmVhay1hbGxcIixcImJyZWFrLXdvcmRcIixcImJ1bGxldHNcIixcImJ1dHRvblwiLFwiYnV0dG9uLWJldmVsXCIsXCJidXR0b25mYWNlXCIsXCJidXR0b25oaWdobGlnaHRcIixcImJ1dHRvbnNoYWRvd1wiLFwiYnV0dG9udGV4dFwiLFwiY2FsY1wiLFwiY2FtYm9kaWFuXCIsXCJjYXBpdGFsaXplXCIsXCJjYXBzLWxvY2staW5kaWNhdG9yXCIsXCJjYXB0aW9uXCIsXCJjYXB0aW9udGV4dFwiLFwiY2FyZXRcIixcImNlbGxcIixcImNlbnRlclwiLFwiY2hlY2tib3hcIixcImNpcmNsZVwiLFwiY2prLWRlY2ltYWxcIixcImNqay1lYXJ0aGx5LWJyYW5jaFwiLFwiY2prLWhlYXZlbmx5LXN0ZW1cIixcImNqay1pZGVvZ3JhcGhpY1wiLFwiY2xlYXJcIixcImNsaXBcIixcImNsb3NlLXF1b3RlXCIsXCJjb2wtcmVzaXplXCIsXCJjb2xsYXBzZVwiLFwiY29sdW1uXCIsXCJjb21wYWN0XCIsXCJjb25kZW5zZWRcIixcImNvbnRhaW5cIixcImNvbnRlbnRcIixcImNvbnRlbnRzXCIsXCJjb250ZW50LWJveFwiLFwiY29udGV4dC1tZW51XCIsXCJjb250aW51b3VzXCIsXCJjb3B5XCIsXCJjb3VudGVyXCIsXCJjb3VudGVyc1wiLFwiY292ZXJcIixcImNyb3BcIixcImNyb3NzXCIsXCJjcm9zc2hhaXJcIixcImN1cnJlbnRjb2xvclwiLFwiY3Vyc2l2ZVwiLFwiY3ljbGljXCIsXCJkYXNoZWRcIixcImRlY2ltYWxcIixcImRlY2ltYWwtbGVhZGluZy16ZXJvXCIsXCJkZWZhdWx0XCIsXCJkZWZhdWx0LWJ1dHRvblwiLFwiZGVzdGluYXRpb24tYXRvcFwiLFwiZGVzdGluYXRpb24taW5cIixcImRlc3RpbmF0aW9uLW91dFwiLFwiZGVzdGluYXRpb24tb3ZlclwiLFwiZGV2YW5hZ2FyaVwiLFwiZGlzY1wiLFwiZGlzY2FyZFwiLFwiZGlzY2xvc3VyZS1jbG9zZWRcIixcImRpc2Nsb3N1cmUtb3BlblwiLFwiZG9jdW1lbnRcIixcImRvdC1kYXNoXCIsXCJkb3QtZG90LWRhc2hcIixcImRvdHRlZFwiLFwiZG91YmxlXCIsXCJkb3duXCIsXCJlLXJlc2l6ZVwiLFwiZWFzZVwiLFwiZWFzZS1pblwiLFwiZWFzZS1pbi1vdXRcIixcImVhc2Utb3V0XCIsXCJlbGVtZW50XCIsXCJlbGxpcHNlXCIsXCJlbGxpcHNpc1wiLFwiZW1iZWRcIixcImVuZFwiLFwiZXRoaW9waWNcIixcImV0aGlvcGljLWFiZWdlZGVcIixcImV0aGlvcGljLWFiZWdlZGUtYW0tZXRcIixcImV0aGlvcGljLWFiZWdlZGUtZ2V6XCIsXCJldGhpb3BpYy1hYmVnZWRlLXRpLWVyXCIsXCJldGhpb3BpYy1hYmVnZWRlLXRpLWV0XCIsXCJldGhpb3BpYy1oYWxlaGFtZS1hYS1lclwiLFwiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXRcIixcImV0aGlvcGljLWhhbGVoYW1lLWFtLWV0XCIsXCJldGhpb3BpYy1oYWxlaGFtZS1nZXpcIixcImV0aGlvcGljLWhhbGVoYW1lLW9tLWV0XCIsXCJldGhpb3BpYy1oYWxlaGFtZS1zaWQtZXRcIixcImV0aGlvcGljLWhhbGVoYW1lLXNvLWV0XCIsXCJldGhpb3BpYy1oYWxlaGFtZS10aS1lclwiLFwiZXRoaW9waWMtaGFsZWhhbWUtdGktZXRcIixcImV0aGlvcGljLWhhbGVoYW1lLXRpZ1wiLFwiZXRoaW9waWMtbnVtZXJpY1wiLFwiZXctcmVzaXplXCIsXCJleHBhbmRlZFwiLFwiZXh0ZW5kc1wiLFwiZXh0cmEtY29uZGVuc2VkXCIsXCJleHRyYS1leHBhbmRlZFwiLFwiZmFudGFzeVwiLFwiZmFzdFwiLFwiZmlsbFwiLFwiZml4ZWRcIixcImZsYXRcIixcImZsZXhcIixcImZvb3Rub3Rlc1wiLFwiZm9yd2FyZHNcIixcImZyb21cIixcImdlb21ldHJpY1ByZWNpc2lvblwiLFwiZ2VvcmdpYW5cIixcImdyYXl0ZXh0XCIsXCJncm9vdmVcIixcImd1amFyYXRpXCIsXCJndXJtdWtoaVwiLFwiaGFuZFwiLFwiaGFuZ3VsXCIsXCJoYW5ndWwtY29uc29uYW50XCIsXCJoZWJyZXdcIixcImhlbHBcIixcImhpZGRlblwiLFwiaGlkZVwiLFwiaGlnaGVyXCIsXCJoaWdobGlnaHRcIixcImhpZ2hsaWdodHRleHRcIixcImhpcmFnYW5hXCIsXCJoaXJhZ2FuYS1pcm9oYVwiLFwiaG9yaXpvbnRhbFwiLFwiaHNsXCIsXCJoc2xhXCIsXCJpY29uXCIsXCJpZ25vcmVcIixcImluYWN0aXZlYm9yZGVyXCIsXCJpbmFjdGl2ZWNhcHRpb25cIixcImluYWN0aXZlY2FwdGlvbnRleHRcIixcImluZmluaXRlXCIsXCJpbmZvYmFja2dyb3VuZFwiLFwiaW5mb3RleHRcIixcImluaGVyaXRcIixcImluaXRpYWxcIixcImlubGluZVwiLFwiaW5saW5lLWF4aXNcIixcImlubGluZS1ibG9ja1wiLFwiaW5saW5lLWZsZXhcIixcImlubGluZS10YWJsZVwiLFwiaW5zZXRcIixcImluc2lkZVwiLFwiaW50cmluc2ljXCIsXCJpbnZlcnRcIixcIml0YWxpY1wiLFwiamFwYW5lc2UtZm9ybWFsXCIsXCJqYXBhbmVzZS1pbmZvcm1hbFwiLFwianVzdGlmeVwiLFwia2FubmFkYVwiLFwia2F0YWthbmFcIixcImthdGFrYW5hLWlyb2hhXCIsXCJrZWVwLWFsbFwiLFwia2htZXJcIixcImtvcmVhbi1oYW5ndWwtZm9ybWFsXCIsXCJrb3JlYW4taGFuamEtZm9ybWFsXCIsXCJrb3JlYW4taGFuamEtaW5mb3JtYWxcIixcImxhbmRzY2FwZVwiLFwibGFvXCIsXCJsYXJnZVwiLFwibGFyZ2VyXCIsXCJsZWZ0XCIsXCJsZXZlbFwiLFwibGlnaHRlclwiLFwibGluZS10aHJvdWdoXCIsXCJsaW5lYXJcIixcImxpbmVhci1ncmFkaWVudFwiLFwibGluZXNcIixcImxpc3QtaXRlbVwiLFwibGlzdGJveFwiLFwibGlzdGl0ZW1cIixcImxvY2FsXCIsXCJsb2dpY2FsXCIsXCJsb3VkXCIsXCJsb3dlclwiLFwibG93ZXItYWxwaGFcIixcImxvd2VyLWFybWVuaWFuXCIsXCJsb3dlci1ncmVla1wiLFwibG93ZXItaGV4YWRlY2ltYWxcIixcImxvd2VyLWxhdGluXCIsXCJsb3dlci1ub3J3ZWdpYW5cIixcImxvd2VyLXJvbWFuXCIsXCJsb3dlcmNhc2VcIixcImx0clwiLFwibWFsYXlhbGFtXCIsXCJtYXRjaFwiLFwibWF0cml4XCIsXCJtYXRyaXgzZFwiLFwibWVkaWEtY29udHJvbHMtYmFja2dyb3VuZFwiLFwibWVkaWEtY3VycmVudC10aW1lLWRpc3BsYXlcIixcIm1lZGlhLWZ1bGxzY3JlZW4tYnV0dG9uXCIsXCJtZWRpYS1tdXRlLWJ1dHRvblwiLFwibWVkaWEtcGxheS1idXR0b25cIixcIm1lZGlhLXJldHVybi10by1yZWFsdGltZS1idXR0b25cIixcIm1lZGlhLXJld2luZC1idXR0b25cIixcIm1lZGlhLXNlZWstYmFjay1idXR0b25cIixcIm1lZGlhLXNlZWstZm9yd2FyZC1idXR0b25cIixcIm1lZGlhLXNsaWRlclwiLFwibWVkaWEtc2xpZGVydGh1bWJcIixcIm1lZGlhLXRpbWUtcmVtYWluaW5nLWRpc3BsYXlcIixcIm1lZGlhLXZvbHVtZS1zbGlkZXJcIixcIm1lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyXCIsXCJtZWRpYS12b2x1bWUtc2xpZGVydGh1bWJcIixcIm1lZGl1bVwiLFwibWVudVwiLFwibWVudWxpc3RcIixcIm1lbnVsaXN0LWJ1dHRvblwiLFwibWVudWxpc3QtdGV4dFwiLFwibWVudWxpc3QtdGV4dGZpZWxkXCIsXCJtZW51dGV4dFwiLFwibWVzc2FnZS1ib3hcIixcIm1pZGRsZVwiLFwibWluLWludHJpbnNpY1wiLFwibWl4XCIsXCJtb25nb2xpYW5cIixcIm1vbm9zcGFjZVwiLFwibW92ZVwiLFwibXVsdGlwbGVcIixcIm15YW5tYXJcIixcIm4tcmVzaXplXCIsXCJuYXJyb3dlclwiLFwibmUtcmVzaXplXCIsXCJuZXN3LXJlc2l6ZVwiLFwibm8tY2xvc2UtcXVvdGVcIixcIm5vLWRyb3BcIixcIm5vLW9wZW4tcXVvdGVcIixcIm5vLXJlcGVhdFwiLFwibm9uZVwiLFwibm9ybWFsXCIsXCJub3QtYWxsb3dlZFwiLFwibm93cmFwXCIsXCJucy1yZXNpemVcIixcIm51bWJlcnNcIixcIm51bWVyaWNcIixcIm53LXJlc2l6ZVwiLFwibndzZS1yZXNpemVcIixcIm9ibGlxdWVcIixcIm9jdGFsXCIsXCJvcGVuLXF1b3RlXCIsXCJvcHRpbWl6ZUxlZ2liaWxpdHlcIixcIm9wdGltaXplU3BlZWRcIixcIm9yaXlhXCIsXCJvcm9tb1wiLFwib3V0c2V0XCIsXCJvdXRzaWRlXCIsXCJvdXRzaWRlLXNoYXBlXCIsXCJvdmVybGF5XCIsXCJvdmVybGluZVwiLFwicGFkZGluZ1wiLFwicGFkZGluZy1ib3hcIixcInBhaW50ZWRcIixcInBhZ2VcIixcInBhdXNlZFwiLFwicGVyc2lhblwiLFwicGVyc3BlY3RpdmVcIixcInBsdXMtZGFya2VyXCIsXCJwbHVzLWxpZ2h0ZXJcIixcInBvaW50ZXJcIixcInBvbHlnb25cIixcInBvcnRyYWl0XCIsXCJwcmVcIixcInByZS1saW5lXCIsXCJwcmUtd3JhcFwiLFwicHJlc2VydmUtM2RcIixcInByb2dyZXNzXCIsXCJwdXNoLWJ1dHRvblwiLFwicmFkaWFsLWdyYWRpZW50XCIsXCJyYWRpb1wiLFwicmVhZC1vbmx5XCIsXCJyZWFkLXdyaXRlXCIsXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsXCJyZWN0YW5nbGVcIixcInJlZ2lvblwiLFwicmVsYXRpdmVcIixcInJlcGVhdFwiLFwicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudFwiLFwicmVwZWF0aW5nLXJhZGlhbC1ncmFkaWVudFwiLFwicmVwZWF0LXhcIixcInJlcGVhdC15XCIsXCJyZXNldFwiLFwicmV2ZXJzZVwiLFwicmdiXCIsXCJyZ2JhXCIsXCJyaWRnZVwiLFwicmlnaHRcIixcInJvdGF0ZVwiLFwicm90YXRlM2RcIixcInJvdGF0ZVhcIixcInJvdGF0ZVlcIixcInJvdGF0ZVpcIixcInJvdW5kXCIsXCJyb3ctcmVzaXplXCIsXCJydGxcIixcInJ1bi1pblwiLFwicnVubmluZ1wiLFwicy1yZXNpemVcIixcInNhbnMtc2VyaWZcIixcInNjYWxlXCIsXCJzY2FsZTNkXCIsXCJzY2FsZVhcIixcInNjYWxlWVwiLFwic2NhbGVaXCIsXCJzY3JvbGxcIixcInNjcm9sbGJhclwiLFwic2Nyb2xsLXBvc2l0aW9uXCIsXCJzZS1yZXNpemVcIixcInNlYXJjaGZpZWxkXCIsXCJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uXCIsXCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uXCIsXCJzZWFyY2hmaWVsZC1yZXN1bHRzLWJ1dHRvblwiLFwic2VhcmNoZmllbGQtcmVzdWx0cy1kZWNvcmF0aW9uXCIsXCJzZW1pLWNvbmRlbnNlZFwiLFwic2VtaS1leHBhbmRlZFwiLFwic2VwYXJhdGVcIixcInNlcmlmXCIsXCJzaG93XCIsXCJzaWRhbWFcIixcInNpbXAtY2hpbmVzZS1mb3JtYWxcIixcInNpbXAtY2hpbmVzZS1pbmZvcm1hbFwiLFwic2luZ2xlXCIsXCJza2V3XCIsXCJza2V3WFwiLFwic2tld1lcIixcInNraXAtd2hpdGUtc3BhY2VcIixcInNsaWRlXCIsXCJzbGlkZXItaG9yaXpvbnRhbFwiLFwic2xpZGVyLXZlcnRpY2FsXCIsXCJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsXCIsXCJzbGlkZXJ0aHVtYi12ZXJ0aWNhbFwiLFwic2xvd1wiLFwic21hbGxcIixcInNtYWxsLWNhcHNcIixcInNtYWxsLWNhcHRpb25cIixcInNtYWxsZXJcIixcInNvbGlkXCIsXCJzb21hbGlcIixcInNvdXJjZS1hdG9wXCIsXCJzb3VyY2UtaW5cIixcInNvdXJjZS1vdXRcIixcInNvdXJjZS1vdmVyXCIsXCJzcGFjZVwiLFwic3BlbGwtb3V0XCIsXCJzcXVhcmVcIixcInNxdWFyZS1idXR0b25cIixcInN0YXJ0XCIsXCJzdGF0aWNcIixcInN0YXR1cy1iYXJcIixcInN0cmV0Y2hcIixcInN0cm9rZVwiLFwic3ViXCIsXCJzdWJwaXhlbC1hbnRpYWxpYXNlZFwiLFwic3VwZXJcIixcInN3LXJlc2l6ZVwiLFwic3ltYm9saWNcIixcInN5bWJvbHNcIixcInRhYmxlXCIsXCJ0YWJsZS1jYXB0aW9uXCIsXCJ0YWJsZS1jZWxsXCIsXCJ0YWJsZS1jb2x1bW5cIixcInRhYmxlLWNvbHVtbi1ncm91cFwiLFwidGFibGUtZm9vdGVyLWdyb3VwXCIsXCJ0YWJsZS1oZWFkZXItZ3JvdXBcIixcInRhYmxlLXJvd1wiLFwidGFibGUtcm93LWdyb3VwXCIsXCJ0YW1pbFwiLFwidGVsdWd1XCIsXCJ0ZXh0XCIsXCJ0ZXh0LWJvdHRvbVwiLFwidGV4dC10b3BcIixcInRleHRhcmVhXCIsXCJ0ZXh0ZmllbGRcIixcInRoYWlcIixcInRoaWNrXCIsXCJ0aGluXCIsXCJ0aHJlZWRkYXJrc2hhZG93XCIsXCJ0aHJlZWRmYWNlXCIsXCJ0aHJlZWRoaWdobGlnaHRcIixcInRocmVlZGxpZ2h0c2hhZG93XCIsXCJ0aHJlZWRzaGFkb3dcIixcInRpYmV0YW5cIixcInRpZ3JlXCIsXCJ0aWdyaW55YS1lclwiLFwidGlncmlueWEtZXItYWJlZ2VkZVwiLFwidGlncmlueWEtZXRcIixcInRpZ3JpbnlhLWV0LWFiZWdlZGVcIixcInRvXCIsXCJ0b3BcIixcInRyYWQtY2hpbmVzZS1mb3JtYWxcIixcInRyYWQtY2hpbmVzZS1pbmZvcm1hbFwiLFwidHJhbnNsYXRlXCIsXCJ0cmFuc2xhdGUzZFwiLFwidHJhbnNsYXRlWFwiLFwidHJhbnNsYXRlWVwiLFwidHJhbnNsYXRlWlwiLFwidHJhbnNwYXJlbnRcIixcInVsdHJhLWNvbmRlbnNlZFwiLFwidWx0cmEtZXhwYW5kZWRcIixcInVuZGVybGluZVwiLFwidXBcIixcInVwcGVyLWFscGhhXCIsXCJ1cHBlci1hcm1lbmlhblwiLFwidXBwZXItZ3JlZWtcIixcInVwcGVyLWhleGFkZWNpbWFsXCIsXCJ1cHBlci1sYXRpblwiLFwidXBwZXItbm9yd2VnaWFuXCIsXCJ1cHBlci1yb21hblwiLFwidXBwZXJjYXNlXCIsXCJ1cmR1XCIsXCJ1cmxcIixcInZhclwiLFwidmVydGljYWxcIixcInZlcnRpY2FsLXRleHRcIixcInZpc2libGVcIixcInZpc2libGVGaWxsXCIsXCJ2aXNpYmxlUGFpbnRlZFwiLFwidmlzaWJsZVN0cm9rZVwiLFwidmlzdWFsXCIsXCJ3LXJlc2l6ZVwiLFwid2FpdFwiLFwid2F2ZVwiLFwid2lkZXJcIixcIndpbmRvd1wiLFwid2luZG93ZnJhbWVcIixcIndpbmRvd3RleHRcIixcIndvcmRzXCIsXCJ4LWxhcmdlXCIsXCJ4LXNtYWxsXCIsXCJ4b3JcIixcInh4LWxhcmdlXCIsXCJ4eC1zbWFsbFwiLFwiYmljdWJpY1wiLFwib3B0aW1pemVzcGVlZFwiLFwiZ3JheXNjYWxlXCIsXCJyb3dcIixcInJvdy1yZXZlcnNlXCIsXCJ3cmFwXCIsXCJ3cmFwLXJldmVyc2VcIixcImNvbHVtbi1yZXZlcnNlXCIsXCJmbGV4LXN0YXJ0XCIsXCJmbGV4LWVuZFwiLFwic3BhY2UtYmV0d2VlblwiLFwic3BhY2UtYXJvdW5kXCIsIFwidW5zZXRcIl07XG5cbiAgdmFyIHdvcmRPcGVyYXRvcktleXdvcmRzXyA9IFtcImluXCIsXCJhbmRcIixcIm9yXCIsXCJub3RcIixcImlzIG5vdFwiLFwiaXMgYVwiLFwiaXNcIixcImlzbnRcIixcImRlZmluZWRcIixcImlmIHVubGVzc1wiXSxcbiAgICAgIGJsb2NrS2V5d29yZHNfID0gW1wiZm9yXCIsXCJpZlwiLFwiZWxzZVwiLFwidW5sZXNzXCIsIFwiZnJvbVwiLCBcInRvXCJdLFxuICAgICAgY29tbW9uQXRvbXNfID0gW1wibnVsbFwiLFwidHJ1ZVwiLFwiZmFsc2VcIixcImhyZWZcIixcInRpdGxlXCIsXCJ0eXBlXCIsXCJub3QtYWxsb3dlZFwiLFwicmVhZG9ubHlcIixcImRpc2FibGVkXCJdLFxuICAgICAgY29tbW9uRGVmXyA9IFtcIkBmb250LWZhY2VcIiwgXCJAa2V5ZnJhbWVzXCIsIFwiQG1lZGlhXCIsIFwiQHZpZXdwb3J0XCIsIFwiQHBhZ2VcIiwgXCJAaG9zdFwiLCBcIkBzdXBwb3J0c1wiLCBcIkBibG9ja1wiLCBcIkBjc3NcIl07XG5cbiAgdmFyIGhpbnRXb3JkcyA9IHRhZ0tleXdvcmRzXy5jb25jYXQoZG9jdW1lbnRUeXBlc18sbWVkaWFUeXBlc18sbWVkaWFGZWF0dXJlc18sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5d29yZHNfLG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yS2V5d29yZHNfLHZhbHVlS2V5d29yZHNfLGZvbnRQcm9wZXJ0aWVzXyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE9wZXJhdG9yS2V5d29yZHNfLGJsb2NrS2V5d29yZHNfLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25BdG9tc18sY29tbW9uRGVmXyk7XG5cbiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3Jkcykge1xuICAgIHdvcmRzID0gd29yZHMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiID4gYTt9KTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oKFwiICsgd29yZHMuam9pbihcIil8KFwiKSArIFwiKSlcXFxcYlwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleVNldChhcnJheSkge1xuICAgIHZhciBrZXlzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkga2V5c1thcnJheVtpXV0gPSB0cnVlO1xuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgXCJcXFxcJCZcIik7XG4gIH1cblxuICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKFwiaGludFdvcmRzXCIsIFwic3R5bHVzXCIsIGhpbnRXb3Jkcyk7XG4gIENvZGVNaXJyb3IuZGVmaW5lTUlNRShcInRleHQveC1zdHlsXCIsIFwic3R5bHVzXCIpO1xufSk7XG5cbi8qIyBzb3VyY2VVUkw9Y21fbW9kZXMvc3R5bHVzLmpzICovIjtSdW50aW1lLmNhY2hlZFJlc291cmNlc1siY21fbW9kZXMvanN4LmpzIl09Ii8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0VcblxuKGZ1bmN0aW9uKG1vZCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09IFwib2JqZWN0XCIpIC8vIENvbW1vbkpTXG4gICAgbW9kKHJlcXVpcmUoXCIuLi8uLi9saWIvY29kZW1pcnJvclwiKSwgcmVxdWlyZShcIi4uL3htbC94bWxcIiksIHJlcXVpcmUoXCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHRcIikpXG4gIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIC8vIEFNRFxuICAgIGRlZmluZShbXCIuLi8uLi9saWIvY29kZW1pcnJvclwiLCBcIi4uL3htbC94bWxcIiwgXCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHRcIl0sIG1vZClcbiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudlxuICAgIG1vZChDb2RlTWlycm9yKVxufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuICBcInVzZSBzdHJpY3RcIlxuXG4gIC8vIERlcHRoIG1lYW5zIHRoZSBhbW91bnQgb2Ygb3BlbiBicmFjZXMgaW4gSlMgY29udGV4dCwgaW4gWE1MXG4gIC8vIGNvbnRleHQgMCBtZWFucyBub3QgaW4gdGFnLCAxIG1lYW5zIGluIHRhZywgYW5kIDIgbWVhbnMgaW4gdGFnXG4gIC8vIGFuZCBqcyBibG9jayBjb21tZW50LlxuICBmdW5jdGlvbiBDb250ZXh0KHN0YXRlLCBtb2RlLCBkZXB0aCwgcHJldikge1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsgdGhpcy5tb2RlID0gbW9kZTsgdGhpcy5kZXB0aCA9IGRlcHRoOyB0aGlzLnByZXYgPSBwcmV2XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5Q29udGV4dChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KENvZGVNaXJyb3IuY29weVN0YXRlKGNvbnRleHQubW9kZSwgY29udGV4dC5zdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcmV2ICYmIGNvcHlDb250ZXh0KGNvbnRleHQucHJldikpXG4gIH1cblxuICBDb2RlTWlycm9yLmRlZmluZU1vZGUoXCJqc3hcIiwgZnVuY3Rpb24oY29uZmlnLCBtb2RlQ29uZmlnKSB7XG4gICAgdmFyIHhtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7bmFtZTogXCJ4bWxcIiwgYWxsb3dNaXNzaW5nOiB0cnVlLCBtdWx0aWxpbmVUYWdJbmRlbnRQYXN0VGFnOiBmYWxzZX0pXG4gICAgdmFyIGpzTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIG1vZGVDb25maWcgJiYgbW9kZUNvbmZpZy5iYXNlIHx8IFwiamF2YXNjcmlwdFwiKVxuXG4gICAgZnVuY3Rpb24gZmxhdFhNTEluZGVudChzdGF0ZSkge1xuICAgICAgdmFyIHRhZ05hbWUgPSBzdGF0ZS50YWdOYW1lXG4gICAgICBzdGF0ZS50YWdOYW1lID0gbnVsbFxuICAgICAgdmFyIHJlc3VsdCA9IHhtbE1vZGUuaW5kZW50KHN0YXRlLCBcIlwiKVxuICAgICAgc3RhdGUudGFnTmFtZSA9IHRhZ05hbWVcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2tlbihzdHJlYW0sIHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUuY29udGV4dC5tb2RlID09IHhtbE1vZGUpXG4gICAgICAgIHJldHVybiB4bWxUb2tlbihzdHJlYW0sIHN0YXRlLCBzdGF0ZS5jb250ZXh0KVxuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4ganNUb2tlbihzdHJlYW0sIHN0YXRlLCBzdGF0ZS5jb250ZXh0KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHhtbFRva2VuKHN0cmVhbSwgc3RhdGUsIGN4KSB7XG4gICAgICBpZiAoY3guZGVwdGggPT0gMikgeyAvLyBJbnNpZGUgYSBKUyAvKiAqLyBjb21tZW50XG4gICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14uKj9cXCpcXC8vKSkgY3guZGVwdGggPSAxXG4gICAgICAgIGVsc2Ugc3RyZWFtLnNraXBUb0VuZCgpXG4gICAgICAgIHJldHVybiBcImNvbW1lbnRcIlxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSBcIntcIikge1xuICAgICAgICB4bWxNb2RlLnNraXBBdHRyaWJ1dGUoY3guc3RhdGUpXG5cbiAgICAgICAgdmFyIGluZGVudCA9IGZsYXRYTUxJbmRlbnQoY3guc3RhdGUpLCB4bWxDb250ZXh0ID0gY3guc3RhdGUuY29udGV4dFxuICAgICAgICAvLyBJZiBKUyBzdGFydHMgb24gc2FtZSBsaW5lIGFzIHRhZ1xuICAgICAgICBpZiAoeG1sQ29udGV4dCAmJiBzdHJlYW0ubWF0Y2goL15bXj5dKj5cXHMqJC8sIGZhbHNlKSkge1xuICAgICAgICAgIHdoaWxlICh4bWxDb250ZXh0LnByZXYgJiYgIXhtbENvbnRleHQuc3RhcnRPZkxpbmUpXG4gICAgICAgICAgICB4bWxDb250ZXh0ID0geG1sQ29udGV4dC5wcmV2XG4gICAgICAgICAgLy8gSWYgdGFnIHN0YXJ0cyB0aGUgbGluZSwgdXNlIFhNTCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAgICAgIGlmICh4bWxDb250ZXh0LnN0YXJ0T2ZMaW5lKSBpbmRlbnQgLT0gY29uZmlnLmluZGVudFVuaXRcbiAgICAgICAgICAvLyBFbHNlIHVzZSBKUyBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAgICAgIGVsc2UgaWYgKGN4LnByZXYuc3RhdGUubGV4aWNhbCkgaW5kZW50ID0gY3gucHJldi5zdGF0ZS5sZXhpY2FsLmluZGVudGVkXG4gICAgICAgIC8vIEVsc2UgaWYgaW5zaWRlIG9mIHRhZ1xuICAgICAgICB9IGVsc2UgaWYgKGN4LmRlcHRoID09IDEpIHtcbiAgICAgICAgICBpbmRlbnQgKz0gY29uZmlnLmluZGVudFVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChDb2RlTWlycm9yLnN0YXJ0U3RhdGUoanNNb2RlLCBpbmRlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNNb2RlLCAwLCBzdGF0ZS5jb250ZXh0KVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAoY3guZGVwdGggPT0gMSkgeyAvLyBJbnNpZGUgb2YgdGFnXG4gICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09IFwiPFwiKSB7IC8vIFRhZyBpbnNpZGUgb2YgdGFnXG4gICAgICAgICAgeG1sTW9kZS5za2lwQXR0cmlidXRlKGN4LnN0YXRlKVxuICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChDb2RlTWlycm9yLnN0YXJ0U3RhdGUoeG1sTW9kZSwgZmxhdFhNTEluZGVudChjeC5zdGF0ZSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxNb2RlLCAwLCBzdGF0ZS5jb250ZXh0KVxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKFwiLy9cIikpIHtcbiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKClcbiAgICAgICAgICByZXR1cm4gXCJjb21tZW50XCJcbiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goXCIvKlwiKSkge1xuICAgICAgICAgIGN4LmRlcHRoID0gMlxuICAgICAgICAgIHJldHVybiB0b2tlbihzdHJlYW0sIHN0YXRlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZSA9IHhtbE1vZGUudG9rZW4oc3RyZWFtLCBjeC5zdGF0ZSksIGN1ciA9IHN0cmVhbS5jdXJyZW50KCksIHN0b3BcbiAgICAgIGlmICgvXFxidGFnXFxiLy50ZXN0KHN0eWxlKSkge1xuICAgICAgICBpZiAoLz4kLy50ZXN0KGN1cikpIHtcbiAgICAgICAgICBpZiAoY3guc3RhdGUuY29udGV4dCkgY3guZGVwdGggPSAwXG4gICAgICAgICAgZWxzZSBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2XG4gICAgICAgIH0gZWxzZSBpZiAoL148Ly50ZXN0KGN1cikpIHtcbiAgICAgICAgICBjeC5kZXB0aCA9IDFcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc3R5bGUgJiYgKHN0b3AgPSBjdXIuaW5kZXhPZihcIntcIikpID4gLTEpIHtcbiAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gc3RvcClcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHlsZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpzVG9rZW4oc3RyZWFtLCBzdGF0ZSwgY3gpIHtcbiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09IFwiPFwiICYmIGpzTW9kZS5leHByZXNzaW9uQWxsb3dlZChzdHJlYW0sIGN4LnN0YXRlKSkge1xuICAgICAgICBqc01vZGUuc2tpcEV4cHJlc3Npb24oY3guc3RhdGUpXG4gICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChDb2RlTWlycm9yLnN0YXJ0U3RhdGUoeG1sTW9kZSwganNNb2RlLmluZGVudChjeC5zdGF0ZSwgXCJcIikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTW9kZSwgMCwgc3RhdGUuY29udGV4dClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlID0ganNNb2RlLnRva2VuKHN0cmVhbSwgY3guc3RhdGUpXG4gICAgICBpZiAoIXN0eWxlICYmIGN4LmRlcHRoICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KClcbiAgICAgICAgaWYgKGN1ciA9PSBcIntcIikge1xuICAgICAgICAgIGN4LmRlcHRoKytcbiAgICAgICAgfSBlbHNlIGlmIChjdXIgPT0gXCJ9XCIpIHtcbiAgICAgICAgICBpZiAoLS1jeC5kZXB0aCA9PSAwKSBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHlsZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtjb250ZXh0OiBuZXcgQ29udGV4dChDb2RlTWlycm9yLnN0YXJ0U3RhdGUoanNNb2RlKSwganNNb2RlKX1cbiAgICAgIH0sXG5cbiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtjb250ZXh0OiBjb3B5Q29udGV4dChzdGF0ZS5jb250ZXh0KX1cbiAgICAgIH0sXG5cbiAgICAgIHRva2VuOiB0b2tlbixcblxuICAgICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyLCBmdWxsTGluZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29udGV4dC5tb2RlLmluZGVudChzdGF0ZS5jb250ZXh0LnN0YXRlLCB0ZXh0QWZ0ZXIsIGZ1bGxMaW5lKVxuICAgICAgfSxcblxuICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29udGV4dFxuICAgICAgfVxuICAgIH1cbiAgfSwgXCJ4bWxcIiwgXCJqYXZhc2NyaXB0XCIpXG5cbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC9qc3hcIiwgXCJqc3hcIilcbiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKFwidGV4dC90eXBlc2NyaXB0LWpzeFwiLCB7bmFtZTogXCJqc3hcIiwgYmFzZToge25hbWU6IFwiamF2YXNjcmlwdFwiLCB0eXBlc2NyaXB0OiB0cnVlfX0pXG59KTtcblxuLyojIHNvdXJjZVVSTD1jbV9tb2Rlcy9qc3guanMgKi8iO1Byb2R1Y3RSZWdpc3RyeUltcGwuUmVnaXN0cnk9Y2xhc3N7Y29uc3RydWN0b3IoKXt9Cm5hbWVGb3JVcmwocGFyc2VkVXJsKXtjb25zdCBlbnRyeT10aGlzLmVudHJ5Rm9yVXJsKHBhcnNlZFVybCk7aWYoZW50cnkpCnJldHVybiBlbnRyeS5uYW1lO3JldHVybiBudWxsO30KZW50cnlGb3JVcmwocGFyc2VkVXJsKXtpZihwYXJzZWRVcmwuaXNEYXRhVVJMKCl8fCFwYXJzZWRVcmwuaXNWYWxpZCkKcmV0dXJuIG51bGw7Y29uc3QgcHJvZHVjdHNCeURvbWFpbkhhc2g9UHJvZHVjdFJlZ2lzdHJ5SW1wbC5fcHJvZHVjdHNCeURvbWFpbkhhc2g7Y29uc3QgZG9tYWluPXBhcnNlZFVybC5kb21haW4oKS5yZXBsYWNlKC9ed3d3XC4oPz1bXi5dK1wuW14uXSskKS8sJycpO2xldCBwcmV2aW91c0luZGV4PS0xO2xldCBpbmRleD0tMTtmb3IobGV0IG5leHRJbmRleD1kb21haW4uaW5kZXhPZignLicpO25leHRJbmRleCE9PS0xO25leHRJbmRleD1kb21haW4uaW5kZXhPZignLicsbmV4dEluZGV4KzEpKXtjb25zdCBwcmV2aW91c1N1YmRvbWFpbj1kb21haW4uc3Vic3RyaW5nKHByZXZpb3VzSW5kZXgrMSxpbmRleCk7Y29uc3Qgc3ViRG9tYWluPWRvbWFpbi5zdWJzdHJpbmcoaW5kZXgrMSk7Y29uc3QgcHJlZml4ZXM9cHJvZHVjdHNCeURvbWFpbkhhc2guZ2V0KFByb2R1Y3RSZWdpc3RyeUltcGwuX2hhc2hGb3JEb21haW4oc3ViRG9tYWluKSk7cHJldmlvdXNJbmRleD1pbmRleDtpbmRleD1uZXh0SW5kZXg7aWYoIXByZWZpeGVzKQpjb250aW51ZTtpZignJ2luIHByZWZpeGVzJiZkb21haW49PT1zdWJEb21haW4pCnJldHVybiBwcmVmaXhlc1snJ107aWYocHJldmlvdXNTdWJkb21haW4pe2Zvcihjb25zdCBwcmVmaXggaW4gcHJlZml4ZXMpe2NvbnN0IGRvbWFpblByZWZpeD1wcmV2aW91c1N1YmRvbWFpbi5zdWJzdHIoMCxwcmVmaXgubGVuZ3RoKTtpZihkb21haW5QcmVmaXg9PT1wcmVmaXgmJnByZWZpeCE9PScnKQpyZXR1cm4gcHJlZml4ZXNbcHJlZml4XTt9fQppZihwcmVmaXhlcyYmJyonaW4gcHJlZml4ZXMpCnJldHVybiBwcmVmaXhlc1snKiddO30KcmV0dXJuIG51bGw7fQp0eXBlRm9yVXJsKHBhcnNlZFVybCl7Y29uc3QgZW50cnk9dGhpcy5lbnRyeUZvclVybChwYXJzZWRVcmwpO2lmKGVudHJ5KQpyZXR1cm4gZW50cnkudHlwZTtyZXR1cm4gbnVsbDt9fTtQcm9kdWN0UmVnaXN0cnlJbXBsLl9oYXNoRm9yRG9tYWluPWZ1bmN0aW9uKGRvbWFpbil7cmV0dXJuIFByb2R1Y3RSZWdpc3RyeUltcGwuc2hhMShkb21haW4pLnN1YnN0cigwLDE2KTt9O1Byb2R1Y3RSZWdpc3RyeUltcGwucmVnaXN0ZXI9ZnVuY3Rpb24ocHJvZHVjdE5hbWVzLGRhdGEpe2ZvcihsZXQgaT0wO2k8ZGF0YS5sZW5ndGg7aSsrKXtjb25zdCBlbnRyeT1kYXRhW2ldO2NvbnN0IHByZWZpeGVzPXt9O2Zvcihjb25zdCBwcmVmaXggaW4gZW50cnkucHJlZml4ZXMpe2NvbnN0IHByZWZpeEVudHJ5PWVudHJ5LnByZWZpeGVzW3ByZWZpeF07Y29uc3QgdHlwZT1wcmVmaXhFbnRyeS50eXBlIT09dW5kZWZpbmVkP3ByZWZpeEVudHJ5LnR5cGU6bnVsbDtwcmVmaXhlc1twcmVmaXhdPXtuYW1lOnByb2R1Y3ROYW1lc1twcmVmaXhFbnRyeS5wcm9kdWN0XSx0eXBlOnR5cGV9O30KUHJvZHVjdFJlZ2lzdHJ5SW1wbC5fcHJvZHVjdHNCeURvbWFpbkhhc2guc2V0KGVudHJ5Lmhhc2gscHJlZml4ZXMpO319O1Byb2R1Y3RSZWdpc3RyeUltcGwuX3Byb2R1Y3RzQnlEb21haW5IYXNoPW5ldyBNYXAoKTs7UHJvZHVjdFJlZ2lzdHJ5SW1wbC5yZWdpc3RlcihbIkFwcE5leHVzIE9wZW4gQWRTdHJlYW0iLCJJbnRlcndvcmtzIE1lZGlhLCBJbmMuIiwiQWN0aW9uIEV4Y2hhbmdlLCBJbmMuIiwiVHJpcEFkdmlzb3IgTExDIiwiRlNOIEFTSUEgUFJJVkFURSBMSU1JVEVEIiwiaVByb21vdGUiLCIzM0Fjcm9zcyBJbmMuIiwiOHRoQnJpZGdlIiwiQTkiLCJBZEdlbmllIiwiQWZmaWxpbmV0IEdtYkgiLCJFdWxlcmlhbiBUZWNobm9sb2dpZXMgU0FSTCIsIkNvbnZlcnNhbnQgQWQgU2VydmVyIiwiTmFwc3RlciBMdXhlbWJ1cmcgU0FSTCIsIldpemUgQ29tbWVyY2UsIEluYy4iLCJSZXNlYXJjaCBOb3cgTGltaXRlZCIsIlNwYXJ0b28iLCJlQmF5IiwiYWR2YW5jZWQgU1RPUkUgR21iSCIsIk1hZGVsZWluZSBNb2RlIEdtYkgiLCJUZWxlZm9uaWNhIFVLIC8gTzIgVUsiLCJUYW1vbWUiLCJUVUkgVUsgTGltaXRlZCIsImlKZW50byIsIk1jQ2FubiBFcmlrc29uIiwiVHJpYmVzIFJlc2VhcmNoIExpbWl0ZWQiLCJPbiBEZXZpY2UgUmVzZWFyY2ggTHRkLiIsIlN1cGVyVmlzdGEgQUciLCJOYXRpb25hbCBMb3R0ZXJ5IiwiUmFrdXRlbiBEaXNwbGF5IiwiUmV0YWlsaWdlbmNlIiwiTG9nbHkgRFNQIiwiQXBwLUNNIEluYy4iLCJZYWhvbyEgSmFwYW4gQ29ycG9yYXRpb24iLCJPZ2dpZmlub2dpIiwiUGFwZXJHIiwiUHVibGljLUlkw6llcyIsIlRoZSBUcmFkZSBEZXNrIEluYy4iLCJBbWF6b24iLCJBaXJwdXNoLCBJbmMuIiwiQ2xpbmNoLmNvIiwiRiMgSW5jLiIsIlRyYW5zb3V0IEluYy4iLCJBRFpJUCIsIkFkd2F5cyBTQVMiLCJPcGVyYSBNZWRpYXdvcmtzIEluYy4iLCJEaXN0cm9TY2FsZSBJbmMuIiwiRW56eW1pYyBDb25zdWx0YW5jeSIsIkZsdWN0IEluYy4iLCJBY3VpdHkgQWRzIiwiaUxlYWQiLCJDYW5uZWQgQmFubmVycyBMTEMiLCJBZEJyb2tlciBHbWJIIiwiSW5NaW5kIE9waW5pb24gTWVkaWEiLCJBZGNlbnRyaWMiLCJBZENsZWFyIEdtYkgiLCJEZWluRGVhbCBBRyIsIlNpeHQgTGVhc2luZyBTRSIsIkFpciBCZXJsaW4iLCJBZWdvbiBFU1BBw5FBLCBTLkEuIGRlIFNlZ3Vyb3MgeSBSZWFzZWd1cm9zLCBVbmlwZXIiLCJBZGZvcm0gRFNQIiwiQWRjb25pb24gTWVkaWEgR3JvdXAiLCJBZGZvcm0iLCJBZGl0aW9uIiwiQWN0aXZlIEFnZW50IiwibW92LmFkIEdtYkgiLCJBZEp1ZyIsIkFkSnVnZ2xlciIsIkFkS2VlcGVyIiwiQWRLbmlmZSIsIkFka3UiLCJBZExhbnRpYyBPbmxpbmUgQWR2ZXJ0aXNpbmciLCJBZGxvb3giLCJhZE1hcmtldHBsYWNlIiwiQWRNb3Rpb24iLCJBZE1vdGlvbiBVU0EgSW5jLiIsIkRpZ2lsYW50IiwiQWRub2xvZ2llcyBHbWJIIiwiQWRvbWV0cnkgYnkgR29vZ2xlIiwiQWRwZXJpdW0gQlYiLCJBZFByZWRpY3RpdmUiLCJVc2VtYXgiLCJBZHJpbWUiLCJBZFJpdmVyIiwiQWRyb2l0IEludGVyYWN0aXZlIiwiTWVkaWFNYXRoIEluYy4iLCJDYW1wYWlnbiBNb25pdG9yIiwiSW50ZWdyYWwgQWQgU2NpZW5jZSBGaXJld2FsbCIsIkFkU2h1ZmZsZSIsIkFEU09WTyIsIkFEVEVDSCBHbWJIIiwiQWR0ZWxsaWdlbmNlIiwiQWR2ZXJsaW5lIiwiQU9MIEFkdmVydGlzaW5nLmNvbSIsIkFkYXAudHYgSW5jLiAoQWRYKSIsIkNvbnZlcnRybyBJbmMiLCJUYWNvZGEiLCJEaWdpdGFsIENvbnRyb2wgR21iSCAoQWR2b2x1dGlvbikiLCJBZFhjZWwiLCJBbGVudHkgUy5BLlMiLCJEb3VibGVDbGljayBCaWQgTWFuYWdlciIsIkJpZ2FCaWQgTWVkaWEgTHRkLiIsIkNvZ28gTGFicywgSW5jLiIsIkF1ZGllbmNlUHJvamVjdCIsIlJvY2thYm94IE1lZGlhIEx0ZCIsIlBvY2tldE1hdGgiLCJLcHN1bGUiLCJJbW1lZGl1bSwgSW5jLiIsIkZyYWN0aW9uYWwgTWVkaWEsIExMQyIsIkJvbnphaSBEaWdpdGFsIFB2dC4gTHRkIiwiRXBpYyBDb21ibyBNYWx0YSBMdGQuIiwiUXVpeGV5IiwiWU9PWCBORVQtQS1QT1JURVIgR1JPVVAgU1BBIiwiVGFwVGFwIE5ldHdvcmtzIFMuTC4iLCJDb21TY29yZSAoQWRYcG9zZSkiLCJBZFlhcmQiLCJBZmZlY3R2IiwiU0VULnR2IiwiQWRyb2l0IERpZ2l0YWwgU29sdXRpb25zIChBRFMpIiwiQXBwTmV4dXMgSW5jIiwiQWRmdXNpb24iLCJBUkMgTWVkaWEgR3JvdXAiLCJTZW1hc2lvIEdtYkgiLCJNb2ppdmEiLCJNb2NlYW4gbW9iaWxlLCBJbmMuIiwiUGhsdWFudCIsIkFkU3Bpcml0IiwiQ29udmVydE1lZGlhIEx0ZC4iLCJBVEsgTWVkaWEgR21iSCIsIkF0bGFzIiwiQXVkaWVuY2VTY2llbmNlIiwiQmVXZWJNZWRpYSIsIkJpZGFscGhhIEluYy4iLCJBZEdlYXIgVGVjaG5vbG9naWVzIEluYy4iLCJCbHVlS2FpIiwiQmx1ZXN0cmVhayIsImJsdXJiSVEiLCJCcmFuZC5uZXQiLCJCcmFuZHNjcmVlbiBJbmMuIiwiQnJpZ2h0Um9sbCBJbmMuIiwiQnJpZ2h0cm9sbCBJbmMuIiwiVmluZGljbyIsIlNwYXJrIEZsb3cgUy5BLiIsIkFhcmtpLCBJbmMuIiwiU2l0ZVNjb3V0IEFkU2VydmVyIiwiQnVyc3QgTWVkaWEgTExDIGQvYi9hIEFkQ29uZHVjdG9yIiwiQWR2ZXJ0aXNpbmcuY29tIER5bmFtaWMgUmV0YXJnZXRlciIsIk5ldEFmZmlsaWF0aW9uIiwiQzMgTWV0cmljcyBJbmMuIiwiQ0FQSVRBTERBVEEgKFNBUkwpIiwiZS1QbGFubmluZyIsIkNoYW5nbyBJbmMuIiwiQ2hhbmdvIiwiQ2hhbm5lbCBJbnRlbGxpZ2VuY2UiLCJDaGFydGJlYXQgSW5jIiwiQ2hvaWNlc3RyZWFtIEluYy4iLCJBZGRUaGlzLCBJbmMiLCJQbGF0Zm9ybSAxNjEiLCJDbGlja1BvaW50IiwiQ29iYWx0IEdyb3VwIiwiQ29nbml0aXZlIE1hdGNoIExpbWl0ZWQiLCJUYWd0b28gVGVjaCBMaW1pdGVkIiwid2F5U3Rvcm0gQ28uLCBMdGQuIiwiQ29sbGVjdGl2ZSBNZWRpYSBMTEMiLCJDb21TY29yZSBDYW1wYWlnbiBFc3NlbnRpYWxzIChDRSkiLCJDb21TY29yZSBWYWxpZGF0ZWQgQ2FtcGFpZ24gRXNzZW50aWFscyAodkNFKSIsIlZvaWNlRml2ZSAoQ29tU2NvcmUpIiwiQ29ubmV4aXR5IExMQyIsIkNvbnN0YW50IENvbnRhY3QiLCJDb250ZXh0V2ViIEluYy4iLCJDb252ZXJzaXZlIEJWIiwiSUJNIERpZ2l0YWwgQW5hbHl0aWNzIiwiQ3JpbXRhbiIsIkNyaXRlbyIsIkQuQS4gQ29uc29ydGl1bSBJbmMuIChFZmZlY3RpdmVPbmUpIiwiUGxhdGZvcm0gT25lIiwiRGFwcGVyIEluYy4iLCJEYXRhWHUgSW5jLiIsIkFwZXJ0dXJlIiwiUmFrdXRlbiBBdHRyaWJ1dGlvbiIsIkFkQWN0aW9uIiwiRGVtYW5kYmFzZSBJbmMuIiwiT21uaXR1cmUiLCJSb3Zpb24sIEluYy4iLCJBZEh1aS5jb20gTExDIiwiQmlkbGFiIHNwLiB6IG8ubyIsIkN5YmVyQWdlbnQgSW5jLiIsIlJlbGF5NDIgVGVjaG5vbG9neSBCLlYuIiwiTmllbHNlbiBEaWdpdGFsIEFkIFJhdGluZ3MgKEpTKSIsIk5pZWxzZW4gKEF1ZGllbmNlIE1lYXN1cmVtZW50IFBsYXRmb3JtKSIsIk5pZWxzZW4gT0JFIChWaXp1KSIsIk5pZWxzZW4gKFNhbGVzIEVmZmVjdCkiLCJPaGFuYSBNZWRpYSBJbmRpYSBQcml2YXRlIExpbWl0ZWQiLCJBdmFpbCBJbnRlbGxpZ2VuY2UiLCJBZG9iZSBTY2VuZSA3IiwiQXNkYSIsIkFkc2ZhY3RvciBMaW1pdGVkIiwiVHJhZGVtb2IgR21iSCIsIlphbXBsdXMgVGVjaG5vbG9neSBDby4sIEx0ZC4iLCJUZWxlbWV0cnkgTGltaXRlZCIsIkFkUGlsb3QiLCJlYm9va2VycyIsIk1hc2hlcm8gR21iSCIsIjR3TWFya2V0UGxhY2UgU3JsIiwiTWVldGljIFBhcnRuZXJzIiwiQWRhcmEgTWVkaWEiLCJBZGxlZGdlIiwiQWRsZWRnZTogQWQgU3dhcHBpbmciLCJMaWZlU3RyZWV0IENvcnBvcnRhdGlvbiIsIkFkQ2lycnVzIiwiRGltZXN0b3JlIiwiR2ZLIFNFIiwiQ29udmVyc2FudCBDUk0iLCJEb3VibGVWZXJpZnkgSW5jLiIsIkRvdWJsZVZlcmlmeSBJbmMuIChCcmFuZFNoaWVsZCk6IEFkIFN3YXBwaW5nIiwiRHluYW1pYyBWaWRlbyBMTEMiLCJUaGluayBSZWFsVGltZSwgTExDIiwiRWZmZWN0aXZlIE1lYXN1cmUiLCJBZG9iZSBNZWRpYSBPcHRpbWl6ZXIiLCJFZmZpbGlhdGlvbiIsIkVtZWRpYXRlQWQiLCJlbmdhZ2U6QkRSIEluYy4iLCJHaG9zdGVyeSBFbnRlcnByaXNlIiwiRXhwZXJ0ZWVyIEdtYkgiLCJBY3Rpb24gQWxsb2NhdG9yIiwiQWRUcmF4eCIsImV5ZURlbWFuZCIsIkV5ZVJldHVybiBNYXJrZXRpbmciLCJFeWVWaWV3IEluYy4iLCJFeWVWaWV3LCBJbmMiLCJFeWV3b25kZXIgSW5jLiIsIk1MQiBBZHZhbmNlZCBNZWRpYSwgTC5QLiIsIkZhY2lsaXRhdGUgRm9yIEFnZW5jaWVzIChGRkEpIiwiRmxhc2h0YWxraW5nIiwiSG9zdGVsd29ybGQuY29tIExpbWl0ZWQiLCJLbm9yZXggUHRlLiBMdGQuIiwiRmxpdGUgSW5jLiIsIkZvcmJlcyBNZWRpYSBMTEMiLCJTY2VuZSBTdGVhbGVyIEx0ZC4iLCJGcmVha091dCBJbmMuIiwiRnJlZVdoZWVsIiwiRnJpbmdlODEgSW5jLiIsIkZyaW5nZTgxIC0gSUJWIiwiRnVzZUJveCBJbmMuIiwiZ2VtaXVzRGlyZWN0RWZmZWN0KyIsIkFkT2NlYW4gTHRkIiwiSW50b21hcnQgR2ZLIChHZksgRGFwaG5lKSIsIkdpZ3lhIiwiR2xvYmFsIE1hcmtldCBJbnNpdGUgSW5jLiIsIkRvdWJsZUNsaWNrIENhbXBhaWduIE1hbmFnZXIiLCJEb3VibGVDbGljayBCaWRkZXIgUGlsb3QgZm9yIE5ldHdvcmtzIiwiRG91YmxlQ2xpY2sgZm9yIFB1Ymxpc2hlcnMgUHJlbWl1bSIsIkdyb292aW5BZHMiLCJSZWRkaW9uIiwiSFEgR21iSCIsIlBlcmZvcm1hbmNlIERpc3BsYXkgQWR2ZXJ0aXNpbmciLCJBdmF6dSBJbmMuIiwiQWVyaWZ5IE1lZGlhIiwiSUNsaWNrIEludGVyYWN0aXZlIEx0ZC4iLCJpQ3Jvc3NpbmciLCJJbXBhY3QgRW5naW5lIEluYy4iLCJJbmFkY28gSW5jLiIsIklubml0eSBTaW5nYXBvcmUgUHRlIEx0ZC4iLCJJbnNpZ2h0IEV4cHJlc3MgKENyb3NzIE1lZGlhIC0gSWduaXRlKSIsImludGVsbGlBZCBNZWRpYSBHbWJIIiwiRGVQYXVsaSBBRyIsIkludGVsbGlhZCIsIkdlbm9tZSIsIkludGVyZ2kgTExDIGRiYSBQbGF5d2lyZU1lZGlhIiwiSW50ZXJtdW5kbyBNZWRpYSBMTEMiLCJJbnRlcnBvbGxzIiwiSW50ZWxsaWdlbnQgUmVhY2ggKEludHVpdGl2ZSBTZWFyY2ggVGVjaG5vbG9naWVzKSIsIklQT05XRUIgTGltaXRlZCIsIkphc3BlckxhYnMgSW5jLiIsIkppdm94IENvcnBvcmF0aW9uIiwiSm9pbnZpbGxlIEFCIiwiS2xpS0tpY29tIE95IiwiS29tbGkgTWVkaWEgSW5jLiIsIktvbmlua2xpamtlIEx1Y2h0dmFhcnQgTWFhdHNjaGFwcGlqIE4uVi4iLCJKLkQuIFBvd2VyIE8yTyIsIkt3YW56b28gSW5jLiIsIkxlZ29sYXMgTWVkaWEgSW5jLiIsIlVuZGVydG9uZSBBZCBTeXN0ZW0gKFVBUykiLCJMRVZFTCBTdHVkaW9zIiwiTGlua2VkSW4gQ29ycG9yYXRpb24iLCJDb250ZW50IERpcmVjdGlvbnMsIEluYy4gZGJhIExpbmtzdG9ybSIsIkxpdmVyYWlsIEluYy4iLCJMb3RhbWUgU29sdXRpb25zIEluYy4iLCJMdWNpZE1lZGlhIE5ldHdvcmtzIEluYy4iLCJNYWduZXRpYyBNZWRpYSBPbmxpbmUgSW5jLiIsIk1hdGUxLmNvbSIsIk1heFBvaW50IEludGVyYWN0aXZlIEluYy4iLCJNZWRpYSBBcm1vciBJbmMuIiwiWGF4aXMsIEluYyIsIkRzdGlsbGVyeSIsIlJha3V0ZW4gTWVkaWFGb3JnZSIsIlNpem1layIsIk1lZGlhTWluZCIsIlBheXBhbCIsIlpFRE8gSW5jLiIsIkNvbnRvYm94IiwiTWVsdCBUZWNub2xvZ2lhIGUgSW5mb3JtYXRpY2EgUy5BIiwiTWVNbzIgLyBIb3R0cmFmZmljIiwiRE1BIEluc3RpdHV0ZSBkYmEgSG90dHJhZmZpYyIsIk1lcmNhZG8gTGl2cmUuY29tIEF0aXZpZGFkZXMgZGUgSW50ZXJuZXQgTHRkYSIsIk1lcmNoZW50YSBMaW1pdGVkIiwiTWV0YXBlb3BsZSBHbWJIIiwiTWV0cml4TGFiIEIuVi4iLCJNaXhwbyBJbmMuIiwiTW9uc29vbiBBZHMgUHZ0LiBMdGQuIiwiTW9uc3RlciIsIm5lY2tlcm1hbm4uZGUgR21iSCIsIkFkLmFnaW8iLCJOZXRtaW5pbmcgTExDIiwiQWRvVHViZSIsIk5leHQgQXVkaWVuY2UgR21iSCIsIk5leHRwZXJmIiwiQ2FsaWJleCIsIlZpemlBZHMgZm9yIEFkdmVydGlzZXJzIiwiRmluYW5jZUdlbmVyYXRvciIsIlRlbHN0cmEgQ29ycG9yYXRpb24iLCJUaGUgT25saW5lIFJlc2VhcmNoIFVuaXQiLCJXZWJsaW5nIFB0eSBMdGQiLCJMYXNvbyBQdHkgTHRkIiwiU2FsZWZpbmRlciBMdGQuIiwiVGhlIE1vbmtleXMgUHR5IEx0ZCIsIkxvdWRlciBEaWdpdGFsIFB0eSBMdGQiLCJQdWJsaXNoZXLigJlzwqBJbnRlcm5hdGlvbmFsZcKgUHR5wqBMdGQiLCJOb3dTcG90cyIsIk9jYXBpIiwiUHJlZGljdGEiLCJDb211bmUgU0EiLCJFdXJvQWRzIEdyb3VwIEEvUyIsIkhvdHdvcmRzIEluZm9ybWHDp8OjbyBMVERBIiwidU1vdGlvbiIsIkdvb2dsZSBab28iLCJBdWRpZW5jZSBNYW5hZ2VyIiwiT05EQ1AiLCJPcGVuWCBPblJhbXAiLCJPcGVuWCBBZCBTZXJ2ZXIiLCJQYXJzaGlwIiwicGF1bGRpcmVrdCBHbWJIIiwiUGljdGVsYSBJbmMuIiwiUGlsb3QgMS8wIEdtYkggJiBDbyBLRyIsIlBpeGltZWRpYSIsIlBvaW50cm9sbCIsIkJlaWppbmcgUGluWW91IEludGVyYWN0aXZlIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kiLCJZb1lpIEludGVyYWN0aXZlIiwiQWRNYXN0ZXIiLCJELkEuQ29uc29ydGl1bSBCZWlqaW5nIChQbGF0Zm9ybSBPbmUgQ2hpbmEpIiwiTmV3IEFsbHllcyBJbmZvcm1hdGlvbiBUZWNobm9sb2d5ICh3aW5tYXgpIiwiUHVycG9zZUxhYiIsIlByb2NsaXZpdHkgU3lzdGVtcyIsIlZpZXdiaXgiLCJRdWFudGNhc3QgSW5jLiIsIlF1aW5TdHJlZXQiLCJRdWlzbWEgR21iSCIsIlF1aXNtYXRjaCAvIFF1aXNtYSBUcmFja2VyIiwiUXdvYmwgSW5jLiIsIlJhZGl1bU9uZSBJbmMuIiwiQ29yZSBBdWRpZW5jZSwgSW5jIiwiVGhlIFJlYWNoIEdyb3VwIiwicmV2ZW51ZSBjbG91ZCIsIlJlZ2lzdGVyLml0IiwiUmVsZVN0YXIiLCJSZXNlYXJjaCBIb3Jpem9ucyBMTEMgZGJhIFBob2VuaXggTWFya2V0aW5nIiwiUmV0ZW50aW9uIE1lZGlhIEluYy4iLCJTdWl0ZSA2NiIsIkR5bmFtaWMgTG9naWMgLyBTYWZlY291bnQgKEFkSW5kZXgpIiwiQnJpZGdlVHJhY2siLCJhZG5hbm55LmNvbSBHbWJIIiwiQWRSb2xsIiwiQWRFeHRlbnQiLCJTaGFyZVRoaXMgSW5jLiIsIlNoaXJ0aW5hdG9yIiwiU2ltcGxpZmkgSG9sZGluZ3MgSW5jLiIsIkNlbnRybyBEU1AiLCJTbWFydCBBZHNlcnZlciIsInNtYXJ0Y2xpcCBIb2xkaW5nIEFHIiwiU25hcCBUZWNobm9sb2dpZXMgSW5jLiIsIlNvLW5ldCBNZWRpYSBOZXR3b3JrcyIsIlNvY2lhbE1lZGlhLmNvbSIsIkNvbnRlbnQgdG8gRW1vdGlvbiAoQ1RFKSIsIlNvY2lvbWFudGljLmNvbSIsIkFkU3BlZWQiLCJTb3BodXMzIiwiU3BlY2lmaWMgTWVkaWEgSW5jLiIsIk1ldHJpZ28gR21iSCIsIlNwb25nZUNlbGwiLCJTcG5nZUNlbGwgTExDIiwiU3BvdFhjaGFuZ2UiLCJTcG90eGNoYW5nZSIsIkVuY29yZSBBdHRyaWJ1dGlvbiBQbGF0Zm9ybSIsIlN0ZWVsaG91c2UiLCJTdHJpa2UgTmV3IE1lZGlhIExpbWl0ZWQiLCJTdHJ1cSBMaW1pdGVkIiwiU3VuZGF5U2t5IEluYy4iLCJTeW1waG9ueSBBZHZhbmNlZCBNZWRpYSIsIlRhZ01hbiBMdGQuIiwiVGFvYmFvIiwiVGFyZ2V0LmNvbSIsIlRlYWRtYSIsIkJhbm5lckNvbm5lY3QgQlYiLCJUZXJhY2VudCBDb3Jwb3JhdGlvbiIsIlRoZSBUcmF2ZWxlcnMgSW5kZW1uaXR5IENvbXBhbnkiLCJWaWRlb2xvZ3kiLCJUTlMgQ3VzdG9tIFJlc2VhcmNoIEluYy4iLCJUcmFja2luZ1NvZnQgTExDIiwiVHJhZGVkb3VibGVyIiwiRXBpYyBNYXJrZXRwbGFjZSIsIlRyaWJhbCBGdXNpb24iLCJUcmlnZ2l0IiwiVHJ1ZSBVbHRpbWF0ZSBTdGFuZGFyZHMgRXZlcnl3aGVyZSBJbmMuIiwiQ2FyTWF4IEJ1c2luZXNzIFNlcnZpY2VzIExMQyIsIkNoYXJ0ZXIgQ29tbXVuaWNhdGlvbnMiLCJHZW5lcmFsIE51dHJpdGlvbiBDZW50ZXJzIEluYy4iLCJIYW1pbHRvbiBCZWFjaCIsIkphY3F1aWVMYXdzb24uY29tIiwiVHJ1RWZmZWN0IiwiQW1lcmljYW4gR3JlZXRpbmdzIiwiQmx1ZU1vdW50YWluIiwiQ2FyZHN0b3JlIiwiQ2hlbWlzdHJ5LmNvbSIsIkRvbmFsZCBKIFBsaW5lciIsIkdldmFsaWEiLCJHU0kgTWVkaWEiLCJNYXRjaC5jb20iLCJPcHRpbXVtIFJlc3BvbnNlIiwiT3JlY2siLCJUYXNzaW1vIiwidVN3aXRjaCIsIlR1YmVNb2d1bCBJbmMuIiwiVHVtcmkiLCJpTWFya2VyIiwiVHVybiBJbmMuIiwiVHdlbHZlZm9sZCBNZWRpYSIsIlR5bnQiLCJVbmljYSBhbiBJQk0gQ29tcGFueSIsIlVuaWNhc3QiLCJVbmlRbGljayIsIlVuaXRlZCBWaXJ0dWFsaXRpZXMiLCJWaWRlb0h1YiIsIlZpc2libGUgTWVhc3VyZXMgQ29ycC4iLCJWaXp1cnkgSW50ZXJhY3RpdmUgU29sdXRpb25zIFB2dC4gTHRkLiIsIk1hcmtpdCBPbiBEZW1hbmQgKEFkaGVzaW9uKSIsIldlYk1ldHJvIEluYyIsIldlYm9yYW1hIENhbXBhaWduIE1hbmFnZXIgKGZvcm1lciBuYW1lIEFkUGVyZikiLCJXZWJvcmFtYSBDYW1wYWlnbiBNYW5hZ2VyIiwiU2hvcHBpbmcgTmV0d29yayIsIlNoYW5naGFpIFdpc2VNZWRpYSBUZWNobm9sb2d5IENvLiBMdGQuIiwiWEEubmV0IiwiWGF4aXMgTExDIiwiTmV0IEVkZ2UiLCJYcGx1c29uZSBTb2x1dGlvbnMgSW5jLiIsIllhaG9vISBBZCBFeGNoYW5nZSIsIllhaG9vIEFkIE1hbmFnZXIgUGx1cyIsIkFQVCBmcm9tIFlhaG9vISIsIllpZWxkciIsIll1TWUgSW5jLiIsIkVidXp6aW5nIiwiWmlmZiBEYXZpcyIsIkRhdGFQb2ludCBNZWRpYSBJbmMuIiwiU2ltcGx5dGljcyBMaW1pdGVkIiwiTWFrYXppIiwiUmljaCBSZWxldmFuY2UiLCJNYWluQURWIiwiTWVkaWFWIEFkdmVydGlzaW5nIiwiTWljcm9BZCBJbmMuIiwiUGxhdGZvcm0gSUQgSW5jLiIsIlhyb3N0IiwiU29jaW9jYXN0IE5ldHdvcmtzIExMQyBEL0IvQSBWZWxvcyIsIlRyZW5kIFJlc2VhcmNoIiwiQmxhY2sgU3dhbiBWZXJpZmljYXRpb24iLCJNb21lbnR1bSBLLksiLCJCZXRnZW5pdXMgTGltaXRlZCIsIkFUIEludGVybmV0IiwiRGF0YUxhYiIsIklubm92aWQgSW5jLiIsIkFkYWNhZG8iLCJOZXRETkEsIExMQyIsIlBpcGV3YXZlIEluYy4iLCJVUyBNZWRpYSBDb25zdWx0aW5nIiwiU0tZVE9VQ0ggVEVDSE5PTE9HWSBDTy4sIExJTUlURUQiLCJIYW5lc2JyYW5kcyBEaXJlY3QgTExDIiwiQTFwbGF0Zm9ybSIsIkFnZW5jeS5jb20iLCJBZGFwLnR2IEluYy4gKEFkV29yZHMvWW91VHViZSkiLCJGam9yZCBUZWNobm9sb2dpZXMgUy5BLlMuIiwiUmVmaW5lZCBBZHMiLCJudWdnLmFkIEFHIiwiTWlhb3poZW4gU3lzdGVtcyIsIk1lZXRyaWNzIEdtYkgiLCJNZWV0cmljcyIsIkRpZ2l0YWwgQ29udHJvbCBHbWJIICYgQ28uIEtHIiwiRGVkaWNhdGVkIE1lZGlhIiwiQWNjdWVuIiwiUHVsc2UgMzYwLCBJbmMuIiwiWkFOT1ggQUciLCJXZWJnYWlucyBMdGQiLCJWaXJnaW4gTWVkaWEgTGltaXRlZCIsIk15QnV5cyBNeUFkcyIsIlZDQ1AgU2VhcmNoIExURCIsIkNvbnZlcnNhbnQgTWVkaWEiLCJVcC1WYWx1ZSBHbWJIICYgQ28uIEtHIiwiVW5ydWx5IE1lZGlhIiwiVW5kZXJkb2cgTWVkaWEgTExDIiwiU1ZHIE1lZGlhIFB2dC4gTHRkLiIsIlRSQUZGSVEgTExDIiwiVGVsbEFwYXJ0IEluYy4iLCJTaG9wemlsbGEgSW5jLiIsIlJlYWN0aXZwdWIiLCJOZXRzZWVyIEluYy4iLCJlQmF5IEVudGVycHJpc2UiLCJHb29kd2F5IEdyb3VwIiwiRG91YmxlIFBvc2l0aXZlIE1hcmtldGluZyBHcm91cCBJbmMuIiwiQ2hpdGlrYSBJbmMuIiwiU2NpZ2luZWVyIEluYy4iLCJTYWxlcyBTcGlkZXIgSW5jLiIsIlJvY2tldCBGdWVsIEluYy4iLCJSVEJsYWIiLCJhYmlsaWNvbSBHbWJIIiwiUHVscG8gTWVkaWEgSW5jIiwiT25lU3BvdCIsIk15VGhpbmdzIFVLIEx0ZCIsIkV4YWN0YWciLCJLeW9jZXJhIENvbW11bmljYXRpb24gU3lzdGVtcyBDby4gTHRkLiIsIkJlaWppbmcgTGFuZ1Rhb0ppbiBJbnRlcmFjdGl2ZSIsIkNvbnZlcnNhbnQgTW9iaWxlIE1lZGlhIiwiTU0xWC5ubCIsIlRyaXZ1IE1lZGlhIEluYy4iLCJCbHVlQ2F2YSBJbmMuIiwiQmVpamluZyBHcmlkc3VtIFRlY2hub2xvZ3kgQ28uIEx0ZC4iLCJBZHN2YW5hIERTUCIsIlRhcmdldCBQZXJmb3JtYW5jZSIsIkNvbnRlbnQgU3ByZWFkIiwiRGF0YW1pbmQgRWZmZWN0aXZlIE1lZGlhIiwiU2NhbGVPdXQgSW5jLiIsIkVuc2lnaHRlbiIsIlNvbnkgRWxlY3Ryb25pY3MgSW5jLiIsIkdyYXZpdHkgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IExURCIsIlByb2plY3QgU3VuQmxvY2siLCJOb3ZlbSBzcC4geiBvLm8uIiwiRWNvbmRhIEdtYkgiLCJBZE1heGltIExMQyIsIkFsbGlhbmNlIEhlYWx0aCBOZXR3b3JrcyIsIkFkc2FtZSBBZHZlcnRpc2luZyBDby4sIEx0ZCIsIkd1YW5nemhvdSBTaHVuZmVpIEluZm9tYXRpb24gVGVjaG5vbG9neSBDb3Jwb3JhdGlvIiwiUEsgT25saW5lIFZlbnR1cmVzIExpbWl0ZWQiLCJCaWdwb2ludCBHbWJoIiwiTWlyYXBvZG8gR21iSCIsIkRpZ2l0aXplIE5ldyBNZWRpYSBMdGQuIiwiQWRTYWdlIiwiRmluZ2VyZWFjaCIsIkNhbHZpbiBLbGVpbiIsIk1lZGlhbGV0cyBTZXJ2byIsIldlYm1vYmxpbmsgSW5jLiIsIk1vYXQgSW5jLiIsIkJhbm5lcmZsb3cgQUIiLCJCYXRjaCBNZWRpYSBHbWJoIiwiVHdlbmdhIiwiVHJhY2VBZCIsIlNwZWVkIFNoaWZ0IE1lZGlhIiwiQ0NCIFBhcmlzIiwiTmllbHNlbiBEaWdpdGFsIEFkIFJhdGluZ3MiLCJPcGVuRFNQIiwiQmVpamluZyBOZXRFYXNlIFlvdURhbyBDb21wdXRlciBTeXN0ZW0gQ28uLCBMdGQuIiwiTWVkaWFyaXRobWljcyIsIlJVTiwgSU5DLiIsIlNoYW5naGFpIE1lbmxvIE5ldHdvcmsgVGVjaG5vbG9naWVzIENvLixMdGQiLCJCZWlqaW5nIE9hc2lzIFRlY2hub2xvZ3kgQ28uIEx0ZCAoTWpveXMpIiwiTkVULU1ldHJpeC1BdWRpdCIsIk5ldyBBbGx5ZXMgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAoUXVhbnRvbmUpIiwiUmVzb25hdGUgTmV0d29ya3MsIEluYyIsIlRyaXBsZSBMaWZ0LCBJbmMuIiwiSW5kaWUgQWRzIiwiT2NlYW4gUGFyayBJbnRlcmFjdGl2ZSIsIkltcHVsc2UgTWVkaWEgUHZ0LiBMdGQuIiwiQ3Jvd2RUd2lzdCIsIkFkemVyayBJbmMuIiwiQWR0YXJnZXQubWUiLCJSZWNydWl0IE1hcmtldGluZyBQYXJ0bmVycyBDby4sTHRkIiwiQmVpamluZyBFbWFyIE9ubGluZSBUZWNobm9sb2d5IENvLixMdGQiLCJBZE1hZ25ldCIsIk1vbW9uZG8gQS9TIiwiREtLIEFnZW5jeSIsIk9uZVNjcmVlbiBJbmMuIiwiQWRFbGVtZW50IE1lZGlhIFNvbHV0aW9ucyBQdnQgTHRkIiwiQmVpamluZyBTaGVuZyBKaW4gTGFuIEFkdmVydGlzaW5nIENvLiwgTHRkLiIsIkFkc2l0IE1lZGlhIEFkdmVydGlzaW5nIEx0ZC4gQ28uLCAoQWRNYW4pIiwiQWRNYW4iLCJNaWNyb0FkIEluYy4gKENoaW5hKSIsIkFkZm9uaWMiLCJPd25lcklRIEluYy4iLCJNb2JpbGUgU3BhY2UgTHRkIiwiSmFkdWRhIEdtYkgiLCJPbW90ZW5hc2hpIEJhbm5lciIsIkluZmVjdGlvdXMgTWVkaWEgTHRkLiIsIk9uZTk3IENvbW11bmljYXRpb25zIExpbWl0ZWQgKEFkIFdvcmtzKSIsIldhbGsgTGlnaHQgTWVkaWEgSW5jLiIsIkFkQnJpdGUgSW5jLiIsIkhpLU1lZGlhIiwiQWRsYWJzIiwiQXJ0aCBTYWx1dGlvbnMiLCJLb252ZXJ0YSIsIlNob3BhbGwiLCJ0YXJnZXRpbmczNjAgR21iSCIsInhwbG9zaW9uIGludGVyYWN0aXZlIEdtYkgiLCJIdWJydXMgTExDIiwiSGVyZSBNZWRpYSBJbmMuIiwiU2lsdmVyIEVnZyBUZWNobm9sb2d5IENvLiwgTHRkLiIsIlF1YXJ0aWNPbi5jb20iLCJLYXZhbmdhIExMQyIsIlZvZGFmb25lIEQyIEdtYkgiLCJRdWJpdCBEaWdpdGFsIEx0ZCIsIk5FT1JZIEdtYkgiLCJQb3B1bGlzIElyZWxhbmQgTGltaXRlZCIsIkxpcXVpZE0gVGVjaG5vbG9neSBHbWJIIiwiQ2VsdHJhIEluYy4iLCJBZGZveCIsIkFjY29yZGFudCBNZWRpYSBMTEMiLCJGaWtzdSBEU1AiLCJNZG90TSwgSW5jLiIsIlROUyBHQUxMVVAgQURGQUNULCBaQU8iLCJNaWNyb0FkIEluYy4gKEFQQUMpIiwiRUNSSVRFTCBTQVJMIiwiR2xvdG8gQ29ycC4iLCJPT08gR1BNLURpZ2l0YWwiLCJhZHZlcnNlcnZlIGRpZ2l0YWwgYWR2ZXJ0aXNpbmcgc2VydmljZXMiLCJBYnN0cmFjdCIsIkFkc2NhbGUgR21iSCIsIldlZWJseSwgSW5jLiIsIktQSSBTb2x1dGlvbnMgQ28uLEx0ZC4iLCJMdWNreUJyYW5kLmNvbSIsIkJlZHJpanZlbndlYi5ubCIsIkVkZ2VDYXN0IE5ldHdvcmtzIEluYy4iLCJBZEZyb250aWVyIiwiTkZRIiwiRGF0YUxvZ2l4LCBJbmMuIiwiQnJpZ2h0Y292ZSIsIkV4cGVyaWFuIiwiRGlzcXVzIiwiTmFtZWNoZWFwLmNvbSIsIlBvbGxkYWRkeSIsIk91dGJyYWluIEluYy4iLCJMaWppdCBOZXR3b3JrcywgSW5jLiIsIlB1Yk1hdGljIiwiU2F5IE1lZGlhIEluYy4iLCJSdWJpY29uIFByb2plY3QgVHVyaW5nLCBJbmMuIChTU1ApIiwiUnViaWNvbiBQcm9qZWN0IEVkaXNvbiwgSW5jLiAoRFNQKSIsIldvcmRwcmVzcyBTdGF0cyIsIlR3aXR0ZXIiLCJZYW5kZXggTExDIiwiUnV0YXJnZXQgLyBTZWdtZW50byIsIkFkZG9vciBMYXRpbk1hcmtldHMsIFNMIiwiS2F0ZSBTcGFkZSIsIlRBUkdVU2luZm8iLCJBZGJsYWRlIiwiQWRpYW50IiwiQWRkVG9BbnkiLCJCaXpvIEluYyIsIkdvb2dsZSBBbmFseXRpY3MiLCJHcmF2YXRhciIsIk1lZGlhR2x1IiwiVGFwc3RyZWFtIE5ldHdvcmsgSW5jLiIsIkhVTlQgTW9iaWxlIEFkcyIsIkFwc2FsYXIsIEluYy4iLCJWaWRlb2xvZ3kgRFNQIiwiVmlkZW9zdHJpcCIsIkFmZmluaXR5IOKAkyBIb3N0d2F5IENvcnBvcmF0aW9uIiwiVGFwdGljYSIsIkxpdmVSYW1wLCBJbmMuIiwiUGxpc3RhIEdtYkgiLCJOZXRxdWVzdCBBZCBUcmFja2luZyIsIk1lZGlhc21hcnQgTW9iaWxlIFMuTC4iLCJOZXRzaGVsdGVyIFRlY2hub2xvZ3kgTWVkaWEsIEluYy4iLCJNaXhtYXJrZXQgQWZmaWxpYXRlIE5ldHdvcmsiLCJUdXJib2J5dGVzIiwiVm9vZG9vIFZpZGVvIEFHIiwiR29vZ2xlIENETiIsIkZ1bGwgUGVyZm9ybWFuY2UiLCJlWGVsYXRlIEluYy4iLCJPcmVjayBDYW5hZGEiLCJCZWlqaW5nIFd1U2h1YW5nIFRlY2hub2xvZ3kgTHRkLiAoQUdyYW50KSIsIk1hdG9teSBNZWRpYSIsIk1haWwuUnUgR3JvdXAiLCJMU2kgLSBMaW9uc29mdCBTdHVkaW9zLCBzcG9sLiBzIHIuby4iLCJBZGVscGhpYyBJbmMuIiwiTGluY29sbiBUZWNobmljYWwgSW5zdGl0dXRlLCBJbmMuIiwiU21hcnRzdHJlYW0udHYiLCJSZWtsYW1wb3J0IiwiRmF0dGV4dCBMTEMgKERCQSBNb29sYWggTWVkaWEpIiwiTW9HbyBNYXJrZXRpbmcgJiBNZWRpYSBJbmMuIiwiU0EgTWVkaWEsIGxsYyIsIkJhcm9ucyBNZWRpYSBMTEMiLCJhcHBydXB0IEdtYkgiLCJQcm9wZWxsZXJBRHMgbWVkaWEgTHRkIiwiQ0ogQWZmaWxpYXRlIGJ5IENvbnZlcnNhbnQiLCJNaWxsZW5uaWFsIE1lZGlhIEluYyIsIkJFSUpJTkcgQkVIRSBTQ0lFTkNFICYgVEVDSE5PTE9HWSBDby4sIEx0ZCIsIk1hbmFnZS5jb20gR3JvdXAsIEluYy4iLCJNQVNTTU9USU9OTUVESUEgU0FSTCIsIkJyYWlud29ya3MgU3AuIHouby5vLiIsIk1lZGlhIEludGVsbGlnZW5jZSBQbGF0Zm9ybSAoQWdncmVnYXRlIEtub3dsZWRnZSkiLCJTNE0iLCJTb2JtYWcgTFREIiwiTmV0Ym9vc3RlciIsIk11c2lraGF1cyBUaG9tYW5uIGUuSy4iLCJUcm92aXQiLCJPMm9ubGluZSIsIkUtUGx1cyBNb2JpbGZ1bmsgR21iSCAmIENvLiBLRyIsIk1ldGVvcmEiLCJNYWRpc29uIExvZ2ljLCBJbmMuIiwi5LiH55u4RFNQKElaUCBUZWNobm9sb2dpZXMpIiwicmlnaFRhcmdldCIsImUuUVEuY29tIiwiU2hlbiBaaGVuIFNoaUppIEthaVh1YW4gVGVjaG5vbG9neSBDb21wYW55IEx0ZC4iLCJCYW5uZXJjb2NrcGl0IiwiT3V0cmlnZ2VyIE1lZGlhIEluYy4iLCJzaG9wTG9jYWwiLCJJbXBhY3QgUmFkaXVzIiwiVW5pc3RlciBBZFNlcnZlciIsIlVuaXN0ZXIgTWVkaWEgR21iSCIsIlRMViBNZWRpYSBPbmxpbmUgTHRkIiwiZDNtZWRpYSBBRyIsIklubm92YXRpdmUgTWV0cmljcyIsIkF0aGVuYUhlYWx0aCIsIlRBUFZBTFVFIFNBUyIsIk1ldGVvciBXb3JsZHdpZGUgTExDLiIsIkF1ZGllbmNlMk1lZGlhIExpbWl0ZWQiLCJIUkIgRGlnaXRhbCBMTEMuIiwiIU5PT0IiLCJPU1Ygb25saW5lIiwiQWRkcm9pZOKEoiIsIkFkQWNjZXNzIiwiWWFidWthIE1lZGlhLCBJbmMuIiwiQnJpZGdld2VsbCBJbmNvcnBvcmF0ZWQiLCJCaWR0aGVhdHJlIEFCIiwiQWRNb21lbnQiLCJVREcgTcO8bmNoZW4gR21iSCIsIlBpeGFsYXRlLCBJbmMuIiwiSW5Nb2JpIEluYy4iLCJDcmlzcCBNZWRpYSBJbmMuIiwiQ2hvb3psZSwgSW5jLiIsIlRhcGFkIiwiUmVhY2hMb2NhbCwgSW5jIiwiT3BlblggQWQgRXhjaGFuZ2UiLCJPcGVuWCIsIlBsYWNlc3RlciwgSW5jLiIsIlNwaWNld29ya3MsIEluYyIsIldhcFN0YXJ0IiwiQW1iZXJjcm93IChFcGF5bWVudHMpIiwiQXVkaWVuY2V2YWx1ZSBQdGUgTHRkIiwiVU5JVEVELiBJbmMuIiwiVW5pdGVkIEJ5cGFzcyBUZWNoIiwiU0FTIE5hb3BsYXkiLCJDdXJpb3NpdHlTdHJlYW0iLCJBbGxpYW5jZSBJbnRlcm5ldCAobnRyZWUpIiwiQ2VudHJhbHRhZyIsImVUYXJnZXRpbmciLCJXYWxtYXJ0IEluYyIsIldhbG1hcnQuY29tIiwiRXh0cmVtZSBSZWFjaCwgSW5jLiIsIkV4dHJlbWUgUmVhY2ggRGlnaXRhbCAoRVIgRGlnaXRhbCkiLCJOZXRmbGl4IiwiTmV0ZmxpeCwgSW5jLiIsIlNjYXJhYiBQZXJzb25hbGl6ZWQgQWRzIiwiQ3Jvd2RNb2IgSW5jLiIsIkdydXZpIEx0ZC4iLCJNYWNyb21pbGwsIEluYy4iLCJOaWVsc2VuIChDcm9zcyBQbGF0Zm9ybSBCcmFuZCBFZmZlY3QgW0lBRy9UVkJFXSkiLCJHZXRJbnRlbnQiLCJCZWxib29uIiwiT3pvbmUgTWVkaWEgU29sdXRpb25zIFB2dCBMdGQiLCJIaW5kdXN0YW4gVGltZXMgTW9iaWxlIFNvbHV0aW9ucyBMaW1pdGVkIiwiU29mdExheWVyIFRlY2hub2xvZ2llcywgSW5jLiIsIkdvbGRTcG90IE1lZGlhIiwiWmVldG8gTWVkaWEiLCJEWU5BRE1JQyBTQVMiLCJZb2MgTW9iaWxlIEFkdmVydGlzaW5nIEdtYkgiLCJWZWx0aSIsIkxvY2tvbiIsIlJlY3J1aXQgQ28uLCBMdGQuIENvbW11bmljYXRpb25zIiwiUkVDUlVJVCBDb21tdW5pY2F0aW9ucyIsIkhhdGVuYSBDby4sIEx0ZCIsIlRyYWZtYWciLCJQYWdld29vIiwiQWRuZXQgTWVkaWEiLCJMaWdhdHVzIEdtYkgiLCJXZWJ0cmVrayBHbWJIIiwiS2FudGFyIFdvcmxkIFBhbmVsIiwiUHViU3F1YXJlZCBMTEMiLCJCYWlkdS5jb20gVGltZXMgVGVjaG5vbG9neSAoQmVpamluZykgQ28uLCBMdGQiLCJ0cmF2ZWwgYXVkaWVuY2UgR21iSCIsIktydXggRGlnaXRhbCwgSW5jLiIsIlRoZSBXZWF0aGVyIENoYW5uZWwiLCJTb2NpYWwgUXVhbnR1bSIsIkFkVmVudG9yaSBTQVMiLCJNaW5kVGFrZSBSZXNlYXJjaCBHbWJIIiwiTGVnZXIgTWFya2V0aW5nIiwiQmxpc01lZGlhIExpbWl0ZWQiLCJEb3VibGU2IiwiVFJBREVBRFMgSU5URVJBQ1RJVkUiLCJFcGlncmFtcywgSW5jLiIsIkFjdGl2ZWNvcmUgSW5jLiIsIkFjdGl2ZWNvcmUsSW5jLiIsIkFEQ0FTSCIsIlZpZGVvcGxhemEiLCJUYXJnZXRpeCBMTEMiLCJBZHJpdmVyIExMQyIsIkJlc28iLCJWb29wdGVyLmNvbSIsIkhvc3RiYXNrZXQiLCJSb2xsYWQiLCJoZHRNZWRpYSIsIkRYUCBNZWRpYSIsImVidWlsZGVycyBCViIsIkNPQURWRVJUSVNFIiwiQmxpenphcmQiLCJBZGdpYmJvbiIsIldpZGVyIFBsYW5ldCwgSW5jLiIsIlJlc3BvbnNpdmVBZHMsIEluYyIsIkR1ZXB1bnRvemVybyBSZXNlYXJjaCBTUkwiLCJBZE1vdmF0ZSwgSW5jLiIsImdvLnBsIiwiQXBwTG92aW4gQ29ycG9yYXRpb24iLCJ0d2VudHlzaXggbHRkIiwiRXBzaWxvbiBJbnRlcm5hdGlvbmFsIFNBIiwiWmViZXN0b2YiLCJTT0wgVVREIEJlbmVsdXggQlYiLCJNLFAsTkVXTUVESUEsIEdtYkgiLCJNZWRpYUNyb3NzaW5nIEluYy4iLCJNQlIgVGFyZ2V0aW5nIEdtYmgiLCJWaXZhS2kiLCJBZmZpbGlhdGUgV2luZG93IiwiVHViZU1vZ3VsIEluYy4gKEFkV29yZHMvWW91VHViZSkiLCJXYXkydHJhZmZpYyBQb2xza2EgUy5BLiIsIlROUyBTaWZvIEFCIiwiM3hjaGFuZ2UvSHVua2FsIiwiRW1lcnNlIFN2ZXJpZ2UgQUIiLCJTb2tubyBNZWRpYSIsIkJsYWNraGVhcnQsIGEgZGl2aXNpb24gb2YgSG90IFRvcGljLCBJbmMuIiwiVG9ycmlkIiwiSG90IFRvcGljLCBJbmMuIiwiV2ViSHVlIExMQyIsIkNvbnRlbnQgdG8gRW1vdGlvbiIsIkFkbWFuIEludGVyYWN0aXZlIFNMIiwiQXVkaWVuY2VGVUVMLCBJbmMuIiwiVGFwQ29tbWVyY2UgTExDIiwiQWRUaGVvcmVudCwgSW5jLiIsIkFkVGhlb3JlbnQsIEluYyIsIkJhcm9tZXRyaWMiLCJDcm9zc0luc3RhbGwsIEluYyIsIlRoZW9yZW0gSW5jLiIsIktleVZlcnNpb24iLCJBbmNlc3RyeSIsIlNoYW5naGFpIExpamluZyBBZHZlcnRpc2luZyBDby4sIEx0ZC4iLCJTaGFuZ2hhaSBMaWppbmcgQWR2ZXJ0aXNpbmcgQ28uLCBMdGQiLCJLaXNzTm9Gcm9nLmNvbSIsIkRpZ2lFUSIsIk1vYmlsZSBQcm9mZXNzaW5hbHMgQlYiLCJEZWNpc2l2ZSwgSW5jLiIsIlR1bWksIEluYy4gVVMiLCJUdW1pLCBJbmMuIFVLIiwiVHVtaSwgSW5jLiBERSIsIk5hbmlnYW5zLCBJbmMiLCJBZFNuaXBlciBMTEMiLCJGYWJyaWMgV29ybGR3aWRlIEluYyIsIlZvcndlcmsgRGV1dHNjaGxhbmQgU3RpZnR1bmcgJiBDby4gS0ciLCJDaGljbyBEaXN0cmlidXRpb24gU2VydmljZXMsIExMQyIsIjEyTW5reXMgR21iSCIsIlNwYWN5eiwgSW5jLiIsIk1CdXksIEluYy4iLCJGdWxsU3BlZWQgSW5jLiIsIk1hZGhvdXNlIENvLiBMaW1pdGVkIChPcHRpTWFkKSIsIk5hbm8gSW50ZXJhY3RpdmUgLyBBdWRpZW5jZW1hbmFnZXIiLCJPbW5pYnVzIGNvLiBMdGQiLCJPbW5pYnVzIGNvLiBMdGQuIiwiRWR1Y2F0aW9uIE1hbmFnZW1lbnQgQ29ycG9yYXRpb24iLCJTY3JlZW42IChzNi5pbykiLCJMSU5LIE1hcmtldGluZyBTZXJ2aWNlcyBBRyIsIlRpcUlRIiwiSWJpYm8gR3JvdXAgUHJpdmF0ZSBMaW1pdGVkIiwianVzdEFkIFRWIExURCIsIkFwcGllciBJbmMuIiwiS2F0ZSBTcGFkZSBTYXR1cmRheSIsIlRldWZlbCBHbWJIIiwiQWl0YXJnZXQgTExDIiwiRW5nYWdlIExhYiBMdGQuIiwiU2lnbmFsIERpZ2l0YWwsIEluYyBkYmEgU2lnbmFsIiwiTW90cml4aSBNZWRpYSBHcm91cCBMTEMiLCJXSElURSBIT1VTRSB8IEJMQUNLIE1BUktFVCwgQ2hpY28gQnJhbmRzLCBJbmMuIiwiTGlmdG9mZiBNb2JpbGUsIEluYy4iLCJldHJhY2tlciBHbWJIIiwiTWV6em9NZWRpYSIsIkV5ZW90YSBMaW1pdGVkIiwiQmVpamluZyBQYWdlQ2hvaWNlIE5ldHdvcmsgVGVjaG5vbG9neSBjby4sIEx0ZC4iLCJQYWRvcG9saXMsIEluYy4iLCJSZXB1YmxpYyBQcm9qZWN0LCBJbmMuIiwiQzggTmV0d29yayIsIkRhdGEgQXJ0aXN0IEluYy4iLCJBaXJGcmFuY2UiLCJZRGlnaXRhbCBNZWRpYSIsIlplbnRyaWNrIiwiRnJlZUJpdCBDby4gTHRkLiIsIkRlbm5vbyBJbmMuIiwiQWRicmFpbiIsIk1TSS1BQ0kgRXVyb3BlIEJWIiwiQS5Nb2IiLCJUb3lzIFIgVXMiLCJHZW5pZWUsSW5jIiwiQWRzZWN1cmUiLCJLaW1pYSBTb2x1dGlvbnMgU0wiLCJTb2plcm4iLCJXaGVyZSAyIEdldCBJdCwgSW5jLiIsIlRvbW9rbyBDbG91ZCIsIlJldmVudWVNYW50cmEiLCJBdXRvbW9iaWxlIEx0ZC4iLCJCaWcgTW9iaWxlIEdyb3VwIFB0eSBMdGQiLCJBRE1JWkVEIEFHIiwiU3BhcmtzNDcgcy5yLmwuIiwiQmV0d2VlbiBEaWdpdGFsIGRiYSBJbnRlbmN5IERTUCIsImVwcm9mZXNzaW9uYWwgR21iSCIsIkNoYW5uZWwgRmFjdG9yeSwgTExDIiwiQ29udmVydFN0YXIgSW5jb3Jwb3JhdGVkIiwiVmlzdWFsRE5BIChJbWFnaW5pKSIsIkF2b2NldCIsIkF1Y3Rpb24uY29tLCBMTEMiLCJXaGl0ZSBPcHMsIEluYy4iLCJIYW5nemhvdSBRaWd1YW4gTmV0d29yayBUZWNobm9sb2d5IENvLiwgTHRkLiIsIkFkbWV0cmljcyIsIkFkbWV0cmljcyBHbWJIIiwiQW1vYmVlIEluYy4gZC9iL2EgR3JhZGllbnQgWCIsIkRhdGFsaWNpb3VzIFB0eSBMdGQiLCJJbnRlbnQgTWVkaWEiLCJBZE5lYXIgUHRlIEx0ZC4iLCJaaGVqaWFuZyBNZWRpYUFkeCBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQiLCJIYXJyaXMgSW50ZXJhY3RpdmUiLCJCdXp6Q2l0eSBQdGUgTHRkIiwiU3B1dG55eCIsIkN5YmVyWiwgSW5jIiwiU3BhcmsgTmV0d29ya3MgVVNBLCBMTEMiLCJFemFrdXMiLCJWNHggU0FTIiwiVGFwam95IEluYy4iLCJFWEVCSUQiLCJFeHBvc2Vib3ggTHRkIiwiTW90b01pbmVyIiwiQnV5U2VsbEFkcy5jb20gSW5jLiIsIlZpa2luZyBSaXZlciBDcnVpc2VzIiwiU2l0dGVyY2l0eSBJbmNvcnBvcmF0ZWQiLCJGYWNldHoiLCJZT09TRSBQdGUuIEx0ZC4iLCJBZFlhcHBlciwgSW5jLiIsIkNsaWNra3kgTExQIERCQSBDbGlja2t5IiwiZVJhdGUgT25saW5lIE1lYXN1cmVtZW50IFNvbHV0aW9ucyBMdGQuIiwiQmF1bWFubiBCZXIgUml2bmF5IiwiVFVJIENvbm5lY3QgR21iSCIsIklORk9ubGluZSBHbWJIIiwiQWRpemlvIiwiSm95c3RpY2sgSW50ZXJhY3RpdmUiLCJFbmdhZ2VDbGljayBJbmMiLCJHZWVlTiwgSW5jLiIsIkFyYmlnbyBJbmMuIiwiRmx4T25lIEJWIiwiRXh0ZW5kVFYsIEluYy4iLCJtb21lbnRNLCBJbmMiLCJPbkNhcmQgTWFya2V0aW5nIGRiYSBSZXZUcmF4IiwiWW91dHViZSAtIEFQSSIsIlRoaXJkcHJlc2VuY2UgTHRkIiwiVmlzdWFsIElRLCBJbmMuIiwiQXBwcmVjaWF0ZSIsIkN5YmVyQWdlbnQgZC9iL2EgR2FtZUxvZ2ljIiwiTG9kZW8iLCJDeWJlckFnZW50IGQvYi9hIER5bmFseXN0IiwiTFREIFwiUlRCLU1FRElBXCIiLCJNYXZlcmljay4sIGluYy4iLCJGdWVsWCIsIlR1dG9yLmNvbSIsIlJlYmVsbW91c2UiLCJBZHZpYXRvciBEU1AiLCJBY2VucyBUZWNobm9sb2dpZXMsIFMuTC4iLCJZYXNoaSwgSW5jIiwiRmxhbWluZW0gSW5jIiwiTWVkaWFoZWFkIEFHIiwiQWRtaXhlciIsIkNvbW11bmljYXRpb24gU2VydmljZXMgVGVsZTIgR21iSCIsIjk5Y2xpY2siLCJTdHLDtmVyIE1vYmlsZSBNZWRpYSBHbWJIIiwiTExDIFwiTGlmZSBTdHlsZVwiIiwiMlkgTWVkaWEgU0FTIChhZHNlcnZlcnB1YikiLCJQbGF0Zm9ybSBJUSIsIlNpbHZlcmVkZ2UgSW5jIiwiU01BREVYIiwiU3V6dSBNdWNoaSIsIkxPS0EgUmVzZWFyY2ggaW5jLiIsIkVkZ2VzdWl0ZSIsIlBsYW5uVG8gVGVjaG5vbG9naWVzIFByaXZhdGUgTGltaXRlZCIsIlZpYXRvciwgSW5jIiwiTk9ERElOR1RPTiBURUNITk9MT0dJRVMgTElNSVRFRCIsIlBsYW4gQmx1ZSBMdGQiLCJBZGRpY3RpdmUgTW9iaWxpdHkiLCJBNiBDb3Jwb3JhdGlvbiIsIk1vYnVzaSBNb2JpbGUgQWR2ZXJ0aXNpbmciLCJXaXNoYWJpIiwib25BZCBHbWJIIiwiTWVkaWEgRGVjaXNpb24gR21iSCIsIlVuaXR5bWVkaWEgTlJXIiwiTm93c3BvdHMgSU5DLCBkYmEgUGVyZmVjdCBBdWRpZW5jZSIsIkF2aXMiLCJDb21jYXN0IiwiSmFjayBTcGFkZSIsIkRvbGxhciBHZW5lcmFsIiwiQ2FyZS5jb20iLCJDbGlja2FneSwgTExDIiwiR2xvYmFsV2ViSW5kZXgiLCJLaW5nLmNvbSIsIlByb3F1aXJlIExMQyAtIEFjY2VudHVyZSIsIkR5bmFtaWMgWWllbGQiLCJDaGFydGVyIGJ1c2luZXNzIiwiVGhlIEFERVgiLCJPbmVEaWdpdGFsQWQgVGVjaG5vbG9naWVzIiwiQURKVVNUIiwiQURtYW50WCwgU1BBIiwiU29nb3UuY29tIiwieEFkLCBJbmMuIiwiVmlkZW9CbG9ja3MiLCJHcmFwaGljU3RvY2tzIiwiTWljcm9zb2Z0IEFkdmVydGlzaW5nIiwiUm9udGFyIExURCIsIlRvcnJlbnRpYWwsIEluYy4iLCJBTW9BZCwgSW5jLiIsIlR1a21vYiBJbmZvcm1hdGlvbiBUZWNobm9sb2d577yIU2hhbmdoYWnvvIlDby4gTHRkIiwiSmFtcHAvRGV2ZWdvIFMuQS4iLCJQbGFjZWQiLCJEaWdpdGFzIEhlYWx0aCIsIkFuc3dlciBNZWRpYSwgTExDIiwiMTAwMG1lcmNpcyIsIlVwc3RhcnQgTmV0d29yaywgSW5jLiIsIkZvcmVuc2lxLCBMTEMiLCJMb29wTWUgTHRkIiwiQmFubmVybGluayAoTGlxdWlkdXMpIiwiRGVsbCBJbmMuIiwiTXkgUGVyZmVjdCBSZXN1bWUiLCJBamlsbGlvbiBNYXggTHRkIiwiU3dlbGVuIEZyYW5jZSBTQS4iLCJTbGVlcHRyYWluIiwiU2xlZXBjb3VudHJ5IiwiSG9vdmVyIiwiQmlkdGVsbGVjdCIsIk1vY29wbGV4IEluYy4iLCJCcmlnaHRzcGFyYyBUZWNobm9sb2dpZXMgUHR5IEx0ZCB0cmFkaW5nIGFzIE5hdGl2ZSIsIlZlcmVuZ28gU29sYXIiLCJNb2JpbGUgUHJvZmVzc2lvbmFscyBCViIsIkFQTklDIFB0eSBMdGQiLCJEdW4gYW5kIEJyYWRzdHJlZXQgQ29ycG9yYXRpb24iLCJVcFRvTGlrZSIsIk1vYmlsZTM2MCBTZG4gQmhkIiwiRWxpdGUgRml4dHVyZXMiLCJBZHZhbnNlIEFkcyIsIkluc3VyYW5jZSBTdGVwIiwiQ2F1c2FsIEltcGFjdCIsIlBpeG5ldCIsIlphcHAzNjAiLCJLaWppamkiLCJTcG90YWQgTFRELiIsIkdvIERhZGR5IiwiQmlsZW5kaSIsIkhpdG9rdXNlIiwiTUdJRCBJbmMuIiwiQXJlYU9uZSIsIkR5bkFkIiwiTG9vcCBQYXkiLCJSZW1lcmdlIEdtYkgiLCJBdWRpZW5jZSBUcmFkaW5nIFBsYXRmb3JtIExURCIsIldoaXNsYSIsIkJyaWRnZXZpbmUiLCJBRGdyYXBoIERNUCIsIkdyYXZpdHk0IEluYy4iLCJIaXBtdW5rIiwiVmlkZW9IdWIgRFNQIiwiRHVNZWRpYSIsIkZATiBDb21tdW5pY2F0aW9ucywgSW5jLiIsIlZJVkFMVSBHbWJIIiwiQWR2ZXJ0aXNpbmcgVGVjaG5vbG9naWVzIExURCIsIkF1dGhlbnRpY2F0ZWQgRGlnaXRhbCBJbmMiLCJQYWVEYWUsIEluYy4sIERCQSBUaGUgTW9iaWxlIE1ham9yaXR5IiwiTUVUUk9QQ1MiLCJQYXBheWFNb2JpbGUgSW5jLiIsIlJhdW1mZWxkIiwiR1JFRSBBZHMgRFNQIiwiVGVuZGVyIEluZHVzdHJpZXMgQUIiLCJCeVNpZGUiLCJTZW50cmFudCBTZWN1cml0eSBJbmMuIiwiTG9jb24gU29sdXRpb25zIFB2dC4gTHRkLiIsIkludGVycm9nYXJlIEdtYkgiLCJDaGFubmVsQWR2aXNvciIsIlZpZGVvQW1wIiwiVGhlIEJyaWRnZSIsIlBoYXJtYWNhIEludGVncmF0aXZlIFBoYXJtYWN5IiwiU2NydXRpbmVlciIsIlRGMSAtIEZSIiwiQ29yZSBEaWdpdGFsIiwiQWR2ZW50aXZlLCBJbmMuIiwiVHVybmVyIFNwb3J0cyBJbnRlcmFjdGl2ZSwgSW5jLiIsIlNuYXBweVRWIiwiVGFyZ2V0IE1lZGlhIFBhcnRuZXJzIiwiS0FJWkVOIHBsYXRmb3JtIEluYy4iLCJCaWRzdGFsayBQdGUgTHRkIiwiRVNQTiIsIk9ubGluZSBNZWRpYSBHcm91cCIsIkx1eHVyeSBMaW5rIiwiRVNLSU1JIiwiQWRzWW9sbyBNZWRpYSIsIkFycml2YWxpc3QiLCJNb2JpbGVXZWJBZHogTHRkIiwiRGVtYW5kIFNpZGUgU2NpZW5jZSwgSW5jLiIsIlNPQ0lFVEUgRlJBTkNBSVNFIERVIFJBRElPVEVMRVBIT05FIiwiTW9iaXRyYW5zIEZaIExMQyIsIkNvQ28gUmVlZiIsIkt1bW1hIERQIExURCIsIkNhYmxhdG8gTGltaXRlZCIsIkVVUk8gRElTTkVZIFNDQSIsIk5vcnN0YXQiLCJKb2huIFZhcnZhdG9zIiwiU3ByaXR6IFRlY2hub2xvZ3ksIEluYy4iLCJXaXguY29tIiwiVGFwVGFwIE5ldHdvcmtzIiwiUGVybW9kbyIsIkdhaWFtLCBJbmMuIiwiUGx1c2luZyBpbnRlcmFjdGl2ZSBjby4sTHRkIiwiUGF5cGVyc2FsZSIsIk9DUCBDb2xsZWN0aXZlIENvcnAuIChkL2IvYSBBZENhZGUpIiwiRVNWIERpZ2l0YWwiLCJSZXZKZXQgTExDLiIsIkdFVCBJVCBNb2JpbGUsIEluYyIsIklCTSIsIkx1Y2lkIEhvbGRpbmdzLCBMTEMiLCJTdHJhdGlvIEJpZyBEYXRhIEluYy4iLCJUcmlwcGluZy5jb20iLCJWaWRpYmxlIiwiTWlNVGlEIENvcnAiLCJNb2xvY28sIEluYy4iLCJNRUMgU1AuIFogTy5PIiwiQWJ1ZGFudGlhIExMQyIsIlJlYWx6ZWl0IiwiU2hhbmdoYWkgRGlnaXRhbE1hdHJpeCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IENvLiIsIkFsa2VtaWNzIiwiU29kZWwgU29mdHdhcmUgU29sdXRpb25zIFB2dC4gTHRkLiIsIkNsZWFyc3RyZWFtLlRWLCBJbmMiLCJLdWFpemlUZWNoIiwiQWRsdXhlIiwiTmludGhEZWNpbWFsIiwiUklDSCBNRURJQSBTVFVESU8iLCJUZW5NYXggQ28uLCBMdGQuIiwidHdpYWdvIEdtYkgiLCJBZCBEeW5hbW8gSW50ZXJuYXRpb25hbCAoUHR5KSBMdGQiLCJTd2FybSBFbnRlcnByaXNlcyBJbmMiLCJNZWRpYSBGb3J1bSIsIkJlZXN3YXguaW8iLCJWYXJpY2sgTWVkaWEgTWFuYWdlbWVudCIsIkpEIiwiTG90bGlueCBJbmMuIiwiTG90bGlueCBJbmMiLCJJbmdlbmlvLCBMTEMiLCJNVk1UIFdhdGNoZXMiLCJDMVggSW5jIiwiVml0cm8gQWdlbmN5IiwiS2FiYmFnZSIsIlJlZGJyYW5jaCwgSW5jLiAoZGJhIEZyYXVkbG9naXgpIiwiQXV0b1dlYiwgSW5jLiIsIkFpbWVlIFNvZnQgTHRkLiIsIlNBUyBBemFtZW8iLCJLZXlhZGUiLCJEaWdpdGFsIFRvIFN0b3JlIChEVFMpIiwiTWVkaWEgaVEgRGlnaXRhbCIsIkluZ2VuaW91cyBUZWNobm9sb2dpZXMiLCJTb25pY21vb3YgY28uLGx0ZCIsIkJvbmFkemEgTExDIiwiQXhpcyBTaGlmdCBMaW1pdGVkIiwiVHJlU2Vuc2EsIEluYy4iLCJNZWRpYSBMb2dpYyBHcm91cCBMTEMgZGJhIEFlcmlzV2VhdGhlciBMTEMiLCJGdWd1bW9iaWxlIiwiTG9jYWxzdGFycyBMdGQiLCJGbHVpZGFkcyIsIldheWZhaXIgTExDIiwiVkNDT1JQIENPUlBPUkFUSU9OIiwiSUdBV29ya3MiLCJDZWxsY29tIEx0ZCIsIlVwc29sdmVyIiwiUGhsdWlkbWVkaWEsIEluYy4iLCJSb3kgTW9yZ2FuIFJlc2VhcmNoIEx0ZCIsIlRhcFNlbnNlLCBJbmMuIiwiU291dGh3ZXN0IEFpcmxpbmVzIiwiTWFya2V0IFBvaW50cywgSW5jLiIsIlViZXJNZWRpYSBJbmMuIiwiS2FkYW0gU0lBIiwiQWx2ZW8gUGxhdGZvcm0gKFZNTSBvd24gYmlkZGVyKSIsIkFkYmFsYW5jZXIgRURWLURpZW5zdGxlaXN0dW5nc2dlc2VsbHNjaGFmdGdtYkgiLCJKV1BsYXllciIsIkFkaXF1aXR5IFRlY2hub2xvZ2llcyBQdnQgTHRkIiwiU21hcnQgRGlnaXRhbCBHbWJIIiwiQXVkaXRvcml1cyBMTEMiLCJUcmVlcG9kaWEiLCJBZGFtYXRpYyIsIlNBUyBXZWIyUk9JIiwiQ2FyZGx5dGljcyIsIk15Rm9udHMgSW5jLiIsIkJsdWVjb3JlLCBJbmMuIiwiRXZlclF1b3RlLCBJbmMuIiwiT3B0aW1pemUgTENDIEQuQi5BIEdlbml1cyBNb25rZXkiLCJFdmVyU3RyaW5nwqBUZWNobm9sb2d5IEx0ZCIsIkF4b25peCBMaW1pdGVkIiwiVWJpbW8gTHRkLiIsIlBsYWNlSVEsIEluYy4iLCJEYXRhQmVycmllcyIsIk90dG8gKEdtYkggJiBDbyBLRykiLCJCZWlqaW5nIEFEaXJlY3RzIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gTGltaXRlZCIsIk1hZ2ljR3JvdXAgQXNpYSBQdGUuIEx0ZC4iLCJMb2NhbCBDb250ZW50LCBJbmMuIiwiRmxhdmlhIiwiV2VidHlwZSIsIkFkaXRvciIsIllDbWVkaWEiLCJBZGR3aXNoIEFwcyIsIkFJRE8gVEVDSE5PTE9HWSBJTkMuIiwiSGVyb2xlbnMgR3JvdXAgTExDIiwiRnVpc3ogTWVkaWEsIEluYy4iLCJCdWNrc2Vuc2UsIEluYy4iLCJUYXlsb3IgTmVsc29uIFNvZnJlcyBVa3JhaW5lIExMQyIsIk1vdGlvbkxlYWQiLCJDSlNDIFJlY29tZW5kYXRzaWkgdG92YXJvdiBpIHVzbHVnIiwiQWRvYmUgRWRnZSIsIkJpemlibGUiLCJBZGx1ZGlvIExpbWl0ZWQiLCJBbGx5IEZpbmFuY2lhbCIsIkFJQWQgTHRkLiIsIlBldHBsYW4iLCJWaWRhem9vIEx0ZC4iLCJSVEJzdGFyIExMQyIsIkNoYWxrIE1lZGlhIEhvbGRpbmdzIiwiT3hmb3JkIEJpb2Nocm9ub21ldHJpY3MiLCJTR04gR2FtZXMsIEluYy4iLCJDcnV0Y2hmaWVsZCBOZXcgTWVkaWEsIExMQyIsIkxhc2VybGlrZSBJbmMiLCJBZHRpbGUgVGVjaG5vbG9naWVzIEluYy4iLCJBZGdyYXZpdHkiLCJQcm90ZWN0ZWQgTWVkaWEgTFREIiwiTWVkaWEgRGV0ZWN0IEdtYkgiLCJDZW50cm8gQ0ROIiwiRGVsdGFYIiwiU29NbyBBdWRpZW5jZSBDb3JwLiIsIkRpc3RyaWJ1dGUgTHRkIiwiUG9wcGluIiwiRVVST1pFU1QgTUVESUEgTElNSVRFRC9BdmlkIEFkIFNlcnZlciIsIkFydCBvZiBDbGljayBQdGUuIEx0ZCIsIlF1YW50YXN5IExMQyIsIldhdmVuZXQgVGVjaG5vbG9neSBDby4sIEx0ZC4iLCJFTlZJU0lPTlggTFREIiwiQWRob29kIiwiVGVsb2dpY2FsIFN5c3RlbXMsIExMQyIsInR3eW4gZ3JvdXAgSVQgc29sdXRpb25zICYgbWFya2V0aW5nIHNlcnZpY2VzIEciLCJNYXJjaGV4IFNhbGVzLCBMTEMiLCJTbWFydHlBZHMgTExQIiwiUmVhY2gxNTAgU29jaWFsLCBJbmMuIiwiTGVhZG1pbGwgQXBTIiwiVGFwSGVhdmVuLCBJbmMuIiwic3ByaW5nIEdtYkggJiBDby4gS0ciLCJSb3EuYWQgR21iSCIsIkFkS2VybmVsIExMQyIsIlVwcmlzZSBUZWNobm9sb2dpZXMiLCJTbGVkLCBJbmMuIiwiUGVuZ3RhaSBJbnRlcmFjdGl2ZSBBZHZlcnRpc2luZyBDby5MdGQiLCJBZGVsbG8gR3JvdXAgQUciLCJCaXRHcmF2aXR5IiwiNDQgSW50ZXJhY3RpdmUiLCJTaG9wYWx5c3QgVGVjaG5vbG9naWVzIFB2dCBMdGQiLCJUb3RhbCBBY2Nlc3MgQ29tbXVuaWNhdGlvbiBQdWJsaWMgQ29tcGFueSBMaW1pdGVkIiwiVEFDVElDIFJlYWwtdGltZSBtYXJrZXRpbmcgQVMiLCJNb2JpbGV3YWxsYSwgSW5jIiwiTnV2aWFkIEx0ZCIsIkFtYmVyRGF0YSBMTEMiLCJBZWRnZW5jeSIsIk1vYlBhcnRuZXIsIEluYy4iLCJBZFRyaWJhIEdtYkgiLCJESVNIIE5ldHdvcmsgTC5MLkMuIiwiTW9ub3R5cGUgSW1hZ2luZyBJbmMuIiwiTUVESUFOIEx0ZC4iLCJDbGlja0ZvcmNlIEluYy4iLCJaZW1hbnRhIEluYy4iLCJqc2RlbGl2ci5jb20iLCJBZHNzZXRzIEFCIiwiU2VsbHBvaW50cyBJbmMuIiwiSG9ja2V5Q3VydmUgR3Jvd3RoIFNvbHV0aW9ucyBQdnQgTHRkIiwiSG9ja2V5Q3VydmUgR3Jvd3RoIFNvbHV0aW9ucyBQeXQgTHRkIiwiVW1lbmcgUGx1cyBCZWlqaW5nIFRlY2hub2xvZ3kgTGltaXRlZCBDb21wYW55IiwiU3VydmF0YSwgSW5jLiIsIkp1c3RXYXRjaCBHbWJIIiwiSW50ZXJhY3RpdmUgVHJhY2tlciBOZXh0IiwiVW5pc3BvcnQgQS9TIiwiT1BURENPTSBURUtOT0xPSsSwIFlBVElSSU0gQU5PTsSwTSDFnsSwUktFVMSwIiwiU29mdGN1YmUgSW5jLiIsIllPcHRpbWEgTWVkaWEgU29sdXRpb25zIFB2dC4gTHRkIiwiWk1BR1MgSU5DIiwiQW5pdmlldyBMVEQuIiwiUmVhbHRhZyIsIkJpdHNuZ28ubmV0IiwiQWRDYW52YXMiLCJIYXBweWZpY2F0aW9uLCBJbmMuIiwiQ2luYXJyYSBTeXN0ZW1zIEphcGFu5qCq5byP5Lya56S+IiwiQ2luYXJyYSBTeXN0ZW1zIEphcGFuIiwiQ1VCRUQgQXR0cmlidXRpb24iLCJTdGFja0FkYXB0IEluYy4iLCJTdGF0aXEgTHRkIiwiVGFndWxhciBBbmFseXRpY3MsIExMQyIsIkNvbWJvVGFnIFRlY2hub2xvZ2llcyBMdGQuIiwiSnVpY2UgTW9iaWxlIiwiQmViZSIsIkF1Z3VyIiwiU2VyYWNhc3QgRGlnaXRhbCBMTEMiLCJBZXJTZXJ2IExMQyIsIlBULiBUb2tvcGVkaWEiLCJUZXJhcGVhaywgSW5jLiIsIk9wZW5TdHJlZXRNYXAgRnJhbmNlIiwiRnJvbnQgUG9yY2gsIEluYyIsIlZlcnRhbWVkaWEiLCJDb2Rld2lzZSAoVm9sdXVtRFNQKSIsIlZpcm9vbCBJbmMuIiwiU3ByaW5nU2VydmUgTExDIiwiSW50aW1hdGUgTWVyZ2VyIiwiVGVsZWNvbWluZyBDb25uZWN0aXZpdHkgUy5BLiIsIldlYnNzdXAiLCJJTkNVQklRIFNvbHV0aW9ucyBMdGQiLCJBRFNwZW5kIiwiQWRUcmFkciBDb3Jwb3JhdGlvbiIsIlF1aW50IEdyb3d0aCBJbmMuIiwiWkFQUiIsIjF0cm4gTExDIiwiTWF0aXJvIiwiSW5zcGlyZWQgTW9iaWxlIEx0ZC4iLCJTZWxlY3RtZWRpYSBJbnRlcm5hdGlvbmFsIExURC4iLCJJbnRlcm5ldCBCaWxsYm9hcmQsIGEuIHMiLCJWb2x2ZWxsZSIsIlN0cmVhbVJhaWwgTHRkLiIsIkUtQ29udGVudGEiLCJCYXRoIGFuZCBCb2R5IFdvcmtzIiwiV29vVGFnIFB0ZSBMdGQiLCJDaW50IEFCIiwiU3RlaW4gTWFydCIsIlNpZnQgTWVkaWEsIEluYy4iLCJTdGFydEFwcCBJbmMuIiwiUHhlbmUgLSBEU1AiLCJJbnRlZ3JhbCBNYXJrZXRpbmciLCJFeHBlZGlhLCBJbmMuIiwiRGVlcEludGVudCwgSW5jIiwiT21uaVZpcnQiLCJcIkluZGV4MjBcIiBMTEMiLCJDb252ZXJzaW9uIExvZ2ljLCBJbmMuIiwiQ29sbGVnZWh1bW9yIiwiU2lsZW5jZSBNZWRpYSBMaW1pdGVkIiwiWnV1dmkgQXBzIiwiU29mdEJhbmsgQ29ycC4iLCJDb25uZWN0T00sIEluYy4iLCJTa2lsbHVwIFZpZGVvIFRlY2hub2xvZ2llcyBDb3Jwb3JhdGlvbiIsIkFkYXJhIEltcGFjdCBBbmFseXRpY3MiLCJUYWJNbyBTQVMiLCJDYXNhbGUgTWVkaWEiLCJTdGlja3lBRFN0diIsIlRlYWRzIFRlY2hub2xvZ3kgU0FTIiwiQW5vbWFseSBDb21tdW5pY2F0aW9ucywgTExDIiwiQ2xpY2tUaWNrZXIsIExURCIsIlRyZW1vdXIiLCJSb2tldCBNZWRpYSBMVEQiLCJWaWRlbyBKYW0gKE1hdURhdSBMVEQpIiwiTUlOSU1PQiAoQ1kpIExURCIsIlNuaXRjaGVyIEIuVi4iLCJBbmFsaWdodHMiLCJSb21pciBQYW5lbCBMdGQuIiwiRGlldmlzaW9uIiwiSWduaXRlIFRlY2hub2xvZ2llcyIsIk5hdmVnZyIsIkFkYWx5c2VyIiwiTm9yZGljIEZhY3RvcnkgSW50ZXJuYXRpb25hbCBJbmMuIiwiQWRkaXRpb24gUGx1cyBMdGQiLCJLYXJtYXRlY2ggTWVkaWF3b3JrcyBQdnQgTHRkIiwiTWVkaWF0cm9weSBQdGUgTHRkIiwiV2F5dmUgTGltaXRlZCIsIktyZWRpdGVjaCBIb2xkaW5nIFNTTCBHbWJIIiwiWWVuZ28iLCJEQU50cmFjayIsIkludGVncmFsIE1hcmt0LSB1bmQgTWVpbnVuZ3Nmb3JzY2h1bmdzZ2VzLm0uYi5ILiIsIk1pbGxlbWVkaWEgR21iSCIsIkhpcm8tTWVkaWEiLCJTaW1wbGFleCBHbWJoIiwiVGVsZWtvbSBEZXV0c2NobGFuZCBHbWJIIiwiSW5mZXJub3Rpb25zIFRlY2hub2xvZ2llcyBMaW1pdGVkIiwiR29sZGZpc2ggTWVkaWEgTExDIiwiU21hcnRvbG9neSBMaW1pdGVkIiwiR3JvdXBNIiwiSGF5c3RhZ2cgSW5jLiIsIkRpZ2l0YWwgVHVyYmluZSBNZWRpYSwgSW5jIiwiTURTUCBJTkMiLCJRdWFkYXMgKFlpRG9uZyBEYXRhIEluYy4pIiwiUmVjcnVpdCBDYXJlZXIgQ28uLCBMdGQuIiwiUjJOZXQgSW5jLiIsIk1hZGJlcnJ5IE9ZIiwiUVZDIiwiTWljcm8gQ3ViZSBEaWdpdGFsIExpbWl0ZWQiLCJlZ2cuZGUgR21iSCIsIkhlYWR3YXkgTWV4aWNvIiwiUlRCaVEgSW5jLiIsIlNDSUJJRFMgVEVDSE5PTE9HWSBTLkEuUy4iLCJLeW9jZXJhIENvbW11bmljYXRpb24gU3lzdGVtcyIsIkNvcnRleCBNZWRpYSBHcm91cCIsImFwcFRWIiwiUHJvZ1NvbCwgUHJvZ3JhbW1hdGljIFNvbHV0aW9uLCBzLnIuby4iLCJSZXpvbmVuY2UiLCJMS1FEIFBsYXRmb3JtIiwidGFyZ2V0IHZhbHVlIEdtYkgiLCJGaXJlY3JhY2tlciIsIk1BREdJQyIsIkRpZ2lzZWciLCJCdWxiaXQgSW5jLiIsIkxvc3QgTXkgTmFtZSIsIlBlb3BsZSBNZWRpYSIsIlBsYXRmb3JtLmlvIiwiQmlkc3BlYWtlciIsIllvdUdvdiBQTEMiLCJTQVAgU0UiLCJBZGNoZXgiLCJTbWFydCBCaWQgTGltaXRlZCIsIlVBZCBFeGNoYW5nZSIsIlVBZCBFeGNoYW5nZSAtIElCViIsImVzYyBtZWRpYWdyb3VwIEdtYkgiLCJkZWZhY3RvIHNtYXJ0IHJlYWNoIEdtYkgiLCJSZXNlYXJjaCBhbmQgQW5hbHlzaXMgb2YgTWVkaWEgaW4gU3dlZGVuIEFCIiwiT25BdWRpZW5jZS5jb20iLCJPbmVUYWciLCJGaXZlcnIgSW50ZXJuYXRpb25hbCBMdGQuIiwiQWRpa3RlZXYiLCJDZW50ZXJQb2ludCBNZWRpYSIsIkRpZ2l0YWwgVHJhY2UiLCJQdXJlIENvYmFsdCIsIkNlZGF0byIsIkpvbnNkZW4gUHJvcGVydGllcyBMaW1pdGVkIiwiUmVhbHl0aWNzIiwiVHdpbnBpbmUiLCJNb3BlZG8gQUIiLCJOZXRzYWxlcyIsIlZpZXdlcnNMb2dpYyBMVEQiLCJBRE1BTiIsIkh5cGVyIiwiSHVycmEgQ29tbXVuaWNhdGlvbnMiLCJHcm91bmRob2cgVFciLCJJbWVkaWFNYXgiLCJGbGl4YnVzIiwiQXVkaWVuY2VUViIsImIzNDEwNjE4M190ZXN0IiwiTmV0c2NvcmUiLCJDaHUgVGVjaG5vbG9neSBMaW1pdGVkIiwiU21hcnR5QWRzIExMQyIsImRidXBkYXRlMSIsIlRoZSBCaWcgV2lsbG93IEluYy4iLCJMaXZlSW50ZW50IEluYyIsIk9wZW5MZWRnZXIgQXBTIiwiV2hpY2hpdCIsIlBhcmtESUEiLCJBdGVkcmEgSW5jLiIsIkRpZ2l0YWwgRm9yZXN0IE/DnCIsIklzb2JhciBXZXJiZWFnZW50dXIgR21iSCIsIlZhbHVlcG90aW9uIFB0ZS4gTHRkLiIsIlZ1YmxlIEluYyIsImFkbG9jYWwubmV0IiwiRnJlY2tsZSBJb1QiLCJQZXJzb25hbGl6YXRpb24gTExDIiwiVGhvdWdodExlYWRyIEluYy4iLCJOb3FvdXNoIE1vYmlsZSBNZWRpYSBHcm91cCBGWi1MTEMiLCJHLUNvcmUgTGFicyIsIkhhZW5zZWwgQU1TIEdtYkgiLCJMZW1vblBJIiwiNEluZm8sIEluYy4iXSxbeyJoYXNoIjoiOGZkMjU5OTk2ZGE1ZjNkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjowLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU2ODM3ZmUyNTk3YTRmOWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MCwidHlwZSI6MH19fSx7Imhhc2giOiJmYjRkZGZhZmFkYjM4N2NmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjAsInR5cGUiOjB9fX0seyJoYXNoIjoiMDdhMTFkOWQwMDdjNjBmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjowLCJ0eXBlIjowfX19LHsiaGFzaCI6IjlmMzZmYzBiYjI5MTEwNDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MCwidHlwZSI6MH19fSx7Imhhc2giOiI1N2M3YWY2MDgxOWIzZjNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYzMzNjNiMWNjZjBlMmFiNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkMTZiZDk5ZTkyOWVjY2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MSwidHlwZSI6MH19fSx7Imhhc2giOiIyMTFkM2I5ZWE5YmY4ZjJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDE0YWRmZTAwN2QzNTg3ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ0ODZlNTg0OTkwZjk2MDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NCwidHlwZSI6MH19fSx7Imhhc2giOiI4Y2ZiNjZiMWI3YmJlNDNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUsInR5cGUiOjB9fX0seyJoYXNoIjoiZmJhMmEwY2Q2MjZhNTI4OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjExMzYyMGZmM2JiM2VhNjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NSwidHlwZSI6MH19fSx7Imhhc2giOiJiNWY2YjQ1NzBhMDc5NzdjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg3N2YzYjJmZmUzNGJmNGEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjcsInR5cGUiOjB9fX0seyJoYXNoIjoiYmM1ODgyY2M0M2QyNGEwYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1MDZhMzkzNTY3NzYyMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI0YThmMDM4MGQ4YzBlZTIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTRlMWQxNjM5NDg1MDlhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUzNGUzNzMzZTRlNTMwOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJjN2RiOGUwZTI1YzdkZjJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjIyYWZkZWIyOWJlMzBjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwODJmNDM0ZDllYzFmOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJlMDAwOTJjZjdmYjhjNzRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNmIzNTU3ZTU0MDczZjkwZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI4MjU3MjQ2ODJkNGJkNDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI2MmEwYzZiM2NkM2VkNTY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2U1ZjgwMjc1YTY1NGY5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2ZDNiZjM2YTA2NmE3MjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIxNGY4YmI5MmM0MDM2NDAzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhhYWFkYTUxZWU4ZWJiODYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2UxZDRlZGMzNTMwZTQ0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMwYmYyYjAxMTE5OTA1NGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJiNGRkNjhjNWQ5YjY4OTIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiOGQ5NDM1ODZmOGY4NmQwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2MGI1MTMyNWNkZjRmODAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIwODBkZWExNWZhNjAyYThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYTAxYzlmMWY3NDVhY2IzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhZTQ5Yjg0OTUwZGIyMzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIxNTRjMDA0NDIwMzg4NDJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmI1MTkxYzI3NDRlNTE1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0ZjhlZThkNDEwMTAzNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJkZGU5N2EyNWQ3NDEwODNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYzQwZTUxZjBkNDMwOGFlZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhZmFlNDA0ZmU0YmY5ZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIyOTY1ZDYwYzQxZjI0NjkyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0N2RmOWJmMWNjYzVhZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAsInR5cGUiOjF9fX0seyJoYXNoIjoiNTg3NGFiMjA0MGZkOTJlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMCwidHlwZSI6MX19fSx7Imhhc2giOiIxMmM5YTNmYzQ3ZWVjNjU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmOTUwMTU0YjY1NTM4YjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiY2NhODhjMThjM2E5NTVjMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTMsInR5cGUiOjF9fX0seyJoYXNoIjoiY2Y1ODNhNGYxYjg1YTYzZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiYjFmMjRmYjlmNGU4MmJjNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiN2VkM2VmM2JkOWI3OTY0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiI4MDIxODU2MzdkYjk3ZjU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5YWM1MmU2NDUyZGNkY2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiOTlkNmUyNzZhOWYzZGNlNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjBjZWE0MjJmNjMzZjEzMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJhYmFjMGU5MmI3YzA5MTg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFiNmQ1YmNmY2IxM2M5OGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiIxN2M3NjA1NzAxMjFjYjhlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNjYTk5MWI2YWI3ZTY0NjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjEsInR5cGUiOjB9fX0seyJoYXNoIjoiYjI0YWFiOGFkODgyMmUzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMSwidHlwZSI6MH19fSx7Imhhc2giOiJlMDY4MTkwOTUxZGJiNWVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM1YTVmZDQ5NWM0NGI4ZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTUzMDUxNTQ5NjllODFiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMSwidHlwZSI6MH19fSx7Imhhc2giOiJmNDBhNzU0OWM5OThmZDk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2ZWVhYTJjOWFmYjg5NTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjIsInR5cGUiOjB9fX0seyJoYXNoIjoiYmZlY2ExYTA4ZWFjMWY1ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjMsInR5cGUiOjF9fX0seyJoYXNoIjoiY2ZiYjg5NGZkYmE1NDg5YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNH19fSx7Imhhc2giOiI0Y2UyMTI5NmI3YWRiMjBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcyYjEyYTgzNGY5M2JiZDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNWE4ODU3ODM5NDFlNjU0MCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjcsInR5cGUiOjF9fX0seyJoYXNoIjoiMzgyNzM0ZDU0ZGRmNzEwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOH19fSx7Imhhc2giOiJkYWJkMmJjOTUwOTNhYjI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiODkxMmM3YmRkZTQ4MTI5MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3MzVlNGFkZmM3NTQ0NzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIyOTdiYmE4Y2QwNDViMjUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYjRlZTA0ZTFjYjFiMGNiMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmOTkyNWI2MTFiM2RiNWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJlNjNmMjFhMDExNTNiYThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNWRmOTJjNDc3NmRkYjMxOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk5NWU0ZmU0MDJkMjMwZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJmMjdiYjI3OTVhMzEzMTFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2VmNDFhODQ2NTAxYmIzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2OWM5ZDBhNjcyNmQ4YTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJmYmU4MmNhYzUwN2M0Njg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYjMwMTA4ZGM0ZmVmN2QzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkYjkxZjIyNDk3ZmZmMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI4YzkzZjI4OGQxYzlhZGFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZGQzYWJmYTc3NTZmOTQ1ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU2MmY0MjYwZmY0ZjY1YTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI5NGQ4ZGRjZTc0OWI1MzkyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiIwMzEyNjlhZmRhZWUzOGNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBjMGJhMWFhZjM3NGVhYzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiY2IxZGJhYjRiYjlkMTM5YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiIxNDRkYWM3M2M1NjY5NDQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI2YjIzMmU1ZmJmODY4ZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiM2MxNTU2MmI2YWJjMTMxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiI3MjJjODExZDcwMTM2NTA2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4YTc5MmVmZmE5ZTQ5NjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiYTU5NjM3YTdjYTlkYzU3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiI2YjNjZTVlYTc5M2VjYmJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiNWJkMGM1MDVhMTc4ZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiYzQxY2VmYTM5ODUyZTUzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiJlNTcyYjU1Y2YwYzY4MzRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwZDBiOGU0NjA5NGIxYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiMzQzMDM2ODgxMDQxYWEyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiIyNTU5ZWQzMTYzNDc5Nzk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1YWNmM2Q0MmY1NjUzNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjksInR5cGUiOjB9fX0seyJoYXNoIjoiYTNmZTgwNjA3Nzg2ODgwZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOSwidHlwZSI6MH19fSx7Imhhc2giOiJiNzYyOWU3ZmFiODgxZTdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzZWMxYTg0MTU3NGJkNGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzEsInR5cGUiOjB9fX0seyJoYXNoIjoiN2ZmNWNlMTc2ODQ2NGUxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMSwidHlwZSI6MH19fSx7Imhhc2giOiIxMGZiOWRjYjQ5ZTFhYmU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyfX19LHsiaGFzaCI6IjZkMzcxM2FkMzdhMDk2NmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzJ9fX0seyJoYXNoIjoiNDE2NzBmZjAwNGEwNGYxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMn19fSx7Imhhc2giOiJjZDY4MWI0ODkxOTM1NDY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI5NzM4MzMyMGI1OTRmMTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMsInR5cGUiOjF9fX0seyJoYXNoIjoiZTJmZmY2ZTU5OGIzMDM1ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNiM2NlZGE0ZjBjMzg5OTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJhMjE4ZTA2NTI1MGQ3OTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZGViMWNlOTExZGZiMzkyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlNWVhZDE1ZjFkMGYxNzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI5MjYxNWQzOTQ4ODNjZTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNmNkODQyYjEyZDIwYjIwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjNmFjZmFjYWQ2YzEwMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiI4MWFhMjVmZjc2OTkwOTk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTI1NDA2N2E4MGNmM2Q3YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxZTI1NDllODJiOTI3NzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiJiZTQxYmI5NDA2MDg0MzRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDVhNGFiNGExMWJkMWZiZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1Njc3YWNhNzEyZTliNjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OCwidHlwZSI6MH19fSx7Imhhc2giOiIwMDYyMDgwMTA1MDk0NWQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMwY2VhZTdjZmM0MTQ0YzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzUsInR5cGUiOjB9fX0seyJoYXNoIjoiOTk2YzM5OTAzMTBjZmMxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNiwidHlwZSI6MH19fSx7Imhhc2giOiIxNDIxMGYwZjBhOGQ3MWNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1YjRlZjUwZWI5ZGVkZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiNjIwNWI1ODliY2QyY2Q5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOCwidHlwZSI6Mn19fSx7Imhhc2giOiIzNDAxYTkwZjNhMzVhN2U4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM4LCJ0eXBlIjoyfX19LHsiaGFzaCI6IjRlZTIyOWJkOTVmOWJiMTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiMmEwNzY2YThkZDJjZTJiMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOCwidHlwZSI6Mn19fSx7Imhhc2giOiI3MzZiODdmNTA0YjVlMTEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiY2VmODEzNzJlYWRmZTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDAsInR5cGUiOjB9fX0seyJoYXNoIjoiOWVhNjc2OWU2NzI5NjhlOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MSwidHlwZSI6MH19fSx7Imhhc2giOiIwZmRlNjEyYzIwYzQyYzZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlZDk5NTc2M2NlODUwMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDMsInR5cGUiOjB9fX0seyJoYXNoIjoiNDk3MDgyOTcyYzFjMGRmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NCwidHlwZSI6MH19fSx7Imhhc2giOiI2ZDdlNGEyMDNiOTY5ZDllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzYTkwNTc1MjhjMTRhNTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYsInR5cGUiOjB9fX0seyJoYXNoIjoiNDc5ZDJmOGQ5YjdhMmVmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NywidHlwZSI6MH19fSx7Imhhc2giOiI2ZjdmOWZiMDA2NWY3NDVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg5M2Q5NjdmNDU0MGJiNDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiMzgzMGYwYjZjYTQ2MGZlOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDksInR5cGUiOjB9fX0seyJoYXNoIjoiZTkxNzIzN2VlN2IwYWQ3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0OSwidHlwZSI6MH19fSx7Imhhc2giOiJlMDc5MmZmZDVlY2E5NGQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI5YmVlZTMxNmEzOTM1ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDksInR5cGUiOjB9fX0seyJoYXNoIjoiY2U5ZTdiZjE3YmJhNGFhZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0OSwidHlwZSI6MH19fSx7Imhhc2giOiJmY2Y2MDRmOTAxNjZiYjY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYxMWQ5MDU5OTUwYjRhMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDksInR5cGUiOjB9fX0seyJoYXNoIjoiN2QxNDJhODVmODRmMzQwMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0OSwidHlwZSI6MH19fSx7Imhhc2giOiI4M2MwYmIyMjRjYjU2MjJmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MCwidHlwZSI6MH19fSx7Imhhc2giOiIyNzg0MWU1YWMxNTgxYTY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjgzZmJkY2U0ZjI1MTk2ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZGI3YmFjOTRmMmIyZDJiNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MiwidHlwZSI6MH19fSx7Imhhc2giOiJlMGRlNTQzMDI1MzIwNWZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJkZTU3YjYwMTE0OTllZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMDc3YWQwNDJlMjljNzlmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MiwidHlwZSI6MH19fSx7Imhhc2giOiJkM2M2ZmM1ZmY3N2YwZDVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI4OGZiMDFiYTIxNTg5NGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjNkNTA5ZjU1N2FlY2E2ZGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhOTk1OWM4Y2FkZDIwYWYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjU1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU4YWRiODA2YTM5ZjY2MWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZGE3MzQzYzE2YTUxZjFkNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NywidHlwZSI6MX19fSx7Imhhc2giOiI1YjRkNDU5NTQ1M2Q1YjIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI1MDg1ZDNhM2VkZTc1MDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTksInR5cGUiOjF9fX0seyJoYXNoIjoiMDc2ZTM5YjdhYTM1NGM4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NSwidHlwZSI6MX19fSx7Imhhc2giOiI2MWM2YTZkMTViMzQwZjQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM2ZjVjYjIxM2E0ZDE0NjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTViNjFjMDEyNDAyYmUxOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MCwidHlwZSI6MH19fSx7Imhhc2giOiIzNGUyOTE3OTQ5NzRlODkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFkMGQzOTM2NTVhZTdjZTQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiZWIzMjhhY2M1YTVhMTQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjYxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjllNmU1ZjYyNmJjM2Q0M2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNjY2NTllNzlmZjgwN2YzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MSwidHlwZSI6MH19fSx7Imhhc2giOiJjZTk2NWJiMDY3NjA0MzZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNhOGUwNGE1Y2RkOGZkMWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTA4NGYxZTJiMDRmNWY5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MSwidHlwZSI6MH19fSx7Imhhc2giOiIwNGIzNzc4NDU3YTNiYTk5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MSwidHlwZSI6MH19fSx7Imhhc2giOiIxYjg0M2YyZjFhMzljOThiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjN2JlZWFkMWVhMzczODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMmI1OWUzZWZlNTlkOTdkNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MiwidHlwZSI6MH19fSx7Imhhc2giOiI1MTgzMDg5MDdmNWY2OWEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3ZDQ0NzRmYWU5YzZiMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDdjNTkwNTY2ZjBjODY5YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MiwidHlwZSI6MH19fSx7Imhhc2giOiI0MDkyNDBhMzhlNWU3MmI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk4NDIxYTZkMDdmNTUxN2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNGYwMGZiMDAxNjM1MTMyYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MiwidHlwZSI6MH19fSx7Imhhc2giOiJjNmJhOTQ3MDhmNmQ3ZDUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNhYWUxMDllOGEzYmVjNGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiOTEzN2I1Y2RmY2I1NGNhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MiwidHlwZSI6MH19fSx7Imhhc2giOiJhZTk2ZDgxOGEwNjc0ZGIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2N2ZlY2MzMzllZTI3M2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzYzY2M4NGU0YTZjNmZjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MiwidHlwZSI6MH19fSx7Imhhc2giOiIxNzA3MDc2MjcyMDVkMTRkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MywidHlwZSI6MH19fSx7Imhhc2giOiI0YjM3ODMxMjdhOTYyMjY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ1N2NiNWU5YzcyNTAwYmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjMsInR5cGUiOjB9fX0seyJoYXNoIjoiMGY1MjlkYzMyYzFiOTA1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MywidHlwZSI6MH19fSx7Imhhc2giOiJlNjM4NDViYWQ1MDI2M2UwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4YjhkOGUzOTc4NDg5ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiMTQ2YWMwZmYyMTkyNGU3ZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTUxZGE2ODU1ZGUzYTI1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NSwidHlwZSI6MH19fSx7Imhhc2giOiIxNTA0OThiOWQxMGYwNTNmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MywidHlwZSI6MH19fSx7Imhhc2giOiJmYTE4MDNlMDBhZGFmZTZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhODIwZTliZDNjY2QyOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzNmNzAwNDViZWVhMjVjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NSwidHlwZSI6MH19fSx7Imhhc2giOiIxNDcyNWNiN2I2ZTNlZDk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkMjc0MGNiZWUxMDY5NmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiZTE1MGQ2MzQyYzZhMzk1MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjYsInR5cGUiOjB9fX0seyJoYXNoIjoiNTBiOGI5M2E4YjUzNjk4MyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjcsInR5cGUiOjB9fX0seyJoYXNoIjoiODUzMzVkODNlZmM5ODM5YiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMDhmMGJiNDUzMjZjZmZlMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNWUyYjIzOTNkYWQzZjVlYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZGE4MThiY2Y2MWRmOTAwMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiODQ2ZmM5NmVkZDY4ZTJmOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjksInR5cGUiOjB9fX0seyJoYXNoIjoiOTE0ZDQ4ZGYzZDdhZWFhZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiOGE1YjU4MTc0Y2M5MzhiZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjE4ZWI0OTYxMjQ4ODI2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MiwidHlwZSI6MX19fSx7Imhhc2giOiI4NWM5YTU1ZWE1YjJhMzJhIiwicHJlZml4ZXMiOnsiZGF0YSI6eyJwcm9kdWN0Ijo3MiwidHlwZSI6MX0sImFtIjp7InByb2R1Y3QiOjcyLCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk4MjdiYTQ3MjViNTM5ODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIsInR5cGUiOjF9fX0seyJoYXNoIjoiYmZiYmY2YjgxYjEwOWIzNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMDA2ZDY3MTg4MDZiNzU2MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDM4NzFmMmNlNDY4OTBjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3NSwidHlwZSI6MH19fSx7Imhhc2giOiIyNjQ4ZjIwYzVmYTdlZTA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzZTBiMGYwODVhOGIyMTQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcyODhhMDdmMzQwOTExZTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYTlmZTg0MzEwN2Q4NWU1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3NywidHlwZSI6MH19fSx7Imhhc2giOiIyMzBjNTk1MTIyNjFkNzNkIiwicHJlZml4ZXMiOnsiY2RuLSI6eyJwcm9kdWN0Ijo3NywidHlwZSI6MH19fSx7Imhhc2giOiI4Y2E0ZmIxMzYxOWI3N2YxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3OCwidHlwZSI6MX19fSx7Imhhc2giOiIxODY1MmNiYTU0NDViMzRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZkMDlmODNhZWZjNDUwMWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjgwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcwNzMyZTYxYWY5YWRiMGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODEsInR5cGUiOjB9fX0seyJoYXNoIjoiYjRlZGUwOTRmZTcwNmFjZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjE5Y2ZjOTVmNjdkMGZhNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiYTZlNDliNjI0ODAxNGZhNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODMsInR5cGUiOjB9fX0seyJoYXNoIjoiNGE1M2E1OTQ5MGM0YTM4ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODQsInR5cGUiOjF9fX0seyJoYXNoIjoiNjgzZTIyY2FmYTVmM2JkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NCwidHlwZSI6MX19fSx7Imhhc2giOiIwMmU4YTE1Y2E2MWZiYzMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYzNhNjJjNTY1ZGE1OTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzNlMjNhZDg0MTU3ZjI0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NSwidHlwZSI6MH19fSx7Imhhc2giOiJiOGJkNzFhYWFhNzE1YTE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM0MDQ5ZTc5OGM4MGJiYWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiODM4ZWVmMWMxZmU4YWYwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NSwidHlwZSI6MH19fSx7Imhhc2giOiIzYTdlM2RmZWEwMGU4MTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxNzNjZDdiYWI0NmY2ZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiYzE0NjYzZDc4Y2JhZmVkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NSwidHlwZSI6MH19fSx7Imhhc2giOiIzMDhhMTg4NGJhNjMyMjU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBlMjE5ZjYzZDkyZTlmMzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjAxYzE3OWM1ZjFlNzFlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiIzNzUyM2VhZWI5YjFmZTViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY1ZWI3ZTk3YWNiN2MwOTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiM2NhYTViMTBiNzY4NDQ3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJjOGNhNTE3MzMyYmVhY2IxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjhhZjkwMmM4MWI3OTMxNTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiMzhlZDkyNGMwMTU0NWEzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiI1YjU3ZTM1NmE2MmQ2ODI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQyODFhMGE0MTM3OTZmMWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiNjZlMzU2MzU4YzQyYTlkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJlYmUyNjA2OWEwOTQwNDU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjlkMjI4M2FiODFiYjdhMzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiZDVlMDU5MTljMmQ3MmZhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiI1MTlhZmQwMGFkZDMyYTc0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijg4ZDQ4ZjNjZWI4ZDAyYmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiZDkzYjdkMjY2MDMwMWIxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiI2YTcxMDA5ZGE0MzU4ZjI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcxZjYyNzc4NmFiODA4OTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiZjFiMzE0NzEwMjY1NmI0MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiIxYTMwNDBmNzlmM2VkYTVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFjODE0MDI1NjhjYTRjNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiNWEwZjY4MWY1ZDM3MTRlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJmYjNkNGQyODBmNjIxNjI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY4MTFjNmU4YzcxN2IyNWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiMmI1NTk2MTVjOTkwMzkyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJkODQ0N2RkNDBkOWNlNjNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk4YTMyZTgyYmQ2MTEwYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiZTNmZjQ0YWIwYmJjMzY2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJkOGEyNDRlZmZhODVkMWU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZhNjVkNjJjMjBjYzk0YmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMWQ1NWRmYmRmOWYzMThkMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NywidHlwZSI6MH19fSx7Imhhc2giOiJlMDYyNjkyMjdhMDJhZTQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkMmJmOWE5Y2I2ZTlmODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMGFkYmY2MDg1OTQ2YmJmNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NywidHlwZSI6MH19fSx7Imhhc2giOiI2MWQyZDRmMjU5NzJmY2NkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ5NTA2ZGNmM2FiOGVjNjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjE0NDhiMDg4YWVhNzE0NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NywidHlwZSI6MH19fSx7Imhhc2giOiIxMmIxZWQ5MjM3MTQ5OGUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI4Zjc2M2Q0NmIzZDIzMGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDQwMzNlY2JlMDY5ZDMxOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NiwidHlwZSI6MX19fSx7Imhhc2giOiJiNDVlYTFlYjljOTI5MGExIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo4OCwidHlwZSI6MH19fSx7Imhhc2giOiIzMzNiZWQ3MWZlODcyYzg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFkNzdlNDhkODQxYTE1YTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODksInR5cGUiOjB9fX0seyJoYXNoIjoiZjgyMjUyNWIzNDk4NjZiNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNmNkYThkZDFiOTJmNmMzNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNGQ1OTJlZmJmZjQwMTk3ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGY1N2RjNjExYTJlNDY5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MiwidHlwZSI6MH19fSx7Imhhc2giOiJlZjZjYjgzMzcyMjNjYmQ2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo5MiwidHlwZSI6MH19fSx7Imhhc2giOiIxOTAyYzQwN2JiZjFhZGQ4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo5MywidHlwZSI6MH19fSx7Imhhc2giOiJjMDk1NmM2MzA4NDAyM2E4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwMjlkMjMxODgyZWQyNTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWUxNzVhYTQ3OGVmYjliMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzBmZmY2YjgyMzI3MTBjNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTg0NmUzMzQwYWMyN2FkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NSwidHlwZSI6MX19fSx7Imhhc2giOiI1NDhlOWUzNGRiYzI3NWI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5Njk1ZjU2ZWFhMDU0ZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjdmNmJjOGM0MzQ1MzQ3YSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDg0YTY1NmFjZTQwNDE0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NywidHlwZSI6MH19fSx7Imhhc2giOiJhMjI0Zjg5NjYwMWVjNzE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhNzlhNmQ5YWYxMmVmOWEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzZGVjNzdkMjBhNTVkY2IiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmMjViNTVlY2E2NTIyMWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjUzMWE2NTViMTk4MmVlNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OSwidHlwZSI6MX19fSx7Imhhc2giOiJiODg0ZjcxZGRkZDc4YTI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMCwidHlwZSI6MH19fSx7Imhhc2giOiI4MzllYjc1ZDBlOWVmMTI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMSwidHlwZSI6MH19fSx7Imhhc2giOiJhZDkyMDc3M2Q1YzNlMDUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMiwidHlwZSI6MH19fSx7Imhhc2giOiI2Y2JlNmJjNWQ1ZmVkMzVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMywidHlwZSI6MX19fSx7Imhhc2giOiI3OGNmY2I1MDYwNmU0NGY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNCwidHlwZSI6MH19fSx7Imhhc2giOiIzN2YzYWE1NWJkNDg3NjBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNSwidHlwZSI6MH19fSx7Imhhc2giOiJmYTkyYzUyMGNhMTE2OTk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNiwidHlwZSI6MH19fSx7Imhhc2giOiIyNmQ3NjBmNTRhMjY1ZDkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNiwidHlwZSI6MH19fSx7Imhhc2giOiJjMDQ2YmVjNDI4ZjYwMmQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNiwidHlwZSI6MH19fSx7Imhhc2giOiI3ZmJlMmM5MjkwNjI5Mzk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNiwidHlwZSI6MH19fSx7Imhhc2giOiIxNmQyNjFhNmMwM2MzZGU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNywidHlwZSI6MH19fSx7Imhhc2giOiIxNzg3YzQ5NTIyY2UwMjc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOCwidHlwZSI6MH19fSx7Imhhc2giOiI0NWNjZjk5YWMyZWQzYWYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOCwidHlwZSI6MH19fSx7Imhhc2giOiI4YzQzMTI2OGNjNWMxMTZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI2NDVkZDJhMjc5YTc3YmY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI1M2FhZjRiNGYyZjJjYzhiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJhNjE3NWMzMWZjNTg3ZmEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMCwidHlwZSI6MH19fSx7Imhhc2giOiJjMGU3YzJhZDNkNWQyOGEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMCwidHlwZSI6MH19fSx7Imhhc2giOiJiNmEzY2UwZGVhNjVmNzYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMSwidHlwZSI6MH19fSx7Imhhc2giOiIyOWUwN2RlODk4ZmExOGY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMSwidHlwZSI6MH19fSx7Imhhc2giOiIxOTU5ZWZhYWUxMTdjOWZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMiwidHlwZSI6MH19fSx7Imhhc2giOiIwYTU5YzMzMjUzZjE1OTcwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMywidHlwZSI6MH19fSx7Imhhc2giOiIzODMxNjExMzM0NjdkMTJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyZTE4ZTRiYTc1YzhlNTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMWY5ZGE2OTRhZTZkZDdjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NCwidHlwZSI6MH19fSx7Imhhc2giOiI1MDM4YjRkZTc4Mzg0OGQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM1NDJiOTVkY2FhMDhjODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdiYmJkZmViM2Q3YjhhZDMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExNSwidHlwZSI6MH19fSx7Imhhc2giOiIyZmY1N2M1MDNjNWYxMTBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNiwidHlwZSI6MH19fSx7Imhhc2giOiI3NTU4ZDQyOTM4NDFlMWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNiwidHlwZSI6MH19fSx7Imhhc2giOiJhOGFkYWQwNWE2ZmY1OTQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNiwidHlwZSI6MH19fSx7Imhhc2giOiJjZDFhOTFkZWUyMjQ3OGQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNiwidHlwZSI6MH19fSx7Imhhc2giOiJlYmNhMjQzYWYwODUyMTBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNiwidHlwZSI6MH19fSx7Imhhc2giOiJiYzdmZTBkYzViZjNlODY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM4OTRhMGUzZjZhNmI2MjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAsInR5cGUiOjF9fX0seyJoYXNoIjoiYmZkYmE1MTNmOGNiNWI4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMCwidHlwZSI6MX19fSx7Imhhc2giOiIxMjI3YzYwOWY4OThhNzA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjRmODg0MDY1ZTFlODhkZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAsInR5cGUiOjF9fX0seyJoYXNoIjoiOTNkNTk1MGVhMGJmZTQzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMCwidHlwZSI6MX19fSx7Imhhc2giOiI1NjBjNWI4ZTIzZTI5NzMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI4ZDc0YmZjOTRjOTYzNWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAsInR5cGUiOjF9fX0seyJoYXNoIjoiOGY3ZjgzZTRmNWY5ZTJjMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMCwidHlwZSI6MX19fSx7Imhhc2giOiJmZDJiNWQ4NjBmZDQ0NzQ5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMCwidHlwZSI6MX19fSx7Imhhc2giOiIxZDA5NTM5NjFhMTRkMmZjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNWVkZjYzMzUzZDhlMGZjZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTRlNWViMTEyOTlmNzAzZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU1Y2YzNDQ1ODQ3ZmVmOTMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExOCwidHlwZSI6MH19fSx7Imhhc2giOiI4NDQxYTIyMTYxNjdjM2Q0IiwicHJlZml4ZXMiOnsiYXQiOnsicHJvZHVjdCI6OTksInR5cGUiOjF9fX0seyJoYXNoIjoiYjlkYWI1NzQ1N2NmNjQ3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OSwidHlwZSI6MX19fSx7Imhhc2giOiI5NGI1NTU5NmFhZGIyODkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE2YjMxMDI3ZmQ0MGM5YWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTksInR5cGUiOjF9fX0seyJoYXNoIjoiYmI0YWRhYmJhN2IwYjZiOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiMjEwNTQ2OWYzNTYzZTMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyMCwidHlwZSI6MH19fSx7Imhhc2giOiIyZjI5ZDM4MDUyYjVhOGE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMSwidHlwZSI6MH19fSx7Imhhc2giOiJjMTMzNzg3YmQ5ZTYwNWE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMn19fSx7Imhhc2giOiJiOWE4M2Q4YmQ0ZjMxNTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMywidHlwZSI6MH19fSx7Imhhc2giOiIyYTFiMDRhZDEzZjI0MzUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMywidHlwZSI6MH19fSx7Imhhc2giOiJhM2M2YjVmZmQ0ZmUxNTQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNCwidHlwZSI6MH19fSx7Imhhc2giOiIwZDUyYWFmYTMzMjgxMjI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNSwidHlwZSI6MH19fSx7Imhhc2giOiI2NTVlMzFlY2I4NzE5OTk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNSwidHlwZSI6MH19fSx7Imhhc2giOiJkY2ExN2JkMmYzZWRiOTE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNSwidHlwZSI6MH19fSx7Imhhc2giOiI1M2RlNTgwMDRmODhhMWMyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMjYsInR5cGUiOjB9fX0seyJoYXNoIjoiNmExZWJmNjcxMTk0YjQ1OCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZhZTVhNDg3N2FhYjU2NGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkY2Y4ZDE3ZWE0MjQ2NmUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyNywidHlwZSI6MH19fSx7Imhhc2giOiIzMmUwYWNiZjNkMmVjZmNmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzA4ZDI3NTQ2NmY1MjMwYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1MzJkODM0MjhlMDU0MTciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyNywidHlwZSI6MH19fSx7Imhhc2giOiIzMjU4ZTQ5YzVmNTA0MzA3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMmMzODFmYWFhMzE0NGEzNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc3NmE2NGNjM2E5YzZmODEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyNywidHlwZSI6MH19fSx7Imhhc2giOiJkMzgyNDdhOGU4ZDE0YTdjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTBlNWNhNzBkYmI2OWMwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzFkZmRlNDA1YzE3M2UzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNWJjZTUyYjBmMjIxYWFjMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNWEwZTU3MzAxNDUxNTZlMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzA4MWM2MjZhZDJjMGYxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiYTMxZjUzYzBjNThlNjdjMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTE0YjRmMTljYmRhYmI0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjY0NDkzYmI1MDQ2MDg3ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjRlNDBkNjgzMjQ5MzQyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTI2YjY0OTJjMGIxYjUzYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0OTNlNmM5MmM1OWZkNGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ2ZDQwYjQ0MTdmZWZjZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiMTZhN2NmOGRjYjcwZWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzMCwidHlwZSI6MH19fSx7Imhhc2giOiJlZGJhZTgwZjI0NDlhYWVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMSwidHlwZSI6MH19fSx7Imhhc2giOiJjMTE5NmIxNDE4YmY5ZGU5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiODcwMTZjMGYzNDE2MmJjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMmRiM2I4YWRiOWMzNzU5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTEwNzU2Y2NmYjAzNGE1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMWVhNzE4OGM1Y2MyMmNjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzcwZGZlOThjMzczNTk3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMDVhYTQ5ZDAyNGQ2ZDY3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMjdjMDg0MDE4NTdmNDdhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiOWE1NjkyNjZiNDI2ZDA3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNWE3NjRjMWY4NzBlNGUzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjRiOTkzNDA1YzM1MDM0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYWZlNjYwZWNhMmQwMTIxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiY2QzOThiMWQzZmU2Y2FmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYmIyY2Y1YTI3NTUyYmExMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYjc5ZWU4Nzc4ZjViNTZkNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiY2FlOTc2MzhiMzU3YTMwZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMmM1NTIyOTdhYTNhYmRmMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNzViYmY5MDFlZDMwZDg5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMzY1YmM3MTAxNjdiZTI0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNDk4NDlmMzQ5N2NjN2ZmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTRiYjg1NTU5MDc5NzNmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQsInR5cGUiOjF9fX0seyJoYXNoIjoiZGI2Y2IzODFlMjBhMjEwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQsInR5cGUiOjF9fX0seyJoYXNoIjoiOGU0ZTA3NDM3YWU0YjYxYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiYjZhMTdjOGI1ZWMyZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhZWZiMTA2Zjg1N2EwZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE3YjQ0NTI0MjhmOTMxMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM4ZjAxZDA1MGZlYjUwZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0YWI3MGJhN2NhZjFlZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0NjU1ZDljYWRkOGU4MjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYzMzQ3YTc1ODQzZmQ5YzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYwZTI4NTZkMzJjMWRhMjMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzOCwidHlwZSI6MH19fSx7Imhhc2giOiIxNjQ2MGIxYWM2ZTNiMjI5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzksInR5cGUiOjB9fX0seyJoYXNoIjoiODE0ZmVmOTNkNjQ5OGI1OCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcyZmMxZDdjNDBiOWFmMDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwZjg5NDQ0MjNjYzkzNmMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE0MSwidHlwZSI6MH19fSx7Imhhc2giOiJiZjJkYjIwYjA5OTYwYzdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MSwidHlwZSI6MH19fSx7Imhhc2giOiIxZTkwYzYyNWRhNjY4M2E1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MiwidHlwZSI6MH19fSx7Imhhc2giOiJkMzg1ZTUxNGZlOTJlNmQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MywidHlwZSI6MH19fSx7Imhhc2giOiI0NjQ2ZTQ2ZDU1NDU1ZmZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiJhOGM1ZjQ5ODMxYjM2YWI5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNDUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjIyMjc2ZWRhZjAwNTIzMSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQ2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyMGRiNTI2ZWI4NDk5MmQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE0NywidHlwZSI6MH19fSx7Imhhc2giOiJjZGEzZDk2MTIwMjY4NjZjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNDcsInR5cGUiOjB9fX0seyJoYXNoIjoiOWY4MDE4YmNiZjE1YTU5MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijc4ZWMzNDI5ODY2NTQyMTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU0YWQ5NDgzNzA5NWE5YmMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE0OCwidHlwZSI6MX19fSx7Imhhc2giOiIzMjQwMWIyMTE4ZWZmNTdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0OSwidHlwZSI6MH19fSx7Imhhc2giOiJhNWY5ZGI5MmNiNWFlYjNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0OSwidHlwZSI6MH19fSx7Imhhc2giOiJhZTEyZGI3ZTA2MjFlYzBiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNDksInR5cGUiOjB9fX0seyJoYXNoIjoiZDdjNDk3MGZkZTMxZmQ2MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwY2FkYWI3YWJkYWU3NTIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1MSwidHlwZSI6MH19fSx7Imhhc2giOiIzODM2M2Y3YWM4NzJhOTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1MiwidHlwZSI6MH19fSx7Imhhc2giOiIxMTQyMTVjNmE1YjY2ZTM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1MiwidHlwZSI6MH19fSx7Imhhc2giOiIxYWI3YjI5ZDEzNWMxMWZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1MywidHlwZSI6MX19fSx7Imhhc2giOiI2ZThlMjFjZjUwMzg3ZDViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1MywidHlwZSI6MX19fSx7Imhhc2giOiJjYmQ4YzQ2ODU1NjkxYWM5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNTMsInR5cGUiOjF9fX0seyJoYXNoIjoiOGJkZTBkM2JhNzMxYjI0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNTMsInR5cGUiOjF9fX0seyJoYXNoIjoiZDQxNTY2NGY0Nzk0MTg0ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNTMsInR5cGUiOjF9fX0seyJoYXNoIjoiYmM4ZWRhZDUyMDhlMzZhYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTUzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjAwOTAwZTRhZjM3OTViN2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImRkZGQ0MTY2NzVkZTk4ZDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjA4NTgzNWNiYmVhM2FmNWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBhNWZkNTU1ZWQ5ODljZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjM4ZTZkZmEwNDU5OWQ2MTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI4MmFiMjEzYjU3ZDgxOTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTU0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ2NTkyMjk1OWZkMTk3ZGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1NSwidHlwZSI6MH19fSx7Imhhc2giOiIwN2I2NGM2ZDk0YWFlZWRlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNTYsInR5cGUiOjB9fX0seyJoYXNoIjoiODI4NWVkNzVlYmJhYjFiZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM5N2RhMjM1ZjljNmM0ZGMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1NywidHlwZSI6MH19fSx7Imhhc2giOiIzZTQzODA2NjlhOTdhOWRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1NywidHlwZSI6MH19fSx7Imhhc2giOiIwY2Y3YzNkYjI4M2U0ZmRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1OCwidHlwZSI6MH19fSx7Imhhc2giOiJlM2Y2MTA5NjZlZTQ5OThlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1OSwidHlwZSI6MH19fSx7Imhhc2giOiI1NDU4MzMyZWYwZWZmNWEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1OSwidHlwZSI6MH19fSx7Imhhc2giOiI3NTUzOTE4MzFjYTNjMTcxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNTksInR5cGUiOjB9fX0seyJoYXNoIjoiODJkNzc4NWQxMzc1MDU3NiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYxYjEwYjI4ZThhMWU4YTkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1OSwidHlwZSI6MH19fSx7Imhhc2giOiJjYTlkYzgwMTQxY2YxOWI1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNjAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDAyMTczYjg1N2Y3NzlhMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk4N2JlYzhhMWMwN2EwMmYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE2MCwidHlwZSI6MH19fSx7Imhhc2giOiJkYTE4YWU5NGY3ZGQ5OWFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiI1ZTEyNTZjNWU5MTlkYWY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MiwidHlwZSI6MH19fSx7Imhhc2giOiI5ZTkyZWZhMDZhMjZiODNkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNjAsInR5cGUiOjB9fX0seyJoYXNoIjoiY2YzYzhjMjRhMGViMjRhNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhYzI0YTMwYTkyODcyZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1MDgxMDVkOTIyODc2ZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI3ZjE1NTFlNmMxNjE1ZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImU1NmEzODhhYWU2ZjA2M2UiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE2MywidHlwZSI6MH19fSx7Imhhc2giOiJhZGM3NWQwMDg3ZGYzZTg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NCwidHlwZSI6MX19fSx7Imhhc2giOiI2ZjBjYTA5Y2RjMTQ3ZmIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NCwidHlwZSI6MX19fSx7Imhhc2giOiIxMWY2Y2EyMGQyMjlkOGFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NCwidHlwZSI6MX19fSx7Imhhc2giOiJlNGQ1NTYzNGI4ZDMxMjZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NCwidHlwZSI6MX19fSx7Imhhc2giOiI2MTAwY2MwYTYyMmZhYThlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NSwidHlwZSI6MX19fSx7Imhhc2giOiJhMzBlOTlmMDAwZjc4MWM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NSwidHlwZSI6MX19fSx7Imhhc2giOiIxZWU3Y2I1NWFlMmNiMDcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NCwidHlwZSI6MX19fSx7Imhhc2giOiI3ZGZkOTgxZDRjMDE4OTUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2NSwidHlwZSI6MX19fSx7Imhhc2giOiI1MDExY2I5NDU3OWJhYmE1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiYTBjZmY4OWIyODZmYzMwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNDc4MmU3NWQxOTVkMzE0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiZTYzNDcyMzI5YjA0YWFiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNTgxNGU3ZGExMWQ2NTEzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiMjZjOWI2NTNlZjZiZmI1MyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImViMzhiMzY1OWEyMzJhNTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4YWJjZGI5MTg0ODc3ZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY1YTQzOWZmMDljOWY3ZGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzYWZjNTA1ZjFmNTQ4N2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzNWE0MTMyOGYyYTY4MzAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE2OCwidHlwZSI6MX19fSx7Imhhc2giOiJlN2E1OTZhZjk0YWQ1NTllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2OSwidHlwZSI6MH19fSx7Imhhc2giOiIyNWNjYzI1YzExMjYwN2U5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2OSwidHlwZSI6MH19fSx7Imhhc2giOiI0NGU2NTI5OTA4MjRkZGVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2OSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZWFjNDhmZGE0Y2NhZWM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2OSwidHlwZSI6MH19fSx7Imhhc2giOiIwYjRlZWU5MmVkNzJiOTkxIiwicHJlZml4ZXMiOnsiYW50LSI6eyJwcm9kdWN0IjoxNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiZGFlNzhhZmU1ZDVjYzY5OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNzcyOWQ0MjNhN2ZjM2FkZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTUsInR5cGUiOjF9fX0seyJoYXNoIjoiY2RmZjFlNDQyNTA5ZmFmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiYTA3ODI5ZWY5YTlkNjc2MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQzYzE5ZjA1MjM5Mzk5ODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJjNGYzYjc2ZWJmYWZlODAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3ODYwMzY5MmIwOTQ5YjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhODg0NGExZDNlN2MzYWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE1ZWYyYWFmYWEwM2U2MGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmMWVmNzEwNDZhMzU5ZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJmYjVkMGQ4MWFiZDQzYmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1Y2UxZDFlZGFmOGY0MjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTcyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE3YjgwYjA5OTI3MDM0ZjciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3MywidHlwZSI6MH19fSx7Imhhc2giOiIzYTk2ZjM4NWZmNDAyYWI2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTg5YzNiYWI2MzFkMDljZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiM2Q5MTA5YTJlODFlZWUyZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTcxNzBhY2ZmNWQ2ZmRhMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTA0OTZjODhkYTIyMzcxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTlhYjRlNzc0NDU0MzI0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjZiMmIyMWEwYTA0MTdiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzUsInR5cGUiOjB9fX0seyJoYXNoIjoiNDM4NGE4NGU2Mjc2ODYxYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFjY2JjNWI5MWY0YzVmYzkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3NywidHlwZSI6MH19fSx7Imhhc2giOiI0ODQwMTkyYThjYjRiMWNhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYjUwZmFmOGM3ZTVmYzM4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNzgsInR5cGUiOjF9fX0seyJoYXNoIjoiYmRjZjhlZDUzZjFiMzgwMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTc5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQzMWU3YzRlZmQxYTUxOTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3OSwidHlwZSI6MX19fSx7Imhhc2giOiI2ODMxOGM2ZDhmNzIxMzNiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNzksInR5cGUiOjF9fX0seyJoYXNoIjoiYzBjNGViMGNlNThlZjRiMSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTc5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFlNzEzZWUxMDIzMTIwNGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE4MCwidHlwZSI6MH19fSx7Imhhc2giOiJlNDI4MmNlZjg1ZWU1NzI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4MSwidHlwZSI6MH19fSx7Imhhc2giOiI3OWY2YzNkMTZjMjc4ZTk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4MSwidHlwZSI6MH19fSx7Imhhc2giOiIxM2U3YTdiNmM0MGVmMDViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4MSwidHlwZSI6MH19fSx7Imhhc2giOiI1N2U3MzZmYzA0NWY4ZmJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4MSwidHlwZSI6MH19fSx7Imhhc2giOiI4MjEzN2E0YTJhYTE3ZjMzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGRjMzA1NzEwNzQ5ZjViNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjZDc0NDQxZmMyMzcyMjYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE4MiwidHlwZSI6MH19fSx7Imhhc2giOiI1YjQwMDAwYzg1OGI3MzBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4MywidHlwZSI6MH19fSx7Imhhc2giOiI0N2Q2NmQyOTM2MzMyMmNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NCwidHlwZSI6MH19fSx7Imhhc2giOiIxMGEwZWZiOTk5ZWVkZjkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NCwidHlwZSI6MH19fSx7Imhhc2giOiJiMWJmMjlhZTM4M2VhMGNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NSwidHlwZSI6MH19fSx7Imhhc2giOiJiYWEyNmRmMDRkYmNlMTk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NSwidHlwZSI6MH19fSx7Imhhc2giOiJjM2Y4MDdmYjEyZDY0ZWYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NiwidHlwZSI6MH19fSx7Imhhc2giOiI4Y2FlZDI0ODcxMWQwNjZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NiwidHlwZSI6MH19fSx7Imhhc2giOiIwMzUyNDQ3MmI3MWJhZjZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NywidHlwZSI6MH19fSx7Imhhc2giOiJjMjZhNzU0YWZjZjg0OTZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NywidHlwZSI6MH19fSx7Imhhc2giOiJmYTdlYTRjMjQwMGI5MzA0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NywidHlwZSI6MH19fSx7Imhhc2giOiJmOTFkMTJlYTA5NDA5Mzk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4NywidHlwZSI6MH19fSx7Imhhc2giOiJhMzQwNDEzOWE0NTE3MjZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiIwNzJmN2JmOGNlYTE4MDNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiI4YTZlMzI0YmJmNGUwMmRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiJlNTlmYWE4ZDM2NGMzYWQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiJmZTM5ZGUyY2MxNTUwZWU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiI0MTgwOGYxYTliY2Q0Y2RmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OCwidHlwZSI6MX19fSx7Imhhc2giOiIxNzc0ZmE3ZmVlZTlhM2JhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4OSwidHlwZSI6MX19fSx7Imhhc2giOiI4YmNmYWZhMzBiYjlhNDk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MCwidHlwZSI6MX19fSx7Imhhc2giOiIwNGExNTEwMGVlYmQ1MjM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiIzNzY2OWIwMmExMTU3NGQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJiMGU2MDljYWU3Njc3OGVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiI4NjAyOTYxMTkwMjQ0Yzc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJjZjYxNjBjYzU1MDgzZTNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJkOGUwMTQ3YzcwNjdlMDMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJmYTRlNjM4YWRiYWQ4NTRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJiZmMxMDRkOGFlNTQwNTc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiJhNzdiNjA5ZWNiOTQ4NTI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiI1YjJkNmM2NTEyYjkwODI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MSwidHlwZSI6MX19fSx7Imhhc2giOiIzZjBlZWZhZDU4NjVhNGVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MiwidHlwZSI6MH19fSx7Imhhc2giOiJiYTE0OWZjNDdiZmU5ZTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MiwidHlwZSI6MH19fSx7Imhhc2giOiIzZjhkODcwNWFlYWYyYTY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MywidHlwZSI6MH19fSx7Imhhc2giOiIzYWEzNzNkMTUwZTU1YmI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MywidHlwZSI6MH19fSx7Imhhc2giOiIwMTE2OGUzN2M1NDQwN2VjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5MywidHlwZSI6MH19fSx7Imhhc2giOiI5ZDAwODhlODc1ZDAzMjkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5NCwidHlwZSI6Mn19fSx7Imhhc2giOiI3ODkyNzE5ZjY1NjM0ZGFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5NSwidHlwZSI6MH19fSx7Imhhc2giOiI3NjkxM2MzMTRlNzI5OWYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5NiwidHlwZSI6MH19fSx7Imhhc2giOiJlYzNkMzAxYTEwNDlhMjljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5NywidHlwZSI6MH19fSx7Imhhc2giOiIwNDA3MjM3MTEzZDFlMDFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiIzYzJiMDg3MjdkYjk2ZjU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiIyOGQ4Y2RmMzBlYTVlNzVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiI0YmE2MDA2YzU5YTBhZmIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiIzNGIwZDgyZGE1NmE2ZTE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiJjOTI5M2I4MzI0ZjNhMzBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiI3OGFkNTM5NWJmMjJkZGQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5OCwidHlwZSI6MH19fSx7Imhhc2giOiJiMGE1ZWNmNjQ3MjM2ZDJhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxOTksInR5cGUiOjB9fX0seyJoYXNoIjoiN2Q3Y2Q4NmU1Njk2ODQxMSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjYWYwOTQ2ZDE4MDk3MTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE5OSwidHlwZSI6MH19fSx7Imhhc2giOiJjMWVlNzNjYTg1OTM3OTU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiJiM2VlOWZjYzdmNzczNDc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIwZGVkZWRkOTlkMjUxM2U0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiJlZmQ1OWEwMTk4MDI4Yzk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiJiNDNiNmMyMGYzMDA4ODQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZDk2ZjA5YTAzOWIyNmU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIwMzk0MDhhMTdmM2Q1MGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIxNmQ2OTZmZTUyY2FlMDY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiJlYmI5ZGE2ZTUzM2ZjN2U0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiJjOGFmYjE1MGViMWI2YWMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIxZTIxYzkyYWU0ZDA4MzMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIwN2VmNDIwZDcwN2JlNzJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiIzZDlmYjk1ZTMxMDhiNjQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiI5MzhlOTcxZTE4NmJlNGY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMCwidHlwZSI6MH19fSx7Imhhc2giOiI5NDY4MmRlNjVlMTFmMTI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMSwidHlwZSI6MH19fSx7Imhhc2giOiIzMjU0OGNjNDVkY2Y5ZTk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMSwidHlwZSI6MH19fSx7Imhhc2giOiJiYWE5YmY2MjA5ZTM4ODIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwMSwidHlwZSI6MH19fSx7Imhhc2giOiIyNWEyNjM0NTE0MjVmN2UzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDg3MWJhODFmZTczYjY5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjk1ZjAzOGZlYTExNDhhYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjNTU1ZDhhYTBhOTZlY2MiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIwNSwidHlwZSI6MH19fSx7Imhhc2giOiJhMzFmOWJjZTMxNjM0NzUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiJiYjBkNmI0ZWFjMTc3ODk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiIwMjcxMmRjODM0MTRiYzUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiIwM2NmYTkyY2RhZGQ2YzIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiI0ZDg2NDBlOTU1MzgwMDgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiI0MmFiNzhiYThkMjhkMGQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiIxMTNmMzVhNTk1OTkwMzAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiI5NTY2ZDc5N2MzOWJjYThlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiJjYWFiNjg3OGFhZjFiOTAwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiIxMzU4MWFmNDJkMjljM2ZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiI4YWQ0ZTliNTliNmNmZWJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNiwidHlwZSI6MX19fSx7Imhhc2giOiIwMjUyMjNiZGE3NzlmYjUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwNywidHlwZSI6MH19fSx7Imhhc2giOiI2Yzc5NzBkOGZlMTFkOTQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwOCwidHlwZSI6MH19fSx7Imhhc2giOiIyMjZjMzc3ZDE5YzI0ZGNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwOCwidHlwZSI6MH19fSx7Imhhc2giOiJiYzY0NDc1Y2MzNWFiYTY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwOCwidHlwZSI6MH19fSx7Imhhc2giOiI4YTE4NDI5NzQ1N2NkNGUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwOCwidHlwZSI6MH19fSx7Imhhc2giOiI5MDBmOTdhNTMyMGFiY2M3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIwOSwidHlwZSI6MH19fSx7Imhhc2giOiIzOWIxMDJiYjJmMDFkMWI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIxMCwidHlwZSI6MX19fSx7Imhhc2giOiJhMTQ0YzY0NDJiYmM4YTBhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIxMCwidHlwZSI6MX19fSx7Imhhc2giOiI4MDIwY2FjNGU4ZmVlMDIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIxMCwidHlwZSI6MX19fSx7Imhhc2giOiIyZGNlZmU1ZmUxMDZlNDc4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMTEsInR5cGUiOjF9fX0seyJoYXNoIjoiZDhmOWE5NWMwZWEwMDg1MyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjEwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjgyOWZiZWVmYzQ1YmNhODciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIxMiwidHlwZSI6MH19fSx7Imhhc2giOiIzNTdhMDRmOTNkMjVhZTU2IiwicHJlZml4ZXMiOnsiY2RuIjp7InByb2R1Y3QiOjIxM30sImxvZyI6eyJwcm9kdWN0IjoyMTN9LCJ0cHMiOnsicHJvZHVjdCI6MjEzfSwicnRiIjp7InByb2R1Y3QiOjIxNCwidHlwZSI6MH19fSx7Imhhc2giOiJlODhmMDQwZDgyMDM1Mjk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIxMywidHlwZSI6MX19fSx7Imhhc2giOiJhMzc4ZjlmN2IzZDUyNDFjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjY1YWI5MGZhOTVmYjMwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMTM1ODYyM2UyNzFjNGQ2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYTExZTdhNTc5ZmE5ODk3MCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkyMjVhYWVkZjA1OGIyYTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjE3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjM2NzAzODg3YWM0OWI4NGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjE3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVhYmZkZjEzZjM4Yjc2NzEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIxOCwidHlwZSI6MH19fSx7Imhhc2giOiJlNmM2MGI1ZThiYWI3NTg5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDRjYTRlNmM4YTBiZWRmMCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlMjg5OWM3Njg4ZmI2YjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjE5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhOGY0NjNlODA3YWI1OTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjE5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRjNDk1MjQ5OTk5NTQ4NTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjE5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk5YTRkYzJjMTRkYWM2NDgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIyMCwidHlwZSI6MH19fSx7Imhhc2giOiJlYjRkNjMzMDAyYzM1MTAyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTQxNTU5ODg4NDlkOTg5OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTI5ZGMxNWFiNjdlNDEwOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0NGVkMmYzODNhNDFjMTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIyMCwidHlwZSI6MH19fSx7Imhhc2giOiJmMWQ0MTUyM2Q3NDJhNGM0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGM5ODVjNWJlZTQ2ZGNjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNmY5MmE0MTY1MzYwNjU5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiZTY1YjE0YjFkZTc5N2Q1ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiODkwODA1OGVlYzY3NWI4OCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZGFlMzU3YjUxMDVmYjU0MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiN2U1YzUyODZiYzYyODZhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI2NDU5NDYzYTU5OWUyNmNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0OWMxNDk5OTk2M2ZhN2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZjc1MDhlY2RmZDFiNzZmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI3NDdhYzNjMjExNGRlOTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU0NDVlOTY1MDk2NmYyYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYjcwMTM2OGI2OTY0ZjI4ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiJiOGQ0ODUzMjA4YjNkNjY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYzA1Y2UxNTM1YTFiYjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDExM2UwMmZhN2Y4MDMzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiIxZWM2YzgyOTlmNDdjOTJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyMTNkYjFjOTRmZjc4YjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYWZkY2UxZjYzOWYwNTI5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiJjMDA4MDAxMDdmMTMyYmE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5ODljZjU2NzhhNmNkNzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzI0OGQ2YmIyZTJkMjgxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI1ZGVjZWMzMjA0OTVkNDZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmZmZkMTc2YWU2MDk1Y2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYTBlYWQ0NmNjNzc5N2ZjNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiJkMWIzNjE4MzcwOWNmOTdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwOGUwZjRkNDY3NjIyNzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTA4MjQ1MGZjZTQ3MWFlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiIwYzQ0YTcyMzU5ZmY5NjJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM2Y2VkNzIzOWZhNTI2YjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYmNkNGFmY2IxNmExYmY4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiJjNDYyOTQ4M2UwZjYxODQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhOGE1MWRjNTA1OWViODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTBkNDg0NmUwYjBmNjIxMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZTAzZTk2MDU0Y2RlMzA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQxYzU5MTQ1M2VlY2ViODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYTllZTVlMGIwNzkyNGNiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI0OTA5ZDBmNjhkN2Y3ZGQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE5NTRkY2FjN2QzNmU5YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiODU1ZmFiMWI0NGIyY2MzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI5YTk3N2RlNjliNjllNzY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyYzc5OTliOWEzMjhkNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNjc1YWFiNzZkNTFlNGJlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI0NTRmMzVkNDc4MDg4YjJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFmNmYzN2NlMjI4NDc2ZTYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmYTI1NjUzODY1NTdkYmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiN2JkZWUxYjA4YjY5YjdmYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjU5ZTM4MTE5NzYxNDNkMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiIyOTYzM2NlZGM5ZmM3ZTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1OGZlYTRhMWUzYWQ4MGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiY2Y5YmQ3NDM1YzUyNmVmYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMSwidHlwZSI6MH19fSx7Imhhc2giOiI5MTM5MjhlNDc3YjY5ZDRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM5MWM3NzBmZWFhNDlmYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiOWFlYTExNjczYzM3ZGYwYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjIyfX19LHsiaGFzaCI6IjVlZmZmNzBkNjkzN2M5MTYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIyMywidHlwZSI6MH19fSx7Imhhc2giOiIwNzBmOTA3NWJkMDA3MmNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIyNCwidHlwZSI6MX19fSx7Imhhc2giOiIyYThjMTc3OTQ1Njk0OWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIyNSwidHlwZSI6MX19fSx7Imhhc2giOiIwZDM5OTRhYmVlZDQyYjUzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMjYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjgwNGE5YThlYjZiMjgyOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjI3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU3YjE2YTdmZTlkMTg4MDQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIyNywidHlwZSI6MH19fSx7Imhhc2giOiI5YTgyNjE1MGVhM2E3YjNkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDBmNDBhYWY3YWJlYzY5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjksInR5cGUiOjB9fX0seyJoYXNoIjoiYTQ3YjE2NDBlMTA4YzRlOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyMjksInR5cGUiOjB9fX0seyJoYXNoIjoiNzNjMmU4OWYzNDA1MzBjYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjMwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFiMTg2OTM5OWU1NTVhYzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY3OTJjM2QzMTMyYmY3ZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkMDJkM2E1MDQyZjVhZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3NWI4NjQxZDJlNTg1ZDciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIzMiwidHlwZSI6MH19fSx7Imhhc2giOiI1MzVlY2YwNWFlMjZlZjY2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMjM5MzIyMGFhZmNkN2YwNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjMyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhZDI2MjY0ODg5MTdkOTYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIzMiwidHlwZSI6MH19fSx7Imhhc2giOiI4MjQwMmFmNzczZDQ2MDc4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMGFmYWNmNTA5N2Q0Y2E3MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjMzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyMTVlZTkzMDBhZjgxMjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4ZDZlNTRlM2NlMzE3MTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4YWM1YTUyMmFlOTM2ZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM4ODA4MGE5MDkwZmE4MjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwNzI3YmEyM2U0MjcyMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0OTZlOGE0MWI4NDVjMWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzNDYzYTBiMGQ5ZDBiODQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIzNiwidHlwZSI6MH19fSx7Imhhc2giOiI5M2VmZjQxN2Q3NzNhZDc5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMzYsInR5cGUiOjB9fX0seyJoYXNoIjoiNDhjNzI3Y2IzOTEzMDIwMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmOGI4ODkwNzJmYzE3N2MiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIzNywidHlwZSI6MH19fSx7Imhhc2giOiI4MzBlMGY1ZGQxMTgxMjM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiJkYWY0ZWRjNzU0NWQ1MTY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiJmNzg2YzFkY2M0ZWI4ODNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiI4MjUzNGE5YWYwYmM0OGUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiIwOTFjNjQ4N2I4MGMzNDI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiI1MjUwZGE5ZjUzY2Q5MjhjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiI5YTg1MTRjMGZkNWQ2NzU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhZDkxYmM5OGQyYThiZTU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI5MWU1NzgwY2E0OGQ3NWNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI0ODFhY2ZjMjcxY2Q4YTEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJlZjJhMjNkYzY3N2Q4NDI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJjNmM4Y2UyOGIwNmJiZGE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiIyYmIyZTFlYTI0MTQ2YzBiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhMGYzZjUwNDFhZTM4OTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZDZjNWNlNDkzMDFjNzc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI3NDdjOTUyNTk5MjExMjg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI1OWYxZTZhNjExMGY5YTY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJmNzY4OTVmNjdkMTU4NWIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhMmUxMjVlMjM1ZDFmZmQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiIxN2NiYmZlNzYxNzcyNWIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiIxYzExOGNjODdjNjMyZTk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhNDgyMTdhZDY2YTU2ZWI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI5NDlmZDczY2E2ZmNjNmY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiI3ZDY0N2QzMTY0ZDhlNmUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJlNmQ5ZDYxYjY3ODVkODgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhYWQ5YTgxZWExMmQzYzQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJmMGQ5YjU1ODhhYmM1MGY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJkY2IzZGI3OWZjYWI2NDc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiIxOTg1ZDIxYzljMGI4MzY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhMjY4ZDIyZGM4NWI0MTA4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTc5NmYzMDBiM2QyYzg0ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjQxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiNTYzYzYzZDA5ZjNkNzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjQyfX19LHsiaGFzaCI6ImM2YWMxMGNjOWRkZmIzZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjQyfX19LHsiaGFzaCI6IjQ4OTgzYTBkNWEyN2IxMjAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI0MywidHlwZSI6MH19fSx7Imhhc2giOiI2ZjU5Y2FlYmRhYWMwMTllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI0MywidHlwZSI6MH19fSx7Imhhc2giOiI4MDkwYzYwODY1MWVjYTMwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDQsInR5cGUiOjF9fX0seyJoYXNoIjoiZTdiNzUyMDliZDczYTFkOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0ZmI0ZWQyN2FlOGNmODgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI0NiwidHlwZSI6MX19fSx7Imhhc2giOiI5MTU3MWEzNGZmMGZjZjQ0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDcsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQ2NjIwMWY0ZjkzNWE5ZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMwODU0YTM3MTYxMGZiZjIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI0OCwidHlwZSI6MX19fSx7Imhhc2giOiI0YTMyZmE5OTcxMTdmMDBkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDksInR5cGUiOjB9LCIiOnsicHJvZHVjdCI6MjUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4ZDAzNTZjMzNiZDhlYzQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI0OSwidHlwZSI6MH0sIiI6eyJwcm9kdWN0IjoyNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiODEzY2E5YWMzNDgzYWY1NSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjQ5LCJ0eXBlIjowfSwiIjp7InByb2R1Y3QiOjI1MCwidHlwZSI6MH19fSx7Imhhc2giOiJlZTg4MzgzMTQyZGEwMTRkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDksInR5cGUiOjB9LCIiOnsicHJvZHVjdCI6MjUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjEzMzJmM2RhNDMwOTFlZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjQ5LCJ0eXBlIjowfSwiKiI6eyJwcm9kdWN0IjoyNTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZjA0MDgyZDE0MjgyZDQ1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiYzZhZDZjNTgwYWVmNmNlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiNjQyNzA2YjBiMDMzNTUwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiOGUyMzY5OTk2MzU1MmIxOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhZmVkZmU2OWVkOTIzMDUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI1MCwidHlwZSI6MH19fSx7Imhhc2giOiJmMmI5OTljNTk3Y2Q5N2FmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjYzOTk4ODlhMDRmOTUxMyIsInByZWZpeGVzIjp7ImNkbiI6eyJwcm9kdWN0IjoyNTIsInR5cGUiOjB9LCJhZHMiOnsicHJvZHVjdCI6MjUyLCJ0eXBlIjowfSwiZGIiOnsicHJvZHVjdCI6MjUyLCJ0eXBlIjowfSwiaW1nIjp7InByb2R1Y3QiOjI1MiwidHlwZSI6MH0sInNzbCI6eyJwcm9kdWN0IjoyNTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZWE4NTEwY2RmNjk5MWQ0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZmMyZTAzYWFjOTQyNjU1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNmRiMzliY2M3ZTBmN2ZlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNGRlMDU5MGNhOTU0YjEzYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjU1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ0ZjRhMWIxNmZmODU2ZTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTI3Zjk3Y2ZhZWRkNzYzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMiwidHlwZSI6MH19fSx7Imhhc2giOiI1MDgwMzViZmEyZDk1ODQ0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMiwidHlwZSI6MH19fSx7Imhhc2giOiI2ZWEyMjU4NTlkZGZiYTE4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMiwidHlwZSI6MH19fSx7Imhhc2giOiI2MDBhNWE1ZjUzNzc1ZDQyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMTMsInR5cGUiOjF9fX0seyJoYXNoIjoiY2FiYmExNWM1ZWU4ZjAzOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjU2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVjOTg4ODFlZDYwZmZlNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYjFlNWRjYTIzYjkyODI1MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MCwidHlwZSI6MH19fSx7Imhhc2giOiI4N2U5MTlkNzJlMjkzMzAzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjUyZDdmZTAwNzk1MTJhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiOGUxYWZlZjRmYmYwNzlmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiM2Y2OTdmYjJjMDY2NTlhYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiY2I1YWU0Y2M5NGU4Y2I1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiM2NkNDRhMGY1MmQ2OWZlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZmQ4N2RmZTg2NzhlMjYzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjc0ZTQ0NzZjOGZiZmUwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZTNmNTZhMDA2YzRmOGZjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTFkNTgyYmUxODg5MzA3MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTQ3NjhjZTllZDY2NjRmYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNmRlNTgwMDE2ODY5ZjUyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2ZjOGE3N2U1ZjM2NmI2ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDY4MzhhZmEwY2U5Y2RlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDc4OGY5MjE2MWQ3NWI3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQyN2U5YzA3M2M3YjEzMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNzEwOTY5OTE4OTFkYzM2ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBhNDhjNjQ0OGNhMWFmODMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIzY2NlMmZmNWNlMzUxMTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI2MCwidHlwZSI6MH19fSx7Imhhc2giOiJiNjMzMjlkNjMzMDNiY2FjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNjF9fX0seyJoYXNoIjoiOWRhYjZmN2IwNjY5NTNiNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjF9fX0seyJoYXNoIjoiODNlZmRmYjAwZTVlMGJiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNWNkZjVjNThkNGE5NTc1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTg0ZTRjNzUyNzliNDQ0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMGFkMjc4YjBmMWJmODNjNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjMsInR5cGUiOjF9fX0seyJoYXNoIjoiNzUwODlmZWYxNTNiOTlkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjMsInR5cGUiOjF9fX0seyJoYXNoIjoiMTdlNDgxNzBiMjllOGM1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiOGZmM2ExNTlmM2EzZGQzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiZDVhZDZjZTM3ZDQxNmMyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiODI5MTE2ZTczYmJkNzY2ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjY1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjU4YjZhNzNiODExYTY3NDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiMDI3NTNkMWViYzU5MzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjY2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkNDc2N2IyOGEwYTNkYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjY2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0ZTQxMzhhZDkxZWJhNDMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI2NywidHlwZSI6MH19fSx7Imhhc2giOiJhODAyNTkwMDFhMDhmNWZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI2NywidHlwZSI6MH19fSx7Imhhc2giOiJiY2NjN2Q4NWZjYmQ2NDA2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYzBlMTJmM2Y2NDgzZDUzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNjksInR5cGUiOjB9fX0seyJoYXNoIjoiYWEwZDIzNDYzOTY5OTNkYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjcwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM5MWYwMmM4OTU3OWM0MWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI3MSwidHlwZSI6MX19fSx7Imhhc2giOiJkZDdlY2U4YzhiNGRkNGRiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiNTFiZWViZmQ1YTY3N2M3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiMTVhNTU3ZDFiZTBiNTViYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjcyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFiODAwZWJiNDVhYjVlOTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjcyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNmNjAwM2NmOGJlMTFjNDkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI3MiwidHlwZSI6MH19fSx7Imhhc2giOiJiZDk3ZjJkYWM2NzNjY2VmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNzMsInR5cGUiOjB9fX0seyJoYXNoIjoiODMzYTFiYjNlNDcwMDJiZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiOTI1YWZiNjNhODFkMjJhZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTM1NDZlZTYxNzdjZTFhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTZlODFhOTkzYjBkYzA5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTdjZjcyYTZiY2M2ZWQwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYWVmNTA4YTg3ZjdiOTM0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTFhMDk4NGNmNmUxMjU5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYzFiODJhOWU3NTY0ODgxZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyMGRkNmU4M2NiZDE0ZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImExZjAzZjQ1NWZjOTc4NTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiODc4MzA2NDhmMWZlN2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkzYTZiY2Q3NjYwZWY4OGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE0ZmJhOTUxMzkzYzRjYzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2YmY3MjkwMWRiNTM1NTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwY2VlYTEwZmVkNmY4MjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkZWI2Mjg4YWViNGIyMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwYTllNWNmNzYxYzJkYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI0OWZkYTMyMjk0M2VkNjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwMDY3MjQxYzE2YzlmODgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI3OCwidHlwZSI6MX19fSx7Imhhc2giOiIwNjA3NmI2NzJiZTNhZjQzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNzksInR5cGUiOjF9fX0seyJoYXNoIjoiMWUyM2ZmNjE0NDNmOTE5YSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjgwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyMzI3YjFmNmEyMWY1ZTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjBhOThiZDNlY2Y2ZDRmMzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxNDFhODE2MmFhZGQ1MmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjgxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1NjIxODVjNmEwNmUxOTQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI4MiwidHlwZSI6MH19fSx7Imhhc2giOiJkOGJlMWMxMjFjY2JkYjg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI4MywidHlwZSI6MH19fSx7Imhhc2giOiIxYjI3NDUxNmFjNjAxYzFkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyODQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTlhY2ViOWIyODY3MDUxOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjg0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyMDJlMzJlNzUwM2U3NjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjg0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNmMjA5NDc3MWI0MmIzNjciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI4NCwidHlwZSI6MH19fSx7Imhhc2giOiJhZDk0Zjk4YmZjMDA5MmNlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMmM5N2EyZTFmN2Y1OWNkZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjU2MmRkMGExNzc3NmNmYzMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI4NywidHlwZSI6MX19fSx7Imhhc2giOiI4NWM0MDljZGI3OGE2ZmVjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyODgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjVjZGMzNzJmMTRhYTYzNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyODksInR5cGUiOjB9fX0seyJoYXNoIjoiNDkwYTY5MmZlYjRmNWY4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyODksInR5cGUiOjB9fX0seyJoYXNoIjoiOGNkMTgyY2E0MTNhNjc3MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyODksInR5cGUiOjB9fX0seyJoYXNoIjoiODkxZmY3OTg2MjYwM2NhMSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFlNDU5ODMyNGVlMTBjYjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY2ZWFmZWNiMDY0YTZkM2YiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI5MiwidHlwZSI6MH19fSx7Imhhc2giOiJkOTkyMTA5MGQ3NWIyOGYzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyOTMsInR5cGUiOjF9fX0seyJoYXNoIjoiNGM4OTczNzJiMzIwNWM2NyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjk0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4MTcyMDUxYjE0N2ZmNzEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI5NCwidHlwZSI6MH19fSx7Imhhc2giOiIzZTMyZTUwMTYzNWJiOTk0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyOTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYWIzNjM3ZjdmZjE5ZjNiZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiZWFjYjM0OGMyYmZkZTdjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNmVjODg0ZGMzM2FmZDhlMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNmEwYjQ0YzI2OGUwZWEzNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNWVjMmJhNmYxNjQ1NTI0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjZhMTY2MTA1OTU4MzQwZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMWJhZmExOTRlMWI0Mzk0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiYzRjMTA0OTJjZjNmMWU1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZmIyOTk5NmY0ZGJlODZhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMzNjYmE0MTljMGQ5OWMzNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTQ3MWUzNTU3NTNlMzMzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiODQ0NTQ3MWU3NGFhZjFhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZmU0NDhmYzhmYTY3OTJjNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNzE0MmQwZjdjOTVlNmMxMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjcxZTc5MzlhM2EwNmI4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMjVjOTQ5M2Y0Y2VlZjBiMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFjMDQ4NmY1YzlkZGNjYzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mjk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxMWY1MzU1MmQ3YzA3ZjkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI5OCwidHlwZSI6MH19fSx7Imhhc2giOiJjMjNiODE2OWU4ZDZmOTM1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyOTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNGNiNzJmYTE3YzFlNmIyMSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mjk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmNTg2NmJlYjNhMmRhMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFiNDAxMWRmNzQxMmU4NWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRjNTVjOTlmN2U3MzFlNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzMmRhZDk1ZGU0ODY0YmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwNjM2Y2RhYmY3NTkyZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjllMDExMzgzMzM5ZTY1YzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3ZjZiOTdjOGE3ZGVmYTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhMjk3NDNlNTM0NjMxYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmOTg2YmJkNDNlZjEzMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyZTM5MzQ5YzA0MzRlMzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiOTIwZmFiZjYxZmQ2ZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2OGYzYTBjZDdlMDMxMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1Y2NlNGY4MGM0OTIzOWYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMwMiwidHlwZSI6MX19fSx7Imhhc2giOiI3NjcyYzBlMjU4ZTBhMjBiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIwNjVhYzdmNTg3MzdiNzU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJmMGMxNTg1NWUzNDE4MzQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI0NTA2OGZlNmE1ZmU4M2MwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTNmYmZhODM2NjNhNDBhNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyNDFkMmFlODZmZjMwN2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdiOTI2OTBjMTIzMmViMjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU1YjFhMTVjM2E3YTFlZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwYjQwNDg4ZDllY2Q5YTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzNjAwYzkyNDJmMTBiMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4OWU4MWMxZWQzMTRjYzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI5N2YwNTcxMTU4ZWY1NzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyMjhlNWNlMzZjMDA3YzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5OGJjYmY5NDE1ODczZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFiMDNmM2I0OTYwMzc4NDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVjYTAxZjA1MDhmYmYzMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBkODM5ODk4ZmFkZTMxOWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRmYzAxMGIxZTUyY2UyNTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxZTdmYjgxYmYwZWM1MmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE2ZWRmYTA3NGNlZmY5YzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4OWRjNzVhOTEyZGNjOTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVhOGRlODkyNmM0MTA3NTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5Yzc5OGE5ZDhlMzJhZmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYxNjE3MDU4ZTYyMDYyODMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzA3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNmOTQ1NzY3YTJmYTc5ZjMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMwOCwidHlwZSI6MH19fSx7Imhhc2giOiI1NDFmODVjYmM3MTBmMmIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwOSwidHlwZSI6MX19fSx7Imhhc2giOiJjODAwZTc5OGUxNjBmZTg5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNzc1MDM1YzRjNDkwNTdlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMmEyNjIyMTI5MGUyNGEwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZmRhOTY2YjVjNmVjMmIyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiODg3ZDE0OGE4YWU5OGIyZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzExLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjM1Yzc2YzkxNjVlMzM0OWYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMxMiwidHlwZSI6MX19fSx7Imhhc2giOiJkNWM3ZDEyNDBiZjg5ODllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxMiwidHlwZSI6MX19fSx7Imhhc2giOiIxZTVlYTU2NjkwYTA3MTZkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYTU0NjYxNzc3ZWY1MTE4OSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzEzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjNjczYzkwYzhhYmU4MzAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMxNCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZjRiMGNiYjk1NTUyYjNmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYTc4ZTEwOTZiM2MwM2ZiYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTgyZDk3M2I2OTM5MWViZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMTg1ODUwNzZhNWIwYzZkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMWRmNGVlODZmYzY4MDQwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZWNkODBhNmE0NmY2YTFjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiOGVlODc2YWFhYWY1MzdlMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiOTJiYzRmMDExMTMzZjA1YSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzE2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIxMGQzNWQ2Y2RlNzYwODIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiI4ZTZlNWQ2ZGM0NzIwZjk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiJlZGM3ZjRlODdhOGVhNGEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiJmMGM3NmUwNzk4NWM1NmM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiJjZmYxYjMxMzc0ODJlNWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiIzM2YyOGM1ZWJiZDQ1MjVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxNiwidHlwZSI6MH19fSx7Imhhc2giOiI4NDljODMyNGQ0YzMyZWE1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiMGJiY2M2MWVkNjBhNjNjNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiN2RhN2I2OWNmMTMwZjg2NyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI0YmY3ZWUzNDg4MjMyNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGZjMDg1OGU4ZDQyYTA5NiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiOTRkMWQwNjY2NmY0NThiMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiOTUxNWY5MjI2ZWFlMGVlNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJjNjEwODUwYTUwMjg3YzZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOCwidHlwZSI6MX19fSx7Imhhc2giOiIxMzI0ZDEyZmQwNDcyMDVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOCwidHlwZSI6MX19fSx7Imhhc2giOiI5MjJkZjc1YjExZTRiZGI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOCwidHlwZSI6MX19fSx7Imhhc2giOiI5NGJlOWEwYWQ2MzZhY2MxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOCwidHlwZSI6MX19fSx7Imhhc2giOiI5MjFmODU4NjU1OTg5YmRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOCwidHlwZSI6MX19fSx7Imhhc2giOiIwZjQ0ZjZmMjAyNDAwN2UzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOSwidHlwZSI6MH19fSx7Imhhc2giOiJjNWQ1NDU3MzZlYTNmNDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiYzUxOTBmYjNjMTFlZmQ1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjAsInR5cGUiOjF9fX0seyJoYXNoIjoiZjhlMTliYmE2ZWNiOWQ0ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjAsInR5cGUiOjF9fX0seyJoYXNoIjoiNzhjYjllMzRlMThhNzBjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjAsInR5cGUiOjF9fX0seyJoYXNoIjoiNTU1Yjc3YTZkYmMxMDc3YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjAsInR5cGUiOjF9fX0seyJoYXNoIjoiMDRjZDMxOGQ4YzllMGFhMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjEsInR5cGUiOjF9fX0seyJoYXNoIjoiNDRiMjhhOWQzNTQ4OTQ2OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMjIsInR5cGUiOjB9fX0seyJoYXNoIjoiY2UyYTk3YTJiYzM5NzViMCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcwYzAzZTcxNzA0NjczMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImExOTU2YzU1ZjM3OTM2MmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4NzYxZTA5MjBiODZkMDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiNDlhMTdlYmY1NzViNGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiYTc2N2UzMjI4NzYxNjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiNjBiNGVkZWIwN2U2ZTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMyNCwidHlwZSI6MH19fSx7Imhhc2giOiIxYTJiMjYxOWUxNWY4MWVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyNSwidHlwZSI6MX19fSx7Imhhc2giOiJkMzNjNTQyMzIzNDU4MGQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyNn19fSx7Imhhc2giOiIzNWMzMDVkZmZmOGU5NTZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyNywidHlwZSI6MH19fSx7Imhhc2giOiJhYjk1ZmQzOWYzNGUxOTE5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiJlMzk0ZWFjMGMwOWU5NTJhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiJkNzU0NzU5Y2VkZjA5OGE0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiI0NjlhYmI1MDk4MzJkY2JhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4OWFkZTcxNTRjZGFmZDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiN2M0ZTc3YzcxNDZiYzI3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiIyNzk0M2E2MWFmNTY1NzhjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjViOWQ0N2QwMWUwNmUyMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWZhZTAzNzk5OWI4MzU0YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiI2NGIxYzIyZjE5NTg4ZTY1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNCwidHlwZSI6MH19fSx7Imhhc2giOiIxYjUwMDcwM2MzNzZkY2NmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyOCwidHlwZSI6MH19fSx7Imhhc2giOiIwYjhhNTExMWRhMmExOGU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyOCwidHlwZSI6MH19fSx7Imhhc2giOiI2Y2JkNjNiNGI1YTI1OGUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMyOSwidHlwZSI6MH19fSx7Imhhc2giOiIyZWNiM2U0ZGU1NjJkODNmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiYjAwMzJkMWYyOGRlNmI4ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzMwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ5NWIxMGY5NzM2OTcxMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3Yjg3NmNlMDRhYmRmYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJkMWQ4ODhkNTgwNTQzODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlYjlhNmEwZTc4NzcwZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkOTg5NzQ3MmNlYmRmZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwMzZlN2IyNjgwYjE3MjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlOGUyN2MyYTExOTVjOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4NWE0ZWNlMDI0NTQ0ZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ3MDVlNDllMmVjZmM1MDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRmZDBhNGEwMzJhMzQxOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2NDBmNjBkNDQ1ZDRkMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwNjdhZjEzM2ZiZjE2MmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyZTIzZThlMGE1M2IwOTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU3NjQzZjc5ZTEwZmRjOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZlNzBhZWYzNzFiODdlMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM4MGI4ODkwN2M0ZGE2NjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjMDI3YmVmMTIxNjc0MTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjllN2VmMDY2MzZkMGIxMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFjNTc3ZDJiYTAwMWMyZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiYWEyM2Y3N2NlYzk4ZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzMzLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg2ZTczNTIzNThlN2EwYTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiI0NjFhOWFhY2Q1ZGI4YjYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ1MjNjOGRkMzljYjEwZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzM0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE3ZWFmNGFlNDE1MjIwMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzM0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4NzRlZDVhYTYxMGRiNTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMzNSwidHlwZSI6MX19fSx7Imhhc2giOiIwZGM5ZWI2YzhiMWM3N2ZhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNCwidHlwZSI6MH19fSx7Imhhc2giOiI2MGQ2N2NkNjgxOWU3ZGU0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozMzYsInR5cGUiOjF9fX0seyJoYXNoIjoiMmFlNTI0ZWFjMTZiMDZmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzdlOTc0MDA2ZWMxMjViNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5ODVmYzEyMTA4NmVhZDgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMzOSwidHlwZSI6MH19fSx7Imhhc2giOiI0MDJjYTlmYmIzMDhhMWM1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNSwidHlwZSI6MH19fSx7Imhhc2giOiI1M2YxY2Q5YjA2YWVhNjQzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNSwidHlwZSI6MH19fSx7Imhhc2giOiIzNmIzY2NmYjkyYzJmYjcxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjg4MzJkNjI2YzBiMDkyNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzQxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFkNDc0MzAxYzE3MDQ5OWQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM0MiwidHlwZSI6MH19fSx7Imhhc2giOiJmZDFhYTk2NTA3YjJiZjQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0MiwidHlwZSI6MH19fSx7Imhhc2giOiI3Zjg5MGMwZmQwYzZhNGQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0MywidHlwZSI6MH19fSx7Imhhc2giOiI1NDllMjk0OTU3ZDc1NmQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0MywidHlwZSI6MH19fSx7Imhhc2giOiI1ZGMwNDZmNzdmMzJhZGYxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjM3YjQ0OWJhNTEyNjZhMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxM2JhM2RkNmIxOGVlNGEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM0NSwidHlwZSI6MH19fSx7Imhhc2giOiJkOTYwMjRjZjliYWZhOWQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZjBjOTA5M2QxOGI0ZWNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiJkNjNmOTYxZTBjOGNjMDU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiIxYmNmYjAyM2FkZWUyYjA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI2ZWQ2ZmI4MzhiZDk5NGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI5ZmQwN2MwMzBkNDU1NzhkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1MzcwZjdiMDI2Nzc5ZjQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiJjMzY3OTEwZDU4Mzc2ZmEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI2NzA5MjZmMzM3Yjg1NDkyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI3N2Q3MTI0YzhhYTg3ODE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzNzI2ZWY5MjM2YWVmZjU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI4NDA3ODk4MGRjN2QwMzEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI0OTY2NjZlZDkyZDMyYmU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzZThhMTlkYjRlN2RkOTFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzM2NmZGM5NTViZDRhYjkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1NDMwNDY3OThhZThlMzhkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1NDUzN2E3ZDRjZTZmYzM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiIyNDJhYjVkNDRmYWU1MDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiJlODFkNGFhODJkMDRkMDY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiI3YzdmNTVkOGE3NWNiOWJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiJlNGE4MmNhYTU5MTQxNDc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NiwidHlwZSI6MH19fSx7Imhhc2giOiJjYWYwNmRjMjY5ZTRjYmQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NywidHlwZSI6MH19fSx7Imhhc2giOiI3MDU4NGNkN2JjYjg4NzQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NywidHlwZSI6MH19fSx7Imhhc2giOiJjOWNhYmZlZjQ5YmI0ZWMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NywidHlwZSI6MH19fSx7Imhhc2giOiI5OTMwODlhMmQzMDY2MzJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NywidHlwZSI6MH19fSx7Imhhc2giOiJjZjA0YWFhYTVhZTVmMzgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM0NywidHlwZSI6MH19fSx7Imhhc2giOiJhMWNkNmE2NjhhZTg5YmM4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNDgsInR5cGUiOjF9fX0seyJoYXNoIjoiZjcyZGQ1MjkzZWJhM2NhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNDgsInR5cGUiOjF9fX0seyJoYXNoIjoiZTk0NmU2YjcxOGUwZTgxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNDgsInR5cGUiOjF9fX0seyJoYXNoIjoiMDFiNWU0NjlmM2I2ZDFkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNDksInR5cGUiOjB9fX0seyJoYXNoIjoiZjA5MWIzMTc1MzA1Y2NlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNDksInR5cGUiOjB9fX0seyJoYXNoIjoiMWEwOTVkMTkwMWYwOTQwYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZjY2Zjk5ZWUyMDEwNWMyYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzUxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg2YzI1MGNmMGRhMzE0ODEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzUxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmMjA0Yzc5ZDZiMjM3MzYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjMzMCwidHlwZSI6MH19fSx7Imhhc2giOiI0M2QwNmRiNmQ2NTI3ODc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1MiwidHlwZSI6MH19fSx7Imhhc2giOiI1Zjc2OTkwMTczOTUzODA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1MiwidHlwZSI6MH19fSx7Imhhc2giOiI3ZDM5NDdlZTk1MzNiZjMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiMjQxMzk2YWRjM2ViZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzYsInR5cGUiOjB9fX0seyJoYXNoIjoiYjhjNWY0NmZiODk0NTMzMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNiwidHlwZSI6MH19fSx7Imhhc2giOiJhZGU5Y2JjMmJlY2IzOTBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg3NGNmYTRlOWZlMjcyMzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzYsInR5cGUiOjB9fX0seyJoYXNoIjoiMmNkNmJlZTYxNGU5MTBmMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNiwidHlwZSI6MH19fSx7Imhhc2giOiI4NTRmMzdjZDFmNDQ0ZTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE5YTgzYzdhMmI2NzNhNmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzYsInR5cGUiOjB9fX0seyJoYXNoIjoiY2EzMTJlMDc4NzIzZDE3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNiwidHlwZSI6MH19fSx7Imhhc2giOiI0YWEyZDQxZmEyODc4ZDhmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg5MzFjYzNjMmQ2YmJiZmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTY3ZTg4ZGNjMGFmZTA1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNiwidHlwZSI6MH19fSx7Imhhc2giOiIzZjZjMDhiYWY0OGZhMGFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzMDNhNTgwNjFlYWFiZDEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM1MywidHlwZSI6MH19fSx7Imhhc2giOiI0ZmRjOGYyZmYxMjJjZTJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1MywidHlwZSI6MH19fSx7Imhhc2giOiJiYTc4YTk4NGFkN2E4YzA2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1MywidHlwZSI6MH19fSx7Imhhc2giOiIwMDg4NWNlODY5YjkzZWFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1MywidHlwZSI6MH19fSx7Imhhc2giOiJlYjU5ZjNhNjRiNDE1NjcwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NCwidHlwZSI6MX19fSx7Imhhc2giOiIyNDNjNzBmNjFkYTk3MzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NCwidHlwZSI6MX19fSx7Imhhc2giOiJlZDZiMjA0ZDZiOGYzNTFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NCwidHlwZSI6MX19fSx7Imhhc2giOiJlNjg4OGI1YmU0ZWNjYTIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NCwidHlwZSI6MH19fSx7Imhhc2giOiI4MDM0MzI3YzEyYzc3MTcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NCwidHlwZSI6MH19fSx7Imhhc2giOiJkNDhmOTUwZTAwMzZlNGVlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjExOGU0ZTBlNDAwMTM0OSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiMmYzZGFkZjA4ODljMWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ5MWFjYzk2OTI0MzdkY2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1YmUzOGU3ODlmMWMwNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkMTNjOWE5Mzg2N2NmZDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlZThiNzE5YTg1YjAzOTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzYzBkMzU3MjQzOWU5MTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQyYzEwNzM3ZTlkMmViNDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFlY2U3MDkyNmRiYjFlOWMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM1NywidHlwZSI6MH19fSx7Imhhc2giOiIxNWIxYjU2ZGI2ODZkNmI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM1NywidHlwZSI6MH19fSx7Imhhc2giOiI2ZjJmYjAxN2M1OTY3ODVhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNDViZDFjNGJhYzgyN2ViNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE0Y2MyOGE4NzM2NjNiZTQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM2MCwidHlwZSI6MH19fSx7Imhhc2giOiJiMWIzNDcxMDhjOTg3NWFlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTY4MGMzMjEzMmEzMTI5NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDY1NGYxYjNkMjlmMGEyYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiYzhkYWY1YTJiZWZjNzYyYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiY2Q3YzA0ZGNhYWI1NGNmMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNmE3YWMzYjIwYTgyNjdkYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0MDY0YTdlZjM3YzA0NjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4YTRlNDA1NjFmOWFjYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkZTE5ODdjZWE1NWU0YTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgyN2ZkOThjNjFkZjQ4MWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVlYzFhOGEyYTdmYjEyOWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjMWI3MjA5Y2NlZDcwMzMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM2NSwidHlwZSI6MX19fSx7Imhhc2giOiJjOTQ2YzBmZTVlZWNkNTVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJmZWI0M2Y1Zjk3ZGE1ODUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ4NDc5NzczODRiNzhmMWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiMzA4MjQxZDBmZTRkNjg5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiIyY2IzMDk5MGFhMDgyM2ViIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiIyYzI1ZWJkZTE3ODg4NmIxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJkNGVlYjRhNDczNmU4MzU4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiIxMjQ5ODEwOGQwMGJkMTA0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJjNzQzNzAxOTY4OGE1Yzg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImViYzU5OTQ0MmExZTYwZTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFiOWMyYThhNWVkMjYzNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiYzk0NzNlMWExZTkyMTNiYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiYTE1YmNhMDVmYjI5MjAxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiI4YzIzMzZjMWE4N2U5YzdlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiI2N2Y3MDc5YjUzY2UxNjBmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJhMDdjN2VhNzQzYmNhNzFjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJjZTA4NDk3MjZjYjc5MmZiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiI2ZDJmZWViNjMxNmJmOTgzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiIwNTYxMzIzMjhlYmM4YTNiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJjMGRkMjUxZWIxNTFiYmRkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiIwMmU2YjIzMGE3M2Q5NWFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYyY2VmODkxMjRjOTgzMWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFiYjJmYWQ5NGU5ZGZkOWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTUsInR5cGUiOjF9fX0seyJoYXNoIjoiMGJjYTM0MWFiMjg4MTE4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiJmYjcyNWM1NzgzMTIxYmM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiNmQ0NDJmY2IxM2RiZDlkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNSwidHlwZSI6MX19fSx7Imhhc2giOiI2MDIwYzU4NWFlNTQ2YmE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJmOTk0ZDc2N2ZjMjNlMjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVjODAxYmJhNzRiZjA4ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3MjdmNGM4YWYzNmM3NWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQwZmZhNDYxMDM1YmRmNmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImYxMzgxNTEzY2JiOTliZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJiNjc1YTRkMDQ4ZjZkNTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZmOTE1Mzk1MWQyOWQ3ZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjlhMmQ4OGE2NDM2NzA1NGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIyZmM1ZTAwY2M3MWIyY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzY4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQ2ODAyODc2ODBhM2I0N2IiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM2OSwidHlwZSI6MH19fSx7Imhhc2giOiI2NjU5ZmZlMGVjMGRiMWExIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiY2RlZjMwM2Y4MjdhNDgzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDM3ZDcwNjA3OGY1ZWYwZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiY2VmYTIzZjYwM2Y3ODI3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiOWJlZWQ1NGEyNDQ4ZjA5MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjEzMWZmMDJjZDhiMmI1ODUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM3MiwidHlwZSI6MH19fSx7Imhhc2giOiI3YjAzYTk5OWNlNjI2NDlhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDg4ODQ0NDk1NTUyNmJiOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzczLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0YmVkYWVjZGU4ZGU1MmUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM3NCwidHlwZSI6MX19fSx7Imhhc2giOiJiMjIyNzgzMmQ1YWFiOTdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiIyOWQxYTFhZjkwZmU0NzY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI1NWQ1ODg4OGFjMjFlMjhlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiIxNWEwYTU2NWMwOThiYjZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJjNzQwZjcwNDJhOTM2Zjk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI4M2I2MTMxNzI5ZDk4YjlhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJkZjYxMDc1YTM3NjEyMzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiIzMWQ2NjRiNmEwYzg2ZmM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJiM2YxZmRhNWNhMDhmNjZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJhNTA1YmQ4YzVmZGJlMzQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJmZjRiNmFkZTg1YzBmYTQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI1NWZiYjA1YjU3M2FiZmMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI3NTA5ZDA5NmI3NDBhOTRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiIzZTA1YWQ3MGU3Yjg1N2Y2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJmMzEyMmIwNWI5MTZiNGQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI3ZGY3NzQzOWNhMGFmMTY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI3YjZmM2I5MmQ4NDhmMTgwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJjNTBiM2ExMWM3NWMxZGUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiI0MmJkMmJkMDE2YzM2MDcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJkOTY0ZTExMGUwM2FkZDVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJiMmYzMWRjNWFlYTgxNDc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NSwidHlwZSI6MH19fSx7Imhhc2giOiJmZDNlNTUwNWM2ODliMWJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJlMjE5MzdkMDAxMWFlNWRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIwZjVlNGEwMzUzZGJmOTk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIwZWNlNzRlYjg2ODI2ODVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIzZDhlYTNmMGQ1ZDM4OWQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiNTYwMjMwN2U5OWU5NTM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJjMTNkZWNjOTY4ODRlYjlhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiODE1OTY0ZmQ0YjYzZmZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJhNDlmMmRiNTA5NzU3NjM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJhM2ZmODBiNDVhMmIwMDg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiMWIyYzEzOTljYmYxOWJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiYTQ0OTE3OTAzZjRhNmMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJhZDUxMzBlNWFhMmQwYmNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJjZWIzNzE1ODNjMzk0OGVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI1ZDVkNGZlNDk2YTdiNTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIzMGU4MDA4NGMxZTcyODVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJkMWQwZmM2YTAzNDk3M2I1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJlMjgxNGFiY2Q1Mzk5YTY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI5ZDRhY2QzNDMzNmE3M2Q0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJkY2JmN2Q3ODQxZjg4MzE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJjMTlmZTM3YTkyZDhhMWY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJkZDUwMmNiYzcwMGJlYjAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJhNzY5NDdiNjRlYTE4MjMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI3NTg3NWM1ZmNjNDcxZjBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI1MzIzZGJmOWY1NmJlZmM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJmZDNkZjgzOTIyNDcwMGM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJkYzU0NDUwNmUwYWNmMzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJmYmFkZWViMjVhYzc2NmE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJmMzQ0ZmE3MmMzYWNlYTk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJlMGQxOTI5ZjU0OTBiYTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIxNTBkNWM0NDQwMzRkMTZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI2M2M5OTkyYzM3ZGY4MWU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI5YTJmNjU5OTlhMjYwMmU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiMTNkMjFiYzlkNjBlM2NmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIzNjc3ODY4OGMyYzg1NTBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI3NzY0NjQxNjY1MzE4ZDdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiIxMzc4MzliYWM2YjUyZjExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiI3NWIxN2U3NDI3ZDg0ZWMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJmNTc2YjhmNmI1Njk4OTI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM3NiwidHlwZSI6MH19fSx7Imhhc2giOiJhMGJlZjQ4ODcxM2ZkOGJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiJjNGY0YjVkN2EzYmM4NzcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiI2NTJkZTJlMDI1N2NjNmY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiJlMWViODRkMjMyMmRkNTNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiIwNzU5ZTZlNjBlMjM4MDZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiJiOTdmOWQzYTAwOTJmNWRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiI2ZjdkMzIyYWFjNWY2MDkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiJkNmQyMDkyYWY5N2Y2NjcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiI3MDBiNDQ5NzQyMjI0NmQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiIyNDc1OGUwMDk3NGM0ODQyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjI5ZmIxZTIxN2VjMzI1NCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0Zjg0ZWM2NmRiNDVmM2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzc4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdiY2UwZDhkNzExNzUzZWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzc4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3NDhmNWNlOGU5YzRiN2QiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM3OSwidHlwZSI6MH19fSx7Imhhc2giOiJjMTdkN2RlZGMzMTg3NDljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM4MCwidHlwZSI6MH19fSx7Imhhc2giOiJkM2E2NWVlYTk5ZGViYzliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM4MCwidHlwZSI6MH19fSx7Imhhc2giOiJmMjhjN2ZjNGEwNmJjZmE3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozODEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTc1OTFjMzFjYmJlN2NmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODIsInR5cGUiOjB9fX0seyJoYXNoIjoiN2MzNTBmOGJjZjVhNTRiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTAwMzkzODEyMmY5YWM0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODIsInR5cGUiOjB9fX0seyJoYXNoIjoiNmRlYWMxMDFjYTQ2MzMxOSIsInByZWZpeGVzIjp7InN0YXRpYyI6eyJwcm9kdWN0IjozODIsInR5cGUiOjB9fX0seyJoYXNoIjoiMzA0ZTYzMTY2M2E4N2U2NyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MzgzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4NjQ3NGY5YzZhZDc5NGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzg0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlMDgxNmFhMzljOGIxNTMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM4NSwidHlwZSI6MX19fSx7Imhhc2giOiJkZjgzNTU2MTNhNDQ1YTg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE3MmYyYjk4OTc2MGM4ZGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZmJkYzE3MDRjMjg4NzNjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNiwidHlwZSI6MH19fSx7Imhhc2giOiJkNDY3NGNjYWY4ZmI3ZTMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYxODQ2NzdmYjdlMmFiY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTdkNjk1YmY1MDdlNDVkNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNiwidHlwZSI6MH19fSx7Imhhc2giOiJlYTNmNzQ2MzQyZjA1ZGJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2Y2U4M2E4ZjBkODRkOTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjJjNjQxMGYzZTQwMDBkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNiwidHlwZSI6MH19fSx7Imhhc2giOiJiNTE3MmE2ZWVlMDFhY2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM2ZjliYTNhNzM1ZWE0NDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjRkOTZhYjVjN2QwZjcyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNiwidHlwZSI6MH19fSx7Imhhc2giOiI3YzgyMDRhMTQzZTgzYWJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNiNWI3MmM0ZmRjOTBiMzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMDFjMTM4MjkxNmY3YTU4MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNiwidHlwZSI6MH19fSx7Imhhc2giOiI0OTUwNWZkOTllNzg3MDYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5MzEwMzBhNWRiZDczNDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiM2EwOWIyMjI2NmJhMGIxMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIxMzZhM2I2ZjY2MDBhZDAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM4NiwidHlwZSI6MH19fSx7Imhhc2giOiI2MDBlNDI5NTIzMDE0MjUxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozODYsInR5cGUiOjB9fX0seyJoYXNoIjoiZThiMWM5Mjc0YTY2MmFkMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDBmZmQ4MGVkYTE4OTc4MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTRhYjNjMzFmYWVmMmI5OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozODcsInR5cGUiOjB9fX0seyJoYXNoIjoiOTdkYjhkZDFiY2JjMzNiOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mzg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM2M2EwZjI2ZTY4MGQwNzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzg5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiZWY5YzFiMjhiMGNiMDUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM4OCwidHlwZSI6MH19fSx7Imhhc2giOiIyMjE4YjVjZTFlNjU2ZTIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiJhNTIwZjE2Y2Y2MTc3ZWJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiJjZGEzMTBkMzY1NGQwN2E1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiIyZmM1NTY3NTc4NTEwYWY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MSwidHlwZSI6MH19fSx7Imhhc2giOiJhYmFiMmQyMGU5OGMyNjZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiIwZDc4Y2YzYjA2ODEyMGMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiI2ZGE3YzFiMjVjYTg0NWIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MCwidHlwZSI6MH19fSx7Imhhc2giOiJjODI0ZGYwZmIwZmRmNDgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MiwidHlwZSI6MH19fSx7Imhhc2giOiI5Nzk2ZTAxNDcwOWNjYmVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5MiwidHlwZSI6MX19fSx7Imhhc2giOiJmY2VkMWE4ZTMyZmI5ODljIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozOTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMzE0NTIzZDFjMjE3NzM0ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mzk0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3NmE1ZTYwMDM3NTBjMDciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM5NSwidHlwZSI6MH19fSx7Imhhc2giOiJlNTY1MmJlYjExYzdmY2ViIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjozOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTczYTQyNmY2NTYyOTI4YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiODFhMjc0NWZjNjdhOGVjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMGFlYThjZGU1OGI0ZjE0ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiYjczZTc3MDc3YjAyMmQzNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiZmNmMGQyZTFmNWZhMDAzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMzYxYzY0NWI0MWE5NjgwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiODFkZjkzNzVmZWQ5MTcyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiYzE0OTNhMGNkM2IzNThhNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiYmRlZGI5NDQ3NTI3OTYwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMWNiODNhYTk0ZTFhOTJlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMjE3MjczMWM4NzlmYWI3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiN2RkNjgzYmY1MGNlNWM5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiYWE0N2I3MDIxOWQyZWU1ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Mzk4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjA5N2VkYjg4YmVkYTlhMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJjNjVmYzVmNDZjZDg4YzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE0ZDFiZjY5NmRkZTRkMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5NGY5MzE4YWNlOTUzZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjllMmIzODgyODg1OTk0NGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAyMzE5ZmM2Mjg2NDE4ZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhY2M1NzBlMDdmZmQ5MWEiLCJwcmVmaXhlcyI6eyJpbWciOnsicHJvZHVjdCI6Mzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4Y2NiYzhmNjUyZTg1YTIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM5OSwidHlwZSI6MH19fSx7Imhhc2giOiJkYTFiYTdjYzUxNjMzNmMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM5OSwidHlwZSI6MH19fSx7Imhhc2giOiI0MTAzNWU3NzMzYWNmODY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwMCwidHlwZSI6MX19fSx7Imhhc2giOiIwNTA5YmRmMjk3ZGI1MDEwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiNjk5MjVjNzg4ODU3NTYxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNGQ0NGMzY2VjMjNhZWEwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDQ3ZWE0NmQwNzk3YjMyZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2Y2E3ZTMzZDE5NGU0NmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI0OWI3OWUyZTg3MGMzZTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhNTU1ZGI3NmE0NmY4ODEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0Njg0ZGQzZWYyODY4N2EiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQwNCwidHlwZSI6MX19fSx7Imhhc2giOiIxYzM4ZTdhYzJkY2Y1ZDU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwNSwidHlwZSI6MH19fSx7Imhhc2giOiI0ODcyY2RlYzA5NDRhNjk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwNSwidHlwZSI6MH19fSx7Imhhc2giOiJkNGUzMDI0OGIyOTIwOTg4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MDYsInR5cGUiOjF9fX0seyJoYXNoIjoiNDhhM2MyZTA0OTUwN2YwMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDA3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRjNWIyNjkwMmExMGI4NWIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQwNywidHlwZSI6MH19fSx7Imhhc2giOiI1MWE0OGVhMjM1NjhmODE3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MDgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTQyNTE3MDhhNTc3ZDhjMCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwZjUwZGI3MjEzY2M5ZWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQxMCwidHlwZSI6MH19fSx7Imhhc2giOiIzN2I5MmY0NmNlOGQwZmE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMCwidHlwZSI6MH19fSx7Imhhc2giOiIyMThjYWM4ZTExNmRjZjdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMSwidHlwZSI6MH19fSx7Imhhc2giOiIxMzVlZTVkZmUxMDhkMTQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiJmNmFmYTI2MzY5NzMxOTAwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiI2MDBhNThlZmE0YjBhNGZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiJjMjc0ZjYzMzZkNGE0MGM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiIwNDc2NTAzZjBmYzUxMzhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiJmNjM2NDE4NWUyMWJkZmI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiIzYjc0NmNiZTI5ODQ5MjhlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiIyOTY2YzA2NDgyYWIzNDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiIxMzIwZjkxYzg4NzM0ZWQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiI0OWU3M2YyZGZlNTAzMDg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMn19fSx7Imhhc2giOiIzNDVkZTM1NzRhNWNlZjYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxMywidHlwZSI6MH19fSx7Imhhc2giOiI4YWJhNzczNTUzMTViNjAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNCwidHlwZSI6MH19fSx7Imhhc2giOiJmN2UzODgyY2QzN2QxYTViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNCwidHlwZSI6MH19fSx7Imhhc2giOiJhNjIxNzlkNWRjODU1MWY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNCwidHlwZSI6MH19fSx7Imhhc2giOiJhYzM3NjBkYzk5MjU5YmY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNSwidHlwZSI6MH19fSx7Imhhc2giOiJlMWM1MWZiZjliMzk5NTBhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNiwidHlwZSI6MH19fSx7Imhhc2giOiI2OGE4MGM4MjllYjljOTVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxNywidHlwZSI6MH19fSx7Imhhc2giOiJhMDJiMjdjOWFmNjhjMDUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxOCwidHlwZSI6MH19fSx7Imhhc2giOiI3NmI1NGRjYWMxMDJhZTMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxOCwidHlwZSI6MH19fSx7Imhhc2giOiJmMzY3NDNiOGM3MjlhM2U1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQxOSwidHlwZSI6MH19fSx7Imhhc2giOiIwZDQ3OWM0YjFkMjAyNmI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyMCwidHlwZSI6MH19fSx7Imhhc2giOiJjNDQyZWFlMjIxMzU1ZWNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyMSwidHlwZSI6MH19fSx7Imhhc2giOiIxMjc3ZDc1YzViYWNlOTRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyMiwidHlwZSI6MH19fSx7Imhhc2giOiIyNTM0YWRiNjM1YjA1NDBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyMywidHlwZSI6MH19fSx7Imhhc2giOiI2ZTgxZjExMGUyNWNlYmExIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNThjYjAyNDAzOTkwNDc5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjUsInR5cGUiOjB9fX0seyJoYXNoIjoiMzZiN2E0NTBkZGI5MmE4MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiN2Y2YTUxN2M4ZWVmN2JmNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiYjVhYTkwNTdmNGFiM2E3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTc3ZWI0MTBiOWVlZTNjMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiNWE3NWU5Y2ZmNDhhMTU3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTU2MTUzNmY0YjliMGY1ZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDI3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhYWVkMDZkZWM4ZTExOWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDI4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU3YjE5Y2I1NDcxYzEwYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlY2E4YzhhYTdjMDFiMGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQzMCwidHlwZSI6MH19fSx7Imhhc2giOiI5NzQ3MzRiM2UwMWVhYjhmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MzEsInR5cGUiOjB9fX0seyJoYXNoIjoiOWY1NjJhMzA4ZmZmYzVjNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDMyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA5ODQ1ZTUwY2JjNzBiOGEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE4MCwidHlwZSI6MH19fSx7Imhhc2giOiI4MmFlNWM5YTk2ODA0ZWM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMSwidHlwZSI6MH19fSx7Imhhc2giOiJiOTFiMGM3ZDFkM2JiNzg2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMSwidHlwZSI6MH19fSx7Imhhc2giOiIyODA0MDcwYzI2MDZmY2E3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMSwidHlwZSI6MH19fSx7Imhhc2giOiJkNjAxZDM2MmE5ODlkY2Y5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiIwYTAwODRiODk2ODg3OTE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiI2NDU5NjUwNmU4Mzk4NTc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiI0YWYzZjY3NTczYmRiYWQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiIxMzQ4ZjdkMDcyNzNkZmNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiI0MzI5YTRhZDUyN2U0Nzc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzMywidHlwZSI6MH19fSx7Imhhc2giOiI1ZWNhNDcwYjI3NzI1ZjI4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MzQsInR5cGUiOjB9fX0seyJoYXNoIjoiODM4MDdhYWUwOGQwNzQ3ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDM0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwNTQyYWFmOTY5YjYwNDEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQzNSwidHlwZSI6MH19fSx7Imhhc2giOiI3ODM3YzRlODYyM2YwNDA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzNSwidHlwZSI6MH19fSx7Imhhc2giOiIxM2M0NmVhOTJjYWVlY2Y4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzNiwidHlwZSI6MH19fSx7Imhhc2giOiI1ZjdjODNiNjgzNjFkYTczIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0MzcsInR5cGUiOjF9fX0seyJoYXNoIjoiYmQyNDJiY2RjNDkzZjFkNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU4YWQ0ODExOTBiNDZlMmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdmNWQyMTAyYWIxMWU1M2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDM5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5ZGQ5NGEyNzQzNTM1MGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiYThkODVjZmMxYmY1ZGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ0MCwidHlwZSI6MH19fSx7Imhhc2giOiIwZTRjNDc0NTExYzZkZmZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiI4NzViYmM0ZGJhZWU4NzM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiI1OGIwOGRkZDllM2NjY2Y5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiIzNTY2MDNkNDU3ODI4OTExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiI3N2M4NWNiMzI0MGRhN2M1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiIwMTA5MTJjZjQwMDU5MmJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiIyOGU2ZDU4NzE5ODg4M2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiJlNjRkMDBiZTY0Zjk3YTc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiJmYTAyNzFkNGQzY2Y0MWYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiJhMjI3ZDA0Y2QzYmYwNGY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiJiNjkyMDVjNTM3MmQyMzU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0MSwidHlwZSI6MX19fSx7Imhhc2giOiJkYTMwMjU5ZWRlZjg3Mjg2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0NDIsInR5cGUiOjF9fX0seyJoYXNoIjoiNDZmZjE0MDY1ODhlN2NlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMzJjYTJiZmY3MzMyOGE4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiM2ZjMWRjMzUxZDQ5NTJjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiODBkMjM3OTQ4NTQ1MmYyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMzUxODNhYmIzZTJjODY0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiM2IyMzUwNDVjYzAwNWQxNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMzRlNjU2MWQ5MzAwZjQ1MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMDg5ODBmNjNjMmNhNzk3MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMzI3NzU1YWI1ZWU5MWQ0ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiYzNkMzM4MzA0NmI1NjkwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiZDE5NmQzYjdlNDM5MDExZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMDk1ODJiYjhjNGYwYmRjZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjYmU0ZWQzNGJlOGVhMDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVjMGMyM2Q2ZDViMmFhN2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZmZTUzOTNkNjhhZWM0NzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0ZGU5OTA0N2UzZTI1OTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImExZDgxMGMyMmVmNGM4YzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5NjFjMjM1MTkxY2NjNWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwMzI3ZTIyOGE2OTkwOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE0NDAxMTQwMjZkMGI4YTciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiIxNzhiOGI3MjgwZGViOTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiI4Mzk4Njg3ZWJlOTkwY2YxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1Y2FkNjVjMjdlZjhkMmI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiJmMjg1NzRhMTEwMDUzMjIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiI2NGVhZTZiZGZjOGNjMWJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzNmIwYzMwZjVmOTY3ZmZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiIxMGMyODI1NDRhMzk4MDdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiJjZTJlZDIyMTkxODA0ZmZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiJiZDU2MTE0ZjI2YTY0MDIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1NGUyODNiODg4NDcwOWMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzMTM4MjJhYjdiZTk1ODVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NiwidHlwZSI6MH19fSx7Imhhc2giOiJkNTQ5NDNjODA2MDMzNGI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0NywidHlwZSI6MH19fSx7Imhhc2giOiI3OTI4Mjc0YmY4NTRiMjhiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0NDYsInR5cGUiOjB9fX0seyJoYXNoIjoiODA0MTVmYmI3NGRiNzcwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDg0MGY2MzQ5OTVlMjVmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiNWZkNDA4NTljYzgzN2IwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiYzU4NzMxMDQzYTk3MzI2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiZWUyODZmYmYwNDQwZDU5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiNjYwZDU1NTMzMWE4YmU2OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiYzQxMjA0MGMxOGQ5NzhjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiNjY3YjM0YWI3MWNiMjM4MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiYjg4OGQ5ZTY5MDAzZGU4MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiMzhkYWZhYTcyNzE3OWVmNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiNzhkYTJkYjlkM2E1MWY5OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiOTRhNzMxYTc2ZGQyNmJmYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiYzRjYTliNmFlYmY0ODhkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiMGE0MmUxMTYyMzVmZWM2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiYWM0ZDBiY2YzMDE3Y2MzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiNjY1MzEyNTQxMTY3NmMzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiMDYyYjEwYWJlMDIyNzdjMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYjBlM2E1N2U4ZjQxNWFlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNmUxYmI0NGQxNzVhMjBhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMzQ5ODRiYWIwMjVhMTM3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDllYjJmNjU0ZTgwZWJjNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDUxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI4NmQ2Mzg0MzExMGUwMmEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ1MiwidHlwZSI6MH19fSx7Imhhc2giOiI4YjUyNmEyOWM3ZjJiM2RjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZmUwZWEyYTFjMjEyY2ZkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGMwNmExNDAzZWI0OTlkZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNWEzNmRiYmQzODJhYTEyYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiYzhmZDE1ZjBhNWZjMTlhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2U2M2E4YWI1MTFlYzViYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTZkMmFiZTU1ZjczYmMyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzA3YTExZTZkY2ZhNTdkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjc1NDM5YmQ3NjkzZmE4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMmY3ZmViMjdhMWI5MzUyNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjgwMWM5NzUwNzEwZDMwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiOWI5NmY3NzAwZDcyN2RhOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTRkZTJmM2IyYzA2ZTE5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMjFhYTYyYTQ1ZWY3NWZiMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg1YmYxZWQzZWU2ZWU2MTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJjZjQ1Y2UyN2QwYjczYzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4NTk1YWRlMWZkMjZlMmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU2NjAyNzlmZTEzY2ZlM2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFkMjZhOTk1ZWU1ODY5MTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIzNDEyZGE1YTVhNTM4Y2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiMzMzZGQ3OGQxMTk0MzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYzNjIxY2E1Nzc3ZDYxZDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNhZmE3MTE3OGUxZGU0ZGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJjYTQ5MGFmYWE5MGMyYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmMGRkNzUzOWNmNzdhYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwNTcwMDk3M2I0MzUwMjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJkODM0Mjc3NTFjMzUxYTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU1MDRlYmZjYjZiMjcyMmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwODA0MzhiNTc5MmIyNjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3NDg4OWU5OGZiZmM3NzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI2MmVlNWU3N2ZkZTdlYzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjNmE3YTU2NTM3NGMyNTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwMjkzNmE2YTZhMmNiOTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyM2I5NGE5NWY2ODQ5Y2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4NzQyZGRhZTgwYjAzMWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkNGExNmJmNTk3MTgxMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzZDUyMzUyMWJjNGJhMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkYThhMTE1MzMwOGQ3ZjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ5Y2MyMTZjOGQ0ODIzMzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE2NmM2NWQ3Nzc2YmU5ZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1ZjE1ZTViNzc0Njk5OWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIxMzE5NGJkNDQ1ZTU1MWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxNDA2YmZmNGRjMzVlZWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhOTYwN2IyOGY0MjM4YzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcwN2Q1MzEwZjI3ZDBkZDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU5ZmExOWI4YTQ4NDc3ZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVmYjliNDY0ZjZlYmFhMWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4NDgzNTBiZDg1ZmZmZTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxOTI3NWM4M2E1YTFjOTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZjOTJiZWM4ZmJjYjAzZWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxZmEzOWJjMjdlMTU2YjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQwOGQ1NWU4OTk1MzM1YWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQwZWZhNzMyM2M3N2IxYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhYTVjZjg4YTAxNzZiYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNlYTA4NTRlNzRjMzJjODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4YTcwYzJlYmZlMzhmZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjMGIxZGZlNmRlNmE5NjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNiMjM0MjI4YWYyN2ZhMzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3YWJlZTU4ODYzYjI3YTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdlMzRiMGQzN2RlZDQ5ZWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ3MjU1ZDMxMzViMDI5NGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyMTI2NGRiMjRiZTA2MGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ2NjY3NmViNGMyMDY2YWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI1MDVhNTVlYWQzZjIyNjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5N2I5ZTJkMzFhYzk2MmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwNjIxNTA1NWY2ODgwZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmMDQwNDZmMTFhZWE2MjgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ2OCwidHlwZSI6MH19fSx7Imhhc2giOiI5ZmU4ZTkzZDU1NTYyMDAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ2OSwidHlwZSI6MH19fSx7Imhhc2giOiI2YjI5ZDQwMTgzM2Y3OWQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ2OCwidHlwZSI6MH19fSx7Imhhc2giOiIwMDkyOGM2Zjg0N2E0Nzg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3MCwidHlwZSI6MX19fSx7Imhhc2giOiJjMzk2NGYyOTlhZGJlODYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3MSwidHlwZSI6MX19fSx7Imhhc2giOiI3NmI1ZGRiMTBmNzY5YzZiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNDUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjUyZWRkMzkyNjcwNTUwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDYzZTM4ZjRlYmE1MWY3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNmMwZjhkYjAzYjI4MDk5YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMjQ4NzcyOTExNTQyZDU1MCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM4YTcyYTQ5MjQwMjdkOGYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ3NSwidHlwZSI6MX19fSx7Imhhc2giOiIyNTViNjNkMTY5YmQ5ZDEwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0NzUsInR5cGUiOjF9fX0seyJoYXNoIjoiM2E3ZmJiYWQxNjY3NjlhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzYsInR5cGUiOjF9fX0seyJoYXNoIjoiZmU2NDIzMGE4NDk2N2QzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiYTkxMjk2ZDYwOWVmZTBiNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiOTQ3ZmE1NTY0ZWNjYzBiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiODlhNjRmZTQ2Njg3MjM3ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiY2UxY2Q0MjIwMDYzZGYyZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiMWM0ODlmODNhNzkzMDFjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiOWRjMjVlZjliM2VkM2U1ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiOTg5OGFiMGM1N2Q2ODNhZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiMDIyOWZlMTk5NzlmODhiMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiNmRlZGQzZmNhNGQyNDNhYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiY2JjMjNhMTVlOWYwMjk4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiOTUxMTljYmMwNWY5ZTQyYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiNzg0NjQ3ZDNlYjAyMzZkYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDc4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiZTVkMzkzOTk5OGJjMzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDc4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlYzRkMjA1OWJiYjEzNjUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ3OSwidHlwZSI6MH19fSx7Imhhc2giOiI4N2E5YmYyZjY2MGIyNjczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3MywidHlwZSI6MH19fSx7Imhhc2giOiIzM2Y2YTRjOWViMTMxM2Y2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3MywidHlwZSI6MH19fSx7Imhhc2giOiIzOGFmY2Y1NDY0ZDRhNDZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3MywidHlwZSI6MH19fSx7Imhhc2giOiI0YTEzYjEwNTMyZGU0MDMzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTcwMzc1MGM5MTg5ODBiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0ODEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzdiMzUxMTA5MDQ3ZWRiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZjlmNTU0Yzk2OTAyMzk3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZThmMmM3ZjVlYjc1OTgzZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZjg2ODBmZTgxOTg1N2U2NSIsInByZWZpeGVzIjp7ImltYWdlIjp7InByb2R1Y3QiOjQ4MiwidHlwZSI6MH19fSx7Imhhc2giOiJmZTEyYjM1Zjc4YzQzM2E2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ4MiwidHlwZSI6MH19fSx7Imhhc2giOiI1MzFmNWMzNjlhMTg5NDczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ4MywidHlwZSI6MH19fSx7Imhhc2giOiI0YmZiYzI1ZGE1ZWM4MTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ4NCwidHlwZSI6MH19fSx7Imhhc2giOiI1NmNlYTVjMmI0MDg5ODlhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNywidHlwZSI6MH19fSx7Imhhc2giOiIyYzI0YjUyMWYzOGQyOGRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ2NDQ5MzUxZWU4ZTMzZWIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ4NSwidHlwZSI6MH19fSx7Imhhc2giOiI1ZTA0MGY3Yjk1OGQ5ZWU1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNywidHlwZSI6MH19fSx7Imhhc2giOiIzNzllZDhhYjE2OTBhNzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZlZDRkYWM5YzMzM2VmNGIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI0YTllNTQ2NTRhNmRlMDgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4N2FhMzA2MTllYzhlN2YiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVhYzgyM2FmNjEyYzQ0OTIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlNGU3MDQ2NmM0M2FkZTMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM4NjVjZjgyMmFiNjRhNzEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4M2MzMzlhYWM3ZTQxOGMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhkNjg5YmY2MDAyOWM5OGYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE5ZDBlMWViYTM4OWRmZTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI3ODkzOTUxNDk4NjgzMjkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI1ZTlmNTE5MWYzZDIzOTciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgyYTc0Mzk5OTQyNWFhYWQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk3YTcyOWU1YjQxZmQ0ZWQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBkYjdkZWU5ZDNjNzU2Y2MiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjEwOTgxMjcxY2I2NmFmMjUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjODZiYzliYTY3NDgyYzYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzNmVmYWQyNzBlM2U3YzYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI3MDljYTNmMzhlNzc2NDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjYmEyMDdlNGFhOWQ2YzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkOGRhOTJkNmRlMjUxOGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ5ZTRkNDQ0NGViZDQxOGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRjMWM0OTk5ZDE1MDE5NDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE2MzU3NjJiODEyNWJiYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk5ODE4ZmU2ZmQ0YzRhOWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNhZTU5ZGU0ZTA1NGE1YTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQxZWM3NzFmZTk0ODlhOWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ5ZWZmYWQ3NGRhMmIwOTciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ4NiwidHlwZSI6MH19fSx7Imhhc2giOiI0NmIxZmM1ZmU5ZGEzNjgxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0ODcsInR5cGUiOjF9fX0seyJoYXNoIjoiZTBiNmQwNWE4ZTc1ZTE0YSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDg3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjExYTg5YmRmNmJjNWNmMjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjhlNjQxNDkzOWY1ODZkNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY0NjJhMWI5N2EzODIyNzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjlmOTk0Nzk4NTRjZWEyZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcyYjQwYWFjZDJiNGUyMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY3NDAxZWYxMzNkMmVkNzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDg5fX19LHsiaGFzaCI6IjY5Njc1N2ViOWUwNzg0NWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM4NDY2MGZjZjhhNGM5OWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImRmMTBjNWUwZTE4ZmRhMmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM3MWRmZTcyNjEyNGIyNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImY2MDNhM2I1Njk5NmZlNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE0OTU5M2QyNGY3NGUzZTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImExYjlhOGZmN2I4MjlmOGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjM3Y2IyN2ZiNTczMTljNTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE2ZTUwZTdlN2I0OTlhYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMxMGY1ZGYxYWRiNjE2MGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImRmM2VhNzM0ZjYwOGRjMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjMwMTRiODY1MmU0ZmQzNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY4MDM0ZTQxYTU5NTA1YmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjRmZjU1MGQyZjVhMzg0ZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI2NmM2Y2I1NGNjOGY4MTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMxNzRjNGM3YzQ2OWNiYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE5YjhmMjZjYjU5ODdkODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjAzMDFkZTdlYmVmM2RlZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjVmNmNjYWNlY2M5MGI2YWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlZTQzYTNlNzAwMWU2NjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3ZDY0ZWZhNjFlOWZiOGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1ZWFlN2M3YTk3NmQ2YjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhMzc1YWQ5YmM4NmFkMDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFhNjJkMjJjMTNkNGYwMDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY1ZjgwMThmYzlhNThiYTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3OTBjODdjYTJhYmJiNmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVhZWZjYTE4ODU2MDI0MmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhYTdhZGVlMTMxN2NiN2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiNWFmYjEyODhiYWNiZmYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ5MSwidHlwZSI6MX19fSx7Imhhc2giOiI3ZDYxOGU4ZGUzOWY1NDhjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0OTEsInR5cGUiOjF9fX0seyJoYXNoIjoiYjVjMzA5NzhmMTBiMWY1NiIsInByZWZpeGVzIjp7InMiOnsicHJvZHVjdCI6NDkxLCJ0eXBlIjoxfSwiIjp7InByb2R1Y3QiOjQ5MiwidHlwZSI6MH19fSx7Imhhc2giOiI1YzRhMTBhNWJjMDg5N2M3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5MywidHlwZSI6MX19fSx7Imhhc2giOiIzOGQ1NzI2N2FlYWRhNmNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5MywidHlwZSI6MX19fSx7Imhhc2giOiI3ZGM4MmRlOThkMjM0Mjk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5NCwidHlwZSI6MX19fSx7Imhhc2giOiI5OGNhYzNlZDJkYjIyMWM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5NCwidHlwZSI6MX19fSx7Imhhc2giOiI3NGRhNjE3ZGQ3OGM0YzI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5NCwidHlwZSI6MX19fSx7Imhhc2giOiJhZDgyOWQ0ZmNjYWVjMDc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5NCwidHlwZSI6MX19fSx7Imhhc2giOiI5MzIxNDI5NjQ3MDk2MWVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5NSwidHlwZSI6MX19fSx7Imhhc2giOiJmYjhlMTZjMmEzNDEzZTA0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0OTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNTZkZTM0OTdjMmIxODdmOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE3NjNjYjhjZDRlY2I0NTUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjQ5NywidHlwZSI6MH19fSx7Imhhc2giOiJkZDQyMDEzNGZkMGIzMWY3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo0OTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjk0MmIzNzViNGM5ZDMwMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0OTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDNiNDE3NDE1NTlhNTc3NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0OTksInR5cGUiOjB9fX0seyJoYXNoIjoiZTAxNzAyYzNhY2UwN2E0MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTAwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwOWFhMDNiN2FiNGE2YTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUwMSwidHlwZSI6MH19fSx7Imhhc2giOiI4YWU1MzAzMDc1MmQ3MGZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiIzZjkxMWVmODg3ZmZlNWE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiJkZDAxOTVkN2FiNjY1ZGIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiI2YWMyNzVlOGU5OWU1ZmIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiI1OTYwZjA1NWQ2NGJkNmZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiJkMDdhMGM5M2EyZjVkYTMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMiwidHlwZSI6MH19fSx7Imhhc2giOiJiN2U3ZjdhYjRhNjAwY2VkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwMywidHlwZSI6MH19fSx7Imhhc2giOiJlOTJhMDZjNjhkZTJhNzlkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwNCwidHlwZSI6MH19fSx7Imhhc2giOiI3ODk2NTkyMTVjYjE2MjBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwNCwidHlwZSI6MH19fSx7Imhhc2giOiJiNjFhNDhjZDQ2Y2I3YjA2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MDUsInR5cGUiOjB9fX0seyJoYXNoIjoiZWVhNWZhNDZiY2UzNWUyNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MDYsInR5cGUiOjB9fX0seyJoYXNoIjoiOWIzNDZjMGQ3N2YxZmNmMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTA3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxMzI0ZjUyYWE1ZWI3MzQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiIyNmUzY2E4Y2M5YTZhZmQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiIyZTlhNTdhM2RjYzYxZTNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiIyZTYyMDJlMTEzYWU2MmUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiI5YTFkNmQ4NDQ1ZTJjY2U5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiI4ODAxNWM1OTgyNzM1MDk3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiI5Y2YxMGU3MmEyZGI0OGE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiJjZjViYTQxYzQ3N2Q4YWE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiJmZTUwYzhhN2Y2NjVjZjc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiI1YzlmYjE2MDI2OWNjYjVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiIzNjZmNGY0MzViZmI5MjU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZGRlMGI1MzcxYWFlNmJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiJlYmQ2ODJlMTgxYjU1M2E3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiJkZjYxZGIxY2VjNjBiNWExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUwOCwidHlwZSI6MH19fSx7Imhhc2giOiJiZGY4MDQzYzQ4MmY4YWZkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MDksInR5cGUiOjB9fX0seyJoYXNoIjoiODNjZTc1ODE3MmRjNjhmYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ1Y2M5ZThlYTBlNDA1Y2MiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUwOSwidHlwZSI6MH19fSx7Imhhc2giOiJiYzhkNTQzNzcyNjc2ZmU0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MDksInR5cGUiOjB9fX0seyJoYXNoIjoiNmE1MWE4YTI4MjY1OTAxZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTEwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIwMzkwM2YxYWJhYzliODIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUxMCwidHlwZSI6MH19fSx7Imhhc2giOiIxNDI4MWJkODcwZmE5ZTg1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTJjOWRmYjQ3MWVkZjRkZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTEwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5Y2Y4MDdhZWU2OTRiOTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUxMSwidHlwZSI6MH19fSx7Imhhc2giOiI3MjBjN2NkYWViM2QzZWRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxMSwidHlwZSI6MH19fSx7Imhhc2giOiJhN2U4MjQ3N2RkYzQ4ZjIzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYzM1YmNmZjEwY2Q2MmE0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTQ1YjZjNzI5MmI3YjU2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZDc2ZWZjODIzMjRmYjhkNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNWViNzQyYzc3YzU5ZGQwNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMzNmOWE0ZTRhNDQwZWVkYSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4NWRhMmUyMGQ3YWU2NTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUxNSwidHlwZSI6MH19fSx7Imhhc2giOiI5YWMyNmJjNzYwMzdkZDcyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTE5NzFmMDJhZWUyOTk2ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBkZmI2MjBjMWY5OWY2N2EiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUxNywidHlwZSI6MH19fSx7Imhhc2giOiJkZWUxODJhYTM4YjkwODAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiJlZTRiYjUxMmFhN2JmZjNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiIwNTFiNmEyZjUxNzA4NzFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiJlZjIyNjZlYWI0MTZlMzQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiI0MDcwMTU5M2M4N2EyYTZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiI0ZGZkODJlN2ZjYmZlMDU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiIyODQ4Yzc4M2YxZDY5MTE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiIyNmZkMGMwYzFiYmRmNTc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOCwidHlwZSI6MH19fSx7Imhhc2giOiI5MzYyZDQzN2M2NjQ5YWMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiI4M2NkNTU0Y2RjNzhjYzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiJlNGUzZWMxMjk0OWQzMTFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiI5ZGI2NzVjYTFkZGJjMjVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiJjNDA3ZjVlYjQ4Mzc3MzZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiIyN2U1MmQ0MWEwMGJmMmZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUxOSwidHlwZSI6MH19fSx7Imhhc2giOiJlZmE1NDVkZDlkNTc3YTgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyMCwidHlwZSI6MH19fSx7Imhhc2giOiJmNjkwZDUwMzEzYzRkODgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyMCwidHlwZSI6MH19fSx7Imhhc2giOiJlNTkwNjNlZDg1OGMxYWM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyMCwidHlwZSI6MH19fSx7Imhhc2giOiIwOGVjZDBmN2Q4MTZiMDI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzMjFkMWQyZTNmZjEzY2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTIxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4Nzc4ZmY0OWRlNWY2YjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTIxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRmZTYyYTI5NWJmNzExMGEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUyMiwidHlwZSI6MH19fSx7Imhhc2giOiIwYTAzZTkzMDllYWM2ZmVmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiYWVmZWU2Y2YyMWZiMjFkMCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTIzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxM2NmNDk1NjFhNjFkMGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1ZGI5M2IwNDc0YmY4OGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhlYWYxNDZkNThhY2FlYTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYyZjlhOTJlMmZhNTUxNTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIyNDZmZTQxN2ZiNTk0ZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ2YmU2YjNkMDVjOTM4YjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI1ODhhNDUwZDMwOTQwZGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwMTNkMzUzNmU4MGYwMWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcwNTgyOTI5N2U1MTA4YWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJmZDU4ZjcwMjkyZDAyYWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmNTg3NWIyNTQ2ZDg0OTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjYzE2YTllODY1NjYxMmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE3NjRiNTJjMTU1YzQ0MGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4YTE4NGI2MDBmZDNhZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjMTA2ZDI3OWU2NmVkNjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdjODY2M2FkNzQ0YWVlYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzODYwZTU2NzMyOTBhMzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4NWUzN2VmNjgzZTZkYTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzYzU5ZWVmNDY0ZmZhOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4ZDI4ZDZhZTllZDEwNjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmYzg5NmI4OTk3MmM0YTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg5ZDQ1Y2Y2NzE2ZDkyYzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzNzRiOGVmMmNjMGE2ZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwYTYwZGY2ZWM5NzI3NjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmZDgxOTg2NjA3MmQ4MWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiYWFiMzhjNjI1NGZjNDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI1ZTQwNGIxZDdjZmE3YjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5YjRhODc4YTlmNjY2MjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjViZTE5YjVlYzlkYTAyMTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzZGQ3NTMyYzA0N2I3MjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkODlhNjIxYTdhYmNiMjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiMDNjMWNlM2EzN2FmM2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxZjE2ZjI5NjNiNWFiNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzNGFhNWIxZTkwYjM1ZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1ZmUwYTcxMWQ5MDUwMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4NDYxNGU2NjJmYWUxMWQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjUzMCwidHlwZSI6MH19fSx7Imhhc2giOiJjZDllOGY2YjhlM2JiMGJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMSwidHlwZSI6MX19fSx7Imhhc2giOiI5N2RlMDM0ODVjNjgxZWZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMSwidHlwZSI6MX19fSx7Imhhc2giOiI2YzYyNDU2OGI3N2MyZjE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMSwidHlwZSI6MX19fSx7Imhhc2giOiIyYjc0ZTY1YmFhYmRmNGE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMiwidHlwZSI6MH19fSx7Imhhc2giOiJmY2QyYTgzMzQ3MzM2ZjM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMiwidHlwZSI6MH19fSx7Imhhc2giOiI3Y2FkZGRiYTMwY2JmNjhiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2MiwidHlwZSI6MH19fSx7Imhhc2giOiIzOWZlNGI1OGY4ZDBjODVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMywidHlwZSI6MH19fSx7Imhhc2giOiIyMTkyNTlkNDlmYWMxY2NiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNCwidHlwZSI6MX19fSx7Imhhc2giOiJjYThkNzZiNjNmZGZkN2U3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjM2MiwidHlwZSI6MH19fSx7Imhhc2giOiJlZDg2YjEwOTI4NjI0ZDI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiIyMDVmODBlNjE0YjQ1ZDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiI4OGM5ZDE0MjcyMWEwMDEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJjOTE4NDk3ZGY0NjEyZGVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJlY2M2OGNlMThiYzkyZWFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJhY2Q2ZTdkNzU3NTE1NzkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiI2MTFmYjdhMTEyNWE5ZjlkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJiNDdmN2U3OGFkZmNjZThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJlN2Q2ODY3ZGUxMzNmZWYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiIwMjIzNTNjOWFiMDgyMWQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiIyNTcxYTA1MDJmMTg4OTM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJmMWVmY2ExM2Y3ODc4MThhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiIxYzk4MmVjODdjZGQ5OGM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJmZmE2MmVhZTg2MDRkZmI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiI4YzdiYTg0ODViMTk1ZmRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiIxODhmYjQyNGIwMmQwMWIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiI5MjgwN2U4ZWI1Y2VlZDUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNSwidHlwZSI6MH19fSx7Imhhc2giOiJiMDFhMGY5YzkyMGIxOTRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNiwidHlwZSI6MH19fSx7Imhhc2giOiJkYTUxYjdkNTM4MzE0M2Y1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNiwidHlwZSI6MH19fSx7Imhhc2giOiJhY2NhMjdkZjdhYzUwZWYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNiwidHlwZSI6MH19fSx7Imhhc2giOiI4YTQ1ODYzY2FjMDE1ODYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNiwidHlwZSI6MH19fSx7Imhhc2giOiJhZTUwMDQ2YTg2NGNlYWZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNiwidHlwZSI6MH19fSx7Imhhc2giOiJkZTU3ZGZkYWY5YTJjNDhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiJiMTIzNWQzYmRhYzY5YWQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiJiMjcxN2Q2ZDU0YTA2OWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiJkNzE1MmI4YTdmYmRjZmQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiI2NmQ5NDZiNTI0YWUxNWNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiJjYjg3YWRiNjJhODA1ZTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiI2NGI0MTdhMTVjZDJjYWJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiJmZTVmYmJiNWY4NzkyM2VjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzNywidHlwZSI6MX19fSx7Imhhc2giOiI3OTU1ZGVlMTBmYWMyYjQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzOCwidHlwZSI6MX19fSx7Imhhc2giOiIxOGI4NDJhNDg1NzE0Yjg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzOCwidHlwZSI6MX19fSx7Imhhc2giOiI1ZTg4MWMxMWE2MTQxYTBlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1MzksInR5cGUiOjB9fX0seyJoYXNoIjoiZWIwNTg2YWE3YjQ0ZDFhNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NDAsInR5cGUiOjF9fX0seyJoYXNoIjoiZTQ5YTYxNWU3ZTA3MmUwNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NDEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzM2Nzk1ZDY2NDI3NTAyMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTQyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFkYWZhMTI5MDI2MjY2MjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRkYzQ5ZWQwZDVhZGMwOTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQzZTM2MDMwYWZlNzA2NTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0YWNkMjY1YWY0YThiMmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkMDBhZjlkMzExMzdiNDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzMzBkMmQ2OWZhYzU1OTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3OTI0ZGI0ZmJmNjJlZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQwZmE3NmIwZGZlNmNiYTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNiNWU1MzIzMjcwZGFjMzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY0NDM5NWI1MDIyM2Q2ZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTgxNmY4OTA1N2M4YWQ1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3NywidHlwZSI6MH19fSx7Imhhc2giOiI4ZDJiMWNhYjU5NTg3OTZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NCwidHlwZSI6MH19fSx7Imhhc2giOiIzNTY4ZWQzNGVkYmQwYTNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NSwidHlwZSI6MH19fSx7Imhhc2giOiI1ZmQ3NWJkYzhkNDg0NjlhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NSwidHlwZSI6MH19fSx7Imhhc2giOiJmMjRmMDk4ZWU0NmQ3ZTUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NSwidHlwZSI6MH19fSx7Imhhc2giOiI2OTVjOTI0YWY4YjdiZTkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiI4YzIxYjE1NDQxMDdmNDRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NywidHlwZSI6MH19fSx7Imhhc2giOiJiNzA5ZTVmYTdhMGEzMjg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0OCwidHlwZSI6MH19fSx7Imhhc2giOiI1NDM5M2IwNDc5YmY0Mjk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0OCwidHlwZSI6MH19fSx7Imhhc2giOiIwMjI4ZTc1ZmE0ZjdiYTI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0OCwidHlwZSI6MH19fSx7Imhhc2giOiIxNjFiMDJjMzQzMGU4NDkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0OSwidHlwZSI6MH19fSx7Imhhc2giOiJjYmZhMjk0ZjY3MTM5NGY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MCwidHlwZSI6MH19fSx7Imhhc2giOiIxMjZlNzY4OTVlMzUwMzBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiJkMWEzMzk3OTYwYTBjOTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiIyNzExMWYzMWM3Zjc4NzBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI1MDY2YTU0Y2Q3ZWQ2MjQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI1NDQ3ZTdlZGZlY2JlZmM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI3NjNlMWM1YTUzNGNkY2UxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI2NjRmNjc2MWQ2ZTFiZGM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI4NWRjMmRiYjljZjhiYTAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiJlZmQ5OTM5Y2NiY2VhN2NhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiI1MDk1YjgxNTU1NGQxNjZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiJiYmQ1MjIwNjYyYTViMzdlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiJhZDkyOWY3Y2QzMzUzMjY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MSwidHlwZSI6MH19fSx7Imhhc2giOiJhZWJmN2IyYTdlZTFmZjEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiIwMWVmMjhhYWIzNDI4M2NjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJjMDc1ZjI2ZjRhYTU3ZDQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJmNjUxZjU0MjExMzUxY2E3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiI5OGU3ZThmMDFiMWU3MjIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiI3ZjQ2ODMyY2RmN2I0NWRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiI0YTM3MzQ1YmY5NmI2NWI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJlZTlmMzc3Y2U4NzExMDQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJmNmY2ZGI5YTA3MDA5MDg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiIzNzQxNGEzM2ZmM2RlNGEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiI3Y2MwNmY4M2YwNzEwNDA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJiZWIxODk0ZDZhNWRkOGQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MiwidHlwZSI6MH19fSx7Imhhc2giOiJhYjMwNWZhZDk2Yzk0ZTY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJhYmIzM2IxMjc3N2Q2OTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJjZjU3YmFhMWZlNjBkNjVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIxZTIzMGNkNjk5Yjg3OGU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIwZTlmNDkzMDc5Njk2Y2UzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI3ZDMzNTBjZDIyMDExZTUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJmNTBiMmVjMDM3ZjU0MjhiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJjMTcxYzI2YzQ5OTZlZjQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI1NTg5NzVkZTczZGMyNzI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJlZTZiODQ3MmY1NTU4ODY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI4MTgzZjNjNTZjZWRjNWQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI5ZTQ2YTc4MTMxYTcwYTI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI5ODA1MTYwNzUzYjc4ZGI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI5NjY1MjQxZDQ2NWM4Y2VkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIwODg2MDk4ZWNlMTA0MTFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIxYjlhYTcyZTIxZGExY2Y5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI3NWVhZjkyYTAyNTlmY2VkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI2NjQ3ZWY5NTlhOTA2MGIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI1NWJiZDQzNDIwYzA0OGJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI3NjlhMzQ5MjE2NmYyMjM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI4OGJmNzg3ZmU3OGFhNjE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI2MmRiNjFhNTgwMmVlNWY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiJlY2M4YjQ4YjViMTY1YmZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIzYjcxM2E0ODg3MTdmNTc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI3ZDUwMWQyMzYyMjQzNTI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIxZTJjMTAwZmFiNDU3ZGNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI3YWRiMzJhZDc2Mjg5NjQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiIzZjQ3NDcwMjExMDRiNDM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwMywidHlwZSI6MX19fSx7Imhhc2giOiI1NWFkZTQxY2MyNGYxYjU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1MywidHlwZSI6MH19fSx7Imhhc2giOiIyMTBmMDI1ZTZjNmI4MTIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NCwidHlwZSI6MH19fSx7Imhhc2giOiIyMzM1NTVmM2RhZjlhYmIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NCwidHlwZSI6MH19fSx7Imhhc2giOiJlZWE5MzU0NWIzMjI2NTFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NCwidHlwZSI6MH19fSx7Imhhc2giOiJkOWZlNDllZWFmMzVlYjAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NCwidHlwZSI6MH19fSx7Imhhc2giOiJlYTQxNjk4Yjk1MzM4NTkxIiwicHJlZml4ZXMiOnsicy1jZG4tIjp7InByb2R1Y3QiOjU1NCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZjRlOTA3MjZiMTgxYzk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NSwidHlwZSI6MH19fSx7Imhhc2giOiI5ZDUxZWZkMjZhYjQ0MzE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyNDQwZWQyNmI2MWQxNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzAsInR5cGUiOjB9fX0seyJoYXNoIjoiODIzNGQwMzA2ZDg5ODRlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZTM1YmY5NDkzMGJjNGQxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiYWVjM2Y1NmM3Zjk5MTUxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZWYzOTViOTZkOTIyYzIzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiNWEwNTNhYjFiY2ZjZmI0MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiMmNmODExYmI4YWEyNzliNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiY2QzODNlNzUwZTZjZmNkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiYzMwZmM3N2NkODIyMTg4ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZmI5Njc4ZWVmN2VhMjI3ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiMTAyZmFjYjI4NmE4OGJiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiYWEzOWE1OGZmNGVkMjExNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZTMzOTA4Y2E5NjA0Y2ZhNCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTU2LCJ0eXBlIjoxfSwiIjp7InByb2R1Y3QiOjU1NywidHlwZSI6MH19fSx7Imhhc2giOiIzMTkwMmFjMGNjM2UzNjJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiI3OTY1MzVmMTBmMWUxZWEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiI2ODFhMzkwZThmYWYwOGMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIxZWYwNGViYzU2NWE2ZjQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIxNDYxYjg5YjFhNGE1ZTM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJhN2MzNGZlOTc5YzdhZmUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIzMDE0MmJiMGYyNGZhYTVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJkYzhmZGQ4YjlkYWFlOGQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiI4MGEyZDIzNjAyYmQwOGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJlODcxM2YyZGE4NWQwZmZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIwOGZlMjAxNzNjMmE3NThhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIxMDVkNjI5YjQxNjIxZThmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJjMmM4YTg3YzY1ODc0ZjUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJlY2MzZDk1NDkyM2FhNTkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiIzMTNlM2QyOWI0NzEyZDVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJiZjMzMmYxNzA1YjA1YjkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJjMmZhYzUyMTU4MDc2NzdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJiMWRiN2ZlNTViNzE5ZmQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJjNDA1OTYyNzI1YjBhNDlmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJmMzA5NzRmODc2MzJmZjY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiJjM2EwZjUxYzdhNDc1ZTI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiI0NzBiZWZmZWZjMDViZDg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU1NiwidHlwZSI6MX19fSx7Imhhc2giOiI0NGM2YmZkN2ZkM2FlMzc5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1NTYsInR5cGUiOjF9fX0seyJoYXNoIjoiZWQyNmUxYTQ4NjJjYjk5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiOGNjMzVjZDI4YWI2OWU3YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiYjQ4MGVlM2NkYjM5YWJhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiNDJiOGNmM2MxZmJhNTY0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiOWM1OWFmYTIwNDI2MDgzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTksInR5cGUiOjB9fX0seyJoYXNoIjoiOTZmYTRmMGQ0MjgyYjc0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTksInR5cGUiOjB9fX0seyJoYXNoIjoiMTQ3ZmY0Y2RlOGY3YjYzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NTksInR5cGUiOjB9fX0seyJoYXNoIjoiZTZkNDNmMzA1ZDAzNzJhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiZTJhOTRiYjBiOGYwOTMwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiN2IxN2U5OTA2MzIwMjFmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzgyY2M5NGM3NjFhZmY0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOWJiMDE0M2Q2NzQ1YTFmYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTkwNmU4ZDIzYTI4MmFiMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzI5NTMxYmI3YzJhNWE5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNTM5NzJmOGE4MDdhMzUyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiZDhhY2FiZWMyMDIwMTRjMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDA2MmNlYjUwNTg0ODk1ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzc2ZDQ4ZmQyODdmOTljOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiY2FmNGMyNWExYmUyZjljYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiYWQ2NmZiNTgwZGZjMGY2MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJjZDFjMDk5N2UxM2YzNDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNjNjdmN2UzMjkyMmQwMjYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjU2NCwidHlwZSI6MH19fSx7Imhhc2giOiIzN2FjODgxZjU1ZjZiNjI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiI2ZWFlYjJmYjAzNzlmNzE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiIwZjM3ZTE5MGMzZjc2NTljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiJjZDVlMWY0NzVhOWE5Y2I5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiI3MGRhZThhZjNjNmNiMmFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiI2MGU5MGQ5MjAwNDQzMDRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiI5ZDM0ZDVlNjgwMDA0NTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU0NiwidHlwZSI6MH19fSx7Imhhc2giOiJiNGI1NDZjMjRkMzUwNjczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiJkMGI3NTgxZjRhM2ZmOWI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiIwYzg2NWQyMTdlMWYxOGYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiI2MzMzYTE4ZDc1MTI1ZWRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiJlZDRjZGMzNmQ4ODI5ODQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiIzNjQzYzkwOWQ3Y2JlMGI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiIyOTZjMjFhNzAwMWRmMzQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiI5NzA3OWJhZDVmYjZlYWQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NSwidHlwZSI6MH19fSx7Imhhc2giOiI3YjkzNjcxMWRkMWU5YTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NiwidHlwZSI6MH19fSx7Imhhc2giOiJjMWQwOWQ4YmY5OWFkYWFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NywidHlwZSI6MH19fSx7Imhhc2giOiJjMWEyNTU5ZGI3OGJlODkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NywidHlwZSI6MH19fSx7Imhhc2giOiI5OWEyMzcwYzZjYjAzYWFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2NywidHlwZSI6MH19fSx7Imhhc2giOiI1ODE4OGM5OTY1OTRlNzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OCwidHlwZSI6MH19fSx7Imhhc2giOiJhZTAxOTM3YTcxZjNjOGVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJiYjIwYjQ5MmQ4ZTg5NWVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJhMTc0YzdmZmMwNmYxNDMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJiMDRkMjY2ODI3NjVjZjBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiIzZDg5NzZkNTBhNzI0MTVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiIwYjkzNzY5NWUyODMzMzJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiI1YTYzM2Q4ZWQ0MTM0MTc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJhM2Q1YWJiMWQzMTMxM2JiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiI2NTFmY2JmYWZkYWExYzNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiIyMTAwNDU3OTg5MjVkMWVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJjYjljOTRlZDQ0MzBjMGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJlYjQyYjZiNzhlMjVhMzFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU2OSwidHlwZSI6MH19fSx7Imhhc2giOiJlMjFhZWFhMzVkOWU0NTM0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1NzAsInR5cGUiOjF9fX0seyJoYXNoIjoiZDU2M2Q3Y2I4NDE0OGY1YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiODgxYjYzMjBmYTZjNWExMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiNjQ4YjI4Nzg0Mzk1OWU1YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiYWE2MDc0M2E3YmZjZDFhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYWZhN2VlMmEwMmY4NjA3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiM2IyMWFmNWEzZmE0Nzc1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZThmNjkwMjc5ZWMyMzIyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiODc2MzMwNGM0MDk1OTQ2NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTdiZTdiYmJkMGFhNzFmMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTYxMGFiODMzMWU5ZmE2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiNWNmNmMzYTc1OGZiNWE1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzUzMzcyNzE3MTA0Y2VjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTg2OGNjYzMzODRjYTcwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiODM0ZmM5MzE3YmQ1NTQzMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNzdhNTg0MzRlZGE2NWYxZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDZjOGY1NDk1Njk4MjRjNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjA1ZjIwMGJmM2E0MmFlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjQ0NzVhODg4ZGFmMTk1ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTc3NjI2YTVjOWIzYTg3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzIsInR5cGUiOjF9fX0seyJoYXNoIjoiYzI1OGY2ZGEwY2Q4YjhjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NzIsInR5cGUiOjF9fX0seyJoYXNoIjoiZDk0ODNmYzNmZTY4ZTc2NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI3Y2FhNTNlMWE2ZWMyYmFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjZDc0NjU2ZmEzYjMyM2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTBmYTk1YzVmMTUzMTBkMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI2ZjgzZGFmMDIwYWI0NjVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzZDFhMDlhMjgwMjRkZGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiOWIyMDhjYzU4NDU0ZmI3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI0NjQ1YzYwNzhkYzM0ZDUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIyMzhjYmMzMjVjNmVmMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNDlkZWVlNGQzMjIwMDI2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI3NzNkOTQxMTQ4N2EyNWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBmNmNmNDkxZjdlYjJiYWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiOGRmY2QzNjY0ZmExMzAyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI4MDBiYjllNzk2OGU1OGFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIwNWIzNjNlNWEwNTExZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjBjNzA3MjM4NDg0NTdmMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI2NjExNGU0ZmY5NGI2MDlmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyZDE4OGI0OGFjYWViN2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNDA5ZDFjODU0NjJhZGVhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI0ZDM4MGE3ZDE1ZDBhNzhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ1NDQ5ZjU3NjdiZmFmYTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQzOWRjMGFmMjJhMzE1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJmODZjMTM2OGM3YzVlYjkyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4Zjc0ZTQzNWU5ZGYxZGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiOWI1ZmE2ZTJmNjA2Y2U3ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI5YTllMDM1MDExMzBiMTdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJhMTI1NDlmNWMyNDA0NjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjE1NzExMjU3Y2M0N2MyYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI3N2YzZjdjNzlkOTVkZTQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZkMzE4NzBlMDQ2OWRkYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDQzZThlN2YwYjdkYjcyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJjZjRkNWJiYzhiMDJkYzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZhNjllMGI5M2FiNDk0ZjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNWRmODEwYjU5YzE1ZWI4OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiIxYmFkMzg1OGU2YjFkYjY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmMDY2M2Q1YTMyYzNiN2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMGFjY2FkYjJiODg2ODA2NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiIyOWZhODZkMGIzYzA5ZjI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjMzQ4MWE0Nzg3ZGM5ODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZGQyY2RmMGFlNDU5OTYxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJiN2RkYmM5MzcyMDc3OGY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY1ZGI1YmY1ODhhMTU1MmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDYzZGFkZjAyYmFkYjliYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiIxMmEwYWM4OTk4MTVkNTZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRlNzNmZmIwOTU5NGU4YTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2JkMjhjOWJlYjg1NzgyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJlNWEzYzUyZGYxODFhZDkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkYjI0OTE4MDkwNGExYWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjMzOTQzYmU0YjE0ZTJjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiIzMzA0ODI4YzZhODc5MTRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBkZWU4MWU0NjFiM2M4YmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjMyODJhMTI0NGVkODYyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiI4YjFkODU5ZWZkYTE5NWY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyMjEyOWZkMTRjNThlZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYzExYjA2MjdkMTEwNWVkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOCwidHlwZSI6MH19fSx7Imhhc2giOiJmZWU3YTJiODRjMjNiNmJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmM2Q0YTk2ZDk3YmMxMmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTczfX19LHsiaGFzaCI6IjdlNGQwOGJlMjZhZjA5MTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTczfX19LHsiaGFzaCI6ImFiMTcxOGFhOGFkYTZjZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTczfX19LHsiaGFzaCI6IjAwODEwNDMyY2EzYTVhZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTczfX19LHsiaGFzaCI6ImU1OTdiYTUwODhhYmIzNmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTczfX19LHsiaGFzaCI6ImQyMDY2NDBlN2NhMTc0Y2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ4ZWQzOWYxZTYwM2I4NzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEyNDFlNzZhMDRjZWYwMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjYzBhOWQyMDRhYWE1NWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgzNzI3NjFiMDM5MmY4YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU3YjgyNjFjNDliMWZiZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ1MDk0ZDQ2NjdmMzc4YTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQwOTFjMzA0M2MyZGE2OGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZlYjVkYWNmZWJhYjhiMDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjEyM2RiMDYyNmM0ODMyNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjRmMzU2ZTBkMTg3MDg1YjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc4LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5YzE2MDBmMTZmMGMwYWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE3MGM0YmRkYWE1M2U4N2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI1MTRkYTk4ZmJkNzBkYTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU1ODVlZjcxMmY5MDZjZTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVkNWU2ZTYyMWI5ZTllOWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwNGE4YzcxZjBhYzRiNWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjEzOGQ3ODJmZjhlZjhiM2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgwLCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijg4OTljMjQ5OWQ3NjIwOTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI5Zjg3YWRlZmU0MGFmZDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmNTdkMGE5NjdjYTRmMzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3OGM0ZmJiZDFkMTYxZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiNDJiZGFkNDMxOGVlNTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcxZDFjZWM3MWY1M2UxNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzYmFkNDVmMWYzZDIxYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhNjNjNjBhYTczZTlkMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzNDQ0NDU4MzY0NjcyNWEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjU4MywidHlwZSI6MH19fSx7Imhhc2giOiJjYmY4YTg1ZmJmNGMyMmU1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo1ODQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTc3NWUzMjdhN2E0MjQwMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDgwZmNiYjk4NGU2ZWNkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiOGMxYWUwYTM0YTNkZjVkMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE0OTFlNTcyNzYxMjhkZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjIwYTM2OGU2NmIwZDA1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjEwMGE3MWE2M2QyY2NmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjM2ODc3ZDhjYzE4MjdmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTA2NjYyNWE3MGExZDVjMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTE3YWFmMDBlZjUwMzZlMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiNGY3OTViODM5NjkwMTYyMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiYjhkYTFlOWZlYjBiYzAxZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDMzZThmZTNjYTE2ODRkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjJmYzUxYmVkZGJlYjRhOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE3ZjY4MDAzMWVmNmJhNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODksInR5cGUiOjF9fX0seyJoYXNoIjoiY2JhMTZkZDVmNDQwOWUzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODksInR5cGUiOjF9fX0seyJoYXNoIjoiM2UzMmIxYWIzZTljNjZiNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTkyMjViM2UyZGNlNTA2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOGEzYjMxNTY5M2Y4MDgwMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOWVjYWUwNTg4MWFkOTFhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiODZhMWJjNjNlYzA1OWYyNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZWEyOGRlMDBhNjUxMmU4OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDJiYjg3NDk2ODdkZWU4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTI1NTM5YTRiNThjOTA4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiODk1ZWY4N2ZiZGQ1NDZkZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNTVlMzk4NTQ0YzNhZWI0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzVlMTlkNjFlZmExMjlkNyIsInByZWZpeGVzIjp7ImFwIjp7InByb2R1Y3QiOjU5MywidHlwZSI6MH0sImUiOnsicHJvZHVjdCI6NTkzLCJ0eXBlIjowfSwiIjp7InByb2R1Y3QiOjU5NCwidHlwZSI6MH19fSx7Imhhc2giOiIzNjY4YjkzM2IyMjNlZTUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiIyMDlmYjMyM2M0ZGIwOWVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiJkOTVlZTQ1ZWQ3NTIxNmIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiI3ZmIwMzljZDI5ODU3MGQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiJhN2QwYTM0NzcyMzIwMjk3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiJhODZmZjlmNzQ4ZjZhNWFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NSwidHlwZSI6MH19fSx7Imhhc2giOiIwNDZkNjljOTNmMGFiMjllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NiwidHlwZSI6MH19fSx7Imhhc2giOiI3MzVhODY4ODJjNGZjY2M2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NywidHlwZSI6MH19fSx7Imhhc2giOiJjNDU0YzA4MWU3MzdiN2UyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NywidHlwZSI6MH19fSx7Imhhc2giOiIxZThlZDU2MGRjMjJiYmI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NywidHlwZSI6MH19fSx7Imhhc2giOiIzYTU3ZDc5ODJlYzM2ZDQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5NywidHlwZSI6MH19fSx7Imhhc2giOiIyODJkNWRmYTcyYWVlNjdlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5OCwidHlwZSI6MH19fSx7Imhhc2giOiIzNTAxODlmY2Q2NmQ3MzdkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5OSwidHlwZSI6MH19fSx7Imhhc2giOiI3MjdjMmM5ZGJkZTIzMjE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5OSwidHlwZSI6MH19fSx7Imhhc2giOiJmMDAxMTkzMjg3Njk2NmI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMCwidHlwZSI6MH19fSx7Imhhc2giOiI0OWExNTRmYjMzMzlkMWM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMCwidHlwZSI6MH19fSx7Imhhc2giOiJiYzk0MDNiMzE1NTNjMmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMCwidHlwZSI6MH19fSx7Imhhc2giOiI0YTc2MzUzOWZiODNhMzA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMCwidHlwZSI6MH19fSx7Imhhc2giOiJhZDUxN2RjYzM5M2MyMzExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMCwidHlwZSI6MH19fSx7Imhhc2giOiJlYTMyMWM2MGQxODMyNTdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiI0NDQwNTY3NWQxYWYyMjQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiI3MDNmMzljMTNiNTk3ZTMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiI1YmRhZTYxMWYyYmJlNjU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiI4Nzg2MmQzZWU1MzA5NWE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiIzNzZkOTNhY2Y1ZThkNzE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiIzZjBlOGNlZDAwNDljMWQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMSwidHlwZSI6MH19fSx7Imhhc2giOiJhMDRlYTNiZDU2YWI2NGJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMiwidHlwZSI6MH19fSx7Imhhc2giOiJiNmNlMmM4YWU4ZTlhNDE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiJlYmQ0NjZhMDNkYjkwODFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiIyZGYyMTNmYTEyNmQxY2E0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiI5MDFlYzFiODA2MmMzYWY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiIzY2RmYmFiZmEzN2I2YmQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiI0YTIzYTJjNDVkMWU5MmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiI3Mjc4NDI3OGQ4NTY5MjBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwMywidHlwZSI6MH19fSx7Imhhc2giOiI2MWFhOGZmZjNlYjRlODkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMiwidHlwZSI6MH19fSx7Imhhc2giOiJkZWY5NDQ2OWJkYzcyNDFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMiwidHlwZSI6MH19fSx7Imhhc2giOiJmMTdkMTdlYWJhY2MzNzU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMiwidHlwZSI6MH19fSx7Imhhc2giOiI4NjQ0ZGJlNGMyMTcyNTkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNCwidHlwZSI6MH19fSx7Imhhc2giOiI0YjU1YzZhN2Q5YzJhOWEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNCwidHlwZSI6MH19fSx7Imhhc2giOiIzMDU2MTVjZjhkYmM5YmUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNSwidHlwZSI6MH19fSx7Imhhc2giOiJiZWQ1YjcyMmIxYmMxYmE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiIxNTI4ZjgzMjNmMzQyZThiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiIzYzBmMjBmZjQxMDQ4M2ZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiI5Mjk3NDgwMDJjOWI4ZWNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiJkYThkODRiNTYxY2M2ZGFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZDczYzM2ZDc0MTNiY2FjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiJmYTAzYzIyZmIzODkyYmYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiI5NjcxYTlhYzI2YTkxZDBhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNiwidHlwZSI6MH19fSx7Imhhc2giOiJjYTEzZWRlZTNmZmZlZTRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNywidHlwZSI6MH19fSx7Imhhc2giOiJlNmM4NTc5NDgzZjdiNDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNywidHlwZSI6MH19fSx7Imhhc2giOiI1NDI2ZTEyZmJlYTNmY2U4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwNywidHlwZSI6MH19fSx7Imhhc2giOiJlMWI4ZDIxMThjOWRjNTI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOCwidHlwZSI6MH19fSx7Imhhc2giOiI2YWIzOGRhMDAyZWFkYmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZWYwOWRhMDA4ZmNmYWU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiJmMDlmOTE4Mjc5ZjFlOWFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiJkZGZkOTY1ZWU5MjBlNDFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiI0Nzc1OGY0YzQ1YTU3ZWE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiI5YjQwMjA4NTI3MGIzZWQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYwOSwidHlwZSI6MH19fSx7Imhhc2giOiI1YTRlMjBkNWRhNGQ5OWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiIxYTMyZDMzNDIwNTA3NTA0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJjODQxZDY3NjRmMTAzMDVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJjMGJlNzg1MDcxZmJmMWY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJhNDhiNjhkNWU3Y2FhNWRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiI5Mzc2NGVmYmFlYTYwYTI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiIyZDFlMWRiYzg4MTYwYjBhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiI0OWM5YTQ4OThkN2VkYTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiI1MWYyNzg4MDAxMGZkNDg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiIxOTMwZTU5N2RkMmQ2NmY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiI5MTM4ZDVkMzYxNzY2YWEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiI5NDIyMTFlYjk0ZmMzYzkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJhYzk1NzI1NTU4NmQxMTRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiIxMTc0MDIwZDA5ODZiN2M3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiIxMzg2ZWZmN2M4Nzk2NmNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJkM2MzNDk3ZGMxODEzYWM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJlYzhiYjUyZDU2YzkyNzc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMCwidHlwZSI6MH19fSx7Imhhc2giOiJiOTk5MzIxNzI1ZjA4MWE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMSwidHlwZSI6MH19fSx7Imhhc2giOiI0M2YyZjg4Y2FjNWMxZTY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMiwidHlwZSI6MX19fSx7Imhhc2giOiI3MWY0M2QyZjA0MzZkOTA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMiwidHlwZSI6MX19fSx7Imhhc2giOiI0YjEzYjhhMjhiNjU1NmQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMiwidHlwZSI6MX19fSx7Imhhc2giOiJiOWMxNTRmNGQzNjNlZWJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxMywidHlwZSI6MX19fSx7Imhhc2giOiJmM2MzMmM2YzdlMWFjODgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUzMywidHlwZSI6MH0sImFkIjp7InByb2R1Y3QiOjYxNCwidHlwZSI6MH0sInRtIjp7InByb2R1Y3QiOjYxNCwidHlwZSI6MH19fSx7Imhhc2giOiI3Mjg1MjRhZGVmZTc3MDU4IiwicHJlZml4ZXMiOnsic3RhdGljLSI6eyJwcm9kdWN0Ijo2MTUsInR5cGUiOjB9fX0seyJoYXNoIjoiN2Y3OGFmZjMxYmJhMzhhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTUsInR5cGUiOjB9fX0seyJoYXNoIjoiY2FjYjA3MzQ4ZTllM2NhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTUsInR5cGUiOjB9fX0seyJoYXNoIjoiY2UwNjllNzRkMTBhYTk0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiYjYyODRlNWJiZWFjZWU3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjcxMTAyYjBmMjQyNWViOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZGE3NmQwYTM5N2FiNDJmYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDMwYjBmZDdjZDNkYzM4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDM2NDM1MTBkYzlhNTVhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjc0ZjliOTZlYjk3NGFkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTM4ZDA5NjUwYWFmZjg4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzUzMzEyNGNkODNjODY1MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiODQxM2EzYWZhNDQ3ZGRkNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjhiMWViYzBhOGI1MWI1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMGM2Y2VhNWRkNDlkMDM2MSIsInByZWZpeGVzIjp7InNkIjp7InByb2R1Y3QiOjYxOCwidHlwZSI6MH0sInJ0Ijp7InByb2R1Y3QiOjYxOCwidHlwZSI6MH19fSx7Imhhc2giOiIyZTNkZjdkNjBiMDAzOTJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxOCwidHlwZSI6MH19fSx7Imhhc2giOiI0Y2RlZTk1MGQ3NDE3YTE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxOCwidHlwZSI6MH19fSx7Imhhc2giOiIyMDYwZDgxYzNmNGRiYWNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYxOSwidHlwZSI6MH19fSx7Imhhc2giOiJmMmMwN2IxODM0MzY1ZWU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMCwidHlwZSI6MH19fSx7Imhhc2giOiJjNjEwNjhjYzU3ZjBmMjE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMCwidHlwZSI6MH19fSx7Imhhc2giOiJhMWY0YjRhODNhZGQ5NDlkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMCwidHlwZSI6MH19fSx7Imhhc2giOiI3MGI5MDYzYWViMjdkODhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMCwidHlwZSI6MH19fSx7Imhhc2giOiJmNjY2OTNlZjE0ZTRjZDc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMCwidHlwZSI6MH19fSx7Imhhc2giOiI3ZjljNzQ4YWE4ODRkYmEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMSwidHlwZSI6MH19fSx7Imhhc2giOiIxM2M4ZjVmMTJmM2I5Y2E2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMSwidHlwZSI6MH19fSx7Imhhc2giOiJjNDdmNjE3MmEwM2Q3YjRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMiwidHlwZSI6MX19fSx7Imhhc2giOiJmOWE3NGM0MzBlMTU3ZTU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMiwidHlwZSI6MX19fSx7Imhhc2giOiI1MzRlYzFiOWYxOTlmMThhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMywidHlwZSI6MH19fSx7Imhhc2giOiI5OGJlYzAyZjUzOTcwNjQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYyMywidHlwZSI6MH19fSx7Imhhc2giOiJkYWI1YjJmNTE1MGZlNTJjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MjQsInR5cGUiOjJ9fX0seyJoYXNoIjoiMDM5Y2FlZTNjNTkwZWY1MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjI0LCJ0eXBlIjoyfX19LHsiaGFzaCI6IjU2ZDRjOGU3N2NmMzc4Y2EiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjYyNCwidHlwZSI6Mn19fSx7Imhhc2giOiJlYTA1NGVlZjRhN2I1MzVkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MjQsInR5cGUiOjJ9fX0seyJoYXNoIjoiNTAzZjNlMDE5Y2Y5MDJmNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMsInR5cGUiOjF9fX0seyJoYXNoIjoiZDA3YWMyOWQ1NDE4YTVhMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMsInR5cGUiOjF9fX0seyJoYXNoIjoiMjUyYTVmNTNmZWYzYWRlZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MjV9fX0seyJoYXNoIjoiYzQ1Y2YxNmM5ODI4OWVmMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MjV9fX0seyJoYXNoIjoiNDM4NjlhOWZiYzFlOTNhYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiNDMzNDI1NTU5NjAyNGRhYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjI3LCJ0eXBlIjoyfX19LHsiaGFzaCI6ImMxY2JjOGMxYTEzMWI0ODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwYTI0ZTFiZWIyZmYwMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkNzg0ODI5MWU2YjJhYWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY3ODg3NWQ3NDFkNDUzOTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJkZjE2MmY4YTk1NTc5MmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyYWE5M2VmMTUwYjY2MjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiZWNjNDFiZDM4OGU5ZGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMzZDY3N2MxNzQ2ZTAzMmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdiNjMyZTFkMjYxNzNkOWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjMwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ2MDY5MTQzNGMxNWQ2ODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiY2I0MGM0MjhkZWE4MmQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjYzMSwidHlwZSI6MH19fSx7Imhhc2giOiJhNzI2MWFiNDE1MzRhNWE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYzMiwidHlwZSI6MH19fSx7Imhhc2giOiI4YWRlNjkyY2U1OWRkZjI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjYzMywidHlwZSI6MH19fSx7Imhhc2giOiJkMTQ3ODQ3NjlhNWUzZTMyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2MzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWViMGI5NDA1YjRlNzBhOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjM0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5OWE5MjIxMTk2MDNjZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5OWYxNmJkMDhmMjNlMWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1Yjc0MWE4ZDk5M2I3YWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc3MzM3MDczNzBmYjA1YzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlhNDJjYjU0MjFhYmZmYTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6IjQ3ZWUzYzdmNmNmMzIxMWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6IjVlNGI1ZGQwOGU5YjUyZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6IjZiYzNhNjY3Y2QwMTIyMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6IjE4NjU2MzgyZjI4MjdlNjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6ImM3M2RiMGVkMjQxZDI2OWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6ImJjMGYwMmEwNmI3NGI3YTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3fX19LHsiaGFzaCI6IjA0MDViZWEyYWY1NTFlMTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMzNTUxMWVjZDQ5Y2ViYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyYmZlMzg4OTg5NzdlZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMwOTU3NTU3ODA0NzhmN2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjM5fX19LHsiaGFzaCI6IjE4NTYyY2IxMTQ5ZmRhMWUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjY0MCwidHlwZSI6MX19fSx7Imhhc2giOiIzN2I3NDliODg1OGViNjFiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2NDEsInR5cGUiOjB9fX0seyJoYXNoIjoiM2Q1OWJlMGY1ZjcxMDFhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDIsInR5cGUiOjF9fX0seyJoYXNoIjoiNTEwY2ZmNTQ5ZDJjYjM5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDMsInR5cGUiOjF9fX0seyJoYXNoIjoiZTIzZWJjOTk1OWNlNDg3MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDMsInR5cGUiOjF9fX0seyJoYXNoIjoiNjIzZmQwMjEwYjExZDRmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjg2YjdhY2NiZmEzOThmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiODVjNDRmMDYwMjU5OGRkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTEwN2IxZmRjZmZhZTViOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NDc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdmMzc4MjNhM2Y1Yzc2YjMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjY0NSwidHlwZSI6MH19fSx7Imhhc2giOiI2ZDMwNjMxNWExZmVjZmRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0NiwidHlwZSI6MH19fSx7Imhhc2giOiJjMjU2ODUxNmIwOGYwZDNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzMDhkM2E4ZDFjYTUyZmYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0NiwidHlwZSI6MH19fSx7Imhhc2giOiI1OWU0ODhjNWYxNTFlN2MzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0NiwidHlwZSI6MH19fSx7Imhhc2giOiI3ZWZlNjkwOGRiNWExZDQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0NywidHlwZSI6MH19fSx7Imhhc2giOiJjNmVlOGZhYWE3ZDY3MzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiJkOTNjMDdjYzY4ZTUzZDkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiI4NmFlMmIyMTZkZWY5NzkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiIxMjY3ZjU4NTc1NDlhNmFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiIzNjdkYjgwYzA3NzZmNmQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiJjNGM3NjJhN2U2NjZkYTFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OCwidHlwZSI6MH19fSx7Imhhc2giOiJiYjY2MjYxZjg0MzgyM2Q1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OSwidHlwZSI6MX19fSx7Imhhc2giOiJhMGYzYmI4ZGNkNjcwMTBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY0OSwidHlwZSI6MX19fSx7Imhhc2giOiI0YTQyM2YxZGE5NjBlZGE2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2NTAsInR5cGUiOjF9fX0seyJoYXNoIjoiMTNjNTVlZjgxMDJjYmRiYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZGI1NDZiYWJhM2FjYjA3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiM2RkMDY2N2RiYWQwYWY2MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzhlMjI0YzkxYWFiZTZkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzVhY2I4YTVhNjBlZjYzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNmY3NzIwYTA1NGMxOWEyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGJkNzZjMjY1NzliZjJiMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMmNkN2YzMTE1OTVlMTY0ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjA4MzgwY2YyZmNiNDQxNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNTlhYzE0Mjc3ZWRlYzQ5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiODg4OTNlZWIyNmU1NDZhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGExNTFkYmU4YjgxNWRmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTMsInR5cGUiOjJ9fX0seyJoYXNoIjoiYjJhNDRmOTIwZTI2ODc0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiOTZhOGMzYWIxNzQwYmYyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NiwidHlwZSI6MH19fSx7Imhhc2giOiI5NWU4NWUzY2JkODU4Nzc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NX19fSx7Imhhc2giOiJkYmYyOTYzYzliZjI2ZjU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NiwidHlwZSI6MH19fSx7Imhhc2giOiI4MDY0NzU4ZjZjODBhZmVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NiwidHlwZSI6MH19fSx7Imhhc2giOiJiN2FhYTA4M2U0MTUxY2E4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NiwidHlwZSI6MH19fSx7Imhhc2giOiJmNGQ1ZjEzZWI3ZDFiYTJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NiwidHlwZSI6MH19fSx7Imhhc2giOiJlY2E2OGYyZTZjZDhhMDdlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1NywidHlwZSI6MH19fSx7Imhhc2giOiIzMGY0YzNmNjgyNTkyYWRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY1OCwidHlwZSI6MX19fSx7Imhhc2giOiIzOWI3NmQyNGUyODA3NWQ0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2NTl9fX0seyJoYXNoIjoiZGFiZTRkNzMyMTljMDZlMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjAsInR5cGUiOjF9fX0seyJoYXNoIjoiZjhjNjc1OGEyMTQyOTliZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjEsInR5cGUiOjF9fX0seyJoYXNoIjoiMGExMzA2MTJkMTg3YmMwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjEsInR5cGUiOjF9fX0seyJoYXNoIjoiNjgwMmYwMTQ1Mzg1ZGY1MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiY2NiZWFmMDI4ZDNjNzIxYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMWQ3ZGFlZWQzODFjMzNhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMDM4YjRkOGNhYjJkMmE1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQ0OTE5Mjc0ZTE5OTg3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGNkZjk1ZTVhYmY3YzEwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjMsInR5cGUiOjB9fX0seyJoYXNoIjoiMWY3NTFmZDgwYjExYWQzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGUxYzg1OTEwMDZjZTk2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiOWZkMjk5MDM5NzdiNTE3NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiYzM5MzBmYzJmNGNkNzBkZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NjY2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg5MjRiNTYxNzVmNmYxMTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjY3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0YjJkNzZhZjk5ODc5NTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjY4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIxMWVjNWVlNWIyNjQ5MWEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiJhMGI2Nzc0ZTU4M2QxNzg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY2OSwidHlwZSI6MH19fSx7Imhhc2giOiJlNmFkOTk5YTdmYzc3NTAwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiI0MDU2NjA5ZDA0YmZlYzljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiJkMWY1OTUwMWQwOGYyMTdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiJiZDQ2N2Q5NDFlNjUyMjVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzOCwidHlwZSI6MH19fSx7Imhhc2giOiIwZGU4M2IyZDM4N2QyYTg0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyMzgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjI3YTE2OTkxOTZkNTAwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzAsInR5cGUiOjF9fX0seyJoYXNoIjoiMjA3Nzc0NGQ2NDIzMmRkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzAsInR5cGUiOjF9fX0seyJoYXNoIjoiNWZmNDJlNTMyN2Q4YzkyNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMWQzNjk0MWRlODdlZTA1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDUzNGVjNDFjZTM0Y2NlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzVjYTMyYmY3ODBmZjQxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzIsInR5cGUiOjF9fX0seyJoYXNoIjoiZmNiNGQ1MDhiN2MxN2QwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMzJkZTVjZGRkYzc4NzhkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiODMyZDdlMDNjZmE1MDc3NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNWQwNzQ3YmRkZTc3MDBhNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNmNkYTg5ZTNjYTU0NzE0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjgyNWM5YzIwNTJiNmQ0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGFjOTFlNDMzZmEzOTJhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTExMjcwOGNkNjUwYzFiZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiOGM1NmVkYmFhZDlkNzY2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTNmODY3MzEzYTNhMjJmZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Njc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMzN2Q0ZjIyNTRiNjk5YmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Njc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkZDZjYjM3MDk2Mzc4MTIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjY3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiNDJlYTkxNGE1ZTI1MjA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY3NywidHlwZSI6MH19fSx7Imhhc2giOiJhN2FiMDA1MzY4ZDU0YTA4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2NzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiMjczZmUzN2VmNTg4MDQyMiIsInByZWZpeGVzIjp7ImxoIjp7InByb2R1Y3QiOjY3OCwidHlwZSI6Mn0sImdlbyI6eyJwcm9kdWN0Ijo2NzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiY2Y3MTc1NWZmMDllMjE4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiYjAwNDA0MmMzM2Y1N2NlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2NzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiM2EzMmJmMjVlZWMxYTk1YiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Njc5LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijc4M2M1Njc5YTgwZDVjMTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjgwfX19LHsiaGFzaCI6IjQwZjcwOWY3NmIxYWYzZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjgwfX19LHsiaGFzaCI6ImE5Nzc2MmVmZTczOWJiODUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjY4MSwidHlwZSI6MH19fSx7Imhhc2giOiJmMzQ2MGM0YzlhNTExMmNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4MiwidHlwZSI6MH19fSx7Imhhc2giOiJmMTMyYjQxZmMzZmVkMmM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4MywidHlwZSI6Mn19fSx7Imhhc2giOiI5MzAxMDNjNzlkMTg4NmM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiJiZWZhOTMxYzJiNzcyZTZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiJlMWE0NmE1YTI5NDU4OWM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiI3YWFmMTcyNDQ0NDUyOWM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiJhOGU2Y2ZkNTQwYjhhNzRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiI0ZGQzMGI3MjJjMTIwZmU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiI1Nzg1MzY1ZjNhNGRhOWU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NCwidHlwZSI6MH19fSx7Imhhc2giOiJiNGNiYWRjYzRhYjU4OTgxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NSwidHlwZSI6MH19fSx7Imhhc2giOiJhNDFhMDA5OWEzNjNkYTk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NiwidHlwZSI6MH19fSx7Imhhc2giOiI5YTlkM2NlZWY5YzQ4OWM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NiwidHlwZSI6MH19fSx7Imhhc2giOiI4YzY1MmUxZDQ1NGFiM2EyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NiwidHlwZSI6MH19fSx7Imhhc2giOiIzNmUwNzAzYjUwZmIzZWVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NiwidHlwZSI6MH19fSx7Imhhc2giOiJhNDM3Yzk3YjRkNjRjYWZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4NywidHlwZSI6MH19fSx7Imhhc2giOiJmNjlhNjhhMmQwOWQwNzIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4OCwidHlwZSI6MH19fSx7Imhhc2giOiIyNmRmYjJiOGJhZDkyZjRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4OCwidHlwZSI6MH19fSx7Imhhc2giOiJkYzY3YjYyZWNmNWE5YjA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4OCwidHlwZSI6MH19fSx7Imhhc2giOiIyM2I2ZjJiNDBhMjA5NjQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4OCwidHlwZSI6MH19fSx7Imhhc2giOiI0MDUzNmY3Y2MzZjNiY2RiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY4OCwidHlwZSI6MH19fSx7Imhhc2giOiI3ZWFiMWM4MDJjMWNiNzA4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiODM4MWU0MzY1M2M5NzZkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDEwNjExODY3MDA0ZmIyOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2ODksInR5cGUiOjB9fX0seyJoYXNoIjoiOGMxMzhlNzQ5NDM3ZjkzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2ODksInR5cGUiOjB9fX0seyJoYXNoIjoiNzM1ZWY2Y2ZiZTBkMDU0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiN2ExN2FhNmJmZGZiM2RlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiM2M1OTM4MTRlNDBkOGE5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGYzNjAyN2MxNjQ0NjMxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZWM4YjQ0MWU4NGExODQ0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjkyM2NhODIxM2RmYTI0YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZmUwYjkzZmM2ZDBhZDg5YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjcxNjRjMDVlMmZiMGQyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNmUwODViMGVjMzdiNDA0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDI4MmVjZjI2NjYxMTBkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTMxMDU0YjlhNTQ4NDFkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjF9fX0seyJoYXNoIjoiNTU2MzUxYzAzODQ5YTRjMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjF9fX0seyJoYXNoIjoiYmViZjcwMzM3MjcyMDVkNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTc3YjlhZGQxMTlkMWQ3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZmJjYjEyMjI2NGJjZGJkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTBmNjRiODI2NWUwYjFiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiY2M0NjhlMDY3NmYzNjQ4MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTQ0NTkzMGM2MGFmOGQ5OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjNlNTk0ZmVhZmFhZTA4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMDQ1ZDg2MDcyYmM1ZGMxMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZWE5ZDBlYTA4ZDA2NTI4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiOTRiYzkzYzIxY2E1ZDAxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYmNmYTA4MmNmNzAwODY2YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTdmMzUyYThlODgzNDljOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiOGIxOGE4M2IxNGVmODkwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDZiYTU5Njk0NTg5MmEzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiYjA3ODA5NDMwOTJiMDMyYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiN2Q3NjgyMmJmZTlmZmNkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiODc1ODJiOTU1NjFjZjAwMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWIwYTBjZDAzZWM3ZjU3YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo2OTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzMwMDlhOGQzMjk4OGU5MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6Njk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5OGIxZWM5ZGY4ZDY3NTkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjY5NiwidHlwZSI6MH19fSx7Imhhc2giOiIwMGUxN2Y5OTI0MzcwN2U5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5NywidHlwZSI6MH19fSx7Imhhc2giOiI2MmRkYzVhODdkMzI4ZTVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5NywidHlwZSI6MH19fSx7Imhhc2giOiIwZTAyZDExYWZlYTc5YTVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiI1NmIxZTk4NDIxNmI0NjRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiI4MTVhM2MyYzFlZDZmOTk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiIyODE3NWFjNjU0NDFmYmNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiJmZTc3NWIyZjA0NWRjY2VkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiJkNDdiMGE3MDBkODRiZmJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiIxYzM0ODI3NDE5NDA1YWVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiI3ZTk5YWRhNmIyNTMzZjU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY5OCwidHlwZSI6MH19fSx7Imhhc2giOiIyYzVhYzRhZjYyODM2M2E2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo2OTksInR5cGUiOjB9fX0seyJoYXNoIjoiMWI3Mjg3OThmMzg3MTYwZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDAsInR5cGUiOjB9fX0seyJoYXNoIjoiZmI4MGM5MWM3NzY3Mzc0MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiNmZmN2RmZjdjMTQwNGUxYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQ2YzI1OWUzYmI5ODEwMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGRjYjAyNzY0MzE5ZTgyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjU4ZWMwZjA4MWYxYzc2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDEsInR5cGUiOjB9fX0seyJoYXNoIjoiNTE4NTk0ZjdlZjk3NTRkYyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzAyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIyM2IxYjc5YTZkZTlmMDQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjcwMiwidHlwZSI6MX19fSx7Imhhc2giOiI4NDhmNDU3NjhlZTBhZDRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiI3N2I3ZTVmNGVjMTdhNmU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiJmOTY1YzFmOGQyY2NlODM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiIzZTMyNzM1MmNlYTE0NmIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiIwNjU4Y2E1ZTRiYWVjMjI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiJmMmU3YTI2MDQzMTk2MzZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwMywidHlwZSI6MH19fSx7Imhhc2giOiJjODI1OTc3OTUwNTk2YWJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwM319fSx7Imhhc2giOiJiNTVmYzRjMjNiODY0ZTU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwM319fSx7Imhhc2giOiIzZWRkYmJjZGI1YTEzYTFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiJmMTMzZjM2ZGQ5ZTk2ODhkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiIwNmVhZDM0NmFmOGVjYzZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiIxNmE0NDJhZDM1MjQ2MDI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiI3NzgwNjhhOTQ4MzM1ZWU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiIyYmIwODg3NjZlMGE3N2NlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiJmNTRiNDFmYWYzZTI5ZGRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiIzZDcxYzc5ODUzNzRmYzYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiJkZTMzNjY3OTM0OGQ0NmE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcwNCwidHlwZSI6MH19fSx7Imhhc2giOiI2ODE4ZmM0Y2I2OTRmMGQ0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3MDUsInR5cGUiOjJ9fX0seyJoYXNoIjoiNTY4MmZiZDE0YWQyMzBjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDYsInR5cGUiOjJ9fX0seyJoYXNoIjoiYWJiYjE0ZmYyYWIwMzExZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDYsInR5cGUiOjJ9fX0seyJoYXNoIjoiNTc4NzI2Y2ZjNTA4MTU3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTE0MWFhYTMwYmViMmYwNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiOTE2MWZhMjg5NTFkYTg5YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMmU1MmY3NGIyN2U5ZWIyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGVjZGVmMmY1NTkxMzc5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDA5NTQ2YzdlN2E5Y2U2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiM2RjZWFmYzQwYTAxY2Q4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTc0OGEwMDhmY2QyOTEwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDk5ZTM1MzdhZWFkNTk5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYWFkOTk2NTVlNzkyYjdhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGYzODExODExMzViMzdmMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDlmZTc3ZTA3M2Y5MDdkNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZmU0NDVkYjQ1NzllNzE3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZjcwMzhkMzVmMjJjMzJkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMTg0OTEzYjhlZWM3OGY2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNGRiNmYwOGFmM2Q2Y2Y2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGE3MTY0NmU0NzVmZjljMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNzg0N2RkOGM1NjA4YTUwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2RlMzNiMDUxMWY0MmM3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNmE1YWU1ZDIzODA2NDdkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMDgyMWNjMTQyMmU5MTMyOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGUxNTdiYWE5OTk1MDJiYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2I5M2ZlNmRmM2ZlNDA5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjU3YzE5ZTA4ZDg5OTE3MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZTQxMWZkOTg4ZjI0M2Q4OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMWVhNTEyMDAzNTQwMTA2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDgyNTVmMDllYzIwMjFkMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDcsInR5cGUiOjB9fX0seyJoYXNoIjoiN2I1YjdjZmEzZDYyYTg4NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTIzNWI4Mjc5YTEwNjI3NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDgsInR5cGUiOjF9fX0seyJoYXNoIjoiY2Y3NjcwNmVlYTJmMGJlNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDksInR5cGUiOjB9fX0seyJoYXNoIjoiNzY2Yjc0N2Y4ZGVjNDQxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjcwNjc3Zjg2YjdmMTE1YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMGE1MDBmOTRhOGE1NjJmMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzY0ZDNhMTdhOTUxMjQzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMzhjM2FhYzFiNzlmMDQ3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYmFiY2M0MDFkMzg0NTUzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMmRkYWU1OGE1NWFiNzJlZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGI1NjQ3MDhkMjg3MWQzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYTQxOTljZmNiZTcwZDdmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTZmNTg1MTI3NWJjMWZiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTZlNmQ3ZTg0YWQ3ZmEzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNThhZTczYTNiYjQzMjdkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMzY2YTBhZDM1NjcwYWVmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNWIzMDY4MmI5ZGZhNzA2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNjcxMjhhMjJjZGQxYTdjZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjowLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiNTY5OTJlMWExYTNmOTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzEzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ3OWFiNzVkNzdhNDBkNzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzEzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE3YmNkMmFmNDZmYjFmZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzEzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ1NjgxZjA5YTc2ZmUzM2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYxMmY2YWFiODBiYzIxZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFiN2U4MDQwOTUxOWNhOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYWU3YjhhODRmMjgwNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIyNWYyMWIzMTY1NjUwMTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjOWVlYmEyMTI2ZTQyNjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkNDgxOWIyMzVhNTI3MmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4YmIwMzJmMjgzZDhmNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlMTFhNWIxNTA1MjZjMjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiZDllNGE2NjhjNGUzNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzOGExZDllYWIwOGQ3ODciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjcxNCwidHlwZSI6MH19fSx7Imhhc2giOiI1YjJjOGQ5MDE3NmJkMTRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcxNCwidHlwZSI6MH19fSx7Imhhc2giOiI2Mjk4MGRjMmZhNDJlMWUwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiOWIzN2JhYjAxYmYyOGQzOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzE2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxZWM2MGVlNDY3MWIxOTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiZTg2YzBhNzM1NDc5NjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzYWI1NzRhZGFjOTY4MzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxYmI1M2EwZjIyOTk0ZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkNjVlYjI4YTcwZWQwOWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlmNDFmODIxZGRjYjUwOTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVlNzAxNjhmODNmYjJjY2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMxNWZjNGExOGIyNWU2ZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1ZjY2ZGZhZjNkMmQyYTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU2ZTg3MTY4MzZjOGEyMWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhMzdkYjY4NDU3ZTI3ODIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjcxOCwidHlwZSI6MH19fSx7Imhhc2giOiJhYjhjMWVlMDQ2YWRmYmIxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3MTksInR5cGUiOjF9fX0seyJoYXNoIjoiMGU4YzFmZjc0NjJjMTA4NCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzE5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjhmMjI4ZDgzMTdlNDcxOGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzE5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI5ZDdlMzFhZjRiMWJlMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVmZWFiM2RmMWZlMzg0OWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmMmZlYTMxYTFjNzliMzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjljZGE4ZWVhZjFlMTUwYmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcxNDA5MWMxYjg1ODFkZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3MDAyYjJiOWU0YjUzNzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4MDI1OTEzNDI1MzdkYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4N2NiZDE0YmI1NGI2NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4NGVmNTY2NmFmNmEyNmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmNzJiNWViNGJlMzg4ZDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY0ZmZjYWJhZjZlYzJiY2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE2ZDU4MzMyYTE4MmM5ZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzIzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiYmQxMDg5NTk5ODNiMzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzI0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwZWFiN2RmYzVlNGNjNWYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjcyNSwidHlwZSI6MH19fSx7Imhhc2giOiIxMzFjZTM2NTk5ZmEwZDZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiI5MTgxMTgxYTAxNTA0MGJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiJmY2E4MzBhYmM0ODI5NjU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiJlNzgzMzNhNzMzYzFiMDVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiIzZjgyNDIzYmQyOGE1MjZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiJmMmRhNTAxZTQwODZhZmEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiI3MTkwODBkMzNiMjgzYWJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyNiwidHlwZSI6MH19fSx7Imhhc2giOiIzNTAyZTBkNTQ0YjliNzM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyN319fSx7Imhhc2giOiJhNjIyN2FkNmY4MDVjMjk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjcyN319fSx7Imhhc2giOiIwOTMzY2Y0OWJiMzI4MjEzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxODcsInR5cGUiOjB9fX0seyJoYXNoIjoiYmVhMWQ2YjJhMzJkMzkyNyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhkMTMxM2JmZDUyMmZjZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzI4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVjNGY0NDkwNTE2ODBhMTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzI4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjliYWRlZWI0YzljZmYzYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzI5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwZTM2MmJiNjZhNmM1ZGQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjczMCwidHlwZSI6MH19fSx7Imhhc2giOiJlMWUxODY2Y2RlNmYyM2M3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiI2MGE0MWFjZDQwYzQ5NGI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZGJjNDViNzAzMjQxNjE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiJkMTE3MjJmZjQ2YmEwNjNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiI3MDZjZDFlNTZlNGNhOWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE2MSwidHlwZSI6MH19fSx7Imhhc2giOiJlYWJlMmY1NmE1NjRlYTcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNCwidHlwZSI6MH19fSx7Imhhc2giOiI5YWIzZjgwMTcyZjA2YTY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNCwidHlwZSI6MH19fSx7Imhhc2giOiIxOWM0NGM4ODI4MTFjMGJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMSwidHlwZSI6MX19fSx7Imhhc2giOiIxZjg4OGJkYzQ5MWQxOWM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiIzMjU5YmFjYzA4NTNmM2NlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiI0YTdmZThlZDc0YTY5YmIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiI3MjY4MGJmNTY0MjU4Yjc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiJkMjVhMGI1ZGQ0NjE3MDcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZTUzZTM3MGY1YzBkOWM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiIyNTg1ZWM4NTE5ZWMyYTAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiI5ZWJmZGQyNjYyMWQ0NmM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiIwODNmZDNiOTM5Y2JkMTA1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiIzZmQyOGFjZTQxZGE2NzM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiIzZjVkOGVkMTg4MWUwODQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZjBmMTNkMGZhZTJiMjYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiI1YTQwZGJkZjE1YmMwZDBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiIwZWZmNWZmMTYzZjA3NGYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiJmNWNlMzJkZTRlYTg3NzBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiI4YTM2N2NlYTgwM2VhZDNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiI5NjBiMzhmMThhMzFiZjdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczMywidHlwZSI6MH19fSx7Imhhc2giOiI0NWIwM2M1Zjg4ODEzMDFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNCwidHlwZSI6MH19fSx7Imhhc2giOiJjMjg3NWU5ZjU3NDFjODk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNCwidHlwZSI6MH19fSx7Imhhc2giOiI0Njc1MTA5MmQ2ZjgyZDY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNCwidHlwZSI6MH19fSx7Imhhc2giOiI1MDMzYjhlODc5NmJjOTQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNSwidHlwZSI6MH19fSx7Imhhc2giOiJmY2JiNGY2ZjVkMTE2YmNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNSwidHlwZSI6MH19fSx7Imhhc2giOiI2ZDY4YmJjMDIzYWZmN2E4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNSwidHlwZSI6MH19fSx7Imhhc2giOiI5OGExN2U2Mzg5OWQ2ZjBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNSwidHlwZSI6MH19fSx7Imhhc2giOiIxY2FlMzhmNTBiYmNiZTFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNSwidHlwZSI6MH19fSx7Imhhc2giOiJkZjEzY2U1NDJiNmMwZTg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNiwidHlwZSI6MH19fSx7Imhhc2giOiJmOWUyZmM4MmYyN2Y3YjYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNiwidHlwZSI6MH19fSx7Imhhc2giOiIwZDMyNGRjOGM3OWQ4YjNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNiwidHlwZSI6MH19fSx7Imhhc2giOiIxZDk1NjlkMGVlMDJkY2VlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiI3M2JkNTRiMWJlNWU5ZGYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiJkYWU2MTMwZTFkNzk2ZDkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiI1MzMzNWRjNzIxY2JlZTBiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiJhZTI3OWVlZTRjNWI0OTQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiI2ODQyNzY3MTlmM2I1NzI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiJiNzM3NjY1OWFjZGRhZTA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiJhYTdmNjIzZGE1MWUxNjAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiI2Nzg1NTgzYzQyOTdmN2M1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiIyMDEzOGU1MWE5N2QxNzliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiJjYzNhNzdkY2EwMTFiYzc4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczNywidHlwZSI6MH19fSx7Imhhc2giOiI2ZDQ0MWY3NTY1Y2M1ZGU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOCwidHlwZSI6MX19fSx7Imhhc2giOiJmOGMxYzYxOTlmNDZlNzIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOCwidHlwZSI6MX19fSx7Imhhc2giOiIxNTFhOTZkODRlMzFhOTU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOCwidHlwZSI6MX19fSx7Imhhc2giOiI1ZDM0ZmRiOTMxNDhkODkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOSwidHlwZSI6MX19fSx7Imhhc2giOiI2ODU1NDA3ZjE3Y2U2YWVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOSwidHlwZSI6MX19fSx7Imhhc2giOiJiOWY5YTA3NGNlNWQ0ZDA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOSwidHlwZSI6MX19fSx7Imhhc2giOiI0MWRkY2RkNmJhOWU0MmZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjczOSwidHlwZSI6MX19fSx7Imhhc2giOiJjNzI5MjNiZWExZmE2NGNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MCwidHlwZSI6MH19fSx7Imhhc2giOiI5MDg1ZTAzNWM2MTc4ODdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MCwidHlwZSI6MH19fSx7Imhhc2giOiIwZjcwMzdlZTRlNDc2NDkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MCwidHlwZSI6MH19fSx7Imhhc2giOiJiZGZiZTYyNDdjNjQwZDgwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MSwidHlwZSI6MH19fSx7Imhhc2giOiIyY2I3MjNiZGM4MjUzM2IyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MSwidHlwZSI6MH19fSx7Imhhc2giOiJiZTcyYmYzZWYzZTNiZDE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MSwidHlwZSI6MH19fSx7Imhhc2giOiIzYWY1ZjkxZmVkYjBlNTk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MSwidHlwZSI6MH19fSx7Imhhc2giOiI5ZmViNmRiZTU3YTVhYjliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0MSwidHlwZSI6MH19fSx7Imhhc2giOiIxOTUzMDEyZDY5OWRjMjRlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0Mn19fSx7Imhhc2giOiI1NjA0NzlmYjA0NzhlNzZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0Mn19fSx7Imhhc2giOiJmYjNjMTkxMzU4ZGU5ZTk3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3NDMsInR5cGUiOjF9fX0seyJoYXNoIjoiZmFhNjM3NDVhZjA5Nzc4NSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzQ0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM2YTAwMjRhOGZkYmQyNDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiMDllOTU4OGU2MTlmNjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5MjNlY2ZmODZkMDAyNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiMzhlOWFiNjZmMTM0YjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIwN2IwYTZhMzJiMzljNjciLCJwcmVmaXhlcyI6eyJydGItIjp7InByb2R1Y3QiOjc0NSwidHlwZSI6MH19fSx7Imhhc2giOiJhNjYwMTliZDFkOGQ2NTIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc0NiwidHlwZSI6MH19fSx7Imhhc2giOiIzNDYxYThlMTRkZmE3MjM0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTBmNDA2ZDY5NmVhMDllMiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4ZjE1YTQwNGMyMmM1YWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlYWJmMmE5Y2M0N2Y2ZGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0ZTU2YzBlMzlmZmIzNzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzNDJjZGU5OGFjYWUyYTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgxNjk0M2FkMjI5ZDU5YmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlhZWNjZWNmMTg0MzczNzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyNDAwNmYzZDg2MTRjZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2NzhhZGI4ZDE2YzFiZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5MGI5ZDA2ZWU3YjYxOGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhNjQxNzNhYWM2ODgzZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmMzM0Yzk2Yjk0ODliNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhY2I2ZWRlNWVmYWEwY2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY4NDgzNjhhOTAwMzMxMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZjNTg1MjZhYzJjMzQ4ODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJjZWM2NGE5MzlhYTYyNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyMzdiYTA3YTM2YzI0NDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjliMWJkM2U0NWNjOGQzN2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5NDQ3ZTk3YTM1MmEyZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhYTNjMTBkMGZhNTE1NzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVkYjFiNWIwYTJlY2QyYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNlZWU1M2ZlZDcxM2Q1YjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1NjJjNzg3YWNkODRkOGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3ZDQ1Y2QxMDhmZTk5YjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2ZGEwMjZkOTlmZDMwYzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQzZTkxYzBlMmQyNjYxMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiOGVlNzFjMTQzYjYxMWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxNzczYWZmZGJjMmY5M2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0ZjVlZGJiZWFiMzBmYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIxMjc1ZjE2ODBjNWUwNTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmMGU5OGZkMjQ4NDRkZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwNzk3M2VmOTA0Mzc0OTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlNTczNjEyYjMxODE1NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyMzdhNWIyMzFkYmYyNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI0ODcyYmQ0OTM3MDNlZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcyNjhmNDA2ODBmYWNjZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYxOGNjMDBlMmNmYjE3MGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiZTY5MjYwMmRlZjQ1ZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkMTVlODc1NDg4Y2NjZDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkYTNhZmMzNmQxYzZiNTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwNzY3YjFhMDNhNjRjZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwMmQwZDJiMTE2OGFlYjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlMDcwZGYwZGJlMTUxZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0MzM3ZWM2NjgxY2JjNjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0NGYyNjA5MjU5YmFjN2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiY2Q2Zjk0M2MwMmQwNjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwNTI5ZWUwOGEwOTAwNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0NDQyM2IwZGU2MmY3OGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwZmI2ODcxYjcwZTFmZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU4OGU0NTk5NDJmOWY5NTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiOTRhN2JiOTk2YjNhOWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU3OTZiNWUyNDYyNjZlMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhMWVlNDc1NjQ1ZDk0YjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjcxNmYyMjdiNzMyN2ZlYmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ0YzNhODhmMmRjZGVlNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzUzfX19LHsiaGFzaCI6IjBmMDEwZDg2NmY1NzYzZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZhOTc4ZDdiOGVmYzU5NGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzZTEwZWU0ZmM5MDBkMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4M2E0MDM4YWZmMDJiNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFjY2UyMTdlNWUwOTE0OWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNhOTNmYmMxMTFjODYwM2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2NTQyNmFhYTU1NTJmZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlhODQzNzE1NzQ2MjkxZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkNGVkNWI3Zjg1Zjk1MGEiLCJwcmVmaXhlcyI6eyJuIjp7InByb2R1Y3QiOjc1NiwidHlwZSI6MH19fSx7Imhhc2giOiI4NmY2MjhlNjZiNjdiZTRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1NywidHlwZSI6MH19fSx7Imhhc2giOiI0MTllOGEwM2IzZjE2YThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiJiOWVlNzllZjRlOGMxNWY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiI0NmUzYjY3YWU0NTQ5MTU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiIzMDY0Y2NiODVlNzJkMmRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiIxYjU4ZTQ3Y2VmZDVlMjIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiI5M2IzZjk3M2IwOWM1NTEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiI2MDdkNGYwMzExZWVjN2FmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiIzMTE1MDJlZjczMTdkZjdkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiJjZGYzODk3ZTEyMjQyNjA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiJhNWEwZDcxZDJmNmI2MzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiIxMGY1NDE1YjhkMjRmMmIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiJjMTI2MzgyZmNiYTU1Njg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiJhOTJkOWQ5NmE5MzM4ODE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OCwidHlwZSI6MH19fSx7Imhhc2giOiI3NDU0OWU0MzMxOTQ2N2Y4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OSwidHlwZSI6MX19fSx7Imhhc2giOiIzZDhkNDMzYWUxMjNkMjE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OSwidHlwZSI6MX19fSx7Imhhc2giOiI2YmFhMWNkMzUwMGRjNDNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MCwidHlwZSI6MH19fSx7Imhhc2giOiIxMmJjMDA5ZTc0Y2EzNjU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc1OX19fSx7Imhhc2giOiJhYmI4ZWMxYjk5OTVlN2RiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiJhNDg5MDgyZGQ4YzZkMWIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiJiOGVhZmZkNGYzMjk4NjI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiJmYTg4OGRkMDgxMjRlOGY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiJkMzMxNjNlNDJhMzRhYzZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MiwidHlwZSI6MX19fSx7Imhhc2giOiIyNjI3MWZkOThkNzllMjlmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiJmOTU4ZTgwYjgyZmJlYjE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MSwidHlwZSI6MH19fSx7Imhhc2giOiIwZWZjMWNjY2QyOTI5MmQyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiZWMxY2ZlYjdjOGFkOGU3NCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2ZWEyOTVkZWE5NzQwNjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE2NmY2ZDkwNDFkMmNmZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQyMDk5NTJiY2E0NTQ2ZmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg5NzdlMTllMjdlODJhMzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyNzZjYzg0YzMwMzBiZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNmOTdjOWQwYTc1ZGExZmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFjZjQzMzIxYzA0ZDY0MWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJiNTU2ODFhZTEzYjJmYTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJkNTQwMGVmZDk0YTY2ZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM0YTJkYWEyODJhMGFmNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY3MGE4ZTEyZjU3OWVlNjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE1YjdlNjlkZGZmYTNhOGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdiN2FkZDdjOTY5ZDkzZmUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjc2NSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZTE5MDdhYTBlYjBmZjcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NSwidHlwZSI6MH19fSx7Imhhc2giOiJhMzMxNTk3ODU5N2FhNzA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NiwidHlwZSI6MH19fSx7Imhhc2giOiI0NTI3MTVjZWRlNDE2NTBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NywidHlwZSI6MH19fSx7Imhhc2giOiIzNmNlMmViMTQwZjc1ZjMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NiwidHlwZSI6MH19fSx7Imhhc2giOiJhZTZiMTNkYWY0YmM3MTRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNSwidHlwZSI6MH19fSx7Imhhc2giOiIxMzY5Njc3N2RhYmVkZWFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2OCwidHlwZSI6MX19fSx7Imhhc2giOiI5OTcxOTI4Yzg4ZTNmYTRlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3NjksInR5cGUiOjF9fX0seyJoYXNoIjoiNjVkZjY1MTVkNDYxNWNlYSIsInByZWZpeGVzIjp7ImYiOnsicHJvZHVjdCI6NzcwLCJ0eXBlIjowfSwidmFzdC0iOnsicHJvZHVjdCI6NzcwLCJ0eXBlIjowfSwiaXZpZC0iOnsicHJvZHVjdCI6NzcwfX19LHsiaGFzaCI6ImI1NGRiNTRkZjJjNDA3ZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzcwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyNTgwNjJiYjFhYjAxZGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzcwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzMDMzOGY3MTA5ZWEzMDUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjc3MCwidHlwZSI6MH19fSx7Imhhc2giOiJiM2M5M2M2MTQyOTkxMTIzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc3MH19fSx7Imhhc2giOiI2ZWY4ZDMxNTU3NWRlNGM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc3MH19fSx7Imhhc2giOiJiNzc2OWIyNWEyMDM1MTQ3IiwicHJlZml4ZXMiOnsidmlkLSI6eyJwcm9kdWN0Ijo3NzB9fX0seyJoYXNoIjoiMmUyODU5YmU3ZGExZWU4MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiZmY1OTEwOTRhNmExMzQ4MCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiZDA5YzhmYWQ2YWMwY2QiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjc3MiwidHlwZSI6MH19fSx7Imhhc2giOiI0MTM4NWNkODEyOTAwZGQzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo3NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzhiZGY0MzYxN2M5ZjNlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjY2OWExMDM1MzMwZTc1MyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NzcyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0YzVhMzczZWU2MTcyYTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3NjJjNjY5NGU0OGFkYTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4NWU5MTM4OGRkOTYwYjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2YTU1Mzk2OWJlMDMzMWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4ZDZmYzI5YjMxODU5M2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFlNTcxZGE5NGI0MjQyYmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU2NzcwZmQ2MjIyYWU5OTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwYjE3ZWU5YWNjMWFmYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0ODM4NTRjNjdkMGM5NTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyMTRmMTRlMjdhNzFkN2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYxYzU3NmZmYTgyNzVlZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM2YWY5ZGRjMTQ3NTdmODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg2ZTkxMjhkNjZjYzAyMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3MWQwYmQyZTZmODNmODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk3YmU2N2EzYjBiYWVkZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2MjJmZTNlNDE3NTY0ZmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE2M2ViZTk0ZmNhNjFlZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiYzFkZDEyZDNjZGIwYjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2MmRhN2Y1YzYzZmYxNjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0YmI1MTM5NDc0N2M2MjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmZjg4NjdiM2QyMzlkMjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5NzBhNmU4MmE5OGM0NjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRjOTc1YWZmY2FlYTkxMDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRmZDg2ZDA4Mzg5NjIyNDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxZjJiMjMzOGIzNWI3YjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiZWM1Y2EyODBlYTFiODMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkODg3NThiZDZlMDAwM2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVjNGU3YjM5NmEyZmY2ZDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5NTQ4OGJkMTA3ZmVjMzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhOGU4NGJkODA0NDg0MTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzYTBjY2E0MjE4MTM1YzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxYTE3MzNhYzU4NzRhMWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVjOGFiYzY1NzkxNWZkMzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxN2NjOTEwODFmZTViMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1MzU0NTM4MWJkZDBjYmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiYzE4NjY0NWNjYmY0NDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkNmRkZjA0ZjkxMjQyMzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVjNWZlNzU2MDIwOWY4MTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmZTNlMzIxYWU2ZTRiZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiZTA1NmMyNDJkZDlkNzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzU0fX19LHsiaGFzaCI6ImY4ZWU1YWJmN2VhMWFiYzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU5Zjg0MGNlMDc3Njk2OTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwMTM4NDNmNDYxYThkNGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJmZTNjZjA4OWNjMTg5MjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjliZDIwYzk1NDlmMjA4NjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyNGYzMzFkZTY5YTcwN2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU2NmY4NjYyNTFiZDcxNGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiYWEzNTBkM2NjNjhmNzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjliYzU2NGExNDZkZjA3ZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM1YzU2Y2ZkN2UzNzhmYWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiOWFhZDVjYjk0ZWIyMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY3MWE0YmMyZTVjOTExM2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjZkM2ZkY2U5ODVmMzFiZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFhMzExZDM0NjUyOWMxNmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNkMjZiMGFlMTNjMjQ0MGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2ZTliNGIyMTY0NTg5NTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjMGU0MzM0NGVmNWU3MzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiZmYzNjU3ODI0MmI2YjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiY2I3NTgzMTcxMDM0MzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU4MTkzMzlhM2U0OGFmYTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQyNDk4MDU3NjhiNWVhZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM1ZDVjZjRiZWI2NDYyY2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxYjYyOGMxYTIyYjQ0MWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4ZDc1MWQzODEwMjczZTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxZWM5ZjdkOWQ2MjdlMDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAyZWIzZjIxZGQ2ZGY3ODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiNDhhMjQ1YTk0YWIxMmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxZDA3Y2ZiZGI3NTAyNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJlMzU5YzRmY2MzZjNhMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZmNzY3NzM5MDE5ZGQ4MDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyNTNlZjA1ZTA0MmIwMTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQwMTg5NjQ4NWNkMzkwMTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBlMDgxOGVkMmU2MWVlOTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIwNWYyMTk2NGU1NWE4MjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzMzNkOWFmYjQ4OTg2ODEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE2MzlkYjhlYjU5NTZhNDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1NDlhNGMwOTdmOWI4M2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFkYmJjMTFmZWEyNjA0OGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA5OGVkNDdjMzIyNDZlNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4NTU2YzY3NjA2ZWFmNWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5ODQ2YmMzYmIwM2E5MjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ5MzUzYTBiOWYyYjViYjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2YmNjOWM1NGI2NGViNWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2ZTFjNTgxZGE3NGYwNmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwMGViMTI1OWRlZDViYjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwMjY3MjZkY2UzNTdjNTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk1ZTE3ZGFmNzZiOGE0OTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImUyYWVkYjhlMzViYTlhZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdlOTU0Mzc5YjIwYTM5NTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJiMmNkOTczNjI3NzMwNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjVmNTQ1YjhhYzI5YjVkMmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4ODM0MGQ0MDM4ZjExMWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4Y2UxMzQwMzU0Y2Y1NmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZhYTllMTAzMWQ1Y2U1ZWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkyNGIwYmJmOTgwOTUwNTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImE4MzE2ZWM5ZjU3N2Q2NzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ5ODdhNTNmZmFlMGU3OTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFmYWZiODA3MTZlMTZlMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQwNDg3ZDY0ZjA0MGRiZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJjNTQzNzM0YTRjYmM1ZGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2NzA0NWY2ODljYjUzNjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdmZjI5MWYwNTg2YTNkY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBhMTlhN2Q4NDg0ZTEwZGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ2MTRjZTJkOGNlYTI5YjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzMTY0ZTI4M2NmYWNkMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImExZGY2MjlmNTQ2YjllMzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjYmYzNWY3MmYxOGEzNDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFjYjA3NjhkMjFmNTVkZDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4NTI3MmUwNTAyZjE4YzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY0Yjg4OGRhODQ4NzdiMTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM1NzlhZjJkYjcwYjVjYzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwNmRlOGJhYWYzMmRhMTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFlOWY3ZWI1NTAzMjc4MDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFjOTIyYmU2MjE1NjRiOWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIzZjMzYWE0ZDAyYjZmYjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVlYWQzMjQ1Y2RjNjgwZGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjEyMzlmNGFlYjMwYTBjNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU0NGE0NWFhOTA1ZjljNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM1ZTRjODUxMGUzY2FjODAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQwZmE0MWFkYTY5MmIxYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNkYjBhNzJiY2Q3NWRiMjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0MmQ0ZTI4NTEwY2ZjYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyZDJkNjcyYWFkNmY0MDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFhYjVjMDZiZWMwMDJhMDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMzNDAxMGYxZjBhMmEyYmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODAzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIyNzRlMzkwOWQ2NDA5ZmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiZGM3YWZmMTdiMzQ2MzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1ZjM4NWFkODc5NGJiZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdmYmY1YWI4NDVjMzE5YzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzNjcxNGMzNTk4ZGY5MDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjllNjc4NTg5MmNkMzRiZGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0NzU3M2UwMDc1YjM3MWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwNDY4Njg3YmQ3NTQwZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQzOGMzMzI1MDUyOWU0Y2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxMWI1OTc0MzAxN2ViZGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZjZWFlMmJhNzZmYTU2ZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzZTUzYTMwNDEwMWYwYjgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjgwNiwidHlwZSI6MH19fSx7Imhhc2giOiI2NmFlN2YwNjI3MzQ1YTBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiJmMjgyNTk1MGJiYzEzMDg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiI1ODQ0YmViYmI2ZWJjMmM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiJhZjFkOWUxZjRkNGEyOWVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiJlYWJiZWMxMmU0Nzk1NjNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiIwNjNlNWM1OWM4OThiNmIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwNywidHlwZSI6MH19fSx7Imhhc2giOiI3NjhlNDk3ZjA1ZWI5MjEwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwOCwidHlwZSI6MX19fSx7Imhhc2giOiJhM2U5ZTFmZmRjOWVmNmYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjgwOSwidHlwZSI6MH19fSx7Imhhc2giOiJkYzNiNGEzYmIxYTk4NDcyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo4MTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjA4YzRmYzBlMTI0OTA4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZWM1MGJkMWY4ZTU1NzAzYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzVmMDhmNGE2MThlNGMyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNWUyODg0NWEzOTc0NDhlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNDNiYWYxYTJmNWM2MDRlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiOTExM2M5MWY3Yzk3ZWRhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNmU0NmZhZjMzYWY0MjIzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjg2MjllZTRmNDg4MmNmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYzU4MGJmNjhiNTcwNWVjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMzBjMWJhZGJmYWIyOTVjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMDcyMDZlZDIyNmY3ZDE4NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYWYwMzE0MjFjMzVjMTJiYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzFlOTIxNTUyMmU4NGZlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjk5YjFlMTAwNGZmZTM2YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiY2M1YWVkMTAzMjYwMDljZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTU5YmFjMGQ3OTM2ZDcyNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiODVjOTJjYTQ1ZWI2MTM3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZWNmYTg2ZjE0N2VlYTU5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiODljNDE4YzYxY2M0NmRiZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiMzY3MTJmYTg4MGY5ZjRmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiNzdhZjE3OGI1MzgyOWNlZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiMTllMzA5OGNlNTZlYWU5NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiNjA1ZDUwYTBjMTMyZTBiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiOWNiNjliMjQ3NjI5MjhiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiN2FkNDE5NWUzODU2YmM4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiYTFmNDE5ZjY5ZjgzYTNjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiYTgxODQ0NTRjZjMzYTVlMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiOGMyMmM1NzU1Yzc2MzA2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiODYyYzQ0NTRmZTA3OTI5ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTUsInR5cGUiOjJ9fX0seyJoYXNoIjoiYWMwYWZhNWU4NjQ2M2RjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMDQ5ZDM3NWRkYjAzY2NhNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMmNlOTY4YzNjMDFkYWMyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTcsInR5cGUiOjJ9fX0seyJoYXNoIjoiNmU0NzM0YzZkZjUyODllZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTcsInR5cGUiOjJ9fX0seyJoYXNoIjoiOWZlNmYyNWE1NWM4NTRhYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDA4YmZlMzViY2JkMDE2ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMDg0NzA1MTk4YmYzODkzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYTFiNjVhZGU5Y2M4NjFjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiNDJmOWMwYjA4MWJmNDE1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZWE5MDYyNmFmOTQxMzVkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiYWU0Y2ZjYzg5NjRmZjgzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMjllZDg2NWQ5NmMyMTM0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZjBhZDQyMGNkMDZlOTE2ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMDJmYTMwMzZkZmRkMWY1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMmUxNjg5ZTM3Y2E4NzI5MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZTBmOTNjMDVkYWQzYzNjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiM2EyZTI4MDRkYzlmYmI2MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZGVlZDZjOTI0OGU1MzU1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiYzQ1OTcyODU0NzRlODA0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZTEyN2ZmZTM4MDAxMmNiYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMmY1NDhhMDBkMTE4ZDMyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMDE1NzU2Yjc1ZWI4OTQwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiMzVkMmU5NWQxNTIyYjBjNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiYTQzZTQwOTUwNGIyNTRkMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiNWE0MTQ3YmI2N2I1YjIzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiOTg2NmE0OWFhYWNiNzIwZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiZjEwMTkzNGIzMzg4MGM4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MTksInR5cGUiOjB9fX0seyJoYXNoIjoiNWZjMGFlYTgwOTM1NzE1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiZWQ3YjgwMDZlNTBkYzE5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiZmUxMTJlYTQ0OGVmYTg0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiODA3YTBhZDJlZjdkODQ0ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiMjRkYWYyZTVjMWUzMGFlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiOTA5MTY1NmY4OTc5ZjVmMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDZ9fX0seyJoYXNoIjoiYmI1ZWY2MWUxOTk0NGEwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjAsInR5cGUiOjB9fX0seyJoYXNoIjoiZWY0ZmVmYmU3M2RhNGE1OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjAsInR5cGUiOjB9fX0seyJoYXNoIjoiZTc4ZWYyZmFhZDU2M2U2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjBlOTlhYmZhOWU1ZGU3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjAsInR5cGUiOjB9fX0seyJoYXNoIjoiMGRlZGM2NTBkYmY1ZDM5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjAsInR5cGUiOjB9fX0seyJoYXNoIjoiNWJkYWVjOWZkM2ZmNGRhYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjEsInR5cGUiOjF9fX0seyJoYXNoIjoiMzE4YmZlOTU0Mjk0ZWE0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTI0MjU5ZmZlZDRkMjQ0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjIsInR5cGUiOjB9fX0seyJoYXNoIjoiYzM5YjA2MjFkN2E4YjYxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiMjljMzU5YWVmZGQ0OGM0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiNmVjZjNjMmFlYjVhZWMyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiZWVhMWEzNDc4NTU3YTdhNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiMGIwZTM2NWRlOWM4OTQzNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiODc1ZDlkOGIxMWE2ZGZmNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiNWVkYjhmMWE2MzM3ZDVkMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiNDM1ODA4Y2E0ZGQxZGNlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiZmQ0M2QwMDczOTExNDdkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDAsInR5cGUiOjF9fX0seyJoYXNoIjoiNjMzMjM2YTk0YjY5NGRkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDAsInR5cGUiOjF9fX0seyJoYXNoIjoiYTA3NmU5MWU4MDllZmMyOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODI0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE0YzI2ZGEwY2FhYzA3OTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODI1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFmOGQ3YmNlYmQ2NGQyYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDFmNGMwYmYxMmM4ZjAyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTY3NGIxNGEwNjFiYjdkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZjQ4NWUyYmI1MjhkMzE0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiODJjMDllMzE1YWY3ZDcwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZmMyYjk4NTY2OTE0ODA2OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiY2Y5YTkzNzdiYzcyYzJlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDU1MDE0OWEyZDVjZmRkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozMzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDUxYzJjMjRjZDc3MWE2YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjYsInR5cGUiOjB9fX0seyJoYXNoIjoiZDM0Y2Y5ODU3ODIwMGM5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDRjMjMwMjU3N2JkOGU4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTJiODM1YzU2NTcyMDZjMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjcsInR5cGUiOjB9fX0seyJoYXNoIjoiY2FhMGM5NGNmNTdlMjI5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMDJlNTRlYzZiMGFjYTU0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjgsInR5cGUiOjF9fX0seyJoYXNoIjoiMWNmMWE3ZjVjMzIzZDZlMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiMDc5YTY0Nzg4NmE1YWZhNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiZWMzMjBkMjhlYmRmYWM4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiZTU5NDQ5ZGE3ZTY0MmI0NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiMWQ2MTc1MWRiOTRkZmMxNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiNDNmNzc0NjU0NDE2MjMyNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiNGY4MGM4NzAwYzQ1OWE3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MjksInR5cGUiOjB9fX0seyJoYXNoIjoiMjNmNjJiYTExM2YwZmE0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzAsInR5cGUiOjF9fX0seyJoYXNoIjoiNjJmYzBmYzMxMDJiOTE4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDA2NmYwNzQzYWRlMjU5YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDI4OGQwMjFjNDliN2UxYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzEsInR5cGUiOjB9fX0seyJoYXNoIjoiNjYyMGE1OGExZjRjZDQ4MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiNDdkYjU3YWFkZTk0NjcwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiMjkyNGI3N2MxZDdlYWIzYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiZDIxNDNkYmYxNjk5ZjRmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzMsInR5cGUiOjF9fX0seyJoYXNoIjoiMTNjMmE5NGM0Njg4NjcwNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4MzMsInR5cGUiOjF9fX0seyJoYXNoIjoiYzBkMzBiMDIzZGM5MTM5ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODM0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjEwOGQ3ODg5MzllNGI3YTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZmZGMxMjE5MTdlMTllYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyNjJhODhjZmEzNjMzMDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI1OTdhZjkyNGZlNWZmOTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjYTYwZjQ0YTcwZDVkMzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0NDMwOGQ1YzJlM2JiOGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwZjViOTcxYzk2MTgxNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODE0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkNjRjMTE1MmMwNzU3MzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxYjEzMTIxZDJjZTk2OTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0ODc5MWEyNzQ2ZTJhOTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkzNWI4MDc5Yjc0ZjM0NGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI0ZTViOGIzNDJkMWIxZmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFkOGM4YmMxNjU2MTFiZjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIxYjViZGQ4MmQxNDNlOTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlZGRhYTA3MWJhM2IzMTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ3NDgwMmVhNDI1NTVlMzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIyOGU0MmVhMThkZjFjMDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgyNjYzNTgwMGIxMmViMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyYzEwNzI4ZjU1NTkxM2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiN2YzNjRlZjBiZWVkNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhkMzFlNzkxMDVjNTM4MGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzNzI2NGVmN2Q4MzgzZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODM5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmNjM3MmU2NjIxZDg4YmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3NzQyODUyYzJhNGNjYzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODQxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4Njc4NmNlOTBiMjNlM2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkzZTFjMjJhNDQyN2EzMmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODQzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZjYTBhNDJhYWQxMDgzNDUiLCJwcmVmaXhlcyI6eyJzdGF0aWMiOnsicHJvZHVjdCI6ODQ0LCJ0eXBlIjowfSwiaW1nIjp7InByb2R1Y3QiOjg0NCwidHlwZSI6MH0sImxvZyI6eyJwcm9kdWN0Ijo4NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMTU5NDhjYWU2MTljMmU1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGIyYTgxYzE1ODM3ZGRiZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiYWNjZjE1NjU5ODRlMjg5OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiNDUzNTFlNWM0ODYyYjJkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiYmEzMTk2YzUwZTZjMWJlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiZWFiNzI0ZmJiYTRmODNkNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDUsInR5cGUiOjB9fX0seyJoYXNoIjoiMGVkYzhlN2I4YThmZTNlZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDYsInR5cGUiOjB9fX0seyJoYXNoIjoiZGZhNDIzMzE1YWI0ODgxMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzc3YjBmNDMwMWFhMTY0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjk0Y2JhMGFlMjMyNDQ3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE3YWQ1ZGE2ZGIwMTRjNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDksInR5cGUiOjB9fX0seyJoYXNoIjoiMDliZmM4YTdmMWM3ODk2ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiMzYyMTM2ZTg0N2EzNWY3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTQ5MmQ3N2JiNzVlNjM4MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTRiYjgxNmM0YTM3NTIyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZjEwZTFhNDE4NTc2ZDIxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjQ1ZmM5NTFiMGE5Y2U1OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYmFiZGNlYWJjYTNhZTJiOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzY0NzQxMTRlZGUzMTk1YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjZmYWVmNjRiZDA3MjcyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGExOWIxZjU0N2EzYTkzNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYjRlZjU2NjQyOTE2Y2M2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYzFmYzlkMjQ1ZmE4NWIwMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMGUzZGRiNDg2OGIwZTk5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiOTc2ZDRlYTY1MDdkZmQyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzBhM2ZlODdkM2JiYmFlOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMWNmMWVjMDAyYTA3ZDZhNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYjJjNDgwZjNiYzdiMDNiNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzk0ZGJjMGEzZmZjNmVkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTQsInR5cGUiOjB9fX0seyJoYXNoIjoiMDRmYjQ2YWY5OTNkZjU1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYjlhZGYyNWI1NWM0ZDBmMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMWMxMjExYzg0ZGJlZTA1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTc1ZmFmYjA5NGM3MWQ5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjJiMDIwYjNkMzg2MWRiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjA5ZDEzYzVjZDM3NzFjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYWVhZTMxMzkzNDEwMmNmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjg3MjFiY2Y0ZDlmNjE5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDllNWY3YzlmMzBmNGZkNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYTFjZTU3ZDM4NzQyNzIwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYmI0YjYzNzc2NjYxNzJjNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZDZhNmE2Y2QwNjJiYzc2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDMxM2NlOGE5ODUxZDgzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjg2MjQ1MGQyMzE0ZGY0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMGEzNGM5ZjZmMGNmOTU1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiOGUzMTFmY2U4MGVjY2FmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMjk2ZmRhZDdlODMzNmQ1YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMjdjMGUxNzczMTJhM2MwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiZmMzYzcxMTQwODE4NjNiZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiODExNTgyZjVkZjE1N2ZmOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMjg0ZDhhNGY5YjE3NGJhYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiYWEwZTdiN2ExZmUyNzlkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiMWY1NTFmOTM0NDAwZjgxZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NSwidHlwZSI6MH19fSx7Imhhc2giOiIxYzNiOTRjYWJiYmM1YjhjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUwNWIxOTRhZWViZDZiYWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmMmUxMmU5Njc3ZTRkNDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyYTNmZTVlNDgyNDMyZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkMDNjZDFiOTJjMTY3YTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUzMjQwMmNkM2FiMTM0MDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4ZTU3N2JhM2U2MWM3NDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE0ODBhNjU4MGNiODFkZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIxZWM0NmRkMmM0YzgyNGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwOCwidHlwZSI6MH19fSx7Imhhc2giOiI2YzYyNDA2OTc3NzFiZWZkIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjJlMTYwMzhjMGQ4M2I4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjU0ZGE0ZWQ4NWQ3N2ZiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYzllMmVhMDQ4NjIxNjUzNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiOWU0ZjViMmYyMDBmYmIyNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDM3OGM2MDg5NDE5NWM0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjIsInR5cGUiOjB9fX0seyJoYXNoIjoiNjFlODJjNWU3NGM1Y2U3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjMsInR5cGUiOjB9fX0seyJoYXNoIjoiNzEyZjAxMGViOTc5MmZhNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTg5ZWNlYWVmNzk2MTlkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiMWQ2NmYxN2M5NDlkYmFlZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNmRiZDdiOTQ4MDE2M2FmMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNDFkNTZlMDg3MDM2NDIxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzgsInR5cGUiOjB9fX0seyJoYXNoIjoiMmQ3MDE0OTVjZjcyYWY1YiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiZDE0ZThkNWE2YjJmMmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjliNTA0Y2M1ODZkYTcyZTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4OWQ0Y2I0NDkwYjQyODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjZTkyNTM1M2NiYzFkYmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmOGQyNjY3OWNlN2RhZmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjExZGIyZmVjNzZhNzY2NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwYTA5ZTg3ODhlZTZmMmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcwOWQ3OWJmZTIxNGFhNDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdhMzdmYTVmZjFhMzc3OTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQyYTI0ZTFhYjFjMmQ5NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzZjRlNGQzMTViYzA4NWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI5YzExZTY3ZDdlYjI5NjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImUzODgyZTZiYzBjMmUzODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY3LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk0NGQ4NmQ0MGI5YWUwODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImViZDQ1NjAxMDU3MWI1YWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODY3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ0NTZmYTc2OWJlOTBiYTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiODRkNjVmNTc4MmRkMjZkNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiYTYxODVmNDZlMjg0OWY1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjksInR5cGUiOjB9fX0seyJoYXNoIjoiYmY4NzQ5MzVjNjk3MjYyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjksInR5cGUiOjB9fX0seyJoYXNoIjoiMDk0YjMwMWE3MTI0MTRmMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjksInR5cGUiOjB9fX0seyJoYXNoIjoiNTZlZThkNjc0MDhiMjMxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjksInR5cGUiOjB9fX0seyJoYXNoIjoiZDYyZDljMjBjNDdlYzg2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NjksInR5cGUiOjB9fX0seyJoYXNoIjoiYmI3MTZhODI2OWEyZTc5YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNWE2ZmY4YTYyMGJiOGRlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjFjZjBhODQyNjA4M2U1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNGNmNGFhNGIwZTM3ZmRmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDksInR5cGUiOjB9fX0seyJoYXNoIjoiNzQ1YWNlZThmNTk3M2Y1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo3MDksInR5cGUiOjB9fX0seyJoYXNoIjoiOWE4MzRhMWNjMDVjYjg3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzEsInR5cGUiOjF9fX0seyJoYXNoIjoiNzNjZDE2MWMxMGViY2Y2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzVjNzJiNWNjNGM0MGMxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMzNjNWMzOTgxMzBkZGZlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMWMwNjUzNjUxMjQ1YTAxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMjcxZDA1N2IxNWY2NzE2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTk3MjNhMjI5YjhiOWVlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiOGUzYzk5YzVjYzEwYzIxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMDcxNDFiZmI5NmZhYTkzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMWQ3Mjk0YWJiYWEyNmUyNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjg3MjI3MmUwOTdkMmNkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjZlYzhhYTU2MGNmMjIzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTdjZDlkY2JhNzAyYjdlNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMjM0N2U5ZTg4ZjZlYWQ4OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiN2YxOTc0MGZmODZkYzY0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiMThmNTUzNjcwZTIzNzM0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2E4NjJkMTk5OTI2YWQxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiMjIzODc3NjIxODU2NDAyNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGQ2MDc5NWY2OTk3MzExZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjMyMDA4ZTEzYmUwZjk2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiZGQ1NTMzYWEyZDQ5Y2MxMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzYsInR5cGUiOjF9fX0seyJoYXNoIjoiM2JjZDUwMGI2ODRkNTE0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiMTRlZWY2M2EyODg5YzhkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTNmMzFlNDI3NTUxNTM4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI5NjgxOWRlNjNmMzQ0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiZDgzODlmZWE5ODlkYThkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozOSwidHlwZSI6MH19fSx7Imhhc2giOiJlMjUxYjE3YTAwMmI2NzliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjg3NywidHlwZSI6MX19fSx7Imhhc2giOiJlYzM1MTg4YTUyMmI3ZGI5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo4NzgsInR5cGUiOjF9fX0seyJoYXNoIjoiOGVlMWNmOTA3YmJjYTkxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzksInR5cGUiOjF9fX0seyJoYXNoIjoiMThhNWRlY2Y5NmU4YzgwZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiODkyN2U1MzY0ZDFiZjFkMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiODYyOTJjNTI0YWM3OTY4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI1NjJkZjNmNzIwOGM4ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTdkNmZlMzJhYjA3OGU4NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiNDk3ODU3Yzg5OTg5NGEwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODAsInR5cGUiOjB9fX0seyJoYXNoIjoiMGQ4YzVhZDEzM2Q0YzgzZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODEsInR5cGUiOjB9fX0seyJoYXNoIjoiYThjMTBlNDFkMmQ0YjMxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTY5OWQyOTUyMGQxYjliOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTAzMzA4YzE1Y2E0YzQ1OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzYsInR5cGUiOjF9fX0seyJoYXNoIjoiZDdhMWIzZmM1ZTEyNTJjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4NzYsInR5cGUiOjF9fX0seyJoYXNoIjoiZWU0MGJmN2M5YmFlMjM2MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiODc1NWQxODdmOGZmYjVlOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiMWJkZjU0Y2Y3OWQxODkxNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiZWQ2MTk1MGQ0M2Q5OTcxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODIsInR5cGUiOjB9fX0seyJoYXNoIjoiYWZmOTI4ZmM1ODYzN2NiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODMsInR5cGUiOjB9fX0seyJoYXNoIjoiNzk3Zjc2MjE4NTM3YWQ1ZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODgzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiZGNkYjAzZmY2MTczYWYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjg4MywidHlwZSI6MH19fSx7Imhhc2giOiI2YTNkZWM4YjVhNDY3OTg3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo4ODMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTNkNWY1OGJiZGU1NmIxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODMsInR5cGUiOjB9fX0seyJoYXNoIjoiN2QwYWRiOTA4OWZmMjFjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzI0MWYzNjI2M2VhN2M4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODQsInR5cGUiOjB9fX0seyJoYXNoIjoiNzlkZDU5NWU3OTYxMTc2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiZGY4MjliOGU4NDBjMTFlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiYzMwMDRiNDg1Mzk1ODdlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDhlYjM2NWEzNzIzZWUxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzFiYzg4YzBiZDBkYzE3MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODUsInR5cGUiOjB9fX0seyJoYXNoIjoiZmIyMDhlNDFhNTY1NDMwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjEyMWQzOTIzMjYxMmY1NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODYsInR5cGUiOjB9fX0seyJoYXNoIjoiNTMyZmViYWU1Y2Y5MTk0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZmJmZmY4ZjEyNTAzYzIwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODgsInR5cGUiOjF9fX0seyJoYXNoIjoiMTRhZmQxZmMyZGExNGQ3MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODksInR5cGUiOjB9fX0seyJoYXNoIjoiYWE2NzRiZDU5ZGVlNDcxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODksInR5cGUiOjB9fX0seyJoYXNoIjoiN2ZkNGZhOGEwNjU4OWNhYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODksInR5cGUiOjB9fX0seyJoYXNoIjoiNTZmOTRiMjYyMDM1N2ViNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4ODksInR5cGUiOjB9fX0seyJoYXNoIjoiMzJkZGM4YjY4NzRmMDMwYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZmVhMjZkZTZiNzBhYWZiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiNDY4N2JlNDkyMmU5ZDIyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo4OTIsInR5cGUiOjF9fX0seyJoYXNoIjoiYjQxZjIzNTMyOWZiYTY3NyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6ODkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjMzNjJjYzgyYmEzN2M4MjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdjNWNiZGU2NWMxZjBhNjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQ4NWViYjBhM2MwYmRlZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyZDEzNGUwMzRjNTVlMWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkOTgwNWU1MTA5NjUxNTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlZDY0MjY2NDlhNTE0MmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU2MjliYjJiMmRmODE1NjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3YTEzODRmYjNmYzYwOTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjY2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlkOTMxMDA4YjQwNjdkMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlMGViMDUxZjEwZjRmZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0ZTA2NmVlMDEyZGQ4MjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiZGEyM2RhNjBmNjUxN2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhhZjM2MWVmMmY1ODkzMmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjljZjY4NWFjNGJkM2MxYTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlYjJhZTE4NDk2YzQwNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImExYzc0YmUzMTJjMWU1MDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyMzA1YTQ0MjMxMTAzYTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5ZWEzZjIwNTNmZjBhYzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4ZjY1ZmZkZWU4Zjg0MDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjOTAyNjAzOTYzY2M2YzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZhZGRlZjA4NDRmMTQ4YzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMyODg5Nzc2NjU2ZDYzYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFhMWFjMWVlYWUxODFmZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZhMDMzOTZkNGEzMDNkNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY2MzJmNjljMzQ4NDAxMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA4MmU2MmNlNzBhYTY2ZmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc3NWM3ZDg5YzYwNmNkM2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0YjI4MmJiM2M2ODYyMTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4ZTE5NTZjOTczMTVhYWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2ZGM5Zjc4ZWM3MmNjMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0ZWY3YjZlZWVkYTEyY2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU3OGMyYjA5OTdkZmEyNDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxMDQ1MDU4MDc4MjE0YzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzYjIzNTg4ZjQyZmVkZmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlOTRjNzQyZDg3YWE3NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODk5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUyNjMyMDY3ZjU0OTU3NTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjBiMjdjOTQ4ZGJhMWZkYTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdlMzBmOTMxZGJiNzE4MGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAyLCJ0eXBlIjoyfX19LHsiaGFzaCI6ImIzZTIyODViNmZjMDNlNWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAyLCJ0eXBlIjoyfX19LHsiaGFzaCI6ImUyZjI0Nzc5NWFkMmFkODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAyLCJ0eXBlIjoyfX19LHsiaGFzaCI6IjFjOWU0ZDE4MTBlNjU5ZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAyLCJ0eXBlIjoyfX19LHsiaGFzaCI6IjU3NTExYjEwZTJlZDQ3ODUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAyLCJ0eXBlIjoyfX19LHsiaGFzaCI6ImMwMTJmYWE4OThjNjJlMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxYjdmMzNjOTYxMTYyZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmYWM0ZjZjNWZhMWFhODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEyM2JhZTYyYWIyNWUyYzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlMDg0NTk3NTdiNzZjMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjgzZWZiN2ZjYjc3NzA3ODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0MjQ1NmUyNmE0NGEyNjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNiMGIxNmRkNTBiYTlkN2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU0MWE4OTVkZjAxZDJiMmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmMDE4ODdiYjc0MDVhYjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMzNzM0YTg2NzY2ZDI1YTkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjkwNiwidHlwZSI6MX19fSx7Imhhc2giOiJmNjY1NDNmMjc5YjNlMWU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkwNywidHlwZSI6MH19fSx7Imhhc2giOiI3NGVlOGMwZjJmYjMxODEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkwNywidHlwZSI6MH19fSx7Imhhc2giOiI1ODRkYjIwYjY5NTIxZjQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkwOCwidHlwZSI6MH19fSx7Imhhc2giOiI2YTAwMWU4YmM5OWZlZGU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkwOSwidHlwZSI6MH19fSx7Imhhc2giOiJiOGZmN2JkNjA0NTM1ZWE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkwOSwidHlwZSI6MH19fSx7Imhhc2giOiIzZTAwNWMxZGZkYzIzNDg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiJkZGVmN2JiMmY1OTMwMTIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiI0MjQzOTllNjQzYjMyOWI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiIyM2RmOTJlMDRlYzY2NDA2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiIwNmYwY2FmNGE0ZmU2ZWQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiI5Njk3YTA4MThjYmQ3OWJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiJlYzdmNjFmMjUxMWFlMjBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMCwidHlwZSI6MX19fSx7Imhhc2giOiJmYjRlN2VjYjgzMDRhZGU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMSwidHlwZSI6MH19fSx7Imhhc2giOiI4NGY1ZDBmOTM0YmQ2MGYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMSwidHlwZSI6MH19fSx7Imhhc2giOiJiM2ZjYzIyZmNkMzgyZjNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZWNhOGMzMjE4YjM3MmFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMiwidHlwZSI6MX19fSx7Imhhc2giOiI5NjM2YmZiNGZlYWVmODM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMiwidHlwZSI6MX19fSx7Imhhc2giOiJhNTI1YjY3OTA2YTRjYjk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMywidHlwZSI6MH19fSx7Imhhc2giOiI2Yzk1OTk4NWQ3MTgxMDI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxMywidHlwZSI6MH19fSx7Imhhc2giOiI3ODQzZGI4ZDc2MGUyOGNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNCwidHlwZSI6MH19fSx7Imhhc2giOiJlYjdiNzU2ZmMxZjg4YWExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNCwidHlwZSI6MH19fSx7Imhhc2giOiJlZDRkNjcyNjg3YzI3NjAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNCwidHlwZSI6MH19fSx7Imhhc2giOiJiMTU2YjM0ZTRkNjkzZTQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNCwidHlwZSI6MH19fSx7Imhhc2giOiIxNmUxNDZlODdlN2QwMzgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNSwidHlwZSI6MH19fSx7Imhhc2giOiIxNDU3YmNiYzA5OGIyODY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNSwidHlwZSI6MH19fSx7Imhhc2giOiI0NTBlYjRmOTI3M2E1MDE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNiwidHlwZSI6MH19fSx7Imhhc2giOiI0MzZlNGVhYTk1YjIzZmNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNiwidHlwZSI6MH19fSx7Imhhc2giOiJhNDdlZTlmMDBjYTRmODU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNiwidHlwZSI6MH19fSx7Imhhc2giOiI4ODlhYjU2NDNjODM2NjhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZWE5NmYxZTAzODhkYTkyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNywidHlwZSI6MH19fSx7Imhhc2giOiJhZTg5NWExOGNjOGM0MTZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxNywidHlwZSI6MH19fSx7Imhhc2giOiJiYmI0NmE3ZjUwNjI0NDhlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxOCwidHlwZSI6MH19fSx7Imhhc2giOiIwYjRlMjZhNDBjYzJlNjQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkxOSwidHlwZSI6MH19fSx7Imhhc2giOiI3NDUwMzBjZDdhYzgwNDAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMCwidHlwZSI6MH19fSx7Imhhc2giOiI1NWRiOTU5ZjdjNTMzMTgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMCwidHlwZSI6MH19fSx7Imhhc2giOiIxNWI5YTgyY2NiZjJkN2ZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMCwidHlwZSI6MH19fSx7Imhhc2giOiI4MDFkNDNkYTJjOTc4NjZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMCwidHlwZSI6MH19fSx7Imhhc2giOiJkOWY4MTBkNzIwMTJkNGM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMSwidHlwZSI6MX19fSx7Imhhc2giOiIyM2M2NjViYjY4Y2MzMGNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMSwidHlwZSI6MX19fSx7Imhhc2giOiI4NDM5YjBjOGY3M2RhZjAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMSwidHlwZSI6MX19fSx7Imhhc2giOiI2YTE3Mzc4OTY4YjU5OGYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMSwidHlwZSI6MX19fSx7Imhhc2giOiI0ZTE1N2NkNTc4OTMxYTk3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiI5Y2RmN2Q3NGJlZTIxNTlmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiI1OGM2ODRiNzY0YjRkY2FiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiI4NTIxOGIwMDE3YjhmNDUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiI5Zjc5MGMwYzE0ZmE4ZjRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiJlNzUxOGFjZjVjNDRkMGE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiJlYzc2MzI4MmY4ZjQxMjk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MH19fSx7Imhhc2giOiI0MWEwODcwYjg5NWU3M2I0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMywidHlwZSI6MH19fSx7Imhhc2giOiJmMDEzNGExN2QzNjhmM2Q4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMywidHlwZSI6MH19fSx7Imhhc2giOiI1OGY2YzAwZjQ0ZmI2OWE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMywidHlwZSI6MH19fSx7Imhhc2giOiJmZjI2NmUwODhlMzAxMGE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNH19fSx7Imhhc2giOiI5NzQ4YzAxZjhkY2QxN2VlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNH19fSx7Imhhc2giOiI4ZTU4OGEwODE4YzRmY2ZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNH19fSx7Imhhc2giOiJiNDk5YTc1NGNjN2QyYzliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNH19fSx7Imhhc2giOiIxMmQzNjNmYThlZTZjNGQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNSwidHlwZSI6MH19fSx7Imhhc2giOiJhOGJjN2I2ZjY2NzAyNDg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNSwidHlwZSI6MH19fSx7Imhhc2giOiI1MTY2ZDk1MTVlNzU1ZjE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNiwidHlwZSI6MH19fSx7Imhhc2giOiIzYWRmODU2MGFkYTgzMGI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNiwidHlwZSI6MH19fSx7Imhhc2giOiJmMjRmODdjNzk5ZTkyYWU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNiwidHlwZSI6MH19fSx7Imhhc2giOiJhNjBkZWRhZGEwZmQ0NGI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1ZDBmMjI2ODUwZDJlNjhjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlNGM3MDMwNzBiNTM1YjE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiYzY0MGE5YzQyNTAyYjM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkZWZiMDZhYWI3NjA5OTJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5YmIwNjk1MjQ4NTZiMzRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlZjI1MzUxODU4NGYwMTNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlMTAwYmE5NjNhZDhlY2YyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwNWI2MjVlZTYyZDg2ODVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1YTg4ZmI1YWJmZmNlZmM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhMzFjMGI1NjhjYzhhZGU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzNDk4ODk0ZmJlYWM4MzQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYjgyNjA1YzQxZDhiNzA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4MTM4YWQ5OGVkMDM5NGU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3NTFjOWViYjIyMWJiNWY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4ZTM3OTM4MDRkOWNkYWI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhNmVjZjFhOTVjMjRiNmEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkMjdmZTBlOTgzNGU2NDhiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyYTBjMWI1YTkwNGIzNmMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmMGQ2YzM1ZmViZWU4MDA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzYzAxYTI5ZTNjOWM3MjY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0YTc0ZmRmZDliODE2ZmU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhYWM4MTg0ZjE4YjA0OTU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzNjhkYTE5YTkwZGIzYWQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxMTZkNDY0MDNjNmU5NWI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4MDhiYjc2Y2EzNGU0ZDFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiMTlmNjFmNmUzNWFhYTZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5YWZjMDE1NzNlMzhkMDIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxMWQ3YmNlMTk0YzU0OTEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhMjhiZTQzOWNhZDA4ZWJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5Njg3OTJmZmU4NWY1ZDJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkM2JjOTM0MzUzMWU2YzBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhMTFkNmIzN2IwMzgyMjIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0YmY2NWZhM2JiYTBjNTViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0ZTFkOTkyYTc2Y2YwYjQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiMDk5NzhhOGUwMWZkYmNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3Mzk0YjI0NTNmODU0YjU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhNzZkNDY0NTI2N2ZmMGJlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3ZTYwODYwZGYwYzg5NDViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlZDlkNGIwZGI1NTk4MjY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0NjZkMWQxNmYzYTkzNWZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyMWFjODk2M2JmMDI2ZTFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlMDRmNzI0NjFhMWZkZjdkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1NDk4NjBhNjkzM2U5MDZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkZGM3MzEzMjQxZjc3MzEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkODk3NTlhOTY4N2FkMzY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzNDNhZDk4YzdmNGQ3MWVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyY2I1MDQ3OTE5ZDg4Y2U4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlOTczOWVmM2IwNDAzZjE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyYjhjZTMwZjQ4M2Q5MGRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxZDEyOTVmMWNkYWM3NTAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1N2ZkM2MwOWUzNWNhMTdlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwNTBkZDQxYWNjM2FjM2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYjg1M2ZiNWMwOGM4NzI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYzNkYjYwMzRhZDVjM2U3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0Yjg3MTYwNjY4ZjUxZTcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkMDg3NWJjNzUxMGZiYWExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhNDYyNTc3MjRjYTY3YmMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjOTNkMzk3ZThkMWVkNGZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyY2M5YWU5NmU2YjU2ZmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwNTFlNzJmY2NlZWU3NGQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjMjRiNTVkYTJhNzA5NWRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4ODk4MWFmZDA3NmVjZjQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYWM5NGVmOGE0ZDlhZDViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhNTdmMGI0ZWQxYTIxNzQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmZjFmNDA3NjMyOWNiOTFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxZWExZjEwNDQwMDhhMGIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1YTliNGJmYTZkMDNjOTRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxNmJjZGU4MzY1ZGRmMmE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3ZDM3MzJkODU4OGZmZWRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmYjZhNmEwNmU0NDYzMDAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlMzU3ZTRiMTlhMTE2MTdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlZThhYTczZmVhYzY2NzczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4YWE0MjZiZDgwOGVkNzVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlNWVlZDIyNGY5NDZmMTFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzYjgxMjY5NmE1MGM3MDYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhMDRmYWNjODk4NTlkNzc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzNzQxM2M5ZDkzMzE5NTNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkNTcxMzk0MmQ3ODYwNmEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1MmU1ZDZhNjRmNDdmOWU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiYjQ5NTU0ZThkMGVhMjdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5OTQzZDc5MGU2MTRmNDVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiMzE4ZGEzYmFmY2EzMjNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4YTZiMzE5M2ViZjE2ZGFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5YTRlODkwYzU2MWIxZjQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzOGY4Yzc4NDYwZDBjMTcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjZWIyNjljZmNiZmIzNzM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI2ZmM4NmI0MmZhMjE5NGM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5NDg4NjhhZTNmODhlNzllIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmNzhhOWRhYTQ0NTAzYWNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmMDY1YjM3ZTI5MDFhYjQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwM2YzM2EyNGU1MDIyODAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkYjI2Y2VmODhlMzg3OWFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0OTZmMmZmMmFkNzJlYjU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhMzMxMjFjMTZmNWU0ZDIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYjU5NDc0NzZmMzI5N2FlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlYmFmOGFkMTZkNjc2ZTRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1ZWM3ZTIzNjhhNDFlN2QxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJmNjljYmMwMTdjMmJlZTczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlMjA5NTU3MWI4YTRhOWVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4ZThkOTU4OWZmNjEyY2NiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0YWNkN2IxNDkwN2QyZWFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwMGI4NjRiMzJjYTY5NjJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIwZTdmZDM3Njk5N2UwY2U2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4OTQ3YWI4Yzc2MDRhNzEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxMmFlNGM2Mjk1NGZiNGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1YzcwYTA1YzNiMjBjNDYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3OTIwZDQ1MjFmYzMxNzQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxNGQ3MTgyNGExMTRmYWU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1YzU4ZjM1YWQxMWVhMzZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjNjhmZjY5YWMxMDg2MDI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiZmI0ZDIxZTAzMjVjZDI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxYzUzMjhjZTcwYTdkNzgxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzYTI3MDAyZjNhNTFjMzkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxNWM1MzZiMjQ3ZGRkYTliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiOGRmZDMzODNkYzg1ZTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkODM0Mzg0Zjc0YjM3MzExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzM2FkNGE0NDdlNjVmZTRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI1ZjkyMzM0MzcyMTAzNjIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIzYjM2YTA2NzM0MDJkZGVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiOGU1YzlkZTg2MTQ1MTFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkNmY3ZDA5NTFhNzZiMjBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkYzczMTM2MmUwYTIyYzc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjMzdjZTI5YTEyNzk3Yjg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJiN2Y4OTAzY2VjZDNjNDE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlOWFlYTc3MzcwODNlYTI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJjYTg0OWM2MTFkZjIyNDljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlYmE5NjljMzU0ZDFhMmI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4MjhkMzQwZDM0YTg4ZTg2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIxOGE2YmZkYmM5YjE5OTljIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJlYTZkZTgxZWU1YWQxNTk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI0NmY5OTJlYWE4MzZlZjNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhNmMxNjI3ODFlZTNhODg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI5MjZkM2I2YmZlNmUxOTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI3ZTE1MTQ3NzgxZjJiMGI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyMjFkOWQ2MTI5MWVhYzc0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJkMWMxNmQxZmM0ZGM1OTk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiIyNTU5NmFiMzBiYWU4ZjQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI2ZjAzYzBlMTY1NTNlZGNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiJhZjdhYjU4MjQ2YjRjMmE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyNywidHlwZSI6MX19fSx7Imhhc2giOiI4MmExMDJkYzZmNTgwODU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MiwidHlwZSI6MH19fSx7Imhhc2giOiIzNWY2NjVlZmEwZTJhNTVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MiwidHlwZSI6MH19fSx7Imhhc2giOiIzYTQ4ZjE4YmYzNDBlNzRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MiwidHlwZSI6MH19fSx7Imhhc2giOiJlZTM2NTQzM2M2MmE1Yzg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2MiwidHlwZSI6MH19fSx7Imhhc2giOiJhYmU2MzcwYmQwODhkY2Y0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOCwidHlwZSI6MH19fSx7Imhhc2giOiI5MmRiYTFjZGNiYTgyZDhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOCwidHlwZSI6MH19fSx7Imhhc2giOiJlZTBjY2I1NzUwNTU2NWY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOCwidHlwZSI6MH19fSx7Imhhc2giOiJmMjVmNWU0OTA5Yjk3OTJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOCwidHlwZSI6MH19fSx7Imhhc2giOiI4YTllNmY3YmVlYjA4NGM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOCwidHlwZSI6MH19fSx7Imhhc2giOiI5NDU0MmM4NWNmMzk5Y2JkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMxOSwidHlwZSI6MH19fSx7Imhhc2giOiI0NmVhMDUyYTkyMjMzNTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOSwidHlwZSI6MX19fSx7Imhhc2giOiJlYTVkMjI3MTQ2NGNhMzVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyOSwidHlwZSI6MX19fSx7Imhhc2giOiIyODZhZDBhYzViY2E1ZDAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMCwidHlwZSI6MH19fSx7Imhhc2giOiJmZjFmZmM2N2I3ZTNmMzNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMSwidHlwZSI6MH19fSx7Imhhc2giOiI3MmNiYzViYTFlYzkzYjM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMSwidHlwZSI6MH19fSx7Imhhc2giOiJhNmZjMzFmODJjMjJmMzFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMWJhNjRlNWJiNDg4OWZjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFkNzVjYjExZGYwMTYyNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MiwidHlwZSI6MH19fSx7Imhhc2giOiI5MWUxZTk3MmUyNjkxYTUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMjNjNjhhZmI3ZDE5M2I3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzZDY0YTcwZWYxYzEwMmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlNWZkOTgyZDM2NDY3ODAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQwNTc4N2UwNmViYzZmNGMiLCJwcmVmaXhlcyI6eyJkYyI6eyJwcm9kdWN0Ijo5MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiY2RkYmY0ZmU3NDU4NDMzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiMWM2YjdmZjE2NTY0ZWJjOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiOGIwMGIwNzZhZjM3ZjU0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzIsInR5cGUiOjF9fX0seyJoYXNoIjoiNjg4YTBiMzc2NGUxNzQxYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzMsInR5cGUiOjF9fX0seyJoYXNoIjoiMDRiYmEyOGZhNjQ2OGIwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYzEwNzYxZmU5M2JkZGQ1ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzUsInR5cGUiOjF9fX0seyJoYXNoIjoiM2IwZmE0ZWZhMjA5ZWJmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzUsInR5cGUiOjF9fX0seyJoYXNoIjoiZTFiNDNiMjU0OWIwMzg1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzYsInR5cGUiOjF9fX0seyJoYXNoIjoiNmFkZTZkNzNiNzMyOTViMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzYsInR5cGUiOjF9fX0seyJoYXNoIjoiNjNlZmE5MTU1OTk5ZDA5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTY0ZWYxOWVlZjcyNTRjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNmJiZGYzY2U4ZWVjNmY1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDM2Y2M5YWI3ODFiMzU3ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZThjYzhjN2Q0M2M4MDI1OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjE1MGU0YzNkMGYxOTNiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTRkOGYzNDY2ZDU4NzliYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiYjkzMGI3ODBlMTI3MzVkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTgxNzU5NzEyNDk1OWEwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5MzksInR5cGUiOjB9fX0seyJoYXNoIjoiNTJhODJiZjNiYzU1Zjc1MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDAsInR5cGUiOjF9fX0seyJoYXNoIjoiZGU4NzI5MGFmMjcxMGRjZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTQxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjlmYTcyMjBhOWM1MTNiODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNkZWEyMzE0MzI4ZGI2NGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjlhYjEyMmJhZWU3ZmZlZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjViNzc2Mzg4N2Y2MmYwZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0NzZmNDBhNjQwY2ViNTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTksInR5cGUiOjF9fX0seyJoYXNoIjoiYjAzZDhjNDhiYzUxYTkwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxOSwidHlwZSI6MX19fSx7Imhhc2giOiI2Y2NmYzlkNjgxZjFjY2U0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjUxOWU3MDZjNzg0NzEyY2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTksInR5cGUiOjF9fX0seyJoYXNoIjoiNGI5OWY1NTc5YTMyZDJhYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiN2JiNjg2ZjY1M2ZhZjc1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTliYWMwNGIwOWViMTg1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYzdjNTkzY2FjNzI1MjI3NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiOWEyNjQyYjI5ZDAxYWQ1YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMTllN2YyYjY5NzA0N2QwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiOWNjZGUwYThlYzNmOTcwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTgxZWU2YjQ3NGQzMWY1MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiM2I3NDNiMmZkYTcxZGQ1ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjM3OGIzMDkwY2VhZmNmNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6NTU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA5ZGU1ZDljOGEwOGE0MTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ4OGZhZjk3ZjRmMDFiZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiN2E4MDc1Mzg3NTk3YzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQyMTI3ZWM3NThjNDg5MWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1ZmU2YmU4ZmZjNjViNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiOTE5MGE5OGQzMTcwMTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiNTVkOWUzMDZjZjllM2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5ZGExNWY0MDQ5OGE2ZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyYThkNDVhNGM1NWRhZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkZDY2N2Q3MWEzNGI3NjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjAwNzc2ZWMxYzU0NTc0ZGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY4YzNiOGYwMWM2MmRhM2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjZjMTgwNGRiNWI2Njc5YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImEzNjFkZTNkMmZjYmE2MDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFmODA1ZjU4ZGI2M2ExMmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcwOTBlNzlkOWVjMjY3NjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcyN2IzZDExMDBiN2QzNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE3YjM5NjE0MWI5NmMyMzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6Nzg4LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIwMTQ5ODU3ZjQzODYyZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5YzAwYzU1ZWRlNzkyZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhlYjI0ZTMzNDBiNGM3MDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkMjczMTlhNzBmYjYyNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTUzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIxNDAxNzNkZTU5MWRjNjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiI3ZTIzNTFiYTA1ZmVmY2NlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiODhhNjZjZTIwYzJkZjVlNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcwNTA0OWVhMTM3OGFkYmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiJlYWRhYmIxOWQ2OGYwZTAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiNjg0MzQzYjhmMDBiNTQyNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZlZGIwZDk4MWQxNTEwNzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiJlYjI2Y2I4OTU4Yjg0MTQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiYjRmNDIyMjJmZjQ4ZDYxMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjNlZjRjM2UxNWMzODg5YWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiIzNDZhYzkwZTQ4OWEwZDI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiZjA2ODVjOWQ4ODlhNGRjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQyYWUyNzkxNzY4MjEwMDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiI5ODc0NmUzZWI5MDc1Y2M1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiZjRlN2Q4Y2EzZjczMjUyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE0NWI2OWE1NTcwY2YwZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiJiOTZlNmQ4YTAyYWFiZTBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiNWY3ZGVmNDZlYzE3NzZhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjA3NWJkZjBlYWE4YTJkOGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiIzNzRkZGFkYjhiNTljNjU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiZTc1ZjExZjEzY2YwMTI3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZhOWYwNDNiNmY5ZjAyMjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiI1MTA0NmRhMjVhYWMxMzZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiZTNkOTExN2VhY2IwMGIwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIyOTFlMTFkMmNhNTE4YzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiIyMDhhZjNjY2NjYWMzYThhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiOGE3ZTdhN2M5NTEwYTUzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQ2MmRhYjRlNWJhMTkzMTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiI5ZmFlYWQ5OWI1YjllMTViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiMjFhZDRlN2U2ODk3ZTdiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjVmNmUzMzJmNGY3YWQwODEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiIyOGM4NzI5NWZkOTlkOWIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiZWM0ZDFmODQ0N2YwZjE1MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjozLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJjZGIwYzVhNjE5OWExMjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRjMTQyNDgyMGQ1MDg1YmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQxMTBhYWU3MzJiMWM4MGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0NjE1MjdjMzY0OGRhNDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTU1LCJ0eXBlIjoyfX19LHsiaGFzaCI6ImRhOGZiMjFjNTZkM2MyMjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MywidHlwZSI6MX19fSx7Imhhc2giOiJhYmI5M2UyNTgxOTExOThhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjMsInR5cGUiOjF9fX0seyJoYXNoIjoiNjdjZTFiMGJmYTk3MmNjNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjNjMTE1OGUxOGE1ZWEyNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NTcsInR5cGUiOjF9fX0seyJoYXNoIjoiNDZhNDBlN2EzMjhmZmVlNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYzVjYTI2OWQwOWI3YzI1ZiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTU5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkzZDM3NzVkY2I3OWY2NWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjBhZjQ2NmRhOGNhNzVkMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjExMWZmYTZiMTkyMzgxNDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ2MzEzYjFhMmIxNjRlMTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImVkZWFlYzQ3ZDE0MDZjZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0ZmEwM2U3MWU4MWM3MTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIwNWQzOTVhZDQzYTY4NTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJhYmY2MjUyYjRjNjAwNTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImRiODZmYzBkOTdkZGY4NjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVhNjFmN2ZhOTRiYzJmMzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ5NWQ1OGMzMTJhODU2YjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNlODU0MzY4YzhiYThjMjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdjMWViYmUyYWE0ODM4OGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBhYzljNTk1NmEyMzc5MTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjVlMjJiZjgxZjE3MjFkOTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFkMWFiNTZmM2ExNTExMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjZjODMzZjczMzUxZTFmNjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjgyZjhkMzI4ZGU3MTBjZmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk1YzMzNTM3Nzg5YTQ0MWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcxMmM4MTdkMDZjMGQ4YzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYzNDQ2YWUyNjUyODE4YWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTd9fX0seyJoYXNoIjoiNDViNTk4Y2QzYmM0MjY3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjQsInR5cGUiOjF9fX0seyJoYXNoIjoiMzcyZmRlMjVmYWExYzg3OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjQsInR5cGUiOjF9fX0seyJoYXNoIjoiZGIxZGEwZWY3ZGUzZTFlNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTcxMDcwNWRjOWUzYTk3MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNGVlM2Q3NWU5NmM4ZTNhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiYjMyOTY4MmYyNmU0ZmNjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzEyMTVjMjkzMWQ3OWQzNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjY3YTRmZTRiNTkyMzhiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiYTdmYmVlYzRmYjQzZjlkOSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6OTY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ4YTgyNWE4YzVlZjllZGQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjk2N319fSx7Imhhc2giOiIxOTQ1OWZiNDQ3Y2U0ZGU0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo5NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjA3OWYwYTk5OGM1NjU5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTA4ZGQyMWNlYmE1MzAwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiN2IwZGVjMmQ4YzFlYzk2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiYjVjM2YyZjNjMWMzNzg1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiYmE5YjRlY2ExNTk4Nzg0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiNGU1MjFiM2U1N2Q3NjcwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiMjlhYjI3MTVlMDA3NjFiMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiNjg4MDcxZDE3NzE4MDI3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NjksInR5cGUiOjF9fX0seyJoYXNoIjoiNGU2ODJjN2Y3ZjJlYmRhOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNGI2NDUxMjk3YmQ3NDI0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTVkNzVjZWQxMjYyZWNkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiYWM5NGQ3MGZmY2FkNWM2MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTc4NTkxYTllYjk2NTJmMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTUyODY2NmM3MmM3YzcxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiM2RlYjFjZDM5MjMzNzY1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNGUwNTMwM2RmOWYwNzUzMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTk5MzZlN2U0NTVjNzdiNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiZjBlNTk4NmRjNjU0MTZmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNTA5NTI4NWE0YWIwNTQ0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNjcwZmRiOGVhODZlZTIzMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiYWQyZGU2MjhiYzZmZDQ4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzEsInR5cGUiOjB9LCJsb2Rlby0iOnsicHJvZHVjdCI6OTcyfX19LHsiaGFzaCI6IjY2ZTI2Zjk3MDNmMmRkNjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwNDUxZTMwMjYwN2I2NTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiN2Y3ZThhYjdiOTk3MjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxZGJmYzAxYjVmODY2MDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJhODkyNmVjMTYyNzJhOWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRlMjMzNGFhYmYzYjdhZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiYmFiZjA1OTAwYTg5NGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE0NWE2Njc4ODc3OWI5YmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM0ZDEwMTAwNTUyNmUyZWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjdmNDM0MDBlMzgxZDQwZmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzMjM2OTdjMDJlMWE4NDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6IjExYzUwNWU2ZTIxZWVmZGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFmYzI0NjQzM2UxMjg0ZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM3MzIyY2QxYWQwZGY5NTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwOTBmNjFjM2VlNWUwMjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg0NmVhMGM0NjE1NjA0MjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTcyfX19LHsiaGFzaCI6ImI0MzNkYjRmZTVmNmVkOGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU1YjgxNDAwOWMxMzQ0OTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNlNmIyYzY0Y2UyM2QxNGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyZWY4ZDljNDkyODVlMTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFjOTllM2I1ODhmMWQ1MjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhOWUyY2Y1OWI4NTYxMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ4NmZmMTc3ZjEwOTUxNzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4NTNhZWRkMWEyNjdmZmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmNTA1MjE3Njg5YzcxNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3YmUyOTRjYmVhMDM5ZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhZTZjN2Y1MGZmZjc3MmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc2fX19LHsiaGFzaCI6IjYzZjUxNDI4NzEyNjc4ZWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MzIwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImYxZDkyMGNjNWExNmIzYTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6IjEyYTdkNzQ5NWViN2E5MWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjYTI4MzIwYzQ3NjUyMzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlYjE3MWY1Y2FkOTYzMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkZTFjMDkzNjZmMDM5MTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk5NzczNDlhMmM1MmMxYjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMzMDRkNzMyZjg4YzllYmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiMWIwZTk2NmE2NDM0NDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTYyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg1MmE0NDVlYzAzYjEyMjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTc4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImViZWY4NGEwMmU3NWIwMzciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjk3OCwidHlwZSI6MH19fSx7Imhhc2giOiI2ZmYwYWQ3YjRkNGVlMmVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk3OSwidHlwZSI6MH19fSx7Imhhc2giOiJjMjg0NThlMWJhYzNiYjc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk3OSwidHlwZSI6MH19fSx7Imhhc2giOiIwNDE0MDM3MDJlMGFlOWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk3OSwidHlwZSI6MH19fSx7Imhhc2giOiIzMTg5MGQ3NGJhMmUwZWNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjUyMCwidHlwZSI6MH19fSx7Imhhc2giOiIxNmYyYTA3YWVhM2M3NjdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MH19fSx7Imhhc2giOiI0ZDYyODU0ODQwMmYyOTMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MSwidHlwZSI6MH19fSx7Imhhc2giOiI2Zjk3ZWI3ZGM1NzhjMWQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY2OSwidHlwZSI6MH19fSx7Imhhc2giOiI4NDNjYzI2ZDY0Zjg1NWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5MCwidHlwZSI6MH19fSx7Imhhc2giOiI3ZjgxZWVmNDRjMjdmY2ViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ5MCwidHlwZSI6MH19fSx7Imhhc2giOiJmMzZiNWU0ZDg5NmJmOWZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MiwidHlwZSI6MH19fSx7Imhhc2giOiJlYzEwOTM1ZDcxNDFhYmIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiJkMDc0ZTUwMTcyODZkMjVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiJlN2FhMzkyNzRjMDVlZGY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiIwNmQzZGFlMmYxM2EzZGNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiIxY2MxMDk4ZjE2ZDM2NGUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiIxNWVlNTk1M2Q0Yzc0ZDQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4MywidHlwZSI6MH19fSx7Imhhc2giOiJiNDM0YjA5NDAyOWE4NGE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4NCwidHlwZSI6MH19fSx7Imhhc2giOiI3NjZiM2MyNGZiNDQ4ODIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjk4NSwidHlwZSI6MX19fSx7Imhhc2giOiIzNWUzNjljMTRkMzdjYjFjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0Ijo5ODYsInR5cGUiOjF9fX0seyJoYXNoIjoiYzViN2UxZmFlZjI3NDg2NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiZGMwMWFlYWQ0Zjc4NGU0ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzk1MjVjNWMxOWE4YTA0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzk3Yzc3Yzk3Yjc5NDVmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzA5N2E3OWFiNjg5YjMyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzI3YjY2MDg1ZGYwYzBkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiM2E3OTEzZmYwY2UwY2MyMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiOWQxNjYxZGFlNmZmOTMwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiY2RkMjY2ZDg3OGQzZTlkNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDNjMDhiZjAyODY1MjE3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODksInR5cGUiOjB9fX0seyJoYXNoIjoiYmJmZTcwMzk5Y2QzZmNiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODksInR5cGUiOjB9fX0seyJoYXNoIjoiYTE3YjMzYWE5NDIzNDg0OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODksInR5cGUiOjB9fX0seyJoYXNoIjoiOGUwNzNlYTQ0MDc0ZWM5MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODksInR5cGUiOjB9fX0seyJoYXNoIjoiMTJhZmE0NDJlMDlhMDdjOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5ODksInR5cGUiOjB9fX0seyJoYXNoIjoiN2ZhNWNhMDVhM2EwYjQ3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZjZmMGY2NTk0NzkwOWQ2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNzdiNTg2NjAyZTVkZWMzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYmJhMzI3ZjM0OGE0NjkzZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTU0NGEzYjI1YzRkNTExMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDM3Y2I0Yzk1OTg4NzBlZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMmE2ZWQ3YzFiNmE3ODUwOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDZkMjM3NTFhNzk2MzcxMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiMGE4NGVkMjg2NWE3NGI4YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTk3YTgyOGRjNzQwZDY0NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYWE5NjRhMTBhOWNjZGE1YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDc2NzViMzQ0YzE1M2RiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzZlYWYwNmZjZDk1ZThlOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZmNmMjZkN2VlYzk1ZDcyZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiM2IyMzhhMjMyY2JjMjZiZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiYTU0NGM3NmU3ZWMwMTg2MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNzkyMmNiMmYxMTk3MmM4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiMDYwZWU0YzMxMmE4ZTk3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZDRhMGFkNzU2ZmUyMzZiOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTV9fX0seyJoYXNoIjoiNjEzNTUxZWM5OWJlYzk0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTYsInR5cGUiOjB9fX0seyJoYXNoIjoiYmIwN2ViNWRlM2Q5NTAzOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNzI5MTY1YjJlYmJjNjk5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTg3NjI5NTcxZTAzMzhjZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTYsInR5cGUiOjB9fX0seyJoYXNoIjoiYmRkMmUyMDIyMWQ3ZTUwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMWNhZjBjYjdhMDVjNTk0MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NjksInR5cGUiOjB9fX0seyJoYXNoIjoiNGM2NTEzMzAwOTY2ZGEwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTgsInR5cGUiOjF9fX0seyJoYXNoIjoiMmMxZDZhMjAzNzg4YWYyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTksInR5cGUiOjB9fX0seyJoYXNoIjoiM2MwZGEyZDQzNTZlMThhNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5OTksInR5cGUiOjB9fX0seyJoYXNoIjoiMjU2OGQwOTE3ZDIzODk2NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDAwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3OWM4MjJhYjJjY2E4ZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwMCwidHlwZSI6MH19fSx7Imhhc2giOiJjNjEwYjVhZTNkZjkyM2NkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTYxNGFiNDNiZjJkOTA2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDAwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0N2VlY2E4NjgyMmYxOWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwMSwidHlwZSI6MX19fSx7Imhhc2giOiJjYmRmZGFlZmY4YjdkOTMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNWIyZDA4MmM3ODExYmVhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM4MTE3MjZiNTY2NzA2MzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwMywidHlwZSI6MH19fSx7Imhhc2giOiIwOWQzYjI3ZDM4MGQ0M2EwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZWVjYWI2OGY1NTVkMWY5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDA0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQwNWIyMGYzOGUzYmI5ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwNSwidHlwZSI6MH19fSx7Imhhc2giOiI0YTliOGRkZGQ0Yzc1NjdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTEyMTE0MmMxYjg2NzZmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDA1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwODNiOTNkNWE4N2M3NDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwNiwidHlwZSI6MX19fSx7Imhhc2giOiJjNjY1MDQ2YTc4M2RhYTlkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjYzZDVmZGJjM2E1MjcyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDA3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk5MWU5NjMxMDg3MTU3MWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwNywidHlwZSI6MH19fSx7Imhhc2giOiIwNTAzZDc3NTcwNGFmNGEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMmM1NWE0ZWY0MTUzMTIwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDA4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyODE3YTdkMTk2Y2JkY2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAwOSwidHlwZSI6MH19fSx7Imhhc2giOiIyZTRiYjFmNGQwN2YzMTgwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiZTdkMzY5YzI0OTcxNzg0YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE4YzliOTNhYWU1NzFlZDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAxMiwidHlwZSI6MH19fSx7Imhhc2giOiI3MTM3NzViN2JjNzM3MTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTMsInR5cGUiOjB9fX0seyJoYXNoIjoiOGI2YjQ1YzFjODZjZDg0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDEzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM0Mzc2MTg1NTA3YzlhZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAxNCwidHlwZSI6MX19fSx7Imhhc2giOiI4YjE3MjU0ODkyYjU5MGUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiODUxNmYwNDRmMTliYjNhZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ4MTExNzk0NTRmYWQyNTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAxNSwidHlwZSI6MH19fSx7Imhhc2giOiI5NDY2MTFmYTJmNGIwNjdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTYsInR5cGUiOjF9fX0seyJoYXNoIjoiY2ZhMGU5MDI1ZmNkNTcxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIwMWMwMjM5YWY3NGU3MmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAxNywidHlwZSI6MH19fSx7Imhhc2giOiJlNDgwZDAzYTk4MGQzYmZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjIyZmU3ZTE3YzU4YjU2MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY4ZGE3N2MyZmRjYWQxMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAxNywidHlwZSI6MH19fSx7Imhhc2giOiJjZWEzYmY0YWZlNTc2OTg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZjgwMjljMDA5MTg2MTYzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDE5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYxYjA5ZjVkNDA3MjJlNjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMCwidHlwZSI6MH19fSx7Imhhc2giOiJhYTYzMTUxNDg1ZWZhMTA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiZWQzN2U5OGY0NWYxMDQwNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDIwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5ZmRhODc5MjM5Y2YxNTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMCwidHlwZSI6MH19fSx7Imhhc2giOiIyZGZlOTEyNGIzNDM5ZDgwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTNhOWUyOWFjMjM4YjM4MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVlMDgwYjEzODc3ZjVkZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMCwidHlwZSI6MH19fSx7Imhhc2giOiJlYjIyZDU5ZDQ1OTRlNmQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYTI4ZTA3MmY4MDRkYjZhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDIwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0NWY5NDhlYWNlYTYyYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMCwidHlwZSI6MH19fSx7Imhhc2giOiJiODUwNzRhNDdkYTMzYjgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOWYzNjlkZWI0ZjA0NTM2NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDIxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkNmNlZWIzZWVmMzhjMjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMSwidHlwZSI6MH19fSx7Imhhc2giOiI2NTI0MGRmZTM3NDEwMDIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOGQzZGZjYmY3MDVmMTE5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDIxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEyZDM1YWZjOWM5NjA0NDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyMiwidHlwZSI6MX19fSx7Imhhc2giOiIzZDNiYzdmMDBiMGVmOGQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjMsInR5cGUiOjB9fX0seyJoYXNoIjoiOWViMDczN2ExMzBhNmYwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDI0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5ZmYyMjI1MGEzYzI5YTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyNSwidHlwZSI6MH19fSx7Imhhc2giOiI2MWYyN2EwMGYzODIxNzMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjA3OTI5NzQ5NDVlNzE4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDI3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjgxZjI3Y2IzM2Q0Nzg5NGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAyOCwidHlwZSI6MH19fSx7Imhhc2giOiJlOGFlMTNmZWUyNzk2MzM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDk3OWVkMzA0OGE5ZGMzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDI4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4N2M3ZTk0OGIzMjNiM2EiLCJwcmVmaXhlcyI6eyJkc3AiOnsicHJvZHVjdCI6MTAyOCwidHlwZSI6MH19fSx7Imhhc2giOiIxYTVjZmIzZjA4YjMxNjgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMjksInR5cGUiOjB9fX0seyJoYXNoIjoiOTliYjI5NTgyMjM0YjQ3YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE0YTBiMmQ4MjFmZWI0MDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzMCwidHlwZSI6MH19fSx7Imhhc2giOiI0YmZiNTc2ZjQ1N2IzYWQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDJlMzJlNmE0YzczMzQ0YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjOGFhMzIwYzBmNWZiOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzMCwidHlwZSI6MH19fSx7Imhhc2giOiI4YzNjYWU5NDcyZmNkNDNhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiMThkNjczY2MxNDdlYWJhNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZiNGYzZGQ1OTFjYmEyMmYiLCJwcmVmaXhlcyI6eyJiaWQiOnsicHJvZHVjdCI6MTAzMCwidHlwZSI6MH19fSx7Imhhc2giOiI0OWFlZjBiNDg4YWI1MDI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiMmI3YTE3NDU4ZjQ0MjI4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0NThjY2VlZGM5ZjgxMmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzMSwidHlwZSI6MH19fSx7Imhhc2giOiJkZDQ3ZjE3OGM3YTA1NWI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzEsInR5cGUiOjB9fX0seyJoYXNoIjoiZGI5NzViNzNkYTg2YzhjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyMTY5NDY4OTEyOTllMjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzMSwidHlwZSI6MH19fSx7Imhhc2giOiI1MmVlN2MyMjg2MmE3NGI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzEsInR5cGUiOjB9fX0seyJoYXNoIjoiM2NjMzllODAxYzkyZWE4OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDMyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxZmI4YmRmNmQyYjg1ZDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzMywidHlwZSI6MX19fSx7Imhhc2giOiJhNmZmNTcwMzI3NzNmZTQxIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDM0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNhZWI3YTA3MWE4NjZlMTciLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwMzQsInR5cGUiOjF9fX0seyJoYXNoIjoiNmU5NDZmNWZhYzcyYjBiNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDM1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxYzNkN2VmMTQ5OWZkMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzNSwidHlwZSI6MH19fSx7Imhhc2giOiJkNjgxZjA2MzkxYzdmODYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzYsInR5cGUiOjF9fX0seyJoYXNoIjoiMTU0OTM4NzIxMmFhYTZhMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0OGY2M2QyN2QwYzI0YzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzOCwidHlwZSI6MX19fSx7Imhhc2giOiI3NTc5YjEzNDFiMjI4ZjkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwMzgsInR5cGUiOjF9fX0seyJoYXNoIjoiZjJlNTcwZWNkMjU0MDM5OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkNGUzYjkwMDAxYTA0NGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTAzOSwidHlwZSI6MH19fSx7Imhhc2giOiI1MjgxNjdhMjg2ZDhjY2Y4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiMGIyZDUyOGMwZGNlNWJiYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1OGNjNDU5MDUzNzEyY2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0MCwidHlwZSI6MH19fSx7Imhhc2giOiI1Nzk1MWQ0YjM0YWRkMWE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiM2Q5M2RkZDJiMWRjODA4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4ZjBiOTkyYzRiOTljNjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0MSwidHlwZSI6MX19fSx7Imhhc2giOiJmODgyMDQzMGI0MmY4OWY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNmYwMThkYjZkN2ExMmY1ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI1OTFhYjBiYWNjZWNkNTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0MywidHlwZSI6MH19fSx7Imhhc2giOiIzNWQ4NmQwMTIxZGJkNDFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMjViMDlkZDBlOGQyOTc3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1Y2I4NTNlYmE2MTE5M2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0NSwidHlwZSI6MH19fSx7Imhhc2giOiJjNjIwMTA5YzY1NjEwYWViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDYsInR5cGUiOjB9fX0seyJoYXNoIjoiOWM2NTU0ZWJlYmRiZmEwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYzNGRkYjJiNjUzMzA3OTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0OCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZDllYjJhOGRjMWExNjg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDgsInR5cGUiOjB9fX0seyJoYXNoIjoiZTIyMDdkYzM3ZjFiODllOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4MmVjMWI0N2RiOTMwYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0OCwidHlwZSI6MH19fSx7Imhhc2giOiI2MzhhMmMyZGM1M2QyYWI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDksInR5cGUiOjB9fX0seyJoYXNoIjoiZWUzMzBlZDg5ODk3YTU1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYwYWIwMzVmMjhhMzVlMzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0OSwidHlwZSI6MH19fSx7Imhhc2giOiI1OTI5ZjJjMjg5ZDllMDczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NywidHlwZSI6MH19fSx7Imhhc2giOiJjMTZjMDIyNDgwMThhMzc0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NywidHlwZSI6MH19fSx7Imhhc2giOiJlNmViMmQxYzAzZDJiZTgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NywidHlwZSI6MH19fSx7Imhhc2giOiI5NWZhNDM5NmNhZGMzMzZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjc2NywidHlwZSI6MH19fSx7Imhhc2giOiIyNjA0YTdkOTZmMTY4Yzg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjk0ZmRlYmZkNDE3NzFhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM2YmViNDUxZmU0YzU4YzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1MCwidHlwZSI6MH19fSx7Imhhc2giOiJiMGY1ZjUxMjEwZTZmMmFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYWIzZGEyZWIxYTM1Y2JhNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDUxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzYmY1YTEwNzQzNzcyZWMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwNTIsInR5cGUiOjB9fX0seyJoYXNoIjoiZDIyMzI1YjZkNmIwNDkxOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTA1MywidHlwZSI6MX19fSx7Imhhc2giOiIyNzk2NjEzMTIxNWU1MDhhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDUzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjgwMDIyYjlkOGRkYWZmZGUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwNTMsInR5cGUiOjF9fX0seyJoYXNoIjoiOTM1MmQ3N2JhMjg2YzAzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0YjdlZjAxZjQyZDkzZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1NSwidHlwZSI6MH19fSx7Imhhc2giOiJmMmE3OGJiODAyZGM0YWJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjg4NTc5OGVhYWFjZTY0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiYzgxM2YxMTM5MDhmMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1NiwidHlwZSI6MH19fSx7Imhhc2giOiJlMWE2ODUyYzg2ZGE0MThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMDM0M2I2NWQwMTBkYjRiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE5Yjc0ZTFiY2IzMzlkZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1NiwidHlwZSI6MH19fSx7Imhhc2giOiJlOGQzMjVkN2JlMGYwNDZiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDU2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3Y2NiMTc1M2I5YWUyZWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1NiwidHlwZSI6MH19fSx7Imhhc2giOiI0YTk2ZGI3MjljYjlkZDQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTYsInR5cGUiOjB9fX0seyJoYXNoIjoiYWZkZThjMmViY2MzODBjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1ODQwZWIzZmY0NDMyYTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1NiwidHlwZSI6MH19fSx7Imhhc2giOiIzZTVmMGY4M2IwZTM0MzkxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZjc5ZmUxNDc0YzQ3NWFkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI4YjYzZTI5MTMwZDc5OGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1OCwidHlwZSI6MH19fSx7Imhhc2giOiI2NjI0NDJhODc1ZDVhZTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiZDg0ODdlNGM4OGEyMWM3ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDU4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3Njk0NzI5YmFmMjlhYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA1OSwidHlwZSI6MH19fSx7Imhhc2giOiIwMTUzYzE2NTg3YTBjOTdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjAsInR5cGUiOjF9fX0seyJoYXNoIjoiYzdiY2NhN2U4ZGM4MjBmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIxNzZiOGM3NTViYmFiNDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2MCwidHlwZSI6MX19fSx7Imhhc2giOiIxOTc5YjMzZjY4ZWIwZGVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjAsInR5cGUiOjF9fX0seyJoYXNoIjoiMzJhOWVhNjkzNjIyNTU4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE2ZmVjNjcwNDBiZjNmZjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2MCwidHlwZSI6MX19fSx7Imhhc2giOiJlZDg5YjMyNWE3YzNhYzZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjAsInR5cGUiOjF9fX0seyJoYXNoIjoiYWUzYmM0NjkwZWY4OWU4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVkOWEyYTRmNDlhZDQ2NDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2MCwidHlwZSI6MX19fSx7Imhhc2giOiIzOThkMzY2NjlhNzdhY2E2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjAsInR5cGUiOjF9fX0seyJoYXNoIjoiNWJmOWMwZjQ1MGY5ZWIxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjMwZTdkZTFlMjc3Yzc2OTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4OGQ5NDQ2ZDYyMWQ4MmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwNjFhNGNkNjUzZWEyZGMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwNjEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDZkYWE1YjgyZWJmYTQxMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDYyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZmMGY5YTkwYzc5ODcxNWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2MywidHlwZSI6MH19fSx7Imhhc2giOiIwMjU5Y2JhODlmOGY5Njc2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiMGNhMmJhYmJhZWVjYTNiZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDY0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5YTlkNGZkMWI0NjgwNDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2NCwidHlwZSI6MH19fSx7Imhhc2giOiI2YTc5YWM5M2NkZGMwY2M1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjg1YjE3ODM4ZjJkOWI4MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDY1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhNjZmMDFiZTMzMjU2ZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2NiwidHlwZSI6MX19fSx7Imhhc2giOiIzYjhkZmQ3OWFiOTIxZDliIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTk5MmUzOTdlMGRmZjE4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzZWIyMzBjZDlmNjdjNzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2NywidHlwZSI6MH19fSx7Imhhc2giOiIwYTc1YzI2ZjVjNTgwYjNhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ0NjZkNzNkNWQ1ZGNlMTkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTBiZmIyMzI3NDAwZTJlYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjEyMWI3N2Y0YjQ0MTJjODUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA2OCwidHlwZSI6MH19fSx7Imhhc2giOiJlNDZlYzhhYTYyZjNmNDMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNjksInR5cGUiOjB9fX0seyJoYXNoIjoiOTg0OWRiNGQ0YTY5NGYxNiIsInByZWZpeGVzIjp7InQiOnsicHJvZHVjdCI6MTA3MCwidHlwZSI6MH0sInMiOnsicHJvZHVjdCI6MTA3MCwidHlwZSI6MH0sInNuYSI6eyJwcm9kdWN0IjoxMDcwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmYzBhZWYzN2Q1ZmZmY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA3MSwidHlwZSI6MH19fSx7Imhhc2giOiI0Y2M3NWJlMzI1NTMyMjJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNzIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjFhOTBkMmFhYTMyOTMyYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDcyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiZWE4MWJjOTA2NDA3NTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA3MywidHlwZSI6MX19fSx7Imhhc2giOiJkMTkzNTQwYmI3NTQwZTVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYWJkMWMyYTM3NzMzMTI4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDc0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1NDZmZTE1MTk5Y2JjZTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA3NCwidHlwZSI6MH19fSx7Imhhc2giOiJmNDNjNDBkMTk0OWYyYzUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNzUsInR5cGUiOjB9fX0seyJoYXNoIjoiMjg1NzdmN2MxN2M1NWIwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDc2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZhMGM1MWRjNTVmYWRkYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA3NywidHlwZSI6MH19fSx7Imhhc2giOiI2ZGVhMTE5YzRjOTVhYWE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzliNDc1MjQyNmRlZGQ4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDc4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNjYmE5ZjM5NjZlYWJlNmIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEwNzksInR5cGUiOjB9fX0seyJoYXNoIjoiYTZiYWVmNzVmMTI2NDUwZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNmNDVlZmQzZmVkYTFiYTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4MCwidHlwZSI6MX19fSx7Imhhc2giOiJlZmViZjhjMWVhNmJhYjg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODEsInR5cGUiOjB9fX0seyJoYXNoIjoiYTg2NmZmMmJmZTMxMzNlNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ5Yjg5NTU1MzgyZGFjOWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4MSwidHlwZSI6MH19fSx7Imhhc2giOiJlMmQyYjE1MzcyNzFmZjYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODEsInR5cGUiOjB9fX0seyJoYXNoIjoiNTgwNGU3Y2YyY2RiYmRhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiMGVmMmI0ZWZmMjUyNzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4MSwidHlwZSI6MH19fSx7Imhhc2giOiJkOTYwNTM1ZmQzMDcwNGY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODEsInR5cGUiOjB9fX0seyJoYXNoIjoiMjU4OTE1ZGY0NDA2ZmQwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzNGExZTNmZDUxYWFkYjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4MSwidHlwZSI6MH19fSx7Imhhc2giOiJjMGFkN2VjNmUxZDQ2Mjk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODIsInR5cGUiOjB9fX0seyJoYXNoIjoiNjVjMDQ5YTUxNzcyMGI1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI2MGIyNDI2MDI4YmFiYTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4MywidHlwZSI6MH19fSx7Imhhc2giOiI2ZDJkZjk1ZTJiZjUyMDQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODMsInR5cGUiOjB9fX0seyJoYXNoIjoiYjRhZDZlYTZjYTMzNmY1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDgzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI3NTAzMTFjYmQ1YzQwMTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4NCwidHlwZSI6MX19fSx7Imhhc2giOiJhYTYzNGEzZDg4NjJiM2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODQsInR5cGUiOjF9fX0seyJoYXNoIjoiMzYxZWVmZGZhMjlhZGExMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhhNWMyYzhkMjFmYzZkZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4NSwidHlwZSI6MH19fSx7Imhhc2giOiIxM2IzZDJlMGVkNzhlNTE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODYsInR5cGUiOjB9fX0seyJoYXNoIjoiYzliMjlmZTI3N2E0N2I4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYwZjMyZWFhOTMzNWU0YjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4NywidHlwZSI6MH19fSx7Imhhc2giOiJjOGY0OTAzNWNiMjczZTQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODcsInR5cGUiOjB9fX0seyJoYXNoIjoiOTJkOWUzNjBmMTZlY2RjOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkM2I1NTY2YWZiNTM1MGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4NywidHlwZSI6MH19fSx7Imhhc2giOiIwY2EzYjIwODhkZTI1MTRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjdkYTk2ZDVhZTk5ZmFhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM0N2U4OTg0OTFkMDI3ZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4OCwidHlwZSI6MH19fSx7Imhhc2giOiJhZTNmMjdhZDRhNGYyZjdkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODgsInR5cGUiOjB9fX0seyJoYXNoIjoiY2QwYzhhNWRkNzkzZWU1MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ1MWY0MDgzZjAzMDI4ZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4OCwidHlwZSI6MH19fSx7Imhhc2giOiJlMWIwNDhlNGZhMzdlZWYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODgsInR5cGUiOjB9fX0seyJoYXNoIjoiODM3YWU5MmQ5Y2Y2YjkzMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZhZTgyYWFjODdkYjk0ZDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA4OCwidHlwZSI6MH19fSx7Imhhc2giOiI4NGRkZmE1YTJlOTNjYjY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwODksInR5cGUiOjB9fX0seyJoYXNoIjoiYTcyMDFmNWE4MDgyNDI0MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDg5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlYzIyY2EwNTMxMDM2MmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5MCwidHlwZSI6MH19fSx7Imhhc2giOiJkMTU5YWJiYWVkYTIyZTdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOTEsInR5cGUiOjF9fX0seyJoYXNoIjoiNDI2NzgzZDZmZThkMDM5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDkyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQyNzBhZDUwYmI1M2ZiMDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5MiwidHlwZSI6MX19fSx7Imhhc2giOiI0OWM2OTMwNTg1MzRiZTgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYTJiOWY2MjdkYTg3MzdkZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDk0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjEzYjczMTY5NTQwNjQyZTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5NCwidHlwZSI6MX19fSx7Imhhc2giOiJhZmFhMTA2ZDExODQ2ZmE0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMDk1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI4YjRlYWRlYjVkM2ExMjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5NiwidHlwZSI6MH19fSx7Imhhc2giOiI0MzU0NmU5ZjZmZjViZjJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjFhOWVkYjlhZjM3NjljZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDk2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3NmIzZmU3MDQ4ZTkzZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5NiwidHlwZSI6MH19fSx7Imhhc2giOiI1NzI2MzQyNGMwZTg4YTkyIiwicHJlZml4ZXMiOnsidHJhY2siOnsicHJvZHVjdCI6MTA5NywidHlwZSI6MH19fSx7Imhhc2giOiI1MTZlOWZjNWVkZTRhZjBkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOTcsInR5cGUiOjB9fX0seyJoYXNoIjoiNmJjMDMwM2E0MjYyY2I2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwYTMyZmUyYTg5ZGNjZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA5OCwidHlwZSI6MH19fSx7Imhhc2giOiI3ODgxZGE2MDQzODNhNjQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjY2NiwidHlwZSI6MH19fSx7Imhhc2giOiJkZWMwMmM2NjNiYjA2MDk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOTksInR5cGUiOjB9fX0seyJoYXNoIjoiNmUyMDk4YWY1NzdjNjcxZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTAwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYwNzc0MDc1Nzc2ZTI2MTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwMSwidHlwZSI6MH19fSx7Imhhc2giOiI3OWE3NzVlZWE2YTkwMmU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJjMDU3NmRiNWNmNGJhMjBiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJkOTBmZGE5ODVlM2ZiNmJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJlZTQ5ZGNmOTMyNmU4NTNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI1YjNjNmFiY2Q0NGRlNzIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJmOTdhMzIwNDgwNTQxYTI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI1N2ZjMzYzMDJlMGJkZTNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI3MzZhOGE4YTBjZWY3YmRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiIzNjI2M2I0YTBkNjA3YTcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiIyMjY0ODBiZjU4ZjRmZDFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI1ODM3OWJkNjIzNTk3ZDcwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJmNjhlM2E1NDRhNzM5N2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiIwZjI4ODBkNzE3OTRlNTE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZWY1Mjc0MWZjMWFkZTczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiI5N2Q2YTkzNjM1ZDcyYWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJhYjc1YTQ2ZGM4YmYyYzFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJlZmViOGY5NjZkYjAzYjg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwOSwidHlwZSI6MH19fSx7Imhhc2giOiIyYTRkODA0YzBmYjM5N2MxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDIsInR5cGUiOjB9fX0seyJoYXNoIjoiMjlkMzcwY2FhNTliNGVjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTAyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEwNjYzMmVjMWJlODIzMTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwM319fSx7Imhhc2giOiJiZjEwZTQwYmFlMDQ3MjI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDN9fX0seyJoYXNoIjoiNjdkYmQ0ZWJmY2E4ZWQ3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTAzfX19LHsiaGFzaCI6IjNjY2ZmYjAxMGE2MTUxZjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwNH19fSx7Imhhc2giOiI3ZDgzODAwNWEzOTU1MmQ4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDAzYjc1MzdiZDlhN2NmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTA1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2YjMzYTc5NDgyYWI3YWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwNiwidHlwZSI6MH19fSx7Imhhc2giOiIxNWNkYzE5NjM4OTBhNmEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiMWYzNmI5MjBiN2FjNGViYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTA3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1OWFmYWExODIxMzYyYmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwOCwidHlwZSI6MH19fSx7Imhhc2giOiJlMGVkY2Q1ZmFmZGUzZTdhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDgsInR5cGUiOjB9fX0seyJoYXNoIjoiN2JkNDhkNjI1NTEzMGRiNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTA5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4YzQxZmJlMGRiOWE0ODMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEwOSwidHlwZSI6MH19fSx7Imhhc2giOiJmYzEwODBkYmY0ZmFlM2Y5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMDksInR5cGUiOjB9fX0seyJoYXNoIjoiMzdmYzIwNTAwN2Y3YTA0MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYwYzAyYTJlYTAxYTczN2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExMCwidHlwZSI6MH19fSx7Imhhc2giOiIyNDEwOGQzMGI1MmI5NTg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTEsInR5cGUiOjB9fX0seyJoYXNoIjoiOWRlNTEwYTJkN2Y4MWE2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTExfX19LHsiaGFzaCI6ImQwZTE4YzdlNzJiNTFiZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExMSwidHlwZSI6MH19fSx7Imhhc2giOiI2ZGJlMTZmNTg5NGUyMGFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI5MmVmNGJhODM2MjNhOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTEzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5NDI4NWFlNTBiY2I0OGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExMywidHlwZSI6MH19fSx7Imhhc2giOiJjZDdiNDMyNzI5YWIwMTZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYWUwNDQyYTMwMGViY2U0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTEzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjOGNjNTZkNWI1MTRlYzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExMywidHlwZSI6MH19fSx7Imhhc2giOiI3OTRiMmE1MTU0NmI0ZjdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTQsInR5cGUiOjB9fX0seyJoYXNoIjoiMjIzZWFjZjk3MjU0Yzg4OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYzVlZWVmMjg1NTE3ZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExNCwidHlwZSI6MH19fSx7Imhhc2giOiJiMjIyZjk0OThmY2RiMjRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiODdhZjk5NzRiMzBjNTg3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRiNGNkM2U0ODc0MTg4OTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExNSwidHlwZSI6MH19fSx7Imhhc2giOiIzZmNhNjE5MTU5N2Y0NGYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTYsInR5cGUiOjF9fX0seyJoYXNoIjoiNjg3MzQ4N2IxMWMxOTUyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQ0YjRlZDNlMWQwN2IwMGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExNiwidHlwZSI6MX19fSx7Imhhc2giOiJlNjQ3ZjUwMmRmMDQyOWY1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzRmOGZjNDNlMTRiYWQwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmNDM1MDdmNWE4Nzc3ODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExNywidHlwZSI6MH19fSx7Imhhc2giOiIxNDY2ZTZmNzczNTIxOTRhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTA5NzQ5N2Q2MDZkMTdlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1YzliMmViOTJjOGI1YmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExNywidHlwZSI6MH19fSx7Imhhc2giOiJjZTNiZmJlMDlkZGViODU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiM2FhOTZiNzUxZDJjMGQxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI4OWU1NjVjOWM2ODY1MTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExOCwidHlwZSI6MH19fSx7Imhhc2giOiIwYjY3NDBiMzk1YTY1ODU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMTl9fX0seyJoYXNoIjoiYzAwMzY1ZWQ0ZDFjNDY0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTIwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjllZTJhMDdlYmRlZjIwNmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyMCwidHlwZSI6MH19fSx7Imhhc2giOiJlMjcwMzc1ZjI3YzVmMzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjAsInR5cGUiOjB9fX0seyJoYXNoIjoiMGViZjU3M2ViYjZiMzBlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTIwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyOGI0YzI1M2IxZjg1NGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyMSwidHlwZSI6MX19fSx7Imhhc2giOiIzYzg5MDBjODUxYmE5YjI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjIsInR5cGUiOjF9fX0seyJoYXNoIjoiMzk1MThlNTFhZGJlMGNkNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTIyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJjNWVmZDFlYTUzMmYwZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyMywidHlwZSI6MH19fSx7Imhhc2giOiI1Njc5MzY4ZTZiMmJiMzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjQsInR5cGUiOjB9fX0seyJoYXNoIjoiNjBiZTdkOGE2YTc2YjYyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTI0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlZmJlOTI0MGEzNzdkOTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyNSwidHlwZSI6MX19fSx7Imhhc2giOiJhNTY4MjQyMjdiYjQ5NmY3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTI2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxZjJhZTdkMmQ2OTM5YWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyNiwidHlwZSI6MH19fSx7Imhhc2giOiI1MWZkOGIxZDViOTgzYjMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTJjM2QyNDZjNmQ0ZTZiMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5ZGEyYmZhNGU0MTRlMmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyNywidHlwZSI6MH19fSx7Imhhc2giOiI2N2JiMWUzNDYwZDhlMmViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzg5MTI1NThhMTFmZjczZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTI3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImViNGQzNmNmNWU0OTA5YzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEyOCwidHlwZSI6MH19fSx7Imhhc2giOiIxNjU3ODM3MWYyNGE1ZTkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMjksInR5cGUiOjB9fX0seyJoYXNoIjoiZWNkYjY4YmQyNjIyYWE5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MCwidHlwZSI6MH19fSx7Imhhc2giOiI4YWRjY2IzODQ3Y2M4YjBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiNTQzMzc4MDMzNGI1NDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDAsInR5cGUiOjB9fX0seyJoYXNoIjoiYzg1M2M5Mjk4NmQwY2M5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MCwidHlwZSI6MH19fSx7Imhhc2giOiIzODhkYTMzZTdmMGFkY2ExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAzZDdhNjVhYTFiYzg3YmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzMCwidHlwZSI6MH19fSx7Imhhc2giOiIxNzZlYjcxYzA5MzhmNGE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMCwidHlwZSI6MH19fSx7Imhhc2giOiI0MzY2ZWMzYWU5ZjQxZjdjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMCwidHlwZSI6MH19fSx7Imhhc2giOiIyZTk2MTdlZjcyN2ZmMGI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTFkNmQxM2UzZWI0OGE4NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwZTE0ZWY1NzMyNDhmZWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzMSwidHlwZSI6MH19fSx7Imhhc2giOiIyMzQzNDVmZTNjMGRhODQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMzBmYjYwYzljNDUwMjIxZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTMxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5ZGRjNzg1MjIyNGUxOGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzMiwidHlwZSI6MX19fSx7Imhhc2giOiIyNDAxNzRiYWQwMDExMDhkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI1MGE3YTNmMmU0ZjczYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTMzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjU5MGZlYjZiNzkzYmEyMGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzMywidHlwZSI6MH19fSx7Imhhc2giOiIyM2RiMTNjYjY2Zjc2OWUzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2Q3Y2Q2YzE2ZjcxNDAyNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwZWEzNWQ3NjI3NWRiZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzNCwidHlwZSI6MH19fSx7Imhhc2giOiI1MjM5Y2RhZTAwZmYwMmVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzUsInR5cGUiOjB9fX0seyJoYXNoIjoiZTJjNTM5YmVmOGQyOTcwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcwNzhiZTg3MDdiNWVjOTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzNiwidHlwZSI6MX19fSx7Imhhc2giOiJkNjVmZTllZDlmMjNhZmJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzcsInR5cGUiOjF9fX0seyJoYXNoIjoiOWNjZmM3ZjJlY2ZiYWVlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjU0ZTgwMjU0YmJmNGUyMGIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzOCwidHlwZSI6MH19fSx7Imhhc2giOiI0YWFmMjYzYjRiYWU2Y2QxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzl9fX0seyJoYXNoIjoiYjc4MmQ2YzEwMTcwZTczMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM5fX19LHsiaGFzaCI6ImNlZWYyOWM1MjMyOWM0MDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzOX19fSx7Imhhc2giOiJmMTRkZjZjYTJlMzAwYmI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzl9fX0seyJoYXNoIjoiNTE0YzM1NTAyNmM5NTYzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM5fX19LHsiaGFzaCI6ImIyNTI5YjdlYmMwY2JiMjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTEzOX19fSx7Imhhc2giOiIxNGViZjliMGNiZWQ5NDVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMzl9fX0seyJoYXNoIjoiMDQ4MTQ3ZWVhMzc4ZWUwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTM5fX19LHsiaGFzaCI6IjdiNjE0NDA0OTFiZDJhNjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0MCwidHlwZSI6MH19fSx7Imhhc2giOiIwMzY0NTVlNzgwMWU4NTNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiZTYzMWYwMzQyZDU5MTc2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg3OTM4NTIyYzY2OWM2ODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0MSwidHlwZSI6MH19fSx7Imhhc2giOiJhMTAyYzg3Zjk5MjFiZWI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDIsInR5cGUiOjF9fX0seyJoYXNoIjoiZjkxMzNlNGEwNjlhMGY0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjZjNzczN2MwZWNiZjBkOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0MiwidHlwZSI6MX19fSx7Imhhc2giOiJhODJhMGMxOGY2ZGZiOTU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDIsInR5cGUiOjF9fX0seyJoYXNoIjoiZTFiZWEwOGVhMzhkYzYwMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ2MGUxYWRhOGRmYTQ4ZmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0MywidHlwZSI6MH19fSx7Imhhc2giOiJiNTdmN2I5OWY5ZGVkYTcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjNmOTM5NzY5MTBlNGFmZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkzYTc1ZjNmNTE3NGU0NzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0MywidHlwZSI6MH19fSx7Imhhc2giOiJiYTE1MDA1MzcwNjQ0OTRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2UxYzNlMTgzODUzZGVjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5NzM4NDg4MWJmYjlhODUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0NSwidHlwZSI6MH19fSx7Imhhc2giOiIzYjVlMWU1ZDcxYmIwOTVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDUsInR5cGUiOjB9fX0seyJoYXNoIjoiYTU1Mjg5ZWM0M2ExZmQxYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBlYTEyMjc0MWI1YTI5NmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0NSwidHlwZSI6MH19fSx7Imhhc2giOiIxMzljMTQ3ZGI0YTY2ZDQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDUsInR5cGUiOjB9fX0seyJoYXNoIjoiOTFhOThhZDgwNDg5ZTJhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3NmY1YTlkMGVkMjBkNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0NSwidHlwZSI6MH19fSx7Imhhc2giOiI4NDA4Y2Y2YzkzZDJmMjRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDYsInR5cGUiOjF9fX0seyJoYXNoIjoiNjU4MjIyZGFiMmFhNjkyZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ2LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijg4MzUxNTY0MTVlZjVjNzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0NiwidHlwZSI6MX19fSx7Imhhc2giOiIzYmE2Y2M3MjE2YTdkNWFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NCwidHlwZSI6MH19fSx7Imhhc2giOiI3ZDc2ZDBiN2MyYzQ5ZTFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjZiMzE1YTE5YmY3NjJjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwY2UwNTg4OWFmM2JiMGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0OCwidHlwZSI6MH19fSx7Imhhc2giOiIyZDk3OThmMDZmM2NkMGY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDgsInR5cGUiOjB9fX0seyJoYXNoIjoiNDcyNGU1MWY2MDFlN2JmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUwZjkzMjk0ZWY3YzNjYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0OSwidHlwZSI6MH19fSx7Imhhc2giOiJlZDFlMGY1MjM3YmU5MzRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDksInR5cGUiOjB9fX0seyJoYXNoIjoiNGEwMDExYjIxZjhkOTVmOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFhZjllZmE3M2MzYjNiMjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0OSwidHlwZSI6MH19fSx7Imhhc2giOiI0OWVlYTA2ZjBjMTNkYTdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNDksInR5cGUiOjB9fX0seyJoYXNoIjoiNTg0NDU5YzhjZmU1NTk1ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiNzJkOGUzMDY1ODhlNzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE0OSwidHlwZSI6MH19fSx7Imhhc2giOiJmOGQ2ZTZkMTI3ZDljODk0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOTNkODY0ZjVlNDNhMzIzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTUwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5M2Q1YzljNWMzNWIwZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE1MCwidHlwZSI6MH19fSx7Imhhc2giOiI3YjljNTg2NDM2NGQ1ZjVlIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTUxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdjODYxNTJhNTYxYzRiNGIiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExNTEsInR5cGUiOjF9fX0seyJoYXNoIjoiZWM5OThlZmRmOTliMGM1MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE1MiwidHlwZSI6MH19fSx7Imhhc2giOiJlODNjMDFlYzc0MWEyNjFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZTMzM2Q3MGFjNmQxYWNkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiODFkNWZkOGEwNTJiN2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE1NSwidHlwZSI6MH19fSx7Imhhc2giOiI1NWIyNTE2NTA5MjUyYWRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTllNGUxNWI0ZmU2ZGNjZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTU1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1MDA1ZDdhMTRhYzBhNDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE1NSwidHlwZSI6MH19fSx7Imhhc2giOiJlY2YzZGQ5OTI2Y2JlMjVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMmNjZGZmY2NiYmYyMGUzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTU2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImJmMGRkNmZkYmM1M2RmZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTExLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFjNmE3NWYxMGY5ZjAzOTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE1NywidHlwZSI6MH19fSx7Imhhc2giOiIyYjVmNWU3MzFkMDgxMTZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTcsInR5cGUiOjB9fX0seyJoYXNoIjoiOGJmMmZlN2YwMGIzYzc2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTU4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4MGJkM2JjNzYyODYxYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE1OSwidHlwZSI6MH19fSx7Imhhc2giOiJkOWZhYTM2NDEwYzM5MjczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNTksInR5cGUiOjB9fX0seyJoYXNoIjoiNjExNGNiZjdmNDVmZDYzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjczOTU2OGYwODNmMzgzZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2MCwidHlwZSI6MH19fSx7Imhhc2giOiIxZmM2M2QzNmMxZDMzMGZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjAsInR5cGUiOjB9fX0seyJoYXNoIjoiYmRiMDdjMDUwZGUwYmJkMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTYwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZiNmE4OTFhNjFiMDU0MzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2MSwidHlwZSI6MH19fSx7Imhhc2giOiJiNzgzMWUwMmExMTY4ZjdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzhmMThjYTkxMDNlNjAzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTYyfX19LHsiaGFzaCI6IjlhMWY3NTFjNzRhMDExNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDEsInR5cGUiOjB9fX0seyJoYXNoIjoiMDlkZGY0ZTMyNjhlNjU5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImM1ZGQwODQ5YWMyZmViYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2NCwidHlwZSI6MH19fSx7Imhhc2giOiIzYjQ3MWY4ZjA4NDEwODgzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjUsInR5cGUiOjB9fX0seyJoYXNoIjoiMWJiNzRhYjIxMWE0MWM5YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTY2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2YzBhY2ZjZDgxYjJkZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2NywidHlwZSI6MH19fSx7Imhhc2giOiIwZTViOTNhNmJkNmY3MDRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjgsInR5cGUiOjF9fX0seyJoYXNoIjoiYTgxMGJlNzIzNmJmOTQ4ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTY5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmZTEzZTQzNDJmZDlhMzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2OSwidHlwZSI6MH19fSx7Imhhc2giOiI5MWQ5Nzg2OWY0NWRmNmUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjksInR5cGUiOjB9fX0seyJoYXNoIjoiYzlmMTcxNmVjOWQyOWM0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTY5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhOTE0OGU3MTdjYjQ2YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2OSwidHlwZSI6MH19fSx7Imhhc2giOiI5YjU3YjI5NmMyZWRkMDFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjksInR5cGUiOjB9fX0seyJoYXNoIjoiMWRiNzJlYTg4MGViMjhkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTY5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYxODg5ZDAwNzhkZDQwYTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2OSwidHlwZSI6MH19fSx7Imhhc2giOiJmZDhmNTk3MWJmODYyNDMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNjksInR5cGUiOjB9fX0seyJoYXNoIjoiZDBkYTViNTdmYzNiOTYxMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTY5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAwNDQ5MTcyYjcwZDUyMGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE2OSwidHlwZSI6MH19fSx7Imhhc2giOiI3YjMwMjdmNWE2Y2I0ZjIwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiYzI5ZjU4YmE4YjlmY2NjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTcwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4Y2IwZDc4MjRmMDhkZTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3MCwidHlwZSI6MH19fSx7Imhhc2giOiI5N2VmZTc3NjI2ODk3MzQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNzhhZmU0NDg1ODA3NmM4MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTcwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1MTYyODY5ZTU3M2RjZDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3MSwidHlwZSI6MX19fSx7Imhhc2giOiIzZDM1ZjVlYjI5NzFmNWZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjIzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI5OGRkYWQ2ODU0Yzg3YjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3MiwidHlwZSI6MX19fSx7Imhhc2giOiI2NWFhYjUzY2Q0NmNjYzdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzMsInR5cGUiOjB9fX0seyJoYXNoIjoiZTFlNWUxYTRjNzg1NzI1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5ZjY1MTcwOTE0MzA0MzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3MywidHlwZSI6MH19fSx7Imhhc2giOiI3NmQ5ZWUzMDczODhhZjk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzMsInR5cGUiOjB9fX0seyJoYXNoIjoiOGZkYjQ4ZDNiNTQ2NjExOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImJkNTNlMmZlMGM2NjM1NDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3NCwidHlwZSI6MH19fSx7Imhhc2giOiI1OGI1NGE0ODU3MDNmNmJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiMzU2MTZmYjRlYTBmZWI5NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBhMTU2MzE0MjA5NmVkNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3NSwidHlwZSI6MX19fSx7Imhhc2giOiI0MjdkMTcwYjQ4NmM3NGU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzUsInR5cGUiOjF9fX0seyJoYXNoIjoiNzk0ODBhMmI1ZGUzMjQzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFhZjQ0YjA0NmZiNWMxMGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3NiwidHlwZSI6MH19fSx7Imhhc2giOiJlNWQzMGNhODdiNTkxMjgwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzYsInR5cGUiOjB9fX0seyJoYXNoIjoiOWVjOWY4ZDdmMGZjOGM0YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRkMGJmMTZkYjFlMzlmNTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3NiwidHlwZSI6MH19fSx7Imhhc2giOiJiMzJhNGRhMmJjNzM2M2EwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjZhODEzNDNhZTAyMjNkZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFlNzYyODdkMjViNDYzZDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3NywidHlwZSI6MH19fSx7Imhhc2giOiI3NDI5YjkyNjE3N2QwOWE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTcwY2MyMGE5YWY5OTI4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZlOTQzMzNlNjc0NDUwZWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3OSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZmFjMzM1ZDc1ZDk2OGZkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExNzksInR5cGUiOjB9fX0seyJoYXNoIjoiZWVjOTM2Yzk1YWY2YjMxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjNzQ0YjIwNmYxNWM0NmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE3OSwidHlwZSI6MH19fSx7Imhhc2giOiIwNDlhNzFjNzIyNDAzOTg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODAsInR5cGUiOjF9fX0seyJoYXNoIjoiZWZhNjY4NmNmNGI2YjczYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo1NiwidHlwZSI6MX19fSx7Imhhc2giOiI4NDcyMTk1NDViMTY5Nzg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODEsInR5cGUiOjB9fX0seyJoYXNoIjoiNzkwYWIwZWMzOTcyNGI3MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTgyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxMzNhNTU2YTgwZmQ4MDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE4MywidHlwZSI6MH19fSx7Imhhc2giOiJmYzg5MDEzMDNiYWRhMTg4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODMsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE1NDljMzliMWY0MzUyMyIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE4NCwidHlwZSI6MH19fSx7Imhhc2giOiI1ZDBiODQyNjFmN2I2ZDVjIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTg0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0OGRkZTIxYjU5MTc5MDYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExODQsInR5cGUiOjB9fX0seyJoYXNoIjoiMzM3ZGFiZTk4NzAyYWU1MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE4NCwidHlwZSI6MH19fSx7Imhhc2giOiJlZmFkODRkMGE0ZGQ0ZTQ2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTg0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxOWMzZWUyNDQyN2IzNTUiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExODQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWM3OWM4NDhjY2YyZDY0OCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTE4NCwidHlwZSI6MH19fSx7Imhhc2giOiJjY2Y3ZmQ1NjQ3YjkyNjk4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTg0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNiMDNhMjRlZWEyYTYzNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE4NSwidHlwZSI6MH19fSx7Imhhc2giOiJmN2Y1M2M4ODEzOTQ2MGNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODYsInR5cGUiOjB9fX0seyJoYXNoIjoiOTNiOTUxODI4NWY1NDg4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTg3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY1OWU2NDI3NzgzYzNkYTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjExODgsInR5cGUiOjB9fX0seyJoYXNoIjoiYWRiNTVkOThiYjRhZWY2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdlZmJhOTc2ZWVlYTJkNDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE4OCwidHlwZSI6MH19fSx7Imhhc2giOiJjZGRlMzc1YzEyNDA5OTFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkyMiwidHlwZSI6MX19fSx7Imhhc2giOiI3OWM0ZGM1NzkwNTg1N2FhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODksInR5cGUiOjB9fX0seyJoYXNoIjoiNDk0OGVhMTQxZDFhNzJlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTg5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0YWVkNWJmNWMyOTVjM2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5MCwidHlwZSI6MX19fSx7Imhhc2giOiI1NDc3MzRmMTdlZmZkYTc3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTYyODlhZWVmMDZkMGE5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTkyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlNDk3YzZmYmVkNDU4OGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzgzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkxNDEyZDUzNGQzMjFjYjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5MywidHlwZSI6MX19fSx7Imhhc2giOiI5N2FhYjIwZGQ4NzNkZDJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNzNjYWRlZWE4ZTFiZDllOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTk0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBlMWJkMjkzOGEwNmEyZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5NSwidHlwZSI6MH19fSx7Imhhc2giOiJhYTk2NTgyNTNhYTgxZTYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzVmMWVhYjMzYWJmYTRmOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU5ZjY0YjA5YjhlNDMwYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5NSwidHlwZSI6MH19fSx7Imhhc2giOiI2MTk0N2EwNDJhZjJlM2U4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiNjJjMDk1ZThkZmJiMDQ1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVjYzU3MTAzYzI2ZGY3NmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5NywidHlwZSI6MH19fSx7Imhhc2giOiI1MzY4NWE0M2ZjNzExZWE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNTNiZGYwM2FmN2E0NGUyYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTk4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhZmYyMWExYTk1OTFkYWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5OCwidHlwZSI6MH19fSx7Imhhc2giOiIxZDU2MjZiYTczOTRlNmExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExOTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMmUxMDZiZDFkMWQwNjRjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjlmNzY5MTMwNmIwODA1ZWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE5OCwidHlwZSI6MH19fSx7Imhhc2giOiI5MDlkZjhmOTFiZDMzMDg1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMTk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQxZWNhNjE0ZDNjYzg4ODMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIwMCwidHlwZSI6MX19fSx7Imhhc2giOiI1M2Q4ZGU2YjAxOGMxNzkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDEsInR5cGUiOjB9fX0seyJoYXNoIjoiZmQ5YTQyMGFkZTMwNWUxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjAyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5ZmQwNmYwNTVkNGFmNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIwMiwidHlwZSI6MH19fSx7Imhhc2giOiI2ZWIyNGQ0NzBhNmYxMDE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTM1YmIwNzM2Nzc4NmQ0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM5NDNkZjE4YWQyMDkxNWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIwMywidHlwZSI6MH19fSx7Imhhc2giOiIzNDFkMjQ4ZGMyNWU0ZWE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiYWQxZjE2ODFiYWI1Y2M2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjA0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjUzMmI1YmZhNzExZjQwNWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIwNSwidHlwZSI6MX19fSx7Imhhc2giOiI3OTljMjgzYTZmMWM4ZWNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDZ9fX0seyJoYXNoIjoiNDQ0OGJlZTkyN2RkZTdlNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTIwNywidHlwZSI6MH19fSx7Imhhc2giOiJhMGJkN2I3YTA5OTgzM2I2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiZmEzZTc3MDU4YzAyMTU1MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTIwNywidHlwZSI6MH19fSx7Imhhc2giOiI0NzYxZDIzMzcxNTA5OGNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDgsInR5cGUiOjB9fX0seyJoYXNoIjoiMzU2OTRiN2RmODA1OWIyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjA4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3NDA4ODAwNzcxMzBhMmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIwOSwidHlwZSI6MX19fSx7Imhhc2giOiJiZmUyYzFiNDEyNzhiODA0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMDksInR5cGUiOjF9fX0seyJoYXNoIjoiNmRkM2Y2ZGNkNTAwMzE0ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjA5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJmM2Y3Y2FjZDNmZTA3NjMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyMTAsInR5cGUiOjB9fX0seyJoYXNoIjoiYmNhODBlOWJlY2I3NGRjYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTIxMCwidHlwZSI6MH19fSx7Imhhc2giOiI0NmVkZjI5ZTliYTRmZjk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMTEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTg5NjEwOTNjODY1ODNmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjEyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUzNmIwNDRlOWYzOGJhZDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIxMywidHlwZSI6MH19fSx7Imhhc2giOiJmZTViODlmZTdkYmJkNTM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZGRmMDgzYTU3ZDQ4NDU5MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjE1LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijc5NzVmNzg2NGY0ZmE3NTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIxNiwidHlwZSI6MH19fSx7Imhhc2giOiI2NTdkNDBjNGQ3MzIyOTg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjU1NTllZWUwMmRkMzNhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU4MWFhMjgxNWMzNzgyMzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIxNywidHlwZSI6MH19fSx7Imhhc2giOiI0OTI2OWY5MjczYzY2YzAwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjEwZmE3ZDgzNzZiZTQ3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU0YmE4ZWQ0ZTNhYmMxNDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIxOSwidHlwZSI6MH19fSx7Imhhc2giOiIyNjllMGQ0OWU4YTk0MWI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5Y2QwMTM1YmJlMmNmNDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiZTRiMDFmMjI3MWM0MTcxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MywidHlwZSI6MH19fSx7Imhhc2giOiJlNWI0ZGFhYTZjNGFlMjMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNmYjNhMjhiZjI0ZjI3YWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZGI5ZWQzMGMwY2JlY2UzNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0MywidHlwZSI6MH19fSx7Imhhc2giOiJkZDBkN2YyMmVhZWExNmRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjRmM2ZjNmU2ZmE3NWIxZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTdhM2UxY2JjNjgxOGQ3MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTIyMH19fSx7Imhhc2giOiIzOTY5NzAwODExN2U0OWYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjEsInR5cGUiOjB9fX0seyJoYXNoIjoiNTBiZDY3OTA5NDg2ZjlmNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjIxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ1OGVmMmU0N2ExYjViM2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyMiwidHlwZSI6MH19fSx7Imhhc2giOiJmYzhlMmM0NDdlZGRhNmM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjMsInR5cGUiOjB9fX0seyJoYXNoIjoiZDVhYzk1NmM5ZjE4NWRkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI0MDE1ZDQ0Yjk5MDBkNjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiI0NjBjMDYwMDc1MWNiZDYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzcwNTBmNWJiY2NmZmRiMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNkZjE3ZmI2NzRmMDZmZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZmI0MzBjOGVjZTE2YjE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiYzlkNzllNmYxZjI2OTRjZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwYzc1ZTM3Mzc0YTJlZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiI1ZjljYTNhNzA2ZWExYTMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiMjgzOWNkYTE2NmU3NWE3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc2MmQxM2VlOTBjMjNjOTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiJjMGVhM2E2YWM1YTE1ZmY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzBjMGI2NTk0NDc3MmMxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2ZDVkYjkzMDU5NzQ1ZTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiJlYTBlNTJlMDgwODc4ODNkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiZGQ0OGYyMTEwMzM2ZWZkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJhYzM3Y2VlZjY0NzlmNmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiJhMTZkOTg2ZjNhZDA5NzkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNDRhZGRhZTdiODUwYjg5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVmMDhiYTQyNjg1MThlNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNSwidHlwZSI6MH19fSx7Imhhc2giOiIxZjI1NjAwMjBhYzRhNWRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjUsInR5cGUiOjB9fX0seyJoYXNoIjoiNjczMzlkOGY5YzIwNWQxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzZWJkYjE2Njc1YWZiNzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyNiwidHlwZSI6MH19fSx7Imhhc2giOiIzM2U4YjFhMTBkNmNmOWJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMjYsInR5cGUiOjB9fX0seyJoYXNoIjoiMzNjOTdiMjk0MmZiZmI0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjI3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3YmU4OWVjNmY1MjFlZDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NjU3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhhZDMyYzQ0ZTdmMDA5ZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIyOCwidHlwZSI6MX19fSx7Imhhc2giOiI5OTEzYmE1YzQ2YWRkNDk1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMjI5fX19LHsiaGFzaCI6ImVkMzQxZjZlZDk3MjI4ODUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzMCwidHlwZSI6MH19fSx7Imhhc2giOiJiODQyOThhMmJjNzZjODc3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDdiZDQ1MGI1NTcxZjMyZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjMwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc4ODczOWFiYWI4MjJmMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzMCwidHlwZSI6MH19fSx7Imhhc2giOiI1MTE5MTEzYjkwMjUzYTcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiODM5MWY1NGVmMmRkODIzNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjMxfX19LHsiaGFzaCI6ImVjYmVjMGRhNjBiZTcyN2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzMX19fSx7Imhhc2giOiI0NWRmMDViM2IxZmQyMDM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzF9fX0seyJoYXNoIjoiN2Y4YjYzOTgwYWRhMTM4ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjMyLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZjZmYwZWI2YzQ1YmRmNzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzMywidHlwZSI6MH19fSx7Imhhc2giOiI1OGFlMjcxNjY0MDYxNjMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTk3OTVhM2NlMmE3ZTYyMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjMzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhMzgyMmQ0NDljNzhkYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzMywidHlwZSI6MH19fSx7Imhhc2giOiJiMTI2OWNkZTEyMWIwNWExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzMsInR5cGUiOjB9fX0seyJoYXNoIjoiMTU4MWM0YWZlMGQ0OGZhMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlMTcxYmU3NjQwY2Y0Y2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNSwidHlwZSI6MH19fSx7Imhhc2giOiJhZTdlOTczYzIyNWMwYTAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzYsInR5cGUiOjB9fX0seyJoYXNoIjoiNzhkYjQ5NzU2NGNkNGJmOSIsInByZWZpeGVzIjp7ImJpcyI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfSwiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9LCJvcGVucnRiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzBmZTFlYTU1NDA0YmNiYiIsInByZWZpeGVzIjp7ImJpcyI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY3ZmJlMzYyZGI1MDAyNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI1NWFiYWI1ZWI0ZmYxMGJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTU0MmE5ZGVhMjgzYmUzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImE0OWY1YmY1NzJhMjJiYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI3ZTAyODEwMzkzYjZmZTg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiODljMGNiZDAzMjIyZGU5MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMxYTk4ZTFkNWJiYTlhZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIxNTAxMDIzNmE3ZDNiNWE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiOWY5Mjc4NDhkMDQxN2QxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdhMmY1ZDM2NjVlOWEzMWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIwMmZiMjc2MTE2MzJkODJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMGI5NWQwMGM4ZWYwOTVhZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkNDJjMmQwYTVhYjg0YWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI1ZTQwNWMxOWE0MDI1OTBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDAzN2FlNGI1NGQ3ZTdlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZhM2Y4ZDgyMmY0NzFjOGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIxZmQ5YmYxOWM1OTA2YzAxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZjk4OWE0ZTg3ZGEzZTZkOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2OTM3ZjQ2MWQ1MzVlODgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI3NTVjMzU3MzI2YTM3YjNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYWFjMDY4NjY4NmIyZDUzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNjZTk0NGZhMGNmMDI5MWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI3MzAyZjEyY2M0YWNlMTZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTI4MTZmM2Q0NTQyYjg4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU5YmY3ZGY0OTlmYTUyYjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiJlYmFiZDZjN2Q2MmM2MzRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTNhYzUzZTJmNTM4ZjJlMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNlZDczYWJhZGI5Yzg5OGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI5NTc0Mjk1NDYwY2U4ZDIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDU5MWZkYjYwNDVlYjkwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiMzk5OTM5MDdlZjBlOTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiJmZmY5YzkxYTFkMDJlNjlkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDA4NmE2MjU1MTZiZGZjNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImRlZGIzYzQxNzkwZjBiOTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiJkOWQyODgxNWI3MzUxYmU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMGVjZWIyYThhNmFhNTAxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMzY2QyOGQ0OTExOTAxZWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI5MDYzMDA1MTA5NzRjZjFhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNmJiY2M0MTFlODQzOTZjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4ZjViZWI0Yzc1MThjZTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI0NDViYmUxOTUwY2RkZDdiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMmI3Y2MwZjJiZGM5ZTk4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJlMWVlNDJmYmU1MzkyM2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIwZDc1ZGU4MzU5ZWIxZTkwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTQzOTc2M2RiOTE4MmE2YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkyNGEyNjlkN2ZhOTUzZWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI1NjU5MmJjOThkYTdhZGQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiZTM1MDMwN2I5N2U4MTk0NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyZDJkMjMyYWRiN2Y1Y2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI5ZGJkMWY3MWRmNjgxZjg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNjBhYTg3MmNjYTNlYTQwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU3NDI5MGMxNTkyNzY1ODIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI1MjBiMDNiMzFiYTk5ZmZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiODkyN2RjNGRiM2ZmZDlhMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlYTc1ZTVlMWJjYjNlNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIwMGZjMWU1YmE1Y2YxMWUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjQxNDQzZGY2MmExMWJkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1ODg1MmU2N2Q5OTk0NDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiJkN2RkZTRmZGQxYjQyYWMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYjlhNjM4NmExM2QxZjU5YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiMDBjMjFlYjdkY2EwYmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIzYjVhMDU2OWE5MWMxZjI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMDdiM2M0MTNkY2YwODkxZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiMTVhZWYzOWNkMjk0NzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIyNTc0M2U3YTg3ZWM5MzUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMmZlMTZhNTE4ZWVlNmUyMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImExNTQ2NDdhMDJiZWZmMDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI3M2EwNjgwNmRlZDY2YmMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYTgyYzYyOTdmNTYyNzZmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxNGI5ZTVkY2Y4ODc5MWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI4MGUxMGZlNjY0Yzk2NzZiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzg4ZGUyMjQ4ZjQ0NjU0NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUxZTU4ZjBiNDlhMGU1YzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiJjNTZhZmE5ZGFkYWFjZThjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDA4NGM2YTA1OTQxZDIxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZhZmU5NDNhM2NlNGI4MjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiIwMGNmYzEwZDFmNDY5ZGZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiY2RiODZmZWY0ZmRkZWNkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk3YjM0NzNjNzA4MmE0YzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI5OTk3M2E4NGQzYmRhNjEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE2N2FmZjA1N2Q4ZGM1ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYzBkYTcyZGJlZmM4NzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI1OTI1YTYyOTFkZDJhYjQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMzQxMjlkOTQ1NzQ5NWZmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyNTA1YzYwMDIxODRlMzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTIzNywidHlwZSI6MH19fSx7Imhhc2giOiI5YmNhYzBlOWZkNzdkZGM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiNzM3YzE4NjhlNTVkNWIzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjM4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwMmVjNmQ2NzU1NzQ2ZDYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyMzksInR5cGUiOjB9fX0seyJoYXNoIjoiMjAyZjYxMWQxZWFiNDE5NSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTIzOSwidHlwZSI6MH19fSx7Imhhc2giOiJhNmFiNDkxNzYxZjAzYTFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDAsInR5cGUiOjF9fX0seyJoYXNoIjoiM2Y4OTY4ZDJiYzYyMTM0ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZiZTZhYjNiYzlkMjE1NTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0MCwidHlwZSI6MX19fSx7Imhhc2giOiI3Njk1MjlhOWFkMTRhOWI2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDEsInR5cGUiOjB9fX0seyJoYXNoIjoiZjFhMjlhMTBjMWFkODBiZSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI0MiwidHlwZSI6MX19fSx7Imhhc2giOiI5MzBlOThhMTI2Yjk3YzAyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMiwidHlwZSI6MH19fSx7Imhhc2giOiI5MTVlODYyMGQ2MWU3ODJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMiwidHlwZSI6MH19fSx7Imhhc2giOiIwNDkyMDM3ZWFiMzgzNWU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExMiwidHlwZSI6MH19fSx7Imhhc2giOiI1ZWVlNzlkYWE5MzM3ODcxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDMsInR5cGUiOjB9fX0seyJoYXNoIjoiMzI2MjEyMWFlNDU2ZWM2MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ0fX19LHsiaGFzaCI6ImVlZmViMjRjOGMwZGY1OWYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NH19fSx7Imhhc2giOiIyZjc3ZTMyOTJhMTU4YjNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDR9fX0seyJoYXNoIjoiZWQwNDk4NDA5MWNkNmVkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYzYzdjZThlYTExMTIyNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI4NDJkMzVkNTVjNTIwZmUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiM2ZiOTFjMDA0Y2FlZWJhNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQ2NzNiZjFiOGZiNDEwMTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI2MGM1MDQ3ZWZjNDQ0MDg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiOWRhZjIwMWViODYxYmQ1YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjhmYjA0NTA0MmJhOGRhYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiJiNWM1ZjExYWE1MzNmOGY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiZTY5NzYwZmQxOGE3ZTg0NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFmZGI1MGVmZWI1OGFkYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI1NGFkZTBjMmZjMzNkNTU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiOTgwYTkzNTZhMGEwNjA0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBkMDY0ZjQxZGQwNmIwNzEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI0ZTljYzZkMDY5ZDA3MDBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiYWJjODFjNWZmNzMxM2Y2MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjRkOGU1NGRiNjgzODM0YjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI5NThjODkxZWE3YTIyNzYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiMDJiMGFhN2RiZWQ0ZGM3MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNkNjU1Y2E2ZjNlN2M1YjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiIxMTdmNmQ1YzM4NWMwZmJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiOTc0YjNlODk1ZWI4ODlhMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIzMTVlMDM4Y2FiZTdjZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiIyNTZlNmRiMTM1NzEzYzk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiNDRiNDkyMWUxZGQ4MzQyOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJlY2VjYjQ2NWZiYWIwMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiJiM2E0MGYxYzA1NmM5ODFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiYzRmOGY2NDBmMjRlMzU5MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBhNmU4NTIxMGYxZDk5YzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiJkMTI1NzMyNjlhNzQ4MDQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiZGVhYmM5MjRkOTk2YTFjYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNmYWU3MzA0NWM3YjI5YTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiJjOTdkYjlkNWVlMGI3MWM3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiY2E2YmIzNDQyZmE1ODY0NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImYzOGZiZGM5NzU5YzBlZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI2ZGI0N2NkMDhiZWQzMTIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiODZjMDYzNDAyMDEyMWQxZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk4YzEwNDVjZDYxZjk3OWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiI3YmRjMWE0OWNmMGNjYzFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiY2RjZWI0ZmVhZDQzZWFmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImI4YTdhYzRhY2UwY2U2ZTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NSwidHlwZSI6MX19fSx7Imhhc2giOiIwODFjY2VmMzViZTU2YjM2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDUsInR5cGUiOjF9fX0seyJoYXNoIjoiZTI5ZGU3MjYwMDRiNmUwNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjMwNDRlYjE1ZjA3NTc3ODgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0NiwidHlwZSI6MX19fSx7Imhhc2giOiI2NzVmNTYxZDNmMzFkZjM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDYsInR5cGUiOjF9fX0seyJoYXNoIjoiNTA2ZmE1NmY4Yjc0OGE2NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQ4Nzk1ZDhkZjNjMGIzNTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0OCwidHlwZSI6MH19fSx7Imhhc2giOiI5MjY5MGU2Y2YyMDY4NjA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiYmNiMjk2NTIwMzk5ZTg1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVlYmE0ZDQ4NmYyYTE5M2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0OSwidHlwZSI6MH19fSx7Imhhc2giOiIzNmJhNzlhYTEyNWFjZTFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiNzU1ZTBmYjNhNmQ4NTNlNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkyNmM3ZDhjNDdjZGM2YTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI0OSwidHlwZSI6MH19fSx7Imhhc2giOiIxMTJmOGI1YTc0OWQwNWU5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNDksInR5cGUiOjB9fX0seyJoYXNoIjoiN2VkODQzNjY4OThiNmU5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjdiN2I4ZjRmZWE4MTIxMDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MCwidHlwZSI6MH19fSx7Imhhc2giOiJjZDI3YTYyNzkyNWI2MDVlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOGRlNGQwYzJlNWE3ODVkMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRkMDkwNzk1YWE0MWQzOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MCwidHlwZSI6MH19fSx7Imhhc2giOiJhNzkyZDJkOWVmOGI3ZDQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTEsInR5cGUiOjB9fX0seyJoYXNoIjoiYTQxZDhiZmZiYjRkZGUyOSIsInByZWZpeGVzIjp7ImMiOnsicHJvZHVjdCI6MTI1MSwidHlwZSI6MH19fSx7Imhhc2giOiJjYjAzMTEwYWEzZWFmYmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZjhkNWMxYzNjMDEzN2I5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkYmQ3Njc1YTBhNGU0ZDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MSwidHlwZSI6MH19fSx7Imhhc2giOiJjMTUyZGFmMzYzOWJmZDYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzdhZmMxOTdhOWVkM2M1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImYwMDBkNTFiYTgzYzliODEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MywidHlwZSI6MH19fSx7Imhhc2giOiJlNmIwYmQ1NjJhOGE2YzQ0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYjY3YmI1NzZlMDFmZjNiOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI3NGNhZTBkNDA3NjI3YzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MywidHlwZSI6MH19fSx7Imhhc2giOiJkMDJjYTMzNDI0M2FlZmY2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMjdjNGFlYmU4ZmViMWQ2MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNmZmFjNThiMWZlNmExMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MywidHlwZSI6MH19fSx7Imhhc2giOiIwNjBiODViMzY3MmE5NGI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiOTkzZGJiZDlhNDQyODExNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkMDhjMDVmZDhmM2U2YjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1MywidHlwZSI6MH19fSx7Imhhc2giOiI3MzNhOGU0OGFhMzQ5NmMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNmRmZmYxNTI0MDMxOWQ5YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM3NzFlNGY4MWQ3NWE1MjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiYjJkMDg5ZWQyNjI0OWU5YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NCwidHlwZSI6MH19fSx7Imhhc2giOiI2Y2IwOTIwOTY4ZTQyNDYyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc3OTU4N2JhYmY5YTg0NWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDQsInR5cGUiOjB9fX0seyJoYXNoIjoiMjFmZDgzOGU0NjdhYmY5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NCwidHlwZSI6MH19fSx7Imhhc2giOiJmMzVkYjVkOGU0MWJlMDQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiZmI4ODFlNjE3ODM4MDNkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjU2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhNWE3MTU0ZDg0OWI2ZGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1NywidHlwZSI6MH19fSx7Imhhc2giOiI0YzBmYzU1ZThmZThiZTUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNjJiMzM4MzczNGM0OTZmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjU4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3ZTQwYzE2NDJiNTliMGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1OCwidHlwZSI6MH19fSx7Imhhc2giOiJiN2JjZWM4ZjUwMmIyNGNmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYjg4ODU5MDViZjllMjEzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjU4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgyMzhkODcyOWJiMzc0OGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI1OSwidHlwZSI6MH19fSx7Imhhc2giOiI5MmRiYzBlNjE4Zjc4MTZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNTksInR5cGUiOjB9fX0seyJoYXNoIjoiZDNiZThlZTJmZjI0YzhkZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3NjdiMDE2MTg2Zjk5MDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2MCwidHlwZSI6MH19fSx7Imhhc2giOiIxYmY3YjQ0MDkzZjRjMGI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjEsInR5cGUiOjF9fX0seyJoYXNoIjoiYjYwMDk5YzVhM2ZmNTU3OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImUxZTVjYmM2OWZmMjcxMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2MiwidHlwZSI6MH19fSx7Imhhc2giOiIwMWUzNGRjZjYzNTZmMjViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjIsInR5cGUiOjB9fX0seyJoYXNoIjoiMDU4Nzk4MDg0MGNiYWQyOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImMxMzU3NDkyMzI5M2Q3YzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2MywidHlwZSI6MH19fSx7Imhhc2giOiJlODczNThkYTJiNmFkMDcwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjQsInR5cGUiOjF9fX0seyJoYXNoIjoiMmEyNGJkN2RmZTM3MTA3NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY0LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjNmNmI2YmE1MzZhZGQ5MDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NSwidHlwZSI6MH19fSx7Imhhc2giOiIwNTBmMjMyOGQzNDQ2MWE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiYTY2OTY4ZjA1ZDM0ZjQ2OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJjMzA5YWU5YmJiZTkzODQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiJmZWM5ZmEwYzFmM2ZmZTZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNDk5ODk5NzBjYWE5NWMzZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjMyZWI2ZTM5NTE5YzZkNjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiI1ZWNmOTFjMzBiN2EwYTZhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNjM5NGUxZjkzYzY2MDYxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjNjNmY0MWQyOWY1ZGY4ZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiJjZGE0NmQ5NGQ3ZWZkYTVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiMTY0NzgyZDY0ZjczMjQwOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFmOGM3Nzk0MzlmMTdkYTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiIwMzk0MTc2ZDRkNTc1YTkzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiYzlhODA4NjMxZTAxYWQxYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE0NzhiZTQ0MmRiOWQ1MzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiIxNzFmMDAzNTRjNWM2YjQzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNTIxYzZhZDE4NWRmZjY5ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImE3YzZjYjkyMDg2OTA5ZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiJlZmIyYWQ3MGNiNjQ5NDRjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiMzVlNTBjZTg0MTE5NjUwMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY4MzE1NGE1NjQ3MmYzZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiI2NjY0ZDBlNGJlMWEyMDExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiZWZlZmEwMzc1OWM4ZWI4OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjIwNDc3NTQ0ZGMxMGM5MTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiI5MjJkMjM5N2VkZWY1ZGJkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiYTk1OTFlNzA2ZWQwZGExOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMwNzNjODk1YmYwNjE5MDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiI4YTc4MDQ0OTg4MzJmNjMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiNDVjMmE5Zjc2NjQ1M2M0NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjJhMTY3ZjhjNWQ0MWM5ZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiIwOTkyODEwMzc2MzEzYmJhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiZTQ1ODhjYWEwYzIzMjcyNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjczZmJlZTA4OWE0MzgzMDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NiwidHlwZSI6MX19fSx7Imhhc2giOiI0ODc0M2VlNzk3ZmE4Yzk4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjYsInR5cGUiOjF9fX0seyJoYXNoIjoiMjI1NjFhZjc4ZDhhZWViZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVlNmYzODEwODI2OTRjNTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2NywidHlwZSI6MH19fSx7Imhhc2giOiI2MDZlOTJlNDYxMThlNjhjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNWRkNTU0MjM3ZTU5MGU3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ3YzU1Y2RjMjM1Mjk2M2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2OCwidHlwZSI6MH19fSx7Imhhc2giOiI2OTg0NzdiYjQyZjU3N2Q5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNGQzNTYxM2JmM2M1NjA4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhiYmNiYjY4ZTI0YWJhNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2OCwidHlwZSI6MH19fSx7Imhhc2giOiJiNWQyODliYWVlNzdmM2JiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiMWVhYjk5ODkzY2NiNjgxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkMzhhMzY3NDdhMmU0YzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2OCwidHlwZSI6MH19fSx7Imhhc2giOiIyYWFlZTQ0ZGU0MjEyNDQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNjgsInR5cGUiOjB9fX0seyJoYXNoIjoiNzIwNTk0MDgwODY0Y2NkMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjY4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjZjhkYjk2Yzk1YWQ3MDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI2OSwidHlwZSI6MH19fSx7Imhhc2giOiJiZGM0M2I5NjNmMTIyNWUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzAsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQzOWIyYTNiNDViYTg3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcxLCJ0eXBlIjoxfX19LHsiaGFzaCI6Ijk4N2U5NmZkNTNhYzMzNzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3MSwidHlwZSI6MX19fSx7Imhhc2giOiJhZTQ5YmQxN2RkNGVhZDU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiOGQxMzJmMzRhODZmNTFiMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjQyMTA1NjQ0OTY3NjM1NDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3MSwidHlwZSI6MX19fSx7Imhhc2giOiJjMzk1Yzk2MWZiNGE2MGFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiMmYzN2E4NmQ1NGRiZTRmOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjA0NzMwZTNmYjk4NGU3MTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3MSwidHlwZSI6MX19fSx7Imhhc2giOiI4ZTA0MGVjZTA1NzNlMDA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzEsInR5cGUiOjF9fX0seyJoYXNoIjoiYTJhYWZkOGQ2MjJmNjc0ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjcxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjRkYTU2NmY5OGU0MWU0NGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3MiwidHlwZSI6MH19fSx7Imhhc2giOiI0Njk3NzliYTBiMmQ3MzQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzMsInR5cGUiOjJ9fX0seyJoYXNoIjoiYmZhNmQ2NzVmYTBjMTdjMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjc0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQzNmNjOTNlYThmZDE3MDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3NSwidHlwZSI6MH19fSx7Imhhc2giOiI5NWFkODU2MDkxZjRiYzg0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzUsInR5cGUiOjB9fX0seyJoYXNoIjoiODQ4MjM5ZTkyZWY4Y2RhYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjc2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2MDdmZjMwOWZlYzYyZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI3NywidHlwZSI6MH19fSx7Imhhc2giOiJhYmNjMzNkN2ZiOWRlNmQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyNzgsInR5cGUiOjB9fX0seyJoYXNoIjoiYzdiYmMyYmU3ODExOTA3NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjc5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYzZGEyOWQ1YjA3MmVjMmEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyODB9fX0seyJoYXNoIjoiNmMyZjM0ZDIzZDI3MmY0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJkYTgzN2I0OTBlMmQwMWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI4MiwidHlwZSI6MH19fSx7Imhhc2giOiI5MDBjN2Y2NDQ0ZTZjY2RkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyODMsInR5cGUiOjF9fX0seyJoYXNoIjoiOTExMGIyODUzZmJmYzFmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjgzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBhOWUyOTAxNmE2ZjY5N2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI4NCwidHlwZSI6MX19fSx7Imhhc2giOiI4Yzc3NDY0ODRjODI0OTA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyODV9fX0seyJoYXNoIjoiMTE4MjZiMzQ5MGI3MDU5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjg1fX19LHsiaGFzaCI6IjU1YjkyNjFlZmI1NGRlOGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI4NX19fSx7Imhhc2giOiI1N2YzYmFlMGRjNjk5MzdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyODV9fX0seyJoYXNoIjoiYjUxNThhNzk1YzgwYTVhMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU3OTA5OGQzMGZkZTFhMjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI4NywidHlwZSI6MH19fSx7Imhhc2giOiIzNjczOTA3MGYzYzBmZjE2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyODcsInR5cGUiOjB9fX0seyJoYXNoIjoiNDBmZWJmYjQxMmJhNmRkYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjg4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgwZThkODY1YTI3YmFjYWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjM0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjJhM2FjZmFlN2Q0YmRkOWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE0OGRkZThmYWIzYTljYTEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEyODksInR5cGUiOjB9fX0seyJoYXNoIjoiODJiNTQ0ZGJjMmZkZDUzNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTI5MCwidHlwZSI6MH19fSx7Imhhc2giOiI0NjEwNjk3MmUzZWJhZGRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTEsInR5cGUiOjF9fX0seyJoYXNoIjoiYmJjOGM0MzY4MTM2NGMxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NSwidHlwZSI6MH19fSx7Imhhc2giOiJhM2ZmNmRmNjYxMmYyMWRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1OTE2MmI1ODIzZGI4MDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5MiwidHlwZSI6MH19fSx7Imhhc2giOiJiM2Y5ZjAzZmIyYzc3YTk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTMsInR5cGUiOjF9fX0seyJoYXNoIjoiMGRjYmVlZDVmZTM1Mjc4ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjkzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU2ODk4MDA2ZDc4ZWNhMDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5NCwidHlwZSI6MX19fSx7Imhhc2giOiJjMmVjYjlmMzQ5NTBhZTY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTQsInR5cGUiOjF9fX0seyJoYXNoIjoiZTUzMGRlMWY2ZmY4ZWQ4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVmOWVmYjJkZmQ5YjIyM2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5NCwidHlwZSI6MX19fSx7Imhhc2giOiI4ZGFkNzljOWU5NjhmN2NhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTUsInR5cGUiOjF9fX0seyJoYXNoIjoiN2E1MTEwZGI4MGMwNDkzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU4Y2IwZWU3YzQzMGU4ODEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5NiwidHlwZSI6MX19fSx7Imhhc2giOiJjODU0MDRmMmY1NThkYmQyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTYsInR5cGUiOjF9fX0seyJoYXNoIjoiYjQ0YjYzZDZlODEwOTRlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk2LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImUxNjE0MTQwZTNjZWY0ZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5NiwidHlwZSI6MX19fSx7Imhhc2giOiIyY2ZkMDIwNGUyNjczYzYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMWM1ZjhmODhjZTk4YjM2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk4fX19LHsiaGFzaCI6ImZiYWM3MWFiNWRiZTUwMjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5OH19fSx7Imhhc2giOiI0ZTA4YzYwZjYxYjFhYzg3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTh9fX0seyJoYXNoIjoiM2Y0YmZhNjdiNTI5MGFkYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk4fX19LHsiaGFzaCI6ImE5YjRhZjQxNDViZjkwYjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5OH19fSx7Imhhc2giOiJkMGQyMGI5YjUzYjQxZTU4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTh9fX0seyJoYXNoIjoiZmYzNzU5OGMwMDEzMmEyYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk4fX19LHsiaGFzaCI6ImRhYWUzYjI4NWI0YWJlZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5OH19fSx7Imhhc2giOiIyMGNkYjFmOWE4MDY2ZmUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTksInR5cGUiOjB9fX0seyJoYXNoIjoiYTUzMjgxZGY2OTY4MTMxNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyNTM0NGY2Zjg1YjBmNjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTI5OSwidHlwZSI6MH19fSx7Imhhc2giOiJiNTQ0ZDcyYTY3MjZlZTFkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDAsInR5cGUiOjB9fX0seyJoYXNoIjoiZDkyNGMzOTlmNTgxMzM5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM0MDVlNTdiM2I3ODRhMTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMn19fSx7Imhhc2giOiI4YTUyNTFmZDM4Y2YxZDNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDJ9fX0seyJoYXNoIjoiMDM5OTg3NjEwYzUwMzM4YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAyfX19LHsiaGFzaCI6IjBmN2QzYzMwMWY3MGRmZDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMn19fSx7Imhhc2giOiI3N2Y4MWNmNzZiYjliZDA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDJ9fX0seyJoYXNoIjoiZWM2YTkzNzg1ZjQ1ZjAzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAyfX19LHsiaGFzaCI6IjNmY2Y1YjlhMzZiYjc3NmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMn19fSx7Imhhc2giOiJiODE5NDU5NTBiMTYzYWQxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEyOTMsInR5cGUiOjF9fX0seyJoYXNoIjoiMzZjN2VhNDhmZGM0MjM2MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImEzYmZjMzMxZDIwYmEzZTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiI2NGE2Y2I2OTUwNWY0N2E4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZTdkODVmNzNiNzUxNGFhOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjAyNjNhZjA5ODYwN2M2ZDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiI1YzkxMWU4ZmRiOWIzNTA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiNjY1ZDEyYWFhMTBjMTg1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjIwNmQwMmU5YmM2ZGM2NmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiI2ODEyMTBmYjQ4MjcyY2M3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjQyYjgwY2VlZWZiYzJlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjliOTUxNjU2NTE5YmM3ZjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiJmNjE1OTQ5NjQzZmRjZWJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiODE0OTM0YzEzMjM1Yjg2OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImQ0NTFkMjg5ZWQ5OTBiYTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiJiMmRlNmJiODYwN2Y3NDdlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiZmE5ZGJhMzczODljOGE5ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZlNzc2ZWUwMDE2MTc1YjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwM319fSx7Imhhc2giOiIxYTU2MWEwZGI4NzE2MjBiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDN9fX0seyJoYXNoIjoiODQ0NDAxMjJlNTcyNTg2NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5OGJhZWRjNzM1NGQ4NWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiJjZWRlZjEzNWEwN2MyZDFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiYjcxOTZmNjk2ZDU1MzUyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwYzhmOTExOGY5YzI2NTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwMywidHlwZSI6MH19fSx7Imhhc2giOiIyMjcwMTBmZTExZDEzMDUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDMsInR5cGUiOjB9fX0seyJoYXNoIjoiNTQ2MGUxOWQ3NWFlMGQwMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzfX19LHsiaGFzaCI6IjdlYzQ2MDcyOWY5NGE0NDYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNCwidHlwZSI6MX19fSx7Imhhc2giOiJjODRiYWVkOTRlM2QzYTZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDV9fX0seyJoYXNoIjoiODhjNzJhMGVkZjE1YWY5NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA1fX19LHsiaGFzaCI6IjhmZmE5ZTdhZTgyZmRhZjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNX19fSx7Imhhc2giOiJiMmI1ZTEzOGQxMmRlNDM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDV9fX0seyJoYXNoIjoiMTI0OWI4OGU0Y2UyMDQzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA1fX19LHsiaGFzaCI6Ijk1NTU2MjNmMDgyMTdjZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNX19fSx7Imhhc2giOiIwMzU4ZDE2NGZmY2RjNTFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDV9fX0seyJoYXNoIjoiZDI3YjE0NThjOGY5MWE1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmZDRiYzNmMzY5OTE0NmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNiwidHlwZSI6MH19fSx7Imhhc2giOiI2MmYzNTA4OWI5ODc2YWU1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDYsInR5cGUiOjB9fX0seyJoYXNoIjoiOTJkNzAxYjQ4MTBlZTcxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmOTI3MTkxYWRhYzhhNjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNiwidHlwZSI6MH19fSx7Imhhc2giOiIwNTFjOWU3MGYwNTE1ZTA0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiMTM1ODBmYzgyOTQ1NjM5YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxNGFjZDEyMTE0NDViNjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwNywidHlwZSI6MH19fSx7Imhhc2giOiIwNDZlMTFhMGNiYzIxMjRkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDcsInR5cGUiOjB9fX0seyJoYXNoIjoiZGY1NDgzYmRkMjQxYzBiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoyNTR9fX0seyJoYXNoIjoiOGVlMmYzNmIxNzg5ZTQ3ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzA4LCJ0eXBlIjowfSwiKiI6eyJwcm9kdWN0IjoxMzA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkyZDc2ODI4YzJiYzVlODYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6OTQ2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAxNGM5OTI4OGE2NTVlOTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxMCwidHlwZSI6MX19fSx7Imhhc2giOiIzNGQ0NGEyOGE0MmMzMGZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTAsInR5cGUiOjF9fX0seyJoYXNoIjoiNjUyNWU0YTU1ODkyYjAzNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzExLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkxMDg0MzNiNmJlNzUzNjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxMSwidHlwZSI6MH19fSx7Imhhc2giOiJjYTU5MTRjZGMzZjk1YzVhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZTI1ZDdlNmI3Mjk4YjY1NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzEyLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYzYTk4OGY4M2U1MDllY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTZjODE4ODEzNGVmYjQ5ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NiwidHlwZSI6MH19fSx7Imhhc2giOiJlYWIyOWJhYjlmZDRiOTY5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMyNGY2ZGNiMTZjZmQ0ZTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTZhOTVjNmJiOGQ2ZWZkNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzEzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjljMmRjYzY0NzNkZWUyMTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxMywidHlwZSI6MX19fSx7Imhhc2giOiI5ODZhZjEwZGQxMjdmZjA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTMsInR5cGUiOjF9fX0seyJoYXNoIjoiZjc0MTA3ZmYyMWQ0MzNlOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzEzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNlNWMxMzc4ZjFmOTQxZjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxNCwidHlwZSI6MH19fSx7Imhhc2giOiI4NzlmOTE0YTE1ZGYzNGUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiMTdlMTMwMGRiY2MzOWFmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzE1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImQyMmU2MGMyN2QzN2NlYmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxNSwidHlwZSI6MH19fSx7Imhhc2giOiI4MGQ5MTc0ODk3NmYzMTI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTUsInR5cGUiOjB9fX0seyJoYXNoIjoiNzQ0Nzg4MDY2NTQ0OTljMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzE1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiMDJmNWM1YmZjMDAzOWQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMxNSwidHlwZSI6MH19fSx7Imhhc2giOiJlZTY0NGViNjlmNjJjZGVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTYsInR5cGUiOjB9fX0seyJoYXNoIjoiOGZiMTNlYWQ4YjA3NTRmYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzE3LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNmYmM0ZWY4M2VmYzM5NDkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzMTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYTgyODU3ODJlOWU1ZTdlOCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTMxOH19fSx7Imhhc2giOiIzYTliNWU1YmNkNzRiYTI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMTksInR5cGUiOjB9fX0seyJoYXNoIjoiZGQ0ZTgyZWUxODQ5OTE5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzE5fX19LHsiaGFzaCI6IjIxNjNjY2RhZjBjN2FjMDQiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzMDgsInR5cGUiOjB9fX0seyJoYXNoIjoiZTE2ZTYxNzFhM2U1MGVmMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzIwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0YjEyMjVmNDQ3MDgxNWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMyMSwidHlwZSI6MH19fSx7Imhhc2giOiI3ZWI3YWY2MzJjNjIyNjE2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzIyfX19LHsiaGFzaCI6IjYzYzNhM2U2NTM2ZjBiN2YiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzMjMsInR5cGUiOjB9fX0seyJoYXNoIjoiMmM2YWFlYzg0Y2FjZDcxNiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTMyMywidHlwZSI6MH19fSx7Imhhc2giOiI2ZjQ2OWE1MTZlMGVhNTg2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMjQsInR5cGUiOjB9fX0seyJoYXNoIjoiZDA2NDg1ZWE0ODI5OGI3ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzI1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdhNDNiMzVlNDJiY2VmMzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMyNiwidHlwZSI6MH19fSx7Imhhc2giOiI0ZmY3YzkwZjFkMjNkNDE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiN2YwNjM1MmFmZmMwNzU2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzI3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2ZWE5OTg1ODlhM2Y3YWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMyNywidHlwZSI6MH19fSx7Imhhc2giOiIzMmVjN2MzYWY4ZDZlZTk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMjcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjk0ZTk4MDQ4MTc1NTdlZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzI3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU5YzY4MWQ0YWY0NWFkMmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMyOCwidHlwZSI6MX19fSx7Imhhc2giOiI2OGNjMDc3MjRlODcwNzMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMjgsInR5cGUiOjF9fX0seyJoYXNoIjoiNjBmM2M3MmUwN2JjNDQzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjIyMDgxYjk0ZTg5MDgwM2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzMCwidHlwZSI6MH19fSx7Imhhc2giOiIwMGUyMmRhNzZhYmYxZTEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzAsInR5cGUiOjB9fX0seyJoYXNoIjoiNDk4NDk1YTM5MTkwMWYyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMxLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYwNmM3MTJlZDE1MDc2OTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzMSwidHlwZSI6MX19fSx7Imhhc2giOiJhOWFmNmJiZDlhMDIyMjExIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzIzfX19LHsiaGFzaCI6IjVhZDkzNzBkYThjMTc5OTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzMiwidHlwZSI6MH19fSx7Imhhc2giOiJmZGQ2Y2JmZDBjNGFkODU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzN9fX0seyJoYXNoIjoiODFiOTkyM2Y4NTU1Mzk1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMzfX19LHsiaGFzaCI6ImExNDVhZDE5ZjYxODkyOWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzM319fSx7Imhhc2giOiJiMTkzMGU2MDc0NWY0YjY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzN9fX0seyJoYXNoIjoiNTdmOTdkOTlhYWY0NGFkMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzMzfX19LHsiaGFzaCI6Ijk5MTQzY2FlOWZlOGRjYjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzNCwidHlwZSI6MH19fSx7Imhhc2giOiJlYjVjZWFkNzg4MWRjM2RhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzUsInR5cGUiOjB9fX0seyJoYXNoIjoiMmZlMGJiOTM0OWQxOTU5YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM1fX19LHsiaGFzaCI6ImI5NTliY2NiYzEzMmQzMjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MjYsInR5cGUiOjF9fX0seyJoYXNoIjoiOGE4YzU1NDUyMmIyMDZhZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM2fX19LHsiaGFzaCI6IjQ1ZGZkYmU1MDk1MzlhM2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzNiwidHlwZSI6MH19fSx7Imhhc2giOiI2MjY1Y2VlZTA5MDZjYWM4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjc5MTc3ZjIwY2UyNzZhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5MGU4ZTVmNWYxMTQwNDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzNywidHlwZSI6MH19fSx7Imhhc2giOiI2ODUxOTk1M2EwOTRkYzBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzcsInR5cGUiOjB9fX0seyJoYXNoIjoiMmM5MzU2ZmRjNmEzZDUxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ4NjMxMmUzMTZmM2QzMDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzNywidHlwZSI6MH19fSx7Imhhc2giOiIwZGVhMDg0MDI0NWEyZGQyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUxZTQ0NDkwOWIxNTZiNTAiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzMzgsInR5cGUiOjB9fX0seyJoYXNoIjoiYmE1MGI2NjIzZWNmMDZiNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImJiMjQzM2I0ZDljZWFmOTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzOSwidHlwZSI6MH19fSx7Imhhc2giOiI3NTJlN2JkMzJjYTAzZTJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzksInR5cGUiOjB9fX0seyJoYXNoIjoiZmVjZDY2MDBjMWQ1NDU3MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImUyZjVhODcwN2EzOWE2M2YiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzOSwidHlwZSI6MH19fSx7Imhhc2giOiI2ZTdjZDNlYjc2MzlkMDlhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzksInR5cGUiOjB9fX0seyJoYXNoIjoiZTBhZmMyZjc3OTIzOGE1OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjUxYzQwMjg2NDJhNWNhNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzOSwidHlwZSI6MH19fSx7Imhhc2giOiIxNjQwZTFlZWIwNmRmOTY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzl9fX0seyJoYXNoIjoiNmM4YzJmMzYzY2Y2NDdiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM5fX19LHsiaGFzaCI6ImQ5ZjMxZTFhOTBlOGZiNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMzOX19fSx7Imhhc2giOiI4NDVmYjljNjM4N2JlZjk3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMzl9fX0seyJoYXNoIjoiMDQ1OTM0MWRmNzBjYzA3MiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzM5fX19LHsiaGFzaCI6ImJlNjg0MTliMzE2YWU0YzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0MCwidHlwZSI6MH19fSx7Imhhc2giOiJiYTliZTc2ZmU2Y2JhNTU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDAsInR5cGUiOjB9fX0seyJoYXNoIjoiZWMzYWE1ZjExYzc1NGRlNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjUwMjNkMzMzYzE0NzQwYjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0MCwidHlwZSI6MH19fSx7Imhhc2giOiJlYWI0YjQ5NmJjMDk3NDNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDEsInR5cGUiOjB9fX0seyJoYXNoIjoiMmFmZGFmOGQxYmFkM2NiOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6ImMyMzY3ZmFhMGY2Njc5MDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiJlZDU4ZTk4YjQ2ODMzMjk2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiZTAyNDkzNjNlMGM3YTVmYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6IjNmNmRmYTVmYWQ4MTY1NDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiIwZGFjYTA3OWEwZGRkMmM1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiZWIyMTkyZWE2NjZkNmRmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6IjZhMTI2OWNmOWRhYjY2ZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiIzOTA3OWYxMTgzYjFhMjYwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiOTQ1NWE4ZTNmYTdlOWEwMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6ImJlYmMxZmFhOWQ3M2I3YjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiJjNTA2OTYxOWI4NGM3NDBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiOGVmZmVlM2NkNTNkY2ZlOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6IjgyNTFiZmU2YWNjYWFiMDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiJmMTAxOWY0NjE5Y2JmZTI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiODI1ZWZhN2U2ZWVhOTFiNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6ImNkZWVlOTU5MzZjNGRiYzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0Mn19fSx7Imhhc2giOiI4MTJhYzIwMjE3ZTEwZTIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDJ9fX0seyJoYXNoIjoiYTIwMzE4ZWZjYzk0MmIwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQyfX19LHsiaGFzaCI6IjdiYTMzNzlhNjQ4Y2JjNzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0MywidHlwZSI6MH19fSx7Imhhc2giOiJmYWNhMTBkZTAxZjk3NDdmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDMsInR5cGUiOjB9fX0seyJoYXNoIjoiYzRiYWRhMjI5MGMyYjQxZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjdlODI5MDUwOGE4MWVjZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0MywidHlwZSI6MH19fSx7Imhhc2giOiI0MTVmYmRmYTdjZjk1OTE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDMsInR5cGUiOjB9fX0seyJoYXNoIjoiOTczMjIwMTBlOTE3OTM0MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3NTQ5YTY2N2ZjZDAwMDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0MywidHlwZSI6MH19fSx7Imhhc2giOiJmNTM1OWYwOTExNWU1YTA4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDQsInR5cGUiOjB9fX0seyJoYXNoIjoiOTM5MzE5MzdkZWVhY2RlMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMTQ5fX19LHsiaGFzaCI6Ijg4NWVmYmNiMTU1ZWZkNjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwM319fSx7Imhhc2giOiI4NTE1ZjVlODAzZGU2OTNiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDN9fX0seyJoYXNoIjoiNzk5MGZlYTliNGNkYmRmOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzAzfX19LHsiaGFzaCI6ImE2NjMyZTgwNGEzZGM4NTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTMwM319fSx7Imhhc2giOiJhZTQ3NDViMGZkMTA0ZmJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzMDN9fX0seyJoYXNoIjoiOTU2ZGM0N2VlYWRkMzZmNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQ1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA5MWI0NzgzMTZhMmMxMzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0NSwidHlwZSI6MH19fSx7Imhhc2giOiJkYzhmYTA0YjU5MmI4MzA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDUsInR5cGUiOjB9fX0seyJoYXNoIjoiZmUwZTMyNmFjN2RjOGQ3YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQ1fX19LHsiaGFzaCI6IjQxMGExMDdkNjYwYWIxY2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0NiwidHlwZSI6MX19fSx7Imhhc2giOiJiMjk0ZmEwZTU1ZmNkMmY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDYsInR5cGUiOjF9fX0seyJoYXNoIjoiNTUxOWZhNWRhNWU1N2FkMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcyNzdkMWZjNWJjM2M0MTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0OCwidHlwZSI6MH19fSx7Imhhc2giOiI0Yjg5NTEwNDY5ZTE1OTM5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNDksInR5cGUiOjB9fX0seyJoYXNoIjoiZDNiNTYwMDE3NDE5ODI1MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjU1OTcwNzBhMzQwMThlZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM0OSwidHlwZSI6MH19fSx7Imhhc2giOiIxN2YyOTA5NzA2MzlkMTI0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiMjYzZWUyMDI4YmMwOGIzOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzUwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhMGYzYTg5NzM1NWRkNjciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1MCwidHlwZSI6MH19fSx7Imhhc2giOiI5Y2E4NGJhOTMzODk0MjFiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTAsInR5cGUiOjB9fX0seyJoYXNoIjoiNGQ1ZjA0NWExMGJhYTgxOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzUxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjUwYmMzOTViNjEwMTYxM2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1MX19fSx7Imhhc2giOiIzYWZmZDUzMzkzN2UzMDAwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk3MWQzMTNhMzIzMDE0NzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzUzNTFmMzJlNTFiZTJmZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0NywidHlwZSI6MH19fSx7Imhhc2giOiI0ZDkxZTY4MzQyNzBiZWQ1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVkNjYyYmNlMjg1YzRmNjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDcsInR5cGUiOjB9fX0seyJoYXNoIjoiYWNmOTY2NDhmYzgzNDk0YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0N319fSx7Imhhc2giOiJlYTYyYTAzMTk0ZjlmZDk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTJ9fX0seyJoYXNoIjoiZDNmZjE2MzNkZGVkMTMyOSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjJiNWQ2YWQ0NTc0NDIzYWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1MywidHlwZSI6MH19fSx7Imhhc2giOiJkZDhjNWI2NDFiYjI4NzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNGJhM2Q5ODFmNTA3M2YxMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkyZjg0NWYzY2JmYzgzY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTc5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZmOTNmMzBlMjlkZDc5Y2UiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1NCwidHlwZSI6MH19fSx7Imhhc2giOiIxMjE5MjU2YzU3ZDM2MmMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTg4YTMwYWRhNzVkMzcxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5OWIzYTFhZDIxN2VjMjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1NCwidHlwZSI6MH19fSx7Imhhc2giOiJjZmZlMjljNTJiMWI3M2M1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTQsInR5cGUiOjB9fX0seyJoYXNoIjoiZjAzZDk0MmMyM2M2NWE5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI3MmQ0YzAzNWEwODhkZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1NCwidHlwZSI6MH19fSx7Imhhc2giOiI3MjQ1NjhkMGMzZmMwOGE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTUsInR5cGUiOjB9fX0seyJoYXNoIjoiYmUxMDgzMjNkMTMyNzI2ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjlmYzNiOTE2MTQ1MDI5MzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1N319fSx7Imhhc2giOiJiYjk2ODk1YWQwYjNmYjQ2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTd9fX0seyJoYXNoIjoiODMwMDc0YWVkMWE1M2QyMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU3fX19LHsiaGFzaCI6ImRiMzJiMmMwMTM2NTUzYzkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQ3ZGYxOTc0NjFiODAyZDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFjYmYwYWQ4YmFkYzY5MTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImMwYjZjOGQ1YjE3MzZkYzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA1ZGQyYTZjNjg3ZDM0YzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1OCwidHlwZSI6MH19fSx7Imhhc2giOiJjZWE3ZDZlZDE3NjQ4ZmJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYWQ3MTQ5ZjMxNjUzMjIzMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY5Mzc1MWZhZGRiYjU4MDEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1OSwidHlwZSI6MH19fSx7Imhhc2giOiI4ZGE4N2I3MjlkNTc5ZDA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNTksInR5cGUiOjB9fX0seyJoYXNoIjoiYWI1Y2MzOTUxZDM0NmM3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzU5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImY0MWE0YjFhYzZhM2JmYjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2MCwidHlwZSI6MX19fSx7Imhhc2giOiIxZDA5NzcxOTVkYzE4ODI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNjEsInR5cGUiOjB9fX0seyJoYXNoIjoiOTEyMzY1YmZjODFmNzgwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzYxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc0MzRhODg4NjExY2ZhZjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2MSwidHlwZSI6MH19fSx7Imhhc2giOiIxZDczNDA0YTRkNmIzY2RhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkzOGZhOTMxMzFkNjMwNDUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NDgsInR5cGUiOjB9fX0seyJoYXNoIjoiNjdmMzU0OTlkMWJmNTIxNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzYyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImM4ZTJjMGM0MmMzODhjZWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2MiwidHlwZSI6MH19fSx7Imhhc2giOiIwODAwMDc0ZTlhOGFhOWUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNjJ9fX0seyJoYXNoIjoiZjY4NTNmYmExZDVjODM2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjdkNWFhMDg3NWI1YjAzZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2MywidHlwZSI6MX19fSx7Imhhc2giOiJlMWE1NTIwNWQ2MzVkMDQ5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNjMsInR5cGUiOjF9fX0seyJoYXNoIjoiYjVlYTUxYmIwYWVjMTc0YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzYzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU0MTQwYjc4YWZkYTRmYjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2MywidHlwZSI6MX19fSx7Imhhc2giOiJhNGM3NDAzMjAyNWUwNTg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNjQsInR5cGUiOjB9fX0seyJoYXNoIjoiZDk2MzhkNzg0ODVjZmY0MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjZlYTNlMDAzZWQ2NGQxMzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTcsInR5cGUiOjF9fX0seyJoYXNoIjoiMjJhZTBiZWIxMzFjNGI4YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzY1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjI5ZDFhYWNhNmI5ZTZlZGQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2NSwidHlwZSI6MH19fSx7Imhhc2giOiI3ZDEzODBkMTk2ZTBmMzQ3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNjYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTQ3YWM3Yjc2NzM1NWEzMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzY3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRiNjAyNjZiYTg2MGE0YzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM2OCwidHlwZSI6MX19fSx7Imhhc2giOiIyOTY4OTNhOTU3MGNhOTM1IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzY5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA5NGRmNzFmMjdlYmQ2ZjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3MCwidHlwZSI6MH19fSx7Imhhc2giOiJhMTExOWQyNjJiODZkZTM0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzF9fX0seyJoYXNoIjoiYjFlZDIwYjc5ZDhhNDNjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNTB9fX0seyJoYXNoIjoiNWJkMDVjODAxYmIzMjA5NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzcyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRhY2Y2MTM0MTBjMTdmNWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3MiwidHlwZSI6MH19fSx7Imhhc2giOiI1NjFmMTA0YmEzOGQ2ZTY0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzJ9fX0seyJoYXNoIjoiYTQzNTA5ZDZhMDhkMTc3NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzczLCJ0eXBlIjowfX19LHsiaGFzaCI6ImI2NjUxNGFjNjUzMGEzZmQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NCwidHlwZSI6MH19fSx7Imhhc2giOiI3OWIzNjYwYmRlMTMyYmExIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiYWFmNzc4MWI4MDA1MDliYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhmZWM2YzY3MmY1YjIwNGEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NCwidHlwZSI6MH19fSx7Imhhc2giOiI4MjVlN2RmNGRmYjliYWUwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzQsInR5cGUiOjB9fX0seyJoYXNoIjoiMzc5ODk5NjI2ZDA3YzNiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjY2NGNlNjI2NWY3M2VjNmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NSwidHlwZSI6MX19fSx7Imhhc2giOiJhYjMzZjY2NTBmZWI0NGMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzUsInR5cGUiOjF9fX0seyJoYXNoIjoiNTU3NDA0Yzc4N2M1NDVjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjBjODgxZjY5MmU4ZWMwZGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NSwidHlwZSI6MX19fSx7Imhhc2giOiIzNmM3MjY0YzFkMDZjYzI5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzUsInR5cGUiOjF9fX0seyJoYXNoIjoiMmY3Yjc1Nzg2Njc1ODIxYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc1LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjcxNGZkMjE4ZjEyZmNlN2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NSwidHlwZSI6MX19fSx7Imhhc2giOiJkMTQwYTVmNzQ3YTY2NmYxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzUsInR5cGUiOjF9fX0seyJoYXNoIjoiY2JjZmQ5ZDU5MmYyZDE5ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImEyMTRmNmFjNTM3Y2FmYTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM3NiwidHlwZSI6MX19fSx7Imhhc2giOiI4NGZlMjFhOGMzYmEzODE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzNzcsInR5cGUiOjB9fX0seyJoYXNoIjoiYzcwOWJmZjBkMjI4NGVjYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzc4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjM1MTBmMTBmZjU5MTQ4NjgiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzNzksInR5cGUiOjF9fX0seyJoYXNoIjoiZWE1OTQzNzcwNjBjYWZjNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzgwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYzMWE2OGExOTE1NTRiYWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4MCwidHlwZSI6MX19fSx7Imhhc2giOiI4ZDk2MzhkOTM1NTYwN2JhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODAsInR5cGUiOjF9fX0seyJoYXNoIjoiZDZlMjg4ZmM1Y2YxNGM4MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzgwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkwZWM1Y2IyOTM4MWUxY2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4MCwidHlwZSI6MX19fSx7Imhhc2giOiIzZGViZGZhMjJlZTAwMjMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODAsInR5cGUiOjF9fX0seyJoYXNoIjoiNDU4NTJkZmY4NmMwYTdlMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzgxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA2M2UwNDU4NTM2NGMwZTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzA5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhNGJmYmExYmIxNWNiNzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NzA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmNDNiMDU4NjRjMjhjNzciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4MiwidHlwZSI6MX19fSx7Imhhc2giOiI5ZTEwNTdjYTc3YjY2MTBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODIsInR5cGUiOjF9fX0seyJoYXNoIjoiYTYyNzhlYmRmM2NhN2JjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzgzLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk1NDA0NDk2OWYwNDdjNmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4MywidHlwZSI6MH19fSx7Imhhc2giOiJjYTMyZmNmM2EzMTAxY2EwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODQsInR5cGUiOjB9fX0seyJoYXNoIjoiNTRhMjRkNDEwNDRjMDczMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImIzMzAyYzRlNGZjMjNjYjgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6ODQ1fX19LHsiaGFzaCI6IjMyOGVlZDU0ZmYzMzBlNzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiI5OGVkN2Q3YzFhZTA1MGI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMjI2ZThjOThhM2UyZTA5MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjllNzc3NDcxMTgxY2FhNzAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiI5ZGY2MTM4NThhODU5NDA3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMzdhZjA2NDU5MjE0OTI1ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBmZGMwNGFhM2NkNGU0MDIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiJmMzNmMTRhNDc5YjE3YTEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODUsInR5cGUiOjB9fX0seyJoYXNoIjoiNTM1YWQ2OTQ3OTgxOTg2YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjBkYjE2YTZlODkxYjFmZjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiIxMWIzYzUwMmQ0ZWIxZmEzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODUsInR5cGUiOjB9fX0seyJoYXNoIjoiMDAxYmQ2OTcwZWVmMmJiZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjkzNTA1ZGIxZjliZjRhNDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiJhMWM5YWMzNzA1NGZjODI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODUsInR5cGUiOjB9fX0seyJoYXNoIjoiZjRmMzc1ZTI2OWYzNGE2MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU2MWIzYjEzN2JlZWNmYmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4NSwidHlwZSI6MH19fSx7Imhhc2giOiIwN2JmMjJmZTU2YmU4ZDIwIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjYxOWUyNzU2OGI1NTg5NGMiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzODYsInR5cGUiOjF9fX0seyJoYXNoIjoiMzc0YjYwNTY3ZjNjN2Y4YiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM4NiwidHlwZSI6MX19fSx7Imhhc2giOiJhZjExY2IzNzdmMjY5YjNiIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjZiZDY5NGRhNDc4ZmE4N2IiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzODYsInR5cGUiOjF9fX0seyJoYXNoIjoiNzVjNGFlZGNiYzk0NWM5MSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM4NiwidHlwZSI6MX19fSx7Imhhc2giOiI3MWU4YTUxNzYyZmU4MWI2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjU0MTJmODAxNzY2MDIwN2IiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzODYsInR5cGUiOjF9fX0seyJoYXNoIjoiYmEyOTM2M2UzZTEzOTA2NiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM4NiwidHlwZSI6MX19fSx7Imhhc2giOiIwNWRlMWU3ZTlmMzI3MWMzIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzg2LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjVkNzNiNGI5Yjg3MDU4NDYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzODYsInR5cGUiOjF9fX0seyJoYXNoIjoiNzExZDljNGNlMDg0YWE3ZCIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM4NiwidHlwZSI6MX19fSx7Imhhc2giOiIxZWQ2ZmRlNGM2NWVmNmY3IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNjUsInR5cGUiOjF9fX0seyJoYXNoIjoiNGE2YjE0OTBkYzA1OWQwYiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjY1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNhYjgxZGJlMjBjMDk1N2YiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI2NSwidHlwZSI6MX19fSx7Imhhc2giOiJhZjFmM2NlMzllM2I0ODYyIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNjUsInR5cGUiOjF9fX0seyJoYXNoIjoiMTllOTdiMTM5YWUxNTM0MiIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MjY1LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImZiNDZmZWUxY2VlZjQ3MTkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjI2NSwidHlwZSI6MX19fSx7Imhhc2giOiI3OThiZGE3NmRhMTVhYmViIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNywidHlwZSI6MX19fSx7Imhhc2giOiIzOGJmN2E1OThhZDBjNDk4IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNywidHlwZSI6MX19fSx7Imhhc2giOiI0ODY1MWIwOWQzMTJiODE0IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNywidHlwZSI6MX19fSx7Imhhc2giOiJiYjI0ODJkNjAyMmE5NGJhIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoyNywidHlwZSI6MX19fSx7Imhhc2giOiJkNThmOGFmOWZmNGU2OTFlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODcsInR5cGUiOjB9fX0seyJoYXNoIjoiOGU5YmVlMWJiNTRkNTRlZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg3fX19LHsiaGFzaCI6IjA2Njg5ZWQ2NTBlMmI4YzMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4OCwidHlwZSI6MX19fSx7Imhhc2giOiI5NmM5N2IzMGEwMzU3OWFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzODgsInR5cGUiOjF9fX0seyJoYXNoIjoiNDA3ZmFjZTJiMmMyNzM5NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzg5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjE4NGY4MGVmNTNhMGYxNzgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM4OSwidHlwZSI6MX19fSx7Imhhc2giOiIwNzZhNDYwNTkwYjQ5NmJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTAsInR5cGUiOjB9fX0seyJoYXNoIjoiOWZlYmVlZDEzOGY1ZjJjZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzkxLCJ0eXBlIjowfX19LHsiaGFzaCI6ImRkMzVmYzBhNWY1ZmEwN2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM5MSwidHlwZSI6MH19fSx7Imhhc2giOiJiMjI2ODdhMGQ0YmQzNDFmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTEsInR5cGUiOjB9fX0seyJoYXNoIjoiMTYyNTY0MDE5MjM0ODMwNSIsInByZWZpeGVzIjp7IioiOnsicHJvZHVjdCI6MTM5MiwidHlwZSI6MH19fSx7Imhhc2giOiI0NDQzNTY1NDI0NjFlN2QyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTIsInR5cGUiOjB9fX0seyJoYXNoIjoiYjllZGFjNDQyZTQ4OGRkZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzkyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFmZWQ5NTAyMjE4ZmMxY2QiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM5MywidHlwZSI6MH19fSx7Imhhc2giOiIyODZkOTk0Mzc0Y2U4YTU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTQsInR5cGUiOjF9fX0seyJoYXNoIjoiMzg1MjI1Yzk2ZTEyM2IzZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzk1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjE5YzExYjlhZDQ3ODAyZjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM1MiwidHlwZSI6MX19fSx7Imhhc2giOiJkNzEwZWE2NmI5MDRjZDgyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMjRiYmVjODMxYTg0YTExNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzk2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjljMzI3OTk4NmUyNTMwNGMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM5NiwidHlwZSI6MH19fSx7Imhhc2giOiI4Y2U5NDI5OTU3MmRjOWI4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEzOTYsInR5cGUiOjB9fX0seyJoYXNoIjoiZTUxZjc4NGU2NmNlYjFjYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzk3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjcyYmQ0ZWM5OGRlYTYzM2IiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM5NywidHlwZSI6MH19fSx7Imhhc2giOiIwODM2Yzc1MzUxMGE0ZmQ2IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzk4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhMTNiMWQ2NWMzNzIwMDYiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjEzOTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMTRlYzAxODIzMmE4NzM4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMzk5LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZkYWJmYjc1MzVlMzEzYTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTM5OSwidHlwZSI6MH19fSx7Imhhc2giOiJjZGRlZjQyYTk5YjFmMGUyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MDAsInR5cGUiOjB9fX0seyJoYXNoIjoiMWJjYzg0NzYyYzBmMmRmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDAxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjZjNDZhNjk0Mjg4Mzc1NjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwMiwidHlwZSI6MX19fSx7Imhhc2giOiIxNzMxOWUzNWIzYjg5YjY4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MDMsInR5cGUiOjF9fX0seyJoYXNoIjoiMDgyNWE5ZGE1ZGQxNzM3MyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDAzLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImFhYTAwY2U3MjJlYTBkMzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwMywidHlwZSI6MX19fSx7Imhhc2giOiI0MGI2ODNjYzhjMDYxZjZmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWE3NjgwNGFkOGFmOWI1YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDA0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk4NWNjZTI2YWVhYjkwZDgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwNCwidHlwZSI6MH19fSx7Imhhc2giOiJkNjdkOThjYmI5NTUzYTgxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MDQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWUxYzJhZTJmZmRhYTc1NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDA0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjMTYyMzc5YjYzODk2ZTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwNSwidHlwZSI6MH19fSx7Imhhc2giOiI0YzIzZDU2N2I5OGU0MTNmIiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxNDA2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjllNzRlOWU1MGI3ZTYxMTYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQwN319fSx7Imhhc2giOiI4MjQyZWZkYWNlYTZjYTE0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MDgsInR5cGUiOjB9fX0seyJoYXNoIjoiODJiOTAxMTdhNWJlYjg2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDA5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjdkNGJjMzBlOWQ0OTVkMDAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTE4MywidHlwZSI6MH19fSx7Imhhc2giOiI0NDMwNWE4MWFmMzI4ODU0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjExODMsInR5cGUiOjB9fX0seyJoYXNoIjoiZjVkNDRkZjIzYjViN2YwYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDEwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImU4NmY1Njg4OWVmMjEzYjkiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE0MTEsInR5cGUiOjB9fX0seyJoYXNoIjoiZTRmM2FiZmRkOTRmYmI5NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDEyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc1MjUyNDNiMWQ2NjVkZTIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxMywidHlwZSI6MH19fSx7Imhhc2giOiJmMjc0NTNhMTlhYTIzNzBlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTMsInR5cGUiOjB9fX0seyJoYXNoIjoiODE1Njk3OWQyNWFmOTgxNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE0LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4OGU0NjVkMTRkYmZlYjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNCwidHlwZSI6MH19fSx7Imhhc2giOiI2YmNkYjhlNGNmMjhiNzMwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTQsInR5cGUiOjB9fX0seyJoYXNoIjoiY2MyMjkyMjgxMTM2OTlkOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE1fX19LHsiaGFzaCI6ImZkNzY5NWRmMWRmZTlmMjAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNn19fSx7Imhhc2giOiJmYmVlNzY1NjU0NzJiYzk1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTZ9fX0seyJoYXNoIjoiZTUzZWZlMjg0MTc3MzJmZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE2fX19LHsiaGFzaCI6IjRmNzZkYzg4MDdhMWIyNWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNn19fSx7Imhhc2giOiJiN2NkOWU3NjY2ZDE3NWUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTZ9fX0seyJoYXNoIjoiYmExMjRlMzU0YTcwZGNiMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE2fX19LHsiaGFzaCI6IjhjOWU2M2QyNGQ0ZmJlNmIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNn19fSx7Imhhc2giOiJlYTYxNTdmY2I3YzVjNzE4IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTZ9fX0seyJoYXNoIjoiNjA2M2FiZWYzOWZiODliZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE2fX19LHsiaGFzaCI6IjhhM2IzNjQ3ZjZmYWUyNDMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNn19fSx7Imhhc2giOiIyNWI2NTJlYWQ3YWJiM2IwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjEwNDgsInR5cGUiOjB9fX0seyJoYXNoIjoiZmYwM2ViNDA4NDZlYWExMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMDQ4LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY0OWFkYTUzNzVmZmY5MzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTA0OCwidHlwZSI6MH19fSx7Imhhc2giOiI3OWI4NmE1NWQ4ZjE0OWVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiYTZlNGViZWQ3ZDQxN2ZlYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU3YTI3ZDczMjg4MTg4YjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNywidHlwZSI6MH19fSx7Imhhc2giOiIyNDAyOGNlNDY4MTk0Yzc1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDdmODllZDhhNjQzMWE2OSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjA3OWY3NWFhNjBiNzM2YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNywidHlwZSI6MH19fSx7Imhhc2giOiI1NWFiMzg1MzBlYmNiMmU3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiMjQ0YTk5ZDhkZWI0MzQzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjAyYWZkYmEyZDYxYzZkNzYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNywidHlwZSI6MH19fSx7Imhhc2giOiI1MGZjYWRhZmUyZTI3MzRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTcsInR5cGUiOjB9fX0seyJoYXNoIjoiMGE1ZDk5ODg2MGI3OTY4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE3LCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmMWVmOWEyM2MyYmRmNTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxNywidHlwZSI6MH19fSx7Imhhc2giOiJiN2JlMDI0NzljOTI2OGE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiMjg0MWI0M2EwZTBkZGIzNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImVhNzdjY2Y2OTQ5MzMwNmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxOCwidHlwZSI6MH19fSx7Imhhc2giOiI3ODYwNjBhNmJhNzkzYjMyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MTgsInR5cGUiOjB9fX0seyJoYXNoIjoiYWY1ODI0M2E1ODE3YzkzMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDE4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImI5MGZmZWUyNDIyNTllMjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQxOSwidHlwZSI6MH19fSx7Imhhc2giOiIwMzdlODRhNzgzMTMwMjAzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjAsInR5cGUiOjF9fX0seyJoYXNoIjoiNzI0Yzg1Yzk2Y2M3MmE1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDIwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImRmMjM1ZWQxODhjODJmNWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyMCwidHlwZSI6MX19fSx7Imhhc2giOiJkZjIxYmYzNTRhMjU3MGUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjAsInR5cGUiOjF9fX0seyJoYXNoIjoiNTJhOWIyMjRkZDNlMWIwMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDIwLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImVmNzQ5ZmE0ODNkNTU4YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyMCwidHlwZSI6MX19fSx7Imhhc2giOiJhNmIyMGRmNmMyY2UzMDYzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjAsInR5cGUiOjF9fX0seyJoYXNoIjoiN2U3ZTczZGZlNDAyODgzYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDIwLCJ0eXBlIjoxfX19LHsiaGFzaCI6IjFjYWZlNDE2ZWI4ZDc0NmMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyMCwidHlwZSI6MX19fSx7Imhhc2giOiI0NWMwZWY2NGVjZmI2NTI1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjEsInR5cGUiOjB9fX0seyJoYXNoIjoiZDM3MTBjMjkwMGU5MGY4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDIxfX19LHsiaGFzaCI6ImZlZDhhOTdiOWU4NTU4ODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyMiwidHlwZSI6MX19fSx7Imhhc2giOiI1YzE4NDM0ZDVkNzIxNDU2IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjMsInR5cGUiOjB9fX0seyJoYXNoIjoiZmQ0YTY3MWQzNGI0Yzc2YyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDIzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE4MWIzODVhOGVhNWE2ODciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyNCwidHlwZSI6MH19fSx7Imhhc2giOiIwMDM5MzY3M2NhNWMxZDhhIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjR9fX0seyJoYXNoIjoiNjQ3OWQxYzVhMjQxZGEyZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDI1LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYzMGU0NGQ1NTAzZjM5YzQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyNiwidHlwZSI6MX19fSx7Imhhc2giOiI0ZjA3YTZjODkxNTFhMmViIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjcsInR5cGUiOjB9fX0seyJoYXNoIjoiNTE5ZTQ2ZjEyYzE0MWM0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDI3LCJ0eXBlIjowfX19LHsiaGFzaCI6IjQxM2NkZmFhODIxNWI4ZjUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQyNywidHlwZSI6MH19fSx7Imhhc2giOiJkZDhlMTUwYjUwM2ViMTJmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MjgsInR5cGUiOjF9fX0seyJoYXNoIjoiNThlMTkyNDg3ODJjZTY4OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDI5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjhjY2MxZGQ0NWUzMDU4MTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzMCwidHlwZSI6MH19fSx7Imhhc2giOiI5NTQzY2I0MzMwZmExZDZlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzF9fX0seyJoYXNoIjoiZmMxYTc2MDRkNmNlZDdjMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDMyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjkwYzM1NDc0M2RlMGI4MTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzMywidHlwZSI6MH19fSx7Imhhc2giOiIwZDhmNDEyNzhkNzAyMjUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzQsInR5cGUiOjF9fX0seyJoYXNoIjoiNjA3YzQ5MTliM2M4ZDVjZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDM0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImQwZDc2NDdkYzJlYTlkZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzNSwidHlwZSI6MX19fSx7Imhhc2giOiIzYzBjOTlkOTBhMTY4MDRmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzYsInR5cGUiOjB9fX0seyJoYXNoIjoiYTUwZThhNDEyOWYxNjBjOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDM2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjYyMTA1YjgyMDQ2NTg5NTAiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzNn19fSx7Imhhc2giOiI4MDY5YWZjOWE5NGI5MmI5IiwicHJlZml4ZXMiOnsiKiI6eyJwcm9kdWN0IjoxMzM2LCJ0eXBlIjowfX19LHsiaGFzaCI6ImM5Y2M5NDc0NzEwOTlhMGUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6NTgsInR5cGUiOjF9fX0seyJoYXNoIjoiNTE2MzUyZDczNGZhYTY4NCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDM3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjU2MmEzZGExYTgxYWU0ZWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzNywidHlwZSI6MX19fSx7Imhhc2giOiIxYmEyNjJmZWY3YzliOTRiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiY2Q2M2U3MzcyNWZhMmI4ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDM4LCJ0eXBlIjowfX19LHsiaGFzaCI6ImYyNDgxOWYyZWRkOTNjNjkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzOCwidHlwZSI6MH19fSx7Imhhc2giOiJlM2IxNTM4YmNlZDVlYzcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzgsInR5cGUiOjB9fX0seyJoYXNoIjoiMzQxZGY0ZTcwOGZiYmMwNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDM5LCJ0eXBlIjowfX19LHsiaGFzaCI6IjFmOTg0MTg3NzIzZjAzOTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQzOSwidHlwZSI6MH19fSx7Imhhc2giOiI2ZWQzNWIzM2RlNTE0N2JlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0MzksInR5cGUiOjB9fX0seyJoYXNoIjoiZDNmMDQ4OTFjYWJkNTZmOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg0MjliNWU3Yzc5MDVkZTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MCwidHlwZSI6MH19fSx7Imhhc2giOiJlYWRiNzc3OGEyOWI5NjE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDAsInR5cGUiOjB9fX0seyJoYXNoIjoiMTU1OTU1MzJjMzg2NjJlYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6ImNlMzY1NTY2ZDY2YTcyZWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MCwidHlwZSI6MH19fSx7Imhhc2giOiI2MGVmMjRlODIwYTZhODgxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDAsInR5cGUiOjB9fX0seyJoYXNoIjoiMTc2YmUyNDM0Y2EyZjY4YiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNmNzJmMmI0ZWM3ZjgxNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MCwidHlwZSI6MH19fSx7Imhhc2giOiJiY2M1MTkwMjc5MTRiZDc5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDAsInR5cGUiOjB9fX0seyJoYXNoIjoiODY2MjhiNWYwMTMzMmM2NiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQwLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFjMzRjNjJhNTg3ZTZjMWUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MSwidHlwZSI6MH19fSx7Imhhc2giOiJhMzBmOWM2NDY3NzJjZjBmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjU5LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImIyM2Q5NjBiMmVhMjViNTEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0Mn19fSx7Imhhc2giOiIwMzAxMTVlMzUyYWM4ZTk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiNzdkYTJkOThhNGRhOTcwZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImFhMDU1NWUxOWNmNWQ2Y2MiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiJiYWRjMTIxZTk5OTM1YWE1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiMTE1ZGY3OGFhNzdhYzljNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjA0NzEzYTE5M2VkOTZjYzAiLCJwcmVmaXhlcyI6eyJzIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiZmQ2ZmQxZjI5ZGU3MTI4NSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyfX19LHsiaGFzaCI6ImM1ZGU2MjM5YTZlZmU4MTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiI0YzBiZTMzYTFjMTQ0MjhkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiMDllYWFmZWQ1YmVhZTBlMSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImZmOTg3YmFkNjE4ODA5ZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiIyYjUwMDMzZDA2ODcwMzg1IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiOGIzOTkyMDRkMjdkMDdjMCIsInByZWZpeGVzIjp7InMiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiI1Zjc4ZDM4MGZhOTUxNGIxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDJ9fX0seyJoYXNoIjoiYzQ5MTJjM2Q4ZjA0Yjk0OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6IjM2MWZhNmRmNmJiMzIxNmUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiJiMThhYjlkZmI1MTNmMDJiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDIsInR5cGUiOjB9fX0seyJoYXNoIjoiZGU1MTFhNDQ2NTMxMDVlYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6ImY5OTBkODczZTE2MjI3NjYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiJmNTM2MThmZTUyOTU2ZGJmIiwicHJlZml4ZXMiOnsicyI6eyJwcm9kdWN0IjoxNDQyLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk2ZWQ2OTI1Mjk3OGNhYjkiLCJwcmVmaXhlcyI6eyJjZG4iOnsicHJvZHVjdCI6MTQ0MiwidHlwZSI6MH19fSx7Imhhc2giOiJmMzhiMzFiN2UyMDQzNTVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMCwidHlwZSI6MH19fSx7Imhhc2giOiI4OTVhOWM4YTNiNTJjOTVmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMCwidHlwZSI6MH19fSx7Imhhc2giOiI2MmJhMDAyZmU5MTQ5OGMzIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMCwidHlwZSI6MH19fSx7Imhhc2giOiIzMGZlNTI0ZTcwMGJkODlmIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjkzMCwidHlwZSI6MH19fSx7Imhhc2giOiI2Y2U4NmU3YTQ3ZDZkZmJjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDMsInR5cGUiOjB9fX0seyJoYXNoIjoiOGJlZDNkYjNmMjUyYjY1NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQ0LCJ0eXBlIjoxfX19LHsiaGFzaCI6ImMyZGNiYjQ3OTY0MzZlODkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0NX19fSx7Imhhc2giOiI5N2E4YjUwMzNjMjcyZjNjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDV9fX0seyJoYXNoIjoiM2QzOWVhZTllMjM3MGMzZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQ2LCJ0eXBlIjowfX19LHsiaGFzaCI6IjM4YTliZmFlNzZjOWIyZjEiLCJwcmVmaXhlcyI6eyIqIjp7InByb2R1Y3QiOjE0NDcsInR5cGUiOjF9fX0seyJoYXNoIjoiOWIxMTQ4OTMyNTAwZDBiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQ4LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjkwMWIyZjdjMDI3MjQ1MWIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0OCwidHlwZSI6MX19fSx7Imhhc2giOiI3ZDQ1Y2YzODZmNWMzZjI3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiZTY4ZTJmNzYzMGFmMDMyYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQ5LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc5ZGM2NDBmNjIyMDg5NDQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ0OSwidHlwZSI6MH19fSx7Imhhc2giOiI0ZDZlMzEyZDZhYmExMTE3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NDksInR5cGUiOjB9fX0seyJoYXNoIjoiMjllODVjNWFmMzVlMzc1MSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDQ5fX19LHsiaGFzaCI6ImU1ZjJiNmI5MmNjNmRhYTMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MCwidHlwZSI6MH19fSx7Imhhc2giOiJmODY3ZTA0YzZkZGUxNjVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTEsInR5cGUiOjF9fX0seyJoYXNoIjoiODM1M2EzNGVlMzVmZjMwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUxLCJ0eXBlIjoxfX19LHsiaGFzaCI6ImNjN2Y2OWZhNTVhNzUxOGYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MiwidHlwZSI6MH19fSx7Imhhc2giOiI5NWJhMmQxMGIxYjA2NzVjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZThmNjJhNTJlZGJkZjRiZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMyMWE3ZTA4ZDRiNGZkNTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiJjNmYyNzJlZDBhMjA2OTk5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiYmQzNGQyNzMzNDY3YzFhZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjFiNDlmNjExMzQ1OGRjNjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiI1OGI4M2UzYjNhOTc5NDNlIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiODE0YmNkOTU4OTUzMzM4NyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijk0NjVmYzdjMTU2NTkzZjQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiI3YzFjMjE5ZTc4YjJmMjcwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiOWQzNzZiYjU5ODIzMTliMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjEyZWM5YTBiMjg4OGE0YTkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiJmM2Q3ZGZjYjYwOTcyYjBjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiNDYwY2FjNDhlYzE0OWM2ZCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjI2MTRkM2ZmYTA1ZTE5YTUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiIxZjliNzcwYzA4Mzc4Y2VkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiMDU0ODY0ZmYxNTc4NjU3YSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6ImE1NTA1MzA2MDAwZTIwZjIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiIxMmNhZThiYmQyMmQ4NjczIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTMsInR5cGUiOjB9fX0seyJoYXNoIjoiZDc3MjRmOGE0OWI5NmZhNiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDUzLCJ0eXBlIjowfX19LHsiaGFzaCI6IjMwMTMwNzhhMjZmMzFlMmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1MywidHlwZSI6MH19fSx7Imhhc2giOiI4MDE5M2RlYTZlYjY3MzcyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTQsInR5cGUiOjF9fX0seyJoYXNoIjoiMDJjNDM5YjljYzdlMzNiNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDU1fX19LHsiaGFzaCI6ImZjYjRhZGJiMmJjNTU5ZTciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1NiwidHlwZSI6MH19fSx7Imhhc2giOiJiMDg0NDZhNjc2YTI4N2I0IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTYsInR5cGUiOjB9fX0seyJoYXNoIjoiMTIxMDVhNmNjMTdjMzJlNyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDU3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjAzNmQxNWMzYWQ0YTA3MzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ1NywidHlwZSI6MX19fSx7Imhhc2giOiJjMGM0MGU2ZjYzODEzYmUxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NTgsInR5cGUiOjB9fX0seyJoYXNoIjoiNGM0MzRhNTIzMjVjMGI2ZSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDU5LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjgyNWE5OWM0NmI2MTA1M2EiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2MCwidHlwZSI6MH19fSx7Imhhc2giOiIzMWFiNTM2Njg2NmU4NjIyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NjAsInR5cGUiOjB9fX0seyJoYXNoIjoiMzJhMjFmM2E0N2NiOGRkYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxMjd9fX0seyJoYXNoIjoiNDRhN2FmNmQzNzNiZDcxMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzIsInR5cGUiOjB9fX0seyJoYXNoIjoiMzZkODY4MDQ4MzIyN2RlOCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzJ9fX0seyJoYXNoIjoiOTcwOWM2YjY5ZDJlM2U5MCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0Ijo5NzJ9fX0seyJoYXNoIjoiNWVmZWZiNzhlYzliMTQ2ZiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDYxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjNlNWIzYzAwMTBmNzE3MmYiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2MiwidHlwZSI6MH19fSx7Imhhc2giOiIwN2JmMDkyNjNkMDM5MDQwIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NjN9fX0seyJoYXNoIjoiZGI4NzljNzE4NzY3NDFkMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjRhNmNhZGVkMGE0NTY1ZDkiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2NCwidHlwZSI6MH19fSx7Imhhc2giOiIwNWUwYjAyYTlhZjI4ZTg5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NjQsInR5cGUiOjB9fX0seyJoYXNoIjoiM2FjYTdhYzQ2NDlmMjQwYyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDY0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjgxYWJlOTU4NzI1MGZhYjEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2NCwidHlwZSI6MH19fSx7Imhhc2giOiJhM2I2YmFjODkxZTU3ODE5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NjUsInR5cGUiOjB9fX0seyJoYXNoIjoiZGRjMzUwN2JjNmY3OWRlNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDY2LCJ0eXBlIjowfX19LHsiaGFzaCI6Ijg4MWMyMDAyMDI3ZGUyZWMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2NiwidHlwZSI6MH19fSx7Imhhc2giOiIyODA4NDg4MWY0ZTUxZjZjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NjcsInR5cGUiOjB9fX0seyJoYXNoIjoiZDU2Mzc0NWUwZmVkOTJmNCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDY4LCJ0eXBlIjoyfX19LHsiaGFzaCI6ImQ2ZDEzY2U1MjU3NzFiYTQiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ2OSwidHlwZSI6MH19fSx7Imhhc2giOiI0NDY3NjZhNzNlZGY3NmEyIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzAsInR5cGUiOjB9fX0seyJoYXNoIjoiMDc1M2FhMzEwYTJhNzVhYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDcxLCJ0eXBlIjowfX19LHsiaGFzaCI6Ijc3MjI4NGZhNGJmYjhlNWEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3MSwidHlwZSI6MH19fSx7Imhhc2giOiIwZGQ0NDRiNzZkMTcyN2FiIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzEsInR5cGUiOjB9fX0seyJoYXNoIjoiMWRiMWZjMjk5ZTJkYzczYSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDcxLCJ0eXBlIjowfX19LHsiaGFzaCI6IjE2OTQ0N2FiNWYwYjJiMzIiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3MiwidHlwZSI6MX19fSx7Imhhc2giOiIxNDNiNDVmMmU1MmQ4NzFjIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzMsInR5cGUiOjB9fX0seyJoYXNoIjoiYmRjNTU2OTNhMmM2Mjg1OCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc0LCJ0eXBlIjowfX19LHsiaGFzaCI6ImU2OTA1OGZlMDczYThkMDciLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3NCwidHlwZSI6MH19fSx7Imhhc2giOiJkZWQ5NDE0NTA4NWQzNGVkIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzQsInR5cGUiOjB9fX0seyJoYXNoIjoiZWY2NmYyZTFiYjZhMzYwNSIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc0LCJ0eXBlIjowfX19LHsiaGFzaCI6IjVmNjJlY2QwZWVjNmI4MmEiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3NCwidHlwZSI6MH19fSx7Imhhc2giOiI0NTI4MWNlYTgzMzk4MzA5IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzUsInR5cGUiOjB9LCJ3ZWIiOnsicHJvZHVjdCI6MTQ3NSwidHlwZSI6MH0sImFwcCI6eyJwcm9kdWN0IjoxNDc1LCJ0eXBlIjowfSwiY2RuIjp7InByb2R1Y3QiOjE0NzUsInR5cGUiOjB9LCJhcGkiOnsicHJvZHVjdCI6MTQ3NSwidHlwZSI6MH0sInAiOnsicHJvZHVjdCI6MTQ3NSwidHlwZSI6MH0sIm1vYnBhZ2VzIjp7InByb2R1Y3QiOjE0NzUsInR5cGUiOjB9fX0seyJoYXNoIjoiN2VhMGM3Yzg0ODRmYjdiNCIsInByZWZpeGVzIjp7ImNkbiI6eyJwcm9kdWN0IjoxNDc1LCJ0eXBlIjowfX19LHsiaGFzaCI6IjY4MzllYmNiYzhkY2UxNzUiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3NSwidHlwZSI6MH0sInAiOnsicHJvZHVjdCI6MTQ3NSwidHlwZSI6MH19fSx7Imhhc2giOiJjMzM4MDE2ZTFhYTJhNWY3IiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzYsInR5cGUiOjJ9fX0seyJoYXNoIjoiM2JiODc5YjVhYjE3Y2JlYiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc3LCJ0eXBlIjoxfX19LHsiaGFzaCI6IjI2NjI3NDA3ZGY1MWY3M2QiLCJwcmVmaXhlcyI6eyJ0Ijp7InByb2R1Y3QiOjE0NzcsInR5cGUiOjF9LCJkIjp7InByb2R1Y3QiOjE0NzcsInR5cGUiOjF9LCJzIjp7InByb2R1Y3QiOjE0NzcsInR5cGUiOjF9fX0seyJoYXNoIjoiNDRlMDdlOTM0MWUyMGZkMCIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc4LCJ0eXBlIjoyfX19LHsiaGFzaCI6IjcxZDdhYmRhM2E2MDkzYjMiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3OCwidHlwZSI6Mn19fSx7Imhhc2giOiJmNTc3MTdlNmRmMDM5Y2QxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzgsInR5cGUiOjJ9fX0seyJoYXNoIjoiMGFlMDA4N2NmYTdiNzljMyIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc4LCJ0eXBlIjoyfX19LHsiaGFzaCI6IjU5YWZjMGQwOTFhMjJmNTgiLCJwcmVmaXhlcyI6eyIiOnsicHJvZHVjdCI6MTQ3OSwidHlwZSI6MH19fSx7Imhhc2giOiJmZDI5OWUwMTM4YWQ5MGMxIiwicHJlZml4ZXMiOnsiIjp7InByb2R1Y3QiOjE0NzksInR5cGUiOjB9fX0seyJoYXNoIjoiMWU0MDhkMmU5MDMzYTZlMiIsInByZWZpeGVzIjp7IiI6eyJwcm9kdWN0IjoxNDc5LCJ0eXBlIjowfX19XSk7O1Byb2R1Y3RSZWdpc3RyeUltcGwuc2hhMT1mdW5jdGlvbihzdHIpe3JldHVybiByc3RyMmhleChyc3RyX3NoYTEoc3RyMnJzdHJfdXRmOChzdHIpKSk7ZnVuY3Rpb24gcnN0cl9zaGExKHMpCntyZXR1cm4gYmluYjJyc3RyKGJpbmJfc2hhMShyc3RyMmJpbmIocykscy5sZW5ndGgqOCkpO30KZnVuY3Rpb24gcnN0cjJoZXgoaW5wdXQpCntsZXQgaGV4X3RhYj0iMDEyMzQ1Njc4OWFiY2RlZiI7bGV0IG91dHB1dD0iIjtsZXQgeDtmb3IobGV0IGk9MDtpPGlucHV0Lmxlbmd0aDtpKyspCnt4PWlucHV0LmNoYXJDb2RlQXQoaSk7b3V0cHV0Kz1oZXhfdGFiLmNoYXJBdCgoeD4+PjQpJjB4MEYpCitoZXhfdGFiLmNoYXJBdCh4JjB4MEYpO30KcmV0dXJuIG91dHB1dDt9CmZ1bmN0aW9uIHN0cjJyc3RyX3V0ZjgoaW5wdXQpCntsZXQgb3V0cHV0PSIiO2xldCBpPS0xO2xldCB4LHk7d2hpbGUoKytpPGlucHV0Lmxlbmd0aCkKe3g9aW5wdXQuY2hhckNvZGVBdChpKTt5PWkrMTxpbnB1dC5sZW5ndGg/aW5wdXQuY2hhckNvZGVBdChpKzEpOjA7aWYoMHhEODAwPD14JiZ4PD0weERCRkYmJjB4REMwMDw9eSYmeTw9MHhERkZGKQp7eD0weDEwMDAwKygoeCYweDAzRkYpPDwxMCkrKHkmMHgwM0ZGKTtpKys7fQppZih4PD0weDdGKQpvdXRwdXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoeCk7ZWxzZSBpZih4PD0weDdGRikKb3V0cHV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDB4QzB8KCh4Pj4+NikmMHgxRiksMHg4MHwoeCYweDNGKSk7ZWxzZSBpZih4PD0weEZGRkYpCm91dHB1dCs9U3RyaW5nLmZyb21DaGFyQ29kZSgweEUwfCgoeD4+PjEyKSYweDBGKSwweDgwfCgoeD4+PjYpJjB4M0YpLDB4ODB8KHgmMHgzRikpO2Vsc2UgaWYoeDw9MHgxRkZGRkYpCm91dHB1dCs9U3RyaW5nLmZyb21DaGFyQ29kZSgweEYwfCgoeD4+PjE4KSYweDA3KSwweDgwfCgoeD4+PjEyKSYweDNGKSwweDgwfCgoeD4+PjYpJjB4M0YpLDB4ODB8KHgmMHgzRikpO30KcmV0dXJuIG91dHB1dDt9CmZ1bmN0aW9uIHJzdHIyYmluYihpbnB1dCkKe2xldCBvdXRwdXQ9QXJyYXkoaW5wdXQubGVuZ3RoPj4yKTtmb3IobGV0IGk9MDtpPG91dHB1dC5sZW5ndGg7aSsrKQpvdXRwdXRbaV09MDtmb3IobGV0IGk9MDtpPGlucHV0Lmxlbmd0aCo4O2krPTgpCm91dHB1dFtpPj41XXw9KGlucHV0LmNoYXJDb2RlQXQoaS84KSYweEZGKTw8KDI0LWklMzIpO3JldHVybiBvdXRwdXQ7fQpmdW5jdGlvbiBiaW5iMnJzdHIoaW5wdXQpCntsZXQgb3V0cHV0PSIiO2ZvcihsZXQgaT0wO2k8aW5wdXQubGVuZ3RoKjMyO2krPTgpCm91dHB1dCs9U3RyaW5nLmZyb21DaGFyQ29kZSgoaW5wdXRbaT4+NV0+Pj4oMjQtaSUzMikpJjB4RkYpO3JldHVybiBvdXRwdXQ7fQpmdW5jdGlvbiBiaW5iX3NoYTEoeCxsZW4pCnt4W2xlbj4+NV18PTB4ODA8PCgyNC1sZW4lMzIpO3hbKChsZW4rNjQ+PjkpPDw0KSsxNV09bGVuO2xldCB3PUFycmF5KDgwKTtsZXQgYT0xNzMyNTg0MTkzO2xldCBiPS0yNzE3MzM4Nzk7bGV0IGM9LTE3MzI1ODQxOTQ7bGV0IGQ9MjcxNzMzODc4O2xldCBlPS0xMDA5NTg5Nzc2O2ZvcihsZXQgaT0wO2k8eC5sZW5ndGg7aSs9MTYpCntsZXQgb2xkYT1hO2xldCBvbGRiPWI7bGV0IG9sZGM9YztsZXQgb2xkZD1kO2xldCBvbGRlPWU7Zm9yKGxldCBqPTA7ajw4MDtqKyspCntpZihqPDE2KXdbal09eFtpK2pdO2Vsc2Ugd1tqXT1iaXRfcm9sKHdbai0zXV53W2otOF1ed1tqLTE0XV53W2otMTZdLDEpO2xldCB0PXNhZmVfYWRkKHNhZmVfYWRkKGJpdF9yb2woYSw1KSxzaGExX2Z0KGosYixjLGQpKSxzYWZlX2FkZChzYWZlX2FkZChlLHdbal0pLHNoYTFfa3QoaikpKTtlPWQ7ZD1jO2M9Yml0X3JvbChiLDMwKTtiPWE7YT10O30KYT1zYWZlX2FkZChhLG9sZGEpO2I9c2FmZV9hZGQoYixvbGRiKTtjPXNhZmVfYWRkKGMsb2xkYyk7ZD1zYWZlX2FkZChkLG9sZGQpO2U9c2FmZV9hZGQoZSxvbGRlKTt9CnJldHVybiBBcnJheShhLGIsYyxkLGUpO30KZnVuY3Rpb24gc2hhMV9mdCh0LGIsYyxkKQp7aWYodDwyMClyZXR1cm4oYiZjKXwoKH5iKSZkKTtpZih0PDQwKXJldHVybiBiXmNeZDtpZih0PDYwKXJldHVybihiJmMpfChiJmQpfChjJmQpO3JldHVybiBiXmNeZDt9CmZ1bmN0aW9uIHNoYTFfa3QodCkKe3JldHVybih0PDIwKT8xNTE4NTAwMjQ5Oih0PDQwKT8xODU5Nzc1MzkzOih0PDYwKT8tMTg5NDAwNzU4ODotODk5NDk3NTE0O30KZnVuY3Rpb24gc2FmZV9h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hAahQWgQGqFBaBAahAahERqEBqFBaBAaoUFoEBqEBqERGoQGoUFohO4e2KKFRmgQGoQGoREahAahQWgQGqFBaBAahAahERqEBqFBaBAaoUFoEBqEBqERGoQGoUFoEBqhQWgQGoQGoREahAahQWhuIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9CB0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDRCC43QIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNEILjdAgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9CB0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDRCC43QIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNEILjdAgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9CB0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDRCC43QIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNEILjdAgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0ITQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDRCC43QIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNEILjdAgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0ITQIDUKD0CA0QoPQIDQIDUIjNAgNQoPQIDRCg9AgNAgNQiM0CA1Cg9AgNEKD0CA0CA1CIzQIDUKD0AgNQoPQIDQIjdAgNAgNQoPQCA1Cg9AgNAiN0CA0CA1Cg9AIDUKD0CA0CI3QIDQIDUKD0AgNQoPQIDRCwyI1sEgBAAAAAAAAAAAAAAAAAAAA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gOAAAAQHAIDgAAAEBwAgOAAABAcAIDgAAAQHACA4AADBAQAgOAAAwQEACA4AAMEBAAgOAADBAQAIDgBAcAAACA4AQHAAAIIDAEBwAACCAwBAcAAAggMAEBwAAIIDABAcAIDgAAAQHACA4AAAEBwAgOAAAAQHAIDgAAAEBwAgOAAABAcAIDgAAAQHACA4AADBAQAgOAAAwQEACA4AAMEBAAgOAADBAQAIDgBAcAAACA4AQHAAAIIDAEBwAACCAwBAcAAAggMAEBwAAIIDABAcAIDgAAAQHACA4AAAEBwAgOAAAAQHAIDgAAAEBwAgOAAABAcAIDgAAAQHACA4AADBAQAgOAAAwQEACA4AAMFRCAAgOAAAwQEAIDgAAMEBAAgOAADBAQAIDgAAwQEACA4AQHAAAAgOAEBwAACCAwBAcAAAggMAQHAAAIIDABAcAACCAwAQHACA4AAAEBwAgOAAABAcAIDgAAAEBwCA4AAABAcAIDgAAAQHACA4AAAEBwAgOAAAwQEAIDgAAMEBAAgOAADBAQAIDgAAwQEACA4AQHAAAAgOAEBwAACCAwBAcAAAggMAQHAAAIIDABAcAACCAwAQHACA4AAAEBwAgOAAABAcAIDgAAAEBwCA4AAABAcAIDgAAAQHACA4AAAEBwAgOAAAwQEAIDgAAMEBAAgOAADBAQAIDgAAwQEACA4AQHAAAAgOAEBwAACCAwBAcAAAggMAQHAAAIIDABAcAACCAwAQHACA4AAAEBwAgOAAABAcAIDgAAAEBwCA4AAABAcAIDgAAAQHACA4AAAEBwAgOAAAwQEAIDgAAMEBAGQTHAAAggMAEBwAgOAAABAcAIDgAAAQHACA4AAABAcAgOAAAAQHACA4AAAEBwAgOAAABAcAIDgAAMEBACA4AADBAQAIDgAAwQEACA4AAMEBAAgOAEBwAAAIDgBAcAAAggMAQHAAAIIDAEBwAACCAwAQHAAAggMAEBwAgOAAABAcAIDgAAAQHACA4AAABAcAgOAAAAQHACA4AAAEBwAgOAAABAcAIDgAAMEBACA4AADBAQAIDgAAwQEACA4AAMEBAAgOAEBwAAAIDgBAcAAAggMAQHAAAIIDAEBwAACCAwAQHAAAggMAEBwAgOAAABAcAIDgAAAQHACA4AAABAcAgOAAAAQHACA4AAAEBwAgOAAABAcAIDgAAMEB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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeee+5tt912wgknlK4DAOjp6Xnttdd+/vnnrVu3/vjjj+edd16BwYwZM2by5MkzZsw4+eSTe9tmz56dH6dOnTpu3LgyKAA44IADli1b9uWXX37zzTd9ba1Wa/369aUBYt99973++uuff/75XB6bN2/OdbK17bvvvvvkk0/ef//9VatWLVq0aPr06QUAmlVj4cKFv/zyS60a1Z9//lnaIDJ6ceutt37f1rdD6R/btm1bvHjxtGnTShvE2LFj582bl1ba39//R5fkpfKCl156aV68DFvAhRde+M4773z77bd9g8nNXNogy3o+/vjjDGP0DVmuqy1btixdurS0Qb7b5BJqtVp9XZUXzMteccUVZRgCZs6cuXz58gFfVTPIsWbNmto/FA7ioIMOeuqpp7Kmp/n+njGML774Im119erV/2l7+eWX33rrrU8//TS/yh80a8e6desMdRC5PLreNuo1+dlnn5VhBdh7770feuih3PmpF81Phfy4YMGC/EF6hsJBxIQJE9JBm5fKDz/8sGnTpssuu+z444+fNGlS/qC07bXXXqkmxxxzzPz589euXZsplWaRzejIcccdV/Zs/Prrr31tX3/9dVdmVfIiealh934F7Lfffueff/5XX32VetH8MMg3g4x7T5w4sYTC0WBs44033mi1WvVSySrRrBgtQ5Cp+qwqrVMw+VTIv802lvwKhSNFoXRJXmp4vV8BZ5111uuvvz5gAjVfQ7Pd4KSTTiptCkcTK1eurGMbuXKyZTpbYcuQpcI+/PDDGRGpfSVzK2UPRhand+W9ZZi+XwHZoJgBjN9++62vIas3MgGfORQ3MIPKSEbWbdS2sWLFijFtZSfdf//9+ed15m5PXkNK3lJGbeEAlixZ8tFHHzXnUFqtVtrGlVdeWedQBnADc9hhh2XVRR2ZePXVVzvZc5iLsHaOnPUya9asMjqgcADjx4+fO3fue++9lzf65nKNLODIjoNDDjnEDbwD3HjjjfXKyXFehx9+eOnAgQcemA0s9SJ87LHHyp7NGo68twyD1+wYcPrpp7/44outtto2MjyeOfh8ufzHUXGFg2xtrZMpd955Z+nYxRdfXCdocnb+yH5SD0Y4gClTptx99931nb1OnG/cuPGaa65xAw8F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QdAgaBA0CBpBg6BB0OUgaBA0CBoEjaBB0CBoEDQIGkGDoEHQIGgQNIIGQYOgQdAgaAQNggZBg6BB0AgaBA2CBkGDoBE0CBoEDYIGQSNoEDQIGgSNoEHQIGgQNAgaQYOgQdAgaBA0ggZBg6BB0CBoBA2CBkGDoEHQCBoEDYIGQYOgETQIGgQNggZBI2gQNAgaBI2gBY2gQdAgaBA0ggZBg6BB0CBoBA2CBkGDoEHQCBoEDYIGQYOgETQIGgQNggZBI2gQNAgaBA2CRtAgaBA0CBoEjaBB0CBoEDSCBkGDoEHQIGgEDYIGQYOgQdAIGgQNggZBg6ARNAgaBA2CBkEjaBA0CBoEDYJG0CBoEDQIGgSNoEHQIGgQNIIWNIIGQYOgQdAIGgQNggZBg6ARNAgaBA2CBkEjaBA0CBoEDYJG0CBoEDQIGgSNoEHQIGgQNAgaQYOgQdAgaBA0ggZBg6BB0AgaBA2CBkGDoBE0CBoEDYIGQSNoEDQIGgQNgkbQIGgQNAgaBI2gQdAgaBA0CBpBg6BB0CBoEDSCBkGDoItC0CBoEDQIGkGDoEHQIGgQNIIGQYOgQdAgaAQNggZBg6BB0AgaBA2CBkGDoBE0CBoEDYIGQSNoEDQIGgQNgkbQIGgQNAgaQYOgQdAgaBA0ggZBg6BB0CBoBA2CBkGDoEHQCBoEDYIGQYOgETQIGgQNggZBI2gQNAgaBA2CRtAgaBA0CBpBCxpBg6BB0CBoBA2CBkGDoEHQCBoEDYIGQYOgETQIGgQNggZBI2gQNAgaBA2CRtAgaBA0CBoEjaBB0CBoEDQIGkGDoEHQIGgEDYIGQYOgQdAIGgQNggZBg6ARNAgaBA2CBkEjaBA0CBoEDYJG0CBoEDQIGgSNoEHQIGgQNAgaQYOgQdAgaAQtaAQNggZBg6ARNAgaBA2CBkEjaBA0CBoEDYJG0CBoEDQIGgSNoEHQIGgQNAgaQYOgQdAgaBA0ggZBg6BB0CBoBA2CBkGDoBE0CBoEDYIGQSNoEDQIGgQNgkbQIGgQNAgaBI2gQdAgaBA0CBpBg6BB0CBoEDSCBkGDoEHQIGgEDYIGQReFoEHQIGgQNIIGQYOgQdAgaAQNggZBg6BB0AgaBA2CBkGDoBE0CBoEDYIGQSNoEDQIGgQNgkbQIGgQNAgaBI2gQdAgaBA0ggZBg6BB0CBoBA2CBkGDoEHQ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GAAEGAAEWIABQIABQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBkCABRgABBgABFiAAUCAAUCABRgABBgABFiAAUCAAUCABRgAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAARZgAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAFAgAUYAHaTABeVtiZUCgEGABMwAPw+B7it/bh/uOdnDd1785zxFQEGgBYFuP3L69985z8aeuetDddNEmAAaEmAi/SR9T1lWW2oLOsbOlMhwADQggBX0s1vlTlH2UDkXL75o1QRYABoSYDve6fM0bOxgZ7I5VsPCDAAtCjA979TjZ6fXn3N1UO45sof95TVt5cKMAC0LsDlxq9OmTxpCJPfffmbAgwALQzwz96plhuvndQ+1Ek42idc+mZZffshAQaAFgb4zWsmDXl8czH+krcFGAAEGAAEWIABQIABQIABQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABQIABQIABQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABQIABQIABQIAFGAAEGAAEWIABQIABQIAFGABGLcDXTmqvDKF9/Py3BBgAWh3g6/baY/wQ9pj8ZwIMAC0OcPT+5OL5lwxh/oWL3xBgAGhZgIt039tljt63G+iNXL71gAADQIsCfMtbZc5lQzmXb/4oFQIMAC0IcEonddXKahPKWtfHm35SAQZAgIc2/ivr33izCW9s+NZkAQaAFgW42OOUHz74UEMP3vrxyRUBBoAWBXh0WAAABLjRDFxpa0KlEGAAMAEDgAALMAAIMAAIMAAIsAADgAADgAALMAAIMAAIsAADgAADgAALMAAIMAAIMAAIsAADgAADgAALMAAIMAAIsAADgAADgAALMAAIMAAIMAAIsAADgAADgAALMAAIMAAIsAADgAADgAALMAAIMAAIMAAIsAADgAADgAALMAAIMAAIsAADgAADgAALMAAIMAAIsAUAQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABQIABQIAFGAABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAABFiAAUCAAUCABRgABBgABFiAAUCAAUCABRgABBgABFiAARBgAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAARZgAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAEQYAEGAAEGAAEWYAAQYAAQYAEGAAEGAAEWYAAQYAAQYAEGQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABQIABQIAFGAABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBkCABRgABBgABFiAAUCAAUCABRgABBgABFiAAUCAAUCABRgAARZgABBgABBgAQYAAQYAARZgABBgABBgAQYAAQYAARZgAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAEQYAEGAAEGAAEWYAAQYAAQYAEGAAEGAAEWYAAQYAAQYAEGAAEGAAEGAAFurCiKQoABYEwDXBSVSqUysgRbAAAEuPnyppT2OOTEPznv/AvOmzfnj95VbL5PgAFg1AJcFJV9/+s37nri+VfWdnWtfeWFJ//lWx+dupOTsAUAQICbNePy/7O+zDlHRETknMuux648yAQMAKMW4Erx7ouefae3GrmPqPb8xwuXTykqAgwAoxHgYsKc+3p6q2VEbB6AI3JELqs9PQ92TioEGABaH+Biv/mvbowyIqKWy3WvrVz52toy1yIiynhj1TX7FwIMAK0OcOXwhdV6mXPUaqt/dftfXXbumZ/+3J8tWPSL12s5ci5rtX+c1SbAANDaAFeOvrM7yhy555U7zj9h5sRi007p933kS4tW9OTIZZR3z64IMAC0NMAdd3ZHRNS67jjj/eO3feyoKMYfePpt63MZEdWfHiXAANDCABf7LeyOyJFXXD1jXFu/P/YWbe0HXL68FhHRfduMQoABoFUBbpt4eY7IUfu3U4sdP29UFJU5P69Fjqh9Y8+KAANAawJcpBNfrZcRtV9+eOBzXhXFkY/kiKitmlspBBgAWjMB73X/xjJH/bnZg51zsiiO+Xk9ctm7dJoJGABaEuAiXVyPHLUVn0jF4OeInvPbWuSoX5EKAQaAVgT4wGd7y8hdV48rhqr0pRtylD3PvV+AAaAFAS7S5e9Uo6zfceCQaS2m3tpTRvXta5segS0AAAI8hKkP95aRX/70uKED3PaxFbUoe5+aZgIGgBYE+OT11Yj6nQc1ONNk2/T/VY+o9nQ2OwJbAAAEeAhfrZaR11w8oUFXi/HnrsoR9b82AQPAyAO8x505Iv/riQ3n2soxT9Qi15a+S4ABYMQBPvSJnHP+pwMbb7n/LTnn/MxhAgwAIw1wceLzOUf1xomNN51wXTUifneKvwEDwIgD/CcrI8e6S5uoavHF1TlizTlFIcAAMMIAn7cmcqz6XDPbzns5ouy6SIABYMQBPn9DmWPlGc1sO/fFiLL8sgADwIgDfEFXmWPlp5sK8Ioc1RBgABh5gIe9C/piB2EBwIgDPG9l5Fg3v5mDsL6wOke55lwBBoCRBjjNeSHnKG+Y0HjL8V+p5oiXOn0OGABGHOA/ejLnnBe9r+FcW0y7Oeecn+0QYAAYcYAn/SRH5Kc+0vhUlEc/Xotce2iyAAPAiAOcrq9G5NUXNrwYw7hzVuWI+nddjAEAWhDgj66v5qgvntHocoT73dITubvnYwIMAC0I8LRl9TLqK05vH3IELtpO/m09yvrT0wUYAFoQ4HTV291R9t52wNAB3ueW3jKqb12fBBgAWhHgg5+vl5E3XDZuiAIX6fz1OaL+74emQoABYOQBLtIV9chRX37K4OeYLIr/8kI9ctS/0nR/BRgAAR7aex/sLSPqTx09WIGL4oiH6xFlzyPvS3ZBA0BLAlykU1+tRZT1R/544AIXxYfuy2VEfn1eWyHAANCaCbgy6ZocEWXtFycVOya4KCrHP5zLiMg3vqdiAgaAFgU4FdNurUbkqL946dT2/kNu0da2zwW/6YmIKP95ZvPzrwADIMCNzbq7OyKi3nVr5/Rxfabgon3aSbesr0dEVO8/djjPKMAACHDDEbhy3N3dETly7+9uPfuY6ZvOS1mMn/bHn7nlt705ckR5/0kVAQaAlk7Aqe2o27prZc5lvWfVE7d89Yvz5s6d94Wv3LzstZ56mXNZizuPbUsCDACtDXBKM656rSfKiKjVcnX1KytWvLK6mmu1iCijZ9U3Zw7z6QQYAAFuajf0u+Y+WKtXy4jIW0XkslqvPzJvr0KAAWAUApwq7ft9+bk3e7oj59gs5+jueevfrz2gvZIEGABGI8CpSGnmNU/kWs4RZbVaRuRcq//yqx9IadjzrwADIMDDSHBl385vP/jM717fUO1e9/rvnn3ou3P3q+xMfgUYAAEeRoGLlNK7Djv1nIuuuOz8czo79iw23yfAADB6Ad60IzoVRVEpNp2WstjJpxFgAAR4JybhoiiKkTyDAAMgwLuCBQBAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAEWYAAQYAAQYAEGAAEGAAEWYAAQYAAQYAEGAAEGAAEWYAAEWIABQIABQIAFGAAEGAAEWIABQIABQIAFGAAEGAAEWIABEGABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABBgABFmAAEGAAEGABBgABBgABFmAAEGAAEGABBgABBgABFmAABFiAAUCAAUCABRgABBgABFiAAUCAAUCABRgABBgABFiAARBgAQYAAQYAARZgABBgABBgAQYAAQYAARZgABBgABBgAQZAgAUYAAQYAARYgAFAgAFAgAUYAAQYAARYgAFAgAFAgAUYAAEWYAAQYAAQYAEGAAEGAAEW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AwAAAAAIaAENAAAAACCgEdAAAAAAgIBGQAMAAAAACGgBDQAAAAAgoBHQAAAAAICARkADAAAAAAhoAQ0AAAAAIKAR0AAAAACAgEZAAwAAAAAIaAENAAAAACCgEdAAAAAAgIBGQAMAAAAACGgBDQAAAAAgoBHQAAAAAICARkADAAAAAAhoAQ0AAAAAIKAR0AAAAACAgEZAAwAAAAAIaAENAAAAACCgEdAAAAAAgIBGQAMAAAAACGgBDQAAAAAgoBHQAAAAAICARkADAAAAAAhoAQ0AAAAAIKAR0AAAAACAgEZAAwAAAAAIaAENAAAAACCgEdAAAAAAgIBGQAMAAAAACGgBDQAAAAAgoBHQAAAAAICARkADAAAAAAhoAQ0AAAAAIKA5AAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAQ0AIaAAAAAEBAC2gAAAAAAAGNgAYAAAAAENACGgAAAABAQAtoAAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAQ0AIaAAAAAEBAC2gAAAAAAAGNgAYAAAAAENACGgAAAABAQAtoAAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAQ0AIaAAAAAEBAC2gAAAAAAAGNgAYAAAAAENACGgAAAABAQAtoAAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAQ0AIaAAAAAEBAC2gAAAAAAAGNgAYAAAAAENACGgAAAABAQAtoAAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAQ0AIaAAAAAEBAC2gAAAAAAAGNgAYAAAAAENACGgAAAABAQAtoAAAAAAABjYAGAAAAABDQAhoAAAAAQEALaAAAAAAAAY2ABgAAAAAoBDQAAAAAgIAW0AAAAAAAAhoBDQAAAAAIaAQ0AAAAAICAFtAAAAAAAAIaAQ0AAAAACGgENAAAAACAgBbQAAAAAAACGgENAAAAAAhoBDQAAAAAgIAW0AAAAAAAAhoBDQAAAAAIaAQ0AAAAAICAFtAAAAAAAAIaAQ0AAAAACGgENAAAAACAgBbQAAAAAAACGgENAAAAAAhoBDQAAAAAgIAW0AAAAAAAAhoBDQAAAAAIaAQ0AAAAAICAFtAAAAAAAAIaAQ0A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lbsTYACoSClb/L27PnLS+JRFRJZFShGRyz939y9fjlRtfwUYACqdgSPNveqnB733gJ2bGgbks/ZCy+o3Z06d8UYpZVX3V4ABoPIEp+yN++4bNGb0ToMbi81rli6ctyqLVP34K8AAUN0QHClb/dzzsfakcxbRlelXgAGgCw2ObO3zsNb/J8AA0GcV7h4BBoBtQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgABBgAEGAAEGAAQYAAQYABAgAFAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgABBgAEGAAEGAAQYAAQYABAgAFAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgABBgAEGAAEGAAQYAAQYABAgAFAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIAdAgAQYAAQYABAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAEGAAQIABQIABAAEGAAEGAAQYAAQYABBgABBgABBgAECAAUCAAQABBgABBgAEGAAEGAAQYAAQYAAQYABAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAEGAAQIABQIABAAEGAAEGAAQYAAQYABBgABBgABBgAECAAUCAAQABBgABBgAEGAAEGAAQYAAQYAAQYABAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAEGAAQIABQIABAAEGAAEGAAQYAAQYABBgABBgABBgAECAAUCAAQABBgABBgAEGAAEGAAQYAAQYAAQYABAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgABBgAEGAAEGAAQYAAQYABAgAFAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgABBgAEGAAEGAAQYAAQYABAgAFAgAFAgAEAAQYAAQYABBgABBgAEGAAEGAAQIABQIABQIABAAEGAAEGAAQYAAQYABBgABBgAECAAUCAAUCAAQABBgAB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cADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQiHIQCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEAxAOQwAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIByAchgAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDkA4DAEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIB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AUBUAEBUABAVAEQFAFEBAFEBQFQAEBUAEBUARAUAUQFAVABAVAAQFQBEBQBEBQBRAUBUABAVABAVAEQFAFEBAFEBQFQAEBUARAUARAUAUQFAVAAQFQAQFQBEBQBRAQBRAUBUABAVAEQFAEQFAFEBQFQAQFQAEBUARAUAUQEAUQFAVAAQFQAQFQBEBQBRAUBUAEBUABAVAEQFAEQFAFEBQFQAEBUAEBUARAUAUQEAUQFAVAAQFQBEBQBEBQBRAUBUAEBUABAVAEQFAFEBAFEBQFQAEBUAmMsBQFQAEBUARAUARAUAUQFAVAAQFQAQFQBEBQBRAQBRAUBUABAVAEQFAEQFAFEBQFQAQFQAEBUARAUAUQEAUQFAVAAQFQAQFQBEBQBRAUBUAEBUABAVAEQFAEQFAFEBQFQAEBUAEBUARAUAUQEAUQFAVAAQFQBEBQBEBQBRAUBUAEBUABAVAEQFAFEBAFEBQFQAEBUARAUARAUAUQFAVABAVAAQFQBEBQBRAQBRAUBUABAVABAVAEQFAFEBQFQAQFQAEBUARAUARAUAUQFAVAAQFQAQFQBEBQBRAQBRAUBUABAVAEQFAEQFAFEBQFQAQFQAEBUARAUAUQEAUQFAVAAQFQAQFQBEBQBRAUBUAEBUABAVAEQFAEQFAFEBQFQAEBUAEBUARAUAUQFAVABAVAAQFQBEBQBEBQBRAUBUABAVABAVAEQFAFEBAFEBQFQAEBUARAUARAUAUQFAVABAVAAQFQBEBQBRAQBRAUBUABAVABAVAEQFAFEBQFQAQFQAEBUARAUARAUAUQFAVAAQFQAQFQBEBQBRAQBRAUBUABAVAEQFAEQFAFEBQFQAQFQAEBUARAUAUQEAUQFAVAAQFQBE5fcGgKgAICoAiAoAiAoAogKAqAAgKgAgKgCICgCiAgCiAoCoACAqAIgKAIgKAKICgKgAgKgAICoAiAoAogIAogKAqAAgKgAgKgCICgCiAoCoAICoACAqAIgKAIgKAKICgKgAICoAICoAiAoAogIAogKAqAAgKgCICgCICgCiAoCoAICoACAqAIgKAKICAKICgKgAICoAiAoAiAoAogKAqACAqAAgKgCICgCiAgCiAoCoACAqACAqAIgKAKICgKgAgKgAICoAiAoAiAoAogKAqAAgKgAgKgCICgCiAgCiAoCoACAqAIgKAIgKAKIC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ACBUAAAAhAoAACBUAAAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAABAqAACAUAEAABAqAACAUAEAABAqAACAUAEAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAAECoAAAAQgUAAECoAAAAQgUAAECoAAAAQgUAAECoAAAAQgUAAECoAAAACBUAAECoAAAACBUAAECoAAAACBUAAECoAAAACBUAAAChAgAACBUAAAChAgAACBUAAAChAgAACBUAAAChAgAACBUAAAChAgAAIFQAAAChAgAAIFQAAAChAgAAIFQAAAChAgAAIFQAAACECgAAIFQAAACECgAAIFQAAACECgAAIFQAAACECgAAIFQAAACECgAAgFABAACECgAAgFABAACECgAAgFABAACECgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAAEIFAAAQKgAAAEIFAAAQKgAAAEIFAAAQKgAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAAgVAABAqAAAAAgVAABAqAAAAAgVAABAqAAAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAACBUAAAAoQIAACBUAAAAoQIAACBUAAAAoQIAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCJXcAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAABAqAACAUAEAABAqAACAUAEAABAqAACAUAEAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAABAqAAAAQgUAAECoAAAAQgUAAECoAAAAQgUAAECoAAAAQgUAAECoAAAACBUAAECoAAAACBUAAECoAAAACBUAAECoAAAACBUAAECoAAAACBUAAAChAgAACBUAAAChAgAACBUAAAChAgAACBUAAAChAgAAIFQAAAChAgAAIFQAAAChAgAAIFQAAAChAgAAIFQAAAChAgAAIFQAAACECgAAIFQAAACECgAAIFQAAACECgAAIFQAAACECgAAgFABAACECgAAgFABAACECgAAgFABAACECgAAgFABAACECgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAgFABAAAQKgAAAEIFAAAQKgAAAEIFAAAQKgAAAEIFAAAQKgAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAEIFAABAqAAAAAgVAABAqAAAAAgVAABAqAAAAAgVAABAqAAAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAAAgVAAAAoQIAACBUAAAAoQIAACBUAAAAoQIAACBUAAAAoQIAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAACBUAAAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAhAoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAIBQAQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAECoAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAABCBQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAQKgAAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAIFQAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAKECAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAAAgVAAAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAIQKAACAUAEAAA4lVAAAAIQKAACAUAn/Zr8OBAAAAACA/F8b4UJVVTUqVVVVo1JVVY1KVVXVqFRVVaNSVVU1KlVV1ahUVVWNSlVV1ahUVVWjUlVVNSpVVdWoVFVVjUpVVTUqVVVVo1JVVY1KVVXVqFRVVY1KVVU1KlVVVaNSVVWNSlVV1ahUVVWjUlVVNSpVVVWjUlVVjUpVVdWoVFVVo1JVVTUqVVXVqFRVVY1KVVU1KlVVVaNSVVU1KlVV1ahUVVWNSlVVNSpVVVWjUlVVjUpVVdWoVFVVjUpVVTUqVVVVo1JVVY1KVVXVqFRVVaNSVVU1KlVV1ahUVVWNSlVV1ahUVVWjUlVVNSpVVdWoVFVVjUpVVTUqVVVVo1JVVTUqVVXVqFRVVY1KVVU1KlVVVaNSVVWNSlVV1ahUVVWjUlVVNSpVVVWjUlVVjUpVVdWoVFVVo1JVVTUqVVXVqFRVVY1KVVXVqFRVVaNSVVU1KlVV1ahUVVWNSlVVNSpVVVWjUlVVjUpVVdWoVFVVjUpVVTUqVVVVo1JVVY1KVVXVqFRVVaNSVVU1KlVVVaNSVVWNSlVV1ahUVVWjUlVVNSpVVdWoVFVVjUpVVTUqVVVVo1JVVTUqVVXVqFRVVY1KVVU1KlVVVaNSVVWNSlVV1ahUVVWNSlVVNSpVVVWjUlVVjUpVVdWoVFVVo1JVVTUqVVXVqFRVVY1KVVXVqFRVVaNSVVU1KlVV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HIgDcSAOxIE4EAfiQByIA8SBOBAH4kAciANxIA7EgThAHIgDcSAOxIE4EAfiQByIA8SBOBAH4kAciANxIA7EgTgQB4gDcSAOxIE4EAfiQByIA3GAOBAH4kAciANxIA7EgTgQB4gDcSAOxIE4EAfiQByIA3EgDhAH4kAciANxIA7EgTgQB+IAcSAOxIE4EAfiQByIA3EgDhAH4kAciANxIA7EgTgQB+JAHKYAcSAOxIE4EAfiQByIA3EgDhAH4kAciANxIA7EgTgQB+IAcSAOxIE4EAfiQByIA3EgDhAH4kAciANxIA7EgTgQB+JAHCAOxIE4EAfiQByIA3EgDsQB4kAciANxIA7EgTgQB+JAHCAOxIE4EAfiQByIA3EgDsSBOEAciANxIA7EgTgQB+JAHIgDxIE4EAfiQByIA3EgDsSBOEAciANxIA7EgTgQB+JAHIgDcYA4EAfiQByIA3EgDsSBOBAHiANxIA7EgTgQB+JAHIgDcYA4EAfiQByIA3EgDsSBOBAH4gBxIA7EgTgQB+JAHIgDcSAOEAfiQByIA3EgDsSBOBAH4gBxIA7EgTgQB+JAHIgDcSAOxAHiQByIA3EgDsSBOBAH4kAcIA7EgTgQB+JAHIgDcSAOxAHiQByIA3EgDsSBOBAH4kAciAPEgTgQB+JAHIgDcSAOxIE4QByIA3EgDsSBOBAH4kAciAPEgTgQB+JAHIgDcSAOxIE4EAeIA3EgDsSBOBAH4kAciANxgDgQB+JAHIgDcSAOxIE4EAeIA3EgDsSBOBAH4kAciANxIA5TgDgQB+JAHIgDcSAOxIE4EAeIA3EgDsSBOBAH4kAciANxgDgQB+JAHIgDcSAOxIE4EAeIA3EgDsSBOBAH4kAciANxIA4QB+JAHIgDcSAOxIE4EAfiAHEgDsSBOBAH4kAciANxIA4QB+JAHIgDcSAOxIE4EAfiQBwgDsSBOBAH4kAciANxIA7EAeJAHIgDcSAOxIE4EAfiQBwgDsSBOBAH4kAciANxIA7EgThAHIgDcSAOxIE4EAfiQByIA8SBOBAH4kAciANxIA7EgThAHIgDcSAOxIE4EAfiQByIA3GAOBAH4kAciANxIA7EgTgQB4gDcSAOxIE4EAfiQByIA3GAOBAH4kAciANxIA7EgTgQB+IAcSAOxIE4EAfiQByIA3EgDhAH4kAciANxIA7EgTgQB+IAcSAOxIE4EAfiQByIA3EgDsQB4kAciANxIA7EgTgQB+JAHCAOxIE4EAfiQByIA3EgDsQB4kAciANxIA7EgTgQB+JAHIgDxIE4EAfiQByIA3EgDsSBOEAciANxIA7EgTgQB+JAHIgDxIE4EAfiQByIA3EgDsSBOBCHKUAciANxIA7EgTgQB+JAHIgDxIE4EAfiQByIA3EgDsSBOEAciANxIA7EgTgQB+JAHIgDxIE4EAfiQByIA3EgDsSBOBAHiANxIA7EgTgILA4AAAAAAAAAAACA/4fz7v5EOCtz9Ee/9dOf3XL5MeGsUUNjlYaxksakXxWS7veFsRmi9zxVyKaTJJ0tLJsdygQdd0mVt46NNPZbkI1LG+OGIFZm4oPFrjibS5JcLuna/IfJQazUR/qLVfo+PhbauGBZPs4vzoQRx2kdcZJ/6JOnTD3i5KuW5JJ40xkhrNWaVKanQib1XP2nMXlRJkmvvXB8TxBxHLcxTtrPaBxYaDzt6XS86cQAVusfnY+edMow7/hjZ0e9pzHuut7S/9SvN0b7d4cQx/hnU+nf7je43HhfJl7zqpd/vdZ3LokahokWd26o8zZmLMumsr8pHxWEEcfN2eRPw44CGh5MMt8IIY4HK4fqPY6jfp6Lsysv2bETDyKOScXUxop3oAdvSBUni2PE3RgncWHhKwYWgojjC+ns9ZVj1+aSL4tjhJ2+urTbePjIXYtBxPFYnDqicuzwzvhpcYyoqb/YnMq2Xxw1hBTHhA3JY9XnHZcmnQeLY+Q0TOlMJ9mFBw0ZCiGOI9PJPdWjdyS5NzeIY+QsyMTrDx82EkIcx+bSt1WP3pIuvE0cI+is7jj759Oj8PYcd9fac2Tf4mVlJH1sfSaVu/P1YcUxYWPyaPXow0nXIeIYUa/9encqHd+0f1BHK4/HXW+sHGvqjJc7WhlpxzySTbLrm0OK44tJ7rrKsavz8VfEMfLmtmdT3b8+MZw4JhdTGydVvNR0pIqvE8fL4IDPdCVJ8r2DQ4kj+lom+f3wz1Z+nWRujcTxsmj6aW8qvenqUOJ45co4fX/j4HLjz9PxcweFEceY+1S25LQnM3HuqbPGhXE9x7RNcXrZSTt3Hg0n/D0Td54UhRDHI8dNG+a4h8dCHNF+85/PxJt/kQ3jSrAzNyZJ/jfz3zZlyrTLF+eTeNO7QlirNalMf98w/WPiSrCSV38pnwrmGtKmPxS6klwujsvXkBb++IYgVuqK3nyhQr5nQTQ2HPFQIem+MJCVuXBZMZukUkmme8UloUzQCa0tFVrfHo0Z7110bTgrc+xV379v0W1XHx/OGo3l31sBAAAAAAAAAAAA/q/+Axgs2pm6Y0JqAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAABDgAAAeACAAAAAAOCrjWAAAjuUlEQVR42u3dfXhU9YHo8QkJL0YUpYqIL1RavU/LWrTorrYKl2qs7faWtrddKoiFAsUVbX0rtV17b1ms9mVvtSs+rq7Ft8pd2VpboGoRFVREpIpIAZGXvMyceYOE4B+7+zz37nPvnJlkkpBM5kQDbZLP5w+dzJkE+J053/zOmXNmYjEAAAAAAAAAAAAAAAAA/hwMG/Y+f0BVN8vGTmhzUpXBhj4fjFHjJl5Q0+KCieNGvceAjD++m4UTatqMG2LQoU8bNf6imk4uGj/qPXSjRjhgIDhm/JSaEqaM7+G8Y3xNiXAUdlImtfvZnzgnd8fHTjL+0BcnGxNrujXx+J51o0Q4JpT48eOsAehzji+TjZ6lI+yGcEA/N2xCTSQThkXvhnBA/3b6lJqIpoyJ3I3eDcfH5nX4cuRV/+uXjy/90VeGdv3oLhdXT//ZsmVLrhljfUMvqJpQ0wMTqiJ2oxfDMfr6Z4I32v+NF+0MCrZc39U/qMvFc7YU7tu7eLh1Du/fBT0JxwVRu1EiHNfe27X/XurnDf3qsj257b1dOM78fdDmwU7f0PXin7Td99tjrXN4/1OOi6J346KqqN0oEY4n9nfth13/uMl3by1s7W3hqH4mf8eurQ35/y8+5Du6Xrww/8WewlTkEesc3r9joh/jOCZyN3olHOuK04S2cNwefrn6slhszI/yMRjb8Vu6XHxuOGnZ+rWq2OT8T5xmncP7NyZqOMZE70avhKM+H42G9uE4Npw1vFA4TvHjcOmCDt/R9eL7cjfqJ4e3TtkUdsUqh14wLlo3xvWgG70Vjq33fu7O9uGYFtbgK4Xbo+pyt/+xw3d0vXhb7sZ9hTtnhw+4wCqHXnBOlG6c05Nu9Eo4tjzwpapYrEM4FuW+qK1u+eKV3BcP5W9dtmTJpSUXnxfGouXwa/XbudvfscahF1R1eGllzqIlS1auXLJk0ZwOL6iUOTB6Q02vh6NwIkaHcFz/1FNPLWv9YmNuyZLwxiW53ZmGyaUW56chH265c2WXr8UA78Gw1gOkUxet3N320uXulYumth4YLXPa6EPP9344Yp3D0d7ocF/kuvDWP4R/2R+XWjwrXDqy5d6ludtPWeHQK47Pb+1XLG1XjZZ2LL2imxC0dSM48uH4bnjM84zw1vfDv+l3Sy3+Srj0oy333pO7vc76ht4xJjfbWNIpG3lLp5Z9QeWh4MiHY+y24l7HqDVBsObEUos/Ef4jrmoXjo1WN/SS8a1nZXe2+7rxZbtx5MPxRHiextktX5x3XlXJxVW7cjcfL9w7fEPu9gZrG3rL6qCkJ8t344iH447wD72l5He1X/xYeHtWeKu68Fe1sqG3fHB3qW68MrJ8N450OBaEf+bykt/UYfFl+fPI7rzs4gWFc1FXWtnQa84vtadyfoRuHOFwXBmeT/ry6FLfc8jiJR3/Qcusa+g987sOx2ejdOPIhuNze3N3vvnRUt9y6OLqx1r/Leuezv3nR1Y19KK7uurGLZG6cUTDMSm8JGV7yTPHu1h8bXg2WLD99pHhzsoMaxp60zOdu/FQtG4cyXCcG15sv+uSUt/Q9eLzps26bGhsbLgP440KoVeNXH9oN9ZXRevGEQzHmeElrnv/W6nHd7v4ltyyVdYz9K5zD3lpZfeoiN04cuEYE+5t1F9R6uHdLh4XnhU2x2qGXnZZx3CcH7UbRywcx4W7U4l5pR7d7eIPrw1fXK62lqG33dS+BvMjd+NIhWPov4Z/2I2H5q7lsvoSiwtGf3d7eD7HJdYx9L52PVgSvRtHKhy/CP+s1/6hTdi24mX1XS/Ombbk0bWFNxRbaA3D4VA8QPr7HnTjCIXjhE6v+oSnhxYvq+96cesjwoMf861fOCxGthwg3TKyB934k4ajeFl9uXA8/pdWLxwm5+8ue6Z5p278ScNRvKy+m3A0bPvdDy60buHwyZ97/jc96sbhC0cknS+r7+i0M6xVONxuC4LbetaNP3E4gD8DTzzUw24IBzCymwOjIy/ryoXHd9D1nsP1D3Xty0YcAAAAAAAAAAAAAAAAgAHuXYAeEg5AOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA7gzyIcB4EyhKOj7BsvrAbKeP71rHC0yWzc+W//Dyjj33dvyAhHq+Ztb/4fzwko7z+3vtUsHC1HN5peqfWMgCgSLzYdFI5COBrX1XtCQBTpNY3C0bKnsn+tcEAkqWf3NQtHIRz7hAMih+OAcLSEY12DJwRE21XJCkdrOF4UDhCOnobjpbgnBESReV44hAOE432EI+EJAZHC8YJwFMPxsnBAJNm1wlEMx3rhgGjhWCccwgHCIRwgHMIBwiEcIBzCAcIhHIBwCAcIh3CAcAgHCIdwgHAIByAcwgHCIRwgHMIBwiEcIBzCAby/cBxszGaiyDY2CwcIR1725TvmzZhe3oy5i5/LHBQOEI5cN351zfSovrEsJRwgHO82r716enTzn206HBt+8+YVy1e83iQc0EfC0XjH9J5YnDwM3cj+yy1zZs65ZVlGOKBvhCM7r0fhmFd3GMLx0Jz8z55zv3BA3whHJn9cdHNdeTvyR0gPQzhebW3XrJeFA/pGOPKbbF2vPrKH7prZOp/5kXCAcERza/HF4JuFA4QjmsXFcPydcIBwRPP4Va3h+KVwgHBEU/fdlm7cVCscIBwRvbGwcIRjk5djQTgiX2VX//D1s761dE+zcIBwuFYFhEM4QDiEAxAO4QDhEA4Qju4ceO4ff/jz1Y3CAcIRWfJnc6+aMXPuTwPhAOGIOt+4veXM0R80CQcIRzTPzGq9VmWVcIBwRPPTK4tvTCgcIBzejwOE4zCF4yfFGcffCwcIRzS/Kx7j+K1wgHBE07i4pRvf3y8cIBwRBbfPunLGlbNuSziPA4Qj+pkcz/z01p/8zpmjIByuVQHhEA4QDuEAhEM4QDiEA4SjWwdTy26Yff2j8YPCAcIR1dZb8j/6O1uEA4QjooZbW84cXVgvHCAc0fjsWBCOHruteFn9rcIBwuH9OEA4DlM47pzZGo47hAP6Rjjyv+53ZMqrDx844zCEY/3XW7oxc51wQJ8IR3bu9J6Yczhejr1/dv5nz1ri5VjoG+EovotONIuCwxCOzCM3z545+6YH08IBfSMczWuv7kE35j/bdBjC8W7z5hXLV7z+3n+0cMCRDce7mWXRyzHvkcMx4XCtCvS5cBxMPbd43owI1ZgxZ9HTwUHhAOEIHUjWRRM0vvuucIBw9A/CAcIhHCAcwgHCIRwgHMIBwiEcwgHCIRwgHMIBwiEcIBzCAcIhHIBwCAcIh3CAcAgHCEcfD8crgScERArHi8JRDMcG4YBI9r0kHG3hSHpCgHD0MByvCgdEC8fLwlEMx8aUJwREsX+9cBTD8ZpwQLRwvCIcbeFIe0KAcPQwHH8QDoik8VXhKIbj9YwnBEQKx0bhEA7ooabXhKMYjjccHIVIspuEoxiOt7b9X88IKO8/t2/eJxwt4di/e/WOf/ecgHL+451ndu1vFo68g03pTU/86/LHgW4tX/6rV1ONB4Wj4MC+5Nsb169/GejG+vUbdyQH5p5Kl+E42LQvHSTi8QagtHgiSGebDgpHsRwHGvdlM0C3svsaDwzMbnQdjlw6mg8AZTQP0GyUDAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAMzHL8H6KGYt7gHeko4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDkA4DAEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHIBwGAJAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOADhMASAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcADCYQgA4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AIQDEA5AOADhAIQDQDgA4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhABAOQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEA0A4AOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QAQDkA4AOEAhAMQDgDhAIQDEA5AOADhAIQDQDgA4QCEAxAOQDgAhAMQDkA4AOEAhANAOADhAIQDEA5AOACEAxAOQDgA4QCEAxAOAOEAhAMQDkA4AOEAEA5AOADhAIQDEA4A4QCEAxAOQDgA4QCEwxAAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcAMIBCAcgHIBwAMIBIByAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAAgHIByAcADCAQgHgHAAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCASAcgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIB4BwAMIBCAcgHIBwAMIBIByAcADCAQgHIBwAwgEIByAcgHAAwgEgHIBwAMIBCAcgHADCAQgHIByAcADCAQgHgHAAwgEIByAcgHAACAcgHIBwAMIBCAeAcADCAQgHIByAcAAIByAcgHAAwgEIByAcAMIB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PSIjM0MzRjNFIiBvZmZzZXQ9IjUxLjM0JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNEI0RTRCIiBvZmZzZXQ9IjY0LjE2JSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI0OS43NTI1MTQ5JSIgY3k9IjQ1LjAyNjAzMjQlIiBmeD0iNDkuNzUyNTE0OSUiIGZ5PSI0NS4wMjYwMzI0JSIgcj0iNDMuMTAzODQ4NCUiIGlkPSJyYWRpYWxHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjYiIG9mZnNldD0iODIuODQlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSI5Ny42NiUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMS44NTAyNjM5NiUiIHkxPSIxMDIuMTg4NzAzJSIgeDI9IjYxLjE3ODYxOTMlIiB5Mj0iMzcuODgzNjM5NCUiIGlkPSJsaW5lYXJHcmFkaWVudC0zIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzU5NUM2NCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjM0M0MTRBIiBvZmZzZXQ9IjY0LjQ1JSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI4Ni4zODkyODU3JSIgeTE9IjkxLjg4NzY3ODYlIiB4Mj0iMTQuMDQzNTcxNCUiIHkyPSI4LjYyMTc4NTcxJSIgaWQ9ImxpbmVhckdyYWRpZW50LTQiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC40MTQxOTcyJSIgY3k9IjU3LjE1MzYzNjUlIiBmeD0iNTAuNDE0MTk3MiUiIGZ5PSI1Ny4xNTM2MzY1JSIgcj0iMzIuMDI1MzgwNyUiIGlkPSJyYWRpYWxHcmFkaWVudC01Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMjAyMDIiIHN0b3Atb3BhY2l0eT0iMC40MTE5IiBvZmZzZXQ9IjUxLjQ5JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDkwOTA5IiBzdG9wLW9wYWNpdHk9IjAuNTYwMyIgb2Zmc2V0PSI3MC4wMyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE0MTQxNCIgc3RvcC1vcGFjaXR5PSIwLjY2NiIgb2Zmc2V0PSI4My4yNSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzI1MjUyNSIgc3RvcC1vcGFjaXR5PSIwLjc1MDkiIG9mZnNldD0iOTMuODclIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMzMzMiIHN0b3Atb3BhY2l0eT0iMC44IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNDcuNzIzNzUwNSUiIGN5PSI5Ni40MTM5OTUlIiBmeD0iNDcuNzIzNzUwNSUiIGZ5PSI5Ni40MTM5OTUlIiByPSI2MS4zNzE1MTclIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjUwLjc3Njc1NzMlIiBjeT0iMjQuMDcyNzU3MyUiIGZ4PSI1MC43NzY3NTczJSIgZnk9IjI0LjA3Mjc1NzMlIiByPSIzNi43NTg0MjclIiBpZD0icmFkaWFsR3JhZGllbnQtNyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ5LjI0MTIwNiUiIHkxPSI2LjgzJSIgeDI9IjQ5LjI0MTIwNiUiIHkyPSI5Ny45NSUiIGlkPSJsaW5lYXJHcmFkaWVudC04Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjEiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaXBhZC1sYW5kc2NhcGUiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyNTEuNzIsNjEuOTIgTDEyNTEuNzIsODE0LjA4IEMxMjUxLjcyLDg0Ny43NiAxMjI0LjQyLDg3NS4wNiAxMTkwLjc0LDg3NS4wNiBMNjEuMjYsODc1LjA2IEMyNy41OCw4NzUuMDYgMC4yOCw4NDcuNzYgMC4yOCw4MTQuMDggTDAuMjgsNjEuOTIgQzAuMjgsMjguMjQgMjcuNTgsMC45NCA2MS4yNiwwLjk0IEwxMTkwLjc0LDAuOTQgQzEyMjQuNDIsMC45NCAxMjUxLjcyLDI4LjI0IDEyNTEuNzIsNjEuOTIgTDEyNTEuNzIsNjEuOTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyNTEuNzIsNjEuOTIgTDEyNTEuNzIsODE0LjA4IEMxMjUxLjcyLDg0Ny43NiAxMjI0LjQyLDg3NS4wNiAxMTkwLjc0LDg3NS4wNiBMNjEuMjYsODc1LjA2IEMyNy41OCw4NzUuMDYgMC4yOCw4NDcuNzYgMC4yOCw4MTQuMDggTDAuMjgsNjEuOTIgQzAuMjgsMjguMjQgMjcuNTgsMC45NCA2MS4yNiwwLjk0IEwxMTkwLjc0LDAuOTQgQzEyMjQuNDIsMC45NCAxMjUxLjcyLDI4LjI0IDEyNTEuNzIsNjEuOTIgTDEyNTEuNzIsNjEuOTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyNDUuMzksODE0LjA4IEMxMjQ1LjM5LDg0NC4yMiAxMjIwLjg3LDg2OC43MyAxMTkwLjc0LDg2OC43MyBMNjEuMjYsODY4LjczIEMzMS4xMiw4NjguNzMgNi42MSw4NDQuMjEgNi42MSw4MTQuMDggTDYuNjEsNjEuOTIgQzYuNjEsMzEuNzggMzEuMTMsNy4yNyA2MS4yNiw3LjI3IEwxMTkwLjc0LDcuMjcgQzEyMjAuODgsNy4yNyAxMjQ1LjM5LDMxLjc5IDEyNDUuMzksNjEuOTIgTDEyNDUuMzksODE0LjA4IEwxMjQ1LjM5LDgxNC4wOCBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMykiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTI0Mi43NCw4MTQuMDggQzEyNDIuNzQsODQyLjc1IDEyMTkuNDEsODY2LjA4IDExOTAuNzQsODY2LjA4IEw2MS4yNiw4NjYuMDggQzMyLjU5LDg2Ni4wOCA5LjI2LDg0Mi43NSA5LjI2LDgxNC4wOCBMOS4yNiw2MS45MiBDOS4yNiwzMy4yNSAzMi41OSw5LjkyIDYxLjI2LDkuOTIgTDExOTAuNzQsOS45MiBDMTIxOS40MSw5LjkyIDEyNDIuNzQsMzMuMjUgMTI0Mi43NCw2MS45MiBMMTI0Mi43NCw4MTQuMDggTDEyNDIuNzQsODE0LjA4IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzIzMjMyMyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMTk0LjEyLDQwOS4xIEMxMTc4LjY2LDQwOS4xIDExNjYuMTIsNDIxLjY0IDExNjYuMTIsNDM3LjEgQzExNjYuMTIsNDUyLjU2IDExNzguNjYsNDY1LjEgMTE5NC4xMiw0NjUuMSBDMTIwOS41OCw0NjUuMSAxMjIyLjEyLDQ1Mi41NiAxMjIyLjEyLDQzNy4xIEMxMjIyLjEyLDQyMS42NCAxMjA5LjU4LDQwOS4xIDExOTQuMTIsNDA5LjEgTDExOTQuMTIsNDA5LjEgWiBNMTE5NC4xMiw0NjIuNTQgQzExODAuMDcsNDYyLjU0IDExNjguNjgsNDUxLjE1IDExNjguNjgsNDM3LjEgQzExNjguNjgsNDIzLjA1IDExODAuMDcsNDExLjY2IDExOTQuMTIsNDExLjY2IEMxMjA4LjE3LDQxMS42NiAxMjE5LjU2LDQyMy4wNSAxMjE5LjU2LDQzNy4xIEMxMjE5LjU2LDQ1MS4xNSAxMjA4LjE3LDQ2Mi41NCAxMTk0LjEyLDQ2Mi41NCBMMTE5NC4xMiw0NjIuNTQgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTQpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjEuMDAwMDAwLCA0MjkuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiM1RDVENUYiIGN4PSI4LjIxIiBjeT0iOC4yOSIgcj0iNy44OCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNSkiIGN4PSI4LjIxIiBjeT0iOC4yOSIgcj0iNy44OCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMxQjFBMUYiIGN4PSI4LjIxIiBjeT0iOC4yOSIgcj0iNC40MiI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMzNjI4NEMiIGN4PSI4LjIxIiBjeT0iOC4yOSIgcj0iMy4yMyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNikiIGN4PSI4LjIxIiBjeT0iOC4yOSIgcj0iMy4yMyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuMDAwMDAwLCA2LjAwMDAwMCkiIGlkPSJPdmFsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0iIzE0MTQxNCIgb3BhY2l0eT0iMC41IiBjeD0iMi4yMSIgY3k9IjIuMjkiIHI9IjEuNzgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTcpIiBjeD0iMi4yMSIgY3k9IjIuMjkiIHI9IjEuNzgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04LjIxLDYuOTYgQzcuODIsNi45NiA3LjQ3LDcuMTQgNy4yMyw3LjQxIEw3LjY1LDcuODMgQzcuNzksNy42NiA3Ljk5LDcuNTUgOC4yMiw3LjU1IEM4LjQ2LDcuNTUgOC42Niw3LjY3IDguOCw3Ljg0IEw5LjIyLDcuNDIgQzguOTYsNy4xNSA4LjYxLDYuOTYgOC4yMSw2Ljk2IEw4LjIxLDYuOTYgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTgpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBmaWxsPSIjMDAwMDAwIiB4PSIxMTEuNjUiIHk9IjU1LjU0IiB3aWR0aD0iMTAyNCIgaGVpZ2h0PSI3NjgiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHdpZHRoPSI4NzVweCIgaGVpZ2h0PSIxMjUzcHgiIHZpZXdCb3g9IjAgMCA4NzUgMTI1MyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5pUGFkPC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNTYuODUyMjQlIiB5MT0iNDYuNzYxNjUwNiUiIHgyPSIzOC4xMjQxMzYzJSIgeTI9IjU1LjYxMjg0NiUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNBM0UzQSIgb2Zmc2V0PSI4Ljg2JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUzMzJFIiBvZmZzZXQ9IjM0LjMxJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjQzBDMUMyIiBvZmZzZXQ9IjM2JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjM0MzRjNFIiBvZmZzZXQ9IjUxLjM0JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNEI0RTRCIiBvZmZzZXQ9IjY0LjE2JSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC4xNzIxMDMxJSIgY3k9IjQ3LjEyMjAzMjclIiBmeD0iNTAuMTcyMTAzMSUiIGZ5PSI0Ny4xMjIwMzI3JSIgcj0iNjguMDMxNjIwNCUiIGlkPSJyYWRpYWxHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjYiIG9mZnNldD0iODIuODQlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSI5Ny42NiUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iLTIuMTg4NTg2ODIlIiB5MT0iMS44NTAzMzc4MyUiIHgyPSI2Mi4xMTY0NjUxJSIgeTI9IjYxLjE3ODIyMjMlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM1OTVDNjQiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNDNDE0QSIgb2Zmc2V0PSI2NC40NSUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODYuMzk1JSIgeTE9IjkxLjg4NDI4NTclIiB4Mj0iMTQuMDQ5NDY0MyUiIHkyPSI4LjYxODU3MTQzJSIgaWQ9ImxpbmVhckdyYWRpZW50LTQiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSItMjIuODk5MTk1NSUiIHkxPSIyNy4yNjgyODkzJSIgeDI9IjM5LjY0MDYwMyUiIHkyPSI0Ni4wMDg5ODE0JSIgaWQ9ImxpbmVhckdyYWRpZW50LTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTAuNDIwMzg4NiUiIGN5PSI1Ny4wOTc0OTE0JSIgZng9IjUwLjQyMDM4ODYlIiBmeT0iNTcuMDk3NDkxNCUiIHI9IjMyLjAyNTM4MDclIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDIwMjAyIiBzdG9wLW9wYWNpdHk9IjAuNDExOSIgb2Zmc2V0PSI1MS40OSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzA5MDkwOSIgc3RvcC1vcGFjaXR5PSIwLjU2MDMiIG9mZnNldD0iNzAuMDMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNDE0MTQiIHN0b3Atb3BhY2l0eT0iMC42NjYiIG9mZnNldD0iODMuMjUlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTI1MjUiIHN0b3Atb3BhY2l0eT0iMC43NTA5IiBvZmZzZXQ9IjkzLjg3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ3LjczMTYwNSUiIGN5PSI5Ni4yNzcwMjE3JSIgZng9IjQ3LjczMTYwNSUiIGZ5PSI5Ni4yNzcwMjE3JSIgcj0iNjEuMzcxNTE3JSIgaWQ9InJhZGlhbEdyYWRpZW50LTciPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC43OTEwMTAxJSIgY3k9IjIzLjgzMjk3MyUiIGZ4PSI1MC43OTEwMTAxJSIgZnk9IjIzLjgzMjk3MyUiIHI9IjM2Ljc1ODQyNyUiIGlkPSJyYWRpYWxHcmFkaWVudC04Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNDkuMjgxNDA3JSIgeTE9IjYuOTYlIiB4Mj0iNDkuMjgxNDA3JSIgeTI9Ijk4LjA3JSIgaWQ9ImxpbmVhckdyYWRpZW50LTkiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuNiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJpcGFkLXBvcnRyYWl0Ij4KICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MTMuMzIsMTI1Mi4wOSBMNjEuMTYsMTI1Mi4wOSBDMjcuNDgsMTI1Mi4wOSAwLjE4LDEyMjQuNzkgMC4xOCwxMTkxLjExIEwwLjE4LDYxLjYzIEMwLjE4LDI3Ljk1IDI3LjQ4LDAuNjUgNjEuMTYsMC42NSBMODEzLjMyLDAuNjUgQzg0NywwLjY1IDg3NC4zLDI3Ljk1IDg3NC4zLDYxLjYzIEw4NzQuMywxMTkxLjExIEM4NzQuMywxMjI0Ljc5IDg0NywxMjUyLjA5IDgxMy4zMiwxMjUyLjA5IEw4MTMuMzIsMTI1Mi4wOSBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MS4xNiwxMjUyLjA5IEMyNy40OCwxMjUyLjA5IDAuMTgsMTIyNC43OSAwLjE4LDExOTEuMTEgTDAuMTgsNjEuNjMgQzAuMTgsMjcuOTUgMjcuNDgsMC42NSA2MS4xNiwwLjY1IEw4MTMuMzIsMC42NSBDODQ3LDAuNjUgODc0LjMsMjcuOTUgODc0LjMsNjEuNjMgTDg3NC4zLDExOTEuMTEgQzg3NC4zLDEyMjQuNzkgODQ3LDEyNTIuMDkgODEzLjMyLDEyNTIuMDkgTDYxLjE2LDEyNTIuMDkgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjEuMTYsMTI0NS43NyBDMzEuMDIsMTI0NS43NyA2LjUxLDEyMjEuMjUgNi41MSwxMTkxLjEyIEw2LjUxLDYxLjYzIEM2LjUxLDMxLjQ5IDMxLjAzLDYuOTggNjEuMTYsNi45OCBMODEzLjMyLDYuOTggQzg0My40Niw2Ljk4IDg2Ny45NywzMS41IDg2Ny45Nyw2MS42MyBMODY3Ljk3LDExOTEuMTEgQzg2Ny45NywxMjIxLjI1IDg0My40NSwxMjQ1Ljc2IDgxMy4zMiwxMjQ1Ljc2IEw2MS4xNiwxMjQ1Ljc2IEw2MS4xNiwxMjQ1Ljc3IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0zKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTYxLjE2LDEyNDMuMTEgQzMyLjQ5LDEyNDMuMTEgOS4xNiwxMjE5Ljc4IDkuMTYsMTE5MS4xMSBMOS4xNiw2MS42MyBDOS4xNiwzMi45NiAzMi40OSw5LjYzIDYxLjE2LDkuNjMgTDgxMy4zMiw5LjYzIEM4NDEuOTksOS42MyA4NjUuMzIsMzIuOTYgODY1LjMyLDYxLjYzIEw4NjUuMzIsMTE5MS4xMSBDODY1LjMyLDEyMTkuNzggODQxLjk5LDEyNDMuMTEgODEzLjMyLDEyNDMuMTEgTDYxLjE2LDEyNDMuMTEgTDYxLjE2LDEyNDMuMTEgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMjMyMzIzIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNDM4LjE0LDExNjYuNDkgQzQyMi42OCwxMTY2LjQ5IDQxMC4xNCwxMTc5LjAzIDQxMC4xNCwxMTk0LjQ5IEM0MTAuMTQsMTIwOS45NSA0MjIuNjgsMTIyMi40OSA0MzguMTQsMTIyMi40OSBDNDUzLjYsMTIyMi40OSA0NjYuMTQsMTIwOS45NSA0NjYuMTQsMTE5NC40OSBDNDY2LjE0LDExNzkuMDMgNDUzLjYsMTE2Ni40OSA0MzguMTQsMTE2Ni40OSBMNDM4LjE0LDExNjYuNDkgWiBNNDM4LjE0LDEyMTkuOTMgQzQyNC4wOSwxMjE5LjkzIDQxMi43LDEyMDguNTQgNDEyLjcsMTE5NC40OSBDNDEyLjcsMTE4MC40NCA0MjQuMDksMTE2OS4wNSA0MzguMTQsMTE2OS4wNSBDNDUyLjE5LDExNjkuMDUgNDYzLjU4LDExODAuNDQgNDYzLjU4LDExOTQuNDkgQzQ2My41OCwxMjA4LjU0IDQ1Mi4xOSwxMjE5LjkzIDQzOC4xNCwxMjE5LjkzIEw0MzguMTQsMTIxOS45MyBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtNCkiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01OS4yNCw4LjE5IEMzMS42Miw4LjE5IDkuMTUsMzAuNjYgOS4xNSw1OC4yOCBMOS4xNSwxMTkwLjY1IEM5LjE1LDEyMTguMjcgMzEuNjIsMTI0MC43NCA1OS4yNCwxMjQwLjc0IEwxMDUuNzcsMTI0MC43NCBMNjIwLjczLDguMTkgTDU5LjI0LDguMTkgTDU5LjI0LDguMTkgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTUpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MzAuMDAwMDAwLCA2MS4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjNUQ1RDVGIiBjeD0iNy45NSIgY3k9IjguNTgiIHI9IjcuODgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNikiIGN4PSI3Ljk1IiBjeT0iOC41OCIgcj0iNy44OCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzFCMUExRiIgY3g9IjcuOTUiIGN5PSI4LjU4IiByPSI0LjQyIj48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjMzYyODRDIiBjeD0iNy45NSIgY3k9IjguNTgiIHI9IjMuMjMiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNykiIGN4PSI3Ljk1IiBjeT0iOC41OCIgcj0iMy4yMyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuMDAwMDAwKSIgaWQ9Ik92YWwiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGZpbGw9IiMxNDE0MTQiIG9wYWNpdHk9IjAuNSIgY3g9IjEuOTUiIGN5PSIyLjU4IiByPSIxLjc4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTgpIiBjeD0iMS45NSIgY3k9IjIuNTgiIHI9IjEuNzgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy45NSw3LjI0IEM3LjU2LDcuMjQgNy4yMSw3LjQyIDYuOTcsNy42OSBMNy4zOSw4LjExIEM3LjUzLDcuOTQgNy43Myw3LjgzIDcuOTYsNy44MyBDOC4yLDcuODMgOC40LDcuOTUgOC41NCw4LjEyIEw4Ljk2LDcuNyBDOC43LDcuNDMgOC4zNSw3LjI0IDcuOTUsNy4yNCBMNy45NSw3LjI0IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC05KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzAwMDAwMCIgeD0iNTIiIHk9IjExNCIgd2lkdGg9Ijc2OCIgaGVpZ2h0PSIxMDI0Ij48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9Ijc5NnB4IiBoZWlnaHQ9IjM3NHB4IiB2aWV3Qm94PSIwIDAgNzk2IDM3NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5pUGhvbmUgNTwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ4LjA4MjEzMDMlIiB5MT0iNDEuMDM2NTQ0NCUiIHgyPSI1My40MDE0MjA3JSIgeTI9IjY1Ljg5NTQ1OTclIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzQTNFM0EiIG9mZnNldD0iOC44NiUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMzMyRSIgb2Zmc2V0PSIzNC4zMSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0MwQzFDMiIgb2Zmc2V0PSIzNiUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNDM0YzRSIgb2Zmc2V0PSI1MS4zNCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRCNEU0QiIgb2Zmc2V0PSI2NC4xNiUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iOC4zMzEyNzc2NCUiIHkxPSIxMTcuOTk5MzYzJSIgeDI9IjU5LjY3NDIyNCUiIHkyPSIzNC4yMTM0MzQ5JSIgaWQ9ImxpbmVhckdyYWRpZW50LTIiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNzg3QTgxIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM1MDU1NUQiIG9mZnNldD0iNjMuNTMlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ijg2LjM4NjQ2NSUiIHkxPSI5MS44Nzk3NzcxJSIgeDI9IjE0LjA0MzMxMjElIiB5Mj0iOC42MTY3MTk3NSUiIGlkPSJsaW5lYXJHcmFkaWVudC0zIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMTQuNyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjQwLjczJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMDA1MDkxMDgiIG9mZnNldD0iNzQuNDUlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4yIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTAuNDIwODQ1JSIgY3k9IjU3LjA5NzkyMzUlIiBmeD0iNTAuNDIwODQ1JSIgZnk9IjU3LjA5NzkyMzUlIiByPSIzMi4wMjY4NzUlIiBpZD0icmFkaWFsR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDIwMjAyIiBzdG9wLW9wYWNpdHk9IjAuNDExOSIgb2Zmc2V0PSI1MS40OSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzA5MDkwOSIgc3RvcC1vcGFjaXR5PSIwLjU2MDMiIG9mZnNldD0iNzAuMDMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNDE0MTQiIHN0b3Atb3BhY2l0eT0iMC42NjYiIG9mZnNldD0iODMuMjUlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTI1MjUiIHN0b3Atb3BhY2l0eT0iMC43NTA5IiBvZmZzZXQ9IjkzLjg3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ3LjczNzQ1OTglIiBjeT0iOTYuMjY3NzAzNyUiIGZ4PSI0Ny43Mzc0NTk4JSIgZnk9Ijk2LjI2NzcwMzclIiByPSI2MS4zNTk3NTYxJSIgaWQ9InJhZGlhbEdyYWRpZW50LTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC43OTkyNjU2JSIgY3k9IjIzLjcxODY4NjclIiBmeD0iNTAuNzk5MjY1NiUiIGZ5PSIyMy43MTg2ODY3JSIgcj0iMzYuOTA1NTU1NiUiIGlkPSJyYWRpYWxHcmFkaWVudC02Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNTAuMzAxNTA3NSUiIHkxPSI3JSIgeDI9IjUwLjMwMTUwNzUlIiB5Mj0iOTkuNTMlIiBpZD0ibGluZWFyR3JhZGllbnQtNyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC42IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTgiIGQ9Ik04Ljg0LDQuOTUgTDguODQsNTkuNTcgQzguODQsNjEuOTQgNi45Miw2My44NiA0LjU1LDYzLjg2IEw0LjU1LDYzLjg2IEMyLjE4LDYzLjg2IDAuMjYsNjEuOTQgMC4yNiw1OS41NyBMMC4yNiw0Ljk1IEMwLjI2LDIuNTggMi4xOCwwLjY2IDQuNTUsMC42NiBMNC41NSwwLjY2IEM2LjkyLDAuNjcgOC44NCwyLjU5IDguODQsNC45NSBMOC44NCw0Ljk1IFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwMC41OTA2NzElIiB5MT0iNTAuMzk0NTU5OSUiIHgyPSIwLjY2NDI3OTA5MSUiIHkyPSI1MC4zOTQ1NTk5JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEwIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNjE2MTYxIiBvZmZzZXQ9IjI0LjQ4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjODU4NTg1IiBvZmZzZXQ9IjgxLjM3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUyRTMxIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTExIiBkPSJNOC44NCw0Ljk1IEw4Ljg0LDU5LjU3IEM4Ljg0LDYxLjk0IDYuOTIsNjMuODYgNC41NSw2My44NiBMNC41NSw2My44NiBDMi4xOCw2My44NiAwLjI2LDYxLjk0IDAuMjYsNTkuNTcgTDAuMjYsNC45NSBDMC4yNiwyLjU4IDIuMTgsMC42NiA0LjU1LDAuNjYgTDQuNTUsMC42NiBDNi45MiwwLjY3IDguODQsMi41OSA4Ljg0LDQuOTUgTDguODQsNC45NSBaIj48L3BhdGg+CiAgICAgICAgPHBhdGggaWQ9InBhdGgtMTMiIGQ9Ik04Ljg0LDQuOTUgTDguODQsNTkuNTcgQzguODQsNjEuOTQgNi45Miw2My44NiA0LjU1LDYzLjg2IEw0LjU1LDYzLjg2IEMyLjE4LDYzLjg2IDAuMjYsNjEuOTQgMC4yNiw1OS41NyBMMC4yNiw0Ljk1IEMwLjI2LDIuNTggMi4xOCwwLjY2IDQuNTUsMC42NiBMNC41NSwwLjY2IEM2LjkyLDAuNjcgOC44NCwyLjU5IDguODQsNC45NSBMOC44NCw0Ljk1IFoiPjwvcGF0aD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJpcGhvbmU1LWxhbmRzY2FwZSI+CiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQxLjY5LDM2Ny43NCBMMTQxLjY5LDM3MS40NyBDMTQxLjY5LDM3Mi40OSAxNDAuODYsMzczLjMxIDEzOS44NSwzNzMuMzEgTDEwOS4yOSwzNzMuMzEgQzEwOC4yNywzNzMuMzEgMTA3LjQ1LDM3Mi40OCAxMDcuNDUsMzcxLjQ3IEwxMDcuNDUsMzY3Ljc0IEwxNDEuNjksMzY3Ljc0IEwxNDEuNjksMzY3Ljc0IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuMzMsMTI5LjQ3IEwyLjYsMTI5LjQ3IEMxLjU4LDEyOS40NyAwLjc2LDEyOC42NCAwLjc2LDEyNy42MyBMMC43Niw3Mi4wNSBDMC43Niw3MS4wMyAxLjU5LDcwLjIxIDIuNiw3MC4yMSBMNi4zMyw3MC4yMSBMNi4zMywxMjkuNDcgTDYuMzMsMTI5LjQ3IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE4My4wMiwzNzMuMTIgQzE4MS45OSwzNzMuMTIgMTgxLjE2LDM3Mi4yOSAxODEuMTYsMzcxLjI2IEwxODEuMTYsMzY3LjU0IEwyMDkuMjYsMzY3LjU0IEwyMDkuMjYsMzcxLjI2IEMyMDkuMjYsMzcyLjI5IDIwOC40MywzNzMuMTIgMjA3LjQsMzczLjEyIEwxODMuMDIsMzczLjEyIEwxODMuMDIsMzczLjEyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0OS4zNSwzNzMuMTIgQzI0OC4zMiwzNzMuMTIgMjQ3LjQ5LDM3Mi4yOSAyNDcuNDksMzcxLjI2IEwyNDcuNDksMzY3LjU0IEwyNzUuNTksMzY3LjU0IEwyNzUuNTksMzcxLjI2IEMyNzUuNTksMzcyLjI5IDI3NC43NiwzNzMuMTIgMjczLjczLDM3My4xMiBMMjQ5LjM1LDM3My4xMiBMMjQ5LjM1LDM3My4xMiBaIiBpZD0iU2hhcGUiIGZpbGw9IiM4MDgwODYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03OTUuMjQsMzEzLjI2IEM3OTUuMjQsMzQ0LjQ1IDc2OS44NiwzNjkuODMgNzM4LjY3LDM2OS44MyBMNjIuMDksMzY5LjgzIEMzMC45LDM2OS44MyA1LjUyLDM0NC40NSA1LjUyLDMxMy4yNiBMNS41Miw1Ny4yNiBDNS41MiwyNi4wNyAzMC45LDAuNjkgNjIuMDksMC42OSBMNzM4LjY3LDAuNjkgQzc2OS44NiwwLjY5IDc5NS4yNCwyNi4wNyA3OTUuMjQsNTcuMjYgTDc5NS4yNCwzMTMuMjYgTDc5NS4yNCwzMTMuMjYgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNzkxLjE3LDMxMy4yNiBDNzkxLjE3LDM0Mi4yMSA3NjcuNjIsMzY1Ljc2IDczOC42NywzNjUuNzYgTDYyLjA5LDM2NS43NiBDMzMuMTQsMzY1Ljc2IDkuNTksMzQyLjIxIDkuNTksMzEzLjI2IEw5LjU5LDU3LjI2IEM5LjU5LDI4LjMxIDMzLjE0LDQuNzYgNjIuMDksNC43NiBMNzM4LjY3LDQuNzYgQzc2Ny42Miw0Ljc2IDc5MS4xNywyOC4zMSA3OTEuMTcsNTcuMjYgTDc5MS4xNywzMTMuMjYgTDc5MS4xNywzMTMuMjYgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIGZpbGw9IiMyRTJFMkUiIHg9IjcyLjU2IiB5PSIzNjMuMTUiIHdpZHRoPSI2IiBoZWlnaHQ9IjYuNjkiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzFGMUYxRiIgeD0iNzIuNTYiIHk9IjAuNjkiIHdpZHRoPSI2IiBoZWlnaHQ9IjYuNzQiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzJFMkUyRSIgeD0iNzIxLjc2IiB5PSIzNjMuMTUiIHdpZHRoPSI2IiBoZWlnaHQ9IjYuNjkiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzFGMUYxRiIgeD0iNzIxLjc2IiB5PSIwLjY5IiB3aWR0aD0iNiIgaGVpZ2h0PSI2Ljc0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNzg4LjYyLDMxMy4yNiBDNzg4LjYyLDM0MC44IDc2Ni4yMSwzNjMuMjEgNzM4LjY3LDM2My4yMSBMNjIuMDksMzYzLjIxIEMzNC41NSwzNjMuMjEgMTIuMTQsMzQwLjggMTIuMTQsMzEzLjI2IEwxMi4xNCw1Ny4yNiBDMTIuMTQsMjkuNzIgMzQuNTUsNy4zMSA2Mi4wOSw3LjMxIEw3MzguNjcsNy4zMSBDNzY2LjIxLDcuMzEgNzg4LjYyLDI5LjcyIDc4OC42Miw1Ny4yNiBMNzg4LjYyLDMxMy4yNiBMNzg4LjYyLDMxMy4yNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyMzIzMjMiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03MzkuMSwxNTMuODcgQzcyMS43NiwxNTMuODcgNzA3LjcsMTY3LjkzIDcwNy43LDE4NS4yNyBDNzA3LjcsMjAyLjYxIDcyMS43NiwyMTYuNjcgNzM5LjEsMjE2LjY3IEM3NTYuNDQsMjE2LjY3IDc3MC41LDIwMi42MSA3NzAuNSwxODUuMjcgQzc3MC41LDE2Ny45MyA3NTYuNDQsMTUzLjg3IDczOS4xLDE1My44NyBMNzM5LjEsMTUzLjg3IFogTTczOS4xLDIxMy43OSBDNzIzLjM1LDIxMy43OSA3MTAuNTcsMjAxLjAyIDcxMC41NywxODUuMjYgQzcxMC41NywxNjkuNSA3MjMuMzQsMTU2LjczIDczOS4xLDE1Ni43MyBDNzU0Ljg2LDE1Ni43MyA3NjcuNjMsMTY5LjUgNzY3LjYzLDE4NS4yNiBDNzY3LjYzLDIwMS4wMiA3NTQuODUsMjEzLjc5IDczOS4xLDIxMy43OSBMNzM5LjEsMjEzLjc5IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0zKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzcuMDAwMDAwLCAxNzcuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzVENUQ1RiIgY3g9IjguMDQiIGN5PSI4LjI3IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTQpIiBjeD0iOC4wNCIgY3k9IjguMjciIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMxQjFBMUYiIGN4PSI4LjA0IiBjeT0iOC4yNyIgcj0iNC40OCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzM2Mjg0QyIgY3g9IjguMDQiIGN5PSI4LjI3IiByPSIzLjI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTUpIiBjeD0iOC4wNCIgY3k9IjguMjciIHI9IjMuMjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuMDAwMDAwLCA2LjAwMDAwMCkiIGlkPSJPdmFsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBmaWxsPSIjMTQxNDE0IiBvcGFjaXR5PSIwLjUiIGN4PSIyLjA0IiBjeT0iMi4yNyIgcj0iMS44Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTYpIiBjeD0iMi4wNCIgY3k9IjIuMjciIHI9IjEuOCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04LjA0LDYuOTEgQzcuNjQsNi45MSA3LjI5LDcuMDkgNy4wNCw3LjM3IEw3LjQ2LDcuNzkgQzcuNiw3LjYyIDcuOCw3LjUxIDguMDMsNy41MSBDOC4yNyw3LjUxIDguNDcsNy42MyA4LjYxLDcuODEgTDkuMDMsNy4zOSBDOC44LDcuMSA4LjQ0LDYuOTEgOC4wNCw2LjkxIEw4LjA0LDYuOTEgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTcpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2OS4wMDAwMDAsIDE1My4wMDAwMDApIiBpZD0iQ2xpcHBlZCI+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTkiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtOCI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IlNWR0lEXzhfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04Ljg0LDIuOTUgTDguODQsNjEuNTcgQzguODQsNjMuOTQgNi45Miw2NS44NiA0LjU1LDY1Ljg2IEw0LjU1LDY1Ljg2IEMyLjE4LDY1Ljg2IDAuMjYsNjMuOTQgMC4yNiw2MS41NyBMMC4yNiwyLjk1IEMwLjI2LDAuNTggMi4xOCwtMS4zNCA0LjU1LC0xLjM0IEw0LjU1LC0xLjM0IEM2LjkyLC0xLjM0IDguODQsMC41OCA4Ljg0LDIuOTUgTDguODQsMi45NSBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMTApIiBvcGFjaXR5PSIwLjgiIG1hc2s9InVybCgjbWFzay05KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF84XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4xNSw2NC40NSBMMC4xNSw2NS45MiBMMS42Miw2NS45MiBMMS42Miw2NC40NSBMMC4xNSw2NC40NSBMMC4xNSw2NC40NSBaIE0wLjE1LDYxLjUyIEwwLjE1LDYyLjk5IEwxLjYyLDYyLjk5IEwxLjYyLDYxLjUyIEwwLjE1LDYxLjUyIEwwLjE1LDYxLjUyIFogTTAuMTUsNTguNTggTDAuMTUsNjAuMDUgTDEuNjIsNjAuMDUgTDEuNjIsNTguNTggTDAuMTUsNTguNTggTDAuMTUsNTguNTggWiBNMC4xNSw1NS42NSBMMC4xNSw1Ny4xMiBMMS42Miw1Ny4xMiBMMS42Miw1NS42NSBMMC4xNSw1NS42NSBMMC4xNSw1NS42NSBaIE0wLjE1LDUyLjcxIEwwLjE1LDU0LjE4IEwxLjYyLDU0LjE4IEwxLjYyLDUyLjcxIEwwLjE1LDUyLjcxIEwwLjE1LDUyLjcxIFogTTAuMTUsNDkuNzggTDAuMTUsNTEuMjUgTDEuNjIsNTEuMjUgTDEuNjIsNDkuNzggTDAuMTUsNDkuNzggTDAuMTUsNDkuNzggWiBNMC4xNSw0Ni44NCBMMC4xNSw0OC4zMSBMMS42Miw0OC4zMSBMMS42Miw0Ni44NCBMMC4xNSw0Ni44NCBMMC4xNSw0Ni44NCBaIE0wLjE1LDQzLjkxIEwwLjE1LDQ1LjM4IEwxLjYyLDQ1LjM4IEwxLjYyLDQzLjkxIEwwLjE1LDQzLjkxIEwwLjE1LDQzLjkxIFogTTAuMTUsNDAuOTcgTDAuMTUsNDIuNDQgTDEuNjIsNDIuNDQgTDEuNjIsNDAuOTcgTDAuMTUsNDAuOTcgTDAuMTUsNDAuOTcgWiBNMC4xNSwzOC4wNCBMMC4xNSwzOS41MSBMMS42MiwzOS41MSBMMS42MiwzOC4wNCBMMC4xNSwzOC4wNCBMMC4xNSwzOC4wNCBaIE0wLjE1LDM1LjEgTDAuMTUsMzYuNTcgTDEuNjIsMzYuNTcgTDEuNjIsMzUuMSBMMC4xNSwzNS4xIEwwLjE1LDM1LjEgWiBNMC4xNSwzMi4xNyBMMC4xNSwzMy42NCBMMS42MiwzMy42NCBMMS42MiwzMi4xNyBMMC4xNSwzMi4xNyBMMC4xNSwzMi4xNyBaIE0wLjE1LDI5LjIzIEwwLjE1LDMwLjcgTDEuNjIsMzAuNyBMMS42MiwyOS4yMyBMMC4xNSwyOS4yMyBMMC4xNSwyOS4yMyBaIE0wLjE1LDI2LjMgTDAuMTUsMjcuNzcgTDEuNjIsMjcuNzcgTDEuNjIsMjYuMyBMMC4xNSwyNi4zIEwwLjE1LDI2LjMgWiBNMC4xNSwyMy4zNiBMMC4xNSwyNC44MyBMMS42MiwyNC44MyBMMS42MiwyMy4zNiBMMC4xNSwyMy4zNiBMMC4xNSwyMy4zNiBaIE0wLjE1LDIwLjQzIEwwLjE1LDIxLjkgTDEuNjIsMjEuOSBMMS42MiwyMC40MyBMMC4xNSwyMC40MyBMMC4xNSwyMC40MyBaIE0wLjE1LDE3LjQ5IEwwLjE1LDE4Ljk2IEwxLjYyLDE4Ljk2IEwxLjYyLDE3LjQ5IEwwLjE1LDE3LjQ5IEwwLjE1LDE3LjQ5IFogTTAuMTUsMTQuNTYgTDAuMTUsMTYuMDMgTDEuNjIsMTYuMDMgTDEuNjIsMTQuNTYgTDAuMTUsMTQuNTYgTDAuMTUsMTQuNTYgWiBNMC4xNSwxMS42MiBMMC4xNSwxMy4wOSBMMS42MiwxMy4wOSBMMS42MiwxMS42MiBMMC4xNSwxMS42MiBMMC4xNSwxMS42MiBaIE0wLjE1LDguNjkgTDAuMTUsMTAuMTYgTDEuNjIsMTAuMTYgTDEuNjIsOC42OSBMMC4xNSw4LjY5IEwwLjE1LDguNjkgWiBNMC4xNSw1Ljc1IEwwLjE1LDcuMjIgTDEuNjIsNy4yMiBMMS42Miw1Ljc1IEwwLjE1LDUuNzUgTDAuMTUsNS43NSBaIE0wLjE1LDIuODIgTDAuMTUsNC4yOSBMMS42Miw0LjI5IEwxLjYyLDIuODIgTDAuMTUsMi44MiBMMC4xNSwyLjgyIFogTTAuMTUsLTAuMTIgTDAuMTUsMS4zNSBMMS42MiwxLjM1IEwxLjYyLC0wLjEyIEwwLjE1LC0wLjEyIEwwLjE1LC0wLjEyIFogTTEuNjIsNjIuOTggTDEuNjIsNjQuNDUgTDMuMDksNjQuNDUgTDMuMDksNjIuOTggTDEuNjIsNjIuOTggTDEuNjIsNjIuOTggWiBNMS42Miw2MC4wNSBMMS42Miw2MS41MiBMMy4wOSw2MS41MiBMMy4wOSw2MC4wNSBMMS42Miw2MC4wNSBMMS42Miw2MC4wNSBaIE0xLjYyLDU3LjExIEwxLjYyLDU4LjU4IEwzLjA5LDU4LjU4IEwzLjA5LDU3LjExIEwxLjYyLDU3LjExIEwxLjYyLDU3LjExIFogTTEuNjIsNTQuMTggTDEuNjIsNTUuNjUgTDMuMDksNTUuNjUgTDMuMDksNTQuMTggTDEuNjIsNTQuMTggTDEuNjIsNTQuMTggWiBNMS42Miw1MS4yNCBMMS42Miw1Mi43MSBMMy4wOSw1Mi43MSBMMy4wOSw1MS4yNCBMMS42Miw1MS4yNCBMMS42Miw1MS4yNCBaIE0xLjYyLDQ4LjMxIEwxLjYyLDQ5Ljc4IEwzLjA5LDQ5Ljc4IEwzLjA5LDQ4LjMxIEwxLjYyLDQ4LjMxIEwxLjYyLDQ4LjMxIFogTTEuNjIsNDUuMzcgTDEuNjIsNDYuODQgTDMuMDksNDYuODQgTDMuMDksNDUuMzcgTDEuNjIsNDUuMzcgTDEuNjIsNDUuMzcgWiBNMS42Miw0Mi40NCBMMS42Miw0My45MSBMMy4wOSw0My45MSBMMy4wOSw0Mi40NCBMMS42Miw0Mi40NCBMMS42Miw0Mi40NCBaIE0xLjYyLDM5LjUgTDEuNjIsNDAuOTcgTDMuMDksNDAuOTcgTDMuMDksMzkuNSBMMS42MiwzOS41IEwxLjYyLDM5LjUgWiBNMS42MiwzNi41NyBMMS42MiwzOC4wNCBMMy4wOSwzOC4wNCBMMy4wOSwzNi41NyBMMS42MiwzNi41NyBMMS42MiwzNi41NyBaIE0xLjYyLDMzLjYzIEwxLjYyLDM1LjEgTDMuMDksMzUuMSBMMy4wOSwzMy42MyBMMS42MiwzMy42MyBMMS42MiwzMy42MyBaIE0xLjYyLDMwLjcgTDEuNjIsMzIuMTcgTDMuMDksMzIuMTcgTDMuMDksMzAuNyBMMS42MiwzMC43IEwxLjYyLDMwLjcgWiBNMS42MiwyNy43NiBMMS42MiwyOS4yMyBMMy4wOSwyOS4yMyBMMy4wOSwyNy43NiBMMS42MiwyNy43NiBMMS42MiwyNy43NiBaIE0xLjYyLDI0LjgzIEwxLjYyLDI2LjMgTDMuMDksMjYuMyBMMy4wOSwyNC44MyBMMS42MiwyNC44MyBMMS42MiwyNC44MyBaIE0xLjYyLDIxLjg5IEwxLjYyLDIzLjM2IEwzLjA5LDIzLjM2IEwzLjA5LDIxLjg5IEwxLjYyLDIxLjg5IEwxLjYyLDIxLjg5IFogTTEuNjIsMTguOTYgTDEuNjIsMjAuNDMgTDMuMDksMjAuNDMgTDMuMDksMTguOTYgTDEuNjIsMTguOTYgTDEuNjIsMTguOTYgWiBNMS42MiwxNi4wMiBMMS42MiwxNy40OSBMMy4wOSwxNy40OSBMMy4wOSwxNi4wMiBMMS42MiwxNi4wMiBMMS42MiwxNi4wMiBaIE0xLjYyLDEzLjA5IEwxLjYyLDE0LjU2IEwzLjA5LDE0LjU2IEwzLjA5LDEzLjA5IEwxLjYyLDEzLjA5IEwxLjYyLDEzLjA5IFogTTEuNjIsMTAuMTUgTDEuNjIsMTEuNjIgTDMuMDksMTEuNjIgTDMuMDksMTAuMTUgTDEuNjIsMTAuMTUgTDEuNjIsMTAuMTUgWiBNMS42Miw3LjIyIEwxLjYyLDguNjkgTDMuMDksOC42OSBMMy4wOSw3LjIyIEwxLjYyLDcuMjIgTDEuNjIsNy4yMiBaIE0xLjYyLDQuMjggTDEuNjIsNS43NSBMMy4wOSw1Ljc1IEwzLjA5LDQuMjggTDEuNjIsNC4yOCBMMS42Miw0LjI4IFogTTEuNjIsMS4zNSBMMS42MiwyLjgyIEwzLjA5LDIuODIgTDMuMDksMS4zNSBMMS42MiwxLjM1IEwxLjYyLDEuMzUgWiBNMS42MiwtMS41OSBMMS42MiwtMC4xMiBMMy4wOSwtMC4xMiBMMy4wOSwtMS41OSBMMS42MiwtMS41OSBMMS42MiwtMS41OSBaIE0zLjA5LDY0LjQ1IEwzLjA5LDY1LjkyIEw0LjU2LDY1LjkyIEw0LjU2LDY0LjQ1IEwzLjA5LDY0LjQ1IEwzLjA5LDY0LjQ1IFogTTMuMDksNjEuNTIgTDMuMDksNjIuOTkgTDQuNTYsNjIuOTkgTDQuNTYsNjEuNTIgTDMuMDksNjEuNTIgTDMuMDksNjEuNTIgWiBNMy4wOSw1OC41OCBMMy4wOSw2MC4wNSBMNC41Niw2MC4wNSBMNC41Niw1OC41OCBMMy4wOSw1OC41OCBMMy4wOSw1OC41OCBaIE0zLjA5LDU1LjY1IEwzLjA5LDU3LjEyIEw0LjU2LDU3LjEyIEw0LjU2LDU1LjY1IEwzLjA5LDU1LjY1IEwzLjA5LDU1LjY1IFogTTMuMDksNTIuNzEgTDMuMDksNTQuMTggTDQuNTYsNTQuMTggTDQuNTYsNTIuNzEgTDMuMDksNTIuNzEgTDMuMDksNTIuNzEgWiBNMy4wOSw0OS43OCBMMy4wOSw1MS4yNSBMNC41Niw1MS4yNSBMNC41Niw0OS43OCBMMy4wOSw0OS43OCBMMy4wOSw0OS43OCBaIE0zLjA5LDQ2Ljg0IEwzLjA5LDQ4LjMxIEw0LjU2LDQ4LjMxIEw0LjU2LDQ2Ljg0IEwzLjA5LDQ2Ljg0IEwzLjA5LDQ2Ljg0IFogTTMuMDksNDMuOTEgTDMuMDksNDUuMzggTDQuNTYsNDUuMzggTDQuNTYsNDMuOTEgTDMuMDksNDMuOTEgTDMuMDksNDMuOTEgWiBNMy4wOSw0MC45NyBMMy4wOSw0Mi40NCBMNC41Niw0Mi40NCBMNC41Niw0MC45NyBMMy4wOSw0MC45NyBMMy4wOSw0MC45NyBaIE0zLjA5LDM4LjA0IEwzLjA5LDM5LjUxIEw0LjU2LDM5LjUxIEw0LjU2LDM4LjA0IEwzLjA5LDM4LjA0IEwzLjA5LDM4LjA0IFogTTMuMDksMzUuMSBMMy4wOSwzNi41NyBMNC41NiwzNi41NyBMNC41NiwzNS4xIEwzLjA5LDM1LjEgTDMuMDksMzUuMSBaIE0zLjA5LDMyLjE3IEwzLjA5LDMzLjY0IEw0LjU2LDMzLjY0IEw0LjU2LDMyLjE3IEwzLjA5LDMyLjE3IEwzLjA5LDMyLjE3IFogTTMuMDksMjkuMjMgTDMuMDksMzAuNyBMNC41NiwzMC43IEw0LjU2LDI5LjIzIEwzLjA5LDI5LjIzIEwzLjA5LDI5LjIzIFogTTMuMDksMjYuMyBMMy4wOSwyNy43NyBMNC41NiwyNy43NyBMNC41NiwyNi4zIEwzLjA5LDI2LjMgTDMuMDksMjYuMyBaIE0zLjA5LDIzLjM2IEwzLjA5LDI0LjgzIEw0LjU2LDI0LjgzIEw0LjU2LDIzLjM2IEwzLjA5LDIzLjM2IEwzLjA5LDIzLjM2IFogTTMuMDksMjAuNDMgTDMuMDksMjEuOSBMNC41NiwyMS45IEw0LjU2LDIwLjQzIEwzLjA5LDIwLjQzIEwzLjA5LDIwLjQzIFogTTMuMDksMTcuNDkgTDMuMDksMTguOTYgTDQuNTYsMTguOTYgTDQuNTYsMTcuNDkgTDMuMDksMTcuNDkgTDMuMDksMTcuNDkgWiBNMy4wOSwxNC41NiBMMy4wOSwxNi4wMyBMNC41NiwxNi4wMyBMNC41NiwxNC41NiBMMy4wOSwxNC41NiBMMy4wOSwxNC41NiBaIE0zLjA5LDExLjYyIEwzLjA5LDEzLjA5IEw0LjU2LDEzLjA5IEw0LjU2LDExLjYyIEwzLjA5LDExLjYyIEwzLjA5LDExLjYyIFogTTMuMDksOC42OSBMMy4wOSwxMC4xNiBMNC41NiwxMC4xNiBMNC41Niw4LjY5IEwzLjA5LDguNjkgTDMuMDksOC42OSBaIE0zLjA5LDUuNzUgTDMuMDksNy4yMiBMNC41Niw3LjIyIEw0LjU2LDUuNzUgTDMuMDksNS43NSBMMy4wOSw1Ljc1IFogTTMuMDksMi44MiBMMy4wOSw0LjI5IEw0LjU2LDQuMjkgTDQuNTYsMi44MiBMMy4wOSwyLjgyIEwzLjA5LDIuODIgWiBNMy4wOSwtMC4xMiBMMy4wOSwxLjM1IEw0LjU2LDEuMzUgTDQuNTYsLTAuMTIgTDMuMDksLTAuMTIgTDMuMDksLTAuMTIgWiBNNC41Niw2Mi45OCBMNC41Niw2NC40NSBMNi4wMyw2NC40NSBMNi4wMyw2Mi45OCBMNC41Niw2Mi45OCBMNC41Niw2Mi45OCBaIE00LjU2LDYwLjA1IEw0LjU2LDYxLjUyIEw2LjAzLDYxLjUyIEw2LjAzLDYwLjA1IEw0LjU2LDYwLjA1IEw0LjU2LDYwLjA1IFogTTQuNTYsNTcuMTEgTDQuNTYsNTguNTggTDYuMDMsNTguNTggTDYuMDMsNTcuMTEgTDQuNTYsNTcuMTEgTDQuNTYsNTcuMTEgWiBNNC41Niw1NC4xOCBMNC41Niw1NS42NSBMNi4wMyw1NS42NSBMNi4wMyw1NC4xOCBMNC41Niw1NC4xOCBMNC41Niw1NC4xOCBaIE00LjU2LDUxLjI0IEw0LjU2LDUyLjcxIEw2LjAzLDUyLjcxIEw2LjAzLDUxLjI0IEw0LjU2LDUxLjI0IEw0LjU2LDUxLjI0IFogTTQuNTYsNDguMzEgTDQuNTYsNDkuNzggTDYuMDMsNDkuNzggTDYuMDMsNDguMzEgTDQuNTYsNDguMzEgTDQuNTYsNDguMzEgWiBNNC41Niw0NS4zNyBMNC41Niw0Ni44NCBMNi4wMyw0Ni44NCBMNi4wMyw0NS4zNyBMNC41Niw0NS4zNyBMNC41Niw0NS4zNyBaIE00LjU2LDQyLjQ0IEw0LjU2LDQzLjkxIEw2LjAzLDQzLjkxIEw2LjAzLDQyLjQ0IEw0LjU2LDQyLjQ0IEw0LjU2LDQyLjQ0IFogTTQuNTYsMzkuNSBMNC41Niw0MC45NyBMNi4wMyw0MC45NyBMNi4wMywzOS41IEw0LjU2LDM5LjUgTDQuNTYsMzkuNSBaIE00LjU2LDM2LjU3IEw0LjU2LDM4LjA0IEw2LjAzLDM4LjA0IEw2LjAzLDM2LjU3IEw0LjU2LDM2LjU3IEw0LjU2LDM2LjU3IFogTTQuNTYsMzMuNjMgTDQuNTYsMzUuMSBMNi4wMywzNS4xIEw2LjAzLDMzLjYzIEw0LjU2LDMzLjYzIEw0LjU2LDMzLjYzIFogTTQuNTYsMzAuNyBMNC41NiwzMi4xNyBMNi4wMywzMi4xNyBMNi4wMywzMC43IEw0LjU2LDMwLjcgTDQuNTYsMzAuNyBaIE00LjU2LDI3Ljc2IEw0LjU2LDI5LjIzIEw2LjAzLDI5LjIzIEw2LjAzLDI3Ljc2IEw0LjU2LDI3Ljc2IEw0LjU2LDI3Ljc2IFogTTQuNTYsMjQuODMgTDQuNTYsMjYuMyBMNi4wMywyNi4zIEw2LjAzLDI0LjgzIEw0LjU2LDI0LjgzIEw0LjU2LDI0LjgzIFogTTQuNTYsMjEuODkgTDQuNTYsMjMuMzYgTDYuMDMsMjMuMzYgTDYuMDMsMjEuODkgTDQuNTYsMjEuODkgTDQuNTYsMjEuODkgWiBNNC41NiwxOC45NiBMNC41NiwyMC40MyBMNi4wMywyMC40MyBMNi4wMywxOC45NiBMNC41NiwxOC45NiBMNC41NiwxOC45NiBaIE00LjU2LDE2LjAyIEw0LjU2LDE3LjQ5IEw2LjAzLDE3LjQ5IEw2LjAzLDE2LjAyIEw0LjU2LDE2LjAyIEw0LjU2LDE2LjAyIFogTTQuNTYsMTMuMDkgTDQuNTYsMTQuNTYgTDYuMDMsMTQuNTYgTDYuMDMsMTMuMDkgTDQuNTYsMTMuMDkgTDQuNTYsMTMuMDkgWiBNNC41NiwxMC4xNSBMNC41NiwxMS42MiBMNi4wMywxMS42MiBMNi4wMywxMC4xNSBMNC41NiwxMC4xNSBMNC41NiwxMC4xNSBaIE00LjU2LDcuMjIgTDQuNTYsOC42OSBMNi4wMyw4LjY5IEw2LjAzLDcuMjIgTDQuNTYsNy4yMiBMNC41Niw3LjIyIFogTTQuNTYsNC4yOCBMNC41Niw1Ljc1IEw2LjAzLDUuNzUgTDYuMDMsNC4yOCBMNC41Niw0LjI4IEw0LjU2LDQuMjggWiBNNC41NiwxLjM1IEw0LjU2LDIuODIgTDYuMDMsMi44MiBMNi4wMywxLjM1IEw0LjU2LDEuMzUgTDQuNTYsMS4zNSBaIE00LjU2LC0xLjU5IEw0LjU2LC0wLjEyIEw2LjAzLC0wLjEyIEw2LjAzLC0xLjU5IEw0LjU2LC0xLjU5IEw0LjU2LC0xLjU5IFogTTYuMDIsNjQuNDUgTDYuMDIsNjUuOTIgTDcuNDksNjUuOTIgTDcuNDksNjQuNDUgTDYuMDIsNjQuNDUgTDYuMDIsNjQuNDUgWiBNNi4wMiw2MS41MiBMNi4wMiw2Mi45OSBMNy40OSw2Mi45OSBMNy40OSw2MS41MiBMNi4wMiw2MS41MiBMNi4wMiw2MS41MiBaIE02LjAyLDU4LjU4IEw2LjAyLDYwLjA1IEw3LjQ5LDYwLjA1IEw3LjQ5LDU4LjU4IEw2LjAyLDU4LjU4IEw2LjAyLDU4LjU4IFogTTYuMDIsNTUuNjUgTDYuMDIsNTcuMTIgTDcuNDksNTcuMTIgTDcuNDksNTUuNjUgTDYuMDIsNTUuNjUgTDYuMDIsNTUuNjUgWiBNNi4wMiw1Mi43MSBMNi4wMiw1NC4xOCBMNy40OSw1NC4xOCBMNy40OSw1Mi43MSBMNi4wMiw1Mi43MSBMNi4wMiw1Mi43MSBaIE02LjAyLDQ5Ljc4IEw2LjAyLDUxLjI1IEw3LjQ5LDUxLjI1IEw3LjQ5LDQ5Ljc4IEw2LjAyLDQ5Ljc4IEw2LjAyLDQ5Ljc4IFogTTYuMDIsNDYuODQgTDYuMDIsNDguMzEgTDcuNDksNDguMzEgTDcuNDksNDYuODQgTDYuMDIsNDYuODQgTDYuMDIsNDYuODQgWiBNNi4wMiw0My45MSBMNi4wMiw0NS4zOCBMNy40OSw0NS4zOCBMNy40OSw0My45MSBMNi4wMiw0My45MSBMNi4wMiw0My45MSBaIE02LjAyLDQwLjk3IEw2LjAyLDQyLjQ0IEw3LjQ5LDQyLjQ0IEw3LjQ5LDQwLjk3IEw2LjAyLDQwLjk3IEw2LjAyLDQwLjk3IFogTTYuMDIsMzguMDQgTDYuMDIsMzkuNTEgTDcuNDksMzkuNTEgTDcuNDksMzguMDQgTDYuMDIsMzguMDQgTDYuMDIsMzguMDQgWiBNNi4wMiwzNS4xIEw2LjAyLDM2LjU3IEw3LjQ5LDM2LjU3IEw3LjQ5LDM1LjEgTDYuMDIsMzUuMSBMNi4wMiwzNS4xIFogTTYuMDIsMzIuMTcgTDYuMDIsMzMuNjQgTDcuNDksMzMuNjQgTDcuNDksMzIuMTcgTDYuMDIsMzIuMTcgTDYuMDIsMzIuMTcgWiBNNi4wMiwyOS4yMyBMNi4wMiwzMC43IEw3LjQ5LDMwLjcgTDcuNDksMjkuMjMgTDYuMDIsMjkuMjMgTDYuMDIsMjkuMjMgWiBNNi4wMiwyNi4zIEw2LjAyLDI3Ljc3IEw3LjQ5LDI3Ljc3IEw3LjQ5LDI2LjMgTDYuMDIsMjYuMyBMNi4wMiwyNi4zIFogTTYuMDIsMjMuMzYgTDYuMDIsMjQuODMgTDcuNDksMjQuODMgTDcuNDksMjMuMzYgTDYuMDIsMjMuMzYgTDYuMDIsMjMuMzYgWiBNNi4wMiwyMC40MyBMNi4wMiwyMS45IEw3LjQ5LDIxLjkgTDcuNDksMjAuNDMgTDYuMDIsMjAuNDMgTDYuMDIsMjAuNDMgWiBNNi4wMiwxNy40OSBMNi4wMiwxOC45NiBMNy40OSwxOC45NiBMNy40OSwxNy40OSBMNi4wMiwxNy40OSBMNi4wMiwxNy40OSBaIE02LjAyLDE0LjU2IEw2LjAyLDE2LjAzIEw3LjQ5LDE2LjAzIEw3LjQ5LDE0LjU2IEw2LjAyLDE0LjU2IEw2LjAyLDE0LjU2IFogTTYuMDIsMTEuNjIgTDYuMDIsMTMuMDkgTDcuNDksMTMuMDkgTDcuNDksMTEuNjIgTDYuMDIsMTEuNjIgTDYuMDIsMTEuNjIgWiBNNi4wMiw4LjY5IEw2LjAyLDEwLjE2IEw3LjQ5LDEwLjE2IEw3LjQ5LDguNjkgTDYuMDIsOC42OSBMNi4wMiw4LjY5IFogTTYuMDIsNS43NSBMNi4wMiw3LjIyIEw3LjQ5LDcuMjIgTDcuNDksNS43NSBMNi4wMiw1Ljc1IEw2LjAyLDUuNzUgWiBNNi4wMiwyLjgyIEw2LjAyLDQuMjkgTDcuNDksNC4yOSBMNy40OSwyLjgyIEw2LjAyLDIuODIgTDYuMDIsMi44MiBaIE02LjAyLC0wLjEyIEw2LjAyLDEuMzUgTDcuNDksMS4zNSBMNy40OSwtMC4xMiBMNi4wMiwtMC4xMiBMNi4wMiwtMC4xMiBaIE03LjQ5LDYyLjk4IEw3LjQ5LDY0LjQ1IEw4Ljk2LDY0LjQ1IEw4Ljk2LDYyLjk4IEw3LjQ5LDYyLjk4IEw3LjQ5LDYyLjk4IFogTTcuNDksNjAuMDUgTDcuNDksNjEuNTIgTDguOTYsNjEuNTIgTDguOTYsNjAuMDUgTDcuNDksNjAuMDUgTDcuNDksNjAuMDUgWiBNNy40OSw1Ny4xMSBMNy40OSw1OC41OCBMOC45Niw1OC41OCBMOC45Niw1Ny4xMSBMNy40OSw1Ny4xMSBMNy40OSw1Ny4xMSBaIE03LjQ5LDU0LjE4IEw3LjQ5LDU1LjY1IEw4Ljk2LDU1LjY1IEw4Ljk2LDU0LjE4IEw3LjQ5LDU0LjE4IEw3LjQ5LDU0LjE4IFogTTcuNDksNTEuMjQgTDcuNDksNTIuNzEgTDguOTYsNTIuNzEgTDguOTYsNTEuMjQgTDcuNDksNTEuMjQgTDcuNDksNTEuMjQgWiBNNy40OSw0OC4zMSBMNy40OSw0OS43OCBMOC45Niw0OS43OCBMOC45Niw0OC4zMSBMNy40OSw0OC4zMSBMNy40OSw0OC4zMSBaIE03LjQ5LDQ1LjM3IEw3LjQ5LDQ2Ljg0IEw4Ljk2LDQ2Ljg0IEw4Ljk2LDQ1LjM3IEw3LjQ5LDQ1LjM3IEw3LjQ5LDQ1LjM3IFogTTcuNDksNDIuNDQgTDcuNDksNDMuOTEgTDguOTYsNDMuOTEgTDguOTYsNDIuNDQgTDcuNDksNDIuNDQgTDcuNDksNDIuNDQgWiBNNy40OSwzOS41IEw3LjQ5LDQwLjk3IEw4Ljk2LDQwLjk3IEw4Ljk2LDM5LjUgTDcuNDksMzkuNSBMNy40OSwzOS41IFogTTcuNDksMzYuNTcgTDcuNDksMzguMDQgTDguOTYsMzguMDQgTDguOTYsMzYuNTcgTDcuNDksMzYuNTcgTDcuNDksMzYuNTcgWiBNNy40OSwzMy42MyBMNy40OSwzNS4xIEw4Ljk2LDM1LjEgTDguOTYsMzMuNjMgTDcuNDksMzMuNjMgTDcuNDksMzMuNjMgWiBNNy40OSwzMC43IEw3LjQ5LDMyLjE3IEw4Ljk2LDMyLjE3IEw4Ljk2LDMwLjcgTDcuNDksMzAuNyBMNy40OSwzMC43IFogTTcuNDksMjcuNzYgTDcuNDksMjkuMjMgTDguOTYsMjkuMjMgTDguOTYsMjcuNzYgTDcuNDksMjcuNzYgTDcuNDksMjcuNzYgWiBNNy40OSwyNC44MyBMNy40OSwyNi4zIEw4Ljk2LDI2LjMgTDguOTYsMjQuODMgTDcuNDksMjQuODMgTDcuNDksMjQuODMgWiBNNy40OSwyMS44OSBMNy40OSwyMy4zNiBMOC45NiwyMy4zNiBMOC45NiwyMS44OSBMNy40OSwyMS44OSBMNy40OSwyMS44OSBaIE03LjQ5LDE4Ljk2IEw3LjQ5LDIwLjQzIEw4Ljk2LDIwLjQzIEw4Ljk2LDE4Ljk2IEw3LjQ5LDE4Ljk2IEw3LjQ5LDE4Ljk2IFogTTcuNDksMTYuMDIgTDcuNDksMTcuNDkgTDguOTYsMTcuNDkgTDguOTYsMTYuMDIgTDcuNDksMTYuMDIgTDcuNDksMTYuMDIgWiBNNy40OSwxMy4wOSBMNy40OSwxNC41NiBMOC45NiwxNC41NiBMOC45NiwxMy4wOSBMNy40OSwxMy4wOSBMNy40OSwxMy4wOSBaIE03LjQ5LDEwLjE1IEw3LjQ5LDExLjYyIEw4Ljk2LDExLjYyIEw4Ljk2LDEwLjE1IEw3LjQ5LDEwLjE1IEw3LjQ5LDEwLjE1IFogTTcuNDksNy4yMiBMNy40OSw4LjY5IEw4Ljk2LDguNjkgTDguOTYsNy4yMiBMNy40OSw3LjIyIEw3LjQ5LDcuMjIgWiBNNy40OSw0LjI4IEw3LjQ5LDUuNzUgTDguOTYsNS43NSBMOC45Niw0LjI4IEw3LjQ5LDQuMjggTDcuNDksNC4yOCBaIE03LjQ5LDEuMzUgTDcuNDksMi44MiBMOC45NiwyLjgyIEw4Ljk2LDEuMzUgTDcuNDksMS4zNSBMNy40OSwxLjM1IFogTTcuNDksLTEuNTkgTDcuNDksLTAuMTIgTDguOTYsLTAuMTIgTDguOTYsLTEuNTkgTDcuNDksLTEuNTkgTDcuNDksLTEuNTkgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMkUyRTJFIiBtYXNrPSJ1cmwoI21hc2stMTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD0ibWFzay0xNCIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xMyI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IlNWR0lEXzhfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0tMC4wOSwyLjU0IEwtMC4wOSw2MS45OCBDLTAuMDksNjQuMzggMS45OSw2Ni4zMyA0LjU2LDY2LjMzIEM3LjEzLDY2LjMzIDkuMjEsNjQuMzggOS4yMSw2MS45OCBMOS4yMSwyLjU0IEM5LjIxLDAuMTQgNy4xMywtMS44MSA0LjU2LC0xLjgxIEMxLjk5LC0xLjgxIC0wLjA5LDAuMTQgLTAuMDksMi41NCBMLTAuMDksMi41NCBaIE03Ljc1LDIuOTUgTDcuNzUsNjEuNTcgQzcuNzUsNjMuMzMgNi4zMiw2NC43NyA0LjU1LDY0Ljc3IEMyLjc4LDY0Ljc3IDEuMzUsNjMuMzQgMS4zNSw2MS41NyBMMS4zNSwyLjk1IEMxLjM1LDEuMTkgMi43OCwtMC4yNSA0LjU1LC0wLjI1IEM2LjMyLC0wLjI1IDcuNzUsMS4xOSA3Ljc1LDIuOTUgTDcuNzUsMi45NSBaIiBpZD0iU2hhcGUiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMiIgbWFzaz0idXJsKCNtYXNrLTE0KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzAwMDAwMCIgeD0iMTE0LjYyIiB5PSIyNS4yOCIgd2lkdGg9IjU2OCIgaGVpZ2h0PSIzMjAiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHdpZHRoPSIzNzRweCIgaGVpZ2h0PSI3OTVweCIgdmlld0JveD0iMCAwIDM3NCA3OTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aVBob25lIDU8L3RpdGxlPgogICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1OC45NjU5NTM0JSIgeTE9IjQ4LjA4MDY2NiUiIHgyPSIzNC4xMTEwNzglIiB5Mj0iNTMuMzk5NDE3NiUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNBM0UzQSIgb2Zmc2V0PSI4Ljg2MDAwMSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMzMyRSIgb2Zmc2V0PSIzNC4zMSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0MwQzFDMiIgb2Zmc2V0PSIzNiUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNDM0YzRSIgb2Zmc2V0PSI1MS4zNCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzRCNEU0QiIgb2Zmc2V0PSI2NC4xNiUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iLTE3Ljk5NjAzODglIiB5MT0iOC4zMzAzMDk2MiUiIHgyPSI2NS43ODk4MzM4JSIgeTI9IjU5LjY3MTk1NSUiIGlkPSJsaW5lYXJHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzc4N0E4MSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNTA1NTVEIiBvZmZzZXQ9IjYzLjUzJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI4Ni40MDU4OTE3JSIgeTE9IjkxLjg4Mjk2MTglIiB4Mj0iMTQuMDYyNzM4OSUiIHkyPSI4LjYxOTkwNDQ2JSIgaWQ9ImxpbmVhckdyYWRpZW50LTMiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC40OTA0MjQlIiBjeT0iNTcuMzcxOTU3JSIgZng9IjUwLjQ5MDQyNCUiIGZ5PSI1Ny4zNzE5NTclIiByPSIzMi4wMjY4NzUlIiBpZD0icmFkaWFsR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDIwMjAyIiBzdG9wLW9wYWNpdHk9IjAuNDExOSIgb2Zmc2V0PSI1MS40OSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzA5MDkwOSIgc3RvcC1vcGFjaXR5PSIwLjU2MDMiIG9mZnNldD0iNzAuMDMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNDE0MTQiIHN0b3Atb3BhY2l0eT0iMC42NjYiIG9mZnNldD0iODMuMjUlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTI1MjUiIHN0b3Atb3BhY2l0eT0iMC43NTA5IiBvZmZzZXQ9IjkzLjg3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ3LjkxOTg0ODUlIiBjeT0iOTYuNjUxNjE3JSIgZng9IjQ3LjkxOTg0ODUlIiBmeT0iOTYuNjUxNjE3JSIgcj0iNjAuOTg3ODc4OCUiIGlkPSJyYWRpYWxHcmFkaWVudC01Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTEuMTEyODQyMiUiIGN5PSIyNC45MzY2MTMzJSIgZng9IjUxLjExMjg0MjIlIiBmeT0iMjQuOTM2NjEzMyUiIHI9IjM2LjkwNTU1NTYlIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjUwLjI1JSIgeTE9IjUuMzQlIiB4Mj0iNTAuMjUlIiB5Mj0iOTcuODYlIiBpZD0ibGluZWFyR3JhZGllbnQtNyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC42IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iLTEzLjQyODM2OTglIiB5MT0iMTYuODgzODEyMiUiIHgyPSIyOC45NDcyMTI0JSIgeTI9IjM5LjAwMDI3NjIlIiBpZD0ibGluZWFyR3JhZGllbnQtOCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1MC4wMTQ4MzIyJSIgeTE9IjEwMC40NzUxNzglIiB4Mj0iNTAuMDE0ODMyMiUiIHkyPSIwLjcwNzg5MzM3MiUiIGlkPSJsaW5lYXJHcmFkaWVudC05Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNjE2MTYxIiBvZmZzZXQ9IjI0LjQ4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjODU4NTg1IiBvZmZzZXQ9IjgxLjM3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUyRTMxIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlwaG9uZTUtcG9ydHJhaXQiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuMSwxNDEuMSBMMi40LDE0MS4xIEMxLjQsMTQxLjEgMC42LDE0MC4zIDAuNiwxMzkuMyBMMC42LDEwOC43IEMwLjYsMTA3LjcgMS40LDEwNi45IDIuNCwxMDYuOSBMNi4xLDEwNi45IEw2LjEsMTQxLjEgTDYuMSwxNDEuMSBMNi4xLDE0MS4xIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0NC40LDUuNyBMMjQ0LjQsMiBDMjQ0LjQsMSAyNDUuMiwwLjIgMjQ2LjIsMC4yIEwzMDEuOCwwLjIgQzMwMi44LDAuMiAzMDMuNiwxIDMwMy42LDIgTDMwMy42LDUuNyBMMjQ0LjQsNS43IEwyNDQuNCw1LjcgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC44LDE4Mi40IEMwLjgsMTgxLjQgMS42LDE4MC41IDIuNywxODAuNSBMNi40LDE4MC41IEw2LjQsMjA4LjYgTDIuNywyMDguNiBDMS43LDIwOC42IDAuOCwyMDcuOCAwLjgsMjA2LjcgTDAuOCwxODIuNCBMMC44LDE4Mi40IEwwLjgsMTgyLjQgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC44LDI0OC44IEMwLjgsMjQ3LjggMS42LDI0Ni45IDIuNywyNDYuOSBMNi40LDI0Ni45IEw2LjQsMjc1IEwyLjcsMjc1IEMxLjcsMjc1IDAuOCwyNzQuMiAwLjgsMjczLjEgTDAuOCwyNDguOCBMMC44LDI0OC44IEwwLjgsMjQ4LjggWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjAuNiw3OTQuNyBDMjkuNCw3OTQuNyA0LDc2OS4zIDQsNzM4LjEgTDQsNjEuNSBDNCwzMC4zIDI5LjQsNC45IDYwLjYsNC45IEwzMTYuNiw0LjkgQzM0Ny44LDQuOSAzNzMuMiwzMC4zIDM3My4yLDYxLjUgTDM3My4yLDczOC4xIEMzNzMuMiw3NjkuMyAzNDcuOCw3OTQuNyAzMTYuNiw3OTQuNyBMNjAuNiw3OTQuNyBMNjAuNiw3OTQuNyBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MC42LDc5MC42IEMzMS43LDc5MC42IDguMSw3NjcuMSA4LjEsNzM4LjEgTDguMSw2MS41IEM4LjEsMzIuNSAzMS43LDkgNjAuNiw5IEwzMTYuNiw5IEMzNDUuNiw5IDM2OS4xLDMyLjUgMzY5LjEsNjEuNSBMMzY5LjEsNzM4LjEgQzM2OS4xLDc2Ny4xIDM0NS42LDc5MC42IDMxNi42LDc5MC42IEw2MC42LDc5MC42IEw2MC42LDc5MC42IEw2MC42LDc5MC42IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBmaWxsPSIjMkUyRTJFIiB4PSI0IiB5PSI3MiIgd2lkdGg9IjYuNyIgaGVpZ2h0PSI2Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIGZpbGw9IiMxRjFGMUYiIHg9IjM2Ni41IiB5PSI3MiIgd2lkdGg9IjYuNyIgaGVpZ2h0PSI2Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIGZpbGw9IiMyRTJFMkUiIHg9IjQiIHk9IjcyMS4yIiB3aWR0aD0iNi43IiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzFGMUYxRiIgeD0iMzY2LjUiIHk9IjcyMS4yIiB3aWR0aD0iNi43IiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MC42LDc4OCBDMzMuMSw3ODggMTAuNyw3NjUuNiAxMC43LDczOCBMMTAuNyw2MS41IEMxMC43LDM0IDMzLjEsMTEuNSA2MC42LDExLjUgTDMxNi42LDExLjUgQzM0NC4xLDExLjUgMzY2LjYsMzMuOSAzNjYuNiw2MS41IEwzNjYuNiw3MzguMSBDMzY2LjYsNzY1LjYgMzQ0LjIsNzg4LjEgMzE2LjYsNzg4LjEgTDYwLjYsNzg4IEw2MC42LDc4OCBMNjAuNiw3ODggWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMjMyMzIzIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTg4LjYsNzA3LjEgQzE3MS4zLDcwNy4xIDE1Ny4yLDcyMS4yIDE1Ny4yLDczOC41IEMxNTcuMiw3NTUuOCAxNzEuMyw3NjkuOSAxODguNiw3NjkuOSBDMjA1LjksNzY5LjkgMjIwLDc1NS44IDIyMCw3MzguNSBDMjIwLDcyMS4yIDIwNS45LDcwNy4xIDE4OC42LDcwNy4xIEwxODguNiw3MDcuMSBaIE0xODguNiw3NjcgQzE3Mi44LDc2NyAxNjAuMSw3NTQuMiAxNjAuMSw3MzguNSBDMTYwLjEsNzIyLjcgMTcyLjksNzEwIDE4OC42LDcxMCBDMjA0LjMsNzEwIDIxNy4xLDcyMi44IDIxNy4xLDczOC41IEMyMTcuMSw3NTQuMiAyMDQuNCw3NjcgMTg4LjYsNzY3IEwxODguNiw3NjcgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxODAuMDAwMDAwLCAzNi4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjNUQ1RDVGIiBjeD0iOC42IiBjeT0iOC40IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTQpIiBjeD0iOC42IiBjeT0iOC40IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjMUIxQTFGIiBjeD0iOC42IiBjeT0iOC40IiByPSI0LjUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMzNjI4NEMiIGN4PSI4LjYiIGN5PSI4LjQiIHI9IjMuMyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC01KSIgY3g9IjguNiIgY3k9IjguNCIgcj0iMy4zIj48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2LjAwMDAwMCwgNi4wMDAwMDApIiBpZD0iT3ZhbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0iIzE0MTQxNCIgb3BhY2l0eT0iMC41IiBjeD0iMi42IiBjeT0iMi40IiByPSIxLjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNikiIGN4PSIyLjYiIGN5PSIyLjQiIHI9IjEuOCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04LjYsNy4xIEM4LjIsNy4xIDcuOCw3LjMgNy42LDcuNiBMOCw4IEM4LjEsNy44IDguMyw3LjcgOC42LDcuNyBDOC44LDcuNyA5LDcuOCA5LjIsOCBMOS42LDcuNiBDOS40LDcuMyA5LDcuMSA4LjYsNy4xIEw4LjYsNy4xIFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC03KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTYwLjYsMTEuNiBDMzMuMSwxMS42IDEwLjcsMzQgMTAuNyw2MS42IEwxMC43LDU1NC42IEwyOTQuMSwxMS42IEw2MC42LDExLjYgTDYwLjYsMTEuNiBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtOCkiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1NC4wMDAwMDAsIDY4LjAwMDAwMCkiIGlkPSJTaGFwZSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjksOS4yIEw1LjMsOS4yIEMyLjksOS4yIDEsNy4zIDEsNC45IEwxLDQuOSBDMSwyLjUgMi45LDAuNiA1LjMsMC42IEw2My45LDAuNiBDNjYuMywwLjYgNjguMiwyLjUgNjguMiw0LjkgTDY4LjIsNC45IEM2OC4yLDcuMyA2Ni4zLDkuMiA2My45LDkuMiBMNjMuOSw5LjIgWiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC05KSIgb3BhY2l0eT0iMC44Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuNCwwLjYgTDAuOSwwLjYgTDAuOSwyIEwyLjQsMiBMMi40LDAuNiBMMi40LDAuNiBaIE01LjQsMC42IEwzLjksMC42IEwzLjksMiBMNS40LDIgTDUuNCwwLjYgTDUuNCwwLjYgWiBNOC4zLDAuNiBMNi44LDAuNiBMNi44LDIgTDguMywyIEw4LjMsMC42IEw4LjMsMC42IFogTTExLjIsMC42IEw5LjcsMC42IEw5LjcsMiBMMTEuMiwyIEwxMS4yLDAuNiBMMTEuMiwwLjYgWiBNMTQuMiwwLjYgTDEyLjcsMC42IEwxMi43LDIgTDE0LjIsMiBMMTQuMiwwLjYgTDE0LjIsMC42IFogTTE3LjEsMC42IEwxNS42LDAuNiBMMTUuNiwyIEwxNy4xLDIgTDE3LjEsMC42IEwxNy4xLDAuNiBaIE0yMCwwLjYgTDE4LjUsMC42IEwxOC41LDIgTDIwLDIgTDIwLDAuNiBMMjAsMC42IFogTTIzLDAuNiBMMjEuNSwwLjYgTDIxLjUsMiBMMjMsMiBMMjMsMC42IEwyMywwLjYgWiBNMjUuOSwwLjYgTDI0LjQsMC42IEwyNC40LDIgTDI1LjksMiBMMjUuOSwwLjYgTDI1LjksMC42IFogTTI4LjgsMC42IEwyNy4zLDAuNiBMMjcuMywyIEwyOC44LDIgTDI4LjgsMC42IEwyOC44LDAuNiBaIE0zMS44LDAuNiBMMzAuMywwLjYgTDMwLjMsMiBMMzEuOCwyIEwzMS44LDAuNiBMMzEuOCwwLjYgWiBNMzQuNywwLjYgTDMzLjIsMC42IEwzMy4yLDIgTDM0LjcsMiBMMzQuNywwLjYgTDM0LjcsMC42IFogTTM3LjYsMC42IEwzNi4xLDAuNiBMMzYuMSwyIEwzNy42LDIgTDM3LjYsMC42IEwzNy42LDAuNiBaIE00MC42LDAuNiBMMzkuMSwwLjYgTDM5LjEsMiBMNDAuNiwyIEw0MC42LDAuNiBMNDAuNiwwLjYgWiBNNDMuNSwwLjYgTDQyLDAuNiBMNDIsMiBMNDMuNSwyIEw0My41LDAuNiBMNDMuNSwwLjYgWiBNNDYuNCwwLjYgTDQ1LDAuNiBMNDUsMiBMNDYuNSwyIEw0Ni41LDAuNiBMNDYuNCwwLjYgWiBNNDkuNCwwLjYgTDQ3LjksMC42IEw0Ny45LDIgTDQ5LjQsMiBMNDkuNCwwLjYgTDQ5LjQsMC42IFogTTUyLjMsMC42IEw1MC44LDAuNiBMNTAuOCwyIEw1Mi4zLDIgTDUyLjMsMC42IEw1Mi4zLDAuNiBaIE01NS4yLDAuNiBMNTMuNywwLjYgTDUzLjcsMiBMNTUuMiwyIEw1NS4yLDAuNiBMNTUuMiwwLjYgWiBNNTguMiwwLjYgTDU2LjcsMC42IEw1Ni43LDIgTDU4LjIsMiBMNTguMiwwLjYgTDU4LjIsMC42IFogTTYxLjEsMC42IEw1OS42LDAuNiBMNTkuNiwyIEw2MS4xLDIgTDYxLjEsMC42IEw2MS4xLDAuNiBaIE02NC4xLDAuNiBMNjIuNiwwLjYgTDYyLjYsMiBMNjQuMSwyIEw2NC4xLDAuNiBMNjQuMSwwLjYgWiBNNjcsMC42IEw2NS41LDAuNiBMNjUuNSwyIEw2NywyIEw2NywwLjYgTDY3LDAuNiBaIE0zLjksMiBMMi40LDIgTDIuNCwzLjUgTDMuOSwzLjUgTDMuOSwyIEwzLjksMiBaIE02LjgsMiBMNS4zLDIgTDUuMywzLjUgTDYuOCwzLjUgTDYuOCwyIEw2LjgsMiBaIE05LjgsMiBMOC4zLDIgTDguMywzLjUgTDkuOCwzLjUgTDkuOCwyIEw5LjgsMiBaIE0xMi43LDIgTDExLjIsMiBMMTEuMiwzLjUgTDEyLjcsMy41IEwxMi43LDIgTDEyLjcsMiBaIE0xNS42LDIgTDE0LjEsMiBMMTQuMSwzLjUgTDE1LjYsMy41IEwxNS42LDIgTDE1LjYsMiBaIE0xOC42LDIgTDE3LjEsMiBMMTcuMSwzLjUgTDE4LjYsMy41IEwxOC42LDIgTDE4LjYsMiBaIE0yMS41LDIgTDIwLDIgTDIwLDMuNSBMMjEuNSwzLjUgTDIxLjUsMiBMMjEuNSwyIFogTTI0LjQsMiBMMjMsMiBMMjMsMy41IEwyNC41LDMuNSBMMjQuNSwyIEwyNC40LDIgWiBNMjcuNCwyIEwyNS45LDIgTDI1LjksMy41IEwyNy40LDMuNSBMMjcuNCwyIEwyNy40LDIgWiBNMzAuMywyIEwyOC44LDIgTDI4LjgsMy41IEwzMC4zLDMuNSBMMzAuMywyIEwzMC4zLDIgWiBNMzMuMiwyIEwzMS43LDIgTDMxLjcsMy41IEwzMy4yLDMuNSBMMzMuMiwyIEwzMy4yLDIgWiBNMzYuMiwyIEwzNC43LDIgTDM0LjcsMy41IEwzNi4yLDMuNSBMMzYuMiwyIEwzNi4yLDIgWiBNMzkuMSwyIEwzNy42LDIgTDM3LjYsMy41IEwzOS4xLDMuNSBMMzkuMSwyIEwzOS4xLDIgWiBNNDIsMiBMNDAuNSwyIEw0MC41LDMuNSBMNDIsMy41IEw0MiwyIEw0MiwyIFogTTQ1LDIgTDQzLjUsMiBMNDMuNSwzLjUgTDQ1LDMuNSBMNDUsMiBMNDUsMiBaIE00Ny45LDIgTDQ2LjQsMiBMNDYuNCwzLjUgTDQ3LjksMy41IEw0Ny45LDIgTDQ3LjksMiBaIE01MC45LDIgTDQ5LjQsMiBMNDkuNCwzLjUgTDUwLjksMy41IEw1MC45LDIgTDUwLjksMiBaIE01My44LDIgTDUyLjMsMiBMNTIuMywzLjUgTDUzLjgsMy41IEw1My44LDIgTDUzLjgsMiBaIE01Ni43LDIgTDU1LjIsMiBMNTUuMiwzLjUgTDU2LjcsMy41IEw1Ni43LDIgTDU2LjcsMiBaIE01OS42LDIgTDU4LjEsMiBMNTguMSwzLjUgTDU5LjYsMy41IEw1OS42LDIgTDU5LjYsMiBaIE02Mi42LDIgTDYxLjEsMiBMNjEuMSwzLjUgTDYyLjYsMy41IEw2Mi42LDIgTDYyLjYsMiBaIE02NS41LDIgTDY0LDIgTDY0LDMuNSBMNjUuNSwzLjUgTDY1LjUsMiBMNjUuNSwyIFogTTY4LjUsMiBMNjcsMiBMNjcsMy41IEw2OC41LDMuNSBMNjguNSwyIEw2OC41LDIgWiBNMi40LDMuNSBMMC45LDMuNSBMMC45LDUgTDIuNCw1IEwyLjQsMy41IEwyLjQsMy41IFogTTUuNCwzLjUgTDMuOSwzLjUgTDMuOSw1IEw1LjQsNSBMNS40LDMuNSBMNS40LDMuNSBaIE04LjMsMy41IEw2LjgsMy41IEw2LjgsNSBMOC4zLDUgTDguMywzLjUgTDguMywzLjUgWiBNMTEuMiwzLjUgTDkuNywzLjUgTDkuNyw1IEwxMS4yLDUgTDExLjIsMy41IEwxMS4yLDMuNSBaIE0xNC4yLDMuNSBMMTIuNywzLjUgTDEyLjcsNSBMMTQuMiw1IEwxNC4yLDMuNSBMMTQuMiwzLjUgWiBNMTcuMSwzLjUgTDE1LjYsMy41IEwxNS42LDUgTDE3LjEsNSBMMTcuMSwzLjUgTDE3LjEsMy41IFogTTIwLDMuNSBMMTguNSwzLjUgTDE4LjUsNSBMMjAsNSBMMjAsMy41IEwyMCwzLjUgWiBNMjMsMy41IEwyMS41LDMuNSBMMjEuNSw1IEwyMyw1IEwyMywzLjUgTDIzLDMuNSBaIE0yNS45LDMuNSBMMjQuNCwzLjUgTDI0LjQsNSBMMjUuOSw1IEwyNS45LDMuNSBMMjUuOSwzLjUgWiBNMjguOCwzLjUgTDI3LjMsMy41IEwyNy4zLDUgTDI4LjgsNSBMMjguOCwzLjUgTDI4LjgsMy41IFogTTMxLjgsMy41IEwzMC4zLDMuNSBMMzAuMyw1IEwzMS44LDUgTDMxLjgsMy41IEwzMS44LDMuNSBaIE0zNC43LDMuNSBMMzMuMiwzLjUgTDMzLjIsNSBMMzQuNyw1IEwzNC43LDMuNSBMMzQuNywzLjUgWiBNMzcuNiwzLjUgTDM2LjEsMy41IEwzNi4xLDUgTDM3LjYsNSBMMzcuNiwzLjUgTDM3LjYsMy41IFogTTQwLjYsMy41IEwzOS4xLDMuNSBMMzkuMSw1IEw0MC42LDUgTDQwLjYsMy41IEw0MC42LDMuNSBaIE00My41LDMuNSBMNDIsMy41IEw0Miw1IEw0My41LDUgTDQzLjUsMy41IEw0My41LDMuNSBaIE00Ni40LDMuNSBMNDUsMy41IEw0NSw1IEw0Ni41LDUgTDQ2LjUsMy41IEw0Ni40LDMuNSBaIE00OS40LDMuNSBMNDcuOSwzLjUgTDQ3LjksNSBMNDkuNCw1IEw0OS40LDMuNSBMNDkuNCwzLjUgWiBNNTIuMywzLjUgTDUwLjgsMy41IEw1MC44LDUgTDUyLjMsNSBMNTIuMywzLjUgTDUyLjMsMy41IFogTTU1LjIsMy41IEw1My43LDMuNSBMNTMuNyw1IEw1NS4yLDUgTDU1LjIsMy41IEw1NS4yLDMuNSBaIE01OC4yLDMuNSBMNTYuNywzLjUgTDU2LjcsNSBMNTguMiw1IEw1OC4yLDMuNSBMNTguMiwzLjUgWiBNNjEuMSwzLjUgTDU5LjYsMy41IEw1OS42LDUgTDYxLjEsNSBMNjEuMSwzLjUgTDYxLjEsMy41IFogTTY0LjEsMy41IEw2Mi42LDMuNSBMNjIuNiw1IEw2NC4xLDUgTDY0LjEsMy41IEw2NC4xLDMuNSBaIE02NywzLjUgTDY1LjUsMy41IEw2NS41LDUgTDY3LDUgTDY3LDMuNSBMNjcsMy41IFogTTMuOSw1IEwyLjQsNSBMMi40LDYuNSBMMy45LDYuNSBMMy45LDUgTDMuOSw1IFogTTYuOCw1IEw1LjMsNSBMNS4zLDYuNSBMNi44LDYuNSBMNi44LDUgTDYuOCw1IFogTTkuOCw1IEw4LjMsNSBMOC4zLDYuNSBMOS44LDYuNSBMOS44LDUgTDkuOCw1IFogTTEyLjcsNSBMMTEuMiw1IEwxMS4yLDYuNSBMMTIuNyw2LjUgTDEyLjcsNSBMMTIuNyw1IFogTTE1LjYsNSBMMTQuMSw1IEwxNC4xLDYuNSBMMTUuNiw2LjUgTDE1LjYsNSBMMTUuNiw1IFogTTE4LjYsNSBMMTcuMSw1IEwxNy4xLDYuNSBMMTguNiw2LjUgTDE4LjYsNSBMMTguNiw1IFogTTIxLjUsNSBMMjAsNSBMMjAsNi41IEwyMS41LDYuNSBMMjEuNSw1IEwyMS41LDUgWiBNMjQuNCw1IEwyMyw1IEwyMyw2LjUgTDI0LjUsNi41IEwyNC41LDUgTDI0LjQsNSBaIE0yNy40LDUgTDI1LjksNSBMMjUuOSw2LjUgTDI3LjQsNi41IEwyNy40LDUgTDI3LjQsNSBaIE0zMC4zLDUgTDI4LjgsNSBMMjguOCw2LjUgTDMwLjMsNi41IEwzMC4zLDUgTDMwLjMsNSBaIE0zMy4yLDUgTDMxLjcsNSBMMzEuNyw2LjUgTDMzLjIsNi41IEwzMy4yLDUgTDMzLjIsNSBaIE0zNi4yLDUgTDM0LjcsNSBMMzQuNyw2LjUgTDM2LjIsNi41IEwzNi4yLDUgTDM2LjIsNSBaIE0zOS4xLDUgTDM3LjYsNSBMMzcuNiw2LjUgTDM5LjEsNi41IEwzOS4xLDUgTDM5LjEsNSBaIE00Miw1IEw0MC41LDUgTDQwLjUsNi41IEw0Miw2LjUgTDQyLDUgTDQyLDUgWiBNNDUsNSBMNDMuNSw1IEw0My41LDYuNSBMNDUsNi41IEw0NSw1IEw0NSw1IFogTTQ3LjksNSBMNDYuNCw1IEw0Ni40LDYuNSBMNDcuOSw2LjUgTDQ3LjksNSBMNDcuOSw1IFogTTUwLjksNSBMNDkuNCw1IEw0OS40LDYuNSBMNTAuOSw2LjUgTDUwLjksNSBMNTAuOSw1IFogTTUzLjgsNSBMNTIuMyw1IEw1Mi4zLDYuNSBMNTMuOCw2LjUgTDUzLjgsNSBMNTMuOCw1IFogTTU2LjcsNSBMNTUuMiw1IEw1NS4yLDYuNSBMNTYuNyw2LjUgTDU2LjcsNSBMNTYuNyw1IFogTTU5LjYsNSBMNTguMSw1IEw1OC4xLDYuNSBMNTkuNiw2LjUgTDU5LjYsNSBMNTkuNiw1IFogTTYyLjYsNSBMNjEuMSw1IEw2MS4xLDYuNSBMNjIuNiw2LjUgTDYyLjYsNSBMNjIuNiw1IFogTTY1LjUsNSBMNjQsNSBMNjQsNi41IEw2NS41LDYuNSBMNjUuNSw1IEw2NS41LDUgWiBNNjguNSw1IEw2Nyw1IEw2Nyw2LjUgTDY4LjUsNi41IEw2OC41LDUgTDY4LjUsNSBaIE0yLjQsNi40IEwwLjksNi40IEwwLjksNy45IEwyLjQsNy45IEwyLjQsNi40IEwyLjQsNi40IFogTTUuNCw2LjQgTDMuOSw2LjQgTDMuOSw3LjkgTDUuNCw3LjkgTDUuNCw2LjQgTDUuNCw2LjQgWiBNOC4zLDYuNCBMNi44LDYuNCBMNi44LDcuOSBMOC4zLDcuOSBMOC4zLDYuNCBMOC4zLDYuNCBaIE0xMS4yLDYuNCBMOS43LDYuNCBMOS43LDcuOSBMMTEuMiw3LjkgTDExLjIsNi40IEwxMS4yLDYuNCBaIE0xNC4yLDYuNCBMMTIuNyw2LjQgTDEyLjcsNy45IEwxNC4yLDcuOSBMMTQuMiw2LjQgTDE0LjIsNi40IFogTTE3LjEsNi40IEwxNS42LDYuNCBMMTUuNiw3LjkgTDE3LjEsNy45IEwxNy4xLDYuNCBMMTcuMSw2LjQgWiBNMjAsNi40IEwxOC41LDYuNCBMMTguNSw3LjkgTDIwLDcuOSBMMjAsNi40IEwyMCw2LjQgWiBNMjMsNi40IEwyMS41LDYuNCBMMjEuNSw3LjkgTDIzLDcuOSBMMjMsNi40IEwyMyw2LjQgWiBNMjUuOSw2LjQgTDI0LjQsNi40IEwyNC40LDcuOSBMMjUuOSw3LjkgTDI1LjksNi40IEwyNS45LDYuNCBaIE0yOC44LDYuNCBMMjcuMyw2LjQgTDI3LjMsNy45IEwyOC44LDcuOSBMMjguOCw2LjQgTDI4LjgsNi40IFogTTMxLjgsNi40IEwzMC4zLDYuNCBMMzAuMyw3LjkgTDMxLjgsNy45IEwzMS44LDYuNCBMMzEuOCw2LjQgWiBNMzQuNyw2LjQgTDMzLjIsNi40IEwzMy4yLDcuOSBMMzQuNyw3LjkgTDM0LjcsNi40IEwzNC43LDYuNCBaIE0zNy42LDYuNCBMMzYuMSw2LjQgTDM2LjEsNy45IEwzNy42LDcuOSBMMzcuNiw2LjQgTDM3LjYsNi40IFogTTQwLjYsNi40IEwzOS4xLDYuNCBMMzkuMSw3LjkgTDQwLjYsNy45IEw0MC42LDYuNCBMNDAuNiw2LjQgWiBNNDMuNSw2LjQgTDQyLDYuNCBMNDIsNy45IEw0My41LDcuOSBMNDMuNSw2LjQgTDQzLjUsNi40IFogTTQ2LjQsNi40IEw0NSw2LjQgTDQ1LDcuOSBMNDYuNSw3LjkgTDQ2LjUsNi40IEw0Ni40LDYuNCBaIE00OS40LDYuNCBMNDcuOSw2LjQgTDQ3LjksNy45IEw0OS40LDcuOSBMNDkuNCw2LjQgTDQ5LjQsNi40IFogTTUyLjMsNi40IEw1MC44LDYuNCBMNTAuOCw3LjkgTDUyLjMsNy45IEw1Mi4zLDYuNCBMNTIuMyw2LjQgWiBNNTUuMiw2LjQgTDUzLjcsNi40IEw1My43LDcuOSBMNTUuMiw3LjkgTDU1LjIsNi40IEw1NS4yLDYuNCBaIE01OC4yLDYuNCBMNTYuNyw2LjQgTDU2LjcsNy45IEw1OC4yLDcuOSBMNTguMiw2LjQgTDU4LjIsNi40IFogTTYxLjEsNi40IEw1OS42LDYuNCBMNTkuNiw3LjkgTDYxLjEsNy45IEw2MS4xLDYuNCBMNjEuMSw2LjQgWiBNNjQuMSw2LjQgTDYyLjYsNi40IEw2Mi42LDcuOSBMNjQuMSw3LjkgTDY0LjEsNi40IEw2NC4xLDYuNCBaIE02Nyw2LjQgTDY1LjUsNi40IEw2NS41LDcuOSBMNjcsNy45IEw2Nyw2LjQgTDY3LDYuNCBaIE0zLjksNy45IEwyLjQsNy45IEwyLjQsOS40IEwzLjksOS40IEwzLjksNy45IEwzLjksNy45IFogTTYuOCw3LjkgTDUuMyw3LjkgTDUuMyw5LjQgTDYuOCw5LjQgTDYuOCw3LjkgTDYuOCw3LjkgWiBNOS44LDcuOSBMOC4zLDcuOSBMOC4zLDkuNCBMOS44LDkuNCBMOS44LDcuOSBMOS44LDcuOSBaIE0xMi43LDcuOSBMMTEuMiw3LjkgTDExLjIsOS40IEwxMi43LDkuNCBMMTIuNyw3LjkgTDEyLjcsNy45IFogTTE1LjYsNy45IEwxNC4xLDcuOSBMMTQuMSw5LjQgTDE1LjYsOS40IEwxNS42LDcuOSBMMTUuNiw3LjkgWiBNMTguNiw3LjkgTDE3LjEsNy45IEwxNy4xLDkuNCBMMTguNiw5LjQgTDE4LjYsNy45IEwxOC42LDcuOSBaIE0yMS41LDcuOSBMMjAsNy45IEwyMCw5LjQgTDIxLjUsOS40IEwyMS41LDcuOSBMMjEuNSw3LjkgWiBNMjQuNCw3LjkgTDIzLDcuOSBMMjMsOS40IEwyNC41LDkuNCBMMjQuNSw3LjkgTDI0LjQsNy45IFogTTI3LjQsNy45IEwyNS45LDcuOSBMMjUuOSw5LjQgTDI3LjQsOS40IEwyNy40LDcuOSBMMjcuNCw3LjkgWiBNMzAuMyw3LjkgTDI4LjgsNy45IEwyOC44LDkuNCBMMzAuMyw5LjQgTDMwLjMsNy45IEwzMC4zLDcuOSBaIE0zMy4yLDcuOSBMMzEuNyw3LjkgTDMxLjcsOS40IEwzMy4yLDkuNCBMMzMuMiw3LjkgTDMzLjIsNy45IFogTTM2LjIsNy45IEwzNC43LDcuOSBMMzQuNyw5LjQgTDM2LjIsOS40IEwzNi4yLDcuOSBMMzYuMiw3LjkgWiBNMzkuMSw3LjkgTDM3LjYsNy45IEwzNy42LDkuNCBMMzkuMSw5LjQgTDM5LjEsNy45IEwzOS4xLDcuOSBaIE00Miw3LjkgTDQwLjUsNy45IEw0MC41LDkuNCBMNDIsOS40IEw0Miw3LjkgTDQyLDcuOSBaIE00NSw3LjkgTDQzLjUsNy45IEw0My41LDkuNCBMNDUsOS40IEw0NSw3LjkgTDQ1LDcuOSBaIE00Ny45LDcuOSBMNDYuNCw3LjkgTDQ2LjQsOS40IEw0Ny45LDkuNCBMNDcuOSw3LjkgTDQ3LjksNy45IFogTTUwLjksNy45IEw0OS40LDcuOSBMNDkuNCw5LjQgTDUwLjksOS40IEw1MC45LDcuOSBMNTAuOSw3LjkgWiBNNTMuOCw3LjkgTDUyLjMsNy45IEw1Mi4zLDkuNCBMNTMuOCw5LjQgTDUzLjgsNy45IEw1My44LDcuOSBaIE01Ni43LDcuOSBMNTUuMiw3LjkgTDU1LjIsOS40IEw1Ni43LDkuNCBMNTYuNyw3LjkgTDU2LjcsNy45IFogTTU5LjYsNy45IEw1OC4xLDcuOSBMNTguMSw5LjQgTDU5LjYsOS40IEw1OS42LDcuOSBMNTkuNiw3LjkgWiBNNjIuNiw3LjkgTDYxLjEsNy45IEw2MS4xLDkuNCBMNjIuNiw5LjQgTDYyLjYsNy45IEw2Mi42LDcuOSBaIE02NS41LDcuOSBMNjQsNy45IEw2NCw5LjQgTDY1LjUsOS40IEw2NS41LDcuOSBMNjUuNSw3LjkgWiBNNjguNSw3LjkgTDY3LDcuOSBMNjcsOS40IEw2OC41LDkuNCBMNjguNSw3LjkgTDY4LjUsNy45IFoiIGZpbGw9IiMyRTJFMkUiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjQuMywwLjMgTDQuOSwwLjMgQzIuNSwwLjMgMC41LDIuNCAwLjUsNSBDMC41LDcuNiAyLjQsOS43IDQuOSw5LjcgTDY0LjMsOS43IEM2Ni43LDkuNyA2OC43LDcuNiA2OC43LDUgQzY4LjcsMi40IDY2LjcsMC4zIDY0LjMsMC4zIEw2NC4zLDAuMyBaIE02My45LDguMiBMNS4zLDguMiBDMy41LDguMiAyLjEsNi44IDIuMSw1IEMyLjEsMy4yIDMuNSwxLjggNS4zLDEuOCBMNjMuOSwxLjggQzY1LjcsMS44IDY3LjEsMy4yIDY3LjEsNSBDNjcuMSw2LjggNjUuNyw4LjIgNjMuOSw4LjIgTDYzLjksOC4yIFoiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgeD0iMjguNSIgeT0iMTE0LjciIHdpZHRoPSIzMjAiIGhlaWdodD0iNTY4Ij48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9Ijg3N3B4IiBoZWlnaHQ9IjQzMXB4IiB2aWV3Qm94PSIwIDAgODc3IDQzMSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5pUGhvbmUgNjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjAuMDQ4ODYxMTQzMSUiIHkxPSI0OS45OTM5NDMxJSIgeDI9IjEwMC4wNDg2OTglIiB5Mj0iNDkuOTkzOTQzMSUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMS42OSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjAwNTA5MTA4IiBvZmZzZXQ9Ijg3LjY0JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI0Ljg4Nzc3OTU5JSIgeTE9Ii0xLjc3MTk3OTIxJSIgeDI9IjkyLjI3MzI3NTklIiB5Mj0iOTguNTAwODExNSUiIGlkPSJsaW5lYXJHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wNSIgb2Zmc2V0PSIxMy43MyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjAyIiBvZmZzZXQ9Ijg4LjMxJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI0OS44NjY2NjY3JSIgY3k9IjUwLjA2NjY2NjclIiBmeD0iNDkuODY2NjY2NyUiIGZ5PSI1MC4wNjY2NjY3JSIgcj0iNTAuMzMzMzMzMyUiIGlkPSJyYWRpYWxHcmFkaWVudC0zIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVENUQ1RiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjUwLjI4NTkwMTglIiBjeT0iNTcuMjQxNjMxOSUiIGZ4PSI1MC4yODU5MDE4JSIgZnk9IjU3LjI0MTYzMTklIiByPSI1MC4zMDkzMzMzJSIgaWQ9InJhZGlhbEdyYWRpZW50LTQiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAyMDIwMiIgc3RvcC1vcGFjaXR5PSIwLjQxMTkiIG9mZnNldD0iNTEuNDklIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwOTA5MDkiIHN0b3Atb3BhY2l0eT0iMC41NjAzIiBvZmZzZXQ9IjcwLjAzJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMTQxNDE0IiBzdG9wLW9wYWNpdHk9IjAuNjY2IiBvZmZzZXQ9IjgzLjI1JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjUyNTI1IiBzdG9wLW9wYWNpdHk9IjAuNzUwOSIgb2Zmc2V0PSI5My44NyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzMzMyIgc3RvcC1vcGFjaXR5PSIwLjgiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI0Ny4zODE5NzQ5JSIgY3k9Ijk2LjI5NjYyNjklIiBmeD0iNDcuMzgxOTc0OSUiIGZ5PSI5Ni4yOTY2MjY5JSIgcj0iOTUuMTkwNTQwNSUiIGlkPSJyYWRpYWxHcmFkaWVudC01Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTAuMTMzNTkxNSUiIGN5PSIyMy45NTI2MjM4JSIgZng9IjUwLjEzMzU5MTUlIiBmeT0iMjMuOTUyNjIzOCUiIHI9IjU4LjE0NzUlIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ2LjczODk5NDklIiB5MT0iNy4yMTcxOTU5NSUiIHgyPSI0Ni43NDA4MzYzJSIgeTI9IjExMS4wNDcxOTYlIiBpZD0ibGluZWFyR3JhZGllbnQtNyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC42IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTgiIGQ9Ik04LjcsNS4xIEw4LjcsNjMuNyBDOC43LDY2LjEgNi44LDY4IDQuNCw2OCBMNC40LDY4IEMyLDY4IDAuMSw2Ni4xIDAuMSw2My43IEwwLjEsNS4xIEMwLjEsMi43IDIsMC44IDQuNCwwLjggTDQuNCwwLjggQzYuOCwwLjggOC43LDIuNyA4LjcsNS4xIEw4LjcsNS4xIFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjEwMC43NTQ4NzQlIiB5MT0iNDkuOTkyMTEzMSUiIHgyPSIwLjk4NzU4ODkxNSUiIHkyPSI0OS45OTIxMTMxJSIgaWQ9ImxpbmVhckdyYWRpZW50LTEwIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNjE2MTYxIiBvZmZzZXQ9IjI0LjQ4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjODU4NTg1IiBvZmZzZXQ9IjgxLjM3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUyRTMxIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTExIiBkPSJNOC43LDUuMSBMOC43LDYzLjcgQzguNyw2Ni4xIDYuOCw2OCA0LjQsNjggTDQuNCw2OCBDMiw2OCAwLjEsNjYuMSAwLjEsNjMuNyBMMC4xLDUuMSBDMC4xLDIuNyAyLDAuOCA0LjQsMC44IEw0LjQsMC44IEM2LjgsMC44IDguNywyLjcgOC43LDUuMSBMOC43LDUuMSBaIj48L3BhdGg+CiAgICAgICAgPHBhdGggaWQ9InBhdGgtMTMiIGQ9Ik04LjcsNS4xIEw4LjcsNjMuNyBDOC43LDY2LjEgNi44LDY4IDQuNCw2OCBMNC40LDY4IEMyLDY4IDAuMSw2Ni4xIDAuMSw2My43IEwwLjEsNS4xIEMwLjEsMi43IDIsMC44IDQuNCwwLjggTDQuNCwwLjggQzYuOCwwLjggOC43LDIuNyA4LjcsNS4xIEw4LjcsNS4xIFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ijg2LjM4MzIzMTclIiB5MT0iOTIuMDM0NDUxMiUiIHgyPSIxMy45NzI3MTM0JSIgeTI9IjguNjkzOTAyNDQlIiBpZD0ibGluZWFyR3JhZGllbnQtMTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iaXBob25lNi1sYW5kc2NhcGUiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS4yLDQyNC44IEwxNDUuMiw0MjguNSBDMTQ1LjIsNDI5LjUgMTQ0LjQsNDMwLjQgMTQzLjMsNDMwLjQgTDExMy4zLDQzMC40IEMxMTIuMyw0MzAuNCAxMTEuNCw0MjkuNiAxMTEuNCw0MjguNSBMMTExLjQsNDI0LjggTDE0NS4yLDQyNC44IEwxNDUuMiw0MjQuOCBaIiBpZD0iU2hhcGUiIGZpbGw9IiM4MDgwODYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkwLjUsNDMwLjQgQzE4OS41LDQzMC40IDE4OC42LDQyOS42IDE4OC42LDQyOC41IEwxODguNiw0MjQuOCBMMjQ5LjcsNDI0LjggTDI0OS43LDQyOC41IEMyNDkuNyw0MjkuNSAyNDguOSw0MzAuNCAyNDcuOCw0MzAuNCIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE4OCw2LjIgTDE4OCwyLjUgQzE4OCwxLjUgMTg4LjgsMC42IDE4OS45LDAuNiBMMjQ3LjMsMC42IEMyNDguMywwLjYgMjQ5LjIsMS40IDI0OS4yLDIuNSBMMjQ5LjIsNi4yIEwxODgsNi4yIEwxODgsNi4yIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgxODE4NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMjkuNSw0MjQuOCBMMzI5LjUsNDI4LjUgQzMyOS41LDQyOS41IDMyOC43LDQzMC40IDMyNy42LDQzMC40IEwyNzAuMiw0MzAuNCBDMjY5LjIsNDMwLjQgMjY4LjMsNDI5LjYgMjY4LjMsNDI4LjUgTDI2OC4zLDQyNC44IEwzMjkuNSw0MjQuOCBMMzI5LjUsNDI0LjggWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY1LjcsNDI3LjkgQzI5LjksNDI3LjkgMC44LDM5OC44IDAuOCwzNjMgTDAuOCw2OC41IEMwLjgsMzIuNyAyOS45LDMuNiA2NS43LDMuNiBMODExLjQsMy42IEM4NDcuMiwzLjYgODc2LjMsMzIuNyA4NzYuMyw2OC41IEw4NzYuMywzNjMgQzg3Ni4zLDM5OC44IDg0Ny4yLDQyNy45IDgxMS40LDQyNy45IEw2NS43LDQyNy45IEw2NS43LDQyNy45IFoiIGlkPSJTaGFwZSIgc3Ryb2tlPSIjNjY2NjY2IiBmaWxsPSIjQjJCMkIyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTg3MS4xLDM2My4yIEM4NzEuMSwzNzkuMSA4NjQuOSwzOTQuMSA4NTMuNiw0MDUuMyBDODQyLjQsNDE2LjUgODI3LjQsNDIyLjggODExLjUsNDIyLjggTDY1LjUsNDIyLjggQzQ5LjYsNDIyLjggMzQuNiw0MTYuNiAyMy40LDQwNS4zIEMxMi4yLDM5NC4xIDUuOSwzNzkuMSA1LjksMzYzLjIgTDUuOSw2OC40IEM1LjksNTIuNSAxMi4xLDM3LjUgMjMuNCwyNi4zIEMzNC42LDE1IDQ5LjYsOC44IDY1LjUsOC44IEw4MTEuNSw4LjggQzgyNy40LDguOCA4NDIuNCwxNSA4NTMuNiwyNi4zIEM4NjQuOCwzNy41IDg3MS4xLDUyLjUgODcxLjEsNjguNCBMODcxLjEsMzYzLjIgTDg3MS4xLDM2My4yIEw4NzEuMSwzNjMuMiBaIiBpZD0iU2hhcGUiIGZpbGw9IiM0MDQwNDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODcxLjMsNjguNSBMODcxLjMsMzYzIEM4NzEuMywzOTYuMSA4NDQuNSw0MjIuOSA4MTEuNCw0MjIuOSBMNjUuNyw0MjIuOSBDMzIuNiw0MjIuOSA1LjgsMzk2LjEgNS44LDM2MyBMNS44LDY4LjUgQzUuOCwzNS40IDMyLjYsOC42IDY1LjcsOC42IEw4MTEuNCw4LjYgQzg0NC40LDguNiA4NzEuMywzNS40IDg3MS4zLDY4LjUgTDg3MS4zLDY4LjUgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMjYyNjI2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTUuNyw2OC40IEw1LjcsMzYzLjIgQzUuNywzOTYuMiAzMi41LDQyMyA2NS41LDQyMyBMNjcuMSw0MjMgQzM0LjEsNDIzIDcuMywzOTYuMiA3LjMsMzYzLjIgTDcuMyw2OC40IEM3LjMsMzUuNCAzNC4xLDguNiA2Ny4xLDguNiBMNjUuNSw4LjYgQzMyLjUsOC42IDUuNywzNS40IDUuNyw2OC40IEw1LjcsNjguNCBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOS4zLDY4LjQgTDkuMywzNjMuMiBDOS4zLDM5NC4yIDM0LjUsNDE5LjQgNjUuNSw0MTkuNCBMODExLjUsNDE5LjQgQzg0Mi41LDQxOS40IDg2Ny43LDM5NC4yIDg2Ny43LDM2My4yIEw4NjcuNyw2OC40IEM4NjcuNywzNy40IDg0Mi41LDEyLjIgODExLjUsMTIuMiBMNjUuNSwxMi4yIEMzNC41LDEyLjEgOS4zLDM3LjQgOS4zLDY4LjQgTDkuMyw2OC40IFogTTgxMS41LDE4LjIgQzgzOS4yLDE4LjIgODYxLjcsNDAuNyA4NjEuNyw2OC40IEw4NjEuNywzNjMuMiBDODYxLjcsMzkwLjkgODM5LjIsNDEzLjQgODExLjUsNDEzLjQgTDY1LjUsNDEzLjQgQzM3LjgsNDEzLjQgMTUuMywzOTAuOSAxNS4zLDM2My4yIEwxNS4zLDY4LjQgQzE1LjMsNDAuNyAzNy44LDE4LjIgNjUuNSwxOC4yIEw4MTEuNSwxOC4yIEw4MTEuNSwxOC4yIFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3LjAwMDAwMCwgMjc2LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTMpIiBjeD0iNy43IiBjeT0iNy43IiByPSI3LjUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTQpIiBvcGFjaXR5PSIwLjgiIGN4PSI3LjciIGN5PSI3LjciIHI9IjcuNSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMxQjFBMUYiIGN4PSI3LjciIGN5PSI3LjciIHI9IjUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjMzYyODRDIiBjeD0iNy43IiBjeT0iNy43IiByPSIzLjciPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTUpIiBjeD0iNy43IiBjeT0iNy43IiByPSIzLjciPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LjAwMDAwMCwgNS4wMDAwMDApIiBpZD0iU2hhcGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQuNywyLjcgQzQuNywzLjggMy44LDQuNyAyLjcsNC43IEMxLjYsNC43IDAuNywzLjggMC43LDIuNyBDMC43LDEuNiAxLjYsMC43IDIuNywwLjcgQzMuOCwwLjcgNC43LDEuNiA0LjcsMi43IEw0LjcsMi43IFoiIGZpbGw9IiMxNDE0MTQiIG9wYWNpdHk9IjAuNSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQuNywyLjcgQzQuNywzLjggMy44LDQuNyAyLjcsNC43IEMxLjYsNC43IDAuNywzLjggMC43LDIuNyBDMC43LDEuNiAxLjYsMC43IDIuNywwLjcgQzMuOCwwLjcgNC43LDEuNiA0LjcsMi43IEw0LjcsMi43IFoiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNikiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy43LDYuMiBDNy4yLDYuMiA2LjksNi40IDYuNiw2LjcgTDcuMSw3LjIgQzcuMyw3IDcuNSw2LjkgNy43LDYuOSBDOCw2LjkgOC4yLDcgOC40LDcuMiBMOC45LDYuNyBDOC41LDYuNCA4LjEsNi4yIDcuNyw2LjIgTDcuNyw2LjIgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTcpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUxLjAwMDAwMCwgMTgxLjAwMDAwMCkiIGlkPSJDbGlwcGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD0ibWFzay05IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC04Ij48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF84XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNyw1LjEgTDguNyw2My43IEM4LjcsNjYuMSA2LjgsNjggNC40LDY4IEw0LjQsNjggQzIsNjggMC4xLDY2LjEgMC4xLDYzLjcgTDAuMSw1LjEgQzAuMSwyLjcgMiwwLjggNC40LDAuOCBMNC40LDAuOCBDNi44LDAuOCA4LjcsMi43IDguNyw1LjEgTDguNyw1LjEgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEwKSIgb3BhY2l0eT0iMC44IiBtYXNrPSJ1cmwoI21hc2stOSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTEyIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfMTFfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNLTAuMiw0LjcgTC0wLjIsNjQuMSBDLTAuMiw2Ni41IDEuOSw2OC41IDQuNSw2OC41IEM3LjEsNjguNSA5LjEsNjYuNiA5LjEsNjQuMSBMOS4xLDQuNyBDOS4xLDIuMyA3LDAuMyA0LjQsMC4zIEMxLjgsMC4zIC0wLjIsMi4zIC0wLjIsNC43IEwtMC4yLDQuNyBaIE03LjYsNS4xIEw3LjYsNjMuNyBDNy42LDY1LjUgNi4yLDY2LjkgNC40LDY2LjkgQzIuNiw2Ni45IDEuMiw2NS41IDEuMiw2My43IEwxLjIsNS4xIEMxLjIsMy4zIDIuNiwxLjkgNC40LDEuOSBDNi4yLDEuOSA3LjYsMy4zIDcuNiw1LjEgTDcuNiw1LjEgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjIiIG1hc2s9InVybCgjbWFzay0xMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTE0IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xMyI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfMTNfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCw2Ni43IEwwLDY4LjIgTDEuNSw2OC4yIEwxLjUsNjYuNyBMMCw2Ni43IEwwLDY2LjcgWiBNMCw2My44IEwwLDY1LjMgTDEuNSw2NS4zIEwxLjUsNjMuOCBMMCw2My44IEwwLDYzLjggWiBNMCw2MC44IEwwLDYyLjMgTDEuNSw2Mi4zIEwxLjUsNjAuOCBMMCw2MC44IEwwLDYwLjggWiBNMCw1Ny45IEwwLDU5LjQgTDEuNSw1OS40IEwxLjUsNTcuOSBMMCw1Ny45IEwwLDU3LjkgWiBNMCw1NC45IEwwLDU2LjQgTDEuNSw1Ni40IEwxLjUsNTQuOSBMMCw1NC45IEwwLDU0LjkgWiBNMCw1MiBMMCw1My41IEwxLjUsNTMuNSBMMS41LDUyIEwwLDUyIEwwLDUyIFogTTAsNDkuMSBMMCw1MC42IEwxLjUsNTAuNiBMMS41LDQ5LjEgTDAsNDkuMSBMMCw0OS4xIFogTTAsNDYuMSBMMCw0Ny42IEwxLjUsNDcuNiBMMS41LDQ2LjEgTDAsNDYuMSBMMCw0Ni4xIFogTTAsNDMuMiBMMCw0NC43IEwxLjUsNDQuNyBMMS41LDQzLjIgTDAsNDMuMiBMMCw0My4yIFogTTAsNDAuMyBMMCw0MS44IEwxLjUsNDEuOCBMMS41LDQwLjMgTDAsNDAuMyBMMCw0MC4zIFogTTAsMzcuMyBMMCwzOC44IEwxLjUsMzguOCBMMS41LDM3LjMgTDAsMzcuMyBMMCwzNy4zIFogTTAsMzQuNCBMMCwzNS45IEwxLjUsMzUuOSBMMS41LDM0LjQgTDAsMzQuNCBMMCwzNC40IFogTTAsMzEuNSBMMCwzMyBMMS41LDMzIEwxLjUsMzEuNSBMMCwzMS41IEwwLDMxLjUgWiBNMCwyOC41IEwwLDMwIEwxLjUsMzAgTDEuNSwyOC41IEwwLDI4LjUgTDAsMjguNSBaIE0wLDI1LjYgTDAsMjcuMSBMMS41LDI3LjEgTDEuNSwyNS42IEwwLDI1LjYgTDAsMjUuNiBaIE0wLDIyLjYgTDAsMjQuMSBMMS41LDI0LjEgTDEuNSwyMi42IEwwLDIyLjYgTDAsMjIuNiBaIE0wLDE5LjcgTDAsMjEuMiBMMS41LDIxLjIgTDEuNSwxOS43IEwwLDE5LjcgTDAsMTkuNyBaIE0wLDE2LjggTDAsMTguMyBMMS41LDE4LjMgTDEuNSwxNi44IEwwLDE2LjggTDAsMTYuOCBaIE0wLDEzLjkgTDAsMTUuNCBMMS41LDE1LjQgTDEuNSwxMy45IEwwLDEzLjkgTDAsMTMuOSBaIE0wLDEwLjkgTDAsMTIuNCBMMS41LDEyLjQgTDEuNSwxMC45IEwwLDEwLjkgTDAsMTAuOSBaIE0wLDggTDAsOS41IEwxLjUsOS41IEwxLjUsOCBMMCw4IEwwLDggWiBNMCw1IEwwLDYuNSBMMS41LDYuNSBMMS41LDUgTDAsNSBMMCw1IFogTTAsMi4xIEwwLDMuNiBMMS41LDMuNiBMMS41LDIuMSBMMCwyLjEgTDAsMi4xIFogTTEuNSw2NS4yIEwxLjUsNjYuNyBMMyw2Ni43IEwzLDY1LjIgTDEuNSw2NS4yIEwxLjUsNjUuMiBaIE0xLjUsNjIuMyBMMS41LDYzLjggTDMsNjMuOCBMMyw2Mi4zIEwxLjUsNjIuMyBMMS41LDYyLjMgWiBNMS41LDU5LjMgTDEuNSw2MC44IEwzLDYwLjggTDMsNTkuMyBMMS41LDU5LjMgTDEuNSw1OS4zIFogTTEuNSw1Ni40IEwxLjUsNTcuOSBMMyw1Ny45IEwzLDU2LjQgTDEuNSw1Ni40IEwxLjUsNTYuNCBaIE0xLjUsNTMuNSBMMS41LDU1IEwzLDU1IEwzLDUzLjUgTDEuNSw1My41IEwxLjUsNTMuNSBaIE0xLjUsNTAuNSBMMS41LDUyIEwzLDUyIEwzLDUwLjUgTDEuNSw1MC41IEwxLjUsNTAuNSBMMS41LDUwLjUgWiBNMS41LDQ3LjYgTDEuNSw0OS4xIEwzLDQ5LjEgTDMsNDcuNiBMMS41LDQ3LjYgTDEuNSw0Ny42IFogTTEuNSw0NC43IEwxLjUsNDYuMiBMMyw0Ni4yIEwzLDQ0LjcgTDEuNSw0NC43IEwxLjUsNDQuNyBaIE0xLjUsNDEuNyBMMS41LDQzLjIgTDMsNDMuMiBMMyw0MS43IEwxLjUsNDEuNyBMMS41LDQxLjcgWiBNMS41LDM4LjggTDEuNSw0MC4zIEwzLDQwLjMgTDMsMzguOCBMMS41LDM4LjggTDEuNSwzOC44IFogTTEuNSwzNS45IEwxLjUsMzcuNCBMMywzNy40IEwzLDM1LjkgTDEuNSwzNS45IEwxLjUsMzUuOSBaIE0xLjUsMzIuOSBMMS41LDM0LjQgTDMsMzQuNCBMMywzMi45IEwxLjUsMzIuOSBMMS41LDMyLjkgWiBNMS41LDMwIEwxLjUsMzEuNSBMMywzMS41IEwzLDMwIEwxLjUsMzAgTDEuNSwzMCBaIE0xLjUsMjcuMSBMMS41LDI4LjYgTDMsMjguNiBMMywyNy4xIEwxLjUsMjcuMSBMMS41LDI3LjEgWiBNMS41LDI0LjEgTDEuNSwyNS42IEwzLDI1LjYgTDMsMjQuMSBMMS41LDI0LjEgTDEuNSwyNC4xIFogTTEuNSwyMS4yIEwxLjUsMjIuNyBMMywyMi43IEwzLDIxLjIgTDEuNSwyMS4yIEwxLjUsMjEuMiBaIE0xLjUsMTguMiBMMS41LDE5LjcgTDMsMTkuNyBMMywxOC4yIEwxLjUsMTguMiBMMS41LDE4LjIgWiBNMS41LDE1LjMgTDEuNSwxNi44IEwzLDE2LjggTDMsMTUuMyBMMS41LDE1LjMgTDEuNSwxNS4zIFogTTEuNSwxMi40IEwxLjUsMTMuOSBMMywxMy45IEwzLDEyLjQgTDEuNSwxMi40IEwxLjUsMTIuNCBaIE0xLjUsOS40IEwxLjUsMTAuOSBMMywxMC45IEwzLDkuNCBMMS41LDkuNCBMMS41LDkuNCBaIE0xLjUsNi41IEwxLjUsOCBMMyw4IEwzLDYuNSBMMS41LDYuNSBMMS41LDYuNSBaIE0xLjUsMy42IEwxLjUsNS4xIEwzLDUuMSBMMywzLjYgTDEuNSwzLjYgTDEuNSwzLjYgWiBNMS41LDAuNiBMMS41LDIuMSBMMywyLjEgTDMsMC42IEwxLjUsMC42IEwxLjUsMC42IFogTTMsNjYuNyBMMyw2OC4yIEw0LjUsNjguMiBMNC41LDY2LjcgTDMsNjYuNyBMMyw2Ni43IFogTTMsNjMuOCBMMyw2NS4zIEw0LjUsNjUuMyBMNC41LDYzLjggTDMsNjMuOCBMMyw2My44IFogTTMsNjAuOCBMMyw2Mi4zIEw0LjUsNjIuMyBMNC41LDYwLjggTDMsNjAuOCBMMyw2MC44IFogTTMsNTcuOSBMMyw1OS40IEw0LjUsNTkuNCBMNC41LDU3LjkgTDMsNTcuOSBMMyw1Ny45IFogTTMsNTQuOSBMMyw1Ni40IEw0LjUsNTYuNCBMNC41LDU0LjkgTDMsNTQuOSBMMyw1NC45IFogTTMsNTIgTDMsNTMuNSBMNC41LDUzLjUgTDQuNSw1MiBMMyw1MiBMMyw1MiBaIE0zLDQ5LjEgTDMsNTAuNiBMNC41LDUwLjYgTDQuNSw0OS4xIEwzLDQ5LjEgTDMsNDkuMSBaIE0zLDQ2LjEgTDMsNDcuNiBMNC41LDQ3LjYgTDQuNSw0Ni4xIEwzLDQ2LjEgTDMsNDYuMSBaIE0zLDQzLjIgTDMsNDQuNyBMNC41LDQ0LjcgTDQuNSw0My4yIEwzLDQzLjIgTDMsNDMuMiBaIE0zLDQwLjMgTDMsNDEuOCBMNC41LDQxLjggTDQuNSw0MC4zIEwzLDQwLjMgTDMsNDAuMyBaIE0zLDM3LjMgTDMsMzguOCBMNC41LDM4LjggTDQuNSwzNy4zIEwzLDM3LjMgTDMsMzcuMyBaIE0zLDM0LjQgTDMsMzUuOSBMNC41LDM1LjkgTDQuNSwzNC40IEwzLDM0LjQgTDMsMzQuNCBaIE0zLDMxLjUgTDMsMzMgTDQuNSwzMyBMNC41LDMxLjUgTDMsMzEuNSBMMywzMS41IFogTTMsMjguNSBMMywzMCBMNC41LDMwIEw0LjUsMjguNSBMMywyOC41IEwzLDI4LjUgWiBNMywyNS42IEwzLDI3LjEgTDQuNSwyNy4xIEw0LjUsMjUuNiBMMywyNS42IEwzLDI1LjYgWiBNMywyMi42IEwzLDI0LjEgTDQuNSwyNC4xIEw0LjUsMjIuNiBMMywyMi42IEwzLDIyLjYgWiBNMywxOS43IEwzLDIxLjIgTDQuNSwyMS4yIEw0LjUsMTkuNyBMMywxOS43IEwzLDE5LjcgWiBNMywxNi44IEwzLDE4LjMgTDQuNSwxOC4zIEw0LjUsMTYuOCBMMywxNi44IEwzLDE2LjggWiBNMywxMy45IEwzLDE1LjQgTDQuNSwxNS40IEw0LjUsMTMuOSBMMywxMy45IEwzLDEzLjkgWiBNMywxMC45IEwzLDEyLjQgTDQuNSwxMi40IEw0LjUsMTAuOSBMMywxMC45IEwzLDEwLjkgWiBNMyw4IEwzLDkuNSBMNC41LDkuNSBMNC41LDggTDMsOCBMMyw4IFogTTMsNSBMMyw2LjUgTDQuNSw2LjUgTDQuNSw1IEwzLDUgTDMsNSBaIE0zLDIuMSBMMywzLjYgTDQuNSwzLjYgTDQuNSwyLjEgTDMsMi4xIEwzLDIuMSBaIE00LjQsNjUuMiBMNC40LDY2LjcgTDUuOSw2Ni43IEw1LjksNjUuMiBMNC40LDY1LjIgTDQuNCw2NS4yIFogTTQuNCw2Mi4zIEw0LjQsNjMuOCBMNS45LDYzLjggTDUuOSw2Mi4zIEw0LjQsNjIuMyBMNC40LDYyLjMgWiBNNC40LDU5LjMgTDQuNCw2MC44IEw1LjksNjAuOCBMNS45LDU5LjMgTDQuNCw1OS4zIEw0LjQsNTkuMyBaIE00LjQsNTYuNCBMNC40LDU3LjkgTDUuOSw1Ny45IEw1LjksNTYuNCBMNC40LDU2LjQgTDQuNCw1Ni40IFogTTQuNCw1My41IEw0LjQsNTUgTDUuOSw1NSBMNS45LDUzLjUgTDQuNCw1My41IEw0LjQsNTMuNSBaIE00LjQsNTAuNSBMNC40LDUyIEw1LjksNTIgTDUuOSw1MC41IEw0LjQsNTAuNSBMNC40LDUwLjUgTDQuNCw1MC41IFogTTQuNCw0Ny42IEw0LjQsNDkuMSBMNS45LDQ5LjEgTDUuOSw0Ny42IEw0LjQsNDcuNiBMNC40LDQ3LjYgWiBNNC40LDQ0LjcgTDQuNCw0Ni4yIEw1LjksNDYuMiBMNS45LDQ0LjcgTDQuNCw0NC43IEw0LjQsNDQuNyBaIE00LjQsNDEuNyBMNC40LDQzLjIgTDUuOSw0My4yIEw1LjksNDEuNyBMNC40LDQxLjcgTDQuNCw0MS43IFogTTQuNCwzOC44IEw0LjQsNDAuMyBMNS45LDQwLjMgTDUuOSwzOC44IEw0LjQsMzguOCBMNC40LDM4LjggWiBNNC40LDM1LjkgTDQuNCwzNy40IEw1LjksMzcuNCBMNS45LDM1LjkgTDQuNCwzNS45IEw0LjQsMzUuOSBaIE00LjQsMzIuOSBMNC40LDM0LjQgTDUuOSwzNC40IEw1LjksMzIuOSBMNC40LDMyLjkgTDQuNCwzMi45IFogTTQuNCwzMCBMNC40LDMxLjUgTDUuOSwzMS41IEw1LjksMzAgTDQuNCwzMCBMNC40LDMwIFogTTQuNCwyNy4xIEw0LjQsMjguNiBMNS45LDI4LjYgTDUuOSwyNy4xIEw0LjQsMjcuMSBMNC40LDI3LjEgWiBNNC40LDI0LjEgTDQuNCwyNS42IEw1LjksMjUuNiBMNS45LDI0LjEgTDQuNCwyNC4xIEw0LjQsMjQuMSBaIE00LjQsMjEuMiBMNC40LDIyLjcgTDUuOSwyMi43IEw1LjksMjEuMiBMNC40LDIxLjIgTDQuNCwyMS4yIFogTTQuNCwxOC4yIEw0LjQsMTkuNyBMNS45LDE5LjcgTDUuOSwxOC4yIEw0LjQsMTguMiBMNC40LDE4LjIgWiBNNC40LDE1LjMgTDQuNCwxNi44IEw1LjksMTYuOCBMNS45LDE1LjMgTDQuNCwxNS4zIEw0LjQsMTUuMyBaIE00LjQsMTIuNCBMNC40LDEzLjkgTDUuOSwxMy45IEw1LjksMTIuNCBMNC40LDEyLjQgTDQuNCwxMi40IFogTTQuNCw5LjQgTDQuNCwxMC45IEw1LjksMTAuOSBMNS45LDkuNCBMNC40LDkuNCBMNC40LDkuNCBaIE00LjQsNi41IEw0LjQsOCBMNS45LDggTDUuOSw2LjUgTDQuNCw2LjUgTDQuNCw2LjUgWiBNNC40LDMuNiBMNC40LDUuMSBMNS45LDUuMSBMNS45LDMuNiBMNC40LDMuNiBMNC40LDMuNiBaIE00LjQsMC42IEw0LjQsMi4xIEw1LjksMi4xIEw1LjksMC42IEw0LjQsMC42IEw0LjQsMC42IFogTTUuOSw2Ni43IEw1LjksNjguMiBMNy40LDY4LjIgTDcuNCw2Ni43IEw1LjksNjYuNyBMNS45LDY2LjcgWiBNNS45LDYzLjggTDUuOSw2NS4zIEw3LjQsNjUuMyBMNy40LDYzLjggTDUuOSw2My44IEw1LjksNjMuOCBaIE01LjksNjAuOCBMNS45LDYyLjMgTDcuNCw2Mi4zIEw3LjQsNjAuOCBMNS45LDYwLjggTDUuOSw2MC44IFogTTUuOSw1Ny45IEw1LjksNTkuNCBMNy40LDU5LjQgTDcuNCw1Ny45IEw1LjksNTcuOSBMNS45LDU3LjkgWiBNNS45LDU0LjkgTDUuOSw1Ni40IEw3LjQsNTYuNCBMNy40LDU0LjkgTDUuOSw1NC45IEw1LjksNTQuOSBaIE01LjksNTIgTDUuOSw1My41IEw3LjQsNTMuNSBMNy40LDUyIEw1LjksNTIgTDUuOSw1MiBaIE01LjksNDkuMSBMNS45LDUwLjYgTDcuNCw1MC42IEw3LjQsNDkuMSBMNS45LDQ5LjEgTDUuOSw0OS4xIFogTTUuOSw0Ni4xIEw1LjksNDcuNiBMNy40LDQ3LjYgTDcuNCw0Ni4xIEw1LjksNDYuMSBMNS45LDQ2LjEgWiBNNS45LDQzLjIgTDUuOSw0NC43IEw3LjQsNDQuNyBMNy40LDQzLjIgTDUuOSw0My4yIEw1LjksNDMuMiBaIE01LjksNDAuMyBMNS45LDQxLjggTDcuNCw0MS44IEw3LjQsNDAuMyBMNS45LDQwLjMgTDUuOSw0MC4zIFogTTUuOSwzNy4zIEw1LjksMzguOCBMNy40LDM4LjggTDcuNCwzNy4zIEw1LjksMzcuMyBMNS45LDM3LjMgWiBNNS45LDM0LjQgTDUuOSwzNS45IEw3LjQsMzUuOSBMNy40LDM0LjQgTDUuOSwzNC40IEw1LjksMzQuNCBaIE01LjksMzEuNSBMNS45LDMzIEw3LjQsMzMgTDcuNCwzMS41IEw1LjksMzEuNSBMNS45LDMxLjUgWiBNNS45LDI4LjUgTDUuOSwzMCBMNy40LDMwIEw3LjQsMjguNSBMNS45LDI4LjUgTDUuOSwyOC41IFogTTUuOSwyNS42IEw1LjksMjcuMSBMNy40LDI3LjEgTDcuNCwyNS42IEw1LjksMjUuNiBMNS45LDI1LjYgWiBNNS45LDIyLjYgTDUuOSwyNC4xIEw3LjQsMjQuMSBMNy40LDIyLjYgTDUuOSwyMi42IEw1LjksMjIuNiBaIE01LjksMTkuNyBMNS45LDIxLjIgTDcuNCwyMS4yIEw3LjQsMTkuNyBMNS45LDE5LjcgTDUuOSwxOS43IFogTTUuOSwxNi44IEw1LjksMTguMyBMNy40LDE4LjMgTDcuNCwxNi44IEw1LjksMTYuOCBMNS45LDE2LjggWiBNNS45LDEzLjkgTDUuOSwxNS40IEw3LjQsMTUuNCBMNy40LDEzLjkgTDUuOSwxMy45IEw1LjksMTMuOSBaIE01LjksMTAuOSBMNS45LDEyLjQgTDcuNCwxMi40IEw3LjQsMTAuOSBMNS45LDEwLjkgTDUuOSwxMC45IFogTTUuOSw4IEw1LjksOS41IEw3LjQsOS41IEw3LjQsOCBMNS45LDggTDUuOSw4IFogTTUuOSw1IEw1LjksNi41IEw3LjQsNi41IEw3LjQsNSBMNS45LDUgTDUuOSw1IFogTTUuOSwyLjEgTDUuOSwzLjYgTDcuNCwzLjYgTDcuNCwyLjEgTDUuOSwyLjEgTDUuOSwyLjEgWiBNNy4zLDY1LjIgTDcuMyw2Ni43IEw4LjgsNjYuNyBMOC44LDY1LjIgTDcuMyw2NS4yIEw3LjMsNjUuMiBaIE03LjMsNjIuMyBMNy4zLDYzLjggTDguOCw2My44IEw4LjgsNjIuMyBMNy4zLDYyLjMgTDcuMyw2Mi4zIFogTTcuMyw1OS4zIEw3LjMsNjAuOCBMOC44LDYwLjggTDguOCw1OS4zIEw3LjMsNTkuMyBMNy4zLDU5LjMgWiBNNy4zLDU2LjQgTDcuMyw1Ny45IEw4LjgsNTcuOSBMOC44LDU2LjQgTDcuMyw1Ni40IEw3LjMsNTYuNCBaIE03LjMsNTMuNSBMNy4zLDU1IEw4LjgsNTUgTDguOCw1My41IEw3LjMsNTMuNSBMNy4zLDUzLjUgWiBNNy4zLDUwLjUgTDcuMyw1MiBMOC44LDUyIEw4LjgsNTAuNSBMNy4zLDUwLjUgTDcuMyw1MC41IEw3LjMsNTAuNSBaIE03LjMsNDcuNiBMNy4zLDQ5LjEgTDguOCw0OS4xIEw4LjgsNDcuNiBMNy4zLDQ3LjYgTDcuMyw0Ny42IFogTTcuMyw0NC43IEw3LjMsNDYuMiBMOC44LDQ2LjIgTDguOCw0NC43IEw3LjMsNDQuNyBMNy4zLDQ0LjcgWiBNNy4zLDQxLjcgTDcuMyw0My4yIEw4LjgsNDMuMiBMOC44LDQxLjcgTDcuMyw0MS43IEw3LjMsNDEuNyBaIE03LjMsMzguOCBMNy4zLDQwLjMgTDguOCw0MC4zIEw4LjgsMzguOCBMNy4zLDM4LjggTDcuMywzOC44IFogTTcuMywzNS45IEw3LjMsMzcuNCBMOC44LDM3LjQgTDguOCwzNS45IEw3LjMsMzUuOSBMNy4zLDM1LjkgWiBNNy4zLDMyLjkgTDcuMywzNC40IEw4LjgsMzQuNCBMOC44LDMyLjkgTDcuMywzMi45IEw3LjMsMzIuOSBaIE03LjMsMzAgTDcuMywzMS41IEw4LjgsMzEuNSBMOC44LDMwIEw3LjMsMzAgTDcuMywzMCBaIE03LjMsMjcuMSBMNy4zLDI4LjYgTDguOCwyOC42IEw4LjgsMjcuMSBMNy4zLDI3LjEgTDcuMywyNy4xIFogTTcuMywyNC4xIEw3LjMsMjUuNiBMOC44LDI1LjYgTDguOCwyNC4xIEw3LjMsMjQuMSBMNy4zLDI0LjEgWiBNNy4zLDIxLjIgTDcuMywyMi43IEw4LjgsMjIuNyBMOC44LDIxLjIgTDcuMywyMS4yIEw3LjMsMjEuMiBaIE03LjMsMTguMiBMNy4zLDE5LjcgTDguOCwxOS43IEw4LjgsMTguMiBMNy4zLDE4LjIgTDcuMywxOC4yIFogTTcuMywxNS4zIEw3LjMsMTYuOCBMOC44LDE2LjggTDguOCwxNS4zIEw3LjMsMTUuMyBMNy4zLDE1LjMgWiBNNy4zLDEyLjQgTDcuMywxMy45IEw4LjgsMTMuOSBMOC44LDEyLjQgTDcuMywxMi40IEw3LjMsMTIuNCBaIE03LjMsOS40IEw3LjMsMTAuOSBMOC44LDEwLjkgTDguOCw5LjQgTDcuMyw5LjQgTDcuMyw5LjQgWiBNNy4zLDYuNSBMNy4zLDggTDguOCw4IEw4LjgsNi41IEw3LjMsNi41IEw3LjMsNi41IFogTTcuMywzLjYgTDcuMyw1LjEgTDguOCw1LjEgTDguOCwzLjYgTDcuMywzLjYgTDcuMywzLjYgWiBNNy4zLDAuNiBMNy4zLDIuMSBMOC44LDIuMSBMOC44LDAuNiBMNy4zLDAuNiBMNy4zLDAuNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyRTJFMkUiIG1hc2s9InVybCgjbWFzay0xNCkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIwLjksMTgyLjkgQzgwMi44LDE4Mi45IDc4OC4xLDE5Ny42IDc4OC4xLDIxNS43IEM3ODguMSwyMzMuOCA4MDIuOCwyNDguNSA4MjAuOSwyNDguNSBDODM5LDI0OC41IDg1My43LDIzMy44IDg1My43LDIxNS43IEM4NTMuNywxOTcuNiA4MzksMTgyLjkgODIwLjksMTgyLjkgTDgyMC45LDE4Mi45IFogTTgyMC45LDI0NS42IEM4MDQuNCwyNDUuNiA3OTEuMSwyMzIuMiA3OTEuMSwyMTUuOCBDNzkxLjEsMTk5LjQgODA0LjQsMTg2IDgyMC45LDE4NiBDODM3LjQsMTg2IDg1MC43LDE5OS40IDg1MC43LDIxNS44IEM4NTAuNywyMzIuMiA4MzcuMywyNDUuNiA4MjAuOSwyNDUuNiBMODIwLjksMjQ1LjYgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTE1KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBmaWxsPSIjMDAwMDAwIiB4PSIxMDYiIHk9IjI4IiB3aWR0aD0iNjY3IiBoZWlnaHQ9IjM3NSI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQzMXB4IiBoZWlnaHQ9Ijg3N3B4IiB2aWV3Qm94PSIwIDAgNDMxIDg3NyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5pUGhvbmUgNjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ5Ljk4NDMxNDclIiB5MT0iLTAuMDY1MjUyODU0OCUiIHgyPSI0OS45ODQzMTQ3JSIgeTI9IjEwMC4wODE1NjYlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTEuNjklIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI4Ny42NCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iLTI4Ljc1MDU2NDglIiB5MT0iMjguNDMwMjQ1OCUiIHgyPSIxMjguNzY4MzQ1JSIgeTI9IjcxLjU3NjI2NyUiIGlkPSJsaW5lYXJHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wNSIgb2Zmc2V0PSIxMy43MyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjAyIiBvZmZzZXQ9Ijg4LjMxJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MC4wNjU3ODk1JSIgY3k9IjUwJSIgZng9IjUwLjA2NTc4OTUlIiBmeT0iNTAlIiByPSI0OS42NzEwNTI2JSIgaWQ9InJhZGlhbEdyYWRpZW50LTMiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNUQ1RDVGIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMzMzMiIHN0b3Atb3BhY2l0eT0iMC44IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTAuNTExMzQzMSUiIGN5PSI1Ny4wOTY1Nzk3JSIgZng9IjUwLjUxMTM0MzElIiBmeT0iNTcuMDk2NTc5NyUiIHI9IjQ5LjY0MTQ0NzQlIiBpZD0icmFkaWFsR3JhZGllbnQtNCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDIwMjAyIiBzdG9wLW9wYWNpdHk9IjAuNDExOSIgb2Zmc2V0PSI1MS40OSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzA5MDkwOSIgc3RvcC1vcGFjaXR5PSIwLjU2MDMiIG9mZnNldD0iNzAuMDMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMxNDE0MTQiIHN0b3Atb3BhY2l0eT0iMC42NjYiIG9mZnNldD0iODMuMjUlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTI1MjUiIHN0b3Atb3BhY2l0eT0iMC43NTA5IiBvZmZzZXQ9IjkzLjg3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ3Ljg1ODQyNzglIiBjeT0iOTYuMTQwODE2MSUiIGZ4PSI0Ny44NTg0Mjc4JSIgZnk9Ijk2LjE0MDgxNjElIiByPSI5NS4xNzk3Mjk3JSIgaWQ9InJhZGlhbEdyYWRpZW50LTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI1MS4wMTUwMyUiIGN5PSIyMy42NzY4NzUlIiBmeD0iNTEuMDE1MDMlIiBmeT0iMjMuNjc2ODc1JSIgcj0iNTguMTQlIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ4LjI2MjQ5OTMlIiB5MT0iNi4xMjA4MTk3MyUiIHgyPSI0OC4yNjQzNDA1JSIgeTI9IjEwOS45NDA4MiUiIGlkPSJsaW5lYXJHcmFkaWVudC03Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjEiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPHBhdGggaWQ9InBhdGgtOCIgZD0iTTYzLjgsOC45IEw1LjIsOC45IEMyLjgsOC45IDAuOSw3IDAuOSw0LjYgTDAuOSw0LjYgQzAuOSwyLjIgMi44LDAuMyA1LjIsMC4zIEw2My44LDAuMyBDNjYuMiwwLjMgNjguMSwyLjIgNjguMSw0LjYgTDY4LjEsNC42IEM2OC4xLDcgNjYuMiw4LjkgNjMuOCw4LjkgTDYzLjgsOC45IFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjUwLjAyOTcyNDUlIiB5MT0iMTAwLjM0OTI3MyUiIHgyPSI1MC4wMjk3MjQ1JSIgeTI9IjAuNTgxOTg3NTU4JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEwIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNjE2MTYxIiBvZmZzZXQ9IjI0LjQ4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjODU4NTg1IiBvZmZzZXQ9IjgxLjM3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUyRTMxIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTExIiBkPSJNNjMuOCw4LjkgTDUuMiw4LjkgQzIuOCw4LjkgMC45LDcgMC45LDQuNiBMMC45LDQuNiBDMC45LDIuMiAyLjgsMC4zIDUuMiwwLjMgTDYzLjgsMC4zIEM2Ni4yLDAuMyA2OC4xLDIuMiA2OC4xLDQuNiBMNjguMSw0LjYgQzY4LjEsNyA2Ni4yLDguOSA2My44LDguOSBMNjMuOCw4LjkgWiI+PC9wYXRoPgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTEzIiBkPSJNNjMuOCw4LjkgTDUuMiw4LjkgQzIuOCw4LjkgMC45LDcgMC45LDQuNiBMMC45LDQuNiBDMC45LDIuMiAyLjgsMC4zIDUuMiwwLjMgTDYzLjgsMC4zIEM2Ni4yLDAuMyA2OC4xLDIuMiA2OC4xLDQuNiBMNjguMSw0LjYgQzY4LjEsNyA2Ni4yLDguOSA2My44LDguOSBMNjMuOCw4LjkgWiI+PC9wYXRoPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODYuMzUwMzgwNSUiIHkxPSI5MS45MzM5OTM5JSIgeDI9IjE0LjA1ODU5OTclIiB5Mj0iOC42MDMyMDEyMiUiIGlkPSJsaW5lYXJHcmFkaWVudC0xNSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjE0LjclIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSI0MC43MyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjAwNTA5MTA4IiBvZmZzZXQ9Ijc0LjQ1JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMiIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ii0zNC4xNzE5MDcyJSIgeTE9Ii0yLjA5Mjg3OTk3JSIgeDI9IjI4Ljg0NzYxNiUiIHkyPSIzNi45MTQyMjIzJSIgaWQ9ImxpbmVhckdyYWRpZW50LTE2Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJpcGhvbmU2LXBvcnRyYWl0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgMS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LDE0NC41IEwyLjIsMTQ0LjUgQzEuMiwxNDQuNSAwLjMsMTQzLjcgMC4zLDE0Mi42IEwwLjMsMTEyLjYgQzAuMywxMTEuNiAxLjEsMTEwLjcgMi4yLDExMC43IEw2LDExMC43IEw2LDE0NC41IEw2LDE0NC41IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNiwxODkuNyBDMC42LDE4OC43IDEuNCwxODcuOCAyLjUsMTg3LjggTDYuMiwxODcuOCBMNi4yLDI0OSBMMi40LDI0OSBDMS40LDI0OSAwLjUsMjQ4LjIgMC41LDI0Ny4xIiBpZD0iU2hhcGUiIGZpbGw9IiM4MDgwODYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MjQuNywxODcuMiBMNDI4LjQsMTg3LjIgQzQyOS40LDE4Ny4yIDQzMC4zLDE4OCA0MzAuMywxODkuMSBMNDMwLjMsMjQ2LjUgQzQzMC4zLDI0Ny41IDQyOS41LDI0OC40IDQyOC40LDI0OC40IEw0MjQuNywyNDguNCBMNDI0LjcsMTg3LjIgTDQyNC43LDE4Ny4yIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzgxODE4NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuMiwzMjguNyBMMi40LDMyOC43IEMxLjQsMzI4LjcgMC41LDMyNy45IDAuNSwzMjYuOCBMMC41LDI2OS40IEMwLjUsMjY4LjQgMS4zLDI2Ny41IDIuNCwyNjcuNSBMNi4xLDI2Ny41IEw2LjEsMzI4LjcgTDYuMiwzMjguNyBaIiBpZD0iU2hhcGUiIGZpbGw9IiM4MDgwODYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02Ny43LDg3MC4yIEM1MS44LDg3MC4yIDM2LjgsODY0IDI1LjYsODUyLjcgQzE0LjQsODQxLjQgOC4xLDgyNi41IDguMSw4MTAuNiBMOC4xLDY0LjcgQzguMSw0OC44IDE0LjMsMzMuOCAyNS42LDIyLjYgQzM2LjksMTEuNCA1MS44LDUuMSA2Ny43LDUuMSBMMzYyLjUsNS4xIEMzNzguNCw1LjEgMzkzLjQsMTEuMyA0MDQuNiwyMi42IEM0MTUuOCwzMy45IDQyMi4xLDQ4LjggNDIyLjEsNjQuNyBMNDIyLjEsODEwLjYgQzQyMi4xLDgyNi41IDQxNS45LDg0MS41IDQwNC42LDg1Mi43IEMzOTMuMyw4NjMuOSAzNzguNCw4NzAuMiAzNjIuNSw4NzAuMiBMNjcuNyw4NzAuMiBMNjcuNyw4NzAuMiBMNjcuNyw4NzAuMiBaIiBpZD0iU2hhcGUiIGZpbGw9IiM0MDQwNDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuMDAwMDAwLCAwLjAwMDAwMCkiIGlkPSJTaGFwZSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY0LjksODc1LjQgQzI5LjEsODc1LjQgMCw4NDYuMyAwLDgxMC41IEwwLDY0LjkgQzAsMjkuMSAyOS4xLDAgNjQuOSwwIEwzNTkuMywwIEMzOTUuMSwwIDQyNC4yLDI5LjEgNDI0LjIsNjQuOSBMNDI0LjIsODEwLjUgQzQyNC4yLDg0Ni4zIDM5NS4xLDg3NS40IDM1OS4zLDg3NS40IEw2NC45LDg3NS40IEw2NC45LDg3NS40IEw2NC45LDg3NS40IFoiIHN0cm9rZS1vcGFjaXR5PSIwLjUiIHN0cm9rZT0iIzY2NjY2NiIgZmlsbD0iI0IyQjJCMiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNTkuNCw4NzAuNCBMNjQuOSw4NzAuNCBDMzEuOCw4NzAuNCA1LDg0My42IDUsODEwLjUgTDUsNjQuOSBDNSwzMS44IDMxLjgsNSA2NC45LDUgTDM1OS4zLDUgQzM5Mi40LDUgNDE5LjIsMzEuOCA0MTkuMiw2NC45IEw0MTkuMiw4MTAuNSBDNDE5LjMsODQzLjYgMzkyLjUsODcwLjQgMzU5LjQsODcwLjQgTDM1OS40LDg3MC40IFoiIGZpbGw9IiMyNjI2MjYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNjIuNSw1IEw2Ny43LDUgQzM0LjcsNSA4LDMxLjcgOCw2NC43IEw4LDY2LjMgQzgsMzMuMyAzNC44LDYuNSA2Ny44LDYuNSBMMzYyLjYsNi41IEMzOTUuNiw2LjUgNDIyLjQsMzMuMyA0MjIuNCw2Ni4zIEw0MjIuNCw2NC43IEM0MjIuMywzMS43IDM5NS41LDUgMzYyLjUsNSBMMzYyLjUsNSBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNjIuNSw4LjUgTDY3LjcsOC41IEMzNi43LDguNSAxMS41LDMzLjcgMTEuNSw2NC43IEwxMS41LDgxMC42IEMxMS41LDg0MS42IDM2LjcsODY2LjggNjcuNyw4NjYuOCBMMzYyLjUsODY2LjggQzM5My41LDg2Ni44IDQxOC43LDg0MS42IDQxOC43LDgxMC42IEw0MTguNyw2NC43IEM0MTguNywzMy43IDM5My41LDguNSAzNjIuNSw4LjUgTDM2Mi41LDguNSBaIE00MTIuNyw4MTAuNyBDNDEyLjcsODM4LjQgMzkwLjIsODYwLjkgMzYyLjUsODYwLjkgTDY3LjcsODYwLjkgQzQwLDg2MC45IDE3LjUsODM4LjQgMTcuNSw4MTAuNyBMMTcuNSw2NC43IEMxNy41LDM3IDQwLDE0LjUgNjcuNywxNC41IEwzNjIuNSwxNC41IEMzOTAuMiwxNC41IDQxMi43LDM3IDQxMi43LDY0LjcgTDQxMi43LDgxMC43IEw0MTIuNyw4MTAuNyBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzOS4wMDAwMDAsIDQ2LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtMykiIGN4PSI4LjIiIGN5PSI3LjkiIHI9IjcuNiI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC00KSIgb3BhY2l0eT0iMC44IiBjeD0iOC4yIiBjeT0iNy45IiByPSI3LjYiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMxQjFBMUYiIGN4PSI4LjIiIGN5PSI3LjkiIHI9IjUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMzNjI4NEMiIGN4PSI4LjIiIGN5PSI3LjkiIHI9IjMuNyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC01KSIgY3g9IjguMiIgY3k9IjcuOSIgcj0iMy43Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2LjAwMDAwMCwgNS4wMDAwMDApIiBpZD0iU2hhcGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNC4yLDIuOSBDNC4yLDQgMy4zLDQuOSAyLjIsNC45IEMxLjEsNC45IDAuMiw0IDAuMiwyLjkgQzAuMiwxLjggMS4xLDAuOSAyLjIsMC45IEMzLjMsMC45IDQuMiwxLjggNC4yLDIuOSBMNC4yLDIuOSBaIiBmaWxsPSIjMTQxNDE0IiBvcGFjaXR5PSIwLjUiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQuMiwyLjkgQzQuMiw0IDMuMyw0LjkgMi4yLDQuOSBDMS4xLDQuOSAwLjIsNCAwLjIsMi45IEMwLjIsMS44IDEuMSwwLjkgMi4yLDAuOSBDMy4zLDAuOSA0LjIsMS44IDQuMiwyLjkgTDQuMiwyLjkgWiIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC02KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC4yLDYuNCBDNy44LDYuNCA3LjQsNi42IDcuMSw2LjkgTDcuNiw3LjQgQzcuOCw3LjIgOCw3LjEgOC4yLDcuMSBDOC41LDcuMSA4LjcsNy4yIDguOSw3LjQgTDkuNCw2LjkgQzkuMSw2LjYgOC43LDYuNCA4LjIsNi40IEw4LjIsNi40IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC03KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTgxLjAwMDAwMCwgNTAuMDAwMDAwKSIgaWQ9IkNsaXBwZWQiPgogICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD0ibWFzay05IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTgiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF84XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjMuOCw4LjkgTDUuMiw4LjkgQzIuOCw4LjkgMC45LDcgMC45LDQuNiBMMC45LDQuNiBDMC45LDIuMiAyLjgsMC4zIDUuMiwwLjMgTDYzLjgsMC4zIEM2Ni4yLDAuMyA2OC4xLDIuMiA2OC4xLDQuNiBMNjguMSw0LjYgQzY4LjEsNyA2Ni4yLDguOSA2My44LDguOSBMNjMuOCw4LjkgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEwKSIgb3BhY2l0eT0iMC44IiBtYXNrPSJ1cmwoI21hc2stOSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTEyIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTExIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfMTFfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yLjMsMC4yIEwwLjgsMC4yIEwwLjgsMS43IEwyLjMsMS43IEwyLjMsMC4yIEwyLjMsMC4yIFogTTUuMywwLjIgTDMuOCwwLjIgTDMuOCwxLjcgTDUuMywxLjcgTDUuMywwLjIgTDUuMywwLjIgWiBNOC4yLDAuMiBMNi43LDAuMiBMNi43LDEuNyBMOC4yLDEuNyBMOC4yLDAuMiBMOC4yLDAuMiBaIE0xMS4xLDAuMiBMOS42LDAuMiBMOS42LDEuNyBMMTEuMSwxLjcgTDExLjEsMC4yIEwxMS4xLDAuMiBaIE0xNC4xLDAuMiBMMTIuNiwwLjIgTDEyLjYsMS43IEwxNC4xLDEuNyBMMTQuMSwwLjIgTDE0LjEsMC4yIFogTTE3LDAuMiBMMTUuNSwwLjIgTDE1LjUsMS43IEwxNywxLjcgTDE3LDAuMiBMMTcsMC4yIFogTTE5LjksMC4yIEwxOC40LDAuMiBMMTguNCwxLjcgTDE5LjksMS43IEwxOS45LDAuMiBMMTkuOSwwLjIgWiBNMjIuOSwwLjIgTDIxLjQsMC4yIEwyMS40LDEuNyBMMjIuOSwxLjcgTDIyLjksMC4yIEwyMi45LDAuMiBaIE0yNS44LDAuMiBMMjQuMywwLjIgTDI0LjMsMS43IEwyNS44LDEuNyBMMjUuOCwwLjIgTDI1LjgsMC4yIFogTTI4LjgsMC4yIEwyNy4zLDAuMiBMMjcuMywxLjcgTDI4LjgsMS43IEwyOC44LDAuMiBMMjguOCwwLjIgWiBNMzEuNywwLjIgTDMwLjIsMC4yIEwzMC4yLDEuNyBMMzEuNywxLjcgTDMxLjcsMC4yIEwzMS43LDAuMiBaIE0zNC42LDAuMiBMMzMuMSwwLjIgTDMzLjEsMS43IEwzNC42LDEuNyBMMzQuNiwwLjIgTDM0LjYsMC4yIFogTTM3LjYsMC4yIEwzNi4xLDAuMiBMMzYuMSwxLjcgTDM3LjYsMS43IEwzNy42LDAuMiBMMzcuNiwwLjIgWiBNNDAuNSwwLjIgTDM5LDAuMiBMMzksMS43IEw0MC41LDEuNyBMNDAuNSwwLjIgTDQwLjUsMC4yIFogTTQzLjQsMC4yIEw0MS45LDAuMiBMNDEuOSwxLjcgTDQzLjQsMS43IEw0My40LDAuMiBMNDMuNCwwLjIgWiBNNDYuNCwwLjIgTDQ0LjksMC4yIEw0NC45LDEuNyBMNDYuNCwxLjcgTDQ2LjQsMC4yIEw0Ni40LDAuMiBaIE00OS4zLDAuMiBMNDcuOCwwLjIgTDQ3LjgsMS43IEw0OS4zLDEuNyBMNDkuMywwLjIgTDQ5LjMsMC4yIFogTTUyLjIsMC4yIEw1MC43LDAuMiBMNTAuNywxLjcgTDUyLjIsMS43IEw1Mi4yLDAuMiBMNTIuMiwwLjIgWiBNNTUuMiwwLjIgTDUzLjcsMC4yIEw1My43LDEuNyBMNTUuMiwxLjcgTDU1LjIsMC4yIEw1NS4yLDAuMiBaIE01OC4xLDAuMiBMNTYuNiwwLjIgTDU2LjYsMS43IEw1OC4xLDEuNyBMNTguMSwwLjIgTDU4LjEsMC4yIFogTTYxLDAuMiBMNTkuNSwwLjIgTDU5LjUsMS43IEw2MSwxLjcgTDYxLDAuMiBMNjEsMC4yIFogTTY0LDAuMiBMNjIuNSwwLjIgTDYyLjUsMS43IEw2NCwxLjcgTDY0LDAuMiBMNjQsMC4yIFogTTY2LjksMC4yIEw2NS40LDAuMiBMNjUuNCwxLjcgTDY2LjksMS43IEw2Ni45LDAuMiBMNjYuOSwwLjIgWiBNMy44LDEuNyBMMi4zLDEuNyBMMi4zLDMuMiBMMy44LDMuMiBMMy44LDEuNyBMMy44LDEuNyBaIE02LjcsMS43IEw1LjIsMS43IEw1LjIsMy4yIEw2LjcsMy4yIEw2LjcsMS43IEw2LjcsMS43IFogTTkuNywxLjcgTDguMiwxLjcgTDguMiwzLjIgTDkuNywzLjIgTDkuNywxLjcgTDkuNywxLjcgWiBNMTIuNiwxLjcgTDExLjEsMS43IEwxMS4xLDMuMiBMMTIuNiwzLjIgTDEyLjYsMS43IEwxMi42LDEuNyBaIE0xNS41LDEuNyBMMTQsMS43IEwxNCwzLjIgTDE1LjUsMy4yIEwxNS41LDEuNyBMMTUuNSwxLjcgWiBNMTguNSwxLjcgTDE3LDEuNyBMMTcsMy4yIEwxOC41LDMuMiBMMTguNSwxLjcgTDE4LjUsMS43IFogTTIxLjQsMS43IEwxOS45LDEuNyBMMTkuOSwzLjIgTDIxLjQsMy4yIEwyMS40LDEuNyBMMjEuNCwxLjcgWiBNMjQuMywxLjcgTDIyLjgsMS43IEwyMi44LDMuMiBMMjQuMywzLjIgTDI0LjMsMS43IEwyNC4zLDEuNyBaIE0yNy4zLDEuNyBMMjUuOCwxLjcgTDI1LjgsMy4yIEwyNy4zLDMuMiBMMjcuMywxLjcgTDI3LjMsMS43IFogTTMwLjIsMS43IEwyOC43LDEuNyBMMjguNywzLjIgTDMwLjIsMy4yIEwzMC4yLDEuNyBMMzAuMiwxLjcgWiBNMzMuMSwxLjcgTDMxLjYsMS43IEwzMS42LDMuMiBMMzMuMSwzLjIgTDMzLjEsMS43IEwzMy4xLDEuNyBaIE0zNi4xLDEuNyBMMzQuNiwxLjcgTDM0LjYsMy4yIEwzNi4xLDMuMiBMMzYuMSwxLjcgTDM2LjEsMS43IFogTTM5LDEuNyBMMzcuNSwxLjcgTDM3LjUsMy4yIEwzOSwzLjIgTDM5LDEuNyBMMzksMS43IFogTTQxLjksMS43IEw0MC40LDEuNyBMNDAuNCwzLjIgTDQxLjksMy4yIEw0MS45LDEuNyBMNDEuOSwxLjcgWiBNNDQuOSwxLjcgTDQzLjQsMS43IEw0My40LDMuMiBMNDQuOSwzLjIgTDQ0LjksMS43IEw0NC45LDEuNyBaIE00Ny44LDEuNyBMNDYuMywxLjcgTDQ2LjMsMy4yIEw0Ny44LDMuMiBMNDcuOCwxLjcgTDQ3LjgsMS43IFogTTUwLjgsMS43IEw0OS4zLDEuNyBMNDkuMywzLjIgTDUwLjgsMy4yIEw1MC44LDEuNyBMNTAuOCwxLjcgWiBNNTMuNywxLjcgTDUyLjIsMS43IEw1Mi4yLDMuMiBMNTMuNywzLjIgTDUzLjcsMS43IEw1My43LDEuNyBaIE01Ni42LDEuNyBMNTUuMSwxLjcgTDU1LjEsMy4yIEw1Ni42LDMuMiBMNTYuNiwxLjcgTDU2LjYsMS43IFogTTU5LjYsMS43IEw1OC4xLDEuNyBMNTguMSwzLjIgTDU5LjYsMy4yIEw1OS42LDEuNyBMNTkuNiwxLjcgWiBNNjIuNSwxLjcgTDYxLDEuNyBMNjEsMy4yIEw2Mi41LDMuMiBMNjIuNSwxLjcgTDYyLjUsMS43IFogTTY1LjQsMS43IEw2NCwxLjcgTDY0LDMuMiBMNjUuNSwzLjIgTDY1LjUsMS43IEw2NS40LDEuNyBaIE02OC40LDEuNyBMNjYuOSwxLjcgTDY2LjksMy4yIEw2OC40LDMuMiBMNjguNCwxLjcgTDY4LjQsMS43IFogTTIuMywzLjIgTDAuOCwzLjIgTDAuOCw0LjcgTDIuMyw0LjcgTDIuMywzLjIgTDIuMywzLjIgWiBNNS4zLDMuMiBMMy44LDMuMiBMMy44LDQuNyBMNS4zLDQuNyBMNS4zLDMuMiBMNS4zLDMuMiBaIE04LjIsMy4yIEw2LjcsMy4yIEw2LjcsNC43IEw4LjIsNC43IEw4LjIsMy4yIEw4LjIsMy4yIFogTTExLjEsMy4yIEw5LjYsMy4yIEw5LjYsNC43IEwxMS4xLDQuNyBMMTEuMSwzLjIgTDExLjEsMy4yIFogTTE0LjEsMy4yIEwxMi42LDMuMiBMMTIuNiw0LjcgTDE0LjEsNC43IEwxNC4xLDMuMiBMMTQuMSwzLjIgWiBNMTcsMy4yIEwxNS41LDMuMiBMMTUuNSw0LjcgTDE3LDQuNyBMMTcsMy4yIEwxNywzLjIgWiBNMTkuOSwzLjIgTDE4LjQsMy4yIEwxOC40LDQuNyBMMTkuOSw0LjcgTDE5LjksMy4yIEwxOS45LDMuMiBaIE0yMi45LDMuMiBMMjEuNCwzLjIgTDIxLjQsNC43IEwyMi45LDQuNyBMMjIuOSwzLjIgTDIyLjksMy4yIFogTTI1LjgsMy4yIEwyNC4zLDMuMiBMMjQuMyw0LjcgTDI1LjgsNC43IEwyNS44LDMuMiBMMjUuOCwzLjIgWiBNMjguOCwzLjIgTDI3LjMsMy4yIEwyNy4zLDQuNyBMMjguOCw0LjcgTDI4LjgsMy4yIEwyOC44LDMuMiBaIE0zMS43LDMuMiBMMzAuMiwzLjIgTDMwLjIsNC43IEwzMS43LDQuNyBMMzEuNywzLjIgTDMxLjcsMy4yIFogTTM0LjYsMy4yIEwzMy4xLDMuMiBMMzMuMSw0LjcgTDM0LjYsNC43IEwzNC42LDMuMiBMMzQuNiwzLjIgWiBNMzcuNiwzLjIgTDM2LjEsMy4yIEwzNi4xLDQuNyBMMzcuNiw0LjcgTDM3LjYsMy4yIEwzNy42LDMuMiBaIE00MC41LDMuMiBMMzksMy4yIEwzOSw0LjcgTDQwLjUsNC43IEw0MC41LDMuMiBMNDAuNSwzLjIgWiBNNDMuNCwzLjIgTDQxLjksMy4yIEw0MS45LDQuNyBMNDMuNCw0LjcgTDQzLjQsMy4yIEw0My40LDMuMiBaIE00Ni40LDMuMiBMNDQuOSwzLjIgTDQ0LjksNC43IEw0Ni40LDQuNyBMNDYuNCwzLjIgTDQ2LjQsMy4yIFogTTQ5LjMsMy4yIEw0Ny44LDMuMiBMNDcuOCw0LjcgTDQ5LjMsNC43IEw0OS4zLDMuMiBMNDkuMywzLjIgWiBNNTIuMiwzLjIgTDUwLjcsMy4yIEw1MC43LDQuNyBMNTIuMiw0LjcgTDUyLjIsMy4yIEw1Mi4yLDMuMiBaIE01NS4yLDMuMiBMNTMuNywzLjIgTDUzLjcsNC43IEw1NS4yLDQuNyBMNTUuMiwzLjIgTDU1LjIsMy4yIFogTTU4LjEsMy4yIEw1Ni42LDMuMiBMNTYuNiw0LjcgTDU4LjEsNC43IEw1OC4xLDMuMiBMNTguMSwzLjIgWiBNNjEsMy4yIEw1OS41LDMuMiBMNTkuNSw0LjcgTDYxLDQuNyBMNjEsMy4yIEw2MSwzLjIgWiBNNjQsMy4yIEw2Mi41LDMuMiBMNjIuNSw0LjcgTDY0LDQuNyBMNjQsMy4yIEw2NCwzLjIgWiBNNjYuOSwzLjIgTDY1LjQsMy4yIEw2NS40LDQuNyBMNjYuOSw0LjcgTDY2LjksMy4yIEw2Ni45LDMuMiBaIE0zLjgsNC43IEwyLjMsNC43IEwyLjMsNi4yIEwzLjgsNi4yIEwzLjgsNC43IEwzLjgsNC43IFogTTYuNyw0LjcgTDUuMiw0LjcgTDUuMiw2LjIgTDYuNyw2LjIgTDYuNyw0LjcgTDYuNyw0LjcgWiBNOS43LDQuNyBMOC4yLDQuNyBMOC4yLDYuMiBMOS43LDYuMiBMOS43LDQuNyBMOS43LDQuNyBaIE0xMi42LDQuNyBMMTEuMSw0LjcgTDExLjEsNi4yIEwxMi42LDYuMiBMMTIuNiw0LjcgTDEyLjYsNC43IFogTTE1LjUsNC43IEwxNCw0LjcgTDE0LDYuMiBMMTUuNSw2LjIgTDE1LjUsNC43IEwxNS41LDQuNyBaIE0xOC41LDQuNyBMMTcsNC43IEwxNyw2LjIgTDE4LjUsNi4yIEwxOC41LDQuNyBMMTguNSw0LjcgWiBNMjEuNCw0LjcgTDE5LjksNC43IEwxOS45LDYuMiBMMjEuNCw2LjIgTDIxLjQsNC43IEwyMS40LDQuNyBaIE0yNC4zLDQuNyBMMjIuOCw0LjcgTDIyLjgsNi4yIEwyNC4zLDYuMiBMMjQuMyw0LjcgTDI0LjMsNC43IFogTTI3LjMsNC43IEwyNS44LDQuNyBMMjUuOCw2LjIgTDI3LjMsNi4yIEwyNy4zLDQuNyBMMjcuMyw0LjcgWiBNMzAuMiw0LjcgTDI4LjcsNC43IEwyOC43LDYuMiBMMzAuMiw2LjIgTDMwLjIsNC43IEwzMC4yLDQuNyBaIE0zMy4xLDQuNyBMMzEuNiw0LjcgTDMxLjYsNi4yIEwzMy4xLDYuMiBMMzMuMSw0LjcgTDMzLjEsNC43IFogTTM2LjEsNC43IEwzNC42LDQuNyBMMzQuNiw2LjIgTDM2LjEsNi4yIEwzNi4xLDQuNyBMMzYuMSw0LjcgWiBNMzksNC43IEwzNy41LDQuNyBMMzcuNSw2LjIgTDM5LDYuMiBMMzksNC43IEwzOSw0LjcgWiBNNDEuOSw0LjcgTDQwLjQsNC43IEw0MC40LDYuMiBMNDEuOSw2LjIgTDQxLjksNC43IEw0MS45LDQuNyBaIE00NC45LDQuNyBMNDMuNCw0LjcgTDQzLjQsNi4yIEw0NC45LDYuMiBMNDQuOSw0LjcgTDQ0LjksNC43IFogTTQ3LjgsNC43IEw0Ni4zLDQuNyBMNDYuMyw2LjIgTDQ3LjgsNi4yIEw0Ny44LDQuNyBMNDcuOCw0LjcgWiBNNTAuOCw0LjcgTDQ5LjMsNC43IEw0OS4zLDYuMiBMNTAuOCw2LjIgTDUwLjgsNC43IEw1MC44LDQuNyBaIE01My43LDQuNyBMNTIuMiw0LjcgTDUyLjIsNi4yIEw1My43LDYuMiBMNTMuNyw0LjcgTDUzLjcsNC43IFogTTU2LjYsNC43IEw1NS4xLDQuNyBMNTUuMSw2LjIgTDU2LjYsNi4yIEw1Ni42LDQuNyBMNTYuNiw0LjcgWiBNNTkuNiw0LjcgTDU4LjEsNC43IEw1OC4xLDYuMiBMNTkuNiw2LjIgTDU5LjYsNC43IEw1OS42LDQuNyBaIE02Mi41LDQuNyBMNjEsNC43IEw2MSw2LjIgTDYyLjUsNi4yIEw2Mi41LDQuNyBMNjIuNSw0LjcgWiBNNjUuNCw0LjcgTDY0LDQuNyBMNjQsNi4yIEw2NS41LDYuMiBMNjUuNSw0LjcgTDY1LjQsNC43IFogTTY4LjQsNC43IEw2Ni45LDQuNyBMNjYuOSw2LjIgTDY4LjQsNi4yIEw2OC40LDQuNyBMNjguNCw0LjcgWiBNMi4zLDYuMSBMMC44LDYuMSBMMC44LDcuNiBMMi4zLDcuNiBMMi4zLDYuMSBMMi4zLDYuMSBaIE01LjMsNi4xIEwzLjgsNi4xIEwzLjgsNy42IEw1LjMsNy42IEw1LjMsNi4xIEw1LjMsNi4xIFogTTguMiw2LjEgTDYuNyw2LjEgTDYuNyw3LjYgTDguMiw3LjYgTDguMiw2LjEgTDguMiw2LjEgWiBNMTEuMSw2LjEgTDkuNiw2LjEgTDkuNiw3LjYgTDExLjEsNy42IEwxMS4xLDYuMSBMMTEuMSw2LjEgWiBNMTQuMSw2LjEgTDEyLjYsNi4xIEwxMi42LDcuNiBMMTQuMSw3LjYgTDE0LjEsNi4xIEwxNC4xLDYuMSBaIE0xNyw2LjEgTDE1LjUsNi4xIEwxNS41LDcuNiBMMTcsNy42IEwxNyw2LjEgTDE3LDYuMSBaIE0xOS45LDYuMSBMMTguNCw2LjEgTDE4LjQsNy42IEwxOS45LDcuNiBMMTkuOSw2LjEgTDE5LjksNi4xIFogTTIyLjksNi4xIEwyMS40LDYuMSBMMjEuNCw3LjYgTDIyLjksNy42IEwyMi45LDYuMSBMMjIuOSw2LjEgWiBNMjUuOCw2LjEgTDI0LjMsNi4xIEwyNC4zLDcuNiBMMjUuOCw3LjYgTDI1LjgsNi4xIEwyNS44LDYuMSBaIE0yOC44LDYuMSBMMjcuMyw2LjEgTDI3LjMsNy42IEwyOC44LDcuNiBMMjguOCw2LjEgTDI4LjgsNi4xIFogTTMxLjcsNi4xIEwzMC4yLDYuMSBMMzAuMiw3LjYgTDMxLjcsNy42IEwzMS43LDYuMSBMMzEuNyw2LjEgWiBNMzQuNiw2LjEgTDMzLjEsNi4xIEwzMy4xLDcuNiBMMzQuNiw3LjYgTDM0LjYsNi4xIEwzNC42LDYuMSBaIE0zNy42LDYuMSBMMzYuMSw2LjEgTDM2LjEsNy42IEwzNy42LDcuNiBMMzcuNiw2LjEgTDM3LjYsNi4xIFogTTQwLjUsNi4xIEwzOSw2LjEgTDM5LDcuNiBMNDAuNSw3LjYgTDQwLjUsNi4xIEw0MC41LDYuMSBaIE00My40LDYuMSBMNDEuOSw2LjEgTDQxLjksNy42IEw0My40LDcuNiBMNDMuNCw2LjEgTDQzLjQsNi4xIFogTTQ2LjQsNi4xIEw0NC45LDYuMSBMNDQuOSw3LjYgTDQ2LjQsNy42IEw0Ni40LDYuMSBMNDYuNCw2LjEgWiBNNDkuMyw2LjEgTDQ3LjgsNi4xIEw0Ny44LDcuNiBMNDkuMyw3LjYgTDQ5LjMsNi4xIEw0OS4zLDYuMSBaIE01Mi4yLDYuMSBMNTAuNyw2LjEgTDUwLjcsNy42IEw1Mi4yLDcuNiBMNTIuMiw2LjEgTDUyLjIsNi4xIFogTTU1LjIsNi4xIEw1My43LDYuMSBMNTMuNyw3LjYgTDU1LjIsNy42IEw1NS4yLDYuMSBMNTUuMiw2LjEgWiBNNTguMSw2LjEgTDU2LjYsNi4xIEw1Ni42LDcuNiBMNTguMSw3LjYgTDU4LjEsNi4xIEw1OC4xLDYuMSBaIE02MSw2LjEgTDU5LjUsNi4xIEw1OS41LDcuNiBMNjEsNy42IEw2MSw2LjEgTDYxLDYuMSBaIE02NCw2LjEgTDYyLjUsNi4xIEw2Mi41LDcuNiBMNjQsNy42IEw2NCw2LjEgTDY0LDYuMSBaIE02Ni45LDYuMSBMNjUuNCw2LjEgTDY1LjQsNy42IEw2Ni45LDcuNiBMNjYuOSw2LjEgTDY2LjksNi4xIFogTTMuOCw3LjYgTDIuMyw3LjYgTDIuMyw5LjEgTDMuOCw5LjEgTDMuOCw3LjYgTDMuOCw3LjYgWiBNNi43LDcuNiBMNS4yLDcuNiBMNS4yLDkuMSBMNi43LDkuMSBMNi43LDcuNiBMNi43LDcuNiBaIE05LjcsNy42IEw4LjIsNy42IEw4LjIsOS4xIEw5LjcsOS4xIEw5LjcsNy42IEw5LjcsNy42IFogTTEyLjYsNy42IEwxMS4xLDcuNiBMMTEuMSw5LjEgTDEyLjYsOS4xIEwxMi42LDcuNiBMMTIuNiw3LjYgWiBNMTUuNSw3LjYgTDE0LDcuNiBMMTQsOS4xIEwxNS41LDkuMSBMMTUuNSw3LjYgTDE1LjUsNy42IFogTTE4LjUsNy42IEwxNyw3LjYgTDE3LDkuMSBMMTguNSw5LjEgTDE4LjUsNy42IEwxOC41LDcuNiBaIE0yMS40LDcuNiBMMTkuOSw3LjYgTDE5LjksOS4xIEwyMS40LDkuMSBMMjEuNCw3LjYgTDIxLjQsNy42IFogTTI0LjMsNy42IEwyMi44LDcuNiBMMjIuOCw5LjEgTDI0LjMsOS4xIEwyNC4zLDcuNiBMMjQuMyw3LjYgWiBNMjcuMyw3LjYgTDI1LjgsNy42IEwyNS44LDkuMSBMMjcuMyw5LjEgTDI3LjMsNy42IEwyNy4zLDcuNiBaIE0zMC4yLDcuNiBMMjguNyw3LjYgTDI4LjcsOS4xIEwzMC4yLDkuMSBMMzAuMiw3LjYgTDMwLjIsNy42IFogTTMzLjEsNy42IEwzMS42LDcuNiBMMzEuNiw5LjEgTDMzLjEsOS4xIEwzMy4xLDcuNiBMMzMuMSw3LjYgWiBNMzYuMSw3LjYgTDM0LjYsNy42IEwzNC42LDkuMSBMMzYuMSw5LjEgTDM2LjEsNy42IEwzNi4xLDcuNiBaIE0zOSw3LjYgTDM3LjUsNy42IEwzNy41LDkuMSBMMzksOS4xIEwzOSw3LjYgTDM5LDcuNiBaIE00MS45LDcuNiBMNDAuNCw3LjYgTDQwLjQsOS4xIEw0MS45LDkuMSBMNDEuOSw3LjYgTDQxLjksNy42IFogTTQ0LjksNy42IEw0My40LDcuNiBMNDMuNCw5LjEgTDQ0LjksOS4xIEw0NC45LDcuNiBMNDQuOSw3LjYgWiBNNDcuOCw3LjYgTDQ2LjMsNy42IEw0Ni4zLDkuMSBMNDcuOCw5LjEgTDQ3LjgsNy42IEw0Ny44LDcuNiBaIE01MC44LDcuNiBMNDkuMyw3LjYgTDQ5LjMsOS4xIEw1MC44LDkuMSBMNTAuOCw3LjYgTDUwLjgsNy42IFogTTUzLjcsNy42IEw1Mi4yLDcuNiBMNTIuMiw5LjEgTDUzLjcsOS4xIEw1My43LDcuNiBMNTMuNyw3LjYgWiBNNTYuNiw3LjYgTDU1LjEsNy42IEw1NS4xLDkuMSBMNTYuNiw5LjEgTDU2LjYsNy42IEw1Ni42LDcuNiBaIE01OS42LDcuNiBMNTguMSw3LjYgTDU4LjEsOS4xIEw1OS42LDkuMSBMNTkuNiw3LjYgTDU5LjYsNy42IFogTTYyLjUsNy42IEw2MSw3LjYgTDYxLDkuMSBMNjIuNSw5LjEgTDYyLjUsNy42IEw2Mi41LDcuNiBaIE02NS40LDcuNiBMNjQsNy42IEw2NCw5LjEgTDY1LjUsOS4xIEw2NS41LDcuNiBMNjUuNCw3LjYgWiBNNjguNCw3LjYgTDY2LjksNy42IEw2Ni45LDkuMSBMNjguNCw5LjEgTDY4LjQsNy42IEw2OC40LDcuNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyRTJFMkUiIG1hc2s9InVybCgjbWFzay0xMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTE0IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEzIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfMTNfIj48L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02NC4yLDAgTDQuOCwwIEMyLjQsMCAwLjQsMi4xIDAuNCw0LjcgQzAuNCw3LjMgMi4zLDkuNCA0LjgsOS40IEw2NC4yLDkuNCBDNjYuNiw5LjQgNjguNSw3LjMgNjguNSw0LjcgQzY4LjUsMi4xIDY2LjYsMCA2NC4yLDAgTDY0LjIsMCBaIE02My44LDcuOCBMNS4yLDcuOCBDMy40LDcuOCAyLDYuNCAyLDQuNiBDMiwyLjggMy40LDEuNCA1LjIsMS40IEw2My44LDEuNCBDNjUuNiwxLjQgNjcsMi44IDY3LDQuNiBDNjcsNi40IDY1LjYsNy44IDYzLjgsNy44IEw2My44LDcuOCBaIiBpZD0iU2hhcGUiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMiIgbWFzaz0idXJsKCNtYXNrLTE0KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMTUuMSw3ODcuMiBDMTk3LDc4Ny4yIDE4Mi4zLDgwMS45IDE4Mi4zLDgyMCBDMTgyLjMsODM4LjEgMTk3LDg1Mi44IDIxNS4xLDg1Mi44IEMyMzMuMiw4NTIuOCAyNDgsODM4LjEgMjQ4LDgyMCBDMjQ4LDgwMS45IDIzMy4zLDc4Ny4yIDIxNS4xLDc4Ny4yIEwyMTUuMSw3ODcuMiBaIE0yMTUuMSw4NDkuOCBDMTk4LjYsODQ5LjggMTg1LjMsODM2LjUgMTg1LjMsODIwIEMxODUuMyw4MDMuNSAxOTguNyw3OTAuMiAyMTUuMSw3OTAuMiBDMjMxLjUsNzkwLjIgMjQ1LDgwMy41IDI0NSw4MjAgQzI0NSw4MzYuNSAyMzEuNiw4NDkuOCAyMTUuMSw4NDkuOCBMMjE1LjEsODQ5LjggWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTE1KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTcwLjMsOC41IEMzOC4yLDguNSAxMi4yLDM0LjUgMTIuMiw2Ni42IEwxMi4yLDU3MS43IEwzMjIuNiw4LjUgTDcwLjMsOC41IEw3MC4zLDguNSBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMTYpIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBmaWxsPSIjMDAwMDAwIiB4PSIyNyIgeT0iMTA1IiB3aWR0aD0iMzc1IiBoZWlnaHQ9IjY2NyI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHdpZHRoPSI5NTZweCIgaGVpZ2h0PSI0NzBweCIgdmlld0JveD0iMCAwIDk1NiA0NzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aVBob25lIDYgUGx1czwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ii0wLjAwMzI1ODA1MjI1JSIgeTE9IjQ5Ljk5OTUzNzclIiB4Mj0iOTkuOTkzODA5OSUiIHkyPSI0OS45OTk1Mzc3JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjExLjY5JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMDA1MDkxMDgiIG9mZnNldD0iODcuNjQlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI4LjI1ODUwMDYlIiB5MT0iMTI4Ljg0NTcxNyUiIHgyPSI3MS43NDE0OTkzJSIgeTI9Ii0yOC44NDY3MDA4JSIgaWQ9ImxpbmVhckdyYWRpZW50LTIiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjA1IiBvZmZzZXQ9IjEzLjczJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMDIiIG9mZnNldD0iODguMzElIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ5Ljk5NjY4ODclIiBjeT0iNTAuMDE4NTQzJSIgZng9IjQ5Ljk5NjY4ODclIiBmeT0iNTAuMDE4NTQzJSIgcj0iNDkuOTgwNzk0NyUiIGlkPSJyYWRpYWxHcmFkaWVudC0zIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVENUQ1RiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjUwLjQ0MjE1ODElIiBjeT0iNTcuMTM4NjA2OCUiIGZ4PSI1MC40NDIxNTgxJSIgZnk9IjU3LjEzODYwNjglIiByPSI0OS45NzAxOTg3JSIgaWQ9InJhZGlhbEdyYWRpZW50LTQiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAyMDIwMiIgc3RvcC1vcGFjaXR5PSIwLjQxMTkiIG9mZnNldD0iNTEuNDklIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwOTA5MDkiIHN0b3Atb3BhY2l0eT0iMC41NjAzIiBvZmZzZXQ9IjcwLjAzJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMTQxNDE0IiBzdG9wLW9wYWNpdHk9IjAuNjY2IiBvZmZzZXQ9IjgzLjI1JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjUyNTI1IiBzdG9wLW9wYWNpdHk9IjAuNzUwOSIgb2Zmc2V0PSI5My44NyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzMzMzMzMyIgc3RvcC1vcGFjaXR5PSIwLjgiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPHJhZGlhbEdyYWRpZW50IGN4PSI0Ny41NzE5MjAyJSIgY3k9Ijk2LjQxNzcyMjclIiBmeD0iNDcuNTcxOTIwMiUiIGZ5PSI5Ni40MTc3MjI3JSIgcj0iOTUuNjk3MDEwOSUiIGlkPSJyYWRpYWxHcmFkaWVudC01Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjMiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNTAuNTA0MjI5MyUiIGN5PSIyMy45ODUxMjM4JSIgZng9IjUwLjUwNDIyOTMlIiBmeT0iMjMuOTg1MTIzOCUiIHI9IjU3LjU2NDM1NjQlIiBpZD0icmFkaWFsR3JhZGllbnQtNiI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQ5LjU2NDQzOTclIiB5MT0iOC4zMTgxMTQ2NiUiIHgyPSI0OS41NjYzMyUiIHkyPSIxMTIuMTI4MTE1JSIgaWQ9ImxpbmVhckdyYWRpZW50LTciPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuNiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cGF0aCBpZD0icGF0aC04IiBkPSJNOS4yMiw0LjU4IEw5LjIyLDYzLjIgQzkuMjIsNjUuNTcgNy4zLDY3LjQ5IDQuOTMsNjcuNDkgTDQuOTMsNjcuNDkgQzIuNTYsNjcuNDkgMC42NCw2NS41NyAwLjY0LDYzLjIgTDAuNjQsNC41OCBDMC42NCwyLjIxIDIuNTYsMC4yOSA0LjkzLDAuMjkgTDQuOTMsMC4yOSBDNy4zLDAuMyA5LjIyLDIuMjIgOS4yMiw0LjU4IEw5LjIyLDQuNTggWiI+PC9wYXRoPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iMTAxLjQyMDExOCUiIHkxPSI1MC4xOTczMDQzJSIgeDI9IjEuNDkyNTc4NjclIiB5Mj0iNTAuMTk3MzA0MyUiIGlkPSJsaW5lYXJHcmFkaWVudC0xMCI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyRTJFMzEiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzYxNjE2MSIgb2Zmc2V0PSIyNC40OCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzg1ODU4NSIgb2Zmc2V0PSI4MS4zNyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cGF0aCBpZD0icGF0aC0xMSIgZD0iTTkuMjIsNC41OCBMOS4yMiw2My4yIEM5LjIyLDY1LjU3IDcuMyw2Ny40OSA0LjkzLDY3LjQ5IEw0LjkzLDY3LjQ5IEMyLjU2LDY3LjQ5IDAuNjQsNjUuNTcgMC42NCw2My4yIEwwLjY0LDQuNTggQzAuNjQsMi4yMSAyLjU2LDAuMjkgNC45MywwLjI5IEw0LjkzLDAuMjkgQzcuMywwLjMgOS4yMiwyLjIyIDkuMjIsNC41OCBMOS4yMiw0LjU4IFoiPjwvcGF0aD4KICAgICAgICA8cGF0aCBpZD0icGF0aC0xMyIgZD0iTTkuMjIsNC41OCBMOS4yMiw2My4yIEM5LjIyLDY1LjU3IDcuMyw2Ny40OSA0LjkzLDY3LjQ5IEw0LjkzLDY3LjQ5IEMyLjU2LDY3LjQ5IDAuNjQsNjUuNTcgMC42NCw2My4yIEwwLjY0LDQuNTggQzAuNjQsMi4yMSAyLjU2LDAuMjkgNC45MywwLjI5IEw0LjkzLDAuMjkgQzcuMywwLjMgOS4yMiwyLjIyIDkuMjIsNC41OCBMOS4yMiw0LjU4IFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjkxLjg3NjYzNyUiIHkxPSIxMy42MTU0NDMlIiB4Mj0iOC42MjE4Mzk2JSIgeTI9Ijg1Ljk1MTQxNjElIiBpZD0ibGluZWFyR3JhZGllbnQtMTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1Ljk0OTI4MzkxJSIgeTE9IjIuMjY1MjQ3NzMlIiB4Mj0iNDQuNjE2MjU5NSUiIHkyPSI0MS4yMjE3NzcxJSIgaWQ9ImxpbmVhckdyYWRpZW50LTE2Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjE1IiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJpcGhvbmU2cGx1cy1sYW5kc2NhcGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAwLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDQuNzQsNDY0LjI3IEwxNDQuNzQsNDY3Ljk5IEMxNDQuNzQsNDY5LjAyIDE0My45MSw0NjkuODUgMTQyLjg4LDQ2OS44NSBMMTEyLjkyLDQ2OS44NSBDMTExLjg5LDQ2OS44NSAxMTEuMDYsNDY5LjAyIDExMS4wNiw0NjcuOTkgTDExMS4wNiw0NjQuMjcgTDE0NC43NCw0NjQuMjcgTDE0NC43NCw0NjQuMjcgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xODcuOTcsNDY5Ljg1IEMxODYuOTQsNDY5Ljg1IDE4Ni4xMSw0NjkuMDIgMTg2LjExLDQ2Ny45OSBMMTg2LjExLDQ2NC4yNyBMMjQ3LjI0LDQ2NC4yNyBMMjQ3LjI0LDQ2Ny45OSBDMjQ3LjI0LDQ2OS4wMiAyNDYuNDEsNDY5Ljg1IDI0NS4zOCw0NjkuODUiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjYyLjczLDQ2OS44NSBDMjYxLjcsNDY5Ljg1IDI2MC44Nyw0NjkuMDIgMjYwLjg3LDQ2Ny45OSBMMjYwLjg3LDQ2NC4yNyBMMzIyLDQ2NC4yNyBMMzIyLDQ2Ny45OSBDMzIyLDQ2OS4wMiAzMjEuMTcsNDY5Ljg1IDMyMC4xNCw0NjkuODUiIGlkPSJTaGFwZSIgZmlsbD0iIzgwODA4NiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTg3LjQ3LDUuNzMgTDE4Ny40NywyLjAxIEMxODcuNDcsMC45OCAxODguMywwLjE1IDE4OS4zMywwLjE1IEwyNDYuNzQsMC4xNSBDMjQ3Ljc3LDAuMTUgMjQ4LjYsMC45OCAyNDguNiwyLjAxIEwyNDguNiw1LjczIEwxODcuNDcsNS43MyBMMTg3LjQ3LDUuNzMgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODE4MTg3Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02NS4xOCw0NjcuNDQgQzI5LjM3LDQ2Ny40NCAwLjI0LDQzOC4zMSAwLjI0LDQwMi41MSBMMC4yNCw2OC4wNSBDMC4yNCwzMi4yNCAyOS4zNywzLjExIDY1LjE4LDMuMTEgTDg4OC44MSwzLjExIEM5MjQuNjIsMy4xMSA5NTMuNzUsMzIuMjQgOTUzLjc1LDY4LjA1IEw5NTMuNzUsNDAyLjUgQzk1My43NSw0MzguMzEgOTI0LjYyLDQ2Ny40MyA4ODguODEsNDY3LjQzIEw2NS4xOCw0NjcuNDMgTDY1LjE4LDQ2Ny40NCBaIiBpZD0iU2hhcGUiIHN0cm9rZS1vcGFjaXR5PSIwLjUiIHN0cm9rZT0iIzY2NjY2NiIgZmlsbD0iI0IyQjJCMiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQ4LjU3LDQwMi42OSBDOTQ4LjU3LDQxOC42IDk0Mi4zNyw0MzMuNTYgOTMxLjEyLDQ0NC44MSBDOTE5Ljg3LDQ1Ni4wNiA5MDQuOTEsNDYyLjI2IDg4OSw0NjIuMjYgTDY1LDQ2Mi4yNiBDNDkuMDksNDYyLjI2IDM0LjEzLDQ1Ni4wNiAyMi44OCw0NDQuODEgQzExLjYzLDQzMy41NiA1LjQzLDQxOC42IDUuNDMsNDAyLjY5IEw1LjQzLDY3Ljg2IEM1LjQzLDUxLjk1IDExLjYzLDM2Ljk5IDIyLjg4LDI1Ljc0IEMzNC4xMywxNC40OSA0OS4wOSw4LjI5IDY1LDguMjkgTDg4OSw4LjI5IEM5MDQuOTEsOC4yOSA5MTkuODcsMTQuNDkgOTMxLjEyLDI1Ljc0IEM5NDIuMzcsMzYuOTkgOTQ4LjU3LDUxLjk1IDk0OC41Nyw2Ny44NiBMOTQ4LjU3LDQwMi42OSBMOTQ4LjU3LDQwMi42OSBaIiBpZD0iU2hhcGUiIGZpbGw9IiM0MDQwNDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTk0OC43NSw2OC4wNSBMOTQ4Ljc1LDQwMi41IEM5NDguNzUsNDM1LjYgOTIxLjkyLDQ2Mi40NCA4ODguODEsNDYyLjQ0IEw2NS4xOCw0NjIuNDQgQzMyLjA4LDQ2Mi40NCA1LjI0LDQzNS42MSA1LjI0LDQwMi41IEw1LjI0LDY4LjA1IEM1LjI0LDM0Ljk1IDMyLjA3LDguMTEgNjUuMTgsOC4xMSBMODg4LjgxLDguMTEgQzkyMS45Miw4LjExIDk0OC43NSwzNC45NCA5NDguNzUsNjguMDUgTDk0OC43NSw2OC4wNSBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyNjI2MjYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTUuMjUsNjcuODYgTDUuMjUsNDAyLjY5IEM1LjI1LDQzNS42OSAzMiw0NjIuNDQgNjUsNDYyLjQ0IEw2Ni42NCw0NjIuNDQgQzMzLjY0LDQ2Mi40NCA2Ljg5LDQzNS42OSA2Ljg5LDQwMi42OSBMNi44OSw2Ny44NiBDNi44OSwzNC44NiAzMy42NCw4LjExIDY2LjY0LDguMTEgTDY1LDguMTEgQzMyLDguMTEgNS4yNSwzNC44NiA1LjI1LDY3Ljg2IEw1LjI1LDY3Ljg2IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC44LDY3Ljg2IEw4LjgsNDAyLjY5IEM4LjgsNDMzLjY4IDM0LjAxLDQ1OC44OSA2NSw0NTguODkgTDg4OSw0NTguODkgQzkxOS45OSw0NTguODkgOTQ1LjIsNDMzLjY4IDk0NS4yLDQwMi42OSBMOTQ1LjIsNjcuODYgQzk0NS4yLDM2Ljg3IDkxOS45OSwxMS42NiA4ODksMTEuNjYgTDY1LDExLjY2IEMzNC4wMSwxMS42NiA4LjgsMzYuODcgOC44LDY3Ljg2IEw4LjgsNjcuODYgWiBNODg5LDE3LjY2IEM5MTYuNjgsMTcuNjYgOTM5LjIsNDAuMTggOTM5LjIsNjcuODYgTDkzOS4yLDQwMi42OSBDOTM5LjIsNDMwLjM3IDkxNi42OCw0NTIuODkgODg5LDQ1Mi44OSBMNjUsNDUyLjg5IEMzNy4zMiw0NTIuODkgMTQuOCw0MzAuMzcgMTQuOCw0MDIuNjkgTDE0LjgsNjcuODYgQzE0LjgsNDAuMTggMzcuMzIsMTcuNjYgNjUsMTcuNjYgTDg4OSwxNy42NiBMODg5LDE3LjY2IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0Ni4wMDAwMDAsIDI5NS4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtMykiIGN4PSI4LjE5IiBjeT0iOC4yIiByPSI3LjU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9InVybCgjcmFkaWFsR3JhZGllbnQtNCkiIG9wYWNpdHk9IjAuOCIgY3g9IjguMTkiIGN5PSI4LjIiIHI9IjcuNTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzFCMUExRiIgY3g9IjguMTkiIGN5PSI4LjIiIHI9IjUuMDMiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzM2Mjg0QyIgY3g9IjguMTkiIGN5PSI4LjIiIHI9IjMuNjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC01KSIgY3g9IjguMTkiIGN5PSI4LjIiIHI9IjMuNjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDYuMDAwMDAwKSIgaWQ9IlNoYXBlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNC4yMSwyLjIgQzQuMjEsMy4zMiAzLjMsNC4yMiAyLjE5LDQuMjIgQzEuMDcsNC4yMiAwLjE3LDMuMzEgMC4xNywyLjIgQzAuMTcsMS4wOCAxLjA4LDAuMTggMi4xOSwwLjE4IEMzLjMxLDAuMTggNC4yMSwxLjA5IDQuMjEsMi4yIEw0LjIxLDIuMiBaIiBmaWxsPSIjMTQxNDE0IiBvcGFjaXR5PSIwLjUiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNC4yMSwyLjIgQzQuMjEsMy4zMiAzLjMsNC4yMiAyLjE5LDQuMjIgQzEuMDcsNC4yMiAwLjE3LDMuMzEgMC4xNywyLjIgQzAuMTcsMS4wOCAxLjA4LDAuMTggMi4xOSwwLjE4IEMzLjMxLDAuMTggNC4yMSwxLjA5IDQuMjEsMi4yIEw0LjIxLDIuMiBaIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTYpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC4xOSw2LjY4IEM3Ljc0LDYuNjggNy4zNSw2Ljg4IDcuMDcsNy4xOSBMNy41NCw3LjY2IEM3LjcsNy40NyA3LjkyLDcuMzUgOC4xOCw3LjM1IEM4LjQ1LDcuMzUgOC42OCw3LjQ5IDguODQsNy42OCBMOS4zMSw3LjIgQzkuMDQsNi45IDguNjUsNi42OCA4LjE5LDYuNjggTDguMTksNi42OCBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtNykiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MC4wMDAwMDAsIDIwMS4wMDAwMDApIiBpZD0iQ2xpcHBlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD0ibWFzay05IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtOCI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF84XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05LjIyLDQuNTggTDkuMjIsNjMuMiBDOS4yMiw2NS41NyA3LjMsNjcuNDkgNC45Myw2Ny40OSBMNC45Myw2Ny40OSBDMi41Niw2Ny40OSAwLjY0LDY1LjU3IDAuNjQsNjMuMiBMMC42NCw0LjU4IEMwLjY0LDIuMjEgMi41NiwwLjI5IDQuOTMsMC4yOSBMNC45MywwLjI5IEM3LjMsMC4zIDkuMjIsMi4yMiA5LjIyLDQuNTggTDkuMjIsNC41OCBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMTApIiBvcGFjaXR5PSIwLjgiIG1hc2s9InVybCgjbWFzay05KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF84XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjUzLDY2LjA4IEwwLjUzLDY3LjU1IEwyLDY3LjU1IEwyLDY2LjA4IEwwLjUzLDY2LjA4IEwwLjUzLDY2LjA4IFogTTAuNTMsNjMuMTUgTDAuNTMsNjQuNjIgTDIsNjQuNjIgTDIsNjMuMTUgTDAuNTMsNjMuMTUgTDAuNTMsNjMuMTUgWiBNMC41Myw2MC4yMSBMMC41Myw2MS42OCBMMiw2MS42OCBMMiw2MC4yMSBMMC41Myw2MC4yMSBMMC41Myw2MC4yMSBaIE0wLjUzLDU3LjI4IEwwLjUzLDU4Ljc1IEwyLDU4Ljc1IEwyLDU3LjI4IEwwLjUzLDU3LjI4IEwwLjUzLDU3LjI4IFogTTAuNTMsNTQuMzQgTDAuNTMsNTUuODEgTDIsNTUuODEgTDIsNTQuMzQgTDAuNTMsNTQuMzQgTDAuNTMsNTQuMzQgWiBNMC41Myw1MS40MSBMMC41Myw1Mi44OCBMMiw1Mi44OCBMMiw1MS40MSBMMC41Myw1MS40MSBMMC41Myw1MS40MSBaIE0wLjUzLDQ4LjQ3IEwwLjUzLDQ5Ljk0IEwyLDQ5Ljk0IEwyLDQ4LjQ3IEwwLjUzLDQ4LjQ3IEwwLjUzLDQ4LjQ3IFogTTAuNTMsNDUuNTQgTDAuNTMsNDcuMDEgTDIsNDcuMDEgTDIsNDUuNTQgTDAuNTMsNDUuNTQgTDAuNTMsNDUuNTQgWiBNMC41Myw0Mi42IEwwLjUzLDQ0LjA3IEwyLDQ0LjA3IEwyLDQyLjYgTDAuNTMsNDIuNiBMMC41Myw0Mi42IFogTTAuNTMsMzkuNjcgTDAuNTMsNDEuMTQgTDIsNDEuMTQgTDIsMzkuNjcgTDAuNTMsMzkuNjcgTDAuNTMsMzkuNjcgWiBNMC41MywzNi43MyBMMC41MywzOC4yIEwyLDM4LjIgTDIsMzYuNzMgTDAuNTMsMzYuNzMgTDAuNTMsMzYuNzMgWiBNMC41MywzMy44IEwwLjUzLDM1LjI3IEwyLDM1LjI3IEwyLDMzLjggTDAuNTMsMzMuOCBMMC41MywzMy44IFogTTAuNTMsMzAuODYgTDAuNTMsMzIuMzMgTDIsMzIuMzMgTDIsMzAuODYgTDAuNTMsMzAuODYgTDAuNTMsMzAuODYgWiBNMC41MywyNy45MyBMMC41MywyOS40IEwyLDI5LjQgTDIsMjcuOTMgTDAuNTMsMjcuOTMgTDAuNTMsMjcuOTMgWiBNMC41MywyNC45OSBMMC41MywyNi40NiBMMiwyNi40NiBMMiwyNC45OSBMMC41MywyNC45OSBMMC41MywyNC45OSBaIE0wLjUzLDIyLjA2IEwwLjUzLDIzLjUzIEwyLDIzLjUzIEwyLDIyLjA2IEwwLjUzLDIyLjA2IEwwLjUzLDIyLjA2IFogTTAuNTMsMTkuMTIgTDAuNTMsMjAuNTkgTDIsMjAuNTkgTDIsMTkuMTIgTDAuNTMsMTkuMTIgTDAuNTMsMTkuMTIgWiBNMC41MywxNi4xOSBMMC41MywxNy42NiBMMiwxNy42NiBMMiwxNi4xOSBMMC41MywxNi4xOSBMMC41MywxNi4xOSBaIE0wLjUzLDEzLjI1IEwwLjUzLDE0LjcyIEwyLDE0LjcyIEwyLDEzLjI1IEwwLjUzLDEzLjI1IEwwLjUzLDEzLjI1IFogTTAuNTMsMTAuMzIgTDAuNTMsMTEuNzkgTDIsMTEuNzkgTDIsMTAuMzIgTDAuNTMsMTAuMzIgTDAuNTMsMTAuMzIgWiBNMC41Myw3LjM4IEwwLjUzLDguODUgTDIsOC44NSBMMiw3LjM4IEwwLjUzLDcuMzggTDAuNTMsNy4zOCBaIE0wLjUzLDQuNDUgTDAuNTMsNS45MiBMMiw1LjkyIEwyLDQuNDUgTDAuNTMsNC40NSBMMC41Myw0LjQ1IFogTTAuNTMsMS41MSBMMC41MywyLjk4IEwyLDIuOTggTDIsMS41MSBMMC41MywxLjUxIEwwLjUzLDEuNTEgWiBNMiw2NC42MSBMMiw2Ni4wOCBMMy40Nyw2Ni4wOCBMMy40Nyw2NC42MSBMMiw2NC42MSBMMiw2NC42MSBaIE0yLDYxLjY4IEwyLDYzLjE1IEwzLjQ3LDYzLjE1IEwzLjQ3LDYxLjY4IEwyLDYxLjY4IEwyLDYxLjY4IFogTTIsNTguNzQgTDIsNjAuMjEgTDMuNDcsNjAuMjEgTDMuNDcsNTguNzQgTDIsNTguNzQgTDIsNTguNzQgWiBNMiw1NS44MSBMMiw1Ny4yOCBMMy40Nyw1Ny4yOCBMMy40Nyw1NS44MSBMMiw1NS44MSBMMiw1NS44MSBaIE0yLDUyLjg3IEwyLDU0LjM0IEwzLjQ3LDU0LjM0IEwzLjQ3LDUyLjg3IEwyLDUyLjg3IEwyLDUyLjg3IFogTTIsNDkuOTQgTDIsNTEuNDEgTDMuNDcsNTEuNDEgTDMuNDcsNDkuOTQgTDIsNDkuOTQgTDIsNDkuOTQgWiBNMiw0Ny4wMSBMMiw0OC40OCBMMy40Nyw0OC40OCBMMy40Nyw0Ny4wMSBMMiw0Ny4wMSBMMiw0Ny4wMSBaIE0yLDQ0LjA3IEwyLDQ1LjU0IEwzLjQ3LDQ1LjU0IEwzLjQ3LDQ0LjA3IEwyLDQ0LjA3IEwyLDQ0LjA3IFogTTIsNDEuMTQgTDIsNDIuNjEgTDMuNDcsNDIuNjEgTDMuNDcsNDEuMTQgTDIsNDEuMTQgTDIsNDEuMTQgWiBNMiwzOC4yIEwyLDM5LjY3IEwzLjQ3LDM5LjY3IEwzLjQ3LDM4LjIgTDIsMzguMiBMMiwzOC4yIFogTTIsMzUuMjcgTDIsMzYuNzQgTDMuNDcsMzYuNzQgTDMuNDcsMzUuMjcgTDIsMzUuMjcgTDIsMzUuMjcgWiBNMiwzMi4zMyBMMiwzMy44IEwzLjQ3LDMzLjggTDMuNDcsMzIuMzMgTDIsMzIuMzMgTDIsMzIuMzMgWiBNMiwyOS40IEwyLDMwLjg3IEwzLjQ3LDMwLjg3IEwzLjQ3LDI5LjQgTDIsMjkuNCBMMiwyOS40IFogTTIsMjYuNDYgTDIsMjcuOTMgTDMuNDcsMjcuOTMgTDMuNDcsMjYuNDYgTDIsMjYuNDYgTDIsMjYuNDYgWiBNMiwyMy41MyBMMiwyNSBMMy40NywyNSBMMy40NywyMy41MyBMMiwyMy41MyBMMiwyMy41MyBaIE0yLDIwLjU5IEwyLDIyLjA2IEwzLjQ3LDIyLjA2IEwzLjQ3LDIwLjU5IEwyLDIwLjU5IEwyLDIwLjU5IFogTTIsMTcuNjYgTDIsMTkuMTMgTDMuNDcsMTkuMTMgTDMuNDcsMTcuNjYgTDIsMTcuNjYgTDIsMTcuNjYgWiBNMiwxNC43MiBMMiwxNi4xOSBMMy40NywxNi4xOSBMMy40NywxNC43MiBMMiwxNC43MiBMMiwxNC43MiBaIE0yLDExLjc5IEwyLDEzLjI2IEwzLjQ3LDEzLjI2IEwzLjQ3LDExLjc5IEwyLDExLjc5IEwyLDExLjc5IFogTTIsOC44NSBMMiwxMC4zMiBMMy40NywxMC4zMiBMMy40Nyw4Ljg1IEwyLDguODUgTDIsOC44NSBaIE0yLDUuOTIgTDIsNy4zOSBMMy40Nyw3LjM5IEwzLjQ3LDUuOTIgTDIsNS45MiBMMiw1LjkyIFogTTIsMi45OCBMMiw0LjQ1IEwzLjQ3LDQuNDUgTDMuNDcsMi45OCBMMiwyLjk4IEwyLDIuOTggWiBNMiwwLjA1IEwyLDEuNTIgTDMuNDcsMS41MiBMMy40NywwLjA1IEwyLDAuMDUgTDIsMC4wNSBaIE0zLjQ2LDY2LjA4IEwzLjQ2LDY3LjU1IEw0LjkzLDY3LjU1IEw0LjkzLDY2LjA4IEwzLjQ2LDY2LjA4IEwzLjQ2LDY2LjA4IFogTTMuNDYsNjMuMTUgTDMuNDYsNjQuNjIgTDQuOTMsNjQuNjIgTDQuOTMsNjMuMTUgTDMuNDYsNjMuMTUgTDMuNDYsNjMuMTUgWiBNMy40Niw2MC4yMSBMMy40Niw2MS42OCBMNC45Myw2MS42OCBMNC45Myw2MC4yMSBMMy40Niw2MC4yMSBMMy40Niw2MC4yMSBaIE0zLjQ2LDU3LjI4IEwzLjQ2LDU4Ljc1IEw0LjkzLDU4Ljc1IEw0LjkzLDU3LjI4IEwzLjQ2LDU3LjI4IEwzLjQ2LDU3LjI4IFogTTMuNDYsNTQuMzQgTDMuNDYsNTUuODEgTDQuOTMsNTUuODEgTDQuOTMsNTQuMzQgTDMuNDYsNTQuMzQgTDMuNDYsNTQuMzQgWiBNMy40Niw1MS40MSBMMy40Niw1Mi44OCBMNC45Myw1Mi44OCBMNC45Myw1MS40MSBMMy40Niw1MS40MSBMMy40Niw1MS40MSBaIE0zLjQ2LDQ4LjQ3IEwzLjQ2LDQ5Ljk0IEw0LjkzLDQ5Ljk0IEw0LjkzLDQ4LjQ3IEwzLjQ2LDQ4LjQ3IEwzLjQ2LDQ4LjQ3IFogTTMuNDYsNDUuNTQgTDMuNDYsNDcuMDEgTDQuOTMsNDcuMDEgTDQuOTMsNDUuNTQgTDMuNDYsNDUuNTQgTDMuNDYsNDUuNTQgWiBNMy40Niw0Mi42IEwzLjQ2LDQ0LjA3IEw0LjkzLDQ0LjA3IEw0LjkzLDQyLjYgTDMuNDYsNDIuNiBMMy40Niw0Mi42IFogTTMuNDYsMzkuNjcgTDMuNDYsNDEuMTQgTDQuOTMsNDEuMTQgTDQuOTMsMzkuNjcgTDMuNDYsMzkuNjcgTDMuNDYsMzkuNjcgWiBNMy40NiwzNi43MyBMMy40NiwzOC4yIEw0LjkzLDM4LjIgTDQuOTMsMzYuNzMgTDMuNDYsMzYuNzMgTDMuNDYsMzYuNzMgWiBNMy40NiwzMy44IEwzLjQ2LDM1LjI3IEw0LjkzLDM1LjI3IEw0LjkzLDMzLjggTDMuNDYsMzMuOCBMMy40NiwzMy44IFogTTMuNDYsMzAuODYgTDMuNDYsMzIuMzMgTDQuOTMsMzIuMzMgTDQuOTMsMzAuODYgTDMuNDYsMzAuODYgTDMuNDYsMzAuODYgWiBNMy40NiwyNy45MyBMMy40NiwyOS40IEw0LjkzLDI5LjQgTDQuOTMsMjcuOTMgTDMuNDYsMjcuOTMgTDMuNDYsMjcuOTMgWiBNMy40NiwyNC45OSBMMy40NiwyNi40NiBMNC45MywyNi40NiBMNC45MywyNC45OSBMMy40NiwyNC45OSBMMy40NiwyNC45OSBaIE0zLjQ2LDIyLjA2IEwzLjQ2LDIzLjUzIEw0LjkzLDIzLjUzIEw0LjkzLDIyLjA2IEwzLjQ2LDIyLjA2IEwzLjQ2LDIyLjA2IFogTTMuNDYsMTkuMTIgTDMuNDYsMjAuNTkgTDQuOTMsMjAuNTkgTDQuOTMsMTkuMTIgTDMuNDYsMTkuMTIgTDMuNDYsMTkuMTIgWiBNMy40NiwxNi4xOSBMMy40NiwxNy42NiBMNC45MywxNy42NiBMNC45MywxNi4xOSBMMy40NiwxNi4xOSBMMy40NiwxNi4xOSBaIE0zLjQ2LDEzLjI1IEwzLjQ2LDE0LjcyIEw0LjkzLDE0LjcyIEw0LjkzLDEzLjI1IEwzLjQ2LDEzLjI1IEwzLjQ2LDEzLjI1IFogTTMuNDYsMTAuMzIgTDMuNDYsMTEuNzkgTDQuOTMsMTEuNzkgTDQuOTMsMTAuMzIgTDMuNDYsMTAuMzIgTDMuNDYsMTAuMzIgWiBNMy40Niw3LjM4IEwzLjQ2LDguODUgTDQuOTMsOC44NSBMNC45Myw3LjM4IEwzLjQ2LDcuMzggTDMuNDYsNy4zOCBaIE0zLjQ2LDQuNDUgTDMuNDYsNS45MiBMNC45Myw1LjkyIEw0LjkzLDQuNDUgTDMuNDYsNC40NSBMMy40Niw0LjQ1IFogTTMuNDYsMS41MSBMMy40NiwyLjk4IEw0LjkzLDIuOTggTDQuOTMsMS41MSBMMy40NiwxLjUxIEwzLjQ2LDEuNTEgWiBNNC45Myw2NC42MSBMNC45Myw2Ni4wOCBMNi40LDY2LjA4IEw2LjQsNjQuNjEgTDQuOTMsNjQuNjEgTDQuOTMsNjQuNjEgWiBNNC45Myw2MS42OCBMNC45Myw2My4xNSBMNi40LDYzLjE1IEw2LjQsNjEuNjggTDQuOTMsNjEuNjggTDQuOTMsNjEuNjggWiBNNC45Myw1OC43NCBMNC45Myw2MC4yMSBMNi40LDYwLjIxIEw2LjQsNTguNzQgTDQuOTMsNTguNzQgTDQuOTMsNTguNzQgWiBNNC45Myw1NS44MSBMNC45Myw1Ny4yOCBMNi40LDU3LjI4IEw2LjQsNTUuODEgTDQuOTMsNTUuODEgTDQuOTMsNTUuODEgWiBNNC45Myw1Mi44NyBMNC45Myw1NC4zNCBMNi40LDU0LjM0IEw2LjQsNTIuODcgTDQuOTMsNTIuODcgTDQuOTMsNTIuODcgWiBNNC45Myw0OS45NCBMNC45Myw1MS40MSBMNi40LDUxLjQxIEw2LjQsNDkuOTQgTDQuOTMsNDkuOTQgTDQuOTMsNDkuOTQgWiBNNC45Myw0Ny4wMSBMNC45Myw0OC40OCBMNi40LDQ4LjQ4IEw2LjQsNDcuMDEgTDQuOTMsNDcuMDEgTDQuOTMsNDcuMDEgWiBNNC45Myw0NC4wNyBMNC45Myw0NS41NCBMNi40LDQ1LjU0IEw2LjQsNDQuMDcgTDQuOTMsNDQuMDcgTDQuOTMsNDQuMDcgWiBNNC45Myw0MS4xNCBMNC45Myw0Mi42MSBMNi40LDQyLjYxIEw2LjQsNDEuMTQgTDQuOTMsNDEuMTQgTDQuOTMsNDEuMTQgWiBNNC45MywzOC4yIEw0LjkzLDM5LjY3IEw2LjQsMzkuNjcgTDYuNCwzOC4yIEw0LjkzLDM4LjIgTDQuOTMsMzguMiBaIE00LjkzLDM1LjI3IEw0LjkzLDM2Ljc0IEw2LjQsMzYuNzQgTDYuNCwzNS4yNyBMNC45MywzNS4yNyBMNC45MywzNS4yNyBaIE00LjkzLDMyLjMzIEw0LjkzLDMzLjggTDYuNCwzMy44IEw2LjQsMzIuMzMgTDQuOTMsMzIuMzMgTDQuOTMsMzIuMzMgWiBNNC45MywyOS40IEw0LjkzLDMwLjg3IEw2LjQsMzAuODcgTDYuNCwyOS40IEw0LjkzLDI5LjQgTDQuOTMsMjkuNCBaIE00LjkzLDI2LjQ2IEw0LjkzLDI3LjkzIEw2LjQsMjcuOTMgTDYuNCwyNi40NiBMNC45MywyNi40NiBMNC45MywyNi40NiBaIE00LjkzLDIzLjUzIEw0LjkzLDI1IEw2LjQsMjUgTDYuNCwyMy41MyBMNC45MywyMy41MyBMNC45MywyMy41MyBaIE00LjkzLDIwLjU5IEw0LjkzLDIyLjA2IEw2LjQsMjIuMDYgTDYuNCwyMC41OSBMNC45MywyMC41OSBMNC45MywyMC41OSBaIE00LjkzLDE3LjY2IEw0LjkzLDE5LjEzIEw2LjQsMTkuMTMgTDYuNCwxNy42NiBMNC45MywxNy42NiBMNC45MywxNy42NiBaIE00LjkzLDE0LjcyIEw0LjkzLDE2LjE5IEw2LjQsMTYuMTkgTDYuNCwxNC43MiBMNC45MywxNC43MiBMNC45MywxNC43MiBaIE00LjkzLDExLjc5IEw0LjkzLDEzLjI2IEw2LjQsMTMuMjYgTDYuNCwxMS43OSBMNC45MywxMS43OSBMNC45MywxMS43OSBaIE00LjkzLDguODUgTDQuOTMsMTAuMzIgTDYuNCwxMC4zMiBMNi40LDguODUgTDQuOTMsOC44NSBMNC45Myw4Ljg1IFogTTQuOTMsNS45MiBMNC45Myw3LjM5IEw2LjQsNy4zOSBMNi40LDUuOTIgTDQuOTMsNS45MiBMNC45Myw1LjkyIFogTTQuOTMsMi45OCBMNC45Myw0LjQ1IEw2LjQsNC40NSBMNi40LDIuOTggTDQuOTMsMi45OCBMNC45MywyLjk4IFogTTQuOTMsMC4wNSBMNC45MywxLjUyIEw2LjQsMS41MiBMNi40LDAuMDUgTDQuOTMsMC4wNSBMNC45MywwLjA1IFogTTYuNCw2Ni4wOCBMNi40LDY3LjU1IEw3Ljg3LDY3LjU1IEw3Ljg3LDY2LjA4IEw2LjQsNjYuMDggTDYuNCw2Ni4wOCBaIE02LjQsNjMuMTUgTDYuNCw2NC42MiBMNy44Nyw2NC42MiBMNy44Nyw2My4xNSBMNi40LDYzLjE1IEw2LjQsNjMuMTUgWiBNNi40LDYwLjIxIEw2LjQsNjEuNjggTDcuODcsNjEuNjggTDcuODcsNjAuMjEgTDYuNCw2MC4yMSBMNi40LDYwLjIxIFogTTYuNCw1Ny4yOCBMNi40LDU4Ljc1IEw3Ljg3LDU4Ljc1IEw3Ljg3LDU3LjI4IEw2LjQsNTcuMjggTDYuNCw1Ny4yOCBaIE02LjQsNTQuMzQgTDYuNCw1NS44MSBMNy44Nyw1NS44MSBMNy44Nyw1NC4zNCBMNi40LDU0LjM0IEw2LjQsNTQuMzQgWiBNNi40LDUxLjQxIEw2LjQsNTIuODggTDcuODcsNTIuODggTDcuODcsNTEuNDEgTDYuNCw1MS40MSBMNi40LDUxLjQxIFogTTYuNCw0OC40NyBMNi40LDQ5Ljk0IEw3Ljg3LDQ5Ljk0IEw3Ljg3LDQ4LjQ3IEw2LjQsNDguNDcgTDYuNCw0OC40NyBaIE02LjQsNDUuNTQgTDYuNCw0Ny4wMSBMNy44Nyw0Ny4wMSBMNy44Nyw0NS41NCBMNi40LDQ1LjU0IEw2LjQsNDUuNTQgWiBNNi40LDQyLjYgTDYuNCw0NC4wNyBMNy44Nyw0NC4wNyBMNy44Nyw0Mi42IEw2LjQsNDIuNiBMNi40LDQyLjYgWiBNNi40LDM5LjY3IEw2LjQsNDEuMTQgTDcuODcsNDEuMTQgTDcuODcsMzkuNjcgTDYuNCwzOS42NyBMNi40LDM5LjY3IFogTTYuNCwzNi43MyBMNi40LDM4LjIgTDcuODcsMzguMiBMNy44NywzNi43MyBMNi40LDM2LjczIEw2LjQsMzYuNzMgWiBNNi40LDMzLjggTDYuNCwzNS4yNyBMNy44NywzNS4yNyBMNy44NywzMy44IEw2LjQsMzMuOCBMNi40LDMzLjggWiBNNi40LDMwLjg2IEw2LjQsMzIuMzMgTDcuODcsMzIuMzMgTDcuODcsMzAuODYgTDYuNCwzMC44NiBMNi40LDMwLjg2IFogTTYuNCwyNy45MyBMNi40LDI5LjQgTDcuODcsMjkuNCBMNy44NywyNy45MyBMNi40LDI3LjkzIEw2LjQsMjcuOTMgWiBNNi40LDI0Ljk5IEw2LjQsMjYuNDYgTDcuODcsMjYuNDYgTDcuODcsMjQuOTkgTDYuNCwyNC45OSBMNi40LDI0Ljk5IFogTTYuNCwyMi4wNiBMNi40LDIzLjUzIEw3Ljg3LDIzLjUzIEw3Ljg3LDIyLjA2IEw2LjQsMjIuMDYgTDYuNCwyMi4wNiBaIE02LjQsMTkuMTIgTDYuNCwyMC41OSBMNy44NywyMC41OSBMNy44NywxOS4xMiBMNi40LDE5LjEyIEw2LjQsMTkuMTIgWiBNNi40LDE2LjE5IEw2LjQsMTcuNjYgTDcuODcsMTcuNjYgTDcuODcsMTYuMTkgTDYuNCwxNi4xOSBMNi40LDE2LjE5IFogTTYuNCwxMy4yNSBMNi40LDE0LjcyIEw3Ljg3LDE0LjcyIEw3Ljg3LDEzLjI1IEw2LjQsMTMuMjUgTDYuNCwxMy4yNSBaIE02LjQsMTAuMzIgTDYuNCwxMS43OSBMNy44NywxMS43OSBMNy44NywxMC4zMiBMNi40LDEwLjMyIEw2LjQsMTAuMzIgWiBNNi40LDcuMzggTDYuNCw4Ljg1IEw3Ljg3LDguODUgTDcuODcsNy4zOCBMNi40LDcuMzggTDYuNCw3LjM4IFogTTYuNCw0LjQ1IEw2LjQsNS45MiBMNy44Nyw1LjkyIEw3Ljg3LDQuNDUgTDYuNCw0LjQ1IEw2LjQsNC40NSBaIE02LjQsMS41MSBMNi40LDIuOTggTDcuODcsMi45OCBMNy44NywxLjUxIEw2LjQsMS41MSBMNi40LDEuNTEgWiBNNy44Nyw2NC42MSBMNy44Nyw2Ni4wOCBMOS4zNCw2Ni4wOCBMOS4zNCw2NC42MSBMNy44Nyw2NC42MSBMNy44Nyw2NC42MSBaIE03Ljg3LDYxLjY4IEw3Ljg3LDYzLjE1IEw5LjM0LDYzLjE1IEw5LjM0LDYxLjY4IEw3Ljg3LDYxLjY4IEw3Ljg3LDYxLjY4IFogTTcuODcsNTguNzQgTDcuODcsNjAuMjEgTDkuMzQsNjAuMjEgTDkuMzQsNTguNzQgTDcuODcsNTguNzQgTDcuODcsNTguNzQgWiBNNy44Nyw1NS44MSBMNy44Nyw1Ny4yOCBMOS4zNCw1Ny4yOCBMOS4zNCw1NS44MSBMNy44Nyw1NS44MSBMNy44Nyw1NS44MSBaIE03Ljg3LDUyLjg3IEw3Ljg3LDU0LjM0IEw5LjM0LDU0LjM0IEw5LjM0LDUyLjg3IEw3Ljg3LDUyLjg3IEw3Ljg3LDUyLjg3IFogTTcuODcsNDkuOTQgTDcuODcsNTEuNDEgTDkuMzQsNTEuNDEgTDkuMzQsNDkuOTQgTDcuODcsNDkuOTQgTDcuODcsNDkuOTQgWiBNNy44Nyw0Ny4wMSBMNy44Nyw0OC40OCBMOS4zNCw0OC40OCBMOS4zNCw0Ny4wMSBMNy44Nyw0Ny4wMSBMNy44Nyw0Ny4wMSBaIE03Ljg3LDQ0LjA3IEw3Ljg3LDQ1LjU0IEw5LjM0LDQ1LjU0IEw5LjM0LDQ0LjA3IEw3Ljg3LDQ0LjA3IEw3Ljg3LDQ0LjA3IFogTTcuODcsNDEuMTQgTDcuODcsNDIuNjEgTDkuMzQsNDIuNjEgTDkuMzQsNDEuMTQgTDcuODcsNDEuMTQgTDcuODcsNDEuMTQgWiBNNy44NywzOC4yIEw3Ljg3LDM5LjY3IEw5LjM0LDM5LjY3IEw5LjM0LDM4LjIgTDcuODcsMzguMiBMNy44NywzOC4yIFogTTcuODcsMzUuMjcgTDcuODcsMzYuNzQgTDkuMzQsMzYuNzQgTDkuMzQsMzUuMjcgTDcuODcsMzUuMjcgTDcuODcsMzUuMjcgWiBNNy44NywzMi4zMyBMNy44NywzMy44IEw5LjM0LDMzLjggTDkuMzQsMzIuMzMgTDcuODcsMzIuMzMgTDcuODcsMzIuMzMgWiBNNy44NywyOS40IEw3Ljg3LDMwLjg3IEw5LjM0LDMwLjg3IEw5LjM0LDI5LjQgTDcuODcsMjkuNCBMNy44NywyOS40IFogTTcuODcsMjYuNDYgTDcuODcsMjcuOTMgTDkuMzQsMjcuOTMgTDkuMzQsMjYuNDYgTDcuODcsMjYuNDYgTDcuODcsMjYuNDYgWiBNNy44NywyMy41MyBMNy44NywyNSBMOS4zNCwyNSBMOS4zNCwyMy41MyBMNy44NywyMy41MyBMNy44NywyMy41MyBaIE03Ljg3LDIwLjU5IEw3Ljg3LDIyLjA2IEw5LjM0LDIyLjA2IEw5LjM0LDIwLjU5IEw3Ljg3LDIwLjU5IEw3Ljg3LDIwLjU5IFogTTcuODcsMTcuNjYgTDcuODcsMTkuMTMgTDkuMzQsMTkuMTMgTDkuMzQsMTcuNjYgTDcuODcsMTcuNjYgTDcuODcsMTcuNjYgWiBNNy44NywxNC43MiBMNy44NywxNi4xOSBMOS4zNCwxNi4xOSBMOS4zNCwxNC43MiBMNy44NywxNC43MiBMNy44NywxNC43MiBaIE03Ljg3LDExLjc5IEw3Ljg3LDEzLjI2IEw5LjM0LDEzLjI2IEw5LjM0LDExLjc5IEw3Ljg3LDExLjc5IEw3Ljg3LDExLjc5IFogTTcuODcsOC44NSBMNy44NywxMC4zMiBMOS4zNCwxMC4zMiBMOS4zNCw4Ljg1IEw3Ljg3LDguODUgTDcuODcsOC44NSBaIE03Ljg3LDUuOTIgTDcuODcsNy4zOSBMOS4zNCw3LjM5IEw5LjM0LDUuOTIgTDcuODcsNS45MiBMNy44Nyw1LjkyIFogTTcuODcsMi45OCBMNy44Nyw0LjQ1IEw5LjM0LDQuNDUgTDkuMzQsMi45OCBMNy44NywyLjk4IEw3Ljg3LDIuOTggWiBNNy44NywwLjA1IEw3Ljg3LDEuNTIgTDkuMzQsMS41MiBMOS4zNCwwLjA1IEw3Ljg3LDAuMDUgTDcuODcsMC4wNSBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyRTJFMkUiIG1hc2s9InVybCgjbWFzay0xMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTE0IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMTMiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFzaz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfOF8iPjwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yOSw0LjE3IEwwLjI5LDYzLjYxIEMwLjI5LDY2LjAxIDIuMzcsNjcuOTYgNC45NCw2Ny45NiBDNy41MSw2Ny45NiA5LjU5LDY2LjAxIDkuNTksNjMuNjEgTDkuNTksNC4xNyBDOS41OSwxLjc3IDcuNTEsLTAuMTggNC45NCwtMC4xOCBDMi4zNywtMC4xOCAwLjI5LDEuNzcgMC4yOSw0LjE3IEwwLjI5LDQuMTcgWiBNOC4xMyw0LjU4IEw4LjEzLDYzLjIgQzguMTMsNjQuOTYgNi43LDY2LjQgNC45Myw2Ni40IEMzLjE2LDY2LjQgMS43Myw2NC45NyAxLjczLDYzLjIgTDEuNzMsNC41OCBDMS43MywyLjgyIDMuMTYsMS4zOCA0LjkzLDEuMzggQzYuNywxLjM4IDguMTMsMi44MiA4LjEzLDQuNTggTDguMTMsNC41OCBaIiBpZD0iU2hhcGUiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMiIgbWFzaz0idXJsKCNtYXNrLTE0KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04NjUuNTMsMjM1LjI3IEM4NjUuNTMsMjUzLjQgODgwLjIzLDI2OC4xIDg5OC4zNiwyNjguMSBDOTE2LjQ5LDI2OC4xIDkzMS4xOSwyNTMuNCA5MzEuMTksMjM1LjI3IEM5MzEuMTksMjE3LjE0IDkxNi40OSwyMDIuNDQgODk4LjM2LDIwMi40NCBDODgwLjIzLDIwMi40NSA4NjUuNTMsMjE3LjE0IDg2NS41MywyMzUuMjcgTDg2NS41MywyMzUuMjcgWiBNOTI4LjE4LDIzNS4yNyBDOTI4LjE4LDI1MS43NCA5MTQuODMsMjY1LjA5IDg5OC4zNiwyNjUuMDkgQzg4MS44OSwyNjUuMDkgODY4LjU0LDI1MS43NCA4NjguNTQsMjM1LjI3IEM4NjguNTQsMjE4LjggODgxLjg5LDIwNS40NSA4OTguMzYsMjA1LjQ1IEM5MTQuODMsMjA1LjQ1IDkyOC4xOCwyMTguOCA5MjguMTgsMjM1LjI3IEw5MjguMTgsMjM1LjI3IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xNSkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY1LjE4LDguMTEgQzMyLjA4LDguMTEgNS4yNCwzNC45NCA1LjI0LDY4LjA1IEw1LjI0LDQwMi41IEM1LjI0LDQzNS42IDMyLjA3LDQ2Mi40NCA2NS4xOCw0NjIuNDQgTDMzNC42NCw0NjIuNDQgTDU5OC43NCw4LjExIEw2NS4xOCw4LjExIEw2NS4xOCw4LjExIFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xNikiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzAwMDAwMCIgeD0iMTA4LjY5IiB5PSIyOC44MSIgd2lkdGg9IjczNiIgaGVpZ2h0PSI0MTQiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHdpZHRoPSI0NzBweCIgaGVpZ2h0PSI5NTRweCIgdmlld0JveD0iMCAwIDQ3MCA5NTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aVBob25lIDYgUGx1czwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjUwLjAwMDQ0MDIlIiB5MT0iLTAuMDA3NjU1OTcwMDMlIiB4Mj0iNTAuMDAwNDQwMiUiIHkyPSI5OS45ODg3NjA0JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjExLjY5JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMDA1MDkxMDgiIG9mZnNldD0iODcuNjQlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ii0yOC44NDU3NjE3JSIgeTE9IjI4LjI1OTIzNzUlIiB4Mj0iMTI4Ljg0NjY1NiUiIHkyPSI3MS43NDIyNTc2JSIgaWQ9ImxpbmVhckdyYWRpZW50LTIiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjA1IiBvZmZzZXQ9IjEzLjczJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMDIiIG9mZnNldD0iODguMzElIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4xNSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjQ5Ljk4MTQ1NyUiIGN5PSI0OS45NzY4MjEyJSIgZng9IjQ5Ljk4MTQ1NyUiIGZ5PSI0OS45NzY4MjEyJSIgcj0iNDkuOTgwNzk0NyUiIGlkPSJyYWRpYWxHcmFkaWVudC0zIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzVENUQ1RiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMzMzMzMzIiBzdG9wLW9wYWNpdHk9IjAuOCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjUwLjQyNjY2NCUiIGN5PSI1Ny4wOTY2MTA1JSIgZng9IjUwLjQyNjY2NCUiIGZ5PSI1Ny4wOTY2MTA1JSIgcj0iNDkuOTcwMTk4NyUiIGlkPSJyYWRpYWxHcmFkaWVudC00Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMjAyMDIiIHN0b3Atb3BhY2l0eT0iMC40MTE5IiBvZmZzZXQ9IjUxLjQ5JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDkwOTA5IiBzdG9wLW9wYWNpdHk9IjAuNTYwMyIgb2Zmc2V0PSI3MC4wMyUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzE0MTQxNCIgc3RvcC1vcGFjaXR5PSIwLjY2NiIgb2Zmc2V0PSI4My4yNSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzI1MjUyNSIgc3RvcC1vcGFjaXR5PSIwLjc1MDkiIG9mZnNldD0iOTMuODclIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzMzMzMzMiIHN0b3Atb3BhY2l0eT0iMC44IiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L3JhZGlhbEdyYWRpZW50PgogICAgICAgIDxyYWRpYWxHcmFkaWVudCBjeD0iNDcuNjU2NDM0MiUiIGN5PSI5Ni4yOTY3MDc1JSIgZng9IjQ3LjY1NjQzNDIlIiBmeT0iOTYuMjk2NzA3NSUiIHI9Ijk1LjY5NzAxMDklIiBpZD0icmFkaWFsR3JhZGllbnQtNSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4zIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjUwLjY2MDY3MTQlIiBjeT0iMjMuNzY2MjAwOSUiIGZ4PSI1MC42NjA2NzE0JSIgZnk9IjIzLjc2NjIwMDklIiByPSI1Ny41NjQzNTY0JSIgaWQ9InJhZGlhbEdyYWRpZW50LTYiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI0OS44NDY2OTQxJSIgeTE9IjcuNDExMDE0MTUlIiB4Mj0iNDkuODQ4NTg0NiUiIHkyPSIxMTEuMjMxMDE0JSIgaWQ9ImxpbmVhckdyYWRpZW50LTciPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuNiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8cGF0aCBpZD0icGF0aC04IiBkPSJNNjMuNDIsOS4wMiBMNC44LDkuMDIgQzIuNDMsOS4wMiAwLjUxLDcuMSAwLjUxLDQuNzMgTDAuNTEsNC43MyBDMC41MSwyLjM2IDIuNDMsMC40NCA0LjgsMC40NCBMNjMuNDIsMC40NCBDNjUuNzksMC40NCA2Ny43MSwyLjM2IDY3LjcxLDQuNzMgTDY3LjcxLDQuNzMgQzY3LjcsNy4xIDY1Ljc4LDkuMDIgNjMuNDIsOS4wMiBMNjMuNDIsOS4wMiBaIj48L3BhdGg+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1MC4wMTA1MTQxJSIgeTE9Ijk5LjkwODQyMTglIiB4Mj0iNTAuMDEwNTE0MSUiIHkyPSItMC4wMTc5NzAxNjMyJSIgaWQ9ImxpbmVhckdyYWRpZW50LTEwIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzJFMkUzMSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjNjE2MTYxIiBvZmZzZXQ9IjI0LjQ4JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjODU4NTg1IiBvZmZzZXQ9IjgxLjM3JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMkUyRTMxIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxwYXRoIGlkPSJwYXRoLTExIiBkPSJNNjMuNDIsOS4wMiBMNC44LDkuMDIgQzIuNDMsOS4wMiAwLjUxLDcuMSAwLjUxLDQuNzMgTDAuNTEsNC43MyBDMC41MSwyLjM2IDIuNDMsMC40NCA0LjgsMC40NCBMNjMuNDIsMC40NCBDNjUuNzksMC40NCA2Ny43MSwyLjM2IDY3LjcxLDQuNzMgTDY3LjcxLDQuNzMgQzY3LjcsNy4xIDY1Ljc4LDkuMDIgNjMuNDIsOS4wMiBMNjMuNDIsOS4wMiBaIj48L3BhdGg+CiAgICAgICAgPHBhdGggaWQ9InBhdGgtMTMiIGQ9Ik02My40Miw5LjAyIEw0LjgsOS4wMiBDMi40Myw5LjAyIDAuNTEsNy4xIDAuNTEsNC43MyBMMC41MSw0LjczIEMwLjUxLDIuMzYgMi40MywwLjQ0IDQuOCwwLjQ0IEw2My40MiwwLjQ0IEM2NS43OSwwLjQ0IDY3LjcxLDIuMzYgNjcuNzEsNC43MyBMNjcuNzEsNC43MyBDNjcuNyw3LjEgNjUuNzgsOS4wMiA2My40Miw5LjAyIEw2My40Miw5LjAyIFoiPjwvcGF0aD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ijg2LjM4NDI1MjIlIiB5MT0iOTEuODcxOTE1OSUiIHgyPSIxNC4wNDg0MzEzJSIgeTI9IjguNjE3NDIzMDklIiBpZD0ibGluZWFyR3JhZGllbnQtMTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMyIgb2Zmc2V0PSIxNC43JSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAiIG9mZnNldD0iNDAuNzMlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIHN0b3Atb3BhY2l0eT0iMC4wMDUwOTEwOCIgb2Zmc2V0PSI3NC40NSUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwLjIiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSItMzQuMTYzNTc0MyUiIHkxPSItMi4wOTQwOTE3NSUiIHgyPSIyOC44NDc4Mjg5JSIgeTI9IjM2LjkwNzQ3MDUlIiBpZD0ibGluZWFyR3JhZGllbnQtMTYiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRkZGRkZGIiBzdG9wLW9wYWNpdHk9IjAuMTUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRkZGRiIgc3RvcC1vcGFjaXR5PSIwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImlwaG9uZTZwbHVzLXBvcnRyYWl0Ij4KICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01LjczLDE0NC41NCBMMi4wMSwxNDQuNTQgQzAuOTgsMTQ0LjU0IDAuMTUsMTQzLjcxIDAuMTUsMTQyLjY4IEwwLjE1LDExMi43MiBDMC4xNSwxMTEuNjkgMC45OCwxMTAuODYgMi4wMSwxMTAuODYgTDUuNzMsMTEwLjg2IEw1LjczLDE0NC41NCBMNS43MywxNDQuNTQgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4xNSwxODcuNzcgQzAuMTUsMTg2Ljc0IDAuOTgsMTg1LjkxIDIuMDEsMTg1LjkxIEw1LjczLDE4NS45MSBMNS43MywyNDcuMDQgTDIuMDEsMjQ3LjA0IEMwLjk4LDI0Ny4wNCAwLjE1LDI0Ni4yMSAwLjE1LDI0NS4xOCIgaWQ9IlNoYXBlIiBmaWxsPSIjODA4MDg2Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4xNSwyNjIuNTMgQzAuMTUsMjYxLjUgMC45OCwyNjAuNjcgMi4wMSwyNjAuNjcgTDUuNzMsMjYwLjY3IEw1LjczLDMyMS44IEwyLjAxLDMyMS44IEMwLjk4LDMyMS44IDAuMTUsMzIwLjk3IDAuMTUsMzE5Ljk0IiBpZD0iU2hhcGUiIGZpbGw9IiM4MDgwODYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00NjQuMjcsMTg3LjI3IEw0NjcuOTksMTg3LjI3IEM0NjkuMDIsMTg3LjI3IDQ2OS44NSwxODguMSA0NjkuODUsMTg5LjEzIEw0NjkuODUsMjQ2LjU0IEM0NjkuODUsMjQ3LjU3IDQ2OS4wMiwyNDguNCA0NjcuOTksMjQ4LjQgTDQ2NC4yNywyNDguNCBMNDY0LjI3LDE4Ny4yNyBMNDY0LjI3LDE4Ny4yNyBaIiBpZD0iU2hhcGUiIGZpbGw9IiM4MTgxODciPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMDAwMDAwLCAwLjAwMDAwMCkiIGlkPSJTaGFwZSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY1LjUsOTUzLjA1IEMyOS45Nyw5NTMuMDUgMS4wNiw5MjQuMTQgMS4wNiw4ODguNjEgTDEuMDYsNjQuOTggQzEuMDYsMjkuNDUgMjkuOTcsMC41NCA2NS41LDAuNTQgTDM5OS45NiwwLjU0IEM0MzUuNDksMC41NCA0NjQuMzksMjkuNDUgNDY0LjM5LDY0Ljk4IEw0NjQuMzksODg4LjYxIEM0NjQuMzksOTI0LjE0IDQzNS40OCw5NTMuMDUgMzk5Ljk2LDk1My4wNSBMNjUuNSw5NTMuMDUgTDY1LjUsOTUzLjA1IFoiIGZpbGw9IiNCMkIyQjIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMzk5Ljk2LDEuMDUgQzQzNS4yMSwxLjA1IDQ2My44OSwyOS43MyA0NjMuODksNjQuOTkgTDQ2My44OSw4ODguNjIgQzQ2My44OSw5MjMuODcgNDM1LjIxLDk1Mi41NiAzOTkuOTYsOTUyLjU2IEw2NS41LDk1Mi41NiBDMzAuMjUsOTUyLjU2IDEuNTYsOTIzLjg4IDEuNTYsODg4LjYyIEwxLjU2LDY0Ljk4IEMxLjU2LDI5LjczIDMwLjI0LDEuMDQgNjUuNSwxLjA0IEwzOTkuOTYsMS4wNCBMMzk5Ljk2LDEuMDUgWiBNMzk5Ljk2LDAuMDUgTDY1LjUsMC4wNSBDMjkuNjksMC4wNSAwLjU2LDI5LjE4IDAuNTYsNjQuOTkgTDAuNTYsODg4LjYyIEMwLjU2LDkyNC40MyAyOS42OSw5NTMuNTYgNjUuNSw5NTMuNTYgTDM5OS45Niw5NTMuNTYgQzQzNS43Niw5NTMuNTYgNDY0Ljg5LDkyNC40MyA0NjQuODksODg4LjYyIEw0NjQuODksNjQuOTggQzQ2NC44OSwyOS4xOCA0MzUuNzYsMC4wNSAzOTkuOTYsMC4wNSBMMzk5Ljk2LDAuMDUgTDM5OS45NiwwLjA1IFoiIGZpbGw9IiM2NjY2NjYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MDEuOTUsOTQ4LjU1IEw2Ny41LDk0OC41NSBDMzQuNCw5NDguNTUgNy41Niw5MjEuNzIgNy41Niw4ODguNjEgTDcuNTYsNjQuOTggQzcuNTYsMzEuODggMzQuMzksNS4wNCA2Ny41LDUuMDQgTDQwMS45Niw1LjA0IEM0MzUuMDYsNS4wNCA0NjEuOSwzMS44NyA0NjEuOSw2NC45OCBMNDYxLjksODg4LjYxIEM0NjEuODksOTIxLjcxIDQzNS4wNiw5NDguNTUgNDAxLjk1LDk0OC41NSBMNDAxLjk1LDk0OC41NSBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyNjI2MjYiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MDIuMTQsNS4wNSBMNjcuMzEsNS4wNSBDMzQuMzEsNS4wNSA3LjU2LDMxLjggNy41Niw2NC44IEw3LjU2LDY2LjQ0IEM3LjU2LDMzLjQ0IDM0LjMxLDYuNjkgNjcuMzEsNi42OSBMNDAyLjE0LDYuNjkgQzQzNS4xNCw2LjY5IDQ2MS44OSwzMy40NCA0NjEuODksNjYuNDQgTDQ2MS44OSw2NC44IEM0NjEuODksMzEuOCA0MzUuMTQsNS4wNSA0MDIuMTQsNS4wNSBMNDAyLjE0LDUuMDUgWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNDAyLjE0LDguNTkgTDY3LjMxLDguNTkgQzM2LjMyLDguNTkgMTEuMTEsMzMuOCAxMS4xMSw2NC43OSBMMTEuMTEsODg4Ljc5IEMxMS4xMSw5MTkuNzggMzYuMzIsOTQ0Ljk5IDY3LjMxLDk0NC45OSBMNDAyLjE0LDk0NC45OSBDNDMzLjEzLDk0NC45OSA0NTguMzQsOTE5Ljc4IDQ1OC4zNCw4ODguNzkgTDQ1OC4zNCw2NC43OSBDNDU4LjM0LDMzLjgxIDQzMy4xMyw4LjU5IDQwMi4xNCw4LjU5IEw0MDIuMTQsOC41OSBaIE00NTIuMzQsODg4LjggQzQ1Mi4zNCw5MTYuNDggNDI5LjgyLDkzOSA0MDIuMTQsOTM5IEw2Ny4zMSw5MzkgQzM5LjYzLDkzOSAxNy4xMSw5MTYuNDggMTcuMTEsODg4LjggTDE3LjExLDY0LjggQzE3LjExLDM3LjEyIDM5LjYzLDE0LjYgNjcuMzEsMTQuNiBMNDAyLjE0LDE0LjYgQzQyOS44MiwxNC42IDQ1Mi4zNCwzNy4xMiA0NTIuMzQsNjQuOCBMNDUyLjM0LDg4OC44IEw0NTIuMzQsODg4LjggWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNTkuMDAwMDAwLCA0Ni4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTMpIiBjeD0iNy44IiBjeT0iNy45OSIgcj0iNy41NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC00KSIgb3BhY2l0eT0iMC44IiBjeD0iNy44IiBjeT0iNy45OSIgcj0iNy41NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0iIzFCMUExRiIgY3g9IjcuOCIgY3k9IjcuOTkiIHI9IjUuMDMiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiMzNjI4NEMiIGN4PSI3LjgiIGN5PSI3Ljk5IiByPSIzLjY4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTUpIiBjeD0iNy44IiBjeT0iNy45OSIgcj0iMy42OCI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMDAwMDAsIDUuMDAwMDAwKSIgaWQ9IlNoYXBlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQuODIsMi45OSBDNC44Miw0LjExIDMuOTEsNS4wMSAyLjgsNS4wMSBDMS42OCw1LjAxIDAuNzgsNC4xIDAuNzgsMi45OSBDMC43OCwxLjg3IDEuNjksMC45NyAyLjgsMC45NyBDMy45MSwwLjk2IDQuODIsMS44NyA0LjgyLDIuOTkgTDQuODIsMi45OSBaIiBmaWxsPSIjMTQxNDE0IiBvcGFjaXR5PSIwLjUiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQuODIsMi45OSBDNC44Miw0LjExIDMuOTEsNS4wMSAyLjgsNS4wMSBDMS42OCw1LjAxIDAuNzgsNC4xIDAuNzgsMi45OSBDMC43OCwxLjg3IDEuNjksMC45NyAyLjgsMC45NyBDMy45MSwwLjk2IDQuODIsMS44NyA0LjgyLDIuOTkgTDQuODIsMi45OSBaIiBmaWxsPSJ1cmwoI3JhZGlhbEdyYWRpZW50LTYpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjgsNi40NyBDNy4zNSw2LjQ3IDYuOTYsNi42NyA2LjY4LDYuOTggTDcuMTUsNy40NSBDNy4zMSw3LjI2IDcuNTMsNy4xNCA3Ljc5LDcuMTQgQzguMDYsNy4xNCA4LjI5LDcuMjggOC40NSw3LjQ3IEw4LjkyLDYuOTkgQzguNjUsNi42OCA4LjI1LDYuNDcgNy44LDYuNDcgTDcuOCw2LjQ3IFoiIGlkPSJTaGFwZSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC03KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAxLjAwMDAwMCwgNTAuMDAwMDAwKSIgaWQ9IkNsaXBwZWQiPgogICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD0ibWFzay05IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTgiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF85XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjMuNDIsOS4wMiBMNC44LDkuMDIgQzIuNDMsOS4wMiAwLjUxLDcuMSAwLjUxLDQuNzMgTDAuNTEsNC43MyBDMC41MSwyLjM2IDIuNDMsMC40NCA0LjgsMC40NCBMNjMuNDIsMC40NCBDNjUuNzksMC40NCA2Ny43MSwyLjM2IDY3LjcxLDQuNzMgTDY3LjcxLDQuNzMgQzY3LjcsNy4xIDY1Ljc4LDkuMDIgNjMuNDIsOS4wMiBMNjMuNDIsOS4wMiBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMTApIiBvcGFjaXR5PSIwLjgiIG1hc2s9InVybCgjbWFzay05KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJTVkdJRF85XyI+PC9nPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMS45MiwwLjMzIEwwLjQ1LDAuMzMgTDAuNDUsMS44IEwxLjkyLDEuOCBMMS45MiwwLjMzIEwxLjkyLDAuMzMgWiBNNC44NSwwLjMzIEwzLjM4LDAuMzMgTDMuMzgsMS44IEw0Ljg1LDEuOCBMNC44NSwwLjMzIEw0Ljg1LDAuMzMgWiBNNy43OSwwLjMzIEw2LjMyLDAuMzMgTDYuMzIsMS44IEw3Ljc5LDEuOCBMNy43OSwwLjMzIEw3Ljc5LDAuMzMgWiBNMTAuNzIsMC4zMyBMOS4yNSwwLjMzIEw5LjI1LDEuOCBMMTAuNzIsMS44IEwxMC43MiwwLjMzIEwxMC43MiwwLjMzIFogTTEzLjY2LDAuMzMgTDEyLjE5LDAuMzMgTDEyLjE5LDEuOCBMMTMuNjYsMS44IEwxMy42NiwwLjMzIEwxMy42NiwwLjMzIFogTTE2LjU5LDAuMzMgTDE1LjEyLDAuMzMgTDE1LjEyLDEuOCBMMTYuNTksMS44IEwxNi41OSwwLjMzIEwxNi41OSwwLjMzIFogTTE5LjUzLDAuMzMgTDE4LjA2LDAuMzMgTDE4LjA2LDEuOCBMMTkuNTMsMS44IEwxOS41MywwLjMzIEwxOS41MywwLjMzIFogTTIyLjQ2LDAuMzMgTDIwLjk5LDAuMzMgTDIwLjk5LDEuOCBMMjIuNDYsMS44IEwyMi40NiwwLjMzIEwyMi40NiwwLjMzIFogTTI1LjQsMC4zMyBMMjMuOTMsMC4zMyBMMjMuOTMsMS44IEwyNS40LDEuOCBMMjUuNCwwLjMzIEwyNS40LDAuMzMgWiBNMjguMzMsMC4zMyBMMjYuODYsMC4zMyBMMjYuODYsMS44IEwyOC4zMywxLjggTDI4LjMzLDAuMzMgTDI4LjMzLDAuMzMgWiBNMzEuMjcsMC4zMyBMMjkuOCwwLjMzIEwyOS44LDEuOCBMMzEuMjcsMS44IEwzMS4yNywwLjMzIEwzMS4yNywwLjMzIFogTTM0LjIsMC4zMyBMMzIuNzMsMC4zMyBMMzIuNzMsMS44IEwzNC4yLDEuOCBMMzQuMiwwLjMzIEwzNC4yLDAuMzMgWiBNMzcuMTQsMC4zMyBMMzUuNjcsMC4zMyBMMzUuNjcsMS44IEwzNy4xNCwxLjggTDM3LjE0LDAuMzMgTDM3LjE0LDAuMzMgWiBNNDAuMDcsMC4zMyBMMzguNiwwLjMzIEwzOC42LDEuOCBMNDAuMDcsMS44IEw0MC4wNywwLjMzIEw0MC4wNywwLjMzIFogTTQzLjAxLDAuMzMgTDQxLjU0LDAuMzMgTDQxLjU0LDEuOCBMNDMuMDEsMS44IEw0My4wMSwwLjMzIEw0My4wMSwwLjMzIFogTTQ1Ljk0LDAuMzMgTDQ0LjQ3LDAuMzMgTDQ0LjQ3LDEuOCBMNDUuOTQsMS44IEw0NS45NCwwLjMzIEw0NS45NCwwLjMzIFogTTQ4Ljg4LDAuMzMgTDQ3LjQxLDAuMzMgTDQ3LjQxLDEuOCBMNDguODgsMS44IEw0OC44OCwwLjMzIEw0OC44OCwwLjMzIFogTTUxLjgxLDAuMzMgTDUwLjM0LDAuMzMgTDUwLjM0LDEuOCBMNTEuODEsMS44IEw1MS44MSwwLjMzIEw1MS44MSwwLjMzIFogTTU0Ljc1LDAuMzMgTDUzLjI4LDAuMzMgTDUzLjI4LDEuOCBMNTQuNzUsMS44IEw1NC43NSwwLjMzIEw1NC43NSwwLjMzIFogTTU3LjY4LDAuMzMgTDU2LjIxLDAuMzMgTDU2LjIxLDEuOCBMNTcuNjgsMS44IEw1Ny42OCwwLjMzIEw1Ny42OCwwLjMzIFogTTYwLjYyLDAuMzMgTDU5LjE1LDAuMzMgTDU5LjE1LDEuOCBMNjAuNjIsMS44IEw2MC42MiwwLjMzIEw2MC42MiwwLjMzIFogTTYzLjU1LDAuMzMgTDYyLjA4LDAuMzMgTDYyLjA4LDEuOCBMNjMuNTUsMS44IEw2My41NSwwLjMzIEw2My41NSwwLjMzIFogTTY2LjQ5LDAuMzMgTDY1LjAyLDAuMzMgTDY1LjAyLDEuOCBMNjYuNDksMS44IEw2Ni40OSwwLjMzIEw2Ni40OSwwLjMzIFogTTMuMzksMS43OSBMMS45MiwxLjc5IEwxLjkyLDMuMjYgTDMuMzksMy4yNiBMMy4zOSwxLjc5IEwzLjM5LDEuNzkgWiBNNi4zMiwxLjc5IEw0Ljg1LDEuNzkgTDQuODUsMy4yNiBMNi4zMiwzLjI2IEw2LjMyLDEuNzkgTDYuMzIsMS43OSBaIE05LjI2LDEuNzkgTDcuNzksMS43OSBMNy43OSwzLjI2IEw5LjI2LDMuMjYgTDkuMjYsMS43OSBMOS4yNiwxLjc5IFogTTEyLjE5LDEuNzkgTDEwLjcyLDEuNzkgTDEwLjcyLDMuMjYgTDEyLjE5LDMuMjYgTDEyLjE5LDEuNzkgTDEyLjE5LDEuNzkgWiBNMTUuMTMsMS43OSBMMTMuNjYsMS43OSBMMTMuNjYsMy4yNiBMMTUuMTMsMy4yNiBMMTUuMTMsMS43OSBMMTUuMTMsMS43OSBaIE0xOC4wNiwxLjc5IEwxNi41OSwxLjc5IEwxNi41OSwzLjI2IEwxOC4wNiwzLjI2IEwxOC4wNiwxLjc5IEwxOC4wNiwxLjc5IFogTTIwLjk5LDEuNzkgTDE5LjUyLDEuNzkgTDE5LjUyLDMuMjYgTDIwLjk5LDMuMjYgTDIwLjk5LDEuNzkgTDIwLjk5LDEuNzkgWiBNMjMuOTMsMS43OSBMMjIuNDYsMS43OSBMMjIuNDYsMy4yNiBMMjMuOTMsMy4yNiBMMjMuOTMsMS43OSBMMjMuOTMsMS43OSBaIE0yNi44NiwxLjc5IEwyNS4zOSwxLjc5IEwyNS4zOSwzLjI2IEwyNi44NiwzLjI2IEwyNi44NiwxLjc5IEwyNi44NiwxLjc5IFogTTI5LjgsMS43OSBMMjguMzMsMS43OSBMMjguMzMsMy4yNiBMMjkuOCwzLjI2IEwyOS44LDEuNzkgTDI5LjgsMS43OSBaIE0zMi43MywxLjc5IEwzMS4yNiwxLjc5IEwzMS4yNiwzLjI2IEwzMi43MywzLjI2IEwzMi43MywxLjc5IEwzMi43MywxLjc5IFogTTM1LjY3LDEuNzkgTDM0LjIsMS43OSBMMzQuMiwzLjI2IEwzNS42NywzLjI2IEwzNS42NywxLjc5IEwzNS42NywxLjc5IFogTTM4LjYsMS43OSBMMzcuMTMsMS43OSBMMzcuMTMsMy4yNiBMMzguNiwzLjI2IEwzOC42LDEuNzkgTDM4LjYsMS43OSBaIE00MS41NCwxLjc5IEw0MC4wNywxLjc5IEw0MC4wNywzLjI2IEw0MS41NCwzLjI2IEw0MS41NCwxLjc5IEw0MS41NCwxLjc5IFogTTQ0LjQ3LDEuNzkgTDQzLDEuNzkgTDQzLDMuMjYgTDQ0LjQ3LDMuMjYgTDQ0LjQ3LDEuNzkgTDQ0LjQ3LDEuNzkgWiBNNDcuNDEsMS43OSBMNDUuOTQsMS43OSBMNDUuOTQsMy4yNiBMNDcuNDEsMy4yNiBMNDcuNDEsMS43OSBMNDcuNDEsMS43OSBaIE01MC4zNCwxLjc5IEw0OC44NywxLjc5IEw0OC44NywzLjI2IEw1MC4zNCwzLjI2IEw1MC4zNCwxLjc5IEw1MC4zNCwxLjc5IFogTTUzLjI4LDEuNzkgTDUxLjgxLDEuNzkgTDUxLjgxLDMuMjYgTDUzLjI4LDMuMjYgTDUzLjI4LDEuNzkgTDUzLjI4LDEuNzkgWiBNNTYuMjEsMS43OSBMNTQuNzQsMS43OSBMNTQuNzQsMy4yNiBMNTYuMjEsMy4yNiBMNTYuMjEsMS43OSBMNTYuMjEsMS43OSBaIE01OS4xNSwxLjc5IEw1Ny42OCwxLjc5IEw1Ny42OCwzLjI2IEw1OS4xNSwzLjI2IEw1OS4xNSwxLjc5IEw1OS4xNSwxLjc5IFogTTYyLjA4LDEuNzkgTDYwLjYxLDEuNzkgTDYwLjYxLDMuMjYgTDYyLjA4LDMuMjYgTDYyLjA4LDEuNzkgTDYyLjA4LDEuNzkgWiBNNjUuMDIsMS43OSBMNjMuNTUsMS43OSBMNjMuNTUsMy4yNiBMNjUuMDIsMy4yNiBMNjUuMDIsMS43OSBMNjUuMDIsMS43OSBaIE02Ny45NSwxLjc5IEw2Ni40OCwxLjc5IEw2Ni40OCwzLjI2IEw2Ny45NSwzLjI2IEw2Ny45NSwxLjc5IEw2Ny45NSwxLjc5IFogTTEuOTIsMy4yNiBMMC40NSwzLjI2IEwwLjQ1LDQuNzMgTDEuOTIsNC43MyBMMS45MiwzLjI2IEwxLjkyLDMuMjYgWiBNNC44NSwzLjI2IEwzLjM4LDMuMjYgTDMuMzgsNC43MyBMNC44NSw0LjczIEw0Ljg1LDMuMjYgTDQuODUsMy4yNiBaIE03Ljc5LDMuMjYgTDYuMzIsMy4yNiBMNi4zMiw0LjczIEw3Ljc5LDQuNzMgTDcuNzksMy4yNiBMNy43OSwzLjI2IFogTTEwLjcyLDMuMjYgTDkuMjUsMy4yNiBMOS4yNSw0LjczIEwxMC43Miw0LjczIEwxMC43MiwzLjI2IEwxMC43MiwzLjI2IFogTTEzLjY2LDMuMjYgTDEyLjE5LDMuMjYgTDEyLjE5LDQuNzMgTDEzLjY2LDQuNzMgTDEzLjY2LDMuMjYgTDEzLjY2LDMuMjYgWiBNMTYuNTksMy4yNiBMMTUuMTIsMy4yNiBMMTUuMTIsNC43MyBMMTYuNTksNC43MyBMMTYuNTksMy4yNiBMMTYuNTksMy4yNiBaIE0xOS41MywzLjI2IEwxOC4wNiwzLjI2IEwxOC4wNiw0LjczIEwxOS41Myw0LjczIEwxOS41MywzLjI2IEwxOS41MywzLjI2IFogTTIyLjQ2LDMuMjYgTDIwLjk5LDMuMjYgTDIwLjk5LDQuNzMgTDIyLjQ2LDQuNzMgTDIyLjQ2LDMuMjYgTDIyLjQ2LDMuMjYgWiBNMjUuNCwzLjI2IEwyMy45MywzLjI2IEwyMy45Myw0LjczIEwyNS40LDQuNzMgTDI1LjQsMy4yNiBMMjUuNCwzLjI2IFogTTI4LjMzLDMuMjYgTDI2Ljg2LDMuMjYgTDI2Ljg2LDQuNzMgTDI4LjMzLDQuNzMgTDI4LjMzLDMuMjYgTDI4LjMzLDMuMjYgWiBNMzEuMjcsMy4yNiBMMjkuOCwzLjI2IEwyOS44LDQuNzMgTDMxLjI3LDQuNzMgTDMxLjI3LDMuMjYgTDMxLjI3LDMuMjYgWiBNMzQuMiwzLjI2IEwzMi43MywzLjI2IEwzMi43Myw0LjczIEwzNC4yLDQuNzMgTDM0LjIsMy4yNiBMMzQuMiwzLjI2IFogTTM3LjE0LDMuMjYgTDM1LjY3LDMuMjYgTDM1LjY3LDQuNzMgTDM3LjE0LDQuNzMgTDM3LjE0LDMuMjYgTDM3LjE0LDMuMjYgWiBNNDAuMDcsMy4yNiBMMzguNiwzLjI2IEwzOC42LDQuNzMgTDQwLjA3LDQuNzMgTDQwLjA3LDMuMjYgTDQwLjA3LDMuMjYgWiBNNDMuMDEsMy4yNiBMNDEuNTQsMy4yNiBMNDEuNTQsNC43MyBMNDMuMDEsNC43MyBMNDMuMDEsMy4yNiBMNDMuMDEsMy4yNiBaIE00NS45NCwzLjI2IEw0NC40NywzLjI2IEw0NC40Nyw0LjczIEw0NS45NCw0LjczIEw0NS45NCwzLjI2IEw0NS45NCwzLjI2IFogTTQ4Ljg4LDMuMjYgTDQ3LjQxLDMuMjYgTDQ3LjQxLDQuNzMgTDQ4Ljg4LDQuNzMgTDQ4Ljg4LDMuMjYgTDQ4Ljg4LDMuMjYgWiBNNTEuODEsMy4yNiBMNTAuMzQsMy4yNiBMNTAuMzQsNC43MyBMNTEuODEsNC43MyBMNTEuODEsMy4yNiBMNTEuODEsMy4yNiBaIE01NC43NSwzLjI2IEw1My4yOCwzLjI2IEw1My4yOCw0LjczIEw1NC43NSw0LjczIEw1NC43NSwzLjI2IEw1NC43NSwzLjI2IFogTTU3LjY4LDMuMjYgTDU2LjIxLDMuMjYgTDU2LjIxLDQuNzMgTDU3LjY4LDQuNzMgTDU3LjY4LDMuMjYgTDU3LjY4LDMuMjYgWiBNNjAuNjIsMy4yNiBMNTkuMTUsMy4yNiBMNTkuMTUsNC43MyBMNjAuNjIsNC43MyBMNjAuNjIsMy4yNiBMNjAuNjIsMy4yNiBaIE02My41NSwzLjI2IEw2Mi4wOCwzLjI2IEw2Mi4wOCw0LjczIEw2My41NSw0LjczIEw2My41NSwzLjI2IEw2My41NSwzLjI2IFogTTY2LjQ5LDMuMjYgTDY1LjAyLDMuMjYgTDY1LjAyLDQuNzMgTDY2LjQ5LDQuNzMgTDY2LjQ5LDMuMjYgTDY2LjQ5LDMuMjYgWiBNMy4zOSw0LjczIEwxLjkyLDQuNzMgTDEuOTIsNi4yIEwzLjM5LDYuMiBMMy4zOSw0LjczIEwzLjM5LDQuNzMgWiBNNi4zMiw0LjczIEw0Ljg1LDQuNzMgTDQuODUsNi4yIEw2LjMyLDYuMiBMNi4zMiw0LjczIEw2LjMyLDQuNzMgWiBNOS4yNiw0LjczIEw3Ljc5LDQuNzMgTDcuNzksNi4yIEw5LjI2LDYuMiBMOS4yNiw0LjczIEw5LjI2LDQuNzMgWiBNMTIuMTksNC43MyBMMTAuNzIsNC43MyBMMTAuNzIsNi4yIEwxMi4xOSw2LjIgTDEyLjE5LDQuNzMgTDEyLjE5LDQuNzMgWiBNMTUuMTMsNC43MyBMMTMuNjYsNC43MyBMMTMuNjYsNi4yIEwxNS4xMyw2LjIgTDE1LjEzLDQuNzMgTDE1LjEzLDQuNzMgWiBNMTguMDYsNC43MyBMMTYuNTksNC43MyBMMTYuNTksNi4yIEwxOC4wNiw2LjIgTDE4LjA2LDQuNzMgTDE4LjA2LDQuNzMgWiBNMjAuOTksNC43MyBMMTkuNTIsNC43MyBMMTkuNTIsNi4yIEwyMC45OSw2LjIgTDIwLjk5LDQuNzMgTDIwLjk5LDQuNzMgWiBNMjMuOTMsNC43MyBMMjIuNDYsNC43MyBMMjIuNDYsNi4yIEwyMy45Myw2LjIgTDIzLjkzLDQuNzMgTDIzLjkzLDQuNzMgWiBNMjYuODYsNC43MyBMMjUuMzksNC43MyBMMjUuMzksNi4yIEwyNi44Niw2LjIgTDI2Ljg2LDQuNzMgTDI2Ljg2LDQuNzMgWiBNMjkuOCw0LjczIEwyOC4zMyw0LjczIEwyOC4zMyw2LjIgTDI5LjgsNi4yIEwyOS44LDQuNzMgTDI5LjgsNC43MyBaIE0zMi43Myw0LjczIEwzMS4yNiw0LjczIEwzMS4yNiw2LjIgTDMyLjczLDYuMiBMMzIuNzMsNC43MyBMMzIuNzMsNC43MyBaIE0zNS42Nyw0LjczIEwzNC4yLDQuNzMgTDM0LjIsNi4yIEwzNS42Nyw2LjIgTDM1LjY3LDQuNzMgTDM1LjY3LDQuNzMgWiBNMzguNiw0LjczIEwzNy4xMyw0LjczIEwzNy4xMyw2LjIgTDM4LjYsNi4yIEwzOC42LDQuNzMgTDM4LjYsNC43MyBaIE00MS41NCw0LjczIEw0MC4wNyw0LjczIEw0MC4wNyw2LjIgTDQxLjU0LDYuMiBMNDEuNTQsNC43MyBMNDEuNTQsNC43MyBaIE00NC40Nyw0LjczIEw0Myw0LjczIEw0Myw2LjIgTDQ0LjQ3LDYuMiBMNDQuNDcsNC43MyBMNDQuNDcsNC43MyBaIE00Ny40MSw0LjczIEw0NS45NCw0LjczIEw0NS45NCw2LjIgTDQ3LjQxLDYuMiBMNDcuNDEsNC43MyBMNDcuNDEsNC43MyBaIE01MC4zNCw0LjczIEw0OC44Nyw0LjczIEw0OC44Nyw2LjIgTDUwLjM0LDYuMiBMNTAuMzQsNC43MyBMNTAuMzQsNC43MyBaIE01My4yOCw0LjczIEw1MS44MSw0LjczIEw1MS44MSw2LjIgTDUzLjI4LDYuMiBMNTMuMjgsNC43MyBMNTMuMjgsNC43MyBaIE01Ni4yMSw0LjczIEw1NC43NCw0LjczIEw1NC43NCw2LjIgTDU2LjIxLDYuMiBMNTYuMjEsNC43MyBMNTYuMjEsNC43MyBaIE01OS4xNSw0LjczIEw1Ny42OCw0LjczIEw1Ny42OCw2LjIgTDU5LjE1LDYuMiBMNTkuMTUsNC43MyBMNTkuMTUsNC43MyBaIE02Mi4wOCw0LjczIEw2MC42MSw0LjczIEw2MC42MSw2LjIgTDYyLjA4LDYuMiBMNjIuMDgsNC43MyBMNjIuMDgsNC43MyBaIE02NS4wMiw0LjczIEw2My41NSw0LjczIEw2My41NSw2LjIgTDY1LjAyLDYuMiBMNjUuMDIsNC43MyBMNjUuMDIsNC43MyBaIE02Ny45NSw0LjczIEw2Ni40OCw0LjczIEw2Ni40OCw2LjIgTDY3Ljk1LDYuMiBMNjcuOTUsNC43MyBMNjcuOTUsNC43MyBaIE0xLjkyLDYuMiBMMC40NSw2LjIgTDAuNDUsNy42NyBMMS45Miw3LjY3IEwxLjkyLDYuMiBMMS45Miw2LjIgWiBNNC44NSw2LjIgTDMuMzgsNi4yIEwzLjM4LDcuNjcgTDQuODUsNy42NyBMNC44NSw2LjIgTDQuODUsNi4yIFogTTcuNzksNi4yIEw2LjMyLDYuMiBMNi4zMiw3LjY3IEw3Ljc5LDcuNjcgTDcuNzksNi4yIEw3Ljc5LDYuMiBaIE0xMC43Miw2LjIgTDkuMjUsNi4yIEw5LjI1LDcuNjcgTDEwLjcyLDcuNjcgTDEwLjcyLDYuMiBMMTAuNzIsNi4yIFogTTEzLjY2LDYuMiBMMTIuMTksNi4yIEwxMi4xOSw3LjY3IEwxMy42Niw3LjY3IEwxMy42Niw2LjIgTDEzLjY2LDYuMiBaIE0xNi41OSw2LjIgTDE1LjEyLDYuMiBMMTUuMTIsNy42NyBMMTYuNTksNy42NyBMMTYuNTksNi4yIEwxNi41OSw2LjIgWiBNMTkuNTMsNi4yIEwxOC4wNiw2LjIgTDE4LjA2LDcuNjcgTDE5LjUzLDcuNjcgTDE5LjUzLDYuMiBMMTkuNTMsNi4yIFogTTIyLjQ2LDYuMiBMMjAuOTksNi4yIEwyMC45OSw3LjY3IEwyMi40Niw3LjY3IEwyMi40Niw2LjIgTDIyLjQ2LDYuMiBaIE0yNS40LDYuMiBMMjMuOTMsNi4yIEwyMy45Myw3LjY3IEwyNS40LDcuNjcgTDI1LjQsNi4yIEwyNS40LDYuMiBaIE0yOC4zMyw2LjIgTDI2Ljg2LDYuMiBMMjYuODYsNy42NyBMMjguMzMsNy42NyBMMjguMzMsNi4yIEwyOC4zMyw2LjIgWiBNMzEuMjcsNi4yIEwyOS44LDYuMiBMMjkuOCw3LjY3IEwzMS4yNyw3LjY3IEwzMS4yNyw2LjIgTDMxLjI3LDYuMiBaIE0zNC4yLDYuMiBMMzIuNzMsNi4yIEwzMi43Myw3LjY3IEwzNC4yLDcuNjcgTDM0LjIsNi4yIEwzNC4yLDYuMiBaIE0zNy4xNCw2LjIgTDM1LjY3LDYuMiBMMzUuNjcsNy42NyBMMzcuMTQsNy42NyBMMzcuMTQsNi4yIEwzNy4xNCw2LjIgWiBNNDAuMDcsNi4yIEwzOC42LDYuMiBMMzguNiw3LjY3IEw0MC4wNyw3LjY3IEw0MC4wNyw2LjIgTDQwLjA3LDYuMiBaIE00My4wMSw2LjIgTDQxLjU0LDYuMiBMNDEuNTQsNy42NyBMNDMuMDEsNy42NyBMNDMuMDEsNi4yIEw0My4wMSw2LjIgWiBNNDUuOTQsNi4yIEw0NC40Nyw2LjIgTDQ0LjQ3LDcuNjcgTDQ1Ljk0LDcuNjcgTDQ1Ljk0LDYuMiBMNDUuOTQsNi4yIFogTTQ4Ljg4LDYuMiBMNDcuNDEsNi4yIEw0Ny40MSw3LjY3IEw0OC44OCw3LjY3IEw0OC44OCw2LjIgTDQ4Ljg4LDYuMiBaIE01MS44MSw2LjIgTDUwLjM0LDYuMiBMNTAuMzQsNy42NyBMNTEuODEsNy42NyBMNTEuODEsNi4yIEw1MS44MSw2LjIgWiBNNTQuNzUsNi4yIEw1My4yOCw2LjIgTDUzLjI4LDcuNjcgTDU0Ljc1LDcuNjcgTDU0Ljc1LDYuMiBMNTQuNzUsNi4yIFogTTU3LjY4LDYuMiBMNTYuMjEsNi4yIEw1Ni4yMSw3LjY3IEw1Ny42OCw3LjY3IEw1Ny42OCw2LjIgTDU3LjY4LDYuMiBaIE02MC42Miw2LjIgTDU5LjE1LDYuMiBMNTkuMTUsNy42NyBMNjAuNjIsNy42NyBMNjAuNjIsNi4yIEw2MC42Miw2LjIgWiBNNjMuNTUsNi4yIEw2Mi4wOCw2LjIgTDYyLjA4LDcuNjcgTDYzLjU1LDcuNjcgTDYzLjU1LDYuMiBMNjMuNTUsNi4yIFogTTY2LjQ5LDYuMiBMNjUuMDIsNi4yIEw2NS4wMiw3LjY3IEw2Ni40OSw3LjY3IEw2Ni40OSw2LjIgTDY2LjQ5LDYuMiBaIE0zLjM5LDcuNjYgTDEuOTIsNy42NiBMMS45Miw5LjEzIEwzLjM5LDkuMTMgTDMuMzksNy42NiBMMy4zOSw3LjY2IFogTTYuMzIsNy42NiBMNC44NSw3LjY2IEw0Ljg1LDkuMTMgTDYuMzIsOS4xMyBMNi4zMiw3LjY2IEw2LjMyLDcuNjYgWiBNOS4yNiw3LjY2IEw3Ljc5LDcuNjYgTDcuNzksOS4xMyBMOS4yNiw5LjEzIEw5LjI2LDcuNjYgTDkuMjYsNy42NiBaIE0xMi4xOSw3LjY2IEwxMC43Miw3LjY2IEwxMC43Miw5LjEzIEwxMi4xOSw5LjEzIEwxMi4xOSw3LjY2IEwxMi4xOSw3LjY2IFogTTE1LjEzLDcuNjYgTDEzLjY2LDcuNjYgTDEzLjY2LDkuMTMgTDE1LjEzLDkuMTMgTDE1LjEzLDcuNjYgTDE1LjEzLDcuNjYgWiBNMTguMDYsNy42NiBMMTYuNTksNy42NiBMMTYuNTksOS4xMyBMMTguMDYsOS4xMyBMMTguMDYsNy42NiBMMTguMDYsNy42NiBaIE0yMC45OSw3LjY2IEwxOS41Miw3LjY2IEwxOS41Miw5LjEzIEwyMC45OSw5LjEzIEwyMC45OSw3LjY2IEwyMC45OSw3LjY2IFogTTIzLjkzLDcuNjYgTDIyLjQ2LDcuNjYgTDIyLjQ2LDkuMTMgTDIzLjkzLDkuMTMgTDIzLjkzLDcuNjYgTDIzLjkzLDcuNjYgWiBNMjYuODYsNy42NiBMMjUuMzksNy42NiBMMjUuMzksOS4xMyBMMjYuODYsOS4xMyBMMjYuODYsNy42NiBMMjYuODYsNy42NiBaIE0yOS44LDcuNjYgTDI4LjMzLDcuNjYgTDI4LjMzLDkuMTMgTDI5LjgsOS4xMyBMMjkuOCw3LjY2IEwyOS44LDcuNjYgWiBNMzIuNzMsNy42NiBMMzEuMjYsNy42NiBMMzEuMjYsOS4xMyBMMzIuNzMsOS4xMyBMMzIuNzMsNy42NiBMMzIuNzMsNy42NiBaIE0zNS42Nyw3LjY2IEwzNC4yLDcuNjYgTDM0LjIsOS4xMyBMMzUuNjcsOS4xMyBMMzUuNjcsNy42NiBMMzUuNjcsNy42NiBaIE0zOC42LDcuNjYgTDM3LjEzLDcuNjYgTDM3LjEzLDkuMTMgTDM4LjYsOS4xMyBMMzguNiw3LjY2IEwzOC42LDcuNjYgWiBNNDEuNTQsNy42NiBMNDAuMDcsNy42NiBMNDAuMDcsOS4xMyBMNDEuNTQsOS4xMyBMNDEuNTQsNy42NiBMNDEuNTQsNy42NiBaIE00NC40Nyw3LjY2IEw0Myw3LjY2IEw0Myw5LjEzIEw0NC40Nyw5LjEzIEw0NC40Nyw3LjY2IEw0NC40Nyw3LjY2IFogTTQ3LjQxLDcuNjYgTDQ1Ljk0LDcuNjYgTDQ1Ljk0LDkuMTMgTDQ3LjQxLDkuMTMgTDQ3LjQxLDcuNjYgTDQ3LjQxLDcuNjYgWiBNNTAuMzQsNy42NiBMNDguODcsNy42NiBMNDguODcsOS4xMyBMNTAuMzQsOS4xMyBMNTAuMzQsNy42NiBMNTAuMzQsNy42NiBaIE01My4yOCw3LjY2IEw1MS44MSw3LjY2IEw1MS44MSw5LjEzIEw1My4yOCw5LjEzIEw1My4yOCw3LjY2IEw1My4yOCw3LjY2IFogTTU2LjIxLDcuNjYgTDU0Ljc0LDcuNjYgTDU0Ljc0LDkuMTMgTDU2LjIxLDkuMTMgTDU2LjIxLDcuNjYgTDU2LjIxLDcuNjYgWiBNNTkuMTUsNy42NiBMNTcuNjgsNy42NiBMNTcuNjgsOS4xMyBMNTkuMTUsOS4xMyBMNTkuMTUsNy42NiBMNTkuMTUsNy42NiBaIE02Mi4wOCw3LjY2IEw2MC42MSw3LjY2IEw2MC42MSw5LjEzIEw2Mi4wOCw5LjEzIEw2Mi4wOCw3LjY2IEw2Mi4wOCw3LjY2IFogTTY1LjAyLDcuNjYgTDYzLjU1LDcuNjYgTDYzLjU1LDkuMTMgTDY1LjAyLDkuMTMgTDY1LjAyLDcuNjYgTDY1LjAyLDcuNjYgWiBNNjcuOTUsNy42NiBMNjYuNDgsNy42NiBMNjYuNDgsOS4xMyBMNjcuOTUsOS4xMyBMNjcuOTUsNy42NiBMNjcuOTUsNy42NiBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyRTJFMkUiIG1hc2s9InVybCgjbWFzay0xMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPSJtYXNrLTE0IiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEzIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iU1ZHSURfOV8iPjwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjgzLDAuMDggTDQuMzksMC4wOCBDMS45OSwwLjA4IDAuMDQsMi4xNiAwLjA0LDQuNzMgQzAuMDQsNy4zIDEuOTksOS4zOCA0LjM5LDkuMzggTDYzLjgzLDkuMzggQzY2LjIzLDkuMzggNjguMTgsNy4zIDY4LjE4LDQuNzMgQzY4LjE4LDIuMTYgNjYuMjMsMC4wOCA2My44MywwLjA4IEw2My44MywwLjA4IFogTTYzLjQyLDcuOTIgTDQuOCw3LjkyIEMzLjA0LDcuOTIgMS42LDYuNDkgMS42LDQuNzIgQzEuNiwyLjk1IDMuMDMsMS41MiA0LjgsMS41MiBMNjMuNDIsMS41MiBDNjUuMTgsMS41MiA2Ni42MiwyLjk1IDY2LjYyLDQuNzIgQzY2LjYyLDYuNDkgNjUuMTgsNy45MiA2My40Miw3LjkyIEw2My40Miw3LjkyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4yIiBtYXNrPSJ1cmwoI21hc2stMTQpIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNC43Myw4NjUuMzMgQzIxNi42LDg2NS4zMyAyMDEuOSw4ODAuMDMgMjAxLjksODk4LjE2IEMyMDEuOSw5MTYuMjkgMjE2LjYsOTMwLjk5IDIzNC43Myw5MzAuOTkgQzI1Mi44Niw5MzAuOTkgMjY3LjU2LDkxNi4yOSAyNjcuNTYsODk4LjE2IEMyNjcuNTYsODgwLjAzIDI1Mi44Niw4NjUuMzMgMjM0LjczLDg2NS4zMyBMMjM0LjczLDg2NS4zMyBaIE0yMzQuNzMsOTI3Ljk4IEMyMTguMjYsOTI3Ljk4IDIwNC45MSw5MTQuNjMgMjA0LjkxLDg5OC4xNiBDMjA0LjkxLDg4MS42OSAyMTguMjYsODY4LjM0IDIzNC43Myw4NjguMzQgQzI1MS4yLDg2OC4zNCAyNjQuNTUsODgxLjY5IDI2NC41NSw4OTguMTYgQzI2NC41NSw5MTQuNjIgMjUxLjIsOTI3Ljk4IDIzNC43Myw5MjcuOTggTDIzNC43Myw5MjcuOTggWiIgaWQ9IlNoYXBlIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTE1KSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTY5Ljg5LDguNTkgQzM3Ljc5LDguNTkgMTEuNzYsMzQuNjIgMTEuNzYsNjYuNzIgTDExLjc2LDU3MS44NyBMMzIyLjIsOC41OSBMNjkuODksOC41OSBMNjkuODksOC41OSBaIiBpZD0iU2hhcGUiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMTYpIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBmaWxsPSIjMDAwMDAwIiB4PSIyNiIgeT0iMTA3IiB3aWR0aD0iNDE0IiBoZWlnaHQ9IjczNiI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0NTIuNDMiIHdpZHRoPSI5MTcuNjgiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDkxNy42NzUyOSA0NTIuNDMxMzciPgogPHRpdGxlIGlkPSJ0aXRsZTQiPk5leHVzIDVYPC90aXRsZT4KIDxnIGlkPSJOZXh1czVYIiBmaWxsPSJub25lIiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLDEsMCwwLjAwMzI1MDczLDQ1Mi40MzQ2KSI+CiAgPGcgaWQ9ImczMDA0Ij4KICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBvcGFjaXR5PSIwLjciIHJ4PSI1OC42NjgiIGhlaWdodD0iOTE3LjY3IiB3aWR0aD0iNDQ4LjY2IiB5PSItMC4wMDMyNDEiIHg9IjAuMDAzMjMyOCIgZmlsbD0iIzY1NjU2NSIvPgogICA8cGF0aCBpZD0iU2hhcGUiIG9wYWNpdHk9IjAuNyIgZmlsbD0iIzAwMCIgZD0ibTMuNzgxOCw2Mi40NDljMC0zMi42MjcsMjYuMjUxLTU5LjA0OSw1OC42NjgtNTkuMDQ5aDMyNC4xNmMzMi4zMTcsMCw1OC42NjgsMjYuNTIyLDU4LjY2OCw1OS4wNDl2NzkxLjI2YzAsMzIuNTI3LTI2LjM1MSw1OS4wNDktNTguNjY4LDU5LjA0OWgtMzI0LjE2Yy0zMi40MTYsMC01OC42NjgtMjYuNTIyLTU4LjY2OC01OS4wNDl2LTc5MS4zNiwwLjEwMDA4eiIvPgogICA8cmVjdCBpZD0icmVjdDEyIiByeD0iNTguNjY4IiBoZWlnaHQ9IjkwNi4xNiIgd2lkdGg9IjQzNS43MyIgeT0iNy4yMDI4IiB4PSI2Ljg2NDQiIGZpbGw9IiMyYjI5MmIiLz4KICAgPHBhdGggaWQ9InBhdGgxNCIgZmlsbD0iIzY1NjM2NCIgZD0ibTQ0OC42NiwyMzguNCwzLjc3ODYsMCwwLDYyLjU1Mi0zLjc3ODYsMCwwLTYyLjU1MnptMCwxMjUuMSwyLjY4NDgsMCwwLDEzNy4zMi0yLjg4MzcsMCwwLjE5ODg4LTEzNy4zMnoiLz4KICAgPGcgaWQ9Ikdyb3VwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjk5NDM2NzA5LDAsMCwxLjAwMDgzODUsNzUuNTc1MTMxLDMwLjAyMTkxMikiPgogICAgPHBhdGggaWQ9InBhdGgxNyIgb3BhY2l0eT0iMC42IiBmaWxsPSIjMzczNzM3IiBkPSJtOS4yLDE4YzUsMCw4LjgtMy44LDguOC04LjcsMC00LjgtNC04LjctOC44LTguN3MtOC43LDQtOC43LDguN2MwLDUsNCw4LjgsOC43LDguOHYtMC4xeiIvPgogICAgPGNpcmNsZSBpZD0iT3ZhbCIgZD0iTSAxNC4yLDkuMzAwMDAwMiBDIDE0LjIsMTIuMDYxNDI0IDExLjk2MTQyNCwxNC4zIDkuMTk5OTk5OCwxNC4zIGMgLTIuNzYxNDIzNywwIC01LC0yLjIzODU3NiAtNSwtNC45OTk5OTk4IDAsLTIuNzYxNDIzOCAyLjIzODU3NjMsLTUgNSwtNSAyLjc2MTQyNDIsMCA1LjAwMDAwMDIsMi4yMzg1NzYyIDUuMDAwMDAwMiw1IHoiIGN4PSI5LjIiIGN5PSI5LjMiIHI9IjUiIGZpbGw9IiMxNjBmMjYiLz4KICAgPC9nPgogICA8cGF0aCBpZD0icGF0aDIwIiBvcGFjaXR5PSIwLjUiIGZpbGw9IiMxNzE3MTciIGQ9Im0xOS4yMjEsODguMDY2LDQxMiwwLDAsNzMyLTQxMiwwLDAtNzMyeiIvPgogICA8cmVjdCBpZD0icmVjdDIyIiBvcGFjaXR5PSIwLjMiIHJ4PSI2Ljk2MDYiIGhlaWdodD0iMTQuNTEyIiB3aWR0aD0iMTYzLjI4IiBzdHJva2U9IiMzOTM5MzkiIHk9Ijg3Mi4wMyIgeD0iMTQyLjUiIHN0cm9rZS13aWR0aD0iMS45OTUyIiBmaWxsPSIjMGQwYjBiIi8+CiAgIDxyZWN0IGlkPSJyZWN0MjQiIG9wYWNpdHk9IjAuMyIgcng9IjYuOTYwNiIgaGVpZ2h0PSIxNC41MTIiIHdpZHRoPSIxNjMuMjgiIHN0cm9rZT0iIzM5MzkzOSIgeT0iMzIuNTI0IiB4PSIxNDIuNSIgc3Ryb2tlLXdpZHRoPSIxLjk5NTIiIGZpbGw9IiMwZDBiMGIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iOTE3LjY3IiB3aWR0aD0iNDUyLjQzIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0NTIuNDMwNTEgOTE3LjY2OTYyIj4KIDx0aXRsZSBpZD0idGl0bGU0Ij5OZXh1cyA1WDwvdGl0bGU+CiA8ZyBpZD0iTmV4dXM1WCIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwLjY2OTYxNjcpIj4KICA8ZyBpZD0iZzMwMTYiPgogICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIG9wYWNpdHk9IjAuNyIgcng9IjU4LjY2NyIgaGVpZ2h0PSI5MTcuNjciIHdpZHRoPSI0NDguNjUiIHk9Ii0wLjY2OTYyIiB4PSItMS4xMTAyRS0xNiIgZmlsbD0iIzY1NjU2NSIvPgogICA8cGF0aCBpZD0iU2hhcGUiIG9wYWNpdHk9IjAuNyIgZmlsbD0iIzAwMCIgZD0ibTMuNzc4NSw2MS43ODZjMC0zMi42MjcsMjYuMjUxLTU5LjA1LDU4LjY2Ny01OS4wNWgzMjQuMTZjMzIuMzE2LDAsNTguNjY3LDI2LjUyMiw1OC42NjcsNTkuMDV2NzkxLjI2YzAsMzIuNTI3LTI2LjM1LDU5LjA1LTU4LjY2Nyw1OS4wNWgtMzI0LjE2Yy0zMi40MTYsMC01OC42NjctMjYuNTIyLTU4LjY2Ny01OS4wNXYtNzkxLjM2LDAuMTAwMDh6Ii8+CiAgIDxyZWN0IGlkPSJyZWN0MTIiIHJ4PSI1OC42NjciIGhlaWdodD0iOTA2LjE2IiB3aWR0aD0iNDM1LjczIiB5PSI2LjUzOTciIHg9IjYuODYxIiBmaWxsPSIjMmIyOTJiIi8+CiAgIDxwYXRoIGlkPSJwYXRoMTQiIGZpbGw9IiM2NTYzNjQiIGQ9Im00NDguNjUsMjM3LjczLDMuNzc4NSwwLDAsNjIuNTUyLTMuNzc4NSwwLDAtNjIuNTUyem0wLDEyNS4xLDIuNjg0OCwwLDAsMTM3LjMyLTIuODgzNiwwLDAuMTk4ODctMTM3LjMyeiIvPgogICA8ZyBpZD0iR3JvdXAiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTk0MzUyOCwwLDAsMS4wMDA4Mzk0LDc1LjU3MDgxMywyOS4zNTg4MSkiPgogICAgPHBhdGggaWQ9InBhdGgxNyIgb3BhY2l0eT0iMC42IiBmaWxsPSIjMzczNzM3IiBkPSJtOS4yLDE4YzUsMCw4LjgtMy44LDguOC04LjcsMC00LjgtNC04LjctOC44LTguN3MtOC43LDQtOC43LDguN2MwLDUsNCw4LjgsOC43LDguOHYtMC4xeiIvPgogICAgPGNpcmNsZSBpZD0iT3ZhbCIgZD0iTSAxNC4yLDkuMzAwMDAwMiBDIDE0LjIsMTIuMDYxNDI0IDExLjk2MTQyNCwxNC4zIDkuMTk5OTk5OCwxNC4zIGMgLTIuNzYxNDIzNywwIC01LC0yLjIzODU3NiAtNSwtNC45OTk5OTk4IDAsLTIuNzYxNDIzOCAyLjIzODU3NjMsLTUgNSwtNSAyLjc2MTQyNDIsMCA1LjAwMDAwMDIsMi4yMzg1NzYyIDUuMDAwMDAwMiw1IHoiIGN4PSI5LjIiIGN5PSI5LjMiIHI9IjUiIGZpbGw9IiMxNjBmMjYiLz4KICAgPC9nPgogICA8cGF0aCBpZD0icGF0aDIwIiBvcGFjaXR5PSIwLjUiIGZpbGw9IiMxNzE3MTciIGQ9Im0yMC4yMTgsODcuNCw0MTIsMCwwLDczMi00MTIsMCwwLTczMnoiLz4KICAgPHJlY3QgaWQ9InJlY3QyMiIgb3BhY2l0eT0iMC4zIiByeD0iNi45NjA1IiBoZWlnaHQ9IjE0LjUxMiIgd2lkdGg9IjE2My4yNyIgc3Ryb2tlPSIjMzkzOTM5IiB5PSI4NzEuMzYiIHg9IjE0Mi40OSIgc3Ryb2tlLXdpZHRoPSIxLjk5NTIiIGZpbGw9IiMwZDBiMGIiLz4KICAgPHJlY3QgaWQ9InJlY3QyNCIgb3BhY2l0eT0iMC4zIiByeD0iNi45NjA1IiBoZWlnaHQ9IjE0LjUxMiIgd2lkdGg9IjE2My4yNyIgc3Ryb2tlPSIjMzkzOTM5IiB5PSIzMS44NjEiIHg9IjE0Mi40OSIgc3Ryb2tlLXdpZHRoPSIxLjk5NTIiIGZpbGw9IiMwZDBiMGIiLz4KICA8L2c+CiA8L2c+Cjwvc3ZnPgo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDQ1LjE4IiB3aWR0aD0iOTE0LjQzIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgOTE0LjQyOTk5IDQ0NS4xODQ0OCI+CiA8dGl0bGUgaWQ9InRpdGxlNCI+TmV4dXMgNlA8L3RpdGxlPgogPGRlZnMgaWQ9ImRlZnM2Ij4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50LTIiIHkxPSIwLjM4NjM1IiB4Mj0iMC45NjYiIHgxPSIwLjA0MiIgeTI9IjAuNjE4NjMiPgogICA8c3RvcCBpZD0ic3RvcDE0IiBzdG9wLWNvbG9yPSIjM0EzQTNBIiBvZmZzZXQ9IjAiLz4KICAgPHN0b3AgaWQ9InN0b3AxNiIgc3RvcC1jb2xvcj0iIzE4MTgxOCIgb2Zmc2V0PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50MzA0NyIgeTI9IjQxOC4zOCIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50LTIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4Mj0iNjUzLjMiIGdyYWRpZW50VHJhbnNmb3JtPSJzY2FsZSgwLjY5NzkyNTU3LDEuNDMyODE3NSkiIHkxPSIyNjEuMjgiIHgxPSIyOC40MDQiLz4KIDwvZGVmcz4KIDxnIGlkPSJQYWdlLTEiIGZpbGw9Im5vbmUiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTkzOTE1OTIsMCwwLDAuOTgyMjczMiwtMy4yNTY3Mzg3LC0yNi4zMTA1ODEpIj4KICA8ZyBpZD0iZzMwNTEiPgogICA8ZyBpZD0iYi1saW5rIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MzA0NykiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTAuOTQ1MTYzMDMsMC45NDI2NzU1NSwwLDYuNTY5NjIwMSw0NzYuNjg5NDYpIj4KICAgIDxyZWN0IGlkPSJiIiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MzA0NykiLz4KICAgPC9nPgogICA8ZyBpZD0iZzIyIiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0wLjk0NTE2MzAzLDAuOTQyNjc1NTUsMCw2LjU2OTYyMDEsNDc2LjY4OTQ2KSI+CiAgICA8cmVjdCBpZD0icmVjdDI0IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImcyNiIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMC45NDUxNjMwMywwLjk0MjY3NTU1LDAsNi41Njk2MjAxLDQ3Ni42ODk0NikiPgogICAgPHJlY3QgaWQ9InJlY3QyOCIgcng9IjYwIiBoZWlnaHQ9Ijk2OSIgd2lkdGg9IjQ3MiIgeT0iMCIgeD0iMCIvPgogICA8L2c+CiAgIDxnIGlkPSJnMzAiIHN0cm9rZS13aWR0aD0iNyIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMC45NDUxNjMwMywwLjk0MjY3NTU1LDAsNi41Njk2MjAxLDQ3Ni42ODk0NikiIHN0cm9rZT0iIzFlMWUxZSI+CiAgICA8cmVjdCBpZD0icmVjdDMyIiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgIDwvZz4KICAgPGcgaWQ9ImczNCIgc3Ryb2tlLXdpZHRoPSI1IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0wLjk0NTE2MzAzLDAuOTQyNjc1NTUsMCw2LjU2OTYyMDEsNDc2LjY4OTQ2KSIgc3Ryb2tlPSIjNjE2MTYxIj4KICAgIDxyZWN0IGlkPSJyZWN0MzYiIHJ4PSI2MCIgaGVpZ2h0PSI5NjkiIHdpZHRoPSI0NzIiIHk9IjAiIHg9IjAiLz4KICAgPC9nPgogICA8ZyBpZD0iZzM4IiBzdHJva2Utd2lkdGg9IjMiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTAuOTQ1MTYzMDMsMC45NDI2NzU1NSwwLDYuNTY5NjIwMSw0NzYuNjg5NDYpIiBzdHJva2U9IiMxZTFlMWUiPgogICAgPHJlY3QgaWQ9InJlY3Q0MCIgcng9IjYwIiBoZWlnaHQ9Ijk2OSIgd2lkdGg9IjQ3MiIgeT0iMCIgeD0iMCIvPgogICA8L2c+CiAgIDxnIGlkPSJnNDIiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMC45NDUxNjMwMywwLjk0MjY3NTU1LDAsNi41Njk2MjAxLDQ3Ni42ODk0NikiIHN0cm9rZT0iI2I0YjRiNCI+CiAgICA8cmVjdCBpZD0icmVjdDQ0IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgIDwvZz4KICAgPGcgaWQ9Imc0NiIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMC45NDUxNjMwMywwLjk0MjY3NTU1LDAsNi41Njk2MjAxLDQ3Ni42ODk0NikiIHN0cm9rZT0iIzhhOGE4YSI+CiAgICA8cmVjdCBpZD0icmVjdDQ4IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgIDwvZz4KICAgPGcgaWQ9Ikdyb3VwIiBmaWxsPSIjNDQ0NDQ1IiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0wLjk0NTE2MzAzLDAuOTQyNjc1NTUsMCwzMDcuMjgzMTIsMzAuNTcyNTA2KSI+CiAgICA8cGF0aCBpZD0iU2hhcGUiIGQ9Im0wLDAsMiwwYzEsMCwyLDEsMiwydjU2YzAsMS0xLDItMiwyaC0ydi02MHoiLz4KICAgIDxwYXRoIGlkPSJwYXRoNTIiIGQ9Im0wLDk3LDIsMGMxLDAsMiwxLDIsMnYxMTZjMCwxLTEsMi0yLDJoLTJ2LTEyMHoiLz4KICAgPC9nPgogICA8cGF0aCBpZD0icGF0aDU0IiBmaWxsPSIjMTcxNzE3IiBkPSJtOTguNjY4LDQ2My4xLDAtNDE5LjQ0LDczNi4zMiwwLDAsNDE5LjQ0LTczNi4zMiwweiIvPgogICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIG9wYWNpdHk9IjAuNCIgcng9IjcuNTYxMyIgdHJhbnNmb3JtPSJtYXRyaXgoMCwtMSwxLDAsMCwwKSIgaGVpZ2h0PSIxMy4xOTciIHdpZHRoPSIxNTkuNzMiIHN0cm9rZT0iIzE0MTQxNCIgeT0iNDQuMjc3IiB4PSItMzM0LjkyIiBzdHJva2Utd2lkdGg9IjIuODMxOCIgZmlsbD0iIzFlMWUxZSIvPgogICA8cmVjdCBpZD0icmVjdDU3IiByeD0iNy41NjEzIiB0cmFuc2Zvcm09Im1hdHJpeCgwLC0xLDEsMCwwLDApIiBoZWlnaHQ9IjEzLjE5NyIgd2lkdGg9IjE1OS43MyIgc3Ryb2tlPSIjMTQxNDE0IiB5PSI4NzQuNzciIHg9Ii0zMzQuOTIiIHN0cm9rZS13aWR0aD0iMi44MzE4IiBmaWxsPSIjMTAxMDEwIi8+CiAgIDxnIGlkPSJnNTkiIHRyYW5zZm9ybT0ibWF0cml4KDAsLTAuOTQ1MTYzMDMsMC45NDI2NzU1NSwwLDQxLjQ0ODYxNiwzOTYuMzUwNikiPgogICAgPHBhdGggaWQ9InBhdGg2MSIgb3BhY2l0eT0iMC42IiBkPSJtOS4yLDE4YzUsMCw4LjgtMy44LDguOC04LjcsMC00LjgtNC04LjctOC44LTguN3MtOC43LDQtOC43LDguN2MwLDUsNCw4LjgsOC43LDguOHYtMC4xeiIgc3Ryb2tlPSIjMmYyZjJmIiBmaWxsPSIjMzIzMjMyIi8+CiAgICA8Y2lyY2xlIGlkPSJPdmFsIiBkPSJNIDE0LjIsOS4zMDAwMDAyIEMgMTQuMiwxMi4wNjE0MjQgMTEuOTYxNDI0LDE0LjMgOS4xOTk5OTk4LDE0LjMgYyAtMi43NjE0MjM3LDAgLTUsLTIuMjM4NTc2IC01LC00Ljk5OTk5OTggMCwtMi43NjE0MjM4IDIuMjM4NTc2MywtNSA1LC01IDIuNzYxNDI0MiwwIDUuMDAwMDAwMiwyLjIzODU3NjIgNS4wMDAwMDAyLDUgeiIgY3g9IjkuMiIgY3k9IjkuMyIgcj0iNSIgZmlsbD0iIzE2MGYyNiIvPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjkxNC40NyIgd2lkdGg9IjQ0NS4xNyIgdmVyc2lvbj0iMS4xIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCAwIDQ0NS4xNzIwNiA5MTQuNDY3MjIiPgogPHRpdGxlIGlkPSJ0aXRsZTQiPk5leHVzIDZQPC90aXRsZT4KIDxkZWZzIGlkPSJkZWZzNiI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudC0yIiB5MT0iMC4zODYzNSIgeDI9IjAuOTY2IiB4MT0iMC4wNDIiIHkyPSIwLjYxODYzIj4KICAgPHN0b3AgaWQ9InN0b3AxNCIgc3RvcC1jb2xvcj0iIzNBM0EzQSIgb2Zmc2V0PSIwIi8+CiAgIDxzdG9wIGlkPSJzdG9wMTYiIHN0b3AtY29sb3I9IiMxODE4MTgiIG9mZnNldD0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDMwNTAiIHkyPSI0MTguMzgiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudC0yIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDI9IjY1My4zIiBncmFkaWVudFRyYW5zZm9ybT0ic2NhbGUoMC42OTc5MjU1NywxLjQzMjgxNzUpIiB5MT0iMjYxLjI4IiB4MT0iMjguNDA0Ii8+CiA8L2RlZnM+CiA8ZyBpZD0iUGFnZS0xIiBmaWxsPSJub25lIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wMTcxMzk4OCwtNjIuNTQ3MzY0KSI+CiAgPGcgaWQ9Ik5leHVzNlAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQsNCkiPgogICA8ZyBpZD0iZzMwODgiPgogICAgPGcgaWQ9ImczMDUyIj4KICAgICA8ZyBpZD0iYi1saW5rIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MzA1MCkiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTI4NDA4OTQsMCwwLDAuOTM2OTU0MTYsLTAuNzE4NTA4OTUsNjEuODQxNjU2KSI+CiAgICAgIDxyZWN0IGlkPSJiIiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50MzA1MCkiLz4KICAgICA8L2c+CiAgICAgPGcgaWQ9ImcyMiIgdHJhbnNmb3JtPSJtYXRyaXgoMC45Mjg0MDg5NCwwLDAsMC45MzY5NTQxNiwtMC43MTg1MDg5NSw2MS44NDE2NTYpIj4KICAgICAgPHJlY3QgaWQ9InJlY3QyNCIgcng9IjYwIiBoZWlnaHQ9Ijk2OSIgd2lkdGg9IjQ3MiIgeT0iMCIgeD0iMCIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0iZzI2IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjkyODQwODk0LDAsMCwwLjkzNjk1NDE2LC0wLjcxODUwODk1LDYxLjg0MTY1NikiPgogICAgICA8cmVjdCBpZD0icmVjdDI4IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJnMzAiIHN0cm9rZS13aWR0aD0iNyIgc3Ryb2tlPSIjMWUxZTFlIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjkyODQwODk0LDAsMCwwLjkzNjk1NDE2LC0wLjcxODUwODk1LDYxLjg0MTY1NikiPgogICAgICA8cmVjdCBpZD0icmVjdDMyIiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJnMzQiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlPSIjNjE2MTYxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjkyODQwODk0LDAsMCwwLjkzNjk1NDE2LC0wLjcxODUwODk1LDYxLjg0MTY1NikiPgogICAgICA8cmVjdCBpZD0icmVjdDM2IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJnMzgiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlPSIjMWUxZTFlIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjkyODQwODk0LDAsMCwwLjkzNjk1NDE2LC0wLjcxODUwODk1LDYxLjg0MTY1NikiPgogICAgICA8cmVjdCBpZD0icmVjdDQwIiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJnNDIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjYjRiNGI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjkyODQwODk0LDAsMCwwLjkzNjk1NDE2LC0wLjcxODUwODk1LDYxLjg0MTY1NikiPgogICAgICA8cmVjdCBpZD0icmVjdDQ0IiByeD0iNjAiIGhlaWdodD0iOTY5IiB3aWR0aD0iNDcyIiB5PSIwIiB4PSIwIi8+CiAgICAgPC9nPgogICAgIDxnIGlkPSJnNDYiIHN0cm9rZT0iIzhhOGE4YSIgdHJhbnNmb3JtPSJtYXRyaXgoMC45Mjg0MDg5NCwwLDAsMC45MzY5NTQxNiwtMC43MTg1MDg5NSw2MS44NDE2NTYpIj4KICAgICAgPHJlY3QgaWQ9InJlY3Q0OCIgcng9IjYwIiBoZWlnaHQ9Ijk2OSIgd2lkdGg9IjQ3MiIgeT0iMCIgeD0iMCIvPgogICAgIDwvZz4KICAgICA8ZyBpZD0iR3JvdXAiIGZpbGw9IiM0NDQ0NDUiIHRyYW5zZm9ybT0ibWF0cml4KDAuOTI4NDA4OTQsMCwwLDAuOTM2OTU0MTYsNDM3LjQ5MDUsMzYwLjczMDA1KSI+CiAgICAgIDxwYXRoIGlkPSJTaGFwZSIgZD0ibTAsMCwyLDBjMSwwLDIsMSwyLDJ2NTZjMCwxLTEsMi0yLDJoLTJ2LTYweiIvPgogICAgICA8cGF0aCBpZD0icGF0aDUyIiBkPSJtMCw5NywyLDBjMSwwLDIsMSwyLDJ2MTE2YzAsMS0xLDItMiwyaC0ydi0xMjB6Ii8+CiAgICAgPC9nPgogICAgIDxwYXRoIGlkPSJwYXRoNTQiIGZpbGw9IiMxNzE3MTciIGQ9Im0xMi42MzIsMTUyLjY2LDQxMiwwLDAsNzMyLTQxMiwwLDAtNzMyeiIvPgogICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgb3BhY2l0eT0iMC40IiByeD0iNy40MjczIiBoZWlnaHQ9IjEzLjExNyIgd2lkdGg9IjE1Ni45IiBzdHJva2U9IiMxNDE0MTQiIHk9Ijk5LjMyIiB4PSIxMzguNTQiIHN0cm9rZS13aWR0aD0iMi43OTgiIGZpbGw9IiMxZTFlMWUiLz4KICAgICA8cmVjdCBpZD0icmVjdDU3IiByeD0iNy40MjczIiBoZWlnaHQ9IjEzLjExNyIgd2lkdGg9IjE1Ni45IiBzdHJva2U9IiMxNDE0MTQiIHk9IjkyNC43OCIgeD0iMTM4LjU0IiBzdHJva2Utd2lkdGg9IjIuNzk4IiBmaWxsPSIjMTAxMDEwIi8+CiAgICAgPGcgaWQ9Imc1OSIgdHJhbnNmb3JtPSJtYXRyaXgoMC45Mjg0MDg5NCwwLDAsMC45MzY5NTQxNiw3OC4xOTYyNTEsOTYuNTA4OTYpIj4KICAgICAgPHBhdGggaWQ9InBhdGg2MSIgb3BhY2l0eT0iMC42IiBkPSJtOS4yLDE4YzUsMCw4LjgtMy44LDguOC04LjcsMC00LjgtNC04LjctOC44LTguN3MtOC43LDQtOC43LDguN2MwLDUsNCw4LjgsOC43LDguOHYtMC4xeiIgc3Ryb2tlPSIjMmYyZjJmIiBmaWxsPSIjMzIzMjMyIi8+CiAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGQ9Ik0gMTQuMiw5LjMwMDAwMDIgQyAxNC4yLDEyLjA2MTQyNCAxMS45NjE0MjQsMTQuMyA5LjE5OTk5OTgsMTQuMyBjIC0yLjc2MTQyMzcsMCAtNSwtMi4yMzg1NzYgLTUsLTQuOTk5OTk5OCAwLC0yLjc2MTQyMzggMi4yMzg1NzYzLC01IDUsLTUgMi43NjE0MjQyLDAgNS4wMDAwMDAyLDIuMjM4NTc2MiA1LjAwMDAwMDIsNSB6IiBjeD0iOS4yIiBjeT0iOS4zIiByPSI1IiBmaWxsPSIjMTYwZjI2Ii8+CiAgICAgPC9nPgogICAgPC9nPgogICA8L2c+CiAgPC9nPgogPC9nPgo8L3N2Zz4KiVBORw0KGgoAAAAN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ETI38sAAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAhAAAABgBAwAAAAEux9wAAAAGUExUReDg4L29vWS1Vi0AAAAiSURBVHhe7dChEQAADMLA7j8tG1CPQHBIXkbmKBAWa1qfH/QPhwExwKHbAAAAAElFTkSuQmCCPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaWQ9IkxheWVyXzEiCiAgIGRhdGEtbmFtZT0iTGF5ZXIgMSIKICAgdmlld0JveD0iMCAwIDc1MCA3NTAiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlBXQV9JbGx1c3RyYXRpb25fTGlnaHRob3VzZV8wNV9MaWdodGhvdXNlLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvVXNlcnMvZXJpY2JpZGVsbWFuL0Rlc2t0b3AvbGhfbG9nb19pY29uLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjE4MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjE4MCIKICAgd2lkdGg9Ijc1MCIKICAgaGVpZ2h0PSI3NTAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTg1Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT5QV0FfSWxsdXN0cmF0aW9uX0xpZ2h0aG91c2U8L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjExNDMiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzE0IgogICAgIGlkPSJuYW1lZHZpZXc4MyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgYm9yZGVybGF5ZXI9ImZhbHNlIgogICAgIGZpdC1tYXJnaW4tdG9wPSIwIgogICAgIGZpdC1tYXJnaW4tbGVmdD0iMCIKICAgICBmaXQtbWFyZ2luLXJpZ2h0PSI1MCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5MzcwMDY4IgogICAgIGlua3NjYXBlOmN4PSIzMzAuODA3NDQiCiAgICAgaW5rc2NhcGU6Y3k9IjQyMy4zNjc4NSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNDQiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjQyIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXI2IiAvPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMzIj4KICAgIDxzdHlsZQogICAgICAgaWQ9InN0eWxlNSI+LmNscy0xLC5jbHMtMTB7ZmlsbDojMzA0ZmZlO30uY2xzLTJ7ZmlsbDojZmZlMDgyO30uY2xzLTEwLC5jbHMtMntvcGFjaXR5OjAuNTt9LmNscy0ze2ZpbGw6IzI5NzlmZjt9LmNscy00e2ZpbGw6I2ZmZDU0Zjt9LmNscy01e2ZpbGw6I2ZmZjE3Njt9LmNscy02e2ZpbGw6I2Y0NTExZTt9LmNscy03e2ZpbGw6I2U2NGExOTt9LmNscy04e2ZpbGw6I2M1Y2FlOTt9LmNscy05e2ZpbGw6I2ZmNzA0Mzt9LmNscy0xMXtmaWxsOiNmZGQ4MzU7fS5jbHMtMTJ7ZmlsbDojZmZmOWM0O30uY2xzLTEze2ZpbGw6IzQ0OGFmZjt9LmNscy0xNHtmaWxsOiMwMGM4NTM7fS5jbHMtMTV7ZmlsbDojNjRkZDE3O308L3N0eWxlPgogIDwvZGVmcz4KICA8dGl0bGUKICAgICBpZD0idGl0bGU3Ij5QV0FfSWxsdXN0cmF0aW9uX0xpZ2h0aG91c2U8L3RpdGxlPgogIDxwYXRoCiAgICAgY2xhc3M9ImNscy0xIgogICAgIGQ9Im0gOTIuNDI3NjUzLDU3MS4wMjQzNCBjIDUyLjMxOTk5NywwIDUyLjMxOTk5NywtMzMuOTQgMTA0LjYzOTk5NywtMzMuOTQgNTIuMzIsMCA1Mi4zMSwzMy45NCAxMDQuNjMsMzMuOTQgNTIuMzIsMCA1Mi4zMiwtMzMuOTQgMTA0LjYzLC0zMy45NCA1Mi4zMSwwIDUyLjMyLDMzLjk0IDEwNC42NCwzMy45NCA1Mi4zMiwwIDUyLjMyLC0zMy45NCAxMDQuNjQsLTMzLjk0IDQ5LjQ4LDAgNTIuMTcsMzAuMzQgOTYuNTYsMzMuNjQgYSAzMjYuNzMsMzI2LjczIDAgMCAwIDguMDksLTcyLjM5IGMgMCwtMTc5Ljg3IC0xNDUuODIsLTMyNS42OSAtMzI1LjY5LC0zMjUuNjkgLTE3OS44NywwIC0zMjUuNjk5OTk4LDE0NS44MiAtMzI1LjY5OTk5OCwzMjUuNjkgYSAzMjYuNzUsMzI2Ljc1IDAgMCAwIDcuOSw3MS41MSA5OC44OCw5OC44OCAwIDAgMCAxNS42NjAwMDEsMS4xOCB6IgogICAgIGlkPSJwYXRoOSIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIHN0eWxlPSJmaWxsOiMzMDRmZmUiIC8+CiAgPHBhdGgKICAgICBjbGFzcz0iY2xzLTMiCiAgICAgZD0iTSAzNDUuOTk3NjUsMzc3LjE2NDM0IgogICAgIGlkPSJwYXRoMTMiCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBzdHlsZT0iZmlsbDojMjk3OWZmIiAvPgogIDxyZWN0CiAgICAgY2xhc3M9ImNscy00IgogICAgIHg9IjM2Mi45Nzc2NiIKICAgICB5PSIyMTMuNTY0MzUiCiAgICAgd2lkdGg9Ijg0LjgzOTk5NiIKICAgICBoZWlnaHQ9Ijc4LjQ4OTk5OCIKICAgICBpZD0icmVjdDE1IgogICAgIHN0eWxlPSJmaWxsOiNmZmQ1NGYiIC8+CiAgPHJlY3QKICAgICBjbGFzcz0iY2xzLTUiCiAgICAgeD0iMzYyLjk3NzY2IgogICAgIHk9IjIxMy41NjQzNSIKICAgICB3aWR0aD0iMjkuOTUwMDAxIgogICAgIGhlaWdodD0iNzguNDg5OTk4IgogICAgIGlkPSJyZWN0MTciCiAgICAgc3R5bGU9ImZpbGw6I2ZmZjE3NiIgLz4KICA8ZWxsaXBzZQogICAgIGNsYXNzPSJjbHMtNSIKICAgICBjeD0iMzkyLjI5NzY3IgogICAgIGN5PSIyMzMuMjE0MzQiCiAgICAgcng9IjE5Ljg0IgogICAgIHJ5PSIyNC44ODk5OTkiCiAgICAgaWQ9ImVsbGlwc2UxOSIKICAgICBzdHlsZT0iZmlsbDojZmZmMTc2IiAvPgogIDxwYXRoCiAgICAgY2xhc3M9ImNscy02IgogICAgIGQ9Im0gMzYwLjg5NzY1LDIwNC43MDQzNCBhIDQzLjgzNSw0My44MzUgMCAxIDEgODcuNjcsMCIKICAgICBpZD0icGF0aDIxIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc3R5bGU9ImZpbGw6I2Y0NTExZSIgLz4KICA8cGF0aAogICAgIGNsYXNzPSJjbHMtNyIKICAgICBkPSJtIDQwNS4xMDc2NSwxNjAuODc0MzQgYSA0My41MSw0My41MSAwIDAgMSA0My40Niw0My44MyBsIC00My40NiwwIDAsLTQzLjgzIHoiCiAgICAgaWQ9InBhdGgyMyIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIHN0eWxlPSJmaWxsOiNlNjRhMTkiIC8+CiAgPHJlY3QKICAgICBjbGFzcz0iY2xzLTYiCiAgICAgeD0iMzUyLjQxNzY2IgogICAgIHk9IjIwMy4yOTQzMyIKICAgICB3aWR0aD0iMTA0LjY0IgogICAgIGhlaWdodD0iMTEuMzEiCiAgICAgcng9IjUuNjU5OTk5OCIKICAgICByeT0iNS42NTk5OTk4IgogICAgIGlkPSJyZWN0MjUiCiAgICAgc3R5bGU9ImZpbGw6I2Y0NTExZSIgLz4KICA8cG9seWdvbgogICAgIGNsYXNzPSJjbHMtOCIKICAgICBwb2ludHM9IjM5Myw0MTYgNDA1LjIzLDE3My41IDQ5MC4wNywxNzMuNSA1MDEsNDA0IDUwMSw0MDQgIgogICAgIGlkPSJwb2x5Z29uMjciCiAgICAgc3R5bGU9ImZpbGw6I2M1Y2FlOSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuMjAyMzUxLDExOC4wMjQzNCkiIC8+CiAgPGxpbmUKICAgICBjbGFzcz0iY2xzLTkiCiAgICAgeDE9IjQ0OS4wMzc2NiIKICAgICB5MT0iMzEwLjI1NDMzIgogICAgIHgyPSI0NTIuMjk3NjciCiAgICAgeTI9IjM3NC40MjQzMiIKICAgICBpZD0ibGluZTI5IgogICAgIHN0eWxlPSJmaWxsOiNmZjcwNDMiIC8+CiAgPHBvbHlnb24KICAgICBjbGFzcz0iY2xzLTkiCiAgICAgcG9pbnRzPSI0MDIuMDUsMjMzLjggMzk4LjYzLDMwMS4wOSA0OTQuNSwyNTYuNCA0OTEuMjQsMTkyLjIzIDQ5MS4yNCwxOTIuMjMgIgogICAgIGlkPSJwb2x5Z29uMzEiCiAgICAgc3R5bGU9ImZpbGw6I2ZmNzA0MyIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuMjAyMzUxLDExOC4wMjQzNCkiIC8+CiAgPGxpbmUKICAgICBjbGFzcz0iY2xzLTkiCiAgICAgeDE9IjQ1NS41MTc2NyIKICAgICB5MT0iNDM3LjY2NDM3IgogICAgIHgyPSI0NTguNzg3NjYiCiAgICAgeTI9IjUwMS44NDQzIgogICAgIGlkPSJsaW5lMzMiCiAgICAgc3R5bGU9ImZpbGw6I2ZmNzA0MyIgLz4KICA8cG9seWdvbgogICAgIGNsYXNzPSJjbHMtOSIKICAgICBwb2ludHM9IjM5NS4yNSwzNjcuNCAzOTEuODMsNDM0LjcgNTAwLjk5LDM4My44MiA0OTcuNzIsMzE5LjY0IDQ5Ny43MiwzMTkuNjQgIgogICAgIGlkPSJwb2x5Z29uMzUiCiAgICAgc3R5bGU9ImZpbGw6I2ZmNzA0MyIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuMjAyMzUxLDExOC4wMjQzNCkiIC8+CiAgPHJlY3QKICAgICBjbGFzcz0iY2xzLTciCiAgICAgeD0iMzQ5Ljk4NzY3IgogICAgIHk9IjI1NS45MDQzNCIKICAgICB3aWR0aD0iMTA5LjQ5IgogICAgIGhlaWdodD0iMzUuODIiCiAgICAgaWQ9InJlY3QzOSIKICAgICBzdHlsZT0iZmlsbDojZTY0YTE5IiAvPgogIDxyZWN0CiAgICAgY2xhc3M9ImNscy02IgogICAgIHg9IjM0OS45ODc2NyIKICAgICB5PSIyNTUuOTA0MzQiCiAgICAgd2lkdGg9IjcxLjc3OTk5OSIKICAgICBoZWlnaHQ9IjM1LjgyIgogICAgIGlkPSJyZWN0NDEiCiAgICAgc3R5bGU9ImZpbGw6I2Y0NTExZSIgLz4KICA8cGF0aAogICAgIGNsYXNzPSJjbHMtMiIKICAgICBkPSJtIDQwMy45Nzc2NSwyNTUuOTA0MzQgYyAwLDEzIC0xMi4xLDIzLjUgLTI3LDIzLjUgLTE0LjksMCAtMjcsLTEwLjUyIC0yNywtMjMuNSIKICAgICBpZD0icGF0aDQzIgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgc3R5bGU9Im9wYWNpdHk6MC41O2ZpbGw6I2ZmZTA4MiIgLz4KICA8ZwogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICBpbmtzY2FwZTpsYWJlbD0iY2xvdWRzIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTExLjA2OTk5LDI5Ni4yNjk5OSkiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMyOTc5ZmYiCiAgICAgICBjbGFzcz0iY2xzLTMiCiAgICAgICBkPSJtIDY1My43Mjc2NCwtNTAuNDU1NjUzIGEgMTkuNTksMTkuNTkgMCAwIDEgOC4zMiwxLjg0IDM0LjQ5LDM0LjQ5IDAgMCAxIDY2LjcsLTkgbCAwLjEyLDAgYSAyMy4yNSwyMy4yNSAwIDAgMSAwLDQ2LjUgbCAtNzUuMTQsMCBhIDE5LjY3LDE5LjY3IDAgMSAxIDAsLTM5LjM0IHoiCiAgICAgICBpZD0icGF0aDcxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojNDQ4YWZmIgogICAgICAgY2xhc3M9ImNscy0xMyIKICAgICAgIGQ9Im0gNDMwLjcyNzY0LDEzNy4wMjQzNSBhIDE2LjYsMTYuNiAwIDAgMSA3LDEuNTYgMjkuMjMsMjkuMjMgMCAwIDEgNTYuNTMsLTcuNjMgbCAwLjEsMCBhIDE5LjcxLDE5LjcxIDAgMSAxIDAsMzkuNDEgbCAtNjMuNjMsMCBhIDE2LjY3LDE2LjY3IDAgMSAxIDAsLTMzLjM0IHoiCiAgICAgICBpZD0icGF0aDc3IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICA8L2c+CiAgPGcKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjIiCiAgICAgaW5rc2NhcGU6bGFiZWw9InN0YXJzIgogICAgIHN0eWxlPSJkaXNwbGF5OmlubGluZSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTExLjA2OTk5LDI5Ni4yNjk5OSkiPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9ImZpbGw6I2ZkZDgzNSIKICAgICAgIGNsYXNzPSJjbHMtMTEiCiAgICAgICBjeD0iNTkzLjg2NzYxIgogICAgICAgY3k9Ii04OC43NzU2NSIKICAgICAgIHI9IjMuNTMiCiAgICAgICBpZD0iY2lyY2xlNDUiIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmZmOWM0IgogICAgICAgY2xhc3M9ImNscy0xMiIKICAgICAgIGN4PSI2MjQuODY3NjEiCiAgICAgICBjeT0iMTA5LjYyNDM0IgogICAgICAgcj0iNi4xMzAwMDAxIgogICAgICAgaWQ9ImNpcmNsZTQ3IiAvPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9ImZpbGw6I2ZmZjljNCIKICAgICAgIGNsYXNzPSJjbHMtMTIiCiAgICAgICBjeD0iMjUzLjQ2NzY1IgogICAgICAgY3k9IjUzLjU5NDM0NSIKICAgICAgIHI9IjYuMTMwMDAwMSIKICAgICAgIGlkPSJjaXJjbGU0OSIgLz4KICAgIDxjaXJjbGUKICAgICAgIHN0eWxlPSJmaWxsOiNmZmY5YzQiCiAgICAgICBjbGFzcz0iY2xzLTEyIgogICAgICAgY3g9IjM1My40MTc2MyIKICAgICAgIGN5PSIxNjAuMjE0MzQiCiAgICAgICByPSI2LjEzMDAwMDEiCiAgICAgICBpZD0iY2lyY2xlNTEiIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmZmOWM0IgogICAgICAgY2xhc3M9ImNscy0xMiIKICAgICAgIGN4PSI1OTguNDc3NiIKICAgICAgIGN5PSIxMS42NDQzNDciCiAgICAgICByPSI2LjEzMDAwMDEiCiAgICAgICBpZD0iY2lyY2xlNTMiIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmZmOWM0IgogICAgICAgY2xhc3M9ImNscy0xMiIKICAgICAgIGN4PSI3MjcuNjI3NjIiCiAgICAgICBjeT0iMTY5LjU0NDM2IgogICAgICAgcj0iNi4xMzAwMDAxIgogICAgICAgaWQ9ImNpcmNsZTU1IiAvPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9ImZpbGw6I2ZkZDgzNSIKICAgICAgIGNsYXNzPSJjbHMtMTEiCiAgICAgICBjeD0iMjQwLjI2NzY0IgogICAgICAgY3k9IjE5Mi40MDQzNCIKICAgICAgIHI9IjMuNTMiCiAgICAgICBpZD0iY2lyY2xlNTciIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmRkODM1IgogICAgICAgY2xhc3M9ImNscy0xMSIKICAgICAgIGN4PSIyNzIuODI3NjQiCiAgICAgICBjeT0iMTIxLjA5NDM1IgogICAgICAgcj0iMy41MyIKICAgICAgIGlkPSJjaXJjbGU1OSIgLz4KICAgIDxjaXJjbGUKICAgICAgIHN0eWxlPSJmaWxsOiNmZGQ4MzUiCiAgICAgICBjbGFzcz0iY2xzLTExIgogICAgICAgY3g9IjI5NC43Mzc2NCIKICAgICAgIGN5PSIxMDIuNzE0MzQiCiAgICAgICByPSIzLjUzIgogICAgICAgaWQ9ImNpcmNsZTYxIiAvPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9ImZpbGw6I2ZkZDgzNSIKICAgICAgIGNsYXNzPSJjbHMtMTEiCiAgICAgICBjeD0iMzg3LjM0NzY2IgogICAgICAgY3k9IjIwLjAwNDM0NyIKICAgICAgIHI9IjMuNTMiCiAgICAgICBpZD0iY2lyY2xlNjMiIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmRkODM1IgogICAgICAgY2xhc3M9ImNscy0xMSIKICAgICAgIGN4PSI2NzkuODY3NjEiCiAgICAgICBjeT0iMzAuMjI0MzQ4IgogICAgICAgcj0iMy41MyIKICAgICAgIGlkPSJjaXJjbGU2NSIgLz4KICAgIDxjaXJjbGUKICAgICAgIHN0eWxlPSJmaWxsOiNmZGQ4MzUiCiAgICAgICBjbGFzcz0iY2xzLTExIgogICAgICAgY3g9IjgxOC41OTc2IgogICAgICAgY3k9IjE3Ny42NTQzNCIKICAgICAgIHI9IjMuNTMiCiAgICAgICBpZD0iY2lyY2xlNjciIC8+CiAgICA8Y2lyY2xlCiAgICAgICBzdHlsZT0iZmlsbDojZmRkODM1IgogICAgICAgY2xhc3M9ImNscy0xMSIKICAgICAgIGN4PSIzMjguNjc3NjQiCiAgICAgICBjeT0iOS4zOTQzNDcyIgogICAgICAgcj0iMy41MyIKICAgICAgIGlkPSJjaXJjbGU2OSIgLz4KICAgIDxjaXJjbGUKICAgICAgIHN0eWxlPSJmaWxsOiNmZGQ4MzUiCiAgICAgICBjbGFzcz0iY2xzLTExIgogICAgICAgY3g9IjY0MC44OTc2NCIKICAgICAgIGN5PSIxNzkuMjA0MzYiCiAgICAgICByPSIzLjUzIgogICAgICAgaWQ9ImNpcmNsZTczIiAvPgogICAgPGNpcmNsZQogICAgICAgc3R5bGU9ImZpbGw6I2ZkZDgzNSIKICAgICAgIGNsYXNzPSJjbHMtMTEiCiAgICAgICBjeD0iNzQ3Ljg2NzYxIgogICAgICAgY3k9IjkwLjc1NDM0OSIKICAgICAgIHI9IjMuNTMiCiAgICAgICBpZD0iY2lyY2xlNzUiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIzIgogICAgIGlua3NjYXBlOmxhYmVsPSJsaWdodCIKICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExMS4wNjk5OSwyOTYuMjY5OTkpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0ib3BhY2l0eTowLjU7ZmlsbDojZmZlMDgyIgogICAgICAgY2xhc3M9ImNscy0yIgogICAgICAgZD0ibSA0NzUuNDg3NjQsLTgzLjg5NTY1MyAtMzM0LjYyLC00Ny43ODk5OTcgYSAzLjY1LDMuNjUgMCAwIDAgLTEsLTAuMTQgYyAtOC42NywwIC0xNiwzMS44ODk5OTcgLTE2LDcxLjE0OTk5NyAwLDM5LjI2IDcuMzMsNzEuMDcgMTYsNzEuMDcgYSAzLjY2LDMuNjYgMCAwIDAgMC45MywtMC4xMyBsIDMzNC42NCwtNDcuODggMCwtNDYuMjggeiIKICAgICAgIGlkPSJwYXRoMTEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogIDwvZz4KICA8ZwogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyNiIKICAgICBpbmtzY2FwZTpsYWJlbD0ic2hhZGUiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxwb2x5Z29uCiAgICAgICBjbGFzcz0iY2xzLTEwIgogICAgICAgcG9pbnRzPSI0OTMuMjcsMTczLjUgNDUwLjM3LDE3My41IDQ1MC4zNywzOTMgNTAyLDQxNiA0OTMuMjcsMTczLjUgIgogICAgICAgaWQ9InBvbHlnb24zNyIKICAgICAgIHN0eWxlPSJvcGFjaXR5OjAuNTtmaWxsOiMzMDRmZmUiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDIuMjAyMzUxLDExOC4wMjQzNCkiIC8+CiAgPC9nPgogIDxnCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXI1IgogICAgIGlua3NjYXBlOmxhYmVsPSJHUkFTUyIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTExLjA2OTk5LDI5Ni4yNjk5OSkiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDBjODUzIgogICAgICAgY2xhc3M9ImNscy0xNCIKICAgICAgIGQ9Im0gNDEzLjc2NzY0LDI3NS40ODQzNSBjIDUyLjMyLDAgNTIuMzIsLTMzLjk0IDEwNC42MywtMzMuOTQgNTIuMzEsMCA1Mi4zMiwzMy45NCAxMDQuNjMsMzMuOTQgNDQuNDIsMCA1MS4xMywtMjQuNDYgODQuMTYsLTMxLjg0IC00NS4xMywtMjQuNjYgLTExMi41MywtNDAuMzMgLTE4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aFdvRGRmmRroXBBozj0VSVu4Eee2OB05Fe3aSZogp0x2E52Kpktz6glz8WBVA3OybzN2B5ijb5A49eO5ri7CvuN+zQXN7n7dhkl2E1q1z27WU8llZntmjv66iKeapGmvbavx1m6n7Yg4lX9nZnPC1XA0Z8RTM+i8ToPSBok9Yqzt6lbRvX+aQ7rXTj1n2mg679GsdDPtemlPtkFz9BYHN0Js+153khZ/p9EpM1999dWvf/3rR48eHYahS/3kyZOf+9znpumlP9WkExF87rnnuqjWiqc70Fr5nZ44J9q1XdOY21gi+eCDD5rZwsJC08PS0tL73ve+KTxp8zShRMTTTz9tXd7dwqZpdY6+cWK3rrVdtdZm4l0nEVFrzcxrrrmmDVubi/oMzXP6bVm76b6tHqGnFvy6iOtO0sPuXOh86aWX7rnnnksvvXTqr81mWthtJtRg2ziO7bZMocFcFOsO+vsRp3YyN/lURd3r7r333p07d5rZOI5TW29e2zNP114jrnY0Xrv6mth6KOz010tct2saKKeNs88+u5QyjuNsNnv3u99da53NZo3VZmBzOaSFUWvLdAjZNc7J1ekbJ06B6tquVoQ0bNsETPLaa689duxYROzZs2cYhj179rh7g08dSnWGGz+ZySeffBKAuzeT6gv39D6ld8M9I7EH7LVdZvaVr3zllltuWVxcXFpauvvuuw8fPrx79+7du3dv3ry5hdRxHN19GIZmTn2JiCildEB18OBB64iqUzulsTulb5zYRb7u+G3btt11110vvPDCnXfeuX379ne+851PPPHE8vLySy+9dPjw4Y52m+V0B5j+voaFOk9Nlu12GiKn9CkIOz3xNRWv6aq1bt68eevWrQcOHLjkkks2b948m80uvvjiKbDvwb5ZzrQm7oh6FY22efsC7XcaQ6b0btxnJE7D8VxXs/hzzjln165dksZxrLW+973v7ci07bg13L2D2Wlx06F76Q4xV6BMkeOUvkHiHI6fdk2xMclxHK+55prWmIba5r6NhylMcvdGXw2j3UxbQJj6+Fr66yKeapKOrjuEueOOO1599dWOi6cbmFpOT68dt2amzWazptzGULvtI9bSN0hsDJyq69ixY4cPH15aWjpy5MjS0tLCwsI3vvGNY8eO9cwwxbPjODZ+WvadiiYzefDgwW70HYROx83RN06c1pxzXW96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